diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index ef38703aa..ee282f354 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -1,4 +1,6 @@ { + "headernews": "New feature: Public profiles are now live! Easily create and share public templates", + "headernewsbtn": "Setup Now", "create-account": "Create Account", "login": "Login", "language": "Language", @@ -38,7 +40,7 @@ "upgrade-now": "Upgrade now", "upgrade-to": "Upgrade to", "plan": "Plan", - "subscribe-card-plan": "Sign 100 docs using API. Only $0.15/doc after that.", + "subscribe-card-plan": "Unlock premium features starting at just {{premiumPrice}}/month. Enjoy enhanced performance and only {{addonPrice}} per additional credit after your included premium credits.", "user-name-limit-char": "To have a username less than 8 character please subscribe", "tour-content": "Don't show this again", "pro": "PRO", @@ -607,19 +609,17 @@ "user-name-exist": "user name already exist", "format": "format", "select-date-format": "Select a date format", - "buyapiaddon":"Buy APIs Credits", - "quantityofapis" :"Quantity of APIs", - "additionalapis":"Please purchase add-on APIs", - "remainingapis": "Remaining APIs Credits:", - "additional-quicksend": "Please purchase add-on quick send", - "quantityofquicksend": "Quantity of Quick send", + "quantityofcredits": "Quantity of premium credits", + "remainingcredits": "Premium credits available:", + "remainingcreditshelp":"Use premium credits for API document signing, bulk sending, or embedding OpenSign integration on your website. You have {{allowedcredits}} included credits and {{addoncredits}} additional purchased credits remaining.", + "additional-credits": "Please purchase premium credits", "quotaerrquicksend": "Quota Reached, You don't have enough credits.", - "buycredits": "Buy credits", + "buycredits": "Buy Premium Credits", "rotate-right":"Rotate right", "rotate-left":"Rotate left", "rotate-alert-mssg":"All widgets on this page will be lost. Are you sure you want to proceed?", "templateid":"Template-Id", - "bulksendsubcriptionalert":"Please upgrade to Professional or Team plan to use quicksend.", + "bulksendsubcriptionalert":"Please upgrade to Professional or Team plan to use bulk send.", "generate-test-token":"Generate Test Token", "regenerate-test-token":"Regenerate Test Token", "help-test-token":"This token can be used to test the APIs at the https://sandbox.opensignlabs.com/api/v1 endpoint, allowing you to conduct unlimited document signatures. Please note that the sandbox API will sign your documents with self-signed certificates, which may not be recognized as valid by Adobe. Once you’ve completed your testing, you can upgrade to one of our paid plans to generate a production token.", diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index c13977d73..72a30b619 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -1,5 +1,7 @@ { + "headernews": "Nouvelle fonctionnalité : les profils publics sont désormais en ligne ! Créez et partagez facilement des modèles publics", + "headernewsbtn": "Configurer maintenant", "create-account": "Créer un compte", "login": "Se Connecter", "language": "Langue", @@ -40,7 +42,7 @@ "upgrade-to": "Mettre à niveau vers", "pro": "PRO", "plan": "Offre", - "subscribe-card-plan": "Signez 100 documents à l'aide de l'API. Seulement 0,15 $/doc par la suite.", + "subscribe-card-plan": "Débloquez des fonctionnalités premium à partir de seulement {{premiumPrice}}/mois. Bénéficiez de performances améliorées et de seulement {{addonPrice}} par crédit supplémentaire après vos crédits premium inclus.", "user-name-limit-char": "Pour avoir un nom d'utilisateur de moins de 8 caractères s'il vous plaît s'abonner", "tour-content": "Ne plus afficher", "team": "Équipe", @@ -607,14 +609,13 @@ "Add-seats": "Ajouter des sièges", "format": "format", "select-date-format": "Sélectionnez un format de date", - "buyapiaddon":"Acheter des API Crédits", - "quantityofapis":"Quantité d'API", - "additionalapis":"Veuillez acheter des API complémentaires", - "remainingapis":"API restantes Crédits:", - "additional-quicksend":"Veuillez acheter le module complémentaire quick send", + "quantityofcredits":"Quantité de crédits de prime", + "remainingcredits":"Crédits premium disponibles :", + "additional-credits":"Veuillez acheter des crédits premium", + "remainingcreditshelp":"Utilisez des crédits premium pour la signature de documents API, l'envoi groupé ou l'intégration d'OpenSign sur votre site Web. Il vous reste {{allowedcredits}} crédits inclus et {{addoncredits}} crédits achetés supplémentaires.", "quantityofquicksend": "Quantité de Quick send", "quotaerrquicksend": "Quota atteint, vous n'avez pas assez de crédits.", - "buycredits": "Acheter des crédits", + "buycredits": "Acheter des crédits premium", "rotate-right" :"Faire pivoter à droite", "rotate-left" :"Faire pivoter à gauche", "rotate-alert-mssg" :"Tous les widgets de cette page seront perdus. Êtes-vous sûr de vouloir continuer ?", @@ -624,5 +625,4 @@ "regenerate-test-token":"Régénérer le jeton de test", "help-test-token":"Ce jeton peut être utilisé pour tester les API au niveau du point de terminaison https://sandbox.opensignlabs.com/api/v1, vous permettant ainsi d'effectuer un nombre illimité de signatures de documents. Veuillez noter que l'API sandbox signera vos documents avec des certificats auto-signés, qui peuvent ne pas être reconnus comme valides par Adobe. Une fois vos tests terminés, vous pouvez passer à l’un de nos forfaits payants pour générer un jeton de production.", "help-api-token":"Ce jeton peut être utilisé pour accéder aux API de production au point de terminaison {{origin}}/api/v1. Il ne peut être généré que sur l'un de nos forfaits payants." - } diff --git a/apps/OpenSign/public/static/js/public-template.bundle.js b/apps/OpenSign/public/static/js/public-template.bundle.js index b762cd6b0..c60ae2886 100644 --- a/apps/OpenSign/public/static/js/public-template.bundle.js +++ b/apps/OpenSign/public/static/js/public-template.bundle.js @@ -5280,6 +5280,36573 @@ function safePolygon(options) { +/***/ }), + +/***/ "./node_modules/@pdf-lib/fontkit/dist/fontkit.es.js": +/*!**********************************************************!*\ + !*** ./node_modules/@pdf-lib/fontkit/dist/fontkit.es.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! pako */ "./node_modules/pako/index.js"); +/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(pako__WEBPACK_IMPORTED_MODULE_0__); + + +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; + +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +} + +function getCjsExportFromNamespace (n) { + return n && n['default'] || n; +} + +var byteLength_1 = byteLength; +var toByteArray_1 = toByteArray; +var fromByteArray_1 = fromByteArray; +var lookup = []; +var revLookup = []; +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; +} // Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications + + +revLookup['-'.charCodeAt(0)] = 62; +revLookup['_'.charCodeAt(0)] = 63; + +function getLens(b64) { + var len = b64.length; + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4'); + } // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + + + var validLen = b64.indexOf('='); + if (validLen === -1) validLen = len; + var placeHoldersLen = validLen === len ? 0 : 4 - validLen % 4; + return [validLen, placeHoldersLen]; +} // base64 is 4/3 + up to two characters of the original data + + +function byteLength(b64) { + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; +} + +function _byteLength(b64, validLen, placeHoldersLen) { + return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; +} + +function toByteArray(b64) { + var tmp; + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)); + var curByte = 0; // if there are placeholders, only get up to the last complete 4 chars + + var len = placeHoldersLen > 0 ? validLen - 4 : validLen; + var i; + + for (i = 0; i < len; i += 4) { + tmp = revLookup[b64.charCodeAt(i)] << 18 | revLookup[b64.charCodeAt(i + 1)] << 12 | revLookup[b64.charCodeAt(i + 2)] << 6 | revLookup[b64.charCodeAt(i + 3)]; + arr[curByte++] = tmp >> 16 & 0xFF; + arr[curByte++] = tmp >> 8 & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 2) { + tmp = revLookup[b64.charCodeAt(i)] << 2 | revLookup[b64.charCodeAt(i + 1)] >> 4; + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 1) { + tmp = revLookup[b64.charCodeAt(i)] << 10 | revLookup[b64.charCodeAt(i + 1)] << 4 | revLookup[b64.charCodeAt(i + 2)] >> 2; + arr[curByte++] = tmp >> 8 & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + return arr; +} + +function tripletToBase64(num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]; +} + +function encodeChunk(uint8, start, end) { + var tmp; + var output = []; + + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16 & 0xFF0000) + (uint8[i + 1] << 8 & 0xFF00) + (uint8[i + 2] & 0xFF); + output.push(tripletToBase64(tmp)); + } + + return output.join(''); +} + +function fromByteArray(uint8) { + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + // go through the array every three bytes, we'll deal with trailing stuff later + + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength)); + } // pad the end with zeros, but make sure to not forget the extra bytes + + + if (extraBytes === 1) { + tmp = uint8[len - 1]; + parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 0x3F] + '=='); + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1]; + parts.push(lookup[tmp >> 10] + lookup[tmp >> 4 & 0x3F] + lookup[tmp << 2 & 0x3F] + '='); + } + + return parts.join(''); +} + +var base64Js = { + byteLength: byteLength_1, + toByteArray: toByteArray_1, + fromByteArray: fromByteArray_1 +}; + +var read = function read(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 write(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 +}; + +var buffer = createCommonjsModule(function (module, exports) { + + var customInspectSymbol = typeof Symbol === 'function' && typeof Symbol["for"] === 'function' ? Symbol["for"]('nodejs.util.inspect.custom') : null; + exports.Buffer = Buffer; + exports.SlowBuffer = SlowBuffer; + exports.INSPECT_MAX_BYTES = 50; + var K_MAX_LENGTH = 0x7fffffff; + exports.kMaxLength = K_MAX_LENGTH; + /** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Print warning and recommend using `buffer` v4.x which has an Object + * implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * We report that the browser does not support typed arrays if the are not subclassable + * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` + * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support + * for __proto__ and has a buggy typed array implementation. + */ + + Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport(); + + if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && typeof console.error === 'function') { + console.error('This browser lacks typed array (Uint8Array) support which is required by ' + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'); + } + + function typedArraySupport() { + // Can typed array instances can be augmented? + try { + var arr = new Uint8Array(1); + var proto = { + foo: function foo() { + return 42; + } + }; + Object.setPrototypeOf(proto, Uint8Array.prototype); + Object.setPrototypeOf(arr, proto); + return arr.foo() === 42; + } catch (e) { + return false; + } + } + + Object.defineProperty(Buffer.prototype, 'parent', { + enumerable: true, + get: function get() { + if (!Buffer.isBuffer(this)) return undefined; + return this.buffer; + } + }); + Object.defineProperty(Buffer.prototype, 'offset', { + enumerable: true, + get: function get() { + if (!Buffer.isBuffer(this)) return undefined; + return this.byteOffset; + } + }); + + function createBuffer(length) { + if (length > K_MAX_LENGTH) { + throw new RangeError('The value "' + length + '" is invalid for option "size"'); + } // Return an augmented `Uint8Array` instance + + + var buf = new Uint8Array(length); + Object.setPrototypeOf(buf, Buffer.prototype); + return buf; + } + /** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + + + function Buffer(arg, encodingOrOffset, length) { + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new TypeError('The "string" argument must be of type string. Received type number'); + } + + return allocUnsafe(arg); + } + + return from(arg, encodingOrOffset, length); + } + + Buffer.poolSize = 8192; // not used by this implementation + + function from(value, encodingOrOffset, length) { + if (typeof value === 'string') { + return fromString(value, encodingOrOffset); + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value); + } + + if (value == null) { + throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + 'or Array-like Object. Received type ' + typeof value); + } + + if (isInstance(value, ArrayBuffer) || value && isInstance(value.buffer, ArrayBuffer)) { + return fromArrayBuffer(value, encodingOrOffset, length); + } + + if (typeof SharedArrayBuffer !== 'undefined' && (isInstance(value, SharedArrayBuffer) || value && isInstance(value.buffer, SharedArrayBuffer))) { + return fromArrayBuffer(value, encodingOrOffset, length); + } + + if (typeof value === 'number') { + throw new TypeError('The "value" argument must not be of type number. Received type number'); + } + + var valueOf = value.valueOf && value.valueOf(); + + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length); + } + + var b = fromObject(value); + if (b) return b; + + if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === 'function') { + return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length); + } + + throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + 'or Array-like Object. Received type ' + typeof value); + } + /** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ + + + Buffer.from = function (value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length); + }; // Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: + // https://github.com/feross/buffer/pull/148 + + + Object.setPrototypeOf(Buffer.prototype, Uint8Array.prototype); + Object.setPrototypeOf(Buffer, Uint8Array); + + function assertSize(size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be of type number'); + } else if (size < 0) { + throw new RangeError('The value "' + size + '" is invalid for option "size"'); + } + } + + function alloc(size, fill, encoding) { + assertSize(size); + + if (size <= 0) { + return createBuffer(size); + } + + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' ? createBuffer(size).fill(fill, encoding) : createBuffer(size).fill(fill); + } + + return createBuffer(size); + } + /** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ + + + Buffer.alloc = function (size, fill, encoding) { + return alloc(size, fill, encoding); + }; + + function allocUnsafe(size) { + assertSize(size); + return createBuffer(size < 0 ? 0 : checked(size) | 0); + } + /** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ + + + Buffer.allocUnsafe = function (size) { + return allocUnsafe(size); + }; + /** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ + + + Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(size); + }; + + function fromString(string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8'; + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding); + } + + var length = byteLength(string, encoding) | 0; + var buf = createBuffer(length); + var actual = buf.write(string, encoding); + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + buf = buf.slice(0, actual); + } + + return buf; + } + + function fromArrayLike(array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0; + var buf = createBuffer(length); + + for (var i = 0; i < length; i += 1) { + buf[i] = array[i] & 255; + } + + return buf; + } + + function fromArrayBuffer(array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds'); + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds'); + } + + var buf; + + if (byteOffset === undefined && length === undefined) { + buf = new Uint8Array(array); + } else if (length === undefined) { + buf = new Uint8Array(array, byteOffset); + } else { + buf = new Uint8Array(array, byteOffset, length); + } // Return an augmented `Uint8Array` instance + + + Object.setPrototypeOf(buf, Buffer.prototype); + return buf; + } + + function fromObject(obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0; + var buf = createBuffer(len); + + if (buf.length === 0) { + return buf; + } + + obj.copy(buf, 0, 0, len); + return buf; + } + + if (obj.length !== undefined) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0); + } + + return fromArrayLike(obj); + } + + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data); + } + } + + function checked(length) { + // Note: cannot use `length < K_MAX_LENGTH` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= K_MAX_LENGTH) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes'); + } + + return length | 0; + } + + function SlowBuffer(length) { + if (+length != length) { + // eslint-disable-line eqeqeq + length = 0; + } + + return Buffer.alloc(+length); + } + + Buffer.isBuffer = function isBuffer(b) { + return b != null && b._isBuffer === true && b !== Buffer.prototype; // so Buffer.isBuffer(Buffer.prototype) will be false + }; + + Buffer.compare = function compare(a, b) { + if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength); + if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength); + + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'); + } + + 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; + }; + + Buffer.isEncoding = function isEncoding(encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true; + + default: + return false; + } + }; + + Buffer.concat = function concat(list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers'); + } + + if (list.length === 0) { + return Buffer.alloc(0); + } + + var i; + + if (length === undefined) { + length = 0; + + for (i = 0; i < list.length; ++i) { + length += list[i].length; + } + } + + var buffer = Buffer.allocUnsafe(length); + var pos = 0; + + for (i = 0; i < list.length; ++i) { + var buf = list[i]; + + if (isInstance(buf, Uint8Array)) { + buf = Buffer.from(buf); + } + + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers'); + } + + buf.copy(buffer, pos); + pos += buf.length; + } + + return buffer; + }; + + function byteLength(string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length; + } + + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength; + } + + if (typeof string !== 'string') { + throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + 'Received type ' + typeof string); + } + + var len = string.length; + var mustMatch = arguments.length > 2 && arguments[2] === true; + if (!mustMatch && len === 0) return 0; // Use a for loop to avoid recursion + + var loweredCase = false; + + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len; + + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length; + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2; + + case 'hex': + return len >>> 1; + + case 'base64': + return base64ToBytes(string).length; + + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length; // assume utf8 + } + + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } + } + + Buffer.byteLength = byteLength; + + function slowToString(encoding, start, end) { + var loweredCase = false; // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + + if (start === undefined || start < 0) { + start = 0; + } // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + + + if (start > this.length) { + return ''; + } + + if (end === undefined || end > this.length) { + end = this.length; + } + + if (end <= 0) { + return ''; + } // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + + + end >>>= 0; + start >>>= 0; + + if (end <= start) { + return ''; + } + + if (!encoding) encoding = 'utf8'; + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end); + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end); + + case 'ascii': + return asciiSlice(this, start, end); + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end); + + case 'base64': + return base64Slice(this, start, end); + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end); + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding); + encoding = (encoding + '').toLowerCase(); + loweredCase = true; + } + } + } // This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) + // to detect a Buffer instance. It's not possible to use `instanceof Buffer` + // reliably in a browserify context because there could be multiple different + // copies of the 'buffer' package in use. This method works even for Buffer + // instances that were created from another copy of the `buffer` package. + // See: https://github.com/feross/buffer/issues/154 + + + Buffer.prototype._isBuffer = true; + + function swap(b, n, m) { + var i = b[n]; + b[n] = b[m]; + b[m] = i; + } + + Buffer.prototype.swap16 = function swap16() { + var len = this.length; + + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits'); + } + + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1); + } + + return this; + }; + + Buffer.prototype.swap32 = function swap32() { + var len = this.length; + + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits'); + } + + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3); + swap(this, i + 1, i + 2); + } + + return this; + }; + + Buffer.prototype.swap64 = function swap64() { + var len = this.length; + + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits'); + } + + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7); + swap(this, i + 1, i + 6); + swap(this, i + 2, i + 5); + swap(this, i + 3, i + 4); + } + + return this; + }; + + Buffer.prototype.toString = function toString() { + var length = this.length; + if (length === 0) return ''; + if (arguments.length === 0) return utf8Slice(this, 0, length); + return slowToString.apply(this, arguments); + }; + + Buffer.prototype.toLocaleString = Buffer.prototype.toString; + + Buffer.prototype.equals = function equals(b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer'); + if (this === b) return true; + return Buffer.compare(this, b) === 0; + }; + + Buffer.prototype.inspect = function inspect() { + var str = ''; + var max = exports.INSPECT_MAX_BYTES; + str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim(); + if (this.length > max) str += ' ... '; + return ''; + }; + + if (customInspectSymbol) { + Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect; + } + + Buffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength); + } + + if (!Buffer.isBuffer(target)) { + throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. ' + 'Received type ' + typeof target); + } + + if (start === undefined) { + start = 0; + } + + if (end === undefined) { + end = target ? target.length : 0; + } + + if (thisStart === undefined) { + thisStart = 0; + } + + if (thisEnd === undefined) { + thisEnd = this.length; + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index'); + } + + if (thisStart >= thisEnd && start >= end) { + return 0; + } + + if (thisStart >= thisEnd) { + return -1; + } + + if (start >= end) { + return 1; + } + + start >>>= 0; + end >>>= 0; + thisStart >>>= 0; + thisEnd >>>= 0; + if (this === target) return 0; + var x = thisEnd - thisStart; + var y = end - start; + var len = Math.min(x, y); + var thisCopy = this.slice(thisStart, thisEnd); + var targetCopy = target.slice(start, end); + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i]; + y = targetCopy[i]; + break; + } + } + + if (x < y) return -1; + if (y < x) return 1; + return 0; + }; // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, + // OR the last index of `val` in `buffer` at offset <= `byteOffset`. + // + // Arguments: + // - buffer - a Buffer to search + // - val - a string, Buffer, or number + // - byteOffset - an index into `buffer`; will be clamped to an int32 + // - encoding - an optional encoding, relevant is val is a string + // - dir - true for indexOf, false for lastIndexOf + + + function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1; // Normalize byteOffset + + if (typeof byteOffset === 'string') { + encoding = byteOffset; + byteOffset = 0; + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff; + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000; + } + + byteOffset = +byteOffset; // Coerce to Number. + + if (numberIsNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : buffer.length - 1; + } // Normalize byteOffset: negative offsets start from the end of the buffer + + + if (byteOffset < 0) byteOffset = buffer.length + byteOffset; + + if (byteOffset >= buffer.length) { + if (dir) return -1;else byteOffset = buffer.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0;else return -1; + } // Normalize val + + + if (typeof val === 'string') { + val = Buffer.from(val, encoding); + } // Finally, search either indexOf (if dir is true) or lastIndexOf + + + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1; + } + + return arrayIndexOf(buffer, val, byteOffset, encoding, dir); + } else if (typeof val === 'number') { + val = val & 0xFF; // Search for a byte value [0-255] + + if (typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset); + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset); + } + } + + return arrayIndexOf(buffer, [val], byteOffset, encoding, dir); + } + + throw new TypeError('val must be string, number or Buffer'); + } + + function arrayIndexOf(arr, val, byteOffset, encoding, dir) { + var indexSize = 1; + var arrLength = arr.length; + var valLength = val.length; + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase(); + + if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1; + } + + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } + } + + function read(buf, i) { + if (indexSize === 1) { + return buf[i]; + } else { + return buf.readUInt16BE(i * indexSize); + } + } + + var i; + + if (dir) { + var foundIndex = -1; + + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize; + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; + + for (i = byteOffset; i >= 0; i--) { + var found = true; + + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false; + break; + } + } + + if (found) return i; + } + } + + return -1; + } + + Buffer.prototype.includes = function includes(val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1; + }; + + Buffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true); + }; + + Buffer.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false); + }; + + function hexWrite(buf, string, offset, length) { + offset = Number(offset) || 0; + var remaining = buf.length - offset; + + if (!length) { + length = remaining; + } else { + length = Number(length); + + if (length > remaining) { + length = remaining; + } + } + + var strLen = string.length; + + if (length > strLen / 2) { + length = strLen / 2; + } + + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16); + if (numberIsNaN(parsed)) return i; + buf[offset + i] = parsed; + } + + return i; + } + + function utf8Write(buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length); + } + + function asciiWrite(buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length); + } + + function latin1Write(buf, string, offset, length) { + return asciiWrite(buf, string, offset, length); + } + + function base64Write(buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length); + } + + function ucs2Write(buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length); + } + + Buffer.prototype.write = function write(string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8'; + length = this.length; + offset = 0; // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset; + length = this.length; + offset = 0; // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset >>> 0; + + if (isFinite(length)) { + length = length >>> 0; + if (encoding === undefined) encoding = 'utf8'; + } else { + encoding = length; + length = undefined; + } + } else { + throw new Error('Buffer.write(string, encoding, offset[, length]) is no longer supported'); + } + + var remaining = this.length - offset; + if (length === undefined || length > remaining) length = remaining; + + if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds'); + } + + if (!encoding) encoding = 'utf8'; + var loweredCase = false; + + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length); + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length); + + case 'ascii': + return asciiWrite(this, string, offset, length); + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length); + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length); + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length); + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding); + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } + }; + + Buffer.prototype.toJSON = function toJSON() { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + }; + }; + + function base64Slice(buf, start, end) { + if (start === 0 && end === buf.length) { + return base64Js.fromByteArray(buf); + } else { + return base64Js.fromByteArray(buf.slice(start, end)); + } + } + + function utf8Slice(buf, start, end) { + end = Math.min(buf.length, end); + var res = []; + var i = start; + + while (i < end) { + var firstByte = buf[i]; + var codePoint = null; + var bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1; + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint; + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte; + } + + break; + + case 2: + secondByte = buf[i + 1]; + + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F; + + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint; + } + } + + break; + + case 3: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F; + + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint; + } + } + + break; + + case 4: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + fourthByte = buf[i + 3]; + + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F; + + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint; + } + } + + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD; + bytesPerSequence = 1; + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000; + res.push(codePoint >>> 10 & 0x3FF | 0xD800); + codePoint = 0xDC00 | codePoint & 0x3FF; + } + + res.push(codePoint); + i += bytesPerSequence; + } + + return decodeCodePointsArray(res); + } // Based on http://stackoverflow.com/a/22747272/680742, the browser with + // the lowest limit is Chrome, with 0x10000 args. + // We go 1 magnitude less, for safety + + + var MAX_ARGUMENTS_LENGTH = 0x1000; + + function decodeCodePointsArray(codePoints) { + var len = codePoints.length; + + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints); // avoid extra slice() + } // Decode in chunks to avoid "call stack size exceeded". + + + var res = ''; + var i = 0; + + while (i < len) { + res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)); + } + + return res; + } + + function asciiSlice(buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F); + } + + return ret; + } + + function latin1Slice(buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]); + } + + return ret; + } + + function hexSlice(buf, start, end) { + var len = buf.length; + if (!start || start < 0) start = 0; + if (!end || end < 0 || end > len) end = len; + var out = ''; + + for (var i = start; i < end; ++i) { + out += hexSliceLookupTable[buf[i]]; + } + + return out; + } + + function utf16leSlice(buf, start, end) { + var bytes = buf.slice(start, end); + var res = ''; + + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); + } + + return res; + } + + Buffer.prototype.slice = function slice(start, end) { + var len = this.length; + start = ~~start; + end = end === undefined ? len : ~~end; + + if (start < 0) { + start += len; + if (start < 0) start = 0; + } else if (start > len) { + start = len; + } + + if (end < 0) { + end += len; + if (end < 0) end = 0; + } else if (end > len) { + end = len; + } + + if (end < start) end = start; + var newBuf = this.subarray(start, end); // Return an augmented `Uint8Array` instance + + Object.setPrototypeOf(newBuf, Buffer.prototype); + return newBuf; + }; + /* + * Need to make sure that buffer isn't trying to write out of bounds. + */ + + + function checkOffset(offset, ext, length) { + if (offset % 1 !== 0 || offset < 0) throw new RangeError('offset is not uint'); + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length'); + } + + Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + var val = this[offset]; + var mul = 1; + var i = 0; + + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + + return val; + }; + + Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + + if (!noAssert) { + checkOffset(offset, byteLength, this.length); + } + + var val = this[offset + --byteLength]; + var mul = 1; + + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul; + } + + return val; + }; + + Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 1, this.length); + return this[offset]; + }; + + Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + return this[offset] | this[offset + 1] << 8; + }; + + Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + return this[offset] << 8 | this[offset + 1]; + }; + + Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 0x1000000; + }; + + Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return this[offset] * 0x1000000 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]); + }; + + Buffer.prototype.readIntLE = function readIntLE(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + var val = this[offset]; + var mul = 1; + var i = 0; + + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + + mul *= 0x80; + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + return val; + }; + + Buffer.prototype.readIntBE = function readIntBE(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + var i = byteLength; + var mul = 1; + var val = this[offset + --i]; + + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul; + } + + mul *= 0x80; + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + return val; + }; + + Buffer.prototype.readInt8 = function readInt8(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 1, this.length); + if (!(this[offset] & 0x80)) return this[offset]; + return (0xff - this[offset] + 1) * -1; + }; + + Buffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset] | this[offset + 1] << 8; + return val & 0x8000 ? val | 0xFFFF0000 : val; + }; + + Buffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset + 1] | this[offset] << 8; + return val & 0x8000 ? val | 0xFFFF0000 : val; + }; + + Buffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24; + }; + + Buffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]; + }; + + Buffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ieee754.read(this, offset, true, 23, 4); + }; + + Buffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ieee754.read(this, offset, false, 23, 4); + }; + + Buffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 8, this.length); + return ieee754.read(this, offset, true, 52, 8); + }; + + Buffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 8, this.length); + return ieee754.read(this, offset, false, 52, 8); + }; + + function checkInt(buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance'); + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds'); + if (offset + ext > buf.length) throw new RangeError('Index out of range'); + } + + Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + byteLength = byteLength >>> 0; + + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var mul = 1; + var i = 0; + this[offset] = value & 0xFF; + + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = value / mul & 0xFF; + } + + return offset + byteLength; + }; + + Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + byteLength = byteLength >>> 0; + + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var i = byteLength - 1; + var mul = 1; + this[offset + i] = value & 0xFF; + + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = value / mul & 0xFF; + } + + return offset + byteLength; + }; + + Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0); + this[offset] = value & 0xff; + return offset + 1; + }; + + Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + this[offset] = value & 0xff; + this[offset + 1] = value >>> 8; + return offset + 2; + }; + + Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + this[offset] = value >>> 8; + this[offset + 1] = value & 0xff; + return offset + 2; + }; + + Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + this[offset + 3] = value >>> 24; + this[offset + 2] = value >>> 16; + this[offset + 1] = value >>> 8; + this[offset] = value & 0xff; + return offset + 4; + }; + + Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + this[offset] = value >>> 24; + this[offset + 1] = value >>> 16; + this[offset + 2] = value >>> 8; + this[offset + 3] = value & 0xff; + return offset + 4; + }; + + Buffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = 0; + var mul = 1; + var sub = 0; + this[offset] = value & 0xFF; + + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1; + } + + this[offset + i] = (value / mul >> 0) - sub & 0xFF; + } + + return offset + byteLength; + }; + + Buffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = byteLength - 1; + var mul = 1; + var sub = 0; + this[offset + i] = value & 0xFF; + + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1; + } + + this[offset + i] = (value / mul >> 0) - sub & 0xFF; + } + + return offset + byteLength; + }; + + Buffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80); + if (value < 0) value = 0xff + value + 1; + this[offset] = value & 0xff; + return offset + 1; + }; + + Buffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + this[offset] = value & 0xff; + this[offset + 1] = value >>> 8; + return offset + 2; + }; + + Buffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + this[offset] = value >>> 8; + this[offset + 1] = value & 0xff; + return offset + 2; + }; + + Buffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + this[offset] = value & 0xff; + this[offset + 1] = value >>> 8; + this[offset + 2] = value >>> 16; + this[offset + 3] = value >>> 24; + return offset + 4; + }; + + Buffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (value < 0) value = 0xffffffff + value + 1; + this[offset] = value >>> 24; + this[offset + 1] = value >>> 16; + this[offset + 2] = value >>> 8; + this[offset + 3] = value & 0xff; + return offset + 4; + }; + + function checkIEEE754(buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range'); + if (offset < 0) throw new RangeError('Index out of range'); + } + + function writeFloat(buf, value, offset, littleEndian, noAssert) { + value = +value; + offset = offset >>> 0; + + if (!noAssert) { + checkIEEE754(buf, value, offset, 4); + } + + ieee754.write(buf, value, offset, littleEndian, 23, 4); + return offset + 4; + } + + Buffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert); + }; + + Buffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert); + }; + + function writeDouble(buf, value, offset, littleEndian, noAssert) { + value = +value; + offset = offset >>> 0; + + if (!noAssert) { + checkIEEE754(buf, value, offset, 8); + } + + ieee754.write(buf, value, offset, littleEndian, 52, 8); + return offset + 8; + } + + Buffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert); + }; + + Buffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert); + }; // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) + + + Buffer.prototype.copy = function copy(target, targetStart, start, end) { + if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer'); + if (!start) start = 0; + if (!end && end !== 0) end = this.length; + if (targetStart >= target.length) targetStart = target.length; + if (!targetStart) targetStart = 0; + if (end > 0 && end < start) end = start; // Copy 0 bytes; we're done + + if (end === start) return 0; + if (target.length === 0 || this.length === 0) return 0; // Fatal error conditions + + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds'); + } + + if (start < 0 || start >= this.length) throw new RangeError('Index out of range'); + if (end < 0) throw new RangeError('sourceEnd out of bounds'); // Are we oob? + + if (end > this.length) end = this.length; + + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start; + } + + var len = end - start; + + if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { + // Use built-in when available, missing from IE11 + this.copyWithin(targetStart, start, end); + } else if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (var i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start]; + } + } else { + Uint8Array.prototype.set.call(target, this.subarray(start, end), targetStart); + } + + return len; + }; // Usage: + // buffer.fill(number[, offset[, end]]) + // buffer.fill(buffer[, offset[, end]]) + // buffer.fill(string[, offset[, end]][, encoding]) + + + Buffer.prototype.fill = function fill(val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start; + start = 0; + end = this.length; + } else if (typeof end === 'string') { + encoding = end; + end = this.length; + } + + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string'); + } + + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding); + } + + if (val.length === 1) { + var code = val.charCodeAt(0); + + if (encoding === 'utf8' && code < 128 || encoding === 'latin1') { + // Fast path: If `val` fits into a single byte, use that numeric value. + val = code; + } + } + } else if (typeof val === 'number') { + val = val & 255; + } else if (typeof val === 'boolean') { + val = Number(val); + } // Invalid ranges are not set to a default, so can range check early. + + + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index'); + } + + if (end <= start) { + return this; + } + + start = start >>> 0; + end = end === undefined ? this.length : end >>> 0; + if (!val) val = 0; + var i; + + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val; + } + } else { + var bytes = Buffer.isBuffer(val) ? val : Buffer.from(val, encoding); + var len = bytes.length; + + if (len === 0) { + throw new TypeError('The value "' + val + '" is invalid for argument "value"'); + } + + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len]; + } + } + + return this; + }; // HELPER FUNCTIONS + // ================ + + + var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g; + + function base64clean(str) { + // Node takes equal signs as end of the Base64 encoding + str = str.split('=')[0]; // Node strips out invalid characters like \n and \t from the string, base64-js does not + + str = str.trim().replace(INVALID_BASE64_RE, ''); // Node converts strings with length < 2 to '' + + if (str.length < 2) return ''; // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + + while (str.length % 4 !== 0) { + str = str + '='; + } + + return str; + } + + function utf8ToBytes(string, units) { + units = units || Infinity; + var codePoint; + var length = string.length; + var leadSurrogate = null; + var bytes = []; + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i); // is surrogate component + + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue; + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue; + } // valid lead + + + leadSurrogate = codePoint; + continue; + } // 2 leads in a row + + + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + leadSurrogate = codePoint; + continue; + } // valid surrogate pair + + + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + } + + leadSurrogate = null; // encode utf8 + + if (codePoint < 0x80) { + if ((units -= 1) < 0) break; + bytes.push(codePoint); + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break; + bytes.push(codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80); + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break; + bytes.push(codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80); + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break; + bytes.push(codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80); + } else { + throw new Error('Invalid code point'); + } + } + + return bytes; + } + + function asciiToBytes(str) { + var byteArray = []; + + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF); + } + + return byteArray; + } + + function utf16leToBytes(str, units) { + var c, hi, lo; + var byteArray = []; + + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break; + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); + } + + return byteArray; + } + + function base64ToBytes(str) { + return base64Js.toByteArray(base64clean(str)); + } + + function blitBuffer(src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if (i + offset >= dst.length || i >= src.length) break; + dst[i + offset] = src[i]; + } + + return i; + } // ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass + // the `instanceof` check but they should be treated as of that type. + // See: https://github.com/feross/buffer/issues/166 + + + function isInstance(obj, type) { + return obj instanceof type || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name; + } + + function numberIsNaN(obj) { + // For IE11 support + return obj !== obj; // eslint-disable-line no-self-compare + } // Create lookup table for `toString('hex')` + // See: https://github.com/feross/buffer/issues/219 + + + var hexSliceLookupTable = function () { + var alphabet = '0123456789abcdef'; + var table = new Array(256); + + for (var i = 0; i < 16; ++i) { + var i16 = i * 16; + + for (var j = 0; j < 16; ++j) { + table[i16 + j] = alphabet[i] + alphabet[j]; + } + } + + return table; + }(); +}); +var buffer_1 = buffer.Buffer; +var buffer_2 = buffer.SlowBuffer; +var buffer_3 = buffer.INSPECT_MAX_BYTES; +var buffer_4 = buffer.kMaxLength; + +var domain; // This constructor is used to store event handlers. Instantiating this is +// faster than explicitly calling `Object.create(null)` to get a "clean" empty +// object (tested with v8 v4.9). + +function EventHandlers() {} + +EventHandlers.prototype = Object.create(null); + +function EventEmitter() { + EventEmitter.init.call(this); +} +// require('events') === require('events').EventEmitter + +EventEmitter.EventEmitter = EventEmitter; +EventEmitter.usingDomains = false; +EventEmitter.prototype.domain = undefined; +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. + +EventEmitter.defaultMaxListeners = 10; + +EventEmitter.init = function () { + this.domain = null; + + if (EventEmitter.usingDomains) { + // if there is an active domain, then attach to it. + if (domain.active ) ; + } + + if (!this._events || this._events === Object.getPrototypeOf(this)._events) { + this._events = new EventHandlers(); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +}; // Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. + + +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || isNaN(n)) throw new TypeError('"n" argument must be a positive number'); + this._maxListeners = n; + return this; +}; + +function $getMaxListeners(that) { + if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return $getMaxListeners(this); +}; // These standalone emit* functions are used to optimize calling of event +// handlers for fast cases because emit() itself often has a variable number of +// arguments and can be deoptimized because of that. These functions always have +// the same number of arguments and thus do not get deoptimized, so the code +// inside them can execute faster. + + +function emitNone(handler, isFn, self) { + if (isFn) handler.call(self);else { + var len = handler.length; + var listeners = arrayClone(handler, len); + + for (var i = 0; i < len; ++i) { + listeners[i].call(self); + } + } +} + +function emitOne(handler, isFn, self, arg1) { + if (isFn) handler.call(self, arg1);else { + var len = handler.length; + var listeners = arrayClone(handler, len); + + for (var i = 0; i < len; ++i) { + listeners[i].call(self, arg1); + } + } +} + +function emitTwo(handler, isFn, self, arg1, arg2) { + if (isFn) handler.call(self, arg1, arg2);else { + var len = handler.length; + var listeners = arrayClone(handler, len); + + for (var i = 0; i < len; ++i) { + listeners[i].call(self, arg1, arg2); + } + } +} + +function emitThree(handler, isFn, self, arg1, arg2, arg3) { + if (isFn) handler.call(self, arg1, arg2, arg3);else { + var len = handler.length; + var listeners = arrayClone(handler, len); + + for (var i = 0; i < len; ++i) { + listeners[i].call(self, arg1, arg2, arg3); + } + } +} + +function emitMany(handler, isFn, self, args) { + if (isFn) handler.apply(self, args);else { + var len = handler.length; + var listeners = arrayClone(handler, len); + + for (var i = 0; i < len; ++i) { + listeners[i].apply(self, args); + } + } +} + +EventEmitter.prototype.emit = function emit(type) { + var er, handler, len, args, i, events, domain; + var doError = type === 'error'; + events = this._events; + if (events) doError = doError && events.error == null;else if (!doError) return false; + domain = this.domain; // If there is no 'error' event listener then throw. + + if (doError) { + er = arguments[1]; + + if (domain) { + if (!er) er = new Error('Uncaught, unspecified "error" event'); + er.domainEmitter = this; + er.domain = domain; + er.domainThrown = false; + domain.emit('error', er); + } else if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); + err.context = er; + throw err; + } + + return false; + } + + handler = events[type]; + if (!handler) return false; + var isFn = typeof handler === 'function'; + len = arguments.length; + + switch (len) { + // fast cases + case 1: + emitNone(handler, isFn, this); + break; + + case 2: + emitOne(handler, isFn, this, arguments[1]); + break; + + case 3: + emitTwo(handler, isFn, this, arguments[1], arguments[2]); + break; + + case 4: + emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); + break; + // slower + + default: + args = new Array(len - 1); + + for (i = 1; i < len; i++) { + args[i - 1] = arguments[i]; + } + + emitMany(handler, isFn, this, args); + } + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); + events = target._events; + + if (!events) { + events = target._events = new EventHandlers(); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener) { + target.emit('newListener', type, listener.listener ? listener.listener : listener); // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + + events = target._events; + } + + existing = events[type]; + } + + if (!existing) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = prepend ? [listener, existing] : [existing, listener]; + } else { + // If we've already got an array, just append. + if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + } // Check for listener leak + + + if (!existing.warned) { + m = $getMaxListeners(target); + + if (m && m > 0 && existing.length > m) { + existing.warned = true; + var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' ' + type + ' listeners added. ' + 'Use emitter.setMaxListeners() to increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + emitWarning(w); + } + } + } + + return target; +} + +function emitWarning(e) { + typeof console.warn === 'function' ? console.warn(e) : console.log(e); +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = function prependListener(type, listener) { + return _addListener(this, type, listener, true); +}; + +function _onceWrap(target, type, listener) { + var fired = false; + + function g() { + target.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(target, arguments); + } + } + + g.listener = listener; + return g; +} + +EventEmitter.prototype.once = function once(type, listener) { + if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) { + if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; +}; // emits a 'removeListener' event iff the listener was removed + + +EventEmitter.prototype.removeListener = function removeListener(type, listener) { + var list, events, position, i, originalListener; + if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); + events = this._events; + if (!events) return this; + list = events[type]; + if (!list) return this; + + if (list === listener || list.listener && list.listener === listener) { + if (--this._eventsCount === 0) this._events = new EventHandlers();else { + delete events[type]; + if (events.removeListener) this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length; i-- > 0;) { + if (list[i] === listener || list[i].listener && list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) return this; + + if (list.length === 1) { + list[0] = undefined; + + if (--this._eventsCount === 0) { + this._events = new EventHandlers(); + return this; + } else { + delete events[type]; + } + } else { + spliceOne(list, position); + } + + if (events.removeListener) this.emit('removeListener', type, originalListener || listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { + var listeners, events; + events = this._events; + if (!events) return this; // not listening for removeListener, no need to emit + + if (!events.removeListener) { + if (arguments.length === 0) { + this._events = new EventHandlers(); + this._eventsCount = 0; + } else if (events[type]) { + if (--this._eventsCount === 0) this._events = new EventHandlers();else delete events[type]; + } + + return this; + } // emit removeListener for all listeners on all events + + + if (arguments.length === 0) { + var keys = Object.keys(events); + + for (var i = 0, key; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + + this.removeAllListeners('removeListener'); + this._events = new EventHandlers(); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + do { + this.removeListener(type, listeners[listeners.length - 1]); + } while (listeners[0]); + } + + return this; +}; + +EventEmitter.prototype.listeners = function listeners(type) { + var evlistener; + var ret; + var events = this._events; + if (!events) ret = [];else { + evlistener = events[type]; + if (!evlistener) ret = [];else if (typeof evlistener === 'function') ret = [evlistener.listener || evlistener];else ret = unwrapListeners(evlistener); + } + return ret; +}; + +EventEmitter.listenerCount = function (emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; + +function listenerCount(type) { + var events = this._events; + + if (events) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; +}; // About 1.5x faster than the two-arg version of Array#splice(). + + +function spliceOne(list, index) { + for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) { + list[i] = list[k]; + } + + list.pop(); +} + +function arrayClone(arr, i) { + var copy = new Array(i); + + while (i--) { + copy[i] = arr[i]; + } + + return copy; +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + + return ret; +} + +var global$1 = typeof __webpack_require__.g !== "undefined" ? __webpack_require__.g : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}; + +// shim for using process in browser +// based off https://github.com/defunctzombie/node-process/blob/master/browser.js +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} + +function defaultClearTimeout() { + throw new Error('clearTimeout has not been defined'); +} + +var cachedSetTimeout = defaultSetTimout; +var cachedClearTimeout = defaultClearTimeout; + +if (typeof global$1.setTimeout === 'function') { + cachedSetTimeout = setTimeout; +} + +if (typeof global$1.clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; +} + +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } // if setTimeout wasn't available but was latter defined + + + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } +} + +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } // if clearTimeout wasn't available but was latter defined + + + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } +} + +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + + draining = false; + + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + + var timeout = runTimeout(cleanUpNextTick); + draining = true; + var len = queue.length; + + while (len) { + currentQueue = queue; + queue = []; + + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + + queueIndex = -1; + len = queue.length; + } + + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +function nextTick(fun) { + var args = new Array(arguments.length - 1); + + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + + queue.push(new Item(fun, args)); + + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +} // v8 likes predictible objects + +function Item(fun, array) { + this.fun = fun; + this.array = array; +} + +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; + +var title = 'browser'; +var platform = 'browser'; +var browser = true; +var env = {}; +var argv = []; +var version = ''; // empty string to avoid regexp issues + +var versions = {}; +var release = {}; +var config = {}; + +function noop() {} + +var on = noop; +var addListener = noop; +var once = noop; +var off = noop; +var removeListener = noop; +var removeAllListeners = noop; +var emit = noop; +function binding(name) { + throw new Error('process.binding is not supported'); +} +function cwd() { + return '/'; +} +function chdir(dir) { + throw new Error('process.chdir is not supported'); +} +function umask() { + return 0; +} // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js + +var performance = global$1.performance || {}; + +var performanceNow = performance.now || performance.mozNow || performance.msNow || performance.oNow || performance.webkitNow || function () { + return new Date().getTime(); +}; // generate timestamp or delta +// see http://nodejs.org/api/process.html#process_process_hrtime + + +function hrtime(previousTimestamp) { + var clocktime = performanceNow.call(performance) * 1e-3; + var seconds = Math.floor(clocktime); + var nanoseconds = Math.floor(clocktime % 1 * 1e9); + + if (previousTimestamp) { + seconds = seconds - previousTimestamp[0]; + nanoseconds = nanoseconds - previousTimestamp[1]; + + if (nanoseconds < 0) { + seconds--; + nanoseconds += 1e9; + } + } + + return [seconds, nanoseconds]; +} +var startTime = new Date(); +function uptime() { + var currentTime = new Date(); + var dif = currentTime - startTime; + return dif / 1000; +} +var process = { + nextTick: nextTick, + title: title, + browser: browser, + env: env, + argv: argv, + version: version, + versions: versions, + on: on, + addListener: addListener, + once: once, + off: off, + removeListener: removeListener, + removeAllListeners: removeAllListeners, + emit: emit, + binding: binding, + cwd: cwd, + chdir: chdir, + umask: umask, + hrtime: hrtime, + platform: platform, + release: release, + config: config, + uptime: uptime +}; + +var inherits; + +if (typeof Object.create === 'function') { + inherits = function inherits(ctor, superCtor) { + // implementation from standard node.js 'util' module + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + inherits = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + + var TempCtor = function TempCtor() {}; + + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + }; +} + +var inherits$1 = inherits; + +var formatRegExp = /%[sdj%]/g; +function format(f) { + if (!isString(f)) { + var objects = []; + + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[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; +} +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. + +function deprecate(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global$1.process)) { + return function () { + return 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; +function debuglog(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 = 0; + + debugs[set] = function () { + var msg = format.apply(null, 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 + _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); +} // 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 "\x1B[" + inspect.colors[style][0] + 'm' + str + "\x1B[" + 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 !== 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 length = output.reduce(function (prev, cur) { + if (cur.indexOf('\n') >= 0) ; + 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); +} +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +function isNull(arg) { + return arg === null; +} +function isNullOrUndefined(arg) { + return arg == null; +} +function isNumber(arg) { + return typeof arg === 'number'; +} +function isString(arg) { + return typeof arg === 'string'; +} +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +function isUndefined(arg) { + return arg === void 0; +} +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +function isError(e) { + return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); +} +function isFunction(arg) { + return typeof arg === 'function'; +} +function isPrimitive(arg) { + return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +function isBuffer(maybeBuf) { + return buffer_1.isBuffer(maybeBuf); +} + +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 + + +function log() { + console.log('%s - %s', timestamp(), format.apply(null, arguments)); +} +function _extend(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 require$$3 = { + inherits: inherits$1, + _extend: _extend, + log: log, + isBuffer: isBuffer, + isPrimitive: isPrimitive, + isFunction: isFunction, + isError: isError, + isDate: isDate, + isObject: isObject, + isRegExp: isRegExp, + isUndefined: isUndefined, + isSymbol: isSymbol, + isString: isString, + isNumber: isNumber, + isNullOrUndefined: isNullOrUndefined, + isNull: isNull, + isBoolean: isBoolean, + isArray: isArray, + inspect: inspect, + deprecate: deprecate, + format: format, + debuglog: debuglog +}; + +function BufferList() { + this.head = null; + this.tail = null; + this.length = 0; +} + +BufferList.prototype.push = function (v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; +}; + +BufferList.prototype.unshift = function (v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; +}; + +BufferList.prototype.shift = function () { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; +}; + +BufferList.prototype.clear = function () { + this.head = this.tail = null; + this.length = 0; +}; + +BufferList.prototype.join = function (s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + + while (p = p.next) { + ret += s + p.data; + } + + return ret; +}; + +BufferList.prototype.concat = function (n) { + if (this.length === 0) return buffer_1.alloc(0); + if (this.length === 1) return this.head.data; + var ret = buffer_1.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + + while (p) { + p.data.copy(ret, i); + i += p.data.length; + p = p.next; + } + + return ret; +}; + +var string_decoder = 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 Buffer = buffer.Buffer; + + var isBufferEncoding = Buffer.isEncoding || function (encoding) { + switch (encoding && encoding.toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + case 'raw': + return true; + + default: + return false; + } + }; + + function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error('Unknown encoding: ' + encoding); + } + } // StringDecoder provides an interface for efficiently splitting a series of + // buffers into a series of JS strings without breaking apart multi-byte + // characters. CESU-8 is handled as part of the UTF-8 encoding. + // + // @TODO Handling all encodings inside a single object makes it very difficult + // to reason about this code, so it should be split up in the future. + // @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code + // points as used by CESU-8. + + + var StringDecoder = exports.StringDecoder = function (encoding) { + this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); + assertEncoding(encoding); + + switch (this.encoding) { + case 'utf8': + // CESU-8 represents each of Surrogate Pair by 3-bytes + this.surrogateSize = 3; + break; + + case 'ucs2': + case 'utf16le': + // UTF-16 represents each of Surrogate Pair by 2-bytes + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; + + case 'base64': + // Base-64 stores 3 bytes in 4 chars, and pads the remainder. + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; + + default: + this.write = passThroughWrite; + return; + } // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). + + + this.charBuffer = new Buffer(6); // Number of bytes received for the current incomplete multi-byte character. + + this.charReceived = 0; // Number of bytes expected for the current incomplete multi-byte character. + + this.charLength = 0; + }; // write decodes the given buffer and returns it as JS string that is + // guaranteed to not contain any partial multi-byte characters. Any partial + // character found at the end of the buffer is buffered up, and will be + // returned when calling write again with the remaining bytes. + // + // Note: Converting a Buffer containing an orphan surrogate to a String + // currently works, but converting a String to a Buffer (via `new Buffer`, or + // Buffer#write) will replace incomplete surrogates with the unicode + // replacement character. See https://codereview.chromium.org/121173009/ . + + + StringDecoder.prototype.write = function (buffer) { + var charStr = ''; // if our last write ended with an incomplete multibyte character + + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = buffer.length >= this.charLength - this.charReceived ? this.charLength - this.charReceived : buffer.length; // add the new bytes to the char buffer + + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; + } // remove bytes belonging to the current character from the buffer + + + buffer = buffer.slice(available, buffer.length); // get the character that was split + + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + + var charCode = charStr.charCodeAt(charStr.length - 1); + + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; + } + + this.charReceived = this.charLength = 0; // if there are no more bytes in this buffer, just emit our char + + if (buffer.length === 0) { + return charStr; + } + + break; + } // determine and set charLength / charReceived + + + this.detectIncompleteChar(buffer); + var end = buffer.length; + + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } + + charStr += buffer.toString(this.encoding, 0, end); + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } // or just emit the charStr + + + return charStr; + }; // detectIncompleteChar determines if there is an incomplete UTF-8 character at + // the end of the given buffer. If so, it sets this.charLength to the byte + // length that character, and sets this.charReceived to the number of bytes + // that are available for this character. + + + StringDecoder.prototype.detectIncompleteChar = function (buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = buffer.length >= 3 ? 3 : buffer.length; // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; // See http://en.wikipedia.org/wiki/UTF-8#Description + // 110XXXXX + + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } // 1110XXXX + + + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } // 11110XXX + + + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; + } + } + + this.charReceived = i; + }; + + StringDecoder.prototype.end = function (buffer) { + var res = ''; + if (buffer && buffer.length) res = this.write(buffer); + + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; + }; + + function passThroughWrite(buffer) { + return buffer.toString(this.encoding); + } + + function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; + } + + function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; + } +}); +var string_decoder_1 = string_decoder.StringDecoder; + +Readable.ReadableState = ReadableState; +var debug = debuglog('stream'); +inherits$1(Readable, EventEmitter); + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') { + return emitter.prependListener(event, fn); + } else { + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; + } +} + +function listenerCount$1(emitter, type) { + return emitter.listeners(type).length; +} + +function ReadableState(options, stream) { + options = options || {}; // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + + this.objectMode = !!options.objectMode; + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. + + this.highWaterMark = ~~this.highWaterMark; // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + + this.sync = true; // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + + this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + + this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s + + this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled + + this.readingMore = false; + this.decoder = null; + this.encoding = null; + + if (options.encoding) { + this.decoder = new string_decoder_1(options.encoding); + this.encoding = options.encoding; + } +} +function Readable(options) { + if (!(this instanceof Readable)) return new Readable(options); + this._readableState = new ReadableState(options, this); // legacy + + this.readable = true; + if (options && typeof options.read === 'function') this._read = options.read; + EventEmitter.call(this); +} // Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. + +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + + if (!state.objectMode && typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + + if (encoding !== state.encoding) { + chunk = buffer_1.from(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); +}; // Unshift should *always* be something directly out of read() + + +Readable.prototype.unshift = function (chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); +}; + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + + if (er) { + stream.emit('error', er); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var _e = new Error('stream.unshift() after end event'); + + stream.emit('error', _e); + } else { + var skipAdd; + + if (state.decoder && !addToFront && !encoding) { + chunk = state.decoder.write(chunk); + skipAdd = !state.objectMode && chunk.length === 0; + } + + if (!addToFront) state.reading = false; // Don't add to the buffer if we've decoded to an empty string chunk and + // we're not in object mode + + if (!skipAdd) { + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + if (state.needReadable) emitReadable(stream); + } + } + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); +} // if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. + + +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} // backwards compatibility. + + +Readable.prototype.setEncoding = function (enc) { + this._readableState.decoder = new string_decoder_1(enc); + this._readableState.encoding = enc; + return this; +}; // Don't raise the hwm > 8MB + + +var MAX_HWM = 0x800000; + +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + + return n; +} // This function is designed to be inlinable, so please take care when making +// changes to the function body. + + +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } // If we're asking for more than the current hwm, then raise the hwm. + + + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; // Don't have enough + + if (!state.ended) { + state.needReadable = true; + return 0; + } + + return state.length; +} // you can override either this method, or the async _read(n) below. + + +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. + + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + // if we need a readable event, then we need to do some reading. + + + var doRead = state.needReadable; + debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some + + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + + + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; // if the length is currently zero, then we *need* a readable event. + + if (state.length === 0) state.needReadable = true; // call internal read method + + this._read(state.highWaterMark); + + state.sync = false; // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. + + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + return ret; +}; + +function chunkInvalid(state, chunk) { + var er = null; + + if (!buffer_1.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + + return er; +} + +function onEofChunk(stream, state) { + if (state.ended) return; + + if (state.decoder) { + var chunk = state.decoder.end(); + + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + + state.ended = true; // emit 'readable' now to make sure it gets picked up. + + emitReadable(stream); +} // Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. + + +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} // at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. + + +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) // didn't get any data, stop spinning. + break;else len = state.length; + } + + state.readingMore = false; +} // abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. + + +Readable.prototype._read = function (n) { + this.emit('error', new Error('not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + + case 1: + state.pipes = [state.pipes, dest]; + break; + + default: + state.pipes.push(dest); + break; + } + + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + var doEnd = !pipeOpts || pipeOpts.end !== false; + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) nextTick(endFn);else src.once('end', endFn); + dest.on('unpipe', onunpipe); + + function onunpipe(readable) { + debug('onunpipe'); + + if (readable === src) { + cleanup(); + } + } + + function onend() { + debug('onend'); + dest.end(); + } // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + + + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + var cleanedUp = false; + + function cleanup() { + debug('cleanup'); // cleanup event handlers once the pipe is broken + + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); + cleanedUp = true; // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + + + var increasedAwaitDrain = false; + src.on('data', ondata); + + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + + src.pause(); + } + } // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + + + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (listenerCount$1(dest, 'error') === 0) dest.emit('error', er); + } // Make sure our error handler is attached before userland ones. + + + prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. + + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + + dest.once('close', onclose); + + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } // tell the dest that it's being piped to + + + dest.emit('pipe', src); // start the flow if it hasn't been started already. + + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + + if (state.awaitDrain === 0 && src.listeners('data').length) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; // if we're not piping anywhere, then do nothing. + + if (state.pipesCount === 0) return this; // just one destination. most common case. + + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + if (!dest) dest = state.pipes; // got a match. + + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this); + return this; + } // slow case. multiple pipe destinations. + + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var _i = 0; _i < len; _i++) { + dests[_i].emit('unpipe', this); + } + + return this; + } // try to find the right one. + + + var i = indexOf(state.pipes, dest); + if (i === -1) return this; + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + dest.emit('unpipe', this); + return this; +}; // set up data events if they are asked for +// Ensure readable listeners eventually get something + + +Readable.prototype.on = function (ev, fn) { + var res = EventEmitter.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + + if (!state.reading) { + nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; + +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} // pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. + + +Readable.prototype.resume = function () { + var state = this._readableState; + + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + + while (state.flowing && stream.read() !== null) {} +} // wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. + + +Readable.prototype.wrap = function (stream) { + var state = this._readableState; + var paused = false; + var self = this; + stream.on('end', function () { + debug('wrapped end'); + + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) self.push(chunk); + } + + self.push(null); + }); + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode + + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + var ret = self.push(chunk); + + if (!ret) { + paused = true; + stream.pause(); + } + }); // proxy all the other methods. + // important when wrapping filters and duplexes. + + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } // proxy certain important events. + + + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function (ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); // when we try to consume some more bytes, simply unpause the + // underlying stream. + + self._read = function (n) { + debug('wrapped _read', n); + + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; +}; // exposed for testing purposes only. + + +Readable._fromList = fromList; // Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. + +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + return ret; +} // Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. + + +function fromListPartial(n, list, hasStrings) { + var ret; + + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + + return ret; +} // Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. + + +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + + break; + } + + ++c; + } + + list.length -= c; + return ret; +} // Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. + + +function copyFromBuffer(n, list) { + var ret = buffer_1.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + + break; + } + + ++c; + } + + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + + return -1; +} + +// A bit simpler than readable streams. +Writable.WritableState = WritableState; +inherits$1(Writable, EventEmitter); + +function nop() {} + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +function WritableState(options, stream) { + Object.defineProperty(this, 'buffer', { + get: deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') + }); + options = options || {}; // object stream flag to indicate whether or not this stream + // contains buffers or objects. + + this.objectMode = !!options.objectMode; + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. + + this.highWaterMark = ~~this.highWaterMark; + this.needDrain = false; // at the start of calling end() + + this.ending = false; // when end() has been called, and returned + + this.ended = false; // when 'finish' is emitted + + this.finished = false; // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + + this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + + this.length = 0; // a flag to see when we're in the middle of a write. + + this.writing = false; // when true all writes will be buffered until .uncork() call + + this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + + this.sync = true; // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + + this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) + + this.onwrite = function (er) { + onwrite(stream, er); + }; // the callback that the user supplies to write(chunk,encoding,cb) + + + this.writecb = null; // the amount that is being written when _write is called. + + this.writelen = 0; + this.bufferedRequest = null; + this.lastBufferedRequest = null; // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + + this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + + this.prefinished = false; // True if the error was already emitted and should not be thrown again + + this.errorEmitted = false; // count buffered requests + + this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function writableStateGetBuffer() { + var current = this.bufferedRequest; + var out = []; + + while (current) { + out.push(current); + current = current.next; + } + + return out; +}; +function Writable(options) { + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); + this._writableState = new WritableState(options, this); // legacy. + + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + if (typeof options.writev === 'function') this._writev = options.writev; + } + + EventEmitter.call(this); +} // Otherwise people can pipe Writable streams, which is just wrong. + +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb + + stream.emit('error', er); + nextTick(cb, er); +} // If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. + + +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; // Always throw error if a null is written + // if we are not in object mode then throw + // if it is not a buffer, string, or undefined. + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (!buffer_1.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + + if (er) { + stream.emit('error', er); + nextTick(cb, er); + valid = false; + } + + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (buffer_1.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + if (typeof cb !== 'function') cb = nop; + if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = buffer_1.from(chunk, encoding); + } + + return chunk; +} // if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. + + +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + if (buffer_1.isBuffer(chunk)) encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + state.length += len; + var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. + + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); + + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + if (sync) nextTick(cb, er);else cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + onwriteStateUpdate(state); + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + nextTick(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} // Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. + + +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} // if there's something in the buffer waiting, then process it + + +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + var count = 0; + + while (entry) { + buffer[count] = entry; + entry = entry.next; + count += 1; + } + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + + state.pendingcb++; + state.lastBufferedRequest = null; + + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequestCount = 0; + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks + + if (state.corked) { + state.corked = 1; + this.uncork(); + } // ignore unnecessary end() calls. + + + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} + +function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else { + prefinish(stream, state); + } + } + + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + + if (cb) { + if (state.finished) nextTick(cb);else stream.once('finish', cb); + } + + state.ended = true; + stream.writable = false; +} // It seems a linked list but it is not +// there will be only 2 of these for each stream + + +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function (err) { + var entry = _this.entry; + _this.entry = null; + + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = _this; + } else { + state.corkedRequestsFree = _this; + } + }; +} + +inherits$1(Duplex, Readable); +var keys = Object.keys(Writable.prototype); + +for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; +} +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + Readable.call(this, options); + Writable.call(this, options); + if (options && options.readable === false) this.readable = false; + if (options && options.writable === false) this.writable = false; + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + this.once('end', onend); +} // the no-half-open enforcer + +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written. + // But allow more writes to happen in this tick. + + nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +// a transform stream is a readable/writable stream where you do +inherits$1(Transform, Duplex); + +function TransformState(stream) { + this.afterTransform = function (er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; + this.writeencoding = null; +} + +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + var cb = ts.writecb; + if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); + ts.writechunk = null; + ts.writecb = null; + if (data !== null && data !== undefined) stream.push(data); + cb(er); + var rs = stream._readableState; + rs.reading = false; + + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } +} +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + Duplex.call(this, options); + this._transformState = new TransformState(this); // when the writable side finishes, then flush out anything remaining. + + var stream = this; // start out asking for a readable event once data is transformed. + + this._readableState.needReadable = true; // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + if (typeof options.flush === 'function') this._flush = options.flush; + } + + this.once('prefinish', function () { + if (typeof this._flush === 'function') this._flush(function (er) { + done(stream, er); + });else done(stream); + }); +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; // This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. + + +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('Not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; // Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. + + +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +function done(stream, er) { + if (er) return stream.emit('error', er); // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + + var ws = stream._writableState; + var ts = stream._transformState; + if (ws.length) throw new Error('Calling transform done when ws.length != 0'); + if (ts.transforming) throw new Error('Calling transform done when still transforming'); + return stream.push(null); +} + +inherits$1(PassThrough, Transform); +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; + +inherits$1(Stream, EventEmitter); +Stream.Readable = Readable; +Stream.Writable = Writable; +Stream.Duplex = Duplex; +Stream.Transform = Transform; +Stream.PassThrough = PassThrough; // Backwards-compat with node 0.4.x + +Stream.Stream = Stream; +// part of this class) is overridden in the Readable class. + +function Stream() { + EventEmitter.call(this); +} + +Stream.prototype.pipe = function (dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + + function onend() { + if (didOnEnd) return; + didOnEnd = true; + dest.end(); + } + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + if (typeof dest.destroy === 'function') dest.destroy(); + } // don't leave dangling pipes when there are errors. + + + function onerror(er) { + cleanup(); + + if (EventEmitter.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); // remove all the event listeners that were added. + + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + source.removeListener('end', onend); + source.removeListener('close', onclose); + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + dest.on('close', cleanup); + dest.emit('pipe', source); // Allow for unix-like usage: A.pipe(B).pipe(C) + + return dest; +}; + +var Buffer = buffer.Buffer; +var safer = {}; +var key; + +for (key in buffer) { + if (!buffer.hasOwnProperty(key)) continue; + if (key === 'SlowBuffer' || key === 'Buffer') continue; + safer[key] = buffer[key]; +} + +var Safer = safer.Buffer = {}; + +for (key in Buffer) { + if (!Buffer.hasOwnProperty(key)) continue; + if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue; + Safer[key] = Buffer[key]; +} + +safer.Buffer.prototype = Buffer.prototype; + +if (!Safer.from || Safer.from === Uint8Array.from) { + Safer.from = function (value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value); + } + + if (value && typeof value.length === 'undefined') { + throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value); + } + + return Buffer(value, encodingOrOffset, length); + }; +} + +if (!Safer.alloc) { + Safer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size); + } + + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"'); + } + + var buf = Buffer(size); + + if (!fill || fill.length === 0) { + buf.fill(0); + } else if (typeof encoding === 'string') { + buf.fill(fill, encoding); + } else { + buf.fill(fill); + } + + return buf; + }; +} + +if (!safer.kStringMaxLength) { + try { + safer.kStringMaxLength = process.binding('buffer').kStringMaxLength; + } catch (e) {// we can't determine kStringMaxLength in environments where process.binding + // is unsupported, so let's not set it + } +} + +if (!safer.constants) { + safer.constants = { + MAX_LENGTH: safer.kMaxLength + }; + + if (safer.kStringMaxLength) { + safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength; + } +} + +var safer_1 = safer; + +var BOMChar = "\uFEFF"; +var PrependBOM = PrependBOMWrapper; + +function PrependBOMWrapper(encoder, options) { + this.encoder = encoder; + this.addBOM = true; +} + +PrependBOMWrapper.prototype.write = function (str) { + if (this.addBOM) { + str = BOMChar + str; + this.addBOM = false; + } + + return this.encoder.write(str); +}; + +PrependBOMWrapper.prototype.end = function () { + return this.encoder.end(); +}; //------------------------------------------------------------------------------ + + +var StripBOM = StripBOMWrapper; + +function StripBOMWrapper(decoder, options) { + this.decoder = decoder; + this.pass = false; + this.options = options || {}; +} + +StripBOMWrapper.prototype.write = function (buf) { + var res = this.decoder.write(buf); + if (this.pass || !res) return res; + + if (res[0] === BOMChar) { + res = res.slice(1); + if (typeof this.options.stripBOM === 'function') this.options.stripBOM(); + } + + this.pass = true; + return res; +}; + +StripBOMWrapper.prototype.end = function () { + return this.decoder.end(); +}; + +var bomHandling = { + PrependBOM: PrependBOM, + StripBOM: StripBOM +}; + +var Buffer$1 = safer_1.Buffer; // Export Node.js internal encodings. + +var internal = { + // Encodings + utf8: { + type: "_internal", + bomAware: true + }, + cesu8: { + type: "_internal", + bomAware: true + }, + unicode11utf8: "utf8", + ucs2: { + type: "_internal", + bomAware: true + }, + utf16le: "ucs2", + binary: { + type: "_internal" + }, + base64: { + type: "_internal" + }, + hex: { + type: "_internal" + }, + // Codec. + _internal: InternalCodec +}; //------------------------------------------------------------------------------ + +function InternalCodec(codecOptions, iconv) { + this.enc = codecOptions.encodingName; + this.bomAware = codecOptions.bomAware; + if (this.enc === "base64") this.encoder = InternalEncoderBase64;else if (this.enc === "cesu8") { + this.enc = "utf8"; // Use utf8 for decoding. + + this.encoder = InternalEncoderCesu8; // Add decoder for versions of Node not supporting CESU-8 + + if (Buffer$1.from('eda0bdedb2a9', 'hex').toString() !== '💩') { + this.decoder = InternalDecoderCesu8; + this.defaultCharUnicode = iconv.defaultCharUnicode; + } + } +} + +InternalCodec.prototype.encoder = InternalEncoder; +InternalCodec.prototype.decoder = InternalDecoder; //------------------------------------------------------------------------------ +// We use node.js internal decoder. Its signature is the same as ours. + +var StringDecoder = string_decoder.StringDecoder; +if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method. + StringDecoder.prototype.end = function () {}; + +function InternalDecoder(options, codec) { + StringDecoder.call(this, codec.enc); +} + +InternalDecoder.prototype = StringDecoder.prototype; //------------------------------------------------------------------------------ +// Encoder is mostly trivial + +function InternalEncoder(options, codec) { + this.enc = codec.enc; +} + +InternalEncoder.prototype.write = function (str) { + return Buffer$1.from(str, this.enc); +}; + +InternalEncoder.prototype.end = function () {}; //------------------------------------------------------------------------------ +// Except base64 encoder, which must keep its state. + + +function InternalEncoderBase64(options, codec) { + this.prevStr = ''; +} + +InternalEncoderBase64.prototype.write = function (str) { + str = this.prevStr + str; + var completeQuads = str.length - str.length % 4; + this.prevStr = str.slice(completeQuads); + str = str.slice(0, completeQuads); + return Buffer$1.from(str, "base64"); +}; + +InternalEncoderBase64.prototype.end = function () { + return Buffer$1.from(this.prevStr, "base64"); +}; //------------------------------------------------------------------------------ +// CESU-8 encoder is also special. + + +function InternalEncoderCesu8(options, codec) {} + +InternalEncoderCesu8.prototype.write = function (str) { + var buf = Buffer$1.alloc(str.length * 3), + bufIdx = 0; + + for (var i = 0; i < str.length; i++) { + var charCode = str.charCodeAt(i); // Naive implementation, but it works because CESU-8 is especially easy + // to convert from UTF-16 (which all JS strings are encoded in). + + if (charCode < 0x80) buf[bufIdx++] = charCode;else if (charCode < 0x800) { + buf[bufIdx++] = 0xC0 + (charCode >>> 6); + buf[bufIdx++] = 0x80 + (charCode & 0x3f); + } else { + // charCode will always be < 0x10000 in javascript. + buf[bufIdx++] = 0xE0 + (charCode >>> 12); + buf[bufIdx++] = 0x80 + (charCode >>> 6 & 0x3f); + buf[bufIdx++] = 0x80 + (charCode & 0x3f); + } + } + + return buf.slice(0, bufIdx); +}; + +InternalEncoderCesu8.prototype.end = function () {}; //------------------------------------------------------------------------------ +// CESU-8 decoder is not implemented in Node v4.0+ + + +function InternalDecoderCesu8(options, codec) { + this.acc = 0; + this.contBytes = 0; + this.accBytes = 0; + this.defaultCharUnicode = codec.defaultCharUnicode; +} + +InternalDecoderCesu8.prototype.write = function (buf) { + var acc = this.acc, + contBytes = this.contBytes, + accBytes = this.accBytes, + res = ''; + + for (var i = 0; i < buf.length; i++) { + var curByte = buf[i]; + + if ((curByte & 0xC0) !== 0x80) { + // Leading byte + if (contBytes > 0) { + // Previous code is invalid + res += this.defaultCharUnicode; + contBytes = 0; + } + + if (curByte < 0x80) { + // Single-byte code + res += String.fromCharCode(curByte); + } else if (curByte < 0xE0) { + // Two-byte code + acc = curByte & 0x1F; + contBytes = 1; + accBytes = 1; + } else if (curByte < 0xF0) { + // Three-byte code + acc = curByte & 0x0F; + contBytes = 2; + accBytes = 1; + } else { + // Four or more are not supported for CESU-8. + res += this.defaultCharUnicode; + } + } else { + // Continuation byte + if (contBytes > 0) { + // We're waiting for it. + acc = acc << 6 | curByte & 0x3f; + contBytes--; + accBytes++; + + if (contBytes === 0) { + // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80) + if (accBytes === 2 && acc < 0x80 && acc > 0) res += this.defaultCharUnicode;else if (accBytes === 3 && acc < 0x800) res += this.defaultCharUnicode;else // Actually add character. + res += String.fromCharCode(acc); + } + } else { + // Unexpected continuation byte + res += this.defaultCharUnicode; + } + } + } + + this.acc = acc; + this.contBytes = contBytes; + this.accBytes = accBytes; + return res; +}; + +InternalDecoderCesu8.prototype.end = function () { + var res = 0; + if (this.contBytes > 0) res += this.defaultCharUnicode; + return res; +}; + +var Buffer$2 = safer_1.Buffer; // Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js +// == UTF16-BE codec. ========================================================== + +var utf16be = Utf16BECodec; + +function Utf16BECodec() {} + +Utf16BECodec.prototype.encoder = Utf16BEEncoder; +Utf16BECodec.prototype.decoder = Utf16BEDecoder; +Utf16BECodec.prototype.bomAware = true; // -- Encoding + +function Utf16BEEncoder() {} + +Utf16BEEncoder.prototype.write = function (str) { + var buf = Buffer$2.from(str, 'ucs2'); + + for (var i = 0; i < buf.length; i += 2) { + var tmp = buf[i]; + buf[i] = buf[i + 1]; + buf[i + 1] = tmp; + } + + return buf; +}; + +Utf16BEEncoder.prototype.end = function () {}; // -- Decoding + + +function Utf16BEDecoder() { + this.overflowByte = -1; +} + +Utf16BEDecoder.prototype.write = function (buf) { + if (buf.length == 0) return ''; + var buf2 = Buffer$2.alloc(buf.length + 1), + i = 0, + j = 0; + + if (this.overflowByte !== -1) { + buf2[0] = buf[0]; + buf2[1] = this.overflowByte; + i = 1; + j = 2; + } + + for (; i < buf.length - 1; i += 2, j += 2) { + buf2[j] = buf[i + 1]; + buf2[j + 1] = buf[i]; + } + + this.overflowByte = i == buf.length - 1 ? buf[buf.length - 1] : -1; + return buf2.slice(0, j).toString('ucs2'); +}; + +Utf16BEDecoder.prototype.end = function () {}; // == UTF-16 codec ============================================================= +// Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic. +// Defaults to UTF-16LE, as it's prevalent and default in Node. +// http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le +// Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'}); +// Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false). + + +var utf16_1 = Utf16Codec; + +function Utf16Codec(codecOptions, iconv) { + this.iconv = iconv; +} + +Utf16Codec.prototype.encoder = Utf16Encoder; +Utf16Codec.prototype.decoder = Utf16Decoder; // -- Encoding (pass-through) + +function Utf16Encoder(options, codec) { + options = options || {}; + if (options.addBOM === undefined) options.addBOM = true; + this.encoder = codec.iconv.getEncoder('utf-16le', options); +} + +Utf16Encoder.prototype.write = function (str) { + return this.encoder.write(str); +}; + +Utf16Encoder.prototype.end = function () { + return this.encoder.end(); +}; // -- Decoding + + +function Utf16Decoder(options, codec) { + this.decoder = null; + this.initialBytes = []; + this.initialBytesLen = 0; + this.options = options || {}; + this.iconv = codec.iconv; +} + +Utf16Decoder.prototype.write = function (buf) { + if (!this.decoder) { + // Codec is not chosen yet. Accumulate initial bytes. + this.initialBytes.push(buf); + this.initialBytesLen += buf.length; + if (this.initialBytesLen < 16) // We need more bytes to use space heuristic (see below) + return ''; // We have enough bytes -> detect endianness. + + var buf = Buffer$2.concat(this.initialBytes), + encoding = detectEncoding(buf, this.options.defaultEncoding); + this.decoder = this.iconv.getDecoder(encoding, this.options); + this.initialBytes.length = this.initialBytesLen = 0; + } + + return this.decoder.write(buf); +}; + +Utf16Decoder.prototype.end = function () { + if (!this.decoder) { + var buf = Buffer$2.concat(this.initialBytes), + encoding = detectEncoding(buf, this.options.defaultEncoding); + this.decoder = this.iconv.getDecoder(encoding, this.options); + var res = this.decoder.write(buf), + trail = this.decoder.end(); + return trail ? res + trail : res; + } + + return this.decoder.end(); +}; + +function detectEncoding(buf, defaultEncoding) { + var enc = defaultEncoding || 'utf-16le'; + + if (buf.length >= 2) { + // Check BOM. + if (buf[0] == 0xFE && buf[1] == 0xFF) // UTF-16BE BOM + enc = 'utf-16be';else if (buf[0] == 0xFF && buf[1] == 0xFE) // UTF-16LE BOM + enc = 'utf-16le';else { + // No BOM found. Try to deduce encoding from initial content. + // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon. + // So, we count ASCII as if it was LE or BE, and decide from that. + var asciiCharsLE = 0, + asciiCharsBE = 0, + // Counts of chars in both positions + _len = Math.min(buf.length - buf.length % 2, 64); // Len is always even. + + + for (var i = 0; i < _len; i += 2) { + if (buf[i] === 0 && buf[i + 1] !== 0) asciiCharsBE++; + if (buf[i] !== 0 && buf[i + 1] === 0) asciiCharsLE++; + } + + if (asciiCharsBE > asciiCharsLE) enc = 'utf-16be';else if (asciiCharsBE < asciiCharsLE) enc = 'utf-16le'; + } + } + + return enc; +} + +var utf16 = { + utf16be: utf16be, + utf16: utf16_1 +}; + +var Buffer$3 = safer_1.Buffer; // UTF-7 codec, according to https://tools.ietf.org/html/rfc2152 +// See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3 + +var utf7_1 = Utf7Codec; +var unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7 + +function Utf7Codec(codecOptions, iconv) { + this.iconv = iconv; +} +Utf7Codec.prototype.encoder = Utf7Encoder; +Utf7Codec.prototype.decoder = Utf7Decoder; +Utf7Codec.prototype.bomAware = true; // -- Encoding + +var nonDirectChars = /[^A-Za-z0-9'\(\),-\.\/:\? \n\r\t]+/g; + +function Utf7Encoder(options, codec) { + this.iconv = codec.iconv; +} + +Utf7Encoder.prototype.write = function (str) { + // Naive implementation. + // Non-direct chars are encoded as "+-"; single "+" char is encoded as "+-". + return Buffer$3.from(str.replace(nonDirectChars, function (chunk) { + return "+" + (chunk === '+' ? '' : this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, '')) + "-"; + }.bind(this))); +}; + +Utf7Encoder.prototype.end = function () {}; // -- Decoding + + +function Utf7Decoder(options, codec) { + this.iconv = codec.iconv; + this.inBase64 = false; + this.base64Accum = ''; +} + +var base64Regex = /[A-Za-z0-9\/+]/; +var base64Chars = []; + +for (var i$1 = 0; i$1 < 256; i$1++) { + base64Chars[i$1] = base64Regex.test(String.fromCharCode(i$1)); +} + +var plusChar = '+'.charCodeAt(0), + minusChar = '-'.charCodeAt(0), + andChar = '&'.charCodeAt(0); + +Utf7Decoder.prototype.write = function (buf) { + var res = "", + lastI = 0, + inBase64 = this.inBase64, + base64Accum = this.base64Accum; // The decoder is more involved as we must handle chunks in stream. + + for (var i = 0; i < buf.length; i++) { + if (!inBase64) { + // We're in direct mode. + // Write direct chars until '+' + if (buf[i] == plusChar) { + res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars. + + lastI = i + 1; + inBase64 = true; + } + } else { + // We decode base64. + if (!base64Chars[buf[i]]) { + // Base64 ended. + if (i == lastI && buf[i] == minusChar) { + // "+-" -> "+" + res += "+"; + } else { + var b64str = base64Accum + buf.slice(lastI, i).toString(); + res += this.iconv.decode(Buffer$3.from(b64str, 'base64'), "utf16-be"); + } + + if (buf[i] != minusChar) // Minus is absorbed after base64. + i--; + lastI = i + 1; + inBase64 = false; + base64Accum = ''; + } + } + } + + if (!inBase64) { + res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars. + } else { + var b64str = base64Accum + buf.slice(lastI).toString(); + var canBeDecoded = b64str.length - b64str.length % 8; // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars. + + base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future. + + b64str = b64str.slice(0, canBeDecoded); + res += this.iconv.decode(Buffer$3.from(b64str, 'base64'), "utf16-be"); + } + + this.inBase64 = inBase64; + this.base64Accum = base64Accum; + return res; +}; + +Utf7Decoder.prototype.end = function () { + var res = ""; + if (this.inBase64 && this.base64Accum.length > 0) res = this.iconv.decode(Buffer$3.from(this.base64Accum, 'base64'), "utf16-be"); + this.inBase64 = false; + this.base64Accum = ''; + return res; +}; // UTF-7-IMAP codec. +// RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3) +// Differences: +// * Base64 part is started by "&" instead of "+" +// * Direct characters are 0x20-0x7E, except "&" (0x26) +// * In Base64, "," is used instead of "/" +// * Base64 must not be used to represent direct characters. +// * No implicit shift back from Base64 (should always end with '-') +// * String must end in non-shifted position. +// * "-&" while in base64 is not allowed. + + +var utf7imap = Utf7IMAPCodec; + +function Utf7IMAPCodec(codecOptions, iconv) { + this.iconv = iconv; +} +Utf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder; +Utf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder; +Utf7IMAPCodec.prototype.bomAware = true; // -- Encoding + +function Utf7IMAPEncoder(options, codec) { + this.iconv = codec.iconv; + this.inBase64 = false; + this.base64Accum = Buffer$3.alloc(6); + this.base64AccumIdx = 0; +} + +Utf7IMAPEncoder.prototype.write = function (str) { + var inBase64 = this.inBase64, + base64Accum = this.base64Accum, + base64AccumIdx = this.base64AccumIdx, + buf = Buffer$3.alloc(str.length * 5 + 10), + bufIdx = 0; + + for (var i = 0; i < str.length; i++) { + var uChar = str.charCodeAt(i); + + if (0x20 <= uChar && uChar <= 0x7E) { + // Direct character or '&'. + if (inBase64) { + if (base64AccumIdx > 0) { + bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx); + base64AccumIdx = 0; + } + + buf[bufIdx++] = minusChar; // Write '-', then go to direct mode. + + inBase64 = false; + } + + if (!inBase64) { + buf[bufIdx++] = uChar; // Write direct character + + if (uChar === andChar) // Ampersand -> '&-' + buf[bufIdx++] = minusChar; + } + } else { + // Non-direct character + if (!inBase64) { + buf[bufIdx++] = andChar; // Write '&', then go to base64 mode. + + inBase64 = true; + } + + if (inBase64) { + base64Accum[base64AccumIdx++] = uChar >> 8; + base64Accum[base64AccumIdx++] = uChar & 0xFF; + + if (base64AccumIdx == base64Accum.length) { + bufIdx += buf.write(base64Accum.toString('base64').replace(/\//g, ','), bufIdx); + base64AccumIdx = 0; + } + } + } + } + + this.inBase64 = inBase64; + this.base64AccumIdx = base64AccumIdx; + return buf.slice(0, bufIdx); +}; + +Utf7IMAPEncoder.prototype.end = function () { + var buf = Buffer$3.alloc(10), + bufIdx = 0; + + if (this.inBase64) { + if (this.base64AccumIdx > 0) { + bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx); + this.base64AccumIdx = 0; + } + + buf[bufIdx++] = minusChar; // Write '-', then go to direct mode. + + this.inBase64 = false; + } + + return buf.slice(0, bufIdx); +}; // -- Decoding + + +function Utf7IMAPDecoder(options, codec) { + this.iconv = codec.iconv; + this.inBase64 = false; + this.base64Accum = ''; +} + +var base64IMAPChars = base64Chars.slice(); +base64IMAPChars[','.charCodeAt(0)] = true; + +Utf7IMAPDecoder.prototype.write = function (buf) { + var res = "", + lastI = 0, + inBase64 = this.inBase64, + base64Accum = this.base64Accum; // The decoder is more involved as we must handle chunks in stream. + // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end). + + for (var i = 0; i < buf.length; i++) { + if (!inBase64) { + // We're in direct mode. + // Write direct chars until '&' + if (buf[i] == andChar) { + res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars. + + lastI = i + 1; + inBase64 = true; + } + } else { + // We decode base64. + if (!base64IMAPChars[buf[i]]) { + // Base64 ended. + if (i == lastI && buf[i] == minusChar) { + // "&-" -> "&" + res += "&"; + } else { + var b64str = base64Accum + buf.slice(lastI, i).toString().replace(/,/g, '/'); + res += this.iconv.decode(Buffer$3.from(b64str, 'base64'), "utf16-be"); + } + + if (buf[i] != minusChar) // Minus may be absorbed after base64. + i--; + lastI = i + 1; + inBase64 = false; + base64Accum = ''; + } + } + } + + if (!inBase64) { + res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars. + } else { + var b64str = base64Accum + buf.slice(lastI).toString().replace(/,/g, '/'); + var canBeDecoded = b64str.length - b64str.length % 8; // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars. + + base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future. + + b64str = b64str.slice(0, canBeDecoded); + res += this.iconv.decode(Buffer$3.from(b64str, 'base64'), "utf16-be"); + } + + this.inBase64 = inBase64; + this.base64Accum = base64Accum; + return res; +}; + +Utf7IMAPDecoder.prototype.end = function () { + var res = ""; + if (this.inBase64 && this.base64Accum.length > 0) res = this.iconv.decode(Buffer$3.from(this.base64Accum, 'base64'), "utf16-be"); + this.inBase64 = false; + this.base64Accum = ''; + return res; +}; + +var utf7 = { + utf7: utf7_1, + unicode11utf7: unicode11utf7, + utf7imap: utf7imap +}; + +var Buffer$4 = safer_1.Buffer; // Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that +// correspond to encoded bytes (if 128 - then lower half is ASCII). + +var _sbcs = SBCSCodec; + +function SBCSCodec(codecOptions, iconv) { + if (!codecOptions) throw new Error("SBCS codec is called without the data."); // Prepare char buffer for decoding. + + if (!codecOptions.chars || codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256) throw new Error("Encoding '" + codecOptions.type + "' has incorrect 'chars' (must be of len 128 or 256)"); + + if (codecOptions.chars.length === 128) { + var asciiString = ""; + + for (var i = 0; i < 128; i++) { + asciiString += String.fromCharCode(i); + } + + codecOptions.chars = asciiString + codecOptions.chars; + } + + this.decodeBuf = Buffer$4.from(codecOptions.chars, 'ucs2'); // Encoding buffer. + + var encodeBuf = Buffer$4.alloc(65536, iconv.defaultCharSingleByte.charCodeAt(0)); + + for (var i = 0; i < codecOptions.chars.length; i++) { + encodeBuf[codecOptions.chars.charCodeAt(i)] = i; + } + + this.encodeBuf = encodeBuf; +} + +SBCSCodec.prototype.encoder = SBCSEncoder; +SBCSCodec.prototype.decoder = SBCSDecoder; + +function SBCSEncoder(options, codec) { + this.encodeBuf = codec.encodeBuf; +} + +SBCSEncoder.prototype.write = function (str) { + var buf = Buffer$4.alloc(str.length); + + for (var i = 0; i < str.length; i++) { + buf[i] = this.encodeBuf[str.charCodeAt(i)]; + } + + return buf; +}; + +SBCSEncoder.prototype.end = function () {}; + +function SBCSDecoder(options, codec) { + this.decodeBuf = codec.decodeBuf; +} + +SBCSDecoder.prototype.write = function (buf) { + // Strings are immutable in JS -> we use ucs2 buffer to speed up computations. + var decodeBuf = this.decodeBuf; + var newBuf = Buffer$4.alloc(buf.length * 2); + var idx1 = 0, + idx2 = 0; + + for (var i = 0; i < buf.length; i++) { + idx1 = buf[i] * 2; + idx2 = i * 2; + newBuf[idx2] = decodeBuf[idx1]; + newBuf[idx2 + 1] = decodeBuf[idx1 + 1]; + } + + return newBuf.toString('ucs2'); +}; + +SBCSDecoder.prototype.end = function () {}; + +var sbcsCodec = { + _sbcs: _sbcs +}; + +var sbcsData = { + // Not supported by iconv, not sure why. + "10029": "maccenteuro", + "maccenteuro": { + "type": "_sbcs", + "chars": "ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ" + }, + "808": "cp808", + "ibm808": "cp808", + "cp808": { + "type": "_sbcs", + "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№€■ " + }, + "mik": { + "type": "_sbcs", + "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя└┴┬├─┼╣║╚╔╩╦╠═╬┐░▒▓│┤№§╗╝┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " + }, + // Aliases of generated encodings. + "ascii8bit": "ascii", + "usascii": "ascii", + "ansix34": "ascii", + "ansix341968": "ascii", + "ansix341986": "ascii", + "csascii": "ascii", + "cp367": "ascii", + "ibm367": "ascii", + "isoir6": "ascii", + "iso646us": "ascii", + "iso646irv": "ascii", + "us": "ascii", + "latin1": "iso88591", + "latin2": "iso88592", + "latin3": "iso88593", + "latin4": "iso88594", + "latin5": "iso88599", + "latin6": "iso885910", + "latin7": "iso885913", + "latin8": "iso885914", + "latin9": "iso885915", + "latin10": "iso885916", + "csisolatin1": "iso88591", + "csisolatin2": "iso88592", + "csisolatin3": "iso88593", + "csisolatin4": "iso88594", + "csisolatincyrillic": "iso88595", + "csisolatinarabic": "iso88596", + "csisolatingreek": "iso88597", + "csisolatinhebrew": "iso88598", + "csisolatin5": "iso88599", + "csisolatin6": "iso885910", + "l1": "iso88591", + "l2": "iso88592", + "l3": "iso88593", + "l4": "iso88594", + "l5": "iso88599", + "l6": "iso885910", + "l7": "iso885913", + "l8": "iso885914", + "l9": "iso885915", + "l10": "iso885916", + "isoir14": "iso646jp", + "isoir57": "iso646cn", + "isoir100": "iso88591", + "isoir101": "iso88592", + "isoir109": "iso88593", + "isoir110": "iso88594", + "isoir144": "iso88595", + "isoir127": "iso88596", + "isoir126": "iso88597", + "isoir138": "iso88598", + "isoir148": "iso88599", + "isoir157": "iso885910", + "isoir166": "tis620", + "isoir179": "iso885913", + "isoir199": "iso885914", + "isoir203": "iso885915", + "isoir226": "iso885916", + "cp819": "iso88591", + "ibm819": "iso88591", + "cyrillic": "iso88595", + "arabic": "iso88596", + "arabic8": "iso88596", + "ecma114": "iso88596", + "asmo708": "iso88596", + "greek": "iso88597", + "greek8": "iso88597", + "ecma118": "iso88597", + "elot928": "iso88597", + "hebrew": "iso88598", + "hebrew8": "iso88598", + "turkish": "iso88599", + "turkish8": "iso88599", + "thai": "iso885911", + "thai8": "iso885911", + "celtic": "iso885914", + "celtic8": "iso885914", + "isoceltic": "iso885914", + "tis6200": "tis620", + "tis62025291": "tis620", + "tis62025330": "tis620", + "10000": "macroman", + "10006": "macgreek", + "10007": "maccyrillic", + "10079": "maciceland", + "10081": "macturkish", + "cspc8codepage437": "cp437", + "cspc775baltic": "cp775", + "cspc850multilingual": "cp850", + "cspcp852": "cp852", + "cspc862latinhebrew": "cp862", + "cpgr": "cp869", + "msee": "cp1250", + "mscyrl": "cp1251", + "msansi": "cp1252", + "msgreek": "cp1253", + "msturk": "cp1254", + "mshebr": "cp1255", + "msarab": "cp1256", + "winbaltrim": "cp1257", + "cp20866": "koi8r", + "20866": "koi8r", + "ibm878": "koi8r", + "cskoi8r": "koi8r", + "cp21866": "koi8u", + "21866": "koi8u", + "ibm1168": "koi8u", + "strk10482002": "rk1048", + "tcvn5712": "tcvn", + "tcvn57121": "tcvn", + "gb198880": "iso646cn", + "cn": "iso646cn", + "csiso14jisc6220ro": "iso646jp", + "jisc62201969ro": "iso646jp", + "jp": "iso646jp", + "cshproman8": "hproman8", + "r8": "hproman8", + "roman8": "hproman8", + "xroman8": "hproman8", + "ibm1051": "hproman8", + "mac": "macintosh", + "csmacintosh": "macintosh" +}; + +var sbcsDataGenerated = { + "437": "cp437", + "737": "cp737", + "775": "cp775", + "850": "cp850", + "852": "cp852", + "855": "cp855", + "856": "cp856", + "857": "cp857", + "858": "cp858", + "860": "cp860", + "861": "cp861", + "862": "cp862", + "863": "cp863", + "864": "cp864", + "865": "cp865", + "866": "cp866", + "869": "cp869", + "874": "windows874", + "922": "cp922", + "1046": "cp1046", + "1124": "cp1124", + "1125": "cp1125", + "1129": "cp1129", + "1133": "cp1133", + "1161": "cp1161", + "1162": "cp1162", + "1163": "cp1163", + "1250": "windows1250", + "1251": "windows1251", + "1252": "windows1252", + "1253": "windows1253", + "1254": "windows1254", + "1255": "windows1255", + "1256": "windows1256", + "1257": "windows1257", + "1258": "windows1258", + "28591": "iso88591", + "28592": "iso88592", + "28593": "iso88593", + "28594": "iso88594", + "28595": "iso88595", + "28596": "iso88596", + "28597": "iso88597", + "28598": "iso88598", + "28599": "iso88599", + "28600": "iso885910", + "28601": "iso885911", + "28603": "iso885913", + "28604": "iso885914", + "28605": "iso885915", + "28606": "iso885916", + "windows874": { + "type": "_sbcs", + "chars": "€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����" + }, + "win874": "windows874", + "cp874": "windows874", + "windows1250": { + "type": "_sbcs", + "chars": "€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙" + }, + "win1250": "windows1250", + "cp1250": "windows1250", + "windows1251": { + "type": "_sbcs", + "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя" + }, + "win1251": "windows1251", + "cp1251": "windows1251", + "windows1252": { + "type": "_sbcs", + "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + }, + "win1252": "windows1252", + "cp1252": "windows1252", + "windows1253": { + "type": "_sbcs", + "chars": "€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�" + }, + "win1253": "windows1253", + "cp1253": "windows1253", + "windows1254": { + "type": "_sbcs", + "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ" + }, + "win1254": "windows1254", + "cp1254": "windows1254", + "windows1255": { + "type": "_sbcs", + "chars": "€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�" + }, + "win1255": "windows1255", + "cp1255": "windows1255", + "windows1256": { + "type": "_sbcs", + "chars": "€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے" + }, + "win1256": "windows1256", + "cp1256": "windows1256", + "windows1257": { + "type": "_sbcs", + "chars": "€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙" + }, + "win1257": "windows1257", + "cp1257": "windows1257", + "windows1258": { + "type": "_sbcs", + "chars": "€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ" + }, + "win1258": "windows1258", + "cp1258": "windows1258", + "iso88591": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + }, + "cp28591": "iso88591", + "iso88592": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙" + }, + "cp28592": "iso88592", + "iso88593": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ħ˘£¤�Ĥ§¨İŞĞĴ­�ݰħ²³´µĥ·¸ışğĵ½�żÀÁÂ�ÄĊĈÇÈÉÊËÌÍÎÏ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ĝùúûüŭŝ˙" + }, + "cp28593": "iso88593", + "iso88594": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄĸŖ¤Ĩϧ¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩšēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖרŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙" + }, + "cp28594": "iso88594", + "iso88595": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ" + }, + "cp28595": "iso88595", + "iso88596": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـفقكلمنهوىيًٌٍَُِّْ�������������" + }, + "cp28596": "iso88596", + "iso88597": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�" + }, + "cp28597": "iso88597", + "iso88598": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�" + }, + "cp28598": "iso88598", + "iso88599": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ" + }, + "cp28599": "iso88599", + "iso885910": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄĒĢĪĨͧĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ" + }, + "cp28600": "iso885910", + "iso885911": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����" + }, + "cp28601": "iso885911", + "iso885913": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’" + }, + "cp28603": "iso885913", + "iso885914": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ" + }, + "cp28604": "iso885914", + "iso885915": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + }, + "cp28605": "iso885915", + "iso885916": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄąŁ€„Чš©Ș«Ź­źŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ" + }, + "cp28606": "iso885916", + "cp437": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " + }, + "ibm437": "cp437", + "csibm437": "cp437", + "cp737": { + "type": "_sbcs", + "chars": "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ " + }, + "ibm737": "cp737", + "csibm737": "cp737", + "cp775": { + "type": "_sbcs", + "chars": "ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£Ø×¤ĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ " + }, + "ibm775": "cp775", + "csibm775": "cp775", + "cp850": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ " + }, + "ibm850": "cp850", + "csibm850": "cp850", + "cp852": { + "type": "_sbcs", + "chars": "ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ " + }, + "ibm852": "cp852", + "csibm852": "cp852", + "cp855": { + "type": "_sbcs", + "chars": "ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№­ыЫзЗшШэЭщЩчЧ§■ " + }, + "ibm855": "cp855", + "csibm855": "cp855", + "cp856": { + "type": "_sbcs", + "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת�£�×����������®¬½¼�«»░▒▓│┤���©╣║╗╝¢¥┐└┴┬├─┼��╚╔╩╦╠═╬¤���������┘┌█▄¦�▀������µ�������¯´­±‗¾¶§÷¸°¨·¹³²■ " + }, + "ibm856": "cp856", + "csibm856": "cp856", + "cp857": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ " + }, + "ibm857": "cp857", + "csibm857": "cp857", + "cp858": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ " + }, + "ibm858": "cp858", + "csibm858": "cp858", + "cp860": { + "type": "_sbcs", + "chars": "ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñѪº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " + }, + "ibm860": "cp860", + "csibm860": "cp860", + "cp861": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " + }, + "ibm861": "cp861", + "csibm861": "cp861", + "cp862": { + "type": "_sbcs", + "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " + }, + "ibm862": "cp862", + "csibm862": "cp862", + "cp863": { + "type": "_sbcs", + "chars": "ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " + }, + "ibm863": "cp863", + "csibm863": "cp863", + "cp864": { + "type": "_sbcs", + "chars": "\0\x01\x02\x03\x04\x05\x06\x07\b\t\n\x0B\f\r\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F !\"#$\u066A&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F\xB0\xB7\u2219\u221A\u2592\u2500\u2502\u253C\u2524\u252C\u251C\u2534\u2510\u250C\u2514\u2518\u03B2\u221E\u03C6\xB1\xBD\xBC\u2248\xAB\xBB\uFEF7\uFEF8\uFFFD\uFFFD\uFEFB\uFEFC\uFFFD\xA0\xAD\uFE82\xA3\xA4\uFE84\uFFFD\uFFFD\uFE8E\uFE8F\uFE95\uFE99\u060C\uFE9D\uFEA1\uFEA5\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\uFED1\u061B\uFEB1\uFEB5\uFEB9\u061F\xA2\uFE80\uFE81\uFE83\uFE85\uFECA\uFE8B\uFE8D\uFE91\uFE93\uFE97\uFE9B\uFE9F\uFEA3\uFEA7\uFEA9\uFEAB\uFEAD\uFEAF\uFEB3\uFEB7\uFEBB\uFEBF\uFEC1\uFEC5\uFECB\uFECF\xA6\xAC\xF7\xD7\uFEC9\u0640\uFED3\uFED7\uFEDB\uFEDF\uFEE3\uFEE7\uFEEB\uFEED\uFEEF\uFEF3\uFEBD\uFECC\uFECE\uFECD\uFEE1\uFE7D\u0651\uFEE5\uFEE9\uFEEC\uFEF0\uFEF2\uFED0\uFED5\uFEF5\uFEF6\uFEDD\uFED9\uFEF1\u25A0\uFFFD" + }, + "ibm864": "cp864", + "csibm864": "cp864", + "cp865": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " + }, + "ibm865": "cp865", + "csibm865": "cp865", + "cp866": { + "type": "_sbcs", + "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ " + }, + "ibm866": "cp866", + "csibm866": "cp866", + "cp869": { + "type": "_sbcs", + "chars": "������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ " + }, + "ibm869": "cp869", + "csibm869": "cp869", + "cp922": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŠÑÒÓÔÕÖרÙÚÛÜÝŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ" + }, + "ibm922": "cp922", + "csibm922": "cp922", + "cp1046": { + "type": "_sbcs", + "chars": "ﺈ×÷ﹱˆ■│─┐┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎﻏﻐﻶﻸﻺﻼ ¤ﺋﺑﺗﺛﺟﺣ،­ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـفقكلمنهوىيًٌٍَُِّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ�" + }, + "ibm1046": "cp1046", + "csibm1046": "cp1046", + "cp1124": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂҐЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђґєѕіїјљњћќ§ўџ" + }, + "ibm1124": "cp1124", + "csibm1124": "cp1124", + "cp1125": { + "type": "_sbcs", + "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёҐґЄєІіЇї·√№¤■ " + }, + "ibm1125": "cp1125", + "csibm1125": "cp1125", + "cp1129": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ" + }, + "ibm1129": "cp1129", + "csibm1129": "cp1129", + "cp1133": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ກຂຄງຈສຊຍດຕຖທນບປຜຝພຟມຢຣລວຫອຮ���ຯະາຳິີຶືຸູຼັົຽ���ເແໂໃໄ່້໊໋໌ໍໆ�ໜໝ₭����������������໐໑໒໓໔໕໖໗໘໙��¢¬¦�" + }, + "ibm1133": "cp1133", + "csibm1133": "cp1133", + "cp1161": { + "type": "_sbcs", + "chars": "��������������������������������่กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู้๊๋€฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛¢¬¦ " + }, + "ibm1161": "cp1161", + "csibm1161": "cp1161", + "cp1162": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����" + }, + "ibm1162": "cp1162", + "csibm1162": "cp1162", + "cp1163": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£€¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ" + }, + "ibm1163": "cp1163", + "csibm1163": "cp1163", + "maccroatian": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈ƫȅ ÀÃÕŒœĐ—“”‘’÷◊�©⁄¤‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ" + }, + "maccyrillic": { + "type": "_sbcs", + "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤" + }, + "macgreek": { + "type": "_sbcs", + "chars": "Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�" + }, + "maciceland": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ" + }, + "macroman": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ" + }, + "macromania": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑∏π∫ªºΩăş¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›Ţţ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ" + }, + "macthai": { + "type": "_sbcs", + "chars": "«»…“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู​–—฿เแโใไๅๆ็่้๊๋์ํ™๏๐๑๒๓๔๕๖๗๘๙®©����" + }, + "macturkish": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ" + }, + "macukraine": { + "type": "_sbcs", + "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤" + }, + "koi8r": { + "type": "_sbcs", + "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ" + }, + "koi8u": { + "type": "_sbcs", + "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ" + }, + "koi8ru": { + "type": "_sbcs", + "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ" + }, + "koi8t": { + "type": "_sbcs", + "chars": "қғ‚Ғ„…†‡�‰ҳ‹ҲҷҶ�Қ‘’“”•–—�™�›�����ӯӮё¤ӣ¦§���«¬­®�°±²Ё�Ӣ¶·�№�»���©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ" + }, + "armscii8": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ �և։)(»«—.՝,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհՁձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռՍսՎվՏտՐրՑցՒւՓփՔքՕօՖֆ՚�" + }, + "rk1048": { + "type": "_sbcs", + "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺЏђ‘’“”•–—�™љ›њқһџ ҰұӘ¤Ө¦§Ё©Ғ«¬­®Ү°±Ііөµ¶·ё№ғ»әҢңүАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя" + }, + "tcvn": { + "type": "_sbcs", + "chars": "\0\xDA\u1EE4\x03\u1EEA\u1EEC\u1EEE\x07\b\t\n\x0B\f\r\x0E\x0F\x10\u1EE8\u1EF0\u1EF2\u1EF6\u1EF8\xDD\u1EF4\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F\xC0\u1EA2\xC3\xC1\u1EA0\u1EB6\u1EAC\xC8\u1EBA\u1EBC\xC9\u1EB8\u1EC6\xCC\u1EC8\u0128\xCD\u1ECA\xD2\u1ECE\xD5\xD3\u1ECC\u1ED8\u1EDC\u1EDE\u1EE0\u1EDA\u1EE2\xD9\u1EE6\u0168\xA0\u0102\xC2\xCA\xD4\u01A0\u01AF\u0110\u0103\xE2\xEA\xF4\u01A1\u01B0\u0111\u1EB0\u0300\u0309\u0303\u0301\u0323\xE0\u1EA3\xE3\xE1\u1EA1\u1EB2\u1EB1\u1EB3\u1EB5\u1EAF\u1EB4\u1EAE\u1EA6\u1EA8\u1EAA\u1EA4\u1EC0\u1EB7\u1EA7\u1EA9\u1EAB\u1EA5\u1EAD\xE8\u1EC2\u1EBB\u1EBD\xE9\u1EB9\u1EC1\u1EC3\u1EC5\u1EBF\u1EC7\xEC\u1EC9\u1EC4\u1EBE\u1ED2\u0129\xED\u1ECB\xF2\u1ED4\u1ECF\xF5\xF3\u1ECD\u1ED3\u1ED5\u1ED7\u1ED1\u1ED9\u1EDD\u1EDF\u1EE1\u1EDB\u1EE3\xF9\u1ED6\u1EE7\u0169\xFA\u1EE5\u1EEB\u1EED\u1EEF\u1EE9\u1EF1\u1EF3\u1EF7\u1EF9\xFD\u1EF5\u1ED0" + }, + "georgianacademy": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + }, + "georgianps": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზჱთიკლმნჲოპჟრსტჳუფქღყშჩცძწჭხჴჯჰჵæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + }, + "pt154": { + "type": "_sbcs", + "chars": "ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“”•–—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ё©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫҝАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя" + }, + "viscii": { + "type": "_sbcs", + "chars": "\0\x01\u1EB2\x03\x04\u1EB4\u1EAA\x07\b\t\n\x0B\f\r\x0E\x0F\x10\x11\x12\x13\u1EF6\x15\x16\x17\x18\u1EF8\x1A\x1B\x1C\x1D\u1EF4\x1F !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F\u1EA0\u1EAE\u1EB0\u1EB6\u1EA4\u1EA6\u1EA8\u1EAC\u1EBC\u1EB8\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EE2\u1EDA\u1EDC\u1EDE\u1ECA\u1ECE\u1ECC\u1EC8\u1EE6\u0168\u1EE4\u1EF2\xD5\u1EAF\u1EB1\u1EB7\u1EA5\u1EA7\u1EA9\u1EAD\u1EBD\u1EB9\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1ED1\u1ED3\u1ED5\u1ED7\u1EE0\u01A0\u1ED9\u1EDD\u1EDF\u1ECB\u1EF0\u1EE8\u1EEA\u1EEC\u01A1\u1EDB\u01AF\xC0\xC1\xC2\xC3\u1EA2\u0102\u1EB3\u1EB5\xC8\xC9\xCA\u1EBA\xCC\xCD\u0128\u1EF3\u0110\u1EE9\xD2\xD3\xD4\u1EA1\u1EF7\u1EEB\u1EED\xD9\xDA\u1EF9\u1EF5\xDD\u1EE1\u01B0\xE0\xE1\xE2\xE3\u1EA3\u0103\u1EEF\u1EAB\xE8\xE9\xEA\u1EBB\xEC\xED\u0129\u1EC9\u0111\u1EF1\xF2\xF3\xF4\xF5\u1ECF\u1ECD\u1EE5\xF9\xFA\u0169\u1EE7\xFD\u1EE3\u1EEE" + }, + "iso646cn": { + "type": "_sbcs", + "chars": "\0\x01\x02\x03\x04\x05\x06\x07\b\t\n\x0B\f\r\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F !\"#\xA5%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}\u203E\x7F\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + }, + "iso646jp": { + "type": "_sbcs", + "chars": "\0\x01\x02\x03\x04\x05\x06\x07\b\t\n\x0B\f\r\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\xA5]^_`abcdefghijklmnopqrstuvwxyz{|}\u203E\x7F\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD" + }, + "hproman8": { + "type": "_sbcs", + "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ÀÂÈÊËÎÏ´ˋˆ¨˜ÙÛ₤¯Ýý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÁÃãÐðÍÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±�" + }, + "macintosh": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ" + }, + "ascii": { + "type": "_sbcs", + "chars": "��������������������������������������������������������������������������������������������������������������������������������" + }, + "tis620": { + "type": "_sbcs", + "chars": "���������������������������������กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����" + } +}; + +var Buffer$5 = safer_1.Buffer; // Multibyte codec. In this scheme, a character is represented by 1 or more bytes. +// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences. +// To save memory and loading time, we read table files only when requested. + +var _dbcs = DBCSCodec; +var UNASSIGNED = -1, + GB18030_CODE = -2, + SEQ_START = -10, + NODE_START = -1000, + UNASSIGNED_NODE = new Array(0x100), + DEF_CHAR = -1; + +for (var i$2 = 0; i$2 < 0x100; i$2++) { + UNASSIGNED_NODE[i$2] = UNASSIGNED; +} // Class DBCSCodec reads and initializes mapping tables. + + +function DBCSCodec(codecOptions, iconv) { + this.encodingName = codecOptions.encodingName; + if (!codecOptions) throw new Error("DBCS codec is called without the data."); + if (!codecOptions.table) throw new Error("Encoding '" + this.encodingName + "' has no data."); // Load tables. + + var mappingTable = codecOptions.table(); // Decode tables: MBCS -> Unicode. + // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256. + // Trie root is decodeTables[0]. + // Values: >= 0 -> unicode character code. can be > 0xFFFF + // == UNASSIGNED -> unknown/unassigned sequence. + // == GB18030_CODE -> this is the end of a GB18030 4-byte sequence. + // <= NODE_START -> index of the next node in our trie to process next byte. + // <= SEQ_START -> index of the start of a character code sequence, in decodeTableSeq. + + this.decodeTables = []; + this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node. + // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here. + + this.decodeTableSeq = []; // Actual mapping tables consist of chunks. Use them to fill up decode tables. + + for (var i = 0; i < mappingTable.length; i++) { + this._addDecodeChunk(mappingTable[i]); + } + + this.defaultCharUnicode = iconv.defaultCharUnicode; // Encode tables: Unicode -> DBCS. + // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance. + // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null. + // Values: >= 0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.). + // == UNASSIGNED -> no conversion found. Output a default char. + // <= SEQ_START -> it's an index in encodeTableSeq, see below. The character starts a sequence. + + this.encodeTable = []; // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of + // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key + // means end of sequence (needed when one sequence is a strict subsequence of another). + // Objects are kept separately from encodeTable to increase performance. + + this.encodeTableSeq = []; // Some chars can be decoded, but need not be encoded. + + var skipEncodeChars = {}; + if (codecOptions.encodeSkipVals) for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) { + var val = codecOptions.encodeSkipVals[i]; + if (typeof val === 'number') skipEncodeChars[val] = true;else for (var j = val.from; j <= val.to; j++) { + skipEncodeChars[j] = true; + } + } // Use decode trie to recursively fill out encode tables. + + this._fillEncodeTable(0, 0, skipEncodeChars); // Add more encoding pairs when needed. + + + if (codecOptions.encodeAdd) { + for (var uChar in codecOptions.encodeAdd) { + if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar)) this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]); + } + } + + this.defCharSB = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)]; + if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?']; + if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0); // Load & create GB18030 tables when needed. + + if (typeof codecOptions.gb18030 === 'function') { + this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges. + // Add GB18030 decode tables. + + var thirdByteNodeIdx = this.decodeTables.length; + var thirdByteNode = this.decodeTables[thirdByteNodeIdx] = UNASSIGNED_NODE.slice(0); + var fourthByteNodeIdx = this.decodeTables.length; + var fourthByteNode = this.decodeTables[fourthByteNodeIdx] = UNASSIGNED_NODE.slice(0); + + for (var i = 0x81; i <= 0xFE; i++) { + var secondByteNodeIdx = NODE_START - this.decodeTables[0][i]; + var secondByteNode = this.decodeTables[secondByteNodeIdx]; + + for (var j = 0x30; j <= 0x39; j++) { + secondByteNode[j] = NODE_START - thirdByteNodeIdx; + } + } + + for (var i = 0x81; i <= 0xFE; i++) { + thirdByteNode[i] = NODE_START - fourthByteNodeIdx; + } + + for (var i = 0x30; i <= 0x39; i++) { + fourthByteNode[i] = GB18030_CODE; + } + } +} + +DBCSCodec.prototype.encoder = DBCSEncoder; +DBCSCodec.prototype.decoder = DBCSDecoder; // Decoder helpers + +DBCSCodec.prototype._getDecodeTrieNode = function (addr) { + var bytes = []; + + for (; addr > 0; addr >>= 8) { + bytes.push(addr & 0xFF); + } + + if (bytes.length == 0) bytes.push(0); + var node = this.decodeTables[0]; + + for (var i = bytes.length - 1; i > 0; i--) { + // Traverse nodes deeper into the trie. + var val = node[bytes[i]]; + + if (val == UNASSIGNED) { + // Create new node. + node[bytes[i]] = NODE_START - this.decodeTables.length; + this.decodeTables.push(node = UNASSIGNED_NODE.slice(0)); + } else if (val <= NODE_START) { + // Existing node. + node = this.decodeTables[NODE_START - val]; + } else throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16)); + } + + return node; +}; + +DBCSCodec.prototype._addDecodeChunk = function (chunk) { + // First element of chunk is the hex mbcs code where we start. + var curAddr = parseInt(chunk[0], 16); // Choose the decoding node where we'll write our chars. + + var writeTable = this._getDecodeTrieNode(curAddr); + + curAddr = curAddr & 0xFF; // Write all other elements of the chunk to the table. + + for (var k = 1; k < chunk.length; k++) { + var part = chunk[k]; + + if (typeof part === "string") { + // String, write as-is. + for (var l = 0; l < part.length;) { + var code = part.charCodeAt(l++); + + if (0xD800 <= code && code < 0xDC00) { + // Decode surrogate + var codeTrail = part.charCodeAt(l++); + if (0xDC00 <= codeTrail && codeTrail < 0xE000) writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00);else throw new Error("Incorrect surrogate pair in " + this.encodingName + " at chunk " + chunk[0]); + } else if (0x0FF0 < code && code <= 0x0FFF) { + // Character sequence (our own encoding used) + var len = 0xFFF - code + 2; + var seq = []; + + for (var m = 0; m < len; m++) { + seq.push(part.charCodeAt(l++)); + } // Simple variation: don't support surrogates or subsequences in seq. + + + writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length; + this.decodeTableSeq.push(seq); + } else writeTable[curAddr++] = code; // Basic char + + } + } else if (typeof part === "number") { + // Integer, meaning increasing sequence starting with prev character. + var charCode = writeTable[curAddr - 1] + 1; + + for (var l = 0; l < part; l++) { + writeTable[curAddr++] = charCode++; + } + } else throw new Error("Incorrect type '" + typeof part + "' given in " + this.encodingName + " at chunk " + chunk[0]); + } + + if (curAddr > 0xFF) throw new Error("Incorrect chunk in " + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr); +}; // Encoder helpers + + +DBCSCodec.prototype._getEncodeBucket = function (uCode) { + var high = uCode >> 8; // This could be > 0xFF because of astral characters. + + if (this.encodeTable[high] === undefined) this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand. + + return this.encodeTable[high]; +}; + +DBCSCodec.prototype._setEncodeChar = function (uCode, dbcsCode) { + var bucket = this._getEncodeBucket(uCode); + + var low = uCode & 0xFF; + if (bucket[low] <= SEQ_START) this.encodeTableSeq[SEQ_START - bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it. + else if (bucket[low] == UNASSIGNED) bucket[low] = dbcsCode; +}; + +DBCSCodec.prototype._setEncodeSequence = function (seq, dbcsCode) { + // Get the root of character tree according to first character of the sequence. + var uCode = seq[0]; + + var bucket = this._getEncodeBucket(uCode); + + var low = uCode & 0xFF; + var node; + + if (bucket[low] <= SEQ_START) { + // There's already a sequence with - use it. + node = this.encodeTableSeq[SEQ_START - bucket[low]]; + } else { + // There was no sequence object - allocate a new one. + node = {}; + if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence. + + bucket[low] = SEQ_START - this.encodeTableSeq.length; + this.encodeTableSeq.push(node); + } // Traverse the character tree, allocating new nodes as needed. + + + for (var j = 1; j < seq.length - 1; j++) { + var oldVal = node[uCode]; + if (typeof oldVal === 'object') node = oldVal;else { + node = node[uCode] = {}; + if (oldVal !== undefined) node[DEF_CHAR] = oldVal; + } + } // Set the leaf to given dbcsCode. + + + uCode = seq[seq.length - 1]; + node[uCode] = dbcsCode; +}; + +DBCSCodec.prototype._fillEncodeTable = function (nodeIdx, prefix, skipEncodeChars) { + var node = this.decodeTables[nodeIdx]; + + for (var i = 0; i < 0x100; i++) { + var uCode = node[i]; + var mbCode = prefix + i; + if (skipEncodeChars[mbCode]) continue; + if (uCode >= 0) this._setEncodeChar(uCode, mbCode);else if (uCode <= NODE_START) this._fillEncodeTable(NODE_START - uCode, mbCode << 8, skipEncodeChars);else if (uCode <= SEQ_START) this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode); + } +}; // == Encoder ================================================================== + + +function DBCSEncoder(options, codec) { + // Encoder state + this.leadSurrogate = -1; + this.seqObj = undefined; // Static data + + this.encodeTable = codec.encodeTable; + this.encodeTableSeq = codec.encodeTableSeq; + this.defaultCharSingleByte = codec.defCharSB; + this.gb18030 = codec.gb18030; +} + +DBCSEncoder.prototype.write = function (str) { + var newBuf = Buffer$5.alloc(str.length * (this.gb18030 ? 4 : 3)), + leadSurrogate = this.leadSurrogate, + seqObj = this.seqObj, + nextChar = -1, + i = 0, + j = 0; + + while (true) { + // 0. Get next character. + if (nextChar === -1) { + if (i == str.length) break; + var uCode = str.charCodeAt(i++); + } else { + var uCode = nextChar; + nextChar = -1; + } // 1. Handle surrogates. + + + if (0xD800 <= uCode && uCode < 0xE000) { + // Char is one of surrogates. + if (uCode < 0xDC00) { + // We've got lead surrogate. + if (leadSurrogate === -1) { + leadSurrogate = uCode; + continue; + } else { + leadSurrogate = uCode; // Double lead surrogate found. + + uCode = UNASSIGNED; + } + } else { + // We've got trail surrogate. + if (leadSurrogate !== -1) { + uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00); + leadSurrogate = -1; + } else { + // Incomplete surrogate pair - only trail surrogate found. + uCode = UNASSIGNED; + } + } + } else if (leadSurrogate !== -1) { + // Incomplete surrogate pair - only lead surrogate found. + nextChar = uCode; + uCode = UNASSIGNED; // Write an error, then current char. + + leadSurrogate = -1; + } // 2. Convert uCode character. + + + var dbcsCode = UNASSIGNED; + + if (seqObj !== undefined && uCode != UNASSIGNED) { + // We are in the middle of the sequence + var resCode = seqObj[uCode]; + + if (typeof resCode === 'object') { + // Sequence continues. + seqObj = resCode; + continue; + } else if (typeof resCode == 'number') { + // Sequence finished. Write it. + dbcsCode = resCode; + } else if (resCode == undefined) { + // Current character is not part of the sequence. + // Try default character for this sequence + resCode = seqObj[DEF_CHAR]; + + if (resCode !== undefined) { + dbcsCode = resCode; // Found. Write it. + + nextChar = uCode; // Current character will be written too in the next iteration. + } + } + + seqObj = undefined; + } else if (uCode >= 0) { + // Regular character + var subtable = this.encodeTable[uCode >> 8]; + if (subtable !== undefined) dbcsCode = subtable[uCode & 0xFF]; + + if (dbcsCode <= SEQ_START) { + // Sequence start + seqObj = this.encodeTableSeq[SEQ_START - dbcsCode]; + continue; + } + + if (dbcsCode == UNASSIGNED && this.gb18030) { + // Use GB18030 algorithm to find character(s) to write. + var idx = findIdx(this.gb18030.uChars, uCode); + + if (idx != -1) { + var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]); + newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); + dbcsCode = dbcsCode % 12600; + newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); + dbcsCode = dbcsCode % 1260; + newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); + dbcsCode = dbcsCode % 10; + newBuf[j++] = 0x30 + dbcsCode; + continue; + } + } + } // 3. Write dbcsCode character. + + + if (dbcsCode === UNASSIGNED) dbcsCode = this.defaultCharSingleByte; + + if (dbcsCode < 0x100) { + newBuf[j++] = dbcsCode; + } else if (dbcsCode < 0x10000) { + newBuf[j++] = dbcsCode >> 8; // high byte + + newBuf[j++] = dbcsCode & 0xFF; // low byte + } else { + newBuf[j++] = dbcsCode >> 16; + newBuf[j++] = dbcsCode >> 8 & 0xFF; + newBuf[j++] = dbcsCode & 0xFF; + } + } + + this.seqObj = seqObj; + this.leadSurrogate = leadSurrogate; + return newBuf.slice(0, j); +}; + +DBCSEncoder.prototype.end = function () { + if (this.leadSurrogate === -1 && this.seqObj === undefined) return; // All clean. Most often case. + + var newBuf = Buffer$5.alloc(10), + j = 0; + + if (this.seqObj) { + // We're in the sequence. + var dbcsCode = this.seqObj[DEF_CHAR]; + + if (dbcsCode !== undefined) { + // Write beginning of the sequence. + if (dbcsCode < 0x100) { + newBuf[j++] = dbcsCode; + } else { + newBuf[j++] = dbcsCode >> 8; // high byte + + newBuf[j++] = dbcsCode & 0xFF; // low byte + } + } + + this.seqObj = undefined; + } + + if (this.leadSurrogate !== -1) { + // Incomplete surrogate pair - only lead surrogate found. + newBuf[j++] = this.defaultCharSingleByte; + this.leadSurrogate = -1; + } + + return newBuf.slice(0, j); +}; // Export for testing + + +DBCSEncoder.prototype.findIdx = findIdx; // == Decoder ================================================================== + +function DBCSDecoder(options, codec) { + // Decoder state + this.nodeIdx = 0; + this.prevBuf = Buffer$5.alloc(0); // Static data + + this.decodeTables = codec.decodeTables; + this.decodeTableSeq = codec.decodeTableSeq; + this.defaultCharUnicode = codec.defaultCharUnicode; + this.gb18030 = codec.gb18030; +} + +DBCSDecoder.prototype.write = function (buf) { + var newBuf = Buffer$5.alloc(buf.length * 2), + nodeIdx = this.nodeIdx, + prevBuf = this.prevBuf, + prevBufOffset = this.prevBuf.length, + seqStart = -this.prevBuf.length, + // idx of the start of current parsed sequence. + uCode; + if (prevBufOffset > 0) // Make prev buf overlap a little to make it easier to slice later. + prevBuf = Buffer$5.concat([prevBuf, buf.slice(0, 10)]); + + for (var i = 0, j = 0; i < buf.length; i++) { + var curByte = i >= 0 ? buf[i] : prevBuf[i + prevBufOffset]; // Lookup in current trie node. + + var uCode = this.decodeTables[nodeIdx][curByte]; + + if (uCode >= 0) ; else if (uCode === UNASSIGNED) { + // Unknown char. + // TODO: Callback with seq. + //var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset); + i = seqStart; // Try to parse again, after skipping first byte of the sequence ('i' will be incremented by 'for' cycle). + + uCode = this.defaultCharUnicode.charCodeAt(0); + } else if (uCode === GB18030_CODE) { + var curSeq = seqStart >= 0 ? buf.slice(seqStart, i + 1) : prevBuf.slice(seqStart + prevBufOffset, i + 1 + prevBufOffset); + var ptr = (curSeq[0] - 0x81) * 12600 + (curSeq[1] - 0x30) * 1260 + (curSeq[2] - 0x81) * 10 + (curSeq[3] - 0x30); + var idx = findIdx(this.gb18030.gbChars, ptr); + uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx]; + } else if (uCode <= NODE_START) { + // Go to next trie node. + nodeIdx = NODE_START - uCode; + continue; + } else if (uCode <= SEQ_START) { + // Output a sequence of chars. + var seq = this.decodeTableSeq[SEQ_START - uCode]; + + for (var k = 0; k < seq.length - 1; k++) { + uCode = seq[k]; + newBuf[j++] = uCode & 0xFF; + newBuf[j++] = uCode >> 8; + } + + uCode = seq[seq.length - 1]; + } else throw new Error("iconv-lite internal error: invalid decoding table value " + uCode + " at " + nodeIdx + "/" + curByte); // Write the character to buffer, handling higher planes using surrogate pair. + + + if (uCode > 0xFFFF) { + uCode -= 0x10000; + var uCodeLead = 0xD800 + Math.floor(uCode / 0x400); + newBuf[j++] = uCodeLead & 0xFF; + newBuf[j++] = uCodeLead >> 8; + uCode = 0xDC00 + uCode % 0x400; + } + + newBuf[j++] = uCode & 0xFF; + newBuf[j++] = uCode >> 8; // Reset trie node. + + nodeIdx = 0; + seqStart = i + 1; + } + + this.nodeIdx = nodeIdx; + this.prevBuf = seqStart >= 0 ? buf.slice(seqStart) : prevBuf.slice(seqStart + prevBufOffset); + return newBuf.slice(0, j).toString('ucs2'); +}; + +DBCSDecoder.prototype.end = function () { + var ret = ''; // Try to parse all remaining chars. + + while (this.prevBuf.length > 0) { + // Skip 1 character in the buffer. + ret += this.defaultCharUnicode; + var buf = this.prevBuf.slice(1); // Parse remaining as usual. + + this.prevBuf = Buffer$5.alloc(0); + this.nodeIdx = 0; + if (buf.length > 0) ret += this.write(buf); + } + + this.nodeIdx = 0; + return ret; +}; // Binary search for GB18030. Returns largest i such that table[i] <= val. + + +function findIdx(table, val) { + if (table[0] > val) return -1; + var l = 0, + r = table.length; + + while (l < r - 1) { + // always table[l] <= val < table[r] + var mid = l + Math.floor((r - l + 1) / 2); + if (table[mid] <= val) l = mid;else r = mid; + } + + return l; +} + +var dbcsCodec = { + _dbcs: _dbcs +}; + +var shiftjis = [ + [ + "0", + "\u0000", + 128 + ], + [ + "a1", + "。", + 62 + ], + [ + "8140", + " 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈", + 9, + "+-±×" + ], + [ + "8180", + "÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓" + ], + [ + "81b8", + "∈∋⊆⊇⊂⊃∪∩" + ], + [ + "81c8", + "∧∨¬⇒⇔∀∃" + ], + [ + "81da", + "∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬" + ], + [ + "81f0", + "ʼn♯♭♪†‡¶" + ], + [ + "81fc", + "◯" + ], + [ + "824f", + "0", + 9 + ], + [ + "8260", + "A", + 25 + ], + [ + "8281", + "a", + 25 + ], + [ + "829f", + "ぁ", + 82 + ], + [ + "8340", + "ァ", + 62 + ], + [ + "8380", + "ム", + 22 + ], + [ + "839f", + "Α", + 16, + "Σ", + 6 + ], + [ + "83bf", + "α", + 16, + "σ", + 6 + ], + [ + "8440", + "А", + 5, + "ЁЖ", + 25 + ], + [ + "8470", + "а", + 5, + "ёж", + 7 + ], + [ + "8480", + "о", + 17 + ], + [ + "849f", + "─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂" + ], + [ + "8740", + "①", + 19, + "Ⅰ", + 9 + ], + [ + "875f", + "㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡" + ], + [ + "877e", + "㍻" + ], + [ + "8780", + "〝〟№㏍℡㊤", + 4, + "㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪" + ], + [ + "889f", + "亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭" + ], + [ + "8940", + "院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円" + ], + [ + "8980", + "園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改" + ], + [ + "8a40", + "魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫" + ], + [ + "8a80", + "橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄" + ], + [ + "8b40", + "機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救" + ], + [ + "8b80", + "朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈" + ], + [ + "8c40", + "掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨" + ], + [ + "8c80", + "劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向" + ], + [ + "8d40", + "后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降" + ], + [ + "8d80", + "項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷" + ], + [ + "8e40", + "察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止" + ], + [ + "8e80", + "死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周" + ], + [ + "8f40", + "宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳" + ], + [ + "8f80", + "準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾" + ], + [ + "9040", + "拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨" + ], + [ + "9080", + "逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線" + ], + [ + "9140", + "繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻" + ], + [ + "9180", + "操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只" + ], + [ + "9240", + "叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄" + ], + [ + "9280", + "逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓" + ], + [ + "9340", + "邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬" + ], + [ + "9380", + "凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入" + ], + [ + "9440", + "如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅" + ], + [ + "9480", + "楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美" + ], + [ + "9540", + "鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷" + ], + [ + "9580", + "斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋" + ], + [ + "9640", + "法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆" + ], + [ + "9680", + "摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒" + ], + [ + "9740", + "諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲" + ], + [ + "9780", + "沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯" + ], + [ + "9840", + "蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕" + ], + [ + "989f", + "弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲" + ], + [ + "9940", + "僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭" + ], + [ + "9980", + "凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨" + ], + [ + "9a40", + "咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸" + ], + [ + "9a80", + "噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩" + ], + [ + "9b40", + "奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀" + ], + [ + "9b80", + "它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏" + ], + [ + "9c40", + "廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠" + ], + [ + "9c80", + "怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛" + ], + [ + "9d40", + "戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫" + ], + [ + "9d80", + "捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼" + ], + [ + "9e40", + "曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎" + ], + [ + "9e80", + "梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣" + ], + [ + "9f40", + "檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯" + ], + [ + "9f80", + "麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌" + ], + [ + "e040", + "漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝" + ], + [ + "e080", + "烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱" + ], + [ + "e140", + "瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿" + ], + [ + "e180", + "痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬" + ], + [ + "e240", + "磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰" + ], + [ + "e280", + "窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆" + ], + [ + "e340", + "紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷" + ], + [ + "e380", + "縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋" + ], + [ + "e440", + "隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤" + ], + [ + "e480", + "艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈" + ], + [ + "e540", + "蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬" + ], + [ + "e580", + "蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞" + ], + [ + "e640", + "襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧" + ], + [ + "e680", + "諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊" + ], + [ + "e740", + "蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜" + ], + [ + "e780", + "轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮" + ], + [ + "e840", + "錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙" + ], + [ + "e880", + "閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰" + ], + [ + "e940", + "顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃" + ], + [ + "e980", + "騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈" + ], + [ + "ea40", + "鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯" + ], + [ + "ea80", + "黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙" + ], + [ + "ed40", + "纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏" + ], + [ + "ed80", + "塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱" + ], + [ + "ee40", + "犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙" + ], + [ + "ee80", + "蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑" + ], + [ + "eeef", + "ⅰ", + 9, + "¬¦'"" + ], + [ + "f040", + "", + 62 + ], + [ + "f080", + "", + 124 + ], + [ + "f140", + "", + 62 + ], + [ + "f180", + "", + 124 + ], + [ + "f240", + "", + 62 + ], + [ + "f280", + "", + 124 + ], + [ + "f340", + "", + 62 + ], + [ + "f380", + "", + 124 + ], + [ + "f440", + "", + 62 + ], + [ + "f480", + "", + 124 + ], + [ + "f540", + "", + 62 + ], + [ + "f580", + "", + 124 + ], + [ + "f640", + "", + 62 + ], + [ + "f680", + "", + 124 + ], + [ + "f740", + "", + 62 + ], + [ + "f780", + "", + 124 + ], + [ + "f840", + "", + 62 + ], + [ + "f880", + "", + 124 + ], + [ + "f940", + "" + ], + [ + "fa40", + "ⅰ", + 9, + "Ⅰ", + 9, + "¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊" + ], + [ + "fa80", + "兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯" + ], + [ + "fb40", + "涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神" + ], + [ + "fb80", + "祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙" + ], + [ + "fc40", + "髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑" + ] +]; + +var shiftjis$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': shiftjis +}); + +var eucjp = [ + [ + "0", + "\u0000", + 127 + ], + [ + "8ea1", + "。", + 62 + ], + [ + "a1a1", + " 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈", + 9, + "+-±×÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇" + ], + [ + "a2a1", + "◆□■△▲▽▼※〒→←↑↓〓" + ], + [ + "a2ba", + "∈∋⊆⊇⊂⊃∪∩" + ], + [ + "a2ca", + "∧∨¬⇒⇔∀∃" + ], + [ + "a2dc", + "∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬" + ], + [ + "a2f2", + "ʼn♯♭♪†‡¶" + ], + [ + "a2fe", + "◯" + ], + [ + "a3b0", + "0", + 9 + ], + [ + "a3c1", + "A", + 25 + ], + [ + "a3e1", + "a", + 25 + ], + [ + "a4a1", + "ぁ", + 82 + ], + [ + "a5a1", + "ァ", + 85 + ], + [ + "a6a1", + "Α", + 16, + "Σ", + 6 + ], + [ + "a6c1", + "α", + 16, + "σ", + 6 + ], + [ + "a7a1", + "А", + 5, + "ЁЖ", + 25 + ], + [ + "a7d1", + "а", + 5, + "ёж", + 25 + ], + [ + "a8a1", + "─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂" + ], + [ + "ada1", + "①", + 19, + "Ⅰ", + 9 + ], + [ + "adc0", + "㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡" + ], + [ + "addf", + "㍻〝〟№㏍℡㊤", + 4, + "㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪" + ], + [ + "b0a1", + "亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭" + ], + [ + "b1a1", + "院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応" + ], + [ + "b2a1", + "押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改" + ], + [ + "b3a1", + "魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱" + ], + [ + "b4a1", + "粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄" + ], + [ + "b5a1", + "機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京" + ], + [ + "b6a1", + "供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈" + ], + [ + "b7a1", + "掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲" + ], + [ + "b8a1", + "検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向" + ], + [ + "b9a1", + "后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込" + ], + [ + "baa1", + "此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷" + ], + [ + "bba1", + "察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時" + ], + [ + "bca1", + "次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周" + ], + [ + "bda1", + "宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償" + ], + [ + "bea1", + "勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾" + ], + [ + "bfa1", + "拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾" + ], + [ + "c0a1", + "澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線" + ], + [ + "c1a1", + "繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎" + ], + [ + "c2a1", + "臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只" + ], + [ + "c3a1", + "叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵" + ], + [ + "c4a1", + "帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓" + ], + [ + "c5a1", + "邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到" + ], + [ + "c6a1", + "董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入" + ], + [ + "c7a1", + "如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦" + ], + [ + "c8a1", + "函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美" + ], + [ + "c9a1", + "鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服" + ], + [ + "caa1", + "福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋" + ], + [ + "cba1", + "法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満" + ], + [ + "cca1", + "漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒" + ], + [ + "cda1", + "諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃" + ], + [ + "cea1", + "痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯" + ], + [ + "cfa1", + "蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕" + ], + [ + "d0a1", + "弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲" + ], + [ + "d1a1", + "僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨" + ], + [ + "d2a1", + "辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨" + ], + [ + "d3a1", + "咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉" + ], + [ + "d4a1", + "圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩" + ], + [ + "d5a1", + "奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓" + ], + [ + "d6a1", + "屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏" + ], + [ + "d7a1", + "廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚" + ], + [ + "d8a1", + "悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛" + ], + [ + "d9a1", + "戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼" + ], + [ + "daa1", + "據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼" + ], + [ + "dba1", + "曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍" + ], + [ + "dca1", + "棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣" + ], + [ + "dda1", + "檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾" + ], + [ + "dea1", + "沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌" + ], + [ + "dfa1", + "漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼" + ], + [ + "e0a1", + "燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱" + ], + [ + "e1a1", + "瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰" + ], + [ + "e2a1", + "癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬" + ], + [ + "e3a1", + "磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐" + ], + [ + "e4a1", + "筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆" + ], + [ + "e5a1", + "紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺" + ], + [ + "e6a1", + "罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋" + ], + [ + "e7a1", + "隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙" + ], + [ + "e8a1", + "茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈" + ], + [ + "e9a1", + "蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙" + ], + [ + "eaa1", + "蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞" + ], + [ + "eba1", + "襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫" + ], + [ + "eca1", + "譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊" + ], + [ + "eda1", + "蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸" + ], + [ + "eea1", + "遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮" + ], + [ + "efa1", + "錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞" + ], + [ + "f0a1", + "陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰" + ], + [ + "f1a1", + "顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷" + ], + [ + "f2a1", + "髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈" + ], + [ + "f3a1", + "鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠" + ], + [ + "f4a1", + "堯槇遙瑤凜熙" + ], + [ + "f9a1", + "纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德" + ], + [ + "faa1", + "忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱" + ], + [ + "fba1", + "犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚" + ], + [ + "fca1", + "釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑" + ], + [ + "fcf1", + "ⅰ", + 9, + "¬¦'"" + ], + [ + "8fa2af", + "˘ˇ¸˙˝¯˛˚~΄΅" + ], + [ + "8fa2c2", + "¡¦¿" + ], + [ + "8fa2eb", + "ºª©®™¤№" + ], + [ + "8fa6e1", + "ΆΈΉΊΪ" + ], + [ + "8fa6e7", + "Ό" + ], + [ + "8fa6e9", + "ΎΫ" + ], + [ + "8fa6ec", + "Ώ" + ], + [ + "8fa6f1", + "άέήίϊΐόςύϋΰώ" + ], + [ + "8fa7c2", + "Ђ", + 10, + "ЎЏ" + ], + [ + "8fa7f2", + "ђ", + 10, + "ўџ" + ], + [ + "8fa9a1", + "ÆĐ" + ], + [ + "8fa9a4", + "Ħ" + ], + [ + "8fa9a6", + "IJ" + ], + [ + "8fa9a8", + "ŁĿ" + ], + [ + "8fa9ab", + "ŊØŒ" + ], + [ + "8fa9af", + "ŦÞ" + ], + [ + "8fa9c1", + "æđðħıijĸłŀʼnŋøœßŧþ" + ], + [ + "8faaa1", + "ÁÀÄÂĂǍĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ" + ], + [ + "8faaba", + "ĜĞĢĠĤÍÌÏÎǏİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑŐŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴÝŸŶŹŽŻ" + ], + [ + "8faba1", + "áàäâăǎāąåãćĉčçċďéèëêěėēęǵĝğ" + ], + [ + "8fabbd", + "ġĥíìïîǐ" + ], + [ + "8fabc5", + "īįĩĵķĺľļńňņñóòöôǒőōõŕřŗśŝšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż" + ], + [ + "8fb0a1", + "丂丄丅丌丒丟丣两丨丫丮丯丰丵乀乁乄乇乑乚乜乣乨乩乴乵乹乿亍亖亗亝亯亹仃仐仚仛仠仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾侁侂侄" + ], + [ + "8fb1a1", + "侅侉侊侌侎侐侒侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀俁俅俆俈俉俋俌俍俏俒俜俠俢俰俲俼俽俿倀倁倄倇倊倌倎倐倓倗倘倛倜倝倞倢倧倮倰倲倳倵偀偁偂偅偆偊偌偎偑偒偓偗偙偟偠偢偣偦偧偪偭偰偱倻傁傃傄傆傊傎傏傐" + ], + [ + "8fb2a1", + "傒傓傔傖傛傜傞", + 4, + "傪傯傰傹傺傽僀僃僄僇僌僎僐僓僔僘僜僝僟僢僤僦僨僩僯僱僶僺僾儃儆儇儈儋儌儍儎僲儐儗儙儛儜儝儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊兏兓兕兗兘兟兤兦兾冃冄冋冎冘冝冡冣冭冸冺冼冾冿凂" + ], + [ + "8fb3a1", + "凈减凑凒凓凕凘凞凢凥凮凲凳凴凷刁刂刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌勏勑勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋" + ], + [ + "8fb4a1", + "匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾卂卌卋卙卛卡卣卥卬卭卲卹卾厃厇厈厎厓厔厙厝厡厤厪厫厯厲厴厵厷厸厺厽叀叅叏叒叓叕叚叝叞叠另叧叵吂吓吚吡吧吨吪启吱吴吵呃呄呇呍呏呞呢呤呦呧呩呫呭呮呴呿" + ], + [ + "8fb5a1", + "咁咃咅咈咉咍咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊响哎哠哪哬哯哶哼哾哿唀唁唅唈唉唌唍唎唕唪唫唲唵唶唻唼唽啁啇啉啊啍啐啑啘啚啛啞啠啡啤啦啿喁喂喆喈喎喏喑喒喓喔喗喣喤喭喲喿嗁嗃嗆嗉嗋嗌嗎嗑嗒" + ], + [ + "8fb6a1", + "嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊嘍", + 5, + "嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀噁噃噄噆噉噋噍噏噔噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚嚝嚞嚟嚦嚧嚨嚩嚫嚬嚭嚱嚳嚷嚾囅囉囊囋囏囐囌囍囙囜囝囟囡囤", + 4, + "囱囫园" + ], + [ + "8fb7a1", + "囶囷圁圂圇圊圌圑圕圚圛圝圠圢圣圤圥圩圪圬圮圯圳圴圽圾圿坅坆坌坍坒坢坥坧坨坫坭", + 4, + "坳坴坵坷坹坺坻坼坾垁垃垌垔垗垙垚垜垝垞垟垡垕垧垨垩垬垸垽埇埈埌埏埕埝埞埤埦埧埩埭埰埵埶埸埽埾埿堃堄堈堉埡" + ], + [ + "8fb8a1", + "堌堍堛堞堟堠堦堧堭堲堹堿塉塌塍塏塐塕塟塡塤塧塨塸塼塿墀墁墇墈墉墊墌墍墏墐墔墖墝墠墡墢墦墩墱墲壄墼壂壈壍壎壐壒壔壖壚壝壡壢壩壳夅夆夋夌夒夓夔虁夝夡夣夤夨夯夰夳夵夶夿奃奆奒奓奙奛奝奞奟奡奣奫奭" + ], + [ + "8fb9a1", + "奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼姁姃姄姈姊姍姒姝姞姟姣姤姧姮姯姱姲姴姷娀娄娌娍娎娒娓娞娣娤娧娨娪娭娰婄婅婇婈婌婐婕婞婣婥婧婭婷婺婻婾媋媐媓媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿" + ], + [ + "8fbaa1", + "嫄嫆嫈嫏嫚嫜嫠嫥嫪嫮嫵嫶嫽嬀嬁嬈嬗嬴嬙嬛嬝嬡嬥嬭嬸孁孋孌孒孖孞孨孮孯孼孽孾孿宁宄宆宊宎宐宑宓宔宖宨宩宬宭宯宱宲宷宺宼寀寁寍寏寖", + 4, + "寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩" + ], + [ + "8fbba1", + "屭屰屴屵屺屻屼屽岇岈岊岏岒岝岟岠岢岣岦岪岲岴岵岺峉峋峒峝峗峮峱峲峴崁崆崍崒崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿嶁嶃嶈嶊嶒嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋巐巎巘巙巠巤" + ], + [ + "8fbca1", + "巩巸巹帀帇帍帒帔帕帘帟帠帮帨帲帵帾幋幐幉幑幖幘幛幜幞幨幪", + 4, + "幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜弝弡弢弣弤弨弫弬弮弰弴弶弻弽弿彀彄彅彇彍彐彔彘彛彠彣彤彧" + ], + [ + "8fbda1", + "彯彲彴彵彸彺彽彾徉徍徏徖徜徝徢徧徫徤徬徯徰徱徸忄忇忈忉忋忐", + 4, + "忞忡忢忨忩忪忬忭忮忯忲忳忶忺忼怇怊怍怓怔怗怘怚怟怤怭怳怵恀恇恈恉恌恑恔恖恗恝恡恧恱恾恿悂悆悈悊悎悑悓悕悘悝悞悢悤悥您悰悱悷" + ], + [ + "8fbea1", + "悻悾惂惄惈惉惊惋惎惏惔惕惙惛惝惞惢惥惲惵惸惼惽愂愇愊愌愐", + 4, + "愖愗愙愜愞愢愪愫愰愱愵愶愷愹慁慅慆慉慞慠慬慲慸慻慼慿憀憁憃憄憋憍憒憓憗憘憜憝憟憠憥憨憪憭憸憹憼懀懁懂懎懏懕懜懝懞懟懡懢懧懩懥" + ], + [ + "8fbfa1", + "懬懭懯戁戃戄戇戓戕戜戠戢戣戧戩戫戹戽扂扃扄扆扌扐扑扒扔扖扚扜扤扭扯扳扺扽抍抎抏抐抦抨抳抶抷抺抾抿拄拎拕拖拚拪拲拴拼拽挃挄挊挋挍挐挓挖挘挩挪挭挵挶挹挼捁捂捃捄捆捊捋捎捒捓捔捘捛捥捦捬捭捱捴捵" + ], + [ + "8fc0a1", + "捸捼捽捿掂掄掇掊掐掔掕掙掚掞掤掦掭掮掯掽揁揅揈揎揑揓揔揕揜揠揥揪揬揲揳揵揸揹搉搊搐搒搔搘搞搠搢搤搥搩搪搯搰搵搽搿摋摏摑摒摓摔摚摛摜摝摟摠摡摣摭摳摴摻摽撅撇撏撐撑撘撙撛撝撟撡撣撦撨撬撳撽撾撿" + ], + [ + "8fc1a1", + "擄擉擊擋擌擎擐擑擕擗擤擥擩擪擭擰擵擷擻擿攁攄攈攉攊攏攓攔攖攙攛攞攟攢攦攩攮攱攺攼攽敃敇敉敐敒敔敟敠敧敫敺敽斁斅斊斒斕斘斝斠斣斦斮斲斳斴斿旂旈旉旎旐旔旖旘旟旰旲旴旵旹旾旿昀昄昈昉昍昑昒昕昖昝" + ], + [ + "8fc2a1", + "昞昡昢昣昤昦昩昪昫昬昮昰昱昳昹昷晀晅晆晊晌晑晎晗晘晙晛晜晠晡曻晪晫晬晾晳晵晿晷晸晹晻暀晼暋暌暍暐暒暙暚暛暜暟暠暤暭暱暲暵暻暿曀曂曃曈曌曎曏曔曛曟曨曫曬曮曺朅朇朎朓朙朜朠朢朳朾杅杇杈杌杔杕杝" + ], + [ + "8fc3a1", + "杦杬杮杴杶杻极构枎枏枑枓枖枘枙枛枰枱枲枵枻枼枽柹柀柂柃柅柈柉柒柗柙柜柡柦柰柲柶柷桒栔栙栝栟栨栧栬栭栯栰栱栳栻栿桄桅桊桌桕桗桘桛桫桮", + 4, + "桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌棏" + ], + [ + "8fc4a1", + "棐棑棓棖棙棜棝棥棨棪棫棬棭棰棱棵棶棻棼棽椆椉椊椐椑椓椖椗椱椳椵椸椻楂楅楉楎楗楛楣楤楥楦楨楩楬楰楱楲楺楻楿榀榍榒榖榘榡榥榦榨榫榭榯榷榸榺榼槅槈槑槖槗槢槥槮槯槱槳槵槾樀樁樃樏樑樕樚樝樠樤樨樰樲" + ], + [ + "8fc5a1", + "樴樷樻樾樿橅橆橉橊橎橐橑橒橕橖橛橤橧橪橱橳橾檁檃檆檇檉檋檑檛檝檞檟檥檫檯檰檱檴檽檾檿櫆櫉櫈櫌櫐櫔櫕櫖櫜櫝櫤櫧櫬櫰櫱櫲櫼櫽欂欃欆欇欉欏欐欑欗欛欞欤欨欫欬欯欵欶欻欿歆歊歍歒歖歘歝歠歧歫歮歰歵歽" + ], + [ + "8fc6a1", + "歾殂殅殗殛殟殠殢殣殨殩殬殭殮殰殸殹殽殾毃毄毉毌毖毚毡毣毦毧毮毱毷毹毿氂氄氅氉氍氎氐氒氙氟氦氧氨氬氮氳氵氶氺氻氿汊汋汍汏汒汔汙汛汜汫汭汯汴汶汸汹汻沅沆沇沉沔沕沗沘沜沟沰沲沴泂泆泍泏泐泑泒泔泖" + ], + [ + "8fc7a1", + "泚泜泠泧泩泫泬泮泲泴洄洇洊洎洏洑洓洚洦洧洨汧洮洯洱洹洼洿浗浞浟浡浥浧浯浰浼涂涇涑涒涔涖涗涘涪涬涴涷涹涽涿淄淈淊淎淏淖淛淝淟淠淢淥淩淯淰淴淶淼渀渄渞渢渧渲渶渹渻渼湄湅湈湉湋湏湑湒湓湔湗湜湝湞" + ], + [ + "8fc8a1", + "湢湣湨湳湻湽溍溓溙溠溧溭溮溱溳溻溿滀滁滃滇滈滊滍滎滏滫滭滮滹滻滽漄漈漊漌漍漖漘漚漛漦漩漪漯漰漳漶漻漼漭潏潑潒潓潗潙潚潝潞潡潢潨潬潽潾澃澇澈澋澌澍澐澒澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊" + ], + [ + "8fc9a1", + "濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇瀍瀗瀠瀣瀯瀴瀷瀹瀼灃灄灈灉灊灋灔灕灝灞灎灤灥灬灮灵灶灾炁炅炆炔", + 4, + "炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃", + 4, + "焋焌焏焞焠焫焭焯焰焱焸煁煅煆煇煊煋煐煒煗煚煜煞煠" + ], + [ + "8fcaa1", + "煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀燁燄燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚爝爟爤爫爯爴爸爹牁牂牃牅牎牏牐牓牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉犍犎犓犛犨犭犮犱犴犾狁狇狉狌狕狖狘狟狥狳狴狺狻" + ], + [ + "8fcba1", + "狾猂猄猅猇猋猍猒猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽獃獍獐獒獖獘獝獞獟獠獦獧獩獫獬獮獯獱獷獹獼玀玁玃玅玆玎玐玓玕玗玘玜玞玟玠玢玥玦玪玫玭玵玷玹玼玽玿珅珆珉珋珌珏珒珓珖珙珝珡珣珦珧珩珴珵珷珹珺珻珽" + ], + [ + "8fcca1", + "珿琀琁琄琇琊琑琚琛琤琦琨", + 9, + "琹瑀瑃瑄瑆瑇瑋瑍瑑瑒瑗瑝瑢瑦瑧瑨瑫瑭瑮瑱瑲璀璁璅璆璇璉璏璐璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌瓐瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆" + ], + [ + "8fcda1", + "甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎畐畒畗畞畟畡畯畱畹", + 5, + "疁疅疐疒疓疕疙疜疢疤疴疺疿痀痁痄痆痌痎痏痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌瘏瘒瘓瘕瘖瘙瘛瘜瘝瘞瘣瘥瘦瘩瘭瘲瘳瘵瘸瘹" + ], + [ + "8fcea1", + "瘺瘼癊癀癁癃癄癅癉癋癕癙癟癤癥癭癮癯癱癴皁皅皌皍皕皛皜皝皟皠皢", + 6, + "皪皭皽盁盅盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾睂睅睆睊睍睎睏睒睖睗睜睞睟睠睢" + ], + [ + "8fcfa1", + "睤睧睪睬睰睲睳睴睺睽瞀瞄瞌瞍瞔瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉砍砎砑砝砡砢砣砭砮砰砵砷硃硄硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊碏碔碘碡碝碞碟碤碨碬碭碰碱碲碳" + ], + [ + "8fd0a1", + "碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌礐礚礜礞礟礠礥礧礩礭礱礴礵礻礽礿祄祅祆祊祋祏祑祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊秏秔秖秚秝秞" + ], + [ + "8fd1a1", + "秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜穝穟穠穥穧穪穭穵穸穾窀窂窅窆窊窋窐窑窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰" + ], + [ + "8fd2a1", + "笱笴笽笿筀筁筇筎筕筠筤筦筩筪筭筯筲筳筷箄箉箎箐箑箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾簁簂簃簄簆簉簋簌簎簏簙簛簠簥簦簨簬簱簳簴簶簹簺籆籊籕籑籒籓籙", + 5 + ], + [ + "8fd3a1", + "籡籣籧籩籭籮籰籲籹籼籽粆粇粏粔粞粠粦粰粶粷粺粻粼粿糄糇糈糉糍糏糓糔糕糗糙糚糝糦糩糫糵紃紇紈紉紏紑紒紓紖紝紞紣紦紪紭紱紼紽紾絀絁絇絈絍絑絓絗絙絚絜絝絥絧絪絰絸絺絻絿綁綂綃綅綆綈綋綌綍綑綖綗綝" + ], + [ + "8fd4a1", + "綞綦綧綪綳綶綷綹緂", + 4, + "緌緍緎緗緙縀緢緥緦緪緫緭緱緵緶緹緺縈縐縑縕縗縜縝縠縧縨縬縭縯縳縶縿繄繅繇繎繐繒繘繟繡繢繥繫繮繯繳繸繾纁纆纇纊纍纑纕纘纚纝纞缼缻缽缾缿罃罄罇罏罒罓罛罜罝罡罣罤罥罦罭" + ], + [ + "8fd5a1", + "罱罽罾罿羀羋羍羏羐羑羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎翏翛翟翣翥翨翬翮翯翲翺翽翾翿耇耈耊耍耎耏耑耓耔耖耝耞耟耠耤耦耬耮耰耴耵耷耹耺耼耾聀聄聠聤聦聭聱聵肁肈肎肜肞肦肧肫肸肹胈胍胏胒胔胕胗胘胠胭胮" + ], + [ + "8fd6a1", + "胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷膁膐膄膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎臏臕臗臛臝臞臡臤臫臬臰臱臲臵臶臸臹臽臿舀舃舏舓舔舙舚舝舡舢舨舲舴舺艃艄艅艆" + ], + [ + "8fd7a1", + "艋艎艏艑艖艜艠艣艧艭艴艻艽艿芀芁芃芄芇芉芊芎芑芔芖芘芚芛芠芡芣芤芧芨芩芪芮芰芲芴芷芺芼芾芿苆苐苕苚苠苢苤苨苪苭苯苶苷苽苾茀茁茇茈茊茋荔茛茝茞茟茡茢茬茭茮茰茳茷茺茼茽荂荃荄荇荍荎荑荕荖荗荰荸" + ], + [ + "8fd8a1", + "荽荿莀莂莄莆莍莒莔莕莘莙莛莜莝莦莧莩莬莾莿菀菇菉菏菐菑菔菝荓菨菪菶菸菹菼萁萆萊萏萑萕萙莭萯萹葅葇葈葊葍葏葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽蒁蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌蓏蓓" + ], + [ + "8fd9a1", + "蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎蔐蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆蕏", + 4, + "蕖蕙蕜", + 6, + "蕤蕫蕯蕹蕺蕻蕽蕿薁薅薆薉薋薌薏薓薘薝薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼" + ], + [ + "8fdaa1", + "藿蘀蘄蘅蘍蘎蘐蘑蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙虝虠", + 4, + "虩虬虯虵虶虷虺蚍蚑蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀蛁蛃蛅蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎蜏蜐蜓蜔蜙蜞蜟蜡蜣" + ], + [ + "8fdba1", + "蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾蝀蝃蝅蝍蝘蝝蝡蝤蝥蝯蝱蝲蝻螃", + 6, + "螋螌螐螓螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿蟁蟈蟉蟊蟎蟕蟖蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿蠁蠃蠆蠉蠊蠋蠐蠙蠒蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵" + ], + [ + "8fdca1", + "蠺蠼衁衃衅衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊", + 4, + "裑裒裓裛裞裧裯裰裱裵裷褁褆褍褎褏褕褖褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉襏襒襗襚襛襜襡襢襣襫襮襰襳襵襺" + ], + [ + "8fdda1", + "襻襼襽覉覍覐覔覕覛覜覟覠覥覰覴覵覶覷覼觔", + 4, + "觥觩觫觭觱觳觶觹觽觿訄訅訇訏訑訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉詍詎詓詖詗詘詜詝詡詥詧詵詶詷詹詺詻詾詿誀誃誆誋誏誐誒誖誗誙誟誧誩誮誯誳" + ], + [ + "8fdea1", + "誶誷誻誾諃諆諈諉諊諑諓諔諕諗諝諟諬諰諴諵諶諼諿謅謆謋謑謜謞謟謊謭謰謷謼譂", + 4, + "譈譒譓譔譙譍譞譣譭譶譸譹譼譾讁讄讅讋讍讏讔讕讜讞讟谸谹谽谾豅豇豉豋豏豑豓豔豗豘豛豝豙豣豤豦豨豩豭豳豵豶豻豾貆" + ], + [ + "8fdfa1", + "貇貋貐貒貓貙貛貜貤貹貺賅賆賉賋賏賖賕賙賝賡賨賬賯賰賲賵賷賸賾賿贁贃贉贒贗贛赥赩赬赮赿趂趄趈趍趐趑趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽踁踄踅踆踋踑踔踖踠踡踢" + ], + [ + "8fe0a1", + "踣踦踧踱踳踶踷踸踹踽蹀蹁蹋蹍蹎蹏蹔蹛蹜蹝蹞蹡蹢蹩蹬蹭蹯蹰蹱蹹蹺蹻躂躃躉躐躒躕躚躛躝躞躢躧躩躭躮躳躵躺躻軀軁軃軄軇軏軑軔軜軨軮軰軱軷軹軺軭輀輂輇輈輏輐輖輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀轁" + ], + [ + "8fe1a1", + "轃轇轏轑", + 4, + "轘轝轞轥辝辠辡辤辥辦辵辶辸达迀迁迆迊迋迍运迒迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿遃遄遌遛遝遢遦遧遬遰遴遹邅邈邋邌邎邐邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃" + ], + [ + "8fe2a1", + "郄郅郇郈郕郗郘郙郜郝郟郥郒郶郫郯郰郴郾郿鄀鄄鄅鄆鄈鄍鄐鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈酏酓酗酙酚酛酡酤酧酭酴酹酺酻醁醃醅醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿" + ], + [ + "8fe3a1", + "釂釃釅釓釔釗釙釚釞釤釥釩釪釬", + 5, + "釷釹釻釽鈀鈁鈄鈅鈆鈇鈉鈊鈌鈐鈒鈓鈖鈘鈜鈝鈣鈤鈥鈦鈨鈮鈯鈰鈳鈵鈶鈸鈹鈺鈼鈾鉀鉂鉃鉆鉇鉊鉍鉎鉏鉑鉘鉙鉜鉝鉠鉡鉥鉧鉨鉩鉮鉯鉰鉵", + 4, + "鉻鉼鉽鉿銈銉銊銍銎銒銗" + ], + [ + "8fe4a1", + "銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿", + 4, + "鋅鋆鋇鋈鋋鋌鋍鋎鋐鋓鋕鋗鋘鋙鋜鋝鋟鋠鋡鋣鋥鋧鋨鋬鋮鋰鋹鋻鋿錀錂錈錍錑錔錕錜錝錞錟錡錤錥錧錩錪錳錴錶錷鍇鍈鍉鍐鍑鍒鍕鍗鍘鍚鍞鍤鍥鍧鍩鍪鍭鍯鍰鍱鍳鍴鍶" + ], + [ + "8fe5a1", + "鍺鍽鍿鎀鎁鎂鎈鎊鎋鎍鎏鎒鎕鎘鎛鎞鎡鎣鎤鎦鎨鎫鎴鎵鎶鎺鎩鏁鏄鏅鏆鏇鏉", + 4, + "鏓鏙鏜鏞鏟鏢鏦鏧鏹鏷鏸鏺鏻鏽鐁鐂鐄鐈鐉鐍鐎鐏鐕鐖鐗鐟鐮鐯鐱鐲鐳鐴鐻鐿鐽鑃鑅鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹" + ], + [ + "8fe6a1", + "镾閄閈閌閍閎閝閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋闐闑闒闓闙闚闝闞闟闠闤闦阝阞阢阤阥阦阬阱阳阷阸阹阺阼阽陁陒陔陖陗陘陡陮陴陻陼陾陿隁隂隃隄隉隑隖隚隝隟隤隥隦隩隮隯隳隺雊雒嶲雘雚雝雞雟雩雯雱雺霂" + ], + [ + "8fe7a1", + "霃霅霉霚霛霝霡霢霣霨霱霳靁靃靊靎靏靕靗靘靚靛靣靧靪靮靳靶靷靸靻靽靿鞀鞉鞕鞖鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿韁韄韅韇韉韊韌韍韎韐韑韔韗韘韙韝韞韠韛韡韤韯韱韴韷韸韺頇頊頙頍頎頔頖頜頞頠頣頦" + ], + [ + "8fe8a1", + "頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱", + 4, + "餹餺餻餼饀饁饆饇饈饍饎饔饘饙饛饜饞饟饠馛馝馟馦馰馱馲馵" + ], + [ + "8fe9a1", + "馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌騐騑騖騞騠騢騣騤騧騭騮騳騵騶騸驇驁驄驊驋驌驎驑驔驖驝骪骬骮骯骲骴骵骶骹骻骾骿髁髃髆髈髎髐髒髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿", + 4 + ], + [ + "8feaa1", + "鬄鬅鬈鬉鬋鬌鬍鬎鬐鬒鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪", + 4, + "魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋鮍鮏鮐鮔鮚鮝鮞鮦鮧鮩鮬鮰鮱鮲鮷鮸鮻鮼鮾鮿鯁鯇鯈鯎鯐鯗鯘鯝鯟鯥鯧鯪鯫鯯鯳鯷鯸" + ], + [ + "8feba1", + "鯹鯺鯽鯿鰀鰂鰋鰏鰑鰖鰘鰙鰚鰜鰞鰢鰣鰦", + 4, + "鰱鰵鰶鰷鰽鱁鱃鱄鱅鱉鱊鱎鱏鱐鱓鱔鱖鱘鱛鱝鱞鱟鱣鱩鱪鱜鱫鱨鱮鱰鱲鱵鱷鱻鳦鳲鳷鳹鴋鴂鴑鴗鴘鴜鴝鴞鴯鴰鴲鴳鴴鴺鴼鵅鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻" + ], + [ + "8feca1", + "鵼鵾鶃鶄鶆鶊鶍鶎鶒鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎鸐鸑鸒鸕鸖鸙鸜鸝鹺鹻鹼麀麂麃麄麅麇麎麏麖麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵" + ], + [ + "8feda1", + "黸黿鼂鼃鼉鼏鼐鼑鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿齁齃", + 4, + "齓齕齖齗齘齚齝齞齨齩齭", + 4, + "齳齵齺齽龏龐龑龒龔龖龗龞龡龢龣龥" + ] +]; + +var eucjp$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': eucjp +}); + +var cp936 = [ + [ + "0", + "\u0000", + 127, + "€" + ], + [ + "8140", + "丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪", + 5, + "乲乴", + 9, + "乿", + 6, + "亇亊" + ], + [ + "8180", + "亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂", + 6, + "伋伌伒", + 4, + "伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾", + 4, + "佄佅佇", + 5, + "佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢" + ], + [ + "8240", + "侤侫侭侰", + 4, + "侶", + 8, + "俀俁係俆俇俈俉俋俌俍俒", + 4, + "俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿", + 11 + ], + [ + "8280", + "個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯", + 10, + "倻倽倿偀偁偂偄偅偆偉偊偋偍偐", + 4, + "偖偗偘偙偛偝", + 7, + "偦", + 5, + "偭", + 8, + "偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎", + 20, + "傤傦傪傫傭", + 4, + "傳", + 6, + "傼" + ], + [ + "8340", + "傽", + 17, + "僐", + 5, + "僗僘僙僛", + 10, + "僨僩僪僫僯僰僱僲僴僶", + 4, + "僼", + 9, + "儈" + ], + [ + "8380", + "儉儊儌", + 5, + "儓", + 13, + "儢", + 28, + "兂兇兊兌兎兏児兒兓兗兘兙兛兝", + 4, + "兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦", + 4, + "冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒", + 5 + ], + [ + "8440", + "凘凙凚凜凞凟凢凣凥", + 5, + "凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄", + 5, + "剋剎剏剒剓剕剗剘" + ], + [ + "8480", + "剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳", + 9, + "剾劀劃", + 4, + "劉", + 6, + "劑劒劔", + 6, + "劜劤劥劦劧劮劯劰労", + 9, + "勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務", + 5, + "勠勡勢勣勥", + 10, + "勱", + 7, + "勻勼勽匁匂匃匄匇匉匊匋匌匎" + ], + [ + "8540", + "匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯", + 9, + "匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏" + ], + [ + "8580", + "厐", + 4, + "厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯", + 6, + "厷厸厹厺厼厽厾叀參", + 4, + "収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝", + 4, + "呣呥呧呩", + 7, + "呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡" + ], + [ + "8640", + "咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠", + 4, + "哫哬哯哰哱哴", + 5, + "哻哾唀唂唃唄唅唈唊", + 4, + "唒唓唕", + 5, + "唜唝唞唟唡唥唦" + ], + [ + "8680", + "唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋", + 4, + "啑啒啓啔啗", + 4, + "啝啞啟啠啢啣啨啩啫啯", + 5, + "啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠", + 6, + "喨", + 8, + "喲喴営喸喺喼喿", + 4, + "嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗", + 4, + "嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸", + 4, + "嗿嘂嘃嘄嘅" + ], + [ + "8740", + "嘆嘇嘊嘋嘍嘐", + 7, + "嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀", + 11, + "噏", + 4, + "噕噖噚噛噝", + 4 + ], + [ + "8780", + "噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽", + 7, + "嚇", + 6, + "嚐嚑嚒嚔", + 14, + "嚤", + 10, + "嚰", + 6, + "嚸嚹嚺嚻嚽", + 12, + "囋", + 8, + "囕囖囘囙囜団囥", + 5, + "囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國", + 6 + ], + [ + "8840", + "園", + 9, + "圝圞圠圡圢圤圥圦圧圫圱圲圴", + 4, + "圼圽圿坁坃坄坅坆坈坉坋坒", + 4, + "坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀" + ], + [ + "8880", + "垁垇垈垉垊垍", + 4, + "垔", + 6, + "垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹", + 8, + "埄", + 6, + "埌埍埐埑埓埖埗埛埜埞埡埢埣埥", + 7, + "埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥", + 4, + "堫", + 4, + "報堲堳場堶", + 7 + ], + [ + "8940", + "堾", + 5, + "塅", + 6, + "塎塏塐塒塓塕塖塗塙", + 4, + "塟", + 5, + "塦", + 4, + "塭", + 16, + "塿墂墄墆墇墈墊墋墌" + ], + [ + "8980", + "墍", + 4, + "墔", + 4, + "墛墜墝墠", + 7, + "墪", + 17, + "墽墾墿壀壂壃壄壆", + 10, + "壒壓壔壖", + 13, + "壥", + 5, + "壭壯壱売壴壵壷壸壺", + 7, + "夃夅夆夈", + 4, + "夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻" + ], + [ + "8a40", + "夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛", + 4, + "奡奣奤奦", + 12, + "奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦" + ], + [ + "8a80", + "妧妬妭妰妱妳", + 5, + "妺妼妽妿", + 6, + "姇姈姉姌姍姎姏姕姖姙姛姞", + 4, + "姤姦姧姩姪姫姭", + 11, + "姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪", + 6, + "娳娵娷", + 4, + "娽娾娿婁", + 4, + "婇婈婋", + 9, + "婖婗婘婙婛", + 5 + ], + [ + "8b40", + "婡婣婤婥婦婨婩婫", + 8, + "婸婹婻婼婽婾媀", + 17, + "媓", + 6, + "媜", + 13, + "媫媬" + ], + [ + "8b80", + "媭", + 4, + "媴媶媷媹", + 4, + "媿嫀嫃", + 5, + "嫊嫋嫍", + 4, + "嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬", + 4, + "嫲", + 22, + "嬊", + 11, + "嬘", + 25, + "嬳嬵嬶嬸", + 7, + "孁", + 6 + ], + [ + "8c40", + "孈", + 7, + "孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏" + ], + [ + "8c80", + "寑寔", + 8, + "寠寢寣實寧審", + 4, + "寯寱", + 6, + "寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧", + 6, + "屰屲", + 6, + "屻屼屽屾岀岃", + 4, + "岉岊岋岎岏岒岓岕岝", + 4, + "岤", + 4 + ], + [ + "8d40", + "岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅", + 5, + "峌", + 5, + "峓", + 5, + "峚", + 6, + "峢峣峧峩峫峬峮峯峱", + 9, + "峼", + 4 + ], + [ + "8d80", + "崁崄崅崈", + 5, + "崏", + 4, + "崕崗崘崙崚崜崝崟", + 4, + "崥崨崪崫崬崯", + 4, + "崵", + 7, + "崿", + 7, + "嵈嵉嵍", + 10, + "嵙嵚嵜嵞", + 10, + "嵪嵭嵮嵰嵱嵲嵳嵵", + 12, + "嶃", + 21, + "嶚嶛嶜嶞嶟嶠" + ], + [ + "8e40", + "嶡", + 21, + "嶸", + 12, + "巆", + 6, + "巎", + 12, + "巜巟巠巣巤巪巬巭" + ], + [ + "8e80", + "巰巵巶巸", + 4, + "巿帀帄帇帉帊帋帍帎帒帓帗帞", + 7, + "帨", + 4, + "帯帰帲", + 4, + "帹帺帾帿幀幁幃幆", + 5, + "幍", + 6, + "幖", + 4, + "幜幝幟幠幣", + 14, + "幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨", + 4, + "庮", + 4, + "庴庺庻庼庽庿", + 6 + ], + [ + "8f40", + "廆廇廈廋", + 5, + "廔廕廗廘廙廚廜", + 11, + "廩廫", + 8, + "廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤" + ], + [ + "8f80", + "弨弫弬弮弰弲", + 6, + "弻弽弾弿彁", + 14, + "彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢", + 5, + "復徫徬徯", + 5, + "徶徸徹徺徻徾", + 4, + "忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇" + ], + [ + "9040", + "怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰", + 4, + "怶", + 4, + "怽怾恀恄", + 6, + "恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀" + ], + [ + "9080", + "悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽", + 7, + "惇惈惉惌", + 4, + "惒惓惔惖惗惙惛惞惡", + 4, + "惪惱惲惵惷惸惻", + 4, + "愂愃愄愅愇愊愋愌愐", + 4, + "愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬", + 18, + "慀", + 6 + ], + [ + "9140", + "慇慉態慍慏慐慒慓慔慖", + 6, + "慞慟慠慡慣慤慥慦慩", + 6, + "慱慲慳慴慶慸", + 18, + "憌憍憏", + 4, + "憕" + ], + [ + "9180", + "憖", + 6, + "憞", + 8, + "憪憫憭", + 9, + "憸", + 5, + "憿懀懁懃", + 4, + "應懌", + 4, + "懓懕", + 16, + "懧", + 13, + "懶", + 8, + "戀", + 5, + "戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸", + 4, + "扂扄扅扆扊" + ], + [ + "9240", + "扏扐払扖扗扙扚扜", + 6, + "扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋", + 5, + "抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁" + ], + [ + "9280", + "拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳", + 5, + "挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖", + 7, + "捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙", + 6, + "採掤掦掫掯掱掲掵掶掹掻掽掿揀" + ], + [ + "9340", + "揁揂揃揅揇揈揊揋揌揑揓揔揕揗", + 6, + "揟揢揤", + 4, + "揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆", + 4, + "損搎搑搒搕", + 5, + "搝搟搢搣搤" + ], + [ + "9380", + "搥搧搨搩搫搮", + 5, + "搵", + 4, + "搻搼搾摀摂摃摉摋", + 6, + "摓摕摖摗摙", + 4, + "摟", + 7, + "摨摪摫摬摮", + 9, + "摻", + 6, + "撃撆撈", + 8, + "撓撔撗撘撚撛撜撝撟", + 4, + "撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆", + 6, + "擏擑擓擔擕擖擙據" + ], + [ + "9440", + "擛擜擝擟擠擡擣擥擧", + 24, + "攁", + 7, + "攊", + 7, + "攓", + 4, + "攙", + 8 + ], + [ + "9480", + "攢攣攤攦", + 4, + "攬攭攰攱攲攳攷攺攼攽敀", + 4, + "敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數", + 14, + "斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱", + 7, + "斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘", + 7, + "旡旣旤旪旫" + ], + [ + "9540", + "旲旳旴旵旸旹旻", + 4, + "昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷", + 4, + "昽昿晀時晄", + 6, + "晍晎晐晑晘" + ], + [ + "9580", + "晙晛晜晝晞晠晢晣晥晧晩", + 4, + "晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘", + 4, + "暞", + 8, + "暩", + 4, + "暯", + 4, + "暵暶暷暸暺暻暼暽暿", + 25, + "曚曞", + 7, + "曧曨曪", + 5, + "曱曵曶書曺曻曽朁朂會" + ], + [ + "9640", + "朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠", + 5, + "朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗", + 4, + "杝杢杣杤杦杧杫杬杮東杴杶" + ], + [ + "9680", + "杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹", + 7, + "柂柅", + 9, + "柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵", + 7, + "柾栁栂栃栄栆栍栐栒栔栕栘", + 4, + "栞栟栠栢", + 6, + "栫", + 6, + "栴栵栶栺栻栿桇桋桍桏桒桖", + 5 + ], + [ + "9740", + "桜桝桞桟桪桬", + 7, + "桵桸", + 8, + "梂梄梇", + 7, + "梐梑梒梔梕梖梘", + 9, + "梣梤梥梩梪梫梬梮梱梲梴梶梷梸" + ], + [ + "9780", + "梹", + 6, + "棁棃", + 5, + "棊棌棎棏棐棑棓棔棖棗棙棛", + 4, + "棡棢棤", + 9, + "棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆", + 4, + "椌椏椑椓", + 11, + "椡椢椣椥", + 7, + "椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃", + 16, + "楕楖楘楙楛楜楟" + ], + [ + "9840", + "楡楢楤楥楧楨楩楪楬業楯楰楲", + 4, + "楺楻楽楾楿榁榃榅榊榋榌榎", + 5, + "榖榗榙榚榝", + 9, + "榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽" + ], + [ + "9880", + "榾榿槀槂", + 7, + "構槍槏槑槒槓槕", + 5, + "槜槝槞槡", + 11, + "槮槯槰槱槳", + 9, + "槾樀", + 9, + "樋", + 11, + "標", + 5, + "樠樢", + 5, + "権樫樬樭樮樰樲樳樴樶", + 6, + "樿", + 4, + "橅橆橈", + 7, + "橑", + 6, + "橚" + ], + [ + "9940", + "橜", + 4, + "橢橣橤橦", + 10, + "橲", + 6, + "橺橻橽橾橿檁檂檃檅", + 8, + "檏檒", + 4, + "檘", + 7, + "檡", + 5 + ], + [ + "9980", + "檧檨檪檭", + 114, + "欥欦欨", + 6 + ], + [ + "9a40", + "欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍", + 11, + "歚", + 7, + "歨歩歫", + 13, + "歺歽歾歿殀殅殈" + ], + [ + "9a80", + "殌殎殏殐殑殔殕殗殘殙殜", + 4, + "殢", + 7, + "殫", + 7, + "殶殸", + 6, + "毀毃毄毆", + 4, + "毌毎毐毑毘毚毜", + 4, + "毢", + 7, + "毬毭毮毰毱毲毴毶毷毸毺毻毼毾", + 6, + "氈", + 4, + "氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋", + 4, + "汑汒汓汖汘" + ], + [ + "9b40", + "汙汚汢汣汥汦汧汫", + 4, + "汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘" + ], + [ + "9b80", + "泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟", + 5, + "洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽", + 4, + "涃涄涆涇涊涋涍涏涐涒涖", + 4, + "涜涢涥涬涭涰涱涳涴涶涷涹", + 5, + "淁淂淃淈淉淊" + ], + [ + "9c40", + "淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽", + 7, + "渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵" + ], + [ + "9c80", + "渶渷渹渻", + 7, + "湅", + 7, + "湏湐湑湒湕湗湙湚湜湝湞湠", + 10, + "湬湭湯", + 14, + "満溁溂溄溇溈溊", + 4, + "溑", + 6, + "溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪", + 5 + ], + [ + "9d40", + "滰滱滲滳滵滶滷滸滺", + 7, + "漃漄漅漇漈漊", + 4, + "漐漑漒漖", + 9, + "漡漢漣漥漦漧漨漬漮漰漲漴漵漷", + 6, + "漿潀潁潂" + ], + [ + "9d80", + "潃潄潅潈潉潊潌潎", + 9, + "潙潚潛潝潟潠潡潣潤潥潧", + 5, + "潯潰潱潳潵潶潷潹潻潽", + 6, + "澅澆澇澊澋澏", + 12, + "澝澞澟澠澢", + 4, + "澨", + 10, + "澴澵澷澸澺", + 5, + "濁濃", + 5, + "濊", + 6, + "濓", + 10, + "濟濢濣濤濥" + ], + [ + "9e40", + "濦", + 7, + "濰", + 32, + "瀒", + 7, + "瀜", + 6, + "瀤", + 6 + ], + [ + "9e80", + "瀫", + 9, + "瀶瀷瀸瀺", + 17, + "灍灎灐", + 13, + "灟", + 11, + "灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞", + 12, + "炰炲炴炵炶為炾炿烄烅烆烇烉烋", + 12, + "烚" + ], + [ + "9f40", + "烜烝烞烠烡烢烣烥烪烮烰", + 6, + "烸烺烻烼烾", + 10, + "焋", + 4, + "焑焒焔焗焛", + 10, + "焧", + 7, + "焲焳焴" + ], + [ + "9f80", + "焵焷", + 13, + "煆煇煈煉煋煍煏", + 12, + "煝煟", + 4, + "煥煩", + 4, + "煯煰煱煴煵煶煷煹煻煼煾", + 5, + "熅", + 4, + "熋熌熍熎熐熑熒熓熕熖熗熚", + 4, + "熡", + 6, + "熩熪熫熭", + 5, + "熴熶熷熸熺", + 8, + "燄", + 9, + "燏", + 4 + ], + [ + "a040", + "燖", + 9, + "燡燢燣燤燦燨", + 5, + "燯", + 9, + "燺", + 11, + "爇", + 19 + ], + [ + "a080", + "爛爜爞", + 9, + "爩爫爭爮爯爲爳爴爺爼爾牀", + 6, + "牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅", + 4, + "犌犎犐犑犓", + 11, + "犠", + 11, + "犮犱犲犳犵犺", + 6, + "狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛" + ], + [ + "a1a1", + " 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈", + 7, + "〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓" + ], + [ + "a2a1", + "ⅰ", + 9 + ], + [ + "a2b1", + "⒈", + 19, + "⑴", + 19, + "①", + 9 + ], + [ + "a2e5", + "㈠", + 9 + ], + [ + "a2f1", + "Ⅰ", + 11 + ], + [ + "a3a1", + "!"#¥%", + 88, + " ̄" + ], + [ + "a4a1", + "ぁ", + 82 + ], + [ + "a5a1", + "ァ", + 85 + ], + [ + "a6a1", + "Α", + 16, + "Σ", + 6 + ], + [ + "a6c1", + "α", + 16, + "σ", + 6 + ], + [ + "a6e0", + "︵︶︹︺︿﹀︽︾﹁﹂﹃﹄" + ], + [ + "a6ee", + "︻︼︷︸︱" + ], + [ + "a6f4", + "︳︴" + ], + [ + "a7a1", + "А", + 5, + "ЁЖ", + 25 + ], + [ + "a7d1", + "а", + 5, + "ёж", + 25 + ], + [ + "a840", + "ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═", + 35, + "▁", + 6 + ], + [ + "a880", + "█", + 7, + "▓▔▕▼▽◢◣◤◥☉⊕〒〝〞" + ], + [ + "a8a1", + "āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ" + ], + [ + "a8bd", + "ńň" + ], + [ + "a8c0", + "ɡ" + ], + [ + "a8c5", + "ㄅ", + 36 + ], + [ + "a940", + "〡", + 8, + "㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦" + ], + [ + "a959", + "℡㈱" + ], + [ + "a95c", + "‐" + ], + [ + "a960", + "ー゛゜ヽヾ〆ゝゞ﹉", + 9, + "﹔﹕﹖﹗﹙", + 8 + ], + [ + "a980", + "﹢", + 4, + "﹨﹩﹪﹫" + ], + [ + "a996", + "〇" + ], + [ + "a9a4", + "─", + 75 + ], + [ + "aa40", + "狜狝狟狢", + 5, + "狪狫狵狶狹狽狾狿猀猂猄", + 5, + "猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀", + 8 + ], + [ + "aa80", + "獉獊獋獌獎獏獑獓獔獕獖獘", + 7, + "獡", + 10, + "獮獰獱" + ], + [ + "ab40", + "獲", + 11, + "獿", + 4, + "玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣", + 5, + "玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃", + 4 + ], + [ + "ab80", + "珋珌珎珒", + 6, + "珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳", + 4 + ], + [ + "ac40", + "珸", + 10, + "琄琇琈琋琌琍琎琑", + 8, + "琜", + 5, + "琣琤琧琩琫琭琯琱琲琷", + 4, + "琽琾琿瑀瑂", + 11 + ], + [ + "ac80", + "瑎", + 6, + "瑖瑘瑝瑠", + 12, + "瑮瑯瑱", + 4, + "瑸瑹瑺" + ], + [ + "ad40", + "瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑", + 10, + "璝璟", + 7, + "璪", + 15, + "璻", + 12 + ], + [ + "ad80", + "瓈", + 9, + "瓓", + 8, + "瓝瓟瓡瓥瓧", + 6, + "瓰瓱瓲" + ], + [ + "ae40", + "瓳瓵瓸", + 6, + "甀甁甂甃甅", + 7, + "甎甐甒甔甕甖甗甛甝甞甠", + 4, + "甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘" + ], + [ + "ae80", + "畝", + 7, + "畧畨畩畫", + 6, + "畳畵當畷畺", + 4, + "疀疁疂疄疅疇" + ], + [ + "af40", + "疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦", + 4, + "疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇" + ], + [ + "af80", + "瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄" + ], + [ + "b040", + "癅", + 6, + "癎", + 5, + "癕癗", + 4, + "癝癟癠癡癢癤", + 6, + "癬癭癮癰", + 7, + "癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛" + ], + [ + "b080", + "皜", + 7, + "皥", + 8, + "皯皰皳皵", + 9, + "盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥" + ], + [ + "b140", + "盄盇盉盋盌盓盕盙盚盜盝盞盠", + 4, + "盦", + 7, + "盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎", + 10, + "眛眜眝眞眡眣眤眥眧眪眫" + ], + [ + "b180", + "眬眮眰", + 4, + "眹眻眽眾眿睂睄睅睆睈", + 7, + "睒", + 7, + "睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳" + ], + [ + "b240", + "睝睞睟睠睤睧睩睪睭", + 11, + "睺睻睼瞁瞂瞃瞆", + 5, + "瞏瞐瞓", + 11, + "瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶", + 4 + ], + [ + "b280", + "瞼瞾矀", + 12, + "矎", + 8, + "矘矙矚矝", + 4, + "矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖" + ], + [ + "b340", + "矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃", + 5, + "砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚" + ], + [ + "b380", + "硛硜硞", + 11, + "硯", + 7, + "硸硹硺硻硽", + 6, + "场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚" + ], + [ + "b440", + "碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨", + 7, + "碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚", + 9 + ], + [ + "b480", + "磤磥磦磧磩磪磫磭", + 4, + "磳磵磶磸磹磻", + 5, + "礂礃礄礆", + 6, + "础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮" + ], + [ + "b540", + "礍", + 5, + "礔", + 9, + "礟", + 4, + "礥", + 14, + "礵", + 4, + "礽礿祂祃祄祅祇祊", + 8, + "祔祕祘祙祡祣" + ], + [ + "b580", + "祤祦祩祪祫祬祮祰", + 6, + "祹祻", + 4, + "禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠" + ], + [ + "b640", + "禓", + 6, + "禛", + 11, + "禨", + 10, + "禴", + 4, + "禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙", + 5, + "秠秡秢秥秨秪" + ], + [ + "b680", + "秬秮秱", + 6, + "秹秺秼秾秿稁稄稅稇稈稉稊稌稏", + 4, + "稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二" + ], + [ + "b740", + "稝稟稡稢稤", + 14, + "稴稵稶稸稺稾穀", + 5, + "穇", + 9, + "穒", + 4, + "穘", + 16 + ], + [ + "b780", + "穩", + 6, + "穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服" + ], + [ + "b840", + "窣窤窧窩窪窫窮", + 4, + "窴", + 10, + "竀", + 10, + "竌", + 9, + "竗竘竚竛竜竝竡竢竤竧", + 5, + "竮竰竱竲竳" + ], + [ + "b880", + "竴", + 4, + "竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹" + ], + [ + "b940", + "笯笰笲笴笵笶笷笹笻笽笿", + 5, + "筆筈筊筍筎筓筕筗筙筜筞筟筡筣", + 10, + "筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆", + 6, + "箎箏" + ], + [ + "b980", + "箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹", + 7, + "篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈" + ], + [ + "ba40", + "篅篈築篊篋篍篎篏篐篒篔", + 4, + "篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲", + 4, + "篸篹篺篻篽篿", + 7, + "簈簉簊簍簎簐", + 5, + "簗簘簙" + ], + [ + "ba80", + "簚", + 4, + "簠", + 5, + "簨簩簫", + 12, + "簹", + 5, + "籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖" + ], + [ + "bb40", + "籃", + 9, + "籎", + 36, + "籵", + 5, + "籾", + 9 + ], + [ + "bb80", + "粈粊", + 6, + "粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴", + 4, + "粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕" + ], + [ + "bc40", + "粿糀糂糃糄糆糉糋糎", + 6, + "糘糚糛糝糞糡", + 6, + "糩", + 5, + "糰", + 7, + "糹糺糼", + 13, + "紋", + 5 + ], + [ + "bc80", + "紑", + 14, + "紡紣紤紥紦紨紩紪紬紭紮細", + 6, + "肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件" + ], + [ + "bd40", + "紷", + 54, + "絯", + 7 + ], + [ + "bd80", + "絸", + 32, + "健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸" + ], + [ + "be40", + "継", + 12, + "綧", + 6, + "綯", + 42 + ], + [ + "be80", + "線", + 32, + "尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻" + ], + [ + "bf40", + "緻", + 62 + ], + [ + "bf80", + "縺縼", + 4, + "繂", + 4, + "繈", + 21, + "俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀" + ], + [ + "c040", + "繞", + 35, + "纃", + 23, + "纜纝纞" + ], + [ + "c080", + "纮纴纻纼绖绤绬绹缊缐缞缷缹缻", + 6, + "罃罆", + 9, + "罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐" + ], + [ + "c140", + "罖罙罛罜罝罞罠罣", + 4, + "罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂", + 7, + "羋羍羏", + 4, + "羕", + 4, + "羛羜羠羢羣羥羦羨", + 6, + "羱" + ], + [ + "c180", + "羳", + 4, + "羺羻羾翀翂翃翄翆翇翈翉翋翍翏", + 4, + "翖翗翙", + 5, + "翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿" + ], + [ + "c240", + "翤翧翨翪翫翬翭翯翲翴", + 6, + "翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫", + 5, + "耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗" + ], + [ + "c280", + "聙聛", + 13, + "聫", + 5, + "聲", + 11, + "隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫" + ], + [ + "c340", + "聾肁肂肅肈肊肍", + 5, + "肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇", + 4, + "胏", + 6, + "胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋" + ], + [ + "c380", + "脌脕脗脙脛脜脝脟", + 12, + "脭脮脰脳脴脵脷脹", + 4, + "脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸" + ], + [ + "c440", + "腀", + 5, + "腇腉腍腎腏腒腖腗腘腛", + 4, + "腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃", + 4, + "膉膋膌膍膎膐膒", + 5, + "膙膚膞", + 4, + "膤膥" + ], + [ + "c480", + "膧膩膫", + 7, + "膴", + 5, + "膼膽膾膿臄臅臇臈臉臋臍", + 6, + "摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁" + ], + [ + "c540", + "臔", + 14, + "臤臥臦臨臩臫臮", + 4, + "臵", + 5, + "臽臿舃與", + 4, + "舎舏舑舓舕", + 5, + "舝舠舤舥舦舧舩舮舲舺舼舽舿" + ], + [ + "c580", + "艀艁艂艃艅艆艈艊艌艍艎艐", + 7, + "艙艛艜艝艞艠", + 7, + "艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗" + ], + [ + "c640", + "艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸" + ], + [ + "c680", + "苺苼", + 4, + "茊茋茍茐茒茓茖茘茙茝", + 9, + "茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐" + ], + [ + "c740", + "茾茿荁荂荄荅荈荊", + 4, + "荓荕", + 4, + "荝荢荰", + 6, + "荹荺荾", + 6, + "莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡", + 6, + "莬莭莮" + ], + [ + "c780", + "莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠" + ], + [ + "c840", + "菮華菳", + 4, + "菺菻菼菾菿萀萂萅萇萈萉萊萐萒", + 5, + "萙萚萛萞", + 5, + "萩", + 7, + "萲", + 5, + "萹萺萻萾", + 7, + "葇葈葉" + ], + [ + "c880", + "葊", + 6, + "葒", + 4, + "葘葝葞葟葠葢葤", + 4, + "葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁" + ], + [ + "c940", + "葽", + 4, + "蒃蒄蒅蒆蒊蒍蒏", + 7, + "蒘蒚蒛蒝蒞蒟蒠蒢", + 12, + "蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗" + ], + [ + "c980", + "蓘", + 4, + "蓞蓡蓢蓤蓧", + 4, + "蓭蓮蓯蓱", + 10, + "蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳" + ], + [ + "ca40", + "蔃", + 8, + "蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢", + 8, + "蔭", + 9, + "蔾", + 4, + "蕄蕅蕆蕇蕋", + 10 + ], + [ + "ca80", + "蕗蕘蕚蕛蕜蕝蕟", + 4, + "蕥蕦蕧蕩", + 8, + "蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱" + ], + [ + "cb40", + "薂薃薆薈", + 6, + "薐", + 10, + "薝", + 6, + "薥薦薧薩薫薬薭薱", + 5, + "薸薺", + 6, + "藂", + 6, + "藊", + 4, + "藑藒" + ], + [ + "cb80", + "藔藖", + 5, + "藝", + 6, + "藥藦藧藨藪", + 14, + "恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔" + ], + [ + "cc40", + "藹藺藼藽藾蘀", + 4, + "蘆", + 10, + "蘒蘓蘔蘕蘗", + 15, + "蘨蘪", + 13, + "蘹蘺蘻蘽蘾蘿虀" + ], + [ + "cc80", + "虁", + 11, + "虒虓處", + 4, + "虛虜虝號虠虡虣", + 7, + "獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃" + ], + [ + "cd40", + "虭虯虰虲", + 6, + "蚃", + 6, + "蚎", + 4, + "蚔蚖", + 5, + "蚞", + 4, + "蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻", + 4, + "蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜" + ], + [ + "cd80", + "蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威" + ], + [ + "ce40", + "蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀", + 6, + "蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚", + 5, + "蝡蝢蝦", + 7, + "蝯蝱蝲蝳蝵" + ], + [ + "ce80", + "蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎", + 4, + "螔螕螖螘", + 6, + "螠", + 4, + "巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺" + ], + [ + "cf40", + "螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁", + 4, + "蟇蟈蟉蟌", + 4, + "蟔", + 6, + "蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯", + 9 + ], + [ + "cf80", + "蟺蟻蟼蟽蟿蠀蠁蠂蠄", + 5, + "蠋", + 7, + "蠔蠗蠘蠙蠚蠜", + 4, + "蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓" + ], + [ + "d040", + "蠤", + 13, + "蠳", + 5, + "蠺蠻蠽蠾蠿衁衂衃衆", + 5, + "衎", + 5, + "衕衖衘衚", + 6, + "衦衧衪衭衯衱衳衴衵衶衸衹衺" + ], + [ + "d080", + "衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗", + 4, + "袝", + 4, + "袣袥", + 5, + "小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄" + ], + [ + "d140", + "袬袮袯袰袲", + 4, + "袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚", + 4, + "裠裡裦裧裩", + 6, + "裲裵裶裷裺裻製裿褀褁褃", + 5 + ], + [ + "d180", + "褉褋", + 4, + "褑褔", + 4, + "褜", + 4, + "褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶" + ], + [ + "d240", + "褸", + 8, + "襂襃襅", + 24, + "襠", + 5, + "襧", + 19, + "襼" + ], + [ + "d280", + "襽襾覀覂覄覅覇", + 26, + "摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐" + ], + [ + "d340", + "覢", + 30, + "觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴", + 6 + ], + [ + "d380", + "觻", + 4, + "訁", + 5, + "計", + 21, + "印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉" + ], + [ + "d440", + "訞", + 31, + "訿", + 8, + "詉", + 21 + ], + [ + "d480", + "詟", + 25, + "詺", + 6, + "浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧" + ], + [ + "d540", + "誁", + 7, + "誋", + 7, + "誔", + 46 + ], + [ + "d580", + "諃", + 32, + "铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政" + ], + [ + "d640", + "諤", + 34, + "謈", + 27 + ], + [ + "d680", + "謤謥謧", + 30, + "帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑" + ], + [ + "d740", + "譆", + 31, + "譧", + 4, + "譭", + 25 + ], + [ + "d780", + "讇", + 24, + "讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座" + ], + [ + "d840", + "谸", + 8, + "豂豃豄豅豈豊豋豍", + 7, + "豖豗豘豙豛", + 5, + "豣", + 6, + "豬", + 6, + "豴豵豶豷豻", + 6, + "貃貄貆貇" + ], + [ + "d880", + "貈貋貍", + 6, + "貕貖貗貙", + 20, + "亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝" + ], + [ + "d940", + "貮", + 62 + ], + [ + "d980", + "賭", + 32, + "佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼" + ], + [ + "da40", + "贎", + 14, + "贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸", + 8, + "趂趃趆趇趈趉趌", + 4, + "趒趓趕", + 9, + "趠趡" + ], + [ + "da80", + "趢趤", + 12, + "趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺" + ], + [ + "db40", + "跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾", + 6, + "踆踇踈踋踍踎踐踑踒踓踕", + 7, + "踠踡踤", + 4, + "踫踭踰踲踳踴踶踷踸踻踼踾" + ], + [ + "db80", + "踿蹃蹅蹆蹌", + 4, + "蹓", + 5, + "蹚", + 11, + "蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝" + ], + [ + "dc40", + "蹳蹵蹷", + 4, + "蹽蹾躀躂躃躄躆躈", + 6, + "躑躒躓躕", + 6, + "躝躟", + 11, + "躭躮躰躱躳", + 6, + "躻", + 7 + ], + [ + "dc80", + "軃", + 10, + "軏", + 21, + "堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥" + ], + [ + "dd40", + "軥", + 62 + ], + [ + "dd80", + "輤", + 32, + "荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺" + ], + [ + "de40", + "轅", + 32, + "轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆" + ], + [ + "de80", + "迉", + 4, + "迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖" + ], + [ + "df40", + "這逜連逤逥逧", + 5, + "逰", + 4, + "逷逹逺逽逿遀遃遅遆遈", + 4, + "過達違遖遙遚遜", + 5, + "遤遦遧適遪遫遬遯", + 4, + "遶", + 6, + "遾邁" + ], + [ + "df80", + "還邅邆邇邉邊邌", + 4, + "邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼" + ], + [ + "e040", + "郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅", + 19, + "鄚鄛鄜" + ], + [ + "e080", + "鄝鄟鄠鄡鄤", + 10, + "鄰鄲", + 6, + "鄺", + 8, + "酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼" + ], + [ + "e140", + "酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀", + 4, + "醆醈醊醎醏醓", + 6, + "醜", + 5, + "醤", + 5, + "醫醬醰醱醲醳醶醷醸醹醻" + ], + [ + "e180", + "醼", + 10, + "釈釋釐釒", + 9, + "針", + 8, + "帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺" + ], + [ + "e240", + "釦", + 62 + ], + [ + "e280", + "鈥", + 32, + "狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧", + 5, + "饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂" + ], + [ + "e340", + "鉆", + 45, + "鉵", + 16 + ], + [ + "e380", + "銆", + 7, + "銏", + 24, + "恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾" + ], + [ + "e440", + "銨", + 5, + "銯", + 24, + "鋉", + 31 + ], + [ + "e480", + "鋩", + 32, + "洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑" + ], + [ + "e540", + "錊", + 51, + "錿", + 10 + ], + [ + "e580", + "鍊", + 31, + "鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣" + ], + [ + "e640", + "鍬", + 34, + "鎐", + 27 + ], + [ + "e680", + "鎬", + 29, + "鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩" + ], + [ + "e740", + "鏎", + 7, + "鏗", + 54 + ], + [ + "e780", + "鐎", + 32, + "纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡", + 6, + "缪缫缬缭缯", + 4, + "缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬" + ], + [ + "e840", + "鐯", + 14, + "鐿", + 43, + "鑬鑭鑮鑯" + ], + [ + "e880", + "鑰", + 20, + "钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹" + ], + [ + "e940", + "锧锳锽镃镈镋镕镚镠镮镴镵長", + 7, + "門", + 42 + ], + [ + "e980", + "閫", + 32, + "椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋" + ], + [ + "ea40", + "闌", + 27, + "闬闿阇阓阘阛阞阠阣", + 6, + "阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗" + ], + [ + "ea80", + "陘陙陚陜陝陞陠陣陥陦陫陭", + 4, + "陳陸", + 12, + "隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰" + ], + [ + "eb40", + "隌階隑隒隓隕隖隚際隝", + 9, + "隨", + 7, + "隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖", + 9, + "雡", + 6, + "雫" + ], + [ + "eb80", + "雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗", + 4, + "霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻" + ], + [ + "ec40", + "霡", + 8, + "霫霬霮霯霱霳", + 4, + "霺霻霼霽霿", + 18, + "靔靕靗靘靚靜靝靟靣靤靦靧靨靪", + 7 + ], + [ + "ec80", + "靲靵靷", + 4, + "靽", + 7, + "鞆", + 4, + "鞌鞎鞏鞐鞓鞕鞖鞗鞙", + 4, + "臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐" + ], + [ + "ed40", + "鞞鞟鞡鞢鞤", + 6, + "鞬鞮鞰鞱鞳鞵", + 46 + ], + [ + "ed80", + "韤韥韨韮", + 4, + "韴韷", + 23, + "怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨" + ], + [ + "ee40", + "頏", + 62 + ], + [ + "ee80", + "顎", + 32, + "睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶", + 4, + "钼钽钿铄铈", + 6, + "铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪" + ], + [ + "ef40", + "顯", + 5, + "颋颎颒颕颙颣風", + 37, + "飏飐飔飖飗飛飜飝飠", + 4 + ], + [ + "ef80", + "飥飦飩", + 30, + "铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒", + 4, + "锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤", + 8, + "镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔" + ], + [ + "f040", + "餈", + 4, + "餎餏餑", + 28, + "餯", + 26 + ], + [ + "f080", + "饊", + 9, + "饖", + 12, + "饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨", + 4, + "鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦", + 6, + "鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙" + ], + [ + "f140", + "馌馎馚", + 10, + "馦馧馩", + 47 + ], + [ + "f180", + "駙", + 32, + "瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃" + ], + [ + "f240", + "駺", + 62 + ], + [ + "f280", + "騹", + 32, + "颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒" + ], + [ + "f340", + "驚", + 17, + "驲骃骉骍骎骔骕骙骦骩", + 6, + "骲骳骴骵骹骻骽骾骿髃髄髆", + 4, + "髍髎髏髐髒體髕髖髗髙髚髛髜" + ], + [ + "f380", + "髝髞髠髢髣髤髥髧髨髩髪髬髮髰", + 8, + "髺髼", + 6, + "鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋" + ], + [ + "f440", + "鬇鬉", + 5, + "鬐鬑鬒鬔", + 10, + "鬠鬡鬢鬤", + 10, + "鬰鬱鬳", + 7, + "鬽鬾鬿魀魆魊魋魌魎魐魒魓魕", + 5 + ], + [ + "f480", + "魛", + 32, + "簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤" + ], + [ + "f540", + "魼", + 62 + ], + [ + "f580", + "鮻", + 32, + "酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜" + ], + [ + "f640", + "鯜", + 62 + ], + [ + "f680", + "鰛", + 32, + "觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅", + 5, + "龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞", + 5, + "鲥", + 4, + "鲫鲭鲮鲰", + 7, + "鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋" + ], + [ + "f740", + "鰼", + 62 + ], + [ + "f780", + "鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾", + 4, + "鳈鳉鳑鳒鳚鳛鳠鳡鳌", + 4, + "鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄" + ], + [ + "f840", + "鳣", + 62 + ], + [ + "f880", + "鴢", + 32 + ], + [ + "f940", + "鵃", + 62 + ], + [ + "f980", + "鶂", + 32 + ], + [ + "fa40", + "鶣", + 62 + ], + [ + "fa80", + "鷢", + 32 + ], + [ + "fb40", + "鸃", + 27, + "鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴", + 9, + "麀" + ], + [ + "fb80", + "麁麃麄麅麆麉麊麌", + 5, + "麔", + 8, + "麞麠", + 5, + "麧麨麩麪" + ], + [ + "fc40", + "麫", + 8, + "麵麶麷麹麺麼麿", + 4, + "黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰", + 8, + "黺黽黿", + 6 + ], + [ + "fc80", + "鼆", + 4, + "鼌鼏鼑鼒鼔鼕鼖鼘鼚", + 5, + "鼡鼣", + 8, + "鼭鼮鼰鼱" + ], + [ + "fd40", + "鼲", + 4, + "鼸鼺鼼鼿", + 4, + "齅", + 10, + "齒", + 38 + ], + [ + "fd80", + "齹", + 5, + "龁龂龍", + 11, + "龜龝龞龡", + 4, + "郎凉秊裏隣" + ], + [ + "fe40", + "兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩" + ] +]; + +var cp936$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': cp936 +}); + +var gbkAdded = [ + [ + "a140", + "", + 62 + ], + [ + "a180", + "", + 32 + ], + [ + "a240", + "", + 62 + ], + [ + "a280", + "", + 32 + ], + [ + "a2ab", + "", + 5 + ], + [ + "a2e3", + "€" + ], + [ + "a2ef", + "" + ], + [ + "a2fd", + "" + ], + [ + "a340", + "", + 62 + ], + [ + "a380", + "", + 31, + " " + ], + [ + "a440", + "", + 62 + ], + [ + "a480", + "", + 32 + ], + [ + "a4f4", + "", + 10 + ], + [ + "a540", + "", + 62 + ], + [ + "a580", + "", + 32 + ], + [ + "a5f7", + "", + 7 + ], + [ + "a640", + "", + 62 + ], + [ + "a680", + "", + 32 + ], + [ + "a6b9", + "", + 7 + ], + [ + "a6d9", + "", + 6 + ], + [ + "a6ec", + "" + ], + [ + "a6f3", + "" + ], + [ + "a6f6", + "", + 8 + ], + [ + "a740", + "", + 62 + ], + [ + "a780", + "", + 32 + ], + [ + "a7c2", + "", + 14 + ], + [ + "a7f2", + "", + 12 + ], + [ + "a896", + "", + 10 + ], + [ + "a8bc", + "" + ], + [ + "a8bf", + "ǹ" + ], + [ + "a8c1", + "" + ], + [ + "a8ea", + "", + 20 + ], + [ + "a958", + "" + ], + [ + "a95b", + "" + ], + [ + "a95d", + "" + ], + [ + "a989", + "〾⿰", + 11 + ], + [ + "a997", + "", + 12 + ], + [ + "a9f0", + "", + 14 + ], + [ + "aaa1", + "", + 93 + ], + [ + "aba1", + "", + 93 + ], + [ + "aca1", + "", + 93 + ], + [ + "ada1", + "", + 93 + ], + [ + "aea1", + "", + 93 + ], + [ + "afa1", + "", + 93 + ], + [ + "d7fa", + "", + 4 + ], + [ + "f8a1", + "", + 93 + ], + [ + "f9a1", + "", + 93 + ], + [ + "faa1", + "", + 93 + ], + [ + "fba1", + "", + 93 + ], + [ + "fca1", + "", + 93 + ], + [ + "fda1", + "", + 93 + ], + [ + "fe50", + "⺁⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘㧏㧟㩳㧐㭎㱮㳠⺧⺪䁖䅟⺮䌷⺳⺶⺷䎱䎬⺻䏝䓖䙡䙌" + ], + [ + "fe80", + "䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓", + 6, + "䶮", + 93 + ] +]; + +var gbkAdded$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': gbkAdded +}); + +var uChars = [ + 128, + 165, + 169, + 178, + 184, + 216, + 226, + 235, + 238, + 244, + 248, + 251, + 253, + 258, + 276, + 284, + 300, + 325, + 329, + 334, + 364, + 463, + 465, + 467, + 469, + 471, + 473, + 475, + 477, + 506, + 594, + 610, + 712, + 716, + 730, + 930, + 938, + 962, + 970, + 1026, + 1104, + 1106, + 8209, + 8215, + 8218, + 8222, + 8231, + 8241, + 8244, + 8246, + 8252, + 8365, + 8452, + 8454, + 8458, + 8471, + 8482, + 8556, + 8570, + 8596, + 8602, + 8713, + 8720, + 8722, + 8726, + 8731, + 8737, + 8740, + 8742, + 8748, + 8751, + 8760, + 8766, + 8777, + 8781, + 8787, + 8802, + 8808, + 8816, + 8854, + 8858, + 8870, + 8896, + 8979, + 9322, + 9372, + 9548, + 9588, + 9616, + 9622, + 9634, + 9652, + 9662, + 9672, + 9676, + 9680, + 9702, + 9735, + 9738, + 9793, + 9795, + 11906, + 11909, + 11913, + 11917, + 11928, + 11944, + 11947, + 11951, + 11956, + 11960, + 11964, + 11979, + 12284, + 12292, + 12312, + 12319, + 12330, + 12351, + 12436, + 12447, + 12535, + 12543, + 12586, + 12842, + 12850, + 12964, + 13200, + 13215, + 13218, + 13253, + 13263, + 13267, + 13270, + 13384, + 13428, + 13727, + 13839, + 13851, + 14617, + 14703, + 14801, + 14816, + 14964, + 15183, + 15471, + 15585, + 16471, + 16736, + 17208, + 17325, + 17330, + 17374, + 17623, + 17997, + 18018, + 18212, + 18218, + 18301, + 18318, + 18760, + 18811, + 18814, + 18820, + 18823, + 18844, + 18848, + 18872, + 19576, + 19620, + 19738, + 19887, + 40870, + 59244, + 59336, + 59367, + 59413, + 59417, + 59423, + 59431, + 59437, + 59443, + 59452, + 59460, + 59478, + 59493, + 63789, + 63866, + 63894, + 63976, + 63986, + 64016, + 64018, + 64021, + 64025, + 64034, + 64037, + 64042, + 65074, + 65093, + 65107, + 65112, + 65127, + 65132, + 65375, + 65510, + 65536 +]; +var gbChars = [ + 0, + 36, + 38, + 45, + 50, + 81, + 89, + 95, + 96, + 100, + 103, + 104, + 105, + 109, + 126, + 133, + 148, + 172, + 175, + 179, + 208, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 341, + 428, + 443, + 544, + 545, + 558, + 741, + 742, + 749, + 750, + 805, + 819, + 820, + 7922, + 7924, + 7925, + 7927, + 7934, + 7943, + 7944, + 7945, + 7950, + 8062, + 8148, + 8149, + 8152, + 8164, + 8174, + 8236, + 8240, + 8262, + 8264, + 8374, + 8380, + 8381, + 8384, + 8388, + 8390, + 8392, + 8393, + 8394, + 8396, + 8401, + 8406, + 8416, + 8419, + 8424, + 8437, + 8439, + 8445, + 8482, + 8485, + 8496, + 8521, + 8603, + 8936, + 8946, + 9046, + 9050, + 9063, + 9066, + 9076, + 9092, + 9100, + 9108, + 9111, + 9113, + 9131, + 9162, + 9164, + 9218, + 9219, + 11329, + 11331, + 11334, + 11336, + 11346, + 11361, + 11363, + 11366, + 11370, + 11372, + 11375, + 11389, + 11682, + 11686, + 11687, + 11692, + 11694, + 11714, + 11716, + 11723, + 11725, + 11730, + 11736, + 11982, + 11989, + 12102, + 12336, + 12348, + 12350, + 12384, + 12393, + 12395, + 12397, + 12510, + 12553, + 12851, + 12962, + 12973, + 13738, + 13823, + 13919, + 13933, + 14080, + 14298, + 14585, + 14698, + 15583, + 15847, + 16318, + 16434, + 16438, + 16481, + 16729, + 17102, + 17122, + 17315, + 17320, + 17402, + 17418, + 17859, + 17909, + 17911, + 17915, + 17916, + 17936, + 17939, + 17961, + 18664, + 18703, + 18814, + 18962, + 19043, + 33469, + 33470, + 33471, + 33484, + 33485, + 33490, + 33497, + 33501, + 33505, + 33513, + 33520, + 33536, + 33550, + 37845, + 37921, + 37948, + 38029, + 38038, + 38064, + 38065, + 38066, + 38069, + 38075, + 38076, + 38078, + 39108, + 39109, + 39113, + 39114, + 39115, + 39116, + 39265, + 39394, + 189000 +]; +var gb18030Ranges = { + uChars: uChars, + gbChars: gbChars +}; + +var gb18030Ranges$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + uChars: uChars, + gbChars: gbChars, + 'default': gb18030Ranges +}); + +var cp949 = [ + [ + "0", + "\u0000", + 127 + ], + [ + "8141", + "갂갃갅갆갋", + 4, + "갘갞갟갡갢갣갥", + 6, + "갮갲갳갴" + ], + [ + "8161", + "갵갶갷갺갻갽갾갿걁", + 9, + "걌걎", + 5, + "걕" + ], + [ + "8181", + "걖걗걙걚걛걝", + 18, + "걲걳걵걶걹걻", + 4, + "겂겇겈겍겎겏겑겒겓겕", + 6, + "겞겢", + 5, + "겫겭겮겱", + 6, + "겺겾겿곀곂곃곅곆곇곉곊곋곍", + 7, + "곖곘", + 7, + "곢곣곥곦곩곫곭곮곲곴곷", + 4, + "곾곿괁괂괃괅괇", + 4, + "괎괐괒괓" + ], + [ + "8241", + "괔괕괖괗괙괚괛괝괞괟괡", + 7, + "괪괫괮", + 5 + ], + [ + "8261", + "괶괷괹괺괻괽", + 6, + "굆굈굊", + 5, + "굑굒굓굕굖굗" + ], + [ + "8281", + "굙", + 7, + "굢굤", + 7, + "굮굯굱굲굷굸굹굺굾궀궃", + 4, + "궊궋궍궎궏궑", + 10, + "궞", + 5, + "궥", + 17, + "궸", + 7, + "귂귃귅귆귇귉", + 6, + "귒귔", + 7, + "귝귞귟귡귢귣귥", + 18 + ], + [ + "8341", + "귺귻귽귾긂", + 5, + "긊긌긎", + 5, + "긕", + 7 + ], + [ + "8361", + "긝", + 18, + "긲긳긵긶긹긻긼" + ], + [ + "8381", + "긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗", + 4, + "깞깢깣깤깦깧깪깫깭깮깯깱", + 6, + "깺깾", + 5, + "꺆", + 5, + "꺍", + 46, + "꺿껁껂껃껅", + 6, + "껎껒", + 5, + "껚껛껝", + 8 + ], + [ + "8441", + "껦껧껩껪껬껮", + 5, + "껵껶껷껹껺껻껽", + 8 + ], + [ + "8461", + "꼆꼉꼊꼋꼌꼎꼏꼑", + 18 + ], + [ + "8481", + "꼤", + 7, + "꼮꼯꼱꼳꼵", + 6, + "꼾꽀꽄꽅꽆꽇꽊", + 5, + "꽑", + 10, + "꽞", + 5, + "꽦", + 18, + "꽺", + 5, + "꾁꾂꾃꾅꾆꾇꾉", + 6, + "꾒꾓꾔꾖", + 5, + "꾝", + 26, + "꾺꾻꾽꾾" + ], + [ + "8541", + "꾿꿁", + 5, + "꿊꿌꿏", + 4, + "꿕", + 6, + "꿝", + 4 + ], + [ + "8561", + "꿢", + 5, + "꿪", + 5, + "꿲꿳꿵꿶꿷꿹", + 6, + "뀂뀃" + ], + [ + "8581", + "뀅", + 6, + "뀍뀎뀏뀑뀒뀓뀕", + 6, + "뀞", + 9, + "뀩", + 26, + "끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞", + 29, + "끾끿낁낂낃낅", + 6, + "낎낐낒", + 5, + "낛낝낞낣낤" + ], + [ + "8641", + "낥낦낧낪낰낲낶낷낹낺낻낽", + 6, + "냆냊", + 5, + "냒" + ], + [ + "8661", + "냓냕냖냗냙", + 6, + "냡냢냣냤냦", + 10 + ], + [ + "8681", + "냱", + 22, + "넊넍넎넏넑넔넕넖넗넚넞", + 4, + "넦넧넩넪넫넭", + 6, + "넶넺", + 5, + "녂녃녅녆녇녉", + 6, + "녒녓녖녗녙녚녛녝녞녟녡", + 22, + "녺녻녽녾녿놁놃", + 4, + "놊놌놎놏놐놑놕놖놗놙놚놛놝" + ], + [ + "8741", + "놞", + 9, + "놩", + 15 + ], + [ + "8761", + "놹", + 18, + "뇍뇎뇏뇑뇒뇓뇕" + ], + [ + "8781", + "뇖", + 5, + "뇞뇠", + 7, + "뇪뇫뇭뇮뇯뇱", + 7, + "뇺뇼뇾", + 5, + "눆눇눉눊눍", + 6, + "눖눘눚", + 5, + "눡", + 18, + "눵", + 6, + "눽", + 26, + "뉙뉚뉛뉝뉞뉟뉡", + 6, + "뉪", + 4 + ], + [ + "8841", + "뉯", + 4, + "뉶", + 5, + "뉽", + 6, + "늆늇늈늊", + 4 + ], + [ + "8861", + "늏늒늓늕늖늗늛", + 4, + "늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷" + ], + [ + "8881", + "늸", + 15, + "닊닋닍닎닏닑닓", + 4, + "닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉", + 6, + "댒댖", + 5, + "댝", + 54, + "덗덙덚덝덠덡덢덣" + ], + [ + "8941", + "덦덨덪덬덭덯덲덳덵덶덷덹", + 6, + "뎂뎆", + 5, + "뎍" + ], + [ + "8961", + "뎎뎏뎑뎒뎓뎕", + 10, + "뎢", + 5, + "뎩뎪뎫뎭" + ], + [ + "8981", + "뎮", + 21, + "돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩", + 18, + "돽", + 18, + "됑", + 6, + "됙됚됛됝됞됟됡", + 6, + "됪됬", + 7, + "됵", + 15 + ], + [ + "8a41", + "둅", + 10, + "둒둓둕둖둗둙", + 6, + "둢둤둦" + ], + [ + "8a61", + "둧", + 4, + "둭", + 18, + "뒁뒂" + ], + [ + "8a81", + "뒃", + 4, + "뒉", + 19, + "뒞", + 5, + "뒥뒦뒧뒩뒪뒫뒭", + 7, + "뒶뒸뒺", + 5, + "듁듂듃듅듆듇듉", + 6, + "듑듒듓듔듖", + 5, + "듞듟듡듢듥듧", + 4, + "듮듰듲", + 5, + "듹", + 26, + "딖딗딙딚딝" + ], + [ + "8b41", + "딞", + 5, + "딦딫", + 4, + "딲딳딵딶딷딹", + 6, + "땂땆" + ], + [ + "8b61", + "땇땈땉땊땎땏땑땒땓땕", + 6, + "땞땢", + 8 + ], + [ + "8b81", + "땫", + 52, + "떢떣떥떦떧떩떬떭떮떯떲떶", + 4, + "떾떿뗁뗂뗃뗅", + 6, + "뗎뗒", + 5, + "뗙", + 18, + "뗭", + 18 + ], + [ + "8c41", + "똀", + 15, + "똒똓똕똖똗똙", + 4 + ], + [ + "8c61", + "똞", + 6, + "똦", + 5, + "똭", + 6, + "똵", + 5 + ], + [ + "8c81", + "똻", + 12, + "뙉", + 26, + "뙥뙦뙧뙩", + 50, + "뚞뚟뚡뚢뚣뚥", + 5, + "뚭뚮뚯뚰뚲", + 16 + ], + [ + "8d41", + "뛃", + 16, + "뛕", + 8 + ], + [ + "8d61", + "뛞", + 17, + "뛱뛲뛳뛵뛶뛷뛹뛺" + ], + [ + "8d81", + "뛻", + 4, + "뜂뜃뜄뜆", + 33, + "뜪뜫뜭뜮뜱", + 6, + "뜺뜼", + 7, + "띅띆띇띉띊띋띍", + 6, + "띖", + 9, + "띡띢띣띥띦띧띩", + 6, + "띲띴띶", + 5, + "띾띿랁랂랃랅", + 6, + "랎랓랔랕랚랛랝랞" + ], + [ + "8e41", + "랟랡", + 6, + "랪랮", + 5, + "랶랷랹", + 8 + ], + [ + "8e61", + "럂", + 4, + "럈럊", + 19 + ], + [ + "8e81", + "럞", + 13, + "럮럯럱럲럳럵", + 6, + "럾렂", + 4, + "렊렋렍렎렏렑", + 6, + "렚렜렞", + 5, + "렦렧렩렪렫렭", + 6, + "렶렺", + 5, + "롁롂롃롅", + 11, + "롒롔", + 7, + "롞롟롡롢롣롥", + 6, + "롮롰롲", + 5, + "롹롺롻롽", + 7 + ], + [ + "8f41", + "뢅", + 7, + "뢎", + 17 + ], + [ + "8f61", + "뢠", + 7, + "뢩", + 6, + "뢱뢲뢳뢵뢶뢷뢹", + 4 + ], + [ + "8f81", + "뢾뢿룂룄룆", + 5, + "룍룎룏룑룒룓룕", + 7, + "룞룠룢", + 5, + "룪룫룭룮룯룱", + 6, + "룺룼룾", + 5, + "뤅", + 18, + "뤙", + 6, + "뤡", + 26, + "뤾뤿륁륂륃륅", + 6, + "륍륎륐륒", + 5 + ], + [ + "9041", + "륚륛륝륞륟륡", + 6, + "륪륬륮", + 5, + "륶륷륹륺륻륽" + ], + [ + "9061", + "륾", + 5, + "릆릈릋릌릏", + 15 + ], + [ + "9081", + "릟", + 12, + "릮릯릱릲릳릵", + 6, + "릾맀맂", + 5, + "맊맋맍맓", + 4, + "맚맜맟맠맢맦맧맩맪맫맭", + 6, + "맶맻", + 4, + "먂", + 5, + "먉", + 11, + "먖", + 33, + "먺먻먽먾먿멁멃멄멅멆" + ], + [ + "9141", + "멇멊멌멏멐멑멒멖멗멙멚멛멝", + 6, + "멦멪", + 5 + ], + [ + "9161", + "멲멳멵멶멷멹", + 9, + "몆몈몉몊몋몍", + 5 + ], + [ + "9181", + "몓", + 20, + "몪몭몮몯몱몳", + 4, + "몺몼몾", + 5, + "뫅뫆뫇뫉", + 14, + "뫚", + 33, + "뫽뫾뫿묁묂묃묅", + 7, + "묎묐묒", + 5, + "묙묚묛묝묞묟묡", + 6 + ], + [ + "9241", + "묨묪묬", + 7, + "묷묹묺묿", + 4, + "뭆뭈뭊뭋뭌뭎뭑뭒" + ], + [ + "9261", + "뭓뭕뭖뭗뭙", + 7, + "뭢뭤", + 7, + "뭭", + 4 + ], + [ + "9281", + "뭲", + 21, + "뮉뮊뮋뮍뮎뮏뮑", + 18, + "뮥뮦뮧뮩뮪뮫뮭", + 6, + "뮵뮶뮸", + 7, + "믁믂믃믅믆믇믉", + 6, + "믑믒믔", + 35, + "믺믻믽믾밁" + ], + [ + "9341", + "밃", + 4, + "밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵" + ], + [ + "9361", + "밶밷밹", + 6, + "뱂뱆뱇뱈뱊뱋뱎뱏뱑", + 8 + ], + [ + "9381", + "뱚뱛뱜뱞", + 37, + "벆벇벉벊벍벏", + 4, + "벖벘벛", + 4, + "벢벣벥벦벩", + 6, + "벲벶", + 5, + "벾벿볁볂볃볅", + 7, + "볎볒볓볔볖볗볙볚볛볝", + 22, + "볷볹볺볻볽" + ], + [ + "9441", + "볾", + 5, + "봆봈봊", + 5, + "봑봒봓봕", + 8 + ], + [ + "9461", + "봞", + 5, + "봥", + 6, + "봭", + 12 + ], + [ + "9481", + "봺", + 5, + "뵁", + 6, + "뵊뵋뵍뵎뵏뵑", + 6, + "뵚", + 9, + "뵥뵦뵧뵩", + 22, + "붂붃붅붆붋", + 4, + "붒붔붖붗붘붛붝", + 6, + "붥", + 10, + "붱", + 6, + "붹", + 24 + ], + [ + "9541", + "뷒뷓뷖뷗뷙뷚뷛뷝", + 11, + "뷪", + 5, + "뷱" + ], + [ + "9561", + "뷲뷳뷵뷶뷷뷹", + 6, + "븁븂븄븆", + 5, + "븎븏븑븒븓" + ], + [ + "9581", + "븕", + 6, + "븞븠", + 35, + "빆빇빉빊빋빍빏", + 4, + "빖빘빜빝빞빟빢빣빥빦빧빩빫", + 4, + "빲빶", + 4, + "빾빿뺁뺂뺃뺅", + 6, + "뺎뺒", + 5, + "뺚", + 13, + "뺩", + 14 + ], + [ + "9641", + "뺸", + 23, + "뻒뻓" + ], + [ + "9661", + "뻕뻖뻙", + 6, + "뻡뻢뻦", + 5, + "뻭", + 8 + ], + [ + "9681", + "뻶", + 10, + "뼂", + 5, + "뼊", + 13, + "뼚뼞", + 33, + "뽂뽃뽅뽆뽇뽉", + 6, + "뽒뽓뽔뽖", + 44 + ], + [ + "9741", + "뾃", + 16, + "뾕", + 8 + ], + [ + "9761", + "뾞", + 17, + "뾱", + 7 + ], + [ + "9781", + "뾹", + 11, + "뿆", + 5, + "뿎뿏뿑뿒뿓뿕", + 6, + "뿝뿞뿠뿢", + 89, + "쀽쀾쀿" + ], + [ + "9841", + "쁀", + 16, + "쁒", + 5, + "쁙쁚쁛" + ], + [ + "9861", + "쁝쁞쁟쁡", + 6, + "쁪", + 15 + ], + [ + "9881", + "쁺", + 21, + "삒삓삕삖삗삙", + 6, + "삢삤삦", + 5, + "삮삱삲삷", + 4, + "삾샂샃샄샆샇샊샋샍샎샏샑", + 6, + "샚샞", + 5, + "샦샧샩샪샫샭", + 6, + "샶샸샺", + 5, + "섁섂섃섅섆섇섉", + 6, + "섑섒섓섔섖", + 5, + "섡섢섥섨섩섪섫섮" + ], + [ + "9941", + "섲섳섴섵섷섺섻섽섾섿셁", + 6, + "셊셎", + 5, + "셖셗" + ], + [ + "9961", + "셙셚셛셝", + 6, + "셦셪", + 5, + "셱셲셳셵셶셷셹셺셻" + ], + [ + "9981", + "셼", + 8, + "솆", + 5, + "솏솑솒솓솕솗", + 4, + "솞솠솢솣솤솦솧솪솫솭솮솯솱", + 11, + "솾", + 5, + "쇅쇆쇇쇉쇊쇋쇍", + 6, + "쇕쇖쇙", + 6, + "쇡쇢쇣쇥쇦쇧쇩", + 6, + "쇲쇴", + 7, + "쇾쇿숁숂숃숅", + 6, + "숎숐숒", + 5, + "숚숛숝숞숡숢숣" + ], + [ + "9a41", + "숤숥숦숧숪숬숮숰숳숵", + 16 + ], + [ + "9a61", + "쉆쉇쉉", + 6, + "쉒쉓쉕쉖쉗쉙", + 6, + "쉡쉢쉣쉤쉦" + ], + [ + "9a81", + "쉧", + 4, + "쉮쉯쉱쉲쉳쉵", + 6, + "쉾슀슂", + 5, + "슊", + 5, + "슑", + 6, + "슙슚슜슞", + 5, + "슦슧슩슪슫슮", + 5, + "슶슸슺", + 33, + "싞싟싡싢싥", + 5, + "싮싰싲싳싴싵싷싺싽싾싿쌁", + 6, + "쌊쌋쌎쌏" + ], + [ + "9b41", + "쌐쌑쌒쌖쌗쌙쌚쌛쌝", + 6, + "쌦쌧쌪", + 8 + ], + [ + "9b61", + "쌳", + 17, + "썆", + 7 + ], + [ + "9b81", + "썎", + 25, + "썪썫썭썮썯썱썳", + 4, + "썺썻썾", + 5, + "쎅쎆쎇쎉쎊쎋쎍", + 50, + "쏁", + 22, + "쏚" + ], + [ + "9c41", + "쏛쏝쏞쏡쏣", + 4, + "쏪쏫쏬쏮", + 5, + "쏶쏷쏹", + 5 + ], + [ + "9c61", + "쏿", + 8, + "쐉", + 6, + "쐑", + 9 + ], + [ + "9c81", + "쐛", + 8, + "쐥", + 6, + "쐭쐮쐯쐱쐲쐳쐵", + 6, + "쐾", + 9, + "쑉", + 26, + "쑦쑧쑩쑪쑫쑭", + 6, + "쑶쑷쑸쑺", + 5, + "쒁", + 18, + "쒕", + 6, + "쒝", + 12 + ], + [ + "9d41", + "쒪", + 13, + "쒹쒺쒻쒽", + 8 + ], + [ + "9d61", + "쓆", + 25 + ], + [ + "9d81", + "쓠", + 8, + "쓪", + 5, + "쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂", + 9, + "씍씎씏씑씒씓씕", + 6, + "씝", + 10, + "씪씫씭씮씯씱", + 6, + "씺씼씾", + 5, + "앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩", + 6, + "앲앶", + 5, + "앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔" + ], + [ + "9e41", + "얖얙얚얛얝얞얟얡", + 7, + "얪", + 9, + "얶" + ], + [ + "9e61", + "얷얺얿", + 4, + "엋엍엏엒엓엕엖엗엙", + 6, + "엢엤엦엧" + ], + [ + "9e81", + "엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑", + 6, + "옚옝", + 6, + "옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉", + 6, + "왒왖", + 5, + "왞왟왡", + 10, + "왭왮왰왲", + 5, + "왺왻왽왾왿욁", + 6, + "욊욌욎", + 5, + "욖욗욙욚욛욝", + 6, + "욦" + ], + [ + "9f41", + "욨욪", + 5, + "욲욳욵욶욷욻", + 4, + "웂웄웆", + 5, + "웎" + ], + [ + "9f61", + "웏웑웒웓웕", + 6, + "웞웟웢", + 5, + "웪웫웭웮웯웱웲" + ], + [ + "9f81", + "웳", + 4, + "웺웻웼웾", + 5, + "윆윇윉윊윋윍", + 6, + "윖윘윚", + 5, + "윢윣윥윦윧윩", + 6, + "윲윴윶윸윹윺윻윾윿읁읂읃읅", + 4, + "읋읎읐읙읚읛읝읞읟읡", + 6, + "읩읪읬", + 7, + "읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛", + 4, + "잢잧", + 4, + "잮잯잱잲잳잵잶잷" + ], + [ + "a041", + "잸잹잺잻잾쟂", + 5, + "쟊쟋쟍쟏쟑", + 6, + "쟙쟚쟛쟜" + ], + [ + "a061", + "쟞", + 5, + "쟥쟦쟧쟩쟪쟫쟭", + 13 + ], + [ + "a081", + "쟻", + 4, + "젂젃젅젆젇젉젋", + 4, + "젒젔젗", + 4, + "젞젟젡젢젣젥", + 6, + "젮젰젲", + 5, + "젹젺젻젽젾젿졁", + 6, + "졊졋졎", + 5, + "졕", + 26, + "졲졳졵졶졷졹졻", + 4, + "좂좄좈좉좊좎", + 5, + "좕", + 7, + "좞좠좢좣좤" + ], + [ + "a141", + "좥좦좧좩", + 18, + "좾좿죀죁" + ], + [ + "a161", + "죂죃죅죆죇죉죊죋죍", + 6, + "죖죘죚", + 5, + "죢죣죥" + ], + [ + "a181", + "죦", + 14, + "죶", + 5, + "죾죿줁줂줃줇", + 4, + "줎 、。·‥…¨〃­―∥\∼‘’“”〔〕〈", + 9, + "±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬" + ], + [ + "a241", + "줐줒", + 5, + "줙", + 18 + ], + [ + "a261", + "줭", + 6, + "줵", + 18 + ], + [ + "a281", + "쥈", + 7, + "쥒쥓쥕쥖쥗쥙", + 6, + "쥢쥤", + 7, + "쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®" + ], + [ + "a341", + "쥱쥲쥳쥵", + 6, + "쥽", + 10, + "즊즋즍즎즏" + ], + [ + "a361", + "즑", + 6, + "즚즜즞", + 16 + ], + [ + "a381", + "즯", + 16, + "짂짃짅짆짉짋", + 4, + "짒짔짗짘짛!", + 58, + "₩]", + 32, + " ̄" + ], + [ + "a441", + "짞짟짡짣짥짦짨짩짪짫짮짲", + 5, + "짺짻짽짾짿쨁쨂쨃쨄" + ], + [ + "a461", + "쨅쨆쨇쨊쨎", + 5, + "쨕쨖쨗쨙", + 12 + ], + [ + "a481", + "쨦쨧쨨쨪", + 28, + "ㄱ", + 93 + ], + [ + "a541", + "쩇", + 4, + "쩎쩏쩑쩒쩓쩕", + 6, + "쩞쩢", + 5, + "쩩쩪" + ], + [ + "a561", + "쩫", + 17, + "쩾", + 5, + "쪅쪆" + ], + [ + "a581", + "쪇", + 16, + "쪙", + 14, + "ⅰ", + 9 + ], + [ + "a5b0", + "Ⅰ", + 9 + ], + [ + "a5c1", + "Α", + 16, + "Σ", + 6 + ], + [ + "a5e1", + "α", + 16, + "σ", + 6 + ], + [ + "a641", + "쪨", + 19, + "쪾쪿쫁쫂쫃쫅" + ], + [ + "a661", + "쫆", + 5, + "쫎쫐쫒쫔쫕쫖쫗쫚", + 5, + "쫡", + 6 + ], + [ + "a681", + "쫨쫩쫪쫫쫭", + 6, + "쫵", + 18, + "쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃", + 7 + ], + [ + "a741", + "쬋", + 4, + "쬑쬒쬓쬕쬖쬗쬙", + 6, + "쬢", + 7 + ], + [ + "a761", + "쬪", + 22, + "쭂쭃쭄" + ], + [ + "a781", + "쭅쭆쭇쭊쭋쭍쭎쭏쭑", + 6, + "쭚쭛쭜쭞", + 5, + "쭥", + 7, + "㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙", + 9, + "㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰", + 9, + "㎀", + 4, + "㎺", + 5, + "㎐", + 4, + "Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆" + ], + [ + "a841", + "쭭", + 10, + "쭺", + 14 + ], + [ + "a861", + "쮉", + 18, + "쮝", + 6 + ], + [ + "a881", + "쮤", + 19, + "쮹", + 11, + "ÆÐªĦ" + ], + [ + "a8a6", + "IJ" + ], + [ + "a8a8", + "ĿŁØŒºÞŦŊ" + ], + [ + "a8b1", + "㉠", + 27, + "ⓐ", + 25, + "①", + 14, + "½⅓⅔¼¾⅛⅜⅝⅞" + ], + [ + "a941", + "쯅", + 14, + "쯕", + 10 + ], + [ + "a961", + "쯠쯡쯢쯣쯥쯦쯨쯪", + 18 + ], + [ + "a981", + "쯽", + 14, + "찎찏찑찒찓찕", + 6, + "찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀", + 27, + "⒜", + 25, + "⑴", + 14, + "¹²³⁴ⁿ₁₂₃₄" + ], + [ + "aa41", + "찥찦찪찫찭찯찱", + 6, + "찺찿", + 4, + "챆챇챉챊챋챍챎" + ], + [ + "aa61", + "챏", + 4, + "챖챚", + 5, + "챡챢챣챥챧챩", + 6, + "챱챲" + ], + [ + "aa81", + "챳챴챶", + 29, + "ぁ", + 82 + ], + [ + "ab41", + "첔첕첖첗첚첛첝첞첟첡", + 6, + "첪첮", + 5, + "첶첷첹" + ], + [ + "ab61", + "첺첻첽", + 6, + "쳆쳈쳊", + 5, + "쳑쳒쳓쳕", + 5 + ], + [ + "ab81", + "쳛", + 8, + "쳥", + 6, + "쳭쳮쳯쳱", + 12, + "ァ", + 85 + ], + [ + "ac41", + "쳾쳿촀촂", + 5, + "촊촋촍촎촏촑", + 6, + "촚촜촞촟촠" + ], + [ + "ac61", + "촡촢촣촥촦촧촩촪촫촭", + 11, + "촺", + 4 + ], + [ + "ac81", + "촿", + 28, + "쵝쵞쵟А", + 5, + "ЁЖ", + 25 + ], + [ + "acd1", + "а", + 5, + "ёж", + 25 + ], + [ + "ad41", + "쵡쵢쵣쵥", + 6, + "쵮쵰쵲", + 5, + "쵹", + 7 + ], + [ + "ad61", + "춁", + 6, + "춉", + 10, + "춖춗춙춚춛춝춞춟" + ], + [ + "ad81", + "춠춡춢춣춦춨춪", + 5, + "춱", + 18, + "췅" + ], + [ + "ae41", + "췆", + 5, + "췍췎췏췑", + 16 + ], + [ + "ae61", + "췢", + 5, + "췩췪췫췭췮췯췱", + 6, + "췺췼췾", + 4 + ], + [ + "ae81", + "츃츅츆츇츉츊츋츍", + 6, + "츕츖츗츘츚", + 5, + "츢츣츥츦츧츩츪츫" + ], + [ + "af41", + "츬츭츮츯츲츴츶", + 19 + ], + [ + "af61", + "칊", + 13, + "칚칛칝칞칢", + 5, + "칪칬" + ], + [ + "af81", + "칮", + 5, + "칶칷칹칺칻칽", + 6, + "캆캈캊", + 5, + "캒캓캕캖캗캙" + ], + [ + "b041", + "캚", + 5, + "캢캦", + 5, + "캮", + 12 + ], + [ + "b061", + "캻", + 5, + "컂", + 19 + ], + [ + "b081", + "컖", + 13, + "컦컧컩컪컭", + 6, + "컶컺", + 5, + "가각간갇갈갉갊감", + 7, + "같", + 4, + "갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆" + ], + [ + "b141", + "켂켃켅켆켇켉", + 6, + "켒켔켖", + 5, + "켝켞켟켡켢켣" + ], + [ + "b161", + "켥", + 6, + "켮켲", + 5, + "켹", + 11 + ], + [ + "b181", + "콅", + 14, + "콖콗콙콚콛콝", + 6, + "콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸" + ], + [ + "b241", + "콭콮콯콲콳콵콶콷콹", + 6, + "쾁쾂쾃쾄쾆", + 5, + "쾍" + ], + [ + "b261", + "쾎", + 18, + "쾢", + 5, + "쾩" + ], + [ + "b281", + "쾪", + 5, + "쾱", + 18, + "쿅", + 6, + "깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙" + ], + [ + "b341", + "쿌", + 19, + "쿢쿣쿥쿦쿧쿩" + ], + [ + "b361", + "쿪", + 5, + "쿲쿴쿶", + 5, + "쿽쿾쿿퀁퀂퀃퀅", + 5 + ], + [ + "b381", + "퀋", + 5, + "퀒", + 5, + "퀙", + 19, + "끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫", + 4, + "낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝" + ], + [ + "b441", + "퀮", + 5, + "퀶퀷퀹퀺퀻퀽", + 6, + "큆큈큊", + 5 + ], + [ + "b461", + "큑큒큓큕큖큗큙", + 6, + "큡", + 10, + "큮큯" + ], + [ + "b481", + "큱큲큳큵", + 6, + "큾큿킀킂", + 18, + "뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫", + 4, + "닳담답닷", + 4, + "닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥" + ], + [ + "b541", + "킕", + 14, + "킦킧킩킪킫킭", + 5 + ], + [ + "b561", + "킳킶킸킺", + 5, + "탂탃탅탆탇탊", + 5, + "탒탖", + 4 + ], + [ + "b581", + "탛탞탟탡탢탣탥", + 6, + "탮탲", + 5, + "탹", + 11, + "덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸" + ], + [ + "b641", + "턅", + 7, + "턎", + 17 + ], + [ + "b661", + "턠", + 15, + "턲턳턵턶턷턹턻턼턽턾" + ], + [ + "b681", + "턿텂텆", + 5, + "텎텏텑텒텓텕", + 6, + "텞텠텢", + 5, + "텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗" + ], + [ + "b741", + "텮", + 13, + "텽", + 6, + "톅톆톇톉톊" + ], + [ + "b761", + "톋", + 20, + "톢톣톥톦톧" + ], + [ + "b781", + "톩", + 6, + "톲톴톶톷톸톹톻톽톾톿퇁", + 14, + "래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩" + ], + [ + "b841", + "퇐", + 7, + "퇙", + 17 + ], + [ + "b861", + "퇫", + 8, + "퇵퇶퇷퇹", + 13 + ], + [ + "b881", + "툈툊", + 5, + "툑", + 24, + "륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많", + 4, + "맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼" + ], + [ + "b941", + "툪툫툮툯툱툲툳툵", + 6, + "툾퉀퉂", + 5, + "퉉퉊퉋퉌" + ], + [ + "b961", + "퉍", + 14, + "퉝", + 6, + "퉥퉦퉧퉨" + ], + [ + "b981", + "퉩", + 22, + "튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바", + 4, + "받", + 4, + "밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗" + ], + [ + "ba41", + "튍튎튏튒튓튔튖", + 5, + "튝튞튟튡튢튣튥", + 6, + "튭" + ], + [ + "ba61", + "튮튯튰튲", + 5, + "튺튻튽튾틁틃", + 4, + "틊틌", + 5 + ], + [ + "ba81", + "틒틓틕틖틗틙틚틛틝", + 6, + "틦", + 9, + "틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤" + ], + [ + "bb41", + "틻", + 4, + "팂팄팆", + 5, + "팏팑팒팓팕팗", + 4, + "팞팢팣" + ], + [ + "bb61", + "팤팦팧팪팫팭팮팯팱", + 6, + "팺팾", + 5, + "퍆퍇퍈퍉" + ], + [ + "bb81", + "퍊", + 31, + "빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤" + ], + [ + "bc41", + "퍪", + 17, + "퍾퍿펁펂펃펅펆펇" + ], + [ + "bc61", + "펈펉펊펋펎펒", + 5, + "펚펛펝펞펟펡", + 6, + "펪펬펮" + ], + [ + "bc81", + "펯", + 4, + "펵펶펷펹펺펻펽", + 6, + "폆폇폊", + 5, + "폑", + 5, + "샥샨샬샴샵샷샹섀섄섈섐섕서", + 4, + "섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭" + ], + [ + "bd41", + "폗폙", + 7, + "폢폤", + 7, + "폮폯폱폲폳폵폶폷" + ], + [ + "bd61", + "폸폹폺폻폾퐀퐂", + 5, + "퐉", + 13 + ], + [ + "bd81", + "퐗", + 5, + "퐞", + 25, + "숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰" + ], + [ + "be41", + "퐸", + 7, + "푁푂푃푅", + 14 + ], + [ + "be61", + "푔", + 7, + "푝푞푟푡푢푣푥", + 7, + "푮푰푱푲" + ], + [ + "be81", + "푳", + 4, + "푺푻푽푾풁풃", + 4, + "풊풌풎", + 5, + "풕", + 8, + "쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄", + 6, + "엌엎" + ], + [ + "bf41", + "풞", + 10, + "풪", + 14 + ], + [ + "bf61", + "풹", + 18, + "퓍퓎퓏퓑퓒퓓퓕" + ], + [ + "bf81", + "퓖", + 5, + "퓝퓞퓠", + 7, + "퓩퓪퓫퓭퓮퓯퓱", + 6, + "퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염", + 5, + "옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨" + ], + [ + "c041", + "퓾", + 5, + "픅픆픇픉픊픋픍", + 6, + "픖픘", + 5 + ], + [ + "c061", + "픞", + 25 + ], + [ + "c081", + "픸픹픺픻픾픿핁핂핃핅", + 6, + "핎핐핒", + 5, + "핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응", + 7, + "읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊" + ], + [ + "c141", + "핤핦핧핪핬핮", + 5, + "핶핷핹핺핻핽", + 6, + "햆햊햋" + ], + [ + "c161", + "햌햍햎햏햑", + 19, + "햦햧" + ], + [ + "c181", + "햨", + 31, + "점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓" + ], + [ + "c241", + "헊헋헍헎헏헑헓", + 4, + "헚헜헞", + 5, + "헦헧헩헪헫헭헮" + ], + [ + "c261", + "헯", + 4, + "헶헸헺", + 5, + "혂혃혅혆혇혉", + 6, + "혒" + ], + [ + "c281", + "혖", + 5, + "혝혞혟혡혢혣혥", + 7, + "혮", + 9, + "혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻" + ], + [ + "c341", + "혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝", + 4 + ], + [ + "c361", + "홢", + 4, + "홨홪", + 5, + "홲홳홵", + 11 + ], + [ + "c381", + "횁횂횄횆", + 5, + "횎횏횑횒횓횕", + 7, + "횞횠횢", + 5, + "횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층" + ], + [ + "c441", + "횫횭횮횯횱", + 7, + "횺횼", + 7, + "훆훇훉훊훋" + ], + [ + "c461", + "훍훎훏훐훒훓훕훖훘훚", + 5, + "훡훢훣훥훦훧훩", + 4 + ], + [ + "c481", + "훮훯훱훲훳훴훶", + 5, + "훾훿휁휂휃휅", + 11, + "휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼" + ], + [ + "c541", + "휕휖휗휚휛휝휞휟휡", + 6, + "휪휬휮", + 5, + "휶휷휹" + ], + [ + "c561", + "휺휻휽", + 6, + "흅흆흈흊", + 5, + "흒흓흕흚", + 4 + ], + [ + "c581", + "흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵", + 6, + "흾흿힀힂", + 5, + "힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜" + ], + [ + "c641", + "힍힎힏힑", + 6, + "힚힜힞", + 5 + ], + [ + "c6a1", + "퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁" + ], + [ + "c7a1", + "퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠" + ], + [ + "c8a1", + "혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝" + ], + [ + "caa1", + "伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕" + ], + [ + "cba1", + "匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢" + ], + [ + "cca1", + "瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械" + ], + [ + "cda1", + "棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜" + ], + [ + "cea1", + "科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾" + ], + [ + "cfa1", + "區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴" + ], + [ + "d0a1", + "鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣" + ], + [ + "d1a1", + "朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩", + 5, + "那樂", + 4, + "諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉" + ], + [ + "d2a1", + "納臘蠟衲囊娘廊", + 4, + "乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧", + 5, + "駑魯", + 10, + "濃籠聾膿農惱牢磊腦賂雷尿壘", + 7, + "嫩訥杻紐勒", + 5, + "能菱陵尼泥匿溺多茶" + ], + [ + "d3a1", + "丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃" + ], + [ + "d4a1", + "棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅" + ], + [ + "d5a1", + "蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣" + ], + [ + "d6a1", + "煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼" + ], + [ + "d7a1", + "遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬" + ], + [ + "d8a1", + "立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅" + ], + [ + "d9a1", + "蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文" + ], + [ + "daa1", + "汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑" + ], + [ + "dba1", + "發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖" + ], + [ + "dca1", + "碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦" + ], + [ + "dda1", + "孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥" + ], + [ + "dea1", + "脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索" + ], + [ + "dfa1", + "傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署" + ], + [ + "e0a1", + "胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬" + ], + [ + "e1a1", + "聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁" + ], + [ + "e2a1", + "戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧" + ], + [ + "e3a1", + "嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁" + ], + [ + "e4a1", + "沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額" + ], + [ + "e5a1", + "櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬" + ], + [ + "e6a1", + "旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒" + ], + [ + "e7a1", + "簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳" + ], + [ + "e8a1", + "烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療" + ], + [ + "e9a1", + "窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓" + ], + [ + "eaa1", + "運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜" + ], + [ + "eba1", + "濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼" + ], + [ + "eca1", + "議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄" + ], + [ + "eda1", + "立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長" + ], + [ + "eea1", + "障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱" + ], + [ + "efa1", + "煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖" + ], + [ + "f0a1", + "靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫" + ], + [ + "f1a1", + "踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只" + ], + [ + "f2a1", + "咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯" + ], + [ + "f3a1", + "鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策" + ], + [ + "f4a1", + "責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢" + ], + [ + "f5a1", + "椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃" + ], + [ + "f6a1", + "贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託" + ], + [ + "f7a1", + "鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑" + ], + [ + "f8a1", + "阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃" + ], + [ + "f9a1", + "品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航" + ], + [ + "faa1", + "行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型" + ], + [ + "fba1", + "形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵" + ], + [ + "fca1", + "禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆" + ], + [ + "fda1", + "爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰" + ] +]; + +var cp949$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': cp949 +}); + +var cp950 = [ + [ + "0", + "\u0000", + 127 + ], + [ + "a140", + " ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚" + ], + [ + "a1a1", + "﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢", + 4, + "~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/" + ], + [ + "a240", + "\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁", + 7, + "▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭" + ], + [ + "a2a1", + "╮╰╯═╞╪╡◢◣◥◤╱╲╳0", + 9, + "Ⅰ", + 9, + "〡", + 8, + "十卄卅A", + 25, + "a", + 21 + ], + [ + "a340", + "wxyzΑ", + 16, + "Σ", + 6, + "α", + 16, + "σ", + 6, + "ㄅ", + 10 + ], + [ + "a3a1", + "ㄐ", + 25, + "˙ˉˊˇˋ" + ], + [ + "a3e1", + "€" + ], + [ + "a440", + "一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才" + ], + [ + "a4a1", + "丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙" + ], + [ + "a540", + "世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外" + ], + [ + "a5a1", + "央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全" + ], + [ + "a640", + "共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年" + ], + [ + "a6a1", + "式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣" + ], + [ + "a740", + "作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍" + ], + [ + "a7a1", + "均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠" + ], + [ + "a840", + "杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒" + ], + [ + "a8a1", + "芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵" + ], + [ + "a940", + "咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居" + ], + [ + "a9a1", + "屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊" + ], + [ + "aa40", + "昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠" + ], + [ + "aaa1", + "炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附" + ], + [ + "ab40", + "陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品" + ], + [ + "aba1", + "哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷" + ], + [ + "ac40", + "拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗" + ], + [ + "aca1", + "活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄" + ], + [ + "ad40", + "耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥" + ], + [ + "ada1", + "迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪" + ], + [ + "ae40", + "哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙" + ], + [ + "aea1", + "恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓" + ], + [ + "af40", + "浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷" + ], + [ + "afa1", + "砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃" + ], + [ + "b040", + "虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡" + ], + [ + "b0a1", + "陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀" + ], + [ + "b140", + "娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽" + ], + [ + "b1a1", + "情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺" + ], + [ + "b240", + "毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶" + ], + [ + "b2a1", + "瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼" + ], + [ + "b340", + "莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途" + ], + [ + "b3a1", + "部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠" + ], + [ + "b440", + "婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍" + ], + [ + "b4a1", + "插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋" + ], + [ + "b540", + "溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘" + ], + [ + "b5a1", + "窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁" + ], + [ + "b640", + "詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑" + ], + [ + "b6a1", + "間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼" + ], + [ + "b740", + "媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業" + ], + [ + "b7a1", + "楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督" + ], + [ + "b840", + "睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫" + ], + [ + "b8a1", + "腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊" + ], + [ + "b940", + "辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴" + ], + [ + "b9a1", + "飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇" + ], + [ + "ba40", + "愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢" + ], + [ + "baa1", + "滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬" + ], + [ + "bb40", + "罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤" + ], + [ + "bba1", + "說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜" + ], + [ + "bc40", + "劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂" + ], + [ + "bca1", + "慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃" + ], + [ + "bd40", + "瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯" + ], + [ + "bda1", + "翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞" + ], + [ + "be40", + "輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉" + ], + [ + "bea1", + "鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡" + ], + [ + "bf40", + "濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊" + ], + [ + "bfa1", + "縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚" + ], + [ + "c040", + "錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇" + ], + [ + "c0a1", + "嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬" + ], + [ + "c140", + "瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪" + ], + [ + "c1a1", + "薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁" + ], + [ + "c240", + "駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘" + ], + [ + "c2a1", + "癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦" + ], + [ + "c340", + "鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸" + ], + [ + "c3a1", + "獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類" + ], + [ + "c440", + "願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼" + ], + [ + "c4a1", + "纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴" + ], + [ + "c540", + "護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬" + ], + [ + "c5a1", + "禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒" + ], + [ + "c640", + "讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲" + ], + [ + "c940", + "乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕" + ], + [ + "c9a1", + "氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋" + ], + [ + "ca40", + "汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘" + ], + [ + "caa1", + "吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇" + ], + [ + "cb40", + "杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓" + ], + [ + "cba1", + "芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢" + ], + [ + "cc40", + "坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋" + ], + [ + "cca1", + "怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲" + ], + [ + "cd40", + "泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺" + ], + [ + "cda1", + "矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏" + ], + [ + "ce40", + "哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛" + ], + [ + "cea1", + "峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺" + ], + [ + "cf40", + "柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂" + ], + [ + "cfa1", + "洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀" + ], + [ + "d040", + "穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪" + ], + [ + "d0a1", + "苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱" + ], + [ + "d140", + "唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧" + ], + [ + "d1a1", + "恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤" + ], + [ + "d240", + "毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸" + ], + [ + "d2a1", + "牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐" + ], + [ + "d340", + "笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢" + ], + [ + "d3a1", + "荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐" + ], + [ + "d440", + "酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅" + ], + [ + "d4a1", + "唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏" + ], + [ + "d540", + "崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟" + ], + [ + "d5a1", + "捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉" + ], + [ + "d640", + "淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏" + ], + [ + "d6a1", + "痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟" + ], + [ + "d740", + "耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷" + ], + [ + "d7a1", + "蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪" + ], + [ + "d840", + "釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷" + ], + [ + "d8a1", + "堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔" + ], + [ + "d940", + "惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒" + ], + [ + "d9a1", + "晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞" + ], + [ + "da40", + "湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖" + ], + [ + "daa1", + "琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥" + ], + [ + "db40", + "罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳" + ], + [ + "dba1", + "菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺" + ], + [ + "dc40", + "軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈" + ], + [ + "dca1", + "隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆" + ], + [ + "dd40", + "媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤" + ], + [ + "dda1", + "搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼" + ], + [ + "de40", + "毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓" + ], + [ + "dea1", + "煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓" + ], + [ + "df40", + "稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯" + ], + [ + "dfa1", + "腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤" + ], + [ + "e040", + "觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿" + ], + [ + "e0a1", + "遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠" + ], + [ + "e140", + "凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠" + ], + [ + "e1a1", + "寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉" + ], + [ + "e240", + "榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊" + ], + [ + "e2a1", + "漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓" + ], + [ + "e340", + "禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞" + ], + [ + "e3a1", + "耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻" + ], + [ + "e440", + "裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍" + ], + [ + "e4a1", + "銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘" + ], + [ + "e540", + "噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉" + ], + [ + "e5a1", + "憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒" + ], + [ + "e640", + "澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙" + ], + [ + "e6a1", + "獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟" + ], + [ + "e740", + "膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢" + ], + [ + "e7a1", + "蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧" + ], + [ + "e840", + "踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓" + ], + [ + "e8a1", + "銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮" + ], + [ + "e940", + "噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺" + ], + [ + "e9a1", + "憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸" + ], + [ + "ea40", + "澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙" + ], + [ + "eaa1", + "瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘" + ], + [ + "eb40", + "蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠" + ], + [ + "eba1", + "諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌" + ], + [ + "ec40", + "錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕" + ], + [ + "eca1", + "魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎" + ], + [ + "ed40", + "檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶" + ], + [ + "eda1", + "瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞" + ], + [ + "ee40", + "蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞" + ], + [ + "eea1", + "謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜" + ], + [ + "ef40", + "鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰" + ], + [ + "efa1", + "鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶" + ], + [ + "f040", + "璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒" + ], + [ + "f0a1", + "臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧" + ], + [ + "f140", + "蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪" + ], + [ + "f1a1", + "鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰" + ], + [ + "f240", + "徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛" + ], + [ + "f2a1", + "礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕" + ], + [ + "f340", + "譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦" + ], + [ + "f3a1", + "鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲" + ], + [ + "f440", + "嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩" + ], + [ + "f4a1", + "禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿" + ], + [ + "f540", + "鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛" + ], + [ + "f5a1", + "鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥" + ], + [ + "f640", + "蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺" + ], + [ + "f6a1", + "騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚" + ], + [ + "f740", + "糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊" + ], + [ + "f7a1", + "驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾" + ], + [ + "f840", + "讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏" + ], + [ + "f8a1", + "齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚" + ], + [ + "f940", + "纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊" + ], + [ + "f9a1", + "龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓" + ] +]; + +var cp950$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': cp950 +}); + +var big5Added = [ + [ + "8740", + "䏰䰲䘃䖦䕸𧉧䵷䖳𧲱䳢𧳅㮕䜶䝄䱇䱀𤊿𣘗𧍒𦺋𧃒䱗𪍑䝏䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡晍囻" + ], + [ + "8767", + "綕夝𨮹㷴霴𧯯寛𡵞媤㘥𩺰嫑宷峼杮薓𩥅瑡璝㡵𡵓𣚞𦀡㻬" + ], + [ + "87a1", + "𥣞㫵竼龗𤅡𨤍𣇪𠪊𣉞䌊蒄龖鐯䤰蘓墖靊鈘秐稲晠権袝瑌篅枂稬剏遆㓦珄𥶹瓆鿇垳䤯呌䄱𣚎堘穲𧭥讏䚮𦺈䆁𥶙箮𢒼鿈𢓁𢓉𢓌鿉蔄𣖻䂴鿊䓡𪷿拁灮鿋" + ], + [ + "8840", + "㇀", + 4, + "𠄌㇅𠃑𠃍㇆㇇𠃋𡿨㇈𠃊㇉㇊㇋㇌𠄎㇍㇎ĀÁǍÀĒÉĚÈŌÓǑÒ࿿Ê̄Ế࿿Ê̌ỀÊāáǎàɑēéěèīíǐìōóǒòūúǔùǖǘǚ" + ], + [ + "88a1", + "ǜü࿿ê̄ế࿿ê̌ềêɡ⏚⏛" + ], + [ + "8940", + "𪎩𡅅" + ], + [ + "8943", + "攊" + ], + [ + "8946", + "丽滝鵎釟" + ], + [ + "894c", + "𧜵撑会伨侨兖兴农凤务动医华发变团声处备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织经统缆缷艺苏药视设询车轧轮" + ], + [ + "89a1", + "琑糼緍楆竉刧" + ], + [ + "89ab", + "醌碸酞肼" + ], + [ + "89b0", + "贋胶𠧧" + ], + [ + "89b5", + "肟黇䳍鷉鸌䰾𩷶𧀎鸊𪄳㗁" + ], + [ + "89c1", + "溚舾甙" + ], + [ + "89c5", + "䤑马骏龙禇𨑬𡷊𠗐𢫦两亁亀亇亿仫伷㑌侽㹈倃傈㑽㒓㒥円夅凛凼刅争剹劐匧㗇厩㕑厰㕓参吣㕭㕲㚁咓咣咴咹哐哯唘唣唨㖘唿㖥㖿嗗㗅" + ], + [ + "8a40", + "𧶄唥" + ], + [ + "8a43", + "𠱂𠴕𥄫喐𢳆㧬𠍁蹆𤶸𩓥䁓𨂾睺𢰸㨴䟕𨅝𦧲𤷪擝𠵼𠾴𠳕𡃴撍蹾𠺖𠰋𠽤𢲩𨉖𤓓" + ], + [ + "8a64", + "𠵆𩩍𨃩䟴𤺧𢳂骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕" + ], + [ + "8a76", + "䏙𦂥撴哣𢵌𢯊𡁷㧻𡁯" + ], + [ + "8aa1", + "𦛚𦜖𧦠擪𥁒𠱃蹨𢆡𨭌𠜱" + ], + [ + "8aac", + "䠋𠆩㿺塳𢶍" + ], + [ + "8ab2", + "𤗈𠓼𦂗𠽌𠶖啹䂻䎺" + ], + [ + "8abb", + "䪴𢩦𡂝膪飵𠶜捹㧾𢝵跀嚡摼㹃" + ], + [ + "8ac9", + "𪘁𠸉𢫏𢳉" + ], + [ + "8ace", + "𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻" + ], + [ + "8adf", + "𧕴𢺋𢈈𪙛𨳍𠹺𠰴𦠜羓𡃏𢠃𢤹㗻𥇣𠺌𠾍𠺪㾓𠼰𠵇𡅏𠹌" + ], + [ + "8af6", + "𠺫𠮩𠵈𡃀𡄽㿹𢚖搲𠾭" + ], + [ + "8b40", + "𣏴𧘹𢯎𠵾𠵿𢱑𢱕㨘𠺘𡃇𠼮𪘲𦭐𨳒𨶙𨳊閪哌苄喹" + ], + [ + "8b55", + "𩻃鰦骶𧝞𢷮煀腭胬尜𦕲脴㞗卟𨂽醶𠻺𠸏𠹷𠻻㗝𤷫㘉𠳖嚯𢞵𡃉𠸐𠹸𡁸𡅈𨈇𡑕𠹹𤹐𢶤婔𡀝𡀞𡃵𡃶垜𠸑" + ], + [ + "8ba1", + "𧚔𨋍𠾵𠹻𥅾㜃𠾶𡆀𥋘𪊽𤧚𡠺𤅷𨉼墙剨㘚𥜽箲孨䠀䬬鼧䧧鰟鮍𥭴𣄽嗻㗲嚉丨夂𡯁屮靑𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺灬爫丬犭𤣩罒礻糹罓𦉪㓁" + ], + [ + "8bde", + "𦍋耂肀𦘒𦥑卝衤见𧢲讠贝钅镸长门𨸏韦页风飞饣𩠐鱼鸟黄歯龜丷𠂇阝户钢" + ], + [ + "8c40", + "倻淾𩱳龦㷉袏𤅎灷峵䬠𥇍㕙𥴰愢𨨲辧釶熑朙玺𣊁𪄇㲋𡦀䬐磤琂冮𨜏䀉橣𪊺䈣蘏𠩯稪𩥇𨫪靕灍匤𢁾鏴盙𨧣龧矝亣俰傼丯众龨吴綋墒壐𡶶庒庙忂𢜒斋" + ], + [ + "8ca1", + "𣏹椙橃𣱣泿" + ], + [ + "8ca7", + "爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩袐龪躹龫迏蕟駠鈡龬𨶹𡐿䁱䊢娚" + ], + [ + "8cc9", + "顨杫䉶圽" + ], + [ + "8cce", + "藖𤥻芿𧄍䲁𦵴嵻𦬕𦾾龭龮宖龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶" + ], + [ + "8ce6", + "峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤𦱁諌侴𠈹妿腬顖𩣺弻" + ], + [ + "8d40", + "𠮟" + ], + [ + "8d42", + "𢇁𨥭䄂䚻𩁹㼇龳𪆵䃸㟖䛷𦱆䅼𨚲𧏿䕭㣔𥒚䕡䔛䶉䱻䵶䗪㿈𤬏㙡䓞䒽䇭崾嵈嵖㷼㠏嶤嶹㠠㠸幂庽弥徃㤈㤔㤿㥍惗愽峥㦉憷憹懏㦸戬抐拥挘㧸嚱" + ], + [ + "8da1", + "㨃揢揻搇摚㩋擀崕嘡龟㪗斆㪽旿晓㫲暒㬢朖㭂枤栀㭘桊梄㭲㭱㭻椉楃牜楤榟榅㮼槖㯝橥橴橱檂㯬檙㯲檫檵櫔櫶殁毁毪汵沪㳋洂洆洦涁㳯涤涱渕渘温溆𨧀溻滢滚齿滨滩漤漴㵆𣽁澁澾㵪㵵熷岙㶊瀬㶑灐灔灯灿炉𠌥䏁㗱𠻘" + ], + [ + "8e40", + "𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑𦒍䇊竚竝竪䇯咲𥰁笋筕笩𥌎𥳾箢筯莜𥮴𦱿篐萡箒箸𥴠㶭𥱥蒒篺簆簵𥳁籄粃𤢂粦晽𤕸糉糇糦籴糳糵糎" + ], + [ + "8ea1", + "繧䔝𦹄絝𦻖璍綉綫焵綳緒𤁗𦀩緤㴓緵𡟹緥𨍭縝𦄡𦅚繮纒䌫鑬縧罀罁罇礶𦋐駡羗𦍑羣𡙡𠁨䕜𣝦䔃𨌺翺𦒉者耈耝耨耯𪂇𦳃耻耼聡𢜔䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩𠬍𦩒𣵾俹𡓽蓢荢𦬊𤦧𣔰𡝳𣷸芪椛芳䇛" + ], + [ + "8f40", + "蕋苐茚𠸖𡞴㛁𣅽𣕚艻苢茘𣺋𦶣𦬅𦮗𣗎㶿茝嗬莅䔋𦶥莬菁菓㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘蒨𦮖𦹷𦹃蓞萏莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖" + ], + [ + "8fa1", + "𨘥𨘻藁𧂈蘂𡖂𧃍䕫䕪蘨㙈𡢢号𧎚虾蝱𪃸蟮𢰧螱蟚蠏噡虬桖䘏衅衆𧗠𣶹𧗤衞袜䙛袴袵揁装睷𧜏覇覊覦覩覧覼𨨥觧𧤤𧪽誜瞓釾誐𧩙竩𧬺𣾏䜓𧬸煼謌謟𥐰𥕥謿譌譍誩𤩺讐讛誯𡛟䘕衏貛𧵔𧶏貫㜥𧵓賖𧶘𧶽贒贃𡤐賛灜贑𤳉㻐起" + ], + [ + "9040", + "趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭𨍥𨐒辥錃𪊟𠩐辳䤪𨧞𨔽𣶻廸𣉢迹𪀔𨚼𨔁𢌥㦀𦻗逷𨔼𧪾遡𨕬𨘋邨𨜓郄𨛦邮都酧㫰醩釄粬𨤳𡺉鈎沟鉁鉢𥖹銹𨫆𣲛𨬌𥗛" + ], + [ + "90a1", + "𠴱錬鍫𨫡𨯫炏嫃𨫢𨫥䥥鉄𨯬𨰹𨯿鍳鑛躼閅閦鐦閠濶䊹𢙺𨛘𡉼𣸮䧟氜陻隖䅬隣𦻕懚隶磵𨫠隽双䦡𦲸𠉴𦐐𩂯𩃥𤫑𡤕𣌊霱虂霶䨏䔽䖅𤫩灵孁霛靜𩇕靗孊𩇫靟鐥僐𣂷𣂼鞉鞟鞱鞾韀韒韠𥑬韮琜𩐳響韵𩐝𧥺䫑頴頳顋顦㬎𧅵㵑𠘰𤅜" + ], + [ + "9140", + "𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬鍸餹𤨩䭲𩡗𩤅駵騌騻騐驘𥜥㛄𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃𣁽魐魀𩴾婅𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈" + ], + [ + "91a1", + "鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴麐麕麞麢䴴麪麯𤍤黁㭠㧥㴝伲㞾𨰫鼂鼈䮖鐤𦶢鼗鼖鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸𤍈𤩑玞𨯚𡣺禟𨥾𨸶鍩鏳𨩄鋬鎁鏋𨥬𤒹爗㻫睲穃烐𤑳𤏸煾𡟯炣𡢾𣖙㻇𡢅𥐯𡟸㜢𡛻𡠹㛡𡝴𡣑𥽋㜣𡛀坛𤨥𡏾𡊨" + ], + [ + "9240", + "𡏆𡒶蔃𣚦蔃葕𤦔𧅥𣸱𥕜𣻻𧁒䓴𣛮𩦝𦼦柹㜳㰕㷧塬𡤢栐䁗𣜿𤃡𤂋𤄏𦰡哋嚞𦚱嚒𠿟𠮨𠸍鏆𨬓鎜仸儫㠙𤐶亼𠑥𠍿佋侊𥙑婨𠆫𠏋㦙𠌊𠐔㐵伩𠋀𨺳𠉵諚𠈌亘" + ], + [ + "92a1", + "働儍侢伃𤨎𣺊佂倮偬傁俌俥偘僼兙兛兝兞湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠䓝𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡鍮䙺熌𤎌𠰠𤦬𡃤槑𠸝瑹㻞璙琔瑖玘䮎𤪼𤂍叐㖄爏𤃉喴𠍅响𠯆圝鉝雴鍦埝垍坿㘾壋媙𨩆𡛺𡝯𡜐娬妸銏婾嫏娒𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃" + ], + [ + "9340", + "媁𨯗𠐓鏠璌𡌃焅䥲鐈𨧻鎽㞠尞岞幞幈𡦖𡥼𣫮廍孏𡤃𡤄㜁𡢠㛝𡛾㛓脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠恾𢡠𢘫忛㺸𢖯𢖾𩂈𦽳懀𠀾𠁆𢘛憙憘恵𢲛𢴇𤛔𩅍" + ], + [ + "93a1", + "摱𤙥𢭪㨩𢬢𣑐𩣪𢹸挷𪑛撶挱揑𤧣𢵧护𢲡搻敫楲㯴𣂎𣊭𤦉𣊫唍𣋠𡣙𩐿曎𣊉𣆳㫠䆐𥖄𨬢𥖏𡛼𥕛𥐥磮𣄃𡠪𣈴㑤𣈏𣆂𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢𣏾瓐㮖枏𤘪梶栞㯄檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋" + ], + [ + "9440", + "銉𨀞𨧜鑧涥漋𤧬浧𣽿㶏渄𤀼娽渊塇洤硂焻𤌚𤉶烱牐犇犔𤞏𤜥兹𤪤𠗫瑺𣻸𣙟𤩊𤤗𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌琼鎇琷䒟𦷪䕑疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻" + ], + [ + "94a1", + "㷍𤩎㻿𤧅𤣳釺圲鍂𨫣𡡤僟𥈡𥇧睸𣈲眎眏睻𤚗𣞁㩞𤣰琸璛㺿𤪺𤫇䃈𤪖𦆮錇𥖁砞碍碈磒珐祙𧝁𥛣䄎禛蒖禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺𡝮㖗啫㕰㚪𠇔𠰍竢婙𢛵𥪯𥪜娍𠉛磰娪𥯆竾䇹籝籭䈑𥮳𥺼𥺦糍𤧹𡞰粎籼粮檲緜縇緓罎𦉡" + ], + [ + "9540", + "𦅜𧭈綗𥺂䉪𦭵𠤖柖𠁎𣗏埄𦐒𦏸𤥢翝笧𠠬𥫩𥵃笌𥸎駦虅驣樜𣐿㧢𤧷𦖭騟𦖠蒀𧄧𦳑䓪脷䐂胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧蘐𧈛媆䅿𡡀嬫𡢡嫤𡣘蚠蜨𣶏蠭𧐢娂" + ], + [ + "95a1", + "衮佅袇袿裦襥襍𥚃襔𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵䛏㟲訽訜𩑈彍鈫𤊄旔焩烄𡡅鵭貟賩𧷜妚矃姰䍮㛔踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻邗啱䤆醻鐄𨩋䁢𨫼鐧𨰝𨰻蓥訫閙閧閗閖𨴴瑅㻂𤣿𤩂𤏪㻧𣈥随𨻧𨹦𨹥㻌𤧭𤩸𣿮琒瑫㻼靁𩂰" + ], + [ + "9640", + "桇䨝𩂓𥟟靝鍨𨦉𨰦𨬯𦎾銺嬑譩䤼珹𤈛鞛靱餸𠼦巁𨯅𤪲頟𩓚鋶𩗗釥䓀𨭐𤩧𨭤飜𨩅㼀鈪䤥萔餻饍𧬆㷽馛䭯馪驜𨭥𥣈檏騡嫾騯𩣱䮐𩥈馼䮽䮗鍽塲𡌂堢𤦸" + ], + [ + "96a1", + "𡓨硄𢜟𣶸棅㵽鑘㤧慐𢞁𢥫愇鱏鱓鱻鰵鰐魿鯏𩸭鮟𪇵𪃾鴡䲮𤄄鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰萠藮𦸀𣟗𦁤秢𣖜𣙀䤭𤧞㵢鏛銾鍈𠊿碹鉷鑍俤㑀遤𥕝砽硔碶硋𡝗𣇉𤥁㚚佲濚濙瀞瀞吔𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗嬨𡞵𨩉" + ], + [ + "9740", + "愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖𠼝葲𦳀𡐓𤋺𢰦𤏁妔𣶷𦝁綨𦅛𦂤𤦹𤦋𨧺鋥珢㻩璴𨭣𡢟㻡𤪳櫘珳珻㻖𤨾𤪔𡟙𤩦𠎧𡐤𤧥瑈𤤖炥𤥶銄珦鍟𠓾錱𨫎𨨖鎆𨯧𥗕䤵𨪂煫" + ], + [ + "97a1", + "𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂𤩐𡡒䔮鐁㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹𨪁𡡢鍴㳍𠪴䪖㦊僴㵩㵌𡎜煵䋻𨈘渏𩃤䓫浗𧹏灧沯㳖𣿭𣸭渂漌㵯𠏵畑㚼㓈䚀㻚䡱姄鉮䤾轁𨰜𦯀堒埈㛖𡑒烾𤍢𤩱𢿣𡊰𢎽梹楧𡎘𣓥𧯴𣛟𨪃𣟖𣏺𤲟樚𣚭𦲷萾䓟䓎" + ], + [ + "9840", + "𦴦𦵑𦲂𦿞漗𧄉茽𡜺菭𦲀𧁓𡟛妉媂𡞳婡婱𡤅𤇼㜭姯𡜼㛇熎鎐暚𤊥婮娫𤊓樫𣻹𧜶𤑛𤋊焝𤉙𨧡侰𦴨峂𤓎𧹍𤎽樌𤉖𡌄炦焳𤏩㶥泟勇𤩏繥姫崯㷳彜𤩝𡟟綤萦" + ], + [ + "98a1", + "咅𣫺𣌀𠈔坾𠣕𠘙㿥𡾞𪊶瀃𩅛嵰玏糓𨩙𩐠俈翧狍猐𧫴猸猹𥛶獁獈㺩𧬘遬燵𤣲珡臶㻊県㻑沢国琙琞琟㻢㻰㻴㻺瓓㼎㽓畂畭畲疍㽼痈痜㿀癍㿗癴㿜発𤽜熈嘣覀塩䀝睃䀹条䁅㗛瞘䁪䁯属瞾矋売砘点砜䂨砹硇硑硦葈𥔵礳栃礲䄃" + ], + [ + "9940", + "䄉禑禙辻稆込䅧窑䆲窼艹䇄竏竛䇏両筢筬筻簒簛䉠䉺类粜䊌粸䊔糭输烀𠳏総緔緐緽羮羴犟䎗耠耥笹耮耱联㷌垴炠肷胩䏭脌猪脎脒畠脔䐁㬹腖腙腚" + ], + [ + "99a1", + "䐓堺腼膄䐥膓䐭膥埯臁臤艔䒏芦艶苊苘苿䒰荗险榊萅烵葤惣蒈䔄蒾蓡蓸蔐蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘坔蹱嗵躰䠷軎転軤軭軲辷迁迊迌逳駄䢭飠鈓䤞鈨鉘鉫銱銮銿" + ], + [ + "9a40", + "鋣鋫鋳鋴鋽鍃鎄鎭䥅䥑麿鐗匁鐝鐭鐾䥪鑔鑹锭関䦧间阳䧥枠䨤靀䨵鞲韂噔䫤惨颹䬙飱塄餎餙冴餜餷饂饝饢䭰駅䮝騼鬏窃魩鮁鯝鯱鯴䱭鰠㝯𡯂鵉鰺" + ], + [ + "9aa1", + "黾噐鶓鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀铁㞹𠗕𠘕𠙶𡚺块煳𠫂𠫍𠮿呪吆𠯋咞𠯻𠰻𠱓𠱥𠱼惧𠲍噺𠲵𠳝𠳭𠵯𠶲𠷈楕鰯螥𠸄𠸎𠻗𠾐𠼭𠹳尠𠾼帋𡁜𡁏𡁶朞𡁻𡂈𡂖㙇𡂿𡃓𡄯𡄻卤蒭𡋣𡍵𡌶讁𡕷𡘙𡟃𡟇乸炻𡠭𡥪" + ], + [ + "9b40", + "𡨭𡩅𡰪𡱰𡲬𡻈拃𡻕𡼕熘桕𢁅槩㛈𢉼𢏗𢏺𢜪𢡱𢥏苽𢥧𢦓𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌" + ], + [ + "9b62", + "𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳𣁦𣌟𣏞徱晈暿𧩹𣕧𣗳爁𤦺矗𣘚𣜖纇𠍆墵朎" + ], + [ + "9ba1", + "椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚䣐䪸𤄙𨪚𤋮𤌍𤀻𤌴𤎖𤩅𠗊凒𠘑妟𡺨㮾𣳿𤐄𤓖垈𤙴㦛𤜯𨗨𩧉㝢𢇃譞𨭎駖𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆𠝹軚𥀬劏圿煱𥊙𥐙𣽊𤪧喼𥑆𥑮𦭒釔㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿𥡝偦㓻𣏌惞𥤃䝼𨥈𥪮𥮉𥰆𡶐垡煑澶𦄂𧰒遖𦆲𤾚譢𦐂𦑊" + ], + [ + "9c40", + "嵛𦯷輶𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧晉侻嚹𤔡𦛼乪𤤴陖涏𦲽㘘襷𦞙𦡮𦐑𦡞營𦣇筂𩃀𠨑𦤦鄄𦤹穅鷰𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙菏𦮝䛐𦲤画补𦶮墶" + ], + [ + "9ca1", + "㜜𢖍𧁋𧇍㱔𧊀𧊅銁𢅺𧊋錰𧋦𤧐氹钟𧑐𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹尐秣䔿暶𩲭𩢤襃𧟌𧡘囖䃟𡘊㦡𣜯𨃨𡏅熭荦𧧝𩆨婧䲷𧂯𨦫𧧽𧨊𧬋𧵦𤅺筃祾𨀉澵𪋟樃𨌘厢𦸇鎿栶靝𨅯𨀣𦦵𡏭𣈯𨁈嶅𨰰𨂃圕頣𨥉嶫𤦈斾槕叒𤪥𣾁㰑朶𨂐𨃴𨄮𡾡𨅏" + ], + [ + "9d40", + "𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺揦𨥖砈鉕𨦸䏲𨧧䏟𨧨𨭆𨯔姸𨰉輋𨿅𩃬筑𩄐𩄼㷷𩅞𤫊运犏嚋𩓧𩗩𩖰𩖸𩜲𩣑𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达嗁" + ], + [ + "9da1", + "辺𢒰边𤪓䔉繿潖檱仪㓤𨬬𧢝㜺躀𡟵𨀤𨭬𨮙𧨾𦚯㷫𧙕𣲷𥘵𥥖亚𥺁𦉘嚿𠹭踎孭𣺈𤲞揞拐𡟶𡡻攰嘭𥱊吚𥌑㷆𩶘䱽嘢嘞罉𥻘奵𣵀蝰东𠿪𠵉𣚺脗鵞贘瘻鱅癎瞹鍅吲腈苷嘥脲萘肽嗪祢噃吖𠺝㗎嘅嗱曱𨋢㘭甴嗰喺咗啲𠱁𠲖廐𥅈𠹶𢱢" + ], + [ + "9e40", + "𠺢麫絚嗞𡁵抝靭咔賍燶酶揼掹揾啩𢭃鱲𢺳冚㓟𠶧冧呍唞唓癦踭𦢊疱肶蠄螆裇膶萜𡃁䓬猄𤜆宐茋𦢓噻𢛴𧴯𤆣𧵳𦻐𧊶酰𡇙鈈𣳼𪚩𠺬𠻹牦𡲢䝎𤿂𧿹𠿫䃺" + ], + [ + "9ea1", + "鱝攟𢶠䣳𤟠𩵼𠿬𠸊恢𧖣𠿭" + ], + [ + "9ead", + "𦁈𡆇熣纎鵐业丄㕷嬍沲卧㚬㧜卽㚥𤘘墚𤭮舭呋垪𥪕𠥹" + ], + [ + "9ec5", + "㩒𢑥獴𩺬䴉鯭𣳾𩼰䱛𤾩𩖞𩿞葜𣶶𧊲𦞳𣜠挮紥𣻷𣸬㨪逈勌㹴㙺䗩𠒎癀嫰𠺶硺𧼮墧䂿噼鮋嵴癔𪐴麅䳡痹㟻愙𣃚𤏲" + ], + [ + "9ef5", + "噝𡊩垧𤥣𩸆刴𧂮㖭汊鵼" + ], + [ + "9f40", + "籖鬹埞𡝬屓擓𩓐𦌵𧅤蚭𠴨𦴢𤫢𠵱" + ], + [ + "9f4f", + "凾𡼏嶎霃𡷑麁遌笟鬂峑箣扨挵髿篏鬪籾鬮籂粆鰕篼鬉鼗鰛𤤾齚啳寃俽麘俲剠㸆勑坧偖妷帒韈鶫轜呩鞴饀鞺匬愰" + ], + [ + "9fa1", + "椬叚鰊鴂䰻陁榀傦畆𡝭駚剳" + ], + [ + "9fae", + "酙隁酜" + ], + [ + "9fb2", + "酑𨺗捿𦴣櫊嘑醎畺抅𠏼獏籰𥰡𣳽" + ], + [ + "9fc1", + "𤤙盖鮝个𠳔莾衂" + ], + [ + "9fc9", + "届槀僭坺刟巵从氱𠇲伹咜哚劚趂㗾弌㗳" + ], + [ + "9fdb", + "歒酼龥鮗頮颴骺麨麄煺笔" + ], + [ + "9fe7", + "毺蠘罸" + ], + [ + "9feb", + "嘠𪙊蹷齓" + ], + [ + "9ff0", + "跔蹏鸜踁抂𨍽踨蹵竓𤩷稾磘泪詧瘇" + ], + [ + "a040", + "𨩚鼦泎蟖痃𪊲硓咢贌狢獱謭猂瓱賫𤪻蘯徺袠䒷" + ], + [ + "a055", + "𡠻𦸅" + ], + [ + "a058", + "詾𢔛" + ], + [ + "a05b", + "惽癧髗鵄鍮鮏蟵" + ], + [ + "a063", + "蠏賷猬霡鮰㗖犲䰇籑饊𦅙慙䰄麖慽" + ], + [ + "a073", + "坟慯抦戹拎㩜懢厪𣏵捤栂㗒" + ], + [ + "a0a1", + "嵗𨯂迚𨸹" + ], + [ + "a0a6", + "僙𡵆礆匲阸𠼻䁥" + ], + [ + "a0ae", + "矾" + ], + [ + "a0b0", + "糂𥼚糚稭聦聣絍甅瓲覔舚朌聢𧒆聛瓰脃眤覉𦟌畓𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦" + ], + [ + "a0d4", + "覩瑨涹蟁𤀑瓧㷛煶悤憜㳑煢恷" + ], + [ + "a0e2", + "罱𨬭牐惩䭾删㰘𣳇𥻗𧙖𥔱𡥄𡋾𩤃𦷜𧂭峁𦆭𨨏𣙷𠃮𦡆𤼎䕢嬟𦍌齐麦𦉫" + ], + [ + "a3c0", + "␀", + 31, + "␡" + ], + [ + "c6a1", + "①", + 9, + "⑴", + 9, + "ⅰ", + 9, + "丶丿亅亠冂冖冫勹匸卩厶夊宀巛⼳广廴彐彡攴无疒癶辵隶¨ˆヽヾゝゞ〃仝々〆〇ー[]✽ぁ", + 23 + ], + [ + "c740", + "す", + 58, + "ァアィイ" + ], + [ + "c7a1", + "ゥ", + 81, + "А", + 5, + "ЁЖ", + 4 + ], + [ + "c840", + "Л", + 26, + "ёж", + 25, + "⇧↸↹㇏𠃌乚𠂊刂䒑" + ], + [ + "c8a1", + "龰冈龱𧘇" + ], + [ + "c8cd", + "¬¦'"㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌⺍⺕⺜⺝⺥⺧⺪⺬⺮⺶⺼⺾⻆⻊⻌⻍⻏⻖⻗⻞⻣" + ], + [ + "c8f5", + "ʃɐɛɔɵœøŋʊɪ" + ], + [ + "f9fe", + "■" + ], + [ + "fa40", + "𠕇鋛𠗟𣿅蕌䊵珯况㙉𤥂𨧤鍄𡧛苮𣳈砼杄拟𤤳𨦪𠊠𦮳𡌅侫𢓭倈𦴩𧪄𣘀𤪱𢔓倩𠍾徤𠎀𠍇滛𠐟偽儁㑺儎顬㝃萖𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂蝽𠖳𣲙冲冸" + ], + [ + "faa1", + "鴴凉减凑㳜凓𤪦决凢卂凭菍椾𣜭彻刋刦刼劵剗劔効勅簕蕂勠蘍𦬓包𨫞啉滙𣾀𠥔𣿬匳卄𠯢泋𡜦栛珕恊㺪㣌𡛨燝䒢卭却𨚫卾卿𡖖𡘓矦厓𨪛厠厫厮玧𥝲㽙玜叁叅汉义埾叙㪫𠮏叠𣿫𢶣叶𠱷吓灹唫晗浛呭𦭓𠵴啝咏咤䞦𡜍𠻝㶴𠵍" + ], + [ + "fb40", + "𨦼𢚘啇䳭启琗喆喩嘅𡣗𤀺䕒𤐵暳𡂴嘷曍𣊊暤暭噍噏磱囱鞇叾圀囯园𨭦㘣𡉏坆𤆥汮炋坂㚱𦱾埦𡐖堃𡑔𤍣堦𤯵塜墪㕡壠壜𡈼壻寿坃𪅐𤉸鏓㖡够梦㛃湙" + ], + [ + "fba1", + "𡘾娤啓𡚒蔅姉𠵎𦲁𦴪𡟜姙𡟻𡞲𦶦浱𡠨𡛕姹𦹅媫婣㛦𤦩婷㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広勐孶斈孼𧨎䀄䡝𠈄寕慠𡨴𥧌𠖥寳宝䴐尅𡭄尓珎尔𡲥𦬨屉䣝岅峩峯嶋𡷹𡸷崐崘嵆𡺤岺巗苼㠭𤤁𢁉𢅳芇㠶㯂帮檊幵幺𤒼𠳓厦亷廐厨𡝱帉廴𨒂" + ], + [ + "fc40", + "廹廻㢠廼栾鐛弍𠇁弢㫞䢮𡌺强𦢈𢏐彘𢑱彣鞽𦹮彲鍀𨨶徧嶶㵟𥉐𡽪𧃸𢙨釖𠊞𨨩怱暅𡡷㥣㷇㘹垐𢞴祱㹀悞悤悳𤦂𤦏𧩓璤僡媠慤萤慂慈𦻒憁凴𠙖憇宪𣾷" + ], + [ + "fca1", + "𢡟懓𨮝𩥝懐㤲𢦀𢣁怣慜攞掋𠄘担𡝰拕𢸍捬𤧟㨗搸揸𡎎𡟼撐澊𢸶頔𤂌𥜝擡擥鑻㩦携㩗敍漖𤨨𤨣斅敭敟𣁾斵𤥀䬷旑䃘𡠩无旣忟𣐀昘𣇷𣇸晄𣆤𣆥晋𠹵晧𥇦晳晴𡸽𣈱𨗴𣇈𥌓矅𢣷馤朂𤎜𤨡㬫槺𣟂杞杧杢𤇍𩃭柗䓩栢湐鈼栁𣏦𦶠桝" + ], + [ + "fd40", + "𣑯槡樋𨫟楳棃𣗍椁椀㴲㨁𣘼㮀枬楡𨩊䋼椶榘㮡𠏉荣傐槹𣙙𢄪橅𣜃檝㯳枱櫈𩆜㰍欝𠤣惞欵歴𢟍溵𣫛𠎵𡥘㝀吡𣭚毡𣻼毜氷𢒋𤣱𦭑汚舦汹𣶼䓅𣶽𤆤𤤌𤤀" + ], + [ + "fda1", + "𣳉㛥㳫𠴲鮃𣇹𢒑羏样𦴥𦶡𦷫涖浜湼漄𤥿𤂅𦹲蔳𦽴凇沜渝萮𨬡港𣸯瑓𣾂秌湏媑𣁋濸㜍澝𣸰滺𡒗𤀽䕕鏰潄潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀𦇝灋灾炧炁烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊煮岜𤍥煏鍢𤋁焬𤑚𤨧𤨢熺𨯨炽爎" + ], + [ + "fe40", + "鑂爕夑鑃爤鍁𥘅爮牀𤥴梽牕牗㹕𣁄栍漽犂猪猫𤠣𨠫䣭𨠄猨献珏玪𠰺𦨮珉瑉𤇢𡛧𤨤昣㛅𤦷𤦍𤧻珷琕椃𤨦琹𠗃㻗瑜𢢭瑠𨺲瑇珤瑶莹瑬㜰瑴鏱樬璂䥓𤪌" + ], + [ + "fea1", + "𤅟𤩹𨮏孆𨰃𡢞瓈𡦈甎瓩甞𨻙𡩋寗𨺬鎅畍畊畧畮𤾂㼄𤴓疎瑝疞疴瘂瘬癑癏癯癶𦏵皐臯㟸𦤑𦤎皡皥皷盌𦾟葢𥂝𥅽𡸜眞眦着撯𥈠睘𣊬瞯𨥤𨥨𡛁矴砉𡍶𤨒棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗禝𧬹礼禩渪𧄦㺨秆𩄍秔" + ] +]; + +var big5Added$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': big5Added +}); + +var require$$0 = getCjsExportFromNamespace(shiftjis$1); + +var require$$1 = getCjsExportFromNamespace(eucjp$1); + +var require$$2 = getCjsExportFromNamespace(cp936$1); + +var require$$3$1 = getCjsExportFromNamespace(gbkAdded$1); + +var require$$4 = getCjsExportFromNamespace(gb18030Ranges$1); + +var require$$5 = getCjsExportFromNamespace(cp949$1); + +var require$$6 = getCjsExportFromNamespace(cp950$1); + +var require$$7 = getCjsExportFromNamespace(big5Added$1); + +// Tables are not require()-d until they are needed to speed up library load. +// require()-s are direct to support Browserify. + + +var dbcsData = { + // == Japanese/ShiftJIS ==================================================== + // All japanese encodings are based on JIS X set of standards: + // JIS X 0201 - Single-byte encoding of ASCII + ¥ + Kana chars at 0xA1-0xDF. + // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes. + // Has several variations in 1978, 1983, 1990 and 1997. + // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead. + // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233. + // 2 planes, first is superset of 0208, second - revised 0212. + // Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx) + // Byte encodings are: + // * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte + // encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC. + // Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI. + // * EUC-JP: Up to 3 bytes per character. Used mostly on *nixes. + // 0x00-0x7F - lower part of 0201 + // 0x8E, 0xA1-0xDF - upper part of 0201 + // (0xA1-0xFE)x2 - 0208 plane (94x94). + // 0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94). + // * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon. + // Used as-is in ISO2022 family. + // * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII, + // 0201-1976 Roman, 0208-1978, 0208-1983. + // * ISO2022-JP-1: Adds esc seq for 0212-1990. + // * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7. + // * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2. + // * ISO2022-JP-2004: Adds 0213-2004 Plane 1. + // + // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes. + // + // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html + 'shiftjis': { + type: '_dbcs', + table: function table() { + return require$$0; + }, + encodeAdd: { + "\xA5": 0x5C, + "\u203E": 0x7E + }, + encodeSkipVals: [{ + from: 0xED40, + to: 0xF940 + }] + }, + 'csshiftjis': 'shiftjis', + 'mskanji': 'shiftjis', + 'sjis': 'shiftjis', + 'windows31j': 'shiftjis', + 'ms31j': 'shiftjis', + 'xsjis': 'shiftjis', + 'windows932': 'shiftjis', + 'ms932': 'shiftjis', + '932': 'shiftjis', + 'cp932': 'shiftjis', + 'eucjp': { + type: '_dbcs', + table: function table() { + return require$$1; + }, + encodeAdd: { + "\xA5": 0x5C, + "\u203E": 0x7E + } + }, + // TODO: KDDI extension to Shift_JIS + // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes. + // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars. + // == Chinese/GBK ========================================================== + // http://en.wikipedia.org/wiki/GBK + // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder + // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936 + 'gb2312': 'cp936', + 'gb231280': 'cp936', + 'gb23121980': 'cp936', + 'csgb2312': 'cp936', + 'csiso58gb231280': 'cp936', + 'euccn': 'cp936', + // Microsoft's CP936 is a subset and approximation of GBK. + 'windows936': 'cp936', + 'ms936': 'cp936', + '936': 'cp936', + 'cp936': { + type: '_dbcs', + table: function table() { + return require$$2; + } + }, + // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other. + 'gbk': { + type: '_dbcs', + table: function table() { + return require$$2.concat(require$$3$1); + } + }, + 'xgbk': 'gbk', + 'isoir58': 'gbk', + // GB18030 is an algorithmic extension of GBK. + // Main source: https://www.w3.org/TR/encoding/#gbk-encoder + // http://icu-project.org/docs/papers/gb18030.html + // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml + // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0 + 'gb18030': { + type: '_dbcs', + table: function table() { + return require$$2.concat(require$$3$1); + }, + gb18030: function gb18030() { + return require$$4; + }, + encodeSkipVals: [0x80], + encodeAdd: { + '€': 0xA2E3 + } + }, + 'chinese': 'gb18030', + // == Korean =============================================================== + // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same. + 'windows949': 'cp949', + 'ms949': 'cp949', + '949': 'cp949', + 'cp949': { + type: '_dbcs', + table: function table() { + return require$$5; + } + }, + 'cseuckr': 'cp949', + 'csksc56011987': 'cp949', + 'euckr': 'cp949', + 'isoir149': 'cp949', + 'korean': 'cp949', + 'ksc56011987': 'cp949', + 'ksc56011989': 'cp949', + 'ksc5601': 'cp949', + // == Big5/Taiwan/Hong Kong ================================================ + // There are lots of tables for Big5 and cp950. Please see the following links for history: + // http://moztw.org/docs/big5/ http://www.haible.de/bruno/charsets/conversion-tables/Big5.html + // Variations, in roughly number of defined chars: + // * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT + // * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/ + // * Big5-2003 (Taiwan standard) almost superset of cp950. + // * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers. + // * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard. + // many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years. + // Plus, it has 4 combining sequences. + // Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299 + // because big5-hkscs is the only encoding to include astral characters in non-algorithmic way. + // Implementations are not consistent within browsers; sometimes labeled as just big5. + // MS Internet Explorer switches from big5 to big5-hkscs when a patch applied. + // Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31 + // In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s. + // Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt + // http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt + // + // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder + // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong. + 'windows950': 'cp950', + 'ms950': 'cp950', + '950': 'cp950', + 'cp950': { + type: '_dbcs', + table: function table() { + return require$$6; + } + }, + // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus. + 'big5': 'big5hkscs', + 'big5hkscs': { + type: '_dbcs', + table: function table() { + return require$$6.concat(require$$7); + }, + encodeSkipVals: [0xa2cc] + }, + 'cnbig5': 'big5hkscs', + 'csbig5': 'big5hkscs', + 'xxbig5': 'big5hkscs' +}; + +var encodings = createCommonjsModule(function (module, exports) { + // We support Browserify by skipping automatic module discovery and requiring modules directly. + + var modules = [internal, utf16, utf7, sbcsCodec, sbcsData, sbcsDataGenerated, dbcsCodec, dbcsData]; // Put all encoding/alias/codec definitions to single object and export it. + + for (var i = 0; i < modules.length; i++) { + var module = modules[i]; + + for (var enc in module) { + if (Object.prototype.hasOwnProperty.call(module, enc)) exports[enc] = module[enc]; + } + } +}); + +var Buffer$6 = buffer.Buffer, + Transform$1 = Stream.Transform; // == Exports ================================================================== + +var streams = function streams(iconv) { + // Additional Public API. + iconv.encodeStream = function encodeStream(encoding, options) { + return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options); + }; + + iconv.decodeStream = function decodeStream(encoding, options) { + return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options); + }; + + iconv.supportsStreams = true; // Not published yet. + + iconv.IconvLiteEncoderStream = IconvLiteEncoderStream; + iconv.IconvLiteDecoderStream = IconvLiteDecoderStream; + iconv._collect = IconvLiteDecoderStream.prototype.collect; +}; // == Encoder stream ======================================================= + + +function IconvLiteEncoderStream(conv, options) { + this.conv = conv; + options = options || {}; + options.decodeStrings = false; // We accept only strings, so we don't need to decode them. + + Transform$1.call(this, options); +} + +IconvLiteEncoderStream.prototype = Object.create(Transform$1.prototype, { + constructor: { + value: IconvLiteEncoderStream + } +}); + +IconvLiteEncoderStream.prototype._transform = function (chunk, encoding, done) { + if (typeof chunk != 'string') return done(new Error("Iconv encoding stream needs strings as its input.")); + + try { + var res = this.conv.write(chunk); + if (res && res.length) this.push(res); + done(); + } catch (e) { + done(e); + } +}; + +IconvLiteEncoderStream.prototype._flush = function (done) { + try { + var res = this.conv.end(); + if (res && res.length) this.push(res); + done(); + } catch (e) { + done(e); + } +}; + +IconvLiteEncoderStream.prototype.collect = function (cb) { + var chunks = []; + this.on('error', cb); + this.on('data', function (chunk) { + chunks.push(chunk); + }); + this.on('end', function () { + cb(null, Buffer$6.concat(chunks)); + }); + return this; +}; // == Decoder stream ======================================================= + + +function IconvLiteDecoderStream(conv, options) { + this.conv = conv; + options = options || {}; + options.encoding = this.encoding = 'utf8'; // We output strings. + + Transform$1.call(this, options); +} + +IconvLiteDecoderStream.prototype = Object.create(Transform$1.prototype, { + constructor: { + value: IconvLiteDecoderStream + } +}); + +IconvLiteDecoderStream.prototype._transform = function (chunk, encoding, done) { + if (!Buffer$6.isBuffer(chunk)) return done(new Error("Iconv decoding stream needs buffers as its input.")); + + try { + var res = this.conv.write(chunk); + if (res && res.length) this.push(res, this.encoding); + done(); + } catch (e) { + done(e); + } +}; + +IconvLiteDecoderStream.prototype._flush = function (done) { + try { + var res = this.conv.end(); + if (res && res.length) this.push(res, this.encoding); + done(); + } catch (e) { + done(e); + } +}; + +IconvLiteDecoderStream.prototype.collect = function (cb) { + var res = ''; + this.on('error', cb); + this.on('data', function (chunk) { + res += chunk; + }); + this.on('end', function () { + cb(null, res); + }); + return this; +}; + +var Buffer$7 = buffer.Buffer; // Note: not polyfilled with safer-buffer on a purpose, as overrides Buffer +// == Extend Node primitives to use iconv-lite ================================= + +var extendNode = function extendNode(iconv) { + var original = undefined; // Place to keep original methods. + // Node authors rewrote Buffer internals to make it compatible with + // Uint8Array and we cannot patch key functions since then. + // Note: this does use older Buffer API on a purpose + + iconv.supportsNodeEncodingsExtension = !(Buffer$7.from || new Buffer$7(0) instanceof Uint8Array); + + iconv.extendNodeEncodings = function extendNodeEncodings() { + if (original) return; + original = {}; + + if (!iconv.supportsNodeEncodingsExtension) { + console.error("ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node"); + console.error("See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility"); + return; + } + + var nodeNativeEncodings = { + 'hex': true, + 'utf8': true, + 'utf-8': true, + 'ascii': true, + 'binary': true, + 'base64': true, + 'ucs2': true, + 'ucs-2': true, + 'utf16le': true, + 'utf-16le': true + }; + + Buffer$7.isNativeEncoding = function (enc) { + return enc && nodeNativeEncodings[enc.toLowerCase()]; + }; // -- SlowBuffer ----------------------------------------------------------- + + + var SlowBuffer = buffer.SlowBuffer; + original.SlowBufferToString = SlowBuffer.prototype.toString; + + SlowBuffer.prototype.toString = function (encoding, start, end) { + encoding = String(encoding || 'utf8').toLowerCase(); // Use native conversion when possible + + if (Buffer$7.isNativeEncoding(encoding)) return original.SlowBufferToString.call(this, encoding, start, end); // Otherwise, use our decoding method. + + if (typeof start == 'undefined') start = 0; + if (typeof end == 'undefined') end = this.length; + return iconv.decode(this.slice(start, end), encoding); + }; + + original.SlowBufferWrite = SlowBuffer.prototype.write; + + SlowBuffer.prototype.write = function (string, offset, length, encoding) { + // Support both (string, offset, length, encoding) + // and the legacy (string, encoding, offset, length) + if (isFinite(offset)) { + if (!isFinite(length)) { + encoding = length; + length = undefined; + } + } else { + // legacy + var swap = encoding; + encoding = offset; + offset = length; + length = swap; + } + + offset = +offset || 0; + var remaining = this.length - offset; + + if (!length) { + length = remaining; + } else { + length = +length; + + if (length > remaining) { + length = remaining; + } + } + + encoding = String(encoding || 'utf8').toLowerCase(); // Use native conversion when possible + + if (Buffer$7.isNativeEncoding(encoding)) return original.SlowBufferWrite.call(this, string, offset, length, encoding); + if (string.length > 0 && (length < 0 || offset < 0)) throw new RangeError('attempt to write beyond buffer bounds'); // Otherwise, use our encoding method. + + var buf = iconv.encode(string, encoding); + if (buf.length < length) length = buf.length; + buf.copy(this, offset, 0, length); + return length; + }; // -- Buffer --------------------------------------------------------------- + + + original.BufferIsEncoding = Buffer$7.isEncoding; + + Buffer$7.isEncoding = function (encoding) { + return Buffer$7.isNativeEncoding(encoding) || iconv.encodingExists(encoding); + }; + + original.BufferByteLength = Buffer$7.byteLength; + + Buffer$7.byteLength = SlowBuffer.byteLength = function (str, encoding) { + encoding = String(encoding || 'utf8').toLowerCase(); // Use native conversion when possible + + if (Buffer$7.isNativeEncoding(encoding)) return original.BufferByteLength.call(this, str, encoding); // Slow, I know, but we don't have a better way yet. + + return iconv.encode(str, encoding).length; + }; + + original.BufferToString = Buffer$7.prototype.toString; + + Buffer$7.prototype.toString = function (encoding, start, end) { + encoding = String(encoding || 'utf8').toLowerCase(); // Use native conversion when possible + + if (Buffer$7.isNativeEncoding(encoding)) return original.BufferToString.call(this, encoding, start, end); // Otherwise, use our decoding method. + + if (typeof start == 'undefined') start = 0; + if (typeof end == 'undefined') end = this.length; + return iconv.decode(this.slice(start, end), encoding); + }; + + original.BufferWrite = Buffer$7.prototype.write; + + Buffer$7.prototype.write = function (string, offset, length, encoding) { + var _offset = offset, + _length = length, + _encoding = encoding; // Support both (string, offset, length, encoding) + // and the legacy (string, encoding, offset, length) + + if (isFinite(offset)) { + if (!isFinite(length)) { + encoding = length; + length = undefined; + } + } else { + // legacy + var swap = encoding; + encoding = offset; + offset = length; + length = swap; + } + + encoding = String(encoding || 'utf8').toLowerCase(); // Use native conversion when possible + + if (Buffer$7.isNativeEncoding(encoding)) return original.BufferWrite.call(this, string, _offset, _length, _encoding); + offset = +offset || 0; + var remaining = this.length - offset; + + if (!length) { + length = remaining; + } else { + length = +length; + + if (length > remaining) { + length = remaining; + } + } + + if (string.length > 0 && (length < 0 || offset < 0)) throw new RangeError('attempt to write beyond buffer bounds'); // Otherwise, use our encoding method. + + var buf = iconv.encode(string, encoding); + if (buf.length < length) length = buf.length; + buf.copy(this, offset, 0, length); + return length; // TODO: Set _charsWritten. + }; // -- Readable ------------------------------------------------------------- + + + if (iconv.supportsStreams) { + var Readable = Stream.Readable; + original.ReadableSetEncoding = Readable.prototype.setEncoding; + + Readable.prototype.setEncoding = function setEncoding(enc, options) { + // Use our own decoder, it has the same interface. + // We cannot use original function as it doesn't handle BOM-s. + this._readableState.decoder = iconv.getDecoder(enc, options); + this._readableState.encoding = enc; + }; + + Readable.prototype.collect = iconv._collect; + } + }; // Remove iconv-lite Node primitive extensions. + + + iconv.undoExtendNodeEncodings = function undoExtendNodeEncodings() { + if (!iconv.supportsNodeEncodingsExtension) return; + if (!original) throw new Error("require('iconv-lite').undoExtendNodeEncodings(): Nothing to undo; extendNodeEncodings() is not called."); + delete Buffer$7.isNativeEncoding; + var SlowBuffer = buffer.SlowBuffer; + SlowBuffer.prototype.toString = original.SlowBufferToString; + SlowBuffer.prototype.write = original.SlowBufferWrite; + Buffer$7.isEncoding = original.BufferIsEncoding; + Buffer$7.byteLength = original.BufferByteLength; + Buffer$7.prototype.toString = original.BufferToString; + Buffer$7.prototype.write = original.BufferWrite; + + if (iconv.supportsStreams) { + var Readable = Stream.Readable; + Readable.prototype.setEncoding = original.ReadableSetEncoding; + delete Readable.prototype.collect; + } + + original = undefined; + }; +}; + +var lib = createCommonjsModule(function (module) { + // Solution would be installing npm modules "buffer" and "stream" explicitly. + + var Buffer = safer_1.Buffer; + var iconv = module.exports; // All codecs and aliases are kept here, keyed by encoding name/alias. + // They are lazy loaded in `iconv.getCodec` from `encodings/index.js`. + + iconv.encodings = null; // Characters emitted in case of error. + + iconv.defaultCharUnicode = '�'; + iconv.defaultCharSingleByte = '?'; // Public API. + + iconv.encode = function encode(str, encoding, options) { + str = "" + (str || ""); // Ensure string. + + var encoder = iconv.getEncoder(encoding, options); + var res = encoder.write(str); + var trail = encoder.end(); + return trail && trail.length > 0 ? Buffer.concat([res, trail]) : res; + }; + + iconv.decode = function decode(buf, encoding, options) { + if (typeof buf === 'string') { + if (!iconv.skipDecodeWarning) { + console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding'); + iconv.skipDecodeWarning = true; + } + + buf = Buffer.from("" + (buf || ""), "binary"); // Ensure buffer. + } + + var decoder = iconv.getDecoder(encoding, options); + var res = decoder.write(buf); + var trail = decoder.end(); + return trail ? res + trail : res; + }; + + iconv.encodingExists = function encodingExists(enc) { + try { + iconv.getCodec(enc); + return true; + } catch (e) { + return false; + } + }; // Legacy aliases to convert functions + + + iconv.toEncoding = iconv.encode; + iconv.fromEncoding = iconv.decode; // Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache. + + iconv._codecDataCache = {}; + + iconv.getCodec = function getCodec(encoding) { + if (!iconv.encodings) iconv.encodings = encodings; // Lazy load all encoding definitions. + // Canonicalize encoding name: strip all non-alphanumeric chars and appended year. + + var enc = iconv._canonicalizeEncoding(encoding); // Traverse iconv.encodings to find actual codec. + + + var codecOptions = {}; + + while (true) { + var codec = iconv._codecDataCache[enc]; + if (codec) return codec; + var codecDef = iconv.encodings[enc]; + + switch (typeof codecDef) { + case "string": + // Direct alias to other encoding. + enc = codecDef; + break; + + case "object": + // Alias with options. Can be layered. + for (var key in codecDef) { + codecOptions[key] = codecDef[key]; + } + + if (!codecOptions.encodingName) codecOptions.encodingName = enc; + enc = codecDef.type; + break; + + case "function": + // Codec itself. + if (!codecOptions.encodingName) codecOptions.encodingName = enc; // The codec function must load all tables and return object with .encoder and .decoder methods. + // It'll be called only once (for each different options object). + + codec = new codecDef(codecOptions, iconv); + iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later. + + return codec; + + default: + throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '" + enc + "')"); + } + } + }; + + iconv._canonicalizeEncoding = function (encoding) { + // Canonicalize encoding name: strip all non-alphanumeric chars and appended year. + return ('' + encoding).toLowerCase().replace(/:\d{4}$|[^0-9a-z]/g, ""); + }; + + iconv.getEncoder = function getEncoder(encoding, options) { + var codec = iconv.getCodec(encoding), + encoder = new codec.encoder(options, codec); + if (codec.bomAware && options && options.addBOM) encoder = new bomHandling.PrependBOM(encoder, options); + return encoder; + }; + + iconv.getDecoder = function getDecoder(encoding, options) { + var codec = iconv.getCodec(encoding), + decoder = new codec.decoder(options, codec); + if (codec.bomAware && !(options && options.stripBOM === false)) decoder = new bomHandling.StripBOM(decoder, options); + return decoder; + }; // Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json. + + + var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node; + + if (nodeVer) { + // Load streaming support in Node v0.10+ + var nodeVerArr = nodeVer.split(".").map(Number); + + if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) { + streams(iconv); + } // Load Node primitive extensions. + + + extendNode(iconv); + } +}); + +var DecodeStream = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var DecodeStream, iconv; + + try { + iconv = lib; + } catch (_error) {} + + DecodeStream = function () { + var key; + + function DecodeStream(buffer) { + this.buffer = buffer; + this.pos = 0; + this.length = this.buffer.length; + } + + DecodeStream.TYPES = { + UInt8: 1, + UInt16: 2, + UInt24: 3, + UInt32: 4, + Int8: 1, + Int16: 2, + Int24: 3, + Int32: 4, + Float: 4, + Double: 8 + }; + + for (key in buffer_1.prototype) { + if (key.slice(0, 4) === 'read') { + (function (key) { + var bytes; + bytes = DecodeStream.TYPES[key.replace(/read|[BL]E/g, '')]; + return DecodeStream.prototype[key] = function () { + var ret; + ret = this.buffer[key](this.pos); + this.pos += bytes; + return ret; + }; + })(key); + } + } + + DecodeStream.prototype.readString = function (length, encoding) { + var buf, _byte, i, _i, _ref; + + if (encoding == null) { + encoding = 'ascii'; + } + + switch (encoding) { + case 'utf16le': + case 'ucs2': + case 'utf8': + case 'ascii': + return this.buffer.toString(encoding, this.pos, this.pos += length); + + case 'utf16be': + buf = new buffer_1(this.readBuffer(length)); + + for (i = _i = 0, _ref = buf.length - 1; _i < _ref; i = _i += 2) { + _byte = buf[i]; + buf[i] = buf[i + 1]; + buf[i + 1] = _byte; + } + + return buf.toString('utf16le'); + + default: + buf = this.readBuffer(length); + + if (iconv) { + try { + return iconv.decode(buf, encoding); + } catch (_error) {} + } + + return buf; + } + }; + + DecodeStream.prototype.readBuffer = function (length) { + return this.buffer.slice(this.pos, this.pos += length); + }; + + DecodeStream.prototype.readUInt24BE = function () { + return (this.readUInt16BE() << 8) + this.readUInt8(); + }; + + DecodeStream.prototype.readUInt24LE = function () { + return this.readUInt16LE() + (this.readUInt8() << 16); + }; + + DecodeStream.prototype.readInt24BE = function () { + return (this.readInt16BE() << 8) + this.readUInt8(); + }; + + DecodeStream.prototype.readInt24LE = function () { + return this.readUInt16LE() + (this.readInt8() << 16); + }; + + return DecodeStream; + }(); + + module.exports = DecodeStream; + }).call(commonjsGlobal); +}); + +var EncodeStream = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var DecodeStream$1, + EncodeStream, + iconv, + stream, + __hasProp = {}.hasOwnProperty, + __extends = function __extends(child, parent) { + for (var key in parent) { + if (__hasProp.call(parent, key)) child[key] = parent[key]; + } + + function ctor() { + this.constructor = child; + } + + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }; + + stream = Stream; + DecodeStream$1 = DecodeStream; + + try { + iconv = lib; + } catch (_error) {} + + EncodeStream = function (_super) { + var key; + + __extends(EncodeStream, _super); + + function EncodeStream(bufferSize) { + if (bufferSize == null) { + bufferSize = 65536; + } + + EncodeStream.__super__.constructor.apply(this, arguments); + + this.buffer = new buffer_1(bufferSize); + this.bufferOffset = 0; + this.pos = 0; + } + + for (key in buffer_1.prototype) { + if (key.slice(0, 5) === 'write') { + (function (key) { + var bytes; + bytes = +DecodeStream$1.TYPES[key.replace(/write|[BL]E/g, '')]; + return EncodeStream.prototype[key] = function (value) { + this.ensure(bytes); + this.buffer[key](value, this.bufferOffset); + this.bufferOffset += bytes; + return this.pos += bytes; + }; + })(key); + } + } + + EncodeStream.prototype._read = function () {}; + + EncodeStream.prototype.ensure = function (bytes) { + if (this.bufferOffset + bytes > this.buffer.length) { + return this.flush(); + } + }; + + EncodeStream.prototype.flush = function () { + if (this.bufferOffset > 0) { + this.push(new buffer_1(this.buffer.slice(0, this.bufferOffset))); + return this.bufferOffset = 0; + } + }; + + EncodeStream.prototype.writeBuffer = function (buffer) { + this.flush(); + this.push(buffer); + return this.pos += buffer.length; + }; + + EncodeStream.prototype.writeString = function (string, encoding) { + var buf, _byte, i, _i, _ref; + + if (encoding == null) { + encoding = 'ascii'; + } + + switch (encoding) { + case 'utf16le': + case 'ucs2': + case 'utf8': + case 'ascii': + return this.writeBuffer(new buffer_1(string, encoding)); + + case 'utf16be': + buf = new buffer_1(string, 'utf16le'); + + for (i = _i = 0, _ref = buf.length - 1; _i < _ref; i = _i += 2) { + _byte = buf[i]; + buf[i] = buf[i + 1]; + buf[i + 1] = _byte; + } + + return this.writeBuffer(buf); + + default: + if (iconv) { + return this.writeBuffer(iconv.encode(string, encoding)); + } else { + throw new Error('Install iconv-lite to enable additional string encodings.'); + } + + } + }; + + EncodeStream.prototype.writeUInt24BE = function (val) { + this.ensure(3); + this.buffer[this.bufferOffset++] = val >>> 16 & 0xff; + this.buffer[this.bufferOffset++] = val >>> 8 & 0xff; + this.buffer[this.bufferOffset++] = val & 0xff; + return this.pos += 3; + }; + + EncodeStream.prototype.writeUInt24LE = function (val) { + this.ensure(3); + this.buffer[this.bufferOffset++] = val & 0xff; + this.buffer[this.bufferOffset++] = val >>> 8 & 0xff; + this.buffer[this.bufferOffset++] = val >>> 16 & 0xff; + return this.pos += 3; + }; + + EncodeStream.prototype.writeInt24BE = function (val) { + if (val >= 0) { + return this.writeUInt24BE(val); + } else { + return this.writeUInt24BE(val + 0xffffff + 1); + } + }; + + EncodeStream.prototype.writeInt24LE = function (val) { + if (val >= 0) { + return this.writeUInt24LE(val); + } else { + return this.writeUInt24LE(val + 0xffffff + 1); + } + }; + + EncodeStream.prototype.fill = function (val, length) { + var buf; + + if (length < this.buffer.length) { + this.ensure(length); + this.buffer.fill(val, this.bufferOffset, this.bufferOffset + length); + this.bufferOffset += length; + return this.pos += length; + } else { + buf = new buffer_1(length); + buf.fill(val); + return this.writeBuffer(buf); + } + }; + + EncodeStream.prototype.end = function () { + this.flush(); + return this.push(null); + }; + + return EncodeStream; + }(stream.Readable); + + module.exports = EncodeStream; + }).call(commonjsGlobal); +}); + +var _Number = createCommonjsModule(function (module, exports) { + // Generated by CoffeeScript 1.7.1 + (function () { + var DecodeStream$1, + Fixed, + NumberT, + __hasProp = {}.hasOwnProperty, + __extends = function __extends(child, parent) { + for (var key in parent) { + if (__hasProp.call(parent, key)) child[key] = parent[key]; + } + + function ctor() { + this.constructor = child; + } + + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }; + + DecodeStream$1 = DecodeStream; + + NumberT = function () { + function NumberT(type, endian) { + this.type = type; + this.endian = endian != null ? endian : 'BE'; + this.fn = this.type; + + if (this.type[this.type.length - 1] !== '8') { + this.fn += this.endian; + } + } + + NumberT.prototype.size = function () { + return DecodeStream$1.TYPES[this.type]; + }; + + NumberT.prototype.decode = function (stream) { + return stream['read' + this.fn](); + }; + + NumberT.prototype.encode = function (stream, val) { + return stream['write' + this.fn](val); + }; + + return NumberT; + }(); + + exports.Number = NumberT; + exports.uint8 = new NumberT('UInt8'); + exports.uint16be = exports.uint16 = new NumberT('UInt16', 'BE'); + exports.uint16le = new NumberT('UInt16', 'LE'); + exports.uint24be = exports.uint24 = new NumberT('UInt24', 'BE'); + exports.uint24le = new NumberT('UInt24', 'LE'); + exports.uint32be = exports.uint32 = new NumberT('UInt32', 'BE'); + exports.uint32le = new NumberT('UInt32', 'LE'); + exports.int8 = new NumberT('Int8'); + exports.int16be = exports.int16 = new NumberT('Int16', 'BE'); + exports.int16le = new NumberT('Int16', 'LE'); + exports.int24be = exports.int24 = new NumberT('Int24', 'BE'); + exports.int24le = new NumberT('Int24', 'LE'); + exports.int32be = exports.int32 = new NumberT('Int32', 'BE'); + exports.int32le = new NumberT('Int32', 'LE'); + exports.floatbe = exports["float"] = new NumberT('Float', 'BE'); + exports.floatle = new NumberT('Float', 'LE'); + exports.doublebe = exports["double"] = new NumberT('Double', 'BE'); + exports.doublele = new NumberT('Double', 'LE'); + + Fixed = function (_super) { + __extends(Fixed, _super); + + function Fixed(size, endian, fracBits) { + if (fracBits == null) { + fracBits = size >> 1; + } + + Fixed.__super__.constructor.call(this, "Int" + size, endian); + + this._point = 1 << fracBits; + } + + Fixed.prototype.decode = function (stream) { + return Fixed.__super__.decode.call(this, stream) / this._point; + }; + + Fixed.prototype.encode = function (stream, val) { + return Fixed.__super__.encode.call(this, stream, val * this._point | 0); + }; + + return Fixed; + }(NumberT); + + exports.Fixed = Fixed; + exports.fixed16be = exports.fixed16 = new Fixed(16, 'BE'); + exports.fixed16le = new Fixed(16, 'LE'); + exports.fixed32be = exports.fixed32 = new Fixed(32, 'BE'); + exports.fixed32le = new Fixed(32, 'LE'); + }).call(commonjsGlobal); +}); +var _Number_1 = _Number.Number; +var _Number_2 = _Number.uint8; +var _Number_3 = _Number.uint16be; +var _Number_4 = _Number.uint16; +var _Number_5 = _Number.uint16le; +var _Number_6 = _Number.uint24be; +var _Number_7 = _Number.uint24; +var _Number_8 = _Number.uint24le; +var _Number_9 = _Number.uint32be; +var _Number_10 = _Number.uint32; +var _Number_11 = _Number.uint32le; +var _Number_12 = _Number.int8; +var _Number_13 = _Number.int16be; +var _Number_14 = _Number.int16; +var _Number_15 = _Number.int16le; +var _Number_16 = _Number.int24be; +var _Number_17 = _Number.int24; +var _Number_18 = _Number.int24le; +var _Number_19 = _Number.int32be; +var _Number_20 = _Number.int32; +var _Number_21 = _Number.int32le; +var _Number_22 = _Number.floatbe; +var _Number_23 = _Number.floatle; +var _Number_24 = _Number.doublebe; +var _Number_25 = _Number.doublele; +var _Number_26 = _Number.Fixed; +var _Number_27 = _Number.fixed16be; +var _Number_28 = _Number.fixed16; +var _Number_29 = _Number.fixed16le; +var _Number_30 = _Number.fixed32be; +var _Number_31 = _Number.fixed32; +var _Number_32 = _Number.fixed32le; + +var utils = createCommonjsModule(function (module, exports) { + // Generated by CoffeeScript 1.7.1 + (function () { + var NumberT, PropertyDescriptor; + NumberT = _Number.Number; + + exports.resolveLength = function (length, stream, parent) { + var res; + + if (typeof length === 'number') { + res = length; + } else if (typeof length === 'function') { + res = length.call(parent, parent); + } else if (parent && typeof length === 'string') { + res = parent[length]; + } else if (stream && length instanceof NumberT) { + res = length.decode(stream); + } + + if (isNaN(res)) { + throw new Error('Not a fixed size'); + } + + return res; + }; + + PropertyDescriptor = function () { + function PropertyDescriptor(opts) { + var key, val; + + if (opts == null) { + opts = {}; + } + + this.enumerable = true; + this.configurable = true; + + for (key in opts) { + val = opts[key]; + this[key] = val; + } + } + + return PropertyDescriptor; + }(); + + exports.PropertyDescriptor = PropertyDescriptor; + }).call(commonjsGlobal); +}); +var utils_1 = utils.resolveLength; +var utils_2 = utils.PropertyDescriptor; + +var _Array = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var ArrayT, NumberT, utils$1; + NumberT = _Number.Number; + utils$1 = utils; + + ArrayT = function () { + function ArrayT(type, length, lengthType) { + this.type = type; + this.length = length; + this.lengthType = lengthType != null ? lengthType : 'count'; + } + + ArrayT.prototype.decode = function (stream, parent) { + var ctx, i, length, pos, res, target, _i; + + pos = stream.pos; + res = []; + ctx = parent; + + if (this.length != null) { + length = utils$1.resolveLength(this.length, stream, parent); + } + + if (this.length instanceof NumberT) { + Object.defineProperties(res, { + parent: { + value: parent + }, + _startOffset: { + value: pos + }, + _currentOffset: { + value: 0, + writable: true + }, + _length: { + value: length + } + }); + ctx = res; + } + + if (length == null || this.lengthType === 'bytes') { + target = length != null ? stream.pos + length : (parent != null ? parent._length : void 0) ? parent._startOffset + parent._length : stream.length; + + while (stream.pos < target) { + res.push(this.type.decode(stream, ctx)); + } + } else { + for (i = _i = 0; _i < length; i = _i += 1) { + res.push(this.type.decode(stream, ctx)); + } + } + + return res; + }; + + ArrayT.prototype.size = function (array, ctx) { + var item, size, _i, _len; + + if (!array) { + return this.type.size(null, ctx) * utils$1.resolveLength(this.length, null, ctx); + } + + size = 0; + + if (this.length instanceof NumberT) { + size += this.length.size(); + ctx = { + parent: ctx + }; + } + + for (_i = 0, _len = array.length; _i < _len; _i++) { + item = array[_i]; + size += this.type.size(item, ctx); + } + + return size; + }; + + ArrayT.prototype.encode = function (stream, array, parent) { + var ctx, i, item, ptr, _i, _len; + + ctx = parent; + + if (this.length instanceof NumberT) { + ctx = { + pointers: [], + startOffset: stream.pos, + parent: parent + }; + ctx.pointerOffset = stream.pos + this.size(array, ctx); + this.length.encode(stream, array.length); + } + + for (_i = 0, _len = array.length; _i < _len; _i++) { + item = array[_i]; + this.type.encode(stream, item, ctx); + } + + if (this.length instanceof NumberT) { + i = 0; + + while (i < ctx.pointers.length) { + ptr = ctx.pointers[i++]; + ptr.type.encode(stream, ptr.val); + } + } + }; + + return ArrayT; + }(); + + module.exports = ArrayT; + }).call(commonjsGlobal); +}); + +var LazyArray = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var ArrayT, + LazyArray, + LazyArrayT, + NumberT, + inspect, + utils$1, + __hasProp = {}.hasOwnProperty, + __extends = function __extends(child, parent) { + for (var key in parent) { + if (__hasProp.call(parent, key)) child[key] = parent[key]; + } + + function ctor() { + this.constructor = child; + } + + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }; + + ArrayT = _Array; + NumberT = _Number.Number; + utils$1 = utils; + inspect = require$$3.inspect; + + LazyArrayT = function (_super) { + __extends(LazyArrayT, _super); + + function LazyArrayT() { + return LazyArrayT.__super__.constructor.apply(this, arguments); + } + + LazyArrayT.prototype.decode = function (stream, parent) { + var length, pos, res; + pos = stream.pos; + length = utils$1.resolveLength(this.length, stream, parent); + + if (this.length instanceof NumberT) { + parent = { + parent: parent, + _startOffset: pos, + _currentOffset: 0, + _length: length + }; + } + + res = new LazyArray(this.type, length, stream, parent); + stream.pos += length * this.type.size(null, parent); + return res; + }; + + LazyArrayT.prototype.size = function (val, ctx) { + if (val instanceof LazyArray) { + val = val.toArray(); + } + + return LazyArrayT.__super__.size.call(this, val, ctx); + }; + + LazyArrayT.prototype.encode = function (stream, val, ctx) { + if (val instanceof LazyArray) { + val = val.toArray(); + } + + return LazyArrayT.__super__.encode.call(this, stream, val, ctx); + }; + + return LazyArrayT; + }(ArrayT); + + LazyArray = function () { + function LazyArray(type, length, stream, ctx) { + this.type = type; + this.length = length; + this.stream = stream; + this.ctx = ctx; + this.base = this.stream.pos; + this.items = []; + } + + LazyArray.prototype.get = function (index) { + var pos; + + if (index < 0 || index >= this.length) { + return void 0; + } + + if (this.items[index] == null) { + pos = this.stream.pos; + this.stream.pos = this.base + this.type.size(null, this.ctx) * index; + this.items[index] = this.type.decode(this.stream, this.ctx); + this.stream.pos = pos; + } + + return this.items[index]; + }; + + LazyArray.prototype.toArray = function () { + var i, _i, _ref, _results; + + _results = []; + + for (i = _i = 0, _ref = this.length; _i < _ref; i = _i += 1) { + _results.push(this.get(i)); + } + + return _results; + }; + + LazyArray.prototype.inspect = function () { + return inspect(this.toArray()); + }; + + return LazyArray; + }(); + + module.exports = LazyArrayT; + }).call(commonjsGlobal); +}); + +var Bitfield = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var Bitfield; + + Bitfield = function () { + function Bitfield(type, flags) { + this.type = type; + this.flags = flags != null ? flags : []; + } + + Bitfield.prototype.decode = function (stream) { + var flag, i, res, val, _i, _len, _ref; + + val = this.type.decode(stream); + res = {}; + _ref = this.flags; + + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + flag = _ref[i]; + + if (flag != null) { + res[flag] = !!(val & 1 << i); + } + } + + return res; + }; + + Bitfield.prototype.size = function () { + return this.type.size(); + }; + + Bitfield.prototype.encode = function (stream, keys) { + var flag, i, val, _i, _len, _ref; + + val = 0; + _ref = this.flags; + + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + flag = _ref[i]; + + if (flag != null) { + if (keys[flag]) { + val |= 1 << i; + } + } + } + + return this.type.encode(stream, val); + }; + + return Bitfield; + }(); + + module.exports = Bitfield; + }).call(commonjsGlobal); +}); + +var _Boolean = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var BooleanT; + + BooleanT = function () { + function BooleanT(type) { + this.type = type; + } + + BooleanT.prototype.decode = function (stream, parent) { + return !!this.type.decode(stream, parent); + }; + + BooleanT.prototype.size = function (val, parent) { + return this.type.size(val, parent); + }; + + BooleanT.prototype.encode = function (stream, val, parent) { + return this.type.encode(stream, +val, parent); + }; + + return BooleanT; + }(); + + module.exports = BooleanT; + }).call(commonjsGlobal); +}); + +var Buffer$8 = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var BufferT, NumberT, utils$1; + utils$1 = utils; + NumberT = _Number.Number; + + BufferT = function () { + function BufferT(length) { + this.length = length; + } + + BufferT.prototype.decode = function (stream, parent) { + var length; + length = utils$1.resolveLength(this.length, stream, parent); + return stream.readBuffer(length); + }; + + BufferT.prototype.size = function (val, parent) { + if (!val) { + return utils$1.resolveLength(this.length, null, parent); + } + + return val.length; + }; + + BufferT.prototype.encode = function (stream, buf, parent) { + if (this.length instanceof NumberT) { + this.length.encode(stream, buf.length); + } + + return stream.writeBuffer(buf); + }; + + return BufferT; + }(); + + module.exports = BufferT; + }).call(commonjsGlobal); +}); + +var Enum = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var Enum; + + Enum = function () { + function Enum(type, options) { + this.type = type; + this.options = options != null ? options : []; + } + + Enum.prototype.decode = function (stream) { + var index; + index = this.type.decode(stream); + return this.options[index] || index; + }; + + Enum.prototype.size = function () { + return this.type.size(); + }; + + Enum.prototype.encode = function (stream, val) { + var index; + index = this.options.indexOf(val); + + if (index === -1) { + throw new Error("Unknown option in enum: " + val); + } + + return this.type.encode(stream, index); + }; + + return Enum; + }(); + + module.exports = Enum; + }).call(commonjsGlobal); +}); + +var Optional = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var Optional; + + Optional = function () { + function Optional(type, condition) { + this.type = type; + this.condition = condition != null ? condition : true; + } + + Optional.prototype.decode = function (stream, parent) { + var condition; + condition = this.condition; + + if (typeof condition === 'function') { + condition = condition.call(parent, parent); + } + + if (condition) { + return this.type.decode(stream, parent); + } + }; + + Optional.prototype.size = function (val, parent) { + var condition; + condition = this.condition; + + if (typeof condition === 'function') { + condition = condition.call(parent, parent); + } + + if (condition) { + return this.type.size(val, parent); + } else { + return 0; + } + }; + + Optional.prototype.encode = function (stream, val, parent) { + var condition; + condition = this.condition; + + if (typeof condition === 'function') { + condition = condition.call(parent, parent); + } + + if (condition) { + return this.type.encode(stream, val, parent); + } + }; + + return Optional; + }(); + + module.exports = Optional; + }).call(commonjsGlobal); +}); + +var Reserved = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var Reserved, utils$1; + utils$1 = utils; + + Reserved = function () { + function Reserved(type, count) { + this.type = type; + this.count = count != null ? count : 1; + } + + Reserved.prototype.decode = function (stream, parent) { + stream.pos += this.size(null, parent); + return void 0; + }; + + Reserved.prototype.size = function (data, parent) { + var count; + count = utils$1.resolveLength(this.count, null, parent); + return this.type.size() * count; + }; + + Reserved.prototype.encode = function (stream, val, parent) { + return stream.fill(0, this.size(val, parent)); + }; + + return Reserved; + }(); + + module.exports = Reserved; + }).call(commonjsGlobal); +}); + +var _String = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var NumberT, StringT, utils$1; + NumberT = _Number.Number; + utils$1 = utils; + + StringT = function () { + function StringT(length, encoding) { + this.length = length; + this.encoding = encoding != null ? encoding : 'ascii'; + } + + StringT.prototype.decode = function (stream, parent) { + var buffer, encoding, length, pos, string; + + length = function () { + if (this.length != null) { + return utils$1.resolveLength(this.length, stream, parent); + } else { + buffer = stream.buffer, length = stream.length, pos = stream.pos; + + while (pos < length && buffer[pos] !== 0x00) { + ++pos; + } + + return pos - stream.pos; + } + }.call(this); + + encoding = this.encoding; + + if (typeof encoding === 'function') { + encoding = encoding.call(parent, parent) || 'ascii'; + } + + string = stream.readString(length, encoding); + + if (this.length == null && stream.pos < stream.length) { + stream.pos++; + } + + return string; + }; + + StringT.prototype.size = function (val, parent) { + var encoding, size; + + if (!val) { + return utils$1.resolveLength(this.length, null, parent); + } + + encoding = this.encoding; + + if (typeof encoding === 'function') { + encoding = encoding.call(parent != null ? parent.val : void 0, parent != null ? parent.val : void 0) || 'ascii'; + } + + if (encoding === 'utf16be') { + encoding = 'utf16le'; + } + + size = buffer_1.byteLength(val, encoding); + + if (this.length instanceof NumberT) { + size += this.length.size(); + } + + if (this.length == null) { + size++; + } + + return size; + }; + + StringT.prototype.encode = function (stream, val, parent) { + var encoding; + encoding = this.encoding; + + if (typeof encoding === 'function') { + encoding = encoding.call(parent != null ? parent.val : void 0, parent != null ? parent.val : void 0) || 'ascii'; + } + + if (this.length instanceof NumberT) { + this.length.encode(stream, buffer_1.byteLength(val, encoding)); + } + + stream.writeString(val, encoding); + + if (this.length == null) { + return stream.writeUInt8(0x00); + } + }; + + return StringT; + }(); + + module.exports = StringT; + }).call(commonjsGlobal); +}); + +var Struct = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var Struct, utils$1; + utils$1 = utils; + + Struct = function () { + function Struct(fields) { + this.fields = fields != null ? fields : {}; + } + + Struct.prototype.decode = function (stream, parent, length) { + var res, _ref; + + if (length == null) { + length = 0; + } + + res = this._setup(stream, parent, length); + + this._parseFields(stream, res, this.fields); + + if ((_ref = this.process) != null) { + _ref.call(res, stream); + } + + return res; + }; + + Struct.prototype._setup = function (stream, parent, length) { + var res; + res = {}; + Object.defineProperties(res, { + parent: { + value: parent + }, + _startOffset: { + value: stream.pos + }, + _currentOffset: { + value: 0, + writable: true + }, + _length: { + value: length + } + }); + return res; + }; + + Struct.prototype._parseFields = function (stream, res, fields) { + var key, type, val; + + for (key in fields) { + type = fields[key]; + + if (typeof type === 'function') { + val = type.call(res, res); + } else { + val = type.decode(stream, res); + } + + if (val !== void 0) { + if (val instanceof utils$1.PropertyDescriptor) { + Object.defineProperty(res, key, val); + } else { + res[key] = val; + } + } + + res._currentOffset = stream.pos - res._startOffset; + } + }; + + Struct.prototype.size = function (val, parent, includePointers) { + var ctx, key, size, type, _ref; + + if (val == null) { + val = {}; + } + + if (includePointers == null) { + includePointers = true; + } + + ctx = { + parent: parent, + val: val, + pointerSize: 0 + }; + size = 0; + _ref = this.fields; + + for (key in _ref) { + type = _ref[key]; + + if (type.size != null) { + size += type.size(val[key], ctx); + } + } + + if (includePointers) { + size += ctx.pointerSize; + } + + return size; + }; + + Struct.prototype.encode = function (stream, val, parent) { + var ctx, i, key, ptr, type, _ref, _ref1; + + if ((_ref = this.preEncode) != null) { + _ref.call(val, stream); + } + + ctx = { + pointers: [], + startOffset: stream.pos, + parent: parent, + val: val, + pointerSize: 0 + }; + ctx.pointerOffset = stream.pos + this.size(val, ctx, false); + _ref1 = this.fields; + + for (key in _ref1) { + type = _ref1[key]; + + if (type.encode != null) { + type.encode(stream, val[key], ctx); + } + } + + i = 0; + + while (i < ctx.pointers.length) { + ptr = ctx.pointers[i++]; + ptr.type.encode(stream, ptr.val, ptr.parent); + } + }; + + return Struct; + }(); + + module.exports = Struct; + }).call(commonjsGlobal); +}); + +var VersionedStruct = createCommonjsModule(function (module) { + // Generated by CoffeeScript 1.7.1 + (function () { + var Struct$1, + VersionedStruct, + __hasProp = {}.hasOwnProperty, + __extends = function __extends(child, parent) { + for (var key in parent) { + if (__hasProp.call(parent, key)) child[key] = parent[key]; + } + + function ctor() { + this.constructor = child; + } + + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }; + + Struct$1 = Struct; + + VersionedStruct = function (_super) { + __extends(VersionedStruct, _super); + + function VersionedStruct(type, versions) { + this.type = type; + this.versions = versions != null ? versions : {}; + } + + VersionedStruct.prototype.versionGetter = function (parent) { + if (typeof this.type === 'string') { + return this.type.split('.').reduce(function (obj, prop) { + if (typeof obj !== 'undefined') { + return obj[prop]; + } else { + return void 0; + } + }, parent); + } + }; + + VersionedStruct.prototype.versionSetter = function (parent, version) { + if (typeof this.type === 'string') { + return this.type.split('.').reduce(function (obj, prop) { + return obj[prop] = version; + }, parent); + } + }; + + VersionedStruct.prototype.decode = function (stream, parent, length) { + var fields, res, _ref; + + if (length == null) { + length = 0; + } + + res = this._setup(stream, parent, length); + + if (typeof this.type === 'string') { + res.version = this.versionGetter(parent); + } else { + res.version = this.type.decode(stream); + } + + if (this.versions.header) { + this._parseFields(stream, res, this.versions.header); + } + + fields = this.versions[res.version]; + + if (fields == null) { + throw new Error("Unknown version " + res.version); + } + + if (fields instanceof VersionedStruct) { + return fields.decode(stream, parent); + } + + this._parseFields(stream, res, fields); + + if ((_ref = this.process) != null) { + _ref.call(res, stream); + } + + return res; + }; + + VersionedStruct.prototype.size = function (val, parent, includePointers) { + var ctx, fields, key, size, type, _ref; + + if (includePointers == null) { + includePointers = true; + } + + if (!val) { + throw new Error('Not a fixed size'); + } + + ctx = { + parent: parent, + val: val, + pointerSize: 0 + }; + size = 0; + + if (typeof this.type !== 'string') { + size += this.type.size(val.version, ctx); + } + + if (this.versions.header) { + _ref = this.versions.header; + + for (key in _ref) { + type = _ref[key]; + + if (type.size != null) { + size += type.size(val[key], ctx); + } + } + } + + fields = this.versions[val.version]; + + if (fields == null) { + throw new Error("Unknown version " + val.version); + } + + for (key in fields) { + type = fields[key]; + + if (type.size != null) { + size += type.size(val[key], ctx); + } + } + + if (includePointers) { + size += ctx.pointerSize; + } + + return size; + }; + + VersionedStruct.prototype.encode = function (stream, val, parent) { + var ctx, fields, i, key, ptr, type, _ref, _ref1; + + if ((_ref = this.preEncode) != null) { + _ref.call(val, stream); + } + + ctx = { + pointers: [], + startOffset: stream.pos, + parent: parent, + val: val, + pointerSize: 0 + }; + ctx.pointerOffset = stream.pos + this.size(val, ctx, false); + + if (typeof this.type !== 'string') { + this.type.encode(stream, val.version); + } + + if (this.versions.header) { + _ref1 = this.versions.header; + + for (key in _ref1) { + type = _ref1[key]; + + if (type.encode != null) { + type.encode(stream, val[key], ctx); + } + } + } + + fields = this.versions[val.version]; + + for (key in fields) { + type = fields[key]; + + if (type.encode != null) { + type.encode(stream, val[key], ctx); + } + } + + i = 0; + + while (i < ctx.pointers.length) { + ptr = ctx.pointers[i++]; + ptr.type.encode(stream, ptr.val, ptr.parent); + } + }; + + return VersionedStruct; + }(Struct$1); + + module.exports = VersionedStruct; + }).call(commonjsGlobal); +}); + +var Pointer = createCommonjsModule(function (module, exports) { + // Generated by CoffeeScript 1.7.1 + (function () { + var Pointer, VoidPointer, utils$1; + utils$1 = utils; + + Pointer = function () { + function Pointer(offsetType, type, options) { + var _base, _base1, _base2, _base3; + + this.offsetType = offsetType; + this.type = type; + this.options = options != null ? options : {}; + + if (this.type === 'void') { + this.type = null; + } + + if ((_base = this.options).type == null) { + _base.type = 'local'; + } + + if ((_base1 = this.options).allowNull == null) { + _base1.allowNull = true; + } + + if ((_base2 = this.options).nullValue == null) { + _base2.nullValue = 0; + } + + if ((_base3 = this.options).lazy == null) { + _base3.lazy = false; + } + } + + Pointer.prototype.relativeToGetter = function (ctx) { + return this.options.relativeTo.split('.').reduce(function (obj, prop) { + return obj[prop]; + }, ctx); + }; + + Pointer.prototype.decode = function (stream, ctx) { + var c, decodeValue, offset, ptr, relative, val; + offset = this.offsetType.decode(stream, ctx); + + if (offset === this.options.nullValue && this.options.allowNull) { + return null; + } + + relative = function () { + switch (this.options.type) { + case 'local': + return ctx._startOffset; + + case 'immediate': + return stream.pos - this.offsetType.size(); + + case 'parent': + return ctx.parent._startOffset; + + default: + c = ctx; + + while (c.parent) { + c = c.parent; + } + + return c._startOffset || 0; + } + }.call(this); + + if (this.options.relativeTo) { + relative += this.relativeToGetter(ctx); + } + + ptr = offset + relative; + + if (this.type != null) { + val = null; + + decodeValue = function (_this) { + return function () { + var pos; + + if (val != null) { + return val; + } + + pos = stream.pos; + stream.pos = ptr; + val = _this.type.decode(stream, ctx); + stream.pos = pos; + return val; + }; + }(this); + + if (this.options.lazy) { + return new utils$1.PropertyDescriptor({ + get: decodeValue + }); + } + + return decodeValue(); + } else { + return ptr; + } + }; + + Pointer.prototype.size = function (val, ctx) { + var parent, type; + parent = ctx; + + switch (this.options.type) { + case 'local': + case 'immediate': + break; + + case 'parent': + ctx = ctx.parent; + break; + + default: + while (ctx.parent) { + ctx = ctx.parent; + } + + } + + type = this.type; + + if (type == null) { + if (!(val instanceof VoidPointer)) { + throw new Error("Must be a VoidPointer"); + } + + type = val.type; + val = val.value; + } + + if (val && ctx) { + ctx.pointerSize += type.size(val, parent); + } + + return this.offsetType.size(); + }; + + Pointer.prototype.encode = function (stream, val, ctx) { + var parent, relative, type; + parent = ctx; + + if (val == null) { + this.offsetType.encode(stream, this.options.nullValue); + return; + } + + switch (this.options.type) { + case 'local': + relative = ctx.startOffset; + break; + + case 'immediate': + relative = stream.pos + this.offsetType.size(val, parent); + break; + + case 'parent': + ctx = ctx.parent; + relative = ctx.startOffset; + break; + + default: + relative = 0; + + while (ctx.parent) { + ctx = ctx.parent; + } + + } + + if (this.options.relativeTo) { + relative += this.relativeToGetter(parent.val); + } + + this.offsetType.encode(stream, ctx.pointerOffset - relative); + type = this.type; + + if (type == null) { + if (!(val instanceof VoidPointer)) { + throw new Error("Must be a VoidPointer"); + } + + type = val.type; + val = val.value; + } + + ctx.pointers.push({ + type: type, + val: val, + parent: parent + }); + return ctx.pointerOffset += type.size(val, parent); + }; + + return Pointer; + }(); + + VoidPointer = function () { + function VoidPointer(type, value) { + this.type = type; + this.value = value; + } + + return VoidPointer; + }(); + + exports.Pointer = Pointer; + exports.VoidPointer = VoidPointer; + }).call(commonjsGlobal); +}); +var Pointer_1 = Pointer.Pointer; +var Pointer_2 = Pointer.VoidPointer; + +var restructure = createCommonjsModule(function (module, exports) { + // Generated by CoffeeScript 1.7.1 + (function () { + var key, val, _ref, _ref1; + + exports.EncodeStream = EncodeStream; + exports.DecodeStream = DecodeStream; + exports.Array = _Array; + exports.LazyArray = LazyArray; + exports.Bitfield = Bitfield; + exports.Boolean = _Boolean; + exports.Buffer = Buffer$8; + exports.Enum = Enum; + exports.Optional = Optional; + exports.Reserved = Reserved; + exports.String = _String; + exports.Struct = Struct; + exports.VersionedStruct = VersionedStruct; + _ref = _Number; + + for (key in _ref) { + val = _ref[key]; + exports[key] = val; + } + + _ref1 = Pointer; + + for (key in _ref1) { + val = _ref1[key]; + exports[key] = val; + } + }).call(commonjsGlobal); +}); +var restructure_1 = restructure.EncodeStream; +var restructure_2 = restructure.DecodeStream; +var restructure_3 = restructure.Array; +var restructure_4 = restructure.LazyArray; +var restructure_5 = restructure.Bitfield; +var restructure_6 = restructure.Boolean; +var restructure_7 = restructure.Buffer; +var restructure_8 = restructure.Enum; +var restructure_9 = restructure.Optional; +var restructure_10 = restructure.Reserved; +var restructure_11 = restructure.String; +var restructure_12 = restructure.Struct; +var restructure_13 = restructure.VersionedStruct; + +var formats = []; +var fontkit = { + logErrors: false, + registerFormat: function registerFormat(format) { + formats.push(format); + }, + create: function create(uint8ArrayFontData, postscriptName) { + var buffer = new buffer_1.from(uint8ArrayFontData); + + for (var i = 0; i < formats.length; i++) { + var format = formats[i]; + + if (format.probe(buffer)) { + var font = new format(new restructure.DecodeStream(buffer)); + + if (postscriptName) { + return font.getFont(postscriptName); + } + + return font; + } + } + + throw new Error('Unknown font format'); + } +}; + +/** + * This decorator caches the results of a getter or method such that + * the results are lazily computed once, and then cached. + * @private + */ +function cache(target, key, descriptor) { + if (descriptor.get) { + var get = descriptor.get; + + descriptor.get = function () { + var value = get.call(this); + Object.defineProperty(this, key, { + value: value + }); + return value; + }; + } else if (typeof descriptor.value === 'function') { + var fn = descriptor.value; + return { + get: function get() { + var cache = new Map(); + + function memoized() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var key = args.length > 0 ? args[0] : 'value'; + + if (cache.has(key)) { + return cache.get(key); + } + + var result = fn.apply(this, args); + cache.set(key, result); + return result; + } + Object.defineProperty(this, key, { + value: memoized + }); + return memoized; + } + }; + } +} + +var SubHeader = new restructure.Struct({ + firstCode: restructure.uint16, + entryCount: restructure.uint16, + idDelta: restructure.int16, + idRangeOffset: restructure.uint16 +}); +var CmapGroup = new restructure.Struct({ + startCharCode: restructure.uint32, + endCharCode: restructure.uint32, + glyphID: restructure.uint32 +}); +var UnicodeValueRange = new restructure.Struct({ + startUnicodeValue: restructure.uint24, + additionalCount: restructure.uint8 +}); +var UVSMapping = new restructure.Struct({ + unicodeValue: restructure.uint24, + glyphID: restructure.uint16 +}); +var DefaultUVS = new restructure.Array(UnicodeValueRange, restructure.uint32); +var NonDefaultUVS = new restructure.Array(UVSMapping, restructure.uint32); +var VarSelectorRecord = new restructure.Struct({ + varSelector: restructure.uint24, + defaultUVS: new restructure.Pointer(restructure.uint32, DefaultUVS, { + type: 'parent' + }), + nonDefaultUVS: new restructure.Pointer(restructure.uint32, NonDefaultUVS, { + type: 'parent' + }) +}); +var CmapSubtable = new restructure.VersionedStruct(restructure.uint16, { + 0: { + // Byte encoding + length: restructure.uint16, + // Total table length in bytes (set to 262 for format 0) + language: restructure.uint16, + // Language code for this encoding subtable, or zero if language-independent + codeMap: new restructure.LazyArray(restructure.uint8, 256) + }, + 2: { + // High-byte mapping (CJK) + length: restructure.uint16, + language: restructure.uint16, + subHeaderKeys: new restructure.Array(restructure.uint16, 256), + subHeaderCount: function subHeaderCount(t) { + return Math.max.apply(Math, t.subHeaderKeys); + }, + subHeaders: new restructure.LazyArray(SubHeader, 'subHeaderCount'), + glyphIndexArray: new restructure.LazyArray(restructure.uint16, 'subHeaderCount') + }, + 4: { + // Segment mapping to delta values + length: restructure.uint16, + // Total table length in bytes + language: restructure.uint16, + // Language code + segCountX2: restructure.uint16, + segCount: function segCount(t) { + return t.segCountX2 >> 1; + }, + searchRange: restructure.uint16, + entrySelector: restructure.uint16, + rangeShift: restructure.uint16, + endCode: new restructure.LazyArray(restructure.uint16, 'segCount'), + reservedPad: new restructure.Reserved(restructure.uint16), + // This value should be zero + startCode: new restructure.LazyArray(restructure.uint16, 'segCount'), + idDelta: new restructure.LazyArray(restructure.int16, 'segCount'), + idRangeOffset: new restructure.LazyArray(restructure.uint16, 'segCount'), + glyphIndexArray: new restructure.LazyArray(restructure.uint16, function (t) { + return (t.length - t._currentOffset) / 2; + }) + }, + 6: { + // Trimmed table + length: restructure.uint16, + language: restructure.uint16, + firstCode: restructure.uint16, + entryCount: restructure.uint16, + glyphIndices: new restructure.LazyArray(restructure.uint16, 'entryCount') + }, + 8: { + // mixed 16-bit and 32-bit coverage + reserved: new restructure.Reserved(restructure.uint16), + length: restructure.uint32, + language: restructure.uint16, + is32: new restructure.LazyArray(restructure.uint8, 8192), + nGroups: restructure.uint32, + groups: new restructure.LazyArray(CmapGroup, 'nGroups') + }, + 10: { + // Trimmed Array + reserved: new restructure.Reserved(restructure.uint16), + length: restructure.uint32, + language: restructure.uint32, + firstCode: restructure.uint32, + entryCount: restructure.uint32, + glyphIndices: new restructure.LazyArray(restructure.uint16, 'numChars') + }, + 12: { + // Segmented coverage + reserved: new restructure.Reserved(restructure.uint16), + length: restructure.uint32, + language: restructure.uint32, + nGroups: restructure.uint32, + groups: new restructure.LazyArray(CmapGroup, 'nGroups') + }, + 13: { + // Many-to-one range mappings (same as 12 except for group.startGlyphID) + reserved: new restructure.Reserved(restructure.uint16), + length: restructure.uint32, + language: restructure.uint32, + nGroups: restructure.uint32, + groups: new restructure.LazyArray(CmapGroup, 'nGroups') + }, + 14: { + // Unicode Variation Sequences + length: restructure.uint32, + numRecords: restructure.uint32, + varSelectors: new restructure.LazyArray(VarSelectorRecord, 'numRecords') + } +}); +var CmapEntry = new restructure.Struct({ + platformID: restructure.uint16, + // Platform identifier + encodingID: restructure.uint16, + // Platform-specific encoding identifier + table: new restructure.Pointer(restructure.uint32, CmapSubtable, { + type: 'parent', + lazy: true + }) +}); // character to glyph mapping + +var cmap = new restructure.Struct({ + version: restructure.uint16, + numSubtables: restructure.uint16, + tables: new restructure.Array(CmapEntry, 'numSubtables') +}); + +var head = new restructure.Struct({ + version: restructure.int32, + // 0x00010000 (version 1.0) + revision: restructure.int32, + // set by font manufacturer + checkSumAdjustment: restructure.uint32, + magicNumber: restructure.uint32, + // set to 0x5F0F3CF5 + flags: restructure.uint16, + unitsPerEm: restructure.uint16, + // range from 64 to 16384 + created: new restructure.Array(restructure.int32, 2), + modified: new restructure.Array(restructure.int32, 2), + xMin: restructure.int16, + // for all glyph bounding boxes + yMin: restructure.int16, + // for all glyph bounding boxes + xMax: restructure.int16, + // for all glyph bounding boxes + yMax: restructure.int16, + // for all glyph bounding boxes + macStyle: new restructure.Bitfield(restructure.uint16, ['bold', 'italic', 'underline', 'outline', 'shadow', 'condensed', 'extended']), + lowestRecPPEM: restructure.uint16, + // smallest readable size in pixels + fontDirectionHint: restructure.int16, + indexToLocFormat: restructure.int16, + // 0 for short offsets, 1 for long + glyphDataFormat: restructure.int16 // 0 for current format + +}); + +var hhea = new restructure.Struct({ + version: restructure.int32, + ascent: restructure.int16, + // Distance from baseline of highest ascender + descent: restructure.int16, + // Distance from baseline of lowest descender + lineGap: restructure.int16, + // Typographic line gap + advanceWidthMax: restructure.uint16, + // Maximum advance width value in 'hmtx' table + minLeftSideBearing: restructure.int16, + // Maximum advance width value in 'hmtx' table + minRightSideBearing: restructure.int16, + // Minimum right sidebearing value + xMaxExtent: restructure.int16, + caretSlopeRise: restructure.int16, + // Used to calculate the slope of the cursor (rise/run); 1 for vertical + caretSlopeRun: restructure.int16, + // 0 for vertical + caretOffset: restructure.int16, + // Set to 0 for non-slanted fonts + reserved: new restructure.Reserved(restructure.int16, 4), + metricDataFormat: restructure.int16, + // 0 for current format + numberOfMetrics: restructure.uint16 // Number of advance widths in 'hmtx' table + +}); + +var HmtxEntry = new restructure.Struct({ + advance: restructure.uint16, + bearing: restructure.int16 +}); +var hmtx = new restructure.Struct({ + metrics: new restructure.LazyArray(HmtxEntry, function (t) { + return t.parent.hhea.numberOfMetrics; + }), + bearings: new restructure.LazyArray(restructure.int16, function (t) { + return t.parent.maxp.numGlyphs - t.parent.hhea.numberOfMetrics; + }) +}); + +var maxp = new restructure.Struct({ + version: restructure.int32, + numGlyphs: restructure.uint16, + // The number of glyphs in the font + maxPoints: restructure.uint16, + // Maximum points in a non-composite glyph + maxContours: restructure.uint16, + // Maximum contours in a non-composite glyph + maxComponentPoints: restructure.uint16, + // Maximum points in a composite glyph + maxComponentContours: restructure.uint16, + // Maximum contours in a composite glyph + maxZones: restructure.uint16, + // 1 if instructions do not use the twilight zone, 2 otherwise + maxTwilightPoints: restructure.uint16, + // Maximum points used in Z0 + maxStorage: restructure.uint16, + // Number of Storage Area locations + maxFunctionDefs: restructure.uint16, + // Number of FDEFs + maxInstructionDefs: restructure.uint16, + // Number of IDEFs + maxStackElements: restructure.uint16, + // Maximum stack depth + maxSizeOfInstructions: restructure.uint16, + // Maximum byte count for glyph instructions + maxComponentElements: restructure.uint16, + // Maximum number of components referenced at “top level” for any composite glyph + maxComponentDepth: restructure.uint16 // Maximum levels of recursion; 1 for simple components + +}); + +/** + * Gets an encoding name from platform, encoding, and language ids. + * Returned encoding names can be used in iconv-lite to decode text. + */ +function getEncoding(platformID, encodingID, languageID) { + if (languageID === void 0) { + languageID = 0; + } + + if (platformID === 1 && MAC_LANGUAGE_ENCODINGS[languageID]) { + return MAC_LANGUAGE_ENCODINGS[languageID]; + } + + return ENCODINGS[platformID][encodingID]; +} // Map of platform ids to encoding ids. + +var ENCODINGS = [// unicode +['utf16be', 'utf16be', 'utf16be', 'utf16be', 'utf16be', 'utf16be'], // macintosh +// Mappings available at http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/ +// 0 Roman 17 Malayalam +// 1 Japanese 18 Sinhalese +// 2 Traditional Chinese 19 Burmese +// 3 Korean 20 Khmer +// 4 Arabic 21 Thai +// 5 Hebrew 22 Laotian +// 6 Greek 23 Georgian +// 7 Russian 24 Armenian +// 8 RSymbol 25 Simplified Chinese +// 9 Devanagari 26 Tibetan +// 10 Gurmukhi 27 Mongolian +// 11 Gujarati 28 Geez +// 12 Oriya 29 Slavic +// 13 Bengali 30 Vietnamese +// 14 Tamil 31 Sindhi +// 15 Telugu 32 (Uninterpreted) +// 16 Kannada +['macroman', 'shift-jis', 'big5', 'euc-kr', 'iso-8859-6', 'iso-8859-8', 'macgreek', 'maccyrillic', 'symbol', 'Devanagari', 'Gurmukhi', 'Gujarati', 'Oriya', 'Bengali', 'Tamil', 'Telugu', 'Kannada', 'Malayalam', 'Sinhalese', 'Burmese', 'Khmer', 'macthai', 'Laotian', 'Georgian', 'Armenian', 'gb-2312-80', 'Tibetan', 'Mongolian', 'Geez', 'maccenteuro', 'Vietnamese', 'Sindhi'], // ISO (deprecated) +['ascii'], // windows +// Docs here: http://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx +['symbol', 'utf16be', 'shift-jis', 'gb18030', 'big5', 'wansung', 'johab', null, null, null, 'utf16be']]; // Overrides for Mac scripts by language id. +// See http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt + +var MAC_LANGUAGE_ENCODINGS = { + 15: 'maciceland', + 17: 'macturkish', + 18: 'maccroatian', + 24: 'maccenteuro', + 25: 'maccenteuro', + 26: 'maccenteuro', + 27: 'maccenteuro', + 28: 'maccenteuro', + 30: 'maciceland', + 37: 'macromania', + 38: 'maccenteuro', + 39: 'maccenteuro', + 40: 'maccenteuro', + 143: 'macinuit', + // Unsupported by iconv-lite + 146: 'macgaelic' // Unsupported by iconv-lite + +}; // Map of platform ids to BCP-47 language codes. + +var LANGUAGES = [// unicode +[], { + // macintosh + 0: 'en', + 30: 'fo', + 60: 'ks', + 90: 'rw', + 1: 'fr', + 31: 'fa', + 61: 'ku', + 91: 'rn', + 2: 'de', + 32: 'ru', + 62: 'sd', + 92: 'ny', + 3: 'it', + 33: 'zh', + 63: 'bo', + 93: 'mg', + 4: 'nl', + 34: 'nl-BE', + 64: 'ne', + 94: 'eo', + 5: 'sv', + 35: 'ga', + 65: 'sa', + 128: 'cy', + 6: 'es', + 36: 'sq', + 66: 'mr', + 129: 'eu', + 7: 'da', + 37: 'ro', + 67: 'bn', + 130: 'ca', + 8: 'pt', + 38: 'cz', + 68: 'as', + 131: 'la', + 9: 'no', + 39: 'sk', + 69: 'gu', + 132: 'qu', + 10: 'he', + 40: 'si', + 70: 'pa', + 133: 'gn', + 11: 'ja', + 41: 'yi', + 71: 'or', + 134: 'ay', + 12: 'ar', + 42: 'sr', + 72: 'ml', + 135: 'tt', + 13: 'fi', + 43: 'mk', + 73: 'kn', + 136: 'ug', + 14: 'el', + 44: 'bg', + 74: 'ta', + 137: 'dz', + 15: 'is', + 45: 'uk', + 75: 'te', + 138: 'jv', + 16: 'mt', + 46: 'be', + 76: 'si', + 139: 'su', + 17: 'tr', + 47: 'uz', + 77: 'my', + 140: 'gl', + 18: 'hr', + 48: 'kk', + 78: 'km', + 141: 'af', + 19: 'zh-Hant', + 49: 'az-Cyrl', + 79: 'lo', + 142: 'br', + 20: 'ur', + 50: 'az-Arab', + 80: 'vi', + 143: 'iu', + 21: 'hi', + 51: 'hy', + 81: 'id', + 144: 'gd', + 22: 'th', + 52: 'ka', + 82: 'tl', + 145: 'gv', + 23: 'ko', + 53: 'mo', + 83: 'ms', + 146: 'ga', + 24: 'lt', + 54: 'ky', + 84: 'ms-Arab', + 147: 'to', + 25: 'pl', + 55: 'tg', + 85: 'am', + 148: 'el-polyton', + 26: 'hu', + 56: 'tk', + 86: 'ti', + 149: 'kl', + 27: 'es', + 57: 'mn-CN', + 87: 'om', + 150: 'az', + 28: 'lv', + 58: 'mn', + 88: 'so', + 151: 'nn', + 29: 'se', + 59: 'ps', + 89: 'sw' +}, // ISO (deprecated) +[], { + // windows + 0x0436: 'af', + 0x4009: 'en-IN', + 0x0487: 'rw', + 0x0432: 'tn', + 0x041C: 'sq', + 0x1809: 'en-IE', + 0x0441: 'sw', + 0x045B: 'si', + 0x0484: 'gsw', + 0x2009: 'en-JM', + 0x0457: 'kok', + 0x041B: 'sk', + 0x045E: 'am', + 0x4409: 'en-MY', + 0x0412: 'ko', + 0x0424: 'sl', + 0x1401: 'ar-DZ', + 0x1409: 'en-NZ', + 0x0440: 'ky', + 0x2C0A: 'es-AR', + 0x3C01: 'ar-BH', + 0x3409: 'en-PH', + 0x0454: 'lo', + 0x400A: 'es-BO', + 0x0C01: 'ar', + 0x4809: 'en-SG', + 0x0426: 'lv', + 0x340A: 'es-CL', + 0x0801: 'ar-IQ', + 0x1C09: 'en-ZA', + 0x0427: 'lt', + 0x240A: 'es-CO', + 0x2C01: 'ar-JO', + 0x2C09: 'en-TT', + 0x082E: 'dsb', + 0x140A: 'es-CR', + 0x3401: 'ar-KW', + 0x0809: 'en-GB', + 0x046E: 'lb', + 0x1C0A: 'es-DO', + 0x3001: 'ar-LB', + 0x0409: 'en', + 0x042F: 'mk', + 0x300A: 'es-EC', + 0x1001: 'ar-LY', + 0x3009: 'en-ZW', + 0x083E: 'ms-BN', + 0x440A: 'es-SV', + 0x1801: 'ary', + 0x0425: 'et', + 0x043E: 'ms', + 0x100A: 'es-GT', + 0x2001: 'ar-OM', + 0x0438: 'fo', + 0x044C: 'ml', + 0x480A: 'es-HN', + 0x4001: 'ar-QA', + 0x0464: 'fil', + 0x043A: 'mt', + 0x080A: 'es-MX', + 0x0401: 'ar-SA', + 0x040B: 'fi', + 0x0481: 'mi', + 0x4C0A: 'es-NI', + 0x2801: 'ar-SY', + 0x080C: 'fr-BE', + 0x047A: 'arn', + 0x180A: 'es-PA', + 0x1C01: 'aeb', + 0x0C0C: 'fr-CA', + 0x044E: 'mr', + 0x3C0A: 'es-PY', + 0x3801: 'ar-AE', + 0x040C: 'fr', + 0x047C: 'moh', + 0x280A: 'es-PE', + 0x2401: 'ar-YE', + 0x140C: 'fr-LU', + 0x0450: 'mn', + 0x500A: 'es-PR', + 0x042B: 'hy', + 0x180C: 'fr-MC', + 0x0850: 'mn-CN', + 0x0C0A: 'es', + 0x044D: 'as', + 0x100C: 'fr-CH', + 0x0461: 'ne', + 0x040A: 'es', + 0x082C: 'az-Cyrl', + 0x0462: 'fy', + 0x0414: 'nb', + 0x540A: 'es-US', + 0x042C: 'az', + 0x0456: 'gl', + 0x0814: 'nn', + 0x380A: 'es-UY', + 0x046D: 'ba', + 0x0437: 'ka', + 0x0482: 'oc', + 0x200A: 'es-VE', + 0x042D: 'eu', + 0x0C07: 'de-AT', + 0x0448: 'or', + 0x081D: 'sv-FI', + 0x0423: 'be', + 0x0407: 'de', + 0x0463: 'ps', + 0x041D: 'sv', + 0x0845: 'bn', + 0x1407: 'de-LI', + 0x0415: 'pl', + 0x045A: 'syr', + 0x0445: 'bn-IN', + 0x1007: 'de-LU', + 0x0416: 'pt', + 0x0428: 'tg', + 0x201A: 'bs-Cyrl', + 0x0807: 'de-CH', + 0x0816: 'pt-PT', + 0x085F: 'tzm', + 0x141A: 'bs', + 0x0408: 'el', + 0x0446: 'pa', + 0x0449: 'ta', + 0x047E: 'br', + 0x046F: 'kl', + 0x046B: 'qu-BO', + 0x0444: 'tt', + 0x0402: 'bg', + 0x0447: 'gu', + 0x086B: 'qu-EC', + 0x044A: 'te', + 0x0403: 'ca', + 0x0468: 'ha', + 0x0C6B: 'qu', + 0x041E: 'th', + 0x0C04: 'zh-HK', + 0x040D: 'he', + 0x0418: 'ro', + 0x0451: 'bo', + 0x1404: 'zh-MO', + 0x0439: 'hi', + 0x0417: 'rm', + 0x041F: 'tr', + 0x0804: 'zh', + 0x040E: 'hu', + 0x0419: 'ru', + 0x0442: 'tk', + 0x1004: 'zh-SG', + 0x040F: 'is', + 0x243B: 'smn', + 0x0480: 'ug', + 0x0404: 'zh-TW', + 0x0470: 'ig', + 0x103B: 'smj-NO', + 0x0422: 'uk', + 0x0483: 'co', + 0x0421: 'id', + 0x143B: 'smj', + 0x042E: 'hsb', + 0x041A: 'hr', + 0x045D: 'iu', + 0x0C3B: 'se-FI', + 0x0420: 'ur', + 0x101A: 'hr-BA', + 0x085D: 'iu-Latn', + 0x043B: 'se', + 0x0843: 'uz-Cyrl', + 0x0405: 'cs', + 0x083C: 'ga', + 0x083B: 'se-SE', + 0x0443: 'uz', + 0x0406: 'da', + 0x0434: 'xh', + 0x203B: 'sms', + 0x042A: 'vi', + 0x048C: 'prs', + 0x0435: 'zu', + 0x183B: 'sma-NO', + 0x0452: 'cy', + 0x0465: 'dv', + 0x0410: 'it', + 0x1C3B: 'sms', + 0x0488: 'wo', + 0x0813: 'nl-BE', + 0x0810: 'it-CH', + 0x044F: 'sa', + 0x0485: 'sah', + 0x0413: 'nl', + 0x0411: 'ja', + 0x1C1A: 'sr-Cyrl-BA', + 0x0478: 'ii', + 0x0C09: 'en-AU', + 0x044B: 'kn', + 0x0C1A: 'sr', + 0x046A: 'yo', + 0x2809: 'en-BZ', + 0x043F: 'kk', + 0x181A: 'sr-Latn-BA', + 0x1009: 'en-CA', + 0x0453: 'km', + 0x081A: 'sr-Latn', + 0x2409: 'en-029', + 0x0486: 'quc', + 0x046C: 'nso' +}]; + +function _createForOfIteratorHelperLoose(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +var NameRecord = new restructure.Struct({ + platformID: restructure.uint16, + encodingID: restructure.uint16, + languageID: restructure.uint16, + nameID: restructure.uint16, + length: restructure.uint16, + string: new restructure.Pointer(restructure.uint16, new restructure.String('length', function (t) { + return getEncoding(t.platformID, t.encodingID, t.languageID); + }), { + type: 'parent', + relativeTo: 'parent.stringOffset', + allowNull: false + }) +}); +var LangTagRecord = new restructure.Struct({ + length: restructure.uint16, + tag: new restructure.Pointer(restructure.uint16, new restructure.String('length', 'utf16be'), { + type: 'parent', + relativeTo: 'stringOffset' + }) +}); +var NameTable = new restructure.VersionedStruct(restructure.uint16, { + 0: { + count: restructure.uint16, + stringOffset: restructure.uint16, + records: new restructure.Array(NameRecord, 'count') + }, + 1: { + count: restructure.uint16, + stringOffset: restructure.uint16, + records: new restructure.Array(NameRecord, 'count'), + langTagCount: restructure.uint16, + langTags: new restructure.Array(LangTagRecord, 'langTagCount') + } +}); +var NAMES = ['copyright', 'fontFamily', 'fontSubfamily', 'uniqueSubfamily', 'fullName', 'version', 'postscriptName', // Note: A font may have only one PostScript name and that name must be ASCII. +'trademark', 'manufacturer', 'designer', 'description', 'vendorURL', 'designerURL', 'license', 'licenseURL', null, // reserved +'preferredFamily', 'preferredSubfamily', 'compatibleFull', 'sampleText', 'postscriptCIDFontName', 'wwsFamilyName', 'wwsSubfamilyName']; + +NameTable.process = function (stream) { + var records = {}; + + for (var _iterator = _createForOfIteratorHelperLoose(this.records), _step; !(_step = _iterator()).done;) { + var record = _step.value; + // find out what language this is for + var language = LANGUAGES[record.platformID][record.languageID]; + + if (language == null && this.langTags != null && record.languageID >= 0x8000) { + language = this.langTags[record.languageID - 0x8000].tag; + } + + if (language == null) { + language = record.platformID + '-' + record.languageID; + } // if the nameID is >= 256, it is a font feature record (AAT) + + + var key = record.nameID >= 256 ? 'fontFeatures' : NAMES[record.nameID] || record.nameID; + + if (records[key] == null) { + records[key] = {}; + } + + var obj = records[key]; + + if (record.nameID >= 256) { + obj = obj[record.nameID] || (obj[record.nameID] = {}); + } + + if (typeof record.string === 'string' || typeof obj[language] !== 'string') { + obj[language] = record.string; + } + } + + this.records = records; +}; + +NameTable.preEncode = function () { + if (Array.isArray(this.records)) return; + this.version = 0; + var records = []; + + for (var key in this.records) { + var val = this.records[key]; + if (key === 'fontFeatures') continue; + records.push({ + platformID: 3, + encodingID: 1, + languageID: 0x409, + nameID: NAMES.indexOf(key), + length: buffer_1.byteLength(val.en, 'utf16le'), + string: val.en + }); + + if (key === 'postscriptName') { + records.push({ + platformID: 1, + encodingID: 0, + languageID: 0, + nameID: NAMES.indexOf(key), + length: val.en.length, + string: val.en + }); + } + } + + this.records = records; + this.count = records.length; + this.stringOffset = NameTable.size(this, null, false); +}; + +var OS2 = new restructure.VersionedStruct(restructure.uint16, { + header: { + xAvgCharWidth: restructure.int16, + // average weighted advance width of lower case letters and space + usWeightClass: restructure.uint16, + // visual weight of stroke in glyphs + usWidthClass: restructure.uint16, + // relative change from the normal aspect ratio (width to height ratio) + fsType: new restructure.Bitfield(restructure.uint16, [// Indicates font embedding licensing rights + null, 'noEmbedding', 'viewOnly', 'editable', null, null, null, null, 'noSubsetting', 'bitmapOnly']), + ySubscriptXSize: restructure.int16, + // recommended horizontal size in pixels for subscripts + ySubscriptYSize: restructure.int16, + // recommended vertical size in pixels for subscripts + ySubscriptXOffset: restructure.int16, + // recommended horizontal offset for subscripts + ySubscriptYOffset: restructure.int16, + // recommended vertical offset form the baseline for subscripts + ySuperscriptXSize: restructure.int16, + // recommended horizontal size in pixels for superscripts + ySuperscriptYSize: restructure.int16, + // recommended vertical size in pixels for superscripts + ySuperscriptXOffset: restructure.int16, + // recommended horizontal offset for superscripts + ySuperscriptYOffset: restructure.int16, + // recommended vertical offset from the baseline for superscripts + yStrikeoutSize: restructure.int16, + // width of the strikeout stroke + yStrikeoutPosition: restructure.int16, + // position of the strikeout stroke relative to the baseline + sFamilyClass: restructure.int16, + // classification of font-family design + panose: new restructure.Array(restructure.uint8, 10), + // describe the visual characteristics of a given typeface + ulCharRange: new restructure.Array(restructure.uint32, 4), + vendorID: new restructure.String(4), + // four character identifier for the font vendor + fsSelection: new restructure.Bitfield(restructure.uint16, [// bit field containing information about the font + 'italic', 'underscore', 'negative', 'outlined', 'strikeout', 'bold', 'regular', 'useTypoMetrics', 'wws', 'oblique']), + usFirstCharIndex: restructure.uint16, + // The minimum Unicode index in this font + usLastCharIndex: restructure.uint16 // The maximum Unicode index in this font + + }, + // The Apple version of this table ends here, but the Microsoft one continues on... + 0: {}, + 1: { + typoAscender: restructure.int16, + typoDescender: restructure.int16, + typoLineGap: restructure.int16, + winAscent: restructure.uint16, + winDescent: restructure.uint16, + codePageRange: new restructure.Array(restructure.uint32, 2) + }, + 2: { + // these should be common with version 1 somehow + typoAscender: restructure.int16, + typoDescender: restructure.int16, + typoLineGap: restructure.int16, + winAscent: restructure.uint16, + winDescent: restructure.uint16, + codePageRange: new restructure.Array(restructure.uint32, 2), + xHeight: restructure.int16, + capHeight: restructure.int16, + defaultChar: restructure.uint16, + breakChar: restructure.uint16, + maxContent: restructure.uint16 + }, + 5: { + typoAscender: restructure.int16, + typoDescender: restructure.int16, + typoLineGap: restructure.int16, + winAscent: restructure.uint16, + winDescent: restructure.uint16, + codePageRange: new restructure.Array(restructure.uint32, 2), + xHeight: restructure.int16, + capHeight: restructure.int16, + defaultChar: restructure.uint16, + breakChar: restructure.uint16, + maxContent: restructure.uint16, + usLowerOpticalPointSize: restructure.uint16, + usUpperOpticalPointSize: restructure.uint16 + } +}); +var versions$1 = OS2.versions; +versions$1[3] = versions$1[4] = versions$1[2]; + +var post = new restructure.VersionedStruct(restructure.fixed32, { + header: { + // these fields exist at the top of all versions + italicAngle: restructure.fixed32, + // Italic angle in counter-clockwise degrees from the vertical. + underlinePosition: restructure.int16, + // Suggested distance of the top of the underline from the baseline + underlineThickness: restructure.int16, + // Suggested values for the underline thickness + isFixedPitch: restructure.uint32, + // Whether the font is monospaced + minMemType42: restructure.uint32, + // Minimum memory usage when a TrueType font is downloaded as a Type 42 font + maxMemType42: restructure.uint32, + // Maximum memory usage when a TrueType font is downloaded as a Type 42 font + minMemType1: restructure.uint32, + // Minimum memory usage when a TrueType font is downloaded as a Type 1 font + maxMemType1: restructure.uint32 // Maximum memory usage when a TrueType font is downloaded as a Type 1 font + + }, + 1: {}, + // version 1 has no additional fields + 2: { + numberOfGlyphs: restructure.uint16, + glyphNameIndex: new restructure.Array(restructure.uint16, 'numberOfGlyphs'), + names: new restructure.Array(new restructure.String(restructure.uint8)) + }, + 2.5: { + numberOfGlyphs: restructure.uint16, + offsets: new restructure.Array(restructure.uint8, 'numberOfGlyphs') + }, + 3: {}, + // version 3 has no additional fields + 4: { + map: new restructure.Array(restructure.uint32, function (t) { + return t.parent.maxp.numGlyphs; + }) + } +}); + +var cvt = new restructure.Struct({ + controlValues: new restructure.Array(restructure.int16) +}); + +// These instructions are known as the font program. The main use of this table +// is for the definition of functions that are used in many different glyph programs. + +var fpgm = new restructure.Struct({ + instructions: new restructure.Array(restructure.uint8) +}); + +var loca = new restructure.VersionedStruct('head.indexToLocFormat', { + 0: { + offsets: new restructure.Array(restructure.uint16) + }, + 1: { + offsets: new restructure.Array(restructure.uint32) + } +}); + +loca.process = function () { + if (this.version === 0) { + for (var i = 0; i < this.offsets.length; i++) { + this.offsets[i] <<= 1; + } + } +}; + +loca.preEncode = function () { + if (this.version != null) return; // assume this.offsets is a sorted array + + this.version = this.offsets[this.offsets.length - 1] > 0xffff ? 1 : 0; + + if (this.version === 0) { + for (var i = 0; i < this.offsets.length; i++) { + this.offsets[i] >>>= 1; + } + } +}; + +var prep = new restructure.Struct({ + controlValueProgram: new restructure.Array(restructure.uint8) +}); + +var glyf = new restructure.Array(new restructure.Buffer()); + +function _createForOfIteratorHelperLoose$1(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$1(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } + +function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var CFFIndex = /*#__PURE__*/function () { + function CFFIndex(type) { + this.type = type; + } + + var _proto = CFFIndex.prototype; + + _proto.getCFFVersion = function getCFFVersion(ctx) { + while (ctx && !ctx.hdrSize) { + ctx = ctx.parent; + } + + return ctx ? ctx.version : -1; + }; + + _proto.decode = function decode(stream, parent) { + var version = this.getCFFVersion(parent); + var count = version >= 2 ? stream.readUInt32BE() : stream.readUInt16BE(); + + if (count === 0) { + return []; + } + + var offSize = stream.readUInt8(); + var offsetType; + + if (offSize === 1) { + offsetType = restructure.uint8; + } else if (offSize === 2) { + offsetType = restructure.uint16; + } else if (offSize === 3) { + offsetType = restructure.uint24; + } else if (offSize === 4) { + offsetType = restructure.uint32; + } else { + throw new Error("Bad offset size in CFFIndex: " + offSize + " " + stream.pos); + } + + var ret = []; + var startPos = stream.pos + (count + 1) * offSize - 1; + var start = offsetType.decode(stream); + + for (var i = 0; i < count; i++) { + var end = offsetType.decode(stream); + + if (this.type != null) { + var pos = stream.pos; + stream.pos = startPos + start; + parent.length = end - start; + ret.push(this.type.decode(stream, parent)); + stream.pos = pos; + } else { + ret.push({ + offset: startPos + start, + length: end - start + }); + } + + start = end; + } + + stream.pos = startPos + start; + return ret; + }; + + _proto.size = function size(arr, parent) { + var size = 2; + + if (arr.length === 0) { + return size; + } + + var type = this.type || new restructure.Buffer(); // find maximum offset to detminine offset type + + var offset = 1; + + for (var i = 0; i < arr.length; i++) { + var item = arr[i]; + offset += type.size(item, parent); + } + + var offsetType; + + if (offset <= 0xff) { + offsetType = restructure.uint8; + } else if (offset <= 0xffff) { + offsetType = restructure.uint16; + } else if (offset <= 0xffffff) { + offsetType = restructure.uint24; + } else if (offset <= 0xffffffff) { + offsetType = restructure.uint32; + } else { + throw new Error("Bad offset in CFFIndex"); + } + + size += 1 + offsetType.size() * (arr.length + 1); + size += offset - 1; + return size; + }; + + _proto.encode = function encode(stream, arr, parent) { + stream.writeUInt16BE(arr.length); + + if (arr.length === 0) { + return; + } + + var type = this.type || new restructure.Buffer(); // find maximum offset to detminine offset type + + var sizes = []; + var offset = 1; + + for (var _iterator = _createForOfIteratorHelperLoose$1(arr), _step; !(_step = _iterator()).done;) { + var item = _step.value; + var s = type.size(item, parent); + sizes.push(s); + offset += s; + } + + var offsetType; + + if (offset <= 0xff) { + offsetType = restructure.uint8; + } else if (offset <= 0xffff) { + offsetType = restructure.uint16; + } else if (offset <= 0xffffff) { + offsetType = restructure.uint24; + } else if (offset <= 0xffffffff) { + offsetType = restructure.uint32; + } else { + throw new Error("Bad offset in CFFIndex"); + } // write offset size + + + stream.writeUInt8(offsetType.size()); // write elements + + offset = 1; + offsetType.encode(stream, offset); + + for (var _i = 0, _sizes = sizes; _i < _sizes.length; _i++) { + var size = _sizes[_i]; + offset += size; + offsetType.encode(stream, offset); + } + + for (var _iterator2 = _createForOfIteratorHelperLoose$1(arr), _step2; !(_step2 = _iterator2()).done;) { + var _item = _step2.value; + type.encode(stream, _item, parent); + } + + return; + }; + + return CFFIndex; +}(); + +var toStr = Object.prototype.toString; + +var isArguments = function isArguments(value) { + var str = toStr.call(value); + var isArgs = str === '[object Arguments]'; + + if (!isArgs) { + isArgs = str !== '[object Array]' && value !== null && typeof value === 'object' && typeof value.length === 'number' && value.length >= 0 && toStr.call(value.callee) === '[object Function]'; + } + + return isArgs; +}; + +var keysShim; + +if (!Object.keys) { + // modified from https://github.com/es-shims/es5-shim + var has = Object.prototype.hasOwnProperty; + var toStr$1 = Object.prototype.toString; + var isArgs = isArguments; // eslint-disable-line global-require + + var isEnumerable = Object.prototype.propertyIsEnumerable; + var hasDontEnumBug = !isEnumerable.call({ + toString: null + }, 'toString'); + var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype'); + var dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor']; + + var equalsConstructorPrototype = function equalsConstructorPrototype(o) { + var ctor = o.constructor; + return ctor && ctor.prototype === o; + }; + + var excludedKeys = { + $applicationCache: true, + $console: true, + $external: true, + $frame: true, + $frameElement: true, + $frames: true, + $innerHeight: true, + $innerWidth: true, + $onmozfullscreenchange: true, + $onmozfullscreenerror: true, + $outerHeight: true, + $outerWidth: true, + $pageXOffset: true, + $pageYOffset: true, + $parent: true, + $scrollLeft: true, + $scrollTop: true, + $scrollX: true, + $scrollY: true, + $self: true, + $webkitIndexedDB: true, + $webkitStorageInfo: true, + $window: true + }; + + var hasAutomationEqualityBug = function () { + /* global window */ + if (typeof window === 'undefined') { + return false; + } + + for (var k in window) { + try { + if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') { + try { + equalsConstructorPrototype(window[k]); + } catch (e) { + return true; + } + } + } catch (e) { + return true; + } + } + + return false; + }(); + + var equalsConstructorPrototypeIfNotBuggy = function equalsConstructorPrototypeIfNotBuggy(o) { + /* global window */ + if (typeof window === 'undefined' || !hasAutomationEqualityBug) { + return equalsConstructorPrototype(o); + } + + try { + return equalsConstructorPrototype(o); + } catch (e) { + return false; + } + }; + + keysShim = function keys(object) { + var isObject = object !== null && typeof object === 'object'; + var isFunction = toStr$1.call(object) === '[object Function]'; + var isArguments = isArgs(object); + var isString = isObject && toStr$1.call(object) === '[object String]'; + var theKeys = []; + + if (!isObject && !isFunction && !isArguments) { + throw new TypeError('Object.keys called on a non-object'); + } + + var skipProto = hasProtoEnumBug && isFunction; + + if (isString && object.length > 0 && !has.call(object, 0)) { + for (var i = 0; i < object.length; ++i) { + theKeys.push(String(i)); + } + } + + if (isArguments && object.length > 0) { + for (var j = 0; j < object.length; ++j) { + theKeys.push(String(j)); + } + } else { + for (var name in object) { + if (!(skipProto && name === 'prototype') && has.call(object, name)) { + theKeys.push(String(name)); + } + } + } + + if (hasDontEnumBug) { + var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); + + for (var k = 0; k < dontEnums.length; ++k) { + if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) { + theKeys.push(dontEnums[k]); + } + } + } + + return theKeys; + }; +} + +var implementation = keysShim; + +var slice = Array.prototype.slice; +var origKeys = Object.keys; +var keysShim$1 = origKeys ? function keys(o) { + return origKeys(o); +} : implementation; +var originalKeys = Object.keys; + +keysShim$1.shim = function shimObjectKeys() { + if (Object.keys) { + var keysWorksWithArguments = function () { + // Safari 5.0 bug + var args = Object.keys(arguments); + return args && args.length === arguments.length; + }(1, 2); + + if (!keysWorksWithArguments) { + Object.keys = function keys(object) { + // eslint-disable-line func-name-matching + if (isArguments(object)) { + return originalKeys(slice.call(object)); + } + + return originalKeys(object); + }; + } + } else { + Object.keys = keysShim$1; + } + + return Object.keys || keysShim$1; +}; + +var objectKeys = keysShim$1; + +var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; +var toStr$2 = Object.prototype.toString; + +var isStandardArguments = function isArguments(value) { + if (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) { + return false; + } + + return toStr$2.call(value) === '[object Arguments]'; +}; + +var isLegacyArguments = function isArguments(value) { + if (isStandardArguments(value)) { + return true; + } + + return value !== null && typeof value === 'object' && typeof value.length === 'number' && value.length >= 0 && toStr$2.call(value) !== '[object Array]' && toStr$2.call(value.callee) === '[object Function]'; +}; + +var supportsStandardArguments = function () { + return isStandardArguments(arguments); +}(); + +isStandardArguments.isLegacyArguments = isLegacyArguments; // for tests + +var isArguments$1 = supportsStandardArguments ? isStandardArguments : isLegacyArguments; + +var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol'; +var toStr$3 = Object.prototype.toString; +var concat = Array.prototype.concat; +var origDefineProperty = Object.defineProperty; + +var isFunction$1 = function isFunction(fn) { + return typeof fn === 'function' && toStr$3.call(fn) === '[object Function]'; +}; + +var arePropertyDescriptorsSupported = function arePropertyDescriptorsSupported() { + var obj = {}; + + try { + origDefineProperty(obj, 'x', { + enumerable: false, + value: obj + }); // eslint-disable-next-line no-unused-vars, no-restricted-syntax + + for (var _ in obj) { + // jscs:ignore disallowUnusedVariables + return false; + } + + return obj.x === obj; + } catch (e) { + /* this is IE 8. */ + return false; + } +}; + +var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported(); + +var defineProperty = function defineProperty(object, name, value, predicate) { + if (name in object && (!isFunction$1(predicate) || !predicate())) { + return; + } + + if (supportsDescriptors) { + origDefineProperty(object, name, { + configurable: true, + enumerable: false, + value: value, + writable: true + }); + } else { + object[name] = value; + } +}; + +var defineProperties = function defineProperties(object, map) { + var predicates = arguments.length > 2 ? arguments[2] : {}; + var props = objectKeys(map); + + if (hasSymbols) { + props = concat.call(props, Object.getOwnPropertySymbols(map)); + } + + for (var i = 0; i < props.length; i += 1) { + defineProperty(object, props[i], map[props[i]], predicates[props[i]]); + } +}; + +defineProperties.supportsDescriptors = !!supportsDescriptors; +var defineProperties_1 = defineProperties; + +/* eslint no-invalid-this: 1 */ + +var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; +var slice$1 = Array.prototype.slice; +var toStr$4 = Object.prototype.toString; +var funcType = '[object Function]'; + +var implementation$1 = function bind(that) { + var target = this; + + if (typeof target !== 'function' || toStr$4.call(target) !== funcType) { + throw new TypeError(ERROR_MESSAGE + target); + } + + var args = slice$1.call(arguments, 1); + var bound; + + var binder = function binder() { + if (this instanceof bound) { + var result = target.apply(this, args.concat(slice$1.call(arguments))); + + if (Object(result) === result) { + return result; + } + + return this; + } else { + return target.apply(that, args.concat(slice$1.call(arguments))); + } + }; + + var boundLength = Math.max(0, target.length - args.length); + var boundArgs = []; + + for (var i = 0; i < boundLength; i++) { + boundArgs.push('$' + i); + } + + bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder); + + if (target.prototype) { + var Empty = function Empty() {}; + + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + + return bound; +}; + +var functionBind = Function.prototype.bind || implementation$1; + +/* eslint complexity: [2, 18], max-statements: [2, 33] */ + +var shams = function hasSymbols() { + if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { + return false; + } + + if (typeof Symbol.iterator === 'symbol') { + return true; + } + + var obj = {}; + var sym = Symbol('test'); + var symObj = Object(sym); + + if (typeof sym === 'string') { + return false; + } + + if (Object.prototype.toString.call(sym) !== '[object Symbol]') { + return false; + } + + if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { + return false; + } // temp disabled per https://github.com/ljharb/object.assign/issues/17 + // if (sym instanceof Symbol) { return false; } + // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 + // if (!(symObj instanceof Symbol)) { return false; } + // if (typeof Symbol.prototype.toString !== 'function') { return false; } + // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } + + + var symVal = 42; + obj[sym] = symVal; + + for (sym in obj) { + return false; + } // eslint-disable-line no-restricted-syntax + + + if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { + return false; + } + + if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { + return false; + } + + var syms = Object.getOwnPropertySymbols(obj); + + if (syms.length !== 1 || syms[0] !== sym) { + return false; + } + + if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { + return false; + } + + if (typeof Object.getOwnPropertyDescriptor === 'function') { + var descriptor = Object.getOwnPropertyDescriptor(obj, sym); + + if (descriptor.value !== symVal || descriptor.enumerable !== true) { + return false; + } + } + + return true; +}; + +var origSymbol = commonjsGlobal.Symbol; + +var hasSymbols$1 = function hasNativeSymbols() { + if (typeof origSymbol !== 'function') { + return false; + } + + if (typeof Symbol !== 'function') { + return false; + } + + if (typeof origSymbol('foo') !== 'symbol') { + return false; + } + + if (typeof Symbol('bar') !== 'symbol') { + return false; + } + + return shams(); +}; + +/* globals + Atomics, + SharedArrayBuffer, +*/ + + +var undefined$1; +var $TypeError = TypeError; +var $gOPD = Object.getOwnPropertyDescriptor; + +if ($gOPD) { + try { + $gOPD({}, ''); + } catch (e) { + $gOPD = null; // this is IE 8, which has a broken gOPD + } +} + +var throwTypeError = function throwTypeError() { + throw new $TypeError(); +}; + +var ThrowTypeError = $gOPD ? function () { + try { + // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties + arguments.callee; // IE 8 does not throw here + + return throwTypeError; + } catch (calleeThrows) { + try { + // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') + return $gOPD(arguments, 'callee').get; + } catch (gOPDthrows) { + return throwTypeError; + } + } +}() : throwTypeError; +var hasSymbols$2 = hasSymbols$1(); + +var getProto = Object.getPrototypeOf || function (x) { + return x.__proto__; +}; // eslint-disable-line no-proto + +var generatorFunction = undefined$1; + +var asyncFunction = undefined$1; + +var asyncGenFunction = undefined$1; +var TypedArray = typeof Uint8Array === 'undefined' ? undefined$1 : getProto(Uint8Array); +var INTRINSICS = { + '%Array%': Array, + '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer, + '%ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer.prototype, + '%ArrayIteratorPrototype%': hasSymbols$2 ? getProto([][Symbol.iterator]()) : undefined$1, + '%ArrayPrototype%': Array.prototype, + '%ArrayProto_entries%': Array.prototype.entries, + '%ArrayProto_forEach%': Array.prototype.forEach, + '%ArrayProto_keys%': Array.prototype.keys, + '%ArrayProto_values%': Array.prototype.values, + '%AsyncFromSyncIteratorPrototype%': undefined$1, + '%AsyncFunction%': asyncFunction, + '%AsyncFunctionPrototype%': undefined$1, + '%AsyncGenerator%': undefined$1, + '%AsyncGeneratorFunction%': asyncGenFunction, + '%AsyncGeneratorPrototype%': undefined$1, + '%AsyncIteratorPrototype%': undefined$1, + '%Atomics%': typeof Atomics === 'undefined' ? undefined$1 : Atomics, + '%Boolean%': Boolean, + '%BooleanPrototype%': Boolean.prototype, + '%DataView%': typeof DataView === 'undefined' ? undefined$1 : DataView, + '%DataViewPrototype%': typeof DataView === 'undefined' ? undefined$1 : DataView.prototype, + '%Date%': Date, + '%DatePrototype%': Date.prototype, + '%decodeURI%': decodeURI, + '%decodeURIComponent%': decodeURIComponent, + '%encodeURI%': encodeURI, + '%encodeURIComponent%': encodeURIComponent, + '%Error%': Error, + '%ErrorPrototype%': Error.prototype, + '%eval%': eval, + // eslint-disable-line no-eval + '%EvalError%': EvalError, + '%EvalErrorPrototype%': EvalError.prototype, + '%Float32Array%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array, + '%Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array.prototype, + '%Float64Array%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array, + '%Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array.prototype, + '%Function%': Function, + '%FunctionPrototype%': Function.prototype, + '%Generator%': undefined$1, + '%GeneratorFunction%': generatorFunction, + '%GeneratorPrototype%': undefined$1, + '%Int8Array%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array, + '%Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array.prototype, + '%Int16Array%': typeof Int16Array === 'undefined' ? undefined$1 : Int16Array, + '%Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined$1 : Int8Array.prototype, + '%Int32Array%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array, + '%Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array.prototype, + '%isFinite%': isFinite, + '%isNaN%': isNaN, + '%IteratorPrototype%': hasSymbols$2 ? getProto(getProto([][Symbol.iterator]())) : undefined$1, + '%JSON%': typeof JSON === 'object' ? JSON : undefined$1, + '%JSONParse%': typeof JSON === 'object' ? JSON.parse : undefined$1, + '%Map%': typeof Map === 'undefined' ? undefined$1 : Map, + '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$2 ? undefined$1 : getProto(new Map()[Symbol.iterator]()), + '%MapPrototype%': typeof Map === 'undefined' ? undefined$1 : Map.prototype, + '%Math%': Math, + '%Number%': Number, + '%NumberPrototype%': Number.prototype, + '%Object%': Object, + '%ObjectPrototype%': Object.prototype, + '%ObjProto_toString%': Object.prototype.toString, + '%ObjProto_valueOf%': Object.prototype.valueOf, + '%parseFloat%': parseFloat, + '%parseInt%': parseInt, + '%Promise%': typeof Promise === 'undefined' ? undefined$1 : Promise, + '%PromisePrototype%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype, + '%PromiseProto_then%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype.then, + '%Promise_all%': typeof Promise === 'undefined' ? undefined$1 : Promise.all, + '%Promise_reject%': typeof Promise === 'undefined' ? undefined$1 : Promise.reject, + '%Promise_resolve%': typeof Promise === 'undefined' ? undefined$1 : Promise.resolve, + '%Proxy%': typeof Proxy === 'undefined' ? undefined$1 : Proxy, + '%RangeError%': RangeError, + '%RangeErrorPrototype%': RangeError.prototype, + '%ReferenceError%': ReferenceError, + '%ReferenceErrorPrototype%': ReferenceError.prototype, + '%Reflect%': typeof Reflect === 'undefined' ? undefined$1 : Reflect, + '%RegExp%': RegExp, + '%RegExpPrototype%': RegExp.prototype, + '%Set%': typeof Set === 'undefined' ? undefined$1 : Set, + '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$2 ? undefined$1 : getProto(new Set()[Symbol.iterator]()), + '%SetPrototype%': typeof Set === 'undefined' ? undefined$1 : Set.prototype, + '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer, + '%SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer.prototype, + '%String%': String, + '%StringIteratorPrototype%': hasSymbols$2 ? getProto(''[Symbol.iterator]()) : undefined$1, + '%StringPrototype%': String.prototype, + '%Symbol%': hasSymbols$2 ? Symbol : undefined$1, + '%SymbolPrototype%': hasSymbols$2 ? Symbol.prototype : undefined$1, + '%SyntaxError%': SyntaxError, + '%SyntaxErrorPrototype%': SyntaxError.prototype, + '%ThrowTypeError%': ThrowTypeError, + '%TypedArray%': TypedArray, + '%TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined$1, + '%TypeError%': $TypeError, + '%TypeErrorPrototype%': $TypeError.prototype, + '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array, + '%Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array.prototype, + '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray, + '%Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray.prototype, + '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array, + '%Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array.prototype, + '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array, + '%Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array.prototype, + '%URIError%': URIError, + '%URIErrorPrototype%': URIError.prototype, + '%WeakMap%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap, + '%WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap.prototype, + '%WeakSet%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet, + '%WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet.prototype +}; +var $replace = functionBind.call(Function.call, String.prototype.replace); +/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ + +var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; +var reEscapeChar = /\\(\\)?/g; +/** Used to match backslashes in property paths. */ + +var stringToPath = function stringToPath(string) { + var result = []; + $replace(string, rePropName, function (match, number, quote, subString) { + result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match; + }); + return result; +}; +/* end adaptation */ + + +var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { + if (!(name in INTRINSICS)) { + throw new SyntaxError('intrinsic ' + name + ' does not exist!'); + } // istanbul ignore if // hopefully this is impossible to test :-) + + + if (typeof INTRINSICS[name] === 'undefined' && !allowMissing) { + throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); + } + + return INTRINSICS[name]; +}; + +var GetIntrinsic = function GetIntrinsic(name, allowMissing) { + if (typeof name !== 'string' || name.length === 0) { + throw new TypeError('intrinsic name must be a non-empty string'); + } + + if (arguments.length > 1 && typeof allowMissing !== 'boolean') { + throw new TypeError('"allowMissing" argument must be a boolean'); + } + + var parts = stringToPath(name); + var value = getBaseIntrinsic('%' + (parts.length > 0 ? parts[0] : '') + '%', allowMissing); + + for (var i = 1; i < parts.length; i += 1) { + if (value != null) { + if ($gOPD && i + 1 >= parts.length) { + var desc = $gOPD(value, parts[i]); + + if (!allowMissing && !(parts[i] in value)) { + throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.'); + } + + value = desc ? desc.get || desc.value : value[parts[i]]; + } else { + value = value[parts[i]]; + } + } + } + + return value; +}; + +var $Function = GetIntrinsic('%Function%'); +var $apply = $Function.apply; +var $call = $Function.call; + +var callBind = function callBind() { + return functionBind.apply($call, arguments); +}; + +var apply = function applyBind() { + return functionBind.apply($apply, arguments); +}; +callBind.apply = apply; + +var numberIsNaN = function numberIsNaN(value) { + return value !== value; +}; + +var implementation$2 = function is(a, b) { + if (a === 0 && b === 0) { + return 1 / a === 1 / b; + } + + if (a === b) { + return true; + } + + if (numberIsNaN(a) && numberIsNaN(b)) { + return true; + } + + return false; +}; + +var polyfill = function getPolyfill() { + return typeof Object.is === 'function' ? Object.is : implementation$2; +}; + +var shim = function shimObjectIs() { + var polyfill$1 = polyfill(); + defineProperties_1(Object, { + is: polyfill$1 + }, { + is: function testObjectIs() { + return Object.is !== polyfill$1; + } + }); + return polyfill$1; +}; + +var polyfill$1 = callBind(polyfill(), Object); +defineProperties_1(polyfill$1, { + getPolyfill: polyfill, + implementation: implementation$2, + shim: shim +}); +var objectIs = polyfill$1; + +var src = functionBind.call(Function.call, Object.prototype.hasOwnProperty); + +var regexExec = RegExp.prototype.exec; +var gOPD = Object.getOwnPropertyDescriptor; + +var tryRegexExecCall = function tryRegexExec(value) { + try { + var lastIndex = value.lastIndex; + value.lastIndex = 0; // eslint-disable-line no-param-reassign + + regexExec.call(value); + return true; + } catch (e) { + return false; + } finally { + value.lastIndex = lastIndex; // eslint-disable-line no-param-reassign + } +}; + +var toStr$5 = Object.prototype.toString; +var regexClass = '[object RegExp]'; +var hasToStringTag$1 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; + +var isRegex = function isRegex(value) { + if (!value || typeof value !== 'object') { + return false; + } + + if (!hasToStringTag$1) { + return toStr$5.call(value) === regexClass; + } + + var descriptor = gOPD(value, 'lastIndex'); + var hasLastIndexDataProperty = descriptor && src(descriptor, 'value'); + + if (!hasLastIndexDataProperty) { + return false; + } + + return tryRegexExecCall(value); +}; + +var $Object = Object; +var $TypeError$1 = TypeError; + +var implementation$3 = function flags() { + if (this != null && this !== $Object(this)) { + throw new $TypeError$1('RegExp.prototype.flags getter called on non-object'); + } + + var result = ''; + + if (this.global) { + result += 'g'; + } + + if (this.ignoreCase) { + result += 'i'; + } + + if (this.multiline) { + result += 'm'; + } + + if (this.dotAll) { + result += 's'; + } + + if (this.unicode) { + result += 'u'; + } + + if (this.sticky) { + result += 'y'; + } + + return result; +}; + +var supportsDescriptors$1 = defineProperties_1.supportsDescriptors; +var $gOPD$1 = Object.getOwnPropertyDescriptor; +var $TypeError$2 = TypeError; + +var polyfill$2 = function getPolyfill() { + if (!supportsDescriptors$1) { + throw new $TypeError$2('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors'); + } + + if (/a/mig.flags === 'gim') { + var descriptor = $gOPD$1(RegExp.prototype, 'flags'); + + if (descriptor && typeof descriptor.get === 'function' && typeof /a/.dotAll === 'boolean') { + return descriptor.get; + } + } + + return implementation$3; +}; + +var supportsDescriptors$2 = defineProperties_1.supportsDescriptors; +var gOPD$1 = Object.getOwnPropertyDescriptor; +var defineProperty$1 = Object.defineProperty; +var TypeErr = TypeError; +var getProto$1 = Object.getPrototypeOf; +var regex = /a/; + +var shim$1 = function shimFlags() { + if (!supportsDescriptors$2 || !getProto$1) { + throw new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors'); + } + + var polyfill = polyfill$2(); + var proto = getProto$1(regex); + var descriptor = gOPD$1(proto, 'flags'); + + if (!descriptor || descriptor.get !== polyfill) { + defineProperty$1(proto, 'flags', { + configurable: true, + enumerable: false, + get: polyfill + }); + } + + return polyfill; +}; + +var flagsBound = callBind(implementation$3); +defineProperties_1(flagsBound, { + getPolyfill: polyfill$2, + implementation: implementation$3, + shim: shim$1 +}); +var regexp_prototype_flags = flagsBound; + +var getDay = Date.prototype.getDay; + +var tryDateObject = function tryDateGetDayCall(value) { + try { + getDay.call(value); + return true; + } catch (e) { + return false; + } +}; + +var toStr$6 = Object.prototype.toString; +var dateClass = '[object Date]'; +var hasToStringTag$2 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; + +var isDateObject = function isDateObject(value) { + if (typeof value !== 'object' || value === null) { + return false; + } + + return hasToStringTag$2 ? tryDateObject(value) : toStr$6.call(value) === dateClass; +}; + +var getTime = Date.prototype.getTime; + +function deepEqual(actual, expected, options) { + var opts = options || {}; // 7.1. All identical values are equivalent, as determined by ===. + + if (opts.strict ? objectIs(actual, expected) : actual === expected) { + return true; + } // 7.3. Other pairs that do not both pass typeof value == 'object', equivalence is determined by ==. + + + if (!actual || !expected || typeof actual !== 'object' && typeof expected !== 'object') { + return opts.strict ? objectIs(actual, expected) : actual == expected; + } + /* + * 7.4. 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. + */ + // eslint-disable-next-line no-use-before-define + + + return objEquiv(actual, expected, opts); +} + +function isUndefinedOrNull(value) { + return value === null || value === undefined; +} + +function isBuffer$1(x) { + if (!x || typeof x !== 'object' || typeof x.length !== 'number') { + return false; + } + + if (typeof x.copy !== 'function' || typeof x.slice !== 'function') { + return false; + } + + if (x.length > 0 && typeof x[0] !== 'number') { + return false; + } + + return true; +} + +function objEquiv(a, b, opts) { + /* eslint max-statements: [2, 50] */ + var i, key; + + if (typeof a !== typeof b) { + return false; + } + + if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) { + return false; + } // an identical 'prototype' property. + + + if (a.prototype !== b.prototype) { + return false; + } + + if (isArguments$1(a) !== isArguments$1(b)) { + return false; + } + + var aIsRegex = isRegex(a); + var bIsRegex = isRegex(b); + + if (aIsRegex !== bIsRegex) { + return false; + } + + if (aIsRegex || bIsRegex) { + return a.source === b.source && regexp_prototype_flags(a) === regexp_prototype_flags(b); + } + + if (isDateObject(a) && isDateObject(b)) { + return getTime.call(a) === getTime.call(b); + } + + var aIsBuffer = isBuffer$1(a); + var bIsBuffer = isBuffer$1(b); + + if (aIsBuffer !== bIsBuffer) { + return false; + } + + if (aIsBuffer || bIsBuffer) { + // && would work too, because both are true or both false here + if (a.length !== b.length) { + return false; + } + + for (i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { + return false; + } + } + + return true; + } + + if (typeof a !== typeof b) { + return false; + } + + try { + var ka = objectKeys(a); + var kb = objectKeys(b); + } catch (e) { + // happens when one is a string literal and the other isn't + return false; + } // 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], opts)) { + return false; + } + } + + return true; +} + +var deepEqual_1 = deepEqual; + +var FLOAT_EOF = 0xf; +var FLOAT_LOOKUP = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'E', 'E-', null, '-']; +var FLOAT_ENCODE_LOOKUP = { + '.': 10, + 'E': 11, + 'E-': 12, + '-': 14 +}; + +var CFFOperand = /*#__PURE__*/function () { + function CFFOperand() {} + + CFFOperand.decode = function decode(stream, value) { + if (32 <= value && value <= 246) { + return value - 139; + } + + if (247 <= value && value <= 250) { + return (value - 247) * 256 + stream.readUInt8() + 108; + } + + if (251 <= value && value <= 254) { + return -(value - 251) * 256 - stream.readUInt8() - 108; + } + + if (value === 28) { + return stream.readInt16BE(); + } + + if (value === 29) { + return stream.readInt32BE(); + } + + if (value === 30) { + var str = ''; + + while (true) { + var b = stream.readUInt8(); + var n1 = b >> 4; + + if (n1 === FLOAT_EOF) { + break; + } + + str += FLOAT_LOOKUP[n1]; + var n2 = b & 15; + + if (n2 === FLOAT_EOF) { + break; + } + + str += FLOAT_LOOKUP[n2]; + } + + return parseFloat(str); + } + + return null; + }; + + CFFOperand.size = function size(value) { + // if the value needs to be forced to the largest size (32 bit) + // e.g. for unknown pointers, set to 32768 + if (value.forceLarge) { + value = 32768; + } + + if ((value | 0) !== value) { + // floating point + var str = '' + value; + return 1 + Math.ceil((str.length + 1) / 2); + } else if (-107 <= value && value <= 107) { + return 1; + } else if (108 <= value && value <= 1131 || -1131 <= value && value <= -108) { + return 2; + } else if (-32768 <= value && value <= 32767) { + return 3; + } else { + return 5; + } + }; + + CFFOperand.encode = function encode(stream, value) { + // if the value needs to be forced to the largest size (32 bit) + // e.g. for unknown pointers, save the old value and set to 32768 + var val = Number(value); + + if (value.forceLarge) { + stream.writeUInt8(29); + return stream.writeInt32BE(val); + } else if ((val | 0) !== val) { + // floating point + stream.writeUInt8(30); + var str = '' + val; + + for (var i = 0; i < str.length; i += 2) { + var c1 = str[i]; + var n1 = FLOAT_ENCODE_LOOKUP[c1] || +c1; + + if (i === str.length - 1) { + var n2 = FLOAT_EOF; + } else { + var c2 = str[i + 1]; + var n2 = FLOAT_ENCODE_LOOKUP[c2] || +c2; + } + + stream.writeUInt8(n1 << 4 | n2 & 15); + } + + if (n2 !== FLOAT_EOF) { + return stream.writeUInt8(FLOAT_EOF << 4); + } + } else if (-107 <= val && val <= 107) { + return stream.writeUInt8(val + 139); + } else if (108 <= val && val <= 1131) { + val -= 108; + stream.writeUInt8((val >> 8) + 247); + return stream.writeUInt8(val & 0xff); + } else if (-1131 <= val && val <= -108) { + val = -val - 108; + stream.writeUInt8((val >> 8) + 251); + return stream.writeUInt8(val & 0xff); + } else if (-32768 <= val && val <= 32767) { + stream.writeUInt8(28); + return stream.writeInt16BE(val); + } else { + stream.writeUInt8(29); + return stream.writeInt32BE(val); + } + }; + + return CFFOperand; +}(); + +function _createForOfIteratorHelperLoose$2(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$2(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$2(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$2(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$2(o, minLen); } + +function _arrayLikeToArray$2(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var CFFDict = /*#__PURE__*/function () { + function CFFDict(ops) { + if (ops === void 0) { + ops = []; + } + + this.ops = ops; + this.fields = {}; + + for (var _iterator = _createForOfIteratorHelperLoose$2(ops), _step; !(_step = _iterator()).done;) { + var field = _step.value; + var key = Array.isArray(field[0]) ? field[0][0] << 8 | field[0][1] : field[0]; + this.fields[key] = field; + } + } + + var _proto = CFFDict.prototype; + + _proto.decodeOperands = function decodeOperands(type, stream, ret, operands) { + var _this = this; + + if (Array.isArray(type)) { + return operands.map(function (op, i) { + return _this.decodeOperands(type[i], stream, ret, [op]); + }); + } else if (type.decode != null) { + return type.decode(stream, ret, operands); + } else { + switch (type) { + case 'number': + case 'offset': + case 'sid': + return operands[0]; + + case 'boolean': + return !!operands[0]; + + default: + return operands; + } + } + }; + + _proto.encodeOperands = function encodeOperands(type, stream, ctx, operands) { + var _this2 = this; + + if (Array.isArray(type)) { + return operands.map(function (op, i) { + return _this2.encodeOperands(type[i], stream, ctx, op)[0]; + }); + } else if (type.encode != null) { + return type.encode(stream, operands, ctx); + } else if (typeof operands === 'number') { + return [operands]; + } else if (typeof operands === 'boolean') { + return [+operands]; + } else if (Array.isArray(operands)) { + return operands; + } else { + return [operands]; + } + }; + + _proto.decode = function decode(stream, parent) { + var end = stream.pos + parent.length; + var ret = {}; + var operands = []; // define hidden properties + + Object.defineProperties(ret, { + parent: { + value: parent + }, + _startOffset: { + value: stream.pos + } + }); // fill in defaults + + for (var key in this.fields) { + var field = this.fields[key]; + ret[field[1]] = field[3]; + } + + while (stream.pos < end) { + var b = stream.readUInt8(); + + if (b < 28) { + if (b === 12) { + b = b << 8 | stream.readUInt8(); + } + + var _field = this.fields[b]; + + if (!_field) { + throw new Error("Unknown operator " + b); + } + + var val = this.decodeOperands(_field[2], stream, ret, operands); + + if (val != null) { + if (val instanceof utils_2) { + Object.defineProperty(ret, _field[1], val); + } else { + ret[_field[1]] = val; + } + } + + operands = []; + } else { + operands.push(CFFOperand.decode(stream, b)); + } + } + + return ret; + }; + + _proto.size = function size(dict, parent, includePointers) { + if (includePointers === void 0) { + includePointers = true; + } + + var ctx = { + parent: parent, + val: dict, + pointerSize: 0, + startOffset: parent.startOffset || 0 + }; + var len = 0; + + for (var k in this.fields) { + var field = this.fields[k]; + var val = dict[field[1]]; + + if (val == null || deepEqual_1(val, field[3])) { + continue; + } + + var operands = this.encodeOperands(field[2], null, ctx, val); + + for (var _iterator2 = _createForOfIteratorHelperLoose$2(operands), _step2; !(_step2 = _iterator2()).done;) { + var op = _step2.value; + len += CFFOperand.size(op); + } + + var key = Array.isArray(field[0]) ? field[0] : [field[0]]; + len += key.length; + } + + if (includePointers) { + len += ctx.pointerSize; + } + + return len; + }; + + _proto.encode = function encode(stream, dict, parent) { + var ctx = { + pointers: [], + startOffset: stream.pos, + parent: parent, + val: dict, + pointerSize: 0 + }; + ctx.pointerOffset = stream.pos + this.size(dict, ctx, false); + + for (var _iterator3 = _createForOfIteratorHelperLoose$2(this.ops), _step3; !(_step3 = _iterator3()).done;) { + var field = _step3.value; + var val = dict[field[1]]; + + if (val == null || deepEqual_1(val, field[3])) { + continue; + } + + var operands = this.encodeOperands(field[2], stream, ctx, val); + + for (var _iterator4 = _createForOfIteratorHelperLoose$2(operands), _step4; !(_step4 = _iterator4()).done;) { + var op = _step4.value; + CFFOperand.encode(stream, op); + } + + var key = Array.isArray(field[0]) ? field[0] : [field[0]]; + + for (var _iterator5 = _createForOfIteratorHelperLoose$2(key), _step5; !(_step5 = _iterator5()).done;) { + var _op = _step5.value; + stream.writeUInt8(_op); + } + } + + var i = 0; + + while (i < ctx.pointers.length) { + var ptr = ctx.pointers[i++]; + ptr.type.encode(stream, ptr.val, ptr.parent); + } + + return; + }; + + return CFFDict; +}(); + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var CFFPointer = /*#__PURE__*/function (_r$Pointer) { + _inheritsLoose(CFFPointer, _r$Pointer); + + function CFFPointer(type, options) { + if (options === void 0) { + options = {}; + } + + if (options.type == null) { + options.type = 'global'; + } + + return _r$Pointer.call(this, null, type, options) || this; + } + + var _proto = CFFPointer.prototype; + + _proto.decode = function decode(stream, parent, operands) { + this.offsetType = { + decode: function decode() { + return operands[0]; + } + }; + return _r$Pointer.prototype.decode.call(this, stream, parent, operands); + }; + + _proto.encode = function encode(stream, value, ctx) { + if (!stream) { + // compute the size (so ctx.pointerSize is correct) + this.offsetType = { + size: function size() { + return 0; + } + }; + this.size(value, ctx); + return [new Ptr(0)]; + } + + var ptr = null; + this.offsetType = { + encode: function encode(stream, val) { + return ptr = val; + } + }; + + _r$Pointer.prototype.encode.call(this, stream, value, ctx); + + return [new Ptr(ptr)]; + }; + + return CFFPointer; +}(restructure.Pointer); + +var Ptr = /*#__PURE__*/function () { + function Ptr(val) { + this.val = val; + this.forceLarge = true; + } + + var _proto2 = Ptr.prototype; + + _proto2.valueOf = function valueOf() { + return this.val; + }; + + return Ptr; +}(); + +var CFFBlendOp = /*#__PURE__*/function () { + function CFFBlendOp() {} + + CFFBlendOp.decode = function decode(stream, parent, operands) { + var numBlends = operands.pop(); // TODO: actually blend. For now just consume the deltas + // since we don't use any of the values anyway. + + while (operands.length > numBlends) { + operands.pop(); + } + }; + + return CFFBlendOp; +}(); + +var CFFPrivateDict = new CFFDict([// key name type default +[6, 'BlueValues', 'delta', null], [7, 'OtherBlues', 'delta', null], [8, 'FamilyBlues', 'delta', null], [9, 'FamilyOtherBlues', 'delta', null], [[12, 9], 'BlueScale', 'number', 0.039625], [[12, 10], 'BlueShift', 'number', 7], [[12, 11], 'BlueFuzz', 'number', 1], [10, 'StdHW', 'number', null], [11, 'StdVW', 'number', null], [[12, 12], 'StemSnapH', 'delta', null], [[12, 13], 'StemSnapV', 'delta', null], [[12, 14], 'ForceBold', 'boolean', false], [[12, 17], 'LanguageGroup', 'number', 0], [[12, 18], 'ExpansionFactor', 'number', 0.06], [[12, 19], 'initialRandomSeed', 'number', 0], [20, 'defaultWidthX', 'number', 0], [21, 'nominalWidthX', 'number', 0], [22, 'vsindex', 'number', 0], [23, 'blend', CFFBlendOp, null], [19, 'Subrs', new CFFPointer(new CFFIndex(), { + type: 'local' +}), null]]); + +// Automatically generated from Appendix A of the CFF specification; do +// not edit. Length should be 391. +var standardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"]; + +var StandardEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls']; +var ExpertEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall']; + +var ISOAdobeCharset = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron']; +var ExpertCharset = ['.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall']; +var ExpertSubsetCharset = ['.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior']; + +// Scripts and Languages # +//######################## + +var LangSysTable = new restructure.Struct({ + reserved: new restructure.Reserved(restructure.uint16), + reqFeatureIndex: restructure.uint16, + featureCount: restructure.uint16, + featureIndexes: new restructure.Array(restructure.uint16, 'featureCount') +}); +var LangSysRecord = new restructure.Struct({ + tag: new restructure.String(4), + langSys: new restructure.Pointer(restructure.uint16, LangSysTable, { + type: 'parent' + }) +}); +var Script = new restructure.Struct({ + defaultLangSys: new restructure.Pointer(restructure.uint16, LangSysTable), + count: restructure.uint16, + langSysRecords: new restructure.Array(LangSysRecord, 'count') +}); +var ScriptRecord = new restructure.Struct({ + tag: new restructure.String(4), + script: new restructure.Pointer(restructure.uint16, Script, { + type: 'parent' + }) +}); +var ScriptList = new restructure.Array(ScriptRecord, restructure.uint16); //####################### +// Features and Lookups # +//####################### + +var Feature = new restructure.Struct({ + featureParams: restructure.uint16, + // pointer + lookupCount: restructure.uint16, + lookupListIndexes: new restructure.Array(restructure.uint16, 'lookupCount') +}); +var FeatureRecord = new restructure.Struct({ + tag: new restructure.String(4), + feature: new restructure.Pointer(restructure.uint16, Feature, { + type: 'parent' + }) +}); +var FeatureList = new restructure.Array(FeatureRecord, restructure.uint16); +var LookupFlags = new restructure.Struct({ + markAttachmentType: restructure.uint8, + flags: new restructure.Bitfield(restructure.uint8, ['rightToLeft', 'ignoreBaseGlyphs', 'ignoreLigatures', 'ignoreMarks', 'useMarkFilteringSet']) +}); +function LookupList(SubTable) { + var Lookup = new restructure.Struct({ + lookupType: restructure.uint16, + flags: LookupFlags, + subTableCount: restructure.uint16, + subTables: new restructure.Array(new restructure.Pointer(restructure.uint16, SubTable), 'subTableCount'), + markFilteringSet: new restructure.Optional(restructure.uint16, function (t) { + return t.flags.flags.useMarkFilteringSet; + }) + }); + return new restructure.LazyArray(new restructure.Pointer(restructure.uint16, Lookup), restructure.uint16); +} //################# +// Coverage Table # +//################# + +var RangeRecord = new restructure.Struct({ + start: restructure.uint16, + end: restructure.uint16, + startCoverageIndex: restructure.uint16 +}); +var Coverage = new restructure.VersionedStruct(restructure.uint16, { + 1: { + glyphCount: restructure.uint16, + glyphs: new restructure.Array(restructure.uint16, 'glyphCount') + }, + 2: { + rangeCount: restructure.uint16, + rangeRecords: new restructure.Array(RangeRecord, 'rangeCount') + } +}); //######################### +// Class Definition Table # +//######################### + +var ClassRangeRecord = new restructure.Struct({ + start: restructure.uint16, + end: restructure.uint16, + "class": restructure.uint16 +}); +var ClassDef = new restructure.VersionedStruct(restructure.uint16, { + 1: { + // Class array + startGlyph: restructure.uint16, + glyphCount: restructure.uint16, + classValueArray: new restructure.Array(restructure.uint16, 'glyphCount') + }, + 2: { + // Class ranges + classRangeCount: restructure.uint16, + classRangeRecord: new restructure.Array(ClassRangeRecord, 'classRangeCount') + } +}); //############### +// Device Table # +//############### + +var Device = new restructure.Struct({ + a: restructure.uint16, + // startSize for hinting Device, outerIndex for VariationIndex + b: restructure.uint16, + // endSize for Device, innerIndex for VariationIndex + deltaFormat: restructure.uint16 +}); //############################################# +// Contextual Substitution/Positioning Tables # +//############################################# + +var LookupRecord = new restructure.Struct({ + sequenceIndex: restructure.uint16, + lookupListIndex: restructure.uint16 +}); +var Rule = new restructure.Struct({ + glyphCount: restructure.uint16, + lookupCount: restructure.uint16, + input: new restructure.Array(restructure.uint16, function (t) { + return t.glyphCount - 1; + }), + lookupRecords: new restructure.Array(LookupRecord, 'lookupCount') +}); +var RuleSet = new restructure.Array(new restructure.Pointer(restructure.uint16, Rule), restructure.uint16); +var ClassRule = new restructure.Struct({ + glyphCount: restructure.uint16, + lookupCount: restructure.uint16, + classes: new restructure.Array(restructure.uint16, function (t) { + return t.glyphCount - 1; + }), + lookupRecords: new restructure.Array(LookupRecord, 'lookupCount') +}); +var ClassSet = new restructure.Array(new restructure.Pointer(restructure.uint16, ClassRule), restructure.uint16); +var Context = new restructure.VersionedStruct(restructure.uint16, { + 1: { + // Simple context + coverage: new restructure.Pointer(restructure.uint16, Coverage), + ruleSetCount: restructure.uint16, + ruleSets: new restructure.Array(new restructure.Pointer(restructure.uint16, RuleSet), 'ruleSetCount') + }, + 2: { + // Class-based context + coverage: new restructure.Pointer(restructure.uint16, Coverage), + classDef: new restructure.Pointer(restructure.uint16, ClassDef), + classSetCnt: restructure.uint16, + classSet: new restructure.Array(new restructure.Pointer(restructure.uint16, ClassSet), 'classSetCnt') + }, + 3: { + glyphCount: restructure.uint16, + lookupCount: restructure.uint16, + coverages: new restructure.Array(new restructure.Pointer(restructure.uint16, Coverage), 'glyphCount'), + lookupRecords: new restructure.Array(LookupRecord, 'lookupCount') + } +}); //###################################################### +// Chaining Contextual Substitution/Positioning Tables # +//###################################################### + +var ChainRule = new restructure.Struct({ + backtrackGlyphCount: restructure.uint16, + backtrack: new restructure.Array(restructure.uint16, 'backtrackGlyphCount'), + inputGlyphCount: restructure.uint16, + input: new restructure.Array(restructure.uint16, function (t) { + return t.inputGlyphCount - 1; + }), + lookaheadGlyphCount: restructure.uint16, + lookahead: new restructure.Array(restructure.uint16, 'lookaheadGlyphCount'), + lookupCount: restructure.uint16, + lookupRecords: new restructure.Array(LookupRecord, 'lookupCount') +}); +var ChainRuleSet = new restructure.Array(new restructure.Pointer(restructure.uint16, ChainRule), restructure.uint16); +var ChainingContext = new restructure.VersionedStruct(restructure.uint16, { + 1: { + // Simple context glyph substitution + coverage: new restructure.Pointer(restructure.uint16, Coverage), + chainCount: restructure.uint16, + chainRuleSets: new restructure.Array(new restructure.Pointer(restructure.uint16, ChainRuleSet), 'chainCount') + }, + 2: { + // Class-based chaining context + coverage: new restructure.Pointer(restructure.uint16, Coverage), + backtrackClassDef: new restructure.Pointer(restructure.uint16, ClassDef), + inputClassDef: new restructure.Pointer(restructure.uint16, ClassDef), + lookaheadClassDef: new restructure.Pointer(restructure.uint16, ClassDef), + chainCount: restructure.uint16, + chainClassSet: new restructure.Array(new restructure.Pointer(restructure.uint16, ChainRuleSet), 'chainCount') + }, + 3: { + // Coverage-based chaining context + backtrackGlyphCount: restructure.uint16, + backtrackCoverage: new restructure.Array(new restructure.Pointer(restructure.uint16, Coverage), 'backtrackGlyphCount'), + inputGlyphCount: restructure.uint16, + inputCoverage: new restructure.Array(new restructure.Pointer(restructure.uint16, Coverage), 'inputGlyphCount'), + lookaheadGlyphCount: restructure.uint16, + lookaheadCoverage: new restructure.Array(new restructure.Pointer(restructure.uint16, Coverage), 'lookaheadGlyphCount'), + lookupCount: restructure.uint16, + lookupRecords: new restructure.Array(LookupRecord, 'lookupCount') + } +}); + +var _; +/******************* + * Variation Store * + *******************/ + +var F2DOT14 = new restructure.Fixed(16, 'BE', 14); +var RegionAxisCoordinates = new restructure.Struct({ + startCoord: F2DOT14, + peakCoord: F2DOT14, + endCoord: F2DOT14 +}); +var VariationRegionList = new restructure.Struct({ + axisCount: restructure.uint16, + regionCount: restructure.uint16, + variationRegions: new restructure.Array(new restructure.Array(RegionAxisCoordinates, 'axisCount'), 'regionCount') +}); +var DeltaSet = new restructure.Struct({ + shortDeltas: new restructure.Array(restructure.int16, function (t) { + return t.parent.shortDeltaCount; + }), + regionDeltas: new restructure.Array(restructure.int8, function (t) { + return t.parent.regionIndexCount - t.parent.shortDeltaCount; + }), + deltas: function deltas(t) { + return t.shortDeltas.concat(t.regionDeltas); + } +}); +var ItemVariationData = new restructure.Struct({ + itemCount: restructure.uint16, + shortDeltaCount: restructure.uint16, + regionIndexCount: restructure.uint16, + regionIndexes: new restructure.Array(restructure.uint16, 'regionIndexCount'), + deltaSets: new restructure.Array(DeltaSet, 'itemCount') +}); +var ItemVariationStore = new restructure.Struct({ + format: restructure.uint16, + variationRegionList: new restructure.Pointer(restructure.uint32, VariationRegionList), + variationDataCount: restructure.uint16, + itemVariationData: new restructure.Array(new restructure.Pointer(restructure.uint32, ItemVariationData), 'variationDataCount') +}); +/********************** + * Feature Variations * + **********************/ + +var ConditionTable = new restructure.VersionedStruct(restructure.uint16, { + 1: (_ = { + axisIndex: restructure.uint16 + }, _["axisIndex"] = restructure.uint16, _.filterRangeMinValue = F2DOT14, _.filterRangeMaxValue = F2DOT14, _) +}); +var ConditionSet = new restructure.Struct({ + conditionCount: restructure.uint16, + conditionTable: new restructure.Array(new restructure.Pointer(restructure.uint32, ConditionTable), 'conditionCount') +}); +var FeatureTableSubstitutionRecord = new restructure.Struct({ + featureIndex: restructure.uint16, + alternateFeatureTable: new restructure.Pointer(restructure.uint32, Feature, { + type: 'parent' + }) +}); +var FeatureTableSubstitution = new restructure.Struct({ + version: restructure.fixed32, + substitutionCount: restructure.uint16, + substitutions: new restructure.Array(FeatureTableSubstitutionRecord, 'substitutionCount') +}); +var FeatureVariationRecord = new restructure.Struct({ + conditionSet: new restructure.Pointer(restructure.uint32, ConditionSet, { + type: 'parent' + }), + featureTableSubstitution: new restructure.Pointer(restructure.uint32, FeatureTableSubstitution, { + type: 'parent' + }) +}); +var FeatureVariations = new restructure.Struct({ + majorVersion: restructure.uint16, + minorVersion: restructure.uint16, + featureVariationRecordCount: restructure.uint32, + featureVariationRecords: new restructure.Array(FeatureVariationRecord, 'featureVariationRecordCount') +}); + +function _inheritsLoose$1(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } +// otherwise delegates to the provided type. + +var PredefinedOp = /*#__PURE__*/function () { + function PredefinedOp(predefinedOps, type) { + this.predefinedOps = predefinedOps; + this.type = type; + } + + var _proto = PredefinedOp.prototype; + + _proto.decode = function decode(stream, parent, operands) { + if (this.predefinedOps[operands[0]]) { + return this.predefinedOps[operands[0]]; + } + + return this.type.decode(stream, parent, operands); + }; + + _proto.size = function size(value, ctx) { + return this.type.size(value, ctx); + }; + + _proto.encode = function encode(stream, value, ctx) { + var index = this.predefinedOps.indexOf(value); + + if (index !== -1) { + return index; + } + + return this.type.encode(stream, value, ctx); + }; + + return PredefinedOp; +}(); + +var CFFEncodingVersion = /*#__PURE__*/function (_r$Number) { + _inheritsLoose$1(CFFEncodingVersion, _r$Number); + + function CFFEncodingVersion() { + return _r$Number.call(this, 'UInt8') || this; + } + + var _proto2 = CFFEncodingVersion.prototype; + + _proto2.decode = function decode(stream) { + return restructure.uint8.decode(stream) & 0x7f; + }; + + return CFFEncodingVersion; +}(restructure.Number); + +var Range1 = new restructure.Struct({ + first: restructure.uint16, + nLeft: restructure.uint8 +}); +var Range2 = new restructure.Struct({ + first: restructure.uint16, + nLeft: restructure.uint16 +}); +var CFFCustomEncoding = new restructure.VersionedStruct(new CFFEncodingVersion(), { + 0: { + nCodes: restructure.uint8, + codes: new restructure.Array(restructure.uint8, 'nCodes') + }, + 1: { + nRanges: restructure.uint8, + ranges: new restructure.Array(Range1, 'nRanges') + } // TODO: supplement? + +}); +var CFFEncoding = new PredefinedOp([StandardEncoding, ExpertEncoding], new CFFPointer(CFFCustomEncoding, { + lazy: true +})); // Decodes an array of ranges until the total +// length is equal to the provided length. + +var RangeArray = /*#__PURE__*/function (_r$Array) { + _inheritsLoose$1(RangeArray, _r$Array); + + function RangeArray() { + return _r$Array.apply(this, arguments) || this; + } + + var _proto3 = RangeArray.prototype; + + _proto3.decode = function decode(stream, parent) { + var length = utils_1(this.length, stream, parent); + var count = 0; + var res = []; + + while (count < length) { + var range = this.type.decode(stream, parent); + range.offset = count; + count += range.nLeft + 1; + res.push(range); + } + + return res; + }; + + return RangeArray; +}(restructure.Array); + +var CFFCustomCharset = new restructure.VersionedStruct(restructure.uint8, { + 0: { + glyphs: new restructure.Array(restructure.uint16, function (t) { + return t.parent.CharStrings.length - 1; + }) + }, + 1: { + ranges: new RangeArray(Range1, function (t) { + return t.parent.CharStrings.length - 1; + }) + }, + 2: { + ranges: new RangeArray(Range2, function (t) { + return t.parent.CharStrings.length - 1; + }) + } +}); +var CFFCharset = new PredefinedOp([ISOAdobeCharset, ExpertCharset, ExpertSubsetCharset], new CFFPointer(CFFCustomCharset, { + lazy: true +})); +var FDRange3 = new restructure.Struct({ + first: restructure.uint16, + fd: restructure.uint8 +}); +var FDRange4 = new restructure.Struct({ + first: restructure.uint32, + fd: restructure.uint16 +}); +var FDSelect = new restructure.VersionedStruct(restructure.uint8, { + 0: { + fds: new restructure.Array(restructure.uint8, function (t) { + return t.parent.CharStrings.length; + }) + }, + 3: { + nRanges: restructure.uint16, + ranges: new restructure.Array(FDRange3, 'nRanges'), + sentinel: restructure.uint16 + }, + 4: { + nRanges: restructure.uint32, + ranges: new restructure.Array(FDRange4, 'nRanges'), + sentinel: restructure.uint32 + } +}); +var ptr = new CFFPointer(CFFPrivateDict); + +var CFFPrivateOp = /*#__PURE__*/function () { + function CFFPrivateOp() {} + + var _proto4 = CFFPrivateOp.prototype; + + _proto4.decode = function decode(stream, parent, operands) { + parent.length = operands[0]; + return ptr.decode(stream, parent, [operands[1]]); + }; + + _proto4.size = function size(dict, ctx) { + return [CFFPrivateDict.size(dict, ctx, false), ptr.size(dict, ctx)[0]]; + }; + + _proto4.encode = function encode(stream, dict, ctx) { + return [CFFPrivateDict.size(dict, ctx, false), ptr.encode(stream, dict, ctx)[0]]; + }; + + return CFFPrivateOp; +}(); + +var FontDict = new CFFDict([// key name type(s) default +[18, 'Private', new CFFPrivateOp(), null], [[12, 38], 'FontName', 'sid', null]]); +var CFFTopDict = new CFFDict([// key name type(s) default +[[12, 30], 'ROS', ['sid', 'sid', 'number'], null], [0, 'version', 'sid', null], [1, 'Notice', 'sid', null], [[12, 0], 'Copyright', 'sid', null], [2, 'FullName', 'sid', null], [3, 'FamilyName', 'sid', null], [4, 'Weight', 'sid', null], [[12, 1], 'isFixedPitch', 'boolean', false], [[12, 2], 'ItalicAngle', 'number', 0], [[12, 3], 'UnderlinePosition', 'number', -100], [[12, 4], 'UnderlineThickness', 'number', 50], [[12, 5], 'PaintType', 'number', 0], [[12, 6], 'CharstringType', 'number', 2], [[12, 7], 'FontMatrix', 'array', [0.001, 0, 0, 0.001, 0, 0]], [13, 'UniqueID', 'number', null], [5, 'FontBBox', 'array', [0, 0, 0, 0]], [[12, 8], 'StrokeWidth', 'number', 0], [14, 'XUID', 'array', null], [15, 'charset', CFFCharset, ISOAdobeCharset], [16, 'Encoding', CFFEncoding, StandardEncoding], [17, 'CharStrings', new CFFPointer(new CFFIndex()), null], [18, 'Private', new CFFPrivateOp(), null], [[12, 20], 'SyntheticBase', 'number', null], [[12, 21], 'PostScript', 'sid', null], [[12, 22], 'BaseFontName', 'sid', null], [[12, 23], 'BaseFontBlend', 'delta', null], // CID font specific +[[12, 31], 'CIDFontVersion', 'number', 0], [[12, 32], 'CIDFontRevision', 'number', 0], [[12, 33], 'CIDFontType', 'number', 0], [[12, 34], 'CIDCount', 'number', 8720], [[12, 35], 'UIDBase', 'number', null], [[12, 37], 'FDSelect', new CFFPointer(FDSelect), null], [[12, 36], 'FDArray', new CFFPointer(new CFFIndex(FontDict)), null], [[12, 38], 'FontName', 'sid', null]]); +var VariationStore = new restructure.Struct({ + length: restructure.uint16, + itemVariationStore: ItemVariationStore +}); +var CFF2TopDict = new CFFDict([[[12, 7], 'FontMatrix', 'array', [0.001, 0, 0, 0.001, 0, 0]], [17, 'CharStrings', new CFFPointer(new CFFIndex()), null], [[12, 37], 'FDSelect', new CFFPointer(FDSelect), null], [[12, 36], 'FDArray', new CFFPointer(new CFFIndex(FontDict)), null], [24, 'vstore', new CFFPointer(VariationStore), null], [25, 'maxstack', 'number', 193]]); +var CFFTop = new restructure.VersionedStruct(restructure.fixed16, { + 1: { + hdrSize: restructure.uint8, + offSize: restructure.uint8, + nameIndex: new CFFIndex(new restructure.String('length')), + topDictIndex: new CFFIndex(CFFTopDict), + stringIndex: new CFFIndex(new restructure.String('length')), + globalSubrIndex: new CFFIndex() + }, + 2: { + hdrSize: restructure.uint8, + length: restructure.uint16, + topDict: CFF2TopDict, + globalSubrIndex: new CFFIndex() + } +}); + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var CFFFont = /*#__PURE__*/function () { + function CFFFont(stream) { + this.stream = stream; + this.decode(); + } + + CFFFont.decode = function decode(stream) { + return new CFFFont(stream); + }; + + var _proto = CFFFont.prototype; + + _proto.decode = function decode() { + var start = this.stream.pos; + var top = CFFTop.decode(this.stream); + + for (var key in top) { + var val = top[key]; + this[key] = val; + } + + if (this.version < 2) { + if (this.topDictIndex.length !== 1) { + throw new Error("Only a single font is allowed in CFF"); + } + + this.topDict = this.topDictIndex[0]; + } + + this.isCIDFont = this.topDict.ROS != null; + return this; + }; + + _proto.string = function string(sid) { + if (this.version >= 2) { + return null; + } + + if (sid < standardStrings.length) { + return standardStrings[sid]; + } + + return this.stringIndex[sid - standardStrings.length]; + }; + + _proto.getCharString = function getCharString(glyph) { + this.stream.pos = this.topDict.CharStrings[glyph].offset; + return this.stream.readBuffer(this.topDict.CharStrings[glyph].length); + }; + + _proto.getGlyphName = function getGlyphName(gid) { + // CFF2 glyph names are in the post table. + if (this.version >= 2) { + return null; + } // CID-keyed fonts don't have glyph names + + + if (this.isCIDFont) { + return null; + } + + var charset = this.topDict.charset; + + if (Array.isArray(charset)) { + return charset[gid]; + } + + if (gid === 0) { + return '.notdef'; + } + + gid -= 1; + + switch (charset.version) { + case 0: + return this.string(charset.glyphs[gid]); + + case 1: + case 2: + for (var i = 0; i < charset.ranges.length; i++) { + var range = charset.ranges[i]; + + if (range.offset <= gid && gid <= range.offset + range.nLeft) { + return this.string(range.first + (gid - range.offset)); + } + } + + break; + } + + return null; + }; + + _proto.fdForGlyph = function fdForGlyph(gid) { + if (!this.topDict.FDSelect) { + return null; + } + + switch (this.topDict.FDSelect.version) { + case 0: + return this.topDict.FDSelect.fds[gid]; + + case 3: + case 4: + var ranges = this.topDict.FDSelect.ranges; + var low = 0; + var high = ranges.length - 1; + + while (low <= high) { + var mid = low + high >> 1; + + if (gid < ranges[mid].first) { + high = mid - 1; + } else if (mid < high && gid > ranges[mid + 1].first) { + low = mid + 1; + } else { + return ranges[mid].fd; + } + } + + default: + throw new Error("Unknown FDSelect version: " + this.topDict.FDSelect.version); + } + }; + + _proto.privateDictForGlyph = function privateDictForGlyph(gid) { + if (this.topDict.FDSelect) { + var fd = this.fdForGlyph(gid); + + if (this.topDict.FDArray[fd]) { + return this.topDict.FDArray[fd].Private; + } + + return null; + } + + if (this.version < 2) { + return this.topDict.Private; + } + + return this.topDict.FDArray[0].Private; + }; + + _createClass(CFFFont, [{ + key: "postscriptName", + get: function get() { + if (this.version < 2) { + return this.nameIndex[0]; + } + + return null; + } + }, { + key: "fullName", + get: function get() { + return this.string(this.topDict.FullName); + } + }, { + key: "familyName", + get: function get() { + return this.string(this.topDict.FamilyName); + } + }]); + + return CFFFont; +}(); + +var VerticalOrigin = new restructure.Struct({ + glyphIndex: restructure.uint16, + vertOriginY: restructure.int16 +}); +var VORG = new restructure.Struct({ + majorVersion: restructure.uint16, + minorVersion: restructure.uint16, + defaultVertOriginY: restructure.int16, + numVertOriginYMetrics: restructure.uint16, + metrics: new restructure.Array(VerticalOrigin, 'numVertOriginYMetrics') +}); + +var BigMetrics = new restructure.Struct({ + height: restructure.uint8, + width: restructure.uint8, + horiBearingX: restructure.int8, + horiBearingY: restructure.int8, + horiAdvance: restructure.uint8, + vertBearingX: restructure.int8, + vertBearingY: restructure.int8, + vertAdvance: restructure.uint8 +}); +var SmallMetrics = new restructure.Struct({ + height: restructure.uint8, + width: restructure.uint8, + bearingX: restructure.int8, + bearingY: restructure.int8, + advance: restructure.uint8 +}); +var EBDTComponent = new restructure.Struct({ + glyph: restructure.uint16, + xOffset: restructure.int8, + yOffset: restructure.int8 +}); + +var ByteAligned = function ByteAligned() {}; + +var BitAligned = function BitAligned() {}; + +var glyph = new restructure.VersionedStruct('version', { + 1: { + metrics: SmallMetrics, + data: ByteAligned + }, + 2: { + metrics: SmallMetrics, + data: BitAligned + }, + // format 3 is deprecated + // format 4 is not supported by Microsoft + 5: { + data: BitAligned + }, + 6: { + metrics: BigMetrics, + data: ByteAligned + }, + 7: { + metrics: BigMetrics, + data: BitAligned + }, + 8: { + metrics: SmallMetrics, + pad: new restructure.Reserved(restructure.uint8), + numComponents: restructure.uint16, + components: new restructure.Array(EBDTComponent, 'numComponents') + }, + 9: { + metrics: BigMetrics, + pad: new restructure.Reserved(restructure.uint8), + numComponents: restructure.uint16, + components: new restructure.Array(EBDTComponent, 'numComponents') + }, + 17: { + metrics: SmallMetrics, + dataLen: restructure.uint32, + data: new restructure.Buffer('dataLen') + }, + 18: { + metrics: BigMetrics, + dataLen: restructure.uint32, + data: new restructure.Buffer('dataLen') + }, + 19: { + dataLen: restructure.uint32, + data: new restructure.Buffer('dataLen') + } +}); + +var SBitLineMetrics = new restructure.Struct({ + ascender: restructure.int8, + descender: restructure.int8, + widthMax: restructure.uint8, + caretSlopeNumerator: restructure.int8, + caretSlopeDenominator: restructure.int8, + caretOffset: restructure.int8, + minOriginSB: restructure.int8, + minAdvanceSB: restructure.int8, + maxBeforeBL: restructure.int8, + minAfterBL: restructure.int8, + pad: new restructure.Reserved(restructure.int8, 2) +}); +var CodeOffsetPair = new restructure.Struct({ + glyphCode: restructure.uint16, + offset: restructure.uint16 +}); +var IndexSubtable = new restructure.VersionedStruct(restructure.uint16, { + header: { + imageFormat: restructure.uint16, + imageDataOffset: restructure.uint32 + }, + 1: { + offsetArray: new restructure.Array(restructure.uint32, function (t) { + return t.parent.lastGlyphIndex - t.parent.firstGlyphIndex + 1; + }) + }, + 2: { + imageSize: restructure.uint32, + bigMetrics: BigMetrics + }, + 3: { + offsetArray: new restructure.Array(restructure.uint16, function (t) { + return t.parent.lastGlyphIndex - t.parent.firstGlyphIndex + 1; + }) + }, + 4: { + numGlyphs: restructure.uint32, + glyphArray: new restructure.Array(CodeOffsetPair, function (t) { + return t.numGlyphs + 1; + }) + }, + 5: { + imageSize: restructure.uint32, + bigMetrics: BigMetrics, + numGlyphs: restructure.uint32, + glyphCodeArray: new restructure.Array(restructure.uint16, 'numGlyphs') + } +}); +var IndexSubtableArray = new restructure.Struct({ + firstGlyphIndex: restructure.uint16, + lastGlyphIndex: restructure.uint16, + subtable: new restructure.Pointer(restructure.uint32, IndexSubtable) +}); +var BitmapSizeTable = new restructure.Struct({ + indexSubTableArray: new restructure.Pointer(restructure.uint32, new restructure.Array(IndexSubtableArray, 1), { + type: 'parent' + }), + indexTablesSize: restructure.uint32, + numberOfIndexSubTables: restructure.uint32, + colorRef: restructure.uint32, + hori: SBitLineMetrics, + vert: SBitLineMetrics, + startGlyphIndex: restructure.uint16, + endGlyphIndex: restructure.uint16, + ppemX: restructure.uint8, + ppemY: restructure.uint8, + bitDepth: restructure.uint8, + flags: new restructure.Bitfield(restructure.uint8, ['horizontal', 'vertical']) +}); +var EBLC = new restructure.Struct({ + version: restructure.uint32, + // 0x00020000 + numSizes: restructure.uint32, + sizes: new restructure.Array(BitmapSizeTable, 'numSizes') +}); + +var ImageTable = new restructure.Struct({ + ppem: restructure.uint16, + resolution: restructure.uint16, + imageOffsets: new restructure.Array(new restructure.Pointer(restructure.uint32, 'void'), function (t) { + return t.parent.parent.maxp.numGlyphs + 1; + }) +}); // This is the Apple sbix table, used by the "Apple Color Emoji" font. +// It includes several image tables with images for each bitmap glyph +// of several different sizes. + +var sbix = new restructure.Struct({ + version: restructure.uint16, + flags: new restructure.Bitfield(restructure.uint16, ['renderOutlines']), + numImgTables: restructure.uint32, + imageTables: new restructure.Array(new restructure.Pointer(restructure.uint32, ImageTable), 'numImgTables') +}); + +var LayerRecord = new restructure.Struct({ + gid: restructure.uint16, + // Glyph ID of layer glyph (must be in z-order from bottom to top). + paletteIndex: restructure.uint16 // Index value to use in the appropriate palette. This value must + +}); // be less than numPaletteEntries in the CPAL table, except for +// the special case noted below. Each palette entry is 16 bits. +// A palette index of 0xFFFF is a special case indicating that +// the text foreground color should be used. + +var BaseGlyphRecord = new restructure.Struct({ + gid: restructure.uint16, + // Glyph ID of reference glyph. This glyph is for reference only + // and is not rendered for color. + firstLayerIndex: restructure.uint16, + // Index (from beginning of the Layer Records) to the layer record. + // There will be numLayers consecutive entries for this base glyph. + numLayers: restructure.uint16 +}); +var COLR = new restructure.Struct({ + version: restructure.uint16, + numBaseGlyphRecords: restructure.uint16, + baseGlyphRecord: new restructure.Pointer(restructure.uint32, new restructure.Array(BaseGlyphRecord, 'numBaseGlyphRecords')), + layerRecords: new restructure.Pointer(restructure.uint32, new restructure.Array(LayerRecord, 'numLayerRecords'), { + lazy: true + }), + numLayerRecords: restructure.uint16 +}); + +var ColorRecord = new restructure.Struct({ + blue: restructure.uint8, + green: restructure.uint8, + red: restructure.uint8, + alpha: restructure.uint8 +}); +var CPAL = new restructure.VersionedStruct(restructure.uint16, { + header: { + numPaletteEntries: restructure.uint16, + numPalettes: restructure.uint16, + numColorRecords: restructure.uint16, + colorRecords: new restructure.Pointer(restructure.uint32, new restructure.Array(ColorRecord, 'numColorRecords')), + colorRecordIndices: new restructure.Array(restructure.uint16, 'numPalettes') + }, + 0: {}, + 1: { + offsetPaletteTypeArray: new restructure.Pointer(restructure.uint32, new restructure.Array(restructure.uint32, 'numPalettes')), + offsetPaletteLabelArray: new restructure.Pointer(restructure.uint32, new restructure.Array(restructure.uint16, 'numPalettes')), + offsetPaletteEntryLabelArray: new restructure.Pointer(restructure.uint32, new restructure.Array(restructure.uint16, 'numPaletteEntries')) + } +}); + +var BaseCoord = new restructure.VersionedStruct(restructure.uint16, { + 1: { + // Design units only + coordinate: restructure.int16 // X or Y value, in design units + + }, + 2: { + // Design units plus contour point + coordinate: restructure.int16, + // X or Y value, in design units + referenceGlyph: restructure.uint16, + // GlyphID of control glyph + baseCoordPoint: restructure.uint16 // Index of contour point on the referenceGlyph + + }, + 3: { + // Design units plus Device table + coordinate: restructure.int16, + // X or Y value, in design units + deviceTable: new restructure.Pointer(restructure.uint16, Device) // Device table for X or Y value + + } +}); +var BaseValues = new restructure.Struct({ + defaultIndex: restructure.uint16, + // Index of default baseline for this script-same index in the BaseTagList + baseCoordCount: restructure.uint16, + baseCoords: new restructure.Array(new restructure.Pointer(restructure.uint16, BaseCoord), 'baseCoordCount') +}); +var FeatMinMaxRecord = new restructure.Struct({ + tag: new restructure.String(4), + // 4-byte feature identification tag-must match FeatureTag in FeatureList + minCoord: new restructure.Pointer(restructure.uint16, BaseCoord, { + type: 'parent' + }), + // May be NULL + maxCoord: new restructure.Pointer(restructure.uint16, BaseCoord, { + type: 'parent' + }) // May be NULL + +}); +var MinMax = new restructure.Struct({ + minCoord: new restructure.Pointer(restructure.uint16, BaseCoord), + // May be NULL + maxCoord: new restructure.Pointer(restructure.uint16, BaseCoord), + // May be NULL + featMinMaxCount: restructure.uint16, + // May be 0 + featMinMaxRecords: new restructure.Array(FeatMinMaxRecord, 'featMinMaxCount') // In alphabetical order + +}); +var BaseLangSysRecord = new restructure.Struct({ + tag: new restructure.String(4), + // 4-byte language system identification tag + minMax: new restructure.Pointer(restructure.uint16, MinMax, { + type: 'parent' + }) +}); +var BaseScript = new restructure.Struct({ + baseValues: new restructure.Pointer(restructure.uint16, BaseValues), + // May be NULL + defaultMinMax: new restructure.Pointer(restructure.uint16, MinMax), + // May be NULL + baseLangSysCount: restructure.uint16, + // May be 0 + baseLangSysRecords: new restructure.Array(BaseLangSysRecord, 'baseLangSysCount') // in alphabetical order by BaseLangSysTag + +}); +var BaseScriptRecord = new restructure.Struct({ + tag: new restructure.String(4), + // 4-byte script identification tag + script: new restructure.Pointer(restructure.uint16, BaseScript, { + type: 'parent' + }) +}); +var BaseScriptList = new restructure.Array(BaseScriptRecord, restructure.uint16); // Array of 4-byte baseline identification tags-must be in alphabetical order + +var BaseTagList = new restructure.Array(new restructure.String(4), restructure.uint16); +var Axis = new restructure.Struct({ + baseTagList: new restructure.Pointer(restructure.uint16, BaseTagList), + // May be NULL + baseScriptList: new restructure.Pointer(restructure.uint16, BaseScriptList) +}); +var BASE = new restructure.VersionedStruct(restructure.uint32, { + header: { + horizAxis: new restructure.Pointer(restructure.uint16, Axis), + // May be NULL + vertAxis: new restructure.Pointer(restructure.uint16, Axis) // May be NULL + + }, + 0x00010000: {}, + 0x00010001: { + itemVariationStore: new restructure.Pointer(restructure.uint32, ItemVariationStore) + } +}); + +var AttachPoint = new restructure.Array(restructure.uint16, restructure.uint16); +var AttachList = new restructure.Struct({ + coverage: new restructure.Pointer(restructure.uint16, Coverage), + glyphCount: restructure.uint16, + attachPoints: new restructure.Array(new restructure.Pointer(restructure.uint16, AttachPoint), 'glyphCount') +}); +var CaretValue = new restructure.VersionedStruct(restructure.uint16, { + 1: { + // Design units only + coordinate: restructure.int16 + }, + 2: { + // Contour point + caretValuePoint: restructure.uint16 + }, + 3: { + // Design units plus Device table + coordinate: restructure.int16, + deviceTable: new restructure.Pointer(restructure.uint16, Device) + } +}); +var LigGlyph = new restructure.Array(new restructure.Pointer(restructure.uint16, CaretValue), restructure.uint16); +var LigCaretList = new restructure.Struct({ + coverage: new restructure.Pointer(restructure.uint16, Coverage), + ligGlyphCount: restructure.uint16, + ligGlyphs: new restructure.Array(new restructure.Pointer(restructure.uint16, LigGlyph), 'ligGlyphCount') +}); +var MarkGlyphSetsDef = new restructure.Struct({ + markSetTableFormat: restructure.uint16, + markSetCount: restructure.uint16, + coverage: new restructure.Array(new restructure.Pointer(restructure.uint32, Coverage), 'markSetCount') +}); +var GDEF = new restructure.VersionedStruct(restructure.uint32, { + header: { + glyphClassDef: new restructure.Pointer(restructure.uint16, ClassDef), + attachList: new restructure.Pointer(restructure.uint16, AttachList), + ligCaretList: new restructure.Pointer(restructure.uint16, LigCaretList), + markAttachClassDef: new restructure.Pointer(restructure.uint16, ClassDef) + }, + 0x00010000: {}, + 0x00010002: { + markGlyphSetsDef: new restructure.Pointer(restructure.uint16, MarkGlyphSetsDef) + }, + 0x00010003: { + markGlyphSetsDef: new restructure.Pointer(restructure.uint16, MarkGlyphSetsDef), + itemVariationStore: new restructure.Pointer(restructure.uint32, ItemVariationStore) + } +}); + +var ValueFormat = new restructure.Bitfield(restructure.uint16, ['xPlacement', 'yPlacement', 'xAdvance', 'yAdvance', 'xPlaDevice', 'yPlaDevice', 'xAdvDevice', 'yAdvDevice']); +var types = { + xPlacement: restructure.int16, + yPlacement: restructure.int16, + xAdvance: restructure.int16, + yAdvance: restructure.int16, + xPlaDevice: new restructure.Pointer(restructure.uint16, Device, { + type: 'global', + relativeTo: 'rel' + }), + yPlaDevice: new restructure.Pointer(restructure.uint16, Device, { + type: 'global', + relativeTo: 'rel' + }), + xAdvDevice: new restructure.Pointer(restructure.uint16, Device, { + type: 'global', + relativeTo: 'rel' + }), + yAdvDevice: new restructure.Pointer(restructure.uint16, Device, { + type: 'global', + relativeTo: 'rel' + }) +}; + +var ValueRecord = /*#__PURE__*/function () { + function ValueRecord(key) { + if (key === void 0) { + key = 'valueFormat'; + } + + this.key = key; + } + + var _proto = ValueRecord.prototype; + + _proto.buildStruct = function buildStruct(parent) { + var struct = parent; + + while (!struct[this.key] && struct.parent) { + struct = struct.parent; + } + + if (!struct[this.key]) return; + var fields = {}; + + fields.rel = function () { + return struct._startOffset; + }; + + var format = struct[this.key]; + + for (var key in format) { + if (format[key]) { + fields[key] = types[key]; + } + } + + return new restructure.Struct(fields); + }; + + _proto.size = function size(val, ctx) { + return this.buildStruct(ctx).size(val, ctx); + }; + + _proto.decode = function decode(stream, parent) { + var res = this.buildStruct(parent).decode(stream, parent); + delete res.rel; + return res; + }; + + return ValueRecord; +}(); + +var PairValueRecord = new restructure.Struct({ + secondGlyph: restructure.uint16, + value1: new ValueRecord('valueFormat1'), + value2: new ValueRecord('valueFormat2') +}); +var PairSet = new restructure.Array(PairValueRecord, restructure.uint16); +var Class2Record = new restructure.Struct({ + value1: new ValueRecord('valueFormat1'), + value2: new ValueRecord('valueFormat2') +}); +var Anchor = new restructure.VersionedStruct(restructure.uint16, { + 1: { + // Design units only + xCoordinate: restructure.int16, + yCoordinate: restructure.int16 + }, + 2: { + // Design units plus contour point + xCoordinate: restructure.int16, + yCoordinate: restructure.int16, + anchorPoint: restructure.uint16 + }, + 3: { + // Design units plus Device tables + xCoordinate: restructure.int16, + yCoordinate: restructure.int16, + xDeviceTable: new restructure.Pointer(restructure.uint16, Device), + yDeviceTable: new restructure.Pointer(restructure.uint16, Device) + } +}); +var EntryExitRecord = new restructure.Struct({ + entryAnchor: new restructure.Pointer(restructure.uint16, Anchor, { + type: 'parent' + }), + exitAnchor: new restructure.Pointer(restructure.uint16, Anchor, { + type: 'parent' + }) +}); +var MarkRecord = new restructure.Struct({ + "class": restructure.uint16, + markAnchor: new restructure.Pointer(restructure.uint16, Anchor, { + type: 'parent' + }) +}); +var MarkArray = new restructure.Array(MarkRecord, restructure.uint16); +var BaseRecord = new restructure.Array(new restructure.Pointer(restructure.uint16, Anchor), function (t) { + return t.parent.classCount; +}); +var BaseArray = new restructure.Array(BaseRecord, restructure.uint16); +var ComponentRecord = new restructure.Array(new restructure.Pointer(restructure.uint16, Anchor), function (t) { + return t.parent.parent.classCount; +}); +var LigatureAttach = new restructure.Array(ComponentRecord, restructure.uint16); +var LigatureArray = new restructure.Array(new restructure.Pointer(restructure.uint16, LigatureAttach), restructure.uint16); +var GPOSLookup = new restructure.VersionedStruct('lookupType', { + 1: new restructure.VersionedStruct(restructure.uint16, { + // Single Adjustment + 1: { + // Single positioning value + coverage: new restructure.Pointer(restructure.uint16, Coverage), + valueFormat: ValueFormat, + value: new ValueRecord() + }, + 2: { + coverage: new restructure.Pointer(restructure.uint16, Coverage), + valueFormat: ValueFormat, + valueCount: restructure.uint16, + values: new restructure.LazyArray(new ValueRecord(), 'valueCount') + } + }), + 2: new restructure.VersionedStruct(restructure.uint16, { + // Pair Adjustment Positioning + 1: { + // Adjustments for glyph pairs + coverage: new restructure.Pointer(restructure.uint16, Coverage), + valueFormat1: ValueFormat, + valueFormat2: ValueFormat, + pairSetCount: restructure.uint16, + pairSets: new restructure.LazyArray(new restructure.Pointer(restructure.uint16, PairSet), 'pairSetCount') + }, + 2: { + // Class pair adjustment + coverage: new restructure.Pointer(restructure.uint16, Coverage), + valueFormat1: ValueFormat, + valueFormat2: ValueFormat, + classDef1: new restructure.Pointer(restructure.uint16, ClassDef), + classDef2: new restructure.Pointer(restructure.uint16, ClassDef), + class1Count: restructure.uint16, + class2Count: restructure.uint16, + classRecords: new restructure.LazyArray(new restructure.LazyArray(Class2Record, 'class2Count'), 'class1Count') + } + }), + 3: { + // Cursive Attachment Positioning + format: restructure.uint16, + coverage: new restructure.Pointer(restructure.uint16, Coverage), + entryExitCount: restructure.uint16, + entryExitRecords: new restructure.Array(EntryExitRecord, 'entryExitCount') + }, + 4: { + // MarkToBase Attachment Positioning + format: restructure.uint16, + markCoverage: new restructure.Pointer(restructure.uint16, Coverage), + baseCoverage: new restructure.Pointer(restructure.uint16, Coverage), + classCount: restructure.uint16, + markArray: new restructure.Pointer(restructure.uint16, MarkArray), + baseArray: new restructure.Pointer(restructure.uint16, BaseArray) + }, + 5: { + // MarkToLigature Attachment Positioning + format: restructure.uint16, + markCoverage: new restructure.Pointer(restructure.uint16, Coverage), + ligatureCoverage: new restructure.Pointer(restructure.uint16, Coverage), + classCount: restructure.uint16, + markArray: new restructure.Pointer(restructure.uint16, MarkArray), + ligatureArray: new restructure.Pointer(restructure.uint16, LigatureArray) + }, + 6: { + // MarkToMark Attachment Positioning + format: restructure.uint16, + mark1Coverage: new restructure.Pointer(restructure.uint16, Coverage), + mark2Coverage: new restructure.Pointer(restructure.uint16, Coverage), + classCount: restructure.uint16, + mark1Array: new restructure.Pointer(restructure.uint16, MarkArray), + mark2Array: new restructure.Pointer(restructure.uint16, BaseArray) + }, + 7: Context, + // Contextual positioning + 8: ChainingContext, + // Chaining contextual positioning + 9: { + // Extension Positioning + posFormat: restructure.uint16, + lookupType: restructure.uint16, + // cannot also be 9 + extension: new restructure.Pointer(restructure.uint32, GPOSLookup) + } +}); // Fix circular reference + +GPOSLookup.versions[9].extension.type = GPOSLookup; +var GPOS = new restructure.VersionedStruct(restructure.uint32, { + header: { + scriptList: new restructure.Pointer(restructure.uint16, ScriptList), + featureList: new restructure.Pointer(restructure.uint16, FeatureList), + lookupList: new restructure.Pointer(restructure.uint16, new LookupList(GPOSLookup)) + }, + 0x00010000: {}, + 0x00010001: { + featureVariations: new restructure.Pointer(restructure.uint32, FeatureVariations) + } +}); // export GPOSLookup for JSTF table + +var Sequence = new restructure.Array(restructure.uint16, restructure.uint16); +var AlternateSet = Sequence; +var Ligature = new restructure.Struct({ + glyph: restructure.uint16, + compCount: restructure.uint16, + components: new restructure.Array(restructure.uint16, function (t) { + return t.compCount - 1; + }) +}); +var LigatureSet = new restructure.Array(new restructure.Pointer(restructure.uint16, Ligature), restructure.uint16); +var GSUBLookup = new restructure.VersionedStruct('lookupType', { + 1: new restructure.VersionedStruct(restructure.uint16, { + // Single Substitution + 1: { + coverage: new restructure.Pointer(restructure.uint16, Coverage), + deltaGlyphID: restructure.int16 + }, + 2: { + coverage: new restructure.Pointer(restructure.uint16, Coverage), + glyphCount: restructure.uint16, + substitute: new restructure.LazyArray(restructure.uint16, 'glyphCount') + } + }), + 2: { + // Multiple Substitution + substFormat: restructure.uint16, + coverage: new restructure.Pointer(restructure.uint16, Coverage), + count: restructure.uint16, + sequences: new restructure.LazyArray(new restructure.Pointer(restructure.uint16, Sequence), 'count') + }, + 3: { + // Alternate Substitution + substFormat: restructure.uint16, + coverage: new restructure.Pointer(restructure.uint16, Coverage), + count: restructure.uint16, + alternateSet: new restructure.LazyArray(new restructure.Pointer(restructure.uint16, AlternateSet), 'count') + }, + 4: { + // Ligature Substitution + substFormat: restructure.uint16, + coverage: new restructure.Pointer(restructure.uint16, Coverage), + count: restructure.uint16, + ligatureSets: new restructure.LazyArray(new restructure.Pointer(restructure.uint16, LigatureSet), 'count') + }, + 5: Context, + // Contextual Substitution + 6: ChainingContext, + // Chaining Contextual Substitution + 7: { + // Extension Substitution + substFormat: restructure.uint16, + lookupType: restructure.uint16, + // cannot also be 7 + extension: new restructure.Pointer(restructure.uint32, GSUBLookup) + }, + 8: { + // Reverse Chaining Contextual Single Substitution + substFormat: restructure.uint16, + coverage: new restructure.Pointer(restructure.uint16, Coverage), + backtrackCoverage: new restructure.Array(new restructure.Pointer(restructure.uint16, Coverage), 'backtrackGlyphCount'), + lookaheadGlyphCount: restructure.uint16, + lookaheadCoverage: new restructure.Array(new restructure.Pointer(restructure.uint16, Coverage), 'lookaheadGlyphCount'), + glyphCount: restructure.uint16, + substitutes: new restructure.Array(restructure.uint16, 'glyphCount') + } +}); // Fix circular reference + +GSUBLookup.versions[7].extension.type = GSUBLookup; +var GSUB = new restructure.VersionedStruct(restructure.uint32, { + header: { + scriptList: new restructure.Pointer(restructure.uint16, ScriptList), + featureList: new restructure.Pointer(restructure.uint16, FeatureList), + lookupList: new restructure.Pointer(restructure.uint16, new LookupList(GSUBLookup)) + }, + 0x00010000: {}, + 0x00010001: { + featureVariations: new restructure.Pointer(restructure.uint32, FeatureVariations) + } +}); + +var JstfGSUBModList = new restructure.Array(restructure.uint16, restructure.uint16); +var JstfPriority = new restructure.Struct({ + shrinkageEnableGSUB: new restructure.Pointer(restructure.uint16, JstfGSUBModList), + shrinkageDisableGSUB: new restructure.Pointer(restructure.uint16, JstfGSUBModList), + shrinkageEnableGPOS: new restructure.Pointer(restructure.uint16, JstfGSUBModList), + shrinkageDisableGPOS: new restructure.Pointer(restructure.uint16, JstfGSUBModList), + shrinkageJstfMax: new restructure.Pointer(restructure.uint16, new LookupList(GPOSLookup)), + extensionEnableGSUB: new restructure.Pointer(restructure.uint16, JstfGSUBModList), + extensionDisableGSUB: new restructure.Pointer(restructure.uint16, JstfGSUBModList), + extensionEnableGPOS: new restructure.Pointer(restructure.uint16, JstfGSUBModList), + extensionDisableGPOS: new restructure.Pointer(restructure.uint16, JstfGSUBModList), + extensionJstfMax: new restructure.Pointer(restructure.uint16, new LookupList(GPOSLookup)) +}); +var JstfLangSys = new restructure.Array(new restructure.Pointer(restructure.uint16, JstfPriority), restructure.uint16); +var JstfLangSysRecord = new restructure.Struct({ + tag: new restructure.String(4), + jstfLangSys: new restructure.Pointer(restructure.uint16, JstfLangSys) +}); +var JstfScript = new restructure.Struct({ + extenderGlyphs: new restructure.Pointer(restructure.uint16, new restructure.Array(restructure.uint16, restructure.uint16)), + // array of glyphs to extend line length + defaultLangSys: new restructure.Pointer(restructure.uint16, JstfLangSys), + langSysCount: restructure.uint16, + langSysRecords: new restructure.Array(JstfLangSysRecord, 'langSysCount') +}); +var JstfScriptRecord = new restructure.Struct({ + tag: new restructure.String(4), + script: new restructure.Pointer(restructure.uint16, JstfScript, { + type: 'parent' + }) +}); +var JSTF = new restructure.Struct({ + version: restructure.uint32, + // should be 0x00010000 + scriptCount: restructure.uint16, + scriptList: new restructure.Array(JstfScriptRecord, 'scriptCount') +}); + +var VariableSizeNumber = /*#__PURE__*/function () { + function VariableSizeNumber(size) { + this._size = size; + } + + var _proto = VariableSizeNumber.prototype; + + _proto.decode = function decode(stream, parent) { + switch (this.size(0, parent)) { + case 1: + return stream.readUInt8(); + + case 2: + return stream.readUInt16BE(); + + case 3: + return stream.readUInt24BE(); + + case 4: + return stream.readUInt32BE(); + } + }; + + _proto.size = function size(val, parent) { + return utils_1(this._size, null, parent); + }; + + return VariableSizeNumber; +}(); + +var MapDataEntry = new restructure.Struct({ + entry: new VariableSizeNumber(function (t) { + return ((t.parent.entryFormat & 0x0030) >> 4) + 1; + }), + outerIndex: function outerIndex(t) { + return t.entry >> (t.parent.entryFormat & 0x000F) + 1; + }, + innerIndex: function innerIndex(t) { + return t.entry & (1 << (t.parent.entryFormat & 0x000F) + 1) - 1; + } +}); +var DeltaSetIndexMap = new restructure.Struct({ + entryFormat: restructure.uint16, + mapCount: restructure.uint16, + mapData: new restructure.Array(MapDataEntry, 'mapCount') +}); +var HVAR = new restructure.Struct({ + majorVersion: restructure.uint16, + minorVersion: restructure.uint16, + itemVariationStore: new restructure.Pointer(restructure.uint32, ItemVariationStore), + advanceWidthMapping: new restructure.Pointer(restructure.uint32, DeltaSetIndexMap), + LSBMapping: new restructure.Pointer(restructure.uint32, DeltaSetIndexMap), + RSBMapping: new restructure.Pointer(restructure.uint32, DeltaSetIndexMap) +}); + +var Signature = new restructure.Struct({ + format: restructure.uint32, + length: restructure.uint32, + offset: restructure.uint32 +}); +var SignatureBlock = new restructure.Struct({ + reserved: new restructure.Reserved(restructure.uint16, 2), + cbSignature: restructure.uint32, + // Length (in bytes) of the PKCS#7 packet in pbSignature + signature: new restructure.Buffer('cbSignature') +}); +var DSIG = new restructure.Struct({ + ulVersion: restructure.uint32, + // Version number of the DSIG table (0x00000001) + usNumSigs: restructure.uint16, + // Number of signatures in the table + usFlag: restructure.uint16, + // Permission flags + signatures: new restructure.Array(Signature, 'usNumSigs'), + signatureBlocks: new restructure.Array(SignatureBlock, 'usNumSigs') +}); + +var GaspRange = new restructure.Struct({ + rangeMaxPPEM: restructure.uint16, + // Upper limit of range, in ppem + rangeGaspBehavior: new restructure.Bitfield(restructure.uint16, [// Flags describing desired rasterizer behavior + 'grayscale', 'gridfit', 'symmetricSmoothing', 'symmetricGridfit' // only in version 1, for ClearType + ]) +}); +var gasp = new restructure.Struct({ + version: restructure.uint16, + // set to 0 + numRanges: restructure.uint16, + gaspRanges: new restructure.Array(GaspRange, 'numRanges') // Sorted by ppem + +}); + +var DeviceRecord = new restructure.Struct({ + pixelSize: restructure.uint8, + maximumWidth: restructure.uint8, + widths: new restructure.Array(restructure.uint8, function (t) { + return t.parent.parent.maxp.numGlyphs; + }) +}); // The Horizontal Device Metrics table stores integer advance widths scaled to particular pixel sizes + +var hdmx = new restructure.Struct({ + version: restructure.uint16, + numRecords: restructure.int16, + sizeDeviceRecord: restructure.int32, + records: new restructure.Array(DeviceRecord, 'numRecords') +}); + +var KernPair = new restructure.Struct({ + left: restructure.uint16, + right: restructure.uint16, + value: restructure.int16 +}); +var ClassTable = new restructure.Struct({ + firstGlyph: restructure.uint16, + nGlyphs: restructure.uint16, + offsets: new restructure.Array(restructure.uint16, 'nGlyphs'), + max: function max(t) { + return t.offsets.length && Math.max.apply(Math, t.offsets); + } +}); +var Kern2Array = new restructure.Struct({ + off: function off(t) { + return t._startOffset - t.parent.parent._startOffset; + }, + len: function len(t) { + return ((t.parent.leftTable.max - t.off) / t.parent.rowWidth + 1) * (t.parent.rowWidth / 2); + }, + values: new restructure.LazyArray(restructure.int16, 'len') +}); +var KernSubtable = new restructure.VersionedStruct('format', { + 0: { + nPairs: restructure.uint16, + searchRange: restructure.uint16, + entrySelector: restructure.uint16, + rangeShift: restructure.uint16, + pairs: new restructure.Array(KernPair, 'nPairs') + }, + 2: { + rowWidth: restructure.uint16, + leftTable: new restructure.Pointer(restructure.uint16, ClassTable, { + type: 'parent' + }), + rightTable: new restructure.Pointer(restructure.uint16, ClassTable, { + type: 'parent' + }), + array: new restructure.Pointer(restructure.uint16, Kern2Array, { + type: 'parent' + }) + }, + 3: { + glyphCount: restructure.uint16, + kernValueCount: restructure.uint8, + leftClassCount: restructure.uint8, + rightClassCount: restructure.uint8, + flags: restructure.uint8, + kernValue: new restructure.Array(restructure.int16, 'kernValueCount'), + leftClass: new restructure.Array(restructure.uint8, 'glyphCount'), + rightClass: new restructure.Array(restructure.uint8, 'glyphCount'), + kernIndex: new restructure.Array(restructure.uint8, function (t) { + return t.leftClassCount * t.rightClassCount; + }) + } +}); +var KernTable = new restructure.VersionedStruct('version', { + 0: { + // Microsoft uses this format + subVersion: restructure.uint16, + // Microsoft has an extra sub-table version number + length: restructure.uint16, + // Length of the subtable, in bytes + format: restructure.uint8, + // Format of subtable + coverage: new restructure.Bitfield(restructure.uint8, ['horizontal', // 1 if table has horizontal data, 0 if vertical + 'minimum', // If set to 1, the table has minimum values. If set to 0, the table has kerning values. + 'crossStream', // If set to 1, kerning is perpendicular to the flow of the text + 'override' // If set to 1 the value in this table replaces the accumulated value + ]), + subtable: KernSubtable, + padding: new restructure.Reserved(restructure.uint8, function (t) { + return t.length - t._currentOffset; + }) + }, + 1: { + // Apple uses this format + length: restructure.uint32, + coverage: new restructure.Bitfield(restructure.uint8, [null, null, null, null, null, 'variation', // Set if table has variation kerning values + 'crossStream', // Set if table has cross-stream kerning values + 'vertical' // Set if table has vertical kerning values + ]), + format: restructure.uint8, + tupleIndex: restructure.uint16, + subtable: KernSubtable, + padding: new restructure.Reserved(restructure.uint8, function (t) { + return t.length - t._currentOffset; + }) + } +}); +var kern = new restructure.VersionedStruct(restructure.uint16, { + 0: { + // Microsoft Version + nTables: restructure.uint16, + tables: new restructure.Array(KernTable, 'nTables') + }, + 1: { + // Apple Version + reserved: new restructure.Reserved(restructure.uint16), + // the other half of the version number + nTables: restructure.uint32, + tables: new restructure.Array(KernTable, 'nTables') + } +}); + +// Records the ppem for each glyph at which the scaling becomes linear again, +// despite instructions effecting the advance width + +var LTSH = new restructure.Struct({ + version: restructure.uint16, + numGlyphs: restructure.uint16, + yPels: new restructure.Array(restructure.uint8, 'numGlyphs') +}); + +// NOTE: The PCLT table is strongly discouraged for OpenType fonts with TrueType outlines + +var PCLT = new restructure.Struct({ + version: restructure.uint16, + fontNumber: restructure.uint32, + pitch: restructure.uint16, + xHeight: restructure.uint16, + style: restructure.uint16, + typeFamily: restructure.uint16, + capHeight: restructure.uint16, + symbolSet: restructure.uint16, + typeface: new restructure.String(16), + characterComplement: new restructure.String(8), + fileName: new restructure.String(6), + strokeWeight: new restructure.String(1), + widthType: new restructure.String(1), + serifStyle: restructure.uint8, + reserved: new restructure.Reserved(restructure.uint8) +}); + +// sizes. This is needed in order to match font metrics on Windows. + +var Ratio = new restructure.Struct({ + bCharSet: restructure.uint8, + // Character set + xRatio: restructure.uint8, + // Value to use for x-Ratio + yStartRatio: restructure.uint8, + // Starting y-Ratio value + yEndRatio: restructure.uint8 // Ending y-Ratio value + +}); +var vTable = new restructure.Struct({ + yPelHeight: restructure.uint16, + // yPelHeight to which values apply + yMax: restructure.int16, + // Maximum value (in pels) for this yPelHeight + yMin: restructure.int16 // Minimum value (in pels) for this yPelHeight + +}); +var VdmxGroup = new restructure.Struct({ + recs: restructure.uint16, + // Number of height records in this group + startsz: restructure.uint8, + // Starting yPelHeight + endsz: restructure.uint8, + // Ending yPelHeight + entries: new restructure.Array(vTable, 'recs') // The VDMX records + +}); +var VDMX = new restructure.Struct({ + version: restructure.uint16, + // Version number (0 or 1) + numRecs: restructure.uint16, + // Number of VDMX groups present + numRatios: restructure.uint16, + // Number of aspect ratio groupings + ratioRanges: new restructure.Array(Ratio, 'numRatios'), + // Ratio ranges + offsets: new restructure.Array(restructure.uint16, 'numRatios'), + // Offset to the VDMX group for this ratio range + groups: new restructure.Array(VdmxGroup, 'numRecs') // The actual VDMX groupings + +}); + +var vhea = new restructure.Struct({ + version: restructure.uint16, + // Version number of the Vertical Header Table + ascent: restructure.int16, + // The vertical typographic ascender for this font + descent: restructure.int16, + // The vertical typographic descender for this font + lineGap: restructure.int16, + // The vertical typographic line gap for this font + advanceHeightMax: restructure.int16, + // The maximum advance height measurement found in the font + minTopSideBearing: restructure.int16, + // The minimum top side bearing measurement found in the font + minBottomSideBearing: restructure.int16, + // The minimum bottom side bearing measurement found in the font + yMaxExtent: restructure.int16, + caretSlopeRise: restructure.int16, + // Caret slope (rise/run) + caretSlopeRun: restructure.int16, + caretOffset: restructure.int16, + // Set value equal to 0 for nonslanted fonts + reserved: new restructure.Reserved(restructure.int16, 4), + metricDataFormat: restructure.int16, + // Set to 0 + numberOfMetrics: restructure.uint16 // Number of advance heights in the Vertical Metrics table + +}); + +var VmtxEntry = new restructure.Struct({ + advance: restructure.uint16, + // The advance height of the glyph + bearing: restructure.int16 // The top sidebearing of the glyph + +}); // Vertical Metrics Table + +var vmtx = new restructure.Struct({ + metrics: new restructure.LazyArray(VmtxEntry, function (t) { + return t.parent.vhea.numberOfMetrics; + }), + bearings: new restructure.LazyArray(restructure.int16, function (t) { + return t.parent.maxp.numGlyphs - t.parent.vhea.numberOfMetrics; + }) +}); + +var shortFrac = new restructure.Fixed(16, 'BE', 14); +var Correspondence = new restructure.Struct({ + fromCoord: shortFrac, + toCoord: shortFrac +}); +var Segment = new restructure.Struct({ + pairCount: restructure.uint16, + correspondence: new restructure.Array(Correspondence, 'pairCount') +}); +var avar = new restructure.Struct({ + version: restructure.fixed32, + axisCount: restructure.uint32, + segment: new restructure.Array(Segment, 'axisCount') +}); + +function _inheritsLoose$2(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var UnboundedArrayAccessor = /*#__PURE__*/function () { + function UnboundedArrayAccessor(type, stream, parent) { + this.type = type; + this.stream = stream; + this.parent = parent; + this.base = this.stream.pos; + this._items = []; + } + + var _proto = UnboundedArrayAccessor.prototype; + + _proto.getItem = function getItem(index) { + if (this._items[index] == null) { + var pos = this.stream.pos; + this.stream.pos = this.base + this.type.size(null, this.parent) * index; + this._items[index] = this.type.decode(this.stream, this.parent); + this.stream.pos = pos; + } + + return this._items[index]; + }; + + _proto.inspect = function inspect() { + return "[UnboundedArray " + this.type.constructor.name + "]"; + }; + + return UnboundedArrayAccessor; +}(); + +var UnboundedArray = /*#__PURE__*/function (_r$Array) { + _inheritsLoose$2(UnboundedArray, _r$Array); + + function UnboundedArray(type) { + return _r$Array.call(this, type, 0) || this; + } + + var _proto2 = UnboundedArray.prototype; + + _proto2.decode = function decode(stream, parent) { + return new UnboundedArrayAccessor(this.type, stream, parent); + }; + + return UnboundedArray; +}(restructure.Array); +var LookupTable = function LookupTable(ValueType) { + if (ValueType === void 0) { + ValueType = restructure.uint16; + } + + // Helper class that makes internal structures invisible to pointers + var Shadow = /*#__PURE__*/function () { + function Shadow(type) { + this.type = type; + } + + var _proto3 = Shadow.prototype; + + _proto3.decode = function decode(stream, ctx) { + ctx = ctx.parent.parent; + return this.type.decode(stream, ctx); + }; + + _proto3.size = function size(val, ctx) { + ctx = ctx.parent.parent; + return this.type.size(val, ctx); + }; + + _proto3.encode = function encode(stream, val, ctx) { + ctx = ctx.parent.parent; + return this.type.encode(stream, val, ctx); + }; + + return Shadow; + }(); + + ValueType = new Shadow(ValueType); + var BinarySearchHeader = new restructure.Struct({ + unitSize: restructure.uint16, + nUnits: restructure.uint16, + searchRange: restructure.uint16, + entrySelector: restructure.uint16, + rangeShift: restructure.uint16 + }); + var LookupSegmentSingle = new restructure.Struct({ + lastGlyph: restructure.uint16, + firstGlyph: restructure.uint16, + value: ValueType + }); + var LookupSegmentArray = new restructure.Struct({ + lastGlyph: restructure.uint16, + firstGlyph: restructure.uint16, + values: new restructure.Pointer(restructure.uint16, new restructure.Array(ValueType, function (t) { + return t.lastGlyph - t.firstGlyph + 1; + }), { + type: 'parent' + }) + }); + var LookupSingle = new restructure.Struct({ + glyph: restructure.uint16, + value: ValueType + }); + return new restructure.VersionedStruct(restructure.uint16, { + 0: { + values: new UnboundedArray(ValueType) // length == number of glyphs maybe? + + }, + 2: { + binarySearchHeader: BinarySearchHeader, + segments: new restructure.Array(LookupSegmentSingle, function (t) { + return t.binarySearchHeader.nUnits; + }) + }, + 4: { + binarySearchHeader: BinarySearchHeader, + segments: new restructure.Array(LookupSegmentArray, function (t) { + return t.binarySearchHeader.nUnits; + }) + }, + 6: { + binarySearchHeader: BinarySearchHeader, + segments: new restructure.Array(LookupSingle, function (t) { + return t.binarySearchHeader.nUnits; + }) + }, + 8: { + firstGlyph: restructure.uint16, + count: restructure.uint16, + values: new restructure.Array(ValueType, 'count') + } + }); +}; +function StateTable(entryData, lookupType) { + if (entryData === void 0) { + entryData = {}; + } + + if (lookupType === void 0) { + lookupType = restructure.uint16; + } + + var entry = Object.assign({ + newState: restructure.uint16, + flags: restructure.uint16 + }, entryData); + var Entry = new restructure.Struct(entry); + var StateArray = new UnboundedArray(new restructure.Array(restructure.uint16, function (t) { + return t.nClasses; + })); + var StateHeader = new restructure.Struct({ + nClasses: restructure.uint32, + classTable: new restructure.Pointer(restructure.uint32, new LookupTable(lookupType)), + stateArray: new restructure.Pointer(restructure.uint32, StateArray), + entryTable: new restructure.Pointer(restructure.uint32, new UnboundedArray(Entry)) + }); + return StateHeader; +} // This is the old version of the StateTable structure + +function StateTable1(entryData, lookupType) { + if (entryData === void 0) { + entryData = {}; + } + + if (lookupType === void 0) { + lookupType = restructure.uint16; + } + + var ClassLookupTable = new restructure.Struct({ + version: function version() { + return 8; + }, + // simulate LookupTable + firstGlyph: restructure.uint16, + values: new restructure.Array(restructure.uint8, restructure.uint16) + }); + var entry = Object.assign({ + newStateOffset: restructure.uint16, + // convert offset to stateArray index + newState: function newState(t) { + return (t.newStateOffset - (t.parent.stateArray.base - t.parent._startOffset)) / t.parent.nClasses; + }, + flags: restructure.uint16 + }, entryData); + var Entry = new restructure.Struct(entry); + var StateArray = new UnboundedArray(new restructure.Array(restructure.uint8, function (t) { + return t.nClasses; + })); + var StateHeader1 = new restructure.Struct({ + nClasses: restructure.uint16, + classTable: new restructure.Pointer(restructure.uint16, ClassLookupTable), + stateArray: new restructure.Pointer(restructure.uint16, StateArray), + entryTable: new restructure.Pointer(restructure.uint16, new UnboundedArray(Entry)) + }); + return StateHeader1; +} + +var BslnSubtable = new restructure.VersionedStruct('format', { + 0: { + // Distance-based, no mapping + deltas: new restructure.Array(restructure.int16, 32) + }, + 1: { + // Distance-based, with mapping + deltas: new restructure.Array(restructure.int16, 32), + mappingData: new LookupTable(restructure.uint16) + }, + 2: { + // Control point-based, no mapping + standardGlyph: restructure.uint16, + controlPoints: new restructure.Array(restructure.uint16, 32) + }, + 3: { + // Control point-based, with mapping + standardGlyph: restructure.uint16, + controlPoints: new restructure.Array(restructure.uint16, 32), + mappingData: new LookupTable(restructure.uint16) + } +}); +var bsln = new restructure.Struct({ + version: restructure.fixed32, + format: restructure.uint16, + defaultBaseline: restructure.uint16, + subtable: BslnSubtable +}); + +var Setting = new restructure.Struct({ + setting: restructure.uint16, + nameIndex: restructure.int16, + name: function name(t) { + return t.parent.parent.parent.name.records.fontFeatures[t.nameIndex]; + } +}); +var FeatureName = new restructure.Struct({ + feature: restructure.uint16, + nSettings: restructure.uint16, + settingTable: new restructure.Pointer(restructure.uint32, new restructure.Array(Setting, 'nSettings'), { + type: 'parent' + }), + featureFlags: new restructure.Bitfield(restructure.uint8, [null, null, null, null, null, null, 'hasDefault', 'exclusive']), + defaultSetting: restructure.uint8, + nameIndex: restructure.int16, + name: function name(t) { + return t.parent.parent.name.records.fontFeatures[t.nameIndex]; + } +}); +var feat = new restructure.Struct({ + version: restructure.fixed32, + featureNameCount: restructure.uint16, + reserved1: new restructure.Reserved(restructure.uint16), + reserved2: new restructure.Reserved(restructure.uint32), + featureNames: new restructure.Array(FeatureName, 'featureNameCount') +}); + +var Axis$1 = new restructure.Struct({ + axisTag: new restructure.String(4), + minValue: restructure.fixed32, + defaultValue: restructure.fixed32, + maxValue: restructure.fixed32, + flags: restructure.uint16, + nameID: restructure.uint16, + name: function name(t) { + return t.parent.parent.name.records.fontFeatures[t.nameID]; + } +}); +var Instance = new restructure.Struct({ + nameID: restructure.uint16, + name: function name(t) { + return t.parent.parent.name.records.fontFeatures[t.nameID]; + }, + flags: restructure.uint16, + coord: new restructure.Array(restructure.fixed32, function (t) { + return t.parent.axisCount; + }), + postscriptNameID: new restructure.Optional(restructure.uint16, function (t) { + return t.parent.instanceSize - t._currentOffset > 0; + }) +}); +var fvar = new restructure.Struct({ + version: restructure.fixed32, + offsetToData: restructure.uint16, + countSizePairs: restructure.uint16, + axisCount: restructure.uint16, + axisSize: restructure.uint16, + instanceCount: restructure.uint16, + instanceSize: restructure.uint16, + axis: new restructure.Array(Axis$1, 'axisCount'), + instance: new restructure.Array(Instance, 'instanceCount') +}); + +var shortFrac$1 = new restructure.Fixed(16, 'BE', 14); + +var Offset = /*#__PURE__*/function () { + function Offset() {} + + Offset.decode = function decode(stream, parent) { + // In short format, offsets are multiplied by 2. + // This doesn't seem to be documented by Apple, but it + // is implemented this way in Freetype. + return parent.flags ? stream.readUInt32BE() : stream.readUInt16BE() * 2; + }; + + return Offset; +}(); + +var gvar = new restructure.Struct({ + version: restructure.uint16, + reserved: new restructure.Reserved(restructure.uint16), + axisCount: restructure.uint16, + globalCoordCount: restructure.uint16, + globalCoords: new restructure.Pointer(restructure.uint32, new restructure.Array(new restructure.Array(shortFrac$1, 'axisCount'), 'globalCoordCount')), + glyphCount: restructure.uint16, + flags: restructure.uint16, + offsetToData: restructure.uint32, + offsets: new restructure.Array(new restructure.Pointer(Offset, 'void', { + relativeTo: 'offsetToData', + allowNull: false + }), function (t) { + return t.glyphCount + 1; + }) +}); + +var ClassTable$1 = new restructure.Struct({ + length: restructure.uint16, + coverage: restructure.uint16, + subFeatureFlags: restructure.uint32, + stateTable: new StateTable1() +}); +var WidthDeltaRecord = new restructure.Struct({ + justClass: restructure.uint32, + beforeGrowLimit: restructure.fixed32, + beforeShrinkLimit: restructure.fixed32, + afterGrowLimit: restructure.fixed32, + afterShrinkLimit: restructure.fixed32, + growFlags: restructure.uint16, + shrinkFlags: restructure.uint16 +}); +var WidthDeltaCluster = new restructure.Array(WidthDeltaRecord, restructure.uint32); +var ActionData = new restructure.VersionedStruct('actionType', { + 0: { + // Decomposition action + lowerLimit: restructure.fixed32, + upperLimit: restructure.fixed32, + order: restructure.uint16, + glyphs: new restructure.Array(restructure.uint16, restructure.uint16) + }, + 1: { + // Unconditional add glyph action + addGlyph: restructure.uint16 + }, + 2: { + // Conditional add glyph action + substThreshold: restructure.fixed32, + addGlyph: restructure.uint16, + substGlyph: restructure.uint16 + }, + 3: {}, + // Stretch glyph action (no data, not supported by CoreText) + 4: { + // Ductile glyph action (not supported by CoreText) + variationAxis: restructure.uint32, + minimumLimit: restructure.fixed32, + noStretchValue: restructure.fixed32, + maximumLimit: restructure.fixed32 + }, + 5: { + // Repeated add glyph action + flags: restructure.uint16, + glyph: restructure.uint16 + } +}); +var Action = new restructure.Struct({ + actionClass: restructure.uint16, + actionType: restructure.uint16, + actionLength: restructure.uint32, + actionData: ActionData, + padding: new restructure.Reserved(restructure.uint8, function (t) { + return t.actionLength - t._currentOffset; + }) +}); +var PostcompensationAction = new restructure.Array(Action, restructure.uint32); +var PostCompensationTable = new restructure.Struct({ + lookupTable: new LookupTable(new restructure.Pointer(restructure.uint16, PostcompensationAction)) +}); +var JustificationTable = new restructure.Struct({ + classTable: new restructure.Pointer(restructure.uint16, ClassTable$1, { + type: 'parent' + }), + wdcOffset: restructure.uint16, + postCompensationTable: new restructure.Pointer(restructure.uint16, PostCompensationTable, { + type: 'parent' + }), + widthDeltaClusters: new LookupTable(new restructure.Pointer(restructure.uint16, WidthDeltaCluster, { + type: 'parent', + relativeTo: 'wdcOffset' + })) +}); +var just = new restructure.Struct({ + version: restructure.uint32, + format: restructure.uint16, + horizontal: new restructure.Pointer(restructure.uint16, JustificationTable), + vertical: new restructure.Pointer(restructure.uint16, JustificationTable) +}); + +var LigatureData = { + action: restructure.uint16 +}; +var ContextualData = { + markIndex: restructure.uint16, + currentIndex: restructure.uint16 +}; +var InsertionData = { + currentInsertIndex: restructure.uint16, + markedInsertIndex: restructure.uint16 +}; +var SubstitutionTable = new restructure.Struct({ + items: new UnboundedArray(new restructure.Pointer(restructure.uint32, new LookupTable())) +}); +var SubtableData = new restructure.VersionedStruct('type', { + 0: { + // Indic Rearrangement Subtable + stateTable: new StateTable() + }, + 1: { + // Contextual Glyph Substitution Subtable + stateTable: new StateTable(ContextualData), + substitutionTable: new restructure.Pointer(restructure.uint32, SubstitutionTable) + }, + 2: { + // Ligature subtable + stateTable: new StateTable(LigatureData), + ligatureActions: new restructure.Pointer(restructure.uint32, new UnboundedArray(restructure.uint32)), + components: new restructure.Pointer(restructure.uint32, new UnboundedArray(restructure.uint16)), + ligatureList: new restructure.Pointer(restructure.uint32, new UnboundedArray(restructure.uint16)) + }, + 4: { + // Non-contextual Glyph Substitution Subtable + lookupTable: new LookupTable() + }, + 5: { + // Glyph Insertion Subtable + stateTable: new StateTable(InsertionData), + insertionActions: new restructure.Pointer(restructure.uint32, new UnboundedArray(restructure.uint16)) + } +}); +var Subtable = new restructure.Struct({ + length: restructure.uint32, + coverage: restructure.uint24, + type: restructure.uint8, + subFeatureFlags: restructure.uint32, + table: SubtableData, + padding: new restructure.Reserved(restructure.uint8, function (t) { + return t.length - t._currentOffset; + }) +}); +var FeatureEntry = new restructure.Struct({ + featureType: restructure.uint16, + featureSetting: restructure.uint16, + enableFlags: restructure.uint32, + disableFlags: restructure.uint32 +}); +var MorxChain = new restructure.Struct({ + defaultFlags: restructure.uint32, + chainLength: restructure.uint32, + nFeatureEntries: restructure.uint32, + nSubtables: restructure.uint32, + features: new restructure.Array(FeatureEntry, 'nFeatureEntries'), + subtables: new restructure.Array(Subtable, 'nSubtables') +}); +var morx = new restructure.Struct({ + version: restructure.uint16, + unused: new restructure.Reserved(restructure.uint16), + nChains: restructure.uint32, + chains: new restructure.Array(MorxChain, 'nChains') +}); + +var OpticalBounds = new restructure.Struct({ + left: restructure.int16, + top: restructure.int16, + right: restructure.int16, + bottom: restructure.int16 +}); +var opbd = new restructure.Struct({ + version: restructure.fixed32, + format: restructure.uint16, + lookupTable: new LookupTable(OpticalBounds) +}); + +var tables = {}; +tables.cmap = cmap; +tables.head = head; +tables.hhea = hhea; +tables.hmtx = hmtx; +tables.maxp = maxp; +tables.name = NameTable; +tables['OS/2'] = OS2; +tables.post = post; // TrueType Outlines +tables.fpgm = fpgm; +tables.loca = loca; +tables.prep = prep; +tables['cvt '] = cvt; +tables.glyf = glyf; // PostScript Outlines +tables['CFF '] = CFFFont; +tables['CFF2'] = CFFFont; +tables.VORG = VORG; // Bitmap Glyphs +tables.EBLC = EBLC; +tables.CBLC = tables.EBLC; +tables.sbix = sbix; +tables.COLR = COLR; +tables.CPAL = CPAL; // Advanced OpenType Tables +tables.BASE = BASE; +tables.GDEF = GDEF; +tables.GPOS = GPOS; +tables.GSUB = GSUB; +tables.JSTF = JSTF; // OpenType variations tables +tables.HVAR = HVAR; // Other OpenType Tables +tables.DSIG = DSIG; +tables.gasp = gasp; +tables.hdmx = hdmx; +tables.kern = kern; +tables.LTSH = LTSH; +tables.PCLT = PCLT; +tables.VDMX = VDMX; +tables.vhea = vhea; +tables.vmtx = vmtx; // Apple Advanced Typography Tables +tables.avar = avar; +tables.bsln = bsln; +tables.feat = feat; +tables.fvar = fvar; +tables.gvar = gvar; +tables.just = just; +tables.morx = morx; +tables.opbd = opbd; + +function _createForOfIteratorHelperLoose$3(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$3(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$3(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$3(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$3(o, minLen); } + +function _arrayLikeToArray$3(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +var TableEntry = new restructure.Struct({ + tag: new restructure.String(4), + checkSum: restructure.uint32, + offset: new restructure.Pointer(restructure.uint32, 'void', { + type: 'global' + }), + length: restructure.uint32 +}); +var Directory = new restructure.Struct({ + tag: new restructure.String(4), + numTables: restructure.uint16, + searchRange: restructure.uint16, + entrySelector: restructure.uint16, + rangeShift: restructure.uint16, + tables: new restructure.Array(TableEntry, 'numTables') +}); + +Directory.process = function () { + var tables = {}; + + for (var _iterator = _createForOfIteratorHelperLoose$3(this.tables), _step; !(_step = _iterator()).done;) { + var table = _step.value; + tables[table.tag] = table; + } + + this.tables = tables; +}; + +Directory.preEncode = function (stream) { + var tables$1 = []; + + for (var tag in this.tables) { + var table = this.tables[tag]; + + if (table) { + tables$1.push({ + tag: tag, + checkSum: 0, + offset: new restructure.VoidPointer(tables[tag], table), + length: tables[tag].size(table) + }); + } + } + + this.tag = 'true'; + this.numTables = tables$1.length; + this.tables = tables$1; + var maxExponentFor2 = Math.floor(Math.log(this.numTables) / Math.LN2); + var maxPowerOf2 = Math.pow(2, maxExponentFor2); + this.searchRange = maxPowerOf2 * 16; + this.entrySelector = Math.log(maxPowerOf2) / Math.LN2; + this.rangeShift = this.numTables * 16 - this.searchRange; +}; + +function binarySearch(arr, cmp) { + var min = 0; + var max = arr.length - 1; + + while (min <= max) { + var mid = min + max >> 1; + var res = cmp(arr[mid]); + + if (res < 0) { + max = mid - 1; + } else if (res > 0) { + min = mid + 1; + } else { + return mid; + } + } + + return -1; +} +function range(index, end) { + var range = []; + + while (index < end) { + range.push(index++); + } + + return range; +} + +var _class; + +function _createForOfIteratorHelperLoose$4(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$4(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$4(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$4(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$4(o, minLen); } + +function _arrayLikeToArray$4(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; } +var CmapProcessor = (_class = /*#__PURE__*/function () { + function CmapProcessor(cmapTable) { + // Attempt to find a Unicode cmap first + this.encoding = null; + this.cmap = this.findSubtable(cmapTable, [// 32-bit subtables + [3, 10], [0, 6], [0, 4], // 16-bit subtables + [3, 1], [0, 3], [0, 2], [0, 1], [0, 0]]); // If not unicode cmap was found, and iconv-lite is installed, + // take the first table with a supported encoding. + + if (!this.cmap && lib) { + for (var _iterator = _createForOfIteratorHelperLoose$4(cmapTable.tables), _step; !(_step = _iterator()).done;) { + var cmap = _step.value; + var encoding = getEncoding(cmap.platformID, cmap.encodingID, cmap.table.language - 1); + + if (lib.encodingExists(encoding)) { + this.cmap = cmap.table; + this.encoding = encoding; + } + } + } + + if (!this.cmap) { + throw new Error("Could not find a supported cmap table"); + } + + this.uvs = this.findSubtable(cmapTable, [[0, 5]]); + + if (this.uvs && this.uvs.version !== 14) { + this.uvs = null; + } + } + + var _proto = CmapProcessor.prototype; + + _proto.findSubtable = function findSubtable(cmapTable, pairs) { + for (var _iterator2 = _createForOfIteratorHelperLoose$4(pairs), _step2; !(_step2 = _iterator2()).done;) { + var _step2$value = _step2.value, + platformID = _step2$value[0], + encodingID = _step2$value[1]; + + for (var _iterator3 = _createForOfIteratorHelperLoose$4(cmapTable.tables), _step3; !(_step3 = _iterator3()).done;) { + var cmap = _step3.value; + + if (cmap.platformID === platformID && cmap.encodingID === encodingID) { + return cmap.table; + } + } + } + + return null; + }; + + _proto.lookup = function lookup(codepoint, variationSelector) { + // If there is no Unicode cmap in this font, we need to re-encode + // the codepoint in the encoding that the cmap supports. + if (this.encoding) { + var buf = lib.encode(String.fromCodePoint(codepoint), this.encoding); + codepoint = 0; + + for (var i = 0; i < buf.length; i++) { + codepoint = codepoint << 8 | buf[i]; + } // Otherwise, try to get a Unicode variation selector for this codepoint if one is provided. + + } else if (variationSelector) { + var gid = this.getVariationSelector(codepoint, variationSelector); + + if (gid) { + return gid; + } + } + + var cmap = this.cmap; + + switch (cmap.version) { + case 0: + return cmap.codeMap.get(codepoint) || 0; + + case 4: + { + var min = 0; + var max = cmap.segCount - 1; + + while (min <= max) { + var mid = min + max >> 1; + + if (codepoint < cmap.startCode.get(mid)) { + max = mid - 1; + } else if (codepoint > cmap.endCode.get(mid)) { + min = mid + 1; + } else { + var rangeOffset = cmap.idRangeOffset.get(mid); + + var _gid = void 0; + + if (rangeOffset === 0) { + _gid = codepoint + cmap.idDelta.get(mid); + } else { + var index = rangeOffset / 2 + (codepoint - cmap.startCode.get(mid)) - (cmap.segCount - mid); + _gid = cmap.glyphIndexArray.get(index) || 0; + + if (_gid !== 0) { + _gid += cmap.idDelta.get(mid); + } + } + + return _gid & 0xffff; + } + } + + return 0; + } + + case 8: + throw new Error('TODO: cmap format 8'); + + case 6: + case 10: + return cmap.glyphIndices.get(codepoint - cmap.firstCode) || 0; + + case 12: + case 13: + { + var _min = 0; + + var _max = cmap.nGroups - 1; + + while (_min <= _max) { + var _mid = _min + _max >> 1; + + var group = cmap.groups.get(_mid); + + if (codepoint < group.startCharCode) { + _max = _mid - 1; + } else if (codepoint > group.endCharCode) { + _min = _mid + 1; + } else { + if (cmap.version === 12) { + return group.glyphID + (codepoint - group.startCharCode); + } else { + return group.glyphID; + } + } + } + + return 0; + } + + case 14: + throw new Error('TODO: cmap format 14'); + + default: + throw new Error("Unknown cmap format " + cmap.version); + } + }; + + _proto.getVariationSelector = function getVariationSelector(codepoint, variationSelector) { + if (!this.uvs) { + return 0; + } + + var selectors = this.uvs.varSelectors.toArray(); + var i = binarySearch(selectors, function (x) { + return variationSelector - x.varSelector; + }); + var sel = selectors[i]; + + if (i !== -1 && sel.defaultUVS) { + i = binarySearch(sel.defaultUVS, function (x) { + return codepoint < x.startUnicodeValue ? -1 : codepoint > x.startUnicodeValue + x.additionalCount ? +1 : 0; + }); + } + + if (i !== -1 && sel.nonDefaultUVS) { + i = binarySearch(sel.nonDefaultUVS, function (x) { + return codepoint - x.unicodeValue; + }); + + if (i !== -1) { + return sel.nonDefaultUVS[i].glyphID; + } + } + + return 0; + }; + + _proto.getCharacterSet = function getCharacterSet() { + var cmap = this.cmap; + + switch (cmap.version) { + case 0: + return range(0, cmap.codeMap.length); + + case 4: + { + var res = []; + var endCodes = cmap.endCode.toArray(); + + for (var i = 0; i < endCodes.length; i++) { + var tail = endCodes[i] + 1; + var start = cmap.startCode.get(i); + res.push.apply(res, range(start, tail)); + } + + return res; + } + + case 8: + throw new Error('TODO: cmap format 8'); + + case 6: + case 10: + return range(cmap.firstCode, cmap.firstCode + cmap.glyphIndices.length); + + case 12: + case 13: + { + var _res = []; + + for (var _iterator4 = _createForOfIteratorHelperLoose$4(cmap.groups.toArray()), _step4; !(_step4 = _iterator4()).done;) { + var group = _step4.value; + + _res.push.apply(_res, range(group.startCharCode, group.endCharCode + 1)); + } + + return _res; + } + + case 14: + throw new Error('TODO: cmap format 14'); + + default: + throw new Error("Unknown cmap format " + cmap.version); + } + }; + + _proto.codePointsForGlyph = function codePointsForGlyph(gid) { + var cmap = this.cmap; + + switch (cmap.version) { + case 0: + { + var res = []; + + for (var i = 0; i < 256; i++) { + if (cmap.codeMap.get(i) === gid) { + res.push(i); + } + } + + return res; + } + + case 4: + { + var _res2 = []; + + for (var _i = 0; _i < cmap.segCount; _i++) { + var end = cmap.endCode.get(_i); + var start = cmap.startCode.get(_i); + var rangeOffset = cmap.idRangeOffset.get(_i); + var delta = cmap.idDelta.get(_i); + + for (var c = start; c <= end; c++) { + var g = 0; + + if (rangeOffset === 0) { + g = c + delta; + } else { + var index = rangeOffset / 2 + (c - start) - (cmap.segCount - _i); + g = cmap.glyphIndexArray.get(index) || 0; + + if (g !== 0) { + g += delta; + } + } + + if (g === gid) { + _res2.push(c); + } + } + } + + return _res2; + } + + case 12: + { + var _res3 = []; + + for (var _iterator5 = _createForOfIteratorHelperLoose$4(cmap.groups.toArray()), _step5; !(_step5 = _iterator5()).done;) { + var group = _step5.value; + + if (gid >= group.glyphID && gid <= group.glyphID + (group.endCharCode - group.startCharCode)) { + _res3.push(group.startCharCode + (gid - group.glyphID)); + } + } + + return _res3; + } + + case 13: + { + var _res4 = []; + + for (var _iterator6 = _createForOfIteratorHelperLoose$4(cmap.groups.toArray()), _step6; !(_step6 = _iterator6()).done;) { + var _group = _step6.value; + + if (gid === _group.glyphID) { + _res4.push.apply(_res4, range(_group.startCharCode, _group.endCharCode + 1)); + } + } + + return _res4; + } + + default: + throw new Error("Unknown cmap format " + cmap.version); + } + }; + + return CmapProcessor; +}(), (_applyDecoratedDescriptor(_class.prototype, "getCharacterSet", [cache], Object.getOwnPropertyDescriptor(_class.prototype, "getCharacterSet"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "codePointsForGlyph", [cache], Object.getOwnPropertyDescriptor(_class.prototype, "codePointsForGlyph"), _class.prototype)), _class); + +function _createForOfIteratorHelperLoose$5(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$5(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$5(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$5(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$5(o, minLen); } + +function _arrayLikeToArray$5(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var KernProcessor = /*#__PURE__*/function () { + function KernProcessor(font) { + this.kern = font.kern; + } + + var _proto = KernProcessor.prototype; + + _proto.process = function process(glyphs, positions) { + for (var glyphIndex = 0; glyphIndex < glyphs.length - 1; glyphIndex++) { + var left = glyphs[glyphIndex].id; + var right = glyphs[glyphIndex + 1].id; + positions[glyphIndex].xAdvance += this.getKerning(left, right); + } + }; + + _proto.getKerning = function getKerning(left, right) { + var res = 0; + + for (var _iterator = _createForOfIteratorHelperLoose$5(this.kern.tables), _step; !(_step = _iterator()).done;) { + var table = _step.value; + + if (table.coverage.crossStream) { + continue; + } + + switch (table.version) { + case 0: + if (!table.coverage.horizontal) { + continue; + } + + break; + + case 1: + if (table.coverage.vertical || table.coverage.variation) { + continue; + } + + break; + + default: + throw new Error("Unsupported kerning table version " + table.version); + } + + var val = 0; + var s = table.subtable; + + switch (table.format) { + case 0: + var pairIdx = binarySearch(s.pairs, function (pair) { + return left - pair.left || right - pair.right; + }); + + if (pairIdx >= 0) { + val = s.pairs[pairIdx].value; + } + + break; + + case 2: + var leftOffset = 0, + rightOffset = 0; + + if (left >= s.leftTable.firstGlyph && left < s.leftTable.firstGlyph + s.leftTable.nGlyphs) { + leftOffset = s.leftTable.offsets[left - s.leftTable.firstGlyph]; + } else { + leftOffset = s.array.off; + } + + if (right >= s.rightTable.firstGlyph && right < s.rightTable.firstGlyph + s.rightTable.nGlyphs) { + rightOffset = s.rightTable.offsets[right - s.rightTable.firstGlyph]; + } + + var index = (leftOffset + rightOffset - s.array.off) / 2; + val = s.array.values.get(index); + break; + + case 3: + if (left >= s.glyphCount || right >= s.glyphCount) { + return 0; + } + + val = s.kernValue[s.kernIndex[s.leftClass[left] * s.rightClassCount + s.rightClass[right]]]; + break; + + default: + throw new Error("Unsupported kerning sub-table format " + table.format); + } // Microsoft supports the override flag, which resets the result + // Otherwise, the sum of the results from all subtables is returned + + + if (table.coverage.override) { + res = val; + } else { + res += val; + } + } + + return res; + }; + + return KernProcessor; +}(); + +var TINF_OK = 0; +var TINF_DATA_ERROR = -3; + +function Tree() { + this.table = new Uint16Array(16); + /* table of code length counts */ + + this.trans = new Uint16Array(288); + /* code -> symbol translation table */ +} + +function Data(source, dest) { + this.source = source; + this.sourceIndex = 0; + this.tag = 0; + this.bitcount = 0; + this.dest = dest; + this.destLen = 0; + this.ltree = new Tree(); + /* dynamic length/symbol tree */ + + this.dtree = new Tree(); + /* dynamic distance tree */ +} +/* --------------------------------------------------- * + * -- uninitialized global data (static structures) -- * + * --------------------------------------------------- */ + + +var sltree = new Tree(); +var sdtree = new Tree(); +/* extra bits and base tables for length codes */ + +var length_bits = new Uint8Array(30); +var length_base = new Uint16Array(30); +/* extra bits and base tables for distance codes */ + +var dist_bits = new Uint8Array(30); +var dist_base = new Uint16Array(30); +/* special ordering of code length codes */ + +var clcidx = new Uint8Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); +/* used by tinf_decode_trees, avoids allocations every call */ + +var code_tree = new Tree(); +var lengths = new Uint8Array(288 + 32); +/* ----------------------- * + * -- utility functions -- * + * ----------------------- */ + +/* build extra bits and base tables */ + +function tinf_build_bits_base(bits, base, delta, first) { + var i, sum; + /* build bits table */ + + for (i = 0; i < delta; ++i) { + bits[i] = 0; + } + + for (i = 0; i < 30 - delta; ++i) { + bits[i + delta] = i / delta | 0; + } + /* build base table */ + + + for (sum = first, i = 0; i < 30; ++i) { + base[i] = sum; + sum += 1 << bits[i]; + } +} +/* build the fixed huffman trees */ + + +function tinf_build_fixed_trees(lt, dt) { + var i; + /* build fixed length tree */ + + for (i = 0; i < 7; ++i) { + lt.table[i] = 0; + } + + lt.table[7] = 24; + lt.table[8] = 152; + lt.table[9] = 112; + + for (i = 0; i < 24; ++i) { + lt.trans[i] = 256 + i; + } + + for (i = 0; i < 144; ++i) { + lt.trans[24 + i] = i; + } + + for (i = 0; i < 8; ++i) { + lt.trans[24 + 144 + i] = 280 + i; + } + + for (i = 0; i < 112; ++i) { + lt.trans[24 + 144 + 8 + i] = 144 + i; + } + /* build fixed distance tree */ + + + for (i = 0; i < 5; ++i) { + dt.table[i] = 0; + } + + dt.table[5] = 32; + + for (i = 0; i < 32; ++i) { + dt.trans[i] = i; + } +} +/* given an array of code lengths, build a tree */ + + +var offs = new Uint16Array(16); + +function tinf_build_tree(t, lengths, off, num) { + var i, sum; + /* clear code length count table */ + + for (i = 0; i < 16; ++i) { + t.table[i] = 0; + } + /* scan symbol lengths, and sum code length counts */ + + + for (i = 0; i < num; ++i) { + t.table[lengths[off + i]]++; + } + + t.table[0] = 0; + /* compute offset table for distribution sort */ + + for (sum = 0, i = 0; i < 16; ++i) { + offs[i] = sum; + sum += t.table[i]; + } + /* create code->symbol translation table (symbols sorted by code) */ + + + for (i = 0; i < num; ++i) { + if (lengths[off + i]) t.trans[offs[lengths[off + i]]++] = i; + } +} +/* ---------------------- * + * -- decode functions -- * + * ---------------------- */ + +/* get one bit from source stream */ + + +function tinf_getbit(d) { + /* check if tag is empty */ + if (!d.bitcount--) { + /* load next tag */ + d.tag = d.source[d.sourceIndex++]; + d.bitcount = 7; + } + /* shift bit out of tag */ + + + var bit = d.tag & 1; + d.tag >>>= 1; + return bit; +} +/* read a num bit value from a stream and add base */ + + +function tinf_read_bits(d, num, base) { + if (!num) return base; + + while (d.bitcount < 24) { + d.tag |= d.source[d.sourceIndex++] << d.bitcount; + d.bitcount += 8; + } + + var val = d.tag & 0xffff >>> 16 - num; + d.tag >>>= num; + d.bitcount -= num; + return val + base; +} +/* given a data stream and a tree, decode a symbol */ + + +function tinf_decode_symbol(d, t) { + while (d.bitcount < 24) { + d.tag |= d.source[d.sourceIndex++] << d.bitcount; + d.bitcount += 8; + } + + var sum = 0, + cur = 0, + len = 0; + var tag = d.tag; + /* get more bits while code value is above sum */ + + do { + cur = 2 * cur + (tag & 1); + tag >>>= 1; + ++len; + sum += t.table[len]; + cur -= t.table[len]; + } while (cur >= 0); + + d.tag = tag; + d.bitcount -= len; + return t.trans[sum + cur]; +} +/* given a data stream, decode dynamic trees from it */ + + +function tinf_decode_trees(d, lt, dt) { + var hlit, hdist, hclen; + var i, num, length; + /* get 5 bits HLIT (257-286) */ + + hlit = tinf_read_bits(d, 5, 257); + /* get 5 bits HDIST (1-32) */ + + hdist = tinf_read_bits(d, 5, 1); + /* get 4 bits HCLEN (4-19) */ + + hclen = tinf_read_bits(d, 4, 4); + + for (i = 0; i < 19; ++i) { + lengths[i] = 0; + } + /* read code lengths for code length alphabet */ + + + for (i = 0; i < hclen; ++i) { + /* get 3 bits code length (0-7) */ + var clen = tinf_read_bits(d, 3, 0); + lengths[clcidx[i]] = clen; + } + /* build code length tree */ + + + tinf_build_tree(code_tree, lengths, 0, 19); + /* decode code lengths for the dynamic trees */ + + for (num = 0; num < hlit + hdist;) { + var sym = tinf_decode_symbol(d, code_tree); + + switch (sym) { + case 16: + /* copy previous code length 3-6 times (read 2 bits) */ + var prev = lengths[num - 1]; + + for (length = tinf_read_bits(d, 2, 3); length; --length) { + lengths[num++] = prev; + } + + break; + + case 17: + /* repeat code length 0 for 3-10 times (read 3 bits) */ + for (length = tinf_read_bits(d, 3, 3); length; --length) { + lengths[num++] = 0; + } + + break; + + case 18: + /* repeat code length 0 for 11-138 times (read 7 bits) */ + for (length = tinf_read_bits(d, 7, 11); length; --length) { + lengths[num++] = 0; + } + + break; + + default: + /* values 0-15 represent the actual code lengths */ + lengths[num++] = sym; + break; + } + } + /* build dynamic trees */ + + + tinf_build_tree(lt, lengths, 0, hlit); + tinf_build_tree(dt, lengths, hlit, hdist); +} +/* ----------------------------- * + * -- block inflate functions -- * + * ----------------------------- */ + +/* given a stream and two trees, inflate a block of data */ + + +function tinf_inflate_block_data(d, lt, dt) { + while (1) { + var sym = tinf_decode_symbol(d, lt); + /* check for end of block */ + + if (sym === 256) { + return TINF_OK; + } + + if (sym < 256) { + d.dest[d.destLen++] = sym; + } else { + var length, dist, offs; + var i; + sym -= 257; + /* possibly get more bits from length code */ + + length = tinf_read_bits(d, length_bits[sym], length_base[sym]); + dist = tinf_decode_symbol(d, dt); + /* possibly get more bits from distance code */ + + offs = d.destLen - tinf_read_bits(d, dist_bits[dist], dist_base[dist]); + /* copy match */ + + for (i = offs; i < offs + length; ++i) { + d.dest[d.destLen++] = d.dest[i]; + } + } + } +} +/* inflate an uncompressed block of data */ + + +function tinf_inflate_uncompressed_block(d) { + var length, invlength; + var i; + /* unread from bitbuffer */ + + while (d.bitcount > 8) { + d.sourceIndex--; + d.bitcount -= 8; + } + /* get length */ + + + length = d.source[d.sourceIndex + 1]; + length = 256 * length + d.source[d.sourceIndex]; + /* get one's complement of length */ + + invlength = d.source[d.sourceIndex + 3]; + invlength = 256 * invlength + d.source[d.sourceIndex + 2]; + /* check length */ + + if (length !== (~invlength & 0x0000ffff)) return TINF_DATA_ERROR; + d.sourceIndex += 4; + /* copy block */ + + for (i = length; i; --i) { + d.dest[d.destLen++] = d.source[d.sourceIndex++]; + } + /* make sure we start next block on a byte boundary */ + + + d.bitcount = 0; + return TINF_OK; +} +/* inflate stream from source to dest */ + + +function tinf_uncompress(source, dest) { + var d = new Data(source, dest); + var bfinal, btype, res; + + do { + /* read final block flag */ + bfinal = tinf_getbit(d); + /* read block type (2 bits) */ + + btype = tinf_read_bits(d, 2, 0); + /* decompress block */ + + switch (btype) { + case 0: + /* decompress uncompressed block */ + res = tinf_inflate_uncompressed_block(d); + break; + + case 1: + /* decompress block with fixed huffman trees */ + res = tinf_inflate_block_data(d, sltree, sdtree); + break; + + case 2: + /* decompress block with dynamic huffman trees */ + tinf_decode_trees(d, d.ltree, d.dtree); + res = tinf_inflate_block_data(d, d.ltree, d.dtree); + break; + + default: + res = TINF_DATA_ERROR; + } + + if (res !== TINF_OK) throw new Error('Data error'); + } while (!bfinal); + + if (d.destLen < d.dest.length) { + if (typeof d.dest.slice === 'function') return d.dest.slice(0, d.destLen);else return d.dest.subarray(0, d.destLen); + } + + return d.dest; +} +/* -------------------- * + * -- initialization -- * + * -------------------- */ + +/* build fixed huffman trees */ + + +tinf_build_fixed_trees(sltree, sdtree); +/* build extra bits and base tables */ + +tinf_build_bits_base(length_bits, length_base, 4, 3); +tinf_build_bits_base(dist_bits, dist_base, 2, 1); +/* fix a special case */ + +length_bits[28] = 0; +length_base[28] = 258; +var tinyInflate = tinf_uncompress; + +var UnicodeTrie, inflate; +inflate = tinyInflate; + +UnicodeTrie = function () { + var DATA_BLOCK_LENGTH, DATA_GRANULARITY, DATA_MASK, INDEX_1_OFFSET, INDEX_2_BLOCK_LENGTH, INDEX_2_BMP_LENGTH, INDEX_2_MASK, INDEX_SHIFT, LSCP_INDEX_2_LENGTH, LSCP_INDEX_2_OFFSET, OMITTED_BMP_INDEX_1_LENGTH, SHIFT_1, SHIFT_1_2, SHIFT_2, UTF8_2B_INDEX_2_LENGTH, UTF8_2B_INDEX_2_OFFSET; + SHIFT_1 = 6 + 5; + SHIFT_2 = 5; + SHIFT_1_2 = SHIFT_1 - SHIFT_2; + OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> SHIFT_1; + INDEX_2_BLOCK_LENGTH = 1 << SHIFT_1_2; + INDEX_2_MASK = INDEX_2_BLOCK_LENGTH - 1; + INDEX_SHIFT = 2; + DATA_BLOCK_LENGTH = 1 << SHIFT_2; + DATA_MASK = DATA_BLOCK_LENGTH - 1; + LSCP_INDEX_2_OFFSET = 0x10000 >> SHIFT_2; + LSCP_INDEX_2_LENGTH = 0x400 >> SHIFT_2; + INDEX_2_BMP_LENGTH = LSCP_INDEX_2_OFFSET + LSCP_INDEX_2_LENGTH; + UTF8_2B_INDEX_2_OFFSET = INDEX_2_BMP_LENGTH; + UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; + INDEX_1_OFFSET = UTF8_2B_INDEX_2_OFFSET + UTF8_2B_INDEX_2_LENGTH; + DATA_GRANULARITY = 1 << INDEX_SHIFT; + + function UnicodeTrie(data) { + var isBuffer, uncompressedLength, view; + isBuffer = typeof data.readUInt32BE === 'function' && typeof data.slice === 'function'; + + if (isBuffer || data instanceof Uint8Array) { + if (isBuffer) { + this.highStart = data.readUInt32BE(0); + this.errorValue = data.readUInt32BE(4); + uncompressedLength = data.readUInt32BE(8); + data = data.slice(12); + } else { + view = new DataView(data.buffer); + this.highStart = view.getUint32(0); + this.errorValue = view.getUint32(4); + uncompressedLength = view.getUint32(8); + data = data.subarray(12); + } + + data = inflate(data, new Uint8Array(uncompressedLength)); + data = inflate(data, new Uint8Array(uncompressedLength)); + this.data = new Uint32Array(data.buffer); + } else { + this.data = data.data, this.highStart = data.highStart, this.errorValue = data.errorValue; + } + } + + UnicodeTrie.prototype.get = function (codePoint) { + var index; + + if (codePoint < 0 || codePoint > 0x10ffff) { + return this.errorValue; + } + + if (codePoint < 0xd800 || codePoint > 0xdbff && codePoint <= 0xffff) { + index = (this.data[codePoint >> SHIFT_2] << INDEX_SHIFT) + (codePoint & DATA_MASK); + return this.data[index]; + } + + if (codePoint <= 0xffff) { + index = (this.data[LSCP_INDEX_2_OFFSET + (codePoint - 0xd800 >> SHIFT_2)] << INDEX_SHIFT) + (codePoint & DATA_MASK); + return this.data[index]; + } + + if (codePoint < this.highStart) { + index = this.data[INDEX_1_OFFSET - OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> SHIFT_1)]; + index = this.data[index + (codePoint >> SHIFT_2 & INDEX_2_MASK)]; + index = (index << INDEX_SHIFT) + (codePoint & DATA_MASK); + return this.data[index]; + } + + return this.data[this.data.length - DATA_GRANULARITY]; + }; + + return UnicodeTrie; +}(); + +var unicodeTrie = UnicodeTrie; + +var base64Arraybuffer = createCommonjsModule(function (module, exports) { + /* + * base64-arraybuffer + * https://github.com/niklasvh/base64-arraybuffer + * + * Copyright (c) 2012 Niklas von Hertzen + * Licensed under the MIT license. + */ + (function () { + + var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // Use a lookup table to find the index. + + var lookup = new Uint8Array(256); + + for (var i = 0; i < chars.length; i++) { + lookup[chars.charCodeAt(i)] = i; + } + + exports.encode = function (arraybuffer) { + var bytes = new Uint8Array(arraybuffer), + i, + len = bytes.length, + base64 = ""; + + for (i = 0; i < len; i += 3) { + base64 += chars[bytes[i] >> 2]; + base64 += chars[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4]; + base64 += chars[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6]; + base64 += chars[bytes[i + 2] & 63]; + } + + if (len % 3 === 2) { + base64 = base64.substring(0, base64.length - 1) + "="; + } else if (len % 3 === 1) { + base64 = base64.substring(0, base64.length - 2) + "=="; + } + + return base64; + }; + + exports.decode = function (base64) { + var bufferLength = base64.length * 0.75, + len = base64.length, + i, + p = 0, + encoded1, + encoded2, + encoded3, + encoded4; + + if (base64[base64.length - 1] === "=") { + bufferLength--; + + if (base64[base64.length - 2] === "=") { + bufferLength--; + } + } + + var arraybuffer = new ArrayBuffer(bufferLength), + bytes = new Uint8Array(arraybuffer); + + for (i = 0; i < len; i += 4) { + encoded1 = lookup[base64.charCodeAt(i)]; + encoded2 = lookup[base64.charCodeAt(i + 1)]; + encoded3 = lookup[base64.charCodeAt(i + 2)]; + encoded4 = lookup[base64.charCodeAt(i + 3)]; + bytes[p++] = encoded1 << 2 | encoded2 >> 4; + bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2; + bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63; + } + + return arraybuffer; + }; + })(); +}); +var base64Arraybuffer_1 = base64Arraybuffer.encode; +var base64Arraybuffer_2 = base64Arraybuffer.decode; + +var base64DeflatedData = "eJxtVtty4zYM/Rc/70Ni97LbN1tJ49SXeGI3O93OjgayGBERRXoo0h5Np/9eAKTcpNOHECAFAgfAAZ2/JkcIqnEeVT/55c9JcZx8mnzradk5Wva83clW8bZjraZly8s68lnLZ2y3Nrzla2tedkhL8crGsmVtHXhhLxvLCzvd8N0t3/0my4mvccjCTb5/mhxdV6FF2xQG+j6h3LpQPivna+UVA5lX7qxGWT5joznOQhl34dMQ4KhVXX78fD0e7Z7OyhsYSHt0Acp9rPqjxxPb3rlYGXW1zNsxrBz/61eirNUrb4qiuL3J8jbLaZazLH/I8scsf8ry5yw/Z/klyWn2N83+ptnfNPubZn/T7G+W7WfZfjbaZ//T7H+a/c+yn1n2Mxv9MK5tbAOQfEEPHaQPn7PhlzHBmzGzmzGFaw4j2Nsx2u0I71ZwfezVtba5mlmswEL54vBIrMjYGVtqAFEmtS3x2XWdY6qtISDLhTu5zr0yIx+tVh6DMOjBK9UK504BmZDF4NEYUee+UxaBby9V5ZVwykMlH/dkB6wcNBAsLlErk0PlIedyawO2BrG+U2cyauiLpGYbMKw9RN/FVif1DTxhZT56HNjhATrkyTgoE5uY8rdQg3gmwtIfT9QerSY1QUFJmYEcsFIZxgCWQHEQmp0mZwS2iez9Pmh0p5Q71cW1istfENyaLLkfHhu0wLZPjZaQz9HKhQOlZFyT3EXrOO4iaqzTtwrshXGtdKc4/MbZxpkUf41dFcUMqctcPnUpZROl/ZFiql5li0OKu6Cy5dN9pNpmfQEBWqHJ6ag54JMpC42tFNsD9ZOtHgxw9NTmA75STo1O0HklYjepkSt2l9Q/pJ7YM9IXKe4CuihVH4wLWG6hkZ7uNDR9uQNhQPTQ6+CTrwF0uWaTZ/UGwtvf4DwiL1JenOILKub4RqmgsNzAILy00RiBYBX4csHqcEwVLIhNojyZunwMkEj74Kifx3y6U76Tze9MvfD+vE937wiHl8B7Defsr+/ACgPvTQV9DhaP0Ash6MyOPRRUcxmbk0fHfh67E00XmHLOL4WE3IHpBq+stBkqKq/KHKQiWameo0nLea2HOikbYiODLpdIWmOGk+7fHxeRspDHYqXBOyq5TBInuHcx6FKG9VqirfMfzmg6keiSoMzPqk/T8mjTM4KOOE8dpUv4vx+0oYIx+B5MUP7dCUc7RN9e672Mthm7RYTUHQo1MAHeO0+/Oo7qlp41DW2XhlwDUQZTc3ya/JV2b0LsTTQhfVzpWMOFxlXeM7BBZuCAXkd5s/dY14lnGydGB2iFtHPt+PQr+bZNWaC8PjuIpNpyCUz6IlqFr86z3X0zUPZEgY/9mFsIMtX/7ZOX54B+vOnRBi2uNVx0uaSXmRPdoDxUd/Fk3CC12WNjvzJR03dla1WusIU2Ir/vCi7yX4DQiCMzeOYR/f06+f73P0+ms+k="; + +var base64DeflatedTrie = "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"; + +// we may be running in a browser so we make an Uint8Array + +var data = JSON.parse(String.fromCharCode.apply(String, pako__WEBPACK_IMPORTED_MODULE_0___default().inflate(base64Arraybuffer_2(base64DeflatedData)))); +var trieData = pako__WEBPACK_IMPORTED_MODULE_0___default().inflate(base64Arraybuffer_2(base64DeflatedTrie)); +var trie = new unicodeTrie(trieData); + +var log2 = Math.log2 || function (n) { + return Math.log(n) / Math.LN2; +}; + +var bits = function bits(n) { + return log2(n) + 1 | 0; +}; // compute the number of bits stored for each field + + +var CATEGORY_BITS = bits(data.categories.length - 1); +var COMBINING_BITS = bits(data.combiningClasses.length - 1); +var SCRIPT_BITS = bits(data.scripts.length - 1); +var EAW_BITS = bits(data.eaw.length - 1); +var NUMBER_BITS = 10; // compute shift and mask values for each field + +var CATEGORY_SHIFT = COMBINING_BITS + SCRIPT_BITS + EAW_BITS + NUMBER_BITS; +var COMBINING_SHIFT = SCRIPT_BITS + EAW_BITS + NUMBER_BITS; +var SCRIPT_SHIFT = EAW_BITS + NUMBER_BITS; +var EAW_SHIFT = NUMBER_BITS; +var CATEGORY_MASK = (1 << CATEGORY_BITS) - 1; +var COMBINING_MASK = (1 << COMBINING_BITS) - 1; +var SCRIPT_MASK = (1 << SCRIPT_BITS) - 1; +var EAW_MASK = (1 << EAW_BITS) - 1; +var NUMBER_MASK = (1 << NUMBER_BITS) - 1; +var getCategory = function getCategory(codePoint) { + var val = trie.get(codePoint); + return data.categories[val >> CATEGORY_SHIFT & CATEGORY_MASK]; +}; +var getCombiningClass = function getCombiningClass(codePoint) { + var val = trie.get(codePoint); + return data.combiningClasses[val >> COMBINING_SHIFT & COMBINING_MASK]; +}; +var getScript = function getScript(codePoint) { + var val = trie.get(codePoint); + return data.scripts[val >> SCRIPT_SHIFT & SCRIPT_MASK]; +}; +var getEastAsianWidth = function getEastAsianWidth(codePoint) { + var val = trie.get(codePoint); + return data.eaw[val >> EAW_SHIFT & EAW_MASK]; +}; +var getNumericValue = function getNumericValue(codePoint) { + var val = trie.get(codePoint); + var num = val & NUMBER_MASK; + + if (num === 0) { + return null; + } else if (num <= 50) { + return num - 1; + } else if (num < 0x1e0) { + var numerator = (num >> 4) - 12; + var denominator = (num & 0xf) + 1; + return numerator / denominator; + } else if (num < 0x300) { + val = (num >> 5) - 14; + var exp = (num & 0x1f) + 2; + + while (exp > 0) { + val *= 10; + exp--; + } + + return val; + } else { + val = (num >> 2) - 0xbf; + + var _exp = (num & 3) + 1; + + while (_exp > 0) { + val *= 60; + _exp--; + } + + return val; + } +}; +var isAlphabetic = function isAlphabetic(codePoint) { + var category = getCategory(codePoint); + return category === 'Lu' || category === 'Ll' || category === 'Lt' || category === 'Lm' || category === 'Lo' || category === 'Nl'; +}; +var isDigit = function isDigit(codePoint) { + return getCategory(codePoint) === 'Nd'; +}; +var isPunctuation = function isPunctuation(codePoint) { + var category = getCategory(codePoint); + return category === 'Pc' || category === 'Pd' || category === 'Pe' || category === 'Pf' || category === 'Pi' || category === 'Po' || category === 'Ps'; +}; +var isLowerCase = function isLowerCase(codePoint) { + return getCategory(codePoint) === 'Ll'; +}; +var isUpperCase = function isUpperCase(codePoint) { + return getCategory(codePoint) === 'Lu'; +}; +var isTitleCase = function isTitleCase(codePoint) { + return getCategory(codePoint) === 'Lt'; +}; +var isWhiteSpace = function isWhiteSpace(codePoint) { + var category = getCategory(codePoint); + return category === 'Zs' || category === 'Zl' || category === 'Zp'; +}; +var isBaseForm = function isBaseForm(codePoint) { + var category = getCategory(codePoint); + return category === 'Nd' || category === 'No' || category === 'Nl' || category === 'Lu' || category === 'Ll' || category === 'Lt' || category === 'Lm' || category === 'Lo' || category === 'Me' || category === 'Mc'; +}; +var isMark = function isMark(codePoint) { + var category = getCategory(codePoint); + return category === 'Mn' || category === 'Me' || category === 'Mc'; +}; +var unicode = { + getCategory: getCategory, + getCombiningClass: getCombiningClass, + getScript: getScript, + getEastAsianWidth: getEastAsianWidth, + getNumericValue: getNumericValue, + isAlphabetic: isAlphabetic, + isDigit: isDigit, + isPunctuation: isPunctuation, + isLowerCase: isLowerCase, + isUpperCase: isUpperCase, + isTitleCase: isTitleCase, + isWhiteSpace: isWhiteSpace, + isBaseForm: isBaseForm, + isMark: isMark +}; + +/** + * This class is used when GPOS does not define 'mark' or 'mkmk' features + * for positioning marks relative to base glyphs. It uses the unicode + * combining class property to position marks. + * + * Based on code from Harfbuzz, thanks! + * https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-fallback.cc + */ + +var UnicodeLayoutEngine = /*#__PURE__*/function () { + function UnicodeLayoutEngine(font) { + this.font = font; + } + + var _proto = UnicodeLayoutEngine.prototype; + + _proto.positionGlyphs = function positionGlyphs(glyphs, positions) { + // find each base + mark cluster, and position the marks relative to the base + var clusterStart = 0; + var clusterEnd = 0; + + for (var index = 0; index < glyphs.length; index++) { + var glyph = glyphs[index]; + + if (glyph.isMark) { + // TODO: handle ligatures + clusterEnd = index; + } else { + if (clusterStart !== clusterEnd) { + this.positionCluster(glyphs, positions, clusterStart, clusterEnd); + } + + clusterStart = clusterEnd = index; + } + } + + if (clusterStart !== clusterEnd) { + this.positionCluster(glyphs, positions, clusterStart, clusterEnd); + } + + return positions; + }; + + _proto.positionCluster = function positionCluster(glyphs, positions, clusterStart, clusterEnd) { + var base = glyphs[clusterStart]; + var baseBox = base.cbox.copy(); // adjust bounding box for ligature glyphs + + if (base.codePoints.length > 1) { + // LTR. TODO: RTL support. + baseBox.minX += (base.codePoints.length - 1) * baseBox.width / base.codePoints.length; + } + + var xOffset = -positions[clusterStart].xAdvance; + var yOffset = 0; + var yGap = this.font.unitsPerEm / 16; // position each of the mark glyphs relative to the base glyph + + for (var index = clusterStart + 1; index <= clusterEnd; index++) { + var mark = glyphs[index]; + var markBox = mark.cbox; + var position = positions[index]; + var combiningClass = this.getCombiningClass(mark.codePoints[0]); + + if (combiningClass !== 'Not_Reordered') { + position.xOffset = position.yOffset = 0; // x positioning + + switch (combiningClass) { + case 'Double_Above': + case 'Double_Below': + // LTR. TODO: RTL support. + position.xOffset += baseBox.minX - markBox.width / 2 - markBox.minX; + break; + + case 'Attached_Below_Left': + case 'Below_Left': + case 'Above_Left': + // left align + position.xOffset += baseBox.minX - markBox.minX; + break; + + case 'Attached_Above_Right': + case 'Below_Right': + case 'Above_Right': + // right align + position.xOffset += baseBox.maxX - markBox.width - markBox.minX; + break; + + default: + // Attached_Below, Attached_Above, Below, Above, other + // center align + position.xOffset += baseBox.minX + (baseBox.width - markBox.width) / 2 - markBox.minX; + } // y positioning + + + switch (combiningClass) { + case 'Double_Below': + case 'Below_Left': + case 'Below': + case 'Below_Right': + case 'Attached_Below_Left': + case 'Attached_Below': + // add a small gap between the glyphs if they are not attached + if (combiningClass === 'Attached_Below_Left' || combiningClass === 'Attached_Below') { + baseBox.minY += yGap; + } + + position.yOffset = -baseBox.minY - markBox.maxY; + baseBox.minY += markBox.height; + break; + + case 'Double_Above': + case 'Above_Left': + case 'Above': + case 'Above_Right': + case 'Attached_Above': + case 'Attached_Above_Right': + // add a small gap between the glyphs if they are not attached + if (combiningClass === 'Attached_Above' || combiningClass === 'Attached_Above_Right') { + baseBox.maxY += yGap; + } + + position.yOffset = baseBox.maxY - markBox.minY; + baseBox.maxY += markBox.height; + break; + } + + position.xAdvance = position.yAdvance = 0; + position.xOffset += xOffset; + position.yOffset += yOffset; + } else { + xOffset -= position.xAdvance; + yOffset -= position.yAdvance; + } + } + + return; + }; + + _proto.getCombiningClass = function getCombiningClass(codePoint) { + var combiningClass = unicode.getCombiningClass(codePoint); // Thai / Lao need some per-character work + + if ((codePoint & ~0xff) === 0x0e00) { + if (combiningClass === 'Not_Reordered') { + switch (codePoint) { + case 0x0e31: + case 0x0e34: + case 0x0e35: + case 0x0e36: + case 0x0e37: + case 0x0e47: + case 0x0e4c: + case 0x0e3d: + case 0x0e4e: + return 'Above_Right'; + + case 0x0eb1: + case 0x0eb4: + case 0x0eb5: + case 0x0eb6: + case 0x0eb7: + case 0x0ebb: + case 0x0ecc: + case 0x0ecd: + return 'Above'; + + case 0x0ebc: + return 'Below'; + } + } else if (codePoint === 0x0e3a) { + // virama + return 'Below_Right'; + } + } + + switch (combiningClass) { + // Hebrew + case 'CCC10': // sheva + + case 'CCC11': // hataf segol + + case 'CCC12': // hataf patah + + case 'CCC13': // hataf qamats + + case 'CCC14': // hiriq + + case 'CCC15': // tsere + + case 'CCC16': // segol + + case 'CCC17': // patah + + case 'CCC18': // qamats + + case 'CCC20': // qubuts + + case 'CCC22': + // meteg + return 'Below'; + + case 'CCC23': + // rafe + return 'Attached_Above'; + + case 'CCC24': + // shin dot + return 'Above_Right'; + + case 'CCC25': // sin dot + + case 'CCC19': + // holam + return 'Above_Left'; + + case 'CCC26': + // point varika + return 'Above'; + + case 'CCC21': + // dagesh + break; + // Arabic and Syriac + + case 'CCC27': // fathatan + + case 'CCC28': // dammatan + + case 'CCC30': // fatha + + case 'CCC31': // damma + + case 'CCC33': // shadda + + case 'CCC34': // sukun + + case 'CCC35': // superscript alef + + case 'CCC36': + // superscript alaph + return 'Above'; + + case 'CCC29': // kasratan + + case 'CCC32': + // kasra + return 'Below'; + // Thai + + case 'CCC103': + // sara u / sara uu + return 'Below_Right'; + + case 'CCC107': + // mai + return 'Above_Right'; + // Lao + + case 'CCC118': + // sign u / sign uu + return 'Below'; + + case 'CCC122': + // mai + return 'Above'; + // Tibetan + + case 'CCC129': // sign aa + + case 'CCC132': + // sign u + return 'Below'; + + case 'CCC130': + // sign i + return 'Above'; + } + + return combiningClass; + }; + + return UnicodeLayoutEngine; +}(); + +function _defineProperties$1(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass$1(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$1(Constructor.prototype, protoProps); if (staticProps) _defineProperties$1(Constructor, staticProps); return Constructor; } + +/** + * Represents a glyph bounding box + */ +var BBox = /*#__PURE__*/function () { + function BBox(minX, minY, maxX, maxY) { + if (minX === void 0) { + minX = Infinity; + } + + if (minY === void 0) { + minY = Infinity; + } + + if (maxX === void 0) { + maxX = -Infinity; + } + + if (maxY === void 0) { + maxY = -Infinity; + } + + /** + * The minimum X position in the bounding box + * @type {number} + */ + this.minX = minX; + /** + * The minimum Y position in the bounding box + * @type {number} + */ + + this.minY = minY; + /** + * The maxmimum X position in the bounding box + * @type {number} + */ + + this.maxX = maxX; + /** + * The maxmimum Y position in the bounding box + * @type {number} + */ + + this.maxY = maxY; + } + /** + * The width of the bounding box + * @type {number} + */ + + + var _proto = BBox.prototype; + + _proto.addPoint = function addPoint(x, y) { + if (Math.abs(x) !== Infinity) { + if (x < this.minX) { + this.minX = x; + } + + if (x > this.maxX) { + this.maxX = x; + } + } + + if (Math.abs(y) !== Infinity) { + if (y < this.minY) { + this.minY = y; + } + + if (y > this.maxY) { + this.maxY = y; + } + } + }; + + _proto.copy = function copy() { + return new BBox(this.minX, this.minY, this.maxX, this.maxY); + }; + + _createClass$1(BBox, [{ + key: "width", + get: function get() { + return this.maxX - this.minX; + } + /** + * The height of the bounding box + * @type {number} + */ + + }, { + key: "height", + get: function get() { + return this.maxY - this.minY; + } + }]); + + return BBox; +}(); + +function _createForOfIteratorHelperLoose$6(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$6(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$6(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$6(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$6(o, minLen); } + +function _arrayLikeToArray$6(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +// Data from http://www.microsoft.com/typography/otspec/scripttags.htm +// and http://www.unicode.org/Public/UNIDATA/PropertyValueAliases.txt. + +var UNICODE_SCRIPTS = { + Caucasian_Albanian: 'aghb', + Arabic: 'arab', + Imperial_Aramaic: 'armi', + Armenian: 'armn', + Avestan: 'avst', + Balinese: 'bali', + Bamum: 'bamu', + Bassa_Vah: 'bass', + Batak: 'batk', + Bengali: ['bng2', 'beng'], + Bopomofo: 'bopo', + Brahmi: 'brah', + Braille: 'brai', + Buginese: 'bugi', + Buhid: 'buhd', + Chakma: 'cakm', + Canadian_Aboriginal: 'cans', + Carian: 'cari', + Cham: 'cham', + Cherokee: 'cher', + Coptic: 'copt', + Cypriot: 'cprt', + Cyrillic: 'cyrl', + Devanagari: ['dev2', 'deva'], + Deseret: 'dsrt', + Duployan: 'dupl', + Egyptian_Hieroglyphs: 'egyp', + Elbasan: 'elba', + Ethiopic: 'ethi', + Georgian: 'geor', + Glagolitic: 'glag', + Gothic: 'goth', + Grantha: 'gran', + Greek: 'grek', + Gujarati: ['gjr2', 'gujr'], + Gurmukhi: ['gur2', 'guru'], + Hangul: 'hang', + Han: 'hani', + Hanunoo: 'hano', + Hebrew: 'hebr', + Hiragana: 'hira', + Pahawh_Hmong: 'hmng', + Katakana_Or_Hiragana: 'hrkt', + Old_Italic: 'ital', + Javanese: 'java', + Kayah_Li: 'kali', + Katakana: 'kana', + Kharoshthi: 'khar', + Khmer: 'khmr', + Khojki: 'khoj', + Kannada: ['knd2', 'knda'], + Kaithi: 'kthi', + Tai_Tham: 'lana', + Lao: 'lao ', + Latin: 'latn', + Lepcha: 'lepc', + Limbu: 'limb', + Linear_A: 'lina', + Linear_B: 'linb', + Lisu: 'lisu', + Lycian: 'lyci', + Lydian: 'lydi', + Mahajani: 'mahj', + Mandaic: 'mand', + Manichaean: 'mani', + Mende_Kikakui: 'mend', + Meroitic_Cursive: 'merc', + Meroitic_Hieroglyphs: 'mero', + Malayalam: ['mlm2', 'mlym'], + Modi: 'modi', + Mongolian: 'mong', + Mro: 'mroo', + Meetei_Mayek: 'mtei', + Myanmar: ['mym2', 'mymr'], + Old_North_Arabian: 'narb', + Nabataean: 'nbat', + Nko: 'nko ', + Ogham: 'ogam', + Ol_Chiki: 'olck', + Old_Turkic: 'orkh', + Oriya: ['ory2', 'orya'], + Osmanya: 'osma', + Palmyrene: 'palm', + Pau_Cin_Hau: 'pauc', + Old_Permic: 'perm', + Phags_Pa: 'phag', + Inscriptional_Pahlavi: 'phli', + Psalter_Pahlavi: 'phlp', + Phoenician: 'phnx', + Miao: 'plrd', + Inscriptional_Parthian: 'prti', + Rejang: 'rjng', + Runic: 'runr', + Samaritan: 'samr', + Old_South_Arabian: 'sarb', + Saurashtra: 'saur', + Shavian: 'shaw', + Sharada: 'shrd', + Siddham: 'sidd', + Khudawadi: 'sind', + Sinhala: 'sinh', + Sora_Sompeng: 'sora', + Sundanese: 'sund', + Syloti_Nagri: 'sylo', + Syriac: 'syrc', + Tagbanwa: 'tagb', + Takri: 'takr', + Tai_Le: 'tale', + New_Tai_Lue: 'talu', + Tamil: ['tml2', 'taml'], + Tai_Viet: 'tavt', + Telugu: ['tel2', 'telu'], + Tifinagh: 'tfng', + Tagalog: 'tglg', + Thaana: 'thaa', + Thai: 'thai', + Tibetan: 'tibt', + Tirhuta: 'tirh', + Ugaritic: 'ugar', + Vai: 'vai ', + Warang_Citi: 'wara', + Old_Persian: 'xpeo', + Cuneiform: 'xsux', + Yi: 'yi ', + Inherited: 'zinh', + Common: 'zyyy', + Unknown: 'zzzz' +}; +var OPENTYPE_SCRIPTS = {}; + +for (var script in UNICODE_SCRIPTS) { + var tag = UNICODE_SCRIPTS[script]; + + if (Array.isArray(tag)) { + for (var _iterator = _createForOfIteratorHelperLoose$6(tag), _step; !(_step = _iterator()).done;) { + var t = _step.value; + OPENTYPE_SCRIPTS[t] = script; + } + } else { + OPENTYPE_SCRIPTS[tag] = script; + } +} +function fromOpenType(tag) { + return OPENTYPE_SCRIPTS[tag]; +} +function forString(string) { + var len = string.length; + var idx = 0; + + while (idx < len) { + var code = string.charCodeAt(idx++); // Check if this is a high surrogate + + if (0xd800 <= code && code <= 0xdbff && idx < len) { + var next = string.charCodeAt(idx); // Check if this is a low surrogate + + if (0xdc00 <= next && next <= 0xdfff) { + idx++; + code = ((code & 0x3FF) << 10) + (next & 0x3FF) + 0x10000; + } + } + + var _script = unicode.getScript(code); + + if (_script !== 'Common' && _script !== 'Inherited' && _script !== 'Unknown') { + return UNICODE_SCRIPTS[_script]; + } + } + + return UNICODE_SCRIPTS.Unknown; +} +function forCodePoints(codePoints) { + for (var i = 0; i < codePoints.length; i++) { + var codePoint = codePoints[i]; + + var _script2 = unicode.getScript(codePoint); + + if (_script2 !== 'Common' && _script2 !== 'Inherited' && _script2 !== 'Unknown') { + return UNICODE_SCRIPTS[_script2]; + } + } + + return UNICODE_SCRIPTS.Unknown; +} // The scripts in this map are written from right to left + +var RTL = { + arab: true, + // Arabic + hebr: true, + // Hebrew + syrc: true, + // Syriac + thaa: true, + // Thaana + cprt: true, + // Cypriot Syllabary + khar: true, + // Kharosthi + phnx: true, + // Phoenician + 'nko ': true, + // N'Ko + lydi: true, + // Lydian + avst: true, + // Avestan + armi: true, + // Imperial Aramaic + phli: true, + // Inscriptional Pahlavi + prti: true, + // Inscriptional Parthian + sarb: true, + // Old South Arabian + orkh: true, + // Old Turkic, Orkhon Runic + samr: true, + // Samaritan + mand: true, + // Mandaic, Mandaean + merc: true, + // Meroitic Cursive + mero: true, + // Meroitic Hieroglyphs + // Unicode 7.0 (not listed on http://www.microsoft.com/typography/otspec/scripttags.htm) + mani: true, + // Manichaean + mend: true, + // Mende Kikakui + nbat: true, + // Nabataean + narb: true, + // Old North Arabian + palm: true, + // Palmyrene + phlp: true // Psalter Pahlavi + +}; +function direction(script) { + if (RTL[script]) { + return 'rtl'; + } + + return 'ltr'; +} + +function _createForOfIteratorHelperLoose$7(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$7(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$7(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$7(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$7(o, minLen); } + +function _arrayLikeToArray$7(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _defineProperties$2(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass$2(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$2(Constructor.prototype, protoProps); if (staticProps) _defineProperties$2(Constructor, staticProps); return Constructor; } +/** + * Represents a run of Glyph and GlyphPosition objects. + * Returned by the font layout method. + */ + +var GlyphRun = /*#__PURE__*/function () { + function GlyphRun(glyphs, features, script, language, direction$1) { + /** + * An array of Glyph objects in the run + * @type {Glyph[]} + */ + this.glyphs = glyphs; + /** + * An array of GlyphPosition objects for each glyph in the run + * @type {GlyphPosition[]} + */ + + this.positions = null; + /** + * The script that was requested for shaping. This was either passed in or detected automatically. + * @type {string} + */ + + this.script = script; + /** + * The language requested for shaping, as passed in. If `null`, the default language for the + * script was used. + * @type {string} + */ + + this.language = language || null; + /** + * The direction requested for shaping, as passed in (either ltr or rtl). + * If `null`, the default direction of the script is used. + * @type {string} + */ + + this.direction = direction$1 || direction(script); + /** + * The features requested during shaping. This is a combination of user + * specified features and features chosen by the shaper. + * @type {object} + */ + + this.features = {}; // Convert features to an object + + if (Array.isArray(features)) { + for (var _iterator = _createForOfIteratorHelperLoose$7(features), _step; !(_step = _iterator()).done;) { + var tag = _step.value; + this.features[tag] = true; + } + } else if (typeof features === 'object') { + this.features = features; + } + } + /** + * The total advance width of the run. + * @type {number} + */ + + + _createClass$2(GlyphRun, [{ + key: "advanceWidth", + get: function get() { + var width = 0; + + for (var _iterator2 = _createForOfIteratorHelperLoose$7(this.positions), _step2; !(_step2 = _iterator2()).done;) { + var position = _step2.value; + width += position.xAdvance; + } + + return width; + } + /** + * The total advance height of the run. + * @type {number} + */ + + }, { + key: "advanceHeight", + get: function get() { + var height = 0; + + for (var _iterator3 = _createForOfIteratorHelperLoose$7(this.positions), _step3; !(_step3 = _iterator3()).done;) { + var position = _step3.value; + height += position.yAdvance; + } + + return height; + } + /** + * The bounding box containing all glyphs in the run. + * @type {BBox} + */ + + }, { + key: "bbox", + get: function get() { + var bbox = new BBox(); + var x = 0; + var y = 0; + + for (var index = 0; index < this.glyphs.length; index++) { + var glyph = this.glyphs[index]; + var p = this.positions[index]; + var b = glyph.bbox; + bbox.addPoint(b.minX + x + p.xOffset, b.minY + y + p.yOffset); + bbox.addPoint(b.maxX + x + p.xOffset, b.maxY + y + p.yOffset); + x += p.xAdvance; + y += p.yAdvance; + } + + return bbox; + } + }]); + + return GlyphRun; +}(); + +/** + * Represents positioning information for a glyph in a GlyphRun. + */ +var GlyphPosition = function GlyphPosition(xAdvance, yAdvance, xOffset, yOffset) { + if (xAdvance === void 0) { + xAdvance = 0; + } + + if (yAdvance === void 0) { + yAdvance = 0; + } + + if (xOffset === void 0) { + xOffset = 0; + } + + if (yOffset === void 0) { + yOffset = 0; + } + + /** + * The amount to move the virtual pen in the X direction after rendering this glyph. + * @type {number} + */ + this.xAdvance = xAdvance; + /** + * The amount to move the virtual pen in the Y direction after rendering this glyph. + * @type {number} + */ + + this.yAdvance = yAdvance; + /** + * The offset from the pen position in the X direction at which to render this glyph. + * @type {number} + */ + + this.xOffset = xOffset; + /** + * The offset from the pen position in the Y direction at which to render this glyph. + * @type {number} + */ + + this.yOffset = yOffset; +}; + +// see https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html +// and /System/Library/Frameworks/CoreText.framework/Versions/A/Headers/SFNTLayoutTypes.h on a Mac +var features = { + allTypographicFeatures: { + code: 0, + exclusive: false, + allTypeFeatures: 0 + }, + ligatures: { + code: 1, + exclusive: false, + requiredLigatures: 0, + commonLigatures: 2, + rareLigatures: 4, + // logos: 6 + rebusPictures: 8, + diphthongLigatures: 10, + squaredLigatures: 12, + abbrevSquaredLigatures: 14, + symbolLigatures: 16, + contextualLigatures: 18, + historicalLigatures: 20 + }, + cursiveConnection: { + code: 2, + exclusive: true, + unconnected: 0, + partiallyConnected: 1, + cursive: 2 + }, + letterCase: { + code: 3, + exclusive: true + }, + // upperAndLowerCase: 0 # deprecated + // allCaps: 1 # deprecated + // allLowerCase: 2 # deprecated + // smallCaps: 3 # deprecated + // initialCaps: 4 # deprecated + // initialCapsAndSmallCaps: 5 # deprecated + verticalSubstitution: { + code: 4, + exclusive: false, + substituteVerticalForms: 0 + }, + linguisticRearrangement: { + code: 5, + exclusive: false, + linguisticRearrangement: 0 + }, + numberSpacing: { + code: 6, + exclusive: true, + monospacedNumbers: 0, + proportionalNumbers: 1, + thirdWidthNumbers: 2, + quarterWidthNumbers: 3 + }, + smartSwash: { + code: 8, + exclusive: false, + wordInitialSwashes: 0, + wordFinalSwashes: 2, + // lineInitialSwashes: 4 + // lineFinalSwashes: 6 + nonFinalSwashes: 8 + }, + diacritics: { + code: 9, + exclusive: true, + showDiacritics: 0, + hideDiacritics: 1, + decomposeDiacritics: 2 + }, + verticalPosition: { + code: 10, + exclusive: true, + normalPosition: 0, + superiors: 1, + inferiors: 2, + ordinals: 3, + scientificInferiors: 4 + }, + fractions: { + code: 11, + exclusive: true, + noFractions: 0, + verticalFractions: 1, + diagonalFractions: 2 + }, + overlappingCharacters: { + code: 13, + exclusive: false, + preventOverlap: 0 + }, + typographicExtras: { + code: 14, + exclusive: false, + // hyphensToEmDash: 0 + // hyphenToEnDash: 2 + slashedZero: 4 + }, + // formInterrobang: 6 + // smartQuotes: 8 + // periodsToEllipsis: 10 + mathematicalExtras: { + code: 15, + exclusive: false, + // hyphenToMinus: 0 + // asteristoMultiply: 2 + // slashToDivide: 4 + // inequalityLigatures: 6 + // exponents: 8 + mathematicalGreek: 10 + }, + ornamentSets: { + code: 16, + exclusive: true, + noOrnaments: 0, + dingbats: 1, + piCharacters: 2, + fleurons: 3, + decorativeBorders: 4, + internationalSymbols: 5, + mathSymbols: 6 + }, + characterAlternatives: { + code: 17, + exclusive: true, + noAlternates: 0 + }, + // user defined options + designComplexity: { + code: 18, + exclusive: true, + designLevel1: 0, + designLevel2: 1, + designLevel3: 2, + designLevel4: 3, + designLevel5: 4 + }, + styleOptions: { + code: 19, + exclusive: true, + noStyleOptions: 0, + displayText: 1, + engravedText: 2, + illuminatedCaps: 3, + titlingCaps: 4, + tallCaps: 5 + }, + characterShape: { + code: 20, + exclusive: true, + traditionalCharacters: 0, + simplifiedCharacters: 1, + JIS1978Characters: 2, + JIS1983Characters: 3, + JIS1990Characters: 4, + traditionalAltOne: 5, + traditionalAltTwo: 6, + traditionalAltThree: 7, + traditionalAltFour: 8, + traditionalAltFive: 9, + expertCharacters: 10, + JIS2004Characters: 11, + hojoCharacters: 12, + NLCCharacters: 13, + traditionalNamesCharacters: 14 + }, + numberCase: { + code: 21, + exclusive: true, + lowerCaseNumbers: 0, + upperCaseNumbers: 1 + }, + textSpacing: { + code: 22, + exclusive: true, + proportionalText: 0, + monospacedText: 1, + halfWidthText: 2, + thirdWidthText: 3, + quarterWidthText: 4, + altProportionalText: 5, + altHalfWidthText: 6 + }, + transliteration: { + code: 23, + exclusive: true, + noTransliteration: 0 + }, + // hanjaToHangul: 1 + // hiraganaToKatakana: 2 + // katakanaToHiragana: 3 + // kanaToRomanization: 4 + // romanizationToHiragana: 5 + // romanizationToKatakana: 6 + // hanjaToHangulAltOne: 7 + // hanjaToHangulAltTwo: 8 + // hanjaToHangulAltThree: 9 + annotation: { + code: 24, + exclusive: true, + noAnnotation: 0, + boxAnnotation: 1, + roundedBoxAnnotation: 2, + circleAnnotation: 3, + invertedCircleAnnotation: 4, + parenthesisAnnotation: 5, + periodAnnotation: 6, + romanNumeralAnnotation: 7, + diamondAnnotation: 8, + invertedBoxAnnotation: 9, + invertedRoundedBoxAnnotation: 10 + }, + kanaSpacing: { + code: 25, + exclusive: true, + fullWidthKana: 0, + proportionalKana: 1 + }, + ideographicSpacing: { + code: 26, + exclusive: true, + fullWidthIdeographs: 0, + proportionalIdeographs: 1, + halfWidthIdeographs: 2 + }, + unicodeDecomposition: { + code: 27, + exclusive: false, + canonicalComposition: 0, + compatibilityComposition: 2, + transcodingComposition: 4 + }, + rubyKana: { + code: 28, + exclusive: false, + // noRubyKana: 0 # deprecated - use rubyKanaOff instead + // rubyKana: 1 # deprecated - use rubyKanaOn instead + rubyKana: 2 + }, + CJKSymbolAlternatives: { + code: 29, + exclusive: true, + noCJKSymbolAlternatives: 0, + CJKSymbolAltOne: 1, + CJKSymbolAltTwo: 2, + CJKSymbolAltThree: 3, + CJKSymbolAltFour: 4, + CJKSymbolAltFive: 5 + }, + ideographicAlternatives: { + code: 30, + exclusive: true, + noIdeographicAlternatives: 0, + ideographicAltOne: 1, + ideographicAltTwo: 2, + ideographicAltThree: 3, + ideographicAltFour: 4, + ideographicAltFive: 5 + }, + CJKVerticalRomanPlacement: { + code: 31, + exclusive: true, + CJKVerticalRomanCentered: 0, + CJKVerticalRomanHBaseline: 1 + }, + italicCJKRoman: { + code: 32, + exclusive: false, + // noCJKItalicRoman: 0 # deprecated - use CJKItalicRomanOff instead + // CJKItalicRoman: 1 # deprecated - use CJKItalicRomanOn instead + CJKItalicRoman: 2 + }, + caseSensitiveLayout: { + code: 33, + exclusive: false, + caseSensitiveLayout: 0, + caseSensitiveSpacing: 2 + }, + alternateKana: { + code: 34, + exclusive: false, + alternateHorizKana: 0, + alternateVertKana: 2 + }, + stylisticAlternatives: { + code: 35, + exclusive: false, + noStylisticAlternates: 0, + stylisticAltOne: 2, + stylisticAltTwo: 4, + stylisticAltThree: 6, + stylisticAltFour: 8, + stylisticAltFive: 10, + stylisticAltSix: 12, + stylisticAltSeven: 14, + stylisticAltEight: 16, + stylisticAltNine: 18, + stylisticAltTen: 20, + stylisticAltEleven: 22, + stylisticAltTwelve: 24, + stylisticAltThirteen: 26, + stylisticAltFourteen: 28, + stylisticAltFifteen: 30, + stylisticAltSixteen: 32, + stylisticAltSeventeen: 34, + stylisticAltEighteen: 36, + stylisticAltNineteen: 38, + stylisticAltTwenty: 40 + }, + contextualAlternates: { + code: 36, + exclusive: false, + contextualAlternates: 0, + swashAlternates: 2, + contextualSwashAlternates: 4 + }, + lowerCase: { + code: 37, + exclusive: true, + defaultLowerCase: 0, + lowerCaseSmallCaps: 1, + lowerCasePetiteCaps: 2 + }, + upperCase: { + code: 38, + exclusive: true, + defaultUpperCase: 0, + upperCaseSmallCaps: 1, + upperCasePetiteCaps: 2 + }, + languageTag: { + // indices into ltag table + code: 39, + exclusive: true + }, + CJKRomanSpacing: { + code: 103, + exclusive: true, + halfWidthCJKRoman: 0, + proportionalCJKRoman: 1, + defaultCJKRoman: 2, + fullWidthCJKRoman: 3 + } +}; + +var feature = function feature(name, selector) { + return [features[name].code, features[name][selector]]; +}; + +var OTMapping = { + rlig: feature('ligatures', 'requiredLigatures'), + clig: feature('ligatures', 'contextualLigatures'), + dlig: feature('ligatures', 'rareLigatures'), + hlig: feature('ligatures', 'historicalLigatures'), + liga: feature('ligatures', 'commonLigatures'), + hist: feature('ligatures', 'historicalLigatures'), + // ?? + smcp: feature('lowerCase', 'lowerCaseSmallCaps'), + pcap: feature('lowerCase', 'lowerCasePetiteCaps'), + frac: feature('fractions', 'diagonalFractions'), + dnom: feature('fractions', 'diagonalFractions'), + // ?? + numr: feature('fractions', 'diagonalFractions'), + // ?? + afrc: feature('fractions', 'verticalFractions'), + // aalt + // abvf, abvm, abvs, akhn, blwf, blwm, blws, cfar, cjct, cpsp, falt, isol, jalt, ljmo, mset? + // ltra, ltrm, nukt, pref, pres, pstf, psts, rand, rkrf, rphf, rtla, rtlm, size, tjmo, tnum? + // unic, vatu, vhal, vjmo, vpal, vrt2 + // dist -> trak table? + // kern, vkrn -> kern table + // lfbd + opbd + rtbd -> opbd table? + // mark, mkmk -> acnt table? + // locl -> languageTag + ltag table + "case": feature('caseSensitiveLayout', 'caseSensitiveLayout'), + // also caseSensitiveSpacing + ccmp: feature('unicodeDecomposition', 'canonicalComposition'), + // compatibilityComposition? + cpct: feature('CJKVerticalRomanPlacement', 'CJKVerticalRomanCentered'), + // guess..., probably not given below + valt: feature('CJKVerticalRomanPlacement', 'CJKVerticalRomanCentered'), + swsh: feature('contextualAlternates', 'swashAlternates'), + cswh: feature('contextualAlternates', 'contextualSwashAlternates'), + curs: feature('cursiveConnection', 'cursive'), + // ?? + c2pc: feature('upperCase', 'upperCasePetiteCaps'), + c2sc: feature('upperCase', 'upperCaseSmallCaps'), + init: feature('smartSwash', 'wordInitialSwashes'), + // ?? + fin2: feature('smartSwash', 'wordFinalSwashes'), + // ?? + medi: feature('smartSwash', 'nonFinalSwashes'), + // ?? + med2: feature('smartSwash', 'nonFinalSwashes'), + // ?? + fin3: feature('smartSwash', 'wordFinalSwashes'), + // ?? + fina: feature('smartSwash', 'wordFinalSwashes'), + // ?? + pkna: feature('kanaSpacing', 'proportionalKana'), + half: feature('textSpacing', 'halfWidthText'), + // also HalfWidthCJKRoman, HalfWidthIdeographs? + halt: feature('textSpacing', 'altHalfWidthText'), + hkna: feature('alternateKana', 'alternateHorizKana'), + vkna: feature('alternateKana', 'alternateVertKana'), + // hngl: feature 'transliteration', 'hanjaToHangulSelector' # deprecated + ital: feature('italicCJKRoman', 'CJKItalicRoman'), + lnum: feature('numberCase', 'upperCaseNumbers'), + onum: feature('numberCase', 'lowerCaseNumbers'), + mgrk: feature('mathematicalExtras', 'mathematicalGreek'), + // nalt: not enough info. what type of annotation? + // ornm: ditto, which ornament style? + calt: feature('contextualAlternates', 'contextualAlternates'), + // or more? + vrt2: feature('verticalSubstitution', 'substituteVerticalForms'), + // oh... below? + vert: feature('verticalSubstitution', 'substituteVerticalForms'), + tnum: feature('numberSpacing', 'monospacedNumbers'), + pnum: feature('numberSpacing', 'proportionalNumbers'), + sups: feature('verticalPosition', 'superiors'), + subs: feature('verticalPosition', 'inferiors'), + ordn: feature('verticalPosition', 'ordinals'), + pwid: feature('textSpacing', 'proportionalText'), + hwid: feature('textSpacing', 'halfWidthText'), + qwid: feature('textSpacing', 'quarterWidthText'), + // also QuarterWidthNumbers? + twid: feature('textSpacing', 'thirdWidthText'), + // also ThirdWidthNumbers? + fwid: feature('textSpacing', 'proportionalText'), + //?? + palt: feature('textSpacing', 'altProportionalText'), + trad: feature('characterShape', 'traditionalCharacters'), + smpl: feature('characterShape', 'simplifiedCharacters'), + jp78: feature('characterShape', 'JIS1978Characters'), + jp83: feature('characterShape', 'JIS1983Characters'), + jp90: feature('characterShape', 'JIS1990Characters'), + jp04: feature('characterShape', 'JIS2004Characters'), + expt: feature('characterShape', 'expertCharacters'), + hojo: feature('characterShape', 'hojoCharacters'), + nlck: feature('characterShape', 'NLCCharacters'), + tnam: feature('characterShape', 'traditionalNamesCharacters'), + ruby: feature('rubyKana', 'rubyKana'), + titl: feature('styleOptions', 'titlingCaps'), + zero: feature('typographicExtras', 'slashedZero'), + ss01: feature('stylisticAlternatives', 'stylisticAltOne'), + ss02: feature('stylisticAlternatives', 'stylisticAltTwo'), + ss03: feature('stylisticAlternatives', 'stylisticAltThree'), + ss04: feature('stylisticAlternatives', 'stylisticAltFour'), + ss05: feature('stylisticAlternatives', 'stylisticAltFive'), + ss06: feature('stylisticAlternatives', 'stylisticAltSix'), + ss07: feature('stylisticAlternatives', 'stylisticAltSeven'), + ss08: feature('stylisticAlternatives', 'stylisticAltEight'), + ss09: feature('stylisticAlternatives', 'stylisticAltNine'), + ss10: feature('stylisticAlternatives', 'stylisticAltTen'), + ss11: feature('stylisticAlternatives', 'stylisticAltEleven'), + ss12: feature('stylisticAlternatives', 'stylisticAltTwelve'), + ss13: feature('stylisticAlternatives', 'stylisticAltThirteen'), + ss14: feature('stylisticAlternatives', 'stylisticAltFourteen'), + ss15: feature('stylisticAlternatives', 'stylisticAltFifteen'), + ss16: feature('stylisticAlternatives', 'stylisticAltSixteen'), + ss17: feature('stylisticAlternatives', 'stylisticAltSeventeen'), + ss18: feature('stylisticAlternatives', 'stylisticAltEighteen'), + ss19: feature('stylisticAlternatives', 'stylisticAltNineteen'), + ss20: feature('stylisticAlternatives', 'stylisticAltTwenty') +}; // salt: feature 'stylisticAlternatives', 'stylisticAltOne' # hmm, which one to choose +// Add cv01-cv99 features + +for (var i$3 = 1; i$3 <= 99; i$3++) { + OTMapping["cv" + ("00" + i$3).slice(-2)] = [features.characterAlternatives.code, i$3]; +} // create inverse mapping + + +var AATMapping = {}; + +for (var ot in OTMapping) { + var aat = OTMapping[ot]; + + if (AATMapping[aat[0]] == null) { + AATMapping[aat[0]] = {}; + } + + AATMapping[aat[0]][aat[1]] = ot; +} // Maps an array of OpenType features to AAT features +// in the form of {featureType:{featureSetting:true}} + + +function mapOTToAAT(features) { + var res = {}; + + for (var k in features) { + var r = void 0; + + if (r = OTMapping[k]) { + if (res[r[0]] == null) { + res[r[0]] = {}; + } + + res[r[0]][r[1]] = features[k]; + } + } + + return res; +} // Maps strings in a [featureType, featureSetting] +// to their equivalent number codes + +function mapFeatureStrings(f) { + var type = f[0], + setting = f[1]; + + if (isNaN(type)) { + var typeCode = features[type] && features[type].code; + } else { + var typeCode = type; + } + + if (isNaN(setting)) { + var settingCode = features[type] && features[type][setting]; + } else { + var settingCode = setting; + } + + return [typeCode, settingCode]; +} // Maps AAT features to an array of OpenType features +// Supports both arrays in the form of [[featureType, featureSetting]] +// and objects in the form of {featureType:{featureSetting:true}} +// featureTypes and featureSettings can be either strings or number codes + + +function mapAATToOT(features) { + var res = {}; + + if (Array.isArray(features)) { + for (var k = 0; k < features.length; k++) { + var r = void 0; + var f = mapFeatureStrings(features[k]); + + if (r = AATMapping[f[0]] && AATMapping[f[0]][f[1]]) { + res[r] = true; + } + } + } else if (typeof features === 'object') { + for (var type in features) { + var _feature = features[type]; + + for (var setting in _feature) { + var _r = void 0; + + var _f = mapFeatureStrings([type, setting]); + + if (_feature[setting] && (_r = AATMapping[_f[0]] && AATMapping[_f[0]][_f[1]])) { + res[_r] = true; + } + } + } + } + + return Object.keys(res); +} + +var _class$1; + +function _createForOfIteratorHelperLoose$8(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$8(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$8(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$8(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$8(o, minLen); } + +function _arrayLikeToArray$8(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _applyDecoratedDescriptor$1(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; } +var AATLookupTable = (_class$1 = /*#__PURE__*/function () { + function AATLookupTable(table) { + this.table = table; + } + + var _proto = AATLookupTable.prototype; + + _proto.lookup = function lookup(glyph) { + switch (this.table.version) { + case 0: + // simple array format + return this.table.values.getItem(glyph); + + case 2: // segment format + + case 4: + { + var min = 0; + var max = this.table.binarySearchHeader.nUnits - 1; + + while (min <= max) { + var mid = min + max >> 1; + var seg = this.table.segments[mid]; // special end of search value + + if (seg.firstGlyph === 0xffff) { + return null; + } + + if (glyph < seg.firstGlyph) { + max = mid - 1; + } else if (glyph > seg.lastGlyph) { + min = mid + 1; + } else { + if (this.table.version === 2) { + return seg.value; + } else { + return seg.values[glyph - seg.firstGlyph]; + } + } + } + + return null; + } + + case 6: + { + // lookup single + var _min = 0; + + var _max = this.table.binarySearchHeader.nUnits - 1; + + while (_min <= _max) { + var mid = _min + _max >> 1; + var seg = this.table.segments[mid]; // special end of search value + + if (seg.glyph === 0xffff) { + return null; + } + + if (glyph < seg.glyph) { + _max = mid - 1; + } else if (glyph > seg.glyph) { + _min = mid + 1; + } else { + return seg.value; + } + } + + return null; + } + + case 8: + // lookup trimmed + return this.table.values[glyph - this.table.firstGlyph]; + + default: + throw new Error("Unknown lookup table format: " + this.table.version); + } + }; + + _proto.glyphsForValue = function glyphsForValue(classValue) { + var res = []; + + switch (this.table.version) { + case 2: // segment format + + case 4: + { + for (var _iterator = _createForOfIteratorHelperLoose$8(this.table.segments), _step; !(_step = _iterator()).done;) { + var segment = _step.value; + + if (this.table.version === 2 && segment.value === classValue) { + res.push.apply(res, range(segment.firstGlyph, segment.lastGlyph + 1)); + } else { + for (var index = 0; index < segment.values.length; index++) { + if (segment.values[index] === classValue) { + res.push(segment.firstGlyph + index); + } + } + } + } + + break; + } + + case 6: + { + // lookup single + for (var _iterator2 = _createForOfIteratorHelperLoose$8(this.table.segments), _step2; !(_step2 = _iterator2()).done;) { + var _segment = _step2.value; + + if (_segment.value === classValue) { + res.push(_segment.glyph); + } + } + + break; + } + + case 8: + { + // lookup trimmed + for (var i = 0; i < this.table.values.length; i++) { + if (this.table.values[i] === classValue) { + res.push(this.table.firstGlyph + i); + } + } + + break; + } + + default: + throw new Error("Unknown lookup table format: " + this.table.version); + } + + return res; + }; + + return AATLookupTable; +}(), (_applyDecoratedDescriptor$1(_class$1.prototype, "glyphsForValue", [cache], Object.getOwnPropertyDescriptor(_class$1.prototype, "glyphsForValue"), _class$1.prototype)), _class$1); + +function _createForOfIteratorHelperLoose$9(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$9(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$9(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$9(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$9(o, minLen); } + +function _arrayLikeToArray$9(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +var START_OF_TEXT_STATE = 0; +var END_OF_TEXT_CLASS = 0; +var OUT_OF_BOUNDS_CLASS = 1; +var DELETED_GLYPH_CLASS = 2; +var DONT_ADVANCE = 0x4000; + +var AATStateMachine = /*#__PURE__*/function () { + function AATStateMachine(stateTable) { + this.stateTable = stateTable; + this.lookupTable = new AATLookupTable(stateTable.classTable); + } + + var _proto = AATStateMachine.prototype; + + _proto.process = function process(glyphs, reverse, processEntry) { + var currentState = START_OF_TEXT_STATE; // START_OF_LINE_STATE is used for kashida glyph insertions sometimes I think? + + var index = reverse ? glyphs.length - 1 : 0; + var dir = reverse ? -1 : 1; + + while (dir === 1 && index <= glyphs.length || dir === -1 && index >= -1) { + var glyph = null; + var classCode = OUT_OF_BOUNDS_CLASS; + var shouldAdvance = true; + + if (index === glyphs.length || index === -1) { + classCode = END_OF_TEXT_CLASS; + } else { + glyph = glyphs[index]; + + if (glyph.id === 0xffff) { + // deleted glyph + classCode = DELETED_GLYPH_CLASS; + } else { + classCode = this.lookupTable.lookup(glyph.id); + + if (classCode == null) { + classCode = OUT_OF_BOUNDS_CLASS; + } + } + } + + var row = this.stateTable.stateArray.getItem(currentState); + var entryIndex = row[classCode]; + var entry = this.stateTable.entryTable.getItem(entryIndex); + + if (classCode !== END_OF_TEXT_CLASS && classCode !== DELETED_GLYPH_CLASS) { + processEntry(glyph, entry, index); + shouldAdvance = !(entry.flags & DONT_ADVANCE); + } + + currentState = entry.newState; + + if (shouldAdvance) { + index += dir; + } + } + + return glyphs; + } + /** + * Performs a depth-first traversal of the glyph strings + * represented by the state machine. + */ + ; + + _proto.traverse = function traverse(opts, state, visited) { + if (state === void 0) { + state = 0; + } + + if (visited === void 0) { + visited = new Set(); + } + + if (visited.has(state)) { + return; + } + + visited.add(state); + var _this$stateTable = this.stateTable, + nClasses = _this$stateTable.nClasses, + stateArray = _this$stateTable.stateArray, + entryTable = _this$stateTable.entryTable; + var row = stateArray.getItem(state); // Skip predefined classes + + for (var classCode = 4; classCode < nClasses; classCode++) { + var entryIndex = row[classCode]; + var entry = entryTable.getItem(entryIndex); // Try all glyphs in the class + + for (var _iterator = _createForOfIteratorHelperLoose$9(this.lookupTable.glyphsForValue(classCode)), _step; !(_step = _iterator()).done;) { + var glyph = _step.value; + + if (opts.enter) { + opts.enter(glyph, entry); + } + + if (entry.newState !== 0) { + this.traverse(opts, entry.newState, visited); + } + + if (opts.exit) { + opts.exit(glyph, entry); + } + } + } + }; + + return AATStateMachine; +}(); + +var _class$2; + +function _createForOfIteratorHelperLoose$a(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$a(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$a(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$a(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$a(o, minLen); } + +function _arrayLikeToArray$a(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _applyDecoratedDescriptor$2(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; } + +var MARK_FIRST = 0x8000; +var MARK_LAST = 0x2000; +var VERB = 0x000F; // contextual substitution and glyph insertion flag + +var SET_MARK = 0x8000; // ligature entry flags + +var SET_COMPONENT = 0x8000; +var PERFORM_ACTION = 0x2000; // ligature action masks + +var LAST_MASK = 0x80000000; +var STORE_MASK = 0x40000000; +var OFFSET_MASK = 0x3FFFFFFF; +var REVERSE_DIRECTION = 0x400000; +var CURRENT_INSERT_BEFORE = 0x0800; +var MARKED_INSERT_BEFORE = 0x0400; +var CURRENT_INSERT_COUNT = 0x03E0; +var MARKED_INSERT_COUNT = 0x001F; +var AATMorxProcessor = (_class$2 = /*#__PURE__*/function () { + function AATMorxProcessor(font) { + this.processIndicRearragement = this.processIndicRearragement.bind(this); + this.processContextualSubstitution = this.processContextualSubstitution.bind(this); + this.processLigature = this.processLigature.bind(this); + this.processNoncontextualSubstitutions = this.processNoncontextualSubstitutions.bind(this); + this.processGlyphInsertion = this.processGlyphInsertion.bind(this); + this.font = font; + this.morx = font.morx; + this.inputCache = null; + } // Processes an array of glyphs and applies the specified features + // Features should be in the form of {featureType:{featureSetting:true}} + + + var _proto = AATMorxProcessor.prototype; + + _proto.process = function process(glyphs, features) { + if (features === void 0) { + features = {}; + } + + for (var _iterator = _createForOfIteratorHelperLoose$a(this.morx.chains), _step; !(_step = _iterator()).done;) { + var chain = _step.value; + var flags = chain.defaultFlags; // enable/disable the requested features + + for (var _iterator2 = _createForOfIteratorHelperLoose$a(chain.features), _step2; !(_step2 = _iterator2()).done;) { + var feature = _step2.value; + var f = void 0; + + if ((f = features[feature.featureType]) && f[feature.featureSetting]) { + flags &= feature.disableFlags; + flags |= feature.enableFlags; + } + } + + for (var _iterator3 = _createForOfIteratorHelperLoose$a(chain.subtables), _step3; !(_step3 = _iterator3()).done;) { + var subtable = _step3.value; + + if (subtable.subFeatureFlags & flags) { + this.processSubtable(subtable, glyphs); + } + } + } // remove deleted glyphs + + + var index = glyphs.length - 1; + + while (index >= 0) { + if (glyphs[index].id === 0xffff) { + glyphs.splice(index, 1); + } + + index--; + } + + return glyphs; + }; + + _proto.processSubtable = function processSubtable(subtable, glyphs) { + this.subtable = subtable; + this.glyphs = glyphs; + + if (this.subtable.type === 4) { + this.processNoncontextualSubstitutions(this.subtable, this.glyphs); + return; + } + + this.ligatureStack = []; + this.markedGlyph = null; + this.firstGlyph = null; + this.lastGlyph = null; + this.markedIndex = null; + var stateMachine = this.getStateMachine(subtable); + var process = this.getProcessor(); + var reverse = !!(this.subtable.coverage & REVERSE_DIRECTION); + return stateMachine.process(this.glyphs, reverse, process); + }; + + _proto.getStateMachine = function getStateMachine(subtable) { + return new AATStateMachine(subtable.table.stateTable); + }; + + _proto.getProcessor = function getProcessor() { + switch (this.subtable.type) { + case 0: + return this.processIndicRearragement; + + case 1: + return this.processContextualSubstitution; + + case 2: + return this.processLigature; + + case 4: + return this.processNoncontextualSubstitutions; + + case 5: + return this.processGlyphInsertion; + + default: + throw new Error("Invalid morx subtable type: " + this.subtable.type); + } + }; + + _proto.processIndicRearragement = function processIndicRearragement(glyph, entry, index) { + if (entry.flags & MARK_FIRST) { + this.firstGlyph = index; + } + + if (entry.flags & MARK_LAST) { + this.lastGlyph = index; + } + + reorderGlyphs(this.glyphs, entry.flags & VERB, this.firstGlyph, this.lastGlyph); + }; + + _proto.processContextualSubstitution = function processContextualSubstitution(glyph, entry, index) { + var subsitutions = this.subtable.table.substitutionTable.items; + + if (entry.markIndex !== 0xffff) { + var lookup = subsitutions.getItem(entry.markIndex); + var lookupTable = new AATLookupTable(lookup); + glyph = this.glyphs[this.markedGlyph]; + var gid = lookupTable.lookup(glyph.id); + + if (gid) { + this.glyphs[this.markedGlyph] = this.font.getGlyph(gid, glyph.codePoints); + } + } + + if (entry.currentIndex !== 0xffff) { + var _lookup = subsitutions.getItem(entry.currentIndex); + + var _lookupTable = new AATLookupTable(_lookup); + + glyph = this.glyphs[index]; + + var gid = _lookupTable.lookup(glyph.id); + + if (gid) { + this.glyphs[index] = this.font.getGlyph(gid, glyph.codePoints); + } + } + + if (entry.flags & SET_MARK) { + this.markedGlyph = index; + } + }; + + _proto.processLigature = function processLigature(glyph, entry, index) { + if (entry.flags & SET_COMPONENT) { + this.ligatureStack.push(index); + } + + if (entry.flags & PERFORM_ACTION) { + var _this$ligatureStack; + + var actions = this.subtable.table.ligatureActions; + var components = this.subtable.table.components; + var ligatureList = this.subtable.table.ligatureList; + var actionIndex = entry.action; + var last = false; + var ligatureIndex = 0; + var codePoints = []; + var ligatureGlyphs = []; + + while (!last) { + var _codePoints; + + var componentGlyph = this.ligatureStack.pop(); + + (_codePoints = codePoints).unshift.apply(_codePoints, this.glyphs[componentGlyph].codePoints); + + var action = actions.getItem(actionIndex++); + last = !!(action & LAST_MASK); + var store = !!(action & STORE_MASK); + var offset = (action & OFFSET_MASK) << 2 >> 2; // sign extend 30 to 32 bits + + offset += this.glyphs[componentGlyph].id; + var component = components.getItem(offset); + ligatureIndex += component; + + if (last || store) { + var ligatureEntry = ligatureList.getItem(ligatureIndex); + this.glyphs[componentGlyph] = this.font.getGlyph(ligatureEntry, codePoints); + ligatureGlyphs.push(componentGlyph); + ligatureIndex = 0; + codePoints = []; + } else { + this.glyphs[componentGlyph] = this.font.getGlyph(0xffff); + } + } // Put ligature glyph indexes back on the stack + + + (_this$ligatureStack = this.ligatureStack).push.apply(_this$ligatureStack, ligatureGlyphs); + } + }; + + _proto.processNoncontextualSubstitutions = function processNoncontextualSubstitutions(subtable, glyphs, index) { + var lookupTable = new AATLookupTable(subtable.table.lookupTable); + + for (index = 0; index < glyphs.length; index++) { + var glyph = glyphs[index]; + + if (glyph.id !== 0xffff) { + var gid = lookupTable.lookup(glyph.id); + + if (gid) { + // 0 means do nothing + glyphs[index] = this.font.getGlyph(gid, glyph.codePoints); + } + } + } + }; + + _proto._insertGlyphs = function _insertGlyphs(glyphIndex, insertionActionIndex, count, isBefore) { + var _this$glyphs; + + var insertions = []; + + while (count--) { + var gid = this.subtable.table.insertionActions.getItem(insertionActionIndex++); + insertions.push(this.font.getGlyph(gid)); + } + + if (!isBefore) { + glyphIndex++; + } + + (_this$glyphs = this.glyphs).splice.apply(_this$glyphs, [glyphIndex, 0].concat(insertions)); + }; + + _proto.processGlyphInsertion = function processGlyphInsertion(glyph, entry, index) { + if (entry.flags & SET_MARK) { + this.markedIndex = index; + } + + if (entry.markedInsertIndex !== 0xffff) { + var count = (entry.flags & MARKED_INSERT_COUNT) >>> 5; + var isBefore = !!(entry.flags & MARKED_INSERT_BEFORE); + + this._insertGlyphs(this.markedIndex, entry.markedInsertIndex, count, isBefore); + } + + if (entry.currentInsertIndex !== 0xffff) { + var _count = (entry.flags & CURRENT_INSERT_COUNT) >>> 5; + + var _isBefore = !!(entry.flags & CURRENT_INSERT_BEFORE); + + this._insertGlyphs(index, entry.currentInsertIndex, _count, _isBefore); + } + }; + + _proto.getSupportedFeatures = function getSupportedFeatures() { + var features = []; + + for (var _iterator4 = _createForOfIteratorHelperLoose$a(this.morx.chains), _step4; !(_step4 = _iterator4()).done;) { + var chain = _step4.value; + + for (var _iterator5 = _createForOfIteratorHelperLoose$a(chain.features), _step5; !(_step5 = _iterator5()).done;) { + var feature = _step5.value; + features.push([feature.featureType, feature.featureSetting]); + } + } + + return features; + }; + + _proto.generateInputs = function generateInputs(gid) { + if (!this.inputCache) { + this.generateInputCache(); + } + + return this.inputCache[gid] || []; + }; + + _proto.generateInputCache = function generateInputCache() { + this.inputCache = {}; + + for (var _iterator6 = _createForOfIteratorHelperLoose$a(this.morx.chains), _step6; !(_step6 = _iterator6()).done;) { + var chain = _step6.value; + var flags = chain.defaultFlags; + + for (var _iterator7 = _createForOfIteratorHelperLoose$a(chain.subtables), _step7; !(_step7 = _iterator7()).done;) { + var subtable = _step7.value; + + if (subtable.subFeatureFlags & flags) { + this.generateInputsForSubtable(subtable); + } + } + } + }; + + _proto.generateInputsForSubtable = function generateInputsForSubtable(subtable) { + var _this = this; + + // Currently, only supporting ligature subtables. + if (subtable.type !== 2) { + return; + } + + var reverse = !!(subtable.coverage & REVERSE_DIRECTION); + + if (reverse) { + throw new Error('Reverse subtable, not supported.'); + } + + this.subtable = subtable; + this.ligatureStack = []; + var stateMachine = this.getStateMachine(subtable); + var process = this.getProcessor(); + var input = []; + var stack = []; + this.glyphs = []; + stateMachine.traverse({ + enter: function enter(glyph, entry) { + var glyphs = _this.glyphs; + stack.push({ + glyphs: glyphs.slice(), + ligatureStack: _this.ligatureStack.slice() + }); // Add glyph to input and glyphs to process. + + var g = _this.font.getGlyph(glyph); + + input.push(g); + glyphs.push(input[input.length - 1]); // Process ligature substitution + + process(glyphs[glyphs.length - 1], entry, glyphs.length - 1); // Add input to result if only one matching (non-deleted) glyph remains. + + var count = 0; + var found = 0; + + for (var i = 0; i < glyphs.length && count <= 1; i++) { + if (glyphs[i].id !== 0xffff) { + count++; + found = glyphs[i].id; + } + } + + if (count === 1) { + var result = input.map(function (g) { + return g.id; + }); + var _cache = _this.inputCache[found]; + + if (_cache) { + _cache.push(result); + } else { + _this.inputCache[found] = [result]; + } + } + }, + exit: function exit() { + var _stack$pop = stack.pop(); + + _this.glyphs = _stack$pop.glyphs; + _this.ligatureStack = _stack$pop.ligatureStack; + input.pop(); + } + }); + }; + + return AATMorxProcessor; +}(), (_applyDecoratedDescriptor$2(_class$2.prototype, "getStateMachine", [cache], Object.getOwnPropertyDescriptor(_class$2.prototype, "getStateMachine"), _class$2.prototype)), _class$2); +// reverse the glyphs inside those ranges if specified +// ranges are in [offset, length] format + +function swap(glyphs, rangeA, rangeB, reverseA, reverseB) { + if (reverseA === void 0) { + reverseA = false; + } + + if (reverseB === void 0) { + reverseB = false; + } + + var end = glyphs.splice(rangeB[0] - (rangeB[1] - 1), rangeB[1]); + + if (reverseB) { + end.reverse(); + } + + var start = glyphs.splice.apply(glyphs, [rangeA[0], rangeA[1]].concat(end)); + + if (reverseA) { + start.reverse(); + } + + glyphs.splice.apply(glyphs, [rangeB[0] - (rangeA[1] - 1), 0].concat(start)); + return glyphs; +} + +function reorderGlyphs(glyphs, verb, firstGlyph, lastGlyph) { + + switch (verb) { + case 0: + // no change + return glyphs; + + case 1: + // Ax => xA + return swap(glyphs, [firstGlyph, 1], [lastGlyph, 0]); + + case 2: + // xD => Dx + return swap(glyphs, [firstGlyph, 0], [lastGlyph, 1]); + + case 3: + // AxD => DxA + return swap(glyphs, [firstGlyph, 1], [lastGlyph, 1]); + + case 4: + // ABx => xAB + return swap(glyphs, [firstGlyph, 2], [lastGlyph, 0]); + + case 5: + // ABx => xBA + return swap(glyphs, [firstGlyph, 2], [lastGlyph, 0], true, false); + + case 6: + // xCD => CDx + return swap(glyphs, [firstGlyph, 0], [lastGlyph, 2]); + + case 7: + // xCD => DCx + return swap(glyphs, [firstGlyph, 0], [lastGlyph, 2], false, true); + + case 8: + // AxCD => CDxA + return swap(glyphs, [firstGlyph, 1], [lastGlyph, 2]); + + case 9: + // AxCD => DCxA + return swap(glyphs, [firstGlyph, 1], [lastGlyph, 2], false, true); + + case 10: + // ABxD => DxAB + return swap(glyphs, [firstGlyph, 2], [lastGlyph, 1]); + + case 11: + // ABxD => DxBA + return swap(glyphs, [firstGlyph, 2], [lastGlyph, 1], true, false); + + case 12: + // ABxCD => CDxAB + return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2]); + + case 13: + // ABxCD => CDxBA + return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], true, false); + + case 14: + // ABxCD => DCxAB + return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], false, true); + + case 15: + // ABxCD => DCxBA + return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], true, true); + + default: + throw new Error("Unknown verb: " + verb); + } +} + +function _createForOfIteratorHelperLoose$b(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$b(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$b(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$b(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$b(o, minLen); } + +function _arrayLikeToArray$b(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var AATLayoutEngine = /*#__PURE__*/function () { + function AATLayoutEngine(font) { + this.font = font; + this.morxProcessor = new AATMorxProcessor(font); + this.fallbackPosition = false; + } + + var _proto = AATLayoutEngine.prototype; + + _proto.substitute = function substitute(glyphRun) { + // AAT expects the glyphs to be in visual order prior to morx processing, + // so reverse the glyphs if the script is right-to-left. + if (glyphRun.direction === 'rtl') { + glyphRun.glyphs.reverse(); + } + + this.morxProcessor.process(glyphRun.glyphs, mapOTToAAT(glyphRun.features)); + }; + + _proto.getAvailableFeatures = function getAvailableFeatures(script, language) { + return mapAATToOT(this.morxProcessor.getSupportedFeatures()); + }; + + _proto.stringsForGlyph = function stringsForGlyph(gid) { + var glyphStrings = this.morxProcessor.generateInputs(gid); + var result = new Set(); + + for (var _iterator = _createForOfIteratorHelperLoose$b(glyphStrings), _step; !(_step = _iterator()).done;) { + var glyphs = _step.value; + + this._addStrings(glyphs, 0, result, ''); + } + + return result; + }; + + _proto._addStrings = function _addStrings(glyphs, index, strings, string) { + var codePoints = this.font._cmapProcessor.codePointsForGlyph(glyphs[index]); + + for (var _iterator2 = _createForOfIteratorHelperLoose$b(codePoints), _step2; !(_step2 = _iterator2()).done;) { + var codePoint = _step2.value; + var s = string + String.fromCodePoint(codePoint); + + if (index < glyphs.length - 1) { + this._addStrings(glyphs, index + 1, strings, s); + } else { + strings.add(s); + } + } + }; + + return AATLayoutEngine; +}(); + +function _createForOfIteratorHelperLoose$c(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$c(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$c(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$c(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$c(o, minLen); } + +function _arrayLikeToArray$c(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +/** + * ShapingPlans are used by the OpenType shapers to store which + * features should by applied, and in what order to apply them. + * The features are applied in groups called stages. A feature + * can be applied globally to all glyphs, or locally to only + * specific glyphs. + * + * @private + */ + +var ShapingPlan = /*#__PURE__*/function () { + function ShapingPlan(font, script, direction) { + this.font = font; + this.script = script; + this.direction = direction; + this.stages = []; + this.globalFeatures = {}; + this.allFeatures = {}; + } + /** + * Adds the given features to the last stage. + * Ignores features that have already been applied. + */ + + + var _proto = ShapingPlan.prototype; + + _proto._addFeatures = function _addFeatures(features, global) { + var stageIndex = this.stages.length - 1; + var stage = this.stages[stageIndex]; + + for (var _iterator = _createForOfIteratorHelperLoose$c(features), _step; !(_step = _iterator()).done;) { + var feature = _step.value; + + if (this.allFeatures[feature] == null) { + stage.push(feature); + this.allFeatures[feature] = stageIndex; + + if (global) { + this.globalFeatures[feature] = true; + } + } + } + } + /** + * Add features to the last stage + */ + ; + + _proto.add = function add(arg, global) { + if (global === void 0) { + global = true; + } + + if (this.stages.length === 0) { + this.stages.push([]); + } + + if (typeof arg === 'string') { + arg = [arg]; + } + + if (Array.isArray(arg)) { + this._addFeatures(arg, global); + } else if (typeof arg === 'object') { + this._addFeatures(arg.global || [], true); + + this._addFeatures(arg.local || [], false); + } else { + throw new Error("Unsupported argument to ShapingPlan#add"); + } + } + /** + * Add a new stage + */ + ; + + _proto.addStage = function addStage(arg, global) { + if (typeof arg === 'function') { + this.stages.push(arg, []); + } else { + this.stages.push([]); + this.add(arg, global); + } + }; + + _proto.setFeatureOverrides = function setFeatureOverrides(features) { + if (Array.isArray(features)) { + this.add(features); + } else if (typeof features === 'object') { + for (var tag in features) { + if (features[tag]) { + this.add(tag); + } else if (this.allFeatures[tag] != null) { + var stage = this.stages[this.allFeatures[tag]]; + stage.splice(stage.indexOf(tag), 1); + delete this.allFeatures[tag]; + delete this.globalFeatures[tag]; + } + } + } + } + /** + * Assigns the global features to the given glyphs + */ + ; + + _proto.assignGlobalFeatures = function assignGlobalFeatures(glyphs) { + for (var _iterator2 = _createForOfIteratorHelperLoose$c(glyphs), _step2; !(_step2 = _iterator2()).done;) { + var glyph = _step2.value; + + for (var feature in this.globalFeatures) { + glyph.features[feature] = true; + } + } + } + /** + * Executes the planned stages using the given OTProcessor + */ + ; + + _proto.process = function process(processor, glyphs, positions) { + for (var _iterator3 = _createForOfIteratorHelperLoose$c(this.stages), _step3; !(_step3 = _iterator3()).done;) { + var stage = _step3.value; + + if (typeof stage === 'function') { + if (!positions) { + stage(this.font, glyphs, this); + } + } else if (stage.length > 0) { + processor.applyFeatures(stage, glyphs, positions); + } + } + }; + + return ShapingPlan; +}(); + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +var VARIATION_FEATURES = ['rvrn']; +var COMMON_FEATURES = ['ccmp', 'locl', 'rlig', 'mark', 'mkmk']; +var FRACTIONAL_FEATURES = ['frac', 'numr', 'dnom']; +var HORIZONTAL_FEATURES = ['calt', 'clig', 'liga', 'rclt', 'curs', 'kern']; +var DIRECTIONAL_FEATURES = { + ltr: ['ltra', 'ltrm'], + rtl: ['rtla', 'rtlm'] +}; + +var DefaultShaper = /*#__PURE__*/function () { + function DefaultShaper() {} + + DefaultShaper.plan = function plan(_plan, glyphs, features) { + // Plan the features we want to apply + this.planPreprocessing(_plan); + this.planFeatures(_plan); + this.planPostprocessing(_plan, features); // Assign the global features to all the glyphs + + _plan.assignGlobalFeatures(glyphs); // Assign local features to glyphs + + + this.assignFeatures(_plan, glyphs); + }; + + DefaultShaper.planPreprocessing = function planPreprocessing(plan) { + plan.add({ + global: [].concat(VARIATION_FEATURES, DIRECTIONAL_FEATURES[plan.direction]), + local: FRACTIONAL_FEATURES + }); + }; + + DefaultShaper.planFeatures = function planFeatures(plan) {// Do nothing by default. Let subclasses override this. + }; + + DefaultShaper.planPostprocessing = function planPostprocessing(plan, userFeatures) { + plan.add([].concat(COMMON_FEATURES, HORIZONTAL_FEATURES)); + plan.setFeatureOverrides(userFeatures); + }; + + DefaultShaper.assignFeatures = function assignFeatures(plan, glyphs) { + // Enable contextual fractions + for (var i = 0; i < glyphs.length; i++) { + var glyph = glyphs[i]; + + if (glyph.codePoints[0] === 0x2044) { + // fraction slash + var start = i; + var end = i + 1; // Apply numerator + + while (start > 0 && unicode.isDigit(glyphs[start - 1].codePoints[0])) { + glyphs[start - 1].features.numr = true; + glyphs[start - 1].features.frac = true; + start--; + } // Apply denominator + + + while (end < glyphs.length && unicode.isDigit(glyphs[end].codePoints[0])) { + glyphs[end].features.dnom = true; + glyphs[end].features.frac = true; + end++; + } // Apply fraction slash + + + glyph.features.frac = true; + i = end - 1; + } + } + }; + + return DefaultShaper; +}(); + +_defineProperty(DefaultShaper, "zeroMarkWidths", 'AFTER_GPOS'); + +var base64DeflatedTrie$1 = "eJwBDgLx/QAB8AAAAAAAAAA4AAH9AQL+7ZotTMQwFMe77b44QIHA4JBIBAJ5lxASDAmGhHMoBIqgUOBQJAhOIpFIDIogSUgIEolEEgzJ/S/Xkpem3XXXboPbe8kv7a3r63vt69u6XDcWYhvsgn3Qlb//S3kMTsEZuACXoA9uwC24A/fgATyRfs/gTf4e8g4+ZP1Tll+knZlOfsC1pJ4IMQ8WkvLtKool+Los/V2pkN8MwzAMwzAMwzAMw1SP4fefVf7+wTAMwzAMwzC5cjUzYjEnXsFcW4gOOAeP4Ls9alufFWJTCNFrCdFvjepF8NLKbz7XcIbZMJxjOri2leF8s4N79zzPQz30P7DoOMT1o4qct9T/C06m1N9OHP3CwlJliSzQdlM9lNSk3kSjZih1TH2yQvv9JaE2UR/1uXLxLwSTzG0RJFrdxQ9TXKl2QUqbhNgHdDwXoT7Taz7SBHWD/oYkbf1dYyIhOvV+DU/7lWSNz1BxPW5uTO3jxnWVsvedb+zZ+o/L9Vlij95rerbZ7IoMelTe1XNFaJkkhqltphjT9ZrmT5ey34zVGijRbQxlX9n7xPTu1ZQUuY9993Oaf3nqDqnLNUf4SKg1iye005ZLIq1U9UiO5fJOGKfoN42nxnK1NUTOpfbYfNFzqZ5Tfe2wzWOIuLOtQdEov4qWtLhzJes6hI5RXwmZv0zPCps0A45rkwGaMQXv"; + +function _inheritsLoose$3(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } +var trieData$1 = pako__WEBPACK_IMPORTED_MODULE_0___default().inflate(base64Arraybuffer_2(base64DeflatedTrie$1)); +var trie$1 = new unicodeTrie(trieData$1); +var FEATURES = ['isol', 'fina', 'fin2', 'fin3', 'medi', 'med2', 'init']; +var ShapingClasses = { + Non_Joining: 0, + Left_Joining: 1, + Right_Joining: 2, + Dual_Joining: 3, + Join_Causing: 3, + ALAPH: 4, + 'DALATH RISH': 5, + Transparent: 6 +}; +var ISOL = 'isol'; +var FINA = 'fina'; +var FIN2 = 'fin2'; +var FIN3 = 'fin3'; +var MEDI = 'medi'; +var MED2 = 'med2'; +var INIT = 'init'; +var NONE = null; // Each entry is [prevAction, curAction, nextState] + +var STATE_TABLE = [// Non_Joining, Left_Joining, Right_Joining, Dual_Joining, ALAPH, DALATH RISH +// State 0: prev was U, not willing to join. +[[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 6]], // State 1: prev was R or ISOL/ALAPH, not willing to join. +[[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, FIN2, 5], [NONE, ISOL, 6]], // State 2: prev was D/L in ISOL form, willing to join. +[[NONE, NONE, 0], [NONE, ISOL, 2], [INIT, FINA, 1], [INIT, FINA, 3], [INIT, FINA, 4], [INIT, FINA, 6]], // State 3: prev was D in FINA form, willing to join. +[[NONE, NONE, 0], [NONE, ISOL, 2], [MEDI, FINA, 1], [MEDI, FINA, 3], [MEDI, FINA, 4], [MEDI, FINA, 6]], // State 4: prev was FINA ALAPH, not willing to join. +[[NONE, NONE, 0], [NONE, ISOL, 2], [MED2, ISOL, 1], [MED2, ISOL, 2], [MED2, FIN2, 5], [MED2, ISOL, 6]], // State 5: prev was FIN2/FIN3 ALAPH, not willing to join. +[[NONE, NONE, 0], [NONE, ISOL, 2], [ISOL, ISOL, 1], [ISOL, ISOL, 2], [ISOL, FIN2, 5], [ISOL, ISOL, 6]], // State 6: prev was DALATH/RISH, not willing to join. +[[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, FIN3, 5], [NONE, ISOL, 6]]]; +/** + * This is a shaper for Arabic, and other cursive scripts. + * It uses data from ArabicShaping.txt in the Unicode database, + * compiled to a UnicodeTrie by generate-data.coffee. + * + * The shaping state machine was ported from Harfbuzz. + * https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-complex-arabic.cc + */ + +var ArabicShaper = /*#__PURE__*/function (_DefaultShaper) { + _inheritsLoose$3(ArabicShaper, _DefaultShaper); + + function ArabicShaper() { + return _DefaultShaper.apply(this, arguments) || this; + } + + ArabicShaper.planFeatures = function planFeatures(plan) { + plan.add(['ccmp', 'locl']); + + for (var i = 0; i < FEATURES.length; i++) { + var feature = FEATURES[i]; + plan.addStage(feature, false); + } + + plan.addStage('mset'); + }; + + ArabicShaper.assignFeatures = function assignFeatures(plan, glyphs) { + _DefaultShaper.assignFeatures.call(this, plan, glyphs); + + var prev = -1; + var state = 0; + var actions = []; // Apply the state machine to map glyphs to features + + for (var i = 0; i < glyphs.length; i++) { + var curAction = void 0, + prevAction = void 0; + var glyph = glyphs[i]; + var type = getShapingClass(glyph.codePoints[0]); + + if (type === ShapingClasses.Transparent) { + actions[i] = NONE; + continue; + } + + var _STATE_TABLE$state$ty = STATE_TABLE[state][type]; + prevAction = _STATE_TABLE$state$ty[0]; + curAction = _STATE_TABLE$state$ty[1]; + state = _STATE_TABLE$state$ty[2]; + + if (prevAction !== NONE && prev !== -1) { + actions[prev] = prevAction; + } + + actions[i] = curAction; + prev = i; + } // Apply the chosen features to their respective glyphs + + + for (var index = 0; index < glyphs.length; index++) { + var feature = void 0; + var glyph = glyphs[index]; + + if (feature = actions[index]) { + glyph.features[feature] = true; + } + } + }; + + return ArabicShaper; +}(DefaultShaper); + +function getShapingClass(codePoint) { + var res = trie$1.get(codePoint); + + if (res) { + return res - 1; + } + + var category = unicode.getCategory(codePoint); + + if (category === 'Mn' || category === 'Me' || category === 'Cf') { + return ShapingClasses.Transparent; + } + + return ShapingClasses.Non_Joining; +} + +function _defineProperties$3(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass$3(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$3(Constructor.prototype, protoProps); if (staticProps) _defineProperties$3(Constructor, staticProps); return Constructor; } + +var GlyphIterator = /*#__PURE__*/function () { + function GlyphIterator(glyphs, options) { + this.glyphs = glyphs; + this.reset(options); + } + + var _proto = GlyphIterator.prototype; + + _proto.reset = function reset(options, index) { + if (options === void 0) { + options = {}; + } + + if (index === void 0) { + index = 0; + } + + this.options = options; + this.flags = options.flags || {}; + this.markAttachmentType = options.markAttachmentType || 0; + this.index = index; + }; + + _proto.shouldIgnore = function shouldIgnore(glyph) { + return this.flags.ignoreMarks && glyph.isMark || this.flags.ignoreBaseGlyphs && glyph.isBase || this.flags.ignoreLigatures && glyph.isLigature || this.markAttachmentType && glyph.isMark && glyph.markAttachmentType !== this.markAttachmentType; + }; + + _proto.move = function move(dir) { + this.index += dir; + + while (0 <= this.index && this.index < this.glyphs.length && this.shouldIgnore(this.glyphs[this.index])) { + this.index += dir; + } + + if (0 > this.index || this.index >= this.glyphs.length) { + return null; + } + + return this.glyphs[this.index]; + }; + + _proto.next = function next() { + return this.move(+1); + }; + + _proto.prev = function prev() { + return this.move(-1); + }; + + _proto.peek = function peek(count) { + if (count === void 0) { + count = 1; + } + + var idx = this.index; + var res = this.increment(count); + this.index = idx; + return res; + }; + + _proto.peekIndex = function peekIndex(count) { + if (count === void 0) { + count = 1; + } + + var idx = this.index; + this.increment(count); + var res = this.index; + this.index = idx; + return res; + }; + + _proto.increment = function increment(count) { + if (count === void 0) { + count = 1; + } + + var dir = count < 0 ? -1 : 1; + count = Math.abs(count); + + while (count--) { + this.move(dir); + } + + return this.glyphs[this.index]; + }; + + _createClass$3(GlyphIterator, [{ + key: "cur", + get: function get() { + return this.glyphs[this.index] || null; + } + }]); + + return GlyphIterator; +}(); + +function _createForOfIteratorHelperLoose$d(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$d(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$d(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$d(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$d(o, minLen); } + +function _arrayLikeToArray$d(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +var DEFAULT_SCRIPTS = ['DFLT', 'dflt', 'latn']; + +var OTProcessor = /*#__PURE__*/function () { + function OTProcessor(font, table) { + this.font = font; + this.table = table; + this.script = null; + this.scriptTag = null; + this.language = null; + this.languageTag = null; + this.features = {}; + this.lookups = {}; // Setup variation substitutions + + this.variationsIndex = font._variationProcessor ? this.findVariationsIndex(font._variationProcessor.normalizedCoords) : -1; // initialize to default script + language + + this.selectScript(); // current context (set by applyFeatures) + + this.glyphs = []; + this.positions = []; // only used by GPOS + + this.ligatureID = 1; + this.currentFeature = null; + } + + var _proto = OTProcessor.prototype; + + _proto.findScript = function findScript(script) { + if (this.table.scriptList == null) { + return null; + } + + if (!Array.isArray(script)) { + script = [script]; + } + + for (var _iterator = _createForOfIteratorHelperLoose$d(script), _step; !(_step = _iterator()).done;) { + var s = _step.value; + + for (var _iterator2 = _createForOfIteratorHelperLoose$d(this.table.scriptList), _step2; !(_step2 = _iterator2()).done;) { + var entry = _step2.value; + + if (entry.tag === s) { + return entry; + } + } + } + + return null; + }; + + _proto.selectScript = function selectScript(script, language, direction$1) { + var changed = false; + var entry; + + if (!this.script || script !== this.scriptTag) { + entry = this.findScript(script); + + if (!entry) { + entry = this.findScript(DEFAULT_SCRIPTS); + } + + if (!entry) { + return this.scriptTag; + } + + this.scriptTag = entry.tag; + this.script = entry.script; + this.language = null; + this.languageTag = null; + changed = true; + } + + if (!direction$1 || direction$1 !== this.direction) { + this.direction = direction$1 || direction(script); + } + + if (language && language.length < 4) { + language += ' '.repeat(4 - language.length); + } + + if (!language || language !== this.languageTag) { + this.language = null; + + for (var _iterator3 = _createForOfIteratorHelperLoose$d(this.script.langSysRecords), _step3; !(_step3 = _iterator3()).done;) { + var lang = _step3.value; + + if (lang.tag === language) { + this.language = lang.langSys; + this.languageTag = lang.tag; + break; + } + } + + if (!this.language) { + this.language = this.script.defaultLangSys; + this.languageTag = null; + } + + changed = true; + } // Build a feature lookup table + + + if (changed) { + this.features = {}; + + if (this.language) { + for (var _iterator4 = _createForOfIteratorHelperLoose$d(this.language.featureIndexes), _step4; !(_step4 = _iterator4()).done;) { + var featureIndex = _step4.value; + var record = this.table.featureList[featureIndex]; + var substituteFeature = this.substituteFeatureForVariations(featureIndex); + this.features[record.tag] = substituteFeature || record.feature; + } + } + } + + return this.scriptTag; + }; + + _proto.lookupsForFeatures = function lookupsForFeatures(userFeatures, exclude) { + if (userFeatures === void 0) { + userFeatures = []; + } + + var lookups = []; + + for (var _iterator5 = _createForOfIteratorHelperLoose$d(userFeatures), _step5; !(_step5 = _iterator5()).done;) { + var tag = _step5.value; + var feature = this.features[tag]; + + if (!feature) { + continue; + } + + for (var _iterator6 = _createForOfIteratorHelperLoose$d(feature.lookupListIndexes), _step6; !(_step6 = _iterator6()).done;) { + var lookupIndex = _step6.value; + + if (exclude && exclude.indexOf(lookupIndex) !== -1) { + continue; + } + + lookups.push({ + feature: tag, + index: lookupIndex, + lookup: this.table.lookupList.get(lookupIndex) + }); + } + } + + lookups.sort(function (a, b) { + return a.index - b.index; + }); + return lookups; + }; + + _proto.substituteFeatureForVariations = function substituteFeatureForVariations(featureIndex) { + if (this.variationsIndex === -1) { + return null; + } + + var record = this.table.featureVariations.featureVariationRecords[this.variationsIndex]; + var substitutions = record.featureTableSubstitution.substitutions; + + for (var _iterator7 = _createForOfIteratorHelperLoose$d(substitutions), _step7; !(_step7 = _iterator7()).done;) { + var substitution = _step7.value; + + if (substitution.featureIndex === featureIndex) { + return substitution.alternateFeatureTable; + } + } + + return null; + }; + + _proto.findVariationsIndex = function findVariationsIndex(coords) { + var variations = this.table.featureVariations; + + if (!variations) { + return -1; + } + + var records = variations.featureVariationRecords; + + for (var i = 0; i < records.length; i++) { + var conditions = records[i].conditionSet.conditionTable; + + if (this.variationConditionsMatch(conditions, coords)) { + return i; + } + } + + return -1; + }; + + _proto.variationConditionsMatch = function variationConditionsMatch(conditions, coords) { + return conditions.every(function (condition) { + var coord = condition.axisIndex < coords.length ? coords[condition.axisIndex] : 0; + return condition.filterRangeMinValue <= coord && coord <= condition.filterRangeMaxValue; + }); + }; + + _proto.applyFeatures = function applyFeatures(userFeatures, glyphs, advances) { + var lookups = this.lookupsForFeatures(userFeatures); + this.applyLookups(lookups, glyphs, advances); + }; + + _proto.applyLookups = function applyLookups(lookups, glyphs, positions) { + this.glyphs = glyphs; + this.positions = positions; + this.glyphIterator = new GlyphIterator(glyphs); + + for (var _iterator8 = _createForOfIteratorHelperLoose$d(lookups), _step8; !(_step8 = _iterator8()).done;) { + var _step8$value = _step8.value, + feature = _step8$value.feature, + lookup = _step8$value.lookup; + this.currentFeature = feature; + this.glyphIterator.reset(lookup.flags); + + while (this.glyphIterator.index < glyphs.length) { + if (!(feature in this.glyphIterator.cur.features)) { + this.glyphIterator.next(); + continue; + } + + for (var _iterator9 = _createForOfIteratorHelperLoose$d(lookup.subTables), _step9; !(_step9 = _iterator9()).done;) { + var table = _step9.value; + var res = this.applyLookup(lookup.lookupType, table); + + if (res) { + break; + } + } + + this.glyphIterator.next(); + } + } + }; + + _proto.applyLookup = function applyLookup(lookup, table) { + throw new Error("applyLookup must be implemented by subclasses"); + }; + + _proto.applyLookupList = function applyLookupList(lookupRecords) { + var options = this.glyphIterator.options; + var glyphIndex = this.glyphIterator.index; + + for (var _iterator10 = _createForOfIteratorHelperLoose$d(lookupRecords), _step10; !(_step10 = _iterator10()).done;) { + var lookupRecord = _step10.value; + // Reset flags and find glyph index for this lookup record + this.glyphIterator.reset(options, glyphIndex); + this.glyphIterator.increment(lookupRecord.sequenceIndex); // Get the lookup and setup flags for subtables + + var lookup = this.table.lookupList.get(lookupRecord.lookupListIndex); + this.glyphIterator.reset(lookup.flags, this.glyphIterator.index); // Apply lookup subtables until one matches + + for (var _iterator11 = _createForOfIteratorHelperLoose$d(lookup.subTables), _step11; !(_step11 = _iterator11()).done;) { + var table = _step11.value; + + if (this.applyLookup(lookup.lookupType, table)) { + break; + } + } + } + + this.glyphIterator.reset(options, glyphIndex); + return true; + }; + + _proto.coverageIndex = function coverageIndex(coverage, glyph) { + if (glyph == null) { + glyph = this.glyphIterator.cur.id; + } + + switch (coverage.version) { + case 1: + return coverage.glyphs.indexOf(glyph); + + case 2: + for (var _iterator12 = _createForOfIteratorHelperLoose$d(coverage.rangeRecords), _step12; !(_step12 = _iterator12()).done;) { + var range = _step12.value; + + if (range.start <= glyph && glyph <= range.end) { + return range.startCoverageIndex + glyph - range.start; + } + } + + break; + } + + return -1; + }; + + _proto.match = function match(sequenceIndex, sequence, fn, matched) { + var pos = this.glyphIterator.index; + var glyph = this.glyphIterator.increment(sequenceIndex); + var idx = 0; + + while (idx < sequence.length && glyph && fn(sequence[idx], glyph)) { + if (matched) { + matched.push(this.glyphIterator.index); + } + + idx++; + glyph = this.glyphIterator.next(); + } + + this.glyphIterator.index = pos; + + if (idx < sequence.length) { + return false; + } + + return matched || true; + }; + + _proto.sequenceMatches = function sequenceMatches(sequenceIndex, sequence) { + return this.match(sequenceIndex, sequence, function (component, glyph) { + return component === glyph.id; + }); + }; + + _proto.sequenceMatchIndices = function sequenceMatchIndices(sequenceIndex, sequence) { + var _this = this; + + return this.match(sequenceIndex, sequence, function (component, glyph) { + // If the current feature doesn't apply to this glyph, + if (!(_this.currentFeature in glyph.features)) { + return false; + } + + return component === glyph.id; + }, []); + }; + + _proto.coverageSequenceMatches = function coverageSequenceMatches(sequenceIndex, sequence) { + var _this2 = this; + + return this.match(sequenceIndex, sequence, function (coverage, glyph) { + return _this2.coverageIndex(coverage, glyph.id) >= 0; + }); + }; + + _proto.getClassID = function getClassID(glyph, classDef) { + switch (classDef.version) { + case 1: + // Class array + var i = glyph - classDef.startGlyph; + + if (i >= 0 && i < classDef.classValueArray.length) { + return classDef.classValueArray[i]; + } + + break; + + case 2: + for (var _iterator13 = _createForOfIteratorHelperLoose$d(classDef.classRangeRecord), _step13; !(_step13 = _iterator13()).done;) { + var range = _step13.value; + + if (range.start <= glyph && glyph <= range.end) { + return range["class"]; + } + } + + break; + } + + return 0; + }; + + _proto.classSequenceMatches = function classSequenceMatches(sequenceIndex, sequence, classDef) { + var _this3 = this; + + return this.match(sequenceIndex, sequence, function (classID, glyph) { + return classID === _this3.getClassID(glyph.id, classDef); + }); + }; + + _proto.applyContext = function applyContext(table) { + switch (table.version) { + case 1: + var index = this.coverageIndex(table.coverage); + + if (index === -1) { + return false; + } + + var set = table.ruleSets[index]; + + for (var _iterator14 = _createForOfIteratorHelperLoose$d(set), _step14; !(_step14 = _iterator14()).done;) { + var rule = _step14.value; + + if (this.sequenceMatches(1, rule.input)) { + return this.applyLookupList(rule.lookupRecords); + } + } + + break; + + case 2: + if (this.coverageIndex(table.coverage) === -1) { + return false; + } + + index = this.getClassID(this.glyphIterator.cur.id, table.classDef); + + if (index === -1) { + return false; + } + + set = table.classSet[index]; + + for (var _iterator15 = _createForOfIteratorHelperLoose$d(set), _step15; !(_step15 = _iterator15()).done;) { + var _rule = _step15.value; + + if (this.classSequenceMatches(1, _rule.classes, table.classDef)) { + return this.applyLookupList(_rule.lookupRecords); + } + } + + break; + + case 3: + if (this.coverageSequenceMatches(0, table.coverages)) { + return this.applyLookupList(table.lookupRecords); + } + + break; + } + + return false; + }; + + _proto.applyChainingContext = function applyChainingContext(table) { + switch (table.version) { + case 1: + var index = this.coverageIndex(table.coverage); + + if (index === -1) { + return false; + } + + var set = table.chainRuleSets[index]; + + for (var _iterator16 = _createForOfIteratorHelperLoose$d(set), _step16; !(_step16 = _iterator16()).done;) { + var rule = _step16.value; + + if (this.sequenceMatches(-rule.backtrack.length, rule.backtrack) && this.sequenceMatches(1, rule.input) && this.sequenceMatches(1 + rule.input.length, rule.lookahead)) { + return this.applyLookupList(rule.lookupRecords); + } + } + + break; + + case 2: + if (this.coverageIndex(table.coverage) === -1) { + return false; + } + + index = this.getClassID(this.glyphIterator.cur.id, table.inputClassDef); + var rules = table.chainClassSet[index]; + + if (!rules) { + return false; + } + + for (var _iterator17 = _createForOfIteratorHelperLoose$d(rules), _step17; !(_step17 = _iterator17()).done;) { + var _rule2 = _step17.value; + + if (this.classSequenceMatches(-_rule2.backtrack.length, _rule2.backtrack, table.backtrackClassDef) && this.classSequenceMatches(1, _rule2.input, table.inputClassDef) && this.classSequenceMatches(1 + _rule2.input.length, _rule2.lookahead, table.lookaheadClassDef)) { + return this.applyLookupList(_rule2.lookupRecords); + } + } + + break; + + case 3: + if (this.coverageSequenceMatches(-table.backtrackGlyphCount, table.backtrackCoverage) && this.coverageSequenceMatches(0, table.inputCoverage) && this.coverageSequenceMatches(table.inputGlyphCount, table.lookaheadCoverage)) { + return this.applyLookupList(table.lookupRecords); + } + + break; + } + + return false; + }; + + return OTProcessor; +}(); + +function _defineProperties$4(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass$4(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$4(Constructor.prototype, protoProps); if (staticProps) _defineProperties$4(Constructor, staticProps); return Constructor; } + +var GlyphInfo = /*#__PURE__*/function () { + function GlyphInfo(font, id, codePoints, features) { + if (codePoints === void 0) { + codePoints = []; + } + + this._font = font; + this.codePoints = codePoints; + this.id = id; + this.features = {}; + + if (Array.isArray(features)) { + for (var i = 0; i < features.length; i++) { + var feature = features[i]; + this.features[feature] = true; + } + } else if (typeof features === 'object') { + Object.assign(this.features, features); + } + + this.ligatureID = null; + this.ligatureComponent = null; + this.isLigated = false; + this.cursiveAttachment = null; + this.markAttachment = null; + this.shaperInfo = null; + this.substituted = false; + this.isMultiplied = false; + } + + var _proto = GlyphInfo.prototype; + + _proto.copy = function copy() { + return new GlyphInfo(this._font, this.id, this.codePoints, this.features); + }; + + _createClass$4(GlyphInfo, [{ + key: "id", + get: function get() { + return this._id; + }, + set: function set(id) { + this._id = id; + this.substituted = true; + var GDEF = this._font.GDEF; + + if (GDEF && GDEF.glyphClassDef) { + // TODO: clean this up + var classID = OTProcessor.prototype.getClassID(id, GDEF.glyphClassDef); + this.isBase = classID === 1; + this.isLigature = classID === 2; + this.isMark = classID === 3; + this.markAttachmentType = GDEF.markAttachClassDef ? OTProcessor.prototype.getClassID(id, GDEF.markAttachClassDef) : 0; + } else { + this.isMark = this.codePoints.length > 0 && this.codePoints.every(unicode.isMark); + this.isBase = !this.isMark; + this.isLigature = this.codePoints.length > 1; + this.markAttachmentType = 0; + } + } + }]); + + return GlyphInfo; +}(); + +function _inheritsLoose$4(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +function _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +/** + * This is a shaper for the Hangul script, used by the Korean language. + * It does the following: + * - decompose if unsupported by the font: + * -> + * -> + * -> + * + * - compose if supported by the font: + * -> + * -> + * -> + * + * - reorder tone marks (S is any valid syllable): + * -> + * + * - apply ljmo, vjmo, and tjmo OpenType features to decomposed Jamo sequences. + * + * This logic is based on the following documents: + * - http://www.microsoft.com/typography/OpenTypeDev/hangul/intro.htm + * - http://ktug.org/~nomos/harfbuzz-hangul/hangulshaper.pdf + */ + +var HangulShaper = /*#__PURE__*/function (_DefaultShaper) { + _inheritsLoose$4(HangulShaper, _DefaultShaper); + + function HangulShaper() { + return _DefaultShaper.apply(this, arguments) || this; + } + + HangulShaper.planFeatures = function planFeatures(plan) { + plan.add(['ljmo', 'vjmo', 'tjmo'], false); + }; + + HangulShaper.assignFeatures = function assignFeatures(plan, glyphs) { + var state = 0; + var i = 0; + + while (i < glyphs.length) { + var action = void 0; + var glyph = glyphs[i]; + var code = glyph.codePoints[0]; + var type = getType(code); + var _STATE_TABLE$state$ty = STATE_TABLE$1[state][type]; + action = _STATE_TABLE$state$ty[0]; + state = _STATE_TABLE$state$ty[1]; + + switch (action) { + case DECOMPOSE: + // Decompose the composed syllable if it is not supported by the font. + if (!plan.font.hasGlyphForCodePoint(code)) { + i = decompose(glyphs, i, plan.font); + } + + break; + + case COMPOSE: + // Found a decomposed syllable. Try to compose if supported by the font. + i = compose(glyphs, i, plan.font); + break; + + case TONE_MARK: + // Got a valid syllable, followed by a tone mark. Move the tone mark to the beginning of the syllable. + reorderToneMark(glyphs, i, plan.font); + break; + + case INVALID: + // Tone mark has no valid syllable to attach to, so insert a dotted circle + i = insertDottedCircle(glyphs, i, plan.font); + break; + } + + i++; + } + }; + + return HangulShaper; +}(DefaultShaper); + +_defineProperty$1(HangulShaper, "zeroMarkWidths", 'NONE'); +var HANGUL_BASE = 0xac00; +var HANGUL_END = 0xd7a4; +var HANGUL_COUNT = HANGUL_END - HANGUL_BASE + 1; +var L_BASE = 0x1100; // lead + +var V_BASE = 0x1161; // vowel + +var T_BASE = 0x11a7; // trail + +var L_COUNT = 19; +var V_COUNT = 21; +var T_COUNT = 28; +var L_END = L_BASE + L_COUNT - 1; +var V_END = V_BASE + V_COUNT - 1; +var T_END = T_BASE + T_COUNT - 1; +var DOTTED_CIRCLE = 0x25cc; + +var isL = function isL(code) { + return 0x1100 <= code && code <= 0x115f || 0xa960 <= code && code <= 0xa97c; +}; + +var isV = function isV(code) { + return 0x1160 <= code && code <= 0x11a7 || 0xd7b0 <= code && code <= 0xd7c6; +}; + +var isT = function isT(code) { + return 0x11a8 <= code && code <= 0x11ff || 0xd7cb <= code && code <= 0xd7fb; +}; + +var isTone = function isTone(code) { + return 0x302e <= code && code <= 0x302f; +}; + +var isLVT = function isLVT(code) { + return HANGUL_BASE <= code && code <= HANGUL_END; +}; + +var isLV = function isLV(code) { + return code - HANGUL_BASE < HANGUL_COUNT && (code - HANGUL_BASE) % T_COUNT === 0; +}; + +var isCombiningL = function isCombiningL(code) { + return L_BASE <= code && code <= L_END; +}; + +var isCombiningV = function isCombiningV(code) { + return V_BASE <= code && code <= V_END; +}; + +var isCombiningT = function isCombiningT(code) { + return 1 <= code && code <= T_END; +}; // Character categories + + +var X = 0; // Other character + +var L = 1; // Leading consonant + +var V = 2; // Medial vowel + +var T = 3; // Trailing consonant + +var LV = 4; // Composed syllable + +var LVT = 5; // Composed syllable + +var M = 6; // Tone mark +// This function classifies a character using the above categories. + +function getType(code) { + if (isL(code)) { + return L; + } + + if (isV(code)) { + return V; + } + + if (isT(code)) { + return T; + } + + if (isLV(code)) { + return LV; + } + + if (isLVT(code)) { + return LVT; + } + + if (isTone(code)) { + return M; + } + + return X; +} // State machine actions + + +var NO_ACTION = 0; +var DECOMPOSE = 1; +var COMPOSE = 2; +var TONE_MARK = 4; +var INVALID = 5; // Build a state machine that accepts valid syllables, and applies actions along the way. +// The logic this is implementing is documented at the top of the file. + +var STATE_TABLE$1 = [// X L V T LV LVT M +// State 0: start state +[[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [INVALID, 0]], // State 1: +[[NO_ACTION, 0], [NO_ACTION, 1], [COMPOSE, 2], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [INVALID, 0]], // State 2: or +[[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [COMPOSE, 3], [DECOMPOSE, 2], [DECOMPOSE, 3], [TONE_MARK, 0]], // State 3: or +[[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [TONE_MARK, 0]]]; + +function getGlyph(font, code, features) { + return new GlyphInfo(font, font.glyphForCodePoint(code).id, [code], features); +} + +function decompose(glyphs, i, font) { + var glyph = glyphs[i]; + var code = glyph.codePoints[0]; + var s = code - HANGUL_BASE; + var t = T_BASE + s % T_COUNT; + s = s / T_COUNT | 0; + var l = L_BASE + s / V_COUNT | 0; + var v = V_BASE + s % V_COUNT; // Don't decompose if all of the components are not available + + if (!font.hasGlyphForCodePoint(l) || !font.hasGlyphForCodePoint(v) || t !== T_BASE && !font.hasGlyphForCodePoint(t)) { + return i; + } // Replace the current glyph with decomposed L, V, and T glyphs, + // and apply the proper OpenType features to each component. + + + var ljmo = getGlyph(font, l, glyph.features); + ljmo.features.ljmo = true; + var vjmo = getGlyph(font, v, glyph.features); + vjmo.features.vjmo = true; + var insert = [ljmo, vjmo]; + + if (t > T_BASE) { + var tjmo = getGlyph(font, t, glyph.features); + tjmo.features.tjmo = true; + insert.push(tjmo); + } + + glyphs.splice.apply(glyphs, [i, 1].concat(insert)); + return i + insert.length - 1; +} + +function compose(glyphs, i, font) { + var glyph = glyphs[i]; + var code = glyphs[i].codePoints[0]; + var type = getType(code); + var prev = glyphs[i - 1].codePoints[0]; + var prevType = getType(prev); // Figure out what type of syllable we're dealing with + + var lv, ljmo, vjmo, tjmo; + + if (prevType === LV && type === T) { + // + lv = prev; + tjmo = glyph; + } else { + if (type === V) { + // + ljmo = glyphs[i - 1]; + vjmo = glyph; + } else { + // + ljmo = glyphs[i - 2]; + vjmo = glyphs[i - 1]; + tjmo = glyph; + } + + var l = ljmo.codePoints[0]; + var v = vjmo.codePoints[0]; // Make sure L and V are combining characters + + if (isCombiningL(l) && isCombiningV(v)) { + lv = HANGUL_BASE + ((l - L_BASE) * V_COUNT + (v - V_BASE)) * T_COUNT; + } + } + + var t = tjmo && tjmo.codePoints[0] || T_BASE; + + if (lv != null && (t === T_BASE || isCombiningT(t))) { + var s = lv + (t - T_BASE); // Replace with a composed glyph if supported by the font, + // otherwise apply the proper OpenType features to each component. + + if (font.hasGlyphForCodePoint(s)) { + var del = prevType === V ? 3 : 2; + glyphs.splice(i - del + 1, del, getGlyph(font, s, glyph.features)); + return i - del + 1; + } + } // Didn't compose (either a non-combining component or unsupported by font). + + + if (ljmo) { + ljmo.features.ljmo = true; + } + + if (vjmo) { + vjmo.features.vjmo = true; + } + + if (tjmo) { + tjmo.features.tjmo = true; + } + + if (prevType === LV) { + // Sequence was originally , which got combined earlier. + // Either the T was non-combining, or the LVT glyph wasn't supported. + // Decompose the glyph again and apply OT features. + decompose(glyphs, i - 1, font); + return i + 1; + } + + return i; +} + +function getLength(code) { + switch (getType(code)) { + case LV: + case LVT: + return 1; + + case V: + return 2; + + case T: + return 3; + } +} + +function reorderToneMark(glyphs, i, font) { + var glyph = glyphs[i]; + var code = glyphs[i].codePoints[0]; // Move tone mark to the beginning of the previous syllable, unless it is zero width + + if (font.glyphForCodePoint(code).advanceWidth === 0) { + return; + } + + var prev = glyphs[i - 1].codePoints[0]; + var len = getLength(prev); + glyphs.splice(i, 1); + return glyphs.splice(i - len, 0, glyph); +} + +function insertDottedCircle(glyphs, i, font) { + var glyph = glyphs[i]; + var code = glyphs[i].codePoints[0]; + + if (font.hasGlyphForCodePoint(DOTTED_CIRCLE)) { + var dottedCircle = getGlyph(font, DOTTED_CIRCLE, glyph.features); // If the tone mark is zero width, insert the dotted circle before, otherwise after + + var idx = font.glyphForCodePoint(code).advanceWidth === 0 ? i : i + 1; + glyphs.splice(idx, 0, dottedCircle); + i++; + } + + return i; +} + +function _createForOfIteratorHelperLoose$e(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$e(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$e(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$e(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$e(o, minLen); } + +function _arrayLikeToArray$e(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var INITIAL_STATE = 1; +var FAIL_STATE = 0; +/** + * A StateMachine represents a deterministic finite automaton. + * It can perform matches over a sequence of values, similar to a regular expression. + */ + +var StateMachine = /*#__PURE__*/function () { + function StateMachine(dfa) { + this.stateTable = dfa.stateTable; + this.accepting = dfa.accepting; + this.tags = dfa.tags; + } + /** + * Returns an iterable object that yields pattern matches over the input sequence. + * Matches are of the form [startIndex, endIndex, tags]. + */ + + + var _proto = StateMachine.prototype; + + _proto.match = function match(str) { + var _ref; + + var self = this; + return _ref = {}, _ref[Symbol.iterator] = /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var state, startRun, lastAccepting, lastState, p, c; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + state = INITIAL_STATE; + startRun = null; + lastAccepting = null; + lastState = null; + p = 0; + + case 5: + if (!(p < str.length)) { + _context.next = 21; + break; + } + + c = str[p]; + lastState = state; + state = self.stateTable[state][c]; + + if (!(state === FAIL_STATE)) { + _context.next = 15; + break; + } + + if (!(startRun != null && lastAccepting != null && lastAccepting >= startRun)) { + _context.next = 13; + break; + } + + _context.next = 13; + return [startRun, lastAccepting, self.tags[lastState]]; + + case 13: + // reset the state as if we started over from the initial state + state = self.stateTable[INITIAL_STATE][c]; + startRun = null; + + case 15: + // start a run if not in the failure state + if (state !== FAIL_STATE && startRun == null) { + startRun = p; + } // if accepting, mark the potential match end + + + if (self.accepting[state]) { + lastAccepting = p; + } // reset the state to the initial state if we get into the failure state + + + if (state === FAIL_STATE) { + state = INITIAL_STATE; + } + + case 18: + p++; + _context.next = 5; + break; + + case 21: + if (!(startRun != null && lastAccepting != null && lastAccepting >= startRun)) { + _context.next = 24; + break; + } + + _context.next = 24; + return [startRun, lastAccepting, self.tags[state]]; + + case 24: + case "end": + return _context.stop(); + } + } + }, _callee); + }), _ref; + } + /** + * For each match over the input sequence, action functions matching + * the tag definitions in the input pattern are called with the startIndex, + * endIndex, and sub-match sequence. + */ + ; + + _proto.apply = function apply(str, actions) { + for (var _iterator = _createForOfIteratorHelperLoose$e(this.match(str)), _step; !(_step = _iterator()).done;) { + var _step$value = _step.value, + start = _step$value[0], + end = _step$value[1], + tags = _step$value[2]; + + for (var _iterator2 = _createForOfIteratorHelperLoose$e(tags), _step2; !(_step2 = _iterator2()).done;) { + var tag = _step2.value; + + if (typeof actions[tag] === 'function') { + actions[tag](start, end, str.slice(start, end + 1)); + } + } + } + }; + + return StateMachine; +}(); + +var dfa = StateMachine; + +// Cateories used in the OpenType spec: +// https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx +var CATEGORIES = { + X: 1 << 0, + C: 1 << 1, + V: 1 << 2, + N: 1 << 3, + H: 1 << 4, + ZWNJ: 1 << 5, + ZWJ: 1 << 6, + M: 1 << 7, + SM: 1 << 8, + VD: 1 << 9, + A: 1 << 10, + Placeholder: 1 << 11, + Dotted_Circle: 1 << 12, + RS: 1 << 13, + // Register Shifter, used in Khmer OT spec. + Coeng: 1 << 14, + // Khmer-style Virama. + Repha: 1 << 15, + // Atomically-encoded logical or visual repha. + Ra: 1 << 16, + CM: 1 << 17, + // Consonant-Medial. + Symbol: 1 << 18 // Avagraha, etc that take marks (SM,A,VD). + +}; // Visual positions in a syllable from left to right. + +var POSITIONS = { + Start: 1 << 0, + Ra_To_Become_Reph: 1 << 1, + Pre_M: 1 << 2, + Pre_C: 1 << 3, + Base_C: 1 << 4, + After_Main: 1 << 5, + Above_C: 1 << 6, + Before_Sub: 1 << 7, + Below_C: 1 << 8, + After_Sub: 1 << 9, + Before_Post: 1 << 10, + Post_C: 1 << 11, + After_Post: 1 << 12, + Final_C: 1 << 13, + SMVD: 1 << 14, + End: 1 << 15 +}; +var CONSONANT_FLAGS = CATEGORIES.C | CATEGORIES.Ra | CATEGORIES.CM | CATEGORIES.V | CATEGORIES.Placeholder | CATEGORIES.Dotted_Circle; +var JOINER_FLAGS = CATEGORIES.ZWJ | CATEGORIES.ZWNJ; +var HALANT_OR_COENG_FLAGS = CATEGORIES.H | CATEGORIES.Coeng; +var INDIC_CONFIGS = { + Default: { + hasOldSpec: false, + virama: 0, + basePos: 'Last', + rephPos: POSITIONS.Before_Post, + rephMode: 'Implicit', + blwfMode: 'Pre_And_Post' + }, + Devanagari: { + hasOldSpec: true, + virama: 0x094D, + basePos: 'Last', + rephPos: POSITIONS.Before_Post, + rephMode: 'Implicit', + blwfMode: 'Pre_And_Post' + }, + Bengali: { + hasOldSpec: true, + virama: 0x09CD, + basePos: 'Last', + rephPos: POSITIONS.After_Sub, + rephMode: 'Implicit', + blwfMode: 'Pre_And_Post' + }, + Gurmukhi: { + hasOldSpec: true, + virama: 0x0A4D, + basePos: 'Last', + rephPos: POSITIONS.Before_Sub, + rephMode: 'Implicit', + blwfMode: 'Pre_And_Post' + }, + Gujarati: { + hasOldSpec: true, + virama: 0x0ACD, + basePos: 'Last', + rephPos: POSITIONS.Before_Post, + rephMode: 'Implicit', + blwfMode: 'Pre_And_Post' + }, + Oriya: { + hasOldSpec: true, + virama: 0x0B4D, + basePos: 'Last', + rephPos: POSITIONS.After_Main, + rephMode: 'Implicit', + blwfMode: 'Pre_And_Post' + }, + Tamil: { + hasOldSpec: true, + virama: 0x0BCD, + basePos: 'Last', + rephPos: POSITIONS.After_Post, + rephMode: 'Implicit', + blwfMode: 'Pre_And_Post' + }, + Telugu: { + hasOldSpec: true, + virama: 0x0C4D, + basePos: 'Last', + rephPos: POSITIONS.After_Post, + rephMode: 'Explicit', + blwfMode: 'Post_Only' + }, + Kannada: { + hasOldSpec: true, + virama: 0x0CCD, + basePos: 'Last', + rephPos: POSITIONS.After_Post, + rephMode: 'Implicit', + blwfMode: 'Post_Only' + }, + Malayalam: { + hasOldSpec: true, + virama: 0x0D4D, + basePos: 'Last', + rephPos: POSITIONS.After_Main, + rephMode: 'Log_Repha', + blwfMode: 'Pre_And_Post' + }, + // Handled by UniversalShaper + // Sinhala: { + // hasOldSpec: false, + // virama: 0x0DCA, + // basePos: 'Last_Sinhala', + // rephPos: POSITIONS.After_Main, + // rephMode: 'Explicit', + // blwfMode: 'Pre_And_Post' + // }, + Khmer: { + hasOldSpec: false, + virama: 0x17D2, + basePos: 'First', + rephPos: POSITIONS.Ra_To_Become_Reph, + rephMode: 'Vis_Repha', + blwfMode: 'Pre_And_Post' + } +}; // Additional decompositions that aren't in Unicode + +var INDIC_DECOMPOSITIONS = { + // Khmer + 0x17BE: [0x17C1, 0x17BE], + 0x17BF: [0x17C1, 0x17BF], + 0x17C0: [0x17C1, 0x17C0], + 0x17C4: [0x17C1, 0x17C4], + 0x17C5: [0x17C1, 0x17C5] +}; + +var base64DeflatedIndicMachine = "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"; + +var base64DeflatedUseData = "eJzNmVtv2zYUx7+LnvnA+6Vva4a0K5BsWLcWmBEEsqMG3mw5kJUOQ9HvvsOLLUp2owsVwGBCmj8d/nl0DkkzyLdsldfF465aF/vszSL7NUPZL7c/Q/0Rft+9hcr+Xt9AdfXuA9Sfbn5afnXtb/vatqHre1c3bzf/um5V2Mb33jt7//kqjD907Ty/2/n+tBMF0Rs//NqbXnt47UeUz5uNtQ86Hw8zhjF/fb794Bpbu8r6/slOc2tdsZUbeoeyh2K12z7t9ut6vSvh/b9lVGAFcYCGIcoNByP4rI9IEGOR1g5prRA1mDpkyBFppT2ikRUDxDCxA6HhiGEsPTIeiQZR3FgxYhHh3CLCKWJEWHlGpUNUMsSoFg4p4pDCEaIRkh7xBsmARIyOozl2o5nRCCrsEfPIRIgfrThxAwWXFgkObyUY9khHKFiZGDWmAjdcuABI5jyUkiD4bBPDlHSeKA2eKGmzwIxwVkZATIzgHqkISY+sJxySAUhqj0yDnGngEntuIkQa1DI1zUQOSePyAQ1G0kjhEfOIRkh6xCOkPBIRMh7pBhnGHTNMATRUBSoC1UeqMHcpti1BULt42Z6Mqfa2mjNHNbdUcxoojyk7UNmytZ4pgo0NsW0lgtrrQs8EqgL9jrJ9DUfQH/lyU8CzBUazlTu0oAj2C+JQBBBwBWlkEMGIEEQoIgzBHoOdRyQ8JgpB+u0TgyhGlCBKgxZlvvE1txW85yzOUnn0dqKAPXHa/VNBaqBi8APbB0ICSxTOFthdsNUVYnbRI+4tIY3wAM4ZDoGDyImgwOVRjBlP1EwhaPLV9A75ii0I7756O0v9irijeBLLsYKHJeXcowN8DCup/7XN4NceKHlm5WO/8HHfuo+mFi+EwEvPHoN0TaK7D8eX3rWUvjp7zqdXTRPAMTEdeKTO4zLXLXHbHSzOzciAkMM5NygiZ3T7yoRDq1eS/PjhNLmRqza2SNz904twFXnxlE5I9Vxupqp1v+/TvZtZru9lo7tIbMS6XnQuIANETzS7ZbxkfGdyE8gBrkZ3pd4AsGadzSd79o6HR1zxAlB9AfH6rxKRdF3+8mIYVAYsshkW7lw386S0MTEyvmekBW05D93hzgs2xXs+yv1z4n1lyjnUq9n9kkzXG7/eYqO5z56kLP34G7xzFZz1D5iUa+ZZ8bRycpNJEuP9Kevs3fm/LlIOh7MzJMTjGOE7lOWrVfFUr8vH7M3iS77ZF6iunidX6QqXVkGI6vzR/oNgAeHPltXun6K8X22e93VRZRaty4fiqYCqrFt8/992udu0UZ2XD3n10IJnJC8BXYof01H5vC2qfNNnNiZ/A1N6gfDrusq3+T10t+syr4tL8u014PQlAmxZVPd/79YlNMkBO5ni7vv/LbyJLg=="; + +var base64DeflatedTrie$2 = "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"; + +function _createForOfIteratorHelperLoose$f(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$f(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$f(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$f(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$f(o, minLen); } + +function _arrayLikeToArray$f(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _inheritsLoose$5(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +function _defineProperty$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +// we may be running in a browser so we make an Uint8Array + +var indicMachine = JSON.parse(String.fromCharCode.apply(String, pako__WEBPACK_IMPORTED_MODULE_0___default().inflate(base64Arraybuffer_2(base64DeflatedIndicMachine)))); +var useData = JSON.parse(String.fromCharCode.apply(String, pako__WEBPACK_IMPORTED_MODULE_0___default().inflate(base64Arraybuffer_2(base64DeflatedUseData)))); +var trieData$2 = pako__WEBPACK_IMPORTED_MODULE_0___default().inflate(base64Arraybuffer_2(base64DeflatedTrie$2)); +var decompositions = useData.decompositions; +var trie$2 = new unicodeTrie(trieData$2); +var stateMachine = new dfa(indicMachine); +/** + * The IndicShaper supports indic scripts e.g. Devanagari, Kannada, etc. + * Based on code from Harfbuzz: https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-complex-indic.cc + */ + +var IndicShaper = /*#__PURE__*/function (_DefaultShaper) { + _inheritsLoose$5(IndicShaper, _DefaultShaper); + + function IndicShaper() { + return _DefaultShaper.apply(this, arguments) || this; + } + + IndicShaper.planFeatures = function planFeatures(plan) { + plan.addStage(setupSyllables); + plan.addStage(['locl', 'ccmp']); + plan.addStage(initialReordering); + plan.addStage('nukt'); + plan.addStage('akhn'); + plan.addStage('rphf', false); + plan.addStage('rkrf'); + plan.addStage('pref', false); + plan.addStage('blwf', false); + plan.addStage('abvf', false); + plan.addStage('half', false); + plan.addStage('pstf', false); + plan.addStage('vatu'); + plan.addStage('cjct'); + plan.addStage('cfar', false); + plan.addStage(finalReordering); + plan.addStage({ + local: ['init'], + global: ['pres', 'abvs', 'blws', 'psts', 'haln', 'dist', 'abvm', 'blwm', 'calt', 'clig'] + }); // Setup the indic config for the selected script + + plan.unicodeScript = fromOpenType(plan.script); + plan.indicConfig = INDIC_CONFIGS[plan.unicodeScript] || INDIC_CONFIGS.Default; + plan.isOldSpec = plan.indicConfig.hasOldSpec && plan.script[plan.script.length - 1] !== '2'; // TODO: turn off kern (Khmer) and liga features. + }; + + IndicShaper.assignFeatures = function assignFeatures(plan, glyphs) { + var _loop = function _loop(i) { + var codepoint = glyphs[i].codePoints[0]; + var d = INDIC_DECOMPOSITIONS[codepoint] || decompositions[codepoint]; + + if (d) { + var decomposed = d.map(function (c) { + var g = plan.font.glyphForCodePoint(c); + return new GlyphInfo(plan.font, g.id, [c], glyphs[i].features); + }); + glyphs.splice.apply(glyphs, [i, 1].concat(decomposed)); + } + }; + + // Decompose split matras + // TODO: do this in a more general unicode normalizer + for (var i = glyphs.length - 1; i >= 0; i--) { + _loop(i); + } + }; + + return IndicShaper; +}(DefaultShaper); + +_defineProperty$2(IndicShaper, "zeroMarkWidths", 'NONE'); + +function indicCategory(glyph) { + return trie$2.get(glyph.codePoints[0]) >> 8; +} + +function indicPosition(glyph) { + return 1 << (trie$2.get(glyph.codePoints[0]) & 0xff); +} + +var IndicInfo = function IndicInfo(category, position, syllableType, syllable) { + this.category = category; + this.position = position; + this.syllableType = syllableType; + this.syllable = syllable; +}; + +function setupSyllables(font, glyphs) { + var syllable = 0; + var last = 0; + + for (var _iterator = _createForOfIteratorHelperLoose$f(stateMachine.match(glyphs.map(indicCategory))), _step; !(_step = _iterator()).done;) { + var _step$value = _step.value, + start = _step$value[0], + end = _step$value[1], + tags = _step$value[2]; + + if (start > last) { + ++syllable; + + for (var _i = last; _i < start; _i++) { + glyphs[_i].shaperInfo = new IndicInfo(CATEGORIES.X, POSITIONS.End, 'non_indic_cluster', syllable); + } + } + + ++syllable; // Create shaper info + + for (var _i2 = start; _i2 <= end; _i2++) { + glyphs[_i2].shaperInfo = new IndicInfo(1 << indicCategory(glyphs[_i2]), indicPosition(glyphs[_i2]), tags[0], syllable); + } + + last = end + 1; + } + + if (last < glyphs.length) { + ++syllable; + + for (var i = last; i < glyphs.length; i++) { + glyphs[i].shaperInfo = new IndicInfo(CATEGORIES.X, POSITIONS.End, 'non_indic_cluster', syllable); + } + } +} + +function isConsonant(glyph) { + return glyph.shaperInfo.category & CONSONANT_FLAGS; +} + +function isJoiner(glyph) { + return glyph.shaperInfo.category & JOINER_FLAGS; +} + +function isHalantOrCoeng(glyph) { + return glyph.shaperInfo.category & HALANT_OR_COENG_FLAGS; +} + +function wouldSubstitute(glyphs, feature) { + for (var _iterator2 = _createForOfIteratorHelperLoose$f(glyphs), _step2; !(_step2 = _iterator2()).done;) { + var _glyph$features; + + var glyph = _step2.value; + glyph.features = (_glyph$features = {}, _glyph$features[feature] = true, _glyph$features); + } + + var GSUB = glyphs[0]._font._layoutEngine.engine.GSUBProcessor; + GSUB.applyFeatures([feature], glyphs); + return glyphs.length === 1; +} + +function consonantPosition(font, consonant, virama) { + var glyphs = [virama, consonant, virama]; + + if (wouldSubstitute(glyphs.slice(0, 2), 'blwf') || wouldSubstitute(glyphs.slice(1, 3), 'blwf')) { + return POSITIONS.Below_C; + } else if (wouldSubstitute(glyphs.slice(0, 2), 'pstf') || wouldSubstitute(glyphs.slice(1, 3), 'pstf')) { + return POSITIONS.Post_C; + } else if (wouldSubstitute(glyphs.slice(0, 2), 'pref') || wouldSubstitute(glyphs.slice(1, 3), 'pref')) { + return POSITIONS.Post_C; + } + + return POSITIONS.Base_C; +} + +function initialReordering(font, glyphs, plan) { + var indicConfig = plan.indicConfig; + var features = font._layoutEngine.engine.GSUBProcessor.features; + var dottedCircle = font.glyphForCodePoint(0x25cc).id; + var virama = font.glyphForCodePoint(indicConfig.virama).id; + + if (virama) { + var info = new GlyphInfo(font, virama, [indicConfig.virama]); + + for (var i = 0; i < glyphs.length; i++) { + if (glyphs[i].shaperInfo.position === POSITIONS.Base_C) { + glyphs[i].shaperInfo.position = consonantPosition(font, glyphs[i].copy(), info); + } + } + } + + for (var start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) { + var _glyphs$start$shaperI = glyphs[start].shaperInfo, + category = _glyphs$start$shaperI.category, + syllableType = _glyphs$start$shaperI.syllableType; + + if (syllableType === 'symbol_cluster' || syllableType === 'non_indic_cluster') { + continue; + } + + if (syllableType === 'broken_cluster' && dottedCircle) { + var g = new GlyphInfo(font, dottedCircle, [0x25cc]); + g.shaperInfo = new IndicInfo(1 << indicCategory(g), indicPosition(g), glyphs[start].shaperInfo.syllableType, glyphs[start].shaperInfo.syllable); // Insert after possible Repha. + + var _i3 = start; + + while (_i3 < end && glyphs[_i3].shaperInfo.category === CATEGORIES.Repha) { + _i3++; + } + + glyphs.splice(_i3++, 0, g); + end++; + } // 1. Find base consonant: + // + // The shaping engine finds the base consonant of the syllable, using the + // following algorithm: starting from the end of the syllable, move backwards + // until a consonant is found that does not have a below-base or post-base + // form (post-base forms have to follow below-base forms), or that is not a + // pre-base reordering Ra, or arrive at the first consonant. The consonant + // stopped at will be the base. + + + var base = end; + var limit = start; + var hasReph = false; // If the syllable starts with Ra + Halant (in a script that has Reph) + // and has more than one consonant, Ra is excluded from candidates for + // base consonants. + + if (indicConfig.rephPos !== POSITIONS.Ra_To_Become_Reph && features.rphf && start + 3 <= end && (indicConfig.rephMode === 'Implicit' && !isJoiner(glyphs[start + 2]) || indicConfig.rephMode === 'Explicit' && glyphs[start + 2].shaperInfo.category === CATEGORIES.ZWJ)) { + // See if it matches the 'rphf' feature. + var _g = [glyphs[start].copy(), glyphs[start + 1].copy(), glyphs[start + 2].copy()]; + + if (wouldSubstitute(_g.slice(0, 2), 'rphf') || indicConfig.rephMode === 'Explicit' && wouldSubstitute(_g, 'rphf')) { + limit += 2; + + while (limit < end && isJoiner(glyphs[limit])) { + limit++; + } + + base = start; + hasReph = true; + } + } else if (indicConfig.rephMode === 'Log_Repha' && glyphs[start].shaperInfo.category === CATEGORIES.Repha) { + limit++; + + while (limit < end && isJoiner(glyphs[limit])) { + limit++; + } + + base = start; + hasReph = true; + } + + switch (indicConfig.basePos) { + case 'Last': + { + // starting from the end of the syllable, move backwards + var _i4 = end; + var seenBelow = false; + + do { + var _info = glyphs[--_i4].shaperInfo; // until a consonant is found + + if (isConsonant(glyphs[_i4])) { + // that does not have a below-base or post-base form + // (post-base forms have to follow below-base forms), + if (_info.position !== POSITIONS.Below_C && (_info.position !== POSITIONS.Post_C || seenBelow)) { + base = _i4; + break; + } // or that is not a pre-base reordering Ra, + // + // IMPLEMENTATION NOTES: + // + // Our pre-base reordering Ra's are marked POS_POST_C, so will be skipped + // by the logic above already. + // + // or arrive at the first consonant. The consonant stopped at will + // be the base. + + + if (_info.position === POSITIONS.Below_C) { + seenBelow = true; + } + + base = _i4; + } else if (start < _i4 && _info.category === CATEGORIES.ZWJ && glyphs[_i4 - 1].shaperInfo.category === CATEGORIES.H) { + // A ZWJ after a Halant stops the base search, and requests an explicit + // half form. + // A ZWJ before a Halant, requests a subjoined form instead, and hence + // search continues. This is particularly important for Bengali + // sequence Ra,H,Ya that should form Ya-Phalaa by subjoining Ya. + break; + } + } while (_i4 > limit); + + break; + } + + case 'First': + { + // The first consonant is always the base. + base = start; // Mark all subsequent consonants as below. + + for (var _i5 = base + 1; _i5 < end; _i5++) { + if (isConsonant(glyphs[_i5])) { + glyphs[_i5].shaperInfo.position = POSITIONS.Below_C; + } + } + } + } // If the syllable starts with Ra + Halant (in a script that has Reph) + // and has more than one consonant, Ra is excluded from candidates for + // base consonants. + // + // Only do this for unforced Reph. (ie. not for Ra,H,ZWJ) + + + if (hasReph && base === start && limit - base <= 2) { + hasReph = false; + } // 2. Decompose and reorder Matras: + // + // Each matra and any syllable modifier sign in the cluster are moved to the + // appropriate position relative to the consonant(s) in the cluster. The + // shaping engine decomposes two- or three-part matras into their constituent + // parts before any repositioning. Matra characters are classified by which + // consonant in a conjunct they have affinity for and are reordered to the + // following positions: + // + // o Before first half form in the syllable + // o After subjoined consonants + // o After post-form consonant + // o After main consonant (for above marks) + // + // IMPLEMENTATION NOTES: + // + // The normalize() routine has already decomposed matras for us, so we don't + // need to worry about that. + // 3. Reorder marks to canonical order: + // + // Adjacent nukta and halant or nukta and vedic sign are always repositioned + // if necessary, so that the nukta is first. + // + // IMPLEMENTATION NOTES: + // + // We don't need to do this: the normalize() routine already did this for us. + // Reorder characters + + + for (var _i6 = start; _i6 < base; _i6++) { + var _info2 = glyphs[_i6].shaperInfo; + _info2.position = Math.min(POSITIONS.Pre_C, _info2.position); + } + + if (base < end) { + glyphs[base].shaperInfo.position = POSITIONS.Base_C; + } // Mark final consonants. A final consonant is one appearing after a matra, + // like in Khmer. + + + for (var _i7 = base + 1; _i7 < end; _i7++) { + if (glyphs[_i7].shaperInfo.category === CATEGORIES.M) { + for (var j = _i7 + 1; j < end; j++) { + if (isConsonant(glyphs[j])) { + glyphs[j].shaperInfo.position = POSITIONS.Final_C; + break; + } + } + + break; + } + } // Handle beginning Ra + + + if (hasReph) { + glyphs[start].shaperInfo.position = POSITIONS.Ra_To_Become_Reph; + } // For old-style Indic script tags, move the first post-base Halant after + // last consonant. + // + // Reports suggest that in some scripts Uniscribe does this only if there + // is *not* a Halant after last consonant already (eg. Kannada), while it + // does it unconditionally in other scripts (eg. Malayalam). We don't + // currently know about other scripts, so we single out Malayalam for now. + // + // Kannada test case: + // U+0C9A,U+0CCD,U+0C9A,U+0CCD + // With some versions of Lohit Kannada. + // https://bugs.freedesktop.org/show_bug.cgi?id=59118 + // + // Malayalam test case: + // U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D + // With lohit-ttf-20121122/Lohit-Malayalam.ttf + + + if (plan.isOldSpec) { + var disallowDoubleHalants = plan.unicodeScript !== 'Malayalam'; + + for (var _i8 = base + 1; _i8 < end; _i8++) { + if (glyphs[_i8].shaperInfo.category === CATEGORIES.H) { + var _j = void 0; + + for (_j = end - 1; _j > _i8; _j--) { + if (isConsonant(glyphs[_j]) || disallowDoubleHalants && glyphs[_j].shaperInfo.category === CATEGORIES.H) { + break; + } + } + + if (glyphs[_j].shaperInfo.category !== CATEGORIES.H && _j > _i8) { + // Move Halant to after last consonant. + var t = glyphs[_i8]; + glyphs.splice.apply(glyphs, [_i8, 0].concat(glyphs.splice(_i8 + 1, _j - _i8))); + glyphs[_j] = t; + } + + break; + } + } + } // Attach misc marks to previous char to move with them. + + + var lastPos = POSITIONS.Start; + + for (var _i9 = start; _i9 < end; _i9++) { + var _info3 = glyphs[_i9].shaperInfo; + + if (_info3.category & (JOINER_FLAGS | CATEGORIES.N | CATEGORIES.RS | CATEGORIES.CM | HALANT_OR_COENG_FLAGS & _info3.category)) { + _info3.position = lastPos; + + if (_info3.category === CATEGORIES.H && _info3.position === POSITIONS.Pre_M) { + // Uniscribe doesn't move the Halant with Left Matra. + // TEST: U+092B,U+093F,U+094DE + // We follow. This is important for the Sinhala + // U+0DDA split matra since it decomposes to U+0DD9,U+0DCA + // where U+0DD9 is a left matra and U+0DCA is the virama. + // We don't want to move the virama with the left matra. + // TEST: U+0D9A,U+0DDA + for (var _j2 = _i9; _j2 > start; _j2--) { + if (glyphs[_j2 - 1].shaperInfo.position !== POSITIONS.Pre_M) { + _info3.position = glyphs[_j2 - 1].shaperInfo.position; + break; + } + } + } + } else if (_info3.position !== POSITIONS.SMVD) { + lastPos = _info3.position; + } + } // For post-base consonants let them own anything before them + // since the last consonant or matra. + + + var last = base; + + for (var _i10 = base + 1; _i10 < end; _i10++) { + if (isConsonant(glyphs[_i10])) { + for (var _j3 = last + 1; _j3 < _i10; _j3++) { + if (glyphs[_j3].shaperInfo.position < POSITIONS.SMVD) { + glyphs[_j3].shaperInfo.position = glyphs[_i10].shaperInfo.position; + } + } + + last = _i10; + } else if (glyphs[_i10].shaperInfo.category === CATEGORIES.M) { + last = _i10; + } + } + + var arr = glyphs.slice(start, end); + arr.sort(function (a, b) { + return a.shaperInfo.position - b.shaperInfo.position; + }); + glyphs.splice.apply(glyphs, [start, arr.length].concat(arr)); // Find base again + + for (var _i11 = start; _i11 < end; _i11++) { + if (glyphs[_i11].shaperInfo.position === POSITIONS.Base_C) { + base = _i11; + break; + } + } // Setup features now + // Reph + + + for (var _i12 = start; _i12 < end && glyphs[_i12].shaperInfo.position === POSITIONS.Ra_To_Become_Reph; _i12++) { + glyphs[_i12].features.rphf = true; + } // Pre-base + + + var blwf = !plan.isOldSpec && indicConfig.blwfMode === 'Pre_And_Post'; + + for (var _i13 = start; _i13 < base; _i13++) { + glyphs[_i13].features.half = true; + + if (blwf) { + glyphs[_i13].features.blwf = true; + } + } // Post-base + + + for (var _i14 = base + 1; _i14 < end; _i14++) { + glyphs[_i14].features.abvf = true; + glyphs[_i14].features.pstf = true; + glyphs[_i14].features.blwf = true; + } + + if (plan.isOldSpec && plan.unicodeScript === 'Devanagari') { + // Old-spec eye-lash Ra needs special handling. From the + // spec: + // + // "The feature 'below-base form' is applied to consonants + // having below-base forms and following the base consonant. + // The exception is vattu, which may appear below half forms + // as well as below the base glyph. The feature 'below-base + // form' will be applied to all such occurrences of Ra as well." + // + // Test case: U+0924,U+094D,U+0930,U+094d,U+0915 + // with Sanskrit 2003 font. + // + // However, note that Ra,Halant,ZWJ is the correct way to + // request eyelash form of Ra, so we wouldbn't inhibit it + // in that sequence. + // + // Test case: U+0924,U+094D,U+0930,U+094d,U+200D,U+0915 + for (var _i15 = start; _i15 + 1 < base; _i15++) { + if (glyphs[_i15].shaperInfo.category === CATEGORIES.Ra && glyphs[_i15 + 1].shaperInfo.category === CATEGORIES.H && (_i15 + 1 === base || glyphs[_i15 + 2].shaperInfo.category === CATEGORIES.ZWJ)) { + glyphs[_i15].features.blwf = true; + glyphs[_i15 + 1].features.blwf = true; + } + } + } + + var prefLen = 2; + + if (features.pref && base + prefLen < end) { + // Find a Halant,Ra sequence and mark it for pre-base reordering processing. + for (var _i16 = base + 1; _i16 + prefLen - 1 < end; _i16++) { + var _g2 = [glyphs[_i16].copy(), glyphs[_i16 + 1].copy()]; + + if (wouldSubstitute(_g2, 'pref')) { + for (var _j4 = 0; _j4 < prefLen; _j4++) { + glyphs[_i16++].features.pref = true; + } // Mark the subsequent stuff with 'cfar'. Used in Khmer. + // Read the feature spec. + // This allows distinguishing the following cases with MS Khmer fonts: + // U+1784,U+17D2,U+179A,U+17D2,U+1782 + // U+1784,U+17D2,U+1782,U+17D2,U+179A + + + if (features.cfar) { + for (; _i16 < end; _i16++) { + glyphs[_i16].features.cfar = true; + } + } + + break; + } + } + } // Apply ZWJ/ZWNJ effects + + + for (var _i17 = start + 1; _i17 < end; _i17++) { + if (isJoiner(glyphs[_i17])) { + var nonJoiner = glyphs[_i17].shaperInfo.category === CATEGORIES.ZWNJ; + var _j5 = _i17; + + do { + _j5--; // ZWJ/ZWNJ should disable CJCT. They do that by simply + // being there, since we don't skip them for the CJCT + // feature (ie. F_MANUAL_ZWJ) + // A ZWNJ disables HALF. + + if (nonJoiner) { + delete glyphs[_j5].features.half; + } + } while (_j5 > start && !isConsonant(glyphs[_j5])); + } + } + } +} + +function finalReordering(font, glyphs, plan) { + var indicConfig = plan.indicConfig; + var features = font._layoutEngine.engine.GSUBProcessor.features; + + for (var start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) { + // 4. Final reordering: + // + // After the localized forms and basic shaping forms GSUB features have been + // applied (see below), the shaping engine performs some final glyph + // reordering before applying all the remaining font features to the entire + // cluster. + var tryPref = !!features.pref; // Find base again + + var base = start; + + for (; base < end; base++) { + if (glyphs[base].shaperInfo.position >= POSITIONS.Base_C) { + if (tryPref && base + 1 < end) { + for (var i = base + 1; i < end; i++) { + if (glyphs[i].features.pref) { + if (!(glyphs[i].substituted && glyphs[i].isLigated && !glyphs[i].isMultiplied)) { + // Ok, this was a 'pref' candidate but didn't form any. + // Base is around here... + base = i; + + while (base < end && isHalantOrCoeng(glyphs[base])) { + base++; + } + + glyphs[base].shaperInfo.position = POSITIONS.BASE_C; + tryPref = false; + } + + break; + } + } + } // For Malayalam, skip over unformed below- (but NOT post-) forms. + + + if (plan.unicodeScript === 'Malayalam') { + for (var _i18 = base + 1; _i18 < end; _i18++) { + while (_i18 < end && isJoiner(glyphs[_i18])) { + _i18++; + } + + if (_i18 === end || !isHalantOrCoeng(glyphs[_i18])) { + break; + } + + _i18++; // Skip halant. + + while (_i18 < end && isJoiner(glyphs[_i18])) { + _i18++; + } + + if (_i18 < end && isConsonant(glyphs[_i18]) && glyphs[_i18].shaperInfo.position === POSITIONS.Below_C) { + base = _i18; + glyphs[base].shaperInfo.position = POSITIONS.Base_C; + } + } + } + + if (start < base && glyphs[base].shaperInfo.position > POSITIONS.Base_C) { + base--; + } + + break; + } + } + + if (base === end && start < base && glyphs[base - 1].shaperInfo.category === CATEGORIES.ZWJ) { + base--; + } + + if (base < end) { + while (start < base && glyphs[base].shaperInfo.category & (CATEGORIES.N | HALANT_OR_COENG_FLAGS)) { + base--; + } + } // o Reorder matras: + // + // If a pre-base matra character had been reordered before applying basic + // features, the glyph can be moved closer to the main consonant based on + // whether half-forms had been formed. Actual position for the matra is + // defined as “after last standalone halant glyph, after initial matra + // position and before the main consonant”. If ZWJ or ZWNJ follow this + // halant, position is moved after it. + // + + + if (start + 1 < end && start < base) { + // Otherwise there can't be any pre-base matra characters. + // If we lost track of base, alas, position before last thingy. + var newPos = base === end ? base - 2 : base - 1; // Malayalam / Tamil do not have "half" forms or explicit virama forms. + // The glyphs formed by 'half' are Chillus or ligated explicit viramas. + // We want to position matra after them. + + if (plan.unicodeScript !== 'Malayalam' && plan.unicodeScript !== 'Tamil') { + while (newPos > start && !(glyphs[newPos].shaperInfo.category & (CATEGORIES.M | HALANT_OR_COENG_FLAGS))) { + newPos--; + } // If we found no Halant we are done. + // Otherwise only proceed if the Halant does + // not belong to the Matra itself! + + + if (isHalantOrCoeng(glyphs[newPos]) && glyphs[newPos].shaperInfo.position !== POSITIONS.Pre_M) { + // If ZWJ or ZWNJ follow this halant, position is moved after it. + if (newPos + 1 < end && isJoiner(glyphs[newPos + 1])) { + newPos++; + } + } else { + newPos = start; // No move. + } + } + + if (start < newPos && glyphs[newPos].shaperInfo.position !== POSITIONS.Pre_M) { + // Now go see if there's actually any matras... + for (var _i19 = newPos; _i19 > start; _i19--) { + if (glyphs[_i19 - 1].shaperInfo.position === POSITIONS.Pre_M) { + var oldPos = _i19 - 1; + + if (oldPos < base && base <= newPos) { + // Shouldn't actually happen. + base--; + } + + var tmp = glyphs[oldPos]; + glyphs.splice.apply(glyphs, [oldPos, 0].concat(glyphs.splice(oldPos + 1, newPos - oldPos))); + glyphs[newPos] = tmp; + newPos--; + } + } + } + } // o Reorder reph: + // + // Reph’s original position is always at the beginning of the syllable, + // (i.e. it is not reordered at the character reordering stage). However, + // it will be reordered according to the basic-forms shaping results. + // Possible positions for reph, depending on the script, are; after main, + // before post-base consonant forms, and after post-base consonant forms. + // Two cases: + // + // - If repha is encoded as a sequence of characters (Ra,H or Ra,H,ZWJ), then + // we should only move it if the sequence ligated to the repha form. + // + // - If repha is encoded separately and in the logical position, we should only + // move it if it did NOT ligate. If it ligated, it's probably the font trying + // to make it work without the reordering. + + + if (start + 1 < end && glyphs[start].shaperInfo.position === POSITIONS.Ra_To_Become_Reph && glyphs[start].shaperInfo.category === CATEGORIES.Repha !== (glyphs[start].isLigated && !glyphs[start].isMultiplied)) { + var newRephPos = void 0; + var rephPos = indicConfig.rephPos; + var found = false; // 1. If reph should be positioned after post-base consonant forms, + // proceed to step 5. + + if (rephPos !== POSITIONS.After_Post) { + // 2. If the reph repositioning class is not after post-base: target + // position is after the first explicit halant glyph between the + // first post-reph consonant and last main consonant. If ZWJ or ZWNJ + // are following this halant, position is moved after it. If such + // position is found, this is the target position. Otherwise, + // proceed to the next step. + // + // Note: in old-implementation fonts, where classifications were + // fixed in shaping engine, there was no case where reph position + // will be found on this step. + newRephPos = start + 1; + + while (newRephPos < base && !isHalantOrCoeng(glyphs[newRephPos])) { + newRephPos++; + } + + if (newRephPos < base && isHalantOrCoeng(glyphs[newRephPos])) { + // ->If ZWJ or ZWNJ are following this halant, position is moved after it. + if (newRephPos + 1 < base && isJoiner(glyphs[newRephPos + 1])) { + newRephPos++; + } + + found = true; + } // 3. If reph should be repositioned after the main consonant: find the + // first consonant not ligated with main, or find the first + // consonant that is not a potential pre-base reordering Ra. + + + if (!found && rephPos === POSITIONS.After_Main) { + newRephPos = base; + + while (newRephPos + 1 < end && glyphs[newRephPos + 1].shaperInfo.position <= POSITIONS.After_Main) { + newRephPos++; + } + + found = newRephPos < end; + } // 4. If reph should be positioned before post-base consonant, find + // first post-base classified consonant not ligated with main. If no + // consonant is found, the target position should be before the + // first matra, syllable modifier sign or vedic sign. + // + // This is our take on what step 4 is trying to say (and failing, BADLY). + + + if (!found && rephPos === POSITIONS.After_Sub) { + newRephPos = base; + + while (newRephPos + 1 < end && !(glyphs[newRephPos + 1].shaperInfo.position & (POSITIONS.Post_C | POSITIONS.After_Post | POSITIONS.SMVD))) { + newRephPos++; + } + + found = newRephPos < end; + } + } // 5. If no consonant is found in steps 3 or 4, move reph to a position + // immediately before the first post-base matra, syllable modifier + // sign or vedic sign that has a reordering class after the intended + // reph position. For example, if the reordering position for reph + // is post-main, it will skip above-base matras that also have a + // post-main position. + + + if (!found) { + // Copied from step 2. + newRephPos = start + 1; + + while (newRephPos < base && !isHalantOrCoeng(glyphs[newRephPos])) { + newRephPos++; + } + + if (newRephPos < base && isHalantOrCoeng(glyphs[newRephPos])) { + // ->If ZWJ or ZWNJ are following this halant, position is moved after it. + if (newRephPos + 1 < base && isJoiner(glyphs[newRephPos + 1])) { + newRephPos++; + } + + found = true; + } + } // 6. Otherwise, reorder reph to the end of the syllable. + + + if (!found) { + newRephPos = end - 1; + + while (newRephPos > start && glyphs[newRephPos].shaperInfo.position === POSITIONS.SMVD) { + newRephPos--; + } // If the Reph is to be ending up after a Matra,Halant sequence, + // position it before that Halant so it can interact with the Matra. + // However, if it's a plain Consonant,Halant we shouldn't do that. + // Uniscribe doesn't do this. + // TEST: U+0930,U+094D,U+0915,U+094B,U+094D + + + if (isHalantOrCoeng(glyphs[newRephPos])) { + for (var _i20 = base + 1; _i20 < newRephPos; _i20++) { + if (glyphs[_i20].shaperInfo.category === CATEGORIES.M) { + newRephPos--; + } + } + } + } + + var reph = glyphs[start]; + glyphs.splice.apply(glyphs, [start, 0].concat(glyphs.splice(start + 1, newRephPos - start))); + glyphs[newRephPos] = reph; + + if (start < base && base <= newRephPos) { + base--; + } + } // o Reorder pre-base reordering consonants: + // + // If a pre-base reordering consonant is found, reorder it according to + // the following rules: + + + if (tryPref && base + 1 < end) { + for (var _i21 = base + 1; _i21 < end; _i21++) { + if (glyphs[_i21].features.pref) { + // 1. Only reorder a glyph produced by substitution during application + // of the feature. (Note that a font may shape a Ra consonant with + // the feature generally but block it in certain contexts.) + // Note: We just check that something got substituted. We don't check that + // the feature actually did it... + // + // Reorder pref only if it ligated. + if (glyphs[_i21].isLigated && !glyphs[_i21].isMultiplied) { + // 2. Try to find a target position the same way as for pre-base matra. + // If it is found, reorder pre-base consonant glyph. + // + // 3. If position is not found, reorder immediately before main + // consonant. + var _newPos = base; // Malayalam / Tamil do not have "half" forms or explicit virama forms. + // The glyphs formed by 'half' are Chillus or ligated explicit viramas. + // We want to position matra after them. + + if (plan.unicodeScript !== 'Malayalam' && plan.unicodeScript !== 'Tamil') { + while (_newPos > start && !(glyphs[_newPos - 1].shaperInfo.category & (CATEGORIES.M | HALANT_OR_COENG_FLAGS))) { + _newPos--; + } // In Khmer coeng model, a H,Ra can go *after* matras. If it goes after a + // split matra, it should be reordered to *before* the left part of such matra. + + + if (_newPos > start && glyphs[_newPos - 1].shaperInfo.category === CATEGORIES.M) { + var _oldPos2 = _i21; + + for (var j = base + 1; j < _oldPos2; j++) { + if (glyphs[j].shaperInfo.category === CATEGORIES.M) { + _newPos--; + break; + } + } + } + } + + if (_newPos > start && isHalantOrCoeng(glyphs[_newPos - 1])) { + // -> If ZWJ or ZWNJ follow this halant, position is moved after it. + if (_newPos < end && isJoiner(glyphs[_newPos])) { + _newPos++; + } + } + + var _oldPos = _i21; + var _tmp = glyphs[_oldPos]; + glyphs.splice.apply(glyphs, [_newPos + 1, 0].concat(glyphs.splice(_newPos, _oldPos - _newPos))); + glyphs[_newPos] = _tmp; + + if (_newPos <= base && base < _oldPos) { + base++; + } + } + + break; + } + } + } // Apply 'init' to the Left Matra if it's a word start. + + + if (glyphs[start].shaperInfo.position === POSITIONS.Pre_M && (!start || !/Cf|Mn/.test(unicode.getCategory(glyphs[start - 1].codePoints[0])))) { + glyphs[start].features.init = true; + } + } +} + +function nextSyllable(glyphs, start) { + if (start >= glyphs.length) return start; + var syllable = glyphs[start].shaperInfo.syllable; + + while (++start < glyphs.length && glyphs[start].shaperInfo.syllable === syllable) { + } + + return start; +} + +var base64DeflatedTrie$3 = "eJwBFg7p8QACAAAAAAAAAAC6EAEFDvrx7Zx7jF9FFcdnd7v7e213uxZaoLwfpqUIRZoYpDEQINGUJmpDFPnD1gc2YrBBjY1KaIiGAhIJhlBjhBqjlTT1GVBjQPkDSAVNikRBBRUjAVGESEjFxPgd75z8zs6eed7XFn4n+WTuY57nzMydmTv3rppQ6hSwFpwDLgQbwWZwubl2XgXuFrANbAc7PP52gl3C9RvBrWA32AO+Db4H7gH3GR5k/n8BHgW/A08L8T0FngGrwAsmb6vM/VWMV8AhoJYo1QXLwApwPHgjOBOsBxvAReAS8G7wPvAB8FGwHewAO8EucAvYDe4Ee8F+cDe4FzwAHga/Br8HfwHPghfBIaAmleqAWbASnABOBWdMFnlfD/c8cKE53wh3M7gcbAHbwMfBp839a+F+AdwMbgNfmxyW/ZuT83VRlv2I7/sVx8n5sRX3fTh/EPwK/AY8NVmU9xnwAngF/DeQn6kppWbACrBqqgh/Ctw14Gxwrrl2Adx3gHeBy6YK3Wq24vhD4GPgk+Bz4PMmzE3G/TLcr4IbWLrfwPm+KX/efhC4H8NPEMf94AA4CJ4w5dL3noT7V/AP8LK59irc8Q7qIFjaCcd/JPwc1yniPBHuanAWWA/WmbQ24PgME9fbjF/NxeyYswnXLwWXWfe3OvwTHzFpn8305vPP/eWi4/gw0rwKXA12dOLj32np90zBzy74uQXs7hT1bQ+Lf6lHH3txbz+4G9zrsKPU/h/oDMv1CI4fA38AT5u09PHfzPFjAXtUod8RI16PjNrPiBEjRowYMWLEiNcC6zrDNYEbIvz/k81d/2XNY78YEf4/CDPRLdZhBnCXgxXgOHCauf4muOu7hf8NcM8HbwfvNPffC3cL2GbOt8PdAXZ23elqf7s890eMGDFiRL2c0zJtl3/EiBH1UHf7/hLGj7d3i/dCd8D9ljCe/E63eLevj++x7t+3CMaff58umF6q1CXgkekwO+Hv55ZfNTM8Xo3jLWAPeBwcMvdWz2KMPjv0twPHe6CDP4ETewgD9vSKsfwdU4X7sDnnDPrwNzZkY3+hn5twbR+7/jyO1w6UuhLsA8+DtdPtP3/aJtReHoTuDph6ehDu48Zeep74bDf9ebrfuGdG+ue8mJGe1CdI4V9G3K925/uj/O73pDeO+tkDc71h2bS/o3B+bK84P7k39H96b34+YvurWFu6yvfmnnzvrbi+AVwENoLN4D3gSXP//Ti+AlwFrjb3PwOuAzeCW8HtLO47cbwX7AM/BD8F94MD4KCQBz0PfwLX/2zu6f00z+H4JcEv+f837o31h+c9HM+Bo/vF+Un9Ym+Jvr8Gx2f33TrT/s/tyzpz6f0C+L8YbAKXgsvAVpP2tn7RZmLtth3+PwWuAdeB68HNLD+34fgr4OvgLvBdVrYQP/KU+1Hk8Wf9dp45Ll0/FMjPYuorq9RBG+n/sj8/3oNG97+F+8d+uXzGluNpT7uz07+r4vIvxvpVhf3L1JO2y5da/uf6zebbt49qr1k3f6lfuIfgKowxpwbF+fRg6PeIgVw2ur+mI5er7vofIrSXLGav2cpB4R4P97TB4VHvbP2H7p8u2DcU70PC2HaxEdvv3NBgXs4azL92TUb+z5mIq4e6Dr+FtWO9v3MDzs8fFO1/HdtvebHxNzD52wT30kGx7/ZyuB8U6oiv7ayO2MuZi877lYP51/je1edQN6/oDMv+CeN+Fu5dnWH+T2VhrjV+rod7sxD3rbi2O7GdtM0xE2NqMcgYY9w6537InWD3l0Rix6cc1+qWxaHxkZBQXRoXIFuNC+HGLXfSQBJTt+quCxM1x1+1TLWdgRISY8vXU9uX2szrScYcLAax88H7vMNdpDGDfXy4SG6dkcZSOfa19Xc46bCpdhcbd4ruq26H3PaufinEa11c8w5+vwq75Oqf8tRhYBobPf+pmh4wS4L/P9fH08ZdatGz6FvMsLBUxlmmsx6LKzZ/5D9nnqhK6GWC2aYbGZey/NnnqYTCKjU/Hck/SYx9SaYN9rm2b0wf0heuucpkp52qo1B7pvtUJ/jcjrc/X9q+suTkOdW+oWMtA+NK9rWF2q99PmP5m1V+iamPoTAutF2WqaId0vx3TqU9w2Lt67NJSp6rsm9u+yWb8j5aqfn9c1VStv3SWDaUBn9OLmModfj0z6n2pWdrTv8cErvt2zqw85lr33E1v3y5om0cepZL5XDpXPKrBP8uf650pOuxdYgLtVU+vuIyrebbn5/Htm/p+eySnHJIa7ChtQnelrvmPLX9peQ3pz2n6kGf+8bLSi3sq/l5yJ40npb0YEvZ9uyT0DOZ+gJu45ixvFSupuzr8kti99d12Fdq/7bYeS1j3zcYcoSPtVKex1W3vxzIHmRPG67TUP+7XMl9HJ//x9i0zvZKYq+VSOsmKfbMyVvVtoyNU6n5eYnNr9RmeV2hukQ2W8r8TDvw1YdUnVI+ctb62mh7Ptv02DV77UkaF5OMK3/cOnxHLZxbdMy9svsRbH0qy82tszk6jImb/MTqW5/PsbC+cpHY+lbMTSm/y78W+51/LuPMtcesrjFt1fbTcU5aLs17JYm1cZ3YwteMXWvINjSG4OcdNVwD9pX3iARUov860BKaK0167vHwrnostQlJ6q4bKUjPUs20kuuLXqfUdWbGXDsSrFBFHzWXmLa9L42OQ3l1vdeYU/Pz0VfDMZUdR1eAx2WXPUe3c2o4FqF4pHS7Rq9LhHz4oLBkvzb2I0h1vO13o6F2XoWe+F63KqUOHeU+X+xrvH+oO30Jnn6KjqpOP1Wq0L9qOP1Q3rTw54Y0dnXNwQgaf/TVcOyhn8ErVTH+mmTQGo4+ttuI/RwmW6WWvy7x9YFN9Iv6uVp1HUjRKa8b9niDsMdqXI4yzLJjm6NNPJNCeLuvT93fUHW7KVv3ctPNDW/D16nK5o9L7HO7buqsA9QOaC2K91N11ksao+v2tdJwjJLnSTMsb672yueY1K6lPl5a/yGovfI2O5lQJpeUDR8at9Y9puU60nZqes+afvZKc0J7XUGyNT2n6+iPQutIMawCxxrXRercoS07cXgblvoYasszzF/d9cZeqyeX+p+Yd25abFu7ym73QXy9YKWH4wy676G9Xa60U/pnLjH9TqyUnVvz/kX7n3VAfqTrXU84aS+bdI3yq+Oj96G0H0HTxrdY0vgxJMeDE9j5hINY+9jrYan2TVl/ibmeGrf9rEwJp+XEiDKmSI5NKZw9PmlCOmEvXpHWrKVrKfHFhAutnUuulE5KvsqWo8r10pT8+MYUIZv57OsKVwVSOetIxzfWipHU+OrKb1k/deqzjXRzbBkjbZeh6fKGpE1bpKRfZ91NycdEzXn26d0eI5bVXxX6b0JCaTWh/6bsnKPvqm2T8+7BNS9wxRlaL3OFzy1DztxC8q8y4kqZj4WkyX6nifretD4k4fbJzVtuuerqQ0PlrcoOrniargex0lT7KVvWtvJQ1iaLoW+osr+14031S+u49r4w6b1HzLdVZeBr3LTGnqv72HBVlyH1eSrt12sSvedR+nbFha4XMWt6VP6c9wtcXO9bU3Gl4xo7SW2CI+1B5u8MUssfg/3e0n6Xyd8D6X0kKd9rUtnbfFdrQ+/gXHt66T2t3gug6/FJavividxxb2599dmb9kXUra/YNKT9D/wdOF2z90PHCE9nZUReqK5K4WP0b9uxah3y9Qz+PNH36P1ele2kx1yyg203Vzjq58htUnL0r+sar3t9JT83aY9+jPD4pW/i+b69MRN3Xd9J1iH2eObkksSuMfgkZk1Cuhfy60rH54/mjnWMr6V8jCu/zqR1o5Q07GtKybpuSuz6Z4+xfXPtKtKra+6UI4tl/aDMHFayX5m5cFNldkld6xJN2LjuOl13/DH60M9O+xts37cg5I/2aoXGa/Z5XZDoOcpALdxrpyW0dzRmLFH1mn3d7bPOdwuHSx6aTjOlnHzOQvsUm2gv9hzGtR/b9b13aF5vyyklaWIecKpq/1+u0n8B7T3PWve6f5PG7dIaW1tI9Ur69pvu0XffKiENab0hdu93Sjox2DZpOn3fPyV97ViHXW5QaqFOae862Sp3fU6aY1atA0orVqpMM9dm9nsW+78I2kb0v0xXf0vvAGLyKPkrq4uU8L72UXVdSEHr0Nf/EgPlHh+XraO5/19TnvOqbWmn5fJD43Bez+1vd3g/XeZ/qEr5+3xXuyPxvatSAX8pUke9Ten37feGVNfITlykfialDvH+PuXby7JlpTEG/1aL/glA5aUxlJ3XkJRt33WVnUT6D4Jd5pg5bC52nsv+F97VblPqOi9/z8pvqpS1f45Oq5QUXfN/eIWeiXZ7qiL9spDod6X6velpKvxPKrtsZfPP7TieEd7X5qWxot3OU/OfW86q+zG7DdN4iOYrVDY+XmhClqiF/yiQkP4hVjWTJh17PKL1pOdycxaubz7pesw4y1d+qV+287zcwdGJUDmXqYVrUUuU+3nkqvNN9Ee+/x7wtXe7TfN2bfcpbaw3cEkdF8bGXeZfjL771NfzPY0p4/jYehTyWwZXf8Olx1x+TGXl6zn0v+uYPUU5dSQmvHIc19kWff95V0oeP1alnxATauG/NmLaepvvUKsYq9Y1/q3z3U9b77FoTOmz25jjehNS5zwmVuy9Kql7MJran9DEHpWY+Jsq82Lc7yGJlEZb7amqcsfoM0X3dFz32oVUjqrjKBvnYmwXZeOosn3W1dar1FvZvPik7nTL5M2Xv6akyfqVk35V+c8NX1X6MemU1XPIbx35Tkm/jrhtSbGdJLn1wCX/A8o3qJ4="; + +function _createForOfIteratorHelperLoose$g(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$g(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$g(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$g(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$g(o, minLen); } + +function _arrayLikeToArray$g(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _inheritsLoose$6(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +function _defineProperty$3(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +// we may be running in a browser so we make an Uint8Array + +var useData$1 = JSON.parse(String.fromCharCode.apply(String, pako__WEBPACK_IMPORTED_MODULE_0___default().inflate(base64Arraybuffer_2(base64DeflatedUseData)))); +var trieData$3 = pako__WEBPACK_IMPORTED_MODULE_0___default().inflate(base64Arraybuffer_2(base64DeflatedTrie$3)); +var categories = useData$1.categories, + decompositions$1 = useData$1.decompositions; +var trie$3 = new unicodeTrie(trieData$3); +var stateMachine$1 = new dfa(useData$1); +/** + * This shaper is an implementation of the Universal Shaping Engine, which + * uses Unicode data to shape a number of scripts without a dedicated shaping engine. + * See https://www.microsoft.com/typography/OpenTypeDev/USE/intro.htm. + */ + +var UniversalShaper = /*#__PURE__*/function (_DefaultShaper) { + _inheritsLoose$6(UniversalShaper, _DefaultShaper); + + function UniversalShaper() { + return _DefaultShaper.apply(this, arguments) || this; + } + + UniversalShaper.planFeatures = function planFeatures(plan) { + plan.addStage(setupSyllables$1); // Default glyph pre-processing group + + plan.addStage(['locl', 'ccmp', 'nukt', 'akhn']); // Reordering group + + plan.addStage(clearSubstitutionFlags); + plan.addStage(['rphf'], false); + plan.addStage(recordRphf); + plan.addStage(clearSubstitutionFlags); + plan.addStage(['pref']); + plan.addStage(recordPref); // Orthographic unit shaping group + + plan.addStage(['rkrf', 'abvf', 'blwf', 'half', 'pstf', 'vatu', 'cjct']); + plan.addStage(reorder); // Topographical features + // Scripts that need this are handled by the Arabic shaper, not implemented here for now. + // plan.addStage(['isol', 'init', 'medi', 'fina', 'med2', 'fin2', 'fin3'], false); + // Standard topographic presentation and positional feature application + + plan.addStage(['abvs', 'blws', 'pres', 'psts', 'dist', 'abvm', 'blwm']); + }; + + UniversalShaper.assignFeatures = function assignFeatures(plan, glyphs) { + var _loop = function _loop(i) { + var codepoint = glyphs[i].codePoints[0]; + + if (decompositions$1[codepoint]) { + var decomposed = decompositions$1[codepoint].map(function (c) { + var g = plan.font.glyphForCodePoint(c); + return new GlyphInfo(plan.font, g.id, [c], glyphs[i].features); + }); + glyphs.splice.apply(glyphs, [i, 1].concat(decomposed)); + } + }; + + // Decompose split vowels + // TODO: do this in a more general unicode normalizer + for (var i = glyphs.length - 1; i >= 0; i--) { + _loop(i); + } + }; + + return UniversalShaper; +}(DefaultShaper); + +_defineProperty$3(UniversalShaper, "zeroMarkWidths", 'BEFORE_GPOS'); + +function useCategory(glyph) { + return trie$3.get(glyph.codePoints[0]); +} + +var USEInfo = function USEInfo(category, syllableType, syllable) { + this.category = category; + this.syllableType = syllableType; + this.syllable = syllable; +}; + +function setupSyllables$1(font, glyphs) { + var syllable = 0; + + for (var _iterator = _createForOfIteratorHelperLoose$g(stateMachine$1.match(glyphs.map(useCategory))), _step; !(_step = _iterator()).done;) { + var _step$value = _step.value, + start = _step$value[0], + end = _step$value[1], + tags = _step$value[2]; + ++syllable; // Create shaper info + + for (var i = start; i <= end; i++) { + glyphs[i].shaperInfo = new USEInfo(categories[useCategory(glyphs[i])], tags[0], syllable); + } // Assign rphf feature + + + var limit = glyphs[start].shaperInfo.category === 'R' ? 1 : Math.min(3, end - start); + + for (var _i = start; _i < start + limit; _i++) { + glyphs[_i].features.rphf = true; + } + } +} + +function clearSubstitutionFlags(font, glyphs) { + for (var _iterator2 = _createForOfIteratorHelperLoose$g(glyphs), _step2; !(_step2 = _iterator2()).done;) { + var glyph = _step2.value; + glyph.substituted = false; + } +} + +function recordRphf(font, glyphs) { + for (var _iterator3 = _createForOfIteratorHelperLoose$g(glyphs), _step3; !(_step3 = _iterator3()).done;) { + var glyph = _step3.value; + + if (glyph.substituted && glyph.features.rphf) { + // Mark a substituted repha. + glyph.shaperInfo.category = 'R'; + } + } +} + +function recordPref(font, glyphs) { + for (var _iterator4 = _createForOfIteratorHelperLoose$g(glyphs), _step4; !(_step4 = _iterator4()).done;) { + var glyph = _step4.value; + + if (glyph.substituted) { + // Mark a substituted pref as VPre, as they behave the same way. + glyph.shaperInfo.category = 'VPre'; + } + } +} + +function reorder(font, glyphs) { + var dottedCircle = font.glyphForCodePoint(0x25cc).id; + + for (var start = 0, end = nextSyllable$1(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable$1(glyphs, start)) { + var i = void 0, + j = void 0; + var info = glyphs[start].shaperInfo; + var type = info.syllableType; // Only a few syllable types need reordering. + + if (type !== 'virama_terminated_cluster' && type !== 'standard_cluster' && type !== 'broken_cluster') { + continue; + } // Insert a dotted circle glyph in broken clusters. + + + if (type === 'broken_cluster' && dottedCircle) { + var g = new GlyphInfo(font, dottedCircle, [0x25cc]); + g.shaperInfo = info; // Insert after possible Repha. + + for (i = start; i < end && glyphs[i].shaperInfo.category === 'R'; i++) { + } + + glyphs.splice(++i, 0, g); + end++; + } // Move things forward. + + + if (info.category === 'R' && end - start > 1) { + // Got a repha. Reorder it to after first base, before first halant. + for (i = start + 1; i < end; i++) { + info = glyphs[i].shaperInfo; + + if (isBase(info) || isHalant(glyphs[i])) { + // If we hit a halant, move before it; otherwise it's a base: move to it's + // place, and shift things in between backward. + if (isHalant(glyphs[i])) { + i--; + } + + glyphs.splice.apply(glyphs, [start, 0].concat(glyphs.splice(start + 1, i - start), [glyphs[i]])); + break; + } + } + } // Move things back. + + + for (i = start, j = end; i < end; i++) { + info = glyphs[i].shaperInfo; + + if (isBase(info) || isHalant(glyphs[i])) { + // If we hit a halant, move after it; otherwise it's a base: move to it's + // place, and shift things in between backward. + j = isHalant(glyphs[i]) ? i + 1 : i; + } else if ((info.category === 'VPre' || info.category === 'VMPre') && j < i) { + glyphs.splice.apply(glyphs, [j, 1, glyphs[i]].concat(glyphs.splice(j, i - j))); + } + } + } +} + +function nextSyllable$1(glyphs, start) { + if (start >= glyphs.length) return start; + var syllable = glyphs[start].shaperInfo.syllable; + + while (++start < glyphs.length && glyphs[start].shaperInfo.syllable === syllable) { + } + + return start; +} + +function isHalant(glyph) { + return glyph.shaperInfo.category === 'H' && !glyph.isLigated; +} + +function isBase(info) { + return info.category === 'B' || info.category === 'GB'; +} + +function _createForOfIteratorHelperLoose$h(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$h(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$h(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$h(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$h(o, minLen); } + +function _arrayLikeToArray$h(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +var SHAPERS = { + arab: ArabicShaper, + // Arabic + mong: ArabicShaper, + // Mongolian + syrc: ArabicShaper, + // Syriac + 'nko ': ArabicShaper, + // N'Ko + phag: ArabicShaper, + // Phags Pa + mand: ArabicShaper, + // Mandaic + mani: ArabicShaper, + // Manichaean + phlp: ArabicShaper, + // Psalter Pahlavi + hang: HangulShaper, + // Hangul + bng2: IndicShaper, + // Bengali + beng: IndicShaper, + // Bengali + dev2: IndicShaper, + // Devanagari + deva: IndicShaper, + // Devanagari + gjr2: IndicShaper, + // Gujarati + gujr: IndicShaper, + // Gujarati + guru: IndicShaper, + // Gurmukhi + gur2: IndicShaper, + // Gurmukhi + knda: IndicShaper, + // Kannada + knd2: IndicShaper, + // Kannada + mlm2: IndicShaper, + // Malayalam + mlym: IndicShaper, + // Malayalam + ory2: IndicShaper, + // Oriya + orya: IndicShaper, + // Oriya + taml: IndicShaper, + // Tamil + tml2: IndicShaper, + // Tamil + telu: IndicShaper, + // Telugu + tel2: IndicShaper, + // Telugu + khmr: IndicShaper, + // Khmer + bali: UniversalShaper, + // Balinese + batk: UniversalShaper, + // Batak + brah: UniversalShaper, + // Brahmi + bugi: UniversalShaper, + // Buginese + buhd: UniversalShaper, + // Buhid + cakm: UniversalShaper, + // Chakma + cham: UniversalShaper, + // Cham + dupl: UniversalShaper, + // Duployan + egyp: UniversalShaper, + // Egyptian Hieroglyphs + gran: UniversalShaper, + // Grantha + hano: UniversalShaper, + // Hanunoo + java: UniversalShaper, + // Javanese + kthi: UniversalShaper, + // Kaithi + kali: UniversalShaper, + // Kayah Li + khar: UniversalShaper, + // Kharoshthi + khoj: UniversalShaper, + // Khojki + sind: UniversalShaper, + // Khudawadi + lepc: UniversalShaper, + // Lepcha + limb: UniversalShaper, + // Limbu + mahj: UniversalShaper, + // Mahajani + // mand: UniversalShaper, // Mandaic + // mani: UniversalShaper, // Manichaean + mtei: UniversalShaper, + // Meitei Mayek + modi: UniversalShaper, + // Modi + // mong: UniversalShaper, // Mongolian + // 'nko ': UniversalShaper, // N’Ko + hmng: UniversalShaper, + // Pahawh Hmong + // phag: UniversalShaper, // Phags-pa + // phlp: UniversalShaper, // Psalter Pahlavi + rjng: UniversalShaper, + // Rejang + saur: UniversalShaper, + // Saurashtra + shrd: UniversalShaper, + // Sharada + sidd: UniversalShaper, + // Siddham + sinh: UniversalShaper, + // Sinhala + sund: UniversalShaper, + // Sundanese + sylo: UniversalShaper, + // Syloti Nagri + tglg: UniversalShaper, + // Tagalog + tagb: UniversalShaper, + // Tagbanwa + tale: UniversalShaper, + // Tai Le + lana: UniversalShaper, + // Tai Tham + tavt: UniversalShaper, + // Tai Viet + takr: UniversalShaper, + // Takri + tibt: UniversalShaper, + // Tibetan + tfng: UniversalShaper, + // Tifinagh + tirh: UniversalShaper, + // Tirhuta + latn: DefaultShaper, + // Latin + DFLT: DefaultShaper // Default + +}; +function choose(script) { + if (!Array.isArray(script)) { + script = [script]; + } + + for (var _iterator = _createForOfIteratorHelperLoose$h(script), _step; !(_step = _iterator()).done;) { + var s = _step.value; + var shaper = SHAPERS[s]; + + if (shaper) { + return shaper; + } + } + + return DefaultShaper; +} + +function _createForOfIteratorHelperLoose$i(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$i(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$i(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$i(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$i(o, minLen); } + +function _arrayLikeToArray$i(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _inheritsLoose$7(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var GSUBProcessor = /*#__PURE__*/function (_OTProcessor) { + _inheritsLoose$7(GSUBProcessor, _OTProcessor); + + function GSUBProcessor() { + return _OTProcessor.apply(this, arguments) || this; + } + + var _proto = GSUBProcessor.prototype; + + _proto.applyLookup = function applyLookup(lookupType, table) { + var _this = this; + + switch (lookupType) { + case 1: + { + // Single Substitution + var index = this.coverageIndex(table.coverage); + + if (index === -1) { + return false; + } + + var glyph = this.glyphIterator.cur; + + switch (table.version) { + case 1: + glyph.id = glyph.id + table.deltaGlyphID & 0xffff; + break; + + case 2: + glyph.id = table.substitute.get(index); + break; + } + + return true; + } + + case 2: + { + // Multiple Substitution + var _index = this.coverageIndex(table.coverage); + + if (_index !== -1) { + var _this$glyphs; + + var sequence = table.sequences.get(_index); + this.glyphIterator.cur.id = sequence[0]; + this.glyphIterator.cur.ligatureComponent = 0; + var features = this.glyphIterator.cur.features; + var curGlyph = this.glyphIterator.cur; + var replacement = sequence.slice(1).map(function (gid, i) { + var glyph = new GlyphInfo(_this.font, gid, undefined, features); + glyph.shaperInfo = curGlyph.shaperInfo; + glyph.isLigated = curGlyph.isLigated; + glyph.ligatureComponent = i + 1; + glyph.substituted = true; + glyph.isMultiplied = true; + return glyph; + }); + + (_this$glyphs = this.glyphs).splice.apply(_this$glyphs, [this.glyphIterator.index + 1, 0].concat(replacement)); + + return true; + } + + return false; + } + + case 3: + { + // Alternate Substitution + var _index2 = this.coverageIndex(table.coverage); + + if (_index2 !== -1) { + var USER_INDEX = 0; // TODO + + this.glyphIterator.cur.id = table.alternateSet.get(_index2)[USER_INDEX]; + return true; + } + + return false; + } + + case 4: + { + // Ligature Substitution + var _index3 = this.coverageIndex(table.coverage); + + if (_index3 === -1) { + return false; + } + + for (var _iterator = _createForOfIteratorHelperLoose$i(table.ligatureSets.get(_index3)), _step; !(_step = _iterator()).done;) { + var ligature = _step.value; + var matched = this.sequenceMatchIndices(1, ligature.components); + + if (!matched) { + continue; + } + + var _curGlyph = this.glyphIterator.cur; // Concatenate all of the characters the new ligature will represent + + var characters = _curGlyph.codePoints.slice(); + + for (var _iterator2 = _createForOfIteratorHelperLoose$i(matched), _step2; !(_step2 = _iterator2()).done;) { + var _index4 = _step2.value; + characters.push.apply(characters, this.glyphs[_index4].codePoints); + } // Create the replacement ligature glyph + + + var ligatureGlyph = new GlyphInfo(this.font, ligature.glyph, characters, _curGlyph.features); + ligatureGlyph.shaperInfo = _curGlyph.shaperInfo; + ligatureGlyph.isLigated = true; + ligatureGlyph.substituted = true; // From Harfbuzz: + // - If it *is* a mark ligature, we don't allocate a new ligature id, and leave + // the ligature to keep its old ligature id. This will allow it to attach to + // a base ligature in GPOS. Eg. if the sequence is: LAM,LAM,SHADDA,FATHA,HEH, + // and LAM,LAM,HEH for a ligature, they will leave SHADDA and FATHA with a + // ligature id and component value of 2. Then if SHADDA,FATHA form a ligature + // later, we don't want them to lose their ligature id/component, otherwise + // GPOS will fail to correctly position the mark ligature on top of the + // LAM,LAM,HEH ligature. See https://bugzilla.gnome.org/show_bug.cgi?id=676343 + // + // - If a ligature is formed of components that some of which are also ligatures + // themselves, and those ligature components had marks attached to *their* + // components, we have to attach the marks to the new ligature component + // positions! Now *that*'s tricky! And these marks may be following the + // last component of the whole sequence, so we should loop forward looking + // for them and update them. + // + // Eg. the sequence is LAM,LAM,SHADDA,FATHA,HEH, and the font first forms a + // 'calt' ligature of LAM,HEH, leaving the SHADDA and FATHA with a ligature + // id and component == 1. Now, during 'liga', the LAM and the LAM-HEH ligature + // form a LAM-LAM-HEH ligature. We need to reassign the SHADDA and FATHA to + // the new ligature with a component value of 2. + // + // This in fact happened to a font... See https://bugzilla.gnome.org/show_bug.cgi?id=437633 + + var isMarkLigature = _curGlyph.isMark; + + for (var i = 0; i < matched.length && isMarkLigature; i++) { + isMarkLigature = this.glyphs[matched[i]].isMark; + } + + ligatureGlyph.ligatureID = isMarkLigature ? null : this.ligatureID++; + var lastLigID = _curGlyph.ligatureID; + var lastNumComps = _curGlyph.codePoints.length; + var curComps = lastNumComps; + var idx = this.glyphIterator.index + 1; // Set ligatureID and ligatureComponent on glyphs that were skipped in the matched sequence. + // This allows GPOS to attach marks to the correct ligature components. + + for (var _iterator3 = _createForOfIteratorHelperLoose$i(matched), _step3; !(_step3 = _iterator3()).done;) { + var matchIndex = _step3.value; + + // Don't assign new ligature components for mark ligatures (see above) + if (isMarkLigature) { + idx = matchIndex; + } else { + while (idx < matchIndex) { + var ligatureComponent = curComps - lastNumComps + Math.min(this.glyphs[idx].ligatureComponent || 1, lastNumComps); + this.glyphs[idx].ligatureID = ligatureGlyph.ligatureID; + this.glyphs[idx].ligatureComponent = ligatureComponent; + idx++; + } + } + + lastLigID = this.glyphs[idx].ligatureID; + lastNumComps = this.glyphs[idx].codePoints.length; + curComps += lastNumComps; + idx++; // skip base glyph + } // Adjust ligature components for any marks following + + + if (lastLigID && !isMarkLigature) { + for (var _i = idx; _i < this.glyphs.length; _i++) { + if (this.glyphs[_i].ligatureID === lastLigID) { + var ligatureComponent = curComps - lastNumComps + Math.min(this.glyphs[_i].ligatureComponent || 1, lastNumComps); + this.glyphs[_i].ligatureComponent = ligatureComponent; + } else { + break; + } + } + } // Delete the matched glyphs, and replace the current glyph with the ligature glyph + + + for (var _i2 = matched.length - 1; _i2 >= 0; _i2--) { + this.glyphs.splice(matched[_i2], 1); + } + + this.glyphs[this.glyphIterator.index] = ligatureGlyph; + return true; + } + + return false; + } + + case 5: + // Contextual Substitution + return this.applyContext(table); + + case 6: + // Chaining Contextual Substitution + return this.applyChainingContext(table); + + case 7: + // Extension Substitution + return this.applyLookup(table.lookupType, table.extension); + + default: + throw new Error("GSUB lookupType " + lookupType + " is not supported"); + } + }; + + return GSUBProcessor; +}(OTProcessor); + +function _createForOfIteratorHelperLoose$j(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$j(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$j(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$j(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$j(o, minLen); } + +function _arrayLikeToArray$j(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _inheritsLoose$8(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var GPOSProcessor = /*#__PURE__*/function (_OTProcessor) { + _inheritsLoose$8(GPOSProcessor, _OTProcessor); + + function GPOSProcessor() { + return _OTProcessor.apply(this, arguments) || this; + } + + var _proto = GPOSProcessor.prototype; + + _proto.applyPositionValue = function applyPositionValue(sequenceIndex, value) { + var position = this.positions[this.glyphIterator.peekIndex(sequenceIndex)]; + + if (value.xAdvance != null) { + position.xAdvance += value.xAdvance; + } + + if (value.yAdvance != null) { + position.yAdvance += value.yAdvance; + } + + if (value.xPlacement != null) { + position.xOffset += value.xPlacement; + } + + if (value.yPlacement != null) { + position.yOffset += value.yPlacement; + } // Adjustments for font variations + + + var variationProcessor = this.font._variationProcessor; + var variationStore = this.font.GDEF && this.font.GDEF.itemVariationStore; + + if (variationProcessor && variationStore) { + if (value.xPlaDevice) { + position.xOffset += variationProcessor.getDelta(variationStore, value.xPlaDevice.a, value.xPlaDevice.b); + } + + if (value.yPlaDevice) { + position.yOffset += variationProcessor.getDelta(variationStore, value.yPlaDevice.a, value.yPlaDevice.b); + } + + if (value.xAdvDevice) { + position.xAdvance += variationProcessor.getDelta(variationStore, value.xAdvDevice.a, value.xAdvDevice.b); + } + + if (value.yAdvDevice) { + position.yAdvance += variationProcessor.getDelta(variationStore, value.yAdvDevice.a, value.yAdvDevice.b); + } + } // TODO: device tables + + }; + + _proto.applyLookup = function applyLookup(lookupType, table) { + switch (lookupType) { + case 1: + { + // Single positioning value + var index = this.coverageIndex(table.coverage); + + if (index === -1) { + return false; + } + + switch (table.version) { + case 1: + this.applyPositionValue(0, table.value); + break; + + case 2: + this.applyPositionValue(0, table.values.get(index)); + break; + } + + return true; + } + + case 2: + { + // Pair Adjustment Positioning + var nextGlyph = this.glyphIterator.peek(); + + if (!nextGlyph) { + return false; + } + + var _index = this.coverageIndex(table.coverage); + + if (_index === -1) { + return false; + } + + switch (table.version) { + case 1: + // Adjustments for glyph pairs + var set = table.pairSets.get(_index); + + for (var _iterator = _createForOfIteratorHelperLoose$j(set), _step; !(_step = _iterator()).done;) { + var _pair = _step.value; + + if (_pair.secondGlyph === nextGlyph.id) { + this.applyPositionValue(0, _pair.value1); + this.applyPositionValue(1, _pair.value2); + return true; + } + } + + return false; + + case 2: + // Class pair adjustment + var class1 = this.getClassID(this.glyphIterator.cur.id, table.classDef1); + var class2 = this.getClassID(nextGlyph.id, table.classDef2); + + if (class1 === -1 || class2 === -1) { + return false; + } + + var pair = table.classRecords.get(class1).get(class2); + this.applyPositionValue(0, pair.value1); + this.applyPositionValue(1, pair.value2); + return true; + } + } + + case 3: + { + // Cursive Attachment Positioning + var nextIndex = this.glyphIterator.peekIndex(); + var _nextGlyph = this.glyphs[nextIndex]; + + if (!_nextGlyph) { + return false; + } + + var curRecord = table.entryExitRecords[this.coverageIndex(table.coverage)]; + + if (!curRecord || !curRecord.exitAnchor) { + return false; + } + + var nextRecord = table.entryExitRecords[this.coverageIndex(table.coverage, _nextGlyph.id)]; + + if (!nextRecord || !nextRecord.entryAnchor) { + return false; + } + + var entry = this.getAnchor(nextRecord.entryAnchor); + var exit = this.getAnchor(curRecord.exitAnchor); + var cur = this.positions[this.glyphIterator.index]; + var next = this.positions[nextIndex]; + + switch (this.direction) { + case 'ltr': + cur.xAdvance = exit.x + cur.xOffset; + var d = entry.x + next.xOffset; + next.xAdvance -= d; + next.xOffset -= d; + break; + + case 'rtl': + d = exit.x + cur.xOffset; + cur.xAdvance -= d; + cur.xOffset -= d; + next.xAdvance = entry.x + next.xOffset; + break; + } + + if (this.glyphIterator.flags.rightToLeft) { + this.glyphIterator.cur.cursiveAttachment = nextIndex; + cur.yOffset = entry.y - exit.y; + } else { + _nextGlyph.cursiveAttachment = this.glyphIterator.index; + cur.yOffset = exit.y - entry.y; + } + + return true; + } + + case 4: + { + // Mark to base positioning + var markIndex = this.coverageIndex(table.markCoverage); + + if (markIndex === -1) { + return false; + } // search backward for a base glyph + + + var baseGlyphIndex = this.glyphIterator.index; + + while (--baseGlyphIndex >= 0 && (this.glyphs[baseGlyphIndex].isMark || this.glyphs[baseGlyphIndex].ligatureComponent > 0)) { + } + + if (baseGlyphIndex < 0) { + return false; + } + + var baseIndex = this.coverageIndex(table.baseCoverage, this.glyphs[baseGlyphIndex].id); + + if (baseIndex === -1) { + return false; + } + + var markRecord = table.markArray[markIndex]; + var baseAnchor = table.baseArray[baseIndex][markRecord["class"]]; + this.applyAnchor(markRecord, baseAnchor, baseGlyphIndex); + return true; + } + + case 5: + { + // Mark to ligature positioning + var _markIndex = this.coverageIndex(table.markCoverage); + + if (_markIndex === -1) { + return false; + } // search backward for a base glyph + + + var _baseGlyphIndex = this.glyphIterator.index; + + while (--_baseGlyphIndex >= 0 && this.glyphs[_baseGlyphIndex].isMark) { + } + + if (_baseGlyphIndex < 0) { + return false; + } + + var ligIndex = this.coverageIndex(table.ligatureCoverage, this.glyphs[_baseGlyphIndex].id); + + if (ligIndex === -1) { + return false; + } + + var ligAttach = table.ligatureArray[ligIndex]; + var markGlyph = this.glyphIterator.cur; + var ligGlyph = this.glyphs[_baseGlyphIndex]; + var compIndex = ligGlyph.ligatureID && ligGlyph.ligatureID === markGlyph.ligatureID && markGlyph.ligatureComponent > 0 ? Math.min(markGlyph.ligatureComponent, ligGlyph.codePoints.length) - 1 : ligGlyph.codePoints.length - 1; + var _markRecord = table.markArray[_markIndex]; + var _baseAnchor = ligAttach[compIndex][_markRecord["class"]]; + this.applyAnchor(_markRecord, _baseAnchor, _baseGlyphIndex); + return true; + } + + case 6: + { + // Mark to mark positioning + var mark1Index = this.coverageIndex(table.mark1Coverage); + + if (mark1Index === -1) { + return false; + } // get the previous mark to attach to + + + var prevIndex = this.glyphIterator.peekIndex(-1); + var prev = this.glyphs[prevIndex]; + + if (!prev || !prev.isMark) { + return false; + } + + var _cur = this.glyphIterator.cur; // The following logic was borrowed from Harfbuzz + + var good = false; + + if (_cur.ligatureID === prev.ligatureID) { + if (!_cur.ligatureID) { + // Marks belonging to the same base + good = true; + } else if (_cur.ligatureComponent === prev.ligatureComponent) { + // Marks belonging to the same ligature component + good = true; + } + } else { + // If ligature ids don't match, it may be the case that one of the marks + // itself is a ligature, in which case match. + if (_cur.ligatureID && !_cur.ligatureComponent || prev.ligatureID && !prev.ligatureComponent) { + good = true; + } + } + + if (!good) { + return false; + } + + var mark2Index = this.coverageIndex(table.mark2Coverage, prev.id); + + if (mark2Index === -1) { + return false; + } + + var _markRecord2 = table.mark1Array[mark1Index]; + var _baseAnchor2 = table.mark2Array[mark2Index][_markRecord2["class"]]; + this.applyAnchor(_markRecord2, _baseAnchor2, prevIndex); + return true; + } + + case 7: + // Contextual positioning + return this.applyContext(table); + + case 8: + // Chaining contextual positioning + return this.applyChainingContext(table); + + case 9: + // Extension positioning + return this.applyLookup(table.lookupType, table.extension); + + default: + throw new Error("Unsupported GPOS table: " + lookupType); + } + }; + + _proto.applyAnchor = function applyAnchor(markRecord, baseAnchor, baseGlyphIndex) { + var baseCoords = this.getAnchor(baseAnchor); + var markCoords = this.getAnchor(markRecord.markAnchor); + var basePos = this.positions[baseGlyphIndex]; + var markPos = this.positions[this.glyphIterator.index]; + markPos.xOffset = baseCoords.x - markCoords.x; + markPos.yOffset = baseCoords.y - markCoords.y; + this.glyphIterator.cur.markAttachment = baseGlyphIndex; + }; + + _proto.getAnchor = function getAnchor(anchor) { + // TODO: contour point, device tables + var x = anchor.xCoordinate; + var y = anchor.yCoordinate; // Adjustments for font variations + + var variationProcessor = this.font._variationProcessor; + var variationStore = this.font.GDEF && this.font.GDEF.itemVariationStore; + + if (variationProcessor && variationStore) { + if (anchor.xDeviceTable) { + x += variationProcessor.getDelta(variationStore, anchor.xDeviceTable.a, anchor.xDeviceTable.b); + } + + if (anchor.yDeviceTable) { + y += variationProcessor.getDelta(variationStore, anchor.yDeviceTable.a, anchor.yDeviceTable.b); + } + } + + return { + x: x, + y: y + }; + }; + + _proto.applyFeatures = function applyFeatures(userFeatures, glyphs, advances) { + _OTProcessor.prototype.applyFeatures.call(this, userFeatures, glyphs, advances); + + for (var i = 0; i < this.glyphs.length; i++) { + this.fixCursiveAttachment(i); + } + + this.fixMarkAttachment(); + }; + + _proto.fixCursiveAttachment = function fixCursiveAttachment(i) { + var glyph = this.glyphs[i]; + + if (glyph.cursiveAttachment != null) { + var j = glyph.cursiveAttachment; + glyph.cursiveAttachment = null; + this.fixCursiveAttachment(j); + this.positions[i].yOffset += this.positions[j].yOffset; + } + }; + + _proto.fixMarkAttachment = function fixMarkAttachment() { + for (var i = 0; i < this.glyphs.length; i++) { + var glyph = this.glyphs[i]; + + if (glyph.markAttachment != null) { + var j = glyph.markAttachment; + this.positions[i].xOffset += this.positions[j].xOffset; + this.positions[i].yOffset += this.positions[j].yOffset; + + if (this.direction === 'ltr') { + for (var k = j; k < i; k++) { + this.positions[i].xOffset -= this.positions[k].xAdvance; + this.positions[i].yOffset -= this.positions[k].yAdvance; + } + } else { + for (var _k = j + 1; _k < i + 1; _k++) { + this.positions[i].xOffset += this.positions[_k].xAdvance; + this.positions[i].yOffset += this.positions[_k].yAdvance; + } + } + } + } + }; + + return GPOSProcessor; +}(OTProcessor); + +var OTLayoutEngine = /*#__PURE__*/function () { + function OTLayoutEngine(font) { + this.font = font; + this.glyphInfos = null; + this.plan = null; + this.GSUBProcessor = null; + this.GPOSProcessor = null; + this.fallbackPosition = true; + + if (font.GSUB) { + this.GSUBProcessor = new GSUBProcessor(font, font.GSUB); + } + + if (font.GPOS) { + this.GPOSProcessor = new GPOSProcessor(font, font.GPOS); + } + } + + var _proto = OTLayoutEngine.prototype; + + _proto.setup = function setup(glyphRun) { + var _this = this; + + // Map glyphs to GlyphInfo objects so data can be passed between + // GSUB and GPOS without mutating the real (shared) Glyph objects. + this.glyphInfos = glyphRun.glyphs.map(function (glyph) { + return new GlyphInfo(_this.font, glyph.id, [].concat(glyph.codePoints)); + }); // Select a script based on what is available in GSUB/GPOS. + + var script = null; + + if (this.GPOSProcessor) { + script = this.GPOSProcessor.selectScript(glyphRun.script, glyphRun.language, glyphRun.direction); + } + + if (this.GSUBProcessor) { + script = this.GSUBProcessor.selectScript(glyphRun.script, glyphRun.language, glyphRun.direction); + } // Choose a shaper based on the script, and setup a shaping plan. + // This determines which features to apply to which glyphs. + + + this.shaper = choose(script); + this.plan = new ShapingPlan(this.font, script, glyphRun.direction); + this.shaper.plan(this.plan, this.glyphInfos, glyphRun.features); // Assign chosen features to output glyph run + + for (var key in this.plan.allFeatures) { + glyphRun.features[key] = true; + } + }; + + _proto.substitute = function substitute(glyphRun) { + var _this2 = this; + + if (this.GSUBProcessor) { + this.plan.process(this.GSUBProcessor, this.glyphInfos); // Map glyph infos back to normal Glyph objects + + glyphRun.glyphs = this.glyphInfos.map(function (glyphInfo) { + return _this2.font.getGlyph(glyphInfo.id, glyphInfo.codePoints); + }); + } + }; + + _proto.position = function position(glyphRun) { + if (this.shaper.zeroMarkWidths === 'BEFORE_GPOS') { + this.zeroMarkAdvances(glyphRun.positions); + } + + if (this.GPOSProcessor) { + this.plan.process(this.GPOSProcessor, this.glyphInfos, glyphRun.positions); + } + + if (this.shaper.zeroMarkWidths === 'AFTER_GPOS') { + this.zeroMarkAdvances(glyphRun.positions); + } // Reverse the glyphs and positions if the script is right-to-left + + + if (glyphRun.direction === 'rtl') { + glyphRun.glyphs.reverse(); + glyphRun.positions.reverse(); + } + + return this.GPOSProcessor && this.GPOSProcessor.features; + }; + + _proto.zeroMarkAdvances = function zeroMarkAdvances(positions) { + for (var i = 0; i < this.glyphInfos.length; i++) { + if (this.glyphInfos[i].isMark) { + positions[i].xAdvance = 0; + positions[i].yAdvance = 0; + } + } + }; + + _proto.cleanup = function cleanup() { + this.glyphInfos = null; + this.plan = null; + this.shaper = null; + }; + + _proto.getAvailableFeatures = function getAvailableFeatures(script, language) { + var features = []; + + if (this.GSUBProcessor) { + this.GSUBProcessor.selectScript(script, language); + features.push.apply(features, Object.keys(this.GSUBProcessor.features)); + } + + if (this.GPOSProcessor) { + this.GPOSProcessor.selectScript(script, language); + features.push.apply(features, Object.keys(this.GPOSProcessor.features)); + } + + return features; + }; + + return OTLayoutEngine; +}(); + +function _createForOfIteratorHelperLoose$k(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$k(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$k(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$k(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$k(o, minLen); } + +function _arrayLikeToArray$k(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var LayoutEngine = /*#__PURE__*/function () { + function LayoutEngine(font) { + this.font = font; + this.unicodeLayoutEngine = null; + this.kernProcessor = null; // Choose an advanced layout engine. We try the AAT morx table first since more + // scripts are currently supported because the shaping logic is built into the font. + + if (this.font.morx) { + this.engine = new AATLayoutEngine(this.font); + } else if (this.font.GSUB || this.font.GPOS) { + this.engine = new OTLayoutEngine(this.font); + } + } + + var _proto = LayoutEngine.prototype; + + _proto.layout = function layout(string, features, script, language, direction) { + // Make the features parameter optional + if (typeof features === 'string') { + direction = language; + language = script; + script = features; + features = []; + } // Map string to glyphs if needed + + + if (typeof string === 'string') { + // Attempt to detect the script from the string if not provided. + if (script == null) { + script = forString(string); + } + + var glyphs = this.font.glyphsForString(string); + } else { + // Attempt to detect the script from the glyph code points if not provided. + if (script == null) { + var codePoints = []; + + for (var _iterator = _createForOfIteratorHelperLoose$k(string), _step; !(_step = _iterator()).done;) { + var glyph = _step.value; + codePoints.push.apply(codePoints, glyph.codePoints); + } + + script = forCodePoints(codePoints); + } + + var glyphs = string; + } + + var glyphRun = new GlyphRun(glyphs, features, script, language, direction); // Return early if there are no glyphs + + if (glyphs.length === 0) { + glyphRun.positions = []; + return glyphRun; + } // Setup the advanced layout engine + + + if (this.engine && this.engine.setup) { + this.engine.setup(glyphRun); + } // Substitute and position the glyphs + + + this.substitute(glyphRun); + this.position(glyphRun); + this.hideDefaultIgnorables(glyphRun.glyphs, glyphRun.positions); // Let the layout engine clean up any state it might have + + if (this.engine && this.engine.cleanup) { + this.engine.cleanup(); + } + + return glyphRun; + }; + + _proto.substitute = function substitute(glyphRun) { + // Call the advanced layout engine to make substitutions + if (this.engine && this.engine.substitute) { + this.engine.substitute(glyphRun); + } + }; + + _proto.position = function position(glyphRun) { + // Get initial glyph positions + glyphRun.positions = glyphRun.glyphs.map(function (glyph) { + return new GlyphPosition(glyph.advanceWidth); + }); + var positioned = null; // Call the advanced layout engine. Returns the features applied. + + if (this.engine && this.engine.position) { + positioned = this.engine.position(glyphRun); + } // if there is no GPOS table, use unicode properties to position marks. + + + if (!positioned && (!this.engine || this.engine.fallbackPosition)) { + if (!this.unicodeLayoutEngine) { + this.unicodeLayoutEngine = new UnicodeLayoutEngine(this.font); + } + + this.unicodeLayoutEngine.positionGlyphs(glyphRun.glyphs, glyphRun.positions); + } // if kerning is not supported by GPOS, do kerning with the TrueType/AAT kern table + + + if ((!positioned || !positioned.kern) && glyphRun.features.kern !== false && this.font.kern) { + if (!this.kernProcessor) { + this.kernProcessor = new KernProcessor(this.font); + } + + this.kernProcessor.process(glyphRun.glyphs, glyphRun.positions); + glyphRun.features.kern = true; + } + }; + + _proto.hideDefaultIgnorables = function hideDefaultIgnorables(glyphs, positions) { + var space = this.font.glyphForCodePoint(0x20); + + for (var i = 0; i < glyphs.length; i++) { + if (this.isDefaultIgnorable(glyphs[i].codePoints[0])) { + glyphs[i] = space; + positions[i].xAdvance = 0; + positions[i].yAdvance = 0; + } + } + }; + + _proto.isDefaultIgnorable = function isDefaultIgnorable(ch) { + // From DerivedCoreProperties.txt in the Unicode database, + // minus U+115F, U+1160, U+3164 and U+FFA0, which is what + // Harfbuzz and Uniscribe do. + var plane = ch >> 16; + + if (plane === 0) { + // BMP + switch (ch >> 8) { + case 0x00: + return ch === 0x00AD; + + case 0x03: + return ch === 0x034F; + + case 0x06: + return ch === 0x061C; + + case 0x17: + return 0x17B4 <= ch && ch <= 0x17B5; + + case 0x18: + return 0x180B <= ch && ch <= 0x180E; + + case 0x20: + return 0x200B <= ch && ch <= 0x200F || 0x202A <= ch && ch <= 0x202E || 0x2060 <= ch && ch <= 0x206F; + + case 0xFE: + return 0xFE00 <= ch && ch <= 0xFE0F || ch === 0xFEFF; + + case 0xFF: + return 0xFFF0 <= ch && ch <= 0xFFF8; + + default: + return false; + } + } else { + // Other planes + switch (plane) { + case 0x01: + return 0x1BCA0 <= ch && ch <= 0x1BCA3 || 0x1D173 <= ch && ch <= 0x1D17A; + + case 0x0E: + return 0xE0000 <= ch && ch <= 0xE0FFF; + + default: + return false; + } + } + }; + + _proto.getAvailableFeatures = function getAvailableFeatures(script, language) { + var features = []; + + if (this.engine) { + features.push.apply(features, this.engine.getAvailableFeatures(script, language)); + } + + if (this.font.kern && features.indexOf('kern') === -1) { + features.push('kern'); + } + + return features; + }; + + _proto.stringsForGlyph = function stringsForGlyph(gid) { + var result = new Set(); + + var codePoints = this.font._cmapProcessor.codePointsForGlyph(gid); + + for (var _iterator2 = _createForOfIteratorHelperLoose$k(codePoints), _step2; !(_step2 = _iterator2()).done;) { + var codePoint = _step2.value; + result.add(String.fromCodePoint(codePoint)); + } + + if (this.engine && this.engine.stringsForGlyph) { + for (var _iterator3 = _createForOfIteratorHelperLoose$k(this.engine.stringsForGlyph(gid)), _step3; !(_step3 = _iterator3()).done;) { + var string = _step3.value; + result.add(string); + } + } + + return Array.from(result); + }; + + return LayoutEngine; +}(); + +function _createForOfIteratorHelperLoose$l(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$l(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$l(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$l(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$l(o, minLen); } + +function _arrayLikeToArray$l(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _defineProperties$5(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass$5(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$5(Constructor.prototype, protoProps); if (staticProps) _defineProperties$5(Constructor, staticProps); return Constructor; } +var SVG_COMMANDS = { + moveTo: 'M', + lineTo: 'L', + quadraticCurveTo: 'Q', + bezierCurveTo: 'C', + closePath: 'Z' +}; +/** + * Path objects are returned by glyphs and represent the actual + * vector outlines for each glyph in the font. Paths can be converted + * to SVG path data strings, or to functions that can be applied to + * render the path to a graphics context. + */ + +var Path = /*#__PURE__*/function () { + function Path() { + this.commands = []; + this._bbox = null; + this._cbox = null; + } + /** + * Compiles the path to a JavaScript function that can be applied with + * a graphics context in order to render the path. + * @return {string} + */ + + + var _proto = Path.prototype; + + _proto.toFunction = function toFunction() { + var _this = this; + + return function (ctx) { + return _this.commands.forEach(function (c) { + return ctx[c.command].apply(ctx, c.args); + }); + }; + } + /** + * Converts the path to an SVG path data string + * @return {string} + */ + ; + + _proto.toSVG = function toSVG() { + var cmds = this.commands.map(function (c) { + var args = c.args.map(function (arg) { + return Math.round(arg * 100) / 100; + }); + return "" + SVG_COMMANDS[c.command] + args.join(' '); + }); + return cmds.join(''); + } + /** + * Gets the "control box" of a path. + * This is like the bounding box, but it includes all points including + * control points of bezier segments and is much faster to compute than + * the real bounding box. + * @type {BBox} + */ + ; + + /** + * Applies a mapping function to each point in the path. + * @param {function} fn + * @return {Path} + */ + _proto.mapPoints = function mapPoints(fn) { + var path = new Path(); + + for (var _iterator = _createForOfIteratorHelperLoose$l(this.commands), _step; !(_step = _iterator()).done;) { + var c = _step.value; + var args = []; + + for (var i = 0; i < c.args.length; i += 2) { + var _fn = fn(c.args[i], c.args[i + 1]), + x = _fn[0], + y = _fn[1]; + + args.push(x, y); + } + + path[c.command].apply(path, args); + } + + return path; + } + /** + * Transforms the path by the given matrix. + */ + ; + + _proto.transform = function transform(m0, m1, m2, m3, m4, m5) { + return this.mapPoints(function (x, y) { + x = m0 * x + m2 * y + m4; + y = m1 * x + m3 * y + m5; + return [x, y]; + }); + } + /** + * Translates the path by the given offset. + */ + ; + + _proto.translate = function translate(x, y) { + return this.transform(1, 0, 0, 1, x, y); + } + /** + * Rotates the path by the given angle (in radians). + */ + ; + + _proto.rotate = function rotate(angle) { + var cos = Math.cos(angle); + var sin = Math.sin(angle); + return this.transform(cos, sin, -sin, cos, 0, 0); + } + /** + * Scales the path. + */ + ; + + _proto.scale = function scale(scaleX, scaleY) { + if (scaleY === void 0) { + scaleY = scaleX; + } + + return this.transform(scaleX, 0, 0, scaleY, 0, 0); + }; + + _createClass$5(Path, [{ + key: "cbox", + get: function get() { + if (!this._cbox) { + var cbox = new BBox(); + + for (var _iterator2 = _createForOfIteratorHelperLoose$l(this.commands), _step2; !(_step2 = _iterator2()).done;) { + var command = _step2.value; + + for (var i = 0; i < command.args.length; i += 2) { + cbox.addPoint(command.args[i], command.args[i + 1]); + } + } + + this._cbox = Object.freeze(cbox); + } + + return this._cbox; + } + /** + * Gets the exact bounding box of the path by evaluating curve segments. + * Slower to compute than the control box, but more accurate. + * @type {BBox} + */ + + }, { + key: "bbox", + get: function get() { + if (this._bbox) { + return this._bbox; + } + + var bbox = new BBox(); + var cx = 0, + cy = 0; + + var f = function f(t) { + return Math.pow(1 - t, 3) * p0[i] + 3 * Math.pow(1 - t, 2) * t * p1[i] + 3 * (1 - t) * Math.pow(t, 2) * p2[i] + Math.pow(t, 3) * p3[i]; + }; + + for (var _iterator3 = _createForOfIteratorHelperLoose$l(this.commands), _step3; !(_step3 = _iterator3()).done;) { + var c = _step3.value; + + switch (c.command) { + case 'moveTo': + case 'lineTo': + var _c$args = c.args, + x = _c$args[0], + y = _c$args[1]; + bbox.addPoint(x, y); + cx = x; + cy = y; + break; + + case 'quadraticCurveTo': + case 'bezierCurveTo': + if (c.command === 'quadraticCurveTo') { + // http://fontforge.org/bezier.html + var _c$args2 = c.args, + qp1x = _c$args2[0], + qp1y = _c$args2[1], + p3x = _c$args2[2], + p3y = _c$args2[3]; + var cp1x = cx + 2 / 3 * (qp1x - cx); // CP1 = QP0 + 2/3 * (QP1-QP0) + + var cp1y = cy + 2 / 3 * (qp1y - cy); + var cp2x = p3x + 2 / 3 * (qp1x - p3x); // CP2 = QP2 + 2/3 * (QP1-QP2) + + var cp2y = p3y + 2 / 3 * (qp1y - p3y); + } else { + var _c$args3 = c.args, + cp1x = _c$args3[0], + cp1y = _c$args3[1], + cp2x = _c$args3[2], + cp2y = _c$args3[3], + p3x = _c$args3[4], + p3y = _c$args3[5]; + } // http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html + + + bbox.addPoint(p3x, p3y); + var p0 = [cx, cy]; + var p1 = [cp1x, cp1y]; + var p2 = [cp2x, cp2y]; + var p3 = [p3x, p3y]; + + for (var i = 0; i <= 1; i++) { + var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; + var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; + c = 3 * p1[i] - 3 * p0[i]; + + if (a === 0) { + if (b === 0) { + continue; + } + + var t = -c / b; + + if (0 < t && t < 1) { + if (i === 0) { + bbox.addPoint(f(t), bbox.maxY); + } else if (i === 1) { + bbox.addPoint(bbox.maxX, f(t)); + } + } + + continue; + } + + var b2ac = Math.pow(b, 2) - 4 * c * a; + + if (b2ac < 0) { + continue; + } + + var t1 = (-b + Math.sqrt(b2ac)) / (2 * a); + + if (0 < t1 && t1 < 1) { + if (i === 0) { + bbox.addPoint(f(t1), bbox.maxY); + } else if (i === 1) { + bbox.addPoint(bbox.maxX, f(t1)); + } + } + + var t2 = (-b - Math.sqrt(b2ac)) / (2 * a); + + if (0 < t2 && t2 < 1) { + if (i === 0) { + bbox.addPoint(f(t2), bbox.maxY); + } else if (i === 1) { + bbox.addPoint(bbox.maxX, f(t2)); + } + } + } + + cx = p3x; + cy = p3y; + break; + } + } + + return this._bbox = Object.freeze(bbox); + } + }]); + + return Path; +}(); + +var _loop = function _loop() { + var command = _arr[_i]; + + Path.prototype[command] = function () { + this._bbox = this._cbox = null; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + this.commands.push({ + command: command, + args: args + }); + return this; + }; +}; + +for (var _i = 0, _arr = ['moveTo', 'lineTo', 'quadraticCurveTo', 'bezierCurveTo', 'closePath']; _i < _arr.length; _i++) { + _loop(); +} + +var StandardNames = ['.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat']; + +var _class$3; + +function _defineProperties$6(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass$6(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$6(Constructor.prototype, protoProps); if (staticProps) _defineProperties$6(Constructor, staticProps); return Constructor; } + +function _applyDecoratedDescriptor$3(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; } +/** + * Glyph objects represent a glyph in the font. They have various properties for accessing metrics and + * the actual vector path the glyph represents, and methods for rendering the glyph to a graphics context. + * + * You do not create glyph objects directly. They are created by various methods on the font object. + * There are several subclasses of the base Glyph class internally that may be returned depending + * on the font format, but they all inherit from this class. + */ + +var Glyph = (_class$3 = /*#__PURE__*/function () { + function Glyph(id, codePoints, font) { + /** + * The glyph id in the font + * @type {number} + */ + this.id = id; + /** + * An array of unicode code points that are represented by this glyph. + * There can be multiple code points in the case of ligatures and other glyphs + * that represent multiple visual characters. + * @type {number[]} + */ + + this.codePoints = codePoints; + this._font = font; // TODO: get this info from GDEF if available + + this.isMark = this.codePoints.length > 0 && this.codePoints.every(unicode.isMark); + this.isLigature = this.codePoints.length > 1; + } + + var _proto = Glyph.prototype; + + _proto._getPath = function _getPath() { + return new Path(); + }; + + _proto._getCBox = function _getCBox() { + return this.path.cbox; + }; + + _proto._getBBox = function _getBBox() { + return this.path.bbox; + }; + + _proto._getTableMetrics = function _getTableMetrics(table) { + if (this.id < table.metrics.length) { + return table.metrics.get(this.id); + } + + var metric = table.metrics.get(table.metrics.length - 1); + var res = { + advance: metric ? metric.advance : 0, + bearing: table.bearings.get(this.id - table.metrics.length) || 0 + }; + return res; + }; + + _proto._getMetrics = function _getMetrics(cbox) { + if (this._metrics) { + return this._metrics; + } + + var _this$_getTableMetric = this._getTableMetrics(this._font.hmtx), + advanceWidth = _this$_getTableMetric.advance, + leftBearing = _this$_getTableMetric.bearing; // For vertical metrics, use vmtx if available, or fall back to global data from OS/2 or hhea + + + if (this._font.vmtx) { + var _this$_getTableMetric2 = this._getTableMetrics(this._font.vmtx), + advanceHeight = _this$_getTableMetric2.advance, + topBearing = _this$_getTableMetric2.bearing; + } else { + var os2; + + if (typeof cbox === 'undefined' || cbox === null) { + cbox = this.cbox; + } + + if ((os2 = this._font['OS/2']) && os2.version > 0) { + var advanceHeight = Math.abs(os2.typoAscender - os2.typoDescender); + var topBearing = os2.typoAscender - cbox.maxY; + } else { + var hhea = this._font.hhea; + var advanceHeight = Math.abs(hhea.ascent - hhea.descent); + var topBearing = hhea.ascent - cbox.maxY; + } + } + + if (this._font._variationProcessor && this._font.HVAR) { + advanceWidth += this._font._variationProcessor.getAdvanceAdjustment(this.id, this._font.HVAR); + } + + return this._metrics = { + advanceWidth: advanceWidth, + advanceHeight: advanceHeight, + leftBearing: leftBearing, + topBearing: topBearing + }; + } + /** + * The glyph’s control box. + * This is often the same as the bounding box, but is faster to compute. + * Because of the way bezier curves are defined, some of the control points + * can be outside of the bounding box. Where `bbox` takes this into account, + * `cbox` does not. Thus, cbox is less accurate, but faster to compute. + * See [here](http://www.freetype.org/freetype2/docs/glyphs/glyphs-6.html#section-2) + * for a more detailed description. + * + * @type {BBox} + */ + ; + + /** + * Returns a path scaled to the given font size. + * @param {number} size + * @return {Path} + */ + _proto.getScaledPath = function getScaledPath(size) { + var scale = 1 / this._font.unitsPerEm * size; + return this.path.scale(scale); + } + /** + * The glyph's advance width. + * @type {number} + */ + ; + + _proto._getName = function _getName() { + var post = this._font.post; + + if (!post) { + return null; + } + + switch (post.version) { + case 1: + return StandardNames[this.id]; + + case 2: + var id = post.glyphNameIndex[this.id]; + + if (id < StandardNames.length) { + return StandardNames[id]; + } + + return post.names[id - StandardNames.length]; + + case 2.5: + return StandardNames[this.id + post.offsets[this.id]]; + + case 4: + return String.fromCharCode(post.map[this.id]); + } + } + /** + * The glyph's name + * @type {string} + */ + ; + + /** + * Renders the glyph to the given graphics context, at the specified font size. + * @param {CanvasRenderingContext2d} ctx + * @param {number} size + */ + _proto.render = function render(ctx, size) { + ctx.save(); + var scale = 1 / this._font.head.unitsPerEm * size; + ctx.scale(scale, scale); + var fn = this.path.toFunction(); + fn(ctx); + ctx.fill(); + ctx.restore(); + }; + + _createClass$6(Glyph, [{ + key: "cbox", + get: function get() { + return this._getCBox(); + } + /** + * The glyph’s bounding box, i.e. the rectangle that encloses the + * glyph outline as tightly as possible. + * @type {BBox} + */ + + }, { + key: "bbox", + get: function get() { + return this._getBBox(); + } + /** + * A vector Path object representing the glyph outline. + * @type {Path} + */ + + }, { + key: "path", + get: function get() { + // Cache the path so we only decode it once + // Decoding is actually performed by subclasses + return this._getPath(); + } + }, { + key: "advanceWidth", + get: function get() { + return this._getMetrics().advanceWidth; + } + /** + * The glyph's advance height. + * @type {number} + */ + + }, { + key: "advanceHeight", + get: function get() { + return this._getMetrics().advanceHeight; + } + }, { + key: "ligatureCaretPositions", + get: function get() {} + }, { + key: "name", + get: function get() { + return this._getName(); + } + }]); + + return Glyph; +}(), (_applyDecoratedDescriptor$3(_class$3.prototype, "cbox", [cache], Object.getOwnPropertyDescriptor(_class$3.prototype, "cbox"), _class$3.prototype), _applyDecoratedDescriptor$3(_class$3.prototype, "bbox", [cache], Object.getOwnPropertyDescriptor(_class$3.prototype, "bbox"), _class$3.prototype), _applyDecoratedDescriptor$3(_class$3.prototype, "path", [cache], Object.getOwnPropertyDescriptor(_class$3.prototype, "path"), _class$3.prototype), _applyDecoratedDescriptor$3(_class$3.prototype, "advanceWidth", [cache], Object.getOwnPropertyDescriptor(_class$3.prototype, "advanceWidth"), _class$3.prototype), _applyDecoratedDescriptor$3(_class$3.prototype, "advanceHeight", [cache], Object.getOwnPropertyDescriptor(_class$3.prototype, "advanceHeight"), _class$3.prototype), _applyDecoratedDescriptor$3(_class$3.prototype, "name", [cache], Object.getOwnPropertyDescriptor(_class$3.prototype, "name"), _class$3.prototype)), _class$3); + +function _createForOfIteratorHelperLoose$m(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$m(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$m(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$m(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$m(o, minLen); } + +function _arrayLikeToArray$m(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _inheritsLoose$9(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var GlyfHeader = new restructure.Struct({ + numberOfContours: restructure.int16, + // if negative, this is a composite glyph + xMin: restructure.int16, + yMin: restructure.int16, + xMax: restructure.int16, + yMax: restructure.int16 +}); // Flags for simple glyphs + +var ON_CURVE = 1 << 0; +var X_SHORT_VECTOR = 1 << 1; +var Y_SHORT_VECTOR = 1 << 2; +var REPEAT = 1 << 3; +var SAME_X = 1 << 4; +var SAME_Y = 1 << 5; // Flags for composite glyphs + +var ARG_1_AND_2_ARE_WORDS = 1 << 0; +var WE_HAVE_A_SCALE = 1 << 3; +var MORE_COMPONENTS = 1 << 5; +var WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; +var WE_HAVE_A_TWO_BY_TWO = 1 << 7; +var WE_HAVE_INSTRUCTIONS = 1 << 8; + +var Point = /*#__PURE__*/function () { + function Point(onCurve, endContour, x, y) { + if (x === void 0) { + x = 0; + } + + if (y === void 0) { + y = 0; + } + + this.onCurve = onCurve; + this.endContour = endContour; + this.x = x; + this.y = y; + } + + var _proto = Point.prototype; + + _proto.copy = function copy() { + return new Point(this.onCurve, this.endContour, this.x, this.y); + }; + + return Point; +}(); // Represents a component in a composite glyph + +var Component = function Component(glyphID, dx, dy) { + this.glyphID = glyphID; + this.dx = dx; + this.dy = dy; + this.pos = 0; + this.scaleX = this.scaleY = 1; + this.scale01 = this.scale10 = 0; +}; +/** + * Represents a TrueType glyph. + */ + + +var TTFGlyph = /*#__PURE__*/function (_Glyph) { + _inheritsLoose$9(TTFGlyph, _Glyph); + + function TTFGlyph() { + return _Glyph.apply(this, arguments) || this; + } + + var _proto2 = TTFGlyph.prototype; + + // Parses just the glyph header and returns the bounding box + _proto2._getCBox = function _getCBox(internal) { + // We need to decode the glyph if variation processing is requested, + // so it's easier just to recompute the path's cbox after decoding. + if (this._font._variationProcessor && !internal) { + return this.path.cbox; + } + + var stream = this._font._getTableStream('glyf'); + + stream.pos += this._font.loca.offsets[this.id]; + var glyph = GlyfHeader.decode(stream); + var cbox = new BBox(glyph.xMin, glyph.yMin, glyph.xMax, glyph.yMax); + return Object.freeze(cbox); + } // Parses a single glyph coordinate + ; + + _proto2._parseGlyphCoord = function _parseGlyphCoord(stream, prev, _short, same) { + if (_short) { + var val = stream.readUInt8(); + + if (!same) { + val = -val; + } + + val += prev; + } else { + if (same) { + var val = prev; + } else { + var val = prev + stream.readInt16BE(); + } + } + + return val; + } // Decodes the glyph data into points for simple glyphs, + // or components for composite glyphs + ; + + _proto2._decode = function _decode() { + var glyfPos = this._font.loca.offsets[this.id]; + var nextPos = this._font.loca.offsets[this.id + 1]; // Nothing to do if there is no data for this glyph + + if (glyfPos === nextPos) { + return null; + } + + var stream = this._font._getTableStream('glyf'); + + stream.pos += glyfPos; + var startPos = stream.pos; + var glyph = GlyfHeader.decode(stream); + + if (glyph.numberOfContours > 0) { + this._decodeSimple(glyph, stream); + } else if (glyph.numberOfContours < 0) { + this._decodeComposite(glyph, stream, startPos); + } + + return glyph; + }; + + _proto2._decodeSimple = function _decodeSimple(glyph, stream) { + // this is a simple glyph + glyph.points = []; + var endPtsOfContours = new restructure.Array(restructure.uint16, glyph.numberOfContours).decode(stream); + glyph.instructions = new restructure.Array(restructure.uint8, restructure.uint16).decode(stream); + var flags = []; + var numCoords = endPtsOfContours[endPtsOfContours.length - 1] + 1; + + while (flags.length < numCoords) { + var flag = stream.readUInt8(); + flags.push(flag); // check for repeat flag + + if (flag & REPEAT) { + var count = stream.readUInt8(); + + for (var j = 0; j < count; j++) { + flags.push(flag); + } + } + } + + for (var i = 0; i < flags.length; i++) { + var flag = flags[i]; + var point = new Point(!!(flag & ON_CURVE), endPtsOfContours.indexOf(i) >= 0, 0, 0); + glyph.points.push(point); + } + + var px = 0; + + for (var i = 0; i < flags.length; i++) { + var flag = flags[i]; + glyph.points[i].x = px = this._parseGlyphCoord(stream, px, flag & X_SHORT_VECTOR, flag & SAME_X); + } + + var py = 0; + + for (var i = 0; i < flags.length; i++) { + var flag = flags[i]; + glyph.points[i].y = py = this._parseGlyphCoord(stream, py, flag & Y_SHORT_VECTOR, flag & SAME_Y); + } + + if (this._font._variationProcessor) { + var points = glyph.points.slice(); + points.push.apply(points, this._getPhantomPoints(glyph)); + + this._font._variationProcessor.transformPoints(this.id, points); + + glyph.phantomPoints = points.slice(-4); + } + + return; + }; + + _proto2._decodeComposite = function _decodeComposite(glyph, stream, offset) { + if (offset === void 0) { + offset = 0; + } + + // this is a composite glyph + glyph.components = []; + var haveInstructions = false; + var flags = MORE_COMPONENTS; + + while (flags & MORE_COMPONENTS) { + flags = stream.readUInt16BE(); + var gPos = stream.pos - offset; + var glyphID = stream.readUInt16BE(); + + if (!haveInstructions) { + haveInstructions = (flags & WE_HAVE_INSTRUCTIONS) !== 0; + } + + if (flags & ARG_1_AND_2_ARE_WORDS) { + var dx = stream.readInt16BE(); + var dy = stream.readInt16BE(); + } else { + var dx = stream.readInt8(); + var dy = stream.readInt8(); + } + + var component = new Component(glyphID, dx, dy); + component.pos = gPos; + + if (flags & WE_HAVE_A_SCALE) { + // fixed number with 14 bits of fraction + component.scaleX = component.scaleY = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824; + } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { + component.scaleX = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824; + component.scaleY = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824; + } else if (flags & WE_HAVE_A_TWO_BY_TWO) { + component.scaleX = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824; + component.scale01 = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824; + component.scale10 = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824; + component.scaleY = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824; + } + + glyph.components.push(component); + } + + if (this._font._variationProcessor) { + var points = []; + + for (var j = 0; j < glyph.components.length; j++) { + var component = glyph.components[j]; + points.push(new Point(true, true, component.dx, component.dy)); + } + + points.push.apply(points, this._getPhantomPoints(glyph)); + + this._font._variationProcessor.transformPoints(this.id, points); + + glyph.phantomPoints = points.splice(-4, 4); + + for (var i = 0; i < points.length; i++) { + var point = points[i]; + glyph.components[i].dx = point.x; + glyph.components[i].dy = point.y; + } + } + + return haveInstructions; + }; + + _proto2._getPhantomPoints = function _getPhantomPoints(glyph) { + var cbox = this._getCBox(true); + + if (this._metrics == null) { + this._metrics = Glyph.prototype._getMetrics.call(this, cbox); + } + + var _this$_metrics = this._metrics, + advanceWidth = _this$_metrics.advanceWidth, + advanceHeight = _this$_metrics.advanceHeight, + leftBearing = _this$_metrics.leftBearing, + topBearing = _this$_metrics.topBearing; + return [new Point(false, true, glyph.xMin - leftBearing, 0), new Point(false, true, glyph.xMin - leftBearing + advanceWidth, 0), new Point(false, true, 0, glyph.yMax + topBearing), new Point(false, true, 0, glyph.yMax + topBearing + advanceHeight)]; + } // Decodes font data, resolves composite glyphs, and returns an array of contours + ; + + _proto2._getContours = function _getContours() { + var glyph = this._decode(); + + if (!glyph) { + return []; + } + + var points = []; + + if (glyph.numberOfContours < 0) { + // resolve composite glyphs + for (var _iterator = _createForOfIteratorHelperLoose$m(glyph.components), _step; !(_step = _iterator()).done;) { + var component = _step.value; + + var _contours = this._font.getGlyph(component.glyphID)._getContours(); + + for (var i = 0; i < _contours.length; i++) { + var contour = _contours[i]; + + for (var j = 0; j < contour.length; j++) { + var _point = contour[j]; + var x = _point.x * component.scaleX + _point.y * component.scale01 + component.dx; + var y = _point.y * component.scaleY + _point.x * component.scale10 + component.dy; + points.push(new Point(_point.onCurve, _point.endContour, x, y)); + } + } + } + } else { + points = glyph.points || []; + } // Recompute and cache metrics if we performed variation processing, and don't have an HVAR table + + + if (glyph.phantomPoints && !this._font.directory.tables.HVAR) { + this._metrics.advanceWidth = glyph.phantomPoints[1].x - glyph.phantomPoints[0].x; + this._metrics.advanceHeight = glyph.phantomPoints[3].y - glyph.phantomPoints[2].y; + this._metrics.leftBearing = glyph.xMin - glyph.phantomPoints[0].x; + this._metrics.topBearing = glyph.phantomPoints[2].y - glyph.yMax; + } + + var contours = []; + var cur = []; + + for (var k = 0; k < points.length; k++) { + var point = points[k]; + cur.push(point); + + if (point.endContour) { + contours.push(cur); + cur = []; + } + } + + return contours; + }; + + _proto2._getMetrics = function _getMetrics() { + if (this._metrics) { + return this._metrics; + } + + var cbox = this._getCBox(true); + + _Glyph.prototype._getMetrics.call(this, cbox); + + if (this._font._variationProcessor && !this._font.HVAR) { + // No HVAR table, decode the glyph. This triggers recomputation of metrics. + this.path; + } + + return this._metrics; + } // Converts contours to a Path object that can be rendered + ; + + _proto2._getPath = function _getPath() { + var contours = this._getContours(); + + var path = new Path(); + + for (var i = 0; i < contours.length; i++) { + var contour = contours[i]; + var firstPt = contour[0]; + var lastPt = contour[contour.length - 1]; + var start = 0; + + if (firstPt.onCurve) { + // The first point will be consumed by the moveTo command, so skip in the loop + var curvePt = null; + start = 1; + } else { + if (lastPt.onCurve) { + // Start at the last point if the first point is off curve and the last point is on curve + firstPt = lastPt; + } else { + // Start at the middle if both the first and last points are off curve + firstPt = new Point(false, false, (firstPt.x + lastPt.x) / 2, (firstPt.y + lastPt.y) / 2); + } + + var curvePt = firstPt; + } + + path.moveTo(firstPt.x, firstPt.y); + + for (var j = start; j < contour.length; j++) { + var pt = contour[j]; + var prevPt = j === 0 ? firstPt : contour[j - 1]; + + if (prevPt.onCurve && pt.onCurve) { + path.lineTo(pt.x, pt.y); + } else if (prevPt.onCurve && !pt.onCurve) { + var curvePt = pt; + } else if (!prevPt.onCurve && !pt.onCurve) { + var midX = (prevPt.x + pt.x) / 2; + var midY = (prevPt.y + pt.y) / 2; + path.quadraticCurveTo(prevPt.x, prevPt.y, midX, midY); + var curvePt = pt; + } else if (!prevPt.onCurve && pt.onCurve) { + path.quadraticCurveTo(curvePt.x, curvePt.y, pt.x, pt.y); + var curvePt = null; + } else { + throw new Error("Unknown TTF path state"); + } + } // Connect the first and last points + + + if (curvePt) { + path.quadraticCurveTo(curvePt.x, curvePt.y, firstPt.x, firstPt.y); + } + + path.closePath(); + } + + return path; + }; + + return TTFGlyph; +}(Glyph); + +function _inheritsLoose$a(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } +/** + * Represents an OpenType PostScript glyph, in the Compact Font Format. + */ + +var CFFGlyph = /*#__PURE__*/function (_Glyph) { + _inheritsLoose$a(CFFGlyph, _Glyph); + + function CFFGlyph() { + return _Glyph.apply(this, arguments) || this; + } + + var _proto = CFFGlyph.prototype; + + _proto._getName = function _getName() { + if (this._font.CFF2) { + return _Glyph.prototype._getName.call(this); + } + + return this._font['CFF '].getGlyphName(this.id); + }; + + _proto.bias = function bias(s) { + if (s.length < 1240) { + return 107; + } else if (s.length < 33900) { + return 1131; + } else { + return 32768; + } + }; + + _proto._getPath = function _getPath() { + var stream = this._font.stream; + var pos = stream.pos; + var cff = this._font.CFF2 || this._font['CFF ']; + var str = cff.topDict.CharStrings[this.id]; + var end = str.offset + str.length; + stream.pos = str.offset; + var path = new Path(); + var stack = []; + var trans = []; + var width = null; + var nStems = 0; + var x = 0, + y = 0; + var usedGsubrs; + var usedSubrs; + var open = false; + this._usedGsubrs = usedGsubrs = {}; + this._usedSubrs = usedSubrs = {}; + var gsubrs = cff.globalSubrIndex || []; + var gsubrsBias = this.bias(gsubrs); + var privateDict = cff.privateDictForGlyph(this.id); + var subrs = privateDict.Subrs || []; + var subrsBias = this.bias(subrs); + var vstore = cff.topDict.vstore && cff.topDict.vstore.itemVariationStore; + var vsindex = privateDict.vsindex; + var variationProcessor = this._font._variationProcessor; + + function checkWidth() { + if (width == null) { + width = stack.shift() + privateDict.nominalWidthX; + } + } + + function parseStems() { + if (stack.length % 2 !== 0) { + checkWidth(); + } + + nStems += stack.length >> 1; + return stack.length = 0; + } + + function moveTo(x, y) { + if (open) { + path.closePath(); + } + + path.moveTo(x, y); + open = true; + } + + var parse = function parse() { + while (stream.pos < end) { + var op = stream.readUInt8(); + + if (op < 32) { + switch (op) { + case 1: // hstem + + case 3: // vstem + + case 18: // hstemhm + + case 23: + // vstemhm + parseStems(); + break; + + case 4: + // vmoveto + if (stack.length > 1) { + checkWidth(); + } + + y += stack.shift(); + moveTo(x, y); + break; + + case 5: + // rlineto + while (stack.length >= 2) { + x += stack.shift(); + y += stack.shift(); + path.lineTo(x, y); + } + + break; + + case 6: // hlineto + + case 7: + // vlineto + var phase = op === 6; + + while (stack.length >= 1) { + if (phase) { + x += stack.shift(); + } else { + y += stack.shift(); + } + + path.lineTo(x, y); + phase = !phase; + } + + break; + + case 8: + // rrcurveto + while (stack.length > 0) { + var c1x = x + stack.shift(); + var c1y = y + stack.shift(); + var c2x = c1x + stack.shift(); + var c2y = c1y + stack.shift(); + x = c2x + stack.shift(); + y = c2y + stack.shift(); + path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y); + } + + break; + + case 10: + // callsubr + var index = stack.pop() + subrsBias; + var subr = subrs[index]; + + if (subr) { + usedSubrs[index] = true; + var p = stream.pos; + var e = end; + stream.pos = subr.offset; + end = subr.offset + subr.length; + parse(); + stream.pos = p; + end = e; + } + + break; + + case 11: + // return + if (cff.version >= 2) { + break; + } + + return; + + case 14: + // endchar + if (cff.version >= 2) { + break; + } + + if (stack.length > 0) { + checkWidth(); + } + + if (open) { + path.closePath(); + open = false; + } + + break; + + case 15: + { + // vsindex + if (cff.version < 2) { + throw new Error('vsindex operator not supported in CFF v1'); + } + + vsindex = stack.pop(); + break; + } + + case 16: + { + // blend + if (cff.version < 2) { + throw new Error('blend operator not supported in CFF v1'); + } + + if (!variationProcessor) { + throw new Error('blend operator in non-variation font'); + } + + var blendVector = variationProcessor.getBlendVector(vstore, vsindex); + var numBlends = stack.pop(); + var numOperands = numBlends * blendVector.length; + var delta = stack.length - numOperands; + var base = delta - numBlends; + + for (var i = 0; i < numBlends; i++) { + var sum = stack[base + i]; + + for (var j = 0; j < blendVector.length; j++) { + sum += blendVector[j] * stack[delta++]; + } + + stack[base + i] = sum; + } + + while (numOperands--) { + stack.pop(); + } + + break; + } + + case 19: // hintmask + + case 20: + // cntrmask + parseStems(); + stream.pos += nStems + 7 >> 3; + break; + + case 21: + // rmoveto + if (stack.length > 2) { + checkWidth(); + } + + x += stack.shift(); + y += stack.shift(); + moveTo(x, y); + break; + + case 22: + // hmoveto + if (stack.length > 1) { + checkWidth(); + } + + x += stack.shift(); + moveTo(x, y); + break; + + case 24: + // rcurveline + while (stack.length >= 8) { + var c1x = x + stack.shift(); + var c1y = y + stack.shift(); + var c2x = c1x + stack.shift(); + var c2y = c1y + stack.shift(); + x = c2x + stack.shift(); + y = c2y + stack.shift(); + path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y); + } + + x += stack.shift(); + y += stack.shift(); + path.lineTo(x, y); + break; + + case 25: + // rlinecurve + while (stack.length >= 8) { + x += stack.shift(); + y += stack.shift(); + path.lineTo(x, y); + } + + var c1x = x + stack.shift(); + var c1y = y + stack.shift(); + var c2x = c1x + stack.shift(); + var c2y = c1y + stack.shift(); + x = c2x + stack.shift(); + y = c2y + stack.shift(); + path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y); + break; + + case 26: + // vvcurveto + if (stack.length % 2) { + x += stack.shift(); + } + + while (stack.length >= 4) { + c1x = x; + c1y = y + stack.shift(); + c2x = c1x + stack.shift(); + c2y = c1y + stack.shift(); + x = c2x; + y = c2y + stack.shift(); + path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y); + } + + break; + + case 27: + // hhcurveto + if (stack.length % 2) { + y += stack.shift(); + } + + while (stack.length >= 4) { + c1x = x + stack.shift(); + c1y = y; + c2x = c1x + stack.shift(); + c2y = c1y + stack.shift(); + x = c2x + stack.shift(); + y = c2y; + path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y); + } + + break; + + case 28: + // shortint + stack.push(stream.readInt16BE()); + break; + + case 29: + // callgsubr + index = stack.pop() + gsubrsBias; + subr = gsubrs[index]; + + if (subr) { + usedGsubrs[index] = true; + var p = stream.pos; + var e = end; + stream.pos = subr.offset; + end = subr.offset + subr.length; + parse(); + stream.pos = p; + end = e; + } + + break; + + case 30: // vhcurveto + + case 31: + // hvcurveto + phase = op === 31; + + while (stack.length >= 4) { + if (phase) { + c1x = x + stack.shift(); + c1y = y; + c2x = c1x + stack.shift(); + c2y = c1y + stack.shift(); + y = c2y + stack.shift(); + x = c2x + (stack.length === 1 ? stack.shift() : 0); + } else { + c1x = x; + c1y = y + stack.shift(); + c2x = c1x + stack.shift(); + c2y = c1y + stack.shift(); + x = c2x + stack.shift(); + y = c2y + (stack.length === 1 ? stack.shift() : 0); + } + + path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y); + phase = !phase; + } + + break; + + case 12: + op = stream.readUInt8(); + + switch (op) { + case 3: + // and + var a = stack.pop(); + var b = stack.pop(); + stack.push(a && b ? 1 : 0); + break; + + case 4: + // or + a = stack.pop(); + b = stack.pop(); + stack.push(a || b ? 1 : 0); + break; + + case 5: + // not + a = stack.pop(); + stack.push(a ? 0 : 1); + break; + + case 9: + // abs + a = stack.pop(); + stack.push(Math.abs(a)); + break; + + case 10: + // add + a = stack.pop(); + b = stack.pop(); + stack.push(a + b); + break; + + case 11: + // sub + a = stack.pop(); + b = stack.pop(); + stack.push(a - b); + break; + + case 12: + // div + a = stack.pop(); + b = stack.pop(); + stack.push(a / b); + break; + + case 14: + // neg + a = stack.pop(); + stack.push(-a); + break; + + case 15: + // eq + a = stack.pop(); + b = stack.pop(); + stack.push(a === b ? 1 : 0); + break; + + case 18: + // drop + stack.pop(); + break; + + case 20: + // put + var val = stack.pop(); + var idx = stack.pop(); + trans[idx] = val; + break; + + case 21: + // get + idx = stack.pop(); + stack.push(trans[idx] || 0); + break; + + case 22: + // ifelse + var s1 = stack.pop(); + var s2 = stack.pop(); + var v1 = stack.pop(); + var v2 = stack.pop(); + stack.push(v1 <= v2 ? s1 : s2); + break; + + case 23: + // random + stack.push(Math.random()); + break; + + case 24: + // mul + a = stack.pop(); + b = stack.pop(); + stack.push(a * b); + break; + + case 26: + // sqrt + a = stack.pop(); + stack.push(Math.sqrt(a)); + break; + + case 27: + // dup + a = stack.pop(); + stack.push(a, a); + break; + + case 28: + // exch + a = stack.pop(); + b = stack.pop(); + stack.push(b, a); + break; + + case 29: + // index + idx = stack.pop(); + + if (idx < 0) { + idx = 0; + } else if (idx > stack.length - 1) { + idx = stack.length - 1; + } + + stack.push(stack[idx]); + break; + + case 30: + // roll + var n = stack.pop(); + + var _j = stack.pop(); + + if (_j >= 0) { + while (_j > 0) { + var t = stack[n - 1]; + + for (var _i = n - 2; _i >= 0; _i--) { + stack[_i + 1] = stack[_i]; + } + + stack[0] = t; + _j--; + } + } else { + while (_j < 0) { + var t = stack[0]; + + for (var _i2 = 0; _i2 <= n; _i2++) { + stack[_i2] = stack[_i2 + 1]; + } + + stack[n - 1] = t; + _j++; + } + } + + break; + + case 34: + // hflex + c1x = x + stack.shift(); + c1y = y; + c2x = c1x + stack.shift(); + c2y = c1y + stack.shift(); + var c3x = c2x + stack.shift(); + var c3y = c2y; + var c4x = c3x + stack.shift(); + var c4y = c3y; + var c5x = c4x + stack.shift(); + var c5y = c4y; + var c6x = c5x + stack.shift(); + var c6y = c5y; + x = c6x; + y = c6y; + path.bezierCurveTo(c1x, c1y, c2x, c2y, c3x, c3y); + path.bezierCurveTo(c4x, c4y, c5x, c5y, c6x, c6y); + break; + + case 35: + // flex + var pts = []; + + for (var _i3 = 0; _i3 <= 5; _i3++) { + x += stack.shift(); + y += stack.shift(); + pts.push(x, y); + } + + path.bezierCurveTo.apply(path, pts.slice(0, 6)); + path.bezierCurveTo.apply(path, pts.slice(6)); + stack.shift(); // fd + + break; + + case 36: + // hflex1 + c1x = x + stack.shift(); + c1y = y + stack.shift(); + c2x = c1x + stack.shift(); + c2y = c1y + stack.shift(); + c3x = c2x + stack.shift(); + c3y = c2y; + c4x = c3x + stack.shift(); + c4y = c3y; + c5x = c4x + stack.shift(); + c5y = c4y + stack.shift(); + c6x = c5x + stack.shift(); + c6y = c5y; + x = c6x; + y = c6y; + path.bezierCurveTo(c1x, c1y, c2x, c2y, c3x, c3y); + path.bezierCurveTo(c4x, c4y, c5x, c5y, c6x, c6y); + break; + + case 37: + // flex1 + var startx = x; + var starty = y; + pts = []; + + for (var _i4 = 0; _i4 <= 4; _i4++) { + x += stack.shift(); + y += stack.shift(); + pts.push(x, y); + } + + if (Math.abs(x - startx) > Math.abs(y - starty)) { + // horizontal + x += stack.shift(); + y = starty; + } else { + x = startx; + y += stack.shift(); + } + + pts.push(x, y); + path.bezierCurveTo.apply(path, pts.slice(0, 6)); + path.bezierCurveTo.apply(path, pts.slice(6)); + break; + + default: + throw new Error("Unknown op: 12 " + op); + } + + break; + + default: + throw new Error("Unknown op: " + op); + } + } else if (op < 247) { + stack.push(op - 139); + } else if (op < 251) { + var b1 = stream.readUInt8(); + stack.push((op - 247) * 256 + b1 + 108); + } else if (op < 255) { + var b1 = stream.readUInt8(); + stack.push(-(op - 251) * 256 - b1 - 108); + } else { + stack.push(stream.readInt32BE() / 65536); + } + } + }; + + parse(); + + if (open) { + path.closePath(); + } + + return path; + }; + + return CFFGlyph; +}(Glyph); + +function _inheritsLoose$b(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } +var SBIXImage = new restructure.Struct({ + originX: restructure.uint16, + originY: restructure.uint16, + type: new restructure.String(4), + data: new restructure.Buffer(function (t) { + return t.parent.buflen - t._currentOffset; + }) +}); +/** + * Represents a color (e.g. emoji) glyph in Apple's SBIX format. + */ + +var SBIXGlyph = /*#__PURE__*/function (_TTFGlyph) { + _inheritsLoose$b(SBIXGlyph, _TTFGlyph); + + function SBIXGlyph() { + return _TTFGlyph.apply(this, arguments) || this; + } + + var _proto = SBIXGlyph.prototype; + + /** + * Returns an object representing a glyph image at the given point size. + * The object has a data property with a Buffer containing the actual image data, + * along with the image type, and origin. + * + * @param {number} size + * @return {object} + */ + _proto.getImageForSize = function getImageForSize(size) { + for (var i = 0; i < this._font.sbix.imageTables.length; i++) { + var table = this._font.sbix.imageTables[i]; + + if (table.ppem >= size) { + break; + } + } + + var offsets = table.imageOffsets; + var start = offsets[this.id]; + var end = offsets[this.id + 1]; + + if (start === end) { + return null; + } + + this._font.stream.pos = start; + return SBIXImage.decode(this._font.stream, { + buflen: end - start + }); + }; + + _proto.render = function render(ctx, size) { + var img = this.getImageForSize(size); + + if (img != null) { + var scale = size / this._font.unitsPerEm; + ctx.image(img.data, { + height: size, + x: img.originX, + y: (this.bbox.minY - img.originY) * scale + }); + } + + if (this._font.sbix.flags.renderOutlines) { + _TTFGlyph.prototype.render.call(this, ctx, size); + } + }; + + return SBIXGlyph; +}(TTFGlyph); + +function _createForOfIteratorHelperLoose$n(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$n(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$n(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$n(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$n(o, minLen); } + +function _arrayLikeToArray$n(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _defineProperties$7(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass$7(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$7(Constructor.prototype, protoProps); if (staticProps) _defineProperties$7(Constructor, staticProps); return Constructor; } + +function _inheritsLoose$c(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var COLRLayer = function COLRLayer(glyph, color) { + this.glyph = glyph; + this.color = color; +}; +/** + * Represents a color (e.g. emoji) glyph in Microsoft's COLR format. + * Each glyph in this format contain a list of colored layers, each + * of which is another vector glyph. + */ + + +var COLRGlyph = /*#__PURE__*/function (_Glyph) { + _inheritsLoose$c(COLRGlyph, _Glyph); + + function COLRGlyph() { + return _Glyph.apply(this, arguments) || this; + } + + var _proto = COLRGlyph.prototype; + + _proto._getBBox = function _getBBox() { + var bbox = new BBox(); + + for (var i = 0; i < this.layers.length; i++) { + var layer = this.layers[i]; + var b = layer.glyph.bbox; + bbox.addPoint(b.minX, b.minY); + bbox.addPoint(b.maxX, b.maxY); + } + + return bbox; + } + /** + * Returns an array of objects containing the glyph and color for + * each layer in the composite color glyph. + * @type {object[]} + */ + ; + + _proto.render = function render(ctx, size) { + for (var _iterator = _createForOfIteratorHelperLoose$n(this.layers), _step; !(_step = _iterator()).done;) { + var _step$value = _step.value, + glyph = _step$value.glyph, + color = _step$value.color; + ctx.fillColor([color.red, color.green, color.blue], color.alpha / 255 * 100); + glyph.render(ctx, size); + } + + return; + }; + + _createClass$7(COLRGlyph, [{ + key: "layers", + get: function get() { + var cpal = this._font.CPAL; + var colr = this._font.COLR; + var low = 0; + var high = colr.baseGlyphRecord.length - 1; + + while (low <= high) { + var mid = low + high >> 1; + var rec = colr.baseGlyphRecord[mid]; + + if (this.id < rec.gid) { + high = mid - 1; + } else if (this.id > rec.gid) { + low = mid + 1; + } else { + var baseLayer = rec; + break; + } + } // if base glyph not found in COLR table, + // default to normal glyph from glyf or CFF + + + if (baseLayer == null) { + var g = this._font._getBaseGlyph(this.id); + + var color = { + red: 0, + green: 0, + blue: 0, + alpha: 255 + }; + return [new COLRLayer(g, color)]; + } // otherwise, return an array of all the layers + + + var layers = []; + + for (var i = baseLayer.firstLayerIndex; i < baseLayer.firstLayerIndex + baseLayer.numLayers; i++) { + var rec = colr.layerRecords[i]; + var color = cpal.colorRecords[rec.paletteIndex]; + + var g = this._font._getBaseGlyph(rec.gid); + + layers.push(new COLRLayer(g, color)); + } + + return layers; + } + }]); + + return COLRGlyph; +}(Glyph); + +var TUPLES_SHARE_POINT_NUMBERS = 0x8000; +var TUPLE_COUNT_MASK = 0x0fff; +var EMBEDDED_TUPLE_COORD = 0x8000; +var INTERMEDIATE_TUPLE = 0x4000; +var PRIVATE_POINT_NUMBERS = 0x2000; +var TUPLE_INDEX_MASK = 0x0fff; +var POINTS_ARE_WORDS = 0x80; +var POINT_RUN_COUNT_MASK = 0x7f; +var DELTAS_ARE_ZERO = 0x80; +var DELTAS_ARE_WORDS = 0x40; +var DELTA_RUN_COUNT_MASK = 0x3f; +/** + * This class is transforms TrueType glyphs according to the data from + * the Apple Advanced Typography variation tables (fvar, gvar, and avar). + * These tables allow infinite adjustments to glyph weight, width, slant, + * and optical size without the designer needing to specify every exact style. + * + * Apple's documentation for these tables is not great, so thanks to the + * Freetype project for figuring much of this out. + * + * @private + */ + +var GlyphVariationProcessor = /*#__PURE__*/function () { + function GlyphVariationProcessor(font, coords) { + this.font = font; + this.normalizedCoords = this.normalizeCoords(coords); + this.blendVectors = new Map(); + } + + var _proto = GlyphVariationProcessor.prototype; + + _proto.normalizeCoords = function normalizeCoords(coords) { + // the default mapping is linear along each axis, in two segments: + // from the minValue to defaultValue, and from defaultValue to maxValue. + var normalized = []; + + for (var i = 0; i < this.font.fvar.axis.length; i++) { + var axis = this.font.fvar.axis[i]; + + if (coords[i] < axis.defaultValue) { + normalized.push((coords[i] - axis.defaultValue + Number.EPSILON) / (axis.defaultValue - axis.minValue + Number.EPSILON)); + } else { + normalized.push((coords[i] - axis.defaultValue + Number.EPSILON) / (axis.maxValue - axis.defaultValue + Number.EPSILON)); + } + } // if there is an avar table, the normalized value is calculated + // by interpolating between the two nearest mapped values. + + + if (this.font.avar) { + for (var i = 0; i < this.font.avar.segment.length; i++) { + var segment = this.font.avar.segment[i]; + + for (var j = 0; j < segment.correspondence.length; j++) { + var pair = segment.correspondence[j]; + + if (j >= 1 && normalized[i] < pair.fromCoord) { + var prev = segment.correspondence[j - 1]; + normalized[i] = ((normalized[i] - prev.fromCoord) * (pair.toCoord - prev.toCoord) + Number.EPSILON) / (pair.fromCoord - prev.fromCoord + Number.EPSILON) + prev.toCoord; + break; + } + } + } + } + + return normalized; + }; + + _proto.transformPoints = function transformPoints(gid, glyphPoints) { + if (!this.font.fvar || !this.font.gvar) { + return; + } + + var gvar = this.font.gvar; + + if (gid >= gvar.glyphCount) { + return; + } + + var offset = gvar.offsets[gid]; + + if (offset === gvar.offsets[gid + 1]) { + return; + } // Read the gvar data for this glyph + + + var stream = this.font.stream; + stream.pos = offset; + + if (stream.pos >= stream.length) { + return; + } + + var tupleCount = stream.readUInt16BE(); + var offsetToData = offset + stream.readUInt16BE(); + + if (tupleCount & TUPLES_SHARE_POINT_NUMBERS) { + var here = stream.pos; + stream.pos = offsetToData; + var sharedPoints = this.decodePoints(); + offsetToData = stream.pos; + stream.pos = here; + } + + var origPoints = glyphPoints.map(function (pt) { + return pt.copy(); + }); + tupleCount &= TUPLE_COUNT_MASK; + + for (var i = 0; i < tupleCount; i++) { + var tupleDataSize = stream.readUInt16BE(); + var tupleIndex = stream.readUInt16BE(); + + if (tupleIndex & EMBEDDED_TUPLE_COORD) { + var tupleCoords = []; + + for (var a = 0; a < gvar.axisCount; a++) { + tupleCoords.push(stream.readInt16BE() / 16384); + } + } else { + if ((tupleIndex & TUPLE_INDEX_MASK) >= gvar.globalCoordCount) { + throw new Error('Invalid gvar table'); + } + + var tupleCoords = gvar.globalCoords[tupleIndex & TUPLE_INDEX_MASK]; + } + + if (tupleIndex & INTERMEDIATE_TUPLE) { + var startCoords = []; + + for (var _a = 0; _a < gvar.axisCount; _a++) { + startCoords.push(stream.readInt16BE() / 16384); + } + + var endCoords = []; + + for (var _a2 = 0; _a2 < gvar.axisCount; _a2++) { + endCoords.push(stream.readInt16BE() / 16384); + } + } // Get the factor at which to apply this tuple + + + var factor = this.tupleFactor(tupleIndex, tupleCoords, startCoords, endCoords); + + if (factor === 0) { + offsetToData += tupleDataSize; + continue; + } + + var here = stream.pos; + stream.pos = offsetToData; + + if (tupleIndex & PRIVATE_POINT_NUMBERS) { + var points = this.decodePoints(); + } else { + var points = sharedPoints; + } // points.length = 0 means there are deltas for all points + + + var nPoints = points.length === 0 ? glyphPoints.length : points.length; + var xDeltas = this.decodeDeltas(nPoints); + var yDeltas = this.decodeDeltas(nPoints); + + if (points.length === 0) { + // all points + for (var _i = 0; _i < glyphPoints.length; _i++) { + var point = glyphPoints[_i]; + point.x += Math.round(xDeltas[_i] * factor); + point.y += Math.round(yDeltas[_i] * factor); + } + } else { + var outPoints = origPoints.map(function (pt) { + return pt.copy(); + }); + var hasDelta = glyphPoints.map(function () { + return false; + }); + + for (var _i2 = 0; _i2 < points.length; _i2++) { + var idx = points[_i2]; + + if (idx < glyphPoints.length) { + var _point = outPoints[idx]; + hasDelta[idx] = true; + _point.x += Math.round(xDeltas[_i2] * factor); + _point.y += Math.round(yDeltas[_i2] * factor); + } + } + + this.interpolateMissingDeltas(outPoints, origPoints, hasDelta); + + for (var _i3 = 0; _i3 < glyphPoints.length; _i3++) { + var deltaX = outPoints[_i3].x - origPoints[_i3].x; + var deltaY = outPoints[_i3].y - origPoints[_i3].y; + glyphPoints[_i3].x += deltaX; + glyphPoints[_i3].y += deltaY; + } + } + + offsetToData += tupleDataSize; + stream.pos = here; + } + }; + + _proto.decodePoints = function decodePoints() { + var stream = this.font.stream; + var count = stream.readUInt8(); + + if (count & POINTS_ARE_WORDS) { + count = (count & POINT_RUN_COUNT_MASK) << 8 | stream.readUInt8(); + } + + var points = new Uint16Array(count); + var i = 0; + var point = 0; + + while (i < count) { + var run = stream.readUInt8(); + var runCount = (run & POINT_RUN_COUNT_MASK) + 1; + var fn = run & POINTS_ARE_WORDS ? stream.readUInt16 : stream.readUInt8; + + for (var j = 0; j < runCount && i < count; j++) { + point += fn.call(stream); + points[i++] = point; + } + } + + return points; + }; + + _proto.decodeDeltas = function decodeDeltas(count) { + var stream = this.font.stream; + var i = 0; + var deltas = new Int16Array(count); + + while (i < count) { + var run = stream.readUInt8(); + var runCount = (run & DELTA_RUN_COUNT_MASK) + 1; + + if (run & DELTAS_ARE_ZERO) { + i += runCount; + } else { + var fn = run & DELTAS_ARE_WORDS ? stream.readInt16BE : stream.readInt8; + + for (var j = 0; j < runCount && i < count; j++) { + deltas[i++] = fn.call(stream); + } + } + } + + return deltas; + }; + + _proto.tupleFactor = function tupleFactor(tupleIndex, tupleCoords, startCoords, endCoords) { + var normalized = this.normalizedCoords; + var gvar = this.font.gvar; + var factor = 1; + + for (var i = 0; i < gvar.axisCount; i++) { + if (tupleCoords[i] === 0) { + continue; + } + + if (normalized[i] === 0) { + return 0; + } + + if ((tupleIndex & INTERMEDIATE_TUPLE) === 0) { + if (normalized[i] < Math.min(0, tupleCoords[i]) || normalized[i] > Math.max(0, tupleCoords[i])) { + return 0; + } + + factor = (factor * normalized[i] + Number.EPSILON) / (tupleCoords[i] + Number.EPSILON); + } else { + if (normalized[i] < startCoords[i] || normalized[i] > endCoords[i]) { + return 0; + } else if (normalized[i] < tupleCoords[i]) { + factor = factor * (normalized[i] - startCoords[i] + Number.EPSILON) / (tupleCoords[i] - startCoords[i] + Number.EPSILON); + } else { + factor = factor * (endCoords[i] - normalized[i] + Number.EPSILON) / (endCoords[i] - tupleCoords[i] + Number.EPSILON); + } + } + } + + return factor; + } // Interpolates points without delta values. + // Needed for the Ø and Q glyphs in Skia. + // Algorithm from Freetype. + ; + + _proto.interpolateMissingDeltas = function interpolateMissingDeltas(points, inPoints, hasDelta) { + if (points.length === 0) { + return; + } + + var point = 0; + + while (point < points.length) { + var firstPoint = point; // find the end point of the contour + + var endPoint = point; + var pt = points[endPoint]; + + while (!pt.endContour) { + pt = points[++endPoint]; + } // find the first point that has a delta + + + while (point <= endPoint && !hasDelta[point]) { + point++; + } + + if (point > endPoint) { + continue; + } + + var firstDelta = point; + var curDelta = point; + point++; + + while (point <= endPoint) { + // find the next point with a delta, and interpolate intermediate points + if (hasDelta[point]) { + this.deltaInterpolate(curDelta + 1, point - 1, curDelta, point, inPoints, points); + curDelta = point; + } + + point++; + } // shift contour if we only have a single delta + + + if (curDelta === firstDelta) { + this.deltaShift(firstPoint, endPoint, curDelta, inPoints, points); + } else { + // otherwise, handle the remaining points at the end and beginning of the contour + this.deltaInterpolate(curDelta + 1, endPoint, curDelta, firstDelta, inPoints, points); + + if (firstDelta > 0) { + this.deltaInterpolate(firstPoint, firstDelta - 1, curDelta, firstDelta, inPoints, points); + } + } + + point = endPoint + 1; + } + }; + + _proto.deltaInterpolate = function deltaInterpolate(p1, p2, ref1, ref2, inPoints, outPoints) { + if (p1 > p2) { + return; + } + + var iterable = ['x', 'y']; + + for (var i = 0; i < iterable.length; i++) { + var k = iterable[i]; + + if (inPoints[ref1][k] > inPoints[ref2][k]) { + var p = ref1; + ref1 = ref2; + ref2 = p; + } + + var in1 = inPoints[ref1][k]; + var in2 = inPoints[ref2][k]; + var out1 = outPoints[ref1][k]; + var out2 = outPoints[ref2][k]; // If the reference points have the same coordinate but different + // delta, inferred delta is zero. Otherwise interpolate. + + if (in1 !== in2 || out1 === out2) { + var scale = in1 === in2 ? 0 : (out2 - out1) / (in2 - in1); + + for (var _p = p1; _p <= p2; _p++) { + var out = inPoints[_p][k]; + + if (out <= in1) { + out += out1 - in1; + } else if (out >= in2) { + out += out2 - in2; + } else { + out = out1 + (out - in1) * scale; + } + + outPoints[_p][k] = out; + } + } + } + }; + + _proto.deltaShift = function deltaShift(p1, p2, ref, inPoints, outPoints) { + var deltaX = outPoints[ref].x - inPoints[ref].x; + var deltaY = outPoints[ref].y - inPoints[ref].y; + + if (deltaX === 0 && deltaY === 0) { + return; + } + + for (var p = p1; p <= p2; p++) { + if (p !== ref) { + outPoints[p].x += deltaX; + outPoints[p].y += deltaY; + } + } + }; + + _proto.getAdvanceAdjustment = function getAdvanceAdjustment(gid, table) { + var outerIndex, innerIndex; + + if (table.advanceWidthMapping) { + var idx = gid; + + if (idx >= table.advanceWidthMapping.mapCount) { + idx = table.advanceWidthMapping.mapCount - 1; + } + + var entryFormat = table.advanceWidthMapping.entryFormat; + var _table$advanceWidthMa = table.advanceWidthMapping.mapData[idx]; + outerIndex = _table$advanceWidthMa.outerIndex; + innerIndex = _table$advanceWidthMa.innerIndex; + } else { + outerIndex = 0; + innerIndex = gid; + } + + return this.getDelta(table.itemVariationStore, outerIndex, innerIndex); + } // See pseudo code from `Font Variations Overview' + // in the OpenType specification. + ; + + _proto.getDelta = function getDelta(itemStore, outerIndex, innerIndex) { + if (outerIndex >= itemStore.itemVariationData.length) { + return 0; + } + + var varData = itemStore.itemVariationData[outerIndex]; + + if (innerIndex >= varData.deltaSets.length) { + return 0; + } + + var deltaSet = varData.deltaSets[innerIndex]; + var blendVector = this.getBlendVector(itemStore, outerIndex); + var netAdjustment = 0; + + for (var master = 0; master < varData.regionIndexCount; master++) { + netAdjustment += deltaSet.deltas[master] * blendVector[master]; + } + + return netAdjustment; + }; + + _proto.getBlendVector = function getBlendVector(itemStore, outerIndex) { + var varData = itemStore.itemVariationData[outerIndex]; + + if (this.blendVectors.has(varData)) { + return this.blendVectors.get(varData); + } + + var normalizedCoords = this.normalizedCoords; + var blendVector = []; // outer loop steps through master designs to be blended + + for (var master = 0; master < varData.regionIndexCount; master++) { + var scalar = 1; + var regionIndex = varData.regionIndexes[master]; + var axes = itemStore.variationRegionList.variationRegions[regionIndex]; // inner loop steps through axes in this region + + for (var j = 0; j < axes.length; j++) { + var axis = axes[j]; + var axisScalar = void 0; // compute the scalar contribution of this axis + // ignore invalid ranges + + if (axis.startCoord > axis.peakCoord || axis.peakCoord > axis.endCoord) { + axisScalar = 1; + } else if (axis.startCoord < 0 && axis.endCoord > 0 && axis.peakCoord !== 0) { + axisScalar = 1; // peak of 0 means ignore this axis + } else if (axis.peakCoord === 0) { + axisScalar = 1; // ignore this region if coords are out of range + } else if (normalizedCoords[j] < axis.startCoord || normalizedCoords[j] > axis.endCoord) { + axisScalar = 0; // calculate a proportional factor + } else { + if (normalizedCoords[j] === axis.peakCoord) { + axisScalar = 1; + } else if (normalizedCoords[j] < axis.peakCoord) { + axisScalar = (normalizedCoords[j] - axis.startCoord + Number.EPSILON) / (axis.peakCoord - axis.startCoord + Number.EPSILON); + } else { + axisScalar = (axis.endCoord - normalizedCoords[j] + Number.EPSILON) / (axis.endCoord - axis.peakCoord + Number.EPSILON); + } + } // take product of all the axis scalars + + + scalar *= axisScalar; + } + + blendVector[master] = scalar; + } + + this.blendVectors.set(varData, blendVector); + return blendVector; + }; + + return GlyphVariationProcessor; +}(); + +var clone_1 = createCommonjsModule(function (module) { + var clone = function () { + /** + * Clones (copies) an Object using deep copying. + * + * This function supports circular references by default, but if you are certain + * there are no circular references in your object, you can save some CPU time + * by calling clone(obj, false). + * + * Caution: if `circular` is false and `parent` contains circular references, + * your program may enter an infinite loop and crash. + * + * @param `parent` - the object to be cloned + * @param `circular` - set to true if the object to be cloned may contain + * circular references. (optional - true by default) + * @param `depth` - set to a number if the object is only to be cloned to + * a particular depth. (optional - defaults to Infinity) + * @param `prototype` - sets the prototype to be used when cloning an object. + * (optional - defaults to parent prototype). + */ + + function clone(parent, circular, depth, prototype) { + var filter; + + if (typeof circular === 'object') { + depth = circular.depth; + prototype = circular.prototype; + filter = circular.filter; + circular = circular.circular; + } // maintain two arrays for circular references, where corresponding parents + // and children have the same index + + + var allParents = []; + var allChildren = []; + var useBuffer = typeof buffer_1 != 'undefined'; + if (typeof circular == 'undefined') circular = true; + if (typeof depth == 'undefined') depth = Infinity; // recurse this function so we don't reset allParents and allChildren + + function _clone(parent, depth) { + // cloning null always returns null + if (parent === null) return null; + if (depth == 0) return parent; + var child; + var proto; + + if (typeof parent != 'object') { + return parent; + } + + if (clone.__isArray(parent)) { + child = []; + } else if (clone.__isRegExp(parent)) { + child = new RegExp(parent.source, __getRegExpFlags(parent)); + if (parent.lastIndex) child.lastIndex = parent.lastIndex; + } else if (clone.__isDate(parent)) { + child = new Date(parent.getTime()); + } else if (useBuffer && buffer_1.isBuffer(parent)) { + if (buffer_1.allocUnsafe) { + // Node.js >= 4.5.0 + child = buffer_1.allocUnsafe(parent.length); + } else { + // Older Node.js versions + child = new buffer_1(parent.length); + } + + parent.copy(child); + return child; + } else { + if (typeof prototype == 'undefined') { + proto = Object.getPrototypeOf(parent); + child = Object.create(proto); + } else { + child = Object.create(prototype); + proto = prototype; + } + } + + if (circular) { + var index = allParents.indexOf(parent); + + if (index != -1) { + return allChildren[index]; + } + + allParents.push(parent); + allChildren.push(child); + } + + for (var i in parent) { + var attrs; + + if (proto) { + attrs = Object.getOwnPropertyDescriptor(proto, i); + } + + if (attrs && attrs.set == null) { + continue; + } + + child[i] = _clone(parent[i], depth - 1); + } + + return child; + } + + return _clone(parent, depth); + } + /** + * Simple flat clone using prototype, accepts only objects, usefull for property + * override on FLAT configuration object (no nested props). + * + * USE WITH CAUTION! This may not behave as you wish if you do not know how this + * works. + */ + + + clone.clonePrototype = function clonePrototype(parent) { + if (parent === null) return null; + + var c = function c() {}; + + c.prototype = parent; + return new c(); + }; // private utility functions + + + function __objToStr(o) { + return Object.prototype.toString.call(o); + } + clone.__objToStr = __objToStr; + + function __isDate(o) { + return typeof o === 'object' && __objToStr(o) === '[object Date]'; + } + clone.__isDate = __isDate; + + function __isArray(o) { + return typeof o === 'object' && __objToStr(o) === '[object Array]'; + } + clone.__isArray = __isArray; + + function __isRegExp(o) { + return typeof o === 'object' && __objToStr(o) === '[object RegExp]'; + } + clone.__isRegExp = __isRegExp; + + function __getRegExpFlags(re) { + var flags = ''; + if (re.global) flags += 'g'; + if (re.ignoreCase) flags += 'i'; + if (re.multiline) flags += 'm'; + return flags; + } + clone.__getRegExpFlags = __getRegExpFlags; + return clone; + }(); + + if ( module.exports) { + module.exports = clone; + } +}); + +var Subset = /*#__PURE__*/function () { + function Subset(font) { + this.font = font; + this.glyphs = []; + this.mapping = {}; // always include the missing glyph + + this.includeGlyph(0); + } + + var _proto = Subset.prototype; + + _proto.includeGlyph = function includeGlyph(glyph) { + if (typeof glyph === 'object') { + glyph = glyph.id; + } + + if (this.mapping[glyph] == null) { + this.glyphs.push(glyph); + this.mapping[glyph] = this.glyphs.length - 1; + } + + return this.mapping[glyph]; + }; + + _proto.encodeStream = function encodeStream() { + var _this = this; + + var s = new restructure.EncodeStream(); + nextTick(function () { + _this.encode(s); + + return s.end(); + }); + return s; + }; + + return Subset; +}(); + +var ON_CURVE$1 = 1 << 0; +var X_SHORT_VECTOR$1 = 1 << 1; +var Y_SHORT_VECTOR$1 = 1 << 2; +var REPEAT$1 = 1 << 3; +var SAME_X$1 = 1 << 4; +var SAME_Y$1 = 1 << 5; + +var Point$1 = /*#__PURE__*/function () { + function Point() {} + + Point.size = function size(val) { + return val >= 0 && val <= 255 ? 1 : 2; + }; + + Point.encode = function encode(stream, value) { + if (value >= 0 && value <= 255) { + stream.writeUInt8(value); + } else { + stream.writeInt16BE(value); + } + }; + + return Point; +}(); + +var Glyf = new restructure.Struct({ + numberOfContours: restructure.int16, + // if negative, this is a composite glyph + xMin: restructure.int16, + yMin: restructure.int16, + xMax: restructure.int16, + yMax: restructure.int16, + endPtsOfContours: new restructure.Array(restructure.uint16, 'numberOfContours'), + instructions: new restructure.Array(restructure.uint8, restructure.uint16), + flags: new restructure.Array(restructure.uint8, 0), + xPoints: new restructure.Array(Point$1, 0), + yPoints: new restructure.Array(Point$1, 0) +}); +/** + * Encodes TrueType glyph outlines + */ + +var TTFGlyphEncoder = /*#__PURE__*/function () { + function TTFGlyphEncoder() {} + + var _proto = TTFGlyphEncoder.prototype; + + _proto.encodeSimple = function encodeSimple(path, instructions) { + if (instructions === void 0) { + instructions = []; + } + + var endPtsOfContours = []; + var xPoints = []; + var yPoints = []; + var flags = []; + var same = 0; + var lastX = 0, + lastY = 0, + lastFlag = 0; + var pointCount = 0; + + for (var i = 0; i < path.commands.length; i++) { + var c = path.commands[i]; + + for (var j = 0; j < c.args.length; j += 2) { + var x = c.args[j]; + var y = c.args[j + 1]; + var flag = 0; // If the ending point of a quadratic curve is the midpoint + // between the control point and the control point of the next + // quadratic curve, we can omit the ending point. + + if (c.command === 'quadraticCurveTo' && j === 2) { + var next = path.commands[i + 1]; + + if (next && next.command === 'quadraticCurveTo') { + var midX = (lastX + next.args[0]) / 2; + var midY = (lastY + next.args[1]) / 2; + + if (x === midX && y === midY) { + continue; + } + } + } // All points except control points are on curve. + + + if (!(c.command === 'quadraticCurveTo' && j === 0)) { + flag |= ON_CURVE$1; + } + + flag = this._encodePoint(x, lastX, xPoints, flag, X_SHORT_VECTOR$1, SAME_X$1); + flag = this._encodePoint(y, lastY, yPoints, flag, Y_SHORT_VECTOR$1, SAME_Y$1); + + if (flag === lastFlag && same < 255) { + flags[flags.length - 1] |= REPEAT$1; + same++; + } else { + if (same > 0) { + flags.push(same); + same = 0; + } + + flags.push(flag); + lastFlag = flag; + } + + lastX = x; + lastY = y; + pointCount++; + } + + if (c.command === 'closePath') { + endPtsOfContours.push(pointCount - 1); + } + } // Close the path if the last command didn't already + + + if (path.commands.length > 1 && path.commands[path.commands.length - 1].command !== 'closePath') { + endPtsOfContours.push(pointCount - 1); + } + + var bbox = path.bbox; + var glyf = { + numberOfContours: endPtsOfContours.length, + xMin: bbox.minX, + yMin: bbox.minY, + xMax: bbox.maxX, + yMax: bbox.maxY, + endPtsOfContours: endPtsOfContours, + instructions: instructions, + flags: flags, + xPoints: xPoints, + yPoints: yPoints + }; + var size = Glyf.size(glyf); + var tail = 4 - size % 4; + var stream = new restructure.EncodeStream(size + tail); + Glyf.encode(stream, glyf); // Align to 4-byte length + + if (tail !== 0) { + stream.fill(0, tail); + } + + return stream.buffer; + }; + + _proto._encodePoint = function _encodePoint(value, last, points, flag, shortFlag, sameFlag) { + var diff = value - last; + + if (value === last) { + flag |= sameFlag; + } else { + if (-255 <= diff && diff <= 255) { + flag |= shortFlag; + + if (diff < 0) { + diff = -diff; + } else { + flag |= sameFlag; + } + } + + points.push(diff); + } + + return flag; + }; + + return TTFGlyphEncoder; +}(); + +function _createForOfIteratorHelperLoose$o(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$o(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$o(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$o(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$o(o, minLen); } + +function _arrayLikeToArray$o(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _inheritsLoose$d(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var TTFSubset = /*#__PURE__*/function (_Subset) { + _inheritsLoose$d(TTFSubset, _Subset); + + function TTFSubset(font) { + var _this; + + _this = _Subset.call(this, font) || this; + _this.glyphEncoder = new TTFGlyphEncoder(); + return _this; + } + + var _proto = TTFSubset.prototype; + + _proto._addGlyph = function _addGlyph(gid) { + var glyph = this.font.getGlyph(gid); + + var glyf = glyph._decode(); // get the offset to the glyph from the loca table + + + var curOffset = this.font.loca.offsets[gid]; + var nextOffset = this.font.loca.offsets[gid + 1]; + + var stream = this.font._getTableStream('glyf'); + + stream.pos += curOffset; + var buffer = stream.readBuffer(nextOffset - curOffset); // if it is a compound glyph, include its components + + if (glyf && glyf.numberOfContours < 0) { + buffer = new buffer_1(buffer); + + for (var _iterator = _createForOfIteratorHelperLoose$o(glyf.components), _step; !(_step = _iterator()).done;) { + var component = _step.value; + gid = this.includeGlyph(component.glyphID); + buffer.writeUInt16BE(gid, component.pos); + } + } else if (glyf && this.font._variationProcessor) { + // If this is a TrueType variation glyph, re-encode the path + buffer = this.glyphEncoder.encodeSimple(glyph.path, glyf.instructions); + } + + this.glyf.push(buffer); + this.loca.offsets.push(this.offset); + this.hmtx.metrics.push({ + advance: glyph.advanceWidth, + bearing: glyph._getMetrics().leftBearing + }); + this.offset += buffer.length; + return this.glyf.length - 1; + }; + + _proto.encode = function encode(stream) { + // tables required by PDF spec: + // head, hhea, loca, maxp, cvt , prep, glyf, hmtx, fpgm + // + // additional tables required for standalone fonts: + // name, cmap, OS/2, post + this.glyf = []; + this.offset = 0; + this.loca = { + offsets: [] + }; + this.hmtx = { + metrics: [], + bearings: [] + }; // include all the glyphs + // not using a for loop because we need to support adding more + // glyphs to the array as we go, and CoffeeScript caches the length. + + var i = 0; + + while (i < this.glyphs.length) { + this._addGlyph(this.glyphs[i++]); + } + + var maxp = clone_1(this.font.maxp); + maxp.numGlyphs = this.glyf.length; + this.loca.offsets.push(this.offset); + tables.loca.preEncode.call(this.loca); + var head = clone_1(this.font.head); + head.indexToLocFormat = this.loca.version; + var hhea = clone_1(this.font.hhea); + hhea.numberOfMetrics = this.hmtx.metrics.length; // map = [] + // for index in [0...256] + // if index < @numGlyphs + // map[index] = index + // else + // map[index] = 0 + // + // cmapTable = + // version: 0 + // length: 262 + // language: 0 + // codeMap: map + // + // cmap = + // version: 0 + // numSubtables: 1 + // tables: [ + // platformID: 1 + // encodingID: 0 + // table: cmapTable + // ] + // TODO: subset prep, cvt, fpgm? + + Directory.encode(stream, { + tables: { + head: head, + hhea: hhea, + loca: this.loca, + maxp: maxp, + 'cvt ': this.font['cvt '], + prep: this.font.prep, + glyf: this.glyf, + hmtx: this.hmtx, + fpgm: this.font.fpgm // name: clone @font.name + // 'OS/2': clone @font['OS/2'] + // post: clone @font.post + // cmap: cmap + + } + }); + }; + + return TTFSubset; +}(Subset); + +function _createForOfIteratorHelperLoose$p(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$p(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$p(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$p(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$p(o, minLen); } + +function _arrayLikeToArray$p(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _inheritsLoose$e(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var CFFSubset = /*#__PURE__*/function (_Subset) { + _inheritsLoose$e(CFFSubset, _Subset); + + function CFFSubset(font) { + var _this; + + _this = _Subset.call(this, font) || this; + _this.cff = _this.font['CFF ']; + + if (!_this.cff) { + throw new Error('Not a CFF Font'); + } + + return _this; + } + + var _proto = CFFSubset.prototype; + + _proto.subsetCharstrings = function subsetCharstrings() { + this.charstrings = []; + var gsubrs = {}; + + for (var _iterator = _createForOfIteratorHelperLoose$p(this.glyphs), _step; !(_step = _iterator()).done;) { + var gid = _step.value; + this.charstrings.push(this.cff.getCharString(gid)); + var glyph = this.font.getGlyph(gid); + var path = glyph.path; // this causes the glyph to be parsed + + for (var subr in glyph._usedGsubrs) { + gsubrs[subr] = true; + } + } + + this.gsubrs = this.subsetSubrs(this.cff.globalSubrIndex, gsubrs); + }; + + _proto.subsetSubrs = function subsetSubrs(subrs, used) { + var res = []; + + for (var i = 0; i < subrs.length; i++) { + var subr = subrs[i]; + + if (used[i]) { + this.cff.stream.pos = subr.offset; + res.push(this.cff.stream.readBuffer(subr.length)); + } else { + res.push(new buffer_1([11])); // return + } + } + + return res; + }; + + _proto.subsetFontdict = function subsetFontdict(topDict) { + topDict.FDArray = []; + topDict.FDSelect = { + version: 0, + fds: [] + }; + var used_fds = {}; + var used_subrs = []; + + for (var _iterator2 = _createForOfIteratorHelperLoose$p(this.glyphs), _step2; !(_step2 = _iterator2()).done;) { + var gid = _step2.value; + var fd = this.cff.fdForGlyph(gid); + + if (fd == null) { + continue; + } + + if (!used_fds[fd]) { + topDict.FDArray.push(Object.assign({}, this.cff.topDict.FDArray[fd])); + used_subrs.push({}); + } + + used_fds[fd] = true; + topDict.FDSelect.fds.push(topDict.FDArray.length - 1); + var glyph = this.font.getGlyph(gid); + var path = glyph.path; // this causes the glyph to be parsed + + for (var subr in glyph._usedSubrs) { + used_subrs[used_subrs.length - 1][subr] = true; + } + } + + for (var i = 0; i < topDict.FDArray.length; i++) { + var dict = topDict.FDArray[i]; + delete dict.FontName; + + if (dict.Private && dict.Private.Subrs) { + dict.Private = Object.assign({}, dict.Private); + dict.Private.Subrs = this.subsetSubrs(dict.Private.Subrs, used_subrs[i]); + } + } + + return; + }; + + _proto.createCIDFontdict = function createCIDFontdict(topDict) { + var used_subrs = {}; + + for (var _iterator3 = _createForOfIteratorHelperLoose$p(this.glyphs), _step3; !(_step3 = _iterator3()).done;) { + var gid = _step3.value; + var glyph = this.font.getGlyph(gid); + var path = glyph.path; // this causes the glyph to be parsed + + for (var subr in glyph._usedSubrs) { + used_subrs[subr] = true; + } + } + + var privateDict = Object.assign({}, this.cff.topDict.Private); + + if (this.cff.topDict.Private && this.cff.topDict.Private.Subrs) { + privateDict.Subrs = this.subsetSubrs(this.cff.topDict.Private.Subrs, used_subrs); + } + + topDict.FDArray = [{ + Private: privateDict + }]; + return topDict.FDSelect = { + version: 3, + nRanges: 1, + ranges: [{ + first: 0, + fd: 0 + }], + sentinel: this.charstrings.length + }; + }; + + _proto.addString = function addString(string) { + if (!string) { + return null; + } + + if (!this.strings) { + this.strings = []; + } + + this.strings.push(string); + return standardStrings.length + this.strings.length - 1; + }; + + _proto.encode = function encode(stream) { + this.subsetCharstrings(); + var charset = { + version: this.charstrings.length > 255 ? 2 : 1, + ranges: [{ + first: 1, + nLeft: this.charstrings.length - 2 + }] + }; + var topDict = Object.assign({}, this.cff.topDict); + topDict.Private = null; + topDict.charset = charset; + topDict.Encoding = null; + topDict.CharStrings = this.charstrings; + + for (var _i = 0, _arr = ['version', 'Notice', 'Copyright', 'FullName', 'FamilyName', 'Weight', 'PostScript', 'BaseFontName', 'FontName']; _i < _arr.length; _i++) { + var key = _arr[_i]; + topDict[key] = this.addString(this.cff.string(topDict[key])); + } + + topDict.ROS = [this.addString('Adobe'), this.addString('Identity'), 0]; + topDict.CIDCount = this.charstrings.length; + + if (this.cff.isCIDFont) { + this.subsetFontdict(topDict); + } else { + this.createCIDFontdict(topDict); + } + + var top = { + version: 1, + hdrSize: this.cff.hdrSize, + offSize: this.cff.length, + header: this.cff.header, + nameIndex: [this.cff.postscriptName], + topDictIndex: [topDict], + stringIndex: this.strings, + globalSubrIndex: this.gsubrs + }; + CFFTop.encode(stream, top); + }; + + return CFFSubset; +}(Subset); + +var _class$4; + +function _createForOfIteratorHelperLoose$q(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$q(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$q(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$q(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$q(o, minLen); } + +function _arrayLikeToArray$q(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _defineProperties$8(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass$8(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$8(Constructor.prototype, protoProps); if (staticProps) _defineProperties$8(Constructor, staticProps); return Constructor; } + +function _applyDecoratedDescriptor$4(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; } +/** + * This is the base class for all SFNT-based font formats in fontkit. + * It supports TrueType, and PostScript glyphs, and several color glyph formats. + */ + +var TTFFont = (_class$4 = /*#__PURE__*/function () { + TTFFont.probe = function probe(buffer) { + var format = buffer.toString('ascii', 0, 4); + return format === 'true' || format === 'OTTO' || format === String.fromCharCode(0, 1, 0, 0); + }; + + function TTFFont(stream, variationCoords) { + if (variationCoords === void 0) { + variationCoords = null; + } + + this.stream = stream; + this.variationCoords = variationCoords; + this._directoryPos = this.stream.pos; + this._tables = {}; + this._glyphs = {}; + + this._decodeDirectory(); // define properties for each table to lazily parse + + + for (var tag in this.directory.tables) { + var table = this.directory.tables[tag]; + + if (tables[tag] && table.length > 0) { + Object.defineProperty(this, tag, { + get: this._getTable.bind(this, table) + }); + } + } + } + + var _proto = TTFFont.prototype; + + _proto._getTable = function _getTable(table) { + if (!(table.tag in this._tables)) { + try { + this._tables[table.tag] = this._decodeTable(table); + } catch (e) { + if (fontkit.logErrors) { + console.error("Error decoding table " + table.tag); + console.error(e.stack); + } + } + } + + return this._tables[table.tag]; + }; + + _proto._getTableStream = function _getTableStream(tag) { + var table = this.directory.tables[tag]; + + if (table) { + this.stream.pos = table.offset; + return this.stream; + } + + return null; + }; + + _proto._decodeDirectory = function _decodeDirectory() { + return this.directory = Directory.decode(this.stream, { + _startOffset: 0 + }); + }; + + _proto._decodeTable = function _decodeTable(table) { + var pos = this.stream.pos; + + var stream = this._getTableStream(table.tag); + + var result = tables[table.tag].decode(stream, this, table.length); + this.stream.pos = pos; + return result; + } + /** + * The unique PostScript name for this font + * @type {string} + */ + ; + + /** + * Gets a string from the font's `name` table + * `lang` is a BCP-47 language code. + * @return {string} + */ + _proto.getName = function getName(key, lang) { + if (lang === void 0) { + lang = 'en'; + } + + var record = this.name.records[key]; + + if (record) { + return record[lang]; + } + + return null; + } + /** + * The font's full name, e.g. "Helvetica Bold" + * @type {string} + */ + ; + + /** + * Returns whether there is glyph in the font for the given unicode code point. + * + * @param {number} codePoint + * @return {boolean} + */ + _proto.hasGlyphForCodePoint = function hasGlyphForCodePoint(codePoint) { + return !!this._cmapProcessor.lookup(codePoint); + } + /** + * Maps a single unicode code point to a Glyph object. + * Does not perform any advanced substitutions (there is no context to do so). + * + * @param {number} codePoint + * @return {Glyph} + */ + ; + + _proto.glyphForCodePoint = function glyphForCodePoint(codePoint) { + return this.getGlyph(this._cmapProcessor.lookup(codePoint), [codePoint]); + } + /** + * Returns an array of Glyph objects for the given string. + * This is only a one-to-one mapping from characters to glyphs. + * For most uses, you should use font.layout (described below), which + * provides a much more advanced mapping supporting AAT and OpenType shaping. + * + * @param {string} string + * @return {Glyph[]} + */ + ; + + _proto.glyphsForString = function glyphsForString(string) { + var glyphs = []; + var len = string.length; + var idx = 0; + var last = -1; + var state = -1; + + while (idx <= len) { + var code = 0; + var nextState = 0; + + if (idx < len) { + // Decode the next codepoint from UTF 16 + code = string.charCodeAt(idx++); + + if (0xd800 <= code && code <= 0xdbff && idx < len) { + var next = string.charCodeAt(idx); + + if (0xdc00 <= next && next <= 0xdfff) { + idx++; + code = ((code & 0x3ff) << 10) + (next & 0x3ff) + 0x10000; + } + } // Compute the next state: 1 if the next codepoint is a variation selector, 0 otherwise. + + + nextState = 0xfe00 <= code && code <= 0xfe0f || 0xe0100 <= code && code <= 0xe01ef ? 1 : 0; + } else { + idx++; + } + + if (state === 0 && nextState === 1) { + // Variation selector following normal codepoint. + glyphs.push(this.getGlyph(this._cmapProcessor.lookup(last, code), [last, code])); + } else if (state === 0 && nextState === 0) { + // Normal codepoint following normal codepoint. + glyphs.push(this.glyphForCodePoint(last)); + } + + last = code; + state = nextState; + } + + return glyphs; + }; + + /** + * Returns a GlyphRun object, which includes an array of Glyphs and GlyphPositions for the given string. + * + * @param {string} string + * @param {string[]} [userFeatures] + * @param {string} [script] + * @param {string} [language] + * @param {string} [direction] + * @return {GlyphRun} + */ + _proto.layout = function layout(string, userFeatures, script, language, direction) { + return this._layoutEngine.layout(string, userFeatures, script, language, direction); + } + /** + * Returns an array of strings that map to the given glyph id. + * @param {number} gid - glyph id + */ + ; + + _proto.stringsForGlyph = function stringsForGlyph(gid) { + return this._layoutEngine.stringsForGlyph(gid); + } + /** + * An array of all [OpenType feature tags](https://www.microsoft.com/typography/otspec/featuretags.htm) + * (or mapped AAT tags) supported by the font. + * The features parameter is an array of OpenType feature tags to be applied in addition to the default set. + * If this is an AAT font, the OpenType feature tags are mapped to AAT features. + * + * @type {string[]} + */ + ; + + _proto.getAvailableFeatures = function getAvailableFeatures(script, language) { + return this._layoutEngine.getAvailableFeatures(script, language); + }; + + _proto._getBaseGlyph = function _getBaseGlyph(glyph, characters) { + if (characters === void 0) { + characters = []; + } + + if (!this._glyphs[glyph]) { + if (this.directory.tables.glyf) { + this._glyphs[glyph] = new TTFGlyph(glyph, characters, this); + } else if (this.directory.tables['CFF '] || this.directory.tables.CFF2) { + this._glyphs[glyph] = new CFFGlyph(glyph, characters, this); + } + } + + return this._glyphs[glyph] || null; + } + /** + * Returns a glyph object for the given glyph id. + * You can pass the array of code points this glyph represents for + * your use later, and it will be stored in the glyph object. + * + * @param {number} glyph + * @param {number[]} characters + * @return {Glyph} + */ + ; + + _proto.getGlyph = function getGlyph(glyph, characters) { + if (characters === void 0) { + characters = []; + } + + if (!this._glyphs[glyph]) { + if (this.directory.tables.sbix) { + this._glyphs[glyph] = new SBIXGlyph(glyph, characters, this); + } else if (this.directory.tables.COLR && this.directory.tables.CPAL) { + this._glyphs[glyph] = new COLRGlyph(glyph, characters, this); + } else { + this._getBaseGlyph(glyph, characters); + } + } + + return this._glyphs[glyph] || null; + } + /** + * Returns a Subset for this font. + * @return {Subset} + */ + ; + + _proto.createSubset = function createSubset() { + if (this.directory.tables['CFF ']) { + return new CFFSubset(this); + } + + return new TTFSubset(this); + } + /** + * Returns an object describing the available variation axes + * that this font supports. Keys are setting tags, and values + * contain the axis name, range, and default value. + * + * @type {object} + */ + ; + + /** + * Returns a new font with the given variation settings applied. + * Settings can either be an instance name, or an object containing + * variation tags as specified by the `variationAxes` property. + * + * @param {object} settings + * @return {TTFFont} + */ + _proto.getVariation = function getVariation(settings) { + if (!(this.directory.tables.fvar && (this.directory.tables.gvar && this.directory.tables.glyf || this.directory.tables.CFF2))) { + throw new Error('Variations require a font with the fvar, gvar and glyf, or CFF2 tables.'); + } + + if (typeof settings === 'string') { + settings = this.namedVariations[settings]; + } + + if (typeof settings !== 'object') { + throw new Error('Variation settings must be either a variation name or settings object.'); + } // normalize the coordinates + + + var coords = this.fvar.axis.map(function (axis, i) { + var axisTag = axis.axisTag.trim(); + + if (axisTag in settings) { + return Math.max(axis.minValue, Math.min(axis.maxValue, settings[axisTag])); + } else { + return axis.defaultValue; + } + }); + var stream = new restructure.DecodeStream(this.stream.buffer); + stream.pos = this._directoryPos; + var font = new TTFFont(stream, coords); + font._tables = this._tables; + return font; + }; + + // Standardized format plugin API + _proto.getFont = function getFont(name) { + return this.getVariation(name); + }; + + _createClass$8(TTFFont, [{ + key: "postscriptName", + get: function get() { + var name = this.name.records.postscriptName; + + if (name) { + var lang = Object.keys(name)[0]; + return name[lang]; + } + + return null; + } + }, { + key: "fullName", + get: function get() { + return this.getName('fullName'); + } + /** + * The font's family name, e.g. "Helvetica" + * @type {string} + */ + + }, { + key: "familyName", + get: function get() { + return this.getName('fontFamily'); + } + /** + * The font's sub-family, e.g. "Bold". + * @type {string} + */ + + }, { + key: "subfamilyName", + get: function get() { + return this.getName('fontSubfamily'); + } + /** + * The font's copyright information + * @type {string} + */ + + }, { + key: "copyright", + get: function get() { + return this.getName('copyright'); + } + /** + * The font's version number + * @type {string} + */ + + }, { + key: "version", + get: function get() { + return this.getName('version'); + } + /** + * The font’s [ascender](https://en.wikipedia.org/wiki/Ascender_(typography)) + * @type {number} + */ + + }, { + key: "ascent", + get: function get() { + return this.hhea.ascent; + } + /** + * The font’s [descender](https://en.wikipedia.org/wiki/Descender) + * @type {number} + */ + + }, { + key: "descent", + get: function get() { + return this.hhea.descent; + } + /** + * The amount of space that should be included between lines + * @type {number} + */ + + }, { + key: "lineGap", + get: function get() { + return this.hhea.lineGap; + } + /** + * The offset from the normal underline position that should be used + * @type {number} + */ + + }, { + key: "underlinePosition", + get: function get() { + return this.post.underlinePosition; + } + /** + * The weight of the underline that should be used + * @type {number} + */ + + }, { + key: "underlineThickness", + get: function get() { + return this.post.underlineThickness; + } + /** + * If this is an italic font, the angle the cursor should be drawn at to match the font design + * @type {number} + */ + + }, { + key: "italicAngle", + get: function get() { + return this.post.italicAngle; + } + /** + * The height of capital letters above the baseline. + * See [here](https://en.wikipedia.org/wiki/Cap_height) for more details. + * @type {number} + */ + + }, { + key: "capHeight", + get: function get() { + var os2 = this['OS/2']; + return os2 ? os2.capHeight : this.ascent; + } + /** + * The height of lower case letters in the font. + * See [here](https://en.wikipedia.org/wiki/X-height) for more details. + * @type {number} + */ + + }, { + key: "xHeight", + get: function get() { + var os2 = this['OS/2']; + return os2 ? os2.xHeight : 0; + } + /** + * The number of glyphs in the font. + * @type {number} + */ + + }, { + key: "numGlyphs", + get: function get() { + return this.maxp.numGlyphs; + } + /** + * The size of the font’s internal coordinate grid + * @type {number} + */ + + }, { + key: "unitsPerEm", + get: function get() { + return this.head.unitsPerEm; + } + /** + * The font’s bounding box, i.e. the box that encloses all glyphs in the font. + * @type {BBox} + */ + + }, { + key: "bbox", + get: function get() { + return Object.freeze(new BBox(this.head.xMin, this.head.yMin, this.head.xMax, this.head.yMax)); + } + }, { + key: "_cmapProcessor", + get: function get() { + return new CmapProcessor(this.cmap); + } + /** + * An array of all of the unicode code points supported by the font. + * @type {number[]} + */ + + }, { + key: "characterSet", + get: function get() { + return this._cmapProcessor.getCharacterSet(); + } + }, { + key: "_layoutEngine", + get: function get() { + return new LayoutEngine(this); + } + }, { + key: "availableFeatures", + get: function get() { + return this._layoutEngine.getAvailableFeatures(); + } + }, { + key: "variationAxes", + get: function get() { + var res = {}; + + if (!this.fvar) { + return res; + } + + for (var _iterator = _createForOfIteratorHelperLoose$q(this.fvar.axis), _step; !(_step = _iterator()).done;) { + var axis = _step.value; + res[axis.axisTag.trim()] = { + name: axis.name.en, + min: axis.minValue, + "default": axis.defaultValue, + max: axis.maxValue + }; + } + + return res; + } + /** + * Returns an object describing the named variation instances + * that the font designer has specified. Keys are variation names + * and values are the variation settings for this instance. + * + * @type {object} + */ + + }, { + key: "namedVariations", + get: function get() { + var res = {}; + + if (!this.fvar) { + return res; + } + + for (var _iterator2 = _createForOfIteratorHelperLoose$q(this.fvar.instance), _step2; !(_step2 = _iterator2()).done;) { + var instance = _step2.value; + var settings = {}; + + for (var i = 0; i < this.fvar.axis.length; i++) { + var axis = this.fvar.axis[i]; + settings[axis.axisTag.trim()] = instance.coord[i]; + } + + res[instance.name.en] = settings; + } + + return res; + } + }, { + key: "_variationProcessor", + get: function get() { + if (!this.fvar) { + return null; + } + + var variationCoords = this.variationCoords; // Ignore if no variation coords and not CFF2 + + if (!variationCoords && !this.CFF2) { + return null; + } + + if (!variationCoords) { + variationCoords = this.fvar.axis.map(function (axis) { + return axis.defaultValue; + }); + } + + return new GlyphVariationProcessor(this, variationCoords); + } + }]); + + return TTFFont; +}(), (_applyDecoratedDescriptor$4(_class$4.prototype, "bbox", [cache], Object.getOwnPropertyDescriptor(_class$4.prototype, "bbox"), _class$4.prototype), _applyDecoratedDescriptor$4(_class$4.prototype, "_cmapProcessor", [cache], Object.getOwnPropertyDescriptor(_class$4.prototype, "_cmapProcessor"), _class$4.prototype), _applyDecoratedDescriptor$4(_class$4.prototype, "characterSet", [cache], Object.getOwnPropertyDescriptor(_class$4.prototype, "characterSet"), _class$4.prototype), _applyDecoratedDescriptor$4(_class$4.prototype, "_layoutEngine", [cache], Object.getOwnPropertyDescriptor(_class$4.prototype, "_layoutEngine"), _class$4.prototype), _applyDecoratedDescriptor$4(_class$4.prototype, "variationAxes", [cache], Object.getOwnPropertyDescriptor(_class$4.prototype, "variationAxes"), _class$4.prototype), _applyDecoratedDescriptor$4(_class$4.prototype, "namedVariations", [cache], Object.getOwnPropertyDescriptor(_class$4.prototype, "namedVariations"), _class$4.prototype), _applyDecoratedDescriptor$4(_class$4.prototype, "_variationProcessor", [cache], Object.getOwnPropertyDescriptor(_class$4.prototype, "_variationProcessor"), _class$4.prototype)), _class$4); + +function _createForOfIteratorHelperLoose$r(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$r(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$r(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$r(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$r(o, minLen); } + +function _arrayLikeToArray$r(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +var WOFFDirectoryEntry = new restructure.Struct({ + tag: new restructure.String(4), + offset: new restructure.Pointer(restructure.uint32, 'void', { + type: 'global' + }), + compLength: restructure.uint32, + length: restructure.uint32, + origChecksum: restructure.uint32 +}); +var WOFFDirectory = new restructure.Struct({ + tag: new restructure.String(4), + // should be 'wOFF' + flavor: restructure.uint32, + length: restructure.uint32, + numTables: restructure.uint16, + reserved: new restructure.Reserved(restructure.uint16), + totalSfntSize: restructure.uint32, + majorVersion: restructure.uint16, + minorVersion: restructure.uint16, + metaOffset: restructure.uint32, + metaLength: restructure.uint32, + metaOrigLength: restructure.uint32, + privOffset: restructure.uint32, + privLength: restructure.uint32, + tables: new restructure.Array(WOFFDirectoryEntry, 'numTables') +}); + +WOFFDirectory.process = function () { + var tables = {}; + + for (var _iterator = _createForOfIteratorHelperLoose$r(this.tables), _step; !(_step = _iterator()).done;) { + var table = _step.value; + tables[table.tag] = table; + } + + this.tables = tables; +}; + +var TINF_OK$1 = 0; +var TINF_DATA_ERROR$1 = -3; + +function Tree$1() { + this.table = new Uint16Array(16); + /* table of code length counts */ + + this.trans = new Uint16Array(288); + /* code -> symbol translation table */ +} + +function Data$1(source, dest) { + this.source = source; + this.sourceIndex = 0; + this.tag = 0; + this.bitcount = 0; + this.dest = dest; + this.destLen = 0; + this.ltree = new Tree$1(); + /* dynamic length/symbol tree */ + + this.dtree = new Tree$1(); + /* dynamic distance tree */ +} +/* --------------------------------------------------- * + * -- uninitialized global data (static structures) -- * + * --------------------------------------------------- */ + + +var sltree$1 = new Tree$1(); +var sdtree$1 = new Tree$1(); +/* extra bits and base tables for length codes */ + +var length_bits$1 = new Uint8Array(30); +var length_base$1 = new Uint16Array(30); +/* extra bits and base tables for distance codes */ + +var dist_bits$1 = new Uint8Array(30); +var dist_base$1 = new Uint16Array(30); +/* special ordering of code length codes */ + +var clcidx$1 = new Uint8Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); +/* used by tinf_decode_trees, avoids allocations every call */ + +var code_tree$1 = new Tree$1(); +var lengths$1 = new Uint8Array(288 + 32); +/* ----------------------- * + * -- utility functions -- * + * ----------------------- */ + +/* build extra bits and base tables */ + +function tinf_build_bits_base$1(bits, base, delta, first) { + var i, sum; + /* build bits table */ + + for (i = 0; i < delta; ++i) { + bits[i] = 0; + } + + for (i = 0; i < 30 - delta; ++i) { + bits[i + delta] = i / delta | 0; + } + /* build base table */ + + + for (sum = first, i = 0; i < 30; ++i) { + base[i] = sum; + sum += 1 << bits[i]; + } +} +/* build the fixed huffman trees */ + + +function tinf_build_fixed_trees$1(lt, dt) { + var i; + /* build fixed length tree */ + + for (i = 0; i < 7; ++i) { + lt.table[i] = 0; + } + + lt.table[7] = 24; + lt.table[8] = 152; + lt.table[9] = 112; + + for (i = 0; i < 24; ++i) { + lt.trans[i] = 256 + i; + } + + for (i = 0; i < 144; ++i) { + lt.trans[24 + i] = i; + } + + for (i = 0; i < 8; ++i) { + lt.trans[24 + 144 + i] = 280 + i; + } + + for (i = 0; i < 112; ++i) { + lt.trans[24 + 144 + 8 + i] = 144 + i; + } + /* build fixed distance tree */ + + + for (i = 0; i < 5; ++i) { + dt.table[i] = 0; + } + + dt.table[5] = 32; + + for (i = 0; i < 32; ++i) { + dt.trans[i] = i; + } +} +/* given an array of code lengths, build a tree */ + + +var offs$1 = new Uint16Array(16); + +function tinf_build_tree$1(t, lengths, off, num) { + var i, sum; + /* clear code length count table */ + + for (i = 0; i < 16; ++i) { + t.table[i] = 0; + } + /* scan symbol lengths, and sum code length counts */ + + + for (i = 0; i < num; ++i) { + t.table[lengths[off + i]]++; + } + + t.table[0] = 0; + /* compute offset table for distribution sort */ + + for (sum = 0, i = 0; i < 16; ++i) { + offs$1[i] = sum; + sum += t.table[i]; + } + /* create code->symbol translation table (symbols sorted by code) */ + + + for (i = 0; i < num; ++i) { + if (lengths[off + i]) t.trans[offs$1[lengths[off + i]]++] = i; + } +} +/* ---------------------- * + * -- decode functions -- * + * ---------------------- */ + +/* get one bit from source stream */ + + +function tinf_getbit$1(d) { + /* check if tag is empty */ + if (!d.bitcount--) { + /* load next tag */ + d.tag = d.source[d.sourceIndex++]; + d.bitcount = 7; + } + /* shift bit out of tag */ + + + var bit = d.tag & 1; + d.tag >>>= 1; + return bit; +} +/* read a num bit value from a stream and add base */ + + +function tinf_read_bits$1(d, num, base) { + if (!num) return base; + + while (d.bitcount < 24) { + d.tag |= d.source[d.sourceIndex++] << d.bitcount; + d.bitcount += 8; + } + + var val = d.tag & 0xffff >>> 16 - num; + d.tag >>>= num; + d.bitcount -= num; + return val + base; +} +/* given a data stream and a tree, decode a symbol */ + + +function tinf_decode_symbol$1(d, t) { + while (d.bitcount < 24) { + d.tag |= d.source[d.sourceIndex++] << d.bitcount; + d.bitcount += 8; + } + + var sum = 0, + cur = 0, + len = 0; + var tag = d.tag; + /* get more bits while code value is above sum */ + + do { + cur = 2 * cur + (tag & 1); + tag >>>= 1; + ++len; + sum += t.table[len]; + cur -= t.table[len]; + } while (cur >= 0); + + d.tag = tag; + d.bitcount -= len; + return t.trans[sum + cur]; +} +/* given a data stream, decode dynamic trees from it */ + + +function tinf_decode_trees$1(d, lt, dt) { + var hlit, hdist, hclen; + var i, num, length; + /* get 5 bits HLIT (257-286) */ + + hlit = tinf_read_bits$1(d, 5, 257); + /* get 5 bits HDIST (1-32) */ + + hdist = tinf_read_bits$1(d, 5, 1); + /* get 4 bits HCLEN (4-19) */ + + hclen = tinf_read_bits$1(d, 4, 4); + + for (i = 0; i < 19; ++i) { + lengths$1[i] = 0; + } + /* read code lengths for code length alphabet */ + + + for (i = 0; i < hclen; ++i) { + /* get 3 bits code length (0-7) */ + var clen = tinf_read_bits$1(d, 3, 0); + lengths$1[clcidx$1[i]] = clen; + } + /* build code length tree */ + + + tinf_build_tree$1(code_tree$1, lengths$1, 0, 19); + /* decode code lengths for the dynamic trees */ + + for (num = 0; num < hlit + hdist;) { + var sym = tinf_decode_symbol$1(d, code_tree$1); + + switch (sym) { + case 16: + /* copy previous code length 3-6 times (read 2 bits) */ + var prev = lengths$1[num - 1]; + + for (length = tinf_read_bits$1(d, 2, 3); length; --length) { + lengths$1[num++] = prev; + } + + break; + + case 17: + /* repeat code length 0 for 3-10 times (read 3 bits) */ + for (length = tinf_read_bits$1(d, 3, 3); length; --length) { + lengths$1[num++] = 0; + } + + break; + + case 18: + /* repeat code length 0 for 11-138 times (read 7 bits) */ + for (length = tinf_read_bits$1(d, 7, 11); length; --length) { + lengths$1[num++] = 0; + } + + break; + + default: + /* values 0-15 represent the actual code lengths */ + lengths$1[num++] = sym; + break; + } + } + /* build dynamic trees */ + + + tinf_build_tree$1(lt, lengths$1, 0, hlit); + tinf_build_tree$1(dt, lengths$1, hlit, hdist); +} +/* ----------------------------- * + * -- block inflate functions -- * + * ----------------------------- */ + +/* given a stream and two trees, inflate a block of data */ + + +function tinf_inflate_block_data$1(d, lt, dt) { + while (1) { + var sym = tinf_decode_symbol$1(d, lt); + /* check for end of block */ + + if (sym === 256) { + return TINF_OK$1; + } + + if (sym < 256) { + d.dest[d.destLen++] = sym; + } else { + var length, dist, offs; + var i; + sym -= 257; + /* possibly get more bits from length code */ + + length = tinf_read_bits$1(d, length_bits$1[sym], length_base$1[sym]); + dist = tinf_decode_symbol$1(d, dt); + /* possibly get more bits from distance code */ + + offs = d.destLen - tinf_read_bits$1(d, dist_bits$1[dist], dist_base$1[dist]); + /* copy match */ + + for (i = offs; i < offs + length; ++i) { + d.dest[d.destLen++] = d.dest[i]; + } + } + } +} +/* inflate an uncompressed block of data */ + + +function tinf_inflate_uncompressed_block$1(d) { + var length, invlength; + var i; + /* unread from bitbuffer */ + + while (d.bitcount > 8) { + d.sourceIndex--; + d.bitcount -= 8; + } + /* get length */ + + + length = d.source[d.sourceIndex + 1]; + length = 256 * length + d.source[d.sourceIndex]; + /* get one's complement of length */ + + invlength = d.source[d.sourceIndex + 3]; + invlength = 256 * invlength + d.source[d.sourceIndex + 2]; + /* check length */ + + if (length !== (~invlength & 0x0000ffff)) return TINF_DATA_ERROR$1; + d.sourceIndex += 4; + /* copy block */ + + for (i = length; i; --i) { + d.dest[d.destLen++] = d.source[d.sourceIndex++]; + } + /* make sure we start next block on a byte boundary */ + + + d.bitcount = 0; + return TINF_OK$1; +} +/* inflate stream from source to dest */ + + +function tinf_uncompress$1(source, dest) { + var d = new Data$1(source, dest); + var bfinal, btype, res; + + do { + /* read final block flag */ + bfinal = tinf_getbit$1(d); + /* read block type (2 bits) */ + + btype = tinf_read_bits$1(d, 2, 0); + /* decompress block */ + + switch (btype) { + case 0: + /* decompress uncompressed block */ + res = tinf_inflate_uncompressed_block$1(d); + break; + + case 1: + /* decompress block with fixed huffman trees */ + res = tinf_inflate_block_data$1(d, sltree$1, sdtree$1); + break; + + case 2: + /* decompress block with dynamic huffman trees */ + tinf_decode_trees$1(d, d.ltree, d.dtree); + res = tinf_inflate_block_data$1(d, d.ltree, d.dtree); + break; + + default: + res = TINF_DATA_ERROR$1; + } + + if (res !== TINF_OK$1) throw new Error('Data error'); + } while (!bfinal); + + if (d.destLen < d.dest.length) { + if (typeof d.dest.slice === 'function') return d.dest.slice(0, d.destLen);else return d.dest.subarray(0, d.destLen); + } + + return d.dest; +} +/* -------------------- * + * -- initialization -- * + * -------------------- */ + +/* build fixed huffman trees */ + + +tinf_build_fixed_trees$1(sltree$1, sdtree$1); +/* build extra bits and base tables */ + +tinf_build_bits_base$1(length_bits$1, length_base$1, 4, 3); +tinf_build_bits_base$1(dist_bits$1, dist_base$1, 2, 1); +/* fix a special case */ + +length_bits$1[28] = 0; +length_base$1[28] = 258; +var tinyInflate$1 = tinf_uncompress$1; + +function _inheritsLoose$f(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var WOFFFont = /*#__PURE__*/function (_TTFFont) { + _inheritsLoose$f(WOFFFont, _TTFFont); + + function WOFFFont() { + return _TTFFont.apply(this, arguments) || this; + } + + WOFFFont.probe = function probe(buffer) { + return buffer.toString('ascii', 0, 4) === 'wOFF'; + }; + + var _proto = WOFFFont.prototype; + + _proto._decodeDirectory = function _decodeDirectory() { + this.directory = WOFFDirectory.decode(this.stream, { + _startOffset: 0 + }); + }; + + _proto._getTableStream = function _getTableStream(tag) { + var table = this.directory.tables[tag]; + + if (table) { + this.stream.pos = table.offset; + + if (table.compLength < table.length) { + this.stream.pos += 2; // skip deflate header + + var outBuffer = new buffer_1(table.length); + var buf = tinyInflate$1(this.stream.readBuffer(table.compLength - 2), outBuffer); + return new restructure.DecodeStream(buf); + } else { + return this.stream; + } + } + + return null; + }; + + return WOFFFont; +}(TTFFont); + +function BrotliInput(buffer) { + this.buffer = buffer; + this.pos = 0; +} + +BrotliInput.prototype.read = function (buf, i, count) { + if (this.pos + count > this.buffer.length) { + count = this.buffer.length - this.pos; + } + + for (var p = 0; p < count; p++) { + buf[i + p] = this.buffer[this.pos + p]; + } + + this.pos += count; + return count; +}; + +var BrotliInput_1 = BrotliInput; + +function BrotliOutput(buf) { + this.buffer = buf; + this.pos = 0; +} + +BrotliOutput.prototype.write = function (buf, count) { + if (this.pos + count > this.buffer.length) throw new Error('Output buffer is not large enough'); + this.buffer.set(buf.subarray(0, count), this.pos); + this.pos += count; + return count; +}; + +var BrotliOutput_1 = BrotliOutput; +var streams$1 = { + BrotliInput: BrotliInput_1, + BrotliOutput: BrotliOutput_1 +}; + +/* Copyright 2013 Google Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Bit reading helpers +*/ +var BROTLI_READ_SIZE = 4096; +var BROTLI_IBUF_SIZE = 2 * BROTLI_READ_SIZE + 32; +var BROTLI_IBUF_MASK = 2 * BROTLI_READ_SIZE - 1; +var kBitMask = new Uint32Array([0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215]); +/* Input byte buffer, consist of a ringbuffer and a "slack" region where */ + +/* bytes from the start of the ringbuffer are copied. */ + +function BrotliBitReader(input) { + this.buf_ = new Uint8Array(BROTLI_IBUF_SIZE); + this.input_ = input; + /* input callback */ + + this.reset(); +} + +BrotliBitReader.READ_SIZE = BROTLI_READ_SIZE; +BrotliBitReader.IBUF_MASK = BROTLI_IBUF_MASK; + +BrotliBitReader.prototype.reset = function () { + this.buf_ptr_ = 0; + /* next input will write here */ + + this.val_ = 0; + /* pre-fetched bits */ + + this.pos_ = 0; + /* byte position in stream */ + + this.bit_pos_ = 0; + /* current bit-reading position in val_ */ + + this.bit_end_pos_ = 0; + /* bit-reading end position from LSB of val_ */ + + this.eos_ = 0; + /* input stream is finished */ + + this.readMoreInput(); + + for (var i = 0; i < 4; i++) { + this.val_ |= this.buf_[this.pos_] << 8 * i; + ++this.pos_; + } + + return this.bit_end_pos_ > 0; +}; +/* Fills up the input ringbuffer by calling the input callback. + + Does nothing if there are at least 32 bytes present after current position. + + Returns 0 if either: + - the input callback returned an error, or + - there is no more input and the position is past the end of the stream. + + After encountering the end of the input stream, 32 additional zero bytes are + copied to the ringbuffer, therefore it is safe to call this function after + every 32 bytes of input is read. +*/ + + +BrotliBitReader.prototype.readMoreInput = function () { + if (this.bit_end_pos_ > 256) { + return; + } else if (this.eos_) { + if (this.bit_pos_ > this.bit_end_pos_) throw new Error('Unexpected end of input ' + this.bit_pos_ + ' ' + this.bit_end_pos_); + } else { + var dst = this.buf_ptr_; + var bytes_read = this.input_.read(this.buf_, dst, BROTLI_READ_SIZE); + + if (bytes_read < 0) { + throw new Error('Unexpected end of input'); + } + + if (bytes_read < BROTLI_READ_SIZE) { + this.eos_ = 1; + /* Store 32 bytes of zero after the stream end. */ + + for (var p = 0; p < 32; p++) { + this.buf_[dst + bytes_read + p] = 0; + } + } + + if (dst === 0) { + /* Copy the head of the ringbuffer to the slack region. */ + for (var p = 0; p < 32; p++) { + this.buf_[(BROTLI_READ_SIZE << 1) + p] = this.buf_[p]; + } + + this.buf_ptr_ = BROTLI_READ_SIZE; + } else { + this.buf_ptr_ = 0; + } + + this.bit_end_pos_ += bytes_read << 3; + } +}; +/* Guarantees that there are at least 24 bits in the buffer. */ + + +BrotliBitReader.prototype.fillBitWindow = function () { + while (this.bit_pos_ >= 8) { + this.val_ >>>= 8; + this.val_ |= this.buf_[this.pos_ & BROTLI_IBUF_MASK] << 24; + ++this.pos_; + this.bit_pos_ = this.bit_pos_ - 8 >>> 0; + this.bit_end_pos_ = this.bit_end_pos_ - 8 >>> 0; + } +}; +/* Reads the specified number of bits from Read Buffer. */ + + +BrotliBitReader.prototype.readBits = function (n_bits) { + if (32 - this.bit_pos_ < n_bits) { + this.fillBitWindow(); + } + + var val = this.val_ >>> this.bit_pos_ & kBitMask[n_bits]; + this.bit_pos_ += n_bits; + return val; +}; + +var bit_reader = BrotliBitReader; + +var byteLength_1$1 = byteLength$1; +var toByteArray_1$1 = toByteArray$1; +var fromByteArray_1$1 = fromByteArray$1; +var lookup$1 = []; +var revLookup$1 = []; +var Arr$1 = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; +var code$1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +for (var i$4 = 0, len$1 = code$1.length; i$4 < len$1; ++i$4) { + lookup$1[i$4] = code$1[i$4]; + revLookup$1[code$1.charCodeAt(i$4)] = i$4; +} // Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications + + +revLookup$1['-'.charCodeAt(0)] = 62; +revLookup$1['_'.charCodeAt(0)] = 63; + +function getLens$1(b64) { + var len = b64.length; + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4'); + } // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + + + var validLen = b64.indexOf('='); + if (validLen === -1) validLen = len; + var placeHoldersLen = validLen === len ? 0 : 4 - validLen % 4; + return [validLen, placeHoldersLen]; +} // base64 is 4/3 + up to two characters of the original data + + +function byteLength$1(b64) { + var lens = getLens$1(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; +} + +function _byteLength$1(b64, validLen, placeHoldersLen) { + return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; +} + +function toByteArray$1(b64) { + var tmp; + var lens = getLens$1(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + var arr = new Arr$1(_byteLength$1(b64, validLen, placeHoldersLen)); + var curByte = 0; // if there are placeholders, only get up to the last complete 4 chars + + var len = placeHoldersLen > 0 ? validLen - 4 : validLen; + + for (var i = 0; i < len; i += 4) { + tmp = revLookup$1[b64.charCodeAt(i)] << 18 | revLookup$1[b64.charCodeAt(i + 1)] << 12 | revLookup$1[b64.charCodeAt(i + 2)] << 6 | revLookup$1[b64.charCodeAt(i + 3)]; + arr[curByte++] = tmp >> 16 & 0xFF; + arr[curByte++] = tmp >> 8 & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 2) { + tmp = revLookup$1[b64.charCodeAt(i)] << 2 | revLookup$1[b64.charCodeAt(i + 1)] >> 4; + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 1) { + tmp = revLookup$1[b64.charCodeAt(i)] << 10 | revLookup$1[b64.charCodeAt(i + 1)] << 4 | revLookup$1[b64.charCodeAt(i + 2)] >> 2; + arr[curByte++] = tmp >> 8 & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + return arr; +} + +function tripletToBase64$1(num) { + return lookup$1[num >> 18 & 0x3F] + lookup$1[num >> 12 & 0x3F] + lookup$1[num >> 6 & 0x3F] + lookup$1[num & 0x3F]; +} + +function encodeChunk$1(uint8, start, end) { + var tmp; + var output = []; + + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16 & 0xFF0000) + (uint8[i + 1] << 8 & 0xFF00) + (uint8[i + 2] & 0xFF); + output.push(tripletToBase64$1(tmp)); + } + + return output.join(''); +} + +function fromByteArray$1(uint8) { + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + // go through the array every three bytes, we'll deal with trailing stuff later + + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk$1(uint8, i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength)); + } // pad the end with zeros, but make sure to not forget the extra bytes + + + if (extraBytes === 1) { + tmp = uint8[len - 1]; + parts.push(lookup$1[tmp >> 2] + lookup$1[tmp << 4 & 0x3F] + '=='); + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1]; + parts.push(lookup$1[tmp >> 10] + lookup$1[tmp >> 4 & 0x3F] + lookup$1[tmp << 2 & 0x3F] + '='); + } + + return parts.join(''); +} + +var base64Js$1 = { + byteLength: byteLength_1$1, + toByteArray: toByteArray_1$1, + fromByteArray: fromByteArray_1$1 +}; + +var dictionary_bin = "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"; + +/** + * The normal dictionary-data.js is quite large, which makes it + * unsuitable for browser usage. In order to make it smaller, + * we read dictionary.bin, which is a compressed version of + * the dictionary, and on initial load, Brotli decompresses + * it's own dictionary. 😜 + */ + +var init = function init(BrotliDecompressBuffer) { + var compressed = base64Js$1.toByteArray(dictionary_bin); + return BrotliDecompressBuffer(compressed); +}; + +var dictionaryDataCompressed = { + init: init +}; + +var dictionary = createCommonjsModule(function (module, exports) { + /* Copyright 2013 Google Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Collection of static dictionary words. + */ + exports.init = function (BrotliDecompressBuffer) { + exports.dictionary = dictionaryDataCompressed.init(BrotliDecompressBuffer); + }; + + exports.offsetsByLength = new Uint32Array([0, 0, 0, 0, 0, 4096, 9216, 21504, 35840, 44032, 53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536, 115968, 118528, 119872, 121280, 122016]); + exports.sizeBitsByLength = new Uint8Array([0, 0, 0, 0, 10, 10, 11, 11, 10, 10, 10, 10, 10, 9, 9, 8, 7, 7, 8, 7, 7, 6, 6, 5, 5]); + exports.minDictionaryWordLength = 4; + exports.maxDictionaryWordLength = 24; +}); +var dictionary_1 = dictionary.init; +var dictionary_2 = dictionary.dictionary; +var dictionary_3 = dictionary.offsetsByLength; +var dictionary_4 = dictionary.sizeBitsByLength; +var dictionary_5 = dictionary.minDictionaryWordLength; +var dictionary_6 = dictionary.maxDictionaryWordLength; + +function HuffmanCode(bits, value) { + this.bits = bits; + /* number of bits used for this symbol */ + + this.value = value; + /* symbol value or table offset */ +} + +var HuffmanCode_1 = HuffmanCode; +var MAX_LENGTH = 15; +/* Returns reverse(reverse(key, len) + 1, len), where reverse(key, len) is the + bit-wise reversal of the len least significant bits of key. */ + +function GetNextKey(key, len) { + var step = 1 << len - 1; + + while (key & step) { + step >>= 1; + } + + return (key & step - 1) + step; +} +/* Stores code in table[0], table[step], table[2*step], ..., table[end] */ + +/* Assumes that end is an integer multiple of step */ + + +function ReplicateValue(table, i, step, end, code) { + do { + end -= step; + table[i + end] = new HuffmanCode(code.bits, code.value); + } while (end > 0); +} +/* Returns the table width of the next 2nd level table. count is the histogram + of bit lengths for the remaining symbols, len is the code length of the next + processed symbol */ + + +function NextTableBitSize(count, len, root_bits) { + var left = 1 << len - root_bits; + + while (len < MAX_LENGTH) { + left -= count[len]; + if (left <= 0) break; + ++len; + left <<= 1; + } + + return len - root_bits; +} + +var BrotliBuildHuffmanTable = function BrotliBuildHuffmanTable(root_table, table, root_bits, code_lengths, code_lengths_size) { + var start_table = table; + var code; + /* current table entry */ + + var len; + /* current code length */ + + var symbol; + /* symbol index in original or sorted table */ + + var key; + /* reversed prefix code */ + + var step; + /* step size to replicate values in current table */ + + var low; + /* low bits for current root entry */ + + var mask; + /* mask for low bits */ + + var table_bits; + /* key length of current table */ + + var table_size; + /* size of current table */ + + var total_size; + /* sum of root table size and 2nd level table sizes */ + + var sorted; + /* symbols sorted by code length */ + + var count = new Int32Array(MAX_LENGTH + 1); + /* number of codes of each length */ + + var offset = new Int32Array(MAX_LENGTH + 1); + /* offsets in sorted table for each length */ + + sorted = new Int32Array(code_lengths_size); + /* build histogram of code lengths */ + + for (symbol = 0; symbol < code_lengths_size; symbol++) { + count[code_lengths[symbol]]++; + } + /* generate offsets into sorted symbol table by code length */ + + + offset[1] = 0; + + for (len = 1; len < MAX_LENGTH; len++) { + offset[len + 1] = offset[len] + count[len]; + } + /* sort symbols by length, by symbol order within each length */ + + + for (symbol = 0; symbol < code_lengths_size; symbol++) { + if (code_lengths[symbol] !== 0) { + sorted[offset[code_lengths[symbol]]++] = symbol; + } + } + + table_bits = root_bits; + table_size = 1 << table_bits; + total_size = table_size; + /* special case code with only one value */ + + if (offset[MAX_LENGTH] === 1) { + for (key = 0; key < total_size; ++key) { + root_table[table + key] = new HuffmanCode(0, sorted[0] & 0xffff); + } + + return total_size; + } + /* fill in root table */ + + + key = 0; + symbol = 0; + + for (len = 1, step = 2; len <= root_bits; ++len, step <<= 1) { + for (; count[len] > 0; --count[len]) { + code = new HuffmanCode(len & 0xff, sorted[symbol++] & 0xffff); + ReplicateValue(root_table, table + key, step, table_size, code); + key = GetNextKey(key, len); + } + } + /* fill in 2nd level tables and add pointers to root table */ + + + mask = total_size - 1; + low = -1; + + for (len = root_bits + 1, step = 2; len <= MAX_LENGTH; ++len, step <<= 1) { + for (; count[len] > 0; --count[len]) { + if ((key & mask) !== low) { + table += table_size; + table_bits = NextTableBitSize(count, len, root_bits); + table_size = 1 << table_bits; + total_size += table_size; + low = key & mask; + root_table[start_table + low] = new HuffmanCode(table_bits + root_bits & 0xff, table - start_table - low & 0xffff); + } + + code = new HuffmanCode(len - root_bits & 0xff, sorted[symbol++] & 0xffff); + ReplicateValue(root_table, table + (key >> root_bits), step, table_size, code); + key = GetNextKey(key, len); + } + } + + return total_size; +}; + +var huffman = { + HuffmanCode: HuffmanCode_1, + BrotliBuildHuffmanTable: BrotliBuildHuffmanTable +}; + +/* Copyright 2013 Google Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Lookup table to map the previous two bytes to a context id. + + There are four different context modeling modes defined here: + CONTEXT_LSB6: context id is the least significant 6 bits of the last byte, + CONTEXT_MSB6: context id is the most significant 6 bits of the last byte, + CONTEXT_UTF8: second-order context model tuned for UTF8-encoded text, + CONTEXT_SIGNED: second-order context model tuned for signed integers. + + The context id for the UTF8 context model is calculated as follows. If p1 + and p2 are the previous two bytes, we calcualte the context as + + context = kContextLookup[p1] | kContextLookup[p2 + 256]. + + If the previous two bytes are ASCII characters (i.e. < 128), this will be + equivalent to + + context = 4 * context1(p1) + context2(p2), + + where context1 is based on the previous byte in the following way: + + 0 : non-ASCII control + 1 : \t, \n, \r + 2 : space + 3 : other punctuation + 4 : " ' + 5 : % + 6 : ( < [ { + 7 : ) > ] } + 8 : , ; : + 9 : . + 10 : = + 11 : number + 12 : upper-case vowel + 13 : upper-case consonant + 14 : lower-case vowel + 15 : lower-case consonant + + and context2 is based on the second last byte: + + 0 : control, space + 1 : punctuation + 2 : upper-case letter, number + 3 : lower-case letter + + If the last byte is ASCII, and the second last byte is not (in a valid UTF8 + stream it will be a continuation byte, value between 128 and 191), the + context is the same as if the second last byte was an ASCII control or space. + + If the last byte is a UTF8 lead byte (value >= 192), then the next byte will + be a continuation byte and the context id is 2 or 3 depending on the LSB of + the last byte and to a lesser extent on the second last byte if it is ASCII. + + If the last byte is a UTF8 continuation byte, the second last byte can be: + - continuation byte: the next byte is probably ASCII or lead byte (assuming + 4-byte UTF8 characters are rare) and the context id is 0 or 1. + - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1 + - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3 + + The possible value combinations of the previous two bytes, the range of + context ids and the type of the next byte is summarized in the table below: + + |--------\-----------------------------------------------------------------| + | \ Last byte | + | Second \---------------------------------------------------------------| + | last byte \ ASCII | cont. byte | lead byte | + | \ (0-127) | (128-191) | (192-) | + |=============|===================|=====================|==================| + | ASCII | next: ASCII/lead | not valid | next: cont. | + | (0-127) | context: 4 - 63 | | context: 2 - 3 | + |-------------|-------------------|---------------------|------------------| + | cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. | + | (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 | + |-------------|-------------------|---------------------|------------------| + | lead byte | not valid | next: ASCII/lead | not valid | + | (192-207) | | context: 0 - 1 | | + |-------------|-------------------|---------------------|------------------| + | lead byte | not valid | next: cont. | not valid | + | (208-) | | context: 2 - 3 | | + |-------------|-------------------|---------------------|------------------| + + The context id for the signed context mode is calculated as: + + context = (kContextLookup[512 + p1] << 3) | kContextLookup[512 + p2]. + + For any context modeling modes, the context ids can be calculated by |-ing + together two lookups from one table using context model dependent offsets: + + context = kContextLookup[offset1 + p1] | kContextLookup[offset2 + p2]. + + where offset1 and offset2 are dependent on the context mode. +*/ +/* Common context lookup table for all context modes. */ + +var lookup$2 = new Uint8Array([ +/* CONTEXT_UTF8, last byte. */ + +/* ASCII range. */ +0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12, 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12, 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0, +/* UTF8 continuation byte range. */ +0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, +/* UTF8 lead byte range. */ +2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, +/* CONTEXT_UTF8 second last byte. */ + +/* ASCII range. */ +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0, +/* UTF8 continuation byte range. */ +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* UTF8 lead byte range. */ +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* CONTEXT_SIGNED, second last byte. */ +0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, +/* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */ +0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, +/* CONTEXT_LSB6, last byte. */ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, +/* CONTEXT_MSB6, last byte. */ +0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, +/* CONTEXT_{M,L}SB6, second last byte, */ +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); +var lookupOffsets = new Uint16Array([ +/* CONTEXT_LSB6 */ +1024, 1536, +/* CONTEXT_MSB6 */ +1280, 1536, +/* CONTEXT_UTF8 */ +0, 256, +/* CONTEXT_SIGNED */ +768, 512]); +var context = { + lookup: lookup$2, + lookupOffsets: lookupOffsets +}; + +/* Copyright 2013 Google Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Lookup tables to map prefix codes to value ranges. This is used during + decoding of the block lengths, literal insertion lengths and copy lengths. +*/ + +/* Represents the range of values belonging to a prefix code: */ + +/* [offset, offset + 2^nbits) */ +function PrefixCodeRange(offset, nbits) { + this.offset = offset; + this.nbits = nbits; +} + +var kBlockLengthPrefixCode = [new PrefixCodeRange(1, 2), new PrefixCodeRange(5, 2), new PrefixCodeRange(9, 2), new PrefixCodeRange(13, 2), new PrefixCodeRange(17, 3), new PrefixCodeRange(25, 3), new PrefixCodeRange(33, 3), new PrefixCodeRange(41, 3), new PrefixCodeRange(49, 4), new PrefixCodeRange(65, 4), new PrefixCodeRange(81, 4), new PrefixCodeRange(97, 4), new PrefixCodeRange(113, 5), new PrefixCodeRange(145, 5), new PrefixCodeRange(177, 5), new PrefixCodeRange(209, 5), new PrefixCodeRange(241, 6), new PrefixCodeRange(305, 6), new PrefixCodeRange(369, 7), new PrefixCodeRange(497, 8), new PrefixCodeRange(753, 9), new PrefixCodeRange(1265, 10), new PrefixCodeRange(2289, 11), new PrefixCodeRange(4337, 12), new PrefixCodeRange(8433, 13), new PrefixCodeRange(16625, 24)]; +var kInsertLengthPrefixCode = [new PrefixCodeRange(0, 0), new PrefixCodeRange(1, 0), new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0), new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0), new PrefixCodeRange(6, 1), new PrefixCodeRange(8, 1), new PrefixCodeRange(10, 2), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 3), new PrefixCodeRange(26, 3), new PrefixCodeRange(34, 4), new PrefixCodeRange(50, 4), new PrefixCodeRange(66, 5), new PrefixCodeRange(98, 5), new PrefixCodeRange(130, 6), new PrefixCodeRange(194, 7), new PrefixCodeRange(322, 8), new PrefixCodeRange(578, 9), new PrefixCodeRange(1090, 10), new PrefixCodeRange(2114, 12), new PrefixCodeRange(6210, 14), new PrefixCodeRange(22594, 24)]; +var kCopyLengthPrefixCode = [new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0), new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0), new PrefixCodeRange(6, 0), new PrefixCodeRange(7, 0), new PrefixCodeRange(8, 0), new PrefixCodeRange(9, 0), new PrefixCodeRange(10, 1), new PrefixCodeRange(12, 1), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 2), new PrefixCodeRange(22, 3), new PrefixCodeRange(30, 3), new PrefixCodeRange(38, 4), new PrefixCodeRange(54, 4), new PrefixCodeRange(70, 5), new PrefixCodeRange(102, 5), new PrefixCodeRange(134, 6), new PrefixCodeRange(198, 7), new PrefixCodeRange(326, 8), new PrefixCodeRange(582, 9), new PrefixCodeRange(1094, 10), new PrefixCodeRange(2118, 24)]; +var kInsertRangeLut = [0, 0, 8, 8, 0, 16, 8, 16, 16]; +var kCopyRangeLut = [0, 8, 0, 8, 16, 0, 16, 8, 16]; +var prefix = { + kBlockLengthPrefixCode: kBlockLengthPrefixCode, + kInsertLengthPrefixCode: kInsertLengthPrefixCode, + kCopyLengthPrefixCode: kCopyLengthPrefixCode, + kInsertRangeLut: kInsertRangeLut, + kCopyRangeLut: kCopyRangeLut +}; + +/* Copyright 2013 Google Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Transformations on dictionary words. +*/ + +var kIdentity = 0; +var kOmitLast1 = 1; +var kOmitLast2 = 2; +var kOmitLast3 = 3; +var kOmitLast4 = 4; +var kOmitLast5 = 5; +var kOmitLast6 = 6; +var kOmitLast7 = 7; +var kOmitLast8 = 8; +var kOmitLast9 = 9; +var kUppercaseFirst = 10; +var kUppercaseAll = 11; +var kOmitFirst1 = 12; +var kOmitFirst2 = 13; +var kOmitFirst3 = 14; +var kOmitFirst4 = 15; +var kOmitFirst5 = 16; +var kOmitFirst6 = 17; +var kOmitFirst7 = 18; +var kOmitFirst9 = 20; + +function Transform$2(prefix, transform, suffix) { + this.prefix = new Uint8Array(prefix.length); + this.transform = transform; + this.suffix = new Uint8Array(suffix.length); + + for (var i = 0; i < prefix.length; i++) { + this.prefix[i] = prefix.charCodeAt(i); + } + + for (var i = 0; i < suffix.length; i++) { + this.suffix[i] = suffix.charCodeAt(i); + } +} + +var kTransforms = [new Transform$2("", kIdentity, ""), new Transform$2("", kIdentity, " "), new Transform$2(" ", kIdentity, " "), new Transform$2("", kOmitFirst1, ""), new Transform$2("", kUppercaseFirst, " "), new Transform$2("", kIdentity, " the "), new Transform$2(" ", kIdentity, ""), new Transform$2("s ", kIdentity, " "), new Transform$2("", kIdentity, " of "), new Transform$2("", kUppercaseFirst, ""), new Transform$2("", kIdentity, " and "), new Transform$2("", kOmitFirst2, ""), new Transform$2("", kOmitLast1, ""), new Transform$2(", ", kIdentity, " "), new Transform$2("", kIdentity, ", "), new Transform$2(" ", kUppercaseFirst, " "), new Transform$2("", kIdentity, " in "), new Transform$2("", kIdentity, " to "), new Transform$2("e ", kIdentity, " "), new Transform$2("", kIdentity, "\""), new Transform$2("", kIdentity, "."), new Transform$2("", kIdentity, "\">"), new Transform$2("", kIdentity, "\n"), new Transform$2("", kOmitLast3, ""), new Transform$2("", kIdentity, "]"), new Transform$2("", kIdentity, " for "), new Transform$2("", kOmitFirst3, ""), new Transform$2("", kOmitLast2, ""), new Transform$2("", kIdentity, " a "), new Transform$2("", kIdentity, " that "), new Transform$2(" ", kUppercaseFirst, ""), new Transform$2("", kIdentity, ". "), new Transform$2(".", kIdentity, ""), new Transform$2(" ", kIdentity, ", "), new Transform$2("", kOmitFirst4, ""), new Transform$2("", kIdentity, " with "), new Transform$2("", kIdentity, "'"), new Transform$2("", kIdentity, " from "), new Transform$2("", kIdentity, " by "), new Transform$2("", kOmitFirst5, ""), new Transform$2("", kOmitFirst6, ""), new Transform$2(" the ", kIdentity, ""), new Transform$2("", kOmitLast4, ""), new Transform$2("", kIdentity, ". The "), new Transform$2("", kUppercaseAll, ""), new Transform$2("", kIdentity, " on "), new Transform$2("", kIdentity, " as "), new Transform$2("", kIdentity, " is "), new Transform$2("", kOmitLast7, ""), new Transform$2("", kOmitLast1, "ing "), new Transform$2("", kIdentity, "\n\t"), new Transform$2("", kIdentity, ":"), new Transform$2(" ", kIdentity, ". "), new Transform$2("", kIdentity, "ed "), new Transform$2("", kOmitFirst9, ""), new Transform$2("", kOmitFirst7, ""), new Transform$2("", kOmitLast6, ""), new Transform$2("", kIdentity, "("), new Transform$2("", kUppercaseFirst, ", "), new Transform$2("", kOmitLast8, ""), new Transform$2("", kIdentity, " at "), new Transform$2("", kIdentity, "ly "), new Transform$2(" the ", kIdentity, " of "), new Transform$2("", kOmitLast5, ""), new Transform$2("", kOmitLast9, ""), new Transform$2(" ", kUppercaseFirst, ", "), new Transform$2("", kUppercaseFirst, "\""), new Transform$2(".", kIdentity, "("), new Transform$2("", kUppercaseAll, " "), new Transform$2("", kUppercaseFirst, "\">"), new Transform$2("", kIdentity, "=\""), new Transform$2(" ", kIdentity, "."), new Transform$2(".com/", kIdentity, ""), new Transform$2(" the ", kIdentity, " of the "), new Transform$2("", kUppercaseFirst, "'"), new Transform$2("", kIdentity, ". This "), new Transform$2("", kIdentity, ","), new Transform$2(".", kIdentity, " "), new Transform$2("", kUppercaseFirst, "("), new Transform$2("", kUppercaseFirst, "."), new Transform$2("", kIdentity, " not "), new Transform$2(" ", kIdentity, "=\""), new Transform$2("", kIdentity, "er "), new Transform$2(" ", kUppercaseAll, " "), new Transform$2("", kIdentity, "al "), new Transform$2(" ", kUppercaseAll, ""), new Transform$2("", kIdentity, "='"), new Transform$2("", kUppercaseAll, "\""), new Transform$2("", kUppercaseFirst, ". "), new Transform$2(" ", kIdentity, "("), new Transform$2("", kIdentity, "ful "), new Transform$2(" ", kUppercaseFirst, ". "), new Transform$2("", kIdentity, "ive "), new Transform$2("", kIdentity, "less "), new Transform$2("", kUppercaseAll, "'"), new Transform$2("", kIdentity, "est "), new Transform$2(" ", kUppercaseFirst, "."), new Transform$2("", kUppercaseAll, "\">"), new Transform$2(" ", kIdentity, "='"), new Transform$2("", kUppercaseFirst, ","), new Transform$2("", kIdentity, "ize "), new Transform$2("", kUppercaseAll, "."), new Transform$2("\xc2\xa0", kIdentity, ""), new Transform$2(" ", kIdentity, ","), new Transform$2("", kUppercaseFirst, "=\""), new Transform$2("", kUppercaseAll, "=\""), new Transform$2("", kIdentity, "ous "), new Transform$2("", kUppercaseAll, ", "), new Transform$2("", kUppercaseFirst, "='"), new Transform$2(" ", kUppercaseFirst, ","), new Transform$2(" ", kUppercaseAll, "=\""), new Transform$2(" ", kUppercaseAll, ", "), new Transform$2("", kUppercaseAll, ","), new Transform$2("", kUppercaseAll, "("), new Transform$2("", kUppercaseAll, ". "), new Transform$2(" ", kUppercaseAll, "."), new Transform$2("", kUppercaseAll, "='"), new Transform$2(" ", kUppercaseAll, ". "), new Transform$2(" ", kUppercaseFirst, "=\""), new Transform$2(" ", kUppercaseAll, "='"), new Transform$2(" ", kUppercaseFirst, "='")]; +var kTransforms_1 = kTransforms; +var kNumTransforms = kTransforms.length; + +function ToUpperCase(p, i) { + if (p[i] < 0xc0) { + if (p[i] >= 97 && p[i] <= 122) { + p[i] ^= 32; + } + + return 1; + } + /* An overly simplified uppercasing model for utf-8. */ + + + if (p[i] < 0xe0) { + p[i + 1] ^= 32; + return 2; + } + /* An arbitrary transform for three byte characters. */ + + + p[i + 2] ^= 5; + return 3; +} + +var transformDictionaryWord = function transformDictionaryWord(dst, idx, word, len, transform) { + var prefix = kTransforms[transform].prefix; + var suffix = kTransforms[transform].suffix; + var t = kTransforms[transform].transform; + var skip = t < kOmitFirst1 ? 0 : t - (kOmitFirst1 - 1); + var i = 0; + var start_idx = idx; + var uppercase; + + if (skip > len) { + skip = len; + } + + var prefix_pos = 0; + + while (prefix_pos < prefix.length) { + dst[idx++] = prefix[prefix_pos++]; + } + + word += skip; + len -= skip; + + if (t <= kOmitLast9) { + len -= t; + } + + for (i = 0; i < len; i++) { + dst[idx++] = dictionary.dictionary[word + i]; + } + + uppercase = idx - len; + + if (t === kUppercaseFirst) { + ToUpperCase(dst, uppercase); + } else if (t === kUppercaseAll) { + while (len > 0) { + var step = ToUpperCase(dst, uppercase); + uppercase += step; + len -= step; + } + } + + var suffix_pos = 0; + + while (suffix_pos < suffix.length) { + dst[idx++] = suffix[suffix_pos++]; + } + + return idx - start_idx; +}; + +var transform = { + kTransforms: kTransforms_1, + kNumTransforms: kNumTransforms, + transformDictionaryWord: transformDictionaryWord +}; + +/* Copyright 2013 Google Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +var BrotliInput$1 = streams$1.BrotliInput; +var BrotliOutput$1 = streams$1.BrotliOutput; +var HuffmanCode$1 = huffman.HuffmanCode; +var BrotliBuildHuffmanTable$1 = huffman.BrotliBuildHuffmanTable; +var kDefaultCodeLength = 8; +var kCodeLengthRepeatCode = 16; +var kNumLiteralCodes = 256; +var kNumInsertAndCopyCodes = 704; +var kNumBlockLengthCodes = 26; +var kLiteralContextBits = 6; +var kDistanceContextBits = 2; +var HUFFMAN_TABLE_BITS = 8; +var HUFFMAN_TABLE_MASK = 0xff; +/* Maximum possible Huffman table size for an alphabet size of 704, max code + * length 15 and root table bits 8. */ + +var HUFFMAN_MAX_TABLE_SIZE = 1080; +var CODE_LENGTH_CODES = 18; +var kCodeLengthCodeOrder = new Uint8Array([1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15]); +var NUM_DISTANCE_SHORT_CODES = 16; +var kDistanceShortCodeIndexOffset = new Uint8Array([3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2]); +var kDistanceShortCodeValueOffset = new Int8Array([0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3]); +var kMaxHuffmanTableSize = new Uint16Array([256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822, 854, 886, 920, 952, 984, 1016, 1048, 1080]); + +function DecodeWindowBits(br) { + var n; + + if (br.readBits(1) === 0) { + return 16; + } + + n = br.readBits(3); + + if (n > 0) { + return 17 + n; + } + + n = br.readBits(3); + + if (n > 0) { + return 8 + n; + } + + return 17; +} +/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */ + + +function DecodeVarLenUint8(br) { + if (br.readBits(1)) { + var nbits = br.readBits(3); + + if (nbits === 0) { + return 1; + } else { + return br.readBits(nbits) + (1 << nbits); + } + } + + return 0; +} + +function MetaBlockLength() { + this.meta_block_length = 0; + this.input_end = 0; + this.is_uncompressed = 0; + this.is_metadata = false; +} + +function DecodeMetaBlockLength(br) { + var out = new MetaBlockLength(); + var size_nibbles; + var size_bytes; + var i; + out.input_end = br.readBits(1); + + if (out.input_end && br.readBits(1)) { + return out; + } + + size_nibbles = br.readBits(2) + 4; + + if (size_nibbles === 7) { + out.is_metadata = true; + if (br.readBits(1) !== 0) throw new Error('Invalid reserved bit'); + size_bytes = br.readBits(2); + if (size_bytes === 0) return out; + + for (i = 0; i < size_bytes; i++) { + var next_byte = br.readBits(8); + if (i + 1 === size_bytes && size_bytes > 1 && next_byte === 0) throw new Error('Invalid size byte'); + out.meta_block_length |= next_byte << i * 8; + } + } else { + for (i = 0; i < size_nibbles; ++i) { + var next_nibble = br.readBits(4); + if (i + 1 === size_nibbles && size_nibbles > 4 && next_nibble === 0) throw new Error('Invalid size nibble'); + out.meta_block_length |= next_nibble << i * 4; + } + } + + ++out.meta_block_length; + + if (!out.input_end && !out.is_metadata) { + out.is_uncompressed = br.readBits(1); + } + + return out; +} +/* Decodes the next Huffman code from bit-stream. */ + + +function ReadSymbol(table, index, br) { + var nbits; + br.fillBitWindow(); + index += br.val_ >>> br.bit_pos_ & HUFFMAN_TABLE_MASK; + nbits = table[index].bits - HUFFMAN_TABLE_BITS; + + if (nbits > 0) { + br.bit_pos_ += HUFFMAN_TABLE_BITS; + index += table[index].value; + index += br.val_ >>> br.bit_pos_ & (1 << nbits) - 1; + } + + br.bit_pos_ += table[index].bits; + return table[index].value; +} + +function ReadHuffmanCodeLengths(code_length_code_lengths, num_symbols, code_lengths, br) { + var symbol = 0; + var prev_code_len = kDefaultCodeLength; + var repeat = 0; + var repeat_code_len = 0; + var space = 32768; + var table = []; + + for (var i = 0; i < 32; i++) { + table.push(new HuffmanCode$1(0, 0)); + } + + BrotliBuildHuffmanTable$1(table, 0, 5, code_length_code_lengths, CODE_LENGTH_CODES); + + while (symbol < num_symbols && space > 0) { + var p = 0; + var code_len; + br.readMoreInput(); + br.fillBitWindow(); + p += br.val_ >>> br.bit_pos_ & 31; + br.bit_pos_ += table[p].bits; + code_len = table[p].value & 0xff; + + if (code_len < kCodeLengthRepeatCode) { + repeat = 0; + code_lengths[symbol++] = code_len; + + if (code_len !== 0) { + prev_code_len = code_len; + space -= 32768 >> code_len; + } + } else { + var extra_bits = code_len - 14; + var old_repeat; + var repeat_delta; + var new_len = 0; + + if (code_len === kCodeLengthRepeatCode) { + new_len = prev_code_len; + } + + if (repeat_code_len !== new_len) { + repeat = 0; + repeat_code_len = new_len; + } + + old_repeat = repeat; + + if (repeat > 0) { + repeat -= 2; + repeat <<= extra_bits; + } + + repeat += br.readBits(extra_bits) + 3; + repeat_delta = repeat - old_repeat; + + if (symbol + repeat_delta > num_symbols) { + throw new Error('[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols'); + } + + for (var x = 0; x < repeat_delta; x++) { + code_lengths[symbol + x] = repeat_code_len; + } + + symbol += repeat_delta; + + if (repeat_code_len !== 0) { + space -= repeat_delta << 15 - repeat_code_len; + } + } + } + + if (space !== 0) { + throw new Error("[ReadHuffmanCodeLengths] space = " + space); + } + + for (; symbol < num_symbols; symbol++) { + code_lengths[symbol] = 0; + } +} + +function ReadHuffmanCode(alphabet_size, tables, table, br) { + var table_size = 0; + var simple_code_or_skip; + var code_lengths = new Uint8Array(alphabet_size); + br.readMoreInput(); + /* simple_code_or_skip is used as follows: + 1 for simple code; + 0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */ + + simple_code_or_skip = br.readBits(2); + + if (simple_code_or_skip === 1) { + /* Read symbols, codes & code lengths directly. */ + var i; + var max_bits_counter = alphabet_size - 1; + var max_bits = 0; + var symbols = new Int32Array(4); + var num_symbols = br.readBits(2) + 1; + + while (max_bits_counter) { + max_bits_counter >>= 1; + ++max_bits; + } + + for (i = 0; i < num_symbols; ++i) { + symbols[i] = br.readBits(max_bits) % alphabet_size; + code_lengths[symbols[i]] = 2; + } + + code_lengths[symbols[0]] = 1; + + switch (num_symbols) { + case 1: + break; + + case 3: + if (symbols[0] === symbols[1] || symbols[0] === symbols[2] || symbols[1] === symbols[2]) { + throw new Error('[ReadHuffmanCode] invalid symbols'); + } + + break; + + case 2: + if (symbols[0] === symbols[1]) { + throw new Error('[ReadHuffmanCode] invalid symbols'); + } + + code_lengths[symbols[1]] = 1; + break; + + case 4: + if (symbols[0] === symbols[1] || symbols[0] === symbols[2] || symbols[0] === symbols[3] || symbols[1] === symbols[2] || symbols[1] === symbols[3] || symbols[2] === symbols[3]) { + throw new Error('[ReadHuffmanCode] invalid symbols'); + } + + if (br.readBits(1)) { + code_lengths[symbols[2]] = 3; + code_lengths[symbols[3]] = 3; + } else { + code_lengths[symbols[0]] = 2; + } + + break; + } + } else { + /* Decode Huffman-coded code lengths. */ + var i; + var code_length_code_lengths = new Uint8Array(CODE_LENGTH_CODES); + var space = 32; + var num_codes = 0; + /* Static Huffman code for the code length code lengths */ + + var huff = [new HuffmanCode$1(2, 0), new HuffmanCode$1(2, 4), new HuffmanCode$1(2, 3), new HuffmanCode$1(3, 2), new HuffmanCode$1(2, 0), new HuffmanCode$1(2, 4), new HuffmanCode$1(2, 3), new HuffmanCode$1(4, 1), new HuffmanCode$1(2, 0), new HuffmanCode$1(2, 4), new HuffmanCode$1(2, 3), new HuffmanCode$1(3, 2), new HuffmanCode$1(2, 0), new HuffmanCode$1(2, 4), new HuffmanCode$1(2, 3), new HuffmanCode$1(4, 5)]; + + for (i = simple_code_or_skip; i < CODE_LENGTH_CODES && space > 0; ++i) { + var code_len_idx = kCodeLengthCodeOrder[i]; + var p = 0; + var v; + br.fillBitWindow(); + p += br.val_ >>> br.bit_pos_ & 15; + br.bit_pos_ += huff[p].bits; + v = huff[p].value; + code_length_code_lengths[code_len_idx] = v; + + if (v !== 0) { + space -= 32 >> v; + ++num_codes; + } + } + + if (!(num_codes === 1 || space === 0)) throw new Error('[ReadHuffmanCode] invalid num_codes or space'); + ReadHuffmanCodeLengths(code_length_code_lengths, alphabet_size, code_lengths, br); + } + + table_size = BrotliBuildHuffmanTable$1(tables, table, HUFFMAN_TABLE_BITS, code_lengths, alphabet_size); + + if (table_size === 0) { + throw new Error("[ReadHuffmanCode] BuildHuffmanTable failed: "); + } + + return table_size; +} + +function ReadBlockLength(table, index, br) { + var code; + var nbits; + code = ReadSymbol(table, index, br); + nbits = prefix.kBlockLengthPrefixCode[code].nbits; + return prefix.kBlockLengthPrefixCode[code].offset + br.readBits(nbits); +} + +function TranslateShortCodes(code, ringbuffer, index) { + var val; + + if (code < NUM_DISTANCE_SHORT_CODES) { + index += kDistanceShortCodeIndexOffset[code]; + index &= 3; + val = ringbuffer[index] + kDistanceShortCodeValueOffset[code]; + } else { + val = code - NUM_DISTANCE_SHORT_CODES + 1; + } + + return val; +} + +function MoveToFront(v, index) { + var value = v[index]; + var i = index; + + for (; i; --i) { + v[i] = v[i - 1]; + } + + v[0] = value; +} + +function InverseMoveToFrontTransform(v, v_len) { + var mtf = new Uint8Array(256); + var i; + + for (i = 0; i < 256; ++i) { + mtf[i] = i; + } + + for (i = 0; i < v_len; ++i) { + var index = v[i]; + v[i] = mtf[index]; + if (index) MoveToFront(mtf, index); + } +} +/* Contains a collection of huffman trees with the same alphabet size. */ + + +function HuffmanTreeGroup(alphabet_size, num_htrees) { + this.alphabet_size = alphabet_size; + this.num_htrees = num_htrees; + this.codes = new Array(num_htrees + num_htrees * kMaxHuffmanTableSize[alphabet_size + 31 >>> 5]); + this.htrees = new Uint32Array(num_htrees); +} + +HuffmanTreeGroup.prototype.decode = function (br) { + var i; + var table_size; + var next = 0; + + for (i = 0; i < this.num_htrees; ++i) { + this.htrees[i] = next; + table_size = ReadHuffmanCode(this.alphabet_size, this.codes, next, br); + next += table_size; + } +}; + +function DecodeContextMap(context_map_size, br) { + var out = { + num_htrees: null, + context_map: null + }; + var use_rle_for_zeros; + var max_run_length_prefix = 0; + var table; + var i; + br.readMoreInput(); + var num_htrees = out.num_htrees = DecodeVarLenUint8(br) + 1; + var context_map = out.context_map = new Uint8Array(context_map_size); + + if (num_htrees <= 1) { + return out; + } + + use_rle_for_zeros = br.readBits(1); + + if (use_rle_for_zeros) { + max_run_length_prefix = br.readBits(4) + 1; + } + + table = []; + + for (i = 0; i < HUFFMAN_MAX_TABLE_SIZE; i++) { + table[i] = new HuffmanCode$1(0, 0); + } + + ReadHuffmanCode(num_htrees + max_run_length_prefix, table, 0, br); + + for (i = 0; i < context_map_size;) { + var code; + br.readMoreInput(); + code = ReadSymbol(table, 0, br); + + if (code === 0) { + context_map[i] = 0; + ++i; + } else if (code <= max_run_length_prefix) { + var reps = 1 + (1 << code) + br.readBits(code); + + while (--reps) { + if (i >= context_map_size) { + throw new Error("[DecodeContextMap] i >= context_map_size"); + } + + context_map[i] = 0; + ++i; + } + } else { + context_map[i] = code - max_run_length_prefix; + ++i; + } + } + + if (br.readBits(1)) { + InverseMoveToFrontTransform(context_map, context_map_size); + } + + return out; +} + +function DecodeBlockType(max_block_type, trees, tree_type, block_types, ringbuffers, indexes, br) { + var ringbuffer = tree_type * 2; + var index = tree_type; + var type_code = ReadSymbol(trees, tree_type * HUFFMAN_MAX_TABLE_SIZE, br); + var block_type; + + if (type_code === 0) { + block_type = ringbuffers[ringbuffer + (indexes[index] & 1)]; + } else if (type_code === 1) { + block_type = ringbuffers[ringbuffer + (indexes[index] - 1 & 1)] + 1; + } else { + block_type = type_code - 2; + } + + if (block_type >= max_block_type) { + block_type -= max_block_type; + } + + block_types[tree_type] = block_type; + ringbuffers[ringbuffer + (indexes[index] & 1)] = block_type; + ++indexes[index]; +} + +function CopyUncompressedBlockToOutput(output, len, pos, ringbuffer, ringbuffer_mask, br) { + var rb_size = ringbuffer_mask + 1; + var rb_pos = pos & ringbuffer_mask; + var br_pos = br.pos_ & bit_reader.IBUF_MASK; + var nbytes; + /* For short lengths copy byte-by-byte */ + + if (len < 8 || br.bit_pos_ + (len << 3) < br.bit_end_pos_) { + while (len-- > 0) { + br.readMoreInput(); + ringbuffer[rb_pos++] = br.readBits(8); + + if (rb_pos === rb_size) { + output.write(ringbuffer, rb_size); + rb_pos = 0; + } + } + + return; + } + + if (br.bit_end_pos_ < 32) { + throw new Error('[CopyUncompressedBlockToOutput] br.bit_end_pos_ < 32'); + } + /* Copy remaining 0-4 bytes from br.val_ to ringbuffer. */ + + + while (br.bit_pos_ < 32) { + ringbuffer[rb_pos] = br.val_ >>> br.bit_pos_; + br.bit_pos_ += 8; + ++rb_pos; + --len; + } + /* Copy remaining bytes from br.buf_ to ringbuffer. */ + + + nbytes = br.bit_end_pos_ - br.bit_pos_ >> 3; + + if (br_pos + nbytes > bit_reader.IBUF_MASK) { + var tail = bit_reader.IBUF_MASK + 1 - br_pos; + + for (var x = 0; x < tail; x++) { + ringbuffer[rb_pos + x] = br.buf_[br_pos + x]; + } + + nbytes -= tail; + rb_pos += tail; + len -= tail; + br_pos = 0; + } + + for (var x = 0; x < nbytes; x++) { + ringbuffer[rb_pos + x] = br.buf_[br_pos + x]; + } + + rb_pos += nbytes; + len -= nbytes; + /* If we wrote past the logical end of the ringbuffer, copy the tail of the + ringbuffer to its beginning and flush the ringbuffer to the output. */ + + if (rb_pos >= rb_size) { + output.write(ringbuffer, rb_size); + rb_pos -= rb_size; + + for (var x = 0; x < rb_pos; x++) { + ringbuffer[x] = ringbuffer[rb_size + x]; + } + } + /* If we have more to copy than the remaining size of the ringbuffer, then we + first fill the ringbuffer from the input and then flush the ringbuffer to + the output */ + + + while (rb_pos + len >= rb_size) { + nbytes = rb_size - rb_pos; + + if (br.input_.read(ringbuffer, rb_pos, nbytes) < nbytes) { + throw new Error('[CopyUncompressedBlockToOutput] not enough bytes'); + } + + output.write(ringbuffer, rb_size); + len -= nbytes; + rb_pos = 0; + } + /* Copy straight from the input onto the ringbuffer. The ringbuffer will be + flushed to the output at a later time. */ + + + if (br.input_.read(ringbuffer, rb_pos, len) < len) { + throw new Error('[CopyUncompressedBlockToOutput] not enough bytes'); + } + /* Restore the state of the bit reader. */ + + + br.reset(); +} +/* Advances the bit reader position to the next byte boundary and verifies + that any skipped bits are set to zero. */ + + +function JumpToByteBoundary(br) { + var new_bit_pos = br.bit_pos_ + 7 & ~7; + var pad_bits = br.readBits(new_bit_pos - br.bit_pos_); + return pad_bits == 0; +} + +function BrotliDecompressedSize(buffer) { + var input = new BrotliInput$1(buffer); + var br = new bit_reader(input); + DecodeWindowBits(br); + var out = DecodeMetaBlockLength(br); + return out.meta_block_length; +} + +var BrotliDecompressedSize_1 = BrotliDecompressedSize; + +function BrotliDecompressBuffer(buffer, output_size) { + var input = new BrotliInput$1(buffer); + + if (output_size == null) { + output_size = BrotliDecompressedSize(buffer); + } + + var output_buffer = new Uint8Array(output_size); + var output = new BrotliOutput$1(output_buffer); + BrotliDecompress(input, output); + + if (output.pos < output.buffer.length) { + output.buffer = output.buffer.subarray(0, output.pos); + } + + return output.buffer; +} + +var BrotliDecompressBuffer_1 = BrotliDecompressBuffer; + +function BrotliDecompress(input, output) { + var i; + var pos = 0; + var input_end = 0; + var window_bits = 0; + var max_backward_distance; + var max_distance = 0; + var ringbuffer_size; + var ringbuffer_mask; + var ringbuffer; + var ringbuffer_end; + /* This ring buffer holds a few past copy distances that will be used by */ + + /* some special distance codes. */ + + var dist_rb = [16, 15, 11, 4]; + var dist_rb_idx = 0; + /* The previous 2 bytes used for context. */ + + var prev_byte1 = 0; + var prev_byte2 = 0; + var hgroup = [new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0)]; + var block_type_trees; + var block_len_trees; + var br; + /* We need the slack region for the following reasons: + - always doing two 8-byte copies for fast backward copying + - transforms + - flushing the input ringbuffer when decoding uncompressed blocks */ + + var kRingBufferWriteAheadSlack = 128 + bit_reader.READ_SIZE; + br = new bit_reader(input); + /* Decode window size. */ + + window_bits = DecodeWindowBits(br); + max_backward_distance = (1 << window_bits) - 16; + ringbuffer_size = 1 << window_bits; + ringbuffer_mask = ringbuffer_size - 1; + ringbuffer = new Uint8Array(ringbuffer_size + kRingBufferWriteAheadSlack + dictionary.maxDictionaryWordLength); + ringbuffer_end = ringbuffer_size; + block_type_trees = []; + block_len_trees = []; + + for (var x = 0; x < 3 * HUFFMAN_MAX_TABLE_SIZE; x++) { + block_type_trees[x] = new HuffmanCode$1(0, 0); + block_len_trees[x] = new HuffmanCode$1(0, 0); + } + + while (!input_end) { + var meta_block_remaining_len = 0; + var is_uncompressed; + var block_length = [1 << 28, 1 << 28, 1 << 28]; + var block_type = [0]; + var num_block_types = [1, 1, 1]; + var block_type_rb = [0, 1, 0, 1, 0, 1]; + var block_type_rb_index = [0]; + var distance_postfix_bits; + var num_direct_distance_codes; + var distance_postfix_mask; + var num_distance_codes; + var context_map = null; + var context_modes = null; + var num_literal_htrees; + var dist_context_map = null; + var num_dist_htrees; + var context_offset = 0; + var context_map_slice = null; + var literal_htree_index = 0; + var dist_context_offset = 0; + var dist_context_map_slice = null; + var dist_htree_index = 0; + var context_lookup_offset1 = 0; + var context_lookup_offset2 = 0; + var context_mode; + var htree_command; + + for (i = 0; i < 3; ++i) { + hgroup[i].codes = null; + hgroup[i].htrees = null; + } + + br.readMoreInput(); + + var _out = DecodeMetaBlockLength(br); + + meta_block_remaining_len = _out.meta_block_length; + + if (pos + meta_block_remaining_len > output.buffer.length) { + /* We need to grow the output buffer to fit the additional data. */ + var tmp = new Uint8Array(pos + meta_block_remaining_len); + tmp.set(output.buffer); + output.buffer = tmp; + } + + input_end = _out.input_end; + is_uncompressed = _out.is_uncompressed; + + if (_out.is_metadata) { + JumpToByteBoundary(br); + + for (; meta_block_remaining_len > 0; --meta_block_remaining_len) { + br.readMoreInput(); + /* Read one byte and ignore it. */ + + br.readBits(8); + } + + continue; + } + + if (meta_block_remaining_len === 0) { + continue; + } + + if (is_uncompressed) { + br.bit_pos_ = br.bit_pos_ + 7 & ~7; + CopyUncompressedBlockToOutput(output, meta_block_remaining_len, pos, ringbuffer, ringbuffer_mask, br); + pos += meta_block_remaining_len; + continue; + } + + for (i = 0; i < 3; ++i) { + num_block_types[i] = DecodeVarLenUint8(br) + 1; + + if (num_block_types[i] >= 2) { + ReadHuffmanCode(num_block_types[i] + 2, block_type_trees, i * HUFFMAN_MAX_TABLE_SIZE, br); + ReadHuffmanCode(kNumBlockLengthCodes, block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br); + block_length[i] = ReadBlockLength(block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br); + block_type_rb_index[i] = 1; + } + } + + br.readMoreInput(); + distance_postfix_bits = br.readBits(2); + num_direct_distance_codes = NUM_DISTANCE_SHORT_CODES + (br.readBits(4) << distance_postfix_bits); + distance_postfix_mask = (1 << distance_postfix_bits) - 1; + num_distance_codes = num_direct_distance_codes + (48 << distance_postfix_bits); + context_modes = new Uint8Array(num_block_types[0]); + + for (i = 0; i < num_block_types[0]; ++i) { + br.readMoreInput(); + context_modes[i] = br.readBits(2) << 1; + } + + var _o1 = DecodeContextMap(num_block_types[0] << kLiteralContextBits, br); + + num_literal_htrees = _o1.num_htrees; + context_map = _o1.context_map; + + var _o2 = DecodeContextMap(num_block_types[2] << kDistanceContextBits, br); + + num_dist_htrees = _o2.num_htrees; + dist_context_map = _o2.context_map; + hgroup[0] = new HuffmanTreeGroup(kNumLiteralCodes, num_literal_htrees); + hgroup[1] = new HuffmanTreeGroup(kNumInsertAndCopyCodes, num_block_types[1]); + hgroup[2] = new HuffmanTreeGroup(num_distance_codes, num_dist_htrees); + + for (i = 0; i < 3; ++i) { + hgroup[i].decode(br); + } + + context_map_slice = 0; + dist_context_map_slice = 0; + context_mode = context_modes[block_type[0]]; + context_lookup_offset1 = context.lookupOffsets[context_mode]; + context_lookup_offset2 = context.lookupOffsets[context_mode + 1]; + htree_command = hgroup[1].htrees[0]; + + while (meta_block_remaining_len > 0) { + var cmd_code; + var range_idx; + var insert_code; + var copy_code; + var insert_length; + var copy_length; + var distance_code; + var distance; + var context$1; + var j; + var copy_dst; + br.readMoreInput(); + + if (block_length[1] === 0) { + DecodeBlockType(num_block_types[1], block_type_trees, 1, block_type, block_type_rb, block_type_rb_index, br); + block_length[1] = ReadBlockLength(block_len_trees, HUFFMAN_MAX_TABLE_SIZE, br); + htree_command = hgroup[1].htrees[block_type[1]]; + } + + --block_length[1]; + cmd_code = ReadSymbol(hgroup[1].codes, htree_command, br); + range_idx = cmd_code >> 6; + + if (range_idx >= 2) { + range_idx -= 2; + distance_code = -1; + } else { + distance_code = 0; + } + + insert_code = prefix.kInsertRangeLut[range_idx] + (cmd_code >> 3 & 7); + copy_code = prefix.kCopyRangeLut[range_idx] + (cmd_code & 7); + insert_length = prefix.kInsertLengthPrefixCode[insert_code].offset + br.readBits(prefix.kInsertLengthPrefixCode[insert_code].nbits); + copy_length = prefix.kCopyLengthPrefixCode[copy_code].offset + br.readBits(prefix.kCopyLengthPrefixCode[copy_code].nbits); + prev_byte1 = ringbuffer[pos - 1 & ringbuffer_mask]; + prev_byte2 = ringbuffer[pos - 2 & ringbuffer_mask]; + + for (j = 0; j < insert_length; ++j) { + br.readMoreInput(); + + if (block_length[0] === 0) { + DecodeBlockType(num_block_types[0], block_type_trees, 0, block_type, block_type_rb, block_type_rb_index, br); + block_length[0] = ReadBlockLength(block_len_trees, 0, br); + context_offset = block_type[0] << kLiteralContextBits; + context_map_slice = context_offset; + context_mode = context_modes[block_type[0]]; + context_lookup_offset1 = context.lookupOffsets[context_mode]; + context_lookup_offset2 = context.lookupOffsets[context_mode + 1]; + } + + context$1 = context.lookup[context_lookup_offset1 + prev_byte1] | context.lookup[context_lookup_offset2 + prev_byte2]; + literal_htree_index = context_map[context_map_slice + context$1]; + --block_length[0]; + prev_byte2 = prev_byte1; + prev_byte1 = ReadSymbol(hgroup[0].codes, hgroup[0].htrees[literal_htree_index], br); + ringbuffer[pos & ringbuffer_mask] = prev_byte1; + + if ((pos & ringbuffer_mask) === ringbuffer_mask) { + output.write(ringbuffer, ringbuffer_size); + } + + ++pos; + } + + meta_block_remaining_len -= insert_length; + if (meta_block_remaining_len <= 0) break; + + if (distance_code < 0) { + var context$1; + br.readMoreInput(); + + if (block_length[2] === 0) { + DecodeBlockType(num_block_types[2], block_type_trees, 2, block_type, block_type_rb, block_type_rb_index, br); + block_length[2] = ReadBlockLength(block_len_trees, 2 * HUFFMAN_MAX_TABLE_SIZE, br); + dist_context_offset = block_type[2] << kDistanceContextBits; + dist_context_map_slice = dist_context_offset; + } + + --block_length[2]; + context$1 = (copy_length > 4 ? 3 : copy_length - 2) & 0xff; + dist_htree_index = dist_context_map[dist_context_map_slice + context$1]; + distance_code = ReadSymbol(hgroup[2].codes, hgroup[2].htrees[dist_htree_index], br); + + if (distance_code >= num_direct_distance_codes) { + var nbits; + var postfix; + var offset; + distance_code -= num_direct_distance_codes; + postfix = distance_code & distance_postfix_mask; + distance_code >>= distance_postfix_bits; + nbits = (distance_code >> 1) + 1; + offset = (2 + (distance_code & 1) << nbits) - 4; + distance_code = num_direct_distance_codes + (offset + br.readBits(nbits) << distance_postfix_bits) + postfix; + } + } + /* Convert the distance code to the actual distance by possibly looking */ + + /* up past distnaces from the ringbuffer. */ + + + distance = TranslateShortCodes(distance_code, dist_rb, dist_rb_idx); + + if (distance < 0) { + throw new Error('[BrotliDecompress] invalid distance'); + } + + if (pos < max_backward_distance && max_distance !== max_backward_distance) { + max_distance = pos; + } else { + max_distance = max_backward_distance; + } + + copy_dst = pos & ringbuffer_mask; + + if (distance > max_distance) { + if (copy_length >= dictionary.minDictionaryWordLength && copy_length <= dictionary.maxDictionaryWordLength) { + var offset = dictionary.offsetsByLength[copy_length]; + var word_id = distance - max_distance - 1; + var shift = dictionary.sizeBitsByLength[copy_length]; + var mask = (1 << shift) - 1; + var word_idx = word_id & mask; + var transform_idx = word_id >> shift; + offset += word_idx * copy_length; + + if (transform_idx < transform.kNumTransforms) { + var len = transform.transformDictionaryWord(ringbuffer, copy_dst, offset, copy_length, transform_idx); + copy_dst += len; + pos += len; + meta_block_remaining_len -= len; + + if (copy_dst >= ringbuffer_end) { + output.write(ringbuffer, ringbuffer_size); + + for (var _x = 0; _x < copy_dst - ringbuffer_end; _x++) { + ringbuffer[_x] = ringbuffer[ringbuffer_end + _x]; + } + } + } else { + throw new Error("Invalid backward reference. pos: " + pos + " distance: " + distance + " len: " + copy_length + " bytes left: " + meta_block_remaining_len); + } + } else { + throw new Error("Invalid backward reference. pos: " + pos + " distance: " + distance + " len: " + copy_length + " bytes left: " + meta_block_remaining_len); + } + } else { + if (distance_code > 0) { + dist_rb[dist_rb_idx & 3] = distance; + ++dist_rb_idx; + } + + if (copy_length > meta_block_remaining_len) { + throw new Error("Invalid backward reference. pos: " + pos + " distance: " + distance + " len: " + copy_length + " bytes left: " + meta_block_remaining_len); + } + + for (j = 0; j < copy_length; ++j) { + ringbuffer[pos & ringbuffer_mask] = ringbuffer[pos - distance & ringbuffer_mask]; + + if ((pos & ringbuffer_mask) === ringbuffer_mask) { + output.write(ringbuffer, ringbuffer_size); + } + + ++pos; + --meta_block_remaining_len; + } + } + /* When we get here, we must have inserted at least one literal and */ + + /* made a copy of at least length two, therefore accessing the last 2 */ + + /* bytes is valid. */ + + + prev_byte1 = ringbuffer[pos - 1 & ringbuffer_mask]; + prev_byte2 = ringbuffer[pos - 2 & ringbuffer_mask]; + } + /* Protect pos from overflow, wrap it around at every GB of input data */ + + + pos &= 0x3fffffff; + } + + output.write(ringbuffer, pos & ringbuffer_mask); +} + +var BrotliDecompress_1 = BrotliDecompress; +dictionary.init(BrotliDecompressBuffer); +var decode = { + BrotliDecompressedSize: BrotliDecompressedSize_1, + BrotliDecompressBuffer: BrotliDecompressBuffer_1, + BrotliDecompress: BrotliDecompress_1 +}; + +var decompress = decode.BrotliDecompressBuffer; + +function _inheritsLoose$g(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } +/** + * Represents a TrueType glyph in the WOFF2 format, which compresses glyphs differently. + */ + +var WOFF2Glyph = /*#__PURE__*/function (_TTFGlyph) { + _inheritsLoose$g(WOFF2Glyph, _TTFGlyph); + + function WOFF2Glyph() { + return _TTFGlyph.apply(this, arguments) || this; + } + + var _proto = WOFF2Glyph.prototype; + + _proto._decode = function _decode() { + // We have to decode in advance (in WOFF2Font), so just return the pre-decoded data. + return this._font._transformedGlyphs[this.id]; + }; + + _proto._getCBox = function _getCBox() { + return this.path.bbox; + }; + + return WOFF2Glyph; +}(TTFGlyph); + +var Base128 = { + decode: function decode(stream) { + var result = 0; + var iterable = [0, 1, 2, 3, 4]; + + for (var j = 0; j < iterable.length; j++) { + var code = stream.readUInt8(); // If any of the top seven bits are set then we're about to overflow. + + if (result & 0xe0000000) { + throw new Error('Overflow'); + } + + result = result << 7 | code & 0x7f; + + if ((code & 0x80) === 0) { + return result; + } + } + + throw new Error('Bad base 128 number'); + } +}; +var knownTags = ['cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'OS/2', 'post', 'cvt ', 'fpgm', 'glyf', 'loca', 'prep', 'CFF ', 'VORG', 'EBDT', 'EBLC', 'gasp', 'hdmx', 'kern', 'LTSH', 'PCLT', 'VDMX', 'vhea', 'vmtx', 'BASE', 'GDEF', 'GPOS', 'GSUB', 'EBSC', 'JSTF', 'MATH', 'CBDT', 'CBLC', 'COLR', 'CPAL', 'SVG ', 'sbix', 'acnt', 'avar', 'bdat', 'bloc', 'bsln', 'cvar', 'fdsc', 'feat', 'fmtx', 'fvar', 'gvar', 'hsty', 'just', 'lcar', 'mort', 'morx', 'opbd', 'prop', 'trak', 'Zapf', 'Silf', 'Glat', 'Gloc', 'Feat', 'Sill']; +var WOFF2DirectoryEntry = new restructure.Struct({ + flags: restructure.uint8, + customTag: new restructure.Optional(new restructure.String(4), function (t) { + return (t.flags & 0x3f) === 0x3f; + }), + tag: function tag(t) { + return t.customTag || knownTags[t.flags & 0x3f]; + }, + // || (() => { throw new Error(`Bad tag: ${flags & 0x3f}`); })(); }, + length: Base128, + transformVersion: function transformVersion(t) { + return t.flags >>> 6 & 0x03; + }, + transformed: function transformed(t) { + return t.tag === 'glyf' || t.tag === 'loca' ? t.transformVersion === 0 : t.transformVersion !== 0; + }, + transformLength: new restructure.Optional(Base128, function (t) { + return t.transformed; + }) +}); +var WOFF2Directory = new restructure.Struct({ + tag: new restructure.String(4), + // should be 'wOF2' + flavor: restructure.uint32, + length: restructure.uint32, + numTables: restructure.uint16, + reserved: new restructure.Reserved(restructure.uint16), + totalSfntSize: restructure.uint32, + totalCompressedSize: restructure.uint32, + majorVersion: restructure.uint16, + minorVersion: restructure.uint16, + metaOffset: restructure.uint32, + metaLength: restructure.uint32, + metaOrigLength: restructure.uint32, + privOffset: restructure.uint32, + privLength: restructure.uint32, + tables: new restructure.Array(WOFF2DirectoryEntry, 'numTables') +}); + +WOFF2Directory.process = function () { + var tables = {}; + + for (var i = 0; i < this.tables.length; i++) { + var table = this.tables[i]; + tables[table.tag] = table; + } + + return this.tables = tables; +}; + +function _inheritsLoose$h(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } +/** + * Subclass of TTFFont that represents a TTF/OTF font compressed by WOFF2 + * See spec here: http://www.w3.org/TR/WOFF2/ + */ + +var WOFF2Font = /*#__PURE__*/function (_TTFFont) { + _inheritsLoose$h(WOFF2Font, _TTFFont); + + function WOFF2Font() { + return _TTFFont.apply(this, arguments) || this; + } + + WOFF2Font.probe = function probe(buffer) { + return buffer.toString('ascii', 0, 4) === 'wOF2'; + }; + + var _proto = WOFF2Font.prototype; + + _proto._decodeDirectory = function _decodeDirectory() { + this.directory = WOFF2Directory.decode(this.stream); + this._dataPos = this.stream.pos; + }; + + _proto._decompress = function _decompress() { + // decompress data and setup table offsets if we haven't already + if (!this._decompressed) { + this.stream.pos = this._dataPos; + var buffer = this.stream.readBuffer(this.directory.totalCompressedSize); + var decompressedSize = 0; + + for (var tag in this.directory.tables) { + var entry = this.directory.tables[tag]; + entry.offset = decompressedSize; + decompressedSize += entry.transformLength != null ? entry.transformLength : entry.length; + } + + var decompressed = decompress(buffer, decompressedSize); + + if (!decompressed) { + throw new Error('Error decoding compressed data in WOFF2'); + } + + this.stream = new restructure.DecodeStream(new buffer_1(decompressed)); + this._decompressed = true; + } + }; + + _proto._decodeTable = function _decodeTable(table) { + this._decompress(); + + return _TTFFont.prototype._decodeTable.call(this, table); + } // Override this method to get a glyph and return our + // custom subclass if there is a glyf table. + ; + + _proto._getBaseGlyph = function _getBaseGlyph(glyph, characters) { + if (characters === void 0) { + characters = []; + } + + if (!this._glyphs[glyph]) { + if (this.directory.tables.glyf && this.directory.tables.glyf.transformed) { + if (!this._transformedGlyphs) { + this._transformGlyfTable(); + } + + return this._glyphs[glyph] = new WOFF2Glyph(glyph, characters, this); + } else { + return _TTFFont.prototype._getBaseGlyph.call(this, glyph, characters); + } + } + }; + + _proto._transformGlyfTable = function _transformGlyfTable() { + this._decompress(); + + this.stream.pos = this.directory.tables.glyf.offset; + var table = GlyfTable.decode(this.stream); + var glyphs = []; + + for (var index = 0; index < table.numGlyphs; index++) { + var glyph = {}; + var nContours = table.nContours.readInt16BE(); + glyph.numberOfContours = nContours; + + if (nContours > 0) { + // simple glyph + var nPoints = []; + var totalPoints = 0; + + for (var i = 0; i < nContours; i++) { + var _r = read255UInt16(table.nPoints); + + totalPoints += _r; + nPoints.push(totalPoints); + } + + glyph.points = decodeTriplet(table.flags, table.glyphs, totalPoints); + + for (var _i = 0; _i < nContours; _i++) { + glyph.points[nPoints[_i] - 1].endContour = true; + } + + var instructionSize = read255UInt16(table.glyphs); + } else if (nContours < 0) { + // composite glyph + var haveInstructions = TTFGlyph.prototype._decodeComposite.call({ + _font: this + }, glyph, table.composites); + + if (haveInstructions) { + var instructionSize = read255UInt16(table.glyphs); + } + } + + glyphs.push(glyph); + } + + this._transformedGlyphs = glyphs; + }; + + return WOFF2Font; +}(TTFFont); // Special class that accepts a length and returns a sub-stream for that data + +var Substream = /*#__PURE__*/function () { + function Substream(length) { + this.length = length; + this._buf = new restructure.Buffer(length); + } + + var _proto2 = Substream.prototype; + + _proto2.decode = function decode(stream, parent) { + return new restructure.DecodeStream(this._buf.decode(stream, parent)); + }; + + return Substream; +}(); // This struct represents the entire glyf table + + +var GlyfTable = new restructure.Struct({ + version: restructure.uint32, + numGlyphs: restructure.uint16, + indexFormat: restructure.uint16, + nContourStreamSize: restructure.uint32, + nPointsStreamSize: restructure.uint32, + flagStreamSize: restructure.uint32, + glyphStreamSize: restructure.uint32, + compositeStreamSize: restructure.uint32, + bboxStreamSize: restructure.uint32, + instructionStreamSize: restructure.uint32, + nContours: new Substream('nContourStreamSize'), + nPoints: new Substream('nPointsStreamSize'), + flags: new Substream('flagStreamSize'), + glyphs: new Substream('glyphStreamSize'), + composites: new Substream('compositeStreamSize'), + bboxes: new Substream('bboxStreamSize'), + instructions: new Substream('instructionStreamSize') +}); +var WORD_CODE = 253; +var ONE_MORE_BYTE_CODE2 = 254; +var ONE_MORE_BYTE_CODE1 = 255; +var LOWEST_U_CODE = 253; + +function read255UInt16(stream) { + var code = stream.readUInt8(); + + if (code === WORD_CODE) { + return stream.readUInt16BE(); + } + + if (code === ONE_MORE_BYTE_CODE1) { + return stream.readUInt8() + LOWEST_U_CODE; + } + + if (code === ONE_MORE_BYTE_CODE2) { + return stream.readUInt8() + LOWEST_U_CODE * 2; + } + + return code; +} + +function withSign(flag, baseval) { + return flag & 1 ? baseval : -baseval; +} + +function decodeTriplet(flags, glyphs, nPoints) { + var y; + var x = y = 0; + var res = []; + + for (var i = 0; i < nPoints; i++) { + var dx = 0, + dy = 0; + var flag = flags.readUInt8(); + var onCurve = !(flag >> 7); + flag &= 0x7f; + + if (flag < 10) { + dx = 0; + dy = withSign(flag, ((flag & 14) << 7) + glyphs.readUInt8()); + } else if (flag < 20) { + dx = withSign(flag, ((flag - 10 & 14) << 7) + glyphs.readUInt8()); + dy = 0; + } else if (flag < 84) { + var b0 = flag - 20; + var b1 = glyphs.readUInt8(); + dx = withSign(flag, 1 + (b0 & 0x30) + (b1 >> 4)); + dy = withSign(flag >> 1, 1 + ((b0 & 0x0c) << 2) + (b1 & 0x0f)); + } else if (flag < 120) { + var b0 = flag - 84; + dx = withSign(flag, 1 + (b0 / 12 << 8) + glyphs.readUInt8()); + dy = withSign(flag >> 1, 1 + (b0 % 12 >> 2 << 8) + glyphs.readUInt8()); + } else if (flag < 124) { + var b1 = glyphs.readUInt8(); + var b2 = glyphs.readUInt8(); + dx = withSign(flag, (b1 << 4) + (b2 >> 4)); + dy = withSign(flag >> 1, ((b2 & 0x0f) << 8) + glyphs.readUInt8()); + } else { + dx = withSign(flag, glyphs.readUInt16BE()); + dy = withSign(flag >> 1, glyphs.readUInt16BE()); + } + + x += dx; + y += dy; + res.push(new Point(onCurve, false, x, y)); + } + + return res; +} + +function _createForOfIteratorHelperLoose$s(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$s(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$s(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$s(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$s(o, minLen); } + +function _arrayLikeToArray$s(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _defineProperties$9(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass$9(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$9(Constructor.prototype, protoProps); if (staticProps) _defineProperties$9(Constructor, staticProps); return Constructor; } +var TTCHeader = new restructure.VersionedStruct(restructure.uint32, { + 0x00010000: { + numFonts: restructure.uint32, + offsets: new restructure.Array(restructure.uint32, 'numFonts') + }, + 0x00020000: { + numFonts: restructure.uint32, + offsets: new restructure.Array(restructure.uint32, 'numFonts'), + dsigTag: restructure.uint32, + dsigLength: restructure.uint32, + dsigOffset: restructure.uint32 + } +}); + +var TrueTypeCollection = /*#__PURE__*/function () { + TrueTypeCollection.probe = function probe(buffer) { + return buffer.toString('ascii', 0, 4) === 'ttcf'; + }; + + function TrueTypeCollection(stream) { + this.stream = stream; + + if (stream.readString(4) !== 'ttcf') { + throw new Error('Not a TrueType collection'); + } + + this.header = TTCHeader.decode(stream); + } + + var _proto = TrueTypeCollection.prototype; + + _proto.getFont = function getFont(name) { + for (var _iterator = _createForOfIteratorHelperLoose$s(this.header.offsets), _step; !(_step = _iterator()).done;) { + var offset = _step.value; + var stream = new restructure.DecodeStream(this.stream.buffer); + stream.pos = offset; + var font = new TTFFont(stream); + + if (font.postscriptName === name) { + return font; + } + } + + return null; + }; + + _createClass$9(TrueTypeCollection, [{ + key: "fonts", + get: function get() { + var fonts = []; + + for (var _iterator2 = _createForOfIteratorHelperLoose$s(this.header.offsets), _step2; !(_step2 = _iterator2()).done;) { + var offset = _step2.value; + var stream = new restructure.DecodeStream(this.stream.buffer); + stream.pos = offset; + fonts.push(new TTFFont(stream)); + } + + return fonts; + } + }]); + + return TrueTypeCollection; +}(); + +function _createForOfIteratorHelperLoose$t(o) { var i = 0; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray$t(o))) return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } i = o[Symbol.iterator](); return i.next.bind(i); } + +function _unsupportedIterableToArray$t(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$t(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$t(o, minLen); } + +function _arrayLikeToArray$t(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _defineProperties$a(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass$a(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$a(Constructor.prototype, protoProps); if (staticProps) _defineProperties$a(Constructor, staticProps); return Constructor; } +var DFontName = new restructure.String(restructure.uint8); +var DFontData = new restructure.Struct({ + len: restructure.uint32, + buf: new restructure.Buffer('len') +}); +var Ref = new restructure.Struct({ + id: restructure.uint16, + nameOffset: restructure.int16, + attr: restructure.uint8, + dataOffset: restructure.uint24, + handle: restructure.uint32 +}); +var Type = new restructure.Struct({ + name: new restructure.String(4), + maxTypeIndex: restructure.uint16, + refList: new restructure.Pointer(restructure.uint16, new restructure.Array(Ref, function (t) { + return t.maxTypeIndex + 1; + }), { + type: 'parent' + }) +}); +var TypeList = new restructure.Struct({ + length: restructure.uint16, + types: new restructure.Array(Type, function (t) { + return t.length + 1; + }) +}); +var DFontMap = new restructure.Struct({ + reserved: new restructure.Reserved(restructure.uint8, 24), + typeList: new restructure.Pointer(restructure.uint16, TypeList), + nameListOffset: new restructure.Pointer(restructure.uint16, 'void') +}); +var DFontHeader = new restructure.Struct({ + dataOffset: restructure.uint32, + map: new restructure.Pointer(restructure.uint32, DFontMap), + dataLength: restructure.uint32, + mapLength: restructure.uint32 +}); + +var DFont = /*#__PURE__*/function () { + DFont.probe = function probe(buffer) { + var stream = new restructure.DecodeStream(buffer); + + try { + var header = DFontHeader.decode(stream); + } catch (e) { + return false; + } + + for (var _iterator = _createForOfIteratorHelperLoose$t(header.map.typeList.types), _step; !(_step = _iterator()).done;) { + var type = _step.value; + + if (type.name === 'sfnt') { + return true; + } + } + + return false; + }; + + function DFont(stream) { + this.stream = stream; + this.header = DFontHeader.decode(this.stream); + + for (var _iterator2 = _createForOfIteratorHelperLoose$t(this.header.map.typeList.types), _step2; !(_step2 = _iterator2()).done;) { + var type = _step2.value; + + for (var _iterator3 = _createForOfIteratorHelperLoose$t(type.refList), _step3; !(_step3 = _iterator3()).done;) { + var ref = _step3.value; + + if (ref.nameOffset >= 0) { + this.stream.pos = ref.nameOffset + this.header.map.nameListOffset; + ref.name = DFontName.decode(this.stream); + } else { + ref.name = null; + } + } + + if (type.name === 'sfnt') { + this.sfnt = type; + } + } + } + + var _proto = DFont.prototype; + + _proto.getFont = function getFont(name) { + if (!this.sfnt) { + return null; + } + + for (var _iterator4 = _createForOfIteratorHelperLoose$t(this.sfnt.refList), _step4; !(_step4 = _iterator4()).done;) { + var ref = _step4.value; + var pos = this.header.dataOffset + ref.dataOffset + 4; + var stream = new restructure.DecodeStream(this.stream.buffer.slice(pos)); + var font = new TTFFont(stream); + + if (font.postscriptName === name) { + return font; + } + } + + return null; + }; + + _createClass$a(DFont, [{ + key: "fonts", + get: function get() { + var fonts = []; + + for (var _iterator5 = _createForOfIteratorHelperLoose$t(this.sfnt.refList), _step5; !(_step5 = _iterator5()).done;) { + var ref = _step5.value; + var pos = this.header.dataOffset + ref.dataOffset + 4; + var stream = new restructure.DecodeStream(this.stream.buffer.slice(pos)); + fonts.push(new TTFFont(stream)); + } + + return fonts; + } + }]); + + return DFont; +}(); + +fontkit.registerFormat(TTFFont); +fontkit.registerFormat(WOFFFont); +fontkit.registerFormat(WOFF2Font); +fontkit.registerFormat(TrueTypeCollection); +fontkit.registerFormat(DFont); + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (fontkit); + + /***/ }), /***/ "./node_modules/@pdf-lib/standard-fonts/es/Encoding.js": @@ -6798,9 +43365,9 @@ function Title(_ref) { title, drive } = _ref; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_helmet__WEBPACK_IMPORTED_MODULE_1__.Helmet, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("title", null, drive ? title : "".concat(title, " - OpenSign\u2122")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("meta", { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_helmet__WEBPACK_IMPORTED_MODULE_1__.Helmet, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("title", null, drive ? title : `${title} - OpenSign™`), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("meta", { name: "description", - content: "".concat(title, " - OpenSign\u2122") + content: `${title} - OpenSign™` }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("link", { rel: "icon", type: "image/png", @@ -6832,7 +43399,7 @@ function BorderResize(_ref) { top } = _ref; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "".concat(right ? "-right-[12px]" : "-right-[1px]", " ").concat(top ? "-bottom-[11px]" : "-bottom-[1px]", " absolute inline-block w-[14px] h-[14px] hover:cursor-sw-resize border-r-[3px] border-b-[3px] border-[#188ae2]") + className: `${right ? `-right-[12px]` : "-right-[1px]"} ${top ? `-bottom-[11px]` : "-bottom-[1px]"} absolute inline-block w-[14px] h-[14px] hover:cursor-sw-resize border-r-[3px] border-b-[3px] border-[#188ae2]` }); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BorderResize); @@ -6852,6 +43419,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); + function DefaultSignature(_ref) { let { @@ -6859,16 +43428,19 @@ function DefaultSignature(_ref) { xyPostion, setDefaultSignAlert } = _ref; + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(); const confirmToaddDefaultSign = () => { if (xyPostion.length > 0) { setDefaultSignAlert({ isShow: true, - alertMessage: "Are you sure you want to auto sign at requested all locations?" + alertMessage: t("default-sign-alert") }); } else { setDefaultSignAlert({ isShow: true, - alertMessage: "please select position!" + alertMessage: t("please-select-position!") }); } }; @@ -6876,11 +43448,11 @@ function DefaultSignature(_ref) { "data-tut": "reactourThird" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300" - }, "Signature"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("signature")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-col items-center mt-[10px] font-semibold" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "text-base-content" - }, "Your Signature"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("Your-Signature")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "op-card shadow-md h-[111px] w-[90%] p-2" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", { alt: "signature", @@ -6890,7 +43462,7 @@ function DefaultSignature(_ref) { type: "button", className: "op-btn op-btn-primary op-btn-sm mt-[10px]", onClick: () => confirmToaddDefaultSign() - }, "Auto Sign All"))); + }, t("auto-sign-all")))); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DefaultSignature); @@ -6912,9 +43484,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _PrevNext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PrevNext */ "./src/components/pdf/PrevNext.js"); /* harmony import */ var _constant_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constant/Utils */ "./src/constant/Utils.js"); /* harmony import */ var _styles_signature_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../styles/signature.css */ "./src/styles/signature.css"); -/* harmony import */ var _radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @radix-ui/react-dropdown-menu */ "./node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs"); +/* harmony import */ var _radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @radix-ui/react-dropdown-menu */ "./node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs"); /* harmony import */ var _primitives_ModalUi__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../primitives/ModalUi */ "./src/primitives/ModalUi.js"); /* harmony import */ var _primitives_Loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../primitives/Loader */ "./src/primitives/Loader.js"); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); + @@ -6946,9 +43520,16 @@ function Header(_ref) { setIsEmail, completeBtnTitle, setIsEditTemplate, - isPublicTemplate + isPublicTemplate, + clickOnZoomIn, + clickOnZoomOut, + handleRotationFun, + isDisableRotate } = _ref; - const filterPrefill = signerPos && (signerPos === null || signerPos === void 0 ? void 0 : signerPos.filter(data => data.Role !== "prefill")); + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_6__.useTranslation)(); + const filterPrefill = signerPos && signerPos?.filter(data => data.Role !== "prefill"); const isMobile = window.innerWidth < 767; const [isDownloading, setIsDownloading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); const isGuestSigner = localStorage.getItem("isGuestSigner"); @@ -6980,17 +43561,17 @@ function Header(_ref) { pageNumber: pageNumber, allPages: allPages, changePage: changePage - }), pdfUrl && alreadySign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Root, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Trigger, { + }), isCompleted && alreadySign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Root, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Trigger, { asChild: true }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "op-link op-link-primary no-underline text-[16px] font-semibold pr-[3px] pl-[5px]" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-ellipsis-v", "aria-hidden": "true" - }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Portal, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Content, { + }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Portal, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Content, { className: "DropdownMenuContent", sideOffset: 5 - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Item, { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { className: "DropdownMenuItem", onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { @@ -6998,7 +43579,7 @@ function Header(_ref) { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-arrow-down mr-[3px]", "aria-hidden": "true" - }), "Download")), isCompleted && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Item, { + }), t("download"))), isCompleted && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { className: "DropdownMenuItem", onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadCertificate)(pdfDetails, setIsDownloading) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { @@ -7006,7 +43587,7 @@ function Header(_ref) { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-award mr-[3px]", "aria-hidden": "true" - }), "Certificate")), isSignYourself && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Item, { + }), t("certificate"))), isSignYourself && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { className: "DropdownMenuItem", onClick: () => setIsEmail(true) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { @@ -7014,7 +43595,7 @@ function Header(_ref) { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-envelope mr-[3px]", "aria-hidden": "true" - }), "Mail")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Item, { + }), t("mail"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { className: "DropdownMenuItem", onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { @@ -7022,7 +43603,7 @@ function Header(_ref) { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-print mr-[3px]", "aria-hidden": "true" - }), "Print"))))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }), t("print")))))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex justify-around items-center" }, currentSigner && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex items-center", @@ -7030,43 +43611,65 @@ function Header(_ref) { }, decline && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { onClick: () => handleDeclinePdfAlert(), className: "text-[red] border-none font-[650] text-[14px] mr-2" - }, "Decline"), isPlaceholder ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("decline")), isPlaceholder ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { onClick: () => { if (!isMailSend) { alertSendEmail(); } }, - className: "".concat(isMailSend ? "" : "op-link-primary", " op-link no-underline font-[650] text-[14px]"), + className: `${isMailSend ? "" : "op-link-primary"} op-link no-underline font-[650] text-[14px]`, "data-tut": "headerArea" - }, completeBtnTitle ? completeBtnTitle : "Send") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, completeBtnTitle ? completeBtnTitle : t("send")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { "data-tut": "reactourThird", - onClick: () => { - if (!pdfUrl) { - embedWidgetsData(); - } else if (isPdfRequestFiles) { - embedWidgetsData(); - } - }, + onClick: () => embedWidgetsData(), className: "border-none font-[650] text-[14px] op-link op-link-primary no-underline" - }, "Finish"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Root, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Trigger, { + }, t("finish")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Root, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Trigger, { asChild: true }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "font-[650] text-[18px] px-2 ml-[4px] text-base-content no-underline" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-ellipsis-v", "aria-hidden": "true" - }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Portal, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Content, { - className: "bg-white shadow-md rounded-full px-3 py-2", + }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Portal, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Content, { + className: "bg-white shadow-md rounded-md px-3 py-2", sideOffset: 5 - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_6__.Item, { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { className: "flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer", - onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading) + onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfDetails[0]?.URL, setIsDownloading) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-arrow-down mr-[3px]", "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "font-[500]" - }, "Download"))))))))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("download"))), !isDisableRotate && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { + className: "flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer", + onClick: () => handleRotationFun(90) + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + className: "fa-light fa-rotate-right text-gray-500 2xl:text-[30px] mr-[3px]" + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: "font-[500]" + }, t("rotate-right"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { + className: "flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer", + onClick: () => handleRotationFun(-90) + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + className: "fa-light fa-rotate-left text-gray-500 2xl:text-[30px] mr-[3px]" + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: "font-[500]" + }, t("rotate-left")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { + className: "flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer", + onClick: () => clickOnZoomIn() + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + className: "fa-light fa-magnifying-glass-plus text-gray-500 2xl:text-[30px]" + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: "font-[500]" + }, t("zoom-in"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { + className: "flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer", + onClick: () => clickOnZoomOut() + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + className: "fa-light fa-magnifying-glass-minus text-gray-500 2xl:text-[30px]" + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: "font-[500]" + }, t("zoom-out")))))))))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-wrap justify-between items-center w-full gap-y-1 ml-1" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PrevNext__WEBPACK_IMPORTED_MODULE_1__["default"], { pageNumber: pageNumber, @@ -7076,9 +43679,9 @@ function Header(_ref) { className: "flex mx-[100px] lg:mx-0 order-last lg:order-none" }, !isMailSend && signersdata.length > 0 && signersdata.length !== filterPrefill.length && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, filterPrefill.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "text-[13px] text-[#f5405e]" - }, "Add ", signersdata.length - filterPrefill.length, " ", "recipients signature") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + }, t("add"), " ", signersdata.length - filterPrefill.length, " ", t("recipients"), " ", t("widgets-name.signature")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "text-[13px] text-[#f5405e]" - }, "Add ", signersdata.length - filterPrefill.length, " more recipients signature"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("add"), " ", signersdata.length - filterPrefill.length, " ", t("more"), t("recipients"), " ", t("widgets-name.signature")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex" }, setIsEditTemplate && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => setIsEditTemplate(true), @@ -7089,12 +43692,12 @@ function Header(_ref) { onClick: () => window.history.go(-2), type: "button", className: "op-btn op-btn-ghost op-btn-sm mr-[3px]" - }, "Back"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("back")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { disabled: isMailSend && true, "data-tut": "headerArea", className: "op-btn op-btn-primary op-btn-sm mr-[3px]", onClick: () => alertSendEmail() - }, completeBtnTitle ? completeBtnTitle : isMailSend ? "Sent" : "Send"))) : isPdfRequestFiles ? alreadySign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, completeBtnTitle ? completeBtnTitle : isMailSend ? t("sent") : t("send")))) : isPdfRequestFiles ? alreadySign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-row" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading), @@ -7105,7 +43708,7 @@ function Header(_ref) { "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block" - }, "Print")), isCompleted && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("print"))), isCompleted && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadCertificate)(pdfDetails, setIsDownloading), className: "op-btn op-btn-secondary op-btn-sm mr-[3px] shadow" @@ -7114,7 +43717,7 @@ function Header(_ref) { "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block" - }, "Certificate")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("certificate"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "op-btn op-btn-primary op-btn-sm mr-[3px] shadow", onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading) @@ -7123,21 +43726,21 @@ function Header(_ref) { "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block" - }, "Download"))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("download")))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex", "data-tut": "reactourFifth" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => window.history.go(-2), type: "button", className: "op-btn op-btn-ghost op-btn-sm mr-[3px]" - }, "Back"), currentSigner && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("back")), currentSigner && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "op-btn op-btn-secondary op-btn-sm mr-[3px] shadow", onClick: () => handleDeclinePdfAlert() - }, "Decline"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("decline")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "op-btn op-btn-primary op-btn-sm mr-[3px] shadow", onClick: () => embedWidgetsData() - }, "Finish"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("finish")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "op-btn op-btn-neutral op-btn-sm mr-[3px] shadow", onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading) @@ -7145,7 +43748,7 @@ function Header(_ref) { className: "fa-light fa-arrow-down font-semibold lg:hidden" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block" - }, "Download")))) : isCompleted ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("download"))))) : isCompleted ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-row" }, isCompleted && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", @@ -7156,7 +43759,7 @@ function Header(_ref) { "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block ml-1" - }, "Certificate")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("certificate"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading), type: "button", className: "op-btn op-btn-neutral op-btn-sm gap-0 font-medium text-[12px] mr-[3px] shadow" @@ -7165,7 +43768,7 @@ function Header(_ref) { "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block ml-1" - }, "Print")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("print"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "op-btn op-btn-primary op-btn-sm gap-0 font-medium text-[12px] mr-[3px] shadow", onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading) @@ -7174,7 +43777,7 @@ function Header(_ref) { "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block ml-1" - }, "Download")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("download"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "op-btn op-btn-info op-btn-sm gap-0 font-medium text-[12px] mr-[3px] shadow", onClick: () => setIsEmail(true) @@ -7183,35 +43786,31 @@ function Header(_ref) { "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block ml-1" - }, "Mail"))) : isPublicTemplate ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("mail")))) : isPublicTemplate ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "op-btn op-btn-primary op-btn-sm shadow", onClick: () => embedWidgetsData() - }, "Sign Now")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("sign-now"))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => window.history.go(-2), type: "button", className: "op-btn op-btn-ghost op-btn-sm mr-[3px]" - }, "Back"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("back")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "op-btn op-btn-primary op-btn-sm mr-[3px]", - onClick: () => { - if (!pdfUrl) { - embedWidgetsData(); - } - } - }, "Finish"))), isDownloading === "pdf" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + onClick: () => embedWidgetsData() + }, t("finish")))), isDownloading === "pdf" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "fixed z-[200] inset-0 flex justify-center items-center bg-black bg-opacity-30" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_Loader__WEBPACK_IMPORTED_MODULE_5__["default"], null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_4__["default"], { isOpen: isDownloading === "certificate", - title: isDownloading === "certificate" ? "Generating certificate" : "PDF Download", + title: isDownloading === "certificate" ? t("generating-certificate") : t("pdf-download"), handleClose: () => setIsDownloading("") }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "p-3 md:p-5 text-[13px] md:text-base text-center text-base-content" - }, isDownloading === "certificate", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Your completion certificate is being generated. Please wait momentarily. If the download doesn't start shortly, click the button again.")))); + }, isDownloading === "certificate", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, t("generate-certificate-alert"))))); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Header); @@ -7230,54 +43829,43 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); + function PdfZoom(props) { - const onClickZoomIn = () => { - props.setScale(props.scale + 0.1 * props.scale); - props.setZoomPercent(props.zoomPercent + 10); - }; - const onClickZoomOut = () => { - if (props.zoomPercent > 0) { - if (props.zoomPercent === 10) { - props.setScale(1); - } else { - props.setScale(props.scale - 0.1 * props.scale); - } - props.setZoomPercent(props.zoomPercent - 10); - } - }; - const handleReset = () => { - props.setScale(1); - props.setZoomPercent(0); - }; - return ( - /*#__PURE__*/ - // md:mt-[41px] xl:mt-[63px]mt=[] - react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - className: "hidden md:flex flex-col gap-1 text-center md:w-[5%] mt-[50px] 2xl:mt-[63px]" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - className: "bg-gray-50 px-[4px] 2xl:px-[15px] 2xl:py-[10px] cursor-pointer", - onClick: onClickZoomIn, - title: "Zoom in" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { - className: "fa-light fa-magnifying-glass-plus text-gray-500 2xl:text-[30px]" - })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - className: "bg-gray-50 px-[4px] 2xl:px-[15px] 2xl:py-[10px] cursor-pointer", - onClick: handleReset, - title: "Reset" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { - className: "fa-light fa-magnifying-glass-arrows-rotate text-gray-500 2xl:text-[30px]" - })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - className: "bg-gray-50 px-[4px] 2xl:px-[15px] 2xl:py-[10px]", - onClick: onClickZoomOut, - style: { - cursor: props.zoomPercent > 0 ? "pointer" : "default" - }, - title: "Zoom out" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { - className: "fa-light fa-magnifying-glass-minus text-gray-500 2xl:text-[30px]" - }))) - ); + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: "hidden md:flex flex-col gap-1 text-center md:w-[5%] mt-[43px] 2xl:mt-[63px]" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: "bg-gray-50 px-[4px] 2xl:px-[15px] 2xl:py-[10px] cursor-pointer", + onClick: () => props.clickOnZoomIn(), + title: t("zoom-in") + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + className: "fa-light fa-magnifying-glass-plus text-gray-500 2xl:text-[30px]" + })), !props?.isDisableRotate && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: "bg-gray-50 px-[4px] 2xl:px-[15px] 2xl:py-[10px] cursor-pointer", + onClick: () => props.handleRotationFun(90), + title: t("rotate-right") + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + className: "fa-light fa-rotate-right text-gray-500 2xl:text-[30px]" + })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: "bg-gray-50 px-[4px] 2xl:px-[15px] 2xl:py-[10px] cursor-pointer", + title: t("rotate-left"), + onClick: () => props.handleRotationFun(-90) + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + className: "fa-light fa-rotate-left text-gray-500 2xl:text-[30px]" + }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: "bg-gray-50 px-[4px] 2xl:px-[15px] 2xl:py-[10px]", + onClick: () => props.clickOnZoomOut(), + style: { + cursor: props.zoomPercent > 0 ? "pointer" : "default" + }, + title: t("zoom-out") + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + className: "fa-light fa-magnifying-glass-minus text-gray-500 2xl:text-[30px]" + }))); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PdfZoom); @@ -7304,6 +43892,10 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ "./node_modules/moment/moment.js"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _styles_opensigndrive_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../styles/opensigndrive.css */ "./src/styles/opensigndrive.css"); +/* harmony import */ var _primitives_ModalUi__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../primitives/ModalUi */ "./src/primitives/ModalUi.js"); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); + + @@ -7372,7 +43964,7 @@ const getDefaultdate = function (selectedDate) { if (format && format === "dd-MM-yyyy") { const newdate = selectedDate ? selectedDate : moment__WEBPACK_IMPORTED_MODULE_6___default()(new Date()).format(changeDateToMomentFormat(format)); const [day, month, year] = newdate.split("-"); - date = new Date("".concat(year, "-").concat(month, "-").concat(day)); + date = new Date(`${year}-${month}-${day}`); } else { date = new Date(selectedDate); } @@ -7382,20 +43974,22 @@ const getDefaultdate = function (selectedDate) { //function to get default format const getDefaultFormat = dateFormat => dateFormat || "MM/dd/yyyy"; function Placeholder(props) { - var _props$pos, _props$pos2, _props$pos3, _props$pos4, _props$pos5, _props$pos6, _props$data14, _props$pos13, _props$data16; + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_9__.useTranslation)(); const [placeholderBorder, setPlaceholderBorder] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ w: 0, h: 0 }); const [isDraggingEnabled, setDraggingEnabled] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true); - const [isShowDateFormat, setIsShowDateFormat] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false); + const [isDateModal, setIsDateModal] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false); const [containerScale, setContainerScale] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(); const [selectDate, setSelectDate] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ - date: props.pos.type === "date" ? moment__WEBPACK_IMPORTED_MODULE_6___default()(getDefaultdate(props === null || props === void 0 || (_props$pos = props.pos) === null || _props$pos === void 0 || (_props$pos = _props$pos.options) === null || _props$pos === void 0 ? void 0 : _props$pos.response, (_props$pos2 = props.pos) === null || _props$pos2 === void 0 || (_props$pos2 = _props$pos2.options) === null || _props$pos2 === void 0 || (_props$pos2 = _props$pos2.validation) === null || _props$pos2 === void 0 ? void 0 : _props$pos2.format).getTime()).format(changeDateToMomentFormat((_props$pos3 = props.pos) === null || _props$pos3 === void 0 || (_props$pos3 = _props$pos3.options) === null || _props$pos3 === void 0 || (_props$pos3 = _props$pos3.validation) === null || _props$pos3 === void 0 ? void 0 : _props$pos3.format)) : "", - format: props.pos.type === "date" ? getDefaultFormat((_props$pos4 = props.pos) === null || _props$pos4 === void 0 || (_props$pos4 = _props$pos4.options) === null || _props$pos4 === void 0 || (_props$pos4 = _props$pos4.validation) === null || _props$pos4 === void 0 ? void 0 : _props$pos4.format) : "" + date: props.pos.type === "date" ? moment__WEBPACK_IMPORTED_MODULE_6___default()(getDefaultdate(props?.pos?.options?.response, props.pos?.options?.validation?.format).getTime()).format(changeDateToMomentFormat(props.pos?.options?.validation?.format)) : "", + format: props.pos.type === "date" ? getDefaultFormat(props.pos?.options?.validation?.format) : "" }); const [dateFormat, setDateFormat] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]); - const [startDate, setStartDate] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(props.pos.type === "date" && getDefaultdate(props === null || props === void 0 || (_props$pos5 = props.pos) === null || _props$pos5 === void 0 || (_props$pos5 = _props$pos5.options) === null || _props$pos5 === void 0 ? void 0 : _props$pos5.response, (_props$pos6 = props.pos) === null || _props$pos6 === void 0 || (_props$pos6 = _props$pos6.options) === null || _props$pos6 === void 0 || (_props$pos6 = _props$pos6.validation) === null || _props$pos6 === void 0 ? void 0 : _props$pos6.format)); + const [startDate, setStartDate] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(props.pos.type === "date" && getDefaultdate(props?.pos?.options?.response, props.pos?.options?.validation?.format)); const [getCheckboxRenderWidth, setGetCheckboxRenderWidth] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ width: null, height: null @@ -7444,9 +44038,9 @@ function Placeholder(props) { let date; if (selectDate && selectDate.format === "dd-MM-yyyy") { const [day, month, year] = selectDate.date.split("-"); - date = new Date("".concat(year, "-").concat(month, "-").concat(day)); + date = new Date(`${year}-${month}-${day}`); } else { - date = new Date(selectDate === null || selectDate === void 0 ? void 0 : selectDate.date); + date = new Date(selectDate?.date); } const milliseconds = date.getTime(); const newDate = moment__WEBPACK_IMPORTED_MODULE_6___default()(milliseconds).format(data); @@ -7465,20 +44059,6 @@ function Placeholder(props) { // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectDate]); - //it detect outside click of date dropdown menu - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { - const closeMenuOnOutsideClick = e => { - if (isShowDateFormat && !e.target.closest("#menu-container")) { - setIsShowDateFormat(!isShowDateFormat); - } - }; - document.addEventListener("click", closeMenuOnOutsideClick); - return () => { - // Cleanup the event listener when the component unmounts - document.removeEventListener("click", closeMenuOnOutsideClick); - }; - }, [isShowDateFormat]); - //`handleWidgetIdandPopup` is used to set current widget id and open relative popup const handleWidgetIdandPopup = () => { if (props.setSelectWidgetId) { @@ -7489,7 +44069,7 @@ function Placeholder(props) { setDraggingEnabled(false); } if ((props.isNeedSign || props.isSignYourself) && !props.isDragging) { - if (props !== null && props !== void 0 && props.ispublicTemplate) { + if (props?.ispublicTemplate) { props.handleUserDetails(); } else { if (props.pos.type) { @@ -7504,10 +44084,9 @@ function Placeholder(props) { props.setIsInitial(true); } } else { - var _props$pos7; props.setIsSignPad(true); props.setSignKey(props.pos.key); - props.setIsStamp((_props$pos7 = props.pos) !== null && _props$pos7 !== void 0 && _props$pos7.isStamp ? props.pos.isStamp : false); + props.setIsStamp(props.pos?.isStamp ? props.pos.isStamp : false); } } } else if (props.isPlaceholder && !props.isDragging && props.pos.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget) { @@ -7532,14 +44111,13 @@ function Placeholder(props) { } }; const handleOnClickPlaceholder = () => { - var _props$data, _props$data2; props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); if (!props.isNeedSign) { props.setWidgetType(props.pos.type); } - if (props.isNeedSign && ((_props$data = props.data) === null || _props$data === void 0 ? void 0 : _props$data.signerObjId) === props.signerObjId) { + if (props.isNeedSign && props.data?.signerObjId === props.signerObjId) { handleWidgetIdandPopup(); - } else if (props !== null && props !== void 0 && props.isNeedSign && props !== null && props !== void 0 && props.uniqueId && ((_props$data2 = props.data) === null || _props$data2 === void 0 ? void 0 : _props$data2.Id) === (props === null || props === void 0 ? void 0 : props.uniqueId)) { + } else if (props?.isNeedSign && props?.uniqueId && props.data?.Id === props?.uniqueId) { handleWidgetIdandPopup(); } else if (props.isPlaceholder || props.isSignYourself) { handleWidgetIdandPopup(); @@ -7547,35 +44125,32 @@ function Placeholder(props) { }; //`handleOnClickSettingIcon` is used set current widget details and open setting of it const handleOnClickSettingIcon = () => { - var _props$pos8; if (props.pos.type === _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.radioButtonWidget) { props.setIsRadio(true); } else if (props.pos.type === "dropdown") { - props === null || props === void 0 || props.setShowDropdown(true); + props?.setShowDropdown(true); } else if (props.pos.type === "checkbox") { - props === null || props === void 0 || props.setIsCheckbox(true); + props?.setIsCheckbox(true); } //condition to handle setting icon for signyour-self flow for all type text widgets else if ([_constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textInputWidget, _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget, "name", "company", "job title", "email"].includes(props.pos.type) && props.isSignYourself) { props.handleTextSettingModal(true); } else { - (props === null || props === void 0 ? void 0 : props.handleNameModal) && (props === null || props === void 0 ? void 0 : props.handleNameModal(true)); + props?.handleNameModal && props?.handleNameModal(true); } //condition for only placeholder and template flow - if (props.data && (props === null || props === void 0 || (_props$pos8 = props.pos) === null || _props$pos8 === void 0 ? void 0 : _props$pos8.type) !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget) { - var _props$data3, _props$data4; - props.setSignerObjId(props === null || props === void 0 || (_props$data3 = props.data) === null || _props$data3 === void 0 ? void 0 : _props$data3.signerObjId); - props.setUniqueId(props === null || props === void 0 || (_props$data4 = props.data) === null || _props$data4 === void 0 ? void 0 : _props$data4.Id); + if (props.data && props?.pos?.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget) { + props.setSignerObjId(props?.data?.signerObjId); + props.setUniqueId(props?.data?.Id); const checkIndex = props.xyPostion.findIndex(data => data.Id === props.data.Id); props.setIsSelectId(checkIndex || 0); } //condition to handle in placeholder and template flow for text widget signerId for text widgets i have to set uniqueId in tempSignerId because //it does not have any signer user and any signerobjId else if (props.data && props.pos.type === _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget) { - var _props$data5; props.setTempSignerId(props.uniqueId); - props.setUniqueId(props === null || props === void 0 || (_props$data5 = props.data) === null || _props$data5 === void 0 ? void 0 : _props$data5.Id); + props.setUniqueId(props?.data?.Id); const checkIndex = props.xyPostion.findIndex(data => data.Id === props.data.Id); props.setIsSelectId(checkIndex || 0); } @@ -7585,24 +44160,21 @@ function Placeholder(props) { }; //function to set required state value onclick on widget's copy icon const handleCopyPlaceholder = e => { - var _props$pos9; e.stopPropagation(); //condition to handle text widget signer obj id and unique id //when user click on copy icon of text widget in that condition text widget does not have any signerObjId //in that case i have to save in tempSignerId as a unique id of previous select signer's unique id //and on save or cancel button of copy all page popup i have set this temp signer Id in unique id - if (props.data && (props === null || props === void 0 || (_props$pos9 = props.pos) === null || _props$pos9 === void 0 ? void 0 : _props$pos9.type) !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget) { - var _props$data6, _props$data7; - props.setSignerObjId(props === null || props === void 0 || (_props$data6 = props.data) === null || _props$data6 === void 0 ? void 0 : _props$data6.signerObjId); - props.setUniqueId(props === null || props === void 0 || (_props$data7 = props.data) === null || _props$data7 === void 0 ? void 0 : _props$data7.Id); + if (props.data && props?.pos?.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget) { + props.setSignerObjId(props?.data?.signerObjId); + props.setUniqueId(props?.data?.Id); const checkIndex = props.xyPostion.findIndex(data => data.Id === props.data.Id); props.setIsSelectId(checkIndex || 0); } else if (props.data && props.pos.type === _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget) { - var _props$data8, _props$data9; props.setTempSignerId(props.uniqueId); - props.setSignerObjId(props === null || props === void 0 || (_props$data8 = props.data) === null || _props$data8 === void 0 ? void 0 : _props$data8.signerObjId); - props.setUniqueId(props === null || props === void 0 || (_props$data9 = props.data) === null || _props$data9 === void 0 ? void 0 : _props$data9.Id); + props.setSignerObjId(props?.data?.signerObjId); + props.setUniqueId(props?.data?.Id); const checkIndex = props.xyPostion.findIndex(data => data.Id === props.data.Id); props.setIsSelectId(checkIndex || 0); } @@ -7612,9 +44184,8 @@ function Placeholder(props) { props.setIsPageCopy(true); props.setSignKey(props.pos.key); } else { - var _props$data10; //function to create new widget next to just widget - (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_4__.handleCopyNextToWidget)(props.pos, props.pos.type, props.xyPostion, props.index, props.setXyPostion, props.data && ((_props$data10 = props.data) === null || _props$data10 === void 0 ? void 0 : _props$data10.Id)); + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_4__.handleCopyNextToWidget)(props.pos, props.pos.type, props.xyPostion, props.index, props.setXyPostion, props.data && props.data?.Id); } }; @@ -7628,17 +44199,16 @@ function Placeholder(props) { } //using moment package is used to change date as per the format provided in selectDate obj e.g. - MM/dd/yyyy -> 03/12/2024 //`getDefaultdate` is used to convert update date in new Date() format - const date = moment__WEBPACK_IMPORTED_MODULE_6___default()(getDefaultdate(updateDate, data === null || data === void 0 ? void 0 : data.format).getTime()).format(changeDateToMomentFormat(data === null || data === void 0 ? void 0 : data.format)); + const date = moment__WEBPACK_IMPORTED_MODULE_6___default()(getDefaultdate(updateDate, data?.format).getTime()).format(changeDateToMomentFormat(data?.format)); //`onChangeInput` is used to save data related to date in a placeholder field - (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_4__.onChangeInput)(date, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && props.data.Id, false, data === null || data === void 0 ? void 0 : data.format); + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_4__.onChangeInput)(date, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && props.data.Id, false, data?.format, null, null, props.fontSize || props.pos?.options?.fontSize || "12", props.fontColor || props.pos?.options?.fontColor || "black"); setSelectDate({ date: date, - format: data === null || data === void 0 ? void 0 : data.format + format: data?.format }); }; const PlaceholderIcon = () => { - var _props$pos10, _props$pos11, _props$pos12; return props.isShowBorder && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, (props.isPlaceholder || props.isSignYourself) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, ["checkbox", _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textInputWidget, _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget, "name", "company", "job title", "email"].includes(props.pos.type) && props.isSignYourself ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { onClick: e => { e.stopPropagation(); @@ -7655,7 +44225,7 @@ function Placeholder(props) { top: "-19px" } }) : ( /* condition to add setting icon for placeholder & template flow for all widgets except signature and date */ - (!(props !== null && props !== void 0 && (_props$pos10 = props.pos) !== null && _props$pos10 !== void 0 && _props$pos10.type) && props.pos.isStamp || (props === null || props === void 0 || (_props$pos11 = props.pos) === null || _props$pos11 === void 0 ? void 0 : _props$pos11.type) && !["date", "signature"].includes(props.pos.type) && !props.isSignYourself) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + (!props?.pos?.type && props.pos.isStamp || props?.pos?.type && !["date", "signature"].includes(props.pos.type) && !props.isSignYourself) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { onClick: e => { e.stopPropagation(); handleOnClickSettingIcon(); @@ -7667,7 +44237,7 @@ function Placeholder(props) { className: "fa-light fa-gear icon", style: { color: "#188ae2", - right: (props === null || props === void 0 || (_props$pos12 = props.pos) === null || _props$pos12 === void 0 ? void 0 : _props$pos12.type) === _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget ? "32px" : "47px", + right: props?.pos?.type === _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget ? "32px" : "47px", top: "-19px" } })), props.pos.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget && !props.isSignYourself && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { @@ -7692,16 +44262,10 @@ function Placeholder(props) { right: "32px", top: "-18px" } - })), props.pos.type === "date" && selectDate && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - id: "menu-container", - style: { - zIndex: "99", - top: "-19px", - right: props.isPlaceholder ? "60px" : "44px" - }, - className: "".concat(isShowDateFormat ? "show" : "", " dropdown icon"), + })), props.pos.type === "date" && selectDate && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { onClick: e => { - setIsShowDateFormat(!isShowDateFormat); + props.setCurrWidgetsDetails(props.pos); + setIsDateModal(!isDateModal); e.stopPropagation(); if (props.data) { props.setSignKey(props.pos.key); @@ -7711,42 +44275,25 @@ function Placeholder(props) { } }, onTouchEnd: e => { + props.setCurrWidgetsDetails(props.pos); e.stopPropagation(); - setIsShowDateFormat(!isShowDateFormat); + setIsDateModal(!isDateModal); if (props.data) { props.setSignKey(props.pos.key); props.setUniqueId(props.data.Id); const checkIndex = props.xyPostion.findIndex(data => data.Id === props.data.Id); props.setIsSelectId(checkIndex || 0); } - } - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { - className: "fa-light fa-gear icon", + }, style: { + zIndex: "99", + top: "-18px", + right: props.isPlaceholder ? "50px" : "30px", color: "#188ae2", fontSize: "14px" - } - }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: isShowDateFormat ? "dropdown-menu show" : "dropdown-menu", - "aria-labelledby": "dropdownMenuButton", - "aria-expanded": isShowDateFormat ? "true" : "false" - }, dateFormat.map((data, ind) => { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - key: ind, - onTouchEnd: e => { - e.stopPropagation(); - setIsShowDateFormat(!isShowDateFormat); - setSelectDate(data); - handleSaveDate(data); - }, - onClick: () => { - setIsShowDateFormat(!isShowDateFormat); - setSelectDate(data); - handleSaveDate(data); - }, - className: "dropdown-item text-[13px]" - }, data !== null && data !== void 0 && data.date ? data === null || data === void 0 ? void 0 : data.date : "nodata"); - }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + }, + className: "fa-light fa-gear icon" + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-copy icon", onClick: e => handleCopyPlaceholder(e), onTouchEnd: e => handleCopyPlaceholder(e), @@ -7775,8 +44322,7 @@ function Placeholder(props) { e.stopPropagation(); //condition for template and placeholder flow if (props.data) { - var _props$data11; - props.handleDeleteSign(props.pos.key, (_props$data11 = props.data) === null || _props$data11 === void 0 ? void 0 : _props$data11.Id); + props.handleDeleteSign(props.pos.key, props.data?.Id); } //condition for signyour-self flow else { @@ -7841,10 +44387,9 @@ function Placeholder(props) { }; const getCursor = () => { if (props.data && props.isNeedSign) { - var _props$data12, _props$data13; - if (props !== null && props !== void 0 && props.signerObjId && ((_props$data12 = props.data) === null || _props$data12 === void 0 ? void 0 : _props$data12.signerObjId) === props.signerObjId) { + if (props?.signerObjId && props.data?.signerObjId === props.signerObjId) { return "pointer"; - } else if (props !== null && props !== void 0 && props.uniqueId && ((_props$data13 = props.data) === null || _props$data13 === void 0 ? void 0 : _props$data13.Id) === props.uniqueId) { + } else if (props?.uniqueId && props.data?.Id === props.uniqueId) { return "pointer"; } else { return "not-allowed"; @@ -7853,7 +44398,7 @@ function Placeholder(props) { return "all-scroll"; } }; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_rnd__WEBPACK_IMPORTED_MODULE_3__.Rnd, { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_rnd__WEBPACK_IMPORTED_MODULE_3__.Rnd, { id: props.pos.key, "data-tut": props.pos.key === props.unSignedWidgetId ? "IsSigned" : "", key: props.pos.key, @@ -7864,7 +44409,7 @@ function Placeholder(props) { bottom: false, left: false, topRight: false, - bottomRight: props.data && props.isNeedSign ? ((_props$data14 = props.data) === null || _props$data14 === void 0 ? void 0 : _props$data14.signerObjId) === props.signerObjId && props.pos.type !== "checkbox" && props.pos.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.radioButtonWidget ? true : false : props.pos.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.radioButtonWidget && props.pos.type !== "checkbox" && props.pos.key === props.selectWidgetId && true, + bottomRight: props.data && props.isNeedSign ? props.data?.signerObjId === props.signerObjId && props.pos.type !== "checkbox" && props.pos.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.radioButtonWidget ? true : false : props.pos.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.radioButtonWidget && props.pos.type !== "checkbox" && props.pos.key === props.selectWidgetId && true, bottomLeft: false, topLeft: false }, @@ -7875,7 +44420,7 @@ function Placeholder(props) { borderRadius: "2px", textAlign: props.pos.type !== "name" && props.pos.type !== "company" && props.pos.type !== "job title" && "center", cursor: getCursor(), - zIndex: props.pos.type === "date" ? props.pos.key === props.selectWidgetId ? 99 + 1 : 99 : props !== null && props !== void 0 && (_props$pos13 = props.pos) !== null && _props$pos13 !== void 0 && _props$pos13.zIndex ? props.pos.zIndex : "5", + zIndex: props.pos.type === "date" ? props.pos.key === props.selectWidgetId ? 99 + 1 : 99 : props?.pos?.zIndex ? props.pos.zIndex : "5", background: props.data ? props.data.blockColor : "rgb(203 233 237)" }, onDrag: () => { @@ -7895,10 +44440,7 @@ function Placeholder(props) { props.handleSignYourselfImageResize && props.handleSignYourselfImageResize(ref, props.pos.key, props.xyPostion, props.setXyPostion, props.index, containerScale, props.scale, props.data && props.data.Id, props.isResize); }, disableDragging: props.isNeedSign ? true : props.isPlaceholder && ![_constant_Utils__WEBPACK_IMPORTED_MODULE_4__.textWidget].includes(props.pos.type) ? false : !isDraggingEnabled, - onDragStop: (event, dragElement) => { - var _props$data15, _props$pos14; - return props.handleStop && props.handleStop(event, dragElement, (_props$data15 = props.data) === null || _props$data15 === void 0 ? void 0 : _props$data15.Id, (_props$pos14 = props.pos) === null || _props$pos14 === void 0 ? void 0 : _props$pos14.key); - }, + onDragStop: (event, dragElement) => props.handleStop && props.handleStop(event, dragElement, props.data?.Id, props.pos?.key), position: { x: xPos(props.pos, props.isSignYourself), y: yPos(props.pos, props.isSignYourself) @@ -7913,7 +44455,7 @@ function Placeholder(props) { }, props.isShowBorder && props.pos.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.radioButtonWidget && props.pos.type !== "checkbox" && props.pos.key === props.selectWidgetId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_BorderResize__WEBPACK_IMPORTED_MODULE_1__["default"], { right: -12, top: -11 - }) : props.data && props.isNeedSign && props.pos.type !== "checkbox" ? ((_props$data16 = props.data) === null || _props$data16 === void 0 ? void 0 : _props$data16.signerObjId) === props.signerObjId && props.pos.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.radioButtonWidget && props.pos.type !== "checkbox" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_BorderResize__WEBPACK_IMPORTED_MODULE_1__["default"], null) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null) : props.pos.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.radioButtonWidget && props.pos.type !== "checkbox" && props.pos.key === props.selectWidgetId && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_BorderResize__WEBPACK_IMPORTED_MODULE_1__["default"], null), props.isShowBorder && props.pos.key === props.selectWidgetId && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PlaceholderBorder__WEBPACK_IMPORTED_MODULE_2__["default"], { + }) : props.data && props.isNeedSign && props.pos.type !== "checkbox" ? props.data?.signerObjId === props.signerObjId && props.pos.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.radioButtonWidget && props.pos.type !== "checkbox" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_BorderResize__WEBPACK_IMPORTED_MODULE_1__["default"], null) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null) : props.pos.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.radioButtonWidget && props.pos.type !== "checkbox" && props.pos.key === props.selectWidgetId && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_BorderResize__WEBPACK_IMPORTED_MODULE_1__["default"], null), props.isShowBorder && props.pos.key === props.selectWidgetId && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PlaceholderBorder__WEBPACK_IMPORTED_MODULE_2__["default"], { setDraggingEnabled: setDraggingEnabled, pos: props.pos, isPlaceholder: props.isPlaceholder, @@ -7939,13 +44481,13 @@ function Placeholder(props) { setXyPostion: props.setXyPostion, data: props.data, setSignKey: props.setSignKey, - isShowDropdown: props === null || props === void 0 ? void 0 : props.isShowDropdown, + isShowDropdown: props?.isShowDropdown, isPlaceholder: props.isPlaceholder, isSignYourself: props.isSignYourself, signerObjId: props.signerObjId, handleUserName: props.handleUserName, setDraggingEnabled: setDraggingEnabled, - pdfDetails: (props === null || props === void 0 ? void 0 : props.pdfDetails) && (props === null || props === void 0 ? void 0 : props.pdfDetails[0]), + pdfDetails: props?.pdfDetails && props?.pdfDetails[0], isNeedSign: props.isNeedSign, setSelectDate: setSelectDate, selectDate: selectDate, @@ -7961,13 +44503,13 @@ function Placeholder(props) { setXyPostion: props.setXyPostion, data: props.data, setSignKey: props.setSignKey, - isShowDropdown: props === null || props === void 0 ? void 0 : props.isShowDropdown, + isShowDropdown: props?.isShowDropdown, isPlaceholder: props.isPlaceholder, isSignYourself: props.isSignYourself, signerObjId: props.signerObjId, handleUserName: props.handleUserName, setDraggingEnabled: setDraggingEnabled, - pdfDetails: (props === null || props === void 0 ? void 0 : props.pdfDetails) && (props === null || props === void 0 ? void 0 : props.pdfDetails[0]), + pdfDetails: props?.pdfDetails && props?.pdfDetails[0], isNeedSign: props.isNeedSign, setSelectDate: setSelectDate, selectDate: selectDate, @@ -7976,7 +44518,75 @@ function Placeholder(props) { startDate: startDate, handleSaveDate: handleSaveDate, xPos: props.xPos - }))); + }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_8__["default"], { + isOpen: isDateModal, + title: t("widget-info"), + showClose: false + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "h-[100%] p-[20px]" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "flex flex-row items-center" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("format"), " : "), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "flex" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", { + className: "ml-[7px] op-select op-select-bordered op-select-sm focus:outline-none hover:border-base-content text-xs", + defaultValue: "", + onChange: e => { + const selectedIndex = e.target.value; + e.stopPropagation(); + setSelectDate(dateFormat[selectedIndex]); + } + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { + value: "", + disabled: true + }, t("select-date-format")), dateFormat.map((data, ind) => { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { + className: "text-[13px]", + value: ind, + key: ind + }, data?.date ? data?.date : "nodata"); + }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: "text-xs text-gray-400 ml-1" + }, selectDate.format)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "flex items-center mt-4 md:mt-2" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("font-size"), " :"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", { + className: "ml-[3px] md:ml:[7px] op-select op-select-bordered op-select-sm focus:outline-none hover:border-base-content text-xs", + value: props.fontSize || props.currWidgetsDetails?.options?.fontSize || "12", + onChange: e => props.setFontSize(e.target.value) + }, _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.fontsizeArr.map((size, ind) => { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { + className: "text-[13px]", + value: size, + key: ind + }, size); + })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "flex flex-row gap-1 items-center ml-2 md:ml-4 " + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("color"), ": "), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", { + value: props.fontColor || props.pos.options?.fontColor || "black", + onChange: e => props.setFontColor(e.target.value), + className: "ml-[4px] md:ml[7px] op-select op-select-bordered op-select-sm focus:outline-none hover:border-base-content text-xs" + }, _constant_Utils__WEBPACK_IMPORTED_MODULE_4__.fontColorArr.map((color, ind) => { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { + value: color, + key: ind + }, t(`color-type.${color}`)); + })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + style: { + background: props.fontColor || props.pos.options?.fontColor || "black" + }, + className: "w-5 h-[19px] ml-1" + }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "h-[1px] w-full my-[15px] bg-[#9f9f9f]" + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + type: "button", + className: "op-btn op-btn-primary", + onClick: () => { + setIsDateModal(false); + handleSaveDate(selectDate); + props.setFontColor(""); + props.setFontSize(""); + } + }, t("save"))))); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Placeholder); @@ -8027,8 +44637,8 @@ function PlaceholderBorder(props) { } }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - onMouseEnter: () => !_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.isMobile && (props === null || props === void 0 ? void 0 : props.setDraggingEnabled(true)), - onTouchEnd: () => props.pos.type === _constant_Utils__WEBPACK_IMPORTED_MODULE_2__.textWidget && (props === null || props === void 0 ? void 0 : props.setDraggingEnabled(true)), + onMouseEnter: () => !_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.isMobile && props?.setDraggingEnabled(true), + onTouchEnd: () => props.pos.type === _constant_Utils__WEBPACK_IMPORTED_MODULE_2__.textWidget && props?.setDraggingEnabled(true), className: "absolute inline-block w-[14px] h-[14px] border-[0.2px] overflow-hidden border-dashed", style: { borderColor: _constant_const__WEBPACK_IMPORTED_MODULE_1__.themeColor, @@ -8055,13 +44665,15 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _constant_Utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../constant/Utils */ "./src/constant/Utils.js"); -/* harmony import */ var react_datepicker__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-datepicker */ "./node_modules/react-datepicker/dist/react-datepicker.min.js"); -/* harmony import */ var react_datepicker__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_datepicker__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var react_datepicker__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-datepicker */ "./node_modules/react-datepicker/dist/react-datepicker.min.js"); +/* harmony import */ var react_datepicker__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react_datepicker__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var react_datepicker_dist_react_datepicker_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-datepicker/dist/react-datepicker.css */ "./node_modules/react-datepicker/dist/react-datepicker.css"); /* harmony import */ var _styles_signature_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../styles/signature.css */ "./src/styles/signature.css"); /* harmony import */ var regex_parser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! regex-parser */ "./node_modules/regex-parser/lib/index.js"); /* harmony import */ var regex_parser__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(regex_parser__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _constant_const__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../constant/const */ "./src/constant/const.js"); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); + @@ -8072,34 +44684,37 @@ __webpack_require__.r(__webpack_exports__); const textWidgetCls = "w-full h-full md:min-w-full md:min-h-full z-[999] text-[12px] rounded-[2px] border-[1px] border-[#007bff] overflow-hidden resize-none outline-none text-base-content item-center whitespace-pre-wrap bg-white"; const selectWidgetCls = "w-full h-full absolute left-0 top-0 border-[1px] border-[#007bff] rounded-[2px] focus:outline-none text-base-content"; function PlaceholderType(props) { - var _props$pos, _props$pos19, _props$data4, _props$data5, _props$pos20, _props$data6, _props$data7, _props$pos21, _props$pos$options7, _props$data9, _props$pos$options11, _props$pos$options12, _props$pos$options13, _props$pos$options14, _props$pos$options15, _props$pos$options16, _props$data11, _props$pos22, _props$pos23, _props$pos24, _props$data13, _props$data14, _props$pos25, _props$data15, _props$pos$options17, _props$pos$options18, _props$pos$options19, _props$pos$options20, _props$pos$options21, _props$pos$options22, _props$data17, _props$pos$options23, _props$pos$options24, _props$pos$options25, _props$pos$options26, _props$pos$options27, _props$pos$options28, _props$data19, _props$pos$options29, _props$pos$options30, _props$pos$options31, _props$pos$options32, _props$pos$options33, _props$pos$options34, _props$data21, _props$data22, _props$pos$options35, _props$selectDate, _props$pos26, _props$pos27, _props$selectDate2, _props$pos28, _props$pos29, _props$data23, _props$data24, _props$pos30, _props$data25, _props$pos$options36, _props$pos$options37, _props$pos$options38, _props$pos$options39, _props$pos$options40, _props$pos$options41, _props$pos$options42, _props$pos$options45, _props$pos$options46, _props$pos$options47, _props$data29, _props$data30; - const type = props === null || props === void 0 || (_props$pos = props.pos) === null || _props$pos === void 0 ? void 0 : _props$pos.type; + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_6__.useTranslation)(); + const type = props?.pos?.type; + const widgetTypeTraslation = t(`widgets-name.${props?.pos?.type}`); const [selectOption, setSelectOption] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); const [validatePlaceholder, setValidatePlaceholder] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); const inputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); const [textValue, setTextValue] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(); const [selectedCheckbox, setSelectedCheckbox] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]); const years = (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.range)(1990, (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.getYear)(new Date()) + 16, 1); + const fontSize = (props.pos.options?.fontSize || "12") + "px"; + const fontColor = props.pos.options?.fontColor || "black"; const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; const validateExpression = regexValidation => { if (textValue && regexValidation) { - var _props$pos2; let regexObject = regexValidation; - if (((_props$pos2 = props.pos) === null || _props$pos2 === void 0 || (_props$pos2 = _props$pos2.options) === null || _props$pos2 === void 0 || (_props$pos2 = _props$pos2.validation) === null || _props$pos2 === void 0 ? void 0 : _props$pos2.type) === "regex") { + if (props.pos?.options?.validation?.type === "regex") { regexObject = regex_parser__WEBPACK_IMPORTED_MODULE_4___default()(regexValidation); } // new RegExp(regexValidation); let isValidate = regexObject.test(textValue); if (!isValidate) { - props === null || props === void 0 || props.setValidateAlert(true); + props?.setValidateAlert(true); inputRef.current.focus(); } } }; const handleInputBlur = () => { - var _props$pos3, _props$pos4; props.setDraggingEnabled(true); - const validateType = (_props$pos3 = props.pos) === null || _props$pos3 === void 0 || (_props$pos3 = _props$pos3.options) === null || _props$pos3 === void 0 || (_props$pos3 = _props$pos3.validation) === null || _props$pos3 === void 0 ? void 0 : _props$pos3.type; + const validateType = props.pos?.options?.validation?.type; let regexValidation; if (validateType && validateType !== "text") { switch (validateType) { @@ -8112,7 +44727,7 @@ function PlaceholderType(props) { validateExpression(regexValidation); break; default: - regexValidation = ((_props$pos4 = props.pos) === null || _props$pos4 === void 0 || (_props$pos4 = _props$pos4.options) === null || _props$pos4 === void 0 || (_props$pos4 = _props$pos4.validation) === null || _props$pos4 === void 0 ? void 0 : _props$pos4.pattern) || ""; + regexValidation = props.pos?.options?.validation?.pattern || ""; validateExpression(regexValidation); } } @@ -8137,42 +44752,41 @@ function PlaceholderType(props) { } } (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { - var _props$pos5, _props$pos7, _props$pos9, _props$pos10, _props$pos11, _props$pos12, _props$pos13, _props$pos14, _props$pos15, _props$pos16; if (type && type === "checkbox" && props.isNeedSign) { - var _props$pos$options; - const isDefaultValue = (_props$pos$options = props.pos.options) === null || _props$pos$options === void 0 ? void 0 : _props$pos$options.defaultValue; + const isDefaultValue = props.pos.options?.defaultValue; if (isDefaultValue) { setSelectedCheckbox(isDefaultValue); } - } else if ((_props$pos5 = props.pos) !== null && _props$pos5 !== void 0 && (_props$pos5 = _props$pos5.options) !== null && _props$pos5 !== void 0 && _props$pos5.hint) { - var _props$pos6; - setValidatePlaceholder((_props$pos6 = props.pos) === null || _props$pos6 === void 0 ? void 0 : _props$pos6.options.hint); - } else if ((_props$pos7 = props.pos) !== null && _props$pos7 !== void 0 && (_props$pos7 = _props$pos7.options) !== null && _props$pos7 !== void 0 && (_props$pos7 = _props$pos7.validation) !== null && _props$pos7 !== void 0 && _props$pos7.type) { - var _props$pos8; - checkRegularExpress((_props$pos8 = props.pos) === null || _props$pos8 === void 0 || (_props$pos8 = _props$pos8.options) === null || _props$pos8 === void 0 || (_props$pos8 = _props$pos8.validation) === null || _props$pos8 === void 0 ? void 0 : _props$pos8.type); + } else if (props.pos?.options?.hint) { + setValidatePlaceholder(props.pos?.options.hint); + } else if (props.pos?.options?.validation?.type) { + checkRegularExpress(props.pos?.options?.validation?.type); } - setTextValue((_props$pos9 = props.pos) !== null && _props$pos9 !== void 0 && (_props$pos9 = _props$pos9.options) !== null && _props$pos9 !== void 0 && _props$pos9.response ? (_props$pos10 = props.pos) === null || _props$pos10 === void 0 || (_props$pos10 = _props$pos10.options) === null || _props$pos10 === void 0 ? void 0 : _props$pos10.response : (_props$pos11 = props.pos) !== null && _props$pos11 !== void 0 && (_props$pos11 = _props$pos11.options) !== null && _props$pos11 !== void 0 && _props$pos11.defaultValue ? (_props$pos12 = props.pos) === null || _props$pos12 === void 0 || (_props$pos12 = _props$pos12.options) === null || _props$pos12 === void 0 ? void 0 : _props$pos12.defaultValue : ""); - setSelectOption((_props$pos13 = props.pos) !== null && _props$pos13 !== void 0 && (_props$pos13 = _props$pos13.options) !== null && _props$pos13 !== void 0 && _props$pos13.response ? (_props$pos14 = props.pos) === null || _props$pos14 === void 0 || (_props$pos14 = _props$pos14.options) === null || _props$pos14 === void 0 ? void 0 : _props$pos14.response : (_props$pos15 = props.pos) !== null && _props$pos15 !== void 0 && (_props$pos15 = _props$pos15.options) !== null && _props$pos15 !== void 0 && _props$pos15.defaultValue ? (_props$pos16 = props.pos) === null || _props$pos16 === void 0 || (_props$pos16 = _props$pos16.options) === null || _props$pos16 === void 0 ? void 0 : _props$pos16.defaultValue : ""); + setTextValue(props.pos?.options?.response ? props.pos?.options?.response : props.pos?.options?.defaultValue ? props.pos?.options?.defaultValue : ""); + setSelectOption(props.pos?.options?.response ? props.pos?.options?.response : props.pos?.options?.defaultValue ? props.pos?.options?.defaultValue : ""); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { - var _props$pos17, _props$data; - if (["name", "email", "job title", "company"].includes((_props$pos17 = props.pos) === null || _props$pos17 === void 0 ? void 0 : _props$pos17.type) && props.isNeedSign && ((_props$data = props.data) === null || _props$data === void 0 ? void 0 : _props$data.signerObjId) === (props === null || props === void 0 ? void 0 : props.signerObjId)) { - var _props$pos18; - const defaultData = (_props$pos18 = props.pos) === null || _props$pos18 === void 0 || (_props$pos18 = _props$pos18.options) === null || _props$pos18 === void 0 ? void 0 : _props$pos18.defaultValue; + if (["name", "email", "job title", "company"].includes(props.pos?.type) && props.isNeedSign && props.data?.signerObjId === props?.signerObjId) { + const defaultData = props.pos?.options?.defaultValue; if (defaultData) { setTextValue(defaultData); } } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [(_props$pos19 = props.pos) === null || _props$pos19 === void 0 || (_props$pos19 = _props$pos19.options) === null || _props$pos19 === void 0 ? void 0 : _props$pos19.defaultValue]); + }, [props.pos?.options?.defaultValue]); const ExampleCustomInput = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)((_ref, ref) => { let { value, onClick } = _ref; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "".concat(selectWidgetCls, " text-[12px] overflow-hidden"), + style: { + fontSize: fontSize, + color: fontColor, + fontFamily: "Arial, sans-serif" + }, + className: `${selectWidgetCls} overflow-hidden`, onClick: onClick, ref: ref }, value, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { @@ -8181,10 +44795,9 @@ function PlaceholderType(props) { }); ExampleCustomInput.displayName = "ExampleCustomInput"; (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { - var _props$data2; - if (["name", "email", "job title", "company"].includes(type) && props.isNeedSign && ((_props$data2 = props.data) === null || _props$data2 === void 0 ? void 0 : _props$data2.signerObjId) === props.signerObjId) { + if (["name", "email", "job title", "company"].includes(type) && props.isNeedSign && props.data?.signerObjId === props.signerObjId) { const isDefault = true; - const senderUser = localStorage.getItem("Extand_Class"); + const senderUser = localStorage.getItem(`Extand_Class`); const jsonSender = JSON.parse(senderUser); (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(jsonSender && jsonSender[0], null, props.xyPostion, null, props.setXyPostion, props.data.Id, isDefault); } @@ -8192,10 +44805,9 @@ function PlaceholderType(props) { }, [type]); //function for show checked checkbox const selectCheckbox = ind => { - var _props$pos$options2, _props$pos$options3; - const res = (_props$pos$options2 = props.pos.options) === null || _props$pos$options2 === void 0 ? void 0 : _props$pos$options2.response; - const defaultCheck = (_props$pos$options3 = props.pos.options) === null || _props$pos$options3 === void 0 ? void 0 : _props$pos$options3.defaultValue; - if (res && (res === null || res === void 0 ? void 0 : res.length) > 0) { + const res = props.pos.options?.response; + const defaultCheck = props.pos.options?.defaultValue; + if (res && res?.length > 0) { const isSelectIndex = res.indexOf(ind); if (isSelectIndex > -1) { return true; @@ -8215,8 +44827,7 @@ function PlaceholderType(props) { } }; const handleRadioCheck = data => { - var _props$pos$options4; - const defaultData = (_props$pos$options4 = props.pos.options) === null || _props$pos$options4 === void 0 ? void 0 : _props$pos$options4.defaultValue; + const defaultData = props.pos.options?.defaultValue; if (textValue === data) { return true; } else if (defaultData === data) { @@ -8241,8 +44852,7 @@ function PlaceholderType(props) { setSelectedCheckbox(checkedList); } if (props.isNeedSign) { - var _props$pos$options5; - isDefaultValue = (_props$pos$options5 = props.pos.options) === null || _props$pos$options5 === void 0 ? void 0 : _props$pos$options5.defaultValue; + isDefaultValue = props.pos.options?.defaultValue; } if (isDefaultValue && isDefaultValue.length > 0) { isDefaultEmpty = true; @@ -8257,8 +44867,7 @@ function PlaceholderType(props) { isDefaultEmpty, isRadio = true; if (props.isNeedSign) { - var _props$pos$options6; - isDefaultValue = (_props$pos$options6 = props.pos.options) === null || _props$pos$options6 === void 0 ? void 0 : _props$pos$options6.defaultValue; + isDefaultValue = props.pos.options?.defaultValue; } if (isDefaultValue) { isDefaultEmpty = true; @@ -8284,9 +44893,8 @@ function PlaceholderType(props) { const handleEnterPress = e => { const height = 18; if (e.key === "Enter") { - var _props$data3; //function to save height of text area - (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeHeightOfTextArea)(height, props.pos.type, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && ((_props$data3 = props.data) === null || _props$data3 === void 0 ? void 0 : _props$data3.Id)); + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeHeightOfTextArea)(height, props.pos.type, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && props.data?.Id); } }; switch (type) { @@ -8298,7 +44906,7 @@ function PlaceholderType(props) { className: "w-full h-full " }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-[11px] w-full h-full text-black flex flex-col justify-center items-center" - }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data4 = props.data) === null || _props$data4 === void 0 ? void 0 : _props$data4.Id, props === null || props === void 0 || (_props$data5 = props.data) === null || _props$data5 === void 0 ? void 0 : _props$data5.Role, props === null || props === void 0 || (_props$pos20 = props.pos) === null || _props$pos20 === void 0 ? void 0 : _props$pos20.type))); + }, props?.handleUserName && props?.handleUserName(props?.data?.Id, props?.data?.Role, widgetTypeTraslation)); case "stamp": return props.pos.SignUrl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", { alt: "stamp", @@ -8307,31 +44915,33 @@ function PlaceholderType(props) { className: "w-full h-full" }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-[11px] w-full h-full text-black flex flex-col justify-center items-center" - }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data6 = props.data) === null || _props$data6 === void 0 ? void 0 : _props$data6.Id, props === null || props === void 0 || (_props$data7 = props.data) === null || _props$data7 === void 0 ? void 0 : _props$data7.Role, props === null || props === void 0 || (_props$pos21 = props.pos) === null || _props$pos21 === void 0 ? void 0 : _props$pos21.type))); + }, props?.handleUserName && props?.handleUserName(props?.data?.Id, props?.data?.Role, widgetTypeTraslation)); case "checkbox": return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { zIndex: props.isSignYourself && "99" } - }, (_props$pos$options7 = props.pos.options) === null || _props$pos$options7 === void 0 || (_props$pos$options7 = _props$pos$options7.values) === null || _props$pos$options7 === void 0 ? void 0 : _props$pos$options7.map((data, ind) => { - var _props$pos$options8, _props$data8, _props$pos$options10; + }, props.pos.options?.values?.map((data, ind) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: ind, className: "flex items-center text-center gap-0.5" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { - className: "".concat(ind === 0 ? "mt-0" : "mt-[5px]", " flex justify-center op-checkbox op-checkbox-xs rounded-[0.350rem]"), + style: { + width: fontSize, + height: fontSize + }, + className: `${ind === 0 ? "mt-0" : "mt-[5px]"} flex justify-center op-checkbox rounded-[1px] `, onBlur: handleInputBlur, - disabled: props.isNeedSign && (((_props$pos$options8 = props.pos.options) === null || _props$pos$options8 === void 0 ? void 0 : _props$pos$options8.isReadOnly) || ((_props$data8 = props.data) === null || _props$data8 === void 0 ? void 0 : _props$data8.signerObjId) !== props.signerObjId), + disabled: props.isNeedSign && (props.pos.options?.isReadOnly || props.data?.signerObjId !== props.signerObjId), type: "checkbox", checked: selectCheckbox(ind), onChange: e => { if (e.target.checked) { if (!props.isPlaceholder) { - var _props$pos$options9; - const maxRequired = (_props$pos$options9 = props.pos.options) === null || _props$pos$options9 === void 0 || (_props$pos$options9 = _props$pos$options9.validation) === null || _props$pos$options9 === void 0 ? void 0 : _props$pos$options9.maxRequiredCount; + const maxRequired = props.pos.options?.validation?.maxRequiredCount; const maxCountInt = maxRequired && parseInt(maxRequired); if (maxCountInt > 0) { - if (selectedCheckbox && (selectedCheckbox === null || selectedCheckbox === void 0 ? void 0 : selectedCheckbox.length) <= maxCountInt - 1) { + if (selectedCheckbox && selectedCheckbox?.length <= maxCountInt - 1) { handleCheckboxValue(e.target.checked, ind); } } else { @@ -8342,12 +44952,16 @@ function PlaceholderType(props) { handleCheckboxValue(e.target.checked, ind); } } - }), !((_props$pos$options10 = props.pos.options) !== null && _props$pos$options10 !== void 0 && _props$pos$options10.isHideLabel) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { + }), !props.pos.options?.isHideLabel && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { + style: { + fontSize: fontSize, + color: fontColor + }, className: "text-xs mb-0 text-center" }, data)); })); case _constant_Utils__WEBPACK_IMPORTED_MODULE_1__.textInputWidget: - return props.isSignYourself || props.isNeedSign && ((_props$data9 = props.data) === null || _props$data9 === void 0 ? void 0 : _props$data9.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { + return props.isSignYourself || props.isNeedSign && props.data?.signerObjId === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { ref: inputRef, placeholder: validatePlaceholder || "please enter value", rows: 1, @@ -8355,45 +44969,59 @@ function PlaceholderType(props) { value: textValue, onBlur: handleInputBlur, onChange: e => { - var _props$data10; setTextValue(e.target.value); - (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && ((_props$data10 = props.data) === null || _props$data10 === void 0 ? void 0 : _props$data10.Id), false); + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && props.data?.Id, false); }, className: textWidgetCls, style: { - fontSize: (_props$pos$options11 = props.pos.options) !== null && _props$pos$options11 !== void 0 && _props$pos$options11.fontSize ? ((_props$pos$options12 = props.pos.options) === null || _props$pos$options12 === void 0 ? void 0 : _props$pos$options12.fontSize) + "px" : "12px", - color: ((_props$pos$options13 = props.pos.options) === null || _props$pos$options13 === void 0 ? void 0 : _props$pos$options13.fontColor) || "black" + fontSize: fontSize, + color: fontColor }, cols: "50" }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { - fontSize: (_props$pos$options14 = props.pos.options) !== null && _props$pos$options14 !== void 0 && _props$pos$options14.fontSize ? ((_props$pos$options15 = props.pos.options) === null || _props$pos$options15 === void 0 ? void 0 : _props$pos$options15.fontSize) + "px" : "12px", - color: ((_props$pos$options16 = props.pos.options) === null || _props$pos$options16 === void 0 ? void 0 : _props$pos$options16.fontColor) || "black", + fontSize: fontSize, + color: fontColor, overflow: "hidden" } - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, type)); + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, widgetTypeTraslation)); case "dropdown": - return ((_props$data11 = props.data) === null || _props$data11 === void 0 ? void 0 : _props$data11.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", { - className: "".concat(selectWidgetCls, " text-[12px] bg-inherit"), + return props.data?.signerObjId === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", { + style: { + fontSize: fontSize, + color: fontColor + }, + className: `${selectWidgetCls} text-[12px] bg-inherit`, id: "myDropdown", value: selectOption, onChange: e => { - var _props$data12; setSelectOption(e.target.value); - (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && ((_props$data12 = props.data) === null || _props$data12 === void 0 ? void 0 : _props$data12.Id), false); + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && props.data?.Id, false); } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { + style: { + fontSize: fontSize, + color: fontColor + }, value: "", disabled: true, hidden: true - }, props === null || props === void 0 || (_props$pos22 = props.pos) === null || _props$pos22 === void 0 || (_props$pos22 = _props$pos22.options) === null || _props$pos22 === void 0 ? void 0 : _props$pos22.name), (_props$pos23 = props.pos) === null || _props$pos23 === void 0 || (_props$pos23 = _props$pos23.options) === null || _props$pos23 === void 0 || (_props$pos23 = _props$pos23.values) === null || _props$pos23 === void 0 ? void 0 : _props$pos23.map((data, ind) => { + }, props?.pos?.options?.name), props.pos?.options?.values?.map((data, ind) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { + style: { + fontSize: fontSize, + color: fontColor + }, key: ind, value: data }, data); })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "text-[12px] overflow-hidden" - }, (_props$pos24 = props.pos) !== null && _props$pos24 !== void 0 && (_props$pos24 = _props$pos24.options) !== null && _props$pos24 !== void 0 && _props$pos24.name ? props.pos.options.name : type); + style: { + fontSize: fontSize, + color: fontColor + }, + className: " overflow-hidden" + }, props.pos?.options?.name ? props.pos.options.name : widgetTypeTraslation); case "initials": return props.pos.SignUrl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", { alt: "initials", @@ -8402,88 +45030,85 @@ function PlaceholderType(props) { className: "w-full h-full" }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-[11px] w-full h-full text-black flex flex-col justify-center items-center" - }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data13 = props.data) === null || _props$data13 === void 0 ? void 0 : _props$data13.Id, props === null || props === void 0 || (_props$data14 = props.data) === null || _props$data14 === void 0 ? void 0 : _props$data14.Role, props === null || props === void 0 || (_props$pos25 = props.pos) === null || _props$pos25 === void 0 ? void 0 : _props$pos25.type))); + }, props?.handleUserName && props?.handleUserName(props?.data?.Id, props?.data?.Role, widgetTypeTraslation)); case "name": - return props.isSignYourself || props.isNeedSign && ((_props$data15 = props.data) === null || _props$data15 === void 0 ? void 0 : _props$data15.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { + return props.isSignYourself || props.isNeedSign && props.data?.signerObjId === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { ref: inputRef, placeholder: "name", rows: 1, onKeyDown: handleEnterPress, value: textValue, onChange: e => { - var _props$data16; const isDefault = false; handleTextValid(e); - (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && ((_props$data16 = props.data) === null || _props$data16 === void 0 ? void 0 : _props$data16.Id), isDefault); + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && props.data?.Id, isDefault); }, className: textWidgetCls, style: { - fontSize: (_props$pos$options17 = props.pos.options) !== null && _props$pos$options17 !== void 0 && _props$pos$options17.fontSize ? ((_props$pos$options18 = props.pos.options) === null || _props$pos$options18 === void 0 ? void 0 : _props$pos$options18.fontSize) + "px" : "12px", - color: ((_props$pos$options19 = props.pos.options) === null || _props$pos$options19 === void 0 ? void 0 : _props$pos$options19.fontColor) || "black" + fontSize: fontSize, + color: fontColor }, cols: "50" }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { - fontSize: (_props$pos$options20 = props.pos.options) !== null && _props$pos$options20 !== void 0 && _props$pos$options20.fontSize ? ((_props$pos$options21 = props.pos.options) === null || _props$pos$options21 === void 0 ? void 0 : _props$pos$options21.fontSize) + "px" : "12px", - color: ((_props$pos$options22 = props.pos.options) === null || _props$pos$options22 === void 0 ? void 0 : _props$pos$options22.fontColor) || "black", + fontSize: fontSize, + color: fontColor, fontFamily: "Arial, sans-serif", overflow: "hidden" } - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, type)); + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, widgetTypeTraslation)); case "company": - return props.isSignYourself || props.isNeedSign && ((_props$data17 = props.data) === null || _props$data17 === void 0 ? void 0 : _props$data17.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { + return props.isSignYourself || props.isNeedSign && props.data?.signerObjId === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { ref: inputRef, placeholder: "Enter text", rows: 1, onKeyDown: handleEnterPress, value: textValue, onChange: e => { - var _props$data18; handleTextValid(e); - (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && ((_props$data18 = props.data) === null || _props$data18 === void 0 ? void 0 : _props$data18.Id), false); + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && props.data?.Id, false); }, className: textWidgetCls, style: { - fontSize: (_props$pos$options23 = props.pos.options) !== null && _props$pos$options23 !== void 0 && _props$pos$options23.fontSize ? ((_props$pos$options24 = props.pos.options) === null || _props$pos$options24 === void 0 ? void 0 : _props$pos$options24.fontSize) + "px" : "12px", - color: ((_props$pos$options25 = props.pos.options) === null || _props$pos$options25 === void 0 ? void 0 : _props$pos$options25.fontColor) || "black" + fontSize: fontSize, + color: fontColor }, cols: "50" }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { - fontSize: (_props$pos$options26 = props.pos.options) !== null && _props$pos$options26 !== void 0 && _props$pos$options26.fontSize ? ((_props$pos$options27 = props.pos.options) === null || _props$pos$options27 === void 0 ? void 0 : _props$pos$options27.fontSize) + "px" : "12px", - color: ((_props$pos$options28 = props.pos.options) === null || _props$pos$options28 === void 0 ? void 0 : _props$pos$options28.fontColor) || "black", + fontSize: fontSize, + color: fontColor, overflow: "hidden", fontFamily: "Arial, sans-serif" } - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, type)); + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, widgetTypeTraslation)); case "job title": - return props.isSignYourself || props.isNeedSign && ((_props$data19 = props.data) === null || _props$data19 === void 0 ? void 0 : _props$data19.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { + return props.isSignYourself || props.isNeedSign && props.data?.signerObjId === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { ref: inputRef, placeholder: "job title", rows: 1, onKeyDown: handleEnterPress, value: textValue, onChange: e => { - var _props$data20; handleTextValid(e); - (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && ((_props$data20 = props.data) === null || _props$data20 === void 0 ? void 0 : _props$data20.Id), false); + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && props.data?.Id, false); }, className: textWidgetCls, style: { - fontSize: (_props$pos$options29 = props.pos.options) !== null && _props$pos$options29 !== void 0 && _props$pos$options29.fontSize ? ((_props$pos$options30 = props.pos.options) === null || _props$pos$options30 === void 0 ? void 0 : _props$pos$options30.fontSize) + "px" : "12px", - color: ((_props$pos$options31 = props.pos.options) === null || _props$pos$options31 === void 0 ? void 0 : _props$pos$options31.fontColor) || "black" + fontSize: fontSize, + color: fontColor }, cols: "50" }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { - fontSize: (_props$pos$options32 = props.pos.options) !== null && _props$pos$options32 !== void 0 && _props$pos$options32.fontSize ? ((_props$pos$options33 = props.pos.options) === null || _props$pos$options33 === void 0 ? void 0 : _props$pos$options33.fontSize) + "px" : "12px", - color: ((_props$pos$options34 = props.pos.options) === null || _props$pos$options34 === void 0 ? void 0 : _props$pos$options34.fontColor) || "black", + fontSize: fontSize, + color: fontColor, fontFamily: "Arial, sans-serif", overflow: "hidden" } - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, type)); + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, widgetTypeTraslation)); case "date": - return props.isSignYourself || props.isNeedSign && ((_props$data21 = props.data) === null || _props$data21 === void 0 ? void 0 : _props$data21.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react_datepicker__WEBPACK_IMPORTED_MODULE_6___default()), { + return props.isSignYourself || props.isNeedSign && props.data?.signerObjId === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react_datepicker__WEBPACK_IMPORTED_MODULE_7___default()), { renderCustomHeader: _ref2 => { let { date, @@ -8522,18 +45147,23 @@ function PlaceholderType(props) { value: option }, option)))); }, - disabled: props.isPlaceholder || props.isNeedSign && ((_props$data22 = props.data) === null || _props$data22 === void 0 ? void 0 : _props$data22.signerObjId) !== props.signerObjId, + disabled: props.isPlaceholder || props.isNeedSign && props.data?.signerObjId !== props.signerObjId, onBlur: handleInputBlur, closeOnScroll: true, - className: "".concat(selectWidgetCls, " outline-[#007bff]"), - selected: props !== null && props !== void 0 && props.startDate ? props === null || props === void 0 ? void 0 : props.startDate : ((_props$pos$options35 = props.pos.options) === null || _props$pos$options35 === void 0 ? void 0 : _props$pos$options35.response) && new Date(props.pos.options.response), + className: `${selectWidgetCls} outline-[#007bff]`, + selected: props?.startDate ? props?.startDate : props.pos.options?.response && new Date(props.pos.options.response), onChange: date => handleOnDateChange(date), popperPlacement: "top-end", customInput: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ExampleCustomInput, null), - dateFormat: props.selectDate ? (_props$selectDate = props.selectDate) === null || _props$selectDate === void 0 ? void 0 : _props$selectDate.format : (_props$pos26 = props.pos) !== null && _props$pos26 !== void 0 && (_props$pos26 = _props$pos26.options) !== null && _props$pos26 !== void 0 && (_props$pos26 = _props$pos26.validation) !== null && _props$pos26 !== void 0 && _props$pos26.format ? (_props$pos27 = props.pos) === null || _props$pos27 === void 0 || (_props$pos27 = _props$pos27.options) === null || _props$pos27 === void 0 || (_props$pos27 = _props$pos27.validation) === null || _props$pos27 === void 0 ? void 0 : _props$pos27.format : "MM/dd/yyyy" + dateFormat: props.selectDate ? props.selectDate?.format : props.pos?.options?.validation?.format ? props.pos?.options?.validation?.format : "MM/dd/yyyy" })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "text-[12px] text-black items-center overflow-hidden" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, props.selectDate ? (_props$selectDate2 = props.selectDate) === null || _props$selectDate2 === void 0 ? void 0 : _props$selectDate2.format : (_props$pos28 = props.pos) !== null && _props$pos28 !== void 0 && (_props$pos28 = _props$pos28.options) !== null && _props$pos28 !== void 0 && (_props$pos28 = _props$pos28.validation) !== null && _props$pos28 !== void 0 && _props$pos28.format ? (_props$pos29 = props.pos) === null || _props$pos29 === void 0 || (_props$pos29 = _props$pos29.options) === null || _props$pos29 === void 0 || (_props$pos29 = _props$pos29.validation) === null || _props$pos29 === void 0 ? void 0 : _props$pos29.format : "MM/dd/yyyy")); + style: { + fontSize: fontSize, + color: fontColor, + fontFamily: "Arial, sans-serif" + }, + className: "items-center overflow-hidden" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, props.selectDate ? props.selectDate?.format : props.pos?.options?.validation?.format ? props.pos?.options?.validation?.format : "MM/dd/yyyy")); case "image": return props.pos.SignUrl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", { alt: "image", @@ -8542,9 +45172,9 @@ function PlaceholderType(props) { className: "w-full h-full" }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-[11px] w-full h-full text-black flex flex-col justify-center items-center" - }, (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data23 = props.data) === null || _props$data23 === void 0 ? void 0 : _props$data23.Id, props === null || props === void 0 || (_props$data24 = props.data) === null || _props$data24 === void 0 ? void 0 : _props$data24.Role, props === null || props === void 0 || (_props$pos30 = props.pos) === null || _props$pos30 === void 0 ? void 0 : _props$pos30.type))); + }, props?.handleUserName && props?.handleUserName(props?.data?.Id, props?.data?.Role, widgetTypeTraslation)); case "email": - return props.isSignYourself || props.isNeedSign && ((_props$data25 = props.data) === null || _props$data25 === void 0 ? void 0 : _props$data25.signerObjId) === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { + return props.isSignYourself || props.isNeedSign && props.data?.signerObjId === props.signerObjId ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { ref: inputRef, placeholder: "enter email", rows: 1, @@ -8552,42 +45182,49 @@ function PlaceholderType(props) { value: textValue, onBlur: handleInputBlur, onChange: e => { - var _props$data26; handleTextValid(e); - (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && ((_props$data26 = props.data) === null || _props$data26 === void 0 ? void 0 : _props$data26.Id), false); + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && props.data?.Id, false); }, className: textWidgetCls, style: { - fontSize: (_props$pos$options36 = props.pos.options) !== null && _props$pos$options36 !== void 0 && _props$pos$options36.fontSize ? ((_props$pos$options37 = props.pos.options) === null || _props$pos$options37 === void 0 ? void 0 : _props$pos$options37.fontSize) + "px" : "12px", - color: ((_props$pos$options38 = props.pos.options) === null || _props$pos$options38 === void 0 ? void 0 : _props$pos$options38.fontColor) || "black", + fontSize: fontSize, + color: fontColor, fontFamily: "Arial, sans-serif" }, cols: "50" }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { - fontSize: (_props$pos$options39 = props.pos.options) !== null && _props$pos$options39 !== void 0 && _props$pos$options39.fontSize ? ((_props$pos$options40 = props.pos.options) === null || _props$pos$options40 === void 0 ? void 0 : _props$pos$options40.fontSize) + "px" : "12px", - color: ((_props$pos$options41 = props.pos.options) === null || _props$pos$options41 === void 0 ? void 0 : _props$pos$options41.fontColor) || "black", + fontSize: fontSize, + color: fontColor, fontFamily: "Arial, sans-serif", overflow: "hidden" } - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, type)); + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, widgetTypeTraslation)); case _constant_Utils__WEBPACK_IMPORTED_MODULE_1__.radioButtonWidget: - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, (_props$pos$options42 = props.pos.options) === null || _props$pos$options42 === void 0 ? void 0 : _props$pos$options42.values.map((data, ind) => { - var _props$pos$options43, _props$data27, _props$pos$options44; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, props.pos.options?.values.map((data, ind) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: ind, className: "flex items-center text-center gap-0.5" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { - className: "".concat(ind === 0 ? "mt-0" : "mt-[5px]", " ", "w-[15px] h-[15px]", " flex justify-center op-radio"), + style: { + width: fontSize, + height: fontSize, + marginTop: ind > 0 ? "10px" : "0px" + }, + className: `flex justify-center op-radio`, type: "radio", - disabled: props.isNeedSign && (((_props$pos$options43 = props.pos.options) === null || _props$pos$options43 === void 0 ? void 0 : _props$pos$options43.isReadOnly) || ((_props$data27 = props.data) === null || _props$data27 === void 0 ? void 0 : _props$data27.signerObjId) !== props.signerObjId), + disabled: props.isNeedSign && (props.pos.options?.isReadOnly || props.data?.signerObjId !== props.signerObjId), checked: handleRadioCheck(data), onChange: e => { if (!props.isPlaceholder) { handleCheckRadio(e.target.checked, data); } } - }), !((_props$pos$options44 = props.pos.options) !== null && _props$pos$options44 !== void 0 && _props$pos$options44.isHideLabel) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { + }), !props.pos.options?.isHideLabel && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { + style: { + fontSize: fontSize, + color: fontColor + }, className: "text-xs mb-0" }, data)); })); @@ -8599,15 +45236,14 @@ function PlaceholderType(props) { value: textValue, onBlur: handleInputBlur, onChange: e => { - var _props$data28; setTextValue(e.target.value); - (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && ((_props$data28 = props.data) === null || _props$data28 === void 0 ? void 0 : _props$data28.Id), false); + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.onChangeInput)(e.target.value, props.pos.key, props.xyPostion, props.index, props.setXyPostion, props.data && props.data?.Id, false); }, className: textWidgetCls, style: { fontFamily: "Arial, sans-serif", - fontSize: (_props$pos$options45 = props.pos.options) !== null && _props$pos$options45 !== void 0 && _props$pos$options45.fontSize ? ((_props$pos$options46 = props.pos.options) === null || _props$pos$options46 === void 0 ? void 0 : _props$pos$options46.fontSize) + "px" : "12px", - color: ((_props$pos$options47 = props.pos.options) === null || _props$pos$options47 === void 0 ? void 0 : _props$pos$options47.fontColor) || "black" + fontSize: fontSize, + color: fontColor }, cols: "50" }); @@ -8621,7 +45257,7 @@ function PlaceholderType(props) { className: "w-full h-full" })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-[11px] w-full h-full text-black flex flex-col justify-center items-center" - }, props.pos.isStamp ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "stamp") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "signature"), (props === null || props === void 0 ? void 0 : props.handleUserName) && (props === null || props === void 0 ? void 0 : props.handleUserName(props === null || props === void 0 || (_props$data29 = props.data) === null || _props$data29 === void 0 ? void 0 : _props$data29.Id, props === null || props === void 0 || (_props$data30 = props.data) === null || _props$data30 === void 0 ? void 0 : _props$data30.Role))); + }, props.pos.isStamp ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "stamp") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "signature"), props?.handleUserName && props?.handleUserName(props?.data?.Id, props?.data?.Role)); } } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PlaceholderType); @@ -8641,6 +45277,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); + function PrevNext(_ref) { let { @@ -8648,6 +45286,9 @@ function PrevNext(_ref) { allPages, changePage } = _ref; + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(); //for go to previous page function previousPage() { changePage(-1); @@ -8663,26 +45304,22 @@ function PrevNext(_ref) { disabled: pageNumber <= 1, onClick: previousPage }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - className: "block lg:hidden" + className: "block" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-backward", "aria-hidden": "true" - })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - className: "lg:block hidden 2xl:text-[30px]" - }, "Prev")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "text-xs text-base-content font-medium mx-2 2xl:text-[30px]" - }, pageNumber || (allPages ? 1 : "--"), " of ", allPages || "--"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, pageNumber || (allPages ? 1 : "--"), " ", t("of"), " ", allPages || "--"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "op-btn op-btn-neutral op-btn-xs md:op-btn-sm font-semibold text-xs", disabled: pageNumber >= allPages, onClick: nextPage }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - className: "block lg:hidden" + className: "block" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-forward", "aria-hidden": "true" - })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - className: "lg:block hidden 2xl:text-[30px]" - }, "Next"))); + })))); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PrevNext); @@ -8701,9 +45338,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Document.js"); -/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Page.js"); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs"); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); +/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Document.js"); +/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Page.js"); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs"); + @@ -8717,8 +45356,12 @@ function RenderAllPdfPage(_ref) { pageNumber, signerPos, signerObjectId, - containerWH + containerWH, + pdfRotateBase64 } = _ref; + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(); const [signPageNumber, setSignPageNumber] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]); const [bookmarkColor, setBookmarkColor] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); //set all number of pages after load pdf @@ -8729,21 +45372,19 @@ function RenderAllPdfPage(_ref) { setAllPages(numPages); //check if signerPos array exist then save page number exist in signerPos array to show bookmark icon if (signerPos) { - var _checkUser$; const checkUser = signerPos.filter(data => data.signerObjId === signerObjectId); - setBookmarkColor((_checkUser$ = checkUser[0]) === null || _checkUser$ === void 0 ? void 0 : _checkUser$.blockColor); + setBookmarkColor(checkUser[0]?.blockColor); let pageNumberArr = []; - if ((checkUser === null || checkUser === void 0 ? void 0 : checkUser.length) > 0) { - var _checkUser$2; - (_checkUser$2 = checkUser[0]) === null || _checkUser$2 === void 0 || (_checkUser$2 = _checkUser$2.placeHolder) === null || _checkUser$2 === void 0 || _checkUser$2.map(data => { - pageNumberArr.push(data === null || data === void 0 ? void 0 : data.pageNumber); + if (checkUser?.length > 0) { + checkUser[0]?.placeHolder?.map(data => { + pageNumberArr.push(data?.pageNumber); }); setSignPageNumber(pageNumberArr); } } } const pageContainer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(); - const isHeader = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(state => state.showHeader); + const isHeader = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(state => state.showHeader); const [pageWidth, setPageWidth] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { const updateSize = () => { @@ -8769,36 +45410,36 @@ function RenderAllPdfPage(_ref) { className: "fa-solid fa-bookmark" })); }; + const pdfDataBase64 = `data:application/pdf;base64,${pdfRotateBase64}`; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: pageContainer, className: "hidden w-[20%] bg-base-100 md:block" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300" - }, "Pages"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "flex h-[90%] flex-col items-center m-2 \n autoSignScroll hide-scrollbar max-h-[100vh] " - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_2__["default"], { - loading: "Loading Document..", + }, t("pages")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: `flex h-[90%] flex-col items-center m-2 + autoSignScroll hide-scrollbar max-h-[100vh] ` + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_3__["default"], { + loading: t("loading-doc"), onLoadSuccess: onDocumentLoad, - file: signPdfUrl + file: pdfRotateBase64 && pdfDataBase64 || signPdfUrl }, Array.from(new Array(allPages), (el, index) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: index, - className: "".concat(pageNumber - 1 === index ? "border-[red]" : "border-[#878787]", " border-2 m-[10px] flex justify-center items-center relative"), + className: `${pageNumber - 1 === index ? "border-[red]" : "border-[#878787]"} border-2 m-[10px] flex justify-center items-center relative`, onClick: () => { setPageNumber(index + 1); if (setSignBtnPosition) { setSignBtnPosition([]); } } - }, signerPos && addSignatureBookmark(index), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "relative z-[1] overflow-hidden" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_3__["default"], { - key: "page_".concat(index + 1), + }, signerPos && addSignatureBookmark(index), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_4__["default"], { + key: `page_${index + 1}`, pageNumber: index + 1, width: pageWidth - 60, scale: 1, renderAnnotationLayer: false, renderTextLayer: false - }))))))); + })))))); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RenderAllPdfPage); @@ -8818,11 +45459,13 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react_scrollbars_custom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-scrollbars-custom */ "./node_modules/react-scrollbars-custom/dist/rsc.esm.js"); -/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Document.js"); -/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Page.js"); +/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Document.js"); +/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-pdf */ "./node_modules/react-pdf/dist/esm/Page.js"); /* harmony import */ var _constant_Utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constant/Utils */ "./src/constant/Utils.js"); /* harmony import */ var _Placeholder__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Placeholder */ "./src/components/pdf/Placeholder.js"); /* harmony import */ var _primitives_Alert__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../primitives/Alert */ "./src/primitives/Alert.js"); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); + @@ -8844,7 +45487,6 @@ function RenderPdf(_ref) { setSignKey, pdfDetails, xyPostion, - pdfUrl, pageDetails, pdfRequest, signerObjectId, @@ -8881,9 +45523,18 @@ function RenderPdf(_ref) { scale, setIsSelectId, ispublicTemplate, - handleUserDetails + handleUserDetails, + pdfRotateBase64, + fontSize, + setFontSize, + fontColor, + setFontColor } = _ref; + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_5__.useTranslation)(); const isMobile = window.innerWidth < 767; + //check isGuestSigner is present in local if yes than handle login flow header in mobile view const isGuestSigner = localStorage.getItem("isGuestSigner"); @@ -8944,16 +45595,15 @@ function RenderPdf(_ref) { const checkSignedSigners = data => { let checkSign = []; //condition to handle quick send flow and using normal request sign flow - checkSign = signedSigners ? signedSigners === null || signedSigners === void 0 ? void 0 : signedSigners.filter(sign => (sign === null || sign === void 0 ? void 0 : sign.Id) === (data === null || data === void 0 ? void 0 : data.Id) || (sign === null || sign === void 0 ? void 0 : sign.objectId) === (data === null || data === void 0 ? void 0 : data.signerObjId)) : []; + checkSign = signedSigners ? signedSigners?.filter(sign => sign?.Id === data?.Id || sign?.objectId === data?.signerObjId) : []; const handleAllUserName = (Id, Role, type) => { - var _pdfDetails$0$Signers; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-black text-[8px] font-bold" - }, (_pdfDetails$0$Signers = pdfDetails[0].Signers) === null || _pdfDetails$0$Signers === void 0 || (_pdfDetails$0$Signers = _pdfDetails$0$Signers.find(signer => signer.objectId === data.signerObjId)) === null || _pdfDetails$0$Signers === void 0 ? void 0 : _pdfDetails$0$Signers.Name), type && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, pdfDetails[0].Signers?.find(signer => signer.objectId === data.signerObjId)?.Name), type && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-[11px] font-bold" }, type), Role && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-black text-[8px] font-medium" - }, "(".concat(Role, ")"))); + }, `(${Role})`)); }; return checkSign.length === 0 && data.placeHolder.map((placeData, key) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { @@ -9004,14 +45654,14 @@ function RenderPdf(_ref) { const handleUserName = (Id, Role, type) => { if (Id) { const checkSign = signersdata.find(sign => sign.Id === Id); - if (checkSign !== null && checkSign !== void 0 && checkSign.Name) { + if (checkSign?.Name) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-black text-[8px] font-medium" - }, checkSign === null || checkSign === void 0 ? void 0 : checkSign.Name), type && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, checkSign?.Name), type && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-[11px] font-bold" }, type), Role && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-black text-[8px] font-medium" - }, "(".concat(Role, ")"))); + }, `(${Role})`)); } else { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, type && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-[11px] font-bold" @@ -9027,14 +45677,28 @@ function RenderPdf(_ref) { }, Role)); } }; + const pdfDataBase64 = `data:application/pdf;base64,${pdfRotateBase64}`; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, successEmail && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_Alert__WEBPACK_IMPORTED_MODULE_4__["default"], { type: "success" - }, "Email sent successfully!"), isMobile ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("success-email-alert")), isMobile ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_scrollbars_custom__WEBPACK_IMPORTED_MODULE_1__["default"], { + style: { + position: "relative", + boxShadow: "rgba(17, 12, 46, 0.15) 0px 48px 100px 0px", + height: window.innerHeight - 200, + zIndex: 0 + }, + className: "h-full", + noScrollY: false, + noScrollX: scale === 1 ? true : false + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { "data-tut": "reactourForth", - className: "".concat(isGuestSigner ? "30px" : "", " border-[0.1px] border-[#ebe8e8]"), + className: `${isGuestSigner ? "30px" : ""} border-[0.1px] border-[#ebe8e8] overflow-x-auto`, + style: { + width: containerWH?.width && containerWH?.width * scale + }, ref: drop, id: "container" - }, (containerWH === null || containerWH === void 0 ? void 0 : containerWH.width) && pdfOriginalWH.length > 0 && (pdfRequest ? signerPos.map((data, key) => { + }, containerWH?.width && pdfOriginalWH.length > 0 && (pdfRequest ? signerPos.map((data, key) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { key: key }, checkSignedSigners(data)); @@ -9088,7 +45752,11 @@ function RenderPdf(_ref) { containerWH: containerWH, pdfOriginalWH: pdfOriginalWH, pageNumber: pageNumber, - setIsSelectId: setIsSelectId + setIsSelectId: setIsSelectId, + fontSize: fontSize, + setFontSize: setFontSize, + fontColor: fontColor, + setFontColor: setFontColor })); })); })); @@ -9127,16 +45795,16 @@ function RenderPdf(_ref) { handleTextSettingModal: handleTextSettingModal, scale: scale, pdfOriginalWH: pdfOriginalWH, - pageNumber: pageNumber + pageNumber: pageNumber, + fontSize: fontSize, + setFontSize: setFontSize, + fontColor: fontColor, + setFontColor: setFontColor }); })); - })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "flex items-center justify-center" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_5__["default"], { - onLoadError: () => { - setPdfLoad(false); - }, - loading: "Loading Document..", + })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_6__["default"], { + onLoadError: () => setPdfLoad(false), + loading: t("loading-doc"), onLoadSuccess: pageDetails // ref={pdfRef}' , @@ -9145,8 +45813,9 @@ function RenderPdf(_ref) { setSelectWidgetId(""); } }, - file: pdfUrl ? pdfUrl : pdfDetails[0] && pdfDetails[0].SignedUrl ? pdfDetails[0].SignedUrl : pdfDetails[0].URL - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_6__["default"], { + file: pdfRotateBase64 && pdfDataBase64 || pdfDetails[0]?.SignedUrl || pdfDetails[0].URL + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_7__["default"], { + scale: scale || 1, key: index, pageNumber: pageNumber, width: containerWH.width, @@ -9166,12 +45835,12 @@ function RenderPdf(_ref) { noScrollX: scale === 1 ? true : false }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { - width: (containerWH === null || containerWH === void 0 ? void 0 : containerWH.width) && (containerWH === null || containerWH === void 0 ? void 0 : containerWH.width) * scale + width: containerWH?.width && containerWH?.width * scale }, ref: drop, id: "container" - }, pdfLoad && (containerWH === null || containerWH === void 0 ? void 0 : containerWH.width) && pdfOriginalWH.length > 0 && (pdfRequest //pdf request sign flow - ? signerPos === null || signerPos === void 0 ? void 0 : signerPos.map((data, key) => { + }, pdfLoad && containerWH?.width && pdfOriginalWH.length > 0 && (pdfRequest //pdf request sign flow + ? signerPos?.map((data, key) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { key: key }, checkSignedSigners(data)); @@ -9225,11 +45894,15 @@ function RenderPdf(_ref) { containerWH: containerWH, pdfOriginalWH: pdfOriginalWH, pageNumber: pageNumber, - setIsSelectId: setIsSelectId + setIsSelectId: setIsSelectId, + fontSize: fontSize, + setFontSize: setFontSize, + fontColor: fontColor, + setFontColor: setFontColor })); })); })); - }) : xyPostion.map((data, ind) => { + }) : xyPostion?.map((data, ind) => { // signyourself flow return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { key: ind @@ -9267,14 +45940,16 @@ function RenderPdf(_ref) { scale: scale, containerWH: containerWH, pdfOriginalWH: pdfOriginalWH, - pageNumber: pageNumber + pageNumber: pageNumber, + fontSize: fontSize, + setFontSize: setFontSize, + fontColor: fontColor, + setFontColor: setFontColor })); })); - })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_5__["default"], { - onLoadError: () => { - setPdfLoad(false); - }, - loading: "Loading Document..", + })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_6__["default"], { + onLoadError: () => setPdfLoad(false), + loading: t("loading-doc"), onLoadSuccess: pageDetails, onClick: () => { if (setSelectWidgetId) { @@ -9283,8 +45958,8 @@ function RenderPdf(_ref) { } // ref={pdfRef} , - file: pdfUrl ? pdfUrl : pdfDetails[0] && pdfDetails[0].SignedUrl ? pdfDetails[0].SignedUrl : pdfDetails[0].URL - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_6__["default"], { + file: pdfRotateBase64 && pdfDataBase64 || pdfDetails[0]?.SignedUrl || pdfDetails[0].URL + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_pdf__WEBPACK_IMPORTED_MODULE_7__["default"], { key: index, width: containerWH.width, scale: scale || 1, @@ -9315,8 +45990,10 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var react_signature_canvas__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-signature-canvas */ "./node_modules/react-signature-canvas/build/index.js"); -/* harmony import */ var react_signature_canvas__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_signature_canvas__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); +/* harmony import */ var react_signature_canvas__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-signature-canvas */ "./node_modules/react-signature-canvas/build/index.js"); +/* harmony import */ var react_signature_canvas__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_signature_canvas__WEBPACK_IMPORTED_MODULE_2__); + function SignPad(_ref) { @@ -9342,6 +46019,9 @@ function SignPad(_ref) { currWidgetsDetails, setCurrWidgetsDetails } = _ref; + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(); const [penColor, setPenColor] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("blue"); const allColor = ["blue", "red", "black"]; const canvasRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); @@ -9364,7 +46044,7 @@ function SignPad(_ref) { // Add more font options as needed ]; const [fontSelect, setFontSelect] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(fontOptions[0].value); - const senderUser = localStorage.getItem("Parse/".concat(localStorage.getItem("parseAppId"), "/currentUser")) && localStorage.getItem("Parse/".concat(localStorage.getItem("parseAppId"), "/currentUser")); + const senderUser = localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`) && localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`); const jsonSender = JSON.parse(senderUser); const currentUserName = jsonSender && jsonSender.name; @@ -9394,7 +46074,7 @@ function SignPad(_ref) { type: "button", className: "op-btn op-btn-ghost mr-1 mt-[2px]", onClick: () => handleClear() - }, "Clear"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("clear")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => { setCurrWidgetsDetails({}); if (!image) { @@ -9430,16 +46110,16 @@ function SignPad(_ref) { setIsStamp(false); }, type: "button", - className: "".concat(isSignImg || image || isDefaultSign || textWidth ? "" : "pointer-events-none", " op-btn op-btn-primary shadow-lg"), + className: `${isSignImg || image || isDefaultSign || textWidth ? "" : "pointer-events-none"} op-btn op-btn-primary shadow-lg`, disabled: isTab === "draw" && isSignImg || isTab === "image" && image || isTab === "mysignature" && isDefaultSign || isTab === "type" && textWidth ? false : image ? false : true - }, "Save")); + }, t("save"))); }; //useEffect for set already draw or save signature url/text url of signature text type and draw type for initial type and signature type widgets (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { if (currWidgetsDetails && canvasRef.current) { - const isWidgetType = currWidgetsDetails === null || currWidgetsDetails === void 0 ? void 0 : currWidgetsDetails.type; - const signatureType = currWidgetsDetails === null || currWidgetsDetails === void 0 ? void 0 : currWidgetsDetails.signatureType; - const url = currWidgetsDetails === null || currWidgetsDetails === void 0 ? void 0 : currWidgetsDetails.SignUrl; + const isWidgetType = currWidgetsDetails?.type; + const signatureType = currWidgetsDetails?.signatureType; + const url = currWidgetsDetails?.SignUrl; //checking widget type and draw type signature url if (isInitial) { if (isWidgetType === "initials" && signatureType === "draw" && url) { @@ -9450,7 +46130,7 @@ function SignPad(_ref) { } } const trimmedName = currentUserName && currentUserName.trim(); - const firstCharacter = trimmedName === null || trimmedName === void 0 ? void 0 : trimmedName.charAt(0); + const firstCharacter = trimmedName?.charAt(0); const userName = isInitial ? firstCharacter : currentUserName; setSignValue(userName); setFontSelect("Fasthand"); @@ -9460,9 +46140,9 @@ function SignPad(_ref) { (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { const loadFont = async () => { try { - await document.fonts.load("20px ".concat(fontSelect)); + await document.fonts.load(`20px ${fontSelect}`); const selectFontSTyle = fontOptions.find(font => font.value === fontSelect); - setFontSelect((selectFontSTyle === null || selectFontSTyle === void 0 ? void 0 : selectFontSTyle.value) || fontOptions[0].value); + setFontSelect(selectFontSTyle?.value || fontOptions[0].value); } catch (error) { console.error("Error loading font:", error); } @@ -9493,7 +46173,7 @@ function SignPad(_ref) { //creating span for getting text content width const span = document.createElement("span"); span.textContent = textContent; - span.style.font = "".concat(fontSizeValue, " ").concat(fontfamily); // here put your text size and font family + span.style.font = `${fontSizeValue} ${fontfamily}`; // here put your text size and font family span.style.color = color ? color : penColor; span.style.display = "hidden"; document.body.appendChild(span); // Replace 'container' with the ID of the container element @@ -9538,7 +46218,7 @@ function SignPad(_ref) { borderBottom: key === 0 && penColor === "blue" ? "2px solid blue" : key === 1 && penColor === "red" ? "2px solid red" : key === 2 && penColor === "black" ? "2px solid black" : "2px solid white" }, onClick: () => { - (props === null || props === void 0 ? void 0 : props.convertToImg) && (props === null || props === void 0 ? void 0 : props.convertToImg(fontSelect, signValue, data)); + props?.convertToImg && props?.convertToImg(fontSelect, signValue, data); if (key === 0) { setPenColor("blue"); } else if (key === 1) { @@ -9568,7 +46248,7 @@ function SignPad(_ref) { className: "flex flex-row justify-between gap-[5px] md:gap-[8px] text-[11px] md:text-base" }, isStamp ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "text-base-content font-bold text-lg" - }, widgetType === "image" || (currWidgetsDetails === null || currWidgetsDetails === void 0 ? void 0 : currWidgetsDetails.type) === "image" ? "Upload image" : "Upload stamp image") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + }, widgetType === "image" || currWidgetsDetails?.type === "image" ? t("upload-image") : t("upload-stamp-image")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { onClick: () => { setIsDefaultSign(false); setIsImageSelect(false); @@ -9578,16 +46258,16 @@ function SignPad(_ref) { setSignature(isSignImg); } }, - className: "".concat(isTab === "draw" ? "op-link-primary" : "no-underline", " op-link underline-offset-8 ml-[2px]") - }, "Draw")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: `${isTab === "draw" ? "op-link-primary" : "no-underline"} op-link underline-offset-8 ml-[2px]` + }, t("draw"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { onClick: () => { setIsDefaultSign(false); setIsImageSelect(true); setIsTab("uploadImage"); setSignatureType(""); }, - className: "".concat(isTab === "uploadImage" ? "op-link-primary" : "no-underline", " op-link underline-offset-8 ml-[2px]") - }, "Upload Image")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: `${isTab === "uploadImage" ? "op-link-primary" : "no-underline"} op-link underline-offset-8 ml-[2px]` + }, t("upload-image"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { onClick: () => { setIsDefaultSign(false); setIsImageSelect(false); @@ -9595,8 +46275,8 @@ function SignPad(_ref) { setSignatureType(""); setImage(); }, - className: "".concat(isTab === "type" ? "op-link-primary" : "no-underline", " op-link underline-offset-8 ml-[2px]") - }, "Type")), !isInitial && defaultSign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: `${isTab === "type" ? "op-link-primary" : "no-underline"} op-link underline-offset-8 ml-[2px]` + }, t("type"))), !isInitial && defaultSign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { onClick: () => { setIsDefaultSign(true); setIsImageSelect(true); @@ -9604,8 +46284,8 @@ function SignPad(_ref) { setSignatureType(""); setImage(); }, - className: "".concat(isTab === "mysignature" ? "op-link-primary" : "no-underline", " op-link underline-offset-8 ml-[2px]") - }, "My Signature")) : isInitial && myInitial && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + className: `${isTab === "mysignature" ? "op-link-primary" : "no-underline"} op-link underline-offset-8 ml-[2px]` + }, t("my-signature"))) : isInitial && myInitial && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { onClick: () => { setIsDefaultSign(true); setIsImageSelect(true); @@ -9613,8 +46293,8 @@ function SignPad(_ref) { setSignatureType(""); setImage(); }, - className: "".concat(isTab === "mysignature" ? "op-link-primary" : "no-underline", " op-link underline-offset-8 ml-[2px]") - }, "My Initials")))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: `${isTab === "mysignature" ? "op-link-primary" : "no-underline"} op-link underline-offset-8 ml-[2px]` + }, t("my-initials"))))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-[1.5rem] cursor-pointer", onClick: () => { setPenColor("blue"); @@ -9677,7 +46357,7 @@ function SignPad(_ref) { className: "fa-light fa-cloud-upload-alt uploadImgLogo" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "text-[10px]" - }, "Upload"))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("upload")))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex justify-center" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { @@ -9699,7 +46379,7 @@ function SignPad(_ref) { className: "flex justify-between items-center" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "mr-[5px] text-[12px]" - }, isInitial ? "Initials" : "Signature", ":"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { + }, isInitial ? t("initial-teb") : t("signature-tab"), ":"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { maxLength: isInitial ? 3 : 30, style: { fontFamily: fontSelect, @@ -9740,7 +46420,7 @@ function SignPad(_ref) { convertToImg: convertToImg }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SaveBtn, null))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex justify-center" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react_signature_canvas__WEBPACK_IMPORTED_MODULE_1___default()), { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react_signature_canvas__WEBPACK_IMPORTED_MODULE_2___default()), { ref: canvasRef, penColor: penColor, canvasProps: { @@ -9751,10 +46431,7 @@ function SignPad(_ref) { } }, backgroundColor: "rgb(255, 255, 255)", - onEnd: () => { - var _canvasRef$current; - return handleSignatureChange((_canvasRef$current = canvasRef.current) === null || _canvasRef$current === void 0 ? void 0 : _canvasRef$current.toDataURL()); - }, + onEnd: () => handleSignatureChange(canvasRef.current?.toDataURL()), dotSize: 1 })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-row justify-between mt-[10px]" @@ -9781,11 +46458,10 @@ __webpack_require__.r(__webpack_exports__); function SignerListComponent(props) { - var _props$obj, _props$obj2, _props$obj3, _props$obj4, _props$obj5, _props$obj6, _props$obj7; const checkSignerBackColor = obj => { if (obj) { let data = ""; - if (obj !== null && obj !== void 0 && obj.Id) { + if (obj?.Id) { data = props.signerPos.filter(data => data.Id === obj.Id); } else { data = props.signerPos.filter(data => data.signerObjId === obj.objectId); @@ -9814,13 +46490,13 @@ function SignerListComponent(props) { className: "flex w-[30px] h-[30px] rounded-full justify-center items-center mx-1" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "text-[12px] text-center font-bold text-black uppercase" - }, (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.getFirstLetter)(((_props$obj = props.obj) === null || _props$obj === void 0 ? void 0 : _props$obj.Name) || ((_props$obj2 = props.obj) === null || _props$obj2 === void 0 ? void 0 : _props$obj2.email) || ((_props$obj3 = props.obj) === null || _props$obj3 === void 0 ? void 0 : _props$obj3.Role)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_1__.getFirstLetter)(props.obj?.Name || props.obj?.email || props.obj?.Role))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-col" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "text-[12px] font-bold text-[#424242] w-[100px] whitespace-nowrap overflow-hidden text-ellipsis" - }, ((_props$obj4 = props.obj) === null || _props$obj4 === void 0 ? void 0 : _props$obj4.Name) || (props === null || props === void 0 || (_props$obj5 = props.obj) === null || _props$obj5 === void 0 ? void 0 : _props$obj5.Role)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + }, props.obj?.Name || props?.obj?.Role), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "text-[10px] font-medium text-[#424242] w-[100px] whitespace-nowrap overflow-hidden text-ellipsis" - }, ((_props$obj6 = props.obj) === null || _props$obj6 === void 0 ? void 0 : _props$obj6.Email) || ((_props$obj7 = props.obj) === null || _props$obj7 === void 0 ? void 0 : _props$obj7.email)))); + }, props.obj?.Email || props.obj?.email))); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SignerListComponent); @@ -9840,16 +46516,21 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _primitives_Loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../primitives/Loader */ "./src/primitives/Loader.js"); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); + function VerifyEmail(props) { + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation)(); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("dialog", { className: "op-modal op-modal-open absolute z-[1999]" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "md:w-[40%] w-[80%] op-modal-box p-0 overflow-y-auto hide-scrollbar text-sm" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h3", { className: "font-bold text-lg pt-[15px] px-[20px] text-base-content" - }, "OTP verification"), props.isVerifyModal ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", { + }, t("otp-verification")), props.isVerifyModal ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", { onSubmit: e => { props.setIsVerifyModal(false); props.handleVerifyEmail(e); @@ -9858,12 +46539,14 @@ function VerifyEmail(props) { className: "px-6 py-3 text-base-content" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { className: "mb-2" - }, "Enter OTP"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { + }, t("enter-otp")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { + onInvalid: e => e.target.setCustomValidity(t("input-required")), + onInput: e => e.target.setCustomValidity(""), required: true, type: "tel", pattern: "[0-9]{4}", className: "w-full op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-xs", - placeholder: "Enter OTP received over email", + placeholder: t("otp-placeholder"), value: props.otp, onChange: e => props.setOtp(e.target.value) })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { @@ -9871,24 +46554,22 @@ function VerifyEmail(props) { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "submit", className: "op-btn op-btn-primary" - }, "Verify"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("verify")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "op-btn op-btn-secondary ml-2", onClick: e => props.handleResend(e) - }, "Resend"))) : props.otpLoader ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("resend")))) : props.otpLoader ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "h-[150px] flex items-center justify-center" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_Loader__WEBPACK_IMPORTED_MODULE_1__["default"], null)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "px-6 py-3 text-base-content" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "mb-2 text-sm" - }, "Please verify your email !"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("verify-email")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "px-0 mt-3" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "op-btn op-btn-primary", type: "submit", - onClick: () => { - props.handleVerifyBtn(); - } - }, "Send OTP"))))); + onClick: () => props.handleVerifyBtn() + }, t("send-otp")))))); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VerifyEmail); @@ -9911,11 +46592,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ calculateInitialWidthHeight: () => (/* binding */ calculateInitialWidthHeight), /* harmony export */ changeImageWH: () => (/* binding */ changeImageWH), /* harmony export */ checkIsSubscribed: () => (/* binding */ checkIsSubscribed), -/* harmony export */ checkIsSubscribedTeam: () => (/* binding */ checkIsSubscribedTeam), /* harmony export */ color: () => (/* binding */ color), /* harmony export */ contactBook: () => (/* binding */ contactBook), /* harmony export */ contractDocument: () => (/* binding */ contractDocument), /* harmony export */ contractUsers: () => (/* binding */ contractUsers), +/* harmony export */ convertBase64ToFile: () => (/* binding */ convertBase64ToFile), /* harmony export */ convertPNGtoJPEG: () => (/* binding */ convertPNGtoJPEG), /* harmony export */ convertPdfArrayBuffer: () => (/* binding */ convertPdfArrayBuffer), /* harmony export */ copytoData: () => (/* binding */ copytoData), @@ -9927,6 +46608,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ fetchSubscription: () => (/* binding */ fetchSubscription), /* harmony export */ fetchSubscriptionInfo: () => (/* binding */ fetchSubscriptionInfo), /* harmony export */ fetchUrl: () => (/* binding */ fetchUrl), +/* harmony export */ fileasbytes: () => (/* binding */ fileasbytes), /* harmony export */ findContact: () => (/* binding */ findContact), /* harmony export */ fontColorArr: () => (/* binding */ fontColorArr), /* harmony export */ fontsizeArr: () => (/* binding */ fontsizeArr), @@ -9935,6 +46617,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ getBase64FromUrl: () => (/* binding */ getBase64FromUrl), /* harmony export */ getContainerScale: () => (/* binding */ getContainerScale), /* harmony export */ getDate: () => (/* binding */ getDate), +/* harmony export */ getDefaultSignature: () => (/* binding */ getDefaultSignature), /* harmony export */ getDrive: () => (/* binding */ getDrive), /* harmony export */ getFileName: () => (/* binding */ getFileName), /* harmony export */ getFirstLetter: () => (/* binding */ getFirstLetter), @@ -9946,6 +46629,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ handleDownloadCertificate: () => (/* binding */ handleDownloadCertificate), /* harmony export */ handleDownloadPdf: () => (/* binding */ handleDownloadPdf), /* harmony export */ handleImageResize: () => (/* binding */ handleImageResize), +/* harmony export */ handleRemoveWidgets: () => (/* binding */ handleRemoveWidgets), +/* harmony export */ handleRotateWarning: () => (/* binding */ handleRotateWarning), /* harmony export */ handleSendOTP: () => (/* binding */ handleSendOTP), /* harmony export */ handleSignYourselfImageResize: () => (/* binding */ handleSignYourselfImageResize), /* harmony export */ handleToPrint: () => (/* binding */ handleToPrint), @@ -9955,6 +46640,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ nameColor: () => (/* binding */ nameColor), /* harmony export */ onChangeHeightOfTextArea: () => (/* binding */ onChangeHeightOfTextArea), /* harmony export */ onChangeInput: () => (/* binding */ onChangeInput), +/* harmony export */ onClickZoomIn: () => (/* binding */ onClickZoomIn), +/* harmony export */ onClickZoomOut: () => (/* binding */ onClickZoomOut), /* harmony export */ onImageSelect: () => (/* binding */ onImageSelect), /* harmony export */ onSaveImage: () => (/* binding */ onSaveImage), /* harmony export */ onSaveSign: () => (/* binding */ onSaveSign), @@ -9967,7 +46654,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ range: () => (/* binding */ range), /* harmony export */ replaceMailVaribles: () => (/* binding */ replaceMailVaribles), /* harmony export */ resizeBorderExtraWidth: () => (/* binding */ resizeBorderExtraWidth), +/* harmony export */ rotatePdfPage: () => (/* binding */ rotatePdfPage), /* harmony export */ sanitizeFileName: () => (/* binding */ sanitizeFileName), +/* harmony export */ saveLanguageInLocal: () => (/* binding */ saveLanguageInLocal), /* harmony export */ signPdfFun: () => (/* binding */ signPdfFun), /* harmony export */ textInputWidget: () => (/* binding */ textInputWidget), /* harmony export */ textWidget: () => (/* binding */ textWidget), @@ -9975,7 +46664,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ urlValidator: () => (/* binding */ urlValidator), /* harmony export */ widgets: () => (/* binding */ widgets) /* harmony export */ }); -/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! axios */ "./node_modules/axios/lib/axios.js"); +/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! axios */ "./node_modules/axios/lib/axios.js"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! moment */ "./node_modules/moment/moment.js"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); @@ -9989,6 +46678,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var print_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! print-js */ "./node_modules/print-js/dist/print.js"); /* harmony import */ var print_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(print_js__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _json_plansArr__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../json/plansArr */ "./src/json/plansArr.js"); +/* harmony import */ var _pdf_lib_fontkit__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @pdf-lib/fontkit */ "./node_modules/@pdf-lib/fontkit/dist/fontkit.es.js"); + @@ -10005,6 +46696,11 @@ const isTabAndMobile = window.innerWidth < 1023; const textInputWidget = "text input"; const textWidget = "text"; const radioButtonWidget = "radio button"; +const fileasbytes = async filepath => { + const response = await fetch(filepath); // Adjust the path accordingly + const arrayBuffer = await response.arrayBuffer(); + return new Uint8Array(arrayBuffer); +}; const openInNewTab = (url, target) => { if (target) { window.open(url, target, "noopener,noreferrer"); @@ -10025,7 +46721,7 @@ async function fetchSubscription(extUserId, contactObjId) { extUser = extUserId; } const baseURL = localStorage.getItem("baseUrl"); - const url = "".concat(baseURL, "functions/getsubscriptions"); + const url = `${baseURL}functions/getsubscriptions`; const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -10036,18 +46732,18 @@ async function fetchSubscription(extUserId, contactObjId) { } : { extUserId: extUser }; - const tenatRes = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post(url, params, { + const tenatRes = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(url, params, { headers: headers }); let plan, status, billingDate; if (isGuestSign) { - var _tenatRes$data, _tenatRes$data2; - plan = (_tenatRes$data = tenatRes.data) === null || _tenatRes$data === void 0 || (_tenatRes$data = _tenatRes$data.result) === null || _tenatRes$data === void 0 || (_tenatRes$data = _tenatRes$data.result) === null || _tenatRes$data === void 0 ? void 0 : _tenatRes$data.plan; - status = (_tenatRes$data2 = tenatRes.data) === null || _tenatRes$data2 === void 0 || (_tenatRes$data2 = _tenatRes$data2.result) === null || _tenatRes$data2 === void 0 || (_tenatRes$data2 = _tenatRes$data2.result) === null || _tenatRes$data2 === void 0 ? void 0 : _tenatRes$data2.isSubscribed; + plan = tenatRes.data?.result?.result?.plan; + status = tenatRes.data?.result?.result?.isSubscribed; } else { - var _tenatRes$data3, _tenatRes$data4; - plan = (_tenatRes$data3 = tenatRes.data) === null || _tenatRes$data3 === void 0 || (_tenatRes$data3 = _tenatRes$data3.result) === null || _tenatRes$data3 === void 0 || (_tenatRes$data3 = _tenatRes$data3.result) === null || _tenatRes$data3 === void 0 ? void 0 : _tenatRes$data3.PlanCode; - billingDate = (_tenatRes$data4 = tenatRes.data) === null || _tenatRes$data4 === void 0 || (_tenatRes$data4 = _tenatRes$data4.result) === null || _tenatRes$data4 === void 0 || (_tenatRes$data4 = _tenatRes$data4.result) === null || _tenatRes$data4 === void 0 || (_tenatRes$data4 = _tenatRes$data4.Next_billing_date) === null || _tenatRes$data4 === void 0 ? void 0 : _tenatRes$data4.iso; + plan = tenatRes.data?.result?.result?.PlanCode; + billingDate = tenatRes.data?.result?.result?.Next_billing_date?.iso; + const allowedUsers = tenatRes.data?.result?.result?.AllowedUsers || 0; + localStorage.setItem("allowedUsers", allowedUsers); } return { plan, @@ -10068,10 +46764,9 @@ async function fetchSubscriptionInfo() { const extClass = Extand_Class && JSON.parse(Extand_Class); // console.log("extClass ", extClass); if (extClass && extClass.length > 0) { - var _tenatRes$data5, _tenatRes$data6, _tenatRes$data7, _tenatRes$data8; const extUser = extClass[0].objectId; const baseURL = localStorage.getItem("baseUrl"); - const url = "".concat(baseURL, "functions/getsubscriptions"); + const url = `${baseURL}functions/getsubscriptions`; const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -10080,19 +46775,21 @@ async function fetchSubscriptionInfo() { const params = { extUserId: extUser }; - const tenatRes = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post(url, params, { + const tenatRes = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(url, params, { headers: headers }); - const price = (_tenatRes$data5 = tenatRes.data) === null || _tenatRes$data5 === void 0 || (_tenatRes$data5 = _tenatRes$data5.result) === null || _tenatRes$data5 === void 0 || (_tenatRes$data5 = _tenatRes$data5.result) === null || _tenatRes$data5 === void 0 || (_tenatRes$data5 = _tenatRes$data5.SubscriptionDetails) === null || _tenatRes$data5 === void 0 || (_tenatRes$data5 = _tenatRes$data5.data) === null || _tenatRes$data5 === void 0 || (_tenatRes$data5 = _tenatRes$data5.subscription) === null || _tenatRes$data5 === void 0 || (_tenatRes$data5 = _tenatRes$data5.plan) === null || _tenatRes$data5 === void 0 ? void 0 : _tenatRes$data5.price; - const totalPrice = (_tenatRes$data6 = tenatRes.data) === null || _tenatRes$data6 === void 0 || (_tenatRes$data6 = _tenatRes$data6.result) === null || _tenatRes$data6 === void 0 || (_tenatRes$data6 = _tenatRes$data6.result) === null || _tenatRes$data6 === void 0 || (_tenatRes$data6 = _tenatRes$data6.SubscriptionDetails) === null || _tenatRes$data6 === void 0 || (_tenatRes$data6 = _tenatRes$data6.data) === null || _tenatRes$data6 === void 0 || (_tenatRes$data6 = _tenatRes$data6.subscription) === null || _tenatRes$data6 === void 0 ? void 0 : _tenatRes$data6.amount; - const planId = (_tenatRes$data7 = tenatRes.data) === null || _tenatRes$data7 === void 0 || (_tenatRes$data7 = _tenatRes$data7.result) === null || _tenatRes$data7 === void 0 || (_tenatRes$data7 = _tenatRes$data7.result) === null || _tenatRes$data7 === void 0 || (_tenatRes$data7 = _tenatRes$data7.SubscriptionDetails) === null || _tenatRes$data7 === void 0 || (_tenatRes$data7 = _tenatRes$data7.data) === null || _tenatRes$data7 === void 0 || (_tenatRes$data7 = _tenatRes$data7.subscription) === null || _tenatRes$data7 === void 0 ? void 0 : _tenatRes$data7.subscription_id; - const plan_code = (_tenatRes$data8 = tenatRes.data) === null || _tenatRes$data8 === void 0 || (_tenatRes$data8 = _tenatRes$data8.result) === null || _tenatRes$data8 === void 0 || (_tenatRes$data8 = _tenatRes$data8.result) === null || _tenatRes$data8 === void 0 || (_tenatRes$data8 = _tenatRes$data8.SubscriptionDetails) === null || _tenatRes$data8 === void 0 || (_tenatRes$data8 = _tenatRes$data8.data) === null || _tenatRes$data8 === void 0 || (_tenatRes$data8 = _tenatRes$data8.subscription) === null || _tenatRes$data8 === void 0 || (_tenatRes$data8 = _tenatRes$data8.plan) === null || _tenatRes$data8 === void 0 ? void 0 : _tenatRes$data8.plan_code; + const price = tenatRes.data?.result?.result?.SubscriptionDetails?.data?.subscription?.plan?.price; + const totalPrice = tenatRes.data?.result?.result?.SubscriptionDetails?.data?.subscription?.amount; + const planId = tenatRes.data?.result?.result?.SubscriptionDetails?.data?.subscription?.subscription_id; + const plan_code = tenatRes.data?.result?.result?.SubscriptionDetails?.data?.subscription?.plan?.plan_code; + const totalAllowedUser = tenatRes.data?.result?.result?.AllowedUsers || 0; return { status: "success", price: price, totalPrice: totalPrice, planId: planId, - plan_code: plan_code + plan_code: plan_code, + totalAllowedUser: totalAllowedUser }; } } catch (err) { @@ -10108,41 +46805,40 @@ async function checkIsSubscribed() { try { const res = await fetchSubscription(); if (res.plan === "freeplan") { - return false; - } else if (res.billingDate) { - if (new Date(res.billingDate) > new Date()) { - return true; - } else { - return false; - } - } else { - return false; - } - } catch (err) { - console.log("Err in fetch subscription", err); - return false; - } -} - -//function to get subcripition details from subscription class -async function checkIsSubscribedTeam() { - try { - const res = await fetchSubscription(); - if (res.plan === "freeplan") { - return false; + return { + plan: res.plan, + isValid: false + }; } else if (res.billingDate) { const plan = _json_plansArr__WEBPACK_IMPORTED_MODULE_7__.validplan[res.plan] || false; if (plan && new Date(res.billingDate) > new Date()) { - return true; + return { + plan: res.plan, + isValid: true + }; + } else if (new Date(res.billingDate) > new Date()) { + return { + plan: res.plan, + isValid: true + }; } else { - return false; + return { + plan: res.plan, + isValid: false + }; } } else { - return false; + return { + plan: res.plan, + isValid: false + }; } } catch (err) { console.log("Err in fetch subscription", err); - return false; + return { + plan: "no-plan", + isValid: false + }; } } const color = ["#93a3db", "#e6c3db", "#c0e3bc", "#bce3db", "#b8ccdb", "#ceb8db", "#ffccff", "#99ffcc", "#cc99ff", "#ffcc99", "#66ccff", "#ffffcc"]; @@ -10166,7 +46862,7 @@ const getDrive = async function (documentId) { limit: limit, skip: skip }; - const driveDeatils = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getDrive"), data, { + const driveDeatils = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(`${localStorage.getItem("baseUrl")}functions/getDrive`, data, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -10386,7 +47082,7 @@ const addWidgetOptions = type => { return {}; } }; -const getWidgetType = item => { +const getWidgetType = (item, widgetName) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "op-btn w-fit md:w-[100%] op-btn-primary op-btn-outline op-btn-sm focus:outline-none outline outline-[1.5px] ml-[6px] md:ml-0 p-0 overflow-hidden" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { @@ -10397,7 +47093,7 @@ const getWidgetType = item => { className: "fa-light fa-grip-vertical ml-[3px]" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", { className: "md:inline-block text-center text-[15px] ml-[5px] font-semibold pr-1 md:pr-0" - }, item.type)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + }, widgetName)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "text-[20px] op-btn op-btn-primary rounded-none w-[40px] h-full flex justify-center items-center" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("i", { className: item.icon @@ -10485,7 +47181,7 @@ const defaultWidthHeight = type => { const resizeBorderExtraWidth = () => { return 20; }; -async function getBase64FromUrl(url) { +async function getBase64FromUrl(url, autosign) { const data = await fetch(url); const blob = await data.blob(); return new Promise(resolve => { @@ -10493,8 +47189,12 @@ async function getBase64FromUrl(url) { reader.readAsDataURL(blob); reader.onloadend = function () { const pdfBase = this.result; - const suffixbase64 = pdfBase.split(",").pop(); - resolve(suffixbase64); + if (autosign) { + resolve(pdfBase); + } else { + const suffixbase64 = pdfBase.split(",").pop(); + resolve(suffixbase64); + } }; }); } @@ -10572,7 +47272,7 @@ const signPdfFun = async (base64Url, documentId, signerObjectId, objectId, isSub message: "User does not exist." }; } else { - if (tenantDetails !== null && tenantDetails !== void 0 && tenantDetails.CompletionBody && tenantDetails !== null && tenantDetails !== void 0 && tenantDetails.CompletionSubject && isSubscribed) { + if (tenantDetails?.CompletionBody && tenantDetails?.CompletionSubject && isSubscribed) { isCustomCompletionMail = true; } } @@ -10582,9 +47282,9 @@ const signPdfFun = async (base64Url, documentId, signerObjectId, objectId, isSub let getSignature; for (let item of widgets) { if (!getSignature) { - const typeExist = item.pos.some(data => data === null || data === void 0 ? void 0 : data.type); + const typeExist = item.pos.some(data => data?.type); if (typeExist) { - getSignature = item.pos.find(data => (data === null || data === void 0 ? void 0 : data.type) === "signature"); + getSignature = item.pos.find(data => data?.type === "signature"); } else { getSignature = item.pos.find(data => !data.isStamp); } @@ -10622,9 +47322,8 @@ const signPdfFun = async (base64Url, documentId, signerObjectId, objectId, isSub return signedPdf; } } catch (e) { - var _e$message; console.log("Err in signPdf cloud function ", e.message); - if (e && e !== null && e !== void 0 && (_e$message = e.message) !== null && _e$message !== void 0 && _e$message.includes("is encrypted.")) { + if (e && e?.message?.includes("is encrypted.")) { return { status: "error", message: "Currently encrypted pdf files are not supported." @@ -10648,15 +47347,15 @@ const randomId = () => { const randomDigit = 1000 + randomValue % 9000; return randomDigit; }; -const createDocument = async (template, placeholders, signerData) => { +const createDocument = async (template, placeholders, signerData, pdfUrl) => { if (template && template.length > 0) { const Doc = template[0]; let placeholdersArr = []; - if ((placeholders === null || placeholders === void 0 ? void 0 : placeholders.length) > 0) { + if (placeholders?.length > 0) { placeholdersArr = placeholders; } let signers = []; - if ((signerData === null || signerData === void 0 ? void 0 : signerData.length) > 0) { + if (signerData?.length > 0) { signerData.forEach(x => { if (x.objectId) { const obj = { @@ -10670,7 +47369,7 @@ const createDocument = async (template, placeholders, signerData) => { } const data = { Name: Doc.Name, - URL: Doc.URL, + URL: pdfUrl, SignedUrl: Doc.SignedUrl, SentToOthers: Doc.SentToOthers, Description: Doc.Description, @@ -10687,12 +47386,12 @@ const createDocument = async (template, placeholders, signerData) => { objectId: Doc.CreatedBy.objectId }, Signers: signers, - SendinOrder: (Doc === null || Doc === void 0 ? void 0 : Doc.SendinOrder) || false, - AutomaticReminders: (Doc === null || Doc === void 0 ? void 0 : Doc.AutomaticReminders) || false, - RemindOnceInEvery: parseInt((Doc === null || Doc === void 0 ? void 0 : Doc.RemindOnceInEvery) || 5) + SendinOrder: Doc?.SendinOrder || false, + AutomaticReminders: Doc?.AutomaticReminders || false, + RemindOnceInEvery: parseInt(Doc?.RemindOnceInEvery || 5) }; try { - const res = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Document"), data, { + const res = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(`${localStorage.getItem("baseUrl")}classes/contracts_Document`, data, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -10715,7 +47414,7 @@ const createDocument = async (template, placeholders, signerData) => { } }; const getFirstLetter = name => { - const firstLetter = name === null || name === void 0 ? void 0 : name.charAt(0); + const firstLetter = name?.charAt(0); return firstLetter; }; const darkenColor = (color, factor) => { @@ -10731,7 +47430,7 @@ const darkenColor = (color, factor) => { const darkerB = Math.floor(b * (1 - factor)); // Convert the darkened RGB components back to hex - return "#".concat((darkerR << 16 | darkerG << 8 | darkerB).toString(16).padStart(6, "0")); + return `#${(darkerR << 16 | darkerG << 8 | darkerB).toString(16).padStart(6, "0")}`; }; const addZIndex = (signerPos, key, setZIndex) => { return signerPos.map(item => { @@ -10765,15 +47464,14 @@ const addZIndex = (signerPos, key, setZIndex) => { }; //function for save widgets value on onchange function -const onChangeInput = (value, signKey, xyPostion, index, setXyPostion, userId, initial, dateFormat, isDefaultEmpty, isRadio) => { +const onChangeInput = (value, signKey, xyPostion, index, setXyPostion, userId, initial, dateFormat, isDefaultEmpty, isRadio, fontSize, fontColor) => { const isSigners = xyPostion.some(data => data.signerPtr); let filterSignerPos; if (isSigners) { - var _filterSignerPos$; if (userId) { filterSignerPos = xyPostion.filter(data => data.Id === userId); } - const getPlaceHolder = (_filterSignerPos$ = filterSignerPos[0]) === null || _filterSignerPos$ === void 0 ? void 0 : _filterSignerPos$.placeHolder; + const getPlaceHolder = filterSignerPos[0]?.placeHolder; if (initial) { const xyData = addInitialData(xyPostion, setXyPostion, value, userId); setXyPostion(xyData); @@ -10790,6 +47488,8 @@ const onChangeInput = (value, signKey, xyPostion, index, setXyPostion, userId, i options: { ...position.options, response: value, + fontSize: fontSize, + fontColor: fontColor, validation: { type: "date-format", format: dateFormat // This indicates the required date format explicitly. @@ -10848,6 +47548,8 @@ const onChangeInput = (value, signKey, xyPostion, index, setXyPostion, userId, i options: { ...positionData.options, response: value, + fontSize: fontSize, + fontColor: fontColor, validation: { type: "date-format", format: dateFormat // This indicates the required date format explicitly. @@ -10884,11 +47586,10 @@ const onChangeHeightOfTextArea = (height, widgetType, signKey, xyPostion, index, const isSigners = xyPostion.some(data => data.signerPtr); let filterSignerPos; if (isSigners) { - var _filterSignerPos$2; if (userId) { filterSignerPos = xyPostion.filter(data => data.Id === userId); } - const getPlaceHolder = (_filterSignerPos$2 = filterSignerPos[0]) === null || _filterSignerPos$2 === void 0 ? void 0 : _filterSignerPos$2.placeHolder; + const getPlaceHolder = filterSignerPos[0]?.placeHolder; const getPageNumer = getPlaceHolder.filter(data => data.pageNumber === index); if (getPageNumer.length > 0) { const getXYdata = getPageNumer[0].pos; @@ -10950,7 +47651,7 @@ const calculateInitialWidthHeight = widgetData => { const intialText = widgetData; const span = document.createElement("span"); span.textContent = intialText; - span.style.font = "14px"; // here put your text size and font family + span.style.font = `14px`; // here put your text size and font family span.style.display = "hidden"; document.body.appendChild(span); const width = span.offsetWidth; @@ -10965,13 +47666,13 @@ const addInitialData = (signerPos, setXyPostion, value, userId) => { function widgetDataValue(type) { switch (type) { case "name": - return value === null || value === void 0 ? void 0 : value.Name; + return value?.Name; case "company": - return value === null || value === void 0 ? void 0 : value.Company; + return value?.Company; case "job title": - return value === null || value === void 0 ? void 0 : value.JobTitle; + return value?.JobTitle; case "email": - return value === null || value === void 0 ? void 0 : value.Email; + return value?.Email; default: return ""; } @@ -11023,19 +47724,19 @@ const addInitialData = (signerPos, setXyPostion, value, userId) => { //function for embed document id const embedDocId = async (pdfDoc, documentId, allPages) => { + // `fontBytes` is used to embed custom font in pdf + const fontBytes = await fileasbytes("https://cdn.opensignlabs.com/webfonts/times.ttf"); + pdfDoc.registerFontkit(_pdf_lib_fontkit__WEBPACK_IMPORTED_MODULE_8__["default"]); + const font = await pdfDoc.embedFont(fontBytes, { + subset: true + }); for (let i = 0; i < allPages; i++) { - const font = await pdfDoc.embedFont("Helvetica"); const fontSize = 10; - const textContent = documentId && "OpenSign\u2122 DocumentId: ".concat(documentId, " "); + const textContent = documentId && `OpenSign™ DocumentId: ${documentId} `; const pages = pdfDoc.getPages(); const page = pages[i]; - page.drawText(textContent, { - x: 10, - y: page.getHeight() - 10, - size: fontSize, - font, - color: (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0.5, 0.5, 0.5) - }); + const getObj = compensateRotation(page.getRotation().angle, 10, 5, 1, page.getSize(), fontSize, (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0.5, 0.5, 0.5), font, page); + page.drawText(textContent, getObj); } }; @@ -11059,8 +47760,8 @@ function onSaveSign(type, xyPostion, index, signKey, signatureImg, imgWH, isDefa newHeight: imgWH.height }; } else { - const defaultWidth = defaultWidthHeight(position === null || position === void 0 ? void 0 : position.type).width; - const defaultHeight = defaultWidthHeight(position === null || position === void 0 ? void 0 : position.type).height; + const defaultWidth = defaultWidthHeight(position?.type).width; + const defaultHeight = defaultWidthHeight(position?.type).height; getIMGWH = calculateImgAspectRatio({ width: defaultWidth ? defaultWidth : 150, height: defaultHeight ? defaultHeight : 60 @@ -11195,8 +47896,8 @@ const fetchImageBase64 = async imageUrl => { }; //function for select image and upload image const changeImageWH = async base64Image => { - const newWidth = 100; - const newHeight = 40; + const newWidth = 300; + const newHeight = 120; return new Promise((resolve, reject) => { const img = new Image(); img.src = base64Image; @@ -11217,28 +47918,44 @@ const changeImageWH = async base64Image => { //function to calculate font size of text area widgets const calculateFontSize = (position, containerScale, signyourself) => { - var _position$options; - const font = (position === null || position === void 0 || (_position$options = position.options) === null || _position$options === void 0 ? void 0 : _position$options.fontSize) || 12; - if (!signyourself && position !== null && position !== void 0 && position.isMobile && position !== null && position !== void 0 && position.scale) { - return font / (position === null || position === void 0 ? void 0 : position.scale) / containerScale; + const font = position?.options?.fontSize || 12; + if (!signyourself && position?.isMobile && position?.scale) { + return font / position?.scale / containerScale; } else { return font / containerScale; } }; +const getWidgetsFontColor = type => { + switch (type) { + case "red": + return (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(1, 0, 0); + case "black": + return (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0, 0, 0); + case "blue": + return (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0, 0, 1); + case "yellow": + return (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0.9, 1, 0); + default: + return (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0, 0, 0); + } +}; //function for embed multiple signature using pdf-lib const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale, pdfOriginalWH, containerWH) => { + // `fontBytes` is used to embed custom font in pdf + const fontBytes = await fileasbytes("https://cdn.opensignlabs.com/webfonts/times.ttf"); + pdfDoc.registerFontkit(_pdf_lib_fontkit__WEBPACK_IMPORTED_MODULE_8__["default"]); + const font = await pdfDoc.embedFont(fontBytes, { + subset: true + }); for (let item of widgets) { - const containerScale = getContainerScale(pdfOriginalWH, item === null || item === void 0 ? void 0 : item.pageNumber, containerWH); - const typeExist = item.pos.some(data => data === null || data === void 0 ? void 0 : data.type); + const containerScale = getContainerScale(pdfOriginalWH, item?.pageNumber, containerWH); + const typeExist = item.pos.some(data => data?.type); let updateItem; if (typeExist) { if (signyourself) { updateItem = item.pos; } else { - updateItem = item.pos.filter(data => { - var _data$options; - return (data === null || data === void 0 || (_data$options = data.options) === null || _data$options === void 0 ? void 0 : _data$options.status) === "required"; - }); + updateItem = item.pos.filter(data => data?.options?.status === "required"); } } else { updateItem = item.pos; @@ -11306,36 +48023,33 @@ const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale, pdfOriginalW return resizePos; } }; + const color = position?.options?.fontColor; + const updateColorInRgb = getWidgetsFontColor(color); + const fontSize = parseInt(position?.options?.fontSize); const widgetTypeExist = [textWidget, textInputWidget, "name", "company", "job title", "date", "email"].includes(position.type); if (position.type === "checkbox") { - var _position$options2; - const font = await pdfDoc.embedFont("Helvetica"); - let checkboxOptionGapFromTop, isCheck; + let checkboxGapFromTop, isCheck; let y = yPos(position); - const optionsFontSize = 13; - const checkboxSize = 18; - const checkboxTextGapFromLeft = 22; - if ((position === null || position === void 0 || (_position$options2 = position.options) === null || _position$options2 === void 0 ? void 0 : _position$options2.values.length) > 0) { - var _position$options3; - position === null || position === void 0 || (_position$options3 = position.options) === null || _position$options3 === void 0 || _position$options3.values.forEach((item, ind) => { - var _position$options4, _position$options5, _position$options7, _position$options9; + const optionsFontSize = fontSize || 13; + const checkboxSize = fontSize; + const checkboxTextGapFromLeft = fontSize + 5 || 22; + if (position?.options?.values.length > 0) { + position?.options?.values.forEach((item, ind) => { const checkboxRandomId = "checkbox" + randomId(); - if (position !== null && position !== void 0 && (_position$options4 = position.options) !== null && _position$options4 !== void 0 && _position$options4.response && (position === null || position === void 0 || (_position$options5 = position.options) === null || _position$options5 === void 0 || (_position$options5 = _position$options5.response) === null || _position$options5 === void 0 ? void 0 : _position$options5.length) > 0) { - var _position$options6; - isCheck = position === null || position === void 0 || (_position$options6 = position.options) === null || _position$options6 === void 0 || (_position$options6 = _position$options6.response) === null || _position$options6 === void 0 ? void 0 : _position$options6.includes(ind); - } else if (position !== null && position !== void 0 && (_position$options7 = position.options) !== null && _position$options7 !== void 0 && _position$options7.defaultValue) { - var _position$options8; - isCheck = position === null || position === void 0 || (_position$options8 = position.options) === null || _position$options8 === void 0 || (_position$options8 = _position$options8.defaultValue) === null || _position$options8 === void 0 ? void 0 : _position$options8.includes(ind); + if (position?.options?.response && position?.options?.response?.length > 0) { + isCheck = position?.options?.response?.includes(ind); + } else if (position?.options?.defaultValue) { + isCheck = position?.options?.defaultValue?.includes(ind); } const checkbox = form.createCheckBox(checkboxRandomId); if (ind > 0) { - y = y + checkboxOptionGapFromTop; + y = y + checkboxGapFromTop; } else { - checkboxOptionGapFromTop = 26; + checkboxGapFromTop = fontSize + 5 || 26; } - if (!(position !== null && position !== void 0 && (_position$options9 = position.options) !== null && _position$options9 !== void 0 && _position$options9.isHideLabel)) { + if (!position?.options?.isHideLabel) { // below line of code is used to embed label with radio button in pdf - const optionsPosition = compensateRotation(page.getRotation().angle, xPos(position) + checkboxTextGapFromLeft, y, 1, page.getSize(), optionsFontSize, (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0, 0, 0), font, page); + const optionsPosition = compensateRotation(page.getRotation().angle, xPos(position) + checkboxTextGapFromLeft, y, 1, page.getSize(), optionsFontSize, updateColorInRgb, font, page); page.drawText(item, optionsPosition); } let checkboxObj = { @@ -11344,7 +48058,7 @@ const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale, pdfOriginalW width: checkboxSize, height: checkboxSize }; - checkboxObj = getImagePosition(page, checkboxObj, 1); + checkboxObj = getWidgetPosition(page, checkboxObj, 1); checkbox.addToPage(page, checkboxObj); //applied which checkbox should be checked @@ -11357,30 +48071,13 @@ const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale, pdfOriginalW }); } } else if (widgetTypeExist) { - var _position$options10, _position$options11, _position$options13; - const font = await pdfDoc.embedFont("Helvetica"); const fontSize = calculateFontSize(position, containerScale, signyourself); parseInt(fontSize); - const color = position === null || position === void 0 || (_position$options10 = position.options) === null || _position$options10 === void 0 ? void 0 : _position$options10.fontColor; - let updateColorInRgb; - if (color === "red") { - updateColorInRgb = (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(1, 0, 0); - } else if (color === "black") { - updateColorInRgb = (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0, 0, 0); - } else if (color === "blue") { - updateColorInRgb = (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0, 0, 1); - } else if (color === "yellow") { - updateColorInRgb = (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0.9, 1, 0); - } else { - updateColorInRgb = (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0, 0, 0); - } let textContent; - if (position !== null && position !== void 0 && (_position$options11 = position.options) !== null && _position$options11 !== void 0 && _position$options11.response) { - var _position$options12; - textContent = (_position$options12 = position.options) === null || _position$options12 === void 0 ? void 0 : _position$options12.response; - } else if (position !== null && position !== void 0 && (_position$options13 = position.options) !== null && _position$options13 !== void 0 && _position$options13.defaultValue) { - var _position$options14; - textContent = position === null || position === void 0 || (_position$options14 = position.options) === null || _position$options14 === void 0 ? void 0 : _position$options14.defaultValue; + if (position?.options?.response) { + textContent = position.options?.response; + } else if (position?.options?.defaultValue) { + textContent = position?.options?.defaultValue; } const fixedWidth = widgetWidth; // Set your fixed width const isNewOnEnterLineExist = textContent.includes("\n"); @@ -11391,13 +48088,13 @@ const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale, pdfOriginalW let currentLine = ""; for (const word of textContent.split(" ")) { //get text line width - const lineWidth = font.widthOfTextAtSize("".concat(currentLine, " ").concat(word), fontSize); + const lineWidth = font.widthOfTextAtSize(`${currentLine} ${word}`, fontSize); //check text content line width is less or equal to container width if (lineWidth <= width) { - currentLine += " ".concat(word); + currentLine += ` ${word}`; } else { lines.push(currentLine.trim()); - currentLine = "".concat(word); + currentLine = `${word}`; } } lines.push(currentLine.trim()); @@ -11408,7 +48105,7 @@ const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale, pdfOriginalW const breakTextIntoLines = (textContent, width) => { const lines = []; for (const word of textContent.split("\n")) { - const lineWidth = font.widthOfTextAtSize("".concat(word), fontSize); + const lineWidth = font.widthOfTextAtSize(`${word}`, fontSize); //checking string length to container width //if string length is less then container width it means user press enter button if (lineWidth <= width) { @@ -11436,50 +48133,58 @@ const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale, pdfOriginalW y += 18; // Adjust the line height as needed } } else if (position.type === "dropdown") { - var _position$options15, _position$options16, _position$options18; + const fontsize = parseInt(position?.options?.fontSize) || 12; const dropdownRandomId = "dropdown" + randomId(); const dropdown = form.createDropdown(dropdownRandomId); - dropdown.addOptions(position === null || position === void 0 || (_position$options15 = position.options) === null || _position$options15 === void 0 ? void 0 : _position$options15.values); - if (position !== null && position !== void 0 && (_position$options16 = position.options) !== null && _position$options16 !== void 0 && _position$options16.response) { - var _position$options17; - dropdown.select((_position$options17 = position.options) === null || _position$options17 === void 0 ? void 0 : _position$options17.response); - } else if (position !== null && position !== void 0 && (_position$options18 = position.options) !== null && _position$options18 !== void 0 && _position$options18.defaultValue) { - var _position$options19; - dropdown.select(position === null || position === void 0 || (_position$options19 = position.options) === null || _position$options19 === void 0 ? void 0 : _position$options19.defaultValue); - } + dropdown.addOptions(position?.options?.values); + if (position?.options?.response) { + dropdown.select(position.options?.response); + } else if (position?.options?.defaultValue) { + dropdown.select(position?.options?.defaultValue); + } + // Define the default appearance string + // Example format: `/FontName FontSize Tf 0 g` where: + // - `/FontName` is the name of the font (e.g., `/Helv` for Helvetica) + // - `FontSize` is the size you want to set (e.g., 12) + // - `Tf` specifies the font and size + // - `0 g` sets the text color to black + const defaultAppearance = `/Helv ${fontsize} Tf 0 g`; + // Set the default appearance for the dropdown field + dropdown.acroField.setDefaultAppearance(defaultAppearance); + dropdown.setFontSize(fontsize); const dropdownObj = { x: xPos(position), y: yPos(position), width: widgetWidth, height: widgetHeight }; - const dropdownOption = getImagePosition(page, dropdownObj, 1); - // page.drawImage(img, imageOptions); - dropdown.addToPage(page, dropdownOption); + const dropdownOption = getWidgetPosition(page, dropdownObj, 1); + const dropdownSelected = { + ...dropdownOption, + font: font + }; + dropdown.defaultUpdateAppearances(font); + dropdown.addToPage(page, dropdownSelected); dropdown.enableReadOnly(); } else if (position.type === radioButtonWidget) { - var _position$options20, _position$options23, _position$options25; - const font = await pdfDoc.embedFont("Helvetica"); const radioRandomId = "radio" + randomId(); const radioGroup = form.createRadioGroup(radioRandomId); let radioOptionGapFromTop; - const optionsFontSize = 16; - const radioTextGapFromLeft = 20; - const radioSize = 18; + const optionsFontSize = fontSize || 13; + const radioTextGapFromLeft = fontSize + 5 || 20; + const radioSize = fontSize; let y = yPos(position); - if ((position === null || position === void 0 || (_position$options20 = position.options) === null || _position$options20 === void 0 ? void 0 : _position$options20.values.length) > 0) { - var _position$options21; - position === null || position === void 0 || (_position$options21 = position.options) === null || _position$options21 === void 0 || _position$options21.values.forEach((item, ind) => { - var _position$options22; + if (position?.options?.values.length > 0) { + position?.options?.values.forEach((item, ind) => { if (ind > 0) { y = y + radioOptionGapFromTop; } else { - radioOptionGapFromTop = 25; + radioOptionGapFromTop = fontSize + 10 || 25; } - if (!(position !== null && position !== void 0 && (_position$options22 = position.options) !== null && _position$options22 !== void 0 && _position$options22.isHideLabel)) { + if (!position?.options?.isHideLabel) { // below line of code is used to embed label with radio button in pdf - const optionsPosition = compensateRotation(page.getRotation().angle, xPos(position) + radioTextGapFromLeft, y, 1, page.getSize(), optionsFontSize, (0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.rgb)(0, 0, 0), font, page); + const optionsPosition = compensateRotation(page.getRotation().angle, xPos(position) + radioTextGapFromLeft, y, 1, page.getSize(), optionsFontSize, updateColorInRgb, font, page); page.drawText(item, optionsPosition); } let radioObj = { @@ -11488,16 +48193,14 @@ const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale, pdfOriginalW width: radioSize, height: radioSize }; - radioObj = getImagePosition(page, radioObj, 1); + radioObj = getWidgetPosition(page, radioObj, 1); radioGroup.addOptionToPage(item, page, radioObj); }); } - if (position !== null && position !== void 0 && (_position$options23 = position.options) !== null && _position$options23 !== void 0 && _position$options23.response) { - var _position$options24; - radioGroup.select((_position$options24 = position.options) === null || _position$options24 === void 0 ? void 0 : _position$options24.response); - } else if (position !== null && position !== void 0 && (_position$options25 = position.options) !== null && _position$options25 !== void 0 && _position$options25.defaultValue) { - var _position$options26; - radioGroup.select(position === null || position === void 0 || (_position$options26 = position.options) === null || _position$options26 === void 0 ? void 0 : _position$options26.defaultValue); + if (position?.options?.response) { + radioGroup.select(position.options?.response); + } else if (position?.options?.defaultValue) { + radioGroup.select(position?.options?.defaultValue); } radioGroup.enableReadOnly(); } else { @@ -11507,7 +48210,7 @@ const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale, pdfOriginalW width: widgetWidth, height: widgetHeight }; - const imageOptions = getImagePosition(page, signature, 1); + const imageOptions = getWidgetPosition(page, signature, 1); page.drawImage(img, imageOptions); } }); @@ -11565,7 +48268,7 @@ const placeholderHeight = pos => { //function for getting contracts_contactbook details const contactBook = async objectId => { - const result = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].get("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Contactbook?where={\"objectId\":\"").concat(objectId, "\"}"), { + const result = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].get(`${localStorage.getItem("baseUrl")}classes/contracts_Contactbook?where={"objectId":"${objectId}"}`, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -11587,7 +48290,7 @@ const contractDocument = async documentId => { const data = { docId: documentId }; - const documentDeatils = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getDocument"), data, { + const documentDeatils = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(`${localStorage.getItem("baseUrl")}functions/getDocument`, data, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -11634,7 +48337,7 @@ const addDefaultSignatureImg = (xyPostion, defaultSignImg) => { const addSign = getPosData.map(position => { getIMGWH = calculateImgAspectRatio(imgWH, position); if (position.type) { - if ((position === null || position === void 0 ? void 0 : position.type) === "signature") { + if (position?.type === "signature") { return { ...position, SignUrl: defaultSignImg, @@ -11693,29 +48396,25 @@ const getYear = date => { //function to create/copy widget next to already dropped widget const handleCopyNextToWidget = (position, widgetType, xyPostion, index, setXyPostion, userId) => { - const isSigners = xyPostion.some(data => data.signerPtr); let filterSignerPos; //get position of previous widget and create new widget next to that widget on same data except // xPosition and key - let newpos = position; + let newposition = position; const calculateXPosition = parseInt(position.xPosition) + defaultWidthHeight(widgetType).width + resizeBorderExtraWidth(); const newId = randomId(); - newpos = { - ...newpos, + newposition = { + ...newposition, xPosition: calculateXPosition, key: newId }; //if condition to create widget in request-sign flow - if (isSigners) { - var _filterSignerPos$3; - if (userId) { - filterSignerPos = xyPostion.filter(data => data.Id === userId); - } - const getPlaceHolder = (_filterSignerPos$3 = filterSignerPos[0]) === null || _filterSignerPos$3 === void 0 ? void 0 : _filterSignerPos$3.placeHolder; - const getPageNumer = getPlaceHolder.filter(data => data.pageNumber === index); - const getXYdata = getPageNumer[0].pos; - getXYdata.push(newpos); - if (getPageNumer.length > 0) { + if (userId) { + filterSignerPos = xyPostion.filter(data => data.Id === userId); + const getPlaceHolder = filterSignerPos && filterSignerPos[0]?.placeHolder; + const getPageNumer = getPlaceHolder?.filter(data => data.pageNumber === index); + const getXYdata = getPageNumer && getPageNumer[0]?.pos; + getXYdata.push(newposition); + if (getPageNumer && getPageNumer.length > 0) { const newUpdateSignPos = getPlaceHolder.map(obj => { if (obj.pageNumber === index) { return { @@ -11737,9 +48436,8 @@ const handleCopyNextToWidget = (position, widgetType, xyPostion, index, setXyPos setXyPostion(newUpdateSigner); } } else { - // else condition to create widget in sign-yourself flow - let getXYdata = xyPostion[index].pos; - getXYdata.push(newpos); + let getXYdata = xyPostion[index]?.pos || []; + getXYdata.push(newposition); const updatePlaceholder = xyPostion.map((obj, ind) => { if (ind === index) { return { @@ -11777,8 +48475,8 @@ const getAppLogo = async () => { }); if (tenant) { return { - logo: tenant === null || tenant === void 0 ? void 0 : tenant.logo, - user: tenant === null || tenant === void 0 ? void 0 : tenant.user + logo: tenant?.logo, + user: tenant?.user }; } } catch (err) { @@ -11813,7 +48511,7 @@ function replaceMailVaribles(subject, body, variables) { let replacedSubject = subject; let replacedBody = body; for (const variable in variables) { - const regex = new RegExp("{{".concat(variable, "}}"), "g"); + const regex = new RegExp(`{{${variable}}}`, "g"); if (subject) { replacedSubject = replacedSubject.replace(regex, variables[variable]); } @@ -11827,14 +48525,14 @@ function replaceMailVaribles(subject, body, variables) { }; return result; } -const copytoData = text => { +const copytoData = url => { // navigator.clipboard.writeText(text); if (navigator.clipboard) { - navigator.clipboard.writeText(text); + navigator.clipboard.writeText(url); } else { // Fallback for browsers that don't support navigator.clipboard const textArea = document.createElement("textarea"); - textArea.value = text; + textArea.value = url; document.body.appendChild(textArea); textArea.select(); document.execCommand("copy"); @@ -11859,7 +48557,7 @@ const convertPdfArrayBuffer = async url => { //`handleSendOTP` function is used to send otp on user's email using `SendOTPMailV1` cloud function const handleSendOTP = async email => { try { - let url = "".concat(localStorage.getItem("baseUrl"), "functions/SendOTPMailV1"); + let url = `${localStorage.getItem("baseUrl")}functions/SendOTPMailV1`; const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId") @@ -11867,7 +48565,7 @@ const handleSendOTP = async email => { const body = { email: email }; - await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post(url, body, { + await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(url, body, { headers: headers }); } catch (error) { @@ -11882,7 +48580,7 @@ const fetchUrl = async (url, pdfName) => { throw new Error("Network response was not ok"); } const blob = await response.blob(); - (0,file_saver__WEBPACK_IMPORTED_MODULE_5__.saveAs)(blob, "".concat(sanitizeFileName(pdfName), "_signed_by_OpenSign\u2122.pdf")); + (0,file_saver__WEBPACK_IMPORTED_MODULE_5__.saveAs)(blob, `${sanitizeFileName(pdfName)}_signed_by_OpenSign™.pdf`); } catch (error) { alert("something went wrong, please try again later."); console.error("Error downloading the file:", error); @@ -11894,7 +48592,7 @@ const handleDownloadPdf = async (pdfDetails, pdfUrl, setIsDownloading) => { setIsDownloading("pdf"); try { // const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl }); - const axiosRes = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/getsignedurl"), { + const axiosRes = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(`${localStorage.getItem("baseUrl")}/functions/getsignedurl`, { url: pdfUrl }, { headers: { @@ -11924,7 +48622,7 @@ const handleToPrint = async (event, pdfUrl, setIsDownloading) => { // const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl }); //`localStorage.getItem("baseUrl")` is also use in public-profile flow for public-sign //if we give this `appInfo.baseUrl` as a base url then in public-profile it will create base url of it's window.location.origin ex- opensign.me which is not base url - const axiosRes = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/getsignedurl"), { + const axiosRes = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(`${localStorage.getItem("baseUrl")}/functions/getsignedurl`, { url: pdfUrl }, { headers: { @@ -11962,24 +48660,21 @@ const handleToPrint = async (event, pdfUrl, setIsDownloading) => { //handle download signed pdf const handleDownloadCertificate = async (pdfDetails, setIsDownloading) => { - var _pdfDetails$; - if ((pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails.length) > 0 && (_pdfDetails$ = pdfDetails[0]) !== null && _pdfDetails$ !== void 0 && _pdfDetails$.CertificateUrl) { + if (pdfDetails?.length > 0 && pdfDetails[0]?.CertificateUrl) { try { - var _pdfDetails$2, _pdfDetails$3; - await fetch(pdfDetails[0] && ((_pdfDetails$2 = pdfDetails[0]) === null || _pdfDetails$2 === void 0 ? void 0 : _pdfDetails$2.CertificateUrl)); - const certificateUrl = pdfDetails[0] && ((_pdfDetails$3 = pdfDetails[0]) === null || _pdfDetails$3 === void 0 ? void 0 : _pdfDetails$3.CertificateUrl); - (0,file_saver__WEBPACK_IMPORTED_MODULE_5__.saveAs)(certificateUrl, "Certificate_signed_by_OpenSign\u2122.pdf"); + await fetch(pdfDetails[0] && pdfDetails[0]?.CertificateUrl); + const certificateUrl = pdfDetails[0] && pdfDetails[0]?.CertificateUrl; + (0,file_saver__WEBPACK_IMPORTED_MODULE_5__.saveAs)(certificateUrl, `Certificate_signed_by_OpenSign™.pdf`); } catch (err) { console.log("err in download in certificate", err); } } else { setIsDownloading("certificate"); try { - var _pdfDetails$4; const data = { - docId: (_pdfDetails$4 = pdfDetails[0]) === null || _pdfDetails$4 === void 0 ? void 0 : _pdfDetails$4.objectId + docId: pdfDetails[0]?.objectId }; - const docDetails = await axios__WEBPACK_IMPORTED_MODULE_8__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getDocument"), data, { + const docDetails = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(`${localStorage.getItem("baseUrl")}functions/getDocument`, data, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -11988,10 +48683,10 @@ const handleDownloadCertificate = async (pdfDetails, setIsDownloading) => { }); if (docDetails.data && docDetails.data.result) { const doc = docDetails.data.result; - if (doc !== null && doc !== void 0 && doc.CertificateUrl) { - await fetch(doc === null || doc === void 0 ? void 0 : doc.CertificateUrl); - const certificateUrl = doc === null || doc === void 0 ? void 0 : doc.CertificateUrl; - (0,file_saver__WEBPACK_IMPORTED_MODULE_5__.saveAs)(certificateUrl, "Certificate_signed_by_OpenSign\u2122.pdf"); + if (doc?.CertificateUrl) { + await fetch(doc?.CertificateUrl); + const certificateUrl = doc?.CertificateUrl; + (0,file_saver__WEBPACK_IMPORTED_MODULE_5__.saveAs)(certificateUrl, `Certificate_signed_by_OpenSign™.pdf`); setIsDownloading(""); } else { setIsDownloading("certificate"); @@ -12021,9 +48716,11 @@ async function findContact(value) { } // `compensateRotation` is used to calculate x and y position of widget on portait, landscape pdf for pdf-lib function compensateRotation(pageRotation, x, y, scale, dimensions, fontSize, updateColorInRgb, font, page) { + // Ensure pageRotation is between 0 and 360 degrees + pageRotation = (pageRotation % 360 + 360) % 360; let rotationRads = pageRotation * Math.PI / 180; - //These coords are now from bottom/left + // Coordinates are from bottom-left let coordsFromBottomLeft = { x: x / scale }; @@ -12043,8 +48740,8 @@ function compensateRotation(pageRotation, x, y, scale, dimensions, fontSize, upd } else if (pageRotation === 270) { drawX = coordsFromBottomLeft.x * Math.cos(rotationRads) - coordsFromBottomLeft.y * Math.sin(rotationRads); drawY = coordsFromBottomLeft.x * Math.sin(rotationRads) + coordsFromBottomLeft.y * Math.cos(rotationRads) + dimensions.height; - } else { - //no rotation + } else if (pageRotation === 0 || pageRotation === 360) { + // No rotation or full rotation drawX = coordsFromBottomLeft.x; drawY = coordsFromBottomLeft.y; } @@ -12065,8 +48762,8 @@ function compensateRotation(pageRotation, x, y, scale, dimensions, fontSize, upd } } -// `getImagePosition` is used to calulcate position of image type widget like x, y, width, height for pdf-lib -function getImagePosition(page, image, sizeRatio) { +// `getWidgetPosition` is used to calulcate position of image type widget like x, y, width, height for pdf-lib +function getWidgetPosition(page, image, sizeRatio) { let pageWidth; // pageHeight; if ([90, 270].includes(page.getRotation().angle)) { @@ -12075,7 +48772,7 @@ function getImagePosition(page, image, sizeRatio) { pageWidth = page.getWidth(); } // eslint-disable-next-line - if (!(image !== null && image !== void 0 && image.hasOwnProperty("vpWidth"))) { + if (!image?.hasOwnProperty("vpWidth")) { image["vpWidth"] = pageWidth; } const pageRatio = pageWidth / (image.vpWidth * sizeRatio); @@ -12095,10 +48792,143 @@ function getImagePosition(page, image, sizeRatio) { //function to use calculate pdf rendering scale in the container const getContainerScale = (pdfOriginalWH, pageNumber, containerWH) => { const getPdfPageWidth = pdfOriginalWH.find(data => data.pageNumber === pageNumber); - const containerScale = (containerWH === null || containerWH === void 0 ? void 0 : containerWH.width) / (getPdfPageWidth === null || getPdfPageWidth === void 0 ? void 0 : getPdfPageWidth.width) || 1; + const containerScale = containerWH?.width / getPdfPageWidth?.width || 1; return containerScale; }; +//function to get current laguage and set it in local +const saveLanguageInLocal = i18n => { + const detectedLanguage = i18n.language || "en"; + localStorage.setItem("i18nextLng", detectedLanguage); +}; +//function to get default signatur eof current user from `contracts_Signature` class +const getDefaultSignature = async objectId => { + try { + const query = new (parse__WEBPACK_IMPORTED_MODULE_3___default().Query)("contracts_Signature"); + query.equalTo("UserId", { + __type: "Pointer", + className: "_User", + objectId: objectId + }); + const result = await query.first(); + if (result) { + const res = JSON.parse(JSON.stringify(result)); + const defaultSignature = res?.ImageURL ? await getBase64FromUrl(res?.ImageURL, true) : ""; + const defaultInitial = res?.Initials ? await getBase64FromUrl(res?.Initials, true) : ""; + return { + status: "success", + res: { + defaultSignature: defaultSignature, + defaultInitial: defaultInitial + } + }; + } + } catch (err) { + console.log("Error: error in fetch data in contracts_Signature", err); + return { + status: "error" + }; + } +}; + +//function to rotate pdf page +async function rotatePdfPage(url, rotateDegree, pageNumber, pdfRotateBase64) { + let file; + + //condition to handle pdf base64 in arrayBuffer format + if (pdfRotateBase64) { + file = base64ToArrayBuffer(pdfRotateBase64); + } else { + //condition to handle pdf url in arrayBuffer format + file = await convertPdfArrayBuffer(url); + } + // Load the existing PDF + const pdfDoc = await pdf_lib__WEBPACK_IMPORTED_MODULE_2__.PDFDocument.load(file); + // Get the page according to page number + const page = pdfDoc.getPage(pageNumber); + //get current page rotation angle + const currentRotation = page.getRotation().angle; + // Apply the rotation in the counterclockwise direction + let newRotation = (currentRotation + rotateDegree) % 360; + // Adjust for negative angles to keep within 0-359 range + if (newRotation < 0) { + newRotation += 360; + } + page.setRotation((0,pdf_lib__WEBPACK_IMPORTED_MODULE_2__.degrees)(newRotation)); + const pdfbase64 = await pdfDoc.saveAsBase64({ + useObjectStreams: false + }); + //convert base64 to arraybuffer is used in pdf-lib + //pdfbase64 is used to show pdf rotated format + const arrayBuffer = base64ToArrayBuffer(pdfbase64); + //`base64` is used to show pdf + return { + arrayBuffer: arrayBuffer, + base64: pdfbase64 + }; +} +function base64ToArrayBuffer(base64) { + // Decode the base64 string to a binary string + const binaryString = atob(base64); + // Create a new ArrayBuffer with the same length as the binary string + const len = binaryString.length; + const bytes = new Uint8Array(len); + // Convert the binary string to a byte array + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + // Return the ArrayBuffer + return bytes.buffer; +} +const convertBase64ToFile = async (pdfName, pdfBase64) => { + const fileName = sanitizeFileName(pdfName) + ".pdf"; + const pdfFile = new (parse__WEBPACK_IMPORTED_MODULE_3___default().File)(fileName, { + base64: pdfBase64 + }); + // Save the Parse File if needed + const pdfData = await pdfFile.save(); + const pdfUrl = pdfData.url(); + return pdfUrl; +}; +const onClickZoomIn = (scale, zoomPercent, setScale, setZoomPercent) => { + setScale(scale + 0.1 * scale); + setZoomPercent(zoomPercent + 10); +}; +const onClickZoomOut = (zoomPercent, scale, setZoomPercent, setScale) => { + if (zoomPercent > 0) { + if (zoomPercent === 10) { + setScale(1); + } else { + setScale(scale - 0.1 * scale); + } + setZoomPercent(zoomPercent - 10); + } +}; + +//function to use remove widgets from current page when user want to rotate page +const handleRemoveWidgets = (setSignerPos, signerPos, pageNumber, setIsRotate) => { + const updatedSignerPos = signerPos.map(placeholderObj => { + return { + ...placeholderObj, + placeHolder: placeholderObj?.placeHolder?.filter(data => data?.pageNumber !== pageNumber) + }; + }); + setSignerPos(updatedSignerPos); + setIsRotate({ + status: false, + degree: 0 + }); +}; +//function to show warning when user rotate page and there are some already widgets on that page +const handleRotateWarning = (signerPos, pageNumber) => { + const placeholderExist = signerPos?.some(placeholderObj => placeholderObj?.placeHolder?.some(data => data?.pageNumber === pageNumber)); + if (placeholderExist) { + return true; + } else { + return false; + } +}; + /***/ }), /***/ "./src/constant/appinfo.js": @@ -12110,18 +48940,30 @@ const getContainerScale = (pdfOriginalWH, pageNumber, containerWH) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ appInfo: () => (/* binding */ appInfo) +/* harmony export */ appInfo: () => (/* binding */ appInfo), +/* harmony export */ serverUrl_fn: () => (/* binding */ serverUrl_fn) /* harmony export */ }); /* harmony import */ var _assets_images_logo_png__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../assets/images/logo.png */ "./src/assets/images/logo.png"); +/* harmony import */ var _const__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./const */ "./src/constant/const.js"); + +function serverUrl_fn() { + let baseUrl; + if (_const__WEBPACK_IMPORTED_MODULE_1__.isEnableSubscription) { + baseUrl = true ? "http://localhost:8080/app" : 0; + } else { + baseUrl = true ? "http://localhost:8080/app" : 0; + } + return baseUrl; +} const appInfo = { applogo: _assets_images_logo_png__WEBPACK_IMPORTED_MODULE_0__["default"], appId: true ? "opensign" : 0, - baseUrl: true ? "http://localhost:8080/app" : 0, + baseUrl: serverUrl_fn(), defaultRole: "contracts_User", - fbAppId: "MISSING_ENV_VAR".REACT_APP_FBAPPID ? "".concat("MISSING_ENV_VAR".REACT_APP_FBAPPID) : "", + fbAppId: "MISSING_ENV_VAR".REACT_APP_FBAPPID ? `${"MISSING_ENV_VAR".REACT_APP_FBAPPID}` : "", fev_Icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAALlJREFUaEPtmN0NwjAMBpNxYDKYiM1Yp90g93CKStH1NbIdfz921Dker2Pc+Js1cDF7MXAxASMGYkAigBI6vh9ZwoXP53uZoAYcvhwdA3mAVbI2aSb+9zFKU4IURB6j/HoPUIEa2G3iGIAhQQDlAUIoE2diabIklISS0NoFPebo77RF6OenEF3QntOm128he0GKrwHyACFoz2MgBqSGkpAEcHs47oHtN5AFakACqMNjQEMoE8SABFCHn4HE2zGHSLeEAAAAAElFTkSuQmCC", - googleClietId: true ? "".concat("918704711393-thhv3re2pfqvve76tgb86ulu1tlpssrk.apps.googleusercontent.com") : 0, + googleClietId: true ? `${"918704711393-thhv3re2pfqvve76tgb86ulu1tlpssrk.apps.googleusercontent.com"}` : 0, metaDescription: "The fastest way to sign PDFs & request signatures from others.", settings: [{ role: "contracts_Admin", @@ -12166,20 +49008,20 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ emailRegex: () => (/* binding */ emailRegex), /* harmony export */ iconColor: () => (/* binding */ iconColor), /* harmony export */ isEnableSubscription: () => (/* binding */ isEnableSubscription), +/* harmony export */ isPublicStaging: () => (/* binding */ isPublicStaging), /* harmony export */ isStaging: () => (/* binding */ isStaging), /* harmony export */ templateCls: () => (/* binding */ templateCls), /* harmony export */ themeColor: () => (/* binding */ themeColor) /* harmony export */ }); -var _process$env$REACT_AP; const contactCls = "contracts_Contactbook"; const templateCls = "contracts_Template"; const documentCls = "contracts_Document"; const themeColor = "#47a3ad"; const iconColor = "#686968"; const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; -const isEnableSubscription = true && ((_process$env$REACT_AP = "true") === null || _process$env$REACT_AP === void 0 ? void 0 : _process$env$REACT_AP.toLowerCase()) === "true" ? true : false; -const isStaging = "http://localhost:3001"; -// window.location.origin === "https://staging-app.opensignlabs.com"; +const isEnableSubscription = true && "true"?.toLowerCase() === "true" ? true : false; +const isStaging = window.location.origin === "https://staging-app.opensignlabs.com"; +const isPublicStaging = window.location.origin === "https://staging.opensign.me"; /***/ }), @@ -12193,12 +49035,17 @@ const isStaging = "http://localhost:3001"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), +/* harmony export */ paidUrl: () => (/* binding */ paidUrl), /* harmony export */ validplan: () => (/* binding */ validplan) /* harmony export */ }); /* harmony import */ var _constant_const__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constant/const */ "./src/constant/const.js"); const plans = [{ planName: "OPENSIGN™ FREE", + code: { + monthly: "freeplan", + yearly: "freeplan" + }, img: "free.png", currency: "", monthlyPrice: "Free", @@ -12214,10 +49061,17 @@ const plans = [{ yearlyBenefits: ["Unlimited envelopes", "Sign documents yourself", "Request signatures from others", "14 field types", "Automatic e-signatures", "Completion certificates", "Send in order", "Document templates", "Import from Dropbox", "Contact book", "Document expiry support", "Decline document support", "Email notifications", "Recipient authentication using OTP", "Bulk send (upto 5 docs)", "Public profiles", "And much more"] }, { planName: "OPENSIGN™ PROFESSIONAL", + code: _constant_const__WEBPACK_IMPORTED_MODULE_0__.isStaging ? { + monthly: "pro-weekly", + yearly: "pro-yearly" + } : { + monthly: "professional-monthly", + yearly: "professional-yearly" + }, img: "professional.png", currency: "$", monthlyPrice: "29.99", - yearlyPrice: "9.99/month", + yearlyPrice: `9.99/month`, subtitle: "Exclusive Access to advanced features.", btn: { text: "Subscribe", @@ -12230,17 +49084,21 @@ const plans = [{ yearlyBenefits: ["Everything in OpenSign™ free", "Field validations", "Regular expression validations", "Organize docs in OpenSign™ Drive", "Webhooks", "Zapier integration", "API Access", "240 API signatures included", "Custom email templates", "Auto reminders", "Bulk send (upto 20 docs)", "Premium Public profile usernames", "Embedding (coming soon)"] }, { planName: "OPENSIGN™ TEAMS", + code: { + monthly: "teams-monthly", + yearly: "teams-yearly" + }, img: "teams.png", currency: "$", - monthlyPrice: "39.99/user", - yearlyPrice: "19.99/user/month", + monthlyPrice: `39.99/user`, + yearlyPrice: `19.99/user/month`, subtitle: "Exclusive Access to advanced features.", btn: { text: "Subscribe", color: "op-btn-accent" }, - url: _constant_const__WEBPACK_IMPORTED_MODULE_0__.isStaging ? "https://billing.zoho.in/subscribe/ed8097273a82b6bf39892c11a3bb3c381eb2705736014cfbdbde1ccf1c7a189d/team-weekly" : "https://billing.opensignlabs.com/subscribe/ef798486e6a0a11ea65f2bae8f2af901237d0702bfaa959406306635d80f138c/teams-monthly", - yearlyUrl: _constant_const__WEBPACK_IMPORTED_MODULE_0__.isStaging ? "https://billing.zoho.in/subscribe/ed8097273a82b6bf39892c11a3bb3c381eb2705736014cfbdbde1ccf1c7a189d/team-weekly" : "https://billing.opensignlabs.com/subscribe/ef798486e6a0a11ea65f2bae8f2af9011a864994bbeeec71fcf106188630199d/teams-yearly", + url: _constant_const__WEBPACK_IMPORTED_MODULE_0__.isStaging ? "https://billing.zoho.in/subscribe/ed8097273a82b6bf39892c11a3bb3c381eb2705736014cfbdbde1ccf1c7a189d/teams-monthly" : "https://billing.opensignlabs.com/subscribe/ef798486e6a0a11ea65f2bae8f2af901237d0702bfaa959406306635d80f138c/teams-monthly", + yearlyUrl: _constant_const__WEBPACK_IMPORTED_MODULE_0__.isStaging ? "https://billing.zoho.in/subscribe/ed8097273a82b6bf39892c11a3bb3c381eb2705736014cfbdbde1ccf1c7a189d/teams-yearly" : "https://billing.opensignlabs.com/subscribe/ef798486e6a0a11ea65f2bae8f2af9011a864994bbeeec71fcf106188630199d/teams-yearly", target: "_self", benefits: ["Everything in OpenSign™ professional", "100 API signatures included", "Teams and Organizations", "Share Templates with teams", "Share Templates with individuals", "DocumentId removal from signed docs", "Bulk send (upto 50 docs)", "Request Payments (coming soon)", "Mobile app (coming soon)"], yearlyBenefits: ["Everything in OpenSign™ professional", "500 API signatures included", "Teams and Organizations", "Share Templates with teams", "Share Templates with individuals", "DocumentId removal from signed docs", "Bulk send (upto 50 docs)", "Request Payments (coming soon)", "Mobile app (coming soon)"] @@ -12248,8 +49106,8 @@ const plans = [{ planName: "OPENSIGN™ ENTERPRISE", img: "enterprise.png", currency: "", - monthlyPrice: "

Request Price

", - yearlyPrice: "

Request Price

", + monthlyPrice: `

Request Price

`, + yearlyPrice: `

Request Price

`, subtitle: "Scalable Features with priority support.", btn: { text: "Contact us", @@ -12268,6 +49126,46 @@ const validplan = { "enterprise-monthly": true, "enterprise-yearly": true }; +const paidUrl = plan => { + const teamperiod = { + "team-weekly": "monthly", + "team-yearly": "yearly", + "teams-monthly": "monthly", + "teams-yearly": "yearly" + }; + const period = teamperiod[plan] || ""; + if (period) { + const extUser = localStorage.getItem("Extand_Class") && JSON.parse(localStorage.getItem("Extand_Class"))?.[0]; + const user = { + name: extUser?.Name, + email: extUser?.Email, + company: extUser?.Company, + phone: extUser?.Phone + }; + // console.log("userDetails ", userDetails); + const fullname = user && user.name ? user.name.split(" ") : ""; + const firstname = fullname?.[0] ? "first_name=" + encodeURIComponent(fullname?.[0]) : ""; + const lastname = fullname?.[1] ? "&last_name=" + encodeURIComponent(fullname?.[1]) : ""; + const name = firstname ? firstname + lastname : ""; + const email = user && user.email ? "&email=" + encodeURIComponent(user.email) : ""; + const company = user && user.company ? "&company_name=" + encodeURIComponent(user.company) : ""; + const phone = user && user.phone ? "&mobile=" + encodeURIComponent(user.phone) : ""; + const allowedUsers = localStorage.getItem("allowedUsers") && localStorage.getItem("allowedUsers") > 0 ? localStorage.getItem("allowedUsers") - 1 : ""; + const quantity = allowedUsers ? `addon_code%5B0%5D=extra-teams-users-${period}&addon_quantity%5B0%5D=${allowedUsers}&` : ""; + const details = "?shipping_country_code=US&billing_country_code=US&billing_state_code=CA&" + quantity + name + email + company + phone; + if (user) { + localStorage.setItem("userDetails", JSON.stringify(user)); + } + const url = { + monthly: _constant_const__WEBPACK_IMPORTED_MODULE_0__.isStaging ? "https://billing.zoho.in/subscribe/ed8097273a82b6bf39892c11a3bb3c381eb2705736014cfbdbde1ccf1c7a189d/teams-monthly" : "https://billing.opensignlabs.com/subscribe/ef798486e6a0a11ea65f2bae8f2af901237d0702bfaa959406306635d80f138c/teams-monthly", + yearly: _constant_const__WEBPACK_IMPORTED_MODULE_0__.isStaging ? "https://billing.zoho.in/subscribe/ed8097273a82b6bf39892c11a3bb3c381eb2705736014cfbdbde1ccf1c7a189d/teams-yearly" : "https://billing.opensignlabs.com/subscribe/ef798486e6a0a11ea65f2bae8f2af9011a864994bbeeec71fcf106188630199d/teams-yearly" + }; + const planurl = url[period] + details; + return planurl; + } else { + return "/subscription"; + } +}; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (plans); /***/ }), @@ -12290,9 +49188,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _styles_signature_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../styles/signature.css */ "./src/styles/signature.css"); /* harmony import */ var parse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! parse */ "./node_modules/parse/index.js"); /* harmony import */ var parse__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(parse__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! axios */ "./node_modules/axios/lib/axios.js"); -/* harmony import */ var react_dnd__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! react-dnd */ "./node_modules/react-dnd/dist/core/DndProvider.js"); -/* harmony import */ var react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! react-dnd-html5-backend */ "./node_modules/react-dnd-html5-backend/dist/index.js"); +/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! axios */ "./node_modules/axios/lib/axios.js"); +/* harmony import */ var react_dnd__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! react-dnd */ "./node_modules/react-dnd/dist/core/DndProvider.js"); +/* harmony import */ var react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! react-dnd-html5-backend */ "./node_modules/react-dnd-html5-backend/dist/index.js"); /* harmony import */ var _components_pdf_SignPad__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/pdf/SignPad */ "./src/components/pdf/SignPad.js"); /* harmony import */ var _components_pdf_RenderAllPdfPage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/pdf/RenderAllPdfPage */ "./src/components/pdf/RenderAllPdfPage.js"); /* harmony import */ var reactour__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! reactour */ "./node_modules/reactour/dist/reactour.esm.js"); @@ -12311,10 +49209,12 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../primitives/ModalUi */ "./src/primitives/ModalUi.js"); /* harmony import */ var _primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../primitives/TourContentWithBtn */ "./src/primitives/TourContentWithBtn.js"); /* harmony import */ var _primitives_Loader__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../primitives/Loader */ "./src/primitives/Loader.js"); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs"); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs"); /* harmony import */ var _components_pdf_SignerListComponent__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../components/pdf/SignerListComponent */ "./src/components/pdf/SignerListComponent.js"); /* harmony import */ var _components_pdf_VerifyEmail__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../components/pdf/VerifyEmail */ "./src/components/pdf/VerifyEmail.js"); /* harmony import */ var _components_pdf_PdfZoom__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../components/pdf/PdfZoom */ "./src/components/pdf/PdfZoom.js"); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); + @@ -12344,7 +49244,9 @@ __webpack_require__.r(__webpack_exports__); function PdfRequestFiles(props) { - var _window$location, _window$location2, _pdfDetails$12, _pdfDetails$13; + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_24__.useTranslation)(); const [pdfDetails, setPdfDetails] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]); const [signedSigners, setSignedSigners] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]); const [unsignedSigners, setUnSignedSigners] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]); @@ -12368,7 +49270,7 @@ function PdfRequestFiles(props) { const [tourStatus, setTourStatus] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]); const [isLoading, setIsLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ isLoad: true, - message: "This might take some time" + message: t("loading-mssg") }); const [defaultSignImg, setDefaultSignImg] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(); const [isDocId, setIsDocId] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false); @@ -12419,7 +49321,6 @@ function PdfRequestFiles(props) { const [otp, setOtp] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); const [contractName, setContractName] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); const [zoomPercent, setZoomPercent] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0); - const [totalZoomPercent, setTotalZoomPercent] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(); const [scale, setScale] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(1); const [uniqueId, setUniqueId] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); const [isPublicTemplate, setIsPublicTemplate] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false); @@ -12433,18 +49334,22 @@ function PdfRequestFiles(props) { const [res, setRes] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({}); const [documentId, setDocumentId] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); const [isPublicContact, setIsPublicContact] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false); - const isHeader = (0,react_redux__WEBPACK_IMPORTED_MODULE_24__.useSelector)(state => state.showHeader); + const [pdfArrayBuffer, setPdfArrayBuffer] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); + const isHeader = (0,react_redux__WEBPACK_IMPORTED_MODULE_25__.useSelector)(state => state.showHeader); const divRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); const isMobile = window.innerWidth < 767; let isGuestSignFlow = false; let sendmail; let getDocId = ""; - const route = !props.templateId && window.location.pathname; - const getQuery = !props.templateId && ((_window$location = window.location) === null || _window$location === void 0 ? void 0 : _window$location.search) && ((_window$location2 = window.location) === null || _window$location2 === void 0 || (_window$location2 = _window$location2.search) === null || _window$location2 === void 0 ? void 0 : _window$location2.split("?")); + const route = !props.templateId && window.location.pathname; //'/load/recipientSignPdf/TOAVuhXbfw/fPAKdK1qgX' + //window.location.search = ?sendmail=false + const getQuery = !props.templateId && window.location?.search && window.location?.search?.split("?"); //['','sendmail=false'] + + //'sendmail=false' if (getQuery) { - sendmail = getQuery[1].split("=")[1]; + sendmail = getQuery[1].split("=")[1]; //false } - const checkSplit = route && (route === null || route === void 0 ? void 0 : route.split("/")); + const checkSplit = route && route?.split("/"); // ['', 'load', 'recipientSignPdf', 'TOAVuhXbfw', 'fPAKdK1qgX'] if (checkSplit && checkSplit.length > 4) { isGuestSignFlow = true; getDocId = checkSplit[3]; @@ -12482,30 +49387,31 @@ function PdfRequestFiles(props) { const handleResend = async e => { e.preventDefault(); setOtpLoader(true); - const localuser = localStorage.getItem("Parse/".concat(localStorage.getItem("parseAppId"), "/currentUser")); + const localuser = localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`); const currentUser = JSON.parse(localuser); - await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleSendOTP)(currentUser === null || currentUser === void 0 ? void 0 : currentUser.email); + await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleSendOTP)(currentUser?.email); setOtpLoader(false); - alert("OTP sent on you email"); + alert(t("otp-sent-alert")); }; //`handleVerifyEmail` function is used to verify email with otp const handleVerifyEmail = async e => { e.preventDefault(); setOtpLoader(true); - const localuser = localStorage.getItem("Parse/".concat(localStorage.getItem("parseAppId"), "/currentUser")); + const localuser = localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`); const currentUser = JSON.parse(localuser); try { const resEmail = await parse__WEBPACK_IMPORTED_MODULE_4___default().Cloud.run("verifyemail", { otp: otp, - email: currentUser === null || currentUser === void 0 ? void 0 : currentUser.email + email: currentUser?.email }); - if ((resEmail === null || resEmail === void 0 ? void 0 : resEmail.message) === "Email is verified.") { + if (resEmail?.message === "Email is verified.") { setIsEmailVerified(true); - } else if ((resEmail === null || resEmail === void 0 ? void 0 : resEmail.message) === "Email is already verified.") { + alert(t("Email-verified-alert-1")); + } else if (resEmail?.message === "Email is already verified.") { setIsEmailVerified(true); + alert(t("Email-verified-alert-2")); } setOtp(""); - alert(resEmail.message); setIsVerifyModal(false); //handleRecipientSign(); } catch (error) { @@ -12517,16 +49423,19 @@ function PdfRequestFiles(props) { //`handleVerifyBtn` function is used to send otp on user mail const handleVerifyBtn = async () => { setIsVerifyModal(true); - const localuser = localStorage.getItem("Parse/".concat(localStorage.getItem("parseAppId"), "/currentUser")); + const localuser = localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`); const currentUser = JSON.parse(localuser); - await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleSendOTP)(currentUser === null || currentUser === void 0 ? void 0 : currentUser.email); + await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleSendOTP)(currentUser?.email); + }; + const handleNavigation = () => { + window.location.href = "/subscription"; }; async function checkIsSubscribed(extUserId, contactId) { const isGuestSign = isGuestSignFlow || false; const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.fetchSubscription)(extUserId, contactId, isGuestSign); const plan = res.plan; - const billingDate = res === null || res === void 0 ? void 0 : res.billingDate; - const status = res === null || res === void 0 ? void 0 : res.status; + const billingDate = res?.billingDate; + const status = res?.status; if (plan === "freeplan") { return true; } else if (billingDate) { @@ -12537,7 +49446,7 @@ function PdfRequestFiles(props) { if (isGuestSign) { setIsSubscriptionExpired(true); } else { - window.location.href = "/subscription"; + handleNavigation(plan); } } } else if (isGuestSign) { @@ -12551,7 +49460,7 @@ function PdfRequestFiles(props) { if (isGuestSign) { setIsSubscriptionExpired(true); } else { - window.location.href = "/subscription"; + handleNavigation(res.plan); } } } @@ -12562,7 +49471,7 @@ function PdfRequestFiles(props) { templateId: props.templateId, ispublic: true }; - const templateDeatils = await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/getTemplate"), params, { + const templateDeatils = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(`${localStorage.getItem("baseUrl")}functions/getTemplate`, params, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -12570,313 +49479,324 @@ function PdfRequestFiles(props) { } }); const documentData = templateDeatils.data && templateDeatils.data.result ? [templateDeatils.data.result] : []; - if (documentData && documentData.length > 0) { - var _documentData$, _documentData$2, _documentData$3; - setIsPublicTemplate(true); - const getPublicRole = (_documentData$ = documentData[0]) === null || _documentData$ === void 0 ? void 0 : _documentData$.PublicRole[0]; - const getUniqueIdDetails = (_documentData$2 = documentData[0]) === null || _documentData$2 === void 0 ? void 0 : _documentData$2.Placeholders.find(x => x.Role === getPublicRole); - if (getUniqueIdDetails) { - setUniqueId(getUniqueIdDetails.Id); - } - setSignerPos((_documentData$3 = documentData[0]) === null || _documentData$3 === void 0 ? void 0 : _documentData$3.Placeholders); - let placeholdersOrSigners = []; - // const placeholder = documentData[0]?.Placeholders; - for (const placeholder of documentData[0].Placeholders) { - //`emailExist` variable to handle condition for quick send flow and show unsigned signers list - const signerIdExist = placeholder === null || placeholder === void 0 ? void 0 : placeholder.signerObjId; - if (signerIdExist) { - const getSignerData = documentData[0].Signers.find(data => data.objectId === (placeholder === null || placeholder === void 0 ? void 0 : placeholder.signerObjId)); - placeholdersOrSigners.push(getSignerData); + if (documentData && documentData[0]?.error) { + props?.setTemplateStatus({ + status: "Invalid" + }); + } else if (documentData && documentData.length > 0) { + if (documentData[0]?.IsPublic) { + props?.setTemplateStatus({ + status: "Success" + }); + const url = documentData[0] && (documentData[0]?.SignedUrl || documentData[0]?.URL); + if (url) { + //convert document url in array buffer format to use embed widgets in pdf using pdf-lib + const arrayBuffer = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.convertPdfArrayBuffer)(url); + if (arrayBuffer === "Error") { + setHandleError(t("something-went-wrong-mssg")); + } else { + setPdfArrayBuffer(arrayBuffer); + } } else { - placeholdersOrSigners.push(placeholder); + setHandleError(t("something-went-wrong-mssg")); + } + setIsPublicTemplate(true); + const getPublicRole = documentData[0]?.PublicRole[0]; + const getUniqueIdDetails = documentData[0]?.Placeholders.find(x => x.Role === getPublicRole); + if (getUniqueIdDetails) { + setUniqueId(getUniqueIdDetails.Id); + } + setSignerPos(documentData[0]?.Placeholders); + let placeholdersOrSigners = []; + // const placeholder = documentData[0]?.Placeholders; + for (const placeholder of documentData[0].Placeholders) { + //`emailExist` variable to handle condition for quick send flow and show unsigned signers list + const signerIdExist = placeholder?.signerObjId; + if (signerIdExist) { + const getSignerData = documentData[0].Signers.find(data => data.objectId === placeholder?.signerObjId); + placeholdersOrSigners.push(getSignerData); + } else { + placeholdersOrSigners.push(placeholder); + } } + setUnSignedSigners(placeholdersOrSigners); + setPdfDetails(documentData); + setIsLoading({ + isLoad: false + }); + } else { + props?.setTemplateStatus({ + status: "Private" + }); } - setUnSignedSigners(placeholdersOrSigners); - setPdfDetails(documentData); - setIsLoading({ - isLoad: false - }); - } else if (documentData === "Error: Something went wrong!" || documentData.result && documentData.result.error) { - console.log("err in get template details "); - setHandleError("Error: Something went wrong!"); - setIsLoading({ - isLoad: false - }); } else { - setHandleError("No Data Found!"); - setIsLoading({ - isLoad: false + props?.setTemplateStatus({ + status: "Invalid" }); } } catch (err) { - var _err$response; console.log("err in get template details ", err); - if ((err === null || err === void 0 || (_err$response = err.response) === null || _err$response === void 0 || (_err$response = _err$response.data) === null || _err$response === void 0 ? void 0 : _err$response.code) === 101) { - setHandleError("Error: Template not found!"); + if (err?.response?.data?.code === 101) { + setHandleError(t("error-template")); } else { - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); } } }; //function for get document details for perticular signer with signer'object id const getDocumentDetails = async (docId, isNextUser) => { - const senderUser = localStorage.getItem("Parse/".concat(localStorage.getItem("parseAppId"), "/currentUser")); - const jsonSender = JSON.parse(senderUser); - let currUserId; - //getting document details - const documentData = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractDocument)(documentId || docId); - if (documentData && documentData.length > 0) { - var _documentData$4; - setExtUserId((_documentData$4 = documentData[0]) === null || _documentData$4 === void 0 || (_documentData$4 = _documentData$4.ExtUserPtr) === null || _documentData$4 === void 0 ? void 0 : _documentData$4.objectId); - const isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted; - const expireDate = documentData[0].ExpiryDate.iso; - const declined = documentData[0].IsDeclined && documentData[0].IsDeclined; - const expireUpdateDate = new Date(expireDate).getTime(); - const currDate = new Date().getTime(); - const getSigners = documentData[0].Signers; - const getCurrentSigner = getSigners && getSigners.filter(data => data.UserId.objectId === (jsonSender === null || jsonSender === void 0 ? void 0 : jsonSender.objectId)); - currUserId = getCurrentSigner[0] ? getCurrentSigner[0].objectId : ""; - if (_constant_const__WEBPACK_IMPORTED_MODULE_1__.isEnableSubscription) { - var _documentData$5; - await checkIsSubscribed((_documentData$5 = documentData[0]) === null || _documentData$5 === void 0 || (_documentData$5 = _documentData$5.ExtUserPtr) === null || _documentData$5 === void 0 ? void 0 : _documentData$5.objectId, currUserId); - } - if (currUserId) { - setSignerObjectId(currUserId); - } - if (documentData[0].SignedUrl) { - setPdfUrl(documentData[0].SignedUrl); - } else { - setPdfUrl(documentData[0].URL); - } - if (isCompleted) { - setIsSigned(true); - const data = { - isCertificate: true, - isModal: true - }; - setAlreadySign(true); - setIsCompleted(data); - setIsCelebration(true); - setTimeout(() => { - setIsCelebration(false); - }, 5000); - } else if (declined) { - const currentDecline = { - currnt: "another", - isDeclined: true - }; - setIsDecline(currentDecline); - } else if (currDate > expireUpdateDate) { - const expireDateFormat = moment__WEBPACK_IMPORTED_MODULE_9___default()(new Date(expireDate)).format("MMM DD, YYYY"); - setIsExpired(true); - setExpiredDate(expireDateFormat); - } // Check if the current signer is not a last signer and handle the complete message. - else if (isNextUser) { - setIsCelebration(true); - setTimeout(() => { - setIsCelebration(false); - }, 5000); - setIsCompleted({ - isModal: true, - message: "You have successfully signed the document. You can download or print a copy of the partially signed document. A copy of the digitally signed document will be sent to the owner over email once it is signed by all signers." - }); - } else { - if (currUserId) { - const checkCurrentUser = documentData[0].Placeholders.find(data => (data === null || data === void 0 ? void 0 : data.signerObjId) === currUserId); - if (checkCurrentUser) { - setCurrentSigner(true); + try { + const senderUser = localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`); + const jsonSender = JSON.parse(senderUser); + let currUserId; + //getting document details + const documentData = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractDocument)(documentId || docId); + if (documentData && documentData.length > 0) { + const url = documentData[0] && (documentData[0]?.SignedUrl || documentData[0]?.URL); + if (url) { + //convert document url in array buffer format to use embed widgets in pdf using pdf-lib + const arrayBuffer = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.convertPdfArrayBuffer)(url); + if (arrayBuffer === "Error") { + setHandleError(t("something-went-wrong-mssg")); + } else { + setPdfArrayBuffer(arrayBuffer); } + } else { + setHandleError(t("something-went-wrong-mssg")); + } + setExtUserId(documentData[0]?.ExtUserPtr?.objectId); + const isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted; + const expireDate = documentData[0].ExpiryDate.iso; + const declined = documentData[0].IsDeclined && documentData[0].IsDeclined; + const expireUpdateDate = new Date(expireDate).getTime(); + const currDate = new Date().getTime(); + const getSigners = documentData[0].Signers; + const getCurrentSigner = getSigners && getSigners.filter(data => data.UserId.objectId === jsonSender?.objectId); + currUserId = getCurrentSigner[0] ? getCurrentSigner[0].objectId : ""; + if (_constant_const__WEBPACK_IMPORTED_MODULE_1__.isEnableSubscription) { + await checkIsSubscribed(documentData[0]?.ExtUserPtr?.objectId, currUserId); } - } - const audittrailData = documentData[0].AuditTrail && documentData[0].AuditTrail.length > 0 && documentData[0].AuditTrail.filter(data => data.Activity === "Signed"); - const checkAlreadySign = documentData[0].AuditTrail && documentData[0].AuditTrail.length > 0 && documentData[0].AuditTrail.filter(data => data.UserPtr.objectId === currUserId && data.Activity === "Signed"); - if (checkAlreadySign && checkAlreadySign[0] && checkAlreadySign.length > 0) { - setAlreadySign(true); - } else { - const obj = documentData === null || documentData === void 0 ? void 0 : documentData[0]; - setSendInOrder((obj === null || obj === void 0 ? void 0 : obj.SendinOrder) || false); - if (obj && obj.Signers && obj.Signers.length > 0 && obj.Placeholders && obj.Placeholders.length > 0) { - var _documentData$6, _documentData$7, _documentData$0$Signe; - const params = { - event: "viewed", - contactId: currUserId, - body: { - objectId: documentData === null || documentData === void 0 ? void 0 : documentData[0].objectId, - file: (documentData === null || documentData === void 0 || (_documentData$6 = documentData[0]) === null || _documentData$6 === void 0 ? void 0 : _documentData$6.SignedUrl) || (documentData === null || documentData === void 0 || (_documentData$7 = documentData[0]) === null || _documentData$7 === void 0 ? void 0 : _documentData$7.URL), - name: documentData === null || documentData === void 0 ? void 0 : documentData[0].Name, - note: (documentData === null || documentData === void 0 ? void 0 : documentData[0].Note) || "", - description: (documentData === null || documentData === void 0 ? void 0 : documentData[0].Description) || "", - signers: documentData === null || documentData === void 0 || (_documentData$0$Signe = documentData[0].Signers) === null || _documentData$0$Signe === void 0 ? void 0 : _documentData$0$Signe.map(x => ({ - name: x === null || x === void 0 ? void 0 : x.Name, - email: x === null || x === void 0 ? void 0 : x.Email, - phone: x === null || x === void 0 ? void 0 : x.Phone - })), - viewedBy: jsonSender.email, - viewedAt: new Date(), - createdAt: documentData === null || documentData === void 0 ? void 0 : documentData[0].createdAt - } + if (currUserId) { + setSignerObjectId(currUserId); + } + if (documentData[0].SignedUrl) { + setPdfUrl(documentData[0].SignedUrl); + } else { + setPdfUrl(documentData[0].URL); + } + if (isCompleted) { + setIsSigned(true); + const data = { + isCertificate: true, + isModal: true }; - try { - await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/callwebhook"), params, { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessiontoken: localStorage.getItem("accesstoken") - } - }); - } catch (err) { - console.log("Err ", err); + setAlreadySign(true); + setIsCompleted(data); + setIsCelebration(true); + setTimeout(() => setIsCelebration(false), 5000); + } else if (declined) { + const currentDecline = { + currnt: "another", + isDeclined: true + }; + setIsDecline(currentDecline); + } else if (currDate > expireUpdateDate) { + const expireDateFormat = moment__WEBPACK_IMPORTED_MODULE_9___default()(new Date(expireDate)).format("MMM DD, YYYY"); + setIsExpired(true); + setExpiredDate(expireDateFormat); + } // Check if the current signer is not a last signer and handle the complete message. + else if (isNextUser) { + setIsCelebration(true); + setTimeout(() => setIsCelebration(false), 5000); + setIsCompleted({ + isModal: true, + message: t("document-signed-alert-1") + }); + } else { + if (currUserId) { + const checkCurrentUser = documentData[0].Placeholders.find(data => data?.signerObjId === currUserId); + if (checkCurrentUser) { + setCurrentSigner(true); + } } } - } - let signers = []; - let unSignedSigner = []; - const placeholdersOrSigners = []; - for (const placeholder of documentData[0].Placeholders) { - //`emailExist` variable to handle condition for quick send flow and show unsigned signers list - const signerIdExist = placeholder === null || placeholder === void 0 ? void 0 : placeholder.signerObjId; - if (signerIdExist) { - const getSignerData = documentData[0].Signers.find(data => data.objectId === (placeholder === null || placeholder === void 0 ? void 0 : placeholder.signerObjId)); - placeholdersOrSigners.push(getSignerData); + const audittrailData = documentData[0].AuditTrail && documentData[0].AuditTrail.length > 0 && documentData[0].AuditTrail.filter(data => data.Activity === "Signed"); + const checkAlreadySign = documentData[0].AuditTrail && documentData[0].AuditTrail.length > 0 && documentData[0].AuditTrail.filter(data => data.UserPtr?.objectId === currUserId && data.Activity === "Signed"); + if (checkAlreadySign && checkAlreadySign[0] && checkAlreadySign.length > 0) { + setAlreadySign(true); } else { - placeholdersOrSigners.push(placeholder); - } - } - //condition to check already signed document by someone - if (audittrailData && audittrailData.length > 0) { - setIsDocId(true); - for (const item of placeholdersOrSigners) { - const checkEmail = item === null || item === void 0 ? void 0 : item.email; - //if email exist then compare user signed by using email else signers objectId - const emailOrId = checkEmail ? item.email : item.objectId; - //`isSignedSignature` variable to handle break loop whenever it get true - let isSignedSignature = false; - //checking the signer who signed the document by using audit trail details. - //and save signedSigners and unsignedSigners details - for (const doc of audittrailData) { - const signedExist = checkEmail ? doc === null || doc === void 0 ? void 0 : doc.UserPtr.Email : doc === null || doc === void 0 ? void 0 : doc.UserPtr.objectId; - if (emailOrId === signedExist) { - signers.push({ - ...item + const obj = documentData?.[0]; + setSendInOrder(obj?.SendinOrder || false); + if (obj && obj.Signers && obj.Signers.length > 0 && obj.Placeholders && obj.Placeholders.length > 0) { + const params = { + event: "viewed", + contactId: currUserId, + body: { + objectId: documentData?.[0].objectId, + file: documentData?.[0]?.SignedUrl || documentData?.[0]?.URL, + name: documentData?.[0].Name, + note: documentData?.[0].Note || "", + description: documentData?.[0].Description || "", + signers: documentData?.[0].Signers?.map(x => ({ + name: x?.Name, + email: x?.Email, + phone: x?.Phone + })), + viewedBy: jsonSender.email, + viewedAt: new Date(), + createdAt: documentData?.[0].createdAt + } + }; + try { + await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(`${localStorage.getItem("baseUrl")}functions/callwebhook`, params, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessiontoken: localStorage.getItem("accesstoken") + } }); - isSignedSignature = true; - break; + } catch (err) { + console.log("Err ", err); } } - if (!isSignedSignature) { - unSignedSigner.push({ - ...item - }); + } + let signers = []; + let unSignedSigner = []; + const placeholdersOrSigners = []; + for (const placeholder of documentData[0].Placeholders) { + //`emailExist` variable to handle condition for quick send flow and show unsigned signers list + const signerIdExist = placeholder?.signerObjId; + if (signerIdExist) { + const getSignerData = documentData[0].Signers.find(data => data.objectId === placeholder?.signerObjId); + placeholdersOrSigners.push(getSignerData); + } else { + placeholdersOrSigners.push(placeholder); } } - setSignedSigners(signers); - setUnSignedSigners(unSignedSigner); - setSignerPos(documentData[0].Placeholders); - } else { - //else condition is show there are no details in audit trail then direct push all signers details - //in unsignedsigners array - setUnSignedSigners(placeholdersOrSigners); - setSignerPos(documentData[0].Placeholders); - } - setPdfDetails(documentData); - //checking if condition current user already sign or owner does not exist as a signer or document has been declined by someone or document has been expired - //then stop to display tour message - if (checkAlreadySign && checkAlreadySign[0] && checkAlreadySign.length > 0 || !currUserId || declined || currDate > expireUpdateDate) { - setRequestSignTour(true); - } else { - //else condition to check current user exist in contracts_Users class and check tour message status - //if not then check user exist in contracts_Contactbook class and check tour message statu - const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)(); - if (res === "Error: Something went wrong!") { - setHandleError("Error: Something went wrong!"); - } else if (res[0] && res !== null && res !== void 0 && res.length) { - setContractName("_Users"); - currUserId = res[0].objectId; - setSignerUserId(currUserId); - const tourData = res[0].TourStatus && res[0].TourStatus; - if (tourData && tourData.length > 0) { - var _checkTourRequest$; - const checkTourRequest = tourData.filter(data => data === null || data === void 0 ? void 0 : data.requestSign); - setTourStatus(tourData); - setRequestSignTour(((_checkTourRequest$ = checkTourRequest[0]) === null || _checkTourRequest$ === void 0 ? void 0 : _checkTourRequest$.requestSign) || false); - } - } else if ((res === null || res === void 0 ? void 0 : res.length) === 0) { - const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contactBook)(currUserId); + //condition to check already signed document by someone + if (audittrailData && audittrailData.length > 0) { + setIsDocId(true); + for (const item of placeholdersOrSigners) { + const checkEmail = item?.email; + //if email exist then compare user signed by using email else signers objectId + const emailOrId = checkEmail ? item.email : item?.objectId; + //`isSignedSignature` variable to handle break loop whenever it get true + let isSignedSignature = false; + //checking the signer who signed the document by using audit trail details. + //and save signedSigners and unsignedSigners details + for (const doc of audittrailData) { + const signedExist = checkEmail ? doc?.UserPtr?.Email : doc?.UserPtr?.objectId; + if (emailOrId === signedExist) { + signers.push({ + ...item + }); + isSignedSignature = true; + break; + } + } + if (!isSignedSignature) { + unSignedSigner.push({ + ...item + }); + } + } + setSignedSigners(signers); + setUnSignedSigners(unSignedSigner); + setSignerPos(documentData[0].Placeholders); + } else { + //else condition is show there are no details in audit trail then direct push all signers details + //in unsignedsigners array + setUnSignedSigners(placeholdersOrSigners); + setSignerPos(documentData[0].Placeholders); + } + setPdfDetails(documentData); + //checking if condition current user already sign or owner does not exist as a signer or document has been declined by someone or document has been expired + //then stop to display tour message + if (checkAlreadySign && checkAlreadySign[0] && checkAlreadySign.length > 0 || !currUserId || declined || currDate > expireUpdateDate) { + setRequestSignTour(true); + } else { + //else condition to check current user exist in contracts_Users class and check tour message status + //if not then check user exist in contracts_Contactbook class and check tour message statu + const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)(); if (res === "Error: Something went wrong!") { - setHandleError("Error: Something went wrong!"); - } else if (res[0] && res.length) { - setContractName("_Contactbook"); - const objectId = res[0].objectId; - setSignerUserId(objectId); + setHandleError(t("something-went-wrong-mssg")); + } else if (res[0] && res?.length) { + setContractName("_Users"); + currUserId = res[0].objectId; + setSignerUserId(currUserId); const tourData = res[0].TourStatus && res[0].TourStatus; if (tourData && tourData.length > 0) { - var _checkTourRequest$2; - const checkTourRequest = tourData.filter(data => data === null || data === void 0 ? void 0 : data.requestSign); + const checkTourRequest = tourData.filter(data => data?.requestSign); setTourStatus(tourData); - setRequestSignTour(((_checkTourRequest$2 = checkTourRequest[0]) === null || _checkTourRequest$2 === void 0 ? void 0 : _checkTourRequest$2.requestSign) || false); + setRequestSignTour(checkTourRequest[0]?.requestSign || false); + } + } else if (res?.length === 0) { + const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contactBook)(currUserId); + if (res === "Error: Something went wrong!") { + setHandleError(t("something-went-wrong-mssg")); + } else if (res[0] && res.length) { + setContractName("_Contactbook"); + const objectId = res[0].objectId; + setSignerUserId(objectId); + const tourData = res[0].TourStatus && res[0].TourStatus; + if (tourData && tourData.length > 0) { + const checkTourRequest = tourData.filter(data => data?.requestSign); + setTourStatus(tourData); + setRequestSignTour(checkTourRequest[0]?.requestSign || false); + } + } else if (res.length === 0) { + setHandleError(t("user-not-exist")); } - } else if (res.length === 0) { - setHandleError("Error: User does not exist!"); } } + setIsUiLoading(false); + } else if (documentData === "Error: Something went wrong!" || documentData.result && documentData.result.error) { + setHandleError(t("something-went-wrong-mssg")); + setIsLoading({ + isLoad: false + }); + console.log("err in getDocument cloud function "); + } else { + setHandleError(t("no-data")); + setIsUiLoading({ + isLoad: false + }); + } + //function to get default signatur eof current user from `contracts_Signature` class + const defaultSignRes = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.getDefaultSignature)(jsonSender.objectId); + if (defaultSignRes?.status === "success") { + setDefaultSignImg(defaultSignRes?.res?.defaultSignature); + setMyInitial(defaultSignRes?.res?.defaultInitial); + } else if (defaultSignRes?.status === "error") { + setHandleError("Error: Something went wrong!"); } - setIsUiLoading(false); - } else if (documentData === "Error: Something went wrong!" || documentData.result && documentData.result.error) { - setHandleError("Error: Something went wrong!"); setIsLoading({ isLoad: false }); - console.log("err in getDocument cloud function "); - } else { - setHandleError("No Data Found!"); - setIsUiLoading({ - isLoad: false - }); - } - await axios__WEBPACK_IMPORTED_MODULE_25__["default"].get("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Signature?where={\"UserId\": {\"__type\": \"Pointer\",\"className\": \"_User\", \"objectId\":\"").concat(jsonSender === null || jsonSender === void 0 ? void 0 : jsonSender.objectId, "\"}}"), { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - }).then(Listdata => { - const json = Listdata.data; - const res = json.results; - if (res[0] && res.length > 0) { - var _res$; - setDefaultSignImg(res[0].ImageURL); - setMyInitial((_res$ = res[0]) === null || _res$ === void 0 ? void 0 : _res$.Initials); - } - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - }).catch(err => { - console.log("Err in contracts_Signature class", err); + } catch (err) { + console.log("Error: error in getDocumentDetails", err); setHandleError("Error: Something went wrong!"); setIsLoading({ isLoad: false }); - }); + } }; //function for embed signature or image url in pdf async function embedWidgetsData() { - var _currentUser, _currentUser4; //for emailVerified data checking first in localstorage - const localuser = localStorage.getItem("Parse/".concat(localStorage.getItem("parseAppId"), "/currentUser")); + const localuser = localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`); let currentUser = JSON.parse(localuser); //if emailVerified data is not present in local user details then fetch again in _User class - if (!((_currentUser = currentUser) !== null && _currentUser !== void 0 && _currentUser.emailVerified)) { - var _currentUser2, _currentUser3; + if (!currentUser?.emailVerified) { const userQuery = new (parse__WEBPACK_IMPORTED_MODULE_4___default().Query)((parse__WEBPACK_IMPORTED_MODULE_4___default().User)); - const getUser = await userQuery.get((_currentUser2 = currentUser) === null || _currentUser2 === void 0 ? void 0 : _currentUser2.objectId, { - sessionToken: (_currentUser3 = currentUser) === null || _currentUser3 === void 0 ? void 0 : _currentUser3.sessionToken + const getUser = await userQuery.get(currentUser?.objectId, { + sessionToken: currentUser?.sessionToken }); if (getUser) { currentUser = JSON.parse(JSON.stringify(getUser)); } } - let isEmailVerified = (_currentUser4 = currentUser) === null || _currentUser4 === void 0 ? void 0 : _currentUser4.emailVerified; + let isEmailVerified = currentUser?.emailVerified; //check if isEmailVerified then go on next step if (isEmailVerified) { setIsEmailVerified(isEmailVerified); @@ -12893,9 +49813,8 @@ function PdfRequestFiles(props) { for (let i = 0; i < checkUser[0].placeHolder.length; i++) { for (let j = 0; j < checkUser[0].placeHolder[i].pos.length; j++) { - var _checkUser$0$placeHol; //get current page - const updatePage = (_checkUser$0$placeHol = checkUser[0].placeHolder[i]) === null || _checkUser$0$placeHol === void 0 ? void 0 : _checkUser$0$placeHol.pageNumber; + const updatePage = checkUser[0].placeHolder[i]?.pageNumber; //checking checbox type widget checkboxExist = checkUser[0].placeHolder[i].pos[j].type === "checkbox"; //checking radio button type widget @@ -12903,25 +49822,21 @@ function PdfRequestFiles(props) { //condition to check checkbox widget exist or not if (checkboxExist) { //get all required type checkbox - requiredCheckbox = checkUser[0].placeHolder[i].pos.filter(position => { - var _position$options; - return !((_position$options = position.options) !== null && _position$options !== void 0 && _position$options.isReadOnly) && position.type === "checkbox"; - }); + requiredCheckbox = checkUser[0].placeHolder[i].pos.filter(position => !position.options?.isReadOnly && position.type === "checkbox"); //if required type checkbox data exit then check user checked all checkbox or some checkbox remain to check //also validate to minimum and maximum required checkbox if (requiredCheckbox && requiredCheckbox.length > 0) { for (let i = 0; i < requiredCheckbox.length; i++) { - var _requiredCheckbox$i$o, _requiredCheckbox$i$o2, _requiredCheckbox$i$o3, _requiredCheckbox$i$o4; //get minimum required count if exit - const minCount = (_requiredCheckbox$i$o = requiredCheckbox[i].options) === null || _requiredCheckbox$i$o === void 0 || (_requiredCheckbox$i$o = _requiredCheckbox$i$o.validation) === null || _requiredCheckbox$i$o === void 0 ? void 0 : _requiredCheckbox$i$o.minRequiredCount; + const minCount = requiredCheckbox[i].options?.validation?.minRequiredCount; const parseMin = minCount && parseInt(minCount); //get maximum required count if exit - const maxCount = (_requiredCheckbox$i$o2 = requiredCheckbox[i].options) === null || _requiredCheckbox$i$o2 === void 0 || (_requiredCheckbox$i$o2 = _requiredCheckbox$i$o2.validation) === null || _requiredCheckbox$i$o2 === void 0 ? void 0 : _requiredCheckbox$i$o2.maxRequiredCount; + const maxCount = requiredCheckbox[i].options?.validation?.maxRequiredCount; const parseMax = maxCount && parseInt(maxCount); //in `response` variable is used to get how many checkbox checked by user - const response = (_requiredCheckbox$i$o3 = requiredCheckbox[i].options) === null || _requiredCheckbox$i$o3 === void 0 || (_requiredCheckbox$i$o3 = _requiredCheckbox$i$o3.response) === null || _requiredCheckbox$i$o3 === void 0 ? void 0 : _requiredCheckbox$i$o3.length; + const response = requiredCheckbox[i].options?.response?.length; //in `defaultValue` variable is used to get how many checkbox checked by default - const defaultValue = (_requiredCheckbox$i$o4 = requiredCheckbox[i].options) === null || _requiredCheckbox$i$o4 === void 0 || (_requiredCheckbox$i$o4 = _requiredCheckbox$i$o4.defaultValue) === null || _requiredCheckbox$i$o4 === void 0 ? void 0 : _requiredCheckbox$i$o4.length; + const defaultValue = requiredCheckbox[i].options?.defaultValue?.length; //condition to check parseMin and parseMax greater than 0 then consider it as a required check box if (parseMin > 0 && parseMax > 0 && !response && !defaultValue && !showAlert) { showAlert = true; @@ -12943,21 +49858,15 @@ function PdfRequestFiles(props) { } //condition to check radio widget exist or not else if (radioExist) { - var _requiredRadio; //get all required type radio button - requiredRadio = checkUser[0].placeHolder[i].pos.filter(position => { - var _position$options2; - return !((_position$options2 = position.options) !== null && _position$options2 !== void 0 && _position$options2.isReadOnly) && position.type === _constant_Utils__WEBPACK_IMPORTED_MODULE_10__.radioButtonWidget; - }); + requiredRadio = checkUser[0].placeHolder[i].pos.filter(position => !position.options?.isReadOnly && position.type === _constant_Utils__WEBPACK_IMPORTED_MODULE_10__.radioButtonWidget); //if required type radio data exit then check user checked all radio button or some radio remain to check - if (requiredRadio && ((_requiredRadio = requiredRadio) === null || _requiredRadio === void 0 ? void 0 : _requiredRadio.length) > 0) { + if (requiredRadio && requiredRadio?.length > 0) { let checkSigned; - for (let i = 0; i < ((_requiredRadio2 = requiredRadio) === null || _requiredRadio2 === void 0 ? void 0 : _requiredRadio2.length); i++) { - var _requiredRadio2, _requiredRadio$i; - checkSigned = (_requiredRadio$i = requiredRadio[i]) === null || _requiredRadio$i === void 0 || (_requiredRadio$i = _requiredRadio$i.options) === null || _requiredRadio$i === void 0 ? void 0 : _requiredRadio$i.response; + for (let i = 0; i < requiredRadio?.length; i++) { + checkSigned = requiredRadio[i]?.options?.response; if (!checkSigned) { - var _requiredRadio$i2; - let checkDefaultSigned = (_requiredRadio$i2 = requiredRadio[i]) === null || _requiredRadio$i2 === void 0 || (_requiredRadio$i2 = _requiredRadio$i2.options) === null || _requiredRadio$i2 === void 0 ? void 0 : _requiredRadio$i2.defaultValue; + let checkDefaultSigned = requiredRadio[i]?.options?.defaultValue; if (!checkDefaultSigned && !showAlert) { showAlert = true; widgetKey = requiredRadio[i].key; @@ -12971,21 +49880,15 @@ function PdfRequestFiles(props) { //else condition to check all type widget data fill or not except checkbox and radio button else { //get all required type widgets except checkbox and radio - const requiredWidgets = checkUser[0].placeHolder[i].pos.filter(position => { - var _position$options3; - return ((_position$options3 = position.options) === null || _position$options3 === void 0 ? void 0 : _position$options3.status) === "required" && position.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_10__.radioButtonWidget && position.type !== "checkbox"; - }); - if (requiredWidgets && (requiredWidgets === null || requiredWidgets === void 0 ? void 0 : requiredWidgets.length) > 0) { + const requiredWidgets = checkUser[0].placeHolder[i].pos.filter(position => position.options?.status === "required" && position.type !== _constant_Utils__WEBPACK_IMPORTED_MODULE_10__.radioButtonWidget && position.type !== "checkbox"); + if (requiredWidgets && requiredWidgets?.length > 0) { let checkSigned; - for (let i = 0; i < (requiredWidgets === null || requiredWidgets === void 0 ? void 0 : requiredWidgets.length); i++) { - var _requiredWidgets$i; - checkSigned = (_requiredWidgets$i = requiredWidgets[i]) === null || _requiredWidgets$i === void 0 || (_requiredWidgets$i = _requiredWidgets$i.options) === null || _requiredWidgets$i === void 0 ? void 0 : _requiredWidgets$i.response; + for (let i = 0; i < requiredWidgets?.length; i++) { + checkSigned = requiredWidgets[i]?.options?.response; if (!checkSigned) { - var _requiredWidgets$i2; - const checkSignUrl = (_requiredWidgets$i2 = requiredWidgets[i]) === null || _requiredWidgets$i2 === void 0 || (_requiredWidgets$i2 = _requiredWidgets$i2.pos) === null || _requiredWidgets$i2 === void 0 ? void 0 : _requiredWidgets$i2.SignUrl; + const checkSignUrl = requiredWidgets[i]?.pos?.SignUrl; if (!checkSignUrl) { - var _requiredWidgets$i3; - let checkDefaultSigned = (_requiredWidgets$i3 = requiredWidgets[i]) === null || _requiredWidgets$i3 === void 0 || (_requiredWidgets$i3 = _requiredWidgets$i3.options) === null || _requiredWidgets$i3 === void 0 ? void 0 : _requiredWidgets$i3.defaultValue; + let checkDefaultSigned = requiredWidgets[i]?.options?.defaultValue; if (!checkDefaultSigned && !showAlert) { showAlert = true; widgetKey = requiredWidgets[i].key; @@ -13016,38 +49919,17 @@ function PdfRequestFiles(props) { setPageNumber(TourPageNumber); setWidgetsTour(true); } else { - var _checkUser$; setIsUiLoading(true); // `widgets` is Used to return widgets details with page number of current user - const widgets = checkUser === null || checkUser === void 0 || (_checkUser$ = checkUser[0]) === null || _checkUser$ === void 0 ? void 0 : _checkUser$.placeHolder; - let pdfArrBuffer; - //`contractDocument` function used to get updated SignedUrl - //resolved issue of sign document by multiple signers simultaneously - const documentData = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractDocument)(documentId); - if (documentData && documentData.length > 0) { - var _documentData$8, _documentData$9; - const url = ((_documentData$8 = documentData[0]) === null || _documentData$8 === void 0 ? void 0 : _documentData$8.SignedUrl) || ((_documentData$9 = documentData[0]) === null || _documentData$9 === void 0 ? void 0 : _documentData$9.URL); - //convert document url in array buffer format to use embed widgets in pdf using pdf-lib - const arrayBuffer = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.convertPdfArrayBuffer)(url); - if (arrayBuffer === "Error") { - setHandleError("Error: invalid document!"); - } else { - pdfArrBuffer = arrayBuffer; - } - } else if (documentData === "Error: Something went wrong!" || documentData.result && documentData.result.error) { - setHandleError("Error: Something went wrong!"); - } else { - setHandleError("Document not Found!"); - } + const widgets = checkUser?.[0]?.placeHolder; // Load a PDFDocument from the existing PDF bytes - const existingPdfBytes = pdfArrBuffer; + const existingPdfBytes = pdfArrayBuffer; try { - var _pdfDetails$; const pdfDoc = await pdf_lib__WEBPACK_IMPORTED_MODULE_2__.PDFDocument.load(existingPdfBytes); const isSignYourSelfFlow = false; const extUserPtr = pdfDetails[0].ExtUserPtr; - const HeaderDocId = extUserPtr === null || extUserPtr === void 0 ? void 0 : extUserPtr.HeaderDocId; + const HeaderDocId = extUserPtr?.HeaderDocId; //embed document's object id to all pages in pdf document if (!HeaderDocId) { if (!isDocId) { @@ -13058,84 +49940,76 @@ function PdfRequestFiles(props) { const pdfBytes = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.multiSignEmbed)(widgets, pdfDoc, isSignYourSelfFlow, scale, pdfOriginalWH, containerWH); // console.log("pdfte", pdfBytes); //get ExistUserPtr object id of user class to get tenantDetails - const objectId = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$ = pdfDetails[0]) === null || _pdfDetails$ === void 0 || (_pdfDetails$ = _pdfDetails$.ExtUserPtr) === null || _pdfDetails$ === void 0 || (_pdfDetails$ = _pdfDetails$.UserId) === null || _pdfDetails$ === void 0 ? void 0 : _pdfDetails$.objectId; + const objectId = pdfDetails?.[0]?.ExtUserPtr?.UserId?.objectId; //get ExistUserPtr email to get userDetails const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)(); let activeMailAdapter = ""; if (res === "Error: Something went wrong!") { - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); setIsLoading({ isLoad: false }); - } else if (!res || (res === null || res === void 0 ? void 0 : res.length) === 0) { + } else if (!res || res?.length === 0) { activeMailAdapter = ""; } else if (res[0] && res.length) { - var _res$2; - activeMailAdapter = (_res$2 = res[0]) === null || _res$2 === void 0 ? void 0 : _res$2.active_mail_adapter; + activeMailAdapter = res[0]?.active_mail_adapter; } //function for call to embed signature in pdf and get digital signature pdf const resSign = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.signPdfFun)(pdfBytes, documentId, signerObjectId, objectId, isSubscribed, activeMailAdapter, widgets); if (resSign && resSign.status === "success") { - var _pdfDetails$2, _pdfDetails$3; setPdfUrl(res.data); setIsSigned(true); setSignedSigners([]); setUnSignedSigners([]); getDocumentDetails(true); - const index = pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Signers.findIndex(x => { - var _currentUser5; - return x.Email === ((_currentUser5 = currentUser) === null || _currentUser5 === void 0 ? void 0 : _currentUser5.email); - }); + const index = pdfDetails?.[0].Signers.findIndex(x => x.Email === currentUser?.email); const newIndex = index + 1; const usermail = { - Email: (pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$2 = pdfDetails[0]) === null || _pdfDetails$2 === void 0 || (_pdfDetails$2 = _pdfDetails$2.Placeholders[newIndex]) === null || _pdfDetails$2 === void 0 ? void 0 : _pdfDetails$2.email) || "" + Email: pdfDetails?.[0]?.Placeholders[newIndex]?.email || "" }; - const user = usermail !== null && usermail !== void 0 && usermail.Email ? usermail : pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$3 = pdfDetails[0]) === null || _pdfDetails$3 === void 0 ? void 0 : _pdfDetails$3.Signers[newIndex]; + const user = usermail?.Email ? usermail : pdfDetails?.[0]?.Signers[newIndex]; if (sendmail !== "false" && sendInOrder) { - var _pdfDetails$4, _pdfDetails$5; - const requestBody = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$4 = pdfDetails[0]) === null || _pdfDetails$4 === void 0 ? void 0 : _pdfDetails$4.RequestBody; - const requestSubject = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$5 = pdfDetails[0]) === null || _pdfDetails$5 === void 0 ? void 0 : _pdfDetails$5.RequestSubject; + const requestBody = pdfDetails?.[0]?.RequestBody; + const requestSubject = pdfDetails?.[0]?.RequestSubject; if (user) { - var _pdfDetails$6; - const expireDate = pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExpiryDate.iso; + const expireDate = pdfDetails?.[0].ExpiryDate.iso; const newDate = new Date(expireDate); const localExpireDate = newDate.toLocaleDateString("en-US", { day: "numeric", month: "long", year: "numeric" }); - let senderEmail = pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Email; - let senderPhone = pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$6 = pdfDetails[0]) === null || _pdfDetails$6 === void 0 || (_pdfDetails$6 = _pdfDetails$6.ExtUserPtr) === null || _pdfDetails$6 === void 0 ? void 0 : _pdfDetails$6.Phone; - const senderName = "".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Name); + let senderEmail = pdfDetails?.[0].ExtUserPtr.Email; + let senderPhone = pdfDetails?.[0]?.ExtUserPtr?.Phone; + const senderName = `${pdfDetails?.[0].ExtUserPtr.Name}`; try { - var _pdfDetails$7, _replaceVar, _replaceVar2; const imgPng = "https://qikinnovation.ams3.digitaloceanspaces.com/logo.png"; - let url = "".concat(localStorage.getItem("baseUrl"), "functions/sendmailv3"); + let url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), sessionToken: localStorage.getItem("accesstoken") }; - const objectId = user === null || user === void 0 ? void 0 : user.objectId; + const objectId = user?.objectId; const hostUrl = window.location.origin; //encode this url value `${pdfDetails?.[0].objectId}/${user.Email}/${objectId}` to base64 using `btoa` function let encodeBase64; if (objectId) { - encodeBase64 = btoa("".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].objectId, "/").concat(user.Email, "/").concat(objectId)); + encodeBase64 = btoa(`${pdfDetails?.[0].objectId}/${user.Email}/${objectId}`); } else { - encodeBase64 = btoa("".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].objectId, "/").concat(user.Email)); + encodeBase64 = btoa(`${pdfDetails?.[0].objectId}/${user.Email}`); } const hostPublicUrl = _constant_const__WEBPACK_IMPORTED_MODULE_1__.isStaging ? "https://staging-app.opensignlabs.com" : "https://app.opensignlabs.com"; - let signPdf = props !== null && props !== void 0 && props.templateId ? "".concat(hostPublicUrl, "/login/").concat(encodeBase64) : "".concat(hostUrl, "/login/").concat(encodeBase64); + let signPdf = props?.templateId ? `${hostPublicUrl}/login/${encodeBase64}` : `${hostUrl}/login/${encodeBase64}`; const openSignUrl = "https://www.opensignlabs.com/contact-us"; - const orgName = (_pdfDetails$7 = pdfDetails[0]) !== null && _pdfDetails$7 !== void 0 && _pdfDetails$7.ExtUserPtr.Company ? pdfDetails[0].ExtUserPtr.Company : ""; + const orgName = pdfDetails[0]?.ExtUserPtr.Company ? pdfDetails[0].ExtUserPtr.Company : ""; const themeBGcolor = _constant_const__WEBPACK_IMPORTED_MODULE_1__.themeColor; let replaceVar; if (requestBody && requestSubject && isSubscribed) { const replacedRequestBody = requestBody.replace(/"/g, "'"); const htmlReqBody = "" + replacedRequestBody + " "; const variables = { - document_title: pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Name, + document_title: pdfDetails?.[0].Name, sender_name: senderName, sender_mail: senderEmail, sender_phone: senderPhone, @@ -13144,7 +50018,7 @@ function PdfRequestFiles(props) { receiver_phone: user.Phone, expiry_date: localExpireDate, company_name: orgName, - signing_url: "Sign here") + signing_url: `Sign here` }; replaceVar = (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.replaceMailVaribles)(requestSubject, htmlReqBody, variables); } @@ -13152,11 +50026,11 @@ function PdfRequestFiles(props) { mailProvider: activeMailAdapter, extUserId: extUserId, recipient: user.Email, - subject: requestSubject ? (_replaceVar = replaceVar) === null || _replaceVar === void 0 ? void 0 : _replaceVar.subject : "".concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Name, " has requested you to sign \"").concat(pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Name, "\""), + subject: requestSubject ? replaceVar?.subject : `${pdfDetails?.[0].ExtUserPtr.Name} has requested you to sign "${pdfDetails?.[0].Name}"`, from: senderEmail, - html: requestBody ? (_replaceVar2 = replaceVar) === null || _replaceVar2 === void 0 ? void 0 : _replaceVar2.body : "

Digital Signature Request

" + (pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].ExtUserPtr.Name) + " has requested you to review and sign " + (pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Name) + ".

Sender " + senderEmail + "
Organization " + orgName + "
Expires on " + localExpireDate + "

This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender " + senderEmail + " directly.If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ here.

" + html: requestBody ? replaceVar?.body : "

Digital Signature Request

" + pdfDetails?.[0].ExtUserPtr.Name + " has requested you to review and sign " + pdfDetails?.[0].Name + ".

Sender " + senderEmail + "
Organization " + orgName + "
Expires on " + localExpireDate + "

This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender " + senderEmail + " directly.If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ here.

" }; - await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post(url, params, { + await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(url, params, { headers: headers }); } catch (error) { @@ -13176,13 +50050,13 @@ function PdfRequestFiles(props) { if (err && err.message.includes("is encrypted.")) { setIsAlert({ isShow: true, - alertMessage: "Currently encrypted pdf files are not supported." + alertMessage: t("encrypted-pdf-not-support") }); } else { console.log("err in request signing", err); setIsAlert({ isShow: true, - alertMessage: "Something went wrong." + alertMessage: t("something-went-wrong-mssg") }); } } @@ -13191,7 +50065,7 @@ function PdfRequestFiles(props) { } else { setIsAlert({ isShow: true, - alertMessage: "something went wrong" + alertMessage: t("something-went-wrong-mssg") }); } } catch (err) { @@ -13199,24 +50073,23 @@ function PdfRequestFiles(props) { setIsUiLoading(false); setIsAlert({ isShow: true, - alertMessage: "something went wrong, please try again later." + alertMessage: t("something-went-wrong-mssg") }); } } else { //else verify users email try { - var _currentUser6; const userQuery = new (parse__WEBPACK_IMPORTED_MODULE_4___default().Query)((parse__WEBPACK_IMPORTED_MODULE_4___default().User)); - const user = await userQuery.get((_currentUser6 = currentUser) === null || _currentUser6 === void 0 ? void 0 : _currentUser6.objectId, { + const user = await userQuery.get(currentUser?.objectId, { sessionToken: localStorage.getItem("accesstoken") }); if (user) { - isEmailVerified = user === null || user === void 0 ? void 0 : user.get("emailVerified"); + isEmailVerified = user?.get("emailVerified"); setIsEmailVerified(isEmailVerified); } } catch (e) { console.log("error in save user's emailVerified in user class"); - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); } } } @@ -13227,7 +50100,9 @@ function PdfRequestFiles(props) { }; const tourConfig = [{ selector: '[data-tut="IsSigned"]', - content: minRequiredCount ? "Please confirm that you have selected at least ".concat(minRequiredCount, " checkboxes.") : "Ensure this field is accurately filled and meets all requirements.", + content: minRequiredCount ? t("signature-validate-alert", { + minRequiredCount + }) : t("signature-validate-alert-2"), position: "top", style: { fontSize: "13px" @@ -13344,7 +50219,7 @@ function PdfRequestFiles(props) { }; //function for set decline true on press decline button const declineDoc = async reason => { - const senderUser = localStorage.getItem("Parse/".concat(localStorage.getItem("parseAppId"), "/currentUser")); + const senderUser = localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`); const jsonSender = JSON.parse(senderUser); setIsDecline({ isDeclined: false @@ -13354,7 +50229,7 @@ function PdfRequestFiles(props) { DeclineReason: reason }; setIsUiLoading(true); - await axios__WEBPACK_IMPORTED_MODULE_25__["default"].put("".concat(localStorage.getItem("baseUrl"), "classes/contracts_Document/").concat(documentId), data, { + await axios__WEBPACK_IMPORTED_MODULE_26__["default"].put(`${localStorage.getItem("baseUrl")}classes/contracts_Document/${documentId}`, data, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -13363,7 +50238,6 @@ function PdfRequestFiles(props) { }).then(async result => { const res = result.data; if (res) { - var _pdfDetails$8, _pdfDetails$9, _pdfDetails$0$Signers; const currentDecline = { currnt: "YouDeclined", isDeclined: true @@ -13373,23 +50247,23 @@ function PdfRequestFiles(props) { const params = { event: "declined", body: { - objectId: pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].objectId, - file: (pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$8 = pdfDetails[0]) === null || _pdfDetails$8 === void 0 ? void 0 : _pdfDetails$8.SignedUrl) || (pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$9 = pdfDetails[0]) === null || _pdfDetails$9 === void 0 ? void 0 : _pdfDetails$9.URL), - name: pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Name, - note: (pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Note) || "", - description: (pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].Description) || "", - signers: pdfDetails === null || pdfDetails === void 0 || (_pdfDetails$0$Signers = pdfDetails[0].Signers) === null || _pdfDetails$0$Signers === void 0 ? void 0 : _pdfDetails$0$Signers.map(x => ({ - name: x === null || x === void 0 ? void 0 : x.Name, - email: x === null || x === void 0 ? void 0 : x.Email, - phone: x === null || x === void 0 ? void 0 : x.Phone + objectId: pdfDetails?.[0].objectId, + file: pdfDetails?.[0]?.SignedUrl || pdfDetails?.[0]?.URL, + name: pdfDetails?.[0].Name, + note: pdfDetails?.[0].Note || "", + description: pdfDetails?.[0].Description || "", + signers: pdfDetails?.[0].Signers?.map(x => ({ + name: x?.Name, + email: x?.Email, + phone: x?.Phone })), declinedBy: jsonSender.email, declinedAt: new Date(), - createdAt: pdfDetails === null || pdfDetails === void 0 ? void 0 : pdfDetails[0].createdAt + createdAt: pdfDetails?.[0].createdAt } }; try { - await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post("".concat(localStorage.getItem("baseUrl"), "functions/callwebhook"), params, { + await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(`${localStorage.getItem("baseUrl")}functions/callwebhook`, params, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -13423,7 +50297,6 @@ function PdfRequestFiles(props) { const handleDontShow = isChecked => { setIsDontShow(isChecked); }; - // console.log("signerpos", signerPos); //function to close tour and save tour status const closeRequestSignTour = async () => { setRequestSignTour(true); @@ -13447,7 +50320,7 @@ function PdfRequestFiles(props) { }]; } try { - await axios__WEBPACK_IMPORTED_MODULE_25__["default"].put("".concat(localStorage.getItem("baseUrl"), "classes/contracts").concat(contractName, "/").concat(signerUserId), { + await axios__WEBPACK_IMPORTED_MODULE_26__["default"].put(`${localStorage.getItem("baseUrl")}classes/contracts${contractName}/${signerUserId}`, { TourStatus: updatedTourStatus }, { headers: { @@ -13465,7 +50338,7 @@ function PdfRequestFiles(props) { const tourConfig = [{ selector: '[data-tut="reactourFirst"]', content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], { - message: "List of signers who still need to sign the document .", + message: t("tour-mssg.pdf-request-file-1"), isChecked: handleDontShow }), position: "top", @@ -13475,7 +50348,7 @@ function PdfRequestFiles(props) { }, { selector: '[data-tut="pdfArea"]', content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], { - message: "Click any of the placeholders appearing on the document to sign. You will then see options to draw your signature, type it, or upload an image .", + message: t("tour-mssg.pdf-request-file-2"), isChecked: handleDontShow }), position: "top", @@ -13485,7 +50358,7 @@ function PdfRequestFiles(props) { }, { selector: '[data-tut="reactourFifth"]', content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], { - message: "Click the Back, Decline, or Finish buttons to navigate your document. Use the ellipsis menu for additional options, including the Download button .", + message: t("tour-mssg.pdf-request-file-3"), isChecked: handleDontShow }), position: "top", @@ -13496,7 +50369,7 @@ function PdfRequestFiles(props) { const signedByStep = { selector: '[data-tut="reactourSecond"]', content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], { - message: "List of signers who have already signed the document .", + message: t("tour-mssg.pdf-request-file-4"), isChecked: handleDontShow }), position: "top", @@ -13511,7 +50384,7 @@ function PdfRequestFiles(props) { const defaultSignStep = { selector: '[data-tut="reactourThird"]', content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], { - message: "You can click \"Auto Sign All\" to automatically sign at all the locations meant to be signed by you. Make sure that you review the document properly before you click this button .", + message: t("tour-mssg.pdf-request-file-5"), isChecked: handleDontShow }), position: "top", @@ -13542,24 +50415,23 @@ function PdfRequestFiles(props) { e.preventDefault(); setLoading(true); try { - var _pdfDetails$10, _pdfDetails$11, _userRes$data; const params = { ...contact, - templateid: (_pdfDetails$10 = pdfDetails[0]) === null || _pdfDetails$10 === void 0 ? void 0 : _pdfDetails$10.objectId, - role: (_pdfDetails$11 = pdfDetails[0]) === null || _pdfDetails$11 === void 0 ? void 0 : _pdfDetails$11.PublicRole[0] + templateid: pdfDetails[0]?.objectId, + role: pdfDetails[0]?.PublicRole[0] }; - const userRes = await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/publicuserlinkcontacttodoc"), params, { + const userRes = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(`${localStorage.getItem("baseUrl")}/functions/publicuserlinkcontacttodoc`, params, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId") } }); - if (userRes !== null && userRes !== void 0 && (_userRes$data = userRes.data) !== null && _userRes$data !== void 0 && _userRes$data.result) { + if (userRes?.data?.result) { setRes(userRes.data.result); await SendOtp(); } else { console.log("error in public-sign to create user details"); - alert("something went wrong"); + alert(t("something-went-wrong-mssg")); } } catch (e) { console.log("e", e); @@ -13567,10 +50439,17 @@ function PdfRequestFiles(props) { } }; const handleInputChange = e => { - setContact(prev => ({ - ...prev, - [e.target.name]: e.target.value - })); + let { + name, + value + } = e.target; + if (name === "email") { + value = value?.toLowerCase()?.replace(/\s/g, ""); + } + setContact({ + ...contact, + [name]: value + }); }; const SendOtp = async () => { try { @@ -13578,7 +50457,7 @@ function PdfRequestFiles(props) { email: contact.email, docId: res.docId }; - const Otp = await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post("".concat(localStorage.getItem("baseUrl"), "/functions/SendOTPMailV1"), params, { + const Otp = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(`${localStorage.getItem("baseUrl")}/functions/SendOTPMailV1`, params, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId") @@ -13590,7 +50469,7 @@ function PdfRequestFiles(props) { } } catch (error) { console.log("error in verify otp in public-sign", error); - alert("something went wrong!"); + alert(t("something-went-wrong-mssg")); } }; @@ -13603,7 +50482,7 @@ function PdfRequestFiles(props) { if (otp) { // setLoading(true); try { - let url = "".concat(serverUrl, "/functions/AuthLoginAsMail/"); + let url = `${serverUrl}/functions/AuthLoginAsMail/`; const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": parseId @@ -13612,14 +50491,14 @@ function PdfRequestFiles(props) { email: contact.email, otp: otp }; - let user = await axios__WEBPACK_IMPORTED_MODULE_25__["default"].post(url, body, { + let user = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(url, body, { headers: headers }); if (user.data.result === "Invalid Otp") { - alert("Invalid Otp"); + alert(t("invalid-otp")); setLoading(false); } else if (user.data.result === "user not found!") { - alert("User not found!"); + alert(t("user-not-found")); setLoading(false); } else { let _user = user.data.result; @@ -13627,7 +50506,7 @@ function PdfRequestFiles(props) { await parse__WEBPACK_IMPORTED_MODULE_4___default().User.become(_user.sessionToken); const contractUserDetails = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)(); localStorage.setItem("UserInformation", JSON.stringify(_user)); - localStorage.setItem("Parse/".concat(parseId, "/currentUser"), JSON.stringify(_user)); + localStorage.setItem(`Parse/${parseId}/currentUser`, JSON.stringify(_user)); if (contractUserDetails && contractUserDetails.length > 0) { localStorage.setItem("Extand_Class", JSON.stringify(contractUserDetails)); } @@ -13641,14 +50520,14 @@ function PdfRequestFiles(props) { setIsLoading({ isLoad: false }); - setDocumentId(res === null || res === void 0 ? void 0 : res.docId); - getDocumentDetails(res === null || res === void 0 ? void 0 : res.docId); + setDocumentId(res?.docId); + getDocumentDetails(res?.docId); } } catch (error) { console.log("err ", error); } } else { - alert("Please Enter OTP!"); + alert(t("enter-otp-alert")); } }; const handleCloseOtp = () => { @@ -13662,19 +50541,30 @@ function PdfRequestFiles(props) { phone: "" }); }; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_dnd__WEBPACK_IMPORTED_MODULE_26__.DndProvider, { - backend: react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_27__.HTML5Backend + const clickOnZoomIn = () => { + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.onClickZoomIn)(scale, zoomPercent, setScale, setZoomPercent); + }; + const clickOnZoomOut = () => { + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.onClickZoomOut)(zoomPercent, scale, setZoomPercent, setScale); + }; + const handleDownloadBtn = async () => { + const url = pdfDetails?.[0]?.SignedUrl || pdfDetails?.[0]?.URL; + const name = pdfDetails?.[0]?.Name; + await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.fetchUrl)(url, name); + }; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_dnd__WEBPACK_IMPORTED_MODULE_27__.DndProvider, { + backend: react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_28__.HTML5Backend }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Title__WEBPACK_IMPORTED_MODULE_16__["default"], { title: props.templateId ? "Public Sign" : "Request Sign" }), isSubscriptionExpired ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { - title: "Subscription Expired", + title: t("subscription-expired"), isOpen: isSubscriptionExpired, showClose: false }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-col justify-center items-center py-4 md:py-5 gap-5" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "text-sm md:text-lg font-normal" - }, "Owner's subscription has expired."))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, isLoading.isLoad ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_LoaderWithMsg__WEBPACK_IMPORTED_MODULE_11__["default"], { + }, t("owner-subscription-expired")))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, isLoading.isLoad ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_LoaderWithMsg__WEBPACK_IMPORTED_MODULE_11__["default"], { isLoading: isLoading }) : handleError ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_HandleError__WEBPACK_IMPORTED_MODULE_12__["default"], { handleError: handleError @@ -13682,7 +50572,7 @@ function PdfRequestFiles(props) { className: "absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_Loader__WEBPACK_IMPORTED_MODULE_20__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "text-[13px] text-base-content" - }, "This might take some time")), isCelebration && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("loading-mssg"))), isCelebration && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "relative z-[1000]" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react_confetti__WEBPACK_IMPORTED_MODULE_8___default()), { width: window.innerWidth, @@ -13694,7 +50584,7 @@ function PdfRequestFiles(props) { className: "relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300" }, !requestSignTour && signerObjectId && requestSignTourFunction(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { isOpen: isAlert.isShow, - title: "Alert", + title: t("alert-message"), handleClose: () => setIsAlert({ isShow: false, alertMessage: "" @@ -13708,7 +50598,7 @@ function PdfRequestFiles(props) { }), type: "button", className: "op-btn op-btn-primary mt-3 px-4" - }, "Ok"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(reactour__WEBPACK_IMPORTED_MODULE_7__["default"], { + }, t("ok")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(reactour__WEBPACK_IMPORTED_MODULE_7__["default"], { showNumber: false, showNavigation: false, showNavigationNumber: false, @@ -13719,15 +50609,19 @@ function PdfRequestFiles(props) { closeWithMask: false }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_PdfDeclineModal__WEBPACK_IMPORTED_MODULE_15__["default"], { show: isDecline.isDeclined, - headMsg: "Document decline", - bodyMssg: isDecline.currnt === "Sure" ? "Are you sure want to decline this document ?" : isDecline.currnt === "YouDeclined" ? "You have declined this document!" : isDecline.currnt === "another" && "You can not sign this document as it has been declined/revoked.", + headMsg: t("document-decline"), + bodyMssg: isDecline.currnt === "Sure" ? t("decline-alert-1") : isDecline.currnt === "YouDeclined" ? t("decline-alert-2") : isDecline.currnt === "another" && t("decline-alert-3"), footerMessage: isDecline.currnt === "Sure", declineDoc: declineDoc, setIsDecline: setIsDecline }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_PdfDeclineModal__WEBPACK_IMPORTED_MODULE_15__["default"], { show: isExpired, - headMsg: "Document expired", - bodyMssg: "This document expired on ".concat(expiredDate, " and is no longer available to sign.") + headMsg: t("expired-doc-title"), + bodyMssg: t("expired-on-mssg", { + expiredDate + }), + isDownloadBtn: true, + handleDownloadBtn: handleDownloadBtn }), !isEmailVerified && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_VerifyEmail__WEBPACK_IMPORTED_MODULE_22__["default"], { isVerifyModal: isVerifyModal, setIsVerifyModal: setIsVerifyModal, @@ -13739,23 +50633,23 @@ function PdfRequestFiles(props) { handleResend: handleResend }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { isOpen: isPublicContact, - title: isOtp ? "Verify email" : "Contact Details", - handleClose: () => { - handleCloseOtp(); - } + title: isOtp ? t("verify-email-1") : t("contact-details"), + handleClose: () => handleCloseOtp() }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "h-full p-[20px]" }, isOtp ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", { onSubmit: VerifyOTP }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-col gap-2" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "You will get a verification code via email"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("get-otp-alert")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { className: "op-input op-input-bordered flex items-center gap-2 " }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "number", name: "otp", className: "grow", - placeholder: "Enter Verification Code", + placeholder: t("otp-placeholder"), + onInvalid: e => e.target.setCustomValidity(t("input-required")), + onInput: e => e.target.setCustomValidity(""), required: true, value: otp, onChange: e => setOtp(e.target.value), @@ -13766,13 +50660,11 @@ function PdfRequestFiles(props) { className: "flex gap-2" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "op-btn op-btn-ghost", - onClick: () => { - handleCloseOtp(); - } - }, "Cancel"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + onClick: () => handleCloseOtp() + }, t("cancel")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "op-btn op-btn-primary", disabled: loading - }, loading ? "Loading..." : "Verify")))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", { + }, loading ? t("loading") : t("verify"))))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", { onSubmit: handlePublicUser }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-col gap-2" @@ -13791,7 +50683,9 @@ function PdfRequestFiles(props) { name: "name", value: contact.name, onChange: handleInputChange, - placeholder: "name", + placeholder: t("name"), + onInvalid: e => e.target.setCustomValidity(t("input-required")), + onInput: e => e.target.setCustomValidity(""), required: true, disabled: loading })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { @@ -13806,12 +50700,14 @@ function PdfRequestFiles(props) { }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { d: "M15 6.954 8.978 9.86a2.25 2.25 0 0 1-1.956 0L1 6.954V11.5A1.5 1.5 0 0 0 2.5 13h11a1.5 1.5 0 0 0 1.5-1.5V6.954Z" })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { - type: "text", + type: "email", className: "grow", name: "email", value: contact.email, onChange: handleInputChange, - placeholder: "Email", + placeholder: t("email"), + onInvalid: e => e.target.setCustomValidity(t("input-required")), + onInput: e => e.target.setCustomValidity(""), required: true, disabled: loading })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { @@ -13829,7 +50725,7 @@ function PdfRequestFiles(props) { type: "text", name: "phone", className: "grow", - placeholder: "phone", + placeholder: t("phone"), disabled: loading }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "op-modal-action" @@ -13837,15 +50733,13 @@ function PdfRequestFiles(props) { className: "flex gap-2" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "op-btn op-btn-ghost", - onClick: () => { - handleCloseOtp(); - } - }, "Close"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + onClick: () => handleCloseOtp() + }, t("close")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "op-btn op-btn-primary", disabled: loading - }, loading ? "Loading..." : "Submit")))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { + }, loading ? t("loading") : t("submit"))))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { isOpen: defaultSignAlert.isShow, - title: "Auto sign", + title: t("auto-sign-all"), handleClose: () => setDefaultSignAlert({ isShow: false, alertMessage: "" @@ -13858,24 +50752,24 @@ function PdfRequestFiles(props) { onClick: () => addDefaultSignature(), type: "button", className: "op-btn op-btn-primary" - }, "Yes"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("yes")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => setDefaultSignAlert({ isShow: false, alertMessage: "" }), type: "button", className: "op-btn op-btn-secondary" - }, "Close")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("close"))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => setIsAlert({ isShow: false, alertMessage: "" }), type: "button", className: "op-btn op-btn-primary" - }, "Ok"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_RenderAllPdfPage__WEBPACK_IMPORTED_MODULE_6__["default"], { + }, t("ok")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_RenderAllPdfPage__WEBPACK_IMPORTED_MODULE_6__["default"], { signerPos: signerPos, signerObjectId: signerObjectId, - signPdfUrl: pdfDetails[0] && (((_pdfDetails$12 = pdfDetails[0]) === null || _pdfDetails$12 === void 0 ? void 0 : _pdfDetails$12.SignedUrl) || ((_pdfDetails$13 = pdfDetails[0]) === null || _pdfDetails$13 === void 0 ? void 0 : _pdfDetails$13.URL)), + signPdfUrl: pdfDetails[0] && (pdfDetails[0]?.SignedUrl || pdfDetails[0]?.URL), allPages: allPages, setAllPages: setAllPages, setPageNumber: setPageNumber, @@ -13884,28 +50778,24 @@ function PdfRequestFiles(props) { }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: " w-full md:w-[57%] flex mr-4" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_PdfZoom__WEBPACK_IMPORTED_MODULE_23__["default"], { - setScale: setScale, - scale: scale, - containerWH: containerWH, - setZoomPercent: setZoomPercent, - zoomPercent: zoomPercent + clickOnZoomIn: clickOnZoomIn, + clickOnZoomOut: clickOnZoomOut, + isDisableRotate: true }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: " w-full md:w-[95%] " }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { isOpen: isCompleted.isModal, - title: "Document signed", - handleClose: () => { - setIsCompleted(prev => ({ - ...prev, - isModal: false - })); - }, - reduceWidth: !(isCompleted !== null && isCompleted !== void 0 && isCompleted.message) && "md:min-w-[440px] md:max-w-[400px]" + title: t("document-signed"), + handleClose: () => setIsCompleted(prev => ({ + ...prev, + isModal: false + })), + reduceWidth: !isCompleted?.message && "md:min-w-[440px] md:max-w-[400px]" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "h-full p-[20px] text-base-content" - }, isCompleted !== null && isCompleted !== void 0 && isCompleted.message ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, isCompleted === null || isCompleted === void 0 ? void 0 : isCompleted.message) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, isCompleted?.message ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, isCompleted?.message) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "px-[15px]" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "Congratulations! \uD83C\uDF89 This document has been successfully signed by all participants!")), !(isCompleted !== null && isCompleted !== void 0 && isCompleted.message) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("document-signed-alert-4"))), !isCompleted?.message && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex mt-4 gap-1 px-[15px]" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleToPrint)(e, pdfUrl, setIsDownloading), @@ -13916,7 +50806,7 @@ function PdfRequestFiles(props) { "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block" - }, "Print")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("print"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleDownloadCertificate)(pdfDetails, setIsDownloading), className: "font-[500] text-[13px] mr-[5px] op-btn op-btn-secondary" @@ -13925,7 +50815,7 @@ function PdfRequestFiles(props) { "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block" - }, "Certificate")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("certificate"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "font-[500] text-[13px] mr-[5px] op-btn op-btn-primary", onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading) @@ -13934,15 +50824,15 @@ function PdfRequestFiles(props) { "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block" - }, "Download"))))), isDownloading === "pdf" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("download")))))), isDownloading === "pdf" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "fixed z-[1000] inset-0 flex justify-center items-center bg-black bg-opacity-30" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_Loader__WEBPACK_IMPORTED_MODULE_20__["default"], null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { isOpen: isDownloading === "certificate", - title: isDownloading === "certificate" ? "Generating certificate" : "PDF Download", + title: isDownloading === "certificate" ? t("generating-certificate") : t("pdf-download"), handleClose: () => setIsDownloading("") }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "p-3 md:p-5 text-[13px] md:text-base text-center text-base-content" - }, isDownloading === "certificate", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Your completion certificate is being generated. Please wait momentarily. If the download doesn't start shortly, click the button again."))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_SignPad__WEBPACK_IMPORTED_MODULE_5__["default"], { + }, isDownloading === "certificate", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, t("generate-certificate-alert")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_SignPad__WEBPACK_IMPORTED_MODULE_5__["default"], { isSignPad: isSignPad, isStamp: isStamp, setIsImageSelect: setIsImageSelect, @@ -13978,15 +50868,11 @@ function PdfRequestFiles(props) { currentSigner: currentSigner, pdfUrl: pdfUrl, alreadySign: alreadySign, - totalZoomPercent: totalZoomPercent, - setTotalZoomPercent: setTotalZoomPercent, - setScale: setScale, - scale: scale, - pdfOriginalWH: pdfOriginalWH, containerWH: containerWH, - setZoomPercent: setZoomPercent, - zoomPercent: zoomPercent, - isPublicTemplate: isPublicTemplate + isPublicTemplate: isPublicTemplate, + clickOnZoomIn: clickOnZoomIn, + clickOnZoomOut: clickOnZoomOut, + isDisableRotate: true }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: divRef, "data-tut": "pdfArea", @@ -14020,7 +50906,6 @@ function PdfRequestFiles(props) { divRef: divRef, setIsResize: setIsResize, isResize: isResize, - setTotalZoomPercent: setTotalZoomPercent, setScale: setScale, scale: scale, uniqueId: uniqueId, @@ -14029,11 +50914,11 @@ function PdfRequestFiles(props) { })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "w-full md:w-[23%] bg-base-100 overflow-y-auto hide-scrollbar hidden md:inline-block" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "max-h-screen" + className: `max-h-screen` }, signedSigners.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { "data-tut": "reactourSecond", className: "mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, " Signed by")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("signed-by"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "mt-[2px]" }, signedSigners.map((obj, ind) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { @@ -14047,7 +50932,7 @@ function PdfRequestFiles(props) { }))), unsignedSigners.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { "data-tut": "reactourFirst", className: "mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "Yet to sign")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("yet-to-sign"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "mt-[5px]" }, unsignedSigners.map((obj, ind) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { @@ -14060,26 +50945,23 @@ function PdfRequestFiles(props) { })); }))), defaultSignImg && !alreadySign && currentSigner && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_DefaultSignature__WEBPACK_IMPORTED_MODULE_17__["default"], { defaultSignImg: defaultSignImg, - setDefaultSignImg: setDefaultSignImg, userObjectId: signerObjectId, setIsLoading: setIsLoading, xyPostion: signerPos, setDefaultSignAlert: setDefaultSignAlert }))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { isOpen: validateAlert, - title: "Validation alert", - handleClose: () => { - setValidateAlert(false); - } + title: t("validation-alert"), + handleClose: () => setValidateAlert(false) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "h-[100%] p-[20px]" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "The input does not meet the criteria set by the regular expression."), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, t("validation-alert-1")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "h-[1px] bg-[#9f9f9f] w-full my-[15px]" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: () => setValidateAlert(false), type: "button", className: "op-btn op-btn-ghost" - }, "Close"))))); + }, t("close")))))); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PdfRequestFiles); @@ -14102,7 +50984,8 @@ __webpack_require__.r(__webpack_exports__); const Alert = _ref => { let { children, - type + type, + className } = _ref; const textcolor = type ? theme(type) : theme(); function theme(color) { @@ -14120,9 +51003,9 @@ const Alert = _ref => { } } return children && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "z-[1000] fixed top-20 left-1/2 transform -translate-x-1/2 text-sm" + className: `${className ? className : "z-[1000] fixed top-20 left-1/2 transform -translate-x-1/2 text-sm"} ` }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "op-alert ".concat(textcolor) + className: `op-alert ${textcolor}` }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "ml-3" }, children))); @@ -14240,7 +51123,7 @@ const ModalUi = _ref => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, isOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("dialog", { className: "op-modal op-modal-open" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "".concat(width || "md:min-w-[500px]", " op-modal-box p-0 max-h-90 overflow-y-auto hide-scrollbar text-sm") + className: `${width || "md:min-w-[500px]"} op-modal-box p-0 max-h-90 overflow-y-auto hide-scrollbar text-sm` }, showHeader && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h3", { className: "text-base-content font-bold text-lg pt-[15px] px-[20px]" }, title), showClose && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { @@ -14266,29 +51149,31 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _styles_signature_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles/signature.css */ "./src/styles/signature.css"); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); -function CustomModal(_ref) { - let { - show, - headMsg, - bodyMssg, - footerMessage, - declineDoc, - setIsDecline - } = _ref; + +function CustomModal(props) { + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation)(); const [reason, setReason] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); - return show && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("dialog", { + return props.show && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("dialog", { className: "op-modal op-modal-open absolute z-[448]" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "w-[95%] md:w-[60%] lg:w-[40%] op-modal-box p-0 overflow-y-auto hide-scrollbar text-sm" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h3", { className: "text-base-content font-bold text-lg pt-[15px] px-[20px]" - }, headMsg && headMsg), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, props?.headMsg && props?.headMsg), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "p-[10px] px-[20px]" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "text-[15px]" - }, bodyMssg && bodyMssg)), footerMessage && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, props.bodyMssg && props.bodyMssg)), props.isDownloadBtn && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "flex justify-start w-full ml-[20px] mb-3 mt-1" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + className: "op-btn op-btn-primary ", + onClick: () => props.handleDownloadBtn() + }, "Download")), props.footerMessage && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "mx-3" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { rows: 3, @@ -14303,18 +51188,18 @@ function CustomModal(_ref) { type: "button", onClick: () => { setReason(""); - declineDoc(reason); + props.declineDoc(reason); } - }, "Yes"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { + }, t("yes")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "op-btn op-btn-secondary", onClick: () => { setReason(""); - setIsDecline({ + props.setIsDecline({ isDeclined: false }); } - }, "Close"))))); + }, t("close")))))); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CustomModal); @@ -14333,12 +51218,17 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); + function TourContentWithBtn(_ref) { let { message, isChecked } = _ref; + const { + t + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(); const [isCheck, setIsCheck] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false); const handleCheck = () => { setIsCheck(!isCheck); @@ -14355,7 +51245,7 @@ function TourContentWithBtn(_ref) { onChange: handleCheck }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "#787878 text-[12px]" - }, "Don't show this again"))); + }, t("tour-content")))); } /***/ }), @@ -14446,7 +51336,7 @@ const infoSlice = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_1__.createSlice)( initialState: {}, reducers: { fetchAppInfo: () => { - localStorage.setItem("baseUrl", "".concat(_constant_appinfo__WEBPACK_IMPORTED_MODULE_0__.appInfo.baseUrl, "/")); + localStorage.setItem("baseUrl", `${_constant_appinfo__WEBPACK_IMPORTED_MODULE_0__.appInfo.baseUrl}/`); localStorage.setItem("parseAppId", _constant_appinfo__WEBPACK_IMPORTED_MODULE_0__.appInfo.appId); localStorage.setItem("appLogo", _constant_appinfo__WEBPACK_IMPORTED_MODULE_0__.appInfo.applogo); localStorage.removeItem("userSettings"); @@ -14530,6 +51420,53 @@ const store = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_4__.configureStore)({ /***/ }), +/***/ "./src/script/i18n.js": +/*!****************************!*\ + !*** ./src/script/i18n.js ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var i18next__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! i18next */ "./node_modules/i18next/dist/esm/i18next.js"); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); +/* harmony import */ var i18next_browser_languagedetector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! i18next-browser-languagedetector */ "./node_modules/i18next-browser-languagedetector/dist/esm/i18nextBrowserLanguageDetector.js"); +/* harmony import */ var _locales_en_translation_json__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./locales/en/translation.json */ "./src/script/locales/en/translation.json"); +/* harmony import */ var _locales_fr_translation_json__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./locales/fr/translation.json */ "./src/script/locales/fr/translation.json"); + + + + + +i18next__WEBPACK_IMPORTED_MODULE_0__["default"].use(i18next_browser_languagedetector__WEBPACK_IMPORTED_MODULE_2__["default"]).use(react_i18next__WEBPACK_IMPORTED_MODULE_1__.initReactI18next).init({ + resources: { + en: { + translation: _locales_en_translation_json__WEBPACK_IMPORTED_MODULE_3__ + }, + fr: { + translation: _locales_fr_translation_json__WEBPACK_IMPORTED_MODULE_4__ + } + }, + fallbackLng: "en", + // fallback language + detection: { + // Specifies the default language to fall back to if the detected language is not available. + order: ["localStorage", "navigator"] + // Defines where the detected language should be cached. + }, + debug: false, + interpolation: { + escapeValue: false // React already does escaping + }, + whitelist: ["en", "fr"] // List of allowed languages +}); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (i18next__WEBPACK_IMPORTED_MODULE_0__["default"]); + +/***/ }), + /***/ "./node_modules/clsx/dist/clsx.js": /*!****************************************!*\ !*** ./node_modules/clsx/dist/clsx.js ***! @@ -18363,8 +55300,7 @@ h2.react-datepicker__current-month { .react-datepicker__aria-live { position: absolute; - -webkit-clip-path: circle(0); - clip-path: circle(0); + clip-path: circle(0); border: 0; height: 1px; margin: -1px; @@ -18379,7 +55315,7 @@ h2.react-datepicker__current-month { height: 1em; vertical-align: -0.125em; } -`, "",{"version":3,"sources":["webpack://./node_modules/react-datepicker/dist/react-datepicker.css"],"names":[],"mappings":"AAAA,gBAAgB;AAChB;;;EAGE,kBAAkB;EAClB,mBAAmB;EACnB,yBAAyB;EACzB,WAAW;EACX,cAAc;EACd,WAAW;EACX,kBAAkB;EAClB,QAAQ;EACR,UAAU;AACZ;AACA;EACE,qBAAqB;EACrB,UAAU;EACV,SAAS;AACX;;AAEA;EACE,2DAA2D;EAC3D,iBAAiB;EACjB,sBAAsB;EACtB,WAAW;EACX,yBAAyB;EACzB,qBAAqB;EACrB,qBAAqB;EACrB,kBAAkB;EAClB,oBAAoB;AACtB;;AAEA;EACE,cAAc;AAChB;AACA;;EAEE,iCAAiC;EACjC,kCAAkC;AACpC;;AAEA;EACE,UAAU;EACV,cAAc;AAChB;AACA;EACE,eAAe;AACjB;AACA;EACE,aAAa;EACb,cAAc;AAChB;AACA;EACE,UAAU;EACV,WAAW;AACb;;AAEA;EACE,kBAAkB;EAClB,yBAAyB;EACzB,gCAAgC;EAChC,8BAA8B;EAC9B,cAAc;EACd,kBAAkB;AACpB;AACA;EACE,mBAAmB;EACnB,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;;AAEA;;;;;;EAME,qBAAqB;EACrB,cAAc;AAChB;;AAEA;;;EAGE,aAAa;EACb,WAAW;EACX,iBAAiB;EACjB,mBAAmB;AACrB;;AAEA;EACE,UAAU;EACV,SAAS;AACX;;AAEA;EACE,uBAAuB;EACvB,mBAAmB;EACnB,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;EACnB,gBAAgB;EAChB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;EAClB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,UAAU;EACV,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,WAAW;EACX,mBAAmB;EACnB,gBAAgB;AAClB;AACA;EACE,SAAS;AACX;AACA;EACE,UAAU;AACZ;AACA;EACE,WAAW;AACb;AACA;EACE,kBAAkB;EAClB,MAAM;EACN,cAAc;EACd,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,QAAQ;AACV;AACA;EACE,SAAS;AACX;AACA;EACE,qBAAqB;AACvB;;AAEA;EACE,kBAAkB;EAClB,SAAS;EACT,eAAe;EACf,QAAQ;AACV;AACA;EACE,UAAU;AACZ;AACA;EACE,wBAAwB;EACxB,UAAU;AACZ;AACA;EACE,WAAW;AACb;AACA;EACE,yBAAyB;EACzB,WAAW;AACb;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,cAAc;EACd,kBAAkB;AACpB;AACA;EACE,aAAa;EACb,eAAe;EACf,gBAAgB;AAClB;AACA;EACE,qBAAqB;EACrB,WAAW;EACX,WAAW;AACb;;AAEA;EACE,cAAc;EACd,kBAAkB;AACpB;AACA;;EAEE,qBAAqB;EACrB,WAAW;EACX,WAAW;AACb;;AAEA;EACE,WAAW;EACX,WAAW;EACX,WAAW;EACX,uBAAuB;EACvB,gBAAgB;AAClB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,WAAW;AACb;AACA;;EAEE,wBAAwB;EACxB,SAAS;AACX;AACA;EACE,0BAA0B;AAC5B;AACA;EACE,gBAAgB;EAChB,qBAAqB;AACvB;;AAEA;EACE,YAAY;EACZ,8BAA8B;EAC9B,WAAW;AACb;AACA;EACE,eAAe;EACf,yBAAyB;EACzB,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,MAAM;AACR;AACA;EACE,kBAAkB;EAClB,iBAAiB;EACjB,kCAAkC;AACpC;AACA;EACE,WAAW;EACX,kBAAkB;EAClB,cAAc;EACd,kBAAkB;EAClB,kCAAkC;AACpC;AACA;EACE,gBAAgB;EAChB,SAAS;EACT,gCAAgC;EAChC,kBAAkB;EAClB,gBAAgB;EAChB,eAAe;EACf,WAAW;EACX,uBAAuB;AACzB;AACA;EACE,YAAY;EACZ,iBAAiB;EACjB,mBAAmB;AACrB;AACA;EACE,eAAe;EACf,yBAAyB;AAC3B;AACA;EACE,yBAAyB;EACzB,YAAY;EACZ,iBAAiB;AACnB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,WAAW;AACb;AACA;EACE,eAAe;EACf,6BAA6B;AAC/B;;AAEA;EACE,WAAW;EACX,qBAAqB;EACrB,aAAa;EACb,mBAAmB;EACnB,kBAAkB;EAClB,gBAAgB;AAClB;AACA;EACE,eAAe;AACjB;AACA;;EAEE,qBAAqB;EACrB,yBAAyB;AAC3B;AACA;EACE,qBAAqB;EACrB,yBAAyB;EACzB,WAAW;AACb;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,qBAAqB;EACrB,yBAAyB;EACzB,WAAW;AACb;AACA;EACE,yBAAyB;AAC3B;;AAEA;EACE,mBAAmB;EACnB,mBAAmB;AACrB;;AAEA;EACE,mBAAmB;AACrB;;AAEA;;;EAGE,WAAW;EACX,qBAAqB;EACrB,aAAa;EACb,mBAAmB;EACnB,kBAAkB;EAClB,gBAAgB;AAClB;;AAEA;;;;EAIE,eAAe;AACjB;AACA;;;;EAIE,qBAAqB;EACrB,yBAAyB;AAC3B;AACA;;;;EAIE,iBAAiB;AACnB;AACA;;;;EAIE,qBAAqB;EACrB,yBAAyB;EACzB,WAAW;AACb;AACA;;;;EAIE,yBAAyB;AAC3B;AACA;;;;EAIE,cAAc;AAChB;AACA;;;;EAIE,YAAY;AACd;AACA;;;;EAIE,kBAAkB;EAClB,qBAAqB;EACrB,yBAAyB;EACzB,WAAW;AACb;AACA;;;;EAIE,kBAAkB;EAClB,YAAY;EACZ,SAAS;EACT,2BAA2B;EAC3B,sBAAsB;EACtB,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,mBAAmB;EACnB,kBAAkB;EAClB,UAAU;EACV,mDAAmD;AACrD;AACA;;;;EAIE,yBAAyB;AAC3B;AACA;;;;EAIE,mBAAmB;EACnB,UAAU;AACZ;AACA;;;;;;;;;;EAUE,qBAAqB;EACrB,yBAAyB;EACzB,WAAW;AACb;AACA;;;;;;;;;;EAUE,yBAAyB;AAC3B;AACA;;;;EAIE,qBAAqB;EACrB,yBAAyB;EACzB,mBAAmB;AACrB;AACA;;;;EAIE,yBAAyB;AAC3B;AACA;;;;;;;;;;;;;;;;EAgBE,yCAAyC;AAC3C;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BE,yBAAyB;EACzB,WAAW;AACb;AACA;;;;EAIE,eAAe;EACf,WAAW;AACb;AACA;;;;EAIE,6BAA6B;AAC/B;AACA;;;;EAIE,kBAAkB;EAClB,WAAW;EACX,SAAS;EACT,2BAA2B;EAC3B,sBAAsB;EACtB,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,mBAAmB;EACnB,kBAAkB;EAClB,UAAU;EACV,mDAAmD;AACrD;;AAEA;EACE,kBAAkB;EAClB,qBAAqB;EACrB,WAAW;AACb;AACA;EACE,kBAAkB;EAClB,eAAe;EACf,uBAAuB;AACzB;;AAEA;EACE,0BAA0B;AAC5B;;AAEA;;;EAGE,6BAA6B;EAC7B,qBAAqB;EACrB,kBAAkB;AACpB;AACA;;;EAGE,eAAe;AACjB;AACA;;;;;;EAME,yBAAyB;AAC3B;AACA;;;EAGE,yBAAyB;EACzB,YAAY;EACZ,MAAM;AACR;;AAEA;;;EAGE,yBAAyB;EACzB,kBAAkB;EAClB,UAAU;EACV,SAAS;EACT,SAAS;EACT,UAAU;EACV,kBAAkB;EAClB,qBAAqB;EACrB,yBAAyB;AAC3B;AACA;;;EAGE,eAAe;AACjB;AACA;;;EAGE,aAAa;EACb,kBAAkB;AACpB;;AAEA;;;EAGE,iBAAiB;EACjB,WAAW;EACX,cAAc;EACd,iBAAiB;EACjB,kBAAkB;AACpB;AACA;;;EAGE,8BAA8B;EAC9B,+BAA+B;AACjC;AACA;;;EAGE,yBAAyB;EAGzB,iBAAiB;EACjB,iCAAiC;EACjC,kCAAkC;AACpC;AACA;;;EAGE,sBAAsB;AACxB;AACA;;;EAGE,4BAA4B;AAC9B;AACA;;;EAGE,yBAAyB;AAC3B;AACA;;;EAGE,kBAAkB;EAClB,UAAU;AACZ;;AAEA;EACE,eAAe;EACf,6BAA6B;EAC7B,SAAS;EACT,UAAU;EACV,kBAAkB;EAClB,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,YAAY;EACZ,mBAAmB;EACnB,sBAAsB;AACxB;AACA;EACE,eAAe;EACf,yBAAyB;EACzB,WAAW;EACX,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,YAAY;EACZ,eAAe;EACf,cAAc;EACd,kBAAkB;EAClB,mBAAmB;EACnB,sBAAsB;EACtB,YAAY;AACd;AACA;EACE,eAAe;AACjB;AACA;EACE,eAAe;EACf,sBAAsB;AACxB;;AAEA;EACE,mBAAmB;EACnB,6BAA6B;EAC7B,eAAe;EACf,kBAAkB;EAClB,iBAAiB;EACjB,cAAc;EACd,WAAW;AACb;;AAEA;EACE,eAAe;EACf,YAAY;EACZ,aAAa;EACb,oCAAoC;EACpC,OAAO;EACP,MAAM;EACN,uBAAuB;EACvB,mBAAmB;EACnB,aAAa;EACb,mBAAmB;AACrB;AACA;;;EAGE,WAAW;EACX,iBAAiB;AACnB;AACA;EACE;;;IAGE,WAAW;IACX,iBAAiB;EACnB;AACF;AACA;;EAEE,kBAAkB;AACpB;;AAEA;EACE,cAAc;EACd,cAAc;EACd,qBAAqB;EACrB,oBAAoB;EACpB,YAAY;AACd;;AAEA;EACE,kBAAkB;EAClB,4BAAoB;UAApB,oBAAoB;EACpB,SAAS;EACT,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,UAAU;EACV,UAAU;EACV,mBAAmB;AACrB;;AAEA;EACE,UAAU;EACV,WAAW;EACX,wBAAwB;AAC1B","sourcesContent":["@charset \"UTF-8\";\n.react-datepicker__year-read-view--down-arrow,\n.react-datepicker__month-read-view--down-arrow,\n.react-datepicker__month-year-read-view--down-arrow, .react-datepicker__navigation-icon::before {\n border-color: #ccc;\n border-style: solid;\n border-width: 3px 3px 0 0;\n content: \"\";\n display: block;\n height: 9px;\n position: absolute;\n top: 6px;\n width: 9px;\n}\n.react-datepicker-wrapper {\n display: inline-block;\n padding: 0;\n border: 0;\n}\n\n.react-datepicker {\n font-family: \"Helvetica Neue\", helvetica, arial, sans-serif;\n font-size: 0.8rem;\n background-color: #fff;\n color: #000;\n border: 1px solid #aeaeae;\n border-radius: 0.3rem;\n display: inline-block;\n position: relative;\n line-height: initial;\n}\n\n.react-datepicker--time-only .react-datepicker__time-container {\n border-left: 0;\n}\n.react-datepicker--time-only .react-datepicker__time,\n.react-datepicker--time-only .react-datepicker__time-box {\n border-bottom-left-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.react-datepicker-popper {\n z-index: 1;\n line-height: 0;\n}\n.react-datepicker-popper .react-datepicker__triangle {\n stroke: #aeaeae;\n}\n.react-datepicker-popper[data-placement^=bottom] .react-datepicker__triangle {\n fill: #f0f0f0;\n color: #f0f0f0;\n}\n.react-datepicker-popper[data-placement^=top] .react-datepicker__triangle {\n fill: #fff;\n color: #fff;\n}\n\n.react-datepicker__header {\n text-align: center;\n background-color: #f0f0f0;\n border-bottom: 1px solid #aeaeae;\n border-top-left-radius: 0.3rem;\n padding: 8px 0;\n position: relative;\n}\n.react-datepicker__header--time {\n padding-bottom: 8px;\n padding-left: 5px;\n padding-right: 5px;\n}\n.react-datepicker__header--time:not(.react-datepicker__header--time--only) {\n border-top-left-radius: 0;\n}\n.react-datepicker__header:not(.react-datepicker__header--has-time-select) {\n border-top-right-radius: 0.3rem;\n}\n\n.react-datepicker__year-dropdown-container--select,\n.react-datepicker__month-dropdown-container--select,\n.react-datepicker__month-year-dropdown-container--select,\n.react-datepicker__year-dropdown-container--scroll,\n.react-datepicker__month-dropdown-container--scroll,\n.react-datepicker__month-year-dropdown-container--scroll {\n display: inline-block;\n margin: 0 15px;\n}\n\n.react-datepicker__current-month,\n.react-datepicker-time__header,\n.react-datepicker-year-header {\n margin-top: 0;\n color: #000;\n font-weight: bold;\n font-size: 0.944rem;\n}\n\nh2.react-datepicker__current-month {\n padding: 0;\n margin: 0;\n}\n\n.react-datepicker-time__header {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.react-datepicker__navigation {\n align-items: center;\n background: none;\n display: flex;\n justify-content: center;\n text-align: center;\n cursor: pointer;\n position: absolute;\n top: 2px;\n padding: 0;\n border: none;\n z-index: 1;\n height: 32px;\n width: 32px;\n text-indent: -999em;\n overflow: hidden;\n}\n.react-datepicker__navigation--previous {\n left: 2px;\n}\n.react-datepicker__navigation--next {\n right: 2px;\n}\n.react-datepicker__navigation--next--with-time:not(.react-datepicker__navigation--next--with-today-button) {\n right: 85px;\n}\n.react-datepicker__navigation--years {\n position: relative;\n top: 0;\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.react-datepicker__navigation--years-previous {\n top: 4px;\n}\n.react-datepicker__navigation--years-upcoming {\n top: -4px;\n}\n.react-datepicker__navigation:hover *::before {\n border-color: #a6a6a6;\n}\n\n.react-datepicker__navigation-icon {\n position: relative;\n top: -1px;\n font-size: 20px;\n width: 0;\n}\n.react-datepicker__navigation-icon--next {\n left: -2px;\n}\n.react-datepicker__navigation-icon--next::before {\n transform: rotate(45deg);\n left: -7px;\n}\n.react-datepicker__navigation-icon--previous {\n right: -2px;\n}\n.react-datepicker__navigation-icon--previous::before {\n transform: rotate(225deg);\n right: -7px;\n}\n\n.react-datepicker__month-container {\n float: left;\n}\n\n.react-datepicker__year {\n margin: 0.4rem;\n text-align: center;\n}\n.react-datepicker__year-wrapper {\n display: flex;\n flex-wrap: wrap;\n max-width: 180px;\n}\n.react-datepicker__year .react-datepicker__year-text {\n display: inline-block;\n width: 4rem;\n margin: 2px;\n}\n\n.react-datepicker__month {\n margin: 0.4rem;\n text-align: center;\n}\n.react-datepicker__month .react-datepicker__month-text,\n.react-datepicker__month .react-datepicker__quarter-text {\n display: inline-block;\n width: 4rem;\n margin: 2px;\n}\n\n.react-datepicker__input-time-container {\n clear: both;\n width: 100%;\n float: left;\n margin: 5px 0 10px 15px;\n text-align: left;\n}\n.react-datepicker__input-time-container .react-datepicker-time__caption {\n display: inline-block;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container {\n display: inline-block;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input {\n display: inline-block;\n margin-left: 10px;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input {\n width: auto;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]::-webkit-inner-spin-button,\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time] {\n -moz-appearance: textfield;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__delimiter {\n margin-left: 5px;\n display: inline-block;\n}\n\n.react-datepicker__time-container {\n float: right;\n border-left: 1px solid #aeaeae;\n width: 85px;\n}\n.react-datepicker__time-container--with-today-button {\n display: inline;\n border: 1px solid #aeaeae;\n border-radius: 0.3rem;\n position: absolute;\n right: -87px;\n top: 0;\n}\n.react-datepicker__time-container .react-datepicker__time {\n position: relative;\n background: white;\n border-bottom-right-radius: 0.3rem;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box {\n width: 85px;\n overflow-x: hidden;\n margin: 0 auto;\n text-align: center;\n border-bottom-right-radius: 0.3rem;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list {\n list-style: none;\n margin: 0;\n height: calc(195px + 1.7rem / 2);\n overflow-y: scroll;\n padding-right: 0;\n padding-left: 0;\n width: 100%;\n box-sizing: content-box;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item {\n height: 30px;\n padding: 5px 10px;\n white-space: nowrap;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item:hover {\n cursor: pointer;\n background-color: #f0f0f0;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--selected {\n background-color: #216ba5;\n color: white;\n font-weight: bold;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--selected:hover {\n background-color: #216ba5;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled {\n color: #ccc;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled:hover {\n cursor: default;\n background-color: transparent;\n}\n\n.react-datepicker__week-number {\n color: #ccc;\n display: inline-block;\n width: 1.7rem;\n line-height: 1.7rem;\n text-align: center;\n margin: 0.166rem;\n}\n.react-datepicker__week-number.react-datepicker__week-number--clickable {\n cursor: pointer;\n}\n.react-datepicker__week-number.react-datepicker__week-number--clickable:not(.react-datepicker__week-number--selected,\n.react-datepicker__week-number--keyboard-selected):hover {\n border-radius: 0.3rem;\n background-color: #f0f0f0;\n}\n.react-datepicker__week-number--selected {\n border-radius: 0.3rem;\n background-color: #216ba5;\n color: #fff;\n}\n.react-datepicker__week-number--selected:hover {\n background-color: #1d5d90;\n}\n.react-datepicker__week-number--keyboard-selected {\n border-radius: 0.3rem;\n background-color: #2a87d0;\n color: #fff;\n}\n.react-datepicker__week-number--keyboard-selected:hover {\n background-color: #1d5d90;\n}\n\n.react-datepicker__day-names {\n white-space: nowrap;\n margin-bottom: -8px;\n}\n\n.react-datepicker__week {\n white-space: nowrap;\n}\n\n.react-datepicker__day-name,\n.react-datepicker__day,\n.react-datepicker__time-name {\n color: #000;\n display: inline-block;\n width: 1.7rem;\n line-height: 1.7rem;\n text-align: center;\n margin: 0.166rem;\n}\n\n.react-datepicker__day,\n.react-datepicker__month-text,\n.react-datepicker__quarter-text,\n.react-datepicker__year-text {\n cursor: pointer;\n}\n.react-datepicker__day:hover,\n.react-datepicker__month-text:hover,\n.react-datepicker__quarter-text:hover,\n.react-datepicker__year-text:hover {\n border-radius: 0.3rem;\n background-color: #f0f0f0;\n}\n.react-datepicker__day--today,\n.react-datepicker__month-text--today,\n.react-datepicker__quarter-text--today,\n.react-datepicker__year-text--today {\n font-weight: bold;\n}\n.react-datepicker__day--highlighted,\n.react-datepicker__month-text--highlighted,\n.react-datepicker__quarter-text--highlighted,\n.react-datepicker__year-text--highlighted {\n border-radius: 0.3rem;\n background-color: #3dcc4a;\n color: #fff;\n}\n.react-datepicker__day--highlighted:hover,\n.react-datepicker__month-text--highlighted:hover,\n.react-datepicker__quarter-text--highlighted:hover,\n.react-datepicker__year-text--highlighted:hover {\n background-color: #32be3f;\n}\n.react-datepicker__day--highlighted-custom-1,\n.react-datepicker__month-text--highlighted-custom-1,\n.react-datepicker__quarter-text--highlighted-custom-1,\n.react-datepicker__year-text--highlighted-custom-1 {\n color: magenta;\n}\n.react-datepicker__day--highlighted-custom-2,\n.react-datepicker__month-text--highlighted-custom-2,\n.react-datepicker__quarter-text--highlighted-custom-2,\n.react-datepicker__year-text--highlighted-custom-2 {\n color: green;\n}\n.react-datepicker__day--holidays,\n.react-datepicker__month-text--holidays,\n.react-datepicker__quarter-text--holidays,\n.react-datepicker__year-text--holidays {\n position: relative;\n border-radius: 0.3rem;\n background-color: #ff6803;\n color: #fff;\n}\n.react-datepicker__day--holidays .overlay,\n.react-datepicker__month-text--holidays .overlay,\n.react-datepicker__quarter-text--holidays .overlay,\n.react-datepicker__year-text--holidays .overlay {\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n background-color: #333;\n color: #fff;\n padding: 4px;\n border-radius: 4px;\n white-space: nowrap;\n visibility: hidden;\n opacity: 0;\n transition: visibility 0s, opacity 0.3s ease-in-out;\n}\n.react-datepicker__day--holidays:hover,\n.react-datepicker__month-text--holidays:hover,\n.react-datepicker__quarter-text--holidays:hover,\n.react-datepicker__year-text--holidays:hover {\n background-color: #cf5300;\n}\n.react-datepicker__day--holidays:hover .overlay,\n.react-datepicker__month-text--holidays:hover .overlay,\n.react-datepicker__quarter-text--holidays:hover .overlay,\n.react-datepicker__year-text--holidays:hover .overlay {\n visibility: visible;\n opacity: 1;\n}\n.react-datepicker__day--selected, .react-datepicker__day--in-selecting-range, .react-datepicker__day--in-range,\n.react-datepicker__month-text--selected,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__month-text--in-range,\n.react-datepicker__quarter-text--selected,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__quarter-text--in-range,\n.react-datepicker__year-text--selected,\n.react-datepicker__year-text--in-selecting-range,\n.react-datepicker__year-text--in-range {\n border-radius: 0.3rem;\n background-color: #216ba5;\n color: #fff;\n}\n.react-datepicker__day--selected:hover, .react-datepicker__day--in-selecting-range:hover, .react-datepicker__day--in-range:hover,\n.react-datepicker__month-text--selected:hover,\n.react-datepicker__month-text--in-selecting-range:hover,\n.react-datepicker__month-text--in-range:hover,\n.react-datepicker__quarter-text--selected:hover,\n.react-datepicker__quarter-text--in-selecting-range:hover,\n.react-datepicker__quarter-text--in-range:hover,\n.react-datepicker__year-text--selected:hover,\n.react-datepicker__year-text--in-selecting-range:hover,\n.react-datepicker__year-text--in-range:hover {\n background-color: #1d5d90;\n}\n.react-datepicker__day--keyboard-selected,\n.react-datepicker__month-text--keyboard-selected,\n.react-datepicker__quarter-text--keyboard-selected,\n.react-datepicker__year-text--keyboard-selected {\n border-radius: 0.3rem;\n background-color: #bad9f1;\n color: rgb(0, 0, 0);\n}\n.react-datepicker__day--keyboard-selected:hover,\n.react-datepicker__month-text--keyboard-selected:hover,\n.react-datepicker__quarter-text--keyboard-selected:hover,\n.react-datepicker__year-text--keyboard-selected:hover {\n background-color: #1d5d90;\n}\n.react-datepicker__day--in-selecting-range:not(.react-datepicker__day--in-range,\n.react-datepicker__month-text--in-range,\n.react-datepicker__quarter-text--in-range,\n.react-datepicker__year-text--in-range),\n.react-datepicker__month-text--in-selecting-range:not(.react-datepicker__day--in-range,\n.react-datepicker__month-text--in-range,\n.react-datepicker__quarter-text--in-range,\n.react-datepicker__year-text--in-range),\n.react-datepicker__quarter-text--in-selecting-range:not(.react-datepicker__day--in-range,\n.react-datepicker__month-text--in-range,\n.react-datepicker__quarter-text--in-range,\n.react-datepicker__year-text--in-range),\n.react-datepicker__year-text--in-selecting-range:not(.react-datepicker__day--in-range,\n.react-datepicker__month-text--in-range,\n.react-datepicker__quarter-text--in-range,\n.react-datepicker__year-text--in-range) {\n background-color: rgba(33, 107, 165, 0.5);\n}\n.react-datepicker__month--selecting-range .react-datepicker__day--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range), .react-datepicker__year--selecting-range .react-datepicker__day--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__month--selecting-range .react-datepicker__month-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__year--selecting-range .react-datepicker__month-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__month--selecting-range .react-datepicker__quarter-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__year--selecting-range .react-datepicker__quarter-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__month--selecting-range .react-datepicker__year-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__year--selecting-range .react-datepicker__year-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range) {\n background-color: #f0f0f0;\n color: #000;\n}\n.react-datepicker__day--disabled,\n.react-datepicker__month-text--disabled,\n.react-datepicker__quarter-text--disabled,\n.react-datepicker__year-text--disabled {\n cursor: default;\n color: #ccc;\n}\n.react-datepicker__day--disabled:hover,\n.react-datepicker__month-text--disabled:hover,\n.react-datepicker__quarter-text--disabled:hover,\n.react-datepicker__year-text--disabled:hover {\n background-color: transparent;\n}\n.react-datepicker__day--disabled .overlay,\n.react-datepicker__month-text--disabled .overlay,\n.react-datepicker__quarter-text--disabled .overlay,\n.react-datepicker__year-text--disabled .overlay {\n position: absolute;\n bottom: 70%;\n left: 50%;\n transform: translateX(-50%);\n background-color: #333;\n color: #fff;\n padding: 4px;\n border-radius: 4px;\n white-space: nowrap;\n visibility: hidden;\n opacity: 0;\n transition: visibility 0s, opacity 0.3s ease-in-out;\n}\n\n.react-datepicker__input-container {\n position: relative;\n display: inline-block;\n width: 100%;\n}\n.react-datepicker__input-container .react-datepicker__calendar-icon {\n position: absolute;\n padding: 0.5rem;\n box-sizing: content-box;\n}\n\n.react-datepicker__view-calendar-icon input {\n padding: 6px 10px 5px 25px;\n}\n\n.react-datepicker__year-read-view,\n.react-datepicker__month-read-view,\n.react-datepicker__month-year-read-view {\n border: 1px solid transparent;\n border-radius: 0.3rem;\n position: relative;\n}\n.react-datepicker__year-read-view:hover,\n.react-datepicker__month-read-view:hover,\n.react-datepicker__month-year-read-view:hover {\n cursor: pointer;\n}\n.react-datepicker__year-read-view:hover .react-datepicker__year-read-view--down-arrow,\n.react-datepicker__year-read-view:hover .react-datepicker__month-read-view--down-arrow,\n.react-datepicker__month-read-view:hover .react-datepicker__year-read-view--down-arrow,\n.react-datepicker__month-read-view:hover .react-datepicker__month-read-view--down-arrow,\n.react-datepicker__month-year-read-view:hover .react-datepicker__year-read-view--down-arrow,\n.react-datepicker__month-year-read-view:hover .react-datepicker__month-read-view--down-arrow {\n border-top-color: #b3b3b3;\n}\n.react-datepicker__year-read-view--down-arrow,\n.react-datepicker__month-read-view--down-arrow,\n.react-datepicker__month-year-read-view--down-arrow {\n transform: rotate(135deg);\n right: -16px;\n top: 0;\n}\n\n.react-datepicker__year-dropdown,\n.react-datepicker__month-dropdown,\n.react-datepicker__month-year-dropdown {\n background-color: #f0f0f0;\n position: absolute;\n width: 50%;\n left: 25%;\n top: 30px;\n z-index: 1;\n text-align: center;\n border-radius: 0.3rem;\n border: 1px solid #aeaeae;\n}\n.react-datepicker__year-dropdown:hover,\n.react-datepicker__month-dropdown:hover,\n.react-datepicker__month-year-dropdown:hover {\n cursor: pointer;\n}\n.react-datepicker__year-dropdown--scrollable,\n.react-datepicker__month-dropdown--scrollable,\n.react-datepicker__month-year-dropdown--scrollable {\n height: 150px;\n overflow-y: scroll;\n}\n\n.react-datepicker__year-option,\n.react-datepicker__month-option,\n.react-datepicker__month-year-option {\n line-height: 20px;\n width: 100%;\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.react-datepicker__year-option:first-of-type,\n.react-datepicker__month-option:first-of-type,\n.react-datepicker__month-year-option:first-of-type {\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n.react-datepicker__year-option:last-of-type,\n.react-datepicker__month-option:last-of-type,\n.react-datepicker__month-year-option:last-of-type {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n border-bottom-left-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n.react-datepicker__year-option:hover,\n.react-datepicker__month-option:hover,\n.react-datepicker__month-year-option:hover {\n background-color: #ccc;\n}\n.react-datepicker__year-option:hover .react-datepicker__navigation--years-upcoming,\n.react-datepicker__month-option:hover .react-datepicker__navigation--years-upcoming,\n.react-datepicker__month-year-option:hover .react-datepicker__navigation--years-upcoming {\n border-bottom-color: #b3b3b3;\n}\n.react-datepicker__year-option:hover .react-datepicker__navigation--years-previous,\n.react-datepicker__month-option:hover .react-datepicker__navigation--years-previous,\n.react-datepicker__month-year-option:hover .react-datepicker__navigation--years-previous {\n border-top-color: #b3b3b3;\n}\n.react-datepicker__year-option--selected,\n.react-datepicker__month-option--selected,\n.react-datepicker__month-year-option--selected {\n position: absolute;\n left: 15px;\n}\n\n.react-datepicker__close-icon {\n cursor: pointer;\n background-color: transparent;\n border: 0;\n outline: 0;\n padding: 0 6px 0 0;\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n display: table-cell;\n vertical-align: middle;\n}\n.react-datepicker__close-icon::after {\n cursor: pointer;\n background-color: #216ba5;\n color: #fff;\n border-radius: 50%;\n height: 16px;\n width: 16px;\n padding: 2px;\n font-size: 12px;\n line-height: 1;\n text-align: center;\n display: table-cell;\n vertical-align: middle;\n content: \"×\";\n}\n.react-datepicker__close-icon--disabled {\n cursor: default;\n}\n.react-datepicker__close-icon--disabled::after {\n cursor: default;\n background-color: #ccc;\n}\n\n.react-datepicker__today-button {\n background: #f0f0f0;\n border-top: 1px solid #aeaeae;\n cursor: pointer;\n text-align: center;\n font-weight: bold;\n padding: 5px 0;\n clear: left;\n}\n\n.react-datepicker__portal {\n position: fixed;\n width: 100vw;\n height: 100vh;\n background-color: rgba(0, 0, 0, 0.8);\n left: 0;\n top: 0;\n justify-content: center;\n align-items: center;\n display: flex;\n z-index: 2147483647;\n}\n.react-datepicker__portal .react-datepicker__day-name,\n.react-datepicker__portal .react-datepicker__day,\n.react-datepicker__portal .react-datepicker__time-name {\n width: 3rem;\n line-height: 3rem;\n}\n@media (max-width: 400px), (max-height: 550px) {\n .react-datepicker__portal .react-datepicker__day-name,\n .react-datepicker__portal .react-datepicker__day,\n .react-datepicker__portal .react-datepicker__time-name {\n width: 2rem;\n line-height: 2rem;\n }\n}\n.react-datepicker__portal .react-datepicker__current-month,\n.react-datepicker__portal .react-datepicker-time__header {\n font-size: 1.44rem;\n}\n\n.react-datepicker__children-container {\n width: 13.8rem;\n margin: 0.4rem;\n padding-right: 0.2rem;\n padding-left: 0.2rem;\n height: auto;\n}\n\n.react-datepicker__aria-live {\n position: absolute;\n clip-path: circle(0);\n border: 0;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n width: 1px;\n white-space: nowrap;\n}\n\n.react-datepicker__calendar-icon {\n width: 1em;\n height: 1em;\n vertical-align: -0.125em;\n}\n"],"sourceRoot":""}]); +`, "",{"version":3,"sources":["webpack://./node_modules/react-datepicker/dist/react-datepicker.css"],"names":[],"mappings":"AAAA,gBAAgB;AAChB;;;EAGE,kBAAkB;EAClB,mBAAmB;EACnB,yBAAyB;EACzB,WAAW;EACX,cAAc;EACd,WAAW;EACX,kBAAkB;EAClB,QAAQ;EACR,UAAU;AACZ;AACA;EACE,qBAAqB;EACrB,UAAU;EACV,SAAS;AACX;;AAEA;EACE,2DAA2D;EAC3D,iBAAiB;EACjB,sBAAsB;EACtB,WAAW;EACX,yBAAyB;EACzB,qBAAqB;EACrB,qBAAqB;EACrB,kBAAkB;EAClB,oBAAoB;AACtB;;AAEA;EACE,cAAc;AAChB;AACA;;EAEE,iCAAiC;EACjC,kCAAkC;AACpC;;AAEA;EACE,UAAU;EACV,cAAc;AAChB;AACA;EACE,eAAe;AACjB;AACA;EACE,aAAa;EACb,cAAc;AAChB;AACA;EACE,UAAU;EACV,WAAW;AACb;;AAEA;EACE,kBAAkB;EAClB,yBAAyB;EACzB,gCAAgC;EAChC,8BAA8B;EAC9B,cAAc;EACd,kBAAkB;AACpB;AACA;EACE,mBAAmB;EACnB,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,+BAA+B;AACjC;;AAEA;;;;;;EAME,qBAAqB;EACrB,cAAc;AAChB;;AAEA;;;EAGE,aAAa;EACb,WAAW;EACX,iBAAiB;EACjB,mBAAmB;AACrB;;AAEA;EACE,UAAU;EACV,SAAS;AACX;;AAEA;EACE,uBAAuB;EACvB,mBAAmB;EACnB,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;EACnB,gBAAgB;EAChB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;EAClB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,UAAU;EACV,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,WAAW;EACX,mBAAmB;EACnB,gBAAgB;AAClB;AACA;EACE,SAAS;AACX;AACA;EACE,UAAU;AACZ;AACA;EACE,WAAW;AACb;AACA;EACE,kBAAkB;EAClB,MAAM;EACN,cAAc;EACd,iBAAiB;EACjB,kBAAkB;AACpB;AACA;EACE,QAAQ;AACV;AACA;EACE,SAAS;AACX;AACA;EACE,qBAAqB;AACvB;;AAEA;EACE,kBAAkB;EAClB,SAAS;EACT,eAAe;EACf,QAAQ;AACV;AACA;EACE,UAAU;AACZ;AACA;EACE,wBAAwB;EACxB,UAAU;AACZ;AACA;EACE,WAAW;AACb;AACA;EACE,yBAAyB;EACzB,WAAW;AACb;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,cAAc;EACd,kBAAkB;AACpB;AACA;EACE,aAAa;EACb,eAAe;EACf,gBAAgB;AAClB;AACA;EACE,qBAAqB;EACrB,WAAW;EACX,WAAW;AACb;;AAEA;EACE,cAAc;EACd,kBAAkB;AACpB;AACA;;EAEE,qBAAqB;EACrB,WAAW;EACX,WAAW;AACb;;AAEA;EACE,WAAW;EACX,WAAW;EACX,WAAW;EACX,uBAAuB;EACvB,gBAAgB;AAClB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,qBAAqB;AACvB;AACA;EACE,qBAAqB;EACrB,iBAAiB;AACnB;AACA;EACE,WAAW;AACb;AACA;;EAEE,wBAAwB;EACxB,SAAS;AACX;AACA;EACE,0BAA0B;AAC5B;AACA;EACE,gBAAgB;EAChB,qBAAqB;AACvB;;AAEA;EACE,YAAY;EACZ,8BAA8B;EAC9B,WAAW;AACb;AACA;EACE,eAAe;EACf,yBAAyB;EACzB,qBAAqB;EACrB,kBAAkB;EAClB,YAAY;EACZ,MAAM;AACR;AACA;EACE,kBAAkB;EAClB,iBAAiB;EACjB,kCAAkC;AACpC;AACA;EACE,WAAW;EACX,kBAAkB;EAClB,cAAc;EACd,kBAAkB;EAClB,kCAAkC;AACpC;AACA;EACE,gBAAgB;EAChB,SAAS;EACT,gCAAgC;EAChC,kBAAkB;EAClB,gBAAgB;EAChB,eAAe;EACf,WAAW;EACX,uBAAuB;AACzB;AACA;EACE,YAAY;EACZ,iBAAiB;EACjB,mBAAmB;AACrB;AACA;EACE,eAAe;EACf,yBAAyB;AAC3B;AACA;EACE,yBAAyB;EACzB,YAAY;EACZ,iBAAiB;AACnB;AACA;EACE,yBAAyB;AAC3B;AACA;EACE,WAAW;AACb;AACA;EACE,eAAe;EACf,6BAA6B;AAC/B;;AAEA;EAC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","sourcesContent":["@charset \"UTF-8\";\n.react-datepicker__year-read-view--down-arrow,\n.react-datepicker__month-read-view--down-arrow,\n.react-datepicker__month-year-read-view--down-arrow, .react-datepicker__navigation-icon::before {\n border-color: #ccc;\n border-style: solid;\n border-width: 3px 3px 0 0;\n content: \"\";\n display: block;\n height: 9px;\n position: absolute;\n top: 6px;\n width: 9px;\n}\n.react-datepicker-wrapper {\n display: inline-block;\n padding: 0;\n border: 0;\n}\n\n.react-datepicker {\n font-family: \"Helvetica Neue\", helvetica, arial, sans-serif;\n font-size: 0.8rem;\n background-color: #fff;\n color: #000;\n border: 1px solid #aeaeae;\n border-radius: 0.3rem;\n display: inline-block;\n position: relative;\n line-height: initial;\n}\n\n.react-datepicker--time-only .react-datepicker__time-container {\n border-left: 0;\n}\n.react-datepicker--time-only .react-datepicker__time,\n.react-datepicker--time-only .react-datepicker__time-box {\n border-bottom-left-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.react-datepicker-popper {\n z-index: 1;\n line-height: 0;\n}\n.react-datepicker-popper .react-datepicker__triangle {\n stroke: #aeaeae;\n}\n.react-datepicker-popper[data-placement^=bottom] .react-datepicker__triangle {\n fill: #f0f0f0;\n color: #f0f0f0;\n}\n.react-datepicker-popper[data-placement^=top] .react-datepicker__triangle {\n fill: #fff;\n color: #fff;\n}\n\n.react-datepicker__header {\n text-align: center;\n background-color: #f0f0f0;\n border-bottom: 1px solid #aeaeae;\n border-top-left-radius: 0.3rem;\n padding: 8px 0;\n position: relative;\n}\n.react-datepicker__header--time {\n padding-bottom: 8px;\n padding-left: 5px;\n padding-right: 5px;\n}\n.react-datepicker__header--time:not(.react-datepicker__header--time--only) {\n border-top-left-radius: 0;\n}\n.react-datepicker__header:not(.react-datepicker__header--has-time-select) {\n border-top-right-radius: 0.3rem;\n}\n\n.react-datepicker__year-dropdown-container--select,\n.react-datepicker__month-dropdown-container--select,\n.react-datepicker__month-year-dropdown-container--select,\n.react-datepicker__year-dropdown-container--scroll,\n.react-datepicker__month-dropdown-container--scroll,\n.react-datepicker__month-year-dropdown-container--scroll {\n display: inline-block;\n margin: 0 15px;\n}\n\n.react-datepicker__current-month,\n.react-datepicker-time__header,\n.react-datepicker-year-header {\n margin-top: 0;\n color: #000;\n font-weight: bold;\n font-size: 0.944rem;\n}\n\nh2.react-datepicker__current-month {\n padding: 0;\n margin: 0;\n}\n\n.react-datepicker-time__header {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.react-datepicker__navigation {\n align-items: center;\n background: none;\n display: flex;\n justify-content: center;\n text-align: center;\n cursor: pointer;\n position: absolute;\n top: 2px;\n padding: 0;\n border: none;\n z-index: 1;\n height: 32px;\n width: 32px;\n text-indent: -999em;\n overflow: hidden;\n}\n.react-datepicker__navigation--previous {\n left: 2px;\n}\n.react-datepicker__navigation--next {\n right: 2px;\n}\n.react-datepicker__navigation--next--with-time:not(.react-datepicker__navigation--next--with-today-button) {\n right: 85px;\n}\n.react-datepicker__navigation--years {\n position: relative;\n top: 0;\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.react-datepicker__navigation--years-previous {\n top: 4px;\n}\n.react-datepicker__navigation--years-upcoming {\n top: -4px;\n}\n.react-datepicker__navigation:hover *::before {\n border-color: #a6a6a6;\n}\n\n.react-datepicker__navigation-icon {\n position: relative;\n top: -1px;\n font-size: 20px;\n width: 0;\n}\n.react-datepicker__navigation-icon--next {\n left: -2px;\n}\n.react-datepicker__navigation-icon--next::before {\n transform: rotate(45deg);\n left: -7px;\n}\n.react-datepicker__navigation-icon--previous {\n right: -2px;\n}\n.react-datepicker__navigation-icon--previous::before {\n transform: rotate(225deg);\n right: -7px;\n}\n\n.react-datepicker__month-container {\n float: left;\n}\n\n.react-datepicker__year {\n margin: 0.4rem;\n text-align: center;\n}\n.react-datepicker__year-wrapper {\n display: flex;\n flex-wrap: wrap;\n max-width: 180px;\n}\n.react-datepicker__year .react-datepicker__year-text {\n display: inline-block;\n width: 4rem;\n margin: 2px;\n}\n\n.react-datepicker__month {\n margin: 0.4rem;\n text-align: center;\n}\n.react-datepicker__month .react-datepicker__month-text,\n.react-datepicker__month .react-datepicker__quarter-text {\n display: inline-block;\n width: 4rem;\n margin: 2px;\n}\n\n.react-datepicker__input-time-container {\n clear: both;\n width: 100%;\n float: left;\n margin: 5px 0 10px 15px;\n text-align: left;\n}\n.react-datepicker__input-time-container .react-datepicker-time__caption {\n display: inline-block;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container {\n display: inline-block;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input {\n display: inline-block;\n margin-left: 10px;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input {\n width: auto;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]::-webkit-inner-spin-button,\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__input input[type=time] {\n -moz-appearance: textfield;\n}\n.react-datepicker__input-time-container .react-datepicker-time__input-container .react-datepicker-time__delimiter {\n margin-left: 5px;\n display: inline-block;\n}\n\n.react-datepicker__time-container {\n float: right;\n border-left: 1px solid #aeaeae;\n width: 85px;\n}\n.react-datepicker__time-container--with-today-button {\n display: inline;\n border: 1px solid #aeaeae;\n border-radius: 0.3rem;\n position: absolute;\n right: -87px;\n top: 0;\n}\n.react-datepicker__time-container .react-datepicker__time {\n position: relative;\n background: white;\n border-bottom-right-radius: 0.3rem;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box {\n width: 85px;\n overflow-x: hidden;\n margin: 0 auto;\n text-align: center;\n border-bottom-right-radius: 0.3rem;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list {\n list-style: none;\n margin: 0;\n height: calc(195px + 1.7rem / 2);\n overflow-y: scroll;\n padding-right: 0;\n padding-left: 0;\n width: 100%;\n box-sizing: content-box;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item {\n height: 30px;\n padding: 5px 10px;\n white-space: nowrap;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item:hover {\n cursor: pointer;\n background-color: #f0f0f0;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--selected {\n background-color: #216ba5;\n color: white;\n font-weight: bold;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--selected:hover {\n background-color: #216ba5;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled {\n color: #ccc;\n}\n.react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled:hover {\n cursor: default;\n background-color: transparent;\n}\n\n.react-datepicker__week-number {\n color: #ccc;\n display: inline-block;\n width: 1.7rem;\n line-height: 1.7rem;\n text-align: center;\n margin: 0.166rem;\n}\n.react-datepicker__week-number.react-datepicker__week-number--clickable {\n cursor: pointer;\n}\n.react-datepicker__week-number.react-datepicker__week-number--clickable:not(.react-datepicker__week-number--selected,\n.react-datepicker__week-number--keyboard-selected):hover {\n border-radius: 0.3rem;\n background-color: #f0f0f0;\n}\n.react-datepicker__week-number--selected {\n border-radius: 0.3rem;\n background-color: #216ba5;\n color: #fff;\n}\n.react-datepicker__week-number--selected:hover {\n background-color: #1d5d90;\n}\n.react-datepicker__week-number--keyboard-selected {\n border-radius: 0.3rem;\n background-color: #2a87d0;\n color: #fff;\n}\n.react-datepicker__week-number--keyboard-selected:hover {\n background-color: #1d5d90;\n}\n\n.react-datepicker__day-names {\n white-space: nowrap;\n margin-bottom: -8px;\n}\n\n.react-datepicker__week {\n white-space: nowrap;\n}\n\n.react-datepicker__day-name,\n.react-datepicker__day,\n.react-datepicker__time-name {\n color: #000;\n display: inline-block;\n width: 1.7rem;\n line-height: 1.7rem;\n text-align: center;\n margin: 0.166rem;\n}\n\n.react-datepicker__day,\n.react-datepicker__month-text,\n.react-datepicker__quarter-text,\n.react-datepicker__year-text {\n cursor: pointer;\n}\n.react-datepicker__day:hover,\n.react-datepicker__month-text:hover,\n.react-datepicker__quarter-text:hover,\n.react-datepicker__year-text:hover {\n border-radius: 0.3rem;\n background-color: #f0f0f0;\n}\n.react-datepicker__day--today,\n.react-datepicker__month-text--today,\n.react-datepicker__quarter-text--today,\n.react-datepicker__year-text--today {\n font-weight: bold;\n}\n.react-datepicker__day--highlighted,\n.react-datepicker__month-text--highlighted,\n.react-datepicker__quarter-text--highlighted,\n.react-datepicker__year-text--highlighted {\n border-radius: 0.3rem;\n background-color: #3dcc4a;\n color: #fff;\n}\n.react-datepicker__day--highlighted:hover,\n.react-datepicker__month-text--highlighted:hover,\n.react-datepicker__quarter-text--highlighted:hover,\n.react-datepicker__year-text--highlighted:hover {\n background-color: #32be3f;\n}\n.react-datepicker__day--highlighted-custom-1,\n.react-datepicker__month-text--highlighted-custom-1,\n.react-datepicker__quarter-text--highlighted-custom-1,\n.react-datepicker__year-text--highlighted-custom-1 {\n color: magenta;\n}\n.react-datepicker__day--highlighted-custom-2,\n.react-datepicker__month-text--highlighted-custom-2,\n.react-datepicker__quarter-text--highlighted-custom-2,\n.react-datepicker__year-text--highlighted-custom-2 {\n color: green;\n}\n.react-datepicker__day--holidays,\n.react-datepicker__month-text--holidays,\n.react-datepicker__quarter-text--holidays,\n.react-datepicker__year-text--holidays {\n position: relative;\n border-radius: 0.3rem;\n background-color: #ff6803;\n color: #fff;\n}\n.react-datepicker__day--holidays .overlay,\n.react-datepicker__month-text--holidays .overlay,\n.react-datepicker__quarter-text--holidays .overlay,\n.react-datepicker__year-text--holidays .overlay {\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n background-color: #333;\n color: #fff;\n padding: 4px;\n border-radius: 4px;\n white-space: nowrap;\n visibility: hidden;\n opacity: 0;\n transition: visibility 0s, opacity 0.3s ease-in-out;\n}\n.react-datepicker__day--holidays:hover,\n.react-datepicker__month-text--holidays:hover,\n.react-datepicker__quarter-text--holidays:hover,\n.react-datepicker__year-text--holidays:hover {\n background-color: #cf5300;\n}\n.react-datepicker__day--holidays:hover .overlay,\n.react-datepicker__month-text--holidays:hover .overlay,\n.react-datepicker__quarter-text--holidays:hover .overlay,\n.react-datepicker__year-text--holidays:hover .overlay {\n visibility: visible;\n opacity: 1;\n}\n.react-datepicker__day--selected, .react-datepicker__day--in-selecting-range, .react-datepicker__day--in-range,\n.react-datepicker__month-text--selected,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__month-text--in-range,\n.react-datepicker__quarter-text--selected,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__quarter-text--in-range,\n.react-datepicker__year-text--selected,\n.react-datepicker__year-text--in-selecting-range,\n.react-datepicker__year-text--in-range {\n border-radius: 0.3rem;\n background-color: #216ba5;\n color: #fff;\n}\n.react-datepicker__day--selected:hover, .react-datepicker__day--in-selecting-range:hover, .react-datepicker__day--in-range:hover,\n.react-datepicker__month-text--selected:hover,\n.react-datepicker__month-text--in-selecting-range:hover,\n.react-datepicker__month-text--in-range:hover,\n.react-datepicker__quarter-text--selected:hover,\n.react-datepicker__quarter-text--in-selecting-range:hover,\n.react-datepicker__quarter-text--in-range:hover,\n.react-datepicker__year-text--selected:hover,\n.react-datepicker__year-text--in-selecting-range:hover,\n.react-datepicker__year-text--in-range:hover {\n background-color: #1d5d90;\n}\n.react-datepicker__day--keyboard-selected,\n.react-datepicker__month-text--keyboard-selected,\n.react-datepicker__quarter-text--keyboard-selected,\n.react-datepicker__year-text--keyboard-selected {\n border-radius: 0.3rem;\n background-color: #bad9f1;\n color: rgb(0, 0, 0);\n}\n.react-datepicker__day--keyboard-selected:hover,\n.react-datepicker__month-text--keyboard-selected:hover,\n.react-datepicker__quarter-text--keyboard-selected:hover,\n.react-datepicker__year-text--keyboard-selected:hover {\n background-color: #1d5d90;\n}\n.react-datepicker__day--in-selecting-range:not(.react-datepicker__day--in-range,\n.react-datepicker__month-text--in-range,\n.react-datepicker__quarter-text--in-range,\n.react-datepicker__year-text--in-range),\n.react-datepicker__month-text--in-selecting-range:not(.react-datepicker__day--in-range,\n.react-datepicker__month-text--in-range,\n.react-datepicker__quarter-text--in-range,\n.react-datepicker__year-text--in-range),\n.react-datepicker__quarter-text--in-selecting-range:not(.react-datepicker__day--in-range,\n.react-datepicker__month-text--in-range,\n.react-datepicker__quarter-text--in-range,\n.react-datepicker__year-text--in-range),\n.react-datepicker__year-text--in-selecting-range:not(.react-datepicker__day--in-range,\n.react-datepicker__month-text--in-range,\n.react-datepicker__quarter-text--in-range,\n.react-datepicker__year-text--in-range) {\n background-color: rgba(33, 107, 165, 0.5);\n}\n.react-datepicker__month--selecting-range .react-datepicker__day--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range), .react-datepicker__year--selecting-range .react-datepicker__day--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__month--selecting-range .react-datepicker__month-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__year--selecting-range .react-datepicker__month-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__month--selecting-range .react-datepicker__quarter-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__year--selecting-range .react-datepicker__quarter-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__month--selecting-range .react-datepicker__year-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range),\n.react-datepicker__year--selecting-range .react-datepicker__year-text--in-range:not(.react-datepicker__day--in-selecting-range,\n.react-datepicker__month-text--in-selecting-range,\n.react-datepicker__quarter-text--in-selecting-range,\n.react-datepicker__year-text--in-selecting-range) {\n background-color: #f0f0f0;\n color: #000;\n}\n.react-datepicker__day--disabled,\n.react-datepicker__month-text--disabled,\n.react-datepicker__quarter-text--disabled,\n.react-datepicker__year-text--disabled {\n cursor: default;\n color: #ccc;\n}\n.react-datepicker__day--disabled:hover,\n.react-datepicker__month-text--disabled:hover,\n.react-datepicker__quarter-text--disabled:hover,\n.react-datepicker__year-text--disabled:hover {\n background-color: transparent;\n}\n.react-datepicker__day--disabled .overlay,\n.react-datepicker__month-text--disabled .overlay,\n.react-datepicker__quarter-text--disabled .overlay,\n.react-datepicker__year-text--disabled .overlay {\n position: absolute;\n bottom: 70%;\n left: 50%;\n transform: translateX(-50%);\n background-color: #333;\n color: #fff;\n padding: 4px;\n border-radius: 4px;\n white-space: nowrap;\n visibility: hidden;\n opacity: 0;\n transition: visibility 0s, opacity 0.3s ease-in-out;\n}\n\n.react-datepicker__input-container {\n position: relative;\n display: inline-block;\n width: 100%;\n}\n.react-datepicker__input-container .react-datepicker__calendar-icon {\n position: absolute;\n padding: 0.5rem;\n box-sizing: content-box;\n}\n\n.react-datepicker__view-calendar-icon input {\n padding: 6px 10px 5px 25px;\n}\n\n.react-datepicker__year-read-view,\n.react-datepicker__month-read-view,\n.react-datepicker__month-year-read-view {\n border: 1px solid transparent;\n border-radius: 0.3rem;\n position: relative;\n}\n.react-datepicker__year-read-view:hover,\n.react-datepicker__month-read-view:hover,\n.react-datepicker__month-year-read-view:hover {\n cursor: pointer;\n}\n.react-datepicker__year-read-view:hover .react-datepicker__year-read-view--down-arrow,\n.react-datepicker__year-read-view:hover .react-datepicker__month-read-view--down-arrow,\n.react-datepicker__month-read-view:hover .react-datepicker__year-read-view--down-arrow,\n.react-datepicker__month-read-view:hover .react-datepicker__month-read-view--down-arrow,\n.react-datepicker__month-year-read-view:hover .react-datepicker__year-read-view--down-arrow,\n.react-datepicker__month-year-read-view:hover .react-datepicker__month-read-view--down-arrow {\n border-top-color: #b3b3b3;\n}\n.react-datepicker__year-read-view--down-arrow,\n.react-datepicker__month-read-view--down-arrow,\n.react-datepicker__month-year-read-view--down-arrow {\n transform: rotate(135deg);\n right: -16px;\n top: 0;\n}\n\n.react-datepicker__year-dropdown,\n.react-datepicker__month-dropdown,\n.react-datepicker__month-year-dropdown {\n background-color: #f0f0f0;\n position: absolute;\n width: 50%;\n left: 25%;\n top: 30px;\n z-index: 1;\n text-align: center;\n border-radius: 0.3rem;\n border: 1px solid #aeaeae;\n}\n.react-datepicker__year-dropdown:hover,\n.react-datepicker__month-dropdown:hover,\n.react-datepicker__month-year-dropdown:hover {\n cursor: pointer;\n}\n.react-datepicker__year-dropdown--scrollable,\n.react-datepicker__month-dropdown--scrollable,\n.react-datepicker__month-year-dropdown--scrollable {\n height: 150px;\n overflow-y: scroll;\n}\n\n.react-datepicker__year-option,\n.react-datepicker__month-option,\n.react-datepicker__month-year-option {\n line-height: 20px;\n width: 100%;\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.react-datepicker__year-option:first-of-type,\n.react-datepicker__month-option:first-of-type,\n.react-datepicker__month-year-option:first-of-type {\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n.react-datepicker__year-option:last-of-type,\n.react-datepicker__month-option:last-of-type,\n.react-datepicker__month-year-option:last-of-type {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n border-bottom-left-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n.react-datepicker__year-option:hover,\n.react-datepicker__month-option:hover,\n.react-datepicker__month-year-option:hover {\n background-color: #ccc;\n}\n.react-datepicker__year-option:hover .react-datepicker__navigation--years-upcoming,\n.react-datepicker__month-option:hover .react-datepicker__navigation--years-upcoming,\n.react-datepicker__month-year-option:hover .react-datepicker__navigation--years-upcoming {\n border-bottom-color: #b3b3b3;\n}\n.react-datepicker__year-option:hover .react-datepicker__navigation--years-previous,\n.react-datepicker__month-option:hover .react-datepicker__navigation--years-previous,\n.react-datepicker__month-year-option:hover .react-datepicker__navigation--years-previous {\n border-top-color: #b3b3b3;\n}\n.react-datepicker__year-option--selected,\n.react-datepicker__month-option--selected,\n.react-datepicker__month-year-option--selected {\n position: absolute;\n left: 15px;\n}\n\n.react-datepicker__close-icon {\n cursor: pointer;\n background-color: transparent;\n border: 0;\n outline: 0;\n padding: 0 6px 0 0;\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n display: table-cell;\n vertical-align: middle;\n}\n.react-datepicker__close-icon::after {\n cursor: pointer;\n background-color: #216ba5;\n color: #fff;\n border-radius: 50%;\n height: 16px;\n width: 16px;\n padding: 2px;\n font-size: 12px;\n line-height: 1;\n text-align: center;\n display: table-cell;\n vertical-align: middle;\n content: \"×\";\n}\n.react-datepicker__close-icon--disabled {\n cursor: default;\n}\n.react-datepicker__close-icon--disabled::after {\n cursor: default;\n background-color: #ccc;\n}\n\n.react-datepicker__today-button {\n background: #f0f0f0;\n border-top: 1px solid #aeaeae;\n cursor: pointer;\n text-align: center;\n font-weight: bold;\n padding: 5px 0;\n clear: left;\n}\n\n.react-datepicker__portal {\n position: fixed;\n width: 100vw;\n height: 100vh;\n background-color: rgba(0, 0, 0, 0.8);\n left: 0;\n top: 0;\n justify-content: center;\n align-items: center;\n display: flex;\n z-index: 2147483647;\n}\n.react-datepicker__portal .react-datepicker__day-name,\n.react-datepicker__portal .react-datepicker__day,\n.react-datepicker__portal .react-datepicker__time-name {\n width: 3rem;\n line-height: 3rem;\n}\n@media (max-width: 400px), (max-height: 550px) {\n .react-datepicker__portal .react-datepicker__day-name,\n .react-datepicker__portal .react-datepicker__day,\n .react-datepicker__portal .react-datepicker__time-name {\n width: 2rem;\n line-height: 2rem;\n }\n}\n.react-datepicker__portal .react-datepicker__current-month,\n.react-datepicker__portal .react-datepicker-time__header {\n font-size: 1.44rem;\n}\n\n.react-datepicker__children-container {\n width: 13.8rem;\n margin: 0.4rem;\n padding-right: 0.2rem;\n padding-left: 0.2rem;\n height: auto;\n}\n\n.react-datepicker__aria-live {\n position: absolute;\n clip-path: circle(0);\n border: 0;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n width: 1px;\n white-space: nowrap;\n}\n\n.react-datepicker__calendar-icon {\n width: 1em;\n height: 1em;\n vertical-align: -0.125em;\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -18416,7 +55352,7 @@ var ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_g var ___CSS_LOADER_URL_REPLACEMENT_2___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_2___); // Module ___CSS_LOADER_EXPORT___.push([module.id, `/* -! tailwindcss v3.4.7 | MIT License | https://tailwindcss.com +! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com *//* 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) @@ -19156,8 +56092,6 @@ html { height: 1.25rem; font-size: 0.875rem; line-height: 1.25rem; - width: -webkit-fit-content; - width: -moz-fit-content; width: fit-content; padding-left: 0.563rem; padding-right: 0.563rem; @@ -19630,43 +56564,6 @@ html { --tw-bg-opacity: 1; background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); } -.op-file-input::-webkit-file-upload-button { - margin-inline-end: 1rem; - display: inline-flex; - height: 100%; - flex-shrink: 0; - cursor: pointer; - -webkit-user-select: none; - user-select: none; - flex-wrap: wrap; - align-items: center; - justify-content: center; - padding-left: 1rem; - padding-right: 1rem; - text-align: center; - font-size: 0.875rem; - line-height: 1.25rem; - line-height: 1em; - -webkit-transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - transition-duration: 200ms; - border-style: solid; - --tw-border-opacity: 1; - border-color: var(--fallback-n,oklch(var(--n)/var(--tw-border-opacity))); - --tw-bg-opacity: 1; - background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); - font-weight: 600; - text-transform: uppercase; - --tw-text-opacity: 1; - color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity))); - text-decoration-line: none; - border-width: var(--border-btn, 1px); - animation: button-pop var(--animation-btn, 0.25s) ease-out; -} .op-file-input::file-selector-button { margin-inline-end: 1rem; display: inline-flex; @@ -19846,7 +56743,6 @@ html { align-content: flex-start; align-items: center; gap: 0.5rem; - grid-auto-columns: minmax(auto, -webkit-max-content) auto -webkit-max-content; grid-auto-columns: minmax(auto, max-content) auto max-content; -webkit-user-select: none; user-select: none; @@ -20058,7 +56954,6 @@ input.op-tab:checked + .op-tab-content, line-height: 1.25rem; } .op-table :where(.op-table-pin-rows thead tr) { - position: -webkit-sticky; position: sticky; top: 0px; z-index: 1; @@ -20066,7 +56961,6 @@ input.op-tab:checked + .op-tab-content, background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); } .op-table :where(.op-table-pin-rows tfoot tr) { - position: -webkit-sticky; position: sticky; bottom: 0px; z-index: 1; @@ -20074,7 +56968,6 @@ input.op-tab:checked + .op-tab-content, background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); } .op-table :where(.op-table-pin-cols tr th) { - position: -webkit-sticky; position: sticky; left: 0px; right: 0px; @@ -20579,13 +57472,6 @@ input.op-tab:checked + .op-tab-content, color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); --tw-placeholder-opacity: 0.2; } -.op-file-input-disabled::-webkit-file-upload-button, .op-file-input[disabled]::-webkit-file-upload-button { - --tw-border-opacity: 0; - background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); - --tw-bg-opacity: 0.2; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); - --tw-text-opacity: 0.2; -} .op-file-input-disabled::file-selector-button, .op-file-input[disabled]::file-selector-button { --tw-border-opacity: 0; background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); @@ -21278,10 +58164,6 @@ input.op-tab:checked + .op-tab-content, line-height: 1.25rem; line-height: 2; } -.op-file-input-sm::-webkit-file-upload-button { - margin-right: 0.75rem; - font-size: 0.875rem; -} .op-file-input-sm::file-selector-button { margin-right: 0.75rem; font-size: 0.875rem; @@ -21487,7 +58369,6 @@ input.op-tab:checked + .op-tab-content, position: relative; } .sticky { - position: -webkit-sticky; position: sticky; } .inset-0 { @@ -21559,6 +58440,9 @@ input.op-tab:checked + .op-tab-content, .top-3 { top: 0.75rem; } +.top-\\[10\\%\\] { + top: 10%; +} .top-\\[1px\\] { top: 1px; } @@ -21742,10 +58626,6 @@ input.op-tab:checked + .op-tab-content, margin-top: 5px; margin-bottom: 5px; } -.mx-8 { - margin-left: 2rem; - margin-right: 2rem; -} .mb-0 { margin-bottom: 0px; } @@ -21761,6 +58641,9 @@ input.op-tab:checked + .op-tab-content, .mb-2 { margin-bottom: 0.5rem; } +.mb-2\\.5 { + margin-bottom: 0.625rem; +} .mb-3 { margin-bottom: 0.75rem; } @@ -21818,6 +58701,9 @@ input.op-tab:checked + .op-tab-content, .ml-\\[13px\\] { margin-left: 13px; } +.ml-\\[20px\\] { + margin-left: 20px; +} .ml-\\[2px\\] { margin-left: 2px; } @@ -21920,8 +58806,8 @@ input.op-tab:checked + .op-tab-content, .mt-\\[3px\\] { margin-top: 3px; } -.mt-\\[50px\\] { - margin-top: 50px; +.mt-\\[43px\\] { + margin-top: 43px; } .mt-\\[5px\\] { margin-top: 5px; @@ -21992,6 +58878,9 @@ input.op-tab:checked + .op-tab-content, .h-\\[120px\\] { height: 120px; } +.h-\\[130px\\] { + height: 130px; +} .h-\\[140px\\] { height: 140px; } @@ -22001,9 +58890,6 @@ input.op-tab:checked + .op-tab-content, .h-\\[150px\\] { height: 150px; } -.h-\\[15px\\] { - height: 15px; -} .h-\\[19px\\] { height: 19px; } @@ -22058,6 +58944,9 @@ input.op-tab:checked + .op-tab-content, .h-\\[66px\\] { height: 66px; } +.h-\\[70px\\] { + height: 70px; +} .h-\\[75px\\] { height: 75px; } @@ -22073,9 +58962,6 @@ input.op-tab:checked + .op-tab-content, .h-screen { height: 100vh; } -.h-\\[70px\\] { - height: 70px; -} .max-h-96 { max-height: 24rem; } @@ -22119,7 +59005,6 @@ input.op-tab:checked + .op-tab-content, max-height: 100vh; } .min-h-max { - min-height: -webkit-max-content; min-height: max-content; } .min-h-screen { @@ -22131,6 +59016,9 @@ input.op-tab:checked + .op-tab-content, .w-1\\/4 { width: 25%; } +.w-28 { + width: 7rem; +} .w-4 { width: 1rem; } @@ -22164,12 +59052,12 @@ input.op-tab:checked + .op-tab-content, .w-\\[150px\\] { width: 150px; } -.w-\\[15px\\] { - width: 15px; -} .w-\\[18\\%\\] { width: 18%; } +.w-\\[180px\\] { + width: 180px; +} .w-\\[183px\\] { width: 183px; } @@ -22197,6 +59085,9 @@ input.op-tab:checked + .op-tab-content, .w-\\[26px\\] { width: 26px; } +.w-\\[280px\\] { + width: 280px; +} .w-\\[30\\%\\] { width: 30%; } @@ -22215,6 +59106,9 @@ input.op-tab:checked + .op-tab-content, .w-\\[4rem\\] { width: 4rem; } +.w-\\[50\\%\\] { + width: 50%; +} .w-\\[50px\\] { width: 50px; } @@ -22249,17 +59143,23 @@ input.op-tab:checked + .op-tab-content, width: auto; } .w-fit { - width: -webkit-fit-content; - width: -moz-fit-content; width: fit-content; } .w-full { width: 100%; } .w-max { - width: -webkit-max-content; width: max-content; } +.w-\\[185px\\] { + width: 185px; +} +.w-\\[190px\\] { + width: 190px; +} +.w-\\[195px\\] { + width: 195px; +} .min-w-56 { min-width: 14rem; } @@ -22507,8 +59407,8 @@ input.op-tab:checked + .op-tab-content, .rounded { border-radius: 0.25rem; } -.rounded-\\[0\\.350rem\\] { - border-radius: 0.350rem; +.rounded-\\[1px\\] { + border-radius: 1px; } .rounded-\\[2px\\] { border-radius: 2px; @@ -22617,10 +59517,6 @@ input.op-tab:checked + .op-tab-content, --tw-border-opacity: 1; border-color: rgb(235 232 232 / var(--tw-border-opacity)); } -.border-\\[\\#f0a8a8\\] { - --tw-border-opacity: 1; - border-color: rgb(240 168 168 / var(--tw-border-opacity)); -} .border-\\[gray\\] { --tw-border-opacity: 1; border-color: rgb(128 128 128 / var(--tw-border-opacity)); @@ -22681,6 +59577,10 @@ input.op-tab:checked + .op-tab-content, --tw-bg-opacity: 1; background-color: rgb(159 159 159 / var(--tw-bg-opacity)); } +.bg-\\[\\#CAE4FA\\] { + --tw-bg-opacity: 1; + background-color: rgb(202 228 250 / var(--tw-bg-opacity)); +} .bg-\\[\\#b7b3b3\\] { --tw-bg-opacity: 1; background-color: rgb(183 179 179 / var(--tw-bg-opacity)); @@ -22700,10 +59600,6 @@ input.op-tab:checked + .op-tab-content, .bg-\\[\\#e6f2f2\\]\\/70 { background-color: rgb(230 242 242 / 0.7); } -.bg-\\[\\#f4bebe\\] { - --tw-bg-opacity: 1; - background-color: rgb(244 190 190 / var(--tw-bg-opacity)); -} .bg-\\[\\#fff\\] { --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); @@ -22767,10 +59663,6 @@ input.op-tab:checked + .op-tab-content, .bg-white\\/20 { background-color: rgb(255 255 255 / 0.2); } -.bg-\\[\\#ffffff\\] { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} .bg-opacity-20 { --tw-bg-opacity: 0.2; } @@ -22795,6 +59687,12 @@ input.op-tab:checked + .op-tab-content, .p-0 { padding: 0px; } +.p-1 { + padding: 0.25rem; +} +.p-14 { + padding: 3.5rem; +} .p-2 { padding: 0.5rem; } @@ -22822,9 +59720,6 @@ input.op-tab:checked + .op-tab-content, .p-\\[2px\\] { padding: 2px; } -.p-\\[2rem\\] { - padding: 2rem; -} .p-\\[30px\\] { padding: 30px; } @@ -22841,6 +59736,10 @@ input.op-tab:checked + .op-tab-content, padding-left: 0px; padding-right: 0px; } +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; @@ -23187,10 +60086,6 @@ input.op-tab:checked + .op-tab-content, --tw-text-opacity: 1; color: rgb(172 72 72 / var(--tw-text-opacity)); } -.text-\\[\\#c42121\\] { - --tw-text-opacity: 1; - color: rgb(196 33 33 / var(--tw-text-opacity)); -} .text-\\[\\#f5405e\\] { --tw-text-opacity: 1; color: rgb(245 64 94 / var(--tw-text-opacity)); @@ -23239,6 +60134,10 @@ input.op-tab:checked + .op-tab-content, --tw-text-opacity: 1; color: rgb(37 99 235 / var(--tw-text-opacity)); } +.text-blue-800 { + --tw-text-opacity: 1; + color: rgb(30 64 175 / var(--tw-text-opacity)); +} .text-gray-300 { --tw-text-opacity: 1; color: rgb(209 213 219 / var(--tw-text-opacity)); @@ -23427,6 +60326,10 @@ body { --tw-text-opacity: 1; color: var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity))); } +.op-text-accent { + --tw-text-opacity: 1; + color: var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity))); +} .op-text-success { --tw-text-opacity: 1; color: var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity))); @@ -23608,6 +60511,11 @@ body { color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); } +.hover\\:text-blue-800:hover { + --tw-text-opacity: 1; + color: rgb(30 64 175 / var(--tw-text-opacity)); +} + .hover\\:text-white:hover { --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); @@ -23715,20 +60623,24 @@ body { margin-bottom: 0px; } - .md\\:mb-1 { - margin-bottom: 0.25rem; + .md\\:mb-3 { + margin-bottom: 0.75rem; } .md\\:ml-0 { margin-left: 0px; } + .md\\:ml-4 { + margin-left: 1rem; + } + .md\\:mr-0 { margin-right: 0px; } - .md\\:mt-\\[41px\\] { - margin-top: 41px; + .md\\:mt-2 { + margin-top: 0.5rem; } .md\\:block { @@ -23775,6 +60687,14 @@ body { width: 100%; } + .md\\:w-\\[15\\%\\] { + width: 15%; + } + + .md\\:w-\\[150px\\] { + width: 150px; + } + .md\\:w-\\[200px\\] { width: 200px; } @@ -23839,6 +60759,10 @@ body { width: 95%; } + .md\\:w-auto { + width: auto; + } + .md\\:min-w-\\[440px\\] { min-width: 440px; } @@ -23875,10 +60799,18 @@ body { align-items: center; } + .md\\:justify-start { + justify-content: flex-start; + } + .md\\:justify-between { justify-content: space-between; } + .md\\:gap-1 { + gap: 0.25rem; + } + .md\\:gap-6 { gap: 1.5rem; } @@ -23917,6 +60849,10 @@ body { padding-bottom: 1.25rem; } + .md\\:pb-0 { + padding-bottom: 0px; + } + .md\\:pb-4 { padding-bottom: 1rem; } @@ -24063,10 +60999,6 @@ body { @media (min-width: 1280px) { - .xl\\:mt-\\[63px\\] { - margin-top: 63px; - } - .xl\\:w-\\[500px\\] { width: 500px; } @@ -24130,7 +61062,8 @@ body { --tw-bg-opacity: 1; background-color: rgb(55 65 81 / var(--tw-bg-opacity)); } -}`, "",{"version":3,"sources":["webpack://./src/index.css"],"names":[],"mappings":"AAAA;;CAAc,CAAd;;;CAAc;;AAAd;;;EAAA,sBAAc,EAAd,MAAc;EAAd,eAAc,EAAd,MAAc;EAAd,mBAAc,EAAd,MAAc;EAAd,qBAAc,EAAd,MAAc;AAAA;;AAAd;;EAAA,gBAAc;AAAA;;AAAd;;;;;;;;CAAc;;AAAd;;EAAA,gBAAc,EAAd,MAAc;EAAd,8BAAc,EAAd,MAAc,EAAd,MAAc;EAAd,WAAc,EAAd,MAAc;EAAd,+HAAc,EAAd,MAAc;EAAd,6BAAc,EAAd,MAAc;EAAd,+BAAc,EAAd,MAAc;EAAd,wCAAc,EAAd,MAAc;AAAA;;AAAd;;;CAAc;;AAAd;EAAA,SAAc,EAAd,MAAc;EAAd,oBAAc,EAAd,MAAc;AAAA;;AAAd;;;;CAAc;;AAAd;EAAA,SAAc,EAAd,MAAc;EAAd,cAAc,EAAd,MAAc;EAAd,qBAAc,EAAd,MAAc;AAAA;;AAAd;;CAAc;;AAAd;EAAA,yCAAc;UAAd,iCAAc;AAAA;;AAAd;;CAAc;;AAAd;;;;;;EAAA,kBAAc;EAAd,oBAAc;AAAA;;AAAd;;CAAc;;AAAd;EAAA,cAAc;EAAd,wBAAc;AAAA;;AAAd;;CAAc;;AAAd;;EAAA,mBAAc;AAAA;;AAAd;;;;;CAAc;;AAAd;;;;EAAA,+GAAc,EAAd,MAAc;EAAd,6BAAc,EAAd,MAAc;EAAd,+BAAc,EAAd,MAAc;EAAd,cAAc,EAAd,MAAc;AAAA;;AAAd;;CAAc;;AAAd;EAAA,cAAc;AAAA;;AAAd;;CAAc;;AAAd;;EAAA,cAAc;EAAd,cAAc;EAAd,kBAAc;EAAd,wBAAc;AAAA;;AAAd;EAAA,eAAc;AAAA;;AAAd;EAAA,WAAc;AAAA;;AAAd;;;;CAAc;;AAAd;EAAA,cAAc,EAAd,MAAc;EAAd,qBAAc,EAAd,MAAc;EAAd,yBAAc,EAAd,MAAc;AAAA;;AAAd;;;;CAAc;;AAAd;;;;;EAAA,oBAAc,EAAd,MAAc;EAAd,8BAAc,EAAd,MAAc;EAAd,gCAAc,EAAd,MAAc;EAAd,eAAc,EAAd,MAAc;EAAd,oBAAc,EAAd,MAAc;EAAd,oBAAc,EAAd,MAAc;EAAd,uBAAc,EAAd,MAAc;EAAd,cAAc,EAAd,MAAc;EAAd,SAAc,EAAd,MAAc;EAAd,UAAc,EAAd,MAAc;AAAA;;AAAd;;CAAc;;AAAd;;EAAA,oBAAc;AAAA;;AAAd;;;CAAc;;AAAd;;;;EAAA,0BAAc,EAAd,MAAc;EAAd,6BAAc,EAAd,MAAc;EAAd,sBAAc,EAAd,MAAc;AAAA;;AAAd;;CAAc;;AAAd;EAAA,aAAc;AAAA;;AAAd;;CAAc;;AAAd;EAAA,gBAAc;AAAA;;AAAd;;CAAc;;AAAd;EAAA,wBAAc;AAAA;;AAAd;;CAAc;;AAAd;;EAAA,YAAc;AAAA;;AAAd;;;CAAc;;AAAd;EAAA,6BAAc,EAAd,MAAc;EAAd,oBAAc,EAAd,MAAc;AAAA;;AAAd;;CAAc;;AAAd;EAAA,wBAAc;AAAA;;AAAd;;;CAAc;;AAAd;EAAA,0BAAc,EAAd,MAAc;EAAd,aAAc,EAAd,MAAc;AAAA;;AAAd;;CAAc;;AAAd;EAAA,kBAAc;AAAA;;AAAd;;CAAc;;AAAd;;;;;;;;;;;;;EAAA,SAAc;AAAA;;AAAd;EAAA,SAAc;EAAd,UAAc;AAAA;;AAAd;EAAA,UAAc;AAAA;;AAAd;;;EAAA,gBAAc;EAAd,SAAc;EAAd,UAAc;AAAA;;AAAd;;CAAc;AAAd;EAAA,UAAc;AAAA;;AAAd;;CAAc;;AAAd;EAAA,gBAAc;AAAA;;AAAd;;;CAAc;;AAAd;;EAAA,UAAc,EAAd,MAAc;EAAd,cAAc,EAAd,MAAc;AAAA;;AAAd;;CAAc;;AAAd;;EAAA,eAAc;AAAA;;AAAd;;CAAc;AAAd;EAAA,eAAc;AAAA;;AAAd;;;;CAAc;;AAAd;;;;;;;;EAAA,cAAc,EAAd,MAAc;EAAd,sBAAc,EAAd,MAAc;AAAA;;AAAd;;CAAc;;AAAd;;EAAA,eAAc;EAAd,YAAc;AAAA;;AAAd,wEAAc;AAAd;EAAA,aAAc;AAAA;;AAAd;;EAAA,uDAAc;EAAd;AAAc;;AAAd;;EAAA;IAAA,mBAAc;IAAd,qBAAc;IAAd,sBAAc;IAAd,qBAAc;IAAd,sBAAc;IAAd,qBAAc;IAAd,sBAAc;IAAd,qBAAc;IAAd,sBAAc;IAAd,sBAAc;IAAd,sBAAc;IAAd,sBAAc;IAAd,sBAAc;IAAd,sBAAc;IAAd,uBAAc;IAAd,sBAAc;IAAd,uBAAc;IAAd,sBAAc;IAAd,uBAAc;IAAd,sBAAc;IAAd;EAAc;;EAAd;;IAAA;MAAA,kBAAc;MAAd,qBAAc;MAAd,sBAAc;MAAd,qBAAc;MAAd,sBAAc;MAAd,qBAAc;MAAd,sBAAc;MAAd,qBAAc;MAAd,sBAAc;MAAd,sBAAc;MAAd,sBAAc;MAAd,sBAAc;MAAd,sBAAc;MAAd,sBAAc;MAAd,uBAAc;MAAd,sBAAc;MAAd,uBAAc;MAAd,sBAAc;MAAd,uBAAc;MAAd,sBAAc;MAAd;IAAc;EAAA;AAAA;;AAAd;EAAA;AAAc;;AAAd;EAAA;AAAc;;AAAd;EAAA;AAAc;;AAAd;EAAA,kBAAc;EAAd,wBAAc;EAAd,qBAAc;EAAd,wBAAc;EAAd,wBAAc;EAAd,2BAAc;EAAd,yBAAc;EAAd,2BAAc;EAAd,aAAc;EAAd,aAAc;EAAd,aAAc;EAAd,aAAc;EAAd,mBAAc;EAAd,qBAAc;EAAd,uBAAc;EAAd,sBAAc;EAAd,sBAAc;EAAd,uBAAc;EAAd,iBAAc;EAAd,iBAAc;EAAd,oBAAc;EAAd,wBAAc;EAAd,sBAAc;EAAd,wBAAc;EAAd,iCAAc;EAAd,gCAAc;EAAd,kCAAc;EAAd,kCAAc;EAAd,iCAAc;EAAd;AAAc;;AAAd;EAAA,kBAAc;EAAd,wBAAc;EAAd,qBAAc;EAAd,wBAAc;EAAd,wBAAc;EAAd,2BAAc;EAAd,yBAAc;EAAd,2BAAc;EAAd,aAAc;EAAd,aAAc;EAAd,aAAc;EAAd,aAAc;EAAd,mBAAc;EAAd,qBAAc;EAAd,uBAAc;EAAd,sBAAc;EAAd,sBAAc;EAAd,uBAAc;EAAd,iBAAc;EAAd,iBAAc;EAAd,oBAAc;EAAd,wBAAc;EAAd,sBAAc;EAAd,wBAAc;EAAd,iCAAc;EAAd,gCAAc;EAAd,kCAAc;EAAd,kCAAc;EAAd,iCAAc;EAAd;AAAc;;AAAd;EAAA,iCAAc;EAAd,mBAAc;EAAd,uBAAc;EAAd,sBAAc;EAAd,sBAAc;EAAd,uBAAc;EAAd,iBAAc;EAAd,kCAAc;EAAd,gCAAc;EAAd,kCAAc;EAAd,gCAAc;EAAd,iCAAc;EAAd,+BAAc;EAAd,kCAAc;EAAd,cAAc;EAAd,kBAAc;EAAd,kBAAc;EAAd,kBAAc;EAAd,kCAAc;EAAd,mCAAc;EAAd,kCAAc;EAAd,mCAAc;EAAd,iCAAc;EAAd,iCAAc;EAAd,iCAAc;EAAd,iCAAc;EAAd,qBAAc;EAAd,iBAAc;EAAd;AAAc;;AAAd;EAAA,wBAAc;EAAd,wBAAc;EAAd,mBAAc;EAAd,mBAAc;EAAd,cAAc;EAAd,cAAc;EAAd,cAAc;EAAd,eAAc;EAAd,eAAc;EAAd,aAAc;EAAd,aAAc;EAAd,kBAAc;EAAd,sCAAc;EAAd,8BAAc;EAAd,6BAAc;EAAd,4BAAc;EAAd,eAAc;EAAd,oBAAc;EAAd,sBAAc;EAAd,uBAAc;EAAd,wBAAc;EAAd,kBAAc;EAAd,2BAAc;EAAd,4BAAc;EAAd,sCAAc;EAAd,kCAAc;EAAd,2BAAc;EAAd,sBAAc;EAAd,8BAAc;EAAd,YAAc;EAAd,kBAAc;EAAd,gBAAc;EAAd,iBAAc;EAAd,kBAAc;EAAd,cAAc;EAAd,gBAAc;EAAd,aAAc;EAAd,mBAAc;EAAd,qBAAc;EAAd,2BAAc;EAAd,yBAAc;EAAd,0BAAc;EAAd,2BAAc;EAAd,uBAAc;EAAd,wBAAc;EAAd,yBAAc;EAAd,sBAAc;EAAd,oBAAc;EAAd,sBAAc;EAAd,qBAAc;EAAd;AAAc;;AAAd;EAAA,wBAAc;EAAd,wBAAc;EAAd,mBAAc;EAAd,mBAAc;EAAd,cAAc;EAAd,cAAc;EAAd,cAAc;EAAd,eAAc;EAAd,eAAc;EAAd,aAAc;EAAd,aAAc;EAAd,kBAAc;EAAd,sCAAc;EAAd,8BAAc;EAAd,6BAAc;EAAd,4BAAc;EAAd,eAAc;EAAd,oBAAc;EAAd,sBAAc;EAAd,uBAAc;EAAd,wBAAc;EAAd,kBAAc;EAAd,2BAAc;EAAd,4BAAc;EAAd,sCAAc;EAAd,kCAAc;EAAd,2BAAc;EAAd,sBAAc;EAAd,8BAAc;EAAd,YAAc;EAAd,kBAAc;EAAd,gBAAc;EAAd,iBAAc;EAAd,kBAAc;EAAd,cAAc;EAAd,gBAAc;EAAd,aAAc;EAAd,mBAAc;EAAd,qBAAc;EAAd,2BAAc;EAAd,yBAAc;EAAd,0BAAc;EAAd,2BAAc;EAAd,uBAAc;EAAd,wBAAc;EAAd,yBAAc;EAAd,sBAAc;EAAd,oBAAc;EAAd,sBAAc;EAAd,qBAAc;EAAd;AAAc;AACd;EAAA;AAAoB;AAApB;;EAAA;IAAA;EAAoB;AAAA;AAApB;;EAAA;IAAA;EAAoB;AAAA;AAApB;;EAAA;IAAA;EAAoB;AAAA;AAApB;;EAAA;IAAA;EAAoB;AAAA;AAApB;;EAAA;IAAA;EAAoB;AAAA;AAApB;EAAA,aAAoB;EAApB,WAAoB;EAApB,mBAAoB;EAApB,yBAAoB;EAApB,mBAAoB;EAApB,qBAAoB;EAApB,SAAoB;EAApB,kBAAoB;EAApB,uCAAoB;EAApB,iBAAoB;EAApB,sBAAoB;EAApB,0EAAoB;EAApB,aAAoB;EAApB,oBAAoB;EAApB,iEAAoB;EAApB,iDAAoB;EAApB,qDAAoB;EAApB;AAAoB;AAApB;;EAAA;IAAA,sBAAoB;IAApB,4CAAoB;IAApB,oBAAoB;IAApB;EAAoB;AAAA;AAApB;EAAA,oBAAoB;EAApB,mBAAoB;EAApB,uBAAoB;EAApB,gKAAoB;EAApB,wJAAoB;EAApB,iLAAoB;EAApB,wDAAoB;EAApB,sDAAoB;EAApB,0BAAoB;EAApB,eAAoB;EAApB,mBAAoB;EAApB,oBAAoB;EAApB,0BAAoB;EAApB,uBAAoB;EAApB,kBAAoB;EAApB,sBAAoB;EAApB,uBAAoB;EAApB,2CAAoB;EAApB,iBAAoB;EAApB,sBAAoB;EAApB,0EAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;;EAAA;;;IAAA,kBAAoB;IAApB,wEAAoB;IAApB,oBAAoB;IAApB;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA,oBAAoB;IAApB;EAAoB;;EAApB;;IAAA,kBAAoB;IAApB;EAAoB;AAAA;AAApB;EAAA,oBAAoB;EAApB,YAAoB;EAApB,gBAAoB;EAApB,cAAoB;EAApB,eAAoB;EAApB,yBAAoB;UAApB,iBAAoB;EAApB,eAAoB;EAApB,mBAAoB;EAApB,uBAAoB;EAApB,yCAAoB;EAApB,yBAAoB;EAApB,2EAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB,gBAAoB;EAApB,WAAoB;EAApB,gBAAoB;EAApB,0BAAoB;EAApB,0BAAoB;EAApB,sDAAoB;EAApB,oCAAoB;EAApB,0FAAoB;EAApB,oBAAoB;EAApB,iEAAoB;EAApB,0CAAoB;EAApB,uDAAoB;EAApB,uGAAoB;EAApB,oDAAoB;EAApB,2EAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;;;EAAA;AAAoB;AAApB;EAAA,YAAoB;EAApB,WAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,WAAoB;EAApB,qBAAoB;EAApB;AAAoB;AAApB;;EAAA,WAAoB;EAApB,wBAAoB;UAApB;AAAoB;AAApB;;EAAA,8BAAoB;EAApB;AAAoB;AAApB;EAAA,kBAAoB;EAApB,aAAoB;EAApB,sBAAoB;EAApB;AAAoB;AAApB;EAAA,8BAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,cAAoB;EAApB,sBAAoB;EAApB,kCAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,aAAoB;EAApB,eAAoB;EAApB,uBAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,kBAAoB;EAApB,WAAoB;EAApB,WAAoB;EAApB,uCAAoB;EAApB,kBAAoB;EAApB,wEAAoB;EAApB;AAAoB;AAApB;;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB;AAAoB;AAApB;EAAA,kBAAoB;EAApB,WAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA,cAAoB;EAApB,8CAAoB;EAApB,8CAAoB;EAApB,cAAoB;EAApB,aAAoB;EAApB,eAAoB;EAApB,wBAAoB;UAApB,gBAAoB;EAApB,yCAAoB;EAApB,iBAAoB;EAApB,0EAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,mBAAoB;EAApB,mBAAoB;EAApB,mBAAoB;EAApB,gBAAoB;EAApB,mBAAoB;EAApB,YAAoB;EAApB;AAAoB;AAApB;;EAAA,gBAAoB;EAApB,WAAoB;EAApB,YAAoB;EAApB,gBAAoB;EAApB,0BAAoB;EAApB;AAAoB;AAApB;EAAA,kBAAoB;EAApB;AAAoB;AAApB;EAAA,8BAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,kBAAoB;EAApB,UAAoB;EAApB,qBAAoB;EAApB,iBAAoB;EAApB,iBAAoB;EAApB,+LAAoB;EAApB,gKAAoB;EAApB,wJAAoB;EAApB,iLAAoB;EAApB,wDAAoB;EAApB,sDAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,YAAoB;EAApB,sBAAoB;EAApB,QAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,wBAAoB;EAApB,QAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,SAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,SAAoB;EAApB;AAAoB;AAApB;EAAA,WAAoB;EAApB;AAAoB;AAApB;EAAA,WAAoB;EAApB;AAAoB;AAApB;;;EAAA,mBAAoB;EAApB;AAAoB;AAApB;;EAAA;IAAA,mBAAoB;IAApB;EAAoB;;EAApB;IAAA,sBAAoB;IAApB,0EAAoB;IAApB,kBAAoB;IAApB;EAAoB;;EAApB;;IAAA;MAAA;;;;WAAoB;MAApB;;;;;IAAoB;EAAA;;EAApB;;IAAA;MAAA,sDAAoB;MAApB;IAAoB;EAAA;;EAApB;IAAA,oBAAoB;IAApB;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;;IAAA;MAAA;IAAoB;EAAA;;EAApB;IAAA,sBAAoB;IAApB,0EAAoB;IAApB,kBAAoB;IAApB,0EAAoB;IAApB,oBAAoB;IAApB;EAAoB;;EAApB;IAAA,oBAAoB;IAApB;EAAoB;;EAApB;;IAAA;MAAA,qFAAoB;MAApB;IAAoB;EAAA;;EAApB;IAAA,oBAAoB;IAApB;EAAoB;;EAApB;;IAAA;MAAA,qFAAoB;MAApB;IAAoB;EAAA;;EAApB;IAAA,oBAAoB;IAApB;EAAoB;;EAApB;;IAAA;MAAA,qFAAoB;MAApB;IAAoB;EAAA;;EAApB;IAAA,oBAAoB;IAApB;EAAoB;;EAApB;;IAAA;MAAA,uFAAoB;MAApB;IAAoB;EAAA;;EAApB;IAAA,oBAAoB;IAApB;EAAoB;;EAApB;;IAAA;MAAA,uFAAoB;MAApB;IAAoB;EAAA;;EAApB;IAAA,oBAAoB;IAApB;EAAoB;;EAApB;;IAAA;MAAA,uFAAoB;MAApB;IAAoB;EAAA;;EAApB;IAAA,oBAAoB;IAApB;EAAoB;;EAApB;;IAAA;MAAA,uFAAoB;MAApB;IAAoB;EAAA;;EAApB;;;IAAA,sBAAoB;IAApB,wEAAoB;IAApB,oBAAoB;IAApB,iEAAoB;IAApB;EAAoB;;EAApB;;IAAA;MAAA,qFAAoB;MAApB;IAAoB;EAAA;;EAApB;IAAA,eAAoB;IAApB,eAAoB;IAApB;EAAoB;;EAApB;IAAA,eAAoB;IAApB,8BAAoB;IAApB;EAAoB;;EAApB;;IAAA;MAAA;IAAoB;EAAA;;EAApB;;IAAA,mBAAoB;IAApB,iEAAoB;IAApB;EAAoB;AAAA;AAApB;EAAA;AAAoB;AAApB;EAAA,YAAoB;EAApB,cAAoB;EAApB,wBAAoB;EAApB,eAAoB;EAApB,cAAoB;EAApB,mBAAoB;EAApB,gBAAoB;EAApB,yCAAoB;EAApB,iBAAoB;EAApB,0EAAoB;EAApB,sBAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA,uBAAoB;EAApB,oBAAoB;EAApB,YAAoB;EAApB,cAAoB;EAApB,eAAoB;EAApB,yBAAoB;UAApB,iBAAoB;EAApB,eAAoB;EAApB,mBAAoB;EAApB,uBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB,oBAAoB;EAApB,gBAAoB;EAApB,wKAAoB;EAApB,gKAAoB;EAApB,wJAAoB;EAApB,iLAAoB;EAApB,wDAAoB;EAApB,sDAAoB;EAApB,0BAAoB;EAApB,mBAAoB;EAApB,sBAAoB;EAApB,wEAAoB;EAApB,kBAAoB;EAApB,wEAAoB;EAApB,gBAAoB;EAApB,yBAAoB;EAApB,oBAAoB;EAApB,iEAAoB;EAApB,0BAAoB;EAApB,oCAAoB;EAApB;AAAoB;AAApB;EAAA,uBAAoB;EAApB,oBAAoB;EAApB,YAAoB;EAApB,cAAoB;EAApB,eAAoB;EAApB,yBAAoB;UAApB,iBAAoB;EAApB,eAAoB;EAApB,mBAAoB;EAApB,uBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB,oBAAoB;EAApB,gBAAoB;EAApB,gKAAoB;EAApB,wJAAoB;EAApB,iLAAoB;EAApB,wDAAoB;EAApB,sDAAoB;EAApB,0BAAoB;EAApB,mBAAoB;EAApB,sBAAoB;EAApB,wEAAoB;EAApB,kBAAoB;EAApB,wEAAoB;EAApB,gBAAoB;EAApB,yBAAoB;EAApB,oBAAoB;EAApB,iEAAoB;EAApB,0BAAoB;EAApB,oCAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,WAAoB;EAApB,mBAAoB;EAApB,kBAAoB;EAApB,gBAAoB;EAApB,eAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA,mBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;;EAAA;IAAA;EAAoB;;EAApB;IAAA;EAAoB;AAAA;AAApB;EAAA,cAAoB;EAApB,wBAAoB;UAApB,gBAAoB;EAApB,YAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB,eAAoB;EAApB,cAAoB;EAApB,mBAAoB;EAApB,yCAAoB;EAApB,iBAAoB;EAApB,yBAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;;EAAA,iBAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB,uBAAoB;EAApB;AAAoB;AAApB;EAAA,eAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA,0BAAoB;EAApB,wBAAoB;EAApB,0BAAoB;EAApB;AAAoB;AAApB;;EAAA,0BAAoB;EAApB,wBAAoB;EAApB,0BAAoB;EAApB;AAAoB;AAApB;;EAAA,0BAAoB;EAApB;AAAoB;AAApB;;EAAA,gCAAoB;EAApB;AAAoB;AAApB;;EAAA,gCAAoB;EAApB;AAAoB;AAApB;;EAAA,0BAAoB;EAApB;AAAoB;AAApB;;EAAA,gCAAoB;EAApB;AAAoB;AAApB;;EAAA;IAAA;EAAoB;AAAA;AAApB;;EAAA;IAAA;EAAoB;AAAA;AAApB;EAAA,eAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,sBAAoB;EAApB,eAAoB;EAApB,mBAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA,kBAAoB;EAApB,mBAAoB;EAApB,yBAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,sBAAoB;EAApB,yBAAoB;EAApB,mBAAoB;EAApB,WAAoB;EAApB,6EAAoB;EAApB,6DAAoB;EAApB,yBAAoB;UAApB;AAAoB;AAApB;EAAA,mBAAoB;EAApB,yBAAoB;UAApB,iBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,kBAAoB;EAApB,aAAoB;EAApB,cAAoB;EAApB,sBAAoB;EAApB,eAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,oBAAoB;EAApB,eAAoB;EAApB,UAAoB;EAApB,WAAoB;EAApB,aAAoB;EAApB,YAAoB;EAApB,gBAAoB;EAApB,WAAoB;EAApB,eAAoB;EAApB,qBAAoB;EAApB,YAAoB;EAApB,UAAoB;EAApB,4BAAoB;EAApB,YAAoB;EAApB,6BAAoB;EAApB,cAAoB;EAApB,0BAAoB;EAApB,sDAAoB;EAApB,mDAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,6BAAoB;EAApB,oBAAoB;EAApB,iBAAoB;EAApB,iBAAoB;EAApB,gBAAoB;EAApB,gBAAoB;EAApB,gBAAoB;EAApB,+LAAoB;EAApB,oDAAoB;EAApB,mDAAoB;EAApB,gDAAoB;EAApB,iDAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB,eAAoB;EAApB,gKAAoB;EAApB,wJAAoB;EAApB,iLAAoB;EAApB,wDAAoB;EAApB,sDAAoB;EAApB,0BAAoB;EAApB,mDAAoB;EAApB,gBAAoB;EAApB;AAAoB;AAApB;;;;EAAA,oBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA,gBAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,mBAAoB;EAApB,sCAAoB;EAApB,gBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,cAAoB;EAApB,kBAAoB;EAApB,cAAoB;EAApB,aAAoB;EAApB,eAAoB;EAApB,wBAAoB;UAApB,gBAAoB;EAApB,qBAAoB;EAApB,iBAAoB;EAApB,0EAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB,eAAoB;EAApB,yBAAoB;UAApB,iBAAoB;EAApB,wBAAoB;UAApB,gBAAoB;EAApB,YAAoB;EAApB,gBAAoB;EAApB,0BAAoB;EAApB,0BAAoB;EAApB,mBAAoB;EAApB,oBAAoB;EAApB,cAAoB;EAApB,yCAAoB;EAApB,iBAAoB;EAApB,yBAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB;8DAAoB;EAApB;uCAAoB;EAApB;WAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,aAAoB;EAApB;AAAoB;AAApB;;;EAAA;AAAoB;AAApB;EAAA,kBAAoB;EAApB,iBAAoB;EAApB,oBAAoB;EAApB,YAAoB;EAApB,eAAoB;EAApB,yBAAoB;UAApB,iBAAoB;EAApB,wBAAoB;UAApB,gBAAoB;EAApB,eAAoB;EAApB,mBAAoB;EAApB,uBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB,oBAAoB;EAApB,cAAoB;EAApB,mBAAoB;EAApB,sBAAoB;EAApB,kDAAoB;EAApB,+CAAoB;EAApB,yDAAoB;EAApB,uBAAoB;EAApB,8CAAoB;EAApB;AAAoB;AAApB;EAAA,WAAoB;EAApB,+BAAoB;EAApB;AAAoB;AAApB;EAAA,8BAAoB;EAApB;AAAoB;AAApB;EAAA,eAAoB;EAApB;AAAoB;AAApB;;EAAA;AAAoB;AAApB;;EAAA;AAAoB;AAApB;EAAA,kBAAoB;EAApB,WAAoB;EAApB,uCAAoB;EAApB,gBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,wBAAoB;EAApB,gBAAoB;EAApB,QAAoB;EAApB,UAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA,wBAAoB;EAApB,gBAAoB;EAApB,WAAoB;EAApB,UAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA,wBAAoB;EAApB,gBAAoB;EAApB,SAAoB;EAApB,UAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA,gBAAoB;EAApB,cAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB,mBAAoB;EAApB,sBAAoB;EAApB,mBAAoB;EAApB,oBAAoB;EAApB,cAAoB;EAApB,yCAAoB;EAApB,iBAAoB;EAApB,yBAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA,cAAoB;EAApB,8CAAoB;EAApB,sBAAoB;EAApB,wDAAoB;EAApB,yBAAoB;EAApB,cAAoB;EAApB,WAAoB;EAApB,eAAoB;EAApB,wBAAoB;UAApB,gBAAoB;EAApB,2CAAoB;EAApB,iBAAoB;EAApB,0BAAoB;EAApB,8BAAoB;EAApB,8CAAoB;EAApB;oDAAoB;EAApB;;;AAAoB;AAApB;EAAA,qDAAoB;EAApB,oBAAoB;EAApB,mEAAoB;EAApB,iDAAoB;EAApB;AAAoB;AAApB;EAAA,qDAAoB;EAApB,oBAAoB;EAApB,mEAAoB;EAApB,iDAAoB;EAApB;AAAoB;AAApB;EAAA,qDAAoB;EAApB,oBAAoB;EAApB,mEAAoB;EAApB,iDAAoB;EAApB;AAAoB;AAApB;EAAA,qDAAoB;EAApB,oBAAoB;EAApB,mEAAoB;EAApB,iDAAoB;EAApB;AAAoB;AAApB;EAAA,sBAAoB;EAApB,wEAAoB;EAApB,kBAAoB;EAApB,wEAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;;EAAA;IAAA;EAAoB;AAAA;AAApB;;EAAA,iCAAoB;EAApB;AAAoB;AAApB;;EAAA;IAAA,sDAAoB;IAApB;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;AAAA;AAApB;;EAAA;IAAA;;;;SAAoB;IAApB;;;;;EAAoB;;EAApB;IAAA,qFAAoB;IAApB;EAAoB;;EAApB;IAAA,qFAAoB;IAApB;EAAoB;;EAApB;IAAA,qFAAoB;IAApB;EAAoB;;EAApB;IAAA,uFAAoB;IAApB;EAAoB;;EAApB;IAAA,uFAAoB;IAApB;EAAoB;;EAApB;IAAA,uFAAoB;IAApB;EAAoB;;EAApB;IAAA,uFAAoB;IAApB;EAAoB;AAAA;AAApB;EAAA,oBAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB,iEAAoB;EAApB;AAAoB;AAApB;;EAAA;IAAA;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;AAAA;AAApB;EAAA,oBAAoB;EAApB,iEAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB,iEAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB,iEAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB,mEAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB,mEAAoB;EAApB;AAAoB;AAApB;EAAA,sBAAoB;EAApB,8BAAoB;EAApB,uGAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,iBAAoB;EAApB,yBAAoB;EAApB,6BAAoB;EAApB,mBAAoB;EAApB,sBAAoB;EAApB,8BAAoB;EAApB,uGAAoB;EAApB;AAAoB;AAApB;EAAA,yBAAoB;EAApB;AAAoB;AAApB;EAAA,yBAAoB;EAApB,6BAAoB;EAApB;AAAoB;AAApB;EAAA,0BAAoB;EAApB,6BAAoB;EAApB,oBAAoB;EAApB,iEAAoB;EAApB,sBAAoB;EAApB,8BAAoB;EAApB;AAAoB;AAApB;EAAA,sBAAoB;EAApB,0EAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;;;EAAA,sBAAoB;EAApB,wEAAoB;EAApB,oBAAoB;EAApB,iEAAoB;EAApB;AAAoB;AAApB;;EAAA,sBAAoB;EAApB,wEAAoB;EAApB,kBAAoB;EAApB,wEAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;;EAAA;IAAA;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;AAAA;AAApB;EAAA,gBAAoB;EAApB,kCAAoB;EAApB,gCAAoB;EAApB,8BAAoB;EAApB;AAAoB;AAApB;EAAA,gBAAoB;EAApB,gCAAoB;EAApB,8BAAoB;EAApB,gCAAoB;EAApB;AAAoB;AAApB;EAAA,+BAAoB;EAApB;AAAoB;AAApB;EAAA,iBAAoB;EAApB,sBAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,mBAAoB;EAApB,WAAoB;EAApB,kBAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA,gBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,oBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,iBAAoB;EAApB,mBAAoB;EAApB,yBAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB;AAAoB;AAApB;;EAAA,4BAAoB;EAApB,0DAAoB;EAApB,8BAAoB;EAApB;;;;;;;;;;;AAAoB;AAApB;EAAA,kBAAoB;EAApB,0EAAoB;EAApB,4BAAoB;EAApB,0DAAoB;EAApB;;;AAAoB;AAApB;;EAAA;IAAA;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;AAAA;AAApB;EAAA;AAAoB;AAApB;;;EAAA,eAAoB;EAApB,eAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,oBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;;EAAA,mBAAoB;EAApB,sBAAoB;EAApB,0EAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB;AAAoB;AAApB;;EAAA,wEAAoB;EAApB;AAAoB;AAApB;EAAA,sBAAoB;EAApB,wEAAoB;EAApB,oBAAoB;EAApB,iEAAoB;EAApB;AAAoB;AAApB;EAAA,sBAAoB;EAApB,wEAAoB;EAApB,oBAAoB;EAApB,iEAAoB;EAApB;AAAoB;AAApB;EAAA,kBAAoB;EAApB,wEAAoB;EAApB;AAAoB;AAApB;EAAA,8BAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA;AAAoB;AAApB;;EAAA,gBAAoB;EAApB,qDAAoB;EAApB,oBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;;;;EAAA,mBAAoB;EAApB,sBAAoB;EAApB,0EAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB;AAAoB;AAApB;;;;EAAA,wEAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,eAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;;EAAA;;IAAA;MAAA;IAAoB;;IAApB;MAAA;IAAoB;;IAApB;MAAA;IAAoB;EAAA;AAAA;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB;AAAoB;AAApB;EAAA,8BAAoB;EAApB;AAAoB;AAApB;EAAA,+BAAoB;EAApB;AAAoB;AAApB;EAAA,oBAAoB;EAApB,qBAAoB;EAApB,mBAAoB;EAApB,aAAoB;EAApB,8BAAoB;EAApB,uBAAoB;UAApB,eAAoB;EAApB,8BAAoB;UAApB,sBAAoB;EAApB,6BAAoB;UAApB,qBAAoB;EAApB,2DAAoB;UAApB;AAAoB;AAApB;EAAA,2DAAoB;UAApB;AAAoB;AAApB;EAAA,kBAAoB;EAApB,0EAAoB;EAApB,YAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,kBAAoB;EAApB,eAAoB;EAApB,uBAAoB;EAApB,YAAoB;EAApB,UAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB,YAAoB;EAApB;AAAoB;AAApB;;EAAA,yCAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB,mBAAoB;EAApB,sBAAoB;EAApB,iBAAoB;EAApB,gKAAoB;EAApB,wJAAoB;EAApB,iLAAoB;EAApB,wDAAoB;EAApB,sDAAoB;EAApB,0BAAoB;EAApB;AAAoB;AAApB;EAAA,eAAoB;EAApB,yDAAoB;EAApB,oBAAoB;EAApB,iEAAoB;EAApB,8BAAoB;EAApB;AAAoB;AAApB;;;EAAA,kBAAoB;EAApB,wEAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;;EAAA,iBAAoB;EAApB,cAAoB;EAApB,mBAAoB;EAApB,cAAoB;EAApB,aAAoB;EAApB,wBAAoB;EAApB,0CAAoB;EAApB,yBAAoB;EAApB,wDAAoB;EAApB,WAAoB;EAApB,yBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;;EAAA,yBAAoB;EAApB;AAAoB;AAApB;EAAA,kBAAoB;EAApB,iBAAoB;EAApB,kBAAoB;EAApB,cAAoB;EAApB,eAAoB;EAApB,YAAoB;EAApB,gBAAoB;EAApB,uBAAoB;EAApB,mBAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA,WAAoB;EAApB,kBAAoB;EAApB,YAAoB;EAApB,QAAoB;EAApB,mBAAoB;EAApB,eAAoB;EAApB,sBAAoB;EAApB,+LAAoB;EAApB,qBAAoB;EAApB,iBAAoB;EAApB,0BAAoB;EAApB;AAAoB;AAApB;EAAA,WAAoB;EAApB,kBAAoB;EAApB,aAAoB;EAApB,QAAoB;EAApB,cAAoB;EAApB,qBAAoB;EAApB,mBAAoB;EAApB,+LAAoB;EAApB,qBAAoB;EAApB,iBAAoB;EAApB,0BAAoB;EAApB;AAAoB;AAApB;;EAAA,uBAAoB;EAApB;AAAoB;AAApB;;;;EAAA,qBAAoB;EAApB,eAAoB;EAApB,eAAoB;EAApB;AAAoB;AAApB;EAAA,uBAAoB;EAApB,sDAAoB;EAApB;AAAoB;AAApB;;EAAA;IAAA;EAAoB;AAAA;AAApB;;EAAA;IAAA;EAAoB;AAAA;AAApB;EAAA;AAAoB;AAApB;EAAA,oBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;;EAAA,kBAAoB;EAApB,0EAAoB;EAApB,sBAAoB;EAApB,0DAAoB;EAApB;;AAAoB;AAApB;EAAA,mBAAoB;EAApB;AAAoB;AAApB;;EAAA;IAAA;;EAAoB;;EAApB;IAAA;;EAAoB;;EAApB;IAAA;;EAAoB;AAAA;AAApB;;EAAA;IAAA;EAAoB;;EAApB;IAAA;EAAoB;;EAApB;IAAA;EAAoB;AAAA;AAApB;EAAA;AAAoB;AAApB;EAAA,gBAAoB;EAApB,qDAAoB;EAApB,oBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;;;EAAA,mBAAoB;EAApB,sBAAoB;EAApB,0EAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB;AAAoB;AAApB;;;EAAA,wEAAoB;EAApB;AAAoB;AAApB;;;EAAA,sBAAoB;EAApB;AAAoB;AAApB;EAAA;;AAAoB;AAApB;;EAAA;IAAA;EAAoB;;EAApB;IAAA;EAAoB;AAAA;AAApB;EAAA,wBAAoB;EAApB;AAAoB;AAApB;EAAA,0EAAoB;EAApB,sBAAoB;EAApB;AAAoB;AAApB;EAAA,8BAAoB;EAApB;AAAoB;AAApB;EAAA,+BAAoB;EAApB;AAAoB;AAApB;;EAAA,mBAAoB;EAApB,iEAAoB;EAApB;AAAoB;AAApB;EAAA,0EAAoB;EAApB,wBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,gDAAoB;EAApB,0CAAoB;EAApB,oDAAoB;EAApB,kDAAoB;EAApB,4CAAoB;EAApB,8CAAoB;EAApB,4CAAoB;EAApB;AAAoB;AAApB;EAAA,+BAAoB;EAApB,oFAAoB;EAApB,kDAAoB;EAApB,gDAAoB;EAApB,yCAAoB;EAApB,6EAAoB;EAApB,2EAAoB;EAApB,sCAAoB;EAApB;AAAoB;AAApB;EAAA,UAAoB;EAApB,WAAoB;EAApB,cAAoB;EAApB,kBAAoB;EAApB,iDAAoB;EAApB,iCAAoB;EAApB,SAAoB;EAApB,0CAAoB;EAApB;iBAAoB;EAApB,4BAAoB;EAApB,8CAAoB;EAApB;;;;;;OAAoB;EAApB;;;;;;OAAoB;EAApB;AAAoB;AAApB;EAAA,mCAAoB;EAApB;AAAoB;AAApB;EAAA,qCAAoB;EAApB;AAAoB;AAApB;EAAA,qCAAoB;EAApB;AAAoB;AAApB;EAAA,mCAAoB;EAApB;AAAoB;AAApB;;;;EAAA,mCAAoB;EAApB;AAAoB;AAApB;EAAA,yCAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,kBAAoB;EAApB,wEAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,kBAAoB;EAApB,mBAAoB;EAApB,oBAAoB;EAApB,uBAAoB;EAApB;AAAoB;AAApB;;;EAAA,kBAAoB;EAApB;AAAoB;AAApB;EAAA,wBAAoB;EAApB,sBAAoB;EAApB;AAAoB;AAApB;EAAA,mBAAoB;EAApB,kBAAoB;EAApB,iBAAoB;EAApB,gBAAoB;EAApB;AAAoB;AAApB;EAAA,qBAAoB;EAApB,sBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,gBAAoB;EAApB,qDAAoB;EAApB,oBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;;;EAAA,mBAAoB;EAApB,sBAAoB;EAApB,0EAAoB;EAApB,kBAAoB;EAApB,0EAAoB;EAApB;AAAoB;AAApB;;;EAAA,wEAAoB;EAApB;AAAoB;AAApB;;EAAA;IAAA,qBAAoB;IAApB;EAAoB;;EAApB;IAAA,mBAAoB;IAApB;EAAoB;AAAA;AAApB;EAAA;AAAoB;AAApB;EAAA,oBAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;;EAAA,sBAAoB;EAApB,6CAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,oBAAoB;EAApB,iEAAoB;EAApB;;;AAAoB;AAApB;EAAA;;;AAAoB;AAApB;EAAA;AAAoB;AAApB;;EAAA,wEAAoB;EAApB,wBAAoB;EAApB,kBAAoB;EAApB,wEAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA,mBAAoB;EAApB,sBAAoB;EAApB,0EAAoB;EAApB,6BAAoB;EAApB,YAAoB;EAApB;;AAAoB;AAApB;EAAA,oBAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA,cAAoB;EAApB,kBAAoB;EAApB,oBAAoB;EAApB,qBAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,gBAAoB;EAApB,qBAAoB;EAApB,sBAAoB;EAApB;AAAoB;AAApB;EAAA,cAAoB;EAApB,aAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,WAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,WAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,WAAoB;EAApB;AAAoB;AAApB;EAAA,cAAoB;EAApB,aAAoB;EAApB,qBAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,WAAoB;EAApB,qBAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,WAAoB;EAApB,qBAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,WAAoB;EAApB,qBAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB;AAAoB;AAApB;EAAA,eAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,2BAAoB;EAApB,mBAAoB;EAApB,oBAAoB;EAApB;AAAoB;AAApB;EAAA,qBAAoB;EAApB;AAAoB;AAApB;EAAA,qBAAoB;EAApB;AAAoB;AAApB;EAAA,cAAoB;EAApB,oBAAoB;EAApB,qBAAoB;EAApB,kBAAoB;EAApB,iBAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,qBAAoB;EAApB,sBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;;EAAA,0BAAoB;EAApB,wBAAoB;EAApB,kCAAoB;EAApB;AAAoB;AAApB;;EAAA,4BAAoB;EAApB,0BAAoB;EAApB,gCAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;;EAAA,wBAAoB;EAApB,0BAAoB;EAApB,gCAAoB;EAApB;AAAoB;AAApB;;EAAA,0BAAoB;EAApB,4BAAoB;EAApB,8BAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,gBAAoB;EAApB,qBAAoB;EAApB,mBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,kBAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,mBAAoB;EAApB,oBAAoB;EAApB,cAAoB;EAApB;AAAoB;AAApB;EAAA,YAAoB;EAApB,mBAAoB;EAApB,oBAAoB;EAApB,cAAoB;EAApB;AAAoB;AAApB;EAAA,cAAoB;EAApB,mBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,eAAoB;EAApB,kBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,aAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,kCAAoB;EAApB,eAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,gBAAoB;EAApB,iBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,eAAoB;EAApB,kBAAoB;EAApB;AAAoB;AAApB;EAAA;AAAoB;AAApB;EAAA,yCAAoB;EAApB,qBAAoB;EAApB,sBAAoB;EAApB,oBAAoB;EAApB,uBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,qBAAoB;EAApB,sBAAoB;EAApB,mBAAoB;EAApB;AAAoB;AAApB;EAAA,WAAoB;EAApB,eAAoB;EAApB,yBAAoB;EAApB,eAAoB;EAApB,eAAoB;EAApB,+LAAoB;EAApB,oDAAoB;EAApB,mDAAoB;EAApB,2BAAoB;EAApB;AAAoB;AAApB;EAAA,iBAAoB;EAApB,gBAAoB;EAApB,qBAAoB;EAApB,gBAAoB;EAApB,gBAAoB;EAApB,+LAAoB;EAApB,gDAAoB;EAApB,iDAAoB;EAApB,oDAAoB;EAApB;AAAoB;AAApB;EAAA,WAAoB;EAApB,eAAoB;EAApB,wBAAoB;EAApB,eAAoB;EAApB,eAAoB;EAApB,+LAAoB;EAApB,gDAAoB;EAApB,iDAAoB;EAApB,+BAAoB;EAApB;AAAoB;AACpB;EAAA,kBAAmB;EAAnB,UAAmB;EAAnB,WAAmB;EAAnB,UAAmB;EAAnB,YAAmB;EAAnB,gBAAmB;EAAnB,sBAAmB;EAAnB,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,wBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,+BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,0BAAmB;EAAnB,uBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,0BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,yBAAmB;UAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,4BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,0EAAmB;EAAnB,8FAAmB;EAAnB;AAAmB;AAAnB;EAAA,+EAAmB;EAAnB,mGAAmB;E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","sourcesContent":["@tailwind base;\r\n@tailwind components;\r\n@tailwind utilities;\r\n\r\nbody {\r\n background-color: white;\r\n}\r\n\r\n/* Custom CSS to hide scrollbar */\r\n.hide-scrollbar::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.hide-scrollbar {\r\n -ms-overflow-style: none; /* IE and Edge */\r\n scrollbar-width: none; /* Firefox */\r\n}\r\n\r\n/* below css class replace bootstrap background color with daisy */\r\n.op-bg-primary {\r\n @apply bg-primary;\r\n}\r\n.op-bg-secondary {\r\n @apply bg-secondary;\r\n}\r\n.op-bg-info {\r\n @apply bg-info;\r\n}\r\n.op-bg-success{\r\n @apply bg-success;\r\n}\r\n.op-bg-warning {\r\n @apply bg-warning;\r\n}\r\n\r\n/* below css class replace bootstrap text color with daisy */\r\n.op-text-primary {\r\n @apply text-primary;\r\n}\r\n.op-text-secondary {\r\n @apply text-secondary;\r\n}\r\n.op-text-info {\r\n @apply text-info;\r\n}\r\n.op-text-success{\r\n @apply text-success;\r\n}\r\n.op-text-warning {\r\n @apply text-warning;\r\n}\r\n.op-border-primary{\r\n @apply border-primary\r\n}\r\n/* CSS for scrollbar customization */\r\n* {\r\n scrollbar-width: thin; /* For Firefox */\r\n scrollbar-color: gray; /* For Firefox */\r\n}\r\n\r\n/* For webkit-based browsers like Chrome, Safari */\r\n*::-webkit-scrollbar {\r\n width: 5px;\r\n}\r\n\r\n*::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n}\r\n\r\n*::-webkit-scrollbar-thumb {\r\n background-color: gray;\r\n border-radius: 10px;\r\n}"],"sourceRoot":""}]); +} +`, "",{"version":3,"sources":["webpack://./src/index.css"],"names":[],"mappings":"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mB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,yBAAmB;UAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,4BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;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","sourcesContent":["@tailwind base;\r\n@tailwind components;\r\n@tailwind utilities;\r\n\r\nbody {\r\n background-color: white;\r\n}\r\n\r\n/* Custom CSS to hide scrollbar */\r\n.hide-scrollbar::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.hide-scrollbar {\r\n -ms-overflow-style: none; /* IE and Edge */\r\n scrollbar-width: none; /* Firefox */\r\n}\r\n\r\n/* below css class replace bootstrap background color with daisy */\r\n.op-bg-primary {\r\n @apply bg-primary;\r\n}\r\n.op-bg-secondary {\r\n @apply bg-secondary;\r\n}\r\n.op-bg-info {\r\n @apply bg-info;\r\n}\r\n.op-bg-success {\r\n @apply bg-success;\r\n}\r\n.op-bg-warning {\r\n @apply bg-warning;\r\n}\r\n\r\n/* below css class replace bootstrap text color with daisy */\r\n.op-text-primary {\r\n @apply text-primary;\r\n}\r\n.op-text-secondary {\r\n @apply text-secondary;\r\n}\r\n.op-text-info {\r\n @apply text-info;\r\n}\r\n.op-text-accent {\r\n @apply text-accent;\r\n}\r\n.op-text-success {\r\n @apply text-success;\r\n}\r\n.op-text-warning {\r\n @apply text-warning;\r\n}\r\n.op-border-primary {\r\n @apply border-primary;\r\n}\r\n/* CSS for scrollbar customization */\r\n* {\r\n scrollbar-width: thin; /* For Firefox */\r\n scrollbar-color: gray; /* For Firefox */\r\n}\r\n\r\n/* For webkit-based browsers like Chrome, Safari */\r\n*::-webkit-scrollbar {\r\n width: 5px;\r\n}\r\n\r\n*::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n}\r\n\r\n*::-webkit-scrollbar-thumb {\r\n background-color: gray;\r\n border-radius: 10px;\r\n}\r\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -28199,6 +65132,25 @@ if (false) {} else { } +/***/ }), + +/***/ "./node_modules/html-parse-stringify/dist/html-parse-stringify.module.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/html-parse-stringify/dist/html-parse-stringify.module.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var void_elements__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! void-elements */ "./node_modules/void-elements/index.js"); +/* harmony import */ var void_elements__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(void_elements__WEBPACK_IMPORTED_MODULE_0__); +var t=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?(".*?"|'.*?')/g;function n(n){var r={type:"tag",name:"",voidElement:!1,attrs:{},children:[]},i=n.match(/<\/?([^\s]+?)[/\s>]/);if(i&&(r.name=i[1],((void_elements__WEBPACK_IMPORTED_MODULE_0___default())[i[1]]||"/"===n.charAt(n.length-2))&&(r.voidElement=!0),r.name.startsWith("!--"))){var s=n.indexOf("--\x3e");return{type:"comment",comment:-1!==s?n.slice(4,s):""}}for(var a=new RegExp(t),c=null;null!==(c=a.exec(n));)if(c[0].trim())if(c[1]){var o=c[1].trim(),l=[o,""];o.indexOf("=")>-1&&(l=o.split("=")),r.attrs[l[0]]=l[1],a.lastIndex--}else c[2]&&(r.attrs[c[2]]=c[3].trim().substring(1,c[3].length-1));return r}var r=/<[a-zA-Z0-9\-\!\/](?:"[^"]*"|'[^']*'|[^'">])*>/g,i=/^\s*$/,s=Object.create(null);function a(e,t){switch(t.type){case"text":return e+t.content;case"tag":return e+="<"+t.name+(t.attrs?function(e){var t=[];for(var n in e)t.push(n+'="'+e[n]+'"');return t.length?" "+t.join(" "):""}(t.attrs):"")+(t.voidElement?"/>":">"),t.voidElement?e:e+t.children.reduce(a,"")+"";case"comment":return e+"\x3c!--"+t.comment+"--\x3e"}}var c={parse:function(e,t){t||(t={}),t.components||(t.components=s);var a,c=[],o=[],l=-1,m=!1;if(0!==e.indexOf("<")){var u=e.indexOf("<");c.push({type:"text",content:-1===u?e:e.substring(0,u)})}return e.replace(r,function(r,s){if(m){if(r!=="")return;m=!1}var u,f="/"!==r.charAt(1),h=r.startsWith("\x3c!--"),p=s+r.length,d=e.charAt(p);if(h){var v=n(r);return l<0?(c.push(v),c):((u=o[l]).children.push(v),c)}if(f&&(l++,"tag"===(a=n(r)).type&&t.components[a.name]&&(a.type="component",m=!0),a.voidElement||m||!d||"<"===d||a.children.push({type:"text",content:e.slice(p,e.indexOf("<",p))}),0===l&&c.push(a),(u=o[l-1])&&u.children.push(a),o[l]=a),(!f||a.voidElement)&&(l>-1&&(a.voidElement||a.name===r.slice(2,-1))&&(l--,a=-1===l?c:o[l]),!m&&"<"!==d&&d)){u=-1===l?c:o[l].children;var x=e.indexOf("<",p),g=e.slice(p,-1===x?void 0:x);i.test(g)&&(g=" "),(x>-1&&l+u.length>=0||" "!==g)&&u.push({type:"text",content:g})}}),c},stringify:function(e){return e.reduce(function(e,t){return e+a("",t)},"")}};/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (c); +//# sourceMappingURL=html-parse-stringify.module.js.map + + /***/ }), /***/ "./node_modules/lodash.debounce/index.js": @@ -144096,6 +181048,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var react_draggable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-draggable */ "./node_modules/react-draggable/build/cjs/cjs.js"); /* harmony import */ var react_draggable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_draggable__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var re_resizable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! re-resizable */ "./node_modules/re-resizable/lib/index.js"); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ "./node_modules/react-dom/index.js"); + @@ -144444,6 +181398,7 @@ var Rnd = /** @class */ (function (_super) { } }; Rnd.prototype.onResize = function (e, direction, elementRef, delta) { + var _this = this; // INFO: Apply x and y position adjustments caused by resizing to draggable var newPos = { x: this.originalPosition.x, y: this.originalPosition.y }; var left = -delta.width; @@ -144463,7 +181418,9 @@ var Rnd = /** @class */ (function (_super) { } var draggableState = this.draggable.state; if (newPos.x !== draggableState.x || newPos.y !== draggableState.y) { - this.draggable.setState(newPos); + (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.flushSync)(function () { + _this.draggable.setState(newPos); + }); } this.updateOffsetFromParent(); var offset = this.offsetFromParent; @@ -156883,6 +193840,37 @@ function version(uuid) { } var _default = exports["default"] = version; +/***/ }), + +/***/ "./node_modules/void-elements/index.js": +/*!*********************************************!*\ + !*** ./node_modules/void-elements/index.js ***! + \*********************************************/ +/***/ ((module) => { + +/** + * This file automatically generated from `pre-publish.js`. + * Do not manually edit. + */ + +module.exports = { + "area": true, + "base": true, + "br": true, + "col": true, + "embed": true, + "hr": true, + "img": true, + "input": true, + "link": true, + "meta": true, + "param": true, + "source": true, + "track": true, + "wbr": true +}; + + /***/ }), /***/ "./node_modules/warning/warning.js": @@ -159071,7 +196059,7 @@ module.exports = { var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js-pure/internals/fails.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js-pure/internals/well-known-symbol.js"); -var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js-pure/internals/engine-v8-version.js"); +var V8_VERSION = __webpack_require__(/*! ../internals/environment-v8-version */ "./node_modules/core-js-pure/internals/environment-v8-version.js"); var SPECIES = wellKnownSymbol('species'); @@ -159852,7 +196840,7 @@ module.exports = { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js-pure/internals/export.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js-pure/internals/internal-metadata.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js-pure/internals/fails.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js-pure/internals/create-non-enumerable-property.js"); @@ -159874,7 +196862,7 @@ module.exports = function (CONSTRUCTOR_NAME, wrapper, common) { var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; var ADDER = IS_MAP ? 'set' : 'add'; - var NativeConstructor = global[CONSTRUCTOR_NAME]; + var NativeConstructor = globalThis[CONSTRUCTOR_NAME]; var NativePrototype = NativeConstructor && NativeConstructor.prototype; var exported = {}; var Constructor; @@ -160201,16 +197189,16 @@ module.exports = function (target, src, options) { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); // eslint-disable-next-line es/no-object-defineproperty -- safe var defineProperty = Object.defineProperty; module.exports = function (key, value) { try { - defineProperty(global, key, { value: value, configurable: true, writable: true }); + defineProperty(globalThis, key, { value: value, configurable: true, writable: true }); } catch (error) { - global[key] = value; + globalThis[key] = value; } return value; }; @@ -160263,10 +197251,10 @@ module.exports = !fails(function () { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js-pure/internals/is-object.js"); -var document = global.document; +var document = globalThis.document; // typeof document.createElement is 'object' in old IE var EXISTS = isObject(document) && isObject(document.createElement); @@ -160343,108 +197331,84 @@ module.exports = { /***/ }), -/***/ "./node_modules/core-js-pure/internals/engine-ff-version.js": -/*!******************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-ff-version.js ***! - \******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js-pure/internals/engine-user-agent.js"); - -var firefox = userAgent.match(/firefox\/(\d+)/i); - -module.exports = !!firefox && +firefox[1]; - - -/***/ }), - -/***/ "./node_modules/core-js-pure/internals/engine-is-browser.js": -/*!******************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-is-browser.js ***! - \******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var IS_DENO = __webpack_require__(/*! ../internals/engine-is-deno */ "./node_modules/core-js-pure/internals/engine-is-deno.js"); -var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js-pure/internals/engine-is-node.js"); - -module.exports = !IS_DENO && !IS_NODE - && typeof window == 'object' - && typeof document == 'object'; - - -/***/ }), - -/***/ "./node_modules/core-js-pure/internals/engine-is-bun.js": +/***/ "./node_modules/core-js-pure/internals/enum-bug-keys.js": /*!**************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-is-bun.js ***! + !*** ./node_modules/core-js-pure/internals/enum-bug-keys.js ***! \**************************************************************/ /***/ ((module) => { "use strict"; -/* global Bun -- Bun case */ -module.exports = typeof Bun == 'function' && Bun && typeof Bun.version == 'string'; +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; /***/ }), -/***/ "./node_modules/core-js-pure/internals/engine-is-deno.js": -/*!***************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-is-deno.js ***! - \***************************************************************/ -/***/ ((module) => { +/***/ "./node_modules/core-js-pure/internals/environment-ff-version.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js-pure/internals/environment-ff-version.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -/* global Deno -- Deno case */ -module.exports = typeof Deno == 'object' && Deno && typeof Deno.version == 'object'; +var userAgent = __webpack_require__(/*! ../internals/environment-user-agent */ "./node_modules/core-js-pure/internals/environment-user-agent.js"); + +var firefox = userAgent.match(/firefox\/(\d+)/i); + +module.exports = !!firefox && +firefox[1]; /***/ }), -/***/ "./node_modules/core-js-pure/internals/engine-is-ie-or-edge.js": -/*!*********************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-is-ie-or-edge.js ***! - \*********************************************************************/ +/***/ "./node_modules/core-js-pure/internals/environment-is-ie-or-edge.js": +/*!**************************************************************************!*\ + !*** ./node_modules/core-js-pure/internals/environment-is-ie-or-edge.js ***! + \**************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var UA = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js-pure/internals/engine-user-agent.js"); +var UA = __webpack_require__(/*! ../internals/environment-user-agent */ "./node_modules/core-js-pure/internals/environment-user-agent.js"); module.exports = /MSIE|Trident/.test(UA); /***/ }), -/***/ "./node_modules/core-js-pure/internals/engine-is-ios-pebble.js": -/*!*********************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-is-ios-pebble.js ***! - \*********************************************************************/ +/***/ "./node_modules/core-js-pure/internals/environment-is-ios-pebble.js": +/*!**************************************************************************!*\ + !*** ./node_modules/core-js-pure/internals/environment-is-ios-pebble.js ***! + \**************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js-pure/internals/engine-user-agent.js"); +var userAgent = __webpack_require__(/*! ../internals/environment-user-agent */ "./node_modules/core-js-pure/internals/environment-user-agent.js"); module.exports = /ipad|iphone|ipod/i.test(userAgent) && typeof Pebble != 'undefined'; /***/ }), -/***/ "./node_modules/core-js-pure/internals/engine-is-ios.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-is-ios.js ***! - \**************************************************************/ +/***/ "./node_modules/core-js-pure/internals/environment-is-ios.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js-pure/internals/environment-is-ios.js ***! + \*******************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js-pure/internals/engine-user-agent.js"); +var userAgent = __webpack_require__(/*! ../internals/environment-user-agent */ "./node_modules/core-js-pure/internals/environment-user-agent.js"); // eslint-disable-next-line redos/no-vulnerable -- safe module.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent); @@ -160452,63 +197416,67 @@ module.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent); /***/ }), -/***/ "./node_modules/core-js-pure/internals/engine-is-node.js": -/*!***************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-is-node.js ***! - \***************************************************************/ +/***/ "./node_modules/core-js-pure/internals/environment-is-node.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js-pure/internals/environment-is-node.js ***! + \********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); -var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js-pure/internals/classof-raw.js"); +var ENVIRONMENT = __webpack_require__(/*! ../internals/environment */ "./node_modules/core-js-pure/internals/environment.js"); -module.exports = classof(global.process) === 'process'; +module.exports = ENVIRONMENT === 'NODE'; /***/ }), -/***/ "./node_modules/core-js-pure/internals/engine-is-webos-webkit.js": -/*!***********************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-is-webos-webkit.js ***! - \***********************************************************************/ +/***/ "./node_modules/core-js-pure/internals/environment-is-webos-webkit.js": +/*!****************************************************************************!*\ + !*** ./node_modules/core-js-pure/internals/environment-is-webos-webkit.js ***! + \****************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js-pure/internals/engine-user-agent.js"); +var userAgent = __webpack_require__(/*! ../internals/environment-user-agent */ "./node_modules/core-js-pure/internals/environment-user-agent.js"); module.exports = /web0s(?!.*chrome)/i.test(userAgent); /***/ }), -/***/ "./node_modules/core-js-pure/internals/engine-user-agent.js": -/*!******************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-user-agent.js ***! - \******************************************************************/ -/***/ ((module) => { +/***/ "./node_modules/core-js-pure/internals/environment-user-agent.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js-pure/internals/environment-user-agent.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -module.exports = typeof navigator != 'undefined' && String(navigator.userAgent) || ''; +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); + +var navigator = globalThis.navigator; +var userAgent = navigator && navigator.userAgent; + +module.exports = userAgent ? String(userAgent) : ''; /***/ }), -/***/ "./node_modules/core-js-pure/internals/engine-v8-version.js": -/*!******************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-v8-version.js ***! - \******************************************************************/ +/***/ "./node_modules/core-js-pure/internals/environment-v8-version.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js-pure/internals/environment-v8-version.js ***! + \***********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); -var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js-pure/internals/engine-user-agent.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); +var userAgent = __webpack_require__(/*! ../internals/environment-user-agent */ "./node_modules/core-js-pure/internals/environment-user-agent.js"); -var process = global.process; -var Deno = global.Deno; +var process = globalThis.process; +var Deno = globalThis.Deno; var versions = process && process.versions || Deno && Deno.version; var v8 = versions && versions.v8; var match, version; @@ -160535,15 +197503,15 @@ module.exports = version; /***/ }), -/***/ "./node_modules/core-js-pure/internals/engine-webkit-version.js": -/*!**********************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/engine-webkit-version.js ***! - \**********************************************************************/ +/***/ "./node_modules/core-js-pure/internals/environment-webkit-version.js": +/*!***************************************************************************!*\ + !*** ./node_modules/core-js-pure/internals/environment-webkit-version.js ***! + \***************************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js-pure/internals/engine-user-agent.js"); +var userAgent = __webpack_require__(/*! ../internals/environment-user-agent */ "./node_modules/core-js-pure/internals/environment-user-agent.js"); var webkit = userAgent.match(/AppleWebKit\/(\d+)\./); @@ -160552,24 +197520,34 @@ module.exports = !!webkit && +webkit[1]; /***/ }), -/***/ "./node_modules/core-js-pure/internals/enum-bug-keys.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js-pure/internals/enum-bug-keys.js ***! - \**************************************************************/ -/***/ ((module) => { +/***/ "./node_modules/core-js-pure/internals/environment.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js-pure/internals/environment.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -// IE8- don't enum bug keys -module.exports = [ - 'constructor', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'toLocaleString', - 'toString', - 'valueOf' -]; +/* global Bun, Deno -- detection */ +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); +var userAgent = __webpack_require__(/*! ../internals/environment-user-agent */ "./node_modules/core-js-pure/internals/environment-user-agent.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js-pure/internals/classof-raw.js"); + +var userAgentStartsWith = function (string) { + return userAgent.slice(0, string.length) === string; +}; + +module.exports = (function () { + if (userAgentStartsWith('Bun/')) return 'BUN'; + if (userAgentStartsWith('Cloudflare-Workers')) return 'CLOUDFLARE'; + if (userAgentStartsWith('Deno/')) return 'DENO'; + if (userAgentStartsWith('Node.js/')) return 'NODE'; + if (globalThis.Bun && typeof Bun.version == 'string') return 'BUN'; + if (globalThis.Deno && typeof Deno.version == 'object') return 'DENO'; + if (classof(globalThis.process) === 'process') return 'NODE'; + if (globalThis.window && globalThis.document) return 'BROWSER'; + return 'REST'; +})(); /***/ }), @@ -160656,7 +197634,7 @@ module.exports = !fails(function () { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var apply = __webpack_require__(/*! ../internals/function-apply */ "./node_modules/core-js-pure/internals/function-apply.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this-clause */ "./node_modules/core-js-pure/internals/function-uncurry-this-clause.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js-pure/internals/is-callable.js"); @@ -160704,7 +197682,7 @@ module.exports = function (options, source) { var STATIC = options.stat; var PROTO = options.proto; - var nativeSource = GLOBAL ? global : STATIC ? global[TARGET] : global[TARGET] && global[TARGET].prototype; + var nativeSource = GLOBAL ? globalThis : STATIC ? globalThis[TARGET] : globalThis[TARGET] && globalThis[TARGET].prototype; var target = GLOBAL ? path : path[TARGET] || createNonEnumerableProperty(path, TARGET, {})[TARGET]; var targetPrototype = target.prototype; @@ -160730,7 +197708,7 @@ module.exports = function (options, source) { if (!FORCED && !PROTO && typeof targetProperty == typeof sourceProperty) continue; // bind methods to global for calling from export context - if (options.bind && USE_NATIVE) resultProperty = bind(sourceProperty, global); + if (options.bind && USE_NATIVE) resultProperty = bind(sourceProperty, globalThis); // wrap global constructors for prevent changes in this version else if (options.wrap && USE_NATIVE) resultProperty = wrapConstructor(sourceProperty); // make static versions for prototype methods @@ -161035,14 +198013,14 @@ module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var path = __webpack_require__(/*! ../internals/path */ "./node_modules/core-js-pure/internals/path.js"); module.exports = function (CONSTRUCTOR, METHOD) { var Namespace = path[CONSTRUCTOR + 'Prototype']; var pureMethod = Namespace && Namespace[METHOD]; if (pureMethod) return pureMethod; - var NativeConstructor = global[CONSTRUCTOR]; + var NativeConstructor = globalThis[CONSTRUCTOR]; var NativePrototype = NativeConstructor && NativeConstructor.prototype; return NativePrototype && NativePrototype[METHOD]; }; @@ -161059,7 +198037,7 @@ module.exports = function (CONSTRUCTOR, METHOD) { "use strict"; var path = __webpack_require__(/*! ../internals/path */ "./node_modules/core-js-pure/internals/path.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js-pure/internals/is-callable.js"); var aFunction = function (variable) { @@ -161067,8 +198045,8 @@ var aFunction = function (variable) { }; module.exports = function (namespace, method) { - return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace]) - : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method]; + return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(globalThis[namespace]) + : path[namespace] && path[namespace][method] || globalThis[namespace] && globalThis[namespace][method]; }; @@ -161258,10 +198236,10 @@ module.exports = function (obj) { /***/ }), -/***/ "./node_modules/core-js-pure/internals/global.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js-pure/internals/global.js ***! - \*******************************************************/ +/***/ "./node_modules/core-js-pure/internals/global-this.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js-pure/internals/global-this.js ***! + \************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -161562,7 +198540,7 @@ hiddenKeys[METADATA] = true; "use strict"; var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/weak-map-basic-detection */ "./node_modules/core-js-pure/internals/weak-map-basic-detection.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js-pure/internals/is-object.js"); var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js-pure/internals/create-non-enumerable-property.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js-pure/internals/has-own-property.js"); @@ -161571,8 +198549,8 @@ var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modul var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js-pure/internals/hidden-keys.js"); var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; -var TypeError = global.TypeError; -var WeakMap = global.WeakMap; +var TypeError = globalThis.TypeError; +var WeakMap = globalThis.WeakMap; var set, get, has; var enforce = function (it) { @@ -162357,20 +199335,20 @@ module.exports = Math.trunc || function trunc(x) { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var safeGetBuiltIn = __webpack_require__(/*! ../internals/safe-get-built-in */ "./node_modules/core-js-pure/internals/safe-get-built-in.js"); var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js-pure/internals/function-bind-context.js"); var macrotask = (__webpack_require__(/*! ../internals/task */ "./node_modules/core-js-pure/internals/task.js").set); var Queue = __webpack_require__(/*! ../internals/queue */ "./node_modules/core-js-pure/internals/queue.js"); -var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "./node_modules/core-js-pure/internals/engine-is-ios.js"); -var IS_IOS_PEBBLE = __webpack_require__(/*! ../internals/engine-is-ios-pebble */ "./node_modules/core-js-pure/internals/engine-is-ios-pebble.js"); -var IS_WEBOS_WEBKIT = __webpack_require__(/*! ../internals/engine-is-webos-webkit */ "./node_modules/core-js-pure/internals/engine-is-webos-webkit.js"); -var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js-pure/internals/engine-is-node.js"); - -var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; -var document = global.document; -var process = global.process; -var Promise = global.Promise; +var IS_IOS = __webpack_require__(/*! ../internals/environment-is-ios */ "./node_modules/core-js-pure/internals/environment-is-ios.js"); +var IS_IOS_PEBBLE = __webpack_require__(/*! ../internals/environment-is-ios-pebble */ "./node_modules/core-js-pure/internals/environment-is-ios-pebble.js"); +var IS_WEBOS_WEBKIT = __webpack_require__(/*! ../internals/environment-is-webos-webkit */ "./node_modules/core-js-pure/internals/environment-is-webos-webkit.js"); +var IS_NODE = __webpack_require__(/*! ../internals/environment-is-node */ "./node_modules/core-js-pure/internals/environment-is-node.js"); + +var MutationObserver = globalThis.MutationObserver || globalThis.WebKitMutationObserver; +var document = globalThis.document; +var process = globalThis.process; +var Promise = globalThis.Promise; var microtask = safeGetBuiltIn('queueMicrotask'); var notify, toggle, node, promise, then; @@ -162422,7 +199400,7 @@ if (!microtask) { // - setTimeout } else { // `webpack` dev server bug on IE global methods - use bind(fn, global) - macrotask = bind(macrotask, global); + macrotask = bind(macrotask, globalThis); notify = function () { macrotask(flush); }; @@ -162517,15 +199495,15 @@ module.exports = function (it) { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js-pure/internals/fails.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js-pure/internals/function-uncurry-this.js"); var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js-pure/internals/to-string.js"); var trim = (__webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js-pure/internals/string-trim.js").trim); var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/core-js-pure/internals/whitespaces.js"); -var $parseInt = global.parseInt; -var Symbol = global.Symbol; +var $parseInt = globalThis.parseInt; +var Symbol = globalThis.Symbol; var ITERATOR = Symbol && Symbol.iterator; var hex = /^[+-]?0x/i; var exec = uncurryThis(hex.exec); @@ -162645,7 +199623,8 @@ var NullProtoObjectViaActiveX = function (activeXDocument) { activeXDocument.write(scriptTag('')); activeXDocument.close(); var temp = activeXDocument.parentWindow.Object; - activeXDocument = null; // avoid memory leak + // eslint-disable-next-line no-useless-assignment -- avoid memory leak + activeXDocument = null; return temp; }; @@ -163266,21 +200245,20 @@ module.exports = function (exec) { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var NativePromiseConstructor = __webpack_require__(/*! ../internals/promise-native-constructor */ "./node_modules/core-js-pure/internals/promise-native-constructor.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js-pure/internals/is-callable.js"); var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js-pure/internals/is-forced.js"); var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "./node_modules/core-js-pure/internals/inspect-source.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js-pure/internals/well-known-symbol.js"); -var IS_BROWSER = __webpack_require__(/*! ../internals/engine-is-browser */ "./node_modules/core-js-pure/internals/engine-is-browser.js"); -var IS_DENO = __webpack_require__(/*! ../internals/engine-is-deno */ "./node_modules/core-js-pure/internals/engine-is-deno.js"); +var ENVIRONMENT = __webpack_require__(/*! ../internals/environment */ "./node_modules/core-js-pure/internals/environment.js"); var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js-pure/internals/is-pure.js"); -var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js-pure/internals/engine-v8-version.js"); +var V8_VERSION = __webpack_require__(/*! ../internals/environment-v8-version */ "./node_modules/core-js-pure/internals/environment-v8-version.js"); var NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype; var SPECIES = wellKnownSymbol('species'); var SUBCLASSING = false; -var NATIVE_PROMISE_REJECTION_EVENT = isCallable(global.PromiseRejectionEvent); +var NATIVE_PROMISE_REJECTION_EVENT = isCallable(globalThis.PromiseRejectionEvent); var FORCED_PROMISE_CONSTRUCTOR = isForced('Promise', function () { var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(NativePromiseConstructor); @@ -163305,7 +200283,7 @@ var FORCED_PROMISE_CONSTRUCTOR = isForced('Promise', function () { SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise; if (!SUBCLASSING) return true; // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test - } return !GLOBAL_CORE_JS_PROMISE && (IS_BROWSER || IS_DENO) && !NATIVE_PROMISE_REJECTION_EVENT; + } return !GLOBAL_CORE_JS_PROMISE && (ENVIRONMENT === 'BROWSER' || ENVIRONMENT === 'DENO') && !NATIVE_PROMISE_REJECTION_EVENT; }); module.exports = { @@ -163325,9 +200303,9 @@ module.exports = { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); -module.exports = global.Promise; +module.exports = globalThis.Promise; /***/ }), @@ -163441,7 +200419,7 @@ module.exports = function (it) { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js-pure/internals/descriptors.js"); // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe @@ -163449,8 +200427,8 @@ var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; // Avoid NodeJS experimental warning module.exports = function (name) { - if (!DESCRIPTORS) return global[name]; - var descriptor = getOwnPropertyDescriptor(global, name); + if (!DESCRIPTORS) return globalThis[name]; + var descriptor = getOwnPropertyDescriptor(globalThis, name); return descriptor && descriptor.value; }; @@ -163465,18 +200443,18 @@ module.exports = function (name) { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var apply = __webpack_require__(/*! ../internals/function-apply */ "./node_modules/core-js-pure/internals/function-apply.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js-pure/internals/is-callable.js"); -var ENGINE_IS_BUN = __webpack_require__(/*! ../internals/engine-is-bun */ "./node_modules/core-js-pure/internals/engine-is-bun.js"); -var USER_AGENT = __webpack_require__(/*! ../internals/engine-user-agent */ "./node_modules/core-js-pure/internals/engine-user-agent.js"); +var ENVIRONMENT = __webpack_require__(/*! ../internals/environment */ "./node_modules/core-js-pure/internals/environment.js"); +var USER_AGENT = __webpack_require__(/*! ../internals/environment-user-agent */ "./node_modules/core-js-pure/internals/environment-user-agent.js"); var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "./node_modules/core-js-pure/internals/array-slice.js"); var validateArgumentsLength = __webpack_require__(/*! ../internals/validate-arguments-length */ "./node_modules/core-js-pure/internals/validate-arguments-length.js"); -var Function = global.Function; +var Function = globalThis.Function; // dirty IE9- and Bun 0.3.0- checks -var WRAP = /MSIE .\./.test(USER_AGENT) || ENGINE_IS_BUN && (function () { - var version = global.Bun.version.split('.'); +var WRAP = /MSIE .\./.test(USER_AGENT) || ENVIRONMENT === 'BUN' && (function () { + var version = globalThis.Bun.version.split('.'); return version.length < 3 || version[0] === '0' && (version[1] < 3 || version[1] === '3' && version[2] === '0'); })(); @@ -163918,17 +200896,17 @@ module.exports = function (key) { "use strict"; var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js-pure/internals/is-pure.js"); -var globalThis = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var defineGlobalProperty = __webpack_require__(/*! ../internals/define-global-property */ "./node_modules/core-js-pure/internals/define-global-property.js"); var SHARED = '__core-js_shared__'; var store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {}); (store.versions || (store.versions = [])).push({ - version: '3.37.1', + version: '3.38.0', mode: IS_PURE ? 'pure' : 'global', copyright: '© 2014-2024 Denis Pushkarev (zloirock.ru)', - license: 'https://github.com/zloirock/core-js/blob/v3.37.1/LICENSE', + license: 'https://github.com/zloirock/core-js/blob/v3.38.0/LICENSE', source: 'https://github.com/zloirock/core-js' }); @@ -164152,11 +201130,11 @@ module.exports = { "use strict"; /* eslint-disable es/no-symbol -- required for testing */ -var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js-pure/internals/engine-v8-version.js"); +var V8_VERSION = __webpack_require__(/*! ../internals/environment-v8-version */ "./node_modules/core-js-pure/internals/environment-v8-version.js"); var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js-pure/internals/fails.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); -var $String = global.String; +var $String = globalThis.String; // eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing module.exports = !!Object.getOwnPropertySymbols && !fails(function () { @@ -164303,7 +201281,7 @@ module.exports = NATIVE_SYMBOL && !!Symbol['for'] && !!Symbol.keyFor; "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var apply = __webpack_require__(/*! ../internals/function-apply */ "./node_modules/core-js-pure/internals/function-apply.js"); var bind = __webpack_require__(/*! ../internals/function-bind-context */ "./node_modules/core-js-pure/internals/function-bind-context.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js-pure/internals/is-callable.js"); @@ -164313,16 +201291,16 @@ var html = __webpack_require__(/*! ../internals/html */ "./node_modules/core-js- var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "./node_modules/core-js-pure/internals/array-slice.js"); var createElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js-pure/internals/document-create-element.js"); var validateArgumentsLength = __webpack_require__(/*! ../internals/validate-arguments-length */ "./node_modules/core-js-pure/internals/validate-arguments-length.js"); -var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "./node_modules/core-js-pure/internals/engine-is-ios.js"); -var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js-pure/internals/engine-is-node.js"); - -var set = global.setImmediate; -var clear = global.clearImmediate; -var process = global.process; -var Dispatch = global.Dispatch; -var Function = global.Function; -var MessageChannel = global.MessageChannel; -var String = global.String; +var IS_IOS = __webpack_require__(/*! ../internals/environment-is-ios */ "./node_modules/core-js-pure/internals/environment-is-ios.js"); +var IS_NODE = __webpack_require__(/*! ../internals/environment-is-node */ "./node_modules/core-js-pure/internals/environment-is-node.js"); + +var set = globalThis.setImmediate; +var clear = globalThis.clearImmediate; +var process = globalThis.process; +var Dispatch = globalThis.Dispatch; +var Function = globalThis.Function; +var MessageChannel = globalThis.MessageChannel; +var String = globalThis.String; var counter = 0; var queue = {}; var ONREADYSTATECHANGE = 'onreadystatechange'; @@ -164330,7 +201308,7 @@ var $location, defer, channel, port; fails(function () { // Deno throws a ReferenceError on `location` access without `--location` flag - $location = global.location; + $location = globalThis.location; }); var run = function (id) { @@ -164353,7 +201331,7 @@ var eventListener = function (event) { var globalPostMessageDefer = function (id) { // old engines have not location.origin - global.postMessage(String(id), $location.protocol + '//' + $location.host); + globalThis.postMessage(String(id), $location.protocol + '//' + $location.host); }; // Node.js 0.9+ & IE10+ has setImmediate, otherwise: @@ -164391,14 +201369,14 @@ if (!set || !clear) { // Browsers with postMessage, skip WebWorkers // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' } else if ( - global.addEventListener && - isCallable(global.postMessage) && - !global.importScripts && + globalThis.addEventListener && + isCallable(globalThis.postMessage) && + !globalThis.importScripts && $location && $location.protocol !== 'file:' && !fails(globalPostMessageDefer) ) { defer = globalPostMessageDefer; - global.addEventListener('message', eventListener, false); + globalThis.addEventListener('message', eventListener, false); // IE8- } else if (ONREADYSTATECHANGE in createElement('script')) { defer = function (id) { @@ -164738,10 +201716,10 @@ module.exports = function (passed, required) { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var isCallable = __webpack_require__(/*! ../internals/is-callable */ "./node_modules/core-js-pure/internals/is-callable.js"); -var WeakMap = global.WeakMap; +var WeakMap = globalThis.WeakMap; module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); @@ -164794,14 +201772,14 @@ exports.f = wellKnownSymbol; "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js-pure/internals/shared.js"); var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "./node_modules/core-js-pure/internals/has-own-property.js"); var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js-pure/internals/uid.js"); var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/symbol-constructor-detection */ "./node_modules/core-js-pure/internals/symbol-constructor-detection.js"); var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "./node_modules/core-js-pure/internals/use-symbol-as-uid.js"); -var Symbol = global.Symbol; +var Symbol = globalThis.Symbol; var WellKnownSymbolsStore = shared('wks'); var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid; @@ -164926,7 +201904,7 @@ var createProperty = __webpack_require__(/*! ../internals/create-property */ "./ var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/core-js-pure/internals/array-species-create.js"); var arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/core-js-pure/internals/array-method-has-species-support.js"); var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js-pure/internals/well-known-symbol.js"); -var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js-pure/internals/engine-v8-version.js"); +var V8_VERSION = __webpack_require__(/*! ../internals/environment-v8-version */ "./node_modules/core-js-pure/internals/environment-v8-version.js"); var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable'); @@ -165337,8 +202315,8 @@ $({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js-pure/internals/export.js"); var $reduce = (__webpack_require__(/*! ../internals/array-reduce */ "./node_modules/core-js-pure/internals/array-reduce.js").left); var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js-pure/internals/array-method-is-strict.js"); -var CHROME_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js-pure/internals/engine-v8-version.js"); -var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js-pure/internals/engine-is-node.js"); +var CHROME_VERSION = __webpack_require__(/*! ../internals/environment-v8-version */ "./node_modules/core-js-pure/internals/environment-v8-version.js"); +var IS_NODE = __webpack_require__(/*! ../internals/environment-is-node */ "./node_modules/core-js-pure/internals/environment-is-node.js"); // Chrome 80-82 has a critical bug // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982 @@ -165435,10 +202413,10 @@ var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js-pure/internals/fails.js"); var internalSort = __webpack_require__(/*! ../internals/array-sort */ "./node_modules/core-js-pure/internals/array-sort.js"); var arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ "./node_modules/core-js-pure/internals/array-method-is-strict.js"); -var FF = __webpack_require__(/*! ../internals/engine-ff-version */ "./node_modules/core-js-pure/internals/engine-ff-version.js"); -var IE_OR_EDGE = __webpack_require__(/*! ../internals/engine-is-ie-or-edge */ "./node_modules/core-js-pure/internals/engine-is-ie-or-edge.js"); -var V8 = __webpack_require__(/*! ../internals/engine-v8-version */ "./node_modules/core-js-pure/internals/engine-v8-version.js"); -var WEBKIT = __webpack_require__(/*! ../internals/engine-webkit-version */ "./node_modules/core-js-pure/internals/engine-webkit-version.js"); +var FF = __webpack_require__(/*! ../internals/environment-ff-version */ "./node_modules/core-js-pure/internals/environment-ff-version.js"); +var IE_OR_EDGE = __webpack_require__(/*! ../internals/environment-is-ie-or-edge */ "./node_modules/core-js-pure/internals/environment-is-ie-or-edge.js"); +var V8 = __webpack_require__(/*! ../internals/environment-v8-version */ "./node_modules/core-js-pure/internals/environment-v8-version.js"); +var WEBKIT = __webpack_require__(/*! ../internals/environment-webkit-version */ "./node_modules/core-js-pure/internals/environment-webkit-version.js"); var test = []; var nativeSort = uncurryThis(test.sort); @@ -165773,12 +202751,12 @@ if ($stringify) { "use strict"; -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js-pure/internals/set-to-string-tag.js"); // JSON[@@toStringTag] property // https://tc39.es/ecma262/#sec-json-@@tostringtag -setToStringTag(global.JSON, 'JSON', true); +setToStringTag(globalThis.JSON, 'JSON', true); /***/ }), @@ -166366,8 +203344,8 @@ if (!IS_PURE && isCallable(NativePromiseConstructor)) { var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js-pure/internals/export.js"); var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js-pure/internals/is-pure.js"); -var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "./node_modules/core-js-pure/internals/engine-is-node.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var IS_NODE = __webpack_require__(/*! ../internals/environment-is-node */ "./node_modules/core-js-pure/internals/environment-is-node.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js-pure/internals/function-call.js"); var defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ "./node_modules/core-js-pure/internals/define-built-in.js"); var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js-pure/internals/object-set-prototype-of.js"); @@ -166397,13 +203375,13 @@ var setInternalState = InternalStateModule.set; var NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype; var PromiseConstructor = NativePromiseConstructor; var PromisePrototype = NativePromisePrototype; -var TypeError = global.TypeError; -var document = global.document; -var process = global.process; +var TypeError = globalThis.TypeError; +var document = globalThis.document; +var process = globalThis.process; var newPromiseCapability = newPromiseCapabilityModule.f; var newGenericPromiseCapability = newPromiseCapability; -var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent); +var DISPATCH_EVENT = !!(document && document.createEvent && globalThis.dispatchEvent); var UNHANDLED_REJECTION = 'unhandledrejection'; var REJECTION_HANDLED = 'rejectionhandled'; var PENDING = 0; @@ -166476,14 +203454,14 @@ var dispatchEvent = function (name, promise, reason) { event.promise = promise; event.reason = reason; event.initEvent(name, false, true); - global.dispatchEvent(event); + globalThis.dispatchEvent(event); } else event = { promise: promise, reason: reason }; - if (!NATIVE_PROMISE_REJECTION_EVENT && (handler = global['on' + name])) handler(event); + if (!NATIVE_PROMISE_REJECTION_EVENT && (handler = globalThis['on' + name])) handler(event); else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason); }; var onUnhandled = function (state) { - call(task, global, function () { + call(task, globalThis, function () { var promise = state.facade; var value = state.value; var IS_UNHANDLED = isUnhandled(state); @@ -166506,7 +203484,7 @@ var isUnhandled = function (state) { }; var onHandleUnhandled = function (state) { - call(task, global, function () { + call(task, globalThis, function () { var promise = state.facade; if (IS_NODE) { process.emit('rejectionHandled', promise); @@ -167188,7 +204166,7 @@ defineWellKnownSymbol('asyncIterator'); "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js-pure/internals/export.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var call = __webpack_require__(/*! ../internals/function-call */ "./node_modules/core-js-pure/internals/function-call.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js-pure/internals/function-uncurry-this.js"); var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js-pure/internals/is-pure.js"); @@ -167233,11 +204211,11 @@ var setInternalState = InternalStateModule.set; var getInternalState = InternalStateModule.getterFor(SYMBOL); var ObjectPrototype = Object[PROTOTYPE]; -var $Symbol = global.Symbol; +var $Symbol = globalThis.Symbol; var SymbolPrototype = $Symbol && $Symbol[PROTOTYPE]; -var RangeError = global.RangeError; -var TypeError = global.TypeError; -var QObject = global.QObject; +var RangeError = globalThis.RangeError; +var TypeError = globalThis.TypeError; +var QObject = globalThis.QObject; var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; var nativeDefineProperty = definePropertyModule.f; var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f; @@ -167356,7 +204334,7 @@ if (!NATIVE_SYMBOL) { var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]); var tag = uid(description); var setter = function (value) { - var $this = this === undefined ? global : this; + var $this = this === undefined ? globalThis : this; if ($this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value); if (hasOwn($this, HIDDEN) && hasOwn($this[HIDDEN], tag)) $this[HIDDEN][tag] = false; var descriptor = createPropertyDescriptor(1, value); @@ -167769,7 +204747,7 @@ defineWellKnownSymbol('unscopables'); "use strict"; var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/core-js-pure/internals/freezing.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js-pure/internals/function-uncurry-this.js"); var defineBuiltIns = __webpack_require__(/*! ../internals/define-built-ins */ "./node_modules/core-js-pure/internals/define-built-ins.js"); var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/core-js-pure/internals/internal-metadata.js"); @@ -167794,7 +204772,7 @@ var freeze = $Object.freeze; // eslint-disable-next-line es/no-object-seal -- safe var seal = $Object.seal; -var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; +var IS_IE11 = !globalThis.ActiveXObject && 'ActiveXObject' in globalThis; var InternalWeakMap; var wrapper = function (init) { @@ -168173,12 +205151,12 @@ defineWellKnownSymbol('replaceAll'); __webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/core-js-pure/modules/es.array.iterator.js"); var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "./node_modules/core-js-pure/internals/dom-iterables.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js-pure/internals/set-to-string-tag.js"); var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js-pure/internals/iterators.js"); for (var COLLECTION_NAME in DOMIterables) { - setToStringTag(global[COLLECTION_NAME], COLLECTION_NAME); + setToStringTag(globalThis[COLLECTION_NAME], COLLECTION_NAME); Iterators[COLLECTION_NAME] = Iterators.Array; } @@ -168194,14 +205172,14 @@ for (var COLLECTION_NAME in DOMIterables) { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js-pure/internals/export.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var schedulersFix = __webpack_require__(/*! ../internals/schedulers-fix */ "./node_modules/core-js-pure/internals/schedulers-fix.js"); -var setInterval = schedulersFix(global.setInterval, true); +var setInterval = schedulersFix(globalThis.setInterval, true); // Bun / IE9- setInterval additional parameters fix // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval -$({ global: true, bind: true, forced: global.setInterval !== setInterval }, { +$({ global: true, bind: true, forced: globalThis.setInterval !== setInterval }, { setInterval: setInterval }); @@ -168217,14 +205195,14 @@ $({ global: true, bind: true, forced: global.setInterval !== setInterval }, { "use strict"; var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js-pure/internals/export.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js-pure/internals/global.js"); +var globalThis = __webpack_require__(/*! ../internals/global-this */ "./node_modules/core-js-pure/internals/global-this.js"); var schedulersFix = __webpack_require__(/*! ../internals/schedulers-fix */ "./node_modules/core-js-pure/internals/schedulers-fix.js"); -var setTimeout = schedulersFix(global.setTimeout, true); +var setTimeout = schedulersFix(globalThis.setTimeout, true); // Bun / IE9- setTimeout additional parameters fix // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout -$({ global: true, bind: true, forced: global.setTimeout !== setTimeout }, { +$({ global: true, bind: true, forced: globalThis.setTimeout !== setTimeout }, { setTimeout: setTimeout }); @@ -170396,7 +207374,7 @@ function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetPar const win = (0,_floating_ui_utils_dom__WEBPACK_IMPORTED_MODULE_0__.getWindow)(domElement); const offsetWin = offsetParent && (0,_floating_ui_utils_dom__WEBPACK_IMPORTED_MODULE_0__.isElement)(offsetParent) ? (0,_floating_ui_utils_dom__WEBPACK_IMPORTED_MODULE_0__.getWindow)(offsetParent) : offsetParent; let currentWin = win; - let currentIFrame = currentWin.frameElement; + let currentIFrame = (0,_floating_ui_utils_dom__WEBPACK_IMPORTED_MODULE_0__.getFrameElement)(currentWin); while (currentIFrame && offsetParent && offsetWin !== currentWin) { const iframeScale = getScale(currentIFrame); const iframeRect = currentIFrame.getBoundingClientRect(); @@ -170410,7 +207388,7 @@ function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetPar x += left; y += top; currentWin = (0,_floating_ui_utils_dom__WEBPACK_IMPORTED_MODULE_0__.getWindow)(currentIFrame); - currentIFrame = currentWin.frameElement; + currentIFrame = (0,_floating_ui_utils_dom__WEBPACK_IMPORTED_MODULE_0__.getFrameElement)(currentWin); } } return (0,_floating_ui_utils__WEBPACK_IMPORTED_MODULE_1__.rectToClientRect)({ @@ -171583,6 +208561,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ getComputedStyle: () => (/* binding */ getComputedStyle), /* harmony export */ getContainingBlock: () => (/* binding */ getContainingBlock), /* harmony export */ getDocumentElement: () => (/* binding */ getDocumentElement), +/* harmony export */ getFrameElement: () => (/* binding */ getFrameElement), /* harmony export */ getNearestOverflowAncestor: () => (/* binding */ getNearestOverflowAncestor), /* harmony export */ getNodeName: () => (/* binding */ getNodeName), /* harmony export */ getNodeScroll: () => (/* binding */ getNodeScroll), @@ -171732,10 +208711,14 @@ function getOverflowAncestors(node, list, traverseIframes) { const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); const win = getWindow(scrollableAncestor); if (isBody) { - return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], win.frameElement && traverseIframes ? getOverflowAncestors(win.frameElement) : []); + const frameElement = getFrameElement(win); + return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); } return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); } +function getFrameElement(win) { + return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; +} @@ -177991,9 +214974,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils.js */ "./node_modules/axios/lib/utils.js"); /* harmony import */ var _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/AxiosError.js */ "./node_modules/axios/lib/core/AxiosError.js"); /* harmony import */ var _helpers_composeSignals_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../helpers/composeSignals.js */ "./node_modules/axios/lib/helpers/composeSignals.js"); -/* harmony import */ var _helpers_trackStream_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../helpers/trackStream.js */ "./node_modules/axios/lib/helpers/trackStream.js"); +/* harmony import */ var _helpers_trackStream_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../helpers/trackStream.js */ "./node_modules/axios/lib/helpers/trackStream.js"); /* harmony import */ var _core_AxiosHeaders_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../core/AxiosHeaders.js */ "./node_modules/axios/lib/core/AxiosHeaders.js"); -/* harmony import */ var _helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../helpers/progressEventReducer.js */ "./node_modules/axios/lib/helpers/progressEventReducer.js"); +/* harmony import */ var _helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../helpers/progressEventReducer.js */ "./node_modules/axios/lib/helpers/progressEventReducer.js"); /* harmony import */ var _helpers_resolveConfig_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../helpers/resolveConfig.js */ "./node_modules/axios/lib/helpers/resolveConfig.js"); /* harmony import */ var _core_settle_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../core/settle.js */ "./node_modules/axios/lib/core/settle.js"); @@ -178006,15 +214989,6 @@ __webpack_require__.r(__webpack_exports__); -const fetchProgressDecorator = (total, fn) => { - const lengthComputable = total != null; - return (loaded) => setTimeout(() => fn({ - lengthComputable, - total, - loaded - })); -} - const isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function'; const isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function'; @@ -178024,7 +214998,15 @@ const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ? async (str) => new Uint8Array(await new Response(str).arrayBuffer()) ); -const supportsRequestStream = isReadableStreamSupported && (() => { +const test = (fn, ...args) => { + try { + return !!fn(...args); + } catch (e) { + return false + } +} + +const supportsRequestStream = isReadableStreamSupported && test(() => { let duplexAccessed = false; const hasContentType = new Request(_platform_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].origin, { @@ -178037,17 +215019,13 @@ const supportsRequestStream = isReadableStreamSupported && (() => { }).headers.has('Content-Type'); return duplexAccessed && !hasContentType; -})(); +}); const DEFAULT_CHUNK_SIZE = 64 * 1024; -const supportsResponseStream = isReadableStreamSupported && !!(()=> { - try { - return _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isReadableStream(new Response('').body); - } catch(err) { - // return undefined - } -})(); +const supportsResponseStream = isReadableStreamSupported && + test(() => _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isReadableStream(new Response('').body)); + const resolvers = { stream: supportsResponseStream && ((res) => res.body) @@ -178075,7 +215053,7 @@ const getBodyLength = async (body) => { return (await new Request(body).arrayBuffer()).byteLength; } - if(_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isArrayBufferView(body)) { + if(_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isArrayBufferView(body) || _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isArrayBuffer(body)) { return body.byteLength; } @@ -178145,17 +215123,22 @@ const resolveBodyLength = async (headers, body) => { } if (_request.body) { - data = (0,_helpers_trackStream_js__WEBPACK_IMPORTED_MODULE_5__.trackStream)(_request.body, DEFAULT_CHUNK_SIZE, fetchProgressDecorator( + const [onProgress, flush] = (0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_5__.progressEventDecorator)( requestContentLength, - (0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__["default"])(onUploadProgress) - ), null, encodeText); + (0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_5__.progressEventReducer)((0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_5__.asyncDecorator)(onUploadProgress)) + ); + + data = (0,_helpers_trackStream_js__WEBPACK_IMPORTED_MODULE_6__.trackStream)(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush, encodeText); } } if (!_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isString(withCredentials)) { - withCredentials = withCredentials ? 'cors' : 'omit'; + withCredentials = withCredentials ? 'include' : 'omit'; } + // Cloudflare Workers throws when credentials are defined + // see https://github.com/cloudflare/workerd/issues/902 + const isCredentialsSupported = "credentials" in Request.prototype; request = new Request(url, { ...fetchOptions, signal: composedSignal, @@ -178163,7 +215146,7 @@ const resolveBodyLength = async (headers, body) => { headers: headers.normalize().toJSON(), body: data, duplex: "half", - withCredentials + credentials: isCredentialsSupported ? withCredentials : undefined }); let response = await fetch(request); @@ -178179,11 +215162,16 @@ const resolveBodyLength = async (headers, body) => { const responseContentLength = _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].toFiniteNumber(response.headers.get('content-length')); + const [onProgress, flush] = onDownloadProgress && (0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_5__.progressEventDecorator)( + responseContentLength, + (0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_5__.progressEventReducer)((0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_5__.asyncDecorator)(onDownloadProgress), true) + ) || []; + response = new Response( - (0,_helpers_trackStream_js__WEBPACK_IMPORTED_MODULE_5__.trackStream)(response.body, DEFAULT_CHUNK_SIZE, onDownloadProgress && fetchProgressDecorator( - responseContentLength, - (0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__["default"])(onDownloadProgress, true) - ), isStreamResponse && onFinish, encodeText), + (0,_helpers_trackStream_js__WEBPACK_IMPORTED_MODULE_6__.trackStream)(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => { + flush && flush(); + isStreamResponse && onFinish(); + }, encodeText), options ); } @@ -178266,16 +215254,18 @@ const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; const _config = (0,_helpers_resolveConfig_js__WEBPACK_IMPORTED_MODULE_0__["default"])(config); let requestData = _config.data; const requestHeaders = _core_AxiosHeaders_js__WEBPACK_IMPORTED_MODULE_1__["default"].from(_config.headers).normalize(); - let {responseType} = _config; + let {responseType, onUploadProgress, onDownloadProgress} = _config; let onCanceled; + let uploadThrottled, downloadThrottled; + let flushUpload, flushDownload; + function done() { - if (_config.cancelToken) { - _config.cancelToken.unsubscribe(onCanceled); - } + flushUpload && flushUpload(); // flush events + flushDownload && flushDownload(); // flush events - if (_config.signal) { - _config.signal.removeEventListener('abort', onCanceled); - } + _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled); + + _config.signal && _config.signal.removeEventListener('abort', onCanceled); } let request = new XMLHttpRequest(); @@ -178345,7 +215335,7 @@ const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; return; } - reject(new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"]('Request aborted', _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"].ECONNABORTED, _config, request)); + reject(new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"]('Request aborted', _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"].ECONNABORTED, config, request)); // Clean up request request = null; @@ -178355,7 +215345,7 @@ const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; request.onerror = function handleError() { // Real errors are hidden from us by the browser // onerror should only fire if it's a network error - reject(new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"]('Network Error', _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"].ERR_NETWORK, _config, request)); + reject(new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"]('Network Error', _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"].ERR_NETWORK, config, request)); // Clean up request request = null; @@ -178371,7 +215361,7 @@ const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; reject(new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"]( timeoutErrorMessage, transitional.clarifyTimeoutError ? _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"].ETIMEDOUT : _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"].ECONNABORTED, - _config, + config, request)); // Clean up request @@ -178399,13 +215389,18 @@ const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; } // Handle progress if needed - if (typeof _config.onDownloadProgress === 'function') { - request.addEventListener('progress', (0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_config.onDownloadProgress, true)); + if (onDownloadProgress) { + ([downloadThrottled, flushDownload] = (0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__.progressEventReducer)(onDownloadProgress, true)); + request.addEventListener('progress', downloadThrottled); } // Not all browsers support upload events - if (typeof _config.onUploadProgress === 'function' && request.upload) { - request.upload.addEventListener('progress', (0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_config.onUploadProgress)); + if (onUploadProgress && request.upload) { + ([uploadThrottled, flushUpload] = (0,_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__.progressEventReducer)(onUploadProgress)); + + request.upload.addEventListener('progress', uploadThrottled); + + request.upload.addEventListener('loadend', flushUpload); } if (_config.cancelToken || _config.signal) { @@ -179054,7 +216049,10 @@ function AxiosError(message, code, config, request, response) { code && (this.code = code); config && (this.config = config); request && (this.request = request); - response && (this.response = response); + if (response) { + this.response = response; + this.status = response.status ? response.status : null; + } } _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].inherits(AxiosError, Error, { @@ -179074,7 +216072,7 @@ _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].inherits(AxiosError, Error, { // Axios config: _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toJSONObject(this.config), code: this.code, - status: this.response && this.response.status ? this.response.status : null + status: this.status }; } }); @@ -180103,7 +217101,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ VERSION: () => (/* binding */ VERSION) /* harmony export */ }); -const VERSION = "1.7.2"; +const VERSION = "1.7.5"; /***/ }), @@ -180715,7 +217713,7 @@ __webpack_require__.r(__webpack_exports__); // Standard browser envs have full support of the APIs needed to test // whether the request URL is of the same origin as current location. (function standardBrowserEnv() { - const msie = /(msie|trident)/i.test(navigator.userAgent); + const msie = _platform_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].navigator && /(msie|trident)/i.test(_platform_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].navigator.userAgent); const urlParsingNode = document.createElement('a'); let originURL; @@ -180894,14 +217892,18 @@ function parseProtocol(url) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ asyncDecorator: () => (/* binding */ asyncDecorator), +/* harmony export */ progressEventDecorator: () => (/* binding */ progressEventDecorator), +/* harmony export */ progressEventReducer: () => (/* binding */ progressEventReducer) /* harmony export */ }); /* harmony import */ var _speedometer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./speedometer.js */ "./node_modules/axios/lib/helpers/speedometer.js"); /* harmony import */ var _throttle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./throttle.js */ "./node_modules/axios/lib/helpers/throttle.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils.js */ "./node_modules/axios/lib/utils.js"); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((listener, isDownloadStream, freq = 3) => { + +const progressEventReducer = (listener, isDownloadStream, freq = 3) => { let bytesNotified = 0; const _speedometer = (0,_speedometer_js__WEBPACK_IMPORTED_MODULE_0__["default"])(50, 250); @@ -180922,14 +217924,25 @@ __webpack_require__.r(__webpack_exports__); rate: rate ? rate : undefined, estimated: rate && total && inRange ? (total - loaded) / rate : undefined, event: e, - lengthComputable: total != null + lengthComputable: total != null, + [isDownloadStream ? 'download' : 'upload']: true }; - data[isDownloadStream ? 'download' : 'upload'] = true; - listener(data); }, freq); -}); +} + +const progressEventDecorator = (total, throttled) => { + const lengthComputable = total != null; + + return [(loaded) => throttled[0]({ + lengthComputable, + total, + loaded + }), throttled[1]]; +} + +const asyncDecorator = (fn) => (...args) => _utils_js__WEBPACK_IMPORTED_MODULE_2__["default"].asap(() => fn(...args)); /***/ }), @@ -181138,8 +218151,6 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); - - /** * Throttle decorator * @param {Function} fn @@ -181148,28 +218159,39 @@ __webpack_require__.r(__webpack_exports__); */ function throttle(fn, freq) { let timestamp = 0; - const threshold = 1000 / freq; - let timer = null; - return function throttled() { - const force = this === true; + let threshold = 1000 / freq; + let lastArgs; + let timer; + + const invoke = (args, now = Date.now()) => { + timestamp = now; + lastArgs = null; + if (timer) { + clearTimeout(timer); + timer = null; + } + fn.apply(null, args); + } + const throttled = (...args) => { const now = Date.now(); - if (force || now - timestamp > threshold) { - if (timer) { - clearTimeout(timer); - timer = null; + const passed = now - timestamp; + if ( passed >= threshold) { + invoke(args, now); + } else { + lastArgs = args; + if (!timer) { + timer = setTimeout(() => { + timer = null; + invoke(lastArgs) + }, threshold - passed); } - timestamp = now; - return fn.apply(null, arguments); } - if (!timer) { - timer = setTimeout(() => { - timer = null; - timestamp = Date.now(); - return fn.apply(null, arguments); - }, threshold - (now - timestamp)); - } - }; + } + + const flush = () => lastArgs && invoke(lastArgs); + + return [throttled, flush]; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (throttle); @@ -181464,7 +218486,6 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ trackStream: () => (/* binding */ trackStream) /* harmony export */ }); - const streamChunk = function* (chunk, chunkSize) { let len = chunk.byteLength; @@ -181493,25 +218514,38 @@ const trackStream = (stream, chunkSize, onProgress, onFinish, encode) => { const iterator = readBytes(stream, chunkSize, encode); let bytes = 0; + let done; + let _onFinish = (e) => { + if (!done) { + done = true; + onFinish && onFinish(e); + } + } return new ReadableStream({ - type: 'bytes', - async pull(controller) { - const {done, value} = await iterator.next(); + try { + const {done, value} = await iterator.next(); - if (done) { - controller.close(); - onFinish(); - return; - } + if (done) { + _onFinish(); + controller.close(); + return; + } - let len = value.byteLength; - onProgress && onProgress(bytes += len); - controller.enqueue(new Uint8Array(value)); + let len = value.byteLength; + if (onProgress) { + let loadedBytes = bytes += len; + onProgress(loadedBytes); + } + controller.enqueue(new Uint8Array(value)); + } catch (err) { + _onFinish(err); + throw err; + } }, cancel(reason) { - onFinish(reason); + _onFinish(reason); return iterator.return(); } }, { @@ -181729,10 +218763,13 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ hasBrowserEnv: () => (/* binding */ hasBrowserEnv), /* harmony export */ hasStandardBrowserEnv: () => (/* binding */ hasStandardBrowserEnv), /* harmony export */ hasStandardBrowserWebWorkerEnv: () => (/* binding */ hasStandardBrowserWebWorkerEnv), +/* harmony export */ navigator: () => (/* binding */ _navigator), /* harmony export */ origin: () => (/* binding */ origin) /* harmony export */ }); const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined'; +const _navigator = typeof navigator === 'object' && navigator || undefined; + /** * Determine if we're running in a standard browser environment * @@ -181750,10 +218787,8 @@ const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'unde * * @returns {boolean} */ -const hasStandardBrowserEnv = ( - (product) => { - return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0 - })(typeof navigator !== 'undefined' && navigator.product); +const hasStandardBrowserEnv = hasBrowserEnv && + (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0); /** * Determine if we're running in a standard browser webWorker environment @@ -182487,6 +219522,36 @@ const isAsyncFn = kindOfTest('AsyncFunction'); const isThenable = (thing) => thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch); +// original code +// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34 + +const _setImmediate = ((setImmediateSupported, postMessageSupported) => { + if (setImmediateSupported) { + return setImmediate; + } + + return postMessageSupported ? ((token, callbacks) => { + _global.addEventListener("message", ({source, data}) => { + if (source === _global && data === token) { + callbacks.length && callbacks.shift()(); + } + }, false); + + return (cb) => { + callbacks.push(cb); + _global.postMessage(token, "*"); + } + })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb); +})( + typeof setImmediate === 'function', + isFunction(_global.postMessage) +); + +const asap = typeof queueMicrotask !== 'undefined' ? + queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate); + +// ********************* + /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ isArray, isArrayBuffer, @@ -182542,7 +219607,9 @@ const isThenable = (thing) => isSpecCompliantForm, toJSONObject, isAsyncFn, - isThenable + isThenable, + setImmediate: _setImmediate, + asap }); @@ -184277,6 +221344,2802 @@ function matchesType(targetType, draggedItemType) { //# sourceMappingURL=matchesType.js.map +/***/ }), + +/***/ "./node_modules/i18next-browser-languagedetector/dist/esm/i18nextBrowserLanguageDetector.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/i18next-browser-languagedetector/dist/esm/i18nextBrowserLanguageDetector.js ***! + \**************************************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ Browser) +/* harmony export */ }); +const { + slice, + forEach +} = []; +function defaults(obj) { + forEach.call(slice.call(arguments, 1), source => { + if (source) { + for (const prop in source) { + if (obj[prop] === undefined) obj[prop] = source[prop]; + } + } + }); + return obj; +} + +// eslint-disable-next-line no-control-regex +const fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/; +const serializeCookie = (name, val, options) => { + const opt = options || {}; + opt.path = opt.path || '/'; + const value = encodeURIComponent(val); + let str = `${name}=${value}`; + if (opt.maxAge > 0) { + const maxAge = opt.maxAge - 0; + if (Number.isNaN(maxAge)) throw new Error('maxAge should be a Number'); + str += `; Max-Age=${Math.floor(maxAge)}`; + } + if (opt.domain) { + if (!fieldContentRegExp.test(opt.domain)) { + throw new TypeError('option domain is invalid'); + } + str += `; Domain=${opt.domain}`; + } + if (opt.path) { + if (!fieldContentRegExp.test(opt.path)) { + throw new TypeError('option path is invalid'); + } + str += `; Path=${opt.path}`; + } + if (opt.expires) { + if (typeof opt.expires.toUTCString !== 'function') { + throw new TypeError('option expires is invalid'); + } + str += `; Expires=${opt.expires.toUTCString()}`; + } + if (opt.httpOnly) str += '; HttpOnly'; + if (opt.secure) str += '; Secure'; + if (opt.sameSite) { + const sameSite = typeof opt.sameSite === 'string' ? opt.sameSite.toLowerCase() : opt.sameSite; + switch (sameSite) { + case true: + str += '; SameSite=Strict'; + break; + case 'lax': + str += '; SameSite=Lax'; + break; + case 'strict': + str += '; SameSite=Strict'; + break; + case 'none': + str += '; SameSite=None'; + break; + default: + throw new TypeError('option sameSite is invalid'); + } + } + return str; +}; +const cookie = { + create(name, value, minutes, domain) { + let cookieOptions = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : { + path: '/', + sameSite: 'strict' + }; + if (minutes) { + cookieOptions.expires = new Date(); + cookieOptions.expires.setTime(cookieOptions.expires.getTime() + minutes * 60 * 1000); + } + if (domain) cookieOptions.domain = domain; + document.cookie = serializeCookie(name, encodeURIComponent(value), cookieOptions); + }, + read(name) { + const nameEQ = `${name}=`; + const ca = document.cookie.split(';'); + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) === ' ') c = c.substring(1, c.length); + if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length); + } + return null; + }, + remove(name) { + this.create(name, '', -1); + } +}; +var cookie$1 = { + name: 'cookie', + // Deconstruct the options object and extract the lookupCookie property + lookup(_ref) { + let { + lookupCookie + } = _ref; + if (lookupCookie && typeof document !== 'undefined') { + return cookie.read(lookupCookie) || undefined; + } + return undefined; + }, + // Deconstruct the options object and extract the lookupCookie, cookieMinutes, cookieDomain, and cookieOptions properties + cacheUserLanguage(lng, _ref2) { + let { + lookupCookie, + cookieMinutes, + cookieDomain, + cookieOptions + } = _ref2; + if (lookupCookie && typeof document !== 'undefined') { + cookie.create(lookupCookie, lng, cookieMinutes, cookieDomain, cookieOptions); + } + } +}; + +var querystring = { + name: 'querystring', + // Deconstruct the options object and extract the lookupQuerystring property + lookup(_ref) { + let { + lookupQuerystring + } = _ref; + let found; + if (typeof window !== 'undefined') { + let { + search + } = window.location; + if (!window.location.search && window.location.hash?.indexOf('?') > -1) { + search = window.location.hash.substring(window.location.hash.indexOf('?')); + } + const query = search.substring(1); + const params = query.split('&'); + for (let i = 0; i < params.length; i++) { + const pos = params[i].indexOf('='); + if (pos > 0) { + const key = params[i].substring(0, pos); + if (key === lookupQuerystring) { + found = params[i].substring(pos + 1); + } + } + } + } + return found; + } +}; + +let hasLocalStorageSupport = null; +const localStorageAvailable = () => { + if (hasLocalStorageSupport !== null) return hasLocalStorageSupport; + try { + hasLocalStorageSupport = window !== 'undefined' && window.localStorage !== null; + const testKey = 'i18next.translate.boo'; + window.localStorage.setItem(testKey, 'foo'); + window.localStorage.removeItem(testKey); + } catch (e) { + hasLocalStorageSupport = false; + } + return hasLocalStorageSupport; +}; +var localStorage = { + name: 'localStorage', + // Deconstruct the options object and extract the lookupLocalStorage property + lookup(_ref) { + let { + lookupLocalStorage + } = _ref; + if (lookupLocalStorage && localStorageAvailable()) { + return window.localStorage.getItem(lookupLocalStorage) || undefined; // Undefined ensures type consistency with the previous version of this function + } + + return undefined; + }, + // Deconstruct the options object and extract the lookupLocalStorage property + cacheUserLanguage(lng, _ref2) { + let { + lookupLocalStorage + } = _ref2; + if (lookupLocalStorage && localStorageAvailable()) { + window.localStorage.setItem(lookupLocalStorage, lng); + } + } +}; + +let hasSessionStorageSupport = null; +const sessionStorageAvailable = () => { + if (hasSessionStorageSupport !== null) return hasSessionStorageSupport; + try { + hasSessionStorageSupport = window !== 'undefined' && window.sessionStorage !== null; + const testKey = 'i18next.translate.boo'; + window.sessionStorage.setItem(testKey, 'foo'); + window.sessionStorage.removeItem(testKey); + } catch (e) { + hasSessionStorageSupport = false; + } + return hasSessionStorageSupport; +}; +var sessionStorage = { + name: 'sessionStorage', + lookup(_ref) { + let { + lookupSessionStorage + } = _ref; + if (lookupSessionStorage && sessionStorageAvailable()) { + return window.sessionStorage.getItem(lookupSessionStorage) || undefined; + } + return undefined; + }, + cacheUserLanguage(lng, _ref2) { + let { + lookupSessionStorage + } = _ref2; + if (lookupSessionStorage && sessionStorageAvailable()) { + window.sessionStorage.setItem(lookupSessionStorage, lng); + } + } +}; + +var navigator$1 = { + name: 'navigator', + lookup(options) { + const found = []; + if (typeof navigator !== 'undefined') { + const { + languages, + userLanguage, + language + } = navigator; + if (languages) { + // chrome only; not an array, so can't use .push.apply instead of iterating + for (let i = 0; i < languages.length; i++) { + found.push(languages[i]); + } + } + if (userLanguage) { + found.push(userLanguage); + } + if (language) { + found.push(language); + } + } + return found.length > 0 ? found : undefined; + } +}; + +var htmlTag = { + name: 'htmlTag', + // Deconstruct the options object and extract the htmlTag property + lookup(_ref) { + let { + htmlTag + } = _ref; + let found; + const internalHtmlTag = htmlTag || (typeof document !== 'undefined' ? document.documentElement : null); + if (internalHtmlTag && typeof internalHtmlTag.getAttribute === 'function') { + found = internalHtmlTag.getAttribute('lang'); + } + return found; + } +}; + +var path = { + name: 'path', + // Deconstruct the options object and extract the lookupFromPathIndex property + lookup(_ref) { + let { + lookupFromPathIndex + } = _ref; + if (typeof window === 'undefined') return undefined; + const language = window.location.pathname.match(/\/([a-zA-Z-]*)/g); + if (!Array.isArray(language)) return undefined; + const index = typeof lookupFromPathIndex === 'number' ? lookupFromPathIndex : 0; + return language[index]?.replace('/', ''); + } +}; + +var subdomain = { + name: 'subdomain', + lookup(_ref) { + let { + lookupFromSubdomainIndex + } = _ref; + // If given get the subdomain index else 1 + const internalLookupFromSubdomainIndex = typeof lookupFromSubdomainIndex === 'number' ? lookupFromSubdomainIndex + 1 : 1; + // get all matches if window.location. is existing + // first item of match is the match itself and the second is the first group match which should be the first subdomain match + // is the hostname no public domain get the or option of localhost + const language = typeof window !== 'undefined' && window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i); + + // if there is no match (null) return undefined + if (!language) return undefined; + // return the given group match + return language[internalLookupFromSubdomainIndex]; + } +}; + +function getDefaults() { + return { + order: ['querystring', 'cookie', 'localStorage', 'sessionStorage', 'navigator', 'htmlTag'], + lookupQuerystring: 'lng', + lookupCookie: 'i18next', + lookupLocalStorage: 'i18nextLng', + lookupSessionStorage: 'i18nextLng', + // cache user language + caches: ['localStorage'], + excludeCacheFor: ['cimode'], + // cookieMinutes: 10, + // cookieDomain: 'myDomain' + + convertDetectedLanguage: l => l + }; +} +class Browser { + constructor(services) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.type = 'languageDetector'; + this.detectors = {}; + this.init(services, options); + } + init(services) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let i18nOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + this.services = services || { + languageUtils: {} + }; // this way the language detector can be used without i18next + this.options = defaults(options, this.options || {}, getDefaults()); + if (typeof this.options.convertDetectedLanguage === 'string' && this.options.convertDetectedLanguage.indexOf('15897') > -1) { + this.options.convertDetectedLanguage = l => l.replace('-', '_'); + } + + // backwards compatibility + if (this.options.lookupFromUrlIndex) this.options.lookupFromPathIndex = this.options.lookupFromUrlIndex; + this.i18nOptions = i18nOptions; + this.addDetector(cookie$1); + this.addDetector(querystring); + this.addDetector(localStorage); + this.addDetector(sessionStorage); + this.addDetector(navigator$1); + this.addDetector(htmlTag); + this.addDetector(path); + this.addDetector(subdomain); + } + addDetector(detector) { + this.detectors[detector.name] = detector; + return this; + } + detect(detectionOrder) { + if (!detectionOrder) detectionOrder = this.options.order; + let detected = []; + detectionOrder.forEach(detectorName => { + if (this.detectors[detectorName]) { + let lookup = this.detectors[detectorName].lookup(this.options); + if (lookup && typeof lookup === 'string') lookup = [lookup]; + if (lookup) detected = detected.concat(lookup); + } + }); + detected = detected.map(d => this.options.convertDetectedLanguage(d)); + if (this.services.languageUtils.getBestMatchFromCodes) return detected; // new i18next v19.5.0 + return detected.length > 0 ? detected[0] : null; // a little backward compatibility + } + + cacheUserLanguage(lng, caches) { + if (!caches) caches = this.options.caches; + if (!caches) return; + if (this.options.excludeCacheFor && this.options.excludeCacheFor.indexOf(lng) > -1) return; + caches.forEach(cacheName => { + if (this.detectors[cacheName]) this.detectors[cacheName].cacheUserLanguage(lng, this.options); + }); + } +} +Browser.type = 'languageDetector'; + + + + +/***/ }), + +/***/ "./node_modules/i18next/dist/esm/i18next.js": +/*!**************************************************!*\ + !*** ./node_modules/i18next/dist/esm/i18next.js ***! + \**************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ changeLanguage: () => (/* binding */ changeLanguage), +/* harmony export */ createInstance: () => (/* binding */ createInstance), +/* harmony export */ "default": () => (/* binding */ instance), +/* harmony export */ dir: () => (/* binding */ dir), +/* harmony export */ exists: () => (/* binding */ exists), +/* harmony export */ getFixedT: () => (/* binding */ getFixedT), +/* harmony export */ hasLoadedNamespace: () => (/* binding */ hasLoadedNamespace), +/* harmony export */ init: () => (/* binding */ init), +/* harmony export */ loadLanguages: () => (/* binding */ loadLanguages), +/* harmony export */ loadNamespaces: () => (/* binding */ loadNamespaces), +/* harmony export */ loadResources: () => (/* binding */ loadResources), +/* harmony export */ reloadResources: () => (/* binding */ reloadResources), +/* harmony export */ setDefaultNamespace: () => (/* binding */ setDefaultNamespace), +/* harmony export */ t: () => (/* binding */ t), +/* harmony export */ use: () => (/* binding */ use) +/* harmony export */ }); +const consoleLogger = { + type: 'logger', + log(args) { + this.output('log', args); + }, + warn(args) { + this.output('warn', args); + }, + error(args) { + this.output('error', args); + }, + output(type, args) { + if (console && console[type]) console[type].apply(console, args); + } +}; +class Logger { + constructor(concreteLogger) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.init(concreteLogger, options); + } + init(concreteLogger) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.prefix = options.prefix || 'i18next:'; + this.logger = concreteLogger || consoleLogger; + this.options = options; + this.debug = options.debug; + } + log() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return this.forward(args, 'log', '', true); + } + warn() { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + return this.forward(args, 'warn', '', true); + } + error() { + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + return this.forward(args, 'error', ''); + } + deprecate() { + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + return this.forward(args, 'warn', 'WARNING DEPRECATED: ', true); + } + forward(args, lvl, prefix, debugOnly) { + if (debugOnly && !this.debug) return null; + if (typeof args[0] === 'string') args[0] = `${prefix}${this.prefix} ${args[0]}`; + return this.logger[lvl](args); + } + create(moduleName) { + return new Logger(this.logger, { + ...{ + prefix: `${this.prefix}:${moduleName}:` + }, + ...this.options + }); + } + clone(options) { + options = options || this.options; + options.prefix = options.prefix || this.prefix; + return new Logger(this.logger, options); + } +} +var baseLogger = new Logger(); + +class EventEmitter { + constructor() { + this.observers = {}; + } + on(events, listener) { + events.split(' ').forEach(event => { + if (!this.observers[event]) this.observers[event] = new Map(); + const numListeners = this.observers[event].get(listener) || 0; + this.observers[event].set(listener, numListeners + 1); + }); + return this; + } + off(event, listener) { + if (!this.observers[event]) return; + if (!listener) { + delete this.observers[event]; + return; + } + this.observers[event].delete(listener); + } + emit(event) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + if (this.observers[event]) { + const cloned = Array.from(this.observers[event].entries()); + cloned.forEach(_ref => { + let [observer, numTimesAdded] = _ref; + for (let i = 0; i < numTimesAdded; i++) { + observer(...args); + } + }); + } + if (this.observers['*']) { + const cloned = Array.from(this.observers['*'].entries()); + cloned.forEach(_ref2 => { + let [observer, numTimesAdded] = _ref2; + for (let i = 0; i < numTimesAdded; i++) { + observer.apply(observer, [event, ...args]); + } + }); + } + } +} + +const defer = () => { + let res; + let rej; + const promise = new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); + promise.resolve = res; + promise.reject = rej; + return promise; +}; +const makeString = object => { + if (object == null) return ''; + return '' + object; +}; +const copy = (a, s, t) => { + a.forEach(m => { + if (s[m]) t[m] = s[m]; + }); +}; +const lastOfPathSeparatorRegExp = /###/g; +const cleanKey = key => key && key.indexOf('###') > -1 ? key.replace(lastOfPathSeparatorRegExp, '.') : key; +const canNotTraverseDeeper = object => !object || typeof object === 'string'; +const getLastOfPath = (object, path, Empty) => { + const stack = typeof path !== 'string' ? path : path.split('.'); + let stackIndex = 0; + while (stackIndex < stack.length - 1) { + if (canNotTraverseDeeper(object)) return {}; + const key = cleanKey(stack[stackIndex]); + if (!object[key] && Empty) object[key] = new Empty(); + if (Object.prototype.hasOwnProperty.call(object, key)) { + object = object[key]; + } else { + object = {}; + } + ++stackIndex; + } + if (canNotTraverseDeeper(object)) return {}; + return { + obj: object, + k: cleanKey(stack[stackIndex]) + }; +}; +const setPath = (object, path, newValue) => { + const { + obj, + k + } = getLastOfPath(object, path, Object); + if (obj !== undefined || path.length === 1) { + obj[k] = newValue; + return; + } + let e = path[path.length - 1]; + let p = path.slice(0, path.length - 1); + let last = getLastOfPath(object, p, Object); + while (last.obj === undefined && p.length) { + e = `${p[p.length - 1]}.${e}`; + p = p.slice(0, p.length - 1); + last = getLastOfPath(object, p, Object); + if (last && last.obj && typeof last.obj[`${last.k}.${e}`] !== 'undefined') { + last.obj = undefined; + } + } + last.obj[`${last.k}.${e}`] = newValue; +}; +const pushPath = (object, path, newValue, concat) => { + const { + obj, + k + } = getLastOfPath(object, path, Object); + obj[k] = obj[k] || []; + obj[k].push(newValue); +}; +const getPath = (object, path) => { + const { + obj, + k + } = getLastOfPath(object, path); + if (!obj) return undefined; + return obj[k]; +}; +const getPathWithDefaults = (data, defaultData, key) => { + const value = getPath(data, key); + if (value !== undefined) { + return value; + } + return getPath(defaultData, key); +}; +const deepExtend = (target, source, overwrite) => { + for (const prop in source) { + if (prop !== '__proto__' && prop !== 'constructor') { + if (prop in target) { + if (typeof target[prop] === 'string' || target[prop] instanceof String || typeof source[prop] === 'string' || source[prop] instanceof String) { + if (overwrite) target[prop] = source[prop]; + } else { + deepExtend(target[prop], source[prop], overwrite); + } + } else { + target[prop] = source[prop]; + } + } + } + return target; +}; +const regexEscape = str => str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); +var _entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/' +}; +const escape = data => { + if (typeof data === 'string') { + return data.replace(/[&<>"'\/]/g, s => _entityMap[s]); + } + return data; +}; +class RegExpCache { + constructor(capacity) { + this.capacity = capacity; + this.regExpMap = new Map(); + this.regExpQueue = []; + } + getRegExp(pattern) { + const regExpFromCache = this.regExpMap.get(pattern); + if (regExpFromCache !== undefined) { + return regExpFromCache; + } + const regExpNew = new RegExp(pattern); + if (this.regExpQueue.length === this.capacity) { + this.regExpMap.delete(this.regExpQueue.shift()); + } + this.regExpMap.set(pattern, regExpNew); + this.regExpQueue.push(pattern); + return regExpNew; + } +} +const chars = [' ', ',', '?', '!', ';']; +const looksLikeObjectPathRegExpCache = new RegExpCache(20); +const looksLikeObjectPath = (key, nsSeparator, keySeparator) => { + nsSeparator = nsSeparator || ''; + keySeparator = keySeparator || ''; + const possibleChars = chars.filter(c => nsSeparator.indexOf(c) < 0 && keySeparator.indexOf(c) < 0); + if (possibleChars.length === 0) return true; + const r = looksLikeObjectPathRegExpCache.getRegExp(`(${possibleChars.map(c => c === '?' ? '\\?' : c).join('|')})`); + let matched = !r.test(key); + if (!matched) { + const ki = key.indexOf(keySeparator); + if (ki > 0 && !r.test(key.substring(0, ki))) { + matched = true; + } + } + return matched; +}; +const deepFind = function (obj, path) { + let keySeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '.'; + if (!obj) return undefined; + if (obj[path]) return obj[path]; + const tokens = path.split(keySeparator); + let current = obj; + for (let i = 0; i < tokens.length;) { + if (!current || typeof current !== 'object') { + return undefined; + } + let next; + let nextPath = ''; + for (let j = i; j < tokens.length; ++j) { + if (j !== i) { + nextPath += keySeparator; + } + nextPath += tokens[j]; + next = current[nextPath]; + if (next !== undefined) { + if (['string', 'number', 'boolean'].indexOf(typeof next) > -1 && j < tokens.length - 1) { + continue; + } + i += j - i + 1; + break; + } + } + current = next; + } + return current; +}; +const getCleanedCode = code => { + if (code && code.indexOf('_') > 0) return code.replace('_', '-'); + return code; +}; + +class ResourceStore extends EventEmitter { + constructor(data) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + ns: ['translation'], + defaultNS: 'translation' + }; + super(); + this.data = data || {}; + this.options = options; + if (this.options.keySeparator === undefined) { + this.options.keySeparator = '.'; + } + if (this.options.ignoreJSONStructure === undefined) { + this.options.ignoreJSONStructure = true; + } + } + addNamespaces(ns) { + if (this.options.ns.indexOf(ns) < 0) { + this.options.ns.push(ns); + } + } + removeNamespaces(ns) { + const index = this.options.ns.indexOf(ns); + if (index > -1) { + this.options.ns.splice(index, 1); + } + } + getResource(lng, ns, key) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator; + const ignoreJSONStructure = options.ignoreJSONStructure !== undefined ? options.ignoreJSONStructure : this.options.ignoreJSONStructure; + let path; + if (lng.indexOf('.') > -1) { + path = lng.split('.'); + } else { + path = [lng, ns]; + if (key) { + if (Array.isArray(key)) { + path.push(...key); + } else if (typeof key === 'string' && keySeparator) { + path.push(...key.split(keySeparator)); + } else { + path.push(key); + } + } + } + const result = getPath(this.data, path); + if (!result && !ns && !key && lng.indexOf('.') > -1) { + lng = path[0]; + ns = path[1]; + key = path.slice(2).join('.'); + } + if (result || !ignoreJSONStructure || typeof key !== 'string') return result; + return deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator); + } + addResource(lng, ns, key, value) { + let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : { + silent: false + }; + const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator; + let path = [lng, ns]; + if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key); + if (lng.indexOf('.') > -1) { + path = lng.split('.'); + value = ns; + ns = path[1]; + } + this.addNamespaces(ns); + setPath(this.data, path, value); + if (!options.silent) this.emit('added', lng, ns, key, value); + } + addResources(lng, ns, resources) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { + silent: false + }; + for (const m in resources) { + if (typeof resources[m] === 'string' || Array.isArray(resources[m])) this.addResource(lng, ns, m, resources[m], { + silent: true + }); + } + if (!options.silent) this.emit('added', lng, ns, resources); + } + addResourceBundle(lng, ns, resources, deep, overwrite) { + let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : { + silent: false, + skipCopy: false + }; + let path = [lng, ns]; + if (lng.indexOf('.') > -1) { + path = lng.split('.'); + deep = resources; + resources = ns; + ns = path[1]; + } + this.addNamespaces(ns); + let pack = getPath(this.data, path) || {}; + if (!options.skipCopy) resources = JSON.parse(JSON.stringify(resources)); + if (deep) { + deepExtend(pack, resources, overwrite); + } else { + pack = { + ...pack, + ...resources + }; + } + setPath(this.data, path, pack); + if (!options.silent) this.emit('added', lng, ns, resources); + } + removeResourceBundle(lng, ns) { + if (this.hasResourceBundle(lng, ns)) { + delete this.data[lng][ns]; + } + this.removeNamespaces(ns); + this.emit('removed', lng, ns); + } + hasResourceBundle(lng, ns) { + return this.getResource(lng, ns) !== undefined; + } + getResourceBundle(lng, ns) { + if (!ns) ns = this.options.defaultNS; + if (this.options.compatibilityAPI === 'v1') return { + ...{}, + ...this.getResource(lng, ns) + }; + return this.getResource(lng, ns); + } + getDataByLanguage(lng) { + return this.data[lng]; + } + hasLanguageSomeTranslations(lng) { + const data = this.getDataByLanguage(lng); + const n = data && Object.keys(data) || []; + return !!n.find(v => data[v] && Object.keys(data[v]).length > 0); + } + toJSON() { + return this.data; + } +} + +var postProcessor = { + processors: {}, + addPostProcessor(module) { + this.processors[module.name] = module; + }, + handle(processors, value, key, options, translator) { + processors.forEach(processor => { + if (this.processors[processor]) value = this.processors[processor].process(value, key, options, translator); + }); + return value; + } +}; + +const checkedLoadedFor = {}; +class Translator extends EventEmitter { + constructor(services) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + super(); + copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector', 'i18nFormat', 'utils'], services, this); + this.options = options; + if (this.options.keySeparator === undefined) { + this.options.keySeparator = '.'; + } + this.logger = baseLogger.create('translator'); + } + changeLanguage(lng) { + if (lng) this.language = lng; + } + exists(key) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + interpolation: {} + }; + if (key === undefined || key === null) { + return false; + } + const resolved = this.resolve(key, options); + return resolved && resolved.res !== undefined; + } + extractFromKey(key, options) { + let nsSeparator = options.nsSeparator !== undefined ? options.nsSeparator : this.options.nsSeparator; + if (nsSeparator === undefined) nsSeparator = ':'; + const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator; + let namespaces = options.ns || this.options.defaultNS || []; + const wouldCheckForNsInKey = nsSeparator && key.indexOf(nsSeparator) > -1; + const seemsNaturalLanguage = !this.options.userDefinedKeySeparator && !options.keySeparator && !this.options.userDefinedNsSeparator && !options.nsSeparator && !looksLikeObjectPath(key, nsSeparator, keySeparator); + if (wouldCheckForNsInKey && !seemsNaturalLanguage) { + const m = key.match(this.interpolator.nestingRegexp); + if (m && m.length > 0) { + return { + key, + namespaces + }; + } + const parts = key.split(nsSeparator); + if (nsSeparator !== keySeparator || nsSeparator === keySeparator && this.options.ns.indexOf(parts[0]) > -1) namespaces = parts.shift(); + key = parts.join(keySeparator); + } + if (typeof namespaces === 'string') namespaces = [namespaces]; + return { + key, + namespaces + }; + } + translate(keys, options, lastKey) { + if (typeof options !== 'object' && this.options.overloadTranslationOptionHandler) { + options = this.options.overloadTranslationOptionHandler(arguments); + } + if (typeof options === 'object') options = { + ...options + }; + if (!options) options = {}; + if (keys === undefined || keys === null) return ''; + if (!Array.isArray(keys)) keys = [String(keys)]; + const returnDetails = options.returnDetails !== undefined ? options.returnDetails : this.options.returnDetails; + const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator; + const { + key, + namespaces + } = this.extractFromKey(keys[keys.length - 1], options); + const namespace = namespaces[namespaces.length - 1]; + const lng = options.lng || this.language; + const appendNamespaceToCIMode = options.appendNamespaceToCIMode || this.options.appendNamespaceToCIMode; + if (lng && lng.toLowerCase() === 'cimode') { + if (appendNamespaceToCIMode) { + const nsSeparator = options.nsSeparator || this.options.nsSeparator; + if (returnDetails) { + return { + res: `${namespace}${nsSeparator}${key}`, + usedKey: key, + exactUsedKey: key, + usedLng: lng, + usedNS: namespace, + usedParams: this.getUsedParamsDetails(options) + }; + } + return `${namespace}${nsSeparator}${key}`; + } + if (returnDetails) { + return { + res: key, + usedKey: key, + exactUsedKey: key, + usedLng: lng, + usedNS: namespace, + usedParams: this.getUsedParamsDetails(options) + }; + } + return key; + } + const resolved = this.resolve(keys, options); + let res = resolved && resolved.res; + const resUsedKey = resolved && resolved.usedKey || key; + const resExactUsedKey = resolved && resolved.exactUsedKey || key; + const resType = Object.prototype.toString.apply(res); + const noObject = ['[object Number]', '[object Function]', '[object RegExp]']; + const joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays; + const handleAsObjectInI18nFormat = !this.i18nFormat || this.i18nFormat.handleAsObject; + const handleAsObject = typeof res !== 'string' && typeof res !== 'boolean' && typeof res !== 'number'; + if (handleAsObjectInI18nFormat && res && handleAsObject && noObject.indexOf(resType) < 0 && !(typeof joinArrays === 'string' && Array.isArray(res))) { + if (!options.returnObjects && !this.options.returnObjects) { + if (!this.options.returnedObjectHandler) { + this.logger.warn('accessing an object - but returnObjects options is not enabled!'); + } + const r = this.options.returnedObjectHandler ? this.options.returnedObjectHandler(resUsedKey, res, { + ...options, + ns: namespaces + }) : `key '${key} (${this.language})' returned an object instead of string.`; + if (returnDetails) { + resolved.res = r; + resolved.usedParams = this.getUsedParamsDetails(options); + return resolved; + } + return r; + } + if (keySeparator) { + const resTypeIsArray = Array.isArray(res); + const copy = resTypeIsArray ? [] : {}; + const newKeyToUse = resTypeIsArray ? resExactUsedKey : resUsedKey; + for (const m in res) { + if (Object.prototype.hasOwnProperty.call(res, m)) { + const deepKey = `${newKeyToUse}${keySeparator}${m}`; + copy[m] = this.translate(deepKey, { + ...options, + ...{ + joinArrays: false, + ns: namespaces + } + }); + if (copy[m] === deepKey) copy[m] = res[m]; + } + } + res = copy; + } + } else if (handleAsObjectInI18nFormat && typeof joinArrays === 'string' && Array.isArray(res)) { + res = res.join(joinArrays); + if (res) res = this.extendTranslation(res, keys, options, lastKey); + } else { + let usedDefault = false; + let usedKey = false; + const needsPluralHandling = options.count !== undefined && typeof options.count !== 'string'; + const hasDefaultValue = Translator.hasDefaultValue(options); + const defaultValueSuffix = needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, options) : ''; + const defaultValueSuffixOrdinalFallback = options.ordinal && needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, { + ordinal: false + }) : ''; + const needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && this.pluralResolver.shouldUseIntlApi(); + const defaultValue = needsZeroSuffixLookup && options[`defaultValue${this.options.pluralSeparator}zero`] || options[`defaultValue${defaultValueSuffix}`] || options[`defaultValue${defaultValueSuffixOrdinalFallback}`] || options.defaultValue; + if (!this.isValidLookup(res) && hasDefaultValue) { + usedDefault = true; + res = defaultValue; + } + if (!this.isValidLookup(res)) { + usedKey = true; + res = key; + } + const missingKeyNoValueFallbackToKey = options.missingKeyNoValueFallbackToKey || this.options.missingKeyNoValueFallbackToKey; + const resForMissing = missingKeyNoValueFallbackToKey && usedKey ? undefined : res; + const updateMissing = hasDefaultValue && defaultValue !== res && this.options.updateMissing; + if (usedKey || usedDefault || updateMissing) { + this.logger.log(updateMissing ? 'updateKey' : 'missingKey', lng, namespace, key, updateMissing ? defaultValue : res); + if (keySeparator) { + const fk = this.resolve(key, { + ...options, + keySeparator: false + }); + if (fk && fk.res) this.logger.warn('Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.'); + } + let lngs = []; + const fallbackLngs = this.languageUtils.getFallbackCodes(this.options.fallbackLng, options.lng || this.language); + if (this.options.saveMissingTo === 'fallback' && fallbackLngs && fallbackLngs[0]) { + for (let i = 0; i < fallbackLngs.length; i++) { + lngs.push(fallbackLngs[i]); + } + } else if (this.options.saveMissingTo === 'all') { + lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language); + } else { + lngs.push(options.lng || this.language); + } + const send = (l, k, specificDefaultValue) => { + const defaultForMissing = hasDefaultValue && specificDefaultValue !== res ? specificDefaultValue : resForMissing; + if (this.options.missingKeyHandler) { + this.options.missingKeyHandler(l, namespace, k, defaultForMissing, updateMissing, options); + } else if (this.backendConnector && this.backendConnector.saveMissing) { + this.backendConnector.saveMissing(l, namespace, k, defaultForMissing, updateMissing, options); + } + this.emit('missingKey', l, namespace, k, res); + }; + if (this.options.saveMissing) { + if (this.options.saveMissingPlurals && needsPluralHandling) { + lngs.forEach(language => { + const suffixes = this.pluralResolver.getSuffixes(language, options); + if (needsZeroSuffixLookup && options[`defaultValue${this.options.pluralSeparator}zero`] && suffixes.indexOf(`${this.options.pluralSeparator}zero`) < 0) { + suffixes.push(`${this.options.pluralSeparator}zero`); + } + suffixes.forEach(suffix => { + send([language], key + suffix, options[`defaultValue${suffix}`] || defaultValue); + }); + }); + } else { + send(lngs, key, defaultValue); + } + } + } + res = this.extendTranslation(res, keys, options, resolved, lastKey); + if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = `${namespace}:${key}`; + if ((usedKey || usedDefault) && this.options.parseMissingKeyHandler) { + if (this.options.compatibilityAPI !== 'v1') { + res = this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey ? `${namespace}:${key}` : key, usedDefault ? res : undefined); + } else { + res = this.options.parseMissingKeyHandler(res); + } + } + } + if (returnDetails) { + resolved.res = res; + resolved.usedParams = this.getUsedParamsDetails(options); + return resolved; + } + return res; + } + extendTranslation(res, key, options, resolved, lastKey) { + var _this = this; + if (this.i18nFormat && this.i18nFormat.parse) { + res = this.i18nFormat.parse(res, { + ...this.options.interpolation.defaultVariables, + ...options + }, options.lng || this.language || resolved.usedLng, resolved.usedNS, resolved.usedKey, { + resolved + }); + } else if (!options.skipInterpolation) { + if (options.interpolation) this.interpolator.init({ + ...options, + ...{ + interpolation: { + ...this.options.interpolation, + ...options.interpolation + } + } + }); + const skipOnVariables = typeof res === 'string' && (options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables); + let nestBef; + if (skipOnVariables) { + const nb = res.match(this.interpolator.nestingRegexp); + nestBef = nb && nb.length; + } + let data = options.replace && typeof options.replace !== 'string' ? options.replace : options; + if (this.options.interpolation.defaultVariables) data = { + ...this.options.interpolation.defaultVariables, + ...data + }; + res = this.interpolator.interpolate(res, data, options.lng || this.language || resolved.usedLng, options); + if (skipOnVariables) { + const na = res.match(this.interpolator.nestingRegexp); + const nestAft = na && na.length; + if (nestBef < nestAft) options.nest = false; + } + if (!options.lng && this.options.compatibilityAPI !== 'v1' && resolved && resolved.res) options.lng = this.language || resolved.usedLng; + if (options.nest !== false) res = this.interpolator.nest(res, function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (lastKey && lastKey[0] === args[0] && !options.context) { + _this.logger.warn(`It seems you are nesting recursively key: ${args[0]} in key: ${key[0]}`); + return null; + } + return _this.translate(...args, key); + }, options); + if (options.interpolation) this.interpolator.reset(); + } + const postProcess = options.postProcess || this.options.postProcess; + const postProcessorNames = typeof postProcess === 'string' ? [postProcess] : postProcess; + if (res !== undefined && res !== null && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) { + res = postProcessor.handle(postProcessorNames, res, key, this.options && this.options.postProcessPassResolved ? { + i18nResolved: { + ...resolved, + usedParams: this.getUsedParamsDetails(options) + }, + ...options + } : options, this); + } + return res; + } + resolve(keys) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let found; + let usedKey; + let exactUsedKey; + let usedLng; + let usedNS; + if (typeof keys === 'string') keys = [keys]; + keys.forEach(k => { + if (this.isValidLookup(found)) return; + const extracted = this.extractFromKey(k, options); + const key = extracted.key; + usedKey = key; + let namespaces = extracted.namespaces; + if (this.options.fallbackNS) namespaces = namespaces.concat(this.options.fallbackNS); + const needsPluralHandling = options.count !== undefined && typeof options.count !== 'string'; + const needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && this.pluralResolver.shouldUseIntlApi(); + const needsContextHandling = options.context !== undefined && (typeof options.context === 'string' || typeof options.context === 'number') && options.context !== ''; + const codes = options.lngs ? options.lngs : this.languageUtils.toResolveHierarchy(options.lng || this.language, options.fallbackLng); + namespaces.forEach(ns => { + if (this.isValidLookup(found)) return; + usedNS = ns; + if (!checkedLoadedFor[`${codes[0]}-${ns}`] && this.utils && this.utils.hasLoadedNamespace && !this.utils.hasLoadedNamespace(usedNS)) { + checkedLoadedFor[`${codes[0]}-${ns}`] = true; + this.logger.warn(`key "${usedKey}" for languages "${codes.join(', ')}" won't get resolved as namespace "${usedNS}" was not yet loaded`, 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!'); + } + codes.forEach(code => { + if (this.isValidLookup(found)) return; + usedLng = code; + const finalKeys = [key]; + if (this.i18nFormat && this.i18nFormat.addLookupKeys) { + this.i18nFormat.addLookupKeys(finalKeys, key, code, ns, options); + } else { + let pluralSuffix; + if (needsPluralHandling) pluralSuffix = this.pluralResolver.getSuffix(code, options.count, options); + const zeroSuffix = `${this.options.pluralSeparator}zero`; + const ordinalPrefix = `${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`; + if (needsPluralHandling) { + finalKeys.push(key + pluralSuffix); + if (options.ordinal && pluralSuffix.indexOf(ordinalPrefix) === 0) { + finalKeys.push(key + pluralSuffix.replace(ordinalPrefix, this.options.pluralSeparator)); + } + if (needsZeroSuffixLookup) { + finalKeys.push(key + zeroSuffix); + } + } + if (needsContextHandling) { + const contextKey = `${key}${this.options.contextSeparator}${options.context}`; + finalKeys.push(contextKey); + if (needsPluralHandling) { + finalKeys.push(contextKey + pluralSuffix); + if (options.ordinal && pluralSuffix.indexOf(ordinalPrefix) === 0) { + finalKeys.push(contextKey + pluralSuffix.replace(ordinalPrefix, this.options.pluralSeparator)); + } + if (needsZeroSuffixLookup) { + finalKeys.push(contextKey + zeroSuffix); + } + } + } + } + let possibleKey; + while (possibleKey = finalKeys.pop()) { + if (!this.isValidLookup(found)) { + exactUsedKey = possibleKey; + found = this.getResource(code, ns, possibleKey, options); + } + } + }); + }); + }); + return { + res: found, + usedKey, + exactUsedKey, + usedLng, + usedNS + }; + } + isValidLookup(res) { + return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === ''); + } + getResource(code, ns, key) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + if (this.i18nFormat && this.i18nFormat.getResource) return this.i18nFormat.getResource(code, ns, key, options); + return this.resourceStore.getResource(code, ns, key, options); + } + getUsedParamsDetails() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const optionsKeys = ['defaultValue', 'ordinal', 'context', 'replace', 'lng', 'lngs', 'fallbackLng', 'ns', 'keySeparator', 'nsSeparator', 'returnObjects', 'returnDetails', 'joinArrays', 'postProcess', 'interpolation']; + const useOptionsReplaceForData = options.replace && typeof options.replace !== 'string'; + let data = useOptionsReplaceForData ? options.replace : options; + if (useOptionsReplaceForData && typeof options.count !== 'undefined') { + data.count = options.count; + } + if (this.options.interpolation.defaultVariables) { + data = { + ...this.options.interpolation.defaultVariables, + ...data + }; + } + if (!useOptionsReplaceForData) { + data = { + ...data + }; + for (const key of optionsKeys) { + delete data[key]; + } + } + return data; + } + static hasDefaultValue(options) { + const prefix = 'defaultValue'; + for (const option in options) { + if (Object.prototype.hasOwnProperty.call(options, option) && prefix === option.substring(0, prefix.length) && undefined !== options[option]) { + return true; + } + } + return false; + } +} + +const capitalize = string => string.charAt(0).toUpperCase() + string.slice(1); +class LanguageUtil { + constructor(options) { + this.options = options; + this.supportedLngs = this.options.supportedLngs || false; + this.logger = baseLogger.create('languageUtils'); + } + getScriptPartFromCode(code) { + code = getCleanedCode(code); + if (!code || code.indexOf('-') < 0) return null; + const p = code.split('-'); + if (p.length === 2) return null; + p.pop(); + if (p[p.length - 1].toLowerCase() === 'x') return null; + return this.formatLanguageCode(p.join('-')); + } + getLanguagePartFromCode(code) { + code = getCleanedCode(code); + if (!code || code.indexOf('-') < 0) return code; + const p = code.split('-'); + return this.formatLanguageCode(p[0]); + } + formatLanguageCode(code) { + if (typeof code === 'string' && code.indexOf('-') > -1) { + const specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab']; + let p = code.split('-'); + if (this.options.lowerCaseLng) { + p = p.map(part => part.toLowerCase()); + } else if (p.length === 2) { + p[0] = p[0].toLowerCase(); + p[1] = p[1].toUpperCase(); + if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase()); + } else if (p.length === 3) { + p[0] = p[0].toLowerCase(); + if (p[1].length === 2) p[1] = p[1].toUpperCase(); + if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase(); + if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase()); + if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase()); + } + return p.join('-'); + } + return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code; + } + isSupportedCode(code) { + if (this.options.load === 'languageOnly' || this.options.nonExplicitSupportedLngs) { + code = this.getLanguagePartFromCode(code); + } + return !this.supportedLngs || !this.supportedLngs.length || this.supportedLngs.indexOf(code) > -1; + } + getBestMatchFromCodes(codes) { + if (!codes) return null; + let found; + codes.forEach(code => { + if (found) return; + const cleanedLng = this.formatLanguageCode(code); + if (!this.options.supportedLngs || this.isSupportedCode(cleanedLng)) found = cleanedLng; + }); + if (!found && this.options.supportedLngs) { + codes.forEach(code => { + if (found) return; + const lngOnly = this.getLanguagePartFromCode(code); + if (this.isSupportedCode(lngOnly)) return found = lngOnly; + found = this.options.supportedLngs.find(supportedLng => { + if (supportedLng === lngOnly) return supportedLng; + if (supportedLng.indexOf('-') < 0 && lngOnly.indexOf('-') < 0) return; + if (supportedLng.indexOf('-') > 0 && lngOnly.indexOf('-') < 0 && supportedLng.substring(0, supportedLng.indexOf('-')) === lngOnly) return supportedLng; + if (supportedLng.indexOf(lngOnly) === 0 && lngOnly.length > 1) return supportedLng; + }); + }); + } + if (!found) found = this.getFallbackCodes(this.options.fallbackLng)[0]; + return found; + } + getFallbackCodes(fallbacks, code) { + if (!fallbacks) return []; + if (typeof fallbacks === 'function') fallbacks = fallbacks(code); + if (typeof fallbacks === 'string') fallbacks = [fallbacks]; + if (Array.isArray(fallbacks)) return fallbacks; + if (!code) return fallbacks.default || []; + let found = fallbacks[code]; + if (!found) found = fallbacks[this.getScriptPartFromCode(code)]; + if (!found) found = fallbacks[this.formatLanguageCode(code)]; + if (!found) found = fallbacks[this.getLanguagePartFromCode(code)]; + if (!found) found = fallbacks.default; + return found || []; + } + toResolveHierarchy(code, fallbackCode) { + const fallbackCodes = this.getFallbackCodes(fallbackCode || this.options.fallbackLng || [], code); + const codes = []; + const addCode = c => { + if (!c) return; + if (this.isSupportedCode(c)) { + codes.push(c); + } else { + this.logger.warn(`rejecting language code not found in supportedLngs: ${c}`); + } + }; + if (typeof code === 'string' && (code.indexOf('-') > -1 || code.indexOf('_') > -1)) { + if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code)); + if (this.options.load !== 'languageOnly' && this.options.load !== 'currentOnly') addCode(this.getScriptPartFromCode(code)); + if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code)); + } else if (typeof code === 'string') { + addCode(this.formatLanguageCode(code)); + } + fallbackCodes.forEach(fc => { + if (codes.indexOf(fc) < 0) addCode(this.formatLanguageCode(fc)); + }); + return codes; + } +} + +let sets = [{ + lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'pt', 'pt-BR', 'tg', 'tl', 'ti', 'tr', 'uz', 'wa'], + nr: [1, 2], + fc: 1 +}, { + lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'hi', 'hu', 'hy', 'ia', 'it', 'kk', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt-PT', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'], + nr: [1, 2], + fc: 2 +}, { + lngs: ['ay', 'bo', 'cgg', 'fa', 'ht', 'id', 'ja', 'jbo', 'ka', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'], + nr: [1], + fc: 3 +}, { + lngs: ['be', 'bs', 'cnr', 'dz', 'hr', 'ru', 'sr', 'uk'], + nr: [1, 2, 5], + fc: 4 +}, { + lngs: ['ar'], + nr: [0, 1, 2, 3, 11, 100], + fc: 5 +}, { + lngs: ['cs', 'sk'], + nr: [1, 2, 5], + fc: 6 +}, { + lngs: ['csb', 'pl'], + nr: [1, 2, 5], + fc: 7 +}, { + lngs: ['cy'], + nr: [1, 2, 3, 8], + fc: 8 +}, { + lngs: ['fr'], + nr: [1, 2], + fc: 9 +}, { + lngs: ['ga'], + nr: [1, 2, 3, 7, 11], + fc: 10 +}, { + lngs: ['gd'], + nr: [1, 2, 3, 20], + fc: 11 +}, { + lngs: ['is'], + nr: [1, 2], + fc: 12 +}, { + lngs: ['jv'], + nr: [0, 1], + fc: 13 +}, { + lngs: ['kw'], + nr: [1, 2, 3, 4], + fc: 14 +}, { + lngs: ['lt'], + nr: [1, 2, 10], + fc: 15 +}, { + lngs: ['lv'], + nr: [1, 2, 0], + fc: 16 +}, { + lngs: ['mk'], + nr: [1, 2], + fc: 17 +}, { + lngs: ['mnk'], + nr: [0, 1, 2], + fc: 18 +}, { + lngs: ['mt'], + nr: [1, 2, 11, 20], + fc: 19 +}, { + lngs: ['or'], + nr: [2, 1], + fc: 2 +}, { + lngs: ['ro'], + nr: [1, 2, 20], + fc: 20 +}, { + lngs: ['sl'], + nr: [5, 1, 2, 3], + fc: 21 +}, { + lngs: ['he', 'iw'], + nr: [1, 2, 20, 21], + fc: 22 +}]; +let _rulesPluralsTypes = { + 1: n => Number(n > 1), + 2: n => Number(n != 1), + 3: n => 0, + 4: n => Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2), + 5: n => Number(n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5), + 6: n => Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2), + 7: n => Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2), + 8: n => Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3), + 9: n => Number(n >= 2), + 10: n => Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4), + 11: n => Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3), + 12: n => Number(n % 10 != 1 || n % 100 == 11), + 13: n => Number(n !== 0), + 14: n => Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3), + 15: n => Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2), + 16: n => Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2), + 17: n => Number(n == 1 || n % 10 == 1 && n % 100 != 11 ? 0 : 1), + 18: n => Number(n == 0 ? 0 : n == 1 ? 1 : 2), + 19: n => Number(n == 1 ? 0 : n == 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3), + 20: n => Number(n == 1 ? 0 : n == 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2), + 21: n => Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0), + 22: n => Number(n == 1 ? 0 : n == 2 ? 1 : (n < 0 || n > 10) && n % 10 == 0 ? 2 : 3) +}; +const nonIntlVersions = ['v1', 'v2', 'v3']; +const intlVersions = ['v4']; +const suffixesOrder = { + zero: 0, + one: 1, + two: 2, + few: 3, + many: 4, + other: 5 +}; +const createRules = () => { + const rules = {}; + sets.forEach(set => { + set.lngs.forEach(l => { + rules[l] = { + numbers: set.nr, + plurals: _rulesPluralsTypes[set.fc] + }; + }); + }); + return rules; +}; +class PluralResolver { + constructor(languageUtils) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.languageUtils = languageUtils; + this.options = options; + this.logger = baseLogger.create('pluralResolver'); + if ((!this.options.compatibilityJSON || intlVersions.includes(this.options.compatibilityJSON)) && (typeof Intl === 'undefined' || !Intl.PluralRules)) { + this.options.compatibilityJSON = 'v3'; + this.logger.error('Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.'); + } + this.rules = createRules(); + this.pluralRulesCache = {}; + } + addRule(lng, obj) { + this.rules[lng] = obj; + } + clearCache() { + this.pluralRulesCache = {}; + } + getRule(code) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (this.shouldUseIntlApi()) { + try { + const cleanedCode = getCleanedCode(code === 'dev' ? 'en' : code); + const type = options.ordinal ? 'ordinal' : 'cardinal'; + const cacheKey = JSON.stringify({ + cleanedCode, + type + }); + if (cacheKey in this.pluralRulesCache) { + return this.pluralRulesCache[cacheKey]; + } + const rule = new Intl.PluralRules(cleanedCode, { + type + }); + this.pluralRulesCache[cacheKey] = rule; + return rule; + } catch (err) { + return; + } + } + return this.rules[code] || this.rules[this.languageUtils.getLanguagePartFromCode(code)]; + } + needsPlural(code) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const rule = this.getRule(code, options); + if (this.shouldUseIntlApi()) { + return rule && rule.resolvedOptions().pluralCategories.length > 1; + } + return rule && rule.numbers.length > 1; + } + getPluralFormsOfKey(code, key) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return this.getSuffixes(code, options).map(suffix => `${key}${suffix}`); + } + getSuffixes(code) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const rule = this.getRule(code, options); + if (!rule) { + return []; + } + if (this.shouldUseIntlApi()) { + return rule.resolvedOptions().pluralCategories.sort((pluralCategory1, pluralCategory2) => suffixesOrder[pluralCategory1] - suffixesOrder[pluralCategory2]).map(pluralCategory => `${this.options.prepend}${options.ordinal ? `ordinal${this.options.prepend}` : ''}${pluralCategory}`); + } + return rule.numbers.map(number => this.getSuffix(code, number, options)); + } + getSuffix(code, count) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const rule = this.getRule(code, options); + if (rule) { + if (this.shouldUseIntlApi()) { + return `${this.options.prepend}${options.ordinal ? `ordinal${this.options.prepend}` : ''}${rule.select(count)}`; + } + return this.getSuffixRetroCompatible(rule, count); + } + this.logger.warn(`no plural rule found for: ${code}`); + return ''; + } + getSuffixRetroCompatible(rule, count) { + const idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count)); + let suffix = rule.numbers[idx]; + if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) { + if (suffix === 2) { + suffix = 'plural'; + } else if (suffix === 1) { + suffix = ''; + } + } + const returnSuffix = () => this.options.prepend && suffix.toString() ? this.options.prepend + suffix.toString() : suffix.toString(); + if (this.options.compatibilityJSON === 'v1') { + if (suffix === 1) return ''; + if (typeof suffix === 'number') return `_plural_${suffix.toString()}`; + return returnSuffix(); + } else if (this.options.compatibilityJSON === 'v2') { + return returnSuffix(); + } else if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) { + return returnSuffix(); + } + return this.options.prepend && idx.toString() ? this.options.prepend + idx.toString() : idx.toString(); + } + shouldUseIntlApi() { + return !nonIntlVersions.includes(this.options.compatibilityJSON); + } +} + +const deepFindWithDefaults = function (data, defaultData, key) { + let keySeparator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '.'; + let ignoreJSONStructure = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + let path = getPathWithDefaults(data, defaultData, key); + if (!path && ignoreJSONStructure && typeof key === 'string') { + path = deepFind(data, key, keySeparator); + if (path === undefined) path = deepFind(defaultData, key, keySeparator); + } + return path; +}; +const regexSafe = val => val.replace(/\$/g, '$$$$'); +class Interpolator { + constructor() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.logger = baseLogger.create('interpolator'); + this.options = options; + this.format = options.interpolation && options.interpolation.format || (value => value); + this.init(options); + } + init() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (!options.interpolation) options.interpolation = { + escapeValue: true + }; + const { + escape: escape$1, + escapeValue, + useRawValueToEscape, + prefix, + prefixEscaped, + suffix, + suffixEscaped, + formatSeparator, + unescapeSuffix, + unescapePrefix, + nestingPrefix, + nestingPrefixEscaped, + nestingSuffix, + nestingSuffixEscaped, + nestingOptionsSeparator, + maxReplaces, + alwaysFormat + } = options.interpolation; + this.escape = escape$1 !== undefined ? escape$1 : escape; + this.escapeValue = escapeValue !== undefined ? escapeValue : true; + this.useRawValueToEscape = useRawValueToEscape !== undefined ? useRawValueToEscape : false; + this.prefix = prefix ? regexEscape(prefix) : prefixEscaped || '{{'; + this.suffix = suffix ? regexEscape(suffix) : suffixEscaped || '}}'; + this.formatSeparator = formatSeparator || ','; + this.unescapePrefix = unescapeSuffix ? '' : unescapePrefix || '-'; + this.unescapeSuffix = this.unescapePrefix ? '' : unescapeSuffix || ''; + this.nestingPrefix = nestingPrefix ? regexEscape(nestingPrefix) : nestingPrefixEscaped || regexEscape('$t('); + this.nestingSuffix = nestingSuffix ? regexEscape(nestingSuffix) : nestingSuffixEscaped || regexEscape(')'); + this.nestingOptionsSeparator = nestingOptionsSeparator || ','; + this.maxReplaces = maxReplaces || 1000; + this.alwaysFormat = alwaysFormat !== undefined ? alwaysFormat : false; + this.resetRegExp(); + } + reset() { + if (this.options) this.init(this.options); + } + resetRegExp() { + const getOrResetRegExp = (existingRegExp, pattern) => { + if (existingRegExp && existingRegExp.source === pattern) { + existingRegExp.lastIndex = 0; + return existingRegExp; + } + return new RegExp(pattern, 'g'); + }; + this.regexp = getOrResetRegExp(this.regexp, `${this.prefix}(.+?)${this.suffix}`); + this.regexpUnescape = getOrResetRegExp(this.regexpUnescape, `${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`); + this.nestingRegexp = getOrResetRegExp(this.nestingRegexp, `${this.nestingPrefix}(.+?)${this.nestingSuffix}`); + } + interpolate(str, data, lng, options) { + let match; + let value; + let replaces; + const defaultData = this.options && this.options.interpolation && this.options.interpolation.defaultVariables || {}; + const handleFormat = key => { + if (key.indexOf(this.formatSeparator) < 0) { + const path = deepFindWithDefaults(data, defaultData, key, this.options.keySeparator, this.options.ignoreJSONStructure); + return this.alwaysFormat ? this.format(path, undefined, lng, { + ...options, + ...data, + interpolationkey: key + }) : path; + } + const p = key.split(this.formatSeparator); + const k = p.shift().trim(); + const f = p.join(this.formatSeparator).trim(); + return this.format(deepFindWithDefaults(data, defaultData, k, this.options.keySeparator, this.options.ignoreJSONStructure), f, lng, { + ...options, + ...data, + interpolationkey: k + }); + }; + this.resetRegExp(); + const missingInterpolationHandler = options && options.missingInterpolationHandler || this.options.missingInterpolationHandler; + const skipOnVariables = options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables; + const todos = [{ + regex: this.regexpUnescape, + safeValue: val => regexSafe(val) + }, { + regex: this.regexp, + safeValue: val => this.escapeValue ? regexSafe(this.escape(val)) : regexSafe(val) + }]; + todos.forEach(todo => { + replaces = 0; + while (match = todo.regex.exec(str)) { + const matchedVar = match[1].trim(); + value = handleFormat(matchedVar); + if (value === undefined) { + if (typeof missingInterpolationHandler === 'function') { + const temp = missingInterpolationHandler(str, match, options); + value = typeof temp === 'string' ? temp : ''; + } else if (options && Object.prototype.hasOwnProperty.call(options, matchedVar)) { + value = ''; + } else if (skipOnVariables) { + value = match[0]; + continue; + } else { + this.logger.warn(`missed to pass in variable ${matchedVar} for interpolating ${str}`); + value = ''; + } + } else if (typeof value !== 'string' && !this.useRawValueToEscape) { + value = makeString(value); + } + const safeValue = todo.safeValue(value); + str = str.replace(match[0], safeValue); + if (skipOnVariables) { + todo.regex.lastIndex += value.length; + todo.regex.lastIndex -= match[0].length; + } else { + todo.regex.lastIndex = 0; + } + replaces++; + if (replaces >= this.maxReplaces) { + break; + } + } + }); + return str; + } + nest(str, fc) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let match; + let value; + let clonedOptions; + const handleHasOptions = (key, inheritedOptions) => { + const sep = this.nestingOptionsSeparator; + if (key.indexOf(sep) < 0) return key; + const c = key.split(new RegExp(`${sep}[ ]*{`)); + let optionsString = `{${c[1]}`; + key = c[0]; + optionsString = this.interpolate(optionsString, clonedOptions); + const matchedSingleQuotes = optionsString.match(/'/g); + const matchedDoubleQuotes = optionsString.match(/"/g); + if (matchedSingleQuotes && matchedSingleQuotes.length % 2 === 0 && !matchedDoubleQuotes || matchedDoubleQuotes.length % 2 !== 0) { + optionsString = optionsString.replace(/'/g, '"'); + } + try { + clonedOptions = JSON.parse(optionsString); + if (inheritedOptions) clonedOptions = { + ...inheritedOptions, + ...clonedOptions + }; + } catch (e) { + this.logger.warn(`failed parsing options string in nesting for key ${key}`, e); + return `${key}${sep}${optionsString}`; + } + if (clonedOptions.defaultValue && clonedOptions.defaultValue.indexOf(this.prefix) > -1) delete clonedOptions.defaultValue; + return key; + }; + while (match = this.nestingRegexp.exec(str)) { + let formatters = []; + clonedOptions = { + ...options + }; + clonedOptions = clonedOptions.replace && typeof clonedOptions.replace !== 'string' ? clonedOptions.replace : clonedOptions; + clonedOptions.applyPostProcessor = false; + delete clonedOptions.defaultValue; + let doReduce = false; + if (match[0].indexOf(this.formatSeparator) !== -1 && !/{.*}/.test(match[1])) { + const r = match[1].split(this.formatSeparator).map(elem => elem.trim()); + match[1] = r.shift(); + formatters = r; + doReduce = true; + } + value = fc(handleHasOptions.call(this, match[1].trim(), clonedOptions), clonedOptions); + if (value && match[0] === str && typeof value !== 'string') return value; + if (typeof value !== 'string') value = makeString(value); + if (!value) { + this.logger.warn(`missed to resolve ${match[1]} for nesting ${str}`); + value = ''; + } + if (doReduce) { + value = formatters.reduce((v, f) => this.format(v, f, options.lng, { + ...options, + interpolationkey: match[1].trim() + }), value.trim()); + } + str = str.replace(match[0], value); + this.regexp.lastIndex = 0; + } + return str; + } +} + +const parseFormatStr = formatStr => { + let formatName = formatStr.toLowerCase().trim(); + const formatOptions = {}; + if (formatStr.indexOf('(') > -1) { + const p = formatStr.split('('); + formatName = p[0].toLowerCase().trim(); + const optStr = p[1].substring(0, p[1].length - 1); + if (formatName === 'currency' && optStr.indexOf(':') < 0) { + if (!formatOptions.currency) formatOptions.currency = optStr.trim(); + } else if (formatName === 'relativetime' && optStr.indexOf(':') < 0) { + if (!formatOptions.range) formatOptions.range = optStr.trim(); + } else { + const opts = optStr.split(';'); + opts.forEach(opt => { + if (opt) { + const [key, ...rest] = opt.split(':'); + const val = rest.join(':').trim().replace(/^'+|'+$/g, ''); + const trimmedKey = key.trim(); + if (!formatOptions[trimmedKey]) formatOptions[trimmedKey] = val; + if (val === 'false') formatOptions[trimmedKey] = false; + if (val === 'true') formatOptions[trimmedKey] = true; + if (!isNaN(val)) formatOptions[trimmedKey] = parseInt(val, 10); + } + }); + } + } + return { + formatName, + formatOptions + }; +}; +const createCachedFormatter = fn => { + const cache = {}; + return (val, lng, options) => { + let optForCache = options; + if (options && options.interpolationkey && options.formatParams && options.formatParams[options.interpolationkey] && options[options.interpolationkey]) { + optForCache = { + ...optForCache, + [options.interpolationkey]: undefined + }; + } + const key = lng + JSON.stringify(optForCache); + let formatter = cache[key]; + if (!formatter) { + formatter = fn(getCleanedCode(lng), options); + cache[key] = formatter; + } + return formatter(val); + }; +}; +class Formatter { + constructor() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.logger = baseLogger.create('formatter'); + this.options = options; + this.formats = { + number: createCachedFormatter((lng, opt) => { + const formatter = new Intl.NumberFormat(lng, { + ...opt + }); + return val => formatter.format(val); + }), + currency: createCachedFormatter((lng, opt) => { + const formatter = new Intl.NumberFormat(lng, { + ...opt, + style: 'currency' + }); + return val => formatter.format(val); + }), + datetime: createCachedFormatter((lng, opt) => { + const formatter = new Intl.DateTimeFormat(lng, { + ...opt + }); + return val => formatter.format(val); + }), + relativetime: createCachedFormatter((lng, opt) => { + const formatter = new Intl.RelativeTimeFormat(lng, { + ...opt + }); + return val => formatter.format(val, opt.range || 'day'); + }), + list: createCachedFormatter((lng, opt) => { + const formatter = new Intl.ListFormat(lng, { + ...opt + }); + return val => formatter.format(val); + }) + }; + this.init(options); + } + init(services) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + interpolation: {} + }; + const iOpts = options.interpolation; + this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ','; + } + add(name, fc) { + this.formats[name.toLowerCase().trim()] = fc; + } + addCached(name, fc) { + this.formats[name.toLowerCase().trim()] = createCachedFormatter(fc); + } + format(value, format, lng) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + const formats = format.split(this.formatSeparator); + if (formats.length > 1 && formats[0].indexOf('(') > 1 && formats[0].indexOf(')') < 0 && formats.find(f => f.indexOf(')') > -1)) { + const lastIndex = formats.findIndex(f => f.indexOf(')') > -1); + formats[0] = [formats[0], ...formats.splice(1, lastIndex)].join(this.formatSeparator); + } + const result = formats.reduce((mem, f) => { + const { + formatName, + formatOptions + } = parseFormatStr(f); + if (this.formats[formatName]) { + let formatted = mem; + try { + const valOptions = options && options.formatParams && options.formatParams[options.interpolationkey] || {}; + const l = valOptions.locale || valOptions.lng || options.locale || options.lng || lng; + formatted = this.formats[formatName](mem, l, { + ...formatOptions, + ...options, + ...valOptions + }); + } catch (error) { + this.logger.warn(error); + } + return formatted; + } else { + this.logger.warn(`there was no format function for ${formatName}`); + } + return mem; + }, value); + return result; + } +} + +const removePending = (q, name) => { + if (q.pending[name] !== undefined) { + delete q.pending[name]; + q.pendingCount--; + } +}; +class Connector extends EventEmitter { + constructor(backend, store, services) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + super(); + this.backend = backend; + this.store = store; + this.services = services; + this.languageUtils = services.languageUtils; + this.options = options; + this.logger = baseLogger.create('backendConnector'); + this.waitingReads = []; + this.maxParallelReads = options.maxParallelReads || 10; + this.readingCalls = 0; + this.maxRetries = options.maxRetries >= 0 ? options.maxRetries : 5; + this.retryTimeout = options.retryTimeout >= 1 ? options.retryTimeout : 350; + this.state = {}; + this.queue = []; + if (this.backend && this.backend.init) { + this.backend.init(services, options.backend, options); + } + } + queueLoad(languages, namespaces, options, callback) { + const toLoad = {}; + const pending = {}; + const toLoadLanguages = {}; + const toLoadNamespaces = {}; + languages.forEach(lng => { + let hasAllNamespaces = true; + namespaces.forEach(ns => { + const name = `${lng}|${ns}`; + if (!options.reload && this.store.hasResourceBundle(lng, ns)) { + this.state[name] = 2; + } else if (this.state[name] < 0) ; else if (this.state[name] === 1) { + if (pending[name] === undefined) pending[name] = true; + } else { + this.state[name] = 1; + hasAllNamespaces = false; + if (pending[name] === undefined) pending[name] = true; + if (toLoad[name] === undefined) toLoad[name] = true; + if (toLoadNamespaces[ns] === undefined) toLoadNamespaces[ns] = true; + } + }); + if (!hasAllNamespaces) toLoadLanguages[lng] = true; + }); + if (Object.keys(toLoad).length || Object.keys(pending).length) { + this.queue.push({ + pending, + pendingCount: Object.keys(pending).length, + loaded: {}, + errors: [], + callback + }); + } + return { + toLoad: Object.keys(toLoad), + pending: Object.keys(pending), + toLoadLanguages: Object.keys(toLoadLanguages), + toLoadNamespaces: Object.keys(toLoadNamespaces) + }; + } + loaded(name, err, data) { + const s = name.split('|'); + const lng = s[0]; + const ns = s[1]; + if (err) this.emit('failedLoading', lng, ns, err); + if (!err && data) { + this.store.addResourceBundle(lng, ns, data, undefined, undefined, { + skipCopy: true + }); + } + this.state[name] = err ? -1 : 2; + if (err && data) this.state[name] = 0; + const loaded = {}; + this.queue.forEach(q => { + pushPath(q.loaded, [lng], ns); + removePending(q, name); + if (err) q.errors.push(err); + if (q.pendingCount === 0 && !q.done) { + Object.keys(q.loaded).forEach(l => { + if (!loaded[l]) loaded[l] = {}; + const loadedKeys = q.loaded[l]; + if (loadedKeys.length) { + loadedKeys.forEach(n => { + if (loaded[l][n] === undefined) loaded[l][n] = true; + }); + } + }); + q.done = true; + if (q.errors.length) { + q.callback(q.errors); + } else { + q.callback(); + } + } + }); + this.emit('loaded', loaded); + this.queue = this.queue.filter(q => !q.done); + } + read(lng, ns, fcName) { + let tried = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; + let wait = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.retryTimeout; + let callback = arguments.length > 5 ? arguments[5] : undefined; + if (!lng.length) return callback(null, {}); + if (this.readingCalls >= this.maxParallelReads) { + this.waitingReads.push({ + lng, + ns, + fcName, + tried, + wait, + callback + }); + return; + } + this.readingCalls++; + const resolver = (err, data) => { + this.readingCalls--; + if (this.waitingReads.length > 0) { + const next = this.waitingReads.shift(); + this.read(next.lng, next.ns, next.fcName, next.tried, next.wait, next.callback); + } + if (err && data && tried < this.maxRetries) { + setTimeout(() => { + this.read.call(this, lng, ns, fcName, tried + 1, wait * 2, callback); + }, wait); + return; + } + callback(err, data); + }; + const fc = this.backend[fcName].bind(this.backend); + if (fc.length === 2) { + try { + const r = fc(lng, ns); + if (r && typeof r.then === 'function') { + r.then(data => resolver(null, data)).catch(resolver); + } else { + resolver(null, r); + } + } catch (err) { + resolver(err); + } + return; + } + return fc(lng, ns, resolver); + } + prepareLoading(languages, namespaces) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let callback = arguments.length > 3 ? arguments[3] : undefined; + if (!this.backend) { + this.logger.warn('No backend was added via i18next.use. Will not load resources.'); + return callback && callback(); + } + if (typeof languages === 'string') languages = this.languageUtils.toResolveHierarchy(languages); + if (typeof namespaces === 'string') namespaces = [namespaces]; + const toLoad = this.queueLoad(languages, namespaces, options, callback); + if (!toLoad.toLoad.length) { + if (!toLoad.pending.length) callback(); + return null; + } + toLoad.toLoad.forEach(name => { + this.loadOne(name); + }); + } + load(languages, namespaces, callback) { + this.prepareLoading(languages, namespaces, {}, callback); + } + reload(languages, namespaces, callback) { + this.prepareLoading(languages, namespaces, { + reload: true + }, callback); + } + loadOne(name) { + let prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + const s = name.split('|'); + const lng = s[0]; + const ns = s[1]; + this.read(lng, ns, 'read', undefined, undefined, (err, data) => { + if (err) this.logger.warn(`${prefix}loading namespace ${ns} for language ${lng} failed`, err); + if (!err && data) this.logger.log(`${prefix}loaded namespace ${ns} for language ${lng}`, data); + this.loaded(name, err, data); + }); + } + saveMissing(languages, namespace, key, fallbackValue, isUpdate) { + let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + let clb = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : () => {}; + if (this.services.utils && this.services.utils.hasLoadedNamespace && !this.services.utils.hasLoadedNamespace(namespace)) { + this.logger.warn(`did not save key "${key}" as the namespace "${namespace}" was not yet loaded`, 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!'); + return; + } + if (key === undefined || key === null || key === '') return; + if (this.backend && this.backend.create) { + const opts = { + ...options, + isUpdate + }; + const fc = this.backend.create.bind(this.backend); + if (fc.length < 6) { + try { + let r; + if (fc.length === 5) { + r = fc(languages, namespace, key, fallbackValue, opts); + } else { + r = fc(languages, namespace, key, fallbackValue); + } + if (r && typeof r.then === 'function') { + r.then(data => clb(null, data)).catch(clb); + } else { + clb(null, r); + } + } catch (err) { + clb(err); + } + } else { + fc(languages, namespace, key, fallbackValue, clb, opts); + } + } + if (!languages || !languages[0]) return; + this.store.addResource(languages[0], namespace, key, fallbackValue); + } +} + +const get = () => ({ + debug: false, + initImmediate: true, + ns: ['translation'], + defaultNS: ['translation'], + fallbackLng: ['dev'], + fallbackNS: false, + supportedLngs: false, + nonExplicitSupportedLngs: false, + load: 'all', + preload: false, + simplifyPluralSuffix: true, + keySeparator: '.', + nsSeparator: ':', + pluralSeparator: '_', + contextSeparator: '_', + partialBundledLanguages: false, + saveMissing: false, + updateMissing: false, + saveMissingTo: 'fallback', + saveMissingPlurals: true, + missingKeyHandler: false, + missingInterpolationHandler: false, + postProcess: false, + postProcessPassResolved: false, + returnNull: false, + returnEmptyString: true, + returnObjects: false, + joinArrays: false, + returnedObjectHandler: false, + parseMissingKeyHandler: false, + appendNamespaceToMissingKey: false, + appendNamespaceToCIMode: false, + overloadTranslationOptionHandler: args => { + let ret = {}; + if (typeof args[1] === 'object') ret = args[1]; + if (typeof args[1] === 'string') ret.defaultValue = args[1]; + if (typeof args[2] === 'string') ret.tDescription = args[2]; + if (typeof args[2] === 'object' || typeof args[3] === 'object') { + const options = args[3] || args[2]; + Object.keys(options).forEach(key => { + ret[key] = options[key]; + }); + } + return ret; + }, + interpolation: { + escapeValue: true, + format: value => value, + prefix: '{{', + suffix: '}}', + formatSeparator: ',', + unescapePrefix: '-', + nestingPrefix: '$t(', + nestingSuffix: ')', + nestingOptionsSeparator: ',', + maxReplaces: 1000, + skipOnVariables: true + } +}); +const transformOptions = options => { + if (typeof options.ns === 'string') options.ns = [options.ns]; + if (typeof options.fallbackLng === 'string') options.fallbackLng = [options.fallbackLng]; + if (typeof options.fallbackNS === 'string') options.fallbackNS = [options.fallbackNS]; + if (options.supportedLngs && options.supportedLngs.indexOf('cimode') < 0) { + options.supportedLngs = options.supportedLngs.concat(['cimode']); + } + return options; +}; + +const noop = () => {}; +const bindMemberFunctions = inst => { + const mems = Object.getOwnPropertyNames(Object.getPrototypeOf(inst)); + mems.forEach(mem => { + if (typeof inst[mem] === 'function') { + inst[mem] = inst[mem].bind(inst); + } + }); +}; +class I18n extends EventEmitter { + constructor() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let callback = arguments.length > 1 ? arguments[1] : undefined; + super(); + this.options = transformOptions(options); + this.services = {}; + this.logger = baseLogger; + this.modules = { + external: [] + }; + bindMemberFunctions(this); + if (callback && !this.isInitialized && !options.isClone) { + if (!this.options.initImmediate) { + this.init(options, callback); + return this; + } + setTimeout(() => { + this.init(options, callback); + }, 0); + } + } + init() { + var _this = this; + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let callback = arguments.length > 1 ? arguments[1] : undefined; + this.isInitializing = true; + if (typeof options === 'function') { + callback = options; + options = {}; + } + if (!options.defaultNS && options.defaultNS !== false && options.ns) { + if (typeof options.ns === 'string') { + options.defaultNS = options.ns; + } else if (options.ns.indexOf('translation') < 0) { + options.defaultNS = options.ns[0]; + } + } + const defOpts = get(); + this.options = { + ...defOpts, + ...this.options, + ...transformOptions(options) + }; + if (this.options.compatibilityAPI !== 'v1') { + this.options.interpolation = { + ...defOpts.interpolation, + ...this.options.interpolation + }; + } + if (options.keySeparator !== undefined) { + this.options.userDefinedKeySeparator = options.keySeparator; + } + if (options.nsSeparator !== undefined) { + this.options.userDefinedNsSeparator = options.nsSeparator; + } + const createClassOnDemand = ClassOrObject => { + if (!ClassOrObject) return null; + if (typeof ClassOrObject === 'function') return new ClassOrObject(); + return ClassOrObject; + }; + if (!this.options.isClone) { + if (this.modules.logger) { + baseLogger.init(createClassOnDemand(this.modules.logger), this.options); + } else { + baseLogger.init(null, this.options); + } + let formatter; + if (this.modules.formatter) { + formatter = this.modules.formatter; + } else if (typeof Intl !== 'undefined') { + formatter = Formatter; + } + const lu = new LanguageUtil(this.options); + this.store = new ResourceStore(this.options.resources, this.options); + const s = this.services; + s.logger = baseLogger; + s.resourceStore = this.store; + s.languageUtils = lu; + s.pluralResolver = new PluralResolver(lu, { + prepend: this.options.pluralSeparator, + compatibilityJSON: this.options.compatibilityJSON, + simplifyPluralSuffix: this.options.simplifyPluralSuffix + }); + if (formatter && (!this.options.interpolation.format || this.options.interpolation.format === defOpts.interpolation.format)) { + s.formatter = createClassOnDemand(formatter); + s.formatter.init(s, this.options); + this.options.interpolation.format = s.formatter.format.bind(s.formatter); + } + s.interpolator = new Interpolator(this.options); + s.utils = { + hasLoadedNamespace: this.hasLoadedNamespace.bind(this) + }; + s.backendConnector = new Connector(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options); + s.backendConnector.on('*', function (event) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + _this.emit(event, ...args); + }); + if (this.modules.languageDetector) { + s.languageDetector = createClassOnDemand(this.modules.languageDetector); + if (s.languageDetector.init) s.languageDetector.init(s, this.options.detection, this.options); + } + if (this.modules.i18nFormat) { + s.i18nFormat = createClassOnDemand(this.modules.i18nFormat); + if (s.i18nFormat.init) s.i18nFormat.init(this); + } + this.translator = new Translator(this.services, this.options); + this.translator.on('*', function (event) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + _this.emit(event, ...args); + }); + this.modules.external.forEach(m => { + if (m.init) m.init(this); + }); + } + this.format = this.options.interpolation.format; + if (!callback) callback = noop; + if (this.options.fallbackLng && !this.services.languageDetector && !this.options.lng) { + const codes = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng); + if (codes.length > 0 && codes[0] !== 'dev') this.options.lng = codes[0]; + } + if (!this.services.languageDetector && !this.options.lng) { + this.logger.warn('init: no languageDetector is used and no lng is defined'); + } + const storeApi = ['getResource', 'hasResourceBundle', 'getResourceBundle', 'getDataByLanguage']; + storeApi.forEach(fcName => { + this[fcName] = function () { + return _this.store[fcName](...arguments); + }; + }); + const storeApiChained = ['addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle']; + storeApiChained.forEach(fcName => { + this[fcName] = function () { + _this.store[fcName](...arguments); + return _this; + }; + }); + const deferred = defer(); + const load = () => { + const finish = (err, t) => { + this.isInitializing = false; + if (this.isInitialized && !this.initializedStoreOnce) this.logger.warn('init: i18next is already initialized. You should call init just once!'); + this.isInitialized = true; + if (!this.options.isClone) this.logger.log('initialized', this.options); + this.emit('initialized', this.options); + deferred.resolve(t); + callback(err, t); + }; + if (this.languages && this.options.compatibilityAPI !== 'v1' && !this.isInitialized) return finish(null, this.t.bind(this)); + this.changeLanguage(this.options.lng, finish); + }; + if (this.options.resources || !this.options.initImmediate) { + load(); + } else { + setTimeout(load, 0); + } + return deferred; + } + loadResources(language) { + let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop; + let usedCallback = callback; + const usedLng = typeof language === 'string' ? language : this.language; + if (typeof language === 'function') usedCallback = language; + if (!this.options.resources || this.options.partialBundledLanguages) { + if (usedLng && usedLng.toLowerCase() === 'cimode' && (!this.options.preload || this.options.preload.length === 0)) return usedCallback(); + const toLoad = []; + const append = lng => { + if (!lng) return; + if (lng === 'cimode') return; + const lngs = this.services.languageUtils.toResolveHierarchy(lng); + lngs.forEach(l => { + if (l === 'cimode') return; + if (toLoad.indexOf(l) < 0) toLoad.push(l); + }); + }; + if (!usedLng) { + const fallbacks = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng); + fallbacks.forEach(l => append(l)); + } else { + append(usedLng); + } + if (this.options.preload) { + this.options.preload.forEach(l => append(l)); + } + this.services.backendConnector.load(toLoad, this.options.ns, e => { + if (!e && !this.resolvedLanguage && this.language) this.setResolvedLanguage(this.language); + usedCallback(e); + }); + } else { + usedCallback(null); + } + } + reloadResources(lngs, ns, callback) { + const deferred = defer(); + if (typeof lngs === 'function') { + callback = lngs; + lngs = undefined; + } + if (typeof ns === 'function') { + callback = ns; + ns = undefined; + } + if (!lngs) lngs = this.languages; + if (!ns) ns = this.options.ns; + if (!callback) callback = noop; + this.services.backendConnector.reload(lngs, ns, err => { + deferred.resolve(); + callback(err); + }); + return deferred; + } + use(module) { + if (!module) throw new Error('You are passing an undefined module! Please check the object you are passing to i18next.use()'); + if (!module.type) throw new Error('You are passing a wrong module! Please check the object you are passing to i18next.use()'); + if (module.type === 'backend') { + this.modules.backend = module; + } + if (module.type === 'logger' || module.log && module.warn && module.error) { + this.modules.logger = module; + } + if (module.type === 'languageDetector') { + this.modules.languageDetector = module; + } + if (module.type === 'i18nFormat') { + this.modules.i18nFormat = module; + } + if (module.type === 'postProcessor') { + postProcessor.addPostProcessor(module); + } + if (module.type === 'formatter') { + this.modules.formatter = module; + } + if (module.type === '3rdParty') { + this.modules.external.push(module); + } + return this; + } + setResolvedLanguage(l) { + if (!l || !this.languages) return; + if (['cimode', 'dev'].indexOf(l) > -1) return; + for (let li = 0; li < this.languages.length; li++) { + const lngInLngs = this.languages[li]; + if (['cimode', 'dev'].indexOf(lngInLngs) > -1) continue; + if (this.store.hasLanguageSomeTranslations(lngInLngs)) { + this.resolvedLanguage = lngInLngs; + break; + } + } + } + changeLanguage(lng, callback) { + var _this2 = this; + this.isLanguageChangingTo = lng; + const deferred = defer(); + this.emit('languageChanging', lng); + const setLngProps = l => { + this.language = l; + this.languages = this.services.languageUtils.toResolveHierarchy(l); + this.resolvedLanguage = undefined; + this.setResolvedLanguage(l); + }; + const done = (err, l) => { + if (l) { + setLngProps(l); + this.translator.changeLanguage(l); + this.isLanguageChangingTo = undefined; + this.emit('languageChanged', l); + this.logger.log('languageChanged', l); + } else { + this.isLanguageChangingTo = undefined; + } + deferred.resolve(function () { + return _this2.t(...arguments); + }); + if (callback) callback(err, function () { + return _this2.t(...arguments); + }); + }; + const setLng = lngs => { + if (!lng && !lngs && this.services.languageDetector) lngs = []; + const l = typeof lngs === 'string' ? lngs : this.services.languageUtils.getBestMatchFromCodes(lngs); + if (l) { + if (!this.language) { + setLngProps(l); + } + if (!this.translator.language) this.translator.changeLanguage(l); + if (this.services.languageDetector && this.services.languageDetector.cacheUserLanguage) this.services.languageDetector.cacheUserLanguage(l); + } + this.loadResources(l, err => { + done(err, l); + }); + }; + if (!lng && this.services.languageDetector && !this.services.languageDetector.async) { + setLng(this.services.languageDetector.detect()); + } else if (!lng && this.services.languageDetector && this.services.languageDetector.async) { + if (this.services.languageDetector.detect.length === 0) { + this.services.languageDetector.detect().then(setLng); + } else { + this.services.languageDetector.detect(setLng); + } + } else { + setLng(lng); + } + return deferred; + } + getFixedT(lng, ns, keyPrefix) { + var _this3 = this; + const fixedT = function (key, opts) { + let options; + if (typeof opts !== 'object') { + for (var _len3 = arguments.length, rest = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) { + rest[_key3 - 2] = arguments[_key3]; + } + options = _this3.options.overloadTranslationOptionHandler([key, opts].concat(rest)); + } else { + options = { + ...opts + }; + } + options.lng = options.lng || fixedT.lng; + options.lngs = options.lngs || fixedT.lngs; + options.ns = options.ns || fixedT.ns; + if (options.keyPrefix !== '') options.keyPrefix = options.keyPrefix || keyPrefix || fixedT.keyPrefix; + const keySeparator = _this3.options.keySeparator || '.'; + let resultKey; + if (options.keyPrefix && Array.isArray(key)) { + resultKey = key.map(k => `${options.keyPrefix}${keySeparator}${k}`); + } else { + resultKey = options.keyPrefix ? `${options.keyPrefix}${keySeparator}${key}` : key; + } + return _this3.t(resultKey, options); + }; + if (typeof lng === 'string') { + fixedT.lng = lng; + } else { + fixedT.lngs = lng; + } + fixedT.ns = ns; + fixedT.keyPrefix = keyPrefix; + return fixedT; + } + t() { + return this.translator && this.translator.translate(...arguments); + } + exists() { + return this.translator && this.translator.exists(...arguments); + } + setDefaultNamespace(ns) { + this.options.defaultNS = ns; + } + hasLoadedNamespace(ns) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (!this.isInitialized) { + this.logger.warn('hasLoadedNamespace: i18next was not initialized', this.languages); + return false; + } + if (!this.languages || !this.languages.length) { + this.logger.warn('hasLoadedNamespace: i18n.languages were undefined or empty', this.languages); + return false; + } + const lng = options.lng || this.resolvedLanguage || this.languages[0]; + const fallbackLng = this.options ? this.options.fallbackLng : false; + const lastLng = this.languages[this.languages.length - 1]; + if (lng.toLowerCase() === 'cimode') return true; + const loadNotPending = (l, n) => { + const loadState = this.services.backendConnector.state[`${l}|${n}`]; + return loadState === -1 || loadState === 0 || loadState === 2; + }; + if (options.precheck) { + const preResult = options.precheck(this, loadNotPending); + if (preResult !== undefined) return preResult; + } + if (this.hasResourceBundle(lng, ns)) return true; + if (!this.services.backendConnector.backend || this.options.resources && !this.options.partialBundledLanguages) return true; + if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true; + return false; + } + loadNamespaces(ns, callback) { + const deferred = defer(); + if (!this.options.ns) { + if (callback) callback(); + return Promise.resolve(); + } + if (typeof ns === 'string') ns = [ns]; + ns.forEach(n => { + if (this.options.ns.indexOf(n) < 0) this.options.ns.push(n); + }); + this.loadResources(err => { + deferred.resolve(); + if (callback) callback(err); + }); + return deferred; + } + loadLanguages(lngs, callback) { + const deferred = defer(); + if (typeof lngs === 'string') lngs = [lngs]; + const preloaded = this.options.preload || []; + const newLngs = lngs.filter(lng => preloaded.indexOf(lng) < 0 && this.services.languageUtils.isSupportedCode(lng)); + if (!newLngs.length) { + if (callback) callback(); + return Promise.resolve(); + } + this.options.preload = preloaded.concat(newLngs); + this.loadResources(err => { + deferred.resolve(); + if (callback) callback(err); + }); + return deferred; + } + dir(lng) { + if (!lng) lng = this.resolvedLanguage || (this.languages && this.languages.length > 0 ? this.languages[0] : this.language); + if (!lng) return 'rtl'; + const rtlLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ug', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam', 'ckb']; + const languageUtils = this.services && this.services.languageUtils || new LanguageUtil(get()); + return rtlLngs.indexOf(languageUtils.getLanguagePartFromCode(lng)) > -1 || lng.toLowerCase().indexOf('-arab') > 1 ? 'rtl' : 'ltr'; + } + static createInstance() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let callback = arguments.length > 1 ? arguments[1] : undefined; + return new I18n(options, callback); + } + cloneInstance() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop; + const forkResourceStore = options.forkResourceStore; + if (forkResourceStore) delete options.forkResourceStore; + const mergedOptions = { + ...this.options, + ...options, + ...{ + isClone: true + } + }; + const clone = new I18n(mergedOptions); + if (options.debug !== undefined || options.prefix !== undefined) { + clone.logger = clone.logger.clone(options); + } + const membersToCopy = ['store', 'services', 'language']; + membersToCopy.forEach(m => { + clone[m] = this[m]; + }); + clone.services = { + ...this.services + }; + clone.services.utils = { + hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone) + }; + if (forkResourceStore) { + clone.store = new ResourceStore(this.store.data, mergedOptions); + clone.services.resourceStore = clone.store; + } + clone.translator = new Translator(clone.services, mergedOptions); + clone.translator.on('*', function (event) { + for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + args[_key4 - 1] = arguments[_key4]; + } + clone.emit(event, ...args); + }); + clone.init(mergedOptions, callback); + clone.translator.options = mergedOptions; + clone.translator.backendConnector.services.utils = { + hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone) + }; + return clone; + } + toJSON() { + return { + options: this.options, + store: this.store, + language: this.language, + languages: this.languages, + resolvedLanguage: this.resolvedLanguage + }; + } +} +const instance = I18n.createInstance(); +instance.createInstance = I18n.createInstance; + +const createInstance = instance.createInstance; +const dir = instance.dir; +const init = instance.init; +const loadResources = instance.loadResources; +const reloadResources = instance.reloadResources; +const use = instance.use; +const changeLanguage = instance.changeLanguage; +const getFixedT = instance.getFixedT; +const t = instance.t; +const exists = instance.exists; +const setDefaultNamespace = instance.setDefaultNamespace; +const hasLoadedNamespace = instance.hasLoadedNamespace; +const loadNamespaces = instance.loadNamespaces; +const loadLanguages = instance.loadLanguages; + + + + /***/ }), /***/ "./node_modules/idb-keyval/dist/index.js": @@ -207068,6 +246931,981 @@ function getGlobalContext() { /***/ }), +/***/ "./node_modules/react-i18next/dist/es/I18nextProvider.js": +/*!***************************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/I18nextProvider.js ***! + \***************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ I18nextProvider: () => (/* binding */ I18nextProvider) +/* harmony export */ }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js"); + + +function I18nextProvider({ + i18n, + defaultNS, + children +}) { + const value = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({ + i18n, + defaultNS + }), [i18n, defaultNS]); + return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_context_js__WEBPACK_IMPORTED_MODULE_1__.I18nContext.Provider, { + value + }, children); +} + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/Trans.js": +/*!*****************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/Trans.js ***! + \*****************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Trans: () => (/* binding */ Trans), +/* harmony export */ nodesToString: () => (/* reexport safe */ _TransWithoutContext_js__WEBPACK_IMPORTED_MODULE_1__.nodesToString) +/* harmony export */ }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var _TransWithoutContext_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TransWithoutContext.js */ "./node_modules/react-i18next/dist/es/TransWithoutContext.js"); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js"); + + + + +function Trans({ + children, + count, + parent, + i18nKey, + context, + tOptions = {}, + values, + defaults, + components, + ns, + i18n: i18nFromProps, + t: tFromProps, + shouldUnescape, + ...additionalProps +}) { + const { + i18n: i18nFromContext, + defaultNS: defaultNSFromContext + } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_js__WEBPACK_IMPORTED_MODULE_2__.I18nContext) || {}; + const i18n = i18nFromProps || i18nFromContext || (0,_context_js__WEBPACK_IMPORTED_MODULE_2__.getI18n)(); + const t = tFromProps || i18n?.t.bind(i18n); + return (0,_TransWithoutContext_js__WEBPACK_IMPORTED_MODULE_1__.Trans)({ + children, + count, + parent, + i18nKey, + context, + tOptions, + values, + defaults, + components, + ns: ns || t?.ns || defaultNSFromContext || i18n?.options?.defaultNS, + i18n, + t: tFromProps, + shouldUnescape, + ...additionalProps + }); +} + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/TransWithoutContext.js": +/*!*******************************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/TransWithoutContext.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Trans: () => (/* binding */ Trans), +/* harmony export */ nodesToString: () => (/* binding */ nodesToString) +/* harmony export */ }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var html_parse_stringify__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! html-parse-stringify */ "./node_modules/html-parse-stringify/dist/html-parse-stringify.module.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./node_modules/react-i18next/dist/es/utils.js"); +/* harmony import */ var _defaults_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./defaults.js */ "./node_modules/react-i18next/dist/es/defaults.js"); +/* harmony import */ var _i18nInstance_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./i18nInstance.js */ "./node_modules/react-i18next/dist/es/i18nInstance.js"); + + + + + +const hasChildren = (node, checkLength) => { + if (!node) return false; + const base = node.props?.children ?? node.children; + if (checkLength) return base.length > 0; + return !!base; +}; +const getChildren = node => { + if (!node) return []; + const children = node.props?.children ?? node.children; + return node.props?.i18nIsDynamicList ? getAsArray(children) : children; +}; +const hasValidReactChildren = children => Array.isArray(children) && children.every(react__WEBPACK_IMPORTED_MODULE_0__.isValidElement); +const getAsArray = data => Array.isArray(data) ? data : [data]; +const mergeProps = (source, target) => { + const newTarget = { + ...target + }; + newTarget.props = Object.assign(source.props, target.props); + return newTarget; +}; +const nodesToString = (children, i18nOptions) => { + if (!children) return ''; + let stringNode = ''; + const childrenArray = getAsArray(children); + const keepArray = i18nOptions?.transSupportBasicHtmlNodes ? i18nOptions.transKeepBasicHtmlNodesFor ?? [] : []; + childrenArray.forEach((child, childIndex) => { + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(child)) { + stringNode += `${child}`; + } else if ((0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(child)) { + const { + props, + type + } = child; + const childPropsCount = Object.keys(props).length; + const shouldKeepChild = keepArray.indexOf(type) > -1; + const childChildren = props.children; + if (!childChildren && shouldKeepChild && !childPropsCount) { + stringNode += `<${type}/>`; + } else if (!childChildren && (!shouldKeepChild || childPropsCount) || props.i18nIsDynamicList) { + stringNode += `<${childIndex}>`; + } else if (shouldKeepChild && childPropsCount === 1 && (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(childChildren)) { + stringNode += `<${type}>${childChildren}`; + } else { + const content = nodesToString(childChildren, i18nOptions); + stringNode += `<${childIndex}>${content}`; + } + } else if (child === null) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warn)(`Trans: the passed in value is invalid - seems you passed in a null child.`); + } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(child)) { + const { + format, + ...clone + } = child; + const keys = Object.keys(clone); + if (keys.length === 1) { + const value = format ? `${keys[0]}, ${format}` : keys[0]; + stringNode += `{{${value}}}`; + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warn)(`react-i18next: the passed in object contained more than one variable - the object should look like {{ value, format }} where format is optional.`, child); + } + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warn)(`Trans: the passed in value is invalid - seems you passed in a variable like {number} - please pass in variables for interpolation as full objects like {{number}}.`, child); + } + }); + return stringNode; +}; +const renderNodes = (children, targetString, i18n, i18nOptions, combinedTOpts, shouldUnescape) => { + if (targetString === '') return []; + const keepArray = i18nOptions.transKeepBasicHtmlNodesFor || []; + const emptyChildrenButNeedsHandling = targetString && new RegExp(keepArray.map(keep => `<${keep}`).join('|')).test(targetString); + if (!children && !emptyChildrenButNeedsHandling && !shouldUnescape) return [targetString]; + const data = {}; + const getData = childs => { + const childrenArray = getAsArray(childs); + childrenArray.forEach(child => { + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(child)) return; + if (hasChildren(child)) getData(getChildren(child));else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(child) && !(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(child)) Object.assign(data, child); + }); + }; + getData(children); + const ast = html_parse_stringify__WEBPACK_IMPORTED_MODULE_1__["default"].parse(`<0>${targetString}`); + const opts = { + ...data, + ...combinedTOpts + }; + const renderInner = (child, node, rootReactNode) => { + const childs = getChildren(child); + const mappedChildren = mapAST(childs, node.children, rootReactNode); + return hasValidReactChildren(childs) && mappedChildren.length === 0 || child.props?.i18nIsDynamicList ? childs : mappedChildren; + }; + const pushTranslatedJSX = (child, inner, mem, i, isVoid) => { + if (child.dummy) { + child.children = inner; + mem.push((0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(child, { + key: i + }, isVoid ? undefined : inner)); + } else { + mem.push(...react__WEBPACK_IMPORTED_MODULE_0__.Children.map([child], c => { + const props = { + ...c.props + }; + delete props.i18nIsDynamicList; + return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(c.type, { + ...props, + key: i, + ref: c.ref + }, isVoid ? null : inner); + })); + } + }; + const mapAST = (reactNode, astNode, rootReactNode) => { + const reactNodes = getAsArray(reactNode); + const astNodes = getAsArray(astNode); + return astNodes.reduce((mem, node, i) => { + const translationContent = node.children?.[0]?.content && i18n.services.interpolator.interpolate(node.children[0].content, opts, i18n.language); + if (node.type === 'tag') { + let tmp = reactNodes[parseInt(node.name, 10)]; + if (rootReactNode.length === 1 && !tmp) tmp = rootReactNode[0][node.name]; + if (!tmp) tmp = {}; + const child = Object.keys(node.attrs).length !== 0 ? mergeProps({ + props: node.attrs + }, tmp) : tmp; + const isElement = (0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(child); + const isValidTranslationWithChildren = isElement && hasChildren(node, true) && !node.voidElement; + const isEmptyTransWithHTML = emptyChildrenButNeedsHandling && (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(child) && child.dummy && !isElement; + const isKnownComponent = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(children) && Object.hasOwnProperty.call(children, node.name); + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(child)) { + const value = i18n.services.interpolator.interpolate(child, opts, i18n.language); + mem.push(value); + } else if (hasChildren(child) || isValidTranslationWithChildren) { + const inner = renderInner(child, node, rootReactNode); + pushTranslatedJSX(child, inner, mem, i); + } else if (isEmptyTransWithHTML) { + const inner = mapAST(reactNodes, node.children, rootReactNode); + pushTranslatedJSX(child, inner, mem, i); + } else if (Number.isNaN(parseFloat(node.name))) { + if (isKnownComponent) { + const inner = renderInner(child, node, rootReactNode); + pushTranslatedJSX(child, inner, mem, i, node.voidElement); + } else if (i18nOptions.transSupportBasicHtmlNodes && keepArray.indexOf(node.name) > -1) { + if (node.voidElement) { + mem.push((0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(node.name, { + key: `${node.name}-${i}` + })); + } else { + const inner = mapAST(reactNodes, node.children, rootReactNode); + mem.push((0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(node.name, { + key: `${node.name}-${i}` + }, inner)); + } + } else if (node.voidElement) { + mem.push(`<${node.name} />`); + } else { + const inner = mapAST(reactNodes, node.children, rootReactNode); + mem.push(`<${node.name}>${inner}`); + } + } else if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(child) && !isElement) { + const content = node.children[0] ? translationContent : null; + if (content) mem.push(content); + } else { + pushTranslatedJSX(child, translationContent, mem, i, node.children.length !== 1 || !translationContent); + } + } else if (node.type === 'text') { + const wrapTextNodes = i18nOptions.transWrapTextNodes; + const content = shouldUnescape ? i18nOptions.unescape(i18n.services.interpolator.interpolate(node.content, opts, i18n.language)) : i18n.services.interpolator.interpolate(node.content, opts, i18n.language); + if (wrapTextNodes) { + mem.push((0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(wrapTextNodes, { + key: `${node.name}-${i}` + }, content)); + } else { + mem.push(content); + } + } + return mem; + }, []); + }; + const result = mapAST([{ + dummy: true, + children: children || [] + }], ast, getAsArray(children || [])); + return getChildren(result[0]); +}; +function Trans({ + children, + count, + parent, + i18nKey, + context, + tOptions = {}, + values, + defaults, + components, + ns, + i18n: i18nFromProps, + t: tFromProps, + shouldUnescape, + ...additionalProps +}) { + const i18n = i18nFromProps || (0,_i18nInstance_js__WEBPACK_IMPORTED_MODULE_4__.getI18n)(); + if (!i18n) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warnOnce)('You will need to pass in an i18next instance by using i18nextReactModule'); + return children; + } + const t = tFromProps || i18n.t.bind(i18n) || (k => k); + const reactI18nextOptions = { + ...(0,_defaults_js__WEBPACK_IMPORTED_MODULE_3__.getDefaults)(), + ...i18n.options?.react + }; + let namespaces = ns || t.ns || i18n.options?.defaultNS; + namespaces = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(namespaces) ? [namespaces] : namespaces || ['translation']; + const nodeAsString = nodesToString(children, reactI18nextOptions); + const defaultValue = defaults || nodeAsString || reactI18nextOptions.transEmptyNodeValue || i18nKey; + const { + hashTransKey + } = reactI18nextOptions; + const key = i18nKey || (hashTransKey ? hashTransKey(nodeAsString || defaultValue) : nodeAsString || defaultValue); + if (i18n.options?.interpolation?.defaultVariables) { + values = values && Object.keys(values).length > 0 ? { + ...values, + ...i18n.options.interpolation.defaultVariables + } : { + ...i18n.options.interpolation.defaultVariables + }; + } + const interpolationOverride = values || count !== undefined || !children ? tOptions.interpolation : { + interpolation: { + ...tOptions.interpolation, + prefix: '#$?', + suffix: '?$#' + } + }; + const combinedTOpts = { + ...tOptions, + context: context || tOptions.context, + count, + ...values, + ...interpolationOverride, + defaultValue, + ns: namespaces + }; + const translation = key ? t(key, combinedTOpts) : defaultValue; + if (components) { + Object.keys(components).forEach(c => { + const comp = components[c]; + if (typeof comp.type === 'function' || !comp.props || !comp.props.children || translation.indexOf(`${c}/>`) < 0 && translation.indexOf(`${c} />`) < 0) return; + function Componentized() { + return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, comp); + } + components[c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(Componentized); + }); + } + const content = renderNodes(components || children, translation, i18n, reactI18nextOptions, combinedTOpts, shouldUnescape); + const useAsParent = parent ?? reactI18nextOptions.defaultTransParent; + return useAsParent ? (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(useAsParent, additionalProps, content) : content; +} + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/Translation.js": +/*!***********************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/Translation.js ***! + \***********************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Translation: () => (/* binding */ Translation) +/* harmony export */ }); +/* harmony import */ var _useTranslation_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./useTranslation.js */ "./node_modules/react-i18next/dist/es/useTranslation.js"); + +const Translation = ({ + ns, + children, + ...options +}) => { + const [t, i18n, ready] = (0,_useTranslation_js__WEBPACK_IMPORTED_MODULE_0__.useTranslation)(ns, options); + return children(t, { + i18n, + lng: i18n.language + }, ready); +}; + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/context.js": +/*!*******************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/context.js ***! + \*******************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ I18nContext: () => (/* binding */ I18nContext), +/* harmony export */ ReportNamespaces: () => (/* binding */ ReportNamespaces), +/* harmony export */ composeInitialProps: () => (/* binding */ composeInitialProps), +/* harmony export */ getDefaults: () => (/* reexport safe */ _defaults_js__WEBPACK_IMPORTED_MODULE_1__.getDefaults), +/* harmony export */ getI18n: () => (/* reexport safe */ _i18nInstance_js__WEBPACK_IMPORTED_MODULE_2__.getI18n), +/* harmony export */ getInitialProps: () => (/* binding */ getInitialProps), +/* harmony export */ initReactI18next: () => (/* reexport safe */ _initReactI18next_js__WEBPACK_IMPORTED_MODULE_3__.initReactI18next), +/* harmony export */ setDefaults: () => (/* reexport safe */ _defaults_js__WEBPACK_IMPORTED_MODULE_1__.setDefaults), +/* harmony export */ setI18n: () => (/* reexport safe */ _i18nInstance_js__WEBPACK_IMPORTED_MODULE_2__.setI18n) +/* harmony export */ }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var _defaults_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaults.js */ "./node_modules/react-i18next/dist/es/defaults.js"); +/* harmony import */ var _i18nInstance_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./i18nInstance.js */ "./node_modules/react-i18next/dist/es/i18nInstance.js"); +/* harmony import */ var _initReactI18next_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./initReactI18next.js */ "./node_modules/react-i18next/dist/es/initReactI18next.js"); + + + + + +const I18nContext = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(); +class ReportNamespaces { + constructor() { + this.usedNamespaces = {}; + } + addUsedNamespaces(namespaces) { + namespaces.forEach(ns => { + this.usedNamespaces[ns] ??= true; + }); + } + getUsedNamespaces() { + return Object.keys(this.usedNamespaces); + } +} +const composeInitialProps = ForComponent => async ctx => { + const componentsInitialProps = (await ForComponent.getInitialProps?.(ctx)) ?? {}; + const i18nInitialProps = getInitialProps(); + return { + ...componentsInitialProps, + ...i18nInitialProps + }; +}; +const getInitialProps = () => { + const i18n = (0,_i18nInstance_js__WEBPACK_IMPORTED_MODULE_2__.getI18n)(); + const namespaces = i18n.reportNamespaces?.getUsedNamespaces() ?? []; + const ret = {}; + const initialI18nStore = {}; + i18n.languages.forEach(l => { + initialI18nStore[l] = {}; + namespaces.forEach(ns => { + initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {}; + }); + }); + ret.initialI18nStore = initialI18nStore; + ret.initialLanguage = i18n.language; + return ret; +}; + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/defaults.js": +/*!********************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/defaults.js ***! + \********************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getDefaults: () => (/* binding */ getDefaults), +/* harmony export */ setDefaults: () => (/* binding */ setDefaults) +/* harmony export */ }); +/* harmony import */ var _unescape_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./unescape.js */ "./node_modules/react-i18next/dist/es/unescape.js"); + +let defaultOptions = { + bindI18n: 'languageChanged', + bindI18nStore: '', + transEmptyNodeValue: '', + transSupportBasicHtmlNodes: true, + transWrapTextNodes: '', + transKeepBasicHtmlNodesFor: ['br', 'strong', 'i', 'p'], + useSuspense: true, + unescape: _unescape_js__WEBPACK_IMPORTED_MODULE_0__.unescape +}; +const setDefaults = (options = {}) => { + defaultOptions = { + ...defaultOptions, + ...options + }; +}; +const getDefaults = () => defaultOptions; + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/i18nInstance.js": +/*!************************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/i18nInstance.js ***! + \************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getI18n: () => (/* binding */ getI18n), +/* harmony export */ setI18n: () => (/* binding */ setI18n) +/* harmony export */ }); +let i18nInstance; +const setI18n = instance => { + i18nInstance = instance; +}; +const getI18n = () => i18nInstance; + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/index.js": +/*!*****************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/index.js ***! + \*****************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ I18nContext: () => (/* reexport safe */ _context_js__WEBPACK_IMPORTED_MODULE_11__.I18nContext), +/* harmony export */ I18nextProvider: () => (/* reexport safe */ _I18nextProvider_js__WEBPACK_IMPORTED_MODULE_5__.I18nextProvider), +/* harmony export */ Trans: () => (/* reexport safe */ _Trans_js__WEBPACK_IMPORTED_MODULE_0__.Trans), +/* harmony export */ TransWithoutContext: () => (/* reexport safe */ _TransWithoutContext_js__WEBPACK_IMPORTED_MODULE_1__.Trans), +/* harmony export */ Translation: () => (/* reexport safe */ _Translation_js__WEBPACK_IMPORTED_MODULE_4__.Translation), +/* harmony export */ composeInitialProps: () => (/* reexport safe */ _context_js__WEBPACK_IMPORTED_MODULE_11__.composeInitialProps), +/* harmony export */ date: () => (/* binding */ date), +/* harmony export */ getDefaults: () => (/* reexport safe */ _defaults_js__WEBPACK_IMPORTED_MODULE_9__.getDefaults), +/* harmony export */ getI18n: () => (/* reexport safe */ _i18nInstance_js__WEBPACK_IMPORTED_MODULE_10__.getI18n), +/* harmony export */ getInitialProps: () => (/* reexport safe */ _context_js__WEBPACK_IMPORTED_MODULE_11__.getInitialProps), +/* harmony export */ initReactI18next: () => (/* reexport safe */ _initReactI18next_js__WEBPACK_IMPORTED_MODULE_8__.initReactI18next), +/* harmony export */ number: () => (/* binding */ number), +/* harmony export */ plural: () => (/* binding */ plural), +/* harmony export */ select: () => (/* binding */ select), +/* harmony export */ selectOrdinal: () => (/* binding */ selectOrdinal), +/* harmony export */ setDefaults: () => (/* reexport safe */ _defaults_js__WEBPACK_IMPORTED_MODULE_9__.setDefaults), +/* harmony export */ setI18n: () => (/* reexport safe */ _i18nInstance_js__WEBPACK_IMPORTED_MODULE_10__.setI18n), +/* harmony export */ time: () => (/* binding */ time), +/* harmony export */ useSSR: () => (/* reexport safe */ _useSSR_js__WEBPACK_IMPORTED_MODULE_7__.useSSR), +/* harmony export */ useTranslation: () => (/* reexport safe */ _useTranslation_js__WEBPACK_IMPORTED_MODULE_2__.useTranslation), +/* harmony export */ withSSR: () => (/* reexport safe */ _withSSR_js__WEBPACK_IMPORTED_MODULE_6__.withSSR), +/* harmony export */ withTranslation: () => (/* reexport safe */ _withTranslation_js__WEBPACK_IMPORTED_MODULE_3__.withTranslation) +/* harmony export */ }); +/* harmony import */ var _Trans_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Trans.js */ "./node_modules/react-i18next/dist/es/Trans.js"); +/* harmony import */ var _TransWithoutContext_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TransWithoutContext.js */ "./node_modules/react-i18next/dist/es/TransWithoutContext.js"); +/* harmony import */ var _useTranslation_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./useTranslation.js */ "./node_modules/react-i18next/dist/es/useTranslation.js"); +/* harmony import */ var _withTranslation_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./withTranslation.js */ "./node_modules/react-i18next/dist/es/withTranslation.js"); +/* harmony import */ var _Translation_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Translation.js */ "./node_modules/react-i18next/dist/es/Translation.js"); +/* harmony import */ var _I18nextProvider_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./I18nextProvider.js */ "./node_modules/react-i18next/dist/es/I18nextProvider.js"); +/* harmony import */ var _withSSR_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./withSSR.js */ "./node_modules/react-i18next/dist/es/withSSR.js"); +/* harmony import */ var _useSSR_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./useSSR.js */ "./node_modules/react-i18next/dist/es/useSSR.js"); +/* harmony import */ var _initReactI18next_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./initReactI18next.js */ "./node_modules/react-i18next/dist/es/initReactI18next.js"); +/* harmony import */ var _defaults_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./defaults.js */ "./node_modules/react-i18next/dist/es/defaults.js"); +/* harmony import */ var _i18nInstance_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./i18nInstance.js */ "./node_modules/react-i18next/dist/es/i18nInstance.js"); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js"); + + + + + + + + + + + + +const date = () => ''; +const time = () => ''; +const number = () => ''; +const select = () => ''; +const plural = () => ''; +const selectOrdinal = () => ''; + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/initReactI18next.js": +/*!****************************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/initReactI18next.js ***! + \****************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ initReactI18next: () => (/* binding */ initReactI18next) +/* harmony export */ }); +/* harmony import */ var _defaults_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaults.js */ "./node_modules/react-i18next/dist/es/defaults.js"); +/* harmony import */ var _i18nInstance_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./i18nInstance.js */ "./node_modules/react-i18next/dist/es/i18nInstance.js"); + + +const initReactI18next = { + type: '3rdParty', + init(instance) { + (0,_defaults_js__WEBPACK_IMPORTED_MODULE_0__.setDefaults)(instance.options.react); + (0,_i18nInstance_js__WEBPACK_IMPORTED_MODULE_1__.setI18n)(instance); + } +}; + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/unescape.js": +/*!********************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/unescape.js ***! + \********************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ unescape: () => (/* binding */ unescape) +/* harmony export */ }); +const matchHtmlEntity = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g; +const htmlEntities = { + '&': '&', + '&': '&', + '<': '<', + '<': '<', + '>': '>', + '>': '>', + ''': "'", + ''': "'", + '"': '"', + '"': '"', + ' ': ' ', + ' ': ' ', + '©': '©', + '©': '©', + '®': '®', + '®': '®', + '…': '…', + '…': '…', + '/': '/', + '/': '/' +}; +const unescapeHtmlEntity = m => htmlEntities[m]; +const unescape = text => text.replace(matchHtmlEntity, unescapeHtmlEntity); + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/useSSR.js": +/*!******************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/useSSR.js ***! + \******************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ useSSR: () => (/* binding */ useSSR) +/* harmony export */ }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js"); + + +const useSSR = (initialI18nStore, initialLanguage, props = {}) => { + const { + i18n: i18nFromProps + } = props; + const { + i18n: i18nFromContext + } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_js__WEBPACK_IMPORTED_MODULE_1__.I18nContext) || {}; + const i18n = i18nFromProps || i18nFromContext || (0,_context_js__WEBPACK_IMPORTED_MODULE_1__.getI18n)(); + if (i18n.options?.isClone) return; + if (initialI18nStore && !i18n.initializedStoreOnce) { + i18n.services.resourceStore.data = initialI18nStore; + i18n.options.ns = Object.values(initialI18nStore).reduce((mem, lngResources) => { + Object.keys(lngResources).forEach(ns => { + if (mem.indexOf(ns) < 0) mem.push(ns); + }); + return mem; + }, i18n.options.ns); + i18n.initializedStoreOnce = true; + i18n.isInitialized = true; + } + if (initialLanguage && !i18n.initializedLanguageOnce) { + i18n.changeLanguage(initialLanguage); + i18n.initializedLanguageOnce = true; + } +}; + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/useTranslation.js": +/*!**************************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/useTranslation.js ***! + \**************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ useTranslation: () => (/* binding */ useTranslation) +/* harmony export */ }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./node_modules/react-i18next/dist/es/utils.js"); + + + +const usePrevious = (value, ignore) => { + const ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(); + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { + ref.current = ignore ? ref.current : value; + }, [value, ignore]); + return ref.current; +}; +const alwaysNewT = (i18n, language, namespace, keyPrefix) => i18n.getFixedT(language, namespace, keyPrefix); +const useMemoizedT = (i18n, language, namespace, keyPrefix) => (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(alwaysNewT(i18n, language, namespace, keyPrefix), [i18n, language, namespace, keyPrefix]); +const useTranslation = (ns, props = {}) => { + const { + i18n: i18nFromProps + } = props; + const { + i18n: i18nFromContext, + defaultNS: defaultNSFromContext + } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_js__WEBPACK_IMPORTED_MODULE_1__.I18nContext) || {}; + const i18n = i18nFromProps || i18nFromContext || (0,_context_js__WEBPACK_IMPORTED_MODULE_1__.getI18n)(); + if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new _context_js__WEBPACK_IMPORTED_MODULE_1__.ReportNamespaces(); + if (!i18n) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warnOnce)('You will need to pass in an i18next instance by using initReactI18next'); + const notReadyT = (k, optsOrDefaultValue) => { + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(optsOrDefaultValue)) return optsOrDefaultValue; + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isObject)(optsOrDefaultValue) && (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(optsOrDefaultValue.defaultValue)) return optsOrDefaultValue.defaultValue; + return Array.isArray(k) ? k[k.length - 1] : k; + }; + const retNotReady = [notReadyT, {}, false]; + retNotReady.t = notReadyT; + retNotReady.i18n = {}; + retNotReady.ready = false; + return retNotReady; + } + if (i18n.options.react?.wait) (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.warnOnce)('It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.'); + const i18nOptions = { + ...(0,_context_js__WEBPACK_IMPORTED_MODULE_1__.getDefaults)(), + ...i18n.options.react, + ...props + }; + const { + useSuspense, + keyPrefix + } = i18nOptions; + let namespaces = ns || defaultNSFromContext || i18n.options?.defaultNS; + namespaces = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isString)(namespaces) ? [namespaces] : namespaces || ['translation']; + i18n.reportNamespaces.addUsedNamespaces?.(namespaces); + const ready = (i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(n => (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.hasLoadedNamespace)(n, i18n, i18nOptions)); + const memoGetT = useMemoizedT(i18n, props.lng || null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix); + const getT = () => memoGetT; + const getNewT = () => alwaysNewT(i18n, props.lng || null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix); + const [t, setT] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(getT); + let joinedNS = namespaces.join(); + if (props.lng) joinedNS = `${props.lng}${joinedNS}`; + const previousJoinedNS = usePrevious(joinedNS); + const isMounted = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(true); + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { + const { + bindI18n, + bindI18nStore + } = i18nOptions; + isMounted.current = true; + if (!ready && !useSuspense) { + if (props.lng) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.loadLanguages)(i18n, props.lng, namespaces, () => { + if (isMounted.current) setT(getNewT); + }); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.loadNamespaces)(i18n, namespaces, () => { + if (isMounted.current) setT(getNewT); + }); + } + } + if (ready && previousJoinedNS && previousJoinedNS !== joinedNS && isMounted.current) { + setT(getNewT); + } + const boundReset = () => { + if (isMounted.current) setT(getNewT); + }; + if (bindI18n) i18n?.on(bindI18n, boundReset); + if (bindI18nStore) i18n?.store.on(bindI18nStore, boundReset); + return () => { + isMounted.current = false; + if (i18n) bindI18n?.split(' ').forEach(e => i18n.off(e, boundReset)); + if (bindI18nStore && i18n) bindI18nStore.split(' ').forEach(e => i18n.store.off(e, boundReset)); + }; + }, [i18n, joinedNS]); + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { + if (isMounted.current && ready) { + setT(getT); + } + }, [i18n, keyPrefix, ready]); + const ret = [t, i18n, ready]; + ret.t = t; + ret.i18n = i18n; + ret.ready = ready; + if (ready) return ret; + if (!ready && !useSuspense) return ret; + throw new Promise(resolve => { + if (props.lng) { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.loadLanguages)(i18n, props.lng, namespaces, () => resolve()); + } else { + (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.loadNamespaces)(i18n, namespaces, () => resolve()); + } + }); +}; + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/utils.js": +/*!*****************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/utils.js ***! + \*****************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ getDisplayName: () => (/* binding */ getDisplayName), +/* harmony export */ hasLoadedNamespace: () => (/* binding */ hasLoadedNamespace), +/* harmony export */ isObject: () => (/* binding */ isObject), +/* harmony export */ isString: () => (/* binding */ isString), +/* harmony export */ loadLanguages: () => (/* binding */ loadLanguages), +/* harmony export */ loadNamespaces: () => (/* binding */ loadNamespaces), +/* harmony export */ warn: () => (/* binding */ warn), +/* harmony export */ warnOnce: () => (/* binding */ warnOnce) +/* harmony export */ }); +const warn = (...args) => { + if (console?.warn) { + if (isString(args[0])) args[0] = `react-i18next:: ${args[0]}`; + console.warn(...args); + } +}; +const alreadyWarned = {}; +const warnOnce = (...args) => { + if (isString(args[0]) && alreadyWarned[args[0]]) return; + if (isString(args[0])) alreadyWarned[args[0]] = new Date(); + warn(...args); +}; +const loadedClb = (i18n, cb) => () => { + if (i18n.isInitialized) { + cb(); + } else { + const initialized = () => { + setTimeout(() => { + i18n.off('initialized', initialized); + }, 0); + cb(); + }; + i18n.on('initialized', initialized); + } +}; +const loadNamespaces = (i18n, ns, cb) => { + i18n.loadNamespaces(ns, loadedClb(i18n, cb)); +}; +const loadLanguages = (i18n, lng, ns, cb) => { + if (isString(ns)) ns = [ns]; + ns.forEach(n => { + if (i18n.options.ns.indexOf(n) < 0) i18n.options.ns.push(n); + }); + i18n.loadLanguages(lng, loadedClb(i18n, cb)); +}; +const hasLoadedNamespace = (ns, i18n, options = {}) => { + if (!i18n.languages || !i18n.languages.length) { + warnOnce('i18n.languages were undefined or empty', i18n.languages); + return true; + } + return i18n.hasLoadedNamespace(ns, { + lng: options.lng, + precheck: (i18nInstance, loadNotPending) => { + if (options.bindI18n?.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false; + } + }); +}; +const getDisplayName = Component => Component.displayName || Component.name || (isString(Component) && Component.length > 0 ? Component : 'Unknown'); +const isString = obj => typeof obj === 'string'; +const isObject = obj => typeof obj === 'object' && obj !== null; + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/withSSR.js": +/*!*******************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/withSSR.js ***! + \*******************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ withSSR: () => (/* binding */ withSSR) +/* harmony export */ }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var _useSSR_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useSSR.js */ "./node_modules/react-i18next/dist/es/useSSR.js"); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context.js */ "./node_modules/react-i18next/dist/es/context.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils.js */ "./node_modules/react-i18next/dist/es/utils.js"); + + + + +const withSSR = () => function Extend(WrappedComponent) { + function I18nextWithSSR({ + initialI18nStore, + initialLanguage, + ...rest + }) { + (0,_useSSR_js__WEBPACK_IMPORTED_MODULE_1__.useSSR)(initialI18nStore, initialLanguage); + return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(WrappedComponent, { + ...rest + }); + } + I18nextWithSSR.getInitialProps = (0,_context_js__WEBPACK_IMPORTED_MODULE_2__.composeInitialProps)(WrappedComponent); + I18nextWithSSR.displayName = `withI18nextSSR(${(0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.getDisplayName)(WrappedComponent)})`; + I18nextWithSSR.WrappedComponent = WrappedComponent; + return I18nextWithSSR; +}; + +/***/ }), + +/***/ "./node_modules/react-i18next/dist/es/withTranslation.js": +/*!***************************************************************!*\ + !*** ./node_modules/react-i18next/dist/es/withTranslation.js ***! + \***************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ withTranslation: () => (/* binding */ withTranslation) +/* harmony export */ }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var _useTranslation_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useTranslation.js */ "./node_modules/react-i18next/dist/es/useTranslation.js"); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils.js */ "./node_modules/react-i18next/dist/es/utils.js"); + + + +const withTranslation = (ns, options = {}) => function Extend(WrappedComponent) { + function I18nextWithTranslation({ + forwardedRef, + ...rest + }) { + const [t, i18n, ready] = (0,_useTranslation_js__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(ns, { + ...rest, + keyPrefix: options.keyPrefix + }); + const passDownProps = { + ...rest, + t, + i18n, + tReady: ready + }; + if (options.withRef && forwardedRef) { + passDownProps.ref = forwardedRef; + } else if (!options.withRef && forwardedRef) { + passDownProps.forwardedRef = forwardedRef; + } + return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(WrappedComponent, passDownProps); + } + I18nextWithTranslation.displayName = `withI18nextTranslation(${(0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.getDisplayName)(WrappedComponent)})`; + I18nextWithTranslation.WrappedComponent = WrappedComponent; + const forwardRef = (props, ref) => (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(I18nextWithTranslation, Object.assign({}, props, { + forwardedRef: ref + })); + return options.withRef ? (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(forwardRef) : I18nextWithTranslation; +}; + +/***/ }), + /***/ "./node_modules/react-pdf/dist/esm/Document.js": /*!*****************************************************!*\ !*** ./node_modules/react-pdf/dist/esm/Document.js ***! @@ -212510,6 +253348,28 @@ module.exports = "eJxtmNtu20YQhl+F4FULyMGeD7pz3AY1ChtG7NpFA18w1NomIlECSRcxgrx7SV "use strict"; module.exports = "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"; +/***/ }), + +/***/ "./src/script/locales/en/translation.json": +/*!************************************************!*\ + !*** ./src/script/locales/en/translation.json ***! + \************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = /*#__PURE__*/JSON.parse('{"create-account":"Create Account","login":"Login","language":"Language","name":"Name","phone":"Phone","email":"Email","company":"Company","job-title":"Job title","profile":"Profile","log-out":"Log Out","is-email-verified":"Is Email verified","public-profile":"Public profile","tagline":"Tagline ","has-requested-you-to-sign":"has requested you to sign","has-requested-you-to-review-and-sign":" has requested you to review and sign","input-required":"Please fill out this field.","sort-order":{"Ascending":"Ascending","Descending":"Descending","Name":"Name","Date":"Date"},"context-menu":{"Download":"Download","Rename":"Rename","Move":"Move","Delete":"Delete"},"action":"Action","add":"Add","add-new-folder":"Add a new folder","disable-documentId":"Disable DocumentId","edit":"Edit","change-password":"Change Password","save":"Save","cancel":"Cancel","upgrade-now":"Upgrade now","upgrade-to":"Upgrade to","plan":"Plan","subscribe-card-plan":"Unlock premium features starting at just {{premiumPrice}}/month. Enjoy enhanced performance and only {{addonPrice}} per additional credit after your included premium credits.","user-name-limit-char":"To have a username less than 8 character please subscribe","tour-content":"Don\'t show this again","pro":"PRO","team":"TEAM","user":"User","docs":"Docs","session-expired":"Your session has expired.","public-profile-help":"This is your public URL. Copy or share it with the signer, and you will be able to see all your publicly set templates.","tagline-help":"This Tagline will appear on your OpenSign public profile for ex. https://opensign.me/alex","welcome":"Welcome Back!","Login-to-your-account":"Login to your account","password":"Password","forgot-password":"Forgot Password?","loading":"Loading...","of":"of","sign-SSO":"Sign in with SSO","login-page":"Login Page","or":"OR","signup-page":"Signup page","password-length":"Password should be 8 characters long","password-case":"Password should contain uppercase letter, lowercase letter, digit","password-special-char":" Password should contain special character","agreee":"I agree to the","term":"Terms of Service","subscribe-to-opensign":"Subscribe to OpenSign newsletter","register":"Register","sidebar":{"Dashboard":"Dashboard","Sign yourself":"Sign yourself","Request signatures":"Request signatures","Templates":"Templates","Templates-Children":{"Create template":"Create template","Manage templates":"Manage templates"},"OpenSign™ Drive":"OpenSign™ Drive","Reports":"Reports","Reports-Children":{"Need your sign":"Need your sign","In Progress":"In Progress","Completed":"Completed","Drafts":"Drafts","Declined":"Declined","Expired":"Expired","Contactbook":"Contactbook"},"Settings":"Settings","Settings-Children":{"My Signature":"My Signature","API Token":"API Token","Webhook":"Webhook","Teams":"Teams","Team-update-successfully":"Team Updated successfully.","Users":"Users"}},"dashboard-card":{"Need your Signature":"Need your Signature","Out for signatures":"Out for Signatures"},"report-name":{"Draft Documents":"Draft Documents","Need your sign":"Need your sign","In-progress documents":"In-progress documents","Completed Documents":"Completed Documents","Declined Documents":"Declined Documents","Expired Documents":"Expired Documents","Recently sent for signatures":"Recently sent for signatures","Recent signature requests":"Recent signature requests","Drafts":"Drafts","Contactbook":"Contactbook","Templates":"Templates","Teams":"Teams","Users":"Users"},"btnLabel":{"sign":"sign","Sign":"SIGN","Resend":"Resend","Revoke":"Revoke","Delete":"Delete","Use":"Use","Quick send":"Quick send","Edit":"Edit","Share with team":"Share with team","Share":"Share","View":"View","option":"Option"},"report-heading":{"Sr.No":"Sr.No","Title":"Title","Email":"Email","Phone":"Phone","File":"File","Owner":"Owner","Signers":"Signers","Note":"Note","Folder":"Folder","Reason":"Reason","Parent Team":"Parent Team","Active":"Active","Role":"Role","Team":"Team","Name":"Name","Status":"Status","created-date":"Created Date","Type":"Type"},"report-help":{"Draft Documents":"These are documents you have started but have not finalized for sending.","Need your sign":"This is a list of documents that are waiting for your signature","In-progress documents":"This is a list of documents you\'ve sent to other parties for signature.","Completed Documents":"This is a list of documents that have been signed by all parties.","Declined Documents":"This is a list of documents that have been declined by one of the signers.","Expired Documents":"This is a list of documents that have reached their expiration date.","Contactbook":"This is a list of contacts/signers added by you. These will appear as suggestions when you try to add signers to a new document.","Templates":"This is a list of templates that are available to you for creating documents. You can click the \'use\' button to create a new document using a template, modify the document & add signers in the next step."},"form-name":{"Sign Yourself":"Sign Yourself","Request Signatures":"Request Signatures","New Template":"New Template"},"file-type":"pdf, png, jpg, jpeg","docx":"docx","file-selected":"file selected","template-title":"Template Title","document-title":"Document Title","description":"Description","time-to-complete":"Time To Complete (Days)","send-in-order":"Send In Order","send-in-order-help":{"p1":"Choose how you want the signing requests to be sent to the document signers:","p2":"Selecting this option will send the signing request to the first signer initially. Once the first signer completes their part, the next signer in the sequence will receive the request. This process continues until all signers have signed the document. This method ensures that the document is signed in a specific order.","p3":"Selecting this option will send the signing links to all signers simultaneously. Every signer can sign the document at their convenience, regardless of whether other signers have completed their signatures. This method is faster but does not enforce any signing order among the participants.","p4":"Select the option that best suits the needs of your document processing."},"no":"No","auto-reminder":"Auto reminder","remind-once":" Remind once in every (Days)","next":"Next","select-folder":"Select Folder","OpenSign-drive":"OpenSign™ Drive","drive-document-status":{"Completed":"Completed","Declined":"Declined","Draft":"Draft","Expired":"Expired","In Progress":"In Progress"},"select-folder-help":"If you do not select a folder, your signed document will be saved in the Main OpenSign drive folder.","no-data":"No data found","save-here":"Save Here","back":"Back","add-folder":"Add folder","create-folder":"Create Folder","parent-folder":"Parent Folder","create":"Create","signers":"Signers","signers-help":"Begin typing a contact\'s name to see suggested signers from your saved contacts or add new ones. Arrange the signing order by adding signers in the desired sequence. Use the \'+\' button to include signers and the \'x\' to remove them. Each signer will receive an email prompt to sign the document in the order listed.","add-signer":"Add Signer","contact-not-found":"Contact not found","add-yourself":"Add Yourself","submit":"Submit","reset":"Reset","my-signature":"My Signature","signature":"Signature","upload-image":" Upload image","clear":"Clear","upload-signature/Image":"Please upload signature/Image","initials":"Initials","API":"API","api-token":"API Token","regenerate-token":"Regenerate Token","generate-token":"Generate Token","view-docs":"View Docs","generate-token-alert":"Are you sure you want to regenerate token it will expire old token?","yes":"Yes","copied":"Copied","something-went-wrong-mssg":"Something went wrong, please try again later.","token-generated":"Token generated successfully.","webhook":"Webhook","update-webhook":"Update Webhook","add-webhook":"Add Webhook","webhook-added":"Webhook added successfully.","team-disabled":"Team disabled","Team enabled":"Team enabled","are-you-sure":"Are you sure you want to","disable":"disable","enable":"enable","this-team":" this team?","edit-team":"Edit Team","name-of-team":"Name of Team","prev":"Prev","no-data-avaliable":"No Data Available","add-team":"Add Team","page-not-found":"Page Not Found","users-from-teams":"users from Teams","user-status":"User status","activate":"activate","deactivate":"deactivate","this-user":" this user","delete-user":"Delete User","delete":"delete","add-user":"Add User","password-generateed":"Password will only be generated once; make sure to copy it.","Team status":"Team status","user-deactivated":"User deactivated.","user-activated":"User activated.","public":"Public","download":"Download","view":"View","make-template-public":"Make template public","make-template-private":"Make template private","make-template-public-alert":"Are you sure you want to make this template public?","make-template-private-alert":"Are you sure you want to make this template private? This will remove it from your public profile.","public-role":"Public role","public-url":"Public URL","public-url-copy-mssg":" Here’s your public URL: Copy it or share it with the signer, and you will be able to see all your publicly set templates.","add-public-url-alert":"Please add your public URL, and you will be able to make a public template.","share-with-alert":"You cannot share a template if any roles already have contacts assigned. Please remove all contact assignments from the roles before sharing the template.","share-with":"Share with","team-not-found":"Team not found","roles":"Roles","delete-document":"Delete Document","delete-document-alert":"Are you sure you want to delete this document?","quick-send":"Quick send","add-new":"Add new","send":"Send","quick-send-alert-1":"All roles in this document are currently linked to contacts. To quick send copies of this template to multiple signers, please ensure that at least one role is not linked to any contact.","quick-send-alert-2":"Please ensure there\'s at least one signature widget added for all recipients.","quick-send-alert-3":"Please add at least one role to this template in order to \'quick send\' copies of it to multiple signers.","quick-send-alert-4":"Quick send reached limit.","copy-link":"Copy link","copy":"Copy","revoke-document":"Revoke document","revoke-document-alert":"Are you sure you want to revoke this document?","resend-mail":"Resend Mail","resend-mail-help":"You can use following variables which will get replaced with their actual values:- {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email}}, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.","subject":"Subject","body":"Body","add-contact":"Add Contact","add-signer-alert":"Contact already exist!","record-delete-alert":"Record deleted successfully!","record-revoke-alert":"Record revoked successfully!","mail-sent-alert":"Mail sent successfully.","document-sent-alert":"Document sent successfully!","template-share-alert":"Template Shared successfully.","template-public-alert-1":"You have successfully made the template public.","template-public-alert-2":"You have successfully made the template private.","template-public-alert-3":"You need to select a role for the public signers.","template-public-alert-4":"Please ensure there\'s at least one signature widget added for all signers.","template-public-alert-5":"Since this template has send-in-order enabled, the public role must be positioned at the top.","template-public-alert-6":"Please attach signers to all roles except for the public role user.","template-public-alert-7":"Please assign at least one public role to make this template public.","loader":" This might take some time","pages":"Pages","document-signed":"Document signed","close":"Close","validation-alert":"Validation alert","validate-alert-mssg":" The input does not meet the criteria set by the regular expression.","otp-verification":"OTP verification","enter-otp":"Enter OTP","verify":"Verify","verify-email-1":"Verify email","resend":"Resend","contact-details":"Contact Details","verify-email":"Please verify your email !","send-otp":" Send OTP","otp-placeholder":"Enter OTP received over email","loading-doc":"Loading Document..","widgets-name":{"signature":"signature","stamp":"stamp","initials":"initials","name":"name","job title":"job title","company":"company","date":"date","text":"text","text input":"text input","checkbox":"checkbox","dropdown":"dropdown","radio button":"radio button","image":"image","email":"email"},"fields":"Fields","recipients":"Recipients","please-add":"Please add a","signed-by":"Signed By","more":"more","sent":"sent","print":"Print","certificate":"Certificate","decline":"Decline","finish":"Finish","mail":"Mail","sign-now":"Sign Now","successfully-signed":"Successfully signed!","email-mssg":" Recipients added here will get a copy of the signed document.","email-error-1":" please provide correct email address","email-error-2":"You can only send to ten recipients at a time.","Email-verified-alert-1":"Email is verified.","Email-verified-alert-2":"Email is already verified.","upload-stamp-image":"Upload stamp image","draw":"Draw","type":"Type","color-type":{"red":"red","blue":"blue","black":"black","yellow":"yellow"},"my-initials":"My Initials","upload":"Upload","initial-teb":"Initials","signature-tab":"Signature","your-signature":"Your signature","copy-to-all-pages":"Copy to all pages","contact-delete-alert":"Are you sure you want to delete this contact?","reset-password-alert-1":"Reset password link has been sent to your email id","reset-password-alert-2":"Please setup email adapter ","reset-password-alert-3":"Reset Your Password","faild-animation":"Failed to load animation","apply":"Apply","copy-type":{"All pages":"All pages","All pages but last":"All pages but last","All pages but first":"All pages but first"},"options":"Options","minimun-check":"Minimun check","maximum-check":"Maximum check","default-value":"Default value","select":"Select","read-only":"Is read only","hide-labels":"Hide labels","checkbox":"Checkbox","alert":"Alert","zoom-in":"Zoom in","zoom-out":"Zoom out","document-signed-alert":"Congratulations! 🎉 This document has been successfully signed by you!","otp-sent-alert":"OTP sent on your email","fields-required":"Fields required","signature-widget-alert-1":"Please ensure there\'s at least one signature widget added","signature-widget-alert-2":"Please ensure all field is accurately filled and meets all requirements.","encrypted-pdf-alert":"Currently encrypted pdf files are not supported.","encrypted-pdf-alert-1":"PFX file password is invalid.","user-not-exist":"User does not exist","template-signature-field":"Please add at least one signature field for all roles.","template-role-alert":"Please add roles first","create-document":"Create Document","template-created-alert":"Do you want to create a document using the template you just created ?","signers-alert":"signers alert","template-creation-alert-1":"Please select signer for add placeholder!","ok":"Ok","radio-group":"Radio group","dropdown-options":"Dropdown options","add-role":"Add Role","role-ex":" e.g: Customer, Hr, Director, Manager, Student, etc","add/choose-signer":"Add/Choose Signer","choose-from-contacts":"Choose from contacts","select-signer":" Please select signer","edit-template":"Edit Template","widget-info":"Widget info","validation":"Validation","invalid-default-value":"invalid default value","hint":"Hint","color":"color","role-help":{"p1":"What are template roles?","p2":"Begin by specifying each role needed for the completion of the document. Think about the parties involved in the signing process and what their responsibilities are. Common roles include HR for internal documents, Customer for agreements or Vendor for business agreements.","p3":"Why pre-attach users to some roles?","p4":"For roles that consistently involve the same individual (e.g., the CEO\'s signature on employee offer letters), you can pre-attach a user to a role within the template. This step is optional but recommended for efficiency and consistency across documents.","p5":"When do i specify the user attached to each role?","p6":"When you create a document from your template, you\'ll be prompted to attach users to each defined role. If a role already has a user attached, this will be pre-filled, but you can modify it as needed before sending out the document."},"add-recipients":"Add recipients","loading-mssg":"This might take some time","send-mail":"Send Mail","placeholder-alert-1":"Please ensure there\'s at least one signature widget added for all recipients.","placeholder-alert-2":"Please confirm that you have filled the text field.","placeholder-alert-3":" Are you sure you want to send out this document for signatures?","placeholder-alert-4":"You have successfully sent mails to all recipients!","placeholder-alert-5":"Do you want to sign documents right now ?","placeholder-alert-6":"Please setup mail adapter to send mail!","placeholder-alert-7":"Please select signer for add placeholder!","email-subject":"email subject","email-body":"email body","email-placeholder":"add body of email","reset-to-default":"Reset to default","cutomize-email":"Cutomize Email","upgrade-to-customize-email":"Upgrade to customize Email","sign-url":"Sign url","Mails Sent":"Mails Sent","document-alert":"Document Alert","owner-subscription-expired":"Owner\'s subscription has expired.","subscription-expired":"Subscription Expired","alert-message":"Alert message","document-decline":"Document decline","decline-alert-1":"Are you sure want to decline this document ?","decline-alert-2":"You have declined this document!","decline-alert-3":"You can not sign this document as it has been declined/revoked.","sign here":"Sign here","guest-email-alert":"verification code is sent to your email","get-otp-alert":"you will get a OTP via Email","user-already-exist":"User already exist.","server-error":"Internal server error !","fill-required-details!":"Please fill required details!","sign-up-form":"Sign up form","sign-up":"Sign up","folder-already-exist!":"folder already exist!","please-select-position!":"please select position!","default-sign-alert":"Are you sure you want to auto sign at requested all locations?","Your-Signature":"Your Signature","auto-sign-all":"Auto Sign All","generating-certificate":"Generating certificate","pdf-download":"PDF Download","generate-certificate-alert":" Your completion certificate is being generated. Please wait momentarily. If the download doesn\'t start shortly, click the button again.","folder-already-exist":"Folder already exist!","folder-created-successfully":"Folder created successfully!","fill-folder-name":"Please fill folder name","already-exists-this-username":"User already exists with this username!","verification-code-sent":"Verification mail has been sent to your E-mail!","registered-user-successfully":"Registered user successfully.","role-not-found":"Role not found.","do-not-access":"You don\'t have access, please contact the admin.","add-admin":"Add admin","opensign-setup":"Opensign Setup","join-discord":"Join our discord server","admin-already-exist":"Admin already exist.","password-update-alert-1":"Password updated successfully.","password-update-alert-2":"Your current password is missing or incorrect.","password-update-alert-3":"Your current password is missing or incorrect.","password-update-alert-4":"Your password and confirmation password do not match.","current-password":"Current Password","new-password":"New Password","confirm-password":"Confirm Password","file-alert-1":"The selected file size is too large. Please select a file less than","file-alert-2":"Please select file.","file-alert-3":"Please wait while the document is being uploaded.","enter-pdf-password":"Enter Pdf Password","correct-password":"Please provide correct password","decrypting-pdf":" Decrypting pdf please wait...","invalid-otp":"Invalid Otp","user-not-found":"User not found!","enter-otp-alert":"Please Enter OTP!","get-verification-code":"Get verification code","get-verification-code-2":"You will get a verification code via Email","enter-verification-code":"Enter Verification Code","provide-your-details":"Provide your details","provide-email":"Please provide email.","additional-info":"Additional Info","signature-saved-alert":"Signature saved successfully.","fill-field":"Please fill out this field","error-template":"Error: Template not found!","error":"Error","invalid-document":"Error: invalid document!","document-not-found":"Document not Found!","document-signed-alert-1":"You have successfully signed the document. You can download or print a copy of the partially signed document. A copy of the digitally signed document will be sent to the owner over email once it is signed by all signers.","encrypted-pdf-not-support":"Currently encrypted pdf files are not supported.","document-signed-alert-4":" Congratulations! 🎉 This document has been successfully signed by all participants!","document-signed-alert-5":"This document has been signed by all Signers.","document-signed-alert-6":"This document has been declined by one or more recipient(s).","document-signed-alert-7":"This Document is no longer available.","document-signed-alert-8":"The document has already been dispatched for signing.","yet-to-sign":"Yet to sign","validation-alert-1":"The input does not meet the criteria set by the regular expression.","account-already-exists":"Account already exists!","choose-password":"Choose Password","enter-password":"Enter Password","sure":"sure","subscribed-alert":"You have already subscribed to plan!","monthly":"Monthly","yearly-upto":"Yearly (upto 66% off)","billed-yearly":"Billed Yearly","billed-monthly":"Billed Monthly","plansubscription-1":"Host it yourself for free","visit-github":"Visit Github","user-already-exist-name":"User already exists with this username!","do-not-access-contact-admin":"You don\'t have access, please contact the admin.","filed-required-correctly":"Please fill required details correctly.","admin-created":"Admin created","invalid-masterkey":"Invalid masterkey","opensign-Setup":"Opensign Setup","master-key":" Master key","profile-update-alert":"Profile updated successfully.","date":"Date","report-not-found":"Report Not Found","please-wait":"please wait","select-foler":"Select Folder","generated-on":"Generated On","text-field":"Text field","font-size":"Font size","widget-status":{"Required":"Required","Optional":"Optional"},"all-right":"All Rights Reserved","version":"version","social-media":{"github":"Github","linked-in":"LinkedIn","twitter":"Twitter","discord":"Discord"},"tour-mssg":{"home-layout-1":"You have logged in successfully! Let\'s take a look.","home-layout-2":"To upload documents for self-signing or to request others’ signatures, simply select the respective buttons.","home-layout-3":"You are ready to start using OpenSign! If you need support feel free to contact us.","generate-token":"Upgrade now to generate API token","opensign-drive-1":"Click on the breadcrumb links to easily navigate through the folder hierarchy and view the documents within each folder.","opensign-drive-2":"Click the add button to create a new folder or document.","opensign-drive-3":"Sort your documents by Date or Name using this menu.","opensign-drive-4":"Click on this menu to display the documents in list view.","opensign-drive-5":"The document list is displayed according to the selected sorting option. Icons next to each document indicate its current status.","opensign-drive-6":"Right-click on a document to see options such as Download, Rename, Move, and Delete. Click on the document to open it.","opensign-drive-7":"Right-click on any folder to see options. Choose ‘Rename’ to change the folder’s name or click on the folder to navigate through its contents.","pdf-request-file-1":"List of signers who still need to sign the document .","pdf-request-file-2":"Click any of the placeholders appearing on the document to sign. You will then see options to draw your signature, type it, or upload an image .","pdf-request-file-3":"Click the Back, Decline, or Finish buttons to navigate your document. Use the ellipsis menu for additional options, including the Download button .","pdf-request-file-4":"List of signers who have already signed the document .","pdf-request-file-5":"You can click \'Auto Sign All\' to automatically sign at all the locations meant to be signed by you. Make sure that you review the document properly before you click this button .","placeholder-sign-1":"Select a recipient from this list to add a place-holder where he is supposed to sign.The placeholder will appear in the same colour as the recipient name once you drop it on the document.","placeholder-sign-2":"Clicking \'Add recipients\' button will allow you to add more signers.","placeholder-sign-3":"Drag or click on a field to add it to the document.","placeholder-sign-4":"The PDF content area already displays the template\'s existing placeholders. For your convenience, these placeholders will match the color of the recipient\'s name, making them easily identifiable.","placeholder-sign-5":"Clicking \'Send\' will save the document. In the next step you can customize the emails to be sent out to the recipients or copy the signing links and share those with the recipients yourself.","report-1":"Click the \'Add\' button to create a new template. Templates are reusable documents designed to quickly generate new documents with the same structure and varying signers. For example, an HR template for onboarding could have predefined roles like ‘HR Manager’ and ‘New Employee’. Each time you use the template, you can assign the ‘New Employee’ role to different incoming staff members, while the ‘HR Manager’ role remains constant, facilitating a seamless onboarding process for each recruit. ","redirect":"Click the \'Use\' button to create a new document from an existing template.","bulksend":"To quickly create and send multiple documents using an existing template, click the \'Quick Send\' button.","option":"This menu reveals more options such as Edit & Delete. Use the \'Edit\' button to add signer roles, modify fields, and update your template. Changes will apply to all future documents created from this template but won’t affect existing documents.Use the Delete button you can delete template. ","signyour-self-1":"Select and drag your preferred widgets onto the PDF to customize your document before signing. Choose the perfect spots for each modification to tailor the document to your needs.","signyour-self-2":"Drag and drop anywhere in this area. You can resize and move it later.","template-placeholder-1":"Clicking \'Add role\' button will allow you to add various signer roles. You can attach users to each role in subsequent steps.","template-placeholder-2":"Once roles are added, select a role from list to add a place-holder where he is supposed to sign. The placeholder will appear in the same colour as the role name once you drop it on the document.","template-placeholder-3":"Drag or click on a field to add it to the document.","template-placeholder-4":"Drag the placeholder for a role anywhere on the document.Remember, it will appear in the same colour as the name of the recipient for easy reference.","template-placeholder-5":"Clicking \'Next\' will store the current template. After saving, you’ll be prompted to create a new document from this template if you wish.","webhook-1":"Upgrade now to set webhook","Need your Signature":"Clicking on this card will take you to the list of documents awaiting your review.","Out for signatures":"Clicking on this card will take you to a list of documents awaiting signature.","Recent signature requests":"This is a list of documents that are waiting for your signature.","Recently sent for signatures":"This is a list of documents you\'ve sent to other parties for signature.","Drafts":"This are documents you have started but have not finalized for sending."},"enter-email-plaholder":"Add an email address and hit enter","success-email-alert":"Email sent successfully!","expired-doc-title":"Expired Document","expired-on-mssg":"This document expired on {{expiredDate}} and is no longer available to sign.","signature-validate-alert":"Please confirm that you have selected at least {{minRequiredCount}} checkboxes.","signature-validate-alert-2":"Ensure this field is accurately filled and meets all requirements.","remaing-users":"Remaining users","Role":"Role","additional-users":"Please purchase add-on users.","Quantity-of-users":"Quantity of users","Price":"Price","Total-price-for-next-time":"Total price for next time","Proceed":"Proceed","Select":"Select","Add-seats":"Add Seats","user-name-exist":"user name already exist","format":"format","select-date-format":"Select a date format","rotate-right":"Rotate right","rotate-left":"Rotate left","rotate-alert-mssg":"All widgets on this page will be lost. Are you sure you want to proceed?"}'); + +/***/ }), + +/***/ "./src/script/locales/fr/translation.json": +/*!************************************************!*\ + !*** ./src/script/locales/fr/translation.json ***! + \************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = /*#__PURE__*/JSON.parse('{"create-account":"Créer un compte","login":"Se Connecter","language":"Langue","name":"Nom et Prénom","phone":"Téléphone","email":"E-mail","company":"Organisation","job-title":"Votre Fonction","profile":"Profil","is-email-verified":"L\'e-mail est-il vérifié","log-out":"Déconnexion","public-profile":"Profil public","tagline":"Slogan","has-requested-you-to-sign":" vous a demandé de signer","has-requested-you-to-review-and-sign":"vous a demandé de consulter et de signer","input-required":"Veuillez remplir ce champ.","sort-order":{"Ascending":"Ascendant","Descending":"Descendant","Name":"Nom et Prénom","Date":"Date"},"context-menu":{"Download":"Télécharger","Rename":"Renommer","Move":"Se déplacer","Delete":"Supprimer"},"action":"Action","add":"Ajouter","add-new-folder":"Ajouter un nouveau dossier","disable-documentId":"Désactiver l\'ID du document","edit":"Modifier","change-password":"Changer votre mot de passe","save":"Sauvegarder","cancel":"Annuler","upgrade-now":"Mettre à jour maintenant","upgrade-to":"Mettre à niveau vers","pro":"PRO","plan":"Offre","subscribe-card-plan":"Débloquez des fonctionnalités premium à partir de seulement {{premiumPrice}}/mois. Bénéficiez de performances améliorées et de seulement {{addonPrice}} par crédit supplémentaire après vos crédits premium inclus.","user-name-limit-char":"Pour avoir un nom d\'utilisateur de moins de 8 caractères s\'il vous plaît s\'abonner","tour-content":"Ne plus afficher","team":"Équipe","docs":"Documents","session-expired":"Votre session a expiré.","user":"Utilisateur","public-profile-help":"Il s\'agit de votre URL publique. Copiez-le ou partagez-le avec le signataire et vous pourrez voir tous vos modèles définis publiquement.","tagline-help":"Ce surnom apparaîtra sur votre profil public OpenSign par exemple. https://opensign.me/alex","welcome":"Content de te revoir!","Login-to-your-account":"Se connecter à son compte","password":"Mot de passe","forgot-password":"Mot de passe oublié?","loading":"Chargement...","of":"de","sign-SSO":"Connectez-vous avec SSO","login-page":"Page de connexion","or":"OU","signup-page":"Page d\'inscription","password-length":"Le mot de passe doit être de plus de 8 caractères","password-case":"Le mot de passe doit contenir une lettre majuscule, minuscule et un chiffre ","password-special-char":"Le mot de passe doit contenir un caractère spécial","agreee":"Je suis d\'accord avec le","term":"Conditions d\'utilisation","subscribe-to-opensign":"Abonnez-vous à la newsletter OpenSign","register":"S\'enregistrer ","sidebar":{"Dashboard":"Tableau de bord","Sign yourself":"signez vous-même","Request signatures":"Demander des signatures","Templates":"Modèles","Templates-Children":{"Create template":"Créer un modèle","Manage templates":"Gérer les modèles"},"OpenSign™ Drive":"Lecteur OpenSign™","Reports":"Rapports","Reports-Children":{"Need your sign":"Besoin de votre signature","In Progress":"En cours","Completed":"Complété","Drafts":"Brouillons","Declined":"Signature refusé","Expired":"Expiré","Contactbook":"Carnet de contacts"},"Settings":"Paramètres","Settings-Children":{"My Signature":"Ma signature","API Token":"Jeton API","Webhook":"Webhook","Teams":"Équipe","Team-update-successfully":"Équipe mise à jour avec succès.","Users":"Utilisateurs"}},"dashboard-card":{"Need your Signature":"Besoin de votre signature","Out for signatures":"En attente de Signature"},"report-name":{"Draft Documents":"Brouillons","Need your sign":"Besoin de votre signature","In-progress documents":"Documents en cours","Completed Documents":"Documents complétés","Declined Documents":"Documents refusés","Expired Documents":"Documents expirés","Recently sent for signatures":"Récemment envoyé pour signature","Recent signature requests":"Demandes de signature récentes","Drafts":"Brouillons","Contactbook":"Carnet de contacts","Templates":"Modèles","Teams":"Équipe","Users":"Utilisateurs"},"report-heading":{"Sr.No":"Numéro","Title":"Titre","Email":"E-mail","Phone":"Téléphone","File":"Fichier","Owner":"Propriétaire","Signers":"Signataires","Note":"Note","Folder":"Dossier","Reason":"Raison","Parent Team":"Équipe de parents","Active":"Actif","Role":"Rôle","Team":"Équipe","Name":"Nom","Status":"Statut","created-date":"Date de création","Type":"Saisir"},"btnLabel":{"sign":"Signer","Resend":"Relancer","Revoke":"Révoquer","Delete":"Supprimer","Use":"Utiliser","Quick send":"Envoi rapide","Edit":"Modifier","Share with team":"Partager avec l\'équipe","Share":"Partager","View":"Voir","option":"Option"},"report-help":{"Draft Documents":"Il s\'agit de documents que vous avez commencés mais que vous n\'avez pas finalisés pour envoi.","Need your sign":"Voici une liste de documents ou votre signature est requise","In-progress documents":"Il s\'agit d\'une liste de documents que vous avez envoyés à d\'autres parties pour signature.","Completed Documents":"Il s\'agit d\'une liste de documents signés par toutes les parties.","Declined Documents":"Il s\'agit d\'une liste de documents qui ont été refusés par l\'un des signataires.","Expired Documents":"Il s\'agit d\'une liste de documents qui ont atteint leur date d\'expiration.","Contactbook":"Il s\'agit d\'une liste de contacts/signataires que vous avez ajoutés. Ceux-ci apparaîtront sous forme de suggestions lorsque vous tenterez d\'ajouter des signataires à un nouveau document.","Templates":"Il s\'agit d\'une liste de modèles à votre disposition pour créer des documents. Vous pouvez cliquer sur le bouton \'Utiliser\' pour créer un nouveau document à l\'aide d\'un modèle, modifier le document et ajouter des signataires à l\'étape suivante."},"form-name":{"Sign Yourself":"signez vous-même","Request Signatures":"Demander des signatures","New Template":"Nouveau modèle"},"file-type":"pdf, png, jpg, jpeg","docx":"docx","file-selected":"fichier sélectionné","template-title":"Titre du modèle","document-title":"Titre du document","description":"Description","time-to-complete":"Temps de réalisation (jours)","send-in-order":"Envoyer dans l\'ordre ?","send-in-order-help":{"p1":"Choisissez la manière dont vous souhaitez que les demandes de signature soient envoyées aux signataires du document :","p2":"La sélection de cette option enverra initialement la demande de signature au premier signataire. Une fois que le premier signataire a terminé sa partie, le prochain signataire de la séquence recevra la demande. Ce processus se poursuit jusqu\'à ce que tous les signataires aient signé le document. Cette méthode garantit que le document est signé dans un ordre spécifique.","p3":"La sélection de cette option enverra les liens de signature à tous les signataires simultanément. Chaque signataire peut signer le document à sa convenance, que d\'autres signataires aient ou non complété leur signature. Cette méthode est plus rapide mais n’impose aucun ordre de signature entre les participants.","p4":"Sélectionnez l\'option qui correspond le mieux aux besoins de votre traitement de documents."},"no":"Non","auto-reminder":"Rappel automatique","remind-once":"Rappeler une fois tous les (jours)","next":"Suivant","select-folder":"Sélectionner le dossier","OpenSign-drive":"Lecteur OpenSign™","drive-document-status":{"Completed":"Complété","Declined":"Refuser","Draft":"Brouillon","Expired":"Expiré","In Progress":"En cours"},"select-folder-help":"Si vous ne sélectionnez pas de dossier, votre document signé sera enregistré dans le dossier du lecteur principal OpenSign.","no-data":"Aucune données disponible","save-here":"Enregistrer ici","back":"Retour","add-folder":"Ajouter le dossier","create-folder":"Créer le dossier","parent-folder":"Dossier Parent","create":"Créer","signers":"Signataires","signers-help":"Commencez à saisir le nom d\'un contact pour voir les signataires suggérés par vos contacts enregistrés ou en ajouter de nouveaux. Organisez l\'ordre de signature en ajoutant des signataires dans l\'ordre souhaité. Utilisez le bouton « + » pour inclure les signataires et le « x » pour les supprimer. Chaque signataire recevra un e-mail invité à signer le document dans l\'ordre indiqué.","add-signer":"Ajouter un signataire","contact-not-found":"Contact introuvable","add-yourself":"Ajoutez-vous","submit":"Soumettre","reset":"Réinitialiser","my-signature":"Ma signature","signature":"Signature","upload-image":"Télécharger une image","clear":"Vider","upload-signature/Image":"télécharger-signature/Image","initials":"Initiales","API":"API","api-token":"Jeton API","regenerate-token":"Régénérer le jeton","generate-token":"Générer un jeton","view-docs":"Afficher les documents","generate-token-alert":"Êtes-vous sûr de vouloir régénérer le jeton, votre ancien jeton sera supprimer?","yes":"Oui","copied":"Copié","wrong-mssg":"Quelque chose c\'est mal passé. Merci d\'essayer plus tard.","token-generated":"Jeton généré avec succès.","webhook":"Webhook","update-webhook":"Mettre à jour le webhook","add-webhook":"Ajouter un webhook","webhook-added":"Webhook ajouté avec succès.","team-disabled":"Équipe: Désactivée","team-enabled":"Équipe activée","are-you-sure":"Êtes-vous sûr de vouloir","disable":"désactiver","enable":"activer","this-team":"cette équipe?","edit-team":"Modifier l\'équipe","name-of-team":"Nom de l\'équipe","prev":"précédent","no-data-avaliable":"pas de données disponibles","add-team":"Ajouter une équipe","page-not-found":"Page non trouvée","users-from-teams":"utilisateurs de votre Équipe","user-status":"Statut de l\'utilisateur","activate":"Activer","deactivate":"désactiver","this-user":"cet utilisateur ","delete-user":"Supprimer l\'utilisateur","delete":"supprimer","add-user":"Ajouter un utilisateur","password-generateed":"Le mot de passe ne sera généré qu\'une seule fois ; assurez-vous de le copier.","Team status":"Statut de l\'équipe","user-deactivated":"Utilisateur désactivé.","user-activated":"Activé par l\'utilisateur.","public":"Public","download":"Téléchargement","view":"voir","make-template-public":"Rendre le modèle public","make-template-private":"Rendre le modèle privé","make-template-public-alert":"Êtes-vous sûr de vouloir rendre ce modèle public ?","make-template-private-alert":"Êtes-vous sûr de vouloir rendre ce modèle privé ? Cela le supprimera de votre profil public.","public-role":"Rôle public","public-url":"URL publique","public-url-copy-mssg":"Voici votre URL publique : copiez-la ou partagez-le avec le signataire et vous pouvoir voir tous vos paramètres publics modèles.","add-public-url-alert":"Veuillez ajouter votre URL publique et vous pourra rendre public modèle.","share-with-alert":"Vous ne pouvez pas partager un modèle si des contacts sont déjà attribués à des rôles. Veuillez supprimer toutes les attributions de contacts des rôles avant de partager le modèle.","share-with":"Partager avec","team-not-found":"Équipe introuvable","roles":"Les rôles","delete-document":"Supprimer un document","delete-document-alert":"Êtes-vous sûr de vouloir supprimer ce document ?","quick-send":"Envoi rapide","add-new":"Ajouter un nouveau","send":"envoyer","quick-send-alert-1":"Tous les rôles dans ce document sont actuellement liés à des contacts. Pour envoyer rapidement des copies de ce modèle à plusieurs signataires, veuillez vous assurer qu\'au moins un rôle n\'est lié à aucun contact.","quick-send-alert-2":"Veuillez vous assurer qu\'au moins un widget de signature est ajouté pour tous les destinataires.","quick-send-alert-3":"Veuillez ajouter au moins un rôle à ce modèle afin d\'en « envoyer rapidement » des copies à plusieurs signataires.","quick-send-alert-4":"L\'envoi rapide a atteint la limite.","copy-link":"Copier le lien","copy":"Copier","revoke-document":"Révoquer le document","revoke-document-alert":"Êtes-vous sûr de vouloir révoquer ce document ?","resend-mail":"Renvoyer le courrier","resend-mail-help":"Vous pouvez utiliser les variables suivantes qui seront remplacées par leurs valeurs réelles : - {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email} }, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.","subject":"Sujet","body":"Corps","add-contact":"Ajouter le contact","add-signer-alert":"Le contact existe déjà !","record-delete-alert":"Enregistrement supprimé avec succès !","record-revoke-alert":" Enregistrement révoqué avec succès ! ","mail-sent-alert":"Courriel envoyé avec succès.","document-sent-alert":"Document envoyé avec succès !","template-share-alert":"Modèle partagé avec succès.","template-public-alert-1":"Vous avez rendu le modèle public avec succès.","template-public-alert-2":"Vous avez réussi à rendre le modèle privé.","template-public-alert-3":"Vous devez sélectionner un rôle pour les signataires publics.","template-public-alert-4":"Veuillez vous assurer qu\'au moins un widget de signature est ajouté pour tous les signataires.","template-public-alert-5":"Étant donné que l\'envoi dans l\'ordre est activé sur ce modèle, le rôle public doit être positionné en haut.","template-public-alert-6":"Veuillez associer des signataires à tous les rôles, à l\'exception du rôle d\'utilisateur public.","template-public-alert-7":"Veuillez attribuer au moins un rôle public pour rendre ce modèle public.","loader":"Cela pourrait prendre un certain temps","pages":"Pages","document-signed":"Document signé","close":"Fermer","validation-alert":"Alerte de validation","validate-alert-mssg":"L\'entrée ne répond pas aux critères définis par l\'expression régulière.","otp-verification":"Vérification OTP","enter-otp":"Entrez OTP","verify":"Vérifier","verify-email-1":"Vérifier l\'e-mail","resend":"Renvoyer","contact-details":"Coordonnées","verify-email":"Veuillez vérifier votre email!","send-otp":"envoyer un code à usage unique","otp-placeholder":"Saisissez l\'OTP reçu par e-mail","loading-doc":"Chargement du document..","widgets-name":{"signature":"signature","stamp":"tampon","initials":"initiales","name":"nom et Prénom","job title":"votre fonction","company":"organisation","date":"date","text":"texte","text input":"saisie de texte","checkbox":"case à cocher","dropdown":"dérouler","radio button":"bouton radio","image":"image","email":"e-mail"},"fields":"Des champs","recipients":"Destinataires","please-add":"Veuillez ajouter un","signed-by":"Signé par","more":"plus","sent":"Envoyé","print":"imprimer","certificate":"Certificat","decline":"refusé","finish":"terminé","mail":"Mail","sign-now":"Signez maintenant","successfully-signed":"Signé avec succès !","email-mssg":"Les destinataires ajoutés ici recevront une copie du document signé.","email-error-1":"veuillez fournir une adresse e-mail correcte","email-error-2":"Vous ne pouvez envoyer qu\'à dix destinataires à la fois.","Email-verified-alert-1":"L\'e-mail est vérifié.","Email-verified-alert-2":"L\'e-mail est déjà vérifié.","upload-stamp-image":"Télécharger l\'image du tampon","draw":"Dessiner","type":"Taper","color-type":{"red":"rouge","blue":"bleu","black":"noir","yellow":"jaune"},"my-initials":"Mes initiales","upload":"Télécharger","initial-teb":"Initiales","signature-tab":"Signature","your-signature":"Votre signature","copy-to-all-pages":"Copier sur toutes les pages","contact-delete-alert":"Êtes-vous sûr de vouloir supprimer ce contact ?","reset-password":"Le lien de réinitialisation du mot de passe a été envoyé à votre identifiant de messagerie","reset-password-alert-2":"Veuillez configurer l\'adaptateur de messagerie","reset-password-alert-3":"Réinitialisez votre mot de passe","faild-animation":"Échec du chargement de l\'animation","apply":"Appliquer","copy-type":{"All pages":"Toutes les pages","All pages but last":"Toutes les pages sauf la dernière","All pages but first":"Toutes les pages sauf la première"},"options":"Possibilités","minimun-check":"Vérification minimale","maximum-check":"Contrôle maximum","default-value":"Valeur par défaut","select":"Sélectionner","read-only":"Est en lecture seule","hide-labels":"Masquer les étiquettes","checkbox":"Case à cocher","alert":"Alerte","zoom-in":"Agrandir","zoom-out":"Dézoomer","document-signed-alert":"Félicitations ! 🎉 Votre document à bien été signer!","otp-sent-alert":"Le code OTP a bien été envoyer sur votre adresse Email","fields-required":"Champs obligatoires","signature-widget-alert-1":"Veuillez vous assurer qu\'au moins un widget de signature a été ajouté","signature-widget-alert-2":"Veuillez vous assurer que tous les champs sont remplis avec précision et répondent à toutes les exigences.","encrypted-pdf-alert":"Les fichiers PDF actuellement cryptés ne sont pas pris en charge.","encrypted-pdf-alert-1":"Le mot de passe du fichier PFX n\'est pas valide.","user-not-exist":"L\'utilisateur n\'existe pas","template-signature-field":"Veuillez ajouter au moins un champ de signature pour tous les rôles.","template-role-alert":"Veuillez d\'abord ajouter des rôles","create-document":"Créer un document","template-created-alert":"Voulez-vous créer un document en utilisant le modèle que vous vient de créer ?","signers-alert":"alerte des signataires","template-creation-alert-1":"Veuillez sélectionner le signataire pour ajouter un espace réservé !","ok":"D\'accord","radio-group":"Groupe de radio","dropdown-options":"Options déroulantes","add-role":"Ajouter un rôle","role-ex":"Ex : Client, RH, Directeur, Manager, Étudiant, etc.","add/choose-signer":"Ajouter/Choisir un signataire","choose-from-contacts":"Choisissez parmis les contacts","select-signer":"Veuillez sélectionner le signataire","edit-template":"Modifier le modèle","widget-info":"Informations sur les widgets","validation":"Validation","invalid-default-value":"valeur par défaut invalide","hint":"Indice","color":"couleur","role-help":{"p1":"Que sont les rôles modèles ?","p2":"Commencez par spécifier chaque rôle nécessaire à la finalisation du document. Pensez aux parties impliquées dans le processus de signature et à leurs responsabilités. Les rôles courants incluent les RH pour les documents internes, le Client pour les accords ou le Fournisseur pour les accords commerciaux.","p3":"Pourquoi pré-attacher les utilisateurs à certains rôles ?","p4":"Pour les rôles qui impliquent systématiquement la même personne (par exemple, la signature du PDG sur les lettres d\'offre des employés), vous pouvez pré-attacher un utilisateur à un rôle dans le modèle. Cette étape est facultative mais recommandée pour des raisons d\'efficacité et de cohérence entre les documents.","p5":"Quand dois-je spécifier l\'utilisateur attaché à chaque rôle ?","p6":"Lorsque vous créez un document à partir de votre modèle, vous serez invité à attacher des utilisateurs à chaque rôle défini. Si un rôle est déjà associé à un utilisateur, celui-ci sera pré-rempli, mais vous pourrez le modifier si nécessaire avant d\'envoyer le document."},"add-recipients":"Ajouter des destinataires","loading-mssg":"Cela pourrait prendre du temps","send-mail":"Envoyer un mail","placeholder-alert-1":"Veuillez vous assurer qu\'au moins un widget de signature est ajouté pour tous les destinataires.","placeholder-alert-2":"Veuillez confirmer que vous avez rempli le champ de texte.","placeholder-alert-3":"Etes-vous sûr de vouloir envoyer ce document pour signature ? ","placeholder-alert-4":"Vous avez envoyé avec succès des mails à tous les","placeholder-alert-5":"Voulez-vous signer des documents maintenant ?","placeholder-alert-6":"Veuillez configurer l\'adaptateur de messagerie pour envoyer du courrier !","placeholder-alert-7":"Veuillez sélectionner le signataire pour ajouter un espace réservé !","email-subject":"Sujet du courriel","email-body":"corps de l\'e-mail","email-placeholder":"Ajouter le corps de l\'e-mail","reset-to-default":"Réinitialiser aux valeurs par défaut","cutomize-email":"Personnaliser l\'e-mail","upgrade-to-customize-email":"Mise à niveau pour personnaliser l\'e-mail","sign-url":"Signer l\'URL","Mails Sent":"Mails envoyés avec succès !","document-alert":"Alerte document","owner-subscription-expired":"L\'abonnement du propriétaire a expiré.","subscription-expired":"Abonnement expiré","alert-message":"Message d\'alerte","document-decline":"Document-refusé","decline-alert-1":"Etes-vous sûr de vouloir refuser ce document ?","decline-alert-2":"Vous avez refusé ce document !","decline-alert-3":"Vous ne pouvez pas signer ce document car il a été refusé/révoqué.","sign here":"Signer ici","guest-email-alert":"le code de vérification a été envoyé sur votre e-mail","get-otp-alert":"vous recevrez un mot de passe à usage unique par e-mail","user-already-exist":"L\'utilisateur existe déjà.","server-error":"Erreur interne du serveur !","fill-required-details!":"Veuillez remplir les informations requises !","sign-up-form":"Formulaire d\'inscription","sign-up":"S\'inscrire","folder-already-exist!":"le dossier existe déjà !","please-select-position!":"Veuillez sélectionner un poste !","default-sign-alert":"Êtes-vous sûr de vouloir vous connecter automatiquement à tous les emplacements demandés ? ","Your-Signature":"Votre signature","auto-sign-all":"Tout signer automatiquement","generating-certificate":"Génération du certificat","pdf-download":"Téléchargement PDF","generate-certificate-alert":" Votre certificat d\'achèvement est en cours de génération. Veuillez patienter quelques instants. Si le téléchargement ne démarre pas sous peu, cliquez à nouveau sur le bouton. ","folder-already-exist":"Le dossier existe déjà !","folder-created-successfully":"Dossier créé avec succès !","fill-folder-name":"Veuillez indiquer le nom du dossier","already-exists-this-username":"Un utilisateur existe déjà avec ce nom d\'utilisateur !","verification-code-sent":"Un e-mail de vérification a été envoyé à votre adresse e-mail !","registered-user-successfully":"Utilisateur enregistré avec succès.","role-not-found":"Rôle introuvable.","do-not-access":"Vous n\'y avez pas accès, veuillez contacter l\'administrateur.","add-admin":"Ajouter un administrateur","opensign-setup":"Configuration d\'Opensign","join-discord":"Rejoignez notre serveur Discord","admin-already-exist":"L\'administrateur existe déjà.","password-update-alert-1":"Mot de passe mis à jour avec succès.","password-update-alert-2":"Votre mot de passe actuel est manquant ou incorrect.","password-update-alert-3":"Votre mot de passe actuel est manquant ou incorrect.","password-update-alert-4":"Votre mot de passe et votre mot de passe de confirmation ne correspondent pas.","current-password":"mot de passe actuel","new-password":"nouveau mot de passe","confirm-password":"Confirmez le mot de passe","file-alert-1":"La taille du fichier sélectionné est trop grande. Veuillez sélectionner un fichier inférieur à","file-alert-2":"Veuillez sélectionner un fichier.","file-alert-3":"Veuillez patienter pendant le téléchargement du document.","enter-pdf-password":"Entrez le mot de passe PDF","correct-password":"Veuillez fournir un mot de passe correct","decrypting-pdf":"Décryptage du pdf, veuillez patienter...","invalid-otp":"OTP invalide","user-not-found":"Utilisateur non trouvé!","enter-otp-alert":"Veuillez saisir OTP !","get-verification-code":"Obtenir le code de vérification","get-verification-code-2":"Vous recevrez un code de vérification par e-mail","enter-verification-code":"Entrez le code de vérification","provide-your-details":"Fournissez vos coordonnées","provide-email":"Veuillez fournir un e-mail.","additional-info":"Information additionnelle","signature-saved-alert":"Signature enregistrée avec succès.","fill-field":"Veuillez remplir ce champ","error-template":"Erreur : modèle introuvable ! ","error":"Erreur","invalid-document":"Erreur : document invalide !","document-not-found":"Document introuvable !","document-signed-alert-1":"Vous avez signé le document avec succès. Vous pouvez télécharger ou imprimer une copie du document partiellement signé. Une copie du document signé numériquement sera envoyée au propriétaire par e-mail une fois qu\'il sera signé par tous les signataires.","encrypted-pdf-not-support":"Les fichiers PDF actuellement cryptés ne sont pas pris en charge. ","document-signed-alert-4":"Toutes nos félicitations! 🎉 Ce document a été signé avec succès par tous les participants !","document-signed-alert-5":"Ce document a été signé par tous les signataires.","document-signed-alert-6":"Ce document a été refusé par un ou plusieurs destinataire(s).","document-signed-alert-7":"Ce document n\'est plus disponible.","document-signed-alert-8":"Le document a déjà été envoyé pour signature.","yet-to-sign":"Reste à signer","validation-alert-1":"L\'entrée ne répond pas aux critères définis par l\'expression régulière.","account-already-exists":"Le compte existe déjà!","choose-password":"Choisissez un mot de passe","enter-password":"Entrer le mot de passe","sure":"bien sûr","subscribed-alert":"Vous êtes déjà abonné au forfait !","monthly":"Mensuel","yearly-upto":"Annuel (jusqu\'à 66 % de réduction)","billed-yearly":"Facturé annuellement","billed-monthly":"Facturé mensuellement","plansubscription-1":"Hébergez-le vous-même gratuitement","visit-github":"Visitez Github","user-already-exist-name":"Un utilisateur existe déjà avec ce nom d\'utilisateur !","do-not-access-contact-admin":"Vous n\'y avez pas accès, veuillez contacter l\'administrateur.","filed-required-correctly":"Veuillez remplir correctement les informations requises.","admin-created":"Administrateur créé","invalid-masterkey":"Clé principale invalide","opensign-Setup":"Configuration d\'Opensign","master-key":"La clef maitresse","profile-update-alert":"Mise à jour du profil réussie.","date":"Date","report-not-found":"Rapport introuvable","please-wait":"S\'il vous plaît, attendez","select-foler":"Sélectionner le dossier","generated-on":"Généré le","text-field":"Champ de texte","font-size":"Taille de police","widget-status":{"Required":"Requis","Optional":"Facultative"},"all-right":"Tous droits réservés","version":"version","social-media":{"github":"Github","linked-in":"LinkedIn","twitter":"Twitter","discord":"Discorde"},"tour-mssg":{"home-layout-1":"Vous vous êtes connecté avec succès ! Jetons un coup d\'oeil.","home-layout-2":"Pour télécharger des documents à auto-signature ou pour demander la signature d\'autres personnes, sélectionnez simplement les boutons correspondants.","home-layout-3":"Vous êtes prêt à commencer à utiliser OpenSign ! Si vous avez besoin d\'aide, n\'hésitez pas à nous contacter.","generate-token":"Mettez à niveau maintenant pour générer un jeton API","opensign-drive-1":"Cliquez sur les liens du fil d\'Ariane pour naviguer facilement dans la hiérarchie des dossiers et afficher les documents dans chaque dossier.","opensign-drive-2":"Cliquez sur le bouton Ajouter pour créer un nouveau dossier ou document.","opensign-drive-3":"Triez vos documents par date ou par nom à l\'aide de ce menu.","opensign-drive-4":"Cliquez sur ce menu pour afficher les documents sous forme de liste.","opensign-drive-5":"La liste des documents s\'affiche selon l\'option de tri sélectionnée. Les icônes à côté de chaque document indiquent son état actuel.","opensign-drive-6":"Faites un clic droit sur un document pour voir les options telles que Télécharger, Renommer, Déplacer et Supprimer. Cliquez sur le document pour l\'ouvrir.","opensign-drive-7":"Faites un clic droit sur n\'importe quel dossier pour voir les options. Choisissez \'Renommer\' pour changer le nom du dossier ou cliquez sur le dossier pour naviguer dans son contenu.","pdf-request-file-1":"Liste des signataires qui doivent encore signer le document.","pdf-request-file-2":"Cliquez sur l\'un des espaces réservés apparaissant sur le document pour signer. Vous verrez alors des options pour dessiner votre signature, la saisir ou télécharger une image.","pdf-request-file-3":"Cliquez sur les boutons Précédent, Refuser ou Terminer pour parcourir votre document. Utilisez le menu points de suspension pour des options supplémentaires, notamment le bouton Télécharger.","pdf-request-file-4":"Liste des signataires ayant déjà signé le document.","pdf-request-file-5":"Vous pouvez cliquer sur \'Signer automatiquement tout\' pour signer automatiquement à tous les emplacements que vous êtes censé signer. Assurez-vous de lire correctement le document avant de cliquer sur ce bouton.","placeholder-sign-1":"Sélectionnez un destinataire dans cette liste pour ajouter un espace réservé à l\'endroit où il est censé signer. L\'espace réservé apparaîtra de la même couleur que le nom du destinataire une fois que vous le déposerez sur le document.","placeholder-sign-2":"Cliquer sur le bouton \'Ajouter des destinataires\' vous permettra d\'ajouter plus de signataires.","placeholder-sign-3":"Faites glisser ou cliquez sur un champ pour l\'ajouter au document.","placeholder-sign-4":"La zone de contenu PDF affiche déjà les espaces réservés existants du modèle. Pour votre commodité, ces espaces réservés correspondront à la couleur du nom du destinataire, ce qui les rendra facilement identifiables.","placeholder-sign-5":"Cliquer sur \'Envoyer\' enregistrera le document. À l\'étape suivante, vous pourrez personnaliser les e-mails à envoyer aux destinataires ou copier les liens de signature et les partager vous-même avec les destinataires.","report-1":"Cliquez sur le bouton \'Ajouter\' pour créer un nouveau modèle. Les modèles sont des documents réutilisables conçus pour générer rapidement de nouveaux documents avec la même structure et différents signataires. Par exemple, un modèle RH pour l\'intégration peut avoir des rôles prédéfinis tels que \'Responsable RH\' et \' Nouvel employé\'. Chaque fois que vous utilisez le modèle, vous pouvez attribuer le rôle \'Nouvel employé\' à différents membres du personnel entrants, tandis que le rôle \'Responsable RH\' reste constant, facilitant ainsi un processus d\'intégration fluide pour chaque recrue","redirect":"Cliquez sur le bouton \'Utiliser\' pour créer un nouveau document à partir d\'un modèle existant.","bulksend":"Pour créer et envoyer rapidement plusieurs documents à l\'aide d\'un modèle existant, cliquez sur le bouton \'Envoi rapide\'.","option":"Ce menu révèle plus d\'options telles que Modifier et Supprimer. Utilisez le bouton « Modifier » pour ajouter des rôles de signataire, modifier les champs et mettre à jour votre modèle. Les modifications s\'appliqueront à tous les futurs documents créés à partir de ce modèle mais n\'affecteront pas les documents existants. Utilisez le bouton Supprimer, vous pouvez supprimer le modèle ","signyour-self-1":"Sélectionnez et faites glisser vos widgets préférés sur le PDF pour personnaliser votre document avant de le signer. Choisissez les endroits parfaits pour chaque modification afin d\'adapter le document à vos besoins.","signyour-self-2":"Faites glisser et déposer n\'importe où dans cette zone. Vous pourrez la redimensionner et la déplacer plus tard.","template-placeholder-1":"Cliquer sur le bouton \'Ajouter un rôle\' vous permettra d\'ajouter différents rôles de signataire. Vous pourrez attacher des utilisateurs à chaque rôle dans les étapes suivantes.","template-placeholder-2":"Une fois les rôles ajoutés, sélectionnez un rôle dans la liste pour ajouter un espace réservé à l\'endroit où il est censé signer. L\'espace réservé apparaîtra dans la même couleur que le nom du rôle une fois que vous l\'aurez déposé sur le document.","template-placeholder-3":"Faites glisser ou cliquez sur un champ pour l\'ajouter au document.","template-placeholder-4":"Faites glisser l\'espace réservé pour un rôle n\'importe où sur le document. N\'oubliez pas qu\'il apparaîtra dans la même couleur que le nom du destinataire pour une référence facile.","template-placeholder-5":"Cliquer sur \'Suivant\' stockera le modèle actuel. Après l\'enregistrement, vous serez invité à créer un nouveau document à partir de ce modèle si vous le souhaitez.","webhook-1":"Mettez à niveau maintenant pour définir le webhook","Need your Signature":"En cliquant sur cette carte, vous accéderez à la liste des documents en attente de révision.","Out for signatures":"En cliquant sur cette carte, vous accéderez à une liste de documents en attente de signature.","Recent signature requests":"Voici une liste de documents qui attendent votre signature.","Recently sent for signatures":"Il s\'agit d\'une liste de documents que vous avez envoyés à d\'autres parties pour signature.","Drafts":"Il s\'agit de documents que vous avez commencés mais que vous n\'avez pas finalisés pour envoi."},"enter-email-plaholder":"Ajoutez une adresse email et appuyez sur Entrée","success-email-alert":"E-mail envoyé avec succès!","expired-doc-title":"Document expiré","expired-on-mssg":"Ce document a expiré le {{expiredDate}} et n\'est plus disponible pour signature.","signature-validate-alert":"Veuillez confirmer que vous avez coché au moins {{minRequiredCount}} cases.","signature-validate-alert-2":"Assurez-vous que ce champ est rempli avec précision et répond à toutes les exigences.","user-name-exist":"le nom d\'utilisateur existe déjà","remaing-users":"Utilisateurs restants","Role":"Rôle","additional-users":"Veuillez acheter des utilisateurs supplémentaires.","Quantity-of-users":"Quantité d\'utilisateurs","Price":"Prix","Total-price-for-next-time":"Prix ​​total pour la prochaine fois","Proceed":"Procéder","Select":"sélectionner","Add-seats":"Ajouter des sièges","format":"format","select-date-format":"Sélectionnez un format de date","rotate-right":"Faire pivoter à droite","rotate-left":"Faire pivoter à gauche","rotate-alert-mssg":"Tous les widgets de cette page seront perdus. Êtes-vous sûr de vouloir continuer ?"}'); + /***/ }) /******/ }); @@ -212642,7 +253502,7 @@ module.exports = "eJztWsuy48iN/Ret74KZfHtX47meqfGjPHaXx4/wgpJ4JbooUU1JVXXb0f9u4J /******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; /******/ var document = __webpack_require__.g.document; /******/ if (!scriptUrl && document) { -/******/ if (document.currentScript) +/******/ if (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') /******/ scriptUrl = document.currentScript.src; /******/ if (!scriptUrl) { /******/ var scripts = document.getElementsByTagName("script"); @@ -212705,10 +253565,12 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var parse__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(parse__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom/client */ "./node_modules/react-dom/client.js"); /* harmony import */ var _pages_PdfRequestFiles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../pages/PdfRequestFiles */ "./src/pages/PdfRequestFiles.js"); -/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-pdf */ "./node_modules/pdfjs-dist/build/pdf.mjs"); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs"); +/* harmony import */ var react_pdf__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-pdf */ "./node_modules/pdfjs-dist/build/pdf.mjs"); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs"); /* harmony import */ var _redux_store__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../redux/store */ "./src/redux/store.js"); /* harmony import */ var _index_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../index.css */ "./src/index.css"); +/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./i18n */ "./src/script/i18n.js"); +/* harmony import */ var _constant_const__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../constant/const */ "./src/constant/const.js"); @@ -212717,7 +253579,9 @@ __webpack_require__.r(__webpack_exports__); -react_pdf__WEBPACK_IMPORTED_MODULE_6__.GlobalWorkerOptions.workerSrc = "//cdnjs.cloudflare.com/ajax/libs/pdf.js/".concat(react_pdf__WEBPACK_IMPORTED_MODULE_6__.version, "/pdf.worker.min.mjs"); + + +react_pdf__WEBPACK_IMPORTED_MODULE_8__.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${react_pdf__WEBPACK_IMPORTED_MODULE_8__.version}/pdf.worker.min.mjs`; // Wrapper component to manage props const PublicScriptFileWrapper = _ref => { @@ -212727,14 +253591,21 @@ const PublicScriptFileWrapper = _ref => { const [props, setProps] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialProps); // Make the setProps function globally accessible - window.updatePublicTemplateProps = setProps; + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { + window.updatePublicTemplateProps = setProps; + return () => { + window.updatePublicTemplateProps = undefined; + }; + }, []); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_pages_PdfRequestFiles__WEBPACK_IMPORTED_MODULE_3__["default"], props); }; -const appId = "legadranaxn"; -// "opensign"; -const serverUrl = "https://app.opensignlabs.com/api/app"; -// "https://staging-app.opensignlabs.com/api/app"; -localStorage.setItem("baseUrl", "".concat(serverUrl, "/")); +const appId = _constant_const__WEBPACK_IMPORTED_MODULE_7__.isPublicStaging ? "opensign" : "legadranaxn"; +//"opensign" + +const serverUrl = _constant_const__WEBPACK_IMPORTED_MODULE_7__.isPublicStaging ? "https://staging-app.opensignlabs.com/api/app" : "https://app.opensignlabs.com/api/app"; +// "https://staging-app.opensignlabs.com/api/app" + +localStorage.setItem("baseUrl", `${serverUrl}/`); localStorage.setItem("parseAppId", appId); parse__WEBPACK_IMPORTED_MODULE_1___default().initialize(appId); (parse__WEBPACK_IMPORTED_MODULE_1___default().serverURL) = serverUrl; @@ -212750,12 +253621,13 @@ document.head.appendChild(link); //add the Tailwind CSS file const tailwindCssLink = document.createElement("link"); tailwindCssLink.href = "https://app.opensignlabs.com/static/js/public-template.bundle.css"; // css bundle file -// "https://staging-app.opensignlabs.com/static/js/public-template.bundle.css"; // css bundle file tailwindCssLink.rel = "stylesheet"; document.head.appendChild(tailwindCssLink); // Create a root and render the wrapper component with initial props const root = react_dom_client__WEBPACK_IMPORTED_MODULE_2__.createRoot(document.getElementById("script-component")); -root.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_redux__WEBPACK_IMPORTED_MODULE_7__.Provider, { +root.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + "data-theme": "opensigncss" +}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_redux__WEBPACK_IMPORTED_MODULE_9__.Provider, { store: _redux_store__WEBPACK_IMPORTED_MODULE_4__.store }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PublicScriptFileWrapper, { initialProps: { @@ -212768,4 +253640,4 @@ root.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createEle /******/ })() ; }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLXRlbXBsYXRlLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7O0FDVnVDOztBQUV2QztBQUNBLGlnSUFBaWdJOztBQUVqZ0ksaUNBQWlDLDREQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWtDOzs7Ozs7Ozs7Ozs7Ozs7O0FDZmxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU4Qjs7Ozs7Ozs7Ozs7Ozs7OztBQ1I5QjtBQUNBO0FBQ0EsMEtBQTBLLE1BQU07QUFDaEw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIsTUFBTTtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxPQUFPO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5QixpQ0FBaUM7QUFDMUQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsVUFBVTtBQUN4Qzs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLFVBQVU7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsVUFBVTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7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QTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxtRUFBVztBQUNyQjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxpSUFBaUksUUFBUSxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsVUFBVSxZQUFZLFdBQVcsVUFBVSxLQUFLLEtBQUssWUFBWSxXQUFXLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLE1BQU0sTUFBTSxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxZQUFZLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxPQUFPLFVBQVUsWUFBWSxXQUFXLE9BQU8sT0FBTyxVQUFVLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsV0FBVyxZQUFZLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxLQUFLLEtBQUssVUFBVSxLQUFLLEtBQUssVUFBVSxLQUFLLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLE1BQU0sS0FBSyxVQUFVLEtBQUssS0FBSyxVQUFVLEtBQUssS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxVQUFVLEtBQUssS0FBSyxVQUFVLEtBQUssS0FBSyxZQUFZLFdBQVcsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxZQUFZLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsTUFBTSxLQUFLLFVBQVUsWUFBWSxNQUFNLE1BQU0sWUFBWSxXQUFXLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxhQUFhLE1BQU0sS0FBSyxVQUFVLEtBQUssTUFBTSxZQUFZLFdBQVcsS0FBSyxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLFdBQVcsS0FBSyxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLEtBQUssS0FBSyxZQUFZLGFBQWEsYUFBYSxNQUFNLEtBQUssVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLE1BQU0sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLFlBQVksTUFBTSxLQUFLLFVBQVUsWUFBWSxhQUFhLE1BQU0sS0FBSyxVQUFVLFlBQVksTUFBTSxLQUFLLFlBQVksV0FBVyxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxVQUFVLEtBQUssS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLE1BQU0sS0FBSyxVQUFVLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxLQUFLLFlBQVksYUFBYSxXQUFXLEtBQUssS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLGFBQWEsV0FBVyxLQUFLLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sT0FBTyxVQUFVLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxPQUFPLFFBQVEsVUFBVSxNQUFNLFFBQVEsWUFBWSxhQUFhLE1BQU0sUUFBUSxZQUFZLE1BQU0sUUFBUSxZQUFZLGFBQWEsV0FBVyxLQUFLLFFBQVEsWUFBWSxNQUFNLFFBQVEsVUFBVSxNQUFNLFFBQVEsVUFBVSxLQUFLLFFBQVEsWUFBWSxhQUFhLGFBQWEsV0FBVyxLQUFLLFFBQVEsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxXQUFXLFlBQVksTUFBTSxRQUFRLFlBQVksTUFBTSxRQUFRLFlBQVksV0FBVyxLQUFLLGNBQWMsWUFBWSxhQUFhLFdBQVcsS0FBSyxjQUFjLFlBQVksTUFBTSxRQUFRLFlBQVksYUFBYSxhQUFhLE1BQU0sUUFBUSxZQUFZLE1BQU0sb0JBQW9CLGFBQWEsTUFBTSxtQ0FBbUMsYUFBYSxXQUFXLEtBQUssUUFBUSxVQUFVLFVBQVUsS0FBSyxRQUFRLFlBQVksTUFBTSxRQUFRLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxLQUFLLEtBQUssWUFBWSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxPQUFPLFlBQVksYUFBYSxhQUFhLE1BQU0sT0FBTyxVQUFVLE1BQU0sVUFBVSxZQUFZLE1BQU0sT0FBTyxZQUFZLFdBQVcsVUFBVSxNQUFNLE9BQU8sWUFBWSxhQUFhLFdBQVcsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsTUFBTSxPQUFPLFVBQVUsTUFBTSxPQUFPLFVBQVUsWUFBWSxPQUFPLE9BQU8sWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLE1BQU0sT0FBTyxZQUFZLGFBQWEsTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLFlBQVksTUFBTSxPQUFPLFlBQVksTUFBTSxPQUFPLFlBQVksTUFBTSxPQUFPLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxZQUFZ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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsbUNBQW1DO0FBQy9ELDRCQUE0QixtQ0FBbUM7QUFDL0Q7QUFDQTtBQUNBLDRCQUE0QixtQ0FBbUM7QUFDL0QsNEJBQTRCLG1DQUFtQztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLGdCQUFnQixtQ0FBbUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUIseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsT0FBTyxpRkFBaUYsWUFBWSxNQUFNLE9BQU8scUJBQXFCLG9CQUFvQixxQkFBcUIscUJBQXFCLE1BQU0sTUFBTSxXQUFXLE1BQU0sWUFBWSxNQUFNLE1BQU0scUJBQXFCLCtCQUErQixvQkFBb0IscUJBQXFCLHFCQUFxQixxQkFBcUIscUJBQXFCLE1BQU0sT0FBTyxNQUFNLEtBQUssb0JBQW9CLHFCQUFxQixNQUFNLFFBQVEsTUFBTSxLQUFLLG9CQUFvQixvQkFBb0IscUJBQXFCLE1BQU0sTUFBTSxNQUFNLEtBQUssV0FBVyxXQUFXLE1BQU0sTUFBTSxNQUFNLFVBQVUsV0FBVyxXQUFXLE1BQU0sTUFBTSxNQUFNLEtBQUssVUFBVSxXQUFXLE1BQU0sTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLFNBQVMsTUFBTSxRQUFRLHFCQUFxQixxQkFBcUIscUJBQXFCLG9CQUFvQixNQUFNLE1BQU0sTUFBTSxLQUFLLFVBQVUsTUFBTSxNQUFNLE1BQU0sTUFBTSxVQUFVLFVBQVUsV0FBVyxXQUFXLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sUUFBUSxNQUFNLEtBQUssb0JBQW9CLHFCQUFxQixxQkFBcUIsTUFBTSxRQUFRLE1BQU0sU0FBUyxxQkFBcUIscUJBQXFCLHFCQUFxQixvQkFBb0IscUJBQXFCLHFCQUFxQixxQkFBcUIsb0JBQW9CLG9CQUFvQixvQkFBb0IsTUFBTSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sT0FBTyxNQUFNLFFBQVEscUJBQXFCLHFCQUFxQixxQkFBcUIsTUFBTSxNQUFNLE1BQU0sS0FBSyxVQUFVLE1BQU0sTUFBTSxNQUFNLEtBQUssV0FBVyxNQUFNLE1BQU0sTUFBTSxLQUFLLFdBQVcsTUFBTSxNQUFNLE1BQU0sTUFBTSxVQUFVLE1BQU0sT0FBTyxNQUFNLEtBQUsscUJBQXFCLHFCQUFxQixNQUFNLE1BQU0sTUFBTSxLQUFLLFdBQVcsTUFBTSxPQUFPLE1BQU0sS0FBSyxxQkFBcUIsb0JBQW9CLE1BQU0sTUFBTSxNQUFNLEtBQUssV0FBVyxNQUFNLE1BQU0sTUFBTSxpQkFBaUIsVUFBVSxNQUFNLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sT0FBTyxXQUFXLFVBQVUsVUFBVSxNQUFNLE1BQU0sS0FBSyxLQUFLLFVBQVUsTUFBTSxNQUFNLE1BQU0sS0FBSyxXQUFXLE1BQU0sT0FBTyxNQUFNLE1BQU0sb0JBQW9CLG9CQUFvQixNQUFNLE1BQU0sTUFBTSxNQUFNLFVBQVUsTUFBTSxNQUFNLEtBQUssS0FBSyxVQUFVLE1BQU0sUUFBUSxNQUFNLFlBQVksb0JBQW9CLHFCQUFxQixNQUFNLE1BQU0sTUFBTSxNQUFNLFVBQVUsVUFBVSxNQUFNLFdBQVcsS0FBSyxVQUFVLE1BQU0sTUFBTSxXQUFXLEtBQUssTUFBTSxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssTUFBTSxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssS0FBSyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU0sS0FBSyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsS0FBSyxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsS0FBSyxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLEtBQUssS0FBSyxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxNQUFNLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxLQUFLLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sT0FBTyxZQUFZLGFBQWEsYUFBYSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLFlBQVksTUFBTSxNQUFNLEtBQUssTUFBTSxZQUFZLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxLQUFLLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE9BQU8sV0FBVyxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLFFBQVEsWUFBWSxNQUFNLE1BQU0sT0FBTyxLQUFLLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxPQUFPLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxNQUFNLE1BQU0sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxPQUFPLEtBQUssS0FBSyxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sUUFBUSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE9BQU8sTUFBTSxXQUFXLGFBQWEsTUFBTSxPQUFPLE9BQU8sS0FBSyxLQUFLLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxNQUFNLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sV0FBVyxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksWUFBWSxZQUFZLGFBQWEsWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLFlBQVksYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sU0FBUyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLE1BQU0sT0FBTyxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sUUFBUSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sT0FBTyxLQUFLLE1BQU0sT0FBTyxLQUFLLE1BQU0sTUFBTSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE9BQU8sUUFBUSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sWUFBWSxNQUFNLE1BQU0sT0FBTyxLQUFLLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sTUFBTSxLQUFLLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sUUFBUSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsZ0JBQWdCLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLFFBQVEsTUFBTSxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sUUFBUSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sU0FBUyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFNBQVMsWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sT0FBTyxNQUFNLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsWUFBWSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxZQUFZLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLFNBQVMsWUFBWSxZQUFZLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxPQUFPLEtBQUssTUFBTSxPQUFPLE1BQU0sTUFBTSxPQUFPLE1BQU0sTUFBTSxNQUFNLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxRQUFRLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxZQUFZLE1BQU0sTUFBTSxRQUFRLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLE1BQU0sT0FBTyxhQUFhLGFBQWEsV0FBVyxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxTQUFTLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxRQUFRLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsUUFBUSxNQUFNLE1BQU0sT0FBTyxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsWUFBWSxPQUFPLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksT0FBTyxZQUFZLE1BQU0sVUFBVSxNQUFNLEtBQUssd0JBQXdCLHVCQUF1QixPQUFPLFlBQVksTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxLQUFLLEtBQUssS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLGFBQWEsTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sYUFBYSxNQUFNLHdCQUF3Qix5QkFBeUIsT0FBTyxZQUFZLE1BQU0sVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sT0FBTyxLQUFLLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxNQUFNLE9BQU8sTUFBTSxXQUFXLFlBQVksTUFBTSxPQUFPLE1BQU0sV0FBVyxZQUFZLE1BQU0sT0FBTyxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sV0FBVyxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sTUFBTSxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sTUFBTSx3Q0FBd0MseUJBQXlCLHdCQUF3QixjQUFjLDhCQUE4QixLQUFLLGtGQUFrRixvQkFBb0IsS0FBSyx5QkFBeUIsZ0NBQWdDLDhDQUE4QyxrQkFBa0IsK0ZBQStGLHdCQUF3QixLQUFLLHNCQUFzQiwwQkFBMEIsS0FBSyxpQkFBaUIscUJBQXFCLEtBQUssbUJBQW1CLHdCQUF3QixLQUFLLG9CQUFvQix3QkFBd0IsS0FBSywyRkFBMkYsMEJBQTBCLEtBQUssd0JBQXdCLDRCQUE0QixLQUFLLG1CQUFtQix1QkFBdUIsS0FBSyxxQkFBcUIsMEJBQTBCLEtBQUssc0JBQXNCLDBCQUEwQixLQUFLLHVCQUF1QixnQ0FBZ0MsZ0RBQWdELDZCQUE2Qiw4Q0FBOEMsc0JBQXNCLHFGQUFxRixpQkFBaUIsS0FBSyxvQ0FBb0Msb0NBQW9DLEtBQUssb0NBQW9DLDZCQUE2QiwwQkFBMEIsS0FBSyxtQkFBbUI7QUFDeDF5QztBQUNBLGlFQUFlLHVCQUF1QixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2ptTHZDO0FBQzZHO0FBQ2pCO0FBQ29EO0FBQ047QUFDQztBQUMzSSw4QkFBOEIsbUZBQTJCLENBQUMsNEZBQXFDO0FBQy9GLDBCQUEwQix5SEFBaUM7QUFDM0QsMEJBQTBCLG1IQUFpQztBQUMzRCwwQkFBMEIsb0hBQWlDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxnR0FBZ0csWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLE1BQU0sT0FBTyxXQUFXLE1BQU0sUUFBUSxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLE1BQU0sS0FBSyxZQUFZLGFBQWEsT0FBTyxRQUFRLFlBQVksYUFBYSxPQUFPLFFBQVEsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLFdBQVcsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLE1BQU0sS0FBSyxVQUFVLFlBQVksUUFBUSxLQUFLLFlBQVksYUFBYSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxVQUFVLFlBQVksV0FBVyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxPQUFPLFlBQVksTUFBTSxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksV0FBVyxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLFdBQVcsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxXQUFXLFlBQVksT0FBTyxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxNQUFNLE1BQU0sS0FBSyxLQUFLLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLE1BQU0sTUFBTSxLQUFLLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksTUFBTSxNQUFNLEtBQUssS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxNQUFNLE1BQU0sS0FBSyxLQUFLLFVBQVUsS0FBSyxNQUFNLEtBQUssS0FBSyxVQUFVLEtBQUssc0VBQXNFLDJDQUEyQyw0Q0FBNEMsd0RBQXdELHVCQUF1Qiw4QkFBOEIseUJBQXlCLHVCQUF1QixtQkFBbUIsc0hBQXNILGtCQUFrQixLQUFLLDRHQUE0RyxzQkFBc0IscUJBQXFCLDhCQUE4Qix5QkFBeUIsb0JBQW9CLDBCQUEwQixtQkFBbUIscUJBQXFCLHlCQUF5Qix5QkFBeUIsd0JBQXdCLG9CQUFvQixLQUFLLHFEQUFxRCw2QkFBNkIsOEJBQThCLEtBQUssd0tBQXdLLDRCQUE0QiwrQkFBK0IsS0FBSyxvTEFBb0wsZ0NBQWdDLDhCQUE4QixLQUFLLDJCQUEyQix5QkFBeUIsc0JBQXNCLHdCQUF3Qiw2QkFBNkIsS0FBSyxtQ0FBbUMseUJBQXlCLGNBQWMsa0JBQWtCLDJCQUEyQiwwQkFBMEIsOEJBQThCLEtBQUssb0JBQW9CLHdCQUF3Qix5QkFBeUIsNkJBQTZCLEtBQUsseUNBQXlDLG1CQUFtQixLQUFLLG9DQUFvQyw0QkFBNEIsS0FBSyx3QkFBd0IsdUJBQXVCLEtBQUssd0JBQXdCLHFCQUFxQixrQkFBa0IsNkJBQTZCLGtCQUFrQix1QkFBdUIscUJBQXFCLDBCQUEwQiwwQkFBMEIsb0NBQW9DLGdCQUFnQixzQkFBc0IsS0FBSyw4QkFBOEIsZ0NBQWdDLDhCQUE4QixLQUFLLGdCQUFnQix1QkFBdUIsS0FBSyxjQUFjLHNCQUFzQix1QkFBdUIsS0FBSyxzQkFBc0Isa0NBQWtDLHFDQUFxQyxnQkFBZ0IsK0NBQStDLEtBQUssdUJBQXVCLHlCQUF5QixhQUFhLGVBQWUsNkJBQTZCLGtCQUFrQixtQkFBbUIsb0JBQW9CLDhCQUE4QiwwQkFBMEIseUJBQXlCLCtDQUErQyxLQUFLLHlCQUF5QixzQkFBc0IsS0FBSyxvREFBb0QsZ0NBQWdDLGtCQUFrQixLQUFLLHNCQUFzQixnQ0FBZ0Msa0JBQWtCLEtBQUssbUJBQW1CLGdDQUFnQyxrQkFBa0IsS0FBSyxrQkFBa0IsZ0NBQWdDLGtCQUFrQixLQUFLLGdCQUFnQixnQ0FBZ0Msa0JBQWtCLEtBQUssbUJBQW1CLHdCQUF3QixrQkFBa0Isb0JBQW9CLDBCQUEwQiw4QkFBOEIsc0JBQXNCLEtBQUsscUJBQXFCLHFEQUFxRCx1Q0FBdUMseUJBQXlCLEtBQUssbUJBQW1CLDRCQUE0QixtQkFBbUIsMEJBQTBCLGtDQUFrQyw4QkFBOEIsc0JBQXNCLHlCQUF5Qix1QkFBdUIsS0FBSyxXQUFXLGlCQUFpQixLQUFLLDJCQUEyQix5QkFBeUIsd0JBQXdCLG1CQUFtQiw4QkFBOEIscUhBQXFILGdDQUFnQywrREFBK0Qsc0NBQXNDLHlCQUF5QiwwQkFBMEIsS0FBSyw4Q0FBOEMsdUNBQXVDLEtBQUssZ0RBQWdELHVDQUF1QyxLQUFLLGlEQUFpRCxxQ0FBcUMsS0FBSywrQ0FBK0Msd0NBQXdDLEtBQUsseUJBQXlCLGtCQUFrQixLQUFLLG1DQUFtQyxVQUFVLG1CQUFtQixtQ0FBbUMsT0FBTyxnQkFBZ0IsbUJBQW1CLGlDQUFpQyxPQUFPLEtBQUssc0NBQXNDLFVBQVUsbUJBQW1CLG9DQUFvQyxPQUFPLGdCQUFnQixtQkFBbUIsaUNBQWlDLE9BQU8sS0FBSyxxQ0FBcUMsVUFBVSxtQkFBbUIsb0NBQW9DLE9BQU8sZ0JBQWdCLG1CQUFtQixpQ0FBaUMsT0FBTyxLQUFLLHFDQUFxQyxVQUFVLG1CQUFtQixtQ0FBbUMsT0FBTyxnQkFBZ0IsbUJBQW1CLGlDQUFpQyxPQUFPLEtBQUssMERBQTBELGFBQWEscUJBQXFCLE9BQU8sS0FBSyw4Q0FBOEMsYUFBYSxxQkFBcUIsT0FBTyxLQUFLLHVCQUF1QjtBQUM5NlA7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoVHZDO0FBQzZHO0FBQ2pCO0FBQzVGLDhCQUE4QixtRkFBMkIsQ0FBQyw0RkFBcUM7QUFDL0Ysc0hBQXNIO0FBQ3RILDRIQUE0SDtBQUM1SCxnSUFBZ0k7QUFDaEksZ0lBQWdJO0FBQ2hJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVELG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLDJGQUEyRixZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksV0FBVyxVQUFVLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLFdBQVcsVUFBVSxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLE1BQU0sT0FBTyxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsTUFBTSxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sTUFBTSxZQUFZLE9BQU8sTUFBTSxZQUFZLE9BQU8sTUFBTSxZQUFZLE9BQU8sTUFBTSxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsVUFBVSxZQUFZLFdBQVcsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxZQUFZLFdBQVcsVUFBVSxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sT0FBTyxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEs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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQSxrQ0FBa0MsUUFBUTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLHVDQUF1QyxRQUFRO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTLHlCQUF5QjtBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4REFBOEQsWUFBWTtBQUMxRTtBQUNBLDhEQUE4RCxZQUFZO0FBQzFFO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsWUFBWTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoZkEsaUVBQWUscUJBQXVCLDREQUE0RDs7Ozs7Ozs7OztBQ0FsRywrR0FBZSxHQUFHLElBQXFDLENBQUMsaUNBQU8sRUFBRSxvQ0FBQyxDQUFDO0FBQUE7QUFBQTtBQUFBLGtHQUFDLENBQUMsS0FBSyxFQUE2RSxDQUFDLGtCQUFrQixhQUFhLGdCQUFnQiwrQkFBK0IsV0FBVyw0RkFBNEYsV0FBVyxrRUFBa0UsNERBQTRELFlBQVksSUFBSSxrQkFBa0IseUJBQXlCLDBEQUEwRCxrQkFBa0Isc0JBQXNCLHlDQUF5QyxVQUFVLGNBQWMseUJBQXlCLG9CQUFvQixJQUFJLFNBQVMsVUFBVSxvQ0FBb0MsY0FBYyxJQUFJLHlDQUF5QyxTQUFTLDBDQUEwQywwRkFBMEYsMkhBQTJILHFCQUFNLEVBQUUscUJBQU0sVUFBVSxxQkFBTSxDQUFDLHFCQUFNLHdNQUF3TSw4REFBOEQsdURBQXVELGlOQUFpTiwwQkFBMEIsNEJBQTRCLEtBQUssS0FBSyxnREFBZ0QsbUZBQW1GLHNCQUFzQixLQUFLLGtDQUFrQyxpREFBaUQsS0FBSyxHQUFHLG1CQUFtQiw4SEFBOEgsb0lBQW9JLGlEQUFpRCxxQkFBcUIsdUJBQXVCLGVBQWUsMEJBQTBCLEdBQUcsd0JBQXdCLHlDQUF5QyxvQkFBb0IsS0FBSyxnREFBZ0QsNERBQTRELHFCQUFxQixPQUFPLEVBQUUsb0JBQW9CLEtBQTBCLHFCQUFxQjs7QUFFaHBGOzs7Ozs7Ozs7Ozs7Ozs7QUNGTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWEE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckJxQztBQUNlO0FBQ1Q7QUFDVTtBQUM1RCxxREFBcUQ7QUFDckQ7QUFDQSxtQkFBbUIscURBQU8sNERBQTRELDJDQUEyQztBQUNqSTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDTztBQUNQO0FBQ0Esb0NBQW9DLGdCQUFnQix5RUFBZ0IsQ0FBQyxzREFBUTtBQUM3RTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHdFQUFtQjtBQUM5QixlQUFlLHlEQUFRO0FBQ3ZCLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQjBDO0FBQ0U7QUFDSjtBQUNvQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxtQkFBbUI7QUFDL0Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDTztBQUNQLGlDQUFpQztBQUNqQyx3QkFBd0IseUVBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxxREFBTyx3Q0FBd0MsbURBQVcsZ0NBQWdDLE9BQU8seURBQVEsd0JBQXdCO0FBQzVJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwQitDO0FBQ007QUFDTTtBQUNUO0FBQ0M7QUFDUztBQUNSO0FBQzRCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyx3Q0FBd0M7QUFDakY7QUFDQSwwQ0FBMEMseUJBQXlCLFNBQVMsZ0RBQVM7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asd0JBQXdCLHlFQUFnQixDQUFDLHFEQUFPLGtDQUFrQyxzREFBUTtBQUMxRixrQkFBa0Isd0VBQW1CLGlCQUFpQixrREFBVztBQUNqRSx1QkFBdUIsb0VBQWtCO0FBQ3pDO0FBQ0EsdUJBQXVCLGtFQUFpQjtBQUN4QztBQUNBO0FBQ0EsZUFBZSxzREFBVztBQUMxQixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGtFQUFpQjtBQUN0QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsZ0JBQWdCLGlEQUFRO0FBQ3hCLGtCQUFrQiw4Q0FBUztBQUMzQjtBQUNBO0FBQ0EsUUFBUSxnRUFBYSw4QkFBOEIseUVBQXVCO0FBQzFFLFlBQVksZ0VBQWEsZ0NBQWdDLHlFQUF1QjtBQUNoRjtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6RTJEO0FBQ1Q7QUFDSztBQUNKO0FBQ0Y7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHlCQUF5QjtBQUNsQztBQUNPO0FBQ1Asa0JBQWtCLHdFQUFtQixpQkFBaUIsa0RBQVc7QUFDakUsdUJBQXVCLG9FQUFrQjtBQUN6QyxxQkFBcUIsZ0VBQWUsQ0FBQyw4REFBYTtBQUNsRCx3QkFBd0IsOERBQWE7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGtEQUFPO0FBQzFCLFNBQVM7QUFDVCxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pCcUM7QUFDTztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHdDQUF3QztBQUM5RCxTQUFTLG1CQUFtQjtBQUM1QjtBQUNPO0FBQ1AsOEJBQThCO0FBQzlCLG9CQUFvQix5REFBVztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxRQUFRLGtEQUFPO0FBQ2Y7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2Q29EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxxQkFBcUI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixpRUFBZ0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsMEJBQTBCO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekZxQztBQUM0QztBQUN6QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsV0FBVztBQUN4QjtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixxREFBTztBQUN4Qix3Q0FBd0MsUUFBUSx5REFBUSxtQkFBbUI7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGlFQUFnQjtBQUMxQixVQUFVLGtFQUFpQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGlFQUFnQixDQUFDLHFEQUFPO0FBQ2xDLFVBQVUsa0VBQWlCLENBQUMscURBQU87QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0RBQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0I7QUFDTztBQUNQLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QjtBQUNPO0FBQ1AsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGtEQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QjtBQUNPO0FBQ1AsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0I7QUFDTztBQUNQLDhCQUE4QjtBQUM5QjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pIb0Q7QUFDRDtBQUNkO0FBQzlCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrREFBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixpRUFBWTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixnRUFBYTtBQUN2Qyx5QkFBeUIsZ0VBQWE7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckZrQztBQUMrQztBQUNwQztBQUN1QjtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxXQUFXLCtDQUFPO0FBQ2xCLGtDQUFrQyxPQUFPLG9EQUFlLDBCQUEwQjtBQUNsRixrQ0FBa0MsT0FBTyxtREFBYyxTQUFTO0FBQ2hFO0FBQ087QUFDUCw0QkFBNEI7QUFDNUIsV0FBVywrQ0FBTyxpQ0FBaUMsT0FBTyw2REFBd0IsZ0JBQWdCO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHlCQUF5QjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsV0FBVywwREFBZSxpQkFBaUIsd0RBQWE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHdCQUF3QjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsV0FBVywwREFBZSxpQkFBaUIsd0RBQWE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCwyQkFBMkIsa0VBQXVCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwrQ0FBTztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUUyRDtBQUNoQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0IsNEJBQTRCLE9BQU87QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QywrQkFBK0I7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxnQkFBZ0IsK0NBQU87QUFDdkI7QUFDQSw2Q0FBNkMsbURBQVc7QUFDeEQ7QUFDQSwyQkFBMkIsK0NBQU8sdURBQXVELG1EQUFXLDJDQUEyQyxzREFBYztBQUM3SjtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqREE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ08sNkJBQTZCO0FBQzdCLDhCQUE4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1hZO0FBQ0g7QUFDWjtBQUNsQztBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsK0NBQVU7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsd0JBQXdCLDhEQUFtQjtBQUMzQztBQUNBLGVBQWUsMkRBQWM7QUFDN0I7QUFDQSxXQUFXLDJEQUFjLENBQUMsOERBQW1CO0FBQzdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxQnNDO0FBQ3RDO0FBQ0E7QUFDQSxnQkFBZ0IsK0NBQWM7QUFDOUIsZ0NBQWdDLCtCQUErQjtBQUMvRCxnQ0FBZ0Msb0JBQW9CO0FBQ3BEO0FBQ087QUFDUCxRQUFRLG1EQUFjO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxvQ0FBb0MsaURBQWlEO0FBQ3JGO0FBQ0EsMENBQTBDLDZCQUE2QjtBQUN2RTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkI2QztBQUN0QztBQUNQO0FBQ0EsZUFBZSwwREFBVztBQUMxQjtBQUNBO0FBQ0E7QUFDTztBQUNQLHlCQUF5QiwwREFBVztBQUNwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsZ0RBQVMsZUFBZSw4Q0FBOEM7QUFDOUg7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQmtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTyw0Q0FBNEM7QUFDNUMsMkNBQTJDO0FBQzNDO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1Asc0NBQXNDLDBEQUFrQjtBQUN4RDtBQUNBO0FBQ08sZ0NBQWdDLFFBQVE7QUFDeEMsb0NBQW9DO0FBQ3BDLCtCQUErQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0RVk7QUFDWjtBQUNKO0FBQ2xDO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IscUJBQXFCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCx5QkFBeUIsK0NBQU87QUFDaEMsc0JBQXNCLCtDQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLG1EQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsaURBQWlELGtCQUFrQiwrREFBb0IsMkJBQTJCO0FBQ2xIOzs7Ozs7Ozs7Ozs7Ozs7O0FDMURPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1BrQztBQUMzQjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxXQUFXLCtDQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEU7QUFDMUU7QUFDQSxLQUFLO0FBQ0wsa0NBQWtDLCtDQUErQztBQUNqRjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZDMEM7QUFDUjtBQUNNO0FBQ3hDLHFCQUFxQixpREFBUztBQUM5QjtBQUNBO0FBQ0EsV0FBVywrQ0FBTztBQUNsQjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDJHQUEyRyxtREFBbUQ7QUFDOUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsK0NBQU8sOEVBQThFLHlCQUF5QjtBQUM1SDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCx5REFBeUQsa0RBQVU7QUFDbkUsV0FBVywrQ0FBTztBQUNsQiwrQkFBK0IsK0JBQStCO0FBQzlELHdDQUF3QywyQkFBMkI7QUFDbkU7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6Q0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDckJBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ25GQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUF3QztBQUNoRCxlQUFlLHNCQUFpQjtBQUNoQztBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1phOztBQUViLGNBQWMsbUJBQU8sQ0FBQyx1RkFBVTs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQkFBb0IsaUJBQWlCO0FBQ3JDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7OztBQUliLElBQUksSUFBcUM7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEOztBQUVqRDtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7O0FBRWxEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQjtBQUNqQixzQkFBc0I7QUFDdEIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2QixlQUFlO0FBQ2Ysa0JBQWtCO0FBQ2xCLGdCQUFnQjtBQUNoQixZQUFZO0FBQ1osWUFBWTtBQUNaLGNBQWM7QUFDZCxnQkFBZ0I7QUFDaEIsa0JBQWtCO0FBQ2xCLGdCQUFnQjtBQUNoQixtQkFBbUI7QUFDbkIsd0JBQXdCO0FBQ3hCLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekIsaUJBQWlCO0FBQ2pCLG9CQUFvQjtBQUNwQixrQkFBa0I7QUFDbEIsY0FBYztBQUNkLGNBQWM7QUFDZCxnQkFBZ0I7QUFDaEIsa0JBQWtCO0FBQ2xCLG9CQUFvQjtBQUNwQixrQkFBa0I7QUFDbEIsMEJBQTBCO0FBQzFCLGNBQWM7QUFDZCxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7OztBQ3BMYTs7QUFFYixJQUFJLEtBQXFDLEVBQUUsRUFFMUMsQ0FBQztBQUNGLEVBQUUscUtBQXlEO0FBQzNEOzs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLHFCQUFNLGdCQUFnQixxQkFBTSxJQUFJLHFCQUFNLHNCQUFzQixxQkFBTTs7QUFFMUY7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUSxXQUFXO0FBQzlCLFdBQVcsU0FBUztBQUNwQjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLCtDQUErQyxpQkFBaUI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ3hYQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNqRkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RLRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ2pFRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0Es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QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDeEZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFF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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdElEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RIRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3BJRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3JORDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdEZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDckZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6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LFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ25JRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdEZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUMvTkQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzNGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDbkVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNv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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDOUVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDakVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxpQ0FBaUM7QUFDakMsY0FBYztBQUNkLGdDQUFnQztBQUNoQyxjQUFjO0FBQ2QsbUNBQW1DO0FBQ25DLGNBQWM7QUFDZCxtQ0FBbUM7QUFDbkMsY0FBYztBQUNkLGdDQUFnQztBQUNoQyxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzdJRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNsR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzlFRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDL0hEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDM0VEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFT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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM3REQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzFGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNU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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsSUFBSSxLQUE0RDtBQUNoRSxJQUFJLENBQ3lCO0FBQzdCLENBQUMsc0JBQXNCOztBQUV2Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IseUJBQXlCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixrQ0FBa0M7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIscUJBQXFCLEVBQUU7QUFDdkIsMEJBQTBCLEVBQUU7QUFDNUI7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLElBQUk7QUFDNUIsd0JBQXdCLElBQUk7QUFDNUIsNkJBQTZCLElBQUk7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsSUFBSTtBQUM1QztBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsTUFBTSx3RUFBd0UsTUFBTSxtQkFBbUIsTUFBTSxxQkFBcUIsTUFBTSxFQUFFLElBQUk7QUFDaks7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixPQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsT0FBTztBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLCtCQUErQjtBQUNuRDtBQUNBOztBQUVBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxtQ0FBbUMsaUJBQWlCO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDRHQUE0RztBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxzQkFBc0I7QUFDMUQ7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msc0JBQXNCO0FBQzFEO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQyxPQUFPO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxPQUFPO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLE9BQU87QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxPQUFPO0FBQzVDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsbUJBQW1CO0FBQ3pDO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLENBQUM7Ozs7Ozs7Ozs7OztBQ3ZqTEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtB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QUF1QjtBQUN2QjtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwREFBMEQ7O0FBRTFEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCOztBQUVBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjs7QUFFQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTs7Ozs7Ozs7Ozs7O0FDMUxhOztBQUViO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7Ozs7Ozs7Ozs7OztBQ2xEYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkVhOztBQUViO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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OztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLDZCQUE2QjtBQUM3Qiw0QkFBNEI7QUFDNUIsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxxQkFBcUIsWUFBWTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNI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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsMEJBQTBCLDRCQUE0QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsMEJBQTBCLDRCQUE0QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsMEJBQTBCLDRCQUE0QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLDBCQUEwQiw0QkFBNEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEdBQTRHLGdCQUFnQjtBQUM1SDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtGQUErRixJQUFJO0FBQ25HO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDNWlCakI7O0FBRWIsZUFBZSxtQkFBTyxDQUFDLHdIQUFnRDtBQUN2RSw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkcsdUNBQXVDLG1CQUFPLENBQUMsNEtBQTBFO0FBQ3pILDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2Ysc0NBQXNDLG1CQUFPLENBQUMsc0hBQStDO0FBQzdGLHNDQUFzQyxtQkFBTyxDQUFDLDREQUFVO0FBQ3hELHNDQUFzQyxtQkFBTyxDQUFDLDREQUFVO0FBQ3hELCtDQUErQyxtQkFBTyxDQUFDLGdGQUFvQjtBQUMzRSw4Q0FBOEMsbUJBQU8sQ0FBQyw4RUFBbUI7QUFDekUseURBQXlELG1CQUFPLENBQUMsb0dBQThCO0FBQy9GLHFEQUFxRCxtQkFBTyxDQUFDLDRGQUEwQjtBQUN2RixzQ0FBc0MsbUJBQU8sQ0FBQyw4REFBVztBQUN6RCw2Q0FBNkMsbUJBQU8sQ0FBQyw0RUFBa0I7QUFDdkUsdUNBQXVDLG1CQUFPLENBQUMsZ0VBQVk7QUFDM0Qsd0NBQXdDLG1CQUFPLENBQUMsa0VBQWE7QUFDN0QsNkNBQTZDLG1CQUFPLENBQUMsNEVBQWtCO0FBQ3ZFLG9DQUFvQyxtQkFBTyxDQUFDLDBEQUFTO0FBQ3JELHVDQUF1QyxtQkFBTyxDQUFDLGdFQUFZO0FBQzNELDBDQUEwQyxtQkFBTyxDQUFDLHNFQUFlO0FBQ2pFLDJDQUEyQyxtQkFBTyxDQUFDLHdFQUFnQjtBQUNuRSwwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRSx5Q0FBeUMsbUJBQU8sQ0FBQyxvRUFBYztBQUMvRCw0Q0FBNEMsbUJBQU8sQ0FBQywwRUFBaUI7QUFDckUsd0NBQXdDLG1CQUFPLENBQUMsa0VBQWE7QUFDN0Qsb0NBQW9DLG1CQUFPLENBQUMsb0VBQWM7QUFDMUQsNENBQTRDLG1CQUFPLENBQUMsMEVBQWlCO0FBQ3JFLDJDQUEyQyxtQkFBTyxDQUFDLHdFQUFnQjtBQUNuRSxnREFBZ0QsbUJBQU8sQ0FBQyxrRkFBcUI7QUFDN0UsNkNBQTZDLG1CQUFPLENBQUMsNEVBQWtCO0FBQ3ZFLDBDQUEwQyxtQkFBTyxDQUFDLHNFQUFlO0FBQ2pFLG1DQUFtQyxtQkFBTyxDQUFDLHdEQUFRO0FBQ25ELHlDQUF5QyxtQkFBTyxDQUFDLG9FQUFjO0FBQy9ELDRDQUE0QyxtQkFBTyxDQUFDLDBFQUFpQjtBQUNyRSx3Q0FBd0MsbUJBQU8sQ0FBQyxrRUFBYTtBQUM3RCwwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRSwyQ0FBMkMsbUJBQU8sQ0FBQyx3RUFBZ0I7QUFDbkUsc0NBQXNDLG1CQUFPLENBQUMsOERBQVc7QUFDekQsd0NBQXdDLG1CQUFPLENBQUMsa0VBQWE7QUFDN0QsNkNBQTZDLG1CQUFPLENBQUMsNEVBQWtCO0FBQ3ZFLDhDQUE4QyxtQkFBTyxDQUFDLDhFQUFtQjtBQUN6RSx1REFBdUQsbUJBQU8sQ0FBQyxnR0FBNEI7QUFDM0YsZ0RBQWdELG1CQUFPLENBQUMsa0ZBQXFCO0FBQzdFLGtEQUFrRCxtQkFBTyxDQUFDLHNGQUF1QjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBdUIsNENBQTRDLGlCQUFXO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxhQUFhLDBCQUEwQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLGdCQUFnQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHdFQUF3RSxhQUFhO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLDJFQUEyRSxlQUFlO0FBQzFGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7QUFDeEUsd0NBQXdDO0FBQ3hDLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBZTs7Ozs7Ozs7Ozs7QUNwWmpCOztBQUViLDZCQUE2QixtQkFBTyxDQUFDLG9KQUE4RDtBQUNuRyw2QkFBNkIsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDM0Y7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBZTtBQUNmLG1DQUFtQyxtQkFBTyxDQUFDLDhIQUFtRDtBQUM5Riw4Q0FBOEMsbUJBQU8sQ0FBQyxzSEFBK0M7QUFDckcsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHVCQUF1QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztB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Q0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ04sNkJBQTZCLFVBQVU7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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Q0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixVQUFVO0FBQzFCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0Esd0VBQXdFLGFBQWE7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlO0FBQ2Y7QUFDQTtBQUNBLDJFQUEyRSxlQUFlO0FBQzFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDaFNqQjs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkcsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0Qsa0JBQWU7QUFDZixzQ0FBc0MsbUJBQU8sQ0FBQyxzSEFBK0M7QUFDN0Ysc0NBQXNDLG1CQUFPLENBQUMsMElBQXlEO0FBQ3ZHLDhDQUE4QyxtQkFBTyxDQUFDLHNIQUErQztBQUNyRyw4Q0FBOEMsbUJBQU8sQ0FBQyw4RUFBbUI7QUFDekUsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEVBQUU7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEVBQUU7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEVBQUU7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkZBQTZGLGFBQWE7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBZTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3pJYTs7QUFFYixlQUFlLG1CQUFPLENBQUMsd0hBQWdEO0FBQ3ZFLDhCQUE4QixtQkFBTyxDQUFDLG9KQUE4RDtBQUNwRyx1Q0FBdUMsbUJBQU8sQ0FBQyw0S0FBMEU7QUFDekgsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0Qsa0JBQWU7QUFDZiw4Q0FBOEMsbUJBQU8sQ0FBQyxzSEFBK0M7QUFDckcsc0NBQXNDLG1CQUFPLENBQUMsMElBQXlEO0FBQ3ZHLHFDQUFxQyxtQkFBTyxDQUFDLGtJQUFxRDtBQUNsRyxtQ0FBbUMsbUJBQU8sQ0FBQyw4SEFBbUQ7QUFDOUYsc0NBQXNDLG1CQUFPLENBQUMsMElBQXlEO0FBQ3ZHLHdDQUF3QyxtQkFBTyxDQUFDLG9JQUFzRDtBQUN0Ryx1Q0FBdUMsbUJBQU8sQ0FBQywwSUFBeUQ7QUFDeEcsNkNBQTZDLG1CQUFPLENBQUMsc0pBQStEO0FBQ3BILHFDQUFxQyxtQkFBTyxDQUFDLHNJQUF1RDtBQUNwRyxzQ0FBc0MsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDcEcsc0NBQXNDLG1CQUFPLENBQUMsc0hBQStDO0FBQzdGLHFDQUFxQyxtQkFBTyxDQUFDLGtJQUFxRDtBQUNsRyw4Q0FBOEMsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDcEgsbUNBQW1DLG1CQUFPLENBQUMsa0lBQXFEO0FBQ2hHLGtDQUFrQyxtQkFBTyxDQUFDLGdJQUFvRDtBQUM5RiwwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRSw4Q0FBOEMsbUJBQU8sQ0FBQyw4RUFBbUI7QUFDekUscUNBQXFDLG1CQUFPLENBQUMsNERBQVU7QUFDdkQscUNBQXFDLG1CQUFPLENBQUMsNERBQVU7QUFDdkQscUNBQXFDLG1CQUFPLENBQUMsNERBQVU7QUFDdkQsdUNBQXVDLG1CQUFPLENBQUMsZ0VBQVk7QUFDM0Qsd0NBQXdDLG1CQUFPLENBQUMsa0VBQWE7QUFDN0QseUNBQXlDLG1CQUFPLENBQUMsb0VBQWM7QUFDL0Qsd0NBQXdDLG1CQUFPLENBQUMsa0VBQWE7QUFDN0Qsb0JBQW9CLG1CQUFPLENBQUMsd0VBQWdCO0FBQzVDLDJCQUEyQixtQkFBTyxDQUFDLHNGQUF1QjtBQUMxRCxtQ0FBbUMsbUJBQU8sQ0FBQyx3REFBUTtBQUNuRCxlQUFlLG1CQUFPLENBQUMsOERBQVc7QUFDbEMsNENBQTRDLG1CQUFPLENBQUMsMEVBQWlCO0FBQ3JFLDREQUE0RCxtQkFBTyxDQUFDLDBHQUFpQztBQUNyRyxxQ0FBcUMsbUJBQU8sQ0FBQyw0REFBVTtBQUN2RCw0REFBNEQsbUJBQU8sQ0FBQywwR0FBaUM7QUFDckcsOENBQThDLG1CQUFPLENBQUMsOEVBQW1CO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsTUFBTTtBQUN0QixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU07QUFDdEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWEsZUFBZTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixvQkFBb0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHVCQUF1QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLGtDQUFrQztBQUNsQztBQUNBLG9DQUFvQztB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UTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVLEVBQUU7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVSxFQUFFO0FBQ1o7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLG9CQUFvQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7Ozs7Ozs7OztBQ3BjWTs7QUFF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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxlQUFlO0FBQ2Y7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsV0FBVztBQUN4QixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsV0FBVztBQUN4QixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxnQkFBZ0I7QUFDN0IsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FB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RUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsVUFBVTtBQUMvRDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EscURBQXFELFVBQVUsS0FBSztBQUNwRTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFlOzs7Ozs7Ozs7OztBQ3hkakI7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2Ysc0NBQXNDLG1CQUFPLENBQUMsc0hBQStDO0FBQzdGLDBDQUEwQyxtQkFBTyxDQUFDLHNFQUFlO0FBQ2pFLGlEQUFpRCxtQkFBTyxDQUFDLG9GQUFzQjtBQUMvRSwwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRSx3Q0FBd0MsbUJBQU8sQ0FBQyxrRUFBYTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFlOzs7Ozs7Ozs7OztBQzFHakI7O0FBRWIsOEJBQThCLG1CQUFPLENBQUMsb0pBQThEO0FBQ3BHLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2Ysc0NBQXNDLG1CQUFPLENBQUMsc0hBQStDO0FBQzdGLDZDQUE2QyxtQkFBTyxDQUFDLG9KQUE4RDtBQUNuSCx3Q0FBd0MsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDdEcsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakUsaURBQWlELG1CQUFPLENBQUMsb0ZBQXNCO0FBQy9FLHlDQUF5QyxtQkFBTyxDQUFDLG9FQUFjO0FBQy9ELDBDQUEwQyxtQkFBTyxDQUFDLHNFQUFlO0FBQ2pFLHNDQUFzQyxtQkFBTyxDQUFDLDhEQUFXO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUErQyxxSEFBcUg7QUFDcEs7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLGFBQWEsdUJBQXVCLG1DQUFtQztBQUN2RSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGtDQUFrQztBQUNsQyxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSx1QkFBdUIsbUNBQW1DO0FBQ3ZFLGFBQWEsUUFBUTtBQUNyQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQSx3RUFBd0UsYUFBYTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQSwyRUFBMkUsZUFBZTtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQSwyRUFBMkUsZUFBZTtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQSwyRUFBMkUsZUFBZTtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxlQUFlO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRTtBQUN0RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0MsMkZBQTJGO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGtDQUFrQztBQUNsQztBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNM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QUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGtEQUFlO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0Msa0RBQWU7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxrREFBZTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1REFBYztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxnREFBYTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxnREFBYTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsZ0RBQWE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0RBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0RBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxnREFBYTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsZ0RBQWE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLCtDQUFNO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDhEQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUVBQWUsWUFBWSxFQUFDO0FBQzVCOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQzBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsU0FBUztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IscUJBQXFCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixTQUFTO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsZUFBZTtBQUM3RCw4QkFBOEIsU0FBUztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxTQUFTO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFVBQVU7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxD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QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekl3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsVUFBVTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQscURBQVc7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsVUFBVTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxxREFBVztBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4QkFBOEI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsS0FBSztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULDRCQUE0QjtBQUM1QixPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVMsS0FBcUM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLElBQXFDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLDJCQUEyQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU0sS0FBcUMsNEZBQTRGLENBQU07QUFDN0k7QUFDQTs7QUFFQSxvQkFBb0IsZ0NBQWdDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLGdDQUFnQztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUhBQWlIO0FBQ2pIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7QUNqbUJB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGdDQUFnQztBQUNoRTtBQUNBO0FBQ0EsZ0NBQWdDLDhCQUE4QjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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VDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsY0FBYztBQUMzRDs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsdURBQXVELGNBQWM7QUFDckU7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZDQUE2QyxjQUFjO0FBQzNEOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsV0FBVztBQUM1RDtBQUNBLGlEQUFpRCxXQUFXO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELFdBQVc7QUFDNUQ7QUFDQSxpREFBaUQsV0FBVztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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OztBQUVoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxFQUFFLFNBQVM7QUFDekI7QUFDQSxRQUFRLE9BQU8sRUFBRSxTQUFTO0FBQzFCO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztB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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTs7O0FBR1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSw4REFBOEQ7QUFDOUQsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLFNBQVM7QUFDVCx1QkFBdUI7QUFDdkI7QUFDQSxTQUFTO0FBQ1QsdUJBQXVCO0FBQ3ZCO0FBQ0EsU0FBUztBQUNULHdCQUF3QjtBQUN4QjtBQUNBLFNBQVM7QUFDVCx3QkFBd0I7QUFDeEI7QUFDQSxTQUFTO0FBQ1QsaUNBQWlDO0FBQ2pDO0FBQ0EsU0FBUztBQUNULDJCQUEyQjtBQUMzQjtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJEQUEyRDs7QUFFM0Q7QUFDQTs7QUFFQTtBQUNBLHlEQUF5RDtBQUN6RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYSxrQkFBa0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0EsZ0ZBQWdGO0FBQ2hGO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7O0FBR2xCO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsR0FBRztBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtFQUFrRTtBQUNsRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtRkFBbUY7QUFDbkY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUSwwQ0FBMEM7OztBQUdsRDtBQUNBOztBQUVBO0FBQ0E7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QUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFlBQVksV0FBVztBQUN2Qjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkNBQTJDO0FBQzNDOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7O0FBRUEsc0NBQXNDO0FBQ3RDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLGlCQUFpQjs7QUFFakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxlQUFlO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSLHdFQUF3RTs7QUFFeEU7QUFDQSwrREFBK0Q7QUFDL0Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFROzs7QUFHUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxNQUFNO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxXQUFXLE1BQU07QUFDakI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRjs7QUFFM0Y7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDs7QUFFdkQsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ04sSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBLHlDQUF5Qzs7QUFFekM7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QztBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDOztBQUU5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBLHVDQUF1Qzs7QUFFdkMsK0JBQStCO0FBQy9COztBQUVBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQSwwRUFBMEU7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUywyQ0FBMkM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFO0FBQ0E7O0FBRUEsb0JBQW9CLGlDQUFpQztBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1CQUFtQiw0Q0FBNEM7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEVBQTRFOztBQUU1RSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7O0FBRUEsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7O0FBR0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxnQkFBZ0IsZUFBZTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUNBQXFDOztBQUVyQztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0NBQWdDO0FBQ2hDLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDO0FBQ2pDLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQixLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0M7QUFDbEM7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlDQUF5QztBQUN6QztBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxRQUFRO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0Esa0RBQWtEO0FBQ2xEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLGdGQUFnRjtBQUNoRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4R0FBOEc7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKLGtCQUFrQixrQkFBa0I7QUFDcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHdCQUF3QjtBQUNuQyxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyx3QkFBd0I7QUFDbkMsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFlBQVk7QUFDdkIsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsd0JBQXdCO0FBQ25DLFdBQVcsUUFBUTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtFQUErRTtBQUMvRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJHQUEyRztBQUMzRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRiwyVEFBMlQ7QUFDM1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLCtDQUErQyxRQUFRO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw0QkFBNEI7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sMkVBQTJFLG9HQUFvRyxrQ0FBa0M7QUFDdk47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTSxvR0FBb0c7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1FQUFtRTs7QUFFbkUsK0ZBQStGO0FBQy9GOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFO0FBQ0E7QUFDQSxFQUFFLG1CQUFtQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0Q7O0FBRWhEO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJLGNBQWM7QUFDbEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdCQUFnQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUyxjQUFjO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSwrQ0FBK0M7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLCtDQUErQztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsK0NBQStDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOzs7QUFHQSwwRUFBMEU7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwySEFBMkg7QUFDM0g7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvRUFBb0U7O0FBRXBFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEVBQUU7OztBQUdGLDJEQUEyRDs7QUFFM0QscURBQXFEO0FBQ3JEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7O0FBRUEsMkhBQTJIO0FBQzNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEU7QUFDMUU7O0FBRUE7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7O0FBRUE7O0FBRUEsYUFBYSxrQkFBa0I7QUFDL0I7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQyxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDs7QUFFQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7O0FBRTVELDJEQUEyRDs7QUFFM0QsK0RBQStEOztBQUUvRDtBQUNBLDhEQUE4RDtBQUM5RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBLGtDQUFrQzs7QUFFbEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHNKQUFzSjs7QUFFdEoscUNBQXFDO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQThEO0FBQzlELHFEQUFxRDtBQUNyRCwyREFBMkQ7QUFDM0QsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDs7QUFFdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBK0M7O0FBRS9DOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDOztBQUVyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhIQUE4SCx5Q0FBeUM7QUFDdks7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsa0RBQWtEO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLDZCQUE2QjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOLHdFQUF3RTs7QUFFeEUsV0FBVyw2QkFBNkI7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsV0FBVyxpQ0FBaUM7QUFDNUM7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOLHdFQUF3RTs7QUFFeEUsV0FBVyxZQUFZO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLE1BQU07QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUNBQXFDOztBQUVyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCOztBQUU1Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzRkFBc0Y7O0FBRXRGLDREQUE0RDtBQUM1RDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDZCQUE2QjtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCO0FB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QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCOztBQUU3QixxQ0FBcUM7O0FBRXJDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLDJDQUEyQztBQUNqRDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrRkFBa0Y7QUFDbEY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0lBQWdJO0FBQ2hJO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQSx5S0FBeUssMENBQTBDO0FBQ25OO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DOzs7QUFHbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7O0FBRTlCLGdEQUFnRDtBQUNoRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxlQUFlO0FBQ3pCLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdFQUFnRTs7QUFFaEU7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGdDQUFnQztBQUNoQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKLGlHQUFpRztBQUNqRyxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4SUFBOEk7O0FBRTlJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Ysa0VBQWtFLDRDQUE0QztBQUM5Rzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0MsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0Esc0RBQXNEO0FBQ3REOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUlBQW1JO0FBQ25JO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtSUFBbUk7QUFDbkk7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLFFBQVEsSUFBSTtBQUNaO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOzs7QUFHQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQSxpSEFBaUg7QUFDakg7QUFDQTtBQUNBOztBQUVBLHlDQUF5QztBQUN6QyxNQUFNLEtBQUssRUFLTjtBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGdEQUFnRDs7QUFFaEQsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBLDRHQUE0RztBQUM1Rzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOzs7QUFHQSxpUUFBaVE7QUFDalE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUEsZ0ZBQWdGO0FBQ2hGO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtHQUErRztBQUMvRzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSwwRUFBMEU7O0FBRTFFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlHQUFpRztBQUNqRztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0NBQWdDOztBQUVoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0M7O0FBRXBDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDs7QUFFaEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7OztBQUdWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ04sbUNBQW1DO0FBQ25DOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7O0FBRWpEO0FBQ0E7QUFDQSx5RUFBeUU7O0FBRXpFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1RUFBdUU7O0FBRXZFO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkNBQTJDOztBQUUzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7OztBQUdBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSxzRUFBc0U7O0FBRXRFLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTix5Q0FBeUM7O0FBRXpDO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDs7QUFFdEQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBO0FBQ0EsSUFBSTtBQUNKLCtHQUErRztBQUMvRztBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLGdHQUFnRztBQUNoRzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0EsSUFBSTs7O0FBR0osMEVBQTBFOztBQUUxRTtBQUNBO0FBQ0EsNEZBQTRGO0FBQzVGOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUdBQXVHO0FBQ3ZHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQyw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxnR0FBZ0c7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5TkFBeU4sR0FBRzs7QUFFNU47QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IscUJBQXFCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOzs7QUFHWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0Q7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBLDBDQUEwQzs7QUFFMUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0hBQWdIO0FBQ2hIO0FBQ0E7O0FBRUEsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsZ0hBQWdIO0FBQ2hIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7O0FBR0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7O0FBRTdEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsb0NBQW9DO0FBQzVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDREQUE0RDtBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7O0FBRUEsc0hBQXNIOztBQUV0SCxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtHQUFrRztBQUNsRztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBLGtHQUFrRztBQUNsRztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFjOzs7QUFHZDtBQUNBO0FBQ0E7O0FBRUEscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsY0FBYzs7QUFFZDs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUVaOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQSxZQUFZOzs7QUFHWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxpRUFBaUU7QUFDakU7O0FBRUEsc0lBQXNJOztBQUV0STtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7O0FBRVosVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFEQUFxRDs7QUFFckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQSxnRUFBZ0U7QUFDaEU7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHdFQUF3RTs7QUFFeEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTs7O0FBR0EsaUVBQWlFO0FBQ2pFOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVEsNElBQTRJO0FBQ3BKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7OztBQUdBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQSxzREFBc0Q7O0FBRXREO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7O0FBRUEsbURBQW1EO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJLCtCQUErQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSSwrQkFBK0I7QUFDbkM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7QUFFVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBOztBQUVBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdEQUFnRDtBQUNoRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTs7QUFFdkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUI7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLHNCQUFzQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGOztBQUU1RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCOztBQUU1QixrQ0FBa0M7O0FBRWxDLCtCQUErQjs7QUFFL0IsMkJBQTJCOztBQUUzQiw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzREFBc0Q7O0FBRXRELG1EQUFtRDs7QUFFbkQseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBK0M7QUFDL0M7O0FBRUEsOENBQThDOztBQUU5Qyx5REFBeUQ7O0FBRXpELDZDQUE2Qzs7QUFFN0MsK0NBQStDO0FBQy9DOztBQUVBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBLGdDQUFnQztBQUNoQzs7QUFFQSxtREFBbUQ7QUFDbkQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0MsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEO0FBQ2hEOztBQUVBLGdEQUFnRDs7QUFFaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSiwrREFBK0Q7O0FBRS9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7O0FBRWxEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZFQUE2RTtBQUM3RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RkFBNEY7O0FBRTVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvRUFBb0U7OztBQUdwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCLG1CQUFtQjtBQUM3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLG9GQUFvRjtBQUNwRjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkNBQTZDO0FBQzdDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR047QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5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O0FBRXJFO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsNEJBQTRCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw0Q0FBNEM7QUFDcEQ7OztBQUdBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7O0FBRUEsa0RBQWtEOztBQUVsRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUhBQW1IOztBQUVuSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sR0FBRztBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDhMQUE4TCxvREFBb0QsRUFBRTtBQUNwUCxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbU9BQW1PLG9EQUFvRCxFQUFFO0FBQ3pSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQzs7QUFFakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSixnREFBZ0Q7O0FBRWhELHdDQUF3QztBQUN4Qzs7QUFFQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDs7QUFFdEQsd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLGlCQUFpQjtBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3TEFBd0w7O0FBRXhMLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwwRUFBMEU7QUFDMUU7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxHQUFHO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXdEOztBQUV4RDtBQUNBLG1DQUFtQzs7QUFFbkM7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0RBQXdELFFBQVE7O0FBRWhFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLGdMQUFnTCw4QkFBOEI7QUFDOU07QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQSw2REFBNkQ7O0FBRTdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEOztBQUVoRDs7QUFFQTtBQUNBLG9CQUFvQiwyQkFBMkI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSx1REFBdUQ7O0FBRXZEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSyxHQUFHO0FBQ1I7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQSw4RUFBOEU7O0FBRTlFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7O0FBRVY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEdBQUc7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSwrRUFBK0U7QUFDL0U7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQ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QUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxnQkFBZ0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZUFBZTtBQUN6QjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxrQkFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixRQUFRO0FBQ3JDLHFCQUFxQixRQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qix3QkFBd0I7QUFDeEIsd0JBQXdCO0FBQ3hCLDZCQUE2QjtBQUM3QjtBQUNBLENBQUM7Ozs7Ozs7Ozs7O0FDamJZOztBQUViO0FBQ0E7QUFDQTtBQUNBLEVBQUUsRUFBRSxtQkFBTyxDQUFDLDBFQUFhOztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUFzQjtBQUN0Qiw0QkFBNEI7Ozs7Ozs7Ozs7O0FDWmY7O0FBRWIsOENBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxFQUFDO0FBQ0Ysb0JBQW9CO0FBQ3BCLGdCQUFnQjtBQUNoQiwyQkFBMkI7QUFDM0IsMEJBQTBCO0FBQzFCLDBCQUEwQjtBQUMxQixnQkFBZ0I7QUFDaEIsMEJBQTBCO0FBQzFCLHNCQUFzQjtBQUN0QixtQkFBbUI7QUFDbkIsa0JBQWtCO0FBQ2xCLHVCQUF1QjtBQUN2QixtQ0FBbUM7QUFDbkMsMEJBQTBCO0FBQzFCLG1CQUFtQjtBQUNuQixrQkFBa0I7QUFDbEIsdUJBQXVCO0FBQ3ZCLG1CQUFtQjtBQUNuQiw4QkFBOEI7QUFDOUIsYUFBYSxtQkFBTyxDQUFDLHdFQUFTO0FBQzlCLHlDQUF5QyxtQkFBTyxDQUFDLGdGQUFhO0FBQzlELGlEQUFpRCxnREFBZ0QsdUNBQXVDLHNDQUFzQyw0REFBNEQsNERBQTREO0FBQ3RTLHFEQUFxRCw2Q0FBNkMsY0FBYyw0RUFBNEUsU0FBUyxrQkFBa0IsbURBQW1ELCtCQUErQix5QkFBeUIsaUJBQWlCLHNGQUFzRix1QkFBdUIsMkVBQTJFLHFGQUFxRixzQ0FBc0MsNENBQTRDLE9BQU8sOEJBQThCLHNCQUFzQixhQUFhLDBCQUEwQjtBQUNweEIsa0JBQWtCLGlFQUFpRSxlQUFlO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRSxpQ0FBaUM7QUFDM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUZBQW1GLGNBQWM7QUFDakcsK0VBQStFLGNBQWM7QUFDN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNK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QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGVBQWUsc0RBQVc7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNEQUFzRDs7QUFFdEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsb0RBQWE7QUFDMUI7O0FBRUE7QUFDQSxHQUFHLENBQUMsNENBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNILENBQUMsaUVBQWUsaUJBQWlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25XRjtBQUN3QjtBQUM2RDtBQUM5RTtBQUN0QyxZQUFZLHFFQUFjO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsMEJBQTBCLDZEQUFxQixLQUFLLDZDQUE2Qyw4REFBOEQsS0FBSyxVQUFVLDhDQUE4QyxtQ0FBbUM7QUFDL1AsbUVBQW1FO0FBQ25FO0FBQ0Esb0RBQW9ELHNDQUFzQywwQ0FBMEMsb0JBQW9CLG1CQUFtQiw4REFBOEQ7QUFDek8sMEZBQTBGO0FBQzFGO0FBQ0E7QUFDQSx5QkFBeUIsbUJBQW1CLDBEQUFrQixLQUFLLHVEQUF1RCxLQUFLLG1CQUFtQiwwREFBa0IsS0FBSyw4REFBOEQsS0FBSyxtQkFBbUIsMERBQWtCLGVBQWUsMERBQWtCLEtBQUssc0NBQXNDLEtBQUssbUJBQW1CLDBEQUFrQixlQUFlLDBEQUFrQixLQUFLLDZDQUE2QyxLQUFLLGNBQWMsZ0JBQWdCLDhEQUFzQix3QkFBd0IsS0FBSztBQUNoakI7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsMENBQWEsZUFBZSxPQUFPLG1EQUFXLFlBQVk7QUFDeEUsV0FBVyxnREFBbUIsVUFBVSxnRkFBZ0Y7QUFDeEg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoQ087QUFDQTtBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUHVDO0FBQ3NFO0FBQzlFO0FBQzBGOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0h6SDtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUJpQztBQUNGO0FBQ0s7QUFDSjtBQUNoQyx3QkFBd0IsNkNBQWdCLHlCQUF5QixRQUFRLGdEQUFtQixDQUFDLDZDQUFZLEVBQUUsK0NBQVEsR0FBRyxXQUFXLG1CQUFtQixnREFBTyxFQUFFLE1BQU07QUFDbkssK0JBQStCLDZDQUFZO0FBQzNDLGlFQUFlLGlCQUFpQixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTks7QUFDUDtBQUMyQjtBQUNIO0FBQ1A7QUFDdUI7QUFDaEU7QUFDUDtBQUNBO0FBQ08sb0NBQW9DO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxvQ0FBb0MsaURBQWlELHNCQUFzQiwwQ0FBMEMscUJBQXFCO0FBQzFLO0FBQ0E7QUFDTztBQUNQLDZCQUE2Qix5Q0FBWTtBQUN6Qyx3QkFBd0IseUNBQVk7QUFDcEMscUJBQXFCLHlDQUFZO0FBQ2pDLGFBQWEsMkNBQWM7QUFDM0IsZ0JBQWdCLDJDQUFjLENBQUMsaUVBQWM7QUFDN0Msb0JBQW9CLHlDQUFZO0FBQ2hDLElBQUksNENBQWU7QUFDbkI7QUFDQSxLQUFLO0FBQ0wsSUFBSSw0Q0FBZTtBQUNuQjtBQUNBO0FBQ0EsMEJBQTBCLG9EQUFhO0FBQ3ZDLDRDQUE0Qyw2REFBNkQ7QUFDekc7QUFDQTtBQUNBLGdEQUFnRCxnRUFBZ0U7QUFDaEg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLDRCQUE0Qiw4Q0FBaUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxzRUFBdUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxzRUFBdUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyREFBWTtBQUMzQixLQUFLO0FBQ0wsd0JBQXdCLDhDQUFpQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsaUlBQWlJO0FBQzVNO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxxQ0FBcUM7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsdUJBQXVCLDhDQUFpQjtBQUN4QyxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBLDBGQUEwRixxQkFBcUI7QUFDL0csU0FBUztBQUNULEtBQUs7QUFDTCwyQkFBMkIsOENBQWlCO0FBQzVDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsc0JBQXNCLDhDQUFpQjtBQUN2QztBQUNBLEtBQUs7QUFDTCwwQkFBMEIsOENBQWlCO0FBQzNDO0FBQ0EsS0FBSztBQUNMLElBQUksNENBQWU7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCwwREFBMEQseURBQVU7QUFDcEUsOERBQThELHlEQUFVO0FBQ3hFLGtFQUFrRSx5REFBVTtBQUM1RTtBQUNBLDJEQUEyRCx3QkFBd0I7QUFDbkYsaUVBQWlFLHlEQUFVO0FBQzNFLHFFQUFxRSx5REFBVTtBQUMvRSx5RUFBeUUseURBQVU7QUFDbkY7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLGdEQUFtQixDQUFDLDJDQUFjO0FBQzlDLGdCQUFnQixnREFBbUIsVUFBVSwyQkFBMkI7QUFDeEUsMEJBQTBCLGdEQUFtQixDQUFDLG9FQUFlLElBQUksd0JBQXdCO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVKeUM7QUFDVjtBQUM0RDtBQUMzQztBQUNYO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiw2Q0FBZ0I7QUFDbkMsY0FBYyx5Q0FBWTtBQUMxQixhQUFhLDJDQUFjO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCx5WUFBeVksNkNBQU07QUFDL1k7QUFDQSx1QkFBdUIsOERBQVk7QUFDbkMseUJBQXlCLCtDQUFRLENBQUMsK0NBQVEsR0FBRztBQUM3QyxZQUFZLGdEQUFtQixDQUFDLDJDQUFjO0FBQzlDLG9CQUFvQixnREFBbUIsWUFBWSxTQUFTLDhDQUFTLDBMQUEwTDtBQUMvUCx3QkFBd0IsK0NBQWtCLENBQUMsMkNBQWMsaUJBQWlCLCtDQUFRLENBQUMsK0NBQVEsR0FBRyxxQkFBcUIsbUJBQW1CLE9BQU8sZ0RBQW1CLFlBQVksK0NBQVEsR0FBRyxvQkFBb0IseUNBQXlDO0FBQ3BQLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlGQUFrQjtBQUNqQyxlQUFlLGlGQUFrQjtBQUNqQztBQUN3Qjs7Ozs7Ozs7Ozs7Ozs7OztBQ25DeEI7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sc0NBQXNDLGlCQUFpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsQjlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRCxnREFBZ0Q7QUFDekM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2R2tEO0FBQzNDLGdCQUFnQixnRUFBbUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNERTtBQUNPO0FBQ2Q7QUFDckMsaUVBQWUsMERBQWEsQ0FBQyw4Q0FBUyxFQUFFLDREQUFtQixDQUFDLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hSO0FBQ2I7QUFDQzs7QUFFekM7QUFDQTtBQUNBLGdFQUFnRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGdCQUFnQixzQ0FBc0Msa0JBQWtCO0FBQ25GLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsT0FBTztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxjQUFjO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLG1DQUFtQztBQUNuQyxtQ0FBbUM7QUFDbkMsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxVQUFVLDBEQUEwRDtBQUN2RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFVBQVUsMERBQTBEO0FBQ3ZHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsV0FBVyxtQ0FBbUM7QUFDMUc7QUFDQTtBQUNBLDREQUE0RCxXQUFXLCtEQUErRDtBQUN0STtBQUNBO0FBQ0EsNERBQTRELFdBQVcsK0RBQStEO0FBQ3RJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLFdBQVcsbUNBQW1DO0FBQzlHO0FBQ0E7QUFDQSxnRUFBZ0UsV0FBVywrREFBK0Q7QUFDMUk7QUFDQTtBQUNBLGdFQUFnRSxXQUFXLCtEQUErRDtBQUMxSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLGtCQUFrQjtBQUN4RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxtREFBbUQ7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsbURBQW1EO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHdCQUF3QiwwQ0FBMEM7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msd0NBQXdDO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBLHFFQUFxRSxpQkFBaUIsSUFBSTtBQUMxRixzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvREFBYSxDQUFDLHdEQUFTLElBQUk7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0Esd1hBQXdYO0FBQ3hYLFlBQVksb0RBQWEsQ0FBQyxtREFBUyxhQUFhLG9CQUFvQjtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiwyNEJBQTI0QjtBQUM1NUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QyxpQ0FBaUM7QUFDakMscUNBQXFDO0FBQ3JDLG9DQUFvQztBQUNwQywrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQSxDQUFDLENBQUMsZ0RBQWE7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BkaUI7QUFDRDtBQUNRO0FBQ1M7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZ0JBQWdCLHNDQUFzQyxrQkFBa0I7QUFDbkYsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsT0FBTztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxjQUFjO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFLE9BQU87QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixzQkFBc0I7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTLGdEQUFtQixtQkFBbUI7QUFDL0M7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDLFlBQVksYUFBYSxXQUFXLFlBQVksZ0JBQWdCO0FBQzlHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOENBQThDLFlBQVksYUFBYSxXQUFXLFlBQVksZ0JBQWdCO0FBQzlHLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFCQUFxQix1QkFBdUI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjtBQUNBLGlEQUFpRCxVQUFVO0FBQzNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFCQUFxQix1QkFBdUI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04scURBQXFELFVBQVU7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsMEJBQTBCO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQyx3Q0FBd0M7O0FBRXpDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUMsb0RBQW9EOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw0Q0FBZTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsOENBQUc7O0FBRXpCO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLGdEQUFtQixDQUFDLDBEQUFhO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUMsQ0FBQyw0Q0FBZTs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsOENBQUc7O0FBRXpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQyxDQUFDLDRDQUFlOztBQUVqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0NBQWdDLHFEQUFTOztBQUV6QztBQUNBO0FBQ0Esb0JBQW9CLHFEQUFTO0FBQzdCLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQSx1QkFBdUIsZ0RBQW1CO0FBQzFDO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7O0FBRUEsdUNBQXVDOztBQUV2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGOztBQUVyRjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbURBQW1EOztBQUVuRCw2RkFBNkY7QUFDN0Y7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUcsR0FBRzs7QUFFTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQSxPQUFPO0FBQ1AsNENBQTRDLG1EQUFtRCw0R0FBNEc7QUFDM007QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCw4REFBOEQ7QUFDOUQ7QUFDQSxRQUFRO0FBQ1I7O0FBRUEsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxvREFBb0Q7QUFDcEQ7QUFDQSxPQUFPO0FBQ1AsNkRBQTZELDJHQUEyRztBQUN4SztBQUNBLE9BQU87QUFDUCwyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlHQUFpRyxlQUFlO0FBQ2hIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQSxLQUFLLEdBQUc7O0FBRVIsa0RBQWtEO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLDRCQUE0QjtBQUM1QjtBQUNBLHFDQUFxQzs7QUFFckMsZ0NBQWdDO0FBQ2hDO0FBQ0E7O0FBRUEsZ0NBQWdDOztBQUVoQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLFNBQVM7QUFDVCx1QkFBdUI7QUFDdkI7QUFDQSxTQUFTO0FBQ1QsdUJBQXVCO0FBQ3ZCO0FBQ0EsU0FBUztBQUNULHdCQUF3QjtBQUN4QjtBQUNBLFNBQVM7QUFDVCx3QkFBd0I7QUFDeEI7QUFDQSxTQUFTO0FBQ1QsaUNBQWlDO0FBQ2pDO0FBQ0EsU0FBUztBQUNULDJCQUEyQjtBQUMzQjtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJEQUEyRDs7QUFFM0Q7QUFDQTs7QUFFQTtBQUNBLHlEQUF5RDtBQUN6RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYSxrQkFBa0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0EsZ0ZBQWdGO0FBQ2hGO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7O0FBR2xCO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkhBQTJIO0FBQzNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsb0VBQW9FOztBQUVwRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLGVBQWU7QUFDMUIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxHQUFHOztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEdBQUc7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLDJEQUEyRCxVQUFVO0FBQ3JFLHlCQUF5QixVQUFVO0FBQ25DO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsV0FBVyxHQUFHO0FBQ2Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkRBQTZEO0FBQzdEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsR0FBRztBQUNkOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLGlCQUFpQjtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6Qjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDRDQUE0Qzs7QUFFNUM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6Qjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixpQkFBaUI7QUFDckM7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwwREFBMEQ7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscUJBQXFCO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxnREFBZ0QsZ0RBQWdELE1BQU0sYUFBYTs7QUFFbkg7QUFDQSxpREFBaUQsa0NBQWtDLE9BQU87O0FBRTFGLHlHQUF5RyxjQUFjLFVBQVUsZ0dBQWdHLGtCQUFrQixVQUFVLFVBQVU7O0FBRXZRO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7O0FBRUE7O0FBRUEsZ0JBQWdCO0FBQ2hCLFdBQVc7QUFDWCxZQUFZO0FBQ1osR0FBRztBQUNIOzs7Ozs7Ozs7Ozs7O0FDcHpDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWIsSUFBSSxJQUFxQztBQUN6Qzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDs7QUFFQTtBQUNBLG9CQUFvQjs7QUFFcEI7QUFDQTtBQUNBLE1BQU07OztBQUdOOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsNEJBQTRCO0FBQzVCO0FBQ0EscUNBQXFDOztBQUVyQyxnQ0FBZ0M7QUFDaEM7QUFDQTs7QUFFQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkZBQTZGLGFBQWE7QUFDMUc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlHQUFpRyxlQUFlO0FBQ2hIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQSxLQUFLLEdBQUc7O0FBRVIsa0RBQWtEO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDhNQUE4TTs7QUFFOU07QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsV0FBVztBQUN4QixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFdBQVc7QUFDeEIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsV0FBVztBQUN4QixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUIsMkJBQTJCO0FBQzNCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsaUJBQWlCO0FBQzVCO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEI7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9EQUFvRDs7QUFFcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdB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QTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFlBQVksY0FBYztBQUMxQjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssR0FBRzs7QUFFUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxTQUFTLEtBQXFDO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHNCQUFzQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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O0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGFBQWE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFlOzs7Ozs7Ozs7OztBQ3ZNakI7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMscUVBQWE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVpVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlJalQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUUrVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekkvVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFeVc7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6SXpXO0FBQ0EsdUVBQXVFLGtDQUFrQyxJQUFJO0FBQzdHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QWtELFNBQVM7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxrREFBVyxRQUFRLDhDQUFlO0FBQzNDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxNQUFxQyxHQUFHLENBQTBCO0FBQ3pHO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0QsTUFBTSxLQUFxQyxFQUFFLEVBRTFDLENBQUM7QUFDSjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUM4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixVQUFVO0FBQ3RDLDRCQUE0QixVQUFVO0FBQ3RDLDJCQUEyQixTQUFTLEdBQUcsVUFBVTtBQUNqRCwyQkFBMkIsU0FBUyxHQUFHLFVBQVU7QUFDakQ7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLE1BQU0sRUFBRSxXQUFXLFdBQVcsS0FBSztBQUN6RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsTUFBcUMsR0FBRyxDQUEwQixNQUFNLFVBQVU7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKLElBQUk7QUFDSixvQkFBb0IsTUFBcUMsR0FBRyxDQUEwQjtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLE1BQXFDLEdBQUcsQ0FBMEI7QUFDeEY7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSx5RUFBeUUsSUFBSTtBQUM3RTtBQUNBLENBQUM7QUFDRCx3REFBd0QsSUFBSTtBQUM1RCw0RUFBNEUsSUFBSTtBQUNoRjtBQUNBLENBQUM7QUFDRDtBQUNBLG1CQUFtQixJQUFJO0FBQ3ZCO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsK0NBQVM7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE1BQXFDLEdBQUcsQ0FBMEIsTUFBTSxJQUFJO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQzRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLFdBQVcsOENBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsNEJBQTRCLE1BQXFDLEdBQUcsQ0FBMEIsaUNBQWlDLGdCQUFnQjtBQUMvSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQSxvQkFBb0IsTUFBcUMsR0FBRyxDQUEwQjtBQUN0RjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBLDREQUE0RCxzREFBZ0I7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLDRDQUE0QyxhQUFvQjtBQUNoRSxnRkFBZ0YsYUFBYTtBQUM3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsMENBQTBDLE9BQU8saURBQWlELE1BQU07QUFDeEc7QUFvREU7QUFDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxdUVnQztBQUNJO0FBQ0Y7QUFDSTtBQUNTOztBQUUvQztBQUNBLFFBQVEsZ0RBQVc7QUFDbkIsT0FBTywrQ0FBVTtBQUNqQixTQUFTLGlEQUFZO0FBQ3JCOztBQUVBLGlEQUFLO0FBQ0w7QUFDQTtBQUNBLHlDQUF5QyxNQUFNO0FBQy9DLE1BQU07QUFDTjtBQUNBO0FBQ0EsOENBQThDLE1BQU07QUFDcEQ7QUFDQSxDQUFDOztBQUVELHNDQUFzQyxPQUFPOztBQUU3QyxzQ0FBc0MsaURBQUs7O0FBRTNDLGlFQUFlO0FBQ2Y7QUFDQSxlQUFlLGlEQUFLOztBQUVwQixXQUFXLFFBQVE7QUFDbkI7QUFDQTs7QUFFQTs7QUFFQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsMkRBQVUscUJBQXFCLEdBQUc7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHlDQUF5QyxJQUFJO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGdCQUFnQiwyREFBVTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5RTJDO0FBQ1o7QUFDZTtBQUNXO0FBQ0o7QUFDSDtBQUNtQjtBQUNkO0FBQ2pCOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEscUNBQXFDLDBEQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBLFdBQVcsaURBQUs7QUFDaEIsSUFBSTtBQUNKO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDLGlEQUFLO0FBQ2hEO0FBQ0Esa0JBQWtCLDJEQUFVLG1CQUFtQixLQUFLLHFCQUFxQiwyREFBVTtBQUNuRixPQUFPO0FBQ1AsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSyxpREFBSztBQUNWO0FBQ0E7O0FBRUEsS0FBSyxpREFBSztBQUNWO0FBQ0E7O0FBRUEsS0FBSyxpREFBSztBQUNWO0FBQ0E7O0FBRUEsS0FBSyxpREFBSztBQUNWO0FBQ0E7O0FBRUEsS0FBSyxpREFBSztBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixpREFBSzs7QUFFdEI7QUFDQTs7QUFFQSxpRUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxFQUFFLHFFQUFhOztBQUVuQjs7QUFFQTtBQUNBLElBQUksc0VBQWM7O0FBRWxCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQOztBQUVBLFVBQVUsaURBQUs7QUFDZjtBQUNBOztBQUVBO0FBQ0EsZUFBZSxvRUFBVztBQUMxQjtBQUNBLFVBQVUsNEVBQW9CO0FBQzlCO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLGlEQUFLO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOztBQUVQLG9DQUFvQyxpREFBSzs7QUFFekM7QUFDQSxRQUFRLG9FQUFXO0FBQ25CO0FBQ0EsVUFBVSw0RUFBb0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsdUNBQXVDLGlEQUFLOztBQUU1Qzs7QUFFQTs7QUFFQTtBQUNBLE1BQU0sMkRBQU07QUFDWjtBQUNBLGlCQUFpQiw2REFBWTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQSxZQUFZLDJEQUFVLGtCQUFrQiwyREFBVTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFVBQVUsMkRBQVU7QUFDcEI7QUFDQSxDQUFDLENBQUMsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hPK0I7QUFDTztBQUNzQjtBQUNoQjtBQUNRO0FBQ0M7QUFDWjtBQUNPO0FBQ21CO0FBQ2Q7O0FBRXhEOztBQUVBLGlFQUFlO0FBQ2Y7QUFDQSxvQkFBb0IscUVBQWE7QUFDakM7QUFDQSwyQkFBMkIsNkRBQVk7QUFDdkMsU0FBUyxjQUFjO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDZEQUFZO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLDJEQUFNO0FBQ1o7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLDJEQUFVLG9CQUFvQiwyREFBVTs7QUFFekQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDJEQUFVLGtCQUFrQiwyREFBVTs7QUFFdkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxpRUFBb0I7QUFDdkU7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDJEQUFVO0FBQzNCO0FBQ0EsMkNBQTJDLDJEQUFVLGFBQWEsMkRBQVU7QUFDNUU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTSxpREFBSztBQUNYO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsU0FBUyxpREFBSztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJDQUEyQyw0RUFBb0I7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBLGtEQUFrRCw0RUFBb0I7QUFDdEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsZ0VBQWE7QUFDekQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLHFFQUFhOztBQUVsQyxvQkFBb0IsMERBQVE7QUFDNUIsaUJBQWlCLDJEQUFVLDJDQUEyQywyREFBVTtBQUNoRjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdMWTs7QUFFa0I7QUFDTTtBQUNEO0FBQ1k7QUFDTDtBQUNjO0FBQ0g7QUFDSjtBQUNOO0FBQ047QUFDVztBQUNIO0FBQ0w7QUFDWTtBQUNIO0FBQ0o7QUFDVzs7QUFFekQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQSxzQkFBc0Isc0RBQUs7QUFDM0IsbUJBQW1CLDREQUFJLENBQUMsc0RBQUs7O0FBRTdCO0FBQ0EsRUFBRSxpREFBSyxrQkFBa0Isc0RBQUssc0JBQXNCLGlCQUFpQjs7QUFFckU7QUFDQSxFQUFFLGlEQUFLLGtDQUFrQyxpQkFBaUI7O0FBRTFEO0FBQ0E7QUFDQSwwQkFBMEIsZ0VBQVc7QUFDckM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QiwwREFBUTs7QUFFckM7QUFDQSxjQUFjLHNEQUFLOztBQUVuQjtBQUNBLHNCQUFzQixnRUFBYTtBQUNuQyxvQkFBb0IsOERBQVc7QUFDL0IsaUJBQWlCLDJEQUFRO0FBQ3pCLGdCQUFnQixpREFBTztBQUN2QixtQkFBbUIsOERBQVU7O0FBRTdCO0FBQ0EsbUJBQW1CLDREQUFVOztBQUU3QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsMkRBQU07O0FBRXJCO0FBQ0EscUJBQXFCLGlFQUFZOztBQUVqQztBQUNBLG9CQUFvQiw0REFBVzs7QUFFL0IscUJBQXFCLDhEQUFZOztBQUVqQyw0QkFBNEIsdUVBQWMsQ0FBQyxpREFBSzs7QUFFaEQsbUJBQW1CLDhEQUFROztBQUUzQix1QkFBdUIsbUVBQWM7O0FBRXJDOztBQUVBO0FBQ0EsaUVBQWUsS0FBSzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4RlA7O0FBRWtDOztBQUUvQztBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUJBQXlCLHlEQUFhO0FBQ3RDO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpRUFBZSxXQUFXLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hIZDs7QUFFa0M7QUFDZjs7QUFFaEM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEI7QUFDQSxhQUFhLGVBQWU7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsRUFBRSwyREFBVSxvREFBb0QsMkRBQVU7QUFDMUU7QUFDQTs7QUFFQSxpREFBSyx5QkFBeUIsMkRBQVU7QUFDeEM7QUFDQSxDQUFDOztBQUVELGlFQUFlLGFBQWEsRUFBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCaEI7O0FBRUU7QUFDZjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNKYTs7QUFFcUI7QUFDWTtBQUNXO0FBQ047QUFDUjtBQUNJO0FBQ0M7QUFDSDs7QUFFN0MsbUJBQW1CLDZEQUFTOztBQUU1QjtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiw4REFBa0I7QUFDckMsb0JBQW9CLDhEQUFrQjtBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsZUFBZTtBQUM1QixhQUFhLFNBQVM7QUFDdEI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQSxvRUFBb0U7O0FBRXBFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsYUFBYSwyREFBVzs7QUFFeEIsV0FBVyx5Q0FBeUM7O0FBRXBEO0FBQ0EsTUFBTSw2REFBUztBQUNmO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLFVBQVUsaURBQUs7QUFDZjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsUUFBUSw2REFBUztBQUNqQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQyxpREFBSztBQUN6QztBQUNBO0FBQ0E7O0FBRUEsZUFBZSxpREFBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQix3REFBWTs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLDJEQUFlO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLDJEQUFlO0FBQy9CLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLDJEQUFXO0FBQ3hCLHFCQUFxQiw2REFBYTtBQUNsQyxXQUFXLGdFQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQSxpREFBSztBQUNMO0FBQ0E7QUFDQSx3QkFBd0IsMkRBQVcsYUFBYTtBQUNoRDtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLEtBQUs7QUFDTDtBQUNBLENBQUM7O0FBRUQsaURBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCLDJEQUFXLGFBQWE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUFJO0FBQ2Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRCxpRUFBZSxLQUFLLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbk9SOztBQUVtQjs7QUFFaEM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlEQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsaURBQUs7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLENBQUM7O0FBRUQ7QUFDQSxrREFBa0QsWUFBWTs7QUFFOUQ7QUFDQTtBQUNBOztBQUVBLEVBQUUsaURBQUs7QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSxpRUFBZSxVQUFVLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25HYjs7QUFFbUI7QUFDc0I7O0FBRXREOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLGlEQUFLO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBLDJCQUEyQixtQkFBbUI7QUFDOUM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxNQUFNLGlEQUFLO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTyxpREFBSzs7QUFFWixNQUFNLGlEQUFLO0FBQ1g7QUFDQTs7QUFFQSxNQUFNLGlEQUFLO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsdUJBQXVCLGlEQUFLOztBQUU1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsaURBQUs7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxpREFBSzs7QUFFWCxRQUFRLGlEQUFLO0FBQ2I7QUFDQSxNQUFNLFFBQVEsaURBQUs7QUFDbkIsaUJBQWlCLG9FQUFZO0FBQzdCLE1BQU0sU0FBUyxpREFBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsaURBQUs7O0FBRXZCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxZQUFZLGlEQUFLO0FBQ2pCO0FBQ0E7O0FBRUEsWUFBWSxpREFBSztBQUNqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsaURBQUs7O0FBRXZCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixpREFBSzs7QUFFekI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLGlEQUFLO0FBQ2I7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLElBQUksaURBQUs7QUFDVCxrQkFBa0IsaURBQUs7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLElBQUksaURBQUs7QUFDVCxzRUFBc0UsaURBQUs7QUFDM0UsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLGlEQUFLOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGlEQUFLLDZDQUE2QyxNQUFNO0FBQ3hELG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGlEQUFLOztBQUVMLGlFQUFlLFlBQVksRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3U2Y7O0FBRXFCOztBQUVsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsSUFBSSxpREFBSztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLGlFQUFlLGtCQUFrQixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0RXJCOztBQUUyQztBQUNKOztBQUVwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNlO0FBQ2Ysa0JBQWtCLHFFQUFhO0FBQy9CLFdBQVcsbUVBQVc7QUFDdEI7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcEJhOztBQUVrQztBQUNGO0FBQ0Q7QUFDVztBQUNKO0FBQ0o7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYyxnRUFBYTtBQUMzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNlO0FBQ2Y7O0FBRUEsbUJBQW1CLDZEQUFZOztBQUUvQjtBQUNBLGdCQUFnQix5REFBYTtBQUM3QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQiw2REFBUSw4QkFBOEIsMERBQVE7O0FBRWhFO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IseURBQWE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLDZEQUFZOztBQUVuQztBQUNBLEdBQUc7QUFDSCxTQUFTLCtEQUFRO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0IseURBQWE7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsNkRBQVk7QUFDOUM7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEZhOztBQUVtQjtBQUNhOztBQUU3QyxvREFBb0Qsd0RBQVksS0FBSyxXQUFXOztBQUVoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsaURBQUssMEJBQTBCLGlEQUFLO0FBQzVDLGFBQWEsaURBQUssYUFBYSxTQUFTO0FBQ3hDLE1BQU0sU0FBUyxpREFBSztBQUNwQixhQUFhLGlEQUFLLFNBQVM7QUFDM0IsTUFBTSxTQUFTLGlEQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLGlEQUFLO0FBQ2Q7QUFDQSxNQUFNLFVBQVUsaURBQUs7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLGlEQUFLO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLGlEQUFLO0FBQ2Q7QUFDQSxNQUFNLFVBQVUsaURBQUs7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLGlEQUFLLHFDQUFxQztBQUM1QztBQUNBO0FBQ0EsS0FBSyxpREFBSztBQUNWLEdBQUc7O0FBRUg7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6R2E7O0FBRTRCOztBQUV6QztBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLGVBQWUsc0RBQVU7QUFDekI7QUFDQSxPQUFPLHNEQUFVLGtCQUFrQixzREFBVTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxQmE7O0FBRXFCO0FBQ1U7QUFDTzs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0IsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCO0FBQ2U7QUFDZix5QkFBeUIsMERBQVE7QUFDakM7QUFDQSxrQkFBa0IsNkRBQVk7QUFDOUI7O0FBRUEsRUFBRSxpREFBSztBQUNQO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNCYTs7QUFFbUI7QUFDZTtBQUNNO0FBQ0g7QUFDWTtBQUNsQjtBQUNjOztBQUUxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxNQUFNLGlEQUFLO0FBQ1g7QUFDQTtBQUNBLGFBQWEsaURBQUs7QUFDbEIsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxnQkFBZ0Isd0RBQW9COztBQUVwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsaURBQUs7O0FBRWpDLDJCQUEyQixpREFBSztBQUNoQztBQUNBOztBQUVBLHVCQUF1QixpREFBSzs7QUFFNUI7QUFDQSxpREFBaUQsc0VBQWM7QUFDL0Q7O0FBRUEsUUFBUSxpREFBSztBQUNiLE1BQU0saURBQUs7QUFDWCxNQUFNLGlEQUFLO0FBQ1gsTUFBTSxpREFBSztBQUNYLE1BQU0saURBQUs7QUFDWCxNQUFNLGlEQUFLO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBSztBQUNiO0FBQ0E7QUFDQSxRQUFRLGlEQUFLO0FBQ2IsZ0VBQWdFO0FBQ2hFO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGVBQWUsd0VBQWdCO0FBQy9COztBQUVBLHdCQUF3QixpREFBSztBQUM3Qjs7QUFFQSxlQUFlLGtFQUFVO0FBQ3pCLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxpREFBSyxxQkFBcUIsaURBQUs7QUFDdkM7QUFDQTs7QUFFQSxnQkFBZ0IsaURBQUs7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxrQkFBa0IsMkRBQVUsU0FBUywyREFBVTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGNBQWMsMERBQVE7QUFDdEIsVUFBVSwwREFBUTtBQUNsQixHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlEQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVELGlFQUFlLFFBQVEsRUFBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ2hLWDs7QUFFYixpRUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ05LOzs7Ozs7Ozs7Ozs7Ozs7O0FDQU07O0FBRTRCOztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHFCQUFxQjtBQUNoQyxXQUFXLHFCQUFxQjtBQUNoQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUEsWUFBWSwwREFBVTtBQUN0Qjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLGlFQUFlLG9CQUFvQixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDekRwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGlFQUFlLGNBQWMsRUFBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ3RFakI7O0FBRUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTmE7O0FBRW1CO0FBQ3NDOztBQUV0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsU0FBUztBQUNwQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osdUJBQXVCLGlEQUFLO0FBQzVCO0FBQ0EsVUFBVSx3RUFBb0I7QUFDOUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5RGE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2R1RDtBQUNSOztBQUUvQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsMkRBQVUsYUFBYSxnRUFBYTtBQUMxRTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLDJEQUFVLFlBQVksU0FBUyxpQkFBaUIsMkRBQVU7QUFDMUUsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUyxRQUFROztBQUVqQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsaUVBQWUsY0FBYyxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3Q0k7QUFDVTs7QUFFNUMsaUVBQWUsMERBQVE7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQU0saURBQUs7O0FBRVgsTUFBTSxpREFBSzs7QUFFWCxNQUFNLGlEQUFLOztBQUVYOztBQUVBLHVDQUF1QztBQUN2QyxLQUFLOztBQUVMO0FBQ0EsMERBQTBELHdCQUF3QjtBQUNsRjtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRyxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4Q1M7O0FBRW1COztBQUVoQztBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsaURBQUs7QUFDZDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSw0QkFBNEI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixpREFBSzs7QUFFekI7QUFDQSxVQUFVLGlEQUFLO0FBQ2Y7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBCQUEwQixpREFBSztBQUMvQjtBQUNBOztBQUVBOztBQUVBLGtCQUFrQixpREFBSztBQUN2QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsTUFBTSxpREFBSyx5QkFBeUIsaURBQUs7QUFDekM7O0FBRUEsSUFBSSxpREFBSztBQUNUO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUVBQWUsY0FBYyxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDOUZqQjs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZGE7O0FBRXFCOztBQUVsQztBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNlO0FBQ2YsU0FBUyxpREFBSztBQUNkOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiYTs7QUFFcUI7QUFDVTs7QUFFNUMsaUVBQWUsMERBQVE7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7QUFDQSxzQkFBc0IsaURBQUs7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxHQUFHLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRVA7QUFDQSxpRUFBZSxJQUFJLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRFA7O0FBRXFCOztBQUVsQztBQUNBO0FBQ0EsMEJBQTBCLGlEQUFLO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxpRUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUMsRUFBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ3REVzs7QUFFRTtBQUNmLDBCQUEwQixLQUFLO0FBQy9CO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0wyQztBQUNOOztBQUVyQyxpRUFBZTtBQUNmO0FBQ0EsdUJBQXVCLDJEQUFXOztBQUVsQyxTQUFTLHdEQUFRO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0IyQztBQUNaO0FBQ21CO0FBQ2hCO0FBQ2tCO0FBQ0o7QUFDRTtBQUNkOztBQUVyQyxpRUFBZTtBQUNmLG9CQUFvQixnRUFBVyxHQUFHOztBQUVsQyxPQUFPLG9FQUFvRTs7QUFFM0UsZ0NBQWdDLDZEQUFZOztBQUU1QyxrQkFBa0Isd0RBQVEsQ0FBQyxrRUFBYTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE1BQU0saURBQUs7QUFDWCxRQUFRLDBEQUFRLDBCQUEwQiwwREFBUTtBQUNsRCx5Q0FBeUM7QUFDekMsTUFBTTtBQUNOO0FBQ0Esa0VBQWtFO0FBQ2xFLGdGQUFnRjtBQUNoRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLDBEQUFRO0FBQ2QscUJBQXFCLGlEQUFLOztBQUUxQixxREFBcUQsK0RBQWU7QUFDcEU7QUFDQSw0REFBNEQsbURBQU87O0FBRW5FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZEWTs7QUFFYjtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWUsV0FBVyxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDdERkOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQjtBQUNBLGFBQWE7QUFDYjtBQUNlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzQmE7O0FBRWI7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBLGlFQUFlLFFBQVEsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xDWDs7QUFFbUI7QUFDZTtBQUMvQztBQUNvRTs7QUFFcEU7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTLGlEQUFLLHlCQUF5QixpREFBSztBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBLFNBQVMsaURBQUs7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVMsaURBQUs7QUFDZDs7QUFFQSxtQkFBbUIsaURBQUssY0FBYyxpREFBSyxJQUFJO0FBQy9DO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixXQUFXLFVBQVU7QUFDckIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixXQUFXLFVBQVU7QUFDckI7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxRQUFRO0FBQ25CLFdBQVcscUJBQXFCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxpREFBSztBQUNaO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEIsMEVBQWdCOztBQUU5QztBQUNBLFlBQVksaURBQUs7QUFDakI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsWUFBWSxpREFBSztBQUNqQixHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixpREFBSzs7QUFFaEMsT0FBTyxpREFBSztBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxRQUFRLGlEQUFLO0FBQ2I7QUFDQTs7QUFFQSxvQkFBb0IsaURBQUs7QUFDekIsZ0JBQWdCLDJEQUFVO0FBQzFCOztBQUVBLFFBQVEsaURBQUsseUJBQXlCLGlEQUFLO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEdBQUc7QUFDaEIsYUFBYSxlQUFlO0FBQzVCLGFBQWEsc0JBQXNCO0FBQ25DLFlBQVk7QUFDWjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVLGlEQUFLLGtCQUFrQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixTQUFTLGlEQUFLO0FBQ2QsVUFBVSxpREFBSyxzQkFBc0IsaURBQUssZ0NBQWdDLGlEQUFLO0FBQy9FO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksaURBQUs7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLFFBQVEsaURBQUs7O0FBRWI7QUFDQTtBQUNBOztBQUVBOztBQUVBLElBQUksaURBQUs7QUFDVCx1QkFBdUIsaURBQUs7QUFDNUIsc0JBQXNCLGlEQUFLO0FBQzNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQSxPQUFPLGlEQUFLO0FBQ1o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLGlFQUFlLFVBQVUsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFOYjs7QUFFbUI7QUFDUztBQUNHOztBQUU3QjtBQUNmLFNBQVMsMERBQVUsV0FBVywwREFBUTtBQUN0QztBQUNBLFVBQVUsMERBQVEsV0FBVyxpREFBSztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNmTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxhQUFhOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdERhOztBQUUwQjtBQUNROztBQUUvQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG1CQUFtQjtBQUM5QixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpREFBTztBQUMvQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsMkRBQVU7QUFDMUI7QUFDQSxRQUFRLDJEQUFVO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQSxjQUFjLDJEQUFVLDhCQUE4QiwyREFBVTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwyREFBVSx5Q0FBeUMsMkRBQVU7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsMkRBQVUsMEJBQTBCLDJEQUFVO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQSxpRUFBZTtBQUNmO0FBQ0E7QUFDQSxDQUFDLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxRlU7O0FBRVosaUVBQWUseUNBQXlDOzs7Ozs7Ozs7Ozs7Ozs7O0FDRjNDOztBQUViLGlFQUFlLGlEQUFpRCxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0ZwRDs7QUFFK0Q7QUFDNUUsaUVBQWUsMkRBQTJELHdFQUFvQixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSHJDO0FBQ2Q7QUFDUjs7QUFFcEMsaUVBQWU7QUFDZjtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CLFlBQVk7QUFDWixRQUFRO0FBQ1IsR0FBRztBQUNIO0FBQ0EsQ0FBQyxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWkY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBT0M7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pEc0M7QUFDSTs7QUFFM0MsaUVBQWU7QUFDZixLQUFLLDZDQUFLO0FBQ1YsS0FBSyxzREFBUTtBQUNiLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTlk7O0FBRXdCOztBQUVyQzs7QUFFQSxPQUFPLFVBQVU7QUFDakIsT0FBTyxnQkFBZ0I7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsT0FBTyxTQUFTOztBQUVoQjtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLFVBQVU7QUFDckI7QUFDQSxXQUFXLFNBQVM7QUFDcEIsYUFBYTtBQUNiO0FBQ0EsMkJBQTJCLG9CQUFvQixJQUFJO0FBQ25EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0NBQWdDLE9BQU87QUFDdkM7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTLEdBQUcsU0FBUztBQUM1Qyw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0EsU0FBUyxVQUFVO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sa0NBQWtDO0FBQ2xDLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDLE9BQU87QUFDL0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQSxXQUFXLFNBQVM7QUFDcEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZ0NBQWdDLFdBQVcsSUFBSTtBQUMvQztBQUNBO0FBQ0EsZUFBZSw0REFBSTtBQUNuQixNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUcsR0FBRyxXQUFXO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxVQUFVO0FBQ3JCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QixXQUFXLFVBQVU7QUFDckI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCLGVBQWU7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLFFBQVE7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLGlFQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUV5SDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZMekg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLEtBQXFDO0FBQ2xEO0FBQ0E7QUFDQSw4QkFBOEIsT0FBTyxrRkFBa0YsT0FBTztBQUM5SCxHQUFHO0FBQ0g7QUFDQSxpS0FBaUssTUFBTTtBQUN2SyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLE1BQU07QUFDcEQsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsTUFBTTtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxJQUFJLENBQUU7QUFDTjtBQUNBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBLCtCQUErQixJQUFJO0FBQ25DO0FBQ0E7QUFDQSxrQ0FBa0MsTUFBTTtBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQixlQUFlLFVBQVU7QUFDekIsZUFBZSxVQUFVO0FBQ3pCLGlCQUFpQixLQUFLO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixJQUFJO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLElBQUk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsSUFBSTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0ZBQWdGLENBQXdwQjtBQUN4dUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLG9DQUFvQyxHQUFHO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFFBQVE7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxRQUFRO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FB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QixrQkFBa0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStELHdCQUF3QjtBQUN2RjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSw4QkFBOEIsUUFBUTtBQUN0Qyx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7O0FBSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsdUJBQXVCLEVBQUUsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyx3SUFBd0k7QUFDNUs7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGFBQWEsR0FBRyxXQUFXO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUUsSUFBSTtBQUM3RTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTix3QkFBd0IsYUFBYSxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsYUFBYTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixzQkFBc0IsV0FBVztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ04sc0JBQXNCLFdBQVc7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxnQkFBZ0I7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7O0FBTUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnakJBQWdqQixnQkFBZ0I7QUFDaGtCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsbUNBQW1DLDhDQUE4QztBQUNqRixvQ0FBb0MsOENBQThDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVCx3RUFBd0UsS0FBSztBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1Q0FBdUM7QUFDL0Q7QUFDQTtBQUNBLFFBQVE7QUFDUix3QkFBd0IsdUNBQXVDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLEtBQUs7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsUUFBUTtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7O0FBSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsSUFBSSxHQUFHLDJCQUEyQjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUix5Q0FBeUMsa0JBQWtCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVix1Q0FBdUMsc0JBQXNCLE1BQU0sR0FBRztB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixXQUFXO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFVBQVU7QUFDaEM7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixVQUFVO0FBQzVCO0FBQ0Esd0JBQXdCLFVBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVE7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFFBQVE7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsTUFBTTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELFVBQVU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUIsNkNBQTZDLGNBQWM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsUUFBUTtBQUNqRDtBQUNBO0FBQ0EsSUFBSTtBQUNKLFdBQVcsZUFBZTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFFBQVE7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0EsSUFBSTtBQUNKLHFDQUFxQyxRQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7O0FBS0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsV0FBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsWUFBWTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsV0FBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHNCQUFzQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsaUJBQWlCO0FBQ2pDO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxnQkFBZ0IsZ0JBQWdCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxnQkFBZ0IsaUJBQWlCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsSUFBSTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSix1Q0FBdUMsYUFBYTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxZQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxLQUFLLEtBQUsscUJBQXFCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFFBQVEsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEtBQUssU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixrQkFBa0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxRQUFRO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFdBQVc7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFlBQVk7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxXQUFXO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSLGtEQUFrRCxRQUFRO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFNBQVM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxHQUFHO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxzREFBc0QsR0FBRztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0Esc0RBQXNELEdBQUc7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLHNEQUFzRCxHQUFHO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsYUFBYTtBQUMzRDtBQUNBO0FBQ0EsK0JBQStCLFdBQVc7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxHQUFHO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLEdBQUcsR0FBRyxjQUFjO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIscURBQXFELE9BQU87QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxFQUFFO0FBQ2hEO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7O0FBSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0UsT0FBTywwQkFBMEIsSUFBSTtBQUM3RztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxJQUFJO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLE1BQU0sR0FBRyxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsV0FBVyxHQUFHLGFBQWE7QUFDeEU7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7QUFJRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFVBQVU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELFVBQVU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxNQUFNLEdBQUcsUUFBUTtBQUN4RDtBQUNBO0FBQ0EsOERBQThELFVBQVU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0Esd0RBQXdELEtBQUs7QUFDN0Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGdDQUFnQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFFBQVE7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHNGQUFzRjtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxJQUFJLEdBQUc7QUFDNUM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDZCQUE2QjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxnRkFBZ0YsZUFBZTtBQUMvRixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsT0FBTztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxlQUFlO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0IsR0FBRyxtQ0FBbUM7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLCtDQUErQyxjQUFjO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxLQUFLO0FBQ2pFO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxLQUFLO0FBQzFEO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxpQkFBaUI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxRQUFRLFFBQVEsUUFBUSxHQUFHLFFBQVE7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxNQUFNO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtB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LFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx3Q0FBd0M7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7O0FBTUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUUsR0FBRztBQUMxRTtBQUNBO0FBQ0EsVUFBVTtBQUNWLDhEQUE4RCxHQUFHO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixpQkFBaUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsVUFBVTtBQUN4RDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlFQUF5RSxpQkFBaUIsRUFBRSxHQUFHO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsV0FBVztBQUN2RSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGVBQWU7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sb0JBQW9CLGtCQUFrQjtBQUN0QyxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0EsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsdUJBQXVCLHdCQUF3QixhQUFhLHVEQUF1RDtBQUNuSDtBQUNBLDJDQUEyQyxpQ0FBaUMsR0FBRztBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGlCQUFpQixFQUFFLEdBQUc7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLEdBQUc7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7O0FBS0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxLQUFLO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw2QkFBNkIsZUFBZTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHdCQUF3QixFQUFFLE1BQU0sRUFBRSx1QkFBdUI7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDZCQUE2QixlQUFlO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxRQUFRO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxLQUFLO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7Ozs7QUFPRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7QUFNRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixNQUFNLEVBQUUsc0JBQXNCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IscUJBQXFCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsUUFBUTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsUUFBUTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7O0FBS0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUUsS0FBSztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7Ozs7QUFRRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsMEJBQTBCLGlCQUFpQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsMEJBQTBCLGlCQUFpQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ04sbUJBQW1CLFFBQVE7QUFDM0Isb0JBQW9CLFFBQVE7QUFDNUIscUJB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMseUJBQXlCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsZ0NBQWdDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw0Q0FBVyxjQUFjLDRDQUFXO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLG1GQUFzQjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFlBQVk7QUFDeEQsSUFBSTtBQUNKO0FBQ0E7QUFDQSw0QkFBNEIsWUFBWTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsV0FBVyxRQUFRLGFBQWEsK0NBQStDLE1BQU07QUFDOUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsWUFBWSxNQUFNLE1BQU0scUNBQXFDLDZCQUE2QjtBQUN6SDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0Esa0RBQWtELGtDQUFrQztBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsWUFBWSxJQUFxQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsNkNBQTZDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxLQUFLO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSx3QkFBd0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsZ0JBQWdCO0FBQ2hCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixZ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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0RixhQUFhO0FBQ3pHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrREFBK0Q7O0FBRS9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYTtBQUNiOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhO0FBQ2IsYUFBYTs7QUFFYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL2lzLXByb3AtdmFsaWQvZGlzdC9lbW90aW9uLWlzLXByb3AtdmFsaWQuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL21lbW9pemUvZGlzdC9lbW90aW9uLW1lbW9pemUuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL3N0eWxpcy9kaXN0L3N0eWxpcy5icm93c2VyLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZmxvYXRpbmctdWkvcmVhY3QvZGlzdC9mbG9hdGluZy11aS5yZWFjdC5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHBkZi1saWIvc3RhbmRhcmQtZm9udHMvZXMvRW5jb2RpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHBkZi1saWIvc3RhbmRhcmQtZm9udHMvZXMvRm9udC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcGRmLWxpYi9zdGFuZGFyZC1mb250cy9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcGRmLWxpYi9zdGFuZGFyZC1mb250cy9lcy91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcGRmLWxpYi91cG5nL1VQTkcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXJpYS1oaWRkZW4vZGlzdC9lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9UaXRsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9Cb3JkZXJSZXNpemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvRGVmYXVsdFNpZ25hdHVyZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QZGZIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvUGRmWm9vbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QbGFjZWhvbGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QbGFjZWhvbGRlckJvcmRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QbGFjZWhvbGRlclR5cGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvUHJldk5leHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvUmVuZGVyQWxsUGRmUGFnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9SZW5kZXJQZGYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvU2lnblBhZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9TaWduZXJMaXN0Q29tcG9uZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1ZlcmlmeUVtYWlsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbnN0YW50L1V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbnN0YW50L2FwcGluZm8uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29uc3RhbnQvY29uc3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvanNvbi9wbGFuc0Fyci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wYWdlcy9QZGZSZXF1ZXN0RmlsZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcHJpbWl0aXZlcy9BbGVydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL0hhbmRsZUVycm9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3ByaW1pdGl2ZXMvTG9hZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3ByaW1pdGl2ZXMvTG9hZGVyV2l0aE1zZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL01vZGFsVWkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcHJpbWl0aXZlcy9QZGZEZWNsaW5lTW9kYWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcHJpbWl0aXZlcy9Ub3VyQ29udGVudFdpdGhCdG4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcmVkdXgvcmVkdWNlcnMvU2hvd1RlbmFudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9yZWR1eC9yZWR1Y2Vycy9Ub3VyU3RlcHNSZWR1Y2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3JlZHV4L3JlZHVjZXJzL2luZm9SZWR1Y2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3JlZHV4L3JlZHVjZXJzL3Nob3dIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcmVkdXgvc3RvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY2xzeC9kaXN0L2Nsc3guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY25idWlsZGVyL2VzbS9jbmIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2Flcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvY2lwaGVyLWNvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2NvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2VuYy1iYXNlNjQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2VuYy11dGY4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9ldnBrZGYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2htYWMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL21kNS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvc2hhMS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL2JsYWNrLWFscGhhLmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL21hdXZlLmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL3Zpb2xldC5jc3MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9kaXN0L3JlYWN0LWRhdGVwaWNrZXIuY3NzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2luZGV4LmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9zdHlsZXMvb3BlbnNpZ25kcml2ZS5jc3MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvc3R5bGVzL3NpZ25hdHVyZS5jc3MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2dldFVybC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL25vZGVfbW9kdWxlcy9yZWR1eC9lcy9yZWR1eC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2Fzc2V0cy9pbWFnZXMvbG9nby5wbmciLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZmlsZS1zYXZlci9kaXN0L0ZpbGVTYXZlci5taW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9jb21tYW5kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2ZvY3VzSW5zaWRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvZm9jdXNJc0hpZGRlbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2ZvY3VzU29sdmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvZm9jdXNhYmxlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L21vdmVGb2N1c0luc2lkZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3JldHVybi1mb2N1cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3NpYmxpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9zb2x2ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9ET011dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2FsbC1hZmZlY3RlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2FycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvYXV0by1mb2N1cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2NvcnJlY3RGb2N1cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2ZpcnN0Rm9jdXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9nZXRBY3RpdmVFbGVtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvaXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9wYXJlbnRpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9zYWZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvdGFiT3JkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy90YWJVdGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL3RhYmJhYmxlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1vdXRsaW5lLW1hbmFnZXIvZm9jdXMtb3V0bGluZS1tYW5hZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2dldC1ub25jZS9kaXN0L2VzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9kaXN0L2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzLmNqcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2guZGVib3VuY2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWR6LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIta3cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1seS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLW1hLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItcHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1zYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXRuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hei5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLWJkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2NzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS1jaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZHYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWF1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tY2EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1nYi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWllLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLW56LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tc2cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLWRvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtbXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy11cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9maWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2Z5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWRldmEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nb20tbGF0bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2d1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oaS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oeS1hbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2lkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC1jaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvamEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9qdi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2thLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2tuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva28uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS1rbXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbGIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbHYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21pLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tcy1teS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9teS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25iLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC1iZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9vYy1sbmMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wYS1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3BsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcHQtYnIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3JvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcnUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2kuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zci1jeXJsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGV0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGwtcGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bS1sYXRuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHptLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdWctY24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXotbGF0bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3V6LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdmkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS94LXBzZXVkby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3lvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtY24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1oay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLW1vLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtdHcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS8gc3luYyBeXFwuXFwvLiokIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9tb21lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL2RlZmxhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvaW5mbGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvc3RyaW5ncy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jcmMzMi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2RlZmxhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9nemhlYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9tZXNzYWdlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3RyZWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvenN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9BbmFseXRpY3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQW5vbnltb3VzVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQ2xvdWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQ29yZU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQ3J5cHRvQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9FdmVudEVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvRXZlbnR1YWxseVF1ZXVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0ZhY2Vib29rVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvSW5zdGFsbGF0aW9uQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9MaXZlUXVlcnlDbGllbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvTGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5kZWZhdWx0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvT2JqZWN0U3RhdGVNdXRhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvT2ZmbGluZVF1ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlQUNMLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlQ0xQLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlQ29uZmlnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlRXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VGaWxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlR2VvUG9pbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VIb29rcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUluc3RhbGxhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUxpdmVRdWVyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZU9wLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlUG9seWdvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZVF1ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlUmVsYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VSb2xlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlU2NoZW1hLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlU2Vzc2lvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZVVzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUHVzaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9SRVNUQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9TaW5nbGVJbnN0YW5jZVN0YXRlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Tb2NrZXQud2VhcHAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9TdG9yYWdlQ29udHJvbGxlci5icm93c2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1N0b3JhZ2VDb250cm9sbGVyLndlYXBwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1Rhc2tRdWV1ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9VbmlxdWVJbnN0YW5jZVN0YXRlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9XZWJTb2NrZXRDb250cm9sbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1hoci53ZWFwcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9hcnJheUNvbnRhaW5zT2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL2NhbkJlU2VyaWFsaXplZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9kZWNvZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvZW5jb2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL2VxdWFscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9lc2NhcGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvaXNSZXZvY2FibGVTZXNzaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL3BhcnNlRGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9wcm9taXNlVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvdW5pcXVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL3Vuc2F2ZWRDaGlsZHJlbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci91dWlkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkRvY3VtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkRvY3VtZW50T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZFbWJlZGRlZEZpbGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGRW1iZWRkZWRQYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkZvbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGSW1hZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGSmF2YVNjcmlwdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZQYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERlBhZ2VPcHRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1N0YW5kYXJkRm9udHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvY29sb3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Vycm9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERkJ1dHRvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERkNoZWNrQm94LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGRHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZGaWVsZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERkZvcm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZPcHRpb25MaXN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGUmFkaW9Hcm91cC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERlNpZ25hdHVyZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERlRleHRGaWVsZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL2FwcGVhcmFuY2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvaW1hZ2UvYWxpZ25tZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2ltYWdlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL29iamVjdHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvb3BlcmF0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9vcGVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvcm90YXRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL3NpemVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL3N2Z1BhdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvdGV4dC9hbGlnbm1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvdGV4dC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS90ZXh0L2xheW91dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvUERGQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvUERGT2JqZWN0Q29waWVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvQnV0dG9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvQ2hlY2tCb3guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9DaG9pY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9Db21ib0JveC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb0ZpZWxkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvRm9ybS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb0xpc3RCb3guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9Ob25UZXJtaW5hbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb1B1c2hCdXR0b24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9SYWRpb0J1dHRvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb1NpZ25hdHVyZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb1Rlcm1pbmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvVGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9BcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hbm5vdGF0aW9uL0JvcmRlclN0eWxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hbm5vdGF0aW9uL1BERkFubm90YXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fubm90YXRpb24vUERGV2lkZ2V0QW5ub3RhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9mbGFncy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZG9jdW1lbnQvUERGQ3Jvc3NSZWZTZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9kb2N1bWVudC9QREZIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2RvY3VtZW50L1BERlRyYWlsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2RvY3VtZW50L1BERlRyYWlsZXJEaWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvQ01hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0N1c3RvbUZvbnRFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0N1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0ZpbGVFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0ZvbnRGbGFncy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0phdmFTY3JpcHRFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0pwZWdFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL1BERlBhZ2VFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL1BuZ0VtYmVkZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvU3RhbmRhcmRGb250RW1iZWRkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Vycm9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2ludGVyYWN0aXZlL1ZpZXdlclByZWZlcmVuY2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERkFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERkJvb2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGRGljdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZIZXhTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGSW52YWxpZE9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZOYW1lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERk51bGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGTnVtYmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERk9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZSYXdTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGUmVmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERlN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29wZXJhdG9ycy9QREZPcGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb3BlcmF0b3JzL1BERk9wZXJhdG9yTmFtZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3BhcnNlci9CYXNlUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9wYXJzZXIvQnl0ZVN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERk9iamVjdFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERk9iamVjdFN0cmVhbVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERlBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERlhSZWZTdHJlYW1QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvQXNjaWk4NVN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9Bc2NpaUhleFN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9EZWNvZGVTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvRmxhdGVTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvTFpXU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJlYW1zL1J1bkxlbmd0aFN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9TdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvZGVjb2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJ1Y3R1cmVzL1BERkNhdGFsb2cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGQ29udGVudFN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZDcm9zc1JlZlN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZGbGF0ZVN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZPYmplY3RTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGUGFnZUxlYWYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGUGFnZVRyZWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9DaGFyQ29kZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9EZWxpbWl0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvSXJyZWd1bGFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvS2V5d29yZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9OdW1lcmljLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvV2hpdGVzcGFjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvd3JpdGVycy9QREZTdHJlYW1Xcml0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3dyaXRlcnMvUERGV3JpdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy90eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL0NhY2hlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvYXJyYXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvYXN5bmMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9iYXNlNjQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9lcnJvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL251bWJlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9vYmplY3RzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvcGRmRG9jRW5jb2RpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9wbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9ybmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9zdHJpbmdzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvdW5pY29kZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL3ZhbGlkYXRvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3ByaW50LWpzL2Rpc3QvcHJpbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvaGFzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZS1yZXNpemFibGUvbGliL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlLXJlc2l6YWJsZS9saWIvcmVzaXplci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1jbGllbnRzaWRlLWVmZmVjdC9saWIvaW5kZXguZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtY29uZmV0dGkvZGlzdC9yZWFjdC1jb25mZXR0aS5taW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9kaXN0L3JlYWN0LWRhdGVwaWNrZXIubWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvYWRkTGVhZGluZ1plcm9zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZGVmYXVsdExvY2FsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2RlZmF1bHRPcHRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2Zvcm1hdHRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvbGlnaHRGb3JtYXR0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL3Byb3RlY3RlZFRva2Vucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGREYXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZEhvdXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZE1pbGxpc2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRNaW51dGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZE1vbnRocy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRRdWFydGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRTZWNvbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFdlZWtzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFllYXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb25zdHJ1Y3RGcm9tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZEYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZNb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZldlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXlPZlllYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5c0luTW9udGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGVmYXVsdE9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SG91cnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPRGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vla1llYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0TWludXRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRNb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRRdWFydGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFNlY29uZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0VGltZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWtZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFllYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNBZnRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0JlZm9yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0RhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNFcXVhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVEYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lTW9udGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lUXVhcnRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVmFsaWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNXaXRoaW5JbnRlcnZhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZEZvcm1hdExvbmdGbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZExvY2FsaXplRm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRNYXRjaEZuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdExvbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvbG9jYWxpemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvbWF0Y2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWF4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUlTTy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL1BhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL1NldHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0FNUE1NaWRuaWdodFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvQU1QTVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF0ZVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5T2ZZZWFyUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXlQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RheVBlcmlvZFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRXJhUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9FeHRlbmRlZFllYXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0ZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIwVG8xMVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjB0bzIzUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMVRvMjRQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIxdG8xMlBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPRGF5UGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09UaW1lem9uZVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPVGltZXpvbmVXaXRoWlBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPV2Vla1BhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPV2Vla1llYXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsRGF5UGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Mb2NhbFdlZWtQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsV2Vla1llYXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL01pbnV0ZVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTW9udGhQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1F1YXJ0ZXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1NlY29uZFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9TdGFuZEFsb25lTW9udGhQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1N0YW5kQWxvbmVRdWFydGVyUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1RpbWVzdGFtcFNlY29uZHNQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1llYXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldEhvdXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT0RheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRJU09XZWVrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldE1pbnV0ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0TW9udGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0UXVhcnRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRTZWNvbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFdlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0WWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mRGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZJU09XZWVrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZJU09XZWVrWWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mTW9udGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlF1YXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZldlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZldlZWtZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YkRheXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViTW9udGhzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YlF1YXJ0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YldlZWtzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YlllYXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3RvRGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy90cmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20uZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2NsaWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvYnVpbGQvY2pzL0RyYWdnYWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvYnVpbGQvY2pzL0RyYWdnYWJsZUNvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy9janMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy91dGlscy9kb21GbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy91dGlscy9nZXRQcmVmaXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy91dGlscy9sb2cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy91dGlscy9wb3NpdGlvbkZucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvYnVpbGQvY2pzL3V0aWxzL3NoaW1zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9ub2RlX21vZHVsZXMvY2xzeC9kaXN0L2Nsc3gubS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mYXN0LWNvbXBhcmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9BdXRvRm9jdXNJbnNpZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9Db21iaW5hdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L0ZvY3VzR3VhcmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9GcmVlRm9jdXNJbnNpZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9Mb2NrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvTW92ZUZvY3VzSW5zaWRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvVHJhcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L1VJLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9tZWRpdW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9uYW5vLWV2ZW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3Njb3BlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXNlLWZvY3VzLXNjb3BlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXNlLWZvY3VzLXN0YXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1oZWxtZXQvZXMvSGVsbWV0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1vbmNsaWNrb3V0c2lkZS9kaXN0L3JlYWN0LW9uY2xpY2tvdXRzaWRlLmVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwtYmFyL2Rpc3QvZXMyMDE1L2NvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsLWJhci9kaXN0L2VzMjAxNS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC1iYXIvZGlzdC9lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC1iYXIvZGlzdC9lczIwMTUvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9Db21iaW5hdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsL2Rpc3QvZXMyMDE1L1NpZGVFZmZlY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9VSS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsL2Rpc3QvZXMyMDE1L2FnZ3Jlc2l2ZUNhcHR1cmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9oYW5kbGVTY3JvbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9tZWRpdW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9zaWRlY2FyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJuZC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc2Nyb2xsYmFycy1jdXN0b20vZGlzdC9yc2MuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXNpZGUtZWZmZWN0L2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1zaWduYXR1cmUtY2FudmFzL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXN0eWxlLXNpbmdsZXRvbi9kaXN0L2VzMjAxNS9jb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc3R5bGUtc2luZ2xldG9uL2Rpc3QvZXMyMDE1L2hvb2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc3R5bGUtc2luZ2xldG9uL2Rpc3QvZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXN0eWxlLXNpbmdsZXRvbi9kaXN0L2VzMjAxNS9zaW5nbGV0b24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LWpzeC1ydW50aW1lLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC9qc3gtcnVudGltZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9kaXN0L3JlYWN0b3VyLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvY2xhc3NuYW1lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3RvdXIvbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVnZXgtcGFyc2VyL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtc21vb3RoL2Rpc3QvYW5jaG9yU2Nyb2xsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Njcm9sbC1zbW9vdGgvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtc21vb3RoL2Rpc3Qvb2JzZXJ2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtc21vb3RoL2Rpc3Qvc2Nyb2xsU21vb3RoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Njcm9sbC1zbW9vdGgvZGlzdC90b29scy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGxwYXJlbnQvc2Nyb2xscGFyZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3NoYWxsb3dlcXVhbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL2Rpc3QvcmVhY3QtZGF0ZXBpY2tlci5jc3M/M2Y0MyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9pbmRleC5jc3M/MDUzOCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9zdHlsZXMvb3BlbnNpZ25kcml2ZS5jc3M/NjNkMCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9zdHlsZXMvc2lnbmF0dXJlLmNzcz9jNjNjIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGVkLWNvbXBvbmVudHMvZGlzdC9zdHlsZWQtY29tcG9uZW50cy5icm93c2VyLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZWQtY29tcG9uZW50cy9ub2RlX21vZHVsZXMvQGVtb3Rpb24vdW5pdGxlc3MvZGlzdC91bml0bGVzcy5icm93c2VyLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy90YWJiYWJsZS9kaXN0L2luZGV4LmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy90cmltLWNhbnZhcy9idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91c2UtY2FsbGJhY2stcmVmL2Rpc3QvZXMyMDE1L2Fzc2lnblJlZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91c2UtY2FsbGJhY2stcmVmL2Rpc3QvZXMyMDE1L3VzZU1lcmdlUmVmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1jYWxsYmFjay1yZWYvZGlzdC9lczIwMTUvdXNlUmVmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1zaWRlY2FyL2Rpc3QvZXMyMDE1L2V4cG9ydHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLXNpZGVjYXIvZGlzdC9lczIwMTUvbWVkaXVtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS13aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3dpdGgtc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvbWF4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL21kNS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9uYXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvbmlsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3JlZ2V4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9zaGExLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92MS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92MVRvVjYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3Y1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3Y2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3Y2VG9WMS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92Ny5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92ZXJzaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3dhcm5pbmcvd2FybmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy93cy9icm93c2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3pvb20tbGV2ZWwvZGlzdC96b29tLWxldmVsLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS9pZ25vcmVkfEM6XFx2aXRlXFxhcHBzXFxPcGVuU2lnblxcbm9kZV9tb2R1bGVzXFxjcnlwdG8tanN8Y3J5cHRvIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvZnJvbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvYmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9ldmVyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbmQtaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc29ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NwbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3N0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvdmFsdWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9udW1iZXIvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvY3JlYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2ZyZWV6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcGFyc2UtaW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC1pbnRlcnZhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC10aW1lb3V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvc2V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL3RvUHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy90b1Byb3BlcnR5S2V5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy90eXBlb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2FjdHVhbC9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9hY3R1YWwvc3ltYm9sL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9hY3R1YWwvc3ltYm9sL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9hY3R1YWwvc3ltYm9sL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvZnJvbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvY29uY2F0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvZXZlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvZmlsdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2ZpbmQtaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvZmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL21hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvc29ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9zcGxpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvdmFsdWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9mdW5jdGlvbi92aXJ0dWFsL2JpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2JpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvZXZlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvZmluZC1pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvZmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2luZGV4LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2Uvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL3NvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL3NwbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2Uvc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2pzb24vc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL251bWJlci9pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3QvY3JlYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3QvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2ZyZWV6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3Byb21pc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3NldC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvc3RyaW5nL3ZpcnR1YWwvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3N0cmluZy92aXJ0dWFsL3N0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9zeW1ib2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvc3ltYm9sL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvd2Vhay1tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ZlYXR1cmVzL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZmVhdHVyZXMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mZWF0dXJlcy9zeW1ib2wvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mdWxsL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2Z1bGwvc3ltYm9sL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mdWxsL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZnVsbC9zeW1ib2wvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2EtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Etc2V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1idWZmZXItbm9uLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LWZyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LXJlZHVjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1zbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LXNvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NhbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY3JlYXRlLWl0ZXItcmVzdWx0LW9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGF0ZS10by1pc28tc3RyaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kZWxldGUtcHJvcGVydHktb3ItdGhyb3cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbmdpbmUtZmYtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2VuZ2luZS1pcy1icm93c2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW5naW5lLWlzLWJ1bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2VuZ2luZS1pcy1kZW5vLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW5naW5lLWlzLWllLW9yLWVkZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2VuZ2luZS1pcy13ZWJvcy13ZWJraXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW5naW5lLXdlYmtpdC12ZXJzaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGxhYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZXhwb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZmFpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mcmVlemluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtYWNjZXNzb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtaXRlcmF0b3ItZGlyZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1qc29uLXJlcGxhY2VyLWZ1bmN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1zZXQtcmVjb3JkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2hpZGRlbi1rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaHRtbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2luc3RhbGwtZXJyb3ItY2F1c2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1wb3NzaWJsZS1wcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1wdXJlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtc3ltYm9sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0ZS1zaW1wbGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRvci1jcmVhdGUtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbWFwLWhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9tYXRoLXRydW5jLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbWljcm90YXNrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9ub3QtYS1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtaXMtZXh0ZW5zaWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC10by1hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vd24ta2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3BhdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9wZXJmb3JtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcXVldWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zYWZlLWdldC1idWlsdC1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NjaGVkdWxlcnMtZml4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWNsb25lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWRpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaGVscGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1pbnRlcnNlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaXMtZGlzam9pbnQtZnJvbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1pcy1zdWJzZXQtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaXMtc3VwZXJzZXQtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaXRlcmF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LXNpemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1zeW1tZXRyaWMtZGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LXVuaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3RyaW5nLXBhZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zeW1ib2wtZGVmaW5lLXRvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N5bWJvbC1pcy1yZWdpc3RlcmVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3ltYm9sLWlzLXdlbGwta25vd24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zeW1ib2wtcmVnaXN0cnktZGV0ZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdGFzay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3VpZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdjgtcHJvdG90eXBlLWRlZmluZS1idWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvd2Vhay1tYXAtYmFzaWMtZGV0ZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYWdncmVnYXRlLWVycm9yLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuZXZlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmlzLWFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5Lm1hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuc2xpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuc29ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuZGF0ZS50by1qc29uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmRhdGUudG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmZ1bmN0aW9uLmJpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm1hcC5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5tYXAuZ3JvdXAtYnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMubWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5udW1iZXIuaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuZnJlZXplLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuYWxsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuYW55LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuY2F0Y2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLnJhY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5yZWplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5yZXNvbHZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2Uud2l0aC1yZXNvbHZlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucmVmbGVjdC50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuZGlmZmVyZW5jZS52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuaW50ZXJzZWN0aW9uLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5pcy1kaXNqb2ludC1mcm9tLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5pcy1zdWJzZXQtb2YudjIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LmlzLXN1cGVyc2V0LW9mLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuc3ltbWV0cmljLWRpZmZlcmVuY2UudjIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LnVuaW9uLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5mb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmhhcy1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wua2V5LWZvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gtYWxsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wucmVwbGFjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuc2VhcmNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5zcGVjaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5zcGxpdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wudG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC51bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuZnVuY3Rpb24ubWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5hc3luYy1kaXNwb3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuY3VzdG9tLW1hdGNoZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5kaXNwb3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtcmVnaXN0ZXJlZC1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5pcy1yZWdpc3RlcmVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5pcy13ZWxsLWtub3duLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wubWF0Y2hlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLm1ldGFkYXRhLWtleS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLm1ldGFkYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wub2JzZXJ2YWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLnBhdHRlcm4tbWF0Y2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5yZXBsYWNlLWFsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvd2ViLnNldC1pbnRlcnZhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy93ZWIuc2V0LXRpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvd2ViLnRpbWVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2FycmF5L3ZpcnR1YWwvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2FycmF5L3ZpcnR1YWwvZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS92aXJ0dWFsL2tleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS92aXJ0dWFsL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2JpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZXZlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9maW5kLWluZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2tleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3NvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zcGxpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2pzb24vc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvbWFwL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvbnVtYmVyL2lzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2NyZWF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9mcmVlemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3BhcnNlLWludC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3Byb21pc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zZXQtaW50ZXJ2YWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zZXQtdGltZW91dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3NldC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3N5bWJvbC90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS93ZWFrLW1hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJvcGVydHlLZXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9jb3JlL2Rpc3QvZmxvYXRpbmctdWkuY29yZS5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL2RvbS9kaXN0L2Zsb2F0aW5nLXVpLmRvbS5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL3JlYWN0LWRvbS9kaXN0L2Zsb2F0aW5nLXVpLnJlYWN0LWRvbS5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL3JlYWN0L2Rpc3QvZmxvYXRpbmctdWkucmVhY3QudXRpbHMubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS91dGlscy9kaXN0L2Zsb2F0aW5nLXVpLnV0aWxzLmRvbS5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL3V0aWxzL2Rpc3QvZmxvYXRpbmctdWkudXRpbHMubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9wcmltaXRpdmUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWFycm93L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1jb2xsZWN0aW9uL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnMvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWNvbnRleHQvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWRpcmVjdGlvbi9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtZGlzbWlzc2FibGUtbGF5ZXIvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWRyb3Bkb3duLW1lbnUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWZvY3VzLWd1YXJkcy9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtZm9jdXMtc2NvcGUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWlkL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1tZW51L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wb3BwZXIvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXBvcnRhbC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtcHJlc2VuY2UvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3Qtcm92aW5nLWZvY3VzL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1zbG90L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtY29udHJvbGxhYmxlLXN0YXRlL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtZXNjYXBlLWtleWRvd24vZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1sYXlvdXQtZWZmZWN0L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2Utc2l6ZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC9Bc2FwUXVldWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvUmF3VGFzay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC9UYXNrRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC9hc2FwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1kbmQvYXNhcC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1kbmQvYXNhcC9kaXN0L21ha2VSZXF1ZXN0Q2FsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC90eXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2ludmFyaWFudC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWR1eGpzL3Rvb2xraXQvZGlzdC9yZWR1eC10b29sa2l0Lm1vZGVybi5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL2FkYXB0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy9mZXRjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMveGhyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9heGlvcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbFRva2VuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsZWRFcnJvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL2lzQ2FuY2VsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zRXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3NIZWFkZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0ludGVyY2VwdG9yTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9idWlsZEZ1bGxQYXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9tZXJnZUNvbmZpZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9zZXR0bGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZGVmYXVsdHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzL3RyYW5zaXRpb25hbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZW52L2RhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvSHR0cFN0YXR1c0NvZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb21iaW5lVVJMcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb21wb3NlU2lnbmFscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBeGlvc0Vycm9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9udWxsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZVByb3RvY29sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Byb2dyZXNzRXZlbnRSZWR1Y2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Jlc29sdmVDb25maWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3BlZWRvbWV0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Rocm90dGxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3RvRm9ybURhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdG9VUkxFbmNvZGVkRm9ybS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90cmFja1N0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy92YWxpZGF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9CbG9iLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2NsYXNzZXMvRm9ybURhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9VUkxTZWFyY2hQYXJhbXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2NvbW1vbi91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2Nsc3gvZGlzdC9jbHN4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kZXF1YWwvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL2JlZ2luRHJhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvZHJvcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvZW5kRHJhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvaG92ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC9sb2NhbC9zZXRDbGllbnRPZmZzZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL3B1Ymxpc2hEcmFnU291cmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC90eXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvcmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9jbGFzc2VzL0RyYWdEcm9wTWFuYWdlckltcGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9jbGFzc2VzL0RyYWdEcm9wTW9uaXRvckltcGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9jbGFzc2VzL0hhbmRsZXJSZWdpc3RyeUltcGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9jb250cmFjdHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9jcmVhdGVEcmFnRHJvcE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9pbnRlcmZhY2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvcmVkdWNlcnMvZGlydHlIYW5kbGVySWRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvcmVkdWNlcnMvZHJhZ09mZnNldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3JlZHVjZXJzL2RyYWdPcGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9yZWR1Y2Vycy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3JlZHVjZXJzL3JlZkNvdW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvcmVkdWNlcnMvc3RhdGVJZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3V0aWxzL2Nvb3Jkcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3V0aWxzL2RpcnRpbmVzcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3V0aWxzL2VxdWFsaXR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvdXRpbHMvZ2V0TmV4dFVuaXF1ZUlkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvdXRpbHMvanNfdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC91dGlscy9tYXRjaGVzVHlwZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9pZGIta2V5dmFsL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaW1tZXIvZGlzdC9pbW1lci5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbWFrZS1jYW5jZWxsYWJsZS1wcm9taXNlL2Rpc3QvZXNtL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21ha2UtZXZlbnQtcHJvcHMvZGlzdC9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbWVyZ2UtcmVmcy9kaXN0L2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGZqcy1kaXN0L2J1aWxkL3BkZi5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9Ccm93c2VyRGV0ZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9FbnRlckxlYXZlQ291bnRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L0hUTUw1QmFja2VuZEltcGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9Nb25vdG9uaWNJbnRlcnBvbGFudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L05hdGl2ZURyYWdTb3VyY2VzL05hdGl2ZURyYWdTb3VyY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9OYXRpdmVEcmFnU291cmNlcy9nZXREYXRhRnJvbURhdGFUcmFuc2Zlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L05hdGl2ZURyYWdTb3VyY2VzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvTmF0aXZlRHJhZ1NvdXJjZXMvbmF0aXZlVHlwZXNDb25maWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9OYXRpdmVUeXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L09mZnNldFV0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvT3B0aW9uc1JlYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L2dldEVtcHR5SW1hZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L3V0aWxzL2pzX3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC9kaXN0L2NvcmUvRG5kQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQvZGlzdC9jb3JlL0RuZFByb3ZpZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9Eb2N1bWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vRG9jdW1lbnRDb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9MaW5rU2VydmljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vTWVzc2FnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vUGFnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vUGFnZUNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1BhZ2UvQW5ub3RhdGlvbkxheWVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9QYWdlL0NhbnZhcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vUGFnZS9UZXh0TGF5ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1Bhc3N3b3JkUmVzcG9uc2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9TdHJ1Y3RUcmVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9TdHJ1Y3RUcmVlSXRlbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vc2hhcmVkL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vc2hhcmVkL2hvb2tzL3VzZURvY3VtZW50Q29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vc2hhcmVkL2hvb2tzL3VzZVBhZ2VDb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9zaGFyZWQvaG9va3MvdXNlUmVzb2x2ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL3NoYXJlZC9zdHJ1Y3RUcmVlVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL3NoYXJlZC91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9kaXN0L3JlYWN0LXJlZHV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWR1eC10aHVuay9kaXN0L3JlZHV4LXRodW5rLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWR1eC9kaXN0L3JlZHV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZXNlbGVjdC9kaXN0L3Jlc2VsZWN0Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zaWduYXR1cmVfcGFkL2Rpc3Qvc2lnbmF0dXJlX3BhZC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdGlueS1pbnZhcmlhbnQvZGlzdC9lc20vdGlueS1pbnZhcmlhbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvY3JlYXRlIGZha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL25vZGUgbW9kdWxlIGRlY29yYXRvciIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvcHVibGljUGF0aCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvbm9uY2UiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvc2NyaXB0L1B1YmxpY1RlbXBsYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiUHVibGljVGVtcGxhdGVcIiwgW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiUHVibGljVGVtcGxhdGVcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiUHVibGljVGVtcGxhdGVcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCAoKSA9PiB7XG5yZXR1cm4gIiwiaW1wb3J0IG1lbW9pemUgZnJvbSAnQGVtb3Rpb24vbWVtb2l6ZSc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxudmFyIHJlYWN0UHJvcHNSZWdleCA9IC9eKChjaGlsZHJlbnxkYW5nZXJvdXNseVNldElubmVySFRNTHxrZXl8cmVmfGF1dG9Gb2N1c3xkZWZhdWx0VmFsdWV8ZGVmYXVsdENoZWNrZWR8aW5uZXJIVE1MfHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ3xzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmd8dmFsdWVMaW5rfGFiYnJ8YWNjZXB0fGFjY2VwdENoYXJzZXR8YWNjZXNzS2V5fGFjdGlvbnxhbGxvd3xhbGxvd1VzZXJNZWRpYXxhbGxvd1BheW1lbnRSZXF1ZXN0fGFsbG93RnVsbFNjcmVlbnxhbGxvd1RyYW5zcGFyZW5jeXxhbHR8YXN5bmN8YXV0b0NvbXBsZXRlfGF1dG9QbGF5fGNhcHR1cmV8Y2VsbFBhZGRpbmd8Y2VsbFNwYWNpbmd8Y2hhbGxlbmdlfGNoYXJTZXR8Y2hlY2tlZHxjaXRlfGNsYXNzSUR8Y2xhc3NOYW1lfGNvbHN8Y29sU3Bhbnxjb250ZW50fGNvbnRlbnRFZGl0YWJsZXxjb250ZXh0TWVudXxjb250cm9sc3xjb250cm9sc0xpc3R8Y29vcmRzfGNyb3NzT3JpZ2lufGRhdGF8ZGF0ZVRpbWV8ZGVjb2Rpbmd8ZGVmYXVsdHxkZWZlcnxkaXJ8ZGlzYWJsZWR8ZGlzYWJsZVBpY3R1cmVJblBpY3R1cmV8ZGlzYWJsZVJlbW90ZVBsYXliYWNrfGRvd25sb2FkfGRyYWdnYWJsZXxlbmNUeXBlfGVudGVyS2V5SGludHxmb3JtfGZvcm1BY3Rpb258Zm9ybUVuY1R5cGV8Zm9ybU1ldGhvZHxmb3JtTm9WYWxpZGF0ZXxmb3JtVGFyZ2V0fGZyYW1lQm9yZGVyfGhlYWRlcnN8aGVpZ2h0fGhpZGRlbnxoaWdofGhyZWZ8aHJlZkxhbmd8aHRtbEZvcnxodHRwRXF1aXZ8aWR8aW5wdXRNb2RlfGludGVncml0eXxpc3xrZXlQYXJhbXN8a2V5VHlwZXxraW5kfGxhYmVsfGxhbmd8bGlzdHxsb2FkaW5nfGxvb3B8bG93fG1hcmdpbkhlaWdodHxtYXJnaW5XaWR0aHxtYXh8bWF4TGVuZ3RofG1lZGlhfG1lZGlhR3JvdXB8bWV0aG9kfG1pbnxtaW5MZW5ndGh8bXVsdGlwbGV8bXV0ZWR8bmFtZXxub25jZXxub1ZhbGlkYXRlfG9wZW58b3B0aW11bXxwYXR0ZXJufHBsYWNlaG9sZGVyfHBsYXlzSW5saW5lfHBvc3RlcnxwcmVsb2FkfHByb2ZpbGV8cmFkaW9Hcm91cHxyZWFkT25seXxyZWZlcnJlclBvbGljeXxyZWx8cmVxdWlyZWR8cmV2ZXJzZWR8cm9sZXxyb3dzfHJvd1NwYW58c2FuZGJveHxzY29wZXxzY29wZWR8c2Nyb2xsaW5nfHNlYW1sZXNzfHNlbGVjdGVkfHNoYXBlfHNpemV8c2l6ZXN8c2xvdHxzcGFufHNwZWxsQ2hlY2t8c3JjfHNyY0RvY3xzcmNMYW5nfHNyY1NldHxzdGFydHxzdGVwfHN0eWxlfHN1bW1hcnl8dGFiSW5kZXh8dGFyZ2V0fHRpdGxlfHRyYW5zbGF0ZXx0eXBlfHVzZU1hcHx2YWx1ZXx3aWR0aHx3bW9kZXx3cmFwfGFib3V0fGRhdGF0eXBlfGlubGlzdHxwcmVmaXh8cHJvcGVydHl8cmVzb3VyY2V8dHlwZW9mfHZvY2FifGF1dG9DYXBpdGFsaXplfGF1dG9Db3JyZWN0fGF1dG9TYXZlfGNvbG9yfGluY3JlbWVudGFsfGZhbGxiYWNrfGluZXJ0fGl0ZW1Qcm9wfGl0ZW1TY29wZXxpdGVtVHlwZXxpdGVtSUR8aXRlbVJlZnxvbnxvcHRpb258cmVzdWx0c3xzZWN1cml0eXx1bnNlbGVjdGFibGV8YWNjZW50SGVpZ2h0fGFjY3VtdWxhdGV8YWRkaXRpdmV8YWxpZ25tZW50QmFzZWxpbmV8YWxsb3dSZW9yZGVyfGFscGhhYmV0aWN8YW1wbGl0dWRlfGFyYWJpY0Zvcm18YXNjZW50fGF0dHJpYnV0ZU5hbWV8YXR0cmlidXRlVHlwZXxhdXRvUmV2ZXJzZXxhemltdXRofGJhc2VGcmVxdWVuY3l8YmFzZWxpbmVTaGlmdHxiYXNlUHJvZmlsZXxiYm94fGJlZ2lufGJpYXN8Ynl8Y2FsY01vZGV8Y2FwSGVpZ2h0fGNsaXB8Y2xpcFBhdGhVbml0c3xjbGlwUGF0aHxjbGlwUnVsZXxjb2xvckludGVycG9sYXRpb258Y29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyc3xjb2xvclByb2ZpbGV8Y29sb3JSZW5kZXJpbmd8Y29udGVudFNjcmlwdFR5cGV8Y29udGVudFN0eWxlVHlwZXxjdXJzb3J8Y3h8Y3l8ZHxkZWNlbGVyYXRlfGRlc2NlbnR8ZGlmZnVzZUNvbnN0YW50fGRpcmVjdGlvbnxkaXNwbGF5fGRpdmlzb3J8ZG9taW5hbnRCYXNlbGluZXxkdXJ8ZHh8ZHl8ZWRnZU1vZGV8ZWxldmF0aW9ufGVuYWJsZUJhY2tncm91bmR8ZW5kfGV4cG9uZW50fGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWR8ZmlsbHxmaWxsT3BhY2l0eXxmaWxsUnVsZXxmaWx0ZXJ8ZmlsdGVyUmVzfGZpbHRlclVuaXRzfGZsb29kQ29sb3J8Zmxvb2RPcGFjaXR5fGZvY3VzYWJsZXxmb250RmFtaWx5fGZvbnRTaXplfGZvbnRTaXplQWRqdXN0fGZvbnRTdHJldGNofGZvbnRTdHlsZXxmb250VmFyaWFudHxmb250V2VpZ2h0fGZvcm1hdHxmcm9tfGZyfGZ4fGZ5fGcxfGcyfGdseXBoTmFtZXxnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbHxnbHlwaE9yaWVudGF0aW9uVmVydGljYWx8Z2x5cGhSZWZ8Z3JhZGllbnRUcmFuc2Zvcm18Z3JhZGllbnRVbml0c3xoYW5naW5nfGhvcml6QWR2WHxob3Jpek9yaWdpblh8aWRlb2dyYXBoaWN8aW1hZ2VSZW5kZXJpbmd8aW58aW4yfGludGVyY2VwdHxrfGsxfGsyfGszfGs0fGtlcm5lbE1hdHJpeHxrZXJuZWxVbml0TGVuZ3RofGtlcm5pbmd8a2V5UG9pbnRzfGtleVNwbGluZXN8a2V5VGltZXN8bGVuZ3RoQWRqdXN0fGxldHRlclNwYWNpbmd8bGlnaHRpbmdDb2xvcnxsaW1pdGluZ0NvbmVBbmdsZXxsb2NhbHxtYXJrZXJFbmR8bWFya2VyTWlkfG1hcmtlclN0YXJ0fG1hcmtlckhlaWdodHxtYXJrZXJVbml0c3xtYXJrZXJXaWR0aHxtYXNrfG1hc2tDb250ZW50VW5pdHN8bWFza1VuaXRzfG1hdGhlbWF0aWNhbHxtb2RlfG51bU9jdGF2ZXN8b2Zmc2V0fG9wYWNpdHl8b3BlcmF0b3J8b3JkZXJ8b3JpZW50fG9yaWVudGF0aW9ufG9yaWdpbnxvdmVyZmxvd3xvdmVybGluZVBvc2l0aW9ufG92ZXJsaW5lVGhpY2tuZXNzfHBhbm9zZTF8cGFpbnRPcmRlcnxwYXRoTGVuZ3RofHBhdHRlcm5Db250ZW50VW5pdHN8cGF0dGVyblRyYW5zZm9ybXxwYXR0ZXJuVW5pdHN8cG9pbnRlckV2ZW50c3xwb2ludHN8cG9pbnRzQXRYfHBvaW50c0F0WXxwb2ludHNBdFp8cHJlc2VydmVBbHBoYXxwcmVzZXJ2ZUFzcGVjdFJhdGlvfHByaW1pdGl2ZVVuaXRzfHJ8cmFkaXVzfHJlZlh8cmVmWXxyZW5kZXJpbmdJbnRlbnR8cmVwZWF0Q291bnR8cmVwZWF0RHVyfHJlcXVpcmVkRXh0ZW5zaW9uc3xyZXF1aXJlZEZlYXR1cmVzfHJlc3RhcnR8cmVzdWx0fHJvdGF0ZXxyeHxyeXxzY2FsZXxzZWVkfHNoYXBlUmVuZGVyaW5nfHNsb3BlfHNwYWNpbmd8c3BlY3VsYXJDb25zdGFudHxzcGVjdWxhckV4cG9uZW50fHNwZWVkfHNwcmVhZE1ldGhvZHxzdGFydE9mZnNldHxzdGREZXZpYXRpb258c3RlbWh8c3RlbXZ8c3RpdGNoVGlsZXN8c3RvcENvbG9yfHN0b3BPcGFjaXR5fHN0cmlrZXRocm91Z2hQb3NpdGlvbnxzdHJpa2V0aHJvdWdoVGhpY2tuZXNzfHN0cmluZ3xzdHJva2V8c3Ryb2tlRGFzaGFycmF5fHN0cm9rZURhc2hvZmZzZXR8c3Ryb2tlTGluZWNhcHxzdHJva2VMaW5lam9pbnxzdHJva2VNaXRlcmxpbWl0fHN0cm9rZU9wYWNpdHl8c3Ryb2tlV2lkdGh8c3VyZmFjZVNjYWxlfHN5c3RlbUxhbmd1YWdlfHRhYmxlVmFsdWVzfHRhcmdldFh8dGFyZ2V0WXx0ZXh0QW5jaG9yfHRleHREZWNvcmF0aW9ufHRleHRSZW5kZXJpbmd8dGV4dExlbmd0aHx0b3x0cmFuc2Zvcm18dTF8dTJ8dW5kZXJsaW5lUG9zaXRpb258dW5kZXJsaW5lVGhpY2tuZXNzfHVuaWNvZGV8dW5pY29kZUJpZGl8dW5pY29kZVJhbmdlfHVuaXRzUGVyRW18dkFscGhhYmV0aWN8dkhhbmdpbmd8dklkZW9ncmFwaGljfHZNYXRoZW1hdGljYWx8dmFsdWVzfHZlY3RvckVmZmVjdHx2ZXJzaW9ufHZlcnRBZHZZfHZlcnRPcmlnaW5YfHZlcnRPcmlnaW5ZfHZpZXdCb3h8dmlld1RhcmdldHx2aXNpYmlsaXR5fHdpZHRoc3x3b3JkU3BhY2luZ3x3cml0aW5nTW9kZXx4fHhIZWlnaHR8eDF8eDJ8eENoYW5uZWxTZWxlY3Rvcnx4bGlua0FjdHVhdGV8eGxpbmtBcmNyb2xlfHhsaW5rSHJlZnx4bGlua1JvbGV8eGxpbmtTaG93fHhsaW5rVGl0bGV8eGxpbmtUeXBlfHhtbEJhc2V8eG1sbnN8eG1sbnNYbGlua3x4bWxMYW5nfHhtbFNwYWNlfHl8eTF8eTJ8eUNoYW5uZWxTZWxlY3Rvcnx6fHpvb21BbmRQYW58Zm9yfGNsYXNzfGF1dG9mb2N1cyl8KChbRGRdW0FhXVtUdF1bQWFdfFtBYV1bUnJdW0lpXVtBYV18eCktLiopKSQvOyAvLyBodHRwczovL2VzYmVuY2guY29tL2JlbmNoLzViZmVlNjhhNGNkN2U2MDA5ZWY2MWQyM1xuXG52YXIgaXNQcm9wVmFsaWQgPSAvKiAjX19QVVJFX18gKi9tZW1vaXplKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHJldHVybiByZWFjdFByb3BzUmVnZXgudGVzdChwcm9wKSB8fCBwcm9wLmNoYXJDb2RlQXQoMCkgPT09IDExMVxuICAvKiBvICovXG4gICYmIHByb3AuY2hhckNvZGVBdCgxKSA9PT0gMTEwXG4gIC8qIG4gKi9cbiAgJiYgcHJvcC5jaGFyQ29kZUF0KDIpIDwgOTE7XG59XG4vKiBaKzEgKi9cbik7XG5cbmV4cG9ydCB7IGlzUHJvcFZhbGlkIGFzIGRlZmF1bHQgfTtcbiIsImZ1bmN0aW9uIG1lbW9pemUoZm4pIHtcbiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICBpZiAoY2FjaGVbYXJnXSA9PT0gdW5kZWZpbmVkKSBjYWNoZVthcmddID0gZm4oYXJnKTtcbiAgICByZXR1cm4gY2FjaGVbYXJnXTtcbiAgfTtcbn1cblxuZXhwb3J0IHsgbWVtb2l6ZSBhcyBkZWZhdWx0IH07XG4iLCJmdW5jdGlvbiBzdHlsaXNfbWluIChXKSB7XG4gIGZ1bmN0aW9uIE0oZCwgYywgZSwgaCwgYSkge1xuICAgIGZvciAodmFyIG0gPSAwLCBiID0gMCwgdiA9IDAsIG4gPSAwLCBxLCBnLCB4ID0gMCwgSyA9IDAsIGssIHUgPSBrID0gcSA9IDAsIGwgPSAwLCByID0gMCwgSSA9IDAsIHQgPSAwLCBCID0gZS5sZW5ndGgsIEogPSBCIC0gMSwgeSwgZiA9ICcnLCBwID0gJycsIEYgPSAnJywgRyA9ICcnLCBDOyBsIDwgQjspIHtcbiAgICAgIGcgPSBlLmNoYXJDb2RlQXQobCk7XG4gICAgICBsID09PSBKICYmIDAgIT09IGIgKyBuICsgdiArIG0gJiYgKDAgIT09IGIgJiYgKGcgPSA0NyA9PT0gYiA/IDEwIDogNDcpLCBuID0gdiA9IG0gPSAwLCBCKyssIEorKyk7XG5cbiAgICAgIGlmICgwID09PSBiICsgbiArIHYgKyBtKSB7XG4gICAgICAgIGlmIChsID09PSBKICYmICgwIDwgciAmJiAoZiA9IGYucmVwbGFjZShOLCAnJykpLCAwIDwgZi50cmltKCkubGVuZ3RoKSkge1xuICAgICAgICAgIHN3aXRjaCAoZykge1xuICAgICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIGNhc2UgNTk6XG4gICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGYgKz0gZS5jaGFyQXQobCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZyA9IDU5O1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChnKSB7XG4gICAgICAgICAgY2FzZSAxMjM6XG4gICAgICAgICAgICBmID0gZi50cmltKCk7XG4gICAgICAgICAgICBxID0gZi5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgayA9IDE7XG5cbiAgICAgICAgICAgIGZvciAodCA9ICsrbDsgbCA8IEI7KSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoZyA9IGUuY2hhckNvZGVBdChsKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTIzOlxuICAgICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDEyNTpcbiAgICAgICAgICAgICAgICAgIGstLTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA0NzpcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZyA9IGUuY2hhckNvZGVBdChsICsgMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzpcbiAgICAgICAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHUgPSBsICsgMTsgdSA8IEo7ICsrdSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUuY2hhckNvZGVBdCh1KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNDIgPT09IGcgJiYgNDIgPT09IGUuY2hhckNvZGVBdCh1IC0gMSkgJiYgbCArIDIgIT09IHUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IHUgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNDcgPT09IGcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IHUgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbCA9IHU7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA5MTpcbiAgICAgICAgICAgICAgICAgIGcrKztcblxuICAgICAgICAgICAgICAgIGNhc2UgNDA6XG4gICAgICAgICAgICAgICAgICBnKys7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgICAgICAgICBmb3IgKDsgbCsrIDwgSiAmJiBlLmNoYXJDb2RlQXQobCkgIT09IGc7KSB7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICgwID09PSBrKSBicmVhaztcbiAgICAgICAgICAgICAgbCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBrID0gZS5zdWJzdHJpbmcodCwgbCk7XG4gICAgICAgICAgICAwID09PSBxICYmIChxID0gKGYgPSBmLnJlcGxhY2UoY2EsICcnKS50cmltKCkpLmNoYXJDb2RlQXQoMCkpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHEpIHtcbiAgICAgICAgICAgICAgY2FzZSA2NDpcbiAgICAgICAgICAgICAgICAwIDwgciAmJiAoZiA9IGYucmVwbGFjZShOLCAnJykpO1xuICAgICAgICAgICAgICAgIGcgPSBmLmNoYXJDb2RlQXQoMSk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGcpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOlxuICAgICAgICAgICAgICAgICAgY2FzZSAxMDk6XG4gICAgICAgICAgICAgICAgICBjYXNlIDExNTpcbiAgICAgICAgICAgICAgICAgIGNhc2UgNDU6XG4gICAgICAgICAgICAgICAgICAgIHIgPSBjO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgciA9IE87XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgayA9IE0oYywgciwgaywgZywgYSArIDEpO1xuICAgICAgICAgICAgICAgIHQgPSBrLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAwIDwgQSAmJiAociA9IFgoTywgZiwgSSksIEMgPSBIKDMsIGssIHIsIGMsIEQsIHosIHQsIGcsIGEsIGgpLCBmID0gci5qb2luKCcnKSwgdm9pZCAwICE9PSBDICYmIDAgPT09ICh0ID0gKGsgPSBDLnRyaW0oKSkubGVuZ3RoKSAmJiAoZyA9IDAsIGsgPSAnJykpO1xuICAgICAgICAgICAgICAgIGlmICgwIDwgdCkgc3dpdGNoIChnKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDExNTpcbiAgICAgICAgICAgICAgICAgICAgZiA9IGYucmVwbGFjZShkYSwgZWEpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDEwMDpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTA5OlxuICAgICAgICAgICAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICAgICAgICAgICAgayA9IGYgKyAneycgKyBrICsgJ30nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgY2FzZSAxMDc6XG4gICAgICAgICAgICAgICAgICAgIGYgPSBmLnJlcGxhY2UoZmEsICckMSAkMicpO1xuICAgICAgICAgICAgICAgICAgICBrID0gZiArICd7JyArIGsgKyAnfSc7XG4gICAgICAgICAgICAgICAgICAgIGsgPSAxID09PSB3IHx8IDIgPT09IHcgJiYgTCgnQCcgKyBrLCAzKSA/ICdALXdlYmtpdC0nICsgayArICdAJyArIGsgOiAnQCcgKyBrO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgayA9IGYgKyBrLCAxMTIgPT09IGggJiYgKGsgPSAocCArPSBrLCAnJykpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBrID0gJyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBrID0gTShjLCBYKGMsIGYsIEkpLCBrLCBoLCBhICsgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEYgKz0gaztcbiAgICAgICAgICAgIGsgPSBJID0gciA9IHUgPSBxID0gMDtcbiAgICAgICAgICAgIGYgPSAnJztcbiAgICAgICAgICAgIGcgPSBlLmNoYXJDb2RlQXQoKytsKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxMjU6XG4gICAgICAgICAgY2FzZSA1OTpcbiAgICAgICAgICAgIGYgPSAoMCA8IHIgPyBmLnJlcGxhY2UoTiwgJycpIDogZikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKDEgPCAodCA9IGYubGVuZ3RoKSkgc3dpdGNoICgwID09PSB1ICYmIChxID0gZi5jaGFyQ29kZUF0KDApLCA0NSA9PT0gcSB8fCA5NiA8IHEgJiYgMTIzID4gcSkgJiYgKHQgPSAoZiA9IGYucmVwbGFjZSgnICcsICc6JykpLmxlbmd0aCksIDAgPCBBICYmIHZvaWQgMCAhPT0gKEMgPSBIKDEsIGYsIGMsIGQsIEQsIHosIHAubGVuZ3RoLCBoLCBhLCBoKSkgJiYgMCA9PT0gKHQgPSAoZiA9IEMudHJpbSgpKS5sZW5ndGgpICYmIChmID0gJ1xceDAwXFx4MDAnKSwgcSA9IGYuY2hhckNvZGVBdCgwKSwgZyA9IGYuY2hhckNvZGVBdCgxKSwgcSkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSA2NDpcbiAgICAgICAgICAgICAgICBpZiAoMTA1ID09PSBnIHx8IDk5ID09PSBnKSB7XG4gICAgICAgICAgICAgICAgICBHICs9IGYgKyBlLmNoYXJBdChsKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIDU4ICE9PSBmLmNoYXJDb2RlQXQodCAtIDEpICYmIChwICs9IFAoZiwgcSwgZywgZi5jaGFyQ29kZUF0KDIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBJID0gciA9IHUgPSBxID0gMDtcbiAgICAgICAgICAgIGYgPSAnJztcbiAgICAgICAgICAgIGcgPSBlLmNoYXJDb2RlQXQoKytsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGcpIHtcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICA0NyA9PT0gYiA/IGIgPSAwIDogMCA9PT0gMSArIHEgJiYgMTA3ICE9PSBoICYmIDAgPCBmLmxlbmd0aCAmJiAociA9IDEsIGYgKz0gJ1xceDAwJyk7XG4gICAgICAgICAgMCA8IEEgKiBZICYmIEgoMCwgZiwgYywgZCwgRCwgeiwgcC5sZW5ndGgsIGgsIGEsIGgpO1xuICAgICAgICAgIHogPSAxO1xuICAgICAgICAgIEQrKztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDU5OlxuICAgICAgICBjYXNlIDEyNTpcbiAgICAgICAgICBpZiAoMCA9PT0gYiArIG4gKyB2ICsgbSkge1xuICAgICAgICAgICAgeisrO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgeisrO1xuICAgICAgICAgIHkgPSBlLmNoYXJBdChsKTtcblxuICAgICAgICAgIHN3aXRjaCAoZykge1xuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgICAgaWYgKDAgPT09IG4gKyBtICsgYikgc3dpdGNoICh4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSA0NDpcbiAgICAgICAgICAgICAgICBjYXNlIDU4OlxuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgICAgICAgeSA9ICcnO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgMzIgIT09IGcgJiYgKHkgPSAnICcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHkgPSAnXFxcXDAnO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgeSA9ICdcXFxcZic7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICB5ID0gJ1xcXFx2JztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICAgIDAgPT09IG4gKyBiICsgbSAmJiAociA9IEkgPSAxLCB5ID0gJ1xcZicgKyB5KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMTA4OlxuICAgICAgICAgICAgICBpZiAoMCA9PT0gbiArIGIgKyBtICsgRSAmJiAwIDwgdSkgc3dpdGNoIChsIC0gdSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgIDExMiA9PT0geCAmJiA1OCA9PT0gZS5jaGFyQ29kZUF0KGwgLSAzKSAmJiAoRSA9IHgpO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgMTExID09PSBLICYmIChFID0gSyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNTg6XG4gICAgICAgICAgICAgIDAgPT09IG4gKyBiICsgbSAmJiAodSA9IGwpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA0NDpcbiAgICAgICAgICAgICAgMCA9PT0gYiArIHYgKyBuICsgbSAmJiAociA9IDEsIHkgKz0gJ1xccicpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgICAgIDAgPT09IGIgJiYgKG4gPSBuID09PSBnID8gMCA6IDAgPT09IG4gPyBnIDogbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDkxOlxuICAgICAgICAgICAgICAwID09PSBuICsgYiArIHYgJiYgbSsrO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA5MzpcbiAgICAgICAgICAgICAgMCA9PT0gbiArIGIgKyB2ICYmIG0tLTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNDE6XG4gICAgICAgICAgICAgIDAgPT09IG4gKyBiICsgbSAmJiB2LS07XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgICBpZiAoMCA9PT0gbiArIGIgKyBtKSB7XG4gICAgICAgICAgICAgICAgaWYgKDAgPT09IHEpIHN3aXRjaCAoMiAqIHggKyAzICogSykge1xuICAgICAgICAgICAgICAgICAgY2FzZSA1MzM6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBxID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdisrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNjQ6XG4gICAgICAgICAgICAgIDAgPT09IGIgKyB2ICsgbiArIG0gKyB1ICsgayAmJiAoayA9IDEpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgIGNhc2UgNDc6XG4gICAgICAgICAgICAgIGlmICghKDAgPCBuICsgbSArIHYpKSBzd2l0Y2ggKGIpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKDIgKiBnICsgMyAqIGUuY2hhckNvZGVBdChsICsgMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzU6XG4gICAgICAgICAgICAgICAgICAgICAgYiA9IDQ3O1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjIwOlxuICAgICAgICAgICAgICAgICAgICAgIHQgPSBsLCBiID0gNDI7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgICAgICAgIDQ3ID09PSBnICYmIDQyID09PSB4ICYmIHQgKyAyICE9PSBsICYmICgzMyA9PT0gZS5jaGFyQ29kZUF0KHQgKyAyKSAmJiAocCArPSBlLnN1YnN0cmluZyh0LCBsICsgMSkpLCB5ID0gJycsIGIgPSAwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIDAgPT09IGIgJiYgKGYgKz0geSk7XG4gICAgICB9XG5cbiAgICAgIEsgPSB4O1xuICAgICAgeCA9IGc7XG4gICAgICBsKys7XG4gICAgfVxuXG4gICAgdCA9IHAubGVuZ3RoO1xuXG4gICAgaWYgKDAgPCB0KSB7XG4gICAgICByID0gYztcbiAgICAgIGlmICgwIDwgQSAmJiAoQyA9IEgoMiwgcCwgciwgZCwgRCwgeiwgdCwgaCwgYSwgaCksIHZvaWQgMCAhPT0gQyAmJiAwID09PSAocCA9IEMpLmxlbmd0aCkpIHJldHVybiBHICsgcCArIEY7XG4gICAgICBwID0gci5qb2luKCcsJykgKyAneycgKyBwICsgJ30nO1xuXG4gICAgICBpZiAoMCAhPT0gdyAqIEUpIHtcbiAgICAgICAgMiAhPT0gdyB8fCBMKHAsIDIpIHx8IChFID0gMCk7XG5cbiAgICAgICAgc3dpdGNoIChFKSB7XG4gICAgICAgICAgY2FzZSAxMTE6XG4gICAgICAgICAgICBwID0gcC5yZXBsYWNlKGhhLCAnOi1tb3otJDEnKSArIHA7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMTEyOlxuICAgICAgICAgICAgcCA9IHAucmVwbGFjZShRLCAnOjotd2Via2l0LWlucHV0LSQxJykgKyBwLnJlcGxhY2UoUSwgJzo6LW1vei0kMScpICsgcC5yZXBsYWNlKFEsICc6LW1zLWlucHV0LSQxJykgKyBwO1xuICAgICAgICB9XG5cbiAgICAgICAgRSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEcgKyBwICsgRjtcbiAgfVxuXG4gIGZ1bmN0aW9uIFgoZCwgYywgZSkge1xuICAgIHZhciBoID0gYy50cmltKCkuc3BsaXQoaWEpO1xuICAgIGMgPSBoO1xuICAgIHZhciBhID0gaC5sZW5ndGgsXG4gICAgICAgIG0gPSBkLmxlbmd0aDtcblxuICAgIHN3aXRjaCAobSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgICB2YXIgYiA9IDA7XG5cbiAgICAgICAgZm9yIChkID0gMCA9PT0gbSA/ICcnIDogZFswXSArICcgJzsgYiA8IGE7ICsrYikge1xuICAgICAgICAgIGNbYl0gPSBaKGQsIGNbYl0sIGUpLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgdiA9IGIgPSAwO1xuXG4gICAgICAgIGZvciAoYyA9IFtdOyBiIDwgYTsgKytiKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBtOyArK24pIHtcbiAgICAgICAgICAgIGNbdisrXSA9IFooZFtuXSArICcgJywgaFtiXSwgZSkudHJpbSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG4gIH1cblxuICBmdW5jdGlvbiBaKGQsIGMsIGUpIHtcbiAgICB2YXIgaCA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICAzMyA+IGggJiYgKGggPSAoYyA9IGMudHJpbSgpKS5jaGFyQ29kZUF0KDApKTtcblxuICAgIHN3aXRjaCAoaCkge1xuICAgICAgY2FzZSAzODpcbiAgICAgICAgcmV0dXJuIGMucmVwbGFjZShGLCAnJDEnICsgZC50cmltKCkpO1xuXG4gICAgICBjYXNlIDU4OlxuICAgICAgICByZXR1cm4gZC50cmltKCkgKyBjLnJlcGxhY2UoRiwgJyQxJyArIGQudHJpbSgpKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKDAgPCAxICogZSAmJiAwIDwgYy5pbmRleE9mKCdcXGYnKSkgcmV0dXJuIGMucmVwbGFjZShGLCAoNTggPT09IGQuY2hhckNvZGVBdCgwKSA/ICcnIDogJyQxJykgKyBkLnRyaW0oKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGQgKyBjO1xuICB9XG5cbiAgZnVuY3Rpb24gUChkLCBjLCBlLCBoKSB7XG4gICAgdmFyIGEgPSBkICsgJzsnLFxuICAgICAgICBtID0gMiAqIGMgKyAzICogZSArIDQgKiBoO1xuXG4gICAgaWYgKDk0NCA9PT0gbSkge1xuICAgICAgZCA9IGEuaW5kZXhPZignOicsIDkpICsgMTtcbiAgICAgIHZhciBiID0gYS5zdWJzdHJpbmcoZCwgYS5sZW5ndGggLSAxKS50cmltKCk7XG4gICAgICBiID0gYS5zdWJzdHJpbmcoMCwgZCkudHJpbSgpICsgYiArICc7JztcbiAgICAgIHJldHVybiAxID09PSB3IHx8IDIgPT09IHcgJiYgTChiLCAxKSA/ICctd2Via2l0LScgKyBiICsgYiA6IGI7XG4gICAgfVxuXG4gICAgaWYgKDAgPT09IHcgfHwgMiA9PT0gdyAmJiAhTChhLCAxKSkgcmV0dXJuIGE7XG5cbiAgICBzd2l0Y2ggKG0pIHtcbiAgICAgIGNhc2UgMTAxNTpcbiAgICAgICAgcmV0dXJuIDk3ID09PSBhLmNoYXJDb2RlQXQoMTApID8gJy13ZWJraXQtJyArIGEgKyBhIDogYTtcblxuICAgICAgY2FzZSA5NTE6XG4gICAgICAgIHJldHVybiAxMTYgPT09IGEuY2hhckNvZGVBdCgzKSA/ICctd2Via2l0LScgKyBhICsgYSA6IGE7XG5cbiAgICAgIGNhc2UgOTYzOlxuICAgICAgICByZXR1cm4gMTEwID09PSBhLmNoYXJDb2RlQXQoNSkgPyAnLXdlYmtpdC0nICsgYSArIGEgOiBhO1xuXG4gICAgICBjYXNlIDEwMDk6XG4gICAgICAgIGlmICgxMDAgIT09IGEuY2hhckNvZGVBdCg0KSkgYnJlYWs7XG5cbiAgICAgIGNhc2UgOTY5OlxuICAgICAgY2FzZSA5NDI6XG4gICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArIGE7XG5cbiAgICAgIGNhc2UgOTc4OlxuICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1vei0nICsgYSArIGE7XG5cbiAgICAgIGNhc2UgMTAxOTpcbiAgICAgIGNhc2UgOTgzOlxuICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1vei0nICsgYSArICctbXMtJyArIGEgKyBhO1xuXG4gICAgICBjYXNlIDg4MzpcbiAgICAgICAgaWYgKDQ1ID09PSBhLmNoYXJDb2RlQXQoOCkpIHJldHVybiAnLXdlYmtpdC0nICsgYSArIGE7XG4gICAgICAgIGlmICgwIDwgYS5pbmRleE9mKCdpbWFnZS1zZXQoJywgMTEpKSByZXR1cm4gYS5yZXBsYWNlKGphLCAnJDEtd2Via2l0LSQyJykgKyBhO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA5MzI6XG4gICAgICAgIGlmICg0NSA9PT0gYS5jaGFyQ29kZUF0KDQpKSBzd2l0Y2ggKGEuY2hhckNvZGVBdCg1KSkge1xuICAgICAgICAgIGNhc2UgMTAzOlxuICAgICAgICAgICAgcmV0dXJuICctd2Via2l0LWJveC0nICsgYS5yZXBsYWNlKCctZ3JvdycsICcnKSArICctd2Via2l0LScgKyBhICsgJy1tcy0nICsgYS5yZXBsYWNlKCdncm93JywgJ3Bvc2l0aXZlJykgKyBhO1xuXG4gICAgICAgICAgY2FzZSAxMTU6XG4gICAgICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1zLScgKyBhLnJlcGxhY2UoJ3NocmluaycsICduZWdhdGl2ZScpICsgYTtcblxuICAgICAgICAgIGNhc2UgOTg6XG4gICAgICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1zLScgKyBhLnJlcGxhY2UoJ2Jhc2lzJywgJ3ByZWZlcnJlZC1zaXplJykgKyBhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbXMtJyArIGEgKyBhO1xuXG4gICAgICBjYXNlIDk2NDpcbiAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgJy1tcy1mbGV4LScgKyBhICsgYTtcblxuICAgICAgY2FzZSAxMDIzOlxuICAgICAgICBpZiAoOTkgIT09IGEuY2hhckNvZGVBdCg4KSkgYnJlYWs7XG4gICAgICAgIGIgPSBhLnN1YnN0cmluZyhhLmluZGV4T2YoJzonLCAxNSkpLnJlcGxhY2UoJ2ZsZXgtJywgJycpLnJlcGxhY2UoJ3NwYWNlLWJldHdlZW4nLCAnanVzdGlmeScpO1xuICAgICAgICByZXR1cm4gJy13ZWJraXQtYm94LXBhY2snICsgYiArICctd2Via2l0LScgKyBhICsgJy1tcy1mbGV4LXBhY2snICsgYiArIGE7XG5cbiAgICAgIGNhc2UgMTAwNTpcbiAgICAgICAgcmV0dXJuIGthLnRlc3QoYSkgPyBhLnJlcGxhY2UoYWEsICc6LXdlYmtpdC0nKSArIGEucmVwbGFjZShhYSwgJzotbW96LScpICsgYSA6IGE7XG5cbiAgICAgIGNhc2UgMWUzOlxuICAgICAgICBiID0gYS5zdWJzdHJpbmcoMTMpLnRyaW0oKTtcbiAgICAgICAgYyA9IGIuaW5kZXhPZignLScpICsgMTtcblxuICAgICAgICBzd2l0Y2ggKGIuY2hhckNvZGVBdCgwKSArIGIuY2hhckNvZGVBdChjKSkge1xuICAgICAgICAgIGNhc2UgMjI2OlxuICAgICAgICAgICAgYiA9IGEucmVwbGFjZShHLCAndGInKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMzI6XG4gICAgICAgICAgICBiID0gYS5yZXBsYWNlKEcsICd0Yi1ybCcpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIyMDpcbiAgICAgICAgICAgIGIgPSBhLnJlcGxhY2UoRywgJ2xyJyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbXMtJyArIGIgKyBhO1xuXG4gICAgICBjYXNlIDEwMTc6XG4gICAgICAgIGlmICgtMSA9PT0gYS5pbmRleE9mKCdzdGlja3knLCA5KSkgYnJlYWs7XG5cbiAgICAgIGNhc2UgOTc1OlxuICAgICAgICBjID0gKGEgPSBkKS5sZW5ndGggLSAxMDtcbiAgICAgICAgYiA9ICgzMyA9PT0gYS5jaGFyQ29kZUF0KGMpID8gYS5zdWJzdHJpbmcoMCwgYykgOiBhKS5zdWJzdHJpbmcoZC5pbmRleE9mKCc6JywgNykgKyAxKS50cmltKCk7XG5cbiAgICAgICAgc3dpdGNoIChtID0gYi5jaGFyQ29kZUF0KDApICsgKGIuY2hhckNvZGVBdCg3KSB8IDApKSB7XG4gICAgICAgICAgY2FzZSAyMDM6XG4gICAgICAgICAgICBpZiAoMTExID4gYi5jaGFyQ29kZUF0KDgpKSBicmVhaztcblxuICAgICAgICAgIGNhc2UgMTE1OlxuICAgICAgICAgICAgYSA9IGEucmVwbGFjZShiLCAnLXdlYmtpdC0nICsgYikgKyAnOycgKyBhO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIwNzpcbiAgICAgICAgICBjYXNlIDEwMjpcbiAgICAgICAgICAgIGEgPSBhLnJlcGxhY2UoYiwgJy13ZWJraXQtJyArICgxMDIgPCBtID8gJ2lubGluZS0nIDogJycpICsgJ2JveCcpICsgJzsnICsgYS5yZXBsYWNlKGIsICctd2Via2l0LScgKyBiKSArICc7JyArIGEucmVwbGFjZShiLCAnLW1zLScgKyBiICsgJ2JveCcpICsgJzsnICsgYTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhICsgJzsnO1xuXG4gICAgICBjYXNlIDkzODpcbiAgICAgICAgaWYgKDQ1ID09PSBhLmNoYXJDb2RlQXQoNSkpIHN3aXRjaCAoYS5jaGFyQ29kZUF0KDYpKSB7XG4gICAgICAgICAgY2FzZSAxMDU6XG4gICAgICAgICAgICByZXR1cm4gYiA9IGEucmVwbGFjZSgnLWl0ZW1zJywgJycpLCAnLXdlYmtpdC0nICsgYSArICctd2Via2l0LWJveC0nICsgYiArICctbXMtZmxleC0nICsgYiArIGE7XG5cbiAgICAgICAgICBjYXNlIDExNTpcbiAgICAgICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbXMtZmxleC1pdGVtLScgKyBhLnJlcGxhY2UoYmEsICcnKSArIGE7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgJy1tcy1mbGV4LWxpbmUtcGFjaycgKyBhLnJlcGxhY2UoJ2FsaWduLWNvbnRlbnQnLCAnJykucmVwbGFjZShiYSwgJycpICsgYTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA5NzM6XG4gICAgICBjYXNlIDk4OTpcbiAgICAgICAgaWYgKDQ1ICE9PSBhLmNoYXJDb2RlQXQoMykgfHwgMTIyID09PSBhLmNoYXJDb2RlQXQoNCkpIGJyZWFrO1xuXG4gICAgICBjYXNlIDkzMTpcbiAgICAgIGNhc2UgOTUzOlxuICAgICAgICBpZiAoITAgPT09IGxhLnRlc3QoZCkpIHJldHVybiAxMTUgPT09IChiID0gZC5zdWJzdHJpbmcoZC5pbmRleE9mKCc6JykgKyAxKSkuY2hhckNvZGVBdCgwKSA/IFAoZC5yZXBsYWNlKCdzdHJldGNoJywgJ2ZpbGwtYXZhaWxhYmxlJyksIGMsIGUsIGgpLnJlcGxhY2UoJzpmaWxsLWF2YWlsYWJsZScsICc6c3RyZXRjaCcpIDogYS5yZXBsYWNlKGIsICctd2Via2l0LScgKyBiKSArIGEucmVwbGFjZShiLCAnLW1vei0nICsgYi5yZXBsYWNlKCdmaWxsLScsICcnKSkgKyBhO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA5NjI6XG4gICAgICAgIGlmIChhID0gJy13ZWJraXQtJyArIGEgKyAoMTAyID09PSBhLmNoYXJDb2RlQXQoNSkgPyAnLW1zLScgKyBhIDogJycpICsgYSwgMjExID09PSBlICsgaCAmJiAxMDUgPT09IGEuY2hhckNvZGVBdCgxMykgJiYgMCA8IGEuaW5kZXhPZigndHJhbnNmb3JtJywgMTApKSByZXR1cm4gYS5zdWJzdHJpbmcoMCwgYS5pbmRleE9mKCc7JywgMjcpICsgMSkucmVwbGFjZShtYSwgJyQxLXdlYmtpdC0kMicpICsgYTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEwoZCwgYykge1xuICAgIHZhciBlID0gZC5pbmRleE9mKDEgPT09IGMgPyAnOicgOiAneycpLFxuICAgICAgICBoID0gZC5zdWJzdHJpbmcoMCwgMyAhPT0gYyA/IGUgOiAxMCk7XG4gICAgZSA9IGQuc3Vic3RyaW5nKGUgKyAxLCBkLmxlbmd0aCAtIDEpO1xuICAgIHJldHVybiBSKDIgIT09IGMgPyBoIDogaC5yZXBsYWNlKG5hLCAnJDEnKSwgZSwgYyk7XG4gIH1cblxuICBmdW5jdGlvbiBlYShkLCBjKSB7XG4gICAgdmFyIGUgPSBQKGMsIGMuY2hhckNvZGVBdCgwKSwgYy5jaGFyQ29kZUF0KDEpLCBjLmNoYXJDb2RlQXQoMikpO1xuICAgIHJldHVybiBlICE9PSBjICsgJzsnID8gZS5yZXBsYWNlKG9hLCAnIG9yICgkMSknKS5zdWJzdHJpbmcoNCkgOiAnKCcgKyBjICsgJyknO1xuICB9XG5cbiAgZnVuY3Rpb24gSChkLCBjLCBlLCBoLCBhLCBtLCBiLCB2LCBuLCBxKSB7XG4gICAgZm9yICh2YXIgZyA9IDAsIHggPSBjLCB3OyBnIDwgQTsgKytnKSB7XG4gICAgICBzd2l0Y2ggKHcgPSBTW2ddLmNhbGwoQiwgZCwgeCwgZSwgaCwgYSwgbSwgYiwgdiwgbiwgcSkpIHtcbiAgICAgICAgY2FzZSB2b2lkIDA6XG4gICAgICAgIGNhc2UgITE6XG4gICAgICAgIGNhc2UgITA6XG4gICAgICAgIGNhc2UgbnVsbDpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHggPSB3O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh4ICE9PSBjKSByZXR1cm4geDtcbiAgfVxuXG4gIGZ1bmN0aW9uIFQoZCkge1xuICAgIHN3aXRjaCAoZCkge1xuICAgICAgY2FzZSB2b2lkIDA6XG4gICAgICBjYXNlIG51bGw6XG4gICAgICAgIEEgPSBTLmxlbmd0aCA9IDA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGQpIFNbQSsrXSA9IGQ7ZWxzZSBpZiAoJ29iamVjdCcgPT09IHR5cGVvZiBkKSBmb3IgKHZhciBjID0gMCwgZSA9IGQubGVuZ3RoOyBjIDwgZTsgKytjKSB7XG4gICAgICAgICAgVChkW2NdKTtcbiAgICAgICAgfSBlbHNlIFkgPSAhIWQgfCAwO1xuICAgIH1cblxuICAgIHJldHVybiBUO1xuICB9XG5cbiAgZnVuY3Rpb24gVShkKSB7XG4gICAgZCA9IGQucHJlZml4O1xuICAgIHZvaWQgMCAhPT0gZCAmJiAoUiA9IG51bGwsIGQgPyAnZnVuY3Rpb24nICE9PSB0eXBlb2YgZCA/IHcgPSAxIDogKHcgPSAyLCBSID0gZCkgOiB3ID0gMCk7XG4gICAgcmV0dXJuIFU7XG4gIH1cblxuICBmdW5jdGlvbiBCKGQsIGMpIHtcbiAgICB2YXIgZSA9IGQ7XG4gICAgMzMgPiBlLmNoYXJDb2RlQXQoMCkgJiYgKGUgPSBlLnRyaW0oKSk7XG4gICAgViA9IGU7XG4gICAgZSA9IFtWXTtcblxuICAgIGlmICgwIDwgQSkge1xuICAgICAgdmFyIGggPSBIKC0xLCBjLCBlLCBlLCBELCB6LCAwLCAwLCAwLCAwKTtcbiAgICAgIHZvaWQgMCAhPT0gaCAmJiAnc3RyaW5nJyA9PT0gdHlwZW9mIGggJiYgKGMgPSBoKTtcbiAgICB9XG5cbiAgICB2YXIgYSA9IE0oTywgZSwgYywgMCwgMCk7XG4gICAgMCA8IEEgJiYgKGggPSBIKC0yLCBhLCBlLCBlLCBELCB6LCBhLmxlbmd0aCwgMCwgMCwgMCksIHZvaWQgMCAhPT0gaCAmJiAoYSA9IGgpKTtcbiAgICBWID0gJyc7XG4gICAgRSA9IDA7XG4gICAgeiA9IEQgPSAxO1xuICAgIHJldHVybiBhO1xuICB9XG5cbiAgdmFyIGNhID0gL15cXDArL2csXG4gICAgICBOID0gL1tcXDBcXHJcXGZdL2csXG4gICAgICBhYSA9IC86ICovZyxcbiAgICAgIGthID0gL3pvb3xncmEvLFxuICAgICAgbWEgPSAvKFssOiBdKSh0cmFuc2Zvcm0pL2csXG4gICAgICBpYSA9IC8sXFxyKz8vZyxcbiAgICAgIEYgPSAvKFtcXHRcXHJcXG4gXSkqXFxmPyYvZyxcbiAgICAgIGZhID0gL0Aoa1xcdyspXFxzKihcXFMqKVxccyovLFxuICAgICAgUSA9IC86OihwbGFjZSkvZyxcbiAgICAgIGhhID0gLzoocmVhZC1vbmx5KS9nLFxuICAgICAgRyA9IC9bc3ZoXVxcdystW3RibHJdezJ9LyxcbiAgICAgIGRhID0gL1xcKFxccyooLiopXFxzKlxcKS9nLFxuICAgICAgb2EgPSAvKFtcXHNcXFNdKj8pOy9nLFxuICAgICAgYmEgPSAvLXNlbGZ8ZmxleC0vZyxcbiAgICAgIG5hID0gL1teXSo/KDpbcnBdW2VsXWFbXFx3LV0rKVteXSovLFxuICAgICAgbGEgPSAvc3RyZXRjaHw6XFxzKlxcdytcXC0oPzpjb250ZXxhdmFpbCkvLFxuICAgICAgamEgPSAvKFteLV0pKGltYWdlLXNldFxcKCkvLFxuICAgICAgeiA9IDEsXG4gICAgICBEID0gMSxcbiAgICAgIEUgPSAwLFxuICAgICAgdyA9IDEsXG4gICAgICBPID0gW10sXG4gICAgICBTID0gW10sXG4gICAgICBBID0gMCxcbiAgICAgIFIgPSBudWxsLFxuICAgICAgWSA9IDAsXG4gICAgICBWID0gJyc7XG4gIEIudXNlID0gVDtcbiAgQi5zZXQgPSBVO1xuICB2b2lkIDAgIT09IFcgJiYgVShXKTtcbiAgcmV0dXJuIEI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0eWxpc19taW47XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgc3RvcEV2ZW50LCBnZXREb2N1bWVudCwgaXNNb3VzZUxpa2VQb2ludGVyVHlwZSwgY29udGFpbnMsIGFjdGl2ZUVsZW1lbnQsIGlzU2FmYXJpLCBpc1R5cGVhYmxlQ29tYm9ib3gsIGlzVmlydHVhbENsaWNrLCBpc1ZpcnR1YWxQb2ludGVyRXZlbnQsIGdldFRhcmdldCwgZ2V0UGxhdGZvcm0sIGlzVHlwZWFibGVFbGVtZW50LCBpc1JlYWN0RXZlbnQsIGlzUm9vdEVsZW1lbnQsIGlzRXZlbnRUYXJnZXRXaXRoaW4sIGlzTWFjLCBnZXRVc2VyQWdlbnQgfSBmcm9tICdAZmxvYXRpbmctdWkvcmVhY3QvdXRpbHMnO1xuaW1wb3J0IHsgZmxvb3IsIGV2YWx1YXRlIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzJztcbmltcG9ydCB7IGdldENvbXB1dGVkU3R5bGUsIGlzRWxlbWVudCwgZ2V0Tm9kZU5hbWUsIGlzSFRNTEVsZW1lbnQsIGdldFdpbmRvdywgaXNMYXN0VHJhdmVyc2FibGVOb2RlLCBnZXRQYXJlbnROb2RlIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzL2RvbSc7XG5pbXBvcnQgeyB0YWJiYWJsZSwgaXNUYWJiYWJsZSB9IGZyb20gJ3RhYmJhYmxlJztcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBnZXRPdmVyZmxvd0FuY2VzdG9ycywgdXNlRmxvYXRpbmcgYXMgdXNlRmxvYXRpbmckMSwgb2Zmc2V0LCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gJ0BmbG9hdGluZy11aS9yZWFjdC1kb20nO1xuZXhwb3J0IHsgYXJyb3csIGF1dG9QbGFjZW1lbnQsIGF1dG9VcGRhdGUsIGNvbXB1dGVQb3NpdGlvbiwgZGV0ZWN0T3ZlcmZsb3csIGZsaXAsIGdldE92ZXJmbG93QW5jZXN0b3JzLCBoaWRlLCBpbmxpbmUsIGxpbWl0U2hpZnQsIG9mZnNldCwgcGxhdGZvcm0sIHNoaWZ0LCBzaXplIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3JlYWN0LWRvbSc7XG5cbi8qKlxuICogTWVyZ2VzIGFuIGFycmF5IG9mIHJlZnMgaW50byBhIHNpbmdsZSBtZW1vaXplZCBjYWxsYmFjayByZWYgb3IgYG51bGxgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3JlYWN0LXV0aWxzI3VzZW1lcmdlcmVmc1xuICovXG5mdW5jdGlvbiB1c2VNZXJnZVJlZnMocmVmcykge1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHJlZnMuZXZlcnkocmVmID0+IHJlZiA9PSBudWxsKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSA9PiB7XG4gICAgICByZWZzLmZvckVhY2gocmVmID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZWYodmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgICAgICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIHJlZnMpO1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbXVpL21hdGVyaWFsLXVpL2lzc3Vlcy80MTE5MCNpc3N1ZWNvbW1lbnQtMjA0MDg3MzM3OVxuY29uc3QgU2FmZVJlYWN0ID0ge1xuICAuLi5SZWFjdFxufTtcblxuY29uc3QgdXNlSW5zZXJ0aW9uRWZmZWN0ID0gU2FmZVJlYWN0LnVzZUluc2VydGlvbkVmZmVjdDtcbmNvbnN0IHVzZVNhZmVJbnNlcnRpb25FZmZlY3QgPSB1c2VJbnNlcnRpb25FZmZlY3QgfHwgKGZuID0+IGZuKCkpO1xuZnVuY3Rpb24gdXNlRWZmZWN0RXZlbnQoY2FsbGJhY2spIHtcbiAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKCgpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIGFuIGV2ZW50IGhhbmRsZXIgd2hpbGUgcmVuZGVyaW5nLicpO1xuICAgIH1cbiAgfSk7XG4gIHVzZVNhZmVJbnNlcnRpb25FZmZlY3QoKCkgPT4ge1xuICAgIHJlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG4gIH0pO1xuICByZXR1cm4gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZi5jdXJyZW50ID09IG51bGwgPyB2b2lkIDAgOiByZWYuY3VycmVudCguLi5hcmdzKTtcbiAgfSwgW10pO1xufVxuXG5jb25zdCBBUlJPV19VUCA9ICdBcnJvd1VwJztcbmNvbnN0IEFSUk9XX0RPV04gPSAnQXJyb3dEb3duJztcbmNvbnN0IEFSUk9XX0xFRlQgPSAnQXJyb3dMZWZ0JztcbmNvbnN0IEFSUk9XX1JJR0hUID0gJ0Fycm93UmlnaHQnO1xuZnVuY3Rpb24gaXNEaWZmZXJlbnRSb3coaW5kZXgsIGNvbHMsIHByZXZSb3cpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoaW5kZXggLyBjb2xzKSAhPT0gcHJldlJvdztcbn1cbmZ1bmN0aW9uIGlzSW5kZXhPdXRPZkJvdW5kcyhsaXN0UmVmLCBpbmRleCkge1xuICByZXR1cm4gaW5kZXggPCAwIHx8IGluZGV4ID49IGxpc3RSZWYuY3VycmVudC5sZW5ndGg7XG59XG5mdW5jdGlvbiBnZXRNaW5JbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXMpIHtcbiAgcmV0dXJuIGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICBkaXNhYmxlZEluZGljZXNcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRNYXhJbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXMpIHtcbiAgcmV0dXJuIGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgc3RhcnRpbmdJbmRleDogbGlzdFJlZi5jdXJyZW50Lmxlbmd0aCxcbiAgICBkaXNhYmxlZEluZGljZXNcbiAgfSk7XG59XG5mdW5jdGlvbiBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCBfdGVtcCkge1xuICBsZXQge1xuICAgIHN0YXJ0aW5nSW5kZXggPSAtMSxcbiAgICBkZWNyZW1lbnQgPSBmYWxzZSxcbiAgICBkaXNhYmxlZEluZGljZXMsXG4gICAgYW1vdW50ID0gMVxuICB9ID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA7XG4gIGNvbnN0IGxpc3QgPSBsaXN0UmVmLmN1cnJlbnQ7XG4gIGxldCBpbmRleCA9IHN0YXJ0aW5nSW5kZXg7XG4gIGRvIHtcbiAgICBpbmRleCArPSBkZWNyZW1lbnQgPyAtYW1vdW50IDogYW1vdW50O1xuICB9IHdoaWxlIChpbmRleCA+PSAwICYmIGluZGV4IDw9IGxpc3QubGVuZ3RoIC0gMSAmJiBpc0Rpc2FibGVkKGxpc3QsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpKTtcbiAgcmV0dXJuIGluZGV4O1xufVxuZnVuY3Rpb24gZ2V0R3JpZE5hdmlnYXRlZEluZGV4KGVsZW1lbnRzUmVmLCBfcmVmKSB7XG4gIGxldCB7XG4gICAgZXZlbnQsXG4gICAgb3JpZW50YXRpb24sXG4gICAgbG9vcCxcbiAgICBjb2xzLFxuICAgIGRpc2FibGVkSW5kaWNlcyxcbiAgICBtaW5JbmRleCxcbiAgICBtYXhJbmRleCxcbiAgICBwcmV2SW5kZXgsXG4gICAgc3RvcEV2ZW50OiBzdG9wID0gZmFsc2VcbiAgfSA9IF9yZWY7XG4gIGxldCBuZXh0SW5kZXggPSBwcmV2SW5kZXg7XG4gIGlmIChldmVudC5rZXkgPT09IEFSUk9XX1VQKSB7XG4gICAgc3RvcCAmJiBzdG9wRXZlbnQoZXZlbnQpO1xuICAgIGlmIChwcmV2SW5kZXggPT09IC0xKSB7XG4gICAgICBuZXh0SW5kZXggPSBtYXhJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgc3RhcnRpbmdJbmRleDogbmV4dEluZGV4LFxuICAgICAgICBhbW91bnQ6IGNvbHMsXG4gICAgICAgIGRlY3JlbWVudDogdHJ1ZSxcbiAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICB9KTtcbiAgICAgIGlmIChsb29wICYmIChwcmV2SW5kZXggLSBjb2xzIDwgbWluSW5kZXggfHwgbmV4dEluZGV4IDwgMCkpIHtcbiAgICAgICAgY29uc3QgY29sID0gcHJldkluZGV4ICUgY29scztcbiAgICAgICAgY29uc3QgbWF4Q29sID0gbWF4SW5kZXggJSBjb2xzO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBtYXhJbmRleCAtIChtYXhDb2wgLSBjb2wpO1xuICAgICAgICBpZiAobWF4Q29sID09PSBjb2wpIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBtYXhJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBtYXhDb2wgPiBjb2wgPyBvZmZzZXQgOiBvZmZzZXQgLSBjb2xzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0luZGV4T3V0T2ZCb3VuZHMoZWxlbWVudHNSZWYsIG5leHRJbmRleCkpIHtcbiAgICAgIG5leHRJbmRleCA9IHByZXZJbmRleDtcbiAgICB9XG4gIH1cbiAgaWYgKGV2ZW50LmtleSA9PT0gQVJST1dfRE9XTikge1xuICAgIHN0b3AgJiYgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICBpZiAocHJldkluZGV4ID09PSAtMSkge1xuICAgICAgbmV4dEluZGV4ID0gbWluSW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCxcbiAgICAgICAgYW1vdW50OiBjb2xzLFxuICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgIH0pO1xuICAgICAgaWYgKGxvb3AgJiYgcHJldkluZGV4ICsgY29scyA+IG1heEluZGV4KSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4ICUgY29scyAtIGNvbHMsXG4gICAgICAgICAgYW1vdW50OiBjb2xzLFxuICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSW5kZXhPdXRPZkJvdW5kcyhlbGVtZW50c1JlZiwgbmV4dEluZGV4KSkge1xuICAgICAgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbWFpbnMgb24gdGhlIHNhbWUgcm93L2NvbHVtbi5cbiAgaWYgKG9yaWVudGF0aW9uID09PSAnYm90aCcpIHtcbiAgICBjb25zdCBwcmV2Um93ID0gZmxvb3IocHJldkluZGV4IC8gY29scyk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gQVJST1dfUklHSFQpIHtcbiAgICAgIHN0b3AgJiYgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIGlmIChwcmV2SW5kZXggJSBjb2xzICE9PSBjb2xzIC0gMSkge1xuICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCxcbiAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChsb29wICYmIGlzRGlmZmVyZW50Um93KG5leHRJbmRleCwgY29scywgcHJldlJvdykpIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4IC0gcHJldkluZGV4ICUgY29scyAtIDEsXG4gICAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsb29wKSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4IC0gcHJldkluZGV4ICUgY29scyAtIDEsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGlmZmVyZW50Um93KG5leHRJbmRleCwgY29scywgcHJldlJvdykpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSBBUlJPV19MRUZUKSB7XG4gICAgICBzdG9wICYmIHN0b3BFdmVudChldmVudCk7XG4gICAgICBpZiAocHJldkluZGV4ICUgY29scyAhPT0gMCkge1xuICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCxcbiAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobG9vcCAmJiBpc0RpZmZlcmVudFJvdyhuZXh0SW5kZXgsIGNvbHMsIHByZXZSb3cpKSB7XG4gICAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCArIChjb2xzIC0gcHJldkluZGV4ICUgY29scyksXG4gICAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsb29wKSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4ICsgKGNvbHMgLSBwcmV2SW5kZXggJSBjb2xzKSxcbiAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGlmZmVyZW50Um93KG5leHRJbmRleCwgY29scywgcHJldlJvdykpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsYXN0Um93ID0gZmxvb3IobWF4SW5kZXggLyBjb2xzKSA9PT0gcHJldlJvdztcbiAgICBpZiAoaXNJbmRleE91dE9mQm91bmRzKGVsZW1lbnRzUmVmLCBuZXh0SW5kZXgpKSB7XG4gICAgICBpZiAobG9vcCAmJiBsYXN0Um93KSB7XG4gICAgICAgIG5leHRJbmRleCA9IGV2ZW50LmtleSA9PT0gQVJST1dfTEVGVCA/IG1heEluZGV4IDogZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICBzdGFydGluZ0luZGV4OiBwcmV2SW5kZXggLSBwcmV2SW5kZXggJSBjb2xzIC0gMSxcbiAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0SW5kZXggPSBwcmV2SW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXh0SW5kZXg7XG59XG5cbi8qKiBGb3IgZWFjaCBjZWxsIGluZGV4LCBnZXRzIHRoZSBpdGVtIGluZGV4IHRoYXQgb2NjdXBpZXMgdGhhdCBjZWxsICovXG5mdW5jdGlvbiBidWlsZENlbGxNYXAoc2l6ZXMsIGNvbHMsIGRlbnNlKSB7XG4gIGNvbnN0IGNlbGxNYXAgPSBbXTtcbiAgbGV0IHN0YXJ0SW5kZXggPSAwO1xuICBzaXplcy5mb3JFYWNoKChfcmVmMiwgaW5kZXgpID0+IHtcbiAgICBsZXQge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gX3JlZjI7XG4gICAgaWYgKHdpZHRoID4gY29scykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbRmxvYXRpbmcgVUldOiBJbnZhbGlkIGdyaWQgLSBpdGVtIHdpZHRoIGF0IGluZGV4IFwiICsgaW5kZXggKyBcIiBpcyBncmVhdGVyIHRoYW4gZ3JpZCBjb2x1bW5zXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaXRlbVBsYWNlZCA9IGZhbHNlO1xuICAgIGlmIChkZW5zZSkge1xuICAgICAgc3RhcnRJbmRleCA9IDA7XG4gICAgfVxuICAgIHdoaWxlICghaXRlbVBsYWNlZCkge1xuICAgICAgY29uc3QgdGFyZ2V0Q2VsbHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7XG4gICAgICAgICAgdGFyZ2V0Q2VsbHMucHVzaChzdGFydEluZGV4ICsgaSArIGogKiBjb2xzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0SW5kZXggJSBjb2xzICsgd2lkdGggPD0gY29scyAmJiB0YXJnZXRDZWxscy5ldmVyeShjZWxsID0+IGNlbGxNYXBbY2VsbF0gPT0gbnVsbCkpIHtcbiAgICAgICAgdGFyZ2V0Q2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgICBjZWxsTWFwW2NlbGxdID0gaW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgICBpdGVtUGxhY2VkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0SW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vIGNvbnZlcnQgaW50byBhIG5vbi1zcGFyc2UgYXJyYXlcbiAgcmV0dXJuIFsuLi5jZWxsTWFwXTtcbn1cblxuLyoqIEdldHMgY2VsbCBpbmRleCBvZiBhbiBpdGVtJ3MgY29ybmVyIG9yIC0xIHdoZW4gaW5kZXggaXMgLTEuICovXG5mdW5jdGlvbiBnZXRDZWxsSW5kZXhPZkNvcm5lcihpbmRleCwgc2l6ZXMsIGNlbGxNYXAsIGNvbHMsIGNvcm5lcikge1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gLTE7XG4gIGNvbnN0IGZpcnN0Q2VsbEluZGV4ID0gY2VsbE1hcC5pbmRleE9mKGluZGV4KTtcbiAgY29uc3Qgc2l6ZUl0ZW0gPSBzaXplc1tpbmRleF07XG4gIHN3aXRjaCAoY29ybmVyKSB7XG4gICAgY2FzZSAndGwnOlxuICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4O1xuICAgIGNhc2UgJ3RyJzpcbiAgICAgIGlmICghc2l6ZUl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4ICsgc2l6ZUl0ZW0ud2lkdGggLSAxO1xuICAgIGNhc2UgJ2JsJzpcbiAgICAgIGlmICghc2l6ZUl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4ICsgKHNpemVJdGVtLmhlaWdodCAtIDEpICogY29scztcbiAgICBjYXNlICdicic6XG4gICAgICByZXR1cm4gY2VsbE1hcC5sYXN0SW5kZXhPZihpbmRleCk7XG4gIH1cbn1cblxuLyoqIEdldHMgYWxsIGNlbGwgaW5kaWNlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNwZWNpZmllZCBpbmRpY2VzICovXG5mdW5jdGlvbiBnZXRDZWxsSW5kaWNlcyhpbmRpY2VzLCBjZWxsTWFwKSB7XG4gIHJldHVybiBjZWxsTWFwLmZsYXRNYXAoKGluZGV4LCBjZWxsSW5kZXgpID0+IGluZGljZXMuaW5jbHVkZXMoaW5kZXgpID8gW2NlbGxJbmRleF0gOiBbXSk7XG59XG5mdW5jdGlvbiBpc0Rpc2FibGVkKGxpc3QsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpIHtcbiAgaWYgKGRpc2FibGVkSW5kaWNlcykge1xuICAgIHJldHVybiBkaXNhYmxlZEluZGljZXMuaW5jbHVkZXMoaW5kZXgpO1xuICB9XG4gIGNvbnN0IGVsZW1lbnQgPSBsaXN0W2luZGV4XTtcbiAgcmV0dXJuIGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcpID09PSAndHJ1ZSc7XG59XG5cbmxldCByYWZJZCA9IDA7XG5mdW5jdGlvbiBlbnF1ZXVlRm9jdXMoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgcHJldmVudFNjcm9sbCA9IGZhbHNlLFxuICAgIGNhbmNlbFByZXZpb3VzID0gdHJ1ZSxcbiAgICBzeW5jID0gZmFsc2VcbiAgfSA9IG9wdGlvbnM7XG4gIGNhbmNlbFByZXZpb3VzICYmIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcbiAgY29uc3QgZXhlYyA9ICgpID0+IGVsID09IG51bGwgPyB2b2lkIDAgOiBlbC5mb2N1cyh7XG4gICAgcHJldmVudFNjcm9sbFxuICB9KTtcbiAgaWYgKHN5bmMpIHtcbiAgICBleGVjKCk7XG4gIH0gZWxzZSB7XG4gICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZXhlYyk7XG4gIH1cbn1cblxudmFyIGluZGV4ID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDtcblxuZnVuY3Rpb24gc29ydEJ5RG9jdW1lbnRQb3NpdGlvbihhLCBiKSB7XG4gIGNvbnN0IHBvc2l0aW9uID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKTtcbiAgaWYgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcgfHwgcG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAocG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyB8fCBwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTlMpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGFyZU1hcHNFcXVhbChtYXAxLCBtYXAyKSB7XG4gIGlmIChtYXAxLnNpemUgIT09IG1hcDIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBtYXAxLmVudHJpZXMoKSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbWFwMi5nZXQoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IEZsb2F0aW5nTGlzdENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIHJlZ2lzdGVyOiAoKSA9PiB7fSxcbiAgdW5yZWdpc3RlcjogKCkgPT4ge30sXG4gIG1hcDogLyojX19QVVJFX18qL25ldyBNYXAoKSxcbiAgZWxlbWVudHNSZWY6IHtcbiAgICBjdXJyZW50OiBbXVxuICB9XG59KTtcbi8qKlxuICogUHJvdmlkZXMgY29udGV4dCBmb3IgYSBsaXN0IG9mIGl0ZW1zIHdpdGhpbiB0aGUgZmxvYXRpbmcgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ0xpc3RcbiAqL1xuZnVuY3Rpb24gRmxvYXRpbmdMaXN0KHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBlbGVtZW50c1JlZixcbiAgICBsYWJlbHNSZWZcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbbWFwLCBzZXRNYXBdID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gbmV3IE1hcCgpKTtcbiAgY29uc3QgcmVnaXN0ZXIgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBzZXRNYXAocHJldk1hcCA9PiBuZXcgTWFwKHByZXZNYXApLnNldChub2RlLCBudWxsKSk7XG4gIH0sIFtdKTtcbiAgY29uc3QgdW5yZWdpc3RlciA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIHNldE1hcChwcmV2TWFwID0+IHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAocHJldk1hcCk7XG4gICAgICBtYXAuZGVsZXRlKG5vZGUpO1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9KTtcbiAgfSwgW10pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShuZXdNYXAua2V5cygpKS5zb3J0KHNvcnRCeURvY3VtZW50UG9zaXRpb24pO1xuICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBuZXdNYXAuc2V0KG5vZGUsIGluZGV4KTtcbiAgICB9KTtcbiAgICBpZiAoIWFyZU1hcHNFcXVhbChtYXAsIG5ld01hcCkpIHtcbiAgICAgIHNldE1hcChuZXdNYXApO1xuICAgIH1cbiAgfSwgW21hcF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmxvYXRpbmdMaXN0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgICByZWdpc3RlcixcbiAgICAgIHVucmVnaXN0ZXIsXG4gICAgICBtYXAsXG4gICAgICBlbGVtZW50c1JlZixcbiAgICAgIGxhYmVsc1JlZlxuICAgIH0pLCBbcmVnaXN0ZXIsIHVucmVnaXN0ZXIsIG1hcCwgZWxlbWVudHNSZWYsIGxhYmVsc1JlZl0pXG4gIH0sIGNoaWxkcmVuKTtcbn1cbi8qKlxuICogVXNlZCB0byByZWdpc3RlciBhIGxpc3QgaXRlbSBhbmQgaXRzIGluZGV4IChET00gcG9zaXRpb24pIGluIHRoZVxuICogYEZsb2F0aW5nTGlzdGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdMaXN0I3VzZWxpc3RpdGVtXG4gKi9cbmZ1bmN0aW9uIHVzZUxpc3RJdGVtKHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgbGFiZWxcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgcmVnaXN0ZXIsXG4gICAgdW5yZWdpc3RlcixcbiAgICBtYXAsXG4gICAgZWxlbWVudHNSZWYsXG4gICAgbGFiZWxzUmVmXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KEZsb2F0aW5nTGlzdENvbnRleHQpO1xuICBjb25zdCBbaW5kZXgkMSwgc2V0SW5kZXhdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IGNvbXBvbmVudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgcmVmID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgY29tcG9uZW50UmVmLmN1cnJlbnQgPSBub2RlO1xuICAgIGlmIChpbmRleCQxICE9PSBudWxsKSB7XG4gICAgICBlbGVtZW50c1JlZi5jdXJyZW50W2luZGV4JDFdID0gbm9kZTtcbiAgICAgIGlmIChsYWJlbHNSZWYpIHtcbiAgICAgICAgdmFyIF9ub2RlJHRleHRDb250ZW50O1xuICAgICAgICBjb25zdCBpc0xhYmVsRGVmaW5lZCA9IGxhYmVsICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGxhYmVsc1JlZi5jdXJyZW50W2luZGV4JDFdID0gaXNMYWJlbERlZmluZWQgPyBsYWJlbCA6IChfbm9kZSR0ZXh0Q29udGVudCA9IG5vZGUgPT0gbnVsbCA/IHZvaWQgMCA6IG5vZGUudGV4dENvbnRlbnQpICE9IG51bGwgPyBfbm9kZSR0ZXh0Q29udGVudCA6IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LCBbaW5kZXgkMSwgZWxlbWVudHNSZWYsIGxhYmVsc1JlZiwgbGFiZWxdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBjb21wb25lbnRSZWYuY3VycmVudDtcbiAgICBpZiAobm9kZSkge1xuICAgICAgcmVnaXN0ZXIobm9kZSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB1bnJlZ2lzdGVyKG5vZGUpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtyZWdpc3RlciwgdW5yZWdpc3Rlcl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSBjb21wb25lbnRSZWYuY3VycmVudCA/IG1hcC5nZXQoY29tcG9uZW50UmVmLmN1cnJlbnQpIDogbnVsbDtcbiAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgc2V0SW5kZXgoaW5kZXgpO1xuICAgIH1cbiAgfSwgW21hcF0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJlZixcbiAgICBpbmRleDogaW5kZXgkMSA9PSBudWxsID8gLTEgOiBpbmRleCQxXG4gIH0pLCBbaW5kZXgkMSwgcmVmXSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckpzeChyZW5kZXIsIGNvbXB1dGVkUHJvcHMpIHtcbiAgaWYgKHR5cGVvZiByZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gcmVuZGVyKGNvbXB1dGVkUHJvcHMpO1xuICB9XG4gIGlmIChyZW5kZXIpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChyZW5kZXIsIGNvbXB1dGVkUHJvcHMpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBjb21wdXRlZFByb3BzKTtcbn1cbmNvbnN0IENvbXBvc2l0ZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGFjdGl2ZUluZGV4OiAwLFxuICBvbk5hdmlnYXRlOiAoKSA9PiB7fVxufSk7XG5jb25zdCBob3Jpem9udGFsS2V5cyA9IFtBUlJPV19MRUZULCBBUlJPV19SSUdIVF07XG5jb25zdCB2ZXJ0aWNhbEtleXMgPSBbQVJST1dfVVAsIEFSUk9XX0RPV05dO1xuY29uc3QgYWxsS2V5cyA9IFsuLi5ob3Jpem9udGFsS2V5cywgLi4udmVydGljYWxLZXlzXTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIHRhYiBzdG9wIHdob3NlIGl0ZW1zIGFyZSBuYXZpZ2F0ZWQgYnkgYXJyb3cga2V5cywgd2hpY2hcbiAqIHByb3ZpZGVzIGxpc3QgbmF2aWdhdGlvbiBvdXRzaWRlIG9mIGZsb2F0aW5nIGVsZW1lbnQgY29udGV4dHMuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgdG8gZW5hYmxlIG5hdmlnYXRpb24gb2YgYSBsaXN0IG9mIGl0ZW1zIHRoYXQgYXJlbuKAmXQgcGFydCBvZiBhXG4gKiBmbG9hdGluZyBlbGVtZW50LiBBIG1lbnViYXIgaXMgYW4gZXhhbXBsZSBvZiBhIGNvbXBvc2l0ZSwgd2l0aCBlYWNoIHJlZmVyZW5jZVxuICogZWxlbWVudCBiZWluZyBhbiBpdGVtLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0NvbXBvc2l0ZVxuICovXG5jb25zdCBDb21wb3NpdGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBDb21wb3NpdGUocHJvcHMsIGZvcndhcmRlZFJlZikge1xuICBjb25zdCB7XG4gICAgcmVuZGVyLFxuICAgIG9yaWVudGF0aW9uID0gJ2JvdGgnLFxuICAgIGxvb3AgPSB0cnVlLFxuICAgIGNvbHMgPSAxLFxuICAgIGRpc2FibGVkSW5kaWNlcyxcbiAgICBhY3RpdmVJbmRleDogZXh0ZXJuYWxBY3RpdmVJbmRleCxcbiAgICBvbk5hdmlnYXRlOiBleHRlcm5hbFNldEFjdGl2ZUluZGV4LFxuICAgIGl0ZW1TaXplcyxcbiAgICBkZW5zZSA9IGZhbHNlLFxuICAgIC4uLmRvbVByb3BzXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgW2ludGVybmFsQWN0aXZlSW5kZXgsIGludGVybmFsU2V0QWN0aXZlSW5kZXhdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gIGNvbnN0IGFjdGl2ZUluZGV4ID0gZXh0ZXJuYWxBY3RpdmVJbmRleCAhPSBudWxsID8gZXh0ZXJuYWxBY3RpdmVJbmRleCA6IGludGVybmFsQWN0aXZlSW5kZXg7XG4gIGNvbnN0IG9uTmF2aWdhdGUgPSB1c2VFZmZlY3RFdmVudChleHRlcm5hbFNldEFjdGl2ZUluZGV4ICE9IG51bGwgPyBleHRlcm5hbFNldEFjdGl2ZUluZGV4IDogaW50ZXJuYWxTZXRBY3RpdmVJbmRleCk7XG4gIGNvbnN0IGVsZW1lbnRzUmVmID0gUmVhY3QudXNlUmVmKFtdKTtcbiAgY29uc3QgcmVuZGVyRWxlbWVudFByb3BzID0gcmVuZGVyICYmIHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicgPyByZW5kZXIucHJvcHMgOiB7fTtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGFjdGl2ZUluZGV4LFxuICAgIG9uTmF2aWdhdGVcbiAgfSksIFthY3RpdmVJbmRleCwgb25OYXZpZ2F0ZV0pO1xuICBjb25zdCBpc0dyaWQgPSBjb2xzID4gMTtcbiAgZnVuY3Rpb24gaGFuZGxlS2V5RG93bihldmVudCkge1xuICAgIGlmICghYWxsS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm47XG4gICAgbGV0IG5leHRJbmRleCA9IGFjdGl2ZUluZGV4O1xuICAgIGNvbnN0IG1pbkluZGV4ID0gZ2V0TWluSW5kZXgoZWxlbWVudHNSZWYsIGRpc2FibGVkSW5kaWNlcyk7XG4gICAgY29uc3QgbWF4SW5kZXggPSBnZXRNYXhJbmRleChlbGVtZW50c1JlZiwgZGlzYWJsZWRJbmRpY2VzKTtcbiAgICBpZiAoaXNHcmlkKSB7XG4gICAgICBjb25zdCBzaXplcyA9IGl0ZW1TaXplcyB8fCBBcnJheS5mcm9tKHtcbiAgICAgICAgbGVuZ3RoOiBlbGVtZW50c1JlZi5jdXJyZW50Lmxlbmd0aFxuICAgICAgfSwgKCkgPT4gKHtcbiAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgIGhlaWdodDogMVxuICAgICAgfSkpO1xuICAgICAgLy8gVG8gY2FsY3VsYXRlIG1vdmVtZW50cyBvbiB0aGUgZ3JpZCwgd2UgdXNlIGh5cG90aGV0aWNhbCBjZWxsIGluZGljZXNcbiAgICAgIC8vIGFzIGlmIGV2ZXJ5IGl0ZW0gd2FzIDF4MSwgdGhlbiBjb252ZXJ0IGJhY2sgdG8gcmVhbCBpbmRpY2VzLlxuICAgICAgY29uc3QgY2VsbE1hcCA9IGJ1aWxkQ2VsbE1hcChzaXplcywgY29scywgZGVuc2UpO1xuICAgICAgY29uc3QgbWluR3JpZEluZGV4ID0gY2VsbE1hcC5maW5kSW5kZXgoaW5kZXggPT4gaW5kZXggIT0gbnVsbCAmJiAhaXNEaXNhYmxlZChlbGVtZW50c1JlZi5jdXJyZW50LCBpbmRleCwgZGlzYWJsZWRJbmRpY2VzKSk7XG4gICAgICAvLyBsYXN0IGVuYWJsZWQgaW5kZXhcbiAgICAgIGNvbnN0IG1heEdyaWRJbmRleCA9IGNlbGxNYXAucmVkdWNlKChmb3VuZEluZGV4LCBpbmRleCwgY2VsbEluZGV4KSA9PiBpbmRleCAhPSBudWxsICYmICFpc0Rpc2FibGVkKGVsZW1lbnRzUmVmLmN1cnJlbnQsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpID8gY2VsbEluZGV4IDogZm91bmRJbmRleCwgLTEpO1xuICAgICAgbmV4dEluZGV4ID0gY2VsbE1hcFtnZXRHcmlkTmF2aWdhdGVkSW5kZXgoe1xuICAgICAgICBjdXJyZW50OiBjZWxsTWFwLm1hcChpdGVtSW5kZXggPT4gaXRlbUluZGV4ID8gZWxlbWVudHNSZWYuY3VycmVudFtpdGVtSW5kZXhdIDogbnVsbClcbiAgICAgIH0sIHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgICBsb29wLFxuICAgICAgICBjb2xzLFxuICAgICAgICAvLyB0cmVhdCB1bmRlZmluZWQgKGVtcHR5IGdyaWQgc3BhY2VzKSBhcyBkaXNhYmxlZCBpbmRpY2VzIHNvIHdlXG4gICAgICAgIC8vIGRvbid0IGVuZCB1cCBpbiB0aGVtXG4gICAgICAgIGRpc2FibGVkSW5kaWNlczogZ2V0Q2VsbEluZGljZXMoWy4uLihkaXNhYmxlZEluZGljZXMgfHwgZWxlbWVudHNSZWYuY3VycmVudC5tYXAoKF8sIGluZGV4KSA9PiBpc0Rpc2FibGVkKGVsZW1lbnRzUmVmLmN1cnJlbnQsIGluZGV4KSA/IGluZGV4IDogdW5kZWZpbmVkKSksIHVuZGVmaW5lZF0sIGNlbGxNYXApLFxuICAgICAgICBtaW5JbmRleDogbWluR3JpZEluZGV4LFxuICAgICAgICBtYXhJbmRleDogbWF4R3JpZEluZGV4LFxuICAgICAgICBwcmV2SW5kZXg6IGdldENlbGxJbmRleE9mQ29ybmVyKGFjdGl2ZUluZGV4ID4gbWF4SW5kZXggPyBtaW5JbmRleCA6IGFjdGl2ZUluZGV4LCBzaXplcywgY2VsbE1hcCwgY29scyxcbiAgICAgICAgLy8gdXNlIGEgY29ybmVyIG1hdGNoaW5nIHRoZSBlZGdlIGNsb3Nlc3QgdG8gdGhlIGRpcmVjdGlvbiB3ZSdyZVxuICAgICAgICAvLyBtb3ZpbmcgaW4gc28gd2UgZG9uJ3QgZW5kIHVwIGluIHRoZSBzYW1lIGl0ZW0uIFByZWZlclxuICAgICAgICAvLyB0b3AvbGVmdCBvdmVyIGJvdHRvbS9yaWdodC5cbiAgICAgICAgZXZlbnQua2V5ID09PSBBUlJPV19ET1dOID8gJ2JsJyA6IGV2ZW50LmtleSA9PT0gQVJST1dfUklHSFQgPyAndHInIDogJ3RsJylcbiAgICAgIH0pXTsgLy8gbmF2aWdhdGVkIGNlbGwgd2lsbCBuZXZlciBiZSBudWxsaXNoXG4gICAgfVxuICAgIGNvbnN0IHRvRW5kS2V5cyA9IHtcbiAgICAgIGhvcml6b250YWw6IFtBUlJPV19SSUdIVF0sXG4gICAgICB2ZXJ0aWNhbDogW0FSUk9XX0RPV05dLFxuICAgICAgYm90aDogW0FSUk9XX1JJR0hULCBBUlJPV19ET1dOXVxuICAgIH1bb3JpZW50YXRpb25dO1xuICAgIGNvbnN0IHRvU3RhcnRLZXlzID0ge1xuICAgICAgaG9yaXpvbnRhbDogW0FSUk9XX0xFRlRdLFxuICAgICAgdmVydGljYWw6IFtBUlJPV19VUF0sXG4gICAgICBib3RoOiBbQVJST1dfTEVGVCwgQVJST1dfVVBdXG4gICAgfVtvcmllbnRhdGlvbl07XG4gICAgY29uc3QgcHJldmVudGVkS2V5cyA9IGlzR3JpZCA/IGFsbEtleXMgOiB7XG4gICAgICBob3Jpem9udGFsOiBob3Jpem9udGFsS2V5cyxcbiAgICAgIHZlcnRpY2FsOiB2ZXJ0aWNhbEtleXMsXG4gICAgICBib3RoOiBhbGxLZXlzXG4gICAgfVtvcmllbnRhdGlvbl07XG4gICAgaWYgKG5leHRJbmRleCA9PT0gYWN0aXZlSW5kZXggJiYgWy4uLnRvRW5kS2V5cywgLi4udG9TdGFydEtleXNdLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgIGlmIChsb29wICYmIG5leHRJbmRleCA9PT0gbWF4SW5kZXggJiYgdG9FbmRLZXlzLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gbWluSW5kZXg7XG4gICAgICB9IGVsc2UgaWYgKGxvb3AgJiYgbmV4dEluZGV4ID09PSBtaW5JbmRleCAmJiB0b1N0YXJ0S2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgIG5leHRJbmRleCA9IG1heEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICBzdGFydGluZ0luZGV4OiBuZXh0SW5kZXgsXG4gICAgICAgICAgZGVjcmVtZW50OiB0b1N0YXJ0S2V5cy5pbmNsdWRlcyhldmVudC5rZXkpLFxuICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5leHRJbmRleCAhPT0gYWN0aXZlSW5kZXggJiYgIWlzSW5kZXhPdXRPZkJvdW5kcyhlbGVtZW50c1JlZiwgbmV4dEluZGV4KSkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAocHJldmVudGVkS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICBvbk5hdmlnYXRlKG5leHRJbmRleCk7XG5cbiAgICAgIC8vIFdhaXQgZm9yIEZvY3VzTWFuYWdlciBgcmV0dXJuRm9jdXNgIHRvIGV4ZWN1dGUuXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGVucXVldWVGb2N1cyhlbGVtZW50c1JlZi5jdXJyZW50W25leHRJbmRleF0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvbXB1dGVkUHJvcHMgPSB7XG4gICAgLi4uZG9tUHJvcHMsXG4gICAgLi4ucmVuZGVyRWxlbWVudFByb3BzLFxuICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICdhcmlhLW9yaWVudGF0aW9uJzogb3JpZW50YXRpb24gPT09ICdib3RoJyA/IHVuZGVmaW5lZCA6IG9yaWVudGF0aW9uLFxuICAgIG9uS2V5RG93bihlKSB7XG4gICAgICBkb21Qcm9wcy5vbktleURvd24gPT0gbnVsbCB8fCBkb21Qcm9wcy5vbktleURvd24oZSk7XG4gICAgICByZW5kZXJFbGVtZW50UHJvcHMub25LZXlEb3duID09IG51bGwgfHwgcmVuZGVyRWxlbWVudFByb3BzLm9uS2V5RG93bihlKTtcbiAgICAgIGhhbmRsZUtleURvd24oZSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9zaXRlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmxvYXRpbmdMaXN0LCB7XG4gICAgZWxlbWVudHNSZWY6IGVsZW1lbnRzUmVmXG4gIH0sIHJlbmRlckpzeChyZW5kZXIsIGNvbXB1dGVkUHJvcHMpKSk7XG59KTtcbi8qKlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0NvbXBvc2l0ZVxuICovXG5jb25zdCBDb21wb3NpdGVJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ29tcG9zaXRlSXRlbShwcm9wcywgZm9yd2FyZGVkUmVmKSB7XG4gIGNvbnN0IHtcbiAgICByZW5kZXIsXG4gICAgLi4uZG9tUHJvcHNcbiAgfSA9IHByb3BzO1xuICBjb25zdCByZW5kZXJFbGVtZW50UHJvcHMgPSByZW5kZXIgJiYgdHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJyA/IHJlbmRlci5wcm9wcyA6IHt9O1xuICBjb25zdCB7XG4gICAgYWN0aXZlSW5kZXgsXG4gICAgb25OYXZpZ2F0ZVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb21wb3NpdGVDb250ZXh0KTtcbiAgY29uc3Qge1xuICAgIHJlZixcbiAgICBpbmRleFxuICB9ID0gdXNlTGlzdEl0ZW0oKTtcbiAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VSZWZzKFtyZWYsIGZvcndhcmRlZFJlZiwgcmVuZGVyRWxlbWVudFByb3BzLnJlZl0pO1xuICBjb25zdCBpc0FjdGl2ZSA9IGFjdGl2ZUluZGV4ID09PSBpbmRleDtcbiAgY29uc3QgY29tcHV0ZWRQcm9wcyA9IHtcbiAgICAuLi5kb21Qcm9wcyxcbiAgICAuLi5yZW5kZXJFbGVtZW50UHJvcHMsXG4gICAgcmVmOiBtZXJnZWRSZWYsXG4gICAgdGFiSW5kZXg6IGlzQWN0aXZlID8gMCA6IC0xLFxuICAgICdkYXRhLWFjdGl2ZSc6IGlzQWN0aXZlID8gJycgOiB1bmRlZmluZWQsXG4gICAgb25Gb2N1cyhlKSB7XG4gICAgICBkb21Qcm9wcy5vbkZvY3VzID09IG51bGwgfHwgZG9tUHJvcHMub25Gb2N1cyhlKTtcbiAgICAgIHJlbmRlckVsZW1lbnRQcm9wcy5vbkZvY3VzID09IG51bGwgfHwgcmVuZGVyRWxlbWVudFByb3BzLm9uRm9jdXMoZSk7XG4gICAgICBvbk5hdmlnYXRlKGluZGV4KTtcbiAgICB9XG4gIH07XG4gIHJldHVybiByZW5kZXJKc3gocmVuZGVyLCBjb21wdXRlZFByb3BzKTtcbn0pO1xuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxubGV0IHNlcnZlckhhbmRvZmZDb21wbGV0ZSA9IGZhbHNlO1xubGV0IGNvdW50ID0gMDtcbmNvbnN0IGdlbklkID0gKCkgPT4gLy8gRW5zdXJlIHRoZSBpZCBpcyB1bmlxdWUgd2l0aCBtdWx0aXBsZSBpbmRlcGVuZGVudCB2ZXJzaW9ucyBvZiBGbG9hdGluZyBVSVxuLy8gb24gPFJlYWN0IDE4XG5cImZsb2F0aW5nLXVpLVwiICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNikgKyBjb3VudCsrO1xuZnVuY3Rpb24gdXNlRmxvYXRpbmdJZCgpIHtcbiAgY29uc3QgW2lkLCBzZXRJZF0gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBzZXJ2ZXJIYW5kb2ZmQ29tcGxldGUgPyBnZW5JZCgpIDogdW5kZWZpbmVkKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChpZCA9PSBudWxsKSB7XG4gICAgICBzZXRJZChnZW5JZCgpKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2VydmVySGFuZG9mZkNvbXBsZXRlID0gdHJ1ZTtcbiAgfSwgW10pO1xuICByZXR1cm4gaWQ7XG59XG5jb25zdCB1c2VSZWFjdElkID0gU2FmZVJlYWN0LnVzZUlkO1xuXG4vKipcbiAqIFVzZXMgUmVhY3QgMTgncyBidWlsdC1pbiBgdXNlSWQoKWAgd2hlbiBhdmFpbGFibGUsIG9yIGZhbGxzIGJhY2sgdG8gYVxuICogc2xpZ2h0bHkgbGVzcyBwZXJmb3JtYW50IChyZXF1aXJpbmcgYSBkb3VibGUgcmVuZGVyKSBpbXBsZW1lbnRhdGlvbiBmb3JcbiAqIGVhcmxpZXIgUmVhY3QgdmVyc2lvbnMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvcmVhY3QtdXRpbHMjdXNlaWRcbiAqL1xuY29uc3QgdXNlSWQgPSB1c2VSZWFjdElkIHx8IHVzZUZsb2F0aW5nSWQ7XG5cbmxldCBkZXZNZXNzYWdlU2V0O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBkZXZNZXNzYWdlU2V0ID0gLyojX19QVVJFX18qL25ldyBTZXQoKTtcbn1cbmZ1bmN0aW9uIHdhcm4oKSB7XG4gIHZhciBfZGV2TWVzc2FnZVNldDtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2VzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIG1lc3NhZ2VzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIGNvbnN0IG1lc3NhZ2UgPSBcIkZsb2F0aW5nIFVJOiBcIiArIG1lc3NhZ2VzLmpvaW4oJyAnKTtcbiAgaWYgKCEoKF9kZXZNZXNzYWdlU2V0ID0gZGV2TWVzc2FnZVNldCkgIT0gbnVsbCAmJiBfZGV2TWVzc2FnZVNldC5oYXMobWVzc2FnZSkpKSB7XG4gICAgdmFyIF9kZXZNZXNzYWdlU2V0MjtcbiAgICAoX2Rldk1lc3NhZ2VTZXQyID0gZGV2TWVzc2FnZVNldCkgPT0gbnVsbCB8fCBfZGV2TWVzc2FnZVNldDIuYWRkKG1lc3NhZ2UpO1xuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoKSB7XG4gIHZhciBfZGV2TWVzc2FnZVNldDM7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgbWVzc2FnZXMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBtZXNzYWdlc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG4gIGNvbnN0IG1lc3NhZ2UgPSBcIkZsb2F0aW5nIFVJOiBcIiArIG1lc3NhZ2VzLmpvaW4oJyAnKTtcbiAgaWYgKCEoKF9kZXZNZXNzYWdlU2V0MyA9IGRldk1lc3NhZ2VTZXQpICE9IG51bGwgJiYgX2Rldk1lc3NhZ2VTZXQzLmhhcyhtZXNzYWdlKSkpIHtcbiAgICB2YXIgX2Rldk1lc3NhZ2VTZXQ0O1xuICAgIChfZGV2TWVzc2FnZVNldDQgPSBkZXZNZXNzYWdlU2V0KSA9PSBudWxsIHx8IF9kZXZNZXNzYWdlU2V0NC5hZGQobWVzc2FnZSk7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBwb2ludGluZyBhcnJvdyB0cmlhbmdsZS5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ0Fycm93XG4gKi9cbmNvbnN0IEZsb2F0aW5nQXJyb3cgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGbG9hdGluZ0Fycm93KHByb3BzLCByZWYpIHtcbiAgY29uc3Qge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIGZsb2F0aW5nXG4gICAgICB9LFxuICAgICAgbWlkZGxld2FyZURhdGE6IHtcbiAgICAgICAgYXJyb3dcbiAgICAgIH1cbiAgICB9LFxuICAgIHdpZHRoID0gMTQsXG4gICAgaGVpZ2h0ID0gNyxcbiAgICB0aXBSYWRpdXMgPSAwLFxuICAgIHN0cm9rZVdpZHRoID0gMCxcbiAgICBzdGF0aWNPZmZzZXQsXG4gICAgc3Ryb2tlLFxuICAgIGQsXG4gICAgc3R5bGU6IHtcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIC4uLnJlc3RTdHlsZVxuICAgIH0gPSB7fSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICghcmVmKSB7XG4gICAgICB3YXJuKCdUaGUgYHJlZmAgcHJvcCBpcyByZXF1aXJlZCBmb3IgYEZsb2F0aW5nQXJyb3dgLicpO1xuICAgIH1cbiAgfVxuICBjb25zdCBjbGlwUGF0aElkID0gdXNlSWQoKTtcbiAgY29uc3QgW2lzUlRMLCBzZXRJc1JUTF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yOTMyXG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWZsb2F0aW5nKSByZXR1cm47XG4gICAgY29uc3QgaXNSVEwgPSBnZXRDb21wdXRlZFN0eWxlKGZsb2F0aW5nKS5kaXJlY3Rpb24gPT09ICdydGwnO1xuICAgIGlmIChpc1JUTCkge1xuICAgICAgc2V0SXNSVEwodHJ1ZSk7XG4gICAgfVxuICB9LCBbZmxvYXRpbmddKTtcbiAgaWYgKCFmbG9hdGluZykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gU3Ryb2tlcyBtdXN0IGJlIGRvdWJsZSB0aGUgYm9yZGVyIHdpZHRoLCB0aGlzIGVuc3VyZXMgdGhlIHN0cm9rZSdzIHdpZHRoXG4gIC8vIHdvcmtzIGFzIHlvdSdkIGV4cGVjdC5cbiAgY29uc3QgY29tcHV0ZWRTdHJva2VXaWR0aCA9IHN0cm9rZVdpZHRoICogMjtcbiAgY29uc3QgaGFsZlN0cm9rZVdpZHRoID0gY29tcHV0ZWRTdHJva2VXaWR0aCAvIDI7XG4gIGNvbnN0IHN2Z1ggPSB3aWR0aCAvIDIgKiAodGlwUmFkaXVzIC8gLTggKyAxKTtcbiAgY29uc3Qgc3ZnWSA9IGhlaWdodCAvIDIgKiB0aXBSYWRpdXMgLyA0O1xuICBjb25zdCBbc2lkZSwgYWxpZ25tZW50XSA9IHBsYWNlbWVudC5zcGxpdCgnLScpO1xuICBjb25zdCBpc0N1c3RvbVNoYXBlID0gISFkO1xuICBjb25zdCBpc1ZlcnRpY2FsU2lkZSA9IHNpZGUgPT09ICd0b3AnIHx8IHNpZGUgPT09ICdib3R0b20nO1xuICBjb25zdCB5T2Zmc2V0UHJvcCA9IHN0YXRpY09mZnNldCAmJiBhbGlnbm1lbnQgPT09ICdlbmQnID8gJ2JvdHRvbScgOiAndG9wJztcbiAgbGV0IHhPZmZzZXRQcm9wID0gc3RhdGljT2Zmc2V0ICYmIGFsaWdubWVudCA9PT0gJ2VuZCcgPyAncmlnaHQnIDogJ2xlZnQnO1xuICBpZiAoc3RhdGljT2Zmc2V0ICYmIGlzUlRMKSB7XG4gICAgeE9mZnNldFByb3AgPSBhbGlnbm1lbnQgPT09ICdlbmQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgfVxuICBjb25zdCBhcnJvd1ggPSAoYXJyb3cgPT0gbnVsbCA/IHZvaWQgMCA6IGFycm93LngpICE9IG51bGwgPyBzdGF0aWNPZmZzZXQgfHwgYXJyb3cueCA6ICcnO1xuICBjb25zdCBhcnJvd1kgPSAoYXJyb3cgPT0gbnVsbCA/IHZvaWQgMCA6IGFycm93LnkpICE9IG51bGwgPyBzdGF0aWNPZmZzZXQgfHwgYXJyb3cueSA6ICcnO1xuICBjb25zdCBkVmFsdWUgPSBkIHx8ICdNMCwwJyArIChcIiBIXCIgKyB3aWR0aCkgKyAoXCIgTFwiICsgKHdpZHRoIC0gc3ZnWCkgKyBcIixcIiArIChoZWlnaHQgLSBzdmdZKSkgKyAoXCIgUVwiICsgd2lkdGggLyAyICsgXCIsXCIgKyBoZWlnaHQgKyBcIiBcIiArIHN2Z1ggKyBcIixcIiArIChoZWlnaHQgLSBzdmdZKSkgKyAnIFonO1xuICBjb25zdCByb3RhdGlvbiA9IHtcbiAgICB0b3A6IGlzQ3VzdG9tU2hhcGUgPyAncm90YXRlKDE4MGRlZyknIDogJycsXG4gICAgbGVmdDogaXNDdXN0b21TaGFwZSA/ICdyb3RhdGUoOTBkZWcpJyA6ICdyb3RhdGUoLTkwZGVnKScsXG4gICAgYm90dG9tOiBpc0N1c3RvbVNoYXBlID8gJycgOiAncm90YXRlKDE4MGRlZyknLFxuICAgIHJpZ2h0OiBpc0N1c3RvbVNoYXBlID8gJ3JvdGF0ZSgtOTBkZWcpJyA6ICdyb3RhdGUoOTBkZWcpJ1xuICB9W3NpZGVdO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWUsXG4gICAgcmVmOiByZWYsXG4gICAgd2lkdGg6IGlzQ3VzdG9tU2hhcGUgPyB3aWR0aCA6IHdpZHRoICsgY29tcHV0ZWRTdHJva2VXaWR0aCxcbiAgICBoZWlnaHQ6IHdpZHRoLFxuICAgIHZpZXdCb3g6IFwiMCAwIFwiICsgd2lkdGggKyBcIiBcIiArIChoZWlnaHQgPiB3aWR0aCA/IGhlaWdodCA6IHdpZHRoKSxcbiAgICBzdHlsZToge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICBbeE9mZnNldFByb3BdOiBhcnJvd1gsXG4gICAgICBbeU9mZnNldFByb3BdOiBhcnJvd1ksXG4gICAgICBbc2lkZV06IGlzVmVydGljYWxTaWRlIHx8IGlzQ3VzdG9tU2hhcGUgPyAnMTAwJScgOiBcImNhbGMoMTAwJSAtIFwiICsgY29tcHV0ZWRTdHJva2VXaWR0aCAvIDIgKyBcInB4KVwiLFxuICAgICAgdHJhbnNmb3JtOiBcIlwiICsgcm90YXRpb24gKyAodHJhbnNmb3JtICE9IG51bGwgPyB0cmFuc2Zvcm0gOiAnJyksXG4gICAgICAuLi5yZXN0U3R5bGVcbiAgICB9XG4gIH0pLCBjb21wdXRlZFN0cm9rZVdpZHRoID4gMCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsaXBQYXRoOiBcInVybCgjXCIgKyBjbGlwUGF0aElkICsgXCIpXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgc3Ryb2tlOiBzdHJva2VcbiAgICAvLyBBY2NvdW50IGZvciB0aGUgc3Ryb2tlIG9uIHRoZSBmaWxsIHBhdGggcmVuZGVyZWQgYmVsb3cuXG4gICAgLFxuICAgIHN0cm9rZVdpZHRoOiBjb21wdXRlZFN0cm9rZVdpZHRoICsgKGQgPyAwIDogMSksXG4gICAgZDogZFZhbHVlXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIHN0cm9rZTogY29tcHV0ZWRTdHJva2VXaWR0aCAmJiAhZCA/IHJlc3QuZmlsbCA6ICdub25lJyxcbiAgICBkOiBkVmFsdWVcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2xpcFBhdGhcIiwge1xuICAgIGlkOiBjbGlwUGF0aElkXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogLWhhbGZTdHJva2VXaWR0aCxcbiAgICB5OiBoYWxmU3Ryb2tlV2lkdGggKiAoaXNDdXN0b21TaGFwZSA/IC0xIDogMSksXG4gICAgd2lkdGg6IHdpZHRoICsgY29tcHV0ZWRTdHJva2VXaWR0aCxcbiAgICBoZWlnaHQ6IHdpZHRoXG4gIH0pKSk7XG59KTtcblxuZnVuY3Rpb24gY3JlYXRlUHViU3ViKCkge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gIHJldHVybiB7XG4gICAgZW1pdChldmVudCwgZGF0YSkge1xuICAgICAgdmFyIF9tYXAkZ2V0O1xuICAgICAgKF9tYXAkZ2V0ID0gbWFwLmdldChldmVudCkpID09IG51bGwgfHwgX21hcCRnZXQuZm9yRWFjaChoYW5kbGVyID0+IGhhbmRsZXIoZGF0YSkpO1xuICAgIH0sXG4gICAgb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICBtYXAuc2V0KGV2ZW50LCBbLi4uKG1hcC5nZXQoZXZlbnQpIHx8IFtdKSwgbGlzdGVuZXJdKTtcbiAgICB9LFxuICAgIG9mZihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBfbWFwJGdldDI7XG4gICAgICBtYXAuc2V0KGV2ZW50LCAoKF9tYXAkZ2V0MiA9IG1hcC5nZXQoZXZlbnQpKSA9PSBudWxsID8gdm9pZCAwIDogX21hcCRnZXQyLmZpbHRlcihsID0+IGwgIT09IGxpc3RlbmVyKSkgfHwgW10pO1xuICAgIH1cbiAgfTtcbn1cblxuY29uc3QgRmxvYXRpbmdOb2RlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuY29uc3QgRmxvYXRpbmdUcmVlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmVudCBub2RlIGlkIGZvciBuZXN0ZWQgZmxvYXRpbmcgZWxlbWVudHMsIGlmIGF2YWlsYWJsZS5cbiAqIFJldHVybnMgYG51bGxgIGZvciB0b3AtbGV2ZWwgZmxvYXRpbmcgZWxlbWVudHMuXG4gKi9cbmNvbnN0IHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkID0gKCkgPT4ge1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQ7XG4gIHJldHVybiAoKF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGbG9hdGluZ05vZGVDb250ZXh0KSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9SZWFjdCR1c2VDb250ZXh0LmlkKSB8fCBudWxsO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZWFyZXN0IGZsb2F0aW5nIHRyZWUgY29udGV4dCwgaWYgYXZhaWxhYmxlLlxuICovXG5jb25zdCB1c2VGbG9hdGluZ1RyZWUgPSAoKSA9PiBSZWFjdC51c2VDb250ZXh0KEZsb2F0aW5nVHJlZUNvbnRleHQpO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhIG5vZGUgaW50byB0aGUgYEZsb2F0aW5nVHJlZWAsIHJldHVybmluZyBpdHMgaWQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdUcmVlXG4gKi9cbmZ1bmN0aW9uIHVzZUZsb2F0aW5nTm9kZUlkKGN1c3RvbVBhcmVudElkKSB7XG4gIGNvbnN0IGlkID0gdXNlSWQoKTtcbiAgY29uc3QgdHJlZSA9IHVzZUZsb2F0aW5nVHJlZSgpO1xuICBjb25zdCByZWFjdFBhcmVudElkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKTtcbiAgY29uc3QgcGFyZW50SWQgPSBjdXN0b21QYXJlbnRJZCB8fCByZWFjdFBhcmVudElkO1xuICBpbmRleCgoKSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IHtcbiAgICAgIGlkLFxuICAgICAgcGFyZW50SWRcbiAgICB9O1xuICAgIHRyZWUgPT0gbnVsbCB8fCB0cmVlLmFkZE5vZGUobm9kZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRyZWUgPT0gbnVsbCB8fCB0cmVlLnJlbW92ZU5vZGUobm9kZSk7XG4gICAgfTtcbiAgfSwgW3RyZWUsIGlkLCBwYXJlbnRJZF0pO1xuICByZXR1cm4gaWQ7XG59XG4vKipcbiAqIFByb3ZpZGVzIHBhcmVudCBub2RlIGNvbnRleHQgZm9yIG5lc3RlZCBmbG9hdGluZyBlbGVtZW50cy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ1RyZWVcbiAqL1xuZnVuY3Rpb24gRmxvYXRpbmdOb2RlKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBpZFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHBhcmVudElkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZsb2F0aW5nTm9kZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgICAgaWQsXG4gICAgICBwYXJlbnRJZFxuICAgIH0pLCBbaWQsIHBhcmVudElkXSlcbiAgfSwgY2hpbGRyZW4pO1xufVxuLyoqXG4gKiBQcm92aWRlcyBjb250ZXh0IGZvciBuZXN0ZWQgZmxvYXRpbmcgZWxlbWVudHMgd2hlbiB0aGV5IGFyZSBub3QgY2hpbGRyZW4gb2ZcbiAqIGVhY2ggb3RoZXIgb24gdGhlIERPTS5cbiAqIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpbiBhbGwgY2FzZXMsIGV4Y2VwdCB3aGVuIHRoZXJlIG11c3QgYmUgZXhwbGljaXQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHBhcmVudCBhbmQgY2hpbGQgZmxvYXRpbmcgZWxlbWVudHMuIEl0IGlzIG5lY2Vzc2FyeSBmb3I6XG4gKiAtIFRoZSBgYnViYmxlc2Agb3B0aW9uIGluIHRoZSBgdXNlRGlzbWlzcygpYCBIb29rXG4gKiAtIE5lc3RlZCB2aXJ0dWFsIGxpc3QgbmF2aWdhdGlvblxuICogLSBOZXN0ZWQgZmxvYXRpbmcgZWxlbWVudHMgdGhhdCBlYWNoIG9wZW4gb24gaG92ZXJcbiAqIC0gQ3VzdG9tIGNvbW11bmljYXRpb24gYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkIGZsb2F0aW5nIGVsZW1lbnRzXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdUcmVlXG4gKi9cbmZ1bmN0aW9uIEZsb2F0aW5nVHJlZShwcm9wcykge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW5cbiAgfSA9IHByb3BzO1xuICBjb25zdCBub2Rlc1JlZiA9IFJlYWN0LnVzZVJlZihbXSk7XG4gIGNvbnN0IGFkZE5vZGUgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBub2Rlc1JlZi5jdXJyZW50ID0gWy4uLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVdO1xuICB9LCBbXSk7XG4gIGNvbnN0IHJlbW92ZU5vZGUgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBub2Rlc1JlZi5jdXJyZW50ID0gbm9kZXNSZWYuY3VycmVudC5maWx0ZXIobiA9PiBuICE9PSBub2RlKTtcbiAgfSwgW10pO1xuICBjb25zdCBldmVudHMgPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBjcmVhdGVQdWJTdWIoKSlbMF07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGbG9hdGluZ1RyZWVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgIG5vZGVzUmVmLFxuICAgICAgYWRkTm9kZSxcbiAgICAgIHJlbW92ZU5vZGUsXG4gICAgICBldmVudHNcbiAgICB9KSwgW2FkZE5vZGUsIHJlbW92ZU5vZGUsIGV2ZW50c10pXG4gIH0sIGNoaWxkcmVuKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXR0cmlidXRlKG5hbWUpIHtcbiAgcmV0dXJuIFwiZGF0YS1mbG9hdGluZy11aS1cIiArIG5hbWU7XG59XG5cbmZ1bmN0aW9uIHVzZUxhdGVzdFJlZih2YWx1ZSkge1xuICBjb25zdCByZWYgPSB1c2VSZWYodmFsdWUpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZWY7XG59XG5cbmNvbnN0IHNhZmVQb2x5Z29uSWRlbnRpZmllciA9IC8qI19fUFVSRV9fKi9jcmVhdGVBdHRyaWJ1dGUoJ3NhZmUtcG9seWdvbicpO1xuZnVuY3Rpb24gZ2V0RGVsYXkodmFsdWUsIHByb3AsIHBvaW50ZXJUeXBlKSB7XG4gIGlmIChwb2ludGVyVHlwZSAmJiAhaXNNb3VzZUxpa2VQb2ludGVyVHlwZShwb2ludGVyVHlwZSkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHZvaWQgMCA6IHZhbHVlW3Byb3BdO1xufVxuLyoqXG4gKiBPcGVucyB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGlsZSBob3ZlcmluZyBvdmVyIHRoZSByZWZlcmVuY2UgZWxlbWVudCwgbGlrZVxuICogQ1NTIGA6aG92ZXJgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUhvdmVyXG4gKi9cbmZ1bmN0aW9uIHVzZUhvdmVyKGNvbnRleHQsIHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZGF0YVJlZixcbiAgICBldmVudHMsXG4gICAgZWxlbWVudHNcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBkZWxheSA9IDAsXG4gICAgaGFuZGxlQ2xvc2UgPSBudWxsLFxuICAgIG1vdXNlT25seSA9IGZhbHNlLFxuICAgIHJlc3RNcyA9IDAsXG4gICAgbW92ZSA9IHRydWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCB0cmVlID0gdXNlRmxvYXRpbmdUcmVlKCk7XG4gIGNvbnN0IHBhcmVudElkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKTtcbiAgY29uc3QgaGFuZGxlQ2xvc2VSZWYgPSB1c2VMYXRlc3RSZWYoaGFuZGxlQ2xvc2UpO1xuICBjb25zdCBkZWxheVJlZiA9IHVzZUxhdGVzdFJlZihkZWxheSk7XG4gIGNvbnN0IG9wZW5SZWYgPSB1c2VMYXRlc3RSZWYob3Blbik7XG4gIGNvbnN0IHBvaW50ZXJUeXBlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IHRpbWVvdXRSZWYgPSBSZWFjdC51c2VSZWYoLTEpO1xuICBjb25zdCBoYW5kbGVyUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IHJlc3RUaW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKC0xKTtcbiAgY29uc3QgYmxvY2tNb3VzZU1vdmVSZWYgPSBSZWFjdC51c2VSZWYodHJ1ZSk7XG4gIGNvbnN0IHBlcmZvcm1lZFBvaW50ZXJFdmVudHNNdXRhdGlvblJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHVuYmluZE1vdXNlTW92ZVJlZiA9IFJlYWN0LnVzZVJlZigoKSA9PiB7fSk7XG4gIGNvbnN0IGlzSG92ZXJPcGVuID0gUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHZhciBfZGF0YVJlZiRjdXJyZW50JG9wZW47XG4gICAgY29uc3QgdHlwZSA9IChfZGF0YVJlZiRjdXJyZW50JG9wZW4gPSBkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2RhdGFSZWYkY3VycmVudCRvcGVuLnR5cGU7XG4gICAgcmV0dXJuICh0eXBlID09IG51bGwgPyB2b2lkIDAgOiB0eXBlLmluY2x1ZGVzKCdtb3VzZScpKSAmJiB0eXBlICE9PSAnbW91c2Vkb3duJztcbiAgfSwgW2RhdGFSZWZdKTtcblxuICAvLyBXaGVuIGNsb3NpbmcgYmVmb3JlIG9wZW5pbmcsIGNsZWFyIHRoZSBkZWxheSB0aW1lb3V0cyB0byBjYW5jZWwgaXRcbiAgLy8gZnJvbSBzaG93aW5nLlxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIG9uT3BlbkNoYW5nZShfcmVmKSB7XG4gICAgICBsZXQge1xuICAgICAgICBvcGVuXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIGlmICghb3Blbikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlc3RUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICBibG9ja01vdXNlTW92ZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXZlbnRzLm9uKCdvcGVuY2hhbmdlJywgb25PcGVuQ2hhbmdlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZXZlbnRzLm9mZignb3BlbmNoYW5nZScsIG9uT3BlbkNoYW5nZSk7XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIGV2ZW50c10pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGlmICghaGFuZGxlQ2xvc2VSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIGlmICghb3BlbikgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIG9uTGVhdmUoZXZlbnQpIHtcbiAgICAgIGlmIChpc0hvdmVyT3BlbigpKSB7XG4gICAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQsICdob3ZlcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBodG1sID0gZ2V0RG9jdW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpLmRvY3VtZW50RWxlbWVudDtcbiAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvbkxlYXZlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaHRtbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25MZWF2ZSk7XG4gICAgfTtcbiAgfSwgW2VsZW1lbnRzLmZsb2F0aW5nLCBvcGVuLCBvbk9wZW5DaGFuZ2UsIGVuYWJsZWQsIGhhbmRsZUNsb3NlUmVmLCBpc0hvdmVyT3Blbl0pO1xuICBjb25zdCBjbG9zZVdpdGhEZWxheSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCwgcnVuRWxzZUJyYW5jaCwgcmVhc29uKSB7XG4gICAgaWYgKHJ1bkVsc2VCcmFuY2ggPT09IHZvaWQgMCkge1xuICAgICAgcnVuRWxzZUJyYW5jaCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChyZWFzb24gPT09IHZvaWQgMCkge1xuICAgICAgcmVhc29uID0gJ2hvdmVyJztcbiAgICB9XG4gICAgY29uc3QgY2xvc2VEZWxheSA9IGdldERlbGF5KGRlbGF5UmVmLmN1cnJlbnQsICdjbG9zZScsIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQpO1xuICAgIGlmIChjbG9zZURlbGF5ICYmICFoYW5kbGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudCwgcmVhc29uKSwgY2xvc2VEZWxheSk7XG4gICAgfSBlbHNlIGlmIChydW5FbHNlQnJhbmNoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQsIHJlYXNvbik7XG4gICAgfVxuICB9LCBbZGVsYXlSZWYsIG9uT3BlbkNoYW5nZV0pO1xuICBjb25zdCBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlciA9IHVzZUVmZmVjdEV2ZW50KCgpID0+IHtcbiAgICB1bmJpbmRNb3VzZU1vdmVSZWYuY3VycmVudCgpO1xuICAgIGhhbmRsZXJSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgfSk7XG4gIGNvbnN0IGNsZWFyUG9pbnRlckV2ZW50cyA9IHVzZUVmZmVjdEV2ZW50KCgpID0+IHtcbiAgICBpZiAocGVyZm9ybWVkUG9pbnRlckV2ZW50c011dGF0aW9uUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBnZXREb2N1bWVudChlbGVtZW50cy5mbG9hdGluZykuYm9keTtcbiAgICAgIGJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgYm9keS5yZW1vdmVBdHRyaWJ1dGUoc2FmZVBvbHlnb25JZGVudGlmaWVyKTtcbiAgICAgIHBlcmZvcm1lZFBvaW50ZXJFdmVudHNNdXRhdGlvblJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICAvLyBSZWdpc3RlcmluZyB0aGUgbW91c2UgZXZlbnRzIG9uIHRoZSByZWZlcmVuY2UgZGlyZWN0bHkgdG8gYnlwYXNzIFJlYWN0J3NcbiAgLy8gZGVsZWdhdGlvbiBzeXN0ZW0uIElmIHRoZSBjdXJzb3Igd2FzIG9uIGEgZGlzYWJsZWQgZWxlbWVudCBhbmQgdGhlbiBlbnRlcmVkXG4gIC8vIHRoZSByZWZlcmVuY2UgKG5vIGdhcCksIGBtb3VzZWVudGVyYCBkb2Vzbid0IGZpcmUgaW4gdGhlIGRlbGVnYXRpb24gc3lzdGVtLlxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIGlzQ2xpY2tMaWtlT3BlbkV2ZW50KCkge1xuICAgICAgcmV0dXJuIGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQgPyBbJ2NsaWNrJywgJ21vdXNlZG93biddLmluY2x1ZGVzKGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQudHlwZSkgOiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb25Nb3VzZUVudGVyKGV2ZW50KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIGJsb2NrTW91c2VNb3ZlUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIGlmIChtb3VzZU9ubHkgJiYgIWlzTW91c2VMaWtlUG9pbnRlclR5cGUocG9pbnRlclR5cGVSZWYuY3VycmVudCkgfHwgcmVzdE1zID4gMCAmJiAhZ2V0RGVsYXkoZGVsYXlSZWYuY3VycmVudCwgJ29wZW4nKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBvcGVuRGVsYXkgPSBnZXREZWxheShkZWxheVJlZi5jdXJyZW50LCAnb3BlbicsIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQpO1xuICAgICAgaWYgKG9wZW5EZWxheSkge1xuICAgICAgICB0aW1lb3V0UmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFvcGVuUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudCwgJ2hvdmVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBvcGVuRGVsYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50LCAnaG92ZXInKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25Nb3VzZUxlYXZlKGV2ZW50KSB7XG4gICAgICBpZiAoaXNDbGlja0xpa2VPcGVuRXZlbnQoKSkgcmV0dXJuO1xuICAgICAgdW5iaW5kTW91c2VNb3ZlUmVmLmN1cnJlbnQoKTtcbiAgICAgIGNvbnN0IGRvYyA9IGdldERvY3VtZW50KGVsZW1lbnRzLmZsb2F0aW5nKTtcbiAgICAgIGNsZWFyVGltZW91dChyZXN0VGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIGlmIChoYW5kbGVDbG9zZVJlZi5jdXJyZW50ICYmIGRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQpIHtcbiAgICAgICAgLy8gUHJldmVudCBjbGVhcmluZyBgb25TY3JvbGxNb3VzZUxlYXZlYCB0aW1lb3V0LlxuICAgICAgICBpZiAoIW9wZW4pIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVyUmVmLmN1cnJlbnQgPSBoYW5kbGVDbG9zZVJlZi5jdXJyZW50KHtcbiAgICAgICAgICAuLi5kYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0LFxuICAgICAgICAgIHRyZWUsXG4gICAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgICAgICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgICAgICBjbGVhclBvaW50ZXJFdmVudHMoKTtcbiAgICAgICAgICAgIGNsZWFudXBNb3VzZU1vdmVIYW5kbGVyKCk7XG4gICAgICAgICAgICBjbG9zZVdpdGhEZWxheShldmVudCwgdHJ1ZSwgJ3NhZmUtcG9seWdvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyUmVmLmN1cnJlbnQ7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVyKTtcbiAgICAgICAgdW5iaW5kTW91c2VNb3ZlUmVmLmN1cnJlbnQgPSAoKSA9PiB7XG4gICAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFsbG93IGludGVyYWN0aXZpdHkgd2l0aG91dCBgc2FmZVBvbHlnb25gIG9uIHRvdWNoIGRldmljZXMuIFdpdGggYVxuICAgICAgLy8gcG9pbnRlciwgYSBzaG9ydCBjbG9zZSBkZWxheSBpcyBhbiBhbHRlcm5hdGl2ZSwgc28gaXQgc2hvdWxkIHdvcmtcbiAgICAgIC8vIGNvbnNpc3RlbnRseS5cbiAgICAgIGNvbnN0IHNob3VsZENsb3NlID0gcG9pbnRlclR5cGVSZWYuY3VycmVudCA9PT0gJ3RvdWNoJyA/ICFjb250YWlucyhlbGVtZW50cy5mbG9hdGluZywgZXZlbnQucmVsYXRlZFRhcmdldCkgOiB0cnVlO1xuICAgICAgaWYgKHNob3VsZENsb3NlKSB7XG4gICAgICAgIGNsb3NlV2l0aERlbGF5KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgY2xvc2VzIGFmdGVyIHNjcm9sbGluZyBldmVuIGlmIHRoZSBwb2ludGVyXG4gICAgLy8gZGlkIG5vdCBtb3ZlLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9kaXNjdXNzaW9ucy8xNjkyXG4gICAgZnVuY3Rpb24gb25TY3JvbGxNb3VzZUxlYXZlKGV2ZW50KSB7XG4gICAgICBpZiAoaXNDbGlja0xpa2VPcGVuRXZlbnQoKSkgcmV0dXJuO1xuICAgICAgaWYgKCFkYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0KSByZXR1cm47XG4gICAgICBoYW5kbGVDbG9zZVJlZi5jdXJyZW50ID09IG51bGwgfHwgaGFuZGxlQ2xvc2VSZWYuY3VycmVudCh7XG4gICAgICAgIC4uLmRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQsXG4gICAgICAgIHRyZWUsXG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFksXG4gICAgICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgICAgY2xlYXJQb2ludGVyRXZlbnRzKCk7XG4gICAgICAgICAgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIoKTtcbiAgICAgICAgICBjbG9zZVdpdGhEZWxheShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKGlzRWxlbWVudChlbGVtZW50cy5kb21SZWZlcmVuY2UpKSB7XG4gICAgICB2YXIgX2VsZW1lbnRzJGZsb2F0aW5nO1xuICAgICAgY29uc3QgcmVmID0gZWxlbWVudHMuZG9tUmVmZXJlbmNlO1xuICAgICAgb3BlbiAmJiByZWYuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uU2Nyb2xsTW91c2VMZWF2ZSk7XG4gICAgICAoX2VsZW1lbnRzJGZsb2F0aW5nID0gZWxlbWVudHMuZmxvYXRpbmcpID09IG51bGwgfHwgX2VsZW1lbnRzJGZsb2F0aW5nLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblNjcm9sbE1vdXNlTGVhdmUpO1xuICAgICAgbW92ZSAmJiByZWYuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZUVudGVyLCB7XG4gICAgICAgIG9uY2U6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmVmLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBvbk1vdXNlRW50ZXIpO1xuICAgICAgcmVmLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvbk1vdXNlTGVhdmUpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdmFyIF9lbGVtZW50cyRmbG9hdGluZzI7XG4gICAgICAgIG9wZW4gJiYgcmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblNjcm9sbE1vdXNlTGVhdmUpO1xuICAgICAgICAoX2VsZW1lbnRzJGZsb2F0aW5nMiA9IGVsZW1lbnRzLmZsb2F0aW5nKSA9PSBudWxsIHx8IF9lbGVtZW50cyRmbG9hdGluZzIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uU2Nyb2xsTW91c2VMZWF2ZSk7XG4gICAgICAgIG1vdmUgJiYgcmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VFbnRlcik7XG4gICAgICAgIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgb25Nb3VzZUVudGVyKTtcbiAgICAgICAgcmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvbk1vdXNlTGVhdmUpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtlbGVtZW50cywgZW5hYmxlZCwgY29udGV4dCwgbW91c2VPbmx5LCByZXN0TXMsIG1vdmUsIGNsb3NlV2l0aERlbGF5LCBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlciwgY2xlYXJQb2ludGVyRXZlbnRzLCBvbk9wZW5DaGFuZ2UsIG9wZW4sIG9wZW5SZWYsIHRyZWUsIGRlbGF5UmVmLCBoYW5kbGVDbG9zZVJlZiwgZGF0YVJlZl0pO1xuXG4gIC8vIEJsb2NrIHBvaW50ZXItZXZlbnRzIG9mIGV2ZXJ5IGVsZW1lbnQgb3RoZXIgdGhhbiB0aGUgcmVmZXJlbmNlIGFuZCBmbG9hdGluZ1xuICAvLyB3aGlsZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBpcyBvcGVuIGFuZCBoYXMgYSBgaGFuZGxlQ2xvc2VgIGhhbmRsZXIuIEFsc29cbiAgLy8gaGFuZGxlcyBuZXN0ZWQgZmxvYXRpbmcgZWxlbWVudHMuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMTcyMlxuICBpbmRleCgoKSA9PiB7XG4gICAgdmFyIF9oYW5kbGVDbG9zZVJlZiRjdXJyZTtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBpZiAob3BlbiAmJiAoX2hhbmRsZUNsb3NlUmVmJGN1cnJlID0gaGFuZGxlQ2xvc2VSZWYuY3VycmVudCkgIT0gbnVsbCAmJiBfaGFuZGxlQ2xvc2VSZWYkY3VycmUuX19vcHRpb25zLmJsb2NrUG9pbnRlckV2ZW50cyAmJiBpc0hvdmVyT3BlbigpKSB7XG4gICAgICBjb25zdCBib2R5ID0gZ2V0RG9jdW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpLmJvZHk7XG4gICAgICBib2R5LnNldEF0dHJpYnV0ZShzYWZlUG9seWdvbklkZW50aWZpZXIsICcnKTtcbiAgICAgIGJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHBlcmZvcm1lZFBvaW50ZXJFdmVudHNNdXRhdGlvblJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGZsb2F0aW5nRWwgPSBlbGVtZW50cy5mbG9hdGluZztcbiAgICAgIGlmIChpc0VsZW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlKSAmJiBmbG9hdGluZ0VsKSB7XG4gICAgICAgIHZhciBfdHJlZSRub2Rlc1JlZiRjdXJyZW47XG4gICAgICAgIGNvbnN0IHJlZiA9IGVsZW1lbnRzLmRvbVJlZmVyZW5jZTtcbiAgICAgICAgY29uc3QgcGFyZW50RmxvYXRpbmcgPSB0cmVlID09IG51bGwgfHwgKF90cmVlJG5vZGVzUmVmJGN1cnJlbiA9IHRyZWUubm9kZXNSZWYuY3VycmVudC5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gcGFyZW50SWQpKSA9PSBudWxsIHx8IChfdHJlZSRub2Rlc1JlZiRjdXJyZW4gPSBfdHJlZSRub2Rlc1JlZiRjdXJyZW4uY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF90cmVlJG5vZGVzUmVmJGN1cnJlbi5lbGVtZW50cy5mbG9hdGluZztcbiAgICAgICAgaWYgKHBhcmVudEZsb2F0aW5nKSB7XG4gICAgICAgICAgcGFyZW50RmxvYXRpbmcuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJlZi5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICBmbG9hdGluZ0VsLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgcmVmLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgICBmbG9hdGluZ0VsLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtlbmFibGVkLCBvcGVuLCBwYXJlbnRJZCwgZWxlbWVudHMsIHRyZWUsIGhhbmRsZUNsb3NlUmVmLCBpc0hvdmVyT3Blbl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICBwb2ludGVyVHlwZVJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIoKTtcbiAgICAgIGNsZWFyUG9pbnRlckV2ZW50cygpO1xuICAgIH1cbiAgfSwgW29wZW4sIGNsZWFudXBNb3VzZU1vdmVIYW5kbGVyLCBjbGVhclBvaW50ZXJFdmVudHNdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIoKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgY2xlYXJUaW1lb3V0KHJlc3RUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgY2xlYXJQb2ludGVyRXZlbnRzKCk7XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIGVsZW1lbnRzLmRvbVJlZmVyZW5jZSwgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIsIGNsZWFyUG9pbnRlckV2ZW50c10pO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBmdW5jdGlvbiBzZXRQb2ludGVyUmVmKGV2ZW50KSB7XG4gICAgICBwb2ludGVyVHlwZVJlZi5jdXJyZW50ID0gZXZlbnQucG9pbnRlclR5cGU7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBvblBvaW50ZXJEb3duOiBzZXRQb2ludGVyUmVmLFxuICAgICAgb25Qb2ludGVyRW50ZXI6IHNldFBvaW50ZXJSZWYsXG4gICAgICBvbk1vdXNlTW92ZShldmVudCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgbmF0aXZlRXZlbnRcbiAgICAgICAgfSA9IGV2ZW50O1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoKSB7XG4gICAgICAgICAgaWYgKCFibG9ja01vdXNlTW92ZVJlZi5jdXJyZW50ICYmICFvcGVuUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBuYXRpdmVFdmVudCwgJ2hvdmVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtb3VzZU9ubHkgJiYgIWlzTW91c2VMaWtlUG9pbnRlclR5cGUocG9pbnRlclR5cGVSZWYuY3VycmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wZW4gfHwgcmVzdE1zID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyVGltZW91dChyZXN0VGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgICAgaWYgKHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPT09ICd0b3VjaCcpIHtcbiAgICAgICAgICBoYW5kbGVNb3VzZU1vdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN0VGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoaGFuZGxlTW91c2VNb3ZlLCByZXN0TXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW21vdXNlT25seSwgb25PcGVuQ2hhbmdlLCBvcGVuLCBvcGVuUmVmLCByZXN0TXNdKTtcbiAgY29uc3QgZmxvYXRpbmcgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgb25Nb3VzZUVudGVyKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgfSxcbiAgICBvbk1vdXNlTGVhdmUoZXZlbnQpIHtcbiAgICAgIGNsb3NlV2l0aERlbGF5KGV2ZW50Lm5hdGl2ZUV2ZW50LCBmYWxzZSk7XG4gICAgfVxuICB9KSwgW2Nsb3NlV2l0aERlbGF5XSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IGVuYWJsZWQgPyB7XG4gICAgcmVmZXJlbmNlLFxuICAgIGZsb2F0aW5nXG4gIH0gOiB7fSwgW2VuYWJsZWQsIHJlZmVyZW5jZSwgZmxvYXRpbmddKTtcbn1cblxuY29uc3QgTk9PUCA9ICgpID0+IHt9O1xuY29uc3QgRmxvYXRpbmdEZWxheUdyb3VwQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgZGVsYXk6IDAsXG4gIGluaXRpYWxEZWxheTogMCxcbiAgdGltZW91dE1zOiAwLFxuICBjdXJyZW50SWQ6IG51bGwsXG4gIHNldEN1cnJlbnRJZDogTk9PUCxcbiAgc2V0U3RhdGU6IE5PT1AsXG4gIGlzSW5zdGFudFBoYXNlOiBmYWxzZVxufSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFVzZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGB1c2VEZWxheUdyb3VwKClgIGluc3RlYWQuXG4gKi9cbmNvbnN0IHVzZURlbGF5R3JvdXBDb250ZXh0ID0gKCkgPT4gUmVhY3QudXNlQ29udGV4dChGbG9hdGluZ0RlbGF5R3JvdXBDb250ZXh0KTtcbi8qKlxuICogUHJvdmlkZXMgY29udGV4dCBmb3IgYSBncm91cCBvZiBmbG9hdGluZyBlbGVtZW50cyB0aGF0IHNob3VsZCBzaGFyZSBhXG4gKiBgZGVsYXlgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nRGVsYXlHcm91cFxuICovXG5mdW5jdGlvbiBGbG9hdGluZ0RlbGF5R3JvdXAocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGRlbGF5LFxuICAgIHRpbWVvdXRNcyA9IDBcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IFJlYWN0LnVzZVJlZHVjZXIoKHByZXYsIG5leHQpID0+ICh7XG4gICAgLi4ucHJldixcbiAgICAuLi5uZXh0XG4gIH0pLCB7XG4gICAgZGVsYXksXG4gICAgdGltZW91dE1zLFxuICAgIGluaXRpYWxEZWxheTogZGVsYXksXG4gICAgY3VycmVudElkOiBudWxsLFxuICAgIGlzSW5zdGFudFBoYXNlOiBmYWxzZVxuICB9KTtcbiAgY29uc3QgaW5pdGlhbEN1cnJlbnRJZFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qgc2V0Q3VycmVudElkID0gUmVhY3QudXNlQ2FsbGJhY2soY3VycmVudElkID0+IHtcbiAgICBzZXRTdGF0ZSh7XG4gICAgICBjdXJyZW50SWRcbiAgICB9KTtcbiAgfSwgW10pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKHN0YXRlLmN1cnJlbnRJZCkge1xuICAgICAgaWYgKGluaXRpYWxDdXJyZW50SWRSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICBpbml0aWFsQ3VycmVudElkUmVmLmN1cnJlbnQgPSBzdGF0ZS5jdXJyZW50SWQ7XG4gICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5pc0luc3RhbnRQaGFzZSkge1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgaXNJbnN0YW50UGhhc2U6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0ZS5pc0luc3RhbnRQaGFzZSkge1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgaXNJbnN0YW50UGhhc2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaW5pdGlhbEN1cnJlbnRJZFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH0sIFtzdGF0ZS5jdXJyZW50SWQsIHN0YXRlLmlzSW5zdGFudFBoYXNlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGbG9hdGluZ0RlbGF5R3JvdXBDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2V0U3RhdGUsXG4gICAgICBzZXRDdXJyZW50SWRcbiAgICB9KSwgW3N0YXRlLCBzZXRDdXJyZW50SWRdKVxuICB9LCBjaGlsZHJlbik7XG59XG4vKipcbiAqIEVuYWJsZXMgZ3JvdXBpbmcgd2hlbiBjYWxsZWQgaW5zaWRlIGEgY29tcG9uZW50IHRoYXQncyBhIGNoaWxkIG9mIGFcbiAqIGBGbG9hdGluZ0RlbGF5R3JvdXBgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nRGVsYXlHcm91cFxuICovXG5mdW5jdGlvbiB1c2VEZWxheUdyb3VwKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZmxvYXRpbmdJZFxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGlkOiBvcHRpb25JZFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaWQgPSBvcHRpb25JZCAhPSBudWxsID8gb3B0aW9uSWQgOiBmbG9hdGluZ0lkO1xuICBjb25zdCBncm91cENvbnRleHQgPSB1c2VEZWxheUdyb3VwQ29udGV4dCgpO1xuICBjb25zdCB7XG4gICAgY3VycmVudElkLFxuICAgIHNldEN1cnJlbnRJZCxcbiAgICBpbml0aWFsRGVsYXksXG4gICAgc2V0U3RhdGUsXG4gICAgdGltZW91dE1zXG4gIH0gPSBncm91cENvbnRleHQ7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWN1cnJlbnRJZCkgcmV0dXJuO1xuICAgIHNldFN0YXRlKHtcbiAgICAgIGRlbGF5OiB7XG4gICAgICAgIG9wZW46IDEsXG4gICAgICAgIGNsb3NlOiBnZXREZWxheShpbml0aWFsRGVsYXksICdjbG9zZScpXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGN1cnJlbnRJZCAhPT0gaWQpIHtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgfVxuICB9LCBbaWQsIG9uT3BlbkNoYW5nZSwgc2V0U3RhdGUsIGN1cnJlbnRJZCwgaW5pdGlhbERlbGF5XSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBmdW5jdGlvbiB1bnNldCgpIHtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGRlbGF5OiBpbml0aWFsRGVsYXksXG4gICAgICAgIGN1cnJlbnRJZDogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghY3VycmVudElkKSByZXR1cm47XG4gICAgaWYgKCFvcGVuICYmIGN1cnJlbnRJZCA9PT0gaWQpIHtcbiAgICAgIGlmICh0aW1lb3V0TXMpIHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KHVuc2V0LCB0aW1lb3V0TXMpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHVuc2V0KCk7XG4gICAgfVxuICB9LCBbb3Blbiwgc2V0U3RhdGUsIGN1cnJlbnRJZCwgaWQsIG9uT3BlbkNoYW5nZSwgaW5pdGlhbERlbGF5LCB0aW1lb3V0TXNdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChzZXRDdXJyZW50SWQgPT09IE5PT1AgfHwgIW9wZW4pIHJldHVybjtcbiAgICBzZXRDdXJyZW50SWQoaWQpO1xuICB9LCBbb3Blbiwgc2V0Q3VycmVudElkLCBpZF0pO1xuICByZXR1cm4gZ3JvdXBDb250ZXh0O1xufVxuXG5mdW5jdGlvbiBnZXRBbmNlc3RvcnMobm9kZXMsIGlkKSB7XG4gIHZhciBfbm9kZXMkZmluZDtcbiAgbGV0IGFsbEFuY2VzdG9ycyA9IFtdO1xuICBsZXQgY3VycmVudFBhcmVudElkID0gKF9ub2RlcyRmaW5kID0gbm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT09IGlkKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlcyRmaW5kLnBhcmVudElkO1xuICB3aGlsZSAoY3VycmVudFBhcmVudElkKSB7XG4gICAgY29uc3QgY3VycmVudE5vZGUgPSBub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gY3VycmVudFBhcmVudElkKTtcbiAgICBjdXJyZW50UGFyZW50SWQgPSBjdXJyZW50Tm9kZSA9PSBudWxsID8gdm9pZCAwIDogY3VycmVudE5vZGUucGFyZW50SWQ7XG4gICAgaWYgKGN1cnJlbnROb2RlKSB7XG4gICAgICBhbGxBbmNlc3RvcnMgPSBhbGxBbmNlc3RvcnMuY29uY2F0KGN1cnJlbnROb2RlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFsbEFuY2VzdG9ycztcbn1cblxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obm9kZXMsIGlkKSB7XG4gIGxldCBhbGxDaGlsZHJlbiA9IG5vZGVzLmZpbHRlcihub2RlID0+IHtcbiAgICB2YXIgX25vZGUkY29udGV4dDtcbiAgICByZXR1cm4gbm9kZS5wYXJlbnRJZCA9PT0gaWQgJiYgKChfbm9kZSRjb250ZXh0ID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dC5vcGVuKTtcbiAgfSk7XG4gIGxldCBjdXJyZW50Q2hpbGRyZW4gPSBhbGxDaGlsZHJlbjtcbiAgd2hpbGUgKGN1cnJlbnRDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBjdXJyZW50Q2hpbGRyZW4gPSBub2Rlcy5maWx0ZXIobm9kZSA9PiB7XG4gICAgICB2YXIgX2N1cnJlbnRDaGlsZHJlbjtcbiAgICAgIHJldHVybiAoX2N1cnJlbnRDaGlsZHJlbiA9IGN1cnJlbnRDaGlsZHJlbikgPT0gbnVsbCA/IHZvaWQgMCA6IF9jdXJyZW50Q2hpbGRyZW4uc29tZShuID0+IHtcbiAgICAgICAgdmFyIF9ub2RlJGNvbnRleHQyO1xuICAgICAgICByZXR1cm4gbm9kZS5wYXJlbnRJZCA9PT0gbi5pZCAmJiAoKF9ub2RlJGNvbnRleHQyID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dDIub3Blbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBhbGxDaGlsZHJlbiA9IGFsbENoaWxkcmVuLmNvbmNhdChjdXJyZW50Q2hpbGRyZW4pO1xuICB9XG4gIHJldHVybiBhbGxDaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGdldERlZXBlc3ROb2RlKG5vZGVzLCBpZCkge1xuICBsZXQgZGVlcGVzdE5vZGVJZDtcbiAgbGV0IG1heERlcHRoID0gLTE7XG4gIGZ1bmN0aW9uIGZpbmREZWVwZXN0KG5vZGVJZCwgZGVwdGgpIHtcbiAgICBpZiAoZGVwdGggPiBtYXhEZXB0aCkge1xuICAgICAgZGVlcGVzdE5vZGVJZCA9IG5vZGVJZDtcbiAgICAgIG1heERlcHRoID0gZGVwdGg7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4obm9kZXMsIG5vZGVJZCk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICBmaW5kRGVlcGVzdChjaGlsZC5pZCwgZGVwdGggKyAxKTtcbiAgICB9KTtcbiAgfVxuICBmaW5kRGVlcGVzdChpZCwgMCk7XG4gIHJldHVybiBub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gZGVlcGVzdE5vZGVJZCk7XG59XG5cbi8vIE1vZGlmaWVkIHRvIGFkZCBjb25kaXRpb25hbCBgYXJpYS1oaWRkZW5gIHN1cHBvcnQ6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L2FyaWEtaGlkZGVuL2Jsb2IvOTIyMGM4ZjRhNGZkMzVmNjNiZWU1NTEwYTlmNDFhMzcyNjQzODJkNC9zcmMvaW5kZXgudHNcbmxldCBjb3VudGVyTWFwID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG5sZXQgdW5jb250cm9sbGVkRWxlbWVudHNTZXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbmxldCBtYXJrZXJNYXAgPSB7fTtcbmxldCBsb2NrQ291bnQgPSAwO1xuY29uc3Qgc3VwcG9ydHNJbmVydCA9ICgpID0+IHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2luZXJ0JyBpbiBIVE1MRWxlbWVudC5wcm90b3R5cGU7XG5jb25zdCB1bndyYXBIb3N0ID0gbm9kZSA9PiBub2RlICYmIChub2RlLmhvc3QgfHwgdW53cmFwSG9zdChub2RlLnBhcmVudE5vZGUpKTtcbmNvbnN0IGNvcnJlY3RFbGVtZW50cyA9IChwYXJlbnQsIHRhcmdldHMpID0+IHRhcmdldHMubWFwKHRhcmdldCA9PiB7XG4gIGlmIChwYXJlbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgY29uc3QgY29ycmVjdGVkVGFyZ2V0ID0gdW53cmFwSG9zdCh0YXJnZXQpO1xuICBpZiAocGFyZW50LmNvbnRhaW5zKGNvcnJlY3RlZFRhcmdldCkpIHtcbiAgICByZXR1cm4gY29ycmVjdGVkVGFyZ2V0O1xuICB9XG4gIHJldHVybiBudWxsO1xufSkuZmlsdGVyKHggPT4geCAhPSBudWxsKTtcbmZ1bmN0aW9uIGFwcGx5QXR0cmlidXRlVG9PdGhlcnModW5jb3JyZWN0ZWRBdm9pZEVsZW1lbnRzLCBib2R5LCBhcmlhSGlkZGVuLCBpbmVydCkge1xuICBjb25zdCBtYXJrZXJOYW1lID0gJ2RhdGEtZmxvYXRpbmctdWktaW5lcnQnO1xuICBjb25zdCBjb250cm9sQXR0cmlidXRlID0gaW5lcnQgPyAnaW5lcnQnIDogYXJpYUhpZGRlbiA/ICdhcmlhLWhpZGRlbicgOiBudWxsO1xuICBjb25zdCBhdm9pZEVsZW1lbnRzID0gY29ycmVjdEVsZW1lbnRzKGJvZHksIHVuY29ycmVjdGVkQXZvaWRFbGVtZW50cyk7XG4gIGNvbnN0IGVsZW1lbnRzVG9LZWVwID0gbmV3IFNldCgpO1xuICBjb25zdCBlbGVtZW50c1RvU3RvcCA9IG5ldyBTZXQoYXZvaWRFbGVtZW50cyk7XG4gIGNvbnN0IGhpZGRlbkVsZW1lbnRzID0gW107XG4gIGlmICghbWFya2VyTWFwW21hcmtlck5hbWVdKSB7XG4gICAgbWFya2VyTWFwW21hcmtlck5hbWVdID0gbmV3IFdlYWtNYXAoKTtcbiAgfVxuICBjb25zdCBtYXJrZXJDb3VudGVyID0gbWFya2VyTWFwW21hcmtlck5hbWVdO1xuICBhdm9pZEVsZW1lbnRzLmZvckVhY2goa2VlcCk7XG4gIGRlZXAoYm9keSk7XG4gIGVsZW1lbnRzVG9LZWVwLmNsZWFyKCk7XG4gIGZ1bmN0aW9uIGtlZXAoZWwpIHtcbiAgICBpZiAoIWVsIHx8IGVsZW1lbnRzVG9LZWVwLmhhcyhlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudHNUb0tlZXAuYWRkKGVsKTtcbiAgICBlbC5wYXJlbnROb2RlICYmIGtlZXAoZWwucGFyZW50Tm9kZSk7XG4gIH1cbiAgZnVuY3Rpb24gZGVlcChwYXJlbnQpIHtcbiAgICBpZiAoIXBhcmVudCB8fCBlbGVtZW50c1RvU3RvcC5oYXMocGFyZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBbXS5mb3JFYWNoLmNhbGwocGFyZW50LmNoaWxkcmVuLCBub2RlID0+IHtcbiAgICAgIGlmIChnZXROb2RlTmFtZShub2RlKSA9PT0gJ3NjcmlwdCcpIHJldHVybjtcbiAgICAgIGlmIChlbGVtZW50c1RvS2VlcC5oYXMobm9kZSkpIHtcbiAgICAgICAgZGVlcChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGF0dHIgPSBjb250cm9sQXR0cmlidXRlID8gbm9kZS5nZXRBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSkgOiBudWxsO1xuICAgICAgICBjb25zdCBhbHJlYWR5SGlkZGVuID0gYXR0ciAhPT0gbnVsbCAmJiBhdHRyICE9PSAnZmFsc2UnO1xuICAgICAgICBjb25zdCBjb3VudGVyVmFsdWUgPSAoY291bnRlck1hcC5nZXQobm9kZSkgfHwgMCkgKyAxO1xuICAgICAgICBjb25zdCBtYXJrZXJWYWx1ZSA9IChtYXJrZXJDb3VudGVyLmdldChub2RlKSB8fCAwKSArIDE7XG4gICAgICAgIGNvdW50ZXJNYXAuc2V0KG5vZGUsIGNvdW50ZXJWYWx1ZSk7XG4gICAgICAgIG1hcmtlckNvdW50ZXIuc2V0KG5vZGUsIG1hcmtlclZhbHVlKTtcbiAgICAgICAgaGlkZGVuRWxlbWVudHMucHVzaChub2RlKTtcbiAgICAgICAgaWYgKGNvdW50ZXJWYWx1ZSA9PT0gMSAmJiBhbHJlYWR5SGlkZGVuKSB7XG4gICAgICAgICAgdW5jb250cm9sbGVkRWxlbWVudHNTZXQuYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrZXJWYWx1ZSA9PT0gMSkge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG1hcmtlck5hbWUsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFscmVhZHlIaWRkZW4gJiYgY29udHJvbEF0dHJpYnV0ZSkge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGNvbnRyb2xBdHRyaWJ1dGUsICd0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBsb2NrQ291bnQrKztcbiAgcmV0dXJuICgpID0+IHtcbiAgICBoaWRkZW5FbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgY291bnRlclZhbHVlID0gKGNvdW50ZXJNYXAuZ2V0KGVsZW1lbnQpIHx8IDApIC0gMTtcbiAgICAgIGNvbnN0IG1hcmtlclZhbHVlID0gKG1hcmtlckNvdW50ZXIuZ2V0KGVsZW1lbnQpIHx8IDApIC0gMTtcbiAgICAgIGNvdW50ZXJNYXAuc2V0KGVsZW1lbnQsIGNvdW50ZXJWYWx1ZSk7XG4gICAgICBtYXJrZXJDb3VudGVyLnNldChlbGVtZW50LCBtYXJrZXJWYWx1ZSk7XG4gICAgICBpZiAoIWNvdW50ZXJWYWx1ZSkge1xuICAgICAgICBpZiAoIXVuY29udHJvbGxlZEVsZW1lbnRzU2V0LmhhcyhlbGVtZW50KSAmJiBjb250cm9sQXR0cmlidXRlKSB7XG4gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5jb250cm9sbGVkRWxlbWVudHNTZXQuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgaWYgKCFtYXJrZXJWYWx1ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShtYXJrZXJOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsb2NrQ291bnQtLTtcbiAgICBpZiAoIWxvY2tDb3VudCkge1xuICAgICAgY291bnRlck1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICBjb3VudGVyTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHVuY29udHJvbGxlZEVsZW1lbnRzU2V0ID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgIG1hcmtlck1hcCA9IHt9O1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIG1hcmtPdGhlcnMoYXZvaWRFbGVtZW50cywgYXJpYUhpZGRlbiwgaW5lcnQpIHtcbiAgaWYgKGFyaWFIaWRkZW4gPT09IHZvaWQgMCkge1xuICAgIGFyaWFIaWRkZW4gPSBmYWxzZTtcbiAgfVxuICBpZiAoaW5lcnQgPT09IHZvaWQgMCkge1xuICAgIGluZXJ0ID0gZmFsc2U7XG4gIH1cbiAgY29uc3QgYm9keSA9IGdldERvY3VtZW50KGF2b2lkRWxlbWVudHNbMF0pLmJvZHk7XG4gIHJldHVybiBhcHBseUF0dHJpYnV0ZVRvT3RoZXJzKGF2b2lkRWxlbWVudHMuY29uY2F0KEFycmF5LmZyb20oYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbYXJpYS1saXZlXScpKSksIGJvZHksIGFyaWFIaWRkZW4sIGluZXJ0KTtcbn1cblxuY29uc3QgZ2V0VGFiYmFibGVPcHRpb25zID0gKCkgPT4gKHtcbiAgZ2V0U2hhZG93Um9vdDogdHJ1ZSxcbiAgZGlzcGxheUNoZWNrOlxuICAvLyBKU0RPTSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgdGFiYmFibGVgIGxpYnJhcnkuIFRvIHNvbHZlIHRoaXMgd2UgY2FuXG4gIC8vIGNoZWNrIGlmIGBSZXNpemVPYnNlcnZlcmAgaXMgYSByZWFsIGZ1bmN0aW9uIChub3QgcG9seWZpbGxlZCksIHdoaWNoXG4gIC8vIGRldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgSlNET00tbGlrZS5cbiAgdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAnZnVuY3Rpb24nICYmIFJlc2l6ZU9ic2VydmVyLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1tuYXRpdmUgY29kZV0nKSA/ICdmdWxsJyA6ICdub25lJ1xufSk7XG5mdW5jdGlvbiBnZXRUYWJiYWJsZUluKGNvbnRhaW5lciwgZGlyZWN0aW9uKSB7XG4gIGNvbnN0IGFsbFRhYmJhYmxlID0gdGFiYmFibGUoY29udGFpbmVyLCBnZXRUYWJiYWJsZU9wdGlvbnMoKSk7XG4gIGlmIChkaXJlY3Rpb24gPT09ICdwcmV2Jykge1xuICAgIGFsbFRhYmJhYmxlLnJldmVyc2UoKTtcbiAgfVxuICBjb25zdCBhY3RpdmVJbmRleCA9IGFsbFRhYmJhYmxlLmluZGV4T2YoYWN0aXZlRWxlbWVudChnZXREb2N1bWVudChjb250YWluZXIpKSk7XG4gIGNvbnN0IG5leHRUYWJiYWJsZUVsZW1lbnRzID0gYWxsVGFiYmFibGUuc2xpY2UoYWN0aXZlSW5kZXggKyAxKTtcbiAgcmV0dXJuIG5leHRUYWJiYWJsZUVsZW1lbnRzWzBdO1xufVxuZnVuY3Rpb24gZ2V0TmV4dFRhYmJhYmxlKCkge1xuICByZXR1cm4gZ2V0VGFiYmFibGVJbihkb2N1bWVudC5ib2R5LCAnbmV4dCcpO1xufVxuZnVuY3Rpb24gZ2V0UHJldmlvdXNUYWJiYWJsZSgpIHtcbiAgcmV0dXJuIGdldFRhYmJhYmxlSW4oZG9jdW1lbnQuYm9keSwgJ3ByZXYnKTtcbn1cbmZ1bmN0aW9uIGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBjb250YWluZXIpIHtcbiAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lciB8fCBldmVudC5jdXJyZW50VGFyZ2V0O1xuICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgcmV0dXJuICFyZWxhdGVkVGFyZ2V0IHx8ICFjb250YWlucyhjb250YWluZXJFbGVtZW50LCByZWxhdGVkVGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIGRpc2FibGVGb2N1c0luc2lkZShjb250YWluZXIpIHtcbiAgY29uc3QgdGFiYmFibGVFbGVtZW50cyA9IHRhYmJhYmxlKGNvbnRhaW5lciwgZ2V0VGFiYmFibGVPcHRpb25zKCkpO1xuICB0YWJiYWJsZUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgZWxlbWVudC5kYXRhc2V0LnRhYmluZGV4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JykgfHwgJyc7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZW5hYmxlRm9jdXNJbnNpZGUoY29udGFpbmVyKSB7XG4gIGNvbnN0IGVsZW1lbnRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRhYmluZGV4XScpO1xuICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IHRhYmluZGV4ID0gZWxlbWVudC5kYXRhc2V0LnRhYmluZGV4O1xuICAgIGRlbGV0ZSBlbGVtZW50LmRhdGFzZXQudGFiaW5kZXg7XG4gICAgaWYgKHRhYmluZGV4KSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCB0YWJpbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRDbG9zZXN0VGFiYmFibGVFbGVtZW50KHRhYmJhYmxlRWxlbWVudHMsIGVsZW1lbnQsIGZsb2F0aW5nKSB7XG4gIGNvbnN0IGVsZW1lbnRJbmRleCA9IHRhYmJhYmxlRWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTtcbiAgZnVuY3Rpb24gdHJhdmVyc2VUYWJiYWJsZUVsZW1lbnRzKG5leHQpIHtcbiAgICBjb25zdCBhdHRyID0gY3JlYXRlQXR0cmlidXRlKCdmb2N1cy1ndWFyZCcpO1xuICAgIGxldCBpbmRleCA9IGVsZW1lbnRJbmRleCArIChuZXh0ID8gMSA6IDApO1xuICAgIGxldCBjdXJyZW50RWxlbWVudCA9IHRhYmJhYmxlRWxlbWVudHNbaW5kZXhdO1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCAmJiAoIWN1cnJlbnRFbGVtZW50LmlzQ29ubmVjdGVkIHx8IGN1cnJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSB8fCBjb250YWlucyhmbG9hdGluZywgY3VycmVudEVsZW1lbnQpKSkge1xuICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4LS07XG4gICAgICB9XG4gICAgICBjdXJyZW50RWxlbWVudCA9IHRhYmJhYmxlRWxlbWVudHNbaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XG4gIH1cblxuICAvLyBGaXJzdCwgdHJ5IHRvIGZpbmQgdGhlIG5leHQgdGFiYmFibGUgZWxlbWVudFxuICBjb25zdCBuZXh0ID0gdHJhdmVyc2VUYWJiYWJsZUVsZW1lbnRzKHRydWUpO1xuICBpZiAobmV4dCkge1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgLy8gSWYgd2UgY2FuJ3QgZmluZCBhIG5leHQgdGFiYmFibGUgZWxlbWVudCwgdHJ5IHRvIGZpbmQgdGhlIHByZXZpb3VzIG9uZVxuICByZXR1cm4gdHJhdmVyc2VUYWJiYWJsZUVsZW1lbnRzKGZhbHNlKTtcbn1cblxuLy8gU2VlIERpZWdvIEhheidzIFNhbmRib3ggZm9yIG1ha2luZyB0aGlzIGxvZ2ljIHdvcmsgd2VsbCBvbiBTYWZhcmkvaU9TOlxuLy8gaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3RhYmJhYmxlLXBvcnRhbC1mNHRuZz9maWxlPS9zcmMvRm9jdXNUcmFwLnRzeFxuXG5jb25zdCBISURERU5fU1RZTEVTID0ge1xuICBib3JkZXI6IDAsXG4gIGNsaXA6ICdyZWN0KDAgMCAwIDApJyxcbiAgaGVpZ2h0OiAnMXB4JyxcbiAgbWFyZ2luOiAnLTFweCcsXG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgcGFkZGluZzogMCxcbiAgcG9zaXRpb246ICdmaXhlZCcsXG4gIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICB3aWR0aDogJzFweCcsXG4gIHRvcDogMCxcbiAgbGVmdDogMFxufTtcbmxldCB0aW1lb3V0SWQ7XG5mdW5jdGlvbiBzZXRBY3RpdmVFbGVtZW50T25UYWIoZXZlbnQpIHtcbiAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICBldmVudC50YXJnZXQ7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gIH1cbn1cbmNvbnN0IEZvY3VzR3VhcmQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb2N1c0d1YXJkKHByb3BzLCByZWYpIHtcbiAgY29uc3QgW3JvbGUsIHNldFJvbGVdID0gUmVhY3QudXNlU3RhdGUoKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChpc1NhZmFyaSgpKSB7XG4gICAgICAvLyBVbmxpa2Ugb3RoZXIgc2NyZWVuIHJlYWRlcnMgc3VjaCBhcyBOVkRBIGFuZCBKQVdTLCB0aGUgdmlydHVhbCBjdXJzb3JcbiAgICAgIC8vIG9uIFZvaWNlT3ZlciBkb2VzIHRyaWdnZXIgdGhlIG9uRm9jdXMgZXZlbnQsIHNvIHdlIGNhbiB1c2UgdGhlIGZvY3VzXG4gICAgICAvLyB0cmFwIGVsZW1lbnQuIE9uIFNhZmFyaSwgb25seSBidXR0b25zIHRyaWdnZXIgdGhlIG9uRm9jdXMgZXZlbnQuXG4gICAgICAvLyBOQjogXCJncm91cFwiIHJvbGUgaW4gdGhlIFNhbmRib3ggbm8gbG9uZ2VyIGFwcGVhcnMgdG8gd29yaywgbXVzdCBiZSBhXG4gICAgICAvLyBidXR0b24gcm9sZS5cbiAgICAgIHNldFJvbGUoJ2J1dHRvbicpO1xuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgc2V0QWN0aXZlRWxlbWVudE9uVGFiKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHNldEFjdGl2ZUVsZW1lbnRPblRhYik7XG4gICAgfTtcbiAgfSwgW10pO1xuICBjb25zdCByZXN0UHJvcHMgPSB7XG4gICAgcmVmLFxuICAgIHRhYkluZGV4OiAwLFxuICAgIC8vIFJvbGUgaXMgb25seSBmb3IgVm9pY2VPdmVyXG4gICAgcm9sZSxcbiAgICAnYXJpYS1oaWRkZW4nOiByb2xlID8gdW5kZWZpbmVkIDogdHJ1ZSxcbiAgICBbY3JlYXRlQXR0cmlidXRlKCdmb2N1cy1ndWFyZCcpXTogJycsXG4gICAgc3R5bGU6IEhJRERFTl9TVFlMRVNcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHJlc3RQcm9wcykpO1xufSk7XG5cbmNvbnN0IFBvcnRhbENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmNvbnN0IGF0dHIgPSAvKiNfX1BVUkVfXyovY3JlYXRlQXR0cmlidXRlKCdwb3J0YWwnKTtcbi8qKlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nUG9ydGFsI3VzZWZsb2F0aW5ncG9ydGFsbm9kZVxuICovXG5mdW5jdGlvbiB1c2VGbG9hdGluZ1BvcnRhbE5vZGUocHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICByb290XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdW5pcXVlSWQgPSB1c2VJZCgpO1xuICBjb25zdCBwb3J0YWxDb250ZXh0ID0gdXNlUG9ydGFsQ29udGV4dCgpO1xuICBjb25zdCBbcG9ydGFsTm9kZSwgc2V0UG9ydGFsTm9kZV0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgcG9ydGFsTm9kZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBwb3J0YWxOb2RlID09IG51bGwgfHwgcG9ydGFsTm9kZS5yZW1vdmUoKTtcbiAgICAgIC8vIEFsbG93IHRoZSBzdWJzZXF1ZW50IGxheW91dCBlZmZlY3RzIHRvIGNyZWF0ZSBhIG5ldyBub2RlIG9uIHVwZGF0ZXMuXG4gICAgICAvLyBUaGUgcG9ydGFsIG5vZGUgd2lsbCBzdGlsbCBiZSBjbGVhbmVkIHVwIG9uIHVubW91bnQuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzI0NTRcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgcG9ydGFsTm9kZVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sIFtwb3J0YWxOb2RlXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICAvLyBXYWl0IGZvciB0aGUgdW5pcXVlSWQgdG8gYmUgZ2VuZXJhdGVkIGJlZm9yZSBjcmVhdGluZyB0aGUgcG9ydGFsIG5vZGUgaW5cbiAgICAvLyBSZWFjdCA8MTggKHVzaW5nIGB1c2VGbG9hdGluZ0lkYCBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgYHVzZUlkYCkuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yNzc4XG4gICAgaWYgKCF1bmlxdWVJZCkgcmV0dXJuO1xuICAgIGlmIChwb3J0YWxOb2RlUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBjb25zdCBleGlzdGluZ0lkUm9vdCA9IGlkID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIDogbnVsbDtcbiAgICBpZiAoIWV4aXN0aW5nSWRSb290KSByZXR1cm47XG4gICAgY29uc3Qgc3ViUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN1YlJvb3QuaWQgPSB1bmlxdWVJZDtcbiAgICBzdWJSb290LnNldEF0dHJpYnV0ZShhdHRyLCAnJyk7XG4gICAgZXhpc3RpbmdJZFJvb3QuYXBwZW5kQ2hpbGQoc3ViUm9vdCk7XG4gICAgcG9ydGFsTm9kZVJlZi5jdXJyZW50ID0gc3ViUm9vdDtcbiAgICBzZXRQb3J0YWxOb2RlKHN1YlJvb3QpO1xuICB9LCBbaWQsIHVuaXF1ZUlkXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIXVuaXF1ZUlkKSByZXR1cm47XG4gICAgaWYgKHBvcnRhbE5vZGVSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIGxldCBjb250YWluZXIgPSByb290IHx8IChwb3J0YWxDb250ZXh0ID09IG51bGwgPyB2b2lkIDAgOiBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpO1xuICAgIGlmIChjb250YWluZXIgJiYgIWlzRWxlbWVudChjb250YWluZXIpKSBjb250YWluZXIgPSBjb250YWluZXIuY3VycmVudDtcbiAgICBjb250YWluZXIgPSBjb250YWluZXIgfHwgZG9jdW1lbnQuYm9keTtcbiAgICBsZXQgaWRXcmFwcGVyID0gbnVsbDtcbiAgICBpZiAoaWQpIHtcbiAgICAgIGlkV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgaWRXcmFwcGVyLmlkID0gaWQ7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWRXcmFwcGVyKTtcbiAgICB9XG4gICAgY29uc3Qgc3ViUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN1YlJvb3QuaWQgPSB1bmlxdWVJZDtcbiAgICBzdWJSb290LnNldEF0dHJpYnV0ZShhdHRyLCAnJyk7XG4gICAgY29udGFpbmVyID0gaWRXcmFwcGVyIHx8IGNvbnRhaW5lcjtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3ViUm9vdCk7XG4gICAgcG9ydGFsTm9kZVJlZi5jdXJyZW50ID0gc3ViUm9vdDtcbiAgICBzZXRQb3J0YWxOb2RlKHN1YlJvb3QpO1xuICB9LCBbaWQsIHJvb3QsIHVuaXF1ZUlkLCBwb3J0YWxDb250ZXh0XSk7XG4gIHJldHVybiBwb3J0YWxOb2RlO1xufVxuLyoqXG4gKiBQb3J0YWxzIHRoZSBmbG9hdGluZyBlbGVtZW50IGludG8gYSBnaXZlbiBjb250YWluZXIgZWxlbWVudCDigJQgYnkgZGVmYXVsdCxcbiAqIG91dHNpZGUgb2YgdGhlIGFwcCByb290IGFuZCBpbnRvIHRoZSBib2R5LlxuICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZSBmbG9hdGluZyBlbGVtZW50IGNhbiBhcHBlYXIgb3V0c2lkZSBhbnlcbiAqIHBvdGVudGlhbCBwYXJlbnQgY29udGFpbmVycyB0aGF0IGNhdXNlIGNsaXBwaW5nIChzdWNoIGFzIGBvdmVyZmxvdzogaGlkZGVuYCksXG4gKiB3aGlsZSByZXRhaW5pbmcgaXRzIGxvY2F0aW9uIGluIHRoZSBSZWFjdCB0cmVlLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nUG9ydGFsXG4gKi9cbmZ1bmN0aW9uIEZsb2F0aW5nUG9ydGFsKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBpZCxcbiAgICByb290ID0gbnVsbCxcbiAgICBwcmVzZXJ2ZVRhYk9yZGVyID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHBvcnRhbE5vZGUgPSB1c2VGbG9hdGluZ1BvcnRhbE5vZGUoe1xuICAgIGlkLFxuICAgIHJvb3RcbiAgfSk7XG4gIGNvbnN0IFtmb2N1c01hbmFnZXJTdGF0ZSwgc2V0Rm9jdXNNYW5hZ2VyU3RhdGVdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IGJlZm9yZU91dHNpZGVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGFmdGVyT3V0c2lkZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgYmVmb3JlSW5zaWRlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBhZnRlckluc2lkZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qgc2hvdWxkUmVuZGVyR3VhcmRzID1cbiAgLy8gVGhlIEZvY3VzTWFuYWdlciBhbmQgdGhlcmVmb3JlIGZsb2F0aW5nIGVsZW1lbnQgYXJlIGN1cnJlbnRseSBvcGVuL1xuICAvLyByZW5kZXJlZC5cbiAgISFmb2N1c01hbmFnZXJTdGF0ZSAmJlxuICAvLyBHdWFyZHMgYXJlIG9ubHkgZm9yIG5vbi1tb2RhbCBmb2N1cyBtYW5hZ2VtZW50LlxuICAhZm9jdXNNYW5hZ2VyU3RhdGUubW9kYWwgJiZcbiAgLy8gRG9uJ3QgcmVuZGVyIGlmIHVubW91bnQgaXMgdHJhbnNpdGlvbmluZy5cbiAgZm9jdXNNYW5hZ2VyU3RhdGUub3BlbiAmJiBwcmVzZXJ2ZVRhYk9yZGVyICYmICEhKHJvb3QgfHwgcG9ydGFsTm9kZSk7XG5cbiAgLy8gaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3RhYmJhYmxlLXBvcnRhbC1mNHRuZz9maWxlPS9zcmMvVGFiYmFibGVQb3J0YWwudHN4XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFwb3J0YWxOb2RlIHx8ICFwcmVzZXJ2ZVRhYk9yZGVyIHx8IGZvY3VzTWFuYWdlclN0YXRlICE9IG51bGwgJiYgZm9jdXNNYW5hZ2VyU3RhdGUubW9kYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHN1cmUgZWxlbWVudHMgaW5zaWRlIHRoZSBwb3J0YWwgZWxlbWVudCBhcmUgdGFiYmFibGUgb25seSB3aGVuIHRoZVxuICAgIC8vIHBvcnRhbCBoYXMgYWxyZWFkeSBiZWVuIGZvY3VzZWQsIGVpdGhlciBieSB0YWJiaW5nIGludG8gYSBmb2N1cyB0cmFwXG4gICAgLy8gZWxlbWVudCBvdXRzaWRlIG9yIHVzaW5nIHRoZSBtb3VzZS5cbiAgICBmdW5jdGlvbiBvbkZvY3VzKGV2ZW50KSB7XG4gICAgICBpZiAocG9ydGFsTm9kZSAmJiBpc091dHNpZGVFdmVudChldmVudCkpIHtcbiAgICAgICAgY29uc3QgZm9jdXNpbmcgPSBldmVudC50eXBlID09PSAnZm9jdXNpbic7XG4gICAgICAgIGNvbnN0IG1hbmFnZUZvY3VzID0gZm9jdXNpbmcgPyBlbmFibGVGb2N1c0luc2lkZSA6IGRpc2FibGVGb2N1c0luc2lkZTtcbiAgICAgICAgbWFuYWdlRm9jdXMocG9ydGFsTm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIExpc3RlbiB0byB0aGUgZXZlbnQgb24gdGhlIGNhcHR1cmUgcGhhc2Ugc28gdGhleSBydW4gYmVmb3JlIHRoZSBmb2N1c1xuICAgIC8vIHRyYXAgZWxlbWVudHMgb25Gb2N1cyBwcm9wIGlzIGNhbGxlZC5cbiAgICBwb3J0YWxOb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvbkZvY3VzLCB0cnVlKTtcbiAgICBwb3J0YWxOb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25Gb2N1cywgdHJ1ZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHBvcnRhbE5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG9uRm9jdXMsIHRydWUpO1xuICAgICAgcG9ydGFsTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXMsIHRydWUpO1xuICAgIH07XG4gIH0sIFtwb3J0YWxOb2RlLCBwcmVzZXJ2ZVRhYk9yZGVyLCBmb2N1c01hbmFnZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogZm9jdXNNYW5hZ2VyU3RhdGUubW9kYWxdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgICAgcHJlc2VydmVUYWJPcmRlcixcbiAgICAgIGJlZm9yZU91dHNpZGVSZWYsXG4gICAgICBhZnRlck91dHNpZGVSZWYsXG4gICAgICBiZWZvcmVJbnNpZGVSZWYsXG4gICAgICBhZnRlckluc2lkZVJlZixcbiAgICAgIHBvcnRhbE5vZGUsXG4gICAgICBzZXRGb2N1c01hbmFnZXJTdGF0ZVxuICAgIH0pLCBbcHJlc2VydmVUYWJPcmRlciwgcG9ydGFsTm9kZV0pXG4gIH0sIHNob3VsZFJlbmRlckd1YXJkcyAmJiBwb3J0YWxOb2RlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzR3VhcmQsIHtcbiAgICBcImRhdGEtdHlwZVwiOiBcIm91dHNpZGVcIixcbiAgICByZWY6IGJlZm9yZU91dHNpZGVSZWYsXG4gICAgb25Gb2N1czogZXZlbnQgPT4ge1xuICAgICAgaWYgKGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBwb3J0YWxOb2RlKSkge1xuICAgICAgICB2YXIgX2JlZm9yZUluc2lkZVJlZiRjdXJyO1xuICAgICAgICAoX2JlZm9yZUluc2lkZVJlZiRjdXJyID0gYmVmb3JlSW5zaWRlUmVmLmN1cnJlbnQpID09IG51bGwgfHwgX2JlZm9yZUluc2lkZVJlZiRjdXJyLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcmV2VGFiYmFibGUgPSBnZXRQcmV2aW91c1RhYmJhYmxlKCkgfHwgKGZvY3VzTWFuYWdlclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBmb2N1c01hbmFnZXJTdGF0ZS5yZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KTtcbiAgICAgICAgcHJldlRhYmJhYmxlID09IG51bGwgfHwgcHJldlRhYmJhYmxlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9KSwgc2hvdWxkUmVuZGVyR3VhcmRzICYmIHBvcnRhbE5vZGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBcImFyaWEtb3duc1wiOiBwb3J0YWxOb2RlLmlkLFxuICAgIHN0eWxlOiBISURERU5fU1RZTEVTXG4gIH0pLCBwb3J0YWxOb2RlICYmIC8qI19fUFVSRV9fKi9SZWFjdERPTS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHBvcnRhbE5vZGUpLCBzaG91bGRSZW5kZXJHdWFyZHMgJiYgcG9ydGFsTm9kZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0d1YXJkLCB7XG4gICAgXCJkYXRhLXR5cGVcIjogXCJvdXRzaWRlXCIsXG4gICAgcmVmOiBhZnRlck91dHNpZGVSZWYsXG4gICAgb25Gb2N1czogZXZlbnQgPT4ge1xuICAgICAgaWYgKGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBwb3J0YWxOb2RlKSkge1xuICAgICAgICB2YXIgX2FmdGVySW5zaWRlUmVmJGN1cnJlO1xuICAgICAgICAoX2FmdGVySW5zaWRlUmVmJGN1cnJlID0gYWZ0ZXJJbnNpZGVSZWYuY3VycmVudCkgPT0gbnVsbCB8fCBfYWZ0ZXJJbnNpZGVSZWYkY3VycmUuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHRUYWJiYWJsZSA9IGdldE5leHRUYWJiYWJsZSgpIHx8IChmb2N1c01hbmFnZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogZm9jdXNNYW5hZ2VyU3RhdGUucmVmcy5kb21SZWZlcmVuY2UuY3VycmVudCk7XG4gICAgICAgIG5leHRUYWJiYWJsZSA9PSBudWxsIHx8IG5leHRUYWJiYWJsZS5mb2N1cygpO1xuICAgICAgICAoZm9jdXNNYW5hZ2VyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGZvY3VzTWFuYWdlclN0YXRlLmNsb3NlT25Gb2N1c091dCkgJiYgKGZvY3VzTWFuYWdlclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBmb2N1c01hbmFnZXJTdGF0ZS5vbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9KSk7XG59XG5jb25zdCB1c2VQb3J0YWxDb250ZXh0ID0gKCkgPT4gUmVhY3QudXNlQ29udGV4dChQb3J0YWxDb250ZXh0KTtcblxuY29uc3QgTElTVF9MSU1JVCA9IDIwO1xubGV0IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMgPSBbXTtcbmZ1bmN0aW9uIGFkZFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudChlbGVtZW50KSB7XG4gIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMgPSBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzLmZpbHRlcihlbCA9PiBlbC5pc0Nvbm5lY3RlZCk7XG4gIGxldCB0YWJiYWJsZUVsID0gZWxlbWVudDtcbiAgaWYgKCF0YWJiYWJsZUVsIHx8IGdldE5vZGVOYW1lKHRhYmJhYmxlRWwpID09PSAnYm9keScpIHJldHVybjtcbiAgaWYgKCFpc1RhYmJhYmxlKHRhYmJhYmxlRWwsIGdldFRhYmJhYmxlT3B0aW9ucygpKSkge1xuICAgIGNvbnN0IHRhYmJhYmxlQ2hpbGQgPSB0YWJiYWJsZSh0YWJiYWJsZUVsLCBnZXRUYWJiYWJsZU9wdGlvbnMoKSlbMF07XG4gICAgaWYgKHRhYmJhYmxlQ2hpbGQpIHtcbiAgICAgIHRhYmJhYmxlRWwgPSB0YWJiYWJsZUNoaWxkO1xuICAgIH1cbiAgfVxuICBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzLnB1c2godGFiYmFibGVFbCk7XG4gIGlmIChwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzLmxlbmd0aCA+IExJU1RfTElNSVQpIHtcbiAgICBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzID0gcHJldmlvdXNseUZvY3VzZWRFbGVtZW50cy5zbGljZSgtTElTVF9MSU1JVCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpIHtcbiAgcmV0dXJuIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMuc2xpY2UoKS5yZXZlcnNlKCkuZmluZChlbCA9PiBlbC5pc0Nvbm5lY3RlZCk7XG59XG5jb25zdCBWaXN1YWxseUhpZGRlbkRpc21pc3MgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBWaXN1YWxseUhpZGRlbkRpc21pc3MocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICByZWY6IHJlZixcbiAgICB0YWJJbmRleDogLTEsXG4gICAgc3R5bGU6IEhJRERFTl9TVFlMRVNcbiAgfSkpO1xufSk7XG4vKipcbiAqIFByb3ZpZGVzIGZvY3VzIG1hbmFnZW1lbnQgZm9yIHRoZSBmbG9hdGluZyBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nRm9jdXNNYW5hZ2VyXG4gKi9cbmZ1bmN0aW9uIEZsb2F0aW5nRm9jdXNNYW5hZ2VyKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjb250ZXh0LFxuICAgIGNoaWxkcmVuLFxuICAgIGRpc2FibGVkID0gZmFsc2UsXG4gICAgb3JkZXIgPSBbJ2NvbnRlbnQnXSxcbiAgICBndWFyZHM6IF9ndWFyZHMgPSB0cnVlLFxuICAgIGluaXRpYWxGb2N1cyA9IDAsXG4gICAgcmV0dXJuRm9jdXMgPSB0cnVlLFxuICAgIHJlc3RvcmVGb2N1cyA9IGZhbHNlLFxuICAgIG1vZGFsID0gdHJ1ZSxcbiAgICB2aXN1YWxseUhpZGRlbkRpc21pc3MgPSBmYWxzZSxcbiAgICBjbG9zZU9uRm9jdXNPdXQgPSB0cnVlXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgcmVmcyxcbiAgICBub2RlSWQsXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGV2ZW50cyxcbiAgICBkYXRhUmVmLFxuICAgIGZsb2F0aW5nSWQsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGRvbVJlZmVyZW5jZSxcbiAgICAgIGZsb2F0aW5nXG4gICAgfVxuICB9ID0gY29udGV4dDtcbiAgY29uc3QgaWdub3JlSW5pdGlhbEZvY3VzID0gdHlwZW9mIGluaXRpYWxGb2N1cyA9PT0gJ251bWJlcicgJiYgaW5pdGlhbEZvY3VzIDwgMDtcbiAgLy8gSWYgdGhlIHJlZmVyZW5jZSBpcyBhIGNvbWJvYm94IGFuZCBpcyB0eXBlYWJsZSAoZS5nLiBpbnB1dC90ZXh0YXJlYSksXG4gIC8vIHRoZXJlIGFyZSBkaWZmZXJlbnQgZm9jdXMgc2VtYW50aWNzLiBUaGUgZ3VhcmRzIHNob3VsZCBub3QgYmUgcmVuZGVyZWQsIGJ1dFxuICAvLyBhcmlhLWhpZGRlbiBzaG91bGQgYmUgYXBwbGllZCB0byBhbGwgbm9kZXMgc3RpbGwuIEZ1cnRoZXIsIHRoZSB2aXN1YWxseVxuICAvLyBoaWRkZW4gZGlzbWlzcyBidXR0b24gc2hvdWxkIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIG5vdCB0aGVcbiAgLy8gc3RhcnQuXG4gIGNvbnN0IGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCA9IGlzVHlwZWFibGVDb21ib2JveChkb21SZWZlcmVuY2UpICYmIGlnbm9yZUluaXRpYWxGb2N1cztcblxuICAvLyBGb3JjZSB0aGUgZ3VhcmRzIHRvIGJlIHJlbmRlcmVkIGlmIHRoZSBgaW5lcnRgIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkLlxuICBjb25zdCBndWFyZHMgPSBzdXBwb3J0c0luZXJ0KCkgPyBfZ3VhcmRzIDogdHJ1ZTtcbiAgY29uc3Qgb3JkZXJSZWYgPSB1c2VMYXRlc3RSZWYob3JkZXIpO1xuICBjb25zdCBpbml0aWFsRm9jdXNSZWYgPSB1c2VMYXRlc3RSZWYoaW5pdGlhbEZvY3VzKTtcbiAgY29uc3QgcmV0dXJuRm9jdXNSZWYgPSB1c2VMYXRlc3RSZWYocmV0dXJuRm9jdXMpO1xuICBjb25zdCB0cmVlID0gdXNlRmxvYXRpbmdUcmVlKCk7XG4gIGNvbnN0IHBvcnRhbENvbnRleHQgPSB1c2VQb3J0YWxDb250ZXh0KCk7XG4gIGNvbnN0IHN0YXJ0RGlzbWlzc0J1dHRvblJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgZW5kRGlzbWlzc0J1dHRvblJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgcHJldmVudFJldHVybkZvY3VzUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgaXNQb2ludGVyRG93blJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHRhYmJhYmxlSW5kZXhSZWYgPSBSZWFjdC51c2VSZWYoLTEpO1xuICBjb25zdCBpc0luc2lkZVBvcnRhbCA9IHBvcnRhbENvbnRleHQgIT0gbnVsbDtcbiAgY29uc3QgZmlyc3RFbGVtZW50Q2hpbGQgPSBmbG9hdGluZyA9PSBudWxsID8gdm9pZCAwIDogZmxvYXRpbmcuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gIC8vIElmIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzIGFjdGluZyBhcyBhIHBvc2l0aW9uaW5nIHdyYXBwZXIgcmF0aGVyIHRoYW4gdGhlXG4gIC8vIGVsZW1lbnQgdGhhdCByZWNlaXZlcyBhcmlhIHByb3BzLCB1c2UgaXQgYXMgdGhlIGZvY3VzIHJvb3QgaW5zdGVhZC5cbiAgY29uc3QgZmxvYXRpbmdGb2N1c05vZGUgPSAoZmlyc3RFbGVtZW50Q2hpbGQgPT0gbnVsbCA/IHZvaWQgMCA6IGZpcnN0RWxlbWVudENoaWxkLmlkKSA9PT0gZmxvYXRpbmdJZCA/IGZpcnN0RWxlbWVudENoaWxkIDogZmxvYXRpbmc7XG4gIGNvbnN0IGdldFRhYmJhYmxlQ29udGVudCA9IHVzZUVmZmVjdEV2ZW50KGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICBpZiAoY29udGFpbmVyID09PSB2b2lkIDApIHtcbiAgICAgIGNvbnRhaW5lciA9IGZsb2F0aW5nRm9jdXNOb2RlO1xuICAgIH1cbiAgICByZXR1cm4gY29udGFpbmVyID8gdGFiYmFibGUoY29udGFpbmVyLCBnZXRUYWJiYWJsZU9wdGlvbnMoKSkgOiBbXTtcbiAgfSk7XG4gIGNvbnN0IGdldFRhYmJhYmxlRWxlbWVudHMgPSB1c2VFZmZlY3RFdmVudChjb250YWluZXIgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBnZXRUYWJiYWJsZUNvbnRlbnQoY29udGFpbmVyKTtcbiAgICByZXR1cm4gb3JkZXJSZWYuY3VycmVudC5tYXAodHlwZSA9PiB7XG4gICAgICBpZiAoZG9tUmVmZXJlbmNlICYmIHR5cGUgPT09ICdyZWZlcmVuY2UnKSB7XG4gICAgICAgIHJldHVybiBkb21SZWZlcmVuY2U7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmdGb2N1c05vZGUgJiYgdHlwZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgICByZXR1cm4gZmxvYXRpbmdGb2N1c05vZGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5maWx0ZXIoQm9vbGVhbikuZmxhdCgpO1xuICB9KTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBpZiAoIW1vZGFsKSByZXR1cm47XG4gICAgZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgICAvLyBUaGUgZm9jdXMgZ3VhcmRzIGhhdmUgbm90aGluZyB0byBmb2N1cywgc28gd2UgbmVlZCB0byBzdG9wIHRoZSBldmVudC5cbiAgICAgICAgaWYgKGNvbnRhaW5zKGZsb2F0aW5nRm9jdXNOb2RlLCBhY3RpdmVFbGVtZW50KGdldERvY3VtZW50KGZsb2F0aW5nRm9jdXNOb2RlKSkpICYmIGdldFRhYmJhYmxlQ29udGVudCgpLmxlbmd0aCA9PT0gMCAmJiAhaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94KSB7XG4gICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbHMgPSBnZXRUYWJiYWJsZUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudCk7XG4gICAgICAgIGlmIChvcmRlclJlZi5jdXJyZW50WzBdID09PSAncmVmZXJlbmNlJyAmJiB0YXJnZXQgPT09IGRvbVJlZmVyZW5jZSkge1xuICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBlbnF1ZXVlRm9jdXMoZWxzW2Vscy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVucXVldWVGb2N1cyhlbHNbMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3JkZXJSZWYuY3VycmVudFsxXSA9PT0gJ2Zsb2F0aW5nJyAmJiB0YXJnZXQgPT09IGZsb2F0aW5nRm9jdXNOb2RlICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICBlbnF1ZXVlRm9jdXMoZWxzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkb2MgPSBnZXREb2N1bWVudChmbG9hdGluZ0ZvY3VzTm9kZSk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93bik7XG4gICAgfTtcbiAgfSwgW2Rpc2FibGVkLCBkb21SZWZlcmVuY2UsIGZsb2F0aW5nRm9jdXNOb2RlLCBtb2RhbCwgb3JkZXJSZWYsIGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCwgZ2V0VGFiYmFibGVDb250ZW50LCBnZXRUYWJiYWJsZUVsZW1lbnRzXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgaWYgKCFmbG9hdGluZykgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIGhhbmRsZUZvY3VzSW4oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudCk7XG4gICAgICBjb25zdCB0YWJiYWJsZUNvbnRlbnQgPSBnZXRUYWJiYWJsZUNvbnRlbnQoKTtcbiAgICAgIGNvbnN0IHRhYmJhYmxlSW5kZXggPSB0YWJiYWJsZUNvbnRlbnQuaW5kZXhPZih0YXJnZXQpO1xuICAgICAgaWYgKHRhYmJhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRhYmJhYmxlSW5kZXhSZWYuY3VycmVudCA9IHRhYmJhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIGZsb2F0aW5nLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBoYW5kbGVGb2N1c0luKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZmxvYXRpbmcucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGhhbmRsZUZvY3VzSW4pO1xuICAgIH07XG4gIH0sIFtkaXNhYmxlZCwgZmxvYXRpbmcsIGdldFRhYmJhYmxlQ29udGVudF0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgIGlmICghY2xvc2VPbkZvY3VzT3V0KSByZXR1cm47XG5cbiAgICAvLyBJbiBTYWZhcmksIGJ1dHRvbnMgbG9zZSBmb2N1cyB3aGVuIHByZXNzaW5nIHRoZW0uXG4gICAgZnVuY3Rpb24gaGFuZGxlUG9pbnRlckRvd24oKSB7XG4gICAgICBpc1BvaW50ZXJEb3duUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlzUG9pbnRlckRvd25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZUZvY3VzT3V0c2lkZShldmVudCkge1xuICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vdmVkVG9VbnJlbGF0ZWROb2RlID0gIShjb250YWlucyhkb21SZWZlcmVuY2UsIHJlbGF0ZWRUYXJnZXQpIHx8IGNvbnRhaW5zKGZsb2F0aW5nLCByZWxhdGVkVGFyZ2V0KSB8fCBjb250YWlucyhyZWxhdGVkVGFyZ2V0LCBmbG9hdGluZykgfHwgY29udGFpbnMocG9ydGFsQ29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlLCByZWxhdGVkVGFyZ2V0KSB8fCByZWxhdGVkVGFyZ2V0ICE9IG51bGwgJiYgcmVsYXRlZFRhcmdldC5oYXNBdHRyaWJ1dGUoY3JlYXRlQXR0cmlidXRlKCdmb2N1cy1ndWFyZCcpKSB8fCB0cmVlICYmIChnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkuZmluZChub2RlID0+IHtcbiAgICAgICAgICB2YXIgX25vZGUkY29udGV4dCwgX25vZGUkY29udGV4dDI7XG4gICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKChfbm9kZSRjb250ZXh0ID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dC5lbGVtZW50cy5mbG9hdGluZywgcmVsYXRlZFRhcmdldCkgfHwgY29udGFpbnMoKF9ub2RlJGNvbnRleHQyID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dDIuZWxlbWVudHMuZG9tUmVmZXJlbmNlLCByZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgfSkgfHwgZ2V0QW5jZXN0b3JzKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKS5maW5kKG5vZGUgPT4ge1xuICAgICAgICAgIHZhciBfbm9kZSRjb250ZXh0MywgX25vZGUkY29udGV4dDQ7XG4gICAgICAgICAgcmV0dXJuICgoX25vZGUkY29udGV4dDMgPSBub2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRjb250ZXh0My5lbGVtZW50cy5mbG9hdGluZykgPT09IHJlbGF0ZWRUYXJnZXQgfHwgKChfbm9kZSRjb250ZXh0NCA9IG5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJGNvbnRleHQ0LmVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgPT09IHJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgIH0pKSk7XG5cbiAgICAgICAgLy8gUmVzdG9yZSBmb2N1cyB0byB0aGUgcHJldmlvdXMgdGFiYmFibGUgZWxlbWVudCBpbmRleCB0byBwcmV2ZW50XG4gICAgICAgIC8vIGZvY3VzIGZyb20gYmVpbmcgbG9zdCBvdXRzaWRlIHRoZSBmbG9hdGluZyB0cmVlLlxuICAgICAgICBpZiAocmVzdG9yZUZvY3VzICYmIG1vdmVkVG9VbnJlbGF0ZWROb2RlICYmIGFjdGl2ZUVsZW1lbnQoZ2V0RG9jdW1lbnQoZmxvYXRpbmdGb2N1c05vZGUpKSA9PT0gZ2V0RG9jdW1lbnQoZmxvYXRpbmdGb2N1c05vZGUpLmJvZHkpIHtcbiAgICAgICAgICAvLyBMZXQgYEZsb2F0aW5nUG9ydGFsYCBlZmZlY3Qga25vd3MgdGhhdCBmb2N1cyBpcyBzdGlsbCBpbnNpZGUgdGhlXG4gICAgICAgICAgLy8gZmxvYXRpbmcgdHJlZS5cbiAgICAgICAgICBpZiAoaXNIVE1MRWxlbWVudChmbG9hdGluZ0ZvY3VzTm9kZSkpIHtcbiAgICAgICAgICAgIGZsb2F0aW5nRm9jdXNOb2RlID09IG51bGwgfHwgZmxvYXRpbmdGb2N1c05vZGUuZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcHJldlRhYmJhYmxlSW5kZXggPSB0YWJiYWJsZUluZGV4UmVmLmN1cnJlbnQ7XG4gICAgICAgICAgY29uc3QgdGFiYmFibGVDb250ZW50ID0gZ2V0VGFiYmFibGVDb250ZW50KCk7XG4gICAgICAgICAgY29uc3Qgbm9kZVRvRm9jdXMgPSB0YWJiYWJsZUNvbnRlbnRbcHJldlRhYmJhYmxlSW5kZXhdIHx8IHRhYmJhYmxlQ29udGVudFt0YWJiYWJsZUNvbnRlbnQubGVuZ3RoIC0gMV0gfHwgZmxvYXRpbmdGb2N1c05vZGU7XG4gICAgICAgICAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZVRvRm9jdXMpKSB7XG4gICAgICAgICAgICBub2RlVG9Gb2N1cy5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvY3VzIGRpZCBub3QgbW92ZSBpbnNpZGUgdGhlIGZsb2F0aW5nIHRyZWUsIGFuZCB0aGVyZSBhcmUgbm8gdGFiYmFibGVcbiAgICAgICAgLy8gcG9ydGFsIGd1YXJkcyB0byBoYW5kbGUgY2xvc2luZy5cbiAgICAgICAgaWYgKChpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3ggPyB0cnVlIDogIW1vZGFsKSAmJiByZWxhdGVkVGFyZ2V0ICYmIG1vdmVkVG9VbnJlbGF0ZWROb2RlICYmICFpc1BvaW50ZXJEb3duUmVmLmN1cnJlbnQgJiZcbiAgICAgICAgLy8gRml4IFJlYWN0IDE4IFN0cmljdCBNb2RlIHJldHVybkZvY3VzIGR1ZSB0byBkb3VibGUgcmVuZGVyaW5nLlxuICAgICAgICByZWxhdGVkVGFyZ2V0ICE9PSBnZXRQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKSkge1xuICAgICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmbG9hdGluZyAmJiBpc0hUTUxFbGVtZW50KGRvbVJlZmVyZW5jZSkpIHtcbiAgICAgIGRvbVJlZmVyZW5jZS5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGhhbmRsZUZvY3VzT3V0c2lkZSk7XG4gICAgICBkb21SZWZlcmVuY2UuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVQb2ludGVyRG93bik7XG4gICAgICBmbG9hdGluZy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGhhbmRsZUZvY3VzT3V0c2lkZSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBkb21SZWZlcmVuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBoYW5kbGVGb2N1c091dHNpZGUpO1xuICAgICAgICBkb21SZWZlcmVuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVQb2ludGVyRG93bik7XG4gICAgICAgIGZsb2F0aW5nLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgaGFuZGxlRm9jdXNPdXRzaWRlKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbZGlzYWJsZWQsIGRvbVJlZmVyZW5jZSwgZmxvYXRpbmcsIGZsb2F0aW5nRm9jdXNOb2RlLCBtb2RhbCwgbm9kZUlkLCB0cmVlLCBwb3J0YWxDb250ZXh0LCBvbk9wZW5DaGFuZ2UsIGNsb3NlT25Gb2N1c091dCwgcmVzdG9yZUZvY3VzLCBnZXRUYWJiYWJsZUNvbnRlbnQsIGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveF0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZhciBfcG9ydGFsQ29udGV4dCRwb3J0YWw7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG5cbiAgICAvLyBEb24ndCBoaWRlIHBvcnRhbHMgbmVzdGVkIHdpdGhpbiB0aGUgcGFyZW50IHBvcnRhbC5cbiAgICBjb25zdCBwb3J0YWxOb2RlcyA9IEFycmF5LmZyb20oKHBvcnRhbENvbnRleHQgPT0gbnVsbCB8fCAoX3BvcnRhbENvbnRleHQkcG9ydGFsID0gcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlKSA9PSBudWxsID8gdm9pZCAwIDogX3BvcnRhbENvbnRleHQkcG9ydGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIgKyBjcmVhdGVBdHRyaWJ1dGUoJ3BvcnRhbCcpICsgXCJdXCIpKSB8fCBbXSk7XG4gICAgaWYgKGZsb2F0aW5nKSB7XG4gICAgICBjb25zdCBpbnNpZGVFbGVtZW50cyA9IFtmbG9hdGluZywgLi4ucG9ydGFsTm9kZXMsIHN0YXJ0RGlzbWlzc0J1dHRvblJlZi5jdXJyZW50LCBlbmREaXNtaXNzQnV0dG9uUmVmLmN1cnJlbnQsIG9yZGVyUmVmLmN1cnJlbnQuaW5jbHVkZXMoJ3JlZmVyZW5jZScpIHx8IGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCA/IGRvbVJlZmVyZW5jZSA6IG51bGxdLmZpbHRlcih4ID0+IHggIT0gbnVsbCk7XG4gICAgICBjb25zdCBjbGVhbnVwID0gbW9kYWwgfHwgaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94ID8gbWFya090aGVycyhpbnNpZGVFbGVtZW50cywgZ3VhcmRzLCAhZ3VhcmRzKSA6IG1hcmtPdGhlcnMoaW5zaWRlRWxlbWVudHMpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlZCwgZG9tUmVmZXJlbmNlLCBmbG9hdGluZywgbW9kYWwsIG9yZGVyUmVmLCBwb3J0YWxDb250ZXh0LCBpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3gsIGd1YXJkc10pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkIHx8ICFpc0hUTUxFbGVtZW50KGZsb2F0aW5nRm9jdXNOb2RlKSkgcmV0dXJuO1xuICAgIGNvbnN0IGRvYyA9IGdldERvY3VtZW50KGZsb2F0aW5nRm9jdXNOb2RlKTtcbiAgICBjb25zdCBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBhY3RpdmVFbGVtZW50KGRvYyk7XG5cbiAgICAvLyBXYWl0IGZvciBhbnkgbGF5b3V0IGVmZmVjdCBzdGF0ZSBzZXR0ZXJzIHRvIGV4ZWN1dGUgdG8gc2V0IGB0YWJJbmRleGAuXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBnZXRUYWJiYWJsZUVsZW1lbnRzKGZsb2F0aW5nRm9jdXNOb2RlKTtcbiAgICAgIGNvbnN0IGluaXRpYWxGb2N1c1ZhbHVlID0gaW5pdGlhbEZvY3VzUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBlbFRvRm9jdXMgPSAodHlwZW9mIGluaXRpYWxGb2N1c1ZhbHVlID09PSAnbnVtYmVyJyA/IGZvY3VzYWJsZUVsZW1lbnRzW2luaXRpYWxGb2N1c1ZhbHVlXSA6IGluaXRpYWxGb2N1c1ZhbHVlLmN1cnJlbnQpIHx8IGZsb2F0aW5nRm9jdXNOb2RlO1xuICAgICAgY29uc3QgZm9jdXNBbHJlYWR5SW5zaWRlRmxvYXRpbmdFbCA9IGNvbnRhaW5zKGZsb2F0aW5nRm9jdXNOb2RlLCBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpO1xuICAgICAgaWYgKCFpZ25vcmVJbml0aWFsRm9jdXMgJiYgIWZvY3VzQWxyZWFkeUluc2lkZUZsb2F0aW5nRWwgJiYgb3Blbikge1xuICAgICAgICBlbnF1ZXVlRm9jdXMoZWxUb0ZvY3VzLCB7XG4gICAgICAgICAgcHJldmVudFNjcm9sbDogZWxUb0ZvY3VzID09PSBmbG9hdGluZ0ZvY3VzTm9kZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW2Rpc2FibGVkLCBvcGVuLCBmbG9hdGluZ0ZvY3VzTm9kZSwgaWdub3JlSW5pdGlhbEZvY3VzLCBnZXRUYWJiYWJsZUVsZW1lbnRzLCBpbml0aWFsRm9jdXNSZWZdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCB8fCAhZmxvYXRpbmdGb2N1c05vZGUpIHJldHVybjtcbiAgICBsZXQgcHJldmVudFJldHVybkZvY3VzU2Nyb2xsID0gZmFsc2U7XG4gICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoZmxvYXRpbmdGb2N1c05vZGUpO1xuICAgIGNvbnN0IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGFjdGl2ZUVsZW1lbnQoZG9jKTtcbiAgICBjb25zdCBjb250ZXh0RGF0YSA9IGRhdGFSZWYuY3VycmVudDtcbiAgICBsZXQgb3BlbkV2ZW50ID0gY29udGV4dERhdGEub3BlbkV2ZW50O1xuICAgIGNvbnN0IGRvbVJlZmVyZW5jZSA9IHJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQ7XG4gICAgYWRkUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCk7XG5cbiAgICAvLyBEaXNtaXNzaW5nIHZpYSBvdXRzaWRlIHByZXNzIHNob3VsZCBhbHdheXMgaWdub3JlIGByZXR1cm5Gb2N1c2AgdG9cbiAgICAvLyBwcmV2ZW50IHVud2FudGVkIHNjcm9sbGluZy5cbiAgICBmdW5jdGlvbiBvbk9wZW5DaGFuZ2UoX3JlZikge1xuICAgICAgbGV0IHtcbiAgICAgICAgb3BlbixcbiAgICAgICAgcmVhc29uLFxuICAgICAgICBldmVudCxcbiAgICAgICAgbmVzdGVkXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgIG9wZW5FdmVudCA9IGV2ZW50O1xuICAgICAgfVxuICAgICAgaWYgKHJlYXNvbiA9PT0gJ2VzY2FwZS1rZXknICYmIHJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQpIHtcbiAgICAgICAgYWRkUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KHJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgaWYgKHJlYXNvbiA9PT0gJ2hvdmVyJyAmJiBldmVudC50eXBlID09PSAnbW91c2VsZWF2ZScpIHtcbiAgICAgICAgcHJldmVudFJldHVybkZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHJlYXNvbiAhPT0gJ291dHNpZGUtcHJlc3MnKSByZXR1cm47XG4gICAgICBpZiAobmVzdGVkKSB7XG4gICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1Njcm9sbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCA9ICEoaXNWaXJ0dWFsQ2xpY2soZXZlbnQpIHx8IGlzVmlydHVhbFBvaW50ZXJFdmVudChldmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBldmVudHMub24oJ29wZW5jaGFuZ2UnLCBvbk9wZW5DaGFuZ2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBldmVudHMub2ZmKCdvcGVuY2hhbmdlJywgb25PcGVuQ2hhbmdlKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUVsID0gYWN0aXZlRWxlbWVudChkb2MpO1xuICAgICAgY29uc3QgaXNGb2N1c0luc2lkZUZsb2F0aW5nVHJlZSA9IGNvbnRhaW5zKGZsb2F0aW5nLCBhY3RpdmVFbCkgfHwgdHJlZSAmJiBnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkuc29tZShub2RlID0+IHtcbiAgICAgICAgdmFyIF9ub2RlJGNvbnRleHQ1O1xuICAgICAgICByZXR1cm4gY29udGFpbnMoKF9ub2RlJGNvbnRleHQ1ID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dDUuZWxlbWVudHMuZmxvYXRpbmcsIGFjdGl2ZUVsKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2hvdWxkRm9jdXNSZWZlcmVuY2UgPSBpc0ZvY3VzSW5zaWRlRmxvYXRpbmdUcmVlIHx8IG9wZW5FdmVudCAmJiBbJ2NsaWNrJywgJ21vdXNlZG93biddLmluY2x1ZGVzKG9wZW5FdmVudC50eXBlKTtcbiAgICAgIGlmIChzaG91bGRGb2N1c1JlZmVyZW5jZSAmJiByZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KSB7XG4gICAgICAgIGFkZFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudChyZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJldHVybkNvbnRleHRFbGVtZW50ID0gZG9tUmVmZXJlbmNlIHx8IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudDtcbiAgICAgIGNvbnN0IHRhYmJhYmxlRWxlbWVudHMgPSB0YWJiYWJsZShnZXREb2N1bWVudChyZXR1cm5Db250ZXh0RWxlbWVudCkuYm9keSwgZ2V0VGFiYmFibGVPcHRpb25zKCkpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgcmV0dXJuIGVsZW1lbnQgdG8gZ2V0IHBvdGVudGlhbGx5IGRpc2Nvbm5lY3RlZCBiZWZvcmVcbiAgICAgIC8vIGNoZWNraW5nLlxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBsZXQgcmV0dXJuRWxlbWVudCA9IGdldFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpO1xuICAgICAgICBpZiAoIXJldHVybkVsZW1lbnQgJiYgaXNIVE1MRWxlbWVudChyZXR1cm5Db250ZXh0RWxlbWVudCkgJiYgZmxvYXRpbmcpIHtcbiAgICAgICAgICByZXR1cm5FbGVtZW50ID0gZ2V0Q2xvc2VzdFRhYmJhYmxlRWxlbWVudCh0YWJiYWJsZUVsZW1lbnRzLCByZXR1cm5Db250ZXh0RWxlbWVudCwgZmxvYXRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgICAgICByZXR1cm5Gb2N1c1JlZi5jdXJyZW50ICYmICFwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCAmJiBpc0hUTUxFbGVtZW50KHJldHVybkVsZW1lbnQpICYmIChcbiAgICAgICAgLy8gSWYgdGhlIGZvY3VzIG1vdmVkIHNvbWV3aGVyZSBlbHNlIGFmdGVyIG1vdW50LCBhdm9pZCByZXR1cm5pbmcgZm9jdXNcbiAgICAgICAgLy8gc2luY2UgaXQgbGlrZWx5IGVudGVyZWQgYSBkaWZmZXJlbnQgZWxlbWVudCB3aGljaCBzaG91bGQgYmVcbiAgICAgICAgLy8gcmVzcGVjdGVkOiBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzI2MDdcbiAgICAgICAgcmV0dXJuRWxlbWVudCAhPT0gYWN0aXZlRWwgJiYgYWN0aXZlRWwgIT09IGRvYy5ib2R5ID8gaXNGb2N1c0luc2lkZUZsb2F0aW5nVHJlZSA6IHRydWUpKSB7XG4gICAgICAgICAgcmV0dXJuRWxlbWVudC5mb2N1cyh7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiBwcmV2ZW50UmV0dXJuRm9jdXNTY3JvbGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSwgW2Rpc2FibGVkLCBmbG9hdGluZywgZmxvYXRpbmdGb2N1c05vZGUsIHJldHVybkZvY3VzUmVmLCBkYXRhUmVmLCByZWZzLCBldmVudHMsIHRyZWUsIG5vZGVJZF0pO1xuXG4gIC8vIFN5bmNocm9uaXplIHRoZSBgY29udGV4dGAgJiBgbW9kYWxgIHZhbHVlIHRvIHRoZSBGbG9hdGluZ1BvcnRhbCBjb250ZXh0LlxuICAvLyBJdCB3aWxsIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCBpdCBuZWVkcyB0byByZW5kZXIgaXRzIG93biBndWFyZHMuXG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBpZiAoIXBvcnRhbENvbnRleHQpIHJldHVybjtcbiAgICBwb3J0YWxDb250ZXh0LnNldEZvY3VzTWFuYWdlclN0YXRlKHtcbiAgICAgIG1vZGFsLFxuICAgICAgY2xvc2VPbkZvY3VzT3V0LFxuICAgICAgb3BlbixcbiAgICAgIG9uT3BlbkNoYW5nZSxcbiAgICAgIHJlZnNcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcG9ydGFsQ29udGV4dC5zZXRGb2N1c01hbmFnZXJTdGF0ZShudWxsKTtcbiAgICB9O1xuICB9LCBbZGlzYWJsZWQsIHBvcnRhbENvbnRleHQsIG1vZGFsLCBvcGVuLCBvbk9wZW5DaGFuZ2UsIHJlZnMsIGNsb3NlT25Gb2N1c091dF0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgaWYgKCFmbG9hdGluZ0ZvY3VzTm9kZSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuICAgIGlmIChpZ25vcmVJbml0aWFsRm9jdXMpIHJldHVybjtcbiAgICBjb25zdCBoYW5kbGVNdXRhdGlvbiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYkluZGV4ID0gZmxvYXRpbmdGb2N1c05vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgY29uc3QgdGFiYmFibGVDb250ZW50ID0gZ2V0VGFiYmFibGVDb250ZW50KCk7XG4gICAgICBjb25zdCBhY3RpdmVFbCA9IGFjdGl2ZUVsZW1lbnQoZ2V0RG9jdW1lbnQoZmxvYXRpbmcpKTtcbiAgICAgIGNvbnN0IHRhYmJhYmxlSW5kZXggPSB0YWJiYWJsZUNvbnRlbnQuaW5kZXhPZihhY3RpdmVFbCk7XG4gICAgICBpZiAodGFiYmFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGFiYmFibGVJbmRleFJlZi5jdXJyZW50ID0gdGFiYmFibGVJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmIChvcmRlclJlZi5jdXJyZW50LmluY2x1ZGVzKCdmbG9hdGluZycpIHx8IGFjdGl2ZUVsICE9PSByZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50ICYmIHRhYmJhYmxlQ29udGVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKHRhYkluZGV4ICE9PSAnMCcpIHtcbiAgICAgICAgICBmbG9hdGluZ0ZvY3VzTm9kZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWJJbmRleCAhPT0gJy0xJykge1xuICAgICAgICBmbG9hdGluZ0ZvY3VzTm9kZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBoYW5kbGVNdXRhdGlvbigpO1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoaGFuZGxlTXV0YXRpb24pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoZmxvYXRpbmdGb2N1c05vZGUsIHtcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9LCBbZGlzYWJsZWQsIGZsb2F0aW5nLCBmbG9hdGluZ0ZvY3VzTm9kZSwgcmVmcywgb3JkZXJSZWYsIGdldFRhYmJhYmxlQ29udGVudCwgaWdub3JlSW5pdGlhbEZvY3VzXSk7XG4gIGZ1bmN0aW9uIHJlbmRlckRpc21pc3NCdXR0b24obG9jYXRpb24pIHtcbiAgICBpZiAoZGlzYWJsZWQgfHwgIXZpc3VhbGx5SGlkZGVuRGlzbWlzcyB8fCAhbW9kYWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVmlzdWFsbHlIaWRkZW5EaXNtaXNzLCB7XG4gICAgICByZWY6IGxvY2F0aW9uID09PSAnc3RhcnQnID8gc3RhcnREaXNtaXNzQnV0dG9uUmVmIDogZW5kRGlzbWlzc0J1dHRvblJlZixcbiAgICAgIG9uQ2xpY2s6IGV2ZW50ID0+IG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQubmF0aXZlRXZlbnQpXG4gICAgfSwgdHlwZW9mIHZpc3VhbGx5SGlkZGVuRGlzbWlzcyA9PT0gJ3N0cmluZycgPyB2aXN1YWxseUhpZGRlbkRpc21pc3MgOiAnRGlzbWlzcycpO1xuICB9XG4gIGNvbnN0IHNob3VsZFJlbmRlckd1YXJkcyA9ICFkaXNhYmxlZCAmJiBndWFyZHMgJiYgKG1vZGFsID8gIWlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCA6IHRydWUpICYmIChpc0luc2lkZVBvcnRhbCB8fCBtb2RhbCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgc2hvdWxkUmVuZGVyR3VhcmRzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzR3VhcmQsIHtcbiAgICBcImRhdGEtdHlwZVwiOiBcImluc2lkZVwiLFxuICAgIHJlZjogcG9ydGFsQ29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogcG9ydGFsQ29udGV4dC5iZWZvcmVJbnNpZGVSZWYsXG4gICAgb25Gb2N1czogZXZlbnQgPT4ge1xuICAgICAgaWYgKG1vZGFsKSB7XG4gICAgICAgIGNvbnN0IGVscyA9IGdldFRhYmJhYmxlRWxlbWVudHMoKTtcbiAgICAgICAgZW5xdWV1ZUZvY3VzKG9yZGVyWzBdID09PSAncmVmZXJlbmNlJyA/IGVsc1swXSA6IGVsc1tlbHMubGVuZ3RoIC0gMV0pO1xuICAgICAgfSBlbHNlIGlmIChwb3J0YWxDb250ZXh0ICE9IG51bGwgJiYgcG9ydGFsQ29udGV4dC5wcmVzZXJ2ZVRhYk9yZGVyICYmIHBvcnRhbENvbnRleHQucG9ydGFsTm9kZSkge1xuICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICBpZiAoaXNPdXRzaWRlRXZlbnQoZXZlbnQsIHBvcnRhbENvbnRleHQucG9ydGFsTm9kZSkpIHtcbiAgICAgICAgICBjb25zdCBuZXh0VGFiYmFibGUgPSBnZXROZXh0VGFiYmFibGUoKSB8fCBkb21SZWZlcmVuY2U7XG4gICAgICAgICAgbmV4dFRhYmJhYmxlID09IG51bGwgfHwgbmV4dFRhYmJhYmxlLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wb3J0YWxDb250ZXh0JGJlZm9yZTtcbiAgICAgICAgICAoX3BvcnRhbENvbnRleHQkYmVmb3JlID0gcG9ydGFsQ29udGV4dC5iZWZvcmVPdXRzaWRlUmVmLmN1cnJlbnQpID09IG51bGwgfHwgX3BvcnRhbENvbnRleHQkYmVmb3JlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pLCAhaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94ICYmIHJlbmRlckRpc21pc3NCdXR0b24oJ3N0YXJ0JyksIGNoaWxkcmVuLCByZW5kZXJEaXNtaXNzQnV0dG9uKCdlbmQnKSwgc2hvdWxkUmVuZGVyR3VhcmRzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzR3VhcmQsIHtcbiAgICBcImRhdGEtdHlwZVwiOiBcImluc2lkZVwiLFxuICAgIHJlZjogcG9ydGFsQ29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogcG9ydGFsQ29udGV4dC5hZnRlckluc2lkZVJlZixcbiAgICBvbkZvY3VzOiBldmVudCA9PiB7XG4gICAgICBpZiAobW9kYWwpIHtcbiAgICAgICAgZW5xdWV1ZUZvY3VzKGdldFRhYmJhYmxlRWxlbWVudHMoKVswXSk7XG4gICAgICB9IGVsc2UgaWYgKHBvcnRhbENvbnRleHQgIT0gbnVsbCAmJiBwb3J0YWxDb250ZXh0LnByZXNlcnZlVGFiT3JkZXIgJiYgcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlKSB7XG4gICAgICAgIGlmIChjbG9zZU9uRm9jdXNPdXQpIHtcbiAgICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpKSB7XG4gICAgICAgICAgY29uc3QgcHJldlRhYmJhYmxlID0gZ2V0UHJldmlvdXNUYWJiYWJsZSgpIHx8IGRvbVJlZmVyZW5jZTtcbiAgICAgICAgICBwcmV2VGFiYmFibGUgPT0gbnVsbCB8fCBwcmV2VGFiYmFibGUuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX3BvcnRhbENvbnRleHQkYWZ0ZXJPO1xuICAgICAgICAgIChfcG9ydGFsQ29udGV4dCRhZnRlck8gPSBwb3J0YWxDb250ZXh0LmFmdGVyT3V0c2lkZVJlZi5jdXJyZW50KSA9PSBudWxsIHx8IF9wb3J0YWxDb250ZXh0JGFmdGVyTy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KSk7XG59XG5cbmNvbnN0IGFjdGl2ZUxvY2tzID0gLyojX19QVVJFX18qL25ldyBTZXQoKTtcbi8qKlxuICogUHJvdmlkZXMgYmFzZSBzdHlsaW5nIGZvciBhIGZpeGVkIG92ZXJsYXkgZWxlbWVudCB0byBkaW0gY29udGVudCBvciBibG9ja1xuICogcG9pbnRlciBldmVudHMgYmVoaW5kIGEgZmxvYXRpbmcgZWxlbWVudC5cbiAqIEl0J3MgYSByZWd1bGFyIGA8ZGl2PmAsIHNvIGl0IGNhbiBiZSBzdHlsZWQgdmlhIGFueSBDU1Mgc29sdXRpb24geW91IHByZWZlci5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ092ZXJsYXlcbiAqL1xuY29uc3QgRmxvYXRpbmdPdmVybGF5ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRmxvYXRpbmdPdmVybGF5KHByb3BzLCByZWYpIHtcbiAgY29uc3Qge1xuICAgIGxvY2tTY3JvbGwgPSBmYWxzZSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgbG9ja0lkID0gdXNlSWQoKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghbG9ja1Njcm9sbCkgcmV0dXJuO1xuICAgIGFjdGl2ZUxvY2tzLmFkZChsb2NrSWQpO1xuICAgIGNvbnN0IGlzSU9TID0gL2lQKGhvbmV8YWR8b2QpfGlPUy8udGVzdChnZXRQbGF0Zm9ybSgpKTtcbiAgICBjb25zdCBib2R5U3R5bGUgPSBkb2N1bWVudC5ib2R5LnN0eWxlO1xuICAgIC8vIFJUTCA8Ym9keT4gc2Nyb2xsYmFyXG4gICAgY29uc3Qgc2Nyb2xsYmFyWCA9IE1hdGgucm91bmQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgY29uc3QgcGFkZGluZ1Byb3AgPSBzY3JvbGxiYXJYID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgY29uc3Qgc2Nyb2xsWCA9IGJvZHlTdHlsZS5sZWZ0ID8gcGFyc2VGbG9hdChib2R5U3R5bGUubGVmdCkgOiB3aW5kb3cuc2Nyb2xsWDtcbiAgICBjb25zdCBzY3JvbGxZID0gYm9keVN0eWxlLnRvcCA/IHBhcnNlRmxvYXQoYm9keVN0eWxlLnRvcCkgOiB3aW5kb3cuc2Nyb2xsWTtcbiAgICBib2R5U3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICBpZiAoc2Nyb2xsYmFyV2lkdGgpIHtcbiAgICAgIGJvZHlTdHlsZVtwYWRkaW5nUHJvcF0gPSBzY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGlPUyBkb2Vzbid0IHJlc3BlY3QgYG92ZXJmbG93OiBoaWRkZW5gIG9uIGRvY3VtZW50LmJvZHksIGFuZCB0aGlzXG4gICAgLy8gdGVjaG5pcXVlIGhhcyBmZXdlciBzaWRlIGVmZmVjdHMuXG4gICAgaWYgKGlzSU9TKSB7XG4gICAgICB2YXIgX3dpbmRvdyR2aXN1YWxWaWV3cG9yLCBfd2luZG93JHZpc3VhbFZpZXdwb3IyO1xuICAgICAgLy8gaU9TIDEyIGRvZXMgbm90IHN1cHBvcnQgYHZpc3VhbFZpZXdwb3J0YC5cbiAgICAgIGNvbnN0IG9mZnNldExlZnQgPSAoKF93aW5kb3ckdmlzdWFsVmlld3BvciA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCkgPT0gbnVsbCA/IHZvaWQgMCA6IF93aW5kb3ckdmlzdWFsVmlld3Bvci5vZmZzZXRMZWZ0KSB8fCAwO1xuICAgICAgY29uc3Qgb2Zmc2V0VG9wID0gKChfd2luZG93JHZpc3VhbFZpZXdwb3IyID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PSBudWxsID8gdm9pZCAwIDogX3dpbmRvdyR2aXN1YWxWaWV3cG9yMi5vZmZzZXRUb3ApIHx8IDA7XG4gICAgICBPYmplY3QuYXNzaWduKGJvZHlTdHlsZSwge1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAtKHNjcm9sbFkgLSBNYXRoLmZsb29yKG9mZnNldFRvcCkpICsgXCJweFwiLFxuICAgICAgICBsZWZ0OiAtKHNjcm9sbFggLSBNYXRoLmZsb29yKG9mZnNldExlZnQpKSArIFwicHhcIixcbiAgICAgICAgcmlnaHQ6ICcwJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmVMb2Nrcy5kZWxldGUobG9ja0lkKTtcbiAgICAgIGlmIChhY3RpdmVMb2Nrcy5zaXplID09PSAwKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYm9keVN0eWxlLCB7XG4gICAgICAgICAgb3ZlcmZsb3c6ICcnLFxuICAgICAgICAgIFtwYWRkaW5nUHJvcF06ICcnXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaXNJT1MpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHlTdHlsZSwge1xuICAgICAgICAgICAgcG9zaXRpb246ICcnLFxuICAgICAgICAgICAgdG9wOiAnJyxcbiAgICAgICAgICAgIGxlZnQ6ICcnLFxuICAgICAgICAgICAgcmlnaHQ6ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd2luZG93LnNjcm9sbFRvKHNjcm9sbFgsIHNjcm9sbFkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2xvY2tJZCwgbG9ja1Njcm9sbF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHJlZjogcmVmXG4gIH0sIHJlc3QsIHtcbiAgICBzdHlsZToge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICBvdmVyZmxvdzogJ2F1dG8nLFxuICAgICAgdG9wOiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgLi4ucmVzdC5zdHlsZVxuICAgIH1cbiAgfSkpO1xufSk7XG5cbmZ1bmN0aW9uIGlzQnV0dG9uVGFyZ2V0KGV2ZW50KSB7XG4gIHJldHVybiBpc0hUTUxFbGVtZW50KGV2ZW50LnRhcmdldCkgJiYgZXZlbnQudGFyZ2V0LnRhZ05hbWUgPT09ICdCVVRUT04nO1xufVxuZnVuY3Rpb24gaXNTcGFjZUlnbm9yZWQoZWxlbWVudCkge1xuICByZXR1cm4gaXNUeXBlYWJsZUVsZW1lbnQoZWxlbWVudCk7XG59XG4vKipcbiAqIE9wZW5zIG9yIGNsb3NlcyB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGVuIGNsaWNraW5nIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VDbGlja1xuICovXG5mdW5jdGlvbiB1c2VDbGljayhjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGRhdGFSZWYsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGRvbVJlZmVyZW5jZVxuICAgIH1cbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBldmVudDogZXZlbnRPcHRpb24gPSAnY2xpY2snLFxuICAgIHRvZ2dsZSA9IHRydWUsXG4gICAgaWdub3JlTW91c2UgPSBmYWxzZSxcbiAgICBrZXlib2FyZEhhbmRsZXJzID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHBvaW50ZXJUeXBlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IGRpZEtleURvd25SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgb25Qb2ludGVyRG93bihldmVudCkge1xuICAgICAgcG9pbnRlclR5cGVSZWYuY3VycmVudCA9IGV2ZW50LnBvaW50ZXJUeXBlO1xuICAgIH0sXG4gICAgb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHBvaW50ZXJUeXBlID0gcG9pbnRlclR5cGVSZWYuY3VycmVudDtcblxuICAgICAgLy8gSWdub3JlIGFsbCBidXR0b25zIGV4Y2VwdCBmb3IgdGhlIFwibWFpblwiIGJ1dHRvbi5cbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Nb3VzZUV2ZW50L2J1dHRvblxuICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgICAgaWYgKGV2ZW50T3B0aW9uID09PSAnY2xpY2snKSByZXR1cm47XG4gICAgICBpZiAoaXNNb3VzZUxpa2VQb2ludGVyVHlwZShwb2ludGVyVHlwZSwgdHJ1ZSkgJiYgaWdub3JlTW91c2UpIHJldHVybjtcbiAgICAgIGlmIChvcGVuICYmIHRvZ2dsZSAmJiAoZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCA/IGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bicgOiB0cnVlKSkge1xuICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFByZXZlbnQgc3RlYWxpbmcgZm9jdXMgZnJvbSB0aGUgZmxvYXRpbmcgZWxlbWVudFxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25DbGljayhldmVudCkge1xuICAgICAgY29uc3QgcG9pbnRlclR5cGUgPSBwb2ludGVyVHlwZVJlZi5jdXJyZW50O1xuICAgICAgaWYgKGV2ZW50T3B0aW9uID09PSAnbW91c2Vkb3duJyAmJiBwb2ludGVyVHlwZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlLCB0cnVlKSAmJiBpZ25vcmVNb3VzZSkgcmV0dXJuO1xuICAgICAgaWYgKG9wZW4gJiYgdG9nZ2xlICYmIChkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50ID8gZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudC50eXBlID09PSAnY2xpY2snIDogdHJ1ZSkpIHtcbiAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCwgJ2NsaWNrJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBwb2ludGVyVHlwZVJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgIWtleWJvYXJkSGFuZGxlcnMgfHwgaXNCdXR0b25UYXJnZXQoZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJyAmJiAhaXNTcGFjZUlnbm9yZWQoZG9tUmVmZXJlbmNlKSkge1xuICAgICAgICAvLyBQcmV2ZW50IHNjcm9sbGluZ1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBkaWRLZXlEb3duUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBpZiAob3BlbiAmJiB0b2dnbGUpIHtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBvbktleVVwKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAha2V5Ym9hcmRIYW5kbGVycyB8fCBpc0J1dHRvblRhcmdldChldmVudCkgfHwgaXNTcGFjZUlnbm9yZWQoZG9tUmVmZXJlbmNlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnICcgJiYgZGlkS2V5RG93blJlZi5jdXJyZW50KSB7XG4gICAgICAgIGRpZEtleURvd25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICBpZiAob3BlbiAmJiB0b2dnbGUpIHtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KSwgW2RhdGFSZWYsIGRvbVJlZmVyZW5jZSwgZXZlbnRPcHRpb24sIGlnbm9yZU1vdXNlLCBrZXlib2FyZEhhbmRsZXJzLCBvbk9wZW5DaGFuZ2UsIG9wZW4sIHRvZ2dsZV0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIHJlZmVyZW5jZVxuICB9IDoge30sIFtlbmFibGVkLCByZWZlcmVuY2VdKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmlydHVhbEVsZW1lbnQoZG9tRWxlbWVudCwgZGF0YSkge1xuICBsZXQgb2Zmc2V0WCA9IG51bGw7XG4gIGxldCBvZmZzZXRZID0gbnVsbDtcbiAgbGV0IGlzQXV0b1VwZGF0ZUV2ZW50ID0gZmFsc2U7XG4gIHJldHVybiB7XG4gICAgY29udGV4dEVsZW1lbnQ6IGRvbUVsZW1lbnQgfHwgdW5kZWZpbmVkLFxuICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHtcbiAgICAgIHZhciBfZGF0YSRkYXRhUmVmJGN1cnJlbnQ7XG4gICAgICBjb25zdCBkb21SZWN0ID0gKGRvbUVsZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpIHx8IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGlzWEF4aXMgPSBkYXRhLmF4aXMgPT09ICd4JyB8fCBkYXRhLmF4aXMgPT09ICdib3RoJztcbiAgICAgIGNvbnN0IGlzWUF4aXMgPSBkYXRhLmF4aXMgPT09ICd5JyB8fCBkYXRhLmF4aXMgPT09ICdib3RoJztcbiAgICAgIGNvbnN0IGNhblRyYWNrQ3Vyc29yT25BdXRvVXBkYXRlID0gWydtb3VzZWVudGVyJywgJ21vdXNlbW92ZSddLmluY2x1ZGVzKCgoX2RhdGEkZGF0YVJlZiRjdXJyZW50ID0gZGF0YS5kYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2RhdGEkZGF0YVJlZiRjdXJyZW50LnR5cGUpIHx8ICcnKSAmJiBkYXRhLnBvaW50ZXJUeXBlICE9PSAndG91Y2gnO1xuICAgICAgbGV0IHdpZHRoID0gZG9tUmVjdC53aWR0aDtcbiAgICAgIGxldCBoZWlnaHQgPSBkb21SZWN0LmhlaWdodDtcbiAgICAgIGxldCB4ID0gZG9tUmVjdC54O1xuICAgICAgbGV0IHkgPSBkb21SZWN0Lnk7XG4gICAgICBpZiAob2Zmc2V0WCA9PSBudWxsICYmIGRhdGEueCAmJiBpc1hBeGlzKSB7XG4gICAgICAgIG9mZnNldFggPSBkb21SZWN0LnggLSBkYXRhLng7XG4gICAgICB9XG4gICAgICBpZiAob2Zmc2V0WSA9PSBudWxsICYmIGRhdGEueSAmJiBpc1lBeGlzKSB7XG4gICAgICAgIG9mZnNldFkgPSBkb21SZWN0LnkgLSBkYXRhLnk7XG4gICAgICB9XG4gICAgICB4IC09IG9mZnNldFggfHwgMDtcbiAgICAgIHkgLT0gb2Zmc2V0WSB8fCAwO1xuICAgICAgd2lkdGggPSAwO1xuICAgICAgaGVpZ2h0ID0gMDtcbiAgICAgIGlmICghaXNBdXRvVXBkYXRlRXZlbnQgfHwgY2FuVHJhY2tDdXJzb3JPbkF1dG9VcGRhdGUpIHtcbiAgICAgICAgd2lkdGggPSBkYXRhLmF4aXMgPT09ICd5JyA/IGRvbVJlY3Qud2lkdGggOiAwO1xuICAgICAgICBoZWlnaHQgPSBkYXRhLmF4aXMgPT09ICd4JyA/IGRvbVJlY3QuaGVpZ2h0IDogMDtcbiAgICAgICAgeCA9IGlzWEF4aXMgJiYgZGF0YS54ICE9IG51bGwgPyBkYXRhLnggOiB4O1xuICAgICAgICB5ID0gaXNZQXhpcyAmJiBkYXRhLnkgIT0gbnVsbCA/IGRhdGEueSA6IHk7XG4gICAgICB9IGVsc2UgaWYgKGlzQXV0b1VwZGF0ZUV2ZW50ICYmICFjYW5UcmFja0N1cnNvck9uQXV0b1VwZGF0ZSkge1xuICAgICAgICBoZWlnaHQgPSBkYXRhLmF4aXMgPT09ICd4JyA/IGRvbVJlY3QuaGVpZ2h0IDogaGVpZ2h0O1xuICAgICAgICB3aWR0aCA9IGRhdGEuYXhpcyA9PT0gJ3knID8gZG9tUmVjdC53aWR0aCA6IHdpZHRoO1xuICAgICAgfVxuICAgICAgaXNBdXRvVXBkYXRlRXZlbnQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgdG9wOiB5LFxuICAgICAgICByaWdodDogeCArIHdpZHRoLFxuICAgICAgICBib3R0b206IHkgKyBoZWlnaHQsXG4gICAgICAgIGxlZnQ6IHhcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gaXNNb3VzZUJhc2VkRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGV2ZW50ICE9IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsO1xufVxuLyoqXG4gKiBQb3NpdGlvbnMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgcmVsYXRpdmUgdG8gYSBjbGllbnQgcG9pbnQgKGluIHRoZSB2aWV3cG9ydCksXG4gKiBzdWNoIGFzIHRoZSBtb3VzZSBwb3NpdGlvbi4gQnkgZGVmYXVsdCwgaXQgZm9sbG93cyB0aGUgbW91c2UgY3Vyc29yLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUNsaWVudFBvaW50XG4gKi9cbmZ1bmN0aW9uIHVzZUNsaWVudFBvaW50KGNvbnRleHQsIHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBkYXRhUmVmLFxuICAgIGVsZW1lbnRzOiB7XG4gICAgICBmbG9hdGluZyxcbiAgICAgIGRvbVJlZmVyZW5jZVxuICAgIH0sXG4gICAgcmVmc1xuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIGF4aXMgPSAnYm90aCcsXG4gICAgeCA9IG51bGwsXG4gICAgeSA9IG51bGxcbiAgfSA9IHByb3BzO1xuICBjb25zdCBpbml0aWFsUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgY2xlYW51cExpc3RlbmVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBbcG9pbnRlclR5cGUsIHNldFBvaW50ZXJUeXBlXSA9IFJlYWN0LnVzZVN0YXRlKCk7XG4gIGNvbnN0IFtyZWFjdGl2ZSwgc2V0UmVhY3RpdmVdID0gUmVhY3QudXNlU3RhdGUoW10pO1xuICBjb25zdCBzZXRSZWZlcmVuY2UgPSB1c2VFZmZlY3RFdmVudCgoeCwgeSkgPT4ge1xuICAgIGlmIChpbml0aWFsUmVmLmN1cnJlbnQpIHJldHVybjtcblxuICAgIC8vIFByZXZlbnQgc2V0dGluZyBpZiB0aGUgb3BlbiBldmVudCB3YXMgbm90IGEgbW91c2UtbGlrZSBvbmVcbiAgICAvLyAoZS5nLiBmb2N1cyB0byBvcGVuLCB0aGVuIGhvdmVyIG92ZXIgdGhlIHJlZmVyZW5jZSBlbGVtZW50KS5cbiAgICAvLyBPbmx5IGFwcGx5IGlmIHRoZSBldmVudCBleGlzdHMuXG4gICAgaWYgKGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQgJiYgIWlzTW91c2VCYXNlZEV2ZW50KGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlZnMuc2V0UG9zaXRpb25SZWZlcmVuY2UoY3JlYXRlVmlydHVhbEVsZW1lbnQoZG9tUmVmZXJlbmNlLCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIGF4aXMsXG4gICAgICBkYXRhUmVmLFxuICAgICAgcG9pbnRlclR5cGVcbiAgICB9KSk7XG4gIH0pO1xuICBjb25zdCBoYW5kbGVSZWZlcmVuY2VFbnRlck9yTW92ZSA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICBpZiAoeCAhPSBudWxsIHx8IHkgIT0gbnVsbCkgcmV0dXJuO1xuICAgIGlmICghb3Blbikge1xuICAgICAgc2V0UmVmZXJlbmNlKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH0gZWxzZSBpZiAoIWNsZWFudXBMaXN0ZW5lclJlZi5jdXJyZW50KSB7XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIGNsZWFudXAsIHRoZXJlJ3Mgbm8gbGlzdGVuZXIsIGJ1dCB3ZSB3YW50IHRvIGVuc3VyZVxuICAgICAgLy8gd2UgYWRkIHRoZSBsaXN0ZW5lciBpZiB0aGUgY3Vyc29yIGxhbmRlZCBvbiB0aGUgZmxvYXRpbmcgZWxlbWVudCBhbmRcbiAgICAgIC8vIHRoZW4gYmFjayBvbiB0aGUgcmVmZXJlbmNlIChpLmUuIGl0J3MgaW50ZXJhY3RpdmUpLlxuICAgICAgc2V0UmVhY3RpdmUoW10pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gSWYgdGhlIHBvaW50ZXIgaXMgYSBtb3VzZS1saWtlIHBvaW50ZXIsIHdlIHdhbnQgdG8gY29udGludWUgZm9sbG93aW5nIHRoZVxuICAvLyBtb3VzZSBldmVuIGlmIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzIHRyYW5zaXRpb25pbmcgb3V0LiBPbiB0b3VjaFxuICAvLyBkZXZpY2VzLCB0aGlzIGlzIHVuZGVzaXJhYmxlIGJlY2F1c2UgdGhlIGZsb2F0aW5nIGVsZW1lbnQgd2lsbCBtb3ZlIHRvXG4gIC8vIHRoZSBkaXNtaXNzYWwgdG91Y2ggcG9pbnQuXG4gIGNvbnN0IG9wZW5DaGVjayA9IGlzTW91c2VMaWtlUG9pbnRlclR5cGUocG9pbnRlclR5cGUpID8gZmxvYXRpbmcgOiBvcGVuO1xuICBjb25zdCBhZGRMaXN0ZW5lciA9IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAvLyBFeHBsaWNpdGx5IHNwZWNpZmllZCBgeGAvYHlgIGNvb3JkaW5hdGVzIHNob3VsZG4ndCBhZGQgYSBsaXN0ZW5lci5cbiAgICBpZiAoIW9wZW5DaGVjayB8fCAhZW5hYmxlZCB8fCB4ICE9IG51bGwgfHwgeSAhPSBudWxsKSByZXR1cm47XG4gICAgY29uc3Qgd2luID0gZ2V0V2luZG93KGZsb2F0aW5nKTtcbiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZXZlbnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudCk7XG4gICAgICBpZiAoIWNvbnRhaW5zKGZsb2F0aW5nLCB0YXJnZXQpKSB7XG4gICAgICAgIHNldFJlZmVyZW5jZShldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgICBjbGVhbnVwTGlzdGVuZXJSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCB8fCBpc01vdXNlQmFzZWRFdmVudChkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50KSkge1xuICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgY2xlYW51cExpc3RlbmVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgfTtcbiAgICAgIGNsZWFudXBMaXN0ZW5lclJlZi5jdXJyZW50ID0gY2xlYW51cDtcbiAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgIH1cbiAgICByZWZzLnNldFBvc2l0aW9uUmVmZXJlbmNlKGRvbVJlZmVyZW5jZSk7XG4gIH0sIFtvcGVuQ2hlY2ssIGVuYWJsZWQsIHgsIHksIGZsb2F0aW5nLCBkYXRhUmVmLCByZWZzLCBkb21SZWZlcmVuY2UsIHNldFJlZmVyZW5jZV0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiBhZGRMaXN0ZW5lcigpO1xuICB9LCBbYWRkTGlzdGVuZXIsIHJlYWN0aXZlXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGVuYWJsZWQgJiYgIWZsb2F0aW5nKSB7XG4gICAgICBpbml0aWFsUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9XG4gIH0sIFtlbmFibGVkLCBmbG9hdGluZ10pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCAmJiBvcGVuKSB7XG4gICAgICBpbml0aWFsUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cbiAgfSwgW2VuYWJsZWQsIG9wZW5dKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChlbmFibGVkICYmICh4ICE9IG51bGwgfHwgeSAhPSBudWxsKSkge1xuICAgICAgaW5pdGlhbFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBzZXRSZWZlcmVuY2UoeCwgeSk7XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgeCwgeSwgc2V0UmVmZXJlbmNlXSk7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHNldFBvaW50ZXJUeXBlUmVmKF9yZWYpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIHBvaW50ZXJUeXBlXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIHNldFBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uUG9pbnRlckRvd246IHNldFBvaW50ZXJUeXBlUmVmLFxuICAgICAgb25Qb2ludGVyRW50ZXI6IHNldFBvaW50ZXJUeXBlUmVmLFxuICAgICAgb25Nb3VzZU1vdmU6IGhhbmRsZVJlZmVyZW5jZUVudGVyT3JNb3ZlLFxuICAgICAgb25Nb3VzZUVudGVyOiBoYW5kbGVSZWZlcmVuY2VFbnRlck9yTW92ZVxuICAgIH07XG4gIH0sIFtoYW5kbGVSZWZlcmVuY2VFbnRlck9yTW92ZV0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIHJlZmVyZW5jZVxuICB9IDoge30sIFtlbmFibGVkLCByZWZlcmVuY2VdKTtcbn1cblxuY29uc3QgYnViYmxlSGFuZGxlcktleXMgPSB7XG4gIHBvaW50ZXJkb3duOiAnb25Qb2ludGVyRG93bicsXG4gIG1vdXNlZG93bjogJ29uTW91c2VEb3duJyxcbiAgY2xpY2s6ICdvbkNsaWNrJ1xufTtcbmNvbnN0IGNhcHR1cmVIYW5kbGVyS2V5cyA9IHtcbiAgcG9pbnRlcmRvd246ICdvblBvaW50ZXJEb3duQ2FwdHVyZScsXG4gIG1vdXNlZG93bjogJ29uTW91c2VEb3duQ2FwdHVyZScsXG4gIGNsaWNrOiAnb25DbGlja0NhcHR1cmUnXG59O1xuY29uc3Qgbm9ybWFsaXplUHJvcCA9IG5vcm1hbGl6YWJsZSA9PiB7XG4gIHZhciBfbm9ybWFsaXphYmxlJGVzY2FwZUssIF9ub3JtYWxpemFibGUkb3V0c2lkZTtcbiAgcmV0dXJuIHtcbiAgICBlc2NhcGVLZXk6IHR5cGVvZiBub3JtYWxpemFibGUgPT09ICdib29sZWFuJyA/IG5vcm1hbGl6YWJsZSA6IChfbm9ybWFsaXphYmxlJGVzY2FwZUsgPSBub3JtYWxpemFibGUgPT0gbnVsbCA/IHZvaWQgMCA6IG5vcm1hbGl6YWJsZS5lc2NhcGVLZXkpICE9IG51bGwgPyBfbm9ybWFsaXphYmxlJGVzY2FwZUsgOiBmYWxzZSxcbiAgICBvdXRzaWRlUHJlc3M6IHR5cGVvZiBub3JtYWxpemFibGUgPT09ICdib29sZWFuJyA/IG5vcm1hbGl6YWJsZSA6IChfbm9ybWFsaXphYmxlJG91dHNpZGUgPSBub3JtYWxpemFibGUgPT0gbnVsbCA/IHZvaWQgMCA6IG5vcm1hbGl6YWJsZS5vdXRzaWRlUHJlc3MpICE9IG51bGwgPyBfbm9ybWFsaXphYmxlJG91dHNpZGUgOiB0cnVlXG4gIH07XG59O1xuLyoqXG4gKiBDbG9zZXMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgd2hlbiBhIGRpc21pc3NhbCBpcyByZXF1ZXN0ZWQg4oCUIGJ5IGRlZmF1bHQsIHdoZW5cbiAqIHRoZSB1c2VyIHByZXNzZXMgdGhlIGBlc2NhcGVgIGtleSBvciBvdXRzaWRlIG9mIHRoZSBmbG9hdGluZyBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZURpc21pc3NcbiAqL1xuZnVuY3Rpb24gdXNlRGlzbWlzcyhjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGVsZW1lbnRzLFxuICAgIGRhdGFSZWZcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBlc2NhcGVLZXkgPSB0cnVlLFxuICAgIG91dHNpZGVQcmVzczogdW5zdGFibGVfb3V0c2lkZVByZXNzID0gdHJ1ZSxcbiAgICBvdXRzaWRlUHJlc3NFdmVudCA9ICdwb2ludGVyZG93bicsXG4gICAgcmVmZXJlbmNlUHJlc3MgPSBmYWxzZSxcbiAgICByZWZlcmVuY2VQcmVzc0V2ZW50ID0gJ3BvaW50ZXJkb3duJyxcbiAgICBhbmNlc3RvclNjcm9sbCA9IGZhbHNlLFxuICAgIGJ1YmJsZXMsXG4gICAgY2FwdHVyZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHRyZWUgPSB1c2VGbG9hdGluZ1RyZWUoKTtcbiAgY29uc3Qgb3V0c2lkZVByZXNzRm4gPSB1c2VFZmZlY3RFdmVudCh0eXBlb2YgdW5zdGFibGVfb3V0c2lkZVByZXNzID09PSAnZnVuY3Rpb24nID8gdW5zdGFibGVfb3V0c2lkZVByZXNzIDogKCkgPT4gZmFsc2UpO1xuICBjb25zdCBvdXRzaWRlUHJlc3MgPSB0eXBlb2YgdW5zdGFibGVfb3V0c2lkZVByZXNzID09PSAnZnVuY3Rpb24nID8gb3V0c2lkZVByZXNzRm4gOiB1bnN0YWJsZV9vdXRzaWRlUHJlc3M7XG4gIGNvbnN0IGluc2lkZVJlYWN0VHJlZVJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGVuZGVkT3JTdGFydGVkSW5zaWRlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3Qge1xuICAgIGVzY2FwZUtleTogZXNjYXBlS2V5QnViYmxlcyxcbiAgICBvdXRzaWRlUHJlc3M6IG91dHNpZGVQcmVzc0J1YmJsZXNcbiAgfSA9IG5vcm1hbGl6ZVByb3AoYnViYmxlcyk7XG4gIGNvbnN0IHtcbiAgICBlc2NhcGVLZXk6IGVzY2FwZUtleUNhcHR1cmUsXG4gICAgb3V0c2lkZVByZXNzOiBvdXRzaWRlUHJlc3NDYXB0dXJlXG4gIH0gPSBub3JtYWxpemVQcm9wKGNhcHR1cmUpO1xuICBjb25zdCBjbG9zZU9uRXNjYXBlS2V5RG93biA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICB2YXIgX2RhdGFSZWYkY3VycmVudCRmbG9hO1xuICAgIGlmICghb3BlbiB8fCAhZW5hYmxlZCB8fCAhZXNjYXBlS2V5IHx8IGV2ZW50LmtleSAhPT0gJ0VzY2FwZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZUlkID0gKF9kYXRhUmVmJGN1cnJlbnQkZmxvYSA9IGRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfZGF0YVJlZiRjdXJyZW50JGZsb2Eubm9kZUlkO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdHJlZSA/IGdldENoaWxkcmVuKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKSA6IFtdO1xuICAgIGlmICghZXNjYXBlS2V5QnViYmxlcykge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgc2hvdWxkRGlzbWlzcyA9IHRydWU7XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICAgIHZhciBfY2hpbGQkY29udGV4dDtcbiAgICAgICAgICBpZiAoKF9jaGlsZCRjb250ZXh0ID0gY2hpbGQuY29udGV4dCkgIT0gbnVsbCAmJiBfY2hpbGQkY29udGV4dC5vcGVuICYmICFjaGlsZC5jb250ZXh0LmRhdGFSZWYuY3VycmVudC5fX2VzY2FwZUtleUJ1YmJsZXMpIHtcbiAgICAgICAgICAgIHNob3VsZERpc21pc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXNob3VsZERpc21pc3MpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBpc1JlYWN0RXZlbnQoZXZlbnQpID8gZXZlbnQubmF0aXZlRXZlbnQgOiBldmVudCwgJ2VzY2FwZS1rZXknKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NlT25Fc2NhcGVLZXlEb3duQ2FwdHVyZSA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICB2YXIgX2dldFRhcmdldDI7XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB2YXIgX2dldFRhcmdldDtcbiAgICAgIGNsb3NlT25Fc2NhcGVLZXlEb3duKGV2ZW50KTtcbiAgICAgIChfZ2V0VGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2ZW50KSkgPT0gbnVsbCB8fCBfZ2V0VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBjYWxsYmFjayk7XG4gICAgfTtcbiAgICAoX2dldFRhcmdldDIgPSBnZXRUYXJnZXQoZXZlbnQpKSA9PSBudWxsIHx8IF9nZXRUYXJnZXQyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBjYWxsYmFjayk7XG4gIH0pO1xuICBjb25zdCBjbG9zZU9uUHJlc3NPdXRzaWRlID0gdXNlRWZmZWN0RXZlbnQoZXZlbnQgPT4ge1xuICAgIHZhciBfZGF0YVJlZiRjdXJyZW50JGZsb2EyO1xuICAgIC8vIEdpdmVuIGRldmVsb3BlcnMgY2FuIHN0b3AgdGhlIHByb3BhZ2F0aW9uIG9mIHRoZSBzeW50aGV0aWMgZXZlbnQsXG4gICAgLy8gd2UgY2FuIG9ubHkgYmUgY29uZmlkZW50IHdpdGggYSBwb3NpdGl2ZSB2YWx1ZS5cbiAgICBjb25zdCBpbnNpZGVSZWFjdFRyZWUgPSBpbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudDtcbiAgICBpbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudCA9IGZhbHNlO1xuXG4gICAgLy8gV2hlbiBjbGljayBvdXRzaWRlIGlzIGxhenkgKGBjbGlja2AgZXZlbnQpLCBoYW5kbGUgZHJhZ2dpbmcuXG4gICAgLy8gRG9uJ3QgY2xvc2UgaWY6XG4gICAgLy8gLSBUaGUgY2xpY2sgc3RhcnRlZCBpbnNpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQuXG4gICAgLy8gLSBUaGUgY2xpY2sgZW5kZWQgaW5zaWRlIHRoZSBmbG9hdGluZyBlbGVtZW50LlxuICAgIGNvbnN0IGVuZGVkT3JTdGFydGVkSW5zaWRlID0gZW5kZWRPclN0YXJ0ZWRJbnNpZGVSZWYuY3VycmVudDtcbiAgICBlbmRlZE9yU3RhcnRlZEluc2lkZVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgaWYgKG91dHNpZGVQcmVzc0V2ZW50ID09PSAnY2xpY2snICYmIGVuZGVkT3JTdGFydGVkSW5zaWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbnNpZGVSZWFjdFRyZWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvdXRzaWRlUHJlc3MgPT09ICdmdW5jdGlvbicgJiYgIW91dHNpZGVQcmVzcyhldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2ZW50KTtcbiAgICBjb25zdCBpbmVydFNlbGVjdG9yID0gXCJbXCIgKyBjcmVhdGVBdHRyaWJ1dGUoJ2luZXJ0JykgKyBcIl1cIjtcbiAgICBjb25zdCBtYXJrZXJzID0gZ2V0RG9jdW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpLnF1ZXJ5U2VsZWN0b3JBbGwoaW5lcnRTZWxlY3Rvcik7XG4gICAgbGV0IHRhcmdldFJvb3RBbmNlc3RvciA9IGlzRWxlbWVudCh0YXJnZXQpID8gdGFyZ2V0IDogbnVsbDtcbiAgICB3aGlsZSAodGFyZ2V0Um9vdEFuY2VzdG9yICYmICFpc0xhc3RUcmF2ZXJzYWJsZU5vZGUodGFyZ2V0Um9vdEFuY2VzdG9yKSkge1xuICAgICAgY29uc3QgbmV4dFBhcmVudCA9IGdldFBhcmVudE5vZGUodGFyZ2V0Um9vdEFuY2VzdG9yKTtcbiAgICAgIGlmIChpc0xhc3RUcmF2ZXJzYWJsZU5vZGUobmV4dFBhcmVudCkgfHwgIWlzRWxlbWVudChuZXh0UGFyZW50KSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRhcmdldFJvb3RBbmNlc3RvciA9IG5leHRQYXJlbnQ7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWNrIG9jY3VycmVkIG9uIGEgdGhpcmQtcGFydHkgZWxlbWVudCBpbmplY3RlZCBhZnRlciB0aGVcbiAgICAvLyBmbG9hdGluZyBlbGVtZW50IHJlbmRlcmVkLlxuICAgIGlmIChtYXJrZXJzLmxlbmd0aCAmJiBpc0VsZW1lbnQodGFyZ2V0KSAmJiAhaXNSb290RWxlbWVudCh0YXJnZXQpICYmXG4gICAgLy8gQ2xpY2tlZCBvbiBhIGRpcmVjdCBhbmNlc3RvciAoZS5nLiBGbG9hdGluZ092ZXJsYXkpLlxuICAgICFjb250YWlucyh0YXJnZXQsIGVsZW1lbnRzLmZsb2F0aW5nKSAmJlxuICAgIC8vIElmIHRoZSB0YXJnZXQgcm9vdCBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb2YgdGhlIG1hcmtlcnMsIHRoZW4gdGhlXG4gICAgLy8gZWxlbWVudCB3YXMgaW5qZWN0ZWQgYWZ0ZXIgdGhlIGZsb2F0aW5nIGVsZW1lbnQgcmVuZGVyZWQuXG4gICAgQXJyYXkuZnJvbShtYXJrZXJzKS5ldmVyeShtYXJrZXIgPT4gIWNvbnRhaW5zKHRhcmdldFJvb3RBbmNlc3RvciwgbWFya2VyKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY2xpY2sgb2NjdXJyZWQgb24gdGhlIHNjcm9sbGJhclxuICAgIGlmIChpc0hUTUxFbGVtZW50KHRhcmdldCkgJiYgZmxvYXRpbmcpIHtcbiAgICAgIC8vIEluIEZpcmVmb3gsIGB0YXJnZXQuc2Nyb2xsV2lkdGggPiB0YXJnZXQuY2xpZW50V2lkdGhgIGZvciBpbmxpbmVcbiAgICAgIC8vIGVsZW1lbnRzLlxuICAgICAgY29uc3QgY2FuU2Nyb2xsWCA9IHRhcmdldC5jbGllbnRXaWR0aCA+IDAgJiYgdGFyZ2V0LnNjcm9sbFdpZHRoID4gdGFyZ2V0LmNsaWVudFdpZHRoO1xuICAgICAgY29uc3QgY2FuU2Nyb2xsWSA9IHRhcmdldC5jbGllbnRIZWlnaHQgPiAwICYmIHRhcmdldC5zY3JvbGxIZWlnaHQgPiB0YXJnZXQuY2xpZW50SGVpZ2h0O1xuICAgICAgbGV0IHhDb25kID0gY2FuU2Nyb2xsWSAmJiBldmVudC5vZmZzZXRYID4gdGFyZ2V0LmNsaWVudFdpZHRoO1xuXG4gICAgICAvLyBJbiBzb21lIGJyb3dzZXJzIGl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgPGJvZHk+IChvciB3aW5kb3cpXG4gICAgICAvLyBzY3JvbGxiYXIgdG8gdGhlIGxlZnQgc2lkZSwgYnV0IGlzIHZlcnkgcmFyZSBhbmQgaXMgZGlmZmljdWx0IHRvXG4gICAgICAvLyBjaGVjayBmb3IuIFBsdXMsIGZvciBtb2RhbCBkaWFsb2dzIHdpdGggYmFja2Ryb3BzLCBpdCBpcyBtb3JlXG4gICAgICAvLyBpbXBvcnRhbnQgdGhhdCB0aGUgYmFja2Ryb3AgaXMgY2hlY2tlZCBidXQgbm90IHNvIG11Y2ggdGhlIHdpbmRvdy5cbiAgICAgIGlmIChjYW5TY3JvbGxZKSB7XG4gICAgICAgIGNvbnN0IGlzUlRMID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmRpcmVjdGlvbiA9PT0gJ3J0bCc7XG4gICAgICAgIGlmIChpc1JUTCkge1xuICAgICAgICAgIHhDb25kID0gZXZlbnQub2Zmc2V0WCA8PSB0YXJnZXQub2Zmc2V0V2lkdGggLSB0YXJnZXQuY2xpZW50V2lkdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh4Q29uZCB8fCBjYW5TY3JvbGxYICYmIGV2ZW50Lm9mZnNldFkgPiB0YXJnZXQuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9kZUlkID0gKF9kYXRhUmVmJGN1cnJlbnQkZmxvYTIgPSBkYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX2RhdGFSZWYkY3VycmVudCRmbG9hMi5ub2RlSWQ7XG4gICAgY29uc3QgdGFyZ2V0SXNJbnNpZGVDaGlsZHJlbiA9IHRyZWUgJiYgZ2V0Q2hpbGRyZW4odHJlZS5ub2Rlc1JlZi5jdXJyZW50LCBub2RlSWQpLnNvbWUobm9kZSA9PiB7XG4gICAgICB2YXIgX25vZGUkY29udGV4dDtcbiAgICAgIHJldHVybiBpc0V2ZW50VGFyZ2V0V2l0aGluKGV2ZW50LCAoX25vZGUkY29udGV4dCA9IG5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJGNvbnRleHQuZWxlbWVudHMuZmxvYXRpbmcpO1xuICAgIH0pO1xuICAgIGlmIChpc0V2ZW50VGFyZ2V0V2l0aGluKGV2ZW50LCBlbGVtZW50cy5mbG9hdGluZykgfHwgaXNFdmVudFRhcmdldFdpdGhpbihldmVudCwgZWxlbWVudHMuZG9tUmVmZXJlbmNlKSB8fCB0YXJnZXRJc0luc2lkZUNoaWxkcmVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkcmVuID0gdHJlZSA/IGdldENoaWxkcmVuKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKSA6IFtdO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgc2hvdWxkRGlzbWlzcyA9IHRydWU7XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgdmFyIF9jaGlsZCRjb250ZXh0MjtcbiAgICAgICAgaWYgKChfY2hpbGQkY29udGV4dDIgPSBjaGlsZC5jb250ZXh0KSAhPSBudWxsICYmIF9jaGlsZCRjb250ZXh0Mi5vcGVuICYmICFjaGlsZC5jb250ZXh0LmRhdGFSZWYuY3VycmVudC5fX291dHNpZGVQcmVzc0J1YmJsZXMpIHtcbiAgICAgICAgICBzaG91bGREaXNtaXNzID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghc2hvdWxkRGlzbWlzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQsICdvdXRzaWRlLXByZXNzJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zZU9uUHJlc3NPdXRzaWRlQ2FwdHVyZSA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICB2YXIgX2dldFRhcmdldDQ7XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB2YXIgX2dldFRhcmdldDM7XG4gICAgICBjbG9zZU9uUHJlc3NPdXRzaWRlKGV2ZW50KTtcbiAgICAgIChfZ2V0VGFyZ2V0MyA9IGdldFRhcmdldChldmVudCkpID09IG51bGwgfHwgX2dldFRhcmdldDMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvdXRzaWRlUHJlc3NFdmVudCwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgKF9nZXRUYXJnZXQ0ID0gZ2V0VGFyZ2V0KGV2ZW50KSkgPT0gbnVsbCB8fCBfZ2V0VGFyZ2V0NC5hZGRFdmVudExpc3RlbmVyKG91dHNpZGVQcmVzc0V2ZW50LCBjYWxsYmFjayk7XG4gIH0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghb3BlbiB8fCAhZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYXRhUmVmLmN1cnJlbnQuX19lc2NhcGVLZXlCdWJibGVzID0gZXNjYXBlS2V5QnViYmxlcztcbiAgICBkYXRhUmVmLmN1cnJlbnQuX19vdXRzaWRlUHJlc3NCdWJibGVzID0gb3V0c2lkZVByZXNzQnViYmxlcztcbiAgICBmdW5jdGlvbiBvblNjcm9sbChldmVudCkge1xuICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudCwgJ2FuY2VzdG9yLXNjcm9sbCcpO1xuICAgIH1cbiAgICBjb25zdCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50cy5mbG9hdGluZyk7XG4gICAgZXNjYXBlS2V5ICYmIGRvYy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjYXBlS2V5Q2FwdHVyZSA/IGNsb3NlT25Fc2NhcGVLZXlEb3duQ2FwdHVyZSA6IGNsb3NlT25Fc2NhcGVLZXlEb3duLCBlc2NhcGVLZXlDYXB0dXJlKTtcbiAgICBvdXRzaWRlUHJlc3MgJiYgZG9jLmFkZEV2ZW50TGlzdGVuZXIob3V0c2lkZVByZXNzRXZlbnQsIG91dHNpZGVQcmVzc0NhcHR1cmUgPyBjbG9zZU9uUHJlc3NPdXRzaWRlQ2FwdHVyZSA6IGNsb3NlT25QcmVzc091dHNpZGUsIG91dHNpZGVQcmVzc0NhcHR1cmUpO1xuICAgIGxldCBhbmNlc3RvcnMgPSBbXTtcbiAgICBpZiAoYW5jZXN0b3JTY3JvbGwpIHtcbiAgICAgIGlmIChpc0VsZW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlKSkge1xuICAgICAgICBhbmNlc3RvcnMgPSBnZXRPdmVyZmxvd0FuY2VzdG9ycyhlbGVtZW50cy5kb21SZWZlcmVuY2UpO1xuICAgICAgfVxuICAgICAgaWYgKGlzRWxlbWVudChlbGVtZW50cy5mbG9hdGluZykpIHtcbiAgICAgICAgYW5jZXN0b3JzID0gYW5jZXN0b3JzLmNvbmNhdChnZXRPdmVyZmxvd0FuY2VzdG9ycyhlbGVtZW50cy5mbG9hdGluZykpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlbWVudHMucmVmZXJlbmNlKSAmJiBlbGVtZW50cy5yZWZlcmVuY2UgJiYgZWxlbWVudHMucmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSB7XG4gICAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5jb25jYXQoZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZWxlbWVudHMucmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWdub3JlIHRoZSB2aXN1YWwgdmlld3BvcnQgZm9yIHNjcm9sbGluZyBkaXNtaXNzYWwgKGFsbG93IHBpbmNoLXpvb20pXG4gICAgYW5jZXN0b3JzID0gYW5jZXN0b3JzLmZpbHRlcihhbmNlc3RvciA9PiB7XG4gICAgICB2YXIgX2RvYyRkZWZhdWx0VmlldztcbiAgICAgIHJldHVybiBhbmNlc3RvciAhPT0gKChfZG9jJGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3KSA9PSBudWxsID8gdm9pZCAwIDogX2RvYyRkZWZhdWx0Vmlldy52aXN1YWxWaWV3cG9ydCk7XG4gICAgfSk7XG4gICAgYW5jZXN0b3JzLmZvckVhY2goYW5jZXN0b3IgPT4ge1xuICAgICAgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGwsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGVzY2FwZUtleSAmJiBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVzY2FwZUtleUNhcHR1cmUgPyBjbG9zZU9uRXNjYXBlS2V5RG93bkNhcHR1cmUgOiBjbG9zZU9uRXNjYXBlS2V5RG93biwgZXNjYXBlS2V5Q2FwdHVyZSk7XG4gICAgICBvdXRzaWRlUHJlc3MgJiYgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIob3V0c2lkZVByZXNzRXZlbnQsIG91dHNpZGVQcmVzc0NhcHR1cmUgPyBjbG9zZU9uUHJlc3NPdXRzaWRlQ2FwdHVyZSA6IGNsb3NlT25QcmVzc091dHNpZGUsIG91dHNpZGVQcmVzc0NhcHR1cmUpO1xuICAgICAgYW5jZXN0b3JzLmZvckVhY2goYW5jZXN0b3IgPT4ge1xuICAgICAgICBhbmNlc3Rvci5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbCk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9LCBbZGF0YVJlZiwgZWxlbWVudHMsIGVzY2FwZUtleSwgb3V0c2lkZVByZXNzLCBvdXRzaWRlUHJlc3NFdmVudCwgb3Blbiwgb25PcGVuQ2hhbmdlLCBhbmNlc3RvclNjcm9sbCwgZW5hYmxlZCwgZXNjYXBlS2V5QnViYmxlcywgb3V0c2lkZVByZXNzQnViYmxlcywgY2xvc2VPbkVzY2FwZUtleURvd24sIGVzY2FwZUtleUNhcHR1cmUsIGNsb3NlT25Fc2NhcGVLZXlEb3duQ2FwdHVyZSwgY2xvc2VPblByZXNzT3V0c2lkZSwgb3V0c2lkZVByZXNzQ2FwdHVyZSwgY2xvc2VPblByZXNzT3V0c2lkZUNhcHR1cmVdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9LCBbb3V0c2lkZVByZXNzLCBvdXRzaWRlUHJlc3NFdmVudF0pO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgb25LZXlEb3duOiBjbG9zZU9uRXNjYXBlS2V5RG93bixcbiAgICBbYnViYmxlSGFuZGxlcktleXNbcmVmZXJlbmNlUHJlc3NFdmVudF1dOiBldmVudCA9PiB7XG4gICAgICBpZiAocmVmZXJlbmNlUHJlc3MpIHtcbiAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCwgJ3JlZmVyZW5jZS1wcmVzcycpO1xuICAgICAgfVxuICAgIH1cbiAgfSksIFtjbG9zZU9uRXNjYXBlS2V5RG93biwgb25PcGVuQ2hhbmdlLCByZWZlcmVuY2VQcmVzcywgcmVmZXJlbmNlUHJlc3NFdmVudF0pO1xuICBjb25zdCBmbG9hdGluZyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBvbktleURvd246IGNsb3NlT25Fc2NhcGVLZXlEb3duLFxuICAgIG9uTW91c2VEb3duKCkge1xuICAgICAgZW5kZWRPclN0YXJ0ZWRJbnNpZGVSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfSxcbiAgICBvbk1vdXNlVXAoKSB7XG4gICAgICBlbmRlZE9yU3RhcnRlZEluc2lkZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9LFxuICAgIFtjYXB0dXJlSGFuZGxlcktleXNbb3V0c2lkZVByZXNzRXZlbnRdXTogKCkgPT4ge1xuICAgICAgaW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cbiAgfSksIFtjbG9zZU9uRXNjYXBlS2V5RG93biwgb3V0c2lkZVByZXNzRXZlbnRdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmdcbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlLCBmbG9hdGluZ10pO1xufVxuXG5mdW5jdGlvbiB1c2VGbG9hdGluZ1Jvb3RDb250ZXh0KG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIG9wZW4gPSBmYWxzZSxcbiAgICBvbk9wZW5DaGFuZ2U6IG9uT3BlbkNoYW5nZVByb3AsXG4gICAgZWxlbWVudHM6IGVsZW1lbnRzUHJvcFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZmxvYXRpbmdJZCA9IHVzZUlkKCk7XG4gIGNvbnN0IGRhdGFSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICBjb25zdCBbZXZlbnRzXSA9IFJlYWN0LnVzZVN0YXRlKCgpID0+IGNyZWF0ZVB1YlN1YigpKTtcbiAgY29uc3QgbmVzdGVkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKSAhPSBudWxsO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc3Qgb3B0aW9uRG9tUmVmZXJlbmNlID0gZWxlbWVudHNQcm9wLnJlZmVyZW5jZTtcbiAgICBpZiAob3B0aW9uRG9tUmVmZXJlbmNlICYmICFpc0VsZW1lbnQob3B0aW9uRG9tUmVmZXJlbmNlKSkge1xuICAgICAgZXJyb3IoJ0Nhbm5vdCBwYXNzIGEgdmlydHVhbCBlbGVtZW50IHRvIHRoZSBgZWxlbWVudHMucmVmZXJlbmNlYCBvcHRpb24sJywgJ2FzIGl0IG11c3QgYmUgYSByZWFsIERPTSBlbGVtZW50LiBVc2UgYHJlZnMuc2V0UG9zaXRpb25SZWZlcmVuY2UoKWAnLCAnaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW3Bvc2l0aW9uUmVmZXJlbmNlLCBzZXRQb3NpdGlvblJlZmVyZW5jZV0gPSBSZWFjdC51c2VTdGF0ZShlbGVtZW50c1Byb3AucmVmZXJlbmNlKTtcbiAgY29uc3Qgb25PcGVuQ2hhbmdlID0gdXNlRWZmZWN0RXZlbnQoKG9wZW4sIGV2ZW50LCByZWFzb24pID0+IHtcbiAgICBkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50ID0gb3BlbiA/IGV2ZW50IDogdW5kZWZpbmVkO1xuICAgIGV2ZW50cy5lbWl0KCdvcGVuY2hhbmdlJywge1xuICAgICAgb3BlbixcbiAgICAgIGV2ZW50LFxuICAgICAgcmVhc29uLFxuICAgICAgbmVzdGVkXG4gICAgfSk7XG4gICAgb25PcGVuQ2hhbmdlUHJvcCA9PSBudWxsIHx8IG9uT3BlbkNoYW5nZVByb3Aob3BlbiwgZXZlbnQsIHJlYXNvbik7XG4gIH0pO1xuICBjb25zdCByZWZzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHNldFBvc2l0aW9uUmVmZXJlbmNlXG4gIH0pLCBbXSk7XG4gIGNvbnN0IGVsZW1lbnRzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJlZmVyZW5jZTogcG9zaXRpb25SZWZlcmVuY2UgfHwgZWxlbWVudHNQcm9wLnJlZmVyZW5jZSB8fCBudWxsLFxuICAgIGZsb2F0aW5nOiBlbGVtZW50c1Byb3AuZmxvYXRpbmcgfHwgbnVsbCxcbiAgICBkb21SZWZlcmVuY2U6IGVsZW1lbnRzUHJvcC5yZWZlcmVuY2VcbiAgfSksIFtwb3NpdGlvblJlZmVyZW5jZSwgZWxlbWVudHNQcm9wLnJlZmVyZW5jZSwgZWxlbWVudHNQcm9wLmZsb2F0aW5nXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZGF0YVJlZixcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBlbGVtZW50cyxcbiAgICBldmVudHMsXG4gICAgZmxvYXRpbmdJZCxcbiAgICByZWZzXG4gIH0pLCBbb3Blbiwgb25PcGVuQ2hhbmdlLCBlbGVtZW50cywgZXZlbnRzLCBmbG9hdGluZ0lkLCByZWZzXSk7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhIGZsb2F0aW5nIGVsZW1lbnQgYW5kIGNvbnRleHQgdG8gYWRkIGludGVyYWN0aW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VGbG9hdGluZ1xuICovXG5mdW5jdGlvbiB1c2VGbG9hdGluZyhvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG5vZGVJZFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaW50ZXJuYWxSb290Q29udGV4dCA9IHVzZUZsb2F0aW5nUm9vdENvbnRleHQoe1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIHJlZmVyZW5jZTogbnVsbCxcbiAgICAgIGZsb2F0aW5nOiBudWxsLFxuICAgICAgLi4ub3B0aW9ucy5lbGVtZW50c1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHJvb3RDb250ZXh0ID0gb3B0aW9ucy5yb290Q29udGV4dCB8fCBpbnRlcm5hbFJvb3RDb250ZXh0O1xuICBjb25zdCBjb21wdXRlZEVsZW1lbnRzID0gcm9vdENvbnRleHQuZWxlbWVudHM7XG4gIGNvbnN0IFtfZG9tUmVmZXJlbmNlLCBzZXREb21SZWZlcmVuY2VdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtwb3NpdGlvblJlZmVyZW5jZSwgX3NldFBvc2l0aW9uUmVmZXJlbmNlXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBvcHRpb25Eb21SZWZlcmVuY2UgPSBjb21wdXRlZEVsZW1lbnRzID09IG51bGwgPyB2b2lkIDAgOiBjb21wdXRlZEVsZW1lbnRzLnJlZmVyZW5jZTtcbiAgY29uc3QgZG9tUmVmZXJlbmNlID0gb3B0aW9uRG9tUmVmZXJlbmNlIHx8IF9kb21SZWZlcmVuY2U7XG4gIGNvbnN0IGRvbVJlZmVyZW5jZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgdHJlZSA9IHVzZUZsb2F0aW5nVHJlZSgpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGRvbVJlZmVyZW5jZSkge1xuICAgICAgZG9tUmVmZXJlbmNlUmVmLmN1cnJlbnQgPSBkb21SZWZlcmVuY2U7XG4gICAgfVxuICB9LCBbZG9tUmVmZXJlbmNlXSk7XG4gIGNvbnN0IHBvc2l0aW9uID0gdXNlRmxvYXRpbmckMSh7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBlbGVtZW50czoge1xuICAgICAgLi4uY29tcHV0ZWRFbGVtZW50cyxcbiAgICAgIC4uLihwb3NpdGlvblJlZmVyZW5jZSAmJiB7XG4gICAgICAgIHJlZmVyZW5jZTogcG9zaXRpb25SZWZlcmVuY2VcbiAgICAgIH0pXG4gICAgfVxuICB9KTtcbiAgY29uc3Qgc2V0UG9zaXRpb25SZWZlcmVuY2UgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBjb25zdCBjb21wdXRlZFBvc2l0aW9uUmVmZXJlbmNlID0gaXNFbGVtZW50KG5vZGUpID8ge1xuICAgICAgZ2V0Qm91bmRpbmdDbGllbnRSZWN0OiAoKSA9PiBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgY29udGV4dEVsZW1lbnQ6IG5vZGVcbiAgICB9IDogbm9kZTtcbiAgICAvLyBTdG9yZSB0aGUgcG9zaXRpb25SZWZlcmVuY2UgaW4gc3RhdGUgaWYgdGhlIERPTSByZWZlcmVuY2UgaXMgc3BlY2lmaWVkIGV4dGVybmFsbHkgdmlhIHRoZVxuICAgIC8vIGBlbGVtZW50cy5yZWZlcmVuY2VgIG9wdGlvbi4gVGhpcyBlbnN1cmVzIHRoYXQgaXQgd29uJ3QgYmUgb3ZlcnJpZGRlbiBvbiBmdXR1cmUgcmVuZGVycy5cbiAgICBfc2V0UG9zaXRpb25SZWZlcmVuY2UoY29tcHV0ZWRQb3NpdGlvblJlZmVyZW5jZSk7XG4gICAgcG9zaXRpb24ucmVmcy5zZXRSZWZlcmVuY2UoY29tcHV0ZWRQb3NpdGlvblJlZmVyZW5jZSk7XG4gIH0sIFtwb3NpdGlvbi5yZWZzXSk7XG4gIGNvbnN0IHNldFJlZmVyZW5jZSA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIGlmIChpc0VsZW1lbnQobm9kZSkgfHwgbm9kZSA9PT0gbnVsbCkge1xuICAgICAgZG9tUmVmZXJlbmNlUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgc2V0RG9tUmVmZXJlbmNlKG5vZGUpO1xuICAgIH1cblxuICAgIC8vIEJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGZvciBwYXNzaW5nIGEgdmlydHVhbCBlbGVtZW50IHRvIGByZWZlcmVuY2VgXG4gICAgLy8gYWZ0ZXIgaXQgaGFzIHNldCB0aGUgRE9NIHJlZmVyZW5jZS5cbiAgICBpZiAoaXNFbGVtZW50KHBvc2l0aW9uLnJlZnMucmVmZXJlbmNlLmN1cnJlbnQpIHx8IHBvc2l0aW9uLnJlZnMucmVmZXJlbmNlLmN1cnJlbnQgPT09IG51bGwgfHxcbiAgICAvLyBEb24ndCBhbGxvdyBzZXR0aW5nIHZpcnR1YWwgZWxlbWVudHMgdXNpbmcgdGhlIG9sZCB0ZWNobmlxdWUgYmFjayB0b1xuICAgIC8vIGBudWxsYCB0byBzdXBwb3J0IGBwb3NpdGlvblJlZmVyZW5jZWAgKyBhbiB1bnN0YWJsZSBgcmVmZXJlbmNlYFxuICAgIC8vIGNhbGxiYWNrIHJlZi5cbiAgICBub2RlICE9PSBudWxsICYmICFpc0VsZW1lbnQobm9kZSkpIHtcbiAgICAgIHBvc2l0aW9uLnJlZnMuc2V0UmVmZXJlbmNlKG5vZGUpO1xuICAgIH1cbiAgfSwgW3Bvc2l0aW9uLnJlZnNdKTtcbiAgY29uc3QgcmVmcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5wb3NpdGlvbi5yZWZzLFxuICAgIHNldFJlZmVyZW5jZSxcbiAgICBzZXRQb3NpdGlvblJlZmVyZW5jZSxcbiAgICBkb21SZWZlcmVuY2U6IGRvbVJlZmVyZW5jZVJlZlxuICB9KSwgW3Bvc2l0aW9uLnJlZnMsIHNldFJlZmVyZW5jZSwgc2V0UG9zaXRpb25SZWZlcmVuY2VdKTtcbiAgY29uc3QgZWxlbWVudHMgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgLi4ucG9zaXRpb24uZWxlbWVudHMsXG4gICAgZG9tUmVmZXJlbmNlOiBkb21SZWZlcmVuY2VcbiAgfSksIFtwb3NpdGlvbi5lbGVtZW50cywgZG9tUmVmZXJlbmNlXSk7XG4gIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgLi4ucG9zaXRpb24sXG4gICAgLi4ucm9vdENvbnRleHQsXG4gICAgcmVmcyxcbiAgICBlbGVtZW50cyxcbiAgICBub2RlSWRcbiAgfSksIFtwb3NpdGlvbiwgcmVmcywgZWxlbWVudHMsIG5vZGVJZCwgcm9vdENvbnRleHRdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIHJvb3RDb250ZXh0LmRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQgPSBjb250ZXh0O1xuICAgIGNvbnN0IG5vZGUgPSB0cmVlID09IG51bGwgPyB2b2lkIDAgOiB0cmVlLm5vZGVzUmVmLmN1cnJlbnQuZmluZChub2RlID0+IG5vZGUuaWQgPT09IG5vZGVJZCk7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIG5vZGUuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5wb3NpdGlvbixcbiAgICBjb250ZXh0LFxuICAgIHJlZnMsXG4gICAgZWxlbWVudHNcbiAgfSksIFtwb3NpdGlvbiwgcmVmcywgZWxlbWVudHMsIGNvbnRleHRdKTtcbn1cblxuLyoqXG4gKiBPcGVucyB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGlsZSB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgaGFzIGZvY3VzLCBsaWtlIENTU1xuICogYDpmb2N1c2AuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlRm9jdXNcbiAqL1xuZnVuY3Rpb24gdXNlRm9jdXMoY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBldmVudHMsXG4gICAgZGF0YVJlZixcbiAgICBlbGVtZW50c1xuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIHZpc2libGVPbmx5ID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGJsb2NrRm9jdXNSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCB0aW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IGtleWJvYXJkTW9kYWxpdHlSZWYgPSBSZWFjdC51c2VSZWYodHJ1ZSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgY29uc3Qgd2luID0gZ2V0V2luZG93KGVsZW1lbnRzLmRvbVJlZmVyZW5jZSk7XG5cbiAgICAvLyBJZiB0aGUgcmVmZXJlbmNlIHdhcyBmb2N1c2VkIGFuZCB0aGUgdXNlciBsZWZ0IHRoZSB0YWIvd2luZG93LCBhbmQgdGhlXG4gICAgLy8gZmxvYXRpbmcgZWxlbWVudCB3YXMgbm90IG9wZW4sIHRoZSBmb2N1cyBzaG91bGQgYmUgYmxvY2tlZCB3aGVuIHRoZXlcbiAgICAvLyByZXR1cm4gdG8gdGhlIHRhYi93aW5kb3cuXG4gICAgZnVuY3Rpb24gb25CbHVyKCkge1xuICAgICAgaWYgKCFvcGVuICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlKSAmJiBlbGVtZW50cy5kb21SZWZlcmVuY2UgPT09IGFjdGl2ZUVsZW1lbnQoZ2V0RG9jdW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlKSkpIHtcbiAgICAgICAgYmxvY2tGb2N1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25LZXlEb3duKCkge1xuICAgICAga2V5Ym9hcmRNb2RhbGl0eVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbkJsdXIpO1xuICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duLCB0cnVlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbkJsdXIpO1xuICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24sIHRydWUpO1xuICAgIH07XG4gIH0sIFtlbGVtZW50cy5kb21SZWZlcmVuY2UsIG9wZW4sIGVuYWJsZWRdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBmdW5jdGlvbiBvbk9wZW5DaGFuZ2UoX3JlZikge1xuICAgICAgbGV0IHtcbiAgICAgICAgcmVhc29uXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIGlmIChyZWFzb24gPT09ICdyZWZlcmVuY2UtcHJlc3MnIHx8IHJlYXNvbiA9PT0gJ2VzY2FwZS1rZXknKSB7XG4gICAgICAgIGJsb2NrRm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGV2ZW50cy5vbignb3BlbmNoYW5nZScsIG9uT3BlbkNoYW5nZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGV2ZW50cy5vZmYoJ29wZW5jaGFuZ2UnLCBvbk9wZW5DaGFuZ2UpO1xuICAgIH07XG4gIH0sIFtldmVudHMsIGVuYWJsZWRdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgb25Qb2ludGVyRG93bihldmVudCkge1xuICAgICAgaWYgKGlzVmlydHVhbFBvaW50ZXJFdmVudChldmVudC5uYXRpdmVFdmVudCkpIHJldHVybjtcbiAgICAgIGtleWJvYXJkTW9kYWxpdHlSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0sXG4gICAgb25Nb3VzZUxlYXZlKCkge1xuICAgICAgYmxvY2tGb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSxcbiAgICBvbkZvY3VzKGV2ZW50KSB7XG4gICAgICBpZiAoYmxvY2tGb2N1c1JlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQubmF0aXZlRXZlbnQpO1xuICAgICAgaWYgKHZpc2libGVPbmx5ICYmIGlzRWxlbWVudCh0YXJnZXQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gTWFjIFNhZmFyaSB1bnJlbGlhYmx5IG1hdGNoZXMgYDpmb2N1cy12aXNpYmxlYCBvbiB0aGUgcmVmZXJlbmNlXG4gICAgICAgICAgLy8gaWYgZm9jdXMgd2FzIG91dHNpZGUgdGhlIHBhZ2UgaW5pdGlhbGx5IC0gdXNlIHRoZSBmYWxsYmFja1xuICAgICAgICAgIC8vIGluc3RlYWQuXG4gICAgICAgICAgaWYgKGlzU2FmYXJpKCkgJiYgaXNNYWMoKSkgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICBpZiAoIXRhcmdldC5tYXRjaGVzKCc6Zm9jdXMtdmlzaWJsZScpKSByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBPbGQgYnJvd3NlcnMgd2lsbCB0aHJvdyBhbiBlcnJvciB3aGVuIHVzaW5nIGA6Zm9jdXMtdmlzaWJsZWAuXG4gICAgICAgICAgaWYgKCFrZXlib2FyZE1vZGFsaXR5UmVmLmN1cnJlbnQgJiYgIWlzVHlwZWFibGVFbGVtZW50KHRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudC5uYXRpdmVFdmVudCwgJ2ZvY3VzJyk7XG4gICAgfSxcbiAgICBvbkJsdXIoZXZlbnQpIHtcbiAgICAgIGJsb2NrRm9jdXNSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICBjb25zdCBuYXRpdmVFdmVudCA9IGV2ZW50Lm5hdGl2ZUV2ZW50O1xuXG4gICAgICAvLyBIaXQgdGhlIG5vbi1tb2RhbCBmb2N1cyBtYW5hZ2VtZW50IHBvcnRhbCBndWFyZC4gRm9jdXMgd2lsbCBiZVxuICAgICAgLy8gbW92ZWQgaW50byB0aGUgZmxvYXRpbmcgZWxlbWVudCBpbW1lZGlhdGVseSBhZnRlci5cbiAgICAgIGNvbnN0IG1vdmVkVG9Gb2N1c0d1YXJkID0gaXNFbGVtZW50KHJlbGF0ZWRUYXJnZXQpICYmIHJlbGF0ZWRUYXJnZXQuaGFzQXR0cmlidXRlKGNyZWF0ZUF0dHJpYnV0ZSgnZm9jdXMtZ3VhcmQnKSkgJiYgcmVsYXRlZFRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpID09PSAnb3V0c2lkZSc7XG5cbiAgICAgIC8vIFdhaXQgZm9yIHRoZSB3aW5kb3cgYmx1ciBsaXN0ZW5lciB0byBmaXJlLlxuICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2YXIgX2RhdGFSZWYkY3VycmVudCRmbG9hO1xuICAgICAgICBjb25zdCBhY3RpdmVFbCA9IGFjdGl2ZUVsZW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlID8gZWxlbWVudHMuZG9tUmVmZXJlbmNlLm93bmVyRG9jdW1lbnQgOiBkb2N1bWVudCk7XG5cbiAgICAgICAgLy8gRm9jdXMgbGVmdCB0aGUgcGFnZSwga2VlcCBpdCBvcGVuLlxuICAgICAgICBpZiAoIXJlbGF0ZWRUYXJnZXQgJiYgYWN0aXZlRWwgPT09IGVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFdoZW4gZm9jdXNpbmcgdGhlIHJlZmVyZW5jZSBlbGVtZW50IChlLmcuIHJlZ3VsYXIgY2xpY2spLCB0aGVuXG4gICAgICAgIC8vIGNsaWNraW5nIGludG8gdGhlIGZsb2F0aW5nIGVsZW1lbnQsIHByZXZlbnQgaXQgZnJvbSBoaWRpbmcuXG4gICAgICAgIC8vIE5vdGU6IGl0IG11c3QgYmUgZm9jdXNhYmxlLCBlLmcuIGB0YWJpbmRleD1cIi0xXCJgLlxuICAgICAgICAvLyBXZSBjYW4gbm90IHJlbHkgb24gcmVsYXRlZFRhcmdldCB0byBwb2ludCB0byB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgIC8vIGFzIGl0IHdpbGwgb25seSBwb2ludCB0byB0aGUgc2hhZG93IGhvc3Qgb2YgdGhlIG5ld2x5IGZvY3VzZWQgZWxlbWVudFxuICAgICAgICAvLyBhbmQgbm90IHRoZSBlbGVtZW50IHRoYXQgYWN0dWFsbHkgaGFzIHJlY2VpdmVkIGZvY3VzIGlmIGl0IGlzIGxvY2F0ZWRcbiAgICAgICAgLy8gaW5zaWRlIGEgc2hhZG93IHJvb3QuXG4gICAgICAgIGlmIChjb250YWlucygoX2RhdGFSZWYkY3VycmVudCRmbG9hID0gZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhUmVmJGN1cnJlbnQkZmxvYS5yZWZzLmZsb2F0aW5nLmN1cnJlbnQsIGFjdGl2ZUVsKSB8fCBjb250YWlucyhlbGVtZW50cy5kb21SZWZlcmVuY2UsIGFjdGl2ZUVsKSB8fCBtb3ZlZFRvRm9jdXNHdWFyZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIG5hdGl2ZUV2ZW50LCAnZm9jdXMnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIFtkYXRhUmVmLCBlbGVtZW50cy5kb21SZWZlcmVuY2UsIG9uT3BlbkNoYW5nZSwgdmlzaWJsZU9ubHldKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2VcbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlXSk7XG59XG5cbmNvbnN0IEFDVElWRV9LRVkgPSAnYWN0aXZlJztcbmNvbnN0IFNFTEVDVEVEX0tFWSA9ICdzZWxlY3RlZCc7XG5mdW5jdGlvbiBtZXJnZVByb3BzKHVzZXJQcm9wcywgcHJvcHNMaXN0LCBlbGVtZW50S2V5KSB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaXNJdGVtID0gZWxlbWVudEtleSA9PT0gJ2l0ZW0nO1xuICBsZXQgZG9tVXNlclByb3BzID0gdXNlclByb3BzO1xuICBpZiAoaXNJdGVtICYmIHVzZXJQcm9wcykge1xuICAgIGNvbnN0IHtcbiAgICAgIFtBQ1RJVkVfS0VZXTogXyxcbiAgICAgIFtTRUxFQ1RFRF9LRVldOiBfXyxcbiAgICAgIC4uLnZhbGlkUHJvcHNcbiAgICB9ID0gdXNlclByb3BzO1xuICAgIGRvbVVzZXJQcm9wcyA9IHZhbGlkUHJvcHM7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi4oZWxlbWVudEtleSA9PT0gJ2Zsb2F0aW5nJyAmJiB7XG4gICAgICB0YWJJbmRleDogLTFcbiAgICB9KSxcbiAgICAuLi5kb21Vc2VyUHJvcHMsXG4gICAgLi4ucHJvcHNMaXN0Lm1hcCh2YWx1ZSA9PiB7XG4gICAgICBjb25zdCBwcm9wc09yR2V0UHJvcHMgPSB2YWx1ZSA/IHZhbHVlW2VsZW1lbnRLZXldIDogbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHNPckdldFByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB1c2VyUHJvcHMgPyBwcm9wc09yR2V0UHJvcHModXNlclByb3BzKSA6IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHNPckdldFByb3BzO1xuICAgIH0pLmNvbmNhdCh1c2VyUHJvcHMpLnJlZHVjZSgoYWNjLCBwcm9wcykgPT4ge1xuICAgICAgaWYgKCFwcm9wcykge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmVudHJpZXMocHJvcHMpLmZvckVhY2goX3JlZiA9PiB7XG4gICAgICAgIGxldCBba2V5LCB2YWx1ZV0gPSBfcmVmO1xuICAgICAgICBpZiAoaXNJdGVtICYmIFtBQ1RJVkVfS0VZLCBTRUxFQ1RFRF9LRVldLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleS5pbmRleE9mKCdvbicpID09PSAwKSB7XG4gICAgICAgICAgaWYgKCFtYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIG1hcC5zZXQoa2V5LCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBfbWFwJGdldDtcbiAgICAgICAgICAgIChfbWFwJGdldCA9IG1hcC5nZXQoa2V5KSkgPT0gbnVsbCB8fCBfbWFwJGdldC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGFjY1trZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX21hcCRnZXQyO1xuICAgICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAoX21hcCRnZXQyID0gbWFwLmdldChrZXkpKSA9PSBudWxsID8gdm9pZCAwIDogX21hcCRnZXQyLm1hcChmbiA9PiBmbiguLi5hcmdzKSkuZmluZCh2YWwgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KVxuICB9O1xufVxuLyoqXG4gKiBNZXJnZXMgYW4gYXJyYXkgb2YgaW50ZXJhY3Rpb24gaG9va3MnIHByb3BzIGludG8gcHJvcCBnZXR0ZXJzLCBhbGxvd2luZ1xuICogZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMgdG8gYmUgY29tcG9zZWQgdG9nZXRoZXIgd2l0aG91dCBvdmVyd3JpdGluZyBvbmVcbiAqIGFub3RoZXIuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlSW50ZXJhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHVzZUludGVyYWN0aW9ucyhwcm9wc0xpc3QpIHtcbiAgaWYgKHByb3BzTGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHNMaXN0ID0gW107XG4gIH1cbiAgY29uc3QgcmVmZXJlbmNlRGVwcyA9IHByb3BzTGlzdC5tYXAoa2V5ID0+IGtleSA9PSBudWxsID8gdm9pZCAwIDoga2V5LnJlZmVyZW5jZSk7XG4gIGNvbnN0IGZsb2F0aW5nRGVwcyA9IHByb3BzTGlzdC5tYXAoa2V5ID0+IGtleSA9PSBudWxsID8gdm9pZCAwIDoga2V5LmZsb2F0aW5nKTtcbiAgY29uc3QgaXRlbURlcHMgPSBwcm9wc0xpc3QubWFwKGtleSA9PiBrZXkgPT0gbnVsbCA/IHZvaWQgMCA6IGtleS5pdGVtKTtcbiAgY29uc3QgZ2V0UmVmZXJlbmNlUHJvcHMgPSBSZWFjdC51c2VDYWxsYmFjayh1c2VyUHJvcHMgPT4gbWVyZ2VQcm9wcyh1c2VyUHJvcHMsIHByb3BzTGlzdCwgJ3JlZmVyZW5jZScpLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIHJlZmVyZW5jZURlcHMpO1xuICBjb25zdCBnZXRGbG9hdGluZ1Byb3BzID0gUmVhY3QudXNlQ2FsbGJhY2sodXNlclByb3BzID0+IG1lcmdlUHJvcHModXNlclByb3BzLCBwcm9wc0xpc3QsICdmbG9hdGluZycpLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIGZsb2F0aW5nRGVwcyk7XG4gIGNvbnN0IGdldEl0ZW1Qcm9wcyA9IFJlYWN0LnVzZUNhbGxiYWNrKHVzZXJQcm9wcyA9PiBtZXJnZVByb3BzKHVzZXJQcm9wcywgcHJvcHNMaXN0LCAnaXRlbScpLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIGl0ZW1EZXBzKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBnZXRSZWZlcmVuY2VQcm9wcyxcbiAgICBnZXRGbG9hdGluZ1Byb3BzLFxuICAgIGdldEl0ZW1Qcm9wc1xuICB9KSwgW2dldFJlZmVyZW5jZVByb3BzLCBnZXRGbG9hdGluZ1Byb3BzLCBnZXRJdGVtUHJvcHNdKTtcbn1cblxubGV0IGlzUHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IGZhbHNlO1xuZnVuY3Rpb24gZG9Td2l0Y2gob3JpZW50YXRpb24sIHZlcnRpY2FsLCBob3Jpem9udGFsKSB7XG4gIHN3aXRjaCAob3JpZW50YXRpb24pIHtcbiAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICByZXR1cm4gdmVydGljYWw7XG4gICAgY2FzZSAnaG9yaXpvbnRhbCc6XG4gICAgICByZXR1cm4gaG9yaXpvbnRhbDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHZlcnRpY2FsIHx8IGhvcml6b250YWw7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzTWFpbk9yaWVudGF0aW9uS2V5KGtleSwgb3JpZW50YXRpb24pIHtcbiAgY29uc3QgdmVydGljYWwgPSBrZXkgPT09IEFSUk9XX1VQIHx8IGtleSA9PT0gQVJST1dfRE9XTjtcbiAgY29uc3QgaG9yaXpvbnRhbCA9IGtleSA9PT0gQVJST1dfTEVGVCB8fCBrZXkgPT09IEFSUk9XX1JJR0hUO1xuICByZXR1cm4gZG9Td2l0Y2gob3JpZW50YXRpb24sIHZlcnRpY2FsLCBob3Jpem9udGFsKTtcbn1cbmZ1bmN0aW9uIGlzTWFpbk9yaWVudGF0aW9uVG9FbmRLZXkoa2V5LCBvcmllbnRhdGlvbiwgcnRsKSB7XG4gIGNvbnN0IHZlcnRpY2FsID0ga2V5ID09PSBBUlJPV19ET1dOO1xuICBjb25zdCBob3Jpem9udGFsID0gcnRsID8ga2V5ID09PSBBUlJPV19MRUZUIDoga2V5ID09PSBBUlJPV19SSUdIVDtcbiAgcmV0dXJuIGRvU3dpdGNoKG9yaWVudGF0aW9uLCB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCkgfHwga2V5ID09PSAnRW50ZXInIHx8IGtleSA9PT0gJyAnIHx8IGtleSA9PT0gJyc7XG59XG5mdW5jdGlvbiBpc0Nyb3NzT3JpZW50YXRpb25PcGVuS2V5KGtleSwgb3JpZW50YXRpb24sIHJ0bCkge1xuICBjb25zdCB2ZXJ0aWNhbCA9IHJ0bCA/IGtleSA9PT0gQVJST1dfTEVGVCA6IGtleSA9PT0gQVJST1dfUklHSFQ7XG4gIGNvbnN0IGhvcml6b250YWwgPSBrZXkgPT09IEFSUk9XX0RPV047XG4gIHJldHVybiBkb1N3aXRjaChvcmllbnRhdGlvbiwgdmVydGljYWwsIGhvcml6b250YWwpO1xufVxuZnVuY3Rpb24gaXNDcm9zc09yaWVudGF0aW9uQ2xvc2VLZXkoa2V5LCBvcmllbnRhdGlvbiwgcnRsKSB7XG4gIGNvbnN0IHZlcnRpY2FsID0gcnRsID8ga2V5ID09PSBBUlJPV19SSUdIVCA6IGtleSA9PT0gQVJST1dfTEVGVDtcbiAgY29uc3QgaG9yaXpvbnRhbCA9IGtleSA9PT0gQVJST1dfVVA7XG4gIHJldHVybiBkb1N3aXRjaChvcmllbnRhdGlvbiwgdmVydGljYWwsIGhvcml6b250YWwpO1xufVxuLyoqXG4gKiBBZGRzIGFycm93IGtleS1iYXNlZCBuYXZpZ2F0aW9uIG9mIGEgbGlzdCBvZiBpdGVtcywgZWl0aGVyIHVzaW5nIHJlYWwgRE9NXG4gKiBmb2N1cyBvciB2aXJ0dWFsIGZvY3VzLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUxpc3ROYXZpZ2F0aW9uXG4gKi9cbmZ1bmN0aW9uIHVzZUxpc3ROYXZpZ2F0aW9uKGNvbnRleHQsIHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBlbGVtZW50c1xuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGxpc3RSZWYsXG4gICAgYWN0aXZlSW5kZXgsXG4gICAgb25OYXZpZ2F0ZTogdW5zdGFibGVfb25OYXZpZ2F0ZSA9ICgpID0+IHt9LFxuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIHNlbGVjdGVkSW5kZXggPSBudWxsLFxuICAgIGFsbG93RXNjYXBlID0gZmFsc2UsXG4gICAgbG9vcCA9IGZhbHNlLFxuICAgIG5lc3RlZCA9IGZhbHNlLFxuICAgIHJ0bCA9IGZhbHNlLFxuICAgIHZpcnR1YWwgPSBmYWxzZSxcbiAgICBmb2N1c0l0ZW1Pbk9wZW4gPSAnYXV0bycsXG4gICAgZm9jdXNJdGVtT25Ib3ZlciA9IHRydWUsXG4gICAgb3Blbk9uQXJyb3dLZXlEb3duID0gdHJ1ZSxcbiAgICBkaXNhYmxlZEluZGljZXMgPSB1bmRlZmluZWQsXG4gICAgb3JpZW50YXRpb24gPSAndmVydGljYWwnLFxuICAgIGNvbHMgPSAxLFxuICAgIHNjcm9sbEl0ZW1JbnRvVmlldyA9IHRydWUsXG4gICAgdmlydHVhbEl0ZW1SZWYsXG4gICAgaXRlbVNpemVzLFxuICAgIGRlbnNlID0gZmFsc2VcbiAgfSA9IHByb3BzO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKGFsbG93RXNjYXBlKSB7XG4gICAgICBpZiAoIWxvb3ApIHtcbiAgICAgICAgd2FybignYHVzZUxpc3ROYXZpZ2F0aW9uYCBsb29waW5nIG11c3QgYmUgZW5hYmxlZCB0byBhbGxvdyBlc2NhcGluZy4nKTtcbiAgICAgIH1cbiAgICAgIGlmICghdmlydHVhbCkge1xuICAgICAgICB3YXJuKCdgdXNlTGlzdE5hdmlnYXRpb25gIG11c3QgYmUgdmlydHVhbCB0byBhbGxvdyBlc2NhcGluZy4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9yaWVudGF0aW9uID09PSAndmVydGljYWwnICYmIGNvbHMgPiAxKSB7XG4gICAgICB3YXJuKCdJbiBncmlkIGxpc3QgbmF2aWdhdGlvbiBtb2RlIChgY29sc2AgPiAxKSwgdGhlIGBvcmllbnRhdGlvbmAgc2hvdWxkJywgJ2JlIGVpdGhlciBcImhvcml6b250YWxcIiBvciBcImJvdGhcIi4nKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGFyZW50SWQgPSB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCgpO1xuICBjb25zdCB0cmVlID0gdXNlRmxvYXRpbmdUcmVlKCk7XG4gIGNvbnN0IG9uTmF2aWdhdGUgPSB1c2VFZmZlY3RFdmVudCh1bnN0YWJsZV9vbk5hdmlnYXRlKTtcbiAgY29uc3QgZm9jdXNJdGVtT25PcGVuUmVmID0gUmVhY3QudXNlUmVmKGZvY3VzSXRlbU9uT3Blbik7XG4gIGNvbnN0IGluZGV4UmVmID0gUmVhY3QudXNlUmVmKHNlbGVjdGVkSW5kZXggIT0gbnVsbCA/IHNlbGVjdGVkSW5kZXggOiAtMSk7XG4gIGNvbnN0IGtleVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgaXNQb2ludGVyTW9kYWxpdHlSZWYgPSBSZWFjdC51c2VSZWYodHJ1ZSk7XG4gIGNvbnN0IHByZXZpb3VzT25OYXZpZ2F0ZVJlZiA9IFJlYWN0LnVzZVJlZihvbk5hdmlnYXRlKTtcbiAgY29uc3QgcHJldmlvdXNNb3VudGVkUmVmID0gUmVhY3QudXNlUmVmKCEhZWxlbWVudHMuZmxvYXRpbmcpO1xuICBjb25zdCBwcmV2aW91c09wZW5SZWYgPSBSZWFjdC51c2VSZWYob3Blbik7XG4gIGNvbnN0IGZvcmNlU3luY0ZvY3VzID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgZm9yY2VTY3JvbGxJbnRvVmlld1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGRpc2FibGVkSW5kaWNlc1JlZiA9IHVzZUxhdGVzdFJlZihkaXNhYmxlZEluZGljZXMpO1xuICBjb25zdCBsYXRlc3RPcGVuUmVmID0gdXNlTGF0ZXN0UmVmKG9wZW4pO1xuICBjb25zdCBzY3JvbGxJdGVtSW50b1ZpZXdSZWYgPSB1c2VMYXRlc3RSZWYoc2Nyb2xsSXRlbUludG9WaWV3KTtcbiAgY29uc3QgZmxvYXRpbmdSZWYgPSB1c2VMYXRlc3RSZWYoZWxlbWVudHMuZmxvYXRpbmcpO1xuICBjb25zdCBzZWxlY3RlZEluZGV4UmVmID0gdXNlTGF0ZXN0UmVmKHNlbGVjdGVkSW5kZXgpO1xuICBjb25zdCBbYWN0aXZlSWQsIHNldEFjdGl2ZUlkXSA9IFJlYWN0LnVzZVN0YXRlKCk7XG4gIGNvbnN0IFt2aXJ0dWFsSWQsIHNldFZpcnR1YWxJZF0gPSBSZWFjdC51c2VTdGF0ZSgpO1xuICBjb25zdCBmb2N1c0l0ZW0gPSB1c2VFZmZlY3RFdmVudChmdW5jdGlvbiAobGlzdFJlZiwgaW5kZXhSZWYsIGZvcmNlU2Nyb2xsSW50b1ZpZXcpIHtcbiAgICBpZiAoZm9yY2VTY3JvbGxJbnRvVmlldyA9PT0gdm9pZCAwKSB7XG4gICAgICBmb3JjZVNjcm9sbEludG9WaWV3ID0gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJ1bkZvY3VzKGl0ZW0pIHtcbiAgICAgIGlmICh2aXJ0dWFsKSB7XG4gICAgICAgIHNldEFjdGl2ZUlkKGl0ZW0uaWQpO1xuICAgICAgICB0cmVlID09IG51bGwgfHwgdHJlZS5ldmVudHMuZW1pdCgndmlydHVhbGZvY3VzJywgaXRlbSk7XG4gICAgICAgIGlmICh2aXJ0dWFsSXRlbVJlZikge1xuICAgICAgICAgIHZpcnR1YWxJdGVtUmVmLmN1cnJlbnQgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnF1ZXVlRm9jdXMoaXRlbSwge1xuICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWUsXG4gICAgICAgICAgLy8gTWFjIFNhZmFyaSBkb2VzIG5vdCBtb3ZlIHRoZSB2aXJ0dWFsIGN1cnNvciB1bmxlc3MgdGhlIGZvY3VzIGNhbGxcbiAgICAgICAgICAvLyBpcyBzeW5jLiBIb3dldmVyLCBmb3IgdGhlIHZlcnkgZmlyc3QgZm9jdXMgY2FsbCwgd2UgbmVlZCB0byB3YWl0XG4gICAgICAgICAgLy8gZm9yIHRoZSBwb3NpdGlvbiB0byBiZSByZWFkeSBpbiBvcmRlciB0byBwcmV2ZW50IHVud2FudGVkXG4gICAgICAgICAgLy8gc2Nyb2xsaW5nLiBUaGlzIG1lYW5zIHRoZSB2aXJ0dWFsIGN1cnNvciB3aWxsIG5vdCBtb3ZlIHRvIHRoZSBmaXJzdFxuICAgICAgICAgIC8vIGl0ZW0gd2hlbiBmaXJzdCBvcGVuaW5nIHRoZSBmbG9hdGluZyBlbGVtZW50LCBidXQgd2lsbCBvblxuICAgICAgICAgIC8vIHN1YnNlcXVlbnQgY2FsbHMuIGBwcmV2ZW50U2Nyb2xsYCBpcyBzdXBwb3J0ZWQgaW4gbW9kZXJuIFNhZmFyaSxcbiAgICAgICAgICAvLyBzbyB3ZSBjYW4gdXNlIHRoYXQgaW5zdGVhZC5cbiAgICAgICAgICAvLyBpT1MgU2FmYXJpIG11c3QgYmUgYXN5bmMgb3IgdGhlIGZpcnN0IGl0ZW0gd2lsbCBub3QgYmUgZm9jdXNlZC5cbiAgICAgICAgICBzeW5jOiBpc01hYygpICYmIGlzU2FmYXJpKCkgPyBpc1ByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgfHwgZm9yY2VTeW5jRm9jdXMuY3VycmVudCA6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbml0aWFsSXRlbSA9IGxpc3RSZWYuY3VycmVudFtpbmRleFJlZi5jdXJyZW50XTtcbiAgICBpZiAoaW5pdGlhbEl0ZW0pIHtcbiAgICAgIHJ1bkZvY3VzKGluaXRpYWxJdGVtKTtcbiAgICB9XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGNvbnN0IHdhaXRlZEl0ZW0gPSBsaXN0UmVmLmN1cnJlbnRbaW5kZXhSZWYuY3VycmVudF0gfHwgaW5pdGlhbEl0ZW07XG4gICAgICBpZiAoIXdhaXRlZEl0ZW0pIHJldHVybjtcbiAgICAgIGlmICghaW5pdGlhbEl0ZW0pIHtcbiAgICAgICAgcnVuRm9jdXMod2FpdGVkSXRlbSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JvbGxJbnRvVmlld09wdGlvbnMgPSBzY3JvbGxJdGVtSW50b1ZpZXdSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHNob3VsZFNjcm9sbEludG9WaWV3ID0gc2Nyb2xsSW50b1ZpZXdPcHRpb25zICYmIGl0ZW0gJiYgKGZvcmNlU2Nyb2xsSW50b1ZpZXcgfHwgIWlzUG9pbnRlck1vZGFsaXR5UmVmLmN1cnJlbnQpO1xuICAgICAgaWYgKHNob3VsZFNjcm9sbEludG9WaWV3KSB7XG4gICAgICAgIC8vIEpTRE9NIGRvZXNuJ3Qgc3VwcG9ydCBgLnNjcm9sbEludG9WaWV3KClgIGJ1dCBpdCdzIHdpZGVseSBzdXBwb3J0ZWRcbiAgICAgICAgLy8gYnkgYWxsIGJyb3dzZXJzLlxuICAgICAgICB3YWl0ZWRJdGVtLnNjcm9sbEludG9WaWV3ID09IG51bGwgfHwgd2FpdGVkSXRlbS5zY3JvbGxJbnRvVmlldyh0eXBlb2Ygc2Nyb2xsSW50b1ZpZXdPcHRpb25zID09PSAnYm9vbGVhbicgPyB7XG4gICAgICAgICAgYmxvY2s6ICduZWFyZXN0JyxcbiAgICAgICAgICBpbmxpbmU6ICduZWFyZXN0J1xuICAgICAgICB9IDogc2Nyb2xsSW50b1ZpZXdPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5mb2N1cyh7XG4gICAgICBnZXQgcHJldmVudFNjcm9sbCgpIHtcbiAgICAgICAgaXNQcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbXSk7XG5cbiAgLy8gU3luYyBgc2VsZWN0ZWRJbmRleGAgdG8gYmUgdGhlIGBhY3RpdmVJbmRleGAgdXBvbiBvcGVuaW5nIHRoZSBmbG9hdGluZ1xuICAvLyBlbGVtZW50LiBBbHNvLCByZXNldCBgYWN0aXZlSW5kZXhgIHVwb24gY2xvc2luZyB0aGUgZmxvYXRpbmcgZWxlbWVudC5cbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGlmIChvcGVuICYmIGVsZW1lbnRzLmZsb2F0aW5nKSB7XG4gICAgICBpZiAoZm9jdXNJdGVtT25PcGVuUmVmLmN1cnJlbnQgJiYgc2VsZWN0ZWRJbmRleCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFJlZ2FyZGxlc3Mgb2YgdGhlIHBvaW50ZXIgbW9kYWxpdHksIHdlIHdhbnQgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZFxuICAgICAgICAvLyBpdGVtIGNvbWVzIGludG8gdmlldyB3aGVuIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzIG9wZW5lZC5cbiAgICAgICAgZm9yY2VTY3JvbGxJbnRvVmlld1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgIG9uTmF2aWdhdGUoc2VsZWN0ZWRJbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcmV2aW91c01vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgLy8gU2luY2UgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYG9uTmF2aWdhdGVgIGNvbmRpdGlvbmFsbHlcbiAgICAgIC8vIChvbk5hdmlnYXRlOiBvcGVuID8gc2V0QWN0aXZlSW5kZXggOiBzZXRTZWxlY3RlZEluZGV4KSxcbiAgICAgIC8vIHdlIHN0b3JlIGFuZCBjYWxsIHRoZSBwcmV2aW91cyBmdW5jdGlvbi5cbiAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICAgIHByZXZpb3VzT25OYXZpZ2F0ZVJlZi5jdXJyZW50KG51bGwpO1xuICAgIH1cbiAgfSwgW2VuYWJsZWQsIG9wZW4sIGVsZW1lbnRzLmZsb2F0aW5nLCBzZWxlY3RlZEluZGV4LCBvbk5hdmlnYXRlXSk7XG5cbiAgLy8gU3luYyBgYWN0aXZlSW5kZXhgIHRvIGJlIHRoZSBmb2N1c2VkIGl0ZW0gd2hpbGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXNcbiAgLy8gb3Blbi5cbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGlmIChvcGVuICYmIGVsZW1lbnRzLmZsb2F0aW5nKSB7XG4gICAgICBpZiAoYWN0aXZlSW5kZXggPT0gbnVsbCkge1xuICAgICAgICBmb3JjZVN5bmNGb2N1cy5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChzZWxlY3RlZEluZGV4UmVmLmN1cnJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHdoaWxlIHRoZSBmbG9hdGluZyBlbGVtZW50IHdhcyBvcGVuIChlLmcuIHRoZSBsaXN0IGNoYW5nZWQpLlxuICAgICAgICBpZiAocHJldmlvdXNNb3VudGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gLTE7XG4gICAgICAgICAgZm9jdXNJdGVtKGxpc3RSZWYsIGluZGV4UmVmKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWwgc3luYy5cbiAgICAgICAgaWYgKCghcHJldmlvdXNPcGVuUmVmLmN1cnJlbnQgfHwgIXByZXZpb3VzTW91bnRlZFJlZi5jdXJyZW50KSAmJiBmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCAmJiAoa2V5UmVmLmN1cnJlbnQgIT0gbnVsbCB8fCBmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCA9PT0gdHJ1ZSAmJiBrZXlSZWYuY3VycmVudCA9PSBudWxsKSkge1xuICAgICAgICAgIGxldCBydW5zID0gMDtcbiAgICAgICAgICBjb25zdCB3YWl0Rm9yTGlzdFBvcHVsYXRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChsaXN0UmVmLmN1cnJlbnRbMF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBBdm9pZCBsZXR0aW5nIHRoZSBicm93c2VyIHBhaW50IGlmIHBvc3NpYmxlIG9uIHRoZSBmaXJzdCB0cnksXG4gICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgckFGLiBEb24ndCB0cnkgbW9yZSB0aGFuIHR3aWNlLCBzaW5jZSBzb21ldGhpbmdcbiAgICAgICAgICAgICAgLy8gaXMgd3Jvbmcgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgICBpZiAocnVucyA8IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlZHVsZXIgPSBydW5zID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIDogcXVldWVNaWNyb3Rhc2s7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVyKHdhaXRGb3JMaXN0UG9wdWxhdGVkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBydW5zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0ga2V5UmVmLmN1cnJlbnQgPT0gbnVsbCB8fCBpc01haW5PcmllbnRhdGlvblRvRW5kS2V5KGtleVJlZi5jdXJyZW50LCBvcmllbnRhdGlvbiwgcnRsKSB8fCBuZXN0ZWQgPyBnZXRNaW5JbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXNSZWYuY3VycmVudCkgOiBnZXRNYXhJbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXNSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgIGtleVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgb25OYXZpZ2F0ZShpbmRleFJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHdhaXRGb3JMaXN0UG9wdWxhdGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzSW5kZXhPdXRPZkJvdW5kcyhsaXN0UmVmLCBhY3RpdmVJbmRleCkpIHtcbiAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGFjdGl2ZUluZGV4O1xuICAgICAgICBmb2N1c0l0ZW0obGlzdFJlZiwgaW5kZXhSZWYsIGZvcmNlU2Nyb2xsSW50b1ZpZXdSZWYuY3VycmVudCk7XG4gICAgICAgIGZvcmNlU2Nyb2xsSW50b1ZpZXdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2VuYWJsZWQsIG9wZW4sIGVsZW1lbnRzLmZsb2F0aW5nLCBhY3RpdmVJbmRleCwgc2VsZWN0ZWRJbmRleFJlZiwgbmVzdGVkLCBsaXN0UmVmLCBvcmllbnRhdGlvbiwgcnRsLCBvbk5hdmlnYXRlLCBmb2N1c0l0ZW0sIGRpc2FibGVkSW5kaWNlc1JlZl0pO1xuXG4gIC8vIEVuc3VyZSB0aGUgcGFyZW50IGZsb2F0aW5nIGVsZW1lbnQgaGFzIGZvY3VzIHdoZW4gYSBuZXN0ZWQgY2hpbGQgY2xvc2VzXG4gIC8vIHRvIGFsbG93IGFycm93IGtleSBuYXZpZ2F0aW9uIHRvIHdvcmsgYWZ0ZXIgdGhlIHBvaW50ZXIgbGVhdmVzIHRoZSBjaGlsZC5cbiAgaW5kZXgoKCkgPT4ge1xuICAgIHZhciBfbm9kZXMkZmluZDtcbiAgICBpZiAoIWVuYWJsZWQgfHwgZWxlbWVudHMuZmxvYXRpbmcgfHwgIXRyZWUgfHwgdmlydHVhbCB8fCAhcHJldmlvdXNNb3VudGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZXMgPSB0cmVlLm5vZGVzUmVmLmN1cnJlbnQ7XG4gICAgY29uc3QgcGFyZW50ID0gKF9ub2RlcyRmaW5kID0gbm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT09IHBhcmVudElkKSkgPT0gbnVsbCB8fCAoX25vZGVzJGZpbmQgPSBfbm9kZXMkZmluZC5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGVzJGZpbmQuZWxlbWVudHMuZmxvYXRpbmc7XG4gICAgY29uc3QgYWN0aXZlRWwgPSBhY3RpdmVFbGVtZW50KGdldERvY3VtZW50KGVsZW1lbnRzLmZsb2F0aW5nKSk7XG4gICAgY29uc3QgdHJlZUNvbnRhaW5zQWN0aXZlRWwgPSBub2Rlcy5zb21lKG5vZGUgPT4gbm9kZS5jb250ZXh0ICYmIGNvbnRhaW5zKG5vZGUuY29udGV4dC5lbGVtZW50cy5mbG9hdGluZywgYWN0aXZlRWwpKTtcbiAgICBpZiAocGFyZW50ICYmICF0cmVlQ29udGFpbnNBY3RpdmVFbCAmJiBpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50KSB7XG4gICAgICBwYXJlbnQuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtlbmFibGVkLCBlbGVtZW50cy5mbG9hdGluZywgdHJlZSwgcGFyZW50SWQsIHZpcnR1YWxdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGlmICghdHJlZSkgcmV0dXJuO1xuICAgIGlmICghdmlydHVhbCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnRJZCkgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIGhhbmRsZVZpcnR1YWxGb2N1cyhpdGVtKSB7XG4gICAgICBzZXRWaXJ0dWFsSWQoaXRlbS5pZCk7XG4gICAgICBpZiAodmlydHVhbEl0ZW1SZWYpIHtcbiAgICAgICAgdmlydHVhbEl0ZW1SZWYuY3VycmVudCA9IGl0ZW07XG4gICAgICB9XG4gICAgfVxuICAgIHRyZWUuZXZlbnRzLm9uKCd2aXJ0dWFsZm9jdXMnLCBoYW5kbGVWaXJ0dWFsRm9jdXMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0cmVlLmV2ZW50cy5vZmYoJ3ZpcnR1YWxmb2N1cycsIGhhbmRsZVZpcnR1YWxGb2N1cyk7XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIHRyZWUsIHZpcnR1YWwsIHBhcmVudElkLCB2aXJ0dWFsSXRlbVJlZl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgcHJldmlvdXNPbk5hdmlnYXRlUmVmLmN1cnJlbnQgPSBvbk5hdmlnYXRlO1xuICAgIHByZXZpb3VzTW91bnRlZFJlZi5jdXJyZW50ID0gISFlbGVtZW50cy5mbG9hdGluZztcbiAgfSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIW9wZW4pIHtcbiAgICAgIGtleVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH0sIFtvcGVuXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBwcmV2aW91c09wZW5SZWYuY3VycmVudCA9IG9wZW47XG4gIH0sIFtvcGVuXSk7XG4gIGNvbnN0IGhhc0FjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXggIT0gbnVsbDtcbiAgY29uc3QgaXRlbSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHN5bmNDdXJyZW50VGFyZ2V0KGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIGlmICghb3BlbikgcmV0dXJuO1xuICAgICAgY29uc3QgaW5kZXggPSBsaXN0UmVmLmN1cnJlbnQuaW5kZXhPZihjdXJyZW50VGFyZ2V0KTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgb25OYXZpZ2F0ZShpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgb25Gb2N1cyhfcmVmKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgY3VycmVudFRhcmdldFxuICAgICAgICB9ID0gX3JlZjtcbiAgICAgICAgc3luY0N1cnJlbnRUYXJnZXQoY3VycmVudFRhcmdldCk7XG4gICAgICB9LFxuICAgICAgb25DbGljazogX3JlZjIgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGN1cnJlbnRUYXJnZXRcbiAgICAgICAgfSA9IF9yZWYyO1xuICAgICAgICByZXR1cm4gY3VycmVudFRhcmdldC5mb2N1cyh7XG4gICAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyBTYWZhcmlcbiAgICAgIC4uLihmb2N1c0l0ZW1PbkhvdmVyICYmIHtcbiAgICAgICAgb25Nb3VzZU1vdmUoX3JlZjMpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgY3VycmVudFRhcmdldFxuICAgICAgICAgIH0gPSBfcmVmMztcbiAgICAgICAgICBzeW5jQ3VycmVudFRhcmdldChjdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Qb2ludGVyTGVhdmUoX3JlZjQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgcG9pbnRlclR5cGVcbiAgICAgICAgICB9ID0gX3JlZjQ7XG4gICAgICAgICAgaWYgKCFpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50IHx8IHBvaW50ZXJUeXBlID09PSAndG91Y2gnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICAgICAgICBmb2N1c0l0ZW0obGlzdFJlZiwgaW5kZXhSZWYpO1xuICAgICAgICAgIG9uTmF2aWdhdGUobnVsbCk7XG4gICAgICAgICAgaWYgKCF2aXJ0dWFsKSB7XG4gICAgICAgICAgICBlbnF1ZXVlRm9jdXMoZmxvYXRpbmdSZWYuY3VycmVudCwge1xuICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gcHJvcHM7XG4gIH0sIFtvcGVuLCBmbG9hdGluZ1JlZiwgZm9jdXNJdGVtLCBmb2N1c0l0ZW1PbkhvdmVyLCBsaXN0UmVmLCBvbk5hdmlnYXRlLCB2aXJ0dWFsXSk7XG4gIGNvbnN0IGNvbW1vbk9uS2V5RG93biA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICBpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgZm9yY2VTeW5jRm9jdXMuY3VycmVudCA9IHRydWU7XG5cbiAgICAvLyBJZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBpcyBhbmltYXRpbmcgb3V0LCBpZ25vcmUgbmF2aWdhdGlvbi4gT3RoZXJ3aXNlLFxuICAgIC8vIHRoZSBgYWN0aXZlSW5kZXhgIGdldHMgc2V0IHRvIDAgZGVzcGl0ZSBub3QgYmVpbmcgb3BlbiBzbyB0aGUgbmV4dCB0aW1lXG4gICAgLy8gdGhlIHVzZXIgQXJyb3dEb3ducywgdGhlIGZpcnN0IGl0ZW0gd29uJ3QgYmUgZm9jdXNlZC5cbiAgICBpZiAoIWxhdGVzdE9wZW5SZWYuY3VycmVudCAmJiBldmVudC5jdXJyZW50VGFyZ2V0ID09PSBmbG9hdGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuZXN0ZWQgJiYgaXNDcm9zc09yaWVudGF0aW9uQ2xvc2VLZXkoZXZlbnQua2V5LCBvcmllbnRhdGlvbiwgcnRsKSkge1xuICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQubmF0aXZlRXZlbnQsICdsaXN0LW5hdmlnYXRpb24nKTtcbiAgICAgIGlmIChpc0hUTUxFbGVtZW50KGVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgJiYgIXZpcnR1YWwpIHtcbiAgICAgICAgZWxlbWVudHMuZG9tUmVmZXJlbmNlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGluZGV4UmVmLmN1cnJlbnQ7XG4gICAgY29uc3QgbWluSW5kZXggPSBnZXRNaW5JbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXMpO1xuICAgIGNvbnN0IG1heEluZGV4ID0gZ2V0TWF4SW5kZXgobGlzdFJlZiwgZGlzYWJsZWRJbmRpY2VzKTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnSG9tZScpIHtcbiAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICBpbmRleFJlZi5jdXJyZW50ID0gbWluSW5kZXg7XG4gICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW5kJykge1xuICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBtYXhJbmRleDtcbiAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgfVxuXG4gICAgLy8gR3JpZCBuYXZpZ2F0aW9uLlxuICAgIGlmIChjb2xzID4gMSkge1xuICAgICAgY29uc3Qgc2l6ZXMgPSBpdGVtU2l6ZXMgfHwgQXJyYXkuZnJvbSh7XG4gICAgICAgIGxlbmd0aDogbGlzdFJlZi5jdXJyZW50Lmxlbmd0aFxuICAgICAgfSwgKCkgPT4gKHtcbiAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgIGhlaWdodDogMVxuICAgICAgfSkpO1xuICAgICAgLy8gVG8gY2FsY3VsYXRlIG1vdmVtZW50cyBvbiB0aGUgZ3JpZCwgd2UgdXNlIGh5cG90aGV0aWNhbCBjZWxsIGluZGljZXNcbiAgICAgIC8vIGFzIGlmIGV2ZXJ5IGl0ZW0gd2FzIDF4MSwgdGhlbiBjb252ZXJ0IGJhY2sgdG8gcmVhbCBpbmRpY2VzLlxuICAgICAgY29uc3QgY2VsbE1hcCA9IGJ1aWxkQ2VsbE1hcChzaXplcywgY29scywgZGVuc2UpO1xuICAgICAgY29uc3QgbWluR3JpZEluZGV4ID0gY2VsbE1hcC5maW5kSW5kZXgoaW5kZXggPT4gaW5kZXggIT0gbnVsbCAmJiAhaXNEaXNhYmxlZChsaXN0UmVmLmN1cnJlbnQsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpKTtcbiAgICAgIC8vIGxhc3QgZW5hYmxlZCBpbmRleFxuICAgICAgY29uc3QgbWF4R3JpZEluZGV4ID0gY2VsbE1hcC5yZWR1Y2UoKGZvdW5kSW5kZXgsIGluZGV4LCBjZWxsSW5kZXgpID0+IGluZGV4ICE9IG51bGwgJiYgIWlzRGlzYWJsZWQobGlzdFJlZi5jdXJyZW50LCBpbmRleCwgZGlzYWJsZWRJbmRpY2VzKSA/IGNlbGxJbmRleCA6IGZvdW5kSW5kZXgsIC0xKTtcbiAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBjZWxsTWFwW2dldEdyaWROYXZpZ2F0ZWRJbmRleCh7XG4gICAgICAgIGN1cnJlbnQ6IGNlbGxNYXAubWFwKGl0ZW1JbmRleCA9PiBpdGVtSW5kZXggIT0gbnVsbCA/IGxpc3RSZWYuY3VycmVudFtpdGVtSW5kZXhdIDogbnVsbClcbiAgICAgIH0sIHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgICBsb29wLFxuICAgICAgICBjb2xzLFxuICAgICAgICAvLyB0cmVhdCB1bmRlZmluZWQgKGVtcHR5IGdyaWQgc3BhY2VzKSBhcyBkaXNhYmxlZCBpbmRpY2VzIHNvIHdlXG4gICAgICAgIC8vIGRvbid0IGVuZCB1cCBpbiB0aGVtXG4gICAgICAgIGRpc2FibGVkSW5kaWNlczogZ2V0Q2VsbEluZGljZXMoWy4uLihkaXNhYmxlZEluZGljZXMgfHwgbGlzdFJlZi5jdXJyZW50Lm1hcCgoXywgaW5kZXgpID0+IGlzRGlzYWJsZWQobGlzdFJlZi5jdXJyZW50LCBpbmRleCkgPyBpbmRleCA6IHVuZGVmaW5lZCkpLCB1bmRlZmluZWRdLCBjZWxsTWFwKSxcbiAgICAgICAgbWluSW5kZXg6IG1pbkdyaWRJbmRleCxcbiAgICAgICAgbWF4SW5kZXg6IG1heEdyaWRJbmRleCxcbiAgICAgICAgcHJldkluZGV4OiBnZXRDZWxsSW5kZXhPZkNvcm5lcihpbmRleFJlZi5jdXJyZW50ID4gbWF4SW5kZXggPyBtaW5JbmRleCA6IGluZGV4UmVmLmN1cnJlbnQsIHNpemVzLCBjZWxsTWFwLCBjb2xzLFxuICAgICAgICAvLyB1c2UgYSBjb3JuZXIgbWF0Y2hpbmcgdGhlIGVkZ2UgY2xvc2VzdCB0byB0aGUgZGlyZWN0aW9uXG4gICAgICAgIC8vIHdlJ3JlIG1vdmluZyBpbiBzbyB3ZSBkb24ndCBlbmQgdXAgaW4gdGhlIHNhbWUgaXRlbS4gUHJlZmVyXG4gICAgICAgIC8vIHRvcC9sZWZ0IG92ZXIgYm90dG9tL3JpZ2h0LlxuICAgICAgICBldmVudC5rZXkgPT09IEFSUk9XX0RPV04gPyAnYmwnIDogZXZlbnQua2V5ID09PSBBUlJPV19SSUdIVCA/ICd0cicgOiAndGwnKSxcbiAgICAgICAgc3RvcEV2ZW50OiB0cnVlXG4gICAgICB9KV07IC8vIG5hdmlnYXRlZCBjZWxsIHdpbGwgbmV2ZXIgYmUgbnVsbGlzaFxuXG4gICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnYm90aCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNNYWluT3JpZW50YXRpb25LZXkoZXZlbnQua2V5LCBvcmllbnRhdGlvbikpIHtcbiAgICAgIHN0b3BFdmVudChldmVudCk7XG5cbiAgICAgIC8vIFJlc2V0IHRoZSBpbmRleCBpZiBubyBpdGVtIGlzIGZvY3VzZWQuXG4gICAgICBpZiAob3BlbiAmJiAhdmlydHVhbCAmJiBhY3RpdmVFbGVtZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQub3duZXJEb2N1bWVudCkgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGlzTWFpbk9yaWVudGF0aW9uVG9FbmRLZXkoZXZlbnQua2V5LCBvcmllbnRhdGlvbiwgcnRsKSA/IG1pbkluZGV4IDogbWF4SW5kZXg7XG4gICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc01haW5PcmllbnRhdGlvblRvRW5kS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCkpIHtcbiAgICAgICAgaWYgKGxvb3ApIHtcbiAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gY3VycmVudEluZGV4ID49IG1heEluZGV4ID8gYWxsb3dFc2NhcGUgJiYgY3VycmVudEluZGV4ICE9PSBsaXN0UmVmLmN1cnJlbnQubGVuZ3RoID8gLTEgOiBtaW5JbmRleCA6IGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBNYXRoLm1pbihtYXhJbmRleCwgZmluZE5vbkRpc2FibGVkSW5kZXgobGlzdFJlZiwge1xuICAgICAgICAgICAgc3RhcnRpbmdJbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobG9vcCkge1xuICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBjdXJyZW50SW5kZXggPD0gbWluSW5kZXggPyBhbGxvd0VzY2FwZSAmJiBjdXJyZW50SW5kZXggIT09IC0xID8gbGlzdFJlZi5jdXJyZW50Lmxlbmd0aCA6IG1heEluZGV4IDogZmluZE5vbkRpc2FibGVkSW5kZXgobGlzdFJlZiwge1xuICAgICAgICAgICAgc3RhcnRpbmdJbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgZGVjcmVtZW50OiB0cnVlLFxuICAgICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IE1hdGgubWF4KG1pbkluZGV4LCBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCB7XG4gICAgICAgICAgICBzdGFydGluZ0luZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0luZGV4T3V0T2ZCb3VuZHMobGlzdFJlZiwgaW5kZXhSZWYuY3VycmVudCkpIHtcbiAgICAgICAgb25OYXZpZ2F0ZShudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3QgYXJpYUFjdGl2ZURlc2NlbmRhbnRQcm9wID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHZpcnR1YWwgJiYgb3BlbiAmJiBoYXNBY3RpdmVJbmRleCAmJiB7XG4gICAgICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogdmlydHVhbElkIHx8IGFjdGl2ZUlkXG4gICAgfTtcbiAgfSwgW3ZpcnR1YWwsIG9wZW4sIGhhc0FjdGl2ZUluZGV4LCB2aXJ0dWFsSWQsIGFjdGl2ZUlkXSk7XG4gIGNvbnN0IGZsb2F0aW5nID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdhcmlhLW9yaWVudGF0aW9uJzogb3JpZW50YXRpb24gPT09ICdib3RoJyA/IHVuZGVmaW5lZCA6IG9yaWVudGF0aW9uLFxuICAgICAgLi4uKCFpc1R5cGVhYmxlQ29tYm9ib3goZWxlbWVudHMuZG9tUmVmZXJlbmNlKSAmJiBhcmlhQWN0aXZlRGVzY2VuZGFudFByb3ApLFxuICAgICAgb25LZXlEb3duOiBjb21tb25PbktleURvd24sXG4gICAgICBvblBvaW50ZXJNb3ZlKCkge1xuICAgICAgICBpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbYXJpYUFjdGl2ZURlc2NlbmRhbnRQcm9wLCBjb21tb25PbktleURvd24sIGVsZW1lbnRzLmRvbVJlZmVyZW5jZSwgb3JpZW50YXRpb25dKTtcbiAgY29uc3QgcmVmZXJlbmNlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgZnVuY3Rpb24gY2hlY2tWaXJ0dWFsTW91c2UoZXZlbnQpIHtcbiAgICAgIGlmIChmb2N1c0l0ZW1Pbk9wZW4gPT09ICdhdXRvJyAmJiBpc1ZpcnR1YWxDbGljayhldmVudC5uYXRpdmVFdmVudCkpIHtcbiAgICAgICAgZm9jdXNJdGVtT25PcGVuUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1ZpcnR1YWxQb2ludGVyKGV2ZW50KSB7XG4gICAgICAvLyBgcG9pbnRlcmRvd25gIGZpcmVzIGZpcnN0LCByZXNldCB0aGUgc3RhdGUgdGhlbiBwZXJmb3JtIHRoZSBjaGVja3MuXG4gICAgICBmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCA9IGZvY3VzSXRlbU9uT3BlbjtcbiAgICAgIGlmIChmb2N1c0l0ZW1Pbk9wZW4gPT09ICdhdXRvJyAmJiBpc1ZpcnR1YWxQb2ludGVyRXZlbnQoZXZlbnQubmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIGZvY3VzSXRlbU9uT3BlblJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFyaWFBY3RpdmVEZXNjZW5kYW50UHJvcCxcbiAgICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgICBpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzQXJyb3dLZXkgPSBldmVudC5rZXkuaW5kZXhPZignQXJyb3cnKSA9PT0gMDtcbiAgICAgICAgY29uc3QgaXNDcm9zc09wZW5LZXkgPSBpc0Nyb3NzT3JpZW50YXRpb25PcGVuS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCk7XG4gICAgICAgIGNvbnN0IGlzQ3Jvc3NDbG9zZUtleSA9IGlzQ3Jvc3NPcmllbnRhdGlvbkNsb3NlS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCk7XG4gICAgICAgIGNvbnN0IGlzTWFpbktleSA9IGlzTWFpbk9yaWVudGF0aW9uS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24pO1xuICAgICAgICBjb25zdCBpc05hdmlnYXRpb25LZXkgPSAobmVzdGVkID8gaXNDcm9zc09wZW5LZXkgOiBpc01haW5LZXkpIHx8IGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkudHJpbSgpID09PSAnJztcbiAgICAgICAgaWYgKHZpcnR1YWwgJiYgb3Blbikge1xuICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gdHJlZSA9PSBudWxsID8gdm9pZCAwIDogdHJlZS5ub2Rlc1JlZi5jdXJyZW50LmZpbmQobm9kZSA9PiBub2RlLnBhcmVudElkID09IG51bGwpO1xuICAgICAgICAgIGNvbnN0IGRlZXBlc3ROb2RlID0gdHJlZSAmJiByb290Tm9kZSA/IGdldERlZXBlc3ROb2RlKHRyZWUubm9kZXNSZWYuY3VycmVudCwgcm9vdE5vZGUuaWQpIDogbnVsbDtcbiAgICAgICAgICBpZiAoaXNBcnJvd0tleSAmJiBkZWVwZXN0Tm9kZSAmJiB2aXJ0dWFsSXRlbVJlZikge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRPYmplY3QgPSBuZXcgS2V5Ym9hcmRFdmVudCgna2V5ZG93bicsIHtcbiAgICAgICAgICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGlzQ3Jvc3NPcGVuS2V5IHx8IGlzQ3Jvc3NDbG9zZUtleSkge1xuICAgICAgICAgICAgICB2YXIgX2RlZXBlc3ROb2RlJGNvbnRleHQsIF9kZWVwZXN0Tm9kZSRjb250ZXh0MjtcbiAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50VGFyZ2V0ID0gKChfZGVlcGVzdE5vZGUkY29udGV4dCA9IGRlZXBlc3ROb2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfZGVlcGVzdE5vZGUkY29udGV4dC5lbGVtZW50cy5kb21SZWZlcmVuY2UpID09PSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaEl0ZW0gPSBpc0Nyb3NzQ2xvc2VLZXkgJiYgIWlzQ3VycmVudFRhcmdldCA/IChfZGVlcGVzdE5vZGUkY29udGV4dDIgPSBkZWVwZXN0Tm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX2RlZXBlc3ROb2RlJGNvbnRleHQyLmVsZW1lbnRzLmRvbVJlZmVyZW5jZSA6IGlzQ3Jvc3NPcGVuS2V5ID8gbGlzdFJlZi5jdXJyZW50LmZpbmQoaXRlbSA9PiAoaXRlbSA9PSBudWxsID8gdm9pZCAwIDogaXRlbS5pZCkgPT09IGFjdGl2ZUlkKSA6IG51bGw7XG4gICAgICAgICAgICAgIGlmIChkaXNwYXRjaEl0ZW0pIHtcbiAgICAgICAgICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoSXRlbS5kaXNwYXRjaEV2ZW50KGV2ZW50T2JqZWN0KTtcbiAgICAgICAgICAgICAgICBzZXRWaXJ0dWFsSWQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzTWFpbktleSAmJiBkZWVwZXN0Tm9kZS5jb250ZXh0KSB7XG4gICAgICAgICAgICAgIGlmIChkZWVwZXN0Tm9kZS5jb250ZXh0Lm9wZW4gJiYgZGVlcGVzdE5vZGUucGFyZW50SWQgJiYgZXZlbnQuY3VycmVudFRhcmdldCAhPT0gZGVlcGVzdE5vZGUuY29udGV4dC5lbGVtZW50cy5kb21SZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2RlZXBlc3ROb2RlJGNvbnRleHQkO1xuICAgICAgICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgKF9kZWVwZXN0Tm9kZSRjb250ZXh0JCA9IGRlZXBlc3ROb2RlLmNvbnRleHQuZWxlbWVudHMuZG9tUmVmZXJlbmNlKSA9PSBudWxsIHx8IF9kZWVwZXN0Tm9kZSRjb250ZXh0JC5kaXNwYXRjaEV2ZW50KGV2ZW50T2JqZWN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbW1vbk9uS2V5RG93bihldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBhIGZsb2F0aW5nIGVsZW1lbnQgc2hvdWxkIG5vdCBvcGVuIG9uIGFycm93IGtleSBkb3duLCBhdm9pZFxuICAgICAgICAvLyBzZXR0aW5nIGBhY3RpdmVJbmRleGAgd2hpbGUgaXQncyBjbG9zZWQuXG4gICAgICAgIGlmICghb3BlbiAmJiAhb3Blbk9uQXJyb3dLZXlEb3duICYmIGlzQXJyb3dLZXkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmF2aWdhdGlvbktleSkge1xuICAgICAgICAgIGtleVJlZi5jdXJyZW50ID0gbmVzdGVkICYmIGlzTWFpbktleSA/IG51bGwgOiBldmVudC5rZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lc3RlZCkge1xuICAgICAgICAgIGlmIChpc0Nyb3NzT3BlbktleSkge1xuICAgICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBnZXRNaW5JbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXNSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdsaXN0LW5hdmlnYXRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc01haW5LZXkpIHtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gc2VsZWN0ZWRJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICBpZiAoIW9wZW4gJiYgb3Blbk9uQXJyb3dLZXlEb3duKSB7XG4gICAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdsaXN0LW5hdmlnYXRpb24nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbW9uT25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Gb2N1cygpIHtcbiAgICAgICAgaWYgKG9wZW4gJiYgIXZpcnR1YWwpIHtcbiAgICAgICAgICBvbk5hdmlnYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Qb2ludGVyRG93bjogY2hlY2tWaXJ0dWFsUG9pbnRlcixcbiAgICAgIG9uTW91c2VEb3duOiBjaGVja1ZpcnR1YWxNb3VzZSxcbiAgICAgIG9uQ2xpY2s6IGNoZWNrVmlydHVhbE1vdXNlXG4gICAgfTtcbiAgfSwgW2FjdGl2ZUlkLCBhcmlhQWN0aXZlRGVzY2VuZGFudFByb3AsIGNvbW1vbk9uS2V5RG93biwgZGlzYWJsZWRJbmRpY2VzUmVmLCBmb2N1c0l0ZW1Pbk9wZW4sIGxpc3RSZWYsIG5lc3RlZCwgb25OYXZpZ2F0ZSwgb25PcGVuQ2hhbmdlLCBvcGVuLCBvcGVuT25BcnJvd0tleURvd24sIG9yaWVudGF0aW9uLCBydGwsIHNlbGVjdGVkSW5kZXgsIHRyZWUsIHZpcnR1YWwsIHZpcnR1YWxJdGVtUmVmXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IGVuYWJsZWQgPyB7XG4gICAgcmVmZXJlbmNlLFxuICAgIGZsb2F0aW5nLFxuICAgIGl0ZW1cbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlLCBmbG9hdGluZywgaXRlbV0pO1xufVxuXG5jb25zdCBjb21wb25lbnRSb2xlVG9BcmlhUm9sZU1hcCA9IC8qI19fUFVSRV9fKi9uZXcgTWFwKFtbJ3NlbGVjdCcsICdsaXN0Ym94J10sIFsnY29tYm9ib3gnLCAnbGlzdGJveCddLCBbJ2xhYmVsJywgZmFsc2VdXSk7XG5cbi8qKlxuICogQWRkcyBiYXNlIHNjcmVlbiByZWFkZXIgcHJvcHMgdG8gdGhlIHJlZmVyZW5jZSBhbmQgZmxvYXRpbmcgZWxlbWVudHMgZm9yIGFcbiAqIGdpdmVuIGZsb2F0aW5nIGVsZW1lbnQgYHJvbGVgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZVJvbGVcbiAqL1xuZnVuY3Rpb24gdXNlUm9sZShjb250ZXh0LCBwcm9wcykge1xuICB2YXIgX2NvbXBvbmVudFJvbGVUb0FyaWFSO1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgZmxvYXRpbmdJZFxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIHJvbGUgPSAnZGlhbG9nJ1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGFyaWFSb2xlID0gKF9jb21wb25lbnRSb2xlVG9BcmlhUiA9IGNvbXBvbmVudFJvbGVUb0FyaWFSb2xlTWFwLmdldChyb2xlKSkgIT0gbnVsbCA/IF9jb21wb25lbnRSb2xlVG9BcmlhUiA6IHJvbGU7XG4gIGNvbnN0IHJlZmVyZW5jZUlkID0gdXNlSWQoKTtcbiAgY29uc3QgcGFyZW50SWQgPSB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCgpO1xuICBjb25zdCBpc05lc3RlZCA9IHBhcmVudElkICE9IG51bGw7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChhcmlhUm9sZSA9PT0gJ3Rvb2x0aXAnIHx8IHJvbGUgPT09ICdsYWJlbCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtcImFyaWEtXCIgKyAocm9sZSA9PT0gJ2xhYmVsJyA/ICdsYWJlbGxlZGJ5JyA6ICdkZXNjcmliZWRieScpXTogb3BlbiA/IGZsb2F0aW5nSWQgOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAnYXJpYS1leHBhbmRlZCc6IG9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgJ2FyaWEtaGFzcG9wdXAnOiBhcmlhUm9sZSA9PT0gJ2FsZXJ0ZGlhbG9nJyA/ICdkaWFsb2cnIDogYXJpYVJvbGUsXG4gICAgICAnYXJpYS1jb250cm9scyc6IG9wZW4gPyBmbG9hdGluZ0lkIDogdW5kZWZpbmVkLFxuICAgICAgLi4uKGFyaWFSb2xlID09PSAnbGlzdGJveCcgJiYge1xuICAgICAgICByb2xlOiAnY29tYm9ib3gnXG4gICAgICB9KSxcbiAgICAgIC4uLihhcmlhUm9sZSA9PT0gJ21lbnUnICYmIHtcbiAgICAgICAgaWQ6IHJlZmVyZW5jZUlkXG4gICAgICB9KSxcbiAgICAgIC4uLihhcmlhUm9sZSA9PT0gJ21lbnUnICYmIGlzTmVzdGVkICYmIHtcbiAgICAgICAgcm9sZTogJ21lbnVpdGVtJ1xuICAgICAgfSksXG4gICAgICAuLi4ocm9sZSA9PT0gJ3NlbGVjdCcgJiYge1xuICAgICAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAnbm9uZSdcbiAgICAgIH0pLFxuICAgICAgLi4uKHJvbGUgPT09ICdjb21ib2JveCcgJiYge1xuICAgICAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAnbGlzdCdcbiAgICAgIH0pXG4gICAgfTtcbiAgfSwgW2FyaWFSb2xlLCBmbG9hdGluZ0lkLCBpc05lc3RlZCwgb3BlbiwgcmVmZXJlbmNlSWQsIHJvbGVdKTtcbiAgY29uc3QgZmxvYXRpbmcgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBmbG9hdGluZ1Byb3BzID0ge1xuICAgICAgaWQ6IGZsb2F0aW5nSWQsXG4gICAgICAuLi4oYXJpYVJvbGUgJiYge1xuICAgICAgICByb2xlOiBhcmlhUm9sZVxuICAgICAgfSlcbiAgICB9O1xuICAgIGlmIChhcmlhUm9sZSA9PT0gJ3Rvb2x0aXAnIHx8IHJvbGUgPT09ICdsYWJlbCcpIHtcbiAgICAgIHJldHVybiBmbG9hdGluZ1Byb3BzO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZmxvYXRpbmdQcm9wcyxcbiAgICAgIC4uLihhcmlhUm9sZSA9PT0gJ21lbnUnICYmIHtcbiAgICAgICAgJ2FyaWEtbGFiZWxsZWRieSc6IHJlZmVyZW5jZUlkXG4gICAgICB9KVxuICAgIH07XG4gIH0sIFthcmlhUm9sZSwgZmxvYXRpbmdJZCwgcmVmZXJlbmNlSWQsIHJvbGVdKTtcbiAgY29uc3QgaXRlbSA9IFJlYWN0LnVzZUNhbGxiYWNrKF9yZWYgPT4ge1xuICAgIGxldCB7XG4gICAgICBhY3RpdmUsXG4gICAgICBzZWxlY3RlZFxuICAgIH0gPSBfcmVmO1xuICAgIGNvbnN0IGNvbW1vblByb3BzID0ge1xuICAgICAgcm9sZTogJ29wdGlvbicsXG4gICAgICAuLi4oYWN0aXZlICYmIHtcbiAgICAgICAgaWQ6IGZsb2F0aW5nSWQgKyBcIi1vcHRpb25cIlxuICAgICAgfSlcbiAgICB9O1xuXG4gICAgLy8gRm9yIGBtZW51YCwgd2UgYXJlIHVuYWJsZSB0byB0ZWxsIGlmIHRoZSBpdGVtIGlzIGEgYG1lbnVpdGVtcmFkaW9gXG4gICAgLy8gb3IgYG1lbnVpdGVtY2hlY2tib3hgLiBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgcmVhc29ucywgYWxzb1xuICAgIC8vIGF2b2lkIGRlZmF1bHRpbmcgdG8gYG1lbnVpdGVtYCBhcyBpdCBtYXkgb3ZlcndyaXRlIGN1c3RvbSByb2xlIHByb3BzLlxuICAgIHN3aXRjaCAocm9sZSkge1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb21tb25Qcm9wcyxcbiAgICAgICAgICAnYXJpYS1zZWxlY3RlZCc6IGFjdGl2ZSAmJiBzZWxlY3RlZFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnY29tYm9ib3gnOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICAgICAgLi4uKGFjdGl2ZSAmJiB7XG4gICAgICAgICAgICAgICdhcmlhLXNlbGVjdGVkJzogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfSwgW2Zsb2F0aW5nSWQsIHJvbGVdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmcsXG4gICAgaXRlbVxuICB9IDoge30sIFtlbmFibGVkLCByZWZlcmVuY2UsIGZsb2F0aW5nLCBpdGVtXSk7XG59XG5cbi8vIENvbnZlcnRzIGEgSlMgc3R5bGUga2V5IGxpa2UgYGJhY2tncm91bmRDb2xvcmAgdG8gYSBDU1MgdHJhbnNpdGlvbi1wcm9wZXJ0eVxuLy8gbGlrZSBgYmFja2dyb3VuZC1jb2xvcmAuXG5jb25zdCBjYW1lbENhc2VUb0tlYmFiQ2FzZSA9IHN0ciA9PiBzdHIucmVwbGFjZSgvW0EtWl0rKD8hW2Etel0pfFtBLVpdL2csICgkLCBvZnMpID0+IChvZnMgPyAnLScgOiAnJykgKyAkLnRvTG93ZXJDYXNlKCkpO1xuZnVuY3Rpb24gZXhlY1dpdGhBcmdzT3JSZXR1cm4odmFsdWVPckZuLCBhcmdzKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWVPckZuID09PSAnZnVuY3Rpb24nID8gdmFsdWVPckZuKGFyZ3MpIDogdmFsdWVPckZuO1xufVxuZnVuY3Rpb24gdXNlRGVsYXlVbm1vdW50KG9wZW4sIGR1cmF0aW9uTXMpIHtcbiAgY29uc3QgW2lzTW91bnRlZCwgc2V0SXNNb3VudGVkXSA9IFJlYWN0LnVzZVN0YXRlKG9wZW4pO1xuICBpZiAob3BlbiAmJiAhaXNNb3VudGVkKSB7XG4gICAgc2V0SXNNb3VudGVkKHRydWUpO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuICYmIGlzTW91bnRlZCkge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gc2V0SXNNb3VudGVkKGZhbHNlKSwgZHVyYXRpb25Ncyk7XG4gICAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIH1cbiAgfSwgW29wZW4sIGlzTW91bnRlZCwgZHVyYXRpb25Nc10pO1xuICByZXR1cm4gaXNNb3VudGVkO1xufVxuLyoqXG4gKiBQcm92aWRlcyBhIHN0YXR1cyBzdHJpbmcgdG8gYXBwbHkgQ1NTIHRyYW5zaXRpb25zIHRvIGEgZmxvYXRpbmcgZWxlbWVudCxcbiAqIGNvcnJlY3RseSBoYW5kbGluZyBwbGFjZW1lbnQtYXdhcmUgdHJhbnNpdGlvbnMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlVHJhbnNpdGlvbiN1c2V0cmFuc2l0aW9uc3RhdHVzXG4gKi9cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb25TdGF0dXMoY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIGVsZW1lbnRzOiB7XG4gICAgICBmbG9hdGluZ1xuICAgIH1cbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBkdXJhdGlvbiA9IDI1MFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGlzTnVtYmVyRHVyYXRpb24gPSB0eXBlb2YgZHVyYXRpb24gPT09ICdudW1iZXInO1xuICBjb25zdCBjbG9zZUR1cmF0aW9uID0gKGlzTnVtYmVyRHVyYXRpb24gPyBkdXJhdGlvbiA6IGR1cmF0aW9uLmNsb3NlKSB8fCAwO1xuICBjb25zdCBbc3RhdHVzLCBzZXRTdGF0dXNdID0gUmVhY3QudXNlU3RhdGUoJ3VubW91bnRlZCcpO1xuICBjb25zdCBpc01vdW50ZWQgPSB1c2VEZWxheVVubW91bnQob3BlbiwgY2xvc2VEdXJhdGlvbik7XG4gIGlmICghaXNNb3VudGVkICYmIHN0YXR1cyA9PT0gJ2Nsb3NlJykge1xuICAgIHNldFN0YXR1cygndW5tb3VudGVkJyk7XG4gIH1cbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghZmxvYXRpbmcpIHJldHVybjtcbiAgICBpZiAob3Blbikge1xuICAgICAgc2V0U3RhdHVzKCdpbml0aWFsJyk7XG4gICAgICBjb25zdCBmcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHNldFN0YXR1cygnb3BlbicpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShmcmFtZSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBzZXRTdGF0dXMoJ2Nsb3NlJyk7XG4gIH0sIFtvcGVuLCBmbG9hdGluZ10pO1xuICByZXR1cm4ge1xuICAgIGlzTW91bnRlZCxcbiAgICBzdGF0dXNcbiAgfTtcbn1cbi8qKlxuICogUHJvdmlkZXMgc3R5bGVzIHRvIGFwcGx5IENTUyB0cmFuc2l0aW9ucyB0byBhIGZsb2F0aW5nIGVsZW1lbnQsIGNvcnJlY3RseVxuICogaGFuZGxpbmcgcGxhY2VtZW50LWF3YXJlIHRyYW5zaXRpb25zLiBXcmFwcGVyIGFyb3VuZCBgdXNlVHJhbnNpdGlvblN0YXR1c2AuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlVHJhbnNpdGlvbiN1c2V0cmFuc2l0aW9uc3R5bGVzXG4gKi9cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb25TdHlsZXMoY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBpbml0aWFsOiB1bnN0YWJsZV9pbml0aWFsID0ge1xuICAgICAgb3BhY2l0eTogMFxuICAgIH0sXG4gICAgb3BlbjogdW5zdGFibGVfb3BlbixcbiAgICBjbG9zZTogdW5zdGFibGVfY2xvc2UsXG4gICAgY29tbW9uOiB1bnN0YWJsZV9jb21tb24sXG4gICAgZHVyYXRpb24gPSAyNTBcbiAgfSA9IHByb3BzO1xuICBjb25zdCBwbGFjZW1lbnQgPSBjb250ZXh0LnBsYWNlbWVudDtcbiAgY29uc3Qgc2lkZSA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICBjb25zdCBmbkFyZ3MgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgc2lkZSxcbiAgICBwbGFjZW1lbnRcbiAgfSksIFtzaWRlLCBwbGFjZW1lbnRdKTtcbiAgY29uc3QgaXNOdW1iZXJEdXJhdGlvbiA9IHR5cGVvZiBkdXJhdGlvbiA9PT0gJ251bWJlcic7XG4gIGNvbnN0IG9wZW5EdXJhdGlvbiA9IChpc051bWJlckR1cmF0aW9uID8gZHVyYXRpb24gOiBkdXJhdGlvbi5vcGVuKSB8fCAwO1xuICBjb25zdCBjbG9zZUR1cmF0aW9uID0gKGlzTnVtYmVyRHVyYXRpb24gPyBkdXJhdGlvbiA6IGR1cmF0aW9uLmNsb3NlKSB8fCAwO1xuICBjb25zdCBbc3R5bGVzLCBzZXRTdHlsZXNdID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gKHtcbiAgICAuLi5leGVjV2l0aEFyZ3NPclJldHVybih1bnN0YWJsZV9jb21tb24sIGZuQXJncyksXG4gICAgLi4uZXhlY1dpdGhBcmdzT3JSZXR1cm4odW5zdGFibGVfaW5pdGlhbCwgZm5BcmdzKVxuICB9KSk7XG4gIGNvbnN0IHtcbiAgICBpc01vdW50ZWQsXG4gICAgc3RhdHVzXG4gIH0gPSB1c2VUcmFuc2l0aW9uU3RhdHVzKGNvbnRleHQsIHtcbiAgICBkdXJhdGlvblxuICB9KTtcbiAgY29uc3QgaW5pdGlhbFJlZiA9IHVzZUxhdGVzdFJlZih1bnN0YWJsZV9pbml0aWFsKTtcbiAgY29uc3Qgb3BlblJlZiA9IHVzZUxhdGVzdFJlZih1bnN0YWJsZV9vcGVuKTtcbiAgY29uc3QgY2xvc2VSZWYgPSB1c2VMYXRlc3RSZWYodW5zdGFibGVfY2xvc2UpO1xuICBjb25zdCBjb21tb25SZWYgPSB1c2VMYXRlc3RSZWYodW5zdGFibGVfY29tbW9uKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGNvbnN0IGluaXRpYWxTdHlsZXMgPSBleGVjV2l0aEFyZ3NPclJldHVybihpbml0aWFsUmVmLmN1cnJlbnQsIGZuQXJncyk7XG4gICAgY29uc3QgY2xvc2VTdHlsZXMgPSBleGVjV2l0aEFyZ3NPclJldHVybihjbG9zZVJlZi5jdXJyZW50LCBmbkFyZ3MpO1xuICAgIGNvbnN0IGNvbW1vblN0eWxlcyA9IGV4ZWNXaXRoQXJnc09yUmV0dXJuKGNvbW1vblJlZi5jdXJyZW50LCBmbkFyZ3MpO1xuICAgIGNvbnN0IG9wZW5TdHlsZXMgPSBleGVjV2l0aEFyZ3NPclJldHVybihvcGVuUmVmLmN1cnJlbnQsIGZuQXJncykgfHwgT2JqZWN0LmtleXMoaW5pdGlhbFN0eWxlcykucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSAnJztcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuICAgIGlmIChzdGF0dXMgPT09ICdpbml0aWFsJykge1xuICAgICAgc2V0U3R5bGVzKHN0eWxlcyA9PiAoe1xuICAgICAgICB0cmFuc2l0aW9uUHJvcGVydHk6IHN0eWxlcy50cmFuc2l0aW9uUHJvcGVydHksXG4gICAgICAgIC4uLmNvbW1vblN0eWxlcyxcbiAgICAgICAgLi4uaW5pdGlhbFN0eWxlc1xuICAgICAgfSkpO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSAnb3BlbicpIHtcbiAgICAgIHNldFN0eWxlcyh7XG4gICAgICAgIHRyYW5zaXRpb25Qcm9wZXJ0eTogT2JqZWN0LmtleXMob3BlblN0eWxlcykubWFwKGNhbWVsQ2FzZVRvS2ViYWJDYXNlKS5qb2luKCcsJyksXG4gICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogb3BlbkR1cmF0aW9uICsgXCJtc1wiLFxuICAgICAgICAuLi5jb21tb25TdHlsZXMsXG4gICAgICAgIC4uLm9wZW5TdHlsZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSAnY2xvc2UnKSB7XG4gICAgICBjb25zdCBzdHlsZXMgPSBjbG9zZVN0eWxlcyB8fCBpbml0aWFsU3R5bGVzO1xuICAgICAgc2V0U3R5bGVzKHtcbiAgICAgICAgdHJhbnNpdGlvblByb3BlcnR5OiBPYmplY3Qua2V5cyhzdHlsZXMpLm1hcChjYW1lbENhc2VUb0tlYmFiQ2FzZSkuam9pbignLCcpLFxuICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb246IGNsb3NlRHVyYXRpb24gKyBcIm1zXCIsXG4gICAgICAgIC4uLmNvbW1vblN0eWxlcyxcbiAgICAgICAgLi4uc3R5bGVzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtjbG9zZUR1cmF0aW9uLCBjbG9zZVJlZiwgaW5pdGlhbFJlZiwgb3BlblJlZiwgY29tbW9uUmVmLCBvcGVuRHVyYXRpb24sIHN0YXR1cywgZm5BcmdzXSk7XG4gIHJldHVybiB7XG4gICAgaXNNb3VudGVkLFxuICAgIHN0eWxlc1xuICB9O1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIGEgbWF0Y2hpbmcgY2FsbGJhY2sgdGhhdCBjYW4gYmUgdXNlZCB0byBmb2N1cyBhbiBpdGVtIGFzIHRoZSB1c2VyXG4gKiB0eXBlcywgb2Z0ZW4gdXNlZCBpbiB0YW5kZW0gd2l0aCBgdXNlTGlzdE5hdmlnYXRpb24oKWAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlVHlwZWFoZWFkXG4gKi9cbmZ1bmN0aW9uIHVzZVR5cGVhaGVhZChjb250ZXh0LCBwcm9wcykge1xuICB2YXIgX3JlZjtcbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgZGF0YVJlZlxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGxpc3RSZWYsXG4gICAgYWN0aXZlSW5kZXgsXG4gICAgb25NYXRjaDogdW5zdGFibGVfb25NYXRjaCxcbiAgICBvblR5cGluZ0NoYW5nZTogdW5zdGFibGVfb25UeXBpbmdDaGFuZ2UsXG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgZmluZE1hdGNoID0gbnVsbCxcbiAgICByZXNldE1zID0gNzUwLFxuICAgIGlnbm9yZUtleXMgPSBbXSxcbiAgICBzZWxlY3RlZEluZGV4ID0gbnVsbFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHRpbWVvdXRJZFJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBjb25zdCBzdHJpbmdSZWYgPSBSZWFjdC51c2VSZWYoJycpO1xuICBjb25zdCBwcmV2SW5kZXhSZWYgPSBSZWFjdC51c2VSZWYoKF9yZWYgPSBzZWxlY3RlZEluZGV4ICE9IG51bGwgPyBzZWxlY3RlZEluZGV4IDogYWN0aXZlSW5kZXgpICE9IG51bGwgPyBfcmVmIDogLTEpO1xuICBjb25zdCBtYXRjaEluZGV4UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBvbk1hdGNoID0gdXNlRWZmZWN0RXZlbnQodW5zdGFibGVfb25NYXRjaCk7XG4gIGNvbnN0IG9uVHlwaW5nQ2hhbmdlID0gdXNlRWZmZWN0RXZlbnQodW5zdGFibGVfb25UeXBpbmdDaGFuZ2UpO1xuICBjb25zdCBmaW5kTWF0Y2hSZWYgPSB1c2VMYXRlc3RSZWYoZmluZE1hdGNoKTtcbiAgY29uc3QgaWdub3JlS2V5c1JlZiA9IHVzZUxhdGVzdFJlZihpZ25vcmVLZXlzKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChvcGVuKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkUmVmLmN1cnJlbnQpO1xuICAgICAgbWF0Y2hJbmRleFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIHN0cmluZ1JlZi5jdXJyZW50ID0gJyc7XG4gICAgfVxuICB9LCBbb3Blbl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgLy8gU3luYyBhcnJvdyBrZXkgbmF2aWdhdGlvbiBidXQgbm90IHR5cGVhaGVhZCBuYXZpZ2F0aW9uLlxuICAgIGlmIChvcGVuICYmIHN0cmluZ1JlZi5jdXJyZW50ID09PSAnJykge1xuICAgICAgdmFyIF9yZWYyO1xuICAgICAgcHJldkluZGV4UmVmLmN1cnJlbnQgPSAoX3JlZjIgPSBzZWxlY3RlZEluZGV4ICE9IG51bGwgPyBzZWxlY3RlZEluZGV4IDogYWN0aXZlSW5kZXgpICE9IG51bGwgPyBfcmVmMiA6IC0xO1xuICAgIH1cbiAgfSwgW29wZW4sIHNlbGVjdGVkSW5kZXgsIGFjdGl2ZUluZGV4XSk7XG4gIGNvbnN0IHNldFR5cGluZ0NoYW5nZSA9IHVzZUVmZmVjdEV2ZW50KHZhbHVlID0+IHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmICghZGF0YVJlZi5jdXJyZW50LnR5cGluZykge1xuICAgICAgICBkYXRhUmVmLmN1cnJlbnQudHlwaW5nID0gdmFsdWU7XG4gICAgICAgIG9uVHlwaW5nQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGFSZWYuY3VycmVudC50eXBpbmcpIHtcbiAgICAgICAgZGF0YVJlZi5jdXJyZW50LnR5cGluZyA9IHZhbHVlO1xuICAgICAgICBvblR5cGluZ0NoYW5nZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3Qgb25LZXlEb3duID0gdXNlRWZmZWN0RXZlbnQoZXZlbnQgPT4ge1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoaW5nSW5kZXgobGlzdCwgb3JkZXJlZExpc3QsIHN0cmluZykge1xuICAgICAgY29uc3Qgc3RyID0gZmluZE1hdGNoUmVmLmN1cnJlbnQgPyBmaW5kTWF0Y2hSZWYuY3VycmVudChvcmRlcmVkTGlzdCwgc3RyaW5nKSA6IG9yZGVyZWRMaXN0LmZpbmQodGV4dCA9PiAodGV4dCA9PSBudWxsID8gdm9pZCAwIDogdGV4dC50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2Yoc3RyaW5nLnRvTG9jYWxlTG93ZXJDYXNlKCkpKSA9PT0gMCk7XG4gICAgICByZXR1cm4gc3RyID8gbGlzdC5pbmRleE9mKHN0cikgOiAtMTtcbiAgICB9XG4gICAgY29uc3QgbGlzdENvbnRlbnQgPSBsaXN0UmVmLmN1cnJlbnQ7XG4gICAgaWYgKHN0cmluZ1JlZi5jdXJyZW50Lmxlbmd0aCA+IDAgJiYgc3RyaW5nUmVmLmN1cnJlbnRbMF0gIT09ICcgJykge1xuICAgICAgaWYgKGdldE1hdGNoaW5nSW5kZXgobGlzdENvbnRlbnQsIGxpc3RDb250ZW50LCBzdHJpbmdSZWYuY3VycmVudCkgPT09IC0xKSB7XG4gICAgICAgIHNldFR5cGluZ0NoYW5nZShmYWxzZSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsaXN0Q29udGVudCA9PSBudWxsIHx8IGlnbm9yZUtleXNSZWYuY3VycmVudC5pbmNsdWRlcyhldmVudC5rZXkpIHx8XG4gICAgLy8gQ2hhcmFjdGVyIGtleS5cbiAgICBldmVudC5rZXkubGVuZ3RoICE9PSAxIHx8XG4gICAgLy8gTW9kaWZpZXIga2V5LlxuICAgIGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wZW4gJiYgZXZlbnQua2V5ICE9PSAnICcpIHtcbiAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICBzZXRUeXBpbmdDaGFuZ2UodHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gQmFpbCBvdXQgaWYgdGhlIGxpc3QgY29udGFpbnMgYSB3b3JkIGxpa2UgXCJsbGFtYVwiIG9yIFwiYWFyb25cIi4gVE9ETzpcbiAgICAvLyBhbGxvdyBpdCBpbiB0aGlzIGNhc2UsIHRvby5cbiAgICBjb25zdCBhbGxvd1JhcGlkU3VjY2Vzc2lvbk9mRmlyc3RMZXR0ZXIgPSBsaXN0Q29udGVudC5ldmVyeSh0ZXh0ID0+IHtcbiAgICAgIHZhciBfdGV4dCQsIF90ZXh0JDI7XG4gICAgICByZXR1cm4gdGV4dCA/ICgoX3RleHQkID0gdGV4dFswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF90ZXh0JC50b0xvY2FsZUxvd2VyQ2FzZSgpKSAhPT0gKChfdGV4dCQyID0gdGV4dFsxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF90ZXh0JDIudG9Mb2NhbGVMb3dlckNhc2UoKSkgOiB0cnVlO1xuICAgIH0pO1xuXG4gICAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIGN5Y2xlIHRocm91Z2ggaXRlbXMgdGhhdCBzdGFydCB3aXRoIHRoZSBzYW1lIGxldHRlclxuICAgIC8vIGluIHJhcGlkIHN1Y2Nlc3Npb24uXG4gICAgaWYgKGFsbG93UmFwaWRTdWNjZXNzaW9uT2ZGaXJzdExldHRlciAmJiBzdHJpbmdSZWYuY3VycmVudCA9PT0gZXZlbnQua2V5KSB7XG4gICAgICBzdHJpbmdSZWYuY3VycmVudCA9ICcnO1xuICAgICAgcHJldkluZGV4UmVmLmN1cnJlbnQgPSBtYXRjaEluZGV4UmVmLmN1cnJlbnQ7XG4gICAgfVxuICAgIHN0cmluZ1JlZi5jdXJyZW50ICs9IGV2ZW50LmtleTtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dElkUmVmLmN1cnJlbnQpO1xuICAgIHRpbWVvdXRJZFJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdHJpbmdSZWYuY3VycmVudCA9ICcnO1xuICAgICAgcHJldkluZGV4UmVmLmN1cnJlbnQgPSBtYXRjaEluZGV4UmVmLmN1cnJlbnQ7XG4gICAgICBzZXRUeXBpbmdDaGFuZ2UoZmFsc2UpO1xuICAgIH0sIHJlc2V0TXMpO1xuICAgIGNvbnN0IHByZXZJbmRleCA9IHByZXZJbmRleFJlZi5jdXJyZW50O1xuICAgIGNvbnN0IGluZGV4ID0gZ2V0TWF0Y2hpbmdJbmRleChsaXN0Q29udGVudCwgWy4uLmxpc3RDb250ZW50LnNsaWNlKChwcmV2SW5kZXggfHwgMCkgKyAxKSwgLi4ubGlzdENvbnRlbnQuc2xpY2UoMCwgKHByZXZJbmRleCB8fCAwKSArIDEpXSwgc3RyaW5nUmVmLmN1cnJlbnQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIG9uTWF0Y2goaW5kZXgpO1xuICAgICAgbWF0Y2hJbmRleFJlZi5jdXJyZW50ID0gaW5kZXg7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgIT09ICcgJykge1xuICAgICAgc3RyaW5nUmVmLmN1cnJlbnQgPSAnJztcbiAgICAgIHNldFR5cGluZ0NoYW5nZShmYWxzZSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcmVmZXJlbmNlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIG9uS2V5RG93blxuICB9KSwgW29uS2V5RG93bl0pO1xuICBjb25zdCBmbG9hdGluZyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBvbktleURvd24sXG4gICAgICBvbktleVVwKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgICAgIHNldFR5cGluZ0NoYW5nZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LCBbb25LZXlEb3duLCBzZXRUeXBpbmdDaGFuZ2VdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmdcbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlLCBmbG9hdGluZ10pO1xufVxuXG5mdW5jdGlvbiBnZXRBcmdzV2l0aEN1c3RvbUZsb2F0aW5nSGVpZ2h0KHN0YXRlLCBoZWlnaHQpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICByZWN0czoge1xuICAgICAgLi4uc3RhdGUucmVjdHMsXG4gICAgICBmbG9hdGluZzoge1xuICAgICAgICAuLi5zdGF0ZS5yZWN0cy5mbG9hdGluZyxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuLyoqXG4gKiBQb3NpdGlvbnMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgc3VjaCB0aGF0IGFuIGlubmVyIGVsZW1lbnQgaW5zaWRlIG9mIGl0IGlzXG4gKiBhbmNob3JlZCB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaW5uZXJcbiAqL1xuY29uc3QgaW5uZXIgPSBwcm9wcyA9PiAoe1xuICBuYW1lOiAnaW5uZXInLFxuICBvcHRpb25zOiBwcm9wcyxcbiAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBsaXN0UmVmLFxuICAgICAgb3ZlcmZsb3dSZWYsXG4gICAgICBvbkZhbGxiYWNrQ2hhbmdlLFxuICAgICAgb2Zmc2V0OiBpbm5lck9mZnNldCA9IDAsXG4gICAgICBpbmRleCA9IDAsXG4gICAgICBtaW5JdGVtc1Zpc2libGUgPSA0LFxuICAgICAgcmVmZXJlbmNlT3ZlcmZsb3dUaHJlc2hvbGQgPSAwLFxuICAgICAgc2Nyb2xsUmVmLFxuICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgfSA9IGV2YWx1YXRlKHByb3BzLCBzdGF0ZSk7XG4gICAgY29uc3Qge1xuICAgICAgcmVjdHMsXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICBmbG9hdGluZ1xuICAgICAgfVxuICAgIH0gPSBzdGF0ZTtcbiAgICBjb25zdCBpdGVtID0gbGlzdFJlZi5jdXJyZW50W2luZGV4XTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBpZiAoIXN0YXRlLnBsYWNlbWVudC5zdGFydHNXaXRoKCdib3R0b20nKSkge1xuICAgICAgICB3YXJuKCdgcGxhY2VtZW50YCBzaWRlIG11c3QgYmUgXCJib3R0b21cIiB3aGVuIHVzaW5nIHRoZSBgaW5uZXJgJywgJ21pZGRsZXdhcmUuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBuZXh0QXJncyA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgLi4uKGF3YWl0IG9mZnNldCgtaXRlbS5vZmZzZXRUb3AgLSBmbG9hdGluZy5jbGllbnRUb3AgLSByZWN0cy5yZWZlcmVuY2UuaGVpZ2h0IC8gMiAtIGl0ZW0ub2Zmc2V0SGVpZ2h0IC8gMiAtIGlubmVyT2Zmc2V0KS5mbihzdGF0ZSkpXG4gICAgfTtcbiAgICBjb25zdCBlbCA9IChzY3JvbGxSZWYgPT0gbnVsbCA/IHZvaWQgMCA6IHNjcm9sbFJlZi5jdXJyZW50KSB8fCBmbG9hdGluZztcbiAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KGdldEFyZ3NXaXRoQ3VzdG9tRmxvYXRpbmdIZWlnaHQobmV4dEFyZ3MsIGVsLnNjcm9sbEhlaWdodCksIGRldGVjdE92ZXJmbG93T3B0aW9ucyk7XG4gICAgY29uc3QgcmVmT3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhuZXh0QXJncywge1xuICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zLFxuICAgICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnXG4gICAgfSk7XG4gICAgY29uc3QgZGlmZlkgPSBNYXRoLm1heCgwLCBvdmVyZmxvdy50b3ApO1xuICAgIGNvbnN0IG5leHRZID0gbmV4dEFyZ3MueSArIGRpZmZZO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IE1hdGgubWF4KDAsIGVsLnNjcm9sbEhlaWdodCAtIGRpZmZZIC0gTWF0aC5tYXgoMCwgb3ZlcmZsb3cuYm90dG9tKSk7XG4gICAgZWwuc3R5bGUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0ICsgXCJweFwiO1xuICAgIGVsLnNjcm9sbFRvcCA9IGRpZmZZO1xuXG4gICAgLy8gVGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSwgZmFsbGJhY2sgdG8gc3RhbmRhcmQgYW5jaG9yZWQgcG9zaXRpb25pbmdcbiAgICBpZiAob25GYWxsYmFja0NoYW5nZSkge1xuICAgICAgaWYgKGVsLm9mZnNldEhlaWdodCA8IGl0ZW0ub2Zmc2V0SGVpZ2h0ICogTWF0aC5taW4obWluSXRlbXNWaXNpYmxlLCBsaXN0UmVmLmN1cnJlbnQubGVuZ3RoIC0gMSkgLSAxIHx8IHJlZk92ZXJmbG93LnRvcCA+PSAtcmVmZXJlbmNlT3ZlcmZsb3dUaHJlc2hvbGQgfHwgcmVmT3ZlcmZsb3cuYm90dG9tID49IC1yZWZlcmVuY2VPdmVyZmxvd1RocmVzaG9sZCkge1xuICAgICAgICBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4gb25GYWxsYmFja0NoYW5nZSh0cnVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4gb25GYWxsYmFja0NoYW5nZShmYWxzZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcmZsb3dSZWYpIHtcbiAgICAgIG92ZXJmbG93UmVmLmN1cnJlbnQgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhnZXRBcmdzV2l0aEN1c3RvbUZsb2F0aW5nSGVpZ2h0KHtcbiAgICAgICAgLi4ubmV4dEFyZ3MsXG4gICAgICAgIHk6IG5leHRZXG4gICAgICB9LCBlbC5vZmZzZXRIZWlnaHQpLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgeTogbmV4dFlcbiAgICB9O1xuICB9XG59KTtcbi8qKlxuICogQ2hhbmdlcyB0aGUgYGlubmVyYCBtaWRkbGV3YXJlJ3MgYG9mZnNldGAgdXBvbiBhIGB3aGVlbGAgZXZlbnQgdG9cbiAqIGV4cGFuZCB0aGUgZmxvYXRpbmcgZWxlbWVudCdzIGhlaWdodCwgcmV2ZWFsaW5nIG1vcmUgbGlzdCBpdGVtcy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9pbm5lclxuICovXG5mdW5jdGlvbiB1c2VJbm5lck9mZnNldChjb250ZXh0LCBwcm9wcykge1xuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBlbGVtZW50c1xuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIG92ZXJmbG93UmVmLFxuICAgIHNjcm9sbFJlZixcbiAgICBvbkNoYW5nZTogdW5zdGFibGVfb25DaGFuZ2VcbiAgfSA9IHByb3BzO1xuICBjb25zdCBvbkNoYW5nZSA9IHVzZUVmZmVjdEV2ZW50KHVuc3RhYmxlX29uQ2hhbmdlKTtcbiAgY29uc3QgY29udHJvbGxlZFNjcm9sbGluZ1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHByZXZTY3JvbGxUb3BSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGluaXRpYWxPdmVyZmxvd1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBmdW5jdGlvbiBvbldoZWVsKGUpIHtcbiAgICAgIGlmIChlLmN0cmxLZXkgfHwgIWVsIHx8IG92ZXJmbG93UmVmLmN1cnJlbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkWSA9IGUuZGVsdGFZO1xuICAgICAgY29uc3QgaXNBdFRvcCA9IG92ZXJmbG93UmVmLmN1cnJlbnQudG9wID49IC0wLjU7XG4gICAgICBjb25zdCBpc0F0Qm90dG9tID0gb3ZlcmZsb3dSZWYuY3VycmVudC5ib3R0b20gPj0gLTAuNTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ1Njcm9sbCA9IGVsLnNjcm9sbEhlaWdodCAtIGVsLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHNpZ24gPSBkWSA8IDAgPyAtMSA6IDE7XG4gICAgICBjb25zdCBtZXRob2QgPSBkWSA8IDAgPyAnbWF4JyA6ICdtaW4nO1xuICAgICAgaWYgKGVsLnNjcm9sbEhlaWdodCA8PSBlbC5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0F0VG9wICYmIGRZID4gMCB8fCAhaXNBdEJvdHRvbSAmJiBkWSA8IDApIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgICAgIG9uQ2hhbmdlKGQgPT4gZCArIE1hdGhbbWV0aG9kXShkWSwgcmVtYWluaW5nU2Nyb2xsICogc2lnbikpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoL2ZpcmVmb3gvaS50ZXN0KGdldFVzZXJBZ2VudCgpKSkge1xuICAgICAgICAvLyBOZWVkZWQgdG8gcHJvcGFnYXRlIHNjcm9sbGluZyBkdXJpbmcgbW9tZW50dW0gc2Nyb2xsaW5nIHBoYXNlIG9uY2VcbiAgICAgICAgLy8gaXQgZ2V0cyBsaW1pdGVkIGJ5IHRoZSBib3VuZGFyeS4gVVggaW1wcm92ZW1lbnQsIG5vdCBjcml0aWNhbC5cbiAgICAgICAgZWwuc2Nyb2xsVG9wICs9IGRZO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlbCA9IChzY3JvbGxSZWYgPT0gbnVsbCA/IHZvaWQgMCA6IHNjcm9sbFJlZi5jdXJyZW50KSB8fCBlbGVtZW50cy5mbG9hdGluZztcbiAgICBpZiAob3BlbiAmJiBlbCkge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbldoZWVsKTtcblxuICAgICAgLy8gV2FpdCBmb3IgdGhlIHBvc2l0aW9uIHRvIGJlIHJlYWR5LlxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgcHJldlNjcm9sbFRvcFJlZi5jdXJyZW50ID0gZWwuc2Nyb2xsVG9wO1xuICAgICAgICBpZiAob3ZlcmZsb3dSZWYuY3VycmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgaW5pdGlhbE92ZXJmbG93UmVmLmN1cnJlbnQgPSB7XG4gICAgICAgICAgICAuLi5vdmVyZmxvd1JlZi5jdXJyZW50XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBwcmV2U2Nyb2xsVG9wUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBpbml0aWFsT3ZlcmZsb3dSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2VuYWJsZWQsIG9wZW4sIGVsZW1lbnRzLmZsb2F0aW5nLCBvdmVyZmxvd1JlZiwgc2Nyb2xsUmVmLCBvbkNoYW5nZV0pO1xuICBjb25zdCBmbG9hdGluZyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBvbktleURvd24oKSB7XG4gICAgICBjb250cm9sbGVkU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH0sXG4gICAgb25XaGVlbCgpIHtcbiAgICAgIGNvbnRyb2xsZWRTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0sXG4gICAgb25Qb2ludGVyTW92ZSgpIHtcbiAgICAgIGNvbnRyb2xsZWRTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0sXG4gICAgb25TY3JvbGwoKSB7XG4gICAgICBjb25zdCBlbCA9IChzY3JvbGxSZWYgPT0gbnVsbCA/IHZvaWQgMCA6IHNjcm9sbFJlZi5jdXJyZW50KSB8fCBlbGVtZW50cy5mbG9hdGluZztcbiAgICAgIGlmICghb3ZlcmZsb3dSZWYuY3VycmVudCB8fCAhZWwgfHwgIWNvbnRyb2xsZWRTY3JvbGxpbmdSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocHJldlNjcm9sbFRvcFJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHNjcm9sbERpZmYgPSBlbC5zY3JvbGxUb3AgLSBwcmV2U2Nyb2xsVG9wUmVmLmN1cnJlbnQ7XG4gICAgICAgIGlmIChvdmVyZmxvd1JlZi5jdXJyZW50LmJvdHRvbSA8IC0wLjUgJiYgc2Nyb2xsRGlmZiA8IC0xIHx8IG92ZXJmbG93UmVmLmN1cnJlbnQudG9wIDwgLTAuNSAmJiBzY3JvbGxEaWZmID4gMSkge1xuICAgICAgICAgIFJlYWN0RE9NLmZsdXNoU3luYygoKSA9PiBvbkNoYW5nZShkID0+IGQgKyBzY3JvbGxEaWZmKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gW0ZpcmVmb3hdIFdhaXQgZm9yIHRoZSBoZWlnaHQgY2hhbmdlIHRvIGhhdmUgYmVlbiBhcHBsaWVkLlxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgcHJldlNjcm9sbFRvcFJlZi5jdXJyZW50ID0gZWwuc2Nyb2xsVG9wO1xuICAgICAgfSk7XG4gICAgfVxuICB9KSwgW2VsZW1lbnRzLmZsb2F0aW5nLCBvbkNoYW5nZSwgb3ZlcmZsb3dSZWYsIHNjcm9sbFJlZl0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIGZsb2F0aW5nXG4gIH0gOiB7fSwgW2VuYWJsZWQsIGZsb2F0aW5nXSk7XG59XG5cbmZ1bmN0aW9uIGlzUG9pbnRJblBvbHlnb24ocG9pbnQsIHBvbHlnb24pIHtcbiAgY29uc3QgW3gsIHldID0gcG9pbnQ7XG4gIGxldCBpc0luc2lkZSA9IGZhbHNlO1xuICBjb25zdCBsZW5ndGggPSBwb2x5Z29uLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDAsIGogPSBsZW5ndGggLSAxOyBpIDwgbGVuZ3RoOyBqID0gaSsrKSB7XG4gICAgY29uc3QgW3hpLCB5aV0gPSBwb2x5Z29uW2ldIHx8IFswLCAwXTtcbiAgICBjb25zdCBbeGosIHlqXSA9IHBvbHlnb25bal0gfHwgWzAsIDBdO1xuICAgIGNvbnN0IGludGVyc2VjdCA9IHlpID49IHkgIT09IHlqID49IHkgJiYgeCA8PSAoeGogLSB4aSkgKiAoeSAtIHlpKSAvICh5aiAtIHlpKSArIHhpO1xuICAgIGlmIChpbnRlcnNlY3QpIHtcbiAgICAgIGlzSW5zaWRlID0gIWlzSW5zaWRlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaXNJbnNpZGU7XG59XG5mdW5jdGlvbiBpc0luc2lkZShwb2ludCwgcmVjdCkge1xuICByZXR1cm4gcG9pbnRbMF0gPj0gcmVjdC54ICYmIHBvaW50WzBdIDw9IHJlY3QueCArIHJlY3Qud2lkdGggJiYgcG9pbnRbMV0gPj0gcmVjdC55ICYmIHBvaW50WzFdIDw9IHJlY3QueSArIHJlY3QuaGVpZ2h0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBzYWZlIHBvbHlnb24gYXJlYSB0aGF0IHRoZSB1c2VyIGNhbiB0cmF2ZXJzZSB3aXRob3V0IGNsb3NpbmcgdGhlXG4gKiBmbG9hdGluZyBlbGVtZW50IG9uY2UgbGVhdmluZyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlSG92ZXIjc2FmZXBvbHlnb25cbiAqL1xuZnVuY3Rpb24gc2FmZVBvbHlnb24ob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBidWZmZXIgPSAwLjUsXG4gICAgYmxvY2tQb2ludGVyRXZlbnRzID0gZmFsc2UsXG4gICAgcmVxdWlyZUludGVudCA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGxldCB0aW1lb3V0SWQ7XG4gIGxldCBoYXNMYW5kZWQgPSBmYWxzZTtcbiAgbGV0IGxhc3RYID0gbnVsbDtcbiAgbGV0IGxhc3RZID0gbnVsbDtcbiAgbGV0IGxhc3RDdXJzb3JUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGZ1bmN0aW9uIGdldEN1cnNvclNwZWVkKHgsIHkpIHtcbiAgICBjb25zdCBjdXJyZW50VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gY3VycmVudFRpbWUgLSBsYXN0Q3Vyc29yVGltZTtcbiAgICBpZiAobGFzdFggPT09IG51bGwgfHwgbGFzdFkgPT09IG51bGwgfHwgZWxhcHNlZFRpbWUgPT09IDApIHtcbiAgICAgIGxhc3RYID0geDtcbiAgICAgIGxhc3RZID0geTtcbiAgICAgIGxhc3RDdXJzb3JUaW1lID0gY3VycmVudFRpbWU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZGVsdGFYID0geCAtIGxhc3RYO1xuICAgIGNvbnN0IGRlbHRhWSA9IHkgLSBsYXN0WTtcbiAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpO1xuICAgIGNvbnN0IHNwZWVkID0gZGlzdGFuY2UgLyBlbGFwc2VkVGltZTsgLy8gcHggLyBtc1xuXG4gICAgbGFzdFggPSB4O1xuICAgIGxhc3RZID0geTtcbiAgICBsYXN0Q3Vyc29yVGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIHJldHVybiBzcGVlZDtcbiAgfVxuICBjb25zdCBmbiA9IF9yZWYgPT4ge1xuICAgIGxldCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgb25DbG9zZSxcbiAgICAgIG5vZGVJZCxcbiAgICAgIHRyZWVcbiAgICB9ID0gX3JlZjtcbiAgICByZXR1cm4gZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICAgIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgb25DbG9zZSgpO1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICBpZiAoIWVsZW1lbnRzLmRvbVJlZmVyZW5jZSB8fCAhZWxlbWVudHMuZmxvYXRpbmcgfHwgcGxhY2VtZW50ID09IG51bGwgfHwgeCA9PSBudWxsIHx8IHkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNsaWVudFgsXG4gICAgICAgIGNsaWVudFlcbiAgICAgIH0gPSBldmVudDtcbiAgICAgIGNvbnN0IGNsaWVudFBvaW50ID0gW2NsaWVudFgsIGNsaWVudFldO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2ZW50KTtcbiAgICAgIGNvbnN0IGlzTGVhdmUgPSBldmVudC50eXBlID09PSAnbW91c2VsZWF2ZSc7XG4gICAgICBjb25zdCBpc092ZXJGbG9hdGluZ0VsID0gY29udGFpbnMoZWxlbWVudHMuZmxvYXRpbmcsIHRhcmdldCk7XG4gICAgICBjb25zdCBpc092ZXJSZWZlcmVuY2VFbCA9IGNvbnRhaW5zKGVsZW1lbnRzLmRvbVJlZmVyZW5jZSwgdGFyZ2V0KTtcbiAgICAgIGNvbnN0IHJlZlJlY3QgPSBlbGVtZW50cy5kb21SZWZlcmVuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCByZWN0ID0gZWxlbWVudHMuZmxvYXRpbmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBzaWRlID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gICAgICBjb25zdCBjdXJzb3JMZWF2ZUZyb21SaWdodCA9IHggPiByZWN0LnJpZ2h0IC0gcmVjdC53aWR0aCAvIDI7XG4gICAgICBjb25zdCBjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPSB5ID4gcmVjdC5ib3R0b20gLSByZWN0LmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBpc092ZXJSZWZlcmVuY2VSZWN0ID0gaXNJbnNpZGUoY2xpZW50UG9pbnQsIHJlZlJlY3QpO1xuICAgICAgY29uc3QgaXNGbG9hdGluZ1dpZGVyID0gcmVjdC53aWR0aCA+IHJlZlJlY3Qud2lkdGg7XG4gICAgICBjb25zdCBpc0Zsb2F0aW5nVGFsbGVyID0gcmVjdC5oZWlnaHQgPiByZWZSZWN0LmhlaWdodDtcbiAgICAgIGNvbnN0IGxlZnQgPSAoaXNGbG9hdGluZ1dpZGVyID8gcmVmUmVjdCA6IHJlY3QpLmxlZnQ7XG4gICAgICBjb25zdCByaWdodCA9IChpc0Zsb2F0aW5nV2lkZXIgPyByZWZSZWN0IDogcmVjdCkucmlnaHQ7XG4gICAgICBjb25zdCB0b3AgPSAoaXNGbG9hdGluZ1RhbGxlciA/IHJlZlJlY3QgOiByZWN0KS50b3A7XG4gICAgICBjb25zdCBib3R0b20gPSAoaXNGbG9hdGluZ1RhbGxlciA/IHJlZlJlY3QgOiByZWN0KS5ib3R0b207XG4gICAgICBpZiAoaXNPdmVyRmxvYXRpbmdFbCkge1xuICAgICAgICBoYXNMYW5kZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIWlzTGVhdmUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc092ZXJSZWZlcmVuY2VFbCkge1xuICAgICAgICBoYXNMYW5kZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc092ZXJSZWZlcmVuY2VFbCAmJiAhaXNMZWF2ZSkge1xuICAgICAgICBoYXNMYW5kZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXZlbnQgb3ZlcmxhcHBpbmcgZmxvYXRpbmcgZWxlbWVudCBmcm9tIGJlaW5nIHN0dWNrIGluIGFuIG9wZW4tY2xvc2VcbiAgICAgIC8vIGxvb3A6IGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMTkxMFxuICAgICAgaWYgKGlzTGVhdmUgJiYgaXNFbGVtZW50KGV2ZW50LnJlbGF0ZWRUYXJnZXQpICYmIGNvbnRhaW5zKGVsZW1lbnRzLmZsb2F0aW5nLCBldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGFueSBuZXN0ZWQgY2hpbGQgaXMgb3BlbiwgYWJvcnQuXG4gICAgICBpZiAodHJlZSAmJiBnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkuc29tZShfcmVmMiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgY29udGV4dFxuICAgICAgICB9ID0gX3JlZjI7XG4gICAgICAgIHJldHVybiBjb250ZXh0ID09IG51bGwgPyB2b2lkIDAgOiBjb250ZXh0Lm9wZW47XG4gICAgICB9KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBwb2ludGVyIGlzIGxlYXZpbmcgZnJvbSB0aGUgb3Bwb3NpdGUgc2lkZSwgdGhlIFwiYnVmZmVyXCIgbG9naWNcbiAgICAgIC8vIGNyZWF0ZXMgYSBwb2ludCB3aGVyZSB0aGUgZmxvYXRpbmcgZWxlbWVudCByZW1haW5zIG9wZW4sIGJ1dCBzaG91bGQgYmVcbiAgICAgIC8vIGlnbm9yZWQuXG4gICAgICAvLyBBIGNvbnN0YW50IG9mIDEgaGFuZGxlcyBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnMuXG4gICAgICBpZiAoc2lkZSA9PT0gJ3RvcCcgJiYgeSA+PSByZWZSZWN0LmJvdHRvbSAtIDEgfHwgc2lkZSA9PT0gJ2JvdHRvbScgJiYgeSA8PSByZWZSZWN0LnRvcCArIDEgfHwgc2lkZSA9PT0gJ2xlZnQnICYmIHggPj0gcmVmUmVjdC5yaWdodCAtIDEgfHwgc2lkZSA9PT0gJ3JpZ2h0JyAmJiB4IDw9IHJlZlJlY3QubGVmdCArIDEpIHtcbiAgICAgICAgcmV0dXJuIGNsb3NlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElnbm9yZSB3aGVuIHRoZSBjdXJzb3IgaXMgd2l0aGluIHRoZSByZWN0YW5ndWxhciB0cm91Z2ggYmV0d2VlbiB0aGVcbiAgICAgIC8vIHR3byBlbGVtZW50cy4gU2luY2UgdGhlIHRyaWFuZ2xlIGlzIGNyZWF0ZWQgZnJvbSB0aGUgY3Vyc29yIHBvaW50LFxuICAgICAgLy8gd2hpY2ggY2FuIHN0YXJ0IGJleW9uZCB0aGUgcmVmIGVsZW1lbnQncyBlZGdlLCB0cmF2ZXJzaW5nIGJhY2sgYW5kXG4gICAgICAvLyBmb3J0aCBmcm9tIHRoZSByZWYgdG8gdGhlIGZsb2F0aW5nIGVsZW1lbnQgY2FuIGNhdXNlIGl0IHRvIGNsb3NlLiBUaGlzXG4gICAgICAvLyBlbnN1cmVzIGl0IGFsd2F5cyByZW1haW5zIG9wZW4gaW4gdGhhdCBjYXNlLlxuICAgICAgbGV0IHJlY3RQb2x5ID0gW107XG4gICAgICBzd2l0Y2ggKHNpZGUpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICByZWN0UG9seSA9IFtbbGVmdCwgcmVmUmVjdC50b3AgKyAxXSwgW2xlZnQsIHJlY3QuYm90dG9tIC0gMV0sIFtyaWdodCwgcmVjdC5ib3R0b20gLSAxXSwgW3JpZ2h0LCByZWZSZWN0LnRvcCArIDFdXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICByZWN0UG9seSA9IFtbbGVmdCwgcmVjdC50b3AgKyAxXSwgW2xlZnQsIHJlZlJlY3QuYm90dG9tIC0gMV0sIFtyaWdodCwgcmVmUmVjdC5ib3R0b20gLSAxXSwgW3JpZ2h0LCByZWN0LnRvcCArIDFdXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgcmVjdFBvbHkgPSBbW3JlY3QucmlnaHQgLSAxLCBib3R0b21dLCBbcmVjdC5yaWdodCAtIDEsIHRvcF0sIFtyZWZSZWN0LmxlZnQgKyAxLCB0b3BdLCBbcmVmUmVjdC5sZWZ0ICsgMSwgYm90dG9tXV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICByZWN0UG9seSA9IFtbcmVmUmVjdC5yaWdodCAtIDEsIGJvdHRvbV0sIFtyZWZSZWN0LnJpZ2h0IC0gMSwgdG9wXSwgW3JlY3QubGVmdCArIDEsIHRvcF0sIFtyZWN0LmxlZnQgKyAxLCBib3R0b21dXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGdldFBvbHlnb24oX3JlZjMpIHtcbiAgICAgICAgbGV0IFt4LCB5XSA9IF9yZWYzO1xuICAgICAgICBzd2l0Y2ggKHNpZGUpIHtcbiAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludE9uZSA9IFtpc0Zsb2F0aW5nV2lkZXIgPyB4ICsgYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8geCArIGJ1ZmZlciAqIDQgOiB4IC0gYnVmZmVyICogNCwgeSArIGJ1ZmZlciArIDFdO1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludFR3byA9IFtpc0Zsb2F0aW5nV2lkZXIgPyB4IC0gYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8geCArIGJ1ZmZlciAqIDQgOiB4IC0gYnVmZmVyICogNCwgeSArIGJ1ZmZlciArIDFdO1xuICAgICAgICAgICAgICBjb25zdCBjb21tb25Qb2ludHMgPSBbW3JlY3QubGVmdCwgY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyByZWN0LmJvdHRvbSAtIGJ1ZmZlciA6IGlzRmxvYXRpbmdXaWRlciA/IHJlY3QuYm90dG9tIC0gYnVmZmVyIDogcmVjdC50b3BdLCBbcmVjdC5yaWdodCwgY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyBpc0Zsb2F0aW5nV2lkZXIgPyByZWN0LmJvdHRvbSAtIGJ1ZmZlciA6IHJlY3QudG9wIDogcmVjdC5ib3R0b20gLSBidWZmZXJdXTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtjdXJzb3JQb2ludE9uZSwgY3Vyc29yUG9pbnRUd28sIC4uLmNvbW1vblBvaW50c107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRPbmUgPSBbaXNGbG9hdGluZ1dpZGVyID8geCArIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IHggKyBidWZmZXIgKiA0IDogeCAtIGJ1ZmZlciAqIDQsIHkgLSBidWZmZXJdO1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludFR3byA9IFtpc0Zsb2F0aW5nV2lkZXIgPyB4IC0gYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8geCArIGJ1ZmZlciAqIDQgOiB4IC0gYnVmZmVyICogNCwgeSAtIGJ1ZmZlcl07XG4gICAgICAgICAgICAgIGNvbnN0IGNvbW1vblBvaW50cyA9IFtbcmVjdC5sZWZ0LCBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IHJlY3QudG9wICsgYnVmZmVyIDogaXNGbG9hdGluZ1dpZGVyID8gcmVjdC50b3AgKyBidWZmZXIgOiByZWN0LmJvdHRvbV0sIFtyZWN0LnJpZ2h0LCBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IGlzRmxvYXRpbmdXaWRlciA/IHJlY3QudG9wICsgYnVmZmVyIDogcmVjdC5ib3R0b20gOiByZWN0LnRvcCArIGJ1ZmZlcl1dO1xuICAgICAgICAgICAgICByZXR1cm4gW2N1cnNvclBvaW50T25lLCBjdXJzb3JQb2ludFR3bywgLi4uY29tbW9uUG9pbnRzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRPbmUgPSBbeCArIGJ1ZmZlciArIDEsIGlzRmxvYXRpbmdUYWxsZXIgPyB5ICsgYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHkgKyBidWZmZXIgKiA0IDogeSAtIGJ1ZmZlciAqIDRdO1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludFR3byA9IFt4ICsgYnVmZmVyICsgMSwgaXNGbG9hdGluZ1RhbGxlciA/IHkgLSBidWZmZXIgLyAyIDogY3Vyc29yTGVhdmVGcm9tQm90dG9tID8geSArIGJ1ZmZlciAqIDQgOiB5IC0gYnVmZmVyICogNF07XG4gICAgICAgICAgICAgIGNvbnN0IGNvbW1vblBvaW50cyA9IFtbY3Vyc29yTGVhdmVGcm9tQm90dG9tID8gcmVjdC5yaWdodCAtIGJ1ZmZlciA6IGlzRmxvYXRpbmdUYWxsZXIgPyByZWN0LnJpZ2h0IC0gYnVmZmVyIDogcmVjdC5sZWZ0LCByZWN0LnRvcF0sIFtjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyBpc0Zsb2F0aW5nVGFsbGVyID8gcmVjdC5yaWdodCAtIGJ1ZmZlciA6IHJlY3QubGVmdCA6IHJlY3QucmlnaHQgLSBidWZmZXIsIHJlY3QuYm90dG9tXV07XG4gICAgICAgICAgICAgIHJldHVybiBbLi4uY29tbW9uUG9pbnRzLCBjdXJzb3JQb2ludE9uZSwgY3Vyc29yUG9pbnRUd29dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRPbmUgPSBbeCAtIGJ1ZmZlciwgaXNGbG9hdGluZ1RhbGxlciA/IHkgKyBidWZmZXIgLyAyIDogY3Vyc29yTGVhdmVGcm9tQm90dG9tID8geSArIGJ1ZmZlciAqIDQgOiB5IC0gYnVmZmVyICogNF07XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50VHdvID0gW3ggLSBidWZmZXIsIGlzRmxvYXRpbmdUYWxsZXIgPyB5IC0gYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHkgKyBidWZmZXIgKiA0IDogeSAtIGJ1ZmZlciAqIDRdO1xuICAgICAgICAgICAgICBjb25zdCBjb21tb25Qb2ludHMgPSBbW2N1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHJlY3QubGVmdCArIGJ1ZmZlciA6IGlzRmxvYXRpbmdUYWxsZXIgPyByZWN0LmxlZnQgKyBidWZmZXIgOiByZWN0LnJpZ2h0LCByZWN0LnRvcF0sIFtjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyBpc0Zsb2F0aW5nVGFsbGVyID8gcmVjdC5sZWZ0ICsgYnVmZmVyIDogcmVjdC5yaWdodCA6IHJlY3QubGVmdCArIGJ1ZmZlciwgcmVjdC5ib3R0b21dXTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtjdXJzb3JQb2ludE9uZSwgY3Vyc29yUG9pbnRUd28sIC4uLmNvbW1vblBvaW50c107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc1BvaW50SW5Qb2x5Z29uKFtjbGllbnRYLCBjbGllbnRZXSwgcmVjdFBvbHkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNMYW5kZWQgJiYgIWlzT3ZlclJlZmVyZW5jZVJlY3QpIHtcbiAgICAgICAgcmV0dXJuIGNsb3NlKCk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzTGVhdmUgJiYgcmVxdWlyZUludGVudCkge1xuICAgICAgICBjb25zdCBjdXJzb3JTcGVlZCA9IGdldEN1cnNvclNwZWVkKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgICBjb25zdCBjdXJzb3JTcGVlZFRocmVzaG9sZCA9IDAuMTtcbiAgICAgICAgaWYgKGN1cnNvclNwZWVkICE9PSBudWxsICYmIGN1cnNvclNwZWVkIDwgY3Vyc29yU3BlZWRUaHJlc2hvbGQpIHtcbiAgICAgICAgICByZXR1cm4gY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1BvaW50SW5Qb2x5Z29uKFtjbGllbnRYLCBjbGllbnRZXSwgZ2V0UG9seWdvbihbeCwgeV0pKSkge1xuICAgICAgICBjbG9zZSgpO1xuICAgICAgfSBlbHNlIGlmICghaGFzTGFuZGVkICYmIHJlcXVpcmVJbnRlbnQpIHtcbiAgICAgICAgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoY2xvc2UsIDQwKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICBmbi5fX29wdGlvbnMgPSB7XG4gICAgYmxvY2tQb2ludGVyRXZlbnRzXG4gIH07XG4gIHJldHVybiBmbjtcbn1cblxuZXhwb3J0IHsgQ29tcG9zaXRlLCBDb21wb3NpdGVJdGVtLCBGbG9hdGluZ0Fycm93LCBGbG9hdGluZ0RlbGF5R3JvdXAsIEZsb2F0aW5nRm9jdXNNYW5hZ2VyLCBGbG9hdGluZ0xpc3QsIEZsb2F0aW5nTm9kZSwgRmxvYXRpbmdPdmVybGF5LCBGbG9hdGluZ1BvcnRhbCwgRmxvYXRpbmdUcmVlLCBpbm5lciwgc2FmZVBvbHlnb24sIHVzZUNsaWNrLCB1c2VDbGllbnRQb2ludCwgdXNlRGVsYXlHcm91cCwgdXNlRGVsYXlHcm91cENvbnRleHQsIHVzZURpc21pc3MsIHVzZUZsb2F0aW5nLCB1c2VGbG9hdGluZ05vZGVJZCwgdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQsIHVzZUZsb2F0aW5nUG9ydGFsTm9kZSwgdXNlRmxvYXRpbmdSb290Q29udGV4dCwgdXNlRmxvYXRpbmdUcmVlLCB1c2VGb2N1cywgdXNlSG92ZXIsIHVzZUlkLCB1c2VJbm5lck9mZnNldCwgdXNlSW50ZXJhY3Rpb25zLCB1c2VMaXN0SXRlbSwgdXNlTGlzdE5hdmlnYXRpb24sIHVzZU1lcmdlUmVmcywgdXNlUm9sZSwgdXNlVHJhbnNpdGlvblN0YXR1cywgdXNlVHJhbnNpdGlvblN0eWxlcywgdXNlVHlwZWFoZWFkIH07XG4iLCIvKiB0c2xpbnQ6ZGlzYWJsZSBtYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuaW1wb3J0IHsgZGVjb21wcmVzc0pzb24sIHBhZFN0YXJ0IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgQWxsRW5jb2RpbmdzQ29tcHJlc3NlZCBmcm9tICcuL2FsbC1lbmNvZGluZ3MuY29tcHJlc3NlZC5qc29uJztcbnZhciBkZWNvbXByZXNzZWRFbmNvZGluZ3MgPSBkZWNvbXByZXNzSnNvbihBbGxFbmNvZGluZ3NDb21wcmVzc2VkKTtcbnZhciBhbGxVbmljb2RlTWFwcGluZ3MgPSBKU09OLnBhcnNlKGRlY29tcHJlc3NlZEVuY29kaW5ncyk7XG52YXIgRW5jb2RpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRW5jb2RpbmcobmFtZSwgdW5pY29kZU1hcHBpbmdzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuY2FuRW5jb2RlVW5pY29kZUNvZGVQb2ludCA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2RlUG9pbnQgaW4gX3RoaXMudW5pY29kZU1hcHBpbmdzO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVuY29kZVVuaWNvZGVDb2RlUG9pbnQgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgICAgICAgICB2YXIgbWFwcGVkID0gX3RoaXMudW5pY29kZU1hcHBpbmdzW2NvZGVQb2ludF07XG4gICAgICAgICAgICBpZiAoIW1hcHBlZCkge1xuICAgICAgICAgICAgICAgIHZhciBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG4gICAgICAgICAgICAgICAgdmFyIGhleENvZGUgPSBcIjB4XCIgKyBwYWRTdGFydChjb2RlUG9pbnQudG9TdHJpbmcoMTYpLCA0LCAnMCcpO1xuICAgICAgICAgICAgICAgIHZhciBtc2cgPSBfdGhpcy5uYW1lICsgXCIgY2Fubm90IGVuY29kZSBcXFwiXCIgKyBzdHIgKyBcIlxcXCIgKFwiICsgaGV4Q29kZSArIFwiKVwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgY29kZTogbWFwcGVkWzBdLCBuYW1lOiBtYXBwZWRbMV0gfTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0ZWRDb2RlUG9pbnRzID0gT2JqZWN0LmtleXModW5pY29kZU1hcHBpbmdzKVxuICAgICAgICAgICAgLm1hcChOdW1iZXIpXG4gICAgICAgICAgICAuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pO1xuICAgICAgICB0aGlzLnVuaWNvZGVNYXBwaW5ncyA9IHVuaWNvZGVNYXBwaW5ncztcbiAgICB9XG4gICAgcmV0dXJuIEVuY29kaW5nO1xufSgpKTtcbmV4cG9ydCB2YXIgRW5jb2RpbmdzID0ge1xuICAgIFN5bWJvbDogbmV3IEVuY29kaW5nKCdTeW1ib2wnLCBhbGxVbmljb2RlTWFwcGluZ3Muc3ltYm9sKSxcbiAgICBaYXBmRGluZ2JhdHM6IG5ldyBFbmNvZGluZygnWmFwZkRpbmdiYXRzJywgYWxsVW5pY29kZU1hcHBpbmdzLnphcGZkaW5nYmF0cyksXG4gICAgV2luQW5zaTogbmV3IEVuY29kaW5nKCdXaW5BbnNpJywgYWxsVW5pY29kZU1hcHBpbmdzLndpbjEyNTIpLFxufTtcbiIsImltcG9ydCB7IGRlY29tcHJlc3NKc29uIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgQ291cmllckJvbGRDb21wcmVzc2VkIGZyb20gJy4vQ291cmllci1Cb2xkLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgQ291cmllckJvbGRPYmxpcXVlQ29tcHJlc3NlZCBmcm9tICcuL0NvdXJpZXItQm9sZE9ibGlxdWUuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBDb3VyaWVyT2JsaXF1ZUNvbXByZXNzZWQgZnJvbSAnLi9Db3VyaWVyLU9ibGlxdWUuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBDb3VyaWVyQ29tcHJlc3NlZCBmcm9tICcuL0NvdXJpZXIuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBIZWx2ZXRpY2FCb2xkQ29tcHJlc3NlZCBmcm9tICcuL0hlbHZldGljYS1Cb2xkLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgSGVsdmV0aWNhQm9sZE9ibGlxdWVDb21wcmVzc2VkIGZyb20gJy4vSGVsdmV0aWNhLUJvbGRPYmxpcXVlLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgSGVsdmV0aWNhT2JsaXF1ZUNvbXByZXNzZWQgZnJvbSAnLi9IZWx2ZXRpY2EtT2JsaXF1ZS5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IEhlbHZldGljYUNvbXByZXNzZWQgZnJvbSAnLi9IZWx2ZXRpY2EuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBUaW1lc0JvbGRDb21wcmVzc2VkIGZyb20gJy4vVGltZXMtQm9sZC5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IFRpbWVzQm9sZEl0YWxpY0NvbXByZXNzZWQgZnJvbSAnLi9UaW1lcy1Cb2xkSXRhbGljLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgVGltZXNJdGFsaWNDb21wcmVzc2VkIGZyb20gJy4vVGltZXMtSXRhbGljLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgVGltZXNSb21hbkNvbXByZXNzZWQgZnJvbSAnLi9UaW1lcy1Sb21hbi5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IFN5bWJvbENvbXByZXNzZWQgZnJvbSAnLi9TeW1ib2wuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBaYXBmRGluZ2JhdHNDb21wcmVzc2VkIGZyb20gJy4vWmFwZkRpbmdiYXRzLmNvbXByZXNzZWQuanNvbic7XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBjb21wcmVzc2VkSnNvbkZvckZvbnROYW1lID0ge1xuICAgICdDb3VyaWVyJzogQ291cmllckNvbXByZXNzZWQsXG4gICAgJ0NvdXJpZXItQm9sZCc6IENvdXJpZXJCb2xkQ29tcHJlc3NlZCxcbiAgICAnQ291cmllci1PYmxpcXVlJzogQ291cmllck9ibGlxdWVDb21wcmVzc2VkLFxuICAgICdDb3VyaWVyLUJvbGRPYmxpcXVlJzogQ291cmllckJvbGRPYmxpcXVlQ29tcHJlc3NlZCxcbiAgICAnSGVsdmV0aWNhJzogSGVsdmV0aWNhQ29tcHJlc3NlZCxcbiAgICAnSGVsdmV0aWNhLUJvbGQnOiBIZWx2ZXRpY2FCb2xkQ29tcHJlc3NlZCxcbiAgICAnSGVsdmV0aWNhLU9ibGlxdWUnOiBIZWx2ZXRpY2FPYmxpcXVlQ29tcHJlc3NlZCxcbiAgICAnSGVsdmV0aWNhLUJvbGRPYmxpcXVlJzogSGVsdmV0aWNhQm9sZE9ibGlxdWVDb21wcmVzc2VkLFxuICAgICdUaW1lcy1Sb21hbic6IFRpbWVzUm9tYW5Db21wcmVzc2VkLFxuICAgICdUaW1lcy1Cb2xkJzogVGltZXNCb2xkQ29tcHJlc3NlZCxcbiAgICAnVGltZXMtSXRhbGljJzogVGltZXNJdGFsaWNDb21wcmVzc2VkLFxuICAgICdUaW1lcy1Cb2xkSXRhbGljJzogVGltZXNCb2xkSXRhbGljQ29tcHJlc3NlZCxcbiAgICAnU3ltYm9sJzogU3ltYm9sQ29tcHJlc3NlZCxcbiAgICAnWmFwZkRpbmdiYXRzJzogWmFwZkRpbmdiYXRzQ29tcHJlc3NlZCxcbn07XG5leHBvcnQgdmFyIEZvbnROYW1lcztcbihmdW5jdGlvbiAoRm9udE5hbWVzKSB7XG4gICAgRm9udE5hbWVzW1wiQ291cmllclwiXSA9IFwiQ291cmllclwiO1xuICAgIEZvbnROYW1lc1tcIkNvdXJpZXJCb2xkXCJdID0gXCJDb3VyaWVyLUJvbGRcIjtcbiAgICBGb250TmFtZXNbXCJDb3VyaWVyT2JsaXF1ZVwiXSA9IFwiQ291cmllci1PYmxpcXVlXCI7XG4gICAgRm9udE5hbWVzW1wiQ291cmllckJvbGRPYmxpcXVlXCJdID0gXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCI7XG4gICAgRm9udE5hbWVzW1wiSGVsdmV0aWNhXCJdID0gXCJIZWx2ZXRpY2FcIjtcbiAgICBGb250TmFtZXNbXCJIZWx2ZXRpY2FCb2xkXCJdID0gXCJIZWx2ZXRpY2EtQm9sZFwiO1xuICAgIEZvbnROYW1lc1tcIkhlbHZldGljYU9ibGlxdWVcIl0gPSBcIkhlbHZldGljYS1PYmxpcXVlXCI7XG4gICAgRm9udE5hbWVzW1wiSGVsdmV0aWNhQm9sZE9ibGlxdWVcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICAgIEZvbnROYW1lc1tcIlRpbWVzUm9tYW5cIl0gPSBcIlRpbWVzLVJvbWFuXCI7XG4gICAgRm9udE5hbWVzW1wiVGltZXNSb21hbkJvbGRcIl0gPSBcIlRpbWVzLUJvbGRcIjtcbiAgICBGb250TmFtZXNbXCJUaW1lc1JvbWFuSXRhbGljXCJdID0gXCJUaW1lcy1JdGFsaWNcIjtcbiAgICBGb250TmFtZXNbXCJUaW1lc1JvbWFuQm9sZEl0YWxpY1wiXSA9IFwiVGltZXMtQm9sZEl0YWxpY1wiO1xuICAgIEZvbnROYW1lc1tcIlN5bWJvbFwiXSA9IFwiU3ltYm9sXCI7XG4gICAgRm9udE5hbWVzW1wiWmFwZkRpbmdiYXRzXCJdID0gXCJaYXBmRGluZ2JhdHNcIjtcbn0pKEZvbnROYW1lcyB8fCAoRm9udE5hbWVzID0ge30pKTtcbnZhciBmb250Q2FjaGUgPSB7fTtcbnZhciBGb250ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZvbnQoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZ2V0V2lkdGhPZkdseXBoID0gZnVuY3Rpb24gKGdseXBoTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNoYXJXaWR0aHNbZ2x5cGhOYW1lXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRYQXhpc0tlcm5pbmdGb3JQYWlyID0gZnVuY3Rpb24gKGxlZnRHbHlwaE5hbWUsIHJpZ2h0R2x5cGhOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gKF90aGlzLktlcm5QYWlyWEFtb3VudHNbbGVmdEdseXBoTmFtZV0gfHwge30pW3JpZ2h0R2x5cGhOYW1lXTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRm9udC5sb2FkID0gZnVuY3Rpb24gKGZvbnROYW1lKSB7XG4gICAgICAgIHZhciBjYWNoZWRGb250ID0gZm9udENhY2hlW2ZvbnROYW1lXTtcbiAgICAgICAgaWYgKGNhY2hlZEZvbnQpXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkRm9udDtcbiAgICAgICAgdmFyIGpzb24gPSBkZWNvbXByZXNzSnNvbihjb21wcmVzc2VkSnNvbkZvckZvbnROYW1lW2ZvbnROYW1lXSk7XG4gICAgICAgIHZhciBmb250ID0gT2JqZWN0LmFzc2lnbihuZXcgRm9udCgpLCBKU09OLnBhcnNlKGpzb24pKTtcbiAgICAgICAgZm9udC5DaGFyV2lkdGhzID0gZm9udC5DaGFyTWV0cmljcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgbWV0cmljKSB7XG4gICAgICAgICAgICBhY2NbbWV0cmljLk5dID0gbWV0cmljLldYO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuICAgICAgICBmb250Lktlcm5QYWlyWEFtb3VudHMgPSBmb250Lktlcm5QYWlycy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgX2EpIHtcbiAgICAgICAgICAgIHZhciBuYW1lMSA9IF9hWzBdLCBuYW1lMiA9IF9hWzFdLCB3aWR0aCA9IF9hWzJdO1xuICAgICAgICAgICAgaWYgKCFhY2NbbmFtZTFdKVxuICAgICAgICAgICAgICAgIGFjY1tuYW1lMV0gPSB7fTtcbiAgICAgICAgICAgIGFjY1tuYW1lMV1bbmFtZTJdID0gd2lkdGg7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIGZvbnRDYWNoZVtmb250TmFtZV0gPSBmb250O1xuICAgICAgICByZXR1cm4gZm9udDtcbiAgICB9O1xuICAgIHJldHVybiBGb250O1xufSgpKTtcbmV4cG9ydCB7IEZvbnQgfTtcbiIsImV4cG9ydCAqIGZyb20gJy4vRm9udCc7XG5leHBvcnQgKiBmcm9tICcuL0VuY29kaW5nJztcbiIsIi8qXG4gKiBUaGUgYGNoYXJzYCwgYGxvb2t1cGAsIGFuZCBgZGVjb2RlRnJvbUJhc2U2NGAgbWVtYmVycyBvZiB0aGlzIGZpbGUgYXJlXG4gKiBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAgICBiYXNlNjQtYXJyYXlidWZmZXJcbiAqICAgICBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzdmgvYmFzZTY0LWFycmF5YnVmZmVyXG4gKlxuICogICAgIENvcHlyaWdodCAoYykgMjAxMiBOaWtsYXMgdm9uIEhlcnR6ZW5cbiAqICAgICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICovXG5pbXBvcnQgcGFrbyBmcm9tICdwYWtvJztcbnZhciBjaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcbi8vIFVzZSBhIGxvb2t1cCB0YWJsZSB0byBmaW5kIHRoZSBpbmRleC5cbnZhciBsb29rdXAgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG59XG5leHBvcnQgdmFyIGRlY29kZUZyb21CYXNlNjQgPSBmdW5jdGlvbiAoYmFzZTY0KSB7XG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGJhc2U2NC5sZW5ndGggKiAwLjc1O1xuICAgIHZhciBsZW4gPSBiYXNlNjQubGVuZ3RoO1xuICAgIHZhciBpO1xuICAgIHZhciBwID0gMDtcbiAgICB2YXIgZW5jb2RlZDE7XG4gICAgdmFyIGVuY29kZWQyO1xuICAgIHZhciBlbmNvZGVkMztcbiAgICB2YXIgZW5jb2RlZDQ7XG4gICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMV0gPT09ICc9Jykge1xuICAgICAgICBidWZmZXJMZW5ndGgtLTtcbiAgICAgICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMl0gPT09ICc9Jykge1xuICAgICAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyTGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICAgICAgZW5jb2RlZDEgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBlbmNvZGVkMiA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMSldO1xuICAgICAgICBlbmNvZGVkMyA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMildO1xuICAgICAgICBlbmNvZGVkNCA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMyldO1xuICAgICAgICBieXRlc1twKytdID0gKGVuY29kZWQxIDw8IDIpIHwgKGVuY29kZWQyID4+IDQpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMiAmIDE1KSA8PCA0KSB8IChlbmNvZGVkMyA+PiAyKTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9ICgoZW5jb2RlZDMgJiAzKSA8PCA2KSB8IChlbmNvZGVkNCAmIDYzKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufTtcbnZhciBhcnJheVRvU3RyaW5nID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyYXlbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufTtcbmV4cG9ydCB2YXIgZGVjb21wcmVzc0pzb24gPSBmdW5jdGlvbiAoY29tcHJlc3NlZEpzb24pIHtcbiAgICByZXR1cm4gYXJyYXlUb1N0cmluZyhwYWtvLmluZmxhdGUoZGVjb2RlRnJvbUJhc2U2NChjb21wcmVzc2VkSnNvbikpKTtcbn07XG5leHBvcnQgdmFyIHBhZFN0YXJ0ID0gZnVuY3Rpb24gKHZhbHVlLCBsZW5ndGgsIHBhZENoYXIpIHtcbiAgICB2YXIgcGFkZGluZyA9ICcnO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxlbmd0aCAtIHZhbHVlLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBwYWRkaW5nICs9IHBhZENoYXI7XG4gICAgfVxuICAgIHJldHVybiBwYWRkaW5nICsgdmFsdWU7XG59O1xuIiwiaW1wb3J0IHBha28gZnJvbSAncGFrbyc7XG5cbnZhciBVUE5HID0ge307XG5cblx0XG5cblVQTkcudG9SR0JBOCA9IGZ1bmN0aW9uKG91dClcbntcblx0dmFyIHcgPSBvdXQud2lkdGgsIGggPSBvdXQuaGVpZ2h0O1xuXHRpZihvdXQudGFicy5hY1RMPT1udWxsKSByZXR1cm4gW1VQTkcudG9SR0JBOC5kZWNvZGVJbWFnZShvdXQuZGF0YSwgdywgaCwgb3V0KS5idWZmZXJdO1xuXHRcblx0dmFyIGZybXMgPSBbXTtcblx0aWYob3V0LmZyYW1lc1swXS5kYXRhPT1udWxsKSBvdXQuZnJhbWVzWzBdLmRhdGEgPSBvdXQuZGF0YTtcblx0XG5cdHZhciBsZW4gPSB3KmgqNCwgaW1nID0gbmV3IFVpbnQ4QXJyYXkobGVuKSwgZW1wdHkgPSBuZXcgVWludDhBcnJheShsZW4pLCBwcmV2PW5ldyBVaW50OEFycmF5KGxlbik7XG5cdGZvcih2YXIgaT0wOyBpPG91dC5mcmFtZXMubGVuZ3RoOyBpKyspXG5cdHtcblx0XHR2YXIgZnJtID0gb3V0LmZyYW1lc1tpXTtcblx0XHR2YXIgZng9ZnJtLnJlY3QueCwgZnk9ZnJtLnJlY3QueSwgZncgPSBmcm0ucmVjdC53aWR0aCwgZmggPSBmcm0ucmVjdC5oZWlnaHQ7XG5cdFx0dmFyIGZkYXRhID0gVVBORy50b1JHQkE4LmRlY29kZUltYWdlKGZybS5kYXRhLCBmdyxmaCwgb3V0KTtcblx0XHRcblx0XHRpZihpIT0wKSBmb3IodmFyIGo9MDsgajxsZW47IGorKykgcHJldltqXT1pbWdbal07XG5cdFx0XG5cdFx0aWYgICAgIChmcm0uYmxlbmQ9PTApIFVQTkcuX2NvcHlUaWxlKGZkYXRhLCBmdywgZmgsIGltZywgdywgaCwgZngsIGZ5LCAwKTtcblx0XHRlbHNlIGlmKGZybS5ibGVuZD09MSkgVVBORy5fY29weVRpbGUoZmRhdGEsIGZ3LCBmaCwgaW1nLCB3LCBoLCBmeCwgZnksIDEpO1xuXHRcdFxuXHRcdGZybXMucHVzaChpbWcuYnVmZmVyLnNsaWNlKDApKTtcblx0XHRcblx0XHRpZiAgICAgKGZybS5kaXNwb3NlPT0wKSB7fVxuXHRcdGVsc2UgaWYoZnJtLmRpc3Bvc2U9PTEpIFVQTkcuX2NvcHlUaWxlKGVtcHR5LCBmdywgZmgsIGltZywgdywgaCwgZngsIGZ5LCAwKTtcblx0XHRlbHNlIGlmKGZybS5kaXNwb3NlPT0yKSBmb3IodmFyIGo9MDsgajxsZW47IGorKykgaW1nW2pdPXByZXZbal07XG5cdH1cblx0cmV0dXJuIGZybXM7XG59XG5VUE5HLnRvUkdCQTguZGVjb2RlSW1hZ2UgPSBmdW5jdGlvbihkYXRhLCB3LCBoLCBvdXQpXG57XG5cdHZhciBhcmVhID0gdypoLCBicHAgPSBVUE5HLmRlY29kZS5fZ2V0QlBQKG91dCk7XG5cdHZhciBicGwgPSBNYXRoLmNlaWwodypicHAvOCk7XHQvLyBieXRlcyBwZXIgbGluZVxuXG5cdHZhciBiZiA9IG5ldyBVaW50OEFycmF5KGFyZWEqNCksIGJmMzIgPSBuZXcgVWludDMyQXJyYXkoYmYuYnVmZmVyKTtcblx0dmFyIGN0eXBlID0gb3V0LmN0eXBlLCBkZXB0aCA9IG91dC5kZXB0aDtcblx0dmFyIHJzID0gVVBORy5fYmluLnJlYWRVc2hvcnQ7XG5cdFxuXHQvL2NvbnNvbGUubG9nKGN0eXBlLCBkZXB0aCk7XG5cdHZhciB0aW1lID0gRGF0ZS5ub3coKTtcblxuXHRpZiAgICAgKGN0eXBlPT02KSB7IC8vIFJHQiArIGFscGhhXG5cdFx0dmFyIHFhcmVhID0gYXJlYTw8Mjtcblx0XHRpZihkZXB0aD09IDgpIGZvcih2YXIgaT0wOyBpPHFhcmVhO2krPTQpIHsgIGJmW2ldID0gZGF0YVtpXTsgIGJmW2krMV0gPSBkYXRhW2krMV07ICBiZltpKzJdID0gZGF0YVtpKzJdOyAgYmZbaSszXSA9IGRhdGFbaSszXTsgfVxuXHRcdGlmKGRlcHRoPT0xNikgZm9yKHZhciBpPTA7IGk8cWFyZWE7aSsrICkgeyAgYmZbaV0gPSBkYXRhW2k8PDFdOyAgfVxuXHR9XG5cdGVsc2UgaWYoY3R5cGU9PTIpIHtcdC8vIFJHQlxuXHRcdHZhciB0cz1vdXQudGFic1tcInRSTlNcIl07XG5cdFx0aWYodHM9PW51bGwpIHtcblx0XHRcdGlmKGRlcHRoPT0gOCkgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7ICB2YXIgdGk9aSozOyAgYmYzMltpXSA9ICgyNTU8PDI0KXwoZGF0YVt0aSsyXTw8MTYpfChkYXRhW3RpKzFdPDw4KXxkYXRhW3RpXTsgIH1cblx0XHRcdGlmKGRlcHRoPT0xNikgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7ICB2YXIgdGk9aSo2OyAgYmYzMltpXSA9ICgyNTU8PDI0KXwoZGF0YVt0aSs0XTw8MTYpfChkYXRhW3RpKzJdPDw4KXxkYXRhW3RpXTsgIH1cblx0XHR9XG5cdFx0ZWxzZSB7ICB2YXIgdHI9dHNbMF0sIHRnPXRzWzFdLCB0Yj10c1syXTtcblx0XHRcdGlmKGRlcHRoPT0gOCkgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7ICB2YXIgcWk9aTw8MiwgdGk9aSozOyAgYmYzMltpXSA9ICgyNTU8PDI0KXwoZGF0YVt0aSsyXTw8MTYpfChkYXRhW3RpKzFdPDw4KXxkYXRhW3RpXTtcblx0XHRcdFx0aWYoZGF0YVt0aV0gICA9PXRyICYmIGRhdGFbdGkrMV0gICA9PXRnICYmIGRhdGFbdGkrMl0gICA9PXRiKSBiZltxaSszXSA9IDA7ICB9XG5cdFx0XHRpZihkZXB0aD09MTYpIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHFpPWk8PDIsIHRpPWkqNjsgIGJmMzJbaV0gPSAoMjU1PDwyNCl8KGRhdGFbdGkrNF08PDE2KXwoZGF0YVt0aSsyXTw8OCl8ZGF0YVt0aV07XG5cdFx0XHRcdGlmKHJzKGRhdGEsdGkpPT10ciAmJiBycyhkYXRhLHRpKzIpPT10ZyAmJiBycyhkYXRhLHRpKzQpPT10YikgYmZbcWkrM10gPSAwOyAgfVxuXHRcdH1cblx0fVxuXHRlbHNlIGlmKGN0eXBlPT0zKSB7XHQvLyBwYWxldHRlXG5cdFx0dmFyIHA9b3V0LnRhYnNbXCJQTFRFXCJdLCBhcD1vdXQudGFic1tcInRSTlNcIl0sIHRsPWFwP2FwLmxlbmd0aDowO1xuXHRcdC8vY29uc29sZS5sb2cocCwgYXApO1xuXHRcdGlmKGRlcHRoPT0xKSBmb3IodmFyIHk9MDsgeTxoOyB5KyspIHsgIHZhciBzMCA9IHkqYnBsLCB0MCA9IHkqdztcblx0XHRcdGZvcih2YXIgaT0wOyBpPHc7IGkrKykgeyB2YXIgcWk9KHQwK2kpPDwyLCBqPSgoZGF0YVtzMCsoaT4+MyldPj4oNy0oKGkmNyk8PDApKSkmIDEpLCBjaj0zKmo7ICBiZltxaV09cFtjal07ICBiZltxaSsxXT1wW2NqKzFdOyAgYmZbcWkrMl09cFtjaisyXTsgIGJmW3FpKzNdPShqPHRsKT9hcFtqXToyNTU7ICB9XG5cdFx0fVxuXHRcdGlmKGRlcHRoPT0yKSBmb3IodmFyIHk9MDsgeTxoOyB5KyspIHsgIHZhciBzMCA9IHkqYnBsLCB0MCA9IHkqdztcblx0XHRcdGZvcih2YXIgaT0wOyBpPHc7IGkrKykgeyB2YXIgcWk9KHQwK2kpPDwyLCBqPSgoZGF0YVtzMCsoaT4+MildPj4oNi0oKGkmMyk8PDEpKSkmIDMpLCBjaj0zKmo7ICBiZltxaV09cFtjal07ICBiZltxaSsxXT1wW2NqKzFdOyAgYmZbcWkrMl09cFtjaisyXTsgIGJmW3FpKzNdPShqPHRsKT9hcFtqXToyNTU7ICB9XG5cdFx0fVxuXHRcdGlmKGRlcHRoPT00KSBmb3IodmFyIHk9MDsgeTxoOyB5KyspIHsgIHZhciBzMCA9IHkqYnBsLCB0MCA9IHkqdztcblx0XHRcdGZvcih2YXIgaT0wOyBpPHc7IGkrKykgeyB2YXIgcWk9KHQwK2kpPDwyLCBqPSgoZGF0YVtzMCsoaT4+MSldPj4oNC0oKGkmMSk8PDIpKSkmMTUpLCBjaj0zKmo7ICBiZltxaV09cFtjal07ICBiZltxaSsxXT1wW2NqKzFdOyAgYmZbcWkrMl09cFtjaisyXTsgIGJmW3FpKzNdPShqPHRsKT9hcFtqXToyNTU7ICB9XG5cdFx0fVxuXHRcdGlmKGRlcHRoPT04KSBmb3IodmFyIGk9MDsgaTxhcmVhOyBpKysgKSB7ICB2YXIgcWk9aTw8Miwgaj1kYXRhW2ldICAgICAgICAgICAgICAgICAgICAgICwgY2o9MypqOyAgYmZbcWldPXBbY2pdOyAgYmZbcWkrMV09cFtjaisxXTsgIGJmW3FpKzJdPXBbY2orMl07ICBiZltxaSszXT0oajx0bCk/YXBbal06MjU1OyAgfVxuXHR9XG5cdGVsc2UgaWYoY3R5cGU9PTQpIHtcdC8vIGdyYXkgKyBhbHBoYVxuXHRcdGlmKGRlcHRoPT0gOCkgIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHFpPWk8PDIsIGRpPWk8PDEsIGdyPWRhdGFbZGldOyAgYmZbcWldPWdyOyAgYmZbcWkrMV09Z3I7ICBiZltxaSsyXT1ncjsgIGJmW3FpKzNdPWRhdGFbZGkrMV07ICB9XG5cdFx0aWYoZGVwdGg9PTE2KSAgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7ICB2YXIgcWk9aTw8MiwgZGk9aTw8MiwgZ3I9ZGF0YVtkaV07ICBiZltxaV09Z3I7ICBiZltxaSsxXT1ncjsgIGJmW3FpKzJdPWdyOyAgYmZbcWkrM109ZGF0YVtkaSsyXTsgIH1cblx0fVxuXHRlbHNlIGlmKGN0eXBlPT0wKSB7XHQvLyBncmF5XG5cdFx0dmFyIHRyID0gb3V0LnRhYnNbXCJ0Uk5TXCJdID8gb3V0LnRhYnNbXCJ0Uk5TXCJdIDogLTE7XG5cdFx0Zm9yKHZhciB5PTA7IHk8aDsgeSsrKSB7XG5cdFx0XHR2YXIgb2ZmID0geSpicGwsIHRvID0geSp3O1xuXHRcdFx0aWYgICAgIChkZXB0aD09IDEpIGZvcih2YXIgeD0wOyB4PHc7IHgrKykgeyAgdmFyIGdyPTI1NSooKGRhdGFbb2ZmKyh4Pj4+MyldPj4+KDcgLSgoeCY3KSAgICkpKSYgMSksIGFsPShncj09dHIqMjU1KT8wOjI1NTsgIGJmMzJbdG8reF09KGFsPDwyNCl8KGdyPDwxNil8KGdyPDw4KXxncjsgIH1cblx0XHRcdGVsc2UgaWYoZGVwdGg9PSAyKSBmb3IodmFyIHg9MDsgeDx3OyB4KyspIHsgIHZhciBncj0gODUqKChkYXRhW29mZisoeD4+PjIpXT4+Pig2IC0oKHgmMyk8PDEpKSkmIDMpLCBhbD0oZ3I9PXRyKiA4NSk/MDoyNTU7ICBiZjMyW3RvK3hdPShhbDw8MjQpfChncjw8MTYpfChncjw8OCl8Z3I7ICB9XG5cdFx0XHRlbHNlIGlmKGRlcHRoPT0gNCkgZm9yKHZhciB4PTA7IHg8dzsgeCsrKSB7ICB2YXIgZ3I9IDE3KigoZGF0YVtvZmYrKHg+Pj4xKV0+Pj4oNCAtKCh4JjEpPDwyKSkpJjE1KSwgYWw9KGdyPT10ciogMTcpPzA6MjU1OyAgYmYzMlt0byt4XT0oYWw8PDI0KXwoZ3I8PDE2KXwoZ3I8PDgpfGdyOyAgfVxuXHRcdFx0ZWxzZSBpZihkZXB0aD09IDgpIGZvcih2YXIgeD0wOyB4PHc7IHgrKykgeyAgdmFyIGdyPWRhdGFbb2ZmKyAgICAgeF0sIGFsPShnciAgICAgICAgICAgICAgICAgPT10cik/MDoyNTU7ICBiZjMyW3RvK3hdPShhbDw8MjQpfChncjw8MTYpfChncjw8OCl8Z3I7ICB9XG5cdFx0XHRlbHNlIGlmKGRlcHRoPT0xNikgZm9yKHZhciB4PTA7IHg8dzsgeCsrKSB7ICB2YXIgZ3I9ZGF0YVtvZmYrKHg8PDEpXSwgYWw9KHJzKGRhdGEsb2ZmKyh4PDxpKSk9PXRyKT8wOjI1NTsgIGJmMzJbdG8reF09KGFsPDwyNCl8KGdyPDwxNil8KGdyPDw4KXxncjsgIH1cblx0XHR9XG5cdH1cblx0Ly9jb25zb2xlLmxvZyhEYXRlLm5vdygpLXRpbWUpO1xuXHRyZXR1cm4gYmY7XG59XG5cblxuXG5VUE5HLmRlY29kZSA9IGZ1bmN0aW9uKGJ1ZmYpXG57XG5cdHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoYnVmZiksIG9mZnNldCA9IDgsIGJpbiA9IFVQTkcuX2JpbiwgclVzID0gYmluLnJlYWRVc2hvcnQsIHJVaSA9IGJpbi5yZWFkVWludDtcblx0dmFyIG91dCA9IHt0YWJzOnt9LCBmcmFtZXM6W119O1xuXHR2YXIgZGQgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCksIGRvZmYgPSAwO1x0IC8vIHB1dCBhbGwgSURBVCBkYXRhIGludG8gaXRcblx0dmFyIGZkLCBmb2ZmID0gMDtcdC8vIGZyYW1lc1xuXHRcblx0dmFyIG1nY2sgPSBbMHg4OSwgMHg1MCwgMHg0ZSwgMHg0NywgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYV07XG5cdGZvcih2YXIgaT0wOyBpPDg7IGkrKykgaWYoZGF0YVtpXSE9bWdja1tpXSkgdGhyb3cgXCJUaGUgaW5wdXQgaXMgbm90IGEgUE5HIGZpbGUhXCI7XG5cblx0d2hpbGUob2Zmc2V0PGRhdGEubGVuZ3RoKVxuXHR7XG5cdFx0dmFyIGxlbiAgPSBiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KTsgIG9mZnNldCArPSA0O1xuXHRcdHZhciB0eXBlID0gYmluLnJlYWRBU0NJSShkYXRhLCBvZmZzZXQsIDQpOyAgb2Zmc2V0ICs9IDQ7XG5cdFx0Ly9jb25zb2xlLmxvZyh0eXBlLGxlbik7XG5cdFx0XG5cdFx0aWYgICAgICh0eXBlPT1cIklIRFJcIikgIHsgIFVQTkcuZGVjb2RlLl9JSERSKGRhdGEsIG9mZnNldCwgb3V0KTsgIH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiSURBVFwiKSB7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTxsZW47IGkrKykgZGRbZG9mZitpXSA9IGRhdGFbb2Zmc2V0K2ldO1xuXHRcdFx0ZG9mZiArPSBsZW47XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJhY1RMXCIpICB7XG5cdFx0XHRvdXQudGFic1t0eXBlXSA9IHsgIG51bV9mcmFtZXM6clVpKGRhdGEsIG9mZnNldCksIG51bV9wbGF5czpyVWkoZGF0YSwgb2Zmc2V0KzQpICB9O1xuXHRcdFx0ZmQgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJmY1RMXCIpICB7XG5cdFx0XHRpZihmb2ZmIT0wKSB7ICB2YXIgZnIgPSBvdXQuZnJhbWVzW291dC5mcmFtZXMubGVuZ3RoLTFdO1xuXHRcdFx0XHRmci5kYXRhID0gVVBORy5kZWNvZGUuX2RlY29tcHJlc3Mob3V0LCBmZC5zbGljZSgwLGZvZmYpLCBmci5yZWN0LndpZHRoLCBmci5yZWN0LmhlaWdodCk7ICBmb2ZmPTA7XG5cdFx0XHR9XG5cdFx0XHR2YXIgcmN0ID0ge3g6clVpKGRhdGEsIG9mZnNldCsxMikseTpyVWkoZGF0YSwgb2Zmc2V0KzE2KSx3aWR0aDpyVWkoZGF0YSwgb2Zmc2V0KzQpLGhlaWdodDpyVWkoZGF0YSwgb2Zmc2V0KzgpfTtcblx0XHRcdHZhciBkZWwgPSByVXMoZGF0YSwgb2Zmc2V0KzIyKTsgIGRlbCA9IHJVcyhkYXRhLCBvZmZzZXQrMjApIC8gKGRlbD09MD8xMDA6ZGVsKTtcblx0XHRcdHZhciBmcm0gPSB7cmVjdDpyY3QsIGRlbGF5Ok1hdGgucm91bmQoZGVsKjEwMDApLCBkaXNwb3NlOmRhdGFbb2Zmc2V0KzI0XSwgYmxlbmQ6ZGF0YVtvZmZzZXQrMjVdfTtcblx0XHRcdC8vY29uc29sZS5sb2coZnJtKTtcblx0XHRcdG91dC5mcmFtZXMucHVzaChmcm0pO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiZmRBVFwiKSB7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTxsZW4tNDsgaSsrKSBmZFtmb2ZmK2ldID0gZGF0YVtvZmZzZXQraSs0XTtcblx0XHRcdGZvZmYgKz0gbGVuLTQ7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJwSFlzXCIpIHtcblx0XHRcdG91dC50YWJzW3R5cGVdID0gW2Jpbi5yZWFkVWludChkYXRhLCBvZmZzZXQpLCBiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KzQpLCBkYXRhW29mZnNldCs4XV07XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJjSFJNXCIpIHtcblx0XHRcdG91dC50YWJzW3R5cGVdID0gW107XG5cdFx0XHRmb3IodmFyIGk9MDsgaTw4OyBpKyspIG91dC50YWJzW3R5cGVdLnB1c2goYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCtpKjQpKTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cInRFWHRcIikge1xuXHRcdFx0aWYob3V0LnRhYnNbdHlwZV09PW51bGwpIG91dC50YWJzW3R5cGVdID0ge307XG5cdFx0XHR2YXIgbnogPSBiaW4ubmV4dFplcm8oZGF0YSwgb2Zmc2V0KTtcblx0XHRcdHZhciBrZXl3ID0gYmluLnJlYWRBU0NJSShkYXRhLCBvZmZzZXQsIG56LW9mZnNldCk7XG5cdFx0XHR2YXIgdGV4dCA9IGJpbi5yZWFkQVNDSUkoZGF0YSwgbnorMSwgb2Zmc2V0K2xlbi1uei0xKTtcblx0XHRcdG91dC50YWJzW3R5cGVdW2tleXddID0gdGV4dDtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cImlUWHRcIikge1xuXHRcdFx0aWYob3V0LnRhYnNbdHlwZV09PW51bGwpIG91dC50YWJzW3R5cGVdID0ge307XG5cdFx0XHR2YXIgbnogPSAwLCBvZmYgPSBvZmZzZXQ7XG5cdFx0XHRueiA9IGJpbi5uZXh0WmVybyhkYXRhLCBvZmYpO1xuXHRcdFx0dmFyIGtleXcgPSBiaW4ucmVhZEFTQ0lJKGRhdGEsIG9mZiwgbnotb2ZmKTsgIG9mZiA9IG56ICsgMTtcblx0XHRcdHZhciBjZmxhZyA9IGRhdGFbb2ZmXSwgY21ldGggPSBkYXRhW29mZisxXTsgIG9mZis9Mjtcblx0XHRcdG56ID0gYmluLm5leHRaZXJvKGRhdGEsIG9mZik7XG5cdFx0XHR2YXIgbHRhZyA9IGJpbi5yZWFkQVNDSUkoZGF0YSwgb2ZmLCBuei1vZmYpOyAgb2ZmID0gbnogKyAxO1xuXHRcdFx0bnogPSBiaW4ubmV4dFplcm8oZGF0YSwgb2ZmKTtcblx0XHRcdHZhciB0a2V5dyA9IGJpbi5yZWFkVVRGOChkYXRhLCBvZmYsIG56LW9mZik7ICBvZmYgPSBueiArIDE7XG5cdFx0XHR2YXIgdGV4dCAgPSBiaW4ucmVhZFVURjgoZGF0YSwgb2ZmLCBsZW4tKG9mZi1vZmZzZXQpKTtcblx0XHRcdG91dC50YWJzW3R5cGVdW2tleXddID0gdGV4dDtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cIlBMVEVcIikge1xuXHRcdFx0b3V0LnRhYnNbdHlwZV0gPSBiaW4ucmVhZEJ5dGVzKGRhdGEsIG9mZnNldCwgbGVuKTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cImhJU1RcIikge1xuXHRcdFx0dmFyIHBsID0gb3V0LnRhYnNbXCJQTFRFXCJdLmxlbmd0aC8zO1xuXHRcdFx0b3V0LnRhYnNbdHlwZV0gPSBbXTsgIGZvcih2YXIgaT0wOyBpPHBsOyBpKyspIG91dC50YWJzW3R5cGVdLnB1c2goclVzKGRhdGEsIG9mZnNldCtpKjIpKTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cInRSTlNcIikge1xuXHRcdFx0aWYgICAgIChvdXQuY3R5cGU9PTMpIG91dC50YWJzW3R5cGVdID0gYmluLnJlYWRCeXRlcyhkYXRhLCBvZmZzZXQsIGxlbik7XG5cdFx0XHRlbHNlIGlmKG91dC5jdHlwZT09MCkgb3V0LnRhYnNbdHlwZV0gPSByVXMoZGF0YSwgb2Zmc2V0KTtcblx0XHRcdGVsc2UgaWYob3V0LmN0eXBlPT0yKSBvdXQudGFic1t0eXBlXSA9IFsgclVzKGRhdGEsb2Zmc2V0KSxyVXMoZGF0YSxvZmZzZXQrMiksclVzKGRhdGEsb2Zmc2V0KzQpIF07XG5cdFx0XHQvL2Vsc2UgY29uc29sZS5sb2coXCJ0Uk5TIGZvciB1bnN1cHBvcnRlZCBjb2xvciB0eXBlXCIsb3V0LmN0eXBlLCBsZW4pO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiZ0FNQVwiKSBvdXQudGFic1t0eXBlXSA9IGJpbi5yZWFkVWludChkYXRhLCBvZmZzZXQpLzEwMDAwMDtcblx0XHRlbHNlIGlmKHR5cGU9PVwic1JHQlwiKSBvdXQudGFic1t0eXBlXSA9IGRhdGFbb2Zmc2V0XTtcblx0XHRlbHNlIGlmKHR5cGU9PVwiYktHRFwiKVxuXHRcdHtcblx0XHRcdGlmICAgICAob3V0LmN0eXBlPT0wIHx8IG91dC5jdHlwZT09NCkgb3V0LnRhYnNbdHlwZV0gPSBbclVzKGRhdGEsIG9mZnNldCldO1xuXHRcdFx0ZWxzZSBpZihvdXQuY3R5cGU9PTIgfHwgb3V0LmN0eXBlPT02KSBvdXQudGFic1t0eXBlXSA9IFtyVXMoZGF0YSwgb2Zmc2V0KSwgclVzKGRhdGEsIG9mZnNldCsyKSwgclVzKGRhdGEsIG9mZnNldCs0KV07XG5cdFx0XHRlbHNlIGlmKG91dC5jdHlwZT09Mykgb3V0LnRhYnNbdHlwZV0gPSBkYXRhW29mZnNldF07XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJJRU5EXCIpIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHQvL2Vsc2UgeyAgbG9nKFwidW5rbm93biBjaHVuayB0eXBlXCIsIHR5cGUsIGxlbik7ICB9XG5cdFx0b2Zmc2V0ICs9IGxlbjtcblx0XHR2YXIgY3JjID0gYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCk7ICBvZmZzZXQgKz0gNDtcblx0fVxuXHRpZihmb2ZmIT0wKSB7ICB2YXIgZnIgPSBvdXQuZnJhbWVzW291dC5mcmFtZXMubGVuZ3RoLTFdO1xuXHRcdGZyLmRhdGEgPSBVUE5HLmRlY29kZS5fZGVjb21wcmVzcyhvdXQsIGZkLnNsaWNlKDAsZm9mZiksIGZyLnJlY3Qud2lkdGgsIGZyLnJlY3QuaGVpZ2h0KTsgIGZvZmY9MDtcblx0fVx0XG5cdG91dC5kYXRhID0gVVBORy5kZWNvZGUuX2RlY29tcHJlc3Mob3V0LCBkZCwgb3V0LndpZHRoLCBvdXQuaGVpZ2h0KTtcblx0XG5cdGRlbGV0ZSBvdXQuY29tcHJlc3M7ICBkZWxldGUgb3V0LmludGVybGFjZTsgIGRlbGV0ZSBvdXQuZmlsdGVyO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5VUE5HLmRlY29kZS5fZGVjb21wcmVzcyA9IGZ1bmN0aW9uKG91dCwgZGQsIHcsIGgpIHtcblx0dmFyIHRpbWUgPSBEYXRlLm5vdygpO1xuXHR2YXIgYnBwID0gVVBORy5kZWNvZGUuX2dldEJQUChvdXQpLCBicGwgPSBNYXRoLmNlaWwodypicHAvOCksIGJ1ZmYgPSBuZXcgVWludDhBcnJheSgoYnBsKzErb3V0LmludGVybGFjZSkqaCk7XG5cdGRkID0gVVBORy5kZWNvZGUuX2luZmxhdGUoZGQsYnVmZik7XG5cdC8vY29uc29sZS5sb2coZGQubGVuZ3RoLCBidWZmLmxlbmd0aCk7XG5cdC8vY29uc29sZS5sb2coRGF0ZS5ub3coKS10aW1lKTtcblxuXHR2YXIgdGltZT1EYXRlLm5vdygpO1xuXHRpZiAgICAgKG91dC5pbnRlcmxhY2U9PTApIGRkID0gVVBORy5kZWNvZGUuX2ZpbHRlclplcm8oZGQsIG91dCwgMCwgdywgaCk7XG5cdGVsc2UgaWYob3V0LmludGVybGFjZT09MSkgZGQgPSBVUE5HLmRlY29kZS5fcmVhZEludGVybGFjZShkZCwgb3V0KTtcblx0Ly9jb25zb2xlLmxvZyhEYXRlLm5vdygpLXRpbWUpO1xuXHRyZXR1cm4gZGQ7XG59XG5cblVQTkcuZGVjb2RlLl9pbmZsYXRlID0gZnVuY3Rpb24oZGF0YSwgYnVmZikgeyAgdmFyIG91dD1VUE5HW1wiaW5mbGF0ZVJhd1wiXShuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlciwgMixkYXRhLmxlbmd0aC02KSxidWZmKTsgIHJldHVybiBvdXQ7ICB9XG5VUE5HLmluZmxhdGVSYXc9ZnVuY3Rpb24oKXt2YXIgSD17fTtILkg9e307SC5ILk49ZnVuY3Rpb24oTixXKXt2YXIgUj1VaW50OEFycmF5LGk9MCxtPTAsSj0wLGg9MCxRPTAsWD0wLHU9MCx3PTAsZD0wLHYsQztcbmlmKE5bMF09PTMmJk5bMV09PTApcmV0dXJuIFc/VzpuZXcgUigwKTt2YXIgVj1ILkgsbj1WLmIsQT1WLmUsbD1WLlIsTT1WLm4sST1WLkEsZT1WLlosYj1WLm0sWj1XPT1udWxsO1xuaWYoWilXPW5ldyBSKE4ubGVuZ3RoPj4+Mjw8Myk7d2hpbGUoaT09MCl7aT1uKE4sZCwxKTttPW4oTixkKzEsMik7ZCs9MztpZihtPT0wKXtpZigoZCY3KSE9MClkKz04LShkJjcpO1xudmFyIEQ9KGQ+Pj4zKSs0LHE9TltELTRdfE5bRC0zXTw8ODtpZihaKVc9SC5ILlcoVyx3K3EpO1cuc2V0KG5ldyBSKE4uYnVmZmVyLE4uYnl0ZU9mZnNldCtELHEpLHcpO2Q9RCtxPDwzO1xudys9cTtjb250aW51ZX1pZihaKVc9SC5ILlcoVyx3KygxPDwxNykpO2lmKG09PTEpe3Y9Yi5KO0M9Yi5oO1g9KDE8PDkpLTE7dT0oMTw8NSktMX1pZihtPT0yKXtKPUEoTixkLDUpKzI1Nztcbmg9QShOLGQrNSw1KSsxO1E9QShOLGQrMTAsNCkrNDtkKz0xNDt2YXIgRT1kLGo9MTtmb3IodmFyIGM9MDtjPDM4O2MrPTIpe2IuUVtjXT0wO2IuUVtjKzFdPTB9Zm9yKHZhciBjPTA7XG5jPFE7YysrKXt2YXIgSz1BKE4sZCtjKjMsMyk7Yi5RWyhiLlhbY108PDEpKzFdPUs7aWYoSz5qKWo9S31kKz0zKlE7TShiLlEsaik7SShiLlEsaixiLnUpO3Y9Yi53O0M9Yi5kO1xuZD1sKGIudSwoMTw8aiktMSxKK2gsTixkLGIudik7dmFyIHI9Vi5WKGIudiwwLEosYi5DKTtYPSgxPDxyKS0xO3ZhciBTPVYuVihiLnYsSixoLGIuRCk7dT0oMTw8UyktMTtNKGIuQyxyKTtcbkkoYi5DLHIsdik7TShiLkQsUyk7SShiLkQsUyxDKX13aGlsZSghMCl7dmFyIFQ9dltlKE4sZCkmWF07ZCs9VCYxNTt2YXIgcD1UPj4+NDtpZihwPj4+OD09MCl7V1t3KytdPXB9ZWxzZSBpZihwPT0yNTYpe2JyZWFrfWVsc2V7dmFyIHo9dytwLTI1NDtcbmlmKHA+MjY0KXt2YXIgXz1iLnFbcC0yNTddO3o9dysoXz4+PjMpK0EoTixkLF8mNyk7ZCs9XyY3fXZhciAkPUNbZShOLGQpJnVdO2QrPSQmMTU7dmFyIHM9JD4+PjQsWT1iLmNbc10sYT0oWT4+PjQpK24oTixkLFkmMTUpO1xuZCs9WSYxNTt3aGlsZSh3PHope1dbd109V1t3KystYV07V1t3XT1XW3crKy1hXTtXW3ddPVdbdysrLWFdO1dbd109V1t3KystYV19dz16fX19cmV0dXJuIFcubGVuZ3RoPT13P1c6Vy5zbGljZSgwLHcpfTtcbkguSC5XPWZ1bmN0aW9uKE4sVyl7dmFyIFI9Ti5sZW5ndGg7aWYoVzw9UilyZXR1cm4gTjt2YXIgVj1uZXcgVWludDhBcnJheShSPDwxKTtWLnNldChOLDApO3JldHVybiBWfTtcbkguSC5SPWZ1bmN0aW9uKE4sVyxSLFYsbixBKXt2YXIgbD1ILkguZSxNPUguSC5aLEk9MDt3aGlsZShJPFIpe3ZhciBlPU5bTShWLG4pJlddO24rPWUmMTU7dmFyIGI9ZT4+PjQ7XG5pZihiPD0xNSl7QVtJXT1iO0krK31lbHNle3ZhciBaPTAsbT0wO2lmKGI9PTE2KXttPTMrbChWLG4sMik7bis9MjtaPUFbSS0xXX1lbHNlIGlmKGI9PTE3KXttPTMrbChWLG4sMyk7XG5uKz0zfWVsc2UgaWYoYj09MTgpe209MTErbChWLG4sNyk7bis9N312YXIgSj1JK207d2hpbGUoSTxKKXtBW0ldPVo7SSsrfX19cmV0dXJuIG59O0guSC5WPWZ1bmN0aW9uKE4sVyxSLFYpe3ZhciBuPTAsQT0wLGw9Vi5sZW5ndGg+Pj4xO1xud2hpbGUoQTxSKXt2YXIgTT1OW0ErV107VltBPDwxXT0wO1ZbKEE8PDEpKzFdPU07aWYoTT5uKW49TTtBKyt9d2hpbGUoQTxsKXtWW0E8PDFdPTA7VlsoQTw8MSkrMV09MDtBKyt9cmV0dXJuIG59O1xuSC5ILm49ZnVuY3Rpb24oTixXKXt2YXIgUj1ILkgubSxWPU4ubGVuZ3RoLG4sQSxsLE0sSSxlPVIuajtmb3IodmFyIE09MDtNPD1XO00rKyllW01dPTA7Zm9yKE09MTtNPFY7TSs9MillW05bTV1dKys7XG52YXIgYj1SLks7bj0wO2VbMF09MDtmb3IoQT0xO0E8PVc7QSsrKXtuPW4rZVtBLTFdPDwxO2JbQV09bn1mb3IobD0wO2w8VjtsKz0yKXtJPU5bbCsxXTtpZihJIT0wKXtOW2xdPWJbSV07XG5iW0ldKyt9fX07SC5ILkE9ZnVuY3Rpb24oTixXLFIpe3ZhciBWPU4ubGVuZ3RoLG49SC5ILm0sQT1uLnI7Zm9yKHZhciBsPTA7bDxWO2wrPTIpaWYoTltsKzFdIT0wKXt2YXIgTT1sPj4xLEk9TltsKzFdLGU9TTw8NHxJLGI9Vy1JLFo9TltsXTw8YixtPVorKDE8PGIpO1xud2hpbGUoWiE9bSl7dmFyIEo9QVtaXT4+PjE1LVc7UltKXT1lO1orK319fTtILkgubD1mdW5jdGlvbihOLFcpe3ZhciBSPUguSC5tLnIsVj0xNS1XO2Zvcih2YXIgbj0wO248Ti5sZW5ndGg7XG5uKz0yKXt2YXIgQT1OW25dPDxXLU5bbisxXTtOW25dPVJbQV0+Pj5WfX07SC5ILk09ZnVuY3Rpb24oTixXLFIpe1I9Ujw8KFcmNyk7dmFyIFY9Vz4+PjM7TltWXXw9UjtOW1YrMV18PVI+Pj44fTtcbkguSC5JPWZ1bmN0aW9uKE4sVyxSKXtSPVI8PChXJjcpO3ZhciBWPVc+Pj4zO05bVl18PVI7TltWKzFdfD1SPj4+ODtOW1YrMl18PVI+Pj4xNn07SC5ILmU9ZnVuY3Rpb24oTixXLFIpe3JldHVybihOW1c+Pj4zXXxOWyhXPj4+MykrMV08PDgpPj4+KFcmNykmKDE8PFIpLTF9O1xuSC5ILmI9ZnVuY3Rpb24oTixXLFIpe3JldHVybihOW1c+Pj4zXXxOWyhXPj4+MykrMV08PDh8TlsoVz4+PjMpKzJdPDwxNik+Pj4oVyY3KSYoMTw8UiktMX07SC5ILlo9ZnVuY3Rpb24oTixXKXtyZXR1cm4oTltXPj4+M118TlsoVz4+PjMpKzFdPDw4fE5bKFc+Pj4zKSsyXTw8MTYpPj4+KFcmNyl9O1xuSC5ILmk9ZnVuY3Rpb24oTixXKXtyZXR1cm4oTltXPj4+M118TlsoVz4+PjMpKzFdPDw4fE5bKFc+Pj4zKSsyXTw8MTZ8TlsoVz4+PjMpKzNdPDwyNCk+Pj4oVyY3KX07SC5ILm09ZnVuY3Rpb24oKXt2YXIgTj1VaW50MTZBcnJheSxXPVVpbnQzMkFycmF5O1xucmV0dXJue0s6bmV3IE4oMTYpLGo6bmV3IE4oMTYpLFg6WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLFM6WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsOTk5LDk5OSw5OTldLFQ6WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMCwwLDAsMF0scTpuZXcgTigzMikscDpbMSwyLDMsNCw1LDcsOSwxMywxNywyNSwzMyw0OSw2NSw5NywxMjksMTkzLDI1NywzODUsNTEzLDc2OSwxMDI1LDE1MzcsMjA0OSwzMDczLDQwOTcsNjE0NSw4MTkzLDEyMjg5LDE2Mzg1LDI0NTc3LDY1NTM1LDY1NTM1XSx6OlswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzLDAsMF0sYzpuZXcgVygzMiksSjpuZXcgTig1MTIpLF86W10saDpuZXcgTigzMiksJDpbXSx3Om5ldyBOKDMyNzY4KSxDOltdLHY6W10sZDpuZXcgTigzMjc2OCksRDpbXSx1Om5ldyBOKDUxMiksUTpbXSxyOm5ldyBOKDE8PDE1KSxzOm5ldyBXKDI4NiksWTpuZXcgVygzMCksYTpuZXcgVygxOSksdDpuZXcgVygxNWUzKSxrOm5ldyBOKDE8PDE2KSxnOm5ldyBOKDE8PDE1KX19KCk7XG4oZnVuY3Rpb24oKXt2YXIgTj1ILkgubSxXPTE8PDE1O2Zvcih2YXIgUj0wO1I8VztSKyspe3ZhciBWPVI7Vj0oViYyODYzMzExNTMwKT4+PjF8KFYmMTQzMTY1NTc2NSk8PDE7XG5WPShWJjM0MzU5NzM4MzYpPj4+MnwoViY4NTg5OTM0NTkpPDwyO1Y9KFYmNDA0MjMyMjE2MCk+Pj40fChWJjI1MjY0NTEzNSk8PDQ7Vj0oViY0Mjc4MjU1MzYwKT4+Pjh8KFYmMTY3MTE5MzUpPDw4O1xuTi5yW1JdPShWPj4+MTZ8Vjw8MTYpPj4+MTd9ZnVuY3Rpb24gbihBLGwsTSl7d2hpbGUobC0tIT0wKUEucHVzaCgwLE0pfWZvcih2YXIgUj0wO1I8MzI7UisrKXtOLnFbUl09Ti5TW1JdPDwzfE4uVFtSXTtcbk4uY1tSXT1OLnBbUl08PDR8Ti56W1JdfW4oTi5fLDE0NCw4KTtuKE4uXywyNTUtMTQzLDkpO24oTi5fLDI3OS0yNTUsNyk7bihOLl8sMjg3LTI3OSw4KTtILkgubihOLl8sOSk7XG5ILkguQShOLl8sOSxOLkopO0guSC5sKE4uXyw5KTtuKE4uJCwzMiw1KTtILkgubihOLiQsNSk7SC5ILkEoTi4kLDUsTi5oKTtILkgubChOLiQsNSk7bihOLlEsMTksMCk7bihOLkMsMjg2LDApO1xubihOLkQsMzAsMCk7bihOLnYsMzIwLDApfSgpKTtyZXR1cm4gSC5ILk59KClcblxuXG5VUE5HLmRlY29kZS5fcmVhZEludGVybGFjZSA9IGZ1bmN0aW9uKGRhdGEsIG91dClcbntcblx0dmFyIHcgPSBvdXQud2lkdGgsIGggPSBvdXQuaGVpZ2h0O1xuXHR2YXIgYnBwID0gVVBORy5kZWNvZGUuX2dldEJQUChvdXQpLCBjYnBwID0gYnBwPj4zLCBicGwgPSBNYXRoLmNlaWwodypicHAvOCk7XG5cdHZhciBpbWcgPSBuZXcgVWludDhBcnJheSggaCAqIGJwbCApO1xuXHR2YXIgZGkgPSAwO1xuXG5cdHZhciBzdGFydGluZ19yb3cgID0gWyAwLCAwLCA0LCAwLCAyLCAwLCAxIF07XG5cdHZhciBzdGFydGluZ19jb2wgID0gWyAwLCA0LCAwLCAyLCAwLCAxLCAwIF07XG5cdHZhciByb3dfaW5jcmVtZW50ID0gWyA4LCA4LCA4LCA0LCA0LCAyLCAyIF07XG5cdHZhciBjb2xfaW5jcmVtZW50ID0gWyA4LCA4LCA0LCA0LCAyLCAyLCAxIF07XG5cblx0dmFyIHBhc3M9MDtcblx0d2hpbGUocGFzczw3KVxuXHR7XG5cdFx0dmFyIHJpID0gcm93X2luY3JlbWVudFtwYXNzXSwgY2kgPSBjb2xfaW5jcmVtZW50W3Bhc3NdO1xuXHRcdHZhciBzdyA9IDAsIHNoID0gMDtcblx0XHR2YXIgY3IgPSBzdGFydGluZ19yb3dbcGFzc107ICB3aGlsZShjcjxoKSB7ICBjcis9cmk7ICBzaCsrOyAgfVxuXHRcdHZhciBjYyA9IHN0YXJ0aW5nX2NvbFtwYXNzXTsgIHdoaWxlKGNjPHcpIHsgIGNjKz1jaTsgIHN3Kys7ICB9XG5cdFx0dmFyIGJwbGwgPSBNYXRoLmNlaWwoc3cqYnBwLzgpO1xuXHRcdFVQTkcuZGVjb2RlLl9maWx0ZXJaZXJvKGRhdGEsIG91dCwgZGksIHN3LCBzaCk7XG5cblx0XHR2YXIgeT0wLCByb3cgPSBzdGFydGluZ19yb3dbcGFzc107XG5cdFx0d2hpbGUocm93PGgpXG5cdFx0e1xuXHRcdFx0dmFyIGNvbCA9IHN0YXJ0aW5nX2NvbFtwYXNzXTtcblx0XHRcdHZhciBjZGkgPSAoZGkreSpicGxsKTw8MztcblxuXHRcdFx0d2hpbGUoY29sPHcpXG5cdFx0XHR7XG5cdFx0XHRcdGlmKGJwcD09MSkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBkYXRhW2NkaT4+M107ICB2YWwgPSAodmFsPj4oNy0oY2RpJjcpKSkmMTtcblx0XHRcdFx0XHRpbWdbcm93KmJwbCArIChjb2w+PjMpXSB8PSAodmFsIDw8ICg3LSgoY29sJjcpPDwwKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKGJwcD09Mikge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBkYXRhW2NkaT4+M107ICB2YWwgPSAodmFsPj4oNi0oY2RpJjcpKSkmMztcblx0XHRcdFx0XHRpbWdbcm93KmJwbCArIChjb2w+PjIpXSB8PSAodmFsIDw8ICg2LSgoY29sJjMpPDwxKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKGJwcD09NCkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBkYXRhW2NkaT4+M107ICB2YWwgPSAodmFsPj4oNC0oY2RpJjcpKSkmMTU7XG5cdFx0XHRcdFx0aW1nW3JvdypicGwgKyAoY29sPj4xKV0gfD0gKHZhbCA8PCAoNC0oKGNvbCYxKTw8MikpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihicHA+PTgpIHtcblx0XHRcdFx0XHR2YXIgaWkgPSByb3cqYnBsK2NvbCpjYnBwO1xuXHRcdFx0XHRcdGZvcih2YXIgaj0wOyBqPGNicHA7IGorKykgaW1nW2lpK2pdID0gZGF0YVsoY2RpPj4zKStqXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjZGkrPWJwcDsgIGNvbCs9Y2k7XG5cdFx0XHR9XG5cdFx0XHR5Kys7ICByb3cgKz0gcmk7XG5cdFx0fVxuXHRcdGlmKHN3KnNoIT0wKSBkaSArPSBzaCAqICgxICsgYnBsbCk7XG5cdFx0cGFzcyA9IHBhc3MgKyAxO1xuXHR9XG5cdHJldHVybiBpbWc7XG59XG5cblVQTkcuZGVjb2RlLl9nZXRCUFAgPSBmdW5jdGlvbihvdXQpIHtcblx0dmFyIG5vYyA9IFsxLG51bGwsMywxLDIsbnVsbCw0XVtvdXQuY3R5cGVdO1xuXHRyZXR1cm4gbm9jICogb3V0LmRlcHRoO1xufVxuXG5VUE5HLmRlY29kZS5fZmlsdGVyWmVybyA9IGZ1bmN0aW9uKGRhdGEsIG91dCwgb2ZmLCB3LCBoKVxue1xuXHR2YXIgYnBwID0gVVBORy5kZWNvZGUuX2dldEJQUChvdXQpLCBicGwgPSBNYXRoLmNlaWwodypicHAvOCksIHBhZXRoID0gVVBORy5kZWNvZGUuX3BhZXRoO1xuXHRicHAgPSBNYXRoLmNlaWwoYnBwLzgpO1xuXHRcblx0dmFyIGk9MCwgZGk9MSwgdHlwZT1kYXRhW29mZl0sIHg9MDtcblx0XG5cdGlmKHR5cGU+MSkgZGF0YVtvZmZdPVswLDAsMV1bdHlwZS0yXTsgIFxuXHRpZih0eXBlPT0zKSBmb3IoeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbeCsxXSA9IChkYXRhW3grMV0gKyAoZGF0YVt4KzEtYnBwXT4+PjEpICkmMjU1O1xuXG5cdGZvcih2YXIgeT0wOyB5PGg7IHkrKykgIHtcblx0XHRpID0gb2ZmK3kqYnBsOyBkaSA9IGkreSsxO1xuXHRcdHR5cGUgPSBkYXRhW2RpLTFdOyB4PTA7XG5cblx0XHRpZiAgICAgKHR5cGU9PTApICAgZm9yKDsgeDxicGw7IHgrKykgZGF0YVtpK3hdID0gZGF0YVtkaSt4XTtcblx0XHRlbHNlIGlmKHR5cGU9PTEpIHsgZm9yKDsgeDxicHA7IHgrKykgZGF0YVtpK3hdID0gZGF0YVtkaSt4XTtcblx0XHRcdFx0XHRcdCAgIGZvcig7IHg8YnBsOyB4KyspIGRhdGFbaSt4XSA9IChkYXRhW2RpK3hdICsgZGF0YVtpK3gtYnBwXSk7ICB9XG5cdFx0ZWxzZSBpZih0eXBlPT0yKSB7IGZvcig7IHg8YnBsOyB4KyspIGRhdGFbaSt4XSA9IChkYXRhW2RpK3hdICsgZGF0YVtpK3gtYnBsXSk7ICB9XG5cdFx0ZWxzZSBpZih0eXBlPT0zKSB7IGZvcig7IHg8YnBwOyB4KyspIGRhdGFbaSt4XSA9IChkYXRhW2RpK3hdICsgKCBkYXRhW2kreC1icGxdPj4+MSkpO1xuXHRcdFx0ICAgICAgICAgICAgICAgZm9yKDsgeDxicGw7IHgrKykgZGF0YVtpK3hdID0gKGRhdGFbZGkreF0gKyAoKGRhdGFbaSt4LWJwbF0rZGF0YVtpK3gtYnBwXSk+Pj4xKSApOyAgfVxuXHRcdGVsc2UgICAgICAgICAgICAgeyBmb3IoOyB4PGJwcDsgeCsrKSBkYXRhW2kreF0gPSAoZGF0YVtkaSt4XSArIHBhZXRoKDAsIGRhdGFbaSt4LWJwbF0sIDApKTtcblx0XHRcdFx0XHRcdCAgIGZvcig7IHg8YnBsOyB4KyspIGRhdGFbaSt4XSA9IChkYXRhW2RpK3hdICsgcGFldGgoZGF0YVtpK3gtYnBwXSwgZGF0YVtpK3gtYnBsXSwgZGF0YVtpK3gtYnBwLWJwbF0pICk7ICB9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cblVQTkcuZGVjb2RlLl9wYWV0aCA9IGZ1bmN0aW9uKGEsYixjKVxue1xuXHR2YXIgcCA9IGErYi1jLCBwYSA9IChwLWEpLCBwYiA9IChwLWIpLCBwYyA9IChwLWMpO1xuXHRpZiAocGEqcGEgPD0gcGIqcGIgJiYgcGEqcGEgPD0gcGMqcGMpICByZXR1cm4gYTtcblx0ZWxzZSBpZiAocGIqcGIgPD0gcGMqcGMpICByZXR1cm4gYjtcblx0cmV0dXJuIGM7XG59XG5cblVQTkcuZGVjb2RlLl9JSERSID0gZnVuY3Rpb24oZGF0YSwgb2Zmc2V0LCBvdXQpXG57XG5cdHZhciBiaW4gPSBVUE5HLl9iaW47XG5cdG91dC53aWR0aCAgPSBiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KTsgIG9mZnNldCArPSA0O1xuXHRvdXQuaGVpZ2h0ID0gYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCk7ICBvZmZzZXQgKz0gNDtcblx0b3V0LmRlcHRoICAgICA9IGRhdGFbb2Zmc2V0XTsgIG9mZnNldCsrO1xuXHRvdXQuY3R5cGUgICAgID0gZGF0YVtvZmZzZXRdOyAgb2Zmc2V0Kys7XG5cdG91dC5jb21wcmVzcyAgPSBkYXRhW29mZnNldF07ICBvZmZzZXQrKztcblx0b3V0LmZpbHRlciAgICA9IGRhdGFbb2Zmc2V0XTsgIG9mZnNldCsrO1xuXHRvdXQuaW50ZXJsYWNlID0gZGF0YVtvZmZzZXRdOyAgb2Zmc2V0Kys7XG59XG5cblVQTkcuX2JpbiA9IHtcblx0bmV4dFplcm8gICA6IGZ1bmN0aW9uKGRhdGEscCkgIHsgIHdoaWxlKGRhdGFbcF0hPTApIHArKzsgIHJldHVybiBwOyAgfSxcblx0cmVhZFVzaG9ydCA6IGZ1bmN0aW9uKGJ1ZmYscCkgIHsgIHJldHVybiAoYnVmZltwXTw8IDgpIHwgYnVmZltwKzFdOyAgfSxcblx0d3JpdGVVc2hvcnQ6IGZ1bmN0aW9uKGJ1ZmYscCxuKXsgIGJ1ZmZbcF0gPSAobj4+OCkmMjU1OyAgYnVmZltwKzFdID0gbiYyNTU7ICB9LFxuXHRyZWFkVWludCAgIDogZnVuY3Rpb24oYnVmZixwKSAgeyAgcmV0dXJuIChidWZmW3BdKigyNTYqMjU2KjI1NikpICsgKChidWZmW3ArMV08PDE2KSB8IChidWZmW3ArMl08PCA4KSB8IGJ1ZmZbcCszXSk7ICB9LFxuXHR3cml0ZVVpbnQgIDogZnVuY3Rpb24oYnVmZixwLG4peyAgYnVmZltwXT0obj4+MjQpJjI1NTsgIGJ1ZmZbcCsxXT0obj4+MTYpJjI1NTsgIGJ1ZmZbcCsyXT0obj4+OCkmMjU1OyAgYnVmZltwKzNdPW4mMjU1OyAgfSxcblx0cmVhZEFTQ0lJICA6IGZ1bmN0aW9uKGJ1ZmYscCxsKXsgIHZhciBzID0gXCJcIjsgIGZvcih2YXIgaT0wOyBpPGw7IGkrKykgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZmZbcCtpXSk7ICByZXR1cm4gczsgICAgfSxcblx0d3JpdGVBU0NJSSA6IGZ1bmN0aW9uKGRhdGEscCxzKXsgIGZvcih2YXIgaT0wOyBpPHMubGVuZ3RoOyBpKyspIGRhdGFbcCtpXSA9IHMuY2hhckNvZGVBdChpKTsgIH0sXG5cdHJlYWRCeXRlcyAgOiBmdW5jdGlvbihidWZmLHAsbCl7ICB2YXIgYXJyID0gW107ICAgZm9yKHZhciBpPTA7IGk8bDsgaSsrKSBhcnIucHVzaChidWZmW3AraV0pOyAgIHJldHVybiBhcnI7ICB9LFxuXHRwYWQgOiBmdW5jdGlvbihuKSB7IHJldHVybiBuLmxlbmd0aCA8IDIgPyBcIjBcIiArIG4gOiBuOyB9LFxuXHRyZWFkVVRGOCA6IGZ1bmN0aW9uKGJ1ZmYsIHAsIGwpIHtcblx0XHR2YXIgcyA9IFwiXCIsIG5zO1xuXHRcdGZvcih2YXIgaT0wOyBpPGw7IGkrKykgcyArPSBcIiVcIiArIFVQTkcuX2Jpbi5wYWQoYnVmZltwK2ldLnRvU3RyaW5nKDE2KSk7XG5cdFx0dHJ5IHsgIG5zID0gZGVjb2RlVVJJQ29tcG9uZW50KHMpOyB9XG5cdFx0Y2F0Y2goZSkgeyAgcmV0dXJuIFVQTkcuX2Jpbi5yZWFkQVNDSUkoYnVmZiwgcCwgbCk7ICB9XG5cdFx0cmV0dXJuICBucztcblx0fVxufVxuVVBORy5fY29weVRpbGUgPSBmdW5jdGlvbihzYiwgc3csIHNoLCB0YiwgdHcsIHRoLCB4b2ZmLCB5b2ZmLCBtb2RlKVxue1xuXHR2YXIgdyA9IE1hdGgubWluKHN3LHR3KSwgaCA9IE1hdGgubWluKHNoLHRoKTtcblx0dmFyIHNpPTAsIHRpPTA7XG5cdGZvcih2YXIgeT0wOyB5PGg7IHkrKylcblx0XHRmb3IodmFyIHg9MDsgeDx3OyB4KyspXG5cdFx0e1xuXHRcdFx0aWYoeG9mZj49MCAmJiB5b2ZmPj0wKSB7ICBzaSA9ICh5KnN3K3gpPDwyOyAgdGkgPSAoKCB5b2ZmK3kpKnR3K3hvZmYreCk8PDI7ICB9XG5cdFx0XHRlbHNlICAgICAgICAgICAgICAgICAgIHsgIHNpID0gKCgteW9mZit5KSpzdy14b2ZmK3gpPDwyOyAgdGkgPSAoeSp0dyt4KTw8MjsgIH1cblx0XHRcdFxuXHRcdFx0aWYgICAgIChtb2RlPT0wKSB7ICB0Ylt0aV0gPSBzYltzaV07ICB0Ylt0aSsxXSA9IHNiW3NpKzFdOyAgdGJbdGkrMl0gPSBzYltzaSsyXTsgIHRiW3RpKzNdID0gc2Jbc2krM107ICB9XG5cdFx0XHRlbHNlIGlmKG1vZGU9PTEpIHtcblx0XHRcdFx0dmFyIGZhID0gc2Jbc2krM10qKDEvMjU1KSwgZnI9c2Jbc2ldKmZhLCBmZz1zYltzaSsxXSpmYSwgZmI9c2Jbc2krMl0qZmE7IFxuXHRcdFx0XHR2YXIgYmEgPSB0Ylt0aSszXSooMS8yNTUpLCBicj10Ylt0aV0qYmEsIGJnPXRiW3RpKzFdKmJhLCBiYj10Ylt0aSsyXSpiYTsgXG5cdFx0XHRcdFxuXHRcdFx0XHR2YXIgaWZhPTEtZmEsIG9hID0gZmErYmEqaWZhLCBpb2EgPSAob2E9PTA/MDoxL29hKTtcblx0XHRcdFx0dGJbdGkrM10gPSAyNTUqb2E7ICBcblx0XHRcdFx0dGJbdGkrMF0gPSAoZnIrYnIqaWZhKSppb2E7ICBcblx0XHRcdFx0dGJbdGkrMV0gPSAoZmcrYmcqaWZhKSppb2E7ICAgXG5cdFx0XHRcdHRiW3RpKzJdID0gKGZiK2JiKmlmYSkqaW9hOyAgXG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKG1vZGU9PTIpe1x0Ly8gY29weSBvbmx5IGRpZmZlcmVuY2VzLCBvdGhlcndpc2UgemVyb1xuXHRcdFx0XHR2YXIgZmEgPSBzYltzaSszXSwgZnI9c2Jbc2ldLCBmZz1zYltzaSsxXSwgZmI9c2Jbc2krMl07IFxuXHRcdFx0XHR2YXIgYmEgPSB0Ylt0aSszXSwgYnI9dGJbdGldLCBiZz10Ylt0aSsxXSwgYmI9dGJbdGkrMl07IFxuXHRcdFx0XHRpZihmYT09YmEgJiYgZnI9PWJyICYmIGZnPT1iZyAmJiBmYj09YmIpIHsgIHRiW3RpXT0wOyAgdGJbdGkrMV09MDsgIHRiW3RpKzJdPTA7ICB0Ylt0aSszXT0wOyAgfVxuXHRcdFx0XHRlbHNlIHsgIHRiW3RpXT1mcjsgIHRiW3RpKzFdPWZnOyAgdGJbdGkrMl09ZmI7ICB0Ylt0aSszXT1mYTsgIH1cblx0XHRcdH1cblx0XHRcdGVsc2UgaWYobW9kZT09Myl7XHQvLyBjaGVjayBpZiBjYW4gYmUgYmxlbmRlZFxuXHRcdFx0XHR2YXIgZmEgPSBzYltzaSszXSwgZnI9c2Jbc2ldLCBmZz1zYltzaSsxXSwgZmI9c2Jbc2krMl07IFxuXHRcdFx0XHR2YXIgYmEgPSB0Ylt0aSszXSwgYnI9dGJbdGldLCBiZz10Ylt0aSsxXSwgYmI9dGJbdGkrMl07IFxuXHRcdFx0XHRpZihmYT09YmEgJiYgZnI9PWJyICYmIGZnPT1iZyAmJiBmYj09YmIpIGNvbnRpbnVlO1xuXHRcdFx0XHQvL2lmKGZhIT0yNTUgJiYgYmEhPTApIHJldHVybiBmYWxzZTtcblx0XHRcdFx0aWYoZmE8MjIwICYmIGJhPjIwKSByZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuXG5cblxuVVBORy5lbmNvZGUgPSBmdW5jdGlvbihidWZzLCB3LCBoLCBwcywgZGVscywgdGFicywgZm9yYmlkUGx0ZSlcbntcblx0aWYocHM9PW51bGwpIHBzPTA7XG5cdGlmKGZvcmJpZFBsdGU9PW51bGwpIGZvcmJpZFBsdGUgPSBmYWxzZTtcblxuXHR2YXIgbmltZyA9IFVQTkcuZW5jb2RlLmNvbXByZXNzKGJ1ZnMsIHcsIGgsIHBzLCBbZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCwgZm9yYmlkUGx0ZV0pO1xuXHRVUE5HLmVuY29kZS5jb21wcmVzc1BORyhuaW1nLCAtMSk7XG5cdFxuXHRyZXR1cm4gVVBORy5lbmNvZGUuX21haW4obmltZywgdywgaCwgZGVscywgdGFicyk7XG59XG5cblVQTkcuZW5jb2RlTEwgPSBmdW5jdGlvbihidWZzLCB3LCBoLCBjYywgYWMsIGRlcHRoLCBkZWxzLCB0YWJzKSB7XG5cdHZhciBuaW1nID0geyAgY3R5cGU6IDAgKyAoY2M9PTEgPyAwIDogMikgKyAoYWM9PTAgPyAwIDogNCksICAgICAgZGVwdGg6IGRlcHRoLCAgZnJhbWVzOiBbXSAgfTtcblx0XG5cdHZhciB0aW1lID0gRGF0ZS5ub3coKTtcblx0dmFyIGJpcHAgPSAoY2MrYWMpKmRlcHRoLCBiaXBsID0gYmlwcCAqIHc7XG5cdGZvcih2YXIgaT0wOyBpPGJ1ZnMubGVuZ3RoOyBpKyspXG5cdFx0bmltZy5mcmFtZXMucHVzaCh7ICByZWN0Ont4OjAseTowLHdpZHRoOncsaGVpZ2h0Omh9LCAgaW1nOm5ldyBVaW50OEFycmF5KGJ1ZnNbaV0pLCBibGVuZDowLCBkaXNwb3NlOjEsIGJwcDpNYXRoLmNlaWwoYmlwcC84KSwgYnBsOk1hdGguY2VpbChiaXBsLzgpICB9KTtcblx0XG5cdFVQTkcuZW5jb2RlLmNvbXByZXNzUE5HKG5pbWcsIDAsIHRydWUpO1xuXHRcblx0dmFyIG91dCA9IFVQTkcuZW5jb2RlLl9tYWluKG5pbWcsIHcsIGgsIGRlbHMsIHRhYnMpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5VUE5HLmVuY29kZS5fbWFpbiA9IGZ1bmN0aW9uKG5pbWcsIHcsIGgsIGRlbHMsIHRhYnMpIHtcblx0aWYodGFicz09bnVsbCkgdGFicz17fTtcblx0dmFyIGNyYyA9IFVQTkcuY3JjLmNyYywgd1VpID0gVVBORy5fYmluLndyaXRlVWludCwgd1VzID0gVVBORy5fYmluLndyaXRlVXNob3J0LCB3QXMgPSBVUE5HLl9iaW4ud3JpdGVBU0NJSTtcblx0dmFyIG9mZnNldCA9IDgsIGFuaW0gPSBuaW1nLmZyYW1lcy5sZW5ndGg+MSwgcGx0QWxwaGEgPSBmYWxzZTtcblx0XG5cdHZhciBsZW5nID0gOCArICgxNis1KzQpIC8qKyAoOSs0KSovICsgKGFuaW0gPyAyMCA6IDApO1xuXHRpZih0YWJzW1wic1JHQlwiXSE9bnVsbCkgbGVuZyArPSA4KzErNDtcblx0aWYodGFic1tcInBIWXNcIl0hPW51bGwpIGxlbmcgKz0gOCs5KzQ7XG5cdGlmKG5pbWcuY3R5cGU9PTMpIHtcblx0XHR2YXIgZGwgPSBuaW1nLnBsdGUubGVuZ3RoO1xuXHRcdGZvcih2YXIgaT0wOyBpPGRsOyBpKyspIGlmKChuaW1nLnBsdGVbaV0+Pj4yNCkhPTI1NSkgcGx0QWxwaGEgPSB0cnVlO1xuXHRcdGxlbmcgKz0gKDggKyBkbCozICsgNCkgKyAocGx0QWxwaGEgPyAoOCArIGRsKjEgKyA0KSA6IDApO1xuXHR9XG5cdGZvcih2YXIgaj0wOyBqPG5pbWcuZnJhbWVzLmxlbmd0aDsgaisrKVxuXHR7XG5cdFx0dmFyIGZyID0gbmltZy5mcmFtZXNbal07XG5cdFx0aWYoYW5pbSkgbGVuZyArPSAzODtcblx0XHRsZW5nICs9IGZyLmNpbWcubGVuZ3RoICsgMTI7XG5cdFx0aWYoaiE9MCkgbGVuZys9NDtcblx0fVxuXHRsZW5nICs9IDEyOyBcblx0XG5cdHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkobGVuZyk7XG5cdHZhciB3cj1bMHg4OSwgMHg1MCwgMHg0ZSwgMHg0NywgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYV07XG5cdGZvcih2YXIgaT0wOyBpPDg7IGkrKykgZGF0YVtpXT13cltpXTtcblx0XG5cdHdVaShkYXRhLG9mZnNldCwgMTMpOyAgICAgb2Zmc2V0Kz00O1xuXHR3QXMoZGF0YSxvZmZzZXQsXCJJSERSXCIpOyAgb2Zmc2V0Kz00O1xuXHR3VWkoZGF0YSxvZmZzZXQsdyk7ICBvZmZzZXQrPTQ7XG5cdHdVaShkYXRhLG9mZnNldCxoKTsgIG9mZnNldCs9NDtcblx0ZGF0YVtvZmZzZXRdID0gbmltZy5kZXB0aDsgIG9mZnNldCsrOyAgLy8gZGVwdGhcblx0ZGF0YVtvZmZzZXRdID0gbmltZy5jdHlwZTsgIG9mZnNldCsrOyAgLy8gY3R5cGVcblx0ZGF0YVtvZmZzZXRdID0gMDsgIG9mZnNldCsrOyAgLy8gY29tcHJlc3Ncblx0ZGF0YVtvZmZzZXRdID0gMDsgIG9mZnNldCsrOyAgLy8gZmlsdGVyXG5cdGRhdGFbb2Zmc2V0XSA9IDA7ICBvZmZzZXQrKzsgIC8vIGludGVybGFjZVxuXHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTE3LDE3KSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXG5cdC8vIDEzIGJ5dGVzIHRvIHNheSwgdGhhdCBpdCBpcyBzUkdCXG5cdGlmKHRhYnNbXCJzUkdCXCJdIT1udWxsKSB7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCAxKTsgICAgICBvZmZzZXQrPTQ7XG5cdFx0d0FzKGRhdGEsb2Zmc2V0LFwic1JHQlwiKTsgIG9mZnNldCs9NDtcblx0XHRkYXRhW29mZnNldF0gPSB0YWJzW1wic1JHQlwiXTsgIG9mZnNldCsrO1xuXHRcdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtNSw1KSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXHR9XG5cdGlmKHRhYnNbXCJwSFlzXCJdIT1udWxsKSB7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCA5KTsgICAgICBvZmZzZXQrPTQ7XG5cdFx0d0FzKGRhdGEsb2Zmc2V0LFwicEhZc1wiKTsgIG9mZnNldCs9NDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIHRhYnNbXCJwSFlzXCJdWzBdKTsgICAgICBvZmZzZXQrPTQ7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCB0YWJzW1wicEhZc1wiXVsxXSk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdGRhdGFbb2Zmc2V0XT10YWJzW1wicEhZc1wiXVsyXTtcdFx0XHRvZmZzZXQrKztcblx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTEzLDEzKSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXHR9XG5cblx0aWYoYW5pbSkge1xuXHRcdHdVaShkYXRhLG9mZnNldCwgOCk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdHdBcyhkYXRhLG9mZnNldCxcImFjVExcIik7ICBvZmZzZXQrPTQ7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCBuaW1nLmZyYW1lcy5sZW5ndGgpOyAgICAgb2Zmc2V0Kz00O1xuXHRcdHdVaShkYXRhLG9mZnNldCwgdGFic1tcImxvb3BcIl0hPW51bGw/dGFic1tcImxvb3BcIl06MCk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtMTIsMTIpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cdH1cblxuXHRpZihuaW1nLmN0eXBlPT0zKSB7XG5cdFx0dmFyIGRsID0gbmltZy5wbHRlLmxlbmd0aDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIGRsKjMpOyAgb2Zmc2V0Kz00O1xuXHRcdHdBcyhkYXRhLG9mZnNldCxcIlBMVEVcIik7ICBvZmZzZXQrPTQ7XG5cdFx0Zm9yKHZhciBpPTA7IGk8ZGw7IGkrKyl7XG5cdFx0XHR2YXIgdGk9aSozLCBjPW5pbWcucGx0ZVtpXSwgcj0oYykmMjU1LCBnPShjPj4+OCkmMjU1LCBiPShjPj4+MTYpJjI1NTtcblx0XHRcdGRhdGFbb2Zmc2V0K3RpKzBdPXI7ICBkYXRhW29mZnNldCt0aSsxXT1nOyAgZGF0YVtvZmZzZXQrdGkrMl09Yjtcblx0XHR9XG5cdFx0b2Zmc2V0Kz1kbCozO1xuXHRcdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtZGwqMy00LGRsKjMrNCkpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblxuXHRcdGlmKHBsdEFscGhhKSB7XG5cdFx0XHR3VWkoZGF0YSxvZmZzZXQsIGRsKTsgIG9mZnNldCs9NDtcblx0XHRcdHdBcyhkYXRhLG9mZnNldCxcInRSTlNcIik7ICBvZmZzZXQrPTQ7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTxkbDsgaSsrKSAgZGF0YVtvZmZzZXQraV09KG5pbWcucGx0ZVtpXT4+PjI0KSYyNTU7XG5cdFx0XHRvZmZzZXQrPWRsO1xuXHRcdFx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC1kbC00LGRsKzQpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cdFx0fVxuXHR9XG5cdFxuXHR2YXIgZmkgPSAwO1xuXHRmb3IodmFyIGo9MDsgajxuaW1nLmZyYW1lcy5sZW5ndGg7IGorKylcblx0e1xuXHRcdHZhciBmciA9IG5pbWcuZnJhbWVzW2pdO1xuXHRcdGlmKGFuaW0pIHtcblx0XHRcdHdVaShkYXRhLCBvZmZzZXQsIDI2KTsgICAgIG9mZnNldCs9NDtcblx0XHRcdHdBcyhkYXRhLCBvZmZzZXQsXCJmY1RMXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdFx0d1VpKGRhdGEsIG9mZnNldCwgZmkrKyk7ICAgb2Zmc2V0Kz00O1xuXHRcdFx0d1VpKGRhdGEsIG9mZnNldCwgZnIucmVjdC53aWR0aCApOyAgIG9mZnNldCs9NDtcblx0XHRcdHdVaShkYXRhLCBvZmZzZXQsIGZyLnJlY3QuaGVpZ2h0KTsgICBvZmZzZXQrPTQ7XG5cdFx0XHR3VWkoZGF0YSwgb2Zmc2V0LCBmci5yZWN0LngpOyAgIG9mZnNldCs9NDtcblx0XHRcdHdVaShkYXRhLCBvZmZzZXQsIGZyLnJlY3QueSk7ICAgb2Zmc2V0Kz00O1xuXHRcdFx0d1VzKGRhdGEsIG9mZnNldCwgZGVsc1tqXSk7ICAgb2Zmc2V0Kz0yO1xuXHRcdFx0d1VzKGRhdGEsIG9mZnNldCwgIDEwMDApOyAgIG9mZnNldCs9Mjtcblx0XHRcdGRhdGFbb2Zmc2V0XSA9IGZyLmRpc3Bvc2U7ICBvZmZzZXQrKztcdC8vIGRpc3Bvc2Vcblx0XHRcdGRhdGFbb2Zmc2V0XSA9IGZyLmJsZW5kICA7ICBvZmZzZXQrKztcdC8vIGJsZW5kXG5cdFx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTMwLDMwKSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXHRcdH1cblx0XHRcdFx0XG5cdFx0dmFyIGltZ2QgPSBmci5jaW1nLCBkbCA9IGltZ2QubGVuZ3RoO1xuXHRcdHdVaShkYXRhLG9mZnNldCwgZGwrKGo9PTA/MDo0KSk7ICAgICBvZmZzZXQrPTQ7XG5cdFx0dmFyIGlvZmYgPSBvZmZzZXQ7XG5cdFx0d0FzKGRhdGEsb2Zmc2V0LChqPT0wKT9cIklEQVRcIjpcImZkQVRcIik7ICBvZmZzZXQrPTQ7XG5cdFx0aWYoaiE9MCkgeyAgd1VpKGRhdGEsIG9mZnNldCwgZmkrKyk7ICBvZmZzZXQrPTQ7ICB9XG5cdFx0ZGF0YS5zZXQoaW1nZCxvZmZzZXQpO1xuXHRcdG9mZnNldCArPSBkbDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsaW9mZixvZmZzZXQtaW9mZikpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblx0fVxuXG5cdHdVaShkYXRhLG9mZnNldCwgMCk7ICAgICBvZmZzZXQrPTQ7XG5cdHdBcyhkYXRhLG9mZnNldCxcIklFTkRcIik7ICBvZmZzZXQrPTQ7XG5cdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtNCw0KSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXG5cdHJldHVybiBkYXRhLmJ1ZmZlcjtcbn1cblxuVVBORy5lbmNvZGUuY29tcHJlc3NQTkcgPSBmdW5jdGlvbihvdXQsIGZpbHRlciwgbGV2ZWxaZXJvKSB7XG5cdGZvcih2YXIgaT0wOyBpPG91dC5mcmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgZnJtID0gb3V0LmZyYW1lc1tpXSwgbnc9ZnJtLnJlY3Qud2lkdGgsIG5oPWZybS5yZWN0LmhlaWdodDtcblx0XHR2YXIgZmRhdGEgPSBuZXcgVWludDhBcnJheShuaCpmcm0uYnBsK25oKTtcblx0XHRmcm0uY2ltZyA9IFVQTkcuZW5jb2RlLl9maWx0ZXJaZXJvKGZybS5pbWcsbmgsZnJtLmJwcCxmcm0uYnBsLGZkYXRhLCBmaWx0ZXIsIGxldmVsWmVybyk7XG5cdH1cbn1cblxuXG5cblVQTkcuZW5jb2RlLmNvbXByZXNzID0gZnVuY3Rpb24oYnVmcywgdywgaCwgcHMsIHBybXMpIC8vIHBybXM6ICBvbmx5QmxlbmQsIG1pbkJpdHMsIGZvcmJpZFBsdGVcbntcblx0Ly92YXIgdGltZSA9IERhdGUubm93KCk7XG5cdHZhciBvbmx5QmxlbmQgPSBwcm1zWzBdLCBldmVuQ3JkID0gcHJtc1sxXSwgZm9yYmlkUHJldiA9IHBybXNbMl0sIG1pbkJpdHMgPSBwcm1zWzNdLCBmb3JiaWRQbHRlID0gcHJtc1s0XTtcblx0XG5cdHZhciBjdHlwZSA9IDYsIGRlcHRoID0gOCwgYWxwaGFBbmQ9MjU1XG5cdFxuXHRmb3IodmFyIGo9MDsgajxidWZzLmxlbmd0aDsgaisrKSAgeyAgLy8gd2hlbiBub3QgcXVhbnRpemVkLCBvdGhlciBmcmFtZXMgY2FuIGNvbnRhaW4gY29sb3JzLCB0aGF0IGFyZSBub3QgaW4gYW4gaW5pdGlhbCBmcmFtZVxuXHRcdHZhciBpbWcgPSBuZXcgVWludDhBcnJheShidWZzW2pdKSwgaWxlbiA9IGltZy5sZW5ndGg7XG5cdFx0Zm9yKHZhciBpPTA7IGk8aWxlbjsgaSs9NCkgYWxwaGFBbmQgJj0gaW1nW2krM107XG5cdH1cblx0dmFyIGdvdEFscGhhID0gKGFscGhhQW5kIT0yNTUpO1xuXHRcblx0Ly9jb25zb2xlLmxvZyhcImFscGhhIGNoZWNrXCIsIERhdGUubm93KCktdGltZSk7ICB0aW1lID0gRGF0ZS5ub3coKTtcblx0XG5cdC8vdmFyIGJydXRlID0gZ290QWxwaGEgJiYgZm9yR0lGO1x0XHQvLyBicnV0ZSA6IGZyYW1lcyBjYW4gb25seSBiZSBjb3BpZWQsIG5vdCBcImJsZW5kZWRcIlxuXHR2YXIgZnJtcyA9IFVQTkcuZW5jb2RlLmZyYW1pemUoYnVmcywgdywgaCwgb25seUJsZW5kLCBldmVuQ3JkLCBmb3JiaWRQcmV2KTtcblx0Ly9jb25zb2xlLmxvZyhcImZyYW1pemVcIiwgRGF0ZS5ub3coKS10aW1lKTsgIHRpbWUgPSBEYXRlLm5vdygpO1xuXHRcblx0dmFyIGNtYXA9e30sIHBsdGU9W10sIGluZHM9W107ICBcblx0XG5cdGlmKHBzIT0wKSB7XG5cdFx0dmFyIG5idWZzID0gW107ICBmb3IodmFyIGk9MDsgaTxmcm1zLmxlbmd0aDsgaSsrKSBuYnVmcy5wdXNoKGZybXNbaV0uaW1nLmJ1ZmZlcik7XG5cdFx0XG5cdFx0dmFyIGFidWYgPSBVUE5HLmVuY29kZS5jb25jYXRSR0JBKG5idWZzKSwgcXJlcyA9IFVQTkcucXVhbnRpemUoYWJ1ZiwgcHMpOyAgXG5cdFx0dmFyIGNvZiA9IDAsIGJiID0gbmV3IFVpbnQ4QXJyYXkocXJlcy5hYnVmKTtcblx0XHRmb3IodmFyIGk9MDsgaTxmcm1zLmxlbmd0aDsgaSsrKSB7ICB2YXIgdGk9ZnJtc1tpXS5pbWcsIGJsbj10aS5sZW5ndGg7ICBpbmRzLnB1c2gobmV3IFVpbnQ4QXJyYXkocXJlcy5pbmRzLmJ1ZmZlciwgY29mPj4yLCBibG4+PjIpKTtcblx0XHRcdGZvcih2YXIgaj0wOyBqPGJsbjsgais9NCkgeyAgdGlbal09YmJbY29mK2pdOyAgdGlbaisxXT1iYltjb2YraisxXTsgIHRpW2orMl09YmJbY29mK2orMl07ICB0aVtqKzNdPWJiW2NvZitqKzNdOyAgfSAgICBjb2YrPWJsbjsgIH1cblx0XHRcblx0XHRmb3IodmFyIGk9MDsgaTxxcmVzLnBsdGUubGVuZ3RoOyBpKyspIHBsdGUucHVzaChxcmVzLnBsdGVbaV0uZXN0LnJnYmEpO1xuXHRcdC8vY29uc29sZS5sb2coXCJxdWFudGl6ZVwiLCBEYXRlLm5vdygpLXRpbWUpOyAgdGltZSA9IERhdGUubm93KCk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gd2hhdCBpZiBwcz09MCwgYnV0IHRoZXJlIGFyZSA8PTI1NiBjb2xvcnM/ICB3ZSBzdGlsbCBuZWVkIHRvIGRldGVjdCwgaWYgdGhlIHBhbGV0dGUgY291bGQgYmUgdXNlZFxuXHRcdGZvcih2YXIgaj0wOyBqPGZybXMubGVuZ3RoOyBqKyspICB7ICAvLyB3aGVuIG5vdCBxdWFudGl6ZWQsIG90aGVyIGZyYW1lcyBjYW4gY29udGFpbiBjb2xvcnMsIHRoYXQgYXJlIG5vdCBpbiBhbiBpbml0aWFsIGZyYW1lXG5cdFx0XHR2YXIgZnJtID0gZnJtc1tqXSwgaW1nMzIgPSBuZXcgVWludDMyQXJyYXkoZnJtLmltZy5idWZmZXIpLCBudz1mcm0ucmVjdC53aWR0aCwgaWxlbiA9IGltZzMyLmxlbmd0aDtcblx0XHRcdHZhciBpbmQgPSBuZXcgVWludDhBcnJheShpbGVuKTsgIGluZHMucHVzaChpbmQpO1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8aWxlbjsgaSsrKSB7XG5cdFx0XHRcdHZhciBjID0gaW1nMzJbaV07XG5cdFx0XHRcdGlmICAgICAoaSE9MCAmJiBjPT1pbWczMltpLSAxXSkgaW5kW2ldPWluZFtpLTFdO1xuXHRcdFx0XHRlbHNlIGlmKGk+bncgJiYgYz09aW1nMzJbaS1ud10pIGluZFtpXT1pbmRbaS1ud107XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHZhciBjbWMgPSBjbWFwW2NdO1xuXHRcdFx0XHRcdGlmKGNtYz09bnVsbCkgeyAgY21hcFtjXT1jbWM9cGx0ZS5sZW5ndGg7ICBwbHRlLnB1c2goYyk7ICBpZihwbHRlLmxlbmd0aD49MzAwKSBicmVhazsgIH1cblx0XHRcdFx0XHRpbmRbaV09Y21jO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vY29uc29sZS5sb2coXCJtYWtlIHBhbGV0dGVcIiwgRGF0ZS5ub3coKS10aW1lKTsgIHRpbWUgPSBEYXRlLm5vdygpO1xuXHR9XG5cdFxuXHR2YXIgY2M9cGx0ZS5sZW5ndGg7IC8vY29uc29sZS5sb2coXCJjb2xvcnM6XCIsY2MpO1xuXHRpZihjYzw9MjU2ICYmIGZvcmJpZFBsdGU9PWZhbHNlKSB7XG5cdFx0aWYoY2M8PSAyKSBkZXB0aD0xOyAgZWxzZSBpZihjYzw9IDQpIGRlcHRoPTI7ICBlbHNlIGlmKGNjPD0xNikgZGVwdGg9NDsgIGVsc2UgZGVwdGg9ODtcblx0XHRkZXB0aCA9ICBNYXRoLm1heChkZXB0aCwgbWluQml0cyk7XG5cdH1cblx0XG5cdGZvcih2YXIgaj0wOyBqPGZybXMubGVuZ3RoOyBqKyspXG5cdHtcblx0XHR2YXIgZnJtID0gZnJtc1tqXSwgbng9ZnJtLnJlY3QueCwgbnk9ZnJtLnJlY3QueSwgbnc9ZnJtLnJlY3Qud2lkdGgsIG5oPWZybS5yZWN0LmhlaWdodDtcblx0XHR2YXIgY2ltZyA9IGZybS5pbWcsIGNpbWczMiA9IG5ldyBVaW50MzJBcnJheShjaW1nLmJ1ZmZlcik7XG5cdFx0dmFyIGJwbCA9IDQqbncsIGJwcD00O1xuXHRcdGlmKGNjPD0yNTYgJiYgZm9yYmlkUGx0ZT09ZmFsc2UpIHtcblx0XHRcdGJwbCA9IE1hdGguY2VpbChkZXB0aCpudy84KTtcblx0XHRcdHZhciBuaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnBsKm5oKTtcblx0XHRcdHZhciBpbmogPSBpbmRzW2pdO1xuXHRcdFx0Zm9yKHZhciB5PTA7IHk8bmg7IHkrKykgeyAgdmFyIGk9eSpicGwsIGlpPXkqbnc7XG5cdFx0XHRcdGlmICAgICAoZGVwdGg9PTgpIGZvcih2YXIgeD0wOyB4PG53OyB4KyspIG5pbWdbaSsoeCkgICBdICAgPSAgKGlualtpaSt4XSAgICAgICAgICAgICApO1xuXHRcdFx0XHRlbHNlIGlmKGRlcHRoPT00KSBmb3IodmFyIHg9MDsgeDxudzsgeCsrKSBuaW1nW2krKHg+PjEpXSAgfD0gIChpbmpbaWkreF08PCg0LSh4JjEpKjQpKTtcblx0XHRcdFx0ZWxzZSBpZihkZXB0aD09MikgZm9yKHZhciB4PTA7IHg8bnc7IHgrKykgbmltZ1tpKyh4Pj4yKV0gIHw9ICAoaW5qW2lpK3hdPDwoNi0oeCYzKSoyKSk7XG5cdFx0XHRcdGVsc2UgaWYoZGVwdGg9PTEpIGZvcih2YXIgeD0wOyB4PG53OyB4KyspIG5pbWdbaSsoeD4+MyldICB8PSAgKGlualtpaSt4XTw8KDctKHgmNykqMSkpO1xuXHRcdFx0fVxuXHRcdFx0Y2ltZz1uaW1nOyAgY3R5cGU9MzsgIGJwcD0xO1xuXHRcdH1cblx0XHRlbHNlIGlmKGdvdEFscGhhPT1mYWxzZSAmJiBmcm1zLmxlbmd0aD09MSkge1x0Ly8gc29tZSBuZXh0IFwicmVkdWNlZFwiIGZyYW1lcyBtYXkgY29udGFpbiBhbHBoYSBmb3IgYmxlbmRpbmdcblx0XHRcdHZhciBuaW1nID0gbmV3IFVpbnQ4QXJyYXkobncqbmgqMyksIGFyZWE9bncqbmg7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTxhcmVhOyBpKyspIHsgdmFyIHRpPWkqMywgcWk9aSo0OyAgbmltZ1t0aV09Y2ltZ1txaV07ICBuaW1nW3RpKzFdPWNpbWdbcWkrMV07ICBuaW1nW3RpKzJdPWNpbWdbcWkrMl07ICB9XG5cdFx0XHRjaW1nPW5pbWc7ICBjdHlwZT0yOyAgYnBwPTM7ICBicGw9Mypudztcblx0XHR9XG5cdFx0ZnJtLmltZz1jaW1nOyAgZnJtLmJwbD1icGw7ICBmcm0uYnBwPWJwcDtcblx0fVxuXHQvL2NvbnNvbGUubG9nKFwiY29sb3JzID0+IHBhbGV0dGUgaW5kaWNlc1wiLCBEYXRlLm5vdygpLXRpbWUpOyAgdGltZSA9IERhdGUubm93KCk7XG5cdFxuXHRyZXR1cm4ge2N0eXBlOmN0eXBlLCBkZXB0aDpkZXB0aCwgcGx0ZTpwbHRlLCBmcmFtZXM6ZnJtcyAgfTtcbn1cblVQTkcuZW5jb2RlLmZyYW1pemUgPSBmdW5jdGlvbihidWZzLHcsaCxhbHdheXNCbGVuZCxldmVuQ3JkLGZvcmJpZFByZXYpIHtcblx0LyogIERJU1BPU0Vcblx0ICAgIC0gMCA6IG5vIGNoYW5nZVxuXHRcdC0gMSA6IGNsZWFyIHRvIHRyYW5zcGFyZW50XG5cdFx0LSAyIDogcmV0c3RvcmUgdG8gY29udGVudCBiZWZvcmUgcmVuZGVyaW5nIChwcmV2aW91cyBmcmFtZSBkaXNwb3NlZClcblx0XHRCTEVORFxuXHRcdC0gMCA6IHJlcGxhY2Vcblx0XHQtIDEgOiBibGVuZFxuXHQqL1xuXHR2YXIgZnJtcyA9IFtdO1xuXHRmb3IodmFyIGo9MDsgajxidWZzLmxlbmd0aDsgaisrKSB7XG5cdFx0dmFyIGNpbWcgPSBuZXcgVWludDhBcnJheShidWZzW2pdKSwgY2ltZzMyID0gbmV3IFVpbnQzMkFycmF5KGNpbWcuYnVmZmVyKTtcblx0XHR2YXIgbmltZztcblx0XHRcblx0XHR2YXIgbng9MCwgbnk9MCwgbnc9dywgbmg9aCwgYmxlbmQ9YWx3YXlzQmxlbmQ/MTowO1xuXHRcdGlmKGohPTApIHtcblx0XHRcdHZhciB0bGltID0gKGZvcmJpZFByZXYgfHwgYWx3YXlzQmxlbmQgfHwgaj09MSB8fCBmcm1zW2otMl0uZGlzcG9zZSE9MCk/MToyLCB0c3RwID0gMCwgdGFyZWEgPSAxZTk7XG5cdFx0XHRmb3IodmFyIGl0PTA7IGl0PHRsaW07IGl0KyspXG5cdFx0XHR7XG5cdFx0XHRcdHZhciBwaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnVmc1tqLTEtaXRdKSwgcDMyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZnNbai0xLWl0XSk7XG5cdFx0XHRcdHZhciBtaXg9dyxtaXk9aCxtYXg9LTEsbWF5PS0xO1xuXHRcdFx0XHRmb3IodmFyIHk9MDsgeTxoOyB5KyspIGZvcih2YXIgeD0wOyB4PHc7IHgrKykge1xuXHRcdFx0XHRcdHZhciBpID0geSp3K3g7XG5cdFx0XHRcdFx0aWYoY2ltZzMyW2ldIT1wMzJbaV0pIHtcblx0XHRcdFx0XHRcdGlmKHg8bWl4KSBtaXg9eDsgIGlmKHg+bWF4KSBtYXg9eDtcblx0XHRcdFx0XHRcdGlmKHk8bWl5KSBtaXk9eTsgIGlmKHk+bWF5KSBtYXk9eTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYobWF4PT0tMSkgbWl4PW1peT1tYXg9bWF5PTA7XG5cdFx0XHRcdGlmKGV2ZW5DcmQpIHsgIGlmKChtaXgmMSk9PTEpbWl4LS07ICBpZigobWl5JjEpPT0xKW1peS0tOyAgfVxuXHRcdFx0XHR2YXIgc2FyZWEgPSAobWF4LW1peCsxKSoobWF5LW1peSsxKTtcblx0XHRcdFx0aWYoc2FyZWE8dGFyZWEpIHtcblx0XHRcdFx0XHR0YXJlYSA9IHNhcmVhOyAgdHN0cCA9IGl0O1xuXHRcdFx0XHRcdG54ID0gbWl4OyBueSA9IG1peTsgbncgPSBtYXgtbWl4KzE7IG5oID0gbWF5LW1peSsxO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdC8vIGFsd2F5c0JsZW5kOiBwb2t1ZCB6amlzdMOtbSwgxb5lIGJsZW5kaXQgbmVsemUsIG5hc3RhdsOtbSBwxZllZGNob3rDrW11IHNuw61ta3UgZGlzcG9zZT0xLiBaYWppc3TDrW0sIGFieSBvYnNhaG92YWwgbcWvaiBvYmTDqWxuw61rLlxuXHRcdFx0dmFyIHBpbWcgPSBuZXcgVWludDhBcnJheShidWZzW2otMS10c3RwXSk7XG5cdFx0XHRpZih0c3RwPT0xKSBmcm1zW2otMV0uZGlzcG9zZSA9IDI7XG5cdFx0XHRcblx0XHRcdG5pbWcgPSBuZXcgVWludDhBcnJheShudypuaCo0KTtcblx0XHRcdFVQTkcuX2NvcHlUaWxlKHBpbWcsdyxoLCBuaW1nLG53LG5oLCAtbngsLW55LCAwKTtcblx0XHRcdFxuXHRcdFx0YmxlbmQgPSAgVVBORy5fY29weVRpbGUoY2ltZyx3LGgsIG5pbWcsbncsbmgsIC1ueCwtbnksIDMpID8gMSA6IDA7XG5cdFx0XHRpZihibGVuZD09MSkgVVBORy5lbmNvZGUuX3ByZXBhcmVEaWZmKGNpbWcsdyxoLG5pbWcse3g6bngseTpueSx3aWR0aDpudyxoZWlnaHQ6bmh9KTtcblx0XHRcdGVsc2UgICAgICAgICBVUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgbmltZyxudyxuaCwgLW54LC1ueSwgMCk7XG5cdFx0XHQvL1VQTkcuX2NvcHlUaWxlKGNpbWcsdyxoLCBuaW1nLG53LG5oLCAtbngsLW55LCBibGVuZD09MT8yOjApO1xuXHRcdH1cblx0XHRlbHNlIG5pbWcgPSBjaW1nLnNsaWNlKDApO1x0Ly8gaW1nIG1heSBiZSByZXdyaXR0ZW4gZnVydGhlciAuLi4gZG9uJ3QgcmV3cml0ZSBpbnB1dFxuXHRcdFxuXHRcdGZybXMucHVzaCh7cmVjdDp7eDpueCx5Om55LHdpZHRoOm53LGhlaWdodDpuaH0sIGltZzpuaW1nLCBibGVuZDpibGVuZCwgZGlzcG9zZTowfSk7XG5cdH1cblx0XG5cdFxuXHRpZihhbHdheXNCbGVuZCkgZm9yKHZhciBqPTA7IGo8ZnJtcy5sZW5ndGg7IGorKykge1xuXHRcdHZhciBmcm0gPSBmcm1zW2pdOyAgaWYoZnJtLmJsZW5kPT0xKSBjb250aW51ZTtcblx0XHR2YXIgcjAgPSBmcm0ucmVjdCwgcjEgPSBmcm1zW2otMV0ucmVjdFxuXHRcdHZhciBtaVggPSBNYXRoLm1pbihyMC54LCByMS54KSwgbWlZID0gTWF0aC5taW4ocjAueSwgcjEueSk7XG5cdFx0dmFyIG1hWCA9IE1hdGgubWF4KHIwLngrcjAud2lkdGgsIHIxLngrcjEud2lkdGgpLCBtYVkgPSBNYXRoLm1heChyMC55K3IwLmhlaWdodCwgcjEueStyMS5oZWlnaHQpO1xuXHRcdHZhciByID0ge3g6bWlYLCB5Om1pWSwgd2lkdGg6bWFYLW1pWCwgaGVpZ2h0Om1hWS1taVl9O1xuXHRcdFxuXHRcdGZybXNbai0xXS5kaXNwb3NlID0gMTtcblx0XHRpZihqLTEhPTApIFxuXHRcdFVQTkcuZW5jb2RlLl91cGRhdGVGcmFtZShidWZzLCB3LGgsZnJtcywgai0xLHIsIGV2ZW5DcmQpO1xuXHRcdFVQTkcuZW5jb2RlLl91cGRhdGVGcmFtZShidWZzLCB3LGgsZnJtcywgaiAgLHIsIGV2ZW5DcmQpO1xuXHR9XG5cdHZhciBhcmVhID0gMDtcblx0aWYoYnVmcy5sZW5ndGghPTEpIGZvcih2YXIgaT0wOyBpPGZybXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgZnJtID0gZnJtc1tpXTtcblx0XHRhcmVhICs9IGZybS5yZWN0LndpZHRoKmZybS5yZWN0LmhlaWdodDtcblx0XHQvL2lmKGk9PTAgfHwgZnJtLmJsZW5kIT0xKSBjb250aW51ZTtcblx0XHQvL3ZhciBvYiA9IG5ldyBVaW50OEFycmF5KFxuXHRcdC8vY29uc29sZS5sb2coZnJtLmJsZW5kLCBmcm0uZGlzcG9zZSwgZnJtLnJlY3QpO1xuXHR9XG5cdC8vaWYoYXJlYSE9MCkgY29uc29sZS5sb2coYXJlYSk7XG5cdHJldHVybiBmcm1zO1xufVxuVVBORy5lbmNvZGUuX3VwZGF0ZUZyYW1lID0gZnVuY3Rpb24oYnVmcywgdyxoLCBmcm1zLCBpLCByLCBldmVuQ3JkKSB7XG5cdHZhciBVOCA9IFVpbnQ4QXJyYXksIFUzMiA9IFVpbnQzMkFycmF5O1xuXHR2YXIgcGltZyA9IG5ldyBVOChidWZzW2ktMV0pLCBwaW1nMzIgPSBuZXcgVTMyKGJ1ZnNbaS0xXSksIG5pbWcgPSBpKzE8YnVmcy5sZW5ndGggPyBuZXcgVTgoYnVmc1tpKzFdKTpudWxsO1xuXHR2YXIgY2ltZyA9IG5ldyBVOChidWZzW2ldKSwgY2ltZzMyID0gbmV3IFUzMihjaW1nLmJ1ZmZlcik7XG5cdFxuXHR2YXIgbWl4PXcsbWl5PWgsbWF4PS0xLG1heT0tMTtcblx0Zm9yKHZhciB5PTA7IHk8ci5oZWlnaHQ7IHkrKykgZm9yKHZhciB4PTA7IHg8ci53aWR0aDsgeCsrKSB7XG5cdFx0dmFyIGN4ID0gci54K3gsIGN5ID0gci55K3k7XG5cdFx0dmFyIGogPSBjeSp3K2N4LCBjYyA9IGNpbWczMltqXTtcblx0XHQvLyBubyBuZWVkIHRvIGRyYXcgdHJhbnNwYXJlbmN5LCBvciB0byBkaXNwb3NlIGl0LiBPciwgaWYgd3JpdGluZyB0aGUgc2FtZSBjb2xvciBhbmQgdGhlIG5leHQgb25lIGRvZXMgbm90IG5lZWQgdHJhbnNwYXJlbmN5LlxuXHRcdGlmKGNjPT0wIHx8IChmcm1zW2ktMV0uZGlzcG9zZT09MCAmJiBwaW1nMzJbal09PWNjICYmIChuaW1nPT1udWxsIHx8IG5pbWdbaio0KzNdIT0wKSkvKiovKSB7fVxuXHRcdGVsc2Uge1xuXHRcdFx0aWYoY3g8bWl4KSBtaXg9Y3g7ICBpZihjeD5tYXgpIG1heD1jeDtcblx0XHRcdGlmKGN5PG1peSkgbWl5PWN5OyAgaWYoY3k+bWF5KSBtYXk9Y3k7XG5cdFx0fVxuXHR9XG5cdGlmKG1heD09LTEpIG1peD1taXk9bWF4PW1heT0wO1xuXHRpZihldmVuQ3JkKSB7ICBpZigobWl4JjEpPT0xKW1peC0tOyAgaWYoKG1peSYxKT09MSltaXktLTsgIH1cblx0ciA9IHt4Om1peCwgeTptaXksIHdpZHRoOm1heC1taXgrMSwgaGVpZ2h0Om1heS1taXkrMX07XG5cdFxuXHR2YXIgZnIgPSBmcm1zW2ldOyAgZnIucmVjdCA9IHI7ICBmci5ibGVuZCA9IDE7ICBmci5pbWcgPSBuZXcgVWludDhBcnJheShyLndpZHRoKnIuaGVpZ2h0KjQpO1xuXHRpZihmcm1zW2ktMV0uZGlzcG9zZT09MCkge1xuXHRcdFVQTkcuX2NvcHlUaWxlKHBpbWcsdyxoLCBmci5pbWcsci53aWR0aCxyLmhlaWdodCwgLXIueCwtci55LCAwKTtcblx0XHRVUE5HLmVuY29kZS5fcHJlcGFyZURpZmYoY2ltZyx3LGgsZnIuaW1nLHIpO1xuXHRcdC8vVVBORy5fY29weVRpbGUoY2ltZyx3LGgsIGZyLmltZyxyLndpZHRoLHIuaGVpZ2h0LCAtci54LC1yLnksIDIpO1xuXHR9XG5cdGVsc2Vcblx0XHRVUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgZnIuaW1nLHIud2lkdGgsci5oZWlnaHQsIC1yLngsLXIueSwgMCk7XG59XG5VUE5HLmVuY29kZS5fcHJlcGFyZURpZmYgPSBmdW5jdGlvbihjaW1nLCB3LGgsIG5pbWcsIHJlYykge1xuXHRVUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgbmltZyxyZWMud2lkdGgscmVjLmhlaWdodCwgLXJlYy54LC1yZWMueSwgMik7XG5cdC8qXG5cdHZhciBuMzIgPSBuZXcgVWludDMyQXJyYXkobmltZy5idWZmZXIpO1xuXHR2YXIgb2cgPSBuZXcgVWludDhBcnJheShyZWMud2lkdGgqcmVjLmhlaWdodCo0KSwgbzMyID0gbmV3IFVpbnQzMkFycmF5KG9nLmJ1ZmZlcik7XG5cdFVQTkcuX2NvcHlUaWxlKGNpbWcsdyxoLCBvZyxyZWMud2lkdGgscmVjLmhlaWdodCwgLXJlYy54LC1yZWMueSwgMCk7XG5cdGZvcih2YXIgaT00OyBpPG5pbWcubGVuZ3RoOyBpKz00KSB7XG5cdFx0aWYobmltZ1tpLTFdIT0wICYmIG5pbWdbaSszXT09MCAmJiBvMzJbaT4+PjJdPT1vMzJbKGk+Pj4yKS0xXSkge1xuXHRcdFx0bjMyW2k+Pj4yXT1vMzJbaT4+PjJdO1xuXHRcdFx0Ly92YXIgaiA9IGksIGM9cDMyWyhpPj4+MiktMV07XG5cdFx0XHQvL3doaWxlKHAzMltqPj4+Ml09PWMpIHsgIG4zMltqPj4+Ml09YzsgIGorPTQ7ICB9XG5cdFx0fVxuXHR9XG5cdGZvcih2YXIgaT1uaW1nLmxlbmd0aC04OyBpPjA7IGktPTQpIHtcblx0XHRpZihuaW1nW2krN10hPTAgJiYgbmltZ1tpKzNdPT0wICYmIG8zMltpPj4+Ml09PW8zMlsoaT4+PjIpKzFdKSB7XG5cdFx0XHRuMzJbaT4+PjJdPW8zMltpPj4+Ml07XG5cdFx0XHQvL3ZhciBqID0gaSwgYz1wMzJbKGk+Pj4yKS0xXTtcblx0XHRcdC8vd2hpbGUocDMyW2o+Pj4yXT09YykgeyAgbjMyW2o+Pj4yXT1jOyAgais9NDsgIH1cblx0XHR9XG5cdH0qL1xufVxuXG5VUE5HLmVuY29kZS5fZmlsdGVyWmVybyA9IGZ1bmN0aW9uKGltZyxoLGJwcCxicGwsZGF0YSwgZmlsdGVyLCBsZXZlbFplcm8pXG57XG5cdHZhciBmbHMgPSBbXSwgZnRyeT1bMCwxLDIsMyw0XTtcblx0aWYgICAgIChmaWx0ZXIhPS0xKSAgICAgICAgICAgICBmdHJ5PVtmaWx0ZXJdO1xuXHRlbHNlIGlmKGgqYnBsPjUwMDAwMCB8fCBicHA9PTEpIGZ0cnk9WzBdO1xuXHR2YXIgb3B0czsgIGlmKGxldmVsWmVybykgb3B0cz17bGV2ZWw6MH07XG5cdFxuXHR2YXIgQ01QUiA9IChsZXZlbFplcm8gJiYgVVpJUCE9bnVsbCkgPyBVWklQIDogcGFrbztcblx0XG5cdGZvcih2YXIgaT0wOyBpPGZ0cnkubGVuZ3RoOyBpKyspIHtcblx0XHRmb3IodmFyIHk9MDsgeTxoOyB5KyspIFVQTkcuZW5jb2RlLl9maWx0ZXJMaW5lKGRhdGEsIGltZywgeSwgYnBsLCBicHAsIGZ0cnlbaV0pO1xuXHRcdC8vdmFyIG5pbWcgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCk7XG5cdFx0Ly92YXIgc3ogPSBVWklQLkYuZGVmbGF0ZShkYXRhLCBuaW1nKTsgIGZscy5wdXNoKG5pbWcuc2xpY2UoMCxzeikpO1xuXHRcdC8vdmFyIGRmbCA9IHBha29bXCJkZWZsYXRlXCJdKGRhdGEpLCBkbD1kZmwubGVuZ3RoLTQ7XG5cdFx0Ly92YXIgY3JjID0gKGRmbFtkbCszXTw8MjQpfChkZmxbZGwrMl08PDE2KXwoZGZsW2RsKzFdPDw4KXwoZGZsW2RsKzBdPDwwKTtcblx0XHQvL2NvbnNvbGUubG9nKGNyYywgVVpJUC5hZGxlcihkYXRhLDIsZGF0YS5sZW5ndGgtNikpO1xuXHRcdGZscy5wdXNoKENNUFJbXCJkZWZsYXRlXCJdKGRhdGEsb3B0cykpO1xuXHR9XG5cdHZhciB0aSwgdHNpemU9MWU5O1xuXHRmb3IodmFyIGk9MDsgaTxmbHMubGVuZ3RoOyBpKyspIGlmKGZsc1tpXS5sZW5ndGg8dHNpemUpIHsgIHRpPWk7ICB0c2l6ZT1mbHNbaV0ubGVuZ3RoOyAgfVxuXHRyZXR1cm4gZmxzW3RpXTtcbn1cblVQTkcuZW5jb2RlLl9maWx0ZXJMaW5lID0gZnVuY3Rpb24oZGF0YSwgaW1nLCB5LCBicGwsIGJwcCwgdHlwZSlcbntcblx0dmFyIGkgPSB5KmJwbCwgZGkgPSBpK3ksIHBhZXRoID0gVVBORy5kZWNvZGUuX3BhZXRoXG5cdGRhdGFbZGldPXR5cGU7ICBkaSsrO1xuXG5cdGlmKHR5cGU9PTApIHtcblx0XHRpZihicGw8NTAwKSBmb3IodmFyIHg9MDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IGltZ1tpK3hdO1xuXHRcdGVsc2UgZGF0YS5zZXQobmV3IFVpbnQ4QXJyYXkoaW1nLmJ1ZmZlcixpLGJwbCksZGkpO1xuXHR9XG5cdGVsc2UgaWYodHlwZT09MSkge1xuXHRcdGZvcih2YXIgeD0gIDA7IHg8YnBwOyB4KyspIGRhdGFbZGkreF0gPSAgaW1nW2kreF07XG5cdFx0Zm9yKHZhciB4PWJwcDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XS1pbWdbaSt4LWJwcF0rMjU2KSYyNTU7XG5cdH1cblx0ZWxzZSBpZih5PT0wKSB7XG5cdFx0Zm9yKHZhciB4PSAgMDsgeDxicHA7IHgrKykgZGF0YVtkaSt4XSA9IGltZ1tpK3hdO1xuXG5cdFx0aWYodHlwZT09MikgZm9yKHZhciB4PWJwcDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IGltZ1tpK3hdO1xuXHRcdGlmKHR5cGU9PTMpIGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0gLSAoaW1nW2kreC1icHBdPj4xKSArMjU2KSYyNTU7XG5cdFx0aWYodHlwZT09NCkgZm9yKHZhciB4PWJwcDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XSAtIHBhZXRoKGltZ1tpK3gtYnBwXSwgMCwgMCkgKzI1NikmMjU1O1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmKHR5cGU9PTIpIHsgZm9yKHZhciB4PSAgMDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XSsyNTYgLSBpbWdbaSt4LWJwbF0pJjI1NTsgIH1cblx0XHRpZih0eXBlPT0zKSB7IGZvcih2YXIgeD0gIDA7IHg8YnBwOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0rMjU2IC0gKGltZ1tpK3gtYnBsXT4+MSkpJjI1NTtcblx0XHRcdFx0XHQgIGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0rMjU2IC0gKChpbWdbaSt4LWJwbF0raW1nW2kreC1icHBdKT4+MSkpJjI1NTsgIH1cblx0XHRpZih0eXBlPT00KSB7IGZvcih2YXIgeD0gIDA7IHg8YnBwOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0rMjU2IC0gcGFldGgoMCwgaW1nW2kreC1icGxdLCAwKSkmMjU1O1xuXHRcdFx0XHRcdCAgZm9yKHZhciB4PWJwcDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XSsyNTYgLSBwYWV0aChpbWdbaSt4LWJwcF0sIGltZ1tpK3gtYnBsXSwgaW1nW2kreC1icHAtYnBsXSkpJjI1NTsgIH1cblx0fVxufVxuXG5VUE5HLmNyYyA9IHtcblx0dGFibGUgOiAoIGZ1bmN0aW9uKCkge1xuXHQgICB2YXIgdGFiID0gbmV3IFVpbnQzMkFycmF5KDI1Nik7XG5cdCAgIGZvciAodmFyIG49MDsgbjwyNTY7IG4rKykge1xuXHRcdFx0dmFyIGMgPSBuO1xuXHRcdFx0Zm9yICh2YXIgaz0wOyBrPDg7IGsrKykge1xuXHRcdFx0XHRpZiAoYyAmIDEpICBjID0gMHhlZGI4ODMyMCBeIChjID4+PiAxKTtcblx0XHRcdFx0ZWxzZSAgICAgICAgYyA9IGMgPj4+IDE7XG5cdFx0XHR9XG5cdFx0XHR0YWJbbl0gPSBjOyAgfVxuXHRcdHJldHVybiB0YWI7ICB9KSgpLFxuXHR1cGRhdGUgOiBmdW5jdGlvbihjLCBidWYsIG9mZiwgbGVuKSB7XG5cdFx0Zm9yICh2YXIgaT0wOyBpPGxlbjsgaSsrKSAgYyA9IFVQTkcuY3JjLnRhYmxlWyhjIF4gYnVmW29mZitpXSkgJiAweGZmXSBeIChjID4+PiA4KTtcblx0XHRyZXR1cm4gYztcblx0fSxcblx0Y3JjIDogZnVuY3Rpb24oYixvLGwpICB7ICByZXR1cm4gVVBORy5jcmMudXBkYXRlKDB4ZmZmZmZmZmYsYixvLGwpIF4gMHhmZmZmZmZmZjsgIH1cbn1cblxuXG5VUE5HLnF1YW50aXplID0gZnVuY3Rpb24oYWJ1ZiwgcHMpXG57XHRcblx0dmFyIG9pbWcgPSBuZXcgVWludDhBcnJheShhYnVmKSwgbmltZyA9IG9pbWcuc2xpY2UoMCksIG5pbWczMiA9IG5ldyBVaW50MzJBcnJheShuaW1nLmJ1ZmZlcik7XG5cdFxuXHR2YXIgS0QgPSBVUE5HLnF1YW50aXplLmdldEtEdHJlZShuaW1nLCBwcyk7XG5cdHZhciByb290ID0gS0RbMF0sIGxlYWZzID0gS0RbMV07XG5cdFxuXHR2YXIgcGxhbmVEc3QgPSBVUE5HLnF1YW50aXplLnBsYW5lRHN0O1xuXHR2YXIgc2IgPSBvaW1nLCB0YiA9IG5pbWczMiwgbGVuPXNiLmxlbmd0aDtcblx0XHRcblx0dmFyIGluZHMgPSBuZXcgVWludDhBcnJheShvaW1nLmxlbmd0aD4+Mik7XG5cdGZvcih2YXIgaT0wOyBpPGxlbjsgaSs9NCkge1xuXHRcdHZhciByPXNiW2ldKigxLzI1NSksIGc9c2JbaSsxXSooMS8yNTUpLCBiPXNiW2krMl0qKDEvMjU1KSwgYT1zYltpKzNdKigxLzI1NSk7XG5cdFx0XG5cdFx0Ly8gIGV4YWN0LCBidXQgdG9vIHNsb3cgOihcblx0XHR2YXIgbmQgPSBVUE5HLnF1YW50aXplLmdldE5lYXJlc3Qocm9vdCwgciwgZywgYiwgYSk7XG5cdFx0Ly92YXIgbmQgPSByb290O1xuXHRcdC8vd2hpbGUobmQubGVmdCkgbmQgPSAocGxhbmVEc3QobmQuZXN0LHIsZyxiLGEpPD0wKSA/IG5kLmxlZnQgOiBuZC5yaWdodDtcblx0XHRcblx0XHRpbmRzW2k+PjJdID0gbmQuaW5kO1xuXHRcdHRiW2k+PjJdID0gbmQuZXN0LnJnYmE7XG5cdH1cblx0cmV0dXJuIHsgIGFidWY6bmltZy5idWZmZXIsIGluZHM6aW5kcywgcGx0ZTpsZWFmcyAgfTtcbn1cblxuVVBORy5xdWFudGl6ZS5nZXRLRHRyZWUgPSBmdW5jdGlvbihuaW1nLCBwcywgZXJyKSB7XG5cdGlmKGVycj09bnVsbCkgZXJyID0gMC4wMDAxO1xuXHR2YXIgbmltZzMyID0gbmV3IFVpbnQzMkFycmF5KG5pbWcuYnVmZmVyKTtcblx0XG5cdHZhciByb290ID0ge2kwOjAsIGkxOm5pbWcubGVuZ3RoLCBic3Q6bnVsbCwgZXN0Om51bGwsIHRkc3Q6MCwgbGVmdDpudWxsLCByaWdodDpudWxsIH07ICAvLyBiYXNpYyBzdGF0aXN0aWMsIGV4dHJhIHN0YXRpc3RpY1xuXHRyb290LmJzdCA9IFVQTkcucXVhbnRpemUuc3RhdHMoICBuaW1nLHJvb3QuaTAsIHJvb3QuaTEgICk7ICByb290LmVzdCA9IFVQTkcucXVhbnRpemUuZXN0YXRzKCByb290LmJzdCApO1xuXHR2YXIgbGVhZnMgPSBbcm9vdF07XG5cdFxuXHR3aGlsZShsZWFmcy5sZW5ndGg8cHMpXG5cdHtcblx0XHR2YXIgbWF4TCA9IDAsIG1pPTA7XG5cdFx0Zm9yKHZhciBpPTA7IGk8bGVhZnMubGVuZ3RoOyBpKyspIGlmKGxlYWZzW2ldLmVzdC5MID4gbWF4TCkgeyAgbWF4TD1sZWFmc1tpXS5lc3QuTDsgIG1pPWk7ICB9XG5cdFx0aWYobWF4TDxlcnIpIGJyZWFrO1xuXHRcdHZhciBub2RlID0gbGVhZnNbbWldO1xuXHRcdFxuXHRcdHZhciBzMCA9IFVQTkcucXVhbnRpemUuc3BsaXRQaXhlbHMobmltZyxuaW1nMzIsIG5vZGUuaTAsIG5vZGUuaTEsIG5vZGUuZXN0LmUsIG5vZGUuZXN0LmVNcTI1NSk7XG5cdFx0dmFyIHMwd3JvbmcgPSAobm9kZS5pMD49czAgfHwgbm9kZS5pMTw9czApO1xuXHRcdC8vY29uc29sZS5sb2cobWF4TCwgbGVhZnMubGVuZ3RoLCBtaSk7XG5cdFx0aWYoczB3cm9uZykgeyAgbm9kZS5lc3QuTD0wOyAgY29udGludWU7ICB9XG5cdFx0XG5cdFx0XG5cdFx0dmFyIGxuID0ge2kwOm5vZGUuaTAsIGkxOnMwLCBic3Q6bnVsbCwgZXN0Om51bGwsIHRkc3Q6MCwgbGVmdDpudWxsLCByaWdodDpudWxsIH07ICBsbi5ic3QgPSBVUE5HLnF1YW50aXplLnN0YXRzKCBuaW1nLCBsbi5pMCwgbG4uaTEgKTsgIFxuXHRcdGxuLmVzdCA9IFVQTkcucXVhbnRpemUuZXN0YXRzKCBsbi5ic3QgKTtcblx0XHR2YXIgcm4gPSB7aTA6czAsIGkxOm5vZGUuaTEsIGJzdDpudWxsLCBlc3Q6bnVsbCwgdGRzdDowLCBsZWZ0Om51bGwsIHJpZ2h0Om51bGwgfTsgIHJuLmJzdCA9IHtSOltdLCBtOltdLCBOOm5vZGUuYnN0Lk4tbG4uYnN0Lk59O1xuXHRcdGZvcih2YXIgaT0wOyBpPDE2OyBpKyspIHJuLmJzdC5SW2ldID0gbm9kZS5ic3QuUltpXS1sbi5ic3QuUltpXTtcblx0XHRmb3IodmFyIGk9MDsgaTwgNDsgaSsrKSBybi5ic3QubVtpXSA9IG5vZGUuYnN0Lm1baV0tbG4uYnN0Lm1baV07XG5cdFx0cm4uZXN0ID0gVVBORy5xdWFudGl6ZS5lc3RhdHMoIHJuLmJzdCApO1xuXHRcdFxuXHRcdG5vZGUubGVmdCA9IGxuOyAgbm9kZS5yaWdodCA9IHJuO1xuXHRcdGxlYWZzW21pXT1sbjsgIGxlYWZzLnB1c2gocm4pO1xuXHR9XG5cdGxlYWZzLnNvcnQoZnVuY3Rpb24oYSxiKSB7ICByZXR1cm4gYi5ic3QuTi1hLmJzdC5OOyAgfSk7XG5cdGZvcih2YXIgaT0wOyBpPGxlYWZzLmxlbmd0aDsgaSsrKSBsZWFmc1tpXS5pbmQ9aTtcblx0cmV0dXJuIFtyb290LCBsZWFmc107XG59XG5cblVQTkcucXVhbnRpemUuZ2V0TmVhcmVzdCA9IGZ1bmN0aW9uKG5kLCByLGcsYixhKVxue1xuXHRpZihuZC5sZWZ0PT1udWxsKSB7ICBuZC50ZHN0ID0gVVBORy5xdWFudGl6ZS5kaXN0KG5kLmVzdC5xLHIsZyxiLGEpOyAgcmV0dXJuIG5kOyAgfVxuXHR2YXIgcGxhbmVEc3QgPSBVUE5HLnF1YW50aXplLnBsYW5lRHN0KG5kLmVzdCxyLGcsYixhKTtcblx0XG5cdHZhciBub2RlMCA9IG5kLmxlZnQsIG5vZGUxID0gbmQucmlnaHQ7XG5cdGlmKHBsYW5lRHN0PjApIHsgIG5vZGUwPW5kLnJpZ2h0OyAgbm9kZTE9bmQubGVmdDsgIH1cblx0XG5cdHZhciBsbiA9IFVQTkcucXVhbnRpemUuZ2V0TmVhcmVzdChub2RlMCwgcixnLGIsYSk7XG5cdGlmKGxuLnRkc3Q8PXBsYW5lRHN0KnBsYW5lRHN0KSByZXR1cm4gbG47XG5cdHZhciBybiA9IFVQTkcucXVhbnRpemUuZ2V0TmVhcmVzdChub2RlMSwgcixnLGIsYSk7XG5cdHJldHVybiBybi50ZHN0PGxuLnRkc3QgPyBybiA6IGxuO1xufVxuVVBORy5xdWFudGl6ZS5wbGFuZURzdCA9IGZ1bmN0aW9uKGVzdCwgcixnLGIsYSkgeyAgdmFyIGUgPSBlc3QuZTsgIHJldHVybiBlWzBdKnIgKyBlWzFdKmcgKyBlWzJdKmIgKyBlWzNdKmEgLSBlc3QuZU1xOyAgfVxuVVBORy5xdWFudGl6ZS5kaXN0ICAgICA9IGZ1bmN0aW9uKHEsICAgcixnLGIsYSkgeyAgdmFyIGQwPXItcVswXSwgZDE9Zy1xWzFdLCBkMj1iLXFbMl0sIGQzPWEtcVszXTsgIHJldHVybiBkMCpkMCtkMSpkMStkMipkMitkMypkMzsgIH1cblxuVVBORy5xdWFudGl6ZS5zcGxpdFBpeGVscyA9IGZ1bmN0aW9uKG5pbWcsIG5pbWczMiwgaTAsIGkxLCBlLCBlTXEpXG57XG5cdHZhciB2ZWNEb3QgPSBVUE5HLnF1YW50aXplLnZlY0RvdDtcblx0aTEtPTQ7XG5cdHZhciBzaGZzID0gMDtcblx0d2hpbGUoaTA8aTEpXG5cdHtcblx0XHR3aGlsZSh2ZWNEb3QobmltZywgaTAsIGUpPD1lTXEpIGkwKz00O1xuXHRcdHdoaWxlKHZlY0RvdChuaW1nLCBpMSwgZSk+IGVNcSkgaTEtPTQ7XG5cdFx0aWYoaTA+PWkxKSBicmVhaztcblx0XHRcblx0XHR2YXIgdCA9IG5pbWczMltpMD4+Ml07ICBuaW1nMzJbaTA+PjJdID0gbmltZzMyW2kxPj4yXTsgIG5pbWczMltpMT4+Ml09dDtcblx0XHRcblx0XHRpMCs9NDsgIGkxLT00O1xuXHR9XG5cdHdoaWxlKHZlY0RvdChuaW1nLCBpMCwgZSk+ZU1xKSBpMC09NDtcblx0cmV0dXJuIGkwKzQ7XG59XG5VUE5HLnF1YW50aXplLnZlY0RvdCA9IGZ1bmN0aW9uKG5pbWcsIGksIGUpXG57XG5cdHJldHVybiBuaW1nW2ldKmVbMF0gKyBuaW1nW2krMV0qZVsxXSArIG5pbWdbaSsyXSplWzJdICsgbmltZ1tpKzNdKmVbM107XG59XG5VUE5HLnF1YW50aXplLnN0YXRzID0gZnVuY3Rpb24obmltZywgaTAsIGkxKXtcblx0dmFyIFIgPSBbMCwwLDAsMCwgIDAsMCwwLDAsICAwLDAsMCwwLCAgMCwwLDAsMF07XG5cdHZhciBtID0gWzAsMCwwLDBdO1xuXHR2YXIgTiA9IChpMS1pMCk+PjI7XG5cdGZvcih2YXIgaT1pMDsgaTxpMTsgaSs9NClcblx0e1xuXHRcdHZhciByID0gbmltZ1tpXSooMS8yNTUpLCBnID0gbmltZ1tpKzFdKigxLzI1NSksIGIgPSBuaW1nW2krMl0qKDEvMjU1KSwgYSA9IG5pbWdbaSszXSooMS8yNTUpO1xuXHRcdC8vdmFyIHIgPSBuaW1nW2ldLCBnID0gbmltZ1tpKzFdLCBiID0gbmltZ1tpKzJdLCBhID0gbmltZ1tpKzNdO1xuXHRcdG1bMF0rPXI7ICBtWzFdKz1nOyAgbVsyXSs9YjsgIG1bM10rPWE7XG5cdFx0XG5cdFx0UlsgMF0gKz0gcipyOyAgUlsgMV0gKz0gcipnOyAgUlsgMl0gKz0gcipiOyAgUlsgM10gKz0gciphOyAgXG5cdFx0ICAgICAgICAgICAgICAgUlsgNV0gKz0gZypnOyAgUlsgNl0gKz0gZypiOyAgUlsgN10gKz0gZyphOyBcblx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSWzEwXSArPSBiKmI7ICBSWzExXSArPSBiKmE7ICBcblx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSWzE1XSArPSBhKmE7ICBcblx0fVxuXHRSWzRdPVJbMV07ICBSWzhdPVJbMl07ICBSWzldPVJbNl07ICBSWzEyXT1SWzNdOyAgUlsxM109Uls3XTsgIFJbMTRdPVJbMTFdO1xuXHRcblx0cmV0dXJuIHtSOlIsIG06bSwgTjpOfTtcbn1cblVQTkcucXVhbnRpemUuZXN0YXRzID0gZnVuY3Rpb24oc3RhdHMpe1xuXHR2YXIgUiA9IHN0YXRzLlIsIG0gPSBzdGF0cy5tLCBOID0gc3RhdHMuTjtcblx0XG5cdC8vIHdoZW4gYWxsIHNhbXBsZXMgYXJlIGVxdWFsLCBidXQgTiBpcyBsYXJnZSAobWlsbGlvbnMpLCB0aGUgUmogY2FuIGJlIG5vbi16ZXJvICggMC4wMDAzLi4uLiAtIHByZWNpc3Npb24gZXJyb3IpXG5cdHZhciBtMCA9IG1bMF0sIG0xID0gbVsxXSwgbTIgPSBtWzJdLCBtMyA9IG1bM10sIGlOID0gKE49PTAgPyAwIDogMS9OKTtcblx0dmFyIFJqID0gW1xuXHRcdFJbIDBdIC0gbTAqbTAqaU4sICBSWyAxXSAtIG0wKm0xKmlOLCAgUlsgMl0gLSBtMCptMippTiwgIFJbIDNdIC0gbTAqbTMqaU4sICBcblx0XHRSWyA0XSAtIG0xKm0wKmlOLCAgUlsgNV0gLSBtMSptMSppTiwgIFJbIDZdIC0gbTEqbTIqaU4sICBSWyA3XSAtIG0xKm0zKmlOLFxuXHRcdFJbIDhdIC0gbTIqbTAqaU4sICBSWyA5XSAtIG0yKm0xKmlOLCAgUlsxMF0gLSBtMiptMippTiwgIFJbMTFdIC0gbTIqbTMqaU4sICBcblx0XHRSWzEyXSAtIG0zKm0wKmlOLCAgUlsxM10gLSBtMyptMSppTiwgIFJbMTRdIC0gbTMqbTIqaU4sICBSWzE1XSAtIG0zKm0zKmlOIFxuXHRdO1xuXHRcblx0dmFyIEEgPSBSaiwgTSA9IFVQTkcuTTQ7XG5cdHZhciBiID0gWzAuNSwwLjUsMC41LDAuNV0sIG1pID0gMCwgdG1pID0gMDtcblx0XG5cdGlmKE4hPTApXG5cdGZvcih2YXIgaT0wOyBpPDEwOyBpKyspIHtcblx0XHRiID0gTS5tdWx0VmVjKEEsIGIpOyAgdG1pID0gTWF0aC5zcXJ0KE0uZG90KGIsYikpOyAgYiA9IE0uc21sKDEvdG1pLCAgYik7XG5cdFx0aWYoTWF0aC5hYnModG1pLW1pKTwxZS05KSBicmVhazsgIG1pID0gdG1pO1xuXHR9XHRcblx0Ly9iID0gWzAsMCwxLDBdOyAgbWk9Tjtcblx0dmFyIHEgPSBbbTAqaU4sIG0xKmlOLCBtMippTiwgbTMqaU5dO1xuXHR2YXIgZU1xMjU1ID0gTS5kb3QoTS5zbWwoMjU1LHEpLGIpO1xuXHRcblx0cmV0dXJuIHsgIENvdjpSaiwgcTpxLCBlOmIsIEw6bWksICBlTXEyNTU6ZU1xMjU1LCBlTXEgOiBNLmRvdChiLHEpLFxuXHRcdFx0XHRyZ2JhOiAoKChNYXRoLnJvdW5kKDI1NSpxWzNdKTw8MjQpIHwgKE1hdGgucm91bmQoMjU1KnFbMl0pPDwxNikgfCAgKE1hdGgucm91bmQoMjU1KnFbMV0pPDw4KSB8IChNYXRoLnJvdW5kKDI1NSpxWzBdKTw8MCkpPj4+MCkgIH07XG59XG5VUE5HLk00ID0ge1xuXHRtdWx0VmVjIDogZnVuY3Rpb24obSx2KSB7XG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRtWyAwXSp2WzBdICsgbVsgMV0qdlsxXSArIG1bIDJdKnZbMl0gKyBtWyAzXSp2WzNdLFxuXHRcdFx0XHRtWyA0XSp2WzBdICsgbVsgNV0qdlsxXSArIG1bIDZdKnZbMl0gKyBtWyA3XSp2WzNdLFxuXHRcdFx0XHRtWyA4XSp2WzBdICsgbVsgOV0qdlsxXSArIG1bMTBdKnZbMl0gKyBtWzExXSp2WzNdLFxuXHRcdFx0XHRtWzEyXSp2WzBdICsgbVsxM10qdlsxXSArIG1bMTRdKnZbMl0gKyBtWzE1XSp2WzNdXG5cdFx0XHRdO1xuXHR9LFxuXHRkb3QgOiBmdW5jdGlvbih4LHkpIHsgIHJldHVybiAgeFswXSp5WzBdK3hbMV0qeVsxXSt4WzJdKnlbMl0reFszXSp5WzNdOyAgfSxcblx0c21sIDogZnVuY3Rpb24oYSx5KSB7ICByZXR1cm4gW2EqeVswXSxhKnlbMV0sYSp5WzJdLGEqeVszXV07ICB9XG59XG5cblVQTkcuZW5jb2RlLmNvbmNhdFJHQkEgPSBmdW5jdGlvbihidWZzKSB7XG5cdHZhciB0bGVuID0gMDtcblx0Zm9yKHZhciBpPTA7IGk8YnVmcy5sZW5ndGg7IGkrKykgdGxlbiArPSBidWZzW2ldLmJ5dGVMZW5ndGg7XG5cdHZhciBuaW1nID0gbmV3IFVpbnQ4QXJyYXkodGxlbiksIG5vZmY9MDtcblx0Zm9yKHZhciBpPTA7IGk8YnVmcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBpbWcgPSBuZXcgVWludDhBcnJheShidWZzW2ldKSwgaWwgPSBpbWcubGVuZ3RoO1xuXHRcdGZvcih2YXIgaj0wOyBqPGlsOyBqKz00KSB7ICBcblx0XHRcdHZhciByPWltZ1tqXSwgZz1pbWdbaisxXSwgYj1pbWdbaisyXSwgYSA9IGltZ1tqKzNdO1xuXHRcdFx0aWYoYT09MCkgcj1nPWI9MDtcblx0XHRcdG5pbWdbbm9mZitqXT1yOyAgbmltZ1tub2ZmK2orMV09ZzsgIG5pbWdbbm9mZitqKzJdPWI7ICBuaW1nW25vZmYraiszXT1hOyAgfVxuXHRcdG5vZmYgKz0gaWw7XG5cdH1cblx0cmV0dXJuIG5pbWcuYnVmZmVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBVUE5HO1xuXG4iLCJ2YXIgZ2V0RGVmYXVsdFBhcmVudCA9IGZ1bmN0aW9uIChvcmlnaW5hbFRhcmdldCkge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgc2FtcGxlVGFyZ2V0ID0gQXJyYXkuaXNBcnJheShvcmlnaW5hbFRhcmdldCkgPyBvcmlnaW5hbFRhcmdldFswXSA6IG9yaWdpbmFsVGFyZ2V0O1xuICAgIHJldHVybiBzYW1wbGVUYXJnZXQub3duZXJEb2N1bWVudC5ib2R5O1xufTtcbnZhciBjb3VudGVyTWFwID0gbmV3IFdlYWtNYXAoKTtcbnZhciB1bmNvbnRyb2xsZWROb2RlcyA9IG5ldyBXZWFrTWFwKCk7XG52YXIgbWFya2VyTWFwID0ge307XG52YXIgbG9ja0NvdW50ID0gMDtcbnZhciB1bndyYXBIb3N0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZSAmJiAobm9kZS5ob3N0IHx8IHVud3JhcEhvc3Qobm9kZS5wYXJlbnROb2RlKSk7XG59O1xudmFyIGNvcnJlY3RUYXJnZXRzID0gZnVuY3Rpb24gKHBhcmVudCwgdGFyZ2V0cykge1xuICAgIHJldHVybiB0YXJnZXRzXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICBpZiAocGFyZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvcnJlY3RlZFRhcmdldCA9IHVud3JhcEhvc3QodGFyZ2V0KTtcbiAgICAgICAgaWYgKGNvcnJlY3RlZFRhcmdldCAmJiBwYXJlbnQuY29udGFpbnMoY29ycmVjdGVkVGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcnJlY3RlZFRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmVycm9yKCdhcmlhLWhpZGRlbicsIHRhcmdldCwgJ2luIG5vdCBjb250YWluZWQgaW5zaWRlJywgcGFyZW50LCAnLiBEb2luZyBub3RoaW5nJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0pXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIEJvb2xlYW4oeCk7IH0pO1xufTtcbi8qKlxuICogTWFya3MgZXZlcnl0aGluZyBleGNlcHQgZ2l2ZW4gbm9kZShvciBub2RlcykgYXMgYXJpYS1oaWRkZW5cbiAqIEBwYXJhbSB7RWxlbWVudCB8IEVsZW1lbnRbXX0gb3JpZ2luYWxUYXJnZXQgLSBlbGVtZW50cyB0byBrZWVwIG9uIHRoZSBwYWdlXG4gKiBAcGFyYW0gW3BhcmVudE5vZGVdIC0gdG9wIGVsZW1lbnQsIGRlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBbbWFya2VyTmFtZV0gLSBhIHNwZWNpYWwgYXR0cmlidXRlIHRvIG1hcmsgZXZlcnkgbm9kZVxuICogQHBhcmFtIHtTdHJpbmd9IFtjb250cm9sQXR0cmlidXRlXSAtIGh0bWwgQXR0cmlidXRlIHRvIGNvbnRyb2xcbiAqIEByZXR1cm4ge1VuZG99IHVuZG8gY29tbWFuZFxuICovXG52YXIgYXBwbHlBdHRyaWJ1dGVUb090aGVycyA9IGZ1bmN0aW9uIChvcmlnaW5hbFRhcmdldCwgcGFyZW50Tm9kZSwgbWFya2VyTmFtZSwgY29udHJvbEF0dHJpYnV0ZSkge1xuICAgIHZhciB0YXJnZXRzID0gY29ycmVjdFRhcmdldHMocGFyZW50Tm9kZSwgQXJyYXkuaXNBcnJheShvcmlnaW5hbFRhcmdldCkgPyBvcmlnaW5hbFRhcmdldCA6IFtvcmlnaW5hbFRhcmdldF0pO1xuICAgIGlmICghbWFya2VyTWFwW21hcmtlck5hbWVdKSB7XG4gICAgICAgIG1hcmtlck1hcFttYXJrZXJOYW1lXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgfVxuICAgIHZhciBtYXJrZXJDb3VudGVyID0gbWFya2VyTWFwW21hcmtlck5hbWVdO1xuICAgIHZhciBoaWRkZW5Ob2RlcyA9IFtdO1xuICAgIHZhciBlbGVtZW50c1RvS2VlcCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZWxlbWVudHNUb1N0b3AgPSBuZXcgU2V0KHRhcmdldHMpO1xuICAgIHZhciBrZWVwID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIGlmICghZWwgfHwgZWxlbWVudHNUb0tlZXAuaGFzKGVsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzVG9LZWVwLmFkZChlbCk7XG4gICAgICAgIGtlZXAoZWwucGFyZW50Tm9kZSk7XG4gICAgfTtcbiAgICB0YXJnZXRzLmZvckVhY2goa2VlcCk7XG4gICAgdmFyIGRlZXAgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgIGlmICghcGFyZW50IHx8IGVsZW1lbnRzVG9TdG9wLmhhcyhwYXJlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChwYXJlbnQuY2hpbGRyZW4sIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudHNUb0tlZXAuaGFzKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgZGVlcChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRyID0gbm9kZS5nZXRBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhbHJlYWR5SGlkZGVuID0gYXR0ciAhPT0gbnVsbCAmJiBhdHRyICE9PSAnZmFsc2UnO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRlclZhbHVlID0gKGNvdW50ZXJNYXAuZ2V0KG5vZGUpIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmtlclZhbHVlID0gKG1hcmtlckNvdW50ZXIuZ2V0KG5vZGUpIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlck1hcC5zZXQobm9kZSwgY291bnRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ291bnRlci5zZXQobm9kZSwgbWFya2VyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlclZhbHVlID09PSAxICYmIGFscmVhZHlIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuY29udHJvbGxlZE5vZGVzLnNldChub2RlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobWFya2VyVmFsdWUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG1hcmtlck5hbWUsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5SGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShjb250cm9sQXR0cmlidXRlLCAndHJ1ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2FyaWEtaGlkZGVuOiBjYW5ub3Qgb3BlcmF0ZSBvbiAnLCBub2RlLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgZGVlcChwYXJlbnROb2RlKTtcbiAgICBlbGVtZW50c1RvS2VlcC5jbGVhcigpO1xuICAgIGxvY2tDb3VudCsrO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGhpZGRlbk5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHZhciBjb3VudGVyVmFsdWUgPSBjb3VudGVyTWFwLmdldChub2RlKSAtIDE7XG4gICAgICAgICAgICB2YXIgbWFya2VyVmFsdWUgPSBtYXJrZXJDb3VudGVyLmdldChub2RlKSAtIDE7XG4gICAgICAgICAgICBjb3VudGVyTWFwLnNldChub2RlLCBjb3VudGVyVmFsdWUpO1xuICAgICAgICAgICAgbWFya2VyQ291bnRlci5zZXQobm9kZSwgbWFya2VyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFjb3VudGVyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXVuY29udHJvbGxlZE5vZGVzLmhhcyhub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShjb250cm9sQXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdW5jb250cm9sbGVkTm9kZXMuZGVsZXRlKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtYXJrZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG1hcmtlck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbG9ja0NvdW50LS07XG4gICAgICAgIGlmICghbG9ja0NvdW50KSB7XG4gICAgICAgICAgICAvLyBjbGVhclxuICAgICAgICAgICAgY291bnRlck1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICBjb3VudGVyTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgICAgIHVuY29udHJvbGxlZE5vZGVzID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgICAgIG1hcmtlck1hcCA9IHt9O1xuICAgICAgICB9XG4gICAgfTtcbn07XG4vKipcbiAqIE1hcmtzIGV2ZXJ5dGhpbmcgZXhjZXB0IGdpdmVuIG5vZGUob3Igbm9kZXMpIGFzIGFyaWEtaGlkZGVuXG4gKiBAcGFyYW0ge0VsZW1lbnQgfCBFbGVtZW50W119IG9yaWdpbmFsVGFyZ2V0IC0gZWxlbWVudHMgdG8ga2VlcCBvbiB0aGUgcGFnZVxuICogQHBhcmFtIFtwYXJlbnROb2RlXSAtIHRvcCBlbGVtZW50LCBkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5XG4gKiBAcGFyYW0ge1N0cmluZ30gW21hcmtlck5hbWVdIC0gYSBzcGVjaWFsIGF0dHJpYnV0ZSB0byBtYXJrIGV2ZXJ5IG5vZGVcbiAqIEByZXR1cm4ge1VuZG99IHVuZG8gY29tbWFuZFxuICovXG5leHBvcnQgdmFyIGhpZGVPdGhlcnMgPSBmdW5jdGlvbiAob3JpZ2luYWxUYXJnZXQsIHBhcmVudE5vZGUsIG1hcmtlck5hbWUpIHtcbiAgICBpZiAobWFya2VyTmFtZSA9PT0gdm9pZCAwKSB7IG1hcmtlck5hbWUgPSAnZGF0YS1hcmlhLWhpZGRlbic7IH1cbiAgICB2YXIgdGFyZ2V0cyA9IEFycmF5LmZyb20oQXJyYXkuaXNBcnJheShvcmlnaW5hbFRhcmdldCkgPyBvcmlnaW5hbFRhcmdldCA6IFtvcmlnaW5hbFRhcmdldF0pO1xuICAgIHZhciBhY3RpdmVQYXJlbnROb2RlID0gcGFyZW50Tm9kZSB8fCBnZXREZWZhdWx0UGFyZW50KG9yaWdpbmFsVGFyZ2V0KTtcbiAgICBpZiAoIWFjdGl2ZVBhcmVudE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgfVxuICAgIC8vIHdlIHNob3VsZCBub3QgaGlkZSBhcmlhTGl2ZSBlbGVtZW50cyAtIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVLYXNoZXkvYXJpYS1oaWRkZW4vaXNzdWVzLzEwXG4gICAgdGFyZ2V0cy5wdXNoLmFwcGx5KHRhcmdldHMsIEFycmF5LmZyb20oYWN0aXZlUGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdbYXJpYS1saXZlXScpKSk7XG4gICAgcmV0dXJuIGFwcGx5QXR0cmlidXRlVG9PdGhlcnModGFyZ2V0cywgYWN0aXZlUGFyZW50Tm9kZSwgbWFya2VyTmFtZSwgJ2FyaWEtaGlkZGVuJyk7XG59O1xuLyoqXG4gKiBNYXJrcyBldmVyeXRoaW5nIGV4Y2VwdCBnaXZlbiBub2RlKG9yIG5vZGVzKSBhcyBpbmVydFxuICogQHBhcmFtIHtFbGVtZW50IHwgRWxlbWVudFtdfSBvcmlnaW5hbFRhcmdldCAtIGVsZW1lbnRzIHRvIGtlZXAgb24gdGhlIHBhZ2VcbiAqIEBwYXJhbSBbcGFyZW50Tm9kZV0gLSB0b3AgZWxlbWVudCwgZGVmYXVsdHMgdG8gZG9jdW1lbnQuYm9keVxuICogQHBhcmFtIHtTdHJpbmd9IFttYXJrZXJOYW1lXSAtIGEgc3BlY2lhbCBhdHRyaWJ1dGUgdG8gbWFyayBldmVyeSBub2RlXG4gKiBAcmV0dXJuIHtVbmRvfSB1bmRvIGNvbW1hbmRcbiAqL1xuZXhwb3J0IHZhciBpbmVydE90aGVycyA9IGZ1bmN0aW9uIChvcmlnaW5hbFRhcmdldCwgcGFyZW50Tm9kZSwgbWFya2VyTmFtZSkge1xuICAgIGlmIChtYXJrZXJOYW1lID09PSB2b2lkIDApIHsgbWFya2VyTmFtZSA9ICdkYXRhLWluZXJ0LWVkJzsgfVxuICAgIHZhciBhY3RpdmVQYXJlbnROb2RlID0gcGFyZW50Tm9kZSB8fCBnZXREZWZhdWx0UGFyZW50KG9yaWdpbmFsVGFyZ2V0KTtcbiAgICBpZiAoIWFjdGl2ZVBhcmVudE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgfVxuICAgIHJldHVybiBhcHBseUF0dHJpYnV0ZVRvT3RoZXJzKG9yaWdpbmFsVGFyZ2V0LCBhY3RpdmVQYXJlbnROb2RlLCBtYXJrZXJOYW1lLCAnaW5lcnQnKTtcbn07XG4vKipcbiAqIEByZXR1cm5zIGlmIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBpbmVydFxuICovXG5leHBvcnQgdmFyIHN1cHBvcnRzSW5lcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgSFRNTEVsZW1lbnQucHJvdG90eXBlLmhhc093blByb3BlcnR5KCdpbmVydCcpO1xufTtcbi8qKlxuICogQXV0b21hdGljIGZ1bmN0aW9uIHRvIFwic3VwcHJlc3NcIiBET00gZWxlbWVudHMgLSBfaGlkZV8gb3IgX2luZXJ0XyBpbiB0aGUgYmVzdCBwb3NzaWJsZSB3YXlcbiAqIEBwYXJhbSB7RWxlbWVudCB8IEVsZW1lbnRbXX0gb3JpZ2luYWxUYXJnZXQgLSBlbGVtZW50cyB0byBrZWVwIG9uIHRoZSBwYWdlXG4gKiBAcGFyYW0gW3BhcmVudE5vZGVdIC0gdG9wIGVsZW1lbnQsIGRlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBbbWFya2VyTmFtZV0gLSBhIHNwZWNpYWwgYXR0cmlidXRlIHRvIG1hcmsgZXZlcnkgbm9kZVxuICogQHJldHVybiB7VW5kb30gdW5kbyBjb21tYW5kXG4gKi9cbmV4cG9ydCB2YXIgc3VwcHJlc3NPdGhlcnMgPSBmdW5jdGlvbiAob3JpZ2luYWxUYXJnZXQsIHBhcmVudE5vZGUsIG1hcmtlck5hbWUpIHtcbiAgICBpZiAobWFya2VyTmFtZSA9PT0gdm9pZCAwKSB7IG1hcmtlck5hbWUgPSAnZGF0YS1zdXBwcmVzc2VkJzsgfVxuICAgIHJldHVybiAoc3VwcG9ydHNJbmVydCgpID8gaW5lcnRPdGhlcnMgOiBoaWRlT3RoZXJzKShvcmlnaW5hbFRhcmdldCwgcGFyZW50Tm9kZSwgbWFya2VyTmFtZSk7XG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyBIZWxtZXQgfSBmcm9tIFwicmVhY3QtaGVsbWV0XCI7XHJcblxyXG5mdW5jdGlvbiBUaXRsZSh7IHRpdGxlLCBkcml2ZSB9KSB7XHJcbiAgcmV0dXJuIChcclxuICAgIDxIZWxtZXQ+XHJcbiAgICAgIDx0aXRsZT57ZHJpdmUgPyB0aXRsZSA6IGAke3RpdGxlfSAtIE9wZW5TaWdu4oSiYH08L3RpdGxlPlxyXG4gICAgICA8bWV0YSBuYW1lPVwiZGVzY3JpcHRpb25cIiBjb250ZW50PXtgJHt0aXRsZX0gLSBPcGVuU2lnbuKEomB9IC8+XHJcbiAgICAgIDxsaW5rXHJcbiAgICAgICAgcmVsPVwiaWNvblwiXHJcbiAgICAgICAgdHlwZT1cImltYWdlL3BuZ1wiXHJcbiAgICAgICAgaHJlZj17bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJmZXZfSWNvblwiKX1cclxuICAgICAgICBzaXplcz1cIjQweDQwXCJcclxuICAgICAgLz5cclxuICAgIDwvSGVsbWV0PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRpdGxlO1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmZ1bmN0aW9uIEJvcmRlclJlc2l6ZSh7IHJpZ2h0LCB0b3AgfSkge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17YCR7cmlnaHQgPyBgLXJpZ2h0LVsxMnB4XWAgOiBcIi1yaWdodC1bMXB4XVwifSAke1xuICAgICAgICB0b3AgPyBgLWJvdHRvbS1bMTFweF1gIDogXCItYm90dG9tLVsxcHhdXCJcbiAgICAgIH0gYWJzb2x1dGUgaW5saW5lLWJsb2NrIHctWzE0cHhdIGgtWzE0cHhdIGhvdmVyOmN1cnNvci1zdy1yZXNpemUgYm9yZGVyLXItWzNweF0gYm9yZGVyLWItWzNweF0gYm9yZGVyLVsjMTg4YWUyXWB9XG4gICAgPjwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBCb3JkZXJSZXNpemU7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmZ1bmN0aW9uIERlZmF1bHRTaWduYXR1cmUoeyBkZWZhdWx0U2lnbkltZywgeHlQb3N0aW9uLCBzZXREZWZhdWx0U2lnbkFsZXJ0IH0pIHtcclxuICBjb25zdCBjb25maXJtVG9hZGREZWZhdWx0U2lnbiA9ICgpID0+IHtcclxuICAgIGlmICh4eVBvc3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICBzZXREZWZhdWx0U2lnbkFsZXJ0KHtcclxuICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgYWxlcnRNZXNzYWdlOlxyXG4gICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gYXV0byBzaWduIGF0IHJlcXVlc3RlZCBhbGwgbG9jYXRpb25zP1wiXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2V0RGVmYXVsdFNpZ25BbGVydCh7XHJcbiAgICAgICAgaXNTaG93OiB0cnVlLFxyXG4gICAgICAgIGFsZXJ0TWVzc2FnZTogXCJwbGVhc2Ugc2VsZWN0IHBvc2l0aW9uIVwiXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGRhdGEtdHV0PVwicmVhY3RvdXJUaGlyZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LTIgcHItMiBwdC0yIHBiLTEgdGV4dC1bMTVweF0gdGV4dC1iYXNlLWNvbnRlbnQgZm9udC1zZW1pYm9sZCBib3JkZXItYi1bMXB4XSBib3JkZXItYmFzZS0zMDBcIj5cclxuICAgICAgICBTaWduYXR1cmVcclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgbXQtWzEwcHhdIGZvbnQtc2VtaWJvbGRcIj5cclxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UtY29udGVudFwiPllvdXIgU2lnbmF0dXJlPC9wPlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtY2FyZCBzaGFkb3ctbWQgaC1bMTExcHhdIHctWzkwJV0gcC0yXCI+XHJcbiAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgIGFsdD1cInNpZ25hdHVyZVwiXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgb2JqZWN0LWNvbnRhaW5cIlxyXG4gICAgICAgICAgICBzcmM9e2RlZmF1bHRTaWduSW1nfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gbXQtWzEwcHhdXCJcclxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGNvbmZpcm1Ub2FkZERlZmF1bHRTaWduKCl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgQXV0byBTaWduIEFsbFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERlZmF1bHRTaWduYXR1cmU7XHJcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByZXZOZXh0IGZyb20gXCIuL1ByZXZOZXh0XCI7XG5pbXBvcnQge1xuICBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlLFxuICBoYW5kbGVEb3dubG9hZFBkZixcbiAgaGFuZGxlVG9QcmludFxufSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcbmltcG9ydCBcIi4uLy4uL3N0eWxlcy9zaWduYXR1cmUuY3NzXCI7XG5pbXBvcnQgKiBhcyBEcm9wZG93bk1lbnUgZnJvbSBcIkByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51XCI7XG5pbXBvcnQgTW9kYWxVaSBmcm9tIFwiLi4vLi4vcHJpbWl0aXZlcy9Nb2RhbFVpXCI7XG5pbXBvcnQgTG9hZGVyIGZyb20gXCIuLi8uLi9wcmltaXRpdmVzL0xvYWRlclwiO1xuXG5mdW5jdGlvbiBIZWFkZXIoe1xuICBpc1BkZlJlcXVlc3RGaWxlcyxcbiAgaXNQbGFjZWhvbGRlcixcbiAgc2V0SXNEZWNsaW5lLFxuICBwYWdlTnVtYmVyLFxuICBhbGxQYWdlcyxcbiAgY2hhbmdlUGFnZSxcbiAgcGRmVXJsLFxuICBlbWJlZFdpZGdldHNEYXRhLFxuICBwZGZEZXRhaWxzLFxuICBzaWduZXJQb3MsXG4gIHNpZ25lcnNkYXRhLFxuICBpc01haWxTZW5kLFxuICBhbGVydFNlbmRFbWFpbCxcbiAgaXNDb21wbGV0ZWQsXG4gIGlzU2hvd0hlYWRlcixcbiAgZGVjbGluZSxcbiAgY3VycmVudFNpZ25lcixcbiAgYWxyZWFkeVNpZ24sXG4gIGlzU2lnbllvdXJzZWxmLFxuICBzZXRJc0VtYWlsLFxuICBjb21wbGV0ZUJ0blRpdGxlLFxuICBzZXRJc0VkaXRUZW1wbGF0ZSxcbiAgaXNQdWJsaWNUZW1wbGF0ZVxufSkge1xuICBjb25zdCBmaWx0ZXJQcmVmaWxsID1cbiAgICBzaWduZXJQb3MgJiYgc2lnbmVyUG9zPy5maWx0ZXIoKGRhdGEpID0+IGRhdGEuUm9sZSAhPT0gXCJwcmVmaWxsXCIpO1xuICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNzY3O1xuICBjb25zdCBbaXNEb3dubG9hZGluZywgc2V0SXNEb3dubG9hZGluZ10gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgaXNHdWVzdFNpZ25lciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNHdWVzdFNpZ25lclwiKTtcblxuICAvL2Z1bmN0aW9uIGZvciBzaG93IGRlY2xpbmUgYWxlcnRcbiAgY29uc3QgaGFuZGxlRGVjbGluZVBkZkFsZXJ0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnREZWNsaW5lID0geyBjdXJybnQ6IFwiU3VyZVwiLCBpc0RlY2xpbmVkOiB0cnVlIH07XG4gICAgc2V0SXNEZWNsaW5lKGN1cnJlbnREZWNsaW5lKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBweS1bNXB4XVwiPlxuICAgICAge2lzTW9iaWxlICYmIGlzU2hvd0hlYWRlciA/IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGlkPVwibmF2YmFyXCJcbiAgICAgICAgICBjbGFzc05hbWU9e2lzR3Vlc3RTaWduZXIgPyBcInN0aWNreVNpZ25lckhlYWRcIiA6IFwic3RpY2t5SGVhZFwifVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICB3aWR0aDogaXNHdWVzdFNpZ25lclxuICAgICAgICAgICAgICA/IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgICAgICAgICAgIDogd2luZG93LmlubmVyV2lkdGggLSAzMCArIFwicHhcIlxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBweS1bNXB4XSBweC1bMTBweF0gXCI+XG4gICAgICAgICAgICA8ZGl2IG9uQ2xpY2s9eygpID0+IHdpbmRvdy5oaXN0b3J5LmdvKC0yKX0+XG4gICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXJyb3ctbGVmdCB0ZXh0LWJhc2UtY29udGVudFwiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPFByZXZOZXh0XG4gICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XG4gICAgICAgICAgICAgIGFsbFBhZ2VzPXthbGxQYWdlc31cbiAgICAgICAgICAgICAgY2hhbmdlUGFnZT17Y2hhbmdlUGFnZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7cGRmVXJsICYmIGFscmVhZHlTaWduID8gKFxuICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlJvb3Q+XG4gICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5UcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm9wLWxpbmsgb3AtbGluay1wcmltYXJ5IG5vLXVuZGVybGluZSB0ZXh0LVsxNnB4XSBmb250LXNlbWlib2xkIHByLVszcHhdIHBsLVs1cHhdXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZWxsaXBzaXMtdlwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Qb3J0YWw+XG4gICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LkNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51Q29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgIHNpZGVPZmZzZXQ9ezV9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIkRyb3Bkb3duTWVudUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZFBkZihwZGZEZXRhaWxzLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hcnJvdy1kb3duIG1yLVszcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZFxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxuICAgICAgICAgICAgICAgICAgICB7aXNDb21wbGV0ZWQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItbm9uZSBiZy1bI2ZmZl1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hd2FyZCBtci1bM3B4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIHtpc1NpZ25Zb3Vyc2VsZiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJEcm9wZG93bk1lbnVJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRW1haWwodHJ1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZW52ZWxvcGUgbXItWzNweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIE1haWxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIkRyb3Bkb3duTWVudUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9QcmludChlLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1wcmludCBtci1bM3B4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuSXRlbT5cbiAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuUG9ydGFsPlxuICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Sb290PlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYXJvdW5kIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIHsvKiBjdXJyZW50IHNpZ25lciBpcyBjaGVja2luZyB1c2VyIHNlbmQgcmVxdWVzdCBhbmQgY2hlY2sgc3RhdHVzIG9mIHBkZiBzaWduIHRoYW4gaWYgY3VycmVudCBcbiAgICAgICAgICAgICAgICB1c2VyIGV4aXN0IHRoYW4gc2hvdyBmaW5pc2ggYnV0dG9uIGVsc2Ugbm9cbiAgICAgICAgICAgICAgICAqL31cbiAgICAgICAgICAgICAgICB7Y3VycmVudFNpZ25lciAmJiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyXCIgZGF0YS10dXQ9XCJyZWFjdG91ckZpZnRoXCI+XG4gICAgICAgICAgICAgICAgICAgIHtkZWNsaW5lICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVEZWNsaW5lUGRmQWxlcnQoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtW3JlZF0gYm9yZGVyLW5vbmUgZm9udC1bNjUwXSB0ZXh0LVsxNHB4XSBtci0yXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBEZWNsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIHtpc1BsYWNlaG9sZGVyID8gKFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc01haWxTZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnRTZW5kRW1haWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWFpbFNlbmQgPyBcIlwiIDogXCJvcC1saW5rLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBvcC1saW5rIG5vLXVuZGVybGluZSBmb250LVs2NTBdIHRleHQtWzE0cHhdYH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwiaGVhZGVyQXJlYVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbXBsZXRlQnRuVGl0bGUgPyBjb21wbGV0ZUJ0blRpdGxlIDogXCJTZW5kXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10dXQ9XCJyZWFjdG91clRoaXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwZGZVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWJlZFdpZGdldHNEYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQZGZSZXF1ZXN0RmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWJlZFdpZGdldHNEYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItbm9uZSBmb250LVs2NTBdIHRleHQtWzE0cHhdIG9wLWxpbmsgb3AtbGluay1wcmltYXJ5IG5vLXVuZGVybGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgRmluaXNoXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuUm9vdD5cbiAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9udC1bNjUwXSB0ZXh0LVsxOHB4XSBweC0yIG1sLVs0cHhdIHRleHQtYmFzZS1jb250ZW50IG5vLXVuZGVybGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWVsbGlwc2lzLXZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuUG9ydGFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Db250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLXdoaXRlIHNoYWRvdy1tZCByb3VuZGVkLWZ1bGwgcHgtMyBweS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZU9mZnNldD17NX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgdGV4dC1bMTNweF0gZm9jdXM6b3V0bGluZS1ub25lIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRQZGYoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZlVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hcnJvdy1kb3duIG1yLVszcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LVs1MDBdXCI+RG93bmxvYWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlBvcnRhbD5cbiAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuUm9vdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgdy1mdWxsIGdhcC15LTEgbWwtMVwiPlxuICAgICAgICAgIDxQcmV2TmV4dFxuICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cbiAgICAgICAgICAgIGFsbFBhZ2VzPXthbGxQYWdlc31cbiAgICAgICAgICAgIGNoYW5nZVBhZ2U9e2NoYW5nZVBhZ2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7aXNQbGFjZWhvbGRlciA/IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBteC1bMTAwcHhdIGxnOm14LTAgb3JkZXItbGFzdCBsZzpvcmRlci1ub25lXCI+XG4gICAgICAgICAgICAgICAgeyFpc01haWxTZW5kICYmXG4gICAgICAgICAgICAgICAgICBzaWduZXJzZGF0YS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICBzaWduZXJzZGF0YS5sZW5ndGggIT09IGZpbHRlclByZWZpbGwubGVuZ3RoICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICB7ZmlsdGVyUHJlZmlsbC5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxM3B4XSB0ZXh0LVsjZjU0MDVlXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQge3NpZ25lcnNkYXRhLmxlbmd0aCAtIGZpbHRlclByZWZpbGwubGVuZ3RofXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50cyBzaWduYXR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1bI2Y1NDA1ZV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIHtzaWduZXJzZGF0YS5sZW5ndGggLSBmaWx0ZXJQcmVmaWxsLmxlbmd0aH0gbW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGllbnRzIHNpZ25hdHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgIHtzZXRJc0VkaXRUZW1wbGF0ZSAmJiAoXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRWRpdFRlbXBsYXRlKHRydWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvdXRsaW5lLW5vbmUgYm9yZGVyLW5vbmUgdGV4dC1jZW50ZXIgbXItWzNweF1cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1nZWFyIGZhLWxnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB3aW5kb3cuaGlzdG9yeS5nbygtMil9XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tZ2hvc3Qgb3AtYnRuLXNtIG1yLVszcHhdXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBCYWNrXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzTWFpbFNlbmQgJiYgdHJ1ZX1cbiAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwiaGVhZGVyQXJlYVwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnkgb3AtYnRuLXNtIG1yLVszcHhdXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGFsZXJ0U2VuZEVtYWlsKCl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge2NvbXBsZXRlQnRuVGl0bGVcbiAgICAgICAgICAgICAgICAgICAgPyBjb21wbGV0ZUJ0blRpdGxlXG4gICAgICAgICAgICAgICAgICAgIDogaXNNYWlsU2VuZFxuICAgICAgICAgICAgICAgICAgICAgID8gXCJTZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwiU2VuZFwifVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICkgOiBpc1BkZlJlcXVlc3RGaWxlcyA/IChcbiAgICAgICAgICAgIGFscmVhZHlTaWduID8gKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gaGFuZGxlVG9QcmludChlLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpfVxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLW5ldXRyYWwgb3AtYnRuLXNtIG1yLVszcHhdIHNoYWRvd1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtcHJpbnQgcHktWzNweF1cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPlByaW50PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIHtpc0NvbXBsZXRlZCAmJiAoXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkQ2VydGlmaWNhdGUocGRmRGV0YWlscywgc2V0SXNEb3dubG9hZGluZylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXNlY29uZGFyeSBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hd2FyZCBweS1bM3B4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+Q2VydGlmaWNhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1zbSBtci1bM3B4XSBzaGFkb3dcIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRQZGYocGRmRGV0YWlscywgcGRmVXJsLCBzZXRJc0Rvd25sb2FkaW5nKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWRvd25sb2FkIHB5LVszcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj5Eb3dubG9hZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXhcIiBkYXRhLXR1dD1cInJlYWN0b3VyRmlmdGhcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB3aW5kb3cuaGlzdG9yeS5nbygtMil9XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tZ2hvc3Qgb3AtYnRuLXNtIG1yLVszcHhdXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBCYWNrXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAge2N1cnJlbnRTaWduZXIgJiYgKFxuICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tc2Vjb25kYXJ5IG9wLWJ0bi1zbSBtci1bM3B4XSBzaGFkb3dcIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZURlY2xpbmVQZGZBbGVydCgpfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgRGVjbGluZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBlbWJlZFdpZGdldHNEYXRhKCl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBGaW5pc2hcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLW5ldXRyYWwgb3AtYnRuLXNtIG1yLVszcHhdIHNoYWRvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkUGRmKHBkZkRldGFpbHMsIHBkZlVybCwgc2V0SXNEb3dubG9hZGluZylcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hcnJvdy1kb3duIGZvbnQtc2VtaWJvbGQgbGc6aGlkZGVuXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPkRvd25sb2FkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKVxuICAgICAgICAgICkgOiBpc0NvbXBsZXRlZCA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICB7aXNDb21wbGV0ZWQgJiYgKFxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZShwZGZEZXRhaWxzLCBzZXRJc0Rvd25sb2FkaW5nKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnkgb3AtYnRuLXNtIGdhcC0wIGZvbnQtbWVkaXVtIHRleHQtWzEycHhdIG1yLVszcHhdIHNoYWRvd1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXdhcmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2sgbWwtMVwiPkNlcnRpZmljYXRlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IGhhbmRsZVRvUHJpbnQoZSwgcGRmVXJsLCBzZXRJc0Rvd25sb2FkaW5nKX1cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLW5ldXRyYWwgb3AtYnRuLXNtIGdhcC0wIGZvbnQtbWVkaXVtIHRleHQtWzEycHhdIG1yLVszcHhdIHNoYWRvd1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1wcmludFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2sgbWwtMVwiPlByaW50PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gZ2FwLTAgZm9udC1tZWRpdW0gdGV4dC1bMTJweF0gbXItWzNweF0gc2hhZG93XCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRQZGYocGRmRGV0YWlscywgcGRmVXJsLCBzZXRJc0Rvd25sb2FkaW5nKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWRvd25sb2FkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9jayBtbC0xXCI+RG93bmxvYWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1pbmZvIG9wLWJ0bi1zbSBnYXAtMCBmb250LW1lZGl1bSB0ZXh0LVsxMnB4XSBtci1bM3B4XSBzaGFkb3dcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRW1haWwodHJ1ZSl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1lbnZlbG9wZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2sgbWwtMVwiPk1haWw8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IGlzUHVibGljVGVtcGxhdGUgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXhcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gIHNoYWRvd1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZW1iZWRXaWRnZXRzRGF0YSgpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgU2lnbiBOb3dcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4XCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB3aW5kb3cuaGlzdG9yeS5nbygtMil9XG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdCBvcC1idG4tc20gbXItWzNweF1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQmFja1xuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gbXItWzNweF1cIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghcGRmVXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtYmVkV2lkZ2V0c0RhdGEoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgRmluaXNoXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgICAge2lzRG93bmxvYWRpbmcgPT09IFwicGRmXCIgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIHotWzIwMF0gaW5zZXQtMCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBiZy1ibGFjayBiZy1vcGFjaXR5LTMwXCI+XG4gICAgICAgICAgPExvYWRlciAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICA8TW9kYWxVaVxuICAgICAgICBpc09wZW49e2lzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIn1cbiAgICAgICAgdGl0bGU9e1xuICAgICAgICAgIGlzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIlxuICAgICAgICAgICAgPyBcIkdlbmVyYXRpbmcgY2VydGlmaWNhdGVcIlxuICAgICAgICAgICAgOiBcIlBERiBEb3dubG9hZFwiXG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHNldElzRG93bmxvYWRpbmcoXCJcIil9XG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC0zIG1kOnAtNSB0ZXh0LVsxM3B4XSBtZDp0ZXh0LWJhc2UgdGV4dC1jZW50ZXIgdGV4dC1iYXNlLWNvbnRlbnRcIj5cbiAgICAgICAgICB7aXNEb3dubG9hZGluZyA9PT0gXCJjZXJ0aWZpY2F0ZVwifXtcIiBcIn1cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIFlvdXIgY29tcGxldGlvbiBjZXJ0aWZpY2F0ZSBpcyBiZWluZyBnZW5lcmF0ZWQuIFBsZWFzZSB3YWl0XG4gICAgICAgICAgICBtb21lbnRhcmlseS4gSWYgdGhlIGRvd25sb2FkIGRvZXNuJmFwb3M7dCBzdGFydCBzaG9ydGx5LCBjbGljayB0aGVcbiAgICAgICAgICAgIGJ1dHRvbiBhZ2Fpbi5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Nb2RhbFVpPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBIZWFkZXI7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmZ1bmN0aW9uIFBkZlpvb20ocHJvcHMpIHtcbiAgY29uc3Qgb25DbGlja1pvb21JbiA9ICgpID0+IHtcbiAgICBwcm9wcy5zZXRTY2FsZShwcm9wcy5zY2FsZSArIDAuMSAqIHByb3BzLnNjYWxlKTtcbiAgICBwcm9wcy5zZXRab29tUGVyY2VudChwcm9wcy56b29tUGVyY2VudCArIDEwKTtcbiAgfTtcbiAgY29uc3Qgb25DbGlja1pvb21PdXQgPSAoKSA9PiB7XG4gICAgaWYgKHByb3BzLnpvb21QZXJjZW50ID4gMCkge1xuICAgICAgaWYgKHByb3BzLnpvb21QZXJjZW50ID09PSAxMCkge1xuICAgICAgICBwcm9wcy5zZXRTY2FsZSgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3BzLnNldFNjYWxlKHByb3BzLnNjYWxlIC0gMC4xICogcHJvcHMuc2NhbGUpO1xuICAgICAgfVxuICAgICAgcHJvcHMuc2V0Wm9vbVBlcmNlbnQocHJvcHMuem9vbVBlcmNlbnQgLSAxMCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBoYW5kbGVSZXNldCA9ICgpID0+IHtcbiAgICBwcm9wcy5zZXRTY2FsZSgxKTtcbiAgICBwcm9wcy5zZXRab29tUGVyY2VudCgwKTtcbiAgfTtcbiAgcmV0dXJuIChcbiAgICAvLyBtZDptdC1bNDFweF0geGw6bXQtWzYzcHhdbXQ9W11cbiAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6ZmxleCBmbGV4LWNvbCBnYXAtMSB0ZXh0LWNlbnRlciBtZDp3LVs1JV0gbXQtWzUwcHhdIDJ4bDptdC1bNjNweF1cIj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzTmFtZT1cImJnLWdyYXktNTAgcHgtWzRweF0gMnhsOnB4LVsxNXB4XSAyeGw6cHktWzEwcHhdIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgb25DbGljaz17b25DbGlja1pvb21Jbn1cbiAgICAgICAgdGl0bGU9XCJab29tIGluXCJcbiAgICAgID5cbiAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtbWFnbmlmeWluZy1nbGFzcy1wbHVzIHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdXCI+PC9pPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3NOYW1lPVwiYmctZ3JheS01MCBweC1bNHB4XSAyeGw6cHgtWzE1cHhdIDJ4bDpweS1bMTBweF0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICBvbkNsaWNrPXtoYW5kbGVSZXNldH1cbiAgICAgICAgdGl0bGU9XCJSZXNldFwiXG4gICAgICA+XG4gICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLW1hZ25pZnlpbmctZ2xhc3MtYXJyb3dzLXJvdGF0ZSB0ZXh0LWdyYXktNTAwIDJ4bDp0ZXh0LVszMHB4XVwiPjwvaT5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzTmFtZT1cImJnLWdyYXktNTAgcHgtWzRweF0gMnhsOnB4LVsxNXB4XSAyeGw6cHktWzEwcHhdXCJcbiAgICAgICAgb25DbGljaz17b25DbGlja1pvb21PdXR9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgY3Vyc29yOiBwcm9wcy56b29tUGVyY2VudCA+IDAgPyBcInBvaW50ZXJcIiA6IFwiZGVmYXVsdFwiXG4gICAgICAgIH19XG4gICAgICAgIHRpdGxlPVwiWm9vbSBvdXRcIlxuICAgICAgPlxuICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1tYWduaWZ5aW5nLWdsYXNzLW1pbnVzIHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdXCI+PC9pPlxuICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGRmWm9vbTtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCBCb3JkZXJSZXNpemUgZnJvbSBcIi4vQm9yZGVyUmVzaXplXCI7XHJcbmltcG9ydCBQbGFjZWhvbGRlckJvcmRlciBmcm9tIFwiLi9QbGFjZWhvbGRlckJvcmRlclwiO1xyXG5pbXBvcnQgeyBSbmQgfSBmcm9tIFwicmVhY3Qtcm5kXCI7XHJcbmltcG9ydCB7XHJcbiAgZGVmYXVsdFdpZHRoSGVpZ2h0LFxyXG4gIGdldENvbnRhaW5lclNjYWxlLFxyXG4gIGhhbmRsZUNvcHlOZXh0VG9XaWRnZXQsXHJcbiAgaXNUYWJBbmRNb2JpbGUsXHJcbiAgb25DaGFuZ2VJbnB1dCxcclxuICByYWRpb0J1dHRvbldpZGdldCxcclxuICB0ZXh0SW5wdXRXaWRnZXQsXHJcbiAgdGV4dFdpZGdldFxyXG59IGZyb20gXCIuLi8uLi9jb25zdGFudC9VdGlsc1wiO1xyXG5pbXBvcnQgUGxhY2Vob2xkZXJUeXBlIGZyb20gXCIuL1BsYWNlaG9sZGVyVHlwZVwiO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuaW1wb3J0IFwiLi4vLi4vc3R5bGVzL29wZW5zaWduZHJpdmUuY3NzXCI7XHJcblxyXG5jb25zdCBzZWxlY3RGb3JtYXQgPSAoZGF0YSkgPT4ge1xyXG4gIHN3aXRjaCAoZGF0YSkge1xyXG4gICAgY2FzZSBcIkxcIjpcclxuICAgICAgcmV0dXJuIFwiTU0vZGQveXl5eVwiO1xyXG4gICAgY2FzZSBcIkRELU1NLVlZWVlcIjpcclxuICAgICAgcmV0dXJuIFwiZGQtTU0teXl5eVwiO1xyXG4gICAgY2FzZSBcIkREL01NL1lZWVlcIjpcclxuICAgICAgcmV0dXJuIFwiZGQvTU0veXl5eVwiO1xyXG4gICAgY2FzZSBcIkxMXCI6XHJcbiAgICAgIHJldHVybiBcIk1NTU0gZGQsIHl5eXlcIjtcclxuICAgIGNhc2UgXCJERCBNTU0sIFlZWVlcIjpcclxuICAgICAgcmV0dXJuIFwiZGQgTU1NLCB5eXl5XCI7XHJcbiAgICBjYXNlIFwiWVlZWS1NTS1ERFwiOlxyXG4gICAgICByZXR1cm4gXCJ5eXl5LU1NLWRkXCI7XHJcbiAgICBjYXNlIFwiTU0tREQtWVlZWVwiOlxyXG4gICAgICByZXR1cm4gXCJNTS1kZC15eXl5XCI7XHJcbiAgICBjYXNlIFwiTU0uREQuWVlZWVwiOlxyXG4gICAgICByZXR1cm4gXCJNTS5kZC55eXl5XCI7XHJcbiAgICBjYXNlIFwiTU1NIERELCBZWVlZXCI6XHJcbiAgICAgIHJldHVybiBcIk1NTSBkZCwgeXl5eVwiO1xyXG4gICAgY2FzZSBcIkREIE1NTU0sIFlZWVlcIjpcclxuICAgICAgcmV0dXJuIFwiZGQgTU1NTSwgeXl5eVwiO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIFwiTU0vZGQveXl5eVwiO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGNoYW5nZURhdGVUb01vbWVudEZvcm1hdCA9IChmb3JtYXQpID0+IHtcclxuICBzd2l0Y2ggKGZvcm1hdCkge1xyXG4gICAgY2FzZSBcIk1NL2RkL3l5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiTFwiO1xyXG4gICAgY2FzZSBcImRkLU1NLXl5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiREQtTU0tWVlZWVwiO1xyXG4gICAgY2FzZSBcImRkL01NL3l5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiREQvTU0vWVlZWVwiO1xyXG4gICAgY2FzZSBcIk1NTU0gZGQsIHl5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiTExcIjtcclxuICAgIGNhc2UgXCJkZCBNTU0sIHl5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiREQgTU1NLCBZWVlZXCI7XHJcbiAgICBjYXNlIFwieXl5eS1NTS1kZFwiOlxyXG4gICAgICByZXR1cm4gXCJZWVlZLU1NLUREXCI7XHJcbiAgICBjYXNlIFwiTU0tZGQteXl5eVwiOlxyXG4gICAgICByZXR1cm4gXCJNTS1ERC1ZWVlZXCI7XHJcbiAgICBjYXNlIFwiTU0uZGQueXl5eVwiOlxyXG4gICAgICByZXR1cm4gXCJNTS5ERC5ZWVlZXCI7XHJcbiAgICBjYXNlIFwiTU1NIGRkLCB5eXl5XCI6XHJcbiAgICAgIHJldHVybiBcIk1NTSBERCwgWVlZWVwiO1xyXG4gICAgY2FzZSBcImRkIE1NTU0sIHl5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiREQgTU1NTSwgWVlZWVwiO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIFwiTFwiO1xyXG4gIH1cclxufTtcclxuXHJcbi8vZnVuY3Rpb24gdG8gZ2V0IGRlZmF1bHQgZGF0ZVxyXG5jb25zdCBnZXREZWZhdWx0ZGF0ZSA9IChzZWxlY3RlZERhdGUsIGZvcm1hdCA9IFwiZGQtTU0teXl5eVwiKSA9PiB7XHJcbiAgbGV0IGRhdGU7XHJcbiAgaWYgKGZvcm1hdCAmJiBmb3JtYXQgPT09IFwiZGQtTU0teXl5eVwiKSB7XHJcbiAgICBjb25zdCBuZXdkYXRlID0gc2VsZWN0ZWREYXRlXHJcbiAgICAgID8gc2VsZWN0ZWREYXRlXHJcbiAgICAgIDogbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdChjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQoZm9ybWF0KSk7XHJcbiAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSBuZXdkYXRlLnNwbGl0KFwiLVwiKTtcclxuICAgIGRhdGUgPSBuZXcgRGF0ZShgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gKTtcclxuICB9IGVsc2Uge1xyXG4gICAgZGF0ZSA9IG5ldyBEYXRlKHNlbGVjdGVkRGF0ZSk7XHJcbiAgfVxyXG4gIGNvbnN0IHZhbHVlID0gZGF0ZTtcclxuICByZXR1cm4gdmFsdWU7XHJcbn07XHJcbi8vZnVuY3Rpb24gdG8gZ2V0IGRlZmF1bHQgZm9ybWF0XHJcbmNvbnN0IGdldERlZmF1bHRGb3JtYXQgPSAoZGF0ZUZvcm1hdCkgPT4gZGF0ZUZvcm1hdCB8fCBcIk1NL2RkL3l5eXlcIjtcclxuXHJcbmZ1bmN0aW9uIFBsYWNlaG9sZGVyKHByb3BzKSB7XHJcbiAgY29uc3QgW3BsYWNlaG9sZGVyQm9yZGVyLCBzZXRQbGFjZWhvbGRlckJvcmRlcl0gPSB1c2VTdGF0ZSh7IHc6IDAsIGg6IDAgfSk7XHJcbiAgY29uc3QgW2lzRHJhZ2dpbmdFbmFibGVkLCBzZXREcmFnZ2luZ0VuYWJsZWRdID0gdXNlU3RhdGUodHJ1ZSk7XHJcbiAgY29uc3QgW2lzU2hvd0RhdGVGb3JtYXQsIHNldElzU2hvd0RhdGVGb3JtYXRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtjb250YWluZXJTY2FsZSwgc2V0Q29udGFpbmVyU2NhbGVdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbc2VsZWN0RGF0ZSwgc2V0U2VsZWN0RGF0ZV0gPSB1c2VTdGF0ZSh7XHJcbiAgICBkYXRlOlxyXG4gICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJkYXRlXCJcclxuICAgICAgICA/IG1vbWVudChcclxuICAgICAgICAgICAgZ2V0RGVmYXVsdGRhdGUoXHJcbiAgICAgICAgICAgICAgcHJvcHM/LnBvcz8ub3B0aW9ucz8ucmVzcG9uc2UsXHJcbiAgICAgICAgICAgICAgcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXRcclxuICAgICAgICAgICAgKS5nZXRUaW1lKClcclxuICAgICAgICAgICkuZm9ybWF0KFxyXG4gICAgICAgICAgICBjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXQpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgOiBcIlwiLFxyXG4gICAgZm9ybWF0OlxyXG4gICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJkYXRlXCJcclxuICAgICAgICA/IGdldERlZmF1bHRGb3JtYXQocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXQpXHJcbiAgICAgICAgOiBcIlwiXHJcbiAgfSk7XHJcbiAgY29uc3QgW2RhdGVGb3JtYXQsIHNldERhdGVGb3JtYXRdID0gdXNlU3RhdGUoW10pO1xyXG4gIGNvbnN0IFtzdGFydERhdGUsIHNldFN0YXJ0RGF0ZV0gPSB1c2VTdGF0ZShcclxuICAgIHByb3BzLnBvcy50eXBlID09PSBcImRhdGVcIiAmJlxyXG4gICAgICBnZXREZWZhdWx0ZGF0ZShcclxuICAgICAgICBwcm9wcz8ucG9zPy5vcHRpb25zPy5yZXNwb25zZSxcclxuICAgICAgICBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LmZvcm1hdFxyXG4gICAgICApXHJcbiAgKTtcclxuICBjb25zdCBbZ2V0Q2hlY2tib3hSZW5kZXJXaWR0aCwgc2V0R2V0Q2hlY2tib3hSZW5kZXJXaWR0aF0gPSB1c2VTdGF0ZSh7XHJcbiAgICB3aWR0aDogbnVsbCxcclxuICAgIGhlaWdodDogbnVsbFxyXG4gIH0pO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgZ2V0UGRmUGFnZVdpZHRoID0gcHJvcHMucGRmT3JpZ2luYWxXSC5maW5kKFxyXG4gICAgICAoZGF0YSkgPT4gZGF0YS5wYWdlTnVtYmVyID09PSBwcm9wcy5wYWdlTnVtYmVyXHJcbiAgICApO1xyXG4gICAgc2V0Q29udGFpbmVyU2NhbGUocHJvcHMuY29udGFpbmVyV0gud2lkdGggLyBnZXRQZGZQYWdlV2lkdGgud2lkdGgpO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtwcm9wcy5jb250YWluZXJXSC53aWR0aCwgcHJvcHMucGRmT3JpZ2luYWxXSF0pO1xyXG4gIGNvbnN0IGRhdGVGb3JtYXRBcnIgPSBbXHJcbiAgICBcIkxcIixcclxuICAgIFwiREQtTU0tWVlZWVwiLFxyXG4gICAgXCJZWVlZLU1NLUREXCIsXHJcbiAgICBcIk1NLkRELllZWVlcIixcclxuICAgIFwiTU0tREQtWVlZWVwiLFxyXG4gICAgXCJNTU0gREQsIFlZWVlcIixcclxuICAgIFwiTExcIixcclxuICAgIFwiREQgTU1NLCBZWVlZXCIsXHJcbiAgICBcIkREIE1NTU0sIFlZWVlcIlxyXG4gIF07XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCB1cGRhdGVXaWR0aCA9ICgpID0+IHtcclxuICAgICAgY29uc3Qgcm5kRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICBpZiAocm5kRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gcm5kRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBzZXRHZXRDaGVja2JveFJlbmRlcldpZHRoKHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBEZWxheSB0byBlbnN1cmUgcmVuZGVyaW5nIGlzIGNvbXBsZXRlXHJcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQodXBkYXRlV2lkdGgsIDApO1xyXG5cclxuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpO1xyXG4gIH0sIFtwcm9wcy5wb3NdKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IGNsb3NlTWVudU9uT3V0c2lkZUNsaWNrID0gKGUpID0+IHtcclxuICAgICAgaWYgKCFpc0RyYWdnaW5nRW5hYmxlZCAmJiAhZS50YXJnZXQuY2xvc2VzdChcIiNjaGFuZ2VJc0RyYWdnaW5nXCIpKSB7XHJcbiAgICAgICAgc2V0RHJhZ2dpbmdFbmFibGVkKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBjbG9zZU1lbnVPbk91dHNpZGVDbGljayk7XHJcblxyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgLy8gQ2xlYW51cCB0aGUgZXZlbnQgbGlzdGVuZXIgd2hlbiB0aGUgY29tcG9uZW50IHVubW91bnRzXHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBjbG9zZU1lbnVPbk91dHNpZGVDbGljayk7XHJcbiAgICB9O1xyXG4gIH0sIFtpc0RyYWdnaW5nRW5hYmxlZF0pO1xyXG4gIC8vZnVuY3Rpb24gY2hhbmdlIGZvcm1hdCBhcnJheSBsaXN0IHdpdGggc2VsZWN0ZWQgZGF0ZSBhbmQgZm9ybWF0XHJcbiAgY29uc3QgY2hhbmdlRGF0ZUZvcm1hdCA9ICgpID0+IHtcclxuICAgIGNvbnN0IHVwZGF0ZURhdGUgPSBbXTtcclxuICAgIGRhdGVGb3JtYXRBcnIubWFwKChkYXRhKSA9PiB7XHJcbiAgICAgIGxldCBkYXRlO1xyXG4gICAgICBpZiAoc2VsZWN0RGF0ZSAmJiBzZWxlY3REYXRlLmZvcm1hdCA9PT0gXCJkZC1NTS15eXl5XCIpIHtcclxuICAgICAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSBzZWxlY3REYXRlLmRhdGUuc3BsaXQoXCItXCIpO1xyXG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkYXRlID0gbmV3IERhdGUoc2VsZWN0RGF0ZT8uZGF0ZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRUaW1lKCk7XHJcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSBtb21lbnQobWlsbGlzZWNvbmRzKS5mb3JtYXQoZGF0YSk7XHJcbiAgICAgIGNvbnN0IGRhdGVPYmogPSB7XHJcbiAgICAgICAgZGF0ZTogbmV3RGF0ZSxcclxuICAgICAgICBmb3JtYXQ6IHNlbGVjdEZvcm1hdChkYXRhKVxyXG4gICAgICB9O1xyXG4gICAgICB1cGRhdGVEYXRlLnB1c2goZGF0ZU9iaik7XHJcbiAgICB9KTtcclxuICAgIHNldERhdGVGb3JtYXQodXBkYXRlRGF0ZSk7XHJcbiAgfTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmIChwcm9wcy5pc1BsYWNlaG9sZGVyIHx8IHByb3BzLmlzU2lnbllvdXJzZWxmKSB7XHJcbiAgICAgIHNlbGVjdERhdGUgJiYgY2hhbmdlRGF0ZUZvcm1hdCgpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtzZWxlY3REYXRlXSk7XHJcblxyXG4gIC8vaXQgZGV0ZWN0IG91dHNpZGUgY2xpY2sgb2YgZGF0ZSBkcm9wZG93biBtZW51XHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IGNsb3NlTWVudU9uT3V0c2lkZUNsaWNrID0gKGUpID0+IHtcclxuICAgICAgaWYgKGlzU2hvd0RhdGVGb3JtYXQgJiYgIWUudGFyZ2V0LmNsb3Nlc3QoXCIjbWVudS1jb250YWluZXJcIikpIHtcclxuICAgICAgICBzZXRJc1Nob3dEYXRlRm9ybWF0KCFpc1Nob3dEYXRlRm9ybWF0KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBjbG9zZU1lbnVPbk91dHNpZGVDbGljayk7XHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAvLyBDbGVhbnVwIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcclxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGNsb3NlTWVudU9uT3V0c2lkZUNsaWNrKTtcclxuICAgIH07XHJcbiAgfSwgW2lzU2hvd0RhdGVGb3JtYXRdKTtcclxuXHJcbiAgLy9gaGFuZGxlV2lkZ2V0SWRhbmRQb3B1cGAgaXMgdXNlZCB0byBzZXQgY3VycmVudCB3aWRnZXQgaWQgYW5kIG9wZW4gcmVsYXRpdmUgcG9wdXBcclxuICBjb25zdCBoYW5kbGVXaWRnZXRJZGFuZFBvcHVwID0gKCkgPT4ge1xyXG4gICAgaWYgKHByb3BzLnNldFNlbGVjdFdpZGdldElkKSB7XHJcbiAgICAgIHByb3BzLnNldFNlbGVjdFdpZGdldElkKHByb3BzLnBvcy5rZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHdpZGdldFR5cGVFeGlzdCA9IFtcclxuICAgICAgdGV4dElucHV0V2lkZ2V0LFxyXG4gICAgICBcImNoZWNrYm94XCIsXHJcbiAgICAgIFwibmFtZVwiLFxyXG4gICAgICBcImNvbXBhbnlcIixcclxuICAgICAgXCJqb2IgdGl0bGVcIixcclxuICAgICAgXCJkYXRlXCIsXHJcbiAgICAgIFwiZW1haWxcIixcclxuICAgICAgdGV4dFdpZGdldFxyXG4gICAgXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSk7XHJcblxyXG4gICAgaWYgKHdpZGdldFR5cGVFeGlzdCkge1xyXG4gICAgICBzZXREcmFnZ2luZ0VuYWJsZWQoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgaWYgKChwcm9wcy5pc05lZWRTaWduIHx8IHByb3BzLmlzU2lnbllvdXJzZWxmKSAmJiAhcHJvcHMuaXNEcmFnZ2luZykge1xyXG4gICAgICBpZiAocHJvcHM/LmlzcHVibGljVGVtcGxhdGUpIHtcclxuICAgICAgICBwcm9wcy5oYW5kbGVVc2VyRGV0YWlscygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChwcm9wcy5wb3MudHlwZSkge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJzaWduYXR1cmVcIiB8fFxyXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJzdGFtcFwiIHx8XHJcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcImltYWdlXCJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBwcm9wcy5zZXRJc1NpZ25QYWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XHJcbiAgICAgICAgICAgIHByb3BzLnNldElzU3RhbXAocHJvcHMucG9zLmlzU3RhbXApO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5wb3MudHlwZSA9PT0gXCJpbml0aWFsc1wiKSB7XHJcbiAgICAgICAgICAgIHByb3BzLnNldElzU2lnblBhZCh0cnVlKTtcclxuICAgICAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChwcm9wcy5wb3MuaXNTdGFtcCk7XHJcbiAgICAgICAgICAgIHByb3BzLnNldElzSW5pdGlhbCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcHJvcHMuc2V0SXNTaWduUGFkKHRydWUpO1xyXG4gICAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgICAgIHByb3BzLnNldElzU3RhbXAocHJvcHMucG9zPy5pc1N0YW1wID8gcHJvcHMucG9zLmlzU3RhbXAgOiBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBwcm9wcy5pc1BsYWNlaG9sZGVyICYmXHJcbiAgICAgICFwcm9wcy5pc0RyYWdnaW5nICYmXHJcbiAgICAgIHByb3BzLnBvcy50eXBlICE9PSB0ZXh0V2lkZ2V0XHJcbiAgICApIHtcclxuICAgICAgaWYgKHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkKSB7XHJcbiAgICAgICAgcHJvcHMuaGFuZGxlTGlua1VzZXIocHJvcHMuZGF0YS5JZCk7XHJcbiAgICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHMuZGF0YS5JZCk7XHJcbiAgICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCFwcm9wcy5wb3MudHlwZSkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIXByb3BzLnBvcy50eXBlICYmXHJcbiAgICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxyXG4gICAgICAgIHByb3BzLmRhdGEuc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkXHJcbiAgICAgICkge1xyXG4gICAgICAgIHByb3BzLnNldElzU2lnblBhZCh0cnVlKTtcclxuICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICAgIHByb3BzLnNldElzU3RhbXAocHJvcHMucG9zLmlzU3RhbXApO1xyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLnBvcy50eXBlID09PSBcInNpZ25hdHVyZVwiKSB8fFxyXG4gICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcInN0YW1wXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgcHJvcHMuc2V0SXNTaWduUGFkKHRydWUpO1xyXG4gICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XHJcbiAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChwcm9wcy5wb3MuaXNTdGFtcCk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5wb3MudHlwZSA9PT0gXCJkcm9wZG93blwiKSB7XHJcbiAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgY29uc3QgaGFuZGxlT25DbGlja1BsYWNlaG9sZGVyID0gKCkgPT4ge1xyXG4gICAgcHJvcHMuc2V0Q3VycldpZGdldHNEZXRhaWxzICYmIHByb3BzLnNldEN1cnJXaWRnZXRzRGV0YWlscyhwcm9wcy5wb3MpO1xyXG4gICAgaWYgKCFwcm9wcy5pc05lZWRTaWduKSB7XHJcbiAgICAgIHByb3BzLnNldFdpZGdldFR5cGUocHJvcHMucG9zLnR5cGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSB7XHJcbiAgICAgIGhhbmRsZVdpZGdldElkYW5kUG9wdXAoKTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHByb3BzPy5pc05lZWRTaWduICYmXHJcbiAgICAgIHByb3BzPy51bmlxdWVJZCAmJlxyXG4gICAgICBwcm9wcy5kYXRhPy5JZCA9PT0gcHJvcHM/LnVuaXF1ZUlkXHJcbiAgICApIHtcclxuICAgICAgaGFuZGxlV2lkZ2V0SWRhbmRQb3B1cCgpO1xyXG4gICAgfSBlbHNlIGlmIChwcm9wcy5pc1BsYWNlaG9sZGVyIHx8IHByb3BzLmlzU2lnbllvdXJzZWxmKSB7XHJcbiAgICAgIGhhbmRsZVdpZGdldElkYW5kUG9wdXAoKTtcclxuICAgIH1cclxuICB9O1xyXG4gIC8vYGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbmAgaXMgdXNlZCBzZXQgY3VycmVudCB3aWRnZXQgZGV0YWlscyBhbmQgb3BlbiBzZXR0aW5nIG9mIGl0XHJcbiAgY29uc3QgaGFuZGxlT25DbGlja1NldHRpbmdJY29uID0gKCkgPT4ge1xyXG4gICAgaWYgKHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCkge1xyXG4gICAgICBwcm9wcy5zZXRJc1JhZGlvKHRydWUpO1xyXG4gICAgfSBlbHNlIGlmIChwcm9wcy5wb3MudHlwZSA9PT0gXCJkcm9wZG93blwiKSB7XHJcbiAgICAgIHByb3BzPy5zZXRTaG93RHJvcGRvd24odHJ1ZSk7XHJcbiAgICB9IGVsc2UgaWYgKHByb3BzLnBvcy50eXBlID09PSBcImNoZWNrYm94XCIpIHtcclxuICAgICAgcHJvcHM/LnNldElzQ2hlY2tib3godHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgc2V0dGluZyBpY29uIGZvciBzaWdueW91ci1zZWxmIGZsb3cgZm9yIGFsbCB0eXBlIHRleHQgd2lkZ2V0c1xyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgIFtcclxuICAgICAgICB0ZXh0SW5wdXRXaWRnZXQsXHJcbiAgICAgICAgdGV4dFdpZGdldCxcclxuICAgICAgICBcIm5hbWVcIixcclxuICAgICAgICBcImNvbXBhbnlcIixcclxuICAgICAgICBcImpvYiB0aXRsZVwiLFxyXG4gICAgICAgIFwiZW1haWxcIlxyXG4gICAgICBdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKSAmJlxyXG4gICAgICBwcm9wcy5pc1NpZ25Zb3Vyc2VsZlxyXG4gICAgKSB7XHJcbiAgICAgIHByb3BzLmhhbmRsZVRleHRTZXR0aW5nTW9kYWwodHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9wcz8uaGFuZGxlTmFtZU1vZGFsICYmIHByb3BzPy5oYW5kbGVOYW1lTW9kYWwodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9jb25kaXRpb24gZm9yIG9ubHkgcGxhY2Vob2xkZXIgYW5kIHRlbXBsYXRlIGZsb3dcclxuICAgIGlmIChwcm9wcy5kYXRhICYmIHByb3BzPy5wb3M/LnR5cGUgIT09IHRleHRXaWRnZXQpIHtcclxuICAgICAgcHJvcHMuc2V0U2lnbmVyT2JqSWQocHJvcHM/LmRhdGE/LnNpZ25lck9iaklkKTtcclxuICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHM/LmRhdGE/LklkKTtcclxuICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcclxuICAgIH1cclxuICAgIC8vY29uZGl0aW9uIHRvIGhhbmRsZSBpbiBwbGFjZWhvbGRlciBhbmQgdGVtcGxhdGUgZmxvdyBmb3IgdGV4dCB3aWRnZXQgc2lnbmVySWQgZm9yIHRleHQgd2lkZ2V0cyBpIGhhdmUgdG8gc2V0IHVuaXF1ZUlkIGluIHRlbXBTaWduZXJJZCBiZWNhdXNlXHJcbiAgICAvL2l0IGRvZXMgbm90IGhhdmUgYW55IHNpZ25lciB1c2VyIGFuZCBhbnkgc2lnbmVyb2JqSWRcclxuICAgIGVsc2UgaWYgKHByb3BzLmRhdGEgJiYgcHJvcHMucG9zLnR5cGUgPT09IHRleHRXaWRnZXQpIHtcclxuICAgICAgcHJvcHMuc2V0VGVtcFNpZ25lcklkKHByb3BzLnVuaXF1ZUlkKTtcclxuICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHM/LmRhdGE/LklkKTtcclxuICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgKTtcclxuICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xyXG4gICAgfVxyXG4gICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcclxuICAgIHByb3BzLnNldFdpZGdldFR5cGUocHJvcHMucG9zLnR5cGUpO1xyXG4gICAgcHJvcHMuc2V0Q3VycldpZGdldHNEZXRhaWxzKHByb3BzLnBvcyk7XHJcbiAgfTtcclxuICAvL2Z1bmN0aW9uIHRvIHNldCByZXF1aXJlZCBzdGF0ZSB2YWx1ZSBvbmNsaWNrIG9uIHdpZGdldCdzIGNvcHkgaWNvblxyXG4gIGNvbnN0IGhhbmRsZUNvcHlQbGFjZWhvbGRlciA9IChlKSA9PiB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgLy9jb25kaXRpb24gdG8gaGFuZGxlIHRleHQgd2lkZ2V0IHNpZ25lciBvYmogaWQgYW5kIHVuaXF1ZSBpZFxyXG4gICAgLy93aGVuIHVzZXIgY2xpY2sgb24gY29weSBpY29uIG9mIHRleHQgd2lkZ2V0IGluIHRoYXQgY29uZGl0aW9uIHRleHQgd2lkZ2V0IGRvZXMgbm90IGhhdmUgYW55IHNpZ25lck9iaklkXHJcbiAgICAvL2luIHRoYXQgY2FzZSBpIGhhdmUgdG8gc2F2ZSBpbiB0ZW1wU2lnbmVySWQgYXMgYSB1bmlxdWUgaWQgb2YgcHJldmlvdXMgc2VsZWN0IHNpZ25lcidzIHVuaXF1ZSBpZFxyXG4gICAgLy9hbmQgb24gc2F2ZSBvciBjYW5jZWwgYnV0dG9uIG9mIGNvcHkgYWxsIHBhZ2UgcG9wdXAgaSBoYXZlIHNldCB0aGlzIHRlbXAgc2lnbmVyIElkIGluIHVuaXF1ZSBpZFxyXG5cclxuICAgIGlmIChwcm9wcy5kYXRhICYmIHByb3BzPy5wb3M/LnR5cGUgIT09IHRleHRXaWRnZXQpIHtcclxuICAgICAgcHJvcHMuc2V0U2lnbmVyT2JqSWQocHJvcHM/LmRhdGE/LnNpZ25lck9iaklkKTtcclxuICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHM/LmRhdGE/LklkKTtcclxuICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcclxuICAgIH0gZWxzZSBpZiAocHJvcHMuZGF0YSAmJiBwcm9wcy5wb3MudHlwZSA9PT0gdGV4dFdpZGdldCkge1xyXG4gICAgICBwcm9wcy5zZXRUZW1wU2lnbmVySWQocHJvcHMudW5pcXVlSWQpO1xyXG4gICAgICBwcm9wcy5zZXRTaWduZXJPYmpJZChwcm9wcz8uZGF0YT8uc2lnbmVyT2JqSWQpO1xyXG4gICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcz8uZGF0YT8uSWQpO1xyXG4gICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcclxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxyXG4gICAgICApO1xyXG4gICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9jaGVja2luZyB3aWRnZXQncyB0eXBlIGFuZCBvcGVuIHdpZGdldCBjb3B5IG1vZGFsIGZvciByZXF1aXJlZCB3aWRnZXRzXHJcbiAgICBpZiAoXHJcbiAgICAgIFtcInNpZ25hdHVyZVwiLCB0ZXh0V2lkZ2V0LCBcInN0YW1wXCIsIFwiaW5pdGlhbFwiXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSlcclxuICAgICkge1xyXG4gICAgICBwcm9wcy5zZXRJc1BhZ2VDb3B5KHRydWUpO1xyXG4gICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9mdW5jdGlvbiB0byBjcmVhdGUgbmV3IHdpZGdldCBuZXh0IHRvIGp1c3Qgd2lkZ2V0XHJcbiAgICAgIGhhbmRsZUNvcHlOZXh0VG9XaWRnZXQoXHJcbiAgICAgICAgcHJvcHMucG9zLFxyXG4gICAgICAgIHByb3BzLnBvcy50eXBlLFxyXG4gICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vZnVuY3Rpb24gdG8gc2F2ZSBkYXRlIGFuZCBmb3JtYXQgb24gbG9jYWwgYXJyYXkgb25jaGFuZ2UgZGF0ZSBhbmQgb25jbGljayBmb3JtYXRcclxuICBjb25zdCBoYW5kbGVTYXZlRGF0ZSA9IChkYXRhLCBpc0RhdGVDaGFuZ2UpID0+IHtcclxuICAgIGxldCB1cGRhdGVEYXRlID0gZGF0YS5kYXRlO1xyXG4gICAgLy9jaGVjayBpZiBkYXRlIGNoYW5nZSBieSB1c2VyXHJcbiAgICBpZiAoaXNEYXRlQ2hhbmdlKSB7XHJcbiAgICAgIC8vYGNoYW5nZURhdGVUb01vbWVudEZvcm1hdGAgaXMgdXNlZCB0byBjb252ZXJ0IGRhdGUgYXMgcGVyIHJlcXVpcmVkIHRvIG1vbWVudCBwYWNrYWdlXHJcbiAgICAgIHVwZGF0ZURhdGUgPSBtb21lbnQoZGF0YS5kYXRlKS5mb3JtYXQoXHJcbiAgICAgICAgY2hhbmdlRGF0ZVRvTW9tZW50Rm9ybWF0KGRhdGEuZm9ybWF0KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy91c2luZyBtb21lbnQgcGFja2FnZSBpcyB1c2VkIHRvIGNoYW5nZSBkYXRlIGFzIHBlciB0aGUgZm9ybWF0IHByb3ZpZGVkIGluIHNlbGVjdERhdGUgb2JqIGUuZy4gLSBNTS9kZC95eXl5IC0+IDAzLzEyLzIwMjRcclxuICAgIC8vYGdldERlZmF1bHRkYXRlYCBpcyB1c2VkIHRvIGNvbnZlcnQgdXBkYXRlIGRhdGUgaW4gbmV3IERhdGUoKSBmb3JtYXRcclxuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQoXHJcbiAgICAgIGdldERlZmF1bHRkYXRlKHVwZGF0ZURhdGUsIGRhdGE/LmZvcm1hdCkuZ2V0VGltZSgpXHJcbiAgICApLmZvcm1hdChjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQoZGF0YT8uZm9ybWF0KSk7XHJcblxyXG4gICAgLy9gb25DaGFuZ2VJbnB1dGAgaXMgdXNlZCB0byBzYXZlIGRhdGEgcmVsYXRlZCB0byBkYXRlIGluIGEgcGxhY2Vob2xkZXIgZmllbGRcclxuICAgIG9uQ2hhbmdlSW5wdXQoXHJcbiAgICAgIGRhdGUsXHJcbiAgICAgIHByb3BzLnBvcy5rZXksXHJcbiAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgcHJvcHMuaW5kZXgsXHJcbiAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcclxuICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhLklkLFxyXG4gICAgICBmYWxzZSxcclxuICAgICAgZGF0YT8uZm9ybWF0XHJcbiAgICApO1xyXG4gICAgc2V0U2VsZWN0RGF0ZSh7IGRhdGU6IGRhdGUsIGZvcm1hdDogZGF0YT8uZm9ybWF0IH0pO1xyXG4gIH07XHJcbiAgY29uc3QgUGxhY2Vob2xkZXJJY29uID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgcHJvcHMuaXNTaG93Qm9yZGVyICYmIChcclxuICAgICAgICA8PlxyXG4gICAgICAgICAgeyhwcm9wcy5pc1BsYWNlaG9sZGVyIHx8IHByb3BzLmlzU2lnbllvdXJzZWxmKSAmJiAoXHJcbiAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgey8qIGNvbmRpdGlvbiB0byBhZGQgc2V0dGluZyBpY29uIGZvciBzaWdueW91ci1zZWxmIGZsb3cgZm9yIHBhcnRpY3VsYXIgdGV4dCB3aWRnZXRzXHJcbiAgICAgICAgICAgIGFuZCBhbHNvIGl0IGhhdmUgZGlmZnJlbnQgcG9zaXRpb24gXHJcbiAgICAgICAgICAgICovfVxyXG4gICAgICAgICAgICAgIHtbXHJcbiAgICAgICAgICAgICAgICBcImNoZWNrYm94XCIsXHJcbiAgICAgICAgICAgICAgICB0ZXh0SW5wdXRXaWRnZXQsXHJcbiAgICAgICAgICAgICAgICB0ZXh0V2lkZ2V0LFxyXG4gICAgICAgICAgICAgICAgXCJuYW1lXCIsXHJcbiAgICAgICAgICAgICAgICBcImNvbXBhbnlcIixcclxuICAgICAgICAgICAgICAgIFwiam9iIHRpdGxlXCIsXHJcbiAgICAgICAgICAgICAgICBcImVtYWlsXCJcclxuICAgICAgICAgICAgICBdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKSAmJiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiA/IChcclxuICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbkNsaWNrU2V0dGluZ0ljb24oKTtcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbigpO1xyXG4gICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1nZWFyIGljb25cIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIiMxODhhZTJcIixcclxuICAgICAgICAgICAgICAgICAgICByaWdodDogXCIyOXB4XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBcIi0xOXB4XCJcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgIC8qIGNvbmRpdGlvbiB0byBhZGQgc2V0dGluZyBpY29uIGZvciBwbGFjZWhvbGRlciAmIHRlbXBsYXRlIGZsb3cgZm9yIGFsbCB3aWRnZXRzIGV4Y2VwdCBzaWduYXR1cmUgYW5kIGRhdGUgKi9cclxuICAgICAgICAgICAgICAgICgoIXByb3BzPy5wb3M/LnR5cGUgJiYgcHJvcHMucG9zLmlzU3RhbXApIHx8XHJcbiAgICAgICAgICAgICAgICAgIChwcm9wcz8ucG9zPy50eXBlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIVtcImRhdGVcIiwgXCJzaWduYXR1cmVcIl0uaW5jbHVkZXMocHJvcHMucG9zLnR5cGUpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIXByb3BzLmlzU2lnbllvdXJzZWxmKSkgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25DbGlja1NldHRpbmdJY29uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICBvblRvdWNoRW5kPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZ2VhciBpY29uXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwiIzE4OGFlMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHByb3BzPy5wb3M/LnR5cGUgPT09IHRleHRXaWRnZXQgPyBcIjMycHhcIiA6IFwiNDdweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdG9wOiBcIi0xOXB4XCJcclxuICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgey8qIGNvbmRpdGlvbiBmb3IgdXNlcmljb24gZm9yIGFsbCB3aWRnZXRzIGV4Y2VwdCB0ZXh0IHdpZGdldHMgYW5kIHNpZ255b3VyLXNlbGYgZmxvdyAqL31cclxuICAgICAgICAgICAgICB7cHJvcHMucG9zLnR5cGUgIT09IHRleHRXaWRnZXQgJiYgIXByb3BzLmlzU2lnbllvdXJzZWxmICYmIChcclxuICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwiYXNzaWduU2lnbmVyXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtdXNlciBpY29uXCJcclxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmhhbmRsZUxpbmtVc2VyKHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrSW5kZXggPSBwcm9wcy54eVBvc3Rpb24uZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmhhbmRsZUxpbmtVc2VyKHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrSW5kZXggPSBwcm9wcy54eVBvc3Rpb24uZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6IFwiIzE4OGFlMlwiLCByaWdodDogXCIzMnB4XCIsIHRvcDogXCItMThweFwiIH19XHJcbiAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgKX1cclxuICAgICAgICAgIHsvKiBzZXR0aW5nIGljb24gb25seSBmb3IgZGF0ZSB3aWRnZXRzICovfVxyXG4gICAgICAgICAge3Byb3BzLnBvcy50eXBlID09PSBcImRhdGVcIiAmJiBzZWxlY3REYXRlICYmIChcclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGlkPVwibWVudS1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICB6SW5kZXg6IFwiOTlcIixcclxuICAgICAgICAgICAgICAgIHRvcDogXCItMTlweFwiLFxyXG4gICAgICAgICAgICAgICAgcmlnaHQ6IHByb3BzLmlzUGxhY2Vob2xkZXIgPyBcIjYwcHhcIiA6IFwiNDRweFwiXHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake2lzU2hvd0RhdGVGb3JtYXQgPyBcInNob3dcIiA6IFwiXCJ9IGRyb3Bkb3duIGljb25gfVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXRJc1Nob3dEYXRlRm9ybWF0KCFpc1Nob3dEYXRlRm9ybWF0KTtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcHMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcy5kYXRhLklkKTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBzZXRJc1Nob3dEYXRlRm9ybWF0KCFpc1Nob3dEYXRlRm9ybWF0KTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XHJcbiAgICAgICAgICAgICAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1nZWFyIGljb25cIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgY29sb3I6IFwiIzE4OGFlMlwiLFxyXG4gICAgICAgICAgICAgICAgICBmb250U2l6ZTogXCIxNHB4XCJcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e1xyXG4gICAgICAgICAgICAgICAgICBpc1Nob3dEYXRlRm9ybWF0ID8gXCJkcm9wZG93bi1tZW51IHNob3dcIiA6IFwiZHJvcGRvd24tbWVudVwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bk1lbnVCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD17aXNTaG93RGF0ZUZvcm1hdCA/IFwidHJ1ZVwiIDogXCJmYWxzZVwifVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHtkYXRlRm9ybWF0Lm1hcCgoZGF0YSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgIGtleT17aW5kfVxyXG4gICAgICAgICAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTaG93RGF0ZUZvcm1hdCghaXNTaG93RGF0ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdERhdGUoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNhdmVEYXRlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTaG93RGF0ZUZvcm1hdCghaXNTaG93RGF0ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdERhdGUoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNhdmVEYXRlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImRyb3Bkb3duLWl0ZW0gdGV4dC1bMTNweF1cIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIHtkYXRhPy5kYXRlID8gZGF0YT8uZGF0ZSA6IFwibm9kYXRhXCJ9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgKX1cclxuICAgICAgICAgIHsvKiBjb3B5IGljb24gZm9yIGFsbCB3aWRnZXRzICovfVxyXG4gICAgICAgICAgPGlcclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtY29weSBpY29uXCJcclxuICAgICAgICAgICAgb25DbGljaz17KGUpID0+IGhhbmRsZUNvcHlQbGFjZWhvbGRlcihlKX1cclxuICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IGhhbmRsZUNvcHlQbGFjZWhvbGRlcihlKX1cclxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6IFwiIzE4OGFlMlwiLCByaWdodDogXCIxMnB4XCIsIHRvcDogXCItMThweFwiIH19XHJcbiAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgey8qIGRlbGV0ZSBpY29uIGZvciBhbGwgd2lkZ2V0cyAqL31cclxuICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWNpcmNsZS14bWFyayBpY29uXCJcclxuICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcclxuICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIGZvciB0ZW1wbGF0ZSBhbmQgcGxhY2Vob2xkZXIgZmxvd1xyXG4gICAgICAgICAgICAgIGlmIChwcm9wcy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVEZWxldGVTaWduKHByb3BzLnBvcy5rZXksIHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL2NvbmRpdGlvbiBmb3Igc2lnbnlvdXItc2VsZiBmbG93XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVEZWxldGVTaWduKHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICAgICAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAvL2ZvciBtb2JpbGUgYW5kIHRhYmxldCB0b3VjaCBldmVudFxyXG4gICAgICAgICAgICBvblRvdWNoRW5kPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgLy9jb25kaXRpb24gZm9yIHRlbXBsYXRlIGFuZCBwbGFjZWhvbGRlciBmbG93XHJcbiAgICAgICAgICAgICAgaWYgKHByb3BzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHByb3BzLmhhbmRsZURlbGV0ZVNpZ24ocHJvcHMucG9zLmtleSwgcHJvcHMuZGF0YT8uSWQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL2NvbmRpdGlvbiBmb3Igc2lnbnlvdXItc2VsZiBmbG93XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVEZWxldGVTaWduKHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICAgICAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogXCIjMTg4YWUyXCIsIHJpZ2h0OiBcIi04cHhcIiwgdG9wOiBcIi0xOHB4XCIgfX1cclxuICAgICAgICAgID48L2k+XHJcbiAgICAgICAgPC8+XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfTtcclxuICBjb25zdCB4UG9zID0gKHBvcywgc2lnbllvdXJzZWxmKSA9PiB7XHJcbiAgICBjb25zdCBjb250YWluZXJTY2FsZSA9IGdldENvbnRhaW5lclNjYWxlKFxyXG4gICAgICBwcm9wcy5wZGZPcmlnaW5hbFdILFxyXG4gICAgICBwcm9wcy5wYWdlTnVtYmVyLFxyXG4gICAgICBwcm9wcy5jb250YWluZXJXSFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHJlc2l6ZVBvcyA9IHBvcy54UG9zaXRpb247XHJcbiAgICBpZiAoc2lnbllvdXJzZWxmKSB7XHJcbiAgICAgIHJldHVybiByZXNpemVQb3MgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9jaGVja2luZyBib3RoIGNvbmRpdGlvbiBtb2JpbGUgYW5kIGRlc2t0b3Agdmlld1xyXG4gICAgICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xyXG4gICAgICAgIGlmIChwcm9wcy5zY2FsZSA+IDEpIHtcclxuICAgICAgICAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzaXplUG9zICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGlmIChwb3Muc2NhbGUgPT09IGNvbnRhaW5lclNjYWxlKSB7XHJcbiAgICAgICAgLy8gICByZXR1cm4gcmVzaXplUG9zICogcG9zLnNjYWxlICogcHJvcHMuc2NhbGU7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gcmVzaXplUG9zICogY29udGFpbmVyU2NhbGUgKiBwcm9wcy5zY2FsZTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG4gIGNvbnN0IHlQb3MgPSAocG9zLCBzaWduWW91cnNlbGYpID0+IHtcclxuICAgIGNvbnN0IGNvbnRhaW5lclNjYWxlID0gZ2V0Q29udGFpbmVyU2NhbGUoXHJcbiAgICAgIHByb3BzLnBkZk9yaWdpbmFsV0gsXHJcbiAgICAgIHByb3BzLnBhZ2VOdW1iZXIsXHJcbiAgICAgIHByb3BzLmNvbnRhaW5lcldIXHJcbiAgICApO1xyXG4gICAgY29uc3QgcmVzaXplUG9zID0gcG9zLnlQb3NpdGlvbjtcclxuXHJcbiAgICBpZiAoc2lnbllvdXJzZWxmKSB7XHJcbiAgICAgIHJldHVybiByZXNpemVQb3MgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9jaGVja2luZyBib3RoIGNvbmRpdGlvbiBtb2JpbGUgYW5kIGRlc2t0b3Agdmlld1xyXG4gICAgICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xyXG4gICAgICAgIGlmIChwcm9wcy5zY2FsZSA+IDEpIHtcclxuICAgICAgICAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzaXplUG9zICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGVsc2UgaWYgKHBvcy5zY2FsZSA9PT0gY29udGFpbmVyU2NhbGUpIHtcclxuICAgICAgLy8gICBpZiAocHJvcHMuc2NhbGUgPiAxKSB7XHJcbiAgICAgIC8vICAgICByZXR1cm4gcmVzaXplUG9zICogcG9zLnNjYWxlICogcHJvcHMuc2NhbGU7XHJcbiAgICAgIC8vICAgfSBlbHNlIHtcclxuICAgICAgLy8gICAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGU7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiByZXNpemVQb3MgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZ2V0Q3Vyc29yID0gKCkgPT4ge1xyXG4gICAgaWYgKHByb3BzLmRhdGEgJiYgcHJvcHMuaXNOZWVkU2lnbikge1xyXG4gICAgICBpZiAocHJvcHM/LnNpZ25lck9iaklkICYmIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCkge1xyXG4gICAgICAgIHJldHVybiBcInBvaW50ZXJcIjtcclxuICAgICAgfSBlbHNlIGlmIChwcm9wcz8udW5pcXVlSWQgJiYgcHJvcHMuZGF0YT8uSWQgPT09IHByb3BzLnVuaXF1ZUlkKSB7XHJcbiAgICAgICAgcmV0dXJuIFwicG9pbnRlclwiO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBcIm5vdC1hbGxvd2VkXCI7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBcImFsbC1zY3JvbGxcIjtcclxuICAgIH1cclxuICB9O1xyXG4gIHJldHVybiAoXHJcbiAgICA8Um5kXHJcbiAgICAgIGlkPXtwcm9wcy5wb3Mua2V5fVxyXG4gICAgICBkYXRhLXR1dD17cHJvcHMucG9zLmtleSA9PT0gcHJvcHMudW5TaWduZWRXaWRnZXRJZCA/IFwiSXNTaWduZWRcIiA6IFwiXCJ9XHJcbiAgICAgIGtleT17cHJvcHMucG9zLmtleX1cclxuICAgICAgbG9ja0FzcGVjdFJhdGlvPXtcclxuICAgICAgICAhW1xyXG4gICAgICAgICAgdGV4dFdpZGdldCxcclxuICAgICAgICAgIFwiZW1haWxcIixcclxuICAgICAgICAgIFwibmFtZVwiLFxyXG4gICAgICAgICAgXCJjb21wYW55XCIsXHJcbiAgICAgICAgICBcImpvYiB0aXRsZVwiLFxyXG4gICAgICAgICAgdGV4dElucHV0V2lkZ2V0XHJcbiAgICAgICAgXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSkgJiZcclxuICAgICAgICAocHJvcHMucG9zLldpZHRoXHJcbiAgICAgICAgICA/IHByb3BzLnBvcy5XaWR0aCAvIHByb3BzLnBvcy5IZWlnaHRcclxuICAgICAgICAgIDogZGVmYXVsdFdpZHRoSGVpZ2h0KHByb3BzLnBvcy50eXBlKS53aWR0aCAvXHJcbiAgICAgICAgICAgIGRlZmF1bHRXaWR0aEhlaWdodChwcm9wcy5wb3MudHlwZSkuaGVpZ2h0KVxyXG4gICAgICB9XHJcbiAgICAgIGVuYWJsZVJlc2l6aW5nPXt7XHJcbiAgICAgICAgdG9wOiBmYWxzZSxcclxuICAgICAgICByaWdodDogZmFsc2UsXHJcbiAgICAgICAgYm90dG9tOiBmYWxzZSxcclxuICAgICAgICBsZWZ0OiBmYWxzZSxcclxuICAgICAgICB0b3BSaWdodDogZmFsc2UsXHJcbiAgICAgICAgYm90dG9tUmlnaHQ6XHJcbiAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmlzTmVlZFNpZ25cclxuICAgICAgICAgICAgPyBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQgJiZcclxuICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJjaGVja2JveFwiICYmXHJcbiAgICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0XHJcbiAgICAgICAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgICAgICAgOiBmYWxzZVxyXG4gICAgICAgICAgICA6IHByb3BzLnBvcy50eXBlICE9PSByYWRpb0J1dHRvbldpZGdldCAmJlxyXG4gICAgICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgJiZcclxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJlxyXG4gICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgYm90dG9tTGVmdDogZmFsc2UsXHJcbiAgICAgICAgdG9wTGVmdDogZmFsc2VcclxuICAgICAgfX1cclxuICAgICAgYm91bmRzPVwicGFyZW50XCJcclxuICAgICAgY2xhc3NOYW1lPVwic2lnbllvdXJzZWxmQmxvY2tcIlxyXG4gICAgICBzdHlsZT17e1xyXG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgIzAwN2JmZlwiLFxyXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIycHhcIixcclxuICAgICAgICB0ZXh0QWxpZ246XHJcbiAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJuYW1lXCIgJiZcclxuICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNvbXBhbnlcIiAmJlxyXG4gICAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IFwiam9iIHRpdGxlXCIgJiZcclxuICAgICAgICAgIFwiY2VudGVyXCIsXHJcbiAgICAgICAgY3Vyc29yOiBnZXRDdXJzb3IoKSxcclxuICAgICAgICB6SW5kZXg6XHJcbiAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJkYXRlXCJcclxuICAgICAgICAgICAgPyBwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZFxyXG4gICAgICAgICAgICAgID8gOTkgKyAxXHJcbiAgICAgICAgICAgICAgOiA5OVxyXG4gICAgICAgICAgICA6IHByb3BzPy5wb3M/LnpJbmRleFxyXG4gICAgICAgICAgICAgID8gcHJvcHMucG9zLnpJbmRleFxyXG4gICAgICAgICAgICAgIDogXCI1XCIsXHJcbiAgICAgICAgYmFja2dyb3VuZDogcHJvcHMuZGF0YSA/IHByb3BzLmRhdGEuYmxvY2tDb2xvciA6IFwicmdiKDIwMyAyMzMgMjM3KVwiXHJcbiAgICAgIH19XHJcbiAgICAgIG9uRHJhZz17KCkgPT4ge1xyXG4gICAgICAgIHNldERyYWdnaW5nRW5hYmxlZCh0cnVlKTtcclxuICAgICAgICBwcm9wcy5oYW5kbGVUYWJEcmFnICYmIHByb3BzLmhhbmRsZVRhYkRyYWcocHJvcHMucG9zLmtleSk7XHJcbiAgICAgIH19XHJcbiAgICAgIHNpemU9e3tcclxuICAgICAgICB3aWR0aDpcclxuICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCB8fCBwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgID8gXCJhdXRvXCJcclxuICAgICAgICAgICAgOiBwcm9wcy5wb3NXaWR0aChwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKSxcclxuICAgICAgICBoZWlnaHQ6XHJcbiAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQgfHwgcHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICA/IFwiYXV0b1wiXHJcbiAgICAgICAgICAgIDogcHJvcHMucG9zSGVpZ2h0KHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpXHJcbiAgICAgIH19XHJcbiAgICAgIG9uUmVzaXplU3RhcnQ9eygpID0+IHtcclxuICAgICAgICBzZXREcmFnZ2luZ0VuYWJsZWQodHJ1ZSk7XHJcbiAgICAgICAgcHJvcHMuc2V0SXNSZXNpemUgJiYgcHJvcHMuc2V0SXNSZXNpemUodHJ1ZSk7XHJcbiAgICAgIH19XHJcbiAgICAgIG9uUmVzaXplU3RvcD17KGUsIGRpcmVjdGlvbiwgcmVmKSA9PiB7XHJcbiAgICAgICAgcHJvcHMuc2V0SXNSZXNpemUgJiYgcHJvcHMuc2V0SXNSZXNpemUoZmFsc2UpO1xyXG4gICAgICAgIHByb3BzLmhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplICYmXHJcbiAgICAgICAgICBwcm9wcy5oYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZShcclxuICAgICAgICAgICAgcmVmLFxyXG4gICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXHJcbiAgICAgICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcclxuICAgICAgICAgICAgcHJvcHMuaW5kZXgsXHJcbiAgICAgICAgICAgIGNvbnRhaW5lclNjYWxlLFxyXG4gICAgICAgICAgICBwcm9wcy5zY2FsZSxcclxuICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhLklkLFxyXG4gICAgICAgICAgICBwcm9wcy5pc1Jlc2l6ZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfX1cclxuICAgICAgZGlzYWJsZURyYWdnaW5nPXtcclxuICAgICAgICBwcm9wcy5pc05lZWRTaWduXHJcbiAgICAgICAgICA/IHRydWVcclxuICAgICAgICAgIDogcHJvcHMuaXNQbGFjZWhvbGRlciAmJiAhW3RleHRXaWRnZXRdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKVxyXG4gICAgICAgICAgICA/IGZhbHNlXHJcbiAgICAgICAgICAgIDogIWlzRHJhZ2dpbmdFbmFibGVkXHJcbiAgICAgIH1cclxuICAgICAgb25EcmFnU3RvcD17KGV2ZW50LCBkcmFnRWxlbWVudCkgPT5cclxuICAgICAgICBwcm9wcy5oYW5kbGVTdG9wICYmXHJcbiAgICAgICAgcHJvcHMuaGFuZGxlU3RvcChldmVudCwgZHJhZ0VsZW1lbnQsIHByb3BzLmRhdGE/LklkLCBwcm9wcy5wb3M/LmtleSlcclxuICAgICAgfVxyXG4gICAgICBwb3NpdGlvbj17e1xyXG4gICAgICAgIHg6IHhQb3MocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiksXHJcbiAgICAgICAgeTogeVBvcyhwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKVxyXG4gICAgICB9fVxyXG4gICAgICBvblJlc2l6ZT17KGUsIGRpcmVjdGlvbiwgcmVmKSA9PiB7XHJcbiAgICAgICAgc2V0UGxhY2Vob2xkZXJCb3JkZXIoe1xyXG4gICAgICAgICAgdzogcmVmLm9mZnNldFdpZHRoIC8gKHByb3BzLnNjYWxlICogY29udGFpbmVyU2NhbGUpLFxyXG4gICAgICAgICAgaDogcmVmLm9mZnNldEhlaWdodCAvIChwcm9wcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9fVxyXG4gICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIoKX1cclxuICAgID5cclxuICAgICAge3Byb3BzLmlzU2hvd0JvcmRlciAmJlxyXG4gICAgICBwcm9wcy5wb3MudHlwZSAhPT0gcmFkaW9CdXR0b25XaWRnZXQgJiZcclxuICAgICAgcHJvcHMucG9zLnR5cGUgIT09IFwiY2hlY2tib3hcIiAmJlxyXG4gICAgICBwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCA/IChcclxuICAgICAgICA8Qm9yZGVyUmVzaXplIHJpZ2h0PXstMTJ9IHRvcD17LTExfSAvPlxyXG4gICAgICApIDogcHJvcHMuZGF0YSAmJiBwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgPyAoXHJcbiAgICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkICYmXHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IFwiY2hlY2tib3hcIiA/IChcclxuICAgICAgICAgIDxCb3JkZXJSZXNpemUgLz5cclxuICAgICAgICApIDogKFxyXG4gICAgICAgICAgPD48Lz5cclxuICAgICAgICApXHJcbiAgICAgICkgOiAoXHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IFwiY2hlY2tib3hcIiAmJlxyXG4gICAgICAgIHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkICYmIDxCb3JkZXJSZXNpemUgLz5cclxuICAgICAgKX1cclxuXHJcbiAgICAgIHtwcm9wcy5pc1Nob3dCb3JkZXIgJiYgcHJvcHMucG9zLmtleSA9PT0gcHJvcHMuc2VsZWN0V2lkZ2V0SWQgJiYgKFxyXG4gICAgICAgIDxQbGFjZWhvbGRlckJvcmRlclxyXG4gICAgICAgICAgc2V0RHJhZ2dpbmdFbmFibGVkPXtzZXREcmFnZ2luZ0VuYWJsZWR9XHJcbiAgICAgICAgICBwb3M9e3Byb3BzLnBvc31cclxuICAgICAgICAgIGlzUGxhY2Vob2xkZXI9e3Byb3BzLmlzUGxhY2Vob2xkZXJ9XHJcbiAgICAgICAgICBnZXRDaGVja2JveFJlbmRlcldpZHRoPXtnZXRDaGVja2JveFJlbmRlcldpZHRofVxyXG4gICAgICAgICAgc2NhbGU9e3Byb3BzLnNjYWxlfVxyXG4gICAgICAgICAgY29udGFpbmVyU2NhbGU9e2NvbnRhaW5lclNjYWxlfVxyXG4gICAgICAgICAgcGxhY2Vob2xkZXJCb3JkZXI9e3BsYWNlaG9sZGVyQm9yZGVyfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICl9XHJcbiAgICAgIHtpc1RhYkFuZE1vYmlsZSA/IChcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0cmV0Y2hcIlxyXG4gICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgbGVmdDogeFBvcyhwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKSxcclxuICAgICAgICAgICAgdG9wOiB5UG9zKHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpLFxyXG4gICAgICAgICAgICB3aWR0aDpcclxuICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQgfHxcclxuICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICA/IFwiYXV0b1wiXHJcbiAgICAgICAgICAgICAgICA6IHByb3BzLnBvc1dpZHRoKHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpLFxyXG4gICAgICAgICAgICBoZWlnaHQ6XHJcbiAgICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0IHx8XHJcbiAgICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgPyBcImF1dG9cIlxyXG4gICAgICAgICAgICAgICAgOiBwcm9wcy5wb3NIZWlnaHQocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiksXHJcbiAgICAgICAgICAgIHpJbmRleDogXCIxMFwiXHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgICAgb25Ub3VjaEVuZD17KCkgPT4gaGFuZGxlT25DbGlja1BsYWNlaG9sZGVyKCl9XHJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIoKX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICB7cHJvcHMucG9zLmtleSA9PT0gcHJvcHMuc2VsZWN0V2lkZ2V0SWQgJiYgPFBsYWNlaG9sZGVySWNvbiAvPn1cclxuXHJcbiAgICAgICAgICA8UGxhY2Vob2xkZXJUeXBlXHJcbiAgICAgICAgICAgIHBvcz17cHJvcHMucG9zfVxyXG4gICAgICAgICAgICB4eVBvc3Rpb249e3Byb3BzLnh5UG9zdGlvbn1cclxuICAgICAgICAgICAgaW5kZXg9e3Byb3BzLmluZGV4fVxyXG4gICAgICAgICAgICBzZXRYeVBvc3Rpb249e3Byb3BzLnNldFh5UG9zdGlvbn1cclxuICAgICAgICAgICAgZGF0YT17cHJvcHMuZGF0YX1cclxuICAgICAgICAgICAgc2V0U2lnbktleT17cHJvcHMuc2V0U2lnbktleX1cclxuICAgICAgICAgICAgaXNTaG93RHJvcGRvd249e3Byb3BzPy5pc1Nob3dEcm9wZG93bn1cclxuICAgICAgICAgICAgaXNQbGFjZWhvbGRlcj17cHJvcHMuaXNQbGFjZWhvbGRlcn1cclxuICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e3Byb3BzLmlzU2lnbllvdXJzZWxmfVxyXG4gICAgICAgICAgICBzaWduZXJPYmpJZD17cHJvcHMuc2lnbmVyT2JqSWR9XHJcbiAgICAgICAgICAgIGhhbmRsZVVzZXJOYW1lPXtwcm9wcy5oYW5kbGVVc2VyTmFtZX1cclxuICAgICAgICAgICAgc2V0RHJhZ2dpbmdFbmFibGVkPXtzZXREcmFnZ2luZ0VuYWJsZWR9XHJcbiAgICAgICAgICAgIHBkZkRldGFpbHM9e3Byb3BzPy5wZGZEZXRhaWxzICYmIHByb3BzPy5wZGZEZXRhaWxzWzBdfVxyXG4gICAgICAgICAgICBpc05lZWRTaWduPXtwcm9wcy5pc05lZWRTaWdufVxyXG4gICAgICAgICAgICBzZXRTZWxlY3REYXRlPXtzZXRTZWxlY3REYXRlfVxyXG4gICAgICAgICAgICBzZWxlY3REYXRlPXtzZWxlY3REYXRlfVxyXG4gICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0PXtwcm9wcy5zZXRWYWxpZGF0ZUFsZXJ0fVxyXG4gICAgICAgICAgICBzZXRTdGFydERhdGU9e3NldFN0YXJ0RGF0ZX1cclxuICAgICAgICAgICAgc3RhcnREYXRlPXtzdGFydERhdGV9XHJcbiAgICAgICAgICAgIGhhbmRsZVNhdmVEYXRlPXtoYW5kbGVTYXZlRGF0ZX1cclxuICAgICAgICAgICAgeFBvcz17cHJvcHMueFBvc31cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICkgOiAoXHJcbiAgICAgICAgPD5cclxuICAgICAgICAgIHtwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJiA8UGxhY2Vob2xkZXJJY29uIC8+fVxyXG4gICAgICAgICAgPFBsYWNlaG9sZGVyVHlwZVxyXG4gICAgICAgICAgICBwb3M9e3Byb3BzLnBvc31cclxuICAgICAgICAgICAgeHlQb3N0aW9uPXtwcm9wcy54eVBvc3Rpb259XHJcbiAgICAgICAgICAgIGluZGV4PXtwcm9wcy5pbmRleH1cclxuICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtwcm9wcy5zZXRYeVBvc3Rpb259XHJcbiAgICAgICAgICAgIGRhdGE9e3Byb3BzLmRhdGF9XHJcbiAgICAgICAgICAgIHNldFNpZ25LZXk9e3Byb3BzLnNldFNpZ25LZXl9XHJcbiAgICAgICAgICAgIGlzU2hvd0Ryb3Bkb3duPXtwcm9wcz8uaXNTaG93RHJvcGRvd259XHJcbiAgICAgICAgICAgIGlzUGxhY2Vob2xkZXI9e3Byb3BzLmlzUGxhY2Vob2xkZXJ9XHJcbiAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXtwcm9wcy5pc1NpZ25Zb3Vyc2VsZn1cclxuICAgICAgICAgICAgc2lnbmVyT2JqSWQ9e3Byb3BzLnNpZ25lck9iaklkfVxyXG4gICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17cHJvcHMuaGFuZGxlVXNlck5hbWV9XHJcbiAgICAgICAgICAgIHNldERyYWdnaW5nRW5hYmxlZD17c2V0RHJhZ2dpbmdFbmFibGVkfVxyXG4gICAgICAgICAgICBwZGZEZXRhaWxzPXtwcm9wcz8ucGRmRGV0YWlscyAmJiBwcm9wcz8ucGRmRGV0YWlsc1swXX1cclxuICAgICAgICAgICAgaXNOZWVkU2lnbj17cHJvcHMuaXNOZWVkU2lnbn1cclxuICAgICAgICAgICAgc2V0U2VsZWN0RGF0ZT17c2V0U2VsZWN0RGF0ZX1cclxuICAgICAgICAgICAgc2VsZWN0RGF0ZT17c2VsZWN0RGF0ZX1cclxuICAgICAgICAgICAgc2V0VmFsaWRhdGVBbGVydD17cHJvcHMuc2V0VmFsaWRhdGVBbGVydH1cclxuICAgICAgICAgICAgc2V0U3RhcnREYXRlPXtzZXRTdGFydERhdGV9XHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZT17c3RhcnREYXRlfVxyXG4gICAgICAgICAgICBoYW5kbGVTYXZlRGF0ZT17aGFuZGxlU2F2ZURhdGV9XHJcbiAgICAgICAgICAgIHhQb3M9e3Byb3BzLnhQb3N9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvPlxyXG4gICAgICApfVxyXG4gICAgPC9SbmQ+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXI7XHJcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgdGhlbWVDb2xvciB9IGZyb20gXCIuLi8uLi9jb25zdGFudC9jb25zdFwiO1xyXG5pbXBvcnQge1xyXG4gIGRlZmF1bHRXaWR0aEhlaWdodCxcclxuICBpc01vYmlsZSxcclxuICByYWRpb0J1dHRvbldpZGdldCxcclxuICByZXNpemVCb3JkZXJFeHRyYVdpZHRoLFxyXG4gIHRleHRXaWRnZXRcclxufSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcclxuZnVuY3Rpb24gUGxhY2Vob2xkZXJCb3JkZXIocHJvcHMpIHtcclxuICBjb25zdCBnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoID0gcmVzaXplQm9yZGVyRXh0cmFXaWR0aCgpO1xyXG4gIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGRlZmF1bHRXaWR0aEhlaWdodChwcm9wcy5wb3MudHlwZSkud2lkdGg7XHJcbiAgY29uc3QgZGVmYXVsdEhlaWdodCA9IGRlZmF1bHRXaWR0aEhlaWdodChwcm9wcy5wb3MudHlwZSkuaGVpZ2h0O1xyXG4gIGNvbnN0IHdpZHRoID0gKCkgPT4ge1xyXG4gICAgY29uc3QgZ2V0V2lkdGggPVxyXG4gICAgICBwcm9wcy5wbGFjZWhvbGRlckJvcmRlci53IHx8IHByb3BzLnBvcy5XaWR0aCB8fCBkZWZhdWx0V2lkdGg7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBnZXRXaWR0aCAqIHByb3BzLnNjYWxlICogcHJvcHMuY29udGFpbmVyU2NhbGUgKyBnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoXHJcbiAgICApO1xyXG4gIH07XHJcbiAgY29uc3QgaGVpZ2h0ID0gKCkgPT4ge1xyXG4gICAgY29uc3QgZ2V0SGVpZ2h0ID1cclxuICAgICAgcHJvcHMucGxhY2Vob2xkZXJCb3JkZXIuaCB8fCBwcm9wcy5wb3MuSGVpZ2h0IHx8IGRlZmF1bHRIZWlnaHQ7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgZ2V0SGVpZ2h0ICogcHJvcHMuc2NhbGUgKiBwcm9wcy5jb250YWluZXJTY2FsZSArIGdldFJlc2l6ZUJvcmRlckV4dHJhV2lkdGhcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTWluV2lkdGggPSAoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQpIHtcclxuICAgICAgcmV0dXJuIHByb3BzLmdldENoZWNrYm94UmVuZGVyV2lkdGgud2lkdGggKyBnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHdpZHRoKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBoYW5kbGVNaW5IZWlnaHQgPSAoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQpIHtcclxuICAgICAgcmV0dXJuIHByb3BzLmdldENoZWNrYm94UmVuZGVyV2lkdGguaGVpZ2h0ICsgZ2V0UmVzaXplQm9yZGVyRXh0cmFXaWR0aDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBoZWlnaHQoKTtcclxuICAgIH1cclxuICB9O1xyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2XHJcbiAgICAgIG9uTW91c2VFbnRlcj17KCkgPT4gIWlzTW9iaWxlICYmIHByb3BzPy5zZXREcmFnZ2luZ0VuYWJsZWQodHJ1ZSl9XHJcbiAgICAgIG9uVG91Y2hFbmQ9eygpID0+XHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IHRleHRXaWRnZXQgJiYgcHJvcHM/LnNldERyYWdnaW5nRW5hYmxlZCh0cnVlKVxyXG4gICAgICB9XHJcbiAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGlubGluZS1ibG9jayB3LVsxNHB4XSBoLVsxNHB4XSAgYm9yZGVyLVswLjJweF0gb3ZlcmZsb3ctaGlkZGVuIGJvcmRlci1kYXNoZWRcIlxyXG4gICAgICBzdHlsZT17e1xyXG4gICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZUNvbG9yLFxyXG4gICAgICAgIG1pbldpZHRoOiBoYW5kbGVNaW5XaWR0aCgpIHx8IDAsXHJcbiAgICAgICAgbWluSGVpZ2h0OiBoYW5kbGVNaW5IZWlnaHQoKSB8fCAwXHJcbiAgICAgIH19XHJcbiAgICA+PC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXJCb3JkZXI7XHJcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCBmb3J3YXJkUmVmLCB1c2VSZWYgfSBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHtcclxuICBnZXRNb250aCxcclxuICBnZXRZZWFyLFxyXG4gIG9uQ2hhbmdlSGVpZ2h0T2ZUZXh0QXJlYSxcclxuICBvbkNoYW5nZUlucHV0LFxyXG4gIHJhZGlvQnV0dG9uV2lkZ2V0LFxyXG4gIHJhbmdlLFxyXG4gIHRleHRJbnB1dFdpZGdldCxcclxuICB0ZXh0V2lkZ2V0XHJcbn0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L1V0aWxzXCI7XHJcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gXCJyZWFjdC1kYXRlcGlja2VyXCI7XHJcbmltcG9ydCBcInJlYWN0LWRhdGVwaWNrZXIvZGlzdC9yZWFjdC1kYXRlcGlja2VyLmNzc1wiO1xyXG5pbXBvcnQgXCIuLi8uLi9zdHlsZXMvc2lnbmF0dXJlLmNzc1wiO1xyXG5pbXBvcnQgUmVnZXhQYXJzZXIgZnJvbSBcInJlZ2V4LXBhcnNlclwiO1xyXG5pbXBvcnQgeyBlbWFpbFJlZ2V4IH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L2NvbnN0XCI7XHJcbmNvbnN0IHRleHRXaWRnZXRDbHMgPVxyXG4gIFwidy1mdWxsIGgtZnVsbCBtZDptaW4tdy1mdWxsIG1kOm1pbi1oLWZ1bGwgei1bOTk5XSB0ZXh0LVsxMnB4XSByb3VuZGVkLVsycHhdIGJvcmRlci1bMXB4XSBib3JkZXItWyMwMDdiZmZdIG92ZXJmbG93LWhpZGRlbiByZXNpemUtbm9uZSBvdXRsaW5lLW5vbmUgdGV4dC1iYXNlLWNvbnRlbnQgaXRlbS1jZW50ZXIgd2hpdGVzcGFjZS1wcmUtd3JhcCBiZy13aGl0ZVwiO1xyXG5jb25zdCBzZWxlY3RXaWRnZXRDbHMgPVxyXG4gIFwidy1mdWxsIGgtZnVsbCBhYnNvbHV0ZSBsZWZ0LTAgdG9wLTAgYm9yZGVyLVsxcHhdIGJvcmRlci1bIzAwN2JmZl0gcm91bmRlZC1bMnB4XSBmb2N1czpvdXRsaW5lLW5vbmUgdGV4dC1iYXNlLWNvbnRlbnRcIjtcclxuZnVuY3Rpb24gUGxhY2Vob2xkZXJUeXBlKHByb3BzKSB7XHJcbiAgY29uc3QgdHlwZSA9IHByb3BzPy5wb3M/LnR5cGU7XHJcbiAgY29uc3QgW3NlbGVjdE9wdGlvbiwgc2V0U2VsZWN0T3B0aW9uXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFt2YWxpZGF0ZVBsYWNlaG9sZGVyLCBzZXRWYWxpZGF0ZVBsYWNlaG9sZGVyXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gIGNvbnN0IFt0ZXh0VmFsdWUsIHNldFRleHRWYWx1ZV0gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFtzZWxlY3RlZENoZWNrYm94LCBzZXRTZWxlY3RlZENoZWNrYm94XSA9IHVzZVN0YXRlKFtdKTtcclxuICBjb25zdCB5ZWFycyA9IHJhbmdlKDE5OTAsIGdldFllYXIobmV3IERhdGUoKSkgKyAxNiwgMSk7XHJcbiAgY29uc3QgbW9udGhzID0gW1xyXG4gICAgXCJKYW51YXJ5XCIsXHJcbiAgICBcIkZlYnJ1YXJ5XCIsXHJcbiAgICBcIk1hcmNoXCIsXHJcbiAgICBcIkFwcmlsXCIsXHJcbiAgICBcIk1heVwiLFxyXG4gICAgXCJKdW5lXCIsXHJcbiAgICBcIkp1bHlcIixcclxuICAgIFwiQXVndXN0XCIsXHJcbiAgICBcIlNlcHRlbWJlclwiLFxyXG4gICAgXCJPY3RvYmVyXCIsXHJcbiAgICBcIk5vdmVtYmVyXCIsXHJcbiAgICBcIkRlY2VtYmVyXCJcclxuICBdO1xyXG4gIGNvbnN0IHZhbGlkYXRlRXhwcmVzc2lvbiA9IChyZWdleFZhbGlkYXRpb24pID0+IHtcclxuICAgIGlmICh0ZXh0VmFsdWUgJiYgcmVnZXhWYWxpZGF0aW9uKSB7XHJcbiAgICAgIGxldCByZWdleE9iamVjdCA9IHJlZ2V4VmFsaWRhdGlvbjtcclxuICAgICAgaWYgKHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8udHlwZSA9PT0gXCJyZWdleFwiKSB7XHJcbiAgICAgICAgcmVnZXhPYmplY3QgPSBSZWdleFBhcnNlcihyZWdleFZhbGlkYXRpb24pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIG5ldyBSZWdFeHAocmVnZXhWYWxpZGF0aW9uKTtcclxuICAgICAgbGV0IGlzVmFsaWRhdGUgPSByZWdleE9iamVjdC50ZXN0KHRleHRWYWx1ZSk7XHJcbiAgICAgIGlmICghaXNWYWxpZGF0ZSkge1xyXG4gICAgICAgIHByb3BzPy5zZXRWYWxpZGF0ZUFsZXJ0KHRydWUpO1xyXG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUlucHV0Qmx1ciA9ICgpID0+IHtcclxuICAgIHByb3BzLnNldERyYWdnaW5nRW5hYmxlZCh0cnVlKTtcclxuICAgIGNvbnN0IHZhbGlkYXRlVHlwZSA9IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8udHlwZTtcclxuICAgIGxldCByZWdleFZhbGlkYXRpb247XHJcbiAgICBpZiAodmFsaWRhdGVUeXBlICYmIHZhbGlkYXRlVHlwZSAhPT0gXCJ0ZXh0XCIpIHtcclxuICAgICAgc3dpdGNoICh2YWxpZGF0ZVR5cGUpIHtcclxuICAgICAgICBjYXNlIFwiZW1haWxcIjpcclxuICAgICAgICAgIHJlZ2V4VmFsaWRhdGlvbiA9IGVtYWlsUmVnZXg7XHJcbiAgICAgICAgICB2YWxpZGF0ZUV4cHJlc3Npb24ocmVnZXhWYWxpZGF0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcclxuICAgICAgICAgIHJlZ2V4VmFsaWRhdGlvbiA9IC9eWzAtOVxcc10qJC87XHJcbiAgICAgICAgICB2YWxpZGF0ZUV4cHJlc3Npb24ocmVnZXhWYWxpZGF0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICByZWdleFZhbGlkYXRpb24gPSBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LnBhdHRlcm4gfHwgXCJcIjtcclxuICAgICAgICAgIHZhbGlkYXRlRXhwcmVzc2lvbihyZWdleFZhbGlkYXRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlVGV4dFZhbGlkID0gKGUpID0+IHtcclxuICAgIGNvbnN0IHRleHRJbnB1dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgc2V0VGV4dFZhbHVlKHRleHRJbnB1dCk7XHJcbiAgfTtcclxuICBmdW5jdGlvbiBjaGVja1JlZ3VsYXJFeHByZXNzKHZhbGlkYXRlVHlwZSkge1xyXG4gICAgc3dpdGNoICh2YWxpZGF0ZVR5cGUpIHtcclxuICAgICAgY2FzZSBcImVtYWlsXCI6XHJcbiAgICAgICAgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcihcImRlbW9AZ21haWwuY29tXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcihcIjEyMzQ1XCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwidGV4dFwiOlxyXG4gICAgICAgIHNldFZhbGlkYXRlUGxhY2Vob2xkZXIoXCJwbGVhc2UgZW50ZXIgdGV4dFwiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBzZXRWYWxpZGF0ZVBsYWNlaG9sZGVyKFwicGxlYXNlIGVudGVyIHZhbHVlXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICh0eXBlICYmIHR5cGUgPT09IFwiY2hlY2tib3hcIiAmJiBwcm9wcy5pc05lZWRTaWduKSB7XHJcbiAgICAgIGNvbnN0IGlzRGVmYXVsdFZhbHVlID0gcHJvcHMucG9zLm9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcclxuICAgICAgaWYgKGlzRGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgc2V0U2VsZWN0ZWRDaGVja2JveChpc0RlZmF1bHRWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAocHJvcHMucG9zPy5vcHRpb25zPy5oaW50KSB7XHJcbiAgICAgIHNldFZhbGlkYXRlUGxhY2Vob2xkZXIocHJvcHMucG9zPy5vcHRpb25zLmhpbnQpO1xyXG4gICAgfSBlbHNlIGlmIChwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LnR5cGUpIHtcclxuICAgICAgY2hlY2tSZWd1bGFyRXhwcmVzcyhwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LnR5cGUpO1xyXG4gICAgfVxyXG4gICAgc2V0VGV4dFZhbHVlKFxyXG4gICAgICBwcm9wcy5wb3M/Lm9wdGlvbnM/LnJlc3BvbnNlXHJcbiAgICAgICAgPyBwcm9wcy5wb3M/Lm9wdGlvbnM/LnJlc3BvbnNlXHJcbiAgICAgICAgOiBwcm9wcy5wb3M/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZVxyXG4gICAgICAgICAgPyBwcm9wcy5wb3M/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZVxyXG4gICAgICAgICAgOiBcIlwiXHJcbiAgICApO1xyXG4gICAgc2V0U2VsZWN0T3B0aW9uKFxyXG4gICAgICBwcm9wcy5wb3M/Lm9wdGlvbnM/LnJlc3BvbnNlXHJcbiAgICAgICAgPyBwcm9wcy5wb3M/Lm9wdGlvbnM/LnJlc3BvbnNlXHJcbiAgICAgICAgOiBwcm9wcy5wb3M/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZVxyXG4gICAgICAgICAgPyBwcm9wcy5wb3M/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZVxyXG4gICAgICAgICAgOiBcIlwiXHJcbiAgICApO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmIChcclxuICAgICAgW1wibmFtZVwiLCBcImVtYWlsXCIsIFwiam9iIHRpdGxlXCIsIFwiY29tcGFueVwiXS5pbmNsdWRlcyhwcm9wcy5wb3M/LnR5cGUpICYmXHJcbiAgICAgIHByb3BzLmlzTmVlZFNpZ24gJiZcclxuICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzPy5zaWduZXJPYmpJZFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHREYXRhID0gcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICAgIGlmIChkZWZhdWx0RGF0YSkge1xyXG4gICAgICAgIHNldFRleHRWYWx1ZShkZWZhdWx0RGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWVdKTtcclxuXHJcbiAgY29uc3QgRXhhbXBsZUN1c3RvbUlucHV0ID0gZm9yd2FyZFJlZigoeyB2YWx1ZSwgb25DbGljayB9LCByZWYpID0+IChcclxuICAgIDxkaXZcclxuICAgICAgY2xhc3NOYW1lPXtgJHtzZWxlY3RXaWRnZXRDbHN9IHRleHQtWzEycHhdIG92ZXJmbG93LWhpZGRlbmB9XHJcbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XHJcbiAgICAgIHJlZj17cmVmfVxyXG4gICAgPlxyXG4gICAgICB7dmFsdWV9XHJcbiAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWNhbGVuZGFyICBtbC1bNXB4XVwiPjwvaT5cclxuICAgIDwvZGl2PlxyXG4gICkpO1xyXG4gIEV4YW1wbGVDdXN0b21JbnB1dC5kaXNwbGF5TmFtZSA9IFwiRXhhbXBsZUN1c3RvbUlucHV0XCI7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoXHJcbiAgICAgIFtcIm5hbWVcIiwgXCJlbWFpbFwiLCBcImpvYiB0aXRsZVwiLCBcImNvbXBhbnlcIl0uaW5jbHVkZXModHlwZSkgJiZcclxuICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxyXG4gICAgICBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWRcclxuICAgICkge1xyXG4gICAgICBjb25zdCBpc0RlZmF1bHQgPSB0cnVlO1xyXG4gICAgICBjb25zdCBzZW5kZXJVc2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEV4dGFuZF9DbGFzc2ApO1xyXG4gICAgICBjb25zdCBqc29uU2VuZGVyID0gSlNPTi5wYXJzZShzZW5kZXJVc2VyKTtcclxuICAgICAgb25DaGFuZ2VJbnB1dChcclxuICAgICAgICBqc29uU2VuZGVyICYmIGpzb25TZW5kZXJbMF0sXHJcbiAgICAgICAgbnVsbCxcclxuICAgICAgICBwcm9wcy54eVBvc3Rpb24sXHJcbiAgICAgICAgbnVsbCxcclxuICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgcHJvcHMuZGF0YS5JZCxcclxuICAgICAgICBpc0RlZmF1bHRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbdHlwZV0pO1xyXG4gIC8vZnVuY3Rpb24gZm9yIHNob3cgY2hlY2tlZCBjaGVja2JveFxyXG4gIGNvbnN0IHNlbGVjdENoZWNrYm94ID0gKGluZCkgPT4ge1xyXG4gICAgY29uc3QgcmVzID0gcHJvcHMucG9zLm9wdGlvbnM/LnJlc3BvbnNlO1xyXG4gICAgY29uc3QgZGVmYXVsdENoZWNrID0gcHJvcHMucG9zLm9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcclxuICAgIGlmIChyZXMgJiYgcmVzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGlzU2VsZWN0SW5kZXggPSByZXMuaW5kZXhPZihpbmQpO1xyXG4gICAgICBpZiAoaXNTZWxlY3RJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIH1cclxuICAgIH0gZWxzZSBpZiAoZGVmYXVsdENoZWNrKSB7XHJcbiAgICAgIGNvbnN0IGlzU2VsZWN0SW5kZXggPSBkZWZhdWx0Q2hlY2suaW5kZXhPZihpbmQpO1xyXG4gICAgICBpZiAoaXNTZWxlY3RJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlUmFkaW9DaGVjayA9IChkYXRhKSA9PiB7XHJcbiAgICBjb25zdCBkZWZhdWx0RGF0YSA9IHByb3BzLnBvcy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICBpZiAodGV4dFZhbHVlID09PSBkYXRhKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChkZWZhdWx0RGF0YSA9PT0gZGF0YSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvL2Z1bmN0aW9uIGZvciBzZXQgY2hlY2tlZCBhbmQgdW5jaGVja2VkIHZhbHVlIG9mIGNoZWNrYm94XHJcbiAgY29uc3QgaGFuZGxlQ2hlY2tib3hWYWx1ZSA9IChpc0NoZWNrZWQsIGluZCkgPT4ge1xyXG4gICAgbGV0IHVwZGF0ZVNlbGVjdGVkQ2hlY2tib3ggPSBbXSxcclxuICAgICAgY2hlY2tlZExpc3Q7XHJcbiAgICBsZXQgaXNEZWZhdWx0VmFsdWUsIGlzRGVmYXVsdEVtcHR5O1xyXG4gICAgaWYgKHR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICB1cGRhdGVTZWxlY3RlZENoZWNrYm94ID0gc2VsZWN0ZWRDaGVja2JveCA/IHNlbGVjdGVkQ2hlY2tib3ggOiBbXTtcclxuXHJcbiAgICAgIGlmIChpc0NoZWNrZWQpIHtcclxuICAgICAgICB1cGRhdGVTZWxlY3RlZENoZWNrYm94LnB1c2goaW5kKTtcclxuICAgICAgICBzZXRTZWxlY3RlZENoZWNrYm94KHVwZGF0ZVNlbGVjdGVkQ2hlY2tib3gpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNoZWNrZWRMaXN0ID0gc2VsZWN0ZWRDaGVja2JveC5maWx0ZXIoKGRhdGEpID0+IGRhdGEgIT09IGluZCk7XHJcbiAgICAgICAgc2V0U2VsZWN0ZWRDaGVja2JveChjaGVja2VkTGlzdCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHByb3BzLmlzTmVlZFNpZ24pIHtcclxuICAgICAgICBpc0RlZmF1bHRWYWx1ZSA9IHByb3BzLnBvcy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlzRGVmYXVsdFZhbHVlICYmIGlzRGVmYXVsdFZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpc0RlZmF1bHRFbXB0eSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgb25DaGFuZ2VJbnB1dChcclxuICAgICAgICBjaGVja2VkTGlzdCA/IGNoZWNrZWRMaXN0IDogdXBkYXRlU2VsZWN0ZWRDaGVja2JveCxcclxuICAgICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhLklkLFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIG51bGwsXHJcbiAgICAgICAgaXNEZWZhdWx0RW1wdHlcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvL2Z1bmN0aW9uIHRvIGhhbmRsZSBzZWxlY3QgcmFkaW8gd2lkZ2V0IGFuZCBzZXQgdmFsdWUgc2VsZXRjZWQgYnkgdXNlclxyXG4gIGNvbnN0IGhhbmRsZUNoZWNrUmFkaW8gPSAoaXNDaGVja2VkLCBkYXRhKSA9PiB7XHJcbiAgICBsZXQgaXNEZWZhdWx0VmFsdWUsXHJcbiAgICAgIGlzRGVmYXVsdEVtcHR5LFxyXG4gICAgICBpc1JhZGlvID0gdHJ1ZTtcclxuICAgIGlmIChwcm9wcy5pc05lZWRTaWduKSB7XHJcbiAgICAgIGlzRGVmYXVsdFZhbHVlID0gcHJvcHMucG9zLm9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcclxuICAgIH1cclxuICAgIGlmIChpc0RlZmF1bHRWYWx1ZSkge1xyXG4gICAgICBpc0RlZmF1bHRFbXB0eSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoaXNDaGVja2VkKSB7XHJcbiAgICAgIHNldFRleHRWYWx1ZShkYXRhKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNldFRleHRWYWx1ZShcIlwiKTtcclxuICAgIH1cclxuICAgIG9uQ2hhbmdlSW5wdXQoXHJcbiAgICAgIGRhdGEsXHJcbiAgICAgIHByb3BzLnBvcy5rZXksXHJcbiAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgcHJvcHMuaW5kZXgsXHJcbiAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcclxuICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhLklkLFxyXG4gICAgICBmYWxzZSxcclxuICAgICAgbnVsbCxcclxuICAgICAgaXNEZWZhdWx0RW1wdHksXHJcbiAgICAgIGlzUmFkaW9cclxuICAgICk7XHJcbiAgfTtcclxuICAvL2Z1bmN0aW9uIHRvIHNldCBvbmNoYW5nZSBkYXRlXHJcbiAgY29uc3QgaGFuZGxlT25EYXRlQ2hhbmdlID0gKGRhdGUpID0+IHtcclxuICAgIHByb3BzLnNldFN0YXJ0RGF0ZShkYXRlKTtcclxuICAgIGNvbnN0IGlzRGF0ZUNoYW5nZSA9IHRydWU7XHJcbiAgICBjb25zdCBkYXRlT2JqID0ge1xyXG4gICAgICBkYXRlOiBkYXRlLFxyXG4gICAgICBmb3JtYXQ6IHByb3BzLnNlbGVjdERhdGUuZm9ybWF0XHJcbiAgICB9O1xyXG4gICAgcHJvcHMuaGFuZGxlU2F2ZURhdGUoZGF0ZU9iaiwgaXNEYXRlQ2hhbmdlKTtcclxuICB9O1xyXG4gIC8vaGFuZGxlIGhlaWdodCBvbiBlbnRlciBwcmVzcyBpbiB0ZXh0IGFyZWFcclxuICBjb25zdCBoYW5kbGVFbnRlclByZXNzID0gKGUpID0+IHtcclxuICAgIGNvbnN0IGhlaWdodCA9IDE4O1xyXG4gICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHtcclxuICAgICAgLy9mdW5jdGlvbiB0byBzYXZlIGhlaWdodCBvZiB0ZXh0IGFyZWFcclxuICAgICAgb25DaGFuZ2VIZWlnaHRPZlRleHRBcmVhKFxyXG4gICAgICAgIGhlaWdodCxcclxuICAgICAgICBwcm9wcy5wb3MudHlwZSxcclxuICAgICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICBjYXNlIFwic2lnbmF0dXJlXCI6XHJcbiAgICAgIHJldHVybiBwcm9wcy5wb3MuU2lnblVybCA/IChcclxuICAgICAgICA8aW1nXHJcbiAgICAgICAgICBhbHQ9XCJzaWduYXR1cmVcIlxyXG4gICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxyXG4gICAgICAgICAgc3JjPXtwcm9wcy5wb3MuU2lnblVybH1cclxuICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgXCJcclxuICAgICAgICAvPlxyXG4gICAgICApIDogKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gdy1mdWxsIGgtZnVsbCB0ZXh0LWJsYWNrIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICB7cHJvcHM/LmhhbmRsZVVzZXJOYW1lICYmXHJcbiAgICAgICAgICAgIHByb3BzPy5oYW5kbGVVc2VyTmFtZShcclxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uSWQsXHJcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LlJvbGUsXHJcbiAgICAgICAgICAgICAgcHJvcHM/LnBvcz8udHlwZVxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApO1xyXG4gICAgY2FzZSBcInN0YW1wXCI6XHJcbiAgICAgIHJldHVybiBwcm9wcy5wb3MuU2lnblVybCA/IChcclxuICAgICAgICA8aW1nXHJcbiAgICAgICAgICBhbHQ9XCJzdGFtcFwiXHJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXHJcbiAgICAgICAgICBzcmM9e3Byb3BzLnBvcy5TaWduVXJsfVxyXG4gICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxyXG4gICAgICAgICAgICBwcm9wcz8uaGFuZGxlVXNlck5hbWUoXHJcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LklkLFxyXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5Sb2xlLFxyXG4gICAgICAgICAgICAgIHByb3BzPy5wb3M/LnR5cGVcclxuICAgICAgICAgICAgKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgXCJjaGVja2JveFwiOlxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIDxkaXYgc3R5bGU9e3sgekluZGV4OiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiAmJiBcIjk5XCIgfX0+XHJcbiAgICAgICAgICB7cHJvcHMucG9zLm9wdGlvbnM/LnZhbHVlcz8ubWFwKChkYXRhLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICA8ZGl2IGtleT17aW5kfSBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlciBnYXAtMC41XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcclxuICAgICAgICAgICAgICAgICAgICBpbmQgPT09IDAgPyBcIm10LTBcIiA6IFwibXQtWzVweF1cIlxyXG4gICAgICAgICAgICAgICAgICB9IGZsZXgganVzdGlmeS1jZW50ZXIgb3AtY2hlY2tib3ggb3AtY2hlY2tib3gteHMgcm91bmRlZC1bMC4zNTByZW1dYH1cclxuICAgICAgICAgICAgICAgICAgb25CbHVyPXtoYW5kbGVJbnB1dEJsdXJ9XHJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5pc05lZWRTaWduICYmXHJcbiAgICAgICAgICAgICAgICAgICAgKHByb3BzLnBvcy5vcHRpb25zPy5pc1JlYWRPbmx5IHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCAhPT0gcHJvcHMuc2lnbmVyT2JqSWQpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0Q2hlY2tib3goaW5kKX1cclxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0LmNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvcHMuaXNQbGFjZWhvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhSZXF1aXJlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMucG9zLm9wdGlvbnM/LnZhbGlkYXRpb24/Lm1heFJlcXVpcmVkQ291bnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heENvdW50SW50ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZXF1aXJlZCAmJiBwYXJzZUludChtYXhSZXF1aXJlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4Q291bnRJbnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaGVja2JveCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaGVja2JveD8ubGVuZ3RoIDw9IG1heENvdW50SW50IC0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tib3hWYWx1ZShlLnRhcmdldC5jaGVja2VkLCBpbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDaGVja2JveFZhbHVlKGUudGFyZ2V0LmNoZWNrZWQsIGluZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tib3hWYWx1ZShlLnRhcmdldC5jaGVja2VkLCBpbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICB7IXByb3BzLnBvcy5vcHRpb25zPy5pc0hpZGVMYWJlbCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1iLTAgdGV4dC1jZW50ZXJcIj57ZGF0YX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0pfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApO1xyXG4gICAgY2FzZSB0ZXh0SW5wdXRXaWRnZXQ6XHJcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxyXG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCkgPyAoXHJcbiAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3ZhbGlkYXRlUGxhY2Vob2xkZXIgfHwgXCJwbGVhc2UgZW50ZXIgdmFsdWVcIn1cclxuICAgICAgICAgIHJvd3M9ezF9XHJcbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XHJcbiAgICAgICAgICB2YWx1ZT17dGV4dFZhbHVlfVxyXG4gICAgICAgICAgb25CbHVyPXtoYW5kbGVJbnB1dEJsdXJ9XHJcbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcclxuICAgICAgICAgICAgc2V0VGV4dFZhbHVlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcclxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcclxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcclxuICAgICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemVcclxuICAgICAgICAgICAgICA/IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZSArIFwicHhcIlxyXG4gICAgICAgICAgICAgIDogXCIxMnB4XCIsXHJcbiAgICAgICAgICAgIGNvbG9yOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIlxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNvbHM9XCI1MFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBmb250U2l6ZTogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplXHJcbiAgICAgICAgICAgICAgPyBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemUgKyBcInB4XCJcclxuICAgICAgICAgICAgICA6IFwiMTJweFwiLFxyXG4gICAgICAgICAgICBjb2xvcjogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCIsXHJcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuPnt0eXBlfTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgXCJkcm9wZG93blwiOlxyXG4gICAgICByZXR1cm4gcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkID8gKFxyXG4gICAgICAgIDxzZWxlY3RcclxuICAgICAgICAgIGNsYXNzTmFtZT17YCR7c2VsZWN0V2lkZ2V0Q2xzfSB0ZXh0LVsxMnB4XSBiZy1pbmhlcml0YH1cclxuICAgICAgICAgIGlkPVwibXlEcm9wZG93blwiXHJcbiAgICAgICAgICB2YWx1ZT17c2VsZWN0T3B0aW9ufVxyXG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldFNlbGVjdE9wdGlvbihlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQoXHJcbiAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUsXHJcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcclxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuaW5kZXgsXHJcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxyXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWQsXHJcbiAgICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgey8qIERlZmF1bHQvVGl0bGUgb3B0aW9uICovfVxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIGRpc2FibGVkIGhpZGRlbj5cclxuICAgICAgICAgICAge3Byb3BzPy5wb3M/Lm9wdGlvbnM/Lm5hbWV9XHJcbiAgICAgICAgICA8L29wdGlvbj5cclxuXHJcbiAgICAgICAgICB7cHJvcHMucG9zPy5vcHRpb25zPy52YWx1ZXM/Lm1hcCgoZGF0YSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e2luZH0gdmFsdWU9e2RhdGF9PlxyXG4gICAgICAgICAgICAgICAge2RhdGF9XHJcbiAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KX1cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzEycHhdIG92ZXJmbG93LWhpZGRlblwiPlxyXG4gICAgICAgICAge3Byb3BzLnBvcz8ub3B0aW9ucz8ubmFtZSA/IHByb3BzLnBvcy5vcHRpb25zLm5hbWUgOiB0eXBlfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApO1xyXG4gICAgY2FzZSBcImluaXRpYWxzXCI6XHJcbiAgICAgIHJldHVybiBwcm9wcy5wb3MuU2lnblVybCA/IChcclxuICAgICAgICA8aW1nXHJcbiAgICAgICAgICBhbHQ9XCJpbml0aWFsc1wiXHJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXHJcbiAgICAgICAgICBzcmM9e3Byb3BzLnBvcy5TaWduVXJsfVxyXG4gICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxyXG4gICAgICAgICAgICBwcm9wcz8uaGFuZGxlVXNlck5hbWUoXHJcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LklkLFxyXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5Sb2xlLFxyXG4gICAgICAgICAgICAgIHByb3BzPy5wb3M/LnR5cGVcclxuICAgICAgICAgICAgKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgXCJuYW1lXCI6XHJcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxyXG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCkgPyAoXHJcbiAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9e1wibmFtZVwifVxyXG4gICAgICAgICAgcm93cz17MX1cclxuICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlRW50ZXJQcmVzc31cclxuICAgICAgICAgIHZhbHVlPXt0ZXh0VmFsdWV9XHJcbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXNEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGhhbmRsZVRleHRWYWxpZChlKTtcclxuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcclxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcclxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcclxuICAgICAgICAgICAgICBpc0RlZmF1bHRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICBjbGFzc05hbWU9e3RleHRXaWRnZXRDbHN9XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBmb250U2l6ZTogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplXHJcbiAgICAgICAgICAgICAgPyBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemUgKyBcInB4XCJcclxuICAgICAgICAgICAgICA6IFwiMTJweFwiLFxyXG4gICAgICAgICAgICBjb2xvcjogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCJcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICBjb2xzPVwiNTBcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICkgOiAoXHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgZm9udFNpemU6IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZVxyXG4gICAgICAgICAgICAgID8gcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplICsgXCJweFwiXHJcbiAgICAgICAgICAgICAgOiBcIjEycHhcIixcclxuICAgICAgICAgICAgY29sb3I6IHByb3BzLnBvcy5vcHRpb25zPy5mb250Q29sb3IgfHwgXCJibGFja1wiLFxyXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCIsXHJcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuPnt0eXBlfTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgXCJjb21wYW55XCI6XHJcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxyXG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCkgPyAoXHJcbiAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB0ZXh0XCJcclxuICAgICAgICAgIHJvd3M9ezF9XHJcbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XHJcbiAgICAgICAgICB2YWx1ZT17dGV4dFZhbHVlfVxyXG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgIGhhbmRsZVRleHRWYWxpZChlKTtcclxuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcclxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcclxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcclxuICAgICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemVcclxuICAgICAgICAgICAgICA/IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZSArIFwicHhcIlxyXG4gICAgICAgICAgICAgIDogXCIxMnB4XCIsXHJcbiAgICAgICAgICAgIGNvbG9yOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIlxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNvbHM9XCI1MFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBmb250U2l6ZTogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplXHJcbiAgICAgICAgICAgICAgPyBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemUgKyBcInB4XCJcclxuICAgICAgICAgICAgICA6IFwiMTJweFwiLFxyXG4gICAgICAgICAgICBjb2xvcjogcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCIsXHJcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxyXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCJcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4+e3R5cGV9PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApO1xyXG4gICAgY2FzZSBcImpvYiB0aXRsZVwiOlxyXG4gICAgICByZXR1cm4gcHJvcHMuaXNTaWduWW91cnNlbGYgfHxcclxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxyXG4gICAgICAgIDx0ZXh0YXJlYVxyXG4gICAgICAgICAgcmVmPXtpbnB1dFJlZn1cclxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtcImpvYiB0aXRsZVwifVxyXG4gICAgICAgICAgcm93cz17MX1cclxuICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlRW50ZXJQcmVzc31cclxuICAgICAgICAgIHZhbHVlPXt0ZXh0VmFsdWV9XHJcbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcclxuICAgICAgICAgICAgaGFuZGxlVGV4dFZhbGlkKGUpO1xyXG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxyXG4gICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxyXG4gICAgICAgICAgICAgIHByb3BzLnBvcy5rZXksXHJcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxyXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxyXG4gICAgICAgICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxyXG4gICAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgICAgY2xhc3NOYW1lPXt0ZXh0V2lkZ2V0Q2xzfVxyXG4gICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgZm9udFNpemU6IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZVxyXG4gICAgICAgICAgICAgID8gcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRTaXplICsgXCJweFwiXHJcbiAgICAgICAgICAgICAgOiBcIjEycHhcIixcclxuICAgICAgICAgICAgY29sb3I6IHByb3BzLnBvcy5vcHRpb25zPy5mb250Q29sb3IgfHwgXCJibGFja1wiXHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgICAgY29scz1cIjUwXCJcclxuICAgICAgICAvPlxyXG4gICAgICApIDogKFxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemVcclxuICAgICAgICAgICAgICA/IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZSArIFwicHhcIlxyXG4gICAgICAgICAgICAgIDogXCIxMnB4XCIsXHJcbiAgICAgICAgICAgIGNvbG9yOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIixcclxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiLFxyXG4gICAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxyXG4gICAgICAgICAgfX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c3Bhbj57dHlwZX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICk7XHJcbiAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICByZXR1cm4gcHJvcHMuaXNTaWduWW91cnNlbGYgfHxcclxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8RGF0ZVBpY2tlclxyXG4gICAgICAgICAgICByZW5kZXJDdXN0b21IZWFkZXI9eyh7IGRhdGUsIGNoYW5nZVllYXIsIGNoYW5nZU1vbnRoIH0pID0+IChcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1zdGFydCBtbC0yIFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJiZy10cmFuc3BhcmVudCBvdXRsaW5lLW5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17bW9udGhzW2dldE1vbnRoKGRhdGUpXX1cclxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh7IHRhcmdldDogeyB2YWx1ZSB9IH0pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlTW9udGgobW9udGhzLmluZGV4T2YodmFsdWUpKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIHttb250aHMubWFwKChvcHRpb24pID0+IChcclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17b3B0aW9ufSB2YWx1ZT17b3B0aW9ufT5cclxuICAgICAgICAgICAgICAgICAgICAgIHtvcHRpb259XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICkpfVxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLXRyYW5zcGFyZW50IG91dGxpbmUtbm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXtnZXRZZWFyKGRhdGUpfVxyXG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHsgdGFyZ2V0OiB7IHZhbHVlIH0gfSkgPT4gY2hhbmdlWWVhcih2YWx1ZSl9XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIHt5ZWFycy5tYXAoKG9wdGlvbikgPT4gKFxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtvcHRpb259IHZhbHVlPXtvcHRpb259PlxyXG4gICAgICAgICAgICAgICAgICAgICAge29wdGlvbn1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgZGlzYWJsZWQ9e1xyXG4gICAgICAgICAgICAgIHByb3BzLmlzUGxhY2Vob2xkZXIgfHxcclxuICAgICAgICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJlxyXG4gICAgICAgICAgICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgIT09IHByb3BzLnNpZ25lck9iaklkKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9uQmx1cj17aGFuZGxlSW5wdXRCbHVyfVxyXG4gICAgICAgICAgICBjbG9zZU9uU2Nyb2xsPXt0cnVlfVxyXG4gICAgICAgICAgICBjbGFzc05hbWU9e2Ake3NlbGVjdFdpZGdldENsc30gb3V0bGluZS1bIzAwN2JmZl1gfVxyXG4gICAgICAgICAgICBzZWxlY3RlZD17XHJcbiAgICAgICAgICAgICAgcHJvcHM/LnN0YXJ0RGF0ZVxyXG4gICAgICAgICAgICAgICAgPyBwcm9wcz8uc3RhcnREYXRlXHJcbiAgICAgICAgICAgICAgICA6IHByb3BzLnBvcy5vcHRpb25zPy5yZXNwb25zZSAmJlxyXG4gICAgICAgICAgICAgICAgICBuZXcgRGF0ZShwcm9wcy5wb3Mub3B0aW9ucy5yZXNwb25zZSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvbkNoYW5nZT17KGRhdGUpID0+IGhhbmRsZU9uRGF0ZUNoYW5nZShkYXRlKX1cclxuICAgICAgICAgICAgcG9wcGVyUGxhY2VtZW50PVwidG9wLWVuZFwiXHJcbiAgICAgICAgICAgIGN1c3RvbUlucHV0PXs8RXhhbXBsZUN1c3RvbUlucHV0IC8+fVxyXG4gICAgICAgICAgICBkYXRlRm9ybWF0PXtcclxuICAgICAgICAgICAgICBwcm9wcy5zZWxlY3REYXRlXHJcbiAgICAgICAgICAgICAgICA/IHByb3BzLnNlbGVjdERhdGU/LmZvcm1hdFxyXG4gICAgICAgICAgICAgICAgOiBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LmZvcm1hdFxyXG4gICAgICAgICAgICAgICAgICA/IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XHJcbiAgICAgICAgICAgICAgICAgIDogXCJNTS9kZC95eXl5XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzEycHhdIHRleHQtYmxhY2sgaXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlblwiPlxyXG4gICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgIHtwcm9wcy5zZWxlY3REYXRlXHJcbiAgICAgICAgICAgICAgPyBwcm9wcy5zZWxlY3REYXRlPy5mb3JtYXRcclxuICAgICAgICAgICAgICA6IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XHJcbiAgICAgICAgICAgICAgICA/IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XHJcbiAgICAgICAgICAgICAgICA6IFwiTU0vZGQveXl5eVwifVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApO1xyXG4gICAgY2FzZSBcImltYWdlXCI6XHJcbiAgICAgIHJldHVybiBwcm9wcy5wb3MuU2lnblVybCA/IChcclxuICAgICAgICA8aW1nXHJcbiAgICAgICAgICBhbHQ9XCJpbWFnZVwiXHJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXHJcbiAgICAgICAgICBzcmM9e3Byb3BzLnBvcy5TaWduVXJsfVxyXG4gICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxyXG4gICAgICAgICAgICBwcm9wcz8uaGFuZGxlVXNlck5hbWUoXHJcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LklkLFxyXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5Sb2xlLFxyXG4gICAgICAgICAgICAgIHByb3BzPy5wb3M/LnR5cGVcclxuICAgICAgICAgICAgKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICByZXR1cm4gcHJvcHMuaXNTaWduWW91cnNlbGYgfHxcclxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxyXG4gICAgICAgIDx0ZXh0YXJlYVxyXG4gICAgICAgICAgcmVmPXtpbnB1dFJlZn1cclxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtcImVudGVyIGVtYWlsXCJ9XHJcbiAgICAgICAgICByb3dzPXsxfVxyXG4gICAgICAgICAgb25LZXlEb3duPXtoYW5kbGVFbnRlclByZXNzfVxyXG4gICAgICAgICAgdmFsdWU9e3RleHRWYWx1ZX1cclxuICAgICAgICAgIG9uQmx1cj17aGFuZGxlSW5wdXRCbHVyfVxyXG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgIGhhbmRsZVRleHRWYWxpZChlKTtcclxuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcclxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcclxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcclxuICAgICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemVcclxuICAgICAgICAgICAgICA/IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZSArIFwicHhcIlxyXG4gICAgICAgICAgICAgIDogXCIxMnB4XCIsXHJcbiAgICAgICAgICAgIGNvbG9yOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIixcclxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiXHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgICAgY29scz1cIjUwXCJcclxuICAgICAgICAvPlxyXG4gICAgICApIDogKFxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemVcclxuICAgICAgICAgICAgICA/IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZSArIFwicHhcIlxyXG4gICAgICAgICAgICAgIDogXCIxMnB4XCIsXHJcbiAgICAgICAgICAgIGNvbG9yOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIixcclxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiLFxyXG4gICAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxyXG4gICAgICAgICAgfX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c3Bhbj57dHlwZX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICk7XHJcbiAgICBjYXNlIHJhZGlvQnV0dG9uV2lkZ2V0OlxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICB7cHJvcHMucG9zLm9wdGlvbnM/LnZhbHVlcy5tYXAoKGRhdGEsIGluZCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgIDxkaXYga2V5PXtpbmR9IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtY2VudGVyIGdhcC0wLjVcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgICAgICAgICAgIGluZCA9PT0gMCA/IFwibXQtMFwiIDogXCJtdC1bNXB4XVwiXHJcbiAgICAgICAgICAgICAgICAgIH0gJHtcInctWzE1cHhdIGgtWzE1cHhdXCJ9IGZsZXgganVzdGlmeS1jZW50ZXIgb3AtcmFkaW9gfVxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgIChwcm9wcy5wb3Mub3B0aW9ucz8uaXNSZWFkT25seSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgIT09IHByb3BzLnNpZ25lck9iaklkKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2hhbmRsZVJhZGlvQ2hlY2soZGF0YSl9XHJcbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJvcHMuaXNQbGFjZWhvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tSYWRpbyhlLnRhcmdldC5jaGVja2VkLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgeyFwcm9wcy5wb3Mub3B0aW9ucz8uaXNIaWRlTGFiZWwgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwidGV4dC14cyBtYi0wXCI+e2RhdGF9PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgdGV4dFdpZGdldDpcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgdGV4dFwiXHJcbiAgICAgICAgICByb3dzPXsxfVxyXG4gICAgICAgICAgb25LZXlEb3duPXtoYW5kbGVFbnRlclByZXNzfVxyXG4gICAgICAgICAgdmFsdWU9e3RleHRWYWx1ZX1cclxuICAgICAgICAgIG9uQmx1cj17aGFuZGxlSW5wdXRCbHVyfVxyXG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRleHRWYWx1ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQoXHJcbiAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUsXHJcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcclxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuaW5kZXgsXHJcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxyXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWQsXHJcbiAgICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICBjbGFzc05hbWU9e3RleHRXaWRnZXRDbHN9XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCIsXHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemVcclxuICAgICAgICAgICAgICA/IHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZSArIFwicHhcIlxyXG4gICAgICAgICAgICAgIDogXCIxMnB4XCIsXHJcbiAgICAgICAgICAgIGNvbG9yOiBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIlxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNvbHM9XCI1MFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKTtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiBwcm9wcy5wb3MuU2lnblVybCA/IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmVcIj5cclxuICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgYWx0PVwiaW1hZ2VcIlxyXG4gICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgIHNyYz17cHJvcHMucG9zLlNpZ25Vcmx9XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGxcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAge3Byb3BzLnBvcy5pc1N0YW1wID8gPGRpdj5zdGFtcDwvZGl2PiA6IDxkaXY+c2lnbmF0dXJlPC9kaXY+fVxyXG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxyXG4gICAgICAgICAgICBwcm9wcz8uaGFuZGxlVXNlck5hbWUocHJvcHM/LmRhdGE/LklkLCBwcm9wcz8uZGF0YT8uUm9sZSl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQbGFjZWhvbGRlclR5cGU7XHJcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuZnVuY3Rpb24gUHJldk5leHQoeyBwYWdlTnVtYmVyLCBhbGxQYWdlcywgY2hhbmdlUGFnZSB9KSB7XG4gIC8vZm9yIGdvIHRvIHByZXZpb3VzIHBhZ2VcbiAgZnVuY3Rpb24gcHJldmlvdXNQYWdlKCkge1xuICAgIGNoYW5nZVBhZ2UoLTEpO1xuICB9XG4gIC8vZm9yIGdvIHRvIG5leHQgcGFnZVxuICBmdW5jdGlvbiBuZXh0UGFnZSgpIHtcbiAgICBjaGFuZ2VQYWdlKDEpO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tbmV1dHJhbCBvcC1idG4teHMgbWQ6b3AtYnRuLXNtIGZvbnQtc2VtaWJvbGQgdGV4dC14c1wiXG4gICAgICAgIGRpc2FibGVkPXtwYWdlTnVtYmVyIDw9IDF9XG4gICAgICAgIG9uQ2xpY2s9e3ByZXZpb3VzUGFnZX1cbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmxvY2sgbGc6aGlkZGVuXCI+XG4gICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYmFja3dhcmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibGc6YmxvY2sgaGlkZGVuIDJ4bDp0ZXh0LVszMHB4XVwiPlByZXY8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1iYXNlLWNvbnRlbnQgZm9udC1tZWRpdW0gbXgtMiAyeGw6dGV4dC1bMzBweF1cIj5cbiAgICAgICAge3BhZ2VOdW1iZXIgfHwgKGFsbFBhZ2VzID8gMSA6IFwiLS1cIil9IG9mIHthbGxQYWdlcyB8fCBcIi0tXCJ9XG4gICAgICA8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tbmV1dHJhbCBvcC1idG4teHMgbWQ6b3AtYnRuLXNtIGZvbnQtc2VtaWJvbGQgdGV4dC14c1wiXG4gICAgICAgIGRpc2FibGVkPXtwYWdlTnVtYmVyID49IGFsbFBhZ2VzfVxuICAgICAgICBvbkNsaWNrPXtuZXh0UGFnZX1cbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmxvY2sgbGc6aGlkZGVuXCI+XG4gICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZm9yd2FyZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJsZzpibG9jayBoaWRkZW4gMnhsOnRleHQtWzMwcHhdXCI+TmV4dDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBQcmV2TmV4dDtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgRG9jdW1lbnQsIFBhZ2UgfSBmcm9tIFwicmVhY3QtcGRmXCI7XHJcbmltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSBcInJlYWN0LXJlZHV4XCI7XHJcblxyXG5mdW5jdGlvbiBSZW5kZXJBbGxQZGZQYWdlKHtcclxuICBzaWduUGRmVXJsLFxyXG4gIGFsbFBhZ2VzLFxyXG4gIHNldEFsbFBhZ2VzLFxyXG4gIHNldFBhZ2VOdW1iZXIsXHJcbiAgc2V0U2lnbkJ0blBvc2l0aW9uLFxyXG4gIHBhZ2VOdW1iZXIsXHJcbiAgc2lnbmVyUG9zLFxyXG4gIHNpZ25lck9iamVjdElkLFxyXG4gIGNvbnRhaW5lcldIXHJcbn0pIHtcclxuICBjb25zdCBbc2lnblBhZ2VOdW1iZXIsIHNldFNpZ25QYWdlTnVtYmVyXSA9IHVzZVN0YXRlKFtdKTtcclxuICBjb25zdCBbYm9va21hcmtDb2xvciwgc2V0Qm9va21hcmtDb2xvcl0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICAvL3NldCBhbGwgbnVtYmVyIG9mIHBhZ2VzIGFmdGVyIGxvYWQgcGRmXHJcbiAgZnVuY3Rpb24gb25Eb2N1bWVudExvYWQoeyBudW1QYWdlcyB9KSB7XHJcbiAgICBzZXRBbGxQYWdlcyhudW1QYWdlcyk7XHJcbiAgICAvL2NoZWNrIGlmIHNpZ25lclBvcyBhcnJheSBleGlzdCB0aGVuIHNhdmUgcGFnZSBudW1iZXIgZXhpc3QgaW4gc2lnbmVyUG9zIGFycmF5IHRvIHNob3cgYm9va21hcmsgaWNvblxyXG4gICAgaWYgKHNpZ25lclBvcykge1xyXG4gICAgICBjb25zdCBjaGVja1VzZXIgPSBzaWduZXJQb3MuZmlsdGVyKFxyXG4gICAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZFxyXG4gICAgICApO1xyXG4gICAgICBzZXRCb29rbWFya0NvbG9yKGNoZWNrVXNlclswXT8uYmxvY2tDb2xvcik7XHJcbiAgICAgIGxldCBwYWdlTnVtYmVyQXJyID0gW107XHJcbiAgICAgIGlmIChjaGVja1VzZXI/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjaGVja1VzZXJbMF0/LnBsYWNlSG9sZGVyPy5tYXAoKGRhdGEpID0+IHtcclxuICAgICAgICAgIHBhZ2VOdW1iZXJBcnIucHVzaChkYXRhPy5wYWdlTnVtYmVyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2V0U2lnblBhZ2VOdW1iZXIocGFnZU51bWJlckFycik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgY29uc3QgcGFnZUNvbnRhaW5lciA9IHVzZVJlZigpO1xyXG4gIGNvbnN0IGlzSGVhZGVyID0gdXNlU2VsZWN0b3IoKHN0YXRlKSA9PiBzdGF0ZS5zaG93SGVhZGVyKTtcclxuICBjb25zdCBbcGFnZVdpZHRoLCBzZXRQYWdlV2lkdGhdID0gdXNlU3RhdGUoXCJcIik7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCB1cGRhdGVTaXplID0gKCkgPT4ge1xyXG4gICAgICBpZiAocGFnZUNvbnRhaW5lci5jdXJyZW50KSB7XHJcbiAgICAgICAgc2V0UGFnZVdpZHRoKHBhZ2VDb250YWluZXIuY3VycmVudC5vZmZzZXRXaWR0aCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gd2FpdCBmb3IgdGhlIHRyYW5zaXRpb24gdG8gY29tcGxldGVcclxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCh1cGRhdGVTaXplLCAxMDApOyAvLyBtYXRjaCB0aGUgdHJhbnNpdGlvbiBkdXJhdGlvblxyXG5cclxuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpO1xyXG4gIH0sIFtpc0hlYWRlciwgcGFnZUNvbnRhaW5lciwgY29udGFpbmVyV0hdKTtcclxuICAvLydmdW5jdGlvbiBgYWRkU2lnbmF0dXJlQm9va21hcmtgIGlzIHVzZWQgdG8gZGlzcGxheSB0aGUgcGFnZSB3aGVyZSB0aGUgdXNlcidzIHNpZ25hdHVyZSBpcyBsb2NhdGVkLlxyXG4gIGNvbnN0IGFkZFNpZ25hdHVyZUJvb2ttYXJrID0gKGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCBpc3BhZ2VOdW1iZXIgPSBzaWduUGFnZU51bWJlci5pbmNsdWRlcyhpbmRleCArIDEpO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgaXNwYWdlTnVtYmVyICYmIChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIHotMjAgdG9wLVsxcHhdIC1yaWdodC1bMTNweF0gLXRyYW5zbGF0ZS14LTEvMiAtdHJhbnNsYXRlLXktMS8yXCI+XHJcbiAgICAgICAgICA8aVxyXG4gICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogYm9va21hcmtDb2xvciB8fCBcInJlZFwiIH19XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLXNvbGlkIGZhLWJvb2ttYXJrXCJcclxuICAgICAgICAgID48L2k+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfTtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiByZWY9e3BhZ2VDb250YWluZXJ9IGNsYXNzTmFtZT1cImhpZGRlbiB3LVsyMCVdIGJnLWJhc2UtMTAwIG1kOmJsb2NrXCI+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtMiBwci0yIHB0LTIgcGItMSB0ZXh0LVsxNXB4XSB0ZXh0LWJhc2UtY29udGVudCBmb250LXNlbWlib2xkIGJvcmRlci1iLVsxcHhdIGJvcmRlci1iYXNlLTMwMFwiPlxyXG4gICAgICAgIFBhZ2VzXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3NOYW1lPXtgZmxleCBoLVs5MCVdIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBtLTIgIFxyXG4gICAgICAgICBhdXRvU2lnblNjcm9sbCBoaWRlLXNjcm9sbGJhciBtYXgtaC1bMTAwdmhdIGB9XHJcbiAgICAgID5cclxuICAgICAgICA8RG9jdW1lbnRcclxuICAgICAgICAgIGxvYWRpbmc9e1wiTG9hZGluZyBEb2N1bWVudC4uXCJ9XHJcbiAgICAgICAgICBvbkxvYWRTdWNjZXNzPXtvbkRvY3VtZW50TG9hZH1cclxuICAgICAgICAgIGZpbGU9e3NpZ25QZGZVcmx9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge0FycmF5LmZyb20obmV3IEFycmF5KGFsbFBhZ2VzKSwgKGVsLCBpbmRleCkgPT4gKFxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAga2V5PXtpbmRleH1cclxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgICAgICAgcGFnZU51bWJlciAtIDEgPT09IGluZGV4ID8gXCJib3JkZXItW3JlZF1cIiA6IFwiYm9yZGVyLVsjODc4Nzg3XVwiXHJcbiAgICAgICAgICAgICAgfSBib3JkZXItMiAgIG0tWzEwcHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHJlbGF0aXZlYH1cclxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXRQYWdlTnVtYmVyKGluZGV4ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2V0U2lnbkJ0blBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNldFNpZ25CdG5Qb3NpdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHtzaWduZXJQb3MgJiYgYWRkU2lnbmF0dXJlQm9va21hcmsoaW5kZXgpfVxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHotWzFdIG92ZXJmbG93LWhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgPFBhZ2VcclxuICAgICAgICAgICAgICAgICAga2V5PXtgcGFnZV8ke2luZGV4ICsgMX1gfVxyXG4gICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtpbmRleCArIDF9XHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoPXtwYWdlV2lkdGggLSA2MH1cclxuICAgICAgICAgICAgICAgICAgc2NhbGU9ezF9XHJcbiAgICAgICAgICAgICAgICAgIHJlbmRlckFubm90YXRpb25MYXllcj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICAgIHJlbmRlclRleHRMYXllcj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICkpfVxyXG4gICAgICAgIDwvRG9jdW1lbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyQWxsUGRmUGFnZTtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgUlNDIGZyb20gXCJyZWFjdC1zY3JvbGxiYXJzLWN1c3RvbVwiO1xyXG5pbXBvcnQgeyBEb2N1bWVudCwgUGFnZSB9IGZyb20gXCJyZWFjdC1wZGZcIjtcclxuaW1wb3J0IHtcclxuICBkZWZhdWx0V2lkdGhIZWlnaHQsXHJcbiAgZ2V0Q29udGFpbmVyU2NhbGUsXHJcbiAgaGFuZGxlSW1hZ2VSZXNpemUsXHJcbiAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemVcclxufSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcclxuaW1wb3J0IFBsYWNlaG9sZGVyIGZyb20gXCIuL1BsYWNlaG9sZGVyXCI7XHJcbmltcG9ydCBBbGVydCBmcm9tIFwiLi4vLi4vcHJpbWl0aXZlcy9BbGVydFwiO1xyXG5cclxuZnVuY3Rpb24gUmVuZGVyUGRmKHtcclxuICBwYWdlTnVtYmVyLFxyXG4gIGRyb3AsXHJcbiAgc2lnbmVyUG9zLFxyXG4gIHN1Y2Nlc3NFbWFpbCxcclxuICBoYW5kbGVUYWJEcmFnLFxyXG4gIGhhbmRsZVN0b3AsXHJcbiAgaXNEcmFnZ2luZyxcclxuICBzZXRJc1NpZ25QYWQsXHJcbiAgc2V0SXNTdGFtcCxcclxuICBoYW5kbGVEZWxldGVTaWduLFxyXG4gIHNldFNpZ25LZXksXHJcbiAgcGRmRGV0YWlscyxcclxuICB4eVBvc3Rpb24sXHJcbiAgcGRmVXJsLFxyXG4gIHBhZ2VEZXRhaWxzLFxyXG4gIHBkZlJlcXVlc3QsXHJcbiAgc2lnbmVyT2JqZWN0SWQsXHJcbiAgc2lnbmVkU2lnbmVycyxcclxuICBwZGZMb2FkLFxyXG4gIHNldFBkZkxvYWQsXHJcbiAgcGxhY2Vob2xkZXIsXHJcbiAgc2V0U2lnbmVyUG9zLFxyXG4gIHNldFh5UG9zdGlvbixcclxuICBpbmRleCxcclxuICBjb250YWluZXJXSCxcclxuICBzZXRJc1Jlc2l6ZSxcclxuICBoYW5kbGVMaW5rVXNlcixcclxuICBzZXRVbmlxdWVJZCxcclxuICBzaWduZXJzZGF0YSxcclxuICBzZXRJc1BhZ2VDb3B5LFxyXG4gIHNldFNpZ25lck9iaklkLFxyXG4gIHNldFNob3dEcm9wZG93bixcclxuICBzZXRJc0luaXRpYWwsXHJcbiAgc2V0SXNWYWxpZGF0ZSxcclxuICBzZXRXaWRnZXRUeXBlLFxyXG4gIHNldFZhbGlkYXRlQWxlcnQsXHJcbiAgc2V0SXNSYWRpbyxcclxuICBzZXRDdXJyV2lkZ2V0c0RldGFpbHMsXHJcbiAgc2V0U2VsZWN0V2lkZ2V0SWQsXHJcbiAgc2VsZWN0V2lkZ2V0SWQsXHJcbiAgdW5TaWduZWRXaWRnZXRJZCxcclxuICBzZXRJc0NoZWNrYm94LFxyXG4gIGhhbmRsZU5hbWVNb2RhbCxcclxuICBoYW5kbGVUZXh0U2V0dGluZ01vZGFsLFxyXG4gIHNldFRlbXBTaWduZXJJZCxcclxuICB1bmlxdWVJZCxcclxuICBwZGZPcmlnaW5hbFdILFxyXG4gIHNjYWxlLFxyXG4gIHNldElzU2VsZWN0SWQsXHJcbiAgaXNwdWJsaWNUZW1wbGF0ZSxcclxuICBoYW5kbGVVc2VyRGV0YWlsc1xyXG59KSB7XHJcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDc2NztcclxuICAvL2NoZWNrIGlzR3Vlc3RTaWduZXIgaXMgcHJlc2VudCBpbiBsb2NhbCBpZiB5ZXMgdGhhbiBoYW5kbGUgbG9naW4gZmxvdyBoZWFkZXIgaW4gbW9iaWxlIHZpZXdcclxuICBjb25zdCBpc0d1ZXN0U2lnbmVyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJpc0d1ZXN0U2lnbmVyXCIpO1xyXG5cclxuICAvLyBoYW5kbGUgc2lnbmF0dXJlIGJsb2NrIHdpZHRoIGFuZCBoZWlnaHQgYWNjb3JkaW5nIHRvIHNjcmVlblxyXG4gIGNvbnN0IHBvc1dpZHRoID0gKHBvcywgc2lnbllvdXJzZWxmKSA9PiB7XHJcbiAgICBjb25zdCBjb250YWluZXJTY2FsZSA9IGdldENvbnRhaW5lclNjYWxlKFxyXG4gICAgICBwZGZPcmlnaW5hbFdILFxyXG4gICAgICBwYWdlTnVtYmVyLFxyXG4gICAgICBjb250YWluZXJXSFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGRlZmF1bHRXaWR0aEhlaWdodChwb3MudHlwZSkud2lkdGg7XHJcbiAgICBjb25zdCBwb3NXaWR0aCA9IHBvcy5XaWR0aCA/IHBvcy5XaWR0aCA6IGRlZmF1bHRXaWR0aDtcclxuICAgIGlmIChzaWduWW91cnNlbGYpIHtcclxuICAgICAgcmV0dXJuIHBvc1dpZHRoICogc2NhbGUgKiBjb250YWluZXJTY2FsZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChwb3MuaXNNb2JpbGUgJiYgcG9zLnNjYWxlKSB7XHJcbiAgICAgICAgaWYgKHBvcy5Jc1Jlc2l6ZSkge1xyXG4gICAgICAgICAgaWYgKHNjYWxlID4gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcG9zV2lkdGggKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZSAqIHNjYWxlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBvc1dpZHRoICogY29udGFpbmVyU2NhbGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChzY2FsZSA+IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBvc1dpZHRoICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGUgKiBzY2FsZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwb3NXaWR0aCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gcG9zV2lkdGggKiBzY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBwb3NIZWlnaHQgPSAocG9zLCBzaWduWW91cnNlbGYpID0+IHtcclxuICAgIGNvbnN0IGNvbnRhaW5lclNjYWxlID0gZ2V0Q29udGFpbmVyU2NhbGUoXHJcbiAgICAgIHBkZk9yaWdpbmFsV0gsXHJcbiAgICAgIHBhZ2VOdW1iZXIsXHJcbiAgICAgIGNvbnRhaW5lcldIXHJcbiAgICApO1xyXG4gICAgY29uc3QgcG9zSGVpZ2h0ID0gcG9zLkhlaWdodCB8fCBkZWZhdWx0V2lkdGhIZWlnaHQocG9zLnR5cGUpLmhlaWdodDtcclxuICAgIGlmIChzaWduWW91cnNlbGYpIHtcclxuICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIHNjYWxlICogY29udGFpbmVyU2NhbGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xyXG4gICAgICAgIGlmIChwb3MuSXNSZXNpemUpIHtcclxuICAgICAgICAgIGlmIChzY2FsZSA+IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlICogc2NhbGU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gcG9zSGVpZ2h0ICogY29udGFpbmVyU2NhbGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChzY2FsZSA+IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlICogc2NhbGU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gcG9zSGVpZ2h0ICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBwb3NIZWlnaHQgKiBzY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLy9mdW5jdGlvbiBmb3IgcmVuZGVyIHBsYWNlaG9sZGVyIGJsb2NrIG92ZXIgcGRmIGRvY3VtZW50XHJcbiAgY29uc3QgY2hlY2tTaWduZWRTaWduZXJzID0gKGRhdGEpID0+IHtcclxuICAgIGxldCBjaGVja1NpZ24gPSBbXTtcclxuICAgIC8vY29uZGl0aW9uIHRvIGhhbmRsZSBxdWljayBzZW5kIGZsb3cgYW5kIHVzaW5nIG5vcm1hbCByZXF1ZXN0IHNpZ24gZmxvd1xyXG4gICAgY2hlY2tTaWduID0gc2lnbmVkU2lnbmVyc1xyXG4gICAgICA/IHNpZ25lZFNpZ25lcnM/LmZpbHRlcihcclxuICAgICAgICAgIChzaWduKSA9PlxyXG4gICAgICAgICAgICBzaWduPy5JZCA9PT0gZGF0YT8uSWQgfHwgc2lnbj8ub2JqZWN0SWQgPT09IGRhdGE/LnNpZ25lck9iaklkXHJcbiAgICAgICAgKVxyXG4gICAgICA6IFtdO1xyXG4gICAgY29uc3QgaGFuZGxlQWxsVXNlck5hbWUgPSAoSWQsIFJvbGUsIHR5cGUpID0+IHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICA8UmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtYmxhY2sgdGV4dC1bOHB4XSBmb250LWJvbGRcIj5cclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHBkZkRldGFpbHNbMF0uU2lnbmVycz8uZmluZChcclxuICAgICAgICAgICAgICAgIChzaWduZXIpID0+IHNpZ25lci5vYmplY3RJZCA9PT0gZGF0YS5zaWduZXJPYmpJZFxyXG4gICAgICAgICAgICAgICk/Lk5hbWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB7dHlwZSAmJiA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIGZvbnQtYm9sZFwiPnt0eXBlfTwvZGl2Pn1cclxuICAgICAgICAgIHtSb2xlICYmIChcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWJsYWNrIHRleHQtWzhweF0gZm9udC1tZWRpdW1cIj5cclxuICAgICAgICAgICAgICB7YCgke1JvbGV9KWB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgKX1cclxuICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICApO1xyXG4gICAgfTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGNoZWNrU2lnbi5sZW5ndGggPT09IDAgJiZcclxuICAgICAgZGF0YS5wbGFjZUhvbGRlci5tYXAoKHBsYWNlRGF0YSwga2V5KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2tleX0+XHJcbiAgICAgICAgICAgIHtwbGFjZURhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlciAmJlxyXG4gICAgICAgICAgICAgIHBsYWNlRGF0YS5wb3MubWFwKChwb3MpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgIHBvcyAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17cG9zLmtleX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8UGxhY2Vob2xkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zPXtwb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU2lnblBhZD17c2V0SXNTaWduUGFkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0YW1wPXtzZXRJc1N0YW1wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZT17aGFuZGxlSW1hZ2VSZXNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4eVBvc3Rpb249e3NpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtzZXRTaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9e2RhdGF9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUmVzaXplPXtzZXRJc1Jlc2l6ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93Qm9yZGVyPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVyT2JqSWQ9e3NpZ25lck9iamVjdElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1Nob3dEcm9wZG93bj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNOZWVkU2lnbj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NXaWR0aD17cG9zV2lkdGh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc0hlaWdodD17cG9zSGVpZ2h0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17aGFuZGxlQWxsVXNlck5hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRHJhZ2dpbmc9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzPXtwZGZEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luaXRpYWw9e3NldElzSW5pdGlhbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsaWRhdGVBbGVydD17c2V0VmFsaWRhdGVBbGVydH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdW5TaWduZWRXaWRnZXRJZD17dW5TaWduZWRXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQ9e3NldFNlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RXaWRnZXRJZD17c2VsZWN0V2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17c2V0Q3VycldpZGdldHNEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZD17dW5pcXVlSWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3B1YmxpY1RlbXBsYXRlPXtpc3B1YmxpY1RlbXBsYXRlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyRGV0YWlscz17aGFuZGxlVXNlckRldGFpbHN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiBmb3IgcmVuZGVyIHBsYWNlaG9sZGVyIGJsb2NrIG92ZXIgcGRmIGRvY3VtZW50XHJcblxyXG4gIGNvbnN0IGhhbmRsZVVzZXJOYW1lID0gKElkLCBSb2xlLCB0eXBlKSA9PiB7XHJcbiAgICBpZiAoSWQpIHtcclxuICAgICAgY29uc3QgY2hlY2tTaWduID0gc2lnbmVyc2RhdGEuZmluZCgoc2lnbikgPT4gc2lnbi5JZCA9PT0gSWQpO1xyXG4gICAgICBpZiAoY2hlY2tTaWduPy5OYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ibGFjayB0ZXh0LVs4cHhdIGZvbnQtbWVkaXVtXCI+XHJcbiAgICAgICAgICAgICAge2NoZWNrU2lnbj8uTmFtZX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIHt0eXBlICYmIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gZm9udC1ib2xkXCI+e3R5cGV9PC9kaXY+fVxyXG4gICAgICAgICAgICB7Um9sZSAmJiAoXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWJsYWNrIHRleHQtWzhweF0gZm9udC1tZWRpdW1cIj5cclxuICAgICAgICAgICAgICAgIHtgKCR7Um9sZX0pYH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICAgIDwvPlxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgIHt0eXBlICYmIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gZm9udC1ib2xkXCI+e3R5cGV9PC9kaXY+fVxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtYmxhY2sgdGV4dC1bOHB4XSBmb250LW1lZGl1bVwiPntSb2xlfTwvZGl2PlxyXG4gICAgICAgICAgPC8+XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICA8PlxyXG4gICAgICAgICAge3R5cGUgJiYgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSBmb250LWJvbGRcIj57dHlwZX08L2Rpdj59XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtYmxhY2sgdGV4dC1bOHB4XSBmb250LW1lZGl1bVwiPntSb2xlfTwvZGl2PlxyXG4gICAgICAgIDwvPlxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgcmV0dXJuIChcclxuICAgIDw+XHJcbiAgICAgIHtzdWNjZXNzRW1haWwgJiYgPEFsZXJ0IHR5cGU9e1wic3VjY2Vzc1wifT5FbWFpbCBzZW50IHN1Y2Nlc3NmdWxseSE8L0FsZXJ0Pn1cclxuICAgICAge2lzTW9iaWxlID8gKFxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGRhdGEtdHV0PVwicmVhY3RvdXJGb3J0aFwiXHJcbiAgICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgICBpc0d1ZXN0U2lnbmVyID8gXCIzMHB4XCIgOiBcIlwiXHJcbiAgICAgICAgICB9IGJvcmRlci1bMC4xcHhdIGJvcmRlci1bI2ViZThlOF1gfVxyXG4gICAgICAgICAgcmVmPXtkcm9wfVxyXG4gICAgICAgICAgaWQ9XCJjb250YWluZXJcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHtjb250YWluZXJXSD8ud2lkdGggJiZcclxuICAgICAgICAgICAgcGRmT3JpZ2luYWxXSC5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgIChwZGZSZXF1ZXN0XHJcbiAgICAgICAgICAgICAgPyBzaWduZXJQb3MubWFwKChkYXRhLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtrZXl9PlxyXG4gICAgICAgICAgICAgICAgICAgICAge2NoZWNrU2lnbmVkU2lnbmVycyhkYXRhKX1cclxuICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICA6IHBsYWNlaG9sZGVyIC8vIHBsYWNlaG9sZGVyIG1vYmlsZVxyXG4gICAgICAgICAgICAgICAgPyBzaWduZXJQb3MubWFwKChkYXRhLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17aW5kfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge2RhdGEucGxhY2VIb2xkZXIubWFwKChwbGFjZURhdGEsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2luZGV4fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BsYWNlRGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VEYXRhLnBvcy5tYXAoKHBvcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17cG9zLmtleX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFBsYWNlaG9sZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M9e3Bvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUGFnZUNvcHk9e3NldElzUGFnZUNvcHl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduS2V5PXtzZXRTaWduS2V5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVsZXRlU2lnbj17aGFuZGxlRGVsZXRlU2lnbn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUYWJEcmFnPXtoYW5kbGVUYWJEcmFnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RvcD17aGFuZGxlU3RvcH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlSW1hZ2VSZXNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHlQb3N0aW9uPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRYeVBvc3Rpb249e3NldFNpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25lck9iaklkPXtzZXRTaWduZXJPYmpJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9e2RhdGF9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1Jlc2l6ZT17c2V0SXNSZXNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93RHJvcGRvd249e3NldFNob3dEcm9wZG93bn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0JvcmRlcj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGxhY2Vob2xkZXI9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRVbmlxdWVJZD17c2V0VW5pcXVlSWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVMaW5rVXNlcj17aGFuZGxlTGlua1VzZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17aGFuZGxlVXNlck5hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25Zb3Vyc2VsZj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NXaWR0aD17cG9zV2lkdGh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NIZWlnaHQ9e3Bvc0hlaWdodH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRHJhZ2dpbmc9e2lzRHJhZ2dpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1ZhbGlkYXRlPXtzZXRJc1ZhbGlkYXRlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lkZ2V0VHlwZT17c2V0V2lkZ2V0VHlwZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUmFkaW89e3NldElzUmFkaW99XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0NoZWNrYm94PXtzZXRJc0NoZWNrYm94fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RXaWRnZXRJZD17c2V0U2VsZWN0V2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RXaWRnZXRJZD17c2VsZWN0V2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVOYW1lTW9kYWw9e2hhbmRsZU5hbWVNb2RhbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRlbXBTaWduZXJJZD17c2V0VGVtcFNpZ25lcklkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQ9e3VuaXF1ZUlkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbD17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0g9e3BkZk9yaWdpbmFsV0h9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTZWxlY3RJZD17c2V0SXNTZWxlY3RJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHh5UG9zdGlvbi5tYXAoKGRhdGEsIGluZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7ZGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wb3MubWFwKChwb3MpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFBsYWNlaG9sZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M9e3Bvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUGFnZUNvcHk9e3NldElzUGFnZUNvcHl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduS2V5PXtzZXRTaWduS2V5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVsZXRlU2lnbj17aGFuZGxlRGVsZXRlU2lnbn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUYWJEcmFnPXtoYW5kbGVUYWJEcmFnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RvcD17aGFuZGxlU3RvcH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17eHlQb3N0aW9ufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtzZXRYeVBvc3Rpb259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJXSD17Y29udGFpbmVyV0h9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0JvcmRlcj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zV2lkdGg9e3Bvc1dpZHRofVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zSGVpZ2h0PXtwb3NIZWlnaHR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzPXtwZGZEZXRhaWxzWzBdfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEcmFnZ2luZz17aXNEcmFnZ2luZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5pdGlhbD17c2V0SXNJbml0aWFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lkZ2V0VHlwZT17c2V0V2lkZ2V0VHlwZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFdpZGdldElkPXtzZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVzZXJOYW1lPXtoYW5kbGVVc2VyTmFtZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzQ2hlY2tib3g9e3NldElzQ2hlY2tib3h9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0PXtzZXRWYWxpZGF0ZUFsZXJ0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzPXtzZXRDdXJyV2lkZ2V0c0RldGFpbHN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXh0U2V0dGluZ01vZGFsPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9e3NjYWxlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSD17cGRmT3JpZ2luYWxXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgfSkpfVxyXG5cclxuICAgICAgICAgIHsvKiB0aGlzIGNvbXBvbmVudCBmb3IgcmVuZGVyIHBkZiBkb2N1bWVudCBpcyBpbiBtaWRkbGUgb2YgdGhlIGNvbXBvbmVudCAqL31cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPERvY3VtZW50XHJcbiAgICAgICAgICAgICAgb25Mb2FkRXJyb3I9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIHNldFBkZkxvYWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgbG9hZGluZz17XCJMb2FkaW5nIERvY3VtZW50Li5cIn1cclxuICAgICAgICAgICAgICBvbkxvYWRTdWNjZXNzPXtwYWdlRGV0YWlsc31cclxuICAgICAgICAgICAgICAvLyByZWY9e3BkZlJlZn0nXHJcbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNldFNlbGVjdFdpZGdldElkKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgZmlsZT17XHJcbiAgICAgICAgICAgICAgICBwZGZVcmxcclxuICAgICAgICAgICAgICAgICAgPyBwZGZVcmxcclxuICAgICAgICAgICAgICAgICAgOiBwZGZEZXRhaWxzWzBdICYmIHBkZkRldGFpbHNbMF0uU2lnbmVkVXJsXHJcbiAgICAgICAgICAgICAgICAgICAgPyBwZGZEZXRhaWxzWzBdLlNpZ25lZFVybFxyXG4gICAgICAgICAgICAgICAgICAgIDogcGRmRGV0YWlsc1swXS5VUkxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8UGFnZVxyXG4gICAgICAgICAgICAgICAga2V5PXtpbmRleH1cclxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICB3aWR0aD17Y29udGFpbmVyV0gud2lkdGh9XHJcbiAgICAgICAgICAgICAgICByZW5kZXJBbm5vdGF0aW9uTGF5ZXI9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgcmVuZGVyVGV4dExheWVyPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgIG9uR2V0QW5ub3RhdGlvbnNFcnJvcj17KGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYW5ub3RhdGlvbiBlcnJvclwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvRG9jdW1lbnQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8UlNDXHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxyXG4gICAgICAgICAgICBib3hTaGFkb3c6IFwicmdiYSgxNywgMTIsIDQ2LCAwLjE1KSAwcHggNDhweCAxMDBweCAwcHhcIixcclxuICAgICAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgKyBcInB4XCIsXHJcbiAgICAgICAgICAgIHpJbmRleDogMFxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIG5vU2Nyb2xsWT17ZmFsc2V9XHJcbiAgICAgICAgICBub1Njcm9sbFg9e3NjYWxlID09PSAxID8gdHJ1ZSA6IGZhbHNlfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICB3aWR0aDogY29udGFpbmVyV0g/LndpZHRoICYmIGNvbnRhaW5lcldIPy53aWR0aCAqIHNjYWxlXHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIHJlZj17ZHJvcH1cclxuICAgICAgICAgICAgaWQ9XCJjb250YWluZXJcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7cGRmTG9hZCAmJlxyXG4gICAgICAgICAgICAgIGNvbnRhaW5lcldIPy53aWR0aCAmJlxyXG4gICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0gubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgIChwZGZSZXF1ZXN0IC8vcGRmIHJlcXVlc3Qgc2lnbiBmbG93XHJcbiAgICAgICAgICAgICAgICA/IHNpZ25lclBvcz8ubWFwKChkYXRhLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17a2V5fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge2NoZWNrU2lnbmVkU2lnbmVycyhkYXRhKX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogcGxhY2Vob2xkZXIgLy9wbGFjZWhvbGRlciBhbmQgdGVtcGxhdGUgZmxvd1xyXG4gICAgICAgICAgICAgICAgICA/IHNpZ25lclBvcy5tYXAoKGRhdGEsIGluZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17aW5kfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7ZGF0YS5wbGFjZUhvbGRlci5tYXAoKHBsYWNlRGF0YSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2luZGV4fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGxhY2VEYXRhLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlRGF0YS5wb3MubWFwKChwb3MpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtwb3Mua2V5fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQbGFjZWhvbGRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M9e3Bvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNQYWdlQ29weT17c2V0SXNQYWdlQ29weX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbktleT17c2V0U2lnbktleX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVsZXRlU2lnbj17aGFuZGxlRGVsZXRlU2lnbn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcD17c2V0SXNTdGFtcH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGFiRHJhZz17aGFuZGxlVGFiRHJhZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RvcD17aGFuZGxlU3RvcH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemU9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUltYWdlUmVzaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRYeVBvc3Rpb249e3NldFNpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmVyT2JqSWQ9e3NldFNpZ25lck9iaklkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXtkYXRhfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1Jlc2l6ZT17c2V0SXNSZXNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNob3dEcm9wZG93bj17c2V0U2hvd0Ryb3Bkb3dufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Nob3dCb3JkZXI9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGxhY2Vob2xkZXI9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVuaXF1ZUlkPXtzZXRVbmlxdWVJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTGlua1VzZXI9e2hhbmRsZUxpbmtVc2VyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17aGFuZGxlVXNlck5hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zV2lkdGg9e3Bvc1dpZHRofVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NIZWlnaHQ9e3Bvc0hlaWdodH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEcmFnZ2luZz17aXNEcmFnZ2luZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNWYWxpZGF0ZT17c2V0SXNWYWxpZGF0ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lkZ2V0VHlwZT17c2V0V2lkZ2V0VHlwZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNSYWRpbz17c2V0SXNSYWRpb31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNDaGVja2JveD17c2V0SXNDaGVja2JveH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RXaWRnZXRJZD17c2V0U2VsZWN0V2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFdpZGdldElkPXtzZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmFtZU1vZGFsPXtoYW5kbGVOYW1lTW9kYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRlbXBTaWduZXJJZD17c2V0VGVtcFNpZ25lcklkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZD17dW5pcXVlSWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWw9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSD17cGRmT3JpZ2luYWxXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTZWxlY3RJZD17c2V0SXNTZWxlY3RJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgOiB4eVBvc3Rpb24ubWFwKChkYXRhLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ255b3Vyc2VsZiBmbG93XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucG9zLm1hcCgocG9zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17cG9zLmtleX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGxhY2Vob2xkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zPXtwb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUGFnZUNvcHk9e3NldElzUGFnZUNvcHl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURlbGV0ZVNpZ249e2hhbmRsZURlbGV0ZVNpZ259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRhYkRyYWc9e2hhbmRsZVRhYkRyYWd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVN0b3A9eyhldmVudCwgZHJhZ0VsZW1lbnQpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RvcChldmVudCwgZHJhZ0VsZW1lbnQsIHBvcy50eXBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHlQb3N0aW9uPXt4eVBvc3Rpb259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFh5UG9zdGlvbj17c2V0WHlQb3N0aW9ufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93Qm9yZGVyPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25Zb3Vyc2VsZj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zV2lkdGg9e3Bvc1dpZHRofVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NIZWlnaHQ9e3Bvc0hlaWdodH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc1swXX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEcmFnZ2luZz17aXNEcmFnZ2luZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZGdldFR5cGU9e3NldFdpZGdldFR5cGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17aGFuZGxlVXNlck5hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzQ2hlY2tib3g9e3NldElzQ2hlY2tib3h9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlQWxlcnQ9e3NldFZhbGlkYXRlQWxlcnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbD17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKX1cclxuXHJcbiAgICAgICAgICAgIHsvKiB0aGlzIGNvbXBvbmVudCBmb3IgcmVuZGVyIHBkZiBkb2N1bWVudCBpcyBpbiBtaWRkbGUgb2YgdGhlIGNvbXBvbmVudCAqL31cclxuICAgICAgICAgICAgPERvY3VtZW50XHJcbiAgICAgICAgICAgICAgb25Mb2FkRXJyb3I9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIHNldFBkZkxvYWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgbG9hZGluZz17XCJMb2FkaW5nIERvY3VtZW50Li5cIn1cclxuICAgICAgICAgICAgICBvbkxvYWRTdWNjZXNzPXtwYWdlRGV0YWlsc31cclxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2V0U2VsZWN0V2lkZ2V0SWQpIHtcclxuICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAvLyByZWY9e3BkZlJlZn1cclxuICAgICAgICAgICAgICBmaWxlPXtcclxuICAgICAgICAgICAgICAgIHBkZlVybFxyXG4gICAgICAgICAgICAgICAgICA/IHBkZlVybFxyXG4gICAgICAgICAgICAgICAgICA6IHBkZkRldGFpbHNbMF0gJiYgcGRmRGV0YWlsc1swXS5TaWduZWRVcmxcclxuICAgICAgICAgICAgICAgICAgICA/IHBkZkRldGFpbHNbMF0uU2lnbmVkVXJsXHJcbiAgICAgICAgICAgICAgICAgICAgOiBwZGZEZXRhaWxzWzBdLlVSTFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxQYWdlXHJcbiAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxyXG4gICAgICAgICAgICAgICAgd2lkdGg9e2NvbnRhaW5lcldILndpZHRofVxyXG4gICAgICAgICAgICAgICAgc2NhbGU9e3NjYWxlIHx8IDF9XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e1wiLXotWzFdXCJ9IC8vIHdoZW4gdXNlciB6b29tLWluIGluIHRhYmxldCB3aWRnZXRzIG1vdmUgYmFja3dhcmQgdGhhdCdzIHdoeSBwYXNzIC16LVsxXVxyXG4gICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgIHJlbmRlckFubm90YXRpb25MYXllcj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICByZW5kZXJUZXh0TGF5ZXI9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgb25HZXRBbm5vdGF0aW9uc0Vycm9yPXsoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJhbm5vdGF0aW9uIGVycm9yXCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9Eb2N1bWVudD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvUlNDPlxyXG4gICAgICApfVxyXG4gICAgPC8+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyUGRmO1xyXG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCBTaWduYXR1cmVDYW52YXMgZnJvbSBcInJlYWN0LXNpZ25hdHVyZS1jYW52YXNcIjtcclxuZnVuY3Rpb24gU2lnblBhZCh7XHJcbiAgaXNTaWduUGFkLFxyXG4gIGlzU3RhbXAsXHJcbiAgc2V0SXNJbWFnZVNlbGVjdCxcclxuICBvblNhdmVTaWduLFxyXG4gIHNldElzU2lnblBhZCxcclxuICBzZXRJbWFnZSxcclxuICBpc0ltYWdlU2VsZWN0LFxyXG4gIGltYWdlUmVmLFxyXG4gIG9uSW1hZ2VDaGFuZ2UsXHJcbiAgb25TYXZlSW1hZ2UsXHJcbiAgaW1hZ2UsXHJcbiAgZGVmYXVsdFNpZ24sXHJcbiAgc2V0U2lnbmF0dXJlLFxyXG4gIG15SW5pdGlhbCxcclxuICBpc0luaXRpYWwsXHJcbiAgc2V0SXNJbml0aWFsLFxyXG4gIHNldElzU3RhbXAsXHJcbiAgd2lkZ2V0VHlwZSxcclxuICBjdXJyV2lkZ2V0c0RldGFpbHMsXHJcbiAgc2V0Q3VycldpZGdldHNEZXRhaWxzXHJcbn0pIHtcclxuICBjb25zdCBbcGVuQ29sb3IsIHNldFBlbkNvbG9yXSA9IHVzZVN0YXRlKFwiYmx1ZVwiKTtcclxuICBjb25zdCBhbGxDb2xvciA9IFtcImJsdWVcIiwgXCJyZWRcIiwgXCJibGFja1wiXTtcclxuICBjb25zdCBjYW52YXNSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgY29uc3QgW2lzRGVmYXVsdFNpZ24sIHNldElzRGVmYXVsdFNpZ25dID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc1RhYiwgc2V0SXNUYWJdID0gdXNlU3RhdGUoXCJkcmF3XCIpO1xyXG4gIGNvbnN0IFtpc1NpZ25JbWcsIHNldElzU2lnbkltZ10gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbc2lnblZhbHVlLCBzZXRTaWduVmFsdWVdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW3RleHRXaWR0aCwgc2V0VGV4dFdpZHRoXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gIGNvbnN0IFt0ZXh0SGVpZ2h0LCBzZXRUZXh0SGVpZ2h0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gIGNvbnN0IFtzaWduYXR1cmVUeXBlLCBzZXRTaWduYXR1cmVUeXBlXSA9IHVzZVN0YXRlKFwiZHJhd1wiKTtcclxuICBjb25zdCBmb250T3B0aW9ucyA9IFtcclxuICAgIHsgdmFsdWU6IFwiRmFzdGhhbmRcIiB9LFxyXG4gICAgeyB2YWx1ZTogXCJEYW5jaW5nIFNjcmlwdFwiIH0sXHJcbiAgICB7IHZhbHVlOiBcIkNlZGFydmlsbGUgQ3Vyc2l2ZVwiIH0sXHJcbiAgICB7IHZhbHVlOiBcIkRlbGljaW91cyBIYW5kcmF3blwiIH1cclxuICAgIC8vIEFkZCBtb3JlIGZvbnQgb3B0aW9ucyBhcyBuZWVkZWRcclxuICBdO1xyXG4gIGNvbnN0IFtmb250U2VsZWN0LCBzZXRGb250U2VsZWN0XSA9IHVzZVN0YXRlKGZvbnRPcHRpb25zWzBdLnZhbHVlKTtcclxuXHJcbiAgY29uc3Qgc2VuZGVyVXNlciA9XHJcbiAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgYFBhcnNlLyR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpfS9jdXJyZW50VXNlcmBcclxuICAgICkgJiZcclxuICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICBjb25zdCBqc29uU2VuZGVyID0gSlNPTi5wYXJzZShzZW5kZXJVc2VyKTtcclxuICBjb25zdCBjdXJyZW50VXNlck5hbWUgPSBqc29uU2VuZGVyICYmIGpzb25TZW5kZXIubmFtZTtcclxuXHJcbiAgLy9mdW5jdGlvbiBmb3IgY2xlYXIgc2lnbmF0dXJlIGltYWdlXHJcbiAgY29uc3QgaGFuZGxlQ2xlYXIgPSAoKSA9PiB7XHJcbiAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHMoe30pO1xyXG4gICAgaWYgKGlzVGFiID09PSBcImRyYXdcIikge1xyXG4gICAgICBpZiAoY2FudmFzUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICBjYW52YXNSZWYuY3VycmVudC5jbGVhcigpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzU3RhbXApIHtcclxuICAgICAgICBzZXRJbWFnZShcIlwiKTtcclxuICAgICAgfVxyXG4gICAgICBzZXRJc1NpZ25JbWcoXCJcIik7XHJcbiAgICB9IGVsc2UgaWYgKGlzVGFiID09PSBcInVwbG9hZEltYWdlXCIpIHtcclxuICAgICAgc2V0SW1hZ2UoXCJcIik7XHJcbiAgICB9XHJcbiAgICAvLyBzZXRJc0luaXRpYWwoZmFsc2UpO1xyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiBmb3Igc2V0IHNpZ25hdHVyZSB1cmxcclxuICBjb25zdCBoYW5kbGVTaWduYXR1cmVDaGFuZ2UgPSAoZGF0YSkgPT4ge1xyXG4gICAgc2V0U2lnbmF0dXJlKGRhdGEpO1xyXG4gICAgc2V0SXNTaWduSW1nKGRhdGEpO1xyXG4gIH07XHJcbiAgLy9zYXZlIGJ1dHRvbiBjb21wb25lbnRcclxuICBjb25zdCBTYXZlQnRuID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgPGRpdj5cclxuICAgICAgICB7KGlzVGFiID09PSBcImRyYXdcIiB8fCBpc1RhYiA9PT0gXCJ1cGxvYWRJbWFnZVwiKSAmJiAoXHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0IG1yLTEgbXQtWzJweF1cIlxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVDbGVhcigpfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBDbGVhclxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgKX1cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscyh7fSk7XHJcbiAgICAgICAgICAgIGlmICghaW1hZ2UpIHtcclxuICAgICAgICAgICAgICBpZiAoaXNUYWIgPT09IFwibXlzaWduYXR1cmVcIikge1xyXG4gICAgICAgICAgICAgICAgc2V0SXNTaWduSW1nKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzSW5pdGlhbCkge1xyXG4gICAgICAgICAgICAgICAgICBvblNhdmVTaWduKHNpZ25hdHVyZVR5cGUsIFwiaW5pdGlhbHNcIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBvblNhdmVTaWduKG51bGwsIFwiZGVmYXVsdFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzVGFiID09PSBcInR5cGVcIikge1xyXG4gICAgICAgICAgICAgICAgICBzZXRJc1NpZ25JbWcoXCJcIik7XHJcbiAgICAgICAgICAgICAgICAgIG9uU2F2ZVNpZ24oXHJcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAhaXNJbml0aWFsICYmIHRleHRXaWR0aCA+IDE1MCA/IDE1MCA6IHRleHRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAhaXNJbml0aWFsICYmIHRleHRIZWlnaHQgPiAzNSA/IDM1IDogdGV4dEhlaWdodFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgc2V0SXNTaWduSW1nKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICBjYW52YXNSZWYuY3VycmVudC5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICBvblNhdmVTaWduKHNpZ25hdHVyZVR5cGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgc2V0UGVuQ29sb3IoXCJibHVlXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHNldElzU2lnbkltZyhcIlwiKTtcclxuICAgICAgICAgICAgICBvblNhdmVJbWFnZShzaWduYXR1cmVUeXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRJc1NpZ25QYWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBzZXRJc0luaXRpYWwoZmFsc2UpO1xyXG4gICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KGZhbHNlKTtcclxuICAgICAgICAgICAgc2V0SXNEZWZhdWx0U2lnbihmYWxzZSk7XHJcbiAgICAgICAgICAgIHNldEltYWdlKCk7XHJcbiAgICAgICAgICAgIHNldElzVGFiKFwiZHJhd1wiKTtcclxuICAgICAgICAgICAgc2V0U2lnblZhbHVlKFwiXCIpO1xyXG4gICAgICAgICAgICBzZXRJc1N0YW1wKGZhbHNlKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzTmFtZT17YCR7XHJcbiAgICAgICAgICAgIGlzU2lnbkltZyB8fCBpbWFnZSB8fCBpc0RlZmF1bHRTaWduIHx8IHRleHRXaWR0aFxyXG4gICAgICAgICAgICAgID8gXCJcIlxyXG4gICAgICAgICAgICAgIDogXCJwb2ludGVyLWV2ZW50cy1ub25lXCJcclxuICAgICAgICAgIH0gb3AtYnRuIG9wLWJ0bi1wcmltYXJ5IHNoYWRvdy1sZ2B9XHJcbiAgICAgICAgICBkaXNhYmxlZD17XHJcbiAgICAgICAgICAgIChpc1RhYiA9PT0gXCJkcmF3XCIgJiYgaXNTaWduSW1nKSB8fFxyXG4gICAgICAgICAgICAoaXNUYWIgPT09IFwiaW1hZ2VcIiAmJiBpbWFnZSkgfHxcclxuICAgICAgICAgICAgKGlzVGFiID09PSBcIm15c2lnbmF0dXJlXCIgJiYgaXNEZWZhdWx0U2lnbikgfHxcclxuICAgICAgICAgICAgKGlzVGFiID09PSBcInR5cGVcIiAmJiB0ZXh0V2lkdGgpXHJcbiAgICAgICAgICAgICAgPyBmYWxzZVxyXG4gICAgICAgICAgICAgIDogaW1hZ2VcclxuICAgICAgICAgICAgICAgID8gZmFsc2VcclxuICAgICAgICAgICAgICAgIDogdHJ1ZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIFNhdmVcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy91c2VFZmZlY3QgZm9yIHNldCBhbHJlYWR5IGRyYXcgb3Igc2F2ZSBzaWduYXR1cmUgdXJsL3RleHQgdXJsIG9mIHNpZ25hdHVyZSB0ZXh0IHR5cGUgYW5kIGRyYXcgdHlwZSBmb3IgaW5pdGlhbCB0eXBlIGFuZCBzaWduYXR1cmUgdHlwZSB3aWRnZXRzXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmIChjdXJyV2lkZ2V0c0RldGFpbHMgJiYgY2FudmFzUmVmLmN1cnJlbnQpIHtcclxuICAgICAgY29uc3QgaXNXaWRnZXRUeXBlID0gY3VycldpZGdldHNEZXRhaWxzPy50eXBlO1xyXG4gICAgICBjb25zdCBzaWduYXR1cmVUeXBlID0gY3VycldpZGdldHNEZXRhaWxzPy5zaWduYXR1cmVUeXBlO1xyXG4gICAgICBjb25zdCB1cmwgPSBjdXJyV2lkZ2V0c0RldGFpbHM/LlNpZ25Vcmw7XHJcbiAgICAgIC8vY2hlY2tpbmcgd2lkZ2V0IHR5cGUgYW5kIGRyYXcgdHlwZSBzaWduYXR1cmUgdXJsXHJcbiAgICAgIGlmIChpc0luaXRpYWwpIHtcclxuICAgICAgICBpZiAoaXNXaWRnZXRUeXBlID09PSBcImluaXRpYWxzXCIgJiYgc2lnbmF0dXJlVHlwZSA9PT0gXCJkcmF3XCIgJiYgdXJsKSB7XHJcbiAgICAgICAgICBjYW52YXNSZWYuY3VycmVudC5mcm9tRGF0YVVSTCh1cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICBpc1dpZGdldFR5cGUgPT09IFwic2lnbmF0dXJlXCIgJiZcclxuICAgICAgICBzaWduYXR1cmVUeXBlID09PSBcImRyYXdcIiAmJlxyXG4gICAgICAgIHVybFxyXG4gICAgICApIHtcclxuICAgICAgICBjYW52YXNSZWYuY3VycmVudC5mcm9tRGF0YVVSTCh1cmwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJpbW1lZE5hbWUgPSBjdXJyZW50VXNlck5hbWUgJiYgY3VycmVudFVzZXJOYW1lLnRyaW0oKTtcclxuICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gdHJpbW1lZE5hbWU/LmNoYXJBdCgwKTtcclxuICAgIGNvbnN0IHVzZXJOYW1lID0gaXNJbml0aWFsID8gZmlyc3RDaGFyYWN0ZXIgOiBjdXJyZW50VXNlck5hbWU7XHJcbiAgICBzZXRTaWduVmFsdWUodXNlck5hbWUpO1xyXG4gICAgc2V0Rm9udFNlbGVjdChcIkZhc3RoYW5kXCIpO1xyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbaXNTaWduUGFkXSk7XHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IGxvYWRGb250ID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IGRvY3VtZW50LmZvbnRzLmxvYWQoYDIwcHggJHtmb250U2VsZWN0fWApO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdEZvbnRTVHlsZSA9IGZvbnRPcHRpb25zLmZpbmQoXHJcbiAgICAgICAgICAoZm9udCkgPT4gZm9udC52YWx1ZSA9PT0gZm9udFNlbGVjdFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgc2V0Rm9udFNlbGVjdChzZWxlY3RGb250U1R5bGU/LnZhbHVlIHx8IGZvbnRPcHRpb25zWzBdLnZhbHVlKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgbG9hZGluZyBmb250OlwiLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgbG9hZEZvbnQoKTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbZm9udFNlbGVjdF0pO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgLy8gTG9hZCB0aGUgZGVmYXVsdCBzaWduYXR1cmUgYWZ0ZXIgdGhlIGNvbXBvbmVudCBtb3VudHNcclxuICAgIGlmIChjYW52YXNSZWYuY3VycmVudCkge1xyXG4gICAgICBjYW52YXNSZWYuY3VycmVudC5mcm9tRGF0YVVSTChpc1NpZ25JbWcpO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzVGFiID09PSBcInR5cGVcIikge1xyXG4gICAgICBjb25zdCB0cmltbWVkTmFtZSA9IHNpZ25WYWx1ZSA/IHNpZ25WYWx1ZS50cmltKCkgOiBjdXJyZW50VXNlck5hbWUudHJpbSgpO1xyXG4gICAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHRyaW1tZWROYW1lLmNoYXJBdCgwKTtcclxuICAgICAgY29uc3QgdXNlck5hbWUgPSBpc0luaXRpYWwgPyBmaXJzdENoYXJhY3RlciA6IHNpZ25WYWx1ZTtcclxuICAgICAgc2V0U2lnblZhbHVlKHVzZXJOYW1lKTtcclxuICAgICAgY29udmVydFRvSW1nKGZvbnRTZWxlY3QsIHVzZXJOYW1lKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbaXNUYWJdKTtcclxuICAvL2Z1bmN0aW9uIGZvciBjb252ZXJ0IGlucHV0IHRleHQgdmFsdWUgaW4gaW1hZ2VcclxuICBjb25zdCBjb252ZXJ0VG9JbWcgPSBhc3luYyAoZm9udFN0eWxlLCB0ZXh0LCBjb2xvcikgPT4ge1xyXG4gICAgLy9nZXQgdGV4dCBjb250ZW50IHRvIGNvbnZlcnQgaW4gaW1hZ2VcclxuICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGV4dDtcclxuICAgIGNvbnN0IGZvbnRmYW1pbHkgPSBmb250U3R5bGVcclxuICAgICAgPyBmb250U3R5bGVcclxuICAgICAgOiBmb250U2VsZWN0XHJcbiAgICAgICAgPyBmb250U2VsZWN0XHJcbiAgICAgICAgOiBcIkZhc3RoYW5kXCI7XHJcbiAgICBjb25zdCBmb250U2l6ZVZhbHVlID0gXCI0MHB4XCI7XHJcbiAgICAvL2NyZWF0aW5nIHNwYW4gZm9yIGdldHRpbmcgdGV4dCBjb250ZW50IHdpZHRoXHJcbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICBzcGFuLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7XHJcbiAgICBzcGFuLnN0eWxlLmZvbnQgPSBgJHtmb250U2l6ZVZhbHVlfSAke2ZvbnRmYW1pbHl9YDsgLy8gaGVyZSBwdXQgeW91ciB0ZXh0IHNpemUgYW5kIGZvbnQgZmFtaWx5XHJcbiAgICBzcGFuLnN0eWxlLmNvbG9yID0gY29sb3IgPyBjb2xvciA6IHBlbkNvbG9yO1xyXG4gICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJoaWRkZW5cIjtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7IC8vIFJlcGxhY2UgJ2NvbnRhaW5lcicgd2l0aCB0aGUgSUQgb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50XHJcblxyXG4gICAgLy9jcmVhdGUgY2FudmFzIHRvIHJlbmRlciB0ZXh0IGluIGNhbnZhcyBhbmQgY29udmVydCBpbiBpbWFnZVxyXG4gICAgY29uc3QgY2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAvLyBEcmF3IHRoZSB0ZXh0IGNvbnRlbnQgb24gdGhlIGNhbnZhc1xyXG4gICAgY29uc3QgY3R4ID0gY2FudmFzRWxlbWVudC5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICBjb25zdCBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcclxuICAgIGNvbnN0IGFkZEV4dHJhV2lkdGggPSBpc0luaXRpYWwgPyAxMCA6IDUwO1xyXG4gICAgY29uc3Qgd2lkdGggPSBzcGFuLm9mZnNldFdpZHRoICsgYWRkRXh0cmFXaWR0aDtcclxuICAgIGNvbnN0IGhlaWdodCA9IHNwYW4ub2Zmc2V0SGVpZ2h0O1xyXG4gICAgc2V0VGV4dFdpZHRoKHdpZHRoKTtcclxuICAgIHNldFRleHRIZWlnaHQoaGVpZ2h0KTtcclxuICAgIGNvbnN0IGZvbnQgPSBzcGFuLnN0eWxlW1wiZm9udFwiXTtcclxuICAgIC8vIFNldCB0aGUgY2FudmFzIGRpbWVuc2lvbnMgdG8gbWF0Y2ggdGhlIHNwYW5cclxuICAgIGNhbnZhc0VsZW1lbnQud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XHJcbiAgICBjYW52YXNFbGVtZW50LmhlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XHJcblxyXG4gICAgLy8gWW91IGNhbiBjdXN0b21pemUgdGV4dCBzdHlsZXMgaWYgbmVlZGVkXHJcbiAgICBjdHguZm9udCA9IGZvbnQ7XHJcbiAgICBjdHguZmlsbFN0eWxlID0gY29sb3IgPyBjb2xvciA6IHBlbkNvbG9yOyAvLyBTZXQgdGhlIHRleHQgY29sb3JcclxuICAgIGN0eC50ZXh0QWxpZ24gPSBcImNlbnRlclwiO1xyXG4gICAgY3R4LnRleHRCYXNlbGluZSA9IFwibWlkZGxlXCI7XHJcbiAgICBjdHguc2NhbGUocGl4ZWxSYXRpbywgcGl4ZWxSYXRpbyk7XHJcbiAgICAvLyBEcmF3IHRoZSBjb250ZW50IG9mIHRoZSBzcGFuIG9udG8gdGhlIGNhbnZhc1xyXG4gICAgY3R4LmZpbGxUZXh0KHNwYW4udGV4dENvbnRlbnQsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7IC8vIEFkanVzdCB0aGUgeCx5LWNvb3JkaW5hdGUgYXMgbmVlZGVkXHJcbiAgICAvL3JlbW92ZSBzcGFuIHRhZ1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcclxuICAgIC8vIENvbnZlcnQgdGhlIGNhbnZhcyB0byBpbWFnZSBkYXRhXHJcbiAgICBjb25zdCBkYXRhVXJsID0gY2FudmFzRWxlbWVudC50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XHJcbiAgICBzZXRTaWduYXR1cmUoZGF0YVVybCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgUGVuQ29sb3JDb21wb25lbnQgPSAocHJvcHMpID0+IHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1zdGFydFwiPlxyXG4gICAgICAgIHthbGxDb2xvci5tYXAoKGRhdGEsIGtleSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgbWFyZ2luOiBcIjVweFwiLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206XHJcbiAgICAgICAgICAgICAgICAgIGtleSA9PT0gMCAmJiBwZW5Db2xvciA9PT0gXCJibHVlXCJcclxuICAgICAgICAgICAgICAgICAgICA/IFwiMnB4IHNvbGlkIGJsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIDoga2V5ID09PSAxICYmIHBlbkNvbG9yID09PSBcInJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiMnB4IHNvbGlkIHJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA6IGtleSA9PT0gMiAmJiBwZW5Db2xvciA9PT0gXCJibGFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCIycHggc29saWQgYmxhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiMnB4IHNvbGlkIHdoaXRlXCJcclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIHByb3BzPy5jb252ZXJ0VG9JbWcgJiZcclxuICAgICAgICAgICAgICAgICAgcHJvcHM/LmNvbnZlcnRUb0ltZyhmb250U2VsZWN0LCBzaWduVmFsdWUsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICBzZXRQZW5Db2xvcihcImJsdWVcIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICBzZXRQZW5Db2xvcihcInJlZFwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNldFBlbkNvbG9yKFwiYmxhY2tcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICBrZXk9e2tleX1cclxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1wZW4tbmliXCJcclxuICAgICAgICAgICAgICB3aWR0aD17MjB9XHJcbiAgICAgICAgICAgICAgaGVpZ2h0PXsyMH1cclxuICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSl9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgKTtcclxuICB9O1xyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2PlxyXG4gICAgICB7aXNTaWduUGFkICYmIChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm9wLW1vZGFsIG9wLW1vZGFsLW9wZW5cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbW9kYWwtYm94IHB4LVsxM3B4XSBwdC0yIHBiLTBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiB0ZXh0LWJhc2UtY29udGVudCBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzEuMnJlbV1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtWzNweF1cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBnYXAtWzVweF0gbWQ6Z2FwLVs4cHhdIHRleHQtWzExcHhdIG1kOnRleHQtYmFzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtpc1N0YW1wID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1iYXNlLWNvbnRlbnQgZm9udC1ib2xkIHRleHQtbGdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3dpZGdldFR5cGUgPT09IFwiaW1hZ2VcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyV2lkZ2V0c0RldGFpbHM/LnR5cGUgPT09IFwiaW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJVcGxvYWQgaW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJVcGxvYWQgc3RhbXAgaW1hZ2VcIn1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwiZHJhd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2lnbkltZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZShpc1NpZ25JbWcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWIgPT09IFwiZHJhd1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIm9wLWxpbmstcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIm5vLXVuZGVybGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG9wLWxpbmsgdW5kZXJsaW5lLW9mZnNldC04IG1sLVsycHhdYH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcmF3XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNUYWIoXCJ1cGxvYWRJbWFnZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlVHlwZShcIlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhYiA9PT0gXCJ1cGxvYWRJbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIm9wLWxpbmstcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIm5vLXVuZGVybGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG9wLWxpbmsgdW5kZXJsaW5lLW9mZnNldC04IG1sLVsycHhdYH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGxvYWQgSW1hZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNUYWIoXCJ0eXBlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmVUeXBlKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFiID09PSBcInR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJuby11bmRlcmxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBvcC1saW5rIHVuZGVybGluZS1vZmZzZXQtOCBtbC1bMnB4XWB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHshaXNJbml0aWFsICYmIGRlZmF1bHRTaWduID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEZWZhdWx0U2lnbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwibXlzaWduYXR1cmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlVHlwZShcIlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFiID09PSBcIm15c2lnbmF0dXJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIm5vLXVuZGVybGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayB1bmRlcmxpbmUtb2Zmc2V0LTggbWwtWzJweF1gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeSBTaWduYXR1cmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0luaXRpYWwgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBteUluaXRpYWwgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwibXlzaWduYXR1cmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmVUeXBlKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhYiA9PT0gXCJteXNpZ25hdHVyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwibm8tdW5kZXJsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG9wLWxpbmsgdW5kZXJsaW5lLW9mZnNldC04IG1sLVsycHhdYH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15IEluaXRpYWxzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMS41cmVtXSBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHNldFBlbkNvbG9yKFwiYmx1ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgc2V0SXNTaWduUGFkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICBzZXRJbWFnZSgpO1xyXG4gICAgICAgICAgICAgICAgICBzZXRJc1RhYihcImRyYXdcIik7XHJcbiAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZVR5cGUoXCJkcmF3XCIpO1xyXG4gICAgICAgICAgICAgICAgICBzZXRTaWduVmFsdWUoXCJcIik7XHJcbiAgICAgICAgICAgICAgICAgIHNldElzU3RhbXAoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAmdGltZXM7XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtWzIwcHhdIGgtZnVsbFwiPlxyXG4gICAgICAgICAgICAgIHtpc0RlZmF1bHRTaWduID8gKFxyXG4gICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBcIjEuM3B4IHNvbGlkICMwMDdiZmZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogNixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbCA/IFwiaW50aWFsU2lnbmF0dXJlQ2FudmFzXCIgOiBcInNpZ25hdHVyZUNhbnZhc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJzdGFtcCBpbWdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb250YWluIGJnLXdoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM9e2lzSW5pdGlhbCA/IG15SW5pdGlhbCA6IGRlZmF1bHRTaWdufVxyXG4gICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTYXZlQnRuIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgICAgKSA6IGlzSW1hZ2VTZWxlY3QgfHwgaXNTdGFtcCA/IChcclxuICAgICAgICAgICAgICAgICFpbWFnZSA/IChcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBcIjEuM3B4IHNvbGlkICMwMDdiZmZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogNixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbCA/IFwiaW50aWFsU2lnbmF0dXJlQ2FudmFzXCIgOiBcInNpZ25hdHVyZUNhbnZhc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBpbWFnZVJlZi5jdXJyZW50LmNsaWNrKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uSW1hZ2VDaGFuZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZpbGV0eXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0PVwiaW1hZ2UvcG5nLGltYWdlL2pwZWdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9e2ltYWdlUmVmfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5cclxuICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1jbG91ZC11cGxvYWQtYWx0IHVwbG9hZEltZ0xvZ29cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzEwcHhdXCI+VXBsb2FkPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwiMS4zcHggc29saWQgIzAwN2JmZlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCIycHhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206IDYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0luaXRpYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJpbnRpYWxTaWduYXR1cmVDYW52YXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInNpZ25hdHVyZUNhbnZhc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInByaW50IGltZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXtpbWFnZVJlZn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9e2ltYWdlLnNyY31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiIG9iamVjdC1jb250YWluIGgtZnVsbCB3LWZ1bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8U2F2ZUJ0biAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICApIDogaXNUYWIgPT09IFwidHlwZVwiID8gKFxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtci1bNXB4XSB0ZXh0LVsxMnB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge2lzSW5pdGlhbCA/IFwiSW5pdGlhbHNcIiA6IFwiU2lnbmF0dXJlXCJ9OlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aD17aXNJbml0aWFsID8gMyA6IDMwfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgZm9udEZhbWlseTogZm9udFNlbGVjdCwgY29sb3I6IHBlbkNvbG9yIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtbC0xIG9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkIG9wLWlucHV0LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBob3Zlcjpib3JkZXItYmFzZS1jb250ZW50IHctZnVsbCB0ZXh0LVsyMHB4XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIllvdXIgc2lnbmF0dXJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzaWduVmFsdWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnblZhbHVlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvSW1nKGZvbnRTZWxlY3QsIGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9yZGVyLVsxcHhdIGJvcmRlci1bI2Q2ZDNkM10gbXQtWzEwcHhdIG1sLVs1cHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge2ZvbnRPcHRpb25zLm1hcCgoZm9udCwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtpbmR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBmb250LnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2VsZWN0ID09PSBmb250LnZhbHVlICYmIFwicmdiKDIwNiAyMjUgMjQ3KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb250U2VsZWN0KGZvbnQudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFRvSW1nKGZvbnQudmFsdWUsIHNpZ25WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiNXB4IDEwcHggNXB4IDEwcHhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IFwiMjBweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogcGVuQ29sb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3NpZ25WYWx1ZSA/IHNpZ25WYWx1ZSA6IFwiWW91ciBzaWduYXR1cmVcIn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtWzEwcHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFBlbkNvbG9yQ29tcG9uZW50IGNvbnZlcnRUb0ltZz17Y29udmVydFRvSW1nfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTYXZlQnRuIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTaWduYXR1cmVDYW52YXNcclxuICAgICAgICAgICAgICAgICAgICAgIHJlZj17Y2FudmFzUmVmfVxyXG4gICAgICAgICAgICAgICAgICAgICAgcGVuQ29sb3I9e3BlbkNvbG9yfVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2FudmFzUHJvcHM9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBpc0luaXRpYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiaW50aWFsU2lnbmF0dXJlQ2FudmFzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwic2lnbmF0dXJlQ2FudmFzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBcIjEuNnB4IHNvbGlkICMwMDdiZmZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMnB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cInJnYigyNTUsIDI1NSwgMjU1KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkVuZD17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbmF0dXJlQ2hhbmdlKGNhbnZhc1JlZi5jdXJyZW50Py50b0RhdGFVUkwoKSlcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGRvdFNpemU9ezF9XHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtWzEwcHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFBlbkNvbG9yQ29tcG9uZW50IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNhdmVCdG4gLz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApfVxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU2lnblBhZDtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyBkYXJrZW5Db2xvciwgZ2V0Rmlyc3RMZXR0ZXIgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcclxuXHJcbmZ1bmN0aW9uIFNpZ25lckxpc3RDb21wb25lbnQocHJvcHMpIHtcclxuICBjb25zdCBjaGVja1NpZ25lckJhY2tDb2xvciA9IChvYmopID0+IHtcclxuICAgIGlmIChvYmopIHtcclxuICAgICAgbGV0IGRhdGEgPSBcIlwiO1xyXG4gICAgICBpZiAob2JqPy5JZCkge1xyXG4gICAgICAgIGRhdGEgPSBwcm9wcy5zaWduZXJQb3MuZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSBvYmouSWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRhdGEgPSBwcm9wcy5zaWduZXJQb3MuZmlsdGVyKFxyXG4gICAgICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IG9iai5vYmplY3RJZFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwICYmIGRhdGFbMF0uYmxvY2tDb2xvcjtcclxuICAgIH1cclxuICB9O1xyXG4gIGNvbnN0IGNoZWNrVXNlck5hbWVDb2xvciA9IChvYmopID0+IHtcclxuICAgIGNvbnN0IGdldEJhY2tDb2xvciA9IGNoZWNrU2lnbmVyQmFja0NvbG9yKG9iaik7XHJcbiAgICBpZiAoZ2V0QmFja0NvbG9yKSB7XHJcbiAgICAgIGNvbnN0IGNvbG9yID0gZGFya2VuQ29sb3IoZ2V0QmFja0NvbG9yLCAwLjQpO1xyXG4gICAgICByZXR1cm4gY29sb3I7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCIjYWJkMWQwXCI7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXZcclxuICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC14bCBteC0xIGZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIHB5LVsxMHB4XSBtdC0xXCJcclxuICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZDogY2hlY2tTaWduZXJCYWNrQ29sb3IocHJvcHMub2JqKSB9fVxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZDogY2hlY2tVc2VyTmFtZUNvbG9yKHByb3BzLm9iaikgfX1cclxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IHctWzMwcHhdIGgtWzMwcHhdIHJvdW5kZWQtZnVsbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgbXgtMVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxMnB4XSB0ZXh0LWNlbnRlciBmb250LWJvbGQgdGV4dC1ibGFjayB1cHBlcmNhc2VcIj5cclxuICAgICAgICAgIHtnZXRGaXJzdExldHRlcihcclxuICAgICAgICAgICAgcHJvcHMub2JqPy5OYW1lIHx8IHByb3BzLm9iaj8uZW1haWwgfHwgcHJvcHMub2JqPy5Sb2xlXHJcbiAgICAgICAgICApfVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzEycHhdIGZvbnQtYm9sZCB0ZXh0LVsjNDI0MjQyXSB3LVsxMDBweF0gd2hpdGVzcGFjZS1ub3dyYXAgb3ZlcmZsb3ctaGlkZGVuIHRleHQtZWxsaXBzaXNcIj5cclxuICAgICAgICAgIHtwcm9wcy5vYmo/Lk5hbWUgfHwgcHJvcHM/Lm9iaj8uUm9sZX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTBweF0gZm9udC1tZWRpdW0gdGV4dC1bIzQyNDI0Ml0gdy1bMTAwcHhdIHdoaXRlc3BhY2Utbm93cmFwIG92ZXJmbG93LWhpZGRlbiB0ZXh0LWVsbGlwc2lzXCI+XHJcbiAgICAgICAgICB7cHJvcHMub2JqPy5FbWFpbCB8fCBwcm9wcy5vYmo/LmVtYWlsfVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaWduZXJMaXN0Q29tcG9uZW50O1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCBMb2FkZXIgZnJvbSBcIi4uLy4uL3ByaW1pdGl2ZXMvTG9hZGVyXCI7XHJcblxyXG5mdW5jdGlvbiBWZXJpZnlFbWFpbChwcm9wcykge1xyXG4gIHJldHVybiAoXHJcbiAgICA8ZGlhbG9nIGNsYXNzTmFtZT1cIm9wLW1vZGFsIG9wLW1vZGFsLW9wZW4gYWJzb2x1dGUgei1bMTk5OV1cIj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZDp3LVs0MCVdIHctWzgwJV0gb3AtbW9kYWwtYm94IHAtMCBvdmVyZmxvdy15LWF1dG8gaGlkZS1zY3JvbGxiYXIgdGV4dC1zbVwiPlxyXG4gICAgICAgIDxoMyBjbGFzc05hbWU9XCJmb250LWJvbGQgdGV4dC1sZyBwdC1bMTVweF0gcHgtWzIwcHhdIHRleHQtYmFzZS1jb250ZW50XCI+XHJcbiAgICAgICAgICBPVFAgdmVyaWZpY2F0aW9uXHJcbiAgICAgICAgPC9oMz5cclxuICAgICAgICB7cHJvcHMuaXNWZXJpZnlNb2RhbCA/IChcclxuICAgICAgICAgIDxmb3JtXHJcbiAgICAgICAgICAgIG9uU3VibWl0PXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHByb3BzLnNldElzVmVyaWZ5TW9kYWwoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIHByb3BzLmhhbmRsZVZlcmlmeUVtYWlsKGUpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTYgcHktMyB0ZXh0LWJhc2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJtYi0yXCI+RW50ZXIgT1RQPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGVsXCJcclxuICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XXs0fVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgb3AtaW5wdXQgb3AtaW5wdXQtYm9yZGVyZWQgb3AtaW5wdXQtc20gZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdGV4dC14c1wiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIE9UUCByZWNlaXZlZCBvdmVyIGVtYWlsXCJcclxuICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9wcy5vdHB9XHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHByb3BzLnNldE90cChlLnRhcmdldC52YWx1ZSl9XHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtNiBteS0zXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICBWZXJpZnlcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXNlY29uZGFyeSBtbC0yXCJcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBwcm9wcy5oYW5kbGVSZXNlbmQoZSl9XHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgUmVzZW5kXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICkgOiBwcm9wcy5vdHBMb2FkZXIgPyAoXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtWzE1MHB4XSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8TG9hZGVyIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApIDogKFxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC02IHB5LTMgdGV4dC1iYXNlLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibWItMiB0ZXh0LXNtXCI+UGxlYXNlIHZlcmlmeSB5b3VyIGVtYWlsICE8L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtMCBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVWZXJpZnlCdG4oKTtcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgU2VuZCBPVFBcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGlhbG9nPlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZlcmlmeUVtYWlsO1xyXG4iLCJpbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCJwZGYtbGliXCI7XG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XG5pbXBvcnQgeyBhcHBJbmZvIH0gZnJvbSBcIi4vYXBwaW5mb1wiO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSBcImZpbGUtc2F2ZXJcIjtcbmltcG9ydCBwcmludE1vZHVsZSBmcm9tIFwicHJpbnQtanNcIjtcbmltcG9ydCB7IHZhbGlkcGxhbiB9IGZyb20gXCIuLi9qc29uL3BsYW5zQXJyXCI7XG5cbmV4cG9ydCBjb25zdCBmb250c2l6ZUFyciA9IFsyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiwgMTgsIDIwLCAyMiwgMjQsIDI2LCAyOF07XG5leHBvcnQgY29uc3QgZm9udENvbG9yQXJyID0gW1wicmVkXCIsIFwiYmxhY2tcIiwgXCJibHVlXCIsIFwieWVsbG93XCJdO1xuZXhwb3J0IGNvbnN0IGlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPCA3Njc7XG5leHBvcnQgY29uc3QgaXNUYWJBbmRNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDEwMjM7XG5leHBvcnQgY29uc3QgdGV4dElucHV0V2lkZ2V0ID0gXCJ0ZXh0IGlucHV0XCI7XG5leHBvcnQgY29uc3QgdGV4dFdpZGdldCA9IFwidGV4dFwiO1xuZXhwb3J0IGNvbnN0IHJhZGlvQnV0dG9uV2lkZ2V0ID0gXCJyYWRpbyBidXR0b25cIjtcbmV4cG9ydCBjb25zdCBvcGVuSW5OZXdUYWIgPSAodXJsLCB0YXJnZXQpID0+IHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHdpbmRvdy5vcGVuKHVybCwgdGFyZ2V0LCBcIm5vb3BlbmVyLG5vcmVmZXJyZXJcIik7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93Lm9wZW4odXJsLCBcIl9ibGFua1wiLCBcIm5vb3BlbmVyLG5vcmVmZXJyZXJcIik7XG4gIH1cbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFN1YnNjcmlwdGlvbihcbiAgZXh0VXNlcklkLFxuICBjb250YWN0T2JqSWQsXG4gIGlzR3Vlc3RTaWduID0gZmFsc2Vcbikge1xuICB0cnkge1xuICAgIGNvbnN0IEV4dGFuZF9DbGFzcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiRXh0YW5kX0NsYXNzXCIpO1xuICAgIGNvbnN0IGV4dENsYXNzID0gRXh0YW5kX0NsYXNzICYmIEpTT04ucGFyc2UoRXh0YW5kX0NsYXNzKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcImV4dENsYXNzIFwiLCBleHRDbGFzcyk7XG4gICAgbGV0IGV4dFVzZXI7XG4gICAgaWYgKGV4dENsYXNzICYmIGV4dENsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgIGV4dFVzZXIgPSBleHRDbGFzc1swXS5vYmplY3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZXh0VXNlciA9IGV4dFVzZXJJZDtcbiAgICB9XG4gICAgY29uc3QgYmFzZVVSTCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKTtcbiAgICBjb25zdCB1cmwgPSBgJHtiYXNlVVJMfWZ1bmN0aW9ucy9nZXRzdWJzY3JpcHRpb25zYDtcbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxuICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgfTtcbiAgICBjb25zdCBwYXJhbXMgPSBpc0d1ZXN0U2lnblxuICAgICAgPyB7IGNvbnRhY3RJZDogY29udGFjdE9iaklkIH1cbiAgICAgIDogeyBleHRVc2VySWQ6IGV4dFVzZXIgfTtcbiAgICBjb25zdCB0ZW5hdFJlcyA9IGF3YWl0IGF4aW9zLnBvc3QodXJsLCBwYXJhbXMsIHsgaGVhZGVyczogaGVhZGVycyB9KTtcbiAgICBsZXQgcGxhbiwgc3RhdHVzLCBiaWxsaW5nRGF0ZTtcbiAgICBpZiAoaXNHdWVzdFNpZ24pIHtcbiAgICAgIHBsYW4gPSB0ZW5hdFJlcy5kYXRhPy5yZXN1bHQ/LnJlc3VsdD8ucGxhbjtcbiAgICAgIHN0YXR1cyA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5pc1N1YnNjcmliZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBsYW4gPSB0ZW5hdFJlcy5kYXRhPy5yZXN1bHQ/LnJlc3VsdD8uUGxhbkNvZGU7XG4gICAgICBiaWxsaW5nRGF0ZSA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5OZXh0X2JpbGxpbmdfZGF0ZT8uaXNvO1xuICAgIH1cbiAgICByZXR1cm4geyBwbGFuLCBiaWxsaW5nRGF0ZSwgc3RhdHVzIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGZldGNoIHN1YnNjcmlwdGlvblwiLCBlcnIpO1xuICAgIHJldHVybiB7IHBsYW46IFwiXCIsIGJpbGxpbmdEYXRlOiBcIlwiIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoU3Vic2NyaXB0aW9uSW5mbygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBFeHRhbmRfQ2xhc3MgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkV4dGFuZF9DbGFzc1wiKTtcbiAgICBjb25zdCBleHRDbGFzcyA9IEV4dGFuZF9DbGFzcyAmJiBKU09OLnBhcnNlKEV4dGFuZF9DbGFzcyk7XG4gICAgLy8gY29uc29sZS5sb2coXCJleHRDbGFzcyBcIiwgZXh0Q2xhc3MpO1xuICAgIGlmIChleHRDbGFzcyAmJiBleHRDbGFzcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleHRVc2VyID0gZXh0Q2xhc3NbMF0ub2JqZWN0SWQ7XG4gICAgICBjb25zdCBiYXNlVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpO1xuICAgICAgY29uc3QgdXJsID0gYCR7YmFzZVVSTH1mdW5jdGlvbnMvZ2V0c3Vic2NyaXB0aW9uc2A7XG4gICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgICB9O1xuICAgICAgY29uc3QgcGFyYW1zID0geyBleHRVc2VySWQ6IGV4dFVzZXIgfTtcbiAgICAgIGNvbnN0IHRlbmF0UmVzID0gYXdhaXQgYXhpb3MucG9zdCh1cmwsIHBhcmFtcywgeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xuXG4gICAgICBjb25zdCBwcmljZSA9XG4gICAgICAgIHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5TdWJzY3JpcHRpb25EZXRhaWxzPy5kYXRhPy5zdWJzY3JpcHRpb25cbiAgICAgICAgICA/LnBsYW4/LnByaWNlO1xuICAgICAgY29uc3QgdG90YWxQcmljZSA9XG4gICAgICAgIHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5TdWJzY3JpcHRpb25EZXRhaWxzPy5kYXRhPy5zdWJzY3JpcHRpb25cbiAgICAgICAgICA/LmFtb3VudDtcbiAgICAgIGNvbnN0IHBsYW5JZCA9XG4gICAgICAgIHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5TdWJzY3JpcHRpb25EZXRhaWxzPy5kYXRhPy5zdWJzY3JpcHRpb25cbiAgICAgICAgICA/LnN1YnNjcmlwdGlvbl9pZDtcbiAgICAgIGNvbnN0IHBsYW5fY29kZSA9XG4gICAgICAgIHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5TdWJzY3JpcHRpb25EZXRhaWxzPy5kYXRhPy5zdWJzY3JpcHRpb25cbiAgICAgICAgICA/LnBsYW4/LnBsYW5fY29kZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgIHByaWNlOiBwcmljZSxcbiAgICAgICAgdG90YWxQcmljZTogdG90YWxQcmljZSxcbiAgICAgICAgcGxhbklkOiBwbGFuSWQsXG4gICAgICAgIHBsYW5fY29kZTogcGxhbl9jb2RlXG4gICAgICB9O1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gZmV0Y2ggc3Vic2NyaXB0aW9uXCIsIGVycik7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiBcImVycm9yXCIsIGVycm9yOiBlcnIgfTtcbiAgfVxufVxuLy9mdW5jdGlvbiB0byBnZXQgc3ViY3JpcGl0aW9uIGRldGFpbHMgZnJvbSBzdWJzY3JpcHRpb24gY2xhc3NcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0lzU3Vic2NyaWJlZCgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaFN1YnNjcmlwdGlvbigpO1xuICAgIGlmIChyZXMucGxhbiA9PT0gXCJmcmVlcGxhblwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChyZXMuYmlsbGluZ0RhdGUpIHtcbiAgICAgIGlmIChuZXcgRGF0ZShyZXMuYmlsbGluZ0RhdGUpID4gbmV3IERhdGUoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gZmV0Y2ggc3Vic2NyaXB0aW9uXCIsIGVycik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vZnVuY3Rpb24gdG8gZ2V0IHN1YmNyaXBpdGlvbiBkZXRhaWxzIGZyb20gc3Vic2NyaXB0aW9uIGNsYXNzXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tJc1N1YnNjcmliZWRUZWFtKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoU3Vic2NyaXB0aW9uKCk7XG4gICAgaWYgKHJlcy5wbGFuID09PSBcImZyZWVwbGFuXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHJlcy5iaWxsaW5nRGF0ZSkge1xuICAgICAgY29uc3QgcGxhbiA9IHZhbGlkcGxhbltyZXMucGxhbl0gfHwgZmFsc2U7XG4gICAgICBpZiAocGxhbiAmJiBuZXcgRGF0ZShyZXMuYmlsbGluZ0RhdGUpID4gbmV3IERhdGUoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gZmV0Y2ggc3Vic2NyaXB0aW9uXCIsIGVycik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjb2xvciA9IFtcbiAgXCIjOTNhM2RiXCIsXG4gIFwiI2U2YzNkYlwiLFxuICBcIiNjMGUzYmNcIixcbiAgXCIjYmNlM2RiXCIsXG4gIFwiI2I4Y2NkYlwiLFxuICBcIiNjZWI4ZGJcIixcbiAgXCIjZmZjY2ZmXCIsXG4gIFwiIzk5ZmZjY1wiLFxuICBcIiNjYzk5ZmZcIixcbiAgXCIjZmZjYzk5XCIsXG4gIFwiIzY2Y2NmZlwiLFxuICBcIiNmZmZmY2NcIlxuXTtcblxuZXhwb3J0IGNvbnN0IG5hbWVDb2xvciA9IFtcbiAgXCIjMzA0ZmJmXCIsXG4gIFwiIzdkNTI3MFwiLFxuICBcIiM1ZjgyNWJcIixcbiAgXCIjNTc4MDc3XCIsXG4gIFwiIzU3NmU4MFwiLFxuICBcIiM2ZDUyN2RcIixcbiAgXCIjY2MwMGNjXCIsXG4gIFwiIzAwNjY2NlwiLFxuICBcIiNjYzAwZmZcIixcbiAgXCIjZmY5OTAwXCIsXG4gIFwiIzMzNjY5OVwiLFxuICBcIiNjYzk5MDBcIlxuXTtcbmV4cG9ydCBjb25zdCB0b0RhdGFVcmwgPSAoZmlsZSkgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoZSkgPT4ge1xuICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuICAgIH07XG4gIH0pO1xufTtcblxuLy9mdW5jdGlvbiBmb3IgZ2V0dGluZyBkb2N1bWVudCBkZXRhaWxzIGZvciBnZXREcml2ZSBjbG91ZCBmdW5jdGlvblxuZXhwb3J0IGNvbnN0IGdldERyaXZlID0gYXN5bmMgKGRvY3VtZW50SWQsIHNraXAgPSAwLCBsaW1pdCA9IDEwMCkgPT4ge1xuICBjb25zdCBkYXRhID0ge1xuICAgIGRvY0lkOiBkb2N1bWVudElkICYmIGRvY3VtZW50SWQsXG4gICAgbGltaXQ6IGxpbWl0LFxuICAgIHNraXA6IHNraXBcbiAgfTtcbiAgY29uc3QgZHJpdmVEZWF0aWxzID0gYXdhaXQgYXhpb3NcbiAgICAucG9zdChgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2dldERyaXZlYCwgZGF0YSwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgc2Vzc2lvbnRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbigoTGlzdGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGpzb24gPSBMaXN0ZGF0YS5kYXRhO1xuXG4gICAgICBpZiAoanNvbiAmJiBqc29uLnJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgIH0gZWxzZSBpZiAoanNvbiAmJiBqc29uLnJlc3VsdCkge1xuICAgICAgICBjb25zdCBkYXRhID0ganNvbi5yZXN1bHQ7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGdldERyaXZlIGNsb3VkIGZ1bmN0aW9uXCIsIGVycik7XG4gICAgICByZXR1cm4gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCI7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGRyaXZlRGVhdGlscztcbn07XG5cbi8vIGBwZGZOZXdXaWR0aEZ1bmAgZnVuY3Rpb24gaXMgdXNlZCB0byBjYWxjdWxhdGUgcGRmIHdpZHRoIHRvIHJlbmRlciBpbiBtaWRkbGUgY29udGFpbmVyXG5leHBvcnQgY29uc3QgcGRmTmV3V2lkdGhGdW4gPSAoZGl2UmVmKSA9PiB7XG4gIGNvbnN0IHBkZldpZHRoID0gZGl2UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGg7XG4gIHJldHVybiBwZGZXaWR0aDtcbn07XG5cbi8vYGNvbnRyYWN0VXNlcnNgIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IGNvbnRyYWN0X1VzZXIgZGV0YWlsc1xuZXhwb3J0IGNvbnN0IGNvbnRyYWN0VXNlcnMgPSBhc3luYyAoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlckRldGFpbHMgPSBhd2FpdCBQYXJzZS5DbG91ZC5ydW4oXCJnZXRVc2VyRGV0YWlsc1wiKTtcbiAgICBsZXQgZGF0YSA9IFtdO1xuICAgIGlmICh1c2VyRGV0YWlscykge1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodXNlckRldGFpbHMpKTtcbiAgICAgIGRhdGEucHVzaChqc29uKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGdldFVzZXJEZXRhaWxzIGNsb3VkIGZ1bmN0aW9uXCIsIGVycik7XG4gICAgcmV0dXJuIFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiO1xuICB9XG59O1xuXG4vL2Z1bmN0aW9uIGZvciByZXNpemUgaW1hZ2UgYW5kIHVwZGF0ZSB3aWR0aCBhbmQgaGVpZ2h0IGZvciBtdWxpdGlzaWduZXJzXG5leHBvcnQgY29uc3QgaGFuZGxlSW1hZ2VSZXNpemUgPSAoXG4gIHJlZixcbiAga2V5LFxuICBzaWduZXJQb3MsXG4gIHNldFNpZ25lclBvcyxcbiAgcGFnZU51bWJlcixcbiAgY29udGFpbmVyU2NhbGUsXG4gIHNjYWxlLFxuICBzaWduZXJJZCxcbiAgc2hvd1Jlc2l6ZVxuKSA9PiB7XG4gIGNvbnN0IGZpbHRlclNpZ25lclBvcyA9IHNpZ25lclBvcy5maWx0ZXIoKGRhdGEpID0+IGRhdGEuSWQgPT09IHNpZ25lcklkKTtcbiAgaWYgKGZpbHRlclNpZ25lclBvcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZ2V0UGxhY2VIb2xkZXIgPSBmaWx0ZXJTaWduZXJQb3NbMF0ucGxhY2VIb2xkZXI7XG4gICAgY29uc3QgZ2V0UGFnZU51bWVyID0gZ2V0UGxhY2VIb2xkZXIuZmlsdGVyKFxuICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlclxuICAgICk7XG4gICAgaWYgKGdldFBhZ2VOdW1lci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBnZXRYWWRhdGEgPSBnZXRQYWdlTnVtZXJbMF0ucG9zO1xuICAgICAgY29uc3QgZ2V0UG9zRGF0YSA9IGdldFhZZGF0YTtcbiAgICAgIGNvbnN0IGFkZFNpZ25Qb3MgPSBnZXRQb3NEYXRhLm1hcCgodXJsKSA9PiB7XG4gICAgICAgIGlmICh1cmwua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udXJsLFxuICAgICAgICAgICAgV2lkdGg6IHJlZi5vZmZzZXRXaWR0aCAvIChjb250YWluZXJTY2FsZSAqIHNjYWxlKSxcbiAgICAgICAgICAgIEhlaWdodDogcmVmLm9mZnNldEhlaWdodCAvIChjb250YWluZXJTY2FsZSAqIHNjYWxlKSxcbiAgICAgICAgICAgIElzUmVzaXplOiBzaG93UmVzaXplID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25Qb3MgPSBnZXRQbGFjZUhvbGRlci5tYXAoKG9iaikgPT4ge1xuICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBvczogYWRkU2lnblBvcyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmV3VXBkYXRlU2lnbmVyID0gc2lnbmVyUG9zLm1hcCgob2JqKSA9PiB7XG4gICAgICAgIGlmIChvYmouSWQgPT09IHNpZ25lcklkKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwbGFjZUhvbGRlcjogbmV3VXBkYXRlU2lnblBvcyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9KTtcblxuICAgICAgc2V0U2lnbmVyUG9zKG5ld1VwZGF0ZVNpZ25lcik7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgd2lkZ2V0cyA9IFtcbiAge1xuICAgIHR5cGU6IFwic2lnbmF0dXJlXCIsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1wZW4tbmliXCIsXG4gICAgaWNvblNpemU6IFwiMjBweFwiXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcInN0YW1wXCIsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1zdGFtcFwiLFxuICAgIGljb25TaXplOiBcIjE5cHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogXCJpbml0aWFsc1wiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtc2lnbmF0dXJlXCIsXG4gICAgaWNvblNpemU6IFwiMTVweFwiXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcIm5hbWVcIixcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXVzZXJcIixcbiAgICBpY29uU2l6ZTogXCIyMXB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiam9iIHRpdGxlXCIsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1hZGRyZXNzLWNhcmRcIixcbiAgICBpY29uU2l6ZTogXCIxN3B4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiY29tcGFueVwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtYnVpbGRpbmdcIixcbiAgICBpY29uU2l6ZTogXCIyNXB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtY2FsZW5kYXItZGF5c1wiLFxuICAgIGljb25TaXplOiBcIjIwcHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogdGV4dFdpZGdldCxcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXRleHQtd2lkdGhcIixcbiAgICBpY29uU2l6ZTogXCIyMHB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IHRleHRJbnB1dFdpZGdldCxcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLWZvbnRcIixcbiAgICBpY29uU2l6ZTogXCIyMXB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiY2hlY2tib3hcIixcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXNxdWFyZS1jaGVja1wiLFxuICAgIGljb25TaXplOiBcIjIycHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogXCJkcm9wZG93blwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtY2lyY2xlLWNoZXZyb24tZG93blwiLFxuICAgIGljb25TaXplOiBcIjE5cHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogcmFkaW9CdXR0b25XaWRnZXQsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1jaXJjbGUtZG90XCIsXG4gICAgaWNvblNpemU6IFwiMjBweFwiXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1pbWFnZVwiLFxuICAgIGljb25TaXplOiBcIjIwcHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogXCJlbWFpbFwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtZW52ZWxvcGVcIixcbiAgICBpY29uU2l6ZTogXCIyMHB4XCJcbiAgfVxuXTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGUgPSAoKSA9PiB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFRpbWUoKTtcbiAgY29uc3QgbmV3RGF0ZSA9IG1vbWVudChtaWxsaXNlY29uZHMpLmZvcm1hdChcIk1NL0REL1lZWVlcIik7XG4gIHJldHVybiBuZXdEYXRlO1xufTtcbmV4cG9ydCBjb25zdCBhZGRXaWRnZXRPcHRpb25zID0gKHR5cGUpID0+IHtcbiAgY29uc3QgZGVmYXVsdE9wdCA9IHtcbiAgICBuYW1lOiB0eXBlLFxuICAgIHN0YXR1czogXCJyZXF1aXJlZFwiXG4gIH07XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJzaWduYXR1cmVcIjpcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xuICAgIGNhc2UgXCJzdGFtcFwiOlxuICAgICAgcmV0dXJuIGRlZmF1bHRPcHQ7XG4gICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWZhdWx0T3B0LFxuICAgICAgICBvcHRpb25zOiB7IGlzUmVhZE9ubHk6IGZhbHNlLCBpc0hpZGVMYWJlbDogZmFsc2UgfVxuICAgICAgfTtcbiAgICBjYXNlIHRleHRJbnB1dFdpZGdldDpcbiAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRPcHQgfTtcbiAgICBjYXNlIFwiaW5pdGlhbHNcIjpcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xuICAgIGNhc2UgXCJuYW1lXCI6XG4gICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0IH07XG4gICAgY2FzZSBcImNvbXBhbnlcIjpcbiAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRPcHQgfTtcbiAgICBjYXNlIFwiam9iIHRpdGxlXCI6XG4gICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0IH07XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZmF1bHRPcHQsXG4gICAgICAgIHJlc3BvbnNlOiBnZXREYXRlKCksXG4gICAgICAgIHZhbGlkYXRpb246IHsgZm9ybWF0OiBcIk1NL2RkL3l5eXlcIiwgdHlwZTogXCJkYXRlLWZvcm1hdFwiIH1cbiAgICAgIH07XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRPcHQsIHZhbGlkYXRpb246IHsgdHlwZTogXCJlbWFpbFwiLCBwYXR0ZXJuOiBcIlwiIH0gfTtcbiAgICBjYXNlIFwiZHJvcGRvd25cIjpcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xuICAgIGNhc2UgcmFkaW9CdXR0b25XaWRnZXQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWZhdWx0T3B0LFxuICAgICAgICB2YWx1ZXM6IFtdLFxuICAgICAgICBpc1JlYWRPbmx5OiBmYWxzZSxcbiAgICAgICAgaXNIaWRlTGFiZWw6IGZhbHNlXG4gICAgICB9O1xuICAgIGNhc2UgdGV4dFdpZGdldDpcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge307XG4gIH1cbn07XG5leHBvcnQgY29uc3QgZ2V0V2lkZ2V0VHlwZSA9IChpdGVtKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJvcC1idG4gdy1maXQgbWQ6dy1bMTAwJV0gb3AtYnRuLXByaW1hcnkgb3AtYnRuLW91dGxpbmUgb3AtYnRuLXNtIGZvY3VzOm91dGxpbmUtbm9uZSBvdXRsaW5lIG91dGxpbmUtWzEuNXB4XSBtbC1bNnB4XSBtZDptbC0wIHAtMCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbCBmbGV4IG1kOmp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktc3RhcnQgaXRlbXMtY2VudGVyIHRleHQtWzEzcHhdIG1sLTFcIj5cbiAgICAgICAgICB7IWlzTW9iaWxlICYmIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWdyaXAtdmVydGljYWwgbWwtWzNweF1cIj48L2k+fVxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1kOmlubGluZS1ibG9jayB0ZXh0LWNlbnRlciB0ZXh0LVsxNXB4XSBtbC1bNXB4XSBmb250LXNlbWlib2xkIHByLTEgbWQ6cHItMFwiPlxuICAgICAgICAgICAge2l0ZW0udHlwZX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzIwcHhdIG9wLWJ0biBvcC1idG4tcHJpbWFyeSByb3VuZGVkLW5vbmUgdy1bNDBweF0gaC1mdWxsIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPGkgY2xhc3NOYW1lPXtpdGVtLmljb259PjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0V2lkdGhIZWlnaHQgPSAodHlwZSkgPT4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic2lnbmF0dXJlXCI6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDYwIH07XG4gICAgY2FzZSBcInN0YW1wXCI6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDYwIH07XG4gICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTUsIGhlaWdodDogMTUgfTtcbiAgICBjYXNlIHRleHRJbnB1dFdpZGdldDpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogMjUgfTtcbiAgICBjYXNlIFwiZHJvcGRvd25cIjpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxMjAsIGhlaWdodDogMjIgfTtcbiAgICBjYXNlIFwiaW5pdGlhbHNcIjpcbiAgICAgIHJldHVybiB7IHdpZHRoOiA1MCwgaGVpZ2h0OiA1MCB9O1xuICAgIGNhc2UgXCJuYW1lXCI6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDI1IH07XG4gICAgY2FzZSBcImNvbXBhbnlcIjpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogMjUgfTtcbiAgICBjYXNlIFwiam9iIHRpdGxlXCI6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDI1IH07XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMjAgfTtcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICAgIHJldHVybiB7IHdpZHRoOiA3MCwgaGVpZ2h0OiA3MCB9O1xuICAgIGNhc2UgXCJlbWFpbFwiOlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAyMCB9O1xuICAgIGNhc2UgcmFkaW9CdXR0b25XaWRnZXQ6XG4gICAgICByZXR1cm4geyB3aWR0aDogNSwgaGVpZ2h0OiAxMCB9O1xuICAgIGNhc2UgdGV4dFdpZGdldDpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogMjUgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiA2MCB9O1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVzaXplQm9yZGVyRXh0cmFXaWR0aCA9ICgpID0+IHtcbiAgcmV0dXJuIDIwO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhc2U2NEZyb21VcmwodXJsKSB7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICBjb25zdCBibG9iID0gYXdhaXQgZGF0YS5ibG9iKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBkZkJhc2UgPSB0aGlzLnJlc3VsdDtcbiAgICAgIGNvbnN0IHN1ZmZpeGJhc2U2NCA9IHBkZkJhc2Uuc3BsaXQoXCIsXCIpLnBvcCgpO1xuICAgICAgcmVzb2x2ZShzdWZmaXhiYXNlNjQpO1xuICAgIH07XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QmFzZTY0RnJvbUlNRyh1cmwpIHtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoKHVybCk7XG4gIGNvbnN0IGJsb2IgPSBhd2FpdCBkYXRhLmJsb2IoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGRmQmFzZSA9IHRoaXMucmVzdWx0O1xuXG4gICAgICByZXNvbHZlKHBkZkJhc2UpO1xuICAgIH07XG4gIH0pO1xufVxuLy9mdW5jdGlvbiBmb3IgY29udmVydCBzaWduYXR1cmUgcG5nIGJhc2U2NCB1cmwgdG8ganBlZyBiYXNlNjRcbmV4cG9ydCBjb25zdCBjb252ZXJ0UE5HdG9KUEVHID0gKGJhc2U2NERhdGEpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgIGltZy5zcmMgPSBiYXNlNjREYXRhO1xuXG4gICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuXG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IFwiI2ZmZmZmZlwiOyAvLyB3aGl0ZSBjb2xvclxuICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAvLyBDb252ZXJ0IHRvIEpQRUcgYnkgdXNpbmcgdGhlIGNhbnZhcy50b0RhdGFVUkwoKSBtZXRob2RcbiAgICAgIGNvbnN0IGpwZWdCYXNlNjREYXRhID0gY2FudmFzLnRvRGF0YVVSTChcImltYWdlL2pwZWdcIik7XG5cbiAgICAgIHJlc29sdmUoanBlZ0Jhc2U2NERhdGEpO1xuICAgIH07XG5cbiAgICBpbWcub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICB9KTtcbn07XG5cbi8vZnVuY3Rpb24gZm9yIHJlc2l6ZSBpbWFnZSBhbmQgdXBkYXRlIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHNpZ24teW91cnNlbGZcbmV4cG9ydCBjb25zdCBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZSA9IChcbiAgcmVmLFxuICBrZXksXG4gIHh5UG9zdGlvbixcbiAgc2V0WHlQb3N0aW9uLFxuICBpbmRleCxcbiAgY29udGFpbmVyU2NhbGUsXG4gIHNjYWxlXG4pID0+IHtcbiAgY29uc3QgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XG4gIGNvbnN0IGdldFBvc0RhdGEgPSBnZXRYWWRhdGE7XG4gIGNvbnN0IGFkZFNpZ24gPSBnZXRQb3NEYXRhLm1hcCgodXJsKSA9PiB7XG4gICAgaWYgKHVybC5rZXkgPT09IGtleSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udXJsLFxuICAgICAgICBXaWR0aDogcmVmLm9mZnNldFdpZHRoIC8gKHNjYWxlICogY29udGFpbmVyU2NhbGUpLFxuICAgICAgICBIZWlnaHQ6IHJlZi5vZmZzZXRIZWlnaHQgLyAoc2NhbGUgKiBjb250YWluZXJTY2FsZSksXG4gICAgICAgIElzUmVzaXplOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xuICB9KTtcblxuICBjb25zdCBuZXdVcGRhdGVVcmwgPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xuICAgIGlmIChpbmQgPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4geyAuLi5vYmosIHBvczogYWRkU2lnbiB9O1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9KTtcbiAgc2V0WHlQb3N0aW9uKG5ld1VwZGF0ZVVybCk7XG59O1xuXG4vL2Z1bmN0aW9uIGZvciBjYWxsIGNsb3VkIGZ1bmN0aW9uIHNpZ25QZGYgYW5kIGdlbmVyYXRlIGRpZ2l0YWwgc2lnbmF0dXJlXG5leHBvcnQgY29uc3Qgc2lnblBkZkZ1biA9IGFzeW5jIChcbiAgYmFzZTY0VXJsLFxuICBkb2N1bWVudElkLFxuICBzaWduZXJPYmplY3RJZCxcbiAgb2JqZWN0SWQsXG4gIGlzU3Vic2NyaWJlZCxcbiAgYWN0aXZlTWFpbEFkYXB0ZXIsXG4gIHdpZGdldHNcbikgPT4ge1xuICBsZXQgaXNDdXN0b21Db21wbGV0aW9uTWFpbCA9IGZhbHNlO1xuICB0cnkge1xuICAgIC8vZ2V0IHRlbmFudCBkZXRhaWxzXG4gICAgY29uc3QgdGVuYW50RGV0YWlscyA9IGF3YWl0IGdldFRlbmFudERldGFpbHMob2JqZWN0SWQpO1xuICAgIGlmICh0ZW5hbnREZXRhaWxzICYmIHRlbmFudERldGFpbHMgPT09IFwidXNlciBkb2VzIG5vdCBleGlzdCFcIikge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcImVycm9yXCIsIG1lc3NhZ2U6IFwiVXNlciBkb2VzIG5vdCBleGlzdC5cIiB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRlbmFudERldGFpbHM/LkNvbXBsZXRpb25Cb2R5ICYmXG4gICAgICAgIHRlbmFudERldGFpbHM/LkNvbXBsZXRpb25TdWJqZWN0ICYmXG4gICAgICAgIGlzU3Vic2NyaWJlZFxuICAgICAgKSB7XG4gICAgICAgIGlzQ3VzdG9tQ29tcGxldGlvbk1haWwgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGJlbG93IGZvciBsb29wIGlzIHVzZWQgdG8gZ2V0IGZpcnN0IHNpZ25hdHVyZSBvZiB1c2VyIHRvIHNlbmQgaWYgdG8gc2lnbnBkZlxuICAgIC8vIGZvciBhZGRpbmcgaXQgaW4gY29tcGxldGlvbiBjZXJ0aWZpY2F0ZVxuICAgIGxldCBnZXRTaWduYXR1cmU7XG4gICAgZm9yIChsZXQgaXRlbSBvZiB3aWRnZXRzKSB7XG4gICAgICBpZiAoIWdldFNpZ25hdHVyZSkge1xuICAgICAgICBjb25zdCB0eXBlRXhpc3QgPSBpdGVtLnBvcy5zb21lKChkYXRhKSA9PiBkYXRhPy50eXBlKTtcbiAgICAgICAgaWYgKHR5cGVFeGlzdCkge1xuICAgICAgICAgIGdldFNpZ25hdHVyZSA9IGl0ZW0ucG9zLmZpbmQoKGRhdGEpID0+IGRhdGE/LnR5cGUgPT09IFwic2lnbmF0dXJlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdldFNpZ25hdHVyZSA9IGl0ZW0ucG9zLmZpbmQoKGRhdGEpID0+ICFkYXRhLmlzU3RhbXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJhc2U2NFNpZ24gPSBnZXRTaWduYXR1cmUuU2lnblVybDtcbiAgICAvL2NoZWNrIGh0dHBzIHR5cGUgc2lnbmF0dXJlIChkZWZhdWx0IHNpZ25hdHVyZSBleGlzdCkgdGhlbiBjb252ZXJ0IGluIGJhc2U2NFxuICAgIGNvbnN0IGlzVXJsID0gYmFzZTY0U2lnbi5pbmNsdWRlcyhcImh0dHBzXCIpO1xuICAgIGlmIChpc1VybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYmFzZTY0U2lnbiA9IGF3YWl0IGZldGNoSW1hZ2VCYXNlNjQoYmFzZTY0U2lnbik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3JcIiwgZSk7XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBcInNvbWV0aGluZyB3ZW50IHdyb25nLlwiIH07XG4gICAgICB9XG4gICAgfVxuICAgIC8vY2hhbmdlIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgdG8gMTAwLzQwIGluIHBuZyBiYXNlNjRcbiAgICBjb25zdCBnZXROZXdzZTY0ID0gYXdhaXQgY2hhbmdlSW1hZ2VXSChiYXNlNjRTaWduKTtcbiAgICAvL3JlbW92ZSBzdWZmaWl4IG9mIGJhc2U2NFxuICAgIGNvbnN0IHN1ZmZpeGJhc2U2NCA9IGdldE5ld3NlNjQgJiYgZ2V0TmV3c2U2NC5zcGxpdChcIixcIikucG9wKCk7XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBtYWlsUHJvdmlkZXI6IGFjdGl2ZU1haWxBZGFwdGVyLFxuICAgICAgcGRmRmlsZTogYmFzZTY0VXJsLFxuICAgICAgZG9jSWQ6IGRvY3VtZW50SWQsXG4gICAgICB1c2VySWQ6IHNpZ25lck9iamVjdElkLFxuICAgICAgaXNDdXN0b21Db21wbGV0aW9uTWFpbDogaXNDdXN0b21Db21wbGV0aW9uTWFpbCxcbiAgICAgIHNpZ25hdHVyZTogc3VmZml4YmFzZTY0XG4gICAgfTtcbiAgICBjb25zdCByZXNTaWduUGRmID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwic2lnblBkZlwiLCBwYXJhbXMpO1xuICAgIGlmIChyZXNTaWduUGRmKSB7XG4gICAgICBjb25zdCBzaWduZWRQZGYgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc1NpZ25QZGYpKTtcbiAgICAgIHJldHVybiBzaWduZWRQZGY7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gc2lnblBkZiBjbG91ZCBmdW5jdGlvbiBcIiwgZS5tZXNzYWdlKTtcbiAgICBpZiAoZSAmJiBlPy5tZXNzYWdlPy5pbmNsdWRlcyhcImlzIGVuY3J5cHRlZC5cIikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBtZXNzYWdlOiBcIkN1cnJlbnRseSBlbmNyeXB0ZWQgcGRmIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkLlwiXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBlLm1lc3NhZ2UgPT09IFwiUEtDUyMxMiBNQUMgY291bGQgbm90IGJlIHZlcmlmaWVkLiBJbnZhbGlkIHBhc3N3b3JkP1wiXG4gICAgKSB7XG4gICAgICByZXR1cm4geyBzdGF0dXM6IFwiZXJyb3JcIiwgbWVzc2FnZTogXCJQRlggZmlsZSBwYXNzd29yZCBpcyBpbnZhbGlkLlwiIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBcInNvbWV0aGluZyB3ZW50IHdyb25nLlwiIH07XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmFuZG9tSWQgPSAoKSA9PiB7XG4gIGNvbnN0IHJhbmRvbUJ5dGVzID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDE2QXJyYXkoMSkpO1xuICBjb25zdCByYW5kb21WYWx1ZSA9IHJhbmRvbUJ5dGVzWzBdO1xuICBjb25zdCByYW5kb21EaWdpdCA9IDEwMDAgKyAocmFuZG9tVmFsdWUgJSA5MDAwKTtcbiAgcmV0dXJuIHJhbmRvbURpZ2l0O1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURvY3VtZW50ID0gYXN5bmMgKHRlbXBsYXRlLCBwbGFjZWhvbGRlcnMsIHNpZ25lckRhdGEpID0+IHtcbiAgaWYgKHRlbXBsYXRlICYmIHRlbXBsYXRlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBEb2MgPSB0ZW1wbGF0ZVswXTtcblxuICAgIGxldCBwbGFjZWhvbGRlcnNBcnIgPSBbXTtcbiAgICBpZiAocGxhY2Vob2xkZXJzPy5sZW5ndGggPiAwKSB7XG4gICAgICBwbGFjZWhvbGRlcnNBcnIgPSBwbGFjZWhvbGRlcnM7XG4gICAgfVxuICAgIGxldCBzaWduZXJzID0gW107XG4gICAgaWYgKHNpZ25lckRhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHNpZ25lckRhdGEuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICBpZiAoeC5vYmplY3RJZCkge1xuICAgICAgICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiY29udHJhY3RzX0NvbnRhY3Rib29rXCIsXG4gICAgICAgICAgICBvYmplY3RJZDogeC5vYmplY3RJZFxuICAgICAgICAgIH07XG4gICAgICAgICAgc2lnbmVycy5wdXNoKG9iaik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgTmFtZTogRG9jLk5hbWUsXG4gICAgICBVUkw6IERvYy5VUkwsXG4gICAgICBTaWduZWRVcmw6IERvYy5TaWduZWRVcmwsXG4gICAgICBTZW50VG9PdGhlcnM6IERvYy5TZW50VG9PdGhlcnMsXG4gICAgICBEZXNjcmlwdGlvbjogRG9jLkRlc2NyaXB0aW9uLFxuICAgICAgTm90ZTogRG9jLk5vdGUsXG4gICAgICBQbGFjZWhvbGRlcnM6IHBsYWNlaG9sZGVyc0FycixcbiAgICAgIEV4dFVzZXJQdHI6IHtcbiAgICAgICAgX190eXBlOiBcIlBvaW50ZXJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcImNvbnRyYWN0c19Vc2Vyc1wiLFxuICAgICAgICBvYmplY3RJZDogRG9jLkV4dFVzZXJQdHIub2JqZWN0SWRcbiAgICAgIH0sXG4gICAgICBDcmVhdGVkQnk6IHtcbiAgICAgICAgX190eXBlOiBcIlBvaW50ZXJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIl9Vc2VyXCIsXG4gICAgICAgIG9iamVjdElkOiBEb2MuQ3JlYXRlZEJ5Lm9iamVjdElkXG4gICAgICB9LFxuICAgICAgU2lnbmVyczogc2lnbmVycyxcbiAgICAgIFNlbmRpbk9yZGVyOiBEb2M/LlNlbmRpbk9yZGVyIHx8IGZhbHNlLFxuICAgICAgQXV0b21hdGljUmVtaW5kZXJzOiBEb2M/LkF1dG9tYXRpY1JlbWluZGVycyB8fCBmYWxzZSxcbiAgICAgIFJlbWluZE9uY2VJbkV2ZXJ5OiBwYXJzZUludChEb2M/LlJlbWluZE9uY2VJbkV2ZXJ5IHx8IDUpXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBheGlvcy5wb3N0KFxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9Y2xhc3Nlcy9jb250cmFjdHNfRG9jdW1lbnRgLFxuICAgICAgICBkYXRhLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxuICAgICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcInN1Y2Nlc3NcIiwgaWQ6IHJlcy5kYXRhLm9iamVjdElkIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImF4b2lzIGVyciBcIiwgZXJyKTtcbiAgICAgIHJldHVybiB7IHN0YXR1czogXCJlcnJvclwiLCBpZDogXCJTb21ldGhpbmcgV2VudCBXcm9uZyFcIiB9O1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0TGV0dGVyID0gKG5hbWUpID0+IHtcbiAgY29uc3QgZmlyc3RMZXR0ZXIgPSBuYW1lPy5jaGFyQXQoMCk7XG4gIHJldHVybiBmaXJzdExldHRlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBkYXJrZW5Db2xvciA9IChjb2xvciwgZmFjdG9yKSA9PiB7XG4gIC8vIFJlbW92ZSAnIycgZnJvbSB0aGUgY29sb3IgY29kZSBhbmQgcGFyc2UgaXQgdG8gZ2V0IFJHQiB2YWx1ZXNcbiAgY29uc3QgaGV4ID0gY29sb3IucmVwbGFjZShcIiNcIiwgXCJcIik7XG4gIGNvbnN0IHIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDAsIDIpLCAxNik7XG4gIGNvbnN0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XG4gIGNvbnN0IGIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDQsIDYpLCAxNik7XG5cbiAgLy8gRGFya2VuIHRoZSBjb2xvciBieSByZWR1Y2luZyBlYWNoIFJHQiBjb21wb25lbnRcbiAgY29uc3QgZGFya2VyUiA9IE1hdGguZmxvb3IociAqICgxIC0gZmFjdG9yKSk7XG4gIGNvbnN0IGRhcmtlckcgPSBNYXRoLmZsb29yKGcgKiAoMSAtIGZhY3RvcikpO1xuICBjb25zdCBkYXJrZXJCID0gTWF0aC5mbG9vcihiICogKDEgLSBmYWN0b3IpKTtcblxuICAvLyBDb252ZXJ0IHRoZSBkYXJrZW5lZCBSR0IgY29tcG9uZW50cyBiYWNrIHRvIGhleFxuICByZXR1cm4gYCMkeygoZGFya2VyUiA8PCAxNikgfCAoZGFya2VyRyA8PCA4KSB8IGRhcmtlckIpXG4gICAgLnRvU3RyaW5nKDE2KVxuICAgIC5wYWRTdGFydCg2LCBcIjBcIil9YDtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRaSW5kZXggPSAoc2lnbmVyUG9zLCBrZXksIHNldFpJbmRleCkgPT4ge1xuICByZXR1cm4gc2lnbmVyUG9zLm1hcCgoaXRlbSkgPT4ge1xuICAgIGlmIChpdGVtLnBsYWNlSG9sZGVyICYmIGl0ZW0ucGxhY2VIb2xkZXIubGVuZ3RoID4gMCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXN0ZWQgYXJyYXksIHJlY3Vyc2l2ZWx5IGFkZCB0aGUgZmllbGQgdG8gdGhlIGxhc3Qgb2JqZWN0XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBwbGFjZUhvbGRlcjogYWRkWkluZGV4KGl0ZW0ucGxhY2VIb2xkZXIsIGtleSwgc2V0WkluZGV4KVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0ucG9zICYmIGl0ZW0ucG9zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG5lc3RlZCBhcnJheSwgYWRkIHRoZSBuZXcgZmllbGRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLml0ZW0sXG4gICAgICAgIHBvczogYWRkWkluZGV4KGl0ZW0ucG9zLCBrZXksIHNldFpJbmRleClcbiAgICAgICAgLy8gQWRqdXN0IHRoaXMgbGluZSB0byBhZGQgdGhlIGRlc2lyZWQgZmllbGRcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpdGVtLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHNldFpJbmRleChpdGVtLnpJbmRleCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICB6SW5kZXg6IGl0ZW0uekluZGV4ID8gaXRlbS56SW5kZXggKyAxIDogMVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pdGVtXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbi8vZnVuY3Rpb24gZm9yIHNhdmUgd2lkZ2V0cyB2YWx1ZSBvbiBvbmNoYW5nZSBmdW5jdGlvblxuZXhwb3J0IGNvbnN0IG9uQ2hhbmdlSW5wdXQgPSAoXG4gIHZhbHVlLFxuICBzaWduS2V5LFxuICB4eVBvc3Rpb24sXG4gIGluZGV4LFxuICBzZXRYeVBvc3Rpb24sXG4gIHVzZXJJZCxcbiAgaW5pdGlhbCxcbiAgZGF0ZUZvcm1hdCxcbiAgaXNEZWZhdWx0RW1wdHksXG4gIGlzUmFkaW9cbikgPT4ge1xuICBjb25zdCBpc1NpZ25lcnMgPSB4eVBvc3Rpb24uc29tZSgoZGF0YSkgPT4gZGF0YS5zaWduZXJQdHIpO1xuICBsZXQgZmlsdGVyU2lnbmVyUG9zO1xuICBpZiAoaXNTaWduZXJzKSB7XG4gICAgaWYgKHVzZXJJZCkge1xuICAgICAgZmlsdGVyU2lnbmVyUG9zID0geHlQb3N0aW9uLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5JZCA9PT0gdXNlcklkKTtcbiAgICB9XG4gICAgY29uc3QgZ2V0UGxhY2VIb2xkZXIgPSBmaWx0ZXJTaWduZXJQb3NbMF0/LnBsYWNlSG9sZGVyO1xuICAgIGlmIChpbml0aWFsKSB7XG4gICAgICBjb25zdCB4eURhdGEgPSBhZGRJbml0aWFsRGF0YSh4eVBvc3Rpb24sIHNldFh5UG9zdGlvbiwgdmFsdWUsIHVzZXJJZCk7XG4gICAgICBzZXRYeVBvc3Rpb24oeHlEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ2V0UGFnZU51bWVyID0gZ2V0UGxhY2VIb2xkZXIuZmlsdGVyKFxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5wYWdlTnVtYmVyID09PSBpbmRleFxuICAgICAgKTtcbiAgICAgIGlmIChnZXRQYWdlTnVtZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBnZXRYWWRhdGEgPSBnZXRQYWdlTnVtZXJbMF0ucG9zO1xuICAgICAgICBjb25zdCBnZXRQb3NEYXRhID0gZ2V0WFlkYXRhO1xuICAgICAgICBjb25zdCBhZGRTaWduUG9zID0gZ2V0UG9zRGF0YS5tYXAoKHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKHBvc2l0aW9uLmtleSA9PT0gc2lnbktleSkge1xuICAgICAgICAgICAgaWYgKGRhdGVGb3JtYXQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAuLi5wb3NpdGlvbi5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGUtZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogZGF0ZUZvcm1hdCAvLyBUaGlzIGluZGljYXRlcyB0aGUgcmVxdWlyZWQgZGF0ZSBmb3JtYXQgZXhwbGljaXRseS5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRGVmYXVsdEVtcHR5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogaXNSYWRpbyA/IFwiXCIgOiBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbmV3VXBkYXRlU2lnblBvcyA9IGdldFBsYWNlSG9sZGVyLm1hcCgob2JqKSA9PiB7XG4gICAgICAgICAgaWYgKG9iai5wYWdlTnVtYmVyID09PSBpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IGFkZFNpZ25Qb3MgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbmV3VXBkYXRlU2lnbmVyID0geHlQb3N0aW9uLm1hcCgob2JqKSA9PiB7XG4gICAgICAgICAgaWYgKG9iai5JZCA9PT0gdXNlcklkKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBuZXdVcGRhdGVTaWduUG9zIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldFh5UG9zdGlvbihuZXdVcGRhdGVTaWduZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XG5cbiAgICBjb25zdCB1cGRhdGVQb3NpdGlvbiA9IGdldFhZZGF0YS5tYXAoKHBvc2l0aW9uRGF0YSkgPT4ge1xuICAgICAgaWYgKHBvc2l0aW9uRGF0YS5rZXkgPT09IHNpZ25LZXkpIHtcbiAgICAgICAgaWYgKGRhdGVGb3JtYXQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucG9zaXRpb25EYXRhLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAuLi5wb3NpdGlvbkRhdGEub3B0aW9ucyxcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHZhbHVlLFxuICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJkYXRlLWZvcm1hdFwiLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogZGF0ZUZvcm1hdCAvLyBUaGlzIGluZGljYXRlcyB0aGUgcmVxdWlyZWQgZGF0ZSBmb3JtYXQgZXhwbGljaXRseS5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uRGF0YSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgLi4ucG9zaXRpb25EYXRhLm9wdGlvbnMsXG4gICAgICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwb3NpdGlvbkRhdGE7XG4gICAgfSk7XG5cbiAgICBjb25zdCB1cGRhdGVQbGFjZWhvbGRlciA9IHh5UG9zdGlvbi5tYXAoKG9iaiwgaW5kKSA9PiB7XG4gICAgICBpZiAoaW5kID09PSBpbmRleCkge1xuICAgICAgICByZXR1cm4geyAuLi5vYmosIHBvczogdXBkYXRlUG9zaXRpb24gfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSk7XG4gICAgc2V0WHlQb3N0aW9uKHVwZGF0ZVBsYWNlaG9sZGVyKTtcbiAgfVxufTtcblxuLy9mdW5jdGlvbiB0byBpbmNyZWFzZSBoZWlnaHQgb2YgdGV4dCBhcmVhIG9uIHByZXNzIGVudGVyXG5leHBvcnQgY29uc3Qgb25DaGFuZ2VIZWlnaHRPZlRleHRBcmVhID0gKFxuICBoZWlnaHQsXG4gIHdpZGdldFR5cGUsXG4gIHNpZ25LZXksXG4gIHh5UG9zdGlvbixcbiAgaW5kZXgsXG4gIHNldFh5UG9zdGlvbixcbiAgdXNlcklkXG4pID0+IHtcbiAgY29uc3QgaXNTaWduZXJzID0geHlQb3N0aW9uLnNvbWUoKGRhdGEpID0+IGRhdGEuc2lnbmVyUHRyKTtcbiAgbGV0IGZpbHRlclNpZ25lclBvcztcbiAgaWYgKGlzU2lnbmVycykge1xuICAgIGlmICh1c2VySWQpIHtcbiAgICAgIGZpbHRlclNpZ25lclBvcyA9IHh5UG9zdGlvbi5maWx0ZXIoKGRhdGEpID0+IGRhdGEuSWQgPT09IHVzZXJJZCk7XG4gICAgfVxuICAgIGNvbnN0IGdldFBsYWNlSG9sZGVyID0gZmlsdGVyU2lnbmVyUG9zWzBdPy5wbGFjZUhvbGRlcjtcblxuICAgIGNvbnN0IGdldFBhZ2VOdW1lciA9IGdldFBsYWNlSG9sZGVyLmZpbHRlcihcbiAgICAgIChkYXRhKSA9PiBkYXRhLnBhZ2VOdW1iZXIgPT09IGluZGV4XG4gICAgKTtcbiAgICBpZiAoZ2V0UGFnZU51bWVyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdldFhZZGF0YSA9IGdldFBhZ2VOdW1lclswXS5wb3M7XG4gICAgICBjb25zdCBnZXRQb3NEYXRhID0gZ2V0WFlkYXRhO1xuICAgICAgY29uc3QgYWRkU2lnblBvcyA9IGdldFBvc0RhdGEubWFwKChwb3NpdGlvbikgPT4ge1xuICAgICAgICBpZiAocG9zaXRpb24ua2V5ID09PSBzaWduS2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgSGVpZ2h0OiBwb3NpdGlvbi5IZWlnaHRcbiAgICAgICAgICAgICAgPyBwb3NpdGlvbi5IZWlnaHQgKyBoZWlnaHRcbiAgICAgICAgICAgICAgOiBkZWZhdWx0V2lkdGhIZWlnaHQod2lkZ2V0VHlwZSkuaGVpZ2h0ICsgaGVpZ2h0XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25Qb3MgPSBnZXRQbGFjZUhvbGRlci5tYXAoKG9iaikgPT4ge1xuICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IGluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IGFkZFNpZ25Qb3MgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25lciA9IHh5UG9zdGlvbi5tYXAoKG9iaikgPT4ge1xuICAgICAgICBpZiAob2JqLklkID09PSB1c2VySWQpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBuZXdVcGRhdGVTaWduUG9zIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH0pO1xuXG4gICAgICBzZXRYeVBvc3Rpb24obmV3VXBkYXRlU2lnbmVyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGdldFhZZGF0YSA9IHh5UG9zdGlvbltpbmRleF0ucG9zO1xuXG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSBnZXRYWWRhdGEubWFwKChwb3NpdGlvbikgPT4ge1xuICAgICAgaWYgKHBvc2l0aW9uLmtleSA9PT0gc2lnbktleSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgIEhlaWdodDogcG9zaXRpb24uSGVpZ2h0XG4gICAgICAgICAgICA/IHBvc2l0aW9uLkhlaWdodCArIGhlaWdodFxuICAgICAgICAgICAgOiBkZWZhdWx0V2lkdGhIZWlnaHQod2lkZ2V0VHlwZSkuaGVpZ2h0ICsgaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfSk7XG5cbiAgICBjb25zdCB1cGRhdGVQbGFjZWhvbGRlciA9IHh5UG9zdGlvbi5tYXAoKG9iaiwgaW5kKSA9PiB7XG4gICAgICBpZiAoaW5kID09PSBpbmRleCkge1xuICAgICAgICByZXR1cm4geyAuLi5vYmosIHBvczogdXBkYXRlUG9zaXRpb24gfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSk7XG4gICAgc2V0WHlQb3N0aW9uKHVwZGF0ZVBsYWNlaG9sZGVyKTtcbiAgfVxufTtcbi8vY2FsY3VsYXRlIHdpZHRoIGFuZCBoZWlnaHRcbmV4cG9ydCBjb25zdCBjYWxjdWxhdGVJbml0aWFsV2lkdGhIZWlnaHQgPSAod2lkZ2V0RGF0YSkgPT4ge1xuICBjb25zdCBpbnRpYWxUZXh0ID0gd2lkZ2V0RGF0YTtcbiAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICBzcGFuLnRleHRDb250ZW50ID0gaW50aWFsVGV4dDtcbiAgc3Bhbi5zdHlsZS5mb250ID0gYDE0cHhgOyAvLyBoZXJlIHB1dCB5b3VyIHRleHQgc2l6ZSBhbmQgZm9udCBmYW1pbHlcbiAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJoaWRkZW5cIjtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgY29uc3Qgd2lkdGggPSBzcGFuLm9mZnNldFdpZHRoO1xuICBjb25zdCBoZWlnaHQgPSBzcGFuLm9mZnNldEhlaWdodDtcblxuICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICByZXR1cm4ge1xuICAgIGdldFdpZHRoOiB3aWR0aCxcbiAgICBnZXRIZWlnaHQ6IGhlaWdodFxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBhZGRJbml0aWFsRGF0YSA9IChzaWduZXJQb3MsIHNldFh5UG9zdGlvbiwgdmFsdWUsIHVzZXJJZCkgPT4ge1xuICBmdW5jdGlvbiB3aWRnZXREYXRhVmFsdWUodHlwZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIm5hbWVcIjpcbiAgICAgICAgcmV0dXJuIHZhbHVlPy5OYW1lO1xuICAgICAgY2FzZSBcImNvbXBhbnlcIjpcbiAgICAgICAgcmV0dXJuIHZhbHVlPy5Db21wYW55O1xuICAgICAgY2FzZSBcImpvYiB0aXRsZVwiOlxuICAgICAgICByZXR1cm4gdmFsdWU/LkpvYlRpdGxlO1xuICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgIHJldHVybiB2YWx1ZT8uRW1haWw7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpZ25lclBvcy5tYXAoKGl0ZW0pID0+IHtcbiAgICBpZiAoaXRlbS5wbGFjZUhvbGRlciAmJiBpdGVtLnBsYWNlSG9sZGVyLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIGEgbmVzdGVkIGFycmF5LCByZWN1cnNpdmVseSBhZGQgdGhlIGZpZWxkIHRvIHRoZSBsYXN0IG9iamVjdFxuICAgICAgaWYgKGl0ZW0uSWQgPT09IHVzZXJJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgcGxhY2VIb2xkZXI6IGFkZEluaXRpYWxEYXRhKFxuICAgICAgICAgICAgaXRlbS5wbGFjZUhvbGRlcixcbiAgICAgICAgICAgIHNldFh5UG9zdGlvbixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdXNlcklkXG4gICAgICAgICAgKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pdGVtXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpdGVtLnBvcyAmJiBpdGVtLnBvcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyBuZXN0ZWQgYXJyYXksIGFkZCB0aGUgbmV3IGZpZWxkXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBwb3M6IGFkZEluaXRpYWxEYXRhKGl0ZW0ucG9zLCBzZXRYeVBvc3Rpb24sIHZhbHVlLCB1c2VySWQpXG4gICAgICAgIC8vIEFkanVzdCB0aGlzIGxpbmUgdG8gYWRkIHRoZSBkZXNpcmVkIGZpZWxkXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB3aWRnZXREYXRhID0gd2lkZ2V0RGF0YVZhbHVlKGl0ZW0udHlwZSk7XG4gICAgICBpZiAoW1wibmFtZVwiLCBcImNvbXBhbnlcIiwgXCJqb2IgdGl0bGVcIiwgXCJlbWFpbFwiXS5pbmNsdWRlcyhpdGVtLnR5cGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAuLi5pdGVtLm9wdGlvbnMsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHdpZGdldERhdGFcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gV2lkdGg6XG4gICAgICAgICAgLy8gICBjYWxjdWxhdGVJbml0aWFsV2lkdGhIZWlnaHQoaXRlbS50eXBlLCB3aWRnZXREYXRhKS5nZXRXaWR0aCB8fFxuICAgICAgICAgIC8vICAgaXRlbT8uV2lkdGgsXG4gICAgICAgICAgLy8gSGVpZ2h0OlxuICAgICAgICAgIC8vICAgY2FsY3VsYXRlSW5pdGlhbFdpZHRoSGVpZ2h0KGl0ZW0udHlwZSwgd2lkZ2V0RGF0YSkuZ2V0SGVpZ2h0IHx8XG4gICAgICAgICAgLy8gICBpdGVtPy5IZWlnaHRcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vL2Z1bmN0aW9uIGZvciBlbWJlZCBkb2N1bWVudCBpZFxuZXhwb3J0IGNvbnN0IGVtYmVkRG9jSWQgPSBhc3luYyAocGRmRG9jLCBkb2N1bWVudElkLCBhbGxQYWdlcykgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFBhZ2VzOyBpKyspIHtcbiAgICBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChcIkhlbHZldGljYVwiKTtcbiAgICBjb25zdCBmb250U2l6ZSA9IDEwO1xuICAgIGNvbnN0IHRleHRDb250ZW50ID0gZG9jdW1lbnRJZCAmJiBgT3BlblNpZ27ihKIgRG9jdW1lbnRJZDogJHtkb2N1bWVudElkfSBgO1xuICAgIGNvbnN0IHBhZ2VzID0gcGRmRG9jLmdldFBhZ2VzKCk7XG4gICAgY29uc3QgcGFnZSA9IHBhZ2VzW2ldO1xuICAgIHBhZ2UuZHJhd1RleHQodGV4dENvbnRlbnQsIHtcbiAgICAgIHg6IDEwLFxuICAgICAgeTogcGFnZS5nZXRIZWlnaHQoKSAtIDEwLFxuICAgICAgc2l6ZTogZm9udFNpemUsXG4gICAgICBmb250LFxuICAgICAgY29sb3I6IHJnYigwLjUsIDAuNSwgMC41KVxuICAgIH0pO1xuICB9XG59O1xuXG4vL2Z1bmN0aW9uIGZvciBzYXZlIGJ1dHRvbiB0byBzYXZlIHNpZ25hdHVyZSBvciBpbWFnZSB1cmxcbmV4cG9ydCBmdW5jdGlvbiBvblNhdmVTaWduKFxuICB0eXBlLFxuICB4eVBvc3Rpb24sXG4gIGluZGV4LFxuICBzaWduS2V5LFxuICBzaWduYXR1cmVJbWcsXG4gIGltZ1dILFxuICBpc0RlZmF1bHRTaWduLFxuICBpc1R5cGVUZXh0XG4pIHtcbiAgbGV0IGdldElNR1dIO1xuICBsZXQgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XG4gIGNvbnN0IHVwZGF0ZVhZRGF0YSA9IGdldFhZZGF0YS5tYXAoKHBvc2l0aW9uKSA9PiB7XG4gICAgaWYgKHBvc2l0aW9uLmtleSA9PT0gc2lnbktleSkge1xuICAgICAgaWYgKGlzRGVmYXVsdFNpZ24gPT09IFwiaW5pdGlhbHNcIikge1xuICAgICAgICBsZXQgaW1nV0ggPSB7IHdpZHRoOiBwb3NpdGlvbi5XaWR0aCwgaGVpZ2h0OiBwb3NpdGlvbi5IZWlnaHQgfTtcbiAgICAgICAgZ2V0SU1HV0ggPSBjYWxjdWxhdGVJbWdBc3BlY3RSYXRpbyhpbWdXSCwgcG9zaXRpb24pO1xuICAgICAgfSBlbHNlIGlmIChpc0RlZmF1bHRTaWduID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICBnZXRJTUdXSCA9IGNhbGN1bGF0ZUltZ0FzcGVjdFJhdGlvKGltZ1dILCBwb3NpdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKGlzVHlwZVRleHQpIHtcbiAgICAgICAgZ2V0SU1HV0ggPSB7IG5ld1dpZHRoOiBpbWdXSC53aWR0aCwgbmV3SGVpZ2h0OiBpbWdXSC5oZWlnaHQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGRlZmF1bHRXaWR0aEhlaWdodChwb3NpdGlvbj8udHlwZSkud2lkdGg7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRIZWlnaHQgPSBkZWZhdWx0V2lkdGhIZWlnaHQocG9zaXRpb24/LnR5cGUpLmhlaWdodDtcblxuICAgICAgICBnZXRJTUdXSCA9IGNhbGN1bGF0ZUltZ0FzcGVjdFJhdGlvKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdpZHRoOiBkZWZhdWx0V2lkdGggPyBkZWZhdWx0V2lkdGggOiAxNTAsXG4gICAgICAgICAgICBoZWlnaHQ6IGRlZmF1bHRIZWlnaHQgPyBkZWZhdWx0SGVpZ2h0IDogNjBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBvc2l0aW9uXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBvc1dpZHRoID0gZ2V0SU1HV0ggPyBnZXRJTUdXSC5uZXdXaWR0aCA6IDE1MDtcbiAgICAgIGNvbnN0IHBvc0hlaWdodCA9IGdldElNR1dIID8gZ2V0SU1HV0gubmV3SGVpZ2h0IDogNjA7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICBXaWR0aDogcG9zV2lkdGgsXG4gICAgICAgIEhlaWdodDogcG9zSGVpZ2h0LFxuICAgICAgICBTaWduVXJsOiBzaWduYXR1cmVJbWcsXG4gICAgICAgIHNpZ25hdHVyZVR5cGU6IHR5cGUgJiYgdHlwZSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXG4gICAgICAgICAgcmVzcG9uc2U6IHNpZ25hdHVyZUltZ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0pO1xuXG4gIGNvbnN0IHVwZGF0ZVhZcG9zaXRpb24gPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xuICAgIGlmIChpbmQgPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4geyAuLi5vYmosIHBvczogdXBkYXRlWFlEYXRhIH07XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH0pO1xuICByZXR1cm4gdXBkYXRlWFlwb3NpdGlvbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNhbGN1bGF0ZUltZ0FzcGVjdFJhdGlvID0gKGltZ1dILCBwb3MpID0+IHtcbiAgbGV0IG5ld1dpZHRoLCBuZXdIZWlnaHQ7XG5cbiAgY29uc3QgcGxhY2Vob2xkZXJIZWlnaHQgPSBwb3MgJiYgcG9zLkhlaWdodCA/IHBvcy5IZWlnaHQgOiA2MDtcbiAgY29uc3QgYXNwZWN0UmF0aW8gPSBpbWdXSC53aWR0aCAvIGltZ1dILmhlaWdodDtcbiAgbmV3V2lkdGggPSBhc3BlY3RSYXRpbyAqIHBsYWNlaG9sZGVySGVpZ2h0O1xuICBuZXdIZWlnaHQgPSBwbGFjZWhvbGRlckhlaWdodDtcblxuICByZXR1cm4geyBuZXdIZWlnaHQsIG5ld1dpZHRoIH07XG59O1xuXG4vL2Z1bmN0aW9uIGZvciB1cGxvYWQgc3RhbXAgb3IgaW1hZ2VcbmV4cG9ydCBmdW5jdGlvbiBvblNhdmVJbWFnZSh4eVBvc3Rpb24sIGluZGV4LCBzaWduS2V5LCBpbWdXSCwgaW1hZ2UpIHtcbiAgbGV0IGdldElNR1dIO1xuXG4gIC8vZ2V0IGN1cnJlbnQgcGFnZSBwb3NpdGlvblxuICBjb25zdCBnZXRYWURhdGEgPSB4eVBvc3Rpb25baW5kZXhdLnBvcztcbiAgY29uc3QgdXBkYXRlWFlEYXRhID0gZ2V0WFlEYXRhLm1hcCgocG9zaXRpb24pID0+IHtcbiAgICBpZiAocG9zaXRpb24ua2V5ID09PSBzaWduS2V5KSB7XG4gICAgICBnZXRJTUdXSCA9IGNhbGN1bGF0ZUltZ0FzcGVjdFJhdGlvKGltZ1dILCBwb3NpdGlvbik7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICBXaWR0aDogZ2V0SU1HV0gubmV3V2lkdGgsXG4gICAgICAgIEhlaWdodDogZ2V0SU1HV0gubmV3SGVpZ2h0LFxuICAgICAgICBTaWduVXJsOiBpbWFnZS5zcmMsXG4gICAgICAgIEltYWdlVHlwZTogaW1hZ2UuaW1nVHlwZSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXG4gICAgICAgICAgcmVzcG9uc2U6IGltYWdlLnNyY1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0pO1xuXG4gIGNvbnN0IHVwZGF0ZVhZcG9zaXRpb24gPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xuICAgIGlmIChpbmQgPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4geyAuLi5vYmosIHBvczogdXBkYXRlWFlEYXRhIH07XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH0pO1xuICByZXR1cm4gdXBkYXRlWFlwb3NpdGlvbjtcbn1cblxuLy9mdW5jdGlvbiBmb3Igc2VsZWN0IGltYWdlIGFuZCB1cGxvYWQgaW1hZ2VcbmV4cG9ydCBjb25zdCBvbkltYWdlU2VsZWN0ID0gKGV2ZW50LCBzZXRJbWdXSCwgc2V0SW1hZ2UpID0+IHtcbiAgY29uc3QgaW1hZ2VUeXBlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdLnR5cGU7XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5yZWFkQXNEYXRhVVJMKGV2ZW50LnRhcmdldC5maWxlc1swXSk7XG4gIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgIGxldCB3aWR0aCwgaGVpZ2h0O1xuICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG5cbiAgICBpbWFnZS5zcmMgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2lkdGggPSBpbWFnZS53aWR0aDtcbiAgICAgIGhlaWdodCA9IGltYWdlLmhlaWdodDtcbiAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gNDYwIC8gMTg0O1xuICAgICAgY29uc3QgaW1nUiA9IHdpZHRoIC8gaGVpZ2h0O1xuXG4gICAgICBpZiAoaW1nUiA+IGFzcGVjdFJhdGlvKSB7XG4gICAgICAgIHdpZHRoID0gNDYwO1xuICAgICAgICBoZWlnaHQgPSA0NjAgLyBpbWdSO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2lkdGggPSAxODQgKiBpbWdSO1xuICAgICAgICBoZWlnaHQgPSAxODQ7XG4gICAgICB9XG4gICAgICBzZXRJbWdXSCh7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfSk7XG4gICAgfTtcblxuICAgIGltYWdlLnNyYyA9IHJlYWRlci5yZXN1bHQ7XG5cbiAgICBzZXRJbWFnZSh7IHNyYzogaW1hZ2Uuc3JjLCBpbWdUeXBlOiBpbWFnZVR5cGUgfSk7XG4gIH07XG59O1xuLy9jb252ZXJ0IGh0dHBzIHVybCB0byBiYXNlNjRcbmV4cG9ydCBjb25zdCBmZXRjaEltYWdlQmFzZTY0ID0gYXN5bmMgKGltYWdlVXJsKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChpbWFnZVVybCk7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBiYXNlNjRkYXRhID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgcmVzb2x2ZShiYXNlNjRkYXRhKTtcbiAgICAgIH07XG4gICAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBjb252ZXJ0aW5nIFVSTCB0byBiYXNlNjQ6XCIsIGVycm9yKTtcbiAgfVxufTtcbi8vZnVuY3Rpb24gZm9yIHNlbGVjdCBpbWFnZSBhbmQgdXBsb2FkIGltYWdlXG5leHBvcnQgY29uc3QgY2hhbmdlSW1hZ2VXSCA9IGFzeW5jIChiYXNlNjRJbWFnZSkgPT4ge1xuICBjb25zdCBuZXdXaWR0aCA9IDEwMDtcbiAgY29uc3QgbmV3SGVpZ2h0ID0gNDA7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgaW1nLnNyYyA9IGJhc2U2NEltYWdlO1xuICAgIGltZy5vbmxvYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgY2FudmFzLmhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgIGNvbnN0IHJlc2l6ZWRCYXNlNjQgPSBjYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIsIDEuMCk7XG4gICAgICByZXNvbHZlKHJlc2l6ZWRCYXNlNjQpO1xuICAgIH07XG4gICAgaW1nLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcbiAgfSk7XG59O1xuXG4vL2Z1bmN0aW9uIHRvIGNhbGN1bGF0ZSBmb250IHNpemUgb2YgdGV4dCBhcmVhIHdpZGdldHNcbmNvbnN0IGNhbGN1bGF0ZUZvbnRTaXplID0gKHBvc2l0aW9uLCBjb250YWluZXJTY2FsZSwgc2lnbnlvdXJzZWxmKSA9PiB7XG4gIGNvbnN0IGZvbnQgPSBwb3NpdGlvbj8ub3B0aW9ucz8uZm9udFNpemUgfHwgMTI7XG4gIGlmICghc2lnbnlvdXJzZWxmICYmIHBvc2l0aW9uPy5pc01vYmlsZSAmJiBwb3NpdGlvbj8uc2NhbGUpIHtcbiAgICByZXR1cm4gZm9udCAvIHBvc2l0aW9uPy5zY2FsZSAvIGNvbnRhaW5lclNjYWxlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmb250IC8gY29udGFpbmVyU2NhbGU7XG4gIH1cbn07XG4vL2Z1bmN0aW9uIGZvciBlbWJlZCBtdWx0aXBsZSBzaWduYXR1cmUgdXNpbmcgcGRmLWxpYlxuZXhwb3J0IGNvbnN0IG11bHRpU2lnbkVtYmVkID0gYXN5bmMgKFxuICB3aWRnZXRzLFxuICBwZGZEb2MsXG4gIHNpZ255b3Vyc2VsZixcbiAgc2NhbGUsXG4gIHBkZk9yaWdpbmFsV0gsXG4gIGNvbnRhaW5lcldIXG4pID0+IHtcbiAgZm9yIChsZXQgaXRlbSBvZiB3aWRnZXRzKSB7XG4gICAgY29uc3QgY29udGFpbmVyU2NhbGUgPSBnZXRDb250YWluZXJTY2FsZShcbiAgICAgIHBkZk9yaWdpbmFsV0gsXG4gICAgICBpdGVtPy5wYWdlTnVtYmVyLFxuICAgICAgY29udGFpbmVyV0hcbiAgICApO1xuICAgIGNvbnN0IHR5cGVFeGlzdCA9IGl0ZW0ucG9zLnNvbWUoKGRhdGEpID0+IGRhdGE/LnR5cGUpO1xuICAgIGxldCB1cGRhdGVJdGVtO1xuXG4gICAgaWYgKHR5cGVFeGlzdCkge1xuICAgICAgaWYgKHNpZ255b3Vyc2VsZikge1xuICAgICAgICB1cGRhdGVJdGVtID0gaXRlbS5wb3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGVJdGVtID0gaXRlbS5wb3MuZmlsdGVyKFxuICAgICAgICAgIChkYXRhKSA9PiBkYXRhPy5vcHRpb25zPy5zdGF0dXMgPT09IFwicmVxdWlyZWRcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVJdGVtID0gaXRlbS5wb3M7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2VObyA9IGl0ZW0ucGFnZU51bWJlcjtcbiAgICBjb25zdCB3aWRnZXRzUG9zaXRpb25BcnIgPSB1cGRhdGVJdGVtO1xuICAgIGNvbnN0IHBhZ2VzID0gcGRmRG9jLmdldFBhZ2VzKCk7XG4gICAgY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKCk7XG4gICAgY29uc3QgcGFnZSA9IHBhZ2VzW3BhZ2VObyAtIDFdO1xuICAgIGNvbnN0IGltYWdlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgd2lkZ2V0c1Bvc2l0aW9uQXJyLm1hcChhc3luYyAodXJsKSA9PiB7XG4gICAgICAgIGxldCBzaWduVXJsID0gdXJsLlNpZ25VcmwgJiYgdXJsLlNpZ25Vcmw7XG4gICAgICAgIGlmIChzaWduVXJsKSB7XG4gICAgICAgICAgaWYgKHVybC5JbWFnZVR5cGUgPT09IFwiaW1hZ2UvcG5nXCIpIHtcbiAgICAgICAgICAgIC8vZnVuY3Rpb24gZm9yIGNvbnZlcnQgc2lnbmF0dXJlIHBuZyBiYXNlNjQgdXJsIHRvIGpwZWcgYmFzZTY0XG4gICAgICAgICAgICBjb25zdCBuZXdVcmwgPSBhd2FpdCBjb252ZXJ0UE5HdG9KUEVHKHNpZ25VcmwpO1xuICAgICAgICAgICAgc2lnblVybCA9IG5ld1VybDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goc2lnblVybCk7XG4gICAgICAgICAgcmV0dXJuIHJlcy5hcnJheUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB3aWRnZXRzUG9zaXRpb25BcnIuZm9yRWFjaChhc3luYyAocG9zaXRpb24sIGlkKSA9PiB7XG4gICAgICBsZXQgaW1nO1xuICAgICAgaWYgKFtcInNpZ25hdHVyZVwiLCBcInN0YW1wXCIsIFwiaW5pdGlhbHNcIiwgXCJpbWFnZVwiXS5pbmNsdWRlcyhwb3NpdGlvbi50eXBlKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHBvc2l0aW9uLkltYWdlVHlwZSAmJiBwb3NpdGlvbi5JbWFnZVR5cGUgPT09IFwiaW1hZ2UvcG5nXCIpIHx8XG4gICAgICAgICAgcG9zaXRpb24uSW1hZ2VUeXBlID09PSBcImltYWdlL2pwZWdcIlxuICAgICAgICApIHtcbiAgICAgICAgICBpbWcgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcoaW1hZ2VzW2lkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW1nID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKGltYWdlc1tpZF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFwb3NpdGlvbi50eXBlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAocG9zaXRpb24uSW1hZ2VUeXBlICYmIHBvc2l0aW9uLkltYWdlVHlwZSA9PT0gXCJpbWFnZS9wbmdcIikgfHxcbiAgICAgICAgICBwb3NpdGlvbi5JbWFnZVR5cGUgPT09IFwiaW1hZ2UvanBlZ1wiXG4gICAgICAgICkge1xuICAgICAgICAgIGltZyA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZyhpbWFnZXNbaWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbWcgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcoaW1hZ2VzW2lkXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCB3aWRnZXRXaWR0aCwgd2lkZ2V0SGVpZ2h0O1xuICAgICAgd2lkZ2V0V2lkdGggPSBwbGFjZWhvbGRlcldpZHRoKHBvc2l0aW9uKTtcbiAgICAgIHdpZGdldEhlaWdodCA9IHBsYWNlaG9sZGVySGVpZ2h0KHBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IHhQb3MgPSAocG9zaXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXplUG9zID0gcG9zaXRpb24ueFBvc2l0aW9uO1xuICAgICAgICAvL2ZpcnN0IHR3byBjb25kaXRpb24gaGFuZGxlIHRvIG9sZCBkYXRhIGFscmVhZHkgc2F2ZWQgZnJvbSBtb2JpbGUgdmlldyB3aGljaCBzY2FsZSBwb2ludCBkaWZmcmVudFxuICAgICAgICBpZiAoaXNNb2JpbGUgJiYgcG9zaXRpb24uaXNNb2JpbGUpIHtcbiAgICAgICAgICAvL2lmIHBvcy5pc01vYmlsZSBmYWxzZSAtLSBwbGFjZWhvbGRlciBzYXZlZCBmcm9tIGRlc2t0b3AgdmlldyB0aGVuIGhhbmRsZSBwb3NpdGlvbiBpbiBtb2JpbGUgdmlldyBkaXZpZGVkIGJ5IHNjYWxlXG4gICAgICAgICAgY29uc3QgeCA9IHJlc2l6ZVBvcyAqIChwb3NpdGlvbi5zY2FsZSAvIHNjYWxlKTtcbiAgICAgICAgICByZXR1cm4geCAqIHNjYWxlO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uLmlzTW9iaWxlICYmIHBvc2l0aW9uLnNjYWxlKSB7XG4gICAgICAgICAgY29uc3QgeCA9IHJlc2l6ZVBvcyAqIHBvc2l0aW9uLnNjYWxlO1xuICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXNpemVQb3M7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCB5UG9zID0gKHBvc2l0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZVBvcyA9IHBvc2l0aW9uLnlQb3NpdGlvbjtcblxuICAgICAgICBpZiAocG9zaXRpb24uaXNNb2JpbGUgJiYgcG9zaXRpb24uc2NhbGUpIHtcbiAgICAgICAgICBpZiAocG9zaXRpb24uSXNSZXNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IHkgPSByZXNpemVQb3MgKiBwb3NpdGlvbi5zY2FsZTtcbiAgICAgICAgICAgIHJldHVybiB5O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB5ID0gcmVzaXplUG9zICogcG9zaXRpb24uc2NhbGU7XG4gICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHdpZGdldFR5cGVFeGlzdCA9IFtcbiAgICAgICAgdGV4dFdpZGdldCxcbiAgICAgICAgdGV4dElucHV0V2lkZ2V0LFxuICAgICAgICBcIm5hbWVcIixcbiAgICAgICAgXCJjb21wYW55XCIsXG4gICAgICAgIFwiam9iIHRpdGxlXCIsXG4gICAgICAgIFwiZGF0ZVwiLFxuICAgICAgICBcImVtYWlsXCJcbiAgICAgIF0uaW5jbHVkZXMocG9zaXRpb24udHlwZSk7XG4gICAgICBpZiAocG9zaXRpb24udHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFwiSGVsdmV0aWNhXCIpO1xuICAgICAgICBsZXQgY2hlY2tib3hPcHRpb25HYXBGcm9tVG9wLCBpc0NoZWNrO1xuICAgICAgICBsZXQgeSA9IHlQb3MocG9zaXRpb24pO1xuICAgICAgICBjb25zdCBvcHRpb25zRm9udFNpemUgPSAxMztcbiAgICAgICAgY29uc3QgY2hlY2tib3hTaXplID0gMTg7XG4gICAgICAgIGNvbnN0IGNoZWNrYm94VGV4dEdhcEZyb21MZWZ0ID0gMjI7XG4gICAgICAgIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8udmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwb3NpdGlvbj8ub3B0aW9ucz8udmFsdWVzLmZvckVhY2goKGl0ZW0sIGluZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tib3hSYW5kb21JZCA9IFwiY2hlY2tib3hcIiArIHJhbmRvbUlkKCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlICYmXG4gICAgICAgICAgICAgIHBvc2l0aW9uPy5vcHRpb25zPy5yZXNwb25zZT8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlzQ2hlY2sgPSBwb3NpdGlvbj8ub3B0aW9ucz8ucmVzcG9uc2U/LmluY2x1ZGVzKGluZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgaXNDaGVjayA9IHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWU/LmluY2x1ZGVzKGluZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94ID0gZm9ybS5jcmVhdGVDaGVja0JveChjaGVja2JveFJhbmRvbUlkKTtcblxuICAgICAgICAgICAgaWYgKGluZCA+IDApIHtcbiAgICAgICAgICAgICAgeSA9IHkgKyBjaGVja2JveE9wdGlvbkdhcEZyb21Ub3A7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGVja2JveE9wdGlvbkdhcEZyb21Ub3AgPSAyNjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFwb3NpdGlvbj8ub3B0aW9ucz8uaXNIaWRlTGFiZWwpIHtcbiAgICAgICAgICAgICAgLy8gYmVsb3cgbGluZSBvZiBjb2RlIGlzIHVzZWQgdG8gZW1iZWQgbGFiZWwgd2l0aCByYWRpbyBidXR0b24gaW4gcGRmXG4gICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnNQb3NpdGlvbiA9IGNvbXBlbnNhdGVSb3RhdGlvbihcbiAgICAgICAgICAgICAgICBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGUsXG4gICAgICAgICAgICAgICAgeFBvcyhwb3NpdGlvbikgKyBjaGVja2JveFRleHRHYXBGcm9tTGVmdCxcbiAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgcGFnZS5nZXRTaXplKCksXG4gICAgICAgICAgICAgICAgb3B0aW9uc0ZvbnRTaXplLFxuICAgICAgICAgICAgICAgIHJnYigwLCAwLCAwKSxcbiAgICAgICAgICAgICAgICBmb250LFxuICAgICAgICAgICAgICAgIHBhZ2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcGFnZS5kcmF3VGV4dChpdGVtLCBvcHRpb25zUG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNoZWNrYm94T2JqID0ge1xuICAgICAgICAgICAgICB4OiB4UG9zKHBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgeTogeSxcbiAgICAgICAgICAgICAgd2lkdGg6IGNoZWNrYm94U2l6ZSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBjaGVja2JveFNpemVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjaGVja2JveE9iaiA9IGdldEltYWdlUG9zaXRpb24ocGFnZSwgY2hlY2tib3hPYmosIDEpO1xuICAgICAgICAgICAgY2hlY2tib3guYWRkVG9QYWdlKHBhZ2UsIGNoZWNrYm94T2JqKTtcblxuICAgICAgICAgICAgLy9hcHBsaWVkIHdoaWNoIGNoZWNrYm94IHNob3VsZCBiZSBjaGVja2VkXG4gICAgICAgICAgICBpZiAoaXNDaGVjaykge1xuICAgICAgICAgICAgICBjaGVja2JveC5jaGVjaygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2hlY2tib3gudW5jaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2tib3guZW5hYmxlUmVhZE9ubHkoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh3aWRnZXRUeXBlRXhpc3QpIHtcbiAgICAgICAgY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoXCJIZWx2ZXRpY2FcIik7XG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gY2FsY3VsYXRlRm9udFNpemUoXG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgY29udGFpbmVyU2NhbGUsXG4gICAgICAgICAgc2lnbnlvdXJzZWxmXG4gICAgICAgICk7XG4gICAgICAgIHBhcnNlSW50KGZvbnRTaXplKTtcblxuICAgICAgICBjb25zdCBjb2xvciA9IHBvc2l0aW9uPy5vcHRpb25zPy5mb250Q29sb3I7XG4gICAgICAgIGxldCB1cGRhdGVDb2xvckluUmdiO1xuICAgICAgICBpZiAoY29sb3IgPT09IFwicmVkXCIpIHtcbiAgICAgICAgICB1cGRhdGVDb2xvckluUmdiID0gcmdiKDEsIDAsIDApO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbG9yID09PSBcImJsYWNrXCIpIHtcbiAgICAgICAgICB1cGRhdGVDb2xvckluUmdiID0gcmdiKDAsIDAsIDApO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbG9yID09PSBcImJsdWVcIikge1xuICAgICAgICAgIHVwZGF0ZUNvbG9ySW5SZ2IgPSByZ2IoMCwgMCwgMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29sb3IgPT09IFwieWVsbG93XCIpIHtcbiAgICAgICAgICB1cGRhdGVDb2xvckluUmdiID0gcmdiKDAuOSwgMSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBkYXRlQ29sb3JJblJnYiA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdGV4dENvbnRlbnQ7XG4gICAgICAgIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8ucmVzcG9uc2UpIHtcbiAgICAgICAgICB0ZXh0Q29udGVudCA9IHBvc2l0aW9uLm9wdGlvbnM/LnJlc3BvbnNlO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICB0ZXh0Q29udGVudCA9IHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZml4ZWRXaWR0aCA9IHdpZGdldFdpZHRoOyAvLyBTZXQgeW91ciBmaXhlZCB3aWR0aFxuICAgICAgICBjb25zdCBpc05ld09uRW50ZXJMaW5lRXhpc3QgPSB0ZXh0Q29udGVudC5pbmNsdWRlcyhcIlxcblwiKTtcblxuICAgICAgICAvLyBGdW5jdGlvbiB0byBicmVhayB0ZXh0IGludG8gbGluZXMgYmFzZWQgb24gdGhlIGZpeGVkIHdpZHRoXG4gICAgICAgIGNvbnN0IE5ld2JyZWFrVGV4dEludG9MaW5lcyA9ICh0ZXh0Q29udGVudCwgd2lkdGgpID0+IHtcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgICAgICAgIGxldCBjdXJyZW50TGluZSA9IFwiXCI7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHdvcmQgb2YgdGV4dENvbnRlbnQuc3BsaXQoXCIgXCIpKSB7XG4gICAgICAgICAgICAvL2dldCB0ZXh0IGxpbmUgd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUoXG4gICAgICAgICAgICAgIGAke2N1cnJlbnRMaW5lfSAke3dvcmR9YCxcbiAgICAgICAgICAgICAgZm9udFNpemVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2NoZWNrIHRleHQgY29udGVudCBsaW5lIHdpZHRoIGlzIGxlc3Mgb3IgZXF1YWwgdG8gY29udGFpbmVyIHdpZHRoXG4gICAgICAgICAgICBpZiAobGluZVdpZHRoIDw9IHdpZHRoKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lICs9IGAgJHt3b3JkfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lLnRyaW0oKSk7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gYCR7d29yZH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lLnRyaW0oKSk7XG4gICAgICAgICAgcmV0dXJuIGxpbmVzO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEZ1bmN0aW9uIHRvIGJyZWFrIHRleHQgaW50byBsaW5lcyBiYXNlZCBvbiB3aGVuIHVzZXIgZ28gbmV4dCBsaW5lIG9uIHByZXNzIGVudGVyIGJ1dHRvblxuICAgICAgICBjb25zdCBicmVha1RleHRJbnRvTGluZXMgPSAodGV4dENvbnRlbnQsIHdpZHRoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGluZXMgPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiB0ZXh0Q29udGVudC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgICAgICAgY29uc3QgbGluZVdpZHRoID0gZm9udC53aWR0aE9mVGV4dEF0U2l6ZShgJHt3b3JkfWAsIGZvbnRTaXplKTtcbiAgICAgICAgICAgIC8vY2hlY2tpbmcgc3RyaW5nIGxlbmd0aCB0byBjb250YWluZXIgd2lkdGhcbiAgICAgICAgICAgIC8vaWYgc3RyaW5nIGxlbmd0aCBpcyBsZXNzIHRoZW4gY29udGFpbmVyIHdpZHRoIGl0IG1lYW5zIHVzZXIgcHJlc3MgZW50ZXIgYnV0dG9uXG4gICAgICAgICAgICBpZiAobGluZVdpZHRoIDw9IHdpZHRoKSB7XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2god29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2Vsc2UgYWRqdXN0IHRleHQgY29udGVudCBhY2NvcmRpbmcgdG8gd2lkdGggYW5kIHNlbmQgaXQgaW4gbmV3IGxpbmVcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBuZXdMaW5lID0gTmV3YnJlYWtUZXh0SW50b0xpbmVzKHdvcmQsIHdpZHRoKTtcbiAgICAgICAgICAgICAgbGluZXMucHVzaCguLi5uZXdMaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9jaGVjayBpZiB0ZXh0IGNvbnRlbnQgaGF2ZSBgXFxuYCBzdHJpbmcgaXQgbWVhbnMgdXNlciBwcmVzcyBlbnRlciB0byBnbyBuZXh0IGxpbmUgYW5kIGhhbmRsZSBjb25kaXRpb25cbiAgICAgICAgLy9lbHNlIGF1dG8gYWRqdXN0IHRleHQgY29udGVudCBhY2NvcmRpbmcgdG8gY29udGFpbmVyIHdpZHRoXG4gICAgICAgIGNvbnN0IGxpbmVzID0gaXNOZXdPbkVudGVyTGluZUV4aXN0XG4gICAgICAgICAgPyBicmVha1RleHRJbnRvTGluZXModGV4dENvbnRlbnQsIGZpeGVkV2lkdGgpXG4gICAgICAgICAgOiBOZXdicmVha1RleHRJbnRvTGluZXModGV4dENvbnRlbnQsIGZpeGVkV2lkdGgpO1xuICAgICAgICAvLyBTZXQgaW5pdGlhbCB5LWNvb3JkaW5hdGUgZm9yIHRoZSBmaXJzdCBsaW5lXG4gICAgICAgIGxldCB4ID0geFBvcyhwb3NpdGlvbik7XG4gICAgICAgIGxldCB5ID0geVBvcyhwb3NpdGlvbik7XG4gICAgICAgIC8vIEVtYmVkIGVhY2ggbGluZSBvbiB0aGUgcGFnZVxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0UG9zaXRpb24gPSBjb21wZW5zYXRlUm90YXRpb24oXG4gICAgICAgICAgICBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGUsXG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICBwYWdlLmdldFNpemUoKSxcbiAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgdXBkYXRlQ29sb3JJblJnYixcbiAgICAgICAgICAgIGZvbnQsXG4gICAgICAgICAgICBwYWdlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwYWdlLmRyYXdUZXh0KGxpbmUsIHRleHRQb3NpdGlvbik7XG4gICAgICAgICAgeSArPSAxODsgLy8gQWRqdXN0IHRoZSBsaW5lIGhlaWdodCBhcyBuZWVkZWRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbi50eXBlID09PSBcImRyb3Bkb3duXCIpIHtcbiAgICAgICAgY29uc3QgZHJvcGRvd25SYW5kb21JZCA9IFwiZHJvcGRvd25cIiArIHJhbmRvbUlkKCk7XG4gICAgICAgIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5jcmVhdGVEcm9wZG93bihkcm9wZG93blJhbmRvbUlkKTtcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9ucyhwb3NpdGlvbj8ub3B0aW9ucz8udmFsdWVzKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5yZXNwb25zZSkge1xuICAgICAgICAgIGRyb3Bkb3duLnNlbGVjdChwb3NpdGlvbi5vcHRpb25zPy5yZXNwb25zZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIGRyb3Bkb3duLnNlbGVjdChwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkcm9wZG93bk9iaiA9IHtcbiAgICAgICAgICB4OiB4UG9zKHBvc2l0aW9uKSxcbiAgICAgICAgICB5OiB5UG9zKHBvc2l0aW9uKSxcbiAgICAgICAgICB3aWR0aDogd2lkZ2V0V2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiB3aWRnZXRIZWlnaHRcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkcm9wZG93bk9wdGlvbiA9IGdldEltYWdlUG9zaXRpb24ocGFnZSwgZHJvcGRvd25PYmosIDEpO1xuICAgICAgICAvLyBwYWdlLmRyYXdJbWFnZShpbWcsIGltYWdlT3B0aW9ucyk7XG4gICAgICAgIGRyb3Bkb3duLmFkZFRvUGFnZShwYWdlLCBkcm9wZG93bk9wdGlvbik7XG4gICAgICAgIGRyb3Bkb3duLmVuYWJsZVJlYWRPbmx5KCk7XG4gICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0KSB7XG4gICAgICAgIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFwiSGVsdmV0aWNhXCIpO1xuICAgICAgICBjb25zdCByYWRpb1JhbmRvbUlkID0gXCJyYWRpb1wiICsgcmFuZG9tSWQoKTtcbiAgICAgICAgY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uY3JlYXRlUmFkaW9Hcm91cChyYWRpb1JhbmRvbUlkKTtcbiAgICAgICAgbGV0IHJhZGlvT3B0aW9uR2FwRnJvbVRvcDtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZvbnRTaXplID0gMTY7XG4gICAgICAgIGNvbnN0IHJhZGlvVGV4dEdhcEZyb21MZWZ0ID0gMjA7XG4gICAgICAgIGNvbnN0IHJhZGlvU2l6ZSA9IDE4O1xuICAgICAgICBsZXQgeSA9IHlQb3MocG9zaXRpb24pO1xuICAgICAgICBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcG9zaXRpb24/Lm9wdGlvbnM/LnZhbHVlcy5mb3JFYWNoKChpdGVtLCBpbmQpID0+IHtcbiAgICAgICAgICAgIGlmIChpbmQgPiAwKSB7XG4gICAgICAgICAgICAgIHkgPSB5ICsgcmFkaW9PcHRpb25HYXBGcm9tVG9wO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmFkaW9PcHRpb25HYXBGcm9tVG9wID0gMjU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBvc2l0aW9uPy5vcHRpb25zPy5pc0hpZGVMYWJlbCkge1xuICAgICAgICAgICAgICAvLyBiZWxvdyBsaW5lIG9mIGNvZGUgaXMgdXNlZCB0byBlbWJlZCBsYWJlbCB3aXRoIHJhZGlvIGJ1dHRvbiBpbiBwZGZcblxuICAgICAgICAgICAgICBjb25zdCBvcHRpb25zUG9zaXRpb24gPSBjb21wZW5zYXRlUm90YXRpb24oXG4gICAgICAgICAgICAgICAgcGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlLFxuICAgICAgICAgICAgICAgIHhQb3MocG9zaXRpb24pICsgcmFkaW9UZXh0R2FwRnJvbUxlZnQsXG4gICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgIHBhZ2UuZ2V0U2l6ZSgpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNGb250U2l6ZSxcbiAgICAgICAgICAgICAgICByZ2IoMCwgMCwgMCksXG4gICAgICAgICAgICAgICAgZm9udCxcbiAgICAgICAgICAgICAgICBwYWdlXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgcGFnZS5kcmF3VGV4dChpdGVtLCBvcHRpb25zUG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJhZGlvT2JqID0ge1xuICAgICAgICAgICAgICB4OiB4UG9zKHBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgeTogeSxcbiAgICAgICAgICAgICAgd2lkdGg6IHJhZGlvU2l6ZSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiByYWRpb1NpemVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJhZGlvT2JqID0gZ2V0SW1hZ2VQb3NpdGlvbihwYWdlLCByYWRpb09iaiwgMSk7XG4gICAgICAgICAgICByYWRpb0dyb3VwLmFkZE9wdGlvblRvUGFnZShpdGVtLCBwYWdlLCByYWRpb09iaik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5yZXNwb25zZSkge1xuICAgICAgICAgIHJhZGlvR3JvdXAuc2VsZWN0KHBvc2l0aW9uLm9wdGlvbnM/LnJlc3BvbnNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgcmFkaW9Hcm91cC5zZWxlY3QocG9zaXRpb24/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmFkaW9Hcm91cC5lbmFibGVSZWFkT25seSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0ge1xuICAgICAgICAgIHg6IHhQb3MocG9zaXRpb24pLFxuICAgICAgICAgIHk6IHlQb3MocG9zaXRpb24pLFxuICAgICAgICAgIHdpZHRoOiB3aWRnZXRXaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHdpZGdldEhlaWdodFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGltYWdlT3B0aW9ucyA9IGdldEltYWdlUG9zaXRpb24ocGFnZSwgc2lnbmF0dXJlLCAxKTtcbiAgICAgICAgcGFnZS5kcmF3SW1hZ2UoaW1nLCBpbWFnZU9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBkZkJ5dGVzID0gYXdhaXQgcGRmRG9jLnNhdmVBc0Jhc2U2NCh7IHVzZU9iamVjdFN0cmVhbXM6IGZhbHNlIH0pO1xuICAvL2NvbnNvbGUubG9nKFwicGRmXCIsIHBkZkJ5dGVzKTtcbiAgcmV0dXJuIHBkZkJ5dGVzO1xufTtcblxuLy8gZnVuY3Rpb24gZm9yIHZhbGlkYXRpbmcgVVJMc1xuZXhwb3J0IGZ1bmN0aW9uIHVybFZhbGlkYXRvcih1cmwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBuZXdVcmwgPSBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIG5ld1VybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IG5ld1VybC5wcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vL2NhbGN1bGF0ZSBwbGFjZWhvbGRlciB3aWR0aCB0byBlbWJlZCBpbiBwZGZcbmV4cG9ydCBjb25zdCBwbGFjZWhvbGRlcldpZHRoID0gKHBvcykgPT4ge1xuICBjb25zdCBkZWZhdWx0V2lkdGggPSBkZWZhdWx0V2lkdGhIZWlnaHQocG9zLnR5cGUpLndpZHRoO1xuICBjb25zdCBwb3NXaWR0aCA9IHBvcy5XaWR0aCB8fCBkZWZhdWx0V2lkdGg7XG5cbiAgLy9jb25kaXRpb24gdG8gaGFuZGxlIG9sZCBkYXRhIHNhdmVkIGZyb20gbW9iaWxlIHZpZXcgdG8gZ2V0IHdpZHRoaFxuICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xuICAgIGlmIChwb3MuSXNSZXNpemUpIHtcbiAgICAgIHJldHVybiBwb3NXaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBvc1dpZHRoICogcG9zLnNjYWxlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcG9zV2lkdGg7XG4gIH1cbn07XG5cbi8vY2FsY3VsYXRlIHBsYWNlaG9sZGVyIGhlaWdodCB0byBlbWJlZCBpbiBwZGZcbmV4cG9ydCBjb25zdCBwbGFjZWhvbGRlckhlaWdodCA9IChwb3MpID0+IHtcbiAgY29uc3QgcG9zSGVpZ2h0ID0gcG9zLkhlaWdodDtcbiAgY29uc3QgZGVmYXVsdEhlaWdodCA9IGRlZmF1bHRXaWR0aEhlaWdodChwb3MudHlwZSkuaGVpZ2h0O1xuICBjb25zdCBwb3NVcGRhdGVIZWlnaHQgPSBwb3NIZWlnaHQgfHwgZGVmYXVsdEhlaWdodDtcblxuICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgb2xkIGRhdGEgc2F2ZWQgZnJvbSBtb2JpbGUgdmlldyB0byBnZXQgaGVpZ2h0XG4gIGlmIChwb3MuaXNNb2JpbGUgJiYgcG9zLnNjYWxlKSB7XG4gICAgaWYgKHBvcy5Jc1Jlc2l6ZSkge1xuICAgICAgcmV0dXJuIHBvc1VwZGF0ZUhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBvc1VwZGF0ZUhlaWdodCAqIHBvcy5zY2FsZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBvc1VwZGF0ZUhlaWdodDtcbiAgfVxufTtcblxuLy9mdW5jdGlvbiBmb3IgZ2V0dGluZyBjb250cmFjdHNfY29udGFjdGJvb2sgZGV0YWlsc1xuZXhwb3J0IGNvbnN0IGNvbnRhY3RCb29rID0gYXN5bmMgKG9iamVjdElkKSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF4aW9zXG4gICAgLmdldChcbiAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgICBcImJhc2VVcmxcIlxuICAgICAgKX1jbGFzc2VzL2NvbnRyYWN0c19Db250YWN0Ym9vaz93aGVyZT17XCJvYmplY3RJZFwiOlwiJHtvYmplY3RJZH1cIn1gLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgICBcIlgtUGFyc2UtU2Vzc2lvbi1Ub2tlblwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG4gICAgLnRoZW4oKExpc3RkYXRhKSA9PiB7XG4gICAgICBjb25zdCBqc29uID0gTGlzdGRhdGEuZGF0YTtcbiAgICAgIGNvbnN0IHJlcyA9IGpzb24ucmVzdWx0cztcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSlcblxuICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcIkVyciBpbiBjb250cmFjdHNfQ29udGFjdGJvb2sgY2xhc3MgXCIsIGVycik7XG4gICAgICByZXR1cm4gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCI7XG4gICAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vL2Z1bmN0aW9uIGZvciBnZXR0aW5nIGRvY3VtZW50IGRldGFpbHMgZnJvbSBjb250cmFjdF9Eb2N1bWVudHMgY2xhc3NcbmV4cG9ydCBjb25zdCBjb250cmFjdERvY3VtZW50ID0gYXN5bmMgKGRvY3VtZW50SWQpID0+IHtcbiAgY29uc3QgZGF0YSA9IHtcbiAgICBkb2NJZDogZG9jdW1lbnRJZFxuICB9O1xuICBjb25zdCBkb2N1bWVudERlYXRpbHMgPSBhd2FpdCBheGlvc1xuICAgIC5wb3N0KGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvZ2V0RG9jdW1lbnRgLCBkYXRhLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxuICAgICAgICBzZXNzaW9uVG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKChMaXN0ZGF0YSkgPT4ge1xuICAgICAgY29uc3QganNvbiA9IExpc3RkYXRhLmRhdGE7XG4gICAgICBsZXQgZGF0YSA9IFtdO1xuICAgICAgaWYgKGpzb24gJiYganNvbi5yZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICB9IGVsc2UgaWYgKGpzb24gJiYganNvbi5yZXN1bHQpIHtcbiAgICAgICAgZGF0YS5wdXNoKGpzb24ucmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJFcnIgaW4gZ2V0RG9jdW1lbnQgY2xvdWQgZnVuY3Rpb24gXCIsIGVycik7XG4gICAgICByZXR1cm4gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCI7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGRvY3VtZW50RGVhdGlscztcbn07XG5cbi8vZnVuY3Rpb24gZm9yIGFkZCBkZWZhdWx0IHNpZ25hdHVyZSBvciBpbWFnZSBmb3IgYWxsIHJlcXVlc3RlZCBsb2NhdGlvblxuZXhwb3J0IGNvbnN0IGFkZERlZmF1bHRTaWduYXR1cmVJbWcgPSAoeHlQb3N0aW9uLCBkZWZhdWx0U2lnbkltZykgPT4ge1xuICBsZXQgaW1nV0ggPSB7IHdpZHRoOiBcIlwiLCBoZWlnaHQ6IFwiXCIgfTtcbiAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gIGltZy5zcmMgPSBkZWZhdWx0U2lnbkltZztcbiAgaWYgKGltZy5jb21wbGV0ZSkge1xuICAgIGltZ1dIID0ge1xuICAgICAgd2lkdGg6IGltZy53aWR0aCxcbiAgICAgIGhlaWdodDogaW1nLmhlaWdodFxuICAgIH07XG4gIH1cblxuICBsZXQgeHlEZWZhdWx0UG9zID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeHlQb3N0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGdldElNR1dIO1xuICAgIGNvbnN0IGdldFhZZGF0YSA9IHh5UG9zdGlvbltpXS5wb3M7XG4gICAgY29uc3QgZ2V0UGFnZU5vID0geHlQb3N0aW9uW2ldLnBhZ2VOdW1iZXI7XG4gICAgY29uc3QgZ2V0UG9zRGF0YSA9IGdldFhZZGF0YTtcblxuICAgIGNvbnN0IGFkZFNpZ24gPSBnZXRQb3NEYXRhLm1hcCgocG9zaXRpb24pID0+IHtcbiAgICAgIGdldElNR1dIID0gY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8oaW1nV0gsIHBvc2l0aW9uKTtcbiAgICAgIGlmIChwb3NpdGlvbi50eXBlKSB7XG4gICAgICAgIGlmIChwb3NpdGlvbj8udHlwZSA9PT0gXCJzaWduYXR1cmVcIikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgICAgIFNpZ25Vcmw6IGRlZmF1bHRTaWduSW1nLFxuICAgICAgICAgICAgV2lkdGg6IGdldElNR1dILm5ld1dpZHRoLFxuICAgICAgICAgICAgSGVpZ2h0OiBnZXRJTUdXSC5uZXdIZWlnaHQsXG4gICAgICAgICAgICBJbWFnZVR5cGU6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAuLi5wb3NpdGlvbi5vcHRpb25zLFxuICAgICAgICAgICAgICByZXNwb25zZTogZGVmYXVsdFNpZ25JbWdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uICYmICFwb3NpdGlvbi5pc1N0YW1wKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgICAgU2lnblVybDogZGVmYXVsdFNpZ25JbWcsXG4gICAgICAgICAgV2lkdGg6IGdldElNR1dILm5ld1dpZHRoLFxuICAgICAgICAgIEhlaWdodDogZ2V0SU1HV0gubmV3SGVpZ2h0LFxuICAgICAgICAgIEltYWdlVHlwZTogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcbiAgICAgICAgICAgIHJlc3BvbnNlOiBkZWZhdWx0U2lnbkltZ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9KTtcblxuICAgIGNvbnN0IG5ld1h5cG9zID0ge1xuICAgICAgcGFnZU51bWJlcjogZ2V0UGFnZU5vLFxuICAgICAgcG9zOiBhZGRTaWduXG4gICAgfTtcbiAgICB4eURlZmF1bHRQb3MucHVzaChuZXdYeXBvcyk7XG4gIH1cbiAgcmV0dXJuIHh5RGVmYXVsdFBvcztcbn07XG5cbi8vZnVuY3Rpb24gZm9yIGNyZWF0ZSBsaXN0IG9mIHllYXIgZm9yIGRhdGUgd2lkZ2V0XG5leHBvcnQgY29uc3QgcmFuZ2UgPSAoc3RhcnQsIGVuZCwgc3RlcCkgPT4ge1xuICBjb25zdCByYW5nZSA9IFtdO1xuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpICs9IHN0ZXApIHtcbiAgICByYW5nZS5wdXNoKGkpO1xuICB9XG4gIHJldHVybiByYW5nZTtcbn07XG4vL2Z1bmN0aW9uIGZvciBnZXQgbW9udGhcbmV4cG9ydCBjb25zdCBnZXRNb250aCA9IChkYXRlKSA9PiB7XG4gIGNvbnN0IG5ld01vbnRoID0gbmV3IERhdGUoZGF0ZSkuZ2V0TW9udGgoKTtcbiAgcmV0dXJuIG5ld01vbnRoO1xufTtcblxuLy9mdW5jdGlvbiBmb3IgZ2V0IHllYXJcbmV4cG9ydCBjb25zdCBnZXRZZWFyID0gKGRhdGUpID0+IHtcbiAgY29uc3QgbmV3WWVhciA9IG5ldyBEYXRlKGRhdGUpLmdldEZ1bGxZZWFyKCk7XG4gIHJldHVybiBuZXdZZWFyO1xufTtcblxuLy9mdW5jdGlvbiB0byBjcmVhdGUvY29weSB3aWRnZXQgbmV4dCB0byBhbHJlYWR5IGRyb3BwZWQgd2lkZ2V0XG5leHBvcnQgY29uc3QgaGFuZGxlQ29weU5leHRUb1dpZGdldCA9IChcbiAgcG9zaXRpb24sXG4gIHdpZGdldFR5cGUsXG4gIHh5UG9zdGlvbixcbiAgaW5kZXgsXG4gIHNldFh5UG9zdGlvbixcbiAgdXNlcklkXG4pID0+IHtcbiAgY29uc3QgaXNTaWduZXJzID0geHlQb3N0aW9uLnNvbWUoKGRhdGEpID0+IGRhdGEuc2lnbmVyUHRyKTtcbiAgbGV0IGZpbHRlclNpZ25lclBvcztcbiAgLy9nZXQgcG9zaXRpb24gb2YgcHJldmlvdXMgd2lkZ2V0IGFuZCBjcmVhdGUgbmV3IHdpZGdldCBuZXh0IHRvIHRoYXQgd2lkZ2V0IG9uIHNhbWUgZGF0YSBleGNlcHRcbiAgLy8geFBvc2l0aW9uIGFuZCBrZXlcbiAgbGV0IG5ld3BvcyA9IHBvc2l0aW9uO1xuICBjb25zdCBjYWxjdWxhdGVYUG9zaXRpb24gPVxuICAgIHBhcnNlSW50KHBvc2l0aW9uLnhQb3NpdGlvbikgK1xuICAgIGRlZmF1bHRXaWR0aEhlaWdodCh3aWRnZXRUeXBlKS53aWR0aCArXG4gICAgcmVzaXplQm9yZGVyRXh0cmFXaWR0aCgpO1xuICBjb25zdCBuZXdJZCA9IHJhbmRvbUlkKCk7XG4gIG5ld3BvcyA9IHsgLi4ubmV3cG9zLCB4UG9zaXRpb246IGNhbGN1bGF0ZVhQb3NpdGlvbiwga2V5OiBuZXdJZCB9O1xuICAvL2lmIGNvbmRpdGlvbiB0byBjcmVhdGUgd2lkZ2V0IGluIHJlcXVlc3Qtc2lnbiBmbG93XG4gIGlmIChpc1NpZ25lcnMpIHtcbiAgICBpZiAodXNlcklkKSB7XG4gICAgICBmaWx0ZXJTaWduZXJQb3MgPSB4eVBvc3Rpb24uZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSB1c2VySWQpO1xuICAgIH1cbiAgICBjb25zdCBnZXRQbGFjZUhvbGRlciA9IGZpbHRlclNpZ25lclBvc1swXT8ucGxhY2VIb2xkZXI7XG4gICAgY29uc3QgZ2V0UGFnZU51bWVyID0gZ2V0UGxhY2VIb2xkZXIuZmlsdGVyKFxuICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gaW5kZXhcbiAgICApO1xuICAgIGNvbnN0IGdldFhZZGF0YSA9IGdldFBhZ2VOdW1lclswXS5wb3M7XG4gICAgZ2V0WFlkYXRhLnB1c2gobmV3cG9zKTtcbiAgICBpZiAoZ2V0UGFnZU51bWVyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25Qb3MgPSBnZXRQbGFjZUhvbGRlci5tYXAoKG9iaikgPT4ge1xuICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IGluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IGdldFhZZGF0YSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmV3VXBkYXRlU2lnbmVyID0geHlQb3N0aW9uLm1hcCgob2JqKSA9PiB7XG4gICAgICAgIGlmIChvYmouSWQgPT09IHVzZXJJZCkge1xuICAgICAgICAgIHJldHVybiB7IC4uLm9iaiwgcGxhY2VIb2xkZXI6IG5ld1VwZGF0ZVNpZ25Qb3MgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSk7XG5cbiAgICAgIHNldFh5UG9zdGlvbihuZXdVcGRhdGVTaWduZXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBlbHNlIGNvbmRpdGlvbiB0byBjcmVhdGUgd2lkZ2V0IGluIHNpZ24teW91cnNlbGYgZmxvd1xuICAgIGxldCBnZXRYWWRhdGEgPSB4eVBvc3Rpb25baW5kZXhdLnBvcztcbiAgICBnZXRYWWRhdGEucHVzaChuZXdwb3MpO1xuICAgIGNvbnN0IHVwZGF0ZVBsYWNlaG9sZGVyID0geHlQb3N0aW9uLm1hcCgob2JqLCBpbmQpID0+IHtcbiAgICAgIGlmIChpbmQgPT09IGluZGV4KSB7XG4gICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiBnZXRYWWRhdGEgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSk7XG5cbiAgICBzZXRYeVBvc3Rpb24odXBkYXRlUGxhY2Vob2xkZXIpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsZU5hbWUgPSAoZmlsZVVybCkgPT4ge1xuICBpZiAoZmlsZVVybCkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoZmlsZVVybCk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSB1cmwucGF0aG5hbWUuc3Vic3RyaW5nKHVybC5wYXRobmFtZS5pbmRleE9mKFwiX1wiKSArIDEpO1xuICAgIHJldHVybiBmaWxlbmFtZSB8fCBcIlwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG59O1xuXG4vL2ZldGNoIHRlbmFudCBhcHAgbG9nbyBmcm9tIGBwYXJ0bmVyc19UZW5hbnRgIGNsYXNzIGJ5IGRvbWFpbiBuYW1lXG5leHBvcnQgY29uc3QgZ2V0QXBwTG9nbyA9IGFzeW5jICgpID0+IHtcbiAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ob3N0ID09PSBcImFwcC5vcGVuc2lnbmxhYnMuY29tXCIpIHtcbiAgICByZXR1cm4geyBsb2dvOiBhcHBJbmZvLmFwcGxvZ28sIHVzZXI6IFwiZXhpc3RcIiB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRvbWFpbiA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCBQYXJzZS5DbG91ZC5ydW4oXCJnZXRsb2dvYnlkb21haW5cIiwge1xuICAgICAgICBkb21haW46IGRvbWFpblxuICAgICAgfSk7XG4gICAgICBpZiAodGVuYW50KSB7XG4gICAgICAgIHJldHVybiB7IGxvZ286IHRlbmFudD8ubG9nbywgdXNlcjogdGVuYW50Py51c2VyIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImVyciBpbiBnZXRsb2dvIFwiLCBlcnIpO1xuICAgICAgcmV0dXJuIHsgbG9nbzogYXBwSW5mby5hcHBsb2dvLCB1c2VyOiBcImV4aXN0XCIgfTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZW5hbnREZXRhaWxzID0gYXN5bmMgKG9iamVjdElkKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdGVuYW50Q3JlZGl0c1F1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwicGFydG5lcnNfVGVuYW50XCIpO1xuICAgIHRlbmFudENyZWRpdHNRdWVyeS5lcXVhbFRvKFwiVXNlcklkXCIsIHtcbiAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXG4gICAgICBjbGFzc05hbWU6IFwiX1VzZXJcIixcbiAgICAgIG9iamVjdElkOiBvYmplY3RJZFxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRlbmFudENyZWRpdHNRdWVyeS5maXJzdCgpO1xuICAgIGlmIChyZXMpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZVJlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVzO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBcInVzZXIgZG9lcyBub3QgZXhpc3QhXCI7XG4gIH1cbn07XG5cbi8vZnVuY3Rpb24gdG8gY29udmVydCB2YXJpYWJsZSBzdHJpbmcgbmFtZSB0byB2YXJpYWJsZSB2YWx1ZSBvZiBlbWFpbCBib2R5IGFuZCBzdWJqZWN0XG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZU1haWxWYXJpYmxlcyhzdWJqZWN0LCBib2R5LCB2YXJpYWJsZXMpIHtcbiAgbGV0IHJlcGxhY2VkU3ViamVjdCA9IHN1YmplY3Q7XG4gIGxldCByZXBsYWNlZEJvZHkgPSBib2R5O1xuXG4gIGZvciAoY29uc3QgdmFyaWFibGUgaW4gdmFyaWFibGVzKSB7XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGB7eyR7dmFyaWFibGV9fX1gLCBcImdcIik7XG4gICAgaWYgKHN1YmplY3QpIHtcbiAgICAgIHJlcGxhY2VkU3ViamVjdCA9IHJlcGxhY2VkU3ViamVjdC5yZXBsYWNlKHJlZ2V4LCB2YXJpYWJsZXNbdmFyaWFibGVdKTtcbiAgICB9XG4gICAgaWYgKGJvZHkpIHtcbiAgICAgIHJlcGxhY2VkQm9keSA9IHJlcGxhY2VkQm9keS5yZXBsYWNlKHJlZ2V4LCB2YXJpYWJsZXNbdmFyaWFibGVdKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgc3ViamVjdDogcmVwbGFjZWRTdWJqZWN0LFxuICAgIGJvZHk6IHJlcGxhY2VkQm9keVxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgY29weXRvRGF0YSA9ICh0ZXh0KSA9PiB7XG4gIC8vIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpO1xuICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCkge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpO1xuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgbmF2aWdhdG9yLmNsaXBib2FyZFxuICAgIGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgIHRleHRBcmVhLnZhbHVlID0gdGV4dDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRBcmVhKTtcbiAgICB0ZXh0QXJlYS5zZWxlY3QoKTtcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXh0QXJlYSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0UGRmQXJyYXlCdWZmZXIgPSBhc3luYyAodXJsKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIC8vIENoZWNrIGlmIHRoZSByZXNwb25zZSB3YXMgc3VjY2Vzc2Z1bCAoc3RhdHVzIDIwMClcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICByZXR1cm4gXCJFcnJvclwiO1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IHRoZSByZXNwb25zZSB0byBBcnJheUJ1ZmZlclxuICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICByZXR1cm4gYXJyYXlCdWZmZXI7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIGRhdGE6XCIsIGVycm9yKTtcbiAgICByZXR1cm4gXCJFcnJvclwiO1xuICB9XG59O1xuLy9gaGFuZGxlU2VuZE9UUGAgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIG90cCBvbiB1c2VyJ3MgZW1haWwgdXNpbmcgYFNlbmRPVFBNYWlsVjFgIGNsb3VkIGZ1bmN0aW9uXG5leHBvcnQgY29uc3QgaGFuZGxlU2VuZE9UUCA9IGFzeW5jIChlbWFpbCkgPT4ge1xuICB0cnkge1xuICAgIGxldCB1cmwgPSBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL1NlbmRPVFBNYWlsVjFgO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIilcbiAgICB9O1xuICAgIGNvbnN0IGJvZHkgPSB7IGVtYWlsOiBlbWFpbCB9O1xuICAgIGF3YWl0IGF4aW9zLnBvc3QodXJsLCBib2R5LCB7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYWxlcnQoZXJyb3IubWVzc2FnZSk7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgZmV0Y2hVcmwgPSBhc3luYyAodXJsLCBwZGZOYW1lKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGFsZXJ0KFwic29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCIpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rXCIpO1xuICAgIH1cbiAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzcG9uc2UuYmxvYigpO1xuICAgIHNhdmVBcyhibG9iLCBgJHtzYW5pdGl6ZUZpbGVOYW1lKHBkZk5hbWUpfV9zaWduZWRfYnlfT3BlblNpZ27ihKIucGRmYCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYWxlcnQoXCJzb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIik7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGRvd25sb2FkaW5nIHRoZSBmaWxlOlwiLCBlcnJvcik7XG4gIH1cbn07XG4vL2hhbmRsZSBkb3dubG9hZCBzaWduZWQgcGRmXG5leHBvcnQgY29uc3QgaGFuZGxlRG93bmxvYWRQZGYgPSBhc3luYyAoXG4gIHBkZkRldGFpbHMsXG4gIHBkZlVybCxcbiAgc2V0SXNEb3dubG9hZGluZ1xuKSA9PiB7XG4gIGNvbnN0IHBkZk5hbWUgPSBwZGZEZXRhaWxzWzBdICYmIHBkZkRldGFpbHNbMF0uTmFtZTtcbiAgc2V0SXNEb3dubG9hZGluZyhcInBkZlwiKTtcbiAgdHJ5IHtcbiAgICAvLyBjb25zdCB1cmwgPSBhd2FpdCBQYXJzZS5DbG91ZC5ydW4oXCJnZXRzaWduZWR1cmxcIiwgeyB1cmw6IHBkZlVybCB9KTtcbiAgICBjb25zdCBheGlvc1JlcyA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9L2Z1bmN0aW9ucy9nZXRzaWduZWR1cmxgLFxuICAgICAgeyB1cmw6IHBkZlVybCB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJBcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgICBcIlgtUGFyc2UtU2Vzc2lvbi1Ub2tlblwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICAgIGNvbnN0IHVybCA9IGF4aW9zUmVzLmRhdGEucmVzdWx0O1xuICAgIGF3YWl0IGZldGNoVXJsKHVybCwgcGRmTmFtZSk7XG4gICAgc2V0SXNEb3dubG9hZGluZyhcIlwiKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coXCJlcnIgaW4gZ2V0c2lnbmVkdXJsXCIsIGVycik7XG4gICAgc2V0SXNEb3dubG9hZGluZyhcIlwiKTtcbiAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNhbml0aXplRmlsZU5hbWUgPSAocGRmTmFtZSkgPT4ge1xuICAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIHVuZGVyc2NvcmVcbiAgcmV0dXJuIHBkZk5hbWUucmVwbGFjZSgvIC9nLCBcIl9cIik7XG59O1xuLy9mdW5jdGlvbiBmb3IgcHJpbnQgZGlnaXRhbCBzaWduIHBkZlxuZXhwb3J0IGNvbnN0IGhhbmRsZVRvUHJpbnQgPSBhc3luYyAoZXZlbnQsIHBkZlVybCwgc2V0SXNEb3dubG9hZGluZykgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBzZXRJc0Rvd25sb2FkaW5nKFwicGRmXCIpO1xuICB0cnkge1xuICAgIC8vIGNvbnN0IHVybCA9IGF3YWl0IFBhcnNlLkNsb3VkLnJ1bihcImdldHNpZ25lZHVybFwiLCB7IHVybDogcGRmVXJsIH0pO1xuICAgIC8vYGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKWAgaXMgYWxzbyB1c2UgaW4gcHVibGljLXByb2ZpbGUgZmxvdyBmb3IgcHVibGljLXNpZ25cbiAgICAvL2lmIHdlIGdpdmUgdGhpcyBgYXBwSW5mby5iYXNlVXJsYCBhcyBhIGJhc2UgdXJsIHRoZW4gaW4gcHVibGljLXByb2ZpbGUgaXQgd2lsbCBjcmVhdGUgYmFzZSB1cmwgb2YgaXQncyB3aW5kb3cubG9jYXRpb24ub3JpZ2luIGV4LSBvcGVuc2lnbi5tZSB3aGljaCBpcyBub3QgYmFzZSB1cmxcbiAgICBjb25zdCBheGlvc1JlcyA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9L2Z1bmN0aW9ucy9nZXRzaWduZWR1cmxgLFxuICAgICAgeyB1cmw6IHBkZlVybCB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJBcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgICBcIlgtUGFyc2UtU2Vzc2lvbi1Ub2tlblwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICAgIGNvbnN0IHVybCA9IGF4aW9zUmVzLmRhdGEucmVzdWx0O1xuICAgIGNvbnN0IHBkZiA9IGF3YWl0IGdldEJhc2U2NEZyb21VcmwodXJsKTtcbiAgICBjb25zdCBpc0FuZHJvaWREZXZpY2UgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpO1xuICAgIGNvbnN0IGlzQXBwbGVEZXZpY2UgPVxuICAgICAgKC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgfHxcbiAgICAgICAgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gXCJNYWNJbnRlbFwiICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDEpKSAmJlxuICAgICAgIXdpbmRvdy5NU1N0cmVhbTtcbiAgICBpZiAoaXNBbmRyb2lkRGV2aWNlIHx8IGlzQXBwbGVEZXZpY2UpIHtcbiAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgYXRvYihwZGYpXG4gICAgICAgICAgLnNwbGl0KFwiXCIpXG4gICAgICAgICAgLm1hcCgoY2hhcikgPT4gY2hhci5jaGFyQ29kZUF0KDApKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnl0ZUFycmF5XSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3BkZlwiIH0pO1xuICAgICAgY29uc3QgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICB3aW5kb3cub3BlbihibG9iVXJsLCBcIl9ibGFua1wiKTtcbiAgICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByaW50TW9kdWxlKHsgcHJpbnRhYmxlOiBwZGYsIHR5cGU6IFwicGRmXCIsIGJhc2U2NDogdHJ1ZSB9KTtcbiAgICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGdldHNpZ25lZHVybFwiLCBlcnIpO1xuICAgIGFsZXJ0KFwic29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCIpO1xuICB9XG59O1xuXG4vL2hhbmRsZSBkb3dubG9hZCBzaWduZWQgcGRmXG5leHBvcnQgY29uc3QgaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZSA9IGFzeW5jIChcbiAgcGRmRGV0YWlscyxcbiAgc2V0SXNEb3dubG9hZGluZ1xuKSA9PiB7XG4gIGlmIChwZGZEZXRhaWxzPy5sZW5ndGggPiAwICYmIHBkZkRldGFpbHNbMF0/LkNlcnRpZmljYXRlVXJsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZldGNoKHBkZkRldGFpbHNbMF0gJiYgcGRmRGV0YWlsc1swXT8uQ2VydGlmaWNhdGVVcmwpO1xuICAgICAgY29uc3QgY2VydGlmaWNhdGVVcmwgPSBwZGZEZXRhaWxzWzBdICYmIHBkZkRldGFpbHNbMF0/LkNlcnRpZmljYXRlVXJsO1xuICAgICAgc2F2ZUFzKGNlcnRpZmljYXRlVXJsLCBgQ2VydGlmaWNhdGVfc2lnbmVkX2J5X09wZW5TaWdu4oSiLnBkZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gZG93bmxvYWQgaW4gY2VydGlmaWNhdGVcIiwgZXJyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2V0SXNEb3dubG9hZGluZyhcImNlcnRpZmljYXRlXCIpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBkb2NJZDogcGRmRGV0YWlsc1swXT8ub2JqZWN0SWRcbiAgICAgIH07XG4gICAgICBjb25zdCBkb2NEZXRhaWxzID0gYXdhaXQgYXhpb3MucG9zdChcbiAgICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfWZ1bmN0aW9ucy9nZXREb2N1bWVudGAsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICAgICAgICBzZXNzaW9uVG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAoZG9jRGV0YWlscy5kYXRhICYmIGRvY0RldGFpbHMuZGF0YS5yZXN1bHQpIHtcbiAgICAgICAgY29uc3QgZG9jID0gZG9jRGV0YWlscy5kYXRhLnJlc3VsdDtcbiAgICAgICAgaWYgKGRvYz8uQ2VydGlmaWNhdGVVcmwpIHtcbiAgICAgICAgICBhd2FpdCBmZXRjaChkb2M/LkNlcnRpZmljYXRlVXJsKTtcbiAgICAgICAgICBjb25zdCBjZXJ0aWZpY2F0ZVVybCA9IGRvYz8uQ2VydGlmaWNhdGVVcmw7XG4gICAgICAgICAgc2F2ZUFzKGNlcnRpZmljYXRlVXJsLCBgQ2VydGlmaWNhdGVfc2lnbmVkX2J5X09wZW5TaWdu4oSiLnBkZmApO1xuICAgICAgICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0SXNEb3dubG9hZGluZyhcImNlcnRpZmljYXRlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImVyciBpbiBkb3dubG9hZCBpbiBjZXJ0aWZpY2F0ZVwiLCBlcnIpO1xuICAgICAgYWxlcnQoXCJzb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIik7XG4gICAgfVxuICB9XG59O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRDb250YWN0KHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBQYXJzZS5Vc2VyLmN1cnJlbnQoKTtcbiAgICBjb25zdCBjb250YWN0Ym9vayA9IG5ldyBQYXJzZS5RdWVyeShcImNvbnRyYWN0c19Db250YWN0Ym9va1wiKTtcbiAgICBjb250YWN0Ym9vay5lcXVhbFRvKFxuICAgICAgXCJDcmVhdGVkQnlcIixcbiAgICAgIFBhcnNlLlVzZXIuY3JlYXRlV2l0aG91dERhdGEoY3VycmVudFVzZXIuaWQpXG4gICAgKTtcbiAgICBjb250YWN0Ym9vay5ub3RFcXVhbFRvKFwiSXNEZWxldGVkXCIsIHRydWUpO1xuICAgIGNvbnRhY3Rib29rLm1hdGNoZXMoXCJFbWFpbFwiLCBuZXcgUmVnRXhwKHZhbHVlLCBcImlcIikpO1xuXG4gICAgY29uc3QgY29udGFjdFJlcyA9IGF3YWl0IGNvbnRhY3Rib29rLmZpbmQoKTtcbiAgICBpZiAoY29udGFjdFJlcykge1xuICAgICAgY29uc3QgcmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb250YWN0UmVzKSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgc3VnZ2VzdGlvbnM6XCIsIGVycm9yKTtcbiAgfVxufVxuLy8gYGNvbXBlbnNhdGVSb3RhdGlvbmAgaXMgdXNlZCB0byBjYWxjdWxhdGUgeCBhbmQgeSBwb3NpdGlvbiBvZiB3aWRnZXQgb24gcG9ydGFpdCwgbGFuZHNjYXBlIHBkZiBmb3IgcGRmLWxpYlxuZnVuY3Rpb24gY29tcGVuc2F0ZVJvdGF0aW9uKFxuICBwYWdlUm90YXRpb24sXG4gIHgsXG4gIHksXG4gIHNjYWxlLFxuICBkaW1lbnNpb25zLFxuICBmb250U2l6ZSxcbiAgdXBkYXRlQ29sb3JJblJnYixcbiAgZm9udCxcbiAgcGFnZVxuKSB7XG4gIGxldCByb3RhdGlvblJhZHMgPSAocGFnZVJvdGF0aW9uICogTWF0aC5QSSkgLyAxODA7XG5cbiAgLy9UaGVzZSBjb29yZHMgYXJlIG5vdyBmcm9tIGJvdHRvbS9sZWZ0XG4gIGxldCBjb29yZHNGcm9tQm90dG9tTGVmdCA9IHsgeDogeCAvIHNjYWxlIH07XG4gIGlmIChwYWdlUm90YXRpb24gPT09IDkwIHx8IHBhZ2VSb3RhdGlvbiA9PT0gMjcwKSB7XG4gICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSA9IGRpbWVuc2lvbnMud2lkdGggLSAoeSArIGZvbnRTaXplKSAvIHNjYWxlO1xuICB9IGVsc2Uge1xuICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgPSBkaW1lbnNpb25zLmhlaWdodCAtICh5ICsgZm9udFNpemUpIC8gc2NhbGU7XG4gIH1cblxuICBsZXQgZHJhd1ggPSBudWxsO1xuICBsZXQgZHJhd1kgPSBudWxsO1xuICBpZiAocGFnZVJvdGF0aW9uID09PSA5MCkge1xuICAgIGRyYXdYID1cbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpIC1cbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLnNpbihyb3RhdGlvblJhZHMpICtcbiAgICAgIGRpbWVuc2lvbnMud2lkdGg7XG4gICAgZHJhd1kgPVxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueCAqIE1hdGguc2luKHJvdGF0aW9uUmFkcykgK1xuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguY29zKHJvdGF0aW9uUmFkcyk7XG4gIH0gZWxzZSBpZiAocGFnZVJvdGF0aW9uID09PSAxODApIHtcbiAgICBkcmF3WCA9XG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC54ICogTWF0aC5jb3Mocm90YXRpb25SYWRzKSAtXG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC55ICogTWF0aC5zaW4ocm90YXRpb25SYWRzKSArXG4gICAgICBkaW1lbnNpb25zLndpZHRoO1xuICAgIGRyYXdZID1cbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLnNpbihyb3RhdGlvblJhZHMpICtcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpICtcbiAgICAgIGRpbWVuc2lvbnMuaGVpZ2h0O1xuICB9IGVsc2UgaWYgKHBhZ2VSb3RhdGlvbiA9PT0gMjcwKSB7XG4gICAgZHJhd1ggPVxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueCAqIE1hdGguY29zKHJvdGF0aW9uUmFkcykgLVxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguc2luKHJvdGF0aW9uUmFkcyk7XG4gICAgZHJhd1kgPVxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueCAqIE1hdGguc2luKHJvdGF0aW9uUmFkcykgK1xuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguY29zKHJvdGF0aW9uUmFkcykgK1xuICAgICAgZGltZW5zaW9ucy5oZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgLy9ubyByb3RhdGlvblxuICAgIGRyYXdYID0gY29vcmRzRnJvbUJvdHRvbUxlZnQueDtcbiAgICBkcmF3WSA9IGNvb3Jkc0Zyb21Cb3R0b21MZWZ0Lnk7XG4gIH1cbiAgaWYgKGZvbnQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogZHJhd1gsXG4gICAgICB5OiBkcmF3WSxcbiAgICAgIGZvbnQsXG4gICAgICBjb2xvcjogdXBkYXRlQ29sb3JJblJnYixcbiAgICAgIHNpemU6IGZvbnRTaXplLFxuICAgICAgcm90YXRlOiBwYWdlLmdldFJvdGF0aW9uKClcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IHg6IGRyYXdYLCB5OiBkcmF3WSB9O1xuICB9XG59XG5cbi8vIGBnZXRJbWFnZVBvc2l0aW9uYCBpcyB1c2VkIHRvIGNhbHVsY2F0ZSBwb3NpdGlvbiBvZiBpbWFnZSB0eXBlIHdpZGdldCBsaWtlIHgsIHksIHdpZHRoLCBoZWlnaHQgZm9yIHBkZi1saWJcbmZ1bmN0aW9uIGdldEltYWdlUG9zaXRpb24ocGFnZSwgaW1hZ2UsIHNpemVSYXRpbykge1xuICBsZXQgcGFnZVdpZHRoO1xuICAvLyBwYWdlSGVpZ2h0O1xuICBpZiAoWzkwLCAyNzBdLmluY2x1ZGVzKHBhZ2UuZ2V0Um90YXRpb24oKS5hbmdsZSkpIHtcbiAgICBwYWdlV2lkdGggPSBwYWdlLmdldEhlaWdodCgpO1xuICB9IGVsc2Uge1xuICAgIHBhZ2VXaWR0aCA9IHBhZ2UuZ2V0V2lkdGgoKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgaWYgKCFpbWFnZT8uaGFzT3duUHJvcGVydHkoXCJ2cFdpZHRoXCIpKSB7XG4gICAgaW1hZ2VbXCJ2cFdpZHRoXCJdID0gcGFnZVdpZHRoO1xuICB9XG5cbiAgY29uc3QgcGFnZVJhdGlvID0gcGFnZVdpZHRoIC8gKGltYWdlLnZwV2lkdGggKiBzaXplUmF0aW8pO1xuICBjb25zdCBpbWFnZVdpZHRoID0gaW1hZ2Uud2lkdGggKiBzaXplUmF0aW8gKiBwYWdlUmF0aW87XG4gIGNvbnN0IGltYWdlSGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0ICogc2l6ZVJhdGlvICogcGFnZVJhdGlvO1xuICBjb25zdCBpbWFnZVggPSBpbWFnZS54ICogc2l6ZVJhdGlvICogcGFnZVJhdGlvO1xuICBjb25zdCBpbWFnZVlGcm9tVG9wID0gaW1hZ2UueSAqIHNpemVSYXRpbyAqIHBhZ2VSYXRpbztcblxuICBjb25zdCBjb3JyZWN0aW9uID0gY29tcGVuc2F0ZVJvdGF0aW9uKFxuICAgIHBhZ2UuZ2V0Um90YXRpb24oKS5hbmdsZSxcbiAgICBpbWFnZVgsXG4gICAgaW1hZ2VZRnJvbVRvcCxcbiAgICAxLFxuICAgIHBhZ2UuZ2V0U2l6ZSgpLFxuICAgIGltYWdlSGVpZ2h0XG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogaW1hZ2VXaWR0aCxcbiAgICBoZWlnaHQ6IGltYWdlSGVpZ2h0LFxuICAgIHg6IGNvcnJlY3Rpb24ueCxcbiAgICB5OiBjb3JyZWN0aW9uLnksXG4gICAgcm90YXRlOiBwYWdlLmdldFJvdGF0aW9uKClcbiAgfTtcbn1cbi8vZnVuY3Rpb24gdG8gdXNlIGNhbGN1bGF0ZSBwZGYgcmVuZGVyaW5nIHNjYWxlIGluIHRoZSBjb250YWluZXJcbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJTY2FsZSA9IChwZGZPcmlnaW5hbFdILCBwYWdlTnVtYmVyLCBjb250YWluZXJXSCkgPT4ge1xuICBjb25zdCBnZXRQZGZQYWdlV2lkdGggPSBwZGZPcmlnaW5hbFdILmZpbmQoXG4gICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlclxuICApO1xuICBjb25zdCBjb250YWluZXJTY2FsZSA9IGNvbnRhaW5lcldIPy53aWR0aCAvIGdldFBkZlBhZ2VXaWR0aD8ud2lkdGggfHwgMTtcbiAgcmV0dXJuIGNvbnRhaW5lclNjYWxlO1xufTtcbiIsImltcG9ydCBsb2dvIGZyb20gXCIuLi9hc3NldHMvaW1hZ2VzL2xvZ28ucG5nXCI7XG5leHBvcnQgY29uc3QgYXBwSW5mbyA9IHtcbiAgYXBwbG9nbzogbG9nbyxcbiAgYXBwSWQ6IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUFBJRCA/IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUFBJRCA6IFwib3BlbnNpZ25cIixcbiAgYmFzZVVybDogcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NFUlZFUlVSTFxuICAgID8gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NFUlZFUlVSTFxuICAgIDogd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIFwiL2FwaS9hcHBcIixcbiAgZGVmYXVsdFJvbGU6IFwiY29udHJhY3RzX1VzZXJcIixcbiAgZmJBcHBJZDogcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0ZCQVBQSURcbiAgICA/IGAke3Byb2Nlc3MuZW52LlJFQUNUX0FQUF9GQkFQUElEfWBcbiAgICA6IFwiXCIsXG4gIGZldl9JY29uOlxuICAgIFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3Q0FZQUFBQlhBdm1IQUFBQUFYTlNSMElBcnM0YzZRQUFBTGxKUkVGVWFFUHRtTjBOd2pBTUJwTnhZREtZaU0xWXA5MGc5M0NLU3RIMU5iSWRmejkyMURrZXIyUGMrSnMxY0RGN01YQXhBU01HWWtBaWdCSTZ2aDlad29YUDUzdVpvQVljdmh3ZEEzbUFWYkkyYVNiKzl6RktVNElVUkI2ai9Ib1BVSUVhMkczaUdJQWhRUURsQVVJb0UyZGlhYklrbElTUzBOb0ZQZWJvNzdSRjZPZW5FRjNRbnRPbTEyOGhlMEdLcndIeUFDRm96Mk1nQnFTR2twQUVjSHM0N29IdE41QUZha0FDcU1OalFFTW9FOFNBQkZDSG40SEUyekdIU0xlRUFBQUFBRWxGVGtTdVFtQ0NcIixcbiAgZ29vZ2xlQ2xpZXRJZDogcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0dPT0dMRUNMSUVOVElEXG4gICAgPyBgJHtwcm9jZXNzLmVudi5SRUFDVF9BUFBfR09PR0xFQ0xJRU5USUR9YFxuICAgIDogXCJcIixcbiAgbWV0YURlc2NyaXB0aW9uOlxuICAgIFwiVGhlIGZhc3Rlc3Qgd2F5IHRvIHNpZ24gUERGcyAmIHJlcXVlc3Qgc2lnbmF0dXJlcyBmcm9tIG90aGVycy5cIixcbiAgc2V0dGluZ3M6IFtcbiAgICB7XG4gICAgICByb2xlOiBcImNvbnRyYWN0c19BZG1pblwiLFxuICAgICAgbWVudUlkOiBcIlZQaDkxaDBaSGtcIixcbiAgICAgIHBhZ2VUeXBlOiBcImRhc2hib2FyZFwiLFxuICAgICAgcGFnZUlkOiBcIjM1S0JvU2dvQUtcIixcbiAgICAgIGV4dGVuZGVkX2NsYXNzOiBcImNvbnRyYWN0c19Vc2Vyc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICByb2xlOiBcImNvbnRyYWN0c19PcmdBZG1pblwiLFxuICAgICAgbWVudUlkOiBcIlZQaDkxaDBaSGtcIixcbiAgICAgIHBhZ2VUeXBlOiBcImRhc2hib2FyZFwiLFxuICAgICAgcGFnZUlkOiBcIjM1S0JvU2dvQUtcIixcbiAgICAgIGV4dGVuZGVkX2NsYXNzOiBcImNvbnRyYWN0c19Vc2Vyc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICByb2xlOiBcImNvbnRyYWN0c19FZGl0b3JcIixcbiAgICAgIG1lbnVJZDogXCJIOXZSZkVZS2hUXCIsXG4gICAgICBwYWdlVHlwZTogXCJkYXNoYm9hcmRcIixcbiAgICAgIHBhZ2VJZDogXCIzNUtCb1Nnb0FLXCIsXG4gICAgICBleHRlbmRlZF9jbGFzczogXCJjb250cmFjdHNfVXNlcnNcIlxuICAgIH0sXG4gICAge1xuICAgICAgcm9sZTogXCJjb250cmFjdHNfVXNlclwiLFxuICAgICAgbWVudUlkOiBcIkg5dlJmRVlLaFRcIixcbiAgICAgIHBhZ2VUeXBlOiBcImRhc2hib2FyZFwiLFxuICAgICAgcGFnZUlkOiBcIjM1S0JvU2dvQUtcIixcbiAgICAgIGV4dGVuZGVkX2NsYXNzOiBcImNvbnRyYWN0c19Vc2Vyc1wiXG4gICAgfVxuICBdXG59O1xuIiwiZXhwb3J0IGNvbnN0IGNvbnRhY3RDbHMgPSBcImNvbnRyYWN0c19Db250YWN0Ym9va1wiO1xyXG5leHBvcnQgY29uc3QgdGVtcGxhdGVDbHMgPSBcImNvbnRyYWN0c19UZW1wbGF0ZVwiO1xyXG5leHBvcnQgY29uc3QgZG9jdW1lbnRDbHMgPSBcImNvbnRyYWN0c19Eb2N1bWVudFwiO1xyXG5leHBvcnQgY29uc3QgdGhlbWVDb2xvciA9IFwiIzQ3YTNhZFwiO1xyXG5leHBvcnQgY29uc3QgaWNvbkNvbG9yID0gXCIjNjg2OTY4XCI7XHJcbmV4cG9ydCBjb25zdCBlbWFpbFJlZ2V4ID0gL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvO1xyXG5leHBvcnQgY29uc3QgaXNFbmFibGVTdWJzY3JpcHRpb24gPVxyXG4gIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9FTkFCTEVfU1VCU0NSSVBUSU9OICYmXHJcbiAgcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0VOQUJMRV9TVUJTQ1JJUFRJT04/LnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiXHJcbiAgICA/IHRydWVcclxuICAgIDogZmFsc2U7XHJcbmV4cG9ydCBjb25zdCBpc1N0YWdpbmcgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMVwiO1xyXG4vLyB3aW5kb3cubG9jYXRpb24ub3JpZ2luID09PSBcImh0dHBzOi8vc3RhZ2luZy1hcHAub3BlbnNpZ25sYWJzLmNvbVwiO1xyXG4iLCJpbXBvcnQgeyBpc1N0YWdpbmcgfSBmcm9tIFwiLi4vY29uc3RhbnQvY29uc3RcIjtcblxuY29uc3QgcGxhbnMgPSBbXG4gIHtcbiAgICBwbGFuTmFtZTogXCJPUEVOU0lHTuKEoiBGUkVFXCIsXG4gICAgaW1nOiBcImZyZWUucG5nXCIsXG4gICAgY3VycmVuY3k6IFwiXCIsXG4gICAgbW9udGhseVByaWNlOiBcIkZyZWVcIixcbiAgICB5ZWFybHlQcmljZTogXCJGcmVlXCIsXG4gICAgc3VidGl0bGU6IFwiRnJlZSBVbmxpbWl0ZWQgRS1zaWduYXR1cmVzLCBGb3JldmVyLlwiLFxuICAgIGJ0bjogeyB0ZXh0OiBcIlN1YnNjcmliZVwiLCBjb2xvcjogXCJvcC1idG4tcHJpbWFyeVwiIH0sXG4gICAgdXJsOiBcIlwiLFxuICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICBiZW5lZml0czogW1xuICAgICAgXCJVbmxpbWl0ZWQgZW52ZWxvcGVzXCIsXG4gICAgICBcIlNpZ24gZG9jdW1lbnRzIHlvdXJzZWxmXCIsXG4gICAgICBcIlJlcXVlc3Qgc2lnbmF0dXJlcyBmcm9tIG90aGVyc1wiLFxuICAgICAgXCIxNCBmaWVsZCB0eXBlc1wiLFxuICAgICAgXCJBdXRvbWF0aWMgZS1zaWduYXR1cmVzXCIsXG4gICAgICBcIkNvbXBsZXRpb24gY2VydGlmaWNhdGVzXCIsXG4gICAgICBcIlNlbmQgaW4gb3JkZXJcIixcbiAgICAgIFwiRG9jdW1lbnQgdGVtcGxhdGVzXCIsXG4gICAgICBcIkltcG9ydCBmcm9tIERyb3Bib3hcIixcbiAgICAgIFwiQ29udGFjdCBib29rXCIsXG4gICAgICBcIkRvY3VtZW50IGV4cGlyeSBzdXBwb3J0XCIsXG4gICAgICBcIkRlY2xpbmUgZG9jdW1lbnQgc3VwcG9ydFwiLFxuICAgICAgXCJFbWFpbCBub3RpZmljYXRpb25zXCIsXG4gICAgICBcIlJlY2lwaWVudCBhdXRoZW50aWNhdGlvbiB1c2luZyBPVFBcIixcbiAgICAgIFwiQnVsayBzZW5kICh1cHRvIDUgZG9jcylcIixcbiAgICAgIFwiUHVibGljIHByb2ZpbGVzXCIsXG4gICAgICBcIkFuZCBtdWNoIG1vcmVcIlxuICAgIF0sXG4gICAgeWVhcmx5QmVuZWZpdHM6IFtcbiAgICAgIFwiVW5saW1pdGVkIGVudmVsb3Blc1wiLFxuICAgICAgXCJTaWduIGRvY3VtZW50cyB5b3Vyc2VsZlwiLFxuICAgICAgXCJSZXF1ZXN0IHNpZ25hdHVyZXMgZnJvbSBvdGhlcnNcIixcbiAgICAgIFwiMTQgZmllbGQgdHlwZXNcIixcbiAgICAgIFwiQXV0b21hdGljIGUtc2lnbmF0dXJlc1wiLFxuICAgICAgXCJDb21wbGV0aW9uIGNlcnRpZmljYXRlc1wiLFxuICAgICAgXCJTZW5kIGluIG9yZGVyXCIsXG4gICAgICBcIkRvY3VtZW50IHRlbXBsYXRlc1wiLFxuICAgICAgXCJJbXBvcnQgZnJvbSBEcm9wYm94XCIsXG4gICAgICBcIkNvbnRhY3QgYm9va1wiLFxuICAgICAgXCJEb2N1bWVudCBleHBpcnkgc3VwcG9ydFwiLFxuICAgICAgXCJEZWNsaW5lIGRvY3VtZW50IHN1cHBvcnRcIixcbiAgICAgIFwiRW1haWwgbm90aWZpY2F0aW9uc1wiLFxuICAgICAgXCJSZWNpcGllbnQgYXV0aGVudGljYXRpb24gdXNpbmcgT1RQXCIsXG4gICAgICBcIkJ1bGsgc2VuZCAodXB0byA1IGRvY3MpXCIsXG4gICAgICBcIlB1YmxpYyBwcm9maWxlc1wiLFxuICAgICAgXCJBbmQgbXVjaCBtb3JlXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBwbGFuTmFtZTogXCJPUEVOU0lHTuKEoiBQUk9GRVNTSU9OQUxcIixcbiAgICBpbWc6IFwicHJvZmVzc2lvbmFsLnBuZ1wiLFxuICAgIGN1cnJlbmN5OiBcIiRcIixcbiAgICBtb250aGx5UHJpY2U6IFwiMjkuOTlcIixcbiAgICB5ZWFybHlQcmljZTogYDkuOTk8c3VwIHN0eWxlPVwiZm9udC1zaXplOiAxN3B4O1wiPi9tb250aDwvc3VwPmAsXG4gICAgc3VidGl0bGU6IFwiRXhjbHVzaXZlIEFjY2VzcyB0byBhZHZhbmNlZCBmZWF0dXJlcy5cIixcbiAgICBidG46IHsgdGV4dDogXCJTdWJzY3JpYmVcIiwgY29sb3I6IFwib3AtYnRuLXByaW1hcnlcIiB9LFxuICAgIHVybDogaXNTdGFnaW5nXG4gICAgICA/IFwiaHR0cHM6Ly9iaWxsaW5nLnpvaG8uaW4vc3Vic2NyaWJlLzk2MjdmNjJhMDlkZjFjOGNlNTAwZjJmNGRjODMyOGRkODRlY2RhMjBlZWFlMTM4NzhjZTU4MWQ2MDI0MGYyMDYvcHJvLXdlZWtseVwiXG4gICAgICA6IFwiaHR0cHM6Ly9iaWxsaW5nLm9wZW5zaWdubGFicy5jb20vc3Vic2NyaWJlL2VmNzk4NDg2ZTZhMGExMWVhNjVmMmJhZThmMmFmOTAxZDFhMDlkZmE4MDg1NTg1Y2RkNGVjNGQ3ZjMyMTM3ZjMvcHJvZmVzc2lvbmFsLW1vbnRobHlcIixcbiAgICB5ZWFybHlVcmw6IGlzU3RhZ2luZ1xuICAgICAgPyBcImh0dHBzOi8vYmlsbGluZy56b2hvLmluL3N1YnNjcmliZS85NjI3ZjYyYTA5ZGYxYzhjZTUwMGYyZjRkYzgzMjhkZGMxODQ0MTExMjkyMjRmMWYyOWVkODRmNmNlZjNiODYyL3Byby15ZWFybHlcIlxuICAgICAgOiBcImh0dHBzOi8vYmlsbGluZy5vcGVuc2lnbmxhYnMuY29tL3N1YnNjcmliZS9lZjc5ODQ4NmU2YTBhMTFlYTY1ZjJiYWU4ZjJhZjkwMWQ4YWQxMTM1MTkwZGZmOTUxMzMwMzYwZTQ3NTg1YTcxL3Byb2Zlc3Npb25hbC15ZWFybHlcIixcbiAgICB0YXJnZXQ6IFwiX3NlbGZcIixcbiAgICBiZW5lZml0czogW1xuICAgICAgXCJFdmVyeXRoaW5nIGluIE9wZW5TaWdu4oSiIGZyZWVcIixcbiAgICAgIFwiRmllbGQgdmFsaWRhdGlvbnNcIixcbiAgICAgIFwiUmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRpb25zXCIsXG4gICAgICBcIk9yZ2FuaXplIGRvY3MgaW4gT3BlblNpZ27ihKIgRHJpdmVcIixcbiAgICAgIFwiV2ViaG9va3NcIixcbiAgICAgIFwiWmFwaWVyIGludGVncmF0aW9uXCIsXG4gICAgICBcIkFQSSBBY2Nlc3NcIixcbiAgICAgIFwiMTAwIEFQSSBzaWduYXR1cmVzIGluY2x1ZGVkXCIsXG4gICAgICBcIkN1c3RvbSBlbWFpbCB0ZW1wbGF0ZXNcIixcbiAgICAgIFwiQXV0byByZW1pbmRlcnNcIixcbiAgICAgIFwiQnVsayBzZW5kICh1cHRvIDIwIGRvY3MpXCIsXG4gICAgICBcIlByZW1pdW0gUHVibGljIHByb2ZpbGUgdXNlcm5hbWVzXCIsXG4gICAgICBcIkVtYmVkZGluZyAoY29taW5nIHNvb24pXCJcbiAgICBdLFxuICAgIHllYXJseUJlbmVmaXRzOiBbXG4gICAgICBcIkV2ZXJ5dGhpbmcgaW4gT3BlblNpZ27ihKIgZnJlZVwiLFxuICAgICAgXCJGaWVsZCB2YWxpZGF0aW9uc1wiLFxuICAgICAgXCJSZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGlvbnNcIixcbiAgICAgIFwiT3JnYW5pemUgZG9jcyBpbiBPcGVuU2lnbuKEoiBEcml2ZVwiLFxuICAgICAgXCJXZWJob29rc1wiLFxuICAgICAgXCJaYXBpZXIgaW50ZWdyYXRpb25cIixcbiAgICAgIFwiQVBJIEFjY2Vzc1wiLFxuICAgICAgXCIyNDAgQVBJIHNpZ25hdHVyZXMgaW5jbHVkZWRcIixcbiAgICAgIFwiQ3VzdG9tIGVtYWlsIHRlbXBsYXRlc1wiLFxuICAgICAgXCJBdXRvIHJlbWluZGVyc1wiLFxuICAgICAgXCJCdWxrIHNlbmQgKHVwdG8gMjAgZG9jcylcIixcbiAgICAgIFwiUHJlbWl1bSBQdWJsaWMgcHJvZmlsZSB1c2VybmFtZXNcIixcbiAgICAgIFwiRW1iZWRkaW5nIChjb21pbmcgc29vbilcIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIHBsYW5OYW1lOiBcIk9QRU5TSUdO4oSiIFRFQU1TXCIsXG4gICAgaW1nOiBcInRlYW1zLnBuZ1wiLFxuICAgIGN1cnJlbmN5OiBcIiRcIixcbiAgICBtb250aGx5UHJpY2U6IGAzOS45OTxzdXAgc3R5bGU9XCJmb250LXNpemU6IDE3cHg7XCI+L3VzZXI8L3N1cD5gLFxuICAgIHllYXJseVByaWNlOiBgMTkuOTk8c3VwIHN0eWxlPVwiZm9udC1zaXplOiAxN3B4O1wiPi91c2VyL21vbnRoPC9zdXA+YCxcbiAgICBzdWJ0aXRsZTogXCJFeGNsdXNpdmUgQWNjZXNzIHRvIGFkdmFuY2VkIGZlYXR1cmVzLlwiLFxuICAgIGJ0bjogeyB0ZXh0OiBcIlN1YnNjcmliZVwiLCBjb2xvcjogXCJvcC1idG4tYWNjZW50XCIgfSxcbiAgICB1cmw6IGlzU3RhZ2luZ1xuICAgICAgPyBcImh0dHBzOi8vYmlsbGluZy56b2hvLmluL3N1YnNjcmliZS9lZDgwOTcyNzNhODJiNmJmMzk4OTJjMTFhM2JiM2MzODFlYjI3MDU3MzYwMTRjZmJkYmRlMWNjZjFjN2ExODlkL3RlYW0td2Vla2x5XCJcbiAgICAgIDogXCJodHRwczovL2JpbGxpbmcub3BlbnNpZ25sYWJzLmNvbS9zdWJzY3JpYmUvZWY3OTg0ODZlNmEwYTExZWE2NWYyYmFlOGYyYWY5MDEyMzdkMDcwMmJmYWE5NTk0MDYzMDY2MzVkODBmMTM4Yy90ZWFtcy1tb250aGx5XCIsXG4gICAgeWVhcmx5VXJsOiBpc1N0YWdpbmdcbiAgICAgID8gXCJodHRwczovL2JpbGxpbmcuem9oby5pbi9zdWJzY3JpYmUvZWQ4MDk3MjczYTgyYjZiZjM5ODkyYzExYTNiYjNjMzgxZWIyNzA1NzM2MDE0Y2ZiZGJkZTFjY2YxYzdhMTg5ZC90ZWFtLXdlZWtseVwiXG4gICAgICA6IFwiaHR0cHM6Ly9iaWxsaW5nLm9wZW5zaWdubGFicy5jb20vc3Vic2NyaWJlL2VmNzk4NDg2ZTZhMGExMWVhNjVmMmJhZThmMmFmOTAxMWE4NjQ5OTRiYmVlZWM3MWZjZjEwNjE4ODYzMDE5OWQvdGVhbXMteWVhcmx5XCIsXG4gICAgdGFyZ2V0OiBcIl9zZWxmXCIsXG4gICAgYmVuZWZpdHM6IFtcbiAgICAgIFwiRXZlcnl0aGluZyBpbiBPcGVuU2lnbuKEoiBwcm9mZXNzaW9uYWxcIixcbiAgICAgIFwiMTAwIEFQSSBzaWduYXR1cmVzIGluY2x1ZGVkXCIsXG4gICAgICBcIlRlYW1zIGFuZCBPcmdhbml6YXRpb25zXCIsXG4gICAgICBcIlNoYXJlIFRlbXBsYXRlcyB3aXRoIHRlYW1zXCIsXG4gICAgICBcIlNoYXJlIFRlbXBsYXRlcyB3aXRoIGluZGl2aWR1YWxzXCIsXG4gICAgICBcIkRvY3VtZW50SWQgcmVtb3ZhbCBmcm9tIHNpZ25lZCBkb2NzXCIsXG4gICAgICBcIkJ1bGsgc2VuZCAodXB0byA1MCBkb2NzKVwiLFxuICAgICAgXCJSZXF1ZXN0IFBheW1lbnRzIChjb21pbmcgc29vbilcIixcbiAgICAgIFwiTW9iaWxlIGFwcCAoY29taW5nIHNvb24pXCJcbiAgICBdLFxuICAgIHllYXJseUJlbmVmaXRzOiBbXG4gICAgICBcIkV2ZXJ5dGhpbmcgaW4gT3BlblNpZ27ihKIgcHJvZmVzc2lvbmFsXCIsXG4gICAgICBcIjUwMCBBUEkgc2lnbmF0dXJlcyBpbmNsdWRlZFwiLFxuICAgICAgXCJUZWFtcyBhbmQgT3JnYW5pemF0aW9uc1wiLFxuICAgICAgXCJTaGFyZSBUZW1wbGF0ZXMgd2l0aCB0ZWFtc1wiLFxuICAgICAgXCJTaGFyZSBUZW1wbGF0ZXMgd2l0aCBpbmRpdmlkdWFsc1wiLFxuICAgICAgXCJEb2N1bWVudElkIHJlbW92YWwgZnJvbSBzaWduZWQgZG9jc1wiLFxuICAgICAgXCJCdWxrIHNlbmQgKHVwdG8gNTAgZG9jcylcIixcbiAgICAgIFwiUmVxdWVzdCBQYXltZW50cyAoY29taW5nIHNvb24pXCIsXG4gICAgICBcIk1vYmlsZSBhcHAgKGNvbWluZyBzb29uKVwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgcGxhbk5hbWU6IFwiT1BFTlNJR07ihKIgRU5URVJQUklTRVwiLFxuICAgIGltZzogXCJlbnRlcnByaXNlLnBuZ1wiLFxuICAgIGN1cnJlbmN5OiBcIlwiLFxuICAgIG1vbnRobHlQcmljZTogYDxwIHN0eWxlPVwiZm9udC1zaXplOiAyMnB4O1wiPlJlcXVlc3QgUHJpY2U8L3A+YCxcbiAgICB5ZWFybHlQcmljZTogYDxwIHN0eWxlPVwiZm9udC1zaXplOiAyMnB4O1wiPlJlcXVlc3QgUHJpY2U8L3A+YCxcbiAgICBzdWJ0aXRsZTogXCJTY2FsYWJsZSBGZWF0dXJlcyB3aXRoIHByaW9yaXR5IHN1cHBvcnQuXCIsXG4gICAgYnRuOiB7IHRleHQ6IFwiQ29udGFjdCB1c1wiLCBjb2xvcjogXCJvcC1idG4tcHJpbWFyeVwiIH0sXG4gICAgdXJsOiBcImh0dHBzOi8vd3d3Lm9wZW5zaWdubGFicy5jb20vY29udGFjdC11c1wiLFxuICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICBiZW5lZml0czogW1xuICAgICAgXCJBbGwgZmVhdHVyZXNcIixcbiAgICAgIFwiQ3VzdG9tIGRvbWFpblwiLFxuICAgICAgXCJDdXN0b20gYnJhbmRpbmdcIixcbiAgICAgIFwiVXB0aW1lIFNMQVwiLFxuICAgICAgXCJTU08gc3VwcG9ydFwiLFxuICAgICAgXCJQcmlvcml0eSBzdXBwb3J0XCJcbiAgICBdLFxuICAgIHllYXJseUJlbmVmaXRzOiBbXG4gICAgICBcIkFsbCBmZWF0dXJlc1wiLFxuICAgICAgXCJDdXN0b20gZG9tYWluXCIsXG4gICAgICBcIkN1c3RvbSBicmFuZGluZ1wiLFxuICAgICAgXCJVcHRpbWUgU0xBXCIsXG4gICAgICBcIlNTTyBzdXBwb3J0XCIsXG4gICAgICBcIlByaW9yaXR5IHN1cHBvcnRcIlxuICAgIF1cbiAgfVxuXTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkcGxhbiA9IHtcbiAgXCJ0ZWFtLXdlZWtseVwiOiB0cnVlLFxuICBcInRlYW0teWVhcmx5XCI6IHRydWUsXG4gIFwidGVhbXMtbW9udGhseVwiOiB0cnVlLFxuICBcInRlYW1zLXllYXJseVwiOiB0cnVlLFxuICBcImVudGVycHJpc2UtbW9udGhseVwiOiB0cnVlLFxuICBcImVudGVycHJpc2UteWVhcmx5XCI6IHRydWVcbn07XG5leHBvcnQgZGVmYXVsdCBwbGFucztcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGlzRW5hYmxlU3Vic2NyaXB0aW9uLCBpc1N0YWdpbmcsIHRoZW1lQ29sb3IgfSBmcm9tIFwiLi4vY29uc3RhbnQvY29uc3RcIjtcbmltcG9ydCB7IFBERkRvY3VtZW50IH0gZnJvbSBcInBkZi1saWJcIjtcbmltcG9ydCBcIi4uL3N0eWxlcy9zaWduYXR1cmUuY3NzXCI7XG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XG5pbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBEbmRQcm92aWRlciB9IGZyb20gXCJyZWFjdC1kbmRcIjtcbmltcG9ydCB7IEhUTUw1QmFja2VuZCB9IGZyb20gXCJyZWFjdC1kbmQtaHRtbDUtYmFja2VuZFwiO1xuaW1wb3J0IFNpZ25QYWQgZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL1NpZ25QYWRcIjtcbmltcG9ydCBSZW5kZXJBbGxQZGZQYWdlIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9SZW5kZXJBbGxQZGZQYWdlXCI7XG5pbXBvcnQgVG91ciBmcm9tIFwicmVhY3RvdXJcIjtcbmltcG9ydCBDb25mZXR0aSBmcm9tIFwicmVhY3QtY29uZmV0dGlcIjtcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xuaW1wb3J0IHtcbiAgY29udHJhY3REb2N1bWVudCxcbiAgbXVsdGlTaWduRW1iZWQsXG4gIGVtYmVkRG9jSWQsXG4gIHBkZk5ld1dpZHRoRnVuLFxuICBzaWduUGRmRnVuLFxuICBvbkltYWdlU2VsZWN0LFxuICBvblNhdmVTaWduLFxuICBvblNhdmVJbWFnZSxcbiAgYWRkRGVmYXVsdFNpZ25hdHVyZUltZyxcbiAgcmFkaW9CdXR0b25XaWRnZXQsXG4gIHJlcGxhY2VNYWlsVmFyaWJsZXMsXG4gIGZldGNoU3Vic2NyaXB0aW9uLFxuICBjb252ZXJ0UGRmQXJyYXlCdWZmZXIsXG4gIGNvbnRyYWN0VXNlcnMsXG4gIGhhbmRsZVNlbmRPVFAsXG4gIGNvbnRhY3RCb29rLFxuICBoYW5kbGVEb3dubG9hZFBkZixcbiAgaGFuZGxlVG9QcmludCxcbiAgaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZVxufSBmcm9tIFwiLi4vY29uc3RhbnQvVXRpbHNcIjtcbmltcG9ydCBMb2FkZXJXaXRoTXNnIGZyb20gXCIuLi9wcmltaXRpdmVzL0xvYWRlcldpdGhNc2dcIjtcbmltcG9ydCBIYW5kbGVFcnJvciBmcm9tIFwiLi4vcHJpbWl0aXZlcy9IYW5kbGVFcnJvclwiO1xuaW1wb3J0IEhlYWRlciBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvUGRmSGVhZGVyXCI7XG5pbXBvcnQgUmVuZGVyUGRmIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9SZW5kZXJQZGZcIjtcbmltcG9ydCBQZGZEZWNsaW5lTW9kYWwgZnJvbSBcIi4uL3ByaW1pdGl2ZXMvUGRmRGVjbGluZU1vZGFsXCI7XG5pbXBvcnQgVGl0bGUgZnJvbSBcIi4uL2NvbXBvbmVudHMvVGl0bGVcIjtcbmltcG9ydCBEZWZhdWx0U2lnbmF0dXJlIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9EZWZhdWx0U2lnbmF0dXJlXCI7XG5pbXBvcnQgTW9kYWxVaSBmcm9tIFwiLi4vcHJpbWl0aXZlcy9Nb2RhbFVpXCI7XG5pbXBvcnQgVG91ckNvbnRlbnRXaXRoQnRuIGZyb20gXCIuLi9wcmltaXRpdmVzL1RvdXJDb250ZW50V2l0aEJ0blwiO1xuaW1wb3J0IExvYWRlciBmcm9tIFwiLi4vcHJpbWl0aXZlcy9Mb2FkZXJcIjtcbmltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSBcInJlYWN0LXJlZHV4XCI7XG5pbXBvcnQgU2lnbmVyTGlzdENvbXBvbmVudCBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvU2lnbmVyTGlzdENvbXBvbmVudFwiO1xuaW1wb3J0IFZlcmlmeUVtYWlsIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9WZXJpZnlFbWFpbFwiO1xuaW1wb3J0IFBkZlpvb20gZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL1BkZlpvb21cIjtcblxuZnVuY3Rpb24gUGRmUmVxdWVzdEZpbGVzKHByb3BzKSB7XG4gIGNvbnN0IFtwZGZEZXRhaWxzLCBzZXRQZGZEZXRhaWxzXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW3NpZ25lZFNpZ25lcnMsIHNldFNpZ25lZFNpZ25lcnNdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbdW5zaWduZWRTaWduZXJzLCBzZXRVblNpZ25lZFNpZ25lcnNdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbaXNTaWduUGFkLCBzZXRJc1NpZ25QYWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbcGRmVXJsLCBzZXRQZGZVcmxdID0gdXNlU3RhdGUoKTtcbiAgY29uc3QgW2FsbFBhZ2VzLCBzZXRBbGxQYWdlc10gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgbnVtUGFnZXMgPSAxO1xuICBjb25zdCBbcGFnZU51bWJlciwgc2V0UGFnZU51bWJlcl0gPSB1c2VTdGF0ZSgxKTtcbiAgY29uc3QgW2ltYWdlLCBzZXRJbWFnZV0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2lzSW1hZ2VTZWxlY3QsIHNldElzSW1hZ2VTZWxlY3RdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2lnbmF0dXJlLCBzZXRTaWduYXR1cmVdID0gdXNlU3RhdGUoKTtcbiAgY29uc3QgW2lzU3RhbXAsIHNldElzU3RhbXBdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2lnbktleSwgc2V0U2lnbktleV0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBbaW1nV0gsIHNldEltZ1dIXSA9IHVzZVN0YXRlKHt9KTtcbiAgY29uc3QgaW1hZ2VSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IFtoYW5kbGVFcnJvciwgc2V0SGFuZGxlRXJyb3JdID0gdXNlU3RhdGUoKTtcbiAgY29uc3QgW3NlbGVjdFdpZGdldElkLCBzZXRTZWxlY3RXaWRnZXRJZF0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW290cExvYWRlciwgc2V0T3RwTG9hZGVyXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2lzQ2VsZWJyYXRpb24sIHNldElzQ2VsZWJyYXRpb25dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbcmVxdWVzdFNpZ25Ub3VyLCBzZXRSZXF1ZXN0U2lnblRvdXJdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbdG91clN0YXR1cywgc2V0VG91clN0YXR1c10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZSh7XG4gICAgaXNMb2FkOiB0cnVlLFxuICAgIG1lc3NhZ2U6IFwiVGhpcyBtaWdodCB0YWtlIHNvbWUgdGltZVwiXG4gIH0pO1xuICBjb25zdCBbZGVmYXVsdFNpZ25JbWcsIHNldERlZmF1bHRTaWduSW1nXSA9IHVzZVN0YXRlKCk7XG4gIGNvbnN0IFtpc0RvY0lkLCBzZXRJc0RvY0lkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3BkZk5ld1dpZHRoLCBzZXRQZGZOZXdXaWR0aF0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBbcGRmT3JpZ2luYWxXSCwgc2V0UGRmT3JpZ2luYWxXSF0gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtzaWduZXJQb3MsIHNldFNpZ25lclBvc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtzaWduZXJPYmplY3RJZCwgc2V0U2lnbmVyT2JqZWN0SWRdID0gdXNlU3RhdGUoKTtcbiAgY29uc3QgW2lzVWlMb2FkaW5nLCBzZXRJc1VpTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc0RlY2xpbmUsIHNldElzRGVjbGluZV0gPSB1c2VTdGF0ZSh7IGlzRGVjbGluZWQ6IGZhbHNlIH0pO1xuICBjb25zdCBbY3VycmVudFNpZ25lciwgc2V0Q3VycmVudFNpZ25lcl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc0FsZXJ0LCBzZXRJc0FsZXJ0XSA9IHVzZVN0YXRlKHsgaXNTaG93OiBmYWxzZSwgYWxlcnRNZXNzYWdlOiBcIlwiIH0pO1xuICBjb25zdCBbdW5TaWduZWRXaWRnZXRJZCwgc2V0VW5TaWduZWRXaWRnZXRJZF0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW2V4cGlyZWREYXRlLCBzZXRFeHBpcmVkRGF0ZV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW2lzUmVzaXplLCBzZXRJc1Jlc2l6ZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzaWduZXJVc2VySWQsIHNldFNpZ25lclVzZXJJZF0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBbaXNEb250U2hvdywgc2V0SXNEb250U2hvd10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc0Rvd25sb2FkaW5nLCBzZXRJc0Rvd25sb2FkaW5nXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbZGVmYXVsdFNpZ25BbGVydCwgc2V0RGVmYXVsdFNpZ25BbGVydF0gPSB1c2VTdGF0ZSh7XG4gICAgaXNTaG93OiBmYWxzZSxcbiAgICBhbGVydE1lc3NhZ2U6IFwiXCJcbiAgfSk7XG4gIGNvbnN0IFtpc1N1YnNjcmliZWQsIHNldElzU3Vic2NyaWJlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc0NvbXBsZXRlZCwgc2V0SXNDb21wbGV0ZWRdID0gdXNlU3RhdGUoe1xuICAgIGlzQ2VydGlmaWNhdGU6IGZhbHNlLFxuICAgIGlzTW9kYWw6IGZhbHNlXG4gIH0pO1xuICBjb25zdCBbbXlJbml0aWFsLCBzZXRNeUluaXRpYWxdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtpc0luaXRpYWwsIHNldElzSW5pdGlhbF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtwZGZMb2FkLCBzZXRQZGZMb2FkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2lzU2lnbmVkLCBzZXRJc1NpZ25lZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc0V4cGlyZWQsIHNldElzRXhwaXJlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFthbHJlYWR5U2lnbiwgc2V0QWxyZWFkeVNpZ25dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbY29udGFpbmVyV0gsIHNldENvbnRhaW5lcldIXSA9IHVzZVN0YXRlKHt9KTtcbiAgY29uc3QgW3ZhbGlkYXRlQWxlcnQsIHNldFZhbGlkYXRlQWxlcnRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbd2lkZ2V0c1RvdXIsIHNldFdpZGdldHNUb3VyXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW21pblJlcXVpcmVkQ291bnQsIHNldG1pblJlcXVpcmVkQ291bnRdID0gdXNlU3RhdGUoKTtcbiAgY29uc3QgW3NlbmRJbk9yZGVyLCBzZXRTZW5kSW5PcmRlcl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtjdXJyV2lkZ2V0c0RldGFpbHMsIHNldEN1cnJXaWRnZXRzRGV0YWlsc10gPSB1c2VTdGF0ZSh7fSk7XG4gIGNvbnN0IFtpc1N1YnNjcmlwdGlvbkV4cGlyZWQsIHNldElzU3Vic2NyaXB0aW9uRXhwaXJlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtleHRVc2VySWQsIHNldEV4dFVzZXJJZF0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW2lzRW1haWxWZXJpZmllZCwgc2V0SXNFbWFpbFZlcmlmaWVkXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCBbaXNWZXJpZnlNb2RhbCwgc2V0SXNWZXJpZnlNb2RhbF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtvdHAsIHNldE90cF0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW2NvbnRyYWN0TmFtZSwgc2V0Q29udHJhY3ROYW1lXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbem9vbVBlcmNlbnQsIHNldFpvb21QZXJjZW50XSA9IHVzZVN0YXRlKDApO1xuICBjb25zdCBbdG90YWxab29tUGVyY2VudCwgc2V0VG90YWxab29tUGVyY2VudF0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBbc2NhbGUsIHNldFNjYWxlXSA9IHVzZVN0YXRlKDEpO1xuICBjb25zdCBbdW5pcXVlSWQsIHNldFVuaXF1ZUlkXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbaXNQdWJsaWNUZW1wbGF0ZSwgc2V0SXNQdWJsaWNUZW1wbGF0ZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtjb250YWN0LCBzZXRDb250YWN0XSA9IHVzZVN0YXRlKHsgbmFtZTogXCJcIiwgcGhvbmU6IFwiXCIsIGVtYWlsOiBcIlwiIH0pO1xuICBjb25zdCBbaXNPdHAsIHNldElzT3RwXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbcmVzLCBzZXRSZXNdID0gdXNlU3RhdGUoe30pO1xuICBjb25zdCBbZG9jdW1lbnRJZCwgc2V0RG9jdW1lbnRJZF0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW2lzUHVibGljQ29udGFjdCwgc2V0SXNQdWJsaWNDb250YWN0XSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgaXNIZWFkZXIgPSB1c2VTZWxlY3Rvcigoc3RhdGUpID0+IHN0YXRlLnNob3dIZWFkZXIpO1xuICBjb25zdCBkaXZSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDc2NztcblxuICBsZXQgaXNHdWVzdFNpZ25GbG93ID0gZmFsc2U7XG4gIGxldCBzZW5kbWFpbDtcbiAgbGV0IGdldERvY0lkID0gXCJcIjtcbiAgY29uc3Qgcm91dGUgPSAhcHJvcHMudGVtcGxhdGVJZCAmJiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gIGNvbnN0IGdldFF1ZXJ5ID1cbiAgICAhcHJvcHMudGVtcGxhdGVJZCAmJlxuICAgIHdpbmRvdy5sb2NhdGlvbj8uc2VhcmNoICYmXG4gICAgd2luZG93LmxvY2F0aW9uPy5zZWFyY2g/LnNwbGl0KFwiP1wiKTtcblxuICBpZiAoZ2V0UXVlcnkpIHtcbiAgICBzZW5kbWFpbCA9IGdldFF1ZXJ5WzFdLnNwbGl0KFwiPVwiKVsxXTtcbiAgfVxuICBjb25zdCBjaGVja1NwbGl0ID0gcm91dGUgJiYgcm91dGU/LnNwbGl0KFwiL1wiKTtcblxuICBpZiAoY2hlY2tTcGxpdCAmJiBjaGVja1NwbGl0Lmxlbmd0aCA+IDQpIHtcbiAgICBpc0d1ZXN0U2lnbkZsb3cgPSB0cnVlO1xuICAgIGdldERvY0lkID0gY2hlY2tTcGxpdFszXTtcbiAgfSBlbHNlIHtcbiAgICBnZXREb2NJZCA9IGNoZWNrU3BsaXRbMl07XG4gIH1cbiAgbGV0IGdldERvY3VtZW50SWQgPSBnZXREb2NJZCB8fCBkb2N1bWVudElkO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChnZXREb2N1bWVudElkKSB7XG4gICAgICBzZXREb2N1bWVudElkKGdldERvY3VtZW50SWQpO1xuICAgICAgZ2V0RG9jdW1lbnREZXRhaWxzKGdldERvY3VtZW50SWQpO1xuICAgIH0gZWxzZSBpZiAocHJvcHMudGVtcGxhdGVJZCkge1xuICAgICAgZ2V0VGVtcGxhdGVEZXRhaWxzKCk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW3Byb3BzLnRlbXBsYXRlSWQsIGdldERvY3VtZW50SWRdKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVTaXplID0gKCkgPT4ge1xuICAgICAgaWYgKGRpdlJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IHBkZldpZHRoID0gcGRmTmV3V2lkdGhGdW4oZGl2UmVmKTtcbiAgICAgICAgc2V0UGRmTmV3V2lkdGgocGRmV2lkdGgpO1xuICAgICAgICBzZXRDb250YWluZXJXSCh7XG4gICAgICAgICAgd2lkdGg6IGRpdlJlZi5jdXJyZW50Lm9mZnNldFdpZHRoLFxuICAgICAgICAgIGhlaWdodDogZGl2UmVmLmN1cnJlbnQub2Zmc2V0SGVpZ2h0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBVc2Ugc2V0VGltZW91dCB0byB3YWl0IGZvciB0aGUgdHJhbnNpdGlvbiB0byBjb21wbGV0ZVxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCh1cGRhdGVTaXplLCAxMDApOyAvLyBtYXRjaCB0aGUgdHJhbnNpdGlvbiBkdXJhdGlvblxuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2RpdlJlZi5jdXJyZW50LCBpc0hlYWRlcl0pO1xuICAvL2Z1bmN0aW9uIHRvIHVzZSByZXNlbmQgb3RwIGZvciBlbWFpbCB2ZXJpZmljYXRpb25cbiAgY29uc3QgaGFuZGxlUmVzZW5kID0gYXN5bmMgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgc2V0T3RwTG9hZGVyKHRydWUpO1xuICAgIGNvbnN0IGxvY2FsdXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgYFBhcnNlLyR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpfS9jdXJyZW50VXNlcmBcbiAgICApO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShsb2NhbHVzZXIpO1xuICAgIGF3YWl0IGhhbmRsZVNlbmRPVFAoY3VycmVudFVzZXI/LmVtYWlsKTtcbiAgICBzZXRPdHBMb2FkZXIoZmFsc2UpO1xuICAgIGFsZXJ0KFwiT1RQIHNlbnQgb24geW91IGVtYWlsXCIpO1xuICB9O1xuICAvL2BoYW5kbGVWZXJpZnlFbWFpbGAgZnVuY3Rpb24gaXMgdXNlZCB0byB2ZXJpZnkgZW1haWwgd2l0aCBvdHBcbiAgY29uc3QgaGFuZGxlVmVyaWZ5RW1haWwgPSBhc3luYyAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBzZXRPdHBMb2FkZXIodHJ1ZSk7XG4gICAgY29uc3QgbG9jYWx1c2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxuICAgICk7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBKU09OLnBhcnNlKGxvY2FsdXNlcik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc0VtYWlsID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwidmVyaWZ5ZW1haWxcIiwge1xuICAgICAgICBvdHA6IG90cCxcbiAgICAgICAgZW1haWw6IGN1cnJlbnRVc2VyPy5lbWFpbFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzRW1haWw/Lm1lc3NhZ2UgPT09IFwiRW1haWwgaXMgdmVyaWZpZWQuXCIpIHtcbiAgICAgICAgc2V0SXNFbWFpbFZlcmlmaWVkKHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChyZXNFbWFpbD8ubWVzc2FnZSA9PT0gXCJFbWFpbCBpcyBhbHJlYWR5IHZlcmlmaWVkLlwiKSB7XG4gICAgICAgIHNldElzRW1haWxWZXJpZmllZCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIHNldE90cChcIlwiKTtcbiAgICAgIGFsZXJ0KHJlc0VtYWlsLm1lc3NhZ2UpO1xuICAgICAgc2V0SXNWZXJpZnlNb2RhbChmYWxzZSk7XG4gICAgICAvL2hhbmRsZVJlY2lwaWVudFNpZ24oKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYWxlcnQoZXJyb3IubWVzc2FnZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldE90cExvYWRlcihmYWxzZSk7XG4gICAgfVxuICB9O1xuICAvL2BoYW5kbGVWZXJpZnlCdG5gIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBvdHAgb24gdXNlciBtYWlsXG4gIGNvbnN0IGhhbmRsZVZlcmlmeUJ0biA9IGFzeW5jICgpID0+IHtcbiAgICBzZXRJc1ZlcmlmeU1vZGFsKHRydWUpO1xuICAgIGNvbnN0IGxvY2FsdXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgYFBhcnNlLyR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpfS9jdXJyZW50VXNlcmBcbiAgICApO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShsb2NhbHVzZXIpO1xuICAgIGF3YWl0IGhhbmRsZVNlbmRPVFAoY3VycmVudFVzZXI/LmVtYWlsKTtcbiAgfTtcbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tJc1N1YnNjcmliZWQoZXh0VXNlcklkLCBjb250YWN0SWQpIHtcbiAgICBjb25zdCBpc0d1ZXN0U2lnbiA9IGlzR3Vlc3RTaWduRmxvdyB8fCBmYWxzZTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaFN1YnNjcmlwdGlvbihleHRVc2VySWQsIGNvbnRhY3RJZCwgaXNHdWVzdFNpZ24pO1xuICAgIGNvbnN0IHBsYW4gPSByZXMucGxhbjtcbiAgICBjb25zdCBiaWxsaW5nRGF0ZSA9IHJlcz8uYmlsbGluZ0RhdGU7XG4gICAgY29uc3Qgc3RhdHVzID0gcmVzPy5zdGF0dXM7XG4gICAgaWYgKHBsYW4gPT09IFwiZnJlZXBsYW5cIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChiaWxsaW5nRGF0ZSkge1xuICAgICAgaWYgKG5ldyBEYXRlKGJpbGxpbmdEYXRlKSA+IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgc2V0SXNTdWJzY3JpYmVkKHRydWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc0d1ZXN0U2lnbikge1xuICAgICAgICAgIHNldElzU3Vic2NyaXB0aW9uRXhwaXJlZCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL3N1YnNjcmlwdGlvblwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0d1ZXN0U2lnbikge1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzZXRJc1N1YnNjcmliZWQodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SXNTdWJzY3JpcHRpb25FeHBpcmVkKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNHdWVzdFNpZ24pIHtcbiAgICAgICAgc2V0SXNTdWJzY3JpcHRpb25FeHBpcmVkKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi9zdWJzY3JpcHRpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9mdW5jdGlvbiBmb3IgZ2V0IGRvY3VtZW50IGRldGFpbHMgZm9yIHBlcnRpY3VsYXIgc2lnbmVyIHdpdGggc2lnbmVyJ29iamVjdCBpZFxuICBjb25zdCBnZXRUZW1wbGF0ZURldGFpbHMgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgdGVtcGxhdGVJZDogcHJvcHMudGVtcGxhdGVJZCwgaXNwdWJsaWM6IHRydWUgfTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlRGVhdGlscyA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvZ2V0VGVtcGxhdGVgLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICAgICAgICBzZXNzaW9udG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBjb25zdCBkb2N1bWVudERhdGEgPVxuICAgICAgICB0ZW1wbGF0ZURlYXRpbHMuZGF0YSAmJiB0ZW1wbGF0ZURlYXRpbHMuZGF0YS5yZXN1bHRcbiAgICAgICAgICA/IFt0ZW1wbGF0ZURlYXRpbHMuZGF0YS5yZXN1bHRdXG4gICAgICAgICAgOiBbXTtcblxuICAgICAgaWYgKGRvY3VtZW50RGF0YSAmJiBkb2N1bWVudERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICBzZXRJc1B1YmxpY1RlbXBsYXRlKHRydWUpO1xuICAgICAgICBjb25zdCBnZXRQdWJsaWNSb2xlID0gZG9jdW1lbnREYXRhWzBdPy5QdWJsaWNSb2xlWzBdO1xuICAgICAgICBjb25zdCBnZXRVbmlxdWVJZERldGFpbHMgPSBkb2N1bWVudERhdGFbMF0/LlBsYWNlaG9sZGVycy5maW5kKFxuICAgICAgICAgICh4KSA9PiB4LlJvbGUgPT09IGdldFB1YmxpY1JvbGVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGdldFVuaXF1ZUlkRGV0YWlscykge1xuICAgICAgICAgIHNldFVuaXF1ZUlkKGdldFVuaXF1ZUlkRGV0YWlscy5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U2lnbmVyUG9zKGRvY3VtZW50RGF0YVswXT8uUGxhY2Vob2xkZXJzKTtcbiAgICAgICAgbGV0IHBsYWNlaG9sZGVyc09yU2lnbmVycyA9IFtdO1xuICAgICAgICAvLyBjb25zdCBwbGFjZWhvbGRlciA9IGRvY3VtZW50RGF0YVswXT8uUGxhY2Vob2xkZXJzO1xuICAgICAgICBmb3IgKGNvbnN0IHBsYWNlaG9sZGVyIG9mIGRvY3VtZW50RGF0YVswXS5QbGFjZWhvbGRlcnMpIHtcbiAgICAgICAgICAvL2BlbWFpbEV4aXN0YCB2YXJpYWJsZSB0byBoYW5kbGUgY29uZGl0aW9uIGZvciBxdWljayBzZW5kIGZsb3cgYW5kIHNob3cgdW5zaWduZWQgc2lnbmVycyBsaXN0XG4gICAgICAgICAgY29uc3Qgc2lnbmVySWRFeGlzdCA9IHBsYWNlaG9sZGVyPy5zaWduZXJPYmpJZDtcbiAgICAgICAgICBpZiAoc2lnbmVySWRFeGlzdCkge1xuICAgICAgICAgICAgY29uc3QgZ2V0U2lnbmVyRGF0YSA9IGRvY3VtZW50RGF0YVswXS5TaWduZXJzLmZpbmQoXG4gICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLm9iamVjdElkID09PSBwbGFjZWhvbGRlcj8uc2lnbmVyT2JqSWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwbGFjZWhvbGRlcnNPclNpZ25lcnMucHVzaChnZXRTaWduZXJEYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGxhY2Vob2xkZXJzT3JTaWduZXJzLnB1c2gocGxhY2Vob2xkZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRVblNpZ25lZFNpZ25lcnMocGxhY2Vob2xkZXJzT3JTaWduZXJzKTtcbiAgICAgICAgc2V0UGRmRGV0YWlscyhkb2N1bWVudERhdGEpO1xuICAgICAgICBzZXRJc0xvYWRpbmcoe1xuICAgICAgICAgIGlzTG9hZDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBkb2N1bWVudERhdGEgPT09IFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiIHx8XG4gICAgICAgIChkb2N1bWVudERhdGEucmVzdWx0ICYmIGRvY3VtZW50RGF0YS5yZXN1bHQuZXJyb3IpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gZ2V0IHRlbXBsYXRlIGRldGFpbHMgXCIpO1xuICAgICAgICBzZXRIYW5kbGVFcnJvcihcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIik7XG4gICAgICAgIHNldElzTG9hZGluZyh7XG4gICAgICAgICAgaXNMb2FkOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEhhbmRsZUVycm9yKFwiTm8gRGF0YSBGb3VuZCFcIik7XG4gICAgICAgIHNldElzTG9hZGluZyh7XG4gICAgICAgICAgaXNMb2FkOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGdldCB0ZW1wbGF0ZSBkZXRhaWxzIFwiLCBlcnIpO1xuICAgICAgaWYgKGVycj8ucmVzcG9uc2U/LmRhdGE/LmNvZGUgPT09IDEwMSkge1xuICAgICAgICBzZXRIYW5kbGVFcnJvcihcIkVycm9yOiBUZW1wbGF0ZSBub3QgZm91bmQhXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SGFuZGxlRXJyb3IoXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLy9mdW5jdGlvbiBmb3IgZ2V0IGRvY3VtZW50IGRldGFpbHMgZm9yIHBlcnRpY3VsYXIgc2lnbmVyIHdpdGggc2lnbmVyJ29iamVjdCBpZFxuICBjb25zdCBnZXREb2N1bWVudERldGFpbHMgPSBhc3luYyAoZG9jSWQsIGlzTmV4dFVzZXIpID0+IHtcbiAgICBjb25zdCBzZW5kZXJVc2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxuICAgICk7XG4gICAgY29uc3QganNvblNlbmRlciA9IEpTT04ucGFyc2Uoc2VuZGVyVXNlcik7XG4gICAgbGV0IGN1cnJVc2VySWQ7XG4gICAgLy9nZXR0aW5nIGRvY3VtZW50IGRldGFpbHNcbiAgICBjb25zdCBkb2N1bWVudERhdGEgPSBhd2FpdCBjb250cmFjdERvY3VtZW50KGRvY3VtZW50SWQgfHwgZG9jSWQpO1xuICAgIGlmIChkb2N1bWVudERhdGEgJiYgZG9jdW1lbnREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHNldEV4dFVzZXJJZChkb2N1bWVudERhdGFbMF0/LkV4dFVzZXJQdHI/Lm9iamVjdElkKTtcbiAgICAgIGNvbnN0IGlzQ29tcGxldGVkID1cbiAgICAgICAgZG9jdW1lbnREYXRhWzBdLklzQ29tcGxldGVkICYmIGRvY3VtZW50RGF0YVswXS5Jc0NvbXBsZXRlZDtcbiAgICAgIGNvbnN0IGV4cGlyZURhdGUgPSBkb2N1bWVudERhdGFbMF0uRXhwaXJ5RGF0ZS5pc287XG4gICAgICBjb25zdCBkZWNsaW5lZCA9IGRvY3VtZW50RGF0YVswXS5Jc0RlY2xpbmVkICYmIGRvY3VtZW50RGF0YVswXS5Jc0RlY2xpbmVkO1xuICAgICAgY29uc3QgZXhwaXJlVXBkYXRlRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZURhdGUpLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IGN1cnJEYXRlID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICBjb25zdCBnZXRTaWduZXJzID0gZG9jdW1lbnREYXRhWzBdLlNpZ25lcnM7XG4gICAgICBjb25zdCBnZXRDdXJyZW50U2lnbmVyID1cbiAgICAgICAgZ2V0U2lnbmVycyAmJlxuICAgICAgICBnZXRTaWduZXJzLmZpbHRlcihcbiAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5Vc2VySWQub2JqZWN0SWQgPT09IGpzb25TZW5kZXI/Lm9iamVjdElkXG4gICAgICAgICk7XG5cbiAgICAgIGN1cnJVc2VySWQgPSBnZXRDdXJyZW50U2lnbmVyWzBdID8gZ2V0Q3VycmVudFNpZ25lclswXS5vYmplY3RJZCA6IFwiXCI7XG4gICAgICBpZiAoaXNFbmFibGVTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgYXdhaXQgY2hlY2tJc1N1YnNjcmliZWQoXG4gICAgICAgICAgZG9jdW1lbnREYXRhWzBdPy5FeHRVc2VyUHRyPy5vYmplY3RJZCxcbiAgICAgICAgICBjdXJyVXNlcklkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoY3VyclVzZXJJZCkge1xuICAgICAgICBzZXRTaWduZXJPYmplY3RJZChjdXJyVXNlcklkKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2N1bWVudERhdGFbMF0uU2lnbmVkVXJsKSB7XG4gICAgICAgIHNldFBkZlVybChkb2N1bWVudERhdGFbMF0uU2lnbmVkVXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFBkZlVybChkb2N1bWVudERhdGFbMF0uVVJMKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICBzZXRJc1NpZ25lZCh0cnVlKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICBpc0NlcnRpZmljYXRlOiB0cnVlLFxuICAgICAgICAgIGlzTW9kYWw6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgc2V0QWxyZWFkeVNpZ24odHJ1ZSk7XG4gICAgICAgIHNldElzQ29tcGxldGVkKGRhdGEpO1xuICAgICAgICBzZXRJc0NlbGVicmF0aW9uKHRydWUpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBzZXRJc0NlbGVicmF0aW9uKGZhbHNlKTtcbiAgICAgICAgfSwgNTAwMCk7XG4gICAgICB9IGVsc2UgaWYgKGRlY2xpbmVkKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREZWNsaW5lID0ge1xuICAgICAgICAgIGN1cnJudDogXCJhbm90aGVyXCIsXG4gICAgICAgICAgaXNEZWNsaW5lZDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBzZXRJc0RlY2xpbmUoY3VycmVudERlY2xpbmUpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyRGF0ZSA+IGV4cGlyZVVwZGF0ZURhdGUpIHtcbiAgICAgICAgY29uc3QgZXhwaXJlRGF0ZUZvcm1hdCA9IG1vbWVudChuZXcgRGF0ZShleHBpcmVEYXRlKSkuZm9ybWF0KFxuICAgICAgICAgIFwiTU1NIERELCBZWVlZXCJcbiAgICAgICAgKTtcbiAgICAgICAgc2V0SXNFeHBpcmVkKHRydWUpO1xuICAgICAgICBzZXRFeHBpcmVkRGF0ZShleHBpcmVEYXRlRm9ybWF0KTtcbiAgICAgIH0gLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgc2lnbmVyIGlzIG5vdCBhIGxhc3Qgc2lnbmVyIGFuZCBoYW5kbGUgdGhlIGNvbXBsZXRlIG1lc3NhZ2UuXG4gICAgICBlbHNlIGlmIChpc05leHRVc2VyKSB7XG4gICAgICAgIHNldElzQ2VsZWJyYXRpb24odHJ1ZSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHNldElzQ2VsZWJyYXRpb24oZmFsc2UpO1xuICAgICAgICB9LCA1MDAwKTtcbiAgICAgICAgc2V0SXNDb21wbGV0ZWQoe1xuICAgICAgICAgIGlzTW9kYWw6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgIFwiWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IHNpZ25lZCB0aGUgZG9jdW1lbnQuIFlvdSBjYW4gZG93bmxvYWQgb3IgcHJpbnQgYSBjb3B5IG9mIHRoZSBwYXJ0aWFsbHkgc2lnbmVkIGRvY3VtZW50LiBBIGNvcHkgb2YgdGhlIGRpZ2l0YWxseSBzaWduZWQgZG9jdW1lbnQgd2lsbCBiZSBzZW50IHRvIHRoZSBvd25lciBvdmVyIGVtYWlsIG9uY2UgaXQgaXMgc2lnbmVkIGJ5IGFsbCBzaWduZXJzLlwiXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJVc2VySWQpIHtcbiAgICAgICAgICBjb25zdCBjaGVja0N1cnJlbnRVc2VyID0gZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycy5maW5kKFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGE/LnNpZ25lck9iaklkID09PSBjdXJyVXNlcklkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY2hlY2tDdXJyZW50VXNlcikge1xuICAgICAgICAgICAgc2V0Q3VycmVudFNpZ25lcih0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGF1ZGl0dHJhaWxEYXRhID1cbiAgICAgICAgZG9jdW1lbnREYXRhWzBdLkF1ZGl0VHJhaWwgJiZcbiAgICAgICAgZG9jdW1lbnREYXRhWzBdLkF1ZGl0VHJhaWwubGVuZ3RoID4gMCAmJlxuICAgICAgICBkb2N1bWVudERhdGFbMF0uQXVkaXRUcmFpbC5maWx0ZXIoKGRhdGEpID0+IGRhdGEuQWN0aXZpdHkgPT09IFwiU2lnbmVkXCIpO1xuXG4gICAgICBjb25zdCBjaGVja0FscmVhZHlTaWduID1cbiAgICAgICAgZG9jdW1lbnREYXRhWzBdLkF1ZGl0VHJhaWwgJiZcbiAgICAgICAgZG9jdW1lbnREYXRhWzBdLkF1ZGl0VHJhaWwubGVuZ3RoID4gMCAmJlxuICAgICAgICBkb2N1bWVudERhdGFbMF0uQXVkaXRUcmFpbC5maWx0ZXIoXG4gICAgICAgICAgKGRhdGEpID0+XG4gICAgICAgICAgICBkYXRhLlVzZXJQdHIub2JqZWN0SWQgPT09IGN1cnJVc2VySWQgJiYgZGF0YS5BY3Rpdml0eSA9PT0gXCJTaWduZWRcIlxuICAgICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBjaGVja0FscmVhZHlTaWduICYmXG4gICAgICAgIGNoZWNrQWxyZWFkeVNpZ25bMF0gJiZcbiAgICAgICAgY2hlY2tBbHJlYWR5U2lnbi5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgc2V0QWxyZWFkeVNpZ24odHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBvYmogPSBkb2N1bWVudERhdGE/LlswXTtcbiAgICAgICAgc2V0U2VuZEluT3JkZXIob2JqPy5TZW5kaW5PcmRlciB8fCBmYWxzZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBvYmogJiZcbiAgICAgICAgICBvYmouU2lnbmVycyAmJlxuICAgICAgICAgIG9iai5TaWduZXJzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBvYmouUGxhY2Vob2xkZXJzICYmXG4gICAgICAgICAgb2JqLlBsYWNlaG9sZGVycy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIGV2ZW50OiBcInZpZXdlZFwiLFxuICAgICAgICAgICAgY29udGFjdElkOiBjdXJyVXNlcklkLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICBvYmplY3RJZDogZG9jdW1lbnREYXRhPy5bMF0ub2JqZWN0SWQsXG4gICAgICAgICAgICAgIGZpbGU6IGRvY3VtZW50RGF0YT8uWzBdPy5TaWduZWRVcmwgfHwgZG9jdW1lbnREYXRhPy5bMF0/LlVSTCxcbiAgICAgICAgICAgICAgbmFtZTogZG9jdW1lbnREYXRhPy5bMF0uTmFtZSxcbiAgICAgICAgICAgICAgbm90ZTogZG9jdW1lbnREYXRhPy5bMF0uTm90ZSB8fCBcIlwiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZG9jdW1lbnREYXRhPy5bMF0uRGVzY3JpcHRpb24gfHwgXCJcIixcbiAgICAgICAgICAgICAgc2lnbmVyczogZG9jdW1lbnREYXRhPy5bMF0uU2lnbmVycz8ubWFwKCh4KSA9PiAoe1xuICAgICAgICAgICAgICAgIG5hbWU6IHg/Lk5hbWUsXG4gICAgICAgICAgICAgICAgZW1haWw6IHg/LkVtYWlsLFxuICAgICAgICAgICAgICAgIHBob25lOiB4Py5QaG9uZVxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgIHZpZXdlZEJ5OiBqc29uU2VuZGVyLmVtYWlsLFxuICAgICAgICAgICAgICB2aWV3ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBkb2N1bWVudERhdGE/LlswXS5jcmVhdGVkQXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICAgICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvY2FsbHdlYmhvb2tgLFxuICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICAgICAgICAgICAgICBzZXNzaW9udG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVyciBcIiwgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNpZ25lcnMgPSBbXTtcbiAgICAgIGxldCB1blNpZ25lZFNpZ25lciA9IFtdO1xuXG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnNPclNpZ25lcnMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcGxhY2Vob2xkZXIgb2YgZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycykge1xuICAgICAgICAvL2BlbWFpbEV4aXN0YCB2YXJpYWJsZSB0byBoYW5kbGUgY29uZGl0aW9uIGZvciBxdWljayBzZW5kIGZsb3cgYW5kIHNob3cgdW5zaWduZWQgc2lnbmVycyBsaXN0XG4gICAgICAgIGNvbnN0IHNpZ25lcklkRXhpc3QgPSBwbGFjZWhvbGRlcj8uc2lnbmVyT2JqSWQ7XG4gICAgICAgIGlmIChzaWduZXJJZEV4aXN0KSB7XG4gICAgICAgICAgY29uc3QgZ2V0U2lnbmVyRGF0YSA9IGRvY3VtZW50RGF0YVswXS5TaWduZXJzLmZpbmQoXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5vYmplY3RJZCA9PT0gcGxhY2Vob2xkZXI/LnNpZ25lck9iaklkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwbGFjZWhvbGRlcnNPclNpZ25lcnMucHVzaChnZXRTaWduZXJEYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwbGFjZWhvbGRlcnNPclNpZ25lcnMucHVzaChwbGFjZWhvbGRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIGFscmVhZHkgc2lnbmVkIGRvY3VtZW50IGJ5IHNvbWVvbmVcbiAgICAgIGlmIChhdWRpdHRyYWlsRGF0YSAmJiBhdWRpdHRyYWlsRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNldElzRG9jSWQodHJ1ZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBsYWNlaG9sZGVyc09yU2lnbmVycykge1xuICAgICAgICAgIGNvbnN0IGNoZWNrRW1haWwgPSBpdGVtPy5lbWFpbDtcbiAgICAgICAgICAvL2lmIGVtYWlsIGV4aXN0IHRoZW4gY29tcGFyZSB1c2VyIHNpZ25lZCBieSB1c2luZyBlbWFpbCBlbHNlIHNpZ25lcnMgb2JqZWN0SWRcbiAgICAgICAgICBjb25zdCBlbWFpbE9ySWQgPSBjaGVja0VtYWlsID8gaXRlbS5lbWFpbCA6IGl0ZW0ub2JqZWN0SWQ7XG4gICAgICAgICAgLy9gaXNTaWduZWRTaWduYXR1cmVgIHZhcmlhYmxlIHRvIGhhbmRsZSBicmVhayBsb29wIHdoZW5ldmVyIGl0IGdldCB0cnVlXG4gICAgICAgICAgbGV0IGlzU2lnbmVkU2lnbmF0dXJlID0gZmFsc2U7XG4gICAgICAgICAgLy9jaGVja2luZyB0aGUgc2lnbmVyIHdobyBzaWduZWQgdGhlIGRvY3VtZW50IGJ5IHVzaW5nIGF1ZGl0IHRyYWlsIGRldGFpbHMuXG4gICAgICAgICAgLy9hbmQgc2F2ZSBzaWduZWRTaWduZXJzIGFuZCB1bnNpZ25lZFNpZ25lcnMgZGV0YWlsc1xuICAgICAgICAgIGZvciAoY29uc3QgZG9jIG9mIGF1ZGl0dHJhaWxEYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBzaWduZWRFeGlzdCA9IGNoZWNrRW1haWxcbiAgICAgICAgICAgICAgPyBkb2M/LlVzZXJQdHIuRW1haWxcbiAgICAgICAgICAgICAgOiBkb2M/LlVzZXJQdHIub2JqZWN0SWQ7XG5cbiAgICAgICAgICAgIGlmIChlbWFpbE9ySWQgPT09IHNpZ25lZEV4aXN0KSB7XG4gICAgICAgICAgICAgIHNpZ25lcnMucHVzaCh7IC4uLml0ZW0gfSk7XG4gICAgICAgICAgICAgIGlzU2lnbmVkU2lnbmF0dXJlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNTaWduZWRTaWduYXR1cmUpIHtcbiAgICAgICAgICAgIHVuU2lnbmVkU2lnbmVyLnB1c2goeyAuLi5pdGVtIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRTaWduZWRTaWduZXJzKHNpZ25lcnMpO1xuICAgICAgICBzZXRVblNpZ25lZFNpZ25lcnModW5TaWduZWRTaWduZXIpO1xuICAgICAgICBzZXRTaWduZXJQb3MoZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIGlzIHNob3cgdGhlcmUgYXJlIG5vIGRldGFpbHMgaW4gYXVkaXQgdHJhaWwgdGhlbiBkaXJlY3QgcHVzaCBhbGwgc2lnbmVycyBkZXRhaWxzXG4gICAgICAgIC8vaW4gdW5zaWduZWRzaWduZXJzIGFycmF5XG4gICAgICAgIHNldFVuU2lnbmVkU2lnbmVycyhwbGFjZWhvbGRlcnNPclNpZ25lcnMpO1xuICAgICAgICBzZXRTaWduZXJQb3MoZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycyk7XG4gICAgICB9XG4gICAgICBzZXRQZGZEZXRhaWxzKGRvY3VtZW50RGF0YSk7XG4gICAgICAvL2NoZWNraW5nIGlmIGNvbmRpdGlvbiBjdXJyZW50IHVzZXIgYWxyZWFkeSBzaWduIG9yIG93bmVyIGRvZXMgbm90IGV4aXN0IGFzIGEgc2lnbmVyIG9yIGRvY3VtZW50IGhhcyBiZWVuIGRlY2xpbmVkIGJ5IHNvbWVvbmUgb3IgZG9jdW1lbnQgaGFzIGJlZW4gZXhwaXJlZFxuICAgICAgLy90aGVuIHN0b3AgdG8gZGlzcGxheSB0b3VyIG1lc3NhZ2VcbiAgICAgIGlmIChcbiAgICAgICAgKGNoZWNrQWxyZWFkeVNpZ24gJiZcbiAgICAgICAgICBjaGVja0FscmVhZHlTaWduWzBdICYmXG4gICAgICAgICAgY2hlY2tBbHJlYWR5U2lnbi5sZW5ndGggPiAwKSB8fFxuICAgICAgICAhY3VyclVzZXJJZCB8fFxuICAgICAgICBkZWNsaW5lZCB8fFxuICAgICAgICBjdXJyRGF0ZSA+IGV4cGlyZVVwZGF0ZURhdGVcbiAgICAgICkge1xuICAgICAgICBzZXRSZXF1ZXN0U2lnblRvdXIodHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIHRvIGNoZWNrIGN1cnJlbnQgdXNlciBleGlzdCBpbiBjb250cmFjdHNfVXNlcnMgY2xhc3MgYW5kIGNoZWNrIHRvdXIgbWVzc2FnZSBzdGF0dXNcbiAgICAgICAgLy9pZiBub3QgdGhlbiBjaGVjayB1c2VyIGV4aXN0IGluIGNvbnRyYWN0c19Db250YWN0Ym9vayBjbGFzcyBhbmQgY2hlY2sgdG91ciBtZXNzYWdlIHN0YXR1XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvbnRyYWN0VXNlcnMoKTtcbiAgICAgICAgaWYgKHJlcyA9PT0gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpIHtcbiAgICAgICAgICBzZXRIYW5kbGVFcnJvcihcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzWzBdICYmIHJlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgc2V0Q29udHJhY3ROYW1lKFwiX1VzZXJzXCIpO1xuICAgICAgICAgIGN1cnJVc2VySWQgPSByZXNbMF0ub2JqZWN0SWQ7XG4gICAgICAgICAgc2V0U2lnbmVyVXNlcklkKGN1cnJVc2VySWQpO1xuICAgICAgICAgIGNvbnN0IHRvdXJEYXRhID0gcmVzWzBdLlRvdXJTdGF0dXMgJiYgcmVzWzBdLlRvdXJTdGF0dXM7XG4gICAgICAgICAgaWYgKHRvdXJEYXRhICYmIHRvdXJEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrVG91clJlcXVlc3QgPSB0b3VyRGF0YS5maWx0ZXIoXG4gICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhPy5yZXF1ZXN0U2lnblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHNldFRvdXJTdGF0dXModG91ckRhdGEpO1xuICAgICAgICAgICAgc2V0UmVxdWVzdFNpZ25Ub3VyKGNoZWNrVG91clJlcXVlc3RbMF0/LnJlcXVlc3RTaWduIHx8IGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjb250YWN0Qm9vayhjdXJyVXNlcklkKTtcbiAgICAgICAgICBpZiAocmVzID09PSBcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIikge1xuICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IoXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzWzBdICYmIHJlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNldENvbnRyYWN0TmFtZShcIl9Db250YWN0Ym9va1wiKTtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gcmVzWzBdLm9iamVjdElkO1xuICAgICAgICAgICAgc2V0U2lnbmVyVXNlcklkKG9iamVjdElkKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdXJEYXRhID0gcmVzWzBdLlRvdXJTdGF0dXMgJiYgcmVzWzBdLlRvdXJTdGF0dXM7XG4gICAgICAgICAgICBpZiAodG91ckRhdGEgJiYgdG91ckRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBjaGVja1RvdXJSZXF1ZXN0ID0gdG91ckRhdGEuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhPy5yZXF1ZXN0U2lnblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBzZXRUb3VyU3RhdHVzKHRvdXJEYXRhKTtcbiAgICAgICAgICAgICAgc2V0UmVxdWVzdFNpZ25Ub3VyKGNoZWNrVG91clJlcXVlc3RbMF0/LnJlcXVlc3RTaWduIHx8IGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHNldEhhbmRsZUVycm9yKFwiRXJyb3I6IFVzZXIgZG9lcyBub3QgZXhpc3QhXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0SXNVaUxvYWRpbmcoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBkb2N1bWVudERhdGEgPT09IFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiIHx8XG4gICAgICAoZG9jdW1lbnREYXRhLnJlc3VsdCAmJiBkb2N1bWVudERhdGEucmVzdWx0LmVycm9yKVxuICAgICkge1xuICAgICAgc2V0SGFuZGxlRXJyb3IoXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpO1xuICAgICAgc2V0SXNMb2FkaW5nKHtcbiAgICAgICAgaXNMb2FkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZyhcImVyciBpbiAgZ2V0RG9jdW1lbnQgY2xvdWQgZnVuY3Rpb24gXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRIYW5kbGVFcnJvcihcIk5vIERhdGEgRm91bmQhXCIpO1xuICAgICAgc2V0SXNVaUxvYWRpbmcoe1xuICAgICAgICBpc0xvYWQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gICAgYXdhaXQgYXhpb3NcbiAgICAgIC5nZXQoXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgICAgIFwiYmFzZVVybFwiXG4gICAgICAgICl9Y2xhc3Nlcy9jb250cmFjdHNfU2lnbmF0dXJlP3doZXJlPXtcIlVzZXJJZFwiOiB7XCJfX3R5cGVcIjogXCJQb2ludGVyXCIsXCJjbGFzc05hbWVcIjogXCJfVXNlclwiLCBcIm9iamVjdElkXCI6XCIke1xuICAgICAgICAgIGpzb25TZW5kZXI/Lm9iamVjdElkXG4gICAgICAgIH1cIn19YCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIC50aGVuKChMaXN0ZGF0YSkgPT4ge1xuICAgICAgICBjb25zdCBqc29uID0gTGlzdGRhdGEuZGF0YTtcbiAgICAgICAgY29uc3QgcmVzID0ganNvbi5yZXN1bHRzO1xuXG4gICAgICAgIGlmIChyZXNbMF0gJiYgcmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXREZWZhdWx0U2lnbkltZyhyZXNbMF0uSW1hZ2VVUkwpO1xuICAgICAgICAgIHNldE15SW5pdGlhbChyZXNbMF0/LkluaXRpYWxzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvYWRPYmogPSB7XG4gICAgICAgICAgaXNMb2FkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBzZXRJc0xvYWRpbmcobG9hZE9iaik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJFcnIgaW4gY29udHJhY3RzX1NpZ25hdHVyZSBjbGFzc1wiLCBlcnIpO1xuICAgICAgICBzZXRIYW5kbGVFcnJvcihcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIik7XG4gICAgICAgIHNldElzTG9hZGluZyh7XG4gICAgICAgICAgaXNMb2FkOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9O1xuICAvL2Z1bmN0aW9uIGZvciBlbWJlZCBzaWduYXR1cmUgb3IgaW1hZ2UgdXJsIGluIHBkZlxuICBhc3luYyBmdW5jdGlvbiBlbWJlZFdpZGdldHNEYXRhKCkge1xuICAgIC8vZm9yIGVtYWlsVmVyaWZpZWQgZGF0YSBjaGVja2luZyBmaXJzdCBpbiBsb2NhbHN0b3JhZ2VcbiAgICBjb25zdCBsb2NhbHVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgIGBQYXJzZS8ke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKX0vY3VycmVudFVzZXJgXG4gICAgKTtcbiAgICBsZXQgY3VycmVudFVzZXIgPSBKU09OLnBhcnNlKGxvY2FsdXNlcik7XG4gICAgLy9pZiBlbWFpbFZlcmlmaWVkIGRhdGEgaXMgbm90IHByZXNlbnQgaW4gbG9jYWwgdXNlciBkZXRhaWxzIHRoZW4gZmV0Y2ggYWdhaW4gaW4gX1VzZXIgY2xhc3NcbiAgICBpZiAoIWN1cnJlbnRVc2VyPy5lbWFpbFZlcmlmaWVkKSB7XG4gICAgICBjb25zdCB1c2VyUXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoUGFyc2UuVXNlcik7XG4gICAgICBjb25zdCBnZXRVc2VyID0gYXdhaXQgdXNlclF1ZXJ5LmdldChjdXJyZW50VXNlcj8ub2JqZWN0SWQsIHtcbiAgICAgICAgc2Vzc2lvblRva2VuOiBjdXJyZW50VXNlcj8uc2Vzc2lvblRva2VuXG4gICAgICB9KTtcbiAgICAgIGlmIChnZXRVc2VyKSB7XG4gICAgICAgIGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnZXRVc2VyKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBpc0VtYWlsVmVyaWZpZWQgPSBjdXJyZW50VXNlcj8uZW1haWxWZXJpZmllZDtcbiAgICAvL2NoZWNrIGlmIGlzRW1haWxWZXJpZmllZCB0aGVuIGdvIG9uIG5leHQgc3RlcFxuICAgIGlmIChpc0VtYWlsVmVyaWZpZWQpIHtcbiAgICAgIHNldElzRW1haWxWZXJpZmllZChpc0VtYWlsVmVyaWZpZWQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2hlY2tVc2VyID0gc2lnbmVyUG9zLmZpbHRlcihcbiAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNoZWNrVXNlciAmJiBjaGVja1VzZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxldCBjaGVja2JveEV4aXN0LFxuICAgICAgICAgICAgcmVxdWlyZWRSYWRpbyxcbiAgICAgICAgICAgIHNob3dBbGVydCA9IGZhbHNlLFxuICAgICAgICAgICAgd2lkZ2V0S2V5LFxuICAgICAgICAgICAgcmFkaW9FeGlzdCxcbiAgICAgICAgICAgIHJlcXVpcmVkQ2hlY2tib3gsXG4gICAgICAgICAgICBUb3VyUGFnZU51bWJlcjsgLy8gYHBhZ2VOdW1iZXJgIGlzIHVzZWQgdG8gY2hlY2sgb24gd2hpY2ggcGFnZSB1c2VyIGRpZCBub3QgZmlsbCB3aWRnZXQncyBkYXRhIHRoZW4gY2hhbmdlIGN1cnJlbnQgcGFnZU51bWJlciBhbmQgc2hvdyB0b3VyIG1lc3NhZ2Ugb24gdGhhdCBwYWdlXG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrVXNlclswXS5wbGFjZUhvbGRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIC8vZ2V0IGN1cnJlbnQgcGFnZVxuICAgICAgICAgICAgICBjb25zdCB1cGRhdGVQYWdlID0gY2hlY2tVc2VyWzBdLnBsYWNlSG9sZGVyW2ldPy5wYWdlTnVtYmVyO1xuICAgICAgICAgICAgICAvL2NoZWNraW5nIGNoZWNib3ggdHlwZSB3aWRnZXRcbiAgICAgICAgICAgICAgY2hlY2tib3hFeGlzdCA9XG4gICAgICAgICAgICAgICAgY2hlY2tVc2VyWzBdLnBsYWNlSG9sZGVyW2ldLnBvc1tqXS50eXBlID09PSBcImNoZWNrYm94XCI7XG4gICAgICAgICAgICAgIC8vY2hlY2tpbmcgcmFkaW8gYnV0dG9uIHR5cGUgd2lkZ2V0XG4gICAgICAgICAgICAgIHJhZGlvRXhpc3QgPVxuICAgICAgICAgICAgICAgIGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXS5wb3Nbal0udHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQ7XG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIGNoZWNrYm94IHdpZGdldCBleGlzdCBvciBub3RcbiAgICAgICAgICAgICAgaWYgKGNoZWNrYm94RXhpc3QpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBhbGwgcmVxdWlyZWQgdHlwZSBjaGVja2JveFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2hlY2tib3ggPSBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIChwb3NpdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgIXBvc2l0aW9uLm9wdGlvbnM/LmlzUmVhZE9ubHkgJiZcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24udHlwZSA9PT0gXCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAvL2lmIHJlcXVpcmVkIHR5cGUgY2hlY2tib3ggZGF0YSBleGl0IHRoZW4gY2hlY2sgdXNlciBjaGVja2VkIGFsbCBjaGVja2JveCBvciBzb21lIGNoZWNrYm94IHJlbWFpbiB0byBjaGVja1xuICAgICAgICAgICAgICAgIC8vYWxzbyB2YWxpZGF0ZSB0byBtaW5pbXVtIGFuZCBtYXhpbXVtIHJlcXVpcmVkIGNoZWNrYm94XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkQ2hlY2tib3ggJiYgcmVxdWlyZWRDaGVja2JveC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVpcmVkQ2hlY2tib3gubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgbWluaW11bSByZXF1aXJlZCBjb3VudCBpZiAgZXhpdFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtaW5Db3VudCA9XG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRDaGVja2JveFtpXS5vcHRpb25zPy52YWxpZGF0aW9uPy5taW5SZXF1aXJlZENvdW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZU1pbiA9IG1pbkNvdW50ICYmIHBhcnNlSW50KG1pbkNvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgbWF4aW11bSByZXF1aXJlZCBjb3VudCBpZiAgZXhpdFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhDb3VudCA9XG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRDaGVja2JveFtpXS5vcHRpb25zPy52YWxpZGF0aW9uPy5tYXhSZXF1aXJlZENvdW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZU1heCA9IG1heENvdW50ICYmIHBhcnNlSW50KG1heENvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgLy9pbiBgcmVzcG9uc2VgIHZhcmlhYmxlIGlzIHVzZWQgdG8gZ2V0IGhvdyBtYW55IGNoZWNrYm94IGNoZWNrZWQgYnkgdXNlclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9XG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRDaGVja2JveFtpXS5vcHRpb25zPy5yZXNwb25zZT8ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAvL2luIGBkZWZhdWx0VmFsdWVgIHZhcmlhYmxlIGlzIHVzZWQgdG8gZ2V0IGhvdyBtYW55IGNoZWNrYm94IGNoZWNrZWQgYnkgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2hlY2tib3hbaV0ub3B0aW9ucz8uZGVmYXVsdFZhbHVlPy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrICBwYXJzZU1pbiAgYW5kIHBhcnNlTWF4IGdyZWF0ZXIgdGhhbiAwICB0aGVuIGNvbnNpZGVyIGl0IGFzIGEgcmVxdWlyZWQgY2hlY2sgYm94XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBwYXJzZU1pbiA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICBwYXJzZU1heCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhcmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhZGVmYXVsdFZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgIXNob3dBbGVydFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICBzaG93QWxlcnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIHdpZGdldEtleSA9IHJlcXVpcmVkQ2hlY2tib3hbaV0ua2V5O1xuICAgICAgICAgICAgICAgICAgICAgIFRvdXJQYWdlTnVtYmVyID0gdXBkYXRlUGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRtaW5SZXF1aXJlZENvdW50KHBhcnNlTWluKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIHRvIHZhbGlkYXRlIG1pbmltdW0gcmVxdWlyZWQgY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgcGFyc2VNaW4gPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHBhcnNlTWluID4gcmVzcG9uc2UgfHwgIXJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dBbGVydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FsZXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldEtleSA9IHJlcXVpcmVkQ2hlY2tib3hbaV0ua2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgVG91clBhZ2VOdW1iZXIgPSB1cGRhdGVQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0bWluUmVxdWlyZWRDb3VudChwYXJzZU1pbik7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIHJhZGlvIHdpZGdldCBleGlzdCBvciBub3RcbiAgICAgICAgICAgICAgZWxzZSBpZiAocmFkaW9FeGlzdCkge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGFsbCByZXF1aXJlZCB0eXBlIHJhZGlvIGJ1dHRvblxuICAgICAgICAgICAgICAgIHJlcXVpcmVkUmFkaW8gPSBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIChwb3NpdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgIXBvc2l0aW9uLm9wdGlvbnM/LmlzUmVhZE9ubHkgJiZcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24udHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vaWYgcmVxdWlyZWQgdHlwZSByYWRpbyBkYXRhIGV4aXQgdGhlbiBjaGVjayB1c2VyIGNoZWNrZWQgYWxsIHJhZGlvIGJ1dHRvbiBvciBzb21lIHJhZGlvIHJlbWFpbiB0byBjaGVja1xuICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFJhZGlvICYmIHJlcXVpcmVkUmFkaW8/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGxldCBjaGVja1NpZ25lZDtcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWlyZWRSYWRpbz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTaWduZWQgPSByZXF1aXJlZFJhZGlvW2ldPy5vcHRpb25zPy5yZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja1NpZ25lZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGVja0RlZmF1bHRTaWduZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRSYWRpb1tpXT8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tEZWZhdWx0U2lnbmVkICYmICFzaG93QWxlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBbGVydCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRLZXkgPSByZXF1aXJlZFJhZGlvW2ldLmtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRvdXJQYWdlTnVtYmVyID0gdXBkYXRlUGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldG1pblJlcXVpcmVkQ291bnQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vZWxzZSBjb25kaXRpb24gdG8gY2hlY2sgYWxsIHR5cGUgd2lkZ2V0IGRhdGEgZmlsbCBvciBub3QgZXhjZXB0IGNoZWNrYm94IGFuZCByYWRpbyBidXR0b25cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgYWxsIHJlcXVpcmVkIHR5cGUgd2lkZ2V0cyBleGNlcHQgY2hlY2tib3ggYW5kIHJhZGlvXG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRXaWRnZXRzID0gY2hlY2tVc2VyWzBdLnBsYWNlSG9sZGVyW2ldLnBvcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAocG9zaXRpb24pID0+XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLm9wdGlvbnM/LnN0YXR1cyA9PT0gXCJyZXF1aXJlZFwiICYmXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnR5cGUgIT09IFwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkV2lkZ2V0cyAmJiByZXF1aXJlZFdpZGdldHM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGxldCBjaGVja1NpZ25lZDtcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWlyZWRXaWRnZXRzPy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjaGVja1NpZ25lZCA9IHJlcXVpcmVkV2lkZ2V0c1tpXT8ub3B0aW9ucz8ucmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tTaWduZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja1NpZ25VcmwgPSByZXF1aXJlZFdpZGdldHNbaV0/LnBvcz8uU2lnblVybDtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrU2lnblVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrRGVmYXVsdFNpZ25lZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkV2lkZ2V0c1tpXT8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0RlZmF1bHRTaWduZWQgJiYgIXNob3dBbGVydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWxlcnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRLZXkgPSByZXF1aXJlZFdpZGdldHNbaV0ua2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBUb3VyUGFnZU51bWJlciA9IHVwZGF0ZVBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldG1pblJlcXVpcmVkQ291bnQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL3doZW4gc2hvd0FsZXJ0IGlzIHRydWUgdGhlbiBicmVhayB0aGUgbG9vcCBhbmQgc2hvdyBhbGVydCB0byBmaWxsIHJlcXVpcmVkIGRhdGEgaW4gd2lkZ2V0c1xuICAgICAgICAgICAgaWYgKHNob3dBbGVydCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNoZWNrYm94RXhpc3QgJiYgcmVxdWlyZWRDaGVja2JveCAmJiBzaG93QWxlcnQpIHtcbiAgICAgICAgICAgIHNldFVuU2lnbmVkV2lkZ2V0SWQod2lkZ2V0S2V5KTtcbiAgICAgICAgICAgIHNldFBhZ2VOdW1iZXIoVG91clBhZ2VOdW1iZXIpO1xuICAgICAgICAgICAgc2V0V2lkZ2V0c1RvdXIodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChyYWRpb0V4aXN0ICYmIHNob3dBbGVydCkge1xuICAgICAgICAgICAgc2V0VW5TaWduZWRXaWRnZXRJZCh3aWRnZXRLZXkpO1xuICAgICAgICAgICAgc2V0UGFnZU51bWJlcihUb3VyUGFnZU51bWJlcik7XG4gICAgICAgICAgICBzZXRXaWRnZXRzVG91cih0cnVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNob3dBbGVydCkge1xuICAgICAgICAgICAgc2V0VW5TaWduZWRXaWRnZXRJZCh3aWRnZXRLZXkpO1xuICAgICAgICAgICAgc2V0UGFnZU51bWJlcihUb3VyUGFnZU51bWJlcik7XG4gICAgICAgICAgICBzZXRXaWRnZXRzVG91cih0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0SXNVaUxvYWRpbmcodHJ1ZSk7XG4gICAgICAgICAgICAvLyBgd2lkZ2V0c2AgaXMgVXNlZCB0byByZXR1cm4gd2lkZ2V0cyBkZXRhaWxzIHdpdGggcGFnZSBudW1iZXIgb2YgY3VycmVudCB1c2VyXG4gICAgICAgICAgICBjb25zdCB3aWRnZXRzID0gY2hlY2tVc2VyPy5bMF0/LnBsYWNlSG9sZGVyO1xuICAgICAgICAgICAgbGV0IHBkZkFyckJ1ZmZlcjtcbiAgICAgICAgICAgIC8vYGNvbnRyYWN0RG9jdW1lbnRgIGZ1bmN0aW9uIHVzZWQgdG8gZ2V0IHVwZGF0ZWQgU2lnbmVkVXJsXG4gICAgICAgICAgICAvL3Jlc29sdmVkIGlzc3VlIG9mIHNpZ24gZG9jdW1lbnQgYnkgbXVsdGlwbGUgc2lnbmVycyBzaW11bHRhbmVvdXNseVxuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnREYXRhID0gYXdhaXQgY29udHJhY3REb2N1bWVudChkb2N1bWVudElkKTtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudERhdGEgJiYgZG9jdW1lbnREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgdXJsID0gZG9jdW1lbnREYXRhWzBdPy5TaWduZWRVcmwgfHwgZG9jdW1lbnREYXRhWzBdPy5VUkw7XG4gICAgICAgICAgICAgIC8vY29udmVydCBkb2N1bWVudCB1cmwgaW4gYXJyYXkgYnVmZmVyIGZvcm1hdCB0byB1c2UgZW1iZWQgd2lkZ2V0cyBpbiBwZGYgdXNpbmcgcGRmLWxpYlxuICAgICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGNvbnZlcnRQZGZBcnJheUJ1ZmZlcih1cmwpO1xuICAgICAgICAgICAgICBpZiAoYXJyYXlCdWZmZXIgPT09IFwiRXJyb3JcIikge1xuICAgICAgICAgICAgICAgIHNldEhhbmRsZUVycm9yKFwiRXJyb3I6IGludmFsaWQgZG9jdW1lbnQhXCIpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBkZkFyckJ1ZmZlciA9IGFycmF5QnVmZmVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBkb2N1bWVudERhdGEgPT09IFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiIHx8XG4gICAgICAgICAgICAgIChkb2N1bWVudERhdGEucmVzdWx0ICYmIGRvY3VtZW50RGF0YS5yZXN1bHQuZXJyb3IpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IoXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IoXCJEb2N1bWVudCBub3QgRm91bmQhXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBMb2FkIGEgUERGRG9jdW1lbnQgZnJvbSB0aGUgZXhpc3RpbmcgUERGIGJ5dGVzXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ1BkZkJ5dGVzID0gcGRmQXJyQnVmZmVyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZChleGlzdGluZ1BkZkJ5dGVzKTtcbiAgICAgICAgICAgICAgY29uc3QgaXNTaWduWW91clNlbGZGbG93ID0gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IGV4dFVzZXJQdHIgPSBwZGZEZXRhaWxzWzBdLkV4dFVzZXJQdHI7XG4gICAgICAgICAgICAgIGNvbnN0IEhlYWRlckRvY0lkID0gZXh0VXNlclB0cj8uSGVhZGVyRG9jSWQ7XG4gICAgICAgICAgICAgIC8vZW1iZWQgZG9jdW1lbnQncyBvYmplY3QgaWQgdG8gYWxsIHBhZ2VzIGluIHBkZiBkb2N1bWVudFxuICAgICAgICAgICAgICBpZiAoIUhlYWRlckRvY0lkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0RvY0lkKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBlbWJlZERvY0lkKHBkZkRvYywgZG9jdW1lbnRJZCwgYWxsUGFnZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL2VtYmVkIG11bHRpIHNpZ25hdHVyZSBpbiBwZGZcbiAgICAgICAgICAgICAgY29uc3QgcGRmQnl0ZXMgPSBhd2FpdCBtdWx0aVNpZ25FbWJlZChcbiAgICAgICAgICAgICAgICB3aWRnZXRzLFxuICAgICAgICAgICAgICAgIHBkZkRvYyxcbiAgICAgICAgICAgICAgICBpc1NpZ25Zb3VyU2VsZkZsb3csXG4gICAgICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSCxcbiAgICAgICAgICAgICAgICBjb250YWluZXJXSFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBkZnRlXCIsIHBkZkJ5dGVzKTtcbiAgICAgICAgICAgICAgLy9nZXQgRXhpc3RVc2VyUHRyIG9iamVjdCBpZCBvZiB1c2VyIGNsYXNzIHRvIGdldCB0ZW5hbnREZXRhaWxzXG4gICAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gcGRmRGV0YWlscz8uWzBdPy5FeHRVc2VyUHRyPy5Vc2VySWQ/Lm9iamVjdElkO1xuICAgICAgICAgICAgICAvL2dldCBFeGlzdFVzZXJQdHIgZW1haWwgdG8gZ2V0IHVzZXJEZXRhaWxzXG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvbnRyYWN0VXNlcnMoKTtcbiAgICAgICAgICAgICAgbGV0IGFjdGl2ZU1haWxBZGFwdGVyID0gXCJcIjtcbiAgICAgICAgICAgICAgaWYgKHJlcyA9PT0gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpIHtcbiAgICAgICAgICAgICAgICBzZXRIYW5kbGVFcnJvcihcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIik7XG4gICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nKHsgaXNMb2FkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzIHx8IHJlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlTWFpbEFkYXB0ZXIgPSBcIlwiO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc1swXSAmJiByZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlTWFpbEFkYXB0ZXIgPSByZXNbMF0/LmFjdGl2ZV9tYWlsX2FkYXB0ZXI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9mdW5jdGlvbiBmb3IgY2FsbCB0byBlbWJlZCBzaWduYXR1cmUgaW4gcGRmIGFuZCBnZXQgZGlnaXRhbCBzaWduYXR1cmUgcGRmXG4gICAgICAgICAgICAgIGNvbnN0IHJlc1NpZ24gPSBhd2FpdCBzaWduUGRmRnVuKFxuICAgICAgICAgICAgICAgIHBkZkJ5dGVzLFxuICAgICAgICAgICAgICAgIGRvY3VtZW50SWQsXG4gICAgICAgICAgICAgICAgc2lnbmVyT2JqZWN0SWQsXG4gICAgICAgICAgICAgICAgb2JqZWN0SWQsXG4gICAgICAgICAgICAgICAgaXNTdWJzY3JpYmVkLFxuICAgICAgICAgICAgICAgIGFjdGl2ZU1haWxBZGFwdGVyLFxuICAgICAgICAgICAgICAgIHdpZGdldHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHJlc1NpZ24gJiYgcmVzU2lnbi5zdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgICAgc2V0UGRmVXJsKHJlcy5kYXRhKTtcbiAgICAgICAgICAgICAgICBzZXRJc1NpZ25lZCh0cnVlKTtcbiAgICAgICAgICAgICAgICBzZXRTaWduZWRTaWduZXJzKFtdKTtcbiAgICAgICAgICAgICAgICBzZXRVblNpZ25lZFNpZ25lcnMoW10pO1xuICAgICAgICAgICAgICAgIGdldERvY3VtZW50RGV0YWlscyh0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHBkZkRldGFpbHM/LlswXS5TaWduZXJzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICh4KSA9PiB4LkVtYWlsID09PSBjdXJyZW50VXNlcj8uZW1haWxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJtYWlsID0ge1xuICAgICAgICAgICAgICAgICAgRW1haWw6IHBkZkRldGFpbHM/LlswXT8uUGxhY2Vob2xkZXJzW25ld0luZGV4XT8uZW1haWwgfHwgXCJcIlxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IHVzZXJtYWlsPy5FbWFpbFxuICAgICAgICAgICAgICAgICAgPyB1c2VybWFpbFxuICAgICAgICAgICAgICAgICAgOiBwZGZEZXRhaWxzPy5bMF0/LlNpZ25lcnNbbmV3SW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChzZW5kbWFpbCAhPT0gXCJmYWxzZVwiICYmIHNlbmRJbk9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHBkZkRldGFpbHM/LlswXT8uUmVxdWVzdEJvZHk7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0U3ViamVjdCA9IHBkZkRldGFpbHM/LlswXT8uUmVxdWVzdFN1YmplY3Q7XG4gICAgICAgICAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBpcmVEYXRlID0gcGRmRGV0YWlscz8uWzBdLkV4cGlyeURhdGUuaXNvO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoZXhwaXJlRGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsRXhwaXJlRGF0ZSA9IG5ld0RhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgIFwiZW4tVVNcIixcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXk6IFwibnVtZXJpY1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGg6IFwibG9uZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgeWVhcjogXCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZW5kZXJFbWFpbCA9IHBkZkRldGFpbHM/LlswXS5FeHRVc2VyUHRyLkVtYWlsO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VuZGVyUGhvbmUgPSBwZGZEZXRhaWxzPy5bMF0/LkV4dFVzZXJQdHI/LlBob25lO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZW5kZXJOYW1lID0gYCR7cGRmRGV0YWlscz8uWzBdLkV4dFVzZXJQdHIuTmFtZX1gO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nUG5nID1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaHR0cHM6Ly9xaWtpbm5vdmF0aW9uLmFtczMuZGlnaXRhbG9jZWFuc3BhY2VzLmNvbS9sb2dvLnBuZ1wiO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFzZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgKX1mdW5jdGlvbnMvc2VuZG1haWx2M2A7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Ub2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSB1c2VyPy5vYmplY3RJZDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0VXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgICAgICAgICAgICAgICAgICAvL2VuY29kZSB0aGlzIHVybCB2YWx1ZSBgJHtwZGZEZXRhaWxzPy5bMF0ub2JqZWN0SWR9LyR7dXNlci5FbWFpbH0vJHtvYmplY3RJZH1gIHRvIGJhc2U2NCB1c2luZyBgYnRvYWAgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RlQmFzZTY0O1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlQmFzZTY0ID0gYnRvYShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGRmRGV0YWlscz8uWzBdLm9iamVjdElkfS8ke3VzZXIuRW1haWx9LyR7b2JqZWN0SWR9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlQmFzZTY0ID0gYnRvYShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGRmRGV0YWlscz8uWzBdLm9iamVjdElkfS8ke3VzZXIuRW1haWx9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9zdFB1YmxpY1VybCA9IGlzU3RhZ2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImh0dHBzOi8vc3RhZ2luZy1hcHAub3BlbnNpZ25sYWJzLmNvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiaHR0cHM6Ly9hcHAub3BlbnNpZ25sYWJzLmNvbVwiO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWduUGRmID0gcHJvcHM/LnRlbXBsYXRlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYCR7aG9zdFB1YmxpY1VybH0vbG9naW4vJHtlbmNvZGVCYXNlNjR9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgJHtob3N0VXJsfS9sb2dpbi8ke2VuY29kZUJhc2U2NH1gO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5TaWduVXJsID1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaHR0cHM6Ly93d3cub3BlbnNpZ25sYWJzLmNvbS9jb250YWN0LXVzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JnTmFtZSA9IHBkZkRldGFpbHNbMF0/LkV4dFVzZXJQdHIuQ29tcGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwZGZEZXRhaWxzWzBdLkV4dFVzZXJQdHIuQ29tcGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoZW1lQkdjb2xvciA9IHRoZW1lQ29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VWYXI7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RCb2R5ICYmIHJlcXVlc3RTdWJqZWN0ICYmIGlzU3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZWRSZXF1ZXN0Qm9keSA9IHJlcXVlc3RCb2R5LnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC9cIi9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGh0bWxSZXFCb2R5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSdDb250ZW50LVR5cGUnIGNvbnRlbnQ9J3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcgLz48L2hlYWQ+PGJvZHk+XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFJlcXVlc3RCb2R5ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L2JvZHk+IDwvaHRtbD5cIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFibGVzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudF90aXRsZTogcGRmRGV0YWlscz8uWzBdLk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlcl9uYW1lOiBzZW5kZXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXJfbWFpbDogc2VuZGVyRW1haWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlcl9waG9uZTogc2VuZGVyUGhvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyX25hbWU6IHVzZXIuTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJfZW1haWw6IHVzZXIuRW1haWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyX3Bob25lOiB1c2VyLlBob25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcnlfZGF0ZTogbG9jYWxFeHBpcmVEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYW55X25hbWU6IG9yZ05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25pbmdfdXJsOiBgPGEgaHJlZj0ke3NpZ25QZGZ9PlNpZ24gaGVyZTwvYT5gXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVZhciA9IHJlcGxhY2VNYWlsVmFyaWJsZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdWJqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sUmVxQm9keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWlsUHJvdmlkZXI6IGFjdGl2ZU1haWxBZGFwdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0VXNlcklkOiBleHRVc2VySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNpcGllbnQ6IHVzZXIuRW1haWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0OiByZXF1ZXN0U3ViamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlcGxhY2VWYXI/LnN1YmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBgJHtwZGZEZXRhaWxzPy5bMF0uRXh0VXNlclB0ci5OYW1lfSBoYXMgcmVxdWVzdGVkIHlvdSB0byBzaWduIFwiJHtwZGZEZXRhaWxzPy5bMF0uTmFtZX1cImAsXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiBzZW5kZXJFbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWw6IHJlcXVlc3RCb2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVwbGFjZVZhcj8uYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0nQ29udGVudC1UeXBlJyBjb250ZW50PSd0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnIC8+IDwvaGVhZD4gICA8Ym9keT4gPGRpdiBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsgcGFkZGluZzogMjBweCc9PiA8ZGl2ICAgc3R5bGU9JyBib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMSkgMHB4IDRweCAxMnB4O2JhY2tncm91bmQ6IHdoaXRlO3BhZGRpbmctYm90dG9tOiAyMHB4Oyc+IDxkaXYgc3R5bGU9J3BhZGRpbmc6MTBweCAxMHB4IDAgMTBweCc+PGltZyBzcmM9XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1BuZyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgaGVpZ2h0PSc1MCcgc3R5bGU9J3BhZGRpbmc6IDIwcHgsd2lkdGg6MTcwcHgsaGVpZ2h0OjQwcHgnIC8+PC9kaXY+ICA8ZGl2ICBzdHlsZT0nIHBhZGRpbmc6IDJweDtmb250LWZhbWlseTogc3lzdGVtLXVpO2JhY2tncm91bmQtY29sb3I6XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lQkdjb2xvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI7Jz48cCBzdHlsZT0nZm9udC1zaXplOiAyMHB4O2ZvbnQtd2VpZ2h0OiA0MDA7Y29sb3I6IHdoaXRlO3BhZGRpbmctbGVmdDogMjBweDsnID4gRGlnaXRhbCBTaWduYXR1cmUgUmVxdWVzdDwvcD48L2Rpdj48ZGl2PjxwIHN0eWxlPSdwYWRkaW5nOiAyMHB4O2ZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7Zm9udC1zaXplOiAxNHB4OyAgIG1hcmdpbi1ib3R0b206IDEwcHg7Jz4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM/LlswXS5FeHRVc2VyUHRyLk5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIGhhcyByZXF1ZXN0ZWQgeW91IHRvIHJldmlldyBhbmQgc2lnbiA8c3Ryb25nPiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz8uWzBdLk5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPC9zdHJvbmc+LjwvcD48ZGl2IHN0eWxlPSdwYWRkaW5nOiA1cHggMHB4IDVweCAyNXB4O2Rpc3BsYXk6IGZsZXg7ZmxleC1kaXJlY3Rpb246IHJvdztqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsnPjx0YWJsZT4gPHRyPiA8dGQgc3R5bGU9J2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXNpemU6MTVweCc+U2VuZGVyPC90ZD4gPHRkPiA8L3RkPiA8dGQgIHN0eWxlPSdjb2xvcjojNjI2MzYzO2ZvbnQtd2VpZ2h0OmJvbGQnPlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXJFbWFpbCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0nZm9udC13ZWlnaHQ6Ym9sZDtmb250LWZhbWlseTpzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4Jz5Pcmdhbml6YXRpb248L3RkPiA8dGQ+IDwvdGQ+PHRkIHN0eWxlPSdjb2xvcjojNjI2MzYzO2ZvbnQtd2VpZ2h0OmJvbGQnPiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L3RkPjwvdHI+IDx0cj4gPHRkIHN0eWxlPSdmb250LXdlaWdodDpib2xkO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHgnPkV4cGlyZXMgb248L3RkPjx0ZD4gPC90ZD4gPHRkIHN0eWxlPSdjb2xvcjojNjI2MzYzO2ZvbnQtd2VpZ2h0OmJvbGQnPlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEV4cGlyZURhdGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPC90ZD48L3RyPjx0cj4gPHRkPjwvdGQ+IDx0ZD4gPC90ZD48L3RyPjwvdGFibGU+IDwvZGl2PiA8ZGl2IHN0eWxlPSdtYXJnaW4tbGVmdDo3MHB4Jz48YSBocmVmPVwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduUGRmICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj4gPGJ1dHRvbiBzdHlsZT0ncGFkZGluZzogMTJweCAxMnB4IDEycHggMTJweDtiYWNrZ3JvdW5kLWNvbG9yOiAjZDQ2YjBmO2NvbG9yOiB3aGl0ZTsgIGJvcmRlcjogMHB4O2JveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4wNSkgMHB4IDZweCAyNHB4IDBweCxyZ2JhKDAsIDAsIDAsIDAuMDgpIDBweCAwcHggMHB4IDFweDtmb250LXdlaWdodDpib2xkO21hcmdpbi10b3A6MzBweCc+U2lnbiBoZXJlPC9idXR0b24+PC9hPiA8L2Rpdj4gPGRpdiBzdHlsZT0nZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7bWFyZ2luLXRvcDogMTBweDsnPiA8L2Rpdj48L2Rpdj48L2Rpdj48ZGl2PjxwPiBUaGlzIGlzIGFuIGF1dG9tYXRlZCBlbWFpbCBmcm9tIE9wZW5TaWdu4oSiLiBGb3IgYW55IHF1ZXJpZXMgcmVnYXJkaW5nIHRoaXMgZW1haWwsIHBsZWFzZSBjb250YWN0IHRoZSBzZW5kZXIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlckVtYWlsICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBkaXJlY3RseS5JZiB5b3UgdGhpbmsgdGhpcyBlbWFpbCBpcyBpbmFwcHJvcHJpYXRlIG9yIHNwYW0sIHlvdSBtYXkgZmlsZSBhIGNvbXBsYWludCB3aXRoIE9wZW5TaWdu4oSiICAgPGEgaHJlZj0gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5TaWduVXJsICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiB0YXJnZXQ9X2JsYW5rPmhlcmU8L2E+LjwvcD4gPC9kaXY+PC9kaXY+PC9ib2R5PiA8L2h0bWw+XCJcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF4aW9zLnBvc3QodXJsLCBwYXJhbXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRJc1VpTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7IGlzU2hvdzogdHJ1ZSwgYWxlcnRNZXNzYWdlOiByZXNTaWduLm1lc3NhZ2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBzZXRJc1VpTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoXCJpcyBlbmNyeXB0ZWQuXCIpKSB7XG4gICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7XG4gICAgICAgICAgICAgICAgICBpc1Nob3c6IHRydWUsXG4gICAgICAgICAgICAgICAgICBhbGVydE1lc3NhZ2U6IGBDdXJyZW50bHkgZW5jcnlwdGVkIHBkZiBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZC5gXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gcmVxdWVzdCBzaWduaW5nXCIsIGVycik7XG4gICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7XG4gICAgICAgICAgICAgICAgICBpc1Nob3c6IHRydWUsXG4gICAgICAgICAgICAgICAgICBhbGVydE1lc3NhZ2U6IGBTb21ldGhpbmcgd2VudCB3cm9uZy5gXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0SXNTaWduUGFkKGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRJc0FsZXJ0KHtcbiAgICAgICAgICAgIGlzU2hvdzogdHJ1ZSxcbiAgICAgICAgICAgIGFsZXJ0TWVzc2FnZTogXCJzb21ldGhpbmcgd2VudCB3cm9uZ1wiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmxvZyhcImVyciBpbiBlbWJlZHNpZ25cIiwgZXJyKTtcbiAgICAgICAgc2V0SXNVaUxvYWRpbmcoZmFsc2UpO1xuICAgICAgICBzZXRJc0FsZXJ0KHtcbiAgICAgICAgICBpc1Nob3c6IHRydWUsXG4gICAgICAgICAgYWxlcnRNZXNzYWdlOiBcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvL2Vsc2UgdmVyaWZ5IHVzZXJzIGVtYWlsXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1c2VyUXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoUGFyc2UuVXNlcik7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VyUXVlcnkuZ2V0KGN1cnJlbnRVc2VyPy5vYmplY3RJZCwge1xuICAgICAgICAgIHNlc3Npb25Ub2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICBpc0VtYWlsVmVyaWZpZWQgPSB1c2VyPy5nZXQoXCJlbWFpbFZlcmlmaWVkXCIpO1xuICAgICAgICAgIHNldElzRW1haWxWZXJpZmllZChpc0VtYWlsVmVyaWZpZWQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaW4gc2F2ZSB1c2VyJ3MgZW1haWxWZXJpZmllZCBpbiB1c2VyIGNsYXNzXCIpO1xuICAgICAgICBzZXRIYW5kbGVFcnJvcihcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy9mdW5jdGlvbiBmb3IgdXBkYXRlIFRvdXJTdGF0dXNcbiAgY29uc3QgY2xvc2VUb3VyID0gYXN5bmMgKCkgPT4ge1xuICAgIHNldFdpZGdldHNUb3VyKGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCB0b3VyQ29uZmlnID0gW1xuICAgIHtcbiAgICAgIHNlbGVjdG9yOiAnW2RhdGEtdHV0PVwiSXNTaWduZWRcIl0nLFxuICAgICAgY29udGVudDogbWluUmVxdWlyZWRDb3VudFxuICAgICAgICA/IGBQbGVhc2UgY29uZmlybSB0aGF0IHlvdSBoYXZlIHNlbGVjdGVkIGF0IGxlYXN0ICR7bWluUmVxdWlyZWRDb3VudH0gY2hlY2tib3hlcy5gXG4gICAgICAgIDogXCJFbnN1cmUgdGhpcyBmaWVsZCBpcyBhY2N1cmF0ZWx5IGZpbGxlZCBhbmQgbWVldHMgYWxsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgIHBvc2l0aW9uOiBcInRvcFwiLFxuICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cbiAgICB9XG4gIF07XG4gIC8vZnVuY3Rpb24gZm9yIGdldCBwZGYgcGFnZSBkZXRhaWxzXG4gIGNvbnN0IHBhZ2VEZXRhaWxzID0gYXN5bmMgKHBkZikgPT4ge1xuICAgIGxldCBwZGZXSE9iaiA9IFtdO1xuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBwZGYubnVtUGFnZXM7IC8vIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRvdGFsUGFnZXM7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGdldFBhZ2UgPSBhd2FpdCBwZGYuZ2V0UGFnZShpbmRleCArIDEpO1xuICAgICAgY29uc3Qgc2NhbGUgPSAxO1xuICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRQYWdlLmdldFZpZXdwb3J0KHsgc2NhbGUgfSk7XG4gICAgICBwZGZXSE9iai5wdXNoKHsgcGFnZU51bWJlcjogaW5kZXggKyAxLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH1cbiAgICBzZXRQZGZPcmlnaW5hbFdIKHBkZldIT2JqKTtcbiAgICBzZXRQZGZMb2FkKHRydWUpO1xuICB9O1xuICAvL2Z1bmN0aW9uIGZvciBjaGFuZ2UgcGFnZVxuICBmdW5jdGlvbiBjaGFuZ2VQYWdlKG9mZnNldCkge1xuICAgIHNldFBhZ2VOdW1iZXIoKHByZXZQYWdlTnVtYmVyKSA9PiBwcmV2UGFnZU51bWJlciArIG9mZnNldCk7XG4gIH1cblxuICAvL2Z1bmN0aW9uIGZvciBpbWFnZSB1cGxvYWQgb3IgdXBkYXRlXG4gIGNvbnN0IG9uSW1hZ2VDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmZpbGVzICYmIGV2ZW50LnRhcmdldC5maWxlc1swXSkge1xuICAgICAgb25JbWFnZVNlbGVjdChldmVudCwgc2V0SW1nV0gsIHNldEltYWdlKTtcbiAgICB9XG4gIH07XG4gIC8vZnVuY3Rpb24gZm9yIHVwbG9hZCBzdGFtcCBpbWFnZVxuICBjb25zdCBzYXZlSW1hZ2UgPSAoKSA9PiB7XG4gICAgLy9nZXQgY3VycmVudCBzaWduZXJzIHBsYWNlaG9sZGVyIHBvc2l0aW9uIGRhdGFcbiAgICBjb25zdCBjdXJyZW50U2lnbmVyID0gc2lnbmVyUG9zLmZpbHRlcihcbiAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZFxuICAgICk7XG4gICAgLy9nZXQgY3VycmVudCBwYWdlbnVtYmVyIHBsYWNlaG9sZGVyIGluZGV4XG4gICAgY29uc3QgZ2V0SW5kZXggPSBjdXJyZW50U2lnbmVyWzBdLnBsYWNlSG9sZGVyLmZpbmRJbmRleCgob2JqZWN0KSA9PiB7XG4gICAgICByZXR1cm4gb2JqZWN0LnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXI7XG4gICAgfSk7XG4gICAgLy9nZXQgY3VycmVudCBzaWduZXIgcGxhY2Vob2xkZXIgcG9zaXRpb24gZGF0YVxuICAgIGNvbnN0IHBsYWNlaG9sZGVyUG9zaXRpb24gPSBjdXJyZW50U2lnbmVyWzBdLnBsYWNlSG9sZGVyO1xuICAgIC8vZnVuY3Rpb24gb2Ygc2F2ZSBpbWFnZSBhbmQgZ2V0IHVwZGF0ZWQgcG9zaXRpb24gd2l0aCBpbWFnZSB1cmxcbiAgICBjb25zdCBnZXRVcGRhdGVQb3NpdGlvbiA9IG9uU2F2ZUltYWdlKFxuICAgICAgcGxhY2Vob2xkZXJQb3NpdGlvbixcbiAgICAgIGdldEluZGV4LFxuICAgICAgc2lnbktleSxcbiAgICAgIGltZ1dILFxuICAgICAgaW1hZ2VcbiAgICApO1xuXG4gICAgLy9yZXBsYWNlIHVwZGF0ZWQgcGxhY2Vob2xkZXIgcG9zaXRpb24gd2l0aCBvbGQgZGF0YVxuICAgIHBsYWNlaG9sZGVyUG9zaXRpb24uc3BsaWNlKFxuICAgICAgMCxcbiAgICAgIHBsYWNlaG9sZGVyUG9zaXRpb24ubGVuZ3RoLFxuICAgICAgLi4uZ2V0VXBkYXRlUG9zaXRpb25cbiAgICApO1xuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhIGluZGV4IG51bWJlciBpbiBhcnJheVxuICAgIGNvbnN0IGluZGV4b2ZTaWduZXIgPSBzaWduZXJQb3MuZmluZEluZGV4KChvYmplY3QpID0+IHtcbiAgICAgIHJldHVybiBvYmplY3Quc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkO1xuICAgIH0pO1xuICAgIC8vdXBkYXRlIGN1cnJlbnQgc2lnbmVycyBkYXRhIHdpdGggbmV3IHBsYWNlaG9sZGVyIHBvc2l0aW9uIGFycmF5IGRhdGFcbiAgICBzZXRTaWduZXJQb3MoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgY29uc3QgbmV3U3RhdGUgPSBbLi4ucHJldlN0YXRlXTsgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgc3RhdGVcbiAgICAgIG5ld1N0YXRlLnNwbGljZShpbmRleG9mU2lnbmVyLCAxLCAuLi5jdXJyZW50U2lnbmVyKTsgLy8gTW9kaWZ5IHRoZSBjb3B5XG4gICAgICByZXR1cm4gbmV3U3RhdGU7IC8vIFVwZGF0ZSB0aGUgc3RhdGUgd2l0aCB0aGUgbW9kaWZpZWQgY29weVxuICAgIH0pO1xuICB9O1xuICAvL2Z1bmN0aW9uIGZvciBzYXZlIGJ1dHRvbiB0byBzYXZlIHNpZ25hdHVyZSBvciBpbWFnZSB1cmxcbiAgY29uc3Qgc2F2ZVNpZ24gPSAodHlwZSwgaXNEZWZhdWx0U2lnbiwgd2lkdGgsIGhlaWdodCkgPT4ge1xuICAgIGNvbnN0IGlzVHlwZVRleHQgPSB3aWR0aCAmJiBoZWlnaHQgPyB0cnVlIDogZmFsc2U7XG4gICAgY29uc3Qgc2lnbmF0dXJlSW1nID0gaXNEZWZhdWx0U2lnblxuICAgICAgPyBpc0RlZmF1bHRTaWduID09PSBcImluaXRpYWxzXCJcbiAgICAgICAgPyBteUluaXRpYWxcbiAgICAgICAgOiBkZWZhdWx0U2lnbkltZ1xuICAgICAgOiBzaWduYXR1cmU7XG4gICAgbGV0IGltZ1dIID0geyB3aWR0aDogd2lkdGggPyB3aWR0aCA6IFwiXCIsIGhlaWdodDogaGVpZ2h0ID8gaGVpZ2h0IDogXCJcIiB9O1xuICAgIHNldElzU2lnblBhZChmYWxzZSk7XG4gICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XG4gICAgc2V0SW1hZ2UoKTtcblxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXG4gICAgY29uc3QgY3VycmVudFNpZ25lciA9IHNpZ25lclBvcy5maWx0ZXIoXG4gICAgICAoZGF0YSkgPT4gZGF0YS5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWRcbiAgICApO1xuICAgIC8vZ2V0IGN1cnJlbnQgcGFnZW51bWJlciBwbGFjZWhvbGRlciBpbmRleFxuICAgIGNvbnN0IGdldEluZGV4ID0gY3VycmVudFNpZ25lclswXS5wbGFjZUhvbGRlci5maW5kSW5kZXgoKG9iamVjdCkgPT4ge1xuICAgICAgcmV0dXJuIG9iamVjdC5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyO1xuICAgIH0pO1xuXG4gICAgLy9zZXQgZGVmYXVsdCBzaWduYXR1cmUgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodFxuICAgIGlmIChpc0RlZmF1bHRTaWduKSB7XG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltZy5zcmMgPSBkZWZhdWx0U2lnbkltZztcbiAgICAgIGlmIChpbWcuY29tcGxldGUpIHtcbiAgICAgICAgaW1nV0ggPSB7XG4gICAgICAgICAgd2lkdGg6IGltZy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGltZy5oZWlnaHRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9nZXQgY3VycmVudCBzaWduZXIgcGxhY2Vob2xkZXIgcG9zaXRpb24gZGF0YVxuICAgIGNvbnN0IHBsYWNlaG9sZGVyUG9zaXRpb24gPSBjdXJyZW50U2lnbmVyWzBdLnBsYWNlSG9sZGVyO1xuICAgIC8vZnVuY3Rpb24gb2Ygc2F2ZSBzaWduYXR1cmUgaW1hZ2UgYW5kIGdldCB1cGRhdGVkIHBvc2l0aW9uIHdpdGggc2lnbmF0dXJlIGltYWdlIHVybFxuICAgIGNvbnN0IGdldFVwZGF0ZVBvc2l0aW9uID0gb25TYXZlU2lnbihcbiAgICAgIHR5cGUsXG4gICAgICBwbGFjZWhvbGRlclBvc2l0aW9uLFxuICAgICAgZ2V0SW5kZXgsXG4gICAgICBzaWduS2V5LFxuICAgICAgc2lnbmF0dXJlSW1nLFxuICAgICAgaW1nV0gsXG4gICAgICBpc0RlZmF1bHRTaWduLFxuICAgICAgaXNUeXBlVGV4dFxuICAgICk7XG5cbiAgICBjb25zdCB1cGRhdGVTaWduZXJEYXRhID0gY3VycmVudFNpZ25lci5tYXAoKG9iaikgPT4ge1xuICAgICAgaWYgKG9iai5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwbGFjZUhvbGRlcjogZ2V0VXBkYXRlUG9zaXRpb24gfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbmRleCA9IHNpZ25lclBvcy5maW5kSW5kZXgoXG4gICAgICAoZGF0YSkgPT4gZGF0YS5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWRcbiAgICApO1xuICAgIHNldFNpZ25lclBvcygocHJldlN0YXRlKSA9PiB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IFsuLi5wcmV2U3RhdGVdO1xuICAgICAgbmV3U3RhdGUuc3BsaWNlKGluZGV4LCAxLCAuLi51cGRhdGVTaWduZXJEYXRhKTtcbiAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICB9KTtcbiAgfTtcbiAgLy9mdW5jdGlvbiBmb3Igc2V0IGRlY2xpbmUgdHJ1ZSBvbiBwcmVzcyBkZWNsaW5lIGJ1dHRvblxuICBjb25zdCBkZWNsaW5lRG9jID0gYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgIGNvbnN0IHNlbmRlclVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgIGBQYXJzZS8ke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKX0vY3VycmVudFVzZXJgXG4gICAgKTtcbiAgICBjb25zdCBqc29uU2VuZGVyID0gSlNPTi5wYXJzZShzZW5kZXJVc2VyKTtcbiAgICBzZXRJc0RlY2xpbmUoeyBpc0RlY2xpbmVkOiBmYWxzZSB9KTtcbiAgICBjb25zdCBkYXRhID0geyBJc0RlY2xpbmVkOiB0cnVlLCBEZWNsaW5lUmVhc29uOiByZWFzb24gfTtcbiAgICBzZXRJc1VpTG9hZGluZyh0cnVlKTtcblxuICAgIGF3YWl0IGF4aW9zXG4gICAgICAucHV0KFxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgICAgICBcImJhc2VVcmxcIlxuICAgICAgICApfWNsYXNzZXMvY29udHJhY3RzX0RvY3VtZW50LyR7ZG9jdW1lbnRJZH1gLFxuICAgICAgICBkYXRhLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxuICAgICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnREZWNsaW5lID0ge1xuICAgICAgICAgICAgY3Vycm50OiBcIllvdURlY2xpbmVkXCIsXG4gICAgICAgICAgICBpc0RlY2xpbmVkOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgICBzZXRJc0RlY2xpbmUoY3VycmVudERlY2xpbmUpO1xuICAgICAgICAgIHNldElzVWlMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICBldmVudDogXCJkZWNsaW5lZFwiLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICBvYmplY3RJZDogcGRmRGV0YWlscz8uWzBdLm9iamVjdElkLFxuICAgICAgICAgICAgICBmaWxlOiBwZGZEZXRhaWxzPy5bMF0/LlNpZ25lZFVybCB8fCBwZGZEZXRhaWxzPy5bMF0/LlVSTCxcbiAgICAgICAgICAgICAgbmFtZTogcGRmRGV0YWlscz8uWzBdLk5hbWUsXG4gICAgICAgICAgICAgIG5vdGU6IHBkZkRldGFpbHM/LlswXS5Ob3RlIHx8IFwiXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBwZGZEZXRhaWxzPy5bMF0uRGVzY3JpcHRpb24gfHwgXCJcIixcbiAgICAgICAgICAgICAgc2lnbmVyczogcGRmRGV0YWlscz8uWzBdLlNpZ25lcnM/Lm1hcCgoeCkgPT4gKHtcbiAgICAgICAgICAgICAgICBuYW1lOiB4Py5OYW1lLFxuICAgICAgICAgICAgICAgIGVtYWlsOiB4Py5FbWFpbCxcbiAgICAgICAgICAgICAgICBwaG9uZTogeD8uUGhvbmVcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICBkZWNsaW5lZEJ5OiBqc29uU2VuZGVyLmVtYWlsLFxuICAgICAgICAgICAgICBkZWNsaW5lZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICBjcmVhdGVkQXQ6IHBkZkRldGFpbHM/LlswXS5jcmVhdGVkQXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICAgICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvY2FsbHdlYmhvb2tgLFxuICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICAgICAgICAgICAgICBzZXNzaW9udG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVyciBcIiwgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIHVwZGF0aW5nIGZpZWxkIGlzIGRlY2xpbmUgXCIsIGVycik7XG4gICAgICB9KTtcbiAgfTtcbiAgLy9mdW5jdGlvbiB0byBhZGQgZGVmYXVsdCBzaWduYXR1cmUgZm9yIGFsbCByZXF1ZXN0ZWQgcGxhY2Vob2xkZXIgb2Ygc2lnblxuICBjb25zdCBhZGREZWZhdWx0U2lnbmF0dXJlID0gKCkgPT4ge1xuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXG4gICAgY29uc3QgY3VycmVudFNpZ25lclBvc2l0aW9uID0gc2lnbmVyUG9zLmZpbHRlcihcbiAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZFxuICAgICk7XG4gICAgLy9mdW5jdGlvbiBmb3Igc2F2ZSBkZWZhdWx0IHNpZ25hdHVyZSB1cmwgZm9yIGFsbCBwbGFjZWhvbGRlciBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZVBsYWNlID0gYWRkRGVmYXVsdFNpZ25hdHVyZUltZyhcbiAgICAgIGN1cnJlbnRTaWduZXJQb3NpdGlvblswXS5wbGFjZUhvbGRlcixcbiAgICAgIGRlZmF1bHRTaWduSW1nXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZXNpZ25lclBvcyA9IHNpZ25lclBvcy5tYXAoKHgpID0+XG4gICAgICB4LnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZCA/IHsgLi4ueCwgcGxhY2VIb2xkZXI6IHVwZGF0ZVBsYWNlIH0gOiB4XG4gICAgKTtcbiAgICBzZXRTaWduZXJQb3ModXBkYXRlc2lnbmVyUG9zKTtcbiAgICBzZXREZWZhdWx0U2lnbkFsZXJ0KHtcbiAgICAgIGlzU2hvdzogZmFsc2UsXG4gICAgICBhbGVydE1lc3NhZ2U6IFwiXCJcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlRG9udFNob3cgPSAoaXNDaGVja2VkKSA9PiB7XG4gICAgc2V0SXNEb250U2hvdyhpc0NoZWNrZWQpO1xuICB9O1xuICAvLyBjb25zb2xlLmxvZyhcInNpZ25lcnBvc1wiLCBzaWduZXJQb3MpO1xuICAvL2Z1bmN0aW9uIHRvIGNsb3NlIHRvdXIgYW5kIHNhdmUgdG91ciBzdGF0dXNcbiAgY29uc3QgY2xvc2VSZXF1ZXN0U2lnblRvdXIgPSBhc3luYyAoKSA9PiB7XG4gICAgc2V0UmVxdWVzdFNpZ25Ub3VyKHRydWUpO1xuICAgIGlmIChpc0RvbnRTaG93KSB7XG4gICAgICBsZXQgdXBkYXRlZFRvdXJTdGF0dXMgPSBbXTtcbiAgICAgIGlmICh0b3VyU3RhdHVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXBkYXRlZFRvdXJTdGF0dXMgPSBbLi4udG91clN0YXR1c107XG4gICAgICAgIGNvbnN0IHJlcXVlc3RTaWduSW5kZXggPSB0b3VyU3RhdHVzLmZpbmRJbmRleChcbiAgICAgICAgICAob2JqKSA9PiBvYmpbXCJyZXF1ZXN0U2lnblwiXSA9PT0gZmFsc2UgfHwgb2JqW1wicmVxdWVzdFNpZ25cIl0gPT09IHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlcXVlc3RTaWduSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdXBkYXRlZFRvdXJTdGF0dXNbcmVxdWVzdFNpZ25JbmRleF0gPSB7IHJlcXVlc3RTaWduOiB0cnVlIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBkYXRlZFRvdXJTdGF0dXMucHVzaCh7IHJlcXVlc3RTaWduOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGVkVG91clN0YXR1cyA9IFt7IHJlcXVlc3RTaWduOiB0cnVlIH1dO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXhpb3MucHV0KFxuICAgICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgICAgICAgXCJiYXNlVXJsXCJcbiAgICAgICAgICApfWNsYXNzZXMvY29udHJhY3RzJHtjb250cmFjdE5hbWV9LyR7c2lnbmVyVXNlcklkfWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgVG91clN0YXR1czogdXBkYXRlZFRvdXJTdGF0dXNcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwidXBkYXRlIHRvdXIgbWVzc2FnZXMgZXJyb3JcIiwgZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCByZXF1ZXN0U2lnblRvdXJGdW5jdGlvbiA9ICgpID0+IHtcbiAgICBjb25zdCB0b3VyQ29uZmlnID0gW1xuICAgICAge1xuICAgICAgICBzZWxlY3RvcjogJ1tkYXRhLXR1dD1cInJlYWN0b3VyRmlyc3RcIl0nLFxuICAgICAgICBjb250ZW50OiAoKSA9PiAoXG4gICAgICAgICAgPFRvdXJDb250ZW50V2l0aEJ0blxuICAgICAgICAgICAgbWVzc2FnZT17YExpc3Qgb2Ygc2lnbmVycyB3aG8gc3RpbGwgbmVlZCB0byBzaWduIHRoZSBkb2N1bWVudCAuYH1cbiAgICAgICAgICAgIGlzQ2hlY2tlZD17aGFuZGxlRG9udFNob3d9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSxcbiAgICAgICAgcG9zaXRpb246IFwidG9wXCIsXG4gICAgICAgIHN0eWxlOiB7IGZvbnRTaXplOiBcIjEzcHhcIiB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZWxlY3RvcjogJ1tkYXRhLXR1dD1cInBkZkFyZWFcIl0nLFxuICAgICAgICBjb250ZW50OiAoKSA9PiAoXG4gICAgICAgICAgPFRvdXJDb250ZW50V2l0aEJ0blxuICAgICAgICAgICAgbWVzc2FnZT17YENsaWNrIGFueSBvZiB0aGUgcGxhY2Vob2xkZXJzIGFwcGVhcmluZyBvbiB0aGUgZG9jdW1lbnQgdG8gc2lnbi4gWW91IHdpbGwgdGhlbiBzZWUgb3B0aW9ucyB0byBkcmF3IHlvdXIgc2lnbmF0dXJlLCB0eXBlIGl0LCBvciB1cGxvYWQgYW4gaW1hZ2UgLmB9XG4gICAgICAgICAgICBpc0NoZWNrZWQ9e2hhbmRsZURvbnRTaG93fVxuICAgICAgICAgIC8+XG4gICAgICAgICksXG4gICAgICAgIHBvc2l0aW9uOiBcInRvcFwiLFxuICAgICAgICBzdHlsZTogeyBmb250U2l6ZTogXCIxM3B4XCIgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdbZGF0YS10dXQ9XCJyZWFjdG91ckZpZnRoXCJdJyxcbiAgICAgICAgY29udGVudDogKCkgPT4gKFxuICAgICAgICAgIDxUb3VyQ29udGVudFdpdGhCdG5cbiAgICAgICAgICAgIG1lc3NhZ2U9e2BDbGljayB0aGUgQmFjaywgRGVjbGluZSwgb3IgRmluaXNoIGJ1dHRvbnMgdG8gbmF2aWdhdGUgeW91ciBkb2N1bWVudC4gVXNlIHRoZSBlbGxpcHNpcyBtZW51IGZvciBhZGRpdGlvbmFsIG9wdGlvbnMsIGluY2x1ZGluZyB0aGUgRG93bmxvYWQgYnV0dG9uIC5gfVxuICAgICAgICAgICAgaXNDaGVja2VkPXtoYW5kbGVEb250U2hvd31cbiAgICAgICAgICAvPlxuICAgICAgICApLFxuICAgICAgICBwb3NpdGlvbjogXCJ0b3BcIixcbiAgICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cbiAgICAgIH1cbiAgICBdO1xuICAgIGNvbnN0IHNpZ25lZEJ5U3RlcCA9IHtcbiAgICAgIHNlbGVjdG9yOiAnW2RhdGEtdHV0PVwicmVhY3RvdXJTZWNvbmRcIl0nLFxuICAgICAgY29udGVudDogKCkgPT4gKFxuICAgICAgICA8VG91ckNvbnRlbnRXaXRoQnRuXG4gICAgICAgICAgbWVzc2FnZT17YExpc3Qgb2Ygc2lnbmVycyB3aG8gaGF2ZSBhbHJlYWR5IHNpZ25lZCB0aGUgZG9jdW1lbnQgLmB9XG4gICAgICAgICAgaXNDaGVja2VkPXtoYW5kbGVEb250U2hvd31cbiAgICAgICAgLz5cbiAgICAgICksXG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIixcbiAgICAgIHN0eWxlOiB7IGZvbnRTaXplOiBcIjEzcHhcIiB9XG4gICAgfTtcbiAgICAvL2NoZWNraW5nIGlmIHNpZ25lZCBieSB1c2VyIGNvbXBvbmVudCBleGlzdCB0aGVuIGFkZCBzaWduZWQgc3RlcFxuICAgIGNvbnN0IHNpZ25lZEJ5ID1cbiAgICAgIHNpZ25lZFNpZ25lcnMubGVuZ3RoID4gMFxuICAgICAgICA/IFsuLi50b3VyQ29uZmlnLnNsaWNlKDAsIDApLCBzaWduZWRCeVN0ZXAsIC4uLnRvdXJDb25maWcuc2xpY2UoMCldXG4gICAgICAgIDogdG91ckNvbmZpZztcblxuICAgIC8vY2hlY2tpbmcgaWYgZGVmYXVsdCBzaWduYXR1cmUgY29tcG9uZW50IGV4aXN0IHRoZW4gYWRkIGRlZmF1bHRTaWduIHN0ZXBcbiAgICBjb25zdCBkZWZhdWx0U2lnblN0ZXAgPSB7XG4gICAgICBzZWxlY3RvcjogJ1tkYXRhLXR1dD1cInJlYWN0b3VyVGhpcmRcIl0nLFxuICAgICAgY29udGVudDogKCkgPT4gKFxuICAgICAgICA8VG91ckNvbnRlbnRXaXRoQnRuXG4gICAgICAgICAgbWVzc2FnZT17YFlvdSBjYW4gY2xpY2sgXCJBdXRvIFNpZ24gQWxsXCIgdG8gYXV0b21hdGljYWxseSBzaWduIGF0IGFsbCB0aGUgbG9jYXRpb25zIG1lYW50IHRvIGJlIHNpZ25lZCBieSB5b3UuIE1ha2Ugc3VyZSB0aGF0IHlvdSByZXZpZXcgdGhlIGRvY3VtZW50IHByb3Blcmx5IGJlZm9yZSB5b3UgY2xpY2sgdGhpcyBidXR0b24gLmB9XG4gICAgICAgICAgaXNDaGVja2VkPXtoYW5kbGVEb250U2hvd31cbiAgICAgICAgLz5cbiAgICAgICksXG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIixcbiAgICAgIHN0eWxlOiB7IGZvbnRTaXplOiBcIjEzcHhcIiB9XG4gICAgfTtcbiAgICAvL2luZGV4IGlzIGhhbmRsZSBpcyBzaWduZWQgYnkgZXhpc3QgdGhlbiAyIGVsc2UgMSB0byBhZGQgdG91ciBzdGVwXG4gICAgY29uc3QgaW5kZXggPSBzaWduZWRTaWduZXJzLmxlbmd0aCA+IDAgPyAyIDogMTtcbiAgICBjb25zdCBkZWZhdWx0U2lnblRvdXIgPSBkZWZhdWx0U2lnbkltZ1xuICAgICAgPyBbLi4uc2lnbmVkQnkuc2xpY2UoMCwgaW5kZXgpLCBkZWZhdWx0U2lnblN0ZXAsIC4uLnNpZ25lZEJ5LnNsaWNlKGluZGV4KV1cbiAgICAgIDogc2lnbmVkQnk7XG5cbiAgICBpZiAoaXNNb2JpbGUpIHtcbiAgICAgIHRvdXJDb25maWcuc2hpZnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFRvdXJcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2U9e2Nsb3NlUmVxdWVzdFNpZ25Ub3VyfVxuICAgICAgICBzdGVwcz17aXNNb2JpbGUgPyB0b3VyQ29uZmlnIDogZGVmYXVsdFNpZ25Ub3VyfVxuICAgICAgICBpc09wZW49e3RydWV9XG4gICAgICAgIGNsb3NlV2l0aE1hc2s9e2ZhbHNlfVxuICAgICAgICByb3VuZGVkPXs1fVxuICAgICAgLz5cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVVzZXJEZXRhaWxzID0gKCkgPT4ge1xuICAgIHNldElzUHVibGljQ29udGFjdCh0cnVlKTtcbiAgfTtcblxuICAvL2BoYW5kbGVQdWJsaWNVc2VyYCBmdW5jdGlvbiB0byB1c2UgY3JlYXRlIHVzZXIgZnJvbSBwdWJsaWMgcm9sZSBhbmQgY3JlYXRlIGRvY3VtZW50IGZyb20gcHVibGljIHRlbXBsYXRlXG4gIGNvbnN0IGhhbmRsZVB1YmxpY1VzZXIgPSBhc3luYyAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIC4uLmNvbnRhY3QsXG4gICAgICAgIHRlbXBsYXRlaWQ6IHBkZkRldGFpbHNbMF0/Lm9iamVjdElkLFxuICAgICAgICByb2xlOiBwZGZEZXRhaWxzWzBdPy5QdWJsaWNSb2xlWzBdXG4gICAgICB9O1xuICAgICAgY29uc3QgdXNlclJlcyA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgICAgIFwiYmFzZVVybFwiXG4gICAgICAgICl9L2Z1bmN0aW9ucy9wdWJsaWN1c2VybGlua2NvbnRhY3R0b2RvY2AsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgaWYgKHVzZXJSZXM/LmRhdGE/LnJlc3VsdCkge1xuICAgICAgICBzZXRSZXModXNlclJlcy5kYXRhLnJlc3VsdCk7XG4gICAgICAgIGF3YWl0IFNlbmRPdHAoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaW4gcHVibGljLXNpZ24gdG8gY3JlYXRlIHVzZXIgZGV0YWlsc1wiKTtcbiAgICAgICAgYWxlcnQoXCJzb21ldGhpbmcgd2VudCB3cm9uZ1wiKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImVcIiwgZSk7XG4gICAgICAvLyAgIHNldElzTG9hZGVyKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSAoZSkgPT4ge1xuICAgIHNldENvbnRhY3QoKHByZXYpID0+ICh7IC4uLnByZXYsIFtlLnRhcmdldC5uYW1lXTogZS50YXJnZXQudmFsdWUgfSkpO1xuICB9O1xuXG4gIGNvbnN0IFNlbmRPdHAgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgZW1haWw6IGNvbnRhY3QuZW1haWwsIGRvY0lkOiByZXMuZG9jSWQgfTtcblxuICAgICAgY29uc3QgT3RwID0gYXdhaXQgYXhpb3MucG9zdChcbiAgICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfS9mdW5jdGlvbnMvU2VuZE9UUE1haWxWMWAsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgaWYgKE90cCkge1xuICAgICAgICBzZXRJc090cCh0cnVlKTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaW4gdmVyaWZ5IG90cCBpbiBwdWJsaWMtc2lnblwiLCBlcnJvcik7XG4gICAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nIVwiKTtcbiAgICB9XG4gIH07XG5cbiAgLy92ZXJpZnkgT1RQIHNlbmQgb24gdmlhIGVtYWlsXG4gIGNvbnN0IFZlcmlmeU9UUCA9IGFzeW5jIChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgY29uc3Qgc2VydmVyVXJsID1cbiAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKSAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIik7XG4gICAgY29uc3QgcGFyc2VJZCA9XG4gICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIikgJiYgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpO1xuICAgIGlmIChvdHApIHtcbiAgICAgIC8vIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgdXJsID0gYCR7c2VydmVyVXJsfS9mdW5jdGlvbnMvQXV0aExvZ2luQXNNYWlsL2A7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IHBhcnNlSWRcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGJvZHkgPSB7XG4gICAgICAgICAgZW1haWw6IGNvbnRhY3QuZW1haWwsXG4gICAgICAgICAgb3RwOiBvdHBcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHVzZXIgPSBhd2FpdCBheGlvcy5wb3N0KHVybCwgYm9keSwgeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xuICAgICAgICBpZiAodXNlci5kYXRhLnJlc3VsdCA9PT0gXCJJbnZhbGlkIE90cFwiKSB7XG4gICAgICAgICAgYWxlcnQoXCJJbnZhbGlkIE90cFwiKTtcbiAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyLmRhdGEucmVzdWx0ID09PSBcInVzZXIgbm90IGZvdW5kIVwiKSB7XG4gICAgICAgICAgYWxlcnQoXCJVc2VyIG5vdCBmb3VuZCFcIik7XG4gICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IF91c2VyID0gdXNlci5kYXRhLnJlc3VsdDtcbiAgICAgICAgICBjb25zdCBwYXJzZUlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpO1xuICAgICAgICAgIGF3YWl0IFBhcnNlLlVzZXIuYmVjb21lKF91c2VyLnNlc3Npb25Ub2tlbik7XG4gICAgICAgICAgY29uc3QgY29udHJhY3RVc2VyRGV0YWlscyA9IGF3YWl0IGNvbnRyYWN0VXNlcnMoKTtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIlVzZXJJbmZvcm1hdGlvblwiLCBKU09OLnN0cmluZ2lmeShfdXNlcikpO1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgYFBhcnNlLyR7cGFyc2VJZH0vY3VycmVudFVzZXJgLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoX3VzZXIpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY29udHJhY3RVc2VyRGV0YWlscyAmJiBjb250cmFjdFVzZXJEZXRhaWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICBcIkV4dGFuZF9DbGFzc1wiLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjb250cmFjdFVzZXJEZXRhaWxzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInVzZXJuYW1lXCIsIF91c2VyLm5hbWUpO1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYWNjZXNzdG9rZW5cIiwgX3VzZXIuc2Vzc2lvblRva2VuKTtcbiAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAvLyBuYXZpZ2F0ZShgL2xvYWQvcmVjaXBpZW50U2lnblBkZi8ke3Jlcz8uZG9jSWR9LyR7cmVzPy5jb250YWN0SWR9YCk7XG4gICAgICAgICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJteV9tb2RhbFwiKS5jbG9zZSgpO1xuICAgICAgICAgIHNldElzUHVibGljQ29udGFjdChmYWxzZSk7XG4gICAgICAgICAgc2V0SXNQdWJsaWNUZW1wbGF0ZShmYWxzZSk7XG4gICAgICAgICAgc2V0SXNMb2FkaW5nKHtcbiAgICAgICAgICAgIGlzTG9hZDogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZXREb2N1bWVudElkKHJlcz8uZG9jSWQpO1xuICAgICAgICAgIGdldERvY3VtZW50RGV0YWlscyhyZXM/LmRvY0lkKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnIgXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWxlcnQoXCJQbGVhc2UgRW50ZXIgT1RQIVwiKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGhhbmRsZUNsb3NlT3RwID0gKCkgPT4ge1xuICAgIHNldElzUHVibGljQ29udGFjdChmYWxzZSk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgc2V0SXNPdHAoZmFsc2UpO1xuICAgIHNldE90cCgpO1xuICAgIHNldENvbnRhY3Qoe1xuICAgICAgbmFtZTogXCJcIixcbiAgICAgIGVtYWlsOiBcIlwiLFxuICAgICAgcGhvbmU6IFwiXCJcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxEbmRQcm92aWRlciBiYWNrZW5kPXtIVE1MNUJhY2tlbmR9PlxuICAgICAgPFRpdGxlIHRpdGxlPXtwcm9wcy50ZW1wbGF0ZUlkID8gXCJQdWJsaWMgU2lnblwiIDogXCJSZXF1ZXN0IFNpZ25cIn0gLz5cbiAgICAgIHtpc1N1YnNjcmlwdGlvbkV4cGlyZWQgPyAoXG4gICAgICAgIDxNb2RhbFVpXG4gICAgICAgICAgdGl0bGU9e1wiU3Vic2NyaXB0aW9uIEV4cGlyZWRcIn1cbiAgICAgICAgICBpc09wZW49e2lzU3Vic2NyaXB0aW9uRXhwaXJlZH1cbiAgICAgICAgICBzaG93Q2xvc2U9e2ZhbHNlfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBweS00IG1kOnB5LTUgZ2FwLTVcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gbWQ6dGV4dC1sZyBmb250LW5vcm1hbFwiPlxuICAgICAgICAgICAgICBPd25lciZhcG9zO3Mgc3Vic2NyaXB0aW9uIGhhcyBleHBpcmVkLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L01vZGFsVWk+XG4gICAgICApIDogKFxuICAgICAgICA8PlxuICAgICAgICAgIHtpc0xvYWRpbmcuaXNMb2FkID8gKFxuICAgICAgICAgICAgPExvYWRlcldpdGhNc2cgaXNMb2FkaW5nPXtpc0xvYWRpbmd9IC8+XG4gICAgICAgICAgKSA6IGhhbmRsZUVycm9yID8gKFxuICAgICAgICAgICAgPEhhbmRsZUVycm9yIGhhbmRsZUVycm9yPXtoYW5kbGVFcnJvcn0gLz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAge2lzVWlMb2FkaW5nICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGgtWzEwMHZoXSB3LWZ1bGwgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgei1bOTk5XSBiZy1bI2U2ZjJmMl0gYmctb3BhY2l0eS04MFwiPlxuICAgICAgICAgICAgICAgICAgPExvYWRlciAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1iYXNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgVGhpcyBtaWdodCB0YWtlIHNvbWUgdGltZVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7aXNDZWxlYnJhdGlvbiAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSB6LVsxMDAwXVwiPlxuICAgICAgICAgICAgICAgICAgPENvbmZldHRpXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPXt3aW5kb3cuaW5uZXJXaWR0aH1cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXt3aW5kb3cuaW5uZXJIZWlnaHR9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6XG4gICAgICAgICAgICAgICAgICAgIGlzRXhwaXJlZCB8fFxuICAgICAgICAgICAgICAgICAgICAoaXNEZWNsaW5lLmlzRGVjbGluZWQgJiYgaXNEZWNsaW5lLmN1cnJudCA9PT0gXCJhbm90aGVyXCIpXG4gICAgICAgICAgICAgICAgICAgICAgPyBcIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJhdXRvXCJcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIG9wLWNhcmQgb3ZlcmZsb3ctaGlkZGVuIGZsZXggZmxleC1jb2wgbWQ6ZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIGJnLWJhc2UtMzAwXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHshcmVxdWVzdFNpZ25Ub3VyICYmXG4gICAgICAgICAgICAgICAgICBzaWduZXJPYmplY3RJZCAmJlxuICAgICAgICAgICAgICAgICAgcmVxdWVzdFNpZ25Ub3VyRnVuY3Rpb24oKX1cbiAgICAgICAgICAgICAgICA8TW9kYWxVaVxuICAgICAgICAgICAgICAgICAgaXNPcGVuPXtpc0FsZXJ0LmlzU2hvd31cbiAgICAgICAgICAgICAgICAgIHRpdGxlPXtcIkFsZXJ0XCJ9XG4gICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZT17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7IGlzU2hvdzogZmFsc2UsIGFsZXJ0TWVzc2FnZTogXCJcIiB9KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIHAtWzIwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwPntpc0FsZXJ0LmFsZXJ0TWVzc2FnZX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7IGlzU2hvdzogZmFsc2UsIGFsZXJ0TWVzc2FnZTogXCJcIiB9KVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnkgbXQtMyBweC00XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIE9rXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9Nb2RhbFVpPlxuXG4gICAgICAgICAgICAgICAgPFRvdXJcbiAgICAgICAgICAgICAgICAgIHNob3dOdW1iZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgc2hvd05hdmlnYXRpb249e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgc2hvd05hdmlnYXRpb25OdW1iZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgb25SZXF1ZXN0Q2xvc2U9e2Nsb3NlVG91cn1cbiAgICAgICAgICAgICAgICAgIHN0ZXBzPXt0b3VyQ29uZmlnfVxuICAgICAgICAgICAgICAgICAgaXNPcGVuPXt3aWRnZXRzVG91cn1cbiAgICAgICAgICAgICAgICAgIHJvdW5kZWQ9ezV9XG4gICAgICAgICAgICAgICAgICBjbG9zZVdpdGhNYXNrPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICAgey8qIHRoaXMgbW9kYWwgaXMgdXNlZCB0byBzaG93IGRlY2xpbmUgYWxlcnQgKi99XG4gICAgICAgICAgICAgICAgPFBkZkRlY2xpbmVNb2RhbFxuICAgICAgICAgICAgICAgICAgc2hvdz17aXNEZWNsaW5lLmlzRGVjbGluZWR9XG4gICAgICAgICAgICAgICAgICBoZWFkTXNnPVwiRG9jdW1lbnQgZGVjbGluZVwiXG4gICAgICAgICAgICAgICAgICBib2R5TXNzZz17XG4gICAgICAgICAgICAgICAgICAgIGlzRGVjbGluZS5jdXJybnQgPT09IFwiU3VyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcIkFyZSB5b3Ugc3VyZSB3YW50IHRvIGRlY2xpbmUgdGhpcyBkb2N1bWVudCA/XCJcbiAgICAgICAgICAgICAgICAgICAgICA6IGlzRGVjbGluZS5jdXJybnQgPT09IFwiWW91RGVjbGluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIllvdSBoYXZlIGRlY2xpbmVkIHRoaXMgZG9jdW1lbnQhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXNEZWNsaW5lLmN1cnJudCA9PT0gXCJhbm90aGVyXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJZb3UgY2FuIG5vdCBzaWduIHRoaXMgZG9jdW1lbnQgYXMgaXQgaGFzIGJlZW4gZGVjbGluZWQvcmV2b2tlZC5cIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZm9vdGVyTWVzc2FnZT17aXNEZWNsaW5lLmN1cnJudCA9PT0gXCJTdXJlXCJ9XG4gICAgICAgICAgICAgICAgICBkZWNsaW5lRG9jPXtkZWNsaW5lRG9jfVxuICAgICAgICAgICAgICAgICAgc2V0SXNEZWNsaW5lPXtzZXRJc0RlY2xpbmV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7LyogdGhpcyBtb2RhbCBpcyB1c2VkIGZvciBzaG93IGV4cGlyZWQgYWxlcnQgKi99XG4gICAgICAgICAgICAgICAgPFBkZkRlY2xpbmVNb2RhbFxuICAgICAgICAgICAgICAgICAgc2hvdz17aXNFeHBpcmVkfVxuICAgICAgICAgICAgICAgICAgaGVhZE1zZz1cIkRvY3VtZW50IGV4cGlyZWRcIlxuICAgICAgICAgICAgICAgICAgYm9keU1zc2c9e2BUaGlzIGRvY3VtZW50IGV4cGlyZWQgb24gJHtleHBpcmVkRGF0ZX0gYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgdG8gc2lnbi5gfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgeyFpc0VtYWlsVmVyaWZpZWQgJiYgKFxuICAgICAgICAgICAgICAgICAgPFZlcmlmeUVtYWlsXG4gICAgICAgICAgICAgICAgICAgIGlzVmVyaWZ5TW9kYWw9e2lzVmVyaWZ5TW9kYWx9XG4gICAgICAgICAgICAgICAgICAgIHNldElzVmVyaWZ5TW9kYWw9e3NldElzVmVyaWZ5TW9kYWx9XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVZlcmlmeUVtYWlsPXtoYW5kbGVWZXJpZnlFbWFpbH1cbiAgICAgICAgICAgICAgICAgICAgc2V0T3RwPXtzZXRPdHB9XG4gICAgICAgICAgICAgICAgICAgIG90cD17b3RwfVxuICAgICAgICAgICAgICAgICAgICBvdHBMb2FkZXI9e290cExvYWRlcn1cbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVmVyaWZ5QnRuPXtoYW5kbGVWZXJpZnlCdG59XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVJlc2VuZD17aGFuZGxlUmVzZW5kfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgPE1vZGFsVWlcbiAgICAgICAgICAgICAgICAgIGlzT3Blbj17aXNQdWJsaWNDb250YWN0fVxuICAgICAgICAgICAgICAgICAgdGl0bGU9e2lzT3RwID8gXCJWZXJpZnkgZW1haWxcIiA6IFwiQ29udGFjdCBEZXRhaWxzXCJ9XG4gICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZT17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZU90cCgpO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtZnVsbCBwLVsyMHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICB7aXNPdHAgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPGZvcm0gb25TdWJtaXQ9e1ZlcmlmeU9UUH0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHdpbGwgZ2V0IGEgdmVyaWZpY2F0aW9uIGNvZGUgdmlhIGVtYWlsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cIm9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwib3RwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBWZXJpZmljYXRpb24gQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e290cH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0T3RwKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbW9kYWwtYWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZU90cCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyBcIkxvYWRpbmcuLi5cIiA6IFwiVmVyaWZ5XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVQdWJsaWNVc2VyfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwib3AtaW5wdXQgb3AtaW5wdXQtYm9yZGVyZWQgIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00IG9wYWNpdHktNzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCA4YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNlpNMTIuNzM1IDE0Yy42MTggMCAxLjA5My0uNTYxLjg3Mi0xLjEzOWE2LjAwMiA2LjAwMiAwIDAgMC0xMS4yMTUgMGMtLjIyLjU3OC4yNTQgMS4xMzkuODcyIDEuMTM5aDkuNDdaXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbnRhY3QubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cIm9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNCBoLTQgb3BhY2l0eS03MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yLjUgM0ExLjUgMS41IDAgMCAwIDEgNC41di43OTNjLjAyNi4wMDkuMDUxLjAyLjA3Ni4wMzJMNy42NzQgOC41MWMuMjA2LjEuNDQ2LjEuNjUyIDBsNi41OTgtMy4xODVBLjc1NS43NTUgMCAwIDEgMTUgNS4yOTNWNC41QTEuNSAxLjUgMCAwIDAgMTMuNSAzaC0xMVpcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNSA2Ljk1NCA4Ljk3OCA5Ljg2YTIuMjUgMi4yNSAwIDAgMS0xLjk1NiAwTDEgNi45NTRWMTEuNUExLjUgMS41IDAgMCAwIDIuNSAxM2gxMWExLjUgMS41IDAgMCAwIDEuNS0xLjVWNi45NTRaXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImVtYWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb250YWN0LmVtYWlsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbWFpbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwib3AtaW5wdXQgb3AtaW5wdXQtYm9yZGVyZWQgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy00IGgtNCBvcGFjaXR5LTcwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggOGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZaTTEyLjczNSAxNGMuNjE4IDAgMS4wOTMtLjU2MS44NzItMS4xMzlhNi4wMDIgNi4wMDIgMCAwIDAtMTEuMjE1IDBjLS4yMi41NzguMjU0IDEuMTM5Ljg3MiAxLjEzOWg5LjQ3WlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29udGFjdC5waG9uZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwaG9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJncm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwicGhvbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvcC1tb2RhbC1hY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlT3RwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gXCJMb2FkaW5nLi4uXCIgOiBcIlN1Ym1pdFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvTW9kYWxVaT5cbiAgICAgICAgICAgICAgICA8TW9kYWxVaVxuICAgICAgICAgICAgICAgICAgaXNPcGVuPXtkZWZhdWx0U2lnbkFsZXJ0LmlzU2hvd31cbiAgICAgICAgICAgICAgICAgIHRpdGxlPXtcIkF1dG8gc2lnblwifVxuICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+XG4gICAgICAgICAgICAgICAgICAgIHNldERlZmF1bHRTaWduQWxlcnQoeyBpc1Nob3c6IGZhbHNlLCBhbGVydE1lc3NhZ2U6IFwiXCIgfSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtZnVsbCBwLVsyMHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICA8cD57ZGVmYXVsdFNpZ25BbGVydC5hbGVydE1lc3NhZ2V9PC9wPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtWzFweF0gdy1mdWxsIG15LVsxNXB4XSBiZy1bIzlmOWY5Zl1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAge2RlZmF1bHRTaWduSW1nID8gKFxuICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGFkZERlZmF1bHRTaWduYXR1cmUoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFllc1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGVmYXVsdFNpZ25BbGVydCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Nob3c6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnRNZXNzYWdlOiBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9zZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7IGlzU2hvdzogZmFsc2UsIGFsZXJ0TWVzc2FnZTogXCJcIiB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIE9rXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L01vZGFsVWk+XG4gICAgICAgICAgICAgICAgey8qIHRoaXMgY29tcG9uZW50IHVzZWQgdG8gcmVuZGVyIGFsbCBwZGYgcGFnZXMgaW4gbGVmdCBzaWRlICovfVxuICAgICAgICAgICAgICAgIDxSZW5kZXJBbGxQZGZQYWdlXG4gICAgICAgICAgICAgICAgICBzaWduZXJQb3M9e3NpZ25lclBvc31cbiAgICAgICAgICAgICAgICAgIHNpZ25lck9iamVjdElkPXtzaWduZXJPYmplY3RJZH1cbiAgICAgICAgICAgICAgICAgIHNpZ25QZGZVcmw9e1xuICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzWzBdICYmXG4gICAgICAgICAgICAgICAgICAgIChwZGZEZXRhaWxzWzBdPy5TaWduZWRVcmwgfHwgcGRmRGV0YWlsc1swXT8uVVJMKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYWxsUGFnZXM9e2FsbFBhZ2VzfVxuICAgICAgICAgICAgICAgICAgc2V0QWxsUGFnZXM9e3NldEFsbFBhZ2VzfVxuICAgICAgICAgICAgICAgICAgc2V0UGFnZU51bWJlcj17c2V0UGFnZU51bWJlcn1cbiAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XG4gICAgICAgICAgICAgICAgICBjb250YWluZXJXSD17Y29udGFpbmVyV0h9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7LyogcGRmIHJlbmRlciB2aWV3ICovfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiIHctZnVsbCBtZDp3LVs1NyVdIGZsZXggbXItNFwiPlxuICAgICAgICAgICAgICAgICAgPFBkZlpvb21cbiAgICAgICAgICAgICAgICAgICAgc2V0U2NhbGU9e3NldFNjYWxlfVxuICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cbiAgICAgICAgICAgICAgICAgICAgc2V0Wm9vbVBlcmNlbnQ9e3NldFpvb21QZXJjZW50fVxuICAgICAgICAgICAgICAgICAgICB6b29tUGVyY2VudD17em9vbVBlcmNlbnR9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCIgdy1mdWxsIG1kOnctWzk1JV0gXCI+XG4gICAgICAgICAgICAgICAgICAgIHsvKiB0aGlzIG1vZGFsIGlzIHVzZWQgc2hvdyB0aGlzIGRvY3VtZW50IGlzIGFscmVhZHkgc2lnbiAqL31cbiAgICAgICAgICAgICAgICAgICAgPE1vZGFsVWlcbiAgICAgICAgICAgICAgICAgICAgICBpc09wZW49e2lzQ29tcGxldGVkLmlzTW9kYWx9XG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e1wiRG9jdW1lbnQgc2lnbmVkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzQ29tcGxldGVkKChwcmV2KSA9PiAoeyAuLi5wcmV2LCBpc01vZGFsOiBmYWxzZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VXaWR0aD17XG4gICAgICAgICAgICAgICAgICAgICAgICAhaXNDb21wbGV0ZWQ/Lm1lc3NhZ2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibWQ6bWluLXctWzQ0MHB4XSBtZDptYXgtdy1bNDAwcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtZnVsbCBwLVsyMHB4XSB0ZXh0LWJhc2UtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzQ29tcGxldGVkPy5tZXNzYWdlID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cD57aXNDb21wbGV0ZWQ/Lm1lc3NhZ2V9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC1bMTVweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEg8J+OiSBUaGlzIGRvY3VtZW50IGhhcyBiZWVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgc2lnbmVkIGJ5IGFsbCBwYXJ0aWNpcGFudHMhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICB7IWlzQ29tcGxldGVkPy5tZXNzYWdlICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG10LTQgZ2FwLTEgcHgtWzE1cHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRvUHJpbnQoZSwgcGRmVXJsLCBzZXRJc0Rvd25sb2FkaW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb250LVs1MDBdIHRleHQtWzEzcHhdIG1yLVs1cHhdIG9wLWJ0biBvcC1idG4tbmV1dHJhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtcHJpbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPlByaW50PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRG93bmxvYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9udC1bNTAwXSB0ZXh0LVsxM3B4XSBtci1bNXB4XSBvcC1idG4gb3AtYnRuLXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXdhcmQgbXgtWzNweF0gbGc6bXgtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb250LVs1MDBdIHRleHQtWzEzcHhdIG1yLVs1cHhdIG9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZFBkZihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZlVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0Rvd25sb2FkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1kb3dubG9hZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+RG93bmxvYWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9Nb2RhbFVpPlxuICAgICAgICAgICAgICAgICAgICB7aXNEb3dubG9hZGluZyA9PT0gXCJwZGZcIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCB6LVsxMDAwXSBpbnNldC0wIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGJnLWJsYWNrIGJnLW9wYWNpdHktMzBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxMb2FkZXIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPE1vZGFsVWlcbiAgICAgICAgICAgICAgICAgICAgICBpc09wZW49e2lzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIn1cbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0Rvd25sb2FkaW5nID09PSBcImNlcnRpZmljYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIkdlbmVyYXRpbmcgY2VydGlmaWNhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiUERGIERvd25sb2FkXCJcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHNldElzRG93bmxvYWRpbmcoXCJcIil9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtMyBtZDpwLTUgdGV4dC1bMTNweF0gbWQ6dGV4dC1iYXNlIHRleHQtY2VudGVyIHRleHQtYmFzZS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aXNEb3dubG9hZGluZyA9PT0gXCJjZXJ0aWZpY2F0ZVwifXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBZb3VyIGNvbXBsZXRpb24gY2VydGlmaWNhdGUgaXMgYmVpbmcgZ2VuZXJhdGVkLiBQbGVhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdCBtb21lbnRhcmlseS4gSWYgdGhlIGRvd25sb2FkIGRvZXNuJmFwb3M7dCBzdGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydGx5LCBjbGljayB0aGUgYnV0dG9uIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L01vZGFsVWk+XG4gICAgICAgICAgICAgICAgICAgIHsvKiB0aGlzIGNvbXBvbmVudCBpcyB1c2VkIGZvciBzaWduYXR1cmUgcGFkIG1vZGFsICovfVxuICAgICAgICAgICAgICAgICAgICA8U2lnblBhZFxuICAgICAgICAgICAgICAgICAgICAgIGlzU2lnblBhZD17aXNTaWduUGFkfVxuICAgICAgICAgICAgICAgICAgICAgIGlzU3RhbXA9e2lzU3RhbXB9XG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdD17c2V0SXNJbWFnZVNlbGVjdH1cbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cbiAgICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZT17c2V0SW1hZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgaXNJbWFnZVNlbGVjdD17aXNJbWFnZVNlbGVjdH1cbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZVJlZj17aW1hZ2VSZWZ9XG4gICAgICAgICAgICAgICAgICAgICAgb25JbWFnZUNoYW5nZT17b25JbWFnZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmU9e3NldFNpZ25hdHVyZX1cbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZT17aW1hZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgb25TYXZlSW1hZ2U9e3NhdmVJbWFnZX1cbiAgICAgICAgICAgICAgICAgICAgICBvblNhdmVTaWduPXtzYXZlU2lnbn1cbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2lnbj17ZGVmYXVsdFNpZ25JbWd9XG4gICAgICAgICAgICAgICAgICAgICAgbXlJbml0aWFsPXtteUluaXRpYWx9XG4gICAgICAgICAgICAgICAgICAgICAgaXNJbml0aWFsPXtpc0luaXRpYWx9XG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcD17c2V0SXNTdGFtcH1cbiAgICAgICAgICAgICAgICAgICAgICBjdXJyV2lkZ2V0c0RldGFpbHM9e2N1cnJXaWRnZXRzRGV0YWlsc31cbiAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e3NldEN1cnJXaWRnZXRzRGV0YWlsc31cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgey8qIHBkZiBoZWFkZXIgd2hpY2ggY29udGFpbiBmdW5pc2ggYmFjayBidXR0b24gKi99XG4gICAgICAgICAgICAgICAgICAgIDxIZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICBpc1BkZlJlcXVlc3RGaWxlcz17aXNQdWJsaWNUZW1wbGF0ZSA/IGZhbHNlIDogdHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxuICAgICAgICAgICAgICAgICAgICAgIGFsbFBhZ2VzPXthbGxQYWdlc31cbiAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VQYWdlPXtjaGFuZ2VQYWdlfVxuICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM9e3BkZkRldGFpbHN9XG4gICAgICAgICAgICAgICAgICAgICAgc2lnbmVyUG9zPXtzaWduZXJQb3N9XG4gICAgICAgICAgICAgICAgICAgICAgaXNTaWduZWQ9e2lzU2lnbmVkfVxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGxldGVkPXtpc0NvbXBsZXRlZC5pc0NlcnRpZmljYXRlfVxuICAgICAgICAgICAgICAgICAgICAgIGVtYmVkV2lkZ2V0c0RhdGE9e1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNQdWJsaWNUZW1wbGF0ZSA/IGhhbmRsZVVzZXJEZXRhaWxzIDogZW1iZWRXaWRnZXRzRGF0YVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpc1Nob3dIZWFkZXI9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNEZWNsaW5lPXtzZXRJc0RlY2xpbmV9XG4gICAgICAgICAgICAgICAgICAgICAgZGVjbGluZT17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2lnbmVyPXtjdXJyZW50U2lnbmVyfVxuICAgICAgICAgICAgICAgICAgICAgIHBkZlVybD17cGRmVXJsfVxuICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlTaWduPXthbHJlYWR5U2lnbn1cbiAgICAgICAgICAgICAgICAgICAgICB0b3RhbFpvb21QZXJjZW50PXt0b3RhbFpvb21QZXJjZW50fVxuICAgICAgICAgICAgICAgICAgICAgIHNldFRvdGFsWm9vbVBlcmNlbnQ9e3NldFRvdGFsWm9vbVBlcmNlbnR9XG4gICAgICAgICAgICAgICAgICAgICAgc2V0U2NhbGU9e3NldFNjYWxlfVxuICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZX1cbiAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cbiAgICAgICAgICAgICAgICAgICAgICBzZXRab29tUGVyY2VudD17c2V0Wm9vbVBlcmNlbnR9XG4gICAgICAgICAgICAgICAgICAgICAgem9vbVBlcmNlbnQ9e3pvb21QZXJjZW50fVxuICAgICAgICAgICAgICAgICAgICAgIGlzUHVibGljVGVtcGxhdGU9e2lzUHVibGljVGVtcGxhdGV9XG4gICAgICAgICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiByZWY9e2RpdlJlZn0gZGF0YS10dXQ9XCJwZGZBcmVhXCIgY2xhc3NOYW1lPVwiaC1bOTUlXVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHtjb250YWluZXJXSCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8UmVuZGVyUGRmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0g9e3BkZk9yaWdpbmFsV0h9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZk5ld1dpZHRoPXtwZGZOZXdXaWR0aH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTaWduUGFkPXtzZXRJc1NpZ25QYWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM9e3BkZkRldGFpbHN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lclBvcz17c2lnbmVyUG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzRW1haWw9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZVcmw9e3BkZlVybH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUGFnZXM9e251bVBhZ2VzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlRGV0YWlscz17cGFnZURldGFpbHN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZlJlcXVlc3Q9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lck9iamVjdElkPXtzaWduZXJPYmplY3RJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkU2lnbmVycz17c2lnbmVkU2lnbmVyc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGRmTG9hZD17c2V0UGRmTG9hZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmTG9hZD17cGRmTG9hZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmVyUG9zPXtzZXRTaWduZXJQb3N9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlQWxlcnQ9e3NldFZhbGlkYXRlQWxlcnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVuU2lnbmVkV2lkZ2V0SWQ9e3VuU2lnbmVkV2lkZ2V0SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e3NldEN1cnJXaWRnZXRzRGV0YWlsc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2UmVmPXtkaXZSZWZ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUmVzaXplPXtzZXRJc1Jlc2l6ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXNpemU9e2lzUmVzaXplfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUb3RhbFpvb21QZXJjZW50PXtzZXRUb3RhbFpvb21QZXJjZW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTY2FsZT17c2V0U2NhbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQ9e3VuaXF1ZUlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc3B1YmxpY1RlbXBsYXRlPXtpc1B1YmxpY1RlbXBsYXRlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyRGV0YWlscz17aGFuZGxlVXNlckRldGFpbHN9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBtZDp3LVsyMyVdIGJnLWJhc2UtMTAwIG92ZXJmbG93LXktYXV0byBoaWRlLXNjcm9sbGJhciBoaWRkZW4gbWQ6aW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YG1heC1oLXNjcmVlbmB9PlxuICAgICAgICAgICAgICAgICAgICB7c2lnbmVkU2lnbmVycy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXR1dD1cInJlYWN0b3VyU2Vjb25kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXgtMiBwci0yIHB0LTIgcGItMSB0ZXh0LVsxNXB4XSB0ZXh0LWJhc2UtY29udGVudCBmb250LXNlbWlib2xkIGJvcmRlci1iLVsxcHhdIGJvcmRlci1iYXNlLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiBTaWduZWQgYnk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtWzJweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3NpZ25lZFNpZ25lcnMubWFwKChvYmosIGluZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17aW5kfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNpZ25lckxpc3RDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmQ9e2luZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmo9e29ian1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01lbnU9e2lzSGVhZGVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lclBvcz17c2lnbmVyUG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgICAgICB7dW5zaWduZWRTaWduZXJzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwicmVhY3RvdXJGaXJzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14LTIgcHItMiBwdC0yIHBiLTEgdGV4dC1bMTVweF0gdGV4dC1iYXNlLWNvbnRlbnQgZm9udC1zZW1pYm9sZCBib3JkZXItYi1bMXB4XSBib3JkZXItYmFzZS0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5ZZXQgdG8gc2lnbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC1bNXB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dW5zaWduZWRTaWduZXJzLm1hcCgob2JqLCBpbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2luZH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTaWduZXJMaXN0Q29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kPXtpbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqPXtvYmp9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNZW51PXtpc0hlYWRlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZXJQb3M9e3NpZ25lclBvc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIHtkZWZhdWx0U2lnbkltZyAmJiAhYWxyZWFkeVNpZ24gJiYgY3VycmVudFNpZ25lciAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPERlZmF1bHRTaWduYXR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTaWduSW1nPXtkZWZhdWx0U2lnbkltZ31cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldERlZmF1bHRTaWduSW1nPXtzZXREZWZhdWx0U2lnbkltZ31cbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJPYmplY3RJZD17c2lnbmVyT2JqZWN0SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0xvYWRpbmc9e3NldElzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17c2lnbmVyUG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGVmYXVsdFNpZ25BbGVydD17c2V0RGVmYXVsdFNpZ25BbGVydH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgICA8TW9kYWxVaVxuICAgICAgICAgICAgaXNPcGVuPXt2YWxpZGF0ZUFsZXJ0fVxuICAgICAgICAgICAgdGl0bGU9e1wiVmFsaWRhdGlvbiBhbGVydFwifVxuICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHtcbiAgICAgICAgICAgICAgc2V0VmFsaWRhdGVBbGVydChmYWxzZSk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1bMTAwJV0gcC1bMjBweF1cIj5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgVGhlIGlucHV0IGRvZXMgbm90IG1lZXQgdGhlIGNyaXRlcmlhIHNldCBieSB0aGUgcmVndWxhclxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLVsxcHhdIGJnLVsjOWY5ZjlmXSB3LWZ1bGwgbXktWzE1cHhdXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWYWxpZGF0ZUFsZXJ0KGZhbHNlKX1cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENsb3NlXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9Nb2RhbFVpPlxuICAgICAgICA8Lz5cbiAgICAgICl9XG4gICAgPC9EbmRQcm92aWRlcj5cbiAgKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFBkZlJlcXVlc3RGaWxlcztcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuXHJcbmNvbnN0IEFsZXJ0ID0gKHsgY2hpbGRyZW4sIHR5cGUgfSkgPT4ge1xyXG4gIGNvbnN0IHRleHRjb2xvciA9IHR5cGUgPyB0aGVtZSh0eXBlKSA6IHRoZW1lKCk7XHJcbiAgZnVuY3Rpb24gdGhlbWUoY29sb3IpIHtcclxuICAgIHN3aXRjaCAoY29sb3IpIHtcclxuICAgICAgY2FzZSBcInN1Y2Nlc3NcIjpcclxuICAgICAgICByZXR1cm4gXCJvcC1hbGVydC1zdWNjZXNzXCI7XHJcbiAgICAgIGNhc2UgXCJpbmZvXCI6XHJcbiAgICAgICAgcmV0dXJuIFwib3AtYWxlcnQtaW5mb1wiO1xyXG4gICAgICBjYXNlIFwiZGFuZ2VyXCI6XHJcbiAgICAgICAgcmV0dXJuIFwib3AtYWxlcnQtZXJyb3JcIjtcclxuICAgICAgY2FzZSBcIndhcm5pbmdcIjpcclxuICAgICAgICByZXR1cm4gXCJvcC1hbGVydC13YXJuaW5nXCI7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiAoXHJcbiAgICBjaGlsZHJlbiAmJiAoXHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiei1bMTAwMF0gZml4ZWQgdG9wLTIwIGxlZnQtMS8yIHRyYW5zZm9ybSAtdHJhbnNsYXRlLXgtMS8yIHRleHQtc21cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YG9wLWFsZXJ0ICR7dGV4dGNvbG9yfWB9PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWwtM1wiPntjaGlsZHJlbn08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBbGVydDtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5cclxuZnVuY3Rpb24gSGFuZGxlRXJyb3IoeyBoYW5kbGVFcnJvciB9KSB7XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgaC1bMTAwdmhdXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzIwcHhdIHRleHQtW2dyYXldXCI+e2hhbmRsZUVycm9yfTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhhbmRsZUVycm9yO1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmNvbnN0IExvYWRlciA9ICgpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm9wLWxvYWRpbmcgb3AtbG9hZGluZy1pbmZpbml0eSB3LVs0cmVtXSB0ZXh0LW5ldXRyYWxcIj48L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExvYWRlcjtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBMb2FkZXIgZnJvbSBcIi4vTG9hZGVyXCI7XG5cbmZ1bmN0aW9uIExvYWRlcldpdGhNc2coeyBpc0xvYWRpbmcgfSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgaC1bMTAwdmhdXCI+XG4gICAgICA8TG9hZGVyIC8+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxM3B4XSB0ZXh0LWJhc2UtY290ZW50XCI+e2lzTG9hZGluZy5tZXNzYWdlfTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9hZGVyV2l0aE1zZztcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuY29uc3QgTW9kYWxVaSA9ICh7XG4gIGNoaWxkcmVuLFxuICB0aXRsZSxcbiAgaXNPcGVuLFxuICBoYW5kbGVDbG9zZSxcbiAgc2hvd0hlYWRlciA9IHRydWUsXG4gIHNob3dDbG9zZSA9IHRydWUsXG4gIHJlZHVjZVdpZHRoXG59KSA9PiB7XG4gIGNvbnN0IHdpZHRoID0gcmVkdWNlV2lkdGg7XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHtpc09wZW4gJiYgKFxuICAgICAgICA8ZGlhbG9nIGNsYXNzTmFtZT1cIm9wLW1vZGFsIG9wLW1vZGFsLW9wZW5cIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgICAgICB3aWR0aCB8fCBcIm1kOm1pbi13LVs1MDBweF1cIlxuICAgICAgICAgICAgfSBvcC1tb2RhbC1ib3ggcC0wIG1heC1oLTkwIG92ZXJmbG93LXktYXV0byBoaWRlLXNjcm9sbGJhciB0ZXh0LXNtYH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7c2hvd0hlYWRlciAmJiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtYmFzZS1jb250ZW50IGZvbnQtYm9sZCB0ZXh0LWxnIHB0LVsxNXB4XSBweC1bMjBweF1cIj5cbiAgICAgICAgICAgICAgICAgIHt0aXRsZX1cbiAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgIHtzaG93Q2xvc2UgJiYgKFxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXNtIG9wLWJ0bi1jaXJjbGUgb3AtYnRuLWdob3N0IHRleHQtYmFzZS1jb250ZW50IGFic29sdXRlIHJpZ2h0LTIgdG9wLTJcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVDbG9zZSAmJiBoYW5kbGVDbG9zZSgpfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICDinJVcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxkaXY+e2NoaWxkcmVufTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2RpYWxvZz5cbiAgICAgICl9XG4gICAgPC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNb2RhbFVpO1xuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgXCIuLi9zdHlsZXMvc2lnbmF0dXJlLmNzc1wiO1xuXG5mdW5jdGlvbiBDdXN0b21Nb2RhbCh7XG4gIHNob3csXG4gIGhlYWRNc2csXG4gIGJvZHlNc3NnLFxuICBmb290ZXJNZXNzYWdlLFxuICBkZWNsaW5lRG9jLFxuICBzZXRJc0RlY2xpbmVcbn0pIHtcbiAgY29uc3QgW3JlYXNvbiwgc2V0UmVhc29uXSA9IHVzZVN0YXRlKFwiXCIpO1xuICByZXR1cm4gKFxuICAgIHNob3cgJiYgKFxuICAgICAgPGRpYWxvZyBjbGFzc05hbWU9XCJvcC1tb2RhbCBvcC1tb2RhbC1vcGVuIGFic29sdXRlIHotWzQ0OF1cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LVs5NSVdIG1kOnctWzYwJV0gbGc6dy1bNDAlXSBvcC1tb2RhbC1ib3ggcC0wIG92ZXJmbG93LXktYXV0byBoaWRlLXNjcm9sbGJhciB0ZXh0LXNtXCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtYmFzZS1jb250ZW50IGZvbnQtYm9sZCB0ZXh0LWxnIHB0LVsxNXB4XSBweC1bMjBweF1cIj5cbiAgICAgICAgICAgIHtoZWFkTXNnICYmIGhlYWRNc2d9XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtWzEwcHhdIHB4LVsyMHB4XVwiPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1bMTVweF1cIj57Ym9keU1zc2cgJiYgYm9keU1zc2d9PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHtmb290ZXJNZXNzYWdlICYmIChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtM1wiPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgcm93cz17M31cbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmVhc29uIChvcHRpb25hbClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicHgtNCBvcC10ZXh0YXJlYSBvcC10ZXh0YXJlYS1ib3JkZXJlZCBmb2N1czpvdXRsaW5lLW5vbmUgaG92ZXI6Ym9yZGVyLWJhc2UtY29udGVudCB3LWZ1bGwgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17cmVhc29ufVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRSZWFzb24oZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgey8qIDxkaXYgY2xhc3NOYW1lPVwiaC1bMXB4XSBiZy1bIzlmOWY5Zl0gdy1mdWxsXCI+PC9kaXY+ICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm0tWzE1cHhdXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG1yLTIgcHgtNlwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UmVhc29uKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICBkZWNsaW5lRG9jKHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIFllc1xuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRSZWFzb24oXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIHNldElzRGVjbGluZSh7IGlzRGVjbGluZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDbG9zZVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaWFsb2c+XG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDdXN0b21Nb2RhbDtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVG91ckNvbnRlbnRXaXRoQnRuKHsgbWVzc2FnZSwgaXNDaGVja2VkIH0pIHtcclxuICBjb25zdCBbaXNDaGVjaywgc2V0SXNDaGVja10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNoZWNrID0gKCkgPT4ge1xyXG4gICAgc2V0SXNDaGVjayghaXNDaGVjayk7XHJcbiAgICBpZiAoaXNDaGVja2VkKSB7XHJcbiAgICAgIGlzQ2hlY2tlZCghaXNDaGVjayk7XHJcbiAgICB9XHJcbiAgfTtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdj5cclxuICAgICAgPHA+e21lc3NhZ2V9PC9wPlxyXG4gICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbWItMFwiPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWNoZWNrYm94IG9wLWNoZWNrYm94LXhzIG1yLTFcIlxyXG4gICAgICAgICAgY2hlY2tlZD17aXNDaGVja31cclxuICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGVja31cclxuICAgICAgICAvPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIiM3ODc4NzggdGV4dC1bMTJweF1cIj5Eb24mYXBvczt0IHNob3cgdGhpcyBhZ2Fpbjwvc3Bhbj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuIiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UgfSBmcm9tIFwiQHJlZHV4anMvdG9vbGtpdFwiO1xyXG5cclxuY29uc3Qgc2hvd1RlbmFudFNsaWNlID0gY3JlYXRlU2xpY2Uoe1xyXG4gIG5hbWU6IFwic2hvd1RlbmFudFwiLFxyXG4gIGluaXRpYWxTdGF0ZTogXCJcIixcclxuICByZWR1Y2Vyczoge1xyXG4gICAgc2hvd1RlbmFudDogKHN0YXRlLCBhY3Rpb24pID0+IHtcclxuICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xyXG4gICAgfSxcclxuICB9LFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCB7IHNob3dUZW5hbnQgfSA9IHNob3dUZW5hbnRTbGljZS5hY3Rpb25zO1xyXG5leHBvcnQgZGVmYXVsdCBzaG93VGVuYW50U2xpY2UucmVkdWNlcjsiLCJpbXBvcnQgeyBjcmVhdGVTbGljZSB9IGZyb20gXCJAcmVkdXhqcy90b29sa2l0XCI7XHJcblxyXG5jb25zdCB0b3VyU3RlcFNsaWNlID0gY3JlYXRlU2xpY2Uoe1xyXG4gIG5hbWU6IFwidG91clN0ZXBcIixcclxuICBpbml0aWFsU3RhdGU6IFtdLFxyXG4gIHJlZHVjZXJzOiB7XHJcbiAgICBzYXZlVG91clN0ZXBzOiAoc3RhdGUsIGFjdGlvbikgPT4ge1xyXG4gICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XHJcbiAgICB9LFxyXG4gICAgcmVtb3ZlVG91clN0ZXBzOiAoKSA9PiB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHsgc2F2ZVRvdXJTdGVwcywgcmVtb3ZlVG91clN0ZXBzIH0gPSB0b3VyU3RlcFNsaWNlLmFjdGlvbnM7XHJcbmV4cG9ydCBkZWZhdWx0IHRvdXJTdGVwU2xpY2UucmVkdWNlcjtcclxuIiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UgfSBmcm9tIFwiQHJlZHV4anMvdG9vbGtpdFwiO1xuaW1wb3J0IHsgYXBwSW5mbyB9IGZyb20gXCIuLi8uLi9jb25zdGFudC9hcHBpbmZvXCI7XG5cbmNvbnN0IGluZm9TbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgbmFtZTogXCJpbmZvXCIsXG4gIGluaXRpYWxTdGF0ZToge30sXG4gIHJlZHVjZXJzOiB7XG4gICAgZmV0Y2hBcHBJbmZvOiAoKSA9PiB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImJhc2VVcmxcIiwgYCR7YXBwSW5mby5iYXNlVXJsfS9gKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwicGFyc2VBcHBJZFwiLCBhcHBJbmZvLmFwcElkKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYXBwTG9nb1wiLCBhcHBJbmZvLmFwcGxvZ28pO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJ1c2VyU2V0dGluZ3NcIik7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInVzZXJTZXR0aW5nc1wiLCBKU09OLnN0cmluZ2lmeShhcHBJbmZvLnNldHRpbmdzKSk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImZldl9JY29uXCIsIGFwcEluZm8uZmV2X0ljb24pO1xuICAgICAgcmV0dXJuIGFwcEluZm87XG4gICAgfVxuICB9XG59KTtcbmV4cG9ydCBjb25zdCB7IGZldGNoQXBwSW5mbyB9ID0gaW5mb1NsaWNlLmFjdGlvbnM7XG5leHBvcnQgZGVmYXVsdCBpbmZvU2xpY2UucmVkdWNlcjtcbiIsImltcG9ydCB7IGNyZWF0ZVNsaWNlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcclxuXHJcbmNvbnN0IHNob3dIZWFkZXJTbGljZSA9IGNyZWF0ZVNsaWNlKHtcclxuICBuYW1lOiBcInNob3dUZW5hbnRcIixcclxuICBpbml0aWFsU3RhdGU6IFwiXCIsXHJcbiAgcmVkdWNlcnM6IHtcclxuICAgIHNob3dIZWFkZXI6IChzdGF0ZSwgYWN0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHsgc2hvd0hlYWRlciB9ID0gc2hvd0hlYWRlclNsaWNlLmFjdGlvbnM7XHJcbmV4cG9ydCBkZWZhdWx0IHNob3dIZWFkZXJTbGljZS5yZWR1Y2VyO1xyXG4iLCIvLyBpbXBvcnQgeyBjcmVhdGVTdG9yZSwgYXBwbHlNaWRkbGV3YXJlIH0gZnJvbSBcInJlZHV4XCI7XHJcbi8vIGltcG9ydCB0aHVuayBmcm9tIFwicmVkdXgtdGh1bmtcIjtcclxuLy8gaW1wb3J0IHJlZHVjZXJzIGZyb20gXCIuL3JlZHVjZXJzXCI7XHJcblxyXG4vLyBleHBvcnQgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShyZWR1Y2VycywgYXBwbHlNaWRkbGV3YXJlKHRodW5rKSk7XHJcbmltcG9ydCB7IGNvbmZpZ3VyZVN0b3JlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcclxuaW1wb3J0IGluZm9SZWR1Y2VyIGZyb20gXCIuL3JlZHVjZXJzL2luZm9SZWR1Y2VyXCI7XHJcbmltcG9ydCBTaG93VGVuYW50IGZyb20gXCIuL3JlZHVjZXJzL1Nob3dUZW5hbnRcIjtcclxuaW1wb3J0IFRvdXJTdGVwc1JlZHVjZXIgZnJvbSBcIi4vcmVkdWNlcnMvVG91clN0ZXBzUmVkdWNlclwiO1xyXG5pbXBvcnQgc2hvd0hlYWRlciBmcm9tIFwiLi9yZWR1Y2Vycy9zaG93SGVhZGVyXCI7XHJcbmV4cG9ydCBjb25zdCBzdG9yZSA9IGNvbmZpZ3VyZVN0b3JlKHtcclxuICByZWR1Y2VyOiB7XHJcbiAgICBhcHBJbmZvOiBpbmZvUmVkdWNlcixcclxuICAgIFRvdXJTdGVwczogVG91clN0ZXBzUmVkdWNlcixcclxuICAgIFNob3dUZW5hbnQsXHJcbiAgICBzaG93SGVhZGVyXHJcbiAgfVxyXG59KTtcclxuIiwiZnVuY3Rpb24gcihlKXt2YXIgbyx0LGY9XCJcIjtpZihcInN0cmluZ1wiPT10eXBlb2YgZXx8XCJudW1iZXJcIj09dHlwZW9mIGUpZis9ZTtlbHNlIGlmKFwib2JqZWN0XCI9PXR5cGVvZiBlKWlmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciBuPWUubGVuZ3RoO2ZvcihvPTA7bzxuO28rKyllW29dJiYodD1yKGVbb10pKSYmKGYmJihmKz1cIiBcIiksZis9dCl9ZWxzZSBmb3IodCBpbiBlKWVbdF0mJihmJiYoZis9XCIgXCIpLGYrPXQpO3JldHVybiBmfWZ1bmN0aW9uIGUoKXtmb3IodmFyIGUsbyx0PTAsZj1cIlwiLG49YXJndW1lbnRzLmxlbmd0aDt0PG47dCsrKShlPWFyZ3VtZW50c1t0XSkmJihvPXIoZSkpJiYoZiYmKGYrPVwiIFwiKSxmKz1vKTtyZXR1cm4gZn1tb2R1bGUuZXhwb3J0cz1lLG1vZHVsZS5leHBvcnRzLmNsc3g9ZTsiLCJ2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG52YXIgdG9DbGFzc05hbWUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcbiAgICAgICAgc3RyICs9IHZhbDtcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICB2YXIgdG1wID0gdm9pZCAwO1xuICAgICAgICBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICB2YXIgbCA9IHZhbC5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoaSA8IGwpIHtcbiAgICAgICAgICAgICAgICB0bXAgPSB0b0NsYXNzTmFtZSh2YWxbaSsrXSk7XG4gICAgICAgICAgICAgICAgaWYgKHRtcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSB0bXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pblxuICAgICAgICAgICAgZm9yICh0bXAgaW4gdmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRtcCAmJiB2YWxbdG1wXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSB0bXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNuYigpIHtcbiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBuO1xuICAgIHZhciB0bXA7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICBuID0gYXJndW1lbnRzW2krK107XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICB0bXAgPSB0b0NsYXNzTmFtZShuKTtcbiAgICAgICAgICAgIGlmICh0bXApIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0ciArPSB0bXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbiIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi9lbmMtYmFzZTY0XCIpLCByZXF1aXJlKFwiLi9tZDVcIiksIHJlcXVpcmUoXCIuL2V2cGtkZlwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vZW5jLWJhc2U2NFwiLCBcIi4vbWQ1XCIsIFwiLi9ldnBrZGZcIiwgXCIuL2NpcGhlci1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmxvY2tDaXBoZXIgPSBDX2xpYi5CbG9ja0NpcGhlcjtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8vIExvb2t1cCB0YWJsZXNcblx0ICAgIHZhciBTQk9YID0gW107XG5cdCAgICB2YXIgSU5WX1NCT1ggPSBbXTtcblx0ICAgIHZhciBTVUJfTUlYXzAgPSBbXTtcblx0ICAgIHZhciBTVUJfTUlYXzEgPSBbXTtcblx0ICAgIHZhciBTVUJfTUlYXzIgPSBbXTtcblx0ICAgIHZhciBTVUJfTUlYXzMgPSBbXTtcblx0ICAgIHZhciBJTlZfU1VCX01JWF8wID0gW107XG5cdCAgICB2YXIgSU5WX1NVQl9NSVhfMSA9IFtdO1xuXHQgICAgdmFyIElOVl9TVUJfTUlYXzIgPSBbXTtcblx0ICAgIHZhciBJTlZfU1VCX01JWF8zID0gW107XG5cblx0ICAgIC8vIENvbXB1dGUgbG9va3VwIHRhYmxlc1xuXHQgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvLyBDb21wdXRlIGRvdWJsZSB0YWJsZVxuXHQgICAgICAgIHZhciBkID0gW107XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuXHQgICAgICAgICAgICBpZiAoaSA8IDEyOCkge1xuXHQgICAgICAgICAgICAgICAgZFtpXSA9IGkgPDwgMTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGRbaV0gPSAoaSA8PCAxKSBeIDB4MTFiO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gV2FsayBHRigyXjgpXG5cdCAgICAgICAgdmFyIHggPSAwO1xuXHQgICAgICAgIHZhciB4aSA9IDA7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuXHQgICAgICAgICAgICAvLyBDb21wdXRlIHNib3hcblx0ICAgICAgICAgICAgdmFyIHN4ID0geGkgXiAoeGkgPDwgMSkgXiAoeGkgPDwgMikgXiAoeGkgPDwgMykgXiAoeGkgPDwgNCk7XG5cdCAgICAgICAgICAgIHN4ID0gKHN4ID4+PiA4KSBeIChzeCAmIDB4ZmYpIF4gMHg2Mztcblx0ICAgICAgICAgICAgU0JPWFt4XSA9IHN4O1xuXHQgICAgICAgICAgICBJTlZfU0JPWFtzeF0gPSB4O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgbXVsdGlwbGljYXRpb25cblx0ICAgICAgICAgICAgdmFyIHgyID0gZFt4XTtcblx0ICAgICAgICAgICAgdmFyIHg0ID0gZFt4Ml07XG5cdCAgICAgICAgICAgIHZhciB4OCA9IGRbeDRdO1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgc3ViIGJ5dGVzLCBtaXggY29sdW1ucyB0YWJsZXNcblx0ICAgICAgICAgICAgdmFyIHQgPSAoZFtzeF0gKiAweDEwMSkgXiAoc3ggKiAweDEwMTAxMDApO1xuXHQgICAgICAgICAgICBTVUJfTUlYXzBbeF0gPSAodCA8PCAyNCkgfCAodCA+Pj4gOCk7XG5cdCAgICAgICAgICAgIFNVQl9NSVhfMVt4XSA9ICh0IDw8IDE2KSB8ICh0ID4+PiAxNik7XG5cdCAgICAgICAgICAgIFNVQl9NSVhfMlt4XSA9ICh0IDw8IDgpICB8ICh0ID4+PiAyNCk7XG5cdCAgICAgICAgICAgIFNVQl9NSVhfM1t4XSA9IHQ7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBpbnYgc3ViIGJ5dGVzLCBpbnYgbWl4IGNvbHVtbnMgdGFibGVzXG5cdCAgICAgICAgICAgIHZhciB0ID0gKHg4ICogMHgxMDEwMTAxKSBeICh4NCAqIDB4MTAwMDEpIF4gKHgyICogMHgxMDEpIF4gKHggKiAweDEwMTAxMDApO1xuXHQgICAgICAgICAgICBJTlZfU1VCX01JWF8wW3N4XSA9ICh0IDw8IDI0KSB8ICh0ID4+PiA4KTtcblx0ICAgICAgICAgICAgSU5WX1NVQl9NSVhfMVtzeF0gPSAodCA8PCAxNikgfCAodCA+Pj4gMTYpO1xuXHQgICAgICAgICAgICBJTlZfU1VCX01JWF8yW3N4XSA9ICh0IDw8IDgpICB8ICh0ID4+PiAyNCk7XG5cdCAgICAgICAgICAgIElOVl9TVUJfTUlYXzNbc3hdID0gdDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIG5leHQgY291bnRlclxuXHQgICAgICAgICAgICBpZiAoIXgpIHtcblx0ICAgICAgICAgICAgICAgIHggPSB4aSA9IDE7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB4ID0geDIgXiBkW2RbZFt4OCBeIHgyXV1dO1xuXHQgICAgICAgICAgICAgICAgeGkgXj0gZFtkW3hpXV07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvLyBQcmVjb21wdXRlZCBSY29uIGxvb2t1cFxuXHQgICAgdmFyIFJDT04gPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNl07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQUVTIGJsb2NrIGNpcGhlciBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBBRVMgPSBDX2FsZ28uQUVTID0gQmxvY2tDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgdDtcblxuXHQgICAgICAgICAgICAvLyBTa2lwIHJlc2V0IG9mIG5Sb3VuZHMgaGFzIGJlZW4gc2V0IGJlZm9yZSBhbmQga2V5IGRpZCBub3QgY2hhbmdlXG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9uUm91bmRzICYmIHRoaXMuX2tleVByaW9yUmVzZXQgPT09IHRoaXMuX2tleSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLl9rZXlQcmlvclJlc2V0ID0gdGhpcy5fa2V5O1xuXHQgICAgICAgICAgICB2YXIga2V5V29yZHMgPSBrZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBrZXlTaXplID0ga2V5LnNpZ0J5dGVzIC8gNDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIG51bWJlciBvZiByb3VuZHNcblx0ICAgICAgICAgICAgdmFyIG5Sb3VuZHMgPSB0aGlzLl9uUm91bmRzID0ga2V5U2l6ZSArIDY7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBudW1iZXIgb2Yga2V5IHNjaGVkdWxlIHJvd3Ncblx0ICAgICAgICAgICAgdmFyIGtzUm93cyA9IChuUm91bmRzICsgMSkgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUga2V5IHNjaGVkdWxlXG5cdCAgICAgICAgICAgIHZhciBrZXlTY2hlZHVsZSA9IHRoaXMuX2tleVNjaGVkdWxlID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGtzUm93ID0gMDsga3NSb3cgPCBrc1Jvd3M7IGtzUm93KyspIHtcblx0ICAgICAgICAgICAgICAgIGlmIChrc1JvdyA8IGtleVNpemUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBrZXlTY2hlZHVsZVtrc1Jvd10gPSBrZXlXb3Jkc1trc1Jvd107XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgPSBrZXlTY2hlZHVsZVtrc1JvdyAtIDFdO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCEoa3NSb3cgJSBrZXlTaXplKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBSb3Qgd29yZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKHQgPDwgOCkgfCAodCA+Pj4gMjQpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YiB3b3JkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoU0JPWFt0ID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHQgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyh0ID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFt0ICYgMHhmZl07XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWl4IFJjb25cblx0ICAgICAgICAgICAgICAgICAgICAgICAgdCBePSBSQ09OWyhrc1JvdyAvIGtleVNpemUpIHwgMF0gPDwgMjQ7XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlTaXplID4gNiAmJiBrc1JvdyAlIGtleVNpemUgPT0gNCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWIgd29yZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKFNCT1hbdCA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyh0ID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsodCA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbdCAmIDB4ZmZdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIGtleVNjaGVkdWxlW2tzUm93XSA9IGtleVNjaGVkdWxlW2tzUm93IC0ga2V5U2l6ZV0gXiB0O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBpbnYga2V5IHNjaGVkdWxlXG5cdCAgICAgICAgICAgIHZhciBpbnZLZXlTY2hlZHVsZSA9IHRoaXMuX2ludktleVNjaGVkdWxlID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGludktzUm93ID0gMDsgaW52S3NSb3cgPCBrc1Jvd3M7IGludktzUm93KyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBrc1JvdyA9IGtzUm93cyAtIGludktzUm93O1xuXG5cdCAgICAgICAgICAgICAgICBpZiAoaW52S3NSb3cgJSA0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBrZXlTY2hlZHVsZVtrc1Jvd107XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ga2V5U2NoZWR1bGVba3NSb3cgLSA0XTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgaWYgKGludktzUm93IDwgNCB8fCBrc1JvdyA8PSA0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW52S2V5U2NoZWR1bGVbaW52S3NSb3ddID0gdDtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW52S2V5U2NoZWR1bGVbaW52S3NSb3ddID0gSU5WX1NVQl9NSVhfMFtTQk9YW3QgPj4+IDI0XV0gXiBJTlZfU1VCX01JWF8xW1NCT1hbKHQgPj4+IDE2KSAmIDB4ZmZdXSBeXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WX1NVQl9NSVhfMltTQk9YWyh0ID4+PiA4KSAmIDB4ZmZdXSBeIElOVl9TVUJfTUlYXzNbU0JPWFt0ICYgMHhmZl1dO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGVuY3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICB0aGlzLl9kb0NyeXB0QmxvY2soTSwgb2Zmc2V0LCB0aGlzLl9rZXlTY2hlZHVsZSwgU1VCX01JWF8wLCBTVUJfTUlYXzEsIFNVQl9NSVhfMiwgU1VCX01JWF8zLCBTQk9YKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZGVjcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFN3YXAgMm5kIGFuZCA0dGggcm93c1xuXHQgICAgICAgICAgICB2YXIgdCA9IE1bb2Zmc2V0ICsgMV07XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMV0gPSBNW29mZnNldCArIDNdO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDNdID0gdDtcblxuXHQgICAgICAgICAgICB0aGlzLl9kb0NyeXB0QmxvY2soTSwgb2Zmc2V0LCB0aGlzLl9pbnZLZXlTY2hlZHVsZSwgSU5WX1NVQl9NSVhfMCwgSU5WX1NVQl9NSVhfMSwgSU5WX1NVQl9NSVhfMiwgSU5WX1NVQl9NSVhfMywgSU5WX1NCT1gpO1xuXG5cdCAgICAgICAgICAgIC8vIEludiBzd2FwIDJuZCBhbmQgNHRoIHJvd3Ncblx0ICAgICAgICAgICAgdmFyIHQgPSBNW29mZnNldCArIDFdO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDFdID0gTVtvZmZzZXQgKyAzXTtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAzXSA9IHQ7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0NyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQsIGtleVNjaGVkdWxlLCBTVUJfTUlYXzAsIFNVQl9NSVhfMSwgU1VCX01JWF8yLCBTVUJfTUlYXzMsIFNCT1gpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIG5Sb3VuZHMgPSB0aGlzLl9uUm91bmRzO1xuXG5cdCAgICAgICAgICAgIC8vIEdldCBpbnB1dCwgYWRkIHJvdW5kIGtleVxuXHQgICAgICAgICAgICB2YXIgczAgPSBNW29mZnNldF0gICAgIF4ga2V5U2NoZWR1bGVbMF07XG5cdCAgICAgICAgICAgIHZhciBzMSA9IE1bb2Zmc2V0ICsgMV0gXiBrZXlTY2hlZHVsZVsxXTtcblx0ICAgICAgICAgICAgdmFyIHMyID0gTVtvZmZzZXQgKyAyXSBeIGtleVNjaGVkdWxlWzJdO1xuXHQgICAgICAgICAgICB2YXIgczMgPSBNW29mZnNldCArIDNdIF4ga2V5U2NoZWR1bGVbM107XG5cblx0ICAgICAgICAgICAgLy8gS2V5IHNjaGVkdWxlIHJvdyBjb3VudGVyXG5cdCAgICAgICAgICAgIHZhciBrc1JvdyA9IDQ7XG5cblx0ICAgICAgICAgICAgLy8gUm91bmRzXG5cdCAgICAgICAgICAgIGZvciAodmFyIHJvdW5kID0gMTsgcm91bmQgPCBuUm91bmRzOyByb3VuZCsrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaGlmdCByb3dzLCBzdWIgYnl0ZXMsIG1peCBjb2x1bW5zLCBhZGQgcm91bmQga2V5XG5cdCAgICAgICAgICAgICAgICB2YXIgdDAgPSBTVUJfTUlYXzBbczAgPj4+IDI0XSBeIFNVQl9NSVhfMVsoczEgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWF8yWyhzMiA+Pj4gOCkgJiAweGZmXSBeIFNVQl9NSVhfM1tzMyAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgICAgICB2YXIgdDEgPSBTVUJfTUlYXzBbczEgPj4+IDI0XSBeIFNVQl9NSVhfMVsoczIgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWF8yWyhzMyA+Pj4gOCkgJiAweGZmXSBeIFNVQl9NSVhfM1tzMCAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgICAgICB2YXIgdDIgPSBTVUJfTUlYXzBbczIgPj4+IDI0XSBeIFNVQl9NSVhfMVsoczMgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWF8yWyhzMCA+Pj4gOCkgJiAweGZmXSBeIFNVQl9NSVhfM1tzMSAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgICAgICB2YXIgdDMgPSBTVUJfTUlYXzBbczMgPj4+IDI0XSBeIFNVQl9NSVhfMVsoczAgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWF8yWyhzMSA+Pj4gOCkgJiAweGZmXSBeIFNVQl9NSVhfM1tzMiAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cblx0ICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZVxuXHQgICAgICAgICAgICAgICAgczAgPSB0MDtcblx0ICAgICAgICAgICAgICAgIHMxID0gdDE7XG5cdCAgICAgICAgICAgICAgICBzMiA9IHQyO1xuXHQgICAgICAgICAgICAgICAgczMgPSB0Mztcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFNoaWZ0IHJvd3MsIHN1YiBieXRlcywgYWRkIHJvdW5kIGtleVxuXHQgICAgICAgICAgICB2YXIgdDAgPSAoKFNCT1hbczAgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczEgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMiA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczMgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgdmFyIHQxID0gKChTQk9YW3MxID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMyID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczMgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MwICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgIHZhciB0MiA9ICgoU0JPWFtzMiA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMyA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMwID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMSAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICB2YXIgdDMgPSAoKFNCT1hbczMgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczAgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMSA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczIgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblxuXHQgICAgICAgICAgICAvLyBTZXQgb3V0cHV0XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0XSAgICAgPSB0MDtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAxXSA9IHQxO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDJdID0gdDI7XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgM10gPSB0Mztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAga2V5U2l6ZTogMjU2LzMyXG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbnMgdG8gdGhlIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5BRVMuZW5jcnlwdChtZXNzYWdlLCBrZXksIGNmZyk7XG5cdCAgICAgKiAgICAgdmFyIHBsYWludGV4dCAgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdChjaXBoZXJ0ZXh0LCBrZXksIGNmZyk7XG5cdCAgICAgKi9cblx0ICAgIEMuQUVTID0gQmxvY2tDaXBoZXIuX2NyZWF0ZUhlbHBlcihBRVMpO1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLkFFUztcblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi9ldnBrZGZcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vZXZwa2RmXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQvKipcblx0ICogQ2lwaGVyIGNvcmUgY29tcG9uZW50cy5cblx0ICovXG5cdENyeXB0b0pTLmxpYi5DaXBoZXIgfHwgKGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIEJhc2UgPSBDX2xpYi5CYXNlO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtID0gQ19saWIuQnVmZmVyZWRCbG9ja0FsZ29yaXRobTtcblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jO1xuXHQgICAgdmFyIFV0ZjggPSBDX2VuYy5VdGY4O1xuXHQgICAgdmFyIEJhc2U2NCA9IENfZW5jLkJhc2U2NDtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cdCAgICB2YXIgRXZwS0RGID0gQ19hbGdvLkV2cEtERjtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBYnN0cmFjdCBiYXNlIGNpcGhlciB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0ga2V5U2l6ZSBUaGlzIGNpcGhlcidzIGtleSBzaXplLiBEZWZhdWx0OiA0ICgxMjggYml0cylcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpdlNpemUgVGhpcyBjaXBoZXIncyBJViBzaXplLiBEZWZhdWx0OiA0ICgxMjggYml0cylcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBfRU5DX1hGT1JNX01PREUgQSBjb25zdGFudCByZXByZXNlbnRpbmcgZW5jcnlwdGlvbiBtb2RlLlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IF9ERUNfWEZPUk1fTU9ERSBBIGNvbnN0YW50IHJlcHJlc2VudGluZyBkZWNyeXB0aW9uIG1vZGUuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDaXBoZXIgPSBDX2xpYi5DaXBoZXIgPSBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IGl2IFRoZSBJViB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQmFzZS5leHRlbmQoKSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgdGhpcyBjaXBoZXIgaW4gZW5jcnlwdGlvbiBtb2RlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGtleSBUaGUga2V5LlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJ9IEEgY2lwaGVyIGluc3RhbmNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVyID0gQ3J5cHRvSlMuYWxnby5BRVMuY3JlYXRlRW5jcnlwdG9yKGtleVdvcmRBcnJheSwgeyBpdjogaXZXb3JkQXJyYXkgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY3JlYXRlRW5jcnlwdG9yOiBmdW5jdGlvbiAoa2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMuX0VOQ19YRk9STV9NT0RFLCBrZXksIGNmZyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgdGhpcyBjaXBoZXIgaW4gZGVjcnlwdGlvbiBtb2RlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGtleSBUaGUga2V5LlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJ9IEEgY2lwaGVyIGluc3RhbmNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVyID0gQ3J5cHRvSlMuYWxnby5BRVMuY3JlYXRlRGVjcnlwdG9yKGtleVdvcmRBcnJheSwgeyBpdjogaXZXb3JkQXJyYXkgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY3JlYXRlRGVjcnlwdG9yOiBmdW5jdGlvbiAoa2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMuX0RFQ19YRk9STV9NT0RFLCBrZXksIGNmZyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBjaXBoZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0geGZvcm1Nb2RlIEVpdGhlciB0aGUgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIHRyYW5zb3JtYXRpb24gbW9kZSBjb25zdGFudC5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlciA9IENyeXB0b0pTLmFsZ28uQUVTLmNyZWF0ZShDcnlwdG9KUy5hbGdvLkFFUy5fRU5DX1hGT1JNX01PREUsIGtleVdvcmRBcnJheSwgeyBpdjogaXZXb3JkQXJyYXkgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKHhmb3JtTW9kZSwga2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIHRoaXMuY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gU3RvcmUgdHJhbnNmb3JtIG1vZGUgYW5kIGtleVxuXHQgICAgICAgICAgICB0aGlzLl94Zm9ybU1vZGUgPSB4Zm9ybU1vZGU7XG5cdCAgICAgICAgICAgIHRoaXMuX2tleSA9IGtleTtcblxuXHQgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZXNldHMgdGhpcyBjaXBoZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGNpcGhlci5yZXNldCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFJlc2V0IGRhdGEgYnVmZmVyXG5cdCAgICAgICAgICAgIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0ucmVzZXQuY2FsbCh0aGlzKTtcblxuXHQgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWNpcGhlciBsb2dpY1xuXHQgICAgICAgICAgICB0aGlzLl9kb1Jlc2V0KCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEFkZHMgZGF0YSB0byBiZSBlbmNyeXB0ZWQgb3IgZGVjcnlwdGVkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBkYXRhVXBkYXRlIFRoZSBkYXRhIHRvIGVuY3J5cHQgb3IgZGVjcnlwdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRhdGEgYWZ0ZXIgcHJvY2Vzc2luZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5wcm9jZXNzKCdkYXRhJyk7XG5cdCAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIucHJvY2Vzcyh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIChkYXRhVXBkYXRlKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGVuZFxuXHQgICAgICAgICAgICB0aGlzLl9hcHBlbmQoZGF0YVVwZGF0ZSk7XG5cblx0ICAgICAgICAgICAgLy8gUHJvY2VzcyBhdmFpbGFibGUgYmxvY2tzXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzKCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEZpbmFsaXplcyB0aGUgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIHByb2Nlc3MuXG5cdCAgICAgICAgICogTm90ZSB0aGF0IHRoZSBmaW5hbGl6ZSBvcGVyYXRpb24gaXMgZWZmZWN0aXZlbHkgYSBkZXN0cnVjdGl2ZSwgcmVhZC1vbmNlIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YVVwZGF0ZSBUaGUgZmluYWwgZGF0YSB0byBlbmNyeXB0IG9yIGRlY3J5cHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkYXRhIGFmdGVyIGZpbmFsIHByb2Nlc3NpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIuZmluYWxpemUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5maW5hbGl6ZSgnZGF0YScpO1xuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLmZpbmFsaXplKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uIChkYXRhVXBkYXRlKSB7XG5cdCAgICAgICAgICAgIC8vIEZpbmFsIGRhdGEgdXBkYXRlXG5cdCAgICAgICAgICAgIGlmIChkYXRhVXBkYXRlKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9hcHBlbmQoZGF0YVVwZGF0ZSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWNpcGhlciBsb2dpY1xuXHQgICAgICAgICAgICB2YXIgZmluYWxQcm9jZXNzZWREYXRhID0gdGhpcy5fZG9GaW5hbGl6ZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBmaW5hbFByb2Nlc3NlZERhdGE7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGtleVNpemU6IDEyOC8zMixcblxuXHQgICAgICAgIGl2U2l6ZTogMTI4LzMyLFxuXG5cdCAgICAgICAgX0VOQ19YRk9STV9NT0RFOiAxLFxuXG5cdCAgICAgICAgX0RFQ19YRk9STV9NT0RFOiAyLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBzaG9ydGN1dCBmdW5jdGlvbnMgdG8gYSBjaXBoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIHRvIGNyZWF0ZSBhIGhlbHBlciBmb3IuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIGVuY3J5cHQgYW5kIGRlY3J5cHQgc2hvcnRjdXQgZnVuY3Rpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgQUVTID0gQ3J5cHRvSlMubGliLkNpcGhlci5fY3JlYXRlSGVscGVyKENyeXB0b0pTLmFsZ28uQUVTKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfY3JlYXRlSGVscGVyOiAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBmdW5jdGlvbiBzZWxlY3RDaXBoZXJTdHJhdGVneShrZXkpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhc3N3b3JkQmFzZWRDaXBoZXI7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBTZXJpYWxpemFibGVDaXBoZXI7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNpcGhlcikge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgICAgICBlbmNyeXB0OiBmdW5jdGlvbiAobWVzc2FnZSwga2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdENpcGhlclN0cmF0ZWd5KGtleSkuZW5jcnlwdChjaXBoZXIsIG1lc3NhZ2UsIGtleSwgY2ZnKTtcblx0ICAgICAgICAgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgICAgICAgICAgZGVjcnlwdDogZnVuY3Rpb24gKGNpcGhlcnRleHQsIGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RDaXBoZXJTdHJhdGVneShrZXkpLmRlY3J5cHQoY2lwaGVyLCBjaXBoZXJ0ZXh0LCBrZXksIGNmZyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9KCkpXG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBYnN0cmFjdCBiYXNlIHN0cmVhbSBjaXBoZXIgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyB0aGlzIGNpcGhlciBvcGVyYXRlcyBvbi4gRGVmYXVsdDogMSAoMzIgYml0cylcblx0ICAgICAqL1xuXHQgICAgdmFyIFN0cmVhbUNpcGhlciA9IENfbGliLlN0cmVhbUNpcGhlciA9IENpcGhlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFByb2Nlc3MgcGFydGlhbCBibG9ja3Ncblx0ICAgICAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBmaW5hbFByb2Nlc3NlZEJsb2Nrcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgYmxvY2tTaXplOiAxXG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBNb2RlIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfbW9kZSA9IEMubW9kZSA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJhc2UgYmxvY2sgY2lwaGVyIG1vZGUgdGVtcGxhdGUuXG5cdCAgICAgKi9cblx0ICAgIHZhciBCbG9ja0NpcGhlck1vZGUgPSBDX2xpYi5CbG9ja0NpcGhlck1vZGUgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyB0aGlzIG1vZGUgZm9yIGVuY3J5cHRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIEEgYmxvY2sgY2lwaGVyIGluc3RhbmNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGl2IFRoZSBJViB3b3Jkcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG1vZGUgPSBDcnlwdG9KUy5tb2RlLkNCQy5jcmVhdGVFbmNyeXB0b3IoY2lwaGVyLCBpdi53b3Jkcyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY3JlYXRlRW5jcnlwdG9yOiBmdW5jdGlvbiAoY2lwaGVyLCBpdikge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5FbmNyeXB0b3IuY3JlYXRlKGNpcGhlciwgaXYpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHRoaXMgbW9kZSBmb3IgZGVjcnlwdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgQSBibG9jayBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gaXYgVGhlIElWIHdvcmRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgbW9kZSA9IENyeXB0b0pTLm1vZGUuQ0JDLmNyZWF0ZURlY3J5cHRvcihjaXBoZXIsIGl2LndvcmRzKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjcmVhdGVEZWNyeXB0b3I6IGZ1bmN0aW9uIChjaXBoZXIsIGl2KSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLkRlY3J5cHRvci5jcmVhdGUoY2lwaGVyLCBpdik7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBtb2RlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBBIGJsb2NrIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBpdiBUaGUgSVYgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBtb2RlID0gQ3J5cHRvSlMubW9kZS5DQkMuRW5jcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2LndvcmRzKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAoY2lwaGVyLCBpdikge1xuXHQgICAgICAgICAgICB0aGlzLl9jaXBoZXIgPSBjaXBoZXI7XG5cdCAgICAgICAgICAgIHRoaXMuX2l2ID0gaXY7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQ2lwaGVyIEJsb2NrIENoYWluaW5nIG1vZGUuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDQkMgPSBDX21vZGUuQ0JDID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBBYnN0cmFjdCBiYXNlIENCQyBtb2RlLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHZhciBDQkMgPSBCbG9ja0NpcGhlck1vZGUuZXh0ZW5kKCk7XG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDQkMgZW5jcnlwdG9yLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIENCQy5FbmNyeXB0b3IgPSBDQkMuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIFByb2Nlc3NlcyB0aGUgZGF0YSBibG9jayBhdCBvZmZzZXQuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHdvcmRzIFRoZSBkYXRhIHdvcmRzIHRvIG9wZXJhdGUgb24uXG5cdCAgICAgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgVGhlIG9mZnNldCB3aGVyZSB0aGUgYmxvY2sgc3RhcnRzLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgbW9kZS5wcm9jZXNzQmxvY2soZGF0YS53b3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2NpcGhlcjtcblx0ICAgICAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSBjaXBoZXIuYmxvY2tTaXplO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBYT1IgYW5kIGVuY3J5cHRcblx0ICAgICAgICAgICAgICAgIHhvckJsb2NrLmNhbGwodGhpcywgd29yZHMsIG9mZnNldCwgYmxvY2tTaXplKTtcblx0ICAgICAgICAgICAgICAgIGNpcGhlci5lbmNyeXB0QmxvY2sod29yZHMsIG9mZnNldCk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgYmxvY2sgdG8gdXNlIHdpdGggbmV4dCBibG9ja1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fcHJldkJsb2NrID0gd29yZHMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBibG9ja1NpemUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDQkMgZGVjcnlwdG9yLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIENCQy5EZWNyeXB0b3IgPSBDQkMuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIFByb2Nlc3NlcyB0aGUgZGF0YSBibG9jayBhdCBvZmZzZXQuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHdvcmRzIFRoZSBkYXRhIHdvcmRzIHRvIG9wZXJhdGUgb24uXG5cdCAgICAgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgVGhlIG9mZnNldCB3aGVyZSB0aGUgYmxvY2sgc3RhcnRzLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgbW9kZS5wcm9jZXNzQmxvY2soZGF0YS53b3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2NpcGhlcjtcblx0ICAgICAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSBjaXBoZXIuYmxvY2tTaXplO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGJsb2NrIHRvIHVzZSB3aXRoIG5leHQgYmxvY2tcblx0ICAgICAgICAgICAgICAgIHZhciB0aGlzQmxvY2sgPSB3b3Jkcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGJsb2NrU2l6ZSk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIERlY3J5cHQgYW5kIFhPUlxuXHQgICAgICAgICAgICAgICAgY2lwaGVyLmRlY3J5cHRCbG9jayh3b3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgICAgIHhvckJsb2NrLmNhbGwodGhpcywgd29yZHMsIG9mZnNldCwgYmxvY2tTaXplKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gVGhpcyBibG9jayBiZWNvbWVzIHRoZSBwcmV2aW91cyBibG9ja1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fcHJldkJsb2NrID0gdGhpc0Jsb2NrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cblx0ICAgICAgICBmdW5jdGlvbiB4b3JCbG9jayh3b3Jkcywgb2Zmc2V0LCBibG9ja1NpemUpIHtcblx0ICAgICAgICAgICAgdmFyIGJsb2NrO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBpdiA9IHRoaXMuX2l2O1xuXG5cdCAgICAgICAgICAgIC8vIENob29zZSBtaXhpbmcgYmxvY2tcblx0ICAgICAgICAgICAgaWYgKGl2KSB7XG5cdCAgICAgICAgICAgICAgICBibG9jayA9IGl2O1xuXG5cdCAgICAgICAgICAgICAgICAvLyBSZW1vdmUgSVYgZm9yIHN1YnNlcXVlbnQgYmxvY2tzXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9pdiA9IHVuZGVmaW5lZDtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJsb2NrID0gdGhpcy5fcHJldkJsb2NrO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gWE9SIGJsb2Nrc1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkc1tvZmZzZXQgKyBpXSBePSBibG9ja1tpXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHJldHVybiBDQkM7XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFBhZGRpbmcgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19wYWQgPSBDLnBhZCA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFBLQ1MgIzUvNyBwYWRkaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgUGtjczcgPSBDX3BhZC5Qa2NzNyA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBQYWRzIGRhdGEgdXNpbmcgdGhlIGFsZ29yaXRobSBkZWZpbmVkIGluIFBLQ1MgIzUvNy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBkYXRhIFRoZSBkYXRhIHRvIHBhZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gYmxvY2tTaXplIFRoZSBtdWx0aXBsZSB0aGF0IHRoZSBkYXRhIHNob3VsZCBiZSBwYWRkZWQgdG8uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIENyeXB0b0pTLnBhZC5Qa2NzNy5wYWQod29yZEFycmF5LCA0KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYWQ6IGZ1bmN0aW9uIChkYXRhLCBibG9ja1NpemUpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZUJ5dGVzID0gYmxvY2tTaXplICogNDtcblxuXHQgICAgICAgICAgICAvLyBDb3VudCBwYWRkaW5nIGJ5dGVzXG5cdCAgICAgICAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gYmxvY2tTaXplQnl0ZXMgLSBkYXRhLnNpZ0J5dGVzICUgYmxvY2tTaXplQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ3JlYXRlIHBhZGRpbmcgd29yZFxuXHQgICAgICAgICAgICB2YXIgcGFkZGluZ1dvcmQgPSAoblBhZGRpbmdCeXRlcyA8PCAyNCkgfCAoblBhZGRpbmdCeXRlcyA8PCAxNikgfCAoblBhZGRpbmdCeXRlcyA8PCA4KSB8IG5QYWRkaW5nQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ3JlYXRlIHBhZGRpbmdcblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmdXb3JkcyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5QYWRkaW5nQnl0ZXM7IGkgKz0gNCkge1xuXHQgICAgICAgICAgICAgICAgcGFkZGluZ1dvcmRzLnB1c2gocGFkZGluZ1dvcmQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nID0gV29yZEFycmF5LmNyZWF0ZShwYWRkaW5nV29yZHMsIG5QYWRkaW5nQnl0ZXMpO1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGEuY29uY2F0KHBhZGRpbmcpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBVbnBhZHMgZGF0YSB0aGF0IGhhZCBiZWVuIHBhZGRlZCB1c2luZyB0aGUgYWxnb3JpdGhtIGRlZmluZWQgaW4gUEtDUyAjNS83LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGRhdGEgVGhlIGRhdGEgdG8gdW5wYWQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIENyeXB0b0pTLnBhZC5Qa2NzNy51bnBhZCh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHVucGFkOiBmdW5jdGlvbiAoZGF0YSkge1xuXHQgICAgICAgICAgICAvLyBHZXQgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgZnJvbSBsYXN0IGJ5dGVcblx0ICAgICAgICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBkYXRhLndvcmRzWyhkYXRhLnNpZ0J5dGVzIC0gMSkgPj4+IDJdICYgMHhmZjtcblxuXHQgICAgICAgICAgICAvLyBSZW1vdmUgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzIC09IG5QYWRkaW5nQnl0ZXM7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBYnN0cmFjdCBiYXNlIGJsb2NrIGNpcGhlciB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgY2lwaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiA0ICgxMjggYml0cylcblx0ICAgICAqL1xuXHQgICAgdmFyIEJsb2NrQ2lwaGVyID0gQ19saWIuQmxvY2tDaXBoZXIgPSBDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge01vZGV9IG1vZGUgVGhlIGJsb2NrIG1vZGUgdG8gdXNlLiBEZWZhdWx0OiBDQkNcblx0ICAgICAgICAgKiBAcHJvcGVydHkge1BhZGRpbmd9IHBhZGRpbmcgVGhlIHBhZGRpbmcgc3RyYXRlZ3kgdG8gdXNlLiBEZWZhdWx0OiBQa2NzN1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQ2lwaGVyLmNmZy5leHRlbmQoe1xuXHQgICAgICAgICAgICBtb2RlOiBDQkMsXG5cdCAgICAgICAgICAgIHBhZGRpbmc6IFBrY3M3XG5cdCAgICAgICAgfSksXG5cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgbW9kZUNyZWF0b3I7XG5cblx0ICAgICAgICAgICAgLy8gUmVzZXQgY2lwaGVyXG5cdCAgICAgICAgICAgIENpcGhlci5yZXNldC5jYWxsKHRoaXMpO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgY2ZnID0gdGhpcy5jZmc7XG5cdCAgICAgICAgICAgIHZhciBpdiA9IGNmZy5pdjtcblx0ICAgICAgICAgICAgdmFyIG1vZGUgPSBjZmcubW9kZTtcblxuXHQgICAgICAgICAgICAvLyBSZXNldCBibG9jayBtb2RlXG5cdCAgICAgICAgICAgIGlmICh0aGlzLl94Zm9ybU1vZGUgPT0gdGhpcy5fRU5DX1hGT1JNX01PREUpIHtcblx0ICAgICAgICAgICAgICAgIG1vZGVDcmVhdG9yID0gbW9kZS5jcmVhdGVFbmNyeXB0b3I7XG5cdCAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0RFQ19YRk9STV9NT0RFKSAqLyB7XG5cdCAgICAgICAgICAgICAgICBtb2RlQ3JlYXRvciA9IG1vZGUuY3JlYXRlRGVjcnlwdG9yO1xuXHQgICAgICAgICAgICAgICAgLy8gS2VlcCBhdCBsZWFzdCBvbmUgYmxvY2sgaW4gdGhlIGJ1ZmZlciBmb3IgdW5wYWRkaW5nXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9taW5CdWZmZXJTaXplID0gMTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlICYmIHRoaXMuX21vZGUuX19jcmVhdG9yID09IG1vZGVDcmVhdG9yKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9tb2RlLmluaXQodGhpcywgaXYgJiYgaXYud29yZHMpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbW9kZSA9IG1vZGVDcmVhdG9yLmNhbGwobW9kZSwgdGhpcywgaXYgJiYgaXYud29yZHMpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbW9kZS5fX2NyZWF0b3IgPSBtb2RlQ3JlYXRvcjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX21vZGUucHJvY2Vzc0Jsb2NrKHdvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgZmluYWxQcm9jZXNzZWRCbG9ja3M7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmcgPSB0aGlzLmNmZy5wYWRkaW5nO1xuXG5cdCAgICAgICAgICAgIC8vIEZpbmFsaXplXG5cdCAgICAgICAgICAgIGlmICh0aGlzLl94Zm9ybU1vZGUgPT0gdGhpcy5fRU5DX1hGT1JNX01PREUpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFBhZCBkYXRhXG5cdCAgICAgICAgICAgICAgICBwYWRkaW5nLnBhZCh0aGlzLl9kYXRhLCB0aGlzLmJsb2NrU2l6ZSk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgICAgICBmaW5hbFByb2Nlc3NlZEJsb2NrcyA9IHRoaXMuX3Byb2Nlc3MoISEnZmx1c2gnKTtcblx0ICAgICAgICAgICAgfSBlbHNlIC8qIGlmICh0aGlzLl94Zm9ybU1vZGUgPT0gdGhpcy5fREVDX1hGT1JNX01PREUpICovIHtcblx0ICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgICAgICBmaW5hbFByb2Nlc3NlZEJsb2NrcyA9IHRoaXMuX3Byb2Nlc3MoISEnZmx1c2gnKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gVW5wYWQgZGF0YVxuXHQgICAgICAgICAgICAgICAgcGFkZGluZy51bnBhZChmaW5hbFByb2Nlc3NlZEJsb2Nrcyk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gZmluYWxQcm9jZXNzZWRCbG9ja3M7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGJsb2NrU2l6ZTogMTI4LzMyXG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBIGNvbGxlY3Rpb24gb2YgY2lwaGVyIHBhcmFtZXRlcnMuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IGNpcGhlcnRleHQgVGhlIHJhdyBjaXBoZXJ0ZXh0LlxuXHQgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IGtleSBUaGUga2V5IHRvIHRoaXMgY2lwaGVydGV4dC5cblx0ICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBpdiBUaGUgSVYgdXNlZCBpbiB0aGUgY2lwaGVyaW5nIG9wZXJhdGlvbi5cblx0ICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBzYWx0IFRoZSBzYWx0IHVzZWQgd2l0aCBhIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uLlxuXHQgICAgICogQHByb3BlcnR5IHtDaXBoZXJ9IGFsZ29yaXRobSBUaGUgY2lwaGVyIGFsZ29yaXRobS5cblx0ICAgICAqIEBwcm9wZXJ0eSB7TW9kZX0gbW9kZSBUaGUgYmxvY2sgbW9kZSB1c2VkIGluIHRoZSBjaXBoZXJpbmcgb3BlcmF0aW9uLlxuXHQgICAgICogQHByb3BlcnR5IHtQYWRkaW5nfSBwYWRkaW5nIFRoZSBwYWRkaW5nIHNjaGVtZSB1c2VkIGluIHRoZSBjaXBoZXJpbmcgb3BlcmF0aW9uLlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgYmxvY2sgc2l6ZSBvZiB0aGUgY2lwaGVyLlxuXHQgICAgICogQHByb3BlcnR5IHtGb3JtYXR9IGZvcm1hdHRlciBUaGUgZGVmYXVsdCBmb3JtYXR0aW5nIHN0cmF0ZWd5IHRvIGNvbnZlcnQgdGhpcyBjaXBoZXIgcGFyYW1zIG9iamVjdCB0byBhIHN0cmluZy5cblx0ICAgICAqL1xuXHQgICAgdmFyIENpcGhlclBhcmFtcyA9IENfbGliLkNpcGhlclBhcmFtcyA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2lwaGVyUGFyYW1zIEFuIG9iamVjdCB3aXRoIGFueSBvZiB0aGUgcG9zc2libGUgY2lwaGVyIHBhcmFtZXRlcnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJQYXJhbXMgPSBDcnlwdG9KUy5saWIuQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7XG5cdCAgICAgICAgICogICAgICAgICBjaXBoZXJ0ZXh0OiBjaXBoZXJ0ZXh0V29yZEFycmF5LFxuXHQgICAgICAgICAqICAgICAgICAga2V5OiBrZXlXb3JkQXJyYXksXG5cdCAgICAgICAgICogICAgICAgICBpdjogaXZXb3JkQXJyYXksXG5cdCAgICAgICAgICogICAgICAgICBzYWx0OiBzYWx0V29yZEFycmF5LFxuXHQgICAgICAgICAqICAgICAgICAgYWxnb3JpdGhtOiBDcnlwdG9KUy5hbGdvLkFFUyxcblx0ICAgICAgICAgKiAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLFxuXHQgICAgICAgICAqICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBLQ1M3LFxuXHQgICAgICAgICAqICAgICAgICAgYmxvY2tTaXplOiA0LFxuXHQgICAgICAgICAqICAgICAgICAgZm9ybWF0dGVyOiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTFxuXHQgICAgICAgICAqICAgICB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAoY2lwaGVyUGFyYW1zKSB7XG5cdCAgICAgICAgICAgIHRoaXMubWl4SW4oY2lwaGVyUGFyYW1zKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgdGhpcyBjaXBoZXIgcGFyYW1zIG9iamVjdCB0byBhIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Rm9ybWF0fSBmb3JtYXR0ZXIgKE9wdGlvbmFsKSBUaGUgZm9ybWF0dGluZyBzdHJhdGVneSB0byB1c2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmdpZmllZCBjaXBoZXIgcGFyYW1zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHRocm93cyBFcnJvciBJZiBuZWl0aGVyIHRoZSBmb3JtYXR0ZXIgbm9yIHRoZSBkZWZhdWx0IGZvcm1hdHRlciBpcyBzZXQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSBjaXBoZXJQYXJhbXMgKyAnJztcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IGNpcGhlclBhcmFtcy50b1N0cmluZygpO1xuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gY2lwaGVyUGFyYW1zLnRvU3RyaW5nKENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gKGZvcm1hdHRlcikge1xuXHQgICAgICAgICAgICByZXR1cm4gKGZvcm1hdHRlciB8fCB0aGlzLmZvcm1hdHRlcikuc3RyaW5naWZ5KHRoaXMpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEZvcm1hdCBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2Zvcm1hdCA9IEMuZm9ybWF0ID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogT3BlblNTTCBmb3JtYXR0aW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgT3BlblNTTEZvcm1hdHRlciA9IENfZm9ybWF0Lk9wZW5TU0wgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBjaXBoZXIgcGFyYW1zIG9iamVjdCB0byBhbiBPcGVuU1NMLWNvbXBhdGlibGUgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN9IGNpcGhlclBhcmFtcyBUaGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBPcGVuU1NMLWNvbXBhdGlibGUgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgb3BlblNTTFN0cmluZyA9IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMLnN0cmluZ2lmeShjaXBoZXJQYXJhbXMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKGNpcGhlclBhcmFtcykge1xuXHQgICAgICAgICAgICB2YXIgd29yZEFycmF5O1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgY2lwaGVydGV4dCA9IGNpcGhlclBhcmFtcy5jaXBoZXJ0ZXh0O1xuXHQgICAgICAgICAgICB2YXIgc2FsdCA9IGNpcGhlclBhcmFtcy5zYWx0O1xuXG5cdCAgICAgICAgICAgIC8vIEZvcm1hdFxuXHQgICAgICAgICAgICBpZiAoc2FsdCkge1xuXHQgICAgICAgICAgICAgICAgd29yZEFycmF5ID0gV29yZEFycmF5LmNyZWF0ZShbMHg1MzYxNmM3NCwgMHg2NTY0NWY1Zl0pLmNvbmNhdChzYWx0KS5jb25jYXQoY2lwaGVydGV4dCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB3b3JkQXJyYXkgPSBjaXBoZXJ0ZXh0O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHdvcmRBcnJheS50b1N0cmluZyhCYXNlNjQpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhbiBPcGVuU1NMLWNvbXBhdGlibGUgc3RyaW5nIHRvIGEgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlblNTTFN0ciBUaGUgT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gVGhlIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVyUGFyYW1zID0gQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wucGFyc2Uob3BlblNTTFN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChvcGVuU1NMU3RyKSB7XG5cdCAgICAgICAgICAgIHZhciBzYWx0O1xuXG5cdCAgICAgICAgICAgIC8vIFBhcnNlIGJhc2U2NFxuXHQgICAgICAgICAgICB2YXIgY2lwaGVydGV4dCA9IEJhc2U2NC5wYXJzZShvcGVuU1NMU3RyKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgY2lwaGVydGV4dFdvcmRzID0gY2lwaGVydGV4dC53b3JkcztcblxuXHQgICAgICAgICAgICAvLyBUZXN0IGZvciBzYWx0XG5cdCAgICAgICAgICAgIGlmIChjaXBoZXJ0ZXh0V29yZHNbMF0gPT0gMHg1MzYxNmM3NCAmJiBjaXBoZXJ0ZXh0V29yZHNbMV0gPT0gMHg2NTY0NWY1Zikge1xuXHQgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBzYWx0XG5cdCAgICAgICAgICAgICAgICBzYWx0ID0gV29yZEFycmF5LmNyZWF0ZShjaXBoZXJ0ZXh0V29yZHMuc2xpY2UoMiwgNCkpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc2FsdCBmcm9tIGNpcGhlcnRleHRcblx0ICAgICAgICAgICAgICAgIGNpcGhlcnRleHRXb3Jkcy5zcGxpY2UoMCwgNCk7XG5cdCAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0LnNpZ0J5dGVzIC09IDE2O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIENpcGhlclBhcmFtcy5jcmVhdGUoeyBjaXBoZXJ0ZXh0OiBjaXBoZXJ0ZXh0LCBzYWx0OiBzYWx0IH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQSBjaXBoZXIgd3JhcHBlciB0aGF0IHJldHVybnMgY2lwaGVydGV4dCBhcyBhIHNlcmlhbGl6YWJsZSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAqL1xuXHQgICAgdmFyIFNlcmlhbGl6YWJsZUNpcGhlciA9IENfbGliLlNlcmlhbGl6YWJsZUNpcGhlciA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge0Zvcm1hdHRlcn0gZm9ybWF0IFRoZSBmb3JtYXR0aW5nIHN0cmF0ZWd5IHRvIGNvbnZlcnQgY2lwaGVyIHBhcmFtIG9iamVjdHMgdG8gYW5kIGZyb20gYSBzdHJpbmcuIERlZmF1bHQ6IE9wZW5TU0xcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgZm9ybWF0OiBPcGVuU1NMRm9ybWF0dGVyXG5cdCAgICAgICAgfSksXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBFbmNyeXB0cyBhIG1lc3NhZ2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gZW5jcnlwdC5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gQSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsIGtleSk7XG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCBrZXksIHsgaXY6IGl2IH0pO1xuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwga2V5LCB7IGl2OiBpdiwgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBlbmNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBtZXNzYWdlLCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gRW5jcnlwdFxuXHQgICAgICAgICAgICB2YXIgZW5jcnlwdG9yID0gY2lwaGVyLmNyZWF0ZUVuY3J5cHRvcihrZXksIGNmZyk7XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gZW5jcnlwdG9yLmZpbmFsaXplKG1lc3NhZ2UpO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJDZmcgPSBlbmNyeXB0b3IuY2ZnO1xuXG5cdCAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIHNlcmlhbGl6YWJsZSBjaXBoZXIgcGFyYW1zXG5cdCAgICAgICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHtcblx0ICAgICAgICAgICAgICAgIGNpcGhlcnRleHQ6IGNpcGhlcnRleHQsXG5cdCAgICAgICAgICAgICAgICBrZXk6IGtleSxcblx0ICAgICAgICAgICAgICAgIGl2OiBjaXBoZXJDZmcuaXYsXG5cdCAgICAgICAgICAgICAgICBhbGdvcml0aG06IGNpcGhlcixcblx0ICAgICAgICAgICAgICAgIG1vZGU6IGNpcGhlckNmZy5tb2RlLFxuXHQgICAgICAgICAgICAgICAgcGFkZGluZzogY2lwaGVyQ2ZnLnBhZGRpbmcsXG5cdCAgICAgICAgICAgICAgICBibG9ja1NpemU6IGNpcGhlci5ibG9ja1NpemUsXG5cdCAgICAgICAgICAgICAgICBmb3JtYXR0ZXI6IGNmZy5mb3JtYXRcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIERlY3J5cHRzIHNlcmlhbGl6ZWQgY2lwaGVydGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciBhbGdvcml0aG0gdG8gdXNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfHN0cmluZ30gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dCB0byBkZWNyeXB0LlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcGxhaW50ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5kZWNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBmb3JtYXR0ZWRDaXBoZXJ0ZXh0LCBrZXksIHsgaXY6IGl2LCBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5kZWNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBjaXBoZXJ0ZXh0UGFyYW1zLCBrZXksIHsgaXY6IGl2LCBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXIsIGNpcGhlcnRleHQsIGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBDaXBoZXJQYXJhbXNcblx0ICAgICAgICAgICAgY2lwaGVydGV4dCA9IHRoaXMuX3BhcnNlKGNpcGhlcnRleHQsIGNmZy5mb3JtYXQpO1xuXG5cdCAgICAgICAgICAgIC8vIERlY3J5cHRcblx0ICAgICAgICAgICAgdmFyIHBsYWludGV4dCA9IGNpcGhlci5jcmVhdGVEZWNyeXB0b3Ioa2V5LCBjZmcpLmZpbmFsaXplKGNpcGhlcnRleHQuY2lwaGVydGV4dCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHBsYWludGV4dDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgc2VyaWFsaXplZCBjaXBoZXJ0ZXh0IHRvIENpcGhlclBhcmFtcyxcblx0ICAgICAgICAgKiBlbHNlIGFzc3VtZWQgQ2lwaGVyUGFyYW1zIGFscmVhZHkgYW5kIHJldHVybnMgY2lwaGVydGV4dCB1bmNoYW5nZWQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc3xzdHJpbmd9IGNpcGhlcnRleHQgVGhlIGNpcGhlcnRleHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtGb3JtYXR0ZXJ9IGZvcm1hdCBUaGUgZm9ybWF0dGluZyBzdHJhdGVneSB0byB1c2UgdG8gcGFyc2Ugc2VyaWFsaXplZCBjaXBoZXJ0ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBUaGUgdW5zZXJpYWxpemVkIGNpcGhlcnRleHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5fcGFyc2UoY2lwaGVydGV4dFN0cmluZ09yUGFyYW1zLCBmb3JtYXQpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9wYXJzZTogZnVuY3Rpb24gKGNpcGhlcnRleHQsIGZvcm1hdCkge1xuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGNpcGhlcnRleHQgPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQucGFyc2UoY2lwaGVydGV4dCwgdGhpcyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gY2lwaGVydGV4dDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfa2RmID0gQy5rZGYgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBPcGVuU1NMIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uLlxuXHQgICAgICovXG5cdCAgICB2YXIgT3BlblNTTEtkZiA9IENfa2RmLk9wZW5TU0wgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRGVyaXZlcyBhIGtleSBhbmQgSVYgZnJvbSBhIHBhc3N3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBkZXJpdmUgZnJvbS5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0ga2V5U2l6ZSBUaGUgc2l6ZSBpbiB3b3JkcyBvZiB0aGUga2V5IHRvIGdlbmVyYXRlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpdlNpemUgVGhlIHNpemUgaW4gd29yZHMgb2YgdGhlIElWIHRvIGdlbmVyYXRlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gc2FsdCAoT3B0aW9uYWwpIEEgNjQtYml0IHNhbHQgdG8gdXNlLiBJZiBvbWl0dGVkLCBhIHNhbHQgd2lsbCBiZSBnZW5lcmF0ZWQgcmFuZG9tbHkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IEEgY2lwaGVyIHBhcmFtcyBvYmplY3Qgd2l0aCB0aGUga2V5LCBJViwgYW5kIHNhbHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBkZXJpdmVkUGFyYW1zID0gQ3J5cHRvSlMua2RmLk9wZW5TU0wuZXhlY3V0ZSgnUGFzc3dvcmQnLCAyNTYvMzIsIDEyOC8zMik7XG5cdCAgICAgICAgICogICAgIHZhciBkZXJpdmVkUGFyYW1zID0gQ3J5cHRvSlMua2RmLk9wZW5TU0wuZXhlY3V0ZSgnUGFzc3dvcmQnLCAyNTYvMzIsIDEyOC8zMiwgJ3NhbHRzYWx0Jyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZXhlY3V0ZTogZnVuY3Rpb24gKHBhc3N3b3JkLCBrZXlTaXplLCBpdlNpemUsIHNhbHQsIGhhc2hlcikge1xuXHQgICAgICAgICAgICAvLyBHZW5lcmF0ZSByYW5kb20gc2FsdFxuXHQgICAgICAgICAgICBpZiAoIXNhbHQpIHtcblx0ICAgICAgICAgICAgICAgIHNhbHQgPSBXb3JkQXJyYXkucmFuZG9tKDY0LzgpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gRGVyaXZlIGtleSBhbmQgSVZcblx0ICAgICAgICAgICAgaWYgKCFoYXNoZXIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBrZXkgPSBFdnBLREYuY3JlYXRlKHsga2V5U2l6ZToga2V5U2l6ZSArIGl2U2l6ZSB9KS5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHZhciBrZXkgPSBFdnBLREYuY3JlYXRlKHsga2V5U2l6ZToga2V5U2l6ZSArIGl2U2l6ZSwgaGFzaGVyOiBoYXNoZXIgfSkuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7XG5cdCAgICAgICAgICAgIH1cblxuXG5cdCAgICAgICAgICAgIC8vIFNlcGFyYXRlIGtleSBhbmQgSVZcblx0ICAgICAgICAgICAgdmFyIGl2ID0gV29yZEFycmF5LmNyZWF0ZShrZXkud29yZHMuc2xpY2Uoa2V5U2l6ZSksIGl2U2l6ZSAqIDQpO1xuXHQgICAgICAgICAgICBrZXkuc2lnQnl0ZXMgPSBrZXlTaXplICogNDtcblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gcGFyYW1zXG5cdCAgICAgICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHsga2V5OiBrZXksIGl2OiBpdiwgc2FsdDogc2FsdCB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEEgc2VyaWFsaXphYmxlIGNpcGhlciB3cmFwcGVyIHRoYXQgZGVyaXZlcyB0aGUga2V5IGZyb20gYSBwYXNzd29yZCxcblx0ICAgICAqIGFuZCByZXR1cm5zIGNpcGhlcnRleHQgYXMgYSBzZXJpYWxpemFibGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgKi9cblx0ICAgIHZhciBQYXNzd29yZEJhc2VkQ2lwaGVyID0gQ19saWIuUGFzc3dvcmRCYXNlZENpcGhlciA9IFNlcmlhbGl6YWJsZUNpcGhlci5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7S0RGfSBrZGYgVGhlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIHRvIHVzZSB0byBnZW5lcmF0ZSBhIGtleSBhbmQgSVYgZnJvbSBhIHBhc3N3b3JkLiBEZWZhdWx0OiBPcGVuU1NMXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBTZXJpYWxpemFibGVDaXBoZXIuY2ZnLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIGtkZjogT3BlblNTTEtkZlxuXHQgICAgICAgIH0pLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRW5jcnlwdHMgYSBtZXNzYWdlIHVzaW5nIGEgcGFzc3dvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gZW5jcnlwdC5cblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkLlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IEEgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlBhc3N3b3JkQmFzZWRDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwgJ3Bhc3N3b3JkJyk7XG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlBhc3N3b3JkQmFzZWRDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwgJ3Bhc3N3b3JkJywgeyBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXIsIG1lc3NhZ2UsIHBhc3N3b3JkLCBjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIERlcml2ZSBrZXkgYW5kIG90aGVyIHBhcmFtc1xuXHQgICAgICAgICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IGNmZy5rZGYuZXhlY3V0ZShwYXNzd29yZCwgY2lwaGVyLmtleVNpemUsIGNpcGhlci5pdlNpemUsIGNmZy5zYWx0LCBjZmcuaGFzaGVyKTtcblxuXHQgICAgICAgICAgICAvLyBBZGQgSVYgdG8gY29uZmlnXG5cdCAgICAgICAgICAgIGNmZy5pdiA9IGRlcml2ZWRQYXJhbXMuaXY7XG5cblx0ICAgICAgICAgICAgLy8gRW5jcnlwdFxuXHQgICAgICAgICAgICB2YXIgY2lwaGVydGV4dCA9IFNlcmlhbGl6YWJsZUNpcGhlci5lbmNyeXB0LmNhbGwodGhpcywgY2lwaGVyLCBtZXNzYWdlLCBkZXJpdmVkUGFyYW1zLmtleSwgY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBNaXggaW4gZGVyaXZlZCBwYXJhbXNcblx0ICAgICAgICAgICAgY2lwaGVydGV4dC5taXhJbihkZXJpdmVkUGFyYW1zKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2lwaGVydGV4dDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRGVjcnlwdHMgc2VyaWFsaXplZCBjaXBoZXJ0ZXh0IHVzaW5nIGEgcGFzc3dvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc3xzdHJpbmd9IGNpcGhlcnRleHQgVGhlIGNpcGhlcnRleHQgdG8gZGVjcnlwdC5cblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkLlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBwbGFpbnRleHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBwbGFpbnRleHQgPSBDcnlwdG9KUy5saWIuUGFzc3dvcmRCYXNlZENpcGhlci5kZWNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBmb3JtYXR0ZWRDaXBoZXJ0ZXh0LCAncGFzc3dvcmQnLCB7IGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICogICAgIHZhciBwbGFpbnRleHQgPSBDcnlwdG9KUy5saWIuUGFzc3dvcmRCYXNlZENpcGhlci5kZWNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBjaXBoZXJ0ZXh0UGFyYW1zLCAncGFzc3dvcmQnLCB7IGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZGVjcnlwdDogZnVuY3Rpb24gKGNpcGhlciwgY2lwaGVydGV4dCwgcGFzc3dvcmQsIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gQ2lwaGVyUGFyYW1zXG5cdCAgICAgICAgICAgIGNpcGhlcnRleHQgPSB0aGlzLl9wYXJzZShjaXBoZXJ0ZXh0LCBjZmcuZm9ybWF0KTtcblxuXHQgICAgICAgICAgICAvLyBEZXJpdmUga2V5IGFuZCBvdGhlciBwYXJhbXNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRQYXJhbXMgPSBjZmcua2RmLmV4ZWN1dGUocGFzc3dvcmQsIGNpcGhlci5rZXlTaXplLCBjaXBoZXIuaXZTaXplLCBjaXBoZXJ0ZXh0LnNhbHQsIGNmZy5oYXNoZXIpO1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBJViB0byBjb25maWdcblx0ICAgICAgICAgICAgY2ZnLml2ID0gZGVyaXZlZFBhcmFtcy5pdjtcblxuXHQgICAgICAgICAgICAvLyBEZWNyeXB0XG5cdCAgICAgICAgICAgIHZhciBwbGFpbnRleHQgPSBTZXJpYWxpemFibGVDaXBoZXIuZGVjcnlwdC5jYWxsKHRoaXMsIGNpcGhlciwgY2lwaGVydGV4dCwgZGVyaXZlZFBhcmFtcy5rZXksIGNmZyk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHBsYWludGV4dDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0fSgpKTtcblxuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdHJvb3QuQ3J5cHRvSlMgPSBmYWN0b3J5KCk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuXG5cdC8qZ2xvYmFscyB3aW5kb3csIGdsb2JhbCwgcmVxdWlyZSovXG5cblx0LyoqXG5cdCAqIENyeXB0b0pTIGNvcmUgY29tcG9uZW50cy5cblx0ICovXG5cdHZhciBDcnlwdG9KUyA9IENyeXB0b0pTIHx8IChmdW5jdGlvbiAoTWF0aCwgdW5kZWZpbmVkKSB7XG5cblx0ICAgIHZhciBjcnlwdG87XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gZnJvbSB3aW5kb3cgKEJyb3dzZXIpXG5cdCAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IHdpbmRvdy5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gaW4gd2ViIHdvcmtlciAoQnJvd3Nlcilcblx0ICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSBzZWxmLmNyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBmcm9tIHdvcmtlclxuXHQgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzLmNyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IGdsb2JhbFRoaXMuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgKGV4cGVyaW1lbnRhbCBJRSAxMSkgY3J5cHRvIGZyb20gd2luZG93IChCcm93c2VyKVxuXHQgICAgaWYgKCFjcnlwdG8gJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lm1zQ3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gd2luZG93Lm1zQ3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGZyb20gZ2xvYmFsIChOb2RlSlMpXG5cdCAgICBpZiAoIWNyeXB0byAmJiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gZ2xvYmFsLmNyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBpbXBvcnQgdmlhIHJlcXVpcmUgKE5vZGVKUylcblx0ICAgIGlmICghY3J5cHRvICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cdCAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXHQgICAgfVxuXG5cdCAgICAvKlxuXHQgICAgICogQ3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHBzZXVkb3JhbmRvbSBudW1iZXIgZ2VuZXJhdG9yXG5cdCAgICAgKlxuXHQgICAgICogQXMgTWF0aC5yYW5kb20oKSBpcyBjcnlwdG9ncmFwaGljYWxseSBub3Qgc2FmZSB0byB1c2Vcblx0ICAgICAqL1xuXHQgICAgdmFyIGNyeXB0b1NlY3VyZVJhbmRvbUludCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoY3J5cHRvKSB7XG5cdCAgICAgICAgICAgIC8vIFVzZSBnZXRSYW5kb21WYWx1ZXMgbWV0aG9kIChCcm93c2VyKVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDEpKVswXTtcblx0ICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFVzZSByYW5kb21CeXRlcyBtZXRob2QgKE5vZGVKUylcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tQnl0ZXMgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcyg0KS5yZWFkSW50MzJMRSgpO1xuXHQgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOYXRpdmUgY3J5cHRvIG1vZHVsZSBjb3VsZCBub3QgYmUgdXNlZCB0byBnZXQgc2VjdXJlIHJhbmRvbSBudW1iZXIuJyk7XG5cdCAgICB9O1xuXG5cdCAgICAvKlxuXHQgICAgICogTG9jYWwgcG9seWZpbGwgb2YgT2JqZWN0LmNyZWF0ZVxuXG5cdCAgICAgKi9cblx0ICAgIHZhciBjcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgZnVuY3Rpb24gRigpIHt9XG5cblx0ICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuXHQgICAgICAgICAgICB2YXIgc3VidHlwZTtcblxuXHQgICAgICAgICAgICBGLnByb3RvdHlwZSA9IG9iajtcblxuXHQgICAgICAgICAgICBzdWJ0eXBlID0gbmV3IEYoKTtcblxuXHQgICAgICAgICAgICBGLnByb3RvdHlwZSA9IG51bGw7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGU7XG5cdCAgICAgICAgfTtcblx0ICAgIH0oKSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQ3J5cHRvSlMgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQyA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIExpYnJhcnkgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYiA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEJhc2Ugb2JqZWN0IGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2UgPSAoZnVuY3Rpb24gKCkge1xuXG5cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3ZlcnJpZGVzIFByb3BlcnRpZXMgdG8gY29weSBpbnRvIHRoZSBuZXcgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgTXlUeXBlID0gQ3J5cHRvSlMubGliLkJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgICogICAgICAgICBmaWVsZDogJ3ZhbHVlJyxcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgICAgICBtZXRob2Q6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICogICAgICAgICB9XG5cdCAgICAgICAgICAgICAqICAgICB9KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGV4dGVuZDogZnVuY3Rpb24gKG92ZXJyaWRlcykge1xuXHQgICAgICAgICAgICAgICAgLy8gU3Bhd25cblx0ICAgICAgICAgICAgICAgIHZhciBzdWJ0eXBlID0gY3JlYXRlKHRoaXMpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBBdWdtZW50XG5cdCAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3VidHlwZS5taXhJbihvdmVycmlkZXMpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBDcmVhdGUgZGVmYXVsdCBpbml0aWFsaXplclxuXHQgICAgICAgICAgICAgICAgaWYgKCFzdWJ0eXBlLmhhc093blByb3BlcnR5KCdpbml0JykgfHwgdGhpcy5pbml0ID09PSBzdWJ0eXBlLmluaXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUuJHN1cGVyLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplcidzIHByb3RvdHlwZSBpcyB0aGUgc3VidHlwZSBvYmplY3Rcblx0ICAgICAgICAgICAgICAgIHN1YnR5cGUuaW5pdC5wcm90b3R5cGUgPSBzdWJ0eXBlO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBSZWZlcmVuY2Ugc3VwZXJ0eXBlXG5cdCAgICAgICAgICAgICAgICBzdWJ0eXBlLiRzdXBlciA9IHRoaXM7XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBzdWJ0eXBlO1xuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBFeHRlbmRzIHRoaXMgb2JqZWN0IGFuZCBydW5zIHRoZSBpbml0IG1ldGhvZC5cblx0ICAgICAgICAgICAgICogQXJndW1lbnRzIHRvIGNyZWF0ZSgpIHdpbGwgYmUgcGFzc2VkIHRvIGluaXQoKS5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIGluc3RhbmNlID0gTXlUeXBlLmNyZWF0ZSgpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgY3JlYXRlOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmV4dGVuZCgpO1xuXHQgICAgICAgICAgICAgICAgaW5zdGFuY2UuaW5pdC5hcHBseShpbnN0YW5jZSwgYXJndW1lbnRzKTtcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhZGQgc29tZSBsb2dpYyB3aGVuIHlvdXIgb2JqZWN0cyBhcmUgY3JlYXRlZC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBNeVR5cGUgPSBDcnlwdG9KUy5saWIuQmFzZS5leHRlbmQoe1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICogICAgICAgICAgICAgLy8gLi4uXG5cdCAgICAgICAgICAgICAqICAgICAgICAgfVxuXHQgICAgICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIENvcGllcyBwcm9wZXJ0aWVzIGludG8gdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIHRvIG1peCBpbi5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIE15VHlwZS5taXhJbih7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgZmllbGQ6ICd2YWx1ZSdcblx0ICAgICAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgbWl4SW46IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gSUUgd29uJ3QgY29weSB0b1N0cmluZyB1c2luZyB0aGUgbG9vcCBhYm92ZVxuXHQgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoJ3RvU3RyaW5nJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvU3RyaW5nID0gcHJvcGVydGllcy50b1N0cmluZztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsb25lLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIGNsb25lID0gaW5zdGFuY2UuY2xvbmUoKTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbml0LnByb3RvdHlwZS5leHRlbmQodGhpcyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBbiBhcnJheSBvZiAzMi1iaXQgd29yZHMuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtBcnJheX0gd29yZHMgVGhlIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaWdCeXRlcyBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJ5dGVzIGluIHRoaXMgd29yZCBhcnJheS5cblx0ICAgICAqL1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheSA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHdvcmRzIChPcHRpb25hbCkgQW4gYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaWdCeXRlcyAoT3B0aW9uYWwpIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gdGhlIHdvcmRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwMDEwMjAzLCAweDA0MDUwNjA3XSk7XG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbMHgwMDAxMDIwMywgMHgwNDA1MDYwN10sIDYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uICh3b3Jkcywgc2lnQnl0ZXMpIHtcblx0ICAgICAgICAgICAgd29yZHMgPSB0aGlzLndvcmRzID0gd29yZHMgfHwgW107XG5cblx0ICAgICAgICAgICAgaWYgKHNpZ0J5dGVzICE9IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5zaWdCeXRlcyA9IHNpZ0J5dGVzO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5zaWdCeXRlcyA9IHdvcmRzLmxlbmd0aCAqIDQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgdGhpcyB3b3JkIGFycmF5IHRvIGEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtFbmNvZGVyfSBlbmNvZGVyIChPcHRpb25hbCkgVGhlIGVuY29kaW5nIHN0cmF0ZWd5IHRvIHVzZS4gRGVmYXVsdDogQ3J5cHRvSlMuZW5jLkhleFxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3RyaW5naWZpZWQgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IHdvcmRBcnJheSArICcnO1xuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5LnRvU3RyaW5nKCk7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSB3b3JkQXJyYXkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoZW5jb2Rlcikge1xuXHQgICAgICAgICAgICByZXR1cm4gKGVuY29kZXIgfHwgSGV4KS5zdHJpbmdpZnkodGhpcyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmNhdGVuYXRlcyBhIHdvcmQgYXJyYXkgdG8gdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheSB0byBhcHBlbmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoaXMgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgd29yZEFycmF5MS5jb25jYXQod29yZEFycmF5Mik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY29uY2F0OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgdGhpc1dvcmRzID0gdGhpcy53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHRoYXRXb3JkcyA9IHdvcmRBcnJheS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHRoaXNTaWdCeXRlcyA9IHRoaXMuc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIHZhciB0aGF0U2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ2xhbXAgZXhjZXNzIGJpdHNcblx0ICAgICAgICAgICAgdGhpcy5jbGFtcCgpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbmNhdFxuXHQgICAgICAgICAgICBpZiAodGhpc1NpZ0J5dGVzICUgNCkge1xuXHQgICAgICAgICAgICAgICAgLy8gQ29weSBvbmUgYnl0ZSBhdCBhIHRpbWVcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhhdFNpZ0J5dGVzOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdEJ5dGUgPSAodGhhdFdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzV29yZHNbKHRoaXNTaWdCeXRlcyArIGkpID4+PiAyXSB8PSB0aGF0Qnl0ZSA8PCAoMjQgLSAoKHRoaXNTaWdCeXRlcyArIGkpICUgNCkgKiA4KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIENvcHkgb25lIHdvcmQgYXQgYSB0aW1lXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoYXRTaWdCeXRlczsgaiArPSA0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpc1dvcmRzWyh0aGlzU2lnQnl0ZXMgKyBqKSA+Pj4gMl0gPSB0aGF0V29yZHNbaiA+Pj4gMl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5zaWdCeXRlcyArPSB0aGF0U2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ2hhaW5hYmxlXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZW1vdmVzIGluc2lnbmlmaWNhbnQgYml0cy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgd29yZEFycmF5LmNsYW1wKCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2xhbXA6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IHRoaXMud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHRoaXMuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ2xhbXBcblx0ICAgICAgICAgICAgd29yZHNbc2lnQnl0ZXMgPj4+IDJdICY9IDB4ZmZmZmZmZmYgPDwgKDMyIC0gKHNpZ0J5dGVzICUgNCkgKiA4KTtcblx0ICAgICAgICAgICAgd29yZHMubGVuZ3RoID0gTWF0aC5jZWlsKHNpZ0J5dGVzIC8gNCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGNsb25lLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSB3b3JkQXJyYXkuY2xvbmUoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBCYXNlLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLndvcmRzID0gdGhpcy53b3Jkcy5zbGljZSgwKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSB3b3JkIGFycmF5IGZpbGxlZCB3aXRoIHJhbmRvbSBieXRlcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuQnl0ZXMgVGhlIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gZ2VuZXJhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSByYW5kb20gd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkucmFuZG9tKDE2KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByYW5kb206IGZ1bmN0aW9uIChuQnl0ZXMpIHtcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gW107XG5cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuQnl0ZXM7IGkgKz0gNCkge1xuXHQgICAgICAgICAgICAgICAgd29yZHMucHVzaChjcnlwdG9TZWN1cmVSYW5kb21JbnQoKSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBuQnl0ZXMpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEVuY29kZXIgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYyA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEhleCBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEhleCA9IENfZW5jLkhleCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBoZXggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBoZXhTdHJpbmcgPSBDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgaGV4Q2hhcnMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYml0ZSA9ICh3b3Jkc1tpID4+PiAyXSA+Pj4gKDI0IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICBoZXhDaGFycy5wdXNoKChiaXRlID4+PiA0KS50b1N0cmluZygxNikpO1xuXHQgICAgICAgICAgICAgICAgaGV4Q2hhcnMucHVzaCgoYml0ZSAmIDB4MGYpLnRvU3RyaW5nKDE2KSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gaGV4Q2hhcnMuam9pbignJyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgaGV4IHN0cmluZyB0byBhIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaGV4U3RyIFRoZSBoZXggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5IZXgucGFyc2UoaGV4U3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGhleFN0cikge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgaGV4U3RyTGVuZ3RoID0gaGV4U3RyLmxlbmd0aDtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhleFN0ckxlbmd0aDsgaSArPSAyKSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkc1tpID4+PiAzXSB8PSBwYXJzZUludChoZXhTdHIuc3Vic3RyKGksIDIpLCAxNikgPDwgKDI0IC0gKGkgJSA4KSAqIDQpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgaGV4U3RyTGVuZ3RoIC8gMik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBMYXRpbjEgZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBMYXRpbjEgPSBDX2VuYy5MYXRpbjEgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgTGF0aW4xIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBMYXRpbjEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgbGF0aW4xU3RyaW5nID0gQ3J5cHRvSlMuZW5jLkxhdGluMS5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IHdvcmRBcnJheS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIGxhdGluMUNoYXJzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2lnQnl0ZXM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGJpdGUgPSAod29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgbGF0aW4xQ2hhcnMucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGJpdGUpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBsYXRpbjFDaGFycy5qb2luKCcnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBMYXRpbjEgc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXRpbjFTdHIgVGhlIExhdGluMSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkxhdGluMS5wYXJzZShsYXRpbjFTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAobGF0aW4xU3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBsYXRpbjFTdHJMZW5ndGggPSBsYXRpbjFTdHIubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF0aW4xU3RyTGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDJdIHw9IChsYXRpbjFTdHIuY2hhckNvZGVBdChpKSAmIDB4ZmYpIDw8ICgyNCAtIChpICUgNCkgKiA4KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQod29yZHMsIGxhdGluMVN0ckxlbmd0aCk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBVVEYtOCBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIFV0ZjggPSBDX2VuYy5VdGY4ID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBVVEYtOCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB1dGY4U3RyaW5nID0gQ3J5cHRvSlMuZW5jLlV0Zjguc3RyaW5naWZ5KHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShMYXRpbjEuc3RyaW5naWZ5KHdvcmRBcnJheSkpKTtcblx0ICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYWxmb3JtZWQgVVRGLTggZGF0YScpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgVVRGLTggc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1dGY4U3RyIFRoZSBVVEYtOCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UodXRmOFN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh1dGY4U3RyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBMYXRpbjEucGFyc2UodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHV0ZjhTdHIpKSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBYnN0cmFjdCBidWZmZXJlZCBibG9jayBhbGdvcml0aG0gdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogVGhlIHByb3BlcnR5IGJsb2NrU2l6ZSBtdXN0IGJlIGltcGxlbWVudGVkIGluIGEgY29uY3JldGUgc3VidHlwZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX21pbkJ1ZmZlclNpemUgVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBzaG91bGQgYmUga2VwdCB1bnByb2Nlc3NlZCBpbiB0aGUgYnVmZmVyLiBEZWZhdWx0OiAwXG5cdCAgICAgKi9cblx0ICAgIHZhciBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtID0gQ19saWIuQnVmZmVyZWRCbG9ja0FsZ29yaXRobSA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZXNldHMgdGhpcyBibG9jayBhbGdvcml0aG0ncyBkYXRhIGJ1ZmZlciB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5yZXNldCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIEluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMuX2RhdGEgPSBuZXcgV29yZEFycmF5LmluaXQoKTtcblx0ICAgICAgICAgICAgdGhpcy5fbkRhdGFCeXRlcyA9IDA7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEFkZHMgbmV3IGRhdGEgdG8gdGhpcyBibG9jayBhbGdvcml0aG0ncyBidWZmZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gYXBwZW5kLiBTdHJpbmdzIGFyZSBjb252ZXJ0ZWQgdG8gYSBXb3JkQXJyYXkgdXNpbmcgVVRGLTguXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX2FwcGVuZCgnZGF0YScpO1xuXHQgICAgICAgICAqICAgICBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9hcHBlbmQod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfYXBwZW5kOiBmdW5jdGlvbiAoZGF0YSkge1xuXHQgICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBXb3JkQXJyYXksIGVsc2UgYXNzdW1lIFdvcmRBcnJheSBhbHJlYWR5XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgZGF0YSA9IFV0ZjgucGFyc2UoZGF0YSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBBcHBlbmRcblx0ICAgICAgICAgICAgdGhpcy5fZGF0YS5jb25jYXQoZGF0YSk7XG5cdCAgICAgICAgICAgIHRoaXMuX25EYXRhQnl0ZXMgKz0gZGF0YS5zaWdCeXRlcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUHJvY2Vzc2VzIGF2YWlsYWJsZSBkYXRhIGJsb2Nrcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgX2RvUHJvY2Vzc0Jsb2NrKG9mZnNldCksIHdoaWNoIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBjb25jcmV0ZSBzdWJ0eXBlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBkb0ZsdXNoIFdoZXRoZXIgYWxsIGJsb2NrcyBhbmQgcGFydGlhbCBibG9ja3Mgc2hvdWxkIGJlIHByb2Nlc3NlZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHByb2Nlc3NlZCBkYXRhLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgcHJvY2Vzc2VkRGF0YSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX3Byb2Nlc3MoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHByb2Nlc3NlZERhdGEgPSBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX3Byb2Nlc3M6IGZ1bmN0aW9uIChkb0ZsdXNoKSB7XG5cdCAgICAgICAgICAgIHZhciBwcm9jZXNzZWRXb3JkcztcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhO1xuXHQgICAgICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIGRhdGFTaWdCeXRlcyA9IGRhdGEuc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSB0aGlzLmJsb2NrU2l6ZTtcblx0ICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZUJ5dGVzID0gYmxvY2tTaXplICogNDtcblxuXHQgICAgICAgICAgICAvLyBDb3VudCBibG9ja3MgcmVhZHlcblx0ICAgICAgICAgICAgdmFyIG5CbG9ja3NSZWFkeSA9IGRhdGFTaWdCeXRlcyAvIGJsb2NrU2l6ZUJ5dGVzO1xuXHQgICAgICAgICAgICBpZiAoZG9GbHVzaCkge1xuXHQgICAgICAgICAgICAgICAgLy8gUm91bmQgdXAgdG8gaW5jbHVkZSBwYXJ0aWFsIGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgbkJsb2Nrc1JlYWR5ID0gTWF0aC5jZWlsKG5CbG9ja3NSZWFkeSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyBSb3VuZCBkb3duIHRvIGluY2x1ZGUgb25seSBmdWxsIGJsb2Nrcyxcblx0ICAgICAgICAgICAgICAgIC8vIGxlc3MgdGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBtdXN0IHJlbWFpbiBpbiB0aGUgYnVmZmVyXG5cdCAgICAgICAgICAgICAgICBuQmxvY2tzUmVhZHkgPSBNYXRoLm1heCgobkJsb2Nrc1JlYWR5IHwgMCkgLSB0aGlzLl9taW5CdWZmZXJTaXplLCAwKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIENvdW50IHdvcmRzIHJlYWR5XG5cdCAgICAgICAgICAgIHZhciBuV29yZHNSZWFkeSA9IG5CbG9ja3NSZWFkeSAqIGJsb2NrU2l6ZTtcblxuXHQgICAgICAgICAgICAvLyBDb3VudCBieXRlcyByZWFkeVxuXHQgICAgICAgICAgICB2YXIgbkJ5dGVzUmVhZHkgPSBNYXRoLm1pbihuV29yZHNSZWFkeSAqIDQsIGRhdGFTaWdCeXRlcyk7XG5cblx0ICAgICAgICAgICAgLy8gUHJvY2VzcyBibG9ja3Ncblx0ICAgICAgICAgICAgaWYgKG5Xb3Jkc1JlYWR5KSB7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBuV29yZHNSZWFkeTsgb2Zmc2V0ICs9IGJsb2NrU2l6ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtYWxnb3JpdGhtIGxvZ2ljXG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9Qcm9jZXNzQmxvY2soZGF0YVdvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcHJvY2Vzc2VkIHdvcmRzXG5cdCAgICAgICAgICAgICAgICBwcm9jZXNzZWRXb3JkcyA9IGRhdGFXb3Jkcy5zcGxpY2UoMCwgbldvcmRzUmVhZHkpO1xuXHQgICAgICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyAtPSBuQnl0ZXNSZWFkeTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFJldHVybiBwcm9jZXNzZWQgd29yZHNcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdChwcm9jZXNzZWRXb3JkcywgbkJ5dGVzUmVhZHkpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsb25lLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLmNsb25lKCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gQmFzZS5jbG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICBjbG9uZS5fZGF0YSA9IHRoaXMuX2RhdGEuY2xvbmUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9taW5CdWZmZXJTaXplOiAwXG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBYnN0cmFjdCBoYXNoZXIgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyB0aGlzIGhhc2hlciBvcGVyYXRlcyBvbi4gRGVmYXVsdDogMTYgKDUxMiBiaXRzKVxuXHQgICAgICovXG5cdCAgICB2YXIgSGFzaGVyID0gQ19saWIuSGFzaGVyID0gQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKCksXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgaGFzaGVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIGhhc2ggY29tcHV0YXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBoYXNoZXIgPSBDcnlwdG9KUy5hbGdvLlNIQTI1Ni5jcmVhdGUoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAoY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIGhhc2hlciB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgaGFzaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gUmVzZXQgZGF0YSBidWZmZXJcblx0ICAgICAgICAgICAgQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5yZXNldC5jYWxsKHRoaXMpO1xuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtaGFzaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHRoaXMuX2RvUmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogVXBkYXRlcyB0aGlzIGhhc2hlciB3aXRoIGEgbWVzc2FnZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSBUaGUgbWVzc2FnZSB0byBhcHBlbmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtIYXNoZXJ9IFRoaXMgaGFzaGVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBoYXNoZXIudXBkYXRlKCdtZXNzYWdlJyk7XG5cdCAgICAgICAgICogICAgIGhhc2hlci51cGRhdGUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGVuZFxuXHQgICAgICAgICAgICB0aGlzLl9hcHBlbmQobWVzc2FnZVVwZGF0ZSk7XG5cblx0ICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBoYXNoXG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuXHQgICAgICAgICAgICAvLyBDaGFpbmFibGVcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEZpbmFsaXplcyB0aGUgaGFzaCBjb21wdXRhdGlvbi5cblx0ICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIGZpbmFsaXplIG9wZXJhdGlvbiBpcyBlZmZlY3RpdmVseSBhIGRlc3RydWN0aXZlLCByZWFkLW9uY2Ugb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIChPcHRpb25hbCkgQSBmaW5hbCBtZXNzYWdlIHVwZGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBoYXNoID0gaGFzaGVyLmZpbmFsaXplKCk7XG5cdCAgICAgICAgICogICAgIHZhciBoYXNoID0gaGFzaGVyLmZpbmFsaXplKCdtZXNzYWdlJyk7XG5cdCAgICAgICAgICogICAgIHZhciBoYXNoID0gaGFzaGVyLmZpbmFsaXplKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7XG5cdCAgICAgICAgICAgIC8vIEZpbmFsIG1lc3NhZ2UgdXBkYXRlXG5cdCAgICAgICAgICAgIGlmIChtZXNzYWdlVXBkYXRlKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9hcHBlbmQobWVzc2FnZVVwZGF0ZSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWhhc2hlciBsb2dpY1xuXHQgICAgICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2RvRmluYWxpemUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gaGFzaDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgYmxvY2tTaXplOiA1MTIvMzIsXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgc2hvcnRjdXQgZnVuY3Rpb24gdG8gYSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaGVyIHRvIGNyZWF0ZSBhIGhlbHBlciBmb3IuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHNob3J0Y3V0IGZ1bmN0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgU0hBMjU2ID0gQ3J5cHRvSlMubGliLkhhc2hlci5fY3JlYXRlSGVscGVyKENyeXB0b0pTLmFsZ28uU0hBMjU2KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfY3JlYXRlSGVscGVyOiBmdW5jdGlvbiAoaGFzaGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobWVzc2FnZSwgY2ZnKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGhhc2hlci5pbml0KGNmZykuZmluYWxpemUobWVzc2FnZSk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBzaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoZXIgdG8gdXNlIGluIHRoaXMgSE1BQyBoZWxwZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHNob3J0Y3V0IGZ1bmN0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgSG1hY1NIQTI1NiA9IENyeXB0b0pTLmxpYi5IYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoQ3J5cHRvSlMuYWxnby5TSEEyNTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9jcmVhdGVIbWFjSGVscGVyOiBmdW5jdGlvbiAoaGFzaGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobWVzc2FnZSwga2V5KSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENfYWxnby5ITUFDLmluaXQoaGFzaGVyLCBrZXkpLmZpbmFsaXplKG1lc3NhZ2UpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFsZ29yaXRobSBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ28gPSB7fTtcblxuXHQgICAgcmV0dXJuIEM7XG5cdH0oTWF0aCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTO1xuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIENfZW5jID0gQy5lbmM7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQmFzZTY0IGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgQmFzZTY0ID0gQ19lbmMuQmFzZTY0ID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIEJhc2U2NCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgQmFzZTY0IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGJhc2U2NFN0cmluZyA9IENyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblx0ICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcblxuXHQgICAgICAgICAgICAvLyBDbGFtcCBleGNlc3MgYml0c1xuXHQgICAgICAgICAgICB3b3JkQXJyYXkuY2xhbXAoKTtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciBiYXNlNjRDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpICs9IDMpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBieXRlMSA9ICh3b3Jkc1tpID4+PiAyXSAgICAgICA+Pj4gKDI0IC0gKGkgJSA0KSAqIDgpKSAgICAgICAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICB2YXIgYnl0ZTIgPSAod29yZHNbKGkgKyAxKSA+Pj4gMl0gPj4+ICgyNCAtICgoaSArIDEpICUgNCkgKiA4KSkgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgdmFyIGJ5dGUzID0gKHdvcmRzWyhpICsgMikgPj4+IDJdID4+PiAoMjQgLSAoKGkgKyAyKSAlIDQpICogOCkpICYgMHhmZjtcblxuXHQgICAgICAgICAgICAgICAgdmFyIHRyaXBsZXQgPSAoYnl0ZTEgPDwgMTYpIHwgKGJ5dGUyIDw8IDgpIHwgYnl0ZTM7XG5cblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyAoaiA8IDQpICYmIChpICsgaiAqIDAuNzUgPCBzaWdCeXRlcyk7IGorKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGJhc2U2NENoYXJzLnB1c2gobWFwLmNoYXJBdCgodHJpcGxldCA+Pj4gKDYgKiAoMyAtIGopKSkgJiAweDNmKSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBBZGQgcGFkZGluZ1xuXHQgICAgICAgICAgICB2YXIgcGFkZGluZ0NoYXIgPSBtYXAuY2hhckF0KDY0KTtcblx0ICAgICAgICAgICAgaWYgKHBhZGRpbmdDaGFyKSB7XG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoYmFzZTY0Q2hhcnMubGVuZ3RoICUgNCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJhc2U2NENoYXJzLnB1c2gocGFkZGluZ0NoYXIpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGJhc2U2NENoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIEJhc2U2NCBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NFN0ciBUaGUgQmFzZTY0IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKGJhc2U2NFN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChiYXNlNjRTdHIpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBiYXNlNjRTdHJMZW5ndGggPSBiYXNlNjRTdHIubGVuZ3RoO1xuXHQgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwO1xuXHQgICAgICAgICAgICB2YXIgcmV2ZXJzZU1hcCA9IHRoaXMuX3JldmVyc2VNYXA7XG5cblx0ICAgICAgICAgICAgaWYgKCFyZXZlcnNlTWFwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZU1hcCA9IHRoaXMuX3JldmVyc2VNYXAgPSBbXTtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hcC5sZW5ndGg7IGorKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlTWFwW21hcC5jaGFyQ29kZUF0KGopXSA9IGo7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gSWdub3JlIHBhZGRpbmdcblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmdDaGFyID0gbWFwLmNoYXJBdCg2NCk7XG5cdCAgICAgICAgICAgIGlmIChwYWRkaW5nQ2hhcikge1xuXHQgICAgICAgICAgICAgICAgdmFyIHBhZGRpbmdJbmRleCA9IGJhc2U2NFN0ci5pbmRleE9mKHBhZGRpbmdDaGFyKTtcblx0ICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nSW5kZXggIT09IC0xKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYmFzZTY0U3RyTGVuZ3RoID0gcGFkZGluZ0luZGV4O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICByZXR1cm4gcGFyc2VMb29wKGJhc2U2NFN0ciwgYmFzZTY0U3RyTGVuZ3RoLCByZXZlcnNlTWFwKTtcblxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfbWFwOiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nXG5cdCAgICB9O1xuXG5cdCAgICBmdW5jdGlvbiBwYXJzZUxvb3AoYmFzZTY0U3RyLCBiYXNlNjRTdHJMZW5ndGgsIHJldmVyc2VNYXApIHtcblx0ICAgICAgdmFyIHdvcmRzID0gW107XG5cdCAgICAgIHZhciBuQnl0ZXMgPSAwO1xuXHQgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhc2U2NFN0ckxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICBpZiAoaSAlIDQpIHtcblx0ICAgICAgICAgICAgICB2YXIgYml0czEgPSByZXZlcnNlTWFwW2Jhc2U2NFN0ci5jaGFyQ29kZUF0KGkgLSAxKV0gPDwgKChpICUgNCkgKiAyKTtcblx0ICAgICAgICAgICAgICB2YXIgYml0czIgPSByZXZlcnNlTWFwW2Jhc2U2NFN0ci5jaGFyQ29kZUF0KGkpXSA+Pj4gKDYgLSAoaSAlIDQpICogMik7XG5cdCAgICAgICAgICAgICAgdmFyIGJpdHNDb21iaW5lZCA9IGJpdHMxIHwgYml0czI7XG5cdCAgICAgICAgICAgICAgd29yZHNbbkJ5dGVzID4+PiAyXSB8PSBiaXRzQ29tYmluZWQgPDwgKDI0IC0gKG5CeXRlcyAlIDQpICogOCk7XG5cdCAgICAgICAgICAgICAgbkJ5dGVzKys7XG5cdCAgICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIFdvcmRBcnJheS5jcmVhdGUod29yZHMsIG5CeXRlcyk7XG5cdCAgICB9XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuZW5jLkJhc2U2NDtcblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0cmV0dXJuIENyeXB0b0pTLmVuYy5VdGY4O1xuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL3NoYTFcIiksIHJlcXVpcmUoXCIuL2htYWNcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vc2hhMVwiLCBcIi4vaG1hY1wiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIEJhc2UgPSBDX2xpYi5CYXNlO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cdCAgICB2YXIgTUQ1ID0gQ19hbGdvLk1ENTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBUaGlzIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGNvbmZvcm0gd2l0aCBFVlBfQnl0ZXNUb0tleS5cblx0ICAgICAqIHd3dy5vcGVuc3NsLm9yZy9kb2NzL2NyeXB0by9FVlBfQnl0ZXNUb0tleS5odG1sXG5cdCAgICAgKi9cblx0ICAgIHZhciBFdnBLREYgPSBDX2FsZ28uRXZwS0RGID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBrZXlTaXplIFRoZSBrZXkgc2l6ZSBpbiB3b3JkcyB0byBnZW5lcmF0ZS4gRGVmYXVsdDogNCAoMTI4IGJpdHMpXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaCBhbGdvcml0aG0gdG8gdXNlLiBEZWZhdWx0OiBNRDVcblx0ICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gaXRlcmF0aW9ucyBUaGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcGVyZm9ybS4gRGVmYXVsdDogMVxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQmFzZS5leHRlbmQoe1xuXHQgICAgICAgICAgICBrZXlTaXplOiAxMjgvMzIsXG5cdCAgICAgICAgICAgIGhhc2hlcjogTUQ1LFxuXHQgICAgICAgICAgICBpdGVyYXRpb25zOiAxXG5cdCAgICAgICAgfSksXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoZSBkZXJpdmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIga2RmID0gQ3J5cHRvSlMuYWxnby5FdnBLREYuY3JlYXRlKCk7XG5cdCAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLkV2cEtERi5jcmVhdGUoeyBrZXlTaXplOiA4IH0pO1xuXHQgICAgICAgICAqICAgICB2YXIga2RmID0gQ3J5cHRvSlMuYWxnby5FdnBLREYuY3JlYXRlKHsga2V5U2l6ZTogOCwgaXRlcmF0aW9uczogMTAwMCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAoY2ZnKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIERlcml2ZXMgYSBrZXkgZnJvbSBhIHBhc3N3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBzYWx0IEEgc2FsdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRlcml2ZWQga2V5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIga2V5ID0ga2RmLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNvbXB1dGU6IGZ1bmN0aW9uIChwYXNzd29yZCwgc2FsdCkge1xuXHQgICAgICAgICAgICB2YXIgYmxvY2s7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGNmZyA9IHRoaXMuY2ZnO1xuXG5cdCAgICAgICAgICAgIC8vIEluaXQgaGFzaGVyXG5cdCAgICAgICAgICAgIHZhciBoYXNoZXIgPSBjZmcuaGFzaGVyLmNyZWF0ZSgpO1xuXG5cdCAgICAgICAgICAgIC8vIEluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHZhciBkZXJpdmVkS2V5ID0gV29yZEFycmF5LmNyZWF0ZSgpO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGVyaXZlZEtleVdvcmRzID0gZGVyaXZlZEtleS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIGtleVNpemUgPSBjZmcua2V5U2l6ZTtcblx0ICAgICAgICAgICAgdmFyIGl0ZXJhdGlvbnMgPSBjZmcuaXRlcmF0aW9ucztcblxuXHQgICAgICAgICAgICAvLyBHZW5lcmF0ZSBrZXlcblx0ICAgICAgICAgICAgd2hpbGUgKGRlcml2ZWRLZXlXb3Jkcy5sZW5ndGggPCBrZXlTaXplKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoYmxvY2spIHtcblx0ICAgICAgICAgICAgICAgICAgICBoYXNoZXIudXBkYXRlKGJsb2NrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJsb2NrID0gaGFzaGVyLnVwZGF0ZShwYXNzd29yZCkuZmluYWxpemUoc2FsdCk7XG5cdCAgICAgICAgICAgICAgICBoYXNoZXIucmVzZXQoKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gSXRlcmF0aW9uc1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBpdGVyYXRpb25zOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBibG9jayA9IGhhc2hlci5maW5hbGl6ZShibG9jayk7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFzaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGRlcml2ZWRLZXkuY29uY2F0KGJsb2NrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBkZXJpdmVkS2V5LnNpZ0J5dGVzID0ga2V5U2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGRlcml2ZWRLZXk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogRGVyaXZlcyBhIGtleSBmcm9tIGEgcGFzc3dvcmQuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgQSBzYWx0LlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIGNvbXB1dGF0aW9uLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRlcml2ZWQga2V5LlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuRXZwS0RGKHBhc3N3b3JkLCBzYWx0KTtcblx0ICAgICAqICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuRXZwS0RGKHBhc3N3b3JkLCBzYWx0LCB7IGtleVNpemU6IDggfSk7XG5cdCAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLkV2cEtERihwYXNzd29yZCwgc2FsdCwgeyBrZXlTaXplOiA4LCBpdGVyYXRpb25zOiAxMDAwIH0pO1xuXHQgICAgICovXG5cdCAgICBDLkV2cEtERiA9IGZ1bmN0aW9uIChwYXNzd29yZCwgc2FsdCwgY2ZnKSB7XG5cdCAgICAgICAgcmV0dXJuIEV2cEtERi5jcmVhdGUoY2ZnKS5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTtcblx0ICAgIH07XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuRXZwS0RGO1xuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7XG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYztcblx0ICAgIHZhciBVdGY4ID0gQ19lbmMuVXRmODtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8qKlxuXHQgICAgICogSE1BQyBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBITUFDID0gQ19hbGdvLkhNQUMgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIEhNQUMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBobWFjSGFzaGVyID0gQ3J5cHRvSlMuYWxnby5ITUFDLmNyZWF0ZShDcnlwdG9KUy5hbGdvLlNIQTI1Niwga2V5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAoaGFzaGVyLCBrZXkpIHtcblx0ICAgICAgICAgICAgLy8gSW5pdCBoYXNoZXJcblx0ICAgICAgICAgICAgaGFzaGVyID0gdGhpcy5faGFzaGVyID0gbmV3IGhhc2hlci5pbml0KCk7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gV29yZEFycmF5LCBlbHNlIGFzc3VtZSBXb3JkQXJyYXkgYWxyZWFkeVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAga2V5ID0gVXRmOC5wYXJzZShrZXkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBoYXNoZXJCbG9ja1NpemUgPSBoYXNoZXIuYmxvY2tTaXplO1xuXHQgICAgICAgICAgICB2YXIgaGFzaGVyQmxvY2tTaXplQnl0ZXMgPSBoYXNoZXJCbG9ja1NpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIEFsbG93IGFyYml0cmFyeSBsZW5ndGgga2V5c1xuXHQgICAgICAgICAgICBpZiAoa2V5LnNpZ0J5dGVzID4gaGFzaGVyQmxvY2tTaXplQnl0ZXMpIHtcblx0ICAgICAgICAgICAgICAgIGtleSA9IGhhc2hlci5maW5hbGl6ZShrZXkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQ2xhbXAgZXhjZXNzIGJpdHNcblx0ICAgICAgICAgICAga2V5LmNsYW1wKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ2xvbmUga2V5IGZvciBpbm5lciBhbmQgb3V0ZXIgcGFkc1xuXHQgICAgICAgICAgICB2YXIgb0tleSA9IHRoaXMuX29LZXkgPSBrZXkuY2xvbmUoKTtcblx0ICAgICAgICAgICAgdmFyIGlLZXkgPSB0aGlzLl9pS2V5ID0ga2V5LmNsb25lKCk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBvS2V5V29yZHMgPSBvS2V5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgaUtleVdvcmRzID0gaUtleS53b3JkcztcblxuXHQgICAgICAgICAgICAvLyBYT1Iga2V5cyB3aXRoIHBhZCBjb25zdGFudHNcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYXNoZXJCbG9ja1NpemU7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgb0tleVdvcmRzW2ldIF49IDB4NWM1YzVjNWM7XG5cdCAgICAgICAgICAgICAgICBpS2V5V29yZHNbaV0gXj0gMHgzNjM2MzYzNjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBvS2V5LnNpZ0J5dGVzID0gaUtleS5zaWdCeXRlcyA9IGhhc2hlckJsb2NrU2l6ZUJ5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIEhNQUMgdG8gaXRzIGluaXRpYWwgc3RhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhtYWNIYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgaGFzaGVyID0gdGhpcy5faGFzaGVyO1xuXG5cdCAgICAgICAgICAgIC8vIFJlc2V0XG5cdCAgICAgICAgICAgIGhhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAgICBoYXNoZXIudXBkYXRlKHRoaXMuX2lLZXkpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBVcGRhdGVzIHRoaXMgSE1BQyB3aXRoIGEgbWVzc2FnZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSBUaGUgbWVzc2FnZSB0byBhcHBlbmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtITUFDfSBUaGlzIEhNQUMgaW5zdGFuY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhtYWNIYXNoZXIudXBkYXRlKCdtZXNzYWdlJyk7XG5cdCAgICAgICAgICogICAgIGhtYWNIYXNoZXIudXBkYXRlKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdXBkYXRlOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9oYXNoZXIudXBkYXRlKG1lc3NhZ2VVcGRhdGUpO1xuXG5cdCAgICAgICAgICAgIC8vIENoYWluYWJsZVxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRmluYWxpemVzIHRoZSBITUFDIGNvbXB1dGF0aW9uLlxuXHQgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgKE9wdGlvbmFsKSBBIGZpbmFsIG1lc3NhZ2UgdXBkYXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhtYWMgPSBobWFjSGFzaGVyLmZpbmFsaXplKCk7XG5cdCAgICAgICAgICogICAgIHZhciBobWFjID0gaG1hY0hhc2hlci5maW5hbGl6ZSgnbWVzc2FnZScpO1xuXHQgICAgICAgICAqICAgICB2YXIgaG1hYyA9IGhtYWNIYXNoZXIuZmluYWxpemUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGhhc2hlciA9IHRoaXMuX2hhc2hlcjtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIEhNQUNcblx0ICAgICAgICAgICAgdmFyIGlubmVySGFzaCA9IGhhc2hlci5maW5hbGl6ZShtZXNzYWdlVXBkYXRlKTtcblx0ICAgICAgICAgICAgaGFzaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICAgIHZhciBobWFjID0gaGFzaGVyLmZpbmFsaXplKHRoaXMuX29LZXkuY2xvbmUoKS5jb25jYXQoaW5uZXJIYXNoKSk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGhtYWM7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdH0oKSk7XG5cblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uIChNYXRoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgSGFzaGVyID0gQ19saWIuSGFzaGVyO1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgLy8gQ29uc3RhbnRzIHRhYmxlXG5cdCAgICB2YXIgVCA9IFtdO1xuXG5cdCAgICAvLyBDb21wdXRlIGNvbnN0YW50c1xuXHQgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY0OyBpKyspIHtcblx0ICAgICAgICAgICAgVFtpXSA9IChNYXRoLmFicyhNYXRoLnNpbihpICsgMSkpICogMHgxMDAwMDAwMDApIHwgMDtcblx0ICAgICAgICB9XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIE1ENSBoYXNoIGFsZ29yaXRobS5cblx0ICAgICAqL1xuXHQgICAgdmFyIE1ENSA9IENfYWxnby5NRDUgPSBIYXNoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB0aGlzLl9oYXNoID0gbmV3IFdvcmRBcnJheS5pbml0KFtcblx0ICAgICAgICAgICAgICAgIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksXG5cdCAgICAgICAgICAgICAgICAweDk4YmFkY2ZlLCAweDEwMzI1NDc2XG5cdCAgICAgICAgICAgIF0pO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU3dhcCBlbmRpYW5cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBvZmZzZXRfaSA9IG9mZnNldCArIGk7XG5cdCAgICAgICAgICAgICAgICB2YXIgTV9vZmZzZXRfaSA9IE1bb2Zmc2V0X2ldO1xuXG5cdCAgICAgICAgICAgICAgICBNW29mZnNldF9pXSA9IChcblx0ICAgICAgICAgICAgICAgICAgICAoKChNX29mZnNldF9pIDw8IDgpICB8IChNX29mZnNldF9pID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgICAgICgoKE1fb2Zmc2V0X2kgPDwgMjQpIHwgKE1fb2Zmc2V0X2kgPj4+IDgpKSAgJiAweGZmMDBmZjAwKVxuXHQgICAgICAgICAgICAgICAgKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgSCA9IHRoaXMuX2hhc2gud29yZHM7XG5cblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzAgID0gTVtvZmZzZXQgKyAwXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzEgID0gTVtvZmZzZXQgKyAxXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzIgID0gTVtvZmZzZXQgKyAyXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzMgID0gTVtvZmZzZXQgKyAzXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzQgID0gTVtvZmZzZXQgKyA0XTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzUgID0gTVtvZmZzZXQgKyA1XTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzYgID0gTVtvZmZzZXQgKyA2XTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzcgID0gTVtvZmZzZXQgKyA3XTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzggID0gTVtvZmZzZXQgKyA4XTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzkgID0gTVtvZmZzZXQgKyA5XTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzEwID0gTVtvZmZzZXQgKyAxMF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xMSA9IE1bb2Zmc2V0ICsgMTFdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTIgPSBNW29mZnNldCArIDEyXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzEzID0gTVtvZmZzZXQgKyAxM107XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xNCA9IE1bb2Zmc2V0ICsgMTRdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTUgPSBNW29mZnNldCArIDE1XTtcblxuXHQgICAgICAgICAgICAvLyBXb3JraW5nIHZhcmlhYmxlc1xuXHQgICAgICAgICAgICB2YXIgYSA9IEhbMF07XG5cdCAgICAgICAgICAgIHZhciBiID0gSFsxXTtcblx0ICAgICAgICAgICAgdmFyIGMgPSBIWzJdO1xuXHQgICAgICAgICAgICB2YXIgZCA9IEhbM107XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0YXRpb25cblx0ICAgICAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzAsICA3LCAgVFswXSk7XG5cdCAgICAgICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCBNX29mZnNldF8xLCAgMTIsIFRbMV0pO1xuXHQgICAgICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgTV9vZmZzZXRfMiwgIDE3LCBUWzJdKTtcblx0ICAgICAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzMsICAyMiwgVFszXSk7XG5cdCAgICAgICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCBNX29mZnNldF80LCAgNywgIFRbNF0pO1xuXHQgICAgICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfNSwgIDEyLCBUWzVdKTtcblx0ICAgICAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzYsICAxNywgVFs2XSk7XG5cdCAgICAgICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCBNX29mZnNldF83LCAgMjIsIFRbN10pO1xuXHQgICAgICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgTV9vZmZzZXRfOCwgIDcsICBUWzhdKTtcblx0ICAgICAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzksICAxMiwgVFs5XSk7XG5cdCAgICAgICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF8xMCwgMTcsIFRbMTBdKTtcblx0ICAgICAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzExLCAyMiwgVFsxMV0pO1xuXHQgICAgICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgTV9vZmZzZXRfMTIsIDcsICBUWzEyXSk7XG5cdCAgICAgICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCBNX29mZnNldF8xMywgMTIsIFRbMTNdKTtcblx0ICAgICAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzE0LCAxNywgVFsxNF0pO1xuXHQgICAgICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTUsIDIyLCBUWzE1XSk7XG5cblx0ICAgICAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEsICA1LCAgVFsxNl0pO1xuXHQgICAgICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgTV9vZmZzZXRfNiwgIDksICBUWzE3XSk7XG5cdCAgICAgICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBNX29mZnNldF8xMSwgMTQsIFRbMThdKTtcblx0ICAgICAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzAsICAyMCwgVFsxOV0pO1xuXHQgICAgICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgTV9vZmZzZXRfNSwgIDUsICBUWzIwXSk7XG5cdCAgICAgICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBNX29mZnNldF8xMCwgOSwgIFRbMjFdKTtcblx0ICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzE1LCAxNCwgVFsyMl0pO1xuXHQgICAgICAgICAgICBiID0gR0coYiwgYywgZCwgYSwgTV9vZmZzZXRfNCwgIDIwLCBUWzIzXSk7XG5cdCAgICAgICAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCBNX29mZnNldF85LCAgNSwgIFRbMjRdKTtcblx0ICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzE0LCA5LCAgVFsyNV0pO1xuXHQgICAgICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgTV9vZmZzZXRfMywgIDE0LCBUWzI2XSk7XG5cdCAgICAgICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBNX29mZnNldF84LCAgMjAsIFRbMjddKTtcblx0ICAgICAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEzLCA1LCAgVFsyOF0pO1xuXHQgICAgICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgTV9vZmZzZXRfMiwgIDksICBUWzI5XSk7XG5cdCAgICAgICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBNX29mZnNldF83LCAgMTQsIFRbMzBdKTtcblx0ICAgICAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzEyLCAyMCwgVFszMV0pO1xuXG5cdCAgICAgICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF81LCAgNCwgIFRbMzJdKTtcblx0ICAgICAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzgsICAxMSwgVFszM10pO1xuXHQgICAgICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTEsIDE2LCBUWzM0XSk7XG5cdCAgICAgICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF8xNCwgMjMsIFRbMzVdKTtcblx0ICAgICAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEsICA0LCAgVFszNl0pO1xuXHQgICAgICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgTV9vZmZzZXRfNCwgIDExLCBUWzM3XSk7XG5cdCAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF83LCAgMTYsIFRbMzhdKTtcblx0ICAgICAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzEwLCAyMywgVFszOV0pO1xuXHQgICAgICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfMTMsIDQsICBUWzQwXSk7XG5cdCAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF8wLCAgMTEsIFRbNDFdKTtcblx0ICAgICAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzMsICAxNiwgVFs0Ml0pO1xuXHQgICAgICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgTV9vZmZzZXRfNiwgIDIzLCBUWzQzXSk7XG5cdCAgICAgICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF85LCAgNCwgIFRbNDRdKTtcblx0ICAgICAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzEyLCAxMSwgVFs0NV0pO1xuXHQgICAgICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTUsIDE2LCBUWzQ2XSk7XG5cdCAgICAgICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF8yLCAgMjMsIFRbNDddKTtcblxuXHQgICAgICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfMCwgIDYsICBUWzQ4XSk7XG5cdCAgICAgICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCBNX29mZnNldF83LCAgMTAsIFRbNDldKTtcblx0ICAgICAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzE0LCAxNSwgVFs1MF0pO1xuXHQgICAgICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfNSwgIDIxLCBUWzUxXSk7XG5cdCAgICAgICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCBNX29mZnNldF8xMiwgNiwgIFRbNTJdKTtcblx0ICAgICAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzMsICAxMCwgVFs1M10pO1xuXHQgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTAsIDE1LCBUWzU0XSk7XG5cdCAgICAgICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCBNX29mZnNldF8xLCAgMjEsIFRbNTVdKTtcblx0ICAgICAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzgsICA2LCAgVFs1Nl0pO1xuXHQgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTUsIDEwLCBUWzU3XSk7XG5cdCAgICAgICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCBNX29mZnNldF82LCAgMTUsIFRbNThdKTtcblx0ICAgICAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzEzLCAyMSwgVFs1OV0pO1xuXHQgICAgICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfNCwgIDYsICBUWzYwXSk7XG5cdCAgICAgICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCBNX29mZnNldF8xMSwgMTAsIFRbNjFdKTtcblx0ICAgICAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzIsICAxNSwgVFs2Ml0pO1xuXHQgICAgICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfOSwgIDIxLCBUWzYzXSk7XG5cblx0ICAgICAgICAgICAgLy8gSW50ZXJtZWRpYXRlIGhhc2ggdmFsdWVcblx0ICAgICAgICAgICAgSFswXSA9IChIWzBdICsgYSkgfCAwO1xuXHQgICAgICAgICAgICBIWzFdID0gKEhbMV0gKyBiKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMl0gPSAoSFsyXSArIGMpIHwgMDtcblx0ICAgICAgICAgICAgSFszXSA9IChIWzNdICsgZCkgfCAwO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhO1xuXHQgICAgICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3JkcztcblxuXHQgICAgICAgICAgICB2YXIgbkJpdHNUb3RhbCA9IHRoaXMuX25EYXRhQnl0ZXMgKiA4O1xuXHQgICAgICAgICAgICB2YXIgbkJpdHNMZWZ0ID0gZGF0YS5zaWdCeXRlcyAqIDg7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmdcblx0ICAgICAgICAgICAgZGF0YVdvcmRzW25CaXRzTGVmdCA+Pj4gNV0gfD0gMHg4MCA8PCAoMjQgLSBuQml0c0xlZnQgJSAzMik7XG5cblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWxIID0gTWF0aC5mbG9vcihuQml0c1RvdGFsIC8gMHgxMDAwMDAwMDApO1xuXHQgICAgICAgICAgICB2YXIgbkJpdHNUb3RhbEwgPSBuQml0c1RvdGFsO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE1XSA9IChcblx0ICAgICAgICAgICAgICAgICgoKG5CaXRzVG90YWxIIDw8IDgpICB8IChuQml0c1RvdGFsSCA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICgoKG5CaXRzVG90YWxIIDw8IDI0KSB8IChuQml0c1RvdGFsSCA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApXG5cdCAgICAgICAgICAgICk7XG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTRdID0gKFxuXHQgICAgICAgICAgICAgICAgKCgobkJpdHNUb3RhbEwgPDwgOCkgIHwgKG5CaXRzVG90YWxMID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgKCgobkJpdHNUb3RhbEwgPDwgMjQpIHwgKG5CaXRzVG90YWxMID4+PiA4KSkgICYgMHhmZjAwZmYwMClcblx0ICAgICAgICAgICAgKTtcblxuXHQgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzID0gKGRhdGFXb3Jkcy5sZW5ndGggKyAxKSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gSGFzaCBmaW5hbCBibG9ja3Ncblx0ICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2hhc2g7XG5cdCAgICAgICAgICAgIHZhciBIID0gaGFzaC53b3JkcztcblxuXHQgICAgICAgICAgICAvLyBTd2FwIGVuZGlhblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgICAgIHZhciBIX2kgPSBIW2ldO1xuXG5cdCAgICAgICAgICAgICAgICBIW2ldID0gKCgoSF9pIDw8IDgpICB8IChIX2kgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAgICAgICAgKCgoSF9pIDw8IDI0KSB8IChIX2kgPj4+IDgpKSAgJiAweGZmMDBmZjAwKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFJldHVybiBmaW5hbCBjb21wdXRlZCBoYXNoXG5cdCAgICAgICAgICAgIHJldHVybiBoYXNoO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBIYXNoZXIuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUuX2hhc2ggPSB0aGlzLl9oYXNoLmNsb25lKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICBmdW5jdGlvbiBGRihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG5cdCAgICAgICAgdmFyIG4gPSBhICsgKChiICYgYykgfCAofmIgJiBkKSkgKyB4ICsgdDtcblx0ICAgICAgICByZXR1cm4gKChuIDw8IHMpIHwgKG4gPj4+ICgzMiAtIHMpKSkgKyBiO1xuXHQgICAgfVxuXG5cdCAgICBmdW5jdGlvbiBHRyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG5cdCAgICAgICAgdmFyIG4gPSBhICsgKChiICYgZCkgfCAoYyAmIH5kKSkgKyB4ICsgdDtcblx0ICAgICAgICByZXR1cm4gKChuIDw8IHMpIHwgKG4gPj4+ICgzMiAtIHMpKSkgKyBiO1xuXHQgICAgfVxuXG5cdCAgICBmdW5jdGlvbiBISChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG5cdCAgICAgICAgdmFyIG4gPSBhICsgKGIgXiBjIF4gZCkgKyB4ICsgdDtcblx0ICAgICAgICByZXR1cm4gKChuIDw8IHMpIHwgKG4gPj4+ICgzMiAtIHMpKSkgKyBiO1xuXHQgICAgfVxuXG5cdCAgICBmdW5jdGlvbiBJSShhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG5cdCAgICAgICAgdmFyIG4gPSBhICsgKGMgXiAoYiB8IH5kKSkgKyB4ICsgdDtcblx0ICAgICAgICByZXR1cm4gKChuIDw8IHMpIHwgKG4gPj4+ICgzMiAtIHMpKSkgKyBiO1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuTUQ1KCdtZXNzYWdlJyk7XG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5NRDUod29yZEFycmF5KTtcblx0ICAgICAqL1xuXHQgICAgQy5NRDUgPSBIYXNoZXIuX2NyZWF0ZUhlbHBlcihNRDUpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY01ENShtZXNzYWdlLCBrZXkpO1xuXHQgICAgICovXG5cdCAgICBDLkhtYWNNRDUgPSBIYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoTUQ1KTtcblx0fShNYXRoKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuTUQ1O1xuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8vIFJldXNhYmxlIG9iamVjdFxuXHQgICAgdmFyIFcgPSBbXTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTSEEtMSBoYXNoIGFsZ29yaXRobS5cblx0ICAgICAqL1xuXHQgICAgdmFyIFNIQTEgPSBDX2FsZ28uU0hBMSA9IEhhc2hlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2hhc2ggPSBuZXcgV29yZEFycmF5LmluaXQoW1xuXHQgICAgICAgICAgICAgICAgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSxcblx0ICAgICAgICAgICAgICAgIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsXG5cdCAgICAgICAgICAgICAgICAweGMzZDJlMWYwXG5cdCAgICAgICAgICAgIF0pO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIEggPSB0aGlzLl9oYXNoLndvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFdvcmtpbmcgdmFyaWFibGVzXG5cdCAgICAgICAgICAgIHZhciBhID0gSFswXTtcblx0ICAgICAgICAgICAgdmFyIGIgPSBIWzFdO1xuXHQgICAgICAgICAgICB2YXIgYyA9IEhbMl07XG5cdCAgICAgICAgICAgIHZhciBkID0gSFszXTtcblx0ICAgICAgICAgICAgdmFyIGUgPSBIWzRdO1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGF0aW9uXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODA7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgaWYgKGkgPCAxNikge1xuXHQgICAgICAgICAgICAgICAgICAgIFdbaV0gPSBNW29mZnNldCArIGldIHwgMDtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBXW2kgLSAzXSBeIFdbaSAtIDhdIF4gV1tpIC0gMTRdIF4gV1tpIC0gMTZdO1xuXHQgICAgICAgICAgICAgICAgICAgIFdbaV0gPSAobiA8PCAxKSB8IChuID4+PiAzMSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHZhciB0ID0gKChhIDw8IDUpIHwgKGEgPj4+IDI3KSkgKyBlICsgV1tpXTtcblx0ICAgICAgICAgICAgICAgIGlmIChpIDwgMjApIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ICs9ICgoYiAmIGMpIHwgKH5iICYgZCkpICsgMHg1YTgyNzk5OTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDQwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCArPSAoYiBeIGMgXiBkKSArIDB4NmVkOWViYTE7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCA2MCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgKz0gKChiICYgYykgfCAoYiAmIGQpIHwgKGMgJiBkKSkgLSAweDcwZTQ0MzI0O1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChpIDwgODApICovIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ICs9IChiIF4gYyBeIGQpIC0gMHgzNTlkM2UyYTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgZSA9IGQ7XG5cdCAgICAgICAgICAgICAgICBkID0gYztcblx0ICAgICAgICAgICAgICAgIGMgPSAoYiA8PCAzMCkgfCAoYiA+Pj4gMik7XG5cdCAgICAgICAgICAgICAgICBiID0gYTtcblx0ICAgICAgICAgICAgICAgIGEgPSB0O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gSW50ZXJtZWRpYXRlIGhhc2ggdmFsdWVcblx0ICAgICAgICAgICAgSFswXSA9IChIWzBdICsgYSkgfCAwO1xuXHQgICAgICAgICAgICBIWzFdID0gKEhbMV0gKyBiKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMl0gPSAoSFsyXSArIGMpIHwgMDtcblx0ICAgICAgICAgICAgSFszXSA9IChIWzNdICsgZCkgfCAwO1xuXHQgICAgICAgICAgICBIWzRdID0gKEhbNF0gKyBlKSB8IDA7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cdCAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsID0gdGhpcy5fbkRhdGFCeXRlcyAqIDg7XG5cdCAgICAgICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODtcblxuXHQgICAgICAgICAgICAvLyBBZGQgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8ICgyNCAtIG5CaXRzTGVmdCAlIDMyKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNF0gPSBNYXRoLmZsb29yKG5CaXRzVG90YWwgLyAweDEwMDAwMDAwMCk7XG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTVdID0gbkJpdHNUb3RhbDtcblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyA9IGRhdGFXb3Jkcy5sZW5ndGggKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaFxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFzaDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9oYXNoID0gdGhpcy5faGFzaC5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTEoJ21lc3NhZ2UnKTtcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTEod29yZEFycmF5KTtcblx0ICAgICAqL1xuXHQgICAgQy5TSEExID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoU0hBMSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjU0hBMShtZXNzYWdlLCBrZXkpO1xuXHQgICAgICovXG5cdCAgICBDLkhtYWNTSEExID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKFNIQTEpO1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLlNIQTE7XG5cbn0pKTsiLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYDpyb290IHtcbiAgLS1ibGFjay1hMTogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgLS1ibGFjay1hMjogcmdiYSgwLCAwLCAwLCAwLjEpO1xuICAtLWJsYWNrLWEzOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICAtLWJsYWNrLWE0OiByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIC0tYmxhY2stYTU6IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgLS1ibGFjay1hNjogcmdiYSgwLCAwLCAwLCAwLjQpO1xuICAtLWJsYWNrLWE3OiByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gIC0tYmxhY2stYTg6IHJnYmEoMCwgMCwgMCwgMC42KTtcbiAgLS1ibGFjay1hOTogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICAtLWJsYWNrLWExMDogcmdiYSgwLCAwLCAwLCAwLjgpO1xuICAtLWJsYWNrLWExMTogcmdiYSgwLCAwLCAwLCAwLjkpO1xuICAtLWJsYWNrLWExMjogcmdiYSgwLCAwLCAwLCAwLjk1KTtcbn1cblxuQHN1cHBvcnRzIChjb2xvcjogY29sb3IoZGlzcGxheS1wMyAxIDEgMSkpIHtcbiAgQG1lZGlhIChjb2xvci1nYW11dDogcDMpIHtcbiAgICA6cm9vdCB7XG4gICAgICAtLWJsYWNrLWExOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4wNSk7XG4gICAgICAtLWJsYWNrLWEyOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4xKTtcbiAgICAgIC0tYmxhY2stYTM6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjE1KTtcbiAgICAgIC0tYmxhY2stYTQ6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjIpO1xuICAgICAgLS1ibGFjay1hNTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMyk7XG4gICAgICAtLWJsYWNrLWE2OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC40KTtcbiAgICAgIC0tYmxhY2stYTc6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjUpO1xuICAgICAgLS1ibGFjay1hODogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuNik7XG4gICAgICAtLWJsYWNrLWE5OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC43KTtcbiAgICAgIC0tYmxhY2stYTEwOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC44KTtcbiAgICAgIC0tYmxhY2stYTExOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC45KTtcbiAgICAgIC0tYmxhY2stYTEyOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC45NSk7XG4gICAgfVxuICB9XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy9ibGFjay1hbHBoYS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7RUFDRSwrQkFBK0I7RUFDL0IsOEJBQThCO0VBQzlCLCtCQUErQjtFQUMvQiw4QkFBOEI7RUFDOUIsOEJBQThCO0VBQzlCLDhCQUE4QjtFQUM5Qiw4QkFBOEI7RUFDOUIsOEJBQThCO0VBQzlCLDhCQUE4QjtFQUM5QiwrQkFBK0I7RUFDL0IsK0JBQStCO0VBQy9CLGdDQUFnQztBQUNsQzs7QUFFQTtFQUNFO0lBQ0U7TUFDRSwwQ0FBMEM7TUFDMUMseUNBQXlDO01BQ3pDLDBDQUEwQztNQUMxQyx5Q0FBeUM7TUFDekMseUNBQXlDO01BQ3pDLHlDQUF5QztNQUN6Qyx5Q0FBeUM7TUFDekMseUNBQXlDO01BQ3pDLHlDQUF5QztNQUN6QywwQ0FBMEM7TUFDMUMsMENBQTBDO01BQzFDLDJDQUEyQztJQUM3QztFQUNGO0FBQ0ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiOnJvb3Qge1xcbiAgLS1ibGFjay1hMTogcmdiYSgwLCAwLCAwLCAwLjA1KTtcXG4gIC0tYmxhY2stYTI6IHJnYmEoMCwgMCwgMCwgMC4xKTtcXG4gIC0tYmxhY2stYTM6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XFxuICAtLWJsYWNrLWE0OiByZ2JhKDAsIDAsIDAsIDAuMik7XFxuICAtLWJsYWNrLWE1OiByZ2JhKDAsIDAsIDAsIDAuMyk7XFxuICAtLWJsYWNrLWE2OiByZ2JhKDAsIDAsIDAsIDAuNCk7XFxuICAtLWJsYWNrLWE3OiByZ2JhKDAsIDAsIDAsIDAuNSk7XFxuICAtLWJsYWNrLWE4OiByZ2JhKDAsIDAsIDAsIDAuNik7XFxuICAtLWJsYWNrLWE5OiByZ2JhKDAsIDAsIDAsIDAuNyk7XFxuICAtLWJsYWNrLWExMDogcmdiYSgwLCAwLCAwLCAwLjgpO1xcbiAgLS1ibGFjay1hMTE6IHJnYmEoMCwgMCwgMCwgMC45KTtcXG4gIC0tYmxhY2stYTEyOiByZ2JhKDAsIDAsIDAsIDAuOTUpO1xcbn1cXG5cXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSkge1xcbiAgQG1lZGlhIChjb2xvci1nYW11dDogcDMpIHtcXG4gICAgOnJvb3Qge1xcbiAgICAgIC0tYmxhY2stYTE6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjA1KTtcXG4gICAgICAtLWJsYWNrLWEyOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4xKTtcXG4gICAgICAtLWJsYWNrLWEzOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4xNSk7XFxuICAgICAgLS1ibGFjay1hNDogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMik7XFxuICAgICAgLS1ibGFjay1hNTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMyk7XFxuICAgICAgLS1ibGFjay1hNjogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuNCk7XFxuICAgICAgLS1ibGFjay1hNzogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuNSk7XFxuICAgICAgLS1ibGFjay1hODogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuNik7XFxuICAgICAgLS1ibGFjay1hOTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuNyk7XFxuICAgICAgLS1ibGFjay1hMTA6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjgpO1xcbiAgICAgIC0tYmxhY2stYTExOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC45KTtcXG4gICAgICAtLWJsYWNrLWExMjogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuOTUpO1xcbiAgICB9XFxuICB9XFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYDpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XG4gIC0tbWF1dmUtMTogI2ZkZmNmZDtcbiAgLS1tYXV2ZS0yOiAjZmFmOWZiO1xuICAtLW1hdXZlLTM6ICNmMmVmZjM7XG4gIC0tbWF1dmUtNDogI2VhZTdlYztcbiAgLS1tYXV2ZS01OiAjZTNkZmU2O1xuICAtLW1hdXZlLTY6ICNkYmQ4ZTA7XG4gIC0tbWF1dmUtNzogI2QwY2RkNztcbiAgLS1tYXV2ZS04OiAjYmNiYWM3O1xuICAtLW1hdXZlLTk6ICM4ZThjOTk7XG4gIC0tbWF1dmUtMTA6ICM4NDgyOGU7XG4gIC0tbWF1dmUtMTE6ICM2NTYzNmQ7XG4gIC0tbWF1dmUtMTI6ICMyMTFmMjY7XG59XG5cbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yKGRpc3BsYXktcDMgMSAxIDEpKSB7XG4gIEBtZWRpYSAoY29sb3ItZ2FtdXQ6IHAzKSB7XG4gICAgOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcbiAgICAgIC0tbWF1dmUtMTogY29sb3IoZGlzcGxheS1wMyAwLjk5MSAwLjk4OCAwLjk5Mik7XG4gICAgICAtLW1hdXZlLTI6IGNvbG9yKGRpc3BsYXktcDMgMC45OCAwLjk3NiAwLjk4NCk7XG4gICAgICAtLW1hdXZlLTM6IGNvbG9yKGRpc3BsYXktcDMgMC45NDYgMC45MzggMC45NTIpO1xuICAgICAgLS1tYXV2ZS00OiBjb2xvcihkaXNwbGF5LXAzIDAuOTE1IDAuOTA2IDAuOTI1KTtcbiAgICAgIC0tbWF1dmUtNTogY29sb3IoZGlzcGxheS1wMyAwLjg4NiAwLjg3NiAwLjkwMSk7XG4gICAgICAtLW1hdXZlLTY6IGNvbG9yKGRpc3BsYXktcDMgMC44NTYgMC44NDYgMC44NzUpO1xuICAgICAgLS1tYXV2ZS03OiBjb2xvcihkaXNwbGF5LXAzIDAuODE0IDAuODA0IDAuODQpO1xuICAgICAgLS1tYXV2ZS04OiBjb2xvcihkaXNwbGF5LXAzIDAuNzM1IDAuNzI4IDAuNzc3KTtcbiAgICAgIC0tbWF1dmUtOTogY29sb3IoZGlzcGxheS1wMyAwLjU1NSAwLjU0OSAwLjU5Nik7XG4gICAgICAtLW1hdXZlLTEwOiBjb2xvcihkaXNwbGF5LXAzIDAuNTE0IDAuNTA4IDAuNTUyKTtcbiAgICAgIC0tbWF1dmUtMTE6IGNvbG9yKGRpc3BsYXktcDMgMC4zOTUgMC4zODggMC40MjQpO1xuICAgICAgLS1tYXV2ZS0xMjogY29sb3IoZGlzcGxheS1wMyAwLjEyOCAwLjEyMiAwLjE0Nyk7XG4gICAgfVxuICB9XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy9tYXV2ZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7RUFDRSxrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFO0lBQ0U7TUFDRSw4Q0FBOEM7TUFDOUMsNkNBQTZDO01BQzdDLDhDQUE4QztNQUM5Qyw4Q0FBOEM7TUFDOUMsOENBQThDO01BQzlDLDhDQUE4QztNQUM5Qyw2Q0FBNkM7TUFDN0MsOENBQThDO01BQzlDLDhDQUE4QztNQUM5QywrQ0FBK0M7TUFDL0MsK0NBQStDO01BQy9DLCtDQUErQztJQUNqRDtFQUNGO0FBQ0ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcXG4gIC0tbWF1dmUtMTogI2ZkZmNmZDtcXG4gIC0tbWF1dmUtMjogI2ZhZjlmYjtcXG4gIC0tbWF1dmUtMzogI2YyZWZmMztcXG4gIC0tbWF1dmUtNDogI2VhZTdlYztcXG4gIC0tbWF1dmUtNTogI2UzZGZlNjtcXG4gIC0tbWF1dmUtNjogI2RiZDhlMDtcXG4gIC0tbWF1dmUtNzogI2QwY2RkNztcXG4gIC0tbWF1dmUtODogI2JjYmFjNztcXG4gIC0tbWF1dmUtOTogIzhlOGM5OTtcXG4gIC0tbWF1dmUtMTA6ICM4NDgyOGU7XFxuICAtLW1hdXZlLTExOiAjNjU2MzZkO1xcbiAgLS1tYXV2ZS0xMjogIzIxMWYyNjtcXG59XFxuXFxuQHN1cHBvcnRzIChjb2xvcjogY29sb3IoZGlzcGxheS1wMyAxIDEgMSkpIHtcXG4gIEBtZWRpYSAoY29sb3ItZ2FtdXQ6IHAzKSB7XFxuICAgIDpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XFxuICAgICAgLS1tYXV2ZS0xOiBjb2xvcihkaXNwbGF5LXAzIDAuOTkxIDAuOTg4IDAuOTkyKTtcXG4gICAgICAtLW1hdXZlLTI6IGNvbG9yKGRpc3BsYXktcDMgMC45OCAwLjk3NiAwLjk4NCk7XFxuICAgICAgLS1tYXV2ZS0zOiBjb2xvcihkaXNwbGF5LXAzIDAuOTQ2IDAuOTM4IDAuOTUyKTtcXG4gICAgICAtLW1hdXZlLTQ6IGNvbG9yKGRpc3BsYXktcDMgMC45MTUgMC45MDYgMC45MjUpO1xcbiAgICAgIC0tbWF1dmUtNTogY29sb3IoZGlzcGxheS1wMyAwLjg4NiAwLjg3NiAwLjkwMSk7XFxuICAgICAgLS1tYXV2ZS02OiBjb2xvcihkaXNwbGF5LXAzIDAuODU2IDAuODQ2IDAuODc1KTtcXG4gICAgICAtLW1hdXZlLTc6IGNvbG9yKGRpc3BsYXktcDMgMC44MTQgMC44MDQgMC44NCk7XFxuICAgICAgLS1tYXV2ZS04OiBjb2xvcihkaXNwbGF5LXAzIDAuNzM1IDAuNzI4IDAuNzc3KTtcXG4gICAgICAtLW1hdXZlLTk6IGNvbG9yKGRpc3BsYXktcDMgMC41NTUgMC41NDkgMC41OTYpO1xcbiAgICAgIC0tbWF1dmUtMTA6IGNvbG9yKGRpc3BsYXktcDMgMC41MTQgMC41MDggMC41NTIpO1xcbiAgICAgIC0tbWF1dmUtMTE6IGNvbG9yKGRpc3BsYXktcDMgMC4zOTUgMC4zODggMC40MjQpO1xcbiAgICAgIC0tbWF1dmUtMTI6IGNvbG9yKGRpc3BsYXktcDMgMC4xMjggMC4xMjIgMC4xNDcpO1xcbiAgICB9XFxuICB9XFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYDpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XG4gIC0tdmlvbGV0LTE6ICNmZGZjZmU7XG4gIC0tdmlvbGV0LTI6ICNmYWY4ZmY7XG4gIC0tdmlvbGV0LTM6ICNmNGYwZmU7XG4gIC0tdmlvbGV0LTQ6ICNlYmU0ZmY7XG4gIC0tdmlvbGV0LTU6ICNlMWQ5ZmY7XG4gIC0tdmlvbGV0LTY6ICNkNGNhZmU7XG4gIC0tdmlvbGV0LTc6ICNjMmI1ZjU7XG4gIC0tdmlvbGV0LTg6ICNhYTk5ZWM7XG4gIC0tdmlvbGV0LTk6ICM2ZTU2Y2Y7XG4gIC0tdmlvbGV0LTEwOiAjNjU0ZGM0O1xuICAtLXZpb2xldC0xMTogIzY1NTBiOTtcbiAgLS12aW9sZXQtMTI6ICMyZjI2NWY7XG59XG5cbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yKGRpc3BsYXktcDMgMSAxIDEpKSB7XG4gIEBtZWRpYSAoY29sb3ItZ2FtdXQ6IHAzKSB7XG4gICAgOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcbiAgICAgIC0tdmlvbGV0LTE6IGNvbG9yKGRpc3BsYXktcDMgMC45OTEgMC45ODggMC45OTUpO1xuICAgICAgLS12aW9sZXQtMjogY29sb3IoZGlzcGxheS1wMyAwLjk3OCAwLjk3NCAwLjk5OCk7XG4gICAgICAtLXZpb2xldC0zOiBjb2xvcihkaXNwbGF5LXAzIDAuOTUzIDAuOTQzIDAuOTkzKTtcbiAgICAgIC0tdmlvbGV0LTQ6IGNvbG9yKGRpc3BsYXktcDMgMC45MTYgMC44OTcgMSk7XG4gICAgICAtLXZpb2xldC01OiBjb2xvcihkaXNwbGF5LXAzIDAuODc2IDAuODUxIDEpO1xuICAgICAgLS12aW9sZXQtNjogY29sb3IoZGlzcGxheS1wMyAwLjgyNSAwLjc5MyAwLjk4MSk7XG4gICAgICAtLXZpb2xldC03OiBjb2xvcihkaXNwbGF5LXAzIDAuNzUyIDAuNzEyIDAuOTQzKTtcbiAgICAgIC0tdmlvbGV0LTg6IGNvbG9yKGRpc3BsYXktcDMgMC42NTQgMC42MDIgMC45MDIpO1xuICAgICAgLS12aW9sZXQtOTogY29sb3IoZGlzcGxheS1wMyAwLjQxNyAwLjM0MSAwLjc4NCk7XG4gICAgICAtLXZpb2xldC0xMDogY29sb3IoZGlzcGxheS1wMyAwLjM4MSAwLjMwNiAwLjc0MSk7XG4gICAgICAtLXZpb2xldC0xMTogY29sb3IoZGlzcGxheS1wMyAwLjM4MyAwLjMxNyAwLjcwMik7XG4gICAgICAtLXZpb2xldC0xMjogY29sb3IoZGlzcGxheS1wMyAwLjE3OSAwLjE1IDAuMzU5KTtcbiAgICB9XG4gIH1cbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL3Zpb2xldC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7RUFDRSxtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixvQkFBb0I7RUFDcEIsb0JBQW9CO0VBQ3BCLG9CQUFvQjtBQUN0Qjs7QUFFQTtFQUNFO0lBQ0U7TUFDRSwrQ0FBK0M7TUFDL0MsK0NBQStDO01BQy9DLCtDQUErQztNQUMvQywyQ0FBMkM7TUFDM0MsMkNBQTJDO01BQzNDLCtDQUErQztNQUMvQywrQ0FBK0M7TUFDL0MsK0NBQStDO01BQy9DLCtDQUErQztNQUMvQyxnREFBZ0Q7TUFDaEQsZ0RBQWdEO01BQ2hELCtDQUErQztJQUNqRDtFQUNGO0FBQ0ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcXG4gIC0tdmlvbGV0LTE6ICNmZGZjZmU7XFxuICAtLXZpb2xldC0yOiAjZmFmOGZmO1xcbiAgLS12aW9sZXQtMzogI2Y0ZjBmZTtcXG4gIC0tdmlvbGV0LTQ6ICNlYmU0ZmY7XFxuICAtLXZpb2xldC01OiAjZTFkOWZmO1xcbiAgLS12aW9sZXQtNjogI2Q0Y2FmZTtcXG4gIC0tdmlvbGV0LTc6ICNjMmI1ZjU7XFxuICAtLXZpb2xldC04OiAjYWE5OWVjO1xcbiAgLS12aW9sZXQtOTogIzZlNTZjZjtcXG4gIC0tdmlvbGV0LTEwOiAjNjU0ZGM0O1xcbiAgLS12aW9sZXQtMTE6ICM2NTUwYjk7XFxuICAtLXZpb2xldC0xMjogIzJmMjY1ZjtcXG59XFxuXFxuQHN1cHBvcnRzIChjb2xvcjogY29sb3IoZGlzcGxheS1wMyAxIDEgMSkpIHtcXG4gIEBtZWRpYSAoY29sb3ItZ2FtdXQ6IHAzKSB7XFxuICAgIDpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XFxuICAgICAgLS12aW9sZXQtMTogY29sb3IoZGlzcGxheS1wMyAwLjk5MSAwLjk4OCAwLjk5NSk7XFxuICAgICAgLS12aW9sZXQtMjogY29sb3IoZGlzcGxheS1wMyAwLjk3OCAwLjk3NCAwLjk5OCk7XFxuICAgICAgLS12aW9sZXQtMzogY29sb3IoZGlzcGxheS1wMyAwLjk1MyAwLjk0MyAwLjk5Myk7XFxuICAgICAgLS12aW9sZXQtNDogY29sb3IoZGlzcGxheS1wMyAwLjkxNiAwLjg5NyAxKTtcXG4gICAgICAtLXZpb2xldC01OiBjb2xvcihkaXNwbGF5LXAzIDAuODc2IDAuODUxIDEpO1xcbiAgICAgIC0tdmlvbGV0LTY6IGNvbG9yKGRpc3BsYXktcDMgMC44MjUgMC43OTMgMC45ODEpO1xcbiAgICAgIC0tdmlvbGV0LTc6IGNvbG9yKGRpc3BsYXktcDMgMC43NTIgMC43MTIgMC45NDMpO1xcbiAgICAgIC0tdmlvbGV0LTg6IGNvbG9yKGRpc3BsYXktcDMgMC42NTQgMC42MDIgMC45MDIpO1xcbiAgICAgIC0tdmlvbGV0LTk6IGNvbG9yKGRpc3BsYXktcDMgMC40MTcgMC4zNDEgMC43ODQpO1xcbiAgICAgIC0tdmlvbGV0LTEwOiBjb2xvcihkaXNwbGF5LXAzIDAuMzgxIDAuMzA2IDAuNzQxKTtcXG4gICAgICAtLXZpb2xldC0xMTogY29sb3IoZGlzcGxheS1wMyAwLjM4MyAwLjMxNyAwLjcwMik7XFxuICAgICAgLS12aW9sZXQtMTI6IGNvbG9yKGRpc3BsYXktcDMgMC4xNzkgMC4xNSAwLjM1OSk7XFxuICAgIH1cXG4gIH1cXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgQGNoYXJzZXQgXCJVVEYtOFwiO1xuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdywgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbjo6YmVmb3JlIHtcbiAgYm9yZGVyLWNvbG9yOiAjY2NjO1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICBib3JkZXItd2lkdGg6IDNweCAzcHggMCAwO1xuICBjb250ZW50OiBcIlwiO1xuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiA5cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA2cHg7XG4gIHdpZHRoOiA5cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlci13cmFwcGVyIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IDA7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyIHtcbiAgZm9udC1mYW1pbHk6IFwiSGVsdmV0aWNhIE5ldWVcIiwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAwLjhyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGNvbG9yOiAjMDAwO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYWVhZWFlO1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsaW5lLWhlaWdodDogaW5pdGlhbDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXItLXRpbWUtb25seSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIge1xuICBib3JkZXItbGVmdDogMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyLS10aW1lLW9ubHkgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUsXG4ucmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5IC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAuM3JlbTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuM3JlbTtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXItcG9wcGVyIHtcbiAgei1pbmRleDogMTtcbiAgbGluZS1oZWlnaHQ6IDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RyaWFuZ2xlIHtcbiAgc3Ryb2tlOiAjYWVhZWFlO1xufVxuLnJlYWN0LWRhdGVwaWNrZXItcG9wcGVyW2RhdGEtcGxhY2VtZW50Xj1ib3R0b21dIC5yZWFjdC1kYXRlcGlja2VyX190cmlhbmdsZSB7XG4gIGZpbGw6ICNmMGYwZjA7XG4gIGNvbG9yOiAjZjBmMGYwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXItcG9wcGVyW2RhdGEtcGxhY2VtZW50Xj10b3BdIC5yZWFjdC1kYXRlcGlja2VyX190cmlhbmdsZSB7XG4gIGZpbGw6ICNmZmY7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2FlYWVhZTtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMC4zcmVtO1xuICBwYWRkaW5nOiA4cHggMDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZSB7XG4gIHBhZGRpbmctYm90dG9tOiA4cHg7XG4gIHBhZGRpbmctbGVmdDogNXB4O1xuICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lLS1vbmx5KSB7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS1oYXMtdGltZS1zZWxlY3QpIHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDAuM3JlbTtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tY29udGFpbmVyLS1zZWxlY3QsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tY29udGFpbmVyLS1zZWxlY3QsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXItLXNlbGVjdCxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2Nyb2xsLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLWNvbnRhaW5lci0tc2Nyb2xsLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tY29udGFpbmVyLS1zY3JvbGwge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbjogMCAxNXB4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aCxcbi5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlcixcbi5yZWFjdC1kYXRlcGlja2VyLXllYXItaGVhZGVyIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgY29sb3I6ICMwMDA7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBmb250LXNpemU6IDAuOTQ0cmVtO1xufVxuXG5oMi5yZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoIHtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luOiAwO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlci10aW1lX19oZWFkZXIge1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24ge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAycHg7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogbm9uZTtcbiAgei1pbmRleDogMTtcbiAgaGVpZ2h0OiAzMnB4O1xuICB3aWR0aDogMzJweDtcbiAgdGV4dC1pbmRlbnQ6IC05OTllbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1wcmV2aW91cyB7XG4gIGxlZnQ6IDJweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0IHtcbiAgcmlnaHQ6IDJweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0LS13aXRoLXRpbWU6bm90KC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0LS13aXRoLXRvZGF5LWJ1dHRvbikge1xuICByaWdodDogODVweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAwO1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy1wcmV2aW91cyB7XG4gIHRvcDogNHB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nIHtcbiAgdG9wOiAtNHB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb246aG92ZXIgKjo6YmVmb3JlIHtcbiAgYm9yZGVyLWNvbG9yOiAjYTZhNmE2O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IC0xcHg7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgd2lkdGg6IDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1uZXh0IHtcbiAgbGVmdDogLTJweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLW5leHQ6OmJlZm9yZSB7XG4gIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbiAgbGVmdDogLTdweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLXByZXZpb3VzIHtcbiAgcmlnaHQ6IC0ycHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1wcmV2aW91czo6YmVmb3JlIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMjI1ZGVnKTtcbiAgcmlnaHQ6IC03cHg7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1jb250YWluZXIge1xuICBmbG9hdDogbGVmdDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXIge1xuICBtYXJnaW46IDAuNHJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItd3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgbWF4LXdpZHRoOiAxODBweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiA0cmVtO1xuICBtYXJnaW46IDJweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoIHtcbiAgbWFyZ2luOiAwLjRyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19tb250aCAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aCAucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogNHJlbTtcbiAgbWFyZ2luOiAycHg7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciB7XG4gIGNsZWFyOiBib3RoO1xuICB3aWR0aDogMTAwJTtcbiAgZmxvYXQ6IGxlZnQ7XG4gIG1hcmdpbjogNXB4IDAgMTBweCAxNXB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2NhcHRpb24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IGlucHV0IHtcbiAgd2lkdGg6IGF1dG87XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IGlucHV0W3R5cGU9dGltZV06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IGlucHV0W3R5cGU9dGltZV06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIG1hcmdpbjogMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXRbdHlwZT10aW1lXSB7XG4gIC1tb3otYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19kZWxpbWl0ZXIge1xuICBtYXJnaW4tbGVmdDogNXB4O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciB7XG4gIGZsb2F0OiByaWdodDtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYWVhZWFlO1xuICB3aWR0aDogODVweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lci0td2l0aC10b2RheS1idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmU7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNhZWFlYWU7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogLTg3cHg7XG4gIHRvcDogMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZDogd2hpdGU7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHtcbiAgd2lkdGg6IDg1cHg7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuM3JlbTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgbWFyZ2luOiAwO1xuICBoZWlnaHQ6IGNhbGMoMTk1cHggKyAxLjdyZW0gLyAyKTtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICBwYWRkaW5nLXJpZ2h0OiAwO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtIHtcbiAgaGVpZ2h0OiAzMHB4O1xuICBwYWRkaW5nOiA1cHggMTBweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtOmhvdmVyIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLXNlbGVjdGVkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcbiAgY29sb3I6IHdoaXRlO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1zZWxlY3RlZDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tZGlzYWJsZWQge1xuICBjb2xvcjogI2NjYztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1kaXNhYmxlZDpob3ZlciB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlciB7XG4gIGNvbG9yOiAjY2NjO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAxLjdyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjdyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbWFyZ2luOiAwLjE2NnJlbTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tY2xpY2thYmxlIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1jbGlja2FibGU6bm90KC5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkKTpob3ZlciB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tc2VsZWN0ZWQge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XG4gIGNvbG9yOiAjZmZmO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmE4N2QwO1xuICBjb2xvcjogI2ZmZjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWVzIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgbWFyZ2luLWJvdHRvbTogLThweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWsge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbmFtZSB7XG4gIGNvbG9yOiAjMDAwO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAxLjdyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjdyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbWFyZ2luOiAwLjE2NnJlbTtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dCxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5OmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0OmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dDpob3ZlciB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLXRvZGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXRvZGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tdG9kYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS10b2RheSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZCxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2RjYzRhO1xuICBjb2xvcjogI2ZmZjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1oaWdobGlnaHRlZDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMmJlM2Y7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZC1jdXN0b20tMSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0xLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEge1xuICBjb2xvcjogbWFnZW50YTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkLWN1c3RvbS0yLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0yLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMiB7XG4gIGNvbG9yOiBncmVlbjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXMsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1ob2xpZGF5cyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2ODAzO1xuICBjb2xvcjogI2ZmZjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXMgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1ob2xpZGF5cyAub3ZlcmxheSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAxMDAlO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcbiAgY29sb3I6ICNmZmY7XG4gIHBhZGRpbmc6IDRweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMHMsIG9wYWNpdHkgMC4zcyBlYXNlLWluLW91dDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXM6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1ob2xpZGF5czpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjZjUzMDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5czpob3ZlciAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5czpob3ZlciAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXM6aG92ZXIgLm92ZXJsYXkge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICBvcGFjaXR5OiAxO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tc2VsZWN0ZWQsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2Uge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XG4gIGNvbG9yOiAjZmZmO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tc2VsZWN0ZWQ6aG92ZXIsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZTpob3ZlciwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2U6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tc2VsZWN0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tc2VsZWN0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXNlbGVjdGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2U6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0ta2V5Ym9hcmQtc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmFkOWYxO1xuICBjb2xvcjogcmdiKDAsIDAsIDApO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDMzLCAxMDcsIDE2NSwgMC41KTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSwgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XG4gIGNvbG9yOiAjMDAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tZGlzYWJsZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1kaXNhYmxlZCxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBjb2xvcjogI2NjYztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tZGlzYWJsZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1kaXNhYmxlZDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWQgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tZGlzYWJsZWQgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1kaXNhYmxlZCAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkIC5vdmVybGF5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDcwJTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XG4gIGNvbG9yOiAjZmZmO1xuICBwYWRkaW5nOiA0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDBzLCBvcGFjaXR5IDAuM3MgZWFzZS1pbi1vdXQ7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDEwMCU7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX19jYWxlbmRhci1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBwYWRkaW5nOiAwLjVyZW07XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdmlldy1jYWxlbmRhci1pY29uIGlucHV0IHtcbiAgcGFkZGluZzogNnB4IDEwcHggNXB4IDI1cHg7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXcsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXcge1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXc6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3OmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3OmhvdmVyIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3cge1xuICBib3JkZXItdG9wLWNvbG9yOiAjYjNiM2IzO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyB7XG4gIHRyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7XG4gIHJpZ2h0OiAtMTZweDtcbiAgdG9wOiAwO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogNTAlO1xuICBsZWZ0OiAyNSU7XG4gIHRvcDogMzBweDtcbiAgei1pbmRleDogMTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJvcmRlcjogMXB4IHNvbGlkICNhZWFlYWU7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bjpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bjpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duOmhvdmVyIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tLXNjcm9sbGFibGUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tLXNjcm9sbGFibGUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi0tc2Nyb2xsYWJsZSB7XG4gIGhlaWdodDogMTUwcHg7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbiB7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICB3aWR0aDogMTAwJTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246Zmlyc3Qtb2YtdHlwZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246Zmlyc3Qtb2YtdHlwZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpmaXJzdC1vZi10eXBlIHtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMC4zcmVtO1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmxhc3Qtb2YtdHlwZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246bGFzdC1vZi10eXBlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmxhc3Qtb2YtdHlwZSB7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwLjNyZW07XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcge1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjYjNiM2IzO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy1wcmV2aW91cyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy1wcmV2aW91cyB7XG4gIGJvcmRlci10b3AtY29sb3I6ICNiM2IzYjM7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb24tLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbi0tc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb24tLXNlbGVjdGVkIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAxNXB4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbiB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogMDtcbiAgb3V0bGluZTogMDtcbiAgcGFkZGluZzogMCA2cHggMCAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uOjphZnRlciB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcbiAgY29sb3I6ICNmZmY7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgaGVpZ2h0OiAxNnB4O1xuICB3aWR0aDogMTZweDtcbiAgcGFkZGluZzogMnB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGNvbnRlbnQ6IFwiw5dcIjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uLS1kaXNhYmxlZCB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uLS1kaXNhYmxlZDo6YWZ0ZXIge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX190b2RheS1idXR0b24ge1xuICBiYWNrZ3JvdW5kOiAjZjBmMGYwO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2FlYWVhZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBwYWRkaW5nOiA1cHggMDtcbiAgY2xlYXI6IGxlZnQ7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHdpZHRoOiAxMDB2dztcbiAgaGVpZ2h0OiAxMDB2aDtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICB6LWluZGV4OiAyMTQ3NDgzNjQ3O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLW5hbWUge1xuICB3aWR0aDogM3JlbTtcbiAgbGluZS1oZWlnaHQ6IDNyZW07XG59XG5AbWVkaWEgKG1heC13aWR0aDogNDAwcHgpLCAobWF4LWhlaWdodDogNTUwcHgpIHtcbiAgLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWUsXG4gIC5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcbiAgLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1uYW1lIHtcbiAgICB3aWR0aDogMnJlbTtcbiAgICBsaW5lLWhlaWdodDogMnJlbTtcbiAgfVxufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aCxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyIHtcbiAgZm9udC1zaXplOiAxLjQ0cmVtO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2hpbGRyZW4tY29udGFpbmVyIHtcbiAgd2lkdGg6IDEzLjhyZW07XG4gIG1hcmdpbjogMC40cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjJyZW07XG4gIHBhZGRpbmctbGVmdDogMC4ycmVtO1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19hcmlhLWxpdmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIC13ZWJraXQtY2xpcC1wYXRoOiBjaXJjbGUoMCk7XG4gICAgICAgICAgY2xpcC1wYXRoOiBjaXJjbGUoMCk7XG4gIGJvcmRlcjogMDtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMDtcbiAgd2lkdGg6IDFweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2NhbGVuZGFyLWljb24ge1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtO1xufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9kaXN0L3JlYWN0LWRhdGVwaWNrZXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLGdCQUFnQjtBQUNoQjs7O0VBR0Usa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQix5QkFBeUI7RUFDekIsV0FBVztFQUNYLGNBQWM7RUFDZCxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLFFBQVE7RUFDUixVQUFVO0FBQ1o7QUFDQTtFQUNFLHFCQUFxQjtFQUNyQixVQUFVO0VBQ1YsU0FBUztBQUNYOztBQUVBO0VBQ0UsMkRBQTJEO0VBQzNELGlCQUFpQjtFQUNqQixzQkFBc0I7RUFDdEIsV0FBVztFQUNYLHlCQUF5QjtFQUN6QixxQkFBcUI7RUFDckIscUJBQXFCO0VBQ3JCLGtCQUFrQjtFQUNsQixvQkFBb0I7QUFDdEI7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCO0FBQ0E7O0VBRUUsaUNBQWlDO0VBQ2pDLGtDQUFrQztBQUNwQzs7QUFFQTtFQUNFLFVBQVU7RUFDVixjQUFjO0FBQ2hCO0FBQ0E7RUFDRSxlQUFlO0FBQ2pCO0FBQ0E7RUFDRSxhQUFhO0VBQ2IsY0FBYztBQUNoQjtB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LFdBQVc7QUFDYjs7QUFFQTtFQUNFLGVBQWU7RUFDZixZQUFZO0VBQ1osYUFBYTtFQUNiLG9DQUFvQztFQUNwQyxPQUFPO0VBQ1AsTUFBTTtFQUNOLHVCQUF1QjtFQUN2QixtQkFBbUI7RUFDbkIsYUFBYTtFQUNiLG1CQUFtQjtBQUNyQjtBQUNBOzs7RUFHRSxXQUFXO0VBQ1gsaUJBQWlCO0FBQ25CO0FBQ0E7RUFDRTs7O0lBR0UsV0FBVztJQUNYLGlCQUFpQjtFQUNuQjtBQUNGO0FBQ0E7O0VBRUUsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsY0FBYztFQUNkLGNBQWM7RUFDZCxxQkFBcUI7RUFDckIsb0JBQW9CO0VBQ3BCLFlBQVk7QUFDZDs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQiw0QkFBb0I7VUFBcEIsb0JBQW9CO0VBQ3BCLFNBQVM7RUFDVCxXQUFXO0VBQ1gsWUFBWTtFQUNaLGdCQUFnQjtFQUNoQixVQUFVO0VBQ1YsVUFBVTtFQUNWLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLFVBQVU7RUFDVixXQUFXO0VBQ1gsd0JBQXdCO0FBQzFCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIkBjaGFyc2V0IFxcXCJVVEYtOFxcXCI7XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3LS1kb3duLWFycm93LCAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uOjpiZWZvcmUge1xcbiAgYm9yZGVyLWNvbG9yOiAjY2NjO1xcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcXG4gIGJvcmRlci13aWR0aDogM3B4IDNweCAwIDA7XFxuICBjb250ZW50OiBcXFwiXFxcIjtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgaGVpZ2h0OiA5cHg7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDZweDtcXG4gIHdpZHRoOiA5cHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyLXdyYXBwZXIge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgcGFkZGluZzogMDtcXG4gIGJvcmRlcjogMDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXIge1xcbiAgZm9udC1mYW1pbHk6IFxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCIsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7XFxuICBmb250LXNpemU6IDAuOHJlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICBjb2xvcjogIzAwMDtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNhZWFlYWU7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBsaW5lLWhlaWdodDogaW5pdGlhbDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXItLXRpbWUtb25seSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIge1xcbiAgYm9yZGVyLWxlZnQ6IDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyLS10aW1lLW9ubHkgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUsXFxuLnJlYWN0LWRhdGVwaWNrZXItLXRpbWUtb25seSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3gge1xcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMC4zcmVtO1xcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuM3JlbTtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXItcG9wcGVyIHtcXG4gIHotaW5kZXg6IDE7XFxuICBsaW5lLWhlaWdodDogMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXItcG9wcGVyIC5yZWFjdC1kYXRlcGlja2VyX190cmlhbmdsZSB7XFxuICBzdHJva2U6ICNhZWFlYWU7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlcltkYXRhLXBsYWNlbWVudF49Ym90dG9tXSAucmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGUge1xcbiAgZmlsbDogI2YwZjBmMDtcXG4gIGNvbG9yOiAjZjBmMGYwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXJbZGF0YS1wbGFjZW1lbnRePXRvcF0gLnJlYWN0LWRhdGVwaWNrZXJfX3RyaWFuZ2xlIHtcXG4gIGZpbGw6ICNmZmY7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlciB7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNhZWFlYWU7XFxuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwLjNyZW07XFxuICBwYWRkaW5nOiA4cHggMDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZSB7XFxuICBwYWRkaW5nLWJvdHRvbTogOHB4O1xcbiAgcGFkZGluZy1sZWZ0OiA1cHg7XFxuICBwYWRkaW5nLXJpZ2h0OiA1cHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWU6bm90KC5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWUtLW9ubHkpIHtcXG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXI6bm90KC5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLWhhcy10aW1lLXNlbGVjdCkge1xcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDAuM3JlbTtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tY29udGFpbmVyLS1zZWxlY3QsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLWNvbnRhaW5lci0tc2VsZWN0LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2VsZWN0LFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2Nyb2xsLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi1jb250YWluZXItLXNjcm9sbCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXItLXNjcm9sbCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBtYXJnaW46IDAgMTVweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgsXFxuLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyLFxcbi5yZWFjdC1kYXRlcGlja2VyLXllYXItaGVhZGVyIHtcXG4gIG1hcmdpbi10b3A6IDA7XFxuICBjb2xvcjogIzAwMDtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgZm9udC1zaXplOiAwLjk0NHJlbTtcXG59XFxuXFxuaDIucmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aCB7XFxuICBwYWRkaW5nOiAwO1xcbiAgbWFyZ2luOiAwO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlci10aW1lX19oZWFkZXIge1xcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24ge1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGJhY2tncm91bmQ6IG5vbmU7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDJweDtcXG4gIHBhZGRpbmc6IDA7XFxuICBib3JkZXI6IG5vbmU7XFxuICB6LWluZGV4OiAxO1xcbiAgaGVpZ2h0OiAzMnB4O1xcbiAgd2lkdGg6IDMycHg7XFxuICB0ZXh0LWluZGVudDogLTk5OWVtO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXByZXZpb3VzIHtcXG4gIGxlZnQ6IDJweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQge1xcbiAgcmlnaHQ6IDJweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLXdpdGgtdGltZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLXdpdGgtdG9kYXktYnV0dG9uKSB7XFxuICByaWdodDogODVweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHRvcDogMDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy1wcmV2aW91cyB7XFxuICB0b3A6IDRweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nIHtcXG4gIHRvcDogLTRweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb246aG92ZXIgKjo6YmVmb3JlIHtcXG4gIGJvcmRlci1jb2xvcjogI2E2YTZhNjtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbiB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB0b3A6IC0xcHg7XFxuICBmb250LXNpemU6IDIwcHg7XFxuICB3aWR0aDogMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tbmV4dCB7XFxuICBsZWZ0OiAtMnB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1uZXh0OjpiZWZvcmUge1xcbiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xcbiAgbGVmdDogLTdweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tcHJldmlvdXMge1xcbiAgcmlnaHQ6IC0ycHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLXByZXZpb3VzOjpiZWZvcmUge1xcbiAgdHJhbnNmb3JtOiByb3RhdGUoMjI1ZGVnKTtcXG4gIHJpZ2h0OiAtN3B4O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtY29udGFpbmVyIHtcXG4gIGZsb2F0OiBsZWZ0O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhciB7XFxuICBtYXJnaW46IDAuNHJlbTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItd3JhcHBlciB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgZmxleC13cmFwOiB3cmFwO1xcbiAgbWF4LXdpZHRoOiAxODBweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogNHJlbTtcXG4gIG1hcmdpbjogMnB4O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgge1xcbiAgbWFyZ2luOiAwLjRyZW07XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aCAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGggLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogNHJlbTtcXG4gIG1hcmdpbjogMnB4O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIge1xcbiAgY2xlYXI6IGJvdGg7XFxuICB3aWR0aDogMTAwJTtcXG4gIGZsb2F0OiBsZWZ0O1xcbiAgbWFyZ2luOiA1cHggMCAxMHB4IDE1cHg7XFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9fY2FwdGlvbiB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IGlucHV0IHtcXG4gIHdpZHRoOiBhdXRvO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IGlucHV0W3R5cGU9dGltZV06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dFt0eXBlPXRpbWVdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gIG1hcmdpbjogMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dFt0eXBlPXRpbWVdIHtcXG4gIC1tb3otYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2RlbGltaXRlciB7XFxuICBtYXJnaW4tbGVmdDogNXB4O1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIge1xcbiAgZmxvYXQ6IHJpZ2h0O1xcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYWVhZWFlO1xcbiAgd2lkdGg6IDg1cHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lci0td2l0aC10b2RheS1idXR0b24ge1xcbiAgZGlzcGxheTogaW5saW5lO1xcbiAgYm9yZGVyOiAxcHggc29saWQgI2FlYWVhZTtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHJpZ2h0OiAtODdweDtcXG4gIHRvcDogMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuM3JlbTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB7XFxuICB3aWR0aDogODVweDtcXG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcXG4gIG1hcmdpbjogMCBhdXRvO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuM3JlbTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3Qge1xcbiAgbGlzdC1zdHlsZTogbm9uZTtcXG4gIG1hcmdpbjogMDtcXG4gIGhlaWdodDogY2FsYygxOTVweCArIDEuN3JlbSAvIDIpO1xcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xcbiAgcGFkZGluZy1yaWdodDogMDtcXG4gIHBhZGRpbmctbGVmdDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtIHtcXG4gIGhlaWdodDogMzBweDtcXG4gIHBhZGRpbmc6IDVweCAxMHB4O1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW06aG92ZXIge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLXNlbGVjdGVkIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XFxuICBjb2xvcjogd2hpdGU7XFxuICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLXNlbGVjdGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1kaXNhYmxlZCB7XFxuICBjb2xvcjogI2NjYztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLWRpc2FibGVkOmhvdmVyIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXIge1xcbiAgY29sb3I6ICNjY2M7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogMS43cmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuN3JlbTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIG1hcmdpbjogMC4xNjZyZW07XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tY2xpY2thYmxlIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1jbGlja2FibGU6bm90KC5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZCk6aG92ZXIge1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZCB7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xcbiAgY29sb3I6ICNmZmY7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tc2VsZWN0ZWQ6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZCB7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmE4N2QwO1xcbiAgY29sb3I6ICNmZmY7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lcyB7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgbWFyZ2luLWJvdHRvbTogLThweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWsge1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lLFxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbmFtZSB7XFxuICBjb2xvcjogIzAwMDtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdpZHRoOiAxLjdyZW07XFxuICBsaW5lLWhlaWdodDogMS43cmVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgbWFyZ2luOiAwLjE2NnJlbTtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5OmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0OmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dDpob3ZlciB7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS10b2RheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tdG9kYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tdG9kYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tdG9kYXkge1xcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1oaWdobGlnaHRlZCB7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2RjYzRhO1xcbiAgY29sb3I6ICNmZmY7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1oaWdobGlnaHRlZDpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzJiZTNmO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZC1jdXN0b20tMSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEge1xcbiAgY29sb3I6IG1hZ2VudGE7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkLWN1c3RvbS0yLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMiB7XFxuICBjb2xvcjogZ3JlZW47XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5cyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5cyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1ob2xpZGF5cyB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2ODAzO1xcbiAgY29sb3I6ICNmZmY7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5cyAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5cyAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1ob2xpZGF5cyAub3ZlcmxheSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDEwMCU7XFxuICBsZWZ0OiA1MCU7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xcbiAgY29sb3I6ICNmZmY7XFxuICBwYWRkaW5nOiA0cHg7XFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgb3BhY2l0eTogMDtcXG4gIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMHMsIG9wYWNpdHkgMC4zcyBlYXNlLWluLW91dDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXM6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNjZjUzMDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5czpob3ZlciAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5czpob3ZlciAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1ob2xpZGF5czpob3ZlciAub3ZlcmxheSB7XFxuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgb3BhY2l0eTogMTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tc2VsZWN0ZWQsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2Uge1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RlZDpob3ZlciwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZTpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tc2VsZWN0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2U6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tc2VsZWN0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXNlbGVjdGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZTpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1rZXlib2FyZC1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQge1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2JhZDlmMTtcXG4gIGNvbG9yOiByZ2IoMCwgMCwgMCk7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZDpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMzMsIDEwNywgMTY1LCAwLjUpO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSkge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcXG4gIGNvbG9yOiAjMDAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tZGlzYWJsZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tZGlzYWJsZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWQge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbiAgY29sb3I6ICNjY2M7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1kaXNhYmxlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1kaXNhYmxlZDpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWQgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkIC5vdmVybGF5IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJvdHRvbTogNzAlO1xcbiAgbGVmdDogNTAlO1xcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcXG4gIGNvbG9yOiAjZmZmO1xcbiAgcGFkZGluZzogNHB4O1xcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcXG4gIG9wYWNpdHk6IDA7XFxuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDBzLCBvcGFjaXR5IDAuM3MgZWFzZS1pbi1vdXQ7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXIge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgd2lkdGg6IDEwMCU7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX2NhbGVuZGFyLWljb24ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcGFkZGluZzogMC41cmVtO1xcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX192aWV3LWNhbGVuZGFyLWljb24gaW5wdXQge1xcbiAgcGFkZGluZzogNnB4IDEwcHggNXB4IDI1cHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldyB7XFxuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3OmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXc6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3OmhvdmVyIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyB7XFxuICBib3JkZXItdG9wLWNvbG9yOiAjYjNiM2IzO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3cge1xcbiAgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTtcXG4gIHJpZ2h0OiAtMTZweDtcXG4gIHRvcDogMDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24sXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB3aWR0aDogNTAlO1xcbiAgbGVmdDogMjUlO1xcbiAgdG9wOiAzMHB4O1xcbiAgei1pbmRleDogMTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNhZWFlYWU7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bjpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bjpob3ZlciB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLS1zY3JvbGxhYmxlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi0tc2Nyb2xsYWJsZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi0tc2Nyb2xsYWJsZSB7XFxuICBoZWlnaHQ6IDE1MHB4O1xcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb24sXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb24ge1xcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XFxuICB3aWR0aDogMTAwJTtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpmaXJzdC1vZi10eXBlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246Zmlyc3Qtb2YtdHlwZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246Zmlyc3Qtb2YtdHlwZSB7XFxuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwLjNyZW07XFxuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246bGFzdC1vZi10eXBlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246bGFzdC1vZi10eXBlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpsYXN0LW9mLXR5cGUge1xcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAuM3JlbTtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcge1xcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2IzYjNiMztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy1wcmV2aW91cyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy1wcmV2aW91cyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzIHtcXG4gIGJvcmRlci10b3AtY29sb3I6ICNiM2IzYjM7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbi0tc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbi0tc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uLS1zZWxlY3RlZCB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBsZWZ0OiAxNXB4O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbiB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gIGJvcmRlcjogMDtcXG4gIG91dGxpbmU6IDA7XFxuICBwYWRkaW5nOiAwIDZweCAwIDA7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDA7XFxuICByaWdodDogMDtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbjo6YWZ0ZXIge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcXG4gIGNvbG9yOiAjZmZmO1xcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xcbiAgaGVpZ2h0OiAxNnB4O1xcbiAgd2lkdGg6IDE2cHg7XFxuICBwYWRkaW5nOiAycHg7XFxuICBmb250LXNpemU6IDEycHg7XFxuICBsaW5lLWhlaWdodDogMTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcbiAgY29udGVudDogXFxcIsOXXFxcIjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb24tLWRpc2FibGVkIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb24tLWRpc2FibGVkOjphZnRlciB7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdG9kYXktYnV0dG9uIHtcXG4gIGJhY2tncm91bmQ6ICNmMGYwZjA7XFxuICBib3JkZXItdG9wOiAxcHggc29saWQgI2FlYWVhZTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgcGFkZGluZzogNXB4IDA7XFxuICBjbGVhcjogbGVmdDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCB7XFxuICBwb3NpdGlvbjogZml4ZWQ7XFxuICB3aWR0aDogMTAwdnc7XFxuICBoZWlnaHQ6IDEwMHZoO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpO1xcbiAgbGVmdDogMDtcXG4gIHRvcDogMDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICB6LWluZGV4OiAyMTQ3NDgzNjQ3O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1uYW1lIHtcXG4gIHdpZHRoOiAzcmVtO1xcbiAgbGluZS1oZWlnaHQ6IDNyZW07XFxufVxcbkBtZWRpYSAobWF4LXdpZHRoOiA0MDBweCksIChtYXgtaGVpZ2h0OiA1NTBweCkge1xcbiAgLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWUsXFxuICAucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXksXFxuICAucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLW5hbWUge1xcbiAgICB3aWR0aDogMnJlbTtcXG4gICAgbGluZS1oZWlnaHQ6IDJyZW07XFxuICB9XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19oZWFkZXIge1xcbiAgZm9udC1zaXplOiAxLjQ0cmVtO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2hpbGRyZW4tY29udGFpbmVyIHtcXG4gIHdpZHRoOiAxMy44cmVtO1xcbiAgbWFyZ2luOiAwLjRyZW07XFxuICBwYWRkaW5nLXJpZ2h0OiAwLjJyZW07XFxuICBwYWRkaW5nLWxlZnQ6IDAuMnJlbTtcXG4gIGhlaWdodDogYXV0bztcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2FyaWEtbGl2ZSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBjbGlwLXBhdGg6IGNpcmNsZSgwKTtcXG4gIGJvcmRlcjogMDtcXG4gIGhlaWdodDogMXB4O1xcbiAgbWFyZ2luOiAtMXB4O1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIHBhZGRpbmc6IDA7XFxuICB3aWR0aDogMXB4O1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2NhbGVuZGFyLWljb24ge1xcbiAgd2lkdGg6IDFlbTtcXG4gIGhlaWdodDogMWVtO1xcbiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtO1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2dldFVybC5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JTI3MjQlMjcgaGVpZ2h0PSUyNzI0JTI3IHN0cm9rZT0lMjclMjMwMDAlMjcgdmlld0JveD0lMjcwIDAgMjQgMjQlMjcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjclM0UlM0NzdHlsZSUzRS5zcGlubmVyX1Y4bTElN0J0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjthbmltYXRpb246c3Bpbm5lcl96S29hIDJzIGxpbmVhciBpbmZpbml0ZSU3RC5zcGlubmVyX1Y4bTEgY2lyY2xlJTdCc3Ryb2tlLWxpbmVjYXA6cm91bmQ7YW5pbWF0aW9uOnNwaW5uZXJfWXBaUyAxLjVzIGVhc2Utb3V0IGluZmluaXRlJTdEJTQwa2V5ZnJhbWVzIHNwaW5uZXJfektvYSU3QjEwMCUyNSU3QnRyYW5zZm9ybTpyb3RhdGUlMjgzNjBkZWclMjklN0QlN0QlNDBrZXlmcmFtZXMgc3Bpbm5lcl9ZcFpTJTdCMCUyNSU3QnN0cm9rZS1kYXNoYXJyYXk6MCAxNTA7c3Ryb2tlLWRhc2hvZmZzZXQ6MCU3RDQ3LjUlMjUlN0JzdHJva2UtZGFzaGFycmF5OjQyIDE1MDtzdHJva2UtZGFzaG9mZnNldDotMTYlN0Q5NSUyNSUyQzEwMCUyNSU3QnN0cm9rZS1kYXNoYXJyYXk6NDIgMTUwO3N0cm9rZS1kYXNob2Zmc2V0Oi01OSU3RCU3RCUzQyUyRnN0eWxlJTNFJTNDZyBjbGFzcz0lMjdzcGlubmVyX1Y4bTElMjclM0UlM0NjaXJjbGUgY3g9JTI3MTIlMjcgY3k9JTI3MTIlMjcgcj0lMjc5LjUlMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZS13aWR0aD0lMjczJTI3JTNFJTNDJTJGY2lyY2xlJTNFJTNDJTJGZyUzRSUzQyUyRnN2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgeG1sbnM6eGxpbms9JTI3aHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayUyNyBzdHlsZT0lMjdzaGFwZS1yZW5kZXJpbmc6IGF1dG87JTI3IHdpZHRoPSUyNzIwMHB4JTI3IGhlaWdodD0lMjcyMDBweCUyNyB2aWV3Qm94PSUyNzAgMCAxMDAgMTAwJTI3IHByZXNlcnZlQXNwZWN0UmF0aW89JTI3eE1pZFlNaWQlMjclM0UlM0NwYXRoIGZpbGw9JTI3bm9uZSUyNyBzdHJva2U9JTI3JTIzMGEwYTBhJTI3IHN0cm9rZS13aWR0aD0lMjcxMCUyNyBzdHJva2UtZGFzaGFycmF5PSUyNzIwNS4yNzExNDI1NzgxMjUgNTEuMzE3Nzg1NjQ0NTMxMjU2JTI3IGQ9JTI3TTI0LjMgMzBDMTEuNCAzMCA1IDQzLjMgNSA1MHM2LjQgMjAgMTkuMyAyMGMxOS4zIDAgMzIuMS00MCA1MS40LTQwIEM4OC42IDMwIDk1IDQzLjMgOTUgNTBzLTYuNCAyMC0xOS4zIDIwQzU2LjQgNzAgNDMuNiAzMCAyNC4zIDMweiUyNyBzdHJva2UtbGluZWNhcD0lMjdyb3VuZCUyNyBzdHlsZT0lMjd0cmFuc2Zvcm06c2NhbGUlMjgwLjglMjk7dHJhbnNmb3JtLW9yaWdpbjo1MHB4IDUwcHglMjclM0UlM0NhbmltYXRlIGF0dHJpYnV0ZU5hbWU9JTI3c3Ryb2tlLWRhc2hvZmZzZXQlMjcgcmVwZWF0Q291bnQ9JTI3aW5kZWZpbml0ZSUyNyBkdXI9JTI3MnMlMjcga2V5VGltZXM9JTI3MDsxJTI3IHZhbHVlcz0lMjcwOzI1Ni41ODg5MjgyMjI2NTYyNSUyNyUzRSUzQy9hbmltYXRlJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFTRWxFUVZSNG5HTmd3QU1rSlNVYnBLU2tPdkNwSWFUNVB4U1Rib2dVUWpNWU13eGVJSVhtVkZJeEE4VUdERHlRR2cwRG5JRGk2SktVbEN4SE1xQ2VaQU9naGpTQU1ENUZBS2ZlYVVSZFVGeENBQUFBQUVsRlRrU3VRbUNDXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzBfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMl9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qXG4hIHRhaWx3aW5kY3NzIHYzLjQuNyB8IE1JVCBMaWNlbnNlIHwgaHR0cHM6Ly90YWlsd2luZGNzcy5jb21cbiovLypcbjEuIFByZXZlbnQgcGFkZGluZyBhbmQgYm9yZGVyIGZyb20gYWZmZWN0aW5nIGVsZW1lbnQgd2lkdGguIChodHRwczovL2dpdGh1Yi5jb20vbW96ZGV2cy9jc3NyZW1lZHkvaXNzdWVzLzQpXG4yLiBBbGxvdyBhZGRpbmcgYSBib3JkZXIgdG8gYW4gZWxlbWVudCBieSBqdXN0IGFkZGluZyBhIGJvcmRlci13aWR0aC4gKGh0dHBzOi8vZ2l0aHViLmNvbS90YWlsd2luZGNzcy90YWlsd2luZGNzcy9wdWxsLzExNilcbiovXG5cbiosXG46OmJlZm9yZSxcbjo6YWZ0ZXIge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94OyAvKiAxICovXG4gIGJvcmRlci13aWR0aDogMDsgLyogMiAqL1xuICBib3JkZXItc3R5bGU6IHNvbGlkOyAvKiAyICovXG4gIGJvcmRlci1jb2xvcjogI2U1ZTdlYjsgLyogMiAqL1xufVxuXG46OmJlZm9yZSxcbjo6YWZ0ZXIge1xuICAtLXR3LWNvbnRlbnQ6ICcnO1xufVxuXG4vKlxuMS4gVXNlIGEgY29uc2lzdGVudCBzZW5zaWJsZSBsaW5lLWhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXG4yLiBQcmV2ZW50IGFkanVzdG1lbnRzIG9mIGZvbnQgc2l6ZSBhZnRlciBvcmllbnRhdGlvbiBjaGFuZ2VzIGluIGlPUy5cbjMuIFVzZSBhIG1vcmUgcmVhZGFibGUgdGFiIHNpemUuXG40LiBVc2UgdGhlIHVzZXIncyBjb25maWd1cmVkIFxcYHNhbnNcXGAgZm9udC1mYW1pbHkgYnkgZGVmYXVsdC5cbjUuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgc2Fuc1xcYCBmb250LWZlYXR1cmUtc2V0dGluZ3MgYnkgZGVmYXVsdC5cbjYuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgc2Fuc1xcYCBmb250LXZhcmlhdGlvbi1zZXR0aW5ncyBieSBkZWZhdWx0LlxuNy4gRGlzYWJsZSB0YXAgaGlnaGxpZ2h0cyBvbiBpT1NcbiovXG5cbmh0bWwsXG46aG9zdCB7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7IC8qIDEgKi9cbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovIC8qIDMgKi9cbiAgdGFiLXNpemU6IDQ7IC8qIDMgKi9cbiAgZm9udC1mYW1pbHk6IHVpLXNhbnMtc2VyaWYsIHN5c3RlbS11aSwgc2Fucy1zZXJpZiwgXCJBcHBsZSBDb2xvciBFbW9qaVwiLCBcIlNlZ29lIFVJIEVtb2ppXCIsIFwiU2Vnb2UgVUkgU3ltYm9sXCIsIFwiTm90byBDb2xvciBFbW9qaVwiOyAvKiA0ICovXG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogbm9ybWFsOyAvKiA1ICovXG4gIGZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOiBub3JtYWw7IC8qIDYgKi9cbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsgLyogNyAqL1xufVxuXG4vKlxuMS4gUmVtb3ZlIHRoZSBtYXJnaW4gaW4gYWxsIGJyb3dzZXJzLlxuMi4gSW5oZXJpdCBsaW5lLWhlaWdodCBmcm9tIFxcYGh0bWxcXGAgc28gdXNlcnMgY2FuIHNldCB0aGVtIGFzIGEgY2xhc3MgZGlyZWN0bHkgb24gdGhlIFxcYGh0bWxcXGAgZWxlbWVudC5cbiovXG5cbmJvZHkge1xuICBtYXJnaW46IDA7IC8qIDEgKi9cbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IC8qIDIgKi9cbn1cblxuLypcbjEuIEFkZCB0aGUgY29ycmVjdCBoZWlnaHQgaW4gRmlyZWZveC5cbjIuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIG9mIGJvcmRlciBjb2xvciBpbiBGaXJlZm94LiAoaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTkwNjU1KVxuMy4gRW5zdXJlIGhvcml6b250YWwgcnVsZXMgYXJlIHZpc2libGUgYnkgZGVmYXVsdC5cbiovXG5cbmhyIHtcbiAgaGVpZ2h0OiAwOyAvKiAxICovXG4gIGNvbG9yOiBpbmhlcml0OyAvKiAyICovXG4gIGJvcmRlci10b3Atd2lkdGg6IDFweDsgLyogMyAqL1xufVxuXG4vKlxuQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkuXG4qL1xuXG5hYmJyOndoZXJlKFt0aXRsZV0pIHtcbiAgLXdlYmtpdC10ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBkb3R0ZWQ7XG4gICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xufVxuXG4vKlxuUmVtb3ZlIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBhbmQgd2VpZ2h0IGZvciBoZWFkaW5ncy5cbiovXG5cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7XG59XG5cbi8qXG5SZXNldCBsaW5rcyB0byBvcHRpbWl6ZSBmb3Igb3B0LWluIHN0eWxpbmcgaW5zdGVhZCBvZiBvcHQtb3V0LlxuKi9cblxuYSB7XG4gIGNvbG9yOiBpbmhlcml0O1xuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XG59XG5cbi8qXG5BZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gRWRnZSBhbmQgU2FmYXJpLlxuKi9cblxuYixcbnN0cm9uZyB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkZXI7XG59XG5cbi8qXG4xLiBVc2UgdGhlIHVzZXIncyBjb25maWd1cmVkIFxcYG1vbm9cXGAgZm9udC1mYW1pbHkgYnkgZGVmYXVsdC5cbjIuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgbW9ub1xcYCBmb250LWZlYXR1cmUtc2V0dGluZ3MgYnkgZGVmYXVsdC5cbjMuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgbW9ub1xcYCBmb250LXZhcmlhdGlvbi1zZXR0aW5ncyBieSBkZWZhdWx0LlxuNC4gQ29ycmVjdCB0aGUgb2RkIFxcYGVtXFxgIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiovXG5cbmNvZGUsXG5rYmQsXG5zYW1wLFxucHJlIHtcbiAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkxpYmVyYXRpb24gTW9ub1wiLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZTsgLyogMSAqL1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6IG5vcm1hbDsgLyogMiAqL1xuICBmb250LXZhcmlhdGlvbi1zZXR0aW5nczogbm9ybWFsOyAvKiAzICovXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiA0ICovXG59XG5cbi8qXG5BZGQgdGhlIGNvcnJlY3QgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiovXG5cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG5cbi8qXG5QcmV2ZW50IFxcYHN1YlxcYCBhbmQgXFxgc3VwXFxgIGVsZW1lbnRzIGZyb20gYWZmZWN0aW5nIHRoZSBsaW5lIGhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXG4qL1xuXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07XG59XG5cbnN1cCB7XG4gIHRvcDogLTAuNWVtO1xufVxuXG4vKlxuMS4gUmVtb3ZlIHRleHQgaW5kZW50YXRpb24gZnJvbSB0YWJsZSBjb250ZW50cyBpbiBDaHJvbWUgYW5kIFNhZmFyaS4gKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTk5OTA4OCwgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMTI5NylcbjIuIENvcnJlY3QgdGFibGUgYm9yZGVyIGNvbG9yIGluaGVyaXRhbmNlIGluIGFsbCBDaHJvbWUgYW5kIFNhZmFyaS4gKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTkzNTcyOSwgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5NTAxNilcbjMuIFJlbW92ZSBnYXBzIGJldHdlZW4gdGFibGUgYm9yZGVycyBieSBkZWZhdWx0LlxuKi9cblxudGFibGUge1xuICB0ZXh0LWluZGVudDogMDsgLyogMSAqL1xuICBib3JkZXItY29sb3I6IGluaGVyaXQ7IC8qIDIgKi9cbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgLyogMyAqL1xufVxuXG4vKlxuMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXG4yLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXG4zLiBSZW1vdmUgZGVmYXVsdCBwYWRkaW5nIGluIGFsbCBicm93c2Vycy5cbiovXG5cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0OyAvKiAxICovXG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogaW5oZXJpdDsgLyogMSAqL1xuICBmb250LXZhcmlhdGlvbi1zZXR0aW5nczogaW5oZXJpdDsgLyogMSAqL1xuICBmb250LXNpemU6IDEwMCU7IC8qIDEgKi9cbiAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7IC8qIDEgKi9cbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IC8qIDEgKi9cbiAgbGV0dGVyLXNwYWNpbmc6IGluaGVyaXQ7IC8qIDEgKi9cbiAgY29sb3I6IGluaGVyaXQ7IC8qIDEgKi9cbiAgbWFyZ2luOiAwOyAvKiAyICovXG4gIHBhZGRpbmc6IDA7IC8qIDMgKi9cbn1cblxuLypcblJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSBhbmQgRmlyZWZveC5cbiovXG5cbmJ1dHRvbixcbnNlbGVjdCB7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4vKlxuMS4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cbjIuIFJlbW92ZSBkZWZhdWx0IGJ1dHRvbiBzdHlsZXMuXG4qL1xuXG5idXR0b24sXG5pbnB1dDp3aGVyZShbdHlwZT0nYnV0dG9uJ10pLFxuaW5wdXQ6d2hlcmUoW3R5cGU9J3Jlc2V0J10pLFxuaW5wdXQ6d2hlcmUoW3R5cGU9J3N1Ym1pdCddKSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvKiAxICovXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyAvKiAyICovXG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8qIDIgKi9cbn1cblxuLypcblVzZSB0aGUgbW9kZXJuIEZpcmVmb3ggZm9jdXMgc3R5bGUgZm9yIGFsbCBmb2N1c2FibGUgZWxlbWVudHMuXG4qL1xuXG46LW1vei1mb2N1c3Jpbmcge1xuICBvdXRsaW5lOiBhdXRvO1xufVxuXG4vKlxuUmVtb3ZlIHRoZSBhZGRpdGlvbmFsIFxcYDppbnZhbGlkXFxgIHN0eWxlcyBpbiBGaXJlZm94LiAoaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ2Vja28tZGV2L2Jsb2IvMmY5ZWFjZDlkM2Q5OTVjOTM3YjQyNTFhNTU1N2Q5NWQ0OTRjOWJlMS9sYXlvdXQvc3R5bGUvcmVzL2Zvcm1zLmNzcyNMNzI4LUw3MzcpXG4qL1xuXG46LW1vei11aS1pbnZhbGlkIHtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cblxuLypcbkFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lIGFuZCBGaXJlZm94LlxuKi9cblxucHJvZ3Jlc3Mge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbi8qXG5Db3JyZWN0IHRoZSBjdXJzb3Igc3R5bGUgb2YgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYnV0dG9ucyBpbiBTYWZhcmkuXG4qL1xuXG46Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG46Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi8qXG4xLiBDb3JyZWN0IHRoZSBvZGQgYXBwZWFyYW5jZSBpbiBDaHJvbWUgYW5kIFNhZmFyaS5cbjIuIENvcnJlY3QgdGhlIG91dGxpbmUgc3R5bGUgaW4gU2FmYXJpLlxuKi9cblxuW3R5cGU9J3NlYXJjaCddIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7IC8qIDEgKi9cbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IC8qIDIgKi9cbn1cblxuLypcblJlbW92ZSB0aGUgaW5uZXIgcGFkZGluZyBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBtYWNPUy5cbiovXG5cbjo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLypcbjEuIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXG4yLiBDaGFuZ2UgZm9udCBwcm9wZXJ0aWVzIHRvIFxcYGluaGVyaXRcXGAgaW4gU2FmYXJpLlxuKi9cblxuOjotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvKiAxICovXG4gIGZvbnQ6IGluaGVyaXQ7IC8qIDIgKi9cbn1cblxuLypcbkFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIENocm9tZSBhbmQgU2FmYXJpLlxuKi9cblxuc3VtbWFyeSB7XG4gIGRpc3BsYXk6IGxpc3QtaXRlbTtcbn1cblxuLypcblJlbW92ZXMgdGhlIGRlZmF1bHQgc3BhY2luZyBhbmQgYm9yZGVyIGZvciBhcHByb3ByaWF0ZSBlbGVtZW50cy5cbiovXG5cbmJsb2NrcXVvdGUsXG5kbCxcbmRkLFxuaDEsXG5oMixcbmgzLFxuaDQsXG5oNSxcbmg2LFxuaHIsXG5maWd1cmUsXG5wLFxucHJlIHtcbiAgbWFyZ2luOiAwO1xufVxuXG5maWVsZHNldCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxubGVnZW5kIHtcbiAgcGFkZGluZzogMDtcbn1cblxub2wsXG51bCxcbm1lbnUge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi8qXG5SZXNldCBkZWZhdWx0IHN0eWxpbmcgZm9yIGRpYWxvZ3MuXG4qL1xuZGlhbG9nIHtcbiAgcGFkZGluZzogMDtcbn1cblxuLypcblByZXZlbnQgcmVzaXppbmcgdGV4dGFyZWFzIGhvcml6b250YWxseSBieSBkZWZhdWx0LlxuKi9cblxudGV4dGFyZWEge1xuICByZXNpemU6IHZlcnRpY2FsO1xufVxuXG4vKlxuMS4gUmVzZXQgdGhlIGRlZmF1bHQgcGxhY2Vob2xkZXIgb3BhY2l0eSBpbiBGaXJlZm94LiAoaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy9pc3N1ZXMvMzMwMClcbjIuIFNldCB0aGUgZGVmYXVsdCBwbGFjZWhvbGRlciBjb2xvciB0byB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgZ3JheSA0MDAgY29sb3IuXG4qL1xuXG5pbnB1dDo6cGxhY2Vob2xkZXIsXG50ZXh0YXJlYTo6cGxhY2Vob2xkZXIge1xuICBvcGFjaXR5OiAxOyAvKiAxICovXG4gIGNvbG9yOiAjOWNhM2FmOyAvKiAyICovXG59XG5cbi8qXG5TZXQgdGhlIGRlZmF1bHQgY3Vyc29yIGZvciBidXR0b25zLlxuKi9cblxuYnV0dG9uLFxuW3JvbGU9XCJidXR0b25cIl0ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi8qXG5NYWtlIHN1cmUgZGlzYWJsZWQgYnV0dG9ucyBkb24ndCBnZXQgdGhlIHBvaW50ZXIgY3Vyc29yLlxuKi9cbjpkaXNhYmxlZCB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLypcbjEuIE1ha2UgcmVwbGFjZWQgZWxlbWVudHMgXFxgZGlzcGxheTogYmxvY2tcXGAgYnkgZGVmYXVsdC4gKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3pkZXZzL2Nzc3JlbWVkeS9pc3N1ZXMvMTQpXG4yLiBBZGQgXFxgdmVydGljYWwtYWxpZ246IG1pZGRsZVxcYCB0byBhbGlnbiByZXBsYWNlZCBlbGVtZW50cyBtb3JlIHNlbnNpYmx5IGJ5IGRlZmF1bHQuIChodHRwczovL2dpdGh1Yi5jb20vamVuc2ltbW9ucy9jc3NyZW1lZHkvaXNzdWVzLzE0I2lzc3VlY29tbWVudC02MzQ5MzQyMTApXG4gICBUaGlzIGNhbiB0cmlnZ2VyIGEgcG9vcmx5IGNvbnNpZGVyZWQgbGludCBlcnJvciBpbiBzb21lIHRvb2xzIGJ1dCBpcyBpbmNsdWRlZCBieSBkZXNpZ24uXG4qL1xuXG5pbWcsXG5zdmcsXG52aWRlbyxcbmNhbnZhcyxcbmF1ZGlvLFxuaWZyYW1lLFxuZW1iZWQsXG5vYmplY3Qge1xuICBkaXNwbGF5OiBibG9jazsgLyogMSAqL1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyAvKiAyICovXG59XG5cbi8qXG5Db25zdHJhaW4gaW1hZ2VzIGFuZCB2aWRlb3MgdG8gdGhlIHBhcmVudCB3aWR0aCBhbmQgcHJlc2VydmUgdGhlaXIgaW50cmluc2ljIGFzcGVjdCByYXRpby4gKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3pkZXZzL2Nzc3JlbWVkeS9pc3N1ZXMvMTQpXG4qL1xuXG5pbWcsXG52aWRlbyB7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vKiBNYWtlIGVsZW1lbnRzIHdpdGggdGhlIEhUTUwgaGlkZGVuIGF0dHJpYnV0ZSBzdGF5IGhpZGRlbiBieSBkZWZhdWx0ICovXG5baGlkZGVuXSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbjpyb290LFxuW2RhdGEtdGhlbWVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8xKSk7XG59XG5cbkBzdXBwb3J0cyBub3QgKGNvbG9yOiBva2xjaCgwJSAwIDApKSB7XG5cbiAgOnJvb3Qge1xuICAgIGNvbG9yLXNjaGVtZTogbGlnaHQ7XG4gICAgLS1mYWxsYmFjay1wOiAjNDkxZWZmO1xuICAgIC0tZmFsbGJhY2stcGM6ICNkNGRiZmY7XG4gICAgLS1mYWxsYmFjay1zOiAjZmY0MWM3O1xuICAgIC0tZmFsbGJhY2stc2M6ICNmZmY5ZmM7XG4gICAgLS1mYWxsYmFjay1hOiAjMDBjZmJkO1xuICAgIC0tZmFsbGJhY2stYWM6ICMwMDEwMGQ7XG4gICAgLS1mYWxsYmFjay1uOiAjMmIzNDQwO1xuICAgIC0tZmFsbGJhY2stbmM6ICNkN2RkZTQ7XG4gICAgLS1mYWxsYmFjay1iMTogI2ZmZmZmZjtcbiAgICAtLWZhbGxiYWNrLWIyOiAjZTVlNmU2O1xuICAgIC0tZmFsbGJhY2stYjM6ICNlNWU2ZTY7XG4gICAgLS1mYWxsYmFjay1iYzogIzFmMjkzNztcbiAgICAtLWZhbGxiYWNrLWluOiAjMDBiM2YwO1xuICAgIC0tZmFsbGJhY2staW5jOiAjMDAwMDAwO1xuICAgIC0tZmFsbGJhY2stc3U6ICMwMGNhOTI7XG4gICAgLS1mYWxsYmFjay1zdWM6ICMwMDAwMDA7XG4gICAgLS1mYWxsYmFjay13YTogI2ZmYzIyZDtcbiAgICAtLWZhbGxiYWNrLXdhYzogIzAwMDAwMDtcbiAgICAtLWZhbGxiYWNrLWVyOiAjZmY2ZjcwO1xuICAgIC0tZmFsbGJhY2stZXJjOiAjMDAwMDAwO1xuICB9XG5cbiAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xuXG4gICAgOnJvb3Qge1xuICAgICAgY29sb3Itc2NoZW1lOiBkYXJrO1xuICAgICAgLS1mYWxsYmFjay1wOiAjNzU4MmZmO1xuICAgICAgLS1mYWxsYmFjay1wYzogIzA1MDYxNztcbiAgICAgIC0tZmFsbGJhY2stczogI2ZmNzFjZjtcbiAgICAgIC0tZmFsbGJhY2stc2M6ICMxOTAyMTE7XG4gICAgICAtLWZhbGxiYWNrLWE6ICMwMGM3YjU7XG4gICAgICAtLWZhbGxiYWNrLWFjOiAjMDAwZTBjO1xuICAgICAgLS1mYWxsYmFjay1uOiAjMmEzMjNjO1xuICAgICAgLS1mYWxsYmFjay1uYzogI2E2YWRiYjtcbiAgICAgIC0tZmFsbGJhY2stYjE6ICMxZDIzMmE7XG4gICAgICAtLWZhbGxiYWNrLWIyOiAjMTkxZTI0O1xuICAgICAgLS1mYWxsYmFjay1iMzogIzE1MTkxZTtcbiAgICAgIC0tZmFsbGJhY2stYmM6ICNhNmFkYmI7XG4gICAgICAtLWZhbGxiYWNrLWluOiAjMDBiM2YwO1xuICAgICAgLS1mYWxsYmFjay1pbmM6ICMwMDAwMDA7XG4gICAgICAtLWZhbGxiYWNrLXN1OiAjMDBjYTkyO1xuICAgICAgLS1mYWxsYmFjay1zdWM6ICMwMDAwMDA7XG4gICAgICAtLWZhbGxiYWNrLXdhOiAjZmZjMjJkO1xuICAgICAgLS1mYWxsYmFjay13YWM6ICMwMDAwMDA7XG4gICAgICAtLWZhbGxiYWNrLWVyOiAjZmY2ZjcwO1xuICAgICAgLS1mYWxsYmFjay1lcmM6ICMwMDAwMDA7XG4gICAgfVxuICB9XG59XG5cbmh0bWwge1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4qIHtcbiAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsY2gsIGN1cnJlbnRDb2xvciAzNSUsIHRyYW5zcGFyZW50KSB0cmFuc3BhcmVudDtcbn1cblxuKjpob3ZlciB7XG4gIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGNoLCBjdXJyZW50Q29sb3IgNjAlLCB0cmFuc3BhcmVudCkgdHJhbnNwYXJlbnQ7XG59XG5cbjpyb290IHtcbiAgY29sb3Itc2NoZW1lOiBkYXJrO1xuICAtLWluOiA3Mi4wNiUgMC4xOTEgMjMxLjY7XG4gIC0tc3U6IDY0LjglIDAuMTUwIDE2MDtcbiAgLS13YTogODQuNzElIDAuMTk5IDgzLjg3O1xuICAtLWVyOiA3MS43NiUgMC4yMjEgMjIuMTg7XG4gIC0tcGM6IDEzLjEzOCUgMC4wMzkyIDI3NS43NTtcbiAgLS1zYzogMTQuOTYlIDAuMDUyIDM0Mi41NTtcbiAgLS1hYzogMTQuOTAyJSAwLjAzMzQgMTgzLjYxO1xuICAtLWluYzogMCUgMCAwO1xuICAtLXN1YzogMCUgMCAwO1xuICAtLXdhYzogMCUgMCAwO1xuICAtLWVyYzogMCUgMCAwO1xuICAtLXJvdW5kZWQtYm94OiAxcmVtO1xuICAtLXJvdW5kZWQtYnRuOiAwLjVyZW07XG4gIC0tcm91bmRlZC1iYWRnZTogMS45cmVtO1xuICAtLWFuaW1hdGlvbi1idG46IDAuMjVzO1xuICAtLWFuaW1hdGlvbi1pbnB1dDogLjJzO1xuICAtLWJ0bi1mb2N1cy1zY2FsZTogMC45NTtcbiAgLS1ib3JkZXItYnRuOiAxcHg7XG4gIC0tdGFiLWJvcmRlcjogMXB4O1xuICAtLXRhYi1yYWRpdXM6IDAuNXJlbTtcbiAgLS1wOiA2NS42OSUgMC4xOTYgMjc1Ljc1O1xuICAtLXM6IDc0LjglIDAuMjYgMzQyLjU1O1xuICAtLWE6IDc0LjUxJSAwLjE2NyAxODMuNjE7XG4gIC0tbjogMzEuMzgxNSUgMC4wMjExMDggMjU0LjEzOTE3NTtcbiAgLS1uYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG4gIC0tYjE6IDI1LjMyNjclIDAuMDE1ODk2IDI1Mi40MTc1Njg7XG4gIC0tYjI6IDIzLjI2MDclIDAuMDEzODA3IDI1My4xMDA2NzU7XG4gIC0tYjM6IDIxLjE0ODQlIDAuMDExNjUgMjU0LjA4NzkzOTtcbiAgLS1iYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG59XG5cbltkYXRhLXRoZW1lPWRhcmtdIHtcbiAgY29sb3Itc2NoZW1lOiBkYXJrO1xuICAtLWluOiA3Mi4wNiUgMC4xOTEgMjMxLjY7XG4gIC0tc3U6IDY0LjglIDAuMTUwIDE2MDtcbiAgLS13YTogODQuNzElIDAuMTk5IDgzLjg3O1xuICAtLWVyOiA3MS43NiUgMC4yMjEgMjIuMTg7XG4gIC0tcGM6IDEzLjEzOCUgMC4wMzkyIDI3NS43NTtcbiAgLS1zYzogMTQuOTYlIDAuMDUyIDM0Mi41NTtcbiAgLS1hYzogMTQuOTAyJSAwLjAzMzQgMTgzLjYxO1xuICAtLWluYzogMCUgMCAwO1xuICAtLXN1YzogMCUgMCAwO1xuICAtLXdhYzogMCUgMCAwO1xuICAtLWVyYzogMCUgMCAwO1xuICAtLXJvdW5kZWQtYm94OiAxcmVtO1xuICAtLXJvdW5kZWQtYnRuOiAwLjVyZW07XG4gIC0tcm91bmRlZC1iYWRnZTogMS45cmVtO1xuICAtLWFuaW1hdGlvbi1idG46IDAuMjVzO1xuICAtLWFuaW1hdGlvbi1pbnB1dDogLjJzO1xuICAtLWJ0bi1mb2N1cy1zY2FsZTogMC45NTtcbiAgLS1ib3JkZXItYnRuOiAxcHg7XG4gIC0tdGFiLWJvcmRlcjogMXB4O1xuICAtLXRhYi1yYWRpdXM6IDAuNXJlbTtcbiAgLS1wOiA2NS42OSUgMC4xOTYgMjc1Ljc1O1xuICAtLXM6IDc0LjglIDAuMjYgMzQyLjU1O1xuICAtLWE6IDc0LjUxJSAwLjE2NyAxODMuNjE7XG4gIC0tbjogMzEuMzgxNSUgMC4wMjExMDggMjU0LjEzOTE3NTtcbiAgLS1uYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG4gIC0tYjE6IDI1LjMyNjclIDAuMDE1ODk2IDI1Mi40MTc1Njg7XG4gIC0tYjI6IDIzLjI2MDclIDAuMDEzODA3IDI1My4xMDA2NzU7XG4gIC0tYjM6IDIxLjE0ODQlIDAuMDExNjUgMjU0LjA4NzkzOTtcbiAgLS1iYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG59XG5cbltkYXRhLXRoZW1lPW9wZW5zaWduY3NzXSB7XG4gIC0tcDogMjkuNDY1MyUgMC4xMTQ1NDggMjU5LjA2MDEyOTtcbiAgLS1yb3VuZGVkLWJveDogMXJlbTtcbiAgLS1yb3VuZGVkLWJhZGdlOiAxLjlyZW07XG4gIC0tYW5pbWF0aW9uLWJ0bjogMC4yNXM7XG4gIC0tYW5pbWF0aW9uLWlucHV0OiAuMnM7XG4gIC0tYnRuLWZvY3VzLXNjYWxlOiAwLjk1O1xuICAtLWJvcmRlci1idG46IDFweDtcbiAgLS1wYzogODQuNDUzMSUgMC4wMDQ3MDIgMjU4LjMyNjc5MTtcbiAgLS1zOiAzMi43ODM3JSAwLjA0MDg4NSAyNjEuMzQ2ODc7XG4gIC0tc2M6IDg1LjgzMzklIDAuMDIzMDA2IDI2MC43MTk0NDI7XG4gIC0tYTogNTcuNDQzOCUgMC4yMzE0OTEgMjIuMTc5OTA5O1xuICAtLWFjOiA5MS40MjQ3JSAwLjA0MzkzNSAyMy4xNzk1Nzk7XG4gIC0tbjogODQuMTM3MyUgMC4wMjQxNTcgMjU2LjExNDE7XG4gIC0tbmM6IDE4LjQwODElIDAuMDAzNzU4IDE2NC41OTc2NTQ7XG4gIC0tYjE6IDEwMCUgMCAwO1xuICAtLWIyOiA5MC4wNjAxJSAwIDA7XG4gIC0tYjM6IDgwLjE1MTclIDAgMDtcbiAgLS1iYzogMjAuMDE5MyUgMCAwO1xuICAtLWluOiA3My40NTkyJSAwLjE1ODg3NCAyMzYuMzU3NTE0O1xuICAtLWluYzogOTYuOTg3MSUgMC4wMDEzMjQgMTA2LjQyMzgyMTtcbiAgLS1zdTogNjQuODE1OSUgMC4xNDc0MDUgMTU5LjY3MjY2NjtcbiAgLS1zdWM6IDk2Ljk4NzElIDAuMDAxMzI0IDEwNi40MjM4MjE7XG4gIC0td2E6IDgzLjgzOTglIDAuMTcyMjA5IDgzLjU3Mzk2NztcbiAgLS13YWM6IDg4LjAwMDUlIDAuMDI1MDQgMjUxLjkxNjk4O1xuICAtLWVyOiA4MC40OTAyJSAwLjExMjAxNyAxNS43Mjc1MjI7XG4gIC0tZXJjOiAxNS45OTclIDAuMDIzMjg0IDE0Ljg5ODUxNztcbiAgLS1yb3VuZGVkLWJ0bjogMS45cmVtO1xuICAtLXRhYi1ib3JkZXI6IDJweDtcbiAgLS10YWItcmFkaXVzOiAwLjdyZW07XG59XG5cbiosIDo6YmVmb3JlLCA6OmFmdGVyIHtcbiAgLS10dy1ib3JkZXItc3BhY2luZy14OiAwO1xuICAtLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7XG4gIC0tdHctdHJhbnNsYXRlLXg6IDA7XG4gIC0tdHctdHJhbnNsYXRlLXk6IDA7XG4gIC0tdHctcm90YXRlOiAwO1xuICAtLXR3LXNrZXcteDogMDtcbiAgLS10dy1za2V3LXk6IDA7XG4gIC0tdHctc2NhbGUteDogMTtcbiAgLS10dy1zY2FsZS15OiAxO1xuICAtLXR3LXBhbi14OiAgO1xuICAtLXR3LXBhbi15OiAgO1xuICAtLXR3LXBpbmNoLXpvb206ICA7XG4gIC0tdHctc2Nyb2xsLXNuYXAtc3RyaWN0bmVzczogcHJveGltaXR5O1xuICAtLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246ICA7XG4gIC0tdHctZ3JhZGllbnQtdmlhLXBvc2l0aW9uOiAgO1xuICAtLXR3LWdyYWRpZW50LXRvLXBvc2l0aW9uOiAgO1xuICAtLXR3LW9yZGluYWw6ICA7XG4gIC0tdHctc2xhc2hlZC16ZXJvOiAgO1xuICAtLXR3LW51bWVyaWMtZmlndXJlOiAgO1xuICAtLXR3LW51bWVyaWMtc3BhY2luZzogIDtcbiAgLS10dy1udW1lcmljLWZyYWN0aW9uOiAgO1xuICAtLXR3LXJpbmctaW5zZXQ6ICA7XG4gIC0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDtcbiAgLS10dy1yaW5nLW9mZnNldC1jb2xvcjogI2ZmZjtcbiAgLS10dy1yaW5nLWNvbG9yOiByZ2IoNTkgMTMwIDI0NiAvIDAuNSk7XG4gIC0tdHctcmluZy1vZmZzZXQtc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctcmluZy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwO1xuICAtLXR3LWJsdXI6ICA7XG4gIC0tdHctYnJpZ2h0bmVzczogIDtcbiAgLS10dy1jb250cmFzdDogIDtcbiAgLS10dy1ncmF5c2NhbGU6ICA7XG4gIC0tdHctaHVlLXJvdGF0ZTogIDtcbiAgLS10dy1pbnZlcnQ6ICA7XG4gIC0tdHctc2F0dXJhdGU6ICA7XG4gIC0tdHctc2VwaWE6ICA7XG4gIC0tdHctZHJvcC1zaGFkb3c6ICA7XG4gIC0tdHctYmFja2Ryb3AtYmx1cjogIDtcbiAgLS10dy1iYWNrZHJvcC1icmlnaHRuZXNzOiAgO1xuICAtLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiAgO1xuICAtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZTogIDtcbiAgLS10dy1iYWNrZHJvcC1odWUtcm90YXRlOiAgO1xuICAtLXR3LWJhY2tkcm9wLWludmVydDogIDtcbiAgLS10dy1iYWNrZHJvcC1vcGFjaXR5OiAgO1xuICAtLXR3LWJhY2tkcm9wLXNhdHVyYXRlOiAgO1xuICAtLXR3LWJhY2tkcm9wLXNlcGlhOiAgO1xuICAtLXR3LWNvbnRhaW4tc2l6ZTogIDtcbiAgLS10dy1jb250YWluLWxheW91dDogIDtcbiAgLS10dy1jb250YWluLXBhaW50OiAgO1xuICAtLXR3LWNvbnRhaW4tc3R5bGU6ICA7XG59XG5cbjo6YmFja2Ryb3Age1xuICAtLXR3LWJvcmRlci1zcGFjaW5nLXg6IDA7XG4gIC0tdHctYm9yZGVyLXNwYWNpbmcteTogMDtcbiAgLS10dy10cmFuc2xhdGUteDogMDtcbiAgLS10dy10cmFuc2xhdGUteTogMDtcbiAgLS10dy1yb3RhdGU6IDA7XG4gIC0tdHctc2tldy14OiAwO1xuICAtLXR3LXNrZXcteTogMDtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIC0tdHctcGFuLXg6ICA7XG4gIC0tdHctcGFuLXk6ICA7XG4gIC0tdHctcGluY2gtem9vbTogIDtcbiAgLS10dy1zY3JvbGwtc25hcC1zdHJpY3RuZXNzOiBwcm94aW1pdHk7XG4gIC0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbjogIDtcbiAgLS10dy1ncmFkaWVudC12aWEtcG9zaXRpb246ICA7XG4gIC0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246ICA7XG4gIC0tdHctb3JkaW5hbDogIDtcbiAgLS10dy1zbGFzaGVkLXplcm86ICA7XG4gIC0tdHctbnVtZXJpYy1maWd1cmU6ICA7XG4gIC0tdHctbnVtZXJpYy1zcGFjaW5nOiAgO1xuICAtLXR3LW51bWVyaWMtZnJhY3Rpb246ICA7XG4gIC0tdHctcmluZy1pbnNldDogIDtcbiAgLS10dy1yaW5nLW9mZnNldC13aWR0aDogMHB4O1xuICAtLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmO1xuICAtLXR3LXJpbmctY29sb3I6IHJnYig1OSAxMzAgMjQ2IC8gMC41KTtcbiAgLS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1yaW5nLXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7XG4gIC0tdHctYmx1cjogIDtcbiAgLS10dy1icmlnaHRuZXNzOiAgO1xuICAtLXR3LWNvbnRyYXN0OiAgO1xuICAtLXR3LWdyYXlzY2FsZTogIDtcbiAgLS10dy1odWUtcm90YXRlOiAgO1xuICAtLXR3LWludmVydDogIDtcbiAgLS10dy1zYXR1cmF0ZTogIDtcbiAgLS10dy1zZXBpYTogIDtcbiAgLS10dy1kcm9wLXNoYWRvdzogIDtcbiAgLS10dy1iYWNrZHJvcC1ibHVyOiAgO1xuICAtLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6ICA7XG4gIC0tdHctYmFja2Ryb3AtY29udHJhc3Q6ICA7XG4gIC0tdHctYmFja2Ryb3AtZ3JheXNjYWxlOiAgO1xuICAtLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6ICA7XG4gIC0tdHctYmFja2Ryb3AtaW52ZXJ0OiAgO1xuICAtLXR3LWJhY2tkcm9wLW9wYWNpdHk6ICA7XG4gIC0tdHctYmFja2Ryb3Atc2F0dXJhdGU6ICA7XG4gIC0tdHctYmFja2Ryb3Atc2VwaWE6ICA7XG4gIC0tdHctY29udGFpbi1zaXplOiAgO1xuICAtLXR3LWNvbnRhaW4tbGF5b3V0OiAgO1xuICAtLXR3LWNvbnRhaW4tcGFpbnQ6ICA7XG4gIC0tdHctY29udGFpbi1zdHlsZTogIDtcbn1cclxuLmNvbnRhaW5lciB7XG4gIHdpZHRoOiAxMDAlO1xufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogNjQwcHgpIHtcblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDY0MHB4O1xuICB9XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuXG4gIC5jb250YWluZXIge1xuICAgIG1heC13aWR0aDogNzY4cHg7XG4gIH1cbn1cclxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuXG4gIC5jb250YWluZXIge1xuICAgIG1heC13aWR0aDogMTAyNHB4O1xuICB9XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiAxMjgwcHgpIHtcblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDEyODBweDtcbiAgfVxufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogMTUzNnB4KSB7XG5cbiAgLmNvbnRhaW5lciB7XG4gICAgbWF4LXdpZHRoOiAxNTM2cHg7XG4gIH1cbn1cclxuLm9wLWFsZXJ0IHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgd2lkdGg6IDEwMCU7XG4gIGdyaWQtYXV0by1mbG93OiByb3c7XG4gIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktaXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAxcmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICBwYWRkaW5nOiAxcmVtO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tYWxlcnQtYmc6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS8xKSk7XG4gIC0tYWxlcnQtYmctbWl4OiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hbGVydC1iZyk7XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiA2NDBweCkge1xuXG4gIC5vcC1hbGVydCB7XG4gICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gbWlubWF4KGF1dG8sMWZyKTtcbiAgICBqdXN0aWZ5LWl0ZW1zOiBzdGFydDtcbiAgICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgfVxufVxyXG4ub3AtYmFkZ2Uge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICBoZWlnaHQ6IDEuMjVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICB3aWR0aDogLXdlYmtpdC1maXQtY29udGVudDtcbiAgd2lkdGg6IC1tb3otZml0LWNvbnRlbnQ7XG4gIHdpZHRoOiBmaXQtY29udGVudDtcbiAgcGFkZGluZy1sZWZ0OiAwLjU2M3JlbTtcbiAgcGFkZGluZy1yaWdodDogMC41NjNyZW07XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYmFkZ2UsIDEuOXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5AbWVkaWEgKGhvdmVyOmhvdmVyKSB7XG5cbiAgLm9wLW1lbnUgbGkgPiAqOm5vdCh1bCwgLm9wLW1lbnUtdGl0bGUsIGRldGFpbHMsIC5vcC1idG4pOmFjdGl2ZSxcbi5vcC1tZW51IGxpID4gKjpub3QodWwsIC5vcC1tZW51LXRpdGxlLCBkZXRhaWxzLCAub3AtYnRuKS5vcC1hY3RpdmUsXG4ub3AtbWVudSBsaSA+IGRldGFpbHMgPiBzdW1tYXJ5OmFjdGl2ZSB7XG4gICAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stbmMsb2tsY2godmFyKC0tbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIC5vcC10YWI6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICB9XG5cbiAgLm9wLXRhYnMtYm94ZWQgOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSk6aG92ZXIsIC5vcC10YWJzLWJveGVkIDppcyhpbnB1dDpjaGVja2VkKTpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICAub3AtdGFibGUgdHIub3AtaG92ZXI6aG92ZXIsXG4gIC5vcC10YWJsZSB0ci5vcC1ob3ZlcjpudGgtY2hpbGQoZXZlbik6aG92ZXIge1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgfVxufVxyXG4ub3AtYnRuIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGhlaWdodDogM3JlbTtcbiAgbWluLWhlaWdodDogM3JlbTtcbiAgZmxleC1zaHJpbms6IDA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1jb2xvcjogb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMikpIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxZW07XG4gIGdhcDogMC41cmVtO1xuICBmb250LXdlaWdodDogNjAwO1xuICB0ZXh0LWRlY29yYXRpb24tbGluZTogbm9uZTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMjAwbXM7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgYm9yZGVyLXdpZHRoOiB2YXIoLS1ib3JkZXItYnRuLCAxcHgpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm07XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS10dy1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBva2xjaCh2YXIoLS1idG4tY29sb3IsIHZhcigtLWIyKSkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbn1cclxuLm9wLWJ0bi1kaXNhYmxlZCxcbiAgLm9wLWJ0bltkaXNhYmxlZF0sXG4gIC5vcC1idG46ZGlzYWJsZWQge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cclxuLm9wLWJ0bi1zcXVhcmUge1xuICBoZWlnaHQ6IDNyZW07XG4gIHdpZHRoOiAzcmVtO1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tY2lyY2xlIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICB3aWR0aDogM3JlbTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbjp3aGVyZSgub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSkpLFxuOndoZXJlKC5vcC1idG46aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdKSkge1xuICB3aWR0aDogYXV0bztcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG59XHJcbi5vcC1idG46aXMoaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdKTphZnRlcixcbi5vcC1idG46aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdKTphZnRlciB7XG4gIC0tdHctY29udGVudDogYXR0cihhcmlhLWxhYmVsKTtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG59XHJcbi5vcC1jYXJkIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG59XHJcbi5vcC1jYXJkOmZvY3VzIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3AtY2FyZC1ib2R5IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleDogMSAxIGF1dG87XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHBhZGRpbmc6IHZhcigtLXBhZGRpbmctY2FyZCwgMnJlbSk7XG4gIGdhcDogMC41cmVtO1xufVxyXG4ub3AtY2FyZC1ib2R5IDp3aGVyZShwKSB7XG4gIGZsZXgtZ3JvdzogMTtcbn1cclxuLm9wLWNhcmQtYWN0aW9ucyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gIGdhcDogMC41cmVtO1xufVxyXG4ub3AtY2FyZCBmaWd1cmUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cclxuLm9wLWNhcmQub3AtaW1hZ2UtZnVsbCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGw6YmVmb3JlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBjb250ZW50OiBcIlwiO1xuICB6LWluZGV4OiAxMDtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgb3BhY2l0eTogMC43NTtcbn1cclxuLm9wLWNhcmQub3AtaW1hZ2UtZnVsbDpiZWZvcmUsXG4gICAgLm9wLWNhcmQub3AtaW1hZ2UtZnVsbCA+ICoge1xuICBncmlkLWNvbHVtbi1zdGFydDogMTtcbiAgZ3JpZC1yb3ctc3RhcnQ6IDE7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGwgPiBmaWd1cmUgaW1nIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvYmplY3QtZml0OiBjb3Zlcjtcbn1cclxuLm9wLWNhcmQub3AtaW1hZ2UtZnVsbCA+IC5vcC1jYXJkLWJvZHkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDIwO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW5jLG9rbGNoKHZhcigtLW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1jaGVja2JveCB7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICAtLWNoa2JnOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpO1xuICAtLWNoa2ZnOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgd2lkdGg6IDEuNXJlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtZGl2aWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gIG1hcmdpbi10b3A6IDFyZW07XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG4gIGhlaWdodDogMXJlbTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cclxuLm9wLWRpdmlkZXI6YmVmb3JlLFxuICAub3AtZGl2aWRlcjphZnRlciB7XG4gIGhlaWdodDogMC4xMjVyZW07XG4gIHdpZHRoOiAxMDAlO1xuICBmbGV4LWdyb3c6IDE7XG4gIC0tdHctY29udGVudDogJyc7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4xKSk7XG59XHJcbi5vcC1kcm9wZG93biB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxyXG4ub3AtZHJvcGRvd24gPiAqOm5vdChzdW1tYXJ5KTpmb2N1cyB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWRyb3Bkb3duIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxyXG4ub3AtZHJvcGRvd246aXMoOm5vdChkZXRhaWxzKSkgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zZm9ybS1vcmlnaW46IHRvcDtcbiAgLS10dy1zY2FsZS14OiAuOTU7XG4gIC0tdHctc2NhbGUteTogLjk1O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMjAwbXM7XG59XHJcbi5vcC1kcm9wZG93bi1lbmQgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICBpbnNldC1pbmxpbmUtZW5kOiAwcHg7XG59XHJcbi5vcC1kcm9wZG93bi1sZWZ0IC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgYm90dG9tOiBhdXRvO1xuICBpbnNldC1pbmxpbmUtZW5kOiAxMDAlO1xuICB0b3A6IDBweDtcbiAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQ7XG59XHJcbi5vcC1kcm9wZG93bi1yaWdodCAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogYXV0bztcbiAgaW5zZXQtaW5saW5lLXN0YXJ0OiAxMDAlO1xuICB0b3A6IDBweDtcbiAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdDtcbn1cclxuLm9wLWRyb3Bkb3duLWJvdHRvbSAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogYXV0bztcbiAgdG9wOiAxMDAlO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3A7XG59XHJcbi5vcC1kcm9wZG93bi10b3AgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICBib3R0b206IDEwMCU7XG4gIHRvcDogYXV0bztcbiAgdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tO1xufVxyXG4ub3AtZHJvcGRvd24tZW5kLm9wLWRyb3Bkb3duLXJpZ2h0IC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgYm90dG9tOiAwcHg7XG4gIHRvcDogYXV0bztcbn1cclxuLm9wLWRyb3Bkb3duLWVuZC5vcC1kcm9wZG93bi1sZWZ0IC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgYm90dG9tOiAwcHg7XG4gIHRvcDogYXV0bztcbn1cclxuLm9wLWRyb3Bkb3duLm9wLWRyb3Bkb3duLW9wZW4gLm9wLWRyb3Bkb3duLWNvbnRlbnQsXG4ub3AtZHJvcGRvd246bm90KC5vcC1kcm9wZG93bi1ob3Zlcik6Zm9jdXMgLm9wLWRyb3Bkb3duLWNvbnRlbnQsXG4ub3AtZHJvcGRvd246Zm9jdXMtd2l0aGluIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgb3BhY2l0eTogMTtcbn1cclxuQG1lZGlhIChob3ZlcjogaG92ZXIpIHtcblxuICAub3AtZHJvcGRvd24ub3AtZHJvcGRvd24taG92ZXI6aG92ZXIgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuXG4gIC5vcC1idG46aG92ZXIge1xuICAgIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMyxva2xjaCh2YXIoLS1iMykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gICAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChcbiAgICAgICAgICAgIGluIG9rbGFiLFxuICAgICAgICAgICAgb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMikpIC8gdmFyKC0tdHctYmctb3BhY2l0eSwgMSkpIDkwJSxcbiAgICAgICAgICAgIGJsYWNrXG4gICAgICAgICAgKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KFxuICAgICAgICAgICAgaW4gb2tsYWIsXG4gICAgICAgICAgICBva2xjaCh2YXIoLS1idG4tY29sb3IsIHZhcigtLWIyKSkgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSwgMSkpIDkwJSxcbiAgICAgICAgICAgIGJsYWNrXG4gICAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBAc3VwcG9ydHMgbm90IChjb2xvcjogb2tsY2goMCUgMCAwKSkge1xuXG4gICAgLm9wLWJ0bjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1idG4tY29sb3IsIHZhcigtLWZhbGxiYWNrLWIyKSk7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tZmFsbGJhY2stYjIpKTtcbiAgICB9XG4gIH1cblxuICAub3AtYnRuLm9wLWdsYXNzOmhvdmVyIHtcbiAgICAtLWdsYXNzLW9wYWNpdHk6IDI1JTtcbiAgICAtLWdsYXNzLWJvcmRlci1vcGFjaXR5OiAxNSU7XG4gIH1cblxuICAub3AtYnRuLWdob3N0OmhvdmVyIHtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogb2tsY2goMCUgMCAwKSkge1xuXG4gICAgLm9wLWJ0bi1naG9zdDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lOmhvdmVyIHtcbiAgICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tcHJpbWFyeTpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG4tb3V0bGluZS5vcC1idG4tcHJpbWFyeTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tc2Vjb25kYXJ5OmhvdmVyIHtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc2Msb2tsY2godmFyKC0tc2MpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zZWNvbmRhcnk6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICB9XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudDpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWFjLG9rbGNoKHZhcigtLWFjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG4tb3V0bGluZS5vcC1idG4tYWNjZW50OmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS8xKSkgOTAlLCBibGFjayk7XG4gICAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zdWNjZXNzOmhvdmVyIHtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc3VjLG9rbGNoKHZhcigtLXN1YykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXN1Y2Nlc3M6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zdSxva2xjaCh2YXIoLS1zdSkvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1pbmZvOmhvdmVyIHtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW5jLG9rbGNoKHZhcigtLWluYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWluZm86aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi13YXJuaW5nOmhvdmVyIHtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2std2FjLG9rbGNoKHZhcigtLXdhYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXdhcm5pbmc6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXdhLG9rbGNoKHZhcigtLXdhKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1lcnJvcjpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyYyxva2xjaCh2YXIoLS1lcmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1lcnJvcjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS8xKSkgOTAlLCBibGFjayk7XG4gICAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stZXIsb2tsY2godmFyKC0tZXIpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICB9XG4gIH1cblxuICAub3AtYnRuLWRpc2FibGVkOmhvdmVyLFxuICAgIC5vcC1idG5bZGlzYWJsZWRdOmhvdmVyLFxuICAgIC5vcC1idG46ZGlzYWJsZWQ6aG92ZXIge1xuICAgIC0tdHctYm9yZGVyLW9wYWNpdHk6IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAgIC0tdHctYmctb3BhY2l0eTogMC4yO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG46aXMoaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQpOmhvdmVyLCAub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJyYWRpb1wiXTpjaGVja2VkKTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1kcm9wZG93bi5vcC1kcm9wZG93bi1ob3Zlcjpob3ZlciAub3AtZHJvcGRvd24tY29udGVudCB7XG4gICAgLS10dy1zY2FsZS14OiAxO1xuICAgIC0tdHctc2NhbGUteTogMTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgfVxuXG4gIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUpKTpub3QoLm9wLWFjdGl2ZSwgLm9wLWJ0bik6aG92ZXIsIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKTpub3QoLm9wLWFjdGl2ZSwgLm9wLWJ0bik6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAgIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUpKTpub3QoLm9wLWFjdGl2ZSwgLm9wLWJ0bik6aG92ZXIsIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKTpub3QoLm9wLWFjdGl2ZSwgLm9wLWJ0bik6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMSkpO1xuICAgIH1cbiAgfVxuXG4gIC5vcC10YWJbZGlzYWJsZWRdLFxuICAgIC5vcC10YWJbZGlzYWJsZWRdOmhvdmVyIHtcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG4gIH1cbn1cclxuLm9wLWRyb3Bkb3duOmlzKGRldGFpbHMpIHN1bW1hcnk6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuICBkaXNwbGF5OiBub25lO1xufVxyXG4ub3AtZmlsZS1pbnB1dCB7XG4gIGhlaWdodDogM3JlbTtcbiAgZmxleC1zaHJpbms6IDE7XG4gIHBhZGRpbmctaW5saW5lLWVuZDogMXJlbTtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgbGluZS1oZWlnaHQ6IDEuNXJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLWZpbGUtaW5wdXQ6Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uIHtcbiAgbWFyZ2luLWlubGluZS1lbmQ6IDFyZW07XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDFlbTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAyMDBtcztcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1uYyxva2xjaCh2YXIoLS1uYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB0ZXh0LWRlY29yYXRpb24tbGluZTogbm9uZTtcbiAgYm9yZGVyLXdpZHRoOiB2YXIoLS1ib3JkZXItYnRuLCAxcHgpO1xuICBhbmltYXRpb246IGJ1dHRvbi1wb3AgdmFyKC0tYW5pbWF0aW9uLWJ0biwgMC4yNXMpIGVhc2Utb3V0O1xufVxyXG4ub3AtZmlsZS1pbnB1dDo6ZmlsZS1zZWxlY3Rvci1idXR0b24ge1xuICBtYXJnaW4taW5saW5lLWVuZDogMXJlbTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGhlaWdodDogMTAwJTtcbiAgZmxleC1zaHJpbms6IDA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMWVtO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAyMDBtcztcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1uYyxva2xjaCh2YXIoLS1uYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB0ZXh0LWRlY29yYXRpb24tbGluZTogbm9uZTtcbiAgYm9yZGVyLXdpZHRoOiB2YXIoLS1ib3JkZXItYnRuLCAxcHgpO1xuICBhbmltYXRpb246IGJ1dHRvbi1wb3AgdmFyKC0tYW5pbWF0aW9uLWJ0biwgMC4yNXMpIGVhc2Utb3V0O1xufVxyXG4ub3AtZm9vdGVyIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgd2lkdGg6IDEwMCU7XG4gIGdyaWQtYXV0by1mbG93OiByb3c7XG4gIHBsYWNlLWl0ZW1zOiBzdGFydDtcbiAgY29sdW1uLWdhcDogMXJlbTtcbiAgcm93LWdhcDogMi41cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbn1cclxuLm9wLWZvb3RlciA+ICoge1xuICBkaXNwbGF5OiBncmlkO1xuICBwbGFjZS1pdGVtczogc3RhcnQ7XG4gIGdhcDogMC41cmVtO1xufVxyXG4ub3AtZm9vdGVyLWNlbnRlciB7XG4gIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cclxuLm9wLWZvb3Rlci1jZW50ZXIgPiAqIHtcbiAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbn1cclxuQG1lZGlhIChtaW4td2lkdGg6IDQ4cmVtKSB7XG5cbiAgLm9wLWZvb3RlciB7XG4gICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgfVxuXG4gIC5vcC1mb290ZXItY2VudGVyIHtcbiAgICBncmlkLWF1dG8tZmxvdzogcm93IGRlbnNlO1xuICB9XG59XHJcbi5vcC1pbnB1dCB7XG4gIGZsZXgtc2hyaW5rOiAxO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgaGVpZ2h0OiAzcmVtO1xuICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDFyZW07XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLWlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG4ub3AtaW5wdXQtbWRbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7XG4gIG1hcmdpbi10b3A6IC0xcmVtO1xuICBtYXJnaW4tYm90dG9tOiAtMXJlbTtcbiAgbWFyZ2luLWlubGluZS1lbmQ6IC0xcmVtO1xufVxyXG4ub3AtaW5wdXQteHNbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7XG4gIG1hcmdpbi10b3A6IC0wLjI1cmVtO1xuICBtYXJnaW4tYm90dG9tOiAtMC4yNXJlbTtcbiAgbWFyZ2luLWlubGluZS1lbmQ6IC0wcHg7XG59XHJcbi5vcC1pbnB1dC1zbVt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcbiAgbWFyZ2luLXRvcDogMHB4O1xuICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiAtMHB4O1xufVxyXG4ub3Atam9pbiB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG59XHJcbi5vcC1qb2luIDp3aGVyZSgub3Atam9pbi1pdGVtKSB7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAwO1xufVxyXG4ub3Atam9pbiAub3Atam9pbi1pdGVtOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCksXG4gIC5vcC1qb2luICo6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IDA7XG59XHJcbi5vcC1qb2luIC5vcC1qb2luLWl0ZW06Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSxcbiAgLm9wLWpvaW4gKjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiAwO1xufVxyXG4ub3Atam9pbiAub3AtZHJvcGRvd24gLm9wLWpvaW4taXRlbTpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpLFxuICAub3Atam9pbiAqOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgLm9wLWRyb3Bkb3duIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG4ub3Atam9pbiA6d2hlcmUoLm9wLWpvaW4taXRlbTpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpKSxcbiAgLm9wLWpvaW4gOndoZXJlKCo6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSAub3Atam9pbi1pdGVtKSB7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG4ub3Atam9pbiAub3Atam9pbi1pdGVtOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksXG4gIC5vcC1qb2luICo6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IDA7XG59XHJcbi5vcC1qb2luIDp3aGVyZSgub3Atam9pbi1pdGVtOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkpLFxuICAub3Atam9pbiA6d2hlcmUoKjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0pIHtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogaW5oZXJpdDtcbn1cclxuQHN1cHBvcnRzIG5vdCBzZWxlY3Rvcig6aGFzKCopKSB7XG5cbiAgOndoZXJlKC5vcC1qb2luICopIHtcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICB9XG59XHJcbkBzdXBwb3J0cyBzZWxlY3Rvcig6aGFzKCopKSB7XG5cbiAgOndoZXJlKC5vcC1qb2luICo6aGFzKC5vcC1qb2luLWl0ZW0pKSB7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbiAgfVxufVxyXG4ub3AtbGluayB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTtcbn1cclxuLm9wLW1lbnUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICBwYWRkaW5nOiAwLjVyZW07XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaSB1bCkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IDFyZW07XG4gIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAwLjVyZW07XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaTpub3QoLm9wLW1lbnUtdGl0bGUpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlLCAub3AtYnRuKSksIC5vcC1tZW51IDp3aGVyZShsaTpub3QoLm9wLW1lbnUtdGl0bGUpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSkge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuNXJlbTtcbiAgZ3JpZC1hdXRvLWNvbHVtbnM6IG1pbm1heChhdXRvLCAtd2Via2l0LW1heC1jb250ZW50KSBhdXRvIC13ZWJraXQtbWF4LWNvbnRlbnQ7XG4gIGdyaWQtYXV0by1jb2x1bW5zOiBtaW5tYXgoYXV0bywgbWF4LWNvbnRlbnQpIGF1dG8gbWF4LWNvbnRlbnQ7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XHJcbi5vcC1tZW51IGxpLm9wLWRpc2FibGVkIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjMpKTtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpID4gLm9wLW1lbnUtZHJvcGRvd246bm90KC5vcC1tZW51LWRyb3Bkb3duLXNob3cpKSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XHJcbjp3aGVyZSgub3AtbWVudSBsaSkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xufVxyXG46d2hlcmUoLm9wLW1lbnUgbGkpIC5vcC1iYWRnZSB7XG4gIGp1c3RpZnktc2VsZjogZW5kO1xufVxyXG4ub3AtbW9kYWwge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBpbnNldDogMHB4O1xuICBtYXJnaW46IDBweDtcbiAgZGlzcGxheTogZ3JpZDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXgtaGVpZ2h0OiBub25lO1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiBub25lO1xuICBqdXN0aWZ5LWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDBweDtcbiAgb3BhY2l0eTogMDtcbiAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjtcbiAgei1pbmRleDogOTk5O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eSwgdmlzaWJpbGl0eTtcbiAgb3ZlcmZsb3cteTogaGlkZGVuO1xufVxyXG46d2hlcmUoLm9wLW1vZGFsKSB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XHJcbi5vcC1tb2RhbC1ib3gge1xuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNWVtKTtcbiAgZ3JpZC1jb2x1bW4tc3RhcnQ6IDE7XG4gIGdyaWQtcm93LXN0YXJ0OiAxO1xuICB3aWR0aDogOTEuNjY2NjY3JTtcbiAgbWF4LXdpZHRoOiAzMnJlbTtcbiAgLS10dy1zY2FsZS14OiAuOTtcbiAgLS10dy1zY2FsZS15OiAuOTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBwYWRkaW5nOiAxLjVyZW07XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICBib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMjUpIDBweCAyNXB4IDUwcHggLTEycHg7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47XG59XHJcbi5vcC1tb2RhbC1vcGVuLFxuLm9wLW1vZGFsOnRhcmdldCxcbi5vcC1tb2RhbC10b2dnbGU6Y2hlY2tlZCArIC5vcC1tb2RhbCxcbi5vcC1tb2RhbFtvcGVuXSB7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICBvcGFjaXR5OiAxO1xufVxyXG4ub3AtbW9kYWwtYWN0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAgbWFyZ2luLXRvcDogMS41cmVtO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xufVxyXG46cm9vdDpoYXMoOmlzKC5vcC1tb2RhbC1vcGVuLCAub3AtbW9kYWw6dGFyZ2V0LCAub3AtbW9kYWwtdG9nZ2xlOmNoZWNrZWQgKyAub3AtbW9kYWwsIC5vcC1tb2RhbFtvcGVuXSkpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlO1xufVxyXG4ub3AtbmF2YmFyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogdmFyKC0tbmF2YmFyLXBhZGRpbmcsIDAuNXJlbSk7XG4gIG1pbi1oZWlnaHQ6IDRyZW07XG4gIHdpZHRoOiAxMDAlO1xufVxyXG46d2hlcmUoLm9wLW5hdmJhciA+ICo6bm90KHNjcmlwdCwgc3R5bGUpKSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxyXG4ub3AtcmFkaW8ge1xuICBmbGV4LXNocmluazogMDtcbiAgLS1jaGtiZzogdmFyKC0tYmMpO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgd2lkdGg6IDEuNXJlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLXNlbGVjdCB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICBoZWlnaHQ6IDNyZW07XG4gIG1pbi1oZWlnaHQ6IDNyZW07XG4gIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAxcmVtO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IDIuNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgdHJhbnNwYXJlbnQgNTAlLCBjdXJyZW50Q29sb3IgNTAlKSxcbiAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBjdXJyZW50Q29sb3IgNTAlLCB0cmFuc3BhcmVudCA1MCUpO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjYWxjKDEwMCUgLSAyMHB4KSBjYWxjKDFweCArIDUwJSksXG4gICAgY2FsYygxMDAlIC0gMTYuMXB4KSBjYWxjKDFweCArIDUwJSk7XG4gIGJhY2tncm91bmQtc2l6ZTogNHB4IDRweCxcbiAgICA0cHggNHB4O1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xufVxyXG4ub3Atc2VsZWN0W211bHRpcGxlXSB7XG4gIGhlaWdodDogYXV0bztcbn1cclxuLm9wLXRhYnMge1xuICBkaXNwbGF5OiBncmlkO1xuICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG59XHJcbi5vcC10YWJzLWxpZnRlZDpoYXMoLm9wLXRhYi1jb250ZW50W2NsYXNzXj1cIm9wLXJvdW5kZWQtXCJdKVxuICAgIC5vcC10YWI6Zmlyc3QtY2hpbGQ6bm90KDppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSksIC5vcC10YWJzLWxpZnRlZDpoYXMoLm9wLXRhYi1jb250ZW50W2NsYXNzKj1cIiBvcC1yb3VuZGVkLVwiXSlcbiAgICAub3AtdGFiOmZpcnN0LWNoaWxkOm5vdCg6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkpIHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XHJcbi5vcC10YWIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGdyaWQtcm93LXN0YXJ0OiAxO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgaGVpZ2h0OiAycmVtO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgLS10YWItcGFkZGluZzogMXJlbTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDAuNTtcbiAgLS10YWItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8xKSk7XG4gIC0tdGFiLWJnOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xuICAtLXRhYi1ib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS8xKSk7XG4gIGNvbG9yOiB2YXIoLS10YWItY29sb3IpO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0tdGFiLXBhZGRpbmcsIDFyZW0pO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKTtcbn1cclxuLm9wLXRhYjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl0pIHtcbiAgd2lkdGg6IGF1dG87XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDBweDtcbn1cclxuLm9wLXRhYjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl0pOmFmdGVyIHtcbiAgLS10dy1jb250ZW50OiBhdHRyKGFyaWEtbGFiZWwpO1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbn1cclxuLm9wLXRhYjpub3QoaW5wdXQpOmVtcHR5IHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBncmlkLWNvbHVtbi1zdGFydDogc3BhbiA5OTk5O1xufVxyXG46Y2hlY2tlZCArIC5vcC10YWItY29udGVudDpudGgtY2hpbGQoMiksXG4gIDppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSArIC5vcC10YWItY29udGVudDpudGgtY2hpbGQoMikge1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAwcHg7XG59XHJcbmlucHV0Lm9wLXRhYjpjaGVja2VkICsgLm9wLXRhYi1jb250ZW50LFxuOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pICsgLm9wLXRhYi1jb250ZW50IHtcbiAgZGlzcGxheTogYmxvY2s7XG59XHJcbi5vcC10YWJsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG59XHJcbi5vcC10YWJsZSA6d2hlcmUoLm9wLXRhYmxlLXBpbi1yb3dzIHRoZWFkIHRyKSB7XG4gIHBvc2l0aW9uOiAtd2Via2l0LXN0aWNreTtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgdG9wOiAwcHg7XG4gIHotaW5kZXg6IDE7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC10YWJsZSA6d2hlcmUoLm9wLXRhYmxlLXBpbi1yb3dzIHRmb290IHRyKSB7XG4gIHBvc2l0aW9uOiAtd2Via2l0LXN0aWNreTtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgYm90dG9tOiAwcHg7XG4gIHotaW5kZXg6IDE7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC10YWJsZSA6d2hlcmUoLm9wLXRhYmxlLXBpbi1jb2xzIHRyIHRoKSB7XG4gIHBvc2l0aW9uOiAtd2Via2l0LXN0aWNreTtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgbGVmdDogMHB4O1xuICByaWdodDogMHB4O1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGV4dGFyZWEge1xuICBtaW4taGVpZ2h0OiAzcmVtO1xuICBmbGV4LXNocmluazogMTtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRvZ2dsZSB7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICAtLXRnbGJnOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xuICAtLWhhbmRsZW9mZnNldDogMS41cmVtO1xuICAtLWhhbmRsZW9mZnNldGNhbGN1bGF0b3I6IGNhbGModmFyKC0taGFuZGxlb2Zmc2V0KSAqIC0xKTtcbiAgLS10b2dnbGVoYW5kbGVib3JkZXI6IDAgMDtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHdpZHRoOiAzcmVtO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJhZGdlLCAxLjlyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjUpKTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCxcbiAgICBib3gtc2hhZG93IHZhcigtLWFuaW1hdGlvbi1pbnB1dCwgMC4ycykgZWFzZS1vdXQ7XG4gIGJveC1zaGFkb3c6IHZhcigtLWhhbmRsZW9mZnNldGNhbGN1bGF0b3IpIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgIDAgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQsXG4gICAgdmFyKC0tdG9nZ2xlaGFuZGxlYm9yZGVyKTtcbn1cclxuLm9wLWFsZXJ0LWluZm8ge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS8wLjIpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbmMsb2tsY2godmFyKC0taW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tYWxlcnQtYmc6IHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS8xKSk7XG4gIC0tYWxlcnQtYmctbWl4OiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xufVxyXG4ub3AtYWxlcnQtc3VjY2VzcyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpLzAuMikpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1Yyxva2xjaCh2YXIoLS1zdWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS1hbGVydC1iZzogdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpLzEpKTtcbiAgLS1hbGVydC1iZy1taXg6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSk7XG59XHJcbi5vcC1hbGVydC13YXJuaW5nIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMC4yKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2std2FjLG9rbGNoKHZhcigtLXdhYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLWFsZXJ0LWJnOiB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMSkpO1xuICAtLWFsZXJ0LWJnLW1peDogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbn1cclxuLm9wLWFsZXJ0LWVycm9yIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMC4yKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stZXJjLG9rbGNoKHZhcigtLWVyYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLWFsZXJ0LWJnOiB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpO1xuICAtLWFsZXJ0LWJnLW1peDogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbn1cclxuLm9wLWJhZGdlLXByaW1hcnkge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1iYWRnZS1vdXRsaW5lLm9wLWJhZGdlLXByaW1hcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IG5vLXByZWZlcmVuY2UpIHtcblxuICAub3AtYnRuIHtcbiAgICBhbmltYXRpb246IGJ1dHRvbi1wb3AgdmFyKC0tYW5pbWF0aW9uLWJ0biwgMC4yNXMpIGVhc2Utb3V0O1xuICB9XG59XHJcbi5vcC1idG46YWN0aXZlOmhvdmVyLFxuICAub3AtYnRuOmFjdGl2ZTpmb2N1cyB7XG4gIGFuaW1hdGlvbjogYnV0dG9uLXBvcCAwcyBlYXNlLW91dDtcbiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1idG4tZm9jdXMtc2NhbGUsIDAuOTcpKTtcbn1cclxuQHN1cHBvcnRzIG5vdCAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAub3AtYnRuIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1idG4tY29sb3IsIHZhcigtLWZhbGxiYWNrLWIyKSk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idG4tY29sb3IsIHZhcigtLWZhbGxiYWNrLWIyKSk7XG4gIH1cblxuICAub3AtYnRuLXByaW1hcnkge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wKTtcbiAgfVxuXG4gIC5vcC1idG4tc2Vjb25kYXJ5IHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyk7XG4gIH1cblxuICAub3AtYnRuLWFjY2VudCB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWZhbGxiYWNrLWEpO1xuICB9XG5cbiAgLm9wLWJ0bi1uZXV0cmFsIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2stbik7XG4gIH1cblxuICAub3AtYnRuLWluZm8ge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbik7XG4gIH1cblxuICAub3AtYnRuLWVycm9yIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2stZXIpO1xuICB9XG59XHJcbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gIC5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoXG4gICAgICAgICAgaW4gb2tsYWIsXG4gICAgICAgICAgb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMykpIC8gdmFyKC0tdHctYmctb3BhY2l0eSwgMSkpIDkwJSxcbiAgICAgICAgICBibGFja1xuICAgICAgICApO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KFxuICAgICAgICAgIGluIG9rbGFiLFxuICAgICAgICAgIG9rbGNoKHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tYjMpKSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5LCAxKSkgOTAlLFxuICAgICAgICAgIGJsYWNrXG4gICAgICAgICk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnkub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS8xKSkgOTAlLCBibGFjayk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXNlY29uZGFyeS5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA5MCUsIGJsYWNrKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tYWNjZW50Lm9wLWJ0bi1hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDkwJSwgYmxhY2spO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zdWNjZXNzLm9wLWJ0bi1hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpLzEpKSA5MCUsIGJsYWNrKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4taW5mby5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS8xKSkgOTAlLCBibGFjayk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXdhcm5pbmcub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMSkpIDkwJSwgYmxhY2spO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1lcnJvci5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS8xKSkgOTAlLCBibGFjayk7XG4gIH1cbn1cclxuLm9wLWJ0bjpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWJ0bi1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKTtcbn1cclxuQHN1cHBvcnRzIChjb2xvcjogb2tsY2goMCUgMCAwKSkge1xuXG4gIC5vcC1idG4tcHJpbWFyeSB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLXApO1xuICB9XG5cbiAgLm9wLWJ0bi1zZWNvbmRhcnkge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1zKTtcbiAgfVxuXG4gIC5vcC1idG4tYWNjZW50IHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tYSk7XG4gIH1cblxuICAub3AtYnRuLW5ldXRyYWwge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1uKTtcbiAgfVxuXG4gIC5vcC1idG4taW5mbyB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWluKTtcbiAgfVxuXG4gIC5vcC1idG4tZXJyb3Ige1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1lcik7XG4gIH1cbn1cclxuLm9wLWJ0bi1zZWNvbmRhcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXNjLG9rbGNoKHZhcigtLXNjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvMSkpO1xufVxyXG4ub3AtYnRuLWFjY2VudCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYWMsb2tsY2godmFyKC0tYWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS8xKSk7XG59XHJcbi5vcC1idG4tbmV1dHJhbCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stbmMsb2tsY2godmFyKC0tbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS8xKSk7XG59XHJcbi5vcC1idG4taW5mbyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW5jLG9rbGNoKHZhcigtLWluYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpO1xufVxyXG4ub3AtYnRuLWVycm9yIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcmMsb2tsY2godmFyKC0tZXJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS8xKSk7XG59XHJcbi5vcC1idG4ub3AtZ2xhc3Mge1xuICAtLXR3LXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXNoYWRvdyk7XG4gIG91dGxpbmUtY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cclxuLm9wLWJ0bi5vcC1nbGFzcy5vcC1idG4tYWN0aXZlIHtcbiAgLS1nbGFzcy1vcGFjaXR5OiAyNSU7XG4gIC0tZ2xhc3MtYm9yZGVyLW9wYWNpdHk6IDE1JTtcbn1cclxuLm9wLWJ0bi1naG9zdCB7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgLS10dy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xuICBvdXRsaW5lLWNvbG9yOiBjdXJyZW50Q29sb3I7XG59XHJcbi5vcC1idG4tZ2hvc3Qub3AtYnRuLWFjdGl2ZSB7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLWJ0bi1saW5rLm9wLWJ0bi1hY3RpdmUge1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lIHtcbiAgYm9yZGVyLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMCAjMDAwMDtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnkub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcGMsb2tsY2godmFyKC0tcGMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zZWNvbmRhcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXNlY29uZGFyeS5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zYyxva2xjaCh2YXIoLS1zYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tYWNjZW50Lm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWFjLG9rbGNoKHZhcigtLWFjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tc3VjY2VzcyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zdWNjZXNzLm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1Yyxva2xjaCh2YXIoLS1zdWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1pbmZvIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWluZm8ub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW5jLG9rbGNoKHZhcigtLWluYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXdhcm5pbmcge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhLG9rbGNoKHZhcigtLXdhKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4td2FybmluZy5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay13YWMsb2tsY2godmFyKC0td2FjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3Ige1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3Iub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stZXJjLG9rbGNoKHZhcigtLWVyYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLm9wLWJ0bi1kaXNhYmxlZCxcbiAgLm9wLWJ0bltkaXNhYmxlZF0sXG4gIC5vcC1idG46ZGlzYWJsZWQge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMC4yO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCksXG4ub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJyYWRpb1wiXTpjaGVja2VkKSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcGMsb2tsY2godmFyKC0tcGMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCk6Zm9jdXMtdmlzaWJsZSwgLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl06Y2hlY2tlZCk6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpO1xufVxyXG5Aa2V5ZnJhbWVzIGJ1dHRvbi1wb3Age1xuXG4gIDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWJ0bi1mb2N1cy1zY2FsZSwgMC45OCkpO1xuICB9XG5cbiAgNDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMDIpO1xuICB9XG5cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgfVxufVxyXG4ub3AtY2FyZCA6d2hlcmUoZmlndXJlOmZpcnN0LWNoaWxkKSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogdW5zZXQ7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogdW5zZXQ7XG59XHJcbi5vcC1jYXJkIDp3aGVyZShmaWd1cmU6bGFzdC1jaGlsZCkge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiB1bnNldDtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IHVuc2V0O1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG4ub3AtY2FyZDpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWNhcmQub3AtYm9yZGVyZWQge1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcbi5vcC1jYXJkLm9wLWNvbXBhY3QgLm9wLWNhcmQtYm9keSB7XG4gIHBhZGRpbmc6IDFyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xufVxyXG4ub3AtY2FyZC10aXRsZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC41cmVtO1xuICBmb250LXNpemU6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjc1cmVtO1xuICBmb250LXdlaWdodDogNjAwO1xufVxyXG4ub3AtY2FyZC5vcC1pbWFnZS1mdWxsIDp3aGVyZShmaWd1cmUpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWNoZWNrYm94OmZvY3VzIHtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cclxuLm9wLWNoZWNrYm94OmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpO1xufVxyXG4ub3AtY2hlY2tib3g6ZGlzYWJsZWQge1xuICBib3JkZXItd2lkdGg6IDBweDtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtY2hlY2tib3g6Y2hlY2tlZCxcbiAgLm9wLWNoZWNrYm94W2FyaWEtY2hlY2tlZD1cInRydWVcIl0ge1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBhbmltYXRpb246IGNoZWNrbWFyayB2YXIoLS1hbmltYXRpb24taW5wdXQsIDAuMnMpIGVhc2Utb3V0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jaGtiZyk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCgtNDVkZWcsIHRyYW5zcGFyZW50IDY1JSwgdmFyKC0tY2hrYmcpIDY1Ljk5JSksXG4gICAgICBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHRyYW5zcGFyZW50IDc1JSwgdmFyKC0tY2hrYmcpIDc1Ljk5JSksXG4gICAgICBsaW5lYXItZ3JhZGllbnQoLTQ1ZGVnLCB2YXIoLS1jaGtiZykgNDAlLCB0cmFuc3BhcmVudCA0MC45OSUpLFxuICAgICAgbGluZWFyLWdyYWRpZW50KFxuICAgICAgICA0NWRlZyxcbiAgICAgICAgdmFyKC0tY2hrYmcpIDMwJSxcbiAgICAgICAgdmFyKC0tY2hrZmcpIDMwLjk5JSxcbiAgICAgICAgdmFyKC0tY2hrZmcpIDQwJSxcbiAgICAgICAgdHJhbnNwYXJlbnQgNDAuOTklXG4gICAgICApLFxuICAgICAgbGluZWFyLWdyYWRpZW50KC00NWRlZywgdmFyKC0tY2hrZmcpIDUwJSwgdmFyKC0tY2hrYmcpIDUwLjk5JSk7XG59XHJcbi5vcC1jaGVja2JveDppbmRldGVybWluYXRlIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYW5pbWF0aW9uOiBjaGVja21hcmsgdmFyKC0tYW5pbWF0aW9uLWlucHV0LCAwLjJzKSBlYXNlLW91dDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCA4MCUsIHZhcigtLWNoa2JnKSA4MCUpLFxuICAgICAgbGluZWFyLWdyYWRpZW50KC05MGRlZywgdHJhbnNwYXJlbnQgODAlLCB2YXIoLS1jaGtiZykgODAlKSxcbiAgICAgIGxpbmVhci1ncmFkaWVudCgwZGVnLCB2YXIoLS1jaGtiZykgNDMlLCB2YXIoLS1jaGtmZykgNDMlLCB2YXIoLS1jaGtmZykgNTclLCB2YXIoLS1jaGtiZykgNTclKTtcbn1cclxuQGtleWZyYW1lcyBjaGVja21hcmsge1xuXG4gIDAlIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uLXk6IDVweDtcbiAgfVxuXG4gIDUwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbi15OiAtMnB4O1xuICB9XG5cbiAgMTAwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbi15OiAwO1xuICB9XG59XHJcbi5vcC1kaXZpZGVyOm5vdCg6ZW1wdHkpIHtcbiAgZ2FwOiAxcmVtO1xufVxyXG4ub3AtZHJvcGRvd24ub3AtZHJvcGRvd24tb3BlbiAub3AtZHJvcGRvd24tY29udGVudCxcbi5vcC1kcm9wZG93bjpmb2N1cyAub3AtZHJvcGRvd24tY29udGVudCxcbi5vcC1kcm9wZG93bjpmb2N1cy13aXRoaW4gLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICAtLXR3LXNjYWxlLXg6IDE7XG4gIC0tdHctc2NhbGUteTogMTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcbi5vcC1maWxlLWlucHV0LWJvcmRlcmVkIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtZmlsZS1pbnB1dDpmb2N1cyB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLWZpbGUtaW5wdXQtZGlzYWJsZWQsXG4gIC5vcC1maWxlLWlucHV0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtZmlsZS1pbnB1dC1kaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC1maWxlLWlucHV0W2Rpc2FibGVkXTo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtZmlsZS1pbnB1dC1kaXNhYmxlZDo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24sIC5vcC1maWxlLWlucHV0W2Rpc2FibGVkXTo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMC4yO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWZpbGUtaW5wdXQtZGlzYWJsZWQ6OmZpbGUtc2VsZWN0b3ItYnV0dG9uLCAub3AtZmlsZS1pbnB1dFtkaXNhYmxlZF06OmZpbGUtc2VsZWN0b3ItYnV0dG9uIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuMjtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1pbnB1dCBpbnB1dCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cclxuLm9wLWlucHV0IGlucHV0OmZvY3VzIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3AtaW5wdXRbbGlzdF06Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvciB7XG4gIGxpbmUtaGVpZ2h0OiAxZW07XG59XHJcbi5vcC1pbnB1dC1ib3JkZXJlZCB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3AtaW5wdXQ6Zm9jdXMsXG4gIC5vcC1pbnB1dDpmb2N1cy13aXRoaW4ge1xuICBib3gtc2hhZG93OiBub25lO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3AtaW5wdXQ6aGFzKD4gaW5wdXRbZGlzYWJsZWRdKSxcbiAgLm9wLWlucHV0LWRpc2FibGVkLFxuICAub3AtaW5wdXQ6ZGlzYWJsZWQsXG4gIC5vcC1pbnB1dFtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjQpKTtcbn1cclxuLm9wLWlucHV0Omhhcyg+IGlucHV0W2Rpc2FibGVkXSk6OnBsYWNlaG9sZGVyLFxuICAub3AtaW5wdXQtZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3AtaW5wdXQ6ZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3AtaW5wdXRbZGlzYWJsZWRdOjpwbGFjZWhvbGRlciB7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1pbnB1dDpoYXMoPiBpbnB1dFtkaXNhYmxlZF0pID4gaW5wdXRbZGlzYWJsZWRdIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cclxuLm9wLWlucHV0Ojotd2Via2l0LWRhdGUtYW5kLXRpbWUtdmFsdWUge1xuICB0ZXh0LWFsaWduOiBpbmhlcml0O1xufVxyXG4ub3Atam9pbiA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKSB7XG4gIG1hcmdpbi10b3A6IDBweDtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiAtMXB4O1xufVxyXG4ub3Atam9pbiA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKTppcygub3AtYnRuKSB7XG4gIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IGNhbGModmFyKC0tYm9yZGVyLWJ0bikgKiAtMSk7XG59XHJcbi5vcC1qb2luLWl0ZW06Zm9jdXMge1xuICBpc29sYXRpb246IGlzb2xhdGU7XG59XHJcbi5vcC1saW5rLXByaW1hcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBva2xhYixibGFjayxibGFjaykpIHtcblxuICBAbWVkaWEgKGhvdmVyOmhvdmVyKSB7XG5cbiAgICAub3AtbGluay1wcmltYXJ5OmhvdmVyIHtcbiAgICAgIGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS8xKSkgODAlLGJsYWNrKTtcbiAgICB9XG5cbiAgICAub3AtbGluay1zZWNvbmRhcnk6aG92ZXIge1xuICAgICAgY29sb3I6IGNvbG9yLW1peChpbiBva2xhYix2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA4MCUsYmxhY2spO1xuICAgIH1cblxuICAgIC5vcC1saW5rLWFjY2VudDpob3ZlciB7XG4gICAgICBjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDgwJSxibGFjayk7XG4gICAgfVxuICB9XG59XHJcbi5vcC1saW5rLXNlY29uZGFyeSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1saW5rLWFjY2VudCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1saW5rOmZvY3VzIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3AtbGluazpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWxvYWRpbmcge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBhc3BlY3QtcmF0aW86IDEgLyAxO1xuICB3aWR0aDogMS41cmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIC13ZWJraXQtbWFzay1zaXplOiAxMDAlO1xuICAgICAgICAgIG1hc2stc2l6ZTogMTAwJTtcbiAgLXdlYmtpdC1tYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICAgIG1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gIC13ZWJraXQtbWFzay1wb3NpdGlvbjogY2VudGVyO1xuICAgICAgICAgIG1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19ffSk7XG4gICAgICAgICAgbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xufVxyXG4ub3AtbG9hZGluZy1pbmZpbml0eSB7XG4gIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xuICAgICAgICAgIG1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX199KTtcbn1cclxuOndoZXJlKC5vcC1tZW51IGxpOmVtcHR5KSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuMTtcbiAgbWFyZ2luOiAwLjVyZW0gMXJlbTtcbiAgaGVpZ2h0OiAxcHg7XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaSB1bCk6YmVmb3JlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDAuNzVyZW07XG4gIGluc2V0LWlubGluZS1zdGFydDogMHB4O1xuICB0b3A6IDAuNzVyZW07XG4gIHdpZHRoOiAxcHg7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuMTtcbiAgY29udGVudDogXCJcIjtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUsIC5vcC1idG4pKSxcbi5vcC1tZW51IDp3aGVyZShsaTpub3QoLm9wLW1lbnUtdGl0bGUpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSkge1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xuICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMjAwbXM7XG4gIHRleHQtd3JhcDogYmFsYW5jZTtcbn1cclxuOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSkpOm5vdChzdW1tYXJ5LCAub3AtYWN0aXZlLCAub3AtYnRuKS5vcC1mb2N1cywgOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSkpOm5vdChzdW1tYXJ5LCAub3AtYWN0aXZlLCAub3AtYnRuKTpmb2N1cywgOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSkpOmlzKHN1bW1hcnkpOm5vdCgub3AtYWN0aXZlLCAub3AtYnRuKTpmb2N1cy12aXNpYmxlLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KHN1bW1hcnksIC5vcC1hY3RpdmUsIC5vcC1idG4pLm9wLWZvY3VzLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KHN1bW1hcnksIC5vcC1hY3RpdmUsIC5vcC1idG4pOmZvY3VzLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6aXMoc3VtbWFyeSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmZvY3VzLXZpc2libGUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjEpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1tZW51IGxpID4gKjpub3QodWwsIC5vcC1tZW51LXRpdGxlLCBkZXRhaWxzLCAub3AtYnRuKTphY3RpdmUsXG4ub3AtbWVudSBsaSA+ICo6bm90KHVsLCAub3AtbWVudS10aXRsZSwgZGV0YWlscywgLm9wLWJ0bikub3AtYWN0aXZlLFxuLm9wLW1lbnUgbGkgPiBkZXRhaWxzID4gc3VtbWFyeTphY3RpdmUge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1uYyxva2xjaCh2YXIoLS1uYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGkgPiBkZXRhaWxzID4gc3VtbWFyeSk6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuICBkaXNwbGF5OiBub25lO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGkgPiBkZXRhaWxzID4gc3VtbWFyeSk6YWZ0ZXIsXG4ub3AtbWVudSA6d2hlcmUobGkgPiAub3AtbWVudS1kcm9wZG93bi10b2dnbGUpOmFmdGVyIHtcbiAganVzdGlmeS1zZWxmOiBlbmQ7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tdG9wOiAtMC41cmVtO1xuICBoZWlnaHQ6IDAuNXJlbTtcbiAgd2lkdGg6IDAuNXJlbTtcbiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG1hcmdpbi10b3A7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICBjb250ZW50OiBcIlwiO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiA3NSUgNzUlO1xuICBib3gtc2hhZG93OiAycHggMnB4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpID4gZGV0YWlsc1tvcGVuXSA+IHN1bW1hcnkpOmFmdGVyLFxuLm9wLW1lbnUgOndoZXJlKGxpID4gLm9wLW1lbnUtZHJvcGRvd24tdG9nZ2xlLm9wLW1lbnUtZHJvcGRvd24tc2hvdyk6YWZ0ZXIge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgyMjVkZWcpO1xuICBtYXJnaW4tdG9wOiAwO1xufVxyXG4ub3AtbW9ja3VwLWJyb3dzZXIgLm9wLW1vY2t1cC1icm93c2VyLXRvb2xiYXIgLm9wLWlucHV0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiAxLjc1cmVtO1xuICB3aWR0aDogMjRyZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBwYWRkaW5nLWxlZnQ6IDJyZW07XG4gIGRpcmVjdGlvbjogbHRyO1xufVxyXG4ub3AtbW9ja3VwLWJyb3dzZXIgLm9wLW1vY2t1cC1icm93c2VyLXRvb2xiYXIgLm9wLWlucHV0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMC41cmVtO1xuICB0b3A6IDUwJTtcbiAgYXNwZWN0LXJhdGlvOiAxIC8gMTtcbiAgaGVpZ2h0OiAwLjc1cmVtO1xuICAtLXR3LXRyYW5zbGF0ZS15OiAtNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBib3JkZXItd2lkdGg6IDJweDtcbiAgYm9yZGVyLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIG9wYWNpdHk6IDAuNjtcbn1cclxuLm9wLW1vY2t1cC1icm93c2VyIC5vcC1tb2NrdXAtYnJvd3Nlci10b29sYmFyIC5vcC1pbnB1dDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMS4yNXJlbTtcbiAgdG9wOiA1MCU7XG4gIGhlaWdodDogMC41cmVtO1xuICAtLXR3LXRyYW5zbGF0ZS15OiAyNSU7XG4gIC0tdHctcm90YXRlOiAtNDVkZWc7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgb3BhY2l0eTogMC42O1xufVxyXG4ub3AtbW9kYWw6bm90KGRpYWxvZzpub3QoLm9wLW1vZGFsLW9wZW4pKSxcbiAgLm9wLW1vZGFsOjpiYWNrZHJvcCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA2O1xuICBhbmltYXRpb246IG1vZGFsLXBvcCAwLjJzIGVhc2Utb3V0O1xufVxyXG4ub3AtbW9kYWwtb3BlbiAub3AtbW9kYWwtYm94LFxuLm9wLW1vZGFsLXRvZ2dsZTpjaGVja2VkICsgLm9wLW1vZGFsIC5vcC1tb2RhbC1ib3gsXG4ub3AtbW9kYWw6dGFyZ2V0IC5vcC1tb2RhbC1ib3gsXG4ub3AtbW9kYWxbb3Blbl0gLm9wLW1vZGFsLWJveCB7XG4gIC0tdHctdHJhbnNsYXRlLXk6IDBweDtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4ub3AtbW9kYWwtYWN0aW9uID4gOm5vdChbaGlkZGVuXSkgfiA6bm90KFtoaWRkZW5dKSB7XG4gIC0tdHctc3BhY2UteC1yZXZlcnNlOiAwO1xuICBtYXJnaW4tcmlnaHQ6IGNhbGMoMC41cmVtICogdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSk7XG4gIG1hcmdpbi1sZWZ0OiBjYWxjKDAuNXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpKTtcbn1cclxuQGtleWZyYW1lcyBtb2RhbC1wb3Age1xuXG4gIDAlIHtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG59XHJcbkBrZXlmcmFtZXMgcHJvZ3Jlc3MtbG9hZGluZyB7XG5cbiAgNTAlIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uLXg6IC0xMTUlO1xuICB9XG59XHJcbi5vcC1yYWRpbzpmb2N1cyB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XHJcbi5vcC1yYWRpbzpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbn1cclxuLm9wLXJhZGlvOmNoZWNrZWQsXG4gIC5vcC1yYWRpb1thcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgYW5pbWF0aW9uOiByYWRpb21hcmsgdmFyKC0tYW5pbWF0aW9uLWlucHV0LCAwLjJzKSBlYXNlLW91dDtcbiAgYm94LXNoYWRvdzogMCAwIDAgNHB4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQsXG4gICAgICAwIDAgMCA0cHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldDtcbn1cclxuLm9wLXJhZGlvOmRpc2FibGVkIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgb3BhY2l0eTogMC4yO1xufVxyXG5Aa2V5ZnJhbWVzIHJhZGlvbWFyayB7XG5cbiAgMCUge1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDEycHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldCxcbiAgICAgIDAgMCAwIDEycHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldDtcbiAgfVxuXG4gIDUwJSB7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQsXG4gICAgICAwIDAgMCAzcHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldDtcbiAgfVxuXG4gIDEwMCUge1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDRweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0LFxuICAgICAgMCAwIDAgNHB4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQ7XG4gIH1cbn1cclxuQGtleWZyYW1lcyByYXRpbmctcG9wIHtcblxuICAwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0wLjEyNWVtKTtcbiAgfVxuXG4gIDQwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0wLjEyNWVtKTtcbiAgfVxuXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgfVxufVxyXG4ub3Atc2VsZWN0LWJvcmRlcmVkIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC1zZWxlY3Q6Zm9jdXMge1xuICBib3gtc2hhZG93OiBub25lO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3Atc2VsZWN0LWRpc2FibGVkLFxuICAub3Atc2VsZWN0OmRpc2FibGVkLFxuICAub3Atc2VsZWN0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuNCkpO1xufVxyXG4ub3Atc2VsZWN0LWRpc2FibGVkOjpwbGFjZWhvbGRlcixcbiAgLm9wLXNlbGVjdDpkaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC1zZWxlY3RbZGlzYWJsZWRdOjpwbGFjZWhvbGRlciB7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1zZWxlY3QtbXVsdGlwbGUsXG4gIC5vcC1zZWxlY3RbbXVsdGlwbGVdLFxuICAub3Atc2VsZWN0W3NpemVdLm9wLXNlbGVjdDpub3QoW3NpemU9XCIxXCJdKSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIHBhZGRpbmctcmlnaHQ6IDFyZW07XG59XHJcbltkaXI9XCJydGxcIl0gLm9wLXNlbGVjdCB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNhbGMoMCUgKyAxMnB4KSBjYWxjKDFweCArIDUwJSksXG4gICAgY2FsYygwJSArIDE2cHgpIGNhbGMoMXB4ICsgNTAlKTtcbn1cclxuQGtleWZyYW1lcyBza2VsZXRvbiB7XG5cbiAgZnJvbSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTUwJTtcbiAgfVxuXG4gIHRvIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTAlO1xuICB9XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6Zm9jdXMtdmlzaWJsZSB7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IDA7XG59XHJcbi5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKSwgLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKSB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbn1cclxuLm9wLXRhYjpmb2N1cyB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLXRhYjpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgb3V0bGluZS1vZmZzZXQ6IC01cHg7XG59XHJcbi5vcC10YWItZGlzYWJsZWQsXG4gIC5vcC10YWJbZGlzYWJsZWRdIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC10YWJzLWJvcmRlcmVkID4gLm9wLXRhYiB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwLjI7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGModmFyKC0tdGFiLWJvcmRlciwgMXB4KSArIDFweCk7XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWIge1xuICBib3JkZXI6IHZhcigtLXRhYi1ib3JkZXIsIDFweCkgc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci13aWR0aDogMCAwIHZhcigtLXRhYi1ib3JkZXIsIDFweCkgMDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogdmFyKC0tdGFiLXJhZGl1cywgMC41cmVtKTtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IHZhcigtLXRhYi1yYWRpdXMsIDAuNXJlbSk7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0tdGFiLXBhZGRpbmcsIDFyZW0pO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKTtcbiAgcGFkZGluZy10b3A6IHZhcigtLXRhYi1ib3JkZXIsIDFweCk7XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKSwgLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRhYi1iZyk7XG4gIGJvcmRlci13aWR0aDogdmFyKC0tdGFiLWJvcmRlciwgMXB4KSB2YXIoLS10YWItYm9yZGVyLCAxcHgpIDAgdmFyKC0tdGFiLWJvcmRlciwgMXB4KTtcbiAgYm9yZGVyLWlubGluZS1zdGFydC1jb2xvcjogdmFyKC0tdGFiLWJvcmRlci1jb2xvcik7XG4gIGJvcmRlci1pbmxpbmUtZW5kLWNvbG9yOiB2YXIoLS10YWItYm9yZGVyLWNvbG9yKTtcbiAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tdGFiLWJvcmRlci1jb2xvcik7XG4gIHBhZGRpbmctaW5saW5lLXN0YXJ0OiBjYWxjKHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKSAtIHZhcigtLXRhYi1ib3JkZXIsIDFweCkpO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IGNhbGModmFyKC0tdGFiLXBhZGRpbmcsIDFyZW0pIC0gdmFyKC0tdGFiLWJvcmRlciwgMXB4KSk7XG4gIHBhZGRpbmctYm90dG9tOiB2YXIoLS10YWItYm9yZGVyLCAxcHgpO1xuICBwYWRkaW5nLXRvcDogMDtcbn1cclxuLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmJlZm9yZSwgLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKTpiZWZvcmUge1xuICB6LWluZGV4OiAxO1xuICBjb250ZW50OiBcIlwiO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogY2FsYygxMDAlICsgdmFyKC0tdGFiLXJhZGl1cywgMC41cmVtKSAqIDIpO1xuICBoZWlnaHQ6IHZhcigtLXRhYi1yYWRpdXMsIDAuNXJlbSk7XG4gIGJvdHRvbTogMDtcbiAgYmFja2dyb3VuZC1zaXplOiB2YXIoLS10YWItcmFkaXVzLCAwLjVyZW0pO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdCxcbiAgICAgICAgdG9wIHJpZ2h0O1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAtLXRhYi1ncmFkOiBjYWxjKDY5JSAtIHZhcigtLXRhYi1ib3JkZXIsIDFweCkpO1xuICAtLXJhZGl1cy1zdGFydDogcmFkaWFsLWdyYWRpZW50KFxuICAgICAgICBjaXJjbGUgYXQgdG9wIGxlZnQsXG4gICAgICAgIHRyYW5zcGFyZW50IHZhcigtLXRhYi1ncmFkKSxcbiAgICAgICAgdmFyKC0tdGFiLWJvcmRlci1jb2xvcikgY2FsYyh2YXIoLS10YWItZ3JhZCkgKyAwLjI1cHgpLFxuICAgICAgICB2YXIoLS10YWItYm9yZGVyLWNvbG9yKSBjYWxjKHZhcigtLXRhYi1ncmFkKSArIHZhcigtLXRhYi1ib3JkZXIsIDFweCkpLFxuICAgICAgICB2YXIoLS10YWItYmcpIGNhbGModmFyKC0tdGFiLWdyYWQpICsgdmFyKC0tdGFiLWJvcmRlciwgMXB4KSArIDAuMjVweClcbiAgICAgICk7XG4gIC0tcmFkaXVzLWVuZDogcmFkaWFsLWdyYWRpZW50KFxuICAgICAgICBjaXJjbGUgYXQgdG9wIHJpZ2h0LFxuICAgICAgICB0cmFuc3BhcmVudCB2YXIoLS10YWItZ3JhZCksXG4gICAgICAgIHZhcigtLXRhYi1ib3JkZXItY29sb3IpIGNhbGModmFyKC0tdGFiLWdyYWQpICsgMC4yNXB4KSxcbiAgICAgICAgdmFyKC0tdGFiLWJvcmRlci1jb2xvcikgY2FsYyh2YXIoLS10YWItZ3JhZCkgKyB2YXIoLS10YWItYm9yZGVyLCAxcHgpKSxcbiAgICAgICAgdmFyKC0tdGFiLWJnKSBjYWxjKHZhcigtLXRhYi1ncmFkKSArIHZhcigtLXRhYi1ib3JkZXIsIDFweCkgKyAwLjI1cHgpXG4gICAgICApO1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yYWRpdXMtc3RhcnQpLCB2YXIoLS1yYWRpdXMtZW5kKTtcbn1cclxuLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmZpcnN0LWNoaWxkOmJlZm9yZSwgLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKTpmaXJzdC1jaGlsZDpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yYWRpdXMtZW5kKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIHJpZ2h0O1xufVxyXG5bZGlyPVwicnRsXCJdIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpmaXJzdC1jaGlsZDpiZWZvcmUsIFtkaXI9XCJydGxcIl0gLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKTpmaXJzdC1jaGlsZDpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yYWRpdXMtc3RhcnQpO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDtcbn1cclxuLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmxhc3QtY2hpbGQ6YmVmb3JlLCAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpOmxhc3QtY2hpbGQ6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLXN0YXJ0KTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIGxlZnQ7XG59XHJcbltkaXI9XCJydGxcIl0gLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmxhc3QtY2hpbGQ6YmVmb3JlLCBbZGlyPVwicnRsXCJdIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCk6bGFzdC1jaGlsZDpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yYWRpdXMtZW5kKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIHJpZ2h0O1xufVxyXG4ub3AtdGFicy1saWZ0ZWRcbiAgPiA6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKVxuICArIC5vcC10YWJzLWxpZnRlZFxuICA6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpiZWZvcmUsIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCkgKyAub3AtdGFicy1saWZ0ZWQgLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKTpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yYWRpdXMtZW5kKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIHJpZ2h0O1xufVxyXG4ub3AtdGFicy1ib3hlZCB7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBwYWRkaW5nOiAwLjI1cmVtO1xufVxyXG4ub3AtdGFicy1ib3hlZCAub3AtdGFiIHtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG59XHJcbi5vcC10YWJzLWJveGVkIDppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pLCAub3AtdGFicy1ib3hlZCA6aXMoaW5wdXQ6Y2hlY2tlZCkge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGFibGU6d2hlcmUoW2Rpcj1cInJ0bFwiXSwgW2Rpcj1cInJ0bFwiXSAqKSB7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxyXG4ub3AtdGFibGUgOndoZXJlKHRoLCB0ZCkge1xuICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDFyZW07XG4gIHBhZGRpbmctdG9wOiAwLjc1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC43NXJlbTtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cclxuLm9wLXRhYmxlIHRyLm9wLWFjdGl2ZSxcbiAgLm9wLXRhYmxlIHRyLm9wLWFjdGl2ZTpudGgtY2hpbGQoZXZlbiksXG4gIC5vcC10YWJsZS16ZWJyYSB0Ym9keSB0cjpudGgtY2hpbGQoZXZlbikge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKHRoZWFkIHRyLCB0Ym9keSB0cjpub3QoOmxhc3QtY2hpbGQpLCB0Ym9keSB0cjpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkKSB7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDFweDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKHRoZWFkLCB0Zm9vdCkge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxcmVtO1xuICBmb250LXdlaWdodDogNzAwO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuNikpO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKHRmb290KSB7XG4gIGJvcmRlci10b3Atd2lkdGg6IDFweDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGV4dGFyZWEtYm9yZGVyZWQge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLXRleHRhcmVhOmZvY3VzIHtcbiAgYm94LXNoYWRvdzogbm9uZTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLXRleHRhcmVhLWRpc2FibGVkLFxuICAub3AtdGV4dGFyZWE6ZGlzYWJsZWQsXG4gIC5vcC10ZXh0YXJlYVtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjQpKTtcbn1cclxuLm9wLXRleHRhcmVhLWRpc2FibGVkOjpwbGFjZWhvbGRlcixcbiAgLm9wLXRleHRhcmVhOmRpc2FibGVkOjpwbGFjZWhvbGRlcixcbiAgLm9wLXRleHRhcmVhW2Rpc2FibGVkXTo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eTogMC4yO1xufVxyXG5Aa2V5ZnJhbWVzIHRvYXN0LXBvcCB7XG5cbiAgMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC45KTtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG5cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XHJcbltkaXI9XCJydGxcIl0gLm9wLXRvZ2dsZSB7XG4gIC0taGFuZGxlb2Zmc2V0Y2FsY3VsYXRvcjogY2FsYyh2YXIoLS1oYW5kbGVvZmZzZXQpICogMSk7XG59XHJcbi5vcC10b2dnbGU6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLXRvZ2dsZTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cclxuLm9wLXRvZ2dsZTpjaGVja2VkLFxuICAub3AtdG9nZ2xlW2FyaWEtY2hlY2tlZD1cInRydWVcIl0ge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAtLWhhbmRsZW9mZnNldGNhbGN1bGF0b3I6IHZhcigtLWhhbmRsZW9mZnNldCk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuW2Rpcj1cInJ0bFwiXSAub3AtdG9nZ2xlOmNoZWNrZWQsIFtkaXI9XCJydGxcIl0gLm9wLXRvZ2dsZVthcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdIHtcbiAgLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yOiBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgKiAtMSk7XG59XHJcbi5vcC10b2dnbGU6aW5kZXRlcm1pbmF0ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgYm94LXNoYWRvdzogY2FsYyh2YXIoLS1oYW5kbGVvZmZzZXQpIC8gMikgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQsXG4gICAgICBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgLyAtMikgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQsXG4gICAgICAwIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0O1xufVxyXG5bZGlyPVwicnRsXCJdIC5vcC10b2dnbGU6aW5kZXRlcm1pbmF0ZSB7XG4gIGJveC1zaGFkb3c6IGNhbGModmFyKC0taGFuZGxlb2Zmc2V0KSAvIDIpIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgICAgICBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgLyAtMikgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQsXG4gICAgICAgIDAgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQ7XG59XHJcbi5vcC10b2dnbGUtc2Vjb25kYXJ5OmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKTtcbn1cclxuLm9wLXRvZ2dsZS1zZWNvbmRhcnk6Y2hlY2tlZCxcbiAgICAub3AtdG9nZ2xlLXNlY29uZGFyeVthcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwLjE7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXNjLG9rbGNoKHZhcigtLXNjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC10b2dnbGU6ZGlzYWJsZWQge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIG9wYWNpdHk6IDAuMztcbiAgLS10b2dnbGVoYW5kbGVib3JkZXI6IDAgMCAwIDNweCB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpIGluc2V0LFxuICAgICAgdmFyKC0taGFuZGxlb2Zmc2V0Y2FsY3VsYXRvcikgMCAwIDNweCB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpIGluc2V0O1xufVxyXG4ubm8tYW5pbWF0aW9uIHtcbiAgLS1idG4tZm9jdXMtc2NhbGU6IDE7XG4gIC0tYW5pbWF0aW9uLWJ0bjogMDtcbiAgLS1hbmltYXRpb24taW5wdXQ6IDA7XG59XHJcbi5vcC1idG4teHMge1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgbWluLWhlaWdodDogMS41cmVtO1xuICBwYWRkaW5nLWxlZnQ6IDAuNXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC41cmVtO1xuICBmb250LXNpemU6IDAuNzVyZW07XG59XHJcbi5vcC1idG4tc20ge1xuICBoZWlnaHQ6IDJyZW07XG4gIG1pbi1oZWlnaHQ6IDJyZW07XG4gIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbn1cclxuLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm9wLWJ0bi14cykge1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgd2lkdGg6IDEuNXJlbTtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLXNxdWFyZTp3aGVyZSgub3AtYnRuLXNtKSB7XG4gIGhlaWdodDogMnJlbTtcbiAgd2lkdGg6IDJyZW07XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm9wLWJ0bi1tZCkge1xuICBoZWlnaHQ6IDNyZW07XG4gIHdpZHRoOiAzcmVtO1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tc3F1YXJlOndoZXJlKC5vcC1idG4tbGcpIHtcbiAgaGVpZ2h0OiA0cmVtO1xuICB3aWR0aDogNHJlbTtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLWNpcmNsZTp3aGVyZSgub3AtYnRuLXhzKSB7XG4gIGhlaWdodDogMS41cmVtO1xuICB3aWR0aDogMS41cmVtO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm9wLWJ0bi1zbSkge1xuICBoZWlnaHQ6IDJyZW07XG4gIHdpZHRoOiAycmVtO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm9wLWJ0bi1tZCkge1xuICBoZWlnaHQ6IDNyZW07XG4gIHdpZHRoOiAzcmVtO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm9wLWJ0bi1sZykge1xuICBoZWlnaHQ6IDRyZW07XG4gIHdpZHRoOiA0cmVtO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuW3R5cGU9XCJjaGVja2JveFwiXS5vcC1jaGVja2JveC14cyB7XG4gIGhlaWdodDogMXJlbTtcbiAgd2lkdGg6IDFyZW07XG59XHJcblt0eXBlPVwiY2hlY2tib3hcIl0ub3AtY2hlY2tib3gtc20ge1xuICBoZWlnaHQ6IDEuMjVyZW07XG4gIHdpZHRoOiAxLjI1cmVtO1xufVxyXG4ub3AtZmlsZS1pbnB1dC1zbSB7XG4gIGhlaWdodDogMnJlbTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiAwLjc1cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG59XHJcbi5vcC1maWxlLWlucHV0LXNtOjotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XG4gIG1hcmdpbi1yaWdodDogMC43NXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbn1cclxuLm9wLWZpbGUtaW5wdXQtc206OmZpbGUtc2VsZWN0b3ItYnV0dG9uIHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjc1cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xufVxyXG4ub3AtaW5wdXQteHMge1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwLjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNXJlbTtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xuICBsaW5lLWhlaWdodDogMXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNjI1O1xufVxyXG4ub3AtaW5wdXQtc20ge1xuICBoZWlnaHQ6IDJyZW07XG4gIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDJyZW07XG59XHJcbi5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwge1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxyXG4ub3Atam9pbi5vcC1qb2luLXZlcnRpY2FsIC5vcC1qb2luLWl0ZW06Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSxcbiAgLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCAqOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG4ub3Atam9pbi5vcC1qb2luLXZlcnRpY2FsIC5vcC1qb2luLWl0ZW06bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSxcbiAgLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCAqOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG4ub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwge1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xufVxyXG4ub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwgLm9wLWpvaW4taXRlbTpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpLFxuICAub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwgKjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsIC5vcC1qb2luLWl0ZW06bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSxcbiAgLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsICo6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcblt0eXBlPVwicmFkaW9cIl0ub3AtcmFkaW8teHMge1xuICBoZWlnaHQ6IDFyZW07XG4gIHdpZHRoOiAxcmVtO1xufVxyXG4ub3Atc2VsZWN0LXNtIHtcbiAgaGVpZ2h0OiAycmVtO1xuICBtaW4taGVpZ2h0OiAycmVtO1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDJyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAycmVtO1xufVxyXG5bZGlyPVwicnRsXCJdIC5vcC1zZWxlY3Qtc20ge1xuICBwYWRkaW5nLWxlZnQ6IDJyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG59XHJcbi5vcC10YWJzLW1kIDp3aGVyZSgub3AtdGFiKSB7XG4gIGhlaWdodDogMnJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xuICAtLXRhYi1wYWRkaW5nOiAxcmVtO1xufVxyXG4ub3AtdGFicy1sZyA6d2hlcmUoLm9wLXRhYikge1xuICBoZWlnaHQ6IDNyZW07XG4gIGZvbnQtc2l6ZTogMS4xMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjc1cmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgLS10YWItcGFkZGluZzogMS4yNXJlbTtcbn1cclxuLm9wLXRhYnMtc20gOndoZXJlKC5vcC10YWIpIHtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAuNzVyZW07XG4gIC0tdGFiLXBhZGRpbmc6IDAuNzVyZW07XG59XHJcbi5vcC10YWJzLXhzIDp3aGVyZSgub3AtdGFiKSB7XG4gIGhlaWdodDogMS4yNXJlbTtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xuICBsaW5lLWhlaWdodDogLjc1cmVtO1xuICAtLXRhYi1wYWRkaW5nOiAwLjVyZW07XG59XHJcbi5vcC1jYXJkLWNvbXBhY3QgLm9wLWNhcmQtYm9keSB7XG4gIHBhZGRpbmc6IDFyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xufVxyXG4ub3AtY2FyZC1jb21wYWN0IC5vcC1jYXJkLXRpdGxlIHtcbiAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTtcbn1cclxuLm9wLWNhcmQtbm9ybWFsIC5vcC1jYXJkLWJvZHkge1xuICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nLWNhcmQsIDJyZW0pO1xuICBmb250LXNpemU6IDFyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG59XHJcbi5vcC1jYXJkLW5vcm1hbCAub3AtY2FyZC10aXRsZSB7XG4gIG1hcmdpbi1ib3R0b206IDAuNzVyZW07XG59XHJcbi5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwgPiA6d2hlcmUoKjpub3QoOmZpcnN0LWNoaWxkKSkge1xuICBtYXJnaW4tbGVmdDogMHB4O1xuICBtYXJnaW4tcmlnaHQ6IDBweDtcbiAgbWFyZ2luLXRvcDogLTFweDtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKTppcygub3AtYnRuKSB7XG4gIG1hcmdpbi10b3A6IGNhbGModmFyKC0tYm9yZGVyLWJ0bikgKiAtMSk7XG59XHJcbi5vcC1qb2luLm9wLWpvaW4taG9yaXpvbnRhbCA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKSB7XG4gIG1hcmdpbi10b3A6IDBweDtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiAtMXB4O1xufVxyXG4ub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwgPiA6d2hlcmUoKjpub3QoOmZpcnN0LWNoaWxkKSk6aXMoLm9wLWJ0bikge1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiBjYWxjKHZhcigtLWJvcmRlci1idG4pICogLTEpO1xufVxyXG4ub3AtbWVudS1zbSA6d2hlcmUobGk6bm90KC5vcC1tZW51LXRpdGxlKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSkpLCAub3AtbWVudS1zbSA6d2hlcmUobGk6bm90KC5vcC1tZW51LXRpdGxlKSA+IGRldGFpbHMgPiBzdW1tYXJ5Om5vdCgub3AtbWVudS10aXRsZSkpIHtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbiAgcGFkZGluZy10b3A6IDAuMjVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAwLjI1cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbn1cclxuLm9wLW1lbnUtc20gLm9wLW1lbnUtdGl0bGUge1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gIHBhZGRpbmctdG9wOiAwLjVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAwLjVyZW07XG59XHJcbi5vcC1tb2RhbC10b3AgOndoZXJlKC5vcC1tb2RhbC1ib3gpIHtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogbm9uZTtcbiAgLS10dy10cmFuc2xhdGUteTogLTIuNXJlbTtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDBweDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDtcbn1cclxuLm9wLW1vZGFsLW1pZGRsZSA6d2hlcmUoLm9wLW1vZGFsLWJveCkge1xuICB3aWR0aDogOTEuNjY2NjY3JTtcbiAgbWF4LXdpZHRoOiAzMnJlbTtcbiAgLS10dy10cmFuc2xhdGUteTogMHB4O1xuICAtLXR3LXNjYWxlLXg6IC45O1xuICAtLXR3LXNjYWxlLXk6IC45O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG59XHJcbi5vcC1tb2RhbC1ib3R0b20gOndoZXJlKC5vcC1tb2RhbC1ib3gpIHtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogbm9uZTtcbiAgLS10dy10cmFuc2xhdGUteTogMi41cmVtO1xuICAtLXR3LXNjYWxlLXg6IDE7XG4gIC0tdHctc2NhbGUteTogMTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDBweDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMHB4O1xufVxyXG4uc3Itb25seSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcDogcmVjdCgwLCAwLCAwLCAwKTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgYm9yZGVyLXdpZHRoOiAwO1xufVxyXG4ucG9pbnRlci1ldmVudHMtbm9uZSB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxyXG4udmlzaWJsZSB7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG59XHJcbi5maXhlZCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cclxuLmFic29sdXRlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxyXG4ucmVsYXRpdmUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XHJcbi5zdGlja3kge1xuICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG59XHJcbi5pbnNldC0wIHtcbiAgaW5zZXQ6IDBweDtcbn1cclxuLi1ib3R0b20tXFxcXFsxMXB4XFxcXF0ge1xuICBib3R0b206IC0xMXB4O1xufVxyXG4uLWJvdHRvbS1cXFxcWzFweFxcXFxdIHtcbiAgYm90dG9tOiAtMXB4O1xufVxyXG4uLXJpZ2h0LTEge1xuICByaWdodDogLTAuMjVyZW07XG59XHJcbi4tcmlnaHQtXFxcXFsxMnB4XFxcXF0ge1xuICByaWdodDogLTEycHg7XG59XHJcbi4tcmlnaHQtXFxcXFsxM3B4XFxcXF0ge1xuICByaWdodDogLTEzcHg7XG59XHJcbi4tcmlnaHQtXFxcXFsxcHhcXFxcXSB7XG4gIHJpZ2h0OiAtMXB4O1xufVxyXG4uYm90dG9tLTAge1xuICBib3R0b206IDBweDtcbn1cclxuLmJvdHRvbS00IHtcbiAgYm90dG9tOiAxcmVtO1xufVxyXG4ubGVmdC0wIHtcbiAgbGVmdDogMHB4O1xufVxyXG4ubGVmdC0xXFxcXC8yIHtcbiAgbGVmdDogNTAlO1xufVxyXG4ucmlnaHQtMCB7XG4gIHJpZ2h0OiAwcHg7XG59XHJcbi5yaWdodC0xIHtcbiAgcmlnaHQ6IDAuMjVyZW07XG59XHJcbi5yaWdodC0yIHtcbiAgcmlnaHQ6IDAuNXJlbTtcbn1cclxuLnJpZ2h0LTMge1xuICByaWdodDogMC43NXJlbTtcbn1cclxuLnJpZ2h0LTQge1xuICByaWdodDogMXJlbTtcbn1cclxuLnJpZ2h0LTUge1xuICByaWdodDogMS4yNXJlbTtcbn1cclxuLnJpZ2h0LVxcXFxbMTBweFxcXFxdIHtcbiAgcmlnaHQ6IDEwcHg7XG59XHJcbi50b3AtMCB7XG4gIHRvcDogMHB4O1xufVxyXG4udG9wLTEge1xuICB0b3A6IDAuMjVyZW07XG59XHJcbi50b3AtMiB7XG4gIHRvcDogMC41cmVtO1xufVxyXG4udG9wLTIwIHtcbiAgdG9wOiA1cmVtO1xufVxyXG4udG9wLTMge1xuICB0b3A6IDAuNzVyZW07XG59XHJcbi50b3AtXFxcXFsxcHhcXFxcXSB7XG4gIHRvcDogMXB4O1xufVxyXG4udG9wLVxcXFxbMlxcXFwuNTVyZW1cXFxcXSB7XG4gIHRvcDogMi41NXJlbTtcbn1cclxuLnRvcC1cXFxcWzUwXFxcXCVcXFxcXSB7XG4gIHRvcDogNTAlO1xufVxyXG4udG9wLWF1dG8ge1xuICB0b3A6IGF1dG87XG59XHJcbi4tei1cXFxcWzFcXFxcXSB7XG4gIHotaW5kZXg6IC0xO1xufVxyXG4uei0xMCB7XG4gIHotaW5kZXg6IDEwO1xufVxyXG4uei0yMCB7XG4gIHotaW5kZXg6IDIwO1xufVxyXG4uei0zMCB7XG4gIHotaW5kZXg6IDMwO1xufVxyXG4uei00MCB7XG4gIHotaW5kZXg6IDQwO1xufVxyXG4uei01MCB7XG4gIHotaW5kZXg6IDUwO1xufVxyXG4uei1cXFxcWzEwMDBcXFxcXSB7XG4gIHotaW5kZXg6IDEwMDA7XG59XHJcbi56LVxcXFxbMTAwXFxcXF0ge1xuICB6LWluZGV4OiAxMDA7XG59XHJcbi56LVxcXFxbMTMwMFxcXFxdIHtcbiAgei1pbmRleDogMTMwMDtcbn1cclxuLnotXFxcXFsxOTk5XFxcXF0ge1xuICB6LWluZGV4OiAxOTk5O1xufVxyXG4uei1cXFxcWzFcXFxcXSB7XG4gIHotaW5kZXg6IDE7XG59XHJcbi56LVxcXFxbMjAwXFxcXF0ge1xuICB6LWluZGV4OiAyMDA7XG59XHJcbi56LVxcXFxbMjBcXFxcXSB7XG4gIHotaW5kZXg6IDIwO1xufVxyXG4uei1cXFxcWzMwXFxcXF0ge1xuICB6LWluZGV4OiAzMDtcbn1cclxuLnotXFxcXFs0NDhcXFxcXSB7XG4gIHotaW5kZXg6IDQ0ODtcbn1cclxuLnotXFxcXFs1MDBcXFxcXSB7XG4gIHotaW5kZXg6IDUwMDtcbn1cclxuLnotXFxcXFs1MDFcXFxcXSB7XG4gIHotaW5kZXg6IDUwMTtcbn1cclxuLnotXFxcXFs3MFxcXFxdIHtcbiAgei1pbmRleDogNzA7XG59XHJcbi56LVxcXFxbOTk5XFxcXF0ge1xuICB6LWluZGV4OiA5OTk7XG59XHJcbi56LVxcXFxbOTlcXFxcXSB7XG4gIHotaW5kZXg6IDk5O1xufVxyXG4ub3JkZXItbGFzdCB7XG4gIG9yZGVyOiA5OTk5O1xufVxyXG4uY29sLXNwYW4tMTIge1xuICBncmlkLWNvbHVtbjogc3BhbiAxMiAvIHNwYW4gMTI7XG59XHJcbi5tLTEge1xuICBtYXJnaW46IDAuMjVyZW07XG59XHJcbi5tLTIge1xuICBtYXJnaW46IDAuNXJlbTtcbn1cclxuLm0tXFxcXFsxMHB4XFxcXF0ge1xuICBtYXJnaW46IDEwcHg7XG59XHJcbi5tLVxcXFxbMTVweFxcXFxdIHtcbiAgbWFyZ2luOiAxNXB4O1xufVxyXG4ubS1cXFxcWzIwcHhcXFxcXSB7XG4gIG1hcmdpbjogMjBweDtcbn1cclxuLm0tXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbjogMnB4O1xufVxyXG4ubS1cXFxcWzRweFxcXFxdIHtcbiAgbWFyZ2luOiA0cHg7XG59XHJcbi5teC0xIHtcbiAgbWFyZ2luLWxlZnQ6IDAuMjVyZW07XG4gIG1hcmdpbi1yaWdodDogMC4yNXJlbTtcbn1cclxuLm14LTIge1xuICBtYXJnaW4tbGVmdDogMC41cmVtO1xuICBtYXJnaW4tcmlnaHQ6IDAuNXJlbTtcbn1cclxuLm14LTMge1xuICBtYXJnaW4tbGVmdDogMC43NXJlbTtcbiAgbWFyZ2luLXJpZ2h0OiAwLjc1cmVtO1xufVxyXG4ubXgtNCB7XG4gIG1hcmdpbi1sZWZ0OiAxcmVtO1xuICBtYXJnaW4tcmlnaHQ6IDFyZW07XG59XHJcbi5teC1cXFxcWzEwMHB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMTAwcHg7XG4gIG1hcmdpbi1yaWdodDogMTAwcHg7XG59XHJcbi5teC1cXFxcWzI1XFxcXCVcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAyNSU7XG4gIG1hcmdpbi1yaWdodDogMjUlO1xufVxyXG4ubXgtXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG4gIG1hcmdpbi1yaWdodDogMnB4O1xufVxyXG4ubXgtXFxcXFszcHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAzcHg7XG4gIG1hcmdpbi1yaWdodDogM3B4O1xufVxyXG4ubXgtXFxcXFs0cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA0cHg7XG4gIG1hcmdpbi1yaWdodDogNHB4O1xufVxyXG4ubXgtXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA1cHg7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xufVxyXG4ubXgtYXV0byB7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XHJcbi5teS0wXFxcXC41IHtcbiAgbWFyZ2luLXRvcDogMC4xMjVyZW07XG4gIG1hcmdpbi1ib3R0b206IDAuMTI1cmVtO1xufVxyXG4ubXktMSB7XG4gIG1hcmdpbi10b3A6IDAuMjVyZW07XG4gIG1hcmdpbi1ib3R0b206IDAuMjVyZW07XG59XHJcbi5teS0yIHtcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG59XHJcbi5teS0zIHtcbiAgbWFyZ2luLXRvcDogMC43NXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLm15LTQge1xuICBtYXJnaW4tdG9wOiAxcmVtO1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xufVxyXG4ubXktXFxcXFsxNXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xufVxyXG4ubXktXFxcXFsxcHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDFweDtcbiAgbWFyZ2luLWJvdHRvbTogMXB4O1xufVxyXG4ubXktXFxcXFsyMHB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxyXG4ubXktXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDJweDtcbiAgbWFyZ2luLWJvdHRvbTogMnB4O1xufVxyXG4ubXktXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxyXG4ubXgtOCB7XG4gIG1hcmdpbi1sZWZ0OiAycmVtO1xuICBtYXJnaW4tcmlnaHQ6IDJyZW07XG59XHJcbi5tYi0wIHtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xufVxyXG4ubWItMFxcXFwuNSB7XG4gIG1hcmdpbi1ib3R0b206IDAuMTI1cmVtO1xufVxyXG4ubWItMSB7XG4gIG1hcmdpbi1ib3R0b206IDAuMjVyZW07XG59XHJcbi5tYi0xMSB7XG4gIG1hcmdpbi1ib3R0b206IDIuNzVyZW07XG59XHJcbi5tYi0yIHtcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xufVxyXG4ubWItMyB7XG4gIG1hcmdpbi1ib3R0b206IDAuNzVyZW07XG59XHJcbi5tYi00IHtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbn1cclxuLm1iLVxcXFxbMFxcXFwuMzVyZW1cXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDAuMzVyZW07XG59XHJcbi5tYi1cXFxcWzBcXFxcLjVyZW1cXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbn1cclxuLm1iLVxcXFxbMFxcXFwuNzVyZW1cXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDAuNzVyZW07XG59XHJcbi5tYi1cXFxcWzEwcHhcXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XHJcbi5tYi1cXFxcWzE1cHhcXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XG59XHJcbi5tYi1cXFxcWzE2cHhcXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDE2cHg7XG59XHJcbi5tYi1cXFxcWzJweFxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMnB4O1xufVxyXG4ubWItXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cclxuLm1sLTBcXFxcLjUge1xuICBtYXJnaW4tbGVmdDogMC4xMjVyZW07XG59XHJcbi5tbC0xIHtcbiAgbWFyZ2luLWxlZnQ6IDAuMjVyZW07XG59XHJcbi5tbC0xXFxcXC41IHtcbiAgbWFyZ2luLWxlZnQ6IDAuMzc1cmVtO1xufVxyXG4ubWwtMiB7XG4gIG1hcmdpbi1sZWZ0OiAwLjVyZW07XG59XHJcbi5tbC0zIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNzVyZW07XG59XHJcbi5tbC00IHtcbiAgbWFyZ2luLWxlZnQ6IDFyZW07XG59XHJcbi5tbC1cXFxcWzBcXFxcLjVyZW1cXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAwLjVyZW07XG59XHJcbi5tbC1cXFxcWzEwcHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxyXG4ubWwtXFxcXFsxM3B4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMTNweDtcbn1cclxuLm1sLVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMnB4O1xufVxyXG4ubWwtXFxcXFszcHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAzcHg7XG59XHJcbi5tbC1cXFxcWzRweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDRweDtcbn1cclxuLm1sLVxcXFxbNXB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogNXB4O1xufVxyXG4ubWwtXFxcXFs2cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA2cHg7XG59XHJcbi5tbC1cXFxcWzdweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDdweDtcbn1cclxuLm1sLVxcXFxbOHB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogOHB4O1xufVxyXG4ubXItMSB7XG4gIG1hcmdpbi1yaWdodDogMC4yNXJlbTtcbn1cclxuLm1yLTFcXFxcLjUge1xuICBtYXJnaW4tcmlnaHQ6IDAuMzc1cmVtO1xufVxyXG4ubXItMiB7XG4gIG1hcmdpbi1yaWdodDogMC41cmVtO1xufVxyXG4ubXItNCB7XG4gIG1hcmdpbi1yaWdodDogMXJlbTtcbn1cclxuLm1yLVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xufVxyXG4ubXItXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbi1yaWdodDogMnB4O1xufVxyXG4ubXItXFxcXFszcHhcXFxcXSB7XG4gIG1hcmdpbi1yaWdodDogM3B4O1xufVxyXG4ubXItXFxcXFs0cHhcXFxcXSB7XG4gIG1hcmdpbi1yaWdodDogNHB4O1xufVxyXG4ubXItXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xufVxyXG4ubXItXFxcXFs4cHhcXFxcXSB7XG4gIG1hcmdpbi1yaWdodDogOHB4O1xufVxyXG4ubXQtMCB7XG4gIG1hcmdpbi10b3A6IDBweDtcbn1cclxuLm10LTBcXFxcLjUge1xuICBtYXJnaW4tdG9wOiAwLjEyNXJlbTtcbn1cclxuLm10LTEge1xuICBtYXJnaW4tdG9wOiAwLjI1cmVtO1xufVxyXG4ubXQtMiB7XG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcbn1cclxuLm10LTJcXFxcLjUge1xuICBtYXJnaW4tdG9wOiAwLjYyNXJlbTtcbn1cclxuLm10LTMge1xuICBtYXJnaW4tdG9wOiAwLjc1cmVtO1xufVxyXG4ubXQtNCB7XG4gIG1hcmdpbi10b3A6IDFyZW07XG59XHJcbi5tdC02IHtcbiAgbWFyZ2luLXRvcDogMS41cmVtO1xufVxyXG4ubXQtXFxcXFswXFxcXC40cmVtXFxcXF0ge1xuICBtYXJnaW4tdG9wOiAwLjRyZW07XG59XHJcbi5tdC1cXFxcWzBcXFxcLjVyZW1cXFxcXSB7XG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcbn1cclxuLm10LVxcXFxbMFxcXFwuNzUwcmVtXFxcXF0ge1xuICBtYXJnaW4tdG9wOiAwLjc1MHJlbTtcbn1cclxuLm10LVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMTBweDtcbn1cclxuLm10LVxcXFxbMTRweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMTRweDtcbn1cclxuLm10LVxcXFxbMTVweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMTVweDtcbn1cclxuLm10LVxcXFxbMXJlbVxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMXJlbTtcbn1cclxuLm10LVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAycHg7XG59XHJcbi5tdC1cXFxcWzNweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogM3B4O1xufVxyXG4ubXQtXFxcXFs1MHB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiA1MHB4O1xufVxyXG4ubXQtXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cclxuLm10LVxcXFxbNnB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiA2cHg7XG59XHJcbi5tdC1cXFxcWzhweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogOHB4O1xufVxyXG4uYmxvY2sge1xuICBkaXNwbGF5OiBibG9jaztcbn1cclxuLmlubGluZS1ibG9jayB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cclxuLmlubGluZSB7XG4gIGRpc3BsYXk6IGlubGluZTtcbn1cclxuLmZsZXgge1xuICBkaXNwbGF5OiBmbGV4O1xufVxyXG4uaW5saW5lLWZsZXgge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbn1cclxuLnRhYmxlIHtcbiAgZGlzcGxheTogdGFibGU7XG59XHJcbi5ncmlkIHtcbiAgZGlzcGxheTogZ3JpZDtcbn1cclxuLmNvbnRlbnRzIHtcbiAgZGlzcGxheTogY29udGVudHM7XG59XHJcbi5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxyXG4uaC0yIHtcbiAgaGVpZ2h0OiAwLjVyZW07XG59XHJcbi5oLTQge1xuICBoZWlnaHQ6IDFyZW07XG59XHJcbi5oLTUge1xuICBoZWlnaHQ6IDEuMjVyZW07XG59XHJcbi5oLVxcXFxbMFxcXFwuNXB4XFxcXF0ge1xuICBoZWlnaHQ6IDAuNXB4O1xufVxyXG4uaC1cXFxcWzFcXFxcLjRyZW1cXFxcXSB7XG4gIGhlaWdodDogMS40cmVtO1xufVxyXG4uaC1cXFxcWzFcXFxcLjdyZW1cXFxcXSB7XG4gIGhlaWdodDogMS43cmVtO1xufVxyXG4uaC1cXFxcWzEwMFxcXFwlXFxcXF0ge1xuICBoZWlnaHQ6IDEwMCU7XG59XHJcbi5oLVxcXFxbMTAwcHhcXFxcXSB7XG4gIGhlaWdodDogMTAwcHg7XG59XHJcbi5oLVxcXFxbMTAwdmhcXFxcXSB7XG4gIGhlaWdodDogMTAwdmg7XG59XHJcbi5oLVxcXFxbMTExcHhcXFxcXSB7XG4gIGhlaWdodDogMTExcHg7XG59XHJcbi5oLVxcXFxbMTIwcHhcXFxcXSB7XG4gIGhlaWdodDogMTIwcHg7XG59XHJcbi5oLVxcXFxbMTQwcHhcXFxcXSB7XG4gIGhlaWdodDogMTQwcHg7XG59XHJcbi5oLVxcXFxbMTRweFxcXFxdIHtcbiAgaGVpZ2h0OiAxNHB4O1xufVxyXG4uaC1cXFxcWzE1MHB4XFxcXF0ge1xuICBoZWlnaHQ6IDE1MHB4O1xufVxyXG4uaC1cXFxcWzE1cHhcXFxcXSB7XG4gIGhlaWdodDogMTVweDtcbn1cclxuLmgtXFxcXFsxOXB4XFxcXF0ge1xuICBoZWlnaHQ6IDE5cHg7XG59XHJcbi5oLVxcXFxbMXB4XFxcXF0ge1xuICBoZWlnaHQ6IDFweDtcbn1cclxuLmgtXFxcXFsyMDBweFxcXFxdIHtcbiAgaGVpZ2h0OiAyMDBweDtcbn1cclxuLmgtXFxcXFsyMHB4XFxcXF0ge1xuICBoZWlnaHQ6IDIwcHg7XG59XHJcbi5oLVxcXFxbMjUwcHhcXFxcXSB7XG4gIGhlaWdodDogMjUwcHg7XG59XHJcbi5oLVxcXFxbMjVweFxcXFxdIHtcbiAgaGVpZ2h0OiAyNXB4O1xufVxyXG4uaC1cXFxcWzI2cHhcXFxcXSB7XG4gIGhlaWdodDogMjZweDtcbn1cclxuLmgtXFxcXFszMDBweFxcXFxdIHtcbiAgaGVpZ2h0OiAzMDBweDtcbn1cclxuLmgtXFxcXFszMHB4XFxcXF0ge1xuICBoZWlnaHQ6IDMwcHg7XG59XHJcbi5oLVxcXFxbMzE3cHhcXFxcXSB7XG4gIGhlaWdodDogMzE3cHg7XG59XHJcbi5oLVxcXFxbMzJweFxcXFxdIHtcbiAgaGVpZ2h0OiAzMnB4O1xufVxyXG4uaC1cXFxcWzM1cHhcXFxcXSB7XG4gIGhlaWdodDogMzVweDtcbn1cclxuLmgtXFxcXFszOHB4XFxcXF0ge1xuICBoZWlnaHQ6IDM4cHg7XG59XHJcbi5oLVxcXFxbNDBweFxcXFxdIHtcbiAgaGVpZ2h0OiA0MHB4O1xufVxyXG4uaC1cXFxcWzUwMHB4XFxcXF0ge1xuICBoZWlnaHQ6IDUwMHB4O1xufVxyXG4uaC1cXFxcWzUwdmhcXFxcXSB7XG4gIGhlaWdodDogNTB2aDtcbn1cclxuLmgtXFxcXFs2MHB4XFxcXF0ge1xuICBoZWlnaHQ6IDYwcHg7XG59XHJcbi5oLVxcXFxbNjZweFxcXFxdIHtcbiAgaGVpZ2h0OiA2NnB4O1xufVxyXG4uaC1cXFxcWzc1cHhcXFxcXSB7XG4gIGhlaWdodDogNzVweDtcbn1cclxuLmgtXFxcXFs5MFxcXFwlXFxcXF0ge1xuICBoZWlnaHQ6IDkwJTtcbn1cclxuLmgtXFxcXFs5NVxcXFwlXFxcXF0ge1xuICBoZWlnaHQ6IDk1JTtcbn1cclxuLmgtZnVsbCB7XG4gIGhlaWdodDogMTAwJTtcbn1cclxuLmgtc2NyZWVuIHtcbiAgaGVpZ2h0OiAxMDB2aDtcbn1cclxuLmgtXFxcXFs3MHB4XFxcXF0ge1xuICBoZWlnaHQ6IDcwcHg7XG59XHJcbi5tYXgtaC05NiB7XG4gIG1heC1oZWlnaHQ6IDI0cmVtO1xufVxyXG4ubWF4LWgtXFxcXFsxMDBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMTAwcHg7XG59XHJcbi5tYXgtaC1cXFxcWzEwMHZoXFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAxMDB2aDtcbn1cclxuLm1heC1oLVxcXFxbMTgwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDE4MHB4O1xufVxyXG4ubWF4LWgtXFxcXFsyMTBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMjEwcHg7XG59XHJcbi5tYXgtaC1cXFxcWzI1MHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAyNTBweDtcbn1cclxuLm1heC1oLVxcXFxbMzAwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDMwMHB4O1xufVxyXG4ubWF4LWgtXFxcXFszMTBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMzEwcHg7XG59XHJcbi5tYXgtaC1cXFxcWzM0MHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAzNDBweDtcbn1cclxuLm1heC1oLVxcXFxbMzVweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMzVweDtcbn1cclxuLm1heC1oLVxcXFxbMzhweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMzhweDtcbn1cclxuLm1heC1oLVxcXFxbNjAwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDYwMHB4O1xufVxyXG4ubWF4LWgtZnVsbCB7XG4gIG1heC1oZWlnaHQ6IDEwMCU7XG59XHJcbi5tYXgtaC1zY3JlZW4ge1xuICBtYXgtaGVpZ2h0OiAxMDB2aDtcbn1cclxuLm1pbi1oLW1heCB7XG4gIG1pbi1oZWlnaHQ6IC13ZWJraXQtbWF4LWNvbnRlbnQ7XG4gIG1pbi1oZWlnaHQ6IG1heC1jb250ZW50O1xufVxyXG4ubWluLWgtc2NyZWVuIHtcbiAgbWluLWhlaWdodDogMTAwdmg7XG59XHJcbi53LTAge1xuICB3aWR0aDogMHB4O1xufVxyXG4udy0xXFxcXC80IHtcbiAgd2lkdGg6IDI1JTtcbn1cclxuLnctNCB7XG4gIHdpZHRoOiAxcmVtO1xufVxyXG4udy01IHtcbiAgd2lkdGg6IDEuMjVyZW07XG59XHJcbi53LTUyIHtcbiAgd2lkdGg6IDEzcmVtO1xufVxyXG4udy05IHtcbiAgd2lkdGg6IDIuMjVyZW07XG59XHJcbi53LVxcXFxbMVxcXFwuNHJlbVxcXFxdIHtcbiAgd2lkdGg6IDEuNHJlbTtcbn1cclxuLnctXFxcXFsxXFxcXC43cmVtXFxcXF0ge1xuICB3aWR0aDogMS43cmVtO1xufVxyXG4udy1cXFxcWzEwMHB4XFxcXF0ge1xuICB3aWR0aDogMTAwcHg7XG59XHJcbi53LVxcXFxbMTBweFxcXFxdIHtcbiAgd2lkdGg6IDEwcHg7XG59XHJcbi53LVxcXFxbMTIwcHhcXFxcXSB7XG4gIHdpZHRoOiAxMjBweDtcbn1cclxuLnctXFxcXFsxNHB4XFxcXF0ge1xuICB3aWR0aDogMTRweDtcbn1cclxuLnctXFxcXFsxNTBweFxcXFxdIHtcbiAgd2lkdGg6IDE1MHB4O1xufVxyXG4udy1cXFxcWzE1cHhcXFxcXSB7XG4gIHdpZHRoOiAxNXB4O1xufVxyXG4udy1cXFxcWzE4XFxcXCVcXFxcXSB7XG4gIHdpZHRoOiAxOCU7XG59XHJcbi53LVxcXFxbMTgzcHhcXFxcXSB7XG4gIHdpZHRoOiAxODNweDtcbn1cclxuLnctXFxcXFsyMFxcXFwlXFxcXF0ge1xuICB3aWR0aDogMjAlO1xufVxyXG4udy1cXFxcWzIwMHB4XFxcXF0ge1xuICB3aWR0aDogMjAwcHg7XG59XHJcbi53LVxcXFxbMjIwcHhcXFxcXSB7XG4gIHdpZHRoOiAyMjBweDtcbn1cclxuLnctXFxcXFsyM1xcXFwlXFxcXF0ge1xuICB3aWR0aDogMjMlO1xufVxyXG4udy1cXFxcWzIzcHhcXFxcXSB7XG4gIHdpZHRoOiAyM3B4O1xufVxyXG4udy1cXFxcWzI1MHB4XFxcXF0ge1xuICB3aWR0aDogMjUwcHg7XG59XHJcbi53LVxcXFxbMjVweFxcXFxdIHtcbiAgd2lkdGg6IDI1cHg7XG59XHJcbi53LVxcXFxbMjZweFxcXFxdIHtcbiAgd2lkdGg6IDI2cHg7XG59XHJcbi53LVxcXFxbMzBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDMwJTtcbn1cclxuLnctXFxcXFszMHB4XFxcXF0ge1xuICB3aWR0aDogMzBweDtcbn1cclxuLnctXFxcXFszNXB4XFxcXF0ge1xuICB3aWR0aDogMzVweDtcbn1cclxuLnctXFxcXFs0MHB4XFxcXF0ge1xuICB3aWR0aDogNDBweDtcbn1cclxuLnctXFxcXFs0NTBweFxcXFxdIHtcbiAgd2lkdGg6IDQ1MHB4O1xufVxyXG4udy1cXFxcWzRyZW1cXFxcXSB7XG4gIHdpZHRoOiA0cmVtO1xufVxyXG4udy1cXFxcWzUwcHhcXFxcXSB7XG4gIHdpZHRoOiA1MHB4O1xufVxyXG4udy1cXFxcWzYwcHhcXFxcXSB7XG4gIHdpZHRoOiA2MHB4O1xufVxyXG4udy1cXFxcWzY1cHhcXFxcXSB7XG4gIHdpZHRoOiA2NXB4O1xufVxyXG4udy1cXFxcWzcwXFxcXCVcXFxcXSB7XG4gIHdpZHRoOiA3MCU7XG59XHJcbi53LVxcXFxbNzVweFxcXFxdIHtcbiAgd2lkdGg6IDc1cHg7XG59XHJcbi53LVxcXFxbODBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDgwJTtcbn1cclxuLnctXFxcXFs4N1xcXFwlXFxcXF0ge1xuICB3aWR0aDogODclO1xufVxyXG4udy1cXFxcWzkwXFxcXCVcXFxcXSB7XG4gIHdpZHRoOiA5MCU7XG59XHJcbi53LVxcXFxbOTBweFxcXFxdIHtcbiAgd2lkdGg6IDkwcHg7XG59XHJcbi53LVxcXFxbOTVcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDk1JTtcbn1cclxuLnctYXV0byB7XG4gIHdpZHRoOiBhdXRvO1xufVxyXG4udy1maXQge1xuICB3aWR0aDogLXdlYmtpdC1maXQtY29udGVudDtcbiAgd2lkdGg6IC1tb3otZml0LWNvbnRlbnQ7XG4gIHdpZHRoOiBmaXQtY29udGVudDtcbn1cclxuLnctZnVsbCB7XG4gIHdpZHRoOiAxMDAlO1xufVxyXG4udy1tYXgge1xuICB3aWR0aDogLXdlYmtpdC1tYXgtY29udGVudDtcbiAgd2lkdGg6IG1heC1jb250ZW50O1xufVxyXG4ubWluLXctNTYge1xuICBtaW4td2lkdGg6IDE0cmVtO1xufVxyXG4ubWluLXctXFxcXFszMDBweFxcXFxdIHtcbiAgbWluLXdpZHRoOiAzMDBweDtcbn1cclxuLm1pbi13LVxcXFxbNDhweFxcXFxdIHtcbiAgbWluLXdpZHRoOiA0OHB4O1xufVxyXG4ubWluLXctXFxcXFs5MFxcXFwlXFxcXF0ge1xuICBtaW4td2lkdGg6IDkwJTtcbn1cclxuLm1heC13LTU2IHtcbiAgbWF4LXdpZHRoOiAxNHJlbTtcbn1cclxuLm1heC13LVxcXFxbMjAwcHhcXFxcXSB7XG4gIG1heC13aWR0aDogMjAwcHg7XG59XHJcbi5tYXgtdy1cXFxcWzI1MHB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDI1MHB4O1xufVxyXG4ubWF4LXctXFxcXFsyNzBweFxcXFxdIHtcbiAgbWF4LXdpZHRoOiAyNzBweDtcbn1cclxuLm1heC13LVxcXFxbMzUwcHhcXFxcXSB7XG4gIG1heC13aWR0aDogMzUwcHg7XG59XHJcbi5tYXgtdy1cXFxcWzQ1MHB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDQ1MHB4O1xufVxyXG4ubWF4LXctXFxcXFs0NXB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDQ1cHg7XG59XHJcbi5tYXgtdy1cXFxcWzUwMHB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDUwMHB4O1xufVxyXG4ubWF4LXctc20ge1xuICBtYXgtd2lkdGg6IDI0cmVtO1xufVxyXG4uZmxleC0xIHtcbiAgZmxleDogMSAxIDAlO1xufVxyXG4uZmxleC1ub25lIHtcbiAgZmxleDogbm9uZTtcbn1cclxuLmdyb3cge1xuICBmbGV4LWdyb3c6IDE7XG59XHJcbi5ib3JkZXItY29sbGFwc2Uge1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xufVxyXG4uLXRyYW5zbGF0ZS14LTFcXFxcLzIge1xuICAtLXR3LXRyYW5zbGF0ZS14OiAtNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbn1cclxuLi10cmFuc2xhdGUteS0xXFxcXC8yIHtcbiAgLS10dy10cmFuc2xhdGUteTogLTUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcbi4tdHJhbnNsYXRlLXktXFxcXFs1MFxcXFwlXFxcXF0ge1xuICAtLXR3LXRyYW5zbGF0ZS15OiAtNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbn1cclxuLnRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4uY3Vyc29yLVxcXFxbdXJsXFxcXChcXFxcJ2RhdGFcXFxcOmltYWdlXFxcXC9wbmdcXFxcO2Jhc2U2NFxcXFwyYyBpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOFxcXFwvOWhBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQVNFbEVRVlI0bkdOZ3dBTWtKU1VicEtTa092Q3BJYVQ1UHhTVGJvZ1VRak1ZTXd4ZUlJWG1WRkl4QThVR0REeVFHZzBEbklEaTZKS1VsQ3hITXFDZVpBT2doalNBTUQ1RkFLZmVhVVJkVUZ4Q0FBQUFBRWxGVGtTdVFtQ0NcXFxcJ1xcXFwpXFxcXDJjIF9wb2ludGVyXFxcXF0ge1xuICBjdXJzb3I6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzJfX199KSwgcG9pbnRlcjtcbn1cclxuLmN1cnNvci1hbGwtc2Nyb2xsIHtcbiAgY3Vyc29yOiBhbGwtc2Nyb2xsO1xufVxyXG4uY3Vyc29yLWNyb3NzaGFpciB7XG4gIGN1cnNvcjogY3Jvc3NoYWlyO1xufVxyXG4uY3Vyc29yLWRlZmF1bHQge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XHJcbi5jdXJzb3ItcG9pbnRlciB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cclxuLmN1cnNvci1wcm9ncmVzcyB7XG4gIGN1cnNvcjogcHJvZ3Jlc3M7XG59XHJcbi5zZWxlY3Qtbm9uZSB7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XHJcbi5yZXNpemUtbm9uZSB7XG4gIHJlc2l6ZTogbm9uZTtcbn1cclxuLnJlc2l6ZSB7XG4gIHJlc2l6ZTogYm90aDtcbn1cclxuLmxpc3QtZGlzYyB7XG4gIGxpc3Qtc3R5bGUtdHlwZTogZGlzYztcbn1cclxuLmxpc3Qtbm9uZSB7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbn1cclxuLmdyaWQtY29scy0xIHtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMSwgbWlubWF4KDAsIDFmcikpO1xufVxyXG4uZ3JpZC1jb2xzLTEyIHtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMTIsIG1pbm1heCgwLCAxZnIpKTtcbn1cclxuLmdyaWQtY29scy0yIHtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgbWlubWF4KDAsIDFmcikpO1xufVxyXG4uZmxleC1yb3cge1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xufVxyXG4uZmxleC1jb2wge1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxyXG4uZmxleC13cmFwIHtcbiAgZmxleC13cmFwOiB3cmFwO1xufVxyXG4uaXRlbXMtc3RhcnQge1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbn1cclxuLml0ZW1zLWNlbnRlciB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XHJcbi5pdGVtcy1zdHJldGNoIHtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG59XHJcbi5qdXN0aWZ5LXN0YXJ0IHtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xufVxyXG4uanVzdGlmeS1lbmQge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xufVxyXG4uanVzdGlmeS1jZW50ZXIge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cclxuLmp1c3RpZnktYmV0d2VlbiB7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcbn1cclxuLmp1c3RpZnktYXJvdW5kIHtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG59XHJcbi5nYXAtMCB7XG4gIGdhcDogMHB4O1xufVxyXG4uZ2FwLTBcXFxcLjUge1xuICBnYXA6IDAuMTI1cmVtO1xufVxyXG4uZ2FwLTEge1xuICBnYXA6IDAuMjVyZW07XG59XHJcbi5nYXAtMiB7XG4gIGdhcDogMC41cmVtO1xufVxyXG4uZ2FwLTMge1xuICBnYXA6IDAuNzVyZW07XG59XHJcbi5nYXAtNCB7XG4gIGdhcDogMXJlbTtcbn1cclxuLmdhcC01IHtcbiAgZ2FwOiAxLjI1cmVtO1xufVxyXG4uZ2FwLTgge1xuICBnYXA6IDJyZW07XG59XHJcbi5nYXAtXFxcXFsxMHB4XFxcXF0ge1xuICBnYXA6IDEwcHg7XG59XHJcbi5nYXAtXFxcXFs1cHhcXFxcXSB7XG4gIGdhcDogNXB4O1xufVxyXG4uZ2FwLVxcXFxbOHB4XFxcXF0ge1xuICBnYXA6IDhweDtcbn1cclxuLmdhcC14LTIge1xuICBjb2x1bW4tZ2FwOiAwLjVyZW07XG59XHJcbi5nYXAteC00IHtcbiAgY29sdW1uLWdhcDogMXJlbTtcbn1cclxuLmdhcC14LTUge1xuICBjb2x1bW4tZ2FwOiAxLjI1cmVtO1xufVxyXG4uZ2FwLXgtXFxcXFsycHhcXFxcXSB7XG4gIGNvbHVtbi1nYXA6IDJweDtcbn1cclxuLmdhcC14LVxcXFxbNXB4XFxcXF0ge1xuICBjb2x1bW4tZ2FwOiA1cHg7XG59XHJcbi5nYXAteS0xIHtcbiAgcm93LWdhcDogMC4yNXJlbTtcbn1cclxuLmdhcC15LTIge1xuICByb3ctZ2FwOiAwLjVyZW07XG59XHJcbi5nYXAteS0zIHtcbiAgcm93LWdhcDogMC43NXJlbTtcbn1cclxuLmdhcC15LVxcXFxbMnB4XFxcXF0ge1xuICByb3ctZ2FwOiAycHg7XG59XHJcbi5wbGFjZS1zZWxmLWNlbnRlciB7XG4gIHBsYWNlLXNlbGY6IGNlbnRlcjtcbn1cclxuLnNlbGYtc3RhcnQge1xuICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xufVxyXG4uc2VsZi1jZW50ZXIge1xuICBhbGlnbi1zZWxmOiBjZW50ZXI7XG59XHJcbi5vdmVyZmxvdy1hdXRvIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XHJcbi5vdmVyZmxvdy1oaWRkZW4ge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxyXG4ub3ZlcmZsb3cteC1hdXRvIHtcbiAgb3ZlcmZsb3cteDogYXV0bztcbn1cclxuLm92ZXJmbG93LXktYXV0byB7XG4gIG92ZXJmbG93LXk6IGF1dG87XG59XHJcbi5vdmVyZmxvdy14LXNjcm9sbCB7XG4gIG92ZXJmbG93LXg6IHNjcm9sbDtcbn1cclxuLm92ZXJmbG93LXktc2Nyb2xsIHtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xufVxyXG4udGV4dC1lbGxpcHNpcyB7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxyXG4ud2hpdGVzcGFjZS1ub3dyYXAge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxyXG4ud2hpdGVzcGFjZS1wcmUtd3JhcCB7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cclxuLmJyZWFrLXdvcmRzIHtcbiAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDtcbn1cclxuLmJyZWFrLWFsbCB7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbn1cclxuLnJvdW5kZWQge1xuICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xufVxyXG4ucm91bmRlZC1cXFxcWzBcXFxcLjM1MHJlbVxcXFxdIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zNTByZW07XG59XHJcbi5yb3VuZGVkLVxcXFxbMnB4XFxcXF0ge1xuICBib3JkZXItcmFkaXVzOiAycHg7XG59XHJcbi5yb3VuZGVkLWJveCB7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbn1cclxuLnJvdW5kZWQtZnVsbCB7XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbn1cclxuLnJvdW5kZWQtbGcge1xuICBib3JkZXItcmFkaXVzOiAwLjVyZW07XG59XHJcbi5yb3VuZGVkLW1kIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zNzVyZW07XG59XHJcbi5yb3VuZGVkLW5vbmUge1xuICBib3JkZXItcmFkaXVzOiAwcHg7XG59XHJcbi5yb3VuZGVkLXNtIHtcbiAgYm9yZGVyLXJhZGl1czogMC4xMjVyZW07XG59XHJcbi5yb3VuZGVkLXhsIHtcbiAgYm9yZGVyLXJhZGl1czogMC43NXJlbTtcbn1cclxuLnJvdW5kZWQtci1ub25lIHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDBweDtcbn1cclxuLmJvcmRlciB7XG4gIGJvcmRlci13aWR0aDogMXB4O1xufVxyXG4uYm9yZGVyLTIge1xuICBib3JkZXItd2lkdGg6IDJweDtcbn1cclxuLmJvcmRlci1cXFxcWzBcXFxcLjFweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAwLjFweDtcbn1cclxuLmJvcmRlci1cXFxcWzBcXFxcLjJweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAwLjJweDtcbn1cclxuLmJvcmRlci1cXFxcWzFcXFxcLjVweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAxLjVweDtcbn1cclxuLmJvcmRlci1cXFxcWzFweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG59XHJcbi5ib3JkZXItXFxcXFsycHhcXFxcXSB7XG4gIGJvcmRlci13aWR0aDogMnB4O1xufVxyXG4uYm9yZGVyLXktXFxcXFsxcHhcXFxcXSB7XG4gIGJvcmRlci10b3Atd2lkdGg6IDFweDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4O1xufVxyXG4uYm9yZGVyLWItXFxcXFsxcHhcXFxcXSB7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDFweDtcbn1cclxuLmJvcmRlci1iLVxcXFxbM3B4XFxcXF0ge1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAzcHg7XG59XHJcbi5ib3JkZXItci1cXFxcWzNweFxcXFxdIHtcbiAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAzcHg7XG59XHJcbi5ib3JkZXItdC1cXFxcWzFweFxcXFxdIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMXB4O1xufVxyXG4uYm9yZGVyLWRhc2hlZCB7XG4gIGJvcmRlci1zdHlsZTogZGFzaGVkO1xufVxyXG4uYm9yZGVyLW5vbmUge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcIzAwN2JmZlxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMCAxMjMgMjU1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjMTg4YWUyXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyNCAxMzggMjI2IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjMzNiYmZmXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYig1MSAxODcgMjU1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjODc4Nzg3XFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigxMzUgMTM1IDEzNSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcIzg4OFxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMTM2IDEzNiAxMzYgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCM4YThhOGFcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDEzOCAxMzggMTM4IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjY2VjZWNlXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyMDYgMjA2IDIwNiAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcI2Q2ZDNkM1xcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjE0IDIxMSAyMTEgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCNlYmU4ZThcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDIzNSAyMzIgMjMyIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjZjBhOGE4XFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyNDAgMTY4IDE2OCAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtncmF5XFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigxMjggMTI4IDEyOCAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtyZWRcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDI1NSAwIDAgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLWJhc2UtMjAwIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcbi5ib3JkZXItYmFzZS0zMDAge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuLmJvcmRlci1iYXNlLWNvbnRlbnQge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuLmJvcmRlci1ibGFjayB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDAgMCAwIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1ncmF5LTMwMCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDIwOSAyMTMgMjE5IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1ncmF5LTQwMCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDE1NiAxNjMgMTc1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1pbmRpZ28tODAwIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoNTUgNDggMTYzIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci10LXByaW1hcnkge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4uYmctXFxcXFtcXFxcIzJlZDhiNlxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNDYgMjE2IDE4MiAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCM1NzYwODFcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDg3IDk2IDEyOSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCM4YThhOGFcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEzOCAxMzggMTM4IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcIzkzYTNkYlxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTQ3IDE2MyAyMTkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjOWY5ZjlmXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigxNTkgMTU5IDE1OSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNiN2IzYjNcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE4MyAxNzkgMTc5IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcI2NjY1xcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0IDIwNCAyMDQgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjZTNlMmUxXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjcgMjI2IDIyNSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNlNmYyZjJcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzMCAyNDIgMjQyIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcI2U2ZjJmMlxcXFxdXFxcXC83MCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzAgMjQyIDI0MiAvIDAuNyk7XG59XHJcbi5iZy1cXFxcW1xcXFwjZjRiZWJlXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNDQgMTkwIDE5MCAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNmZmZcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctYmFzZS0xMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4uYmctYmFzZS0yMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4uYmctYmFzZS0zMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4uYmctYmFzZS1jb250ZW50IHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLmJnLWJhc2UtY29udGVudFxcXFwvMzAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4zKSk7XG59XHJcbi5iZy1ibGFjayB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDAgMCAwIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctYmxhY2tcXFxcLzMwIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDAgMCAwIC8gMC4zKTtcbn1cclxuLmJnLWJsdWUtNTAwIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNTkgMTMwIDI0NiAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLWdyYXktMjAwIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI5IDIzMSAyMzUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1ncmF5LTMwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwOSAyMTMgMjE5IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctZ3JheS00MDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigxNTYgMTYzIDE3NSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLWdyYXktNTAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNDkgMjUwIDI1MSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLWluaGVyaXQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xufVxyXG4uYmctdHJhbnNwYXJlbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cclxuLmJnLXdoaXRlIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy13aGl0ZVxcXFwvMjAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyAwLjIpO1xufVxyXG4uYmctXFxcXFtcXFxcI2ZmZmZmZlxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1vcGFjaXR5LTIwIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAwLjI7XG59XHJcbi5iZy1vcGFjaXR5LTI1IHtcbiAgLS10dy1iZy1vcGFjaXR5OiAwLjI1O1xufVxyXG4uYmctb3BhY2l0eS0zMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMC4zO1xufVxyXG4uYmctb3BhY2l0eS01MCB7XG4gIC0tdHctYmctb3BhY2l0eTogMC41O1xufVxyXG4uYmctb3BhY2l0eS04MCB7XG4gIC0tdHctYmctb3BhY2l0eTogMC44O1xufVxyXG4uZmlsbC1jdXJyZW50IHtcbiAgZmlsbDogY3VycmVudENvbG9yO1xufVxyXG4ub2JqZWN0LWNvbnRhaW4ge1xuICBvYmplY3QtZml0OiBjb250YWluO1xufVxyXG4ucC0wIHtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ucC0yIHtcbiAgcGFkZGluZzogMC41cmVtO1xufVxyXG4ucC0zIHtcbiAgcGFkZGluZzogMC43NXJlbTtcbn1cclxuLnAtNCB7XG4gIHBhZGRpbmc6IDFyZW07XG59XHJcbi5wLVxcXFxbMTBweFxcXFxdIHtcbiAgcGFkZGluZzogMTBweDtcbn1cclxuLnAtXFxcXFsxNXB4XFxcXF0ge1xuICBwYWRkaW5nOiAxNXB4O1xufVxyXG4ucC1cXFxcWzE2cHhcXFxcXSB7XG4gIHBhZGRpbmc6IDE2cHg7XG59XHJcbi5wLVxcXFxbMXB4XFxcXF0ge1xuICBwYWRkaW5nOiAxcHg7XG59XHJcbi5wLVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZzogMjBweDtcbn1cclxuLnAtXFxcXFsycHhcXFxcXSB7XG4gIHBhZGRpbmc6IDJweDtcbn1cclxuLnAtXFxcXFsycmVtXFxcXF0ge1xuICBwYWRkaW5nOiAycmVtO1xufVxyXG4ucC1cXFxcWzMwcHhcXFxcXSB7XG4gIHBhZGRpbmc6IDMwcHg7XG59XHJcbi5wLVxcXFxbM3B4XFxcXF0ge1xuICBwYWRkaW5nOiAzcHg7XG59XHJcbi5wLVxcXFxbNXB4XFxcXF0ge1xuICBwYWRkaW5nOiA1cHg7XG59XHJcbi5wLVxcXFxbOHB4XFxcXF0ge1xuICBwYWRkaW5nOiA4cHg7XG59XHJcbi5weC0wIHtcbiAgcGFkZGluZy1sZWZ0OiAwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDBweDtcbn1cclxuLnB4LTIge1xuICBwYWRkaW5nLWxlZnQ6IDAuNXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC41cmVtO1xufVxyXG4ucHgtMyB7XG4gIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbn1cclxuLnB4LTQge1xuICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDFyZW07XG59XHJcbi5weC02IHtcbiAgcGFkZGluZy1sZWZ0OiAxLjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDEuNXJlbTtcbn1cclxuLnB4LTcge1xuICBwYWRkaW5nLWxlZnQ6IDEuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDEuNzVyZW07XG59XHJcbi5weC04IHtcbiAgcGFkZGluZy1sZWZ0OiAycmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAycmVtO1xufVxyXG4ucHgtXFxcXFsxXFxcXC4yNXJlbVxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAxLjI1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxLjI1cmVtO1xufVxyXG4ucHgtXFxcXFsxMHB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG59XHJcbi5weC1cXFxcWzEycHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMTJweDtcbiAgcGFkZGluZy1yaWdodDogMTJweDtcbn1cclxuLnB4LVxcXFxbMTNweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAxM3B4O1xuICBwYWRkaW5nLXJpZ2h0OiAxM3B4O1xufVxyXG4ucHgtXFxcXFsxNXB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG59XHJcbi5weC1cXFxcWzIwcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMjBweDtcbiAgcGFkZGluZy1yaWdodDogMjBweDtcbn1cclxuLnB4LVxcXFxbMjVweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAyNXB4O1xuICBwYWRkaW5nLXJpZ2h0OiAyNXB4O1xufVxyXG4ucHgtXFxcXFszcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogM3B4O1xuICBwYWRkaW5nLXJpZ2h0OiAzcHg7XG59XHJcbi5weC1cXFxcWzQwcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogNDBweDtcbiAgcGFkZGluZy1yaWdodDogNDBweDtcbn1cclxuLnB4LVxcXFxbNHB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDRweDtcbiAgcGFkZGluZy1yaWdodDogNHB4O1xufVxyXG4ucHktMSB7XG4gIHBhZGRpbmctdG9wOiAwLjI1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC4yNXJlbTtcbn1cclxuLnB5LTFcXFxcLjUge1xuICBwYWRkaW5nLXRvcDogMC4zNzVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAwLjM3NXJlbTtcbn1cclxuLnB5LTEwIHtcbiAgcGFkZGluZy10b3A6IDIuNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDIuNXJlbTtcbn1cclxuLnB5LTIge1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xufVxyXG4ucHktMyB7XG4gIHBhZGRpbmctdG9wOiAwLjc1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLnB5LTQge1xuICBwYWRkaW5nLXRvcDogMXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDFyZW07XG59XHJcbi5weS1cXFxcW1xcXFwuNzVyZW1cXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAuNzVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAuNzVyZW07XG59XHJcbi5weS1cXFxcWzFcXFxcLjVweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDEuNXB4O1xuICBwYWRkaW5nLWJvdHRvbTogMS41cHg7XG59XHJcbi5weS1cXFxcWzEwcHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAxMHB4O1xuICBwYWRkaW5nLWJvdHRvbTogMTBweDtcbn1cclxuLnB5LVxcXFxbMXB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMXB4O1xuICBwYWRkaW5nLWJvdHRvbTogMXB4O1xufVxyXG4ucHktXFxcXFsyMHB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMjBweDtcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XG59XHJcbi5weS1cXFxcWzNweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDNweDtcbiAgcGFkZGluZy1ib3R0b206IDNweDtcbn1cclxuLnB5LVxcXFxbNXB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogNXB4O1xuICBwYWRkaW5nLWJvdHRvbTogNXB4O1xufVxyXG4ucHktXFxcXFs4cHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiA4cHg7XG4gIHBhZGRpbmctYm90dG9tOiA4cHg7XG59XHJcbi5wYi0wIHtcbiAgcGFkZGluZy1ib3R0b206IDBweDtcbn1cclxuLnBiLTEge1xuICBwYWRkaW5nLWJvdHRvbTogMC4yNXJlbTtcbn1cclxuLnBiLTIge1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xufVxyXG4ucGItMyB7XG4gIHBhZGRpbmctYm90dG9tOiAwLjc1cmVtO1xufVxyXG4ucGItXFxcXFsxNXB4XFxcXF0ge1xuICBwYWRkaW5nLWJvdHRvbTogMTVweDtcbn1cclxuLnBiLVxcXFxbMXB4XFxcXF0ge1xuICBwYWRkaW5nLWJvdHRvbTogMXB4O1xufVxyXG4ucGItXFxcXFsyMHB4XFxcXF0ge1xuICBwYWRkaW5nLWJvdHRvbTogMjBweDtcbn1cclxuLnBiLVxcXFxbNXB4XFxcXF0ge1xuICBwYWRkaW5nLWJvdHRvbTogNXB4O1xufVxyXG4ucGwtMyB7XG4gIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbn1cclxuLnBsLTYge1xuICBwYWRkaW5nLWxlZnQ6IDEuNXJlbTtcbn1cclxuLnBsLVxcXFxbMTBweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxyXG4ucGwtXFxcXFsyMHB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG59XHJcbi5wbC1cXFxcWzVweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiA1cHg7XG59XHJcbi5wci0xIHtcbiAgcGFkZGluZy1yaWdodDogMC4yNXJlbTtcbn1cclxuLnByLTIge1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVyZW07XG59XHJcbi5wci1cXFxcWzNweFxcXFxdIHtcbiAgcGFkZGluZy1yaWdodDogM3B4O1xufVxyXG4ucHItXFxcXFs1cHhcXFxcXSB7XG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcbn1cclxuLnB0LTAge1xuICBwYWRkaW5nLXRvcDogMHB4O1xufVxyXG4ucHQtMSB7XG4gIHBhZGRpbmctdG9wOiAwLjI1cmVtO1xufVxyXG4ucHQtMiB7XG4gIHBhZGRpbmctdG9wOiAwLjVyZW07XG59XHJcbi5wdC0zIHtcbiAgcGFkZGluZy10b3A6IDAuNzVyZW07XG59XHJcbi5wdC00IHtcbiAgcGFkZGluZy10b3A6IDFyZW07XG59XHJcbi5wdC1cXFxcWzEwcHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAxMHB4O1xufVxyXG4ucHQtXFxcXFsxNXB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMTVweDtcbn1cclxuLnB0LVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG59XHJcbi50ZXh0LWxlZnQge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxyXG4udGV4dC1jZW50ZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XHJcbi5hbGlnbi1iYXNlbGluZSB7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cclxuLnRleHQtMnhsIHtcbiAgZm9udC1zaXplOiAxLjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAycmVtO1xufVxyXG4udGV4dC0zeGwge1xuICBmb250LXNpemU6IDEuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMi4yNXJlbTtcbn1cclxuLnRleHQtXFxcXFsxXFxcXC4ycmVtXFxcXF0ge1xuICBmb250LXNpemU6IDEuMnJlbTtcbn1cclxuLnRleHQtXFxcXFsxXFxcXC41cmVtXFxcXF0ge1xuICBmb250LXNpemU6IDEuNXJlbTtcbn1cclxuLnRleHQtXFxcXFsxMHB4XFxcXF0ge1xuICBmb250LXNpemU6IDEwcHg7XG59XHJcbi50ZXh0LVxcXFxbMTFweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxMXB4O1xufVxyXG4udGV4dC1cXFxcWzEycHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbn1cclxuLnRleHQtXFxcXFsxM3B4XFxcXF0ge1xuICBmb250LXNpemU6IDEzcHg7XG59XHJcbi50ZXh0LVxcXFxbMTRweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxyXG4udGV4dC1cXFxcWzE1cHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMTVweDtcbn1cclxuLnRleHQtXFxcXFsxNnB4XFxcXF0ge1xuICBmb250LXNpemU6IDE2cHg7XG59XHJcbi50ZXh0LVxcXFxbMThweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxOHB4O1xufVxyXG4udGV4dC1cXFxcWzIwcHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMjBweDtcbn1cclxuLnRleHQtXFxcXFsyNXB4XFxcXF0ge1xuICBmb250LXNpemU6IDI1cHg7XG59XHJcbi50ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgZm9udC1zaXplOiAzMHB4O1xufVxyXG4udGV4dC1cXFxcWzQwcHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogNDBweDtcbn1cclxuLnRleHQtXFxcXFs2MHB4XFxcXF0ge1xuICBmb250LXNpemU6IDYwcHg7XG59XHJcbi50ZXh0LVxcXFxbOHB4XFxcXF0ge1xuICBmb250LXNpemU6IDhweDtcbn1cclxuLnRleHQtYmFzZSB7XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNXJlbTtcbn1cclxuLnRleHQtbGcge1xuICBmb250LXNpemU6IDEuMTI1cmVtO1xuICBsaW5lLWhlaWdodDogMS43NXJlbTtcbn1cclxuLnRleHQtc20ge1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbn1cclxuLnRleHQteGwge1xuICBmb250LXNpemU6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjc1cmVtO1xufVxyXG4udGV4dC14cyB7XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDFyZW07XG59XHJcbi5mb250LVxcXFxbNDAwXFxcXF0ge1xuICBmb250LXdlaWdodDogNDAwO1xufVxyXG4uZm9udC1cXFxcWzUwMFxcXFxdIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cclxuLmZvbnQtXFxcXFs2NTBcXFxcXSB7XG4gIGZvbnQtd2VpZ2h0OiA2NTA7XG59XHJcbi5mb250LVxcXFxbNzAwXFxcXF0ge1xuICBmb250LXdlaWdodDogNzAwO1xufVxyXG4uZm9udC1ib2xkIHtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbn1cclxuLmZvbnQtZXh0cmFsaWdodCB7XG4gIGZvbnQtd2VpZ2h0OiAyMDA7XG59XHJcbi5mb250LWxpZ2h0IHtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbn1cclxuLmZvbnQtbWVkaXVtIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cclxuLmZvbnQtbm9ybWFsIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbn1cclxuLmZvbnQtc2VtaWJvbGQge1xuICBmb250LXdlaWdodDogNjAwO1xufVxyXG4udXBwZXJjYXNlIHtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cclxuLmxvd2VyY2FzZSB7XG4gIHRleHQtdHJhbnNmb3JtOiBsb3dlcmNhc2U7XG59XHJcbi5jYXBpdGFsaXplIHtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG59XHJcbi5pdGFsaWMge1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XHJcbi50ZXh0LVxcXFxbXFxcXCMwMDI4NjJcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDAgNDAgOTggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcIzMzYmJmZlxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoNTEgMTg3IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjNDI0MjQyXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYig2NiA2NiA2NiAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjODc4Nzg3XFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxMzUgMTM1IDEzNSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjYTY0YjRlXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxNjYgNzUgNzggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcI2FjNDg0OFxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMTcyIDcyIDcyIC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbXFxcXCNjNDIxMjFcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDE5NiAzMyAzMyAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjZjU0MDVlXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyNDUgNjQgOTQgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcI2ZhYjAwNVxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjUwIDE3NiA1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbYmx1ZVxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMCAwIDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW2dyYXlcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDEyOCAxMjggMTI4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbZ3JlZW5cXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDAgMTI4IDAgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtncmV5XFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxMjggMTI4IDEyOCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW3JlZFxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjU1IDAgMCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1iYXNlLTEwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLnRleHQtYmFzZS1jb250ZW50IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1ibGFjayB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDAgMCAwIC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWJsdWUtNjAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMzcgOTkgMjM1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWdyYXktMzAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtZ3JheS00MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxNTYgMTYzIDE3NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1ncmF5LTUwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDEwNyAxMTQgMTI4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWdyYXktNzAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoNTUgNjUgODEgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtZ3JlZW4tNjAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjIgMTYzIDc0IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LW5ldXRyYWwge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1wcmltYXJ5LWNvbnRlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi50ZXh0LXJlZC01MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyMzkgNjggNjggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtcmVkLTYwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDIyMCAzOCAzOCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC10cmFuc3BhcmVudCB7XG4gIGNvbG9yOiB0cmFuc3BhcmVudDtcbn1cclxuLnRleHQtd2hpdGUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udW5kZXJsaW5lIHtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTtcbn1cclxuLm5vLXVuZGVybGluZSB7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiBub25lO1xufVxyXG4udW5kZXJsaW5lLW9mZnNldC0xIHtcbiAgdGV4dC11bmRlcmxpbmUtb2Zmc2V0OiAxcHg7XG59XHJcbi51bmRlcmxpbmUtb2Zmc2V0LTIge1xuICB0ZXh0LXVuZGVybGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLnVuZGVybGluZS1vZmZzZXQtOCB7XG4gIHRleHQtdW5kZXJsaW5lLW9mZnNldDogOHB4O1xufVxyXG4ub3BhY2l0eS01MCB7XG4gIG9wYWNpdHk6IDAuNTtcbn1cclxuLm9wYWNpdHktNzAge1xuICBvcGFjaXR5OiAwLjc7XG59XHJcbi5zaGFkb3cge1xuICAtLXR3LXNoYWRvdzogMCAxcHggM3B4IDAgcmdiKDAgMCAwIC8gMC4xKSwgMCAxcHggMnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKTtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAxcHggM3B4IDAgdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCAxcHggMnB4IC0xcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuLnNoYWRvdy1sZyB7XG4gIC0tdHctc2hhZG93OiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIDAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIDAuMSk7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMTBweCAxNXB4IC0zcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCA0cHggNnB4IC00cHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuLnNoYWRvdy1tZCB7XG4gIC0tdHctc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAwLjEpO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDRweCA2cHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDJweCA0cHggLTJweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xufVxyXG4ub3V0bGluZS1ub25lIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3V0bGluZSB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xufVxyXG4ub3V0bGluZS0xIHtcbiAgb3V0bGluZS13aWR0aDogMXB4O1xufVxyXG4ub3V0bGluZS1cXFxcWzFcXFxcLjVweFxcXFxdIHtcbiAgb3V0bGluZS13aWR0aDogMS41cHg7XG59XHJcbi5vdXRsaW5lLVxcXFxbXFxcXCMwMDdiZmZcXFxcXSB7XG4gIG91dGxpbmUtY29sb3I6ICMwMDdiZmY7XG59XHJcbi5vdXRsaW5lLXNsYXRlLTMwMFxcXFwvNTAge1xuICBvdXRsaW5lLWNvbG9yOiByZ2IoMjAzIDIxMyAyMjUgLyAwLjUpO1xufVxyXG4ucmluZy1cXFxcWzFweFxcXFxdIHtcbiAgLS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7XG4gIC0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMXB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSwgdmFyKC0tdHctcmluZy1zaGFkb3cpLCB2YXIoLS10dy1zaGFkb3csIDAgMCAjMDAwMCk7XG59XHJcbi5yaW5nLVxcXFxbMnB4XFxcXF0ge1xuICAtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpIHZhcigtLXR3LXJpbmctb2Zmc2V0LWNvbG9yKTtcbiAgLS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygycHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKTtcbn1cclxuLnJpbmctXFxcXFtcXFxcIzAwMjg2MlxcXFxdIHtcbiAgLS10dy1yaW5nLW9wYWNpdHk6IDE7XG4gIC0tdHctcmluZy1jb2xvcjogcmdiKDAgNDAgOTggLyB2YXIoLS10dy1yaW5nLW9wYWNpdHkpKTtcbn1cclxuLnJpbmctZ3JheS00MDAge1xuICAtLXR3LXJpbmctb3BhY2l0eTogMTtcbiAgLS10dy1yaW5nLWNvbG9yOiByZ2IoMTU2IDE2MyAxNzUgLyB2YXIoLS10dy1yaW5nLW9wYWNpdHkpKTtcbn1cclxuLnJpbmctb2Zmc2V0LTIge1xuICAtLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAycHg7XG59XHJcbi5ibHVyIHtcbiAgLS10dy1ibHVyOiBibHVyKDhweCk7XG4gIGZpbHRlcjogdmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KTtcbn1cclxuLmZpbHRlciB7XG4gIGZpbHRlcjogdmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KTtcbn1cclxuLnRyYW5zaXRpb24ge1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMTUwbXM7XG59XHJcbi50cmFuc2l0aW9uLWFsbCB7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGFsbDtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDE1MG1zO1xufVxyXG5cclxuYm9keSB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi8qIEN1c3RvbSBDU1MgdG8gaGlkZSBzY3JvbGxiYXIgKi9cclxuLmhpZGUtc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLmhpZGUtc2Nyb2xsYmFyIHtcclxuICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7IC8qIElFIGFuZCBFZGdlICovXHJcbiAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOyAvKiBGaXJlZm94ICovXHJcbn1cclxuXHJcbi8qIGJlbG93IGNzcyBjbGFzcyByZXBsYWNlIGJvb3RzdHJhcCBiYWNrZ3JvdW5kIGNvbG9yIHdpdGggZGFpc3kgKi9cclxuLm9wLWJnLXByaW1hcnkge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJnLXNlY29uZGFyeSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYmctaW5mbyB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC1iZy1zdWNjZXNzIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zdSxva2xjaCh2YXIoLS1zdSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJnLXdhcm5pbmcge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhLG9rbGNoKHZhcigtLXdhKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLyogYmVsb3cgY3NzIGNsYXNzIHJlcGxhY2UgYm9vdHN0cmFwIHRleHQgY29sb3Igd2l0aCBkYWlzeSAqL1xyXG4ub3AtdGV4dC1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtc2Vjb25kYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtaW5mbyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtc3VjY2VzcyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtd2FybmluZyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJvcmRlci1wcmltYXJ5IHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4vKiBDU1MgZm9yIHNjcm9sbGJhciBjdXN0b21pemF0aW9uICovXHJcbioge1xyXG4gIHNjcm9sbGJhci13aWR0aDogdGhpbjsgLyogRm9yIEZpcmVmb3ggKi9cclxuICBzY3JvbGxiYXItY29sb3I6IGdyYXk7IC8qIEZvciBGaXJlZm94ICovXHJcbn1cclxuXHJcbi8qIEZvciB3ZWJraXQtYmFzZWQgYnJvd3NlcnMgbGlrZSBDaHJvbWUsIFNhZmFyaSAqL1xyXG4qOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgd2lkdGg6IDVweDtcclxufVxyXG5cclxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG59XHJcblxyXG4qOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcclxuICBib3JkZXItcmFkaXVzOiAxMHB4O1xyXG59XHJcblxyXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcblxuICAubWRcXFxcOm9wLWJ0bi1zbSB7XG4gICAgaGVpZ2h0OiAycmVtO1xuICAgIG1pbi1oZWlnaHQ6IDJyZW07XG4gICAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICAgIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6b3AtYnRuLW1kIHtcbiAgICBoZWlnaHQ6IDNyZW07XG4gICAgbWluLWhlaWdodDogM3JlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gICAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICB9XG5cbiAgLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm1kXFxcXDpvcC1idG4tc20pIHtcbiAgICBoZWlnaHQ6IDJyZW07XG4gICAgd2lkdGg6IDJyZW07XG4gICAgcGFkZGluZzogMHB4O1xuICB9XG5cbiAgLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm1kXFxcXDpvcC1idG4tbWQpIHtcbiAgICBoZWlnaHQ6IDNyZW07XG4gICAgd2lkdGg6IDNyZW07XG4gICAgcGFkZGluZzogMHB4O1xuICB9XG5cbiAgLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm1kXFxcXDpvcC1idG4tc20pIHtcbiAgICBoZWlnaHQ6IDJyZW07XG4gICAgd2lkdGg6IDJyZW07XG4gICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIHBhZGRpbmc6IDBweDtcbiAgfVxuXG4gIC5vcC1idG4tY2lyY2xlOndoZXJlKC5tZFxcXFw6b3AtYnRuLW1kKSB7XG4gICAgaGVpZ2h0OiAzcmVtO1xuICAgIHdpZHRoOiAzcmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICBwYWRkaW5nOiAwcHg7XG4gIH1cbn1cclxuXHJcbi5hZnRlclxcXFw6YWJzb2x1dGU6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cclxuXHJcbi5hZnRlclxcXFw6c3RhcnQtXFxcXFsycHhcXFxcXTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgaW5zZXQtaW5saW5lLXN0YXJ0OiAycHg7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOnRvcC1cXFxcWzJweFxcXFxdOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICB0b3A6IDJweDtcbn1cclxuXHJcbi5hZnRlclxcXFw6aC00OjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICBoZWlnaHQ6IDFyZW07XG59XHJcblxyXG4uYWZ0ZXJcXFxcOnctNDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgd2lkdGg6IDFyZW07XG59XHJcblxyXG4uYWZ0ZXJcXFxcOnJvdW5kZWQtZnVsbDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xufVxyXG5cclxuLmFmdGVyXFxcXDpib3JkZXI6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xufVxyXG5cclxuLmFmdGVyXFxcXDpib3JkZXItZ3JheS0zMDA6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDIwOSAyMTMgMjE5IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuXHJcbi5hZnRlclxcXFw6Ymctd2hpdGU6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG5cclxuLmFmdGVyXFxcXDp0cmFuc2l0aW9uLWFsbDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogYWxsO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMTUwbXM7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOmNvbnRlbnQtXFxcXFtcXFxcJ1xcXFwnXFxcXF06OmFmdGVyIHtcbiAgLS10dy1jb250ZW50OiAnJztcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG59XHJcblxyXG4ubGFzdFxcXFw6bWItMFxcXFwuNTpsYXN0LWNoaWxkIHtcbiAgbWFyZ2luLWJvdHRvbTogMC4xMjVyZW07XG59XHJcblxyXG4uY2hlY2tlZFxcXFw6Ymctd2hpdGU6Y2hlY2tlZCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG5cclxuLmNoZWNrZWRcXFxcOlxcXFxbLS10Z2xiZ1xcXFw6XFxcXCMzMzY4ZmZcXFxcXTpjaGVja2VkIHtcbiAgLS10Z2xiZzogIzMzNjhmZjtcbn1cclxuXHJcbi5ob3ZlclxcXFw6Y3Vyc29yLXN3LXJlc2l6ZTpob3ZlciB7XG4gIGN1cnNvcjogc3ctcmVzaXplO1xufVxyXG5cclxuLmhvdmVyXFxcXDpib3JkZXItXFxcXFtcXFxcI2QyZTNmY1xcXFxdOmhvdmVyIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjEwIDIyNyAyNTIgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG5cclxuLmhvdmVyXFxcXDpib3JkZXItYmFzZS1jb250ZW50OmhvdmVyIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcblxyXG4uaG92ZXJcXFxcOmJnLVxcXFxbXFxcXCNlY2YzZmViN1xcXFxdOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjZjNmZWI3O1xufVxyXG5cclxuLmhvdmVyXFxcXDpiZy1iYXNlLTMwMDpob3ZlciB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcblxyXG4uaG92ZXJcXFxcOmJnLXRyYW5zcGFyZW50OmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XHJcblxyXG4uaG92ZXJcXFxcOnRleHQtYmFzZS1jb250ZW50OmhvdmVyIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5cclxuLmhvdmVyXFxcXDp0ZXh0LXdoaXRlOmhvdmVyIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6dW5kZXJsaW5lOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6bm8tdW5kZXJsaW5lOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7XG59XHJcblxyXG4uaG92ZXJcXFxcOnNoYWRvdy1sZzpob3ZlciB7XG4gIC0tdHctc2hhZG93OiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIDAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIDAuMSk7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMTBweCAxNXB4IC0zcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCA0cHggNnB4IC00cHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuXHJcbi5mb2N1c1xcXFw6YmctYmFzZS0zMDA6Zm9jdXMge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLmZvY3VzXFxcXDpvdXRsaW5lLW5vbmU6Zm9jdXMge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcblxyXG4uZGlzYWJsZWRcXFxcOnRleHQtXFxcXFtcXFxcIzVjNWM1Y1xcXFxdOmRpc2FibGVkIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoOTIgOTIgOTIgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuXHJcbi5ncm91cDpob3ZlciAuZ3JvdXAtaG92ZXJcXFxcOmJvcmRlci1iYXNlLWNvbnRlbnQge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuXHJcbi5wZWVyOmNoZWNrZWQgfiAucGVlci1jaGVja2VkXFxcXDpiZy1ibHVlLTYwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDM3IDk5IDIzNSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuXHJcbi5wZWVyOmNoZWNrZWQgfiAucGVlci1jaGVja2VkXFxcXDphZnRlclxcXFw6dHJhbnNsYXRlLXgtZnVsbDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgLS10dy10cmFuc2xhdGUteDogMTAwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcblxyXG4ucGVlcjpjaGVja2VkIH4gLnBlZXItY2hlY2tlZFxcXFw6YWZ0ZXJcXFxcOmJvcmRlci13aGl0ZTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG5cclxuLnBlZXI6Zm9jdXMgfiAucGVlci1mb2N1c1xcXFw6b3V0bGluZS1ub25lIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG5cclxuLnBlZXI6Zm9jdXMgfiAucGVlci1mb2N1c1xcXFw6cmluZy0xIHtcbiAgLS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7XG4gIC0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMXB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSwgdmFyKC0tdHctcmluZy1zaGFkb3cpLCB2YXIoLS10dy1zaGFkb3csIDAgMCAjMDAwMCk7XG59XHJcblxyXG4ucGVlcjpmb2N1cyB+IC5wZWVyLWZvY3VzXFxcXDpyaW5nLWJsYWNrIHtcbiAgLS10dy1yaW5nLW9wYWNpdHk6IDE7XG4gIC0tdHctcmluZy1jb2xvcjogcmdiKDAgMCAwIC8gdmFyKC0tdHctcmluZy1vcGFjaXR5KSk7XG59XHJcblxyXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcblxuICAubWRcXFxcOmNvbC1zcGFuLTEyIHtcbiAgICBncmlkLWNvbHVtbjogc3BhbiAxMiAvIHNwYW4gMTI7XG4gIH1cblxuICAubWRcXFxcOmNvbC1zcGFuLTYge1xuICAgIGdyaWQtY29sdW1uOiBzcGFuIDYgLyBzcGFuIDY7XG4gIH1cblxuICAubWRcXFxcOm0tMCB7XG4gICAgbWFyZ2luOiAwcHg7XG4gIH1cblxuICAubWRcXFxcOm0tMTAge1xuICAgIG1hcmdpbjogMi41cmVtO1xuICB9XG5cbiAgLm1kXFxcXDptLTIge1xuICAgIG1hcmdpbjogMC41cmVtO1xuICB9XG5cbiAgLm1kXFxcXDptLVxcXFxbMjBweFxcXFxdIHtcbiAgICBtYXJnaW46IDIwcHg7XG4gIH1cblxuICAubWRcXFxcOm14LTAge1xuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubWRcXFxcOm1iLTAge1xuICAgIG1hcmdpbi1ib3R0b206IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWItMSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6bWwtMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bXItMCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubWRcXFxcOm10LVxcXFxbNDFweFxcXFxdIHtcbiAgICBtYXJnaW4tdG9wOiA0MXB4O1xuICB9XG5cbiAgLm1kXFxcXDpibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICAubWRcXFxcOmlubGluZS1ibG9jayB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG5cbiAgLm1kXFxcXDpmbGV4IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgLm1kXFxcXDpoLVxcXFxbMjAwcHhcXFxcXSB7XG4gICAgaGVpZ2h0OiAyMDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6aC1cXFxcWzQwMHB4XFxcXF0ge1xuICAgIGhlaWdodDogNDAwcHg7XG4gIH1cblxuICAubWRcXFxcOmgtXFxcXFs0MHB4XFxcXF0ge1xuICAgIGhlaWdodDogNDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6aC1cXFxcWzY2cHhcXFxcXSB7XG4gICAgaGVpZ2h0OiA2NnB4O1xuICB9XG5cbiAgLm1kXFxcXDpoLVxcXFxbOTVcXFxcJVxcXFxdIHtcbiAgICBoZWlnaHQ6IDk1JTtcbiAgfVxuXG4gIC5tZFxcXFw6bWF4LWgtXFxcXFs0MDBweFxcXFxdIHtcbiAgICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWluLWgtZnVsbCB7XG4gICAgbWluLWhlaWdodDogMTAwJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzEwMFxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMjAwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDIwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMjNcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogMjMlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMjUwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDI1MHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMzAwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDMwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMzUwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDM1MHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNDBcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNDAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNDAwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDQwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNVxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA1JTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzUwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDUwJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA1MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzU1XFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDU1JTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzU3XFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDU3JTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzYwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDYwJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzcwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDcwJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzkyXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDkyJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzk1XFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDk1JTtcbiAgfVxuXG4gIC5tZFxcXFw6bWluLXctXFxcXFs0NDBweFxcXFxdIHtcbiAgICBtaW4td2lkdGg6IDQ0MHB4O1xuICB9XG5cbiAgLm1kXFxcXDptaW4tdy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIG1pbi13aWR0aDogNTAwcHg7XG4gIH1cblxuICAubWRcXFxcOm1pbi13LWZ1bGwge1xuICAgIG1pbi13aWR0aDogMTAwJTtcbiAgfVxuXG4gIC5tZFxcXFw6bWF4LXctXFxcXFs0MDBweFxcXFxdIHtcbiAgICBtYXgtd2lkdGg6IDQwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDptYXgtdy1cXFxcWzQ1MHB4XFxcXF0ge1xuICAgIG1heC13aWR0aDogNDUwcHg7XG4gIH1cblxuICAubWRcXFxcOm1heC13LVxcXFxbNTAwcHhcXFxcXSB7XG4gICAgbWF4LXdpZHRoOiA1MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6Z3JpZC1jb2xzLTIge1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTtcbiAgfVxuXG4gIC5tZFxcXFw6ZmxleC1yb3cge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cblxuICAubWRcXFxcOml0ZW1zLWNlbnRlciB7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxuXG4gIC5tZFxcXFw6anVzdGlmeS1iZXR3ZWVuIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIH1cblxuICAubWRcXFxcOmdhcC02IHtcbiAgICBnYXA6IDEuNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6Z2FwLVxcXFxbMTJweFxcXFxdIHtcbiAgICBnYXA6IDEycHg7XG4gIH1cblxuICAubWRcXFxcOmdhcC1cXFxcWzhweFxcXFxdIHtcbiAgICBnYXA6IDhweDtcbiAgfVxuXG4gIC5tZFxcXFw6Z2FwLXktMCB7XG4gICAgcm93LWdhcDogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpwLTEwIHtcbiAgICBwYWRkaW5nOiAyLjVyZW07XG4gIH1cblxuICAubWRcXFxcOnAtNCB7XG4gICAgcGFkZGluZzogMXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cC01IHtcbiAgICBwYWRkaW5nOiAxLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpweS0wIHtcbiAgICBwYWRkaW5nLXRvcDogMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAwcHg7XG4gIH1cblxuICAubWRcXFxcOnB5LTUge1xuICAgIHBhZGRpbmctdG9wOiAxLjI1cmVtO1xuICAgIHBhZGRpbmctYm90dG9tOiAxLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpwYi00IHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cGwtOCB7XG4gICAgcGFkZGluZy1sZWZ0OiAycmVtO1xuICB9XG5cbiAgLm1kXFxcXDpwci0wIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubWRcXFxcOnB0LTMge1xuICAgIHBhZGRpbmctdG9wOiAwLjc1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LWVuZCB7XG4gICAgdGV4dC1hbGlnbjogZW5kO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LTJ4bCB7XG4gICAgZm9udC1zaXplOiAxLjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDJyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQtM3hsIHtcbiAgICBmb250LXNpemU6IDEuODc1cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAyLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LVxcXFxbMTNweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDEzcHg7XG4gIH1cblxuICAubWRcXFxcOnRleHQtXFxcXFsxNXB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgfVxuXG4gIC5tZFxcXFw6dGV4dC1cXFxcWzIzcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAyM3B4O1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDMwcHg7XG4gIH1cblxuICAubWRcXFxcOnRleHQtYmFzZSB7XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQtbGcge1xuICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQtc20ge1xuICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQteGwge1xuICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgfVxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuXG4gIC5sZ1xcXFw6cmVsYXRpdmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxuXG4gIC5sZ1xcXFw6b3JkZXItbm9uZSB7XG4gICAgb3JkZXI6IDA7XG4gIH1cblxuICAubGdcXFxcOmNvbC1zcGFuLTEyIHtcbiAgICBncmlkLWNvbHVtbjogc3BhbiAxMiAvIHNwYW4gMTI7XG4gIH1cblxuICAubGdcXFxcOmNvbC1zcGFuLTYge1xuICAgIGdyaWQtY29sdW1uOiBzcGFuIDYgLyBzcGFuIDY7XG4gIH1cblxuICAubGdcXFxcOm14LTAge1xuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubGdcXFxcOm1sLTQge1xuICAgIG1hcmdpbi1sZWZ0OiAxcmVtO1xuICB9XG5cbiAgLmxnXFxcXDpibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICAubGdcXFxcOmhpZGRlbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzQwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDQwJTtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzQwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA0MDBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA1MDBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6cC0xMCB7XG4gICAgcGFkZGluZzogMi41cmVtO1xuICB9XG5cbiAgLmxnXFxcXDpwLTE2IHtcbiAgICBwYWRkaW5nOiA0cmVtO1xuICB9XG5cbiAgLmxnXFxcXDpwLTQge1xuICAgIHBhZGRpbmc6IDFyZW07XG4gIH1cblxuICAubGdcXFxcOnRleHQtXFxcXFsxMjBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDEyMHB4O1xuICB9XG5cbiAgLmxnXFxcXDp0ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDMwcHg7XG4gIH1cblxuICAubGdcXFxcOnRleHQtXFxcXFs1MHB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogNTBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6dGV4dC1sZyB7XG4gICAgZm9udC1zaXplOiAxLjEyNXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgfVxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDEyODBweCkge1xuXG4gIC54bFxcXFw6bXQtXFxcXFs2M3B4XFxcXF0ge1xuICAgIG1hcmdpbi10b3A6IDYzcHg7XG4gIH1cblxuICAueGxcXFxcOnctXFxcXFs1MDBweFxcXFxdIHtcbiAgICB3aWR0aDogNTAwcHg7XG4gIH1cbn1cclxuXHJcbkBtZWRpYSAobWluLXdpZHRoOiAxNTM2cHgpIHtcblxuICAuXFxcXDMyeGxcXFxcOm0tNSB7XG4gICAgbWFyZ2luOiAxLjI1cmVtO1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDptdC1cXFxcWzYzcHhcXFxcXSB7XG4gICAgbWFyZ2luLXRvcDogNjNweDtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6bWF4LXctXFxcXFs1MDBweFxcXFxdIHtcbiAgICBtYXgtd2lkdGg6IDUwMHB4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDpwLTMge1xuICAgIHBhZGRpbmc6IDAuNzVyZW07XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOnB4LVxcXFxbMTVweFxcXFxdIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gICAgcGFkZGluZy1yaWdodDogMTVweDtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6cHktXFxcXFsxMHB4XFxcXF0ge1xuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDp0ZXh0LVxcXFxbMjBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOnRleHQtXFxcXFsyNXB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogMjVweDtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6dGV4dC1cXFxcWzMwcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAzMHB4O1xuICB9XG59XHJcblxyXG4ucGVlcjpjaGVja2VkIH4gLnJ0bFxcXFw6cGVlci1jaGVja2VkXFxcXDphZnRlclxcXFw6LXRyYW5zbGF0ZS14LWZ1bGw6d2hlcmUoW2Rpcj1cInJ0bFwiXSwgW2Rpcj1cInJ0bFwiXSAqKTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgLS10dy10cmFuc2xhdGUteDogLTEwMCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG5cclxuQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xuXG4gIC5kYXJrXFxcXDpib3JkZXItYmxhY2sge1xuICAgIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMCAwIDAgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xuICB9XG5cbiAgLmRhcmtcXFxcOmJnLWdyYXktNzAwIHtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDU1IDY1IDgxIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xuICB9XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvaW5kZXguY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBOztDQUFjLENBQWQ7OztDQUFjOztBQUFkOzs7RUFBQSxzQkFBYyxFQUFkLE1BQWM7RUFBZCxlQUFjLEVBQWQsTUFBYztFQUFkLG1CQUFjLEVBQWQsTUFBYztFQUFkLHFCQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOztFQUFBLGdCQUFjO0FBQUE7O0FBQWQ7Ozs7Ozs7O0NBQWM7O0FBQWQ7O0VBQUEsZ0JBQWMsRUFBZCxNQUFjO0VBQWQsOEJBQWMsRUFBZCxNQUFjLEVBQWQsTUFBYztFQUFkLFdBQWMsRUFBZCxNQUFjO0VBQWQsK0hBQWMsRUFBZCxNQUFjO0VBQWQsNkJBQWMsRUFBZCxNQUFjO0VBQWQsK0JBQWMsRUFBZCxNQUFjO0VBQWQsd0NBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkO0VBQUEsU0FBYyxFQUFkLE1BQWM7RUFBZCxvQkFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7OztDQUFjOztBQUFkO0VBQUEsU0FBYyxFQUFkLE1BQWM7RUFBZCxjQUFjLEVBQWQsTUFBYztFQUFkLHFCQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkO0VBQUEseUNBQWM7VUFBZCxpQ0FBYztBQUFBOztBQUFkOztDQUFjOztBQUFkOzs7Ozs7RUFBQSxrQkFBYztFQUFkLG9CQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7RUFBQSxjQUFjO0VBQWQsd0JBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7RUFBQSxtQkFBYztBQUFBOztBQUFkOzs7OztDQUFjOztBQUFkOzs7O0VBQUEsK0dBQWMsRUFBZCxNQUFjO0VBQWQsNkJBQWMsRUFBZCxNQUFjO0VBQWQsK0JBQWMsRUFBZCxNQUFjO0VBQWQsY0FBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGNBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7RUFBQSxjQUFjO0VBQWQsY0FBYztFQUFkLGtCQUFjO0VBQWQsd0JBQWM7QUFBQTs7QUFBZDtFQUFBLGVBQWM7QUFBQTs7QUFBZDtFQUFBLFdBQWM7QUFBQTs7QUFBZDs7OztDQUFjOztBQUFkO0VBQUEsY0FBYyxFQUFkLE1BQWM7RUFBZCxxQkFBYyxFQUFkLE1BQWM7RUFBZCx5QkFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7OztDQUFjOztBQUFkOzs7OztFQUFBLG9CQUFjLEVBQWQsTUFBYztFQUFkLDhCQUFjLEVBQWQsTUFBYztFQUFkLGdDQUFjLEVBQWQsTUFBYztFQUFkLGVBQWMsRUFBZCxNQUFjO0VBQWQsb0JBQWMsRUFBZCxNQUFjO0VBQWQsb0JBQWMsRUFBZCxNQUFjO0VBQWQsdUJBQWMsRUFBZCxNQUFjO0VBQWQsY0FBYyxFQUFkLE1BQWM7RUFBZCxTQUFjLEVBQWQsTUFBYztFQUFkLFVBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7O0VBQUEsb0JBQWM7QUFBQTs7QUFBZDs7O0NBQWM7O0FBQWQ7Ozs7RUFBQSwwQkFBYyxFQUFkLE1BQWM7RUFBZCw2QkFBYyxFQUFkLE1BQWM7RUFBZCxzQkFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGFBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGdCQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7RUFBQSx3QkFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkOztFQUFBLFlBQWM7QUFBQTs7QUFBZDs7O0NBQWM7O0FBQWQ7RUFBQSw2QkFBYyxFQUFkLE1BQWM7RUFBZCxvQkFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLHdCQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkO0VBQUEsMEJBQWMsRUFBZCxNQUFjO0VBQWQsYUFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGtCQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7Ozs7Ozs7Ozs7Ozs7RUFBQSxTQUFjO0FBQUE7O0FBQWQ7RUFBQSxTQUFjO0VBQWQsVUFBYztBQUFBOztBQUFkO0VBQUEsVUFBYztBQUFBOztBQUFkOzs7RUFBQSxnQkFBYztFQUFkLFNBQWM7RUFBZCxVQUFjO0FBQUE7O0FBQWQ7O0NBQWM7QUFBZDtFQUFBLFVBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGdCQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkOztFQUFBLFVBQWMsRUFBZCxNQUFjO0VBQWQsY0FBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7RUFBQSxlQUFjO0FBQUE7O0FBQWQ7O0NBQWM7QUFBZDtFQUFBLGVBQWM7QUFBQTs7QUFBZDs7OztDQUFjOztBQUFkOzs7Ozs7OztFQUFBLGNBQWMsRUFBZCxNQUFjO0VBQWQsc0JBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7O0VBQUEsZUFBYztFQUFkLFlBQWM7QUFBQTs7QUFBZCx3RUFBYztBQUFkO0VBQUEsYUFBYztBQUFBOztBQUFkOztFQUFBLHVEQUFjO0VBQWQ7QUFBYzs7QUFBZDs7RUFBQTtJQUFBLG1CQUFjO0lBQWQscUJBQWM7SUFBZCxzQkFBYztJQUFkLHFCQUFjO0lBQWQsc0JBQWM7SUFBZCxxQkFBYztJQUFkLHNCQUFjO0lBQWQscUJBQWM7SUFBZCxzQkFBYztJQUFkLHNCQUFjO0lBQWQsc0JBQWM7SUFBZCxzQkFBYztJQUFkLHNCQUFjO0lBQWQsc0JBQWM7SUFBZCx1QkFBYztJQUFkLHNC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bUJBQW9CO0lBQXBCO0VBQW9COztFQUFwQjtJQUFBLHNCQUFvQjtJQUFwQiwwRUFBb0I7SUFBcEIsa0JBQW9CO0lBQXBCO0VBQW9COztFQUFwQjs7SUFBQTtNQUFBOzs7O1dBQW9CO01BQXBCOzs7OztJQUFvQjtFQUFBOztFQUFwQjs7SUFBQTtNQUFBLHNEQUFvQjtNQUFwQjtJQUFvQjtFQUFBOztFQUFwQjtJQUFBLG9CQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7SUFBQTtFQUFvQjs7RUFBcEI7O0lBQUE7TUFBQTtJQUFvQjtFQUFBOztFQUFwQjtJQUFBLHNCQUFvQjtJQUFwQiwwRUFBb0I7SUFBcEIsa0JBQW9CO0lBQXBCLDBFQUFvQjtJQUFwQixvQkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCO0lBQUEsb0JBQW9CO0lBQXBCO0VBQW9COztFQUFwQjs7SUFBQTtNQUFBLHFGQUFvQjtNQUFwQjtJQUFvQjtFQUFBOztFQUFwQjtJQUFBLG9CQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7O0lBQUE7TUFBQSxxRkFBb0I7TUFBcEI7SUFBb0I7RUFBQTs7RUFBcEI7SUFBQSxvQkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCOztJQUFBO01BQUEscUZBQW9CO01BQXBCO0lBQW9CO0VBQUE7O0VBQXBCO0lBQUEsb0JBQW9CO0lBQXBCO0VBQW9COztFQUFwQjs7SUFBQTtNQUFBLHVGQUFvQjtNQUFwQjtJQUFvQjtFQUFBOztFQUFwQjtJQUFBLG9CQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7O0lBQUE7TUFBQSx1RkFBb0I7TUFBcEI7SUFBb0I7RUFBQTs7RUFBcEI7SUFBQSxvQkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCOztJQUFBO01BQUEsdUZBQW9CO01BQXBCO0lBQW9CO0VBQUE7O0VBQXBCO0lBQUEsb0JBQW9CO0lBQXBCO0VBQW9COztFQUFwQjs7SUFBQTtNQUFBLHVGQUFvQjtNQUFwQjtJQUFvQjtFQUFBOztFQUFwQjs7O0lBQUEsc0JBQW9CO0lBQXBCLHdFQUFvQjtJQUFwQixvQkFBb0I7SUFBcEIsaUVBQW9CO0lB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QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxlQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsK0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsMEJBQW1CO0VBQW5CLHVCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsMEJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEseUJBQW1CO1VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDRCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsZUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDBFQUFtQjtFQUFuQiw4RkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSwrRUFBbUI7RUFBbkIsbUdBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsNkVBQW1CO0VBQW5CLGlHQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLDhCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSwyR0FBbUI7RUFBbkIseUdBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsMkdBQW1CO0VBQW5CLHlHQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxnS0FBbUI7RUFBbkIsd0pBQW1CO0VBQW5CLGlMQUFtQjtFQUFuQix3REFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSx3QkFBbUI7RUFBbkIsd0RBQW1CO0VBQW5CO0FBQW1COztBQUVuQjtFQUNFLHVCQUF1QjtBQUN6Qjs7QUFFQSxpQ0FBaUM7QUFDakM7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSx3QkFBd0IsRUFBRSxnQkFBZ0I7RUFDMUMscUJBQXFCLEVBQUUsWUFBWTtBQUNyQzs7QUFFQSxrRUFBa0U7QUFFaEU7RUFBQSxrQkFBaUI7RUFBakI7QUFBaUI7QUFHakI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFHbkI7RUFBQSxrQkFBYztFQUFkO0FBQWM7QUFHZDtFQUFBLGtCQUFpQjtFQUFqQjtBQUFpQjtBQUdqQjtFQUFBLGtCQUFpQjtFQUFqQjtBQUFpQjs7QUFHbkIsNERBQTREO0FBRTFEO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBR25CO0VBQUEsb0JBQXFCO0VBQXJCO0FBQXFCO0FBR3JCO0VBQUEsb0JBQWdCO0VBQWhCO0FBQWdCO0FBR2hCO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBR25CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBR25CO0VBQUEsc0JBQW9CO0VBQXBCO0FBQW9CO0FBRXRCLG9DQUFvQztBQUNwQztFQUNFLHFCQUFxQixFQUFFLGdCQUFnQjtFQUN2QyxxQkFBcUIsRUFBRSxnQkFBZ0I7QUFDekM7O0FBRUEsa0RBQWtEO0FBQ2xEO0VBQ0UsVUFBVTtBQUNaOztBQUVBO0VBQ0UsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLG1CQUFtQjtBQUNyQjs7QUF4RUE7O0VBQUE7SUFBQSxZQXdFQztJQXhFRCxnQkF3RUM7SUF4RUQscUJBd0VDO0lBeEVELHNCQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQSxZQXdFQztJQXhFRCxnQkF3RUM7SUF4RUQsa0JBd0VDO0lBeEVELG1CQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQSxZQXdFQztJQXhFRCxXQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQSxZQXdFQztJQXhFRCxXQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQSxZQXdFQztJQXhFRCxXQXdFQztJQXhFRCxxQkF3RUM7SUF4RUQ7RUF3RUM7O0VBeEVEO0lBQUEsWUF3RUM7SUF4RUQsV0F3RUM7SUF4RUQscUJBd0VDO0lBeEVEO0VBd0VDO0FBQUE7O0FBeEVEO0VBQUEsMEJBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLDBCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSwwQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsMEJBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLDBCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSwwQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsMEJBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLDBCQXdFQztFQXhFRCxzQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsMEJBd0VDO0VBeEVELGtCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSwwQkF3RUM7RUF4RUQsd0JBd0VDO0VBeEVELHdEQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSxnQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUE7QUF3RUM7O0FBeEVEO0VBQUEsa0JBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBO0FBd0VDOztBQXhFRDtFQUFBO0FBd0VDOztBQXhFRDtFQUFBLHNCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSxzQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUE7QUF3RUM7O0FBeEVEO0VBQUEsa0JBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBO0FBd0VDOztBQXhFRDtFQUFBLG9CQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSxvQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUE7QUF3RUM7O0FBeEVEO0VBQUE7QUF3RUM7O0FBeEVEO0VBQUEsK0VBd0VDO0VBeEVELG1HQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSxrQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsOEJBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLG9CQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSxzQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsa0JBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDtFQUFBLDBCQXdFQztFQXhFRCxzQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsMEJBd0VDO0VBeEVELHNCQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSw4QkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEO0VBQUEsMkdBd0VDO0VBeEVELHlHQXdFQztFQXhFRDtBQXdFQzs7QUF4RUQ7RUFBQSxvQkF3RUM7RUF4RUQ7QUF3RUM7O0FBeEVEOztFQUFBO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUEsZ0JBd0VDO0lBeEVEO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBLGdCQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQSxvQkF3RUM7SUF4RUQ7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUEsaUJBd0VDO0lBeEVEO0VBd0VDOztFQXhFRDtJQUFBLG1CQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQSxlQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQSxtQkF3RUM7SUF4RUQ7RUF3RUM7O0VBeEVEO0lBQUEsbUJBd0VDO0lBeEVEO0VBd0VDOztFQXhFRDtJQUFBLGtCQXdFQztJQXhFRDtFQXdFQztBQUFBOztBQXhFRDs7RUFBQTtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBLGdCQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQSxtQkF3RUM7SUF4RUQ7RUF3RUM7QUFBQTs7QUF4RUQ7O0VBQUE7SUFBQTtFQXdFQzs7RUF4RUQ7SUFBQTtFQXdFQztBQUFBOztBQXhFRDs7RUFBQTtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBO0VBd0VDOztFQXhFRDtJQUFBLGtCQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQSxpQkF3RUM7SUF4RUQ7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7O0VBeEVEO0lBQUE7RUF3RUM7QUFBQTs7QUF4RUQ7RUFBQSwwQkF3RUM7RUF4RUQsdUJBd0VDO0VBeEVEO0FBd0VDOztBQXhFRDs7RUFBQTtJQUFBLHNCQXdFQztJQXhFRDtFQXdFQzs7RUF4RUQ7SUFBQSxrQkF3RUM7SUF4RUQ7RUF3RUM7QUFBQVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJAdGFpbHdpbmQgYmFzZTtcXHJcXG5AdGFpbHdpbmQgY29tcG9uZW50cztcXHJcXG5AdGFpbHdpbmQgdXRpbGl0aWVzO1xcclxcblxcclxcbmJvZHkge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi8qIEN1c3RvbSBDU1MgdG8gaGlkZSBzY3JvbGxiYXIgKi9cXHJcXG4uaGlkZS1zY3JvbGxiYXI6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcXHJcXG4gIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5oaWRlLXNjcm9sbGJhciB7XFxyXFxuICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7IC8qIElFIGFuZCBFZGdlICovXFxyXFxuICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7IC8qIEZpcmVmb3ggKi9cXHJcXG59XFxyXFxuXFxyXFxuLyogYmVsb3cgY3NzIGNsYXNzIHJlcGxhY2UgYm9vdHN0cmFwIGJhY2tncm91bmQgY29sb3Igd2l0aCBkYWlzeSAqL1xcclxcbi5vcC1iZy1wcmltYXJ5IHtcXHJcXG4gIEBhcHBseSBiZy1wcmltYXJ5O1xcclxcbn1cXHJcXG4ub3AtYmctc2Vjb25kYXJ5IHtcXHJcXG4gIEBhcHBseSBiZy1zZWNvbmRhcnk7XFxyXFxufVxcclxcbi5vcC1iZy1pbmZvIHtcXHJcXG4gIEBhcHBseSBiZy1pbmZvO1xcclxcbn1cXHJcXG4ub3AtYmctc3VjY2Vzc3tcXHJcXG4gIEBhcHBseSBiZy1zdWNjZXNzO1xcclxcbn1cXHJcXG4ub3AtYmctd2FybmluZyB7XFxyXFxuICBAYXBwbHkgYmctd2FybmluZztcXHJcXG59XFxyXFxuXFxyXFxuLyogYmVsb3cgY3NzIGNsYXNzIHJlcGxhY2UgYm9vdHN0cmFwIHRleHQgY29sb3Igd2l0aCBkYWlzeSAqL1xcclxcbi5vcC10ZXh0LXByaW1hcnkge1xcclxcbiAgQGFwcGx5IHRleHQtcHJpbWFyeTtcXHJcXG59XFxyXFxuLm9wLXRleHQtc2Vjb25kYXJ5IHtcXHJcXG4gIEBhcHBseSB0ZXh0LXNlY29uZGFyeTtcXHJcXG59XFxyXFxuLm9wLXRleHQtaW5mbyB7XFxyXFxuICBAYXBwbHkgdGV4dC1pbmZvO1xcclxcbn1cXHJcXG4ub3AtdGV4dC1zdWNjZXNze1xcclxcbiAgQGFwcGx5IHRleHQtc3VjY2VzcztcXHJcXG59XFxyXFxuLm9wLXRleHQtd2FybmluZyB7XFxyXFxuICBAYXBwbHkgdGV4dC13YXJuaW5nO1xcclxcbn1cXHJcXG4ub3AtYm9yZGVyLXByaW1hcnl7XFxyXFxuICBAYXBwbHkgYm9yZGVyLXByaW1hcnlcXHJcXG59XFxyXFxuLyogQ1NTIGZvciBzY3JvbGxiYXIgY3VzdG9taXphdGlvbiAqL1xcclxcbioge1xcclxcbiAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOyAvKiBGb3IgRmlyZWZveCAqL1xcclxcbiAgc2Nyb2xsYmFyLWNvbG9yOiBncmF5OyAvKiBGb3IgRmlyZWZveCAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBGb3Igd2Via2l0LWJhc2VkIGJyb3dzZXJzIGxpa2UgQ2hyb21lLCBTYWZhcmkgKi9cXHJcXG4qOjotd2Via2l0LXNjcm9sbGJhciB7XFxyXFxuICB3aWR0aDogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4qOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXHJcXG59XFxyXFxuXFxyXFxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzBfX18gZnJvbSBcIi0hLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvYmxhY2stYWxwaGEuY3NzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8xX19fIGZyb20gXCItIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL21hdXZlLmNzc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMl9fXyBmcm9tIFwiLSEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy92aW9sZXQuY3NzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMF9fXyk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMV9fXyk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMl9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5Db250ZXh0TWVudUNvbnRlbnQsXHJcbi5Db250ZXh0TWVudVN1YkNvbnRlbnQge1xyXG4gIG1pbi13aWR0aDogMTM1cHg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgcGFkZGluZzogNXB4O1xyXG4gIGJveC1zaGFkb3c6XHJcbiAgICAwcHggMTBweCAzOHB4IC0xMHB4IHJnYmEoMjIsIDIzLCAyNCwgMC4zNSksXHJcbiAgICAwcHggMTBweCAyMHB4IC0xNXB4IHJnYmEoMjIsIDIzLCAyNCwgMC4yKTtcclxuICB6LWluZGV4OiA5OTtcclxufVxyXG5cclxuLkNvbnRleHRNZW51SXRlbSxcclxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtLFxyXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW0sXHJcbi5Db250ZXh0TWVudVN1YlRyaWdnZXIge1xyXG4gIGZvbnQtc2l6ZTogMTNweDtcclxuICBsaW5lLWhlaWdodDogMTtcclxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcclxuICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGhlaWdodDogMjVweDtcclxuICBwYWRkaW5nOiAwIDVweDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgcGFkZGluZy1sZWZ0OiAxNXB4O1xyXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyW2RhdGEtc3RhdGU9XCJvcGVuXCJdIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xyXG59XHJcblxyXG4uQ29udGV4dE1lbnVJdGVtW2RhdGEtZGlzYWJsZWRdLFxyXG4uQ29udGV4dE1lbnVDaGVja2JveEl0ZW1bZGF0YS1kaXNhYmxlZF0sXHJcbi5Db250ZXh0TWVudVJhZGlvSXRlbVtkYXRhLWRpc2FibGVkXSxcclxuLkNvbnRleHRNZW51U3ViVHJpZ2dlcltkYXRhLWRpc2FibGVkXSB7XHJcbiAgY29sb3I6IHZhcigtLW1hdXZlLTgpO1xyXG4gIHBvaW50ZXItZXZlbnRzOiBcIm5vbmVcIjtcclxufVxyXG5cclxuLkNvbnRleHRNZW51SXRlbVtkYXRhLWhpZ2hsaWdodGVkXSxcclxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdLFxyXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW1bZGF0YS1oaWdobGlnaHRlZF0sXHJcbi5Db250ZXh0TWVudVN1YlRyaWdnZXJbZGF0YS1oaWdobGlnaHRlZF0ge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNkYWQ5ZGI7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XHJcbn1cclxuXHJcbi5Db250ZXh0TWVudUxhYmVsIHtcclxuICBwYWRkaW5nLWxlZnQ6IDI1cHg7XHJcbiAgZm9udC1zaXplOiAxMnB4O1xyXG4gIGxpbmUtaGVpZ2h0OiAyNXB4O1xyXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS0xMSk7XHJcbn1cclxuXHJcbi5Db250ZXh0TWVudUl0ZW1JbmRpY2F0b3Ige1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBsZWZ0OiAwO1xyXG4gIHdpZHRoOiAyNXB4O1xyXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbn1cclxuXHJcbi5SaWdodFNsb3Qge1xyXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xyXG4gIHBhZGRpbmctbGVmdDogMjBweDtcclxuICBjb2xvcjogdmFyKC0tbWF1dmUtMTEpO1xyXG59XHJcblxyXG5bZGF0YS1oaWdobGlnaHRlZF0gPiAuUmlnaHRTbG90IHtcclxuICBjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbltkYXRhLWRpc2FibGVkXSAuUmlnaHRTbG90IHtcclxuICBjb2xvcjogdmFyKC0tbWF1dmUtOCk7XHJcbn1cclxuXHJcbi5kcm9wZG93bi1tZW51IHtcclxuICBtaW4td2lkdGg6IDEwcmVtO1xyXG59XHJcblxyXG4uZHJvcGRvd24taXRlbSB7XHJcbiAgZGlzcGxheTogYmxvY2s7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgcGFkZGluZzogMC4zcmVtIDEuMnJlbTtcclxuICBjbGVhcjogYm90aDtcclxuICBmb250LXdlaWdodDogNDAwO1xyXG4gIGNvbG9yOiAjMzkzYTM5O1xyXG4gIHRleHQtYWxpZ246IGluaGVyaXQ7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcclxuICBib3JkZXI6IDA7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4uZHJvcGRvd24taXRlbTpob3ZlciB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RhZDlkYjtcclxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcclxufVxyXG5cclxuLm1vZGFsIHtcclxuICBtYXJnaW4tdG9wOiA1MHB4O1xyXG59XHJcbi5wZGZOYW1lIHtcclxuICBmb250LXNpemU6IDEwcHg7XHJcbiAgZm9udC13ZWlnaHQ6IDYwMDtcclxufVxyXG5cclxuXHJcbi5oclN0eWxlIHtcclxuICBtYXJnaW4tdG9wOiAwcmVtICFpbXBvcnRhbnQ7XHJcbiAgbWFyZ2luLWJvdHRvbTogMHJlbSAhaW1wb3J0YW50O1xyXG4gIGJvcmRlcjogMDtcclxuICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpO1xyXG59XHJcblxyXG4uc3RhdHVzLWJhZGdlIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgdG9wOiAwO1xyXG4gIHJpZ2h0OiAwO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XHJcbiAgd2lkdGg6IDI0cHg7XHJcbiAgaGVpZ2h0OiAyNHB4O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcclxufVxyXG5cclxuLnN0YXR1cy1iYWRnZSBpIHtcclxuICBmb250LXNpemU6IDEycHg7XHJcbn1cclxuXHJcbi8qIFN0YXR1cy1zcGVjaWZpYyBjb2xvcnMgKi9cclxuLmNvbXBsZXRlZCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzRjYWY1MDtcclxuICBjb2xvcjogI2ZmZjtcclxufVxyXG5cclxuLmluLXByb2dyZXNzIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZjMTA3O1xyXG4gIGNvbG9yOiAjZmZmO1xyXG59XHJcblxyXG4uZGVjbGluZWQge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcbi5leHBpcmVkIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOWU5ZTllO1xyXG4gIGNvbG9yOiAjZmZmO1xyXG59XHJcblxyXG4uZHJhZnQge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICMwNzljZGM7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcblxyXG4uc29ydCB7XHJcbiAgcGFkZGluZzogOHB4IDE1cHg7XHJcbiAgbWFyZ2luOiA1cHg7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLnNvcnQ6aG92ZXIge1xyXG4gIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDE2OCwgMjA0LCAyMDYsIDAuMSk7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWF1dmUtMyk7XHJcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xyXG59XHJcblxyXG4uZmlsZU5hbWUge1xyXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICB3aWR0aDogMTAwcHg7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbiAgZm9udC1zaXplOiAxMXB4O1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICBmb250LXdlaWdodDogNDgwO1xyXG59XHJcblxyXG5hIHtcclxuICBhbGw6IHVuc2V0O1xyXG59XHJcblxyXG4uSG92ZXJDYXJkQ29udGVudCB7XHJcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xyXG4gIHBhZGRpbmc6IDVweCAxMHB4O1xyXG4gIHdpZHRoOiAxNzBweDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICBib3gtc2hhZG93OlxyXG4gICAgaHNsKDIwNiAyMiUgNyUgLyAzNSUpIDBweCAxMHB4IDM4cHggLTEwcHgsXHJcbiAgICBoc2woMjA2IDIyJSA3JSAvIDIwJSkgMHB4IDEwcHggMjBweCAtMTVweDtcclxuICBhbmltYXRpb24tZHVyYXRpb246IDQwMG1zO1xyXG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xyXG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cInRvcFwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlRG93bkFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cInJpZ2h0XCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVMZWZ0QW5kRmFkZTtcclxufVxyXG5cclxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVwiYm90dG9tXCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVVcEFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cImxlZnRcIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVJpZ2h0QW5kRmFkZTtcclxufVxyXG5cclxuLkhvdmVyQ2FyZEFycm93IHtcclxuICBmaWxsOiB3aGl0ZTtcclxufVxyXG5cclxuQGtleWZyYW1lcyBzbGlkZVVwQW5kRmFkZSB7XHJcbiAgMCUge1xyXG4gICAgb3BhY2l0eTogMDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgycHgpO1xyXG4gIH1cclxuXHJcbiAgMTAwJSB7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xyXG4gIH1cclxufVxyXG5cclxuQGtleWZyYW1lcyBzbGlkZVJpZ2h0QW5kRmFkZSB7XHJcbiAgMCUge1xyXG4gICAgb3BhY2l0eTogMDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMnB4KTtcclxuICB9XHJcblxyXG4gIDEwMCUge1xyXG4gICAgb3BhY2l0eTogMTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcclxuICB9XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgc2xpZGVEb3duQW5kRmFkZSB7XHJcbiAgMCUge1xyXG4gICAgb3BhY2l0eTogMDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcclxuICB9XHJcblxyXG4gIDEwMCUge1xyXG4gICAgb3BhY2l0eTogMTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcclxuICB9XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgc2xpZGVMZWZ0QW5kRmFkZSB7XHJcbiAgMCUge1xyXG4gICAgb3BhY2l0eTogMDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgycHgpO1xyXG4gIH1cclxuXHJcbiAgMTAwJSB7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDMxMHB4KSBhbmQgKG1heC13aWR0aDogNTUwcHgpIHtcclxuICAuc29ydCB7XHJcbiAgICBwYWRkaW5nOiAycHg7XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMDlweCkge1xyXG4gIC5zb3J0IHtcclxuICAgIHBhZGRpbmc6IDJweDtcclxuICB9XHJcbn1cclxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvc3R5bGVzL29wZW5zaWduZHJpdmUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUlBOztFQUVFLGdCQUFnQjtFQUNoQix1QkFBdUI7RUFDdkIsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQixZQUFZO0VBQ1o7OzZDQUUyQztFQUMzQyxXQUFXO0FBQ2I7O0FBRUE7Ozs7RUFJRSxlQUFlO0VBQ2YsY0FBYztFQUNkLHVCQUF1QjtFQUN2QixrQkFBa0I7RUFDbEIsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQixZQUFZO0VBQ1osY0FBYztFQUNkLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIseUJBQWlCO1VBQWpCLGlCQUFpQjtFQUNqQixhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsdUJBQXVCO0FBQ3pCOztBQUVBOzs7O0VBSUUscUJBQXFCO0VBQ3JCLHNCQUFzQjtBQUN4Qjs7QUFFQTs7OztFQUlFLHlCQUF5QjtFQUN6Qix1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsZUFBZTtFQUNmLGlCQUFpQjtFQUNqQixzQkFBc0I7QUFDeEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsT0FBTztFQUNQLFdBQVc7RUFDWCxvQkFBb0I7RUFDcEIsbUJBQW1CO0VBQ25CLHVCQUF1QjtBQUN6Qjs7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixrQkFBa0I7RUFDbEIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsWUFBWTtBQUNkOztBQUVBO0VBQ0UscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsY0FBYztFQUNkLFdBQVc7RUFDWCxzQkFBc0I7RUFDdEIsV0FBVztFQUNYLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQiw2QkFBNkI7RUFDN0IsU0FBUztFQUNULGVBQWU7QUFDakI7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCO0FBQ0E7RUFDRSxlQUFlO0VBQ2YsZ0JBQWdCO0FBQ2xCOzs7QUFHQTtFQUNFLDJCQUEyQjtFQUMzQiw4QkFBOEI7RUFDOUIsU0FBUztFQUNULHdDQUF3QztBQUMxQzs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixNQUFNO0VBQ04sUUFBUTtFQUNSLHNCQUFzQjtFQUN0QixXQUFXO0VBQ1gsWUFBWTtFQUNaLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsbUJBQW1CO0VBQ25CLGtCQUFrQjtFQUNsQix3Q0FBd0M7QUFDMUM7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBLDJCQUEyQjtBQUMzQjtFQUNFLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsV0FBVztBQUNiOztBQUVBO0VBQ0UseUJBQXlCO0VBQ3pCLFdBQVc7QUFDYjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsV0FBVztBQUNiOzs7QUFHQTtFQUNFLGlCQUFpQjtFQUNqQixXQUFXO0VBQ1gsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQix1QkFBdUI7RUFDdkIsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLDhDQUE4QztFQUM5QyxnQ0FBZ0M7RUFDaEMsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLFlBQVk7RUFDWixtQkFBbUI7RUFDbkIsMkJBQTJCO0VBQzNCLHVCQUF1QjtFQUN2QixlQUFlO0VBQ2Ysa0JBQWtCO0VBQ2xCLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLFVBQVU7QUFDWjs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixpQkFBaUI7RUFDakIsWUFBWTtFQUNaLHVCQUF1QjtFQUN2Qjs7NkNBRTJDO0VBQzNDLHlCQUF5QjtFQUN6Qix3REFBd0Q7RUFDeEQsK0JBQStCO0VBQy9CLGtCQUFrQjtFQUNsQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxnQ0FBZ0M7QUFDbEM7O0FBRUE7RUFDRSxnQ0FBZ0M7QUFDbEM7O0FBRUE7RUFDRSw4QkFBOEI7QUFDaEM7O0FBRUE7RUFDRSxpQ0FBaUM7QUFDbkM7O0FBRUE7RUFDRSxXQUFXO0FBQ2I7O0FBRUE7RUFDRTtJQUNFLFVBQVU7SUFDViwwQkFBMEI7RUFDNUI7O0VBRUE7SUFDRSxVQUFVO0lBQ1Ysd0JBQXdCO0VBQzFCO0FBQ0Y7O0FBRUE7RUFDRTtJQUNFLFVBQVU7SUFDViwyQkFBMkI7RUFDN0I7O0VBRUE7SUFDRSxVQUFVO0lBQ1Ysd0JBQXdCO0VBQzFCO0FBQ0Y7O0FBRUE7RUFDRTtJQUNFLFVBQVU7SUFDViwyQkFBMkI7RUFDN0I7O0VBRUE7SUFDRSxVQUFVO0lBQ1Ysd0JBQXdCO0VBQzFCO0FBQ0Y7O0FBRUE7RUFDRTtJQUNFLFVBQVU7SUFDViwwQkFBMEI7RUFDNUI7O0VBRUE7SUFDRSxVQUFVO0lBQ1Ysd0JBQXdCO0VBQzFCO0FBQ0Y7O0FBRUE7RUFDRTtJQUNFLFlBQVk7RUFDZDtBQUNGOztBQUVBO0VBQ0U7SUFDRSxZQUFZO0VBQ2Q7QUFDRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJAaW1wb3J0IFxcXCJAcmFkaXgtdWkvY29sb3JzL2JsYWNrLWFscGhhLmNzc1xcXCI7XFxyXFxuQGltcG9ydCBcXFwiQHJhZGl4LXVpL2NvbG9ycy9tYXV2ZS5jc3NcXFwiO1xcclxcbkBpbXBvcnQgXFxcIkByYWRpeC11aS9jb2xvcnMvdmlvbGV0LmNzc1xcXCI7XFxyXFxuXFxyXFxuLkNvbnRleHRNZW51Q29udGVudCxcXHJcXG4uQ29udGV4dE1lbnVTdWJDb250ZW50IHtcXHJcXG4gIG1pbi13aWR0aDogMTM1cHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBwYWRkaW5nOiA1cHg7XFxyXFxuICBib3gtc2hhZG93OlxcclxcbiAgICAwcHggMTBweCAzOHB4IC0xMHB4IHJnYmEoMjIsIDIzLCAyNCwgMC4zNSksXFxyXFxuICAgIDBweCAxMHB4IDIwcHggLTE1cHggcmdiYSgyMiwgMjMsIDI0LCAwLjIpO1xcclxcbiAgei1pbmRleDogOTk7XFxyXFxufVxcclxcblxcclxcbi5Db250ZXh0TWVudUl0ZW0sXFxyXFxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtLFxcclxcbi5Db250ZXh0TWVudVJhZGlvSXRlbSxcXHJcXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTNweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGhlaWdodDogMjVweDtcXHJcXG4gIHBhZGRpbmc6IDAgNXB4O1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxNXB4O1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyW2RhdGEtc3RhdGU9XFxcIm9wZW5cXFwiXSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxufVxcclxcblxcclxcbi5Db250ZXh0TWVudUl0ZW1bZGF0YS1kaXNhYmxlZF0sXFxyXFxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtW2RhdGEtZGlzYWJsZWRdLFxcclxcbi5Db250ZXh0TWVudVJhZGlvSXRlbVtkYXRhLWRpc2FibGVkXSxcXHJcXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyW2RhdGEtZGlzYWJsZWRdIHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS04KTtcXHJcXG4gIHBvaW50ZXItZXZlbnRzOiBcXFwibm9uZVxcXCI7XFxyXFxufVxcclxcblxcclxcbi5Db250ZXh0TWVudUl0ZW1bZGF0YS1oaWdobGlnaHRlZF0sXFxyXFxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdLFxcclxcbi5Db250ZXh0TWVudVJhZGlvSXRlbVtkYXRhLWhpZ2hsaWdodGVkXSxcXHJcXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyW2RhdGEtaGlnaGxpZ2h0ZWRdIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkYWQ5ZGI7XFxyXFxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcXHJcXG59XFxyXFxuXFxyXFxuLkNvbnRleHRNZW51TGFiZWwge1xcclxcbiAgcGFkZGluZy1sZWZ0OiAyNXB4O1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI1cHg7XFxyXFxuICBjb2xvcjogdmFyKC0tbWF1dmUtMTEpO1xcclxcbn1cXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVJdGVtSW5kaWNhdG9yIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB3aWR0aDogMjVweDtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uUmlnaHRTbG90IHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xcclxcbiAgY29sb3I6IHZhcigtLW1hdXZlLTExKTtcXHJcXG59XFxyXFxuXFxyXFxuW2RhdGEtaGlnaGxpZ2h0ZWRdID4gLlJpZ2h0U2xvdCB7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbltkYXRhLWRpc2FibGVkXSAuUmlnaHRTbG90IHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS04KTtcXHJcXG59XFxyXFxuXFxyXFxuLmRyb3Bkb3duLW1lbnUge1xcclxcbiAgbWluLXdpZHRoOiAxMHJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLmRyb3Bkb3duLWl0ZW0ge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHBhZGRpbmc6IDAuM3JlbSAxLjJyZW07XFxyXFxuICBjbGVhcjogYm90aDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxyXFxuICBjb2xvcjogIzM5M2EzOTtcXHJcXG4gIHRleHQtYWxpZ246IGluaGVyaXQ7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5kcm9wZG93bi1pdGVtOmhvdmVyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkYWQ5ZGI7XFxyXFxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcXHJcXG59XFxyXFxuXFxyXFxuLm1vZGFsIHtcXHJcXG4gIG1hcmdpbi10b3A6IDUwcHg7XFxyXFxufVxcclxcbi5wZGZOYW1lIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTBweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XFxyXFxufVxcclxcblxcclxcblxcclxcbi5oclN0eWxlIHtcXHJcXG4gIG1hcmdpbi10b3A6IDByZW0gIWltcG9ydGFudDtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDByZW0gIWltcG9ydGFudDtcXHJcXG4gIGJvcmRlcjogMDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxufVxcclxcblxcclxcbi5zdGF0dXMtYmFkZ2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcclxcbiAgd2lkdGg6IDI0cHg7XFxyXFxuICBoZWlnaHQ6IDI0cHg7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xcclxcbiAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcXHJcXG59XFxyXFxuXFxyXFxuLnN0YXR1cy1iYWRnZSBpIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogU3RhdHVzLXNwZWNpZmljIGNvbG9ycyAqL1xcclxcbi5jb21wbGV0ZWQge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzRjYWY1MDtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG4uaW4tcHJvZ3Jlc3Mge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYzEwNztcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG4uZGVjbGluZWQge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG4uZXhwaXJlZCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOWU5ZTllO1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcblxcclxcbi5kcmFmdCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDc5Y2RjO1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcblxcclxcblxcclxcbi5zb3J0IHtcXHJcXG4gIHBhZGRpbmc6IDhweCAxNXB4O1xcclxcbiAgbWFyZ2luOiA1cHg7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uc29ydDpob3ZlciB7XFxyXFxuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgxNjgsIDIwNCwgMjA2LCAwLjEpO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWF1dmUtMyk7XFxyXFxuICBib3JkZXItcmFkaXVzOiAycHg7XFxyXFxufVxcclxcblxcclxcbi5maWxlTmFtZSB7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICB3aWR0aDogMTAwcHg7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxuICBmb250LXNpemU6IDExcHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBmb250LXdlaWdodDogNDgwO1xcclxcbn1cXHJcXG5cXHJcXG5hIHtcXHJcXG4gIGFsbDogdW5zZXQ7XFxyXFxufVxcclxcblxcclxcbi5Ib3ZlckNhcmRDb250ZW50IHtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcXHJcXG4gIHBhZGRpbmc6IDVweCAxMHB4O1xcclxcbiAgd2lkdGg6IDE3MHB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBib3gtc2hhZG93OlxcclxcbiAgICBoc2woMjA2IDIyJSA3JSAvIDM1JSkgMHB4IDEwcHggMzhweCAtMTBweCxcXHJcXG4gICAgaHNsKDIwNiAyMiUgNyUgLyAyMCUpIDBweCAxMHB4IDIwcHggLTE1cHg7XFxyXFxuICBhbmltYXRpb24tZHVyYXRpb246IDQwMG1zO1xcclxcbiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSk7XFxyXFxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVxcXCJ0b3BcXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVEb3duQW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVxcXCJyaWdodFxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZUxlZnRBbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XFxcImJvdHRvbVxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVVwQW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVxcXCJsZWZ0XFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlUmlnaHRBbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uSG92ZXJDYXJkQXJyb3cge1xcclxcbiAgZmlsbDogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbkBrZXlmcmFtZXMgc2xpZGVVcEFuZEZhZGUge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbkBrZXlmcmFtZXMgc2xpZGVSaWdodEFuZEZhZGUge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTJweCk7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAxMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlRG93bkFuZEZhZGUge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAxMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlTGVmdEFuZEZhZGUge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMnB4KTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSAobWluLXdpZHRoOiAzMTBweCkgYW5kIChtYXgtd2lkdGg6IDU1MHB4KSB7XFxyXFxuICAuc29ydCB7XFxyXFxuICAgIHBhZGRpbmc6IDJweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzA5cHgpIHtcXHJcXG4gIC5zb3J0IHtcXHJcXG4gICAgcGFkZGluZzogMnB4O1xcclxcbiAgfVxcclxcbn1cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1GYXN0aGFuZCZkaXNwbGF5PXN3YXApO1wiXSk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1EYW5jaW5nK1NjcmlwdCZkaXNwbGF5PXN3YXApO1wiXSk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1EZWxpY2lvdXMrSGFuZHJhd24mZGlzcGxheT1zd2FwKTtcIl0pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIkBpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9Q2VkYXJ2aWxsZStDdXJzaXZlJmRpc3BsYXk9c3dhcCk7XCJdKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lciB7XHJcbiAgcG9zaXRpb246IGluaXRpYWwgIWltcG9ydGFudDtcclxufVxyXG5cclxuLndpZGdldHMge1xyXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgLyogRGlzYWJsZSB0ZXh0IHNlbGVjdGlvbiBpbiBXZWJLaXQgYnJvd3NlcnMgKi9cclxuICB1c2VyLXNlbGVjdDogbm9uZTtcclxufVxyXG5cclxuLnJhZGlvQnV0dG9uIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIGxlZnQ6IDBweDtcclxuICB0b3A6IDBweDtcclxuICBmb250LXNpemU6IDEycHg7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgIzAwN2JmZjtcclxuICBib3JkZXItcmFkaXVzOiA1MHB4O1xyXG59XHJcblxyXG4uc2lnbmF0dXJlQ2FudmFzIHtcclxuICBib3JkZXI6IDJweCBzb2xpZCAjODg4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcclxuICB3aWR0aDogNDYwcHg7XHJcbiAgaGVpZ2h0OiAxODRweDtcclxufVxyXG5cclxuLmludGlhbFNpZ25hdHVyZUNhbnZhcyB7XHJcbiAgYm9yZGVyOiAycHggc29saWQgIzg4ODtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XHJcbiAgd2lkdGg6IDE1MHB4O1xyXG4gIGhlaWdodDogMTUwcHg7XHJcbn1cclxuXHJcbi5pbnRpYWxTaWduYXR1cmUge1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4ODg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xyXG4gIHdpZHRoOiAxODNweDtcclxuICBoZWlnaHQ6IDE4M3B4O1xyXG59XHJcblxyXG4ucGVuQ29udGFpbmVyRGVmYXVsdCB7XHJcbiAgd2lkdGg6IDQ2MHB4O1xyXG59XHJcblxyXG4uaWNvbiB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIGZvbnQtc2l6ZTogMTRweDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgei1pbmRleDogMjtcclxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxufVxyXG5cclxuLlNjcm9sbGJhcnNDdXN0b20tVHJhY2tZIHtcclxuICB3aWR0aDogNHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuLlNjcm9sbGJhcnNDdXN0b20tVHJhY2tYIHtcclxuICBoZWlnaHQ6IDRweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uc2lnbllvdXJzZWxmQmxvY2sge1xyXG4gIHBhZGRpbmc6IDBweDtcclxuICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXIgIWltcG9ydGFudDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5zZW5kTWFpbCB7XHJcbiAgYm94LXNoYWRvdzpcclxuICAgIDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSksXHJcbiAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE4KTtcclxuICBwYWRkaW5nOiAzcHggMzBweDtcclxuICBjb2xvcjogd2hpdGU7XHJcbiAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xyXG4gIGZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50O1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBtYXJnaW4tbGVmdDogMTBweDtcclxufVxyXG5cclxuLnVzZXIge1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG59XHJcbi5kaXNhYmxlZCB7XHJcbiAgb3BhY2l0eTogMC41O1xyXG4gIC8qIEV4YW1wbGU6IHJlZHVjZSBvcGFjaXR5IHRvIHZpc3VhbGx5IGluZGljYXRlIGRpc2FibGVkIHN0YXRlICovXHJcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XHJcbiAgLyogUHJldmVudHMgbW91c2UgY2xpY2tzIGFuZCBvdGhlciBldmVudHMgKi9cclxuICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiAjODg4OyAqL1xyXG59XHJcblxyXG4uc2lnblRhYiB7XHJcbiAgY3Vyc29yOiBwb2ludGVyICFpbXBvcnRhbnQ7XHJcbiAgZm9udC13ZWlnaHQ6IDQwMCAhaW1wb3J0YW50O1xyXG4gIG1hcmdpbjogN3B4ICFpbXBvcnRhbnQ7XHJcbiAgZm9udC1zaXplOiAxNXB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5zaWduZXJDb21wb25lbnQge1xyXG4gIC8qIGJveC1zaGFkb3c6IHJnYmEoMTcsIDEyLCA0NiwgMC4xNSkgMHB4IDQ4cHggMTAwcHggMHB4OyAqL1xyXG4gIC8qIHdpZHRoOiAxODBweDsgKi9cclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLnVwbG9hZEltZ0xvZ28ge1xyXG4gIGZvbnQtc2l6ZTogNTBweDtcclxufVxyXG5cclxuLkRyb3Bkb3duTWVudUNvbnRlbnQsXHJcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50IHtcclxuICBtaW4td2lkdGg6IDEzMHB4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE1KTtcclxuICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xyXG4gIHBhZGRpbmc6IDVweDtcclxuICBhbmltYXRpb24tZHVyYXRpb246IDQwMG1zO1xyXG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xyXG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7XHJcbiAgei1pbmRleDogMzAgIWltcG9ydGFudDtcclxufVxyXG5cclxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVwidG9wXCJdLFxyXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XCJ0b3BcIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZURvd25BbmRGYWRlO1xyXG59XHJcblxyXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XCJyaWdodFwiXSxcclxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVwicmlnaHRcIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZUxlZnRBbmRGYWRlO1xyXG59XHJcblxyXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XCJib3R0b21cIl0sXHJcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cImJvdHRvbVwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlVXBBbmRGYWRlO1xyXG59XHJcblxyXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XCJsZWZ0XCJdLFxyXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XCJsZWZ0XCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVSaWdodEFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ecm9wZG93bk1lbnVJdGVtIHtcclxuICBmb250LXNpemU6IDEzcHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE7XHJcbiAgY29sb3I6IGJsYWNrO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGhlaWdodDogMjVweDtcclxuICBwYWRkaW5nOiAwIDVweDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xyXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG4gIGJvcmRlcjogbm9uZTtcclxufVxyXG5cclxuLlNlbGVjdFRyaWdnZXIge1xyXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gIHBhZGRpbmc6IDAgNzBweDtcclxuICBmb250LXNpemU6IDEzcHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE7XHJcbiAgaGVpZ2h0OiAzNXB4O1xyXG4gIGdhcDogNXB4O1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjODg3YWJmO1xyXG4gIHdpZHRoOiAxMDBweDtcclxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcclxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxufVxyXG5cclxuLnNlbGVjdEVtYWlsIHtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBwYWRkaW5nOiAwIDE1cHg7XHJcbiAgZm9udC1zaXplOiAxM3B4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxO1xyXG4gIGhlaWdodDogMzVweDtcclxuICBnYXA6IDVweDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzg4N2FiZjtcclxuICB3aWR0aDogMjAwcHg7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbn1cclxuXHJcbm9wdGlvbiB7XHJcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xyXG59XHJcblxyXG4uU2VsZWN0VHJpZ2dlcjpob3ZlciB7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbn1cclxuXHJcbi5zZWxlY3RFbWFpbDpob3ZlciB7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbn1cclxuXHJcbi5TZWxlY3RUcmlnZ2VyOmZvY3VzIHtcclxuICAvKiBib3gtc2hhZG93OiAwIDAgMCAycHggYmxhY2s7ICovXHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbn1cclxuXHJcbi5zZWxlY3RFbWFpbDpmb2N1cyB7XHJcbiAgLyogYm94LXNoYWRvdzogMCAwIDAgMnB4IGJsYWNrOyAqL1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4uU2VsZWN0VHJpZ2dlcltkYXRhLXBsYWNlaG9sZGVyXSB7XHJcbiAgY29sb3I6IGJsYWNrO1xyXG59XHJcblxyXG4uU2VsZWN0SWNvbiB7XHJcbiAgY29sb3I6IFZhcigtLXZpb2xldC0xMSk7XHJcbn1cclxuXHJcbi5TZWxlY3RDb250ZW50IHtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcclxuICBib3gtc2hhZG93OlxyXG4gICAgMHB4IDEwcHggMzhweCAtMTBweCByZ2JhKDIyLCAyMywgMjQsIDAuMzUpLFxyXG4gICAgMHB4IDEwcHggMjBweCAtMTVweCByZ2JhKDIyLCAyMywgMjQsIDAuMik7XHJcbn1cclxuXHJcbi5TZWxlY3RWaWV3cG9ydCB7XHJcbiAgcGFkZGluZzogNXB4O1xyXG59XHJcblxyXG4uU2VsZWN0SXRlbSB7XHJcbiAgZm9udC1zaXplOiAxM3B4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxO1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgaGVpZ2h0OiAyNXB4O1xyXG4gIHBhZGRpbmc6IDAgMzVweCAwIDI1cHg7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcclxuICB6LWluZGV4OiAxMCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uU2VsZWN0SXRlbVtkYXRhLWRpc2FibGVkXSB7XHJcbiAgY29sb3I6IHZhcigtLW1hdXZlLTgpO1xyXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xyXG59XHJcblxyXG4uU2VsZWN0SXRlbVtkYXRhLWhpZ2hsaWdodGVkXSB7XHJcbiAgb3V0bGluZTogbm9uZTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS12aW9sZXQtOSk7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xKTtcclxufVxyXG5cclxuLlNlbGVjdExhYmVsIHtcclxuICBwYWRkaW5nOiAwIDI1cHg7XHJcbiAgZm9udC1zaXplOiAxMnB4O1xyXG4gIGxpbmUtaGVpZ2h0OiAyNXB4O1xyXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS0xMSk7XHJcbn1cclxuXHJcbi5TZWxlY3RTZXBhcmF0b3Ige1xyXG4gIGhlaWdodDogMXB4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXZpb2xldC02KTtcclxuICBtYXJnaW46IDVweDtcclxufVxyXG5cclxuLlNlbGVjdEl0ZW1JbmRpY2F0b3Ige1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBsZWZ0OiAwO1xyXG4gIHdpZHRoOiAyNXB4O1xyXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbn1cclxuXHJcbi5TZWxlY3RTY3JvbGxCdXR0b24ge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBoZWlnaHQ6IDI1cHg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XHJcbiAgY3Vyc29yOiBkZWZhdWx0O1xyXG59XHJcblxyXG4uZHJvcERvd25TdHlsZSB7XHJcbiAgd2lkdGg6IGF1dG87XHJcbn1cclxuXHJcbi5hdXRvU2lnblNjcm9sbCB7XHJcbiAgb3ZlcmZsb3cteTogYXV0bztcclxufVxyXG5cclxuLmF1dG9TaWduU2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLnZhbGlkYXRlSW5wdXRUZXh0IHtcclxuICB3aWR0aDogNzYlO1xyXG59XHJcblxyXG4ucmFkaW9Hcm91cElucHV0IHtcclxuICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLnJhZGlvR3JvdXAge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbn1cclxuXHJcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2NnB4KSB7XHJcbiAgLnZhbGlkYXRlSW5wdXRUZXh0IHtcclxuICAgIHdpZHRoOiA5MyU7XHJcbiAgfVxyXG5cclxuICAuZHJvcGRvd24tbWVudSB7XHJcbiAgICBtaW4td2lkdGg6IDByZW0gIWltcG9ydGFudDtcclxuICB9XHJcblxyXG4gICNuYXZiYXIge1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHotaW5kZXg6IDQ5O1xyXG4gIH1cclxuXHJcbiAgLyogTmF2YmFyIGxpbmtzICovXHJcbiAgI25hdmJhciBhIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBjb2xvcjogI2YyZjJmMjtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIHBhZGRpbmc6IDE0cHg7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgfVxyXG5cclxuICAjbmF2YmFyIGEuYWN0aXZlIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0Y2FmNTA7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgfVxyXG5cclxuICAvKiBQYWdlIGNvbnRlbnQgKi9cclxuICAuY29udGVudCB7XHJcbiAgICBwYWRkaW5nOiAxNnB4O1xyXG4gIH1cclxuXHJcbiAgLyogVGhlIHN0aWNreSBjbGFzcyBpcyBhZGRlZCB0byB0aGUgbmF2YmFyXHJcbiAgd2l0aCBKUyB3aGVuIGl0IHJlYWNoZXMgaXRzIHNjcm9sbCBwb3NpdGlvbiAqL1xyXG4gIC5zdGlja3lIZWFkIHtcclxuICAgIHRvcDogNTBweDtcclxuICAgIGxlZnQ6IDAuOXJlbTtcclxuICB9XHJcblxyXG4gIC5zdGlja3lTaWduZXJIZWFkIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICB9XHJcblxyXG4gIC8qIEFkZCBzb21lIHRvcCBwYWRkaW5nIHRvIHRoZSBwYWdlIGNvbnRlbnRcclxuICB0byBwcmV2ZW50IHN1ZGRlbiBxdWljayBtb3ZlbWVudCAoYXMgdGhlXHJcbiAgbmF2aWdhdGlvbiBiYXIgZ2V0cyBhIG5ldyBwb3NpdGlvbiBhdCB0aGUgdG9wIG9mIHRoZVxyXG4gIHBhZ2UgKHBvc2l0aW9uOmZpeGVkIGFuZCB0b3A6MCkgKi9cclxuICAuc3RpY2t5SGVhZCArIC5jb250ZW50IHtcclxuICAgIHBhZGRpbmctdG9wOiA2MHB4O1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDg3cHgpIGFuZCAobWluLXdpZHRoOiAzNTFweCkge1xyXG4gIC5zaWduYXR1cmVDYW52YXMge1xyXG4gICAgd2lkdGg6IDMwMHB4O1xyXG4gICAgaGVpZ2h0OiAxMjBweDtcclxuICB9XHJcblxyXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcclxuICAgIHdpZHRoOiAzMDBweDtcclxuICB9XHJcblxyXG4gIC51cGxvYWRJbWdMb2dvIHtcclxuICAgIGZvbnQtc2l6ZTogMzBweDtcclxuICB9XHJcblxyXG4gIC5zaWduVGFiIHtcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcclxuICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xyXG4gIH1cclxufVxyXG5cclxuLnNjcm9sbC1oaWRlOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzNTBweCkgYW5kIChtaW4td2lkdGg6IDMxMXB4KSB7XHJcbiAgLnNpZ25hdHVyZUNhbnZhcyB7XHJcbiAgICB3aWR0aDogMjgwcHg7XHJcbiAgICBoZWlnaHQ6IDExMnB4O1xyXG4gIH1cclxuXHJcbiAgLnBlbkNvbnRhaW5lckRlZmF1bHQge1xyXG4gICAgd2lkdGg6IDI4MHB4O1xyXG4gIH1cclxuXHJcbiAgLnNpZ25UYWIge1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xyXG5cclxuICAgIGZvbnQtc2l6ZTogMTBweCAhaW1wb3J0YW50O1xyXG4gIH1cclxuXHJcbiAgLnVwbG9hZEltZ0xvZ28ge1xyXG4gICAgZm9udC1zaXplOiAyNXB4O1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzEwcHgpIHtcclxuICAuc2lnbmF0dXJlQ2FudmFzIHtcclxuICAgIHdpZHRoOiAyMzBweDtcclxuICAgIGhlaWdodDogOTJweDtcclxuICB9XHJcblxyXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcclxuICAgIHdpZHRoOiAyMzBweDtcclxuICB9XHJcblxyXG4gIC5zaWduVGFiIHtcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcclxuICAgIGZvbnQtc2l6ZTogOHB4ICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG5cclxuICAudXBsb2FkSW1nTG9nbyB7XHJcbiAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgfVxyXG59XHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL3N0eWxlcy9zaWduYXR1cmUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUtBO0VBQ0UsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UseUJBQXlCO0VBQ3pCLDhDQUE4QztFQUU5QyxpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixTQUFTO0VBQ1QsUUFBUTtFQUNSLGVBQWU7RUFDZix5QkFBeUI7RUFDekIsbUJBQW1C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RUE7K0NBQzZDO0VBQzdDO0lBQ0UsU0FBUztJQUNULFlBQVk7RUFDZDs7RUFFQTtJQUNFLGVBQWU7RUFDakI7O0VBRUE7OzttQ0FHaUM7RUFDakM7SUFDRSxpQkFBaUI7RUFDbkI7QUFDRjs7QUFFQTtFQUNFO0lBQ0UsWUFBWTtJQUNaLGFBQWE7RUFDZjs7RUFFQTtJQUNFLFlBQVk7RUFDZDs7RUFFQTtJQUNFLGVBQWU7RUFDakI7O0VBRUE7SUFDRSwyQkFBMkI7SUFDM0IsMEJBQTBCO0VBQzVCO0FBQ0Y7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7QUFDQTtFQUNFO0lBQ0UsWUFBWTtJQUNaLGFBQWE7RUFDZjs7RUFFQTtJQUNFLFlBQVk7RUFDZDs7RUFFQTtJQUNFLDJCQUEyQjs7SUFFM0IsMEJBQTBCO0VBQzVCOztFQUVBO0lBQ0UsZUFBZTtFQUNqQjtBQUNGOztBQUVBO0VBQ0U7SUFDRSxZQUFZO0lBQ1osWUFBWTtFQUNkOztFQUVBO0lBQ0UsWUFBWTtFQUNkOztFQUVBO0lBQ0UsMkJBQTJCO0lBQzNCLHlCQUF5QjtFQUMzQjs7RUFFQTtJQUNFLGVBQWU7RUFDakI7QUFDRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJAaW1wb3J0IHVybChcXFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1GYXN0aGFuZCZkaXNwbGF5PXN3YXBcXFwiKTtcXHJcXG5AaW1wb3J0IHVybChcXFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1EYW5jaW5nK1NjcmlwdCZkaXNwbGF5PXN3YXBcXFwiKTtcXHJcXG5AaW1wb3J0IHVybChcXFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1EZWxpY2lvdXMrSGFuZHJhd24mZGlzcGxheT1zd2FwXFxcIik7XFxyXFxuQGltcG9ydCB1cmwoXFxcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9Q2VkYXJ2aWxsZStDdXJzaXZlJmRpc3BsYXk9c3dhcFxcXCIpO1xcclxcblxcclxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXIge1xcclxcbiAgcG9zaXRpb246IGluaXRpYWwgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLndpZGdldHMge1xcclxcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIC8qIERpc2FibGUgdGV4dCBzZWxlY3Rpb24gaW4gV2ViS2l0IGJyb3dzZXJzICovXFxyXFxuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5yYWRpb0J1dHRvbiB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGhlaWdodDogMTAwJTtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGxlZnQ6IDBweDtcXHJcXG4gIHRvcDogMHB4O1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzAwN2JmZjtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwcHg7XFxyXFxufVxcclxcblxcclxcbi5zaWduYXR1cmVDYW52YXMge1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgIzg4ODtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXHJcXG4gIHdpZHRoOiA0NjBweDtcXHJcXG4gIGhlaWdodDogMTg0cHg7XFxyXFxufVxcclxcblxcclxcbi5pbnRpYWxTaWduYXR1cmVDYW52YXMge1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgIzg4ODtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXHJcXG4gIHdpZHRoOiAxNTBweDtcXHJcXG4gIGhlaWdodDogMTUwcHg7XFxyXFxufVxcclxcblxcclxcbi5pbnRpYWxTaWduYXR1cmUge1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgIzg4ODtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXHJcXG4gIHdpZHRoOiAxODNweDtcXHJcXG4gIGhlaWdodDogMTgzcHg7XFxyXFxufVxcclxcblxcclxcbi5wZW5Db250YWluZXJEZWZhdWx0IHtcXHJcXG4gIHdpZHRoOiA0NjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgZm9udC1zaXplOiAxNHB4O1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4uU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1kge1xcclxcbiAgd2lkdGg6IDRweCAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG4uU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1gge1xcclxcbiAgaGVpZ2h0OiA0cHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLnNpZ25Zb3Vyc2VsZkJsb2NrIHtcXHJcXG4gIHBhZGRpbmc6IDBweDtcXHJcXG4gIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyICFpbXBvcnRhbnQ7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5zZW5kTWFpbCB7XFxyXFxuICBib3gtc2hhZG93OlxcclxcbiAgICAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpLFxcclxcbiAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE4KTtcXHJcXG4gIHBhZGRpbmc6IDNweCAzMHB4O1xcclxcbiAgY29sb3I6IHdoaXRlO1xcclxcbiAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xcclxcbiAgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBtYXJnaW4tbGVmdDogMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLnVzZXIge1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbn1cXHJcXG4uZGlzYWJsZWQge1xcclxcbiAgb3BhY2l0eTogMC41O1xcclxcbiAgLyogRXhhbXBsZTogcmVkdWNlIG9wYWNpdHkgdG8gdmlzdWFsbHkgaW5kaWNhdGUgZGlzYWJsZWQgc3RhdGUgKi9cXHJcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcclxcbiAgLyogUHJldmVudHMgbW91c2UgY2xpY2tzIGFuZCBvdGhlciBldmVudHMgKi9cXHJcXG4gIC8qIGJhY2tncm91bmQtY29sb3I6ICM4ODg7ICovXFxyXFxufVxcclxcblxcclxcbi5zaWduVGFiIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50O1xcclxcbiAgZm9udC13ZWlnaHQ6IDQwMCAhaW1wb3J0YW50O1xcclxcbiAgbWFyZ2luOiA3cHggIWltcG9ydGFudDtcXHJcXG4gIGZvbnQtc2l6ZTogMTVweCAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uc2lnbmVyQ29tcG9uZW50IHtcXHJcXG4gIC8qIGJveC1zaGFkb3c6IHJnYmEoMTcsIDEyLCA0NiwgMC4xNSkgMHB4IDQ4cHggMTAwcHggMHB4OyAqL1xcclxcbiAgLyogd2lkdGg6IDE4MHB4OyAqL1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi51cGxvYWRJbWdMb2dvIHtcXHJcXG4gIGZvbnQtc2l6ZTogNTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLkRyb3Bkb3duTWVudUNvbnRlbnQsXFxyXFxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnQge1xcclxcbiAgbWluLXdpZHRoOiAxMzBweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcXHJcXG4gIHBhZGRpbmc6IDVweDtcXHJcXG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogNDAwbXM7XFxyXFxuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcXHJcXG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7XFxyXFxuICB6LWluZGV4OiAzMCAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XFxcInRvcFxcXCJdLFxcclxcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cXFwidG9wXFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlRG93bkFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cXFwicmlnaHRcXFwiXSxcXHJcXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XFxcInJpZ2h0XFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlTGVmdEFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cXFwiYm90dG9tXFxcIl0sXFxyXFxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVxcXCJib3R0b21cXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVVcEFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cXFwibGVmdFxcXCJdLFxcclxcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cXFwibGVmdFxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVJpZ2h0QW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkRyb3Bkb3duTWVudUl0ZW0ge1xcclxcbiAgZm9udC1zaXplOiAxM3B4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDE7XFxyXFxuICBjb2xvcjogYmxhY2s7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBoZWlnaHQ6IDI1cHg7XFxyXFxuICBwYWRkaW5nOiAwIDVweDtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmctbGVmdDogMjBweDtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFRyaWdnZXIge1xcclxcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBwYWRkaW5nOiAwIDcwcHg7XFxyXFxuICBmb250LXNpemU6IDEzcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMTtcXHJcXG4gIGhlaWdodDogMzVweDtcXHJcXG4gIGdhcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzg4N2FiZjtcXHJcXG4gIHdpZHRoOiAxMDBweDtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG59XFxyXFxuXFxyXFxuLnNlbGVjdEVtYWlsIHtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gIHBhZGRpbmc6IDAgMTVweDtcXHJcXG4gIGZvbnQtc2l6ZTogMTNweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcclxcbiAgaGVpZ2h0OiAzNXB4O1xcclxcbiAgZ2FwOiA1cHg7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjODg3YWJmO1xcclxcbiAgd2lkdGg6IDIwMHB4O1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbn1cXHJcXG5cXHJcXG5vcHRpb24ge1xcclxcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0VHJpZ2dlcjpob3ZlciB7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uc2VsZWN0RW1haWw6aG92ZXIge1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFRyaWdnZXI6Zm9jdXMge1xcclxcbiAgLyogYm94LXNoYWRvdzogMCAwIDAgMnB4IGJsYWNrOyAqL1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLnNlbGVjdEVtYWlsOmZvY3VzIHtcXHJcXG4gIC8qIGJveC1zaGFkb3c6IDAgMCAwIDJweCBibGFjazsgKi9cXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RUcmlnZ2VyW2RhdGEtcGxhY2Vob2xkZXJdIHtcXHJcXG4gIGNvbG9yOiBibGFjaztcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdEljb24ge1xcclxcbiAgY29sb3I6IFZhcigtLXZpb2xldC0xMSk7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RDb250ZW50IHtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcXHJcXG4gIGJveC1zaGFkb3c6XFxyXFxuICAgIDBweCAxMHB4IDM4cHggLTEwcHggcmdiYSgyMiwgMjMsIDI0LCAwLjM1KSxcXHJcXG4gICAgMHB4IDEwcHggMjBweCAtMTVweCByZ2JhKDIyLCAyMywgMjQsIDAuMik7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RWaWV3cG9ydCB7XFxyXFxuICBwYWRkaW5nOiA1cHg7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RJdGVtIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTNweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGhlaWdodDogMjVweDtcXHJcXG4gIHBhZGRpbmc6IDAgMzVweCAwIDI1cHg7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RJdGVtW2RhdGEtZGlzYWJsZWRdIHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS04KTtcXHJcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0SXRlbVtkYXRhLWhpZ2hsaWdodGVkXSB7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdmlvbGV0LTkpO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xKTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdExhYmVsIHtcXHJcXG4gIHBhZGRpbmc6IDAgMjVweDtcXHJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyNXB4O1xcclxcbiAgY29sb3I6IHZhcigtLW1hdXZlLTExKTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFNlcGFyYXRvciB7XFxyXFxuICBoZWlnaHQ6IDFweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXZpb2xldC02KTtcXHJcXG4gIG1hcmdpbjogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0SXRlbUluZGljYXRvciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgd2lkdGg6IDI1cHg7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFNjcm9sbEJ1dHRvbiB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgaGVpZ2h0OiAyNXB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcXHJcXG4gIGN1cnNvcjogZGVmYXVsdDtcXHJcXG59XFxyXFxuXFxyXFxuLmRyb3BEb3duU3R5bGUge1xcclxcbiAgd2lkdGg6IGF1dG87XFxyXFxufVxcclxcblxcclxcbi5hdXRvU2lnblNjcm9sbCB7XFxyXFxuICBvdmVyZmxvdy15OiBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG4uYXV0b1NpZ25TY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcXHJcXG4gIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi52YWxpZGF0ZUlucHV0VGV4dCB7XFxyXFxuICB3aWR0aDogNzYlO1xcclxcbn1cXHJcXG5cXHJcXG4ucmFkaW9Hcm91cElucHV0IHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4ucmFkaW9Hcm91cCB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcXHJcXG59XFxyXFxuXFxyXFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY2cHgpIHtcXHJcXG4gIC52YWxpZGF0ZUlucHV0VGV4dCB7XFxyXFxuICAgIHdpZHRoOiA5MyU7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAuZHJvcGRvd24tbWVudSB7XFxyXFxuICAgIG1pbi13aWR0aDogMHJlbSAhaW1wb3J0YW50O1xcclxcbiAgfVxcclxcblxcclxcbiAgI25hdmJhciB7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICAgIHotaW5kZXg6IDQ5O1xcclxcbiAgfVxcclxcblxcclxcbiAgLyogTmF2YmFyIGxpbmtzICovXFxyXFxuICAjbmF2YmFyIGEge1xcclxcbiAgICBmbG9hdDogbGVmdDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIGNvbG9yOiAjZjJmMmYyO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIHBhZGRpbmc6IDE0cHg7XFxyXFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gICNuYXZiYXIgYS5hY3RpdmUge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGNhZjUwO1xcclxcbiAgICBjb2xvcjogd2hpdGU7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAvKiBQYWdlIGNvbnRlbnQgKi9cXHJcXG4gIC5jb250ZW50IHtcXHJcXG4gICAgcGFkZGluZzogMTZweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC8qIFRoZSBzdGlja3kgY2xhc3MgaXMgYWRkZWQgdG8gdGhlIG5hdmJhclxcclxcbiAgd2l0aCBKUyB3aGVuIGl0IHJlYWNoZXMgaXRzIHNjcm9sbCBwb3NpdGlvbiAqL1xcclxcbiAgLnN0aWNreUhlYWQge1xcclxcbiAgICB0b3A6IDUwcHg7XFxyXFxuICAgIGxlZnQ6IDAuOXJlbTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5zdGlja3lTaWduZXJIZWFkIHtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgfVxcclxcblxcclxcbiAgLyogQWRkIHNvbWUgdG9wIHBhZGRpbmcgdG8gdGhlIHBhZ2UgY29udGVudFxcclxcbiAgdG8gcHJldmVudCBzdWRkZW4gcXVpY2sgbW92ZW1lbnQgKGFzIHRoZVxcclxcbiAgbmF2aWdhdGlvbiBiYXIgZ2V0cyBhIG5ldyBwb3NpdGlvbiBhdCB0aGUgdG9wIG9mIHRoZVxcclxcbiAgcGFnZSAocG9zaXRpb246Zml4ZWQgYW5kIHRvcDowKSAqL1xcclxcbiAgLnN0aWNreUhlYWQgKyAuY29udGVudCB7XFxyXFxuICAgIHBhZGRpbmctdG9wOiA2MHB4O1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODdweCkgYW5kIChtaW4td2lkdGg6IDM1MXB4KSB7XFxyXFxuICAuc2lnbmF0dXJlQ2FudmFzIHtcXHJcXG4gICAgd2lkdGg6IDMwMHB4O1xcclxcbiAgICBoZWlnaHQ6IDEyMHB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnBlbkNvbnRhaW5lckRlZmF1bHQge1xcclxcbiAgICB3aWR0aDogMzAwcHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAudXBsb2FkSW1nTG9nbyB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMzBweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5zaWduVGFiIHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xcclxcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuLnNjcm9sbC1oaWRlOjotd2Via2l0LXNjcm9sbGJhciB7XFxyXFxuICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzNTBweCkgYW5kIChtaW4td2lkdGg6IDMxMXB4KSB7XFxyXFxuICAuc2lnbmF0dXJlQ2FudmFzIHtcXHJcXG4gICAgd2lkdGg6IDI4MHB4O1xcclxcbiAgICBoZWlnaHQ6IDExMnB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnBlbkNvbnRhaW5lckRlZmF1bHQge1xcclxcbiAgICB3aWR0aDogMjgwcHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAuc2lnblRhYiB7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcXHJcXG5cXHJcXG4gICAgZm9udC1zaXplOiAxMHB4ICFpbXBvcnRhbnQ7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAudXBsb2FkSW1nTG9nbyB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMjVweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzEwcHgpIHtcXHJcXG4gIC5zaWduYXR1cmVDYW52YXMge1xcclxcbiAgICB3aWR0aDogMjMwcHg7XFxyXFxuICAgIGhlaWdodDogOTJweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcXHJcXG4gICAgd2lkdGg6IDIzMHB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnNpZ25UYWIge1xcclxcbiAgICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XFxyXFxuICAgIGZvbnQtc2l6ZTogOHB4ICFpbXBvcnRhbnQ7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAudXBsb2FkSW1nTG9nbyB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMjBweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IFN0cmluZyh1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsKTtcblxuICAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cbiAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gdXJsLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfVxuXG4gIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgLy8gU2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcbiAgaWYgKC9bXCInKCkgXFx0XFxuXXwoJTIwKS8udGVzdCh1cmwpIHx8IG9wdGlvbnMubmVlZFF1b3Rlcykge1xuICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQodXJsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKSwgXCJcXFwiXCIpO1xuICB9XG4gIHJldHVybiB1cmw7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMic7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIFJlYWN0OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2hhcmVkL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UuanNcbiAqXG4gKiBEbyBub3QgcmVxdWlyZSB0aGlzIG1vZHVsZSBkaXJlY3RseSEgVXNlIG5vcm1hbCB0aHJvdyBlcnJvciBjYWxscy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVycm9yIGNvZGVzXG4gKiBkdXJpbmcgYnVpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIFwiTWluaWZpZWQgUmVkdXggZXJyb3IgI1wiICsgY29kZSArIFwiOyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT1cIiArIGNvZGUgKyBcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciBcIiArICd1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiAnO1xufVxuXG4vLyBJbmxpbmVkIHZlcnNpb24gb2YgdGhlIGBzeW1ib2wtb2JzZXJ2YWJsZWAgcG9seWZpbGxcbnZhciAkJG9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0pKCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgcmFuZG9tU3RyaW5nID0gZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG59O1xuXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IFwiQEByZWR1eC9JTklUXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUkVQTEFDRTogXCJAQHJlZHV4L1JFUExBQ0VcIiArIHJhbmRvbVN0cmluZygpLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogZnVuY3Rpb24gUFJPQkVfVU5LTk9XTl9BQ1RJT04oKSB7XG4gICAgcmV0dXJuIFwiQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTlwiICsgcmFuZG9tU3RyaW5nKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBvYmo7XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vLyBJbmxpbmVkIC8gc2hvcnRlbmVkIHZlcnNpb24gb2YgYGtpbmRPZmAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9raW5kLW9mXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG5cbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH0gLy8gb3RoZXJcblxuXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIHZhciB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICpcbiAqICoqV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgY29uZmlndXJlU3RvcmVgIG1ldGhvZFxuICogb2YgdGhlIGBAcmVkdXhqcy90b29sa2l0YCBwYWNrYWdlKiosIHdoaWNoIHJlcGxhY2VzIGBjcmVhdGVTdG9yZWAuXG4gKlxuICogUmVkdXggVG9vbGtpdCBpcyBvdXIgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIHdyaXRpbmcgUmVkdXggbG9naWMgdG9kYXksXG4gKiBpbmNsdWRpbmcgc3RvcmUgc2V0dXAsIHJlZHVjZXJzLCBkYXRhIGZldGNoaW5nLCBhbmQgbW9yZS5cbiAqXG4gKiAqKkZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSByZWFkIHRoaXMgUmVkdXggZG9jcyBwYWdlOioqXG4gKiAqKmh0dHBzOi8vcmVkdXguanMub3JnL2ludHJvZHVjdGlvbi93aHktcnRrLWlzLXJlZHV4LXRvZGF5KipcbiAqXG4gKiBgY29uZmlndXJlU3RvcmVgIGZyb20gUmVkdXggVG9vbGtpdCBpcyBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTdG9yZWAgdGhhdFxuICogc2ltcGxpZmllcyBzZXR1cCBhbmQgaGVscHMgYXZvaWQgY29tbW9uIGJ1Z3MuXG4gKlxuICogWW91IHNob3VsZCBub3QgYmUgdXNpbmcgdGhlIGByZWR1eGAgY29yZSBwYWNrYWdlIGJ5IGl0c2VsZiB0b2RheSwgZXhjZXB0IGZvciBsZWFybmluZyBwdXJwb3Nlcy5cbiAqIFRoZSBgY3JlYXRlU3RvcmVgIG1ldGhvZCBmcm9tIHRoZSBjb3JlIGByZWR1eGAgcGFja2FnZSB3aWxsIG5vdCBiZSByZW1vdmVkLCBidXQgd2UgZW5jb3VyYWdlXG4gKiBhbGwgdXNlcnMgdG8gbWlncmF0ZSB0byB1c2luZyBSZWR1eCBUb29sa2l0IGZvciBhbGwgUmVkdXggY29kZS5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgYGNyZWF0ZVN0b3JlYCB3aXRob3V0IHRoaXMgdmlzdWFsIGRlcHJlY2F0aW9uIHdhcm5pbmcsIHVzZVxuICogdGhlIGBsZWdhY3lfY3JlYXRlU3RvcmVgIGltcG9ydCBpbnN0ZWFkOlxuICpcbiAqIGBpbXBvcnQgeyBsZWdhY3lfY3JlYXRlU3RvcmUgYXMgY3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4J2BcbiAqXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZW5oYW5jZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogJ0l0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvICcgKyAnY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gJyArICd0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoZW5oYW5jZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcIkV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihyZWR1Y2VyKSArIFwiJ1wiKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICB2YXIgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhpcyBtYWtlcyBhIHNoYWxsb3cgY29weSBvZiBjdXJyZW50TGlzdGVuZXJzIHNvIHdlIGNhbiB1c2VcbiAgICogbmV4dExpc3RlbmVycyBhcyBhIHRlbXBvcmFyeSBsaXN0IHdoaWxlIGRpc3BhdGNoaW5nLlxuICAgKlxuICAgKiBUaGlzIHByZXZlbnRzIGFueSBidWdzIGFyb3VuZCBjb25zdW1lcnMgY2FsbGluZ1xuICAgKiBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLlxuICAgKi9cblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiAnWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuICcgKyAnUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG5cblxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobGlzdGVuZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogXCJBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJ1wiICsga2luZE9mKGFjdGlvbikgKyBcIicuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLlwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBcIkV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG5leHRSZWR1Y2VyKSk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjsgLy8gVGhpcyBhY3Rpb24gaGFzIGEgc2ltaWxpYXIgZWZmZWN0IHRvIEFjdGlvblR5cGVzLklOSVQuXG4gICAgLy8gQW55IHJlZHVjZXJzIHRoYXQgZXhpc3RlZCBpbiBib3RoIHRoZSBuZXcgYW5kIG9sZCByb290UmVkdWNlclxuICAgIC8vIHdpbGwgcmVjZWl2ZSB0aGUgcHJldmlvdXMgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gICAgLy8gdGhlIG5ldyBzdGF0ZSB0cmVlIHdpdGggYW55IHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgb2xkIG9uZS5cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihvYnNlcnZlcikgKyBcIidcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgX3JlZlskJG9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX3JlZjtcbiAgfSAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cblxuXG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gIH0pO1xuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqXG4gKiAqKldlIHJlY29tbWVuZCB1c2luZyBgY29uZmlndXJlU3RvcmVgIGZyb20gdGhlXG4gKiBgQHJlZHV4anMvdG9vbGtpdGAgcGFja2FnZSoqLCB3aGljaCByZXBsYWNlcyBgY3JlYXRlU3RvcmVgOlxuICogKipodHRwczovL3JlZHV4LmpzLm9yZy9pbnRyb2R1Y3Rpb24vd2h5LXJ0ay1pcy1yZWR1eC10b2RheSoqXG4gKlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtlbmhhbmNlcl0gVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5cbnZhciBsZWdhY3lfY3JlYXRlU3RvcmUgPSBjcmVhdGVTdG9yZTtcblxuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuXG59XG5cbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuSU5JVCA/ICdwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmUnIDogJ3ByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyJztcblxuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgJyArICd0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuJztcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBcIlRoZSBcIiArIGFyZ3VtZW50TmFtZSArIFwiIGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXFxcIlwiICsga2luZE9mKGlucHV0U3RhdGUpICsgXCJcXFwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIFwiICsgKFwia2V5czogXFxcIlwiICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCJcIik7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5SRVBMQUNFKSByZXR1cm47XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gXCJVbmV4cGVjdGVkIFwiICsgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyAna2V5cycgOiAna2V5JykgKyBcIiBcIiArIChcIlxcXCJcIiArIHVuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiIGZvdW5kIGluIFwiICsgYXJndW1lbnROYW1lICsgXCIuIFwiKSArIFwiRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiArIChcIlxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBcIiArIFwiSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IFwiICsgXCJleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IFwiICsgXCJub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCBcIiArIFwieW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBcIiArIChcIkRvbid0IHRyeSB0byBoYW5kbGUgJ1wiICsgQWN0aW9uVHlwZXMuSU5JVCArIFwiJyBvciBvdGhlciBhY3Rpb25zIGluIFxcXCJyZWR1eC8qXFxcIiBcIikgKyBcIm5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIFwiICsgXCJjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBcIiArIFwiaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIFwiICsgXCJhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5cIik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBmaW5hbFJlZHVjZXJzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoXCJObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpOyAvLyBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHdhcm4gYWJvdXQgdGhlIHNhbWVcbiAgLy8ga2V5cyBtdWx0aXBsZSB0aW1lcy5cblxuICB2YXIgdW5leHBlY3RlZEtleUNhY2hlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2hhcGVBc3NlcnRpb25FcnJvcjtcblxuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuXG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfa2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tfaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNbX2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW19rZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBcIldoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgXCIgKyAoYWN0aW9uVHlwZSA/IFwiXFxcIlwiICsgU3RyaW5nKGFjdGlvblR5cGUpICsgXCJcXFwiXCIgOiAnKHVua25vd24gdHlwZSknKSArIFwiLCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIF9rZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBcIiArIFwiVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBcIiArIFwiSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBuZXh0U3RhdGVbX2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuXG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uIGNyZWF0b3JzLCBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZVxuICogc2FtZSBrZXlzLCBidXQgd2l0aCBldmVyeSBmdW5jdGlvbiB3cmFwcGVkIGludG8gYSBgZGlzcGF0Y2hgIGNhbGwgc28gdGhleVxuICogbWF5IGJlIGludm9rZWQgZGlyZWN0bHkuIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCwgYXMgeW91IGNhbiBjYWxsXG4gKiBgc3RvcmUuZGlzcGF0Y2goTXlBY3Rpb25DcmVhdG9ycy5kb1NvbWV0aGluZygpKWAgeW91cnNlbGYganVzdCBmaW5lLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYW4gYWN0aW9uIGNyZWF0b3IgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIGdldCBhIGRpc3BhdGNoIHdyYXBwZWQgZnVuY3Rpb24gaW4gcmV0dXJuLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBhY3Rpb25DcmVhdG9ycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb25cbiAqIGNyZWF0b3IgZnVuY3Rpb25zLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpbiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhc2BcbiAqIHN5bnRheC4gWW91IG1heSBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcGF0Y2ggVGhlIGBkaXNwYXRjaGAgZnVuY3Rpb24gYXZhaWxhYmxlIG9uIHlvdXIgUmVkdXhcbiAqIHN0b3JlLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFRoZSBvYmplY3QgbWltaWNraW5nIHRoZSBvcmlnaW5hbCBvYmplY3QsIGJ1dCB3aXRoXG4gKiBldmVyeSBhY3Rpb24gY3JlYXRvciB3cmFwcGVkIGludG8gdGhlIGBkaXNwYXRjaGAgY2FsbC4gSWYgeW91IHBhc3NlZCBhXG4gKiBmdW5jdGlvbiBhcyBgYWN0aW9uQ3JlYXRvcnNgLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWxzbyBiZSBhIHNpbmdsZVxuICogZnVuY3Rpb24uXG4gKi9cblxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09ICdvYmplY3QnIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoYWN0aW9uQ3JlYXRvcnMpICsgXCInLiBcIiArIFwiRGlkIHlvdSB3cml0ZSBcXFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiIGluc3RlYWQgb2YgXFxcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiP1wiKTtcbiAgfVxuXG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgdmFyIGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaWRkbGV3YXJlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuXG4gICAgICB2YXIgX2Rpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6ICdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh2b2lkIDAsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdG9yZSksIHt9LCB7XG4gICAgICAgIGRpc3BhdGNoOiBfZGlzcGF0Y2hcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlLCBsZWdhY3lfY3JlYXRlU3RvcmUgfTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cy5vbmNlID0gb25jZTtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHNDb3VudCA9IDA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsICdkZWZhdWx0TWF4TGlzdGVuZXJzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwIHx8IE51bWJlcklzTmFOKGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7XG4gICAgfVxuICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7XG4gIH1cbn0pO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gIGlmICh0aGlzLl9ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgTnVtYmVySXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTtcbiAgfVxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuIF9nZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PT0gdW5kZWZpbmVkKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMClcbiAgICAgIGVyID0gYXJnc1swXTtcbiAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgLy8gTm90ZTogVGhlIGNvbW1lbnRzIG9uIHRoZSBgdGhyb3dgIGxpbmVzIGFyZSBpbnRlbnRpb25hbCwgdGhleSBzaG93XG4gICAgICAvLyB1cCBpbiBOb2RlJ3Mgb3V0cHV0IGlmIHRoaXMgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLlxuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfVxuICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmhhbmRsZWQgZXJyb3IuJyArIChlciA/ICcgKCcgKyBlci5tZXNzYWdlICsgJyknIDogJycpKTtcbiAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgIHRocm93IGVycjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFJlZmxlY3RBcHBseShoYW5kbGVyLCB0aGlzLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpXSwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPVxuICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHtcbiAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIG0gPSBfZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG4gICAgaWYgKG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0gJiYgIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGVycm9yIGNvZGUgZm9yIHRoaXMgc2luY2UgaXQgaXMgYSBXYXJuaW5nXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyBTdHJpbmcodHlwZSkgKyAnIGxpc3RlbmVycyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY3JlYXNlIGxpbWl0Jyk7XG4gICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgIHcudHlwZSA9IHR5cGU7XG4gICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgUHJvY2Vzc0VtaXRXYXJuaW5nKHcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfTtcblxuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGxpc3QgPSBldmVudHNbdHlwZV07XG4gICAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cywgaTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuZnVuY3Rpb24gX2xpc3RlbmVycyh0YXJnZXQsIHR5cGUsIHVud3JhcCkge1xuICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKGV2bGlzdGVuZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB1bndyYXAgPyBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXSA6IFtldmxpc3RlbmVyXTtcblxuICByZXR1cm4gdW53cmFwID9cbiAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCB0cnVlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0T3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKDsgaW5kZXggKyAxIDwgbGlzdC5sZW5ndGg7IGluZGV4KyspXG4gICAgbGlzdFtpbmRleF0gPSBsaXN0W2luZGV4ICsgMV07XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVyKCkge1xuICAgICAgaWYgKHR5cGVvZiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCByZXNvbHZlciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGlmIChuYW1lICE9PSAnZXJyb3InKSB7XG4gICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgaGFuZGxlciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsICdlcnJvcicsIGhhbmRsZXIsIGZsYWdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlXG4gICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS5cbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZVxuICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS5cbiAgICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgbGlzdGVuZXIoYXJnKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlbWl0dGVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEV2ZW50RW1pdHRlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGVtaXR0ZXIpO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwiYXNzZXRzL2ltYWdlcy9sb2dvLjJhN2JmZjBjMTE4OTE4M2ZhZmU3MWQ3ZDViOTRlMGNkLnBuZ1wiOyIsIihmdW5jdGlvbihhLGIpe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sYik7ZWxzZSBpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgZXhwb3J0cyliKCk7ZWxzZXtiKCksYS5GaWxlU2F2ZXI9e2V4cG9ydHM6e319LmV4cG9ydHN9fSkodGhpcyxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYSxiKXtyZXR1cm5cInVuZGVmaW5lZFwiPT10eXBlb2YgYj9iPXthdXRvQm9tOiExfTpcIm9iamVjdFwiIT10eXBlb2YgYiYmKGNvbnNvbGUud2FybihcIkRlcHJlY2F0ZWQ6IEV4cGVjdGVkIHRoaXJkIGFyZ3VtZW50IHRvIGJlIGEgb2JqZWN0XCIpLGI9e2F1dG9Cb206IWJ9KSxiLmF1dG9Cb20mJi9eXFxzKig/OnRleHRcXC9cXFMqfGFwcGxpY2F0aW9uXFwveG1sfFxcUypcXC9cXFMqXFwreG1sKVxccyo7LipjaGFyc2V0XFxzKj1cXHMqdXRmLTgvaS50ZXN0KGEudHlwZSk/bmV3IEJsb2IoW1wiXFx1RkVGRlwiLGFdLHt0eXBlOmEudHlwZX0pOmF9ZnVuY3Rpb24gYyhhLGIsYyl7dmFyIGQ9bmV3IFhNTEh0dHBSZXF1ZXN0O2Qub3BlbihcIkdFVFwiLGEpLGQucmVzcG9uc2VUeXBlPVwiYmxvYlwiLGQub25sb2FkPWZ1bmN0aW9uKCl7ZyhkLnJlc3BvbnNlLGIsYyl9LGQub25lcnJvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoXCJjb3VsZCBub3QgZG93bmxvYWQgZmlsZVwiKX0sZC5zZW5kKCl9ZnVuY3Rpb24gZChhKXt2YXIgYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yi5vcGVuKFwiSEVBRFwiLGEsITEpO3RyeXtiLnNlbmQoKX1jYXRjaChhKXt9cmV0dXJuIDIwMDw9Yi5zdGF0dXMmJjI5OT49Yi5zdGF0dXN9ZnVuY3Rpb24gZShhKXt0cnl7YS5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KFwiY2xpY2tcIikpfWNhdGNoKGMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiTW91c2VFdmVudHNcIik7Yi5pbml0TW91c2VFdmVudChcImNsaWNrXCIsITAsITAsd2luZG93LDAsMCwwLDgwLDIwLCExLCExLCExLCExLDAsbnVsbCksYS5kaXNwYXRjaEV2ZW50KGIpfX12YXIgZj1cIm9iamVjdFwiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cud2luZG93PT09d2luZG93P3dpbmRvdzpcIm9iamVjdFwiPT10eXBlb2Ygc2VsZiYmc2VsZi5zZWxmPT09c2VsZj9zZWxmOlwib2JqZWN0XCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbC5nbG9iYWw9PT1nbG9iYWw/Z2xvYmFsOnZvaWQgMCxhPWYubmF2aWdhdG9yJiYvTWFjaW50b3NoLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYvQXBwbGVXZWJLaXQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGc9Zi5zYXZlQXN8fChcIm9iamVjdFwiIT10eXBlb2Ygd2luZG93fHx3aW5kb3chPT1mP2Z1bmN0aW9uKCl7fTpcImRvd25sb2FkXCJpbiBIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGUmJiFhP2Z1bmN0aW9uKGIsZyxoKXt2YXIgaT1mLlVSTHx8Zi53ZWJraXRVUkwsaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtnPWd8fGIubmFtZXx8XCJkb3dubG9hZFwiLGouZG93bmxvYWQ9ZyxqLnJlbD1cIm5vb3BlbmVyXCIsXCJzdHJpbmdcIj09dHlwZW9mIGI/KGouaHJlZj1iLGoub3JpZ2luPT09bG9jYXRpb24ub3JpZ2luP2Uoaik6ZChqLmhyZWYpP2MoYixnLGgpOmUoaixqLnRhcmdldD1cIl9ibGFua1wiKSk6KGouaHJlZj1pLmNyZWF0ZU9iamVjdFVSTChiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5yZXZva2VPYmplY3RVUkwoai5ocmVmKX0sNEU0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZShqKX0sMCkpfTpcIm1zU2F2ZU9yT3BlbkJsb2JcImluIG5hdmlnYXRvcj9mdW5jdGlvbihmLGcsaCl7aWYoZz1nfHxmLm5hbWV8fFwiZG93bmxvYWRcIixcInN0cmluZ1wiIT10eXBlb2YgZiluYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihiKGYsaCksZyk7ZWxzZSBpZihkKGYpKWMoZixnLGgpO2Vsc2V7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7aS5ocmVmPWYsaS50YXJnZXQ9XCJfYmxhbmtcIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZShpKX0pfX06ZnVuY3Rpb24oYixkLGUsZyl7aWYoZz1nfHxvcGVuKFwiXCIsXCJfYmxhbmtcIiksZyYmKGcuZG9jdW1lbnQudGl0bGU9Zy5kb2N1bWVudC5ib2R5LmlubmVyVGV4dD1cImRvd25sb2FkaW5nLi4uXCIpLFwic3RyaW5nXCI9PXR5cGVvZiBiKXJldHVybiBjKGIsZCxlKTt2YXIgaD1cImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiPT09Yi50eXBlLGk9L2NvbnN0cnVjdG9yL2kudGVzdChmLkhUTUxFbGVtZW50KXx8Zi5zYWZhcmksaj0vQ3JpT1NcXC9bXFxkXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoKGp8fGgmJml8fGEpJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgRmlsZVJlYWRlcil7dmFyIGs9bmV3IEZpbGVSZWFkZXI7ay5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXt2YXIgYT1rLnJlc3VsdDthPWo/YTphLnJlcGxhY2UoL15kYXRhOlteO10qOy8sXCJkYXRhOmF0dGFjaG1lbnQvZmlsZTtcIiksZz9nLmxvY2F0aW9uLmhyZWY9YTpsb2NhdGlvbj1hLGc9bnVsbH0say5yZWFkQXNEYXRhVVJMKGIpfWVsc2V7dmFyIGw9Zi5VUkx8fGYud2Via2l0VVJMLG09bC5jcmVhdGVPYmplY3RVUkwoYik7Zz9nLmxvY2F0aW9uPW06bG9jYXRpb24uaHJlZj1tLGc9bnVsbCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bC5yZXZva2VPYmplY3RVUkwobSl9LDRFNCl9fSk7Zi5zYXZlQXM9Zy5zYXZlQXM9ZyxcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlJiYobW9kdWxlLmV4cG9ydHM9Zyl9KTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZVNhdmVyLm1pbi5qcy5tYXAiLCJleHBvcnQgdmFyIGZvY3VzT24gPSBmdW5jdGlvbiAodGFyZ2V0LCBmb2N1c09wdGlvbnMpIHtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAvLyBub3QgY2xlYXIgaG93LCBidXQgaXMgcG9zc2libGUgaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS9mb2N1cy1sb2NrL2lzc3Vlcy81M1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgnZm9jdXMnIGluIHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuZm9jdXMoZm9jdXNPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKCdjb250ZW50V2luZG93JyBpbiB0YXJnZXQgJiYgdGFyZ2V0LmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgdGFyZ2V0LmNvbnRlbnRXaW5kb3cuZm9jdXMoKTtcbiAgICB9XG59O1xuIiwiLyoqXG4gKiBkZWZpbmVzIGEgZm9jdXMgZ3JvdXBcbiAqL1xuZXhwb3J0IHZhciBGT0NVU19HUk9VUCA9ICdkYXRhLWZvY3VzLWxvY2snO1xuLyoqXG4gKiBkaXNhYmxlcyBlbGVtZW50IGRpc2NvdmVyeSBpbnNpZGUgYSBncm91cCBtYXJrZWQgYnkga2V5XG4gKi9cbmV4cG9ydCB2YXIgRk9DVVNfRElTQUJMRUQgPSAnZGF0YS1mb2N1cy1sb2NrLWRpc2FibGVkJztcbi8qKlxuICogYWxsb3dzIHVuY29udHJvbGxlZCBmb2N1cyB3aXRoaW4gdGhlIG1hcmtlZCBhcmVhLCBlZmZlY3RpdmVseSBkaXNhYmxpbmcgZm9jdXMgbG9jayBmb3IgaXQncyBjb250ZW50XG4gKi9cbmV4cG9ydCB2YXIgRk9DVVNfQUxMT1cgPSAnZGF0YS1uby1mb2N1cy1sb2NrJztcbi8qKlxuICogaW5zdHJ1Y3RzIGF1dG9mb2N1cyBlbmdpbmUgdG8gcGljayBkZWZhdWx0IGF1dG9mb2N1cyBpbnNpZGUgYSBnaXZlbiBub2RlXG4gKiBjYW4gYmUgc2V0IG9uIHRoZSBlbGVtZW50IG9yIGNvbnRhaW5lclxuICovXG5leHBvcnQgdmFyIEZPQ1VTX0FVVE8gPSAnZGF0YS1hdXRvZm9jdXMtaW5zaWRlJztcbi8qKlxuICogaW5zdHJ1Y3RzIGF1dG9mb2N1cyB0byBpZ25vcmUgZWxlbWVudHMgd2l0aGluIGEgZ2l2ZW4gbm9kZVxuICogY2FuIGJlIHNldCBvbiB0aGUgZWxlbWVudCBvciBjb250YWluZXJcbiAqL1xuZXhwb3J0IHZhciBGT0NVU19OT19BVVRPRk9DVVMgPSAnZGF0YS1uby1hdXRvZm9jdXMnO1xuIiwiaW1wb3J0IHsgY29udGFpbnMgfSBmcm9tICcuL3V0aWxzL0RPTXV0aWxzJztcbmltcG9ydCB7IGdldEFsbEFmZmVjdGVkTm9kZXMgfSBmcm9tICcuL3V0aWxzL2FsbC1hZmZlY3RlZCc7XG5pbXBvcnQgeyBnZXRGaXJzdCwgdG9BcnJheSB9IGZyb20gJy4vdXRpbHMvYXJyYXknO1xuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudCB9IGZyb20gJy4vdXRpbHMvZ2V0QWN0aXZlRWxlbWVudCc7XG52YXIgZm9jdXNJbkZyYW1lID0gZnVuY3Rpb24gKGZyYW1lLCBhY3RpdmVFbGVtZW50KSB7IHJldHVybiBmcmFtZSA9PT0gYWN0aXZlRWxlbWVudDsgfTtcbnZhciBmb2N1c0luc2lkZUlmcmFtZSA9IGZ1bmN0aW9uICh0b3BOb2RlLCBhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odG9BcnJheSh0b3BOb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpKS5zb21lKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBmb2N1c0luRnJhbWUobm9kZSwgYWN0aXZlRWxlbWVudCk7IH0pKTtcbn07XG4vKipcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlLCBpZiB0aGUgY3VycmVudCBmb2N1cyBpcyBpbnNpZGUgZ2l2ZW4gbm9kZSBvciBub2Rlcy5cbiAqIFN1cHBvcnRzIG5vZGVzIGhpZGRlbiBpbnNpZGUgc2hhZG93RG9tXG4gKi9cbmV4cG9ydCB2YXIgZm9jdXNJbnNpZGUgPSBmdW5jdGlvbiAodG9wTm9kZSwgYWN0aXZlRWxlbWVudCkge1xuICAgIC8vIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudCAmJiBnZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgaWYgKGFjdGl2ZUVsZW1lbnQgPT09IHZvaWQgMCkgeyBhY3RpdmVFbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudChnZXRGaXJzdCh0b3BOb2RlKS5vd25lckRvY3VtZW50KTsgfVxuICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAoYWN0aXZlRWxlbWVudC5kYXRhc2V0ICYmIGFjdGl2ZUVsZW1lbnQuZGF0YXNldC5mb2N1c0d1YXJkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBnZXRBbGxBZmZlY3RlZE5vZGVzKHRvcE5vZGUpLnNvbWUoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG5vZGUsIGFjdGl2ZUVsZW1lbnQpIHx8IGZvY3VzSW5zaWRlSWZyYW1lKG5vZGUsIGFjdGl2ZUVsZW1lbnQpO1xuICAgIH0pO1xufTtcbiIsImltcG9ydCB7IEZPQ1VTX0FMTE9XIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgY29udGFpbnMgfSBmcm9tICcuL3V0aWxzL0RPTXV0aWxzJztcbmltcG9ydCB7IHRvQXJyYXkgfSBmcm9tICcuL3V0aWxzL2FycmF5JztcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnQgfSBmcm9tICcuL3V0aWxzL2dldEFjdGl2ZUVsZW1lbnQnO1xuLyoqXG4gKiBjaGVja3MgaWYgZm9jdXMgaXMgaGlkZGVuIEZST00gdGhlIGZvY3VzLWxvY2tcbiAqIGllIGNvbnRhaW5lZCBpbnNpZGUgYSBub2RlIGZvY3VzLWxvY2sgc2hhbGwgaWdub3JlXG4gKlxuICogVGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gY291cGxlZCB3aXRoIHtAbGluayBGT0NVU19BTExPV30gY29uc3RhbnRcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gZm9jdXMgaXMgY3VycmVudGx5IGlzIGluIFwiYWxsb3dcIiBhcmVhXG4gKi9cbmV4cG9ydCB2YXIgZm9jdXNJc0hpZGRlbiA9IGZ1bmN0aW9uIChpbkRvY3VtZW50KSB7XG4gICAgaWYgKGluRG9jdW1lbnQgPT09IHZvaWQgMCkgeyBpbkRvY3VtZW50ID0gZG9jdW1lbnQ7IH1cbiAgICB2YXIgYWN0aXZlRWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoaW5Eb2N1bWVudCk7XG4gICAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gdGhpcyBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgRk9DVVNfQUxMT1cgd2l0aGluIHNoYWRvdyBkb21cbiAgICByZXR1cm4gdG9BcnJheShpbkRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIuY29uY2F0KEZPQ1VTX0FMTE9XLCBcIl1cIikpKS5zb21lKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBjb250YWlucyhub2RlLCBhY3RpdmVFbGVtZW50KTsgfSk7XG59O1xuIiwiaW1wb3J0IHsgTkVXX0ZPQ1VTLCBuZXdGb2N1cyB9IGZyb20gJy4vc29sdmVyJztcbmltcG9ydCB7IGdldEZvY3VzYWJsZU5vZGVzIH0gZnJvbSAnLi91dGlscy9ET011dGlscyc7XG5pbXBvcnQgeyBnZXRBbGxBZmZlY3RlZE5vZGVzIH0gZnJvbSAnLi91dGlscy9hbGwtYWZmZWN0ZWQnO1xuaW1wb3J0IHsgYXNBcnJheSwgZ2V0Rmlyc3QgfSBmcm9tICcuL3V0aWxzL2FycmF5JztcbmltcG9ydCB7IHBpY2tBdXRvZm9jdXMgfSBmcm9tICcuL3V0aWxzL2F1dG8tZm9jdXMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudCB9IGZyb20gJy4vdXRpbHMvZ2V0QWN0aXZlRWxlbWVudCc7XG5pbXBvcnQgeyBpc0RlZmluZWQsIGlzTm90QUd1YXJkIH0gZnJvbSAnLi91dGlscy9pcyc7XG5pbXBvcnQgeyBhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcywgZ2V0VG9wQ29tbW9uUGFyZW50IH0gZnJvbSAnLi91dGlscy9wYXJlbnRpbmcnO1xudmFyIHJlb3JkZXJOb2RlcyA9IGZ1bmN0aW9uIChzcmNOb2RlcywgZHN0Tm9kZXMpIHtcbiAgICB2YXIgcmVtYXAgPSBuZXcgTWFwKCk7XG4gICAgLy8gbm8gU2V0KGRzdE5vZGVzKSBmb3IgSUUxMSA6KFxuICAgIGRzdE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkgeyByZXR1cm4gcmVtYXAuc2V0KGVudGl0eS5ub2RlLCBlbnRpdHkpOyB9KTtcbiAgICAvLyByZW1hcCB0byBkc3ROb2Rlc1xuICAgIHJldHVybiBzcmNOb2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHJlbWFwLmdldChub2RlKTsgfSkuZmlsdGVyKGlzRGVmaW5lZCk7XG59O1xuLyoqXG4gKiBjb250YWlucyB0aGUgbWFpbiBsb2dpYyBvZiB0aGUgYGZvY3VzLWxvY2tgIHBhY2thZ2UuXG4gKlxuICogISB5b3UgcHJvYmFibHkgZG9udCBuZWVkIHRoaXMgZnVuY3Rpb24gIVxuICpcbiAqIGdpdmVuIHRvcCBub2RlKHMpIGFuZCB0aGUgbGFzdCBhY3RpdmUgZWxlbWVudCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGJlIGZvY3VzZWQgbmV4dFxuICogQHJldHVybnMgZWxlbWVudCB3aGljaCBzaG91bGQgYmUgZm9jdXNlZCB0byBtb3ZlIGZvY3VzIGluc2lkZVxuICogQHBhcmFtIHRvcE5vZGVcbiAqIEBwYXJhbSBsYXN0Tm9kZVxuICovXG5leHBvcnQgdmFyIGZvY3VzU29sdmVyID0gZnVuY3Rpb24gKHRvcE5vZGUsIGxhc3ROb2RlKSB7XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KGFzQXJyYXkodG9wTm9kZSkubGVuZ3RoID4gMCA/IGRvY3VtZW50IDogZ2V0Rmlyc3QodG9wTm9kZSkub3duZXJEb2N1bWVudCk7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRBbGxBZmZlY3RlZE5vZGVzKHRvcE5vZGUpLmZpbHRlcihpc05vdEFHdWFyZCk7XG4gICAgdmFyIGNvbW1vblBhcmVudCA9IGdldFRvcENvbW1vblBhcmVudChhY3RpdmVFbGVtZW50IHx8IHRvcE5vZGUsIHRvcE5vZGUsIGVudHJpZXMpO1xuICAgIHZhciB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgdmFyIGFueUZvY3VzYWJsZSA9IGdldEZvY3VzYWJsZU5vZGVzKGVudHJpZXMsIHZpc2liaWxpdHlDYWNoZSk7XG4gICAgdmFyIGlubmVyRWxlbWVudHMgPSBhbnlGb2N1c2FibGUuZmlsdGVyKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBpc05vdEFHdWFyZChub2RlKTtcbiAgICB9KTtcbiAgICBpZiAoIWlubmVyRWxlbWVudHNbMF0pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIG91dGVyTm9kZXMgPSBnZXRGb2N1c2FibGVOb2RlcyhbY29tbW9uUGFyZW50XSwgdmlzaWJpbGl0eUNhY2hlKS5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSk7XG4gICAgdmFyIG9yZGVyZWRJbm5lckVsZW1lbnRzID0gcmVvcmRlck5vZGVzKG91dGVyTm9kZXMsIGlubmVyRWxlbWVudHMpO1xuICAgIC8vIGNvbGxlY3QgaW5uZXIgZm9jdXNhYmxlIGFuZCBzZXBhcmF0ZWx5IHRhYmJhYmxlc1xuICAgIHZhciBpbm5lckZvY3VzYWJsZXMgPSBvcmRlcmVkSW5uZXJFbGVtZW50cy5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSk7XG4gICAgdmFyIGlubmVyVGFiYmFibGUgPSBvcmRlcmVkSW5uZXJFbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciB0YWJJbmRleCA9IF9hLnRhYkluZGV4O1xuICAgICAgICByZXR1cm4gdGFiSW5kZXggPj0gMDtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSk7XG4gICAgdmFyIG5ld0lkID0gbmV3Rm9jdXMoaW5uZXJGb2N1c2FibGVzLCBpbm5lclRhYmJhYmxlLCBvdXRlck5vZGVzLCBhY3RpdmVFbGVtZW50LCBsYXN0Tm9kZSk7XG4gICAgaWYgKG5ld0lkID09PSBORVdfRk9DVVMpIHtcbiAgICAgICAgdmFyIGZvY3VzTm9kZSA9IFxuICAgICAgICAvLyBmaXJzdCB0cnkgb25seSB0YWJiYWJsZSwgYW5kIHRoZSBmYWxsYmFjayB0byBhbGwgZm9jdXNhYmxlLCBhcyBsb25nIGFzIGF0IGxlYXN0IG9uZSBlbGVtZW50IHNob3VsZCBiZSBwaWNrZWQgZm9yIGZvY3VzXG4gICAgICAgIHBpY2tBdXRvZm9jdXMoYW55Rm9jdXNhYmxlLCBpbm5lclRhYmJhYmxlLCBhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcyhlbnRyaWVzLCB2aXNpYmlsaXR5Q2FjaGUpKSB8fFxuICAgICAgICAgICAgcGlja0F1dG9mb2N1cyhhbnlGb2N1c2FibGUsIGlubmVyRm9jdXNhYmxlcywgYWxsUGFyZW50QXV0b2ZvY3VzYWJsZXMoZW50cmllcywgdmlzaWJpbGl0eUNhY2hlKSk7XG4gICAgICAgIGlmIChmb2N1c05vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IGZvY3VzTm9kZSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdmb2N1cy1sb2NrOiBjYW5ub3QgZmluZCBhbnkgbm9kZSB0byBtb3ZlIGZvY3VzIGludG8nKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5ld0lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ld0lkO1xuICAgIH1cbiAgICByZXR1cm4gb3JkZXJlZElubmVyRWxlbWVudHNbbmV3SWRdO1xufTtcbiIsImltcG9ydCB7IGdldEFsbEFmZmVjdGVkTm9kZXMgfSBmcm9tICcuL3V0aWxzL2FsbC1hZmZlY3RlZCc7XG5pbXBvcnQgeyBpc0d1YXJkLCBpc05vdEFHdWFyZCB9IGZyb20gJy4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgZ2V0VG9wQ29tbW9uUGFyZW50IH0gZnJvbSAnLi91dGlscy9wYXJlbnRpbmcnO1xuaW1wb3J0IHsgb3JkZXJCeVRhYkluZGV4IH0gZnJvbSAnLi91dGlscy90YWJPcmRlcic7XG5pbXBvcnQgeyBnZXRGb2N1c2FibGVzIH0gZnJvbSAnLi91dGlscy90YWJVdGlscyc7XG4vKipcbiAqIHRyYXZlcnNlcyBhbGwgcmVsYXRlZCBub2RlcyAoaW5jbHVkaW5nIGdyb3VwcykgcmV0dXJuaW5nIGEgbGlzdCBvZiBhbGwgbm9kZXMob3V0ZXIgYW5kIGludGVybmFsKSB3aXRoIG1ldGEgaW5mb3JtYXRpb25cbiAqIFRoaXMgaXMgbG93LWxldmVsIEFQSSFcbiAqIEByZXR1cm5zIGxpc3Qgb2YgZm9jdXNhYmxlIGVsZW1lbnRzIGluc2lkZSBhIGdpdmVuIHRvcCghKSBub2RlLlxuICogQHNlZSB7QGxpbmsgZ2V0Rm9jdXNhYmxlTm9kZXN9IHByb3ZpZGluZyBhIHNpbXBsZXIgQVBJXG4gKi9cbmV4cG9ydCB2YXIgZXhwYW5kRm9jdXNhYmxlTm9kZXMgPSBmdW5jdGlvbiAodG9wTm9kZSkge1xuICAgIHZhciBlbnRyaWVzID0gZ2V0QWxsQWZmZWN0ZWROb2Rlcyh0b3BOb2RlKS5maWx0ZXIoaXNOb3RBR3VhcmQpO1xuICAgIHZhciBjb21tb25QYXJlbnQgPSBnZXRUb3BDb21tb25QYXJlbnQodG9wTm9kZSwgdG9wTm9kZSwgZW50cmllcyk7XG4gICAgdmFyIG91dGVyTm9kZXMgPSBvcmRlckJ5VGFiSW5kZXgoZ2V0Rm9jdXNhYmxlcyhbY29tbW9uUGFyZW50XSwgdHJ1ZSksIHRydWUsIHRydWUpO1xuICAgIHZhciBpbm5lckVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlcyhlbnRyaWVzLCBmYWxzZSk7XG4gICAgcmV0dXJuIG91dGVyTm9kZXMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGUsIGluZGV4ID0gX2EuaW5kZXg7XG4gICAgICAgIHJldHVybiAoe1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIGxvY2tJdGVtOiBpbm5lckVsZW1lbnRzLmluZGV4T2Yobm9kZSkgPj0gMCxcbiAgICAgICAgICAgIGd1YXJkOiBpc0d1YXJkKG5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyBmb2N1c09uIH0gZnJvbSAnLi9jb21tYW5kcyc7XG5pbXBvcnQgeyBmb2N1c1NvbHZlciB9IGZyb20gJy4vZm9jdXNTb2x2ZXInO1xudmFyIGd1YXJkQ291bnQgPSAwO1xudmFyIGxvY2tEaXNhYmxlZCA9IGZhbHNlO1xuLyoqXG4gKiBUaGUgbWFpbiBmdW5jdGlvbmFsaXR5IG9mIHRoZSBmb2N1cy1sb2NrIHBhY2thZ2VcbiAqXG4gKiBDb250YWlucyBmb2N1cyBhdCBhIGdpdmVuIG5vZGUuXG4gKiBUaGUgbGFzdCBmb2N1c2VkIGVsZW1lbnQgd2lsbCBoZWxwIHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50KGZpcnN0IG9yIGxhc3QpIHNob3VsZCBiZSBmb2N1c2VkLlxuICogVGhlIGZvdW5kIGVsZW1lbnQgd2lsbCBiZSBmb2N1c2VkLlxuICpcbiAqIFRoaXMgaXMgb25lIHRpbWUgYWN0aW9uIChtb3ZlKSwgbm90IGEgcGVyc2lzdGVudCBmb2N1cy1sb2NrXG4gKlxuICogSFRNTCBtYXJrZXJzIChzZWUge0BsaW5rIGltcG9ydCgnLi9jb25zdGFudHMnKS5GT0NVU19BVVRPfSBjb25zdGFudHMpIGNhbiBjb250cm9sIGF1dG9mb2N1c1xuICogQHNlZSB7QGxpbmsgZm9jdXNTb2x2ZXJ9IGZvciB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYXV0b2ZvY3VzXG4gKi9cbmV4cG9ydCB2YXIgbW92ZUZvY3VzSW5zaWRlID0gZnVuY3Rpb24gKHRvcE5vZGUsIGxhc3ROb2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgZm9jdXNhYmxlID0gZm9jdXNTb2x2ZXIodG9wTm9kZSwgbGFzdE5vZGUpO1xuICAgIC8vIGdsb2JhbCBsb2NhbCBzaWRlIGVmZmVjdCB0byBjb3VudGFpbiByZWN1cnNpdmUgbG9jayBhY3RpdmF0aW9uIGFuZCByZXNvbHZlIGZvY3VzLWZpZ2h0aW5nXG4gICAgaWYgKGxvY2tEaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChmb2N1c2FibGUpIHtcbiAgICAgICAgLyoqICtGT0NVUy1GSUdIVElORyBwcmV2ZW50aW9uICoqL1xuICAgICAgICBpZiAoZ3VhcmRDb3VudCA+IDIpIHtcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgcmVjdXJzaXZlIGVudGVyZWQgYmFjayB0aGUgbG9jayBhY3RpdmF0aW9uXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGb2N1c0xvY2s6IGZvY3VzLWZpZ2h0aW5nIGRldGVjdGVkLiBPbmx5IG9uZSBmb2N1cyBtYW5hZ2VtZW50IHN5c3RlbSBjb3VsZCBiZSBhY3RpdmUuICcgK1xuICAgICAgICAgICAgICAgICdTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS9mb2N1cy1sb2NrLyNmb2N1cy1maWdodGluZycpO1xuICAgICAgICAgICAgbG9ja0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxvY2tEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ3VhcmRDb3VudCsrO1xuICAgICAgICBmb2N1c09uKGZvY3VzYWJsZS5ub2RlLCBvcHRpb25zLmZvY3VzT3B0aW9ucyk7XG4gICAgICAgIGd1YXJkQ291bnQtLTtcbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgZ2V0VGFiYmFibGVOb2RlcyB9IGZyb20gJy4vdXRpbHMvRE9NdXRpbHMnO1xuZnVuY3Rpb24gd2Vha1JlZih2YWx1ZSkge1xuICAgIGlmICghdmFsdWUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIC8vICM2OCBTYWZhcmkgMTQuMSBkb250IGhhdmUgaXQgeWV0XG4gICAgLy8gRklYTUU6IHJlbW92ZSBpbiAyMDI1XG4gICAgaWYgKHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWUgfHwgbnVsbDsgfTtcbiAgICB9XG4gICAgdmFyIHcgPSB2YWx1ZSA/IG5ldyBXZWFrUmVmKHZhbHVlKSA6IG51bGw7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuICh3ID09PSBudWxsIHx8IHcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHcuZGVyZWYoKSkgfHwgbnVsbDsgfTtcbn1cbmV4cG9ydCB2YXIgcmVjb3JkRWxlbWVudExvY2F0aW9uID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgY3VycmVudDogd2Vha1JlZihjdXJyZW50RWxlbWVudCksXG4gICAgICAgICAgICBwYXJlbnQ6IHdlYWtSZWYoY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudCksXG4gICAgICAgICAgICBsZWZ0OiB3ZWFrUmVmKGN1cnJlbnRFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpLFxuICAgICAgICAgICAgcmlnaHQ6IHdlYWtSZWYoY3VycmVudEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudDogd2Vha1JlZihlbGVtZW50KSxcbiAgICAgICAgc3RhY2s6IHN0YWNrLFxuICAgICAgICBvd25lckRvY3VtZW50OiBlbGVtZW50Lm93bmVyRG9jdW1lbnQsXG4gICAgfTtcbn07XG52YXIgcmVzdG9yZUZvY3VzVG8gPSBmdW5jdGlvbiAobG9jYXRpb24pIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIHN0YWNrID0gbG9jYXRpb24uc3RhY2ssIG93bmVyRG9jdW1lbnQgPSBsb2NhdGlvbi5vd25lckRvY3VtZW50O1xuICAgIHZhciB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBzdGFja18xID0gc3RhY2s7IF9pIDwgc3RhY2tfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBzdGFja18xW19pXTtcbiAgICAgICAgdmFyIHBhcmVudF8xID0gKF9hID0gbGluZS5wYXJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGxpbmUpO1xuICAgICAgICAvLyBpcyBpdCBzdGlsbCBoZXJlP1xuICAgICAgICBpZiAocGFyZW50XzEgJiYgb3duZXJEb2N1bWVudC5jb250YWlucyhwYXJlbnRfMSkpIHtcbiAgICAgICAgICAgIHZhciBsZWZ0ID0gKF9iID0gbGluZS5sZWZ0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChsaW5lKTtcbiAgICAgICAgICAgIHZhciBzYXZlZEN1cnJlbnQgPSBsaW5lLmN1cnJlbnQoKTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gcGFyZW50XzEuY29udGFpbnMoc2F2ZWRDdXJyZW50KSA/IHNhdmVkQ3VycmVudCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZhciByaWdodCA9IChfYyA9IGxpbmUucmlnaHQpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5jYWxsKGxpbmUpO1xuICAgICAgICAgICAgdmFyIGZvY3VzYWJsZXMgPSBnZXRUYWJiYWJsZU5vZGVzKFtwYXJlbnRfMV0sIHZpc2liaWxpdHlDYWNoZSk7XG4gICAgICAgICAgICB2YXIgYWltID0gXG4gICAgICAgICAgICAvLyB0aGF0IGlzIGVsZW1lbnQgaXRzZWxmXG4gICAgICAgICAgICAoX2UgPSAoX2QgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQgIT09IHZvaWQgMCA/IGN1cnJlbnQgOiBcbiAgICAgICAgICAgIC8vIG9yIHNvbWV0aGluZyBpbiBpdCdzIHBsYWNlXG4gICAgICAgICAgICBsZWZ0ID09PSBudWxsIHx8IGxlZnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxlZnQubmV4dEVsZW1lbnRTaWJsaW5nKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcbiAgICAgICAgICAgIC8vIG9yIHNvbWVib2R5IHRvIHRoZSByaWdodCwgc3RpbGwgY2xvc2UgZW5vdWdoXG4gICAgICAgICAgICByaWdodCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogXG4gICAgICAgICAgICAvLyBvciBzb21lYm9keSB0byB0aGUgbGVmdCwgc29tZXRoaW5nP1xuICAgICAgICAgICAgbGVmdDtcbiAgICAgICAgICAgIHdoaWxlIChhaW0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfZiA9IDAsIGZvY3VzYWJsZXNfMSA9IGZvY3VzYWJsZXM7IF9mIDwgZm9jdXNhYmxlc18xLmxlbmd0aDsgX2YrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm9jdXNhYmxlID0gZm9jdXNhYmxlc18xW19mXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFpbSA9PT0gbnVsbCB8fCBhaW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFpbS5jb250YWlucyhmb2N1c2FibGUubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2FibGUubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhaW0gPSBhaW0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvY3VzYWJsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgcGFyZW50IGNvbnRhaW5zIGEgZm9jdXNhYmxlIC0gbW92ZSB0aGVyZVxuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2FibGVzWzBdLm5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbm90aGluZyBtYXRjaGVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4vKipcbiAqIENhcHR1cmVzIHRoZSBjdXJyZW50IGZvY3VzZWQgZWxlbWVudCB0byByZXN0b3JlIGZvY3VzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIGluIHRoZSBmdXR1cmVcbiAqIEhhbmRsZXMgc2l0dWF0aW9ucyB3aGVyZSB0aGUgZm9jdXNlZCBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NIG9yIG5vIGxvbmdlciBmb2N1c2FibGVcbiAqIG1vdmluZyBmb2N1cyB0byB0aGUgY2xvc2VzdCBmb2N1c2FibGUgZWxlbWVudFxuICogQHBhcmFtIHRhcmdldEVsZW1lbnQgLSBlbGVtZW50IHdoZXJlIGZvY3VzIHNob3VsZCBiZSByZXN0b3JlZFxuICogQHJldHVybnMgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBuZXcgZWxlbWVudCB0byBmb2N1c1xuICovXG5leHBvcnQgdmFyIGNhcHR1cmVGb2N1c1Jlc3RvcmUgPSBmdW5jdGlvbiAodGFyZ2V0RWxlbWVudCkge1xuICAgIHZhciBsb2NhdGlvbiA9IHJlY29yZEVsZW1lbnRMb2NhdGlvbih0YXJnZXRFbGVtZW50KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcmVzdG9yZUZvY3VzVG8obG9jYXRpb24pO1xuICAgIH07XG59O1xuIiwiaW1wb3J0IHsgZm9jdXNPbiB9IGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IHsgZ2V0VGFiYmFibGVOb2RlcywgY29udGFpbnMsIGdldEZvY3VzYWJsZU5vZGVzIH0gZnJvbSAnLi91dGlscy9ET011dGlscyc7XG5pbXBvcnQgeyBhc0FycmF5IH0gZnJvbSAnLi91dGlscy9hcnJheSc7XG4vKipcbiAqIGZvciBhIGdpdmVuIGBlbGVtZW50YCBpbiBhIGdpdmVuIGBzY29wZWAgcmV0dXJucyBmb2N1c2FibGUgc2libGluZ3NcbiAqIEBwYXJhbSBlbGVtZW50IC0gYmFzZSBlbGVtZW50XG4gKiBAcGFyYW0gc2NvcGUgLSBjb21tb24gcGFyZW50LiBDYW4gYmUgZG9jdW1lbnQsIGJ1dCBiZXR0ZXIgdG8gbmFycm93IGl0IGRvd24gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcbiAqIEByZXR1cm5zIHtwcmV2LG5leHR9IC0gcmVmZXJlbmNlcyB0byBhIGZvY3VzYWJsZSBlbGVtZW50IGJlZm9yZSBhbmQgYWZ0ZXJcbiAqIEByZXR1cm5zIHVuZGVmaW5lZCAtIGlmIG9wZXJhdGlvbiBpcyBub3QgYXBwbGljYWJsZVxuICovXG5leHBvcnQgdmFyIGdldFJlbGF0aXZlRm9jdXNhYmxlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHNjb3BlLCB1c2VUYWJiYWJsZXMpIHtcbiAgICBpZiAoIWVsZW1lbnQgfHwgIXNjb3BlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ25vIGVsZW1lbnQgb3Igc2NvcGUgZ2l2ZW4nKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICB2YXIgc2hhcmRzID0gYXNBcnJheShzY29wZSk7XG4gICAgaWYgKHNoYXJkcy5ldmVyeShmdW5jdGlvbiAoc2hhcmQpIHsgcmV0dXJuICFjb250YWlucyhzaGFyZCwgZWxlbWVudCk7IH0pKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZSBlbGVtZW50IGlzIG5vdCBjb250YWluZWQgaW4gdGhlIHNjb3BlJyk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgdmFyIGZvY3VzYWJsZXMgPSB1c2VUYWJiYWJsZXNcbiAgICAgICAgPyBnZXRUYWJiYWJsZU5vZGVzKHNoYXJkcywgbmV3IE1hcCgpKVxuICAgICAgICA6IGdldEZvY3VzYWJsZU5vZGVzKHNoYXJkcywgbmV3IE1hcCgpKTtcbiAgICB2YXIgY3VycmVudCA9IGZvY3VzYWJsZXMuZmluZEluZGV4KGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBub2RlID09PSBlbGVtZW50O1xuICAgIH0pO1xuICAgIGlmIChjdXJyZW50ID09PSAtMSkge1xuICAgICAgICAvLyBhbiBlZGdlIGNhc2UsIHdoZW4gYW5jaG9yIGVsZW1lbnQgaXMgbm90IGZvdW5kXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHByZXY6IGZvY3VzYWJsZXNbY3VycmVudCAtIDFdLFxuICAgICAgICBuZXh0OiBmb2N1c2FibGVzW2N1cnJlbnQgKyAxXSxcbiAgICAgICAgZmlyc3Q6IGZvY3VzYWJsZXNbMF0sXG4gICAgICAgIGxhc3Q6IGZvY3VzYWJsZXNbZm9jdXNhYmxlcy5sZW5ndGggLSAxXSxcbiAgICB9O1xufTtcbnZhciBnZXRCb3VuZGFyeSA9IGZ1bmN0aW9uIChzaGFyZHMsIHVzZVRhYmJhYmxlcykge1xuICAgIHZhciBzZXQgPSB1c2VUYWJiYWJsZXNcbiAgICAgICAgPyBnZXRUYWJiYWJsZU5vZGVzKGFzQXJyYXkoc2hhcmRzKSwgbmV3IE1hcCgpKVxuICAgICAgICA6IGdldEZvY3VzYWJsZU5vZGVzKGFzQXJyYXkoc2hhcmRzKSwgbmV3IE1hcCgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmaXJzdDogc2V0WzBdLFxuICAgICAgICBsYXN0OiBzZXRbc2V0Lmxlbmd0aCAtIDFdLFxuICAgIH07XG59O1xudmFyIGRlZmF1bHRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHNjb3BlOiBkb2N1bWVudC5ib2R5LFxuICAgICAgICBjeWNsZTogdHJ1ZSxcbiAgICAgICAgb25seVRhYmJhYmxlOiB0cnVlLFxuICAgIH0sIG9wdGlvbnMpO1xufTtcbnZhciBtb3ZlRm9jdXMgPSBmdW5jdGlvbiAoZnJvbUVsZW1lbnQsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgbmV3T3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zKG9wdGlvbnMpO1xuICAgIHZhciBzb2x1dGlvbiA9IGdldFJlbGF0aXZlRm9jdXNhYmxlKGZyb21FbGVtZW50LCBuZXdPcHRpb25zLnNjb3BlLCBuZXdPcHRpb25zLm9ubHlUYWJiYWJsZSk7XG4gICAgaWYgKCFzb2x1dGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0YXJnZXQgPSBjYihzb2x1dGlvbiwgbmV3T3B0aW9ucy5jeWNsZSk7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgICBmb2N1c09uKHRhcmdldC5ub2RlLCBuZXdPcHRpb25zLmZvY3VzT3B0aW9ucyk7XG4gICAgfVxufTtcbi8qKlxuICogZm9jdXNlcyBuZXh0IGVsZW1lbnQgaW4gdGhlIHRhYi1vcmRlclxuICogQHBhcmFtIGZyb21FbGVtZW50IC0gY29tbW9uIHBhcmVudCB0byBzY29wZSBhY3RpdmUgZWxlbWVudCBzZWFyY2ggb3IgdGFiIGN5Y2xlIG9yZGVyXG4gKiBAcGFyYW0ge0ZvY3VzTmV4dE9wdGlvbnN9IFtvcHRpb25zXSAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c05leHRFbGVtZW50ID0gZnVuY3Rpb24gKGZyb21FbGVtZW50LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBtb3ZlRm9jdXMoZnJvbUVsZW1lbnQsIG9wdGlvbnMsIGZ1bmN0aW9uIChfYSwgY3ljbGUpIHtcbiAgICAgICAgdmFyIG5leHQgPSBfYS5uZXh0LCBmaXJzdCA9IF9hLmZpcnN0O1xuICAgICAgICByZXR1cm4gbmV4dCB8fCAoY3ljbGUgJiYgZmlyc3QpO1xuICAgIH0pO1xufTtcbi8qKlxuICogZm9jdXNlcyBwcmV2IGVsZW1lbnQgaW4gdGhlIHRhYiBvcmRlclxuICogQHBhcmFtIGZyb21FbGVtZW50IC0gY29tbW9uIHBhcmVudCB0byBzY29wZSBhY3RpdmUgZWxlbWVudCBzZWFyY2ggb3IgdGFiIGN5Y2xlIG9yZGVyXG4gKiBAcGFyYW0ge0ZvY3VzTmV4dE9wdGlvbnN9IFtvcHRpb25zXSAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c1ByZXZFbGVtZW50ID0gZnVuY3Rpb24gKGZyb21FbGVtZW50LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBtb3ZlRm9jdXMoZnJvbUVsZW1lbnQsIG9wdGlvbnMsIGZ1bmN0aW9uIChfYSwgY3ljbGUpIHtcbiAgICAgICAgdmFyIHByZXYgPSBfYS5wcmV2LCBsYXN0ID0gX2EubGFzdDtcbiAgICAgICAgcmV0dXJuIHByZXYgfHwgKGN5Y2xlICYmIGxhc3QpO1xuICAgIH0pO1xufTtcbnZhciBwaWNrQm91bmRhcnkgPSBmdW5jdGlvbiAoc2NvcGUsIG9wdGlvbnMsIHdoYXQpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGJvdW5kYXJ5ID0gZ2V0Qm91bmRhcnkoc2NvcGUsIChfYSA9IG9wdGlvbnMub25seVRhYmJhYmxlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlKTtcbiAgICB2YXIgbm9kZSA9IGJvdW5kYXJ5W3doYXRdO1xuICAgIGlmIChub2RlKSB7XG4gICAgICAgIGZvY3VzT24obm9kZS5ub2RlLCBvcHRpb25zLmZvY3VzT3B0aW9ucyk7XG4gICAgfVxufTtcbi8qKlxuICogZm9jdXNlcyBmaXJzdCBlbGVtZW50IGluIHRoZSB0YWItb3JkZXJcbiAqIEBwYXJhbSB7Rm9jdXNOZXh0T3B0aW9uc30gb3B0aW9ucyAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c0ZpcnN0RWxlbWVudCA9IGZ1bmN0aW9uIChzY29wZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgcGlja0JvdW5kYXJ5KHNjb3BlLCBvcHRpb25zLCAnZmlyc3QnKTtcbn07XG4vKipcbiAqIGZvY3VzZXMgbGFzdCBlbGVtZW50IGluIHRoZSB0YWIgb3JkZXJcbiAqIEBwYXJhbSB7Rm9jdXNOZXh0T3B0aW9uc30gb3B0aW9ucyAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c0xhc3RFbGVtZW50ID0gZnVuY3Rpb24gKHNjb3BlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBwaWNrQm91bmRhcnkoc2NvcGUsIG9wdGlvbnMsICdsYXN0Jyk7XG59O1xuIiwiaW1wb3J0IHsgY29ycmVjdE5vZGVzIH0gZnJvbSAnLi91dGlscy9jb3JyZWN0Rm9jdXMnO1xuaW1wb3J0IHsgcGlja0ZvY3VzYWJsZSB9IGZyb20gJy4vdXRpbHMvZmlyc3RGb2N1cyc7XG5pbXBvcnQgeyBpc0d1YXJkIH0gZnJvbSAnLi91dGlscy9pcyc7XG5leHBvcnQgdmFyIE5FV19GT0NVUyA9ICdORVdfRk9DVVMnO1xuLyoqXG4gKiBNYWluIHNvbHZlciBmb3IgdGhlIFwiZmluZCBuZXh0IGZvY3VzXCIgcXVlc3Rpb25cbiAqIEBwYXJhbSBpbm5lck5vZGVzIC0gdXNlZCB0byBjb250cm9sIFwicmV0dXJuIGZvY3VzXCJcbiAqIEBwYXJhbSBpbm5lclRhYmJhYmxlcyAtIHVzZWQgdG8gY29udHJvbCBcImF1dG9mb2N1c1wiXG4gKiBAcGFyYW0gb3V0ZXJOb2Rlc1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnRcbiAqIEBwYXJhbSBsYXN0Tm9kZVxuICogQHJldHVybnMge251bWJlcnxzdHJpbmd8dW5kZWZpbmVkfCp9XG4gKi9cbmV4cG9ydCB2YXIgbmV3Rm9jdXMgPSBmdW5jdGlvbiAoaW5uZXJOb2RlcywgaW5uZXJUYWJiYWJsZXMsIG91dGVyTm9kZXMsIGFjdGl2ZUVsZW1lbnQsIGxhc3ROb2RlKSB7XG4gICAgdmFyIGNudCA9IGlubmVyTm9kZXMubGVuZ3RoO1xuICAgIHZhciBmaXJzdEZvY3VzID0gaW5uZXJOb2Rlc1swXTtcbiAgICB2YXIgbGFzdEZvY3VzID0gaW5uZXJOb2Rlc1tjbnQgLSAxXTtcbiAgICB2YXIgaXNPbkd1YXJkID0gaXNHdWFyZChhY3RpdmVFbGVtZW50KTtcbiAgICAvLyBmb2N1cyBpcyBpbnNpZGVcbiAgICBpZiAoYWN0aXZlRWxlbWVudCAmJiBpbm5lck5vZGVzLmluZGV4T2YoYWN0aXZlRWxlbWVudCkgPj0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgYWN0aXZlSW5kZXggPSBhY3RpdmVFbGVtZW50ICE9PSB1bmRlZmluZWQgPyBvdXRlck5vZGVzLmluZGV4T2YoYWN0aXZlRWxlbWVudCkgOiAtMTtcbiAgICB2YXIgbGFzdEluZGV4ID0gbGFzdE5vZGUgPyBvdXRlck5vZGVzLmluZGV4T2YobGFzdE5vZGUpIDogYWN0aXZlSW5kZXg7XG4gICAgdmFyIGxhc3ROb2RlSW5zaWRlID0gbGFzdE5vZGUgPyBpbm5lck5vZGVzLmluZGV4T2YobGFzdE5vZGUpIDogLTE7XG4gICAgLy8gbm8gYWN0aXZlIGZvY3VzIChvciBmb2N1cyBpcyBvbiB0aGUgYm9keSlcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIC8vIGtub3duIGZhbGxiYWNrXG4gICAgICAgIGlmIChsYXN0Tm9kZUluc2lkZSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTkVXX0ZPQ1VTO1xuICAgIH1cbiAgICAvLyBuZXcgZm9jdXMsIG5vdGhpbmcgdG8gY2FsY3VsYXRlXG4gICAgaWYgKGxhc3ROb2RlSW5zaWRlID09PSAtMSkge1xuICAgICAgICByZXR1cm4gTkVXX0ZPQ1VTO1xuICAgIH1cbiAgICB2YXIgaW5kZXhEaWZmID0gYWN0aXZlSW5kZXggLSBsYXN0SW5kZXg7XG4gICAgdmFyIGZpcnN0Tm9kZUluZGV4ID0gb3V0ZXJOb2Rlcy5pbmRleE9mKGZpcnN0Rm9jdXMpO1xuICAgIHZhciBsYXN0Tm9kZUluZGV4ID0gb3V0ZXJOb2Rlcy5pbmRleE9mKGxhc3RGb2N1cyk7XG4gICAgdmFyIGNvcnJlY3RlZE5vZGVzID0gY29ycmVjdE5vZGVzKG91dGVyTm9kZXMpO1xuICAgIHZhciBjb3JyZWN0ZWRJbmRleCA9IGFjdGl2ZUVsZW1lbnQgIT09IHVuZGVmaW5lZCA/IGNvcnJlY3RlZE5vZGVzLmluZGV4T2YoYWN0aXZlRWxlbWVudCkgOiAtMTtcbiAgICB2YXIgY29ycmVjdGVkSW5kZXhEaWZmID0gY29ycmVjdGVkSW5kZXggLSAobGFzdE5vZGUgPyBjb3JyZWN0ZWROb2Rlcy5pbmRleE9mKGxhc3ROb2RlKSA6IGFjdGl2ZUluZGV4KTtcbiAgICAvLyBvbGQgZm9jdXNcbiAgICBpZiAoIWluZGV4RGlmZiAmJiBsYXN0Tm9kZUluc2lkZSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICB9XG4gICAgLy8gbm8gdGFiYmFibGUgZWxlbWVudHMsIGF1dG9mb2N1cyBpcyBub3QgcG9zc2libGVcbiAgICBpZiAoaW5uZXJUYWJiYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGFuIGVkZ2UgY2FzZSB3aXRoIG5vIHRhYmJhYmxlIGVsZW1lbnRzXG4gICAgICAgIC8vIHJldHVybiB0aGUgbGFzdCBmb2N1c2FibGUgb25lXG4gICAgICAgIC8vIHdpdGggc29tZSBwcm9iYWJpbGl0eSB0aGlzIHdpbGwgcHJldmVudCBmb2N1cyBmcm9tIGN5Y2xpbmcgYWNyb3NzIHRoZSBsb2NrLCBidXQgdGhlcmUgaXMgbm8gdGFiYmFsZSBlbGVtZW50cyB0byBjeWNsZSB0b1xuICAgICAgICByZXR1cm4gbGFzdE5vZGVJbnNpZGU7XG4gICAgfVxuICAgIHZhciByZXR1cm5GaXJzdE5vZGUgPSBwaWNrRm9jdXNhYmxlKGlubmVyTm9kZXMsIGlubmVyVGFiYmFibGVzWzBdKTtcbiAgICB2YXIgcmV0dXJuTGFzdE5vZGUgPSBwaWNrRm9jdXNhYmxlKGlubmVyTm9kZXMsIGlubmVyVGFiYmFibGVzW2lubmVyVGFiYmFibGVzLmxlbmd0aCAtIDFdKTtcbiAgICAvLyBmaXJzdCBlbGVtZW50XG4gICAgaWYgKGFjdGl2ZUluZGV4IDw9IGZpcnN0Tm9kZUluZGV4ICYmIGlzT25HdWFyZCAmJiBNYXRoLmFicyhpbmRleERpZmYpID4gMSkge1xuICAgICAgICByZXR1cm4gcmV0dXJuTGFzdE5vZGU7XG4gICAgfVxuICAgIC8vIGxhc3QgZWxlbWVudFxuICAgIGlmIChhY3RpdmVJbmRleCA+PSBsYXN0Tm9kZUluZGV4ICYmIGlzT25HdWFyZCAmJiBNYXRoLmFicyhpbmRleERpZmYpID4gMSkge1xuICAgICAgICByZXR1cm4gcmV0dXJuRmlyc3ROb2RlO1xuICAgIH1cbiAgICAvLyBqdW1wIG91dCwgYnV0IG5vdCBvbiB0aGUgZ3VhcmRcbiAgICBpZiAoaW5kZXhEaWZmICYmIE1hdGguYWJzKGNvcnJlY3RlZEluZGV4RGlmZikgPiAxKSB7XG4gICAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICB9XG4gICAgLy8gZm9jdXMgYWJvdmUgbG9ja1xuICAgIGlmIChhY3RpdmVJbmRleCA8PSBmaXJzdE5vZGVJbmRleCkge1xuICAgICAgICByZXR1cm4gcmV0dXJuTGFzdE5vZGU7XG4gICAgfVxuICAgIC8vIGZvY3VzIGJlbG93IGxvY2tcbiAgICBpZiAoYWN0aXZlSW5kZXggPiBsYXN0Tm9kZUluZGV4KSB7XG4gICAgICAgIHJldHVybiByZXR1cm5GaXJzdE5vZGU7XG4gICAgfVxuICAgIC8vIGluZGV4IGlzIGluc2lkZSB0YWIgb3JkZXIsIGJ1dCBvdXRzaWRlIExvY2tcbiAgICBpZiAoaW5kZXhEaWZmKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhpbmRleERpZmYpID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3ROb2RlSW5zaWRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY250ICsgbGFzdE5vZGVJbnNpZGUgKyBpbmRleERpZmYpICUgY250O1xuICAgIH1cbiAgICAvLyBkbyBub3RoaW5nXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCJpbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5pbXBvcnQgeyBpc0F1dG9Gb2N1c0FsbG93ZWRDYWNoZWQsIGlzVmlzaWJsZUNhY2hlZCwgbm90SGlkZGVuSW5wdXQgfSBmcm9tICcuL2lzJztcbmltcG9ydCB7IG9yZGVyQnlUYWJJbmRleCB9IGZyb20gJy4vdGFiT3JkZXInO1xuaW1wb3J0IHsgZ2V0Rm9jdXNhYmxlcywgZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXMgfSBmcm9tICcuL3RhYlV0aWxzJztcbi8qKlxuICogZ2l2ZW4gbGlzdCBvZiBmb2N1c2FibGUgZWxlbWVudHMga2VlcHMgdGhlIG9uZXMgdXNlciBjYW4gaW50ZXJhY3Qgd2l0aFxuICogQHBhcmFtIG5vZGVzXG4gKiBAcGFyYW0gdmlzaWJpbGl0eUNhY2hlXG4gKi9cbmV4cG9ydCB2YXIgZmlsdGVyRm9jdXNhYmxlID0gZnVuY3Rpb24gKG5vZGVzLCB2aXNpYmlsaXR5Q2FjaGUpIHtcbiAgICByZXR1cm4gdG9BcnJheShub2RlcylcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gaXNWaXNpYmxlQ2FjaGVkKHZpc2liaWxpdHlDYWNoZSwgbm9kZSk7IH0pXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vdEhpZGRlbklucHV0KG5vZGUpOyB9KTtcbn07XG5leHBvcnQgdmFyIGZpbHRlckF1dG9Gb2N1c2FibGUgPSBmdW5jdGlvbiAobm9kZXMsIGNhY2hlKSB7XG4gICAgaWYgKGNhY2hlID09PSB2b2lkIDApIHsgY2FjaGUgPSBuZXcgTWFwKCk7IH1cbiAgICByZXR1cm4gdG9BcnJheShub2RlcykuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBpc0F1dG9Gb2N1c0FsbG93ZWRDYWNoZWQoY2FjaGUsIG5vZGUpOyB9KTtcbn07XG4vKipcbiAqICFfX1dBUk5JTkdfXyEgTG93IGxldmVsIEFQSS5cbiAqIEByZXR1cm5zIGFsbCB0YWJiYWJsZSBub2Rlc1xuICpcbiAqIEBzZWUge0BsaW5rIGdldEZvY3VzYWJsZU5vZGVzfSB0byBnZXQgYW55IGZvY3VzYWJsZSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHRvcE5vZGVzIC0gYXJyYXkgb2YgdG9wIGxldmVsIEhUTUxFbGVtZW50cyB0byBzZWFyY2ggaW5zaWRlXG4gKiBAcGFyYW0gdmlzaWJpbGl0eUNhY2hlIC0gYW4gY2FjaGUgdG8gc3RvcmUgaW50ZXJtZWRpYXRlIG1lYXN1cmVtZW50cy4gRXhwZWN0ZWQgdG8gYmUgYSBmcmVzaCBgbmV3IE1hcGAgb24gZXZlcnkgY2FsbFxuICovXG5leHBvcnQgdmFyIGdldFRhYmJhYmxlTm9kZXMgPSBmdW5jdGlvbiAodG9wTm9kZXMsIHZpc2liaWxpdHlDYWNoZSwgd2l0aEd1YXJkcykge1xuICAgIHJldHVybiBvcmRlckJ5VGFiSW5kZXgoZmlsdGVyRm9jdXNhYmxlKGdldEZvY3VzYWJsZXModG9wTm9kZXMsIHdpdGhHdWFyZHMpLCB2aXNpYmlsaXR5Q2FjaGUpLCB0cnVlLCB3aXRoR3VhcmRzKTtcbn07XG4vKipcbiAqICFfX1dBUk5JTkdfXyEgTG93IGxldmVsIEFQSS5cbiAqXG4gKiBAcmV0dXJucyBhbnl0aGluZyBcImZvY3VzYWJsZVwiLCBub3Qgb25seSB0YWJiYWJsZS4gVGhlIGRpZmZlcmVuY2UgaXMgaW4gYHRhYkluZGV4PS0xYFxuICogKHdpdGhvdXQgZ3VhcmRzLCBhcyBsb25nIGFzIHRoZXkgYXJlIG5vdCBleHBlY3RlZCB0byBiZSBldmVyIGZvY3VzZWQpXG4gKlxuICogQHNlZSB7QGxpbmsgZ2V0VGFiYmFibGVOb2Rlc30gdG8gZ2V0IG9ubHkgdGFiYmxlIG5vZGVzIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gdG9wTm9kZXMgLSBhcnJheSBvZiB0b3AgbGV2ZWwgSFRNTEVsZW1lbnRzIHRvIHNlYXJjaCBpbnNpZGVcbiAqIEBwYXJhbSB2aXNpYmlsaXR5Q2FjaGUgLSBhbiBjYWNoZSB0byBzdG9yZSBpbnRlcm1lZGlhdGUgbWVhc3VyZW1lbnRzLiBFeHBlY3RlZCB0byBiZSBhIGZyZXNoIGBuZXcgTWFwYCBvbiBldmVyeSBjYWxsXG4gKi9cbmV4cG9ydCB2YXIgZ2V0Rm9jdXNhYmxlTm9kZXMgPSBmdW5jdGlvbiAodG9wTm9kZXMsIHZpc2liaWxpdHlDYWNoZSkge1xuICAgIHJldHVybiBvcmRlckJ5VGFiSW5kZXgoZmlsdGVyRm9jdXNhYmxlKGdldEZvY3VzYWJsZXModG9wTm9kZXMpLCB2aXNpYmlsaXR5Q2FjaGUpLCBmYWxzZSk7XG59O1xuLyoqXG4gKiByZXR1cm4gbGlzdCBvZiBub2RlcyB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gYmUgYXV0by1mb2N1c2VkXG4gKiBAcGFyYW0gdG9wTm9kZVxuICogQHBhcmFtIHZpc2liaWxpdHlDYWNoZVxuICovXG5leHBvcnQgdmFyIHBhcmVudEF1dG9mb2N1c2FibGVzID0gZnVuY3Rpb24gKHRvcE5vZGUsIHZpc2liaWxpdHlDYWNoZSkge1xuICAgIHJldHVybiBmaWx0ZXJGb2N1c2FibGUoZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXModG9wTm9kZSksIHZpc2liaWxpdHlDYWNoZSk7XG59O1xuLypcbiAqIERldGVybWluZXMgaWYgZWxlbWVudCBpcyBjb250YWluZWQgaW4gc2NvcGUsIGluY2x1ZGluZyBuZXN0ZWQgc2hhZG93IERPTXNcbiAqL1xuZXhwb3J0IHZhciBjb250YWlucyA9IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCkge1xuICAgIGlmIChzY29wZS5zaGFkb3dSb290KSB7XG4gICAgICAgIHJldHVybiBjb250YWlucyhzY29wZS5zaGFkb3dSb290LCBlbGVtZW50KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc2NvcGUpLmNvbnRhaW5zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihzY29wZSkuY29udGFpbnMuY2FsbChzY29wZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b0FycmF5KHNjb3BlLmNoaWxkcmVuKS5zb21lKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaWZyYW1lQm9keSA9IChfYSA9IGNoaWxkLmNvbnRlbnREb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJvZHk7XG4gICAgICAgICAgICAgICAgaWYgKGlmcmFtZUJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKGlmcmFtZUJvZHksIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbnMoY2hpbGQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgRk9DVVNfRElTQUJMRUQsIEZPQ1VTX0dST1VQIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGFzQXJyYXksIHRvQXJyYXkgfSBmcm9tICcuL2FycmF5Jztcbi8qKlxuICogaW4gY2FzZSBvZiBtdWx0aXBsZSBub2RlcyBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXJcbiAqIGtlZXBzIG9ubHkgdG9wIG9uZXNcbiAqIHRoaXMgaXMgTyhubG9nbilcbiAqIEBwYXJhbSBub2Rlc1xuICogQHJldHVybnMgeyp9XG4gKi9cbnZhciBmaWx0ZXJOZXN0ZWQgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICB2YXIgY29udGFpbmVkID0gbmV3IFNldCgpO1xuICAgIHZhciBsID0gbm9kZXMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSArPSAxKSB7XG4gICAgICAgIGZvciAodmFyIGogPSBpICsgMTsgaiA8IGw7IGogKz0gMSkge1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gbm9kZXNbaV0uY29tcGFyZURvY3VtZW50UG9zaXRpb24obm9kZXNbal0pO1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuICAgICAgICAgICAgaWYgKChwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSA+IDApIHtcbiAgICAgICAgICAgICAgICBjb250YWluZWQuYWRkKGopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTlMpID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lZC5hZGQoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzLmZpbHRlcihmdW5jdGlvbiAoXywgaW5kZXgpIHsgcmV0dXJuICFjb250YWluZWQuaGFzKGluZGV4KTsgfSk7XG59O1xuLyoqXG4gKiBmaW5kcyB0b3AgbW9zdCBwYXJlbnQgZm9yIGEgbm9kZVxuICogQHBhcmFtIG5vZGVcbiAqIEByZXR1cm5zIHsqfVxuICovXG52YXIgZ2V0VG9wUGFyZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlID8gZ2V0VG9wUGFyZW50KG5vZGUucGFyZW50Tm9kZSkgOiBub2RlO1xufTtcbi8qKlxuICogcmV0dXJucyBhbGwgXCJmb2N1cyBjb250YWluZXJzXCIgaW5zaWRlIGEgZ2l2ZW4gbm9kZVxuICogQHBhcmFtIG5vZGUgLSBub2RlIG9yIG5vZGVzIHRvIGxvb2sgaW5zaWRlXG4gKiBAcmV0dXJucyBFbGVtZW50W11cbiAqL1xuZXhwb3J0IHZhciBnZXRBbGxBZmZlY3RlZE5vZGVzID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgbm9kZXMgPSBhc0FycmF5KG5vZGUpO1xuICAgIHJldHVybiBub2Rlcy5maWx0ZXIoQm9vbGVhbikucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGN1cnJlbnROb2RlKSB7XG4gICAgICAgIHZhciBncm91cCA9IGN1cnJlbnROb2RlLmdldEF0dHJpYnV0ZShGT0NVU19HUk9VUCk7XG4gICAgICAgIGFjYy5wdXNoLmFwcGx5KGFjYywgKGdyb3VwXG4gICAgICAgICAgICA/IGZpbHRlck5lc3RlZCh0b0FycmF5KGdldFRvcFBhcmVudChjdXJyZW50Tm9kZSkucXVlcnlTZWxlY3RvckFsbChcIltcIi5jb25jYXQoRk9DVVNfR1JPVVAsIFwiPVxcXCJcIikuY29uY2F0KGdyb3VwLCBcIlxcXCJdOm5vdChbXCIpLmNvbmNhdChGT0NVU19ESVNBQkxFRCwgXCI9XFxcImRpc2FibGVkXFxcIl0pXCIpKSkpXG4gICAgICAgICAgICA6IFtjdXJyZW50Tm9kZV0pKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG59O1xuIiwiLypcbklFMTEgc3VwcG9ydFxuICovXG5leHBvcnQgdmFyIHRvQXJyYXkgPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciByZXQgPSBBcnJheShhLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHJldFtpXSA9IGFbaV07XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59O1xuZXhwb3J0IHZhciBhc0FycmF5ID0gZnVuY3Rpb24gKGEpIHsgcmV0dXJuIChBcnJheS5pc0FycmF5KGEpID8gYSA6IFthXSk7IH07XG5leHBvcnQgdmFyIGdldEZpcnN0ID0gZnVuY3Rpb24gKGEpIHsgcmV0dXJuIChBcnJheS5pc0FycmF5KGEpID8gYVswXSA6IGEpOyB9O1xuIiwiaW1wb3J0IHsgZmlsdGVyQXV0b0ZvY3VzYWJsZSB9IGZyb20gJy4vRE9NdXRpbHMnO1xuaW1wb3J0IHsgcGlja0ZpcnN0Rm9jdXMgfSBmcm9tICcuL2ZpcnN0Rm9jdXMnO1xuaW1wb3J0IHsgZ2V0RGF0YXNldCB9IGZyb20gJy4vaXMnO1xudmFyIGZpbmRBdXRvRm9jdXNlZCA9IGZ1bmN0aW9uIChhdXRvRm9jdXNhYmxlcykge1xuICAgIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBhdXRvZm9jdXMgPSAoX2EgPSBnZXREYXRhc2V0KG5vZGUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXV0b2ZvY3VzO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIG5vZGUuYXV0b2ZvY3VzIHx8XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgKGF1dG9mb2N1cyAhPT0gdW5kZWZpbmVkICYmIGF1dG9mb2N1cyAhPT0gJ2ZhbHNlJykgfHxcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBhdXRvRm9jdXNhYmxlcy5pbmRleE9mKG5vZGUpID49IDApO1xuICAgIH07XG59O1xuZXhwb3J0IHZhciBwaWNrQXV0b2ZvY3VzID0gZnVuY3Rpb24gKG5vZGVzSW5kZXhlcywgb3JkZXJlZE5vZGVzLCBncm91cHMpIHtcbiAgICB2YXIgbm9kZXMgPSBub2Rlc0luZGV4ZXMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuICAgIHZhciBhdXRvRm9jdXNhYmxlID0gZmlsdGVyQXV0b0ZvY3VzYWJsZShub2Rlcy5maWx0ZXIoZmluZEF1dG9Gb2N1c2VkKGdyb3VwcykpKTtcbiAgICBpZiAoYXV0b0ZvY3VzYWJsZSAmJiBhdXRvRm9jdXNhYmxlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcGlja0ZpcnN0Rm9jdXMoYXV0b0ZvY3VzYWJsZSk7XG4gICAgfVxuICAgIHJldHVybiBwaWNrRmlyc3RGb2N1cyhmaWx0ZXJBdXRvRm9jdXNhYmxlKG9yZGVyZWROb2RlcykpO1xufTtcbiIsImltcG9ydCB7IGlzUmFkaW9FbGVtZW50IH0gZnJvbSAnLi9pcyc7XG52YXIgZmluZFNlbGVjdGVkUmFkaW8gPSBmdW5jdGlvbiAobm9kZSwgbm9kZXMpIHtcbiAgICByZXR1cm4gbm9kZXNcbiAgICAgICAgLmZpbHRlcihpc1JhZGlvRWxlbWVudClcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLm5hbWUgPT09IG5vZGUubmFtZTsgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLmNoZWNrZWQ7IH0pWzBdIHx8IG5vZGU7XG59O1xuZXhwb3J0IHZhciBjb3JyZWN0Tm9kZSA9IGZ1bmN0aW9uIChub2RlLCBub2Rlcykge1xuICAgIGlmIChpc1JhZGlvRWxlbWVudChub2RlKSAmJiBub2RlLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRTZWxlY3RlZFJhZGlvKG5vZGUsIG5vZGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59O1xuLyoqXG4gKiBnaXZpbmcgYSBzZXQgb2YgcmFkaW8gaW5wdXRzIGtlZXBzIG9ubHkgc2VsZWN0ZWQgKHRhYmJhYmxlKSBvbmVzXG4gKiBAcGFyYW0gbm9kZXNcbiAqL1xuZXhwb3J0IHZhciBjb3JyZWN0Tm9kZXMgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICAvLyBJRTExIGhhcyBubyBTZXQoYXJyYXkpIGNvbnN0cnVjdG9yXG4gICAgdmFyIHJlc3VsdFNldCA9IG5ldyBTZXQoKTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiByZXN1bHRTZXQuYWRkKGNvcnJlY3ROb2RlKG5vZGUsIG5vZGVzKSk7IH0pO1xuICAgIC8vIHVzaW5nIGZpbHRlciB0byBzdXBwb3J0IElFMTFcbiAgICByZXR1cm4gbm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiByZXN1bHRTZXQuaGFzKG5vZGUpOyB9KTtcbn07XG4iLCJpbXBvcnQgeyBjb3JyZWN0Tm9kZSB9IGZyb20gJy4vY29ycmVjdEZvY3VzJztcbmV4cG9ydCB2YXIgcGlja0ZpcnN0Rm9jdXMgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICBpZiAobm9kZXNbMF0gJiYgbm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gY29ycmVjdE5vZGUobm9kZXNbMF0sIG5vZGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzWzBdO1xufTtcbmV4cG9ydCB2YXIgcGlja0ZvY3VzYWJsZSA9IGZ1bmN0aW9uIChub2Rlcywgbm9kZSkge1xuICAgIHJldHVybiBub2Rlcy5pbmRleE9mKGNvcnJlY3ROb2RlKG5vZGUsIG5vZGVzKSk7XG59O1xuIiwiLyoqXG4gKiByZXR1cm5zIGFjdGl2ZSBlbGVtZW50IGZyb20gZG9jdW1lbnQgb3IgZnJvbSBuZXN0ZWQgc2hhZG93ZG9tc1xuICovXG5pbXBvcnQgeyBzYWZlUHJvYmUgfSBmcm9tICcuL3NhZmUnO1xuLyoqXG4gKiByZXR1cm5zIGN1cnJlbnQgYWN0aXZlIGVsZW1lbnQuIElmIHRoZSBhY3RpdmUgZWxlbWVudCBpcyBhIFwiY29udGFpbmVyXCIgaXRzZWxmKHNoYWRvd1Jvb3Qgb3IgaWZyYW1lKSByZXR1cm5zIGFjdGl2ZSBlbGVtZW50IGluc2lkZSBpdFxuICogQHBhcmFtIFtpbkRvY3VtZW50XVxuICovXG5leHBvcnQgdmFyIGdldEFjdGl2ZUVsZW1lbnQgPSBmdW5jdGlvbiAoaW5Eb2N1bWVudCkge1xuICAgIGlmIChpbkRvY3VtZW50ID09PSB2b2lkIDApIHsgaW5Eb2N1bWVudCA9IGRvY3VtZW50OyB9XG4gICAgaWYgKCFpbkRvY3VtZW50IHx8ICFpbkRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBpbkRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuIChhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3RcbiAgICAgICAgPyBnZXRBY3RpdmVFbGVtZW50KGFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdClcbiAgICAgICAgOiBhY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQgJiYgc2FmZVByb2JlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFjdGl2ZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudDsgfSlcbiAgICAgICAgICAgID8gZ2V0QWN0aXZlRWxlbWVudChhY3RpdmVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpXG4gICAgICAgICAgICA6IGFjdGl2ZUVsZW1lbnQpO1xufTtcbiIsImltcG9ydCB7IEZPQ1VTX05PX0FVVE9GT0NVUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG52YXIgaXNFbGVtZW50SGlkZGVuID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyB3ZSBjYW4gbWVhc3VyZSBvbmx5IFwiZWxlbWVudHNcIlxuICAgIC8vIGNvbnNpZGVyIG90aGVycyBhcyBcInZpc2libGVcIlxuICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgaWYgKCFjb21wdXRlZFN0eWxlIHx8ICFjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpID09PSAnbm9uZScgfHwgY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICdoaWRkZW4nKTtcbn07XG52YXIgZ2V0UGFyZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSBjYW4gYWxzbyBwb2ludCBvbiBTaGFkb3dSb290LiBJbiB0aGlzIGNhc2UgLmhvc3Qgd2lsbCBwb2ludCBvbiB0aGUgbmV4dCBub2RlXG4gICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZSAmJiBub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERVxuICAgICAgICA/IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBub2RlLnBhcmVudE5vZGUuaG9zdFxuICAgICAgICA6IG5vZGUucGFyZW50Tm9kZTtcbn07XG52YXIgaXNUb3BOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIG5vZGUgPT09IGRvY3VtZW50IHx8IChub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSk7XG59O1xudmFyIGlzSW5lcnQgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5oYXNBdHRyaWJ1dGUoJ2luZXJ0Jyk7IH07XG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Rlc3RpbmctbGlicmFyeS9qZXN0LWRvbS9ibG9iL21haW4vc3JjL3RvLWJlLXZpc2libGUuanNcbiAqL1xudmFyIGlzVmlzaWJsZVVuY2FjaGVkID0gZnVuY3Rpb24gKG5vZGUsIGNoZWNrUGFyZW50KSB7XG4gICAgcmV0dXJuICFub2RlIHx8IGlzVG9wTm9kZShub2RlKSB8fCAoIWlzRWxlbWVudEhpZGRlbihub2RlKSAmJiAhaXNJbmVydChub2RlKSAmJiBjaGVja1BhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKSk7XG59O1xuZXhwb3J0IHZhciBpc1Zpc2libGVDYWNoZWQgPSBmdW5jdGlvbiAodmlzaWJpbGl0eUNhY2hlLCBub2RlKSB7XG4gICAgdmFyIGNhY2hlZCA9IHZpc2liaWxpdHlDYWNoZS5nZXQobm9kZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBpc1Zpc2libGVVbmNhY2hlZChub2RlLCBpc1Zpc2libGVDYWNoZWQuYmluZCh1bmRlZmluZWQsIHZpc2liaWxpdHlDYWNoZSkpO1xuICAgIHZpc2liaWxpdHlDYWNoZS5zZXQobm9kZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBpc0F1dG9Gb2N1c0FsbG93ZWRVbmNhY2hlZCA9IGZ1bmN0aW9uIChub2RlLCBjaGVja1BhcmVudCkge1xuICAgIHJldHVybiBub2RlICYmICFpc1RvcE5vZGUobm9kZSkgPyAoaXNBdXRvRm9jdXNBbGxvd2VkKG5vZGUpID8gY2hlY2tQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSkgOiBmYWxzZSkgOiB0cnVlO1xufTtcbmV4cG9ydCB2YXIgaXNBdXRvRm9jdXNBbGxvd2VkQ2FjaGVkID0gZnVuY3Rpb24gKGNhY2hlLCBub2RlKSB7XG4gICAgdmFyIGNhY2hlZCA9IGNhY2hlLmdldChub2RlKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGlzQXV0b0ZvY3VzQWxsb3dlZFVuY2FjaGVkKG5vZGUsIGlzQXV0b0ZvY3VzQWxsb3dlZENhY2hlZC5iaW5kKHVuZGVmaW5lZCwgY2FjaGUpKTtcbiAgICBjYWNoZS5zZXQobm9kZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCB2YXIgZ2V0RGF0YXNldCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBub2RlLmRhdGFzZXQ7XG59O1xuZXhwb3J0IHZhciBpc0hUTUxCdXR0b25FbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ0JVVFRPTic7IH07XG5leHBvcnQgdmFyIGlzSFRNTElucHV0RWxlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdJTlBVVCc7IH07XG5leHBvcnQgdmFyIGlzUmFkaW9FbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gaXNIVE1MSW5wdXRFbGVtZW50KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ3JhZGlvJztcbn07XG5leHBvcnQgdmFyIG5vdEhpZGRlbklucHV0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gISgoaXNIVE1MSW5wdXRFbGVtZW50KG5vZGUpIHx8IGlzSFRNTEJ1dHRvbkVsZW1lbnQobm9kZSkpICYmIChub2RlLnR5cGUgPT09ICdoaWRkZW4nIHx8IG5vZGUuZGlzYWJsZWQpKTtcbn07XG5leHBvcnQgdmFyIGlzQXV0b0ZvY3VzQWxsb3dlZCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIGF0dHJpYnV0ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKEZPQ1VTX05PX0FVVE9GT0NVUyk7XG4gICAgcmV0dXJuICFbdHJ1ZSwgJ3RydWUnLCAnJ10uaW5jbHVkZXMoYXR0cmlidXRlKTtcbn07XG5leHBvcnQgdmFyIGlzR3VhcmQgPSBmdW5jdGlvbiAobm9kZSkgeyB2YXIgX2E7IHJldHVybiBCb29sZWFuKG5vZGUgJiYgKChfYSA9IGdldERhdGFzZXQobm9kZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb2N1c0d1YXJkKSk7IH07XG5leHBvcnQgdmFyIGlzTm90QUd1YXJkID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuICFpc0d1YXJkKG5vZGUpOyB9O1xuZXhwb3J0IHZhciBpc0RlZmluZWQgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4gQm9vbGVhbih4KTsgfTtcbiIsImltcG9ydCB7IHBhcmVudEF1dG9mb2N1c2FibGVzIH0gZnJvbSAnLi9ET011dGlscyc7XG5pbXBvcnQgeyBjb250YWlucyB9IGZyb20gJy4vRE9NdXRpbHMnO1xuaW1wb3J0IHsgYXNBcnJheSB9IGZyb20gJy4vYXJyYXknO1xudmFyIGdldFBhcmVudHMgPSBmdW5jdGlvbiAobm9kZSwgcGFyZW50cykge1xuICAgIGlmIChwYXJlbnRzID09PSB2b2lkIDApIHsgcGFyZW50cyA9IFtdOyB9XG4gICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgZ2V0UGFyZW50cyhub2RlLnBhcmVudE5vZGUuaG9zdCB8fCBub2RlLnBhcmVudE5vZGUsIHBhcmVudHMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50cztcbn07XG4vKipcbiAqIGZpbmRzIGEgcGFyZW50IGZvciBib3RoIG5vZGVBIGFuZCBub2RlQlxuICogQHBhcmFtIG5vZGVBXG4gKiBAcGFyYW0gbm9kZUJcbiAqIEByZXR1cm5zIHtib29sZWFufCp9XG4gKi9cbmV4cG9ydCB2YXIgZ2V0Q29tbW9uUGFyZW50ID0gZnVuY3Rpb24gKG5vZGVBLCBub2RlQikge1xuICAgIHZhciBwYXJlbnRzQSA9IGdldFBhcmVudHMobm9kZUEpO1xuICAgIHZhciBwYXJlbnRzQiA9IGdldFBhcmVudHMobm9kZUIpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRzQS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgY3VycmVudFBhcmVudCA9IHBhcmVudHNBW2ldO1xuICAgICAgICBpZiAocGFyZW50c0IuaW5kZXhPZihjdXJyZW50UGFyZW50KSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZXhwb3J0IHZhciBnZXRUb3BDb21tb25QYXJlbnQgPSBmdW5jdGlvbiAoYmFzZUFjdGl2ZUVsZW1lbnQsIGxlZnRFbnRyeSwgcmlnaHRFbnRyaWVzKSB7XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnRzID0gYXNBcnJheShiYXNlQWN0aXZlRWxlbWVudCk7XG4gICAgdmFyIGxlZnRFbnRyaWVzID0gYXNBcnJheShsZWZ0RW50cnkpO1xuICAgIHZhciBhY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudHNbMF07XG4gICAgdmFyIHRvcENvbW1vbiA9IGZhbHNlO1xuICAgIGxlZnRFbnRyaWVzLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICB0b3BDb21tb24gPSBnZXRDb21tb25QYXJlbnQodG9wQ29tbW9uIHx8IGVudHJ5LCBlbnRyeSkgfHwgdG9wQ29tbW9uO1xuICAgICAgICByaWdodEVudHJpZXMuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKHN1YkVudHJ5KSB7XG4gICAgICAgICAgICB2YXIgY29tbW9uID0gZ2V0Q29tbW9uUGFyZW50KGFjdGl2ZUVsZW1lbnQsIHN1YkVudHJ5KTtcbiAgICAgICAgICAgIGlmIChjb21tb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRvcENvbW1vbiB8fCBjb250YWlucyhjb21tb24sIHRvcENvbW1vbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9wQ29tbW9uID0gY29tbW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9wQ29tbW9uID0gZ2V0Q29tbW9uUGFyZW50KGNvbW1vbiwgdG9wQ29tbW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIFRPRE86IGFkZCBhc3NlcnQgaGVyZT9cbiAgICByZXR1cm4gdG9wQ29tbW9uO1xufTtcbi8qKlxuICogcmV0dXJuIGxpc3Qgb2Ygbm9kZXMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvIGJlIGF1dG9mb2N1c2VkIGluc2lkZSBhIGdpdmVuIHRvcCBub2Rlc1xuICogQHBhcmFtIGVudHJpZXNcbiAqIEBwYXJhbSB2aXNpYmlsaXR5Q2FjaGVcbiAqL1xuZXhwb3J0IHZhciBhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcyA9IGZ1bmN0aW9uIChlbnRyaWVzLCB2aXNpYmlsaXR5Q2FjaGUpIHtcbiAgICByZXR1cm4gZW50cmllcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgbm9kZSkgeyByZXR1cm4gYWNjLmNvbmNhdChwYXJlbnRBdXRvZm9jdXNhYmxlcyhub2RlLCB2aXNpYmlsaXR5Q2FjaGUpKTsgfSwgW10pO1xufTtcbiIsImV4cG9ydCB2YXIgc2FmZVByb2JlID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufTtcbiIsImltcG9ydCB7IHRvQXJyYXkgfSBmcm9tICcuL2FycmF5JztcbmV4cG9ydCB2YXIgdGFiU29ydCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGFUYWIgPSBNYXRoLm1heCgwLCBhLnRhYkluZGV4KTtcbiAgICB2YXIgYlRhYiA9IE1hdGgubWF4KDAsIGIudGFiSW5kZXgpO1xuICAgIHZhciB0YWJEaWZmID0gYVRhYiAtIGJUYWI7XG4gICAgdmFyIGluZGV4RGlmZiA9IGEuaW5kZXggLSBiLmluZGV4O1xuICAgIGlmICh0YWJEaWZmKSB7XG4gICAgICAgIGlmICghYVRhYikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFiVGFiKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhYkRpZmYgfHwgaW5kZXhEaWZmO1xufTtcbnZhciBnZXRUYWJJbmRleCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKG5vZGUudGFiSW5kZXggPCAwKSB7XG4gICAgICAgIC8vIGFsbCBcImZvY3VzYWJsZVwiIGVsZW1lbnRzIGFyZSBhbHJlYWR5IHByZXNlbGVjdGVkXG4gICAgICAgIC8vIGJ1dCBzb21lIG1pZ2h0IGhhdmUgaW1wbGljaXQgbmVnYXRpdmUgdGFiSW5kZXhcbiAgICAgICAgLy8gcmV0dXJuIDAgZm9yIDxhdWRpbyB3aXRob3V0IHRhYkluZGV4IGF0dHJpYnV0ZSAtIGl0IGlzIFwidGFiYmFibGVcIlxuICAgICAgICBpZiAoIW5vZGUuaGFzQXR0cmlidXRlKCd0YWJpbmRleCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZS50YWJJbmRleDtcbn07XG5leHBvcnQgdmFyIG9yZGVyQnlUYWJJbmRleCA9IGZ1bmN0aW9uIChub2RlcywgZmlsdGVyTmVnYXRpdmUsIGtlZXBHdWFyZHMpIHtcbiAgICByZXR1cm4gdG9BcnJheShub2RlcylcbiAgICAgICAgLm1hcChmdW5jdGlvbiAobm9kZSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHRhYkluZGV4ID0gZ2V0VGFiSW5kZXgobm9kZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgdGFiSW5kZXg6IGtlZXBHdWFyZHMgJiYgdGFiSW5kZXggPT09IC0xID8gKChub2RlLmRhdGFzZXQgfHwge30pLmZvY3VzR3VhcmQgPyAwIDogLTEpIDogdGFiSW5kZXgsXG4gICAgICAgIH07XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gIWZpbHRlck5lZ2F0aXZlIHx8IGRhdGEudGFiSW5kZXggPj0gMDsgfSlcbiAgICAgICAgLnNvcnQodGFiU29ydCk7XG59O1xuIiwiaW1wb3J0IHsgRk9DVVNfQVVUTyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5pbXBvcnQgeyB0YWJiYWJsZXMgfSBmcm9tICcuL3RhYmJhYmxlcyc7XG52YXIgcXVlcnlUYWJiYWJsZXMgPSB0YWJiYWJsZXMuam9pbignLCcpO1xudmFyIHF1ZXJ5R3VhcmRUYWJiYWJsZXMgPSBcIlwiLmNvbmNhdChxdWVyeVRhYmJhYmxlcywgXCIsIFtkYXRhLWZvY3VzLWd1YXJkXVwiKTtcbnZhciBnZXRGb2N1c2FibGVzV2l0aFNoYWRvd0RvbSA9IGZ1bmN0aW9uIChwYXJlbnQsIHdpdGhHdWFyZHMpIHtcbiAgICByZXR1cm4gdG9BcnJheSgocGFyZW50LnNoYWRvd1Jvb3QgfHwgcGFyZW50KS5jaGlsZHJlbikucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBhY2MuY29uY2F0KGNoaWxkLm1hdGNoZXMod2l0aEd1YXJkcyA/IHF1ZXJ5R3VhcmRUYWJiYWJsZXMgOiBxdWVyeVRhYmJhYmxlcykgPyBbY2hpbGRdIDogW10sIGdldEZvY3VzYWJsZXNXaXRoU2hhZG93RG9tKGNoaWxkKSk7XG4gICAgfSwgW10pO1xufTtcbnZhciBnZXRGb2N1c2FibGVzV2l0aElGcmFtZSA9IGZ1bmN0aW9uIChwYXJlbnQsIHdpdGhHdWFyZHMpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gY29udGVudERvY3VtZW50IG9mIGlmcmFtZSB3aWxsIGJlIG51bGwgaWYgY3VycmVudCBvcmlnaW4gY2Fubm90IGFjY2VzcyBpdFxuICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCAmJiAoKF9hID0gcGFyZW50LmNvbnRlbnREb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJvZHkpKSB7XG4gICAgICAgIHJldHVybiBnZXRGb2N1c2FibGVzKFtwYXJlbnQuY29udGVudERvY3VtZW50LmJvZHldLCB3aXRoR3VhcmRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFtwYXJlbnRdO1xufTtcbmV4cG9ydCB2YXIgZ2V0Rm9jdXNhYmxlcyA9IGZ1bmN0aW9uIChwYXJlbnRzLCB3aXRoR3VhcmRzKSB7XG4gICAgcmV0dXJuIHBhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBhcmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBmb2N1c2FibGVXaXRoU2hhZG93RG9tID0gZ2V0Rm9jdXNhYmxlc1dpdGhTaGFkb3dEb20ocGFyZW50LCB3aXRoR3VhcmRzKTtcbiAgICAgICAgdmFyIGZvY3VzYWJsZVdpdGhJZnJhbWVzID0gKF9hID0gW10pLmNvbmNhdC5hcHBseShfYSwgZm9jdXNhYmxlV2l0aFNoYWRvd0RvbS5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGdldEZvY3VzYWJsZXNXaXRoSUZyYW1lKG5vZGUsIHdpdGhHdWFyZHMpOyB9KSk7XG4gICAgICAgIHJldHVybiBhY2MuY29uY2F0KFxuICAgICAgICAvLyBhZGQgYWxsIHRhYmJhYmxlcyBpbnNpZGUgYW5kIHdpdGhpbiBzaGFkb3cgRE9NcyBpbiBET00gb3JkZXJcbiAgICAgICAgZm9jdXNhYmxlV2l0aElmcmFtZXMsIFxuICAgICAgICAvLyBhZGQgaWYgbm9kZSBpcyB0YWJiYWJsZSBpdHNlbGZcbiAgICAgICAgcGFyZW50LnBhcmVudE5vZGVcbiAgICAgICAgICAgID8gdG9BcnJheShwYXJlbnQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5VGFiYmFibGVzKSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlID09PSBwYXJlbnQ7IH0pXG4gICAgICAgICAgICA6IFtdKTtcbiAgICB9LCBbXSk7XG59O1xuLyoqXG4gKiByZXR1cm4gYSBsaXN0IG9mIGZvY3VzYWJsZSBub2RlcyB3aXRoaW4gYW4gYXJlYSBtYXJrZWQgYXMgXCJhdXRvLWZvY3VzYWJsZVwiXG4gKiBAcGFyYW0gcGFyZW50XG4gKi9cbmV4cG9ydCB2YXIgZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXMgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgdmFyIHBhcmVudEZvY3VzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIuY29uY2F0KEZPQ1VTX0FVVE8sIFwiXVwiKSk7XG4gICAgcmV0dXJuIHRvQXJyYXkocGFyZW50Rm9jdXMpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGdldEZvY3VzYWJsZXMoW25vZGVdKTsgfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBub2RlcykgeyByZXR1cm4gYWNjLmNvbmNhdChub2Rlcyk7IH0sIFtdKTtcbn07XG4iLCIvKipcbiAqIGxpc3Qgb2YgdGhlIG9iamVjdCB0byBiZSBjb25zaWRlcmVkIGFzIGZvY3VzYWJsZVxuICovXG5leHBvcnQgdmFyIHRhYmJhYmxlcyA9IFtcbiAgICAnYnV0dG9uOmVuYWJsZWQnLFxuICAgICdzZWxlY3Q6ZW5hYmxlZCcsXG4gICAgJ3RleHRhcmVhOmVuYWJsZWQnLFxuICAgICdpbnB1dDplbmFibGVkJyxcbiAgICAvLyBlbGVtZW50cyB3aXRoIGV4cGxpY2l0IHJvbGVzIHdpbGwgYWxzbyB1c2UgZXhwbGljaXQgdGFiaW5kZXhcbiAgICAvLyAnW3JvbGU9XCJidXR0b25cIl0nLFxuICAgICdhW2hyZWZdJyxcbiAgICAnYXJlYVtocmVmXScsXG4gICAgJ3N1bW1hcnknLFxuICAgICdpZnJhbWUnLFxuICAgICdvYmplY3QnLFxuICAgICdlbWJlZCcsXG4gICAgJ2F1ZGlvW2NvbnRyb2xzXScsXG4gICAgJ3ZpZGVvW2NvbnRyb2xzXScsXG4gICAgJ1t0YWJpbmRleF0nLFxuICAgICdbY29udGVudGVkaXRhYmxlXScsXG4gICAgJ1thdXRvZm9jdXNdJyxcbl07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMsIFZsYWRpbWlycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG5cbi8qKlxuICogZm9jdXMtb3V0bGluZS1tYW5hZ2VyXG4gKlxuICogV2F0Y2ggdXNlcnMga2V5Ym9hcmQgaW5wdXQgYW5kIG1hbmFnZSB0aGUgZm9jdXMgb3V0bGluZSB2aXNpYmlsaXR5XG4gKi9cblxuLyoqXG4gKiBUaGUgY2xhc3MgbmFtZSB0byBzZXQgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQuXG4gKiBAY29uc3RcbiAqL1xudmFyIENMQVNTX05BTUUgPSAnZm9jdXMtb3V0bGluZS1oaWRkZW4nO1xuXG4vKipcbiAqIFRoaXMgY2xhc3Mgc2V0cyBhIENTUyBjbGFzcyBuYW1lIG9uIHRoZSBIVE1MIGVsZW1lbnQgd2hlbiBhIHVzZXIgcHJlc3NlcyB0aGVcbiAqIHRhYiBrZXkuIEl0IHJlbW92ZXMgdGhlIGNsYXNzIG5hbWUgd2hlbiB0aGUgdXNlciBjbGlja3MgYW55d2hlcmUuXG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIENTUyBsaWtlIHRoaXM6XG4gKlxuICogaHRtbC5mb2N1cy1vdXRsaW5lLWhpZGRlbiAqOmZvY3VzIHtcbiAqICAgICBvdXRsaW5lOiBub25lO1xuICogfVxuICpcbiAqIEFuZCB0aGUgb3V0bGluZSB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIHVzZXIgdXNlcyB0aGUga2V5Ym9hcmQgdG8gZ2V0IHRvIGl0LlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBGb2N1c091dGxpbmVNYW5hZ2VyICgpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5mb2N1c0J5S2V5Ym9hcmQgPSB0cnVlO1xuICAgIH0sIHRydWUpO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5mb2N1c0J5S2V5Ym9hcmQgPSBmYWxzZTtcbiAgICB9LCB0cnVlKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IG9ubHkgd2hlbiBmb2N1cyBpcyBhY3R1YWxseSBjaGFuZ2VkLlxuICAgICAgICB0aGF0LnVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICB9LCB0cnVlKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuaGFzRm9jdXMoKSkge1xuICAgICAgICAgICAgICAgIHRoYXQuZm9jdXNCeUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGF0LnVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHkoKTtcbn1cblxuRm9jdXNPdXRsaW5lTWFuYWdlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBmb2N1cyBjaGFuZ2UgaXMgdHJpZ2dlcmVkIGJ5IFRBQiBrZXkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmb2N1c0J5S2V5Ym9hcmQ6IHRydWUsXG5cbiAgICB1cGRhdGVWaXNpYmlsaXR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaGlkZGVuID0gIXRoaXMuZm9jdXNCeUtleWJvYXJkO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBmb2N1cyBvdXRsaW5lIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgc2V0IGhpZGRlbihoaWRkZW4pIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRSwgaGlkZGVuKTtcbiAgICB9LFxuXG4gICAgZ2V0IGhpZGRlbigpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRSk7XG4gICAgfVxufTtcblxubmV3IEZvY3VzT3V0bGluZU1hbmFnZXIoKTtcbiIsInZhciBjdXJyZW50Tm9uY2U7XG5leHBvcnQgdmFyIHNldE5vbmNlID0gZnVuY3Rpb24gKG5vbmNlKSB7XG4gICAgY3VycmVudE5vbmNlID0gbm9uY2U7XG59O1xuZXhwb3J0IHZhciBnZXROb25jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY3VycmVudE5vbmNlKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9uY2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBfX3dlYnBhY2tfbm9uY2VfXztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuLyoqXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28hIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xudmFyIFJFQUNUX1NUQVRJQ1MgPSB7XG4gIGNoaWxkQ29udGV4dFR5cGVzOiB0cnVlLFxuICBjb250ZXh0VHlwZTogdHJ1ZSxcbiAgY29udGV4dFR5cGVzOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBnZXREZWZhdWx0UHJvcHM6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiB0cnVlLFxuICBtaXhpbnM6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBLTk9XTl9TVEFUSUNTID0ge1xuICBuYW1lOiB0cnVlLFxuICBsZW5ndGg6IHRydWUsXG4gIHByb3RvdHlwZTogdHJ1ZSxcbiAgY2FsbGVyOiB0cnVlLFxuICBjYWxsZWU6IHRydWUsXG4gIGFyZ3VtZW50czogdHJ1ZSxcbiAgYXJpdHk6IHRydWVcbn07XG52YXIgRk9SV0FSRF9SRUZfU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgcmVuZGVyOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWVcbn07XG52YXIgTUVNT19TVEFUSUNTID0ge1xuICAnJCR0eXBlb2YnOiB0cnVlLFxuICBjb21wYXJlOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgVFlQRV9TVEFUSUNTID0ge307XG5UWVBFX1NUQVRJQ1NbcmVhY3RJcy5Gb3J3YXJkUmVmXSA9IEZPUldBUkRfUkVGX1NUQVRJQ1M7XG5UWVBFX1NUQVRJQ1NbcmVhY3RJcy5NZW1vXSA9IE1FTU9fU1RBVElDUztcblxuZnVuY3Rpb24gZ2V0U3RhdGljcyhjb21wb25lbnQpIHtcbiAgLy8gUmVhY3QgdjE2LjExIGFuZCBiZWxvd1xuICBpZiAocmVhY3RJcy5pc01lbW8oY29tcG9uZW50KSkge1xuICAgIHJldHVybiBNRU1PX1NUQVRJQ1M7XG4gIH0gLy8gUmVhY3QgdjE2LjEyIGFuZCBhYm92ZVxuXG5cbiAgcmV0dXJuIFRZUEVfU1RBVElDU1tjb21wb25lbnRbJyQkdHlwZW9mJ11dIHx8IFJFQUNUX1NUQVRJQ1M7XG59XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xudmFyIG9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5mdW5jdGlvbiBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIHNvdXJjZUNvbXBvbmVudCwgYmxhY2tsaXN0KSB7XG4gIGlmICh0eXBlb2Ygc291cmNlQ29tcG9uZW50ICE9PSAnc3RyaW5nJykge1xuICAgIC8vIGRvbid0IGhvaXN0IG92ZXIgc3RyaW5nIChodG1sKSBjb21wb25lbnRzXG4gICAgaWYgKG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgdmFyIGluaGVyaXRlZENvbXBvbmVudCA9IGdldFByb3RvdHlwZU9mKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICAgIGlmIChpbmhlcml0ZWRDb21wb25lbnQgJiYgaW5oZXJpdGVkQ29tcG9uZW50ICE9PSBvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgICAgaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBpbmhlcml0ZWRDb21wb25lbnQsIGJsYWNrbGlzdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICBpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICBrZXlzID0ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZUNvbXBvbmVudCkpO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXRTdGF0aWNzID0gZ2V0U3RhdGljcyh0YXJnZXRDb21wb25lbnQpO1xuICAgIHZhciBzb3VyY2VTdGF0aWNzID0gZ2V0U3RhdGljcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKCFLTk9XTl9TVEFUSUNTW2tleV0gJiYgIShibGFja2xpc3QgJiYgYmxhY2tsaXN0W2tleV0pICYmICEoc291cmNlU3RhdGljcyAmJiBzb3VyY2VTdGF0aWNzW2tleV0pICYmICEodGFyZ2V0U3RhdGljcyAmJiB0YXJnZXRTdGF0aWNzW2tleV0pKSB7XG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZUNvbXBvbmVudCwga2V5KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEF2b2lkIGZhaWx1cmVzIGZyb20gcmVhZC1vbmx5IHByb3BlcnRpZXNcbiAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXRDb21wb25lbnQsIGtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldENvbXBvbmVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBob2lzdE5vblJlYWN0U3RhdGljcztcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHJlc3VsdCA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmcgPyBuYXRpdmVNaW4ocmVzdWx0LCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVib3VuY2U7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQWZyaWthYW5zIFthZl1cbi8vISBhdXRob3IgOiBXZXJuZXIgTW9sbGVudHplIDogaHR0cHM6Ly9naXRodWIuY29tL3dlcm5lcm1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBhZiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FmJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpZV9GZWJydWFyaWVfTWFhcnRfQXByaWxfTWVpX0p1bmllX0p1bGllX0F1Z3VzdHVzX1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTXJ0X0Fwcl9NZWlfSnVuX0p1bF9BdWdfU2VwX09rdF9Ob3ZfRGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1NvbmRhZ19NYWFuZGFnX0RpbnNkYWdfV29lbnNkYWdfRG9uZGVyZGFnX1ZyeWRhZ19TYXRlcmRhZycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1Nvbl9NYWFfRGluX1dvZV9Eb25fVnJ5X1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTb19NYV9EaV9Xb19Eb19Wcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL3ZtfG5tL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9ebm0kL2kudGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAndm0nIDogJ1ZNJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnbm0nIDogJ05NJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tWYW5kYWcgb21dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbTcO0cmUgb21dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbR2lzdGVyIG9tXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYWFzXSBkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvb3IgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGdlbGVkZScsXG4gICAgICAgICAgICBzOiBcIiduIHBhYXIgc2Vrb25kZXNcIixcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vrb25kZXMnLFxuICAgICAgICAgICAgbTogXCInbiBtaW51dXRcIixcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlJyxcbiAgICAgICAgICAgIGg6IFwiJ24gdXVyXCIsXG4gICAgICAgICAgICBoaDogJyVkIHVyZScsXG4gICAgICAgICAgICBkOiBcIiduIGRhZ1wiLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWUnLFxuICAgICAgICAgICAgTTogXCInbiBtYWFuZFwiLFxuICAgICAgICAgICAgTU06ICclZCBtYWFuZGUnLFxuICAgICAgICAgICAgeTogXCInbiBqYWFyXCIsXG4gICAgICAgICAgICB5eTogJyVkIGphYXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3RlfGRlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICtcbiAgICAgICAgICAgICAgICAobnVtYmVyID09PSAxIHx8IG51bWJlciA9PT0gOCB8fCBudW1iZXIgPj0gMjAgPyAnc3RlJyA6ICdkZScpXG4gICAgICAgICAgICApOyAvLyBUaGFua3MgdG8gSm9yaXMgUsO2bGluZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qanVwaXRlclxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1hYW5kYWcgaXMgZGllIGVlcnN0ZSBkYWcgdmFuIGRpZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBEaWUgd2VlayB3YXQgZGllIDRkZSBKYW51YXJpZSBiZXZhdCBpcyBkaWUgZWVyc3RlIHdlZWsgdmFuIGRpZSBqYWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFmO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoQWxnZXJpYSkgW2FyLWR6XVxuLy8hIGF1dGhvciA6IEFtaW5lIFJvdWtoOiBodHRwczovL2dpdGh1Yi5jb20vQW1pbmUyN1xuLy8hIGF1dGhvciA6IEFiZGVsIFNhaWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcbi8vISBhdXRob3IgOiBBaG1lZCBFbGtoYXRpYlxuLy8hIGF1dGhvciA6IGZvcmFiaSBodHRwczovL2dpdGh1Yi5jb20vZm9yYWJpXG4vLyEgYXV0aG9yIDogTm91cmVkZGluZSBMT1VBSEVESiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub3VyZWRkaW5lbVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHBsdXJhbEZvcm0gPSBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgcmV0dXJuIG4gPT09IDBcbiAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICA6IG4gPT09IDFcbiAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgOiBuID09PSAyXG4gICAgICAgICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICAgICAgICA6IG4gJSAxMDAgPj0gMyAmJiBuICUgMTAwIDw9IDEwXG4gICAgICAgICAgICAgICAgICAgICAgPyAzXG4gICAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDExXG4gICAgICAgICAgICAgICAgICAgICAgICA/IDRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogNTtcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFscyA9IHtcbiAgICAgICAgICAgIHM6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICAgICAgJ9ir2KfZhtmK2Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYq9in2YbZitiq2KfZhicsICfYq9in2YbZitiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYq9mI2KfZhicsXG4gICAgICAgICAgICAgICAgJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBtOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINiv2YLZitmC2KknLFxuICAgICAgICAgICAgICAgICfYr9mC2YrZgtipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2K/ZgtmK2YLYqtin2YYnLCAn2K/ZgtmK2YLYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICAgICAgJyVkINiv2YLZitmC2KknLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBoOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINiz2KfYudipJyxcbiAgICAgICAgICAgICAgICAn2LPYp9i52Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYs9in2LnYqtin2YYnLCAn2LPYp9i52KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINmK2YjZhScsXG4gICAgICAgICAgICAgICAgJ9mK2YjZhSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfZitmI2YXYp9mGJywgJ9mK2YjZhdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgICAgICclZCDZitmI2YXZi9inJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmFJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBNOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINi02YfYsScsXG4gICAgICAgICAgICAgICAgJ9i02YfYsSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfYtNmH2LHYp9mGJywgJ9i02YfYsdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LHYpycsXG4gICAgICAgICAgICAgICAgJyVkINi02YfYsScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYudin2YUnLFxuICAgICAgICAgICAgICAgICfYudin2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LnYp9mF2KfZhicsICfYudin2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LnZiNin2YUnLFxuICAgICAgICAgICAgICAgICclZCDYudin2YXZi9inJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mFJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbGl6ZSA9IGZ1bmN0aW9uICh1KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgIHZhciBmID0gcGx1cmFsRm9ybShudW1iZXIpLFxuICAgICAgICAgICAgICAgICAgICBzdHIgPSBwbHVyYWxzW3VdW3BsdXJhbEZvcm0obnVtYmVyKV07XG4gICAgICAgICAgICAgICAgaWYgKGYgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyW3dpdGhvdXRTdWZmaXggPyAwIDogMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRocyA9IFtcbiAgICAgICAgICAgICfYrNin2YbZgdmKJyxcbiAgICAgICAgICAgICfZgdmK2YHYsdmKJyxcbiAgICAgICAgICAgICfZhdin2LHYsycsXG4gICAgICAgICAgICAn2KPZgdix2YrZhCcsXG4gICAgICAgICAgICAn2YXYp9mKJyxcbiAgICAgICAgICAgICfYrNmI2KfZhicsXG4gICAgICAgICAgICAn2KzZiNmK2YTZitipJyxcbiAgICAgICAgICAgICfYo9mI2KonLFxuICAgICAgICAgICAgJ9iz2KjYqtmF2KjYsScsXG4gICAgICAgICAgICAn2KPZg9iq2YjYqNixJyxcbiAgICAgICAgICAgICfZhtmI2YHZhdio2LEnLFxuICAgICAgICAgICAgJ9iv2YrYs9mF2KjYsScsXG4gICAgICAgIF07XG5cbiAgICB2YXIgYXJEeiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLWR6Jywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC9cXHUyMDBGTS9cXHUyMDBGWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9mL2Kcg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2KjYudivICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBzczogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBtOiBwbHVyYWxpemUoJ20nKSxcbiAgICAgICAgICAgIG1tOiBwbHVyYWxpemUoJ20nKSxcbiAgICAgICAgICAgIGg6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgaGg6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgZDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBkZDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBNOiBwbHVyYWxpemUoJ00nKSxcbiAgICAgICAgICAgIE1NOiBwbHVyYWxpemUoJ00nKSxcbiAgICAgICAgICAgIHk6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICAgICAgeXk6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhckR6O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoS3V3YWl0KSBbYXIta3ddXG4vLyEgYXV0aG9yIDogTnVzcmV0IFBhcmxhazogaHR0cHM6Ly9naXRodWIuY29tL251c3JldHBhcmxha1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGFyS3cgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1rdycsIHtcbiAgICAgICAgbW9udGhzOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KrZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9in2K3Yr1/Yp9iq2YbZitmGX9ir2YTYp9ir2KfYoV/Yp9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhckt3O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoTGlieWEpIFthci1seV1cbi8vISBhdXRob3IgOiBBbGkgSG1lcjogaHR0cHM6Ly9naXRodWIuY29tL2tpa29hbmlzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJzEnLFxuICAgICAgICAgICAgMjogJzInLFxuICAgICAgICAgICAgMzogJzMnLFxuICAgICAgICAgICAgNDogJzQnLFxuICAgICAgICAgICAgNTogJzUnLFxuICAgICAgICAgICAgNjogJzYnLFxuICAgICAgICAgICAgNzogJzcnLFxuICAgICAgICAgICAgODogJzgnLFxuICAgICAgICAgICAgOTogJzknLFxuICAgICAgICAgICAgMDogJzAnLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxGb3JtID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIHJldHVybiBuID09PSAwXG4gICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgOiBuID09PSAxXG4gICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgIDogbiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMFxuICAgICAgICAgICAgICAgICAgICAgID8gM1xuICAgICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAxMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyA0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IDU7XG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbHMgPSB7XG4gICAgICAgICAgICBzOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICfYq9in2YbZitipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2KvYp9mG2YrYqtin2YYnLCAn2KvYp9mG2YrYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KvZiNin2YYnLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAn2K/ZgtmK2YLYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iv2YLZitmC2KrYp9mGJywgJ9iv2YLZitmC2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJ9iz2KfYudipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2LPYp9i52KrYp9mGJywgJ9iz2KfYudiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDZitmI2YUnLFxuICAgICAgICAgICAgICAgICfZitmI2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2YrZiNmF2KfZhicsICfZitmI2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgTTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYtNmH2LEnLFxuICAgICAgICAgICAgICAgICfYtNmH2LEg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LTZh9ix2KfZhicsICfYtNmH2LHZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ix2KcnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LEnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHk6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LnYp9mFJyxcbiAgICAgICAgICAgICAgICAn2LnYp9mFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i52KfZhdin2YYnLCAn2LnYp9mF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i52YjYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxpemUgPSBmdW5jdGlvbiAodSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IHBsdXJhbEZvcm0obnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcGx1cmFsc1t1XVtwbHVyYWxGb3JtKG51bWJlcildO1xuICAgICAgICAgICAgICAgIGlmIChmID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0clt3aXRob3V0U3VmZml4ID8gMCA6IDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBtb250aHMgPSBbXG4gICAgICAgICAgICAn2YrZhtin2YrYsScsXG4gICAgICAgICAgICAn2YHYqNix2KfZitixJyxcbiAgICAgICAgICAgICfZhdin2LHYsycsXG4gICAgICAgICAgICAn2KPYqNix2YrZhCcsXG4gICAgICAgICAgICAn2YXYp9mK2YgnLFxuICAgICAgICAgICAgJ9mK2YjZhtmK2YgnLFxuICAgICAgICAgICAgJ9mK2YjZhNmK2YgnLFxuICAgICAgICAgICAgJ9ij2LrYs9i32LMnLFxuICAgICAgICAgICAgJ9iz2KjYqtmF2KjYsScsXG4gICAgICAgICAgICAn2KPZg9iq2YjYqNixJyxcbiAgICAgICAgICAgICfZhtmI2YHZhdio2LEnLFxuICAgICAgICAgICAgJ9iv2YrYs9mF2KjYsScsXG4gICAgICAgIF07XG5cbiAgICB2YXIgYXJMeSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLWx5Jywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC9cXHUyMDBGTS9cXHUyMDBGWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9mL2Kcg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2KjYudivICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBzczogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBtOiBwbHVyYWxpemUoJ20nKSxcbiAgICAgICAgICAgIG1tOiBwbHVyYWxpemUoJ20nKSxcbiAgICAgICAgICAgIGg6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgaGg6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgZDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBkZDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBNOiBwbHVyYWxpemUoJ00nKSxcbiAgICAgICAgICAgIE1NOiBwbHVyYWxpemUoJ00nKSxcbiAgICAgICAgICAgIHk6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICAgICAgeXk6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhckx5O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoTW9yb2NjbykgW2FyLW1hXVxuLy8hIGF1dGhvciA6IEVsRmFkaWxpIFlhc3NpbmUgOiBodHRwczovL2dpdGh1Yi5jb20vRWxGYWRpbGlZXG4vLyEgYXV0aG9yIDogQWJkZWwgU2FpZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBhck1hID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXItbWEnLCB7XG4gICAgICAgIG1vbnRoczogJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mKX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiNiyX9i62LTYql/YtNiq2YbYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YbYqNixX9iv2KzZhtio2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mKX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiNiyX9i62LTYql/YtNiq2YbYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YbYqNixX9iv2KzZhtio2LEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYp9it2K9f2KfYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KfYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/YpyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogJ9ir2YjYp9mGJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTTogJ9i02YfYsScsXG4gICAgICAgICAgICBNTTogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHk6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXk6ICclZCDYs9mG2YjYp9iqJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyTWE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJhYmljIChQYWxlc3RpbmUpIFthci1wc11cbi8vISBhdXRob3IgOiBNYWpkIEFsLVNoaWhhYmkgOiBodHRwczovL2dpdGh1Yi5jb20vbWFqZGFsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ9mhJyxcbiAgICAgICAgICAgIDI6ICfZoicsXG4gICAgICAgICAgICAzOiAn2aMnLFxuICAgICAgICAgICAgNDogJ9mkJyxcbiAgICAgICAgICAgIDU6ICfZpScsXG4gICAgICAgICAgICA2OiAn2aYnLFxuICAgICAgICAgICAgNzogJ9mnJyxcbiAgICAgICAgICAgIDg6ICfZqCcsXG4gICAgICAgICAgICA5OiAn2aknLFxuICAgICAgICAgICAgMDogJ9mgJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAgICAgJ9miJzogJzInLFxuICAgICAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAgICAgJ9mlJzogJzUnLFxuICAgICAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAgICAgJ9moJzogJzgnLFxuICAgICAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAgICAgJ9mgJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGFyUHMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1wcycsIHtcbiAgICAgICAgbW9udGhzOiAn2YPYp9mG2YjZhiDYp9mE2KvYp9mG2Ypf2LTYqNin2Ldf2KLYsNin2LFf2YbZitiz2KfZhl/Yo9mK2ZHYp9ixX9it2LLZitix2KfZhl/YqtmF2ZHZiNiyX9ii2Khf2KPZitmE2YjZhF/Yqti02LHZiiDYp9mE2KPZiNmR2YRf2KrYtNix2YrZhiDYp9mE2KvYp9mG2Ypf2YPYp9mG2YjZhiDYp9mE2KPZiNmR2YQnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9mD2aJf2LTYqNin2Ldf2KLYsNin2LFf2YbZitiz2KfZhl/Yo9mK2ZHYp9ixX9it2LLZitix2KfZhl/YqtmF2ZHZiNiyX9ii2Khf2KPZitmE2YjZhF/YqtmhX9iq2aJf2YPZoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b2aPZpNml2abZp9mo2anZoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcnKSAvLyByZXZlcnNlZCBzaW5jZSBuZWdhdGl2ZSBsb29rYmVoaW5kIG5vdCBzdXBwb3J0ZWQgZXZlcnl3aGVyZVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9mh2aJdKD8hW1xcdTA2MmFcXHUwNjQzXSkvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhclBzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoU2F1ZGkgQXJhYmlhKSBbYXItc2FdXG4vLyEgYXV0aG9yIDogU3VoYWlsIEFsa293YWlsZWV0IDogaHR0cHM6Ly9naXRodWIuY29tL3hzb2hcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn2aEnLFxuICAgICAgICAgICAgMjogJ9miJyxcbiAgICAgICAgICAgIDM6ICfZoycsXG4gICAgICAgICAgICA0OiAn2aQnLFxuICAgICAgICAgICAgNTogJ9mlJyxcbiAgICAgICAgICAgIDY6ICfZpicsXG4gICAgICAgICAgICA3OiAn2acnLFxuICAgICAgICAgICAgODogJ9moJyxcbiAgICAgICAgICAgIDk6ICfZqScsXG4gICAgICAgICAgICAwOiAn2aAnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn2aEnOiAnMScsXG4gICAgICAgICAgICAn2aInOiAnMicsXG4gICAgICAgICAgICAn2aMnOiAnMycsXG4gICAgICAgICAgICAn2aQnOiAnNCcsXG4gICAgICAgICAgICAn2aUnOiAnNScsXG4gICAgICAgICAgICAn2aYnOiAnNicsXG4gICAgICAgICAgICAn2acnOiAnNycsXG4gICAgICAgICAgICAn2agnOiAnOCcsXG4gICAgICAgICAgICAn2aknOiAnOScsXG4gICAgICAgICAgICAn2aAnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgYXJTYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLXNhJywge1xuICAgICAgICBtb250aHM6ICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZitmIX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiF/Yo9i62LPYt9izX9iz2KjYqtmF2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmB2YXYqNixX9iv2YrYs9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2YrZiF/ZitmI2YbZitmIX9mK2YjZhNmK2Yhf2KPYutiz2LfYs1/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b2aHZotmj2aTZpdmm2afZqNmp2aBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyU2E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlICA6ICBBcmFiaWMgKFR1bmlzaWEpIFthci10bl1cbi8vISBhdXRob3IgOiBOYWRlciBUb3VrYWJyaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9uYWRlcmlvXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgYXJUbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLXRuJywge1xuICAgICAgICBtb250aHM6ICfYrNin2YbZgdmKX9mB2YrZgdix2Ypf2YXYp9ix2LNf2KPZgdix2YrZhF/Zhdin2Ypf2KzZiNin2YZf2KzZiNmK2YTZitipX9ij2YjYql/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9is2KfZhtmB2Ypf2YHZitmB2LHZil/Zhdin2LHYs1/Yo9mB2LHZitmEX9mF2KfZil/YrNmI2KfZhl/YrNmI2YrZhNmK2Klf2KPZiNiqX9iz2KjYqtmF2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmB2YXYqNixX9iv2YrYs9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9ij2K3Yr1/Ypdir2YbZitmGX9ir2YTYp9ir2KfYoV/Yo9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJUbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgW2FyXVxuLy8hIGF1dGhvciA6IEFiZGVsIFNhaWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcbi8vISBhdXRob3IgOiBBaG1lZCBFbGtoYXRpYlxuLy8hIGF1dGhvciA6IGZvcmFiaSBodHRwczovL2dpdGh1Yi5jb20vZm9yYWJpXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ9mhJyxcbiAgICAgICAgICAgIDI6ICfZoicsXG4gICAgICAgICAgICAzOiAn2aMnLFxuICAgICAgICAgICAgNDogJ9mkJyxcbiAgICAgICAgICAgIDU6ICfZpScsXG4gICAgICAgICAgICA2OiAn2aYnLFxuICAgICAgICAgICAgNzogJ9mnJyxcbiAgICAgICAgICAgIDg6ICfZqCcsXG4gICAgICAgICAgICA5OiAn2aknLFxuICAgICAgICAgICAgMDogJ9mgJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAgICAgJ9miJzogJzInLFxuICAgICAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAgICAgJ9mlJzogJzUnLFxuICAgICAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAgICAgJ9moJzogJzgnLFxuICAgICAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAgICAgJ9mgJzogJzAnLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxGb3JtID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIHJldHVybiBuID09PSAwXG4gICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgOiBuID09PSAxXG4gICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgIDogbiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMFxuICAgICAgICAgICAgICAgICAgICAgID8gM1xuICAgICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAxMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyA0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IDU7XG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbHMgPSB7XG4gICAgICAgICAgICBzOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICfYq9in2YbZitipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2KvYp9mG2YrYqtin2YYnLCAn2KvYp9mG2YrYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KvZiNin2YYnLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAn2K/ZgtmK2YLYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iv2YLZitmC2KrYp9mGJywgJ9iv2YLZitmC2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJ9iz2KfYudipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2LPYp9i52KrYp9mGJywgJ9iz2KfYudiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDZitmI2YUnLFxuICAgICAgICAgICAgICAgICfZitmI2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2YrZiNmF2KfZhicsICfZitmI2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgTTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYtNmH2LEnLFxuICAgICAgICAgICAgICAgICfYtNmH2LEg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LTZh9ix2KfZhicsICfYtNmH2LHZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ix2KcnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LEnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHk6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LnYp9mFJyxcbiAgICAgICAgICAgICAgICAn2LnYp9mFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i52KfZhdin2YYnLCAn2LnYp9mF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i52YjYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxpemUgPSBmdW5jdGlvbiAodSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IHBsdXJhbEZvcm0obnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcGx1cmFsc1t1XVtwbHVyYWxGb3JtKG51bWJlcildO1xuICAgICAgICAgICAgICAgIGlmIChmID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0clt3aXRob3V0U3VmZml4ID8gMCA6IDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBtb250aHMgPSBbXG4gICAgICAgICAgICAn2YrZhtin2YrYsScsXG4gICAgICAgICAgICAn2YHYqNix2KfZitixJyxcbiAgICAgICAgICAgICfZhdin2LHYsycsXG4gICAgICAgICAgICAn2KPYqNix2YrZhCcsXG4gICAgICAgICAgICAn2YXYp9mK2YgnLFxuICAgICAgICAgICAgJ9mK2YjZhtmK2YgnLFxuICAgICAgICAgICAgJ9mK2YjZhNmK2YgnLFxuICAgICAgICAgICAgJ9ij2LrYs9i32LMnLFxuICAgICAgICAgICAgJ9iz2KjYqtmF2KjYsScsXG4gICAgICAgICAgICAn2KPZg9iq2YjYqNixJyxcbiAgICAgICAgICAgICfZhtmI2YHZhdio2LEnLFxuICAgICAgICAgICAgJ9iv2YrYs9mF2KjYsScsXG4gICAgICAgIF07XG5cbiAgICB2YXIgYXIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhcicsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QvXFx1MjAwRk0vXFx1MjAwRllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/Zi9inINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9io2LnYryAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgc3M6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBtbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGhoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgZGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICBNTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICB5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgICAgIHl5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9mh2aLZo9mk2aXZptmn2ajZqdmgXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXplcmJhaWphbmkgW2F6XVxuLy8hIGF1dGhvciA6IHRvcGNoaXlldiA6IGh0dHBzOi8vZ2l0aHViLmNvbS90b3BjaGl5ZXZcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMTogJy1pbmNpJyxcbiAgICAgICAgNTogJy1pbmNpJyxcbiAgICAgICAgODogJy1pbmNpJyxcbiAgICAgICAgNzA6ICctaW5jaScsXG4gICAgICAgIDgwOiAnLWluY2knLFxuICAgICAgICAyOiAnLW5jaScsXG4gICAgICAgIDc6ICctbmNpJyxcbiAgICAgICAgMjA6ICctbmNpJyxcbiAgICAgICAgNTA6ICctbmNpJyxcbiAgICAgICAgMzogJy3DvG5jw7wnLFxuICAgICAgICA0OiAnLcO8bmPDvCcsXG4gICAgICAgIDEwMDogJy3DvG5jw7wnLFxuICAgICAgICA2OiAnLW5jxLEnLFxuICAgICAgICA5OiAnLXVuY3UnLFxuICAgICAgICAxMDogJy11bmN1JyxcbiAgICAgICAgMzA6ICctdW5jdScsXG4gICAgICAgIDYwOiAnLcSxbmPEsScsXG4gICAgICAgIDkwOiAnLcSxbmPEsScsXG4gICAgfTtcblxuICAgIHZhciBheiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2F6Jywge1xuICAgICAgICBtb250aHM6ICd5YW52YXJfZmV2cmFsX21hcnRfYXByZWxfbWF5X2l5dW5faXl1bF9hdnF1c3Rfc2VudHlhYnJfb2t0eWFicl9ub3lhYnJfZGVrYWJyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ3lhbl9mZXZfbWFyX2Fwcl9tYXlfaXluX2l5bF9hdnFfc2VuX29rdF9ub3lfZGVrJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdCYXphcl9CYXphciBlcnTJmXNpX8OHyZlyxZ/JmW5iyZkgYXjFn2FtxLFfw4fJmXLFn8mZbmLJmV9Dw7xtyZkgYXjFn2FtxLFfQ8O8bcmZX8WeyZluYsmZJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdCYXpfQnpFX8OHQXhfw4fJmXJfQ0F4X0PDvG1fxZ7JmW4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnQnpfQkVfw4dBX8OHyZlfQ0FfQ8O8X8WeyZknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tidWfDvG4gc2FhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tzYWJhaCBzYWF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tnyZlsyZluIGjJmWZ0yZldIGRkZGQgW3NhYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZMO8bsmZbl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdba2XDp8mZbiBoyZlmdMmZXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHNvbnJhJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDJmXZ2yZlsJyxcbiAgICAgICAgICAgIHM6ICdiaXIgbmXDp8mZIHNhbml5yZknLFxuICAgICAgICAgICAgc3M6ICclZCBzYW5pecmZJyxcbiAgICAgICAgICAgIG06ICdiaXIgZMmZcWlxyZknLFxuICAgICAgICAgICAgbW06ICclZCBkyZlxaXHJmScsXG4gICAgICAgICAgICBoOiAnYmlyIHNhYXQnLFxuICAgICAgICAgICAgaGg6ICclZCBzYWF0JyxcbiAgICAgICAgICAgIGQ6ICdiaXIgZ8O8bicsXG4gICAgICAgICAgICBkZDogJyVkIGfDvG4nLFxuICAgICAgICAgICAgTTogJ2JpciBheScsXG4gICAgICAgICAgICBNTTogJyVkIGF5JyxcbiAgICAgICAgICAgIHk6ICdiaXIgaWwnLFxuICAgICAgICAgICAgeXk6ICclZCBpbCcsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9nZWPJmXxzyZloyZlyfGfDvG5kw7x6fGF4xZ9hbS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKGfDvG5kw7x6fGF4xZ9hbSkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZ2VjyZknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3PJmWjJmXInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2fDvG5kw7x6JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdheMWfYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKMSxbmPEsXxpbmNpfG5jaXzDvG5jw7x8bmPEsXx1bmN1KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHplcm9cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3EsW5jxLEnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBiID0gKG51bWJlciAlIDEwMCkgLSBhLFxuICAgICAgICAgICAgICAgIGMgPSBudW1iZXIgPj0gMTAwID8gMTAwIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0gfHwgc3VmZml4ZXNbY10pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXo7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQmVsYXJ1c2lhbiBbYmVdXG4vLyEgYXV0aG9yIDogRG1pdHJ5IERlbWlkb3YgOiBodHRwczovL2dpdGh1Yi5jb20vZGVtaWRvdjkxXG4vLyEgYXV0aG9yOiBQcmFsZXNrYTogaHR0cDovL3ByYWxlc2thLnByby9cbi8vISBBdXRob3IgOiBNZW5lbGlvbiBFbGVuc8O6bGUgOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcGx1cmFsKHdvcmQsIG51bSkge1xuICAgICAgICB2YXIgZm9ybXMgPSB3b3JkLnNwbGl0KCdfJyk7XG4gICAgICAgIHJldHVybiBudW0gJSAxMCA9PT0gMSAmJiBudW0gJSAxMDAgIT09IDExXG4gICAgICAgICAgICA/IGZvcm1zWzBdXG4gICAgICAgICAgICA6IG51bSAlIDEwID49IDIgJiYgbnVtICUgMTAgPD0gNCAmJiAobnVtICUgMTAwIDwgMTAgfHwgbnVtICUgMTAwID49IDIwKVxuICAgICAgICAgICAgICA/IGZvcm1zWzFdXG4gICAgICAgICAgICAgIDogZm9ybXNbMl07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHNzOiB3aXRob3V0U3VmZml4ID8gJ9GB0LXQutGD0L3QtNCwX9GB0LXQutGD0L3QtNGLX9GB0LXQutGD0L3QtCcgOiAn0YHQtdC60YPQvdC00YNf0YHQtdC60YPQvdC00Ytf0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG1tOiB3aXRob3V0U3VmZml4ID8gJ9GF0LLRltC70ZbQvdCwX9GF0LLRltC70ZbQvdGLX9GF0LLRltC70ZbQvScgOiAn0YXQstGW0LvRltC90YNf0YXQstGW0LvRltC90Ytf0YXQstGW0LvRltC9JyxcbiAgICAgICAgICAgIGhoOiB3aXRob3V0U3VmZml4ID8gJ9Cz0LDQtNC30ZbQvdCwX9Cz0LDQtNC30ZbQvdGLX9Cz0LDQtNC30ZbQvScgOiAn0LPQsNC00LfRltC90YNf0LPQsNC00LfRltC90Ytf0LPQsNC00LfRltC9JyxcbiAgICAgICAgICAgIGRkOiAn0LTQt9C10L3RjF/QtNC90ZZf0LTQt9GR0L0nLFxuICAgICAgICAgICAgTU06ICfQvNC10YHRj9GGX9C80LXRgdGP0YbRi1/QvNC10YHRj9GG0LDRnicsXG4gICAgICAgICAgICB5eTogJ9Cz0L7QtF/Qs9Cw0LTRi1/Qs9Cw0LTQvtGeJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ20nKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfRhdCy0ZbQu9GW0L3QsCcgOiAn0YXQstGW0LvRltC90YMnO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2gnKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfQs9Cw0LTQt9GW0L3QsCcgOiAn0LPQsNC00LfRltC90YMnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIHBsdXJhbChmb3JtYXRba2V5XSwgK251bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYmUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdiZScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfRgdGC0YPQtNC30LXQvdGPX9C70Y7RgtCw0LPQsF/RgdCw0LrQsNCy0ZbQutCwX9C60YDQsNGB0LDQstGW0LrQsF/RgtGA0LDRntC90Y9f0YfRjdGA0LLQtdC90Y9f0LvRltC/0LXQvdGPX9C20L3RltGe0L3Rj1/QstC10YDQsNGB0L3Rj1/QutCw0YHRgtGA0YvRh9C90ZbQutCwX9C70ZbRgdGC0LDQv9Cw0LTQsF/RgdC90LXQttC90Y8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9GB0YLRg9C00LfQtdC90Yxf0LvRjtGC0Ytf0YHQsNC60LDQstGW0Lpf0LrRgNCw0YHQsNCy0ZbQul/RgtGA0LDQstC10L3RjF/Rh9GN0YDQstC10L3RjF/Qu9GW0L/QtdC90Yxf0LbQvdGW0LLQtdC90Yxf0LLQtdGA0LDRgdC10L3RjF/QutCw0YHRgtGA0YvRh9C90ZbQul/Qu9GW0YHRgtCw0L/QsNC0X9GB0L3QtdC20LDQvdGMJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn0YHRgtGD0LRf0LvRjtGCX9GB0LDQul/QutGA0LDRgV/RgtGA0LDQsl/Rh9GN0YDQsl/Qu9GW0L9f0LbQvdGW0LJf0LLQtdGAX9C60LDRgdGCX9C70ZbRgdGCX9GB0L3QtdC2Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czoge1xuICAgICAgICAgICAgZm9ybWF0OiAn0L3Rj9C00LfQtdC70Y5f0L/QsNC90Y/QtNC30LXQu9Cw0Lpf0LDRntGC0L7RgNCw0Lpf0YHQtdGA0LDQtNGDX9GH0LDRhtCy0LXRgF/Qv9GP0YLQvdGW0YbRg1/RgdGD0LHQvtGC0YMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9C90Y/QtNC30LXQu9GPX9C/0LDQvdGP0LTQt9C10LvQsNC6X9Cw0Z7RgtC+0YDQsNC6X9GB0LXRgNCw0LTQsF/Rh9Cw0YbQstC10YBf0L/Rj9GC0L3RltGG0LBf0YHRg9Cx0L7RgtCwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvXFxbID9b0KPRg9GeXSA/KD860LzRltC90YPQu9GD0Y580L3QsNGB0YLRg9C/0L3Rg9GOKT8gP1xcXSA/ZGRkZC8sXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQvdC0X9C/0L1f0LDRgl/RgdGAX9GH0YZf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9C90LRf0L/QvV/QsNGCX9GB0YBf0YfRhl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVkg0LMuJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZINCzLiwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZINCzLiwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQodGR0L3QvdGPINGeXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9CX0LDRntGC0YDQsCDRnl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQo9GH0L7RgNCwINGeXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW9CjXSBkZGRkIFvRnl0gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CjINC80ZbQvdGD0LvRg9GOXSBkZGRkIFvRnl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0KMg0LzRltC90YPQu9GLXSBkZGRkIFvRnl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9C/0YDQsNC3ICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDRgtCw0LzRgycsXG4gICAgICAgICAgICBzOiAn0L3QtdC60LDQu9GM0LrRliDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGhoOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZDogJ9C00LfQtdC90YwnLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNOiAn0LzQtdGB0Y/RhicsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHk6ICfQs9C+0LQnLFxuICAgICAgICAgICAgeXk6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/QvdC+0YfRi3zRgNCw0L3RltGG0Yt80LTQvdGPfNCy0LXRh9Cw0YDQsC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNC00L3Rj3zQstC10YfQsNGA0LApJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C90L7Rh9GLJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRgNCw0L3RltGG0YsnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C00L3Rjyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LLQtdGH0LDRgNCwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjRlnzRi3zQs9CwKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG51bWJlciAlIDEwID09PSAyIHx8IG51bWJlciAlIDEwID09PSAzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyICUgMTAwICE9PSAxMiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyICUgMTAwICE9PSAxM1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBudW1iZXIgKyAnLdGWJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgKyAnLdGLJztcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LPQsCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJlO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJ1bGdhcmlhbiBbYmddXG4vLyEgYXV0aG9yIDogS3Jhc2VuIEJvcmlzb3YgOiBodHRwczovL2dpdGh1Yi5jb20va3JhelxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGJnID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYmcnLCB7XG4gICAgICAgIG1vbnRoczogJ9GP0L3Rg9Cw0YDQuF/RhNC10LLRgNGD0LDRgNC4X9C80LDRgNGCX9Cw0L/RgNC40Ltf0LzQsNC5X9GO0L3QuF/RjtC70Lhf0LDQstCz0YPRgdGCX9GB0LXQv9GC0LXQvNCy0YDQuF/QvtC60YLQvtC80LLRgNC4X9C90L7QtdC80LLRgNC4X9C00LXQutC10LzQstGA0LgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0Y/QvdGDX9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDQuV/RjtC90Lhf0Y7Qu9C4X9Cw0LLQs1/RgdC10L9f0L7QutGCX9C90L7QtV/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn0L3QtdC00LXQu9GPX9C/0L7QvdC10LTQtdC70L3QuNC6X9Cy0YLQvtGA0L3QuNC6X9GB0YDRj9C00LBf0YfQtdGC0LLRitGA0YLRitC6X9C/0LXRgtGK0Lpf0YHRitCx0L7RgtCwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0L3QtdC0X9C/0L7QvV/QstGC0L5f0YHRgNGPX9GH0LXRgl/Qv9C10YJf0YHRitCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9C90LRf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9CU0L3QtdGBINCyXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Cj0YLRgNC1INCyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9CyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9CS0YfQtdGA0LAg0LJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQnNC40L3QsNC70LDRgtCwXSBkZGRkIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQnNC40L3QsNC70LjRj10gZGRkZCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfRgdC70LXQtCAlcycsXG4gICAgICAgICAgICBwYXN0OiAn0L/RgNC10LTQuCAlcycsXG4gICAgICAgICAgICBzOiAn0L3Rj9C60L7Qu9C60L4g0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgc3M6ICclZCDRgdC10LrRg9C90LTQuCcsXG4gICAgICAgICAgICBtOiAn0LzQuNC90YPRgtCwJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LzQuNC90YPRgtC4JyxcbiAgICAgICAgICAgIGg6ICfRh9Cw0YEnLFxuICAgICAgICAgICAgaGg6ICclZCDRh9Cw0YHQsCcsXG4gICAgICAgICAgICBkOiAn0LTQtdC9JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0LTQtdC90LAnLFxuICAgICAgICAgICAgdzogJ9GB0LXQtNC80LjRhtCwJyxcbiAgICAgICAgICAgIHd3OiAnJWQg0YHQtdC00LzQuNGG0LgnLFxuICAgICAgICAgICAgTTogJ9C80LXRgdC10YYnLFxuICAgICAgICAgICAgTU06ICclZCDQvNC10YHQtdGG0LAnLFxuICAgICAgICAgICAgeTogJ9Cz0L7QtNC40L3QsCcsXG4gICAgICAgICAgICB5eTogJyVkINCz0L7QtNC40L3QuCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0LXQsnzQtdC9fNGC0Lh80LLQuHzRgNC4fNC80LgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGxhc3REaWdpdCA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGxhc3QyRGlnaXRzID0gbnVtYmVyICUgMTAwO1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10LInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10L0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA+IDEwICYmIGxhc3QyRGlnaXRzIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGA0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDcgfHwgbGFzdERpZ2l0ID09PSA4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LzQuCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGC0LgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYmc7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQmFtYmFyYSBbYm1dXG4vLyEgYXV0aG9yIDogRXN0ZWxsZSBDb21tZW50IDogaHR0cHM6Ly9naXRodWIuY29tL2VzdGVsbGVjb21tZW50XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgYm0gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdibScsIHtcbiAgICAgICAgbW9udGhzOiAnWmFud3V5ZWthbG9fRmV3dXJ1eWVrYWxvX01hcmlzaWthbG9fQXdpcmlsaWthbG9fTcmba2Fsb19adXfJm25rYWxvX1p1bHV5ZWthbG9fVXRpa2Fsb19TyZt0YW5idXJ1a2Fsb1/JlGt1dMmUYnVydWthbG9fTm93YW5idXJ1a2Fsb19EZXNhbmJ1cnVrYWxvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ1phbl9GZXdfTWFyX0F3aV9NyZtfWnV3X1p1bF9VdGlfU8mbdF/JlGt1X05vd19EZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnS2FyaV9OdMmbbsmbbl9UYXJhdGFfQXJhYmFfQWxhbWlzYV9KdW1hX1NpYmlyaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0thcl9OdMmbX1Rhcl9BcmFfQWxhX0p1bV9TaWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnS2FfTnRfVGFfQXJfQWxfSnVfU2knLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnTU1NTSBbdGlsZV0gRCBbc2FuXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ01NTU0gW3RpbGVdIEQgW3Nhbl0gWVlZWSBbbMmbcsmbXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBNTU1NIFt0aWxlXSBEIFtzYW5dIFlZWVkgW2zJm3LJm10gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tCaSBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbU2luaSBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbZG9uIGzJm3LJm10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tLdW51IGzJm3LJm10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFt0yZttyZtuZW4gbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIGvJlG7JlCcsXG4gICAgICAgICAgICBwYXN0OiAnYSBiyZsgJXMgYsmUJyxcbiAgICAgICAgICAgIHM6ICdzYW5nYSBkYW1hIGRhbWEnLFxuICAgICAgICAgICAgc3M6ICdzZWtvbmRpICVkJyxcbiAgICAgICAgICAgIG06ICdtaW5pdGkga2VsZW4nLFxuICAgICAgICAgICAgbW06ICdtaW5pdGkgJWQnLFxuICAgICAgICAgICAgaDogJ2zJm3LJmyBrZWxlbicsXG4gICAgICAgICAgICBoaDogJ2zJm3LJmyAlZCcsXG4gICAgICAgICAgICBkOiAndGlsZSBrZWxlbicsXG4gICAgICAgICAgICBkZDogJ3RpbGUgJWQnLFxuICAgICAgICAgICAgTTogJ2thbG8ga2VsZW4nLFxuICAgICAgICAgICAgTU06ICdrYWxvICVkJyxcbiAgICAgICAgICAgIHk6ICdzYW4ga2VsZW4nLFxuICAgICAgICAgICAgeXk6ICdzYW4gJWQnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYm07XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQmVuZ2FsaSAoQmFuZ2xhZGVzaCkgW2JuLWJkXVxuLy8hIGF1dGhvciA6IEFzcmFmIEhvc3NhaW4gUGF0b2FyeSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hc2h3b29sZm9yZFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgp6cnLFxuICAgICAgICAgICAgMjogJ+CnqCcsXG4gICAgICAgICAgICAzOiAn4KepJyxcbiAgICAgICAgICAgIDQ6ICfgp6onLFxuICAgICAgICAgICAgNTogJ+CnqycsXG4gICAgICAgICAgICA2OiAn4KesJyxcbiAgICAgICAgICAgIDc6ICfgp60nLFxuICAgICAgICAgICAgODogJ+CnricsXG4gICAgICAgICAgICA5OiAn4KevJyxcbiAgICAgICAgICAgIDA6ICfgp6YnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KenJzogJzEnLFxuICAgICAgICAgICAgJ+CnqCc6ICcyJyxcbiAgICAgICAgICAgICfgp6knOiAnMycsXG4gICAgICAgICAgICAn4KeqJzogJzQnLFxuICAgICAgICAgICAgJ+Cnqyc6ICc1JyxcbiAgICAgICAgICAgICfgp6wnOiAnNicsXG4gICAgICAgICAgICAn4KetJzogJzcnLFxuICAgICAgICAgICAgJ+Cnric6ICc4JyxcbiAgICAgICAgICAgICfgp68nOiAnOScsXG4gICAgICAgICAgICAn4KemJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGJuQmQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdibi1iZCcsIHtcbiAgICAgICAgbW9udGhzOiAn4Kac4Ka+4Kao4KeB4Kef4Ka+4Kaw4Ka/X+Cmq+Cnh+CmrOCnjeCmsOCngeCnn+CmvuCmsOCmv1/gpq7gpr7gprDgp43gpppf4KaP4Kaq4KeN4Kaw4Ka/4KayX+CmruCnh1/gppzgp4Hgpqhf4Kac4KeB4Kay4Ka+4KaHX+CmhuCml+CmuOCnjeCmn1/gprjgp4fgpqrgp43gpp/gp4fgpq7gp43gpqzgprBf4KaF4KaV4KeN4Kaf4KeL4Kas4KawX+CmqOCmreCnh+CmruCnjeCmrOCmsF/gpqHgpr/gprjgp4fgpq7gp43gpqzgprAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CmnOCmvuCmqOCngV/gpqvgp4fgpqzgp43gprDgp4Ff4Kau4Ka+4Kaw4KeN4KaaX+Cmj+CmquCnjeCmsOCmv+Cmsl/gpq7gp4df4Kac4KeB4KaoX+CmnOCngeCmsuCmvuCmh1/gpobgppfgprjgp43gpp9f4Ka44KeH4Kaq4KeN4KafX+CmheCmleCnjeCmn+Cni1/gpqjgpq3gp4df4Kah4Ka/4Ka44KeHJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn4Kaw4Kas4Ka/4Kas4Ka+4KawX+CmuOCni+CmruCmrOCmvuCmsF/gpq7gppngp43gppfgprLgpqzgpr7gprBf4Kas4KeB4Kan4Kas4Ka+4KawX+CmrOCng+CmueCmuOCnjeCmquCmpOCmv+CmrOCmvuCmsF/gprbgp4HgppXgp43gprDgpqzgpr7gprBf4Ka24Kao4Ka/4Kas4Ka+4KawJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4Kaw4Kas4Ka/X+CmuOCni+Cmrl/gpq7gppngp43gppfgprJf4Kas4KeB4KanX+CmrOCng+CmueCmuOCnjeCmquCmpOCmv1/gprbgp4HgppXgp43gprBf4Ka24Kao4Ka/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CmsOCmrOCmv1/gprjgp4vgpq5f4Kau4KaZ4KeN4KaX4KayX+CmrOCngeCmp1/gpqzgp4Pgprlf4Ka24KeB4KaV4KeN4KawX+CmtuCmqOCmvycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3Mg4Ka44Kau4KefJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgprjgpq7gp58nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KaG4KacXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CmhuCml+CmvuCmruCngOCmleCmvuCmsl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+Cml+CmpOCmleCmvuCmsl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KaX4KakXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCmquCmsOCnhycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4KaG4KaX4KeHJyxcbiAgICAgICAgICAgIHM6ICfgppXgp5/gp4fgppUg4Ka44KeH4KaV4KeH4Kao4KeN4KahJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Ka44KeH4KaV4KeH4Kao4KeN4KahJyxcbiAgICAgICAgICAgIG06ICfgpo/gppUg4Kau4Ka/4Kao4Ka/4KafJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4Kau4Ka/4Kao4Ka/4KafJyxcbiAgICAgICAgICAgIGg6ICfgpo/gppUg4KaY4Kao4KeN4Kaf4Ka+JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KaY4Kao4KeN4Kaf4Ka+JyxcbiAgICAgICAgICAgIGQ6ICfgpo/gppUg4Kam4Ka/4KaoJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Kam4Ka/4KaoJyxcbiAgICAgICAgICAgIE06ICfgpo/gppUg4Kau4Ka+4Ka4JyxcbiAgICAgICAgICAgIE1NOiAnJWQg4Kau4Ka+4Ka4JyxcbiAgICAgICAgICAgIHk6ICfgpo/gppUg4Kas4Kab4KawJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Kas4Kab4KawJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Cnp+CnqOCnqeCnquCnq+CnrOCnreCnruCnr+Cnpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4Kaw4Ka+4KakfOCmreCni+CmsHzgprjgppXgpr7gprJ84Kam4KeB4Kaq4KeB4KawfOCmrOCmv+CmleCmvuCmsnzgprjgpqjgp43gpqfgp43gpq/gpr584Kaw4Ka+4KakLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4Kaw4Ka+4KakJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kat4KeL4KawJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CmuOCmleCmvuCmsicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpqbgp4Hgpqrgp4HgprAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMyA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kas4Ka/4KaV4Ka+4KayJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Ka44Kao4KeN4Kan4KeN4Kav4Ka+Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kaw4Ka+4KakJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmreCni+CmsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Ka44KaV4Ka+4KayJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpqbgp4Hgpqrgp4HgprAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmrOCmv+CmleCmvuCmsic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Ka44Kao4KeN4Kan4KeN4Kav4Ka+JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprDgpr7gpqQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYm5CZDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCZW5nYWxpIFtibl1cbi8vISBhdXRob3IgOiBLYXVzaGlrIEdhbmRoaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rYXVzaGlrZ2FuZGhpXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+CnpycsXG4gICAgICAgICAgICAyOiAn4KeoJyxcbiAgICAgICAgICAgIDM6ICfgp6knLFxuICAgICAgICAgICAgNDogJ+CnqicsXG4gICAgICAgICAgICA1OiAn4KerJyxcbiAgICAgICAgICAgIDY6ICfgp6wnLFxuICAgICAgICAgICAgNzogJ+CnrScsXG4gICAgICAgICAgICA4OiAn4KeuJyxcbiAgICAgICAgICAgIDk6ICfgp68nLFxuICAgICAgICAgICAgMDogJ+CnpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgp6cnOiAnMScsXG4gICAgICAgICAgICAn4KeoJzogJzInLFxuICAgICAgICAgICAgJ+CnqSc6ICczJyxcbiAgICAgICAgICAgICfgp6onOiAnNCcsXG4gICAgICAgICAgICAn4KerJzogJzUnLFxuICAgICAgICAgICAgJ+CnrCc6ICc2JyxcbiAgICAgICAgICAgICfgp60nOiAnNycsXG4gICAgICAgICAgICAn4KeuJzogJzgnLFxuICAgICAgICAgICAgJ+Cnryc6ICc5JyxcbiAgICAgICAgICAgICfgp6YnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgYm4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdibicsIHtcbiAgICAgICAgbW9udGhzOiAn4Kac4Ka+4Kao4KeB4Kef4Ka+4Kaw4Ka/X+Cmq+Cnh+CmrOCnjeCmsOCngeCnn+CmvuCmsOCmv1/gpq7gpr7gprDgp43gpppf4KaP4Kaq4KeN4Kaw4Ka/4KayX+CmruCnh1/gppzgp4Hgpqhf4Kac4KeB4Kay4Ka+4KaHX+CmhuCml+CmuOCnjeCmn1/gprjgp4fgpqrgp43gpp/gp4fgpq7gp43gpqzgprBf4KaF4KaV4KeN4Kaf4KeL4Kas4KawX+CmqOCmreCnh+CmruCnjeCmrOCmsF/gpqHgpr/gprjgp4fgpq7gp43gpqzgprAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CmnOCmvuCmqOCngV/gpqvgp4fgpqzgp43gprDgp4Ff4Kau4Ka+4Kaw4KeN4KaaX+Cmj+CmquCnjeCmsOCmv+Cmsl/gpq7gp4df4Kac4KeB4KaoX+CmnOCngeCmsuCmvuCmh1/gpobgppfgprjgp43gpp9f4Ka44KeH4Kaq4KeN4KafX+CmheCmleCnjeCmn+Cni1/gpqjgpq3gp4df4Kah4Ka/4Ka44KeHJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn4Kaw4Kas4Ka/4Kas4Ka+4KawX+CmuOCni+CmruCmrOCmvuCmsF/gpq7gppngp43gppfgprLgpqzgpr7gprBf4Kas4KeB4Kan4Kas4Ka+4KawX+CmrOCng+CmueCmuOCnjeCmquCmpOCmv+CmrOCmvuCmsF/gprbgp4HgppXgp43gprDgpqzgpr7gprBf4Ka24Kao4Ka/4Kas4Ka+4KawJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4Kaw4Kas4Ka/X+CmuOCni+Cmrl/gpq7gppngp43gppfgprJf4Kas4KeB4KanX+CmrOCng+CmueCmuOCnjeCmquCmpOCmv1/gprbgp4HgppXgp43gprBf4Ka24Kao4Ka/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CmsOCmrOCmv1/gprjgp4vgpq5f4Kau4KaZ4KeN4KaX4KayX+CmrOCngeCmp1/gpqzgp4Pgprlf4Ka24KeB4KaV4KeN4KawX+CmtuCmqOCmvycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3Mg4Ka44Kau4KefJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgprjgpq7gp58nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KaG4KacXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CmhuCml+CmvuCmruCngOCmleCmvuCmsl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+Cml+CmpOCmleCmvuCmsl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KaX4KakXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCmquCmsOCnhycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4KaG4KaX4KeHJyxcbiAgICAgICAgICAgIHM6ICfgppXgp5/gp4fgppUg4Ka44KeH4KaV4KeH4Kao4KeN4KahJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Ka44KeH4KaV4KeH4Kao4KeN4KahJyxcbiAgICAgICAgICAgIG06ICfgpo/gppUg4Kau4Ka/4Kao4Ka/4KafJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4Kau4Ka/4Kao4Ka/4KafJyxcbiAgICAgICAgICAgIGg6ICfgpo/gppUg4KaY4Kao4KeN4Kaf4Ka+JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KaY4Kao4KeN4Kaf4Ka+JyxcbiAgICAgICAgICAgIGQ6ICfgpo/gppUg4Kam4Ka/4KaoJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Kam4Ka/4KaoJyxcbiAgICAgICAgICAgIE06ICfgpo/gppUg4Kau4Ka+4Ka4JyxcbiAgICAgICAgICAgIE1NOiAnJWQg4Kau4Ka+4Ka4JyxcbiAgICAgICAgICAgIHk6ICfgpo/gppUg4Kas4Kab4KawJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Kas4Kab4KawJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Cnp+CnqOCnqeCnquCnq+CnrOCnreCnruCnr+Cnpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CmsOCmvuCmpHzgprjgppXgpr7gprJ84Kam4KeB4Kaq4KeB4KawfOCmrOCmv+CmleCmvuCmsnzgprDgpr7gpqQvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKG1lcmlkaWVtID09PSAn4Kaw4Ka+4KakJyAmJiBob3VyID49IDQpIHx8XG4gICAgICAgICAgICAgICAgKG1lcmlkaWVtID09PSAn4Kam4KeB4Kaq4KeB4KawJyAmJiBob3VyIDwgNSkgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+CmrOCmv+CmleCmvuCmsidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprDgpr7gpqQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmuOCmleCmvuCmsic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kam4KeB4Kaq4KeB4KawJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpqzgpr/gppXgpr7gprInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmsOCmvuCmpCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBibjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUaWJldGFuIFtib11cbi8vISBhdXRob3IgOiBUaHVwdGVuIE4uIENoYWtyaXNoYXIgOiBodHRwczovL2dpdGh1Yi5jb20vdmFqcmFkb2dcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4LyhJyxcbiAgICAgICAgICAgIDI6ICfgvKInLFxuICAgICAgICAgICAgMzogJ+C8oycsXG4gICAgICAgICAgICA0OiAn4LykJyxcbiAgICAgICAgICAgIDU6ICfgvKUnLFxuICAgICAgICAgICAgNjogJ+C8picsXG4gICAgICAgICAgICA3OiAn4LynJyxcbiAgICAgICAgICAgIDg6ICfgvKgnLFxuICAgICAgICAgICAgOTogJ+C8qScsXG4gICAgICAgICAgICAwOiAn4LygJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+C8oSc6ICcxJyxcbiAgICAgICAgICAgICfgvKInOiAnMicsXG4gICAgICAgICAgICAn4LyjJzogJzMnLFxuICAgICAgICAgICAgJ+C8pCc6ICc0JyxcbiAgICAgICAgICAgICfgvKUnOiAnNScsXG4gICAgICAgICAgICAn4LymJzogJzYnLFxuICAgICAgICAgICAgJ+C8pyc6ICc3JyxcbiAgICAgICAgICAgICfgvKgnOiAnOCcsXG4gICAgICAgICAgICAn4LypJzogJzknLFxuICAgICAgICAgICAgJ+C8oCc6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBibyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JvJywge1xuICAgICAgICBtb250aHM6ICfgvZ/gvrPgvIvgvZbgvIvgvZHgvYTgvIvgvZTgvbxf4L2f4L6z4LyL4L2W4LyL4L2C4L2J4L2y4L2m4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9guC9puC9tOC9mOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvZ7gvbLgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2j4L6U4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9keC+suC9tOC9guC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvZHgvbTgvZPgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2i4L6S4L6x4L2R4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9keC9guC9tOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvYXgvbTgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2F4L204LyL4L2C4L2F4L2y4L2C4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9heC9tOC8i+C9guC9ieC9suC9puC8i+C9lCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4L2f4L6z4LyLMV/gvZ/gvrPgvIsyX+C9n+C+s+C8izNf4L2f4L6z4LyLNF/gvZ/gvrPgvIs1X+C9n+C+s+C8izZf4L2f4L6z4LyLN1/gvZ/gvrPgvIs4X+C9n+C+s+C8izlf4L2f4L6z4LyLMTBf4L2f4L6z4LyLMTFf4L2f4L6z4LyLMTInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogL14o4L2f4L6z4LyLXFxkezEsMn0pLyxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn4L2C4L2f4L2g4LyL4L2J4L2y4LyL4L2Y4LyLX+C9guC9n+C9oOC8i+C9n+C+s+C8i+C9luC8i1/gvYLgvZ/gvaDgvIvgvZjgvbLgvYLgvIvgvZHgvZjgvaLgvItf4L2C4L2f4L2g4LyL4L2j4L634L2C4LyL4L2U4LyLX+C9guC9n+C9oOC8i+C9leC9tOC9ouC8i+C9luC9tF/gvYLgvZ/gvaDgvIvgvZTgvIvgvabgvYTgvabgvItf4L2C4L2f4L2g4LyL4L2m4L6k4L264L2T4LyL4L2U4LyLJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgvYngvbLgvIvgvZjgvItf4L2f4L6z4LyL4L2W4LyLX+C9mOC9suC9guC8i+C9keC9mOC9ouC8i1/gvaPgvrfgvYLgvIvgvZTgvItf4L2V4L204L2i4LyL4L2W4L20X+C9lOC8i+C9puC9hOC9puC8i1/gvabgvqTgvbrgvZPgvIvgvZTgvIsnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4L2J4L2yX+C9n+C+s1/gvZjgvbLgvYJf4L2j4L634L2CX+C9leC9tOC9ol/gvabgvYTgvaZf4L2m4L6k4L264L2TJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+C9keC9suC8i+C9ouC9suC9hF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgvabgvYTgvIvgvYngvbLgvZNdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+C9luC9keC9tOC9k+C8i+C9leC+suC9guC8i+C9ouC+l+C9uuC9puC8i+C9mF0sIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4L2B4LyL4L2m4L2EXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgvZbgvZHgvbTgvZPgvIvgvZXgvrLgvYLgvIvgvZjgvZDgvaDgvIvgvZhdIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4L2j4LyLJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgvabgvpTgvZPgvIvgvaMnLFxuICAgICAgICAgICAgczogJ+C9o+C9mOC8i+C9puC9hCcsXG4gICAgICAgICAgICBzczogJyVkIOC9puC+kOC9ouC8i+C9huC8jScsXG4gICAgICAgICAgICBtOiAn4L2m4L6Q4L2i4LyL4L2Y4LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4L2m4L6Q4L2i4LyL4L2YJyxcbiAgICAgICAgICAgIGg6ICfgvYbgvbTgvIvgvZrgvbzgvZHgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgaGg6ICclZCDgvYbgvbTgvIvgvZrgvbzgvZEnLFxuICAgICAgICAgICAgZDogJ+C9ieC9suC9k+C8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICBkZDogJyVkIOC9ieC9suC9k+C8iycsXG4gICAgICAgICAgICBNOiAn4L2f4L6z4LyL4L2W4LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4L2f4L6z4LyL4L2WJyxcbiAgICAgICAgICAgIHk6ICfgvaPgvbzgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgeXk6ICclZCDgvaPgvbwnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4Lyh4Lyi4Lyj4Lyk4Lyl4Lym4Lyn4Lyo4Lyp4LygXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4L2Y4L2a4L2T4LyL4L2Y4L28fOC9nuC9vOC9guC9puC8i+C9gOC9pnzgvYngvbLgvZPgvIvgvYLgvbTgvYR84L2R4L2C4L284L2E4LyL4L2R4L2CfOC9mOC9muC9k+C8i+C9mOC9vC8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobWVyaWRpZW0gPT09ICfgvZjgvZrgvZPgvIvgvZjgvbwnICYmIGhvdXIgPj0gNCkgfHxcbiAgICAgICAgICAgICAgICAobWVyaWRpZW0gPT09ICfgvYngvbLgvZPgvIvgvYLgvbTgvYQnICYmIGhvdXIgPCA1KSB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4L2R4L2C4L284L2E4LyL4L2R4L2CJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9mOC9muC9k+C8i+C9mOC9vCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2e4L284L2C4L2m4LyL4L2A4L2mJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvYngvbLgvZPgvIvgvYLgvbTgvYQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9keC9guC9vOC9hOC8i+C9keC9gic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2Y4L2a4L2T4LyL4L2Y4L28JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJyZXRvbiBbYnJdXG4vLyEgYXV0aG9yIDogSmVhbi1CYXB0aXN0ZSBMZSBEdWlnb3UgOiBodHRwczovL2dpdGh1Yi5jb20vamJsZWR1aWdvdVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aE11dGF0aW9uKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtbTogJ211bnV0ZW5uJyxcbiAgICAgICAgICAgIE1NOiAnbWl6JyxcbiAgICAgICAgICAgIGRkOiAnZGV2ZXpoJyxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIG11dGF0aW9uKGZvcm1hdFtrZXldLCBudW1iZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzcGVjaWFsTXV0YXRpb25Gb3JZZWFycyhudW1iZXIpIHtcbiAgICAgICAgc3dpdGNoIChsYXN0TnVtYmVyKG51bWJlcikpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyBibG9heic7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnIHZsb2F6JztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsYXN0TnVtYmVyKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyID4gOSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3ROdW1iZXIobnVtYmVyICUgMTApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG11dGF0aW9uKHRleHQsIG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gc29mdE11dGF0aW9uKHRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzb2Z0TXV0YXRpb24odGV4dCkge1xuICAgICAgICB2YXIgbXV0YXRpb25UYWJsZSA9IHtcbiAgICAgICAgICAgIG06ICd2JyxcbiAgICAgICAgICAgIGI6ICd2JyxcbiAgICAgICAgICAgIGQ6ICd6JyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG11dGF0aW9uVGFibGVbdGV4dC5jaGFyQXQoMCldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtdXRhdGlvblRhYmxlW3RleHQuY2hhckF0KDApXSArIHRleHQuc3Vic3RyaW5nKDEpO1xuICAgIH1cblxuICAgIHZhciBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZ2VuL2ksXG4gICAgICAgICAgICAvXmNbyrxcXCddaHdlL2ksXG4gICAgICAgICAgICAvXm1ldS9pLFxuICAgICAgICAgICAgL15lYnIvaSxcbiAgICAgICAgICAgIC9ebWFlL2ksXG4gICAgICAgICAgICAvXihtZXp8ZXZlKS9pLFxuICAgICAgICAgICAgL15nb3UvaSxcbiAgICAgICAgICAgIC9eZW9zL2ksXG4gICAgICAgICAgICAvXmd3ZS9pLFxuICAgICAgICAgICAgL15oZXIvaSxcbiAgICAgICAgICAgIC9eZHUvaSxcbiAgICAgICAgICAgIC9ea2VyL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGdlbnZlcnxjW8q8XFwnXWh3ZXZyZXJ8bWV1cnpofGVicmVsfG1hZXxtZXpoZXZlbnxnb3VlcmV8ZW9zdHxnd2VuZ29sb3xoZXJlfGR1fGtlcnp1fGdlbnxjW8q8XFwnXWh3ZXxtZXV8ZWJyfG1hZXxldmV8Z291fGVvc3xnd2V8aGVyfGR1fGtlcikvaSxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXggPVxuICAgICAgICAgICAgL14oZ2VudmVyfGNbyrxcXCddaHdldnJlcnxtZXVyemh8ZWJyZWx8bWFlfG1lemhldmVufGdvdWVyZXxlb3N0fGd3ZW5nb2xvfGhlcmV8ZHV8a2VyenUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXggPVxuICAgICAgICAgICAgL14oZ2VufGNbyrxcXCddaHdlfG1ldXxlYnJ8bWFlfGV2ZXxnb3V8ZW9zfGd3ZXxoZXJ8ZHV8a2VyKS9pLFxuICAgICAgICBmdWxsV2Vla2RheXNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9ec3VsL2ksXG4gICAgICAgICAgICAvXmx1bi9pLFxuICAgICAgICAgICAgL15tZXVyemgvaSxcbiAgICAgICAgICAgIC9ebWVyY1vKvFxcJ11oZXIvaSxcbiAgICAgICAgICAgIC9eeWFvdS9pLFxuICAgICAgICAgICAgL15nd2VuZXIvaSxcbiAgICAgICAgICAgIC9ec2Fkb3JuL2ksXG4gICAgICAgIF0sXG4gICAgICAgIHNob3J0V2Vla2RheXNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eU3VsL2ksXG4gICAgICAgICAgICAvXkx1bi9pLFxuICAgICAgICAgICAgL15NZXUvaSxcbiAgICAgICAgICAgIC9eTWVyL2ksXG4gICAgICAgICAgICAvXllhby9pLFxuICAgICAgICAgICAgL15Hd2UvaSxcbiAgICAgICAgICAgIC9eU2FkL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1pbldlZWtkYXlzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXlN1L2ksXG4gICAgICAgICAgICAvXkx1L2ksXG4gICAgICAgICAgICAvXk1lKFtecl18JCkvaSxcbiAgICAgICAgICAgIC9eTWVyL2ksXG4gICAgICAgICAgICAvXllhL2ksXG4gICAgICAgICAgICAvXkd3L2ksXG4gICAgICAgICAgICAvXlNhL2ksXG4gICAgICAgIF07XG5cbiAgICB2YXIgYnIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdicicsIHtcbiAgICAgICAgbW9udGhzOiAnR2VudmVyX0PKvGh3ZXZyZXJfTWV1cnpoX0VicmVsX01hZV9NZXpoZXZlbl9Hb3VlcmVfRW9zdF9Hd2VuZ29sb19IZXJlX0R1X0tlcnp1Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0dlbl9Dyrxod2VfTWV1X0Vicl9NYWVfRXZlX0dvdV9Fb3NfR3dlX0hlcl9EdV9LZXInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VsX0x1bl9NZXVyemhfTWVyY8q8aGVyX1lhb3VfR3dlbmVyX1NhZG9ybicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bF9MdW5fTWV1X01lcl9ZYW9fR3dlX1NhZCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9MdV9NZV9NZXJfWWFfR3dfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2U6IG1pbldlZWtkYXlzUGFyc2UsXG4gICAgICAgIGZ1bGxXZWVrZGF5c1BhcnNlOiBmdWxsV2Vla2RheXNQYXJzZSxcbiAgICAgICAgc2hvcnRXZWVrZGF5c1BhcnNlOiBzaG9ydFdlZWtkYXlzUGFyc2UsXG4gICAgICAgIG1pbldlZWtkYXlzUGFyc2U6IG1pbldlZWtkYXlzUGFyc2UsXG5cbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6IG1vbnRoc1N0cmljdFJlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OiBtb250aHNTaG9ydFN0cmljdFJlZ2V4LFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbYSB2aXpdIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFthIHZpel0gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFthIHZpel0gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGl6aXYgZGFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbV2FyY8q8aG9hemggZGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbZGFdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbRGVjyrxoIGRhXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3Bhc2V0IGRhXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2EtYmVubiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgyrx6bycsXG4gICAgICAgICAgICBzOiAndW4gbmViZXVkIHNlZ29uZGVubm/DuScsXG4gICAgICAgICAgICBzczogJyVkIGVpbGVubicsXG4gICAgICAgICAgICBtOiAndXIgdnVudXRlbm4nLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbixcbiAgICAgICAgICAgIGg6ICd1biBldXInLFxuICAgICAgICAgICAgaGg6ICclZCBldXInLFxuICAgICAgICAgICAgZDogJ3VuIGRldmV6aCcsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aE11dGF0aW9uLFxuICAgICAgICAgICAgTTogJ3VyIG1peicsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aE11dGF0aW9uLFxuICAgICAgICAgICAgeTogJ3VyIGJsb2F6JyxcbiAgICAgICAgICAgIHl5OiBzcGVjaWFsTXV0YXRpb25Gb3JZZWFycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGHDsXx2ZXQpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IG51bWJlciA9PT0gMSA/ICdhw7EnIDogJ3ZldCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9hLm0ufGcubS4vLCAvLyBnb3VkZSBtZXJlbm4gfCBhLXJhb2sgbWVyZW5uXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuID09PSAnZy5tLic7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gaG91ciA8IDEyID8gJ2EubS4nIDogJ2cubS4nO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJvc25pYW4gW2JzXVxuLy8hIGF1dGhvciA6IE5lZGltIENob2xpY2ggOiBodHRwczovL2dpdGh1Yi5jb20vZnJvbnR5YXJkXG4vLyEgYXV0aG9yIDogUmFzaWQgUmVkemljIDogaHR0cHM6Ly9naXRodWIuY29tL3Jhc2lkcmVcbi8vISBiYXNlZCBvbiAoaHIpIHRyYW5zbGF0aW9uIGJ5IEJvamFuIE1hcmtvdmnEh1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4XG4gICAgICAgICAgICAgICAgICAgID8gJ2plZG5hIG1pbnV0YSdcbiAgICAgICAgICAgICAgICAgICAgOiBpc0Z1dHVyZVxuICAgICAgICAgICAgICAgICAgICAgID8gJ2plZG51IG1pbnV0dSdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdqZWRuZSBtaW51dGUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRhJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2plZGFuIHNhdCcgOiAnamVkYW4gc2F0JztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0YSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2RhbmEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWMnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNhJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBicyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JzJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJ0X2FwcmlsX21hal9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJhcl9va3RvYmFyX25vdmVtYmFyX2RlY2VtYmFyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hai5fanVuLl9qdWwuX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGplbGphX3BvbmVkamVsamFrX3V0b3Jha19zcmlqZWRhX8SNZXR2cnRha19wZXRha19zdWJvdGEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZWQuX3Bvbi5fdXRvLl9zcmkuX8SNZXQuX3BldC5fc3ViLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb191dF9zcl/EjWVfcGVfc3UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmFzIHVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc3V0cmEgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW25lZGplbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3JpamVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2p1xI1lciB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbHVdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsZV0gW3N1Ym90ZV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsaV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmlqZSAlcycsXG4gICAgICAgICAgICBzOiAncGFyIHNla3VuZGknLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICdkYW4nLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06ICdtamVzZWMnLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6ICdnb2RpbnUnLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBicztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDYXRhbGFuIFtjYV1cbi8vISBhdXRob3IgOiBKdWFuIEcuIEh1cnRhZG8gOiBodHRwczovL2dpdGh1Yi5jb20vanVhbmdodXJ0YWRvXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgY2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdjYScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdnZW5lcl9mZWJyZXJfbWFyw6dfYWJyaWxfbWFpZ19qdW55X2p1bGlvbF9hZ29zdF9zZXRlbWJyZV9vY3R1YnJlX25vdmVtYnJlX2Rlc2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogXCJkZSBnZW5lcl9kZSBmZWJyZXJfZGUgbWFyw6dfZCdhYnJpbF9kZSBtYWlnX2RlIGp1bnlfZGUganVsaW9sX2QnYWdvc3RfZGUgc2V0ZW1icmVfZCdvY3R1YnJlX2RlIG5vdmVtYnJlX2RlIGRlc2VtYnJlXCIuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9EW29EXT8oXFxzKStNTU1NLyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnZ2VuLl9mZWJyLl9tYXLDp19hYnIuX21haWdfanVueV9qdWwuX2FnLl9zZXQuX29jdC5fbm92Ll9kZXMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ2RpdW1lbmdlX2RpbGx1bnNfZGltYXJ0c19kaW1lY3Jlc19kaWpvdXNfZGl2ZW5kcmVzX2Rpc3NhYnRlJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkZy5fZGwuX2R0Ll9kYy5fZGouX2R2Ll9kcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGdfZGxfZHRfZGNfZGpfZHZfZHMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBsbDogJ0QgTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFtkZV0gWVlZWSBbYSBsZXNdIEg6bW0nLFxuICAgICAgICAgICAgbGxsOiAnRCBNTU0gWVlZWSwgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gW2RlXSBZWVlZIFthIGxlc10gSDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkIEQgTU1NIFlZWVksIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F2dWkgYSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2RlbcOgIGEgJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnbGVzJyA6ICdsYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYWhpciBhICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbZWxdIGRkZGQgW3Bhc3NhdCBhICcgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpICE9PSAxID8gJ2xlcycgOiAnbGEnKSArXG4gICAgICAgICAgICAgICAgICAgICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IFwiZCdhcXXDrSAlc1wiLFxuICAgICAgICAgICAgcGFzdDogJ2ZhICVzJyxcbiAgICAgICAgICAgIHM6ICd1bnMgc2Vnb25zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vnb25zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0cycsXG4gICAgICAgICAgICBoOiAndW5hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JlcycsXG4gICAgICAgICAgICBkOiAndW4gZGlhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGllcycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzb3MnLFxuICAgICAgICAgICAgeTogJ3VuIGFueScsXG4gICAgICAgICAgICB5eTogJyVkIGFueXMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0ocnxufHR8w6h8YSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPVxuICAgICAgICAgICAgICAgIG51bWJlciA9PT0gMVxuICAgICAgICAgICAgICAgICAgICA/ICdyJ1xuICAgICAgICAgICAgICAgICAgICA6IG51bWJlciA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgID8gJ24nXG4gICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3InXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bWJlciA9PT0gNFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICd0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICfDqCc7XG4gICAgICAgICAgICBpZiAocGVyaW9kID09PSAndycgfHwgcGVyaW9kID09PSAnVycpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAnYSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ3plY2ggW2NzXVxuLy8hIGF1dGhvciA6IHBldHJiZWxhIDogaHR0cHM6Ly9naXRodWIuY29tL3BldHJiZWxhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0ge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnbGVkZW5fw7pub3JfYsWZZXplbl9kdWJlbl9rdsSbdGVuX8SNZXJ2ZW5fxI1lcnZlbmVjX3NycGVuX3rDocWZw61fxZnDrWplbl9saXN0b3BhZF9wcm9zaW5lYycuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6ICdsZWRuYV/Dum5vcmFfYsWZZXpuYV9kdWJuYV9rdsSbdG5hX8SNZXJ2bmFfxI1lcnZlbmNlX3NycG5hX3rDocWZw61fxZnDrWpuYV9saXN0b3BhZHVfcHJvc2luY2UnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvREQ/W28uXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK01NTU0vLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydCA9ICdsZWRfw7pub19ixZllX2R1Yl9rdsSbX8SNdm5fxI12Y19zcnBfesOhxZlfxZnDrWpfbGlzX3Bybycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmxlZC9pLFxuICAgICAgICAgICAgL17Dum5vL2ksXG4gICAgICAgICAgICAvXmLFmWUvaSxcbiAgICAgICAgICAgIC9eZHViL2ksXG4gICAgICAgICAgICAvXmt2xJsvaSxcbiAgICAgICAgICAgIC9eKMSNdm58xI1lcnZlbiR8xI1lcnZuYSkvaSxcbiAgICAgICAgICAgIC9eKMSNdmN8xI1lcnZlbmVjfMSNZXJ2ZW5jZSkvaSxcbiAgICAgICAgICAgIC9ec3JwL2ksXG4gICAgICAgICAgICAvXnrDocWZL2ksXG4gICAgICAgICAgICAvXsWZw61qL2ksXG4gICAgICAgICAgICAvXmxpcy9pLFxuICAgICAgICAgICAgL15wcm8vaSxcbiAgICAgICAgXSxcbiAgICAgICAgLy8gTk9URTogJ8SNZXJ2ZW4nIGlzIHN1YnN0cmluZyBvZiAnxI1lcnZlbmVjJzsgdGhlcmVmb3JlICfEjWVydmVuZWMnIG11c3QgcHJlY2VkZSAnxI1lcnZlbicgaW4gdGhlIHJlZ2V4IHRvIGJlIGZ1bGx5IG1hdGNoZWQuXG4gICAgICAgIC8vIE90aGVyd2lzZSBwYXJzZXIgbWF0Y2hlcyAnMS4gxI1lcnZlbmVjJyBhcyAnMS4gxI1lcnZlbicgKyAnZWMnLlxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihsZWRlbnzDum5vcnxixZllemVufGR1YmVufGt2xJt0ZW58xI1lcnZlbmVjfMSNZXJ2ZW5jZXzEjWVydmVufMSNZXJ2bmF8c3JwZW58esOhxZnDrXzFmcOtamVufGxpc3RvcGFkfHByb3NpbmVjfGxlZHzDum5vfGLFmWV8ZHVifGt2xJt8xI12bnzEjXZjfHNycHx6w6HFmXzFmcOtanxsaXN8cHJvKS9pO1xuXG4gICAgZnVuY3Rpb24gcGx1cmFsKG4pIHtcbiAgICAgICAgcmV0dXJuIG4gPiAxICYmIG4gPCA1ICYmIH5+KG4gLyAxMCkgIT09IDE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOiAvLyBhIGZldyBzZWNvbmRzIC8gaW4gYSBmZXcgc2Vjb25kcyAvIGEgZmV3IHNlY29uZHMgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAncMOhciBzZWt1bmQnIDogJ3DDoXIgc2VrdW5kYW1pJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzogLy8gOSBzZWNvbmRzIC8gaW4gOSBzZWNvbmRzIC8gOSBzZWNvbmRzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnc2VrdW5keScgOiAnc2VrdW5kJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdzZWt1bmRhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ20nOiAvLyBhIG1pbnV0ZSAvIGluIGEgbWludXRlIC8gYSBtaW51dGUgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnbWludXRhJyA6IGlzRnV0dXJlID8gJ21pbnV0dScgOiAnbWludXRvdSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6IC8vIDkgbWludXRlcyAvIGluIDkgbWludXRlcyAvIDkgbWludXRlcyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21pbnV0eScgOiAnbWludXQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ21pbnV0YW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdoJzogLy8gYW4gaG91ciAvIGluIGFuIGhvdXIgLyBhbiBob3VyIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2hvZGluYScgOiBpc0Z1dHVyZSA/ICdob2RpbnUnIDogJ2hvZGlub3UnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOiAvLyA5IGhvdXJzIC8gaW4gOSBob3VycyAvIDkgaG91cnMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdob2RpbnknIDogJ2hvZGluJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdob2RpbmFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZCc6IC8vIGEgZGF5IC8gaW4gYSBkYXkgLyBhIGRheSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkZW4nIDogJ2RuZW0nO1xuICAgICAgICAgICAgY2FzZSAnZGQnOiAvLyA5IGRheXMgLyBpbiA5IGRheXMgLyA5IGRheXMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdkbnknIDogJ2Ruw60nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2RueSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnTSc6IC8vIGEgbW9udGggLyBpbiBhIG1vbnRoIC8gYSBtb250aCBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtxJtzw61jJyA6ICdtxJtzw61jZW0nO1xuICAgICAgICAgICAgY2FzZSAnTU0nOiAvLyA5IG1vbnRocyAvIGluIDkgbW9udGhzIC8gOSBtb250aHMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtxJtzw61jZScgOiAnbcSbc8OtY8WvJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtxJtzw61jaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAneSc6IC8vIGEgeWVhciAvIGluIGEgeWVhciAvIGEgeWVhciBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdyb2snIDogJ3Jva2VtJztcbiAgICAgICAgICAgIGNhc2UgJ3l5JzogLy8gOSB5ZWFycyAvIGluIDkgeWVhcnMgLyA5IHllYXJzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAncm9reScgOiAnbGV0Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdsZXR5JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY3MgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdjcycsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHNTaG9ydCxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgLy8gTk9URTogJ8SNZXJ2ZW4nIGlzIHN1YnN0cmluZyBvZiAnxI1lcnZlbmVjJzsgdGhlcmVmb3JlICfEjWVydmVuZWMnIG11c3QgcHJlY2VkZSAnxI1lcnZlbicgaW4gdGhlIHJlZ2V4IHRvIGJlIGZ1bGx5IG1hdGNoZWQuXG4gICAgICAgIC8vIE90aGVyd2lzZSBwYXJzZXIgbWF0Y2hlcyAnMS4gxI1lcnZlbmVjJyBhcyAnMS4gxI1lcnZlbicgKyAnZWMnLlxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGxlZGVufGxlZG5hfMO6bm9yYXzDum5vcnxixZllemVufGLFmWV6bmF8ZHViZW58ZHVibmF8a3bEm3RlbnxrdsSbdG5hfMSNZXJ2ZW5lY3zEjWVydmVuY2V8xI1lcnZlbnzEjWVydm5hfHNycGVufHNycG5hfHrDocWZw618xZnDrWplbnzFmcOtam5hfGxpc3RvcGFkdXxsaXN0b3BhZHxwcm9zaW5lY3xwcm9zaW5jZSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGxlZHzDum5vfGLFmWV8ZHVifGt2xJt8xI12bnzEjXZjfHNycHx6w6HFmXzFmcOtanxsaXN8cHJvKS9pLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZMSbbGVfcG9uZMSbbMOtX8O6dGVyw71fc3TFmWVkYV/EjXR2cnRla19ww6F0ZWtfc29ib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVfcG9fw7p0X3N0X8SNdF9ww6Ffc28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fw7p0X3N0X8SNdF9ww6Ffc28nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBsOiAnRC4gTS4gWVlZWScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RuZXMgdl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1t6w610cmEgdl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBuZWTEm2xpIHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBkZGRkIFt2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZlIHN0xZllZHUgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2ZSDEjXR2cnRlayB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgcMOhdGVrIHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBzb2JvdHUgdl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW3bEjWVyYSB2XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bG91IG5lZMSbbGkgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw6ldIGRkZGQgW3ZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWxvdSBzdMWZZWR1IHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO9XSBkZGRkIFt2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsb3Ugc29ib3R1IHZdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAncMWZZWQgJXMnLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENodXZhc2ggW2N2XVxuLy8hIGF1dGhvciA6IEFuYXRvbHkgTWlyb25vdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taXJvbnRvbGlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBjdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2N2Jywge1xuICAgICAgICBtb250aHM6ICfQutOR0YDQu9Cw0Ydf0L3QsNGA05HRgV/Qv9GD0Yhf0LDQutCwX9C80LDQuV/Sq9OX0YDRgtC80LVf0YPRgtORX9Kr0YPRgNC70LBf0LDQstOR0L1f0Y7Qv9CwX9GH07PQul/RgNCw0YjRgtCw0LInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0LrTkdGAX9C90LDRgF/Qv9GD0Yhf0LDQutCwX9C80LDQuV/Sq9OX0YBf0YPRgtORX9Kr0YPRgF/QsNCy0L1f0Y7Qv9CwX9GH07PQul/RgNCw0YgnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ9Cy0YvRgNGB0LDRgNC90LjQutGD0L1f0YLRg9C90YLQuNC60YPQvV/Ri9GC0LvQsNGA0LjQutGD0L1f0Y7QvdC60YPQvV/QutOX0qvQvdC10YDQvdC40LrRg9C9X9GN0YDQvdC10LrRg9C9X9GI05HQvNCw0YLQutGD0L0nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9Cy0YvRgF/RgtGD0L1f0YvRgtC7X9GO0L1f0LrTl9KrX9GN0YDQvV/RiNOR0LwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0LLRgF/RgtC9X9GL0YJf0Y7QvV/QutKrX9GN0YBf0YjQvCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELU1NLVlZWVknLFxuICAgICAgICAgICAgTEw6ICdZWVlZIFvSq9GD0LvRhdC4XSBNTU1NIFvRg9C505HRhdOX0L1dIERbLdC805fRiNOXXScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZIFvSq9GD0LvRhdC4XSBNTU1NIFvRg9C505HRhdOX0L1dIERbLdC805fRiNOXXSwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIFlZWVkgW9Kr0YPQu9GF0LhdIE1NTU0gW9GD0LnTkdGF05fQvV0gRFst0LzTl9GI05ddLCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9Cf0LDRj9C9XSBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0KvRgNCw0L1dIExUIFvRgdC10YXQtdGC0YDQtV0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vTltC90LXRgF0gTFQgW9GB0LXRhdC10YLRgNC1XScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vSqtC40YLQtdGBXSBkZGRkIExUIFvRgdC10YXQtdGC0YDQtV0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb0JjRgNGC0L3Tl10gZGRkZCBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBmdW5jdGlvbiAob3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGFmZml4ID0gL9GB0LXRhdC10YIkL2kuZXhlYyhvdXRwdXQpXG4gICAgICAgICAgICAgICAgICAgID8gJ9GA0LXQvSdcbiAgICAgICAgICAgICAgICAgICAgOiAv0qvRg9C7JC9pLmV4ZWMob3V0cHV0KVxuICAgICAgICAgICAgICAgICAgICAgID8gJ9GC0LDQvSdcbiAgICAgICAgICAgICAgICAgICAgICA6ICfRgNCw0L0nO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBhZmZpeDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXN0OiAnJXMg0LrQsNGP0LvQu9CwJyxcbiAgICAgICAgICAgIHM6ICfQv9OX0YAt0LjQuiDSq9C10LrQutGD0L3RgicsXG4gICAgICAgICAgICBzczogJyVkINKr0LXQutC60YPQvdGCJyxcbiAgICAgICAgICAgIG06ICfQv9OX0YAg0LzQuNC90YPRgicsXG4gICAgICAgICAgICBtbTogJyVkINC80LjQvdGD0YInLFxuICAgICAgICAgICAgaDogJ9C/05fRgCDRgdC10YXQtdGCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YHQtdGF0LXRgicsXG4gICAgICAgICAgICBkOiAn0L/Tl9GAINC60YPQvScsXG4gICAgICAgICAgICBkZDogJyVkINC60YPQvScsXG4gICAgICAgICAgICBNOiAn0L/Tl9GAINGD0LnTkdGFJyxcbiAgICAgICAgICAgIE1NOiAnJWQg0YPQudOR0YUnLFxuICAgICAgICAgICAgeTogJ9C/05fRgCDSq9GD0LsnLFxuICAgICAgICAgICAgeXk6ICclZCDSq9GD0LsnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0t0LzTl9GILyxcbiAgICAgICAgb3JkaW5hbDogJyVkLdC805fRiCcsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjdjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBXZWxzaCBbY3ldXG4vLyEgYXV0aG9yIDogUm9iZXJ0IEFsbGVuIDogaHR0cHM6Ly9naXRodWIuY29tL3JvYmdhbGxlblxuLy8hIGF1dGhvciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yeWFuZ3JlYXZlc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGN5ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnY3knLCB7XG4gICAgICAgIG1vbnRoczogJ0lvbmF3cl9DaHdlZnJvcl9NYXdydGhfRWJyaWxsX01haV9NZWhlZmluX0dvcmZmZW5uYWZfQXdzdF9NZWRpX0h5ZHJlZl9UYWNod2VkZF9SaGFnZnlyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0lvbl9DaHdlX01hd19FYnJfTWFpX01laF9Hb3JfQXdzX01lZF9IeWRfVGFjaF9SaGFnJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdEeWRkIFN1bF9EeWRkIExsdW5fRHlkZCBNYXdydGhfRHlkZCBNZXJjaGVyX0R5ZGQgSWF1X0R5ZGQgR3dlbmVyX0R5ZGQgU2Fkd3JuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdWxfTGx1bl9NYXdfTWVyX0lhdV9Hd2VfU2FkJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X0xsX01hX01lX0lhX0d3X1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIC8vIHRpbWUgZm9ybWF0cyBhcmUgdGhlIHNhbWUgYXMgZW4tZ2JcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIZWRkaXcgYW1dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbWWZvcnkgYW1dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYW1dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbRGRvZSBhbV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtkaXdldGhhZiBhbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdtZXduICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB5biDDtGwnLFxuICAgICAgICAgICAgczogJ3ljaHlkaWcgZWlsaWFkYXUnLFxuICAgICAgICAgICAgc3M6ICclZCBlaWxpYWQnLFxuICAgICAgICAgICAgbTogJ211bnVkJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbXVudWQnLFxuICAgICAgICAgICAgaDogJ2F3cicsXG4gICAgICAgICAgICBoaDogJyVkIGF3cicsXG4gICAgICAgICAgICBkOiAnZGl3cm5vZCcsXG4gICAgICAgICAgICBkZDogJyVkIGRpd3Jub2QnLFxuICAgICAgICAgICAgTTogJ21pcycsXG4gICAgICAgICAgICBNTTogJyVkIG1pcycsXG4gICAgICAgICAgICB5OiAnYmx3eWRkeW4nLFxuICAgICAgICAgICAgeXk6ICclZCBmbHluZWRkJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGZlZHxhaW58YWZ8aWx8eWRkfGVkfGVnKS8sXG4gICAgICAgIC8vIHRyYWRpdGlvbmFsIG9yZGluYWwgbnVtYmVycyBhYm92ZSAzMSBhcmUgbm90IGNvbW1vbmx5IHVzZWQgaW4gY29sbG9xdWlhbCBXZWxzaFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlcixcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJyxcbiAgICAgICAgICAgICAgICBsb29rdXAgPSBbXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAnYWYnLFxuICAgICAgICAgICAgICAgICAgICAnaWwnLFxuICAgICAgICAgICAgICAgICAgICAneWRkJyxcbiAgICAgICAgICAgICAgICAgICAgJ3lkZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZCcsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsIC8vIDFhZiB0byAxMGZlZFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJywgLy8gMTFlZyB0byAyMGZlZFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoYiA+IDIwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGIgPT09IDQwIHx8IGIgPT09IDUwIHx8IGIgPT09IDYwIHx8IGIgPT09IDgwIHx8IGIgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnZmVkJzsgLy8gbm90IDMwYWluLCA3MGFpbiBvciA5MGFpblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICdhaW4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYiA+IDApIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBsb29rdXBbYl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3k7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRGFuaXNoIFtkYV1cbi8vISBhdXRob3IgOiBVbHJpayBOaWVsc2VuIDogaHR0cHM6Ly9naXRodWIuY29tL21yYmFzZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGRhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZGEnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnRzX2FwcmlsX21hal9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFyX2Fwcl9tYWpfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ3PDuG5kYWdfbWFuZGFnX3RpcnNkYWdfb25zZGFnX3RvcnNkYWdfZnJlZGFnX2zDuHJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzw7huX21hbl90aXJfb25zX3Rvcl9mcmVfbMO4cicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzw7hfbWFfdGlfb25fdG9fZnJfbMO4Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgW2QuXSBELiBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tpIGRhZyBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbaSBtb3JnZW4ga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ3DDpSBkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaSBnw6VyIGtsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbaV0gZGRkZFtzIGtsLl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgc2lkZW4nLFxuICAgICAgICAgICAgczogJ2bDpSBzZWt1bmRlcicsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZGVyJyxcbiAgICAgICAgICAgIG06ICdldCBtaW51dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0dGVyJyxcbiAgICAgICAgICAgIGg6ICdlbiB0aW1lJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGltZXInLFxuICAgICAgICAgICAgZDogJ2VuIGRhZycsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2UnLFxuICAgICAgICAgICAgTTogJ2VuIG3DpW5lZCcsXG4gICAgICAgICAgICBNTTogJyVkIG3DpW5lZGVyJyxcbiAgICAgICAgICAgIHk6ICdldCDDpXInLFxuICAgICAgICAgICAgeXk6ICclZCDDpXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdlcm1hbiAoQXVzdHJpYSkgW2RlLWF0XVxuLy8hIGF1dGhvciA6IGxsdWNocyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9sbHVjaHNcbi8vISBhdXRob3I6IE1lbmVsaW9uIEVsZW5zw7psZTogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcbi8vISBhdXRob3IgOiBNYXJ0aW4gR3JvbGxlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9NYWRNR1xuLy8hIGF1dGhvciA6IE1pa29sYWogRGFkZWxhIDogaHR0cHM6Ly9naXRodWIuY29tL21pazAxYWpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtOiBbJ2VpbmUgTWludXRlJywgJ2VpbmVyIE1pbnV0ZSddLFxuICAgICAgICAgICAgaDogWydlaW5lIFN0dW5kZScsICdlaW5lciBTdHVuZGUnXSxcbiAgICAgICAgICAgIGQ6IFsnZWluIFRhZycsICdlaW5lbSBUYWcnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyBUYWdlJywgbnVtYmVyICsgJyBUYWdlbiddLFxuICAgICAgICAgICAgdzogWydlaW5lIFdvY2hlJywgJ2VpbmVyIFdvY2hlJ10sXG4gICAgICAgICAgICBNOiBbJ2VpbiBNb25hdCcsICdlaW5lbSBNb25hdCddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIE1vbmF0ZScsIG51bWJlciArICcgTW9uYXRlbiddLFxuICAgICAgICAgICAgeTogWydlaW4gSmFocicsICdlaW5lbSBKYWhyJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgSmFocmUnLCBudW1iZXIgKyAnIEphaHJlbiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGRlQXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkZS1hdCcsIHtcbiAgICAgICAgbW9udGhzOiAnSsOkbm5lcl9GZWJydWFyX03DpHJ6X0FwcmlsX01haV9KdW5pX0p1bGlfQXVndXN0X1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0RlemVtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKw6RuLl9GZWIuX03DpHJ6X0Fwci5fTWFpX0p1bmlfSnVsaV9BdWcuX1NlcC5fT2t0Ll9Ob3YuX0Rlei4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1Nvbm50YWdfTW9udGFnX0RpZW5zdGFnX01pdHR3b2NoX0Rvbm5lcnN0YWdfRnJlaXRhZ19TYW1zdGFnJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTby5fTW8uX0RpLl9NaS5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toZXV0ZSB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dlc3Rlcm4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2xldHp0ZW5dIGRkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzOiAnZWluIHBhYXIgU2VrdW5kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBTZWt1bmRlbicsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06ICclZCBNaW51dGVuJyxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgdzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHd3OiAnJWQgV29jaGVuJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkZUF0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdlcm1hbiAoU3dpdHplcmxhbmQpIFtkZS1jaF1cbi8vISBhdXRob3IgOiBzc2NodWVsbGVyIDogaHR0cHM6Ly9naXRodWIuY29tL3NzY2h1ZWxsZXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtOiBbJ2VpbmUgTWludXRlJywgJ2VpbmVyIE1pbnV0ZSddLFxuICAgICAgICAgICAgaDogWydlaW5lIFN0dW5kZScsICdlaW5lciBTdHVuZGUnXSxcbiAgICAgICAgICAgIGQ6IFsnZWluIFRhZycsICdlaW5lbSBUYWcnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyBUYWdlJywgbnVtYmVyICsgJyBUYWdlbiddLFxuICAgICAgICAgICAgdzogWydlaW5lIFdvY2hlJywgJ2VpbmVyIFdvY2hlJ10sXG4gICAgICAgICAgICBNOiBbJ2VpbiBNb25hdCcsICdlaW5lbSBNb25hdCddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIE1vbmF0ZScsIG51bWJlciArICcgTW9uYXRlbiddLFxuICAgICAgICAgICAgeTogWydlaW4gSmFocicsICdlaW5lbSBKYWhyJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgSmFocmUnLCBudW1iZXIgKyAnIEphaHJlbiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGRlQ2ggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkZS1jaCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyX0ZlYnJ1YXJfTcOkcnpfQXByaWxfTWFpX0p1bmlfSnVsaV9BdWd1c3RfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGV6ZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0phbi5fRmViLl9Nw6Ryel9BcHIuX01haV9KdW5pX0p1bGlfQXVnLl9TZXAuX09rdC5fTm92Ll9EZXouJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdTb25udGFnX01vbnRhZ19EaWVuc3RhZ19NaXR0d29jaF9Eb25uZXJzdGFnX0ZyZWl0YWdfU2Ftc3RhZycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toZXV0ZSB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dlc3Rlcm4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2xldHp0ZW5dIGRkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzOiAnZWluIHBhYXIgU2VrdW5kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBTZWt1bmRlbicsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06ICclZCBNaW51dGVuJyxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgdzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHd3OiAnJWQgV29jaGVuJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkZUNoO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdlcm1hbiBbZGVdXG4vLyEgYXV0aG9yIDogbGx1Y2hzIDogaHR0cHM6Ly9naXRodWIuY29tL2xsdWNoc1xuLy8hIGF1dGhvcjogTWVuZWxpb24gRWxlbnPDumxlOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuLy8hIGF1dGhvciA6IE1pa29sYWogRGFkZWxhIDogaHR0cHM6Ly9naXRodWIuY29tL21pazAxYWpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtOiBbJ2VpbmUgTWludXRlJywgJ2VpbmVyIE1pbnV0ZSddLFxuICAgICAgICAgICAgaDogWydlaW5lIFN0dW5kZScsICdlaW5lciBTdHVuZGUnXSxcbiAgICAgICAgICAgIGQ6IFsnZWluIFRhZycsICdlaW5lbSBUYWcnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyBUYWdlJywgbnVtYmVyICsgJyBUYWdlbiddLFxuICAgICAgICAgICAgdzogWydlaW5lIFdvY2hlJywgJ2VpbmVyIFdvY2hlJ10sXG4gICAgICAgICAgICBNOiBbJ2VpbiBNb25hdCcsICdlaW5lbSBNb25hdCddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIE1vbmF0ZScsIG51bWJlciArICcgTW9uYXRlbiddLFxuICAgICAgICAgICAgeTogWydlaW4gSmFocicsICdlaW5lbSBKYWhyJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgSmFocmUnLCBudW1iZXIgKyAnIEphaHJlbiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGRlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZGUnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcl9GZWJydWFyX03DpHJ6X0FwcmlsX01haV9KdW5pX0p1bGlfQXVndXN0X1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0RlemVtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKYW4uX0ZlYi5fTcOkcnpfQXByLl9NYWlfSnVuaV9KdWxpX0F1Zy5fU2VwLl9Pa3QuX05vdi5fRGV6Licuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnU29ubnRhZ19Nb250YWdfRGllbnN0YWdfTWl0dHdvY2hfRG9ubmVyc3RhZ19GcmVpdGFnX1NhbXN0YWcnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1NvLl9Nby5fRGkuX01pLl9Eby5fRnIuX1NhLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTb19Nb19EaV9NaV9Eb19Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2hldXRlIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb3JnZW4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZ2VzdGVybiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbbGV0enRlbl0gZGRkZCBbdW1dIExUIFtVaHJdJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAndm9yICVzJyxcbiAgICAgICAgICAgIHM6ICdlaW4gcGFhciBTZWt1bmRlbicsXG4gICAgICAgICAgICBzczogJyVkIFNla3VuZGVuJyxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogJyVkIE1pbnV0ZW4nLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiAnJWQgU3R1bmRlbicsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgd3c6ICclZCBXb2NoZW4nLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRlO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hbGRpdmlhbiBbZHZdXG4vLyEgYXV0aG9yIDogSmF3aXNoIEhhbWVlZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYXdpc2hcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICAgICAn3pberN6C3qreh96m3oPeqScsXG4gICAgICAgICAgICAn3orerN6E3rDeg96q3ofept6D3qknLFxuICAgICAgICAgICAgJ96J3qfeg96o3pfeqicsXG4gICAgICAgICAgICAn3oferd6V3rDeg96p3o3eqicsXG4gICAgICAgICAgICAn3onerScsXG4gICAgICAgICAgICAn3pbeq96C3rAnLFxuICAgICAgICAgICAgJ96W3qrejd6m3ofeqCcsXG4gICAgICAgICAgICAn3ofer96O3qbekN6w3pPeqicsXG4gICAgICAgICAgICAn3pDerN6V3rDek96s3onesN6E3qbeg96qJyxcbiAgICAgICAgICAgICfeh96u3obesN6T3q/ehN6m3oPeqicsXG4gICAgICAgICAgICAn3oLert6I3qzeid6w3oTept6D3qonLFxuICAgICAgICAgICAgJ96R3qjekN6s3onesN6E3qbeg96qJyxcbiAgICAgICAgXSxcbiAgICAgICAgd2Vla2RheXMgPSBbXG4gICAgICAgICAgICAn3ofep96L3qjeh96w3ozepicsXG4gICAgICAgICAgICAn3oDer96J3qYnLFxuICAgICAgICAgICAgJ96H3qbegt6w3o7ep96D3qYnLFxuICAgICAgICAgICAgJ96E3qrei96mJyxcbiAgICAgICAgICAgICfehN6q3oPep96Q3rDeit6m3ozeqCcsXG4gICAgICAgICAgICAn3oDeqt6G3qreg96qJyxcbiAgICAgICAgICAgICfegN6u3oLeqN6A3qjeg96qJyxcbiAgICAgICAgXTtcblxuICAgIHZhciBkdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2R2Jywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6IHdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNNaW46ICfeh96n3oveqF/egN6v3onepl/eh96m3oLesF/ehN6q3ovepl/ehN6q3oPep1/egN6q3obeql/egN6u3oLeqCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QvTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv3onehnzeid6KLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ96J3oonID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ96J3oYnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ96J3oonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1veid6o3ofept6L3qpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb3onep96L3qbeid6nXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1veh96o3ofesN6U3qxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW96K3qfeh96o3ozeqt6I3qhdIGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfejN6s3oPerd6O3qbeh96oICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfeht6q3oPeqN6C3rAgJXMnLFxuICAgICAgICAgICAgczogJ96Q3qjeht6q3oLesN6M3qreht6u3oXerN6H3rAnLFxuICAgICAgICAgICAgc3M6ICdkJSDekN6o3obeqt6C3rDejN6qJyxcbiAgICAgICAgICAgIG06ICfeid6o3oLeqN6T3qzeh96wJyxcbiAgICAgICAgICAgIG1tOiAn3oneqN6C3qjek96qICVkJyxcbiAgICAgICAgICAgIGg6ICfejt6m3pHeqN6H3qjeg96s3ofesCcsXG4gICAgICAgICAgICBoaDogJ96O3qbekd6o3ofeqN6D3qogJWQnLFxuICAgICAgICAgICAgZDogJ96L3qreiN6m3oDerN6H3rAnLFxuICAgICAgICAgICAgZGQ6ICfei96q3ojept6Q3rAgJWQnLFxuICAgICAgICAgICAgTTogJ96J3qbegN6s3ofesCcsXG4gICAgICAgICAgICBNTTogJ96J3qbekN6wICVkJyxcbiAgICAgICAgICAgIHk6ICfeh96m3oDept6D3qzeh96wJyxcbiAgICAgICAgICAgIHl5OiAn3ofept6A3qbeg96qICVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDcsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkdjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHcmVlayBbZWxdXG4vLyEgYXV0aG9yIDogQWdnZWxvcyBLYXJhbGlhcyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZWhpZWxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0eXBlb2YgRnVuY3Rpb24gIT09ICd1bmRlZmluZWQnICYmIGlucHV0IGluc3RhbmNlb2YgRnVuY3Rpb24pIHx8XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBGdW5jdGlvbl0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIGVsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZWwnLCB7XG4gICAgICAgIG1vbnRoc05vbWluYXRpdmVFbDpcbiAgICAgICAgICAgICfOmc6xzr3Ov8+FzqzPgc65zr/Pgl/Ops61zrLPgc6/z4XOrM+BzrnOv8+CX86czqzPgc+EzrnOv8+CX86Rz4DPgc6vzrvOuc6/z4JfzpzOrM65zr/Pgl/Omc6/z43Ovc65zr/Pgl/Omc6/z43Ou865zr/Pgl/Okc+NzrPOv8+Fz4PPhM6/z4JfzqPOtc+Az4TOrc68zrLPgc65zr/Pgl/On866z4TPjs6yz4HOuc6/z4Jfzp3Ov86tzrzOss+BzrnOv8+CX86UzrXOus6tzrzOss+BzrnOv8+CJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc0dlbml0aXZlRWw6XG4gICAgICAgICAgICAnzpnOsc69zr/Phc6xz4HOr86/z4VfzqbOtc6yz4HOv8+FzrHPgc6vzr/PhV/OnM6xz4HPhM6vzr/PhV/Okc+Az4HOuc67zq/Ov8+FX86czrHOkM6/z4VfzpnOv8+Fzr3Or86/z4VfzpnOv8+FzrvOr86/z4VfzpHPhc6zzr/Pjc+Dz4TOv8+FX86jzrXPgM+EzrXOvM6yz4HOr86/z4Vfzp/Ous+Ez4nOss+Bzq/Ov8+FX86dzr/Otc68zrLPgc6vzr/PhV/OlM61zrrOtc68zrLPgc6vzr/PhScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHM6IGZ1bmN0aW9uIChtb21lbnRUb0Zvcm1hdCwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudFRvRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc05vbWluYXRpdmVFbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdHlwZW9mIGZvcm1hdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAvRC8udGVzdChmb3JtYXQuc3Vic3RyaW5nKDAsIGZvcm1hdC5pbmRleE9mKCdNTU1NJykpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBkYXkgbnVtYmVyIGJlZm9yZSAnTU1NTSdcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzR2VuaXRpdmVFbFttb21lbnRUb0Zvcm1hdC5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc05vbWluYXRpdmVFbFttb21lbnRUb0Zvcm1hdC5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfOmc6xzr1fzqbOtc6yX86czrHPgV/Okc+Az4FfzpzOsc+KX86Zzr/Phc69X86Zzr/Phc67X86Rz4XOs1/Oo861z4Bfzp/Ous+EX86dzr/OtV/OlM61zronLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnzprPhc+BzrnOsc66zq5fzpTOtc+Fz4TOrc+BzrFfzqTPgc6vz4TOt1/OpM61z4TOrM+Bz4TOt1/OoM6tzrzPgM+EzrdfzqDOsc+BzrHPg866zrXPhc6uX86jzqzOss6yzrHPhM6/Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnzprPhc+BX86UzrXPhV/OpM+BzrlfzqTOtc+EX86gzrXOvF/OoM6xz4FfzqPOsc6yJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ86az4VfzpTOtV/OpM+BX86kzrVfzqDOtV/OoM6xX86jzrEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnzrzOvCcgOiAnzpzOnCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ8+AzrwnIDogJ86gzpwnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKVswXSA9PT0gJ868JztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL1vOoM6cXVxcLj/OnD9cXC4/L2ksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyRWw6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbzqPOrs68zrXPgc6xIHt9XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW86Rz43Pgc65zr8ge31dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbe31dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbzqfOuM61z4Ige31dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW8+Ezr8gz4DPgc6/zrfOs86/z43OvM61zr3Ov10gZGRkZCBbe31dIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW8+EzrfOvSDPgM+Bzr/Ot86zzr/Pjc68zrXOvc63XSBkZGRkIFt7fV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjogZnVuY3Rpb24gKGtleSwgbW9tKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJFbFtrZXldLFxuICAgICAgICAgICAgICAgIGhvdXJzID0gbW9tICYmIG1vbS5ob3VycygpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24ob3V0cHV0KSkge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5hcHBseShtb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dC5yZXBsYWNlKCd7fScsIGhvdXJzICUgMTIgPT09IDEgPyAnz4PPhM63JyA6ICfPg8+EzrnPgicpO1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ8+DzrUgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIM+Az4HOuc69JyxcbiAgICAgICAgICAgIHM6ICfOu86vzrPOsSDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEnLFxuICAgICAgICAgICAgc3M6ICclZCDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEnLFxuICAgICAgICAgICAgbTogJ86tzr3OsSDOu861z4DPhM+MJyxcbiAgICAgICAgICAgIG1tOiAnJWQgzrvOtc+Az4TOrCcsXG4gICAgICAgICAgICBoOiAnzrzOr86xIM+Oz4HOsScsXG4gICAgICAgICAgICBoaDogJyVkIM+Oz4HOtc+CJyxcbiAgICAgICAgICAgIGQ6ICfOvM6vzrEgzrzOrc+BzrEnLFxuICAgICAgICAgICAgZGQ6ICclZCDOvM6tz4HOtc+CJyxcbiAgICAgICAgICAgIE06ICfOrc69zrHPgiDOvM6uzr3Osc+CJyxcbiAgICAgICAgICAgIE1NOiAnJWQgzrzOrs69zrXPgicsXG4gICAgICAgICAgICB5OiAnzq3Ovc6xz4Igz4fPgc+Mzr3Ov8+CJyxcbiAgICAgICAgICAgIHl5OiAnJWQgz4fPgc+Mzr3Ouc6xJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9zrcvLFxuICAgICAgICBvcmRpbmFsOiAnJWTOtycsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDRzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChBdXN0cmFsaWEpIFtlbi1hdV1cbi8vISBhdXRob3IgOiBKYXJlZCBNb3JzZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYXJjb2FsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5BdSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWF1Jywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbkF1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKENhbmFkYSkgW2VuLWNhXVxuLy8hIGF1dGhvciA6IEpvbmF0aGFuIEFib3VyYmloIDogaHR0cHM6Ly9naXRodWIuY29tL2pvbmJjYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuQ2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1jYScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuQ2E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoVW5pdGVkIEtpbmdkb20pIFtlbi1nYl1cbi8vISBhdXRob3IgOiBDaHJpcyBHZWRyaW0gOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXNnZWRyaW1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbkdiID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4tZ2InLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5HYjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChJcmVsYW5kKSBbZW4taWVdXG4vLyEgYXV0aG9yIDogQ2hyaXMgQ2FydGxpZGdlIDogaHR0cHM6Ly9naXRodWIuY29tL2NocmlzY2FydGxpZGdlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5JZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWllJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5JZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChJc3JhZWwpIFtlbi1pbF1cbi8vISBhdXRob3IgOiBDaHJpcyBHZWRyaW0gOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXNnZWRyaW1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbklsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4taWwnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuSWw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoSW5kaWEpIFtlbi1pbl1cbi8vISBhdXRob3IgOiBKYXRpbiBBZ3Jhd2FsIDogaHR0cHM6Ly9naXRodWIuY29tL2phdGluYWcyMlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuSW4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1pbicsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5JbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChOZXcgWmVhbGFuZCkgW2VuLW56XVxuLy8hIGF1dGhvciA6IEx1a2UgTWNHcmVnb3IgOiBodHRwczovL2dpdGh1Yi5jb20vbHVrZW1jZ3JlZ29yXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5OeiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLW56Jywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbk56O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKFNpbmdhcG9yZSkgW2VuLXNnXVxuLy8hIGF1dGhvciA6IE1hdHRoZXcgQ2FzdHJpbGxvbi1NYWRyaWdhbCA6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZWNoZGltZW5zaW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5TZyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLXNnJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuU2c7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRXNwZXJhbnRvIFtlb11cbi8vISBhdXRob3IgOiBDb2xpbiBEZWFuIDogaHR0cHM6Ly9naXRodWIuY29tL2NvbGluZGVhblxuLy8hIGF1dGhvciA6IE1pYSBOb3JkZW50b2Z0IEltcGVyYXRvcmkgOiBodHRwczovL2dpdGh1Yi5jb20vbWllc3Rhc21pYVxuLy8hIGNvbW1lbnQgOiBtaWVzdGFzbWlhIGNvcnJlY3RlZCB0aGUgdHJhbnNsYXRpb24gYnkgY29saW5kZWFuXG4vLyEgY29tbWVudCA6IFZpdmFrdm8gY29ycmVjdGVkIHRoZSB0cmFuc2xhdGlvbiBieSBjb2xpbmRlYW4gYW5kIG1pZXN0YXNtaWFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VvJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJvX2ZlYnJ1YXJvX21hcnRvX2Fwcmlsb19tYWpvX2p1bmlvX2p1bGlvX2HFrWd1c3RvX3NlcHRlbWJyb19va3RvYnJvX25vdmVtYnJvX2RlY2VtYnJvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFydF9hcHJfbWFqX2p1bl9qdWxfYcWtZ19zZXB0X29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ2RpbWFuxIlvX2x1bmRvX21hcmRvX21lcmtyZWRvX8S1YcWtZG9fdmVuZHJlZG9fc2FiYXRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGltX2x1bl9tYXJkX21lcmtfxLVhxa1fdmVuX3NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkaV9sdV9tYV9tZV/EtWFfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnW2xhXSBEWy1hbiBkZV0gTU1NTSwgWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdbbGFdIERbLWFuIGRlXSBNTU1NLCBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkW25dLCBbbGFdIERbLWFuIGRlXSBNTU1NLCBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIFtsYV0gRFstYW4gZGVdIE1NTSwgWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9bYXBdXFwudFxcLm0vaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgPT09ICdwJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwLnQubS4nIDogJ1AuVC5NLic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2EudC5tLicgOiAnQS5ULk0uJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSG9kaWHFrSBqZV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tNb3JnYcWtIGplXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGRbbiBqZV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIaWVyYcWtIGplXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1twYXNpbnRhbl0gZGRkZFtuIGplXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3Bvc3QgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2FudGHFrSAlcycsXG4gICAgICAgICAgICBzOiAna2Vsa2FqIHNla3VuZG9qJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kb2onLFxuICAgICAgICAgICAgbTogJ3VudSBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9qJyxcbiAgICAgICAgICAgIGg6ICd1bnUgaG9ybycsXG4gICAgICAgICAgICBoaDogJyVkIGhvcm9qJyxcbiAgICAgICAgICAgIGQ6ICd1bnUgdGFnbycsIC8vbmUgJ2RpdXJubycsIMSJYXIgZXN0YXMgdXppdGEgcG9yIHByb2tzaW11bW9cbiAgICAgICAgICAgIGRkOiAnJWQgdGFnb2onLFxuICAgICAgICAgICAgTTogJ3VudSBtb25hdG8nLFxuICAgICAgICAgICAgTU06ICclZCBtb25hdG9qJyxcbiAgICAgICAgICAgIHk6ICd1bnUgamFybycsXG4gICAgICAgICAgICB5eTogJyVkIGphcm9qJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9YS8sXG4gICAgICAgIG9yZGluYWw6ICclZGEnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3BhbmlzaCAoRG9taW5pY2FuIFJlcHVibGljKSBbZXMtZG9dXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPVxuICAgICAgICAgICAgJ2VuZS5fZmViLl9tYXIuX2Fici5fbWF5Ll9qdW4uX2p1bC5fYWdvLl9zZXAuX29jdC5fbm92Ll9kaWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZW5lL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9eYWJyL2ksXG4gICAgICAgICAgICAvXm1heS9pLFxuICAgICAgICAgICAgL15qdW4vaSxcbiAgICAgICAgICAgIC9eanVsL2ksXG4gICAgICAgICAgICAvXmFnby9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kaWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZXxlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaTtcblxuICAgIHZhciBlc0RvID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXMtZG8nLCB7XG4gICAgICAgIG1vbnRoczogJ2VuZXJvX2ZlYnJlcm9fbWFyem9fYWJyaWxfbWF5b19qdW5pb19qdWxpb19hZ29zdG9fc2VwdGllbWJyZV9vY3R1YnJlX25vdmllbWJyZV9kaWNpZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21pbmdvX2x1bmVzX21hcnRlc19tacOpcmNvbGVzX2p1ZXZlc192aWVybmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb20uX2x1bi5fbWFyLl9tacOpLl9qdWUuX3ZpZS5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWlfanVfdmlfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG95IGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbWHDsWFuYSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW2EgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYXllciBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW2VsXSBkZGRkIFtwYXNhZG8gYSBsYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ10gTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VuICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdoYWNlICVzJyxcbiAgICAgICAgICAgIHM6ICd1bm9zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGTDrWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkw61hcycsXG4gICAgICAgICAgICB3OiAndW5hIHNlbWFuYScsXG4gICAgICAgICAgICB3dzogJyVkIHNlbWFuYXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1biBhw7FvJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYcOxb3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVzRG87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3BhbmlzaCAoTWV4aWNvKSBbZXMtbXhdXG4vLyEgYXV0aG9yIDogSkMgRnJhbmNvIDogaHR0cHM6Ly9naXRodWIuY29tL2pjZnJhbmNvXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPVxuICAgICAgICAgICAgJ2VuZS5fZmViLl9tYXIuX2Fici5fbWF5Ll9qdW4uX2p1bC5fYWdvLl9zZXAuX29jdC5fbm92Ll9kaWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZW5lL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9eYWJyL2ksXG4gICAgICAgICAgICAvXm1heS9pLFxuICAgICAgICAgICAgL15qdW4vaSxcbiAgICAgICAgICAgIC9eanVsL2ksXG4gICAgICAgICAgICAvXmFnby9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kaWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZXxlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaTtcblxuICAgIHZhciBlc014ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXMtbXgnLCB7XG4gICAgICAgIG1vbnRoczogJ2VuZXJvX2ZlYnJlcm9fbWFyem9fYWJyaWxfbWF5b19qdW5pb19qdWxpb19hZ29zdG9fc2VwdGllbWJyZV9vY3R1YnJlX25vdmllbWJyZV9kaWNpZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21pbmdvX2x1bmVzX21hcnRlc19tacOpcmNvbGVzX2p1ZXZlc192aWVybmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb20uX2x1bi5fbWFyLl9tacOpLl9qdWUuX3ZpZS5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWlfanVfdmlfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2hveSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7FhbmEgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F5ZXIgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tlbF0gZGRkZCBbcGFzYWRvIGEgbGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaGFjZSAlcycsXG4gICAgICAgICAgICBzOiAndW5vcyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bmEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgdzogJ3VuYSBzZW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZW1hbmFzJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYcOxbycsXG4gICAgICAgICAgICB5eTogJyVkIGHDsW9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICAgICAgaW52YWxpZERhdGU6ICdGZWNoYSBpbnbDoWxpZGEnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVzTXg7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3BhbmlzaCAoVW5pdGVkIFN0YXRlcykgW2VzLXVzXVxuLy8hIGF1dGhvciA6IGJ1c3R0YSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9idXN0dGFcbi8vISBhdXRob3IgOiBjaHJpc3JvZHogOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXNyb2R6XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPVxuICAgICAgICAgICAgJ2VuZS5fZmViLl9tYXIuX2Fici5fbWF5Ll9qdW4uX2p1bC5fYWdvLl9zZXAuX29jdC5fbm92Ll9kaWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZW5lL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9eYWJyL2ksXG4gICAgICAgICAgICAvXm1heS9pLFxuICAgICAgICAgICAgL15qdW4vaSxcbiAgICAgICAgICAgIC9eanVsL2ksXG4gICAgICAgICAgICAvXmFnby9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kaWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZXxlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaTtcblxuICAgIHZhciBlc1VzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXMtdXMnLCB7XG4gICAgICAgIG1vbnRoczogJ2VuZXJvX2ZlYnJlcm9fbWFyem9fYWJyaWxfbWF5b19qdW5pb19qdWxpb19hZ29zdG9fc2VwdGllbWJyZV9vY3R1YnJlX25vdmllbWJyZV9kaWNpZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21pbmdvX2x1bmVzX21hcnRlc19tacOpcmNvbGVzX2p1ZXZlc192aWVybmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb20uX2x1bi5fbWFyLl9tacOpLl9qdWUuX3ZpZS5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWlfanVfdmlfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ01NL0REL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG95IGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbWHDsWFuYSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW2EgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYXllciBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW2VsXSBkZGRkIFtwYXNhZG8gYSBsYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ10gTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VuICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdoYWNlICVzJyxcbiAgICAgICAgICAgIHM6ICd1bm9zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGTDrWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkw61hcycsXG4gICAgICAgICAgICB3OiAndW5hIHNlbWFuYScsXG4gICAgICAgICAgICB3dzogJyVkIHNlbWFuYXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1biBhw7FvJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYcOxb3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVzVXM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3BhbmlzaCBbZXNdXG4vLyEgYXV0aG9yIDogSnVsaW8gTmFwdXLDrSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qdWxpb25jXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPVxuICAgICAgICAgICAgJ2VuZS5fZmViLl9tYXIuX2Fici5fbWF5Ll9qdW4uX2p1bC5fYWdvLl9zZXAuX29jdC5fbm92Ll9kaWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZW5lL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9eYWJyL2ksXG4gICAgICAgICAgICAvXm1heS9pLFxuICAgICAgICAgICAgL15qdW4vaSxcbiAgICAgICAgICAgIC9eanVsL2ksXG4gICAgICAgICAgICAvXmFnby9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kaWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZXxlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaTtcblxuICAgIHZhciBlcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VzJywge1xuICAgICAgICBtb250aHM6ICdlbmVyb19mZWJyZXJvX21hcnpvX2FicmlsX21heW9fanVuaW9fanVsaW9fYWdvc3RvX3NlcHRpZW1icmVfb2N0dWJyZV9ub3ZpZW1icmVfZGljaWVtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3RbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOiAnZG9taW5nb19sdW5lc19tYXJ0ZXNfbWnDqXJjb2xlc19qdWV2ZXNfdmllcm5lc19zw6FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tLl9sdW4uX21hci5fbWnDqS5fanVlLl92aWUuX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX21pX2p1X3ZpX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tob3kgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1ttYcOxYW5hIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1theWVyIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbZWxdIGRkZGQgW3Bhc2FkbyBhIGxhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnXSBMVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2hhY2UgJXMnLFxuICAgICAgICAgICAgczogJ3Vub3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW5hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW4gZMOtYScsXG4gICAgICAgICAgICBkZDogJyVkIGTDrWFzJyxcbiAgICAgICAgICAgIHc6ICd1bmEgc2VtYW5hJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2VtYW5hcycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VuIGHDsW8nLFxuICAgICAgICAgICAgeXk6ICclZCBhw7FvcycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgICAgIGludmFsaWREYXRlOiAnRmVjaGEgaW52w6FsaWRhJyxcbiAgICB9KTtcblxuICAgIHJldHVybiBlcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFc3RvbmlhbiBbZXRdXG4vLyEgYXV0aG9yIDogSGVucnkgS2VobG1hbm4gOiBodHRwczovL2dpdGh1Yi5jb20vbWFkaGVucnlcbi8vISBpbXByb3ZlbWVudHMgOiBJbGxpbWFyIFRhbWJlayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYWd1bGthXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgczogWydtw7VuZSBzZWt1bmRpJywgJ23DtW5pIHNla3VuZCcsICdwYWFyIHNla3VuZGl0J10sXG4gICAgICAgICAgICBzczogW251bWJlciArICdzZWt1bmRpJywgbnVtYmVyICsgJ3Nla3VuZGl0J10sXG4gICAgICAgICAgICBtOiBbJ8O8aGUgbWludXRpJywgJ8O8a3MgbWludXQnXSxcbiAgICAgICAgICAgIG1tOiBbbnVtYmVyICsgJyBtaW51dGknLCBudW1iZXIgKyAnIG1pbnV0aXQnXSxcbiAgICAgICAgICAgIGg6IFsnw7xoZSB0dW5uaScsICd0dW5kIGFlZ2EnLCAnw7xrcyB0dW5kJ10sXG4gICAgICAgICAgICBoaDogW251bWJlciArICcgdHVubmknLCBudW1iZXIgKyAnIHR1bmRpJ10sXG4gICAgICAgICAgICBkOiBbJ8O8aGUgcMOkZXZhJywgJ8O8a3MgcMOkZXYnXSxcbiAgICAgICAgICAgIE06IFsna3V1IGFqYScsICdrdXUgYWVnYScsICfDvGtzIGt1dSddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIGt1dScsIG51bWJlciArICcga3V1ZCddLFxuICAgICAgICAgICAgeTogWyfDvGhlIGFhc3RhJywgJ2Fhc3RhJywgJ8O8a3MgYWFzdGEnXSxcbiAgICAgICAgICAgIHl5OiBbbnVtYmVyICsgJyBhYXN0YScsIG51bWJlciArICcgYWFzdGF0J10sXG4gICAgICAgIH07XG4gICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0W2tleV1bMl0gPyBmb3JtYXRba2V5XVsyXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0Z1dHVyZSA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGV0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXQnLCB7XG4gICAgICAgIG1vbnRoczogJ2phYW51YXJfdmVlYnJ1YXJfbcOkcnRzX2FwcmlsbF9tYWlfanV1bmlfanV1bGlfYXVndXN0X3NlcHRlbWJlcl9va3Rvb2Jlcl9ub3ZlbWJlcl9kZXRzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phYW5fdmVlYnJfbcOkcnRzX2Fwcl9tYWlfanV1bmlfanV1bGlfYXVnX3NlcHRfb2t0X25vdl9kZXRzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdww7xoYXDDpGV2X2VzbWFzcMOkZXZfdGVpc2lww6Rldl9rb2xtYXDDpGV2X25lbGphcMOkZXZfcmVlZGVfbGF1cMOkZXYnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1BfRV9UX0tfTl9SX0wnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnUF9FX1RfS19OX1JfTCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1TDpG5hLF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tIb21tZSxdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW0rDpHJnbWluZV0gZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0VpbGUsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tFZWxtaW5lXSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgcMOkcmFzdCcsXG4gICAgICAgICAgICBwYXN0OiAnJXMgdGFnYXNpJyxcbiAgICAgICAgICAgIHM6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBzczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogJyVkIHDDpGV2YScsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQmFzcXVlIFtldV1cbi8vISBhdXRob3IgOiBFbmVrbyBJbGxhcnJhbWVuZGkgOiBodHRwczovL2dpdGh1Yi5jb20vZWlsbGFycmFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBldSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2V1Jywge1xuICAgICAgICBtb250aHM6ICd1cnRhcnJpbGFfb3RzYWlsYV9tYXJ0eG9hX2FwaXJpbGFfbWFpYXR6YV9la2FpbmFfdXp0YWlsYV9hYnV6dHVhX2lyYWlsYV91cnJpYV9hemFyb2FfYWJlbmR1YScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAndXJ0Ll9vdHMuX21hci5fYXBpLl9tYWkuX2VrYS5fdXp0Ll9hYnUuX2lyYS5fdXJyLl9hemEuX2FiZS4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnaWdhbmRlYV9hc3RlbGVoZW5hX2FzdGVhcnRlYV9hc3RlYXprZW5hX29zdGVndW5hX29zdGlyYWxhX2xhcnVuYmF0YScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnaWcuX2FsLl9hci5fYXouX29nLl9vbC5fbHIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2lnX2FsX2FyX2F6X29nX29sX2xyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnWVlZWVtrb10gTU1NTVtyZW5dIERbYV0nLFxuICAgICAgICAgICAgTExMOiAnWVlZWVtrb10gTU1NTVtyZW5dIERbYV0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIFlZWVlba29dIE1NTU1bcmVuXSBEW2FdIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdZWVlZLU0tRCcsXG4gICAgICAgICAgICBsbDogJ1lZWVlba29dIE1NTSBEW2FdJyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVlba29dIE1NTSBEW2FdIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIFlZWVlba29dIE1NTSBEW2FdIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZ2F1cl0gTFRbZXRhbl0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1tiaWhhcl0gTFRbZXRhbl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIExUW2V0YW5dJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbYXR6b10gTFRbZXRhbl0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbYXVycmVrb10gZGRkZCBMVFtldGFuXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIGJhcnJ1JyxcbiAgICAgICAgICAgIHBhc3Q6ICdkdWVsYSAlcycsXG4gICAgICAgICAgICBzOiAnc2VndW5kbyBiYXR6dWsnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvJyxcbiAgICAgICAgICAgIG06ICdtaW51dHUgYmF0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXR1JyxcbiAgICAgICAgICAgIGg6ICdvcmR1IGJhdCcsXG4gICAgICAgICAgICBoaDogJyVkIG9yZHUnLFxuICAgICAgICAgICAgZDogJ2VndW4gYmF0JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZWd1bicsXG4gICAgICAgICAgICBNOiAnaGlsYWJldGUgYmF0JyxcbiAgICAgICAgICAgIE1NOiAnJWQgaGlsYWJldGUnLFxuICAgICAgICAgICAgeTogJ3VydGUgYmF0JyxcbiAgICAgICAgICAgIHl5OiAnJWQgdXJ0ZScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUGVyc2lhbiBbZmFdXG4vLyEgYXV0aG9yIDogRWJyYWhpbSBCeWFnb3dpIDogaHR0cHM6Ly9naXRodWIuY29tL2VicmFtaW5pb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfbsScsXG4gICAgICAgICAgICAyOiAn27InLFxuICAgICAgICAgICAgMzogJ9uzJyxcbiAgICAgICAgICAgIDQ6ICfbtCcsXG4gICAgICAgICAgICA1OiAn27UnLFxuICAgICAgICAgICAgNjogJ9u2JyxcbiAgICAgICAgICAgIDc6ICfbtycsXG4gICAgICAgICAgICA4OiAn27gnLFxuICAgICAgICAgICAgOTogJ9u5JyxcbiAgICAgICAgICAgIDA6ICfbsCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfbsSc6ICcxJyxcbiAgICAgICAgICAgICfbsic6ICcyJyxcbiAgICAgICAgICAgICfbsyc6ICczJyxcbiAgICAgICAgICAgICfbtCc6ICc0JyxcbiAgICAgICAgICAgICfbtSc6ICc1JyxcbiAgICAgICAgICAgICfbtic6ICc2JyxcbiAgICAgICAgICAgICfbtyc6ICc3JyxcbiAgICAgICAgICAgICfbuCc6ICc4JyxcbiAgICAgICAgICAgICfbuSc6ICc5JyxcbiAgICAgICAgICAgICfbsCc6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBmYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZhJywge1xuICAgICAgICBtb250aHM6ICfamNin2YbZiNuM2Ydf2YHZiNix24zZh1/Zhdin2LHYs1/YotmI2LHbjNmEX9mF2Ydf2pjZiNim2YZf2pjZiNim24zZh1/Yp9mI2Kpf2LPZvtiq2KfZhdio2LFf2Kfaqdiq2KjYsV/ZhtmI2KfZhdio2LFf2K/Ys9in2YXYqNixJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfamNin2YbZiNuM2Ydf2YHZiNix24zZh1/Zhdin2LHYs1/YotmI2LHbjNmEX9mF2Ydf2pjZiNim2YZf2pjZiNim24zZh1/Yp9mI2Kpf2LPZvtiq2KfZhdio2LFf2Kfaqdiq2KjYsV/ZhtmI2KfZhdio2LFf2K/Ys9in2YXYqNixJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ9uM2qlcXHUyMDBj2LTZhtio2Ydf2K/ZiNi02YbYqNmHX9iz2YdcXHUyMDBj2LTZhtio2Ydf2obZh9in2LHYtNmG2KjZh1/ZvtmG2KxcXHUyMDBj2LTZhtio2Ydf2KzZhdi52Ydf2LTZhtio2YcnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDpcbiAgICAgICAgICAgICfbjNqpXFx1MjAwY9i02YbYqNmHX9iv2YjYtNmG2KjZh1/Ys9mHXFx1MjAwY9i02YbYqNmHX9qG2YfYp9ix2LTZhtio2Ydf2b7ZhtisXFx1MjAwY9i02YbYqNmHX9is2YXYudmHX9i02YbYqNmHJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn24xf2K9f2LNf2oZf2b5f2Kxf2LQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2YLYqNmEINin2LIg2LjZh9ixfNio2LnYryDYp9iyINi42YfYsS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC/YqNi52K8g2KfYsiDYuNmH2LEvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YLYqNmEINin2LIg2LjZh9ixJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYqNi52K8g2KfYsiDYuNmH2LEnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mF2LHZiNiyINiz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9mB2LHYr9inINiz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9iz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9iv24zYsdmI2LIg2LPYp9i52KpdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2b7bjNi0XSBb2LPYp9i52KpdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2K/YsSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg2b7bjNi0JyxcbiAgICAgICAgICAgIHM6ICfahtmG2K8g2KvYp9mG24zZhycsXG4gICAgICAgICAgICBzczogJyVkINir2KfZhtuM2YcnLFxuICAgICAgICAgICAgbTogJ9uM2qkg2K/ZgtuM2YLZhycsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLbjNmC2YcnLFxuICAgICAgICAgICAgaDogJ9uM2qkg2LPYp9i52KonLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYqicsXG4gICAgICAgICAgICBkOiAn24zaqSDYsdmI2LInLFxuICAgICAgICAgICAgZGQ6ICclZCDYsdmI2LInLFxuICAgICAgICAgICAgTTogJ9uM2qkg2YXYp9mHJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2YXYp9mHJyxcbiAgICAgICAgICAgIHk6ICfbjNqpINiz2KfZhCcsXG4gICAgICAgICAgICB5eTogJyVkINiz2KfZhCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1vbsC3buV0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3ZhS8sXG4gICAgICAgIG9yZGluYWw6ICclZNmFJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGaW5uaXNoIFtmaV1cbi8vISBhdXRob3IgOiBUYXJtbyBBaWRhbnRhdXN0YSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ibGVhZG9mXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbnVtYmVyc1Bhc3QgPVxuICAgICAgICAgICAgJ25vbGxhIHlrc2kga2Frc2kga29sbWUgbmVsasOkIHZpaXNpIGt1dXNpIHNlaXRzZW3DpG4ga2FoZGVrc2FuIHloZGVrc8Okbicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJyAnXG4gICAgICAgICAgICApLFxuICAgICAgICBudW1iZXJzRnV0dXJlID0gW1xuICAgICAgICAgICAgJ25vbGxhJyxcbiAgICAgICAgICAgICd5aGRlbicsXG4gICAgICAgICAgICAna2FoZGVuJyxcbiAgICAgICAgICAgICdrb2xtZW4nLFxuICAgICAgICAgICAgJ25lbGrDpG4nLFxuICAgICAgICAgICAgJ3ZpaWRlbicsXG4gICAgICAgICAgICAna3V1ZGVuJyxcbiAgICAgICAgICAgIG51bWJlcnNQYXN0WzddLFxuICAgICAgICAgICAgbnVtYmVyc1Bhc3RbOF0sXG4gICAgICAgICAgICBudW1iZXJzUGFzdFs5XSxcbiAgICAgICAgXTtcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdtdXV0YW1hbiBzZWt1bm5pbicgOiAnbXV1dGFtYSBzZWt1bnRpJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICdzZWt1bm5pbicgOiAnc2VrdW50aWEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ21pbnV1dGluJyA6ICdtaW51dXR0aSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAnbWludXV0aW4nIDogJ21pbnV1dHRpYSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAndHVubmluJyA6ICd0dW50aSc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAndHVubmluJyA6ICd0dW50aWEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ3DDpGl2w6RuJyA6ICdww6RpdsOkJztcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICdww6RpdsOkbicgOiAncMOkaXbDpMOkJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdrdXVrYXVkZW4nIDogJ2t1dWthdXNpJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICdrdXVrYXVkZW4nIDogJ2t1dWthdXR0YSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAndnVvZGVuJyA6ICd2dW9zaSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAndnVvZGVuJyA6ICd2dW90dGEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHZlcmJhbE51bWJlcihudW1iZXIsIGlzRnV0dXJlKSArICcgJyArIHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmVyYmFsTnVtYmVyKG51bWJlciwgaXNGdXR1cmUpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlciA8IDEwXG4gICAgICAgICAgICA/IGlzRnV0dXJlXG4gICAgICAgICAgICAgICAgPyBudW1iZXJzRnV0dXJlW251bWJlcl1cbiAgICAgICAgICAgICAgICA6IG51bWJlcnNQYXN0W251bWJlcl1cbiAgICAgICAgICAgIDogbnVtYmVyO1xuICAgIH1cblxuICAgIHZhciBmaSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZpJywge1xuICAgICAgICBtb250aHM6ICd0YW1taWt1dV9oZWxtaWt1dV9tYWFsaXNrdXVfaHVodGlrdXVfdG91a29rdXVfa2Vzw6RrdXVfaGVpbsOka3V1X2Vsb2t1dV9zeXlza3V1X2xva2FrdXVfbWFycmFza3V1X2pvdWx1a3V1Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICd0YW1taV9oZWxtaV9tYWFsaXNfaHVodGlfdG91a29fa2Vzw6RfaGVpbsOkX2Vsb19zeXlzX2xva2FfbWFycmFzX2pvdWx1Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3N1bm51bnRhaV9tYWFuYW50YWlfdGlpc3RhaV9rZXNraXZpaWtrb190b3JzdGFpX3BlcmphbnRhaV9sYXVhbnRhaScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc3VfbWFfdGlfa2VfdG9fcGVfbGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc3VfbWFfdGlfa2VfdG9fcGVfbGEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hILm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRG8gTU1NTVt0YV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEbyBNTU1NW3RhXSBZWVlZLCBba2xvXSBISC5tbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRG8gTU1NTVt0YV0gWVlZWSwgW2tsb10gSEgubW0nLFxuICAgICAgICAgICAgbDogJ0QuTS5ZWVlZJyxcbiAgICAgICAgICAgIGxsOiAnRG8gTU1NIFlZWVknLFxuICAgICAgICAgICAgbGxsOiAnRG8gTU1NIFlZWVksIFtrbG9dIEhILm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIERvIE1NTSBZWVlZLCBba2xvXSBISC5tbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW3TDpG7DpMOkbl0gW2tsb10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1todW9tZW5uYV0gW2tsb10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbG9dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZWlsZW5dIFtrbG9dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3ZpaW1lXSBkZGRkW25hXSBba2xvXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHDDpMOkc3TDpCcsXG4gICAgICAgICAgICBwYXN0OiAnJXMgc2l0dGVuJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmaTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGaWxpcGlubyBbZmlsXVxuLy8hIGF1dGhvciA6IERhbiBIYWdtYW4gOiBodHRwczovL2dpdGh1Yi5jb20vaGFnbWFuZGFuXG4vLyEgYXV0aG9yIDogTWF0dGhldyBDbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0aGV3ZGVlY29cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBmaWwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmaWwnLCB7XG4gICAgICAgIG1vbnRoczogJ0VuZXJvX1BlYnJlcm9fTWFyc29fQWJyaWxfTWF5b19IdW55b19IdWx5b19BZ29zdG9fU2V0eWVtYnJlX09rdHVicmVfTm9ieWVtYnJlX0Rpc3llbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdFbmVfUGViX01hcl9BYnJfTWF5X0h1bl9IdWxfQWdvX1NldF9Pa3RfTm9iX0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdMaW5nZ29fTHVuZXNfTWFydGVzX01peWVya3VsZXNfSHV3ZWJlc19CaXllcm5lc19TYWJhZG8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdMaW5fTHVuX01hcl9NaXlfSHV3X0JpeV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnTGlfTHVfTWFfTWlfSHVfQmlfU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnTU0vRC9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnTU1NTSBELCBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ01NTU0gRCwgWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBERCwgWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnTFQgW25nYXlvbmcgYXJhd10nLFxuICAgICAgICAgICAgbmV4dERheTogJ1tCdWthcyBuZ10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdMVCBbc2Egc3VzdW5vZCBuYV0gZGRkZCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnTFQgW2thaGFwb25dJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnTFQgW25vb25nIG5ha2FyYWFuZ10gZGRkZCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3NhIGxvb2IgbmcgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFuZyBuYWthbGlwYXMnLFxuICAgICAgICAgICAgczogJ2lsYW5nIHNlZ3VuZG8nLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvJyxcbiAgICAgICAgICAgIG06ICdpc2FuZyBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG8nLFxuICAgICAgICAgICAgaDogJ2lzYW5nIG9yYXMnLFxuICAgICAgICAgICAgaGg6ICclZCBvcmFzJyxcbiAgICAgICAgICAgIGQ6ICdpc2FuZyBhcmF3JyxcbiAgICAgICAgICAgIGRkOiAnJWQgYXJhdycsXG4gICAgICAgICAgICBNOiAnaXNhbmcgYnV3YW4nLFxuICAgICAgICAgICAgTU06ICclZCBidXdhbicsXG4gICAgICAgICAgICB5OiAnaXNhbmcgdGFvbicsXG4gICAgICAgICAgICB5eTogJyVkIHRhb24nLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEZhcm9lc2UgW2ZvXVxuLy8hIGF1dGhvciA6IFJhZ25hciBKb2hhbm5lc2VuIDogaHR0cHM6Ly9naXRodWIuY29tL3JhZ25hcjEyM1xuLy8hIGF1dGhvciA6IEtyaXN0aWFuIFNha2FyaXNzb24gOiBodHRwczovL2dpdGh1Yi5jb20vc2FrYXJpc3NvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGZvID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZm8nLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnNfYXByw61sX21haV9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFyX2Fwcl9tYWlfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdzdW5udWRhZ3VyX23DoW5hZGFndXJfdMO9c2RhZ3VyX21pa3VkYWd1cl9ow7NzZGFndXJfZnLDrWdnamFkYWd1cl9sZXlnYXJkYWd1cicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc3VuX23DoW5fdMO9c19taWtfaMOzc19mcsOtX2xleScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzdV9tw6FfdMO9X21pX2jDs19mcl9sZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBELiBNTU1NLCBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbw40gZGFnIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vDjSBtb3JnaW4ga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vDjSBnasOhciBrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3PDrcOwc3R1XSBkZGRkIFtrbF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd1bSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgc8Otw7BhbmknLFxuICAgICAgICAgICAgczogJ2bDoSBzZWt1bmQnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmRpcicsXG4gICAgICAgICAgICBtOiAnZWluIG1pbnV0dHVyJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXR0aXInLFxuICAgICAgICAgICAgaDogJ2VpbiB0w61taScsXG4gICAgICAgICAgICBoaDogJyVkIHTDrW1hcicsXG4gICAgICAgICAgICBkOiAnZWluIGRhZ3VyJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnYXInLFxuICAgICAgICAgICAgTTogJ2VpbiBtw6FuYcOwdXInLFxuICAgICAgICAgICAgTU06ICclZCBtw6FuYcOwaXInLFxuICAgICAgICAgICAgeTogJ2VpdHQgw6FyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw6FyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmbztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGcmVuY2ggKENhbmFkYSkgW2ZyLWNhXVxuLy8hIGF1dGhvciA6IEpvbmF0aGFuIEFib3VyYmloIDogaHR0cHM6Ly9naXRodWIuY29tL2pvbmJjYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGZyQ2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmci1jYScsIHtcbiAgICAgICAgbW9udGhzOiAnamFudmllcl9mw6l2cmllcl9tYXJzX2F2cmlsX21haV9qdWluX2p1aWxsZXRfYW/Du3Rfc2VwdGVtYnJlX29jdG9icmVfbm92ZW1icmVfZMOpY2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW52Ll9mw6l2ci5fbWFyc19hdnIuX21haV9qdWluX2p1aWwuX2Fvw7t0X3NlcHQuX29jdC5fbm92Ll9kw6ljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2RpbWFuY2hlX2x1bmRpX21hcmRpX21lcmNyZWRpX2pldWRpX3ZlbmRyZWRpX3NhbWVkaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RpbS5fbHVuLl9tYXIuX21lci5famV1Ll92ZW4uX3NhbS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGlfbHVfbWFfbWVfamVfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0F1am91cmTigJlodWkgw6BdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRGVtYWluIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8OgXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0hpZXIgw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZGVybmllciDDoF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkYW5zICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdpbCB5IGEgJXMnLFxuICAgICAgICAgICAgczogJ3F1ZWxxdWVzIHNlY29uZGVzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kZXMnLFxuICAgICAgICAgICAgbTogJ3VuZSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICd1bmUgaGV1cmUnLFxuICAgICAgICAgICAgaGg6ICclZCBoZXVyZXMnLFxuICAgICAgICAgICAgZDogJ3VuIGpvdXInLFxuICAgICAgICAgICAgZGQ6ICclZCBqb3VycycsXG4gICAgICAgICAgICBNOiAndW4gbW9pcycsXG4gICAgICAgICAgICBNTTogJyVkIG1vaXMnLFxuICAgICAgICAgICAgeTogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGVyfGUpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggbWFzY3VsaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogbW9pcywgdHJpbWVzdHJlLCBqb3VyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdlcicgOiAnZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBmZW1pbmluZSBncmFtbWF0aWNhbCBnZW5kZXI6IHNlbWFpbmVcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAncmUnIDogJ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmckNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEZyZW5jaCAoU3dpdHplcmxhbmQpIFtmci1jaF1cbi8vISBhdXRob3IgOiBHYXNwYXJkIEJ1Y2hlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9nYXNwYXJkXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZnJDaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZyLWNoJywge1xuICAgICAgICBtb250aHM6ICdqYW52aWVyX2bDqXZyaWVyX21hcnNfYXZyaWxfbWFpX2p1aW5fanVpbGxldF9hb8O7dF9zZXB0ZW1icmVfb2N0b2JyZV9ub3ZlbWJyZV9kw6ljZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbnYuX2bDqXZyLl9tYXJzX2F2ci5fbWFpX2p1aW5fanVpbC5fYW/Du3Rfc2VwdC5fb2N0Ll9ub3YuX2TDqWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnZGltYW5jaGVfbHVuZGlfbWFyZGlfbWVyY3JlZGlfamV1ZGlfdmVuZHJlZGlfc2FtZWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGltLl9sdW4uX21hci5fbWVyLl9qZXUuX3Zlbi5fc2FtLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkaV9sdV9tYV9tZV9qZV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQXVqb3VyZOKAmWh1aSDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tEZW1haW4gw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSGllciDDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtkZXJuaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhbnMgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2lsIHkgYSAlcycsXG4gICAgICAgICAgICBzOiAncXVlbHF1ZXMgc2Vjb25kZXMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRlcycsXG4gICAgICAgICAgICBtOiAndW5lIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ3VuZSBoZXVyZScsXG4gICAgICAgICAgICBoaDogJyVkIGhldXJlcycsXG4gICAgICAgICAgICBkOiAndW4gam91cicsXG4gICAgICAgICAgICBkZDogJyVkIGpvdXJzJyxcbiAgICAgICAgICAgIE06ICd1biBtb2lzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9pcycsXG4gICAgICAgICAgICB5OiAndW4gYW4nLFxuICAgICAgICAgICAgeXk6ICclZCBhbnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZXJ8ZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBtYXNjdWxpbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBtb2lzLCB0cmltZXN0cmUsIGpvdXJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ2VyJyA6ICdlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIGZlbWluaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogc2VtYWluZVxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdyZScgOiAnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnJDaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGcmVuY2ggW2ZyXVxuLy8hIGF1dGhvciA6IEpvaG4gRmlzY2hlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qZnJvZmZpY2VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTdHJpY3RSZWdleCA9XG4gICAgICAgICAgICAvXihqYW52aWVyfGbDqXZyaWVyfG1hcnN8YXZyaWx8bWFpfGp1aW58anVpbGxldHxhb8O7dHxzZXB0ZW1icmV8b2N0b2JyZXxub3ZlbWJyZXxkw6ljZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXggPVxuICAgICAgICAgICAgLyhqYW52XFwuP3xmw6l2clxcLj98bWFyc3xhdnJcXC4/fG1haXxqdWlufGp1aWxcXC4/fGFvw7t0fHNlcHRcXC4/fG9jdFxcLj98bm92XFwuP3xkw6ljXFwuPykvaSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgLyhqYW52XFwuP3xmw6l2clxcLj98bWFyc3xhdnJcXC4/fG1haXxqdWlufGp1aWxcXC4/fGFvw7t0fHNlcHRcXC4/fG9jdFxcLj98bm92XFwuP3xkw6ljXFwuP3xqYW52aWVyfGbDqXZyaWVyfG1hcnN8YXZyaWx8bWFpfGp1aW58anVpbGxldHxhb8O7dHxzZXB0ZW1icmV8b2N0b2JyZXxub3ZlbWJyZXxkw6ljZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15qYW52L2ksXG4gICAgICAgICAgICAvXmbDqXZyL2ksXG4gICAgICAgICAgICAvXm1hcnMvaSxcbiAgICAgICAgICAgIC9eYXZyL2ksXG4gICAgICAgICAgICAvXm1haS9pLFxuICAgICAgICAgICAgL15qdWluL2ksXG4gICAgICAgICAgICAvXmp1aWwvaSxcbiAgICAgICAgICAgIC9eYW/Du3QvaSxcbiAgICAgICAgICAgIC9ec2VwdC9pLFxuICAgICAgICAgICAgL15vY3QvaSxcbiAgICAgICAgICAgIC9ebm92L2ksXG4gICAgICAgICAgICAvXmTDqWMvaSxcbiAgICAgICAgXTtcblxuICAgIHZhciBmciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZyJywge1xuICAgICAgICBtb250aHM6ICdqYW52aWVyX2bDqXZyaWVyX21hcnNfYXZyaWxfbWFpX2p1aW5fanVpbGxldF9hb8O7dF9zZXB0ZW1icmVfb2N0b2JyZV9ub3ZlbWJyZV9kw6ljZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbnYuX2bDqXZyLl9tYXJzX2F2ci5fbWFpX2p1aW5fanVpbC5fYW/Du3Rfc2VwdC5fb2N0Ll9ub3YuX2TDqWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OiBtb250aHNTdHJpY3RSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDogbW9udGhzU2hvcnRTdHJpY3RSZWdleCxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICdkaW1hbmNoZV9sdW5kaV9tYXJkaV9tZXJjcmVkaV9qZXVkaV92ZW5kcmVkaV9zYW1lZGknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkaW0uX2x1bi5fbWFyLl9tZXIuX2pldS5fdmVuLl9zYW0uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RpX2x1X21hX21lX2plX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tBdWpvdXJk4oCZaHVpIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0RlbWFpbiDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2Rlcm5pZXIgw6BdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFucyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaWwgeSBhICVzJyxcbiAgICAgICAgICAgIHM6ICdxdWVscXVlcyBzZWNvbmRlcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGVzJyxcbiAgICAgICAgICAgIG06ICd1bmUgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAndW5lIGhldXJlJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaGV1cmVzJyxcbiAgICAgICAgICAgIGQ6ICd1biBqb3VyJyxcbiAgICAgICAgICAgIGRkOiAnJWQgam91cnMnLFxuICAgICAgICAgICAgdzogJ3VuZSBzZW1haW5lJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2VtYWluZXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1vaXMnLFxuICAgICAgICAgICAgTU06ICclZCBtb2lzJyxcbiAgICAgICAgICAgIHk6ICd1biBhbicsXG4gICAgICAgICAgICB5eTogJyVkIGFucycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShlcnwpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IFJldHVybiAnZScgd2hlbiBkYXkgb2YgbW9udGggPiAxLiBNb3ZlIHRoaXMgY2FzZSBpbnNpZGVcbiAgICAgICAgICAgICAgICAvLyBibG9jayBmb3IgbWFzY3VsaW5lIHdvcmRzIGJlbG93LlxuICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMzM3NVxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdlcicgOiAnJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIG1hc2N1bGluZSBncmFtbWF0aWNhbCBnZW5kZXI6IG1vaXMsIHRyaW1lc3RyZSwgam91clxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJ2UnKTtcblxuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggZmVtaW5pbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBzZW1haW5lXG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ3JlJyA6ICdlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGcmlzaWFuIFtmeV1cbi8vISBhdXRob3IgOiBSb2JpbiB2YW4gZGVyIFZsaWV0IDogaHR0cHM6Ly9naXRodWIuY29tL3JvYmluMHZhbjBkZXIwdlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0V2l0aERvdHMgPVxuICAgICAgICAgICAgJ2phbi5fZmViLl9tcnQuX2Fwci5fbWFpX2p1bi5fanVsLl9hdWcuX3NlcC5fb2t0Ll9ub3YuX2Rlcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0V2l0aG91dERvdHMgPVxuICAgICAgICAgICAgJ2phbl9mZWJfbXJ0X2Fwcl9tYWlfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVzJy5zcGxpdCgnXycpO1xuXG4gICAgdmFyIGZ5ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZnknLCB7XG4gICAgICAgIG1vbnRoczogJ2phbm5ld2FyaXNfZmVicmV3YXJpc19tYWFydF9hcHJpbF9tYWFpZV9qdW55X2p1bHlfYXVndXN0dXNfc2VwdGltYmVyX29rdG9iZXJfbm92aW1iZXJfZGVzaW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRob3V0RG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ3NuZWluX21vYW5kZWlfdGlpc2RlaV93b2Fuc2RlaV90b25nZXJzZGVpX2ZyZWVkX3NuZW9uJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc2kuX21vLl90aS5fd28uX3RvLl9mci5fc28uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NpX01vX1RpX1dvX1RvX0ZyX1NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toam9lZCBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb2FybiBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdXN0ZXIgb21dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW8O0ZnLDu25lXSBkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvZXIgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGx5bicsXG4gICAgICAgICAgICBzOiAnaW4gcGVhciBzZWtvbmRlbicsXG4gICAgICAgICAgICBzczogJyVkIHNla29uZGVuJyxcbiAgICAgICAgICAgIG06ICdpZW4gbWluw7p0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlbicsXG4gICAgICAgICAgICBoOiAnaWVuIG9lcmUnLFxuICAgICAgICAgICAgaGg6ICclZCBvZXJlbicsXG4gICAgICAgICAgICBkOiAnaWVuIGRlaScsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2VuJyxcbiAgICAgICAgICAgIE06ICdpZW4gbW9hbm5lJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9hbm5lbicsXG4gICAgICAgICAgICB5OiAnaWVuIGppZXInLFxuICAgICAgICAgICAgeXk6ICclZCBqaWVycmVuJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0ZXxkZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIG51bWJlciArXG4gICAgICAgICAgICAgICAgKG51bWJlciA9PT0gMSB8fCBudW1iZXIgPT09IDggfHwgbnVtYmVyID49IDIwID8gJ3N0ZScgOiAnZGUnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ5O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IElyaXNoIG9yIElyaXNoIEdhZWxpYyBbZ2FdXG4vLyEgYXV0aG9yIDogQW5kcsOpIFNpbHZhIDogaHR0cHM6Ly9naXRodWIuY29tL2Fza3B0XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ0VhbsOhaXInLFxuICAgICAgICAgICAgJ0ZlYWJocmEnLFxuICAgICAgICAgICAgJ03DoXJ0YScsXG4gICAgICAgICAgICAnQWlicmXDoW4nLFxuICAgICAgICAgICAgJ0JlYWx0YWluZScsXG4gICAgICAgICAgICAnTWVpdGhlYW1oJyxcbiAgICAgICAgICAgICdJw7ppbCcsXG4gICAgICAgICAgICAnTMO6bmFzYScsXG4gICAgICAgICAgICAnTWXDoW4gRsOzbWhhaXInLFxuICAgICAgICAgICAgJ0RlaXJlYWRoIEbDs21oYWlyJyxcbiAgICAgICAgICAgICdTYW1oYWluJyxcbiAgICAgICAgICAgICdOb2xsYWlnJyxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSBbXG4gICAgICAgICAgICAnRWFuJyxcbiAgICAgICAgICAgICdGZWFiaCcsXG4gICAgICAgICAgICAnTcOhcnQnLFxuICAgICAgICAgICAgJ0FpYicsXG4gICAgICAgICAgICAnQmVhbCcsXG4gICAgICAgICAgICAnTWVpdGgnLFxuICAgICAgICAgICAgJ0nDumlsJyxcbiAgICAgICAgICAgICdMw7puJyxcbiAgICAgICAgICAgICdNLkYuJyxcbiAgICAgICAgICAgICdELkYuJyxcbiAgICAgICAgICAgICdTYW1oJyxcbiAgICAgICAgICAgICdOb2xsJyxcbiAgICAgICAgXSxcbiAgICAgICAgd2Vla2RheXMgPSBbXG4gICAgICAgICAgICAnRMOpIERvbWhuYWlnaCcsXG4gICAgICAgICAgICAnRMOpIEx1YWluJyxcbiAgICAgICAgICAgICdEw6kgTcOhaXJ0JyxcbiAgICAgICAgICAgICdEw6kgQ8OpYWRhb2luJyxcbiAgICAgICAgICAgICdEw6lhcmRhb2luJyxcbiAgICAgICAgICAgICdEw6kgaEFvaW5lJyxcbiAgICAgICAgICAgICdEw6kgU2F0aGFpcm4nLFxuICAgICAgICBdLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0ID0gWydEb21oJywgJ0x1YW4nLCAnTcOhaXJ0JywgJ0PDqWFkJywgJ0TDqWFyJywgJ0FvaW5lJywgJ1NhdGgnXSxcbiAgICAgICAgd2Vla2RheXNNaW4gPSBbJ0RvJywgJ0x1JywgJ03DoScsICdDw6knLCAnRMOpJywgJ0EnLCAnU2EnXTtcblxuICAgIHZhciBnYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2dhJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRoc1Nob3J0LFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogd2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IHdlZWtkYXlzU2hvcnQsXG4gICAgICAgIHdlZWtkYXlzTWluOiB3ZWVrZGF5c01pbixcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tJbm5pdSBhZ10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBbcOhcmFjaCBhZ10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthZ10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJbm7DqSBhZ10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtzZW8gY2FpdGVdIFthZ10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDDsyBzaGluJyxcbiAgICAgICAgICAgIHM6ICdjw7pwbGEgc29pY2luZCcsXG4gICAgICAgICAgICBzczogJyVkIHNvaWNpbmQnLFxuICAgICAgICAgICAgbTogJ27Ds2ltw6lhZCcsXG4gICAgICAgICAgICBtbTogJyVkIG7Ds2ltw6lhZCcsXG4gICAgICAgICAgICBoOiAndWFpciBhbiBjaGxvaWcnLFxuICAgICAgICAgICAgaGg6ICclZCB1YWlyIGFuIGNobG9pZycsXG4gICAgICAgICAgICBkOiAnbMOhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgbMOhJyxcbiAgICAgICAgICAgIE06ICdtw60nLFxuICAgICAgICAgICAgTU06ICclZCBtw61vbm5hJyxcbiAgICAgICAgICAgIHk6ICdibGlhaW4nLFxuICAgICAgICAgICAgeXk6ICclZCBibGlhaW4nLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZHxuYXxtaCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbnVtYmVyID09PSAxID8gJ2QnIDogbnVtYmVyICUgMTAgPT09IDIgPyAnbmEnIDogJ21oJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBnYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTY290dGlzaCBHYWVsaWMgW2dkXVxuLy8hIGF1dGhvciA6IEpvbiBBc2hkb3duIDogaHR0cHM6Ly9naXRodWIuY29tL2pvbmFzaGRvd25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICAgICAnQW0gRmFvaWxsZWFjaCcsXG4gICAgICAgICAgICAnQW4gR2VhcnJhbicsXG4gICAgICAgICAgICAnQW0gTcOgcnQnLFxuICAgICAgICAgICAgJ0FuIEdpYmxlYW4nLFxuICAgICAgICAgICAgJ0FuIEPDqGl0ZWFuJyxcbiAgICAgICAgICAgICdBbiB0LcOSZ21oaW9zJyxcbiAgICAgICAgICAgICdBbiB0LUl1Y2hhcicsXG4gICAgICAgICAgICAnQW4gTMO5bmFzdGFsJyxcbiAgICAgICAgICAgICdBbiB0LVN1bHRhaW4nLFxuICAgICAgICAgICAgJ0FuIETDoG1oYWlyJyxcbiAgICAgICAgICAgICdBbiB0LVNhbWhhaW4nLFxuICAgICAgICAgICAgJ0FuIETDuWJobGFjaGQnLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNTaG9ydCA9IFtcbiAgICAgICAgICAgICdGYW9pJyxcbiAgICAgICAgICAgICdHZWFyJyxcbiAgICAgICAgICAgICdNw6BydCcsXG4gICAgICAgICAgICAnR2libCcsXG4gICAgICAgICAgICAnQ8OoaXQnLFxuICAgICAgICAgICAgJ8OSZ21oJyxcbiAgICAgICAgICAgICdJdWNoJyxcbiAgICAgICAgICAgICdMw7luJyxcbiAgICAgICAgICAgICdTdWx0JyxcbiAgICAgICAgICAgICdEw6BtaCcsXG4gICAgICAgICAgICAnU2FtaCcsXG4gICAgICAgICAgICAnRMO5YmgnLFxuICAgICAgICBdLFxuICAgICAgICB3ZWVrZGF5cyA9IFtcbiAgICAgICAgICAgICdEaWTDsm1obmFpY2gnLFxuICAgICAgICAgICAgJ0RpbHVhaW4nLFxuICAgICAgICAgICAgJ0RpbcOgaXJ0JyxcbiAgICAgICAgICAgICdEaWNpYWRhaW4nLFxuICAgICAgICAgICAgJ0RpYXJkYW9pbicsXG4gICAgICAgICAgICAnRGloYW9pbmUnLFxuICAgICAgICAgICAgJ0Rpc2F0aGFpcm5lJyxcbiAgICAgICAgXSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA9IFsnRGlkJywgJ0RpbCcsICdEaW0nLCAnRGljJywgJ0RpYScsICdEaWgnLCAnRGlzJ10sXG4gICAgICAgIHdlZWtkYXlzTWluID0gWydEw7InLCAnTHUnLCAnTcOgJywgJ0NpJywgJ0FyJywgJ0hhJywgJ1NhJ107XG5cbiAgICB2YXIgZ2QgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdnZCcsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHNTaG9ydCxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6IHdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiB3ZWVrZGF5c1Nob3J0LFxuICAgICAgICB3ZWVrZGF5c01pbjogd2Vla2RheXNNaW4sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQW4tZGl1Z2ggYWlnXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0EtbcOgaXJlYWNoIGFpZ10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthaWddIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbQW4tZMOoIGFpZ10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtzZW8gY2hhaWRoXSBbYWlnXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2FubiBhbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnYmhvIGNoaW9ubiAlcycsXG4gICAgICAgICAgICBzOiAnYmVhZ2FuIGRpb2dhbicsXG4gICAgICAgICAgICBzczogJyVkIGRpb2dhbicsXG4gICAgICAgICAgICBtOiAnbWlvbmFpZCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pb25haWRlYW4nLFxuICAgICAgICAgICAgaDogJ3VhaXInLFxuICAgICAgICAgICAgaGg6ICclZCB1YWlyZWFuJyxcbiAgICAgICAgICAgIGQ6ICdsYXRoYScsXG4gICAgICAgICAgICBkZDogJyVkIGxhdGhhJyxcbiAgICAgICAgICAgIE06ICdtw6xvcycsXG4gICAgICAgICAgICBNTTogJyVkIG3DrG9zYW4nLFxuICAgICAgICAgICAgeTogJ2JsaWFkaG5hJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYmxpYWRobmEnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZHxuYXxtaCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbnVtYmVyID09PSAxID8gJ2QnIDogbnVtYmVyICUgMTAgPT09IDIgPyAnbmEnIDogJ21oJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBnZDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHYWxpY2lhbiBbZ2xdXG4vLyEgYXV0aG9yIDogSnVhbiBHLiBIdXJ0YWRvIDogaHR0cHM6Ly9naXRodWIuY29tL2p1YW5naHVydGFkb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGdsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ2wnLCB7XG4gICAgICAgIG1vbnRoczogJ3hhbmVpcm9fZmVicmVpcm9fbWFyem9fYWJyaWxfbWFpb194dcOxb194dWxsb19hZ29zdG9fc2V0ZW1icm9fb3V0dWJyb19ub3ZlbWJyb19kZWNlbWJybycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAneGFuLl9mZWIuX21hci5fYWJyLl9tYWkuX3h1w7EuX3h1bC5fYWdvLl9zZXQuX291dC5fbm92Ll9kZWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnZG9taW5nb19sdW5zX21hcnRlc19tw6lyY29yZXNfeG92ZXNfdmVucmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb20uX2x1bi5fbWFyLl9tw6lyLl94b3YuX3Zlbi5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbcOpX3hvX3ZlX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tob3hlICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ8OhcycgOiAnw6EnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbWHDscOhICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ8OhcycgOiAnw6EnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnw6FzJyA6ICdhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW29udGUgJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnw6EnIDogJ2EnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbb10gZGRkZCBbcGFzYWRvICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ8OhcycgOiAnYScpICsgJ10gTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgICAgIGlmIChzdHIuaW5kZXhPZigndW4nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ24nICsgc3RyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VuICcgKyBzdHI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdDogJ2hhaSAlcycsXG4gICAgICAgICAgICBzOiAndW5zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VuaGEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1biBhbm8nLFxuICAgICAgICAgICAgeXk6ICclZCBhbm9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBnbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLb25rYW5pIERldmFuYWdhcmkgc2NyaXB0IFtnb20tZGV2YV1cbi8vISBhdXRob3IgOiBUaGUgRGlzY292ZXJlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9XaWtpRGlzY292ZXJlclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHM6IFsn4KSl4KWL4KSh4KSv4KS+IOCkuOClheCkleCkguCkoeCkvuCkguCkqOClgCcsICfgpKXgpYvgpKHgpYcg4KS44KWF4KSV4KSC4KShJ10sXG4gICAgICAgICAgICBzczogW251bWJlciArICcg4KS44KWF4KSV4KSC4KSh4KS+4KSC4KSo4KWAJywgbnVtYmVyICsgJyDgpLjgpYXgpJXgpILgpKEnXSxcbiAgICAgICAgICAgIG06IFsn4KSP4KSV4KS+IOCkruCkv+Cko+Ckn+CkvuCkqCcsICfgpI/gpJUg4KSu4KS/4KSo4KWC4KSfJ10sXG4gICAgICAgICAgICBtbTogW251bWJlciArICcg4KSu4KS/4KSj4KSf4KS+4KSC4KSo4KWAJywgbnVtYmVyICsgJyDgpK7gpL/gpKPgpJ/gpL7gpIInXSxcbiAgICAgICAgICAgIGg6IFsn4KSP4KSV4KS+IOCkteCksOCkvuCkqCcsICfgpI/gpJUg4KS14KSwJ10sXG4gICAgICAgICAgICBoaDogW251bWJlciArICcg4KS14KSw4KS+4KSC4KSo4KWAJywgbnVtYmVyICsgJyDgpLXgpLDgpL7gpIInXSxcbiAgICAgICAgICAgIGQ6IFsn4KSP4KSV4KS+IOCkpuCkv+CkuOCkvuCkqCcsICfgpI/gpJUg4KSm4KWA4KS4J10sXG4gICAgICAgICAgICBkZDogW251bWJlciArICcg4KSm4KS/4KS44KS+4KSC4KSo4KWAJywgbnVtYmVyICsgJyDgpKbgpYDgpLgnXSxcbiAgICAgICAgICAgIE06IFsn4KSP4KSV4KS+IOCkruCljeCkueCkr+CkqOCljeCkr+CkvuCkqCcsICfgpI/gpJUg4KSu4KWN4KS54KSv4KSo4KWLJ10sXG4gICAgICAgICAgICBNTTogW251bWJlciArICcg4KSu4KWN4KS54KSv4KSo4KWN4KSv4KS+4KSo4KWAJywgbnVtYmVyICsgJyDgpK7gpY3gpLngpK/gpKjgpYcnXSxcbiAgICAgICAgICAgIHk6IFsn4KSP4KSV4KS+IOCkteCksOCljeCkuOCkvuCkqCcsICfgpI/gpJUg4KS14KSw4KWN4KS4J10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcg4KS14KSw4KWN4KS44KS+4KSC4KSo4KWAJywgbnVtYmVyICsgJyDgpLXgpLDgpY3gpLjgpL7gpIInXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG5cbiAgICB2YXIgZ29tRGV2YSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2dvbS1kZXZhJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ+CknOCkvuCkqOClh+CkteCkvuCksOClgF/gpKvgpYfgpKzgpY3gpLDgpYHgpLXgpL7gpLDgpYBf4KSu4KS+4KSw4KWN4KSaX+Ckj+CkquCljeCksOClgOCksl/gpK7gpYdf4KSc4KWC4KSoX+CknOClgeCksuCkr1/gpJHgpJfgpLjgpY3gpJ9f4KS44KSq4KWN4KSf4KWH4KSC4KSs4KSwX+CkkeCkleCljeCkn+Cli+CkrOCksF/gpKjgpYvgpLXgpY3gpLngpYfgpILgpKzgpLBf4KSh4KS/4KS44KWH4KSC4KSs4KSwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ+CknOCkvuCkqOClh+CkteCkvuCksOClgOCkmuCljeCkr+Ckvl/gpKvgpYfgpKzgpY3gpLDgpYHgpLXgpL7gpLDgpYDgpJrgpY3gpK/gpL5f4KSu4KS+4KSw4KWN4KSa4KS+4KSa4KWN4KSv4KS+X+Ckj+CkquCljeCksOClgOCksuCkvuCkmuCljeCkr+Ckvl/gpK7gpYfgpK/gpL7gpJrgpY3gpK/gpL5f4KSc4KWC4KSo4KS+4KSa4KWN4KSv4KS+X+CknOClgeCksuCkr+CkvuCkmuCljeCkr+Ckvl/gpJHgpJfgpLjgpY3gpJ/gpL7gpJrgpY3gpK/gpL5f4KS44KSq4KWN4KSf4KWH4KSC4KSs4KSw4KS+4KSa4KWN4KSv4KS+X+CkkeCkleCljeCkn+Cli+CkrOCksOCkvuCkmuCljeCkr+Ckvl/gpKjgpYvgpLXgpY3gpLngpYfgpILgpKzgpLDgpL7gpJrgpY3gpK/gpL5f4KSh4KS/4KS44KWH4KSC4KSs4KSw4KS+4KSa4KWN4KSv4KS+Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL01NTU0oXFxzKStEW29EXT8vLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgpJzgpL7gpKjgpYcuX+Ckq+Clh+CkrOCljeCksOClgS5f4KSu4KS+4KSw4KWN4KSaX+Ckj+CkquCljeCksOClgC5f4KSu4KWHX+CknOClguCkqF/gpJzgpYHgpLIuX+CkkeCkly5f4KS44KSq4KWN4KSf4KWH4KSCLl/gpJHgpJXgpY3gpJ/gpYsuX+CkqOCli+CkteCljeCkueClh+Ckgi5f4KSh4KS/4KS44KWH4KSCLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+CkhuCkr+CkpOCkvuCksF/gpLjgpYvgpK7gpL7gpLBf4KSu4KSC4KSX4KSz4KS+4KSwX+CkrOClgeCkp+CkteCkvuCksF/gpKzgpL/gpLDgpYfgpLjgpY3gpKTgpL7gpLBf4KS44KWB4KSV4KWN4KSw4KS+4KSwX+CktuClh+CkqOCkteCkvuCksCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CkhuCkr+CkpC5f4KS44KWL4KSuLl/gpK7gpILgpJfgpLMuX+CkrOClgeCkpy5f4KSs4KWN4KSw4KWH4KS44KWN4KSkLl/gpLjgpYHgpJXgpY3gpLAuX+CktuClh+CkqC4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4KSGX+CkuOCli1/gpK7gpIJf4KSs4KWBX+CkrOCljeCksOClh1/gpLjgpYFf4KS24KWHJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSBb4KS14KS+4KSc4KSk4KS+4KSCXScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MgW+CkteCkvuCknOCkpOCkvuCkgl0nLFxuICAgICAgICAgICAgTDogJ0RELU1NLVlZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBBIGg6bW0gW+CkteCkvuCknOCkpOCkvuCkgl0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gRG8sIFlZWVksIEEgaDptbSBb4KS14KS+4KSc4KSk4KS+4KSCXScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBEIE1NTSBZWVlZLCBBIGg6bW0gW+CkteCkvuCknOCkpOCkvuCkgl0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgpIbgpK/gpJxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KSr4KS+4KSy4KWN4KSv4KS+4KSCXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vgpKvgpYHgpKHgpLLgpYtdIGRkZGRbLF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgpJXgpL7gpLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+Ckq+CkvuCkn+CksuCli10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgpIbgpKbgpYDgpIInLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o4KS14KWH4KSwKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgb3JkaW5hbCAn4KS14KWH4KSwJyBvbmx5IGFwcGxpZXMgdG8gZGF5IG9mIHRoZSBtb250aFxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+CkteClh+CksCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrXG4gICAgICAgICAgICBkb3k6IDMsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhciAoNyArIDAgLSA0KVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4KSw4KS+4KSk4KWAfOCkuOCkleCkvuCks+ClgOCkgnzgpKbgpKjgpKrgpL7gpLDgpL7gpIJ84KS44KS+4KSC4KSc4KWHLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4KSw4KS+4KSk4KWAJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KS44KSV4KS+4KSz4KWA4KSCJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkpuCkqOCkquCkvuCksOCkvuCkgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+IDEyID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLjgpL7gpILgpJzgpYcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSk4KWAJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpJXgpL7gpLPgpYDgpIInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkpuCkqOCkquCkvuCksOCkvuCkgic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KS+4KSC4KSc4KWHJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpYAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdvbURldmE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS29ua2FuaSBMYXRpbiBzY3JpcHQgW2dvbS1sYXRuXVxuLy8hIGF1dGhvciA6IFRoZSBEaXNjb3ZlcmVyIDogaHR0cHM6Ly9naXRodWIuY29tL1dpa2lEaXNjb3ZlcmVyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgczogWyd0aG9kZGVhIHNla29uZGFtbmknLCAndGhvZGRlIHNla29uZCddLFxuICAgICAgICAgICAgc3M6IFtudW1iZXIgKyAnIHNla29uZGFtbmknLCBudW1iZXIgKyAnIHNla29uZCddLFxuICAgICAgICAgICAgbTogWydla2EgbWludGFuJywgJ2VrIG1pbnV0J10sXG4gICAgICAgICAgICBtbTogW251bWJlciArICcgbWludGFtbmknLCBudW1iZXIgKyAnIG1pbnRhbSddLFxuICAgICAgICAgICAgaDogWydla2Egdm9yYW4nLCAnZWsgdm9yJ10sXG4gICAgICAgICAgICBoaDogW251bWJlciArICcgdm9yYW1uaScsIG51bWJlciArICcgdm9yYW0nXSxcbiAgICAgICAgICAgIGQ6IFsnZWthIGRpc2FuJywgJ2VrIGRpcyddLFxuICAgICAgICAgICAgZGQ6IFtudW1iZXIgKyAnIGRpc2FtbmknLCBudW1iZXIgKyAnIGRpcyddLFxuICAgICAgICAgICAgTTogWydla2EgbWhvaW5lYW4nLCAnZWsgbWhvaW5vJ10sXG4gICAgICAgICAgICBNTTogW251bWJlciArICcgbWhvaW5lYW1uaScsIG51bWJlciArICcgbWhvaW5lJ10sXG4gICAgICAgICAgICB5OiBbJ2VrYSB2b3JzYW4nLCAnZWsgdm9yb3MnXSxcbiAgICAgICAgICAgIHl5OiBbbnVtYmVyICsgJyB2b3JzYW1uaScsIG51bWJlciArICcgdm9yc2FtJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc0Z1dHVyZSA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGdvbUxhdG4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdnb20tbGF0bicsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdKYW5lcl9GZWJyZXJfTWFyc19BYnJpbF9NYWlfSnVuX0p1bGFpX0Fnb3N0X1NldGVtYnJfT3R1YnJfTm92ZW1icl9EZXplbWJyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ0phbmVyYWNoZWFfRmVicmVyYWNoZWFfTWFyc2FjaGVhX0FicmlsYWNoZWFfTWFpYWNoZWFfSnVuYWNoZWFfSnVsYWlhY2hlYV9BZ29zdGFjaGVhX1NldGVtYnJhY2hlYV9PdHVicmFjaGVhX05vdmVtYnJhY2hlYV9EZXplbWJyYWNoZWEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvTU1NTShcXHMpK0Rbb0RdPy8sXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0phbi5fRmViLl9NYXJzX0Fici5fTWFpX0p1bl9KdWwuX0Fnby5fU2V0Ll9PdHUuX05vdi5fRGV6Licuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6IFwiQWl0YXJfU29tYXJfTW9uZ2xsYXJfQnVkaHZhcl9CaXJlc3Rhcl9TdWtyYXJfU29uJ3ZhclwiLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdBaXQuX1NvbS5fTW9uLl9CdWQuX0JyZS5fU3VrLl9Tb24uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0FpX1NtX01vX0J1X0JyX1N1X1NuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSBbdmF6dGFdJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyBbdmF6dGFdJyxcbiAgICAgICAgICAgIEw6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgQSBoOm1tIFt2YXp0YV0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gRG8sIFlZWVksIEEgaDptbSBbdmF6dGFdJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIEQgTU1NIFlZWVksIEEgaDptbSBbdmF6dGFdJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQWl6XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0ZhbGVhbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbRnVkZGxvXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS2FsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tGYXR0bG9dIGRkZGRbLF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWRpbScsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShlcikvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIG9yZGluYWwgJ2VyJyBvbmx5IGFwcGxpZXMgdG8gZGF5IG9mIHRoZSBtb250aFxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ2VyJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWtcbiAgICAgICAgICAgIGRveTogMywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyICg3ICsgMCAtIDQpXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9yYXRpfHNva2FsbGltfGRvbnBhcmFtfHNhbmplLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAncmF0aScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3Nva2FsbGltJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ2RvbnBhcmFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID4gMTIgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NhbmplJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JhdGknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3Nva2FsbGltJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkb25wYXJhbSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc2FuamUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JhdGknO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdvbUxhdG47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR3VqYXJhdGkgW2d1XVxuLy8hIGF1dGhvciA6IEthdXNoaWsgVGhhbmtpIDogaHR0cHM6Ly9naXRodWIuY29tL0thdXNoaWsxOTg3XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+CrpycsXG4gICAgICAgICAgICAyOiAn4KuoJyxcbiAgICAgICAgICAgIDM6ICfgq6knLFxuICAgICAgICAgICAgNDogJ+CrqicsXG4gICAgICAgICAgICA1OiAn4KurJyxcbiAgICAgICAgICAgIDY6ICfgq6wnLFxuICAgICAgICAgICAgNzogJ+CrrScsXG4gICAgICAgICAgICA4OiAn4KuuJyxcbiAgICAgICAgICAgIDk6ICfgq68nLFxuICAgICAgICAgICAgMDogJ+CrpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgq6cnOiAnMScsXG4gICAgICAgICAgICAn4KuoJzogJzInLFxuICAgICAgICAgICAgJ+CrqSc6ICczJyxcbiAgICAgICAgICAgICfgq6onOiAnNCcsXG4gICAgICAgICAgICAn4KurJzogJzUnLFxuICAgICAgICAgICAgJ+CrrCc6ICc2JyxcbiAgICAgICAgICAgICfgq60nOiAnNycsXG4gICAgICAgICAgICAn4KuuJzogJzgnLFxuICAgICAgICAgICAgJ+Crryc6ICc5JyxcbiAgICAgICAgICAgICfgq6YnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgZ3UgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdndScsIHtcbiAgICAgICAgbW9udGhzOiAn4Kqc4Kq+4Kqo4KuN4Kqv4KuB4KqG4Kqw4KuAX+Cqq+Crh+CqrOCrjeCqsOCrgeCqhuCqsOCrgF/gqq7gqr7gqrDgq43gqppf4KqP4Kqq4KuN4Kqw4Kq/4KqyX+CqruCrh1/gqpzgq4Lgqqhf4Kqc4KuB4Kqy4Kq+4KqIX+CqkeCql+CquOCrjeCqn1/gqrjgqqrgq43gqp/gq4fgqq7gq43gqqzgqrBf4KqR4KqV4KuN4Kqf4KuN4Kqs4KqwX+CqqOCqteCrh+CqruCrjeCqrOCqsF/gqqHgqr/gqrjgq4fgqq7gq43gqqzgqrAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CqnOCqvuCqqOCrjeCqr+CrgS5f4Kqr4KuH4Kqs4KuN4Kqw4KuBLl/gqq7gqr7gqrDgq43gqppf4KqP4Kqq4KuN4Kqw4Kq/Ll/gqq7gq4df4Kqc4KuC4KqoX+CqnOCrgeCqsuCqvi5f4KqR4KqXLl/gqrjgqqrgq43gqp/gq4cuX+CqkeCqleCrjeCqn+CrjS5f4Kqo4Kq14KuHLl/gqqHgqr/gqrjgq4cuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn4Kqw4Kq14Kq/4Kq14Kq+4KqwX+CquOCri+CqruCqteCqvuCqsF/gqq7gqoLgqpfgqrPgqrXgqr7gqrBf4Kqs4KuB4Kqn4KuN4Kq14Kq+4KqwX+Cql+CrgeCqsOCrgeCqteCqvuCqsF/gqrbgq4HgqpXgq43gqrDgqrXgqr7gqrBf4Kq24Kqo4Kq/4Kq14Kq+4KqwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4Kqw4Kq14Kq/X+CquOCri+Cqrl/gqq7gqoLgqpfgqrNf4Kqs4KuB4Kqn4KuNX+Cql+CrgeCqsOCrgV/gqrbgq4HgqpXgq43gqrBf4Kq24Kqo4Kq/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CqsF/gqrjgq4tf4Kqu4KqCX+CqrOCrgV/gqpfgq4Ff4Kq24KuBX+Cqticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIOCqteCqvuCql+CrjeCqr+CrhycsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3Mg4Kq14Kq+4KqX4KuN4Kqv4KuHJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgqrXgqr7gqpfgq43gqq/gq4cnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4Kq14Kq+4KqX4KuN4Kqv4KuHJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KqG4KqcXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CqleCqvuCqsuCrh10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+Cql+Cqh+CqleCqvuCqsuCrh10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4Kqq4Kq+4Kqb4Kqy4Kq+XSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCqruCqvicsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4Kqq4Kq54KuH4Kqy4Kq+JyxcbiAgICAgICAgICAgIHM6ICfgqoXgqq7gq4HgqpUg4Kqq4Kqz4KuLJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Kq44KuH4KqV4KqC4KqhJyxcbiAgICAgICAgICAgIG06ICfgqo/gqpUg4Kqu4Kq/4Kqo4Kq/4KqfJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4Kqu4Kq/4Kqo4Kq/4KqfJyxcbiAgICAgICAgICAgIGg6ICfgqo/gqpUg4KqV4Kqy4Kq+4KqVJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KqV4Kqy4Kq+4KqVJyxcbiAgICAgICAgICAgIGQ6ICfgqo/gqpUg4Kqm4Kq/4Kq14Kq4JyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Kqm4Kq/4Kq14Kq4JyxcbiAgICAgICAgICAgIE06ICfgqo/gqpUg4Kqu4Kq54Kq/4Kqo4KuLJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4Kqu4Kq54Kq/4Kqo4KuLJyxcbiAgICAgICAgICAgIHk6ICfgqo/gqpUg4Kq14Kqw4KuN4Kq3JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Kq14Kqw4KuN4Kq3JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Crp+CrqOCrqeCrquCrq+CrrOCrreCrruCrr+Crpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gR3VqYXJhdGkgbm90YXRpb24gZm9yIG1lcmlkaWVtcyBhcmUgcXVpdGUgZnV6enkgaW4gcHJhY3RpY2UuIFdoaWxlIHRoZXJlIGV4aXN0c1xuICAgICAgICAvLyBhIHJpZ2lkIG5vdGlvbiBvZiBhICdQYWhhcicgaXQgaXMgbm90IHVzZWQgYXMgcmlnaWRseSBpbiBtb2Rlcm4gR3VqYXJhdGkuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gqrDgqr7gqqR84Kqs4Kqq4KuL4KqwfOCquOCqteCqvuCqsHzgqrjgqr7gqoLgqpwvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgqrDgqr7gqqQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqrjgqrXgqr7gqrAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kqs4Kqq4KuL4KqwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqrjgqr7gqoLgqpwnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kqw4Kq+4KqkJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqrjgqrXgqr7gqrAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CqrOCqquCri+CqsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kq44Kq+4KqC4KqcJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqrDgqr7gqqQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3U7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSGVicmV3IFtoZV1cbi8vISBhdXRob3IgOiBUb21lciBDb2hlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS90b21lclxuLy8hIGF1dGhvciA6IE1vc2hlIFNpbWFudG92IDogaHR0cHM6Ly9naXRodWIuY29tL0RldmVsb3BtZW50SUxcbi8vISBhdXRob3IgOiBUYWwgQXRlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9UYWxBdGVyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgaGUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdoZScsIHtcbiAgICAgICAgbW9udGhzOiAn15nXoNeV15DXqF/XpNeR16jXldeQ16hf157XqNelX9eQ16TXqNeZ15xf157XkNeZX9eZ15XXoNeZX9eZ15XXnNeZX9eQ15XXkteV16HXmF/Xodek15jXnteR16hf15DXlden15jXldeR16hf16DXldeR157XkdeoX9eT16bXnteR16gnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9eZ16DXldezX9ek15HXqNezX9ee16jXpV/XkNek16jXs1/XnteQ15lf15nXldeg15lf15nXldec15lf15DXldeS17Nf16HXpNeY17Nf15DXlden17Nf16DXldeR17Nf15PXptee17MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn16jXkNep15XXn1/Xqdeg15lf16nXnNeZ16nXmV/XqNeR15nXoteZX9eX157Xmdep15lf16nXmdep15lf16nXkdeqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn15DXs1/XkdezX9eS17Nf15PXs1/XlNezX9eV17Nf16nXsycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfXkF/XkV/Xkl/Xk1/XlF/XlV/XqScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFvXkV1NTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBb15FdTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFvXkV1NTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgbDogJ0QvTS9ZWVlZJyxcbiAgICAgICAgICAgIGxsOiAnRCBNTU0gWVlZWScsXG4gICAgICAgICAgICBsbGw6ICdEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIEQgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vXlNeZ15XXnSDXkda+XUxUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb157Xl9eoINeR1r5dTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvXkdep16LXlF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vXkNeq157XldecINeR1r5dTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb15HXmdeV151dIGRkZGQgW9eU15DXl9eo15XXnyDXkdep16LXlF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfXkdei15XXkyAlcycsXG4gICAgICAgICAgICBwYXN0OiAn15zXpNeg15kgJXMnLFxuICAgICAgICAgICAgczogJ9ee16HXpNeoINep16DXmdeV16onLFxuICAgICAgICAgICAgc3M6ICclZCDXqdeg15nXldeqJyxcbiAgICAgICAgICAgIG06ICfXk9en15QnLFxuICAgICAgICAgICAgbW06ICclZCDXk9en15XXqicsXG4gICAgICAgICAgICBoOiAn16nXoteUJyxcbiAgICAgICAgICAgIGhoOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9ep16LXqteZ15nXnSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINep16LXldeqJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkOiAn15nXldedJyxcbiAgICAgICAgICAgIGRkOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9eZ15XXnteZ15nXnSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINeZ157XmdedJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBNOiAn15fXldeT16knLFxuICAgICAgICAgICAgTU06IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAn15fXldeT16nXmdeZ150nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDXl9eV15PXqdeZ150nO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHk6ICfXqdeg15QnLFxuICAgICAgICAgICAgeXk6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAn16nXoNeq15nXmdedJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciAlIDEwID09PSAwICYmIG51bWJlciAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg16nXoNeUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg16nXoNeZ150nO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTpcbiAgICAgICAgICAgIC/XkNeX15RcItemfNec16TXoNeUXCLXpnzXkNeX16jXmSDXlNem15TXqNeZ15nXnXzXnNek16DXmSDXlNem15TXqNeZ15nXnXzXnNek16DXldeqINeR15XXp9eofNeR15HXlden16h815HXoteo15EvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o15DXl9eUXCLXpnzXkNeX16jXmSDXlNem15TXqNeZ15nXnXzXkdei16jXkSkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn15zXpNeg15XXqiDXkdeV16fXqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn15HXkdeV16fXqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ9ec16TXoNeUXCLXpicgOiAn15zXpNeg15kg15TXpteU16jXmdeZ150nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfXkNeX15RcItemJyA6ICfXkNeX16jXmSDXlNem15TXqNeZ15nXnSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn15HXoteo15EnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhlO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEhpbmRpIFtoaV1cbi8vISBhdXRob3IgOiBNYXlhbmsgU2luZ2hhbCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXlhbmtzaW5naGFsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+ClpycsXG4gICAgICAgICAgICAyOiAn4KWoJyxcbiAgICAgICAgICAgIDM6ICfgpaknLFxuICAgICAgICAgICAgNDogJ+ClqicsXG4gICAgICAgICAgICA1OiAn4KWrJyxcbiAgICAgICAgICAgIDY6ICfgpawnLFxuICAgICAgICAgICAgNzogJ+ClrScsXG4gICAgICAgICAgICA4OiAn4KWuJyxcbiAgICAgICAgICAgIDk6ICfgpa8nLFxuICAgICAgICAgICAgMDogJ+ClpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgpacnOiAnMScsXG4gICAgICAgICAgICAn4KWoJzogJzInLFxuICAgICAgICAgICAgJ+ClqSc6ICczJyxcbiAgICAgICAgICAgICfgpaonOiAnNCcsXG4gICAgICAgICAgICAn4KWrJzogJzUnLFxuICAgICAgICAgICAgJ+ClrCc6ICc2JyxcbiAgICAgICAgICAgICfgpa0nOiAnNycsXG4gICAgICAgICAgICAn4KWuJzogJzgnLFxuICAgICAgICAgICAgJ+Clryc6ICc5JyxcbiAgICAgICAgICAgICfgpaYnOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL17gpJzgpKgvaSxcbiAgICAgICAgICAgIC9e4KSr4KS84KSwfOCkq+CksC9pLFxuICAgICAgICAgICAgL17gpK7gpL7gpLDgpY3gpJovaSxcbiAgICAgICAgICAgIC9e4KSF4KSq4KWN4KSw4KWIL2ksXG4gICAgICAgICAgICAvXuCkruCkiC9pLFxuICAgICAgICAgICAgL17gpJzgpYLgpKgvaSxcbiAgICAgICAgICAgIC9e4KSc4KWB4KSyL2ksXG4gICAgICAgICAgICAvXuCkheCkly9pLFxuICAgICAgICAgICAgL17gpLjgpL/gpKTgpIJ84KS44KS/4KSkL2ksXG4gICAgICAgICAgICAvXuCkheCkleCljeCkn+Clgi9pLFxuICAgICAgICAgICAgL17gpKjgpLV84KSo4KS14KSCL2ksXG4gICAgICAgICAgICAvXuCkpuCkv+CkuOCkgnzgpKbgpL/gpLgvaSxcbiAgICAgICAgXSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9e4KSc4KSoL2ksXG4gICAgICAgICAgICAvXuCkq+CkvOCksC9pLFxuICAgICAgICAgICAgL17gpK7gpL7gpLDgpY3gpJovaSxcbiAgICAgICAgICAgIC9e4KSF4KSq4KWN4KSw4KWIL2ksXG4gICAgICAgICAgICAvXuCkruCkiC9pLFxuICAgICAgICAgICAgL17gpJzgpYLgpKgvaSxcbiAgICAgICAgICAgIC9e4KSc4KWB4KSyL2ksXG4gICAgICAgICAgICAvXuCkheCkly9pLFxuICAgICAgICAgICAgL17gpLjgpL/gpKQvaSxcbiAgICAgICAgICAgIC9e4KSF4KSV4KWN4KSf4KWCL2ksXG4gICAgICAgICAgICAvXuCkqOCktS9pLFxuICAgICAgICAgICAgL17gpKbgpL/gpLgvaSxcbiAgICAgICAgXTtcblxuICAgIHZhciBoaSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2hpJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ+CknOCkqOCkteCksOClgF/gpKvgpLzgpLDgpLXgpLDgpYBf4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCliOCksl/gpK7gpIhf4KSc4KWC4KSoX+CknOClgeCksuCkvuCkiF/gpIXgpJfgpLjgpY3gpKRf4KS44KS/4KSk4KSu4KWN4KSs4KSwX+CkheCkleCljeCkn+ClguCkrOCksF/gpKjgpLXgpK7gpY3gpKzgpLBf4KSm4KS/4KS44KSu4KWN4KSs4KSwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfgpJzgpKjgpLXgpLDgpYBf4KSr4KSw4KS14KSw4KWAX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpYjgpLJf4KSu4KSIX+CknOClguCkqF/gpJzgpYHgpLLgpL7gpIhf4KSF4KSX4KS44KWN4KSkX+CkuOCkv+CkpOCkguCkrOCksF/gpIXgpJXgpY3gpJ/gpYLgpKzgpLBf4KSo4KS14KSC4KSs4KSwX+CkpuCkv+CkuOCkguCkrOCksCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CknOCkqC5f4KSr4KS84KSwLl/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KWILl/gpK7gpIhf4KSc4KWC4KSoX+CknOClgeCksi5f4KSF4KSXLl/gpLjgpL/gpKQuX+CkheCkleCljeCkn+Clgi5f4KSo4KS1Ll/gpKbgpL/gpLguJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ+CksOCkteCkv+CkteCkvuCksF/gpLjgpYvgpK7gpLXgpL7gpLBf4KSu4KSC4KSX4KSy4KS14KS+4KSwX+CkrOClgeCkp+CkteCkvuCksF/gpJfgpYHgpLDgpYLgpLXgpL7gpLBf4KS24KWB4KSV4KWN4KSw4KS14KS+4KSwX+CktuCkqOCkv+CkteCkvuCksCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CksOCkteCkv1/gpLjgpYvgpK5f4KSu4KSC4KSX4KSyX+CkrOClgeCkp1/gpJfgpYHgpLDgpYJf4KS24KWB4KSV4KWN4KSwX+CktuCkqOCkvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgpLBf4KS44KWLX+CkruCkgl/gpKzgpYFf4KSX4KWBX+CktuClgV/gpLYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCkrOCknOClhycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCkrOCknOClhycsXG4gICAgICAgIH0sXG5cbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBzaG9ydE1vbnRoc1BhcnNlLFxuXG4gICAgICAgIG1vbnRoc1JlZ2V4OlxuICAgICAgICAgICAgL14o4KSc4KSo4KS14KSw4KWAfOCknOCkqFxcLj984KSr4KS84KSw4KS14KSw4KWAfOCkq+CksOCkteCksOClgHzgpKvgpLzgpLBcXC4/fOCkruCkvuCksOCljeCkmj984KSF4KSq4KWN4KSw4KWI4KSyfOCkheCkquCljeCksOCliFxcLj984KSu4KSIP3zgpJzgpYLgpKg/fOCknOClgeCksuCkvuCkiHzgpJzgpYHgpLJcXC4/fOCkheCkl+CkuOCljeCkpHzgpIXgpJdcXC4/fOCkuOCkv+CkpOCkruCljeCkrOCksHzgpLjgpL/gpKTgpILgpKzgpLB84KS44KS/4KSkXFwuP3zgpIXgpJXgpY3gpJ/gpYLgpKzgpLB84KSF4KSV4KWN4KSf4KWCXFwuP3zgpKjgpLXgpK7gpY3gpKzgpLB84KSo4KS14KSC4KSs4KSwfOCkqOCktVxcLj984KSm4KS/4KS44KSu4KWN4KSs4KSwfOCkpuCkv+CkuOCkguCkrOCksHzgpKbgpL/gpLhcXC4/KS9pLFxuXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6XG4gICAgICAgICAgICAvXijgpJzgpKjgpLXgpLDgpYB84KSc4KSoXFwuP3zgpKvgpLzgpLDgpLXgpLDgpYB84KSr4KSw4KS14KSw4KWAfOCkq+CkvOCksFxcLj984KSu4KS+4KSw4KWN4KSaP3zgpIXgpKrgpY3gpLDgpYjgpLJ84KSF4KSq4KWN4KSw4KWIXFwuP3zgpK7gpIg/fOCknOClguCkqD984KSc4KWB4KSy4KS+4KSIfOCknOClgeCkslxcLj984KSF4KSX4KS44KWN4KSkfOCkheCkl1xcLj984KS44KS/4KSk4KSu4KWN4KSs4KSwfOCkuOCkv+CkpOCkguCkrOCksHzgpLjgpL/gpKRcXC4/fOCkheCkleCljeCkn+ClguCkrOCksHzgpIXgpJXgpY3gpJ/gpYJcXC4/fOCkqOCkteCkruCljeCkrOCksHzgpKjgpLXgpILgpKzgpLB84KSo4KS1XFwuP3zgpKbgpL/gpLjgpK7gpY3gpKzgpLB84KSm4KS/4KS44KSC4KSs4KSwfOCkpuCkv+CkuFxcLj8pL2ksXG5cbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXijgpJzgpKjgpLXgpLDgpYA/fOCkq+CkvOCksOCkteCksOClgHzgpKvgpLDgpLXgpLDgpYA/fOCkruCkvuCksOCljeCkmj984KSF4KSq4KWN4KSw4KWI4KSyP3zgpK7gpIg/fOCknOClguCkqD984KSc4KWB4KSy4KS+4KSIP3zgpIXgpJfgpLjgpY3gpKQ/fOCkuOCkv+CkpOCkruCljeCkrOCksHzgpLjgpL/gpKTgpILgpKzgpLB84KS44KS/4KSkP1xcLj984KSF4KSV4KWN4KSf4KWC4KSs4KSwfOCkheCkleCljeCkn+ClglxcLj984KSo4KS14KSu4KWN4KSs4KSwfOCkqOCkteCkguCkrOCksD984KSm4KS/4KS44KSu4KWN4KSs4KSwfOCkpuCkv+CkuOCkguCkrOCksD8pL2ksXG5cbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKOCknOCkqFxcLj984KSr4KS84KSwXFwuP3zgpK7gpL7gpLDgpY3gpJo/fOCkheCkquCljeCksOCliFxcLj984KSu4KSIP3zgpJzgpYLgpKg/fOCknOClgeCkslxcLj984KSF4KSXXFwuP3zgpLjgpL/gpKRcXC4/fOCkheCkleCljeCkn+ClglxcLj984KSo4KS1XFwuP3zgpKbgpL/gpLhcXC4/KS9pLFxuXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpJXgpLJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgpJXgpLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CkquCkv+Ckm+CksuClh10gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgpK7gpYfgpIInLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCkquCkueCksuClhycsXG4gICAgICAgICAgICBzOiAn4KSV4KWB4KSbIOCkueClgCDgpJXgpY3gpLfgpKMnLFxuICAgICAgICAgICAgc3M6ICclZCDgpLjgpYfgpJXgpILgpKEnLFxuICAgICAgICAgICAgbTogJ+Ckj+CklSDgpK7gpL/gpKjgpJ8nLFxuICAgICAgICAgICAgbW06ICclZCDgpK7gpL/gpKjgpJ8nLFxuICAgICAgICAgICAgaDogJ+Ckj+CklSDgpJjgpILgpJ/gpL4nLFxuICAgICAgICAgICAgaGg6ICclZCDgpJjgpILgpJ/gpYcnLFxuICAgICAgICAgICAgZDogJ+Ckj+CklSDgpKbgpL/gpKgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgpKbgpL/gpKgnLFxuICAgICAgICAgICAgTTogJ+Ckj+CklSDgpK7gpLngpYDgpKjgpYcnLFxuICAgICAgICAgICAgTU06ICclZCDgpK7gpLngpYDgpKjgpYcnLFxuICAgICAgICAgICAgeTogJ+Ckj+CklSDgpLXgpLDgpY3gpLcnLFxuICAgICAgICAgICAgeXk6ICclZCDgpLXgpLDgpY3gpLcnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4KWn4KWo4KWp4KWq4KWr4KWs4KWt4KWu4KWv4KWmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvLyBIaW5kaSBub3RhdGlvbiBmb3IgbWVyaWRpZW1zIGFyZSBxdWl0ZSBmdXp6eSBpbiBwcmFjdGljZS4gV2hpbGUgdGhlcmUgZXhpc3RzXG4gICAgICAgIC8vIGEgcmlnaWQgbm90aW9uIG9mIGEgJ1BhaGFyJyBpdCBpcyBub3QgdXNlZCBhcyByaWdpZGx5IGluIG1vZGVybiBIaW5kaS5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CksOCkvuCkpHzgpLjgpYHgpKzgpLl84KSm4KWL4KSq4KS54KSwfOCktuCkvuCkri8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CksOCkvuCkpCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOClgeCkrOCkuScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKbgpYvgpKrgpLngpLAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CktuCkvuCkricpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOClgeCkrOCkuSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KWL4KSq4KS54KSwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLbgpL7gpK4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBoaTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDcm9hdGlhbiBbaHJdXG4vLyEgYXV0aG9yIDogQm9qYW4gTWFya292acSHIDogaHR0cHM6Ly9naXRodWIuY29tL2JtYXJrb3ZpY1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnamVkbmEgbWludXRhJyA6ICdqZWRuZSBtaW51dGUnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRhJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2plZGFuIHNhdCcgOiAnamVkbm9nIHNhdGEnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdGknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdkYW4nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuYSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlYyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2EnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaHInLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAnc2lqZcSNbmphX3ZlbGphxI1lX2/FvnVqa2FfdHJhdm5qYV9zdmlibmphX2xpcG5qYV9zcnBuamFfa29sb3ZvemFfcnVqbmFfbGlzdG9wYWRhX3N0dWRlbm9nYV9wcm9zaW5jYScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnc2lqZcSNYW5qX3ZlbGphxI1hX2/FvnVqYWtfdHJhdmFual9zdmliYW5qX2xpcGFual9zcnBhbmpfa29sb3Zvel9ydWphbl9saXN0b3BhZF9zdHVkZW5pX3Byb3NpbmFjJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnc2lqLl92ZWxqLl9vxb51Ll90cmEuX3N2aS5fbGlwLl9zcnAuX2tvbC5fcnVqLl9saXMuX3N0dS5fcHJvLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGplbGphX3BvbmVkamVsamFrX3V0b3Jha19zcmlqZWRhX8SNZXR2cnRha19wZXRha19zdWJvdGEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZWQuX3Bvbi5fdXRvLl9zcmkuX8SNZXQuX3BldC5fc3ViLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb191dF9zcl/EjWVfcGVfc3UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRG8gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0RvIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEbyBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmFzIHVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc3V0cmEgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW25lZGplbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3JpamVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2p1xI1lciB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWx1XSBbbmVkamVsanVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbHVdIFtzcmlqZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWxlXSBbc3Vib3RlXSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWxpXSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByaWplICVzJyxcbiAgICAgICAgICAgIHM6ICdwYXIgc2VrdW5kaScsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiAnZGFuJyxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiAnbWplc2VjJyxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiAnZ29kaW51JyxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSHVuZ2FyaWFuIFtodV1cbi8vISBhdXRob3IgOiBBZGFtIEJydW5uZXIgOiBodHRwczovL2dpdGh1Yi5jb20vYWRhbWJydW5uZXJcbi8vISBhdXRob3IgOiBQZXRlciBWaXN6dCAgOiBodHRwczovL2dpdGh1Yi5jb20vcGFzc2F0Z3RcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB3ZWVrRW5kaW5ncyA9XG4gICAgICAgICd2YXPDoXJuYXAgaMOpdGbFkW4ga2VkZGVuIHN6ZXJkw6FuIGNzw7x0w7ZydMO2a8O2biBww6ludGVrZW4gc3pvbWJhdG9uJy5zcGxpdCgnICcpO1xuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIG51bSA9IG51bWJlcjtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4XG4gICAgICAgICAgICAgICAgICAgID8gJ27DqWjDoW55IG3DoXNvZHBlcmMnXG4gICAgICAgICAgICAgICAgICAgIDogJ27DqWjDoW55IG3DoXNvZHBlcmNlJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXgpXG4gICAgICAgICAgICAgICAgICAgID8gJyBtw6Fzb2RwZXJjJ1xuICAgICAgICAgICAgICAgICAgICA6ICcgbcOhc29kcGVyY2UnO1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIHBlcmMnIDogJyBwZXJjZScpO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgcGVyYycgOiAnIHBlcmNlJyk7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VneScgKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgw7NyYScgOiAnIMOzcsOhamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIMOzcmEnIDogJyDDs3LDoWphJyk7XG4gICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VneScgKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgbmFwJyA6ICcgbmFwamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIG5hcCcgOiAnIG5hcGphJyk7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VneScgKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgaMOzbmFwJyA6ICcgaMOzbmFwamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIGjDs25hcCcgOiAnIGjDs25hcGphJyk7XG4gICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VneScgKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgw6l2JyA6ICcgw6l2ZScpO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgw6l2JyA6ICcgw6l2ZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgZnVuY3Rpb24gd2Vlayhpc0Z1dHVyZSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGlzRnV0dXJlID8gJycgOiAnW23Dumx0XSAnKSArXG4gICAgICAgICAgICAnWycgK1xuICAgICAgICAgICAgd2Vla0VuZGluZ3NbdGhpcy5kYXkoKV0gK1xuICAgICAgICAgICAgJ10gTFRbLWtvcl0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIGh1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaHUnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnXDoXJfZmVicnXDoXJfbcOhcmNpdXNfw6FwcmlsaXNfbcOhanVzX2rDum5pdXNfasO6bGl1c19hdWd1c3p0dXNfc3plcHRlbWJlcl9va3TDs2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX23DoXJjLl/DoXByLl9tw6FqLl9qw7puLl9qw7psLl9hdWcuX3N6ZXB0Ll9va3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ3Zhc8Ohcm5hcF9ow6l0ZsWRX2tlZGRfc3plcmRhX2Nzw7x0w7ZydMO2a19ww6ludGVrX3N6b21iYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICd2YXNfaMOpdF9rZWRkX3N6ZV9jc8O8dF9ww6luX3N6bycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICd2X2hfa19zemVfY3NfcF9zem8nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS5NTS5ERC4nLFxuICAgICAgICAgICAgTEw6ICdZWVlZLiBNTU1NIEQuJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkuIE1NTU0gRC4gSDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWS4gTU1NTSBELiwgZGRkZCBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2RlfGR1L2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LmNoYXJBdCgxKS50b0xvd2VyQ2FzZSgpID09PSAndSc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPT09IHRydWUgPyAnZGUnIDogJ0RFJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPT09IHRydWUgPyAnZHUnIDogJ0RVJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbbWFdIExUWy1rb3JdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbaG9sbmFwXSBMVFsta29yXScsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3ZWVrLmNhbGwodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1t0ZWduYXBdIExUWy1rb3JdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdlZWsuY2FsbCh0aGlzLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBtw7psdmEnLFxuICAgICAgICAgICAgcGFzdDogJyVzJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBodTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcm1lbmlhbiBbaHktYW1dXG4vLyEgYXV0aG9yIDogQXJtZW5kYXJhYnlhbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcm1lbmRhcmFieWFuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgaHlBbSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2h5LWFtJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9Ww1bjWgtW21b7VodaA1atf1oPVpdW/1oDVvtWh1oDVq1/VtNWh1oDVv9WrX9Wh1brWgNWr1azVq1/VtNWh1bXVq9W91atf1bDVuNaC1bbVq9W91atf1bDVuNaC1azVq9W91atf1oXVo9W41b3Vv9W41b3Vq1/VvdWl1brVv9Wl1bTVotWl1oDVq1/VsNW41a/Vv9Wl1bTVotWl1oDVq1/VttW41bXVpdW01aLVpdaA1atf1aTVpdWv1b/VpdW01aLVpdaA1asnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9Ww1bjWgtW21b7VodaAX9aD1aXVv9aA1b7VodaAX9W01aHWgNW/X9Wh1brWgNWr1axf1bTVodW11avVvV/VsNW41oLVttWr1b1f1bDVuNaC1azVq9W9X9aF1aPVuNW91b/VuNW9X9W91aXVutW/1aXVtNWi1aXWgF/VsNW41a/Vv9Wl1bTVotWl1oBf1bbVuNW11aXVtNWi1aXWgF/VpNWl1a/Vv9Wl1bTVotWl1oAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDogJ9Ww1bbVvl/Wg9W/1oBf1bTWgNW/X9Wh1brWgF/VtNW11b1f1bDVttW9X9Ww1azVvV/WhdWj1b1f1b3VutW/X9Ww1a/Vv1/VttW01aJf1aTVr9W/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfVr9Wr1oDVodWv1atf1aXWgNWv1bjWgtW31aHVotWp1atf1aXWgNWl1oTVt9Wh1aLVqdWrX9W51bjWgNWl1oTVt9Wh1aLVqdWrX9Ww1avVttWj1bfVodWi1anVq1/VuNaC1oDVotWh1alf1bfVodWi1aHVqScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn1a/WgNWvX9Wl1oDVr1/VpdaA1oRf1bnWgNaEX9Ww1bbVo1/VuNaC1oDVol/Vt9Wi1aknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn1a/WgNWvX9Wl1oDVr1/VpdaA1oRf1bnWgNaEX9Ww1bbVo1/VuNaC1oDVol/Vt9Wi1aknLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVkg1akuJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZINWpLiwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZINWpLiwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vVodW11b3WhdaAXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9W+1aHVstWoXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9Wl1oDVpdWvXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBb1oXWgNWoINWq1aHVtNWoXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1vVodW21oHVodWuXSBkZGRkIFvWhdaA1agg1arVodW01ahdIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINWw1aXVv9W4JyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDVodW81aHVuycsXG4gICAgICAgICAgICBzOiAn1bTVqyDWhNWh1bbVqyDVvtWh1bXWgNWv1bXVodW2JyxcbiAgICAgICAgICAgIHNzOiAnJWQg1b7VodW11oDVr9W11aHVticsXG4gICAgICAgICAgICBtOiAn1oDVuNW61aUnLFxuICAgICAgICAgICAgbW06ICclZCDWgNW41brVpScsXG4gICAgICAgICAgICBoOiAn1arVodW0JyxcbiAgICAgICAgICAgIGhoOiAnJWQg1arVodW0JyxcbiAgICAgICAgICAgIGQ6ICfWhdaAJyxcbiAgICAgICAgICAgIGRkOiAnJWQg1oXWgCcsXG4gICAgICAgICAgICBNOiAn1aHVtNWr1b0nLFxuICAgICAgICAgICAgTU06ICclZCDVodW01avVvScsXG4gICAgICAgICAgICB5OiAn1b/VodaA1asnLFxuICAgICAgICAgICAgeXk6ICclZCDVv9Wh1oDVqycsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/Vo9Wr1bfVpdaA1b7VoXzVodW81aHVvtW41b/VvtWhfNaB1aXWgNWl1a/VvtWhfNWl1oDVpdWv1bjVtdWh1bYvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijWgdWl1oDVpdWv1b7VoXzVpdaA1aXVr9W41bXVodW2KSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1aPVq9W31aXWgNW+1aEnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Wh1bzVodW+1bjVv9W+1aEnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9aB1aXWgNWl1a/VvtWhJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfVpdaA1aXVr9W41bXVodW2JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9fFxcZHsxLDJ9LSjVq9W2fNaA1aQpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREbyc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdWr1bYnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdaA1aQnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBoeUFtO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEluZG9uZXNpYW4gW2lkXVxuLy8hIGF1dGhvciA6IE1vaGFtbWFkIFNhdHJpbyBVdG9tbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS90eW9rXG4vLyEgcmVmZXJlbmNlOiBodHRwOi8vaWQud2lraXNvdXJjZS5vcmcvd2lraS9QZWRvbWFuX1VtdW1fRWphYW5fQmFoYXNhX0luZG9uZXNpYV95YW5nX0Rpc2VtcHVybmFrYW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBpZCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2lkJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpX0ZlYnJ1YXJpX01hcmV0X0FwcmlsX01laV9KdW5pX0p1bGlfQWd1c3R1c19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWVpX0p1bl9KdWxfQWd0X1NlcF9Pa3RfTm92X0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdNaW5nZ3VfU2VuaW5fU2VsYXNhX1JhYnVfS2FtaXNfSnVtYXRfU2FidHUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdNaW5fU2VuX1NlbF9SYWJfS2FtX0p1bV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnTWdfU25fU2xfUmJfS21fSm1fU2InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hILm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9wYWdpfHNpYW5nfHNvcmV8bWFsYW0vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdwYWdpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NpYW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzb3JlJyB8fCBtZXJpZGllbSA9PT0gJ21hbGFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdwYWdpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc2lhbmcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzb3JlJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdtYWxhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hhcmkgaW5pIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0Jlc29rIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3B1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0tlbWFyaW4gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbbGFsdSBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkYWxhbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgeWFuZyBsYWx1JyxcbiAgICAgICAgICAgIHM6ICdiZWJlcmFwYSBkZXRpaycsXG4gICAgICAgICAgICBzczogJyVkIGRldGlrJyxcbiAgICAgICAgICAgIG06ICdzZW1lbml0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWVuaXQnLFxuICAgICAgICAgICAgaDogJ3NlamFtJyxcbiAgICAgICAgICAgIGhoOiAnJWQgamFtJyxcbiAgICAgICAgICAgIGQ6ICdzZWhhcmknLFxuICAgICAgICAgICAgZGQ6ICclZCBoYXJpJyxcbiAgICAgICAgICAgIE06ICdzZWJ1bGFuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgYnVsYW4nLFxuICAgICAgICAgICAgeTogJ3NldGFodW4nLFxuICAgICAgICAgICAgeXk6ICclZCB0YWh1bicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpZDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBJY2VsYW5kaWMgW2lzXVxuLy8hIGF1dGhvciA6IEhpbnJpayDDlnJuIFNpZ3Vyw7Bzc29uIDogaHR0cHM6Ly9naXRodWIuY29tL2hpbnJpa1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcGx1cmFsKG4pIHtcbiAgICAgICAgaWYgKG4gJSAxMDAgPT09IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChuICUgMTAgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmVcbiAgICAgICAgICAgICAgICAgICAgPyAnbm9ra3JhciBzZWvDum5kdXInXG4gICAgICAgICAgICAgICAgICAgIDogJ25va2tydW0gc2Vrw7puZHVtJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArXG4gICAgICAgICAgICAgICAgICAgICAgICAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdzZWvDum5kdXInIDogJ3Nla8O6bmR1bScpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnc2Vrw7puZGEnO1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnbcOtbsO6dGEnIDogJ23DrW7DunR1JztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ23DrW7DunR1cicgOiAnbcOtbsO6dHVtJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtw61uw7p0YSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcOtbsO6dHUnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIGlmIChwbHVyYWwobnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAna2x1a2t1c3R1bmRpcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdrbHVra3VzdHVuZHVtJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdrbHVra3VzdHVuZCc7XG4gICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RhZ3VyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ2RhZycgOiAnZGVnaSc7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2RhZ2FyJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKGlzRnV0dXJlID8gJ2RhZ2EnIDogJ2TDtmd1bScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2RhZ3VyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdkYWcnIDogJ2RlZ2knKTtcbiAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnbcOhbnXDsHVyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ23DoW51w7AnIDogJ23DoW51w7BpJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcOhbnXDsGlyJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKGlzRnV0dXJlID8gJ23DoW51w7BpJyA6ICdtw6FudcOwdW0nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtw6FudcOwdXInO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKGlzRnV0dXJlID8gJ23DoW51w7AnIDogJ23DoW51w7BpJyk7XG4gICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICfDoXInIDogJ8OhcmknO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChwbHVyYWwobnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnw6FyJyA6ICfDoXJ1bScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnw6FyJyA6ICfDoXJpJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaXMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdpcycsIHtcbiAgICAgICAgbW9udGhzOiAnamFuw7phcl9mZWJyw7phcl9tYXJzX2FwcsOtbF9tYcOtX2rDum7DrV9qw7psw61fw6Fnw7pzdF9zZXB0ZW1iZXJfb2t0w7NiZXJfbsOzdmVtYmVyX2Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFyX2Fwcl9tYcOtX2rDum5fasO6bF/DoWfDul9zZXBfb2t0X27Ds3ZfZGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdzdW5udWRhZ3VyX23DoW51ZGFndXJfw75yacOwanVkYWd1cl9tacOwdmlrdWRhZ3VyX2ZpbW10dWRhZ3VyX2bDtnN0dWRhZ3VyX2xhdWdhcmRhZ3VyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzdW5fbcOhbl/DvnJpX21pw7BfZmltX2bDtnNfbGF1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X03DoV/DnnJfTWlfRmlfRsO2X0xhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIFtrbC5dIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBba2wuXSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbw60gZGFnIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vDoSBtb3JndW4ga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vDrSBnw6ZyIGtsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbc8Otw7Bhc3RhXSBkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZWZ0aXIgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2Z5cmlyICVzIHPDrcOwYW4nLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiAna2x1a2t1c3R1bmQnLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBJdGFsaWFuIChTd2l0emVybGFuZCkgW2l0LWNoXVxuLy8hIGF1dGhvciA6IHhmaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS94ZmhcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBpdENoID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaXQtY2gnLCB7XG4gICAgICAgIG1vbnRoczogJ2dlbm5haW9fZmViYnJhaW9fbWFyem9fYXByaWxlX21hZ2dpb19naXVnbm9fbHVnbGlvX2Fnb3N0b19zZXR0ZW1icmVfb3R0b2JyZV9ub3ZlbWJyZV9kaWNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdnZW5fZmViX21hcl9hcHJfbWFnX2dpdV9sdWdfYWdvX3NldF9vdHRfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21lbmljYV9sdW5lZMOsX21hcnRlZMOsX21lcmNvbGVkw6xfZ2lvdmVkw6xfdmVuZXJkw6xfc2FiYXRvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tX2x1bl9tYXJfbWVyX2dpb192ZW5fc2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX21lX2dpX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbT2dnaSBhbGxlXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0RvbWFuaSBhbGxlXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2FsbGVdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSWVyaSBhbGxlXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tsYSBzY29yc2FdIGRkZGQgW2FsbGVdIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW2xvIHNjb3Jzb10gZGRkZCBbYWxsZV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKC9eWzAtOV0uKyQvLnRlc3QocykgPyAndHJhJyA6ICdpbicpICsgJyAnICsgcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXN0OiAnJXMgZmEnLFxuICAgICAgICAgICAgczogJ2FsY3VuaSBzZWNvbmRpJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kaScsXG4gICAgICAgICAgICBtOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRpJyxcbiAgICAgICAgICAgIGg6IFwidW4nb3JhXCIsXG4gICAgICAgICAgICBoaDogJyVkIG9yZScsXG4gICAgICAgICAgICBkOiAndW4gZ2lvcm5vJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZ2lvcm5pJyxcbiAgICAgICAgICAgIE06ICd1biBtZXNlJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzaScsXG4gICAgICAgICAgICB5OiAndW4gYW5ubycsXG4gICAgICAgICAgICB5eTogJyVkIGFubmknLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0Q2g7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSXRhbGlhbiBbaXRdXG4vLyEgYXV0aG9yIDogTG9yZW56byA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGllbVxuLy8hIGF1dGhvcjogTWF0dGlhIExhcmVudGlzOiBodHRwczovL2dpdGh1Yi5jb20vbm9zdGFsZ2lhelxuLy8hIGF1dGhvcjogTWFyY28gOiBodHRwczovL2dpdGh1Yi5jb20vTWFuZnJlOThcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBpdCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2l0Jywge1xuICAgICAgICBtb250aHM6ICdnZW5uYWlvX2ZlYmJyYWlvX21hcnpvX2FwcmlsZV9tYWdnaW9fZ2l1Z25vX2x1Z2xpb19hZ29zdG9fc2V0dGVtYnJlX290dG9icmVfbm92ZW1icmVfZGljZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnZ2VuX2ZlYl9tYXJfYXByX21hZ19naXVfbHVnX2Fnb19zZXRfb3R0X25vdl9kaWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnZG9tZW5pY2FfbHVuZWTDrF9tYXJ0ZWTDrF9tZXJjb2xlZMOsX2dpb3ZlZMOsX3ZlbmVyZMOsX3NhYmF0bycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbV9sdW5fbWFyX21lcl9naW9fdmVuX3NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb19sdV9tYV9tZV9naV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tPZ2dpIGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSA+IDEgPyAnbGxlICcgOiB0aGlzLmhvdXJzKCkgPT09IDAgPyAnICcgOiBcImxsJ1wiKSArXG4gICAgICAgICAgICAgICAgICAgICddTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tEb21hbmkgYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpID4gMSA/ICdsbGUgJyA6IHRoaXMuaG91cnMoKSA9PT0gMCA/ICcgJyA6IFwibGwnXCIpICtcbiAgICAgICAgICAgICAgICAgICAgJ11MVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ2RkZGQgW2EnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSA+IDEgPyAnbGxlICcgOiB0aGlzLmhvdXJzKCkgPT09IDAgPyAnICcgOiBcImxsJ1wiKSArXG4gICAgICAgICAgICAgICAgICAgICddTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tJZXJpIGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSA+IDEgPyAnbGxlICcgOiB0aGlzLmhvdXJzKCkgPT09IDAgPyAnICcgOiBcImxsJ1wiKSArXG4gICAgICAgICAgICAgICAgICAgICddTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbTGEgc2NvcnNhXSBkZGRkIFthJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbGxlICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmhvdXJzKCkgPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJsbCdcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICddTFQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW0xvIHNjb3Jzb10gZGRkZCBbYScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2xsZSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5ob3VycygpID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwibGwnXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXUxUJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd0cmEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGZhJyxcbiAgICAgICAgICAgIHM6ICdhbGN1bmkgc2Vjb25kaScsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGknLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0aScsXG4gICAgICAgICAgICBoOiBcInVuJ29yYVwiLFxuICAgICAgICAgICAgaGg6ICclZCBvcmUnLFxuICAgICAgICAgICAgZDogJ3VuIGdpb3JubycsXG4gICAgICAgICAgICBkZDogJyVkIGdpb3JuaScsXG4gICAgICAgICAgICB3OiAndW5hIHNldHRpbWFuYScsXG4gICAgICAgICAgICB3dzogJyVkIHNldHRpbWFuZScsXG4gICAgICAgICAgICBNOiAndW4gbWVzZScsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2knLFxuICAgICAgICAgICAgeTogJ3VuIGFubm8nLFxuICAgICAgICAgICAgeXk6ICclZCBhbm5pJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpdDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBKYXBhbmVzZSBbamFdXG4vLyEgYXV0aG9yIDogTEkgTG9uZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYXJ5b25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBqYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2phJywge1xuICAgICAgICBlcmFzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcyMDE5LTA1LTAxJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+S7pOWSjCcsXG4gICAgICAgICAgICAgICAgbmFycm93OiAn44u/JyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnUicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMTk4OS0wMS0wOCcsXG4gICAgICAgICAgICAgICAgdW50aWw6ICcyMDE5LTA0LTMwJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+W5s+aIkCcsXG4gICAgICAgICAgICAgICAgbmFycm93OiAn4427JyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnSCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMTkyNi0xMi0yNScsXG4gICAgICAgICAgICAgICAgdW50aWw6ICcxOTg5LTAxLTA3JyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+aYreWSjCcsXG4gICAgICAgICAgICAgICAgbmFycm93OiAn4428JyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnUycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMTkxMi0wNy0zMCcsXG4gICAgICAgICAgICAgICAgdW50aWw6ICcxOTI2LTEyLTI0JyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+Wkp+atoycsXG4gICAgICAgICAgICAgICAgbmFycm93OiAn4429JyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnVCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMTg3My0wMS0wMScsXG4gICAgICAgICAgICAgICAgdW50aWw6ICcxOTEyLTA3LTI5JyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDYsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+aYjuayuycsXG4gICAgICAgICAgICAgICAgbmFycm93OiAn442+JyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnTScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMS0wMS0wMScsXG4gICAgICAgICAgICAgICAgdW50aWw6ICcxODczLTEyLTMxJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+ilv+aapicsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQUQnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdBRCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMC0xMi0zMScsXG4gICAgICAgICAgICAgICAgdW50aWw6IC1JbmZpbml0eSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+e0gOWFg+WJjScsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQkMnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdCQycsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBlcmFZZWFyT3JkaW5hbFJlZ2V4OiAvKOWFg3xcXGQrKeW5tC8sXG4gICAgICAgIGVyYVllYXJPcmRpbmFsUGFyc2U6IGZ1bmN0aW9uIChpbnB1dCwgbWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXSA9PT0gJ+WFgycgPyAxIDogcGFyc2VJbnQobWF0Y2hbMV0gfHwgaW5wdXQsIDEwKTtcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzOiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn5pel5puc5pelX+aciOabnOaXpV/ngavmm5zml6Vf5rC05puc5pelX+acqOabnOaXpV/ph5Hmm5zml6Vf5Zyf5puc5pelJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn5pelX+aciF/ngatf5rC0X+acqF/ph5Ff5ZyfJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+aXpV/mnIhf54GrX+awtF/mnKhf6YeRX+Wcnycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ5bm0TeaciETml6UgZGRkZCBISDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBsbDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnlubRN5pyIROaXpShkZGQpIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WNiOWJjXzljYjlvowvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfljYjlvownO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Y2I5YmNJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfljYjlvownO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vku4rml6VdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb5piO5pelXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmIChub3cud2VlaygpICE9PSB0aGlzLndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vmnaXpgLFdZGRkZCBMVCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1vmmKjml6VdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMud2VlaygpICE9PSBub3cud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+WFiOmAsV1kZGRkIExUJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3ml6UvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgPT09IDEgPyAn5YWD5bm0JyA6IG51bWJlciArICflubQnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz5b6MJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+WJjScsXG4gICAgICAgICAgICBzOiAn5pWw56eSJyxcbiAgICAgICAgICAgIHNzOiAnJWTnp5InLFxuICAgICAgICAgICAgbTogJzHliIYnLFxuICAgICAgICAgICAgbW06ICclZOWIhicsXG4gICAgICAgICAgICBoOiAnMeaZgumWkycsXG4gICAgICAgICAgICBoaDogJyVk5pmC6ZaTJyxcbiAgICAgICAgICAgIGQ6ICcx5pelJyxcbiAgICAgICAgICAgIGRkOiAnJWTml6UnLFxuICAgICAgICAgICAgTTogJzHjg7bmnIgnLFxuICAgICAgICAgICAgTU06ICclZOODtuaciCcsXG4gICAgICAgICAgICB5OiAnMeW5tCcsXG4gICAgICAgICAgICB5eTogJyVk5bm0JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBqYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBKYXZhbmVzZSBbanZdXG4vLyEgYXV0aG9yIDogUm9ueSBMYW50aXAgOiBodHRwczovL2dpdGh1Yi5jb20vbGFudGlwXG4vLyEgcmVmZXJlbmNlOiBodHRwOi8vanYud2lraXBlZGlhLm9yZy93aWtpL0Jhc2FfSmF3YVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGp2ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnanYnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcmlfRmVicnVhcmlfTWFyZXRfQXByaWxfTWVpX0p1bmlfSnVsaV9BZ3VzdHVzX1NlcHRlbWJlcl9Pa3RvYmVyX05vcGVtYmVyX0Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NZWlfSnVuX0p1bF9BZ3NfU2VwX09rdF9Ob3BfRGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ01pbmdndV9TZW5lbl9TZWxvc29fUmVidV9LZW1pc19KZW11d2FoX1NlcHR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnTWluX1Nlbl9TZWxfUmViX0tlbV9KZW1fU2VwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ01nX1NuX1NsX1JiX0ttX0ptX1NwJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvZW5qaW5nfHNpeWFuZ3xzb250ZW58bmRhbHUvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdlbmppbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnc2l5YW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzb250ZW4nIHx8IG1lcmlkaWVtID09PSAnbmRhbHUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VuamluZyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NpeWFuZyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NvbnRlbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbmRhbHUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tEaW50ZW4gcHVuaWtvIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW01iZW5qYW5nIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3B1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0thbGEgd2luZ2kgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBba2VwZW5na2VyIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3dvbnRlbiBpbmcgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGluZ2thbmcga2VwZW5na2VyJyxcbiAgICAgICAgICAgIHM6ICdzYXdldGF3aXMgZGV0aWsnLFxuICAgICAgICAgICAgc3M6ICclZCBkZXRpaycsXG4gICAgICAgICAgICBtOiAnc2V0dW5nZ2FsIG1lbml0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWVuaXQnLFxuICAgICAgICAgICAgaDogJ3NldHVuZ2dhbCBqYW0nLFxuICAgICAgICAgICAgaGg6ICclZCBqYW0nLFxuICAgICAgICAgICAgZDogJ3NlZGludGVuJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGludGVuJyxcbiAgICAgICAgICAgIE06ICdzZXd1bGFuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgd3VsYW4nLFxuICAgICAgICAgICAgeTogJ3NldGF1bicsXG4gICAgICAgICAgICB5eTogJyVkIHRhdW4nLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ganY7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR2VvcmdpYW4gW2thXVxuLy8hIGF1dGhvciA6IElyYWtsaSBKYW5pYXNodmlsaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9JcmFrbGlKYW5pXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIga2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrYScsIHtcbiAgICAgICAgbW9udGhzOiAn4YOY4YOQ4YOc4YOV4YOQ4YOg4YOYX+GDl+GDlOGDkeGDlOGDoOGDleGDkOGDmuGDmF/hg5vhg5Dhg6Dhg6Lhg5hf4YOQ4YOe4YOg4YOY4YOa4YOYX+GDm+GDkOGDmOGDoeGDmF/hg5jhg5Xhg5zhg5jhg6Hhg5hf4YOY4YOV4YOa4YOY4YOh4YOYX+GDkOGDkuGDleGDmOGDoeGDouGDnV/hg6Hhg5Thg6Xhg6Lhg5Thg5vhg5Hhg5Thg6Dhg5hf4YOd4YOl4YOi4YOd4YOb4YOR4YOU4YOg4YOYX+GDnOGDneGDlOGDm+GDkeGDlOGDoOGDmF/hg5Phg5Thg5nhg5Thg5vhg5Hhg5Thg6Dhg5gnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn4YOY4YOQ4YOcX+GDl+GDlOGDkV/hg5vhg5Dhg6Bf4YOQ4YOe4YOgX+GDm+GDkOGDmF/hg5jhg5Xhg5xf4YOY4YOV4YOaX+GDkOGDkuGDlV/hg6Hhg5Thg6Vf4YOd4YOl4YOiX+GDnOGDneGDlF/hg5Phg5Thg5knLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfhg5nhg5Xhg5jhg6Dhg5Bf4YOd4YOg4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDoeGDkOGDm+GDqOGDkOGDkeGDkOGDl+GDmF/hg53hg5fhg67hg6jhg5Dhg5Hhg5Dhg5fhg5hf4YOu4YOj4YOX4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDnuGDkOGDoOGDkOGDoeGDmeGDlOGDleGDmF/hg6jhg5Dhg5Hhg5Dhg5fhg5gnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiAn4YOZ4YOV4YOY4YOg4YOQ4YOhX+GDneGDoOGDqOGDkOGDkeGDkOGDl+GDoV/hg6Hhg5Dhg5vhg6jhg5Dhg5Hhg5Dhg5fhg6Ff4YOd4YOX4YOu4YOo4YOQ4YOR4YOQ4YOX4YOhX+GDruGDo+GDl+GDqOGDkOGDkeGDkOGDl+GDoV/hg57hg5Dhg6Dhg5Dhg6Hhg5nhg5Thg5Xhg6Ff4YOo4YOQ4YOR4YOQ4YOX4YOhJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogLyjhg6zhg5jhg5zhg5B84YOo4YOU4YOb4YOT4YOU4YOSKS8sXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfhg5nhg5Xhg5hf4YOd4YOg4YOoX+GDoeGDkOGDm1/hg53hg5fhg65f4YOu4YOj4YOXX+GDnuGDkOGDoF/hg6jhg5Dhg5EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4YOZ4YOVX+GDneGDoF/hg6Hhg5Bf4YOd4YOXX+GDruGDo1/hg57hg5Bf4YOo4YOQJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+GDk+GDpuGDlOGDoV0gTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1vhg67hg5Xhg5Dhg5pdIExUWy3hg5bhg5RdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4YOS4YOj4YOo4YOY4YOcXSBMVFst4YOW4YOUXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vhg6jhg5Thg5vhg5Phg5Thg5JdIGRkZGQgTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4YOs4YOY4YOc4YOQXSBkZGRkIExULeGDluGDlCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAvKOGDrOGDkOGDm3zhg6zhg6Phg5d84YOh4YOQ4YOQ4YOXfOGDrOGDlOGDmnzhg5Phg6Z84YOX4YOVKSjhg5h84YOUKS8sXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgkMCwgJDEsICQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJDIgPT09ICfhg5gnID8gJDEgKyAn4YOo4YOYJyA6ICQxICsgJDIgKyAn4YOo4YOYJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdDogZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoLyjhg6zhg5Dhg5vhg5h84YOs4YOj4YOX4YOYfOGDoeGDkOGDkOGDl+GDmHzhg5Phg6bhg5R84YOX4YOV4YOUKS8udGVzdChzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC8o4YOYfOGDlCkkLywgJ+GDmOGDoSDhg6zhg5jhg5wnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKC/hg6zhg5Thg5rhg5gvLnRlc3QocykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgv4YOs4YOU4YOa4YOYJC8sICfhg6zhg5rhg5jhg6Eg4YOs4YOY4YOcJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHM6ICfhg6Dhg5Dhg5vhg5Phg5Thg5zhg5jhg5vhg5Qg4YOs4YOQ4YOb4YOYJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4YOs4YOQ4YOb4YOYJyxcbiAgICAgICAgICAgIG06ICfhg6zhg6Phg5fhg5gnLFxuICAgICAgICAgICAgbW06ICclZCDhg6zhg6Phg5fhg5gnLFxuICAgICAgICAgICAgaDogJ+GDoeGDkOGDkOGDl+GDmCcsXG4gICAgICAgICAgICBoaDogJyVkIOGDoeGDkOGDkOGDl+GDmCcsXG4gICAgICAgICAgICBkOiAn4YOT4YOm4YOUJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4YOT4YOm4YOUJyxcbiAgICAgICAgICAgIE06ICfhg5fhg5Xhg5QnLFxuICAgICAgICAgICAgTU06ICclZCDhg5fhg5Xhg5QnLFxuICAgICAgICAgICAgeTogJ+GDrOGDlOGDmuGDmCcsXG4gICAgICAgICAgICB5eTogJyVkIOGDrOGDlOGDmuGDmCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC8wfDEt4YOa4YOYfOGDm+GDlC1cXGR7MSwyfXxcXGR7MSwyfS3hg5QvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3hg5rhg5gnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG51bWJlciA8IDIwIHx8XG4gICAgICAgICAgICAgICAgKG51bWJlciA8PSAxMDAgJiYgbnVtYmVyICUgMjAgPT09IDApIHx8XG4gICAgICAgICAgICAgICAgbnVtYmVyICUgMTAwID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+GDm+GDlC0nICsgbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct4YOUJztcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLFxuICAgICAgICAgICAgZG95OiA3LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGthO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEthemFraCBba2tdXG4vLyEgYXV0aG9ycyA6IE51cmxhbiBSYWtoaW16aGFub3YgOiBodHRwczovL2dpdGh1Yi5jb20vbnVybGFuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDA6ICct0YjRlicsXG4gICAgICAgIDE6ICct0YjRlicsXG4gICAgICAgIDI6ICct0YjRlicsXG4gICAgICAgIDM6ICct0YjRlicsXG4gICAgICAgIDQ6ICct0YjRlicsXG4gICAgICAgIDU6ICct0YjRlicsXG4gICAgICAgIDY6ICct0YjRiycsXG4gICAgICAgIDc6ICct0YjRlicsXG4gICAgICAgIDg6ICct0YjRlicsXG4gICAgICAgIDk6ICct0YjRiycsXG4gICAgICAgIDEwOiAnLdGI0YsnLFxuICAgICAgICAyMDogJy3RiNGLJyxcbiAgICAgICAgMzA6ICct0YjRiycsXG4gICAgICAgIDQwOiAnLdGI0YsnLFxuICAgICAgICA1MDogJy3RiNGWJyxcbiAgICAgICAgNjA6ICct0YjRiycsXG4gICAgICAgIDcwOiAnLdGI0ZYnLFxuICAgICAgICA4MDogJy3RiNGWJyxcbiAgICAgICAgOTA6ICct0YjRiycsXG4gICAgICAgIDEwMDogJy3RiNGWJyxcbiAgICB9O1xuXG4gICAgdmFyIGtrID0gbW9tZW50LmRlZmluZUxvY2FsZSgna2snLCB7XG4gICAgICAgIG1vbnRoczogJ9Kb0LDSo9GC0LDRgF/QsNKb0L/QsNC9X9C90LDRg9GA0YvQt1/RgdOZ0YPRltGAX9C80LDQvNGL0YBf0LzQsNGD0YHRi9C8X9GI0ZbQu9C00LVf0YLQsNC80YvQt1/Sm9GL0YDQutKv0LnQtdC6X9Kb0LDQt9Cw0L1f0pvQsNGA0LDRiNCwX9C20LXQu9GC0L7Sm9GB0LDQvScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfSm9Cw0qNf0LDSm9C/X9C90LDRg1/RgdOZ0YNf0LzQsNC8X9C80LDRg1/RiNGW0Ltf0YLQsNC8X9Kb0YvRgF/Sm9Cw0Ldf0pvQsNGAX9C20LXQuycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfQttC10LrRgdC10L3QsdGWX9C00q/QudGB0LXQvdCx0ZZf0YHQtdC50YHQtdC90LHRll/RgdOZ0YDRgdC10L3QsdGWX9Cx0LXQudGB0LXQvdCx0ZZf0LbSsdC80LBf0YHQtdC90LHRlicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C20LXQul/QtNKv0Llf0YHQtdC5X9GB05nRgF/QsdC10Llf0LbSsdC8X9GB0LXQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQttC6X9C00Llf0YHQuV/RgdGAX9Cx0Llf0LbQvF/RgdC9Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9CR0q/Qs9GW0L0g0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQldGA0YLQtdKjINGB0LDSk9Cw0YJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQmtC10YjQtSDRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vTqNGC0LrQtdC9INCw0L/RgtCw0L3Ri9KjXSBkZGRkIFvRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINGW0YjRltC90LTQtScsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0LHSsdGA0YvQvScsXG4gICAgICAgICAgICBzOiAn0LHRltGA0L3QtdGI0LUg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG06ICfQsdGW0YAg0LzQuNC90YPRgicsXG4gICAgICAgICAgICBtbTogJyVkINC80LjQvdGD0YInLFxuICAgICAgICAgICAgaDogJ9Cx0ZbRgCDRgdCw0pPQsNGCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YHQsNKT0LDRgicsXG4gICAgICAgICAgICBkOiAn0LHRltGAINC60q/QvScsXG4gICAgICAgICAgICBkZDogJyVkINC60q/QvScsXG4gICAgICAgICAgICBNOiAn0LHRltGAINCw0LknLFxuICAgICAgICAgICAgTU06ICclZCDQsNC5JyxcbiAgICAgICAgICAgIHk6ICfQsdGW0YAg0LbRi9C7JyxcbiAgICAgICAgICAgIHl5OiAnJWQg0LbRi9C7JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjRiNGWfNGI0YspLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBiID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW251bWJlcl0gfHwgc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga2s7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2FtYm9kaWFuIFtrbV1cbi8vISBhdXRob3IgOiBLcnV5IFZhbm5hIDogaHR0cHM6Ly9naXRodWIuY29tL2tydXl2YW5uYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfhn6EnLFxuICAgICAgICAgICAgMjogJ+GfoicsXG4gICAgICAgICAgICAzOiAn4Z+jJyxcbiAgICAgICAgICAgIDQ6ICfhn6QnLFxuICAgICAgICAgICAgNTogJ+GfpScsXG4gICAgICAgICAgICA2OiAn4Z+mJyxcbiAgICAgICAgICAgIDc6ICfhn6cnLFxuICAgICAgICAgICAgODogJ+GfqCcsXG4gICAgICAgICAgICA5OiAn4Z+pJyxcbiAgICAgICAgICAgIDA6ICfhn6AnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4Z+hJzogJzEnLFxuICAgICAgICAgICAgJ+Gfoic6ICcyJyxcbiAgICAgICAgICAgICfhn6MnOiAnMycsXG4gICAgICAgICAgICAn4Z+kJzogJzQnLFxuICAgICAgICAgICAgJ+GfpSc6ICc1JyxcbiAgICAgICAgICAgICfhn6YnOiAnNicsXG4gICAgICAgICAgICAn4Z+nJzogJzcnLFxuICAgICAgICAgICAgJ+GfqCc6ICc4JyxcbiAgICAgICAgICAgICfhn6knOiAnOScsXG4gICAgICAgICAgICAn4Z+gJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGttID0gbW9tZW50LmRlZmluZUxvY2FsZSgna20nLCB7XG4gICAgICAgIG1vbnRoczogJ+GemOGegOGemuGetl/hnoDhnrvhnpjhn5Lhnpfhn4hf4Z6Y4Z644Z6T4Z62X+GemOGfgeGen+Getl/hnqfhnp/hnpfhnrZf4Z6Y4Z634Z6Q4Z674Z6T4Z62X+GegOGegOGfkuGegOGeiuGetl/hnp/hnrjhnqDhnrZf4Z6A4Z6J4Z+S4Z6J4Z62X+Gej+Geu+Gem+Getl/hnpzhnrfhnoXhn5LhnobhnrfhnoDhnrZf4Z6S4Z+S4Z6T4Z68Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfhnpjhnoDhnprhnrZf4Z6A4Z674Z6Y4Z+S4Z6X4Z+IX+GemOGeuOGek+Getl/hnpjhn4Hhnp/hnrZf4Z6n4Z6f4Z6X4Z62X+GemOGet+GekOGeu+Gek+Getl/hnoDhnoDhn5LhnoDhnorhnrZf4Z6f4Z644Z6g4Z62X+GegOGeieGfkuGeieGetl/hno/hnrvhnpvhnrZf4Z6c4Z634Z6F4Z+S4Z6G4Z634Z6A4Z62X+GekuGfkuGek+GevCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+GeouGetuGekeGet+Gej+GfkuGemV/hnoXhn5DhnpPhn5LhnpFf4Z6i4Z6E4Z+S4Z6C4Z624Z6aX+GeluGeu+Gekl/hnpbhn5LhnprhnqDhnp/hn5LhnpThno/hnrfhn41f4Z6f4Z674Z6A4Z+S4Z6aX+Gen+GfheGemuGfjScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+GeouGetl/hnoVf4Z6iX+Gell/hnpbhn5Lhnppf4Z6f4Z67X+Genycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfhnqLhnrZf4Z6FX+Geol/hnpZf4Z6W4Z+S4Z6aX+Gen+Geu1/hnp8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4Z6W4Z+S4Z6a4Z654Z6AfOGem+GfkuGehOGetuGehS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn4Z6b4Z+S4Z6E4Z624Z6FJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+GeluGfkuGemuGeueGegCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Z6b4Z+S4Z6E4Z624Z6FJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4Z6Q4Z+S4Z6E4Z+D4Z6T4Z+B4Z+HIOGemOGfieGfhOGehF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vhnp/hn5LhnqLhn4LhnoAg4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW+GemOGfieGfhOGehF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vhnpjhn5Lhnp/hnrfhnpvhnpjhnrfhnokg4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW+Gen+GelOGfkuGej+GetuGeoOGfjeGemOGeu+Gek10gW+GemOGfieGfhOGehF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+GekeGfgOGejycsXG4gICAgICAgICAgICBwYXN0OiAnJXPhnpjhnrvhnpMnLFxuICAgICAgICAgICAgczogJ+GelOGfieGeu+Gek+GfkuGemOGetuGek+GenOGet+Gek+GetuGekeGeuCcsXG4gICAgICAgICAgICBzczogJyVkIOGenOGet+Gek+GetuGekeGeuCcsXG4gICAgICAgICAgICBtOiAn4Z6Y4Z694Z6Z4Z6T4Z624Z6R4Z64JyxcbiAgICAgICAgICAgIG1tOiAnJWQg4Z6T4Z624Z6R4Z64JyxcbiAgICAgICAgICAgIGg6ICfhnpjhnr3hnpnhnpjhn4nhn4ThnoQnLFxuICAgICAgICAgICAgaGg6ICclZCDhnpjhn4nhn4ThnoQnLFxuICAgICAgICAgICAgZDogJ+GemOGeveGemeGekOGfkuGehOGfgycsXG4gICAgICAgICAgICBkZDogJyVkIOGekOGfkuGehOGfgycsXG4gICAgICAgICAgICBNOiAn4Z6Y4Z694Z6Z4Z6B4Z+CJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4Z6B4Z+CJyxcbiAgICAgICAgICAgIHk6ICfhnpjhnr3hnpnhnobhn5LhnpPhnrbhn4YnLFxuICAgICAgICAgICAgeXk6ICclZCDhnobhn5LhnpPhnrbhn4YnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAv4Z6R4Z64XFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiAn4Z6R4Z64JWQnLFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4Z+h4Z+i4Z+j4Z+k4Z+l4Z+m4Z+n4Z+o4Z+p4Z+gXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga207XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS2FubmFkYSBba25dXG4vLyEgYXV0aG9yIDogUmFqZWV2IE5haWsgOiBodHRwczovL2dpdGh1Yi5jb20vcmFqZWV2bmFpa3RlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+CzpycsXG4gICAgICAgICAgICAyOiAn4LOoJyxcbiAgICAgICAgICAgIDM6ICfgs6knLFxuICAgICAgICAgICAgNDogJ+CzqicsXG4gICAgICAgICAgICA1OiAn4LOrJyxcbiAgICAgICAgICAgIDY6ICfgs6wnLFxuICAgICAgICAgICAgNzogJ+CzrScsXG4gICAgICAgICAgICA4OiAn4LOuJyxcbiAgICAgICAgICAgIDk6ICfgs68nLFxuICAgICAgICAgICAgMDogJ+CzpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgs6cnOiAnMScsXG4gICAgICAgICAgICAn4LOoJzogJzInLFxuICAgICAgICAgICAgJ+CzqSc6ICczJyxcbiAgICAgICAgICAgICfgs6onOiAnNCcsXG4gICAgICAgICAgICAn4LOrJzogJzUnLFxuICAgICAgICAgICAgJ+CzrCc6ICc2JyxcbiAgICAgICAgICAgICfgs60nOiAnNycsXG4gICAgICAgICAgICAn4LOuJzogJzgnLFxuICAgICAgICAgICAgJ+Czryc6ICc5JyxcbiAgICAgICAgICAgICfgs6YnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIga24gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrbicsIHtcbiAgICAgICAgbW9udGhzOiAn4LKc4LKo4LK14LKw4LK/X+Cyq+CzhuCyrOCzjeCysOCyteCysOCyv1/gsq7gsr7gsrDgs43gsprgs41f4LKP4LKq4LON4LKw4LK/4LKy4LONX+CyruCzhuCzlV/gspzgs4Lgsqjgs41f4LKc4LOB4LKy4LOG4LOWX+CyhuCyl+CyuOCzjeCyn+CzjV/gsrjgs4bgsqrgs43gsp/gs4bgsoLgsqzgsrDgs41f4LKF4LKV4LON4LKf4LOG4LOC4LOV4LKs4LKw4LONX+CyqOCyteCzhuCyguCyrOCysOCzjV/gsqHgsr/gsrjgs4bgsoLgsqzgsrDgs40nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CynOCyqF/gsqvgs4bgsqzgs43gsrBf4LKu4LK+4LKw4LON4LKa4LONX+Cyj+CyquCzjeCysOCyv+CysuCzjV/gsq7gs4bgs5Vf4LKc4LOC4LKo4LONX+CynOCzgeCysuCzhuCzll/gsobgspfgsrjgs43gsp/gs41f4LK44LOG4LKq4LON4LKf4LOG4LKCX+CyheCyleCzjeCyn+CzhuCzguCzlV/gsqjgsrXgs4bgsoJf4LKh4LK/4LK44LOG4LKCJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn4LKt4LK+4LKo4LOB4LK14LK+4LKwX+CyuOCzhuCzguCzleCyruCyteCyvuCysF/gsq7gsoLgspfgsrPgsrXgsr7gsrBf4LKs4LOB4LKn4LK14LK+4LKwX+Cyl+CzgeCysOCzgeCyteCyvuCysF/gsrbgs4HgspXgs43gsrDgsrXgsr7gsrBf4LK24LKo4LK/4LK14LK+4LKwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4LKt4LK+4LKo4LOBX+CyuOCzhuCzguCzleCyrl/gsq7gsoLgspfgsrNf4LKs4LOB4LKnX+Cyl+CzgeCysOCzgV/gsrbgs4HgspXgs43gsrBf4LK24LKo4LK/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CyreCyvl/gsrjgs4bgs4Lgs5Vf4LKu4LKCX+CyrOCzgV/gspfgs4Ff4LK24LOBX+Cyticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgsofgsoLgsqbgs4FdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4LKo4LK+4LKz4LOGXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4LKo4LK/4LKo4LON4LKo4LOGXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgspXgs4bgs4Lgsqjgs4bgsq9dIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4LKo4LKC4LKk4LKwJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgsrngsr/gsoLgsqbgs4YnLFxuICAgICAgICAgICAgczogJ+CyleCzhuCysuCyteCzgSDgspXgs43gsrfgsqPgspfgsrPgs4EnLFxuICAgICAgICAgICAgc3M6ICclZCDgsrjgs4bgspXgs4bgsoLgsqHgs4HgspfgsrPgs4EnLFxuICAgICAgICAgICAgbTogJ+CykuCyguCypuCzgSDgsqjgsr/gsq7gsr/gsrcnLFxuICAgICAgICAgICAgbW06ICclZCDgsqjgsr/gsq7gsr/gsrcnLFxuICAgICAgICAgICAgaDogJ+CykuCyguCypuCzgSDgspfgsoLgsp/gs4YnLFxuICAgICAgICAgICAgaGg6ICclZCDgspfgsoLgsp/gs4YnLFxuICAgICAgICAgICAgZDogJ+CykuCyguCypuCzgSDgsqbgsr/gsqgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgsqbgsr/gsqgnLFxuICAgICAgICAgICAgTTogJ+CykuCyguCypuCzgSDgsqTgsr/gsoLgspfgsrPgs4EnLFxuICAgICAgICAgICAgTU06ICclZCDgsqTgsr/gsoLgspfgsrPgs4EnLFxuICAgICAgICAgICAgeTogJ+CykuCyguCypuCzgSDgsrXgsrDgs43gsrcnLFxuICAgICAgICAgICAgeXk6ICclZCDgsrXgsrDgs43gsrcnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4LOn4LOo4LOp4LOq4LOr4LOs4LOt4LOu4LOv4LOmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LKw4LK+4LKk4LON4LKw4LK/fOCyrOCzhuCys+Cyv+Cyl+CzjeCyl+Czhnzgsq7gsqfgs43gsq/gsr7gsrngs43gsqh84LK44LKC4LKc4LOGLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4LKw4LK+4LKk4LON4LKw4LK/Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LKs4LOG4LKz4LK/4LKX4LON4LKX4LOGJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CyruCyp+CzjeCyr+CyvuCyueCzjeCyqCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LK44LKC4LKc4LOGJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CysOCyvuCypOCzjeCysOCyvyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LKs4LOG4LKz4LK/4LKX4LON4LKX4LOGJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsq7gsqfgs43gsq/gsr7gsrngs43gsqgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CyuOCyguCynOCzhic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LKw4LK+4LKk4LON4LKw4LK/JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOCyqOCzhuCzlSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+CyqOCzhuCzlSc7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBrbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLb3JlYW4gW2tvXVxuLy8hIGF1dGhvciA6IEt5dW5nd29vaywgUGFyayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9reXVuZ3cwMGtcbi8vISBhdXRob3IgOiBKZWVleXVsIExlZSA8amVlZXl1bEBnbWFpbC5jb20+XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIga28gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrbycsIHtcbiAgICAgICAgbW9udGhzOiAnMeyblF8y7JuUXzPsm5RfNOyblF817JuUXzbsm5RfN+yblF847JuUXznsm5RfMTDsm5RfMTHsm5RfMTLsm5QnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeyblF8y7JuUXzPsm5RfNOyblF817JuUXzbsm5RfN+yblF847JuUXznsm5RfMTDsm5RfMTHsm5RfMTLsm5QnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn7J287JqU7J28X+yblOyalOydvF/tmZTsmpTsnbxf7IiY7JqU7J28X+uqqeyalOydvF/quIjsmpTsnbxf7Yag7JqU7J28Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn7J28X+yblF/tmZRf7IiYX+uqqV/quIhf7YagJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+ydvF/sm5Rf7ZmUX+yImF/rqqlf6riIX+2GoCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS5NTS5ERC4nLFxuICAgICAgICAgICAgTEw6ICdZWVlZ64WEIE1NTU0gROydvCcsXG4gICAgICAgICAgICBMTEw6ICdZWVlZ64WEIE1NTU0gROydvCBBIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVnrhYQgTU1NTSBE7J28IGRkZGQgQSBoOm1tJyxcbiAgICAgICAgICAgIGw6ICdZWVlZLk1NLkRELicsXG4gICAgICAgICAgICBsbDogJ1lZWVnrhYQgTU1NTSBE7J28JyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVnrhYQgTU1NTSBE7J28IEEgaDptbScsXG4gICAgICAgICAgICBsbGxsOiAnWVlZWeuFhCBNTU1NIETsnbwgZGRkZCBBIGg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ+yYpOuKmCBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAn64K07J28IExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAn7Ja07KCcIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAn7KeA64Kc7KO8IGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDtm4QnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOyghCcsXG4gICAgICAgICAgICBzOiAn66qHIOy0iCcsXG4gICAgICAgICAgICBzczogJyVk7LSIJyxcbiAgICAgICAgICAgIG06ICcx67aEJyxcbiAgICAgICAgICAgIG1tOiAnJWTrtoQnLFxuICAgICAgICAgICAgaDogJ+2VnCDsi5zqsIQnLFxuICAgICAgICAgICAgaGg6ICclZOyLnOqwhCcsXG4gICAgICAgICAgICBkOiAn7ZWY66OoJyxcbiAgICAgICAgICAgIGRkOiAnJWTsnbwnLFxuICAgICAgICAgICAgTTogJ+2VnCDri6wnLFxuICAgICAgICAgICAgTU06ICclZOuLrCcsXG4gICAgICAgICAgICB5OiAn7J28IOuFhCcsXG4gICAgICAgICAgICB5eTogJyVk64WEJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOydvHzsm5R87KO8KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+ydvCc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn7JuUJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfso7wnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/smKTsoIR87Jik7ZuELyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW4gPT09ICfsmKTtm4QnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCAxMiA/ICfsmKTsoIQnIDogJ+yYpO2bhCc7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga287XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTm9ydGhlcm4gS3VyZGlzaCBba3Uta21yXVxuLy8hIGF1dGhvcnMgOiBNYXpsdW0gw5Z6ZG9nYW4gOiBodHRwczovL2dpdGh1Yi5jb20vbWVyZ2VoZXpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzOiBbJ8OnZW5kIHNhbsOueWUnLCAnw6dlbmQgc2Fuw655ZXlhbiddLFxuICAgICAgICAgICAgc3M6IFtudW0gKyAnIHNhbsOueWUnLCBudW0gKyAnIHNhbsOueWV5YW4nXSxcbiAgICAgICAgICAgIG06IFsnZGVxw65xZXllaycsICdkZXHDrnFleWVrw6onXSxcbiAgICAgICAgICAgIG1tOiBbbnVtICsgJyBkZXHDrnFlJywgbnVtICsgJyBkZXHDrnFleWFuJ10sXG4gICAgICAgICAgICBoOiBbJ3NhZXRlaycsICdzYWV0ZWvDqiddLFxuICAgICAgICAgICAgaGg6IFtudW0gKyAnIHNhZXQnLCBudW0gKyAnIHNhZXRhbiddLFxuICAgICAgICAgICAgZDogWydyb2playcsICdyb2pla8OqJ10sXG4gICAgICAgICAgICBkZDogW251bSArICcgcm9qJywgbnVtICsgJyByb2phbiddLFxuICAgICAgICAgICAgdzogWydoZWZ0ZXllaycsICdoZWZ0ZXlla8OqJ10sXG4gICAgICAgICAgICB3dzogW251bSArICcgaGVmdGUnLCBudW0gKyAnIGhlZnRleWFuJ10sXG4gICAgICAgICAgICBNOiBbJ21laGVrJywgJ21laGVrw6onXSxcbiAgICAgICAgICAgIE1NOiBbbnVtICsgJyBtZWgnLCBudW0gKyAnIG1laGFuJ10sXG4gICAgICAgICAgICB5OiBbJ3NhbGVrJywgJ3NhbGVrw6onXSxcbiAgICAgICAgICAgIHl5OiBbbnVtICsgJyBzYWwnLCBudW0gKyAnIHNhbGFuJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG4gICAgLy8gZnVuY3Rpb24gb2JsaXF1ZU51bVN1ZmZpeChudW0pIHtcbiAgICAvLyAgICAgaWYobnVtLmluY2x1ZGVzKCc6JykpXG4gICAgLy8gICAgICAgICBudW0gPSBwYXJzZUludChudW0uc3BsaXQoJzonKVswXSk7XG4gICAgLy8gICAgIGVsc2VcbiAgICAvLyAgICAgICAgIG51bSA9IHBhcnNlSW50KG51bSk7XG4gICAgLy8gICAgIHJldHVybiBudW0gPT0gMCB8fCBudW0gJSAxMCA9PSAxID8gJ8OqJ1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIDogKG51bSA+IDEwICYmIG51bSAlIDEwID09IDAgPyAnw64nIDogJ2FuJyk7XG4gICAgLy8gfVxuICAgIGZ1bmN0aW9uIGV6YWZlTnVtU3VmZml4KG51bSkge1xuICAgICAgICBudW0gPSAnJyArIG51bTtcbiAgICAgICAgdmFyIGwgPSBudW0uc3Vic3RyaW5nKG51bS5sZW5ndGggLSAxKSxcbiAgICAgICAgICAgIGxsID0gbnVtLmxlbmd0aCA+IDEgPyBudW0uc3Vic3RyaW5nKG51bS5sZW5ndGggLSAyKSA6ICcnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKGxsID09IDEyIHx8IGxsID09IDEzKSAmJlxuICAgICAgICAgICAgKGwgPT0gJzInIHx8IGwgPT0gJzMnIHx8IGxsID09ICc1MCcgfHwgbCA9PSAnNzAnIHx8IGwgPT0gJzgwJylcbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuICd5w6onO1xuICAgICAgICByZXR1cm4gJ8OqJztcbiAgICB9XG5cbiAgICB2YXIga3VLbXIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrdS1rbXInLCB7XG4gICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgc3BlbGxpbmcgcnVsZXMgZGVmaW5lZCBieSB0aGUgd29yayBncm91cCBvZiBXZXFmYSBNZXpvcG90YW15YXnDqiAoTWVzb3BvdGFtaWEgRm91bmRhdGlvbilcbiAgICAgICAgLy8gdGhpcyBzaG91bGQgYmU6ICdLYW7Du25hIFBhxZ/Drm5fU2liYXRfQWRhcl9Ow65zYW5fR3VsYW5fSGV6w65yYW5fVMOucm1laF9UZWJheF/Djmxvbl/Dh2lyw655YSBQw6rFn8Oubl/Dh2lyw655YSBQYcWfw65uX0thbsO7bmEgUMOqxZ/Drm4nXG4gICAgICAgIC8vIEJ1dCB0aGUgbmFtZXMgYmVsb3cgYXJlIG1vcmUgd2VsbCBrbm93biBhbmQgaGFuZHlcbiAgICAgICAgbW9udGhzOiAnUsOqYmVuZGFuX1NpYmF0X0FkYXJfTsOuc2FuX0d1bGFuX0hlesOucmFuX1TDrnJtZWhfVGViYXhfw45sb25fQ290bWVoX01pamRhcl9CZXJmYW5iYXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnUsOqYl9TaWJfQWRhX07DrnNfR3VsX0hlel9Uw65yX1RlYl/DjmxvX0NvdF9NaWpfQmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ1lla8WfZW1fRHXFn2VtX1PDqsWfZW1fw4dhcsWfZW1fUMOqbmPFn2VtX8OObl/FnmVtw64nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdZZWtfRHVfU8OqX8OHYXJfUMOqbl/Djm5fxZ5lbScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdZZV9EdV9Tw6pfw4dhX1DDql/Djm5fxZ5lJy5zcGxpdCgnXycpLFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2JuJyA6ICdCTic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3BuJyA6ICdQTic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9ibnxCTnxwbnxQTi8sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRG8gTU1NTVthXSBZWVlZW2FuXScsXG4gICAgICAgICAgICBMTEw6ICdEbyBNTU1NW2FdIFlZWVlbYW5dIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEbyBNTU1NW2FdIFlZWVlbYW5dIEhIOm1tJyxcbiAgICAgICAgICAgIGxsOiAnRG8gTU1NWy5dIFlZWVlbYW5dJyxcbiAgICAgICAgICAgIGxsbDogJ0RvIE1NTVsuXSBZWVlZW2FuXSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkWy5dLCBEbyBNTU1bLl0gWVlZWVthbl0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vDjnJvIGRpIHNhZXRdIExUIFtkZV0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1tTaWLDqiBkaSBzYWV0XSBMVCBbZGVdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbZGkgc2FldF0gTFQgW2RlXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0R1aCBkaSBzYWV0XSBMVCBbZGVdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZFthIGJvcsOuIGRpIHNhZXRdIExUIFtkZV0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkaSAlcyBkZScsXG4gICAgICAgICAgICBwYXN0OiAnYmVyw64gJXMnLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgdzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHd3OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oPzp5w6p8w6p8XFwuKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW0sIHBlcmlvZCkge1xuICAgICAgICAgICAgdmFyIHAgPSBwZXJpb2QudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChwLmluY2x1ZGVzKCd3JykgfHwgcC5pbmNsdWRlcygnbScpKSByZXR1cm4gbnVtICsgJy4nO1xuXG4gICAgICAgICAgICByZXR1cm4gbnVtICsgZXphZmVOdW1TdWZmaXgobnVtKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGt1S21yO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEt1cmRpc2ggW2t1XVxuLy8hIGF1dGhvciA6IFNoYWhyYW0gTWViYXNoYXIgOiBodHRwczovL2dpdGh1Yi5jb20vU2hhaHJhbU1lYmFzaGFyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ9mhJyxcbiAgICAgICAgICAgIDI6ICfZoicsXG4gICAgICAgICAgICAzOiAn2aMnLFxuICAgICAgICAgICAgNDogJ9mkJyxcbiAgICAgICAgICAgIDU6ICfZpScsXG4gICAgICAgICAgICA2OiAn2aYnLFxuICAgICAgICAgICAgNzogJ9mnJyxcbiAgICAgICAgICAgIDg6ICfZqCcsXG4gICAgICAgICAgICA5OiAn2aknLFxuICAgICAgICAgICAgMDogJ9mgJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAgICAgJ9miJzogJzInLFxuICAgICAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAgICAgJ9mlJzogJzUnLFxuICAgICAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAgICAgJ9moJzogJzgnLFxuICAgICAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAgICAgJ9mgJzogJzAnLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHMgPSBbXG4gICAgICAgICAgICAn2qnYp9mG2YjZhtuMINiv2YjZiNuV2YUnLFxuICAgICAgICAgICAgJ9i02YjYqNin2KonLFxuICAgICAgICAgICAgJ9im2KfYstin2LEnLFxuICAgICAgICAgICAgJ9mG24zYs9in2YYnLFxuICAgICAgICAgICAgJ9im2KfbjNin2LEnLFxuICAgICAgICAgICAgJ9it2YjYstuV24zYsdin2YYnLFxuICAgICAgICAgICAgJ9iq25XZhdmF2YjYsicsXG4gICAgICAgICAgICAn2KbYp9ioJyxcbiAgICAgICAgICAgICfYptuV24zZhNmI2YjZhCcsXG4gICAgICAgICAgICAn2KrYtNix24zZhtuMINuM25XZg9uV2YUnLFxuICAgICAgICAgICAgJ9iq2LTYsduM2YbbjCDYr9mI2YjbldmFJyxcbiAgICAgICAgICAgICfZg9in2YbZiNmG24wg24zbldqp25XZhScsXG4gICAgICAgIF07XG5cbiAgICB2YXIga3UgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrdScsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ9uM2YfigIzZg9i02YfigIzZhdmF2YfigIxf2K/ZiNmI2LTZh+KAjNmF2YXZh+KAjF/Ys9uO2LTZh+KAjNmF2YXZh+KAjF/ahtmI2KfYsdi02YfigIzZhdmF2YfigIxf2b7bjtmG2KzYtNmH4oCM2YXZhdmH4oCMX9mH2YfigIzbjNmG24xf2LTZh+KAjNmF2YXZh+KAjCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OlxuICAgICAgICAgICAgJ9uM2YfigIzZg9i02YfigIzZhV/Yr9mI2YjYtNmH4oCM2YVf2LPbjti02YfigIzZhV/ahtmI2KfYsdi02YfigIzZhV/ZvtuO2YbYrNi02YfigIzZhV/Zh9mH4oCM24zZhtuMX9i02YfigIzZhdmF2YfigIwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn24xf2K9f2LNf2oZf2b5f2Ydf2LQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2KbbjtmI2KfYsdmH4oCMfNio2YfigIzbjNin2YbbjC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC/YptuO2YjYp9ix2YfigIwvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2KjZh+KAjNuM2KfZhtuMJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYptuO2YjYp9ix2YfigIwnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYptmH4oCM2YXYsduGINmD2KfYqtqY2YXbjtixXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9io2YfigIzbjNin2YbbjCDZg9in2KramNmF247YsV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvZg9in2KramNmF247YsV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYr9mI247ZhtuOINmD2KfYqtqY2YXbjtixXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9mD2KfYqtqY2YXbjtixXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mE2YfigIwgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzJyxcbiAgICAgICAgICAgIHM6ICfahtmH4oCM2YbYryDahtix2YPZh+KAjNuM2YfigIzZgycsXG4gICAgICAgICAgICBzczogJ9qG2LHZg9mH4oCMICVkJyxcbiAgICAgICAgICAgIG06ICfbjNmH4oCM2YMg2K7ZiNmE2YfigIzZgycsXG4gICAgICAgICAgICBtbTogJyVkINiu2YjZhNmH4oCM2YMnLFxuICAgICAgICAgICAgaDogJ9uM2YfigIzZgyDZg9in2KramNmF247YsScsXG4gICAgICAgICAgICBoaDogJyVkINmD2KfYqtqY2YXbjtixJyxcbiAgICAgICAgICAgIGQ6ICfbjNmH4oCM2YMg2pXbhtqYJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2pXbhtqYJyxcbiAgICAgICAgICAgIE06ICfbjNmH4oCM2YMg2YXYp9mG2q8nLFxuICAgICAgICAgICAgTU06ICclZCDZhdin2YbarycsXG4gICAgICAgICAgICB5OiAn24zZh+KAjNmDINiz2KfatScsXG4gICAgICAgICAgICB5eTogJyVkINiz2KfatScsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1vZodmi2aPZpNml2abZp9mo2anZoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDEyLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxMnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGt1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEt5cmd5eiBba3ldXG4vLyEgYXV0aG9yIDogQ2h5bmd5eiBBcnlzdGFuIHV1bHUgOiBodHRwczovL2dpdGh1Yi5jb20vY2h5bmd5elxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN1ZmZpeGVzID0ge1xuICAgICAgICAwOiAnLdGH0q8nLFxuICAgICAgICAxOiAnLdGH0LgnLFxuICAgICAgICAyOiAnLdGH0LgnLFxuICAgICAgICAzOiAnLdGH0q8nLFxuICAgICAgICA0OiAnLdGH0q8nLFxuICAgICAgICA1OiAnLdGH0LgnLFxuICAgICAgICA2OiAnLdGH0YsnLFxuICAgICAgICA3OiAnLdGH0LgnLFxuICAgICAgICA4OiAnLdGH0LgnLFxuICAgICAgICA5OiAnLdGH0YMnLFxuICAgICAgICAxMDogJy3Rh9GDJyxcbiAgICAgICAgMjA6ICct0YfRiycsXG4gICAgICAgIDMwOiAnLdGH0YMnLFxuICAgICAgICA0MDogJy3Rh9GLJyxcbiAgICAgICAgNTA6ICct0YfSrycsXG4gICAgICAgIDYwOiAnLdGH0YsnLFxuICAgICAgICA3MDogJy3Rh9C4JyxcbiAgICAgICAgODA6ICct0YfQuCcsXG4gICAgICAgIDkwOiAnLdGH0YMnLFxuICAgICAgICAxMDA6ICct0YfSrycsXG4gICAgfTtcblxuICAgIHZhciBreSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2t5Jywge1xuICAgICAgICBtb250aHM6ICfRj9C90LLQsNGA0Yxf0YTQtdCy0YDQsNC70Yxf0LzQsNGA0YJf0LDQv9GA0LXQu9GMX9C80LDQuV/QuNGO0L3RjF/QuNGO0LvRjF/QsNCy0LPRg9GB0YJf0YHQtdC90YLRj9Cx0YDRjF/QvtC60YLRj9Cx0YDRjF/QvdC+0Y/QsdGA0Yxf0LTQtdC60LDQsdGA0YwnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0Y/QvdCyX9GE0LXQsl/QvNCw0YDRgl/QsNC/0YBf0LzQsNC5X9C40Y7QvdGMX9C40Y7Qu9GMX9Cw0LLQs1/RgdC10L1f0L7QutGCX9C90L7Rj1/QtNC10LonLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn0JbQtdC60YjQtdC80LHQuF/QlNKv0LnRiNOp0LzQsdKvX9Co0LXQudGI0LXQvNCx0Lhf0KjQsNGA0YjQtdC80LHQuF/QkdC10LnRiNC10LzQsdC4X9CW0YPQvNCwX9CY0YjQtdC80LHQuCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9CW0LXQul/QlNKv0Llf0KjQtdC5X9Co0LDRgF/QkdC10Llf0JbRg9C8X9CY0YjQtScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQltC6X9CU0Llf0KjQuV/QqNGAX9CR0Llf0JbQvF/QmNGIJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9CR0q/Qs9Kv0L0g0YHQsNCw0YJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0K3RgNGC0LXSoyDRgdCw0LDRgl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvRgdCw0LDRgl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQmtC10YfRjdGNINGB0LDQsNGCXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vTqNGC0LrTqdC9INCw0L/RgtCw0L3Ri9C9XSBkZGRkIFvQutKv0L3Sr10gW9GB0LDQsNGCXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINC40YfQuNC90LTQtScsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0LzRg9GA0YPQvScsXG4gICAgICAgICAgICBzOiAn0LHQuNGA0L3QtdGH0LUg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG06ICfQsdC40YAg0LzSr9C906nRgicsXG4gICAgICAgICAgICBtbTogJyVkINC80q/QvdOp0YInLFxuICAgICAgICAgICAgaDogJ9Cx0LjRgCDRgdCw0LDRgicsXG4gICAgICAgICAgICBoaDogJyVkINGB0LDQsNGCJyxcbiAgICAgICAgICAgIGQ6ICfQsdC40YAg0LrSr9C9JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0LrSr9C9JyxcbiAgICAgICAgICAgIE06ICfQsdC40YAg0LDQuScsXG4gICAgICAgICAgICBNTTogJyVkINCw0LknLFxuICAgICAgICAgICAgeTogJ9Cx0LjRgCDQttGL0LsnLFxuICAgICAgICAgICAgeXk6ICclZCDQttGL0LsnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNGH0Lh80YfRi3zRh9KvfNGH0YMpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBiID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW251bWJlcl0gfHwgc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga3k7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTHV4ZW1ib3VyZ2lzaCBbbGJdXG4vLyEgYXV0aG9yIDogbXdlaW1lcnNraXJjaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9td2VpbWVyc2tpcmNoXG4vLyEgYXV0aG9yIDogRGF2aWQgUmFpc29uIDogaHR0cHM6Ly9naXRodWIuY29tL2t3aXNhdHpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtOiBbJ2VuZyBNaW51dHQnLCAnZW5nZXIgTWludXR0J10sXG4gICAgICAgICAgICBoOiBbJ2VuZyBTdG9ubicsICdlbmdlciBTdG9ubiddLFxuICAgICAgICAgICAgZDogWydlZW4gRGFnJywgJ2VuZ2VtIERhZyddLFxuICAgICAgICAgICAgTTogWydlZSBNb3VudCcsICdlbmdlbSBNb3VudCddLFxuICAgICAgICAgICAgeTogWydlZSBKb2VyJywgJ2VuZ2VtIEpvZXInXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzRnV0dXJlVGltZShzdHJpbmcpIHtcbiAgICAgICAgdmFyIG51bWJlciA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YoJyAnKSk7XG4gICAgICAgIGlmIChlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobnVtYmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuICdhICcgKyBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdhbiAnICsgc3RyaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzUGFzdFRpbWUoc3RyaW5nKSB7XG4gICAgICAgIHZhciBudW1iZXIgPSBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5pbmRleE9mKCcgJykpO1xuICAgICAgICBpZiAoZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcikpIHtcbiAgICAgICAgICAgIHJldHVybiAndmlydSAnICsgc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAndmlydW4gJyArIHN0cmluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3b3JkIGJlZm9yZSB0aGUgZ2l2ZW4gbnVtYmVyIGxvc2VzIHRoZSAnLW4nIGVuZGluZy5cbiAgICAgKiBlLmcuICdhbiAxMCBEZWVnJyBidXQgJ2EgNSBEZWVnJ1xuICAgICAqXG4gICAgICogQHBhcmFtIG51bWJlciB7aW50ZWdlcn1cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobnVtYmVyKSB7XG4gICAgICAgIG51bWJlciA9IHBhcnNlSW50KG51bWJlciwgMTApO1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICAvLyBOZWdhdGl2ZSBOdW1iZXIgLS0+IGFsd2F5cyB0cnVlXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCAxMCkge1xuICAgICAgICAgICAgLy8gT25seSAxIGRpZ2l0XG4gICAgICAgICAgICBpZiAoNCA8PSBudW1iZXIgJiYgbnVtYmVyIDw9IDcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCAxMDApIHtcbiAgICAgICAgICAgIC8vIDIgZGlnaXRzXG4gICAgICAgICAgICB2YXIgbGFzdERpZ2l0ID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgZmlyc3REaWdpdCA9IG51bWJlciAvIDEwO1xuICAgICAgICAgICAgaWYgKGxhc3REaWdpdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIoZmlyc3REaWdpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKGxhc3REaWdpdCk7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMTAwMDApIHtcbiAgICAgICAgICAgIC8vIDMgb3IgNCBkaWdpdHMgLS0+IHJlY3Vyc2l2ZWx5IGNoZWNrIGZpcnN0IGRpZ2l0XG4gICAgICAgICAgICB3aGlsZSAobnVtYmVyID49IDEwKSB7XG4gICAgICAgICAgICAgICAgbnVtYmVyID0gbnVtYmVyIC8gMTA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBbnl0aGluZyBsYXJnZXIgdGhhbiA0IGRpZ2l0czogcmVjdXJzaXZlbHkgY2hlY2sgZmlyc3Qgbi0zIGRpZ2l0c1xuICAgICAgICAgICAgbnVtYmVyID0gbnVtYmVyIC8gMTAwMDtcbiAgICAgICAgICAgIHJldHVybiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsYiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2xiJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJfRmVicnVhcl9Nw6RlcnpfQWJyw6tsbF9NZWVfSnVuaV9KdWxpX0F1Z3VzdF9TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXplbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnSmFuLl9GZWJyLl9NcnouX0Fici5fTWVlX0p1bi5fSnVsLl9BdWcuX1NlcHQuX09rdC5fTm92Ll9EZXouJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1Nvbm5kZWdfTcOpaW5kZWdfRMOrbnNjaGRlZ19Nw6t0dHdvY2hfRG9ubmVzY2hkZWdfRnJlaWRlZ19TYW1zY2hkZWcnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1NvLl9Nw6kuX0TDqy5fTcOrLl9Eby5fRnIuX1NhLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTb19Nw6lfRMOrX03Dq19Eb19Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tIFtBdWVyXScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzIFtBdWVyXScsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbSBbQXVlcl0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tIFtBdWVyXScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hhdXQgdW1dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW011ZXIgdW1dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbdW1dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbR8Orc2NodGVyIHVtXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudCBkYXRlIHN0cmluZyBmb3IgJ0TDq25zY2hkZWcnIChUdWVzZGF5KSBhbmQgJ0Rvbm5lc2NoZGVnJyAoVGh1cnNkYXkpIGR1ZSB0byBwaG9ub2xvZ2ljYWwgcnVsZVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW0xlc2NodGVuXSBkZGRkIFt1bV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbTGVzY2h0ZV0gZGRkZCBbdW1dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogcHJvY2Vzc0Z1dHVyZVRpbWUsXG4gICAgICAgICAgICBwYXN0OiBwcm9jZXNzUGFzdFRpbWUsXG4gICAgICAgICAgICBzOiAnZSBwdWVyIFNla29ubmVuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgU2Vrb25uZW4nLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiAnJWQgTWludXR0ZW4nLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiAnJWQgU3Rvbm5lbicsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6ICclZCBEZWVnJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogJyVkIE3DqWludCcsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6ICclZCBKb2VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBsYjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBMYW8gW2xvXVxuLy8hIGF1dGhvciA6IFJ5YW4gSGFydCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yeWFuaGFydDJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBsbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2xvJywge1xuICAgICAgICBtb250aHM6ICfguqHgurHguofguoHguq3guplf4LqB4Lq44Lqh4Lqe4LqyX+C6oeC6teC6meC6sl/gu4DguqHguqrgurJf4Lqe4Lq24LqU4Lqq4Lqw4Lqe4LqyX+C6oeC6tOC6luC6uOC6meC6sl/guoHgu43guqXgurDguoHgurvgupRf4Lqq4Lq04LqH4Lqr4LqyX+C6geC6seC6meC6jeC6sl/gupXgurjguqXgurJf4Lqe4Lqw4LqI4Lq04LqBX+C6l+C6seC6meC6p+C6sicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4Lqh4Lqx4LqH4LqB4Lqt4LqZX+C6geC6uOC6oeC6nuC6sl/guqHgurXgupngurJf4LuA4Lqh4Lqq4LqyX+C6nuC6tuC6lOC6quC6sOC6nuC6sl/guqHgurTgupbgurjgupngurJf4LqB4LuN4Lql4Lqw4LqB4Lq74LqUX+C6quC6tOC6h+C6q+C6sl/guoHgurHgupnguo3gurJf4LqV4Lq44Lql4LqyX+C6nuC6sOC6iOC6tOC6gV/gupfgurHgupnguqfgurInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfguq3gurLgupfgurTgupRf4LqI4Lqx4LqZX+C6reC6seC6h+C6hOC6suC6mV/gup7gurjgupRf4Lqe4Lqw4Lqr4Lqx4LqUX+C6quC6uOC6gV/gu4DguqrgurvgurInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgupfgurTgupRf4LqI4Lqx4LqZX+C6reC6seC6h+C6hOC6suC6mV/gup7gurjgupRf4Lqe4Lqw4Lqr4Lqx4LqUX+C6quC6uOC6gV/gu4DguqrgurvgurInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4LqXX+C6iF/guq3guoRf4LqeX+C6nuC6q1/guqrguoFf4LqqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ+C6p+C6seC6mWRkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LqV4Lqt4LqZ4LuA4LqK4Lq74LuJ4LqyfOC6leC6reC6meC7geC6peC6hy8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn4LqV4Lqt4LqZ4LuB4Lql4LqHJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C6leC6reC6meC7gOC6iuC6u+C7ieC6sic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LqV4Lqt4LqZ4LuB4Lql4LqHJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4Lqh4Lq34LuJ4LqZ4Lq14LuJ4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C6oeC6t+C7ieC6reC6t+C7iOC6meC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4Lqn4Lqx4LqZXWRkZGRb4Luc4LuJ4Lqy4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C6oeC6t+C7ieC6p+C6suC6meC6meC6teC7ieC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4Lqn4Lqx4LqZXWRkZGRb4LuB4Lql4LuJ4Lqn4LqZ4Lq14LuJ4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ+C6reC6teC6gSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXPgupzgu4jgurLgupnguqHgurInLFxuICAgICAgICAgICAgczogJ+C6muC7jeC7iOC7gOC6l+C6u+C7iOC6suC7g+C6lOC6p+C6tOC6meC6suC6l+C6tScsXG4gICAgICAgICAgICBzczogJyVkIOC6p+C6tOC6meC6suC6l+C6tScsXG4gICAgICAgICAgICBtOiAnMSDgupngurLgupfgurUnLFxuICAgICAgICAgICAgbW06ICclZCDgupngurLgupfgurUnLFxuICAgICAgICAgICAgaDogJzEg4LqK4Lq74LuI4Lqn4LuC4Lqh4LqHJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4LqK4Lq74LuI4Lqn4LuC4Lqh4LqHJyxcbiAgICAgICAgICAgIGQ6ICcxIOC6oeC6t+C7iScsXG4gICAgICAgICAgICBkZDogJyVkIOC6oeC6t+C7iScsXG4gICAgICAgICAgICBNOiAnMSDgu4DgupTgurfguq3gupknLFxuICAgICAgICAgICAgTU06ICclZCDgu4DgupTgurfguq3gupknLFxuICAgICAgICAgICAgeTogJzEg4Lqb4Lq1JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Lqb4Lq1JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogLyjgupfgurXgu4gpXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ+C6l+C6teC7iCcgKyBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTGl0aHVhbmlhbiBbbHRdXG4vLyEgYXV0aG9yIDogTWluZGF1Z2FzIE1vesWrcmFzIDogaHR0cHM6Ly9naXRodWIuY29tL21tb3p1cmFzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdW5pdHMgPSB7XG4gICAgICAgIHNzOiAnc2VrdW5kxJdfc2VrdW5kxb5pxbNfc2VrdW5kZXMnLFxuICAgICAgICBtOiAnbWludXTEl19taW51dMSXc19taW51dMSZJyxcbiAgICAgICAgbW06ICdtaW51dMSXc19taW51xI1pxbNfbWludXRlcycsXG4gICAgICAgIGg6ICd2YWxhbmRhX3ZhbGFuZG9zX3ZhbGFuZMSFJyxcbiAgICAgICAgaGg6ICd2YWxhbmRvc192YWxhbmTFs192YWxhbmRhcycsXG4gICAgICAgIGQ6ICdkaWVuYV9kaWVub3NfZGllbsSFJyxcbiAgICAgICAgZGQ6ICdkaWVub3NfZGllbsWzX2RpZW5hcycsXG4gICAgICAgIE06ICdtxJdudW9fbcSXbmVzaW9fbcSXbmVzxK8nLFxuICAgICAgICBNTTogJ23El25lc2lhaV9txJduZXNpxbNfbcSXbmVzaXVzJyxcbiAgICAgICAgeTogJ21ldGFpX21ldMWzX21ldHVzJyxcbiAgICAgICAgeXk6ICdtZXRhaV9tZXTFs19tZXR1cycsXG4gICAgfTtcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVTZWNvbmRzKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuICdrZWxpb3Mgc2VrdW5kxJdzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdrZWxpxbMgc2VrdW5kxb5pxbMnIDogJ2tlbGlhcyBzZWt1bmRlcyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlU2luZ3VsYXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4XG4gICAgICAgICAgICA/IGZvcm1zKGtleSlbMF1cbiAgICAgICAgICAgIDogaXNGdXR1cmVcbiAgICAgICAgICAgICAgPyBmb3JtcyhrZXkpWzFdXG4gICAgICAgICAgICAgIDogZm9ybXMoa2V5KVsyXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3BlY2lhbChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAwIHx8IChudW1iZXIgPiAxMCAmJiBudW1iZXIgPCAyMCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZvcm1zKGtleSkge1xuICAgICAgICByZXR1cm4gdW5pdHNba2V5XS5zcGxpdCgnXycpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgcmVzdWx0ICsgdHJhbnNsYXRlU2luZ3VsYXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXlbMF0sIGlzRnV0dXJlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHNwZWNpYWwobnVtYmVyKSA/IGZvcm1zKGtleSlbMV0gOiBmb3JtcyhrZXkpWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyBmb3JtcyhrZXkpWzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHNwZWNpYWwobnVtYmVyKSA/IGZvcm1zKGtleSlbMV0gOiBmb3JtcyhrZXkpWzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgbHQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdsdCcsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdzYXVzaW9fdmFzYXJpb19rb3ZvX2JhbGFuZMW+aW9fZ2VndcW+xJdzX2JpcsW+ZWxpb19saWVwb3NfcnVncGrFq8SNaW9fcnVnc8SXam9fc3BhbGlvX2xhcGtyacSNaW9fZ3J1b2TFvmlvJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdzYXVzaXNfdmFzYXJpc19rb3Zhc19iYWxhbmRpc19nZWd1xb7El19iaXLFvmVsaXNfbGllcGFfcnVncGrFq3Rpc19ydWdzxJdqaXNfc3BhbGlzX2xhcGtyaXRpc19ncnVvZGlzJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NP3xNTU1NPyhcXFtbXlxcW1xcXV0qXFxdfFxccykrRFtvRF0/LyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdzYXVfdmFzX2tvdl9iYWxfZ2VnX2Jpcl9saWVfcmdwX3Jnc19zcGFfbGFwX2dyZCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ3Nla21hZGllbsSvX3Bpcm1hZGllbsSvX2FudHJhZGllbsSvX3RyZcSNaWFkaWVuxK9fa2V0dmlydGFkaWVuxK9fcGVua3RhZGllbsSvX8WhZcWhdGFkaWVuxK8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ3Nla21hZGllbmlzX3Bpcm1hZGllbmlzX2FudHJhZGllbmlzX3RyZcSNaWFkaWVuaXNfa2V0dmlydGFkaWVuaXNfcGVua3RhZGllbmlzX8WhZcWhdGFkaWVuaXMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9kZGRkIEhIOm1tLyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1Nla19QaXJfQW50X1RyZV9LZXRfUGVuX8WgZcWhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NfUF9BX1RfS19Qbl/FoCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0sIEhIOm1tIFt2YWwuXScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBkZGRkLCBISDptbSBbdmFsLl0nLFxuICAgICAgICAgICAgbDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgbGw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0nLFxuICAgICAgICAgICAgbGxsOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBISDptbSBbdmFsLl0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXSwgZGRkLCBISDptbSBbdmFsLl0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vFoGlhbmRpZW5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbUnl0b2pdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1Zha2FyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tQcmHEl2p1c8SvXSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAncG8gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByaWXFoSAlcycsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGVTZWNvbmRzLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LW9qaS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLW9qaSc7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBsdDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBMYXR2aWFuIFtsdl1cbi8vISBhdXRob3IgOiBLcmlzdGFwcyBLYXJsc29ucyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9za2Frcmlcbi8vISBhdXRob3IgOiBKxIFuaXMgRWxtZXJpcyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9KYW5pc0VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB1bml0cyA9IHtcbiAgICAgICAgc3M6ICdzZWt1bmRlc19zZWt1bmTEk21fc2VrdW5kZV9zZWt1bmRlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgbTogJ21pbsWrdGVzX21pbsWrdMSTbV9taW7Fq3RlX21pbsWrdGVzJy5zcGxpdCgnXycpLFxuICAgICAgICBtbTogJ21pbsWrdGVzX21pbsWrdMSTbV9taW7Fq3RlX21pbsWrdGVzJy5zcGxpdCgnXycpLFxuICAgICAgICBoOiAnc3R1bmRhc19zdHVuZMSBbV9zdHVuZGFfc3R1bmRhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgaGg6ICdzdHVuZGFzX3N0dW5kxIFtX3N0dW5kYV9zdHVuZGFzJy5zcGxpdCgnXycpLFxuICAgICAgICBkOiAnZGllbmFzX2RpZW7EgW1fZGllbmFfZGllbmFzJy5zcGxpdCgnXycpLFxuICAgICAgICBkZDogJ2RpZW5hc19kaWVuxIFtX2RpZW5hX2RpZW5hcycuc3BsaXQoJ18nKSxcbiAgICAgICAgTTogJ23Ek25lxaFhX23Ek25lxaFpZW1fbcSTbmVzaXNfbcSTbmXFoWknLnNwbGl0KCdfJyksXG4gICAgICAgIE1NOiAnbcSTbmXFoWFfbcSTbmXFoWllbV9txJNuZXNpc19txJNuZcWhaScuc3BsaXQoJ18nKSxcbiAgICAgICAgeTogJ2dhZGFfZ2FkaWVtX2dhZHNfZ2FkaScuc3BsaXQoJ18nKSxcbiAgICAgICAgeXk6ICdnYWRhX2dhZGllbV9nYWRzX2dhZGknLnNwbGl0KCdfJyksXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gd2l0aG91dFN1ZmZpeCBib29sZWFuIHRydWUgPSBhIGxlbmd0aCBvZiB0aW1lOyBmYWxzZSA9IGJlZm9yZS9hZnRlciBhIHBlcmlvZCBvZiB0aW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvcm1hdChmb3JtcywgbnVtYmVyLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAvLyBFLmcuIFwiMjEgbWluxat0ZVwiLCBcIjMgbWluxat0ZXNcIi5cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMSAmJiBudW1iZXIgJSAxMDAgIT09IDExID8gZm9ybXNbMl0gOiBmb3Jtc1szXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEUuZy4gXCIyMSBtaW7Fq3Rlc1wiIGFzIGluIFwicMSTYyAyMSBtaW7Fq3Rlc1wiLlxuICAgICAgICAgICAgLy8gRS5nLiBcIjMgbWluxat0xJNtXCIgYXMgaW4gXCJwxJNjIDMgbWluxat0xJNtXCIuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICUgMTAgPT09IDEgJiYgbnVtYmVyICUgMTAwICE9PSAxMSA/IGZvcm1zWzBdIDogZm9ybXNbMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFBsdXJhbChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgZm9ybWF0KHVuaXRzW2tleV0sIG51bWJlciwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcihudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHVuaXRzW2tleV0sIG51bWJlciwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlU2Vjb25kcyhudW1iZXIsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnZGHFvmFzIHNla3VuZGVzJyA6ICdkYcW+xIFtIHNla3VuZMSTbSc7XG4gICAgfVxuXG4gICAgdmFyIGx2ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbHYnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnbEgXJpc19mZWJydcSBcmlzX21hcnRzX2FwcsSrbGlzX21haWpzX2rFq25panNfasWrbGlqc19hdWd1c3RzX3NlcHRlbWJyaXNfb2t0b2JyaXNfbm92ZW1icmlzX2RlY2VtYnJpcycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcl9hcHJfbWFpX2rFq25fasWrbF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdzdsSTdGRpZW5hX3Bpcm1kaWVuYV9vdHJkaWVuYV90cmXFoWRpZW5hX2NldHVydGRpZW5hX3BpZWt0ZGllbmFfc2VzdGRpZW5hJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdl9QX09fVF9DX1BrX1MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3ZfUF9PX1RfQ19Qa19TJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZLicsXG4gICAgICAgICAgICBMTDogJ1lZWVkuIFtnYWRhXSBELiBNTU1NJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkuIFtnYWRhXSBELiBNTU1NLCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWS4gW2dhZGFdIEQuIE1NTU0sIGRkZGQsIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbxaBvZGllbiBwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tSxKt0IHB1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3B1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1Zha2FyIHB1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tQYWfEgWp1xaHEgV0gZGRkZCBbcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAncMSTYyAlcycsXG4gICAgICAgICAgICBwYXN0OiAncGlybXMgJXMnLFxuICAgICAgICAgICAgczogcmVsYXRpdmVTZWNvbmRzLFxuICAgICAgICAgICAgc3M6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtOiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGg6IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIGhoOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZDogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNOiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHk6IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGx2O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1vbnRlbmVncmluIFttZV1cbi8vISBhdXRob3IgOiBNaW9kcmFnIE5pa2HEjSA8bWlvZHJhZ0ByZXN0YXJ0aXQubWU+IDogaHR0cHM6Ly9naXRodWIuY29tL21pb2RyYWduaWthY1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRyYW5zbGF0b3IgPSB7XG4gICAgICAgIHdvcmRzOiB7XG4gICAgICAgICAgICAvL0RpZmZlcmVudCBncmFtbWF0aWNhbCBjYXNlc1xuICAgICAgICAgICAgc3M6IFsnc2VrdW5kJywgJ3Nla3VuZGEnLCAnc2VrdW5kaSddLFxuICAgICAgICAgICAgbTogWydqZWRhbiBtaW51dCcsICdqZWRub2cgbWludXRhJ10sXG4gICAgICAgICAgICBtbTogWydtaW51dCcsICdtaW51dGEnLCAnbWludXRhJ10sXG4gICAgICAgICAgICBoOiBbJ2plZGFuIHNhdCcsICdqZWRub2cgc2F0YSddLFxuICAgICAgICAgICAgaGg6IFsnc2F0JywgJ3NhdGEnLCAnc2F0aSddLFxuICAgICAgICAgICAgZGQ6IFsnZGFuJywgJ2RhbmEnLCAnZGFuYSddLFxuICAgICAgICAgICAgTU06IFsnbWplc2VjJywgJ21qZXNlY2EnLCAnbWplc2VjaSddLFxuICAgICAgICAgICAgeXk6IFsnZ29kaW5hJywgJ2dvZGluZScsICdnb2RpbmEnXSxcbiAgICAgICAgfSxcbiAgICAgICAgY29ycmVjdEdyYW1tYXRpY2FsQ2FzZTogZnVuY3Rpb24gKG51bWJlciwgd29yZEtleSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gMVxuICAgICAgICAgICAgICAgID8gd29yZEtleVswXVxuICAgICAgICAgICAgICAgIDogbnVtYmVyID49IDIgJiYgbnVtYmVyIDw9IDRcbiAgICAgICAgICAgICAgICAgID8gd29yZEtleVsxXVxuICAgICAgICAgICAgICAgICAgOiB3b3JkS2V5WzJdO1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICAgICAgdmFyIHdvcmRLZXkgPSB0cmFuc2xhdG9yLndvcmRzW2tleV07XG4gICAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gd29yZEtleVswXSA6IHdvcmRLZXlbMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIG51bWJlciArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0b3IuY29ycmVjdEdyYW1tYXRpY2FsQ2FzZShudW1iZXIsIHdvcmRLZXkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgdmFyIG1lID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbWUnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnRfYXByaWxfbWFqX2p1bl9qdWxfYXZndXN0X3NlcHRlbWJhcl9va3RvYmFyX25vdmVtYmFyX2RlY2VtYmFyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hal9qdW5fanVsX2F2Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWRqZWxqYV9wb25lZGplbGpha191dG9yYWtfc3JpamVkYV/EjWV0dnJ0YWtfcGV0YWtfc3Vib3RhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVkLl9wb24uX3V0by5fc3JpLl/EjWV0Ll9wZXQuX3N1Yi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdXRfc3JfxI1lX3BlX3N1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3NqdXRyYSB1XSBMVCcsXG5cbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRqZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3NyaWplZHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzdWJvdHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdcSNZSB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBsYXN0V2Vla0RheXMgPSBbXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW25lZGplbGplXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbcG9uZWRqZWxqa2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFt1dG9ya2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW3NyaWplZGVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFvEjWV0dnJ0a2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFtwZXRrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbc3Vib3RlXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RXZWVrRGF5c1t0aGlzLmRheSgpXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmlqZSAlcycsXG4gICAgICAgICAgICBzOiAnbmVrb2xpa28gc2VrdW5kaScsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogJ2RhbicsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiAnbWplc2VjJyxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6ICdnb2RpbnUnLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1lO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hb3JpIFttaV1cbi8vISBhdXRob3IgOiBKb2huIENvcnJpZ2FuIDxyb2JiaWVjbG9zZXRAZ21haWwuY29tPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb2huaWRlYWxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtaSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21pJywge1xuICAgICAgICBtb250aHM6ICdLb2hpLXTEgXRlX0h1aS10YW5ndXJ1X1BvdXTFqy10ZS1yYW5naV9QYWVuZ2Etd2jEgXdoxIFfSGFyYXR1YV9QaXBpcmlfSMWNbmdvaW5nb2lfSGVyZS10dXJpLWvFjWvEgV9NYWh1cnVfV2hpcmluZ2EtxIEtbnVrdV9XaGlyaW5nYS3EgS1yYW5naV9IYWtpaGVhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdLb2hpX0h1aV9Qb3VfUGFlX0hhcmFfUGlwaV9IxY1uZ29pX0hlcmVfTWFodV9XaGktbnVfV2hpLXJhX0hha2knLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUmVnZXg6IC8oPzpbJ2EtelxcdTAxMDFcXHUwMTREXFx1MDE2Ql0rXFwtPyl7MSwzfS9pLFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDogLyg/OlsnYS16XFx1MDEwMVxcdTAxNERcXHUwMTZCXStcXC0/KXsxLDN9L2ksXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IC8oPzpbJ2EtelxcdTAxMDFcXHUwMTREXFx1MDE2Ql0rXFwtPyl7MSwzfS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OiAvKD86WydhLXpcXHUwMTAxXFx1MDE0RFxcdTAxNkJdK1xcLT8pezEsMn0vaSxcbiAgICAgICAgd2Vla2RheXM6ICdSxIF0YXB1X01hbmVfVMWrcmVpX1dlbmVyZWlfVMSBaXRlX1BhcmFpcmVfSMSBdGFyZWknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdUYV9NYV9UxatfV2VfVMSBaV9QYV9IxIEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnVGFfTWFfVMWrX1dlX1TEgWlfUGFfSMSBJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtpXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgW2ldIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaSB0ZWllIG1haGFuYSwgaV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1thcG9wbyBpXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2ldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaW5hbmFoaSBpXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3doYWthbXV0dW5nYSBpXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2kgcm90byBpICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBpIG11YScsXG4gICAgICAgICAgICBzOiAndGUgaMSTa29uYSBydWFydWEnLFxuICAgICAgICAgICAgc3M6ICclZCBoxJNrb25hJyxcbiAgICAgICAgICAgIG06ICdoZSBtZW5ldGknLFxuICAgICAgICAgICAgbW06ICclZCBtZW5ldGknLFxuICAgICAgICAgICAgaDogJ3RlIGhhb3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaGFvcmEnLFxuICAgICAgICAgICAgZDogJ2hlIHJhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgcmEnLFxuICAgICAgICAgICAgTTogJ2hlIG1hcmFtYScsXG4gICAgICAgICAgICBNTTogJyVkIG1hcmFtYScsXG4gICAgICAgICAgICB5OiAnaGUgdGF1JyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGF1JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtaTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWNlZG9uaWFuIFtta11cbi8vISBhdXRob3IgOiBCb3Jpc2xhdiBNaWNrb3YgOiBodHRwczovL2dpdGh1Yi5jb20vQjBrMFxuLy8hIGF1dGhvciA6IFNhc2hrbyBUb2Rvcm92IDogaHR0cHM6Ly9naXRodWIuY29tL2JreWNlaFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1rID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbWsnLCB7XG4gICAgICAgIG1vbnRoczogJ9GY0LDQvdGD0LDRgNC4X9GE0LXQstGA0YPQsNGA0Lhf0LzQsNGA0YJf0LDQv9GA0LjQu1/QvNCw0Zhf0ZjRg9C90Lhf0ZjRg9C70Lhf0LDQstCz0YPRgdGCX9GB0LXQv9GC0LXQvNCy0YDQuF/QvtC60YLQvtC80LLRgNC4X9C90L7QtdC80LLRgNC4X9C00LXQutC10LzQstGA0LgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0ZjQsNC9X9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDRmF/RmNGD0L1f0ZjRg9C7X9Cw0LLQs1/RgdC10L9f0L7QutGCX9C90L7QtV/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn0L3QtdC00LXQu9CwX9C/0L7QvdC10LTQtdC70L3QuNC6X9Cy0YLQvtGA0L3QuNC6X9GB0YDQtdC00LBf0YfQtdGC0LLRgNGC0L7Qul/Qv9C10YLQvtC6X9GB0LDQsdC+0YLQsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C90LXQtF/Qv9C+0L1f0LLRgtC+X9GB0YDQtV/Rh9C10YJf0L/QtdGCX9GB0LDQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvWVf0L9vX9Cy0YJf0YHRgF/Rh9C1X9C/0LVf0YFhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQlNC10L3QtdGBINCy0L5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0KPRgtGA0LUg0LLQvl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb0JLQvl0gZGRkZCBb0LLQvl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQktGH0LXRgNCwINCy0L5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQmNC30LzQuNC90LDRgtCw0YLQsF0gZGRkZCBb0LLQvl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQmNC30LzQuNC90LDRgtC40L7Rgl0gZGRkZCBb0LLQvl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9C30LAgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9C/0YDQtdC0ICVzJyxcbiAgICAgICAgICAgIHM6ICfQvdC10LrQvtC70LrRgyDRgdC10LrRg9C90LTQuCcsXG4gICAgICAgICAgICBzczogJyVkINGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIG06ICfQtdC00L3QsCDQvNC40L3Rg9GC0LAnLFxuICAgICAgICAgICAgbW06ICclZCDQvNC40L3Rg9GC0LgnLFxuICAgICAgICAgICAgaDogJ9C10LTQtdC9INGH0LDRgScsXG4gICAgICAgICAgICBoaDogJyVkINGH0LDRgdCwJyxcbiAgICAgICAgICAgIGQ6ICfQtdC00LXQvSDQtNC10L0nLFxuICAgICAgICAgICAgZGQ6ICclZCDQtNC10L3QsCcsXG4gICAgICAgICAgICBNOiAn0LXQtNC10L0g0LzQtdGB0LXRhicsXG4gICAgICAgICAgICBNTTogJyVkINC80LXRgdC10YbQuCcsXG4gICAgICAgICAgICB5OiAn0LXQtNC90LAg0LPQvtC00LjQvdCwJyxcbiAgICAgICAgICAgIHl5OiAnJWQg0LPQvtC00LjQvdC4JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQtdCyfNC10L180YLQuHzQstC4fNGA0Lh80LzQuCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgbGFzdERpZ2l0ID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgbGFzdDJEaWdpdHMgPSBudW1iZXIgJSAxMDA7XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LXQsic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3QyRGlnaXRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LXQvSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3QyRGlnaXRzID4gMTAgJiYgbGFzdDJEaWdpdHMgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGC0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QstC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0YDQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gNyB8fCBsYXN0RGlnaXQgPT09IDgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QvNC4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0YLQuCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtaztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWxheWFsYW0gW21sXVxuLy8hIGF1dGhvciA6IEZsb3lkIFBpbmsgOiBodHRwczovL2dpdGh1Yi5jb20vZmxveWRwaW5rXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbWwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtbCcsIHtcbiAgICAgICAgbW9udGhzOiAn4LSc4LSo4LWB4LS14LSw4LS/X+C0q+C1huC0rOC1jeC0sOC1geC0teC0sOC0v1/gtK7gtL7gtbzgtJrgtY3gtJrgtY1f4LSP4LSq4LWN4LSw4LS/4LW9X+C0ruC1h+C0r+C1jV/gtJzgtYLgtbpf4LSc4LWC4LSy4LWIX+C0k+C0l+C0uOC1jeC0seC1jeC0seC1jV/gtLjgtYbgtKrgtY3gtLHgtY3gtLHgtILgtKzgtbxf4LSS4LSV4LWN4LSf4LWL4LSs4LW8X+C0qOC0teC0guC0rOC1vF/gtKHgtL/gtLjgtILgtKzgtbwnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+C0nOC0qOC1gS5f4LSr4LWG4LSs4LWN4LSw4LWBLl/gtK7gtL7gtbwuX+C0j+C0quC1jeC0sOC0vy5f4LSu4LWH4LSv4LWNX+C0nOC1guC1ul/gtJzgtYLgtLLgtYguX+C0k+C0ly5f4LS44LWG4LSq4LWN4LSx4LWN4LSxLl/gtJLgtJXgtY3gtJ/gtYsuX+C0qOC0teC0gi5f4LSh4LS/4LS44LSCLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfgtJ7gtL7gtK/gtLHgtL7gtLTgtY3gtJpf4LSk4LS/4LSZ4LWN4LSV4LSz4LS+4LS04LWN4LSaX+C0muC1iuC0teC1jeC0teC0vuC0tOC1jeC0ml/gtKzgtYHgtKfgtKjgtL7gtLTgtY3gtJpf4LS14LWN4LSv4LS+4LS04LS+4LS04LWN4LSaX+C0teC1huC0s+C1jeC0s+C0v+C0r+C0vuC0tOC1jeC0ml/gtLbgtKjgtL/gtK/gtL7gtLTgtY3gtJonLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+C0nuC0vuC0r+C1vF/gtKTgtL/gtJngtY3gtJXgtb5f4LSa4LWK4LS14LWN4LS1X+C0rOC1geC0p+C1u1/gtLXgtY3gtK/gtL7gtLTgtIJf4LS14LWG4LSz4LWN4LSz4LS/X+C0tuC0qOC0vycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgtJ7gtL5f4LSk4LS/X+C0muC1il/gtKzgtYFf4LS14LWN4LSv4LS+X+C0teC1hl/gtLYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSAt4LSo4LWBJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyAt4LSo4LWBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSAt4LSo4LWBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIC3gtKjgtYEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgtIfgtKjgtY3gtKjgtY1dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4LSo4LS+4LSz4LWGXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4LSH4LSo4LWN4LSo4LSy4LWGXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgtJXgtLTgtL/gtJ7gtY3gtJ5dIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4LSV4LS04LS/4LSe4LWN4LSe4LWNJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgtK7gtYHgtbvgtKrgtY0nLFxuICAgICAgICAgICAgczogJ+C0heC1veC0qiDgtKjgtL/gtK7gtL/gtLfgtJngtY3gtJngtb4nLFxuICAgICAgICAgICAgc3M6ICclZCDgtLjgtYbgtJXgtY3gtJXgtbvgtKHgtY0nLFxuICAgICAgICAgICAgbTogJ+C0kuC0sOC1gSDgtK7gtL/gtKjgtL/gtLHgtY3gtLHgtY0nLFxuICAgICAgICAgICAgbW06ICclZCDgtK7gtL/gtKjgtL/gtLHgtY3gtLHgtY0nLFxuICAgICAgICAgICAgaDogJ+C0kuC0sOC1gSDgtK7gtKPgtL/gtJXgtY3gtJXgtYLgtbwnLFxuICAgICAgICAgICAgaGg6ICclZCDgtK7gtKPgtL/gtJXgtY3gtJXgtYLgtbwnLFxuICAgICAgICAgICAgZDogJ+C0kuC0sOC1gSDgtKbgtL/gtLXgtLjgtIInLFxuICAgICAgICAgICAgZGQ6ICclZCDgtKbgtL/gtLXgtLjgtIInLFxuICAgICAgICAgICAgTTogJ+C0kuC0sOC1gSDgtK7gtL7gtLjgtIInLFxuICAgICAgICAgICAgTU06ICclZCDgtK7gtL7gtLjgtIInLFxuICAgICAgICAgICAgeTogJ+C0kuC0sOC1gSDgtLXgtbzgtLfgtIInLFxuICAgICAgICAgICAgeXk6ICclZCDgtLXgtbzgtLfgtIInLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LSw4LS+4LSk4LWN4LSw4LS/fOC0sOC0vuC0teC0v+C0suC1hnzgtIngtJrgtY3gtJog4LSV4LS04LS/4LSe4LWN4LSe4LWNfOC0teC1iOC0leC1geC0qOC1jeC0qOC1h+C0sOC0gnzgtLDgtL7gtKTgtY3gtLDgtL8vaSxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+C0sOC0vuC0pOC1jeC0sOC0vycgJiYgaG91ciA+PSA0KSB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4LSJ4LSa4LWN4LSaIOC0leC0tOC0v+C0nuC1jeC0nuC1jScgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+C0teC1iOC0leC1geC0qOC1jeC0qOC1h+C0sOC0gidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtLDgtL7gtKTgtY3gtLDgtL8nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C0sOC0vuC0teC0v+C0suC1hic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LSJ4LSa4LWN4LSaIOC0leC0tOC0v+C0nuC1jeC0nuC1jSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LS14LWI4LSV4LWB4LSo4LWN4LSo4LWH4LSw4LSCJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtLDgtL7gtKTgtY3gtLDgtL8nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1sO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1vbmdvbGlhbiBbbW5dXG4vLyEgYXV0aG9yIDogSmF2a2hsYW50dWdzIE55YW1kb3JqIDogaHR0cHM6Ly9naXRodWIuY29tL2phdmtoYWFuajdcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9GF0Y3QtNGF0Y3QvSDRgdC10LrRg9C90LQnIDogJ9GF0Y3QtNGF0Y3QvSDRgdC10LrRg9C90LTRi9C9JztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINGB0LXQutGD0L3QtCcgOiAnINGB0LXQutGD0L3QtNGL0L0nKTtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg0LzQuNC90YPRgicgOiAnINC80LjQvdGD0YLRi9C9Jyk7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINGG0LDQsycgOiAnINGG0LDQs9C40LnQvScpO1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDTqdC006nRgCcgOiAnINOp0LTRgNC40LnQvScpO1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDRgdCw0YAnIDogJyDRgdCw0YDRi9C9Jyk7XG4gICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINC20LjQuycgOiAnINC20LjQu9C40LnQvScpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1uID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbW4nLCB7XG4gICAgICAgIG1vbnRoczogJ9Cd0Y3Qs9C00q/Qs9GN0Y3RgCDRgdCw0YBf0KXQvtGR0YDQtNGD0LPQsNCw0YAg0YHQsNGAX9CT0YPRgNCw0LLQtNGD0LPQsNCw0YAg0YHQsNGAX9CU06nRgNOp0LLQtNKv0LPRjdGN0YAg0YHQsNGAX9Ci0LDQstC00YPQs9Cw0LDRgCDRgdCw0YBf0JfRg9GA0LPQsNC00YPQs9Cw0LDRgCDRgdCw0YBf0JTQvtC70LTRg9Cz0LDQsNGAINGB0LDRgF/QndCw0LnQvNC00YPQs9Cw0LDRgCDRgdCw0YBf0JXRgdC00q/Qs9GN0Y3RgCDRgdCw0YBf0JDRgNCw0LLQtNGD0LPQsNCw0YAg0YHQsNGAX9CQ0YDQstCw0L0g0L3RjdCz0LTSr9Cz0Y3RjdGAINGB0LDRgF/QkNGA0LLQsNC9INGF0L7RkdGA0LTRg9Cz0LDQsNGAINGB0LDRgCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnMSDRgdCw0YBfMiDRgdCw0YBfMyDRgdCw0YBfNCDRgdCw0YBfNSDRgdCw0YBfNiDRgdCw0YBfNyDRgdCw0YBfOCDRgdCw0YBfOSDRgdCw0YBfMTAg0YHQsNGAXzExINGB0LDRgF8xMiDRgdCw0YAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfQndGP0Lxf0JTQsNCy0LDQsF/QnNGP0LPQvNCw0YBf0JvRhdCw0LPQstCwX9Cf0q/RgNGN0LJf0JHQsNCw0YHQsNC9X9CR0Y/QvNCx0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQndGP0Lxf0JTQsNCyX9Cc0Y/Qs1/Qm9GF0LBf0J/Sr9GAX9CR0LDQsF/QkdGP0LwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0J3Rj1/QlNCwX9Cc0Y9f0JvRhV/Qn9KvX9CR0LBf0JHRjycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVkg0L7QvdGLIE1NTU3Ri9C9IEQnLFxuICAgICAgICAgICAgTExMOiAnWVlZWSDQvtC90YsgTU1NTdGL0L0gRCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgWVlZWSDQvtC90YsgTU1NTdGL0L0gRCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/SrtOofNKu0KUvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfSrtClJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Ku06gnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Ku0KUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vTqNC906nTqdC006nRgF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQnNCw0YDQs9Cw0LDRiF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb0JjRgNGN0YVdIGRkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vTqNGH0LjQs9C006nRgF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb06jQvdCz06nRgNGB06nQvV0gZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINC00LDRgNCw0LAnLFxuICAgICAgICAgICAgcGFzdDogJyVzINOp0LzQvdOpJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9INOp0LTTqdGALyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINOp0LTTqdGAJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1uO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hcmF0aGkgW21yXVxuLy8hIGF1dGhvciA6IEhhcnNoYWQgS2FsZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rYWxlaHZcbi8vISBhdXRob3IgOiBWaXZlayBBdGhhbHllIDogaHR0cHM6Ly9naXRodWIuY29tL3ZuYXRoYWx5ZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgpacnLFxuICAgICAgICAgICAgMjogJ+ClqCcsXG4gICAgICAgICAgICAzOiAn4KWpJyxcbiAgICAgICAgICAgIDQ6ICfgpaonLFxuICAgICAgICAgICAgNTogJ+ClqycsXG4gICAgICAgICAgICA2OiAn4KWsJyxcbiAgICAgICAgICAgIDc6ICfgpa0nLFxuICAgICAgICAgICAgODogJ+ClricsXG4gICAgICAgICAgICA5OiAn4KWvJyxcbiAgICAgICAgICAgIDA6ICfgpaYnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KWnJzogJzEnLFxuICAgICAgICAgICAgJ+ClqCc6ICcyJyxcbiAgICAgICAgICAgICfgpaknOiAnMycsXG4gICAgICAgICAgICAn4KWqJzogJzQnLFxuICAgICAgICAgICAgJ+Clqyc6ICc1JyxcbiAgICAgICAgICAgICfgpawnOiAnNicsXG4gICAgICAgICAgICAn4KWtJzogJzcnLFxuICAgICAgICAgICAgJ+Clric6ICc4JyxcbiAgICAgICAgICAgICfgpa8nOiAnOScsXG4gICAgICAgICAgICAn4KWmJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lTXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSAnJztcbiAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpJXgpL7gpLngpYAg4KS44KWH4KSV4KSC4KSmJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KS44KWH4KSV4KSC4KSmJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJUg4KSu4KS/4KSo4KS/4KSfJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSu4KS/4KSo4KS/4KSf4KWHJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJUg4KSk4KS+4KS4JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSk4KS+4KS4JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJUg4KSm4KS/4KS14KS4JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSm4KS/4KS14KS4JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJUg4KSu4KS54KS/4KSo4KS+JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSu4KS54KS/4KSo4KWHJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJUg4KS14KSw4KWN4KS3JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KS14KSw4KWN4KS34KWHJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHN0cmluZykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSV4KS+4KS54KWAIOCkuOClh+CkleCkguCkpuCkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkuOClh+CkleCkguCkpuCkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkruCkv+CkqOCkv+Ckn+Ckvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkruCkv+CkqOCkv+Ckn+CkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkpOCkvuCkuOCkvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkpOCkvuCkuOCkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkpuCkv+CkteCkuOCkvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkpuCkv+CkteCkuOCkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkruCkueCkv+CkqOCljeCkr+Ckvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkruCkueCkv+CkqOCljeCkr+CkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkteCksOCljeCkt+Ckvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkteCksOCljeCkt+CkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgbXIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtcicsIHtcbiAgICAgICAgbW9udGhzOiAn4KSc4KS+4KSo4KWH4KS14KS+4KSw4KWAX+Ckq+Clh+CkrOCljeCksOClgeCkteCkvuCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSP4KSq4KWN4KSw4KS/4KSyX+CkruClh1/gpJzgpYLgpKhf4KSc4KWB4KSy4KWIX+CkkeCkl+CkuOCljeCkn1/gpLjgpKrgpY3gpJ/gpYfgpILgpKzgpLBf4KSR4KSV4KWN4KSf4KWL4KSs4KSwX+CkqOCli+CkteCljeCkueClh+CkguCkrOCksF/gpKHgpL/gpLjgpYfgpILgpKzgpLAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CknOCkvuCkqOClhy5f4KSr4KWH4KSs4KWN4KSw4KWBLl/gpK7gpL7gpLDgpY3gpJouX+Ckj+CkquCljeCksOCkvy5f4KSu4KWHLl/gpJzgpYLgpKguX+CknOClgeCksuCliC5f4KSR4KSXLl/gpLjgpKrgpY3gpJ/gpYfgpIIuX+CkkeCkleCljeCkn+Cliy5f4KSo4KWL4KS14KWN4KS54KWH4KSCLl/gpKHgpL/gpLjgpYfgpIIuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn4KSw4KS14KS/4KS14KS+4KSwX+CkuOCli+CkruCkteCkvuCksF/gpK7gpILgpJfgpLPgpLXgpL7gpLBf4KSs4KWB4KSn4KS14KS+4KSwX+Ckl+ClgeCksOClguCkteCkvuCksF/gpLbgpYHgpJXgpY3gpLDgpLXgpL7gpLBf4KS24KSo4KS/4KS14KS+4KSwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4KSw4KS14KS/X+CkuOCli+Ckrl/gpK7gpILgpJfgpLNf4KSs4KWB4KSnX+Ckl+ClgeCksOClgl/gpLbgpYHgpJXgpY3gpLBf4KS24KSo4KS/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CksF/gpLjgpYtf4KSu4KSCX+CkrOClgV/gpJfgpYFf4KS24KWBX+Ckticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIOCkteCkvuCknOCkpOCkvicsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3Mg4KS14KS+4KSc4KSk4KS+JyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgpLXgpL7gpJzgpKTgpL4nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4KS14KS+4KSc4KSk4KS+JyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KSG4KScXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CkieCkpuCljeCkr+Ckvl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CkleCkvuCksl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KSu4KS+4KSX4KWA4KSyXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz4KSu4KSn4KWN4KSv4KWHJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+CkquClguCksOCljeCkteClgCcsXG4gICAgICAgICAgICBzOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIHNzOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIG06IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgaDogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBkOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIE06IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgeTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgpafgpajgpangpargpavgpazgpa3gpa7gpa/gpaZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gpKrgpLngpL7gpJ/gpYd84KS44KSV4KS+4KSz4KWAfOCkpuClgeCkquCkvuCksOClgHzgpLjgpL7gpK/gpILgpJXgpL7gpLPgpYB84KSw4KS+4KSk4KWN4KSw4KWALyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4KSq4KS54KS+4KSf4KWHJyB8fCBtZXJpZGllbSA9PT0gJ+CkuOCkleCkvuCks+ClgCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgpKbgpYHgpKrgpL7gpLDgpYAnIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgpLjgpL7gpK/gpILgpJXgpL7gpLPgpYAnIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgpLDgpL7gpKTgpY3gpLDgpYAnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMiA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA+PSAwICYmIGhvdXIgPCA2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKrgpLngpL7gpJ/gpYcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOCkleCkvuCks+ClgCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KWB4KSq4KS+4KSw4KWAJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpL7gpK/gpILgpJXgpL7gpLPgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOCljeCksOClgCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWxheSBbbXMtbXldXG4vLyEgbm90ZSA6IERFUFJFQ0FURUQsIHRoZSBjb3JyZWN0IG9uZSBpcyBbbXNdXG4vLyEgYXV0aG9yIDogV2VsZGFuIEphbWlsaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS93ZWxkYW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtc015ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbXMtbXknLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcmlfRmVicnVhcmlfTWFjX0FwcmlsX01laV9KdW5fSnVsYWlfT2dvc19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EaXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hY19BcHJfTWVpX0p1bl9KdWxfT2dzX1NlcF9Pa3RfTm92X0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdBaGFkX0lzbmluX1NlbGFzYV9SYWJ1X0toYW1pc19KdW1hYXRfU2FidHUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdBaGRfSXNuX1NlbF9SYWJfS2hhX0p1bV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnQWhfSXNfU2xfUmJfS21fSm1fU2InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hILm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9wYWdpfHRlbmdhaGFyaXxwZXRhbmd8bWFsYW0vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdwYWdpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3RlbmdhaGFyaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAncGV0YW5nJyB8fCBtZXJpZGllbSA9PT0gJ21hbGFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdwYWdpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAndGVuZ2FoYXJpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGV0YW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdtYWxhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hhcmkgaW5pIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0Vzb2sgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS2VsbWFyaW4gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbbGVwYXMgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFsYW0gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHlhbmcgbGVwYXMnLFxuICAgICAgICAgICAgczogJ2JlYmVyYXBhIHNhYXQnLFxuICAgICAgICAgICAgc3M6ICclZCBzYWF0JyxcbiAgICAgICAgICAgIG06ICdzZW1pbml0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWluaXQnLFxuICAgICAgICAgICAgaDogJ3NlamFtJyxcbiAgICAgICAgICAgIGhoOiAnJWQgamFtJyxcbiAgICAgICAgICAgIGQ6ICdzZWhhcmknLFxuICAgICAgICAgICAgZGQ6ICclZCBoYXJpJyxcbiAgICAgICAgICAgIE06ICdzZWJ1bGFuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgYnVsYW4nLFxuICAgICAgICAgICAgeTogJ3NldGFodW4nLFxuICAgICAgICAgICAgeXk6ICclZCB0YWh1bicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtc015O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hbGF5IFttc11cbi8vISBhdXRob3IgOiBXZWxkYW4gSmFtaWxpIDogaHR0cHM6Ly9naXRodWIuY29tL3dlbGRhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1zID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbXMnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcmlfRmVicnVhcmlfTWFjX0FwcmlsX01laV9KdW5fSnVsYWlfT2dvc19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EaXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hY19BcHJfTWVpX0p1bl9KdWxfT2dzX1NlcF9Pa3RfTm92X0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdBaGFkX0lzbmluX1NlbGFzYV9SYWJ1X0toYW1pc19KdW1hYXRfU2FidHUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdBaGRfSXNuX1NlbF9SYWJfS2hhX0p1bV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnQWhfSXNfU2xfUmJfS21fSm1fU2InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hILm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9wYWdpfHRlbmdhaGFyaXxwZXRhbmd8bWFsYW0vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdwYWdpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3RlbmdhaGFyaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAncGV0YW5nJyB8fCBtZXJpZGllbSA9PT0gJ21hbGFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdwYWdpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAndGVuZ2FoYXJpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGV0YW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdtYWxhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hhcmkgaW5pIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0Vzb2sgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS2VsbWFyaW4gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbbGVwYXMgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFsYW0gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHlhbmcgbGVwYXMnLFxuICAgICAgICAgICAgczogJ2JlYmVyYXBhIHNhYXQnLFxuICAgICAgICAgICAgc3M6ICclZCBzYWF0JyxcbiAgICAgICAgICAgIG06ICdzZW1pbml0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWluaXQnLFxuICAgICAgICAgICAgaDogJ3NlamFtJyxcbiAgICAgICAgICAgIGhoOiAnJWQgamFtJyxcbiAgICAgICAgICAgIGQ6ICdzZWhhcmknLFxuICAgICAgICAgICAgZGQ6ICclZCBoYXJpJyxcbiAgICAgICAgICAgIE06ICdzZWJ1bGFuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgYnVsYW4nLFxuICAgICAgICAgICAgeTogJ3NldGFodW4nLFxuICAgICAgICAgICAgeXk6ICclZCB0YWh1bicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWx0ZXNlIChNYWx0YSkgW210XVxuLy8hIGF1dGhvciA6IEFsZXNzYW5kcm8gTWFydWNjaWEgOiBodHRwczovL2dpdGh1Yi5jb20vYWxlc21hXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtdCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFubmFyX0ZyYXJfTWFyenVfQXByaWxfTWVqanVfxKB1bmp1X0x1bGp1X0F3d2lzc3VfU2V0dGVtYnJ1X090dHVicnVfTm92ZW1icnVfRGnEi2VtYnJ1Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GcmFfTWFyX0Fwcl9NZWpfxKB1bl9MdWxfQXd3X1NldF9PdHRfTm92X0RpxIsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ0lsLcSmYWRkX0l0LVRuZWpuX0l0LVRsaWV0YV9MLUVyYmfEp2FfSWwtxKZhbWlzX0lsLcSgaW1nxKdhX0lzLVNpYnQnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ8SmYWRfVG5lX1RsaV9FcmJfxKZhbV/EoGltX1NpYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfEpmFfVG5fVGxfRXJfxKZhX8SgaV9TaScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tJbGx1bSBmaWwtXUxUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbR8SnYWRhIGZpbC1dTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtmaWwtXUxUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSWwtYmllcmHEpyBmaWwtXUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbbGkgZ8SnYWRkYV0gW2ZpbC1dTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdm4oCZICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBpbHUnLFxuICAgICAgICAgICAgczogJ2Z0aXQgc2Vrb25kaScsXG4gICAgICAgICAgICBzczogJyVkIHNla29uZGknLFxuICAgICAgICAgICAgbTogJ21pbnV0YScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0aScsXG4gICAgICAgICAgICBoOiAnc2llZ8SnYScsXG4gICAgICAgICAgICBoaDogJyVkIHNpZWfEp2F0JyxcbiAgICAgICAgICAgIGQ6ICfEoXVybmF0YScsXG4gICAgICAgICAgICBkZDogJyVkIMShcmFuZXQnLFxuICAgICAgICAgICAgTTogJ3hhaGFyJyxcbiAgICAgICAgICAgIE1NOiAnJWQgeGh1cicsXG4gICAgICAgICAgICB5OiAnc2VuYScsXG4gICAgICAgICAgICB5eTogJyVkIHNuaScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbXQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQnVybWVzZSBbbXldXG4vLyEgYXV0aG9yIDogU3F1YXIgdGVhbSwgbXlzcXVhci5jb21cbi8vISBhdXRob3IgOiBEYXZpZCBSb3NzZWxsYXQgOiBodHRwczovL2dpdGh1Yi5jb20vZ2hvbGFkclxuLy8hIGF1dGhvciA6IFRpbiBBdW5nIExpbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS90aGFueWF3emlubWluXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+GBgScsXG4gICAgICAgICAgICAyOiAn4YGCJyxcbiAgICAgICAgICAgIDM6ICfhgYMnLFxuICAgICAgICAgICAgNDogJ+GBhCcsXG4gICAgICAgICAgICA1OiAn4YGFJyxcbiAgICAgICAgICAgIDY6ICfhgYYnLFxuICAgICAgICAgICAgNzogJ+GBhycsXG4gICAgICAgICAgICA4OiAn4YGIJyxcbiAgICAgICAgICAgIDk6ICfhgYknLFxuICAgICAgICAgICAgMDogJ+GBgCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfhgYEnOiAnMScsXG4gICAgICAgICAgICAn4YGCJzogJzInLFxuICAgICAgICAgICAgJ+GBgyc6ICczJyxcbiAgICAgICAgICAgICfhgYQnOiAnNCcsXG4gICAgICAgICAgICAn4YGFJzogJzUnLFxuICAgICAgICAgICAgJ+GBhic6ICc2JyxcbiAgICAgICAgICAgICfhgYcnOiAnNycsXG4gICAgICAgICAgICAn4YGIJzogJzgnLFxuICAgICAgICAgICAgJ+GBiSc6ICc5JyxcbiAgICAgICAgICAgICfhgYAnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgbXkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdteScsIHtcbiAgICAgICAgbW9udGhzOiAn4YCH4YCU4YC64YCU4YCd4YCr4YCb4YCuX+GAluGAseGAluGAseGArOGAuuGAneGAq+GAm+GArl/hgJnhgJDhgLpf4YCn4YCV4YC84YCuX+GAmeGAsV/hgIfhgL3hgJThgLpf4YCH4YCw4YCc4YCt4YCv4YCE4YC6X+GAnuGAvOGAguGAr+GAkOGAul/hgIXhgIDhgLrhgJDhgIThgLrhgJjhgKxf4YCh4YCx4YCs4YCA4YC64YCQ4YCt4YCv4YCY4YCsX+GAlOGAreGAr+GAneGAhOGAuuGAmOGArF/hgJLhgK7hgIfhgIThgLrhgJjhgKwnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn4YCH4YCU4YC6X+GAluGAsV/hgJnhgJDhgLpf4YCV4YC84YCuX+GAmeGAsV/hgIfhgL3hgJThgLpf4YCc4YCt4YCv4YCE4YC6X+GAnuGAvF/hgIXhgIDhgLpf4YCh4YCx4YCs4YCA4YC6X+GAlOGAreGAr1/hgJLhgK4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn4YCQ4YCU4YCE4YC64YC54YCC4YCU4YC94YCxX+GAkOGAlOGAhOGAuuGAueGAnOGArF/hgKHhgIThgLrhgLnhgILhgKtf4YCX4YCv4YCS4YC54YCT4YCf4YCw4YC4X+GAgOGAvOGArOGAnuGAleGAkOGAseGAuF/hgJ7hgLHhgKzhgIDhgLzhgKxf4YCF4YCU4YCxJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4YCU4YC94YCxX+GAnOGArF/hgILhgKtf4YCf4YCw4YC4X+GAgOGAvOGArF/hgJ7hgLHhgKxf4YCU4YCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+GAlOGAveGAsV/hgJzhgKxf4YCC4YCrX+GAn+GAsOGAuF/hgIDhgLzhgKxf4YCe4YCx4YCsX+GAlOGAsScuc3BsaXQoJ18nKSxcblxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4YCa4YCU4YCxLl0gTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1vhgJnhgJThgIDhgLrhgJbhgLzhgJThgLpdIExUIFvhgJnhgL7hgKxdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+GAmeGAlOGAsS7hgIBdIExUIFvhgJnhgL7hgKxdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+GAleGAvOGAruGAuOGAgeGAsuGAt+GAnuGAseGArF0gZGRkZCBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ+GAnOGArOGAmeGAiuGAuuGAtyAlcyDhgJnhgL7hgKwnLFxuICAgICAgICAgICAgcGFzdDogJ+GAnOGAveGAlOGAuuGAgeGAsuGAt+GAnuGAseGArCAlcyDhgIAnLFxuICAgICAgICAgICAgczogJ+GAheGAgOGAueGAgOGAlOGAui7hgKHhgJThgIrhgLrhgLjhgIThgJrhgLonLFxuICAgICAgICAgICAgc3M6ICclZCDhgIXhgIDhgLnhgIDhgJThgLfhgLonLFxuICAgICAgICAgICAgbTogJ+GAkOGAheGAuuGAmeGAreGAlOGAheGAuicsXG4gICAgICAgICAgICBtbTogJyVkIOGAmeGAreGAlOGAheGAuicsXG4gICAgICAgICAgICBoOiAn4YCQ4YCF4YC64YCU4YCs4YCb4YCuJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4YCU4YCs4YCb4YCuJyxcbiAgICAgICAgICAgIGQ6ICfhgJDhgIXhgLrhgJvhgIDhgLonLFxuICAgICAgICAgICAgZGQ6ICclZCDhgJvhgIDhgLonLFxuICAgICAgICAgICAgTTogJ+GAkOGAheGAuuGAnCcsXG4gICAgICAgICAgICBNTTogJyVkIOGAnCcsXG4gICAgICAgICAgICB5OiAn4YCQ4YCF4YC64YCU4YC+4YCF4YC6JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4YCU4YC+4YCF4YC6JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+GBgeGBguGBg+GBhOGBheGBhuGBh+GBiOGBieGBgF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG15O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE5vcndlZ2lhbiBCb2ttw6VsIFtuYl1cbi8vISBhdXRob3JzIDogRXNwZW4gSG92bGFuZHNkYWwgOiBodHRwczovL2dpdGh1Yi5jb20vcmV4eGFyc1xuLy8hICAgICAgICAgICBTaWd1cmQgR2FydG1hbm4gOiBodHRwczovL2dpdGh1Yi5jb20vc2lndXJkZ2Fcbi8vISAgICAgICAgICAgU3RlcGhlbiBSYW10aHVuIDogaHR0cHM6Ly9naXRodWIuY29tL3N0ZXBoZW5yYW10aHVuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbmIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCduYicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFyc19hcHJpbF9tYWlfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hcnNfYXByLl9tYWlfanVuaV9qdWxpX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdzw7huZGFnX21hbmRhZ190aXJzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sw7hyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc8O4Ll9tYS5fdGkuX29uLl90by5fZnIuX2zDuC4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc8O4X21hX3RpX29uX3RvX2ZyX2zDuCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaSBkYWcga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2kgbW9yZ2VuIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaSBnw6VyIGtsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZm9ycmlnZV0gZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ29tICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBzaWRlbicsXG4gICAgICAgICAgICBzOiAnbm9lbiBzZWt1bmRlcicsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZGVyJyxcbiAgICAgICAgICAgIG06ICdldHQgbWludXR0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXR0ZXInLFxuICAgICAgICAgICAgaDogJ8OpbiB0aW1lJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGltZXInLFxuICAgICAgICAgICAgZDogJ8OpbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdlcicsXG4gICAgICAgICAgICB3OiAnw6luIHVrZScsXG4gICAgICAgICAgICB3dzogJyVkIHVrZXInLFxuICAgICAgICAgICAgTTogJ8OpbiBtw6VuZWQnLFxuICAgICAgICAgICAgTU06ICclZCBtw6VuZWRlcicsXG4gICAgICAgICAgICB5OiAnZXR0IMOlcicsXG4gICAgICAgICAgICB5eTogJyVkIMOlcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTmVwYWxlc2UgW25lXVxuLy8hIGF1dGhvciA6IHN1dmFzaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdXZhc2hcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KWnJyxcbiAgICAgICAgICAgIDI6ICfgpagnLFxuICAgICAgICAgICAgMzogJ+ClqScsXG4gICAgICAgICAgICA0OiAn4KWqJyxcbiAgICAgICAgICAgIDU6ICfgpasnLFxuICAgICAgICAgICAgNjogJ+ClrCcsXG4gICAgICAgICAgICA3OiAn4KWtJyxcbiAgICAgICAgICAgIDg6ICfgpa4nLFxuICAgICAgICAgICAgOTogJ+ClrycsXG4gICAgICAgICAgICAwOiAn4KWmJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Clpyc6ICcxJyxcbiAgICAgICAgICAgICfgpagnOiAnMicsXG4gICAgICAgICAgICAn4KWpJzogJzMnLFxuICAgICAgICAgICAgJ+Clqic6ICc0JyxcbiAgICAgICAgICAgICfgpasnOiAnNScsXG4gICAgICAgICAgICAn4KWsJzogJzYnLFxuICAgICAgICAgICAgJ+ClrSc6ICc3JyxcbiAgICAgICAgICAgICfgpa4nOiAnOCcsXG4gICAgICAgICAgICAn4KWvJzogJzknLFxuICAgICAgICAgICAgJ+Clpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBuZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ25lJywge1xuICAgICAgICBtb250aHM6ICfgpJzgpKjgpLXgpLDgpYBf4KSr4KWH4KSs4KWN4KSw4KWB4KS14KSw4KWAX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpL/gpLJf4KSu4KSIX+CknOClgeCkqF/gpJzgpYHgpLLgpL7gpIhf4KSF4KSX4KS34KWN4KSfX+CkuOClh+CkquCljeCkn+Clh+CkruCljeCkrOCksF/gpIXgpJXgpY3gpJ/gpYvgpKzgpLBf4KSo4KWL4KSt4KWH4KSu4KWN4KSs4KSwX+CkoeCkv+CkuOClh+CkruCljeCkrOCksCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4KSc4KSoLl/gpKvgpYfgpKzgpY3gpLDgpYEuX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpL8uX+CkruCkiF/gpJzgpYHgpKhf4KSc4KWB4KSy4KS+4KSILl/gpIXgpJcuX+CkuOClh+CkquCljeCkny5f4KSF4KSV4KWN4KSf4KWLLl/gpKjgpYvgpK3gpYcuX+CkoeCkv+CkuOClhy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfgpIbgpIfgpKTgpKzgpL7gpLBf4KS44KWL4KSu4KSs4KS+4KSwX+CkruCkmeCljeCkl+CksuCkrOCkvuCksF/gpKzgpYHgpKfgpKzgpL7gpLBf4KSs4KS/4KS54KS/4KSs4KS+4KSwX+CktuClgeCkleCljeCksOCkrOCkvuCksF/gpLbgpKjgpL/gpKzgpL7gpLAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgpIbgpIfgpKQuX+CkuOCli+Ckri5f4KSu4KSZ4KWN4KSX4KSyLl/gpKzgpYHgpKcuX+CkrOCkv+CkueCkvy5f4KS24KWB4KSV4KWN4KSwLl/gpLbgpKjgpL8uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+Ckhi5f4KS44KWLLl/gpK7gpIIuX+CkrOClgS5f4KSs4KS/Ll/gpLbgpYEuX+Ckti4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQeCkleCliyBoOm1tIOCkrOCknOClhycsXG4gICAgICAgICAgICBMVFM6ICdB4KSV4KWLIGg6bW06c3Mg4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEHgpJXgpYsgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBB4KSV4KWLIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Clp+ClqOClqeClquClq+ClrOClreClruClr+Clpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CksOCkvuCkpOCkv3zgpKzgpL/gpLngpL7gpKh84KSm4KS/4KSJ4KSB4KS44KWLfOCkuOCkvuCkgeCknS8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CksOCkvuCkpOCkvycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkrOCkv+CkueCkvuCkqCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKbgpL/gpIngpIHgpLjgpYsnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkvuCkgeCknScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpL8nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkrOCkv+CkueCkvuCkqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KS/4KSJ4KSB4KS44KWLJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpL7gpIHgpJ0nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOCkvyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpK3gpYvgpLLgpL9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+CkhuCkieCkgeCkpuCli10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CkueCkv+CknOCli10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KSX4KSP4KSV4KWLXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPgpK7gpL4nLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCkheCkl+CkvuCkoeCkvycsXG4gICAgICAgICAgICBzOiAn4KSV4KWH4KS54KWAIOCkleCljeCkt+CkoycsXG4gICAgICAgICAgICBzczogJyVkIOCkuOClh+CkleClh+Cko+CljeCkoScsXG4gICAgICAgICAgICBtOiAn4KSP4KSVIOCkruCkv+CkqOClh+CknycsXG4gICAgICAgICAgICBtbTogJyVkIOCkruCkv+CkqOClh+CknycsXG4gICAgICAgICAgICBoOiAn4KSP4KSVIOCkmOCko+CljeCkn+CkvicsXG4gICAgICAgICAgICBoaDogJyVkIOCkmOCko+CljeCkn+CkvicsXG4gICAgICAgICAgICBkOiAn4KSP4KSVIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBNOiAn4KSP4KSVIOCkruCkueCkv+CkqOCkvicsXG4gICAgICAgICAgICBNTTogJyVkIOCkruCkueCkv+CkqOCkvicsXG4gICAgICAgICAgICB5OiAn4KSP4KSVIOCkrOCksOCljeCktycsXG4gICAgICAgICAgICB5eTogJyVkIOCkrOCksOCljeCktycsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBEdXRjaCAoQmVsZ2l1bSkgW25sLWJlXVxuLy8hIGF1dGhvciA6IEpvcmlzIFLDtmxpbmcgOiBodHRwczovL2dpdGh1Yi5jb20vam9yaXNyb2xpbmdcbi8vISBhdXRob3IgOiBKYWNvYiBNaWRkYWcgOiBodHRwczovL2dpdGh1Yi5jb20vbWlkZGFnalxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0V2l0aERvdHMgPVxuICAgICAgICAgICAgJ2phbi5fZmViLl9tcnQuX2Fwci5fbWVpX2p1bi5fanVsLl9hdWcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0V2l0aG91dERvdHMgPVxuICAgICAgICAgICAgJ2phbl9mZWJfbXJ0X2Fwcl9tZWlfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eamFuL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL14obWFhcnR8bXJ0XFwuPykkL2ksXG4gICAgICAgICAgICAvXmFwci9pLFxuICAgICAgICAgICAgL15tZWkkL2ksXG4gICAgICAgICAgICAvXmp1bltpLl0/JC9pLFxuICAgICAgICAgICAgL15qdWxbaS5dPyQvaSxcbiAgICAgICAgICAgIC9eYXVnL2ksXG4gICAgICAgICAgICAvXnNlcC9pLFxuICAgICAgICAgICAgL15va3QvaSxcbiAgICAgICAgICAgIC9ebm92L2ksXG4gICAgICAgICAgICAvXmRlYy9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihqYW51YXJpfGZlYnJ1YXJpfG1hYXJ0fGFwcmlsfG1laXxqdVtubF1pfGF1Z3VzdHVzfHNlcHRlbWJlcnxva3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyfGphblxcLj98ZmViXFwuP3xtcnRcXC4/fGFwclxcLj98anVbbmxdXFwuP3xhdWdcXC4/fHNlcFxcLj98b2t0XFwuP3xub3ZcXC4/fGRlY1xcLj8pL2k7XG5cbiAgICB2YXIgbmxCZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ25sLWJlJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJpX2ZlYnJ1YXJpX21hYXJ0X2FwcmlsX21laV9qdW5pX2p1bGlfYXVndXN0dXNfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRob3V0RG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oamFudWFyaXxmZWJydWFyaXxtYWFydHxhcHJpbHxtZWl8anVbbmxdaXxhdWd1c3R1c3xzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcikvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGphblxcLj98ZmViXFwuP3xtcnRcXC4/fGFwclxcLj98bWVpfGp1W25sXVxcLj98YXVnXFwuP3xzZXBcXC4/fG9rdFxcLj98bm92XFwuP3xkZWNcXC4/KS9pLFxuXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG5cbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnem9uZGFnX21hYW5kYWdfZGluc2RhZ193b2Vuc2RhZ19kb25kZXJkYWdfdnJpamRhZ196YXRlcmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3pvLl9tYS5fZGkuX3dvLl9kby5fdnIuX3phLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICd6b19tYV9kaV93b19kb192cl96YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbdmFuZGFhZyBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb3JnZW4gb21dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZ2lzdGVyZW4gb21dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2FmZ2Vsb3Blbl0gZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb3ZlciAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgZ2VsZWRlbicsXG4gICAgICAgICAgICBzOiAnZWVuIHBhYXIgc2Vjb25kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRlbicsXG4gICAgICAgICAgICBtOiAnw6nDqW4gbWludXV0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlbicsXG4gICAgICAgICAgICBoOiAnw6nDqW4gdXVyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdXVyJyxcbiAgICAgICAgICAgIGQ6ICfDqcOpbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdlbicsXG4gICAgICAgICAgICBNOiAnw6nDqW4gbWFhbmQnLFxuICAgICAgICAgICAgTU06ICclZCBtYWFuZGVuJyxcbiAgICAgICAgICAgIHk6ICfDqcOpbiBqYWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgamFhcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdGV8ZGUpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBudW1iZXIgK1xuICAgICAgICAgICAgICAgIChudW1iZXIgPT09IDEgfHwgbnVtYmVyID09PSA4IHx8IG51bWJlciA+PSAyMCA/ICdzdGUnIDogJ2RlJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBubEJlO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IER1dGNoIFtubF1cbi8vISBhdXRob3IgOiBKb3JpcyBSw7ZsaW5nIDogaHR0cHM6Ly9naXRodWIuY29tL2pvcmlzcm9saW5nXG4vLyEgYXV0aG9yIDogSmFjb2IgTWlkZGFnIDogaHR0cHM6Ly9naXRodWIuY29tL21pZGRhZ2pcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTaG9ydFdpdGhEb3RzID1cbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbXJ0Ll9hcHIuX21laV9qdW4uX2p1bC5fYXVnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydFdpdGhvdXREb3RzID1cbiAgICAgICAgICAgICdqYW5fZmViX21ydF9hcHJfbWVpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmphbi9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9eKG1hYXJ0fG1ydFxcLj8pJC9pLFxuICAgICAgICAgICAgL15hcHIvaSxcbiAgICAgICAgICAgIC9ebWVpJC9pLFxuICAgICAgICAgICAgL15qdW5baS5dPyQvaSxcbiAgICAgICAgICAgIC9eanVsW2kuXT8kL2ksXG4gICAgICAgICAgICAvXmF1Zy9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2t0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kZWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oamFudWFyaXxmZWJydWFyaXxtYWFydHxhcHJpbHxtZWl8anVbbmxdaXxhdWd1c3R1c3xzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcnxqYW5cXC4/fGZlYlxcLj98bXJ0XFwuP3xhcHJcXC4/fGp1W25sXVxcLj98YXVnXFwuP3xzZXBcXC4/fG9rdFxcLj98bm92XFwuP3xkZWNcXC4/KS9pO1xuXG4gICAgdmFyIG5sID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbmwnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcmlfZmVicnVhcmlfbWFhcnRfYXByaWxfbWVpX2p1bmlfanVsaV9hdWd1c3R1c19zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGZ1bmN0aW9uIChtLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhEb3RzO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhvdXREb3RzW20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhEb3RzW20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihqYW51YXJpfGZlYnJ1YXJpfG1hYXJ0fGFwcmlsfG1laXxqdVtubF1pfGF1Z3VzdHVzfHNlcHRlbWJlcnxva3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oamFuXFwuP3xmZWJcXC4/fG1ydFxcLj98YXByXFwuP3xtZWl8anVbbmxdXFwuP3xhdWdcXC4/fHNlcFxcLj98b2t0XFwuP3xub3ZcXC4/fGRlY1xcLj8pL2ksXG5cbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcblxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICd6b25kYWdfbWFhbmRhZ19kaW5zZGFnX3dvZW5zZGFnX2RvbmRlcmRhZ192cmlqZGFnX3phdGVyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnem8uX21hLl9kaS5fd28uX2RvLl92ci5femEuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3pvX21hX2RpX3dvX2RvX3ZyX3phJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1t2YW5kYWFnIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vcmdlbiBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tnaXN0ZXJlbiBvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbYWZnZWxvcGVuXSBkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvdmVyICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBnZWxlZGVuJyxcbiAgICAgICAgICAgIHM6ICdlZW4gcGFhciBzZWNvbmRlbicsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGVuJyxcbiAgICAgICAgICAgIG06ICfDqcOpbiBtaW51dXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVuJyxcbiAgICAgICAgICAgIGg6ICfDqcOpbiB1dXInLFxuICAgICAgICAgICAgaGg6ICclZCB1dXInLFxuICAgICAgICAgICAgZDogJ8Opw6luIGRhZycsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2VuJyxcbiAgICAgICAgICAgIHc6ICfDqcOpbiB3ZWVrJyxcbiAgICAgICAgICAgIHd3OiAnJWQgd2VrZW4nLFxuICAgICAgICAgICAgTTogJ8Opw6luIG1hYW5kJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWFhbmRlbicsXG4gICAgICAgICAgICB5OiAnw6nDqW4gamFhcicsXG4gICAgICAgICAgICB5eTogJyVkIGphYXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3RlfGRlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICtcbiAgICAgICAgICAgICAgICAobnVtYmVyID09PSAxIHx8IG51bWJlciA9PT0gOCB8fCBudW1iZXIgPj0gMjAgPyAnc3RlJyA6ICdkZScpXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTnlub3JzayBbbm5dXG4vLyEgYXV0aG9ycyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZWNodXdpbmRcbi8vISAgICAgICAgICAgU3RlcGhlbiBSYW10aHVuIDogaHR0cHM6Ly9naXRodWIuY29tL3N0ZXBoZW5yYW10aHVuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbm4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdubicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFyc19hcHJpbF9tYWlfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hcnNfYXByLl9tYWlfanVuaV9qdWxpX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdzdW5kYWdfbcOlbmRhZ190eXNkYWdfb25zZGFnX3RvcnNkYWdfZnJlZGFnX2xhdXJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzdS5fbcOlLl90eS5fb24uX3RvLl9mci5fbGF1Licuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzdV9tw6VfdHlfb25fdG9fZnJfbGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIFtrbC5dIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSSBkYWcga2xva2thXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0kgbW9yZ29uIGtsb2trYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSSBnw6VyIGtsb2trYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbRsO4cmVnw6VhbmRlXSBkZGRkIFtrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb20gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHNpZGFuJyxcbiAgICAgICAgICAgIHM6ICdub2tyZSBzZWt1bmQnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmQnLFxuICAgICAgICAgICAgbTogJ2VpdCBtaW51dHQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHQnLFxuICAgICAgICAgICAgaDogJ2VpbiB0aW1lJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGltYXInLFxuICAgICAgICAgICAgZDogJ2VpbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdhcicsXG4gICAgICAgICAgICB3OiAnZWkgdmVrZScsXG4gICAgICAgICAgICB3dzogJyVkIHZla2VyJyxcbiAgICAgICAgICAgIE06ICdlaW4gbcOlbmFkJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOlbmFkZXInLFxuICAgICAgICAgICAgeTogJ2VpdCDDpXInLFxuICAgICAgICAgICAgeXk6ICclZCDDpXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5uO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE9jY2l0YW4sIGxlbmdhZG9jaWFuIGRpYWxlY3RlIFtvYy1sbmNdXG4vLyEgYXV0aG9yIDogUXVlbnRpbiBQQUfDiFMgOiBodHRwczovL2dpdGh1Yi5jb20vUXVlbnR5MzFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBvY0xuYyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ29jLWxuYycsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdnZW5pw6hyX2ZlYnJpw6hyX21hcsOnX2FicmlsX21haV9qdW5oX2p1bGhldF9hZ29zdF9zZXRlbWJyZV9vY3TDsmJyZV9ub3ZlbWJyZV9kZWNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6IFwiZGUgZ2VuacOocl9kZSBmZWJyacOocl9kZSBtYXLDp19kJ2FicmlsX2RlIG1haV9kZSBqdW5oX2RlIGp1bGhldF9kJ2Fnb3N0X2RlIHNldGVtYnJlX2Qnb2N0w7JicmVfZGUgbm92ZW1icmVfZGUgZGVjZW1icmVcIi5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL0Rbb0RdPyhcXHMpK01NTU0vLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdnZW4uX2ZlYnIuX21hcsOnX2Fici5fbWFpX2p1bmhfanVsaC5fYWdvLl9zZXQuX29jdC5fbm92Ll9kZWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnZGltZW5nZV9kaWx1bnNfZGltYXJzX2RpbcOoY3Jlc19kaWrDsnVzX2RpdmVuZHJlc19kaXNzYWJ0ZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RnLl9kbC5fZG0uX2RjLl9kai5fZHYuX2RzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkZ19kbF9kbV9kY19kal9kdl9kcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIGxsOiAnRCBNTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gW2RlXSBZWVlZIFthXSBIOm1tJyxcbiAgICAgICAgICAgIGxsbDogJ0QgTU1NIFlZWVksIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFtkZV0gWVlZWSBbYV0gSDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkIEQgTU1NIFlZWVksIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1t1w6hpIGFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbZGVtYW4gYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2nDqHIgYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtwYXNzYXQgYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IFwiZCdhcXXDrSAlc1wiLFxuICAgICAgICAgICAgcGFzdDogJ2ZhICVzJyxcbiAgICAgICAgICAgIHM6ICd1bmFzIHNlZ29uZGFzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vnb25kYXMnLFxuICAgICAgICAgICAgbTogJ3VuYSBtaW51dGEnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGFzJyxcbiAgICAgICAgICAgIGg6ICd1bmEgb3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgb3JhcycsXG4gICAgICAgICAgICBkOiAndW4gam9ybicsXG4gICAgICAgICAgICBkZDogJyVkIGpvcm5zJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYW4nLFxuICAgICAgICAgICAgeXk6ICclZCBhbnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0ocnxufHR8w6h8YSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPVxuICAgICAgICAgICAgICAgIG51bWJlciA9PT0gMVxuICAgICAgICAgICAgICAgICAgICA/ICdyJ1xuICAgICAgICAgICAgICAgICAgICA6IG51bWJlciA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgID8gJ24nXG4gICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3InXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bWJlciA9PT0gNFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICd0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICfDqCc7XG4gICAgICAgICAgICBpZiAocGVyaW9kID09PSAndycgfHwgcGVyaW9kID09PSAnVycpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAnYSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9jTG5jO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFB1bmphYmkgKEluZGlhKSBbcGEtaW5dXG4vLyEgYXV0aG9yIDogSGFycHJlZXQgU2luZ2ggOiBodHRwczovL2dpdGh1Yi5jb20vaGFycHJlZXRraGFsc2FndGJpdFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgqacnLFxuICAgICAgICAgICAgMjogJ+CpqCcsXG4gICAgICAgICAgICAzOiAn4KmpJyxcbiAgICAgICAgICAgIDQ6ICfgqaonLFxuICAgICAgICAgICAgNTogJ+CpqycsXG4gICAgICAgICAgICA2OiAn4KmsJyxcbiAgICAgICAgICAgIDc6ICfgqa0nLFxuICAgICAgICAgICAgODogJ+CpricsXG4gICAgICAgICAgICA5OiAn4KmvJyxcbiAgICAgICAgICAgIDA6ICfgqaYnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KmnJzogJzEnLFxuICAgICAgICAgICAgJ+CpqCc6ICcyJyxcbiAgICAgICAgICAgICfgqaknOiAnMycsXG4gICAgICAgICAgICAn4KmqJzogJzQnLFxuICAgICAgICAgICAgJ+Cpqyc6ICc1JyxcbiAgICAgICAgICAgICfgqawnOiAnNicsXG4gICAgICAgICAgICAn4KmtJzogJzcnLFxuICAgICAgICAgICAgJ+Cpric6ICc4JyxcbiAgICAgICAgICAgICfgqa8nOiAnOScsXG4gICAgICAgICAgICAn4KmmJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIHBhSW4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdwYS1pbicsIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIG1vbnRocyBuYW1lIGFzIHBlciBOYW5ha3NoYWhpIENhbGVuZGFyIGJ1dCB0aGV5IGFyZSBub3QgdXNlZCBhcyByaWdpZGx5IGluIG1vZGVybiBQdW5qYWJpLlxuICAgICAgICBtb250aHM6ICfgqJzgqKjgqLXgqLDgqYBf4Kir4Ki84Kiw4Ki14Kiw4KmAX+CoruCovuCosOComl/gqIXgqKrgqY3gqLDgqYjgqLJf4Kiu4KiIX+ConOCpguCoqF/gqJzgqYHgqLLgqL7gqIhf4KiF4KiX4Ki44KikX+CouOCopOCpsOCorOCosF/gqIXgqJXgqKTgqYLgqKzgqLBf4Kio4Ki14Kmw4Kis4KiwX+CopuCouOCpsOCorOCosCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4Kic4Kio4Ki14Kiw4KmAX+Coq+CovOCosOCoteCosOCpgF/gqK7gqL7gqLDgqJpf4KiF4Kiq4KmN4Kiw4KmI4KiyX+CoruCoiF/gqJzgqYLgqKhf4Kic4KmB4Kiy4Ki+4KiIX+CoheCol+CouOCopF/gqLjgqKTgqbDgqKzgqLBf4KiF4KiV4Kik4KmC4Kis4KiwX+CoqOCoteCpsOCorOCosF/gqKbgqLjgqbDgqKzgqLAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfgqJDgqKTgqLXgqL7gqLBf4Ki44KmL4Kiu4Ki14Ki+4KiwX+CoruCpsOCol+CosuCoteCovuCosF/gqKzgqYHgqKfgqLXgqL7gqLBf4Ki14KmA4Kiw4Ki14Ki+4KiwX+CouOCovOCpgeCpseColeCosOCoteCovuCosF/gqLjgqLzgqKjgqYDgqJrgqLDgqLXgqL7gqLAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgqJDgqKRf4Ki44KmL4KiuX+CoruCpsOCol+Cosl/gqKzgqYHgqKdf4Ki14KmA4KiwX+CouOCovOCpgeColeCosF/gqLjgqLzgqKjgqYAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4KiQ4KikX+CouOCpi+Corl/gqK7gqbDgqJfgqLJf4Kis4KmB4KinX+CoteCpgOCosF/gqLjgqLzgqYHgqJXgqLBf4Ki44Ki84Kio4KmAJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0g4Ki14Kic4KmHJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyDgqLXgqJzgqYcnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCoteConOCphycsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSDgqLXgqJzgqYcnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgqIXgqJxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KiV4KiyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vgqIXgqJfgqLLgqL5dIGRkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KiV4KiyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgqKrgqL/gqJvgqLLgqYddIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4Ki14Ki/4Kmx4KiaJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgqKrgqL/gqJvgqLLgqYcnLFxuICAgICAgICAgICAgczogJ+ColeCpgeConSDgqLjgqJXgqL/gqbDgqJ8nLFxuICAgICAgICAgICAgc3M6ICclZCDgqLjgqJXgqL/gqbDgqJ8nLFxuICAgICAgICAgICAgbTogJ+Coh+ColSDgqK7gqL/gqbDgqJ8nLFxuICAgICAgICAgICAgbW06ICclZCDgqK7gqL/gqbDgqJ8nLFxuICAgICAgICAgICAgaDogJ+Coh+CpseColSDgqJjgqbDgqJ/gqL4nLFxuICAgICAgICAgICAgaGg6ICclZCDgqJjgqbDgqJ/gqYcnLFxuICAgICAgICAgICAgZDogJ+Coh+CpseColSDgqKbgqL/gqKgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgqKbgqL/gqKgnLFxuICAgICAgICAgICAgTTogJ+Coh+CpseColSDgqK7gqLngqYDgqKjgqL4nLFxuICAgICAgICAgICAgTU06ICclZCDgqK7gqLngqYDgqKjgqYcnLFxuICAgICAgICAgICAgeTogJ+Coh+CpseColSDgqLjgqL7gqLInLFxuICAgICAgICAgICAgeXk6ICclZCDgqLjgqL7gqLInLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4Kmn4Kmo4Kmp4Kmq4Kmr4Kms4Kmt4Kmu4Kmv4KmmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvLyBQdW5qYWJpIG5vdGF0aW9uIGZvciBtZXJpZGllbXMgYXJlIHF1aXRlIGZ1enp5IGluIHByYWN0aWNlLiBXaGlsZSB0aGVyZSBleGlzdHNcbiAgICAgICAgLy8gYSByaWdpZCBub3Rpb24gb2YgYSAnUGFoYXInIGl0IGlzIG5vdCB1c2VkIGFzIHJpZ2lkbHkgaW4gbW9kZXJuIFB1bmphYmkuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gqLDgqL7gqKR84Ki44Ki14KmH4KiwfOCopuCpgeCoquCoueCov+CosHzgqLjgqLzgqL7gqK4vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgqLDgqL7gqKQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqLjgqLXgqYfgqLAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kim4KmB4Kiq4Ki54Ki/4KiwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqLjgqLzgqL7gqK4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kiw4Ki+4KikJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqLjgqLXgqYfgqLAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CopuCpgeCoquCoueCov+CosCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Ki44Ki84Ki+4KiuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqLDgqL7gqKQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGFJbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBQb2xpc2ggW3BsXVxuLy8hIGF1dGhvciA6IFJhZmFsIEhpcnN6IDogaHR0cHM6Ly9naXRodWIuY29tL2V2b0xcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNOb21pbmF0aXZlID1cbiAgICAgICAgICAgICdzdHljemXFhF9sdXR5X21hcnplY19rd2llY2llxYRfbWFqX2N6ZXJ3aWVjX2xpcGllY19zaWVycGllxYRfd3J6ZXNpZcWEX3Bhxbpkemllcm5pa19saXN0b3BhZF9ncnVkemllxYQnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU3ViamVjdGl2ZSA9XG4gICAgICAgICAgICAnc3R5Y3puaWFfbHV0ZWdvX21hcmNhX2t3aWV0bmlhX21hamFfY3plcndjYV9saXBjYV9zaWVycG5pYV93cnplxZtuaWFfcGHFumR6aWVybmlrYV9saXN0b3BhZGFfZ3J1ZG5pYScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9ec3R5L2ksXG4gICAgICAgICAgICAvXmx1dC9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9ea3dpL2ksXG4gICAgICAgICAgICAvXm1hai9pLFxuICAgICAgICAgICAgL15jemUvaSxcbiAgICAgICAgICAgIC9ebGlwL2ksXG4gICAgICAgICAgICAvXnNpZS9pLFxuICAgICAgICAgICAgL153cnovaSxcbiAgICAgICAgICAgIC9ecGHFui9pLFxuICAgICAgICAgICAgL15saXMvaSxcbiAgICAgICAgICAgIC9eZ3J1L2ksXG4gICAgICAgIF07XG4gICAgZnVuY3Rpb24gcGx1cmFsKG4pIHtcbiAgICAgICAgcmV0dXJuIG4gJSAxMCA8IDUgJiYgbiAlIDEwID4gMSAmJiB+fihuIC8gMTApICUgMTAgIT09IDE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnc2VrdW5keScgOiAnc2VrdW5kJyk7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdtaW51dGEnIDogJ21pbnV0xJknO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWludXR5JyA6ICdtaW51dCcpO1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnZ29kemluYScgOiAnZ29kemluxJknO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnZ29kemlueScgOiAnZ29kemluJyk7XG4gICAgICAgICAgICBjYXNlICd3dyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICd0eWdvZG5pZScgOiAndHlnb2RuaScpO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWllc2nEhWNlJyA6ICdtaWVzacSZY3knKTtcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2xhdGEnIDogJ2xhdCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHBsID0gbW9tZW50LmRlZmluZUxvY2FsZSgncGwnLCB7XG4gICAgICAgIG1vbnRoczogZnVuY3Rpb24gKG1vbWVudFRvRm9ybWF0LCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbW9tZW50VG9Gb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzTm9taW5hdGl2ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL0QgTU1NTS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1N1YmplY3RpdmVbbW9tZW50VG9Gb3JtYXQubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNOb21pbmF0aXZlW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDogJ3N0eV9sdXRfbWFyX2t3aV9tYWpfY3plX2xpcF9zaWVfd3J6X3BhxbpfbGlzX2dydScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnbmllZHppZWxhX3BvbmllZHppYcWCZWtfd3RvcmVrX8Wbcm9kYV9jendhcnRla19wacSFdGVrX3NvYm90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25kel9wb25fd3RfxZtyX2N6d19wdF9zb2InLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnTmRfUG5fV3RfxZpyX0N6X1B0X1NvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0R6acWbIG9dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbSnV0cm8gb10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyBuaWVkemllbMSZIG9dIExUJztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXZSB3dG9yZWsgb10gTFQnO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgxZtyb2TEmSBvXSBMVCc7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyBzb2JvdMSZIG9dIExUJztcblxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbV10gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1djem9yYWogb10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyB6ZXN6xYLEhSBuaWVkemllbMSZIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyB6ZXN6xYLEhSDFm3JvZMSZIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyB6ZXN6xYLEhSBzb2JvdMSZIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgemVzesWCeV0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB0ZW11JyxcbiAgICAgICAgICAgIHM6ICdraWxrYSBzZWt1bmQnLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogJzEgZHppZcWEJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZG5pJyxcbiAgICAgICAgICAgIHc6ICd0eWR6aWXFhCcsXG4gICAgICAgICAgICB3dzogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogJ21pZXNpxIVjJyxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiAncm9rJyxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUG9ydHVndWVzZSAoQnJhemlsKSBbcHQtYnJdXG4vLyEgYXV0aG9yIDogQ2FpbyBSaWJlaXJvIFBlcmVpcmEgOiBodHRwczovL2dpdGh1Yi5jb20vY2Fpby1yaWJlaXJvLXBlcmVpcmFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBwdEJyID0gbW9tZW50LmRlZmluZUxvY2FsZSgncHQtYnInLCB7XG4gICAgICAgIG1vbnRoczogJ2phbmVpcm9fZmV2ZXJlaXJvX21hcsOnb19hYnJpbF9tYWlvX2p1bmhvX2p1bGhvX2Fnb3N0b19zZXRlbWJyb19vdXR1YnJvX25vdmVtYnJvX2RlemVtYnJvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZXZfbWFyX2Ficl9tYWlfanVuX2p1bF9hZ29fc2V0X291dF9ub3ZfZGV6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdkb21pbmdvX3NlZ3VuZGEtZmVpcmFfdGVyw6dhLWZlaXJhX3F1YXJ0YS1mZWlyYV9xdWludGEtZmVpcmFfc2V4dGEtZmVpcmFfc8OhYmFkbycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tX3NlZ190ZXJfcXVhX3F1aV9zZXhfc8OhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb18ywqpfM8KqXzTCql81wqpfNsKqX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgW8Ogc10gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBbw6BzXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hvamUgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0FtYW5ow6Mgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8Ogc10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tPbnRlbSDDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgPT09IDAgfHwgdGhpcy5kYXkoKSA9PT0gNlxuICAgICAgICAgICAgICAgICAgICA/ICdbw5psdGltb10gZGRkZCBbw6BzXSBMVCcgLy8gU2F0dXJkYXkgKyBTdW5kYXlcbiAgICAgICAgICAgICAgICAgICAgOiAnW8OabHRpbWFdIGRkZGQgW8Ogc10gTFQnOyAvLyBNb25kYXkgLSBGcmlkYXlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VtICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdow6EgJXMnLFxuICAgICAgICAgICAgczogJ3BvdWNvcyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1bSBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bWEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1bSBkaWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkaWFzJyxcbiAgICAgICAgICAgIE06ICd1bSBtw6pzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VtIGFubycsXG4gICAgICAgICAgICB5eTogJyVkIGFub3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgaW52YWxpZERhdGU6ICdEYXRhIGludsOhbGlkYScsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHRCcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBQb3J0dWd1ZXNlIFtwdF1cbi8vISBhdXRob3IgOiBKZWZmZXJzb24gOiBodHRwczovL2dpdGh1Yi5jb20vamFsZXg3OVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHB0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgncHQnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbmVpcm9fZmV2ZXJlaXJvX21hcsOnb19hYnJpbF9tYWlvX2p1bmhvX2p1bGhvX2Fnb3N0b19zZXRlbWJyb19vdXR1YnJvX25vdmVtYnJvX2RlemVtYnJvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZXZfbWFyX2Ficl9tYWlfanVuX2p1bF9hZ29fc2V0X291dF9ub3ZfZGV6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdEb21pbmdvX1NlZ3VuZGEtZmVpcmFfVGVyw6dhLWZlaXJhX1F1YXJ0YS1mZWlyYV9RdWludGEtZmVpcmFfU2V4dGEtZmVpcmFfU8OhYmFkbycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnRG9tX1NlZ19UZXJfUXVhX1F1aV9TZXhfU8OhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdEb18ywqpfM8KqXzTCql81wqpfNsKqX1PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hvamUgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0FtYW5ow6Mgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8Ogc10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tPbnRlbSDDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgPT09IDAgfHwgdGhpcy5kYXkoKSA9PT0gNlxuICAgICAgICAgICAgICAgICAgICA/ICdbw5psdGltb10gZGRkZCBbw6BzXSBMVCcgLy8gU2F0dXJkYXkgKyBTdW5kYXlcbiAgICAgICAgICAgICAgICAgICAgOiAnW8OabHRpbWFdIGRkZGQgW8Ogc10gTFQnOyAvLyBNb25kYXkgLSBGcmlkYXlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VtICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdow6EgJXMnLFxuICAgICAgICAgICAgczogJ3NlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VtIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VtYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VtIGRpYScsXG4gICAgICAgICAgICBkZDogJyVkIGRpYXMnLFxuICAgICAgICAgICAgdzogJ3VtYSBzZW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZW1hbmFzJyxcbiAgICAgICAgICAgIE06ICd1bSBtw6pzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VtIGFubycsXG4gICAgICAgICAgICB5eTogJyVkIGFub3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHB0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFJvbWFuaWFuIFtyb11cbi8vISBhdXRob3IgOiBWbGFkIEd1cmRpZ2EgOiBodHRwczovL2dpdGh1Yi5jb20vZ3VyZGlnYVxuLy8hIGF1dGhvciA6IFZhbGVudGluIEFnYWNoaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hdmFseVxuLy8hIGF1dGhvciA6IEVtYW51ZWwgQ2Vwb2kgOiBodHRwczovL2dpdGh1Yi5jb20vY2VwZW1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgICAgICBzczogJ3NlY3VuZGUnLFxuICAgICAgICAgICAgICAgIG1tOiAnbWludXRlJyxcbiAgICAgICAgICAgICAgICBoaDogJ29yZScsXG4gICAgICAgICAgICAgICAgZGQ6ICd6aWxlJyxcbiAgICAgICAgICAgICAgICB3dzogJ3PEg3B0xINtw6JuaScsXG4gICAgICAgICAgICAgICAgTU06ICdsdW5pJyxcbiAgICAgICAgICAgICAgICB5eTogJ2FuaScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VwYXJhdG9yID0gJyAnO1xuICAgICAgICBpZiAobnVtYmVyICUgMTAwID49IDIwIHx8IChudW1iZXIgPj0gMTAwICYmIG51bWJlciAlIDEwMCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9ICcgZGUgJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyICsgc2VwYXJhdG9yICsgZm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIHJvID0gbW9tZW50LmRlZmluZUxvY2FsZSgncm8nLCB7XG4gICAgICAgIG1vbnRoczogJ2lhbnVhcmllX2ZlYnJ1YXJpZV9tYXJ0aWVfYXByaWxpZV9tYWlfaXVuaWVfaXVsaWVfYXVndXN0X3NlcHRlbWJyaWVfb2N0b21icmllX25vaWVtYnJpZV9kZWNlbWJyaWUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2lhbi5fZmViLl9tYXJ0Ll9hcHIuX21haV9pdW4uX2l1bC5fYXVnLl9zZXB0Ll9vY3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2R1bWluaWPEg19sdW5pX21hcsibaV9taWVyY3VyaV9qb2lfdmluZXJpX3PDom1ixIN0xIMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdEdW1fTHVuX01hcl9NaWVfSm9pX1Zpbl9Tw6JtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0R1X0x1X01hX01pX0pvX1ZpX1PDoicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2F6aSBsYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttw6JpbmUgbGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbbGFdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaWVyaSBsYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZm9zdGFdIGRkZGQgW2xhXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3Blc3RlICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDDrm4gdXJtxIMnLFxuICAgICAgICAgICAgczogJ2PDonRldmEgc2VjdW5kZScsXG4gICAgICAgICAgICBzczogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG06ICd1biBtaW51dCcsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGg6ICdvIG9yxIMnLFxuICAgICAgICAgICAgaGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkOiAnbyB6aScsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHc6ICdvIHPEg3B0xINtw6JuxIMnLFxuICAgICAgICAgICAgd3c6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNOiAnbyBsdW7EgycsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHk6ICd1biBhbicsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFJ1c3NpYW4gW3J1XVxuLy8hIGF1dGhvciA6IFZpa3Rvcm1pbmF0b3IgOiBodHRwczovL2dpdGh1Yi5jb20vVmlrdG9ybWluYXRvclxuLy8hIGF1dGhvciA6IE1lbmVsaW9uIEVsZW5zw7psZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlXG4vLyEgYXV0aG9yIDog0JrQvtGA0LXQvdCx0LXRgNCzINCc0LDRgNC6IDogaHR0cHM6Ly9naXRodWIuY29tL3NvY2tldHBhaXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHBsdXJhbCh3b3JkLCBudW0pIHtcbiAgICAgICAgdmFyIGZvcm1zID0gd29yZC5zcGxpdCgnXycpO1xuICAgICAgICByZXR1cm4gbnVtICUgMTAgPT09IDEgJiYgbnVtICUgMTAwICE9PSAxMVxuICAgICAgICAgICAgPyBmb3Jtc1swXVxuICAgICAgICAgICAgOiBudW0gJSAxMCA+PSAyICYmIG51bSAlIDEwIDw9IDQgJiYgKG51bSAlIDEwMCA8IDEwIHx8IG51bSAlIDEwMCA+PSAyMClcbiAgICAgICAgICAgICAgPyBmb3Jtc1sxXVxuICAgICAgICAgICAgICA6IGZvcm1zWzJdO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzczogd2l0aG91dFN1ZmZpeCA/ICfRgdC10LrRg9C90LTQsF/RgdC10LrRg9C90LTRi1/RgdC10LrRg9C90LQnIDogJ9GB0LXQutGD0L3QtNGDX9GB0LXQutGD0L3QtNGLX9GB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtbTogd2l0aG91dFN1ZmZpeCA/ICfQvNC40L3Rg9GC0LBf0LzQuNC90YPRgtGLX9C80LjQvdGD0YInIDogJ9C80LjQvdGD0YLRg1/QvNC40L3Rg9GC0Ytf0LzQuNC90YPRgicsXG4gICAgICAgICAgICBoaDogJ9GH0LDRgV/Rh9Cw0YHQsF/Rh9Cw0YHQvtCyJyxcbiAgICAgICAgICAgIGRkOiAn0LTQtdC90Yxf0LTQvdGPX9C00L3QtdC5JyxcbiAgICAgICAgICAgIHd3OiAn0L3QtdC00LXQu9GPX9C90LXQtNC10LvQuF/QvdC10LTQtdC70YwnLFxuICAgICAgICAgICAgTU06ICfQvNC10YHRj9GGX9C80LXRgdGP0YbQsF/QvNC10YHRj9GG0LXQsicsXG4gICAgICAgICAgICB5eTogJ9Cz0L7QtF/Qs9C+0LTQsF/Qu9C10YInLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoa2V5ID09PSAnbScpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9C80LjQvdGD0YLQsCcgOiAn0LzQuNC90YPRgtGDJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBwbHVyYWwoZm9ybWF0W2tleV0sICtudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgL17Rj9C90LIvaSxcbiAgICAgICAgL17RhNC10LIvaSxcbiAgICAgICAgL17QvNCw0YAvaSxcbiAgICAgICAgL17QsNC/0YAvaSxcbiAgICAgICAgL17QvNCwW9C50Y9dL2ksXG4gICAgICAgIC9e0LjRjtC9L2ksXG4gICAgICAgIC9e0LjRjtC7L2ksXG4gICAgICAgIC9e0LDQstCzL2ksXG4gICAgICAgIC9e0YHQtdC9L2ksXG4gICAgICAgIC9e0L7QutGCL2ksXG4gICAgICAgIC9e0L3QvtGPL2ksXG4gICAgICAgIC9e0LTQtdC6L2ksXG4gICAgXTtcblxuICAgIC8vIGh0dHA6Ly9uZXcuZ3JhbW90YS5ydS9zcHJhdmthL3J1bGVzLzEzOS1wcm9wIDogwqcgMTAzXG4gICAgLy8g0KHQvtC60YDQsNGJ0LXQvdC40Y8g0LzQtdGB0Y/RhtC10LI6IGh0dHA6Ly9uZXcuZ3JhbW90YS5ydS9zcHJhdmthL2J1cm8vc2VhcmNoLWFuc3dlcj9zPTI0MjYzN1xuICAgIC8vIENMRFIgZGF0YTogICAgICAgICAgaHR0cDovL3d3dy51bmljb2RlLm9yZy9jbGRyL2NoYXJ0cy8yOC9zdW1tYXJ5L3J1Lmh0bWwjMTc1M1xuICAgIHZhciBydSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3J1Jywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9GP0L3QstCw0YDRj1/RhNC10LLRgNCw0LvRj1/QvNCw0YDRgtCwX9Cw0L/RgNC10LvRj1/QvNCw0Y9f0LjRjtC90Y9f0LjRjtC70Y9f0LDQstCz0YPRgdGC0LBf0YHQtdC90YLRj9Cx0YDRj1/QvtC60YLRj9Cx0YDRj1/QvdC+0Y/QsdGA0Y9f0LTQtdC60LDQsdGA0Y8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9GP0L3QstCw0YDRjF/RhNC10LLRgNCw0LvRjF/QvNCw0YDRgl/QsNC/0YDQtdC70Yxf0LzQsNC5X9C40Y7QvdGMX9C40Y7Qu9GMX9Cw0LLQs9GD0YHRgl/RgdC10L3RgtGP0LHRgNGMX9C+0LrRgtGP0LHRgNGMX9C90L7Rj9Cx0YDRjF/QtNC10LrQsNCx0YDRjCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiB7XG4gICAgICAgICAgICAvLyDQv9C+IENMRFIg0LjQvNC10L3QvdC+IFwi0LjRjtC7LlwiINC4IFwi0LjRjtC9LlwiLCDQvdC+INC60LDQutC+0Lkg0YHQvNGL0YHQuyDQvNC10L3Rj9GC0Ywg0LHRg9C60LLRgyDQvdCwINGC0L7Rh9C60YM/XG4gICAgICAgICAgICBmb3JtYXQ6ICfRj9C90LIuX9GE0LXQstGALl/QvNCw0YAuX9Cw0L/RgC5f0LzQsNGPX9C40Y7QvdGPX9C40Y7Qu9GPX9Cw0LLQsy5f0YHQtdC90YIuX9C+0LrRgi5f0L3QvtGP0LEuX9C00LXQui4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9GP0L3Qsi5f0YTQtdCy0YAuX9C80LDRgNGCX9Cw0L/RgC5f0LzQsNC5X9C40Y7QvdGMX9C40Y7Qu9GMX9Cw0LLQsy5f0YHQtdC90YIuX9C+0LrRgi5f0L3QvtGP0LEuX9C00LXQui4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5czoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn0LLQvtGB0LrRgNC10YHQtdC90YzQtV/Qv9C+0L3QtdC00LXQu9GM0L3QuNC6X9Cy0YLQvtGA0L3QuNC6X9GB0YDQtdC00LBf0YfQtdGC0LLQtdGA0LNf0L/Rj9GC0L3QuNGG0LBf0YHRg9Cx0LHQvtGC0LAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiAn0LLQvtGB0LrRgNC10YHQtdC90YzQtV/Qv9C+0L3QtdC00LXQu9GM0L3QuNC6X9Cy0YLQvtGA0L3QuNC6X9GB0YDQtdC00YNf0YfQtdGC0LLQtdGA0LNf0L/Rj9GC0L3QuNGG0YNf0YHRg9Cx0LHQvtGC0YMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvXFxbID9b0JLQsl0gPyg/OtC/0YDQvtGI0LvRg9GOfNGB0LvQtdC00YPRjtGJ0YPRjnzRjdGC0YMpPyA/XSA/ZGRkZC8sXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQstGBX9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9Cy0YFf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG5cbiAgICAgICAgLy8g0L/QvtC70L3Ri9C1INC90LDQt9Cy0LDQvdC40Y8g0YEg0L/QsNC00LXQttCw0LzQuCwg0L/QviDRgtGA0Lgg0LHRg9C60LLRiywg0LTQu9GPINC90LXQutC+0YLQvtGA0YvRhSwg0L/QviA0INCx0YPQutCy0YssINGB0L7QutGA0LDRidC10L3QuNGPINGBINGC0L7Rh9C60L7QuSDQuCDQsdC10Lcg0YLQvtGH0LrQuFxuICAgICAgICBtb250aHNSZWdleDpcbiAgICAgICAgICAgIC9eKNGP0L3QstCw0YBb0YzRj1180Y/QvdCyXFwuP3zRhNC10LLRgNCw0Ltb0YzRj1180YTQtdCy0YA/XFwuP3zQvNCw0YDRgtCwP3zQvNCw0YBcXC4/fNCw0L/RgNC10Ltb0YzRj1180LDQv9GAXFwuP3zQvNCwW9C50Y9dfNC40Y7QvVvRjNGPXXzQuNGO0L1cXC4/fNC40Y7Qu1vRjNGPXXzQuNGO0LtcXC4/fNCw0LLQs9GD0YHRgtCwP3zQsNCy0LNcXC4/fNGB0LXQvdGC0Y/QsdGAW9GM0Y9dfNGB0LXQvdGCP1xcLj980L7QutGC0Y/QsdGAW9GM0Y9dfNC+0LrRglxcLj980L3QvtGP0LHRgFvRjNGPXXzQvdC+0Y/QsT9cXC4/fNC00LXQutCw0LHRgFvRjNGPXXzQtNC10LpcXC4/KS9pLFxuXG4gICAgICAgIC8vINC60L7Qv9C40Y8g0L/RgNC10LTRi9C00YPRidC10LPQvlxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OlxuICAgICAgICAgICAgL14o0Y/QvdCy0LDRgFvRjNGPXXzRj9C90LJcXC4/fNGE0LXQstGA0LDQu1vRjNGPXXzRhNC10LLRgD9cXC4/fNC80LDRgNGC0LA/fNC80LDRgFxcLj980LDQv9GA0LXQu1vRjNGPXXzQsNC/0YBcXC4/fNC80LBb0LnRj1180LjRjtC9W9GM0Y9dfNC40Y7QvVxcLj980LjRjtC7W9GM0Y9dfNC40Y7Qu1xcLj980LDQstCz0YPRgdGC0LA/fNCw0LLQs1xcLj980YHQtdC90YLRj9Cx0YBb0YzRj1180YHQtdC90YI/XFwuP3zQvtC60YLRj9Cx0YBb0YzRj1180L7QutGCXFwuP3zQvdC+0Y/QsdGAW9GM0Y9dfNC90L7Rj9CxP1xcLj980LTQtdC60LDQsdGAW9GM0Y9dfNC00LXQulxcLj8pL2ksXG5cbiAgICAgICAgLy8g0L/QvtC70L3Ri9C1INC90LDQt9Cy0LDQvdC40Y8g0YEg0L/QsNC00LXQttCw0LzQuFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKNGP0L3QstCw0YBb0Y/RjF180YTQtdCy0YDQsNC7W9GP0YxdfNC80LDRgNGC0LA/fNCw0L/RgNC10Ltb0Y/RjF180LzQsFvRj9C5XXzQuNGO0L1b0Y/RjF180LjRjtC7W9GP0YxdfNCw0LLQs9GD0YHRgtCwP3zRgdC10L3RgtGP0LHRgFvRj9GMXXzQvtC60YLRj9Cx0YBb0Y/RjF180L3QvtGP0LHRgFvRj9GMXXzQtNC10LrQsNCx0YBb0Y/RjF0pL2ksXG5cbiAgICAgICAgLy8g0JLRi9GA0LDQttC10L3QuNC1LCDQutC+0YLQvtGA0L7QtSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0LXRgiDRgtC+0LvRjNC60L4g0YHQvtC60YDQsNGJ0ZHQvdC90YvQvCDRhNC+0YDQvNCw0LxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKNGP0L3QslxcLnzRhNC10LLRgD9cXC580LzQsNGAW9GCLl180LDQv9GAXFwufNC80LBb0Y/QuV180LjRjtC9W9GM0Y8uXXzQuNGO0Ltb0YzRjy5dfNCw0LLQs1xcLnzRgdC10L3Rgj9cXC580L7QutGCXFwufNC90L7Rj9CxP1xcLnzQtNC10LpcXC4pL2ksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZINCzLicsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDQsy4sIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZINCzLiwgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9Ch0LXQs9C+0LTQvdGPLCDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQl9Cw0LLRgtGA0LAsINCyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9CS0YfQtdGA0LAsINCyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmIChub3cud2VlaygpICE9PSB0aGlzLndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDRgdC70LXQtNGD0Y7RidC10LVdIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINGB0LvQtdC00YPRjtGJ0LjQuV0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0YHQu9C10LTRg9GO0YnRg9GOXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRheSgpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQktC+XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmIChub3cud2VlaygpICE9PSB0aGlzLndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDQv9GA0L7RiNC70L7QtV0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0L/RgNC+0YjQu9GL0LldIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINC/0YDQvtGI0LvRg9GOXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRheSgpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQktC+XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9GH0LXRgNC10LcgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzINC90LDQt9Cw0LQnLFxuICAgICAgICAgICAgczogJ9C90LXRgdC60L7Qu9GM0LrQviDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgc3M6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoOiAn0YfQsNGBJyxcbiAgICAgICAgICAgIGhoOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZDogJ9C00LXQvdGMJyxcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgdzogJ9C90LXQtNC10LvRjycsXG4gICAgICAgICAgICB3dzogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE06ICfQvNC10YHRj9GGJyxcbiAgICAgICAgICAgIE1NOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeTogJ9Cz0L7QtCcsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9C90L7Rh9C4fNGD0YLRgNCwfNC00L3Rj3zQstC10YfQtdGA0LAvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o0LTQvdGPfNCy0LXRh9C10YDQsCkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0L3QvtGH0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GD0YLRgNCwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQtNC90Y8nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Cy0LXRh9C10YDQsCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0Ll80LPQvnzRjykvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LknO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Qs9C+JztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0Y8nO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBydTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTaW5kaGkgW3NkXVxuLy8hIGF1dGhvciA6IE5hcmFpbiBTYWdhciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9uYXJhaW5zYWdhclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9IFtcbiAgICAgICAgICAgICfYrNmG2YjYsdmKJyxcbiAgICAgICAgICAgICfZgdmK2KjYsdmI2LHZiicsXG4gICAgICAgICAgICAn2YXYp9ix2oYnLFxuICAgICAgICAgICAgJ9in2b7YsdmK2YQnLFxuICAgICAgICAgICAgJ9mF2KbZiicsXG4gICAgICAgICAgICAn2KzZiNmGJyxcbiAgICAgICAgICAgICfYrNmI2YTYp9ih2ZAnLFxuICAgICAgICAgICAgJ9ii2q/Ys9m9JyxcbiAgICAgICAgICAgICfYs9mK2b7ZvdmF2KjYsScsXG4gICAgICAgICAgICAn2KLaqtm92YjYqNixJyxcbiAgICAgICAgICAgICfZhtmI2YXYqNixJyxcbiAgICAgICAgICAgICfaitiz2YXYqNixJyxcbiAgICAgICAgXSxcbiAgICAgICAgZGF5cyA9IFsn2KLahtixJywgJ9iz2YjZhdixJywgJ9in2rHYp9ix2YgnLCAn2KfYsdio2LknLCAn2K7ZhdmK2LMnLCAn2KzZhdi5JywgJ9qH2Ybah9ixJ107XG5cbiAgICB2YXIgc2QgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzZCcsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiBkYXlzLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGF5cyxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZNiMIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i12KjYrXzYtNin2YUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2LTYp9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtdio2K0nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICfYtNin2YUnO1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9qEXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9iz2oDYp9q72YpdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2Kfas9mK2YYg2YfZgdiq2Yog2KrZil0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vaqtin2YTZh9mHXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1var9iy2LHZitmEINmH2YHYqtmKXSBkZGRkIFvYqtmKXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINm+2YjYoScsXG4gICAgICAgICAgICBwYXN0OiAnJXMg2KfasycsXG4gICAgICAgICAgICBzOiAn2obZhtivINiz2YraqtmG2oonLFxuICAgICAgICAgICAgc3M6ICclZCDYs9mK2qrZhtqKJyxcbiAgICAgICAgICAgIG06ICfZh9qqINmF2YbZvScsXG4gICAgICAgICAgICBtbTogJyVkINmF2YbZvScsXG4gICAgICAgICAgICBoOiAn2YfaqiDaqtmE2KfaqicsXG4gICAgICAgICAgICBoaDogJyVkINqq2YTYp9qqJyxcbiAgICAgICAgICAgIGQ6ICfZh9qqINqP2YrZhtmH2YYnLFxuICAgICAgICAgICAgZGQ6ICclZCDaj9mK2YbZh9mGJyxcbiAgICAgICAgICAgIE06ICfZh9qqINmF2YfZitmG2YgnLFxuICAgICAgICAgICAgTU06ICclZCDZhdmH2YrZhtinJyxcbiAgICAgICAgICAgIHk6ICfZh9qqINiz2KfZhCcsXG4gICAgICAgICAgICB5eTogJyVkINiz2KfZhCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNkO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE5vcnRoZXJuIFNhbWkgW3NlXVxuLy8hIGF1dGhvcnMgOiBCw6VyZCBSb2xzdGFkIEhlbnJpa3NlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rYXJhbWVsbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHNlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc2UnLCB7XG4gICAgICAgIG1vbnRoczogJ2/EkcSRYWphZ2Vtw6FubnVfZ3VvdnZhbcOhbm51X25qdWvEjWFtw6FubnVfY3VvxYtvbcOhbm51X21pZXNzZW3DoW5udV9nZWFzc2Vtw6FubnVfc3VvaWRuZW3DoW5udV9ib3JnZW3DoW5udV/EjWFrxI1hbcOhbm51X2dvbGdnb3Rtw6FubnVfc2vDoWJtYW3DoW5udV9qdW92bGFtw6FubnUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2/EkcSRal9ndW92X25qdWtfY3VvX21pZXNfZ2Vhc19zdW9pX2JvcmdfxI1ha8SNX2dvbGdfc2vDoWJfanVvdicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnc290bmFiZWFpdmlfdnVvc3PDoXJnYV9tYcWLxYtlYsOhcmdhX2dhc2thdmFoa2t1X2R1b3Jhc3RhdF9iZWFyamFkYXRfbMOhdnZhcmRhdCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc290bl92dW9zX21hxYtfZ2Fza19kdW9yX2JlYXJfbMOhdicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzX3ZfbV9nX2RfYl9MJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ01NTU0gRC4gW2IuXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ01NTU0gRC4gW2IuXSBZWVlZIFt0aS5dIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIEQuIFtiLl0gWVlZWSBbdGkuXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW290bmUgdGldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbaWh0dGluIHRpXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3RpXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2lrdGUgdGldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW292ZGRpdF0gZGRkZCBbdGldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgZ2Vhxb5lcycsXG4gICAgICAgICAgICBwYXN0OiAnbWHFi2l0ICVzJyxcbiAgICAgICAgICAgIHM6ICdtb2FkZGUgc2VrdW5kZGF0JyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kZGF0JyxcbiAgICAgICAgICAgIG06ICdva3RhIG1pbnVodGEnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51aHRhdCcsXG4gICAgICAgICAgICBoOiAnb2t0YSBkaWltbXUnLFxuICAgICAgICAgICAgaGg6ICclZCBkaWltbXV0JyxcbiAgICAgICAgICAgIGQ6ICdva3RhIGJlYWl2aScsXG4gICAgICAgICAgICBkZDogJyVkIGJlYWl2dml0JyxcbiAgICAgICAgICAgIE06ICdva3RhIG3DoW5udScsXG4gICAgICAgICAgICBNTTogJyVkIG3DoW51dCcsXG4gICAgICAgICAgICB5OiAnb2t0YSBqYWhraScsXG4gICAgICAgICAgICB5eTogJyVkIGphZ2l0JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTaW5oYWxlc2UgW3NpXVxuLy8hIGF1dGhvciA6IFNhbXBhdGggU2l0aW5hbWFsdXdhIDogaHR0cHM6Ly9naXRodWIuY29tL3NhbXBhdGhzcmlzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICAvKmpzaGludCAtVzEwMCovXG4gICAgdmFyIHNpID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc2knLCB7XG4gICAgICAgIG1vbnRoczogJ+C2ouC2seC3gOC3j+C2u+C3kl/gtrTgt5ngtrbgtrvgt4Dgt4/gtrvgt5Jf4La44LeP4La74LeK4Lat4LeUX+C2heC2tOC3iuKAjeC2u+C3muC2veC3il/gtrjgt5Dgtrrgt5Jf4Lai4LeW4Lax4LeSX+C2ouC3luC2veC3kl/gtoXgtpzgt53gt4Pgt4rgtq3gt5Rf4LeD4LeQ4La04LeK4Lat4LeQ4La44LeK4La24La74LeKX+C2lOC2muC3iuC2reC3neC2tuC2u+C3il/gtrHgt5zgt4Dgt5Dgtrjgt4rgtrbgtrvgt4pf4Lav4LeZ4LeD4LeQ4La44LeK4La24La74LeKJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ+C2ouC2sV/gtrTgt5ngtrZf4La44LeP4La74LeKX+C2heC2tOC3il/gtrjgt5Dgtrrgt5Jf4Lai4LeW4Lax4LeSX+C2ouC3luC2veC3kl/gtoXgtpzgt51f4LeD4LeQ4La04LeKX+C2lOC2muC3il/gtrHgt5zgt4Dgt5Bf4Lav4LeZ4LeD4LeQJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfgtongtrvgt5Lgtq/gt49f4LeD4Laz4LeU4Lav4LePX+C2heC2n+C3hOC2u+C3lOC3gOC3j+C2r+C3j1/gtrbgtq/gt4/gtq/gt49f4La24LeK4oCN4La74LeE4LeD4LeK4La04Lat4LeS4Lax4LeK4Lav4LePX+C3g+C3kuC2muC3lOC2u+C3j+C2r+C3j1/gt4Pgt5ngtrHgt4Pgt5Tgtrvgt4/gtq/gt48nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+C2ieC2u+C3kl/gt4PgtrPgt5Rf4LaF4LafX+C2tuC2r+C3j1/gtrbgt4rigI3gtrvgt4Rf4LeD4LeS4Laa4LeUX+C3g+C3meC2sScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgtolf4LeDX+C2hV/gtrZf4La24LeK4oCN4La7X+C3g+C3kl/gt4Pgt5knLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnYSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ2EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVkgTU1NTSBEJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkgTU1NTSBELCBhIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVkgTU1NTSBEIFvgt4Dgt5DgtrHgt5JdIGRkZGQsIGEgaDptbTpzcycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+C2heC2r10gTFRb4LanXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C3hOC3meC2p10gTFRb4LanXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFRb4LanXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C2iuC2uuC3ml0gTFRb4LanXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgtrTgt4Pgt5Tgtpzgt5LgtrpdIGRkZGQgTFRb4LanXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz4Laa4LeS4Lax4LeKJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+C2muC2pyDgtrTgt5ngtrsnLFxuICAgICAgICAgICAgczogJ+C2reC2reC3iuC2tOC2uyDgtprgt5Lgt4Tgt5LgtrTgtronLFxuICAgICAgICAgICAgc3M6ICfgtq3gtq3gt4rgtrTgtrsgJWQnLFxuICAgICAgICAgICAgbTogJ+C2uOC3kuC2seC3kuC2reC3iuC2reC3lOC3gCcsXG4gICAgICAgICAgICBtbTogJ+C2uOC3kuC2seC3kuC2reC3iuC2reC3lCAlZCcsXG4gICAgICAgICAgICBoOiAn4La04LeQ4La6JyxcbiAgICAgICAgICAgIGhoOiAn4La04LeQ4La6ICVkJyxcbiAgICAgICAgICAgIGQ6ICfgtq/gt5LgtrHgtronLFxuICAgICAgICAgICAgZGQ6ICfgtq/gt5LgtrEgJWQnLFxuICAgICAgICAgICAgTTogJ+C2uOC3j+C3g+C2uicsXG4gICAgICAgICAgICBNTTogJ+C2uOC3j+C3gyAlZCcsXG4gICAgICAgICAgICB5OiAn4LeA4LeD4La7JyxcbiAgICAgICAgICAgIHl5OiAn4LeA4LeD4La7ICVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9IOC3gOC3kOC2seC3ki8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnIOC3gOC3kOC2seC3kic7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gtrTgt5ngtrsg4LeA4La74LeUfOC2tOC3g+C3iiDgt4Dgtrvgt5R84La04LeZLuC3gHzgtrQu4LeALi8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn4La0LuC3gC4nIHx8IGlucHV0ID09PSAn4La04LeD4LeKIOC3gOC2u+C3lCc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAn4La0LuC3gC4nIDogJ+C2tOC3g+C3iiDgt4Dgtrvgt5QnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfgtrTgt5ku4LeALicgOiAn4La04LeZ4La7IOC3gOC2u+C3lCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2k7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2xvdmFrIFtza11cbi8vISBhdXRob3IgOiBNYXJ0aW4gTWlua2EgOiBodHRwczovL2dpdGh1Yi5jb20vazJzXG4vLyEgYmFzZWQgb24gd29yayBvZiBwZXRyYmVsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRyYmVsYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9XG4gICAgICAgICAgICAnamFudcOhcl9mZWJydcOhcl9tYXJlY19hcHLDrWxfbcOhal9qw7puX2rDumxfYXVndXN0X3NlcHRlbWJlcl9va3TDs2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdqYW5fZmViX21hcl9hcHJfbcOhal9qw7puX2rDumxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBwbHVyYWwobikge1xuICAgICAgICByZXR1cm4gbiA+IDEgJiYgbiA8IDU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOiAvLyBhIGZldyBzZWNvbmRzIC8gaW4gYSBmZXcgc2Vjb25kcyAvIGEgZmV3IHNlY29uZHMgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAncMOhciBzZWvDum5kJyA6ICdww6FyIHNla3VuZGFtaSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6IC8vIDkgc2Vjb25kcyAvIGluIDkgc2Vjb25kcyAvIDkgc2Vjb25kcyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Nla3VuZHknIDogJ3Nla8O6bmQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ3Nla3VuZGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbSc6IC8vIGEgbWludXRlIC8gaW4gYSBtaW51dGUgLyBhIG1pbnV0ZSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdtaW7DunRhJyA6IGlzRnV0dXJlID8gJ21pbsO6dHUnIDogJ21pbsO6dG91JztcbiAgICAgICAgICAgIGNhc2UgJ21tJzogLy8gOSBtaW51dGVzIC8gaW4gOSBtaW51dGVzIC8gOSBtaW51dGVzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWluw7p0eScgOiAnbWluw7p0Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtaW7DunRhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2gnOiAvLyBhbiBob3VyIC8gaW4gYW4gaG91ciAvIGFuIGhvdXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnaG9kaW5hJyA6IGlzRnV0dXJlID8gJ2hvZGludScgOiAnaG9kaW5vdSc7XG4gICAgICAgICAgICBjYXNlICdoaCc6IC8vIDkgaG91cnMgLyBpbiA5IGhvdXJzIC8gOSBob3VycyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2hvZGlueScgOiAnaG9kw61uJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdob2RpbmFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZCc6IC8vIGEgZGF5IC8gaW4gYSBkYXkgLyBhIGRheSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkZcWIJyA6ICdkxYhvbSc7XG4gICAgICAgICAgICBjYXNlICdkZCc6IC8vIDkgZGF5cyAvIGluIDkgZGF5cyAvIDkgZGF5cyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2RuaScgOiAnZG7DrScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnZMWIYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdNJzogLy8gYSBtb250aCAvIGluIGEgbW9udGggLyBhIG1vbnRoIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2lhYycgOiAnbWVzaWFjb20nO1xuICAgICAgICAgICAgY2FzZSAnTU0nOiAvLyA5IG1vbnRocyAvIGluIDkgbW9udGhzIC8gOSBtb250aHMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtZXNpYWNlJyA6ICdtZXNpYWNvdicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbWVzaWFjbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ3knOiAvLyBhIHllYXIgLyBpbiBhIHllYXIgLyBhIHllYXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAncm9rJyA6ICdyb2tvbSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6IC8vIDkgeWVhcnMgLyBpbiA5IHllYXJzIC8gOSB5ZWFycyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Jva3knIDogJ3Jva292Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdyb2ttaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNrID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc2snLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzU2hvcnQsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkZcS+YV9wb25kZWxva191dG9yb2tfc3RyZWRhX8WhdHZydG9rX3BpYXRva19zb2JvdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZV9wb191dF9zdF/FoXRfcGlfc28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdXRfc3RfxaF0X3BpX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkbmVzIG9dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbemFqdHJhIG9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgbmVkZcS+dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHN0cmVkdSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZvIMWhdHZydG9rIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBwaWF0b2sgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHNvYm90dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbdsSNZXJhIG9dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw7ogbmVkZcS+dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDvV0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO6IHN0cmVkdSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDvV0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO6IHNvYm90dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByZWQgJXMnLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNrO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNsb3ZlbmlhbiBbc2xdXG4vLyEgYXV0aG9yIDogUm9iZXJ0IFNlZG92xaFlayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zZWRvdnNla1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlXG4gICAgICAgICAgICAgICAgICAgID8gJ25la2FqIHNla3VuZCdcbiAgICAgICAgICAgICAgICAgICAgOiAnbmVrYWogc2VrdW5kYW1pJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4ID8gJ3Nla3VuZG8nIDogJ3Nla3VuZGknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3Nla3VuZGknIDogJ3Nla3VuZGFoJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnc2VrdW5kZScgOiAnc2VrdW5kYWgnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2VuYSBtaW51dGEnIDogJ2VubyBtaW51dG8nO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggPyAnbWludXRhJyA6ICdtaW51dG8nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21pbnV0aScgOiAnbWludXRhbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtaW51dGUnIDogJ21pbnV0YW1pJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtaW51dCcgOiAnbWludXRhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnZW5hIHVyYScgOiAnZW5vIHVybyc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCA/ICd1cmEnIDogJ3Vybyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAndXJpJyA6ICd1cmFtYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3VyZScgOiAndXJhbWknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3VyJyA6ICd1cmFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdlbiBkYW4nIDogJ2VuaW0gZG5lbSc7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkYW4nIDogJ2RuZW0nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2RuaScgOiAnZG5ldm9tYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZG5pJyA6ICdkbmV2aSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdlbiBtZXNlYycgOiAnZW5pbSBtZXNlY2VtJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2VjJyA6ICdtZXNlY2VtJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNlY2EnIDogJ21lc2VjZW1hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWVzZWNlJyA6ICdtZXNlY2knO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2VjZXYnIDogJ21lc2VjaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdlbm8gbGV0bycgOiAnZW5pbSBsZXRvbSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdsZXRvJyA6ICdsZXRvbSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbGV0aScgOiAnbGV0b21hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbGV0YScgOiAnbGV0aSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbGV0JyA6ICdsZXRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NsJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJlY19hcHJpbF9tYWpfanVuaWpfanVsaWpfYXZndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hai5fanVuLl9qdWwuX2F2Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGVsamFfcG9uZWRlbGpla190b3Jla19zcmVkYV/EjWV0cnRla19wZXRla19zb2JvdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZWQuX3Bvbi5fdG9yLl9zcmUuX8SNZXQuX3BldC5fc29iLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb190b19zcl/EjWVfcGVfc28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC4gTU0uIFlZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZGFuZXMgb2JdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbanV0cmkgb2JdIExUJyxcblxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gW25lZGVsam9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBbc3JlZG9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBbc29ib3RvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gZGRkZCBbb2JdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1t2xI1lcmFqIG9iXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcmVqxaFuam9dIFtuZWRlbGpvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlasWhbmpvXSBbc3JlZG9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcmVqxaFuam9dIFtzb2JvdG9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcmVqxaFuamldIGRkZGQgW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnxI1leiAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJlZCAlcycsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2w7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQWxiYW5pYW4gW3NxXVxuLy8hIGF1dGhvciA6IEZsYWvDq3JpbSBJc21hbmkgOiBodHRwczovL2dpdGh1Yi5jb20vZmxha2VyaW1pXG4vLyEgYXV0aG9yIDogTWVuZWxpb24gRWxlbnPDumxlIDogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcbi8vISBhdXRob3IgOiBPZXJkIEN1a2FsbGEgOiBodHRwczovL2dpdGh1Yi5jb20vb2VyZFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHNxID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3EnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbmFyX1Noa3VydF9NYXJzX1ByaWxsX01hal9RZXJzaG9yX0tvcnJpa19HdXNodF9TaHRhdG9yX1RldG9yX07Dq250b3JfRGhqZXRvcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fU2hrX01hcl9QcmlfTWFqX1Flcl9Lb3JfR3VzX1NodF9UZXRfTsOrbl9EaGonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnRSBEaWVsX0UgSMOrbsOrX0UgTWFydMOrX0UgTcOrcmt1csOrX0UgRW5qdGVfRSBQcmVtdGVfRSBTaHR1bsOrJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnRGllX0jDq25fTWFyX03Dq3JfRW5qX1ByZV9TaHQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnRF9IX01hX03Dq19FX1BfU2gnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL1BEfE1ELyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQuY2hhckF0KDApID09PSAnTSc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBob3VycyA8IDEyID8gJ1BEJyA6ICdNRCc7XG4gICAgICAgIH0sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbU290IG7Dq10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tOZXPDq3IgbsOrXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW27Dq10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tEamUgbsOrXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2Uga2FsdWFyIG7Dq10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICduw6sgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIG3DqyBwYXLDqycsXG4gICAgICAgICAgICBzOiAnZGlzYSBzZWtvbmRhJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vrb25kYScsXG4gICAgICAgICAgICBtOiAnbmrDqyBtaW51dMOrJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRhJyxcbiAgICAgICAgICAgIGg6ICduasOrIG9yw6snLFxuICAgICAgICAgICAgaGg6ICclZCBvcsOrJyxcbiAgICAgICAgICAgIGQ6ICduasOrIGRpdMOrJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGl0w6snLFxuICAgICAgICAgICAgTTogJ25qw6sgbXVhaicsXG4gICAgICAgICAgICBNTTogJyVkIG11YWonLFxuICAgICAgICAgICAgeTogJ25qw6sgdml0JyxcbiAgICAgICAgICAgIHl5OiAnJWQgdml0ZScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2VyYmlhbiBDeXJpbGxpYyBbc3ItY3lybF1cbi8vISBhdXRob3IgOiBNaWxhbiBKYW5hxI1rb3ZpxIc8bWlsYW5qYW5hY2tvdmljQGdtYWlsLmNvbT4gOiBodHRwczovL2dpdGh1Yi5jb20vbWlsYW4talxuLy8hIGF1dGhvciA6IFN0ZWZhbiBDcm5qYWtvdmnEhyA8c3RlZmFuQGhvdG1haWwucnM+IDogaHR0cHM6Ly9naXRodWIuY29tL2Nybmpha292aWNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0cmFuc2xhdG9yID0ge1xuICAgICAgICB3b3Jkczoge1xuICAgICAgICAgICAgLy9EaWZmZXJlbnQgZ3JhbW1hdGljYWwgY2FzZXNcbiAgICAgICAgICAgIHNzOiBbJ9GB0LXQutGD0L3QtNCwJywgJ9GB0LXQutGD0L3QtNC1JywgJ9GB0LXQutGD0L3QtNC4J10sXG4gICAgICAgICAgICBtOiBbJ9GY0LXQtNCw0L0g0LzQuNC90YPRgicsICfRmNC10LTQvdC+0LMg0LzQuNC90YPRgtCwJ10sXG4gICAgICAgICAgICBtbTogWyfQvNC40L3Rg9GCJywgJ9C80LjQvdGD0YLQsCcsICfQvNC40L3Rg9GC0LAnXSxcbiAgICAgICAgICAgIGg6IFsn0ZjQtdC00LDQvSDRgdCw0YInLCAn0ZjQtdC00L3QvtCzINGB0LDRgtCwJ10sXG4gICAgICAgICAgICBoaDogWyfRgdCw0YInLCAn0YHQsNGC0LAnLCAn0YHQsNGC0LgnXSxcbiAgICAgICAgICAgIGQ6IFsn0ZjQtdC00LDQvSDQtNCw0L0nLCAn0ZjQtdC00L3QvtCzINC00LDQvdCwJ10sXG4gICAgICAgICAgICBkZDogWyfQtNCw0L0nLCAn0LTQsNC90LAnLCAn0LTQsNC90LAnXSxcbiAgICAgICAgICAgIE06IFsn0ZjQtdC00LDQvSDQvNC10YHQtdGGJywgJ9GY0LXQtNC90L7QsyDQvNC10YHQtdGG0LAnXSxcbiAgICAgICAgICAgIE1NOiBbJ9C80LXRgdC10YYnLCAn0LzQtdGB0LXRhtCwJywgJ9C80LXRgdC10YbQuCddLFxuICAgICAgICAgICAgeTogWyfRmNC10LTQvdGDINCz0L7QtNC40L3RgycsICfRmNC10LTQvdC1INCz0L7QtNC40L3QtSddLFxuICAgICAgICAgICAgeXk6IFsn0LPQvtC00LjQvdGDJywgJ9Cz0L7QtNC40L3QtScsICfQs9C+0LTQuNC90LAnXSxcbiAgICAgICAgfSxcbiAgICAgICAgY29ycmVjdEdyYW1tYXRpY2FsQ2FzZTogZnVuY3Rpb24gKG51bWJlciwgd29yZEtleSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG51bWJlciAlIDEwID49IDEgJiZcbiAgICAgICAgICAgICAgICBudW1iZXIgJSAxMCA8PSA0ICYmXG4gICAgICAgICAgICAgICAgKG51bWJlciAlIDEwMCA8IDEwIHx8IG51bWJlciAlIDEwMCA+PSAyMClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMSA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdvcmRLZXlbMl07XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgdmFyIHdvcmRLZXkgPSB0cmFuc2xhdG9yLndvcmRzW2tleV0sXG4gICAgICAgICAgICAgICAgd29yZDtcblxuICAgICAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBOb21pbmF0aXZcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAneScgJiYgd2l0aG91dFN1ZmZpeCkgcmV0dXJuICfRmNC10LTQvdCwINCz0L7QtNC40L3QsCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyB3b3JkS2V5WzBdIDogd29yZEtleVsxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd29yZCA9IHRyYW5zbGF0b3IuY29ycmVjdEdyYW1tYXRpY2FsQ2FzZShudW1iZXIsIHdvcmRLZXkpO1xuICAgICAgICAgICAgLy8gTm9taW5hdGl2XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAneXknICYmIHdpdGhvdXRTdWZmaXggJiYgd29yZCA9PT0gJ9Cz0L7QtNC40L3RgycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDQs9C+0LTQuNC90LAnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgd29yZDtcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgdmFyIHNyQ3lybCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NyLWN5cmwnLCB7XG4gICAgICAgIG1vbnRoczogJ9GY0LDQvdGD0LDRgF/RhNC10LHRgNGD0LDRgF/QvNCw0YDRgl/QsNC/0YDQuNC7X9C80LDRmF/RmNGD0L1f0ZjRg9C7X9Cw0LLQs9GD0YHRgl/RgdC10L/RgtC10LzQsdCw0YBf0L7QutGC0L7QsdCw0YBf0L3QvtCy0LXQvNCx0LDRgF/QtNC10YbQtdC80LHQsNGAJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfRmNCw0L0uX9GE0LXQsS5f0LzQsNGALl/QsNC/0YAuX9C80LDRmF/RmNGD0L1f0ZjRg9C7X9Cw0LLQsy5f0YHQtdC/Ll/QvtC60YIuX9C90L7Qsi5f0LTQtdGGLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfQvdC10LTQtdGZ0LBf0L/QvtC90LXQtNC10ZnQsNC6X9GD0YLQvtGA0LDQul/RgdGA0LXQtNCwX9GH0LXRgtCy0YDRgtCw0Lpf0L/QtdGC0LDQul/RgdGD0LHQvtGC0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQvdC10LQuX9C/0L7QvS5f0YPRgtC+Ll/RgdGA0LUuX9GH0LXRgi5f0L/QtdGCLl/RgdGD0LEuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9C90LVf0L/Qvl/Rg9GCX9GB0YBf0YfQtV/Qv9C1X9GB0YMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdELiBNLiBZWVlZLicsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWS4nLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZLiBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkuIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQtNCw0L3QsNGBINGDXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9GB0YPRgtGA0LAg0YNdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9GDXSBb0L3QtdC00LXRmdGDXSBb0YNdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0YNdIFvRgdGA0LXQtNGDXSBb0YNdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0YNdIFvRgdGD0LHQvtGC0YNdIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gZGRkZCBb0YNdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1vRmNGD0YfQtSDRg10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdFdlZWtEYXlzID0gW1xuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQtV0gW9C90LXQtNC10ZnQtV0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C+0LNdIFvQv9C+0L3QtdC00LXRmdC60LBdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQvtCzXSBb0YPRgtC+0YDQutCwXSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70LVdIFvRgdGA0LXQtNC1XSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70L7Qs10gW9GH0LXRgtCy0YDRgtC60LBdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQvtCzXSBb0L/QtdGC0LrQsF0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C1XSBb0YHRg9Cx0L7RgtC1XSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXN0V2Vla0RheXNbdGhpcy5kYXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQt9CwICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfQv9GA0LUgJXMnLFxuICAgICAgICAgICAgczogJ9C90LXQutC+0LvQuNC60L4g0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzckN5cmw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2VyYmlhbiBbc3JdXG4vLyEgYXV0aG9yIDogTWlsYW4gSmFuYcSNa292acSHPG1pbGFuamFuYWNrb3ZpY0BnbWFpbC5jb20+IDogaHR0cHM6Ly9naXRodWIuY29tL21pbGFuLWpcbi8vISBhdXRob3IgOiBTdGVmYW4gQ3JuamFrb3ZpxIcgPHN0ZWZhbkBob3RtYWlsLnJzPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jcm5qYWtvdmljXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdHJhbnNsYXRvciA9IHtcbiAgICAgICAgd29yZHM6IHtcbiAgICAgICAgICAgIC8vRGlmZmVyZW50IGdyYW1tYXRpY2FsIGNhc2VzXG4gICAgICAgICAgICBzczogWydzZWt1bmRhJywgJ3Nla3VuZGUnLCAnc2VrdW5kaSddLFxuICAgICAgICAgICAgbTogWydqZWRhbiBtaW51dCcsICdqZWRub2cgbWludXRhJ10sXG4gICAgICAgICAgICBtbTogWydtaW51dCcsICdtaW51dGEnLCAnbWludXRhJ10sXG4gICAgICAgICAgICBoOiBbJ2plZGFuIHNhdCcsICdqZWRub2cgc2F0YSddLFxuICAgICAgICAgICAgaGg6IFsnc2F0JywgJ3NhdGEnLCAnc2F0aSddLFxuICAgICAgICAgICAgZDogWydqZWRhbiBkYW4nLCAnamVkbm9nIGRhbmEnXSxcbiAgICAgICAgICAgIGRkOiBbJ2RhbicsICdkYW5hJywgJ2RhbmEnXSxcbiAgICAgICAgICAgIE06IFsnamVkYW4gbWVzZWMnLCAnamVkbm9nIG1lc2VjYSddLFxuICAgICAgICAgICAgTU06IFsnbWVzZWMnLCAnbWVzZWNhJywgJ21lc2VjaSddLFxuICAgICAgICAgICAgeTogWydqZWRudSBnb2RpbnUnLCAnamVkbmUgZ29kaW5lJ10sXG4gICAgICAgICAgICB5eTogWydnb2RpbnUnLCAnZ29kaW5lJywgJ2dvZGluYSddLFxuICAgICAgICB9LFxuICAgICAgICBjb3JyZWN0R3JhbW1hdGljYWxDYXNlOiBmdW5jdGlvbiAobnVtYmVyLCB3b3JkS2V5KSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICUgMTAgPj0gMSAmJlxuICAgICAgICAgICAgICAgIG51bWJlciAlIDEwIDw9IDQgJiZcbiAgICAgICAgICAgICAgICAobnVtYmVyICUgMTAwIDwgMTAgfHwgbnVtYmVyICUgMTAwID49IDIwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAxID8gd29yZEtleVswXSA6IHdvcmRLZXlbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd29yZEtleVsyXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICB2YXIgd29yZEtleSA9IHRyYW5zbGF0b3Iud29yZHNba2V5XSxcbiAgICAgICAgICAgICAgICB3b3JkO1xuXG4gICAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIE5vbWluYXRpdlxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICd5JyAmJiB3aXRob3V0U3VmZml4KSByZXR1cm4gJ2plZG5hIGdvZGluYSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyB3b3JkS2V5WzBdIDogd29yZEtleVsxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd29yZCA9IHRyYW5zbGF0b3IuY29ycmVjdEdyYW1tYXRpY2FsQ2FzZShudW1iZXIsIHdvcmRLZXkpO1xuICAgICAgICAgICAgLy8gTm9taW5hdGl2XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAneXknICYmIHdpdGhvdXRTdWZmaXggJiYgd29yZCA9PT0gJ2dvZGludScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyBnb2RpbmEnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgd29yZDtcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgdmFyIHNyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3InLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnRfYXByaWxfbWFqX2p1bl9qdWxfYXZndXN0X3NlcHRlbWJhcl9va3RvYmFyX25vdmVtYmFyX2RlY2VtYmFyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hal9qdW5fanVsX2F2Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWRlbGphX3BvbmVkZWxqYWtfdXRvcmFrX3NyZWRhX8SNZXR2cnRha19wZXRha19zdWJvdGEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZWQuX3Bvbi5fdXRvLl9zcmUuX8SNZXQuX3BldC5fc3ViLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb191dF9zcl/EjWVfcGVfc3UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdELiBNLiBZWVlZLicsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWS4nLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZLiBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkuIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3N1dHJhIHVdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRlbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3JlZHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzdWJvdHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdcSNZSB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBsYXN0V2Vla0RheXMgPSBbXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW25lZGVsamVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFtwb25lZGVsamthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbdXRvcmthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtzcmVkZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW8SNZXR2cnRrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3BldGthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtzdWJvdGVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFdlZWtEYXlzW3RoaXMuZGF5KCldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByZSAlcycsXG4gICAgICAgICAgICBzOiAnbmVrb2xpa28gc2VrdW5kaScsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IHNpU3dhdGkgW3NzXVxuLy8hIGF1dGhvciA6IE5pY29sYWkgRGF2aWVzPG1haWxAbmljb2xhaS5pbz4gOiBodHRwczovL2dpdGh1Yi5jb20vbmljb2xhaWRhdmllc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHNzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3MnLCB7XG4gICAgICAgIG1vbnRoczogXCJCaGltYmlkdndhbmVfSW5kbG92YW5hX0luZGxvdidsZW5raHVsdV9NYWJhc2FfSW5raHdla2h3ZXRpX0luaGxhYmFfS2hvbHdhbmVfSW5nY2lfSW55b25pX0ltcGhhbGFfTHdldGlfSW5nb25nb25pXCIuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdCaGlfSW5hX0ludV9NYWJfSW5rX0luaF9LaG9fSWdjX0lueV9JbXBfTHdlX0lnbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnTGlzb250Zm9fVW1zb21idWx1a29fTGVzaWJpbGlfTGVzaXRzYXRmdV9MZXNpbmVfTGVzaWhsYW51X1VtZ2NpYmVsbycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnTGlzX1VtYl9Mc2JfTGVzX0xzaV9Mc2hfVW1nJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0xpX1VzX0xiX0x0X0xzX0xoX1VnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW05hbXVobGEgbmdhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0t1c2FzYSBuZ2FdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbbmdhXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0l0b2xvIG5nYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtsZWxpcGhlbGlsZV0gW25nYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICduZ2EgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3dlbnRla2EgbmdhICVzJyxcbiAgICAgICAgICAgIHM6ICdlbWl6dXp3YW5hIGxvbWNhbmUnLFxuICAgICAgICAgICAgc3M6ICclZCBtenV6d2FuYScsXG4gICAgICAgICAgICBtOiAndW16dXp1JyxcbiAgICAgICAgICAgIG1tOiAnJWQgZW1penV6dScsXG4gICAgICAgICAgICBoOiAnbGlob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgZW1haG9yYScsXG4gICAgICAgICAgICBkOiAnbGlsYW5nYScsXG4gICAgICAgICAgICBkZDogJyVkIGVtYWxhbmdhJyxcbiAgICAgICAgICAgIE06ICdpbnlhbmdhJyxcbiAgICAgICAgICAgIE1NOiAnJWQgdGlueWFuZ2EnLFxuICAgICAgICAgICAgeTogJ3Vtbnlha2EnLFxuICAgICAgICAgICAgeXk6ICclZCBpbWlueWFrYScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9la3VzZW5pfGVtaW5pfGVudHNhbWJhbWF8ZWJ1c3VrdS8sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdla3VzZW5pJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZW1pbmknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlbnRzYW1iYW1hJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlYnVzdWt1JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAnZWt1c2VuaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdlbWluaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnZW50c2FtYmFtYScgfHwgbWVyaWRpZW0gPT09ICdlYnVzdWt1Jykge1xuICAgICAgICAgICAgICAgIGlmIChob3VyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiAnJWQnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3M7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3dlZGlzaCBbc3ZdXG4vLyEgYXV0aG9yIDogSmVucyBBbG0gOiBodHRwczovL2dpdGh1Yi5jb20vdWxtdXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3N2Jywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJpX2ZlYnJ1YXJpX21hcnNfYXByaWxfbWFqX2p1bmlfanVsaV9hdWd1c3RpX3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFyX2Fwcl9tYWpfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ3PDtm5kYWdfbcOlbmRhZ190aXNkYWdfb25zZGFnX3RvcnNkYWdfZnJlZGFnX2zDtnJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzw7ZuX23DpW5fdGlzX29uc190b3JfZnJlX2zDtnInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc8O2X23DpV90aV9vbl90b19mcl9sw7YnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICAgICAgbGxsOiAnRCBNTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkIEQgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tJZGFnXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0ltb3Jnb25dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSWfDpXJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW1DDpV0gZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tJXSBkZGRkW3NdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb20gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2bDtnIgJXMgc2VkYW4nLFxuICAgICAgICAgICAgczogJ27DpWdyYSBzZWt1bmRlcicsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZGVyJyxcbiAgICAgICAgICAgIG06ICdlbiBtaW51dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXInLFxuICAgICAgICAgICAgaDogJ2VuIHRpbW1lJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGltbWFyJyxcbiAgICAgICAgICAgIGQ6ICdlbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdhcicsXG4gICAgICAgICAgICBNOiAnZW4gbcOlbmFkJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOlbmFkZXInLFxuICAgICAgICAgICAgeTogJ2V0dCDDpXInLFxuICAgICAgICAgICAgeXk6ICclZCDDpXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oXFw6ZXxcXDphKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJzplJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJzphJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICc6YSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJzplJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnOmUnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN2O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFN3YWhpbGkgW3N3XVxuLy8hIGF1dGhvciA6IEZhaGFkIEthc3NpbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWRzZWxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3N3Jywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpX0ZlYnJ1YXJpX01hY2hpX0FwcmlsaV9NZWlfSnVuaV9KdWxhaV9BZ29zdGlfU2VwdGVtYmFfT2t0b2JhX05vdmVtYmFfRGVzZW1iYScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hY19BcHJfTWVpX0p1bl9KdWxfQWdvX1NlcF9Pa3RfTm92X0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnSnVtYXBpbGlfSnVtYXRhdHVfSnVtYW5uZV9KdW1hdGFub19BbGhhbWlzaV9JanVtYWFfSnVtYW1vc2knLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0pwbF9KdGF0X0pubmVfSnRhbl9BbGhfSWptX0ptb3MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnSjJfSjNfSjRfSjVfQWxfSWpfSjEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaGg6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2xlbyBzYWFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdba2VzaG8gc2FhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1t3aWtpIGlqYXlvXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2phbmFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3dpa2kgaWxpeW9waXRhXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIGJhYWRheWUnLFxuICAgICAgICAgICAgcGFzdDogJ3Rva2VhICVzJyxcbiAgICAgICAgICAgIHM6ICdoaXZpIHB1bmRlJyxcbiAgICAgICAgICAgIHNzOiAnc2VrdW5kZSAlZCcsXG4gICAgICAgICAgICBtOiAnZGFraWthIG1vamEnLFxuICAgICAgICAgICAgbW06ICdkYWtpa2EgJWQnLFxuICAgICAgICAgICAgaDogJ3NhYSBsaW1vamEnLFxuICAgICAgICAgICAgaGg6ICdtYXNhYSAlZCcsXG4gICAgICAgICAgICBkOiAnc2lrdSBtb2phJyxcbiAgICAgICAgICAgIGRkOiAnc2lrdSAlZCcsXG4gICAgICAgICAgICBNOiAnbXdlemkgbW1vamEnLFxuICAgICAgICAgICAgTU06ICdtaWV6aSAlZCcsXG4gICAgICAgICAgICB5OiAnbXdha2EgbW1vamEnLFxuICAgICAgICAgICAgeXk6ICdtaWFrYSAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUYW1pbCBbdGFdXG4vLyEgYXV0aG9yIDogQXJqdW5rdW1hciBLcmlzaG5hbW9vcnRoeSA6IGh0dHBzOi8vZ2l0aHViLmNvbS90azEyMDQwNFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgr6cnLFxuICAgICAgICAgICAgMjogJ+CvqCcsXG4gICAgICAgICAgICAzOiAn4K+pJyxcbiAgICAgICAgICAgIDQ6ICfgr6onLFxuICAgICAgICAgICAgNTogJ+CvqycsXG4gICAgICAgICAgICA2OiAn4K+sJyxcbiAgICAgICAgICAgIDc6ICfgr60nLFxuICAgICAgICAgICAgODogJ+CvricsXG4gICAgICAgICAgICA5OiAn4K+vJyxcbiAgICAgICAgICAgIDA6ICfgr6YnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4K+nJzogJzEnLFxuICAgICAgICAgICAgJ+CvqCc6ICcyJyxcbiAgICAgICAgICAgICfgr6knOiAnMycsXG4gICAgICAgICAgICAn4K+qJzogJzQnLFxuICAgICAgICAgICAgJ+Cvqyc6ICc1JyxcbiAgICAgICAgICAgICfgr6wnOiAnNicsXG4gICAgICAgICAgICAn4K+tJzogJzcnLFxuICAgICAgICAgICAgJ+Cvric6ICc4JyxcbiAgICAgICAgICAgICfgr68nOiAnOScsXG4gICAgICAgICAgICAn4K+mJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIHRhID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGEnLCB7XG4gICAgICAgIG1vbnRoczogJ+CunOCuqeCuteCusOCuv1/grqrgrr/grqrgr43grrDgrrXgrrDgrr9f4K6u4K6+4K6w4K+N4K6a4K+NX+Cuj+CuquCvjeCusOCusuCvjV/grq7gr4df4K6c4K+C4K6p4K+NX+CunOCvguCusuCviF/grobgrpXgrrjgr43grp/gr41f4K6a4K+G4K6q4K+N4K6f4K+G4K6u4K+N4K6q4K6w4K+NX+CuheCuleCvjeCun+Cvh+CuvuCuquCusOCvjV/grqjgrrXgrq7gr43grqrgrrDgr41f4K6f4K6/4K6a4K6u4K+N4K6q4K6w4K+NJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgrpzgrqngrrXgrrDgrr9f4K6q4K6/4K6q4K+N4K6w4K614K6w4K6/X+CuruCuvuCusOCvjeCumuCvjV/gro/grqrgr43grrDgrrLgr41f4K6u4K+HX+CunOCvguCuqeCvjV/grpzgr4LgrrLgr4hf4K6G4K6V4K644K+N4K6f4K+NX+CumuCvhuCuquCvjeCun+CvhuCuruCvjeCuquCusOCvjV/groXgrpXgr43grp/gr4fgrr7grqrgrrDgr41f4K6o4K614K6u4K+N4K6q4K6w4K+NX+Cun+Cuv+CumuCuruCvjeCuquCusOCvjScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfgrp7grr7grq/grr/grrHgr43grrHgr4HgrpXgr43grpXgrr/grrTgrq7gr4hf4K6k4K6/4K6Z4K+N4K6V4K6f4K+N4K6V4K6/4K604K6u4K+IX+CumuCvhuCuteCvjeCuteCuvuCur+CvjeCuleCuv+CutOCuruCviF/grqrgr4HgrqTgrqngr43grpXgrr/grrTgrq7gr4hf4K614K6/4K6v4K6+4K604K6V4K+N4K6V4K6/4K604K6u4K+IX+CuteCvhuCus+CvjeCus+Cuv+CuleCvjeCuleCuv+CutOCuruCviF/grprgrqngrr/grpXgr43grpXgrr/grrTgrq7gr4gnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CunuCuvuCur+Cuv+CuseCvgV/grqTgrr/grpngr43grpXgrrPgr41f4K6a4K+G4K614K+N4K614K6+4K6v4K+NX+CuquCvgeCupOCuqeCvjV/grrXgrr/grq/grr7grrTgrqngr41f4K614K+G4K6z4K+N4K6z4K6/X+CumuCuqeCuvycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgrp7grr5f4K6k4K6/X+CumuCvhl/grqrgr4Ff4K614K6/X+CuteCvhl/grponLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgrofgrqngr43grrHgr4FdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4K6o4K6+4K6z4K+IXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4K6o4K+H4K6x4K+N4K6x4K+BXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgrpXgrp/grqjgr43grqQg4K614K6+4K6w4K6u4K+NXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCuh+CusuCvjScsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4K6u4K+B4K6p4K+NJyxcbiAgICAgICAgICAgIHM6ICfgrpLgrrDgr4Eg4K6a4K6/4K6yIOCuteCuv+CuqOCuvuCun+Cuv+CuleCus+CvjScsXG4gICAgICAgICAgICBzczogJyVkIOCuteCuv+CuqOCuvuCun+Cuv+CuleCus+CvjScsXG4gICAgICAgICAgICBtOiAn4K6S4K6w4K+BIOCuqOCuv+CuruCuv+Cun+CuruCvjScsXG4gICAgICAgICAgICBtbTogJyVkIOCuqOCuv+CuruCuv+Cun+CumeCvjeCuleCus+CvjScsXG4gICAgICAgICAgICBoOiAn4K6S4K6w4K+BIOCuruCuo+CuvyDgrqjgr4fgrrDgrq7gr40nLFxuICAgICAgICAgICAgaGg6ICclZCDgrq7grqPgrr8g4K6o4K+H4K6w4K6u4K+NJyxcbiAgICAgICAgICAgIGQ6ICfgrpLgrrDgr4Eg4K6o4K6+4K6z4K+NJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4K6o4K6+4K6f4K+N4K6V4K6z4K+NJyxcbiAgICAgICAgICAgIE06ICfgrpLgrrDgr4Eg4K6u4K6+4K6k4K6u4K+NJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4K6u4K6+4K6k4K6Z4K+N4K6V4K6z4K+NJyxcbiAgICAgICAgICAgIHk6ICfgrpLgrrDgr4Eg4K614K6w4K+B4K6f4K6u4K+NJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4K6G4K6j4K+N4K6f4K+B4K6V4K6z4K+NJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ94K614K6k4K+BLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfgrrXgrqTgr4EnO1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4K+n4K+o4K+p4K+q4K+r4K+s4K+t4K+u4K+v4K+mXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvLyByZWZlciBodHRwOi8vdGEud2lraXBlZGlhLm9yZy9zLzFlcjFcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+Cur+CuvuCuruCuruCvjXzgrrXgr4jgrpXgrrHgr4h84K6V4K6+4K6y4K+IfOCuqOCuo+CvjeCuquCuleCusuCvjXzgro7grrHgr43grqrgrr7grp/gr4F84K6u4K6+4K6y4K+ILyxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCur+CuvuCuruCuruCvjSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCA2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K614K+I4K6V4K6x4K+IJzsgLy8g4K614K+I4K6V4K6x4K+IXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuleCuvuCusuCviCc7IC8vIOCuleCuvuCusuCviFxuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrqjgrqPgr43grqrgrpXgrrLgr40nOyAvLyDgrqjgrqPgr43grqrgrpXgrrLgr41cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6O4K6x4K+N4K6q4K6+4K6f4K+BJzsgLy8g4K6O4K6x4K+N4K6q4K6+4K6f4K+BXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuruCuvuCusuCviCc7IC8vIOCuruCuvuCusuCviFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrq/grr7grq7grq7gr40nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgrq/grr7grq7grq7gr40nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCAyID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgrrXgr4jgrpXgrrHgr4gnIHx8IG1lcmlkaWVtID09PSAn4K6V4K6+4K6y4K+IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CuqOCuo+CvjeCuquCuleCusuCvjScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0YTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUZWx1Z3UgW3RlXVxuLy8hIGF1dGhvciA6IEtyaXNobmEgQ2hhaXRhbnlhIFRob3RhIDogaHR0cHM6Ly9naXRodWIuY29tL2tjdGhvdGFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0ZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RlJywge1xuICAgICAgICBtb250aHM6ICfgsJzgsKjgsLXgsLDgsL9f4LCr4LC/4LCs4LGN4LCw4LC14LCw4LC/X+CwruCwvuCwsOCxjeCwmuCwv1/gsI/gsKrgsY3gsLDgsL/gsLLgsY1f4LCu4LGHX+CwnOCxguCwqOCxjV/gsJzgsYHgsLLgsYhf4LCG4LCX4LC44LGN4LCf4LGBX+CwuOCxhuCwquCxjeCwn+CxhuCwguCwrOCwsOCxjV/gsIXgsJXgsY3gsJ/gsYvgsKzgsLDgsY1f4LCo4LC14LCC4LCs4LCw4LGNX+CwoeCwv+CwuOCxhuCwguCwrOCwsOCxjScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4LCc4LCoLl/gsKvgsL/gsKzgsY3gsLAuX+CwruCwvuCwsOCxjeCwmuCwv1/gsI/gsKrgsY3gsLDgsL8uX+CwruCxh1/gsJzgsYLgsKjgsY1f4LCc4LGB4LCy4LGIX+CwhuCwly5f4LC44LGG4LCq4LGNLl/gsIXgsJXgsY3gsJ/gsYsuX+CwqOCwtS5f4LCh4LC/4LC44LGGLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfgsIbgsKbgsL/gsLXgsL7gsLDgsIJf4LC44LGL4LCu4LC14LC+4LCw4LCCX+CwruCwguCwl+Cws+CwteCwvuCwsOCwgl/gsKzgsYHgsKfgsLXgsL7gsLDgsIJf4LCX4LGB4LCw4LGB4LC14LC+4LCw4LCCX+CwtuCxgeCwleCxjeCwsOCwteCwvuCwsOCwgl/gsLbgsKjgsL/gsLXgsL7gsLDgsIInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CwhuCwpuCwv1/gsLjgsYvgsK5f4LCu4LCC4LCX4LCzX+CwrOCxgeCwp1/gsJfgsYHgsLDgsYFf4LC24LGB4LCV4LGN4LCwX+CwtuCwqOCwvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgsIZf4LC44LGLX+CwruCwgl/gsKzgsYFf4LCX4LGBX+CwtuCxgV/gsLYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4LCo4LGH4LCh4LGBXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CwsOCxh+CwquCxgV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CwqOCwv+CwqOCxjeCwqF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4LCX4LCkXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCwsuCxiycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4LCV4LGN4LCw4LC/4LCk4LCCJyxcbiAgICAgICAgICAgIHM6ICfgsJXgsYrgsKjgsY3gsKjgsL8g4LCV4LGN4LC34LCj4LC+4LCy4LGBJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4LC44LGG4LCV4LCo4LGN4LCy4LGBJyxcbiAgICAgICAgICAgIG06ICfgsJLgsJUg4LCo4LC/4LCu4LC/4LC34LCCJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4LCo4LC/4LCu4LC/4LC34LC+4LCy4LGBJyxcbiAgICAgICAgICAgIGg6ICfgsJLgsJUg4LCX4LCC4LCfJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4LCX4LCC4LCf4LCy4LGBJyxcbiAgICAgICAgICAgIGQ6ICfgsJLgsJUg4LCw4LGL4LCc4LGBJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4LCw4LGL4LCc4LGB4LCy4LGBJyxcbiAgICAgICAgICAgIE06ICfgsJLgsJUg4LCo4LGG4LCyJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4LCo4LGG4LCy4LCy4LGBJyxcbiAgICAgICAgICAgIHk6ICfgsJLgsJUg4LC44LCC4LC14LCk4LGN4LC44LCw4LCCJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4LC44LCC4LC14LCk4LGN4LC44LCw4LC+4LCy4LGBJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ94LC1LyxcbiAgICAgICAgb3JkaW5hbDogJyVk4LC1JyxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CwsOCwvuCwpOCxjeCwsOCwv3zgsIngsKbgsK/gsIJ84LCu4LCn4LGN4LCv4LC+4LC54LGN4LCo4LCCfOCwuOCwvuCwr+CwguCwpOCxjeCwsOCwgi8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CwsOCwvuCwpOCxjeCwsOCwvycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CwieCwpuCwr+CwgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsK7gsKfgsY3gsK/gsL7gsLngsY3gsKjgsIInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CwuOCwvuCwr+CwguCwpOCxjeCwsOCwgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsLDgsL7gsKTgsY3gsLDgsL8nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CwieCwpuCwr+Cwgic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LCu4LCn4LGN4LCv4LC+4LC54LGN4LCo4LCCJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsLjgsL7gsK/gsILgsKTgsY3gsLDgsIInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CwsOCwvuCwpOCxjeCwsOCwvyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUZXR1biBEaWxpIChFYXN0IFRpbW9yKSBbdGV0XVxuLy8hIGF1dGhvciA6IEpvc2h1YSBCcm9va3MgOiBodHRwczovL2dpdGh1Yi5jb20vam9zaGJyb29rc1xuLy8hIGF1dGhvciA6IE9ub3JpbyBEZSBKLiBBZm9uc28gOiBodHRwczovL2dpdGh1Yi5jb20vbWFyb2JvXG4vLyEgYXV0aG9yIDogU29uaWEgU2ltb2VzIDogaHR0cHM6Ly9naXRodWIuY29tL3Nvbmlhc2ltb2VzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdGV0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGV0Jywge1xuICAgICAgICBtb250aHM6ICdKYW5laXJ1X0ZldmVyZWlydV9NYXJzdV9BYnJpbF9NYWl1X0p1w7F1X0p1bGx1X0FndXN0dV9TZXRlbWJydV9PdXR1YnJ1X05vdmVtYnJ1X0RlemVtYnJ1Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZXZfTWFyX0Ficl9NYWlfSnVuX0p1bF9BZ29fU2V0X091dF9Ob3ZfRGV6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0RvbWluZ3VfU2VndW5kYV9UZXJzYV9LdWFydGFfS2ludGFfU2VzdGFfU2FiYWR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnRG9tX1NlZ19UZXJzX0t1YV9LaW50X1Nlc3RfU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0RvX1NlZ19UZV9LdV9LaV9TZXNfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbT2hpbiBpaGFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQWJhbiBpaGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbaWhhXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0hvcmlzZWlrIGloYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtzZW1hbmEga290dWtdIFtpaGFdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaWhhICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBsaXViYScsXG4gICAgICAgICAgICBzOiAnc2VndW5kdSBiYWx1bicsXG4gICAgICAgICAgICBzczogJ3NlZ3VuZHUgJWQnLFxuICAgICAgICAgICAgbTogJ21pbnV0dSBpZGEnLFxuICAgICAgICAgICAgbW06ICdtaW51dHUgJWQnLFxuICAgICAgICAgICAgaDogJ29yYXMgaWRhJyxcbiAgICAgICAgICAgIGhoOiAnb3JhcyAlZCcsXG4gICAgICAgICAgICBkOiAnbG9yb24gaWRhJyxcbiAgICAgICAgICAgIGRkOiAnbG9yb24gJWQnLFxuICAgICAgICAgICAgTTogJ2Z1bGFuIGlkYScsXG4gICAgICAgICAgICBNTTogJ2Z1bGFuICVkJyxcbiAgICAgICAgICAgIHk6ICd0aW5hbiBpZGEnLFxuICAgICAgICAgICAgeXk6ICd0aW5hbiAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZXQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGFqaWsgW3RnXVxuLy8hIGF1dGhvciA6IE9yaWYgTi4gSnIuIDogaHR0cHM6Ly9naXRodWIuY29tL29yaWYtanJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMDogJy3Rg9C8JyxcbiAgICAgICAgMTogJy3Rg9C8JyxcbiAgICAgICAgMjogJy3RjtC8JyxcbiAgICAgICAgMzogJy3RjtC8JyxcbiAgICAgICAgNDogJy3Rg9C8JyxcbiAgICAgICAgNTogJy3Rg9C8JyxcbiAgICAgICAgNjogJy3Rg9C8JyxcbiAgICAgICAgNzogJy3Rg9C8JyxcbiAgICAgICAgODogJy3Rg9C8JyxcbiAgICAgICAgOTogJy3Rg9C8JyxcbiAgICAgICAgMTA6ICct0YPQvCcsXG4gICAgICAgIDEyOiAnLdGD0LwnLFxuICAgICAgICAxMzogJy3Rg9C8JyxcbiAgICAgICAgMjA6ICct0YPQvCcsXG4gICAgICAgIDMwOiAnLdGO0LwnLFxuICAgICAgICA0MDogJy3Rg9C8JyxcbiAgICAgICAgNTA6ICct0YPQvCcsXG4gICAgICAgIDYwOiAnLdGD0LwnLFxuICAgICAgICA3MDogJy3Rg9C8JyxcbiAgICAgICAgODA6ICct0YPQvCcsXG4gICAgICAgIDkwOiAnLdGD0LwnLFxuICAgICAgICAxMDA6ICct0YPQvCcsXG4gICAgfTtcblxuICAgIHZhciB0ZyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RnJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9GP0L3QstCw0YDQuF/RhNC10LLRgNCw0LvQuF/QvNCw0YDRgtC4X9Cw0L/RgNC10LvQuF/QvNCw0LnQuF/QuNGO0L3QuF/QuNGO0LvQuF/QsNCy0LPRg9GB0YLQuF/RgdC10L3RgtGP0LHRgNC4X9C+0LrRgtGP0LHRgNC4X9C90L7Rj9Cx0YDQuF/QtNC10LrQsNCx0YDQuCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn0Y/QvdCy0LDRgF/RhNC10LLRgNCw0Ltf0LzQsNGA0YJf0LDQv9GA0LXQu1/QvNCw0Llf0LjRjtC9X9C40Y7Qu1/QsNCy0LPRg9GB0YJf0YHQtdC90YLRj9Cx0YBf0L7QutGC0Y/QsdGAX9C90L7Rj9Cx0YBf0LTQtdC60LDQsdGAJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfRj9C90LJf0YTQtdCyX9C80LDRgF/QsNC/0YBf0LzQsNC5X9C40Y7QvV/QuNGO0Ltf0LDQstCzX9GB0LXQvV/QvtC60YJf0L3QvtGPX9C00LXQuicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfRj9C60YjQsNC90LHQtV/QtNGD0YjQsNC90LHQtV/RgdC10YjQsNC90LHQtV/Rh9C+0YDRiNCw0L3QsdC1X9C/0LDQvdK30YjQsNC90LHQtV/St9GD0LzRitCwX9GI0LDQvdCx0LUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfRj9GI0LFf0LTRiNCxX9GB0YjQsV/Rh9GI0LFf0L/RiNCxX9K30YPQvF/RiNC90LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0Y/RiF/QtNGIX9GB0Yhf0YfRiF/Qv9GIX9K30Lxf0YjQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQmNC80YDTr9C3INGB0L7QsNGC0LhdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0KTQsNGA0LTQviDRgdC+0LDRgtC4XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9CU0LjRgNOv0Lcg0YHQvtCw0YLQuF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkW9C4XSBb0rPQsNGE0YLQsNC4INC+0Y/QvdC00LAg0YHQvtCw0YLQuF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkW9C4XSBb0rPQsNGE0YLQsNC4INCz0YPQt9Cw0YjRgtCwINGB0L7QsNGC0LhdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0LHQsNGK0LTQuCAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0L/QtdGIJyxcbiAgICAgICAgICAgIHM6ICfRj9C60YfQsNC90LQg0YHQvtC90LjRjycsXG4gICAgICAgICAgICBtOiAn0Y/QuiDQtNCw0pvQuNKb0LAnLFxuICAgICAgICAgICAgbW06ICclZCDQtNCw0pvQuNKb0LAnLFxuICAgICAgICAgICAgaDogJ9GP0Log0YHQvtCw0YInLFxuICAgICAgICAgICAgaGg6ICclZCDRgdC+0LDRgicsXG4gICAgICAgICAgICBkOiAn0Y/QuiDRgNOv0LcnLFxuICAgICAgICAgICAgZGQ6ICclZCDRgNOv0LcnLFxuICAgICAgICAgICAgTTogJ9GP0Log0LzQvtKzJyxcbiAgICAgICAgICAgIE1NOiAnJWQg0LzQvtKzJyxcbiAgICAgICAgICAgIHk6ICfRj9C6INGB0L7QuycsXG4gICAgICAgICAgICB5eTogJyVkINGB0L7QuycsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/RiNCw0LF80YHRg9Cx0rN80YDTr9C3fNCx0LXQs9C+0rMvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfRiNCw0LEnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfRgdGD0LHSsycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfRgNOv0LcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ9Cx0LXQs9C+0rMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YjQsNCxJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRgdGD0LHSsyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YDTr9C3JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQsdC10LPQvtKzJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRiNCw0LEnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNGD0Lx80Y7QvCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYSA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGIgPSBudW1iZXIgPj0gMTAwID8gMTAwIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoc3VmZml4ZXNbbnVtYmVyXSB8fCBzdWZmaXhlc1thXSB8fCBzdWZmaXhlc1tiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDF0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUaGFpIFt0aF1cbi8vISBhdXRob3IgOiBLcmlkc2FkYSBUaGFuYWJ1bHBvbmcgOiBodHRwczovL2dpdGh1Yi5jb20vc2lyblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRoID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGgnLCB7XG4gICAgICAgIG1vbnRoczogJ+C4oeC4geC4o+C4suC4hOC4oV/guIHguLjguKHguKDguLLguJ7guLHguJnguJjguYxf4Lih4Li14LiZ4Liy4LiE4LihX+C5gOC4oeC4qeC4suC4ouC4mV/guJ7guKTguKnguKDguLLguITguKFf4Lih4Li04LiW4Li44LiZ4Liy4Lii4LiZX+C4geC4o+C4geC4juC4suC4hOC4oV/guKrguLTguIfguKvguLLguITguKFf4LiB4Lix4LiZ4Lii4Liy4Lii4LiZX+C4leC4uOC4peC4suC4hOC4oV/guJ7guKTguKjguIjguLTguIHguLLguKLguJlf4LiY4Lix4LiZ4Lin4Liy4LiE4LihJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfguKEu4LiELl/guIEu4LieLl/guKHguLUu4LiELl/guYDguKEu4LiiLl/guJ4u4LiELl/guKHguLQu4LiiLl/guIEu4LiELl/guKou4LiELl/guIEu4LiiLl/guJUu4LiELl/guJ4u4LiiLl/guJgu4LiELicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+C4reC4suC4l+C4tOC4leC4ouC5jF/guIjguLHguJnguJfguKPguYxf4Lit4Lix4LiH4LiE4Liy4LijX+C4nuC4uOC4mF/guJ7guKTguKvguLHguKrguJrguJTguLVf4Lio4Li44LiB4Lij4LmMX+C5gOC4quC4suC4o+C5jCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+C4reC4suC4l+C4tOC4leC4ouC5jF/guIjguLHguJnguJfguKPguYxf4Lit4Lix4LiH4LiE4Liy4LijX+C4nuC4uOC4mF/guJ7guKTguKvguLHguKpf4Lio4Li44LiB4Lij4LmMX+C5gOC4quC4suC4o+C5jCcuc3BsaXQoJ18nKSwgLy8geWVzLCB0aHJlZSBjaGFyYWN0ZXJzIGRpZmZlcmVuY2VcbiAgICAgICAgd2Vla2RheXNNaW46ICfguK3guLIuX+C4iC5f4LitLl/guJ4uX+C4nuC4pC5f4LioLl/guKouJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIOC5gOC4p+C4peC4siBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICfguKfguLHguJlkZGRk4LiX4Li14LmIIEQgTU1NTSBZWVlZIOC5gOC4p+C4peC4siBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C4geC5iOC4reC4meC5gOC4l+C4teC5iOC4ouC4h3zguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+C4q+C4peC4seC4h+C5gOC4l+C4teC5iOC4ouC4hyc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfguIHguYjguK3guJnguYDguJfguLXguYjguKLguIcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C4q+C4peC4seC4h+C5gOC4l+C4teC5iOC4ouC4hyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+C4p+C4seC4meC4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4Lie4Lij4Li44LmI4LiH4LiZ4Li14LmJIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkW+C4q+C4meC5ieC4siDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4LmA4Lih4Li34LmI4Lit4Lin4Liy4LiZ4LiZ4Li14LmJIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4Lin4Lix4LiZXWRkZGRb4LiX4Li14LmI4LmB4Lil4LmJ4LinIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfguK3guLXguIEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVz4LiX4Li14LmI4LmB4Lil4LmJ4LinJyxcbiAgICAgICAgICAgIHM6ICfguYTguKHguYjguIHguLXguYjguKfguLTguJnguLLguJfguLUnLFxuICAgICAgICAgICAgc3M6ICclZCDguKfguLTguJnguLLguJfguLUnLFxuICAgICAgICAgICAgbTogJzEg4LiZ4Liy4LiX4Li1JyxcbiAgICAgICAgICAgIG1tOiAnJWQg4LiZ4Liy4LiX4Li1JyxcbiAgICAgICAgICAgIGg6ICcxIOC4iuC4seC5iOC4p+C5guC4oeC4hycsXG4gICAgICAgICAgICBoaDogJyVkIOC4iuC4seC5iOC4p+C5guC4oeC4hycsXG4gICAgICAgICAgICBkOiAnMSDguKfguLHguJknLFxuICAgICAgICAgICAgZGQ6ICclZCDguKfguLHguJknLFxuICAgICAgICAgICAgdzogJzEg4Liq4Lix4Lib4LiU4Liy4Lir4LmMJyxcbiAgICAgICAgICAgIHd3OiAnJWQg4Liq4Lix4Lib4LiU4Liy4Lir4LmMJyxcbiAgICAgICAgICAgIE06ICcxIOC5gOC4lOC4t+C4reC4mScsXG4gICAgICAgICAgICBNTTogJyVkIOC5gOC4lOC4t+C4reC4mScsXG4gICAgICAgICAgICB5OiAnMSDguJvguLUnLFxuICAgICAgICAgICAgeXk6ICclZCDguJvguLUnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFR1cmttZW4gW3RrXVxuLy8hIGF1dGhvciA6IEF0YW15cmF0IEFiZHlyYWhtYW5vdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hdGFteXJhdGFiZHlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMTogXCInaW5qaVwiLFxuICAgICAgICA1OiBcIidpbmppXCIsXG4gICAgICAgIDg6IFwiJ2luamlcIixcbiAgICAgICAgNzA6IFwiJ2luamlcIixcbiAgICAgICAgODA6IFwiJ2luamlcIixcbiAgICAgICAgMjogXCInbmppXCIsXG4gICAgICAgIDc6IFwiJ25qaVwiLFxuICAgICAgICAyMDogXCInbmppXCIsXG4gICAgICAgIDUwOiBcIiduamlcIixcbiAgICAgICAgMzogXCInw7xuamlcIixcbiAgICAgICAgNDogXCInw7xuamlcIixcbiAgICAgICAgMTAwOiBcIifDvG5qaVwiLFxuICAgICAgICA2OiBcIiduanlcIixcbiAgICAgICAgOTogXCIndW5qeVwiLFxuICAgICAgICAxMDogXCIndW5qeVwiLFxuICAgICAgICAzMDogXCIndW5qeVwiLFxuICAgICAgICA2MDogXCIneW5qeVwiLFxuICAgICAgICA5MDogXCIneW5qeVwiLFxuICAgIH07XG5cbiAgICB2YXIgdGsgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0aycsIHtcbiAgICAgICAgbW9udGhzOiAnw51hbndhcl9GZXdyYWxfTWFydF9BcHJlbF9NYcO9X0nDvXVuX0nDvXVsX0F3Z3VzdF9TZW50w71hYnJfT2t0w71hYnJfTm/DvWFicl9EZWthYnInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnw51hbl9GZXdfTWFyX0Fwcl9NYcO9X0nDvW5fScO9bF9Bd2dfU2VuX09rdF9Ob8O9X0Rlaycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfDnWVrxZ9lbmJlX0R1xZ9lbmJlX1NpxZ9lbmJlX8OHYXLFn2VuYmVfUGVuxZ9lbmJlX0FubmFfxZ5lbmJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnw51la19EdcWfX1NpxZ9fw4dhcl9QZW5fQW5uX8WeZW4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnw51rX0TFn19TxZ9fw4dyX1BuX0FuX8Webicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tidWfDvG4gc2FnYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbZXJ0aXIgc2FnYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW2luZGlraV0gZGRkZCBbc2FnYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZMO8w71uXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tnZcOnZW5dIGRkZGQgW3NhZ2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHNvxYgnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMO2xYgnLFxuICAgICAgICAgICAgczogJ2Jpcm7DpMOnZSBzZWt1bnQnLFxuICAgICAgICAgICAgbTogJ2JpciBtaW51dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0JyxcbiAgICAgICAgICAgIGg6ICdiaXIgc2FnYXQnLFxuICAgICAgICAgICAgaGg6ICclZCBzYWdhdCcsXG4gICAgICAgICAgICBkOiAnYmlyIGfDvG4nLFxuICAgICAgICAgICAgZGQ6ICclZCBnw7xuJyxcbiAgICAgICAgICAgIE06ICdiaXIgYcO9JyxcbiAgICAgICAgICAgIE1NOiAnJWQgYcO9JyxcbiAgICAgICAgICAgIHk6ICdiaXIgw715bCcsXG4gICAgICAgICAgICB5eTogJyVkIMO9eWwnLFxuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRG8nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0REJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHplcm9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBcIid1bmp5XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAobnVtYmVyICUgMTAwKSAtIGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0gfHwgc3VmZml4ZXNbY10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGs7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGFnYWxvZyAoUGhpbGlwcGluZXMpIFt0bC1waF1cbi8vISBhdXRob3IgOiBEYW4gSGFnbWFuIDogaHR0cHM6Ly9naXRodWIuY29tL2hhZ21hbmRhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRsUGggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0bC1waCcsIHtcbiAgICAgICAgbW9udGhzOiAnRW5lcm9fUGVicmVyb19NYXJzb19BYnJpbF9NYXlvX0h1bnlvX0h1bHlvX0Fnb3N0b19TZXR5ZW1icmVfT2t0dWJyZV9Ob2J5ZW1icmVfRGlzeWVtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0VuZV9QZWJfTWFyX0Ficl9NYXlfSHVuX0h1bF9BZ29fU2V0X09rdF9Ob2JfRGlzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0xpbmdnb19MdW5lc19NYXJ0ZXNfTWl5ZXJrdWxlc19IdXdlYmVzX0JpeWVybmVzX1NhYmFkbycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0xpbl9MdW5fTWFyX01peV9IdXdfQml5X1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdMaV9MdV9NYV9NaV9IdV9CaV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdNTS9EL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnTU1NTSBELCBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIERELCBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdMVCBbbmdheW9uZyBhcmF3XScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0J1a2FzIG5nXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ0xUIFtzYSBzdXN1bm9kIG5hXSBkZGRkJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdMVCBba2FoYXBvbl0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdMVCBbbm9vbmcgbmFrYXJhYW5nXSBkZGRkJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnc2EgbG9vYiBuZyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYW5nIG5ha2FsaXBhcycsXG4gICAgICAgICAgICBzOiAnaWxhbmcgc2VndW5kbycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG8nLFxuICAgICAgICAgICAgbTogJ2lzYW5nIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0bycsXG4gICAgICAgICAgICBoOiAnaXNhbmcgb3JhcycsXG4gICAgICAgICAgICBoaDogJyVkIG9yYXMnLFxuICAgICAgICAgICAgZDogJ2lzYW5nIGFyYXcnLFxuICAgICAgICAgICAgZGQ6ICclZCBhcmF3JyxcbiAgICAgICAgICAgIE06ICdpc2FuZyBidXdhbicsXG4gICAgICAgICAgICBNTTogJyVkIGJ1d2FuJyxcbiAgICAgICAgICAgIHk6ICdpc2FuZyB0YW9uJyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGFvbicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0bFBoO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEtsaW5nb24gW3RsaF1cbi8vISBhdXRob3IgOiBEb21pbmlrYSBLcnVrIDogaHR0cHM6Ly9naXRodWIuY29tL2FtYXJhbnRocm9zZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG51bWJlcnNOb3VucyA9ICdwYWdoX3dh4oCZX2NoYeKAmV93ZWpfbG9TX3ZhZ2hfamF2X1NvY2hfY2hvcmdoX0h1dCcuc3BsaXQoJ18nKTtcblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZUZ1dHVyZShvdXRwdXQpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBvdXRwdXQ7XG4gICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgb3V0cHV0LmluZGV4T2YoJ2phaicpICE9PSAtMVxuICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnbGVTJ1xuICAgICAgICAgICAgICAgIDogb3V0cHV0LmluZGV4T2YoJ2phcicpICE9PSAtMVxuICAgICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICd3YVEnXG4gICAgICAgICAgICAgICAgICA6IG91dHB1dC5pbmRleE9mKCdESVMnKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICduZW0nXG4gICAgICAgICAgICAgICAgICAgIDogdGltZSArICcgcElxJztcbiAgICAgICAgcmV0dXJuIHRpbWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlUGFzdChvdXRwdXQpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBvdXRwdXQ7XG4gICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgb3V0cHV0LmluZGV4T2YoJ2phaicpICE9PSAtMVxuICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnSHXigJknXG4gICAgICAgICAgICAgICAgOiBvdXRwdXQuaW5kZXhPZignamFyJykgIT09IC0xXG4gICAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ3dlbidcbiAgICAgICAgICAgICAgICAgIDogb3V0cHV0LmluZGV4T2YoJ0RJUycpICE9PSAtMVxuICAgICAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ2JlbidcbiAgICAgICAgICAgICAgICAgICAgOiB0aW1lICsgJyByZXQnO1xuICAgICAgICByZXR1cm4gdGltZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBudW1iZXJOb3VuID0gbnVtYmVyQXNOb3VuKG51bWJlcik7XG4gICAgICAgIHN3aXRjaCAoc3RyaW5nKSB7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIGx1cCc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIHR1cCc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIHJlcCc7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIGphaic7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIGphcic7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIERJUyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBudW1iZXJBc05vdW4obnVtYmVyKSB7XG4gICAgICAgIHZhciBodW5kcmVkID0gTWF0aC5mbG9vcigobnVtYmVyICUgMTAwMCkgLyAxMDApLFxuICAgICAgICAgICAgdGVuID0gTWF0aC5mbG9vcigobnVtYmVyICUgMTAwKSAvIDEwKSxcbiAgICAgICAgICAgIG9uZSA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgd29yZCA9ICcnO1xuICAgICAgICBpZiAoaHVuZHJlZCA+IDApIHtcbiAgICAgICAgICAgIHdvcmQgKz0gbnVtYmVyc05vdW5zW2h1bmRyZWRdICsgJ3ZhdGxoJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVuID4gMCkge1xuICAgICAgICAgICAgd29yZCArPSAod29yZCAhPT0gJycgPyAnICcgOiAnJykgKyBudW1iZXJzTm91bnNbdGVuXSArICdtYUgnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbmUgPiAwKSB7XG4gICAgICAgICAgICB3b3JkICs9ICh3b3JkICE9PSAnJyA/ICcgJyA6ICcnKSArIG51bWJlcnNOb3Vuc1tvbmVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3b3JkID09PSAnJyA/ICdwYWdoJyA6IHdvcmQ7XG4gICAgfVxuXG4gICAgdmFyIHRsaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RsaCcsIHtcbiAgICAgICAgbW9udGhzOiAndGVyYeKAmSBqYXIgd2HigJlfdGVyYeKAmSBqYXIgY2hh4oCZX3RlcmHigJkgamFyIHdlal90ZXJh4oCZIGphciBsb1NfdGVyYeKAmSBqYXIgdmFnaF90ZXJh4oCZIGphciBqYXZfdGVyYeKAmSBqYXIgU29jaF90ZXJh4oCZIGphciBjaG9yZ2hfdGVyYeKAmSBqYXIgSHV0X3RlcmHigJkgamFyIHdh4oCZbWFIX3RlcmHigJkgamFyIHdh4oCZbWFIIHdh4oCZX3RlcmHigJkgamFyIHdh4oCZbWFIIGNoYeKAmScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFyIHdh4oCZX2phciBjaGHigJlfamFyIHdlal9qYXIgbG9TX2phciB2YWdoX2phciBqYXZfamFyIFNvY2hfamFyIGNob3JnaF9qYXIgSHV0X2phciB3YeKAmW1hSF9qYXIgd2HigJltYUggd2HigJlfamFyIHdh4oCZbWFIIGNoYeKAmScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2xvam1JdGphal9EYVNqYWpfcG92amFqX2doSXRsaGphal9sb2doamFqX2J1cWphal9naEluamFqJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OlxuICAgICAgICAgICAgJ2xvam1JdGphal9EYVNqYWpfcG92amFqX2doSXRsaGphal9sb2doamFqX2J1cWphal9naEluamFqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjpcbiAgICAgICAgICAgICdsb2ptSXRqYWpfRGFTamFqX3Bvdmphal9naEl0bGhqYWpfbG9naGphal9idXFqYWpfZ2hJbmphaicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tEYUhqYWpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbd2HigJlsZVNdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnTExMJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbd2HigJlIdeKAmV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdMTEwnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IHRyYW5zbGF0ZUZ1dHVyZSxcbiAgICAgICAgICAgIHBhc3Q6IHRyYW5zbGF0ZVBhc3QsXG4gICAgICAgICAgICBzOiAncHVTIGx1cCcsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogJ3dh4oCZIHR1cCcsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogJ3dh4oCZIHJlcCcsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogJ3dh4oCZIGphaicsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogJ3dh4oCZIGphcicsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogJ3dh4oCZIERJUycsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRsaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUdXJraXNoIFt0cl1cbi8vISBhdXRob3JzIDogRXJoYW4gR3VuZG9nYW4gOiBodHRwczovL2dpdGh1Yi5jb20vZXJoYW5ndW5kb2dhbixcbi8vISAgICAgICAgICAgQnVyYWsgWWnEn2l0IEtheWE6IGh0dHBzOi8vZ2l0aHViLmNvbS9CWUtcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMTogXCInaW5jaVwiLFxuICAgICAgICA1OiBcIidpbmNpXCIsXG4gICAgICAgIDg6IFwiJ2luY2lcIixcbiAgICAgICAgNzA6IFwiJ2luY2lcIixcbiAgICAgICAgODA6IFwiJ2luY2lcIixcbiAgICAgICAgMjogXCInbmNpXCIsXG4gICAgICAgIDc6IFwiJ25jaVwiLFxuICAgICAgICAyMDogXCInbmNpXCIsXG4gICAgICAgIDUwOiBcIiduY2lcIixcbiAgICAgICAgMzogXCInw7xuY8O8XCIsXG4gICAgICAgIDQ6IFwiJ8O8bmPDvFwiLFxuICAgICAgICAxMDA6IFwiJ8O8bmPDvFwiLFxuICAgICAgICA2OiBcIiduY8SxXCIsXG4gICAgICAgIDk6IFwiJ3VuY3VcIixcbiAgICAgICAgMTA6IFwiJ3VuY3VcIixcbiAgICAgICAgMzA6IFwiJ3VuY3VcIixcbiAgICAgICAgNjA6IFwiJ8SxbmPEsVwiLFxuICAgICAgICA5MDogXCInxLFuY8SxXCIsXG4gICAgfTtcblxuICAgIHZhciB0ciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RyJywge1xuICAgICAgICBtb250aHM6ICdPY2FrX8WedWJhdF9NYXJ0X05pc2FuX01hecSxc19IYXppcmFuX1RlbW11el9BxJ91c3Rvc19FeWzDvGxfRWtpbV9LYXPEsW1fQXJhbMSxaycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdPY2FfxZ51Yl9NYXJfTmlzX01heV9IYXpfVGVtX0HEn3VfRXlsX0VraV9LYXNfQXJhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1BhemFyX1BhemFydGVzaV9TYWzEsV/Dh2FyxZ9hbWJhX1BlcsWfZW1iZV9DdW1hX0N1bWFydGVzaScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1Bhel9QenRfU2FsX8OHYXJfUGVyX0N1bV9DbXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnUHpfUHRfU2Ffw4dhX1BlX0N1X0N0Jy5zcGxpdCgnXycpLFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ8O2w7YnIDogJ8OWw5YnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfDtnMnIDogJ8OWUyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/DtsO2fMOWw5Z8w7ZzfMOWUy8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAnw7ZzJyB8fCBpbnB1dCA9PT0gJ8OWUyc7XG4gICAgICAgIH0sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbYnVnw7xuIHNhYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbeWFyxLFuIHNhYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW2dlbGVjZWtdIGRkZGQgW3NhYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZMO8bl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZ2XDp2VuXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHNvbnJhJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDDtm5jZScsXG4gICAgICAgICAgICBzOiAnYmlya2HDpyBzYW5peWUnLFxuICAgICAgICAgICAgc3M6ICclZCBzYW5peWUnLFxuICAgICAgICAgICAgbTogJ2JpciBkYWtpa2EnLFxuICAgICAgICAgICAgbW06ICclZCBkYWtpa2EnLFxuICAgICAgICAgICAgaDogJ2JpciBzYWF0JyxcbiAgICAgICAgICAgIGhoOiAnJWQgc2FhdCcsXG4gICAgICAgICAgICBkOiAnYmlyIGfDvG4nLFxuICAgICAgICAgICAgZGQ6ICclZCBnw7xuJyxcbiAgICAgICAgICAgIHc6ICdiaXIgaGFmdGEnLFxuICAgICAgICAgICAgd3c6ICclZCBoYWZ0YScsXG4gICAgICAgICAgICBNOiAnYmlyIGF5JyxcbiAgICAgICAgICAgIE1NOiAnJWQgYXknLFxuICAgICAgICAgICAgeTogJ2JpciB5xLFsJyxcbiAgICAgICAgICAgIHl5OiAnJWQgecSxbCcsXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEbyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgemVyb1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIFwiJ8SxbmPEsVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICBiID0gKG51bWJlciAlIDEwMCkgLSBhLFxuICAgICAgICAgICAgICAgICAgICAgICAgYyA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdIHx8IHN1ZmZpeGVzW2NdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRhbG9zc2FuIFt0emxdXG4vLyEgYXV0aG9yIDogUm9iaW4gdmFuIGRlciBWbGlldCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JpbjB2YW4wZGVyMHZcbi8vISBhdXRob3IgOiBJdXN0w6wgQ2FudW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIC8vIEFmdGVyIHRoZSB5ZWFyIHRoZXJlIHNob3VsZCBiZSBhIHNsYXNoIGFuZCB0aGUgYW1vdW50IG9mIHllYXJzIHNpbmNlIERlY2VtYmVyIDI2LCAxOTc5IGluIFJvbWFuIG51bWVyYWxzLlxuICAgIC8vIFRoaXMgaXMgY3VycmVudGx5IHRvbyBkaWZmaWN1bHQgKG1heWJlIGV2ZW4gaW1wb3NzaWJsZSkgdG8gYWRkLlxuICAgIHZhciB0emwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0emwnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcl9GZXZyYWdsaF9NYXLDp19BdnLDr3VfTWFpX0fDvG5fSnVsaWFfR3VzY2h0X1NldGVtdmFyX0xpc3RvcMOkdHNfTm9lbXZhcl9aZWNlbXZhcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmV2X01hcl9BdnJfTWFpX0fDvG5fSnVsX0d1c19TZXRfTGlzX05vZV9aZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU8O6bGFkaV9Mw7puZcOnaV9NYWl0emlfTcOhcmN1cmlfWGjDumFkaV9WacOpbmVyw6dpX1PDoXR1cmknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTw7psX0zDum5fTWFpX03DoXJfWGjDul9WacOpX1PDoXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU8O6X0zDul9NYV9Nw6FfWGhfVmlfU8OhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gW2RhbGxhc10gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFtkYWxsYXNdIFlZWVkgSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIFtsaV0gRC4gTU1NTSBbZGFsbGFzXSBZWVlZIEhILm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2RcXCdvfGRcXCdhL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiZCdvXCIgPT09IGlucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyBcImQnb1wiIDogXCJEJ09cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyBcImQnYVwiIDogXCJEJ0FcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbb3hoaSDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tkZW3DoCDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpZWlyaSDDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbc8O8ciBlbF0gZGRkZCBbbGFzdGV1IMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ29zcHJlaSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnamElcycsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgczogWyd2aWVuc2FzIHNlY3VuZHMnLCBcIidpZW5zYXMgc2VjdW5kc1wiXSxcbiAgICAgICAgICAgIHNzOiBbbnVtYmVyICsgJyBzZWN1bmRzJywgJycgKyBudW1iZXIgKyAnIHNlY3VuZHMnXSxcbiAgICAgICAgICAgIG06IFtcIiduIG3DrXV0XCIsIFwiJ2llbnMgbcOtdXRcIl0sXG4gICAgICAgICAgICBtbTogW251bWJlciArICcgbcOtdXRzJywgJycgKyBudW1iZXIgKyAnIG3DrXV0cyddLFxuICAgICAgICAgICAgaDogW1wiJ24gw75vcmFcIiwgXCInaWVuc2Egw75vcmFcIl0sXG4gICAgICAgICAgICBoaDogW251bWJlciArICcgw75vcmFzJywgJycgKyBudW1iZXIgKyAnIMO+b3JhcyddLFxuICAgICAgICAgICAgZDogW1wiJ24geml1YVwiLCBcIidpZW5zYSB6aXVhXCJdLFxuICAgICAgICAgICAgZGQ6IFtudW1iZXIgKyAnIHppdWFzJywgJycgKyBudW1iZXIgKyAnIHppdWFzJ10sXG4gICAgICAgICAgICBNOiBbXCInbiBtZXNcIiwgXCInaWVucyBtZXNcIl0sXG4gICAgICAgICAgICBNTTogW251bWJlciArICcgbWVzZW4nLCAnJyArIG51bWJlciArICcgbWVzZW4nXSxcbiAgICAgICAgICAgIHk6IFtcIiduIGFyXCIsIFwiJ2llbnMgYXJcIl0sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgYXJzJywgJycgKyBudW1iZXIgKyAnIGFycyddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXNGdXR1cmVcbiAgICAgICAgICAgID8gZm9ybWF0W2tleV1bMF1cbiAgICAgICAgICAgIDogd2l0aG91dFN1ZmZpeFxuICAgICAgICAgICAgICA/IGZvcm1hdFtrZXldWzBdXG4gICAgICAgICAgICAgIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHR6bDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDZW50cmFsIEF0bGFzIFRhbWF6aWdodCBMYXRpbiBbdHptLWxhdG5dXG4vLyEgYXV0aG9yIDogQWJkZWwgU2FpZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0em1MYXRuID0gbW9tZW50LmRlZmluZUxvY2FsZSgndHptLWxhdG4nLCB7XG4gICAgICAgIG1vbnRoczogJ2lubmF5cl9icsukYXlyy6RfbWFyy6Rzy6RfaWJyaXJfbWF5eXdfeXdueXdfeXdseXd6X8mjd8WhdF/FoXd0YW5iaXJfa3TLpHdicsukX253d2FuYmlyX2R3am5iaXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2lubmF5cl9icsukYXlyy6RfbWFyy6Rzy6RfaWJyaXJfbWF5eXdfeXdueXdfeXdseXd6X8mjd8WhdF/FoXd0YW5iaXJfa3TLpHdicsukX253d2FuYmlyX2R3am5iaXInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICdhc2FtYXNfYXluYXNfYXNpbmFzX2FrcmFzX2Frd2FzX2FzaW13YXNfYXNp4biNeWFzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnYXNhbWFzX2F5bmFzX2FzaW5hc19ha3Jhc19ha3dhc19hc2ltd2FzX2FzaeG4jXlhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdhc2FtYXNfYXluYXNfYXNpbmFzX2FrcmFzX2Frd2FzX2FzaW13YXNfYXNp4biNeWFzJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbYXNka2ggZ10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1thc2thIGddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbZ10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1thc3NhbnQgZ10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtnXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhZGtoIHMgeWFuICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICd5YW4gJXMnLFxuICAgICAgICAgICAgczogJ2ltaWsnLFxuICAgICAgICAgICAgc3M6ICclZCBpbWlrJyxcbiAgICAgICAgICAgIG06ICdtaW514biNJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludeG4jScsXG4gICAgICAgICAgICBoOiAnc2HJm2EnLFxuICAgICAgICAgICAgaGg6ICclZCB0YXNzYcmbaW4nLFxuICAgICAgICAgICAgZDogJ2FzcycsXG4gICAgICAgICAgICBkZDogJyVkIG9zc2FuJyxcbiAgICAgICAgICAgIE06ICdheW93cicsXG4gICAgICAgICAgICBNTTogJyVkIGl5eWlybicsXG4gICAgICAgICAgICB5OiAnYXNnYXMnLFxuICAgICAgICAgICAgeXk6ICclZCBpc2dhc24nLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDEyLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxMnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHR6bUxhdG47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2VudHJhbCBBdGxhcyBUYW1hemlnaHQgW3R6bV1cbi8vISBhdXRob3IgOiBBYmRlbCBTYWlkIDogaHR0cHM6Ly9naXRodWIuY29tL2FiZGVsc2FpZFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHR6bSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3R6bScsIHtcbiAgICAgICAgbW9udGhzOiAn4rWJ4rWP4rWP4rSw4rWi4rWUX+K0seK1leK0sOK1ouK1lV/itY7itLDitZXitZpf4rWJ4rSx4rWU4rWJ4rWUX+K1juK0sOK1ouK1ouK1k1/itaLitZPitY/itaLitZNf4rWi4rWT4rWN4rWi4rWT4rWjX+K1luK1k+K1m+K1nF/itZvitZPitZzitLDitY/itLHitYnitZRf4rS94rWf4rWT4rSx4rWVX+K1j+K1k+K1oeK0sOK1j+K0seK1ieK1lF/itLfitZPitYritY/itLHitYnitZQnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+K1ieK1j+K1j+K0sOK1ouK1lF/itLHitZXitLDitaLitZVf4rWO4rSw4rWV4rWaX+K1ieK0seK1lOK1ieK1lF/itY7itLDitaLitaLitZNf4rWi4rWT4rWP4rWi4rWTX+K1ouK1k+K1jeK1ouK1k+K1o1/itZbitZPitZvitZxf4rWb4rWT4rWc4rSw4rWP4rSx4rWJ4rWUX+K0veK1n+K1k+K0seK1lV/itY/itZPitaHitLDitY/itLHitYnitZRf4rS34rWT4rWK4rWP4rSx4rWJ4rWUJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn4rSw4rWZ4rSw4rWO4rSw4rWZX+K0sOK1ouK1j+K0sOK1mV/itLDitZnitYnitY/itLDitZlf4rSw4rS94rWU4rSw4rWZX+K0sOK0veK1oeK0sOK1mV/itLDitZnitYnitY7itaHitLDitZlf4rSw4rWZ4rWJ4rS54rWi4rSw4rWZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4rSw4rWZ4rSw4rWO4rSw4rWZX+K0sOK1ouK1j+K0sOK1mV/itLDitZnitYnitY/itLDitZlf4rSw4rS94rWU4rSw4rWZX+K0sOK0veK1oeK0sOK1mV/itLDitZnitYnitY7itaHitLDitZlf4rSw4rWZ4rWJ4rS54rWi4rSw4rWZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+K0sOK1meK0sOK1juK0sOK1mV/itLDitaLitY/itLDitZlf4rSw4rWZ4rWJ4rWP4rSw4rWZX+K0sOK0veK1lOK0sOK1mV/itLDitL3itaHitLDitZlf4rSw4rWZ4rWJ4rWO4rWh4rSw4rWZX+K0sOK1meK1ieK0ueK1ouK0sOK1mScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+K0sOK1meK0t+K1hSDitLRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4rSw4rWZ4rS94rSwIOK0tF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvitLRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4rSw4rWa4rSw4rWP4rWcIOK0tF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvitLRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn4rS34rSw4rS34rWFIOK1mSDitaLitLDitY8gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ+K1ouK0sOK1jyAlcycsXG4gICAgICAgICAgICBzOiAn4rWJ4rWO4rWJ4rS9JyxcbiAgICAgICAgICAgIHNzOiAnJWQg4rWJ4rWO4rWJ4rS9JyxcbiAgICAgICAgICAgIG06ICfitY7itYnitY/itZPitLonLFxuICAgICAgICAgICAgbW06ICclZCDitY7itYnitY/itZPitLonLFxuICAgICAgICAgICAgaDogJ+K1meK0sOK1hOK0sCcsXG4gICAgICAgICAgICBoaDogJyVkIOK1nOK0sOK1meK1meK0sOK1hOK1ieK1jycsXG4gICAgICAgICAgICBkOiAn4rSw4rWZ4rWZJyxcbiAgICAgICAgICAgIGRkOiAnJWQgb+K1meK1meK0sOK1jycsXG4gICAgICAgICAgICBNOiAn4rSw4rWib+K1k+K1lCcsXG4gICAgICAgICAgICBNTTogJyVkIOK1ieK1ouK1ouK1ieK1lOK1jycsXG4gICAgICAgICAgICB5OiAn4rSw4rWZ4rSz4rSw4rWZJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4rWJ4rWZ4rSz4rSw4rWZ4rWPJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0em07XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVXlnaHVyIChDaGluYSkgW3VnLWNuXVxuLy8hIGF1dGhvcjogYm95YXEgOiBodHRwczovL2dpdGh1Yi5jb20vYm95YXFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB1Z0NuID0gbW9tZW50LmRlZmluZUxvY2FsZSgndWctY24nLCB7XG4gICAgICAgIG1vbnRoczogJ9mK2KfZhtuL2KfYsV/ZgduQ24vYsdin2YRf2YXYp9ix2Kpf2KbYp9m+2LHbkNmEX9mF2KfZil/YptmJ2Yrbh9mGX9im2YnZituH2YRf2KbYp9uL2Lrbh9iz2Kpf2LPbkNmG2Krbldio2YnYsV/YptuG2YPYqtuV2KjZidixX9mG2YjZitin2KjZidixX9iv25DZg9in2KjZidixJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfZitin2Ybbi9in2LFf2YHbkNuL2LHYp9mEX9mF2KfYsdiqX9im2KfZvtix25DZhF/Zhdin2Ypf2KbZidmK24fZhl/YptmJ2Yrbh9mEX9im2Kfbi9i624fYs9iqX9iz25DZhtiq25XYqNmJ2LFf2KbbhtmD2Krbldio2YnYsV/ZhtmI2YrYp9io2YnYsV/Yr9uQ2YPYp9io2YnYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9mK25XZg9i025XZhtio25Vf2K/biNi025XZhtio25Vf2LPbldmK2LTbldmG2KjblV/ahtin2LHYtNuV2YbYqNuVX9m+25XZiti025XZhtio25Vf2KzbiNmF25Vf2LTbldmG2KjblScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9mK25Vf2K/biF/Ys9uVX9qG2Kdf2b7blV/YrNuIX9i025UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2YrblV/Yr9uIX9iz25Vf2obYp1/ZvtuVX9is24hf2LTblScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZLdmK2YnZhNmJTS3Yptin2YrZhtmJ2q1ELdmD24jZhtmJJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkt2YrZidmE2YlNLdim2KfZitmG2YnarUQt2YPbiNmG2YnYjCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZNiMIFlZWVkt2YrZidmE2YlNLdim2KfZitmG2YnarUQt2YPbiNmG2YnYjCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/ZituQ2LHZidmFINmD25DahtuVfNiz25XavtuV2LF82obbiNi02KrZidmGINio24fYsduH2YZ82obbiNi0fNqG24jYtNiq2YnZhiDZg9uQ2YrZidmGfNmD25Xahi8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ9mK25DYsdmJ2YUg2YPbkNqG25UnIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfYs9uV2r7bldixJyB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn2obbiNi02KrZidmGINio24fYsduH2YYnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfahtuI2LTYqtmJ2YYg2YPbkNmK2YnZhicgfHwgbWVyaWRpZW0gPT09ICfZg9uV2oYnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgdmFyIGhtID0gaG91ciAqIDEwMCArIG1pbnV0ZTtcbiAgICAgICAgICAgIGlmIChobSA8IDYwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YrbkNix2YnZhSDZg9uQ2obblSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYs9uV2r7bldixJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMTMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfahtuI2LTYqtmJ2YYg2Kjbh9ix24fZhic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2obbiNi0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfahtuI2LTYqtmJ2YYg2YPbkNmK2YnZhic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YPbldqGJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KjbiNqv24jZhiDYs9in2KbbldiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9im25XYqtuVINiz2KfYptuV2KpdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW9mD25DZhNuV2LHZg9mJXSBkZGRkIFvYs9in2KbbldiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9iq24bZhtuI2q/biNmGXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vYptin2YTYr9mJ2YbZgtmJXSBkZGRkIFvYs9in2KbbldiqXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINmD25DZitmJ2YYnLFxuICAgICAgICAgICAgcGFzdDogJyVzINio24fYsduH2YYnLFxuICAgICAgICAgICAgczogJ9mG25XahtqG25Ug2LPbkNmD2YjZhtiqJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2LPbkNmD2YjZhtiqJyxcbiAgICAgICAgICAgIG06ICfYqNmJ2LEg2YXZidmG24fYqicsXG4gICAgICAgICAgICBtbTogJyVkINmF2YnZhtuH2KonLFxuICAgICAgICAgICAgaDogJ9io2YnYsSDYs9in2KbbldiqJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9im25XYqicsXG4gICAgICAgICAgICBkOiAn2KjZidixINmD24jZhicsXG4gICAgICAgICAgICBkZDogJyVkINmD24jZhicsXG4gICAgICAgICAgICBNOiAn2KjZidixINim2KfZiicsXG4gICAgICAgICAgICBNTTogJyVkINim2KfZiicsXG4gICAgICAgICAgICB5OiAn2KjZidixINmK2YnZhCcsXG4gICAgICAgICAgICB5eTogJyVkINmK2YnZhCcsXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KC3Zg9uI2YbZiXwt2KbYp9mKfC3avtuV2b7YqtuVKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Zg9uI2YbZiSc7XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdq+25XZvtiq25UnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgLy8gR0IvVCA3NDA4LTE5OTTjgIrmlbDmja7lhYPlkozkuqTmjaLmoLzlvI/Ct+S/oeaBr+S6pOaNosK35pel5pyf5ZKM5pe26Ze06KGo56S65rOV44CL5LiOSVNPIDg2MDE6MTk4OOetieaViFxuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVnQ247XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVWtyYWluaWFuIFt1a11cbi8vISBhdXRob3IgOiB6ZW1sYW5pbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS96ZW1sYW5pblxuLy8hIEF1dGhvciA6IE1lbmVsaW9uIEVsZW5zw7psZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwbHVyYWwod29yZCwgbnVtKSB7XG4gICAgICAgIHZhciBmb3JtcyA9IHdvcmQuc3BsaXQoJ18nKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDEwID09PSAxICYmIG51bSAlIDEwMCAhPT0gMTFcbiAgICAgICAgICAgID8gZm9ybXNbMF1cbiAgICAgICAgICAgIDogbnVtICUgMTAgPj0gMiAmJiBudW0gJSAxMCA8PSA0ICYmIChudW0gJSAxMDAgPCAxMCB8fCBudW0gJSAxMDAgPj0gMjApXG4gICAgICAgICAgICAgID8gZm9ybXNbMV1cbiAgICAgICAgICAgICAgOiBmb3Jtc1syXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFBsdXJhbChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgc3M6IHdpdGhvdXRTdWZmaXggPyAn0YHQtdC60YPQvdC00LBf0YHQtdC60YPQvdC00Lhf0YHQtdC60YPQvdC0JyA6ICfRgdC10LrRg9C90LTRg1/RgdC10LrRg9C90LTQuF/RgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbW06IHdpdGhvdXRTdWZmaXggPyAn0YXQstC40LvQuNC90LBf0YXQstC40LvQuNC90Lhf0YXQstC40LvQuNC9JyA6ICfRhdCy0LjQu9C40L3Rg1/RhdCy0LjQu9C40L3QuF/RhdCy0LjQu9C40L0nLFxuICAgICAgICAgICAgaGg6IHdpdGhvdXRTdWZmaXggPyAn0LPQvtC00LjQvdCwX9Cz0L7QtNC40L3QuF/Qs9C+0LTQuNC9JyA6ICfQs9C+0LTQuNC90YNf0LPQvtC00LjQvdC4X9Cz0L7QtNC40L0nLFxuICAgICAgICAgICAgZGQ6ICfQtNC10L3RjF/QtNC90ZZf0LTQvdGW0LInLFxuICAgICAgICAgICAgTU06ICfQvNGW0YHRj9GG0Yxf0LzRltGB0Y/RhtGWX9C80ZbRgdGP0YbRltCyJyxcbiAgICAgICAgICAgIHl5OiAn0YDRltC6X9GA0L7QutC4X9GA0L7QutGW0LInLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoa2V5ID09PSAnbScpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9GF0LLQuNC70LjQvdCwJyA6ICfRhdCy0LjQu9C40L3Rgyc7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaCcpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9Cz0L7QtNC40L3QsCcgOiAn0LPQvtC00LjQvdGDJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBwbHVyYWwoZm9ybWF0W2tleV0sICtudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzQ2FzZVJlcGxhY2UobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciB3ZWVrZGF5cyA9IHtcbiAgICAgICAgICAgICAgICBub21pbmF0aXZlOlxuICAgICAgICAgICAgICAgICAgICAn0L3QtdC00ZbQu9GPX9C/0L7QvdC10LTRltC70L7Qul/QstGW0LLRgtC+0YDQvtC6X9GB0LXRgNC10LTQsF/Rh9C10YLQstC10YBf0L/igJnRj9GC0L3QuNGG0Y9f0YHRg9Cx0L7RgtCwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGFjY3VzYXRpdmU6XG4gICAgICAgICAgICAgICAgICAgICfQvdC10LTRltC70Y5f0L/QvtC90LXQtNGW0LvQvtC6X9Cy0ZbQstGC0L7RgNC+0Lpf0YHQtdGA0LXQtNGDX9GH0LXRgtCy0LXRgF/Qv+KAmdGP0YLQvdC40YbRjl/RgdGD0LHQvtGC0YMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZ2VuaXRpdmU6XG4gICAgICAgICAgICAgICAgICAgICfQvdC10LTRltC70ZZf0L/QvtC90LXQtNGW0LvQutCwX9Cy0ZbQstGC0L7RgNC60LBf0YHQtdGA0LXQtNC4X9GH0LXRgtCy0LXRgNCz0LBf0L/igJnRj9GC0L3QuNGG0ZZf0YHRg9Cx0L7RgtC4Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vdW5DYXNlO1xuXG4gICAgICAgIGlmIChtID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheXNbJ25vbWluYXRpdmUnXVxuICAgICAgICAgICAgICAgIC5zbGljZSgxLCA3KVxuICAgICAgICAgICAgICAgIC5jb25jYXQod2Vla2RheXNbJ25vbWluYXRpdmUnXS5zbGljZSgwLCAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheXNbJ25vbWluYXRpdmUnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vdW5DYXNlID0gLyhcXFtb0JLQstCj0YNdXFxdKSA/ZGRkZC8udGVzdChmb3JtYXQpXG4gICAgICAgICAgICA/ICdhY2N1c2F0aXZlJ1xuICAgICAgICAgICAgOiAvXFxbPyg/OtC80LjQvdGD0LvQvtGXfNC90LDRgdGC0YPQv9C90L7Rlyk/ID9cXF0gP2RkZGQvLnRlc3QoZm9ybWF0KVxuICAgICAgICAgICAgICA/ICdnZW5pdGl2ZSdcbiAgICAgICAgICAgICAgOiAnbm9taW5hdGl2ZSc7XG4gICAgICAgIHJldHVybiB3ZWVrZGF5c1tub3VuQ2FzZV1bbS5kYXkoKV07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKHN0cikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ciArICfQvicgKyAodGhpcy5ob3VycygpID09PSAxMSA/ICfQsScgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHVrID0gbW9tZW50LmRlZmluZUxvY2FsZSgndWsnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAn0YHRltGH0L3Rj1/Qu9GO0YLQvtCz0L5f0LHQtdGA0LXQt9C90Y9f0LrQstGW0YLQvdGPX9GC0YDQsNCy0L3Rj1/Rh9C10YDQstC90Y9f0LvQuNC/0L3Rj1/RgdC10YDQv9C90Y9f0LLQtdGA0LXRgdC90Y9f0LbQvtCy0YLQvdGPX9C70LjRgdGC0L7Qv9Cw0LTQsF/Qs9GA0YPQtNC90Y8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9GB0ZbRh9C10L3RjF/Qu9GO0YLQuNC5X9Cx0LXRgNC10LfQtdC90Yxf0LrQstGW0YLQtdC90Yxf0YLRgNCw0LLQtdC90Yxf0YfQtdGA0LLQtdC90Yxf0LvQuNC/0LXQvdGMX9GB0LXRgNC/0LXQvdGMX9Cy0LXRgNC10YHQtdC90Yxf0LbQvtCy0YLQtdC90Yxf0LvQuNGB0YLQvtC/0LDQtF/Qs9GA0YPQtNC10L3RjCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0YHRltGHX9C70Y7Rgl/QsdC10YBf0LrQstGW0YJf0YLRgNCw0LJf0YfQtdGA0LJf0LvQuNC/X9GB0LXRgNC/X9Cy0LXRgF/QttC+0LLRgl/Qu9C40YHRgl/Qs9GA0YPQtCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6IHdlZWtkYXlzQ2FzZVJlcGxhY2UsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQvdC0X9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9C90LRf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVkg0YAuJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZINGALiwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZINGALiwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQodGM0L7Qs9C+0LTQvdGWICcpLFxuICAgICAgICAgICAgbmV4dERheTogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQl9Cw0LLRgtGA0LAgJyksXG4gICAgICAgICAgICBsYXN0RGF5OiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9CS0YfQvtGA0LAgJyksXG4gICAgICAgICAgICBuZXh0V2VlazogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQo10gZGRkZCBbJyksXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQnNC40L3Rg9C70L7Rl10gZGRkZCBbJykuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9Cc0LjQvdGD0LvQvtCz0L5dIGRkZGQgWycpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0LfQsCAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0YLQvtC80YMnLFxuICAgICAgICAgICAgczogJ9C00LXQutGW0LvRjNC60LAg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIHNzOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaDogJ9Cz0L7QtNC40L3RgycsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQ6ICfQtNC10L3RjCcsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE06ICfQvNGW0YHRj9GG0YwnLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5OiAn0YDRltC6JyxcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICB9LFxuICAgICAgICAvLyBNLiBFLjogdGhvc2UgdHdvIGFyZSB2aXJ0dWFsbHkgdW51c2VkIGJ1dCBhIHVzZXIgbWlnaHQgd2FudCB0byBpbXBsZW1lbnQgdGhlbSBmb3IgaGlzL2hlciB3ZWJzaXRlIGZvciBzb21lIHJlYXNvblxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0L3QvtGH0ZZ80YDQsNC90LrRg3zQtNC90Y980LLQtdGH0L7RgNCwLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o0LTQvdGPfNCy0LXRh9C+0YDQsCkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0L3QvtGH0ZYnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GA0LDQvdC60YMnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C00L3Rjyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LLQtdGH0L7RgNCwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQuXzQs9C+KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QuSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCz0L4nO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB1aztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBVcmR1IFt1cl1cbi8vISBhdXRob3IgOiBTYXdvb2QgQWxhbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9pYm5lc2F5ZWVkXG4vLyEgYXV0aG9yIDogWmFjayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9aYWNrVmlzaW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9is2YbZiNix24wnLFxuICAgICAgICAgICAgJ9mB2LHZiNix24wnLFxuICAgICAgICAgICAgJ9mF2KfYsdqGJyxcbiAgICAgICAgICAgICfYp9m+2LHbjNmEJyxcbiAgICAgICAgICAgICfZhdim24wnLFxuICAgICAgICAgICAgJ9is2YjZhicsXG4gICAgICAgICAgICAn2KzZiNmE2KfYptuMJyxcbiAgICAgICAgICAgICfYp9qv2LPYqicsXG4gICAgICAgICAgICAn2LPYqtmF2KjYsScsXG4gICAgICAgICAgICAn2Kfaqdiq2YjYqNixJyxcbiAgICAgICAgICAgICfZhtmI2YXYqNixJyxcbiAgICAgICAgICAgICfYr9iz2YXYqNixJyxcbiAgICAgICAgXSxcbiAgICAgICAgZGF5cyA9IFsn2KfYqtmI2KfYsScsICfZvtuM2LEnLCAn2YXZhtqv2YQnLCAn2KjYr9q+JywgJ9is2YXYudix2KfYqicsICfYrNmF2LnbgScsICfbgdmB2KrbgSddO1xuXG4gICAgdmFyIHVyID0gbW9tZW50LmRlZmluZUxvY2FsZSgndXInLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5czogZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogZGF5cyxcbiAgICAgICAgd2Vla2RheXNNaW46IGRheXMsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGTYjCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/Ytdio2K182LTYp9mFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9i02KfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LXYqNitJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAn2LTYp9mFJztcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KLYrCDYqNmI2YLYql0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vaqdmEINio2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9io2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9qv2LDYtNiq24Eg2LHZiNiyINio2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1var9iw2LTYqtuBXSBkZGRkIFvYqNmI2YLYql0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDYqNi52K8nLFxuICAgICAgICAgICAgcGFzdDogJyVzINmC2KjZhCcsXG4gICAgICAgICAgICBzOiAn2obZhtivINiz24zaqdmG2ognLFxuICAgICAgICAgICAgc3M6ICclZCDYs9uM2qnZhtqIJyxcbiAgICAgICAgICAgIG06ICfYp9uM2qkg2YXZhtm5JyxcbiAgICAgICAgICAgIG1tOiAnJWQg2YXZhtm5JyxcbiAgICAgICAgICAgIGg6ICfYp9uM2qkg2q/avtmG2bnbgScsXG4gICAgICAgICAgICBoaDogJyVkINqv2r7Zhtm525InLFxuICAgICAgICAgICAgZDogJ9in24zaqSDYr9mGJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2K/ZhicsXG4gICAgICAgICAgICBNOiAn2KfbjNqpINmF2KfbgScsXG4gICAgICAgICAgICBNTTogJyVkINmF2KfbgScsXG4gICAgICAgICAgICB5OiAn2KfbjNqpINiz2KfZhCcsXG4gICAgICAgICAgICB5eTogJyVkINiz2KfZhCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFV6YmVrIExhdGluIFt1ei1sYXRuXVxuLy8hIGF1dGhvciA6IFJhc3VsYmVrIE1pcnpheWV2IDogZ2l0aHViLmNvbS9SYXN1bGJlZWVrXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdXpMYXRuID0gbW9tZW50LmRlZmluZUxvY2FsZSgndXotbGF0bicsIHtcbiAgICAgICAgbW9udGhzOiAnWWFudmFyX0ZldnJhbF9NYXJ0X0FwcmVsX01heV9JeXVuX0l5dWxfQXZndXN0X1NlbnRhYnJfT2t0YWJyX05veWFicl9EZWthYnInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnWWFuX0Zldl9NYXJfQXByX01heV9JeXVuX0l5dWxfQXZnX1Nlbl9Pa3RfTm95X0Rlaycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnWWFrc2hhbmJhX0R1c2hhbmJhX1Nlc2hhbmJhX0Nob3JzaGFuYmFfUGF5c2hhbmJhX0p1bWFfU2hhbmJhJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdZYWtfRHVzaF9TZXNoX0Nob3JfUGF5X0p1bV9TaGFuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1lhX0R1X1NlX0Nob19QYV9KdV9TaGEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ0QgTU1NTSBZWVlZLCBkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQnVndW4gc29hdF0gTFQgW2RhXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0VydGFnYV0gTFQgW2RhXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2t1bmkgc29hdF0gTFQgW2RhXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0tlY2hhIHNvYXRdIExUIFtkYV0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6IFwiW08ndGdhbl0gZGRkZCBba3VuaSBzb2F0XSBMVCBbZGFdXCIsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ1lhcWluICVzIGljaGlkYScsXG4gICAgICAgICAgICBwYXN0OiAnQmlyIG5lY2hhICVzIG9sZGluJyxcbiAgICAgICAgICAgIHM6ICdzb25peWEnLFxuICAgICAgICAgICAgc3M6ICclZCBzb25peWEnLFxuICAgICAgICAgICAgbTogJ2JpciBkYXFpcWEnLFxuICAgICAgICAgICAgbW06ICclZCBkYXFpcWEnLFxuICAgICAgICAgICAgaDogJ2JpciBzb2F0JyxcbiAgICAgICAgICAgIGhoOiAnJWQgc29hdCcsXG4gICAgICAgICAgICBkOiAnYmlyIGt1bicsXG4gICAgICAgICAgICBkZDogJyVkIGt1bicsXG4gICAgICAgICAgICBNOiAnYmlyIG95JyxcbiAgICAgICAgICAgIE1NOiAnJWQgb3knLFxuICAgICAgICAgICAgeTogJ2JpciB5aWwnLFxuICAgICAgICAgICAgeXk6ICclZCB5aWwnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdXpMYXRuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFV6YmVrIFt1el1cbi8vISBhdXRob3IgOiBTYXJkb3IgTXVtaW5vdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tdW1pbm9mZlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHV6ID0gbW9tZW50LmRlZmluZUxvY2FsZSgndXonLCB7XG4gICAgICAgIG1vbnRoczogJ9GP0L3QstCw0YBf0YTQtdCy0YDQsNC7X9C80LDRgNGCX9Cw0L/RgNC10Ltf0LzQsNC5X9C40Y7QvV/QuNGO0Ltf0LDQstCz0YPRgdGCX9GB0LXQvdGC0Y/QsdGAX9C+0LrRgtGP0LHRgF/QvdC+0Y/QsdGAX9C00LXQutCw0LHRgCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfRj9C90LJf0YTQtdCyX9C80LDRgF/QsNC/0YBf0LzQsNC5X9C40Y7QvV/QuNGO0Ltf0LDQstCzX9GB0LXQvV/QvtC60YJf0L3QvtGPX9C00LXQuicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfQr9C60YjQsNC90LHQsF/QlNGD0YjQsNC90LHQsF/QodC10YjQsNC90LHQsF/Qp9C+0YDRiNCw0L3QsdCwX9Cf0LDQudGI0LDQvdCx0LBf0JbRg9C80LBf0KjQsNC90LHQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9Cv0LrRiF/QlNGD0Yhf0KHQtdGIX9Cn0L7RgF/Qn9Cw0Llf0JbRg9C8X9Co0LDQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQr9C6X9CU0YNf0KHQtV/Qp9C+X9Cf0LBf0JbRg1/QqNCwJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdEIE1NTU0gWVlZWSwgZGRkZCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9CR0YPQs9GD0L0g0YHQvtCw0YJdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Ct0YDRgtCw0LPQsF0gTFQgW9C00LBdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb0LrRg9C90Lgg0YHQvtCw0YJdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9Ca0LXRh9CwINGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb0KPRgtCz0LDQvV0gZGRkZCBb0LrRg9C90Lgg0YHQvtCw0YJdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9Cv0LrQuNC9ICVzINC40YfQuNC00LAnLFxuICAgICAgICAgICAgcGFzdDogJ9CR0LjRgCDQvdC10YfQsCAlcyDQvtC70LTQuNC9JyxcbiAgICAgICAgICAgIHM6ICfRhNGD0YDRgdCw0YInLFxuICAgICAgICAgICAgc3M6ICclZCDRhNGD0YDRgdCw0YInLFxuICAgICAgICAgICAgbTogJ9Cx0LjRgCDQtNCw0LrQuNC60LAnLFxuICAgICAgICAgICAgbW06ICclZCDQtNCw0LrQuNC60LAnLFxuICAgICAgICAgICAgaDogJ9Cx0LjRgCDRgdC+0LDRgicsXG4gICAgICAgICAgICBoaDogJyVkINGB0L7QsNGCJyxcbiAgICAgICAgICAgIGQ6ICfQsdC40YAg0LrRg9C9JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0LrRg9C9JyxcbiAgICAgICAgICAgIE06ICfQsdC40YAg0L7QuScsXG4gICAgICAgICAgICBNTTogJyVkINC+0LknLFxuICAgICAgICAgICAgeTogJ9Cx0LjRgCDQudC40LsnLFxuICAgICAgICAgICAgeXk6ICclZCDQudC40LsnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdXo7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVmlldG5hbWVzZSBbdmldXG4vLyEgYXV0aG9yIDogQmFuZyBOZ3V5ZW4gOiBodHRwczovL2dpdGh1Yi5jb20vYmFuZ25rXG4vLyEgYXV0aG9yIDogQ2hpZW4gS2lyYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGllbmtpcmFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB2aSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3ZpJywge1xuICAgICAgICBtb250aHM6ICd0aMOhbmcgMV90aMOhbmcgMl90aMOhbmcgM190aMOhbmcgNF90aMOhbmcgNV90aMOhbmcgNl90aMOhbmcgN190aMOhbmcgOF90aMOhbmcgOV90aMOhbmcgMTBfdGjDoW5nIDExX3Row6FuZyAxMicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnVGhnIDAxX1RoZyAwMl9UaGcgMDNfVGhnIDA0X1RoZyAwNV9UaGcgMDZfVGhnIDA3X1RoZyAwOF9UaGcgMDlfVGhnIDEwX1RoZyAxMV9UaGcgMTInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdjaOG7pyBuaOG6rXRfdGjhu6kgaGFpX3Ro4bupIGJhX3Ro4bupIHTGsF90aOG7qSBuxINtX3Ro4bupIHPDoXVfdGjhu6kgYuG6o3knLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdDTl9UMl9UM19UNF9UNV9UNl9UNycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdDTl9UMl9UM19UNF9UNV9UNl9UNycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvc2F8Y2gvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL15jaCQvaS50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdzYScgOiAnU0EnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdjaCcgOiAnQ0gnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBbbsSDbV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gW27Eg21dIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBbbsSDbV0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsOiAnREQvTS9ZWVlZJyxcbiAgICAgICAgICAgIGxsOiAnRCBNTU0gWVlZWScsXG4gICAgICAgICAgICBsbGw6ICdEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIEQgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIw7RtIG5heSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW05nw6B5IG1haSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3R14bqnbiB04bubaSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0jDtG0gcXVhIGzDumNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbdHXhuqduIHRyxrDhu5tjIGzDumNdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgdOG7m2knLFxuICAgICAgICAgICAgcGFzdDogJyVzIHRyxrDhu5tjJyxcbiAgICAgICAgICAgIHM6ICd2w6BpIGdpw6J5JyxcbiAgICAgICAgICAgIHNzOiAnJWQgZ2nDonknLFxuICAgICAgICAgICAgbTogJ23hu5l0IHBow7p0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgcGjDunQnLFxuICAgICAgICAgICAgaDogJ23hu5l0IGdp4budJyxcbiAgICAgICAgICAgIGhoOiAnJWQgZ2nhu50nLFxuICAgICAgICAgICAgZDogJ23hu5l0IG5nw6B5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgbmfDoHknLFxuICAgICAgICAgICAgdzogJ23hu5l0IHR14bqnbicsXG4gICAgICAgICAgICB3dzogJyVkIHR14bqnbicsXG4gICAgICAgICAgICBNOiAnbeG7mXQgdGjDoW5nJyxcbiAgICAgICAgICAgIE1NOiAnJWQgdGjDoW5nJyxcbiAgICAgICAgICAgIHk6ICdt4buZdCBuxINtJyxcbiAgICAgICAgICAgIHl5OiAnJWQgbsSDbScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2aTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBQc2V1ZG8gW3gtcHNldWRvXVxuLy8hIGF1dGhvciA6IEFuZHJldyBIb29kIDogaHR0cHM6Ly9naXRodWIuY29tL2FuZHJld2hvb2QxMjVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB4UHNldWRvID0gbW9tZW50LmRlZmluZUxvY2FsZSgneC1wc2V1ZG8nLCB7XG4gICAgICAgIG1vbnRoczogJ0p+w6HDscO6w6F+csO9X0Z+w6licsO6fsOhcsO9X35Nw6FyY35oX8OBcH5yw61sX35Nw6HDvV9+SsO6w7HDqX5fSsO6bH7DvV/DgcO6fmfDunN0fl9Tw6lwfnTDqW1ifsOpcl/Dk35jdMOzYn7DqXJfw5F+w7N2w6ltfmLDqXJffkTDqWPDqX5tYsOpcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnSn7DocOxX35Gw6liX35Nw6FyX37DgXByX35Nw6HDvV9+SsO6w7FffkrDumxffsOBw7pnX35Tw6lwX37Dk2N0X37DkcOzdl9+RMOpYycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdTfsO6w7Fkw6F+w71fTcOzfsOxZMOhw71+X1TDusOpfnNkw6HDvX5fV8OpZH7DscOpc2R+w6HDvV9UfmjDunJzfmTDocO9X35GcsOtZH7DocO9X1N+w6F0w7pyfmTDocO9Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTfsO6w7Fffk3Ds8OxX35Uw7rDqV9+V8OpZF9+VGjDul9+RnLDrV9+U8OhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTfsO6X03Ds35fVMO6X35Xw6lfVH5oX0Zyfl9Tw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUfsOzZMOhfsO9IMOhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUfsOzbcOzfnJyw7N+dyDDoXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW8OdfsOpc3R+w6lyZMOhfsO9IMOhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTH7DoXN0XSBkZGRkIFvDoXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnw61+w7EgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMOhfmfDsycsXG4gICAgICAgICAgICBzOiAnw6EgfmbDqXcgfnPDqWPDs37DsWRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc37DqWPDs8OxfmRzJyxcbiAgICAgICAgICAgIG06ICfDoSB+bcOtw7F+w7p0w6knLFxuICAgICAgICAgICAgbW06ICclZCBtfsOtw7HDun50w6lzJyxcbiAgICAgICAgICAgIGg6ICfDoX7DsSBow7N+w7pyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaH7Ds8O6cnMnLFxuICAgICAgICAgICAgZDogJ8OhIH5kw6HDvScsXG4gICAgICAgICAgICBkZDogJyVkIGR+w6HDvXMnLFxuICAgICAgICAgICAgTTogJ8OhIH5tw7PDsX50aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1+w7PDsXR+aHMnLFxuICAgICAgICAgICAgeTogJ8OhIH7DvcOpw6FyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw71+w6nDoXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHRofHN0fG5kfHJkKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHhQc2V1ZG87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogWW9ydWJhIE5pZ2VyaWEgW3lvXVxuLy8hIGF1dGhvciA6IEF0b2xhZ2JlIEFiaXNveWUgOiBodHRwczovL2dpdGh1Yi5jb20vYW5kZWxhLWJhdG9sYWdiZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHlvID0gbW9tZW50LmRlZmluZUxvY2FsZSgneW8nLCB7XG4gICAgICAgIG1vbnRoczogJ1PhurnMgXLhurnMgV9FzIByZcyAbGXMgF/hurhy4bq5zIBuYcyAX0nMgGdiZcyBX0XMgGJpYmlfT8yAa3XMgGR1X0Fn4bq5bW9fT8yAZ3XMgW5fT3dld2Vf4buMzIB3YcyAcmHMgF9CZcyBbHXMgV/hu4zMgHDhurnMgMyAJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ1PhurnMgXJfRcyAcmxf4bq4cm5fScyAZ2JfRcyAYmlfT8yAa3XMgF9BZ+G6uV9PzIBndcyBX093ZV/hu4zMgHdhzIBfQmXMgWxf4buMzIBw4bq5zIDMgCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdBzIBpzIBrdcyBX0FqZcyBX0nMgHPhurnMgWd1bl/hu4xq4buNzIFydcyBX+G7jGrhu43MgWLhu41f4bq4dGnMgF9BzIBiYcyBbeG6ucyBdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdBzIBpzIBrX0FqZcyBX0nMgHPhurnMgV/hu4xqcl/hu4xqYl/hurh0acyAX0HMgGJhzIEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnQcyAacyAX0FqX0nMgHNf4buMcl/hu4xiX+G6uHRfQcyAYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbT8yAbmnMgCBuaV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vhu4zMgGxhIG5pXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogXCJkZGRkIFvhu4xz4bq5zIAgdG/MgW4nYuG7jV0gW25pXSBMVFwiLFxuICAgICAgICAgICAgbGFzdERheTogJ1tBzIBuYSBuaV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvhu4xz4bq5zIAgdG/MgWzhu43MgV0gW25pXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ25pzIEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGvhu41qYcyBJyxcbiAgICAgICAgICAgIHM6ICdpzIBz4bq5anXMgSBhYXlhzIEgZGllJyxcbiAgICAgICAgICAgIHNzOiAnYWF5YcyBICVkJyxcbiAgICAgICAgICAgIG06ICdpzIBz4bq5anXMgSBrYW4nLFxuICAgICAgICAgICAgbW06ICdpzIBz4bq5anXMgSAlZCcsXG4gICAgICAgICAgICBoOiAnd2HMgWthdGkga2FuJyxcbiAgICAgICAgICAgIGhoOiAnd2HMgWthdGkgJWQnLFxuICAgICAgICAgICAgZDogJ+G7jWrhu43MgSBrYW4nLFxuICAgICAgICAgICAgZGQ6ICfhu41q4buNzIEgJWQnLFxuICAgICAgICAgICAgTTogJ29zdcyAIGthbicsXG4gICAgICAgICAgICBNTTogJ29zdcyAICVkJyxcbiAgICAgICAgICAgIHk6ICfhu41kdcyBbiBrYW4nLFxuICAgICAgICAgICAgeXk6ICfhu41kdcyBbiAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC/hu41q4buNzIFcXHNcXGR7MSwyfS8sXG4gICAgICAgIG9yZGluYWw6ICfhu41q4buNzIEgJWQnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4geW87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2hpbmVzZSAoQ2hpbmEpIFt6aC1jbl1cbi8vISBhdXRob3IgOiBzdXVwaWMgOiBodHRwczovL2dpdGh1Yi5jb20vc3V1cGljXG4vLyEgYXV0aG9yIDogWmVubyBaZW5nIDogaHR0cHM6Ly9naXRodWIuY29tL3plbm96ZW5nXG4vLyEgYXV0aG9yIDogdXUxMDkgOiBodHRwczovL2dpdGh1Yi5jb20vdXUxMDlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB6aENuID0gbW9tZW50LmRlZmluZUxvY2FsZSgnemgtY24nLCB7XG4gICAgICAgIG1vbnRoczogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+WRqOaXpV/lkajkuIBf5ZGo5LqMX+WRqOS4iV/lkajlm5tf5ZGo5LqUX+WRqOWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpUFo54K5bW3liIYnLFxuICAgICAgICAgICAgTExMTDogJ1lZWVnlubRN5pyIROaXpWRkZGRBaOeCuW1t5YiGJyxcbiAgICAgICAgICAgIGw6ICdZWVlZL00vRCcsXG4gICAgICAgICAgICBsbDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5YeM5pmofOaXqeS4inzkuIrljYh85Lit5Y2IfOS4i+WNiHzmmZrkuIovLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICflh4zmmagnIHx8IG1lcmlkaWVtID09PSAn5pep5LiKJyB8fCBtZXJpZGllbSA9PT0gJ+S4iuWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuIvljYgnIHx8IG1lcmlkaWVtID09PSAn5pma5LiKJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICfkuK3ljYgnXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgdmFyIGhtID0gaG91ciAqIDEwMCArIG1pbnV0ZTtcbiAgICAgICAgICAgIGlmIChobSA8IDYwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5YeM5pmoJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCA5MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aXqeS4iic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTEzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiK5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMjMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuK3ljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDE4MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4i+WNiCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pma5LiKJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb5LuK5aSpXUxUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb5piO5aSpXUxUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdy53ZWVrKCkgIT09IHRoaXMud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+S4i11kZGRMVCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5pysXWRkZExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1vmmKjlpKldTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53ZWVrKCkgIT09IG5vdy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5LiKXWRkZExUJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vmnKxdZGRkTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o5pelfOaciHzlkagpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfmnIgnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+WRqCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+WQjicsXG4gICAgICAgICAgICBwYXN0OiAnJXPliY0nLFxuICAgICAgICAgICAgczogJ+WHoOenkicsXG4gICAgICAgICAgICBzczogJyVkIOenkicsXG4gICAgICAgICAgICBtOiAnMSDliIbpkp8nLFxuICAgICAgICAgICAgbW06ICclZCDliIbpkp8nLFxuICAgICAgICAgICAgaDogJzEg5bCP5pe2JyxcbiAgICAgICAgICAgIGhoOiAnJWQg5bCP5pe2JyxcbiAgICAgICAgICAgIGQ6ICcxIOWkqScsXG4gICAgICAgICAgICBkZDogJyVkIOWkqScsXG4gICAgICAgICAgICB3OiAnMSDlkagnLFxuICAgICAgICAgICAgd3c6ICclZCDlkagnLFxuICAgICAgICAgICAgTTogJzEg5Liq5pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg5Liq5pyIJyxcbiAgICAgICAgICAgIHk6ICcxIOW5tCcsXG4gICAgICAgICAgICB5eTogJyVkIOW5tCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIC8vIEdCL1QgNzQwOC0xOTk044CK5pWw5o2u5YWD5ZKM5Lqk5o2i5qC85byPwrfkv6Hmga/kuqTmjaLCt+aXpeacn+WSjOaXtumXtOihqOekuuazleOAi+S4jklTTyA4NjAxOjE5ODjnrYnmlYhcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB6aENuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENoaW5lc2UgKEhvbmcgS29uZykgW3poLWhrXVxuLy8hIGF1dGhvciA6IEJlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZW4tbGluXG4vLyEgYXV0aG9yIDogQ2hyaXMgTGFtIDogaHR0cHM6Ly9naXRodWIuY29tL2hlaGFjaHJpc1xuLy8hIGF1dGhvciA6IEtvbnN0YW50aW4gOiBodHRwczovL2dpdGh1Yi5jb20vc2tmZFxuLy8hIGF1dGhvciA6IEFudGhvbnkgOiBodHRwczovL2dpdGh1Yi5jb20vYW50aG9ueWxhdVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHpoSGsgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd6aC1oaycsIHtcbiAgICAgICAgbW9udGhzOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn5pif5pyf5pelX+aYn+acn+S4gF/mmJ/mnJ/kuoxf5pif5pyf5LiJX+aYn+acn+Wbm1/mmJ/mnJ/kupRf5pif5pyf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn6YCx5pelX+mAseS4gF/pgLHkuoxf6YCx5LiJX+mAseWbm1/pgLHkupRf6YCx5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+aXpV/kuIBf5LqMX+S4iV/lm5tf5LqUX+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdZWVlZL00vRCcsXG4gICAgICAgICAgICBsbDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5YeM5pmofOaXqeS4inzkuIrljYh85Lit5Y2IfOS4i+WNiHzmmZrkuIovLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICflh4zmmagnIHx8IG1lcmlkaWVtID09PSAn5pep5LiKJyB8fCBtZXJpZGllbSA9PT0gJ+S4iuWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuK3ljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WHjOaZqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfml6nkuIonO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4iuWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtID09PSAxMjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuK3ljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDE4MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4i+WNiCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pma5LiKJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb5LuK5aSpXUxUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb5piO5aSpXUxUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+S4i11kZGRkTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vmmKjlpKldTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb5LiKXWRkZGRMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o5pelfOaciHzpgLEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfmnIgnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+mAsSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+W+jCcsXG4gICAgICAgICAgICBwYXN0OiAnJXPliY0nLFxuICAgICAgICAgICAgczogJ+W5vuenkicsXG4gICAgICAgICAgICBzczogJyVkIOenkicsXG4gICAgICAgICAgICBtOiAnMSDliIbpkJgnLFxuICAgICAgICAgICAgbW06ICclZCDliIbpkJgnLFxuICAgICAgICAgICAgaDogJzEg5bCP5pmCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg5bCP5pmCJyxcbiAgICAgICAgICAgIGQ6ICcxIOWkqScsXG4gICAgICAgICAgICBkZDogJyVkIOWkqScsXG4gICAgICAgICAgICBNOiAnMSDlgIvmnIgnLFxuICAgICAgICAgICAgTU06ICclZCDlgIvmnIgnLFxuICAgICAgICAgICAgeTogJzEg5bm0JyxcbiAgICAgICAgICAgIHl5OiAnJWQg5bm0JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB6aEhrO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENoaW5lc2UgKE1hY2F1KSBbemgtbW9dXG4vLyEgYXV0aG9yIDogQmVuIDogaHR0cHM6Ly9naXRodWIuY29tL2Jlbi1saW5cbi8vISBhdXRob3IgOiBDaHJpcyBMYW0gOiBodHRwczovL2dpdGh1Yi5jb20vaGVoYWNocmlzXG4vLyEgYXV0aG9yIDogVGFuIFl1YW5ob25nIDogaHR0cHM6Ly9naXRodWIuY29tL2xlMHRhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHpoTW8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd6aC1tbycsIHtcbiAgICAgICAgbW9udGhzOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn5pif5pyf5pelX+aYn+acn+S4gF/mmJ/mnJ/kuoxf5pif5pyf5LiJX+aYn+acn+Wbm1/mmJ/mnJ/kupRf5pif5pyf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn6YCx5pelX+mAseS4gF/pgLHkuoxf6YCx5LiJX+mAseWbm1/pgLHkupRf6YCx5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+aXpV/kuIBf5LqMX+S4iV/lm5tf5LqUX+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdEL00vWVlZWScsXG4gICAgICAgICAgICBsbDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5YeM5pmofOaXqeS4inzkuIrljYh85Lit5Y2IfOS4i+WNiHzmmZrkuIovLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICflh4zmmagnIHx8IG1lcmlkaWVtID09PSAn5pep5LiKJyB8fCBtZXJpZGllbSA9PT0gJ+S4iuWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuK3ljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WHjOaZqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfml6nkuIonO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDExMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4iuWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuWkqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vmmI7lpKldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+S4i11kZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5aSpXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vkuIpdZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o5pelfOaciHzpgLEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfmnIgnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+mAsSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+WFpycsXG4gICAgICAgICAgICBwYXN0OiAnJXPliY0nLFxuICAgICAgICAgICAgczogJ+W5vuenkicsXG4gICAgICAgICAgICBzczogJyVkIOenkicsXG4gICAgICAgICAgICBtOiAnMSDliIbpkJgnLFxuICAgICAgICAgICAgbW06ICclZCDliIbpkJgnLFxuICAgICAgICAgICAgaDogJzEg5bCP5pmCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg5bCP5pmCJyxcbiAgICAgICAgICAgIGQ6ICcxIOWkqScsXG4gICAgICAgICAgICBkZDogJyVkIOWkqScsXG4gICAgICAgICAgICBNOiAnMSDlgIvmnIgnLFxuICAgICAgICAgICAgTU06ICclZCDlgIvmnIgnLFxuICAgICAgICAgICAgeTogJzEg5bm0JyxcbiAgICAgICAgICAgIHl5OiAnJWQg5bm0JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB6aE1vO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENoaW5lc2UgKFRhaXdhbikgW3poLXR3XVxuLy8hIGF1dGhvciA6IEJlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZW4tbGluXG4vLyEgYXV0aG9yIDogQ2hyaXMgTGFtIDogaHR0cHM6Ly9naXRodWIuY29tL2hlaGFjaHJpc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHpoVHcgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd6aC10dycsIHtcbiAgICAgICAgbW9udGhzOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn5pif5pyf5pelX+aYn+acn+S4gF/mmJ/mnJ/kuoxf5pif5pyf5LiJX+aYn+acn+Wbm1/mmJ/mnJ/kupRf5pif5pyf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn6YCx5pelX+mAseS4gF/pgLHkuoxf6YCx5LiJX+mAseWbm1/pgLHkupRf6YCx5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+aXpV/kuIBf5LqMX+S4iV/lm5tf5LqUX+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdZWVlZL00vRCcsXG4gICAgICAgICAgICBsbDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5YeM5pmofOaXqeS4inzkuIrljYh85Lit5Y2IfOS4i+WNiHzmmZrkuIovLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICflh4zmmagnIHx8IG1lcmlkaWVtID09PSAn5pep5LiKJyB8fCBtZXJpZGllbSA9PT0gJ+S4iuWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuK3ljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WHjOaZqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfml6nkuIonO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDExMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4iuWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuWkqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vmmI7lpKldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+S4i11kZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5aSpXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vkuIpdZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o5pelfOaciHzpgLEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfmnIgnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+mAsSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+W+jCcsXG4gICAgICAgICAgICBwYXN0OiAnJXPliY0nLFxuICAgICAgICAgICAgczogJ+W5vuenkicsXG4gICAgICAgICAgICBzczogJyVkIOenkicsXG4gICAgICAgICAgICBtOiAnMSDliIbpkJgnLFxuICAgICAgICAgICAgbW06ICclZCDliIbpkJgnLFxuICAgICAgICAgICAgaDogJzEg5bCP5pmCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg5bCP5pmCJyxcbiAgICAgICAgICAgIGQ6ICcxIOWkqScsXG4gICAgICAgICAgICBkZDogJyVkIOWkqScsXG4gICAgICAgICAgICBNOiAnMSDlgIvmnIgnLFxuICAgICAgICAgICAgTU06ICclZCDlgIvmnIgnLFxuICAgICAgICAgICAgeTogJzEg5bm0JyxcbiAgICAgICAgICAgIHl5OiAnJWQg5bm0JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB6aFR3O1xuXG59KSkpO1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2FmXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hZi5qc1wiLFxuXHRcIi4vYWYuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FmLmpzXCIsXG5cdFwiLi9hclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIuanNcIixcblx0XCIuL2FyLWR6XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1kei5qc1wiLFxuXHRcIi4vYXItZHouanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWR6LmpzXCIsXG5cdFwiLi9hci1rd1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIta3cuanNcIixcblx0XCIuL2FyLWt3LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1rdy5qc1wiLFxuXHRcIi4vYXItbHlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWx5LmpzXCIsXG5cdFwiLi9hci1seS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItbHkuanNcIixcblx0XCIuL2FyLW1hXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1tYS5qc1wiLFxuXHRcIi4vYXItbWEuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLW1hLmpzXCIsXG5cdFwiLi9hci1wc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItcHMuanNcIixcblx0XCIuL2FyLXBzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1wcy5qc1wiLFxuXHRcIi4vYXItc2FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXNhLmpzXCIsXG5cdFwiLi9hci1zYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItc2EuanNcIixcblx0XCIuL2FyLXRuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci10bi5qc1wiLFxuXHRcIi4vYXItdG4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXRuLmpzXCIsXG5cdFwiLi9hci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIuanNcIixcblx0XCIuL2F6XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hei5qc1wiLFxuXHRcIi4vYXouanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2F6LmpzXCIsXG5cdFwiLi9iZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmUuanNcIixcblx0XCIuL2JlLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iZS5qc1wiLFxuXHRcIi4vYmdcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JnLmpzXCIsXG5cdFwiLi9iZy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmcuanNcIixcblx0XCIuL2JtXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibS5qc1wiLFxuXHRcIi4vYm0uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JtLmpzXCIsXG5cdFwiLi9iblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4uanNcIixcblx0XCIuL2JuLWJkXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibi1iZC5qc1wiLFxuXHRcIi4vYm4tYmQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLWJkLmpzXCIsXG5cdFwiLi9ibi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4uanNcIixcblx0XCIuL2JvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iby5qc1wiLFxuXHRcIi4vYm8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JvLmpzXCIsXG5cdFwiLi9iclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYnIuanNcIixcblx0XCIuL2JyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ici5qc1wiLFxuXHRcIi4vYnNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JzLmpzXCIsXG5cdFwiLi9icy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYnMuanNcIixcblx0XCIuL2NhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jYS5qc1wiLFxuXHRcIi4vY2EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2NhLmpzXCIsXG5cdFwiLi9jc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3MuanNcIixcblx0XCIuL2NzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jcy5qc1wiLFxuXHRcIi4vY3ZcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2N2LmpzXCIsXG5cdFwiLi9jdi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3YuanNcIixcblx0XCIuL2N5XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jeS5qc1wiLFxuXHRcIi4vY3kuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2N5LmpzXCIsXG5cdFwiLi9kYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGEuanNcIixcblx0XCIuL2RhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kYS5qc1wiLFxuXHRcIi4vZGVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLmpzXCIsXG5cdFwiLi9kZS1hdFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtYXQuanNcIixcblx0XCIuL2RlLWF0LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS1hdC5qc1wiLFxuXHRcIi4vZGUtY2hcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWNoLmpzXCIsXG5cdFwiLi9kZS1jaC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtY2guanNcIixcblx0XCIuL2RlLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS5qc1wiLFxuXHRcIi4vZHZcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2R2LmpzXCIsXG5cdFwiLi9kdi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZHYuanNcIixcblx0XCIuL2VsXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbC5qc1wiLFxuXHRcIi4vZWwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VsLmpzXCIsXG5cdFwiLi9lbi1hdVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tYXUuanNcIixcblx0XCIuL2VuLWF1LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1hdS5qc1wiLFxuXHRcIi4vZW4tY2FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWNhLmpzXCIsXG5cdFwiLi9lbi1jYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tY2EuanNcIixcblx0XCIuL2VuLWdiXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1nYi5qc1wiLFxuXHRcIi4vZW4tZ2IuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWdiLmpzXCIsXG5cdFwiLi9lbi1pZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWUuanNcIixcblx0XCIuL2VuLWllLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pZS5qc1wiLFxuXHRcIi4vZW4taWxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWlsLmpzXCIsXG5cdFwiLi9lbi1pbC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWwuanNcIixcblx0XCIuL2VuLWluXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbi5qc1wiLFxuXHRcIi4vZW4taW4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWluLmpzXCIsXG5cdFwiLi9lbi1uelwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tbnouanNcIixcblx0XCIuL2VuLW56LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1uei5qc1wiLFxuXHRcIi4vZW4tc2dcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLXNnLmpzXCIsXG5cdFwiLi9lbi1zZy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tc2cuanNcIixcblx0XCIuL2VvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lby5qc1wiLFxuXHRcIi4vZW8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VvLmpzXCIsXG5cdFwiLi9lc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMuanNcIixcblx0XCIuL2VzLWRvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy1kby5qc1wiLFxuXHRcIi4vZXMtZG8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLWRvLmpzXCIsXG5cdFwiLi9lcy1teFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtbXguanNcIixcblx0XCIuL2VzLW14LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy1teC5qc1wiLFxuXHRcIi4vZXMtdXNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLXVzLmpzXCIsXG5cdFwiLi9lcy11cy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtdXMuanNcIixcblx0XCIuL2VzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy5qc1wiLFxuXHRcIi4vZXRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2V0LmpzXCIsXG5cdFwiLi9ldC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXQuanNcIixcblx0XCIuL2V1XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldS5qc1wiLFxuXHRcIi4vZXUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2V1LmpzXCIsXG5cdFwiLi9mYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmEuanNcIixcblx0XCIuL2ZhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mYS5qc1wiLFxuXHRcIi4vZmlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZpLmpzXCIsXG5cdFwiLi9maS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmkuanNcIixcblx0XCIuL2ZpbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmlsLmpzXCIsXG5cdFwiLi9maWwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZpbC5qc1wiLFxuXHRcIi4vZm9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZvLmpzXCIsXG5cdFwiLi9mby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZm8uanNcIixcblx0XCIuL2ZyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci5qc1wiLFxuXHRcIi4vZnItY2FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNhLmpzXCIsXG5cdFwiLi9mci1jYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2EuanNcIixcblx0XCIuL2ZyLWNoXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci1jaC5qc1wiLFxuXHRcIi4vZnItY2guanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNoLmpzXCIsXG5cdFwiLi9mci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnIuanNcIixcblx0XCIuL2Z5XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9meS5qc1wiLFxuXHRcIi4vZnkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2Z5LmpzXCIsXG5cdFwiLi9nYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2EuanNcIixcblx0XCIuL2dhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nYS5qc1wiLFxuXHRcIi4vZ2RcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dkLmpzXCIsXG5cdFwiLi9nZC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2QuanNcIixcblx0XCIuL2dsXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nbC5qc1wiLFxuXHRcIi4vZ2wuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dsLmpzXCIsXG5cdFwiLi9nb20tZGV2YVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWRldmEuanNcIixcblx0XCIuL2dvbS1kZXZhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nb20tZGV2YS5qc1wiLFxuXHRcIi4vZ29tLWxhdG5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dvbS1sYXRuLmpzXCIsXG5cdFwiLi9nb20tbGF0bi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWxhdG4uanNcIixcblx0XCIuL2d1XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ndS5qc1wiLFxuXHRcIi4vZ3UuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2d1LmpzXCIsXG5cdFwiLi9oZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGUuanNcIixcblx0XCIuL2hlLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oZS5qc1wiLFxuXHRcIi4vaGlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hpLmpzXCIsXG5cdFwiLi9oaS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGkuanNcIixcblx0XCIuL2hyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oci5qc1wiLFxuXHRcIi4vaHIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hyLmpzXCIsXG5cdFwiLi9odVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHUuanNcIixcblx0XCIuL2h1LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9odS5qc1wiLFxuXHRcIi4vaHktYW1cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2h5LWFtLmpzXCIsXG5cdFwiLi9oeS1hbS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHktYW0uanNcIixcblx0XCIuL2lkXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pZC5qc1wiLFxuXHRcIi4vaWQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2lkLmpzXCIsXG5cdFwiLi9pc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXMuanNcIixcblx0XCIuL2lzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pcy5qc1wiLFxuXHRcIi4vaXRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LmpzXCIsXG5cdFwiLi9pdC1jaFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXQtY2guanNcIixcblx0XCIuL2l0LWNoLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC1jaC5qc1wiLFxuXHRcIi4vaXQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LmpzXCIsXG5cdFwiLi9qYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvamEuanNcIixcblx0XCIuL2phLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9qYS5qc1wiLFxuXHRcIi4vanZcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2p2LmpzXCIsXG5cdFwiLi9qdi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvanYuanNcIixcblx0XCIuL2thXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rYS5qc1wiLFxuXHRcIi4va2EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2thLmpzXCIsXG5cdFwiLi9ra1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2suanNcIixcblx0XCIuL2trLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ray5qc1wiLFxuXHRcIi4va21cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ttLmpzXCIsXG5cdFwiLi9rbS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva20uanNcIixcblx0XCIuL2tuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbi5qc1wiLFxuXHRcIi4va24uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2tuLmpzXCIsXG5cdFwiLi9rb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva28uanNcIixcblx0XCIuL2tvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rby5qc1wiLFxuXHRcIi4va3VcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t1LmpzXCIsXG5cdFwiLi9rdS1rbXJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t1LWttci5qc1wiLFxuXHRcIi4va3Uta21yLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS1rbXIuanNcIixcblx0XCIuL2t1LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS5qc1wiLFxuXHRcIi4va3lcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t5LmpzXCIsXG5cdFwiLi9reS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3kuanNcIixcblx0XCIuL2xiXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sYi5qc1wiLFxuXHRcIi4vbGIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2xiLmpzXCIsXG5cdFwiLi9sb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbG8uanNcIixcblx0XCIuL2xvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sby5qc1wiLFxuXHRcIi4vbHRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x0LmpzXCIsXG5cdFwiLi9sdC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbHQuanNcIixcblx0XCIuL2x2XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sdi5qc1wiLFxuXHRcIi4vbHYuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x2LmpzXCIsXG5cdFwiLi9tZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWUuanNcIixcblx0XCIuL21lLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tZS5qc1wiLFxuXHRcIi4vbWlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21pLmpzXCIsXG5cdFwiLi9taS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWkuanNcIixcblx0XCIuL21rXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tay5qc1wiLFxuXHRcIi4vbWsuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21rLmpzXCIsXG5cdFwiLi9tbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWwuanNcIixcblx0XCIuL21sLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tbC5qc1wiLFxuXHRcIi4vbW5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21uLmpzXCIsXG5cdFwiLi9tbi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbW4uanNcIixcblx0XCIuL21yXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tci5qc1wiLFxuXHRcIi4vbXIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21yLmpzXCIsXG5cdFwiLi9tc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXMuanNcIixcblx0XCIuL21zLW15XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tcy1teS5qc1wiLFxuXHRcIi4vbXMtbXkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21zLW15LmpzXCIsXG5cdFwiLi9tcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXMuanNcIixcblx0XCIuL210XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tdC5qc1wiLFxuXHRcIi4vbXQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL210LmpzXCIsXG5cdFwiLi9teVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXkuanNcIixcblx0XCIuL215LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9teS5qc1wiLFxuXHRcIi4vbmJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25iLmpzXCIsXG5cdFwiLi9uYi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmIuanNcIixcblx0XCIuL25lXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9uZS5qc1wiLFxuXHRcIi4vbmUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25lLmpzXCIsXG5cdFwiLi9ubFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmwuanNcIixcblx0XCIuL25sLWJlXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC1iZS5qc1wiLFxuXHRcIi4vbmwtYmUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25sLWJlLmpzXCIsXG5cdFwiLi9ubC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmwuanNcIixcblx0XCIuL25uXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubi5qc1wiLFxuXHRcIi4vbm4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25uLmpzXCIsXG5cdFwiLi9vYy1sbmNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL29jLWxuYy5qc1wiLFxuXHRcIi4vb2MtbG5jLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9vYy1sbmMuanNcIixcblx0XCIuL3BhLWluXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wYS1pbi5qc1wiLFxuXHRcIi4vcGEtaW4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3BhLWluLmpzXCIsXG5cdFwiLi9wbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcGwuanNcIixcblx0XCIuL3BsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wbC5qc1wiLFxuXHRcIi4vcHRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3B0LmpzXCIsXG5cdFwiLi9wdC1iclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcHQtYnIuanNcIixcblx0XCIuL3B0LWJyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wdC1ici5qc1wiLFxuXHRcIi4vcHQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3B0LmpzXCIsXG5cdFwiLi9yb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcm8uanNcIixcblx0XCIuL3JvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9yby5qc1wiLFxuXHRcIi4vcnVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3J1LmpzXCIsXG5cdFwiLi9ydS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcnUuanNcIixcblx0XCIuL3NkXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZC5qc1wiLFxuXHRcIi4vc2QuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NkLmpzXCIsXG5cdFwiLi9zZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2UuanNcIixcblx0XCIuL3NlLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZS5qc1wiLFxuXHRcIi4vc2lcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NpLmpzXCIsXG5cdFwiLi9zaS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2kuanNcIixcblx0XCIuL3NrXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zay5qc1wiLFxuXHRcIi4vc2suanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NrLmpzXCIsXG5cdFwiLi9zbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2wuanNcIixcblx0XCIuL3NsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zbC5qc1wiLFxuXHRcIi4vc3FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NxLmpzXCIsXG5cdFwiLi9zcS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3EuanNcIixcblx0XCIuL3NyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zci5qc1wiLFxuXHRcIi4vc3ItY3lybFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3ItY3lybC5qc1wiLFxuXHRcIi4vc3ItY3lybC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3ItY3lybC5qc1wiLFxuXHRcIi4vc3IuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NyLmpzXCIsXG5cdFwiLi9zc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3MuanNcIixcblx0XCIuL3NzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zcy5qc1wiLFxuXHRcIi4vc3ZcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N2LmpzXCIsXG5cdFwiLi9zdi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3YuanNcIixcblx0XCIuL3N3XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zdy5qc1wiLFxuXHRcIi4vc3cuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N3LmpzXCIsXG5cdFwiLi90YVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGEuanNcIixcblx0XCIuL3RhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90YS5qc1wiLFxuXHRcIi4vdGVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RlLmpzXCIsXG5cdFwiLi90ZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGUuanNcIixcblx0XCIuL3RldFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGV0LmpzXCIsXG5cdFwiLi90ZXQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RldC5qc1wiLFxuXHRcIi4vdGdcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RnLmpzXCIsXG5cdFwiLi90Zy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGcuanNcIixcblx0XCIuL3RoXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90aC5qc1wiLFxuXHRcIi4vdGguanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RoLmpzXCIsXG5cdFwiLi90a1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGsuanNcIixcblx0XCIuL3RrLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ay5qc1wiLFxuXHRcIi4vdGwtcGhcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsLXBoLmpzXCIsXG5cdFwiLi90bC1waC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGwtcGguanNcIixcblx0XCIuL3RsaFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGxoLmpzXCIsXG5cdFwiLi90bGguanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsaC5qc1wiLFxuXHRcIi4vdHJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RyLmpzXCIsXG5cdFwiLi90ci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHIuanNcIixcblx0XCIuL3R6bFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHpsLmpzXCIsXG5cdFwiLi90emwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bC5qc1wiLFxuXHRcIi4vdHptXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90em0uanNcIixcblx0XCIuL3R6bS1sYXRuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90em0tbGF0bi5qc1wiLFxuXHRcIi4vdHptLWxhdG4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bS1sYXRuLmpzXCIsXG5cdFwiLi90em0uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bS5qc1wiLFxuXHRcIi4vdWctY25cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VnLWNuLmpzXCIsXG5cdFwiLi91Zy1jbi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdWctY24uanNcIixcblx0XCIuL3VrXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ay5qc1wiLFxuXHRcIi4vdWsuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VrLmpzXCIsXG5cdFwiLi91clwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXIuanNcIixcblx0XCIuL3VyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ci5qc1wiLFxuXHRcIi4vdXpcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3V6LmpzXCIsXG5cdFwiLi91ei1sYXRuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ei1sYXRuLmpzXCIsXG5cdFwiLi91ei1sYXRuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ei1sYXRuLmpzXCIsXG5cdFwiLi91ei5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXouanNcIixcblx0XCIuL3ZpXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS92aS5qc1wiLFxuXHRcIi4vdmkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3ZpLmpzXCIsXG5cdFwiLi94LXBzZXVkb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUveC1wc2V1ZG8uanNcIixcblx0XCIuL3gtcHNldWRvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS94LXBzZXVkby5qc1wiLFxuXHRcIi4veW9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3lvLmpzXCIsXG5cdFwiLi95by5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUveW8uanNcIixcblx0XCIuL3poLWNuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1jbi5qc1wiLFxuXHRcIi4vemgtY24uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLWNuLmpzXCIsXG5cdFwiLi96aC1oa1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtaGsuanNcIixcblx0XCIuL3poLWhrLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1oay5qc1wiLFxuXHRcIi4vemgtbW9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLW1vLmpzXCIsXG5cdFwiLi96aC1tby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtbW8uanNcIixcblx0XCIuL3poLXR3XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC10dy5qc1wiLFxuXHRcIi4vemgtdHcuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLXR3LmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKiRcIjsiLCIvLyEgbW9tZW50LmpzXG4vLyEgdmVyc2lvbiA6IDIuMzAuMVxuLy8hIGF1dGhvcnMgOiBUaW0gV29vZCwgSXNrcmVuIENoZXJuZXYsIE1vbWVudC5qcyBjb250cmlidXRvcnNcbi8vISBsaWNlbnNlIDogTUlUXG4vLyEgbW9tZW50anMuY29tXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIGdsb2JhbC5tb21lbnQgPSBmYWN0b3J5KClcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGhvb2tDYWxsYmFjaztcblxuICAgIGZ1bmN0aW9uIGhvb2tzKCkge1xuICAgICAgICByZXR1cm4gaG9va0NhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBkb25lIHRvIHJlZ2lzdGVyIHRoZSBtZXRob2QgY2FsbGVkIHdpdGggbW9tZW50KClcbiAgICAvLyB3aXRob3V0IGNyZWF0aW5nIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAgICBmdW5jdGlvbiBzZXRIb29rQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICAgICAgaG9va0NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBcnJheShpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBBcnJheSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgQXJyYXldJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gICAgICAgIC8vIElFOCB3aWxsIHRyZWF0IHVuZGVmaW5lZCBhbmQgbnVsbCBhcyBvYmplY3QgaWYgaXQgd2Fzbid0IGZvclxuICAgICAgICAvLyBpbnB1dCAhPSBudWxsXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpbnB1dCAhPSBudWxsICYmXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBPYmplY3RdJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc093blByb3AoYSwgYikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIGIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT2JqZWN0RW1wdHkob2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcykge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGs7XG4gICAgICAgICAgICBmb3IgKGsgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3Aob2JqLCBrKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT09IHZvaWQgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc051bWJlcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RhdGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRGF0ZV0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFwKGFyciwgZm4pIHtcbiAgICAgICAgdmFyIHJlcyA9IFtdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGFyckxlbiA9IGFyci5sZW5ndGg7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnJMZW47ICsraSkge1xuICAgICAgICAgICAgcmVzLnB1c2goZm4oYXJyW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmQoYSwgYikge1xuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGIsIGkpKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndG9TdHJpbmcnKSkge1xuICAgICAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndmFsdWVPZicpKSB7XG4gICAgICAgICAgICBhLnZhbHVlT2YgPSBiLnZhbHVlT2Y7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIHRydWUpLnV0YygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmF1bHRQYXJzaW5nRmxhZ3MoKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZGVlcCBjbG9uZSB0aGlzIG9iamVjdC5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVtcHR5OiBmYWxzZSxcbiAgICAgICAgICAgIHVudXNlZFRva2VuczogW10sXG4gICAgICAgICAgICB1bnVzZWRJbnB1dDogW10sXG4gICAgICAgICAgICBvdmVyZmxvdzogLTIsXG4gICAgICAgICAgICBjaGFyc0xlZnRPdmVyOiAwLFxuICAgICAgICAgICAgbnVsbElucHV0OiBmYWxzZSxcbiAgICAgICAgICAgIGludmFsaWRFcmE6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkTW9udGg6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkRm9ybWF0OiBmYWxzZSxcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBpc286IGZhbHNlLFxuICAgICAgICAgICAgcGFyc2VkRGF0ZVBhcnRzOiBbXSxcbiAgICAgICAgICAgIGVyYTogbnVsbCxcbiAgICAgICAgICAgIG1lcmlkaWVtOiBudWxsLFxuICAgICAgICAgICAgcmZjMjgyMjogZmFsc2UsXG4gICAgICAgICAgICB3ZWVrZGF5TWlzbWF0Y2g6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcnNpbmdGbGFncyhtKSB7XG4gICAgICAgIGlmIChtLl9wZiA9PSBudWxsKSB7XG4gICAgICAgICAgICBtLl9wZiA9IGRlZmF1bHRQYXJzaW5nRmxhZ3MoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5fcGY7XG4gICAgfVxuXG4gICAgdmFyIHNvbWU7XG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5zb21lKSB7XG4gICAgICAgIHNvbWUgPSBBcnJheS5wcm90b3R5cGUuc29tZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzb21lID0gZnVuY3Rpb24gKGZ1bikge1xuICAgICAgICAgICAgdmFyIHQgPSBPYmplY3QodGhpcyksXG4gICAgICAgICAgICAgICAgbGVuID0gdC5sZW5ndGggPj4+IDAsXG4gICAgICAgICAgICAgICAgaTtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gdCAmJiBmdW4uY2FsbCh0aGlzLCB0W2ldLCBpLCB0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkKG0pIHtcbiAgICAgICAgdmFyIGZsYWdzID0gbnVsbCxcbiAgICAgICAgICAgIHBhcnNlZFBhcnRzID0gZmFsc2UsXG4gICAgICAgICAgICBpc05vd1ZhbGlkID0gbS5fZCAmJiAhaXNOYU4obS5fZC5nZXRUaW1lKCkpO1xuICAgICAgICBpZiAoaXNOb3dWYWxpZCkge1xuICAgICAgICAgICAgZmxhZ3MgPSBnZXRQYXJzaW5nRmxhZ3MobSk7XG4gICAgICAgICAgICBwYXJzZWRQYXJ0cyA9IHNvbWUuY2FsbChmbGFncy5wYXJzZWREYXRlUGFydHMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgIT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaXNOb3dWYWxpZCA9XG4gICAgICAgICAgICAgICAgZmxhZ3Mub3ZlcmZsb3cgPCAwICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRFcmEgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZE1vbnRoICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRXZWVrZGF5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLndlZWtkYXlNaXNtYXRjaCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5udWxsSW5wdXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZEZvcm1hdCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy51c2VySW52YWxpZGF0ZWQgJiZcbiAgICAgICAgICAgICAgICAoIWZsYWdzLm1lcmlkaWVtIHx8IChmbGFncy5tZXJpZGllbSAmJiBwYXJzZWRQYXJ0cykpO1xuICAgICAgICAgICAgaWYgKG0uX3N0cmljdCkge1xuICAgICAgICAgICAgICAgIGlzTm93VmFsaWQgPVxuICAgICAgICAgICAgICAgICAgICBpc05vd1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNoYXJzTGVmdE92ZXIgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MudW51c2VkVG9rZW5zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbiA9PSBudWxsIHx8ICFPYmplY3QuaXNGcm96ZW4obSkpIHtcbiAgICAgICAgICAgIG0uX2lzVmFsaWQgPSBpc05vd1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTm93VmFsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX2lzVmFsaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW52YWxpZChmbGFncykge1xuICAgICAgICB2YXIgbSA9IGNyZWF0ZVVUQyhOYU4pO1xuICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0ZW5kKGdldFBhcnNpbmdGbGFncyhtKSwgZmxhZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLnVzZXJJbnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBQbHVnaW5zIHRoYXQgYWRkIHByb3BlcnRpZXMgc2hvdWxkIGFsc28gYWRkIHRoZSBrZXkgaGVyZSAobnVsbCB2YWx1ZSksXG4gICAgLy8gc28gd2UgY2FuIHByb3Blcmx5IGNsb25lIG91cnNlbHZlcy5cbiAgICB2YXIgbW9tZW50UHJvcGVydGllcyA9IChob29rcy5tb21lbnRQcm9wZXJ0aWVzID0gW10pLFxuICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBjb3B5Q29uZmlnKHRvLCBmcm9tKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIG1vbWVudFByb3BlcnRpZXNMZW4gPSBtb21lbnRQcm9wZXJ0aWVzLmxlbmd0aDtcblxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzQU1vbWVudE9iamVjdCkpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pKSkge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fZikpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2wpKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9zdHJpY3QpKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fdHptKSkge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzVVRDKSkge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9vZmZzZXQpKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fcGYpKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sb2NhbGUpKSB7XG4gICAgICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudFByb3BlcnRpZXNMZW4gPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbW9tZW50UHJvcGVydGllc0xlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvcCA9IG1vbWVudFByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICAgICAgdmFsID0gZnJvbVtwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9bcHJvcF0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH1cblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgICAgICBjb3B5Q29uZmlnKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShjb25maWcuX2QgIT0gbnVsbCA/IGNvbmZpZy5fZC5nZXRUaW1lKCkgOiBOYU4pO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgICAgIC8vIG9iamVjdHMuXG4gICAgICAgIGlmICh1cGRhdGVJblByb2dyZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudChvYmopIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG9iaiBpbnN0YW5jZW9mIE1vbWVudCB8fCAob2JqICE9IG51bGwgJiYgb2JqLl9pc0FNb21lbnRPYmplY3QgIT0gbnVsbClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YXJuKG1zZykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FyblxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRGVwcmVjYXRpb24gd2FybmluZzogJyArIG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGUobXNnLCBmbikge1xuICAgICAgICB2YXIgZmlyc3RUaW1lID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlcihudWxsLCBtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0VGltZSkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBhcmdMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdMZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0gJ1xcblsnICsgaSArICddICc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChhcmd1bWVudHNbMF0sIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnICs9IGtleSArICc6ICcgKyBhcmd1bWVudHNbMF1ba2V5XSArICcsICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnNsaWNlKDAsIC0yKTsgLy8gUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGFuZCBzcGFjZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChhcmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgICAgICBtc2cgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbkFyZ3VtZW50czogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzKS5qb2luKCcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoKS5zdGFja1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSwgZm4pO1xuICAgIH1cblxuICAgIHZhciBkZXByZWNhdGlvbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCBtc2cpIHtcbiAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobmFtZSwgbXNnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlcHJlY2F0aW9uc1tuYW1lXSkge1xuICAgICAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICAgICAgZGVwcmVjYXRpb25zW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9IGZhbHNlO1xuICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodHlwZW9mIEZ1bmN0aW9uICE9PSAndW5kZWZpbmVkJyAmJiBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldChjb25maWcpIHtcbiAgICAgICAgdmFyIHByb3AsIGk7XG4gICAgICAgIGZvciAoaSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGNvbmZpZywgaSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIC8vIExlbmllbnQgb3JkaW5hbCBwYXJzaW5nIGFjY2VwdHMganVzdCBhIG51bWJlciBpbiBhZGRpdGlvbiB0b1xuICAgICAgICAvLyBudW1iZXIgKyAocG9zc2libHkpIHN0dWZmIGNvbWluZyBmcm9tIF9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLlxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICh0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLnNvdXJjZSB8fCB0aGlzLl9vcmRpbmFsUGFyc2Uuc291cmNlKSArXG4gICAgICAgICAgICAgICAgJ3wnICtcbiAgICAgICAgICAgICAgICAvXFxkezEsMn0vLnNvdXJjZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBleHRlbmQoe30sIHBhcmVudENvbmZpZyksXG4gICAgICAgICAgICBwcm9wO1xuICAgICAgICBmb3IgKHByb3AgaW4gY2hpbGRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChwYXJlbnRDb25maWdbcHJvcF0pICYmIGlzT2JqZWN0KGNoaWxkQ29uZmlnW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKHJlc1twcm9wXSwgcGFyZW50Q29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKHJlc1twcm9wXSwgY2hpbGRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRDb25maWdbcHJvcF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSBjaGlsZENvbmZpZ1twcm9wXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVzW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHByb3AgaW4gcGFyZW50Q29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaGFzT3duUHJvcChwYXJlbnRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgIWhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNoYW5nZXMgdG8gcHJvcGVydGllcyBkb24ndCBtb2RpZnkgcGFyZW50IGNvbmZpZ1xuICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGV4dGVuZCh7fSwgcmVzW3Byb3BdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvY2FsZShjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldChjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGtleXM7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMpIHtcbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGtleXMgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgICAgICByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChvYmosIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRDYWxlbmRhciA9IHtcbiAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY2FsZW5kYXIoa2V5LCBtb20sIG5vdykge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XSB8fCB0aGlzLl9jYWxlbmRhclsnc2FtZUVsc2UnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KSA/IG91dHB1dC5jYWxsKG1vbSwgbm93KSA6IG91dHB1dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB6ZXJvRmlsbChudW1iZXIsIHRhcmdldExlbmd0aCwgZm9yY2VTaWduKSB7XG4gICAgICAgIHZhciBhYnNOdW1iZXIgPSAnJyArIE1hdGguYWJzKG51bWJlciksXG4gICAgICAgICAgICB6ZXJvc1RvRmlsbCA9IHRhcmdldExlbmd0aCAtIGFic051bWJlci5sZW5ndGgsXG4gICAgICAgICAgICBzaWduID0gbnVtYmVyID49IDA7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc2lnbiA/IChmb3JjZVNpZ24gPyAnKycgOiAnJykgOiAnLScpICtcbiAgICAgICAgICAgIE1hdGgucG93KDEwLCBNYXRoLm1heCgwLCB6ZXJvc1RvRmlsbCkpLnRvU3RyaW5nKCkuc3Vic3RyKDEpICtcbiAgICAgICAgICAgIGFic051bWJlclxuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXR0aW5nVG9rZW5zID1cbiAgICAgICAgICAgIC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhbSGhdbW0oc3MpP3xNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98V1tvfFddP3xRbz98TnsxLDV9fFlZWVlZWXxZWVlZWXxZWVlZfFlZfHl7Miw0fXx5bz98Z2coZ2dnPyk/fEdHKEdHRz8pP3xlfEV8YXxBfGhoP3xISD98a2s/fG1tP3xzcz98U3sxLDl9fHh8WHx6ej98Wlo/fC4pL2csXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2csXG4gICAgICAgIGZvcm1hdEZ1bmN0aW9ucyA9IHt9LFxuICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9ucyA9IHt9O1xuXG4gICAgLy8gdG9rZW46ICAgICdNJ1xuICAgIC8vIHBhZGRlZDogICBbJ01NJywgMl1cbiAgICAvLyBvcmRpbmFsOiAgJ01vJ1xuICAgIC8vIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7IHRoaXMubW9udGgoKSArIDEgfVxuICAgIGZ1bmN0aW9uIGFkZEZvcm1hdFRva2VuKHRva2VuLCBwYWRkZWQsIG9yZGluYWwsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBmdW5jID0gY2FsbGJhY2s7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmdW5jID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2NhbGxiYWNrXSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZGRlZCkge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbcGFkZGVkWzBdXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gemVyb0ZpbGwoZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBwYWRkZWRbMV0sIHBhZGRlZFsyXSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcmRpbmFsKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1tvcmRpbmFsXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkub3JkaW5hbChcbiAgICAgICAgICAgICAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgICAgICAgICAgICB0b2tlblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQubWF0Y2goL1xcW1tcXHNcXFNdLykpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9cXFxcL2csICcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgICAgIHZhciBhcnJheSA9IGZvcm1hdC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV0pIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSByZW1vdmVGb3JtYXR0aW5nVG9rZW5zKGFycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobW9tKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gJycsXG4gICAgICAgICAgICAgICAgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBpc0Z1bmN0aW9uKGFycmF5W2ldKVxuICAgICAgICAgICAgICAgICAgICA/IGFycmF5W2ldLmNhbGwobW9tLCBmb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgIDogYXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCBkYXRlIHVzaW5nIG5hdGl2ZSBkYXRlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG0ubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxvY2FsZURhdGEoKSk7XG4gICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdID1cbiAgICAgICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdIHx8IG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpO1xuXG4gICAgICAgIHJldHVybiBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XShtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHBhbmRGb3JtYXQoZm9ybWF0LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGkgPSA1O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2VucyhpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5sb25nRGF0ZUZvcm1hdChpbnB1dCkgfHwgaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPj0gMCAmJiBsb2NhbEZvcm1hdHRpbmdUb2tlbnMudGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMsXG4gICAgICAgICAgICAgICAgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICBpIC09IDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQgPSB7XG4gICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgTDogJ01NL0REL1lZWVknLFxuICAgICAgICBMTDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgIExMTDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvbmdEYXRlRm9ybWF0KGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSxcbiAgICAgICAgICAgIGZvcm1hdFVwcGVyID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5LnRvVXBwZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChmb3JtYXQgfHwgIWZvcm1hdFVwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSA9IGZvcm1hdFVwcGVyXG4gICAgICAgICAgICAubWF0Y2goZm9ybWF0dGluZ1Rva2VucylcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHRvaykge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnTU1NTScgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnTU0nIHx8XG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ0REJyB8fFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdkZGRkJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdEludmFsaWREYXRlID0gJ0ludmFsaWQgZGF0ZSc7XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludmFsaWREYXRlO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0T3JkaW5hbCA9ICclZCcsXG4gICAgICAgIGRlZmF1bHREYXlPZk1vbnRoT3JkaW5hbFBhcnNlID0gL1xcZHsxLDJ9LztcblxuICAgIGZ1bmN0aW9uIG9yZGluYWwobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoJyVkJywgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFJlbGF0aXZlVGltZSA9IHtcbiAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICB3OiAnYSB3ZWVrJyxcbiAgICAgICAgd3c6ICclZCB3ZWVrcycsXG4gICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX3JlbGF0aXZlVGltZVtzdHJpbmddO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvdXRwdXQpXG4gICAgICAgICAgICA/IG91dHB1dChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpXG4gICAgICAgICAgICA6IG91dHB1dC5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhc3RGdXR1cmUoZGlmZiwgb3V0cHV0KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbZGlmZiA+IDAgPyAnZnV0dXJlJyA6ICdwYXN0J107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGZvcm1hdCkgPyBmb3JtYXQob3V0cHV0KSA6IGZvcm1hdC5yZXBsYWNlKC8lcy9pLCBvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhbGlhc2VzID0ge1xuICAgICAgICBEOiAnZGF0ZScsXG4gICAgICAgIGRhdGVzOiAnZGF0ZScsXG4gICAgICAgIGRhdGU6ICdkYXRlJyxcbiAgICAgICAgZDogJ2RheScsXG4gICAgICAgIGRheXM6ICdkYXknLFxuICAgICAgICBkYXk6ICdkYXknLFxuICAgICAgICBlOiAnd2Vla2RheScsXG4gICAgICAgIHdlZWtkYXlzOiAnd2Vla2RheScsXG4gICAgICAgIHdlZWtkYXk6ICd3ZWVrZGF5JyxcbiAgICAgICAgRTogJ2lzb1dlZWtkYXknLFxuICAgICAgICBpc293ZWVrZGF5czogJ2lzb1dlZWtkYXknLFxuICAgICAgICBpc293ZWVrZGF5OiAnaXNvV2Vla2RheScsXG4gICAgICAgIERERDogJ2RheU9mWWVhcicsXG4gICAgICAgIGRheW9meWVhcnM6ICdkYXlPZlllYXInLFxuICAgICAgICBkYXlvZnllYXI6ICdkYXlPZlllYXInLFxuICAgICAgICBoOiAnaG91cicsXG4gICAgICAgIGhvdXJzOiAnaG91cicsXG4gICAgICAgIGhvdXI6ICdob3VyJyxcbiAgICAgICAgbXM6ICdtaWxsaXNlY29uZCcsXG4gICAgICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kJyxcbiAgICAgICAgbWlsbGlzZWNvbmQ6ICdtaWxsaXNlY29uZCcsXG4gICAgICAgIG06ICdtaW51dGUnLFxuICAgICAgICBtaW51dGVzOiAnbWludXRlJyxcbiAgICAgICAgbWludXRlOiAnbWludXRlJyxcbiAgICAgICAgTTogJ21vbnRoJyxcbiAgICAgICAgbW9udGhzOiAnbW9udGgnLFxuICAgICAgICBtb250aDogJ21vbnRoJyxcbiAgICAgICAgUTogJ3F1YXJ0ZXInLFxuICAgICAgICBxdWFydGVyczogJ3F1YXJ0ZXInLFxuICAgICAgICBxdWFydGVyOiAncXVhcnRlcicsXG4gICAgICAgIHM6ICdzZWNvbmQnLFxuICAgICAgICBzZWNvbmRzOiAnc2Vjb25kJyxcbiAgICAgICAgc2Vjb25kOiAnc2Vjb25kJyxcbiAgICAgICAgZ2c6ICd3ZWVrWWVhcicsXG4gICAgICAgIHdlZWt5ZWFyczogJ3dlZWtZZWFyJyxcbiAgICAgICAgd2Vla3llYXI6ICd3ZWVrWWVhcicsXG4gICAgICAgIEdHOiAnaXNvV2Vla1llYXInLFxuICAgICAgICBpc293ZWVreWVhcnM6ICdpc29XZWVrWWVhcicsXG4gICAgICAgIGlzb3dlZWt5ZWFyOiAnaXNvV2Vla1llYXInLFxuICAgICAgICB3OiAnd2VlaycsXG4gICAgICAgIHdlZWtzOiAnd2VlaycsXG4gICAgICAgIHdlZWs6ICd3ZWVrJyxcbiAgICAgICAgVzogJ2lzb1dlZWsnLFxuICAgICAgICBpc293ZWVrczogJ2lzb1dlZWsnLFxuICAgICAgICBpc293ZWVrOiAnaXNvV2VlaycsXG4gICAgICAgIHk6ICd5ZWFyJyxcbiAgICAgICAgeWVhcnM6ICd5ZWFyJyxcbiAgICAgICAgeWVhcjogJ3llYXInLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVVbml0cyh1bml0cykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHVuaXRzID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBhbGlhc2VzW3VuaXRzXSB8fCBhbGlhc2VzW3VuaXRzLnRvTG93ZXJDYXNlKCldXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVPYmplY3RVbml0cyhpbnB1dE9iamVjdCkge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0ge30sXG4gICAgICAgICAgICBub3JtYWxpemVkUHJvcCxcbiAgICAgICAgICAgIHByb3A7XG5cbiAgICAgICAgZm9yIChwcm9wIGluIGlucHV0T2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChpbnB1dE9iamVjdCwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvcCA9IG5vcm1hbGl6ZVVuaXRzKHByb3ApO1xuICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkUHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkSW5wdXRbbm9ybWFsaXplZFByb3BdID0gaW5wdXRPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRJbnB1dDtcbiAgICB9XG5cbiAgICB2YXIgcHJpb3JpdGllcyA9IHtcbiAgICAgICAgZGF0ZTogOSxcbiAgICAgICAgZGF5OiAxMSxcbiAgICAgICAgd2Vla2RheTogMTEsXG4gICAgICAgIGlzb1dlZWtkYXk6IDExLFxuICAgICAgICBkYXlPZlllYXI6IDQsXG4gICAgICAgIGhvdXI6IDEzLFxuICAgICAgICBtaWxsaXNlY29uZDogMTYsXG4gICAgICAgIG1pbnV0ZTogMTQsXG4gICAgICAgIG1vbnRoOiA4LFxuICAgICAgICBxdWFydGVyOiA3LFxuICAgICAgICBzZWNvbmQ6IDE1LFxuICAgICAgICB3ZWVrWWVhcjogMSxcbiAgICAgICAgaXNvV2Vla1llYXI6IDEsXG4gICAgICAgIHdlZWs6IDUsXG4gICAgICAgIGlzb1dlZWs6IDUsXG4gICAgICAgIHllYXI6IDEsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdldFByaW9yaXRpemVkVW5pdHModW5pdHNPYmopIHtcbiAgICAgICAgdmFyIHVuaXRzID0gW10sXG4gICAgICAgICAgICB1O1xuICAgICAgICBmb3IgKHUgaW4gdW5pdHNPYmopIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKHVuaXRzT2JqLCB1KSkge1xuICAgICAgICAgICAgICAgIHVuaXRzLnB1c2goeyB1bml0OiB1LCBwcmlvcml0eTogcHJpb3JpdGllc1t1XSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1bml0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdW5pdHM7XG4gICAgfVxuXG4gICAgdmFyIG1hdGNoMSA9IC9cXGQvLCAvLyAgICAgICAwIC0gOVxuICAgICAgICBtYXRjaDIgPSAvXFxkXFxkLywgLy8gICAgICAwMCAtIDk5XG4gICAgICAgIG1hdGNoMyA9IC9cXGR7M30vLCAvLyAgICAgMDAwIC0gOTk5XG4gICAgICAgIG1hdGNoNCA9IC9cXGR7NH0vLCAvLyAgICAwMDAwIC0gOTk5OVxuICAgICAgICBtYXRjaDYgPSAvWystXT9cXGR7Nn0vLCAvLyAtOTk5OTk5IC0gOTk5OTk5XG4gICAgICAgIG1hdGNoMXRvMiA9IC9cXGRcXGQ/LywgLy8gICAgICAgMCAtIDk5XG4gICAgICAgIG1hdGNoM3RvNCA9IC9cXGRcXGRcXGRcXGQ/LywgLy8gICAgIDk5OSAtIDk5OTlcbiAgICAgICAgbWF0Y2g1dG82ID0gL1xcZFxcZFxcZFxcZFxcZFxcZD8vLCAvLyAgIDk5OTk5IC0gOTk5OTk5XG4gICAgICAgIG1hdGNoMXRvMyA9IC9cXGR7MSwzfS8sIC8vICAgICAgIDAgLSA5OTlcbiAgICAgICAgbWF0Y2gxdG80ID0gL1xcZHsxLDR9LywgLy8gICAgICAgMCAtIDk5OTlcbiAgICAgICAgbWF0Y2gxdG82ID0gL1srLV0/XFxkezEsNn0vLCAvLyAtOTk5OTk5IC0gOTk5OTk5XG4gICAgICAgIG1hdGNoVW5zaWduZWQgPSAvXFxkKy8sIC8vICAgICAgIDAgLSBpbmZcbiAgICAgICAgbWF0Y2hTaWduZWQgPSAvWystXT9cXGQrLywgLy8gICAgLWluZiAtIGluZlxuICAgICAgICBtYXRjaE9mZnNldCA9IC9afFsrLV1cXGRcXGQ6P1xcZFxcZC9naSwgLy8gKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgICAgIG1hdGNoU2hvcnRPZmZzZXQgPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy9naSwgLy8gKzAwIC0wMCArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcbiAgICAgICAgbWF0Y2hUaW1lc3RhbXAgPSAvWystXT9cXGQrKFxcLlxcZHsxLDN9KT8vLCAvLyAxMjM0NTY3ODkgMTIzNDU2Nzg5LjEyM1xuICAgICAgICAvLyBhbnkgd29yZCAob3IgdHdvKSBjaGFyYWN0ZXJzIG9yIG51bWJlcnMgaW5jbHVkaW5nIHR3by90aHJlZSB3b3JkIG1vbnRoIGluIGFyYWJpYy5cbiAgICAgICAgLy8gaW5jbHVkZXMgc2NvdHRpc2ggZ2FlbGljIHR3byB3b3JkIGFuZCBoeXBoZW5hdGVkIG1vbnRoc1xuICAgICAgICBtYXRjaFdvcmQgPVxuICAgICAgICAgICAgL1swLTldezAsMjU2fVsnYS16XFx1MDBBMC1cXHUwNUZGXFx1MDcwMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRjA3XFx1RkYxMC1cXHVGRkVGXXsxLDI1Nn18W1xcdTA2MDAtXFx1MDZGRlxcL117MSwyNTZ9KFxccyo/W1xcdTA2MDAtXFx1MDZGRl17MSwyNTZ9KXsxLDJ9L2ksXG4gICAgICAgIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8gPSAvXlsxLTldXFxkPy8sIC8vICAgICAgICAgMS05OVxuICAgICAgICBtYXRjaDF0bzJIYXNaZXJvID0gL14oWzEtOV1cXGR8XFxkKS8sIC8vICAgICAgICAgICAwLTk5XG4gICAgICAgIHJlZ2V4ZXM7XG5cbiAgICByZWdleGVzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRSZWdleFRva2VuKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICAgICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KVxuICAgICAgICAgICAgPyByZWdleFxuICAgICAgICAgICAgOiBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZURhdGEpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpc1N0cmljdCAmJiBzdHJpY3RSZWdleCA/IHN0cmljdFJlZ2V4IDogcmVnZXg7XG4gICAgICAgICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHJlZ2V4ZXMsIHRva2VuKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodW5lc2NhcGVGb3JtYXQodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWdleGVzW3Rva2VuXShjb25maWcuX3N0cmljdCwgY29uZmlnLl9sb2NhbGUpO1xuICAgIH1cblxuICAgIC8vIENvZGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NjE0OTMvaXMtdGhlcmUtYS1yZWdleHAtZXNjYXBlLWZ1bmN0aW9uLWluLWphdmFzY3JpcHRcbiAgICBmdW5jdGlvbiB1bmVzY2FwZUZvcm1hdChzKSB7XG4gICAgICAgIHJldHVybiByZWdleEVzY2FwZShcbiAgICAgICAgICAgIHNcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnXFxcXCcsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAvXFxcXChcXFspfFxcXFwoXFxdKXxcXFsoW15cXF1cXFtdKilcXF18XFxcXCguKS9nLFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAobWF0Y2hlZCwgcDEsIHAyLCBwMywgcDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwMSB8fCBwMiB8fCBwMyB8fCBwNDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWdleEVzY2FwZShzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0Zsb29yKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgLy8gLTAgLT4gMFxuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpIHx8IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbnQoYXJndW1lbnRGb3JDb2VyY2lvbikge1xuICAgICAgICB2YXIgY29lcmNlZE51bWJlciA9ICthcmd1bWVudEZvckNvZXJjaW9uLFxuICAgICAgICAgICAgdmFsdWUgPSAwO1xuXG4gICAgICAgIGlmIChjb2VyY2VkTnVtYmVyICE9PSAwICYmIGlzRmluaXRlKGNvZXJjZWROdW1iZXIpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGFic0Zsb29yKGNvZXJjZWROdW1iZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHZhciB0b2tlbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFBhcnNlVG9rZW4odG9rZW4sIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgZnVuYyA9IGNhbGxiYWNrLFxuICAgICAgICAgICAgdG9rZW5MZW47XG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0b2tlbiA9IFt0b2tlbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTnVtYmVyKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBhcnJheVtjYWxsYmFja10gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRva2VuTGVuID0gdG9rZW4ubGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5MZW47IGkrKykge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuW2ldXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRXZWVrUGFyc2VUb2tlbih0b2tlbiwgY2FsbGJhY2spIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICAgICAgY29uZmlnLl93ID0gY29uZmlnLl93IHx8IHt9O1xuICAgICAgICAgICAgY2FsbGJhY2soaW5wdXQsIGNvbmZpZy5fdywgY29uZmlnLCB0b2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBpbnB1dCwgY29uZmlnKSB7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGhhc093blByb3AodG9rZW5zLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbl0oaW5wdXQsIGNvbmZpZy5fYSwgY29uZmlnLCB0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgIH1cblxuICAgIHZhciBZRUFSID0gMCxcbiAgICAgICAgTU9OVEggPSAxLFxuICAgICAgICBEQVRFID0gMixcbiAgICAgICAgSE9VUiA9IDMsXG4gICAgICAgIE1JTlVURSA9IDQsXG4gICAgICAgIFNFQ09ORCA9IDUsXG4gICAgICAgIE1JTExJU0VDT05EID0gNixcbiAgICAgICAgV0VFSyA9IDcsXG4gICAgICAgIFdFRUtEQVkgPSA4O1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1knLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55ZWFyKCk7XG4gICAgICAgIHJldHVybiB5IDw9IDk5OTkgPyB6ZXJvRmlsbCh5LCA0KSA6ICcrJyArIHk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZJywgNF0sIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsIDVdLCAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVlZJywgNiwgdHJ1ZV0sIDAsICd5ZWFyJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdZJywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVknLCBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVknLCBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVlZJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ1lZWVlZJywgJ1lZWVlZWSddLCBZRUFSKTtcbiAgICBhZGRQYXJzZVRva2VuKCdZWVlZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9XG4gICAgICAgICAgICBpbnB1dC5sZW5ndGggPT09IDIgPyBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCkgOiB0b0ludChpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1knLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgaG9va3MucGFyc2VUd29EaWdpdFllYXIgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRvSW50KGlucHV0KSArICh0b0ludChpbnB1dCkgPiA2OCA/IDE5MDAgOiAyMDAwKTtcbiAgICB9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFllYXIgPSBtYWtlR2V0U2V0KCdGdWxsWWVhcicsIHRydWUpO1xuXG4gICAgZnVuY3Rpb24gZ2V0SXNMZWFwWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXRTZXQodW5pdCwga2VlcFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzZXQkMSh0aGlzLCB1bml0LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIGtlZXBUaW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQobW9tLCB1bml0KSB7XG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkID0gbW9tLl9kLFxuICAgICAgICAgICAgaXNVVEMgPSBtb20uX2lzVVRDO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgICAgICAgY2FzZSAnTWlsbGlzZWNvbmRzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ01pbGxpc2Vjb25kcygpIDogZC5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICAgICAgICAgIGNhc2UgJ1NlY29uZHMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDU2Vjb25kcygpIDogZC5nZXRTZWNvbmRzKCk7XG4gICAgICAgICAgICBjYXNlICdNaW51dGVzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ01pbnV0ZXMoKSA6IGQuZ2V0TWludXRlcygpO1xuICAgICAgICAgICAgY2FzZSAnSG91cnMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDSG91cnMoKSA6IGQuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDRGF0ZSgpIDogZC5nZXREYXRlKCk7XG4gICAgICAgICAgICBjYXNlICdEYXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDRGF5KCkgOiBkLmdldERheSgpO1xuICAgICAgICAgICAgY2FzZSAnTW9udGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDTW9udGgoKSA6IGQuZ2V0TW9udGgoKTtcbiAgICAgICAgICAgIGNhc2UgJ0Z1bGxZZWFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ0Z1bGxZZWFyKCkgOiBkLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBOYU47IC8vIEp1c3QgaW4gY2FzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0JDEobW9tLCB1bml0LCB2YWx1ZSkge1xuICAgICAgICB2YXIgZCwgaXNVVEMsIHllYXIsIG1vbnRoLCBkYXRlO1xuXG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSB8fCBpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGQgPSBtb20uX2Q7XG4gICAgICAgIGlzVVRDID0gbW9tLl9pc1VUQztcblxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ01pbGxpc2Vjb25kcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKGlzVVRDXG4gICAgICAgICAgICAgICAgICAgID8gZC5zZXRVVENNaWxsaXNlY29uZHModmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIDogZC5zZXRNaWxsaXNlY29uZHModmFsdWUpKTtcbiAgICAgICAgICAgIGNhc2UgJ1NlY29uZHMnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChpc1VUQyA/IGQuc2V0VVRDU2Vjb25kcyh2YWx1ZSkgOiBkLnNldFNlY29uZHModmFsdWUpKTtcbiAgICAgICAgICAgIGNhc2UgJ01pbnV0ZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChpc1VUQyA/IGQuc2V0VVRDTWludXRlcyh2YWx1ZSkgOiBkLnNldE1pbnV0ZXModmFsdWUpKTtcbiAgICAgICAgICAgIGNhc2UgJ0hvdXJzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ0hvdXJzKHZhbHVlKSA6IGQuc2V0SG91cnModmFsdWUpKTtcbiAgICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChpc1VUQyA/IGQuc2V0VVRDRGF0ZSh2YWx1ZSkgOiBkLnNldERhdGUodmFsdWUpKTtcbiAgICAgICAgICAgIC8vIGNhc2UgJ0RheSc6IC8vIE5vdCByZWFsXG4gICAgICAgICAgICAvLyAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ0RheSh2YWx1ZSkgOiBkLnNldERheSh2YWx1ZSkpO1xuICAgICAgICAgICAgLy8gY2FzZSAnTW9udGgnOiAvLyBOb3QgdXNlZCBiZWNhdXNlIHdlIG5lZWQgdG8gcGFzcyB0d28gdmFyaWFibGVzXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIHZvaWQgKGlzVVRDID8gZC5zZXRVVENNb250aCh2YWx1ZSkgOiBkLnNldE1vbnRoKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdGdWxsWWVhcic6XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFNlZSBiZWxvdyAuLi5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBKdXN0IGluIGNhc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHllYXIgPSB2YWx1ZTtcbiAgICAgICAgbW9udGggPSBtb20ubW9udGgoKTtcbiAgICAgICAgZGF0ZSA9IG1vbS5kYXRlKCk7XG4gICAgICAgIGRhdGUgPSBkYXRlID09PSAyOSAmJiBtb250aCA9PT0gMSAmJiAhaXNMZWFwWWVhcih5ZWFyKSA/IDI4IDogZGF0ZTtcbiAgICAgICAgdm9pZCAoaXNVVENcbiAgICAgICAgICAgID8gZC5zZXRVVENGdWxsWWVhcih5ZWFyLCBtb250aCwgZGF0ZSlcbiAgICAgICAgICAgIDogZC5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgZGF0ZSkpO1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHN0cmluZ0dldCh1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdHJpbmdTZXQodW5pdHMsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdW5pdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIHZhciBwcmlvcml0aXplZCA9IGdldFByaW9yaXRpemVkVW5pdHModW5pdHMpLFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgcHJpb3JpdGl6ZWRMZW4gPSBwcmlvcml0aXplZC5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJpb3JpdGl6ZWRMZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXNbcHJpb3JpdGl6ZWRbaV0udW5pdF0odW5pdHNbcHJpb3JpdGl6ZWRbaV0udW5pdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vZChuLCB4KSB7XG4gICAgICAgIHJldHVybiAoKG4gJSB4KSArIHgpICUgeDtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXhPZjtcblxuICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikge1xuICAgICAgICBpbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXhPZiA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICAvLyBJIGtub3dcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1tpXSA9PT0gbykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgICAgaWYgKGlzTmFOKHllYXIpIHx8IGlzTmFOKG1vbnRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW9kTW9udGggPSBtb2QobW9udGgsIDEyKTtcbiAgICAgICAgeWVhciArPSAobW9udGggLSBtb2RNb250aCkgLyAxMjtcbiAgICAgICAgcmV0dXJuIG1vZE1vbnRoID09PSAxXG4gICAgICAgICAgICA/IGlzTGVhcFllYXIoeWVhcilcbiAgICAgICAgICAgICAgICA/IDI5XG4gICAgICAgICAgICAgICAgOiAyOFxuICAgICAgICAgICAgOiAzMSAtICgobW9kTW9udGggJSA3KSAlIDIpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNJywgWydNTScsIDJdLCAnTW8nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoKCkgKyAxO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTU1NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignTScsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignTU0nLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5tb250aHNTaG9ydFJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdNTU1NJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5tb250aHNSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnTScsICdNTSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9IHRvSW50KGlucHV0KSAtIDE7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnTU1NJywgJ01NTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgbW9udGggPSBjb25maWcuX2xvY2FsZS5tb250aHNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGZpbmQgYSBtb250aCBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWQuXG4gICAgICAgIGlmIChtb250aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBhcnJheVtNT05USF0gPSBtb250aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRNb250aCA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRocyA9XG4gICAgICAgICAgICAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQgPVxuICAgICAgICAgICAgJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICBNT05USFNfSU5fRk9STUFUID0gL0Rbb0RdPyhcXFtbXlxcW1xcXV0qXFxdfFxccykrTU1NTT8vLFxuICAgICAgICBkZWZhdWx0TW9udGhzU2hvcnRSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdE1vbnRoc1JlZ2V4ID0gbWF0Y2hXb3JkO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlTW9udGhzKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocylcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21vbnRoc1xuICAgICAgICAgICAgICAgIDogdGhpcy5fbW9udGhzWydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzKVxuICAgICAgICAgICAgPyB0aGlzLl9tb250aHNbbS5tb250aCgpXVxuICAgICAgICAgICAgOiB0aGlzLl9tb250aHNbXG4gICAgICAgICAgICAgICAgICAodGhpcy5fbW9udGhzLmlzRm9ybWF0IHx8IE1PTlRIU19JTl9GT1JNQVQpLnRlc3QoZm9ybWF0KVxuICAgICAgICAgICAgICAgICAgICAgID8gJ2Zvcm1hdCdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdzdGFuZGFsb25lJ1xuICAgICAgICAgICAgICBdW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlTW9udGhzU2hvcnQobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzU2hvcnQpXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNTaG9ydFxuICAgICAgICAgICAgICAgIDogdGhpcy5fbW9udGhzU2hvcnRbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydClcbiAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU2hvcnRbbS5tb250aCgpXVxuICAgICAgICAgICAgOiB0aGlzLl9tb250aHNTaG9ydFtcbiAgICAgICAgICAgICAgICAgIE1PTlRIU19JTl9GT1JNQVQudGVzdChmb3JtYXQpID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSdcbiAgICAgICAgICAgICAgXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVN0cmljdFBhcnNlKG1vbnRoTmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBpaSxcbiAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgIGxsYyA9IG1vbnRoTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCB1c2VkXG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7ICsraSkge1xuICAgICAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRoc1Nob3J0KFxuICAgICAgICAgICAgICAgICAgICBtb20sXG4gICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnTU1NJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnTU1NJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1BhcnNlKG1vbnRoTmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVTdHJpY3RQYXJzZS5jYWxsKHRoaXMsIG1vbnRoTmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogYWRkIHNvcnRpbmdcbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSBtb250aCAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlclxuICAgICAgICAvLyBzZWUgc29ydGluZyBpbiBjb21wdXRlTW9udGhzUGFyc2VcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICYmICF0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKS5yZXBsYWNlKCcuJywgJycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsXG4gICAgICAgICAgICAgICAgICAgICdpJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0cmljdCAmJiAhdGhpcy5fbW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9XG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ01NTU0nICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ01NTScgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzZXRNb250aChtb20sIHZhbHVlKSB7XG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gTm8gb3BcbiAgICAgICAgICAgIHJldHVybiBtb207XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKC9eXFxkKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0b0ludCh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbW9tLmxvY2FsZURhdGEoKS5tb250aHNQYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogQW5vdGhlciBzaWxlbnQgZmFpbHVyZT9cbiAgICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtb250aCA9IHZhbHVlLFxuICAgICAgICAgICAgZGF0ZSA9IG1vbS5kYXRlKCk7XG5cbiAgICAgICAgZGF0ZSA9IGRhdGUgPCAyOSA/IGRhdGUgOiBNYXRoLm1pbihkYXRlLCBkYXlzSW5Nb250aChtb20ueWVhcigpLCBtb250aCkpO1xuICAgICAgICB2b2lkIChtb20uX2lzVVRDXG4gICAgICAgICAgICA/IG1vbS5fZC5zZXRVVENNb250aChtb250aCwgZGF0ZSlcbiAgICAgICAgICAgIDogbW9tLl9kLnNldE1vbnRoKG1vbnRoLCBkYXRlKSk7XG4gICAgICAgIHJldHVybiBtb207XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0TW9udGgodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCAnTW9udGgnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERheXNJbk1vbnRoKCkge1xuICAgICAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzU2hvcnRSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBkZWZhdWx0TW9udGhzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNb250aHNQYXJzZSgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNob3J0UGllY2VzID0gW10sXG4gICAgICAgICAgICBsb25nUGllY2VzID0gW10sXG4gICAgICAgICAgICBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgIHNob3J0UCxcbiAgICAgICAgICAgIGxvbmdQO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIHNob3J0UCA9IHJlZ2V4RXNjYXBlKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ1AgPSByZWdleEVzY2FwZSh0aGlzLm1vbnRocyhtb20sICcnKSk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHNob3J0UCk7XG4gICAgICAgICAgICBsb25nUGllY2VzLnB1c2gobG9uZ1ApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25nUCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHNob3J0UCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSBtb250aCAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlciBpdFxuICAgICAgICAvLyB3aWxsIG1hdGNoIHRoZSBsb25nZXIgcGllY2UuXG4gICAgICAgIHNob3J0UGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbG9uZ1BpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIG1peGVkUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcblxuICAgICAgICB0aGlzLl9tb250aHNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRGF0ZSh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xuICAgICAgICAvLyBjYW4ndCBqdXN0IGFwcGx5KCkgdG8gY3JlYXRlIGEgZGF0ZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE4MTM0OFxuICAgICAgICB2YXIgZGF0ZTtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkLCBoLCBNLCBzLCBtcyk7XG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGF0ZS5nZXRGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDRGF0ZSh5KSB7XG4gICAgICAgIHZhciBkYXRlLCBhcmdzO1xuICAgICAgICAvLyB0aGUgRGF0ZS5VVEMgZnVuY3Rpb24gcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgYXJnc1swXSA9IHkgKyA0MDA7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMuYXBwbHkobnVsbCwgYXJncykpO1xuICAgICAgICAgICAgaWYgKGlzRmluaXRlKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgLy8gc3RhcnQtb2YtZmlyc3Qtd2VlayAtIHN0YXJ0LW9mLXllYXJcbiAgICBmdW5jdGlvbiBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIC8vIGZpcnN0LXdlZWsgZGF5IC0tIHdoaWNoIGphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrICg0IGZvciBpc28sIDEgZm9yIG90aGVyKVxuICAgICAgICAgICAgZndkID0gNyArIGRvdyAtIGRveSxcbiAgICAgICAgICAgIC8vIGZpcnN0LXdlZWsgZGF5IGxvY2FsIHdlZWtkYXkgLS0gd2hpY2ggbG9jYWwgd2Vla2RheSBpcyBmd2RcbiAgICAgICAgICAgIGZ3ZGx3ID0gKDcgKyBjcmVhdGVVVENEYXRlKHllYXIsIDAsIGZ3ZCkuZ2V0VVRDRGF5KCkgLSBkb3cpICUgNztcblxuICAgICAgICByZXR1cm4gLWZ3ZGx3ICsgZndkIC0gMTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlI0NhbGN1bGF0aW5nX2FfZGF0ZV9naXZlbl90aGVfeWVhci4yQ193ZWVrX251bWJlcl9hbmRfd2Vla2RheVxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrcyh5ZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgbG9jYWxXZWVrZGF5ID0gKDcgKyB3ZWVrZGF5IC0gZG93KSAlIDcsXG4gICAgICAgICAgICB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRheU9mWWVhciA9IDEgKyA3ICogKHdlZWsgLSAxKSArIGxvY2FsV2Vla2RheSArIHdlZWtPZmZzZXQsXG4gICAgICAgICAgICByZXNZZWFyLFxuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyO1xuXG4gICAgICAgIGlmIChkYXlPZlllYXIgPD0gMCkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgLSAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5c0luWWVhcihyZXNZZWFyKSArIGRheU9mWWVhcjtcbiAgICAgICAgfSBlbHNlIGlmIChkYXlPZlllYXIgPiBkYXlzSW5ZZWFyKHllYXIpKSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhciArIDE7XG4gICAgICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlPZlllYXIgLSBkYXlzSW5ZZWFyKHllYXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXI7XG4gICAgICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlPZlllYXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcjogcmVzWWVhcixcbiAgICAgICAgICAgIGRheU9mWWVhcjogcmVzRGF5T2ZZZWFyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtPZlllYXIobW9tLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldChtb20ueWVhcigpLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrID0gTWF0aC5mbG9vcigobW9tLmRheU9mWWVhcigpIC0gd2Vla09mZnNldCAtIDEpIC8gNykgKyAxLFxuICAgICAgICAgICAgcmVzV2VlayxcbiAgICAgICAgICAgIHJlc1llYXI7XG5cbiAgICAgICAgaWYgKHdlZWsgPCAxKSB7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSAtIDE7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlayArIHdlZWtzSW5ZZWFyKHJlc1llYXIsIGRvdywgZG95KTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrID4gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlayAtIHdlZWtzSW5ZZWFyKG1vbS55ZWFyKCksIGRvdywgZG95KTtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpO1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2VlazogcmVzV2VlayxcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla3NJblllYXIoeWVhciwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICAgICAgd2Vla09mZnNldE5leHQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciArIDEsIGRvdywgZG95KTtcbiAgICAgICAgcmV0dXJuIChkYXlzSW5ZZWFyKHllYXIpIC0gd2Vla09mZnNldCArIHdlZWtPZmZzZXROZXh0KSAvIDc7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3cnLCBbJ3d3JywgMl0sICd3bycsICd3ZWVrJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ1cnLCBbJ1dXJywgMl0sICdXbycsICdpc29XZWVrJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd3JywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCd3dycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdXJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdXVycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFxuICAgICAgICBbJ3cnLCAnd3cnLCAnVycsICdXVyddLFxuICAgICAgICBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDEpXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrKG1vbSkge1xuICAgICAgICByZXR1cm4gd2Vla09mWWVhcihtb20sIHRoaXMuX3dlZWsuZG93LCB0aGlzLl93ZWVrLmRveSkud2VlaztcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWsgPSB7XG4gICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mV2VlaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZZZWFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3k7XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2VlayhpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKChpbnB1dCAtIHdlZWspICogNywgJ2QnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gd2Vla09mWWVhcih0aGlzLCAxLCA0KS53ZWVrO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2QnLCAwLCAnZG8nLCAnZGF5Jyk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbih0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdlJywgMCwgMCwgJ3dlZWtkYXknKTtcbiAgICBhZGRGb3JtYXRUb2tlbignRScsIDAsIDAsICdpc29XZWVrZGF5Jyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdkJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdlJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdFJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdkZCcsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNNaW5SZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZGQnLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydkZCcsICdkZGQnLCAnZGRkZCddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIHdlZWtkYXkgPSBjb25maWcuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IGEgd2Vla2RheSBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWRcbiAgICAgICAgaWYgKHdlZWtkYXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2Vlay5kID0gd2Vla2RheTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRXZWVrZGF5ID0gaW5wdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZCcsICdlJywgJ0UnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW5dID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGlucHV0LCBsb2NhbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOYU4oaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0ID0gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VJc29XZWVrZGF5KGlucHV0LCBsb2NhbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCkgJSA3IHx8IDc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzTmFOKGlucHV0KSA/IG51bGwgOiBpbnB1dDtcbiAgICB9XG5cbiAgICAvLyBMT0NBTEVTXG4gICAgZnVuY3Rpb24gc2hpZnRXZWVrZGF5cyh3cywgbikge1xuICAgICAgICByZXR1cm4gd3Muc2xpY2UobiwgNykuY29uY2F0KHdzLnNsaWNlKDAsIG4pKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWtkYXlzID1cbiAgICAgICAgICAgICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoJ18nKSxcbiAgICAgICAgZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQgPSAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4gPSAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGRlZmF1bHRXZWVrZGF5c1JlZ2V4ID0gbWF0Y2hXb3JkLFxuICAgICAgICBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4ID0gbWF0Y2hXb3JkLFxuICAgICAgICBkZWZhdWx0V2Vla2RheXNNaW5SZWdleCA9IG1hdGNoV29yZDtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgd2Vla2RheXMgPSBpc0FycmF5KHRoaXMuX3dlZWtkYXlzKVxuICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c1xuICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c1tcbiAgICAgICAgICAgICAgICAgIG0gJiYgbSAhPT0gdHJ1ZSAmJiB0aGlzLl93ZWVrZGF5cy5pc0Zvcm1hdC50ZXN0KGZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgICA/ICdmb3JtYXQnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnc3RhbmRhbG9uZSdcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIG0gPT09IHRydWVcbiAgICAgICAgICAgID8gc2hpZnRXZWVrZGF5cyh3ZWVrZGF5cywgdGhpcy5fd2Vlay5kb3cpXG4gICAgICAgICAgICA6IG1cbiAgICAgICAgICAgICAgPyB3ZWVrZGF5c1ttLmRheSgpXVxuICAgICAgICAgICAgICA6IHdlZWtkYXlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzU2hvcnQobSkge1xuICAgICAgICByZXR1cm4gbSA9PT0gdHJ1ZVxuICAgICAgICAgICAgPyBzaGlmdFdlZWtkYXlzKHRoaXMuX3dlZWtkYXlzU2hvcnQsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNTaG9ydFttLmRheSgpXVxuICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzU2hvcnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNNaW4obSkge1xuICAgICAgICByZXR1cm4gbSA9PT0gdHJ1ZVxuICAgICAgICAgICAgPyBzaGlmdFdlZWtkYXlzKHRoaXMuX3dlZWtkYXlzTWluLCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogbVxuICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldXG4gICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNNaW47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UkMSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBpaSxcbiAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgIGxsYyA9IHdlZWtkYXlOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNNaW4oXG4gICAgICAgICAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICApLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5c1Nob3J0KFxuICAgICAgICAgICAgICAgICAgICBtb20sXG4gICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnZGRkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2RkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2RkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1BhcnNlKHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgbW9tLCByZWdleDtcblxuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU3RyaWN0UGFyc2UkMS5jYWxsKHRoaXMsIHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuXG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICYmICF0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFxcXC4/JykgKyAnJCcsXG4gICAgICAgICAgICAgICAgICAgICdpJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9XG4gICAgICAgICAgICAgICAgICAgICdeJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheXMobW9tLCAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnfF4nICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ3xeJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheXNNaW4obW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRlc3QgdGhlIHJlZ2V4XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnZGRkZCcgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ2RkZCcgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdkZCcgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCAmJiB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXREYXlPZldlZWsoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRheSA9IGdldCh0aGlzLCAnRGF5Jyk7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHBhcnNlV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKGlucHV0IC0gZGF5LCAnZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRheTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldExvY2FsZURheU9mV2VlayhpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdlZWtkYXkgPSAodGhpcy5kYXkoKSArIDcgLSB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3cpICUgNztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrZGF5IDogdGhpcy5hZGQoaW5wdXQgLSB3ZWVrZGF5LCAnZCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT0RheU9mV2VlayhpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgIC8vIGFzIGEgZ2V0dGVyLCByZXR1cm5zIDcgaW5zdGVhZCBvZiAwICgxLTcgcmFuZ2UgaW5zdGVhZCBvZiAwLTYpXG4gICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cblxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWtkYXkgOiB3ZWVrZGF5IC0gNyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKSB8fCA3O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla2RheXNSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IGRlZmF1bHRXZWVrZGF5c1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1Nob3J0UmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1Nob3J0UmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCA9IGRlZmF1bHRXZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzTWluUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzTWluUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzTWluUmVnZXggPSBkZWZhdWx0V2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZVdlZWtkYXlzUGFyc2UoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtaW5QaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIHNob3J0UGllY2VzID0gW10sXG4gICAgICAgICAgICBsb25nUGllY2VzID0gW10sXG4gICAgICAgICAgICBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgIG1pbnAsXG4gICAgICAgICAgICBzaG9ydHAsXG4gICAgICAgICAgICBsb25ncDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICBtaW5wID0gcmVnZXhFc2NhcGUodGhpcy53ZWVrZGF5c01pbihtb20sICcnKSk7XG4gICAgICAgICAgICBzaG9ydHAgPSByZWdleEVzY2FwZSh0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ3AgPSByZWdleEVzY2FwZSh0aGlzLndlZWtkYXlzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1pblBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgc2hvcnRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHNob3J0cCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIHdlZWtkYXkgKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBtaW5QaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbWluUGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIGhGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgJSAxMiB8fCAxMjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpIHx8IDI0O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdIJywgWydISCcsIDJdLCAwLCAnaG91cicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdoJywgWydoaCcsIDJdLCAwLCBoRm9ybWF0KTtcbiAgICBhZGRGb3JtYXRUb2tlbignaycsIFsna2snLCAyXSwgMCwga0Zvcm1hdCk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgJycgK1xuICAgICAgICAgICAgaEZvcm1hdC5hcHBseSh0aGlzKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMikgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5zZWNvbmRzKCksIDIpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyB0aGlzLmhvdXJzKCkgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMik7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSG1tc3MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAnJyArXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCkgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW0odG9rZW4sIGxvd2VyY2FzZSkge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbih0b2tlbiwgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1lcmlkaWVtKFxuICAgICAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgICAgICBsb3dlcmNhc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG1lcmlkaWVtKCdhJywgdHJ1ZSk7XG4gICAgbWVyaWRpZW0oJ0EnLCBmYWxzZSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBmdW5jdGlvbiBtYXRjaE1lcmlkaWVtKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fbWVyaWRpZW1QYXJzZTtcbiAgICB9XG5cbiAgICBhZGRSZWdleFRva2VuKCdhJywgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignQScsIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0gnLCBtYXRjaDF0bzIsIG1hdGNoMXRvMkhhc1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2gnLCBtYXRjaDF0bzIsIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2snLCBtYXRjaDF0bzIsIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0hIJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2hoJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2trJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG4gICAgYWRkUmVnZXhUb2tlbignaG1tJywgbWF0Y2gzdG80KTtcbiAgICBhZGRSZWdleFRva2VuKCdobW1zcycsIG1hdGNoNXRvNik7XG4gICAgYWRkUmVnZXhUb2tlbignSG1tJywgbWF0Y2gzdG80KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW1zcycsIG1hdGNoNXRvNik7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnSCcsICdISCddLCBIT1VSKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnaycsICdrayddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIGtJbnB1dCA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSBrSW5wdXQgPT09IDI0ID8gMCA6IGtJbnB1dDtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnYScsICdBJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2lzUG0gPSBjb25maWcuX2xvY2FsZS5pc1BNKGlucHV0KTtcbiAgICAgICAgY29uZmlnLl9tZXJpZGllbSA9IGlucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydoJywgJ2hoJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignaG1tJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MpKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignaG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0LFxuICAgICAgICAgICAgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdIbW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MxID0gaW5wdXQubGVuZ3RoIC0gNCxcbiAgICAgICAgICAgIHBvczIgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMSwgMikpO1xuICAgICAgICBhcnJheVtTRUNPTkRdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczIpKTtcbiAgICB9KTtcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUlzUE0oaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IFF1aXJrcyBNb2RlICYgSUU3IFN0YW5kYXJkcyBNb2RlIGRvIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3RyaW5ncyBsaWtlIGFycmF5c1xuICAgICAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICAgICAgcmV0dXJuIChpbnB1dCArICcnKS50b0xvd2VyQ2FzZSgpLmNoYXJBdCgwKSA9PT0gJ3AnO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZSA9IC9bYXBdXFwuP20/XFwuPy9pLFxuICAgICAgICAvLyBTZXR0aW5nIHRoZSBob3VyIHNob3VsZCBrZWVwIHRoZSB0aW1lLCBiZWNhdXNlIHRoZSB1c2VyIGV4cGxpY2l0bHlcbiAgICAgICAgLy8gc3BlY2lmaWVkIHdoaWNoIGhvdXIgdGhleSB3YW50LiBTbyB0cnlpbmcgdG8gbWFpbnRhaW4gdGhlIHNhbWUgaG91ciAoaW5cbiAgICAgICAgLy8gYSBuZXcgdGltZXpvbmUpIG1ha2VzIHNlbnNlLiBBZGRpbmcvc3VidHJhY3RpbmcgaG91cnMgZG9lcyBub3QgZm9sbG93XG4gICAgICAgIC8vIHRoaXMgcnVsZS5cbiAgICAgICAgZ2V0U2V0SG91ciA9IG1ha2VHZXRTZXQoJ0hvdXJzJywgdHJ1ZSk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNZXJpZGllbShob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAncG0nIDogJ1BNJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2FtJyA6ICdBTSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYmFzZUNvbmZpZyA9IHtcbiAgICAgICAgY2FsZW5kYXI6IGRlZmF1bHRDYWxlbmRhcixcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IGRlZmF1bHRMb25nRGF0ZUZvcm1hdCxcbiAgICAgICAgaW52YWxpZERhdGU6IGRlZmF1bHRJbnZhbGlkRGF0ZSxcbiAgICAgICAgb3JkaW5hbDogZGVmYXVsdE9yZGluYWwsXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IGRlZmF1bHREYXlPZk1vbnRoT3JkaW5hbFBhcnNlLFxuICAgICAgICByZWxhdGl2ZVRpbWU6IGRlZmF1bHRSZWxhdGl2ZVRpbWUsXG5cbiAgICAgICAgbW9udGhzOiBkZWZhdWx0TG9jYWxlTW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LFxuXG4gICAgICAgIHdlZWs6IGRlZmF1bHRMb2NhbGVXZWVrLFxuXG4gICAgICAgIHdlZWtkYXlzOiBkZWZhdWx0TG9jYWxlV2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0LFxuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlLFxuICAgIH07XG5cbiAgICAvLyBpbnRlcm5hbCBzdG9yYWdlIGZvciBsb2NhbGUgY29uZmlnIGZpbGVzXG4gICAgdmFyIGxvY2FsZXMgPSB7fSxcbiAgICAgICAgbG9jYWxlRmFtaWxpZXMgPSB7fSxcbiAgICAgICAgZ2xvYmFsTG9jYWxlO1xuXG4gICAgZnVuY3Rpb24gY29tbW9uUHJlZml4KGFycjEsIGFycjIpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBtaW5sID0gTWF0aC5taW4oYXJyMS5sZW5ndGgsIGFycjIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG1pbmw7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlubDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVMb2NhbGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgPyBrZXkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdfJywgJy0nKSA6IGtleTtcbiAgICB9XG5cbiAgICAvLyBwaWNrIHRoZSBsb2NhbGUgZnJvbSB0aGUgYXJyYXlcbiAgICAvLyB0cnkgWydlbi1hdScsICdlbi1nYiddIGFzICdlbi1hdScsICdlbi1nYicsICdlbicsIGFzIGluIG1vdmUgdGhyb3VnaCB0aGUgbGlzdCB0cnlpbmcgZWFjaFxuICAgIC8vIHN1YnN0cmluZyBmcm9tIG1vc3Qgc3BlY2lmaWMgdG8gbGVhc3QsIGJ1dCBtb3ZlIHRvIHRoZSBuZXh0IGFycmF5IGl0ZW0gaWYgaXQncyBhIG1vcmUgc3BlY2lmaWMgdmFyaWFudCB0aGFuIHRoZSBjdXJyZW50IHJvb3RcbiAgICBmdW5jdGlvbiBjaG9vc2VMb2NhbGUobmFtZXMpIHtcbiAgICAgICAgdmFyIGkgPSAwLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICBzcGxpdDtcblxuICAgICAgICB3aGlsZSAoaSA8IG5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBuZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgIG5leHQubGVuZ3RoID49IGogJiZcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uUHJlZml4KHNwbGl0LCBuZXh0KSA+PSBqIC0gMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHRoYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xvY2FsZU5hbWVTYW5lKG5hbWUpIHtcbiAgICAgICAgLy8gUHJldmVudCBuYW1lcyB0aGF0IGxvb2sgbGlrZSBmaWxlc3lzdGVtIHBhdGhzLCBpLmUgY29udGFpbiAnLycgb3IgJ1xcJ1xuICAgICAgICAvLyBFbnN1cmUgbmFtZSBpcyBhdmFpbGFibGUgYW5kIGZ1bmN0aW9uIHJldHVybnMgYm9vbGVhblxuICAgICAgICByZXR1cm4gISEobmFtZSAmJiBuYW1lLm1hdGNoKCdeW14vXFxcXFxcXFxdKiQnKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9hZExvY2FsZShuYW1lKSB7XG4gICAgICAgIHZhciBvbGRMb2NhbGUgPSBudWxsLFxuICAgICAgICAgICAgYWxpYXNlZFJlcXVpcmU7XG4gICAgICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHJlZ2lzdGVyIGFuZCBsb2FkIGFsbCB0aGUgbG9jYWxlcyBpbiBOb2RlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIG1vZHVsZSAmJlxuICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgJiZcbiAgICAgICAgICAgIGlzTG9jYWxlTmFtZVNhbmUobmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9sZExvY2FsZSA9IGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICAgICAgICAgICAgICBhbGlhc2VkUmVxdWlyZSA9IHJlcXVpcmU7XG4gICAgICAgICAgICAgICAgYWxpYXNlZFJlcXVpcmUoJy4vbG9jYWxlLycgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUob2xkTG9jYWxlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIG5vdCBmb3VuZCB0byBhdm9pZCByZXBlYXRpbmcgZXhwZW5zaXZlIGZpbGUgcmVxdWlyZSBjYWxsIGNhdXNpbmcgaGlnaCBDUFVcbiAgICAgICAgICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBmaW5kIGVuLVVTLCBlbl9VUywgZW4tdXMgZm9yIGV2ZXJ5IGZvcm1hdCBjYWxsXG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IG51bGw7IC8vIG51bGwgbWVhbnMgbm90IGZvdW5kXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgbG9jYWxlIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGxvY2FsZS4gIElmXG4gICAgLy8gbm8gYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4sIGl0IHdpbGwgc2ltcGx5IHJldHVybiB0aGUgY3VycmVudCBnbG9iYWxcbiAgICAvLyBsb2NhbGUga2V5LlxuICAgIGZ1bmN0aW9uIGdldFNldEdsb2JhbExvY2FsZShrZXksIHZhbHVlcykge1xuICAgICAgICB2YXIgZGF0YTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkZWZpbmVMb2NhbGUoa2V5LCB2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIG1vbWVudC5kdXJhdGlvbi5fbG9jYWxlID0gbW9tZW50Ll9sb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGdsb2JhbExvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vd2FybiB1c2VyIGlmIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGJ1dCB0aGUgbG9jYWxlIGNvdWxkIG5vdCBiZSBzZXRcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0xvY2FsZSAnICsga2V5ICsgJyBub3QgZm91bmQuIERpZCB5b3UgZm9yZ2V0IHRvIGxvYWQgaXQ/J1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGUuX2FiYnI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVmaW5lTG9jYWxlKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgICAgICBjb25maWcuYWJiciA9IG5hbWU7XG4gICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKFxuICAgICAgICAgICAgICAgICAgICAnZGVmaW5lTG9jYWxlT3ZlcnJpZGUnLFxuICAgICAgICAgICAgICAgICAgICAndXNlIG1vbWVudC51cGRhdGVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSB0byBjaGFuZ2UgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnYW4gZXhpc3RpbmcgbG9jYWxlLiBtb21lbnQuZGVmaW5lTG9jYWxlKGxvY2FsZU5hbWUsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZykgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbG9jYWxlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RlZmluZS1sb2NhbGUvIGZvciBtb3JlIGluZm8uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlc1tuYW1lXS5fY29uZmlnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlc1tjb25maWcucGFyZW50TG9jYWxlXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0uX2NvbmZpZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGNvbmZpZy5wYXJlbnRMb2NhbGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBuZXcgTG9jYWxlKG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZykpO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxlRmFtaWxpZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZUxvY2FsZSh4Lm5hbWUsIHguY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc2V0IHRoZSBsb2NhbGUgQUZURVIgYWxsIGNoaWxkIGxvY2FsZXMgaGF2ZSBiZWVuXG4gICAgICAgICAgICAvLyBjcmVhdGVkLCBzbyB3ZSB3b24ndCBlbmQgdXAgd2l0aCB0aGUgY2hpbGQgbG9jYWxlIHNldC5cbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcblxuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB1c2VmdWwgZm9yIHRlc3RpbmdcbiAgICAgICAgICAgIGRlbGV0ZSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVMb2NhbGUobmFtZSwgY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSxcbiAgICAgICAgICAgICAgICB0bXBMb2NhbGUsXG4gICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gYmFzZUNvbmZpZztcblxuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCAmJiBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGNoaWxkIGxvY2FsZSBpbi1wbGFjZSB0byBhdm9pZCBtZW1vcnktbGVha3NcbiAgICAgICAgICAgICAgICBsb2NhbGVzW25hbWVdLnNldChtZXJnZUNvbmZpZ3MobG9jYWxlc1tuYW1lXS5fY29uZmlnLCBjb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTUVSR0VcbiAgICAgICAgICAgICAgICB0bXBMb2NhbGUgPSBsb2FkTG9jYWxlKG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICh0bXBMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSB0bXBMb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKTtcbiAgICAgICAgICAgICAgICBpZiAodG1wTG9jYWxlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlTG9jYWxlIGlzIGNhbGxlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbG9jYWxlXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBhYmJyIHNvIGl0IHdpbGwgaGF2ZSBhIG5hbWUgKGdldHRlcnMgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZCBvdGhlcndpc2UpLlxuICAgICAgICAgICAgICAgICAgICBjb25maWcuYWJiciA9IG5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoY29uZmlnKTtcbiAgICAgICAgICAgICAgICBsb2NhbGUucGFyZW50TG9jYWxlID0gbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbG9jYWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBub3c6IGFsc28gc2V0IHRoZSBsb2NhbGVcbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3MgbnVsbCBmb3IgY29uZmlnIHRvIHVudXBkYXRlLCB1c2VmdWwgZm9yIHRlc3RzXG4gICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0ucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZXNbbmFtZV0ucGFyZW50TG9jYWxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZ2V0U2V0R2xvYmFsTG9jYWxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIGxvY2FsZSBkYXRhXG4gICAgZnVuY3Rpb24gZ2V0TG9jYWxlKGtleSkge1xuICAgICAgICB2YXIgbG9jYWxlO1xuXG4gICAgICAgIGlmIChrZXkgJiYga2V5Ll9sb2NhbGUgJiYga2V5Ll9sb2NhbGUuX2FiYnIpIHtcbiAgICAgICAgICAgIGtleSA9IGtleS5fbG9jYWxlLl9hYmJyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgICAgLy9zaG9ydC1jaXJjdWl0IGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShrZXkpO1xuICAgICAgICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrZXkgPSBba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaG9vc2VMb2NhbGUoa2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TG9jYWxlcygpIHtcbiAgICAgICAgcmV0dXJuIGtleXMobG9jYWxlcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tPdmVyZmxvdyhtKSB7XG4gICAgICAgIHZhciBvdmVyZmxvdyxcbiAgICAgICAgICAgIGEgPSBtLl9hO1xuXG4gICAgICAgIGlmIChhICYmIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9PT0gLTIpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID1cbiAgICAgICAgICAgICAgICBhW01PTlRIXSA8IDAgfHwgYVtNT05USF0gPiAxMVxuICAgICAgICAgICAgICAgICAgICA/IE1PTlRIXG4gICAgICAgICAgICAgICAgICAgIDogYVtEQVRFXSA8IDEgfHwgYVtEQVRFXSA+IGRheXNJbk1vbnRoKGFbWUVBUl0sIGFbTU9OVEhdKVxuICAgICAgICAgICAgICAgICAgICAgID8gREFURVxuICAgICAgICAgICAgICAgICAgICAgIDogYVtIT1VSXSA8IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYVtIT1VSXSA+IDI0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChhW0hPVVJdID09PSAyNCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFbTUlOVVRFXSAhPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbU0VDT05EXSAhPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbTUlMTElTRUNPTkRdICE9PSAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gSE9VUlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhW01JTlVURV0gPCAwIHx8IGFbTUlOVVRFXSA+IDU5XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gTUlOVVRFXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYVtTRUNPTkRdIDwgMCB8fCBhW1NFQ09ORF0gPiA1OVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU0VDT05EXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhW01JTExJU0VDT05EXSA8IDAgfHwgYVtNSUxMSVNFQ09ORF0gPiA5OTlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTUlMTElTRUNPTkRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLTE7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93RGF5T2ZZZWFyICYmXG4gICAgICAgICAgICAgICAgKG92ZXJmbG93IDwgWUVBUiB8fCBvdmVyZmxvdyA+IERBVEUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IERBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtzICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla2RheSAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUtEQVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gaXNvIDg2MDEgcmVnZXhcbiAgICAvLyAwMDAwLTAwLTAwIDAwMDAtVzAwIG9yIDAwMDAtVzAwLTAgKyBUICsgMDAgb3IgMDA6MDAgb3IgMDA6MDA6MDAgb3IgMDA6MDA6MDAuMDAwICsgKzAwOjAwIG9yICswMDAwIG9yICswMClcbiAgICB2YXIgZXh0ZW5kZWRJc29SZWdleCA9XG4gICAgICAgICAgICAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pLSg/OlxcZFxcZC1cXGRcXGR8V1xcZFxcZC1cXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzo6XFxkXFxkKD86OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbKy1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLyxcbiAgICAgICAgYmFzaWNJc29SZWdleCA9XG4gICAgICAgICAgICAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pKD86XFxkXFxkXFxkXFxkfFdcXGRcXGRcXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkfCkpKD86KFR8ICkoXFxkXFxkKD86XFxkXFxkKD86XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvLFxuICAgICAgICB0elJlZ2V4ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vLFxuICAgICAgICBpc29EYXRlcyA9IFtcbiAgICAgICAgICAgIFsnWVlZWVlZLU1NLUREJywgL1srLV1cXGR7Nn0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICAgICAgWydZWVlZLU1NLUREJywgL1xcZHs0fS1cXGRcXGQtXFxkXFxkL10sXG4gICAgICAgICAgICBbJ0dHR0ctW1ddV1ctRScsIC9cXGR7NH0tV1xcZFxcZC1cXGQvXSxcbiAgICAgICAgICAgIFsnR0dHRy1bV11XVycsIC9cXGR7NH0tV1xcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWS1EREQnLCAvXFxkezR9LVxcZHszfS9dLFxuICAgICAgICAgICAgWydZWVlZLU1NJywgL1xcZHs0fS1cXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVlZWU1NREQnLCAvWystXVxcZHsxMH0vXSxcbiAgICAgICAgICAgIFsnWVlZWU1NREQnLCAvXFxkezh9L10sXG4gICAgICAgICAgICBbJ0dHR0dbV11XV0UnLCAvXFxkezR9V1xcZHszfS9dLFxuICAgICAgICAgICAgWydHR0dHW1ddV1cnLCAvXFxkezR9V1xcZHsyfS8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWURERCcsIC9cXGR7N30vXSxcbiAgICAgICAgICAgIFsnWVlZWU1NJywgL1xcZHs2fS8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWScsIC9cXGR7NH0vLCBmYWxzZV0sXG4gICAgICAgIF0sXG4gICAgICAgIC8vIGlzbyB0aW1lIGZvcm1hdHMgYW5kIHJlZ2V4ZXNcbiAgICAgICAgaXNvVGltZXMgPSBbXG4gICAgICAgICAgICBbJ0hIOm1tOnNzLlNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgICAgICBbJ0hIOm1tOnNzLFNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFxuICAgICAgICAgICAgWydISDptbTpzcycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICAgICAgWydISDptbScsIC9cXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgICAgICBbJ0hIbW1zcy5TU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgICAgIFsnSEhtbXNzLFNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkLFxcZCsvXSxcbiAgICAgICAgICAgIFsnSEhtbXNzJywgL1xcZFxcZFxcZFxcZFxcZFxcZC9dLFxuICAgICAgICAgICAgWydISG1tJywgL1xcZFxcZFxcZFxcZC9dLFxuICAgICAgICAgICAgWydISCcsIC9cXGRcXGQvXSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNwTmV0SnNvblJlZ2V4ID0gL15cXC8/RGF0ZVxcKCgtP1xcZCspL2ksXG4gICAgICAgIC8vIFJGQyAyODIyIHJlZ2V4OiBGb3IgZGV0YWlscyBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI4MjIjc2VjdGlvbi0zLjNcbiAgICAgICAgcmZjMjgyMiA9XG4gICAgICAgICAgICAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLD9cXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KFsrLV1cXGR7NH0pKSQvLFxuICAgICAgICBvYnNPZmZzZXRzID0ge1xuICAgICAgICAgICAgVVQ6IDAsXG4gICAgICAgICAgICBHTVQ6IDAsXG4gICAgICAgICAgICBFRFQ6IC00ICogNjAsXG4gICAgICAgICAgICBFU1Q6IC01ICogNjAsXG4gICAgICAgICAgICBDRFQ6IC01ICogNjAsXG4gICAgICAgICAgICBDU1Q6IC02ICogNjAsXG4gICAgICAgICAgICBNRFQ6IC02ICogNjAsXG4gICAgICAgICAgICBNU1Q6IC03ICogNjAsXG4gICAgICAgICAgICBQRFQ6IC03ICogNjAsXG4gICAgICAgICAgICBQU1Q6IC04ICogNjAsXG4gICAgICAgIH07XG5cbiAgICAvLyBkYXRlIGZyb20gaXNvIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JU08oY29uZmlnKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHN0cmluZyA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIG1hdGNoID0gZXh0ZW5kZWRJc29SZWdleC5leGVjKHN0cmluZykgfHwgYmFzaWNJc29SZWdleC5leGVjKHN0cmluZyksXG4gICAgICAgICAgICBhbGxvd1RpbWUsXG4gICAgICAgICAgICBkYXRlRm9ybWF0LFxuICAgICAgICAgICAgdGltZUZvcm1hdCxcbiAgICAgICAgICAgIHR6Rm9ybWF0LFxuICAgICAgICAgICAgaXNvRGF0ZXNMZW4gPSBpc29EYXRlcy5sZW5ndGgsXG4gICAgICAgICAgICBpc29UaW1lc0xlbiA9IGlzb1RpbWVzLmxlbmd0aDtcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmlzbyA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvRGF0ZXNMZW47IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNvRGF0ZXNbaV1bMV0uZXhlYyhtYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdCA9IGlzb0RhdGVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBhbGxvd1RpbWUgPSBpc29EYXRlc1tpXVsyXSAhPT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRlRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvVGltZXNMZW47IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzb1RpbWVzW2ldWzFdLmV4ZWMobWF0Y2hbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsyXSBzaG91bGQgYmUgJ1QnIG9yIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lRm9ybWF0ID0gKG1hdGNoWzJdIHx8ICcgJykgKyBpc29UaW1lc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aW1lRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFsbG93VGltZSAmJiB0aW1lRm9ybWF0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbNF0pIHtcbiAgICAgICAgICAgICAgICBpZiAodHpSZWdleC5leGVjKG1hdGNoWzRdKSkge1xuICAgICAgICAgICAgICAgICAgICB0ekZvcm1hdCA9ICdaJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZy5fZiA9IGRhdGVGb3JtYXQgKyAodGltZUZvcm1hdCB8fCAnJykgKyAodHpGb3JtYXQgfHwgJycpO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRyYWN0RnJvbVJGQzI4MjJTdHJpbmdzKFxuICAgICAgICB5ZWFyU3RyLFxuICAgICAgICBtb250aFN0cixcbiAgICAgICAgZGF5U3RyLFxuICAgICAgICBob3VyU3RyLFxuICAgICAgICBtaW51dGVTdHIsXG4gICAgICAgIHNlY29uZFN0clxuICAgICkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgdW50cnVuY2F0ZVllYXIoeWVhclN0ciksXG4gICAgICAgICAgICBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0ciksXG4gICAgICAgICAgICBwYXJzZUludChkYXlTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGhvdXJTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KG1pbnV0ZVN0ciwgMTApLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChzZWNvbmRTdHIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlSW50KHNlY29uZFN0ciwgMTApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhclN0cikge1xuICAgICAgICB2YXIgeWVhciA9IHBhcnNlSW50KHllYXJTdHIsIDEwKTtcbiAgICAgICAgaWYgKHllYXIgPD0gNDkpIHtcbiAgICAgICAgICAgIHJldHVybiAyMDAwICsgeWVhcjtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyIDw9IDk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIDE5MDAgKyB5ZWFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5ZWFyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgICAgICAgcmV0dXJuIHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXChbXigpXSpcXCl8W1xcblxcdF0vZywgJyAnKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCAnICcpXG4gICAgICAgICAgICAucmVwbGFjZSgvXlxcc1xccyovLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHNcXHMqJC8sICcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja1dlZWtkYXkod2Vla2RheVN0ciwgcGFyc2VkSW5wdXQsIGNvbmZpZykge1xuICAgICAgICBpZiAod2Vla2RheVN0cikge1xuICAgICAgICAgICAgLy8gVE9ETzogUmVwbGFjZSB0aGUgdmFuaWxsYSBKUyBEYXRlIG9iamVjdCB3aXRoIGFuIGluZGVwZW5kZW50IGRheS1vZi13ZWVrIGNoZWNrLlxuICAgICAgICAgICAgdmFyIHdlZWtkYXlQcm92aWRlZCA9IGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0LmluZGV4T2Yod2Vla2RheVN0ciksXG4gICAgICAgICAgICAgICAgd2Vla2RheUFjdHVhbCA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRJbnB1dFswXSxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSW5wdXRbMV0sXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZElucHV0WzJdXG4gICAgICAgICAgICAgICAgKS5nZXREYXkoKTtcbiAgICAgICAgICAgIGlmICh3ZWVrZGF5UHJvdmlkZWQgIT09IHdlZWtkYXlBY3R1YWwpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVPZmZzZXQob2JzT2Zmc2V0LCBtaWxpdGFyeU9mZnNldCwgbnVtT2Zmc2V0KSB7XG4gICAgICAgIGlmIChvYnNPZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNPZmZzZXRzW29ic09mZnNldF07XG4gICAgICAgIH0gZWxzZSBpZiAobWlsaXRhcnlPZmZzZXQpIHtcbiAgICAgICAgICAgIC8vIHRoZSBvbmx5IGFsbG93ZWQgbWlsaXRhcnkgdHogaXMgWlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBwYXJzZUludChudW1PZmZzZXQsIDEwKSxcbiAgICAgICAgICAgICAgICBtID0gaG0gJSAxMDAsXG4gICAgICAgICAgICAgICAgaCA9IChobSAtIG0pIC8gMTAwO1xuICAgICAgICAgICAgcmV0dXJuIGggKiA2MCArIG07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGFuZCB0aW1lIGZyb20gcmVmIDI4MjIgZm9ybWF0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHJmYzI4MjIuZXhlYyhwcmVwcm9jZXNzUkZDMjgyMihjb25maWcuX2kpKSxcbiAgICAgICAgICAgIHBhcnNlZEFycmF5O1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHBhcnNlZEFycmF5ID0gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyhcbiAgICAgICAgICAgICAgICBtYXRjaFs0XSxcbiAgICAgICAgICAgICAgICBtYXRjaFszXSxcbiAgICAgICAgICAgICAgICBtYXRjaFsyXSxcbiAgICAgICAgICAgICAgICBtYXRjaFs1XSxcbiAgICAgICAgICAgICAgICBtYXRjaFs2XSxcbiAgICAgICAgICAgICAgICBtYXRjaFs3XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghY2hlY2tXZWVrZGF5KG1hdGNoWzFdLCBwYXJzZWRBcnJheSwgY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uZmlnLl9hID0gcGFyc2VkQXJyYXk7XG4gICAgICAgICAgICBjb25maWcuX3R6bSA9IGNhbGN1bGF0ZU9mZnNldChtYXRjaFs4XSwgbWF0Y2hbOV0sIG1hdGNoWzEwXSk7XG5cbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGNyZWF0ZVVUQ0RhdGUuYXBwbHkobnVsbCwgY29uZmlnLl9hKTtcbiAgICAgICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnJmYzI4MjIgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gMSkgQVNQLk5FVCwgMikgSVNPLCAzKSBSRkMgMjgyMiBmb3JtYXRzLCBvciA0KSBvcHRpb25hbCBmYWxsYmFjayBpZiBwYXJzaW5nIGlzbid0IHN0cmljdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKSB7XG4gICAgICAgIHZhciBtYXRjaGVkID0gYXNwTmV0SnNvblJlZ2V4LmV4ZWMoY29uZmlnLl9pKTtcbiAgICAgICAgaWYgKG1hdGNoZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKCttYXRjaGVkWzFdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tUkZDMjgyMihjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX3N0cmljdCkge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaW5hbCBhdHRlbXB0LCB1c2UgSW5wdXQgRmFsbGJhY2tcbiAgICAgICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ3ZhbHVlIHByb3ZpZGVkIGlzIG5vdCBpbiBhIHJlY29nbml6ZWQgUkZDMjgyMiBvciBJU08gZm9ybWF0LiBtb21lbnQgY29uc3RydWN0aW9uIGZhbGxzIGJhY2sgdG8ganMgRGF0ZSgpLCAnICtcbiAgICAgICAgICAgICd3aGljaCBpcyBub3QgcmVsaWFibGUgYWNyb3NzIGFsbCBicm93c2VycyBhbmQgdmVyc2lvbnMuIE5vbiBSRkMyODIyL0lTTyBkYXRlIGZvcm1hdHMgYXJlICcgK1xuICAgICAgICAgICAgJ2Rpc2NvdXJhZ2VkLiBQbGVhc2UgcmVmZXIgdG8gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9qcy1kYXRlLyBmb3IgbW9yZSBpbmZvLicsXG4gICAgICAgIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5faSArIChjb25maWcuX3VzZVVUQyA/ICcgVVRDJyA6ICcnKSk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gUGljayB0aGUgZmlyc3QgZGVmaW5lZCBvZiB0d28gb3IgdGhyZWUgYXJndW1lbnRzLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRzKGEsIGIsIGMpIHtcbiAgICAgICAgaWYgKGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VycmVudERhdGVBcnJheShjb25maWcpIHtcbiAgICAgICAgLy8gaG9va3MgaXMgYWN0dWFsbHkgdGhlIGV4cG9ydGVkIG1vbWVudCBvYmplY3RcbiAgICAgICAgdmFyIG5vd1ZhbHVlID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgbm93VmFsdWUuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgICAgICAgICAgICBub3dWYWx1ZS5nZXRVVENNb250aCgpLFxuICAgICAgICAgICAgICAgIG5vd1ZhbHVlLmdldFVUQ0RhdGUoKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtub3dWYWx1ZS5nZXRGdWxsWWVhcigpLCBub3dWYWx1ZS5nZXRNb250aCgpLCBub3dWYWx1ZS5nZXREYXRlKCldO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnQgYW4gYXJyYXkgdG8gYSBkYXRlLlxuICAgIC8vIHRoZSBhcnJheSBzaG91bGQgbWlycm9yIHRoZSBwYXJhbWV0ZXJzIGJlbG93XG4gICAgLy8gbm90ZTogYWxsIHZhbHVlcyBwYXN0IHRoZSB5ZWFyIGFyZSBvcHRpb25hbCBhbmQgd2lsbCBkZWZhdWx0IHRvIHRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUuXG4gICAgLy8gW3llYXIsIG1vbnRoLCBkYXkgLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmRdXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUFycmF5KGNvbmZpZykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBpbnB1dCA9IFtdLFxuICAgICAgICAgICAgY3VycmVudERhdGUsXG4gICAgICAgICAgICBleHBlY3RlZFdlZWtkYXksXG4gICAgICAgICAgICB5ZWFyVG9Vc2U7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudERhdGUgPSBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZyk7XG5cbiAgICAgICAgLy9jb21wdXRlIGRheSBvZiB0aGUgeWVhciBmcm9tIHdlZWtzIGFuZCB3ZWVrZGF5c1xuICAgICAgICBpZiAoY29uZmlnLl93ICYmIGNvbmZpZy5fYVtEQVRFXSA9PSBudWxsICYmIGNvbmZpZy5fYVtNT05USF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSBkYXkgb2YgdGhlIHllYXIgaXMgc2V0LCBmaWd1cmUgb3V0IHdoYXQgaXQgaXNcbiAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHllYXJUb1VzZSA9IGRlZmF1bHRzKGNvbmZpZy5fYVtZRUFSXSwgY3VycmVudERhdGVbWUVBUl0pO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPiBkYXlzSW5ZZWFyKHllYXJUb1VzZSkgfHxcbiAgICAgICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA9PT0gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93RGF5T2ZZZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoeWVhclRvVXNlLCAwLCBjb25maWcuX2RheU9mWWVhcik7XG4gICAgICAgICAgICBjb25maWcuX2FbTU9OVEhdID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgICAgICAgICAgY29uZmlnLl9hW0RBVEVdID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgZGF0ZS5cbiAgICAgICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxuICAgICAgICAvLyAqIGlmIGRheSBvZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBtb250aCBhbmQgeWVhclxuICAgICAgICAvLyAqIGlmIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG9ubHkgeWVhclxuICAgICAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgJiYgY29uZmlnLl9hW2ldID09IG51bGw7ICsraSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSBjdXJyZW50RGF0ZVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFplcm8gb3V0IHdoYXRldmVyIHdhcyBub3QgZGVmYXVsdGVkLCBpbmNsdWRpbmcgdGltZVxuICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPVxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9PSBudWxsID8gKGkgPT09IDIgPyAxIDogMCkgOiBjb25maWcuX2FbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgMjQ6MDA6MDAuMDAwXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9PT0gMjQgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNSU5VVEVdID09PSAwICYmXG4gICAgICAgICAgICBjb25maWcuX2FbU0VDT05EXSA9PT0gMCAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW01JTExJU0VDT05EXSA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbmZpZy5fbmV4dERheSA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLl9kID0gKGNvbmZpZy5fdXNlVVRDID8gY3JlYXRlVVRDRGF0ZSA6IGNyZWF0ZURhdGUpLmFwcGx5KFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGlucHV0XG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdGVkV2Vla2RheSA9IGNvbmZpZy5fdXNlVVRDXG4gICAgICAgICAgICA/IGNvbmZpZy5fZC5nZXRVVENEYXkoKVxuICAgICAgICAgICAgOiBjb25maWcuX2QuZ2V0RGF5KCk7XG5cbiAgICAgICAgLy8gQXBwbHkgdGltZXpvbmUgb2Zmc2V0IGZyb20gaW5wdXQuIFRoZSBhY3R1YWwgdXRjT2Zmc2V0IGNhbiBiZSBjaGFuZ2VkXG4gICAgICAgIC8vIHdpdGggcGFyc2Vab25lLlxuICAgICAgICBpZiAoY29uZmlnLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX25leHREYXkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDI0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZm9yIG1pc21hdGNoaW5nIGRheSBvZiB3ZWVrXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbmZpZy5fdyAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbmZpZy5fdy5kICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgY29uZmlnLl93LmQgIT09IGV4cGVjdGVkV2Vla2RheVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLndlZWtkYXlNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlPZlllYXJGcm9tV2Vla0luZm8oY29uZmlnKSB7XG4gICAgICAgIHZhciB3LCB3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3ksIHRlbXAsIHdlZWtkYXlPdmVyZmxvdywgY3VyV2VlaztcblxuICAgICAgICB3ID0gY29uZmlnLl93O1xuICAgICAgICBpZiAody5HRyAhPSBudWxsIHx8IHcuVyAhPSBudWxsIHx8IHcuRSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkb3cgPSAxO1xuICAgICAgICAgICAgZG95ID0gNDtcblxuICAgICAgICAgICAgLy8gVE9ETzogV2UgbmVlZCB0byB0YWtlIHRoZSBjdXJyZW50IGlzb1dlZWtZZWFyLCBidXQgdGhhdCBkZXBlbmRzIG9uXG4gICAgICAgICAgICAvLyBob3cgd2UgaW50ZXJwcmV0IG5vdyAobG9jYWwsIHV0YywgZml4ZWQgb2Zmc2V0KS4gU28gY3JlYXRlXG4gICAgICAgICAgICAvLyBhIG5vdyB2ZXJzaW9uIG9mIGN1cnJlbnQgY29uZmlnICh0YWtlIGxvY2FsL3V0Yy9vZmZzZXQgZmxhZ3MsIGFuZFxuICAgICAgICAgICAgLy8gY3JlYXRlIG5vdykuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKFxuICAgICAgICAgICAgICAgIHcuR0csXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdLFxuICAgICAgICAgICAgICAgIHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgMSwgNCkueWVhclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHdlZWsgPSBkZWZhdWx0cyh3LlcsIDEpO1xuICAgICAgICAgICAgd2Vla2RheSA9IGRlZmF1bHRzKHcuRSwgMSk7XG4gICAgICAgICAgICBpZiAod2Vla2RheSA8IDEgfHwgd2Vla2RheSA+IDcpIHtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG93ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG93O1xuICAgICAgICAgICAgZG95ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG95O1xuXG4gICAgICAgICAgICBjdXJXZWVrID0gd2Vla09mWWVhcihjcmVhdGVMb2NhbCgpLCBkb3csIGRveSk7XG5cbiAgICAgICAgICAgIHdlZWtZZWFyID0gZGVmYXVsdHMody5nZywgY29uZmlnLl9hW1lFQVJdLCBjdXJXZWVrLnllYXIpO1xuXG4gICAgICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgd2Vlay5cbiAgICAgICAgICAgIHdlZWsgPSBkZWZhdWx0cyh3LncsIGN1cldlZWsud2Vlayk7XG5cbiAgICAgICAgICAgIGlmICh3LmQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIHdlZWtkYXkgLS0gbG93IGRheSBudW1iZXJzIGFyZSBjb25zaWRlcmVkIG5leHQgd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmQ7XG4gICAgICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAwIHx8IHdlZWtkYXkgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh3LmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGxvY2FsIHdlZWtkYXkgLS0gY291bnRpbmcgc3RhcnRzIGZyb20gYmVnaW5uaW5nIG9mIHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gdy5lICsgZG93O1xuICAgICAgICAgICAgICAgIGlmICh3LmUgPCAwIHx8IHcuZSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gYmVnaW5uaW5nIG9mIHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gZG93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh3ZWVrIDwgMSB8fCB3ZWVrID4gd2Vla3NJblllYXIod2Vla1llYXIsIGRvdywgZG95KSkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93V2Vla3MgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWtkYXlPdmVyZmxvdyAhPSBudWxsKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrZGF5ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRlbXAgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IHRlbXAueWVhcjtcbiAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdGVtcC5kYXlPZlllYXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgSVNPIHN0YW5kYXJkXG4gICAgaG9va3MuSVNPXzg2MDEgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBSRkMgMjgyMiBmb3JtXG4gICAgaG9va3MuUkZDXzI4MjIgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGZvcm1hdCBzdHJpbmdcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZykge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSBjcmVhdGlvbiBmbG93IHRvIHByZXZlbnQgY2lyY3VsYXIgZGVwc1xuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5JU09fODYwMSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLlJGQ18yODIyKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tUkZDMjgyMihjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpZy5fYSA9IFtdO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IHRydWU7XG5cbiAgICAgICAgLy8gVGhpcyBhcnJheSBpcyB1c2VkIHRvIG1ha2UgYSBEYXRlLCBlaXRoZXIgd2l0aCBgbmV3IERhdGVgIG9yIGBEYXRlLlVUQ2BcbiAgICAgICAgdmFyIHN0cmluZyA9ICcnICsgY29uZmlnLl9pLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHBhcnNlZElucHV0LFxuICAgICAgICAgICAgdG9rZW5zLFxuICAgICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgICBza2lwcGVkLFxuICAgICAgICAgICAgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggPSAwLFxuICAgICAgICAgICAgZXJhLFxuICAgICAgICAgICAgdG9rZW5MZW47XG5cbiAgICAgICAgdG9rZW5zID1cbiAgICAgICAgICAgIGV4cGFuZEZvcm1hdChjb25maWcuX2YsIGNvbmZpZy5fbG9jYWxlKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSB8fCBbXTtcbiAgICAgICAgdG9rZW5MZW4gPSB0b2tlbnMubGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5MZW47IGkrKykge1xuICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICAgICAgICBwYXJzZWRJbnB1dCA9IChzdHJpbmcubWF0Y2goZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpKSB8fFxuICAgICAgICAgICAgICAgIFtdKVswXTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIHNraXBwZWQgPSBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSk7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHNraXBwZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgIHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSArIHBhcnNlZElucHV0Lmxlbmd0aFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCArPSBwYXJzZWRJbnB1dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkb24ndCBwYXJzZSBpZiBpdCdzIG5vdCBhIGtub3duIHRva2VuXG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgcGFyc2VkSW5wdXQsIGNvbmZpZyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5fc3RyaWN0ICYmICFwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCByZW1haW5pbmcgdW5wYXJzZWQgaW5wdXQgbGVuZ3RoIHRvIHRoZSBzdHJpbmdcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuY2hhcnNMZWZ0T3ZlciA9XG4gICAgICAgICAgICBzdHJpbmdMZW5ndGggLSB0b3RhbFBhcnNlZElucHV0TGVuZ3RoO1xuICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIF8xMmggZmxhZyBpZiBob3VyIGlzIDw9IDEyXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA8PSAxMiAmJlxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5wYXJzZWREYXRlUGFydHMgPSBjb25maWcuX2Euc2xpY2UoMCk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLm1lcmlkaWVtID0gY29uZmlnLl9tZXJpZGllbTtcbiAgICAgICAgLy8gaGFuZGxlIG1lcmlkaWVtXG4gICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IG1lcmlkaWVtRml4V3JhcChcbiAgICAgICAgICAgIGNvbmZpZy5fbG9jYWxlLFxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdLFxuICAgICAgICAgICAgY29uZmlnLl9tZXJpZGllbVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGhhbmRsZSBlcmFcbiAgICAgICAgZXJhID0gZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZXJhO1xuICAgICAgICBpZiAoZXJhICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbWUVBUl0gPSBjb25maWcuX2xvY2FsZS5lcmFzQ29udmVydFllYXIoZXJhLCBjb25maWcuX2FbWUVBUl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIGNoZWNrT3ZlcmZsb3coY29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJpZGllbUZpeFdyYXAobG9jYWxlLCBob3VyLCBtZXJpZGllbSkge1xuICAgICAgICB2YXIgaXNQbTtcblxuICAgICAgICBpZiAobWVyaWRpZW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gbm90aGluZyB0byBkb1xuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsZS5tZXJpZGllbUhvdXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5tZXJpZGllbUhvdXIoaG91ciwgbWVyaWRpZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZS5pc1BNICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrXG4gICAgICAgICAgICBpc1BtID0gbG9jYWxlLmlzUE0obWVyaWRpZW0pO1xuICAgICAgICAgICAgaWYgKGlzUG0gJiYgaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQbSAmJiBob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW5cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgYXJyYXkgb2YgZm9ybWF0IHN0cmluZ3NcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIHZhciB0ZW1wQ29uZmlnLFxuICAgICAgICAgICAgYmVzdE1vbWVudCxcbiAgICAgICAgICAgIHNjb3JlVG9CZWF0LFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSxcbiAgICAgICAgICAgIHZhbGlkRm9ybWF0Rm91bmQsXG4gICAgICAgICAgICBiZXN0Rm9ybWF0SXNWYWxpZCA9IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlnZkxlbiA9IGNvbmZpZy5fZi5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGNvbmZpZ2ZMZW4gPT09IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRGb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWdmTGVuOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSA9IDA7XG4gICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICB0ZW1wQ29uZmlnID0gY29weUNvbmZpZyh7fSwgY29uZmlnKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuX3VzZVVUQyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVtcENvbmZpZy5fdXNlVVRDID0gY29uZmlnLl91c2VVVEM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZW1wQ29uZmlnLl9mID0gY29uZmlnLl9mW2ldO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcblxuICAgICAgICAgICAgaWYgKGlzVmFsaWQodGVtcENvbmZpZykpIHtcbiAgICAgICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW55IGlucHV0IHRoYXQgd2FzIG5vdCBwYXJzZWQgYWRkIGEgcGVuYWx0eSBmb3IgdGhhdCBmb3JtYXRcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuY2hhcnNMZWZ0T3ZlcjtcblxuICAgICAgICAgICAgLy9vciB0b2tlbnNcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykudW51c2VkVG9rZW5zLmxlbmd0aCAqIDEwO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuc2NvcmUgPSBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgICAgIGlmICghYmVzdEZvcm1hdElzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQgfHxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEZvcm1hdEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0Rm9ybWF0SXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCkge1xuICAgICAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXh0ZW5kKGNvbmZpZywgYmVzdE1vbWVudCB8fCB0ZW1wQ29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tT2JqZWN0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGNvbmZpZy5faSksXG4gICAgICAgICAgICBkYXlPckRhdGUgPSBpLmRheSA9PT0gdW5kZWZpbmVkID8gaS5kYXRlIDogaS5kYXk7XG4gICAgICAgIGNvbmZpZy5fYSA9IG1hcChcbiAgICAgICAgICAgIFtpLnllYXIsIGkubW9udGgsIGRheU9yRGF0ZSwgaS5ob3VyLCBpLm1pbnV0ZSwgaS5zZWNvbmQsIGkubWlsbGlzZWNvbmRdLFxuICAgICAgICAgICAgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmogJiYgcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRnJvbUNvbmZpZyhjb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhwcmVwYXJlQ29uZmlnKGNvbmZpZykpKTtcbiAgICAgICAgaWYgKHJlcy5fbmV4dERheSkge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGlzIHNtYXJ0IGVub3VnaCBhcm91bmQgRFNUXG4gICAgICAgICAgICByZXMuYWRkKDEsICdkJyk7XG4gICAgICAgICAgICByZXMuX25leHREYXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXBhcmVDb25maWcoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGNvbmZpZy5fZjtcblxuICAgICAgICBjb25maWcuX2xvY2FsZSA9IGNvbmZpZy5fbG9jYWxlIHx8IGdldExvY2FsZShjb25maWcuX2wpO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCAoZm9ybWF0ID09PSB1bmRlZmluZWQgJiYgaW5wdXQgPT09ICcnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoeyBudWxsSW5wdXQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnLl9pID0gaW5wdXQgPSBjb25maWcuX2xvY2FsZS5wcmVwYXJzZShpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNNb21lbnQoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vbWVudChjaGVja092ZXJmbG93KGlucHV0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gaW5wdXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShmb3JtYXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkKGNvbmZpZykpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pO1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQudmFsdWVPZigpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nKGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IG1hcChpbnB1dC5zbGljZSgwKSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tT2JqZWN0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGlzVVRDKSB7XG4gICAgICAgIHZhciBjID0ge307XG5cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gdHJ1ZSB8fCBmb3JtYXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBmb3JtYXQ7XG4gICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9jYWxlID09PSB0cnVlIHx8IGxvY2FsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGxvY2FsZTtcbiAgICAgICAgICAgIGxvY2FsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChpc09iamVjdChpbnB1dCkgJiYgaXNPYmplY3RFbXB0eShpbnB1dCkpIHx8XG4gICAgICAgICAgICAoaXNBcnJheShpbnB1dCkgJiYgaW5wdXQubGVuZ3RoID09PSAwKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlucHV0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9iamVjdCBjb25zdHJ1Y3Rpb24gbXVzdCBiZSBkb25lIHRoaXMgd2F5LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQyM1xuICAgICAgICBjLl9pc0FNb21lbnRPYmplY3QgPSB0cnVlO1xuICAgICAgICBjLl91c2VVVEMgPSBjLl9pc1VUQyA9IGlzVVRDO1xuICAgICAgICBjLl9sID0gbG9jYWxlO1xuICAgICAgICBjLl9pID0gaW5wdXQ7XG4gICAgICAgIGMuX2YgPSBmb3JtYXQ7XG4gICAgICAgIGMuX3N0cmljdCA9IHN0cmljdDtcblxuICAgICAgICByZXR1cm4gY3JlYXRlRnJvbUNvbmZpZyhjKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHZhciBwcm90b3R5cGVNaW4gPSBkZXByZWNhdGUoXG4gICAgICAgICAgICAnbW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPCB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBwcm90b3R5cGVNYXggPSBkZXByZWNhdGUoXG4gICAgICAgICAgICAnbW9tZW50KCkubWF4IGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPiB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgLy8gUGljayBhIG1vbWVudCBtIGZyb20gbW9tZW50cyBzbyB0aGF0IG1bZm5dKG90aGVyKSBpcyB0cnVlIGZvciBhbGxcbiAgICAvLyBvdGhlci4gVGhpcyByZWxpZXMgb24gdGhlIGZ1bmN0aW9uIGZuIHRvIGJlIHRyYW5zaXRpdmUuXG4gICAgLy9cbiAgICAvLyBtb21lbnRzIHNob3VsZCBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMgb3IgYW4gYXJyYXksIHdob3NlXG4gICAgLy8gZmlyc3QgZWxlbWVudCBpcyBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cy5cbiAgICBmdW5jdGlvbiBwaWNrQnkoZm4sIG1vbWVudHMpIHtcbiAgICAgICAgdmFyIHJlcywgaTtcbiAgICAgICAgaWYgKG1vbWVudHMubGVuZ3RoID09PSAxICYmIGlzQXJyYXkobW9tZW50c1swXSkpIHtcbiAgICAgICAgICAgIG1vbWVudHMgPSBtb21lbnRzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcyA9IG1vbWVudHNbMF07XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBtb21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudHNbaV0uaXNWYWxpZCgpIHx8IG1vbWVudHNbaV1bZm5dKHJlcykpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBtb21lbnRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXNlIFtdLnNvcnQgaW5zdGVhZD9cbiAgICBmdW5jdGlvbiBtaW4oKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQmVmb3JlJywgYXJncyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF4KCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0FmdGVyJywgYXJncyk7XG4gICAgfVxuXG4gICAgdmFyIG5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIERhdGUubm93ID8gRGF0ZS5ub3coKSA6ICtuZXcgRGF0ZSgpO1xuICAgIH07XG5cbiAgICB2YXIgb3JkZXJpbmcgPSBbXG4gICAgICAgICd5ZWFyJyxcbiAgICAgICAgJ3F1YXJ0ZXInLFxuICAgICAgICAnbW9udGgnLFxuICAgICAgICAnd2VlaycsXG4gICAgICAgICdkYXknLFxuICAgICAgICAnaG91cicsXG4gICAgICAgICdtaW51dGUnLFxuICAgICAgICAnc2Vjb25kJyxcbiAgICAgICAgJ21pbGxpc2Vjb25kJyxcbiAgICBdO1xuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvblZhbGlkKG0pIHtcbiAgICAgICAgdmFyIGtleSxcbiAgICAgICAgICAgIHVuaXRIYXNEZWNpbWFsID0gZmFsc2UsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgb3JkZXJMZW4gPSBvcmRlcmluZy5sZW5ndGg7XG4gICAgICAgIGZvciAoa2V5IGluIG0pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBoYXNPd25Qcm9wKG0sIGtleSkgJiZcbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICBpbmRleE9mLmNhbGwob3JkZXJpbmcsIGtleSkgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIChtW2tleV0gPT0gbnVsbCB8fCAhaXNOYU4obVtrZXldKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXJMZW47ICsraSkge1xuICAgICAgICAgICAgaWYgKG1bb3JkZXJpbmdbaV1dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVuaXRIYXNEZWNpbWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gb25seSBhbGxvdyBub24taW50ZWdlcnMgZm9yIHNtYWxsZXN0IHVuaXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQobVtvcmRlcmluZ1tpXV0pICE9PSB0b0ludChtW29yZGVyaW5nW2ldXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pdEhhc0RlY2ltYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVmFsaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW52YWxpZCQxKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oTmFOKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBEdXJhdGlvbihkdXJhdGlvbikge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoZHVyYXRpb24pLFxuICAgICAgICAgICAgeWVhcnMgPSBub3JtYWxpemVkSW5wdXQueWVhciB8fCAwLFxuICAgICAgICAgICAgcXVhcnRlcnMgPSBub3JtYWxpemVkSW5wdXQucXVhcnRlciB8fCAwLFxuICAgICAgICAgICAgbW9udGhzID0gbm9ybWFsaXplZElucHV0Lm1vbnRoIHx8IDAsXG4gICAgICAgICAgICB3ZWVrcyA9IG5vcm1hbGl6ZWRJbnB1dC53ZWVrIHx8IG5vcm1hbGl6ZWRJbnB1dC5pc29XZWVrIHx8IDAsXG4gICAgICAgICAgICBkYXlzID0gbm9ybWFsaXplZElucHV0LmRheSB8fCAwLFxuICAgICAgICAgICAgaG91cnMgPSBub3JtYWxpemVkSW5wdXQuaG91ciB8fCAwLFxuICAgICAgICAgICAgbWludXRlcyA9IG5vcm1hbGl6ZWRJbnB1dC5taW51dGUgfHwgMCxcbiAgICAgICAgICAgIHNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQuc2Vjb25kIHx8IDAsXG4gICAgICAgICAgICBtaWxsaXNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQubWlsbGlzZWNvbmQgfHwgMDtcblxuICAgICAgICB0aGlzLl9pc1ZhbGlkID0gaXNEdXJhdGlvblZhbGlkKG5vcm1hbGl6ZWRJbnB1dCk7XG5cbiAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gZm9yIGRhdGVBZGRSZW1vdmVcbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID1cbiAgICAgICAgICAgICttaWxsaXNlY29uZHMgK1xuICAgICAgICAgICAgc2Vjb25kcyAqIDFlMyArIC8vIDEwMDBcbiAgICAgICAgICAgIG1pbnV0ZXMgKiA2ZTQgKyAvLyAxMDAwICogNjBcbiAgICAgICAgICAgIGhvdXJzICogMTAwMCAqIDYwICogNjA7IC8vdXNpbmcgMTAwMCAqIDYwICogNjAgaW5zdGVhZCBvZiAzNmU1IHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMjk3OFxuICAgICAgICAvLyBCZWNhdXNlIG9mIGRhdGVBZGRSZW1vdmUgdHJlYXRzIDI0IGhvdXJzIGFzIGRpZmZlcmVudCBmcm9tIGFcbiAgICAgICAgLy8gZGF5IHdoZW4gd29ya2luZyBhcm91bmQgRFNULCB3ZSBuZWVkIHRvIHN0b3JlIHRoZW0gc2VwYXJhdGVseVxuICAgICAgICB0aGlzLl9kYXlzID0gK2RheXMgKyB3ZWVrcyAqIDc7XG4gICAgICAgIC8vIEl0IGlzIGltcG9zc2libGUgdG8gdHJhbnNsYXRlIG1vbnRocyBpbnRvIGRheXMgd2l0aG91dCBrbm93aW5nXG4gICAgICAgIC8vIHdoaWNoIG1vbnRocyB5b3UgYXJlIGFyZSB0YWxraW5nIGFib3V0LCBzbyB3ZSBoYXZlIHRvIHN0b3JlXG4gICAgICAgIC8vIGl0IHNlcGFyYXRlbHkuXG4gICAgICAgIHRoaXMuX21vbnRocyA9ICttb250aHMgKyBxdWFydGVycyAqIDMgKyB5ZWFycyAqIDEyO1xuXG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcblxuICAgICAgICB0aGlzLl9sb2NhbGUgPSBnZXRMb2NhbGUoKTtcblxuICAgICAgICB0aGlzLl9idWJibGUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0R1cmF0aW9uKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRHVyYXRpb247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzUm91bmQobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgtMSAqIG51bWJlcikgKiAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG4gICAgZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnJheTEsIGFycmF5MiwgZG9udENvbnZlcnQpIHtcbiAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGRpZmZzID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChkb250Q29udmVydCAmJiBhcnJheTFbaV0gIT09IGFycmF5MltpXSkgfHxcbiAgICAgICAgICAgICAgICAoIWRvbnRDb252ZXJ0ICYmIHRvSW50KGFycmF5MVtpXSkgIT09IHRvSW50KGFycmF5MltpXSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBkaWZmcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaWZmcyArIGxlbmd0aERpZmY7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0KHRva2VuLCBzZXBhcmF0b3IpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnV0Y09mZnNldCgpLFxuICAgICAgICAgICAgICAgIHNpZ24gPSAnKyc7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7XG4gICAgICAgICAgICAgICAgc2lnbiA9ICctJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgc2lnbiArXG4gICAgICAgICAgICAgICAgemVyb0ZpbGwofn4ob2Zmc2V0IC8gNjApLCAyKSArXG4gICAgICAgICAgICAgICAgc2VwYXJhdG9yICtcbiAgICAgICAgICAgICAgICB6ZXJvRmlsbCh+fm9mZnNldCAlIDYwLCAyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb2Zmc2V0KCdaJywgJzonKTtcbiAgICBvZmZzZXQoJ1paJywgJycpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWicsIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1paJywgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ1onLCAnWlonXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fdXNlVVRDID0gdHJ1ZTtcbiAgICAgICAgY29uZmlnLl90em0gPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIHRpbWV6b25lIGNodW5rZXJcbiAgICAvLyAnKzEwOjAwJyA+IFsnMTAnLCAgJzAwJ11cbiAgICAvLyAnLTE1MzAnICA+IFsnLTE1JywgJzMwJ11cbiAgICB2YXIgY2h1bmtPZmZzZXQgPSAvKFtcXCtcXC1dfFxcZFxcZCkvZ2k7XG5cbiAgICBmdW5jdGlvbiBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoZXIsIHN0cmluZykge1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IChzdHJpbmcgfHwgJycpLm1hdGNoKG1hdGNoZXIpLFxuICAgICAgICAgICAgY2h1bmssXG4gICAgICAgICAgICBwYXJ0cyxcbiAgICAgICAgICAgIG1pbnV0ZXM7XG5cbiAgICAgICAgaWYgKG1hdGNoZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY2h1bmsgPSBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0gfHwgW107XG4gICAgICAgIHBhcnRzID0gKGNodW5rICsgJycpLm1hdGNoKGNodW5rT2Zmc2V0KSB8fCBbJy0nLCAwLCAwXTtcbiAgICAgICAgbWludXRlcyA9ICsocGFydHNbMV0gKiA2MCkgKyB0b0ludChwYXJ0c1syXSk7XG5cbiAgICAgICAgcmV0dXJuIG1pbnV0ZXMgPT09IDAgPyAwIDogcGFydHNbMF0gPT09ICcrJyA/IG1pbnV0ZXMgOiAtbWludXRlcztcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYSBtb21lbnQgZnJvbSBpbnB1dCwgdGhhdCBpcyBsb2NhbC91dGMvem9uZSBlcXVpdmFsZW50IHRvIG1vZGVsLlxuICAgIGZ1bmN0aW9uIGNsb25lV2l0aE9mZnNldChpbnB1dCwgbW9kZWwpIHtcbiAgICAgICAgdmFyIHJlcywgZGlmZjtcbiAgICAgICAgaWYgKG1vZGVsLl9pc1VUQykge1xuICAgICAgICAgICAgcmVzID0gbW9kZWwuY2xvbmUoKTtcbiAgICAgICAgICAgIGRpZmYgPVxuICAgICAgICAgICAgICAgIChpc01vbWVudChpbnB1dCkgfHwgaXNEYXRlKGlucHV0KVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LnZhbHVlT2YoKVxuICAgICAgICAgICAgICAgICAgICA6IGNyZWF0ZUxvY2FsKGlucHV0KS52YWx1ZU9mKCkpIC0gcmVzLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIC8vIFVzZSBsb3ctbGV2ZWwgYXBpLCBiZWNhdXNlIHRoaXMgZm4gaXMgbG93LWxldmVsIGFwaS5cbiAgICAgICAgICAgIHJlcy5fZC5zZXRUaW1lKHJlcy5fZC52YWx1ZU9mKCkgKyBkaWZmKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChyZXMsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQpLmxvY2FsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXRlT2Zmc2V0KG0pIHtcbiAgICAgICAgLy8gT24gRmlyZWZveC4yNCBEYXRlI2dldFRpbWV6b25lT2Zmc2V0IHJldHVybnMgYSBmbG9hdGluZyBwb2ludC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvcHVsbC8xODcxXG4gICAgICAgIHJldHVybiAtTWF0aC5yb3VuZChtLl9kLmdldFRpbWV6b25lT2Zmc2V0KCkpO1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbW9tZW50IGlzIG11dGF0ZWQuXG4gICAgLy8gSXQgaXMgaW50ZW5kZWQgdG8ga2VlcCB0aGUgb2Zmc2V0IGluIHN5bmMgd2l0aCB0aGUgdGltZXpvbmUuXG4gICAgaG9va3MudXBkYXRlT2Zmc2V0ID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICAvLyBrZWVwTG9jYWxUaW1lID0gdHJ1ZSBtZWFucyBvbmx5IGNoYW5nZSB0aGUgdGltZXpvbmUsIHdpdGhvdXRcbiAgICAvLyBhZmZlY3RpbmcgdGhlIGxvY2FsIGhvdXIuIFNvIDU6MzE6MjYgKzAzMDAgLS1bdXRjT2Zmc2V0KDIsIHRydWUpXS0tPlxuICAgIC8vIDU6MzE6MjYgKzAyMDAgSXQgaXMgcG9zc2libGUgdGhhdCA1OjMxOjI2IGRvZXNuJ3QgZXhpc3Qgd2l0aCBvZmZzZXRcbiAgICAvLyArMDIwMCwgc28gd2UgYWRqdXN0IHRoZSB0aW1lIGFzIG5lZWRlZCwgdG8gYmUgdmFsaWQuXG4gICAgLy9cbiAgICAvLyBLZWVwaW5nIHRoZSB0aW1lIGFjdHVhbGx5IGFkZHMvc3VidHJhY3RzIChvbmUgaG91cilcbiAgICAvLyBmcm9tIHRoZSBhY3R1YWwgcmVwcmVzZW50ZWQgdGltZS4gVGhhdCBpcyB3aHkgd2UgY2FsbCB1cGRhdGVPZmZzZXRcbiAgICAvLyBhIHNlY29uZCB0aW1lLiBJbiBjYXNlIGl0IHdhbnRzIHVzIHRvIGNoYW5nZSB0aGUgb2Zmc2V0IGFnYWluXG4gICAgLy8gX2NoYW5nZUluUHJvZ3Jlc3MgPT0gdHJ1ZSBjYXNlLCB0aGVuIHdlIGhhdmUgdG8gYWRqdXN0LCBiZWNhdXNlXG4gICAgLy8gdGhlcmUgaXMgbm8gc3VjaCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lem9uZS5cbiAgICBmdW5jdGlvbiBnZXRTZXRPZmZzZXQoaW5wdXQsIGtlZXBMb2NhbFRpbWUsIGtlZXBNaW51dGVzKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLl9vZmZzZXQgfHwgMCxcbiAgICAgICAgICAgIGxvY2FsQWRqdXN0O1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhpbnB1dCkgPCAxNiAmJiAha2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICogNjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzVVRDICYmIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICBsb2NhbEFkanVzdCA9IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vZmZzZXQgPSBpbnB1dDtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsb2NhbEFkanVzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQobG9jYWxBZGp1c3QsICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgIGlmICgha2VlcExvY2FsVGltZSB8fCB0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFN1YnRyYWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUR1cmF0aW9uKGlucHV0IC0gb2Zmc2V0LCAnbScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/IG9mZnNldCA6IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRab25lKGlucHV0LCBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gLWlucHV0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldChpbnB1dCwga2VlcExvY2FsVGltZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC10aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9VVEMoa2VlcExvY2FsVGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9Mb2NhbChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1VUQykge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VidHJhY3QoZ2V0RGF0ZU9mZnNldCh0aGlzKSwgJ20nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0aGlzLl90em0sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5faSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhciB0Wm9uZSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hPZmZzZXQsIHRoaXMuX2kpO1xuICAgICAgICAgICAgaWYgKHRab25lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0Wm9uZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc0FsaWduZWRIb3VyT2Zmc2V0KGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dCA9IGlucHV0ID8gY3JlYXRlTG9jYWwoaW5wdXQpLnV0Y09mZnNldCgpIDogMDtcblxuICAgICAgICByZXR1cm4gKHRoaXMudXRjT2Zmc2V0KCkgLSBpbnB1dCkgJSA2MCA9PT0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoMCkudXRjT2Zmc2V0KCkgfHxcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoNSkudXRjT2Zmc2V0KClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWQoKSB7XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5faXNEU1RTaGlmdGVkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjID0ge30sXG4gICAgICAgICAgICBvdGhlcjtcblxuICAgICAgICBjb3B5Q29uZmlnKGMsIHRoaXMpO1xuICAgICAgICBjID0gcHJlcGFyZUNvbmZpZyhjKTtcblxuICAgICAgICBpZiAoYy5fYSkge1xuICAgICAgICAgICAgb3RoZXIgPSBjLl9pc1VUQyA/IGNyZWF0ZVVUQyhjLl9hKSA6IGNyZWF0ZUxvY2FsKGMuX2EpO1xuICAgICAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID1cbiAgICAgICAgICAgICAgICB0aGlzLmlzVmFsaWQoKSAmJiBjb21wYXJlQXJyYXlzKGMuX2EsIG90aGVyLnRvQXJyYXkoKSkgPiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTG9jYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/ICF0aGlzLl9pc1VUQyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXRjT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXRjKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyAmJiB0aGlzLl9vZmZzZXQgPT09IDAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBU1AuTkVUIGpzb24gZGF0ZSBmb3JtYXQgcmVnZXhcbiAgICB2YXIgYXNwTmV0UmVnZXggPSAvXigtfFxcKyk/KD86KFxcZCopWy4gXSk/KFxcZCspOihcXGQrKSg/OjooXFxkKykoXFwuXFxkKik/KT8kLyxcbiAgICAgICAgLy8gZnJvbSBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2Nsb3N1cmVfZ29vZ19kYXRlX2RhdGUuanMuc291cmNlLmh0bWxcbiAgICAgICAgLy8gc29tZXdoYXQgbW9yZSBpbiBsaW5lIHdpdGggNC40LjMuMiAyMDA0IHNwZWMsIGJ1dCBhbGxvd3MgZGVjaW1hbCBhbnl3aGVyZVxuICAgICAgICAvLyBhbmQgZnVydGhlciBtb2RpZmllZCB0byBhbGxvdyBmb3Igc3RyaW5ncyBjb250YWluaW5nIGJvdGggd2VlayBhbmQgZGF5XG4gICAgICAgIGlzb1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKC18XFwrKT9QKD86KFstK10/WzAtOSwuXSopWSk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopVyk/KD86KFstK10/WzAtOSwuXSopRCk/KD86VCg/OihbLStdP1swLTksLl0qKUgpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVMpPyk/JC87XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEdXJhdGlvbihpbnB1dCwga2V5KSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IGlucHV0LFxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgYWdhaW5zdCByZWdleHAgaXMgZXhwZW5zaXZlLCBkbyBpdCBvbiBkZW1hbmRcbiAgICAgICAgICAgIG1hdGNoID0gbnVsbCxcbiAgICAgICAgICAgIHNpZ24sXG4gICAgICAgICAgICByZXQsXG4gICAgICAgICAgICBkaWZmUmVzO1xuXG4gICAgICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbXM6IGlucHV0Ll9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICAgICAgZDogaW5wdXQuX2RheXMsXG4gICAgICAgICAgICAgICAgTTogaW5wdXQuX21vbnRocyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpIHx8ICFpc05hTigraW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uW2tleV0gPSAraW5wdXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uLm1pbGxpc2Vjb25kcyA9ICtpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgobWF0Y2ggPSBhc3BOZXRSZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSBtYXRjaFsxXSA9PT0gJy0nID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICBkOiB0b0ludChtYXRjaFtEQVRFXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIGg6IHRvSW50KG1hdGNoW0hPVVJdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbTogdG9JbnQobWF0Y2hbTUlOVVRFXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIHM6IHRvSW50KG1hdGNoW1NFQ09ORF0pICogc2lnbixcbiAgICAgICAgICAgICAgICBtczogdG9JbnQoYWJzUm91bmQobWF0Y2hbTUlMTElTRUNPTkRdICogMTAwMCkpICogc2lnbiwgLy8gdGhlIG1pbGxpc2Vjb25kIGRlY2ltYWwgcG9pbnQgaXMgaW5jbHVkZWQgaW4gdGhlIG1hdGNoXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKChtYXRjaCA9IGlzb1JlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IG1hdGNoWzFdID09PSAnLScgPyAtMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5OiBwYXJzZUlzbyhtYXRjaFsyXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgTTogcGFyc2VJc28obWF0Y2hbM10sIHNpZ24pLFxuICAgICAgICAgICAgICAgIHc6IHBhcnNlSXNvKG1hdGNoWzRdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBkOiBwYXJzZUlzbyhtYXRjaFs1XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgaDogcGFyc2VJc28obWF0Y2hbNl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIG06IHBhcnNlSXNvKG1hdGNoWzddLCBzaWduKSxcbiAgICAgICAgICAgICAgICBzOiBwYXJzZUlzbyhtYXRjaFs4XSwgc2lnbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZHVyYXRpb24gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAoJ2Zyb20nIGluIGR1cmF0aW9uIHx8ICd0bycgaW4gZHVyYXRpb24pXG4gICAgICAgICkge1xuICAgICAgICAgICAgZGlmZlJlcyA9IG1vbWVudHNEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKGR1cmF0aW9uLmZyb20pLFxuICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKGR1cmF0aW9uLnRvKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGR1cmF0aW9uLm1zID0gZGlmZlJlcy5taWxsaXNlY29uZHM7XG4gICAgICAgICAgICBkdXJhdGlvbi5NID0gZGlmZlJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXQgPSBuZXcgRHVyYXRpb24oZHVyYXRpb24pO1xuXG4gICAgICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSAmJiBoYXNPd25Qcm9wKGlucHV0LCAnX2xvY2FsZScpKSB7XG4gICAgICAgICAgICByZXQuX2xvY2FsZSA9IGlucHV0Ll9sb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkgJiYgaGFzT3duUHJvcChpbnB1dCwgJ19pc1ZhbGlkJykpIHtcbiAgICAgICAgICAgIHJldC5faXNWYWxpZCA9IGlucHV0Ll9pc1ZhbGlkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjcmVhdGVEdXJhdGlvbi5mbiA9IER1cmF0aW9uLnByb3RvdHlwZTtcbiAgICBjcmVhdGVEdXJhdGlvbi5pbnZhbGlkID0gY3JlYXRlSW52YWxpZCQxO1xuXG4gICAgZnVuY3Rpb24gcGFyc2VJc28oaW5wLCBzaWduKSB7XG4gICAgICAgIC8vIFdlJ2Qgbm9ybWFsbHkgdXNlIH5+aW5wIGZvciB0aGlzLCBidXQgdW5mb3J0dW5hdGVseSBpdCBhbHNvXG4gICAgICAgIC8vIGNvbnZlcnRzIGZsb2F0cyB0byBpbnRzLlxuICAgICAgICAvLyBpbnAgbWF5IGJlIHVuZGVmaW5lZCwgc28gY2FyZWZ1bCBjYWxsaW5nIHJlcGxhY2Ugb24gaXQuXG4gICAgICAgIHZhciByZXMgPSBpbnAgJiYgcGFyc2VGbG9hdChpbnAucmVwbGFjZSgnLCcsICcuJykpO1xuICAgICAgICAvLyBhcHBseSBzaWduIHdoaWxlIHdlJ3JlIGF0IGl0XG4gICAgICAgIHJldHVybiAoaXNOYU4ocmVzKSA/IDAgOiByZXMpICogc2lnbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXMgPSB7fTtcblxuICAgICAgICByZXMubW9udGhzID1cbiAgICAgICAgICAgIG90aGVyLm1vbnRoKCkgLSBiYXNlLm1vbnRoKCkgKyAob3RoZXIueWVhcigpIC0gYmFzZS55ZWFyKCkpICogMTI7XG4gICAgICAgIGlmIChiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJykuaXNBZnRlcihvdGhlcikpIHtcbiAgICAgICAgICAgIC0tcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSArb3RoZXIgLSArYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcztcbiAgICAgICAgaWYgKCEoYmFzZS5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbWlsbGlzZWNvbmRzOiAwLCBtb250aHM6IDAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIG90aGVyID0gY2xvbmVXaXRoT2Zmc2V0KG90aGVyLCBiYXNlKTtcbiAgICAgICAgaWYgKGJhc2UuaXNCZWZvcmUob3RoZXIpKSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2Uob3RoZXIsIGJhc2UpO1xuICAgICAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9IC1yZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgcmVzLm1vbnRocyA9IC1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiByZW1vdmUgJ25hbWUnIGFyZyBhZnRlciBkZXByZWNhdGlvbiBpcyByZW1vdmVkXG4gICAgZnVuY3Rpb24gY3JlYXRlQWRkZXIoZGlyZWN0aW9uLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBkdXIsIHRtcDtcbiAgICAgICAgICAgIC8vaW52ZXJ0IHRoZSBhcmd1bWVudHMsIGJ1dCBjb21wbGFpbiBhYm91dCBpdFxuICAgICAgICAgICAgaWYgKHBlcmlvZCAhPT0gbnVsbCAmJiAhaXNOYU4oK3BlcmlvZCkpIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUoXG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICdtb21lbnQoKS4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyhwZXJpb2QsIG51bWJlcikgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBtb21lbnQoKS4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyhudW1iZXIsIHBlcmlvZCkuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2FkZC1pbnZlcnRlZC1wYXJhbS8gZm9yIG1vcmUgaW5mby4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0bXAgPSB2YWw7XG4gICAgICAgICAgICAgICAgdmFsID0gcGVyaW9kO1xuICAgICAgICAgICAgICAgIHBlcmlvZCA9IHRtcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZHVyID0gY3JlYXRlRHVyYXRpb24odmFsLCBwZXJpb2QpO1xuICAgICAgICAgICAgYWRkU3VidHJhY3QodGhpcywgZHVyLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkU3VidHJhY3QobW9tLCBkdXJhdGlvbiwgaXNBZGRpbmcsIHVwZGF0ZU9mZnNldCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgIGRheXMgPSBhYnNSb3VuZChkdXJhdGlvbi5fZGF5cyksXG4gICAgICAgICAgICBtb250aHMgPSBhYnNSb3VuZChkdXJhdGlvbi5fbW9udGhzKTtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVPZmZzZXQgPSB1cGRhdGVPZmZzZXQgPT0gbnVsbCA/IHRydWUgOiB1cGRhdGVPZmZzZXQ7XG5cbiAgICAgICAgaWYgKG1vbnRocykge1xuICAgICAgICAgICAgc2V0TW9udGgobW9tLCBnZXQobW9tLCAnTW9udGgnKSArIG1vbnRocyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5cykge1xuICAgICAgICAgICAgc2V0JDEobW9tLCAnRGF0ZScsIGdldChtb20sICdEYXRlJykgKyBkYXlzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIG1vbS5fZC5zZXRUaW1lKG1vbS5fZC52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZU9mZnNldCkge1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KG1vbSwgZGF5cyB8fCBtb250aHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFkZCA9IGNyZWF0ZUFkZGVyKDEsICdhZGQnKSxcbiAgICAgICAgc3VidHJhY3QgPSBjcmVhdGVBZGRlcigtMSwgJ3N1YnRyYWN0Jyk7XG5cbiAgICBmdW5jdGlvbiBpc1N0cmluZyhpbnB1dCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZztcbiAgICB9XG5cbiAgICAvLyB0eXBlIE1vbWVudElucHV0ID0gTW9tZW50IHwgRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBNb21lbnRJbnB1dE9iamVjdCB8IHZvaWQ7IC8vIG51bGwgfCB1bmRlZmluZWRcbiAgICBmdW5jdGlvbiBpc01vbWVudElucHV0KGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc01vbWVudChpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzRGF0ZShpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzU3RyaW5nKGlucHV0KSB8fFxuICAgICAgICAgICAgaXNOdW1iZXIoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc051bWJlck9yU3RyaW5nQXJyYXkoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc01vbWVudElucHV0T2JqZWN0KGlucHV0KSB8fFxuICAgICAgICAgICAgaW5wdXQgPT09IG51bGwgfHxcbiAgICAgICAgICAgIGlucHV0ID09PSB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudElucHV0T2JqZWN0KGlucHV0KSB7XG4gICAgICAgIHZhciBvYmplY3RUZXN0ID0gaXNPYmplY3QoaW5wdXQpICYmICFpc09iamVjdEVtcHR5KGlucHV0KSxcbiAgICAgICAgICAgIHByb3BlcnR5VGVzdCA9IGZhbHNlLFxuICAgICAgICAgICAgcHJvcGVydGllcyA9IFtcbiAgICAgICAgICAgICAgICAneWVhcnMnLFxuICAgICAgICAgICAgICAgICd5ZWFyJyxcbiAgICAgICAgICAgICAgICAneScsXG4gICAgICAgICAgICAgICAgJ21vbnRocycsXG4gICAgICAgICAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgICAgICAgICAnTScsXG4gICAgICAgICAgICAgICAgJ2RheXMnLFxuICAgICAgICAgICAgICAgICdkYXknLFxuICAgICAgICAgICAgICAgICdkJyxcbiAgICAgICAgICAgICAgICAnZGF0ZXMnLFxuICAgICAgICAgICAgICAgICdkYXRlJyxcbiAgICAgICAgICAgICAgICAnRCcsXG4gICAgICAgICAgICAgICAgJ2hvdXJzJyxcbiAgICAgICAgICAgICAgICAnaG91cicsXG4gICAgICAgICAgICAgICAgJ2gnLFxuICAgICAgICAgICAgICAgICdtaW51dGVzJyxcbiAgICAgICAgICAgICAgICAnbWludXRlJyxcbiAgICAgICAgICAgICAgICAnbScsXG4gICAgICAgICAgICAgICAgJ3NlY29uZHMnLFxuICAgICAgICAgICAgICAgICdzZWNvbmQnLFxuICAgICAgICAgICAgICAgICdzJyxcbiAgICAgICAgICAgICAgICAnbWlsbGlzZWNvbmRzJyxcbiAgICAgICAgICAgICAgICAnbWlsbGlzZWNvbmQnLFxuICAgICAgICAgICAgICAgICdtcycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgcHJvcGVydHlMZW4gPSBwcm9wZXJ0aWVzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcGVydHlMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgcHJvcGVydHlUZXN0ID0gcHJvcGVydHlUZXN0IHx8IGhhc093blByb3AoaW5wdXQsIHByb3BlcnR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYmplY3RUZXN0ICYmIHByb3BlcnR5VGVzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc051bWJlck9yU3RyaW5nQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgdmFyIGFycmF5VGVzdCA9IGlzQXJyYXkoaW5wdXQpLFxuICAgICAgICAgICAgZGF0YVR5cGVUZXN0ID0gZmFsc2U7XG4gICAgICAgIGlmIChhcnJheVRlc3QpIHtcbiAgICAgICAgICAgIGRhdGFUeXBlVGVzdCA9XG4gICAgICAgICAgICAgICAgaW5wdXQuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNOdW1iZXIoaXRlbSkgJiYgaXNTdHJpbmcoaW5wdXQpO1xuICAgICAgICAgICAgICAgIH0pLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXlUZXN0ICYmIGRhdGFUeXBlVGVzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0NhbGVuZGFyU3BlYyhpbnB1dCkge1xuICAgICAgICB2YXIgb2JqZWN0VGVzdCA9IGlzT2JqZWN0KGlucHV0KSAmJiAhaXNPYmplY3RFbXB0eShpbnB1dCksXG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAgICAgJ3NhbWVEYXknLFxuICAgICAgICAgICAgICAgICduZXh0RGF5JyxcbiAgICAgICAgICAgICAgICAnbGFzdERheScsXG4gICAgICAgICAgICAgICAgJ25leHRXZWVrJyxcbiAgICAgICAgICAgICAgICAnbGFzdFdlZWsnLFxuICAgICAgICAgICAgICAgICdzYW1lRWxzZScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHByb3BlcnR5O1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBwcm9wZXJ0eVRlc3QgfHwgaGFzT3duUHJvcChpbnB1dCwgcHJvcGVydHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9iamVjdFRlc3QgJiYgcHJvcGVydHlUZXN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENhbGVuZGFyRm9ybWF0KG15TW9tZW50LCBub3cpIHtcbiAgICAgICAgdmFyIGRpZmYgPSBteU1vbWVudC5kaWZmKG5vdywgJ2RheXMnLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGRpZmYgPCAtNlxuICAgICAgICAgICAgPyAnc2FtZUVsc2UnXG4gICAgICAgICAgICA6IGRpZmYgPCAtMVxuICAgICAgICAgICAgICA/ICdsYXN0V2VlaydcbiAgICAgICAgICAgICAgOiBkaWZmIDwgMFxuICAgICAgICAgICAgICAgID8gJ2xhc3REYXknXG4gICAgICAgICAgICAgICAgOiBkaWZmIDwgMVxuICAgICAgICAgICAgICAgICAgPyAnc2FtZURheSdcbiAgICAgICAgICAgICAgICAgIDogZGlmZiA8IDJcbiAgICAgICAgICAgICAgICAgICAgPyAnbmV4dERheSdcbiAgICAgICAgICAgICAgICAgICAgOiBkaWZmIDwgN1xuICAgICAgICAgICAgICAgICAgICAgID8gJ25leHRXZWVrJ1xuICAgICAgICAgICAgICAgICAgICAgIDogJ3NhbWVFbHNlJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciQxKHRpbWUsIGZvcm1hdHMpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBmb3Igc2luZ2xlIHBhcmFtZXRlciwgZm9ybWF0cyBvbmx5IG92ZXJsb2FkIHRvIHRoZSBjYWxlbmRhciBmdW5jdGlvblxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKCFhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICB0aW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvcm1hdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTW9tZW50SW5wdXQoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgICAgIHRpbWUgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICAgICAgZm9ybWF0cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDYWxlbmRhclNwZWMoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgICAgIGZvcm1hdHMgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICAgICAgdGltZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSB3YW50IHRvIGNvbXBhcmUgdGhlIHN0YXJ0IG9mIHRvZGF5LCB2cyB0aGlzLlxuICAgICAgICAvLyBHZXR0aW5nIHN0YXJ0LW9mLXRvZGF5IGRlcGVuZHMgb24gd2hldGhlciB3ZSdyZSBsb2NhbC91dGMvb2Zmc2V0IG9yIG5vdC5cbiAgICAgICAgdmFyIG5vdyA9IHRpbWUgfHwgY3JlYXRlTG9jYWwoKSxcbiAgICAgICAgICAgIHNvZCA9IGNsb25lV2l0aE9mZnNldChub3csIHRoaXMpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgZm9ybWF0ID0gaG9va3MuY2FsZW5kYXJGb3JtYXQodGhpcywgc29kKSB8fCAnc2FtZUVsc2UnLFxuICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICBmb3JtYXRzICYmXG4gICAgICAgICAgICAgICAgKGlzRnVuY3Rpb24oZm9ybWF0c1tmb3JtYXRdKVxuICAgICAgICAgICAgICAgICAgICA/IGZvcm1hdHNbZm9ybWF0XS5jYWxsKHRoaXMsIG5vdylcbiAgICAgICAgICAgICAgICAgICAgOiBmb3JtYXRzW2Zvcm1hdF0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChcbiAgICAgICAgICAgIG91dHB1dCB8fCB0aGlzLmxvY2FsZURhdGEoKS5jYWxlbmRhcihmb3JtYXQsIHRoaXMsIGNyZWF0ZUxvY2FsKG5vdykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50KHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQWZ0ZXIoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID4gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxJbnB1dC52YWx1ZU9mKCkgPCB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZWZvcmUoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmV0d2Vlbihmcm9tLCB0bywgdW5pdHMsIGluY2x1c2l2aXR5KSB7XG4gICAgICAgIHZhciBsb2NhbEZyb20gPSBpc01vbWVudChmcm9tKSA/IGZyb20gOiBjcmVhdGVMb2NhbChmcm9tKSxcbiAgICAgICAgICAgIGxvY2FsVG8gPSBpc01vbWVudCh0bykgPyB0byA6IGNyZWF0ZUxvY2FsKHRvKTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxGcm9tLmlzVmFsaWQoKSAmJiBsb2NhbFRvLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpbmNsdXNpdml0eSA9IGluY2x1c2l2aXR5IHx8ICcoKSc7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoaW5jbHVzaXZpdHlbMF0gPT09ICcoJ1xuICAgICAgICAgICAgICAgID8gdGhpcy5pc0FmdGVyKGxvY2FsRnJvbSwgdW5pdHMpXG4gICAgICAgICAgICAgICAgOiAhdGhpcy5pc0JlZm9yZShsb2NhbEZyb20sIHVuaXRzKSkgJiZcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVsxXSA9PT0gJyknXG4gICAgICAgICAgICAgICAgPyB0aGlzLmlzQmVmb3JlKGxvY2FsVG8sIHVuaXRzKVxuICAgICAgICAgICAgICAgIDogIXRoaXMuaXNBZnRlcihsb2NhbFRvLCB1bml0cykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpLFxuICAgICAgICAgICAgaW5wdXRNcztcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cykgfHwgJ21pbGxpc2Vjb25kJztcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPT09IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXRNcyA9IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpIDw9IGlucHV0TXMgJiZcbiAgICAgICAgICAgICAgICBpbnB1dE1zIDw9IHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JBZnRlcihpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lKGlucHV0LCB1bml0cykgfHwgdGhpcy5pc0FmdGVyKGlucHV0LCB1bml0cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JCZWZvcmUoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaWZmKGlucHV0LCB1bml0cywgYXNGbG9hdCkge1xuICAgICAgICB2YXIgdGhhdCwgem9uZURlbHRhLCBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KSAvIDEyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KSAvIDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAxZTM7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDBcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDZlNDtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMzZlNTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0IC0gem9uZURlbHRhKSAvIDg2NGU1O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MCAqIDI0LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MCAqIDI0ICogNywgbmVnYXRlIGRzdFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGlzIC0gdGhhdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhc0Zsb2F0ID8gb3V0cHV0IDogYWJzRmxvb3Iob3V0cHV0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aERpZmYoYSwgYikge1xuICAgICAgICBpZiAoYS5kYXRlKCkgPCBiLmRhdGUoKSkge1xuICAgICAgICAgICAgLy8gZW5kLW9mLW1vbnRoIGNhbGN1bGF0aW9ucyB3b3JrIGNvcnJlY3Qgd2hlbiB0aGUgc3RhcnQgbW9udGggaGFzIG1vcmVcbiAgICAgICAgICAgIC8vIGRheXMgdGhhbiB0aGUgZW5kIG1vbnRoLlxuICAgICAgICAgICAgcmV0dXJuIC1tb250aERpZmYoYiwgYSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlmZmVyZW5jZSBpbiBtb250aHNcbiAgICAgICAgdmFyIHdob2xlTW9udGhEaWZmID0gKGIueWVhcigpIC0gYS55ZWFyKCkpICogMTIgKyAoYi5tb250aCgpIC0gYS5tb250aCgpKSxcbiAgICAgICAgICAgIC8vIGIgaXMgaW4gKGFuY2hvciAtIDEgbW9udGgsIGFuY2hvciArIDEgbW9udGgpXG4gICAgICAgICAgICBhbmNob3IgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmLCAnbW9udGhzJyksXG4gICAgICAgICAgICBhbmNob3IyLFxuICAgICAgICAgICAgYWRqdXN0O1xuXG4gICAgICAgIGlmIChiIC0gYW5jaG9yIDwgMCkge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgLSAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvciAtIGFuY2hvcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgKyAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvcjIgLSBhbmNob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBmb3IgbmVnYXRpdmUgemVybywgcmV0dXJuIHplcm8gaWYgbmVnYXRpdmUgemVyb1xuICAgICAgICByZXR1cm4gLSh3aG9sZU1vbnRoRGlmZiArIGFkanVzdCkgfHwgMDtcbiAgICB9XG5cbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0VXRjID0gJ1lZWVktTU0tRERUSEg6bW06c3NbWl0nO1xuXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKCdlbicpLmZvcm1hdCgnZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWlonKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0lTT1N0cmluZyhrZWVwT2Zmc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1dGMgPSBrZWVwT2Zmc2V0ICE9PSB0cnVlLFxuICAgICAgICAgICAgbSA9IHV0YyA/IHRoaXMuY2xvbmUoKS51dGMoKSA6IHRoaXM7XG4gICAgICAgIGlmIChtLnllYXIoKSA8IDAgfHwgbS55ZWFyKCkgPiA5OTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KFxuICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgdXRjXG4gICAgICAgICAgICAgICAgICAgID8gJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXSdcbiAgICAgICAgICAgICAgICAgICAgOiAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpKSB7XG4gICAgICAgICAgICAvLyBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgfjUweCBmYXN0ZXIsIHVzZSBpdCB3aGVuIHdlIGNhblxuICAgICAgICAgICAgaWYgKHV0Yykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSArIHRoaXMudXRjT2Zmc2V0KCkgKiA2MCAqIDEwMDApXG4gICAgICAgICAgICAgICAgICAgIC50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdaJywgZm9ybWF0TW9tZW50KG0sICdaJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXRNb21lbnQoXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgdXRjID8gJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nIDogJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gICAgICogYWxzbyBiZSBldmFsdWF0ZWQgdG8gZ2V0IGEgbmV3IG1vbWVudCB3aGljaCBpcyB0aGUgc2FtZVxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ21vbWVudC5pbnZhbGlkKC8qICcgKyB0aGlzLl9pICsgJyAqLyknO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdW5jID0gJ21vbWVudCcsXG4gICAgICAgICAgICB6b25lID0gJycsXG4gICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICB5ZWFyLFxuICAgICAgICAgICAgZGF0ZXRpbWUsXG4gICAgICAgICAgICBzdWZmaXg7XG4gICAgICAgIGlmICghdGhpcy5pc0xvY2FsKCkpIHtcbiAgICAgICAgICAgIGZ1bmMgPSB0aGlzLnV0Y09mZnNldCgpID09PSAwID8gJ21vbWVudC51dGMnIDogJ21vbWVudC5wYXJzZVpvbmUnO1xuICAgICAgICAgICAgem9uZSA9ICdaJztcbiAgICAgICAgfVxuICAgICAgICBwcmVmaXggPSAnWycgKyBmdW5jICsgJyhcIl0nO1xuICAgICAgICB5ZWFyID0gMCA8PSB0aGlzLnllYXIoKSAmJiB0aGlzLnllYXIoKSA8PSA5OTk5ID8gJ1lZWVknIDogJ1lZWVlZWSc7XG4gICAgICAgIGRhdGV0aW1lID0gJy1NTS1ERFtUXUhIOm1tOnNzLlNTUyc7XG4gICAgICAgIHN1ZmZpeCA9IHpvbmUgKyAnW1wiKV0nO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChwcmVmaXggKyB5ZWFyICsgZGF0ZXRpbWUgKyBzdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdChpbnB1dFN0cmluZykge1xuICAgICAgICBpZiAoIWlucHV0U3RyaW5nKSB7XG4gICAgICAgICAgICBpbnB1dFN0cmluZyA9IHRoaXMuaXNVdGMoKVxuICAgICAgICAgICAgICAgID8gaG9va3MuZGVmYXVsdEZvcm1hdFV0Y1xuICAgICAgICAgICAgICAgIDogaG9va3MuZGVmYXVsdEZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0TW9tZW50KHRoaXMsIGlucHV0U3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8IGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oeyB0bzogdGhpcywgZnJvbTogdGltZSB9KVxuICAgICAgICAgICAgICAgIC5sb2NhbGUodGhpcy5sb2NhbGUoKSlcbiAgICAgICAgICAgICAgICAuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tTm93KHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbShjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0byh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fCBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHsgZnJvbTogdGhpcywgdG86IHRpbWUgfSlcbiAgICAgICAgICAgICAgICAubG9jYWxlKHRoaXMubG9jYWxlKCkpXG4gICAgICAgICAgICAgICAgLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9Ob3cod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50byhjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBsb2NhbGUoa2V5KSB7XG4gICAgICAgIHZhciBuZXdMb2NhbGVEYXRhO1xuXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xvY2FsZURhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChuZXdMb2NhbGVEYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSBuZXdMb2NhbGVEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGFuZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLmxhbmcoKSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgbW9tZW50KCkubG9jYWxlRGF0YSgpIHRvIGdldCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbi4gVXNlIG1vbWVudCgpLmxvY2FsZSgpIHRvIGNoYW5nZSBsYW5ndWFnZXMuJyxcbiAgICAgICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIHZhciBNU19QRVJfU0VDT05EID0gMTAwMCxcbiAgICAgICAgTVNfUEVSX01JTlVURSA9IDYwICogTVNfUEVSX1NFQ09ORCxcbiAgICAgICAgTVNfUEVSX0hPVVIgPSA2MCAqIE1TX1BFUl9NSU5VVEUsXG4gICAgICAgIE1TX1BFUl80MDBfWUVBUlMgPSAoMzY1ICogNDAwICsgOTcpICogMjQgKiBNU19QRVJfSE9VUjtcblxuICAgIC8vIGFjdHVhbCBtb2R1bG8gLSBoYW5kbGVzIG5lZ2F0aXZlIG51bWJlcnMgKGZvciBkYXRlcyBiZWZvcmUgMTk3MCk6XG4gICAgZnVuY3Rpb24gbW9kJDEoZGl2aWRlbmQsIGRpdmlzb3IpIHtcbiAgICAgICAgcmV0dXJuICgoZGl2aWRlbmQgJSBkaXZpc29yKSArIGRpdmlzb3IpICUgZGl2aXNvcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbFN0YXJ0T2ZEYXRlKHksIG0sIGQpIHtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkKSAtIE1TX1BFUl80MDBfWUVBUlM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSwgbSwgZCkudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRjU3RhcnRPZkRhdGUoeSwgbSwgZCkge1xuICAgICAgICAvLyBEYXRlLlVUQyByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgcmV0dXJuIERhdGUuVVRDKHkgKyA0MDAsIG0sIGQpIC0gTVNfUEVSXzQwMF9ZRUFSUztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlLlVUQyh5LCBtLCBkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXJ0T2YodW5pdHMpIHtcbiAgICAgICAgdmFyIHRpbWUsIHN0YXJ0T2ZEYXRlO1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcgfHwgIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0T2ZEYXRlID0gdGhpcy5faXNVVEMgPyB1dGNTdGFydE9mRGF0ZSA6IGxvY2FsU3RhcnRPZkRhdGU7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCAwLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSAtICh0aGlzLm1vbnRoKCkgJSAzKSxcbiAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCksIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUoKSAtIHRoaXMud2Vla2RheSgpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSAodGhpcy5pc29XZWVrZGF5KCkgLSAxKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCksIHRoaXMuZGF0ZSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKFxuICAgICAgICAgICAgICAgICAgICB0aW1lICsgKHRoaXMuX2lzVVRDID8gMCA6IHRoaXMudXRjT2Zmc2V0KCkgKiBNU19QRVJfTUlOVVRFKSxcbiAgICAgICAgICAgICAgICAgICAgTVNfUEVSX0hPVVJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSAtPSBtb2QkMSh0aW1lLCBNU19QRVJfTUlOVVRFKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEodGltZSwgTVNfUEVSX1NFQ09ORCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kLnNldFRpbWUodGltZSk7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5kT2YodW5pdHMpIHtcbiAgICAgICAgdmFyIHRpbWUsIHN0YXJ0T2ZEYXRlO1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcgfHwgIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0T2ZEYXRlID0gdGhpcy5faXNVVEMgPyB1dGNTdGFydE9mRGF0ZSA6IGxvY2FsU3RhcnRPZkRhdGU7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpICsgMSwgMCwgMSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICAgICAgdGltZSA9XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCkgLSAodGhpcy5tb250aCgpICUgMykgKyAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICApIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSArIDEsIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgICAgICAgICBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSB0aGlzLndlZWtkYXkoKSArIDdcbiAgICAgICAgICAgICAgICAgICAgKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpc29XZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gKHRoaXMuaXNvV2Vla2RheSgpIC0gMSkgKyA3XG4gICAgICAgICAgICAgICAgICAgICkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSArIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9XG4gICAgICAgICAgICAgICAgICAgIE1TX1BFUl9IT1VSIC1cbiAgICAgICAgICAgICAgICAgICAgbW9kJDEoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lICsgKHRoaXMuX2lzVVRDID8gMCA6IHRoaXMudXRjT2Zmc2V0KCkgKiBNU19QRVJfTUlOVVRFKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE1TX1BFUl9IT1VSXG4gICAgICAgICAgICAgICAgICAgICkgLVxuICAgICAgICAgICAgICAgICAgICAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSArPSBNU19QRVJfTUlOVVRFIC0gbW9kJDEodGltZSwgTVNfUEVSX01JTlVURSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSArPSBNU19QRVJfU0VDT05EIC0gbW9kJDEodGltZSwgTVNfUEVSX1NFQ09ORCkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZC5zZXRUaW1lKHRpbWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kLnZhbHVlT2YoKSAtICh0aGlzLl9vZmZzZXQgfHwgMCkgKiA2MDAwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bml4KCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0FycmF5KCkge1xuICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBtLnllYXIoKSxcbiAgICAgICAgICAgIG0ubW9udGgoKSxcbiAgICAgICAgICAgIG0uZGF0ZSgpLFxuICAgICAgICAgICAgbS5ob3VyKCksXG4gICAgICAgICAgICBtLm1pbnV0ZSgpLFxuICAgICAgICAgICAgbS5zZWNvbmQoKSxcbiAgICAgICAgICAgIG0ubWlsbGlzZWNvbmQoKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcnM6IG0ueWVhcigpLFxuICAgICAgICAgICAgbW9udGhzOiBtLm1vbnRoKCksXG4gICAgICAgICAgICBkYXRlOiBtLmRhdGUoKSxcbiAgICAgICAgICAgIGhvdXJzOiBtLmhvdXJzKCksXG4gICAgICAgICAgICBtaW51dGVzOiBtLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHNlY29uZHM6IG0uc2Vjb25kcygpLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzOiBtLm1pbGxpc2Vjb25kcygpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgICAgLy8gbmV3IERhdGUoTmFOKS50b0pTT04oKSA9PT0gbnVsbFxuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMigpIHtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBnZXRQYXJzaW5nRmxhZ3ModGhpcykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludmFsaWRBdCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcnNpbmdGbGFncyh0aGlzKS5vdmVyZmxvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGlvbkRhdGEoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnB1dDogdGhpcy5faSxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5fZixcbiAgICAgICAgICAgIGxvY2FsZTogdGhpcy5fbG9jYWxlLFxuICAgICAgICAgICAgaXNVVEM6IHRoaXMuX2lzVVRDLFxuICAgICAgICAgICAgc3RyaWN0OiB0aGlzLl9zdHJpY3QsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ04nLCAwLCAwLCAnZXJhQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTicsIDAsIDAsICdlcmFBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OTicsIDAsIDAsICdlcmFBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OTk4nLCAwLCAwLCAnZXJhTmFtZScpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTk5OTicsIDAsIDAsICdlcmFOYXJyb3cnKTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5JywgMV0sICd5bycsICdlcmFZZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3l5JywgMl0sIDAsICdlcmFZZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3l5eScsIDNdLCAwLCAnZXJhWWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5eXl5JywgNF0sIDAsICdlcmFZZWFyJyk7XG5cbiAgICBhZGRSZWdleFRva2VuKCdOJywgbWF0Y2hFcmFBYmJyKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTicsIG1hdGNoRXJhQWJicik7XG4gICAgYWRkUmVnZXhUb2tlbignTk5OJywgbWF0Y2hFcmFBYmJyKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTk5OJywgbWF0Y2hFcmFOYW1lKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTk5OTicsIG1hdGNoRXJhTmFycm93KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oXG4gICAgICAgIFsnTicsICdOTicsICdOTk4nLCAnTk5OTicsICdOTk5OTiddLFxuICAgICAgICBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICB2YXIgZXJhID0gY29uZmlnLl9sb2NhbGUuZXJhc1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgICAgICAgICAgaWYgKGVyYSkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVyYSA9IGVyYTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZEVyYSA9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3knLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5eScsIG1hdGNoVW5zaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3l5eScsIG1hdGNoVW5zaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3l5eXknLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5bycsIG1hdGNoRXJhWWVhck9yZGluYWwpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ3knLCAneXknLCAneXl5JywgJ3l5eXknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ3lvJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIG1hdGNoO1xuICAgICAgICBpZiAoY29uZmlnLl9sb2NhbGUuX2VyYVllYXJPcmRpbmFsUmVnZXgpIHtcbiAgICAgICAgICAgIG1hdGNoID0gaW5wdXQubWF0Y2goY29uZmlnLl9sb2NhbGUuX2VyYVllYXJPcmRpbmFsUmVnZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fbG9jYWxlLmVyYVllYXJPcmRpbmFsUGFyc2UpIHtcbiAgICAgICAgICAgIGFycmF5W1lFQVJdID0gY29uZmlnLl9sb2NhbGUuZXJhWWVhck9yZGluYWxQYXJzZShpbnB1dCwgbWF0Y2gpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlbWUVBUl0gPSBwYXJzZUludChpbnB1dCwgMTApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVFcmFzKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMuX2VyYXMgfHwgZ2V0TG9jYWxlKCdlbicpLl9lcmFzO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGVyYXNbaV0uc2luY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICAgICAgICAgIGRhdGUgPSBob29rcyhlcmFzW2ldLnNpbmNlKS5zdGFydE9mKCdkYXknKTtcbiAgICAgICAgICAgICAgICAgICAgZXJhc1tpXS5zaW5jZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgZXJhc1tpXS51bnRpbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0udW50aWwgPSArSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGhvb2tzKGVyYXNbaV0udW50aWwpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgZXJhc1tpXS51bnRpbCA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJhcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVFcmFzUGFyc2UoZXJhTmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMuZXJhcygpLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGFiYnIsXG4gICAgICAgICAgICBuYXJyb3c7XG4gICAgICAgIGVyYU5hbWUgPSBlcmFOYW1lLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBuYW1lID0gZXJhc1tpXS5uYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBhYmJyID0gZXJhc1tpXS5hYmJyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBuYXJyb3cgPSBlcmFzW2ldLm5hcnJvdy50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk5OJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYmJyID09PSBlcmFOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTk5OJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBlcmFOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTk5OTic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFycm93ID09PSBlcmFOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFtuYW1lLCBhYmJyLCBuYXJyb3ddLmluZGV4T2YoZXJhTmFtZSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlRXJhc0NvbnZlcnRZZWFyKGVyYSwgeWVhcikge1xuICAgICAgICB2YXIgZGlyID0gZXJhLnNpbmNlIDw9IGVyYS51bnRpbCA/ICsxIDogLTE7XG4gICAgICAgIGlmICh5ZWFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBob29rcyhlcmEuc2luY2UpLnllYXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBob29rcyhlcmEuc2luY2UpLnllYXIoKSArICh5ZWFyIC0gZXJhLm9mZnNldCkgKiBkaXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFcmFOYW1lKCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5sb2NhbGVEYXRhKCkuZXJhcygpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnNpbmNlIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS51bnRpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJhc1tpXS51bnRpbCA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0uc2luY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYU5hcnJvdygpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoZXJhc1tpXS5zaW5jZSA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5uYXJyb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJhc1tpXS51bnRpbCA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0uc2luY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5uYXJyb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhQWJicigpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoZXJhc1tpXS5zaW5jZSA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5hYmJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0uYWJicjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFcmFZZWFyKCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBkaXIsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5sb2NhbGVEYXRhKCkuZXJhcygpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIGRpciA9IGVyYXNbaV0uc2luY2UgPD0gZXJhc1tpXS51bnRpbCA/ICsxIDogLTE7XG5cbiAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoZXJhc1tpXS5zaW5jZSA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0udW50aWwpIHx8XG4gICAgICAgICAgICAgICAgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMueWVhcigpIC0gaG9va3MoZXJhc1tpXS5zaW5jZSkueWVhcigpKSAqIGRpciArXG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0ub2Zmc2V0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcmFzTmFtZVJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX2VyYXNOYW1lUmVnZXgnKSkge1xuICAgICAgICAgICAgY29tcHV0ZUVyYXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1N0cmljdCA/IHRoaXMuX2VyYXNOYW1lUmVnZXggOiB0aGlzLl9lcmFzUmVnZXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJhc0FiYnJSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19lcmFzQWJiclJlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVFcmFzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgPyB0aGlzLl9lcmFzQWJiclJlZ2V4IDogdGhpcy5fZXJhc1JlZ2V4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVyYXNOYXJyb3dSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19lcmFzTmFycm93UmVnZXgnKSkge1xuICAgICAgICAgICAgY29tcHV0ZUVyYXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1N0cmljdCA/IHRoaXMuX2VyYXNOYXJyb3dSZWdleCA6IHRoaXMuX2VyYXNSZWdleDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYUFiYnIoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmVyYXNBYmJyUmVnZXgoaXNTdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhTmFtZShpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZXJhc05hbWVSZWdleChpc1N0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hFcmFOYXJyb3coaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmVyYXNOYXJyb3dSZWdleChpc1N0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hFcmFZZWFyT3JkaW5hbChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuX2VyYVllYXJPcmRpbmFsUmVnZXggfHwgbWF0Y2hVbnNpZ25lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlRXJhc1BhcnNlKCkge1xuICAgICAgICB2YXIgYWJiclBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbmFtZVBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbmFycm93UGllY2VzID0gW10sXG4gICAgICAgICAgICBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBlcmFzTmFtZSxcbiAgICAgICAgICAgIGVyYXNBYmJyLFxuICAgICAgICAgICAgZXJhc05hcnJvdyxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmVyYXMoKTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIGVyYXNOYW1lID0gcmVnZXhFc2NhcGUoZXJhc1tpXS5uYW1lKTtcbiAgICAgICAgICAgIGVyYXNBYmJyID0gcmVnZXhFc2NhcGUoZXJhc1tpXS5hYmJyKTtcbiAgICAgICAgICAgIGVyYXNOYXJyb3cgPSByZWdleEVzY2FwZShlcmFzW2ldLm5hcnJvdyk7XG5cbiAgICAgICAgICAgIG5hbWVQaWVjZXMucHVzaChlcmFzTmFtZSk7XG4gICAgICAgICAgICBhYmJyUGllY2VzLnB1c2goZXJhc0FiYnIpO1xuICAgICAgICAgICAgbmFycm93UGllY2VzLnB1c2goZXJhc05hcnJvdyk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGVyYXNOYW1lKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2goZXJhc0FiYnIpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChlcmFzTmFycm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VyYXNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fZXJhc05hbWVSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG5hbWVQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9lcmFzQWJiclJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgYWJiclBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX2VyYXNOYXJyb3dSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbmFycm93UGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnZ2cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydHRycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBhZGRXZWVrWWVhckZvcm1hdFRva2VuKHRva2VuLCBnZXR0ZXIpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4oMCwgW3Rva2VuLCB0b2tlbi5sZW5ndGhdLCAwLCBnZXR0ZXIpO1xuICAgIH1cblxuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2cnLCAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnZycsICd3ZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0cnLCAnaXNvV2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHRycsICdpc29XZWVrWWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRycsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdnJywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0cnLCBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZycsIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHRycsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnZycsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFxuICAgICAgICBbJ2dnZ2cnLCAnZ2dnZ2cnLCAnR0dHRycsICdHR0dHRyddLFxuICAgICAgICBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDIpXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnJywgJ0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgdGhpcy53ZWVrKCksXG4gICAgICAgICAgICB0aGlzLndlZWtkYXkoKSArIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyxcbiAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyxcbiAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRveVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWtZZWFyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgdGhpcy5pc29XZWVrKCksXG4gICAgICAgICAgICB0aGlzLmlzb1dlZWtkYXkoKSxcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICA0XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIoKSB7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SVNPV2Vla3NJbklTT1dlZWtZZWFyKCkge1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy5pc29XZWVrWWVhcigpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRXZWVrc0luWWVhcigpIHtcbiAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgd2Vla0luZm8uZG93LCB3ZWVrSW5mby5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFdlZWtzSW5XZWVrWWVhcigpIHtcbiAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLndlZWtZZWFyKCksIHdlZWtJbmZvLmRvdywgd2Vla0luZm8uZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhckhlbHBlcihpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtzVGFyZ2V0O1xuICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIodGhpcywgZG93LCBkb3kpLnllYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3ZWVrc1RhcmdldCA9IHdlZWtzSW5ZZWFyKGlucHV0LCBkb3csIGRveSk7XG4gICAgICAgICAgICBpZiAod2VlayA+IHdlZWtzVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgd2VlayA9IHdlZWtzVGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNldFdlZWtBbGwuY2FsbCh0aGlzLCBpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0V2Vla0FsbCh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhckRhdGEgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKGRheU9mWWVhckRhdGEueWVhciwgMCwgZGF5T2ZZZWFyRGF0YS5kYXlPZlllYXIpO1xuXG4gICAgICAgIHRoaXMueWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpO1xuICAgICAgICB0aGlzLm1vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSk7XG4gICAgICAgIHRoaXMuZGF0ZShkYXRlLmdldFVUQ0RhdGUoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdRJywgMCwgJ1FvJywgJ3F1YXJ0ZXInKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1EnLCBtYXRjaDEpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1EnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9ICh0b0ludChpbnB1dCkgLSAxKSAqIDM7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRRdWFydGVyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsXG4gICAgICAgICAgICA/IE1hdGguY2VpbCgodGhpcy5tb250aCgpICsgMSkgLyAzKVxuICAgICAgICAgICAgOiB0aGlzLm1vbnRoKChpbnB1dCAtIDEpICogMyArICh0aGlzLm1vbnRoKCkgJSAzKSk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0QnLCBbJ0REJywgMl0sICdEbycsICdkYXRlJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdERCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdEbycsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBcIm9yZGluYWxQYXJzZVwiIGZhbGxiYWNrIGluIG5leHQgbWFqb3IgcmVsZWFzZS5cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0XG4gICAgICAgICAgICA/IGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZSB8fCBsb2NhbGUuX29yZGluYWxQYXJzZVxuICAgICAgICAgICAgOiBsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50O1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0QnLCAnREQnXSwgREFURSk7XG4gICAgYWRkUGFyc2VUb2tlbignRG8nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W0RBVEVdID0gdG9JbnQoaW5wdXQubWF0Y2gobWF0Y2gxdG8yKVswXSk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0RGF5T2ZNb250aCA9IG1ha2VHZXRTZXQoJ0RhdGUnLCB0cnVlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEREQnLCBbJ0REREQnLCAzXSwgJ0RERG8nLCAnZGF5T2ZZZWFyJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEREQnLCBtYXRjaDF0bzMpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0REREQnLCBtYXRjaDMpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydEREQnLCAnRERERCddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXREYXlPZlllYXIoaW5wdXQpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhciA9XG4gICAgICAgICAgICBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgICh0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykgLSB0aGlzLmNsb25lKCkuc3RhcnRPZigneWVhcicpKSAvIDg2NGU1XG4gICAgICAgICAgICApICsgMTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBkYXlPZlllYXIgOiB0aGlzLmFkZChpbnB1dCAtIGRheU9mWWVhciwgJ2QnKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignbScsIFsnbW0nLCAyXSwgMCwgJ21pbnV0ZScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignbScsIG1hdGNoMXRvMiwgbWF0Y2gxdG8ySGFzWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignbW0nLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ20nLCAnbW0nXSwgTUlOVVRFKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRNaW51dGUgPSBtYWtlR2V0U2V0KCdNaW51dGVzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3MnLCBbJ3NzJywgMl0sIDAsICdzZWNvbmQnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3MnLCBtYXRjaDF0bzIsIG1hdGNoMXRvMkhhc1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3NzJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydzJywgJ3NzJ10sIFNFQ09ORCk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0U2Vjb25kID0gbWFrZUdldFNldCgnU2Vjb25kcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdTJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gfn4odGhpcy5taWxsaXNlY29uZCgpIC8gMTAwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1MnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gfn4odGhpcy5taWxsaXNlY29uZCgpIC8gMTApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1MnLCAzXSwgMCwgJ21pbGxpc2Vjb25kJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTJywgNF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1MnLCA1XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTJywgNl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTJywgN10sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTU1MnLCA4XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTU1NTJywgOV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDA7XG4gICAgfSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdTJywgbWF0Y2gxdG8zLCBtYXRjaDEpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTJywgbWF0Y2gxdG8zLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTUycsIG1hdGNoMXRvMywgbWF0Y2gzKTtcblxuICAgIHZhciB0b2tlbiwgZ2V0U2V0TWlsbGlzZWNvbmQ7XG4gICAgZm9yICh0b2tlbiA9ICdTU1NTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgICAgICBhZGRSZWdleFRva2VuKHRva2VuLCBtYXRjaFVuc2lnbmVkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU1zKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNSUxMSVNFQ09ORF0gPSB0b0ludCgoJzAuJyArIGlucHV0KSAqIDEwMDApO1xuICAgIH1cblxuICAgIGZvciAodG9rZW4gPSAnUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgcGFyc2VNcyk7XG4gICAgfVxuXG4gICAgZ2V0U2V0TWlsbGlzZWNvbmQgPSBtYWtlR2V0U2V0KCdNaWxsaXNlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigneicsIDAsIDAsICd6b25lQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd6eicsIDAsIDAsICd6b25lTmFtZScpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZUFiYnIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdVVEMnIDogJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZScgOiAnJztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8gPSBNb21lbnQucHJvdG90eXBlO1xuXG4gICAgcHJvdG8uYWRkID0gYWRkO1xuICAgIHByb3RvLmNhbGVuZGFyID0gY2FsZW5kYXIkMTtcbiAgICBwcm90by5jbG9uZSA9IGNsb25lO1xuICAgIHByb3RvLmRpZmYgPSBkaWZmO1xuICAgIHByb3RvLmVuZE9mID0gZW5kT2Y7XG4gICAgcHJvdG8uZm9ybWF0ID0gZm9ybWF0O1xuICAgIHByb3RvLmZyb20gPSBmcm9tO1xuICAgIHByb3RvLmZyb21Ob3cgPSBmcm9tTm93O1xuICAgIHByb3RvLnRvID0gdG87XG4gICAgcHJvdG8udG9Ob3cgPSB0b05vdztcbiAgICBwcm90by5nZXQgPSBzdHJpbmdHZXQ7XG4gICAgcHJvdG8uaW52YWxpZEF0ID0gaW52YWxpZEF0O1xuICAgIHByb3RvLmlzQWZ0ZXIgPSBpc0FmdGVyO1xuICAgIHByb3RvLmlzQmVmb3JlID0gaXNCZWZvcmU7XG4gICAgcHJvdG8uaXNCZXR3ZWVuID0gaXNCZXR3ZWVuO1xuICAgIHByb3RvLmlzU2FtZSA9IGlzU2FtZTtcbiAgICBwcm90by5pc1NhbWVPckFmdGVyID0gaXNTYW1lT3JBZnRlcjtcbiAgICBwcm90by5pc1NhbWVPckJlZm9yZSA9IGlzU2FtZU9yQmVmb3JlO1xuICAgIHByb3RvLmlzVmFsaWQgPSBpc1ZhbGlkJDI7XG4gICAgcHJvdG8ubGFuZyA9IGxhbmc7XG4gICAgcHJvdG8ubG9jYWxlID0gbG9jYWxlO1xuICAgIHByb3RvLmxvY2FsZURhdGEgPSBsb2NhbGVEYXRhO1xuICAgIHByb3RvLm1heCA9IHByb3RvdHlwZU1heDtcbiAgICBwcm90by5taW4gPSBwcm90b3R5cGVNaW47XG4gICAgcHJvdG8ucGFyc2luZ0ZsYWdzID0gcGFyc2luZ0ZsYWdzO1xuICAgIHByb3RvLnNldCA9IHN0cmluZ1NldDtcbiAgICBwcm90by5zdGFydE9mID0gc3RhcnRPZjtcbiAgICBwcm90by5zdWJ0cmFjdCA9IHN1YnRyYWN0O1xuICAgIHByb3RvLnRvQXJyYXkgPSB0b0FycmF5O1xuICAgIHByb3RvLnRvT2JqZWN0ID0gdG9PYmplY3Q7XG4gICAgcHJvdG8udG9EYXRlID0gdG9EYXRlO1xuICAgIHByb3RvLnRvSVNPU3RyaW5nID0gdG9JU09TdHJpbmc7XG4gICAgcHJvdG8uaW5zcGVjdCA9IGluc3BlY3Q7XG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5mb3IgIT0gbnVsbCkge1xuICAgICAgICBwcm90b1tTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAnTW9tZW50PCcgKyB0aGlzLmZvcm1hdCgpICsgJz4nO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBwcm90by50b0pTT04gPSB0b0pTT047XG4gICAgcHJvdG8udG9TdHJpbmcgPSB0b1N0cmluZztcbiAgICBwcm90by51bml4ID0gdW5peDtcbiAgICBwcm90by52YWx1ZU9mID0gdmFsdWVPZjtcbiAgICBwcm90by5jcmVhdGlvbkRhdGEgPSBjcmVhdGlvbkRhdGE7XG4gICAgcHJvdG8uZXJhTmFtZSA9IGdldEVyYU5hbWU7XG4gICAgcHJvdG8uZXJhTmFycm93ID0gZ2V0RXJhTmFycm93O1xuICAgIHByb3RvLmVyYUFiYnIgPSBnZXRFcmFBYmJyO1xuICAgIHByb3RvLmVyYVllYXIgPSBnZXRFcmFZZWFyO1xuICAgIHByb3RvLnllYXIgPSBnZXRTZXRZZWFyO1xuICAgIHByb3RvLmlzTGVhcFllYXIgPSBnZXRJc0xlYXBZZWFyO1xuICAgIHByb3RvLndlZWtZZWFyID0gZ2V0U2V0V2Vla1llYXI7XG4gICAgcHJvdG8uaXNvV2Vla1llYXIgPSBnZXRTZXRJU09XZWVrWWVhcjtcbiAgICBwcm90by5xdWFydGVyID0gcHJvdG8ucXVhcnRlcnMgPSBnZXRTZXRRdWFydGVyO1xuICAgIHByb3RvLm1vbnRoID0gZ2V0U2V0TW9udGg7XG4gICAgcHJvdG8uZGF5c0luTW9udGggPSBnZXREYXlzSW5Nb250aDtcbiAgICBwcm90by53ZWVrID0gcHJvdG8ud2Vla3MgPSBnZXRTZXRXZWVrO1xuICAgIHByb3RvLmlzb1dlZWsgPSBwcm90by5pc29XZWVrcyA9IGdldFNldElTT1dlZWs7XG4gICAgcHJvdG8ud2Vla3NJblllYXIgPSBnZXRXZWVrc0luWWVhcjtcbiAgICBwcm90by53ZWVrc0luV2Vla1llYXIgPSBnZXRXZWVrc0luV2Vla1llYXI7XG4gICAgcHJvdG8uaXNvV2Vla3NJblllYXIgPSBnZXRJU09XZWVrc0luWWVhcjtcbiAgICBwcm90by5pc29XZWVrc0luSVNPV2Vla1llYXIgPSBnZXRJU09XZWVrc0luSVNPV2Vla1llYXI7XG4gICAgcHJvdG8uZGF0ZSA9IGdldFNldERheU9mTW9udGg7XG4gICAgcHJvdG8uZGF5ID0gcHJvdG8uZGF5cyA9IGdldFNldERheU9mV2VlaztcbiAgICBwcm90by53ZWVrZGF5ID0gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrO1xuICAgIHByb3RvLmlzb1dlZWtkYXkgPSBnZXRTZXRJU09EYXlPZldlZWs7XG4gICAgcHJvdG8uZGF5T2ZZZWFyID0gZ2V0U2V0RGF5T2ZZZWFyO1xuICAgIHByb3RvLmhvdXIgPSBwcm90by5ob3VycyA9IGdldFNldEhvdXI7XG4gICAgcHJvdG8ubWludXRlID0gcHJvdG8ubWludXRlcyA9IGdldFNldE1pbnV0ZTtcbiAgICBwcm90by5zZWNvbmQgPSBwcm90by5zZWNvbmRzID0gZ2V0U2V0U2Vjb25kO1xuICAgIHByb3RvLm1pbGxpc2Vjb25kID0gcHJvdG8ubWlsbGlzZWNvbmRzID0gZ2V0U2V0TWlsbGlzZWNvbmQ7XG4gICAgcHJvdG8udXRjT2Zmc2V0ID0gZ2V0U2V0T2Zmc2V0O1xuICAgIHByb3RvLnV0YyA9IHNldE9mZnNldFRvVVRDO1xuICAgIHByb3RvLmxvY2FsID0gc2V0T2Zmc2V0VG9Mb2NhbDtcbiAgICBwcm90by5wYXJzZVpvbmUgPSBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldDtcbiAgICBwcm90by5oYXNBbGlnbmVkSG91ck9mZnNldCA9IGhhc0FsaWduZWRIb3VyT2Zmc2V0O1xuICAgIHByb3RvLmlzRFNUID0gaXNEYXlsaWdodFNhdmluZ1RpbWU7XG4gICAgcHJvdG8uaXNMb2NhbCA9IGlzTG9jYWw7XG4gICAgcHJvdG8uaXNVdGNPZmZzZXQgPSBpc1V0Y09mZnNldDtcbiAgICBwcm90by5pc1V0YyA9IGlzVXRjO1xuICAgIHByb3RvLmlzVVRDID0gaXNVdGM7XG4gICAgcHJvdG8uem9uZUFiYnIgPSBnZXRab25lQWJicjtcbiAgICBwcm90by56b25lTmFtZSA9IGdldFpvbmVOYW1lO1xuICAgIHByb3RvLmRhdGVzID0gZGVwcmVjYXRlKFxuICAgICAgICAnZGF0ZXMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIGRhdGUgaW5zdGVhZC4nLFxuICAgICAgICBnZXRTZXREYXlPZk1vbnRoXG4gICAgKTtcbiAgICBwcm90by5tb250aHMgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQnLFxuICAgICAgICBnZXRTZXRNb250aFxuICAgICk7XG4gICAgcHJvdG8ueWVhcnMgPSBkZXByZWNhdGUoXG4gICAgICAgICd5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkJyxcbiAgICAgICAgZ2V0U2V0WWVhclxuICAgICk7XG4gICAgcHJvdG8uem9uZSA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLnpvbmUgaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudCgpLnV0Y09mZnNldCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL3pvbmUvJyxcbiAgICAgICAgZ2V0U2V0Wm9uZVxuICAgICk7XG4gICAgcHJvdG8uaXNEU1RTaGlmdGVkID0gZGVwcmVjYXRlKFxuICAgICAgICAnaXNEU1RTaGlmdGVkIGlzIGRlcHJlY2F0ZWQuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RzdC1zaGlmdGVkLyBmb3IgbW9yZSBpbmZvcm1hdGlvbicsXG4gICAgICAgIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVbml4KGlucHV0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCAqIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluWm9uZSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFyc2Vab25lKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlUGFyc2VQb3N0Rm9ybWF0KHN0cmluZykge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH1cblxuICAgIHZhciBwcm90byQxID0gTG9jYWxlLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDEuY2FsZW5kYXIgPSBjYWxlbmRhcjtcbiAgICBwcm90byQxLmxvbmdEYXRlRm9ybWF0ID0gbG9uZ0RhdGVGb3JtYXQ7XG4gICAgcHJvdG8kMS5pbnZhbGlkRGF0ZSA9IGludmFsaWREYXRlO1xuICAgIHByb3RvJDEub3JkaW5hbCA9IG9yZGluYWw7XG4gICAgcHJvdG8kMS5wcmVwYXJzZSA9IHByZVBhcnNlUG9zdEZvcm1hdDtcbiAgICBwcm90byQxLnBvc3Rmb3JtYXQgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5yZWxhdGl2ZVRpbWUgPSByZWxhdGl2ZVRpbWU7XG4gICAgcHJvdG8kMS5wYXN0RnV0dXJlID0gcGFzdEZ1dHVyZTtcbiAgICBwcm90byQxLnNldCA9IHNldDtcbiAgICBwcm90byQxLmVyYXMgPSBsb2NhbGVFcmFzO1xuICAgIHByb3RvJDEuZXJhc1BhcnNlID0gbG9jYWxlRXJhc1BhcnNlO1xuICAgIHByb3RvJDEuZXJhc0NvbnZlcnRZZWFyID0gbG9jYWxlRXJhc0NvbnZlcnRZZWFyO1xuICAgIHByb3RvJDEuZXJhc0FiYnJSZWdleCA9IGVyYXNBYmJyUmVnZXg7XG4gICAgcHJvdG8kMS5lcmFzTmFtZVJlZ2V4ID0gZXJhc05hbWVSZWdleDtcbiAgICBwcm90byQxLmVyYXNOYXJyb3dSZWdleCA9IGVyYXNOYXJyb3dSZWdleDtcblxuICAgIHByb3RvJDEubW9udGhzID0gbG9jYWxlTW9udGhzO1xuICAgIHByb3RvJDEubW9udGhzU2hvcnQgPSBsb2NhbGVNb250aHNTaG9ydDtcbiAgICBwcm90byQxLm1vbnRoc1BhcnNlID0gbG9jYWxlTW9udGhzUGFyc2U7XG4gICAgcHJvdG8kMS5tb250aHNSZWdleCA9IG1vbnRoc1JlZ2V4O1xuICAgIHByb3RvJDEubW9udGhzU2hvcnRSZWdleCA9IG1vbnRoc1Nob3J0UmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrID0gbG9jYWxlV2VlaztcbiAgICBwcm90byQxLmZpcnN0RGF5T2ZZZWFyID0gbG9jYWxlRmlyc3REYXlPZlllYXI7XG4gICAgcHJvdG8kMS5maXJzdERheU9mV2VlayA9IGxvY2FsZUZpcnN0RGF5T2ZXZWVrO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5cyA9IGxvY2FsZVdlZWtkYXlzO1xuICAgIHByb3RvJDEud2Vla2RheXNNaW4gPSBsb2NhbGVXZWVrZGF5c01pbjtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnQgPSBsb2NhbGVXZWVrZGF5c1Nob3J0O1xuICAgIHByb3RvJDEud2Vla2RheXNQYXJzZSA9IGxvY2FsZVdlZWtkYXlzUGFyc2U7XG5cbiAgICBwcm90byQxLndlZWtkYXlzUmVnZXggPSB3ZWVrZGF5c1JlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNTaG9ydFJlZ2V4ID0gd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNNaW5SZWdleCA9IHdlZWtkYXlzTWluUmVnZXg7XG5cbiAgICBwcm90byQxLmlzUE0gPSBsb2NhbGVJc1BNO1xuICAgIHByb3RvJDEubWVyaWRpZW0gPSBsb2NhbGVNZXJpZGllbTtcblxuICAgIGZ1bmN0aW9uIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpLFxuICAgICAgICAgICAgdXRjID0gY3JlYXRlVVRDKCkuc2V0KHNldHRlciwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gbG9jYWxlW2ZpZWxkXSh1dGMsIGZvcm1hdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCBpbmRleCwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgaSwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgLy8gKClcbiAgICAvLyAoNSlcbiAgICAvLyAoZm10LCA1KVxuICAgIC8vIChmbXQpXG4gICAgLy8gKHRydWUpXG4gICAgLy8gKHRydWUsIDUpXG4gICAgLy8gKHRydWUsIGZtdCwgNSlcbiAgICAvLyAodHJ1ZSwgZm10KVxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsZVNvcnRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybWF0ID0gbG9jYWxlU29ydGVkO1xuICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICBsb2NhbGVTb3J0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHNoaWZ0ID0gbG9jYWxlU29ydGVkID8gbG9jYWxlLl93ZWVrLmRvdyA6IDAsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgb3V0ID0gW107XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQkMShmb3JtYXQsIChpbmRleCArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIChpICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHMoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRocycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNTaG9ydChmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXMobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzU2hvcnQobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNNaW4obG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzTWluJyk7XG4gICAgfVxuXG4gICAgZ2V0U2V0R2xvYmFsTG9jYWxlKCdlbicsIHtcbiAgICAgICAgZXJhczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMS0wMS0wMScsXG4gICAgICAgICAgICAgICAgdW50aWw6ICtJbmZpbml0eSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0Fubm8gRG9taW5pJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICdBRCcsXG4gICAgICAgICAgICAgICAgYWJicjogJ0FEJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcwMDAwLTEyLTMxJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogLUluZmluaXR5LFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnQmVmb3JlIENocmlzdCcsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQkMnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdCQycsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB0b0ludCgobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgaG9va3MubGFuZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudC5sYW5nIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlXG4gICAgKTtcbiAgICBob29rcy5sYW5nRGF0YSA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC4nLFxuICAgICAgICBnZXRMb2NhbGVcbiAgICApO1xuXG4gICAgdmFyIG1hdGhBYnMgPSBNYXRoLmFicztcblxuICAgIGZ1bmN0aW9uIGFicygpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhO1xuXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9IG1hdGhBYnModGhpcy5fbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgdGhpcy5fZGF5cyA9IG1hdGhBYnModGhpcy5fZGF5cyk7XG4gICAgICAgIHRoaXMuX21vbnRocyA9IG1hdGhBYnModGhpcy5fbW9udGhzKTtcblxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1hdGhBYnMoZGF0YS5taWxsaXNlY29uZHMpO1xuICAgICAgICBkYXRhLnNlY29uZHMgPSBtYXRoQWJzKGRhdGEuc2Vjb25kcyk7XG4gICAgICAgIGRhdGEubWludXRlcyA9IG1hdGhBYnMoZGF0YS5taW51dGVzKTtcbiAgICAgICAgZGF0YS5ob3VycyA9IG1hdGhBYnMoZGF0YS5ob3Vycyk7XG4gICAgICAgIGRhdGEubW9udGhzID0gbWF0aEFicyhkYXRhLm1vbnRocyk7XG4gICAgICAgIGRhdGEueWVhcnMgPSBtYXRoQWJzKGRhdGEueWVhcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0JDEoZHVyYXRpb24sIGlucHV0LCB2YWx1ZSwgZGlyZWN0aW9uKSB7XG4gICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUR1cmF0aW9uKGlucHV0LCB2YWx1ZSk7XG5cbiAgICAgICAgZHVyYXRpb24uX21pbGxpc2Vjb25kcyArPSBkaXJlY3Rpb24gKiBvdGhlci5fbWlsbGlzZWNvbmRzO1xuICAgICAgICBkdXJhdGlvbi5fZGF5cyArPSBkaXJlY3Rpb24gKiBvdGhlci5fZGF5cztcbiAgICAgICAgZHVyYXRpb24uX21vbnRocyArPSBkaXJlY3Rpb24gKiBvdGhlci5fbW9udGhzO1xuXG4gICAgICAgIHJldHVybiBkdXJhdGlvbi5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgYWRkKDEsICdzJykgb3IgYWRkKGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIGFkZCQxKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIDEpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIHN1YnRyYWN0KDEsICdzJykgb3Igc3VidHJhY3QoZHVyYXRpb24pXG4gICAgZnVuY3Rpb24gc3VidHJhY3QkMShpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAtMSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzQ2VpbChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBidWJibGUoKSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyxcbiAgICAgICAgICAgIG1vbnRocyA9IHRoaXMuX21vbnRocyxcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgc2Vjb25kcyxcbiAgICAgICAgICAgIG1pbnV0ZXMsXG4gICAgICAgICAgICBob3VycyxcbiAgICAgICAgICAgIHllYXJzLFxuICAgICAgICAgICAgbW9udGhzRnJvbURheXM7XG5cbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIG1peCBvZiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgdmFsdWVzLCBidWJibGUgZG93biBmaXJzdFxuICAgICAgICAvLyBjaGVjazogaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzIxNjZcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAobWlsbGlzZWNvbmRzID49IDAgJiYgZGF5cyA+PSAwICYmIG1vbnRocyA+PSAwKSB8fFxuICAgICAgICAgICAgICAgIChtaWxsaXNlY29uZHMgPD0gMCAmJiBkYXlzIDw9IDAgJiYgbW9udGhzIDw9IDApXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgbWlsbGlzZWNvbmRzICs9IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRocykgKyBkYXlzKSAqIDg2NGU1O1xuICAgICAgICAgICAgZGF5cyA9IDA7XG4gICAgICAgICAgICBtb250aHMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGJ1YmJsZXMgdXAgdmFsdWVzLCBzZWUgdGhlIHRlc3RzIGZvclxuICAgICAgICAvLyBleGFtcGxlcyBvZiB3aGF0IHRoYXQgbWVhbnMuXG4gICAgICAgIGRhdGEubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzICUgMTAwMDtcblxuICAgICAgICBzZWNvbmRzID0gYWJzRmxvb3IobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcblxuICAgICAgICBtaW51dGVzID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgZGF0YS5taW51dGVzID0gbWludXRlcyAlIDYwO1xuXG4gICAgICAgIGhvdXJzID0gYWJzRmxvb3IobWludXRlcyAvIDYwKTtcbiAgICAgICAgZGF0YS5ob3VycyA9IGhvdXJzICUgMjQ7XG5cbiAgICAgICAgZGF5cyArPSBhYnNGbG9vcihob3VycyAvIDI0KTtcblxuICAgICAgICAvLyBjb252ZXJ0IGRheXMgdG8gbW9udGhzXG4gICAgICAgIG1vbnRoc0Zyb21EYXlzID0gYWJzRmxvb3IoZGF5c1RvTW9udGhzKGRheXMpKTtcbiAgICAgICAgbW9udGhzICs9IG1vbnRoc0Zyb21EYXlzO1xuICAgICAgICBkYXlzIC09IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRoc0Zyb21EYXlzKSk7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIGRhdGEuZGF5cyA9IGRheXM7XG4gICAgICAgIGRhdGEubW9udGhzID0gbW9udGhzO1xuICAgICAgICBkYXRhLnllYXJzID0geWVhcnM7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c1RvTW9udGhzKGRheXMpIHtcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTQ2MDk3IGRheXMgKHRha2luZyBpbnRvIGFjY291bnQgbGVhcCB5ZWFyIHJ1bGVzKVxuICAgICAgICAvLyA0MDAgeWVhcnMgaGF2ZSAxMiBtb250aHMgPT09IDQ4MDBcbiAgICAgICAgcmV0dXJuIChkYXlzICogNDgwMCkgLyAxNDYwOTc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzVG9EYXlzKG1vbnRocykge1xuICAgICAgICAvLyB0aGUgcmV2ZXJzZSBvZiBkYXlzVG9Nb250aHNcbiAgICAgICAgcmV0dXJuIChtb250aHMgKiAxNDYwOTcpIC8gNDgwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcyh1bml0cykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXlzLFxuICAgICAgICAgICAgbW9udGhzLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21vbnRoJyB8fCB1bml0cyA9PT0gJ3F1YXJ0ZXInIHx8IHVuaXRzID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMgKyBkYXlzVG9Nb250aHMoZGF5cyk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzIC8gMztcbiAgICAgICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocyAvIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaGFuZGxlIG1pbGxpc2Vjb25kcyBzZXBhcmF0ZWx5IGJlY2F1c2Ugb2YgZmxvYXRpbmcgcG9pbnQgbWF0aCBlcnJvcnMgKGlzc3VlICMxODY3KVxuICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMgKyBNYXRoLnJvdW5kKG1vbnRoc1RvRGF5cyh0aGlzLl9tb250aHMpKTtcbiAgICAgICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheXMgLyA3ICsgbWlsbGlzZWNvbmRzIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzICogMjQgKyBtaWxsaXNlY29uZHMgLyAzNmU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzICogMTQ0MCArIG1pbGxpc2Vjb25kcyAvIDZlNDtcbiAgICAgICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDg2NDAwICsgbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICAgICAgICAgICAgICAvLyBNYXRoLmZsb29yIHByZXZlbnRzIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIGhlcmVcbiAgICAgICAgICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKGRheXMgKiA4NjRlNSkgKyBtaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgJyArIHVuaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VBcyhhbGlhcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXMoYWxpYXMpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBhc01pbGxpc2Vjb25kcyA9IG1ha2VBcygnbXMnKSxcbiAgICAgICAgYXNTZWNvbmRzID0gbWFrZUFzKCdzJyksXG4gICAgICAgIGFzTWludXRlcyA9IG1ha2VBcygnbScpLFxuICAgICAgICBhc0hvdXJzID0gbWFrZUFzKCdoJyksXG4gICAgICAgIGFzRGF5cyA9IG1ha2VBcygnZCcpLFxuICAgICAgICBhc1dlZWtzID0gbWFrZUFzKCd3JyksXG4gICAgICAgIGFzTW9udGhzID0gbWFrZUFzKCdNJyksXG4gICAgICAgIGFzUXVhcnRlcnMgPSBtYWtlQXMoJ1EnKSxcbiAgICAgICAgYXNZZWFycyA9IG1ha2VBcygneScpLFxuICAgICAgICB2YWx1ZU9mJDEgPSBhc01pbGxpc2Vjb25kcztcblxuICAgIGZ1bmN0aW9uIGNsb25lJDEoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQkMih1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpc1t1bml0cyArICdzJ10oKSA6IE5hTjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlR2V0dGVyKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2RhdGFbbmFtZV0gOiBOYU47XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG1pbGxpc2Vjb25kcyA9IG1ha2VHZXR0ZXIoJ21pbGxpc2Vjb25kcycpLFxuICAgICAgICBzZWNvbmRzID0gbWFrZUdldHRlcignc2Vjb25kcycpLFxuICAgICAgICBtaW51dGVzID0gbWFrZUdldHRlcignbWludXRlcycpLFxuICAgICAgICBob3VycyA9IG1ha2VHZXR0ZXIoJ2hvdXJzJyksXG4gICAgICAgIGRheXMgPSBtYWtlR2V0dGVyKCdkYXlzJyksXG4gICAgICAgIG1vbnRocyA9IG1ha2VHZXR0ZXIoJ21vbnRocycpLFxuICAgICAgICB5ZWFycyA9IG1ha2VHZXR0ZXIoJ3llYXJzJyk7XG5cbiAgICBmdW5jdGlvbiB3ZWVrcygpIHtcbiAgICAgICAgcmV0dXJuIGFic0Zsb29yKHRoaXMuZGF5cygpIC8gNyk7XG4gICAgfVxuXG4gICAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZCxcbiAgICAgICAgdGhyZXNob2xkcyA9IHtcbiAgICAgICAgICAgIHNzOiA0NCwgLy8gYSBmZXcgc2Vjb25kcyB0byBzZWNvbmRzXG4gICAgICAgICAgICBzOiA0NSwgLy8gc2Vjb25kcyB0byBtaW51dGVcbiAgICAgICAgICAgIG06IDQ1LCAvLyBtaW51dGVzIHRvIGhvdXJcbiAgICAgICAgICAgIGg6IDIyLCAvLyBob3VycyB0byBkYXlcbiAgICAgICAgICAgIGQ6IDI2LCAvLyBkYXlzIHRvIG1vbnRoL3dlZWtcbiAgICAgICAgICAgIHc6IG51bGwsIC8vIHdlZWtzIHRvIG1vbnRoXG4gICAgICAgICAgICBNOiAxMSwgLy8gbW9udGhzIHRvIHllYXJcbiAgICAgICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgbW9tZW50LmZuLmZyb20sIG1vbWVudC5mbi5mcm9tTm93LCBhbmQgbW9tZW50LmR1cmF0aW9uLmZuLmh1bWFuaXplXG4gICAgZnVuY3Rpb24gc3Vic3RpdHV0ZVRpbWVBZ28oc3RyaW5nLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGlzRnV0dXJlLCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5yZWxhdGl2ZVRpbWUobnVtYmVyIHx8IDEsICEhd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lJDEocG9zTmVnRHVyYXRpb24sIHdpdGhvdXRTdWZmaXgsIHRocmVzaG9sZHMsIGxvY2FsZSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBjcmVhdGVEdXJhdGlvbihwb3NOZWdEdXJhdGlvbikuYWJzKCksXG4gICAgICAgICAgICBzZWNvbmRzID0gcm91bmQoZHVyYXRpb24uYXMoJ3MnKSksXG4gICAgICAgICAgICBtaW51dGVzID0gcm91bmQoZHVyYXRpb24uYXMoJ20nKSksXG4gICAgICAgICAgICBob3VycyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdoJykpLFxuICAgICAgICAgICAgZGF5cyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdkJykpLFxuICAgICAgICAgICAgbW9udGhzID0gcm91bmQoZHVyYXRpb24uYXMoJ00nKSksXG4gICAgICAgICAgICB3ZWVrcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCd3JykpLFxuICAgICAgICAgICAgeWVhcnMgPSByb3VuZChkdXJhdGlvbi5hcygneScpKSxcbiAgICAgICAgICAgIGEgPVxuICAgICAgICAgICAgICAgIChzZWNvbmRzIDw9IHRocmVzaG9sZHMuc3MgJiYgWydzJywgc2Vjb25kc10pIHx8XG4gICAgICAgICAgICAgICAgKHNlY29uZHMgPCB0aHJlc2hvbGRzLnMgJiYgWydzcycsIHNlY29uZHNdKSB8fFxuICAgICAgICAgICAgICAgIChtaW51dGVzIDw9IDEgJiYgWydtJ10pIHx8XG4gICAgICAgICAgICAgICAgKG1pbnV0ZXMgPCB0aHJlc2hvbGRzLm0gJiYgWydtbScsIG1pbnV0ZXNdKSB8fFxuICAgICAgICAgICAgICAgIChob3VycyA8PSAxICYmIFsnaCddKSB8fFxuICAgICAgICAgICAgICAgIChob3VycyA8IHRocmVzaG9sZHMuaCAmJiBbJ2hoJywgaG91cnNdKSB8fFxuICAgICAgICAgICAgICAgIChkYXlzIDw9IDEgJiYgWydkJ10pIHx8XG4gICAgICAgICAgICAgICAgKGRheXMgPCB0aHJlc2hvbGRzLmQgJiYgWydkZCcsIGRheXNdKTtcblxuICAgICAgICBpZiAodGhyZXNob2xkcy53ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGEgPVxuICAgICAgICAgICAgICAgIGEgfHxcbiAgICAgICAgICAgICAgICAod2Vla3MgPD0gMSAmJiBbJ3cnXSkgfHxcbiAgICAgICAgICAgICAgICAod2Vla3MgPCB0aHJlc2hvbGRzLncgJiYgWyd3dycsIHdlZWtzXSk7XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGEgfHxcbiAgICAgICAgICAgIChtb250aHMgPD0gMSAmJiBbJ00nXSkgfHxcbiAgICAgICAgICAgIChtb250aHMgPCB0aHJlc2hvbGRzLk0gJiYgWydNTScsIG1vbnRoc10pIHx8XG4gICAgICAgICAgICAoeWVhcnMgPD0gMSAmJiBbJ3knXSkgfHwgWyd5eScsIHllYXJzXTtcblxuICAgICAgICBhWzJdID0gd2l0aG91dFN1ZmZpeDtcbiAgICAgICAgYVszXSA9ICtwb3NOZWdEdXJhdGlvbiA+IDA7XG4gICAgICAgIGFbNF0gPSBsb2NhbGU7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseShudWxsLCBhKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSByb3VuZGluZyBmdW5jdGlvbiBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmcocm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICBpZiAocm91bmRpbmdGdW5jdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByb3VuZGluZ0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByb3VuZCA9IHJvdW5kaW5nRnVuY3Rpb247XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCBhIHRocmVzaG9sZCBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkKHRocmVzaG9sZCwgbGltaXQpIHtcbiAgICAgICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJlc2hvbGRzW3RocmVzaG9sZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgICAgIGlmICh0aHJlc2hvbGQgPT09ICdzJykge1xuICAgICAgICAgICAgdGhyZXNob2xkcy5zcyA9IGxpbWl0IC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBodW1hbml6ZShhcmdXaXRoU3VmZml4LCBhcmdUaHJlc2hvbGRzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdpdGhTdWZmaXggPSBmYWxzZSxcbiAgICAgICAgICAgIHRoID0gdGhyZXNob2xkcyxcbiAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgIG91dHB1dDtcblxuICAgICAgICBpZiAodHlwZW9mIGFyZ1dpdGhTdWZmaXggPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBhcmdUaHJlc2hvbGRzID0gYXJnV2l0aFN1ZmZpeDtcbiAgICAgICAgICAgIGFyZ1dpdGhTdWZmaXggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFyZ1dpdGhTdWZmaXggPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgd2l0aFN1ZmZpeCA9IGFyZ1dpdGhTdWZmaXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdUaHJlc2hvbGRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGggPSBPYmplY3QuYXNzaWduKHt9LCB0aHJlc2hvbGRzLCBhcmdUaHJlc2hvbGRzKTtcbiAgICAgICAgICAgIGlmIChhcmdUaHJlc2hvbGRzLnMgIT0gbnVsbCAmJiBhcmdUaHJlc2hvbGRzLnNzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aC5zcyA9IGFyZ1RocmVzaG9sZHMucyAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbGUgPSB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgb3V0cHV0ID0gcmVsYXRpdmVUaW1lJDEodGhpcywgIXdpdGhTdWZmaXgsIHRoLCBsb2NhbGUpO1xuXG4gICAgICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBsb2NhbGUucGFzdEZ1dHVyZSgrdGhpcywgb3V0cHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbGUucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhYnMkMSA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gc2lnbih4KSB7XG4gICAgICAgIHJldHVybiAoeCA+IDApIC0gKHggPCAwKSB8fCAreDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0lTT1N0cmluZyQxKCkge1xuICAgICAgICAvLyBmb3IgSVNPIHN0cmluZ3Mgd2UgZG8gbm90IHVzZSB0aGUgbm9ybWFsIGJ1YmJsaW5nIHJ1bGVzOlxuICAgICAgICAvLyAgKiBtaWxsaXNlY29uZHMgYnViYmxlIHVwIHVudGlsIHRoZXkgYmVjb21lIGhvdXJzXG4gICAgICAgIC8vICAqIGRheXMgZG8gbm90IGJ1YmJsZSBhdCBhbGxcbiAgICAgICAgLy8gICogbW9udGhzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSB5ZWFyc1xuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgaXMgbm8gY29udGV4dC1mcmVlIGNvbnZlcnNpb24gYmV0d2VlbiBob3VycyBhbmQgZGF5c1xuICAgICAgICAvLyAodGhpbmsgb2YgY2xvY2sgY2hhbmdlcylcbiAgICAgICAgLy8gYW5kIGFsc28gbm90IGJldHdlZW4gZGF5cyBhbmQgbW9udGhzICgyOC0zMSBkYXlzIHBlciBtb250aClcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2Vjb25kcyA9IGFicyQxKHRoaXMuX21pbGxpc2Vjb25kcykgLyAxMDAwLFxuICAgICAgICAgICAgZGF5cyA9IGFicyQxKHRoaXMuX2RheXMpLFxuICAgICAgICAgICAgbW9udGhzID0gYWJzJDEodGhpcy5fbW9udGhzKSxcbiAgICAgICAgICAgIG1pbnV0ZXMsXG4gICAgICAgICAgICBob3VycyxcbiAgICAgICAgICAgIHllYXJzLFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIHRvdGFsID0gdGhpcy5hc1NlY29uZHMoKSxcbiAgICAgICAgICAgIHRvdGFsU2lnbixcbiAgICAgICAgICAgIHltU2lnbixcbiAgICAgICAgICAgIGRheXNTaWduLFxuICAgICAgICAgICAgaG1zU2lnbjtcblxuICAgICAgICBpZiAoIXRvdGFsKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBzYW1lIGFzIEMjJ3MgKE5vZGEpIGFuZCBweXRob24gKGlzb2RhdGUpLi4uXG4gICAgICAgICAgICAvLyBidXQgbm90IG90aGVyIEpTIChnb29nLmRhdGUpXG4gICAgICAgICAgICByZXR1cm4gJ1AwRCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzNjAwIHNlY29uZHMgLT4gNjAgbWludXRlcyAtPiAxIGhvdXJcbiAgICAgICAgbWludXRlcyA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGhvdXJzID0gYWJzRmxvb3IobWludXRlcyAvIDYwKTtcbiAgICAgICAgc2Vjb25kcyAlPSA2MDtcbiAgICAgICAgbWludXRlcyAlPSA2MDtcblxuICAgICAgICAvLyAxMiBtb250aHMgLT4gMSB5ZWFyXG4gICAgICAgIHllYXJzID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cbiAgICAgICAgLy8gaW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2RvcmRpbGxlL21vbWVudC1pc29kdXJhdGlvbi9ibG9iL21hc3Rlci9tb21lbnQuaXNvZHVyYXRpb24uanNcbiAgICAgICAgcyA9IHNlY29uZHMgPyBzZWNvbmRzLnRvRml4ZWQoMykucmVwbGFjZSgvXFwuPzArJC8sICcnKSA6ICcnO1xuXG4gICAgICAgIHRvdGFsU2lnbiA9IHRvdGFsIDwgMCA/ICctJyA6ICcnO1xuICAgICAgICB5bVNpZ24gPSBzaWduKHRoaXMuX21vbnRocykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIGRheXNTaWduID0gc2lnbih0aGlzLl9kYXlzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcbiAgICAgICAgaG1zU2lnbiA9IHNpZ24odGhpcy5fbWlsbGlzZWNvbmRzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdG90YWxTaWduICtcbiAgICAgICAgICAgICdQJyArXG4gICAgICAgICAgICAoeWVhcnMgPyB5bVNpZ24gKyB5ZWFycyArICdZJyA6ICcnKSArXG4gICAgICAgICAgICAobW9udGhzID8geW1TaWduICsgbW9udGhzICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChkYXlzID8gZGF5c1NpZ24gKyBkYXlzICsgJ0QnIDogJycpICtcbiAgICAgICAgICAgIChob3VycyB8fCBtaW51dGVzIHx8IHNlY29uZHMgPyAnVCcgOiAnJykgK1xuICAgICAgICAgICAgKGhvdXJzID8gaG1zU2lnbiArIGhvdXJzICsgJ0gnIDogJycpICtcbiAgICAgICAgICAgIChtaW51dGVzID8gaG1zU2lnbiArIG1pbnV0ZXMgKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKHNlY29uZHMgPyBobXNTaWduICsgcyArICdTJyA6ICcnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBwcm90byQyID0gRHVyYXRpb24ucHJvdG90eXBlO1xuXG4gICAgcHJvdG8kMi5pc1ZhbGlkID0gaXNWYWxpZCQxO1xuICAgIHByb3RvJDIuYWJzID0gYWJzO1xuICAgIHByb3RvJDIuYWRkID0gYWRkJDE7XG4gICAgcHJvdG8kMi5zdWJ0cmFjdCA9IHN1YnRyYWN0JDE7XG4gICAgcHJvdG8kMi5hcyA9IGFzO1xuICAgIHByb3RvJDIuYXNNaWxsaXNlY29uZHMgPSBhc01pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLmFzU2Vjb25kcyA9IGFzU2Vjb25kcztcbiAgICBwcm90byQyLmFzTWludXRlcyA9IGFzTWludXRlcztcbiAgICBwcm90byQyLmFzSG91cnMgPSBhc0hvdXJzO1xuICAgIHByb3RvJDIuYXNEYXlzID0gYXNEYXlzO1xuICAgIHByb3RvJDIuYXNXZWVrcyA9IGFzV2Vla3M7XG4gICAgcHJvdG8kMi5hc01vbnRocyA9IGFzTW9udGhzO1xuICAgIHByb3RvJDIuYXNRdWFydGVycyA9IGFzUXVhcnRlcnM7XG4gICAgcHJvdG8kMi5hc1llYXJzID0gYXNZZWFycztcbiAgICBwcm90byQyLnZhbHVlT2YgPSB2YWx1ZU9mJDE7XG4gICAgcHJvdG8kMi5fYnViYmxlID0gYnViYmxlO1xuICAgIHByb3RvJDIuY2xvbmUgPSBjbG9uZSQxO1xuICAgIHByb3RvJDIuZ2V0ID0gZ2V0JDI7XG4gICAgcHJvdG8kMi5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5zZWNvbmRzID0gc2Vjb25kcztcbiAgICBwcm90byQyLm1pbnV0ZXMgPSBtaW51dGVzO1xuICAgIHByb3RvJDIuaG91cnMgPSBob3VycztcbiAgICBwcm90byQyLmRheXMgPSBkYXlzO1xuICAgIHByb3RvJDIud2Vla3MgPSB3ZWVrcztcbiAgICBwcm90byQyLm1vbnRocyA9IG1vbnRocztcbiAgICBwcm90byQyLnllYXJzID0geWVhcnM7XG4gICAgcHJvdG8kMi5odW1hbml6ZSA9IGh1bWFuaXplO1xuICAgIHByb3RvJDIudG9JU09TdHJpbmcgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9TdHJpbmcgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9KU09OID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLmxvY2FsZSA9IGxvY2FsZTtcbiAgICBwcm90byQyLmxvY2FsZURhdGEgPSBsb2NhbGVEYXRhO1xuXG4gICAgcHJvdG8kMi50b0lzb1N0cmluZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ3RvSXNvU3RyaW5nKCkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0b0lTT1N0cmluZygpIGluc3RlYWQgKG5vdGljZSB0aGUgY2FwaXRhbHMpJyxcbiAgICAgICAgdG9JU09TdHJpbmckMVxuICAgICk7XG4gICAgcHJvdG8kMi5sYW5nID0gbGFuZztcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdYJywgMCwgMCwgJ3VuaXgnKTtcbiAgICBhZGRGb3JtYXRUb2tlbigneCcsIDAsIDAsICd2YWx1ZU9mJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd4JywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1gnLCBtYXRjaFRpbWVzdGFtcCk7XG4gICAgYWRkUGFyc2VUb2tlbignWCcsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShwYXJzZUZsb2F0KGlucHV0KSAqIDEwMDApO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ3gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUodG9JbnQoaW5wdXQpKTtcbiAgICB9KTtcblxuICAgIC8vISBtb21lbnQuanNcblxuICAgIGhvb2tzLnZlcnNpb24gPSAnMi4zMC4xJztcblxuICAgIHNldEhvb2tDYWxsYmFjayhjcmVhdGVMb2NhbCk7XG5cbiAgICBob29rcy5mbiA9IHByb3RvO1xuICAgIGhvb2tzLm1pbiA9IG1pbjtcbiAgICBob29rcy5tYXggPSBtYXg7XG4gICAgaG9va3Mubm93ID0gbm93O1xuICAgIGhvb2tzLnV0YyA9IGNyZWF0ZVVUQztcbiAgICBob29rcy51bml4ID0gY3JlYXRlVW5peDtcbiAgICBob29rcy5tb250aHMgPSBsaXN0TW9udGhzO1xuICAgIGhvb2tzLmlzRGF0ZSA9IGlzRGF0ZTtcbiAgICBob29rcy5sb2NhbGUgPSBnZXRTZXRHbG9iYWxMb2NhbGU7XG4gICAgaG9va3MuaW52YWxpZCA9IGNyZWF0ZUludmFsaWQ7XG4gICAgaG9va3MuZHVyYXRpb24gPSBjcmVhdGVEdXJhdGlvbjtcbiAgICBob29rcy5pc01vbWVudCA9IGlzTW9tZW50O1xuICAgIGhvb2tzLndlZWtkYXlzID0gbGlzdFdlZWtkYXlzO1xuICAgIGhvb2tzLnBhcnNlWm9uZSA9IGNyZWF0ZUluWm9uZTtcbiAgICBob29rcy5sb2NhbGVEYXRhID0gZ2V0TG9jYWxlO1xuICAgIGhvb2tzLmlzRHVyYXRpb24gPSBpc0R1cmF0aW9uO1xuICAgIGhvb2tzLm1vbnRoc1Nob3J0ID0gbGlzdE1vbnRoc1Nob3J0O1xuICAgIGhvb2tzLndlZWtkYXlzTWluID0gbGlzdFdlZWtkYXlzTWluO1xuICAgIGhvb2tzLmRlZmluZUxvY2FsZSA9IGRlZmluZUxvY2FsZTtcbiAgICBob29rcy51cGRhdGVMb2NhbGUgPSB1cGRhdGVMb2NhbGU7XG4gICAgaG9va3MubG9jYWxlcyA9IGxpc3RMb2NhbGVzO1xuICAgIGhvb2tzLndlZWtkYXlzU2hvcnQgPSBsaXN0V2Vla2RheXNTaG9ydDtcbiAgICBob29rcy5ub3JtYWxpemVVbml0cyA9IG5vcm1hbGl6ZVVuaXRzO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVJvdW5kaW5nID0gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmc7XG4gICAgaG9va3MucmVsYXRpdmVUaW1lVGhyZXNob2xkID0gZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkO1xuICAgIGhvb2tzLmNhbGVuZGFyRm9ybWF0ID0gZ2V0Q2FsZW5kYXJGb3JtYXQ7XG4gICAgaG9va3MucHJvdG90eXBlID0gcHJvdG87XG5cbiAgICAvLyBjdXJyZW50bHkgSFRNTDUgaW5wdXQgdHlwZSBvbmx5IHN1cHBvcnRzIDI0LWhvdXIgZm9ybWF0c1xuICAgIGhvb2tzLkhUTUw1X0ZNVCA9IHtcbiAgICAgICAgREFURVRJTUVfTE9DQUw6ICdZWVlZLU1NLUREVEhIOm1tJywgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIC8+XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMX1NFQ09ORFM6ICdZWVlZLU1NLUREVEhIOm1tOnNzJywgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfTVM6ICdZWVlZLU1NLUREVEhIOm1tOnNzLlNTUycsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdGVwPVwiMC4wMDFcIiAvPlxuICAgICAgICBEQVRFOiAnWVlZWS1NTS1ERCcsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIC8+XG4gICAgICAgIFRJTUU6ICdISDptbScsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIC8+XG4gICAgICAgIFRJTUVfU0VDT05EUzogJ0hIOm1tOnNzJywgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICBUSU1FX01TOiAnSEg6bW06c3MuU1NTJywgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgV0VFSzogJ0dHR0ctW1ddV1cnLCAvLyA8aW5wdXQgdHlwZT1cIndlZWtcIiAvPlxuICAgICAgICBNT05USDogJ1lZWVktTU0nLCAvLyA8aW5wdXQgdHlwZT1cIm1vbnRoXCIgLz5cbiAgICB9O1xuXG4gICAgcmV0dXJuIGhvb2tzO1xuXG59KSkpO1xuIiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIi8vIFRvcCBsZXZlbCBmaWxlIGlzIGp1c3QgYSBtaXhpbiBvZiBzdWJtb2R1bGVzICYgY29uc3RhbnRzXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gICAgPSByZXF1aXJlKCcuL2xpYi91dGlscy9jb21tb24nKS5hc3NpZ247XG5cbnZhciBkZWZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9kZWZsYXRlJyk7XG52YXIgaW5mbGF0ZSAgID0gcmVxdWlyZSgnLi9saWIvaW5mbGF0ZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vbGliL3psaWIvY29uc3RhbnRzJyk7XG5cbnZhciBwYWtvID0ge307XG5cbmFzc2lnbihwYWtvLCBkZWZsYXRlLCBpbmZsYXRlLCBjb25zdGFudHMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBha287XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfZGVmbGF0ZSA9IHJlcXVpcmUoJy4vemxpYi9kZWZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gcmVxdWlyZSgnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcblxudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbnZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuXG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cbnZhciBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwO1xuXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qKlxuICogY2xhc3MgRGVmbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2RlZmxhdGVdXSxcbiAqIFtbZGVmbGF0ZVJhd11dIGFuZCBbW2d6aXBdXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIERlZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0RlZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRkZW4uXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5yZXN1bHQgLT4gVWludDhBcnJheXxBcnJheVxuICpcbiAqIENvbXByZXNzZWQgcmVzdWx0LCBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBbW0RlZmxhdGUjb25EYXRhXV1cbiAqIGFuZCBbW0RlZmxhdGUjb25FbmRdXSBoYW5kbGVycy4gRmlsbGVkIGFmdGVyIHlvdSBwdXNoIGxhc3QgY2h1bmtcbiAqIChjYWxsIFtbRGVmbGF0ZSNwdXNoXV0gd2l0aCBgWl9GSU5JU0hgIC8gYHRydWVgIHBhcmFtKSAgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGRlZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBZb3Ugd2lsbCBub3QgbmVlZCBpdCBpbiByZWFsIGxpZmUsIGJlY2F1c2UgZGVmbGF0ZSBlcnJvcnNcbiAqIGFyZSBwb3NzaWJsZSBvbmx5IG9uIHdyb25nIG9wdGlvbnMgb3IgYmFkIGBvbkRhdGFgIC8gYG9uRW5kYFxuICogY3VzdG9tIGhhbmRsZXJzLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUubXNnIC0+IFN0cmluZ1xuICpcbiAqIEVycm9yIG1lc3NhZ2UsIGlmIFtbRGVmbGF0ZS5lcnJdXSAhPSAwXG4gKiovXG5cblxuLyoqXG4gKiBuZXcgRGVmbGF0ZShvcHRpb25zKVxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBDcmVhdGVzIG5ldyBkZWZsYXRvciBpbnN0YW5jZSB3aXRoIHNwZWNpZmllZCBwYXJhbXMuIFRocm93cyBleGNlcHRpb25cbiAqIG9uIGJhZCBwYXJhbXMuIFN1cHBvcnRlZCBvcHRpb25zOlxuICpcbiAqIC0gYGxldmVsYFxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYG1lbUxldmVsYFxuICogLSBgc3RyYXRlZ3lgXG4gKiAtIGBkaWN0aW9uYXJ5YFxuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlLlxuICpcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucywgZm9yIGludGVybmFsIG5lZWRzOlxuICpcbiAqIC0gYGNodW5rU2l6ZWAgLSBzaXplIG9mIGdlbmVyYXRlZCBkYXRhIGNodW5rcyAoMTZLIGJ5IGRlZmF1bHQpXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIGRvIHJhdyBkZWZsYXRlXG4gKiAtIGBnemlwYCAoQm9vbGVhbikgLSBjcmVhdGUgZ3ppcCB3cmFwcGVyXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICogLSBgaGVhZGVyYCAoT2JqZWN0KSAtIGN1c3RvbSBoZWFkZXIgZm9yIGd6aXBcbiAqICAgLSBgdGV4dGAgKEJvb2xlYW4pIC0gdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dFxuICogICAtIGB0aW1lYCAoTnVtYmVyKSAtIG1vZGlmaWNhdGlvbiB0aW1lLCB1bml4IHRpbWVzdGFtcFxuICogICAtIGBvc2AgKE51bWJlcikgLSBvcGVyYXRpb24gc3lzdGVtIGNvZGVcbiAqICAgLSBgZXh0cmFgIChBcnJheSkgLSBhcnJheSBvZiBieXRlcyB3aXRoIGV4dHJhIGRhdGEgKG1heCA2NTUzNilcbiAqICAgLSBgbmFtZWAgKFN0cmluZykgLSBmaWxlIG5hbWUgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGNvbW1lbnRgIChTdHJpbmcpIC0gY29tbWVudCAoYmluYXJ5IHN0cmluZylcbiAqICAgLSBgaGNyY2AgKEJvb2xlYW4pIC0gdHJ1ZSBpZiBoZWFkZXIgY3JjIHNob3VsZCBiZSBhZGRlZFxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgZGVmbGF0ZSA9IG5ldyBwYWtvLkRlZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGRlZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGRlZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGRlZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihkZWZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhkZWZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIERlZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRGVmbGF0ZSkpIHJldHVybiBuZXcgRGVmbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGxldmVsOiBaX0RFRkFVTFRfQ09NUFJFU1NJT04sXG4gICAgbWV0aG9kOiBaX0RFRkxBVEVELFxuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMTUsXG4gICAgbWVtTGV2ZWw6IDgsXG4gICAgc3RyYXRlZ3k6IFpfREVGQVVMVF9TVFJBVEVHWSxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICBpZiAob3B0LnJhdyAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAob3B0Lmd6aXAgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkgJiYgKG9wdC53aW5kb3dCaXRzIDwgMTYpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMTY7XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gPSBuZXcgWlN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LmxldmVsLFxuICAgIG9wdC5tZXRob2QsXG4gICAgb3B0LndpbmRvd0JpdHMsXG4gICAgb3B0Lm1lbUxldmVsLFxuICAgIG9wdC5zdHJhdGVneVxuICApO1xuXG4gIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgaWYgKG9wdC5oZWFkZXIpIHtcbiAgICB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sIG9wdC5oZWFkZXIpO1xuICB9XG5cbiAgaWYgKG9wdC5kaWN0aW9uYXJ5KSB7XG4gICAgdmFyIGRpY3Q7XG4gICAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2Ygb3B0LmRpY3Rpb25hcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgICAgZGljdCA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKG9wdC5kaWN0aW9uYXJ5KSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgICAgZGljdCA9IG5ldyBVaW50OEFycmF5KG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGljdCA9IG9wdC5kaWN0aW9uYXJ5O1xuICAgIH1cblxuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3QpO1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gWl9PSykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kaWN0X3NldCA9IHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YS4gU3RyaW5ncyB3aWxsIGJlXG4gKiAgIGNvbnZlcnRlZCB0byB1dGY4IGJ5dGUgc2VxdWVuY2UuXG4gKiAtIG1vZGUgKE51bWJlcnxCb29sZWFuKTogMC4uNiBmb3IgY29ycmVzcG9uZGluZyBaX05PX0ZMVVNILi5aX1RSRUUgbW9kZXMuXG4gKiAgIFNlZSBjb25zdGFudHMuIFNraXBwZWQgb3IgYGZhbHNlYCBtZWFucyBaX05PX0ZMVVNILCBgdHJ1ZWAgbWVhbnMgWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBkZWZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tEZWZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBjb21wcmVzc2VkIGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbRGVmbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbRGVmbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGFycmF5IGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZShzdHJtLCBfbW9kZSk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgIT09IFpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBaX0ZJTklTSCB8fCBfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMub25EYXRhKHN0cmluZ3MuYnVmMmJpbnN0cmluZyh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQpO1xuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IFpfRklOSVNIKSB7XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChaX09LKTtcbiAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXRwdXQgZGF0YS4gVHlwZSBvZiBhcnJheSBkZXBlbmRzXG4gKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rXG4gKiAgIHdpbGwgYmUgc3RyaW5nLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIERlZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogZGVmbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgb25jZSBhZnRlciB5b3UgdGVsbCBkZWZsYXRlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpc1xuICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKVxuICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBjaHVua3MsXG4gKiBmcmVlIG1lbW9yeSBhbmQgZmlsbCBgcmVzdWx0c2AgLyBgZXJyYCBwcm9wZXJ0aWVzLlxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IFpfT0spIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBkZWZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBDb21wcmVzcyBgZGF0YWAgd2l0aCBkZWZsYXRlIGFsZ29yaXRobSBhbmQgYG9wdGlvbnNgLlxuICpcbiAqIFN1cHBvcnRlZCBvcHRpb25zIGFyZTpcbiAqXG4gKiAtIGxldmVsXG4gKiAtIHdpbmRvd0JpdHNcbiAqIC0gbWVtTGV2ZWxcbiAqIC0gc3RyYXRlZ3lcbiAqIC0gZGljdGlvbmFyeVxuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIFwiYmluYXJ5IHN0cmluZ1wiXG4gKiAgICAoZWFjaCBjaGFyIGNvZGUgWzAuLjI1NV0pXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGRhdGEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBha28uZGVmbGF0ZShkYXRhKSk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGRlZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGRlZmxhdG9yID0gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgZGVmbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGRlZmxhdG9yLmVycikgeyB0aHJvdyBkZWZsYXRvci5tc2cgfHwgbXNnW2RlZmxhdG9yLmVycl07IH1cblxuICByZXR1cm4gZGVmbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogZGVmbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tkZWZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGRlZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGRlZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogZ3ppcChkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tkZWZsYXRlXV0sIGJ1dCBjcmVhdGUgZ3ppcCB3cmFwcGVyIGluc3RlYWQgb2ZcbiAqIGRlZmxhdGUgb25lLlxuICoqL1xuZnVuY3Rpb24gZ3ppcChpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5nemlwID0gdHJ1ZTtcbiAgcmV0dXJuIGRlZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbmV4cG9ydHMuRGVmbGF0ZSA9IERlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGUgPSBkZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlUmF3ID0gZGVmbGF0ZVJhdztcbmV4cG9ydHMuZ3ppcCA9IGd6aXA7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfaW5mbGF0ZSA9IHJlcXVpcmUoJy4vemxpYi9pbmZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gcmVxdWlyZSgnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBjICAgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvY29uc3RhbnRzJyk7XG52YXIgbXNnICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL21lc3NhZ2VzJyk7XG52YXIgWlN0cmVhbSAgICAgID0gcmVxdWlyZSgnLi96bGliL3pzdHJlYW0nKTtcbnZhciBHWmhlYWRlciAgICAgPSByZXF1aXJlKCcuL3psaWIvZ3poZWFkZXInKTtcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBjbGFzcyBJbmZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbaW5mbGF0ZV1dXG4gKiBhbmQgW1tpbmZsYXRlUmF3XV0uXG4gKiovXG5cbi8qIGludGVybmFsXG4gKiBpbmZsYXRlLmNodW5rcyAtPiBBcnJheVxuICpcbiAqIENodW5rcyBvZiBvdXRwdXQgZGF0YSwgaWYgW1tJbmZsYXRlI29uRGF0YV1dIG5vdCBvdmVycmlkZGVuLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKlxuICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tJbmZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGluZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBTaG91bGQgYmUgY2hlY2tlZCBpZiBicm9rZW4gZGF0YSBwb3NzaWJsZS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0luZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IEluZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgaW5mbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgaW5mbGF0ZVxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB3aGVuIG5vIG9wdGlvbnMgc2V0LCBhdXRvZGV0ZWN0IGRlZmxhdGUvZ3ppcCBkYXRhIGZvcm1hdCB2aWFcbiAqIHdyYXBwZXIgaGVhZGVyLlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgaW5mbGF0ZSA9IG5ldyBwYWtvLkluZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGluZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGluZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGluZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihpbmZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhpbmZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIEluZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpIHJldHVybiBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMCxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICAvLyBGb3JjZSB3aW5kb3cgc2l6ZSBmb3IgYHJhd2AgZGF0YSwgaWYgbm90IHNldCBkaXJlY3RseSxcbiAgLy8gYmVjYXVzZSB3ZSBoYXZlIG5vIGhlYWRlciBmb3IgYXV0b2RldGVjdC5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICAgIGlmIChvcHQud2luZG93Qml0cyA9PT0gMCkgeyBvcHQud2luZG93Qml0cyA9IC0xNTsgfVxuICB9XG5cbiAgLy8gSWYgYHdpbmRvd0JpdHNgIG5vdCBkZWZpbmVkIChhbmQgbW9kZSBub3QgcmF3KSAtIHNldCBhdXRvZGV0ZWN0IGZsYWcgZm9yIGd6aXAvZGVmbGF0ZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSAmJlxuICAgICAgIShvcHRpb25zICYmIG9wdGlvbnMud2luZG93Qml0cykpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIC8vIEd6aXAgaGVhZGVyIGhhcyBubyBpbmZvIGFib3V0IHdpbmRvd3Mgc2l6ZSwgd2UgY2FuIGRvIGF1dG9kZXRlY3Qgb25seVxuICAvLyBmb3IgZGVmbGF0ZS4gU28sIGlmIHdpbmRvdyBzaXplIG5vdCBzZXQsIGZvcmNlIGl0IHRvIG1heCB3aGVuIGd6aXAgcG9zc2libGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+IDE1KSAmJiAob3B0LndpbmRvd0JpdHMgPCA0OCkpIHtcbiAgICAvLyBiaXQgMyAoMTYpIC0+IGd6aXBwZWQgZGF0YVxuICAgIC8vIGJpdCA0ICgzMikgLT4gYXV0b2RldGVjdCBnemlwL2RlZmxhdGVcbiAgICBpZiAoKG9wdC53aW5kb3dCaXRzICYgMTUpID09PSAwKSB7XG4gICAgICBvcHQud2luZG93Qml0cyB8PSAxNTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gICA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgID0gemxpYl9pbmZsYXRlLmluZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LndpbmRvd0JpdHNcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTtcblxuICB6bGliX2luZmxhdGUuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sIHRoaXMuaGVhZGVyKTtcblxuICAvLyBTZXR1cCBkaWN0aW9uYXJ5XG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0LmRpY3Rpb25hcnkgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIG9wdC5kaWN0aW9uYXJ5ID0gbmV3IFVpbnQ4QXJyYXkob3B0LmRpY3Rpb25hcnkpO1xuICAgIH1cbiAgICBpZiAob3B0LnJhdykgeyAvL0luIHJhdyBtb2RlIHdlIG5lZWQgdG8gc2V0IHRoZSBkaWN0aW9uYXJ5IGVhcmx5XG4gICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBvcHQuZGljdGlvbmFyeSk7XG4gICAgICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbmZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YVxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zIFpfRklOSVNILlxuICpcbiAqIFNlbmRzIGlucHV0IGRhdGEgdG8gaW5mbGF0ZSBwaXBlLCBnZW5lcmF0aW5nIFtbSW5mbGF0ZSNvbkRhdGFdXSBjYWxscyB3aXRoXG4gKiBuZXcgb3V0cHV0IGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbSW5mbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGRlY29tcHJlc3Npb24gY29udGV4dC5cbiAqXG4gKiBPbiBmYWlsIGNhbGwgW1tJbmZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBgVWludDhBcnJheWAgb24gaW5wdXQgZm9yIGJlc3Qgc3BlZWQgKG91dHB1dFxuICogZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5c1xuICogdXNlIHRoZSBzYW1lIHR5cGUgaW4geW91ciBjb2RlIChib29sZWFuIG9yIG51bWJlcikuIFRoYXQgd2lsbCBpbXByb3ZlIEpTIHNwZWVkLlxuICpcbiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIG1vZGUpIHtcbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICB2YXIgZGljdGlvbmFyeSA9IHRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5O1xuICB2YXIgc3RhdHVzLCBfbW9kZTtcbiAgdmFyIG5leHRfb3V0X3V0ZjgsIHRhaWwsIHV0ZjhzdHI7XG5cbiAgLy8gRmxhZyB0byBwcm9wZXJseSBwcm9jZXNzIFpfQlVGX0VSUk9SIG9uIHRlc3RpbmcgaW5mbGF0ZSBjYWxsXG4gIC8vIHdoZW4gd2UgY2hlY2sgdGhhdCBhbGwgb3V0cHV0IGRhdGEgd2FzIGZsdXNoZWQuXG4gIHZhciBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IGMuWl9GSU5JU0ggOiBjLlpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIE9ubHkgYmluYXJ5IHN0cmluZ3MgY2FuIGJlIGRlY29tcHJlc3NlZCBvbiBwcmFjdGljZVxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLmJpbnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cblxuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHN0cm0sIGMuWl9OT19GTFVTSCk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9ORUVEX0RJQ1QgJiYgZGljdGlvbmFyeSkge1xuICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdGlvbmFyeSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX0JVRl9FUlJPUiAmJiBhbGxvd0J1ZkVycm9yID09PSB0cnVlKSB7XG4gICAgICBzdGF0dXMgPSBjLlpfT0s7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHJtLm5leHRfb3V0KSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IGMuWl9GSU5JU0ggfHwgX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSkpIHtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuXG4gICAgICAgICAgbmV4dF9vdXRfdXRmOCA9IHN0cmluZ3MudXRmOGJvcmRlcihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCk7XG5cbiAgICAgICAgICB0YWlsID0gc3RybS5uZXh0X291dCAtIG5leHRfb3V0X3V0Zjg7XG4gICAgICAgICAgdXRmOHN0ciA9IHN0cmluZ3MuYnVmMnN0cmluZyhzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCk7XG5cbiAgICAgICAgICAvLyBtb3ZlIHRhaWxcbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZSAtIHRhaWw7XG4gICAgICAgICAgaWYgKHRhaWwpIHsgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4LCB0YWlsLCAwKTsgfVxuXG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRmOHN0cik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoZW4gbm8gbW9yZSBpbnB1dCBkYXRhLCB3ZSBzaG91bGQgY2hlY2sgdGhhdCBpbnRlcm5hbCBpbmZsYXRlIGJ1ZmZlcnNcbiAgICAvLyBhcmUgZmx1c2hlZC4gVGhlIG9ubHkgd2F5IHRvIGRvIGl0IHdoZW4gYXZhaWxfb3V0ID0gMCAtIHJ1biBvbmUgbW9yZVxuICAgIC8vIGluZmxhdGUgcGFzcy4gQnV0IGlmIG91dHB1dCBkYXRhIG5vdCBleGlzdHMsIGluZmxhdGUgcmV0dXJuIFpfQlVGX0VSUk9SLlxuICAgIC8vIEhlcmUgd2Ugc2V0IGZsYWcgdG8gcHJvY2VzcyB0aGlzIGVycm9yIHByb3Blcmx5LlxuICAgIC8vXG4gICAgLy8gTk9URS4gRGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkcyBzdWNoXG4gICAgLy8gbG9naWMuXG4gICAgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIGFsbG93QnVmRXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQpO1xuXG4gIGlmIChzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EKSB7XG4gICAgX21vZGUgPSBjLlpfRklOSVNIO1xuICB9XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IGMuWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKGMuWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogSW5mbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3V0cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGluZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIGVpdGhlciBhZnRlciB5b3UgdGVsbCBpbmZsYXRlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpc1xuICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKVxuICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBjaHVua3MsXG4gKiBmcmVlIG1lbW9yeSBhbmQgZmlsbCBgcmVzdWx0c2AgLyBgZXJyYCBwcm9wZXJ0aWVzLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IGMuWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBHbHVlICYgY29udmVydCBoZXJlLCB1bnRpbCB3ZSB0ZWFjaCBwYWtvIHRvIHNlbmRcbiAgICAgIC8vIHV0ZjggYWxpZ25lZCBzdHJpbmdzIHRvIG9uRGF0YVxuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBpbmZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIERlY29tcHJlc3MgYGRhdGFgIHdpdGggaW5mbGF0ZS91bmd6aXAgYW5kIGBvcHRpb25zYC4gQXV0b2RldGVjdFxuICogZm9ybWF0IHZpYSB3cmFwcGVyIGhlYWRlciBieSBkZWZhdWx0LiBUaGF0J3Mgd2h5IHdlIGRvbid0IHByb3ZpZGVcbiAqIHNlcGFyYXRlIGB1bmd6aXBgIG1ldGhvZC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSB3aW5kb3dCaXRzXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGlucHV0ID0gcGFrby5kZWZsYXRlKFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgb3V0cHV0O1xuICpcbiAqIHRyeSB7XG4gKiAgIG91dHB1dCA9IHBha28uaW5mbGF0ZShpbnB1dCk7XG4gKiB9IGNhdGNoIChlcnIpXG4gKiAgIGNvbnNvbGUubG9nKGVycik7XG4gKiB9XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGluZmxhdG9yID0gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgaW5mbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGluZmxhdG9yLmVycikgeyB0aHJvdyBpbmZsYXRvci5tc2cgfHwgbXNnW2luZmxhdG9yLmVycl07IH1cblxuICByZXR1cm4gaW5mbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogaW5mbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2luZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gaW5mbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiB1bmd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogSnVzdCBzaG9ydGN1dCB0byBbW2luZmxhdGVdXSwgYmVjYXVzZSBpdCBhdXRvZGV0ZWN0cyBmb3JtYXRcbiAqIGJ5IGhlYWRlci5jb250ZW50LiBEb25lIGZvciBjb252ZW5pZW5jZS5cbiAqKi9cblxuXG5leHBvcnRzLkluZmxhdGUgPSBJbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZVJhdyA9IGluZmxhdGVSYXc7XG5leHBvcnRzLnVuZ3ppcCAgPSBpbmZsYXRlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBUWVBFRF9PSyA9ICAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgVWludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG5mdW5jdGlvbiBfaGFzKG9iaiwga2V5KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xufVxuXG5leHBvcnRzLmFzc2lnbiA9IGZ1bmN0aW9uIChvYmogLypmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4qLykge1xuICB2YXIgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHdoaWxlIChzb3VyY2VzLmxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG4gICAgaWYgKCFzb3VyY2UpIHsgY29udGludWU7IH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzb3VyY2UgKyAnbXVzdCBiZSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChfaGFzKHNvdXJjZSwgcCkpIHtcbiAgICAgICAgb2JqW3BdID0gc291cmNlW3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG5cbi8vIHJlZHVjZSBidWZmZXIgc2l6ZSwgYXZvaWRpbmcgbWVtIGNvcHlcbmV4cG9ydHMuc2hyaW5rQnVmID0gZnVuY3Rpb24gKGJ1Ziwgc2l6ZSkge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gc2l6ZSkgeyByZXR1cm4gYnVmOyB9XG4gIGlmIChidWYuc3ViYXJyYXkpIHsgcmV0dXJuIGJ1Zi5zdWJhcnJheSgwLCBzaXplKTsgfVxuICBidWYubGVuZ3RoID0gc2l6ZTtcbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxudmFyIGZuVHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBpZiAoc3JjLnN1YmFycmF5ICYmIGRlc3Quc3ViYXJyYXkpIHtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNfb2Zmcywgc3JjX29mZnMgKyBsZW4pLCBkZXN0X29mZnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBvcmRpbmFyeSBhcnJheVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHZhciBpLCBsLCBsZW4sIHBvcywgY2h1bmssIHJlc3VsdDtcblxuICAgIC8vIGNhbGN1bGF0ZSBkYXRhIGxlbmd0aFxuICAgIGxlbiA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGxlbiArPSBjaHVua3NbaV0ubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIGpvaW4gY2h1bmtzXG4gICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBwb3MgPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7XG4gICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBmblVudHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBjaHVua3MpO1xuICB9XG59O1xuXG5cbi8vIEVuYWJsZS9EaXNhYmxlIHR5cGVkIGFycmF5cyB1c2UsIGZvciB0ZXN0aW5nXG4vL1xuZXhwb3J0cy5zZXRUeXBlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24pIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gVWludDhBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gVWludDE2QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEludDMyQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5UeXBlZCk7XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5VbnR5cGVkKTtcbiAgfVxufTtcblxuZXhwb3J0cy5zZXRUeXBlZChUWVBFRF9PSyk7XG4iLCIvLyBTdHJpbmcgZW5jb2RlL2RlY29kZSBoZWxwZXJzXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG4vLyBRdWljayBjaGVjayBpZiB3ZSBjYW4gdXNlIGZhc3QgYXJyYXkgdG8gYmluIHN0cmluZyBjb252ZXJzaW9uXG4vL1xuLy8gLSBhcHBseShBcnJheSkgY2FuIGZhaWwgb24gQW5kcm9pZCAyLjJcbi8vIC0gYXBwbHkoVWludDhBcnJheSkgY2FuIGZhaWwgb24gaU9TIDUuMSBTYWZhcmlcbi8vXG52YXIgU1RSX0FQUExZX09LID0gdHJ1ZTtcbnZhciBTVFJfQVBQTFlfVUlBX09LID0gdHJ1ZTtcblxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBbIDAgXSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9PSyA9IGZhbHNlOyB9XG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX1VJQV9PSyA9IGZhbHNlOyB9XG5cblxuLy8gVGFibGUgd2l0aCB1dGY4IGxlbmd0aHMgKGNhbGN1bGF0ZWQgYnkgZmlyc3QgYnl0ZSBvZiBzZXF1ZW5jZSlcbi8vIE5vdGUsIHRoYXQgNSAmIDYtYnl0ZSB2YWx1ZXMgYW5kIHNvbWUgNC1ieXRlIHZhbHVlcyBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGluIEpTLFxuLy8gYmVjYXVzZSBtYXggcG9zc2libGUgY29kZXBvaW50IGlzIDB4MTBmZmZmXG52YXIgX3V0ZjhsZW4gPSBuZXcgdXRpbHMuQnVmOCgyNTYpO1xuZm9yICh2YXIgcSA9IDA7IHEgPCAyNTY7IHErKykge1xuICBfdXRmOGxlbltxXSA9IChxID49IDI1MiA/IDYgOiBxID49IDI0OCA/IDUgOiBxID49IDI0MCA/IDQgOiBxID49IDIyNCA/IDMgOiBxID49IDE5MiA/IDIgOiAxKTtcbn1cbl91dGY4bGVuWzI1NF0gPSBfdXRmOGxlblsyNTRdID0gMTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG5cbi8vIGNvbnZlcnQgc3RyaW5nIHRvIGFycmF5ICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgLy8gY291bnQgYmluYXJ5IHNpemVcbiAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgYnVmX2xlbiArPSBjIDwgMHg4MCA/IDEgOiBjIDwgMHg4MDAgPyAyIDogYyA8IDB4MTAwMDAgPyAzIDogNDtcbiAgfVxuXG4gIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICBidWYgPSBuZXcgdXRpbHMuQnVmOChidWZfbGVuKTtcblxuICAvLyBjb252ZXJ0XG4gIGZvciAoaSA9IDAsIG1fcG9zID0gMDsgaSA8IGJ1Zl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgIGJ1ZltpKytdID0gYztcbiAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgLyogdHdvIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4QzAgfCAoYyA+Pj4gNik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIC8qIHRocmVlIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4RTAgfCAoYyA+Pj4gMTIpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWY7XG59O1xuXG4vLyBIZWxwZXIgKHVzZWQgaW4gMiBwbGFjZXMpXG5mdW5jdGlvbiBidWYyYmluc3RyaW5nKGJ1ZiwgbGVuKSB7XG4gIC8vIE9uIENocm9tZSwgdGhlIGFyZ3VtZW50cyBpbiBhIGZ1bmN0aW9uIGNhbGwgdGhhdCBhcmUgYWxsb3dlZCBpcyBgNjU1MzRgLlxuICAvLyBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaXMgc21hbGxlciB0aGFuIHRoYXQsIHdlIGNhbiB1c2UgdGhpcyBvcHRpbWl6YXRpb24sXG4gIC8vIG90aGVyd2lzZSB3ZSB3aWxsIHRha2UgYSBzbG93ZXIgcGF0aC5cbiAgaWYgKGxlbiA8IDY1NTM0KSB7XG4gICAgaWYgKChidWYuc3ViYXJyYXkgJiYgU1RSX0FQUExZX1VJQV9PSykgfHwgKCFidWYuc3ViYXJyYXkgJiYgU1RSX0FQUExZX09LKSkge1xuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdXRpbHMuc2hyaW5rQnVmKGJ1ZiwgbGVuKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlc3VsdCA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8vIENvbnZlcnQgYnl0ZSBhcnJheSB0byBiaW5hcnkgc3RyaW5nXG5leHBvcnRzLmJ1ZjJiaW5zdHJpbmcgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIHJldHVybiBidWYyYmluc3RyaW5nKGJ1ZiwgYnVmLmxlbmd0aCk7XG59O1xuXG5cbi8vIENvbnZlcnQgYmluYXJ5IHN0cmluZyAodHlwZWQsIHdoZW4gcG9zc2libGUpXG5leHBvcnRzLmJpbnN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBidWYgPSBuZXcgdXRpbHMuQnVmOChzdHIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJ1Zi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGJ1ZltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBidWY7XG59O1xuXG5cbi8vIGNvbnZlcnQgYXJyYXkgdG8gc3RyaW5nXG5leHBvcnRzLmJ1ZjJzdHJpbmcgPSBmdW5jdGlvbiAoYnVmLCBtYXgpIHtcbiAgdmFyIGksIG91dCwgYywgY19sZW47XG4gIHZhciBsZW4gPSBtYXggfHwgYnVmLmxlbmd0aDtcblxuICAvLyBSZXNlcnZlIG1heCBwb3NzaWJsZSBsZW5ndGggKDIgd29yZHMgcGVyIGNoYXIpXG4gIC8vIE5COiBieSB1bmtub3duIHJlYXNvbnMsIEFycmF5IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIGZvclxuICAvLyAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSB0aGFuIFVpbnQxNkFycmF5LlxuICB2YXIgdXRmMTZidWYgPSBuZXcgQXJyYXkobGVuICogMik7XG5cbiAgZm9yIChvdXQgPSAwLCBpID0gMDsgaSA8IGxlbjspIHtcbiAgICBjID0gYnVmW2krK107XG4gICAgLy8gcXVpY2sgcHJvY2VzcyBhc2NpaVxuICAgIGlmIChjIDwgMHg4MCkgeyB1dGYxNmJ1ZltvdXQrK10gPSBjOyBjb250aW51ZTsgfVxuXG4gICAgY19sZW4gPSBfdXRmOGxlbltjXTtcbiAgICAvLyBza2lwIDUgJiA2IGJ5dGUgY29kZXNcbiAgICBpZiAoY19sZW4gPiA0KSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgaSArPSBjX2xlbiAtIDE7IGNvbnRpbnVlOyB9XG5cbiAgICAvLyBhcHBseSBtYXNrIG9uIGZpcnN0IGJ5dGVcbiAgICBjICY9IGNfbGVuID09PSAyID8gMHgxZiA6IGNfbGVuID09PSAzID8gMHgwZiA6IDB4MDc7XG4gICAgLy8gam9pbiB0aGUgcmVzdFxuICAgIHdoaWxlIChjX2xlbiA+IDEgJiYgaSA8IGxlbikge1xuICAgICAgYyA9IChjIDw8IDYpIHwgKGJ1ZltpKytdICYgMHgzZik7XG4gICAgICBjX2xlbi0tO1xuICAgIH1cblxuICAgIC8vIHRlcm1pbmF0ZWQgYnkgZW5kIG9mIHN0cmluZz9cbiAgICBpZiAoY19sZW4gPiAxKSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgY29udGludWU7IH1cblxuICAgIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgdXRmMTZidWZbb3V0KytdID0gYztcbiAgICB9IGVsc2Uge1xuICAgICAgYyAtPSAweDEwMDAwO1xuICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkODAwIHwgKChjID4+IDEwKSAmIDB4M2ZmKTtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZGMwMCB8IChjICYgMHgzZmYpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWYyYmluc3RyaW5nKHV0ZjE2YnVmLCBvdXQpO1xufTtcblxuXG4vLyBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHBvc2l0aW9uIGluIHV0ZjggYnVmZmVyLFxuLy8gdGhhdCB3aWxsIG5vdCBicmVhayBzZXF1ZW5jZS4gSWYgdGhhdCdzIG5vdCBwb3NzaWJsZVxuLy8gLSAodmVyeSBzbWFsbCBsaW1pdHMpIHJldHVybiBtYXggc2l6ZSBhcyBpcy5cbi8vXG4vLyBidWZbXSAtIHV0ZjggYnl0ZXMgYXJyYXlcbi8vIG1heCAgIC0gbGVuZ3RoIGxpbWl0IChtYW5kYXRvcnkpO1xuZXhwb3J0cy51dGY4Ym9yZGVyID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBwb3M7XG5cbiAgbWF4ID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG4gIGlmIChtYXggPiBidWYubGVuZ3RoKSB7IG1heCA9IGJ1Zi5sZW5ndGg7IH1cblxuICAvLyBnbyBiYWNrIGZyb20gbGFzdCBwb3NpdGlvbiwgdW50aWwgc3RhcnQgb2Ygc2VxdWVuY2UgZm91bmRcbiAgcG9zID0gbWF4IC0gMTtcbiAgd2hpbGUgKHBvcyA+PSAwICYmIChidWZbcG9zXSAmIDB4QzApID09PSAweDgwKSB7IHBvcy0tOyB9XG5cbiAgLy8gVmVyeSBzbWFsbCBhbmQgYnJva2VuIHNlcXVlbmNlLFxuICAvLyByZXR1cm4gbWF4LCBiZWNhdXNlIHdlIHNob3VsZCByZXR1cm4gc29tZXRoaW5nIGFueXdheS5cbiAgaWYgKHBvcyA8IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIC8vIElmIHdlIGNhbWUgdG8gc3RhcnQgb2YgYnVmZmVyIC0gdGhhdCBtZWFucyBidWZmZXIgaXMgdG9vIHNtYWxsLFxuICAvLyByZXR1cm4gbWF4IHRvby5cbiAgaWYgKHBvcyA9PT0gMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgcmV0dXJuIChwb3MgKyBfdXRmOGxlbltidWZbcG9zXV0gPiBtYXgpID8gcG9zIDogbWF4O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogYWRsZXIzMiB0YWtlcyAxMiUgZm9yIGxldmVsIDAgYW5kIDIlIGZvciBsZXZlbCA2LlxuLy8gSXQgaXNuJ3Qgd29ydGggaXQgdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gYWRsZXIzMihhZGxlciwgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgczEgPSAoYWRsZXIgJiAweGZmZmYpIHwwLFxuICAgICAgczIgPSAoKGFkbGVyID4+PiAxNikgJiAweGZmZmYpIHwwLFxuICAgICAgbiA9IDA7XG5cbiAgd2hpbGUgKGxlbiAhPT0gMCkge1xuICAgIC8vIFNldCBsaW1pdCB+IHR3aWNlIGxlc3MgdGhhbiA1NTUyLCB0byBrZWVwXG4gICAgLy8gczIgaW4gMzEtYml0cywgYmVjYXVzZSB3ZSBmb3JjZSBzaWduZWQgaW50cy5cbiAgICAvLyBpbiBvdGhlciBjYXNlICU9IHdpbGwgZmFpbC5cbiAgICBuID0gbGVuID4gMjAwMCA/IDIwMDAgOiBsZW47XG4gICAgbGVuIC09IG47XG5cbiAgICBkbyB7XG4gICAgICBzMSA9IChzMSArIGJ1Zltwb3MrK10pIHwwO1xuICAgICAgczIgPSAoczIgKyBzMSkgfDA7XG4gICAgfSB3aGlsZSAoLS1uKTtcblxuICAgIHMxICU9IDY1NTIxO1xuICAgIHMyICU9IDY1NTIxO1xuICB9XG5cbiAgcmV0dXJuIChzMSB8IChzMiA8PCAxNikpIHwwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gYWRsZXIzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICAvKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovXG4gIFpfTk9fRkxVU0g6ICAgICAgICAgMCxcbiAgWl9QQVJUSUFMX0ZMVVNIOiAgICAxLFxuICBaX1NZTkNfRkxVU0g6ICAgICAgIDIsXG4gIFpfRlVMTF9GTFVTSDogICAgICAgMyxcbiAgWl9GSU5JU0g6ICAgICAgICAgICA0LFxuICBaX0JMT0NLOiAgICAgICAgICAgIDUsXG4gIFpfVFJFRVM6ICAgICAgICAgICAgNixcblxuICAvKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICAqL1xuICBaX09LOiAgICAgICAgICAgICAgIDAsXG4gIFpfU1RSRUFNX0VORDogICAgICAgMSxcbiAgWl9ORUVEX0RJQ1Q6ICAgICAgICAyLFxuICBaX0VSUk5POiAgICAgICAgICAgLTEsXG4gIFpfU1RSRUFNX0VSUk9SOiAgICAtMixcbiAgWl9EQVRBX0VSUk9SOiAgICAgIC0zLFxuICAvL1pfTUVNX0VSUk9SOiAgICAgLTQsXG4gIFpfQlVGX0VSUk9SOiAgICAgICAtNSxcbiAgLy9aX1ZFUlNJT05fRVJST1I6IC02LFxuXG4gIC8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuICBaX05PX0NPTVBSRVNTSU9OOiAgICAgICAgIDAsXG4gIFpfQkVTVF9TUEVFRDogICAgICAgICAgICAgMSxcbiAgWl9CRVNUX0NPTVBSRVNTSU9OOiAgICAgICA5LFxuICBaX0RFRkFVTFRfQ09NUFJFU1NJT046ICAgLTEsXG5cblxuICBaX0ZJTFRFUkVEOiAgICAgICAgICAgICAgIDEsXG4gIFpfSFVGRk1BTl9PTkxZOiAgICAgICAgICAgMixcbiAgWl9STEU6ICAgICAgICAgICAgICAgICAgICAzLFxuICBaX0ZJWEVEOiAgICAgICAgICAgICAgICAgIDQsXG4gIFpfREVGQVVMVF9TVFJBVEVHWTogICAgICAgMCxcblxuICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovXG4gIFpfQklOQVJZOiAgICAgICAgICAgICAgICAgMCxcbiAgWl9URVhUOiAgICAgICAgICAgICAgICAgICAxLFxuICAvL1pfQVNDSUk6ICAgICAgICAgICAgICAgIDEsIC8vID0gWl9URVhUIChkZXByZWNhdGVkKVxuICBaX1VOS05PV046ICAgICAgICAgICAgICAgIDIsXG5cbiAgLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG4gIFpfREVGTEFURUQ6ICAgICAgICAgICAgICAgOFxuICAvL1pfTlVMTDogICAgICAgICAgICAgICAgIG51bGwgLy8gVXNlIC0xIG9yIG51bGwgaW5saW5lLCBkZXBlbmRpbmcgb24gdmFyIHR5cGVcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IHdlIGNhbid0IGdldCBzaWduaWZpY2FudCBzcGVlZCBib29zdCBoZXJlLlxuLy8gU28gd3JpdGUgY29kZSB0byBtaW5pbWl6ZSBzaXplIC0gbm8gcHJlZ2VuZXJhdGVkIHRhYmxlc1xuLy8gYW5kIGFycmF5IHRvb2xzIGRlcGVuZGVuY2llcy5cblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vLyBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZVxuZnVuY3Rpb24gbWFrZVRhYmxlKCkge1xuICB2YXIgYywgdGFibGUgPSBbXTtcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDI1NjsgbisrKSB7XG4gICAgYyA9IG47XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCA4OyBrKyspIHtcbiAgICAgIGMgPSAoKGMgJiAxKSA/ICgweEVEQjg4MzIwIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG4gICAgfVxuICAgIHRhYmxlW25dID0gYztcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn1cblxuLy8gQ3JlYXRlIHRhYmxlIG9uIGxvYWQuIEp1c3QgMjU1IHNpZ25lZCBsb25ncy4gTm90IGEgcHJvYmxlbS5cbnZhciBjcmNUYWJsZSA9IG1ha2VUYWJsZSgpO1xuXG5cbmZ1bmN0aW9uIGNyYzMyKGNyYywgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgdCA9IGNyY1RhYmxlLFxuICAgICAgZW5kID0gcG9zICsgbGVuO1xuXG4gIGNyYyBePSAtMTtcblxuICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKyspIHtcbiAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIGJ1ZltpXSkgJiAweEZGXTtcbiAgfVxuXG4gIHJldHVybiAoY3JjIF4gKC0xKSk7IC8vID4+PiAwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gY3JjMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciB0cmVlcyAgID0gcmVxdWlyZSgnLi90cmVlcycpO1xudmFyIGFkbGVyMzIgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIG1zZyAgICAgPSByZXF1aXJlKCcuL21lc3NhZ2VzJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xudmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xuLy92YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG4vL3ZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7XG52YXIgWl9EQVRBX0VSUk9SICAgID0gLTM7XG4vL3ZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG5cbi8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuLy92YXIgWl9OT19DT01QUkVTU0lPTiAgICAgID0gMDtcbi8vdmFyIFpfQkVTVF9TUEVFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0JFU1RfQ09NUFJFU1NJT04gICAgPSA5O1xudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG5cbnZhciBaX0ZJTFRFUkVEICAgICAgICAgICAgPSAxO1xudmFyIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7XG52YXIgWl9STEUgICAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbi8vdmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG4vL3ZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgTUFYX01FTV9MRVZFTCA9IDk7XG4vKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi9cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9NRU1fTEVWRUwgPSA4O1xuXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xudmFyIE1BWF9CSVRTICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBNSU5fTUFUQ0ggPSAzO1xudmFyIE1BWF9NQVRDSCA9IDI1ODtcbnZhciBNSU5fTE9PS0FIRUFEID0gKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpO1xuXG52YXIgUFJFU0VUX0RJQ1QgPSAweDIwO1xuXG52YXIgSU5JVF9TVEFURSA9IDQyO1xudmFyIEVYVFJBX1NUQVRFID0gNjk7XG52YXIgTkFNRV9TVEFURSA9IDczO1xudmFyIENPTU1FTlRfU1RBVEUgPSA5MTtcbnZhciBIQ1JDX1NUQVRFID0gMTAzO1xudmFyIEJVU1lfU1RBVEUgPSAxMTM7XG52YXIgRklOSVNIX1NUQVRFID0gNjY2O1xuXG52YXIgQlNfTkVFRF9NT1JFICAgICAgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi9cbnZhciBCU19CTE9DS19ET05FICAgICA9IDI7IC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqL1xudmFyIEJTX0ZJTklTSF9TVEFSVEVEID0gMzsgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi9cbnZhciBCU19GSU5JU0hfRE9ORSAgICA9IDQ7IC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi9cblxudmFyIE9TX0NPREUgPSAweDAzOyAvLyBVbml4IDopIC4gRG9uJ3QgZGV0ZWN0LCB1c2UgdGhpcyBkZWZhdWx0LlxuXG5mdW5jdGlvbiBlcnIoc3RybSwgZXJyb3JDb2RlKSB7XG4gIHN0cm0ubXNnID0gbXNnW2Vycm9yQ29kZV07XG4gIHJldHVybiBlcnJvckNvZGU7XG59XG5cbmZ1bmN0aW9uIHJhbmsoZikge1xuICByZXR1cm4gKChmKSA8PCAxKSAtICgoZikgPiA0ID8gOSA6IDApO1xufVxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzXG4gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0XG4gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+b3V0cHV0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LlxuICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLlxuICovXG5mdW5jdGlvbiBmbHVzaF9wZW5kaW5nKHN0cm0pIHtcbiAgdmFyIHMgPSBzdHJtLnN0YXRlO1xuXG4gIC8vX3RyX2ZsdXNoX2JpdHMocyk7XG4gIHZhciBsZW4gPSBzLnBlbmRpbmc7XG4gIGlmIChsZW4gPiBzdHJtLmF2YWlsX291dCkge1xuICAgIGxlbiA9IHN0cm0uYXZhaWxfb3V0O1xuICB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbiwgc3RybS5uZXh0X291dCk7XG4gIHN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICBzLnBlbmRpbmdfb3V0ICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAtPSBsZW47XG4gIGlmIChzLnBlbmRpbmcgPT09IDApIHtcbiAgICBzLnBlbmRpbmdfb3V0ID0gMDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkge1xuICB0cmVlcy5fdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIGZsdXNoX3BlbmRpbmcocy5zdHJtKTtcbn1cblxuXG5mdW5jdGlvbiBwdXRfYnl0ZShzLCBiKSB7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci5cbiAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpblxuICogcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIHB1dFNob3J0TVNCKHMsIGIpIHtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKGIgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLCB1cGRhdGUgdGhlIGFkbGVyMzJcbiAqIGFuZCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIEFsbCBkZWZsYXRlKCkgaW5wdXQgZ29lcyB0aHJvdWdoXG4gKiB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZFxuICogYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPmlucHV0IGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LlxuICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRfYnVmKHN0cm0sIGJ1Ziwgc3RhcnQsIHNpemUpIHtcbiAgdmFyIGxlbiA9IHN0cm0uYXZhaWxfaW47XG5cbiAgaWYgKGxlbiA+IHNpemUpIHsgbGVuID0gc2l6ZTsgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybiAwOyB9XG5cbiAgc3RybS5hdmFpbF9pbiAtPSBsZW47XG5cbiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7XG4gIHV0aWxzLmFycmF5U2V0KGJ1Ziwgc3RybS5pbnB1dCwgc3RybS5uZXh0X2luLCBsZW4sIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDIpIHtcbiAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiArPSBsZW47XG4gIHN0cm0udG90YWxfaW4gKz0gbGVuO1xuXG4gIHJldHVybiBsZW47XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmRcbiAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCxcbiAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXNcbiAqIGdhcmJhZ2UuXG4gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50XG4gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLlxuICovXG5mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkge1xuICB2YXIgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAgICAgIC8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqL1xuICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovXG4gIHZhciBtYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi9cbiAgdmFyIGJlc3RfbGVuID0gcy5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqL1xuICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqL1xuICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgICBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwLypOSUwqLztcblxuICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dFxuXG4gIHZhciB3bWFzayA9IHMud19tYXNrO1xuICB2YXIgcHJldiAgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgdmFyIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gIHZhciBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgdmFyIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG5cbiAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuXG4gICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICAvLyBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgXCJDb2RlIHRvbyBjbGV2ZXJcIik7XG5cbiAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi9cbiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7XG4gICAgY2hhaW5fbGVuZ3RoID4+PSAyO1xuICB9XG4gIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuXG4gICAqL1xuICBpZiAobmljZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7IG5pY2VfbWF0Y2ggPSBzLmxvb2thaGVhZDsgfVxuXG4gIC8vIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsIFwibmVlZCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIC8vIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgXCJubyBmdXR1cmVcIik7XG4gICAgbWF0Y2ggPSBjdXJfbWF0Y2g7XG5cbiAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2VcbiAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3dcbiAgICAgKiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IG9jY3VyIG9jY2FzaW9uYWxseSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZFxuICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuXG4gICAgICogSG93ZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBsaW1pdGVkIHRvIHRoZSBsb29rYWhlYWQsIHNvXG4gICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuXG4gICAgICovXG5cbiAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAgICAgIT09IHNjYW5fZW5kICB8fFxuICAgICAgICBfd2luW21hdGNoICsgYmVzdF9sZW4gLSAxXSAhPT0gc2Nhbl9lbmQxIHx8XG4gICAgICAgIF93aW5bbWF0Y2hdICAgICAgICAgICAgICAgICE9PSBfd2luW3NjYW5dIHx8XG4gICAgICAgIF93aW5bKyttYXRjaF0gICAgICAgICAgICAgICE9PSBfd2luW3NjYW4gKyAxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGVcbiAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKVxuICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5XG4gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdFxuICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LlxuICAgICAqL1xuICAgIHNjYW4gKz0gMjtcbiAgICBtYXRjaCsrO1xuICAgIC8vIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsIFwibWF0Y2hbMl0/XCIpO1xuXG4gICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjtcbiAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC5cbiAgICAgKi9cbiAgICBkbyB7XG4gICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG5cbiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG5cbiAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDtcblxuICAgIGlmIChsZW4gPiBiZXN0X2xlbikge1xuICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDtcbiAgICAgIGJlc3RfbGVuID0gbGVuO1xuICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gICAgICBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuICAgIH1cbiAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9PSAwKTtcblxuICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gYmVzdF9sZW47XG4gIH1cbiAgcmV0dXJuIHMubG9va2FoZWFkO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuZnVuY3Rpb24gZmlsbF93aW5kb3cocykge1xuICB2YXIgX3dfc2l6ZSA9IHMud19zaXplO1xuICB2YXIgcCwgbiwgbSwgbW9yZSwgc3RyO1xuXG4gIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsIFwiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDtcblxuICAgIC8vIEpTIGludHMgaGF2ZSAzMiBiaXQsIGJsb2NrIGJlbG93IG5vdCBuZWVkZWRcbiAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqL1xuICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHtcbiAgICAvLyAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHtcbiAgICAvLyAgICAgICAgbW9yZSA9IHdzaXplO1xuICAgIC8vXG4gICAgLy8gIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkge1xuICAgIC8vICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWZcbiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSlcbiAgICAvLyAgICAgICAgICovXG4gICAgLy8gICAgICAgIG1vcmUtLTtcbiAgICAvLyAgICB9XG4gICAgLy99XG5cblxuICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsXG4gICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuXG4gICAgICB1dGlscy5hcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93X3NpemUsIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcblxuICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzXG4gICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDBcbiAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwXG4gICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mXG4gICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLilcbiAgICAgICAqL1xuXG4gICAgICBuID0gcy5oYXNoX3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMuaGVhZFstLXBdO1xuICAgICAgICBzLmhlYWRbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG4gPSBfd19zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLnByZXZbLS1wXTtcbiAgICAgICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0XG4gICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICAgICAqL1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbW9yZSArPSBfd19zaXplO1xuICAgIH1cbiAgICBpZiAocy5zdHJtLmF2YWlsX2luID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzpcbiAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJlxuICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydFxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKVxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMlxuICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLFxuICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmXG4gICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC5cbiAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLlxuICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi5cbiAgICAgKi9cbiAgICAvL0Fzc2VydChtb3JlID49IDIsIFwibW9yZSA8IDJcIik7XG4gICAgbiA9IHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCwgbW9yZSk7XG4gICAgcy5sb29rYWhlYWQgKz0gbjtcblxuICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkge1xuICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgcy5pbnNfaCA9IHMud2luZG93W3N0cl07XG5cbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgMV0pICYgcy5oYXNoX21hc2s7XG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgIENhbGwgdXBkYXRlX2hhc2goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgICBzdHIrKztcbiAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsXG4gICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLlxuICAgICAqL1xuXG4gIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApO1xuXG4gIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuXG4gICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZlxuICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnlcbiAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHRcbiAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuXG4gICAqL1xuLy8gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLndpbmRvd19zaXplKSB7XG4vLyAgICB2YXIgY3VyciA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZDtcbi8vICAgIHZhciBpbml0ID0gMDtcbi8vXG4vLyAgICBpZiAocy5oaWdoX3dhdGVyIDwgY3Vycikge1xuLy8gICAgICAvKiBQcmV2aW91cyBoaWdoIHdhdGVyIG1hcmsgYmVsb3cgY3VycmVudCBkYXRhIC0tIHplcm8gV0lOX0lOSVRcbi8vICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gcy53aW5kb3dfc2l6ZSAtIGN1cnI7XG4vLyAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpXG4vLyAgICAgICAgaW5pdCA9IFdJTl9JTklUO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBjdXJyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDtcbi8vICAgIH1cbi8vICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkge1xuLy8gICAgICAvKiBIaWdoIHdhdGVyIG1hcmsgYXQgb3IgYWJvdmUgY3VycmVudCBkYXRhLCBidXQgYmVsb3cgY3VycmVudCBkYXRhXG4vLyAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwXG4vLyAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpXG4vLyAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgcy0+aGlnaF93YXRlciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7XG4vLyAgICB9XG4vLyAgfVxuLy9cbi8vICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsXG4vLyAgICBcIm5vdCBlbm91Z2ggcm9vbSBmb3Igc2VhcmNoXCIpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IHNpbmNlXG4gKiB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZFxuICogb25seSBmb3IgdGhlIGxldmVsPTAgY29tcHJlc3Npb24gb3B0aW9uLlxuICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGV4dHJhIGNvcHlpbmcgZnJvbVxuICogd2luZG93IHRvIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkge1xuICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZFxuICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjpcbiAgICovXG4gIHZhciBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjtcblxuICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7XG4gICAgbWF4X2Jsb2NrX3NpemUgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSA1O1xuICB9XG5cbiAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IDEpIHtcblxuICAgICAgLy9Bc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHxcbiAgICAgIC8vICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsIFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIGlmICghKHMuc3Ryc3RhcnQgPCBzLndfc2l6ZSArIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHx8XG4vLyAgICAgICAgcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSkpIHtcbi8vICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIH1cblxuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDAgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG4gICAgLy9Bc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsIFwiYmxvY2sgZ29uZVwiKTtcbi8vICAgIGlmIChzLmJsb2NrX3N0YXJ0IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiYmxvY2sgZ29uZVwiKTtcblxuICAgIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gICAgcy5sb29rYWhlYWQgPSAwO1xuXG4gICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovXG4gICAgdmFyIG1heF9zdGFydCA9IHMuYmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTtcblxuICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7XG4gICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqL1xuICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0O1xuICAgICAgcy5zdHJzdGFydCA9IG1heF9zdGFydDtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG5cblxuICAgIH1cbiAgICAvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWVcbiAgICAgKiBuZWdhdGl2ZSBhbmQgdGhlIGRhdGEgd2lsbCBiZSBnb25lOlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cblxuICBzLmluc2VydCA9IDA7XG5cbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG5cbiAgaWYgKHMuc3Ryc3RhcnQgPiBzLmJsb2NrX3N0YXJ0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX05FRURfTU9SRTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50XG4gKiBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0c1xuICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0XG4gKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSFxuICAgICAqL1xuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmICgocy5zdHJzdGFydCAtIGhhc2hfaGVhZCkgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cbiAgICB9XG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy8gY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGgpOyAvLyBmb3IgZGVidWcgb25seVxuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcblxuICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2gvKm1heF9pbnNlcnRfbGVuZ3RoKi8gJiYgcy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmVcbiAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLlxuICAgICAgICAgICAqL1xuICAgICAgICB9IHdoaWxlICgtLXMubWF0Y2hfbGVuZ3RoICE9PSAwKTtcbiAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgfSBlbHNlXG4gICAgICB7XG4gICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAgICAgcy5pbnNfaCA9IHMud2luZG93W3Muc3Ryc3RhcnRdO1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLmluc19oLCBzLndpbmRvd1tzLnN0cnN0YXJ0KzFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90XG4gICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMud2luZG93W3Muc3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gKChzLnN0cnN0YXJ0IDwgKE1JTl9NQVRDSCAtIDEpKSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIHZhciBtYXhfaW5zZXJ0O1xuXG4gIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiZcbiAgICAgICAgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKS8qTUFYX0RJU1QocykqLykge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG5cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSA1ICYmXG4gICAgICAgICAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCAocy5tYXRjaF9sZW5ndGggPT09IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCA+IDQwOTYvKlRPT19GQVIqLykpKSB7XG5cbiAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZVxuICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LlxuICAgICAgICAgKi9cbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnRcbiAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOlxuICAgICAqL1xuICAgIGlmIChzLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLm1hdGNoX2xlbmd0aCA8PSBzLnByZXZfbGVuZ3RoKSB7XG4gICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIO1xuICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovXG5cbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydC0xLCBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGgpO1xuXG4gICAgICAvKioqX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7XG4gICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC5cbiAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3RcbiAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW5cbiAgICAgICAqIHRoZSBoYXNoIHRhYmxlLlxuICAgICAgICovXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTtcbiAgICAgIHMucHJldl9sZW5ndGggLT0gMjtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApO1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICAvKioqL1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGFcbiAgICAgICAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2hcbiAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuXG4gICAgICAgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DS19PTkxZKHMsIDApICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIC8qKiovXG4gICAgICB9XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvclxuICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCBcIm5vIGZsdXNoP1wiKTtcbiAgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICB9XG4gIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9STEUsIHNpbXBseSBsb29rIGZvciBydW5zIG9mIGJ5dGVzLCBnZW5lcmF0ZSBtYXRjaGVzIG9ubHkgb2YgZGlzdGFuY2VcbiAqIG9uZS4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuICAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZlxuICogZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gWl9STEUuKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3JsZShzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuICB2YXIgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovXG4gIHZhciBzY2FuLCBzdHJlbmQ7ICAgICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqL1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7XG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0ID4gMCkge1xuICAgICAgc2NhbiA9IHMuc3Ryc3RhcnQgLSAxO1xuICAgICAgcHJldiA9IF93aW5bc2Nhbl07XG4gICAgICBpZiAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0pIHtcbiAgICAgICAgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgICAgICB9IHdoaWxlIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHtcbiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMubG9va2FoZWFkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChzY2FuIDw9IHMtPndpbmRvdysodUludCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuICAgIH1cblxuICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi9cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMuc3Ryc3RhcnQgLSAxLCBzLm1hdGNoX2xlbmd0aCk7XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3QocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX0hVRkZNQU5fT05MWSwgZG8gbm90IGxvb2sgZm9yIG1hdGNoZXMuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLlxuICogKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YgZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gSHVmZm1hbi4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpdGVyYWwgdG8gd3JpdGUuICovXG4gICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogT3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG4gICAgcy5sb29rYWhlYWQtLTtcbiAgICBzLnN0cnN0YXJ0Kys7XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvblxuICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvXG4gKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmVcbiAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy5cbiAqL1xuZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykge1xuICB0aGlzLmdvb2RfbGVuZ3RoID0gZ29vZF9sZW5ndGg7XG4gIHRoaXMubWF4X2xhenkgPSBtYXhfbGF6eTtcbiAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoO1xuICB0aGlzLm1heF9jaGFpbiA9IG1heF9jaGFpbjtcbiAgdGhpcy5mdW5jID0gZnVuYztcbn1cblxudmFyIGNvbmZpZ3VyYXRpb25fdGFibGU7XG5cbmNvbmZpZ3VyYXRpb25fdGFibGUgPSBbXG4gIC8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi9cbiAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksICAgICAgICAgIC8qIDAgc3RvcmUgb25seSAqL1xuICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAgLyogMSBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgLyogMiAqL1xuICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgLyogMyAqL1xuXG4gIG5ldyBDb25maWcoNCwgNCwgMTYsIDE2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgICAvKiA0IGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAzMiwgMzIsIGRlZmxhdGVfc2xvdyksICAgICAgICAgLyogNSAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNiAqL1xuICBuZXcgQ29uZmlnKDgsIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNyAqL1xuICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgICAgLyogOCAqL1xuICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93KSAgICAgLyogOSBtYXggY29tcHJlc3Npb24gKi9cbl07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSBcImxvbmdlc3QgbWF0Y2hcIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gbG1faW5pdChzKSB7XG4gIHMud2luZG93X3NpemUgPSAyICogcy53X3NpemU7XG5cbiAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICAgKi9cbiAgcy5tYXhfbGF6eV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2xhenk7XG4gIHMuZ29vZF9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZ29vZF9sZW5ndGg7XG4gIHMubmljZV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubmljZV9sZW5ndGg7XG4gIHMubWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2NoYWluO1xuXG4gIHMuc3Ryc3RhcnQgPSAwO1xuICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLmluc2VydCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgcy5pbnNfaCA9IDA7XG59XG5cblxuZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCkge1xuICB0aGlzLnN0cm0gPSBudWxsOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovXG4gIHRoaXMuc3RhdHVzID0gMDsgICAgICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovXG4gIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAgICAgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovXG4gIHRoaXMucGVuZGluZ19idWZfc2l6ZSA9IDA7ICAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovXG4gIHRoaXMucGVuZGluZ19vdXQgPSAwOyAgICAgICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqL1xuICB0aGlzLnBlbmRpbmcgPSAwOyAgICAgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuZ3poZWFkID0gbnVsbDsgICAgICAgICAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqL1xuICB0aGlzLmd6aW5kZXggPSAwOyAgICAgICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi9cbiAgdGhpcy5tZXRob2QgPSBaX0RFRkxBVEVEOyAvKiBjYW4gb25seSBiZSBERUZMQVRFRCAqL1xuICB0aGlzLmxhc3RfZmx1c2ggPSAtMTsgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovXG5cbiAgdGhpcy53X3NpemUgPSAwOyAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovXG4gIHRoaXMud19iaXRzID0gMDsgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqL1xuICB0aGlzLndfbWFzayA9IDA7ICAvKiB3X3NpemUgLSAxICovXG5cbiAgdGhpcy53aW5kb3cgPSBudWxsO1xuICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdyxcbiAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemVcbiAgICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZlxuICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXNcbiAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuXG4gICAqL1xuXG4gIHRoaXMud2luZG93X3NpemUgPSAwO1xuICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlclxuICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LlxuICAgKi9cblxuICB0aGlzLnByZXYgPSBudWxsO1xuICAvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpc1xuICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLlxuICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy5cbiAgICovXG5cbiAgdGhpcy5oZWFkID0gbnVsbDsgICAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqL1xuXG4gIHRoaXMuaW5zX2ggPSAwOyAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqL1xuICB0aGlzLmhhc2hfc2l6ZSA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi9cbiAgdGhpcy5oYXNoX2JpdHMgPSAwOyAgIC8qIGxvZzIoaGFzaF9zaXplKSAqL1xuICB0aGlzLmhhc2hfbWFzayA9IDA7ICAgLyogaGFzaF9zaXplLTEgKi9cblxuICB0aGlzLmhhc2hfc2hpZnQgPSAwO1xuICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dFxuICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3RcbiAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6XG4gICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHNcbiAgICovXG5cbiAgdGhpcy5ibG9ja19zdGFydCA9IDA7XG4gIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0c1xuICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLlxuICAgKi9cblxuICB0aGlzLm1hdGNoX2xlbmd0aCA9IDA7ICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi9cbiAgdGhpcy5wcmV2X21hdGNoID0gMDsgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovXG4gIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovXG4gIHRoaXMuc3Ryc3RhcnQgPSAwOyAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovXG4gIHRoaXMubWF0Y2hfc3RhcnQgPSAwOyAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi9cbiAgdGhpcy5sb29rYWhlYWQgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi9cblxuICB0aGlzLnByZXZfbGVuZ3RoID0gMDtcbiAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLlxuICAgKi9cblxuICB0aGlzLm1heF9jaGFpbl9sZW5ndGggPSAwO1xuICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpc1xuICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlXG4gICAqIHNwZWVkLlxuICAgKi9cblxuICB0aGlzLm1heF9sYXp5X21hdGNoID0gMDtcbiAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseVxuICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvblxuICAgKiBsZXZlbHMgPj0gNC5cbiAgICovXG4gIC8vIFRoYXQncyBhbGlhcyB0byBtYXhfbGF6eV9tYXRjaCwgZG9uJ3QgdXNlIGRpcmVjdGx5XG4gIC8vdGhpcy5tYXhfaW5zZXJ0X2xlbmd0aCA9IDA7XG4gIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90XG4gICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy5cbiAgICovXG5cbiAgdGhpcy5sZXZlbCA9IDA7ICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi9cbiAgdGhpcy5zdHJhdGVneSA9IDA7ICAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovXG5cbiAgdGhpcy5nb29kX21hdGNoID0gMDtcbiAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovXG5cbiAgdGhpcy5uaWNlX21hdGNoID0gMDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqL1xuXG4gICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi9cblxuICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovXG5cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovXG5cbiAgLy8gVXNlIGZsYXQgYXJyYXkgb2YgRE9VQkxFIHNpemUsIHdpdGggaW50ZXJsZWF2ZWQgZmF0YSxcbiAgLy8gYmVjYXVzZSBKUyBkb2VzIG5vdCBzdXBwb3J0IGVmZmVjdGl2ZVxuICB0aGlzLmR5bl9sdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoSEVBUF9TSVpFICogMik7XG4gIHRoaXMuZHluX2R0cmVlICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIERfQ09ERVMgKyAxKSAqIDIpO1xuICB0aGlzLmJsX3RyZWUgICAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBCTF9DT0RFUyArIDEpICogMik7XG4gIHplcm8odGhpcy5keW5fbHRyZWUpO1xuICB6ZXJvKHRoaXMuZHluX2R0cmVlKTtcbiAgemVybyh0aGlzLmJsX3RyZWUpO1xuXG4gIHRoaXMubF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi9cbiAgdGhpcy5kX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi9cbiAgdGhpcy5ibF9kZXNjICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGJpdCBsZW5ndGggdHJlZSAqL1xuXG4gIC8vdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdO1xuICB0aGlzLmJsX2NvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vaW50IGhlYXBbMipMX0NPREVTKzFdOyAgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB6ZXJvKHRoaXMuaGVhcCk7XG5cbiAgdGhpcy5oZWFwX2xlbiA9IDA7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovXG4gIHRoaXMuaGVhcF9tYXggPSAwOyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi9cbiAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy5cbiAgICovXG5cbiAgdGhpcy5kZXB0aCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAvL3VjaCBkZXB0aFsyKkxfQ09ERVMrMV07XG4gIHplcm8odGhpcy5kZXB0aCk7XG4gIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3lcbiAgICovXG5cbiAgdGhpcy5sX2J1ZiA9IDA7ICAgICAgICAgIC8qIGJ1ZmZlciBpbmRleCBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqL1xuXG4gIHRoaXMubGl0X2J1ZnNpemUgPSAwO1xuICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yXG4gICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzpcbiAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVyc1xuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0XG4gICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlblxuICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3JcbiAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKVxuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW5cbiAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS5cbiAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLlxuICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0XG4gICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yXG4gICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnlcbiAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlXG4gICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmdcbiAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS5cbiAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNFxuICAgKi9cblxuICB0aGlzLmxhc3RfbGl0ID0gMDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG5cbiAgdGhpcy5kX2J1ZiA9IDA7XG4gIC8qIEJ1ZmZlciBpbmRleCBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmVcbiAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWdcbiAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LlxuICAgKi9cblxuICB0aGlzLm9wdF9sZW4gPSAwOyAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovXG4gIHRoaXMuc3RhdGljX2xlbiA9IDA7ICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqL1xuICB0aGlzLm1hdGNoZXMgPSAwOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqL1xuICB0aGlzLmluc2VydCA9IDA7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovXG5cblxuICB0aGlzLmJpX2J1ZiA9IDA7XG4gIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0XG4gICAqIHNpZ25pZmljYW50IGJpdHMpLlxuICAgKi9cbiAgdGhpcy5iaV92YWxpZCA9IDA7XG4gIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdFxuICAgKiBhcmUgYWx3YXlzIHplcm8uXG4gICAqL1xuXG4gIC8vIFVzZWQgZm9yIHdpbmRvdyBtZW1vcnkgaW5pdC4gV2Ugc2FmZWx5IGlnbm9yZSBpdCBmb3IgSlMuIFRoYXQgbWFrZXNcbiAgLy8gc2Vuc2Ugb25seSBmb3IgcG9pbnRlcnMgYW5kIG1lbW9yeSBjaGVjayB0b29scy5cbiAgLy90aGlzLmhpZ2hfd2F0ZXIgPSAwO1xuICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmVcbiAgICogdGhpcyBhcmUgc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHdhcm5pbmdzIHdoZW5cbiAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW5cbiAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay5cbiAgICovXG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gMDtcbiAgc3RybS5kYXRhX3R5cGUgPSBaX1VOS05PV047XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHMucGVuZGluZyA9IDA7XG4gIHMucGVuZGluZ19vdXQgPSAwO1xuXG4gIGlmIChzLndyYXAgPCAwKSB7XG4gICAgcy53cmFwID0gLXMud3JhcDtcbiAgICAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqL1xuICB9XG4gIHMuc3RhdHVzID0gKHMud3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFKTtcbiAgc3RybS5hZGxlciA9IChzLndyYXAgPT09IDIpID9cbiAgICAwICAvLyBjcmMzMigwLCBaX05VTEwsIDApXG4gIDpcbiAgICAxOyAvLyBhZGxlcjMyKDAsIFpfTlVMTCwgMClcbiAgcy5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDtcbiAgdHJlZXMuX3RyX2luaXQocyk7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciByZXQgPSBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuICBpZiAocmV0ID09PSBaX09LKSB7XG4gICAgbG1faW5pdChzdHJtLnN0YXRlKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIGlmIChzdHJtLnN0YXRlLndyYXAgIT09IDIpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0cm0uc3RhdGUuZ3poZWFkID0gaGVhZDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkge1xuICBpZiAoIXN0cm0pIHsgLy8gPT09IFpfTlVMTFxuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICB2YXIgd3JhcCA9IDE7XG5cbiAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHtcbiAgICBsZXZlbCA9IDY7XG4gIH1cblxuICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovXG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7XG4gICAgd3JhcCA9IDI7ICAgICAgICAgICAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqL1xuICAgIHdpbmRvd0JpdHMgLT0gMTY7XG4gIH1cblxuXG4gIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCB8fFxuICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8XG4gICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cblxuICBpZiAod2luZG93Qml0cyA9PT0gOCkge1xuICAgIHdpbmRvd0JpdHMgPSA5O1xuICB9XG4gIC8qIHVudGlsIDI1Ni1ieXRlIHdpbmRvdyBidWcgZml4ZWQgKi9cblxuICB2YXIgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTtcblxuICBzdHJtLnN0YXRlID0gcztcbiAgcy5zdHJtID0gc3RybTtcblxuICBzLndyYXAgPSB3cmFwO1xuICBzLmd6aGVhZCA9IG51bGw7XG4gIHMud19iaXRzID0gd2luZG93Qml0cztcbiAgcy53X3NpemUgPSAxIDw8IHMud19iaXRzO1xuICBzLndfbWFzayA9IHMud19zaXplIC0gMTtcblxuICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNztcbiAgcy5oYXNoX3NpemUgPSAxIDw8IHMuaGFzaF9iaXRzO1xuICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTtcbiAgcy5oYXNoX3NoaWZ0ID0gfn4oKHMuaGFzaF9iaXRzICsgTUlOX01BVENIIC0gMSkgLyBNSU5fTUFUQ0gpO1xuXG4gIHMud2luZG93ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUgKiAyKTtcbiAgcy5oZWFkID0gbmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKTtcbiAgcy5wcmV2ID0gbmV3IHV0aWxzLkJ1ZjE2KHMud19zaXplKTtcblxuICAvLyBEb24ndCBuZWVkIG1lbSBpbml0IG1hZ2ljIGZvciBKUy5cbiAgLy9zLmhpZ2hfd2F0ZXIgPSAwOyAgLyogbm90aGluZyB3cml0dGVuIHRvIHMtPndpbmRvdyB5ZXQgKi9cblxuICBzLmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi9cblxuICBzLnBlbmRpbmdfYnVmX3NpemUgPSBzLmxpdF9idWZzaXplICogNDtcblxuICAvL292ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpO1xuICAvL3MtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTtcbiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyB1dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7XG5cbiAgLy8gSXQgaXMgb2Zmc2V0IGZyb20gYHMucGVuZGluZ19idWZgIChzaXplIGlzIGBzLmxpdF9idWZzaXplICogMmApXG4gIC8vcy0+ZF9idWYgPSBvdmVybGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7XG4gIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTtcblxuICAvL3MtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7XG4gIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTtcblxuICBzLmxldmVsID0gbGV2ZWw7XG4gIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgcy5tZXRob2QgPSBtZXRob2Q7XG5cbiAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHtcbiAgcmV0dXJuIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIG9sZF9mbHVzaCwgcztcbiAgdmFyIGJlZywgdmFsOyAvLyBmb3IgZ3ppcCBoZWFkZXIgd3JpdGUgb25seVxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fFxuICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHtcbiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUikgOiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuXG4gIGlmICghc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fFxuICAgICAgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT09IFpfRklOSVNIKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SIDogWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgcy5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovXG4gIG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDtcbiAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7XG5cbiAgLyogV3JpdGUgdGhlIGhlYWRlciAqL1xuICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHtcblxuICAgIGlmIChzLndyYXAgPT09IDIpIHsgLy8gR1pJUCBoZWFkZXJcbiAgICAgIHN0cm0uYWRsZXIgPSAwOyAgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDMxKTtcbiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgICBwdXRfYnl0ZShzLCA4KTtcbiAgICAgIGlmICghcy5nemhlYWQpIHsgLy8gcy0+Z3poZWFkID09IFpfTlVMTFxuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzLmd6aGVhZC5oY3JjID8gMiA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5leHRyYSA/IDAgOiA0KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuY29tbWVudCA/IDAgOiAxNilcbiAgICAgICAgKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQudGltZSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAxNikgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMjQpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQub3MgJiAweGZmKTtcbiAgICAgICAgaWYgKHMuZ3poZWFkLmV4dHJhICYmIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkge1xuICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmYpO1xuICAgICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC5leHRyYS5sZW5ndGggPj4gOCkgJiAweGZmKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcsIDApO1xuICAgICAgICB9XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gRVhUUkFfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgLy8gREVGTEFURSBoZWFkZXJcbiAgICB7XG4gICAgICB2YXIgaGVhZGVyID0gKFpfREVGTEFURUQgKyAoKHMud19iaXRzIC0gOCkgPDwgNCkpIDw8IDg7XG4gICAgICB2YXIgbGV2ZWxfZmxhZ3MgPSAtMTtcblxuICAgICAgaWYgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAwO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsIDwgNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPT09IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAzO1xuICAgICAgfVxuICAgICAgaGVhZGVyIHw9IChsZXZlbF9mbGFncyA8PCA2KTtcbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7IGhlYWRlciB8PSBQUkVTRVRfRElDVDsgfVxuICAgICAgaGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTtcblxuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTtcblxuICAgICAgLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovXG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkge1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IDE7IC8vIGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgfVxuICB9XG5cbi8vI2lmZGVmIEdaSVBcbiAgaWYgKHMuc3RhdHVzID09PSBFWFRSQV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5leHRyYS8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG5cbiAgICAgIHdoaWxlIChzLmd6aW5kZXggPCAocy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZmZmKSkge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhW3MuZ3ppbmRleF0gJiAweGZmKTtcbiAgICAgICAgcy5nemluZGV4Kys7XG4gICAgICB9XG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aW5kZXggPT09IHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IE5BTUVfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQubmFtZS8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLm5hbWUubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gQ09NTUVOVF9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5jb21tZW50LyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQuY29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBIQ1JDX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyID4gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICB9XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA8PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgcHV0X2J5dGUocywgc3RybS5hZGxlciAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICBzdHJtLmFkbGVyID0gMDsgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICB9XG4gIH1cbi8vI2VuZGlmXG5cbiAgLyogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZSAqL1xuICBpZiAocy5wZW5kaW5nICE9PSAwKSB7XG4gICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIC8qIFNpbmNlIGF2YWlsX291dCBpcyAwLCBkZWZsYXRlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGhcbiAgICAgICAqIG1vcmUgb3V0cHV0IHNwYWNlLCBidXQgcG9zc2libHkgd2l0aCBib3RoIHBlbmRpbmcgYW5kXG4gICAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbyxcbiAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvciBzaXR1YXRpb24gc28gbWFrZSBzdXJlIHdlXG4gICAgICAgKiByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgYXQgbmV4dCBjYWxsIG9mIGRlZmxhdGU6XG4gICAgICAgKi9cbiAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgcmV0dXJuIFpfT0s7XG4gICAgfVxuXG4gICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIHNvbWV0aGluZyB0byBkbyBhbmQgYXZvaWQgZHVwbGljYXRlIGNvbnNlY3V0aXZlXG4gICAgICogZmx1c2hlcy4gRm9yIHJlcGVhdGVkIGFuZCB1c2VsZXNzIGNhbGxzIHdpdGggWl9GSU5JU0gsIHdlIGtlZXBcbiAgICAgKiByZXR1cm5pbmcgWl9TVFJFQU1fRU5EIGluc3RlYWQgb2YgWl9CVUZfRVJST1IuXG4gICAgICovXG4gIH0gZWxzZSBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiByYW5rKGZsdXNoKSA8PSByYW5rKG9sZF9mbHVzaCkgJiZcbiAgICBmbHVzaCAhPT0gWl9GSU5JU0gpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfQlVGX0VSUk9SKTtcbiAgfVxuXG4gIC8qIFVzZXIgbXVzdCBub3QgcHJvdmlkZSBtb3JlIGlucHV0IGFmdGVyIHRoZSBmaXJzdCBGSU5JU0g6ICovXG4gIGlmIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfQlVGX0VSUk9SKTtcbiAgfVxuXG4gIC8qIFN0YXJ0IGEgbmV3IGJsb2NrIG9yIGNvbnRpbnVlIHRoZSBjdXJyZW50IG9uZS5cbiAgICovXG4gIGlmIChzdHJtLmF2YWlsX2luICE9PSAwIHx8IHMubG9va2FoZWFkICE9PSAwIHx8XG4gICAgKGZsdXNoICE9PSBaX05PX0ZMVVNIICYmIHMuc3RhdHVzICE9PSBGSU5JU0hfU1RBVEUpKSB7XG4gICAgdmFyIGJzdGF0ZSA9IChzLnN0cmF0ZWd5ID09PSBaX0hVRkZNQU5fT05MWSkgPyBkZWZsYXRlX2h1ZmYocywgZmx1c2gpIDpcbiAgICAgIChzLnN0cmF0ZWd5ID09PSBaX1JMRSA/IGRlZmxhdGVfcmxlKHMsIGZsdXNoKSA6XG4gICAgICAgIGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZnVuYyhzLCBmbHVzaCkpO1xuXG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfRE9ORSkge1xuICAgICAgcy5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7XG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX05FRURfTU9SRSB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEKSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICAgIC8qIGF2b2lkIEJVRl9FUlJPUiBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqL1xuICAgICAgfVxuICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICAvKiBJZiBmbHVzaCAhPSBaX05PX0ZMVVNIICYmIGF2YWlsX291dCA9PSAwLCB0aGUgbmV4dCBjYWxsXG4gICAgICAgKiBvZiBkZWZsYXRlIHNob3VsZCB1c2UgdGhlIHNhbWUgZmx1c2ggcGFyYW1ldGVyIHRvIG1ha2Ugc3VyZVxuICAgICAgICogdGhhdCB0aGUgZmx1c2ggaXMgY29tcGxldGUuIFNvIHdlIGRvbid0IGhhdmUgdG8gb3V0cHV0IGFuXG4gICAgICAgKiBlbXB0eSBibG9jayBoZXJlLCB0aGlzIHdpbGwgYmUgZG9uZSBhdCBuZXh0IGNhbGwuIFRoaXMgYWxzb1xuICAgICAgICogZW5zdXJlcyB0aGF0IGZvciBhIHZlcnkgc21hbGwgb3V0cHV0IGJ1ZmZlciwgd2UgZW1pdCBhdCBtb3N0XG4gICAgICAgKiBvbmUgZW1wdHkgYmxvY2suXG4gICAgICAgKi9cbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfQkxPQ0tfRE9ORSkge1xuICAgICAgaWYgKGZsdXNoID09PSBaX1BBUlRJQUxfRkxVU0gpIHtcbiAgICAgICAgdHJlZXMuX3RyX2FsaWduKHMpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZmx1c2ggIT09IFpfQkxPQ0spIHsgLyogRlVMTF9GTFVTSCBvciBTWU5DX0ZMVVNIICovXG5cbiAgICAgICAgdHJlZXMuX3RyX3N0b3JlZF9ibG9jayhzLCAwLCAwLCBmYWxzZSk7XG4gICAgICAgIC8qIEZvciBhIGZ1bGwgZmx1c2gsIHRoaXMgZW1wdHkgYmxvY2sgd2lsbCBiZSByZWNvZ25pemVkXG4gICAgICAgICAqIGFzIGEgc3BlY2lhbCBtYXJrZXIgYnkgaW5mbGF0ZV9zeW5jKCkuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfRlVMTF9GTFVTSCkge1xuICAgICAgICAgIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqLyAgICAgICAgICAgICAvKiBmb3JnZXQgaGlzdG9yeSAqL1xuICAgICAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICAgICAgcy5zdHJzdGFydCA9IDA7XG4gICAgICAgICAgICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuaW5zZXJ0ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7IC8qIGF2b2lkIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqL1xuICAgICAgICByZXR1cm4gWl9PSztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQoc3RybS0+YXZhaWxfb3V0ID4gMCwgXCJidWcyXCIpO1xuICAvL2lmIChzdHJtLmF2YWlsX291dCA8PSAwKSB7IHRocm93IG5ldyBFcnJvcihcImJ1ZzJcIik7fVxuXG4gIGlmIChmbHVzaCAhPT0gWl9GSU5JU0gpIHsgcmV0dXJuIFpfT0s7IH1cbiAgaWYgKHMud3JhcCA8PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FTkQ7IH1cblxuICAvKiBXcml0ZSB0aGUgdHJhaWxlciAqL1xuICBpZiAocy53cmFwID09PSAyKSB7XG4gICAgcHV0X2J5dGUocywgc3RybS5hZGxlciAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gMTYpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gMjQpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgc3RybS50b3RhbF9pbiAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDgpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gMTYpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gMjQpICYgMHhmZik7XG4gIH1cbiAgZWxzZVxuICB7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpO1xuICB9XG5cbiAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgLyogSWYgYXZhaWxfb3V0IGlzIHplcm8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgZGVmbGF0ZSBhZ2FpblxuICAgKiB0byBmbHVzaCB0aGUgcmVzdC5cbiAgICovXG4gIGlmIChzLndyYXAgPiAwKSB7IHMud3JhcCA9IC1zLndyYXA7IH1cbiAgLyogd3JpdGUgdGhlIHRyYWlsZXIgb25seSBvbmNlISAqL1xuICByZXR1cm4gcy5wZW5kaW5nICE9PSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUVuZChzdHJtKSB7XG4gIHZhciBzdGF0dXM7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0dXMgPSBzdHJtLnN0YXRlLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gSU5JVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRVhUUkFfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IE5BTUVfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IENPTU1FTlRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEhDUkNfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEJVU1lfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEZJTklTSF9TVEFURVxuICApIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuXG4gIHJldHVybiBzdGF0dXMgPT09IEJVU1lfU1RBVEUgPyBlcnIoc3RybSwgWl9EQVRBX0VSUk9SKSA6IFpfT0s7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZVxuICogc2VxdWVuY2Ugd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LlxuICovXG5mdW5jdGlvbiBkZWZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHM7XG4gIHZhciBzdHIsIG47XG4gIHZhciB3cmFwO1xuICB2YXIgYXZhaWw7XG4gIHZhciBuZXh0O1xuICB2YXIgaW5wdXQ7XG4gIHZhciB0bXBEaWN0O1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHdyYXAgPSBzLndyYXA7XG5cbiAgaWYgKHdyYXAgPT09IDIgfHwgKHdyYXAgPT09IDEgJiYgcy5zdGF0dXMgIT09IElOSVRfU1RBVEUpIHx8IHMubG9va2FoZWFkKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogd2hlbiB1c2luZyB6bGliIHdyYXBwZXJzLCBjb21wdXRlIEFkbGVyLTMyIGZvciBwcm92aWRlZCBkaWN0aW9uYXJ5ICovXG4gIGlmICh3cmFwID09PSAxKSB7XG4gICAgLyogYWRsZXIzMihzdHJtLT5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7ICovXG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gIH1cblxuICBzLndyYXAgPSAwOyAgIC8qIGF2b2lkIGNvbXB1dGluZyBBZGxlci0zMiBpbiByZWFkX2J1ZiAqL1xuXG4gIC8qIGlmIGRpY3Rpb25hcnkgd291bGQgZmlsbCB3aW5kb3csIGp1c3QgcmVwbGFjZSB0aGUgaGlzdG9yeSAqL1xuICBpZiAoZGljdExlbmd0aCA+PSBzLndfc2l6ZSkge1xuICAgIGlmICh3cmFwID09PSAwKSB7ICAgICAgICAgICAgLyogYWxyZWFkeSBlbXB0eSBvdGhlcndpc2UgKi9cbiAgICAgIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqL1xuICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuICAgICAgcy5zdHJzdGFydCA9IDA7XG4gICAgICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgICAgIHMuaW5zZXJ0ID0gMDtcbiAgICB9XG4gICAgLyogdXNlIHRoZSB0YWlsICovXG4gICAgLy8gZGljdGlvbmFyeSA9IGRpY3Rpb25hcnkuc2xpY2UoZGljdExlbmd0aCAtIHMud19zaXplKTtcbiAgICB0bXBEaWN0ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUpO1xuICAgIHV0aWxzLmFycmF5U2V0KHRtcERpY3QsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGggLSBzLndfc2l6ZSwgcy53X3NpemUsIDApO1xuICAgIGRpY3Rpb25hcnkgPSB0bXBEaWN0O1xuICAgIGRpY3RMZW5ndGggPSBzLndfc2l6ZTtcbiAgfVxuICAvKiBpbnNlcnQgZGljdGlvbmFyeSBpbnRvIHdpbmRvdyBhbmQgaGFzaCAqL1xuICBhdmFpbCA9IHN0cm0uYXZhaWxfaW47XG4gIG5leHQgPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGRpY3RMZW5ndGg7XG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uaW5wdXQgPSBkaWN0aW9uYXJ5O1xuICBmaWxsX3dpbmRvdyhzKTtcbiAgd2hpbGUgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgIHN0ciA9IHMuc3Ryc3RhcnQ7XG4gICAgbiA9IHMubG9va2FoZWFkIC0gKE1JTl9NQVRDSCAtIDEpO1xuICAgIGRvIHtcbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4gICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuXG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICBzdHIrKztcbiAgICB9IHdoaWxlICgtLW4pO1xuICAgIHMuc3Ryc3RhcnQgPSBzdHI7XG4gICAgcy5sb29rYWhlYWQgPSBNSU5fTUFUQ0ggLSAxO1xuICAgIGZpbGxfd2luZG93KHMpO1xuICB9XG4gIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gIHMuYmxvY2tfc3RhcnQgPSBzLnN0cnN0YXJ0O1xuICBzLmluc2VydCA9IHMubG9va2FoZWFkO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5pbnB1dCA9IGlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gYXZhaWw7XG4gIHMud3JhcCA9IHdyYXA7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmV4cG9ydHMuZGVmbGF0ZUluaXQgPSBkZWZsYXRlSW5pdDtcbmV4cG9ydHMuZGVmbGF0ZUluaXQyID0gZGVmbGF0ZUluaXQyO1xuZXhwb3J0cy5kZWZsYXRlUmVzZXQgPSBkZWZsYXRlUmVzZXQ7XG5leHBvcnRzLmRlZmxhdGVSZXNldEtlZXAgPSBkZWZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5kZWZsYXRlU2V0SGVhZGVyID0gZGVmbGF0ZVNldEhlYWRlcjtcbmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGVFbmQgPSBkZWZsYXRlRW5kO1xuZXhwb3J0cy5kZWZsYXRlU2V0RGljdGlvbmFyeSA9IGRlZmxhdGVTZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5kZWZsYXRlSW5mbyA9ICdwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpJztcblxuLyogTm90IGltcGxlbWVudGVkXG5leHBvcnRzLmRlZmxhdGVCb3VuZCA9IGRlZmxhdGVCb3VuZDtcbmV4cG9ydHMuZGVmbGF0ZUNvcHkgPSBkZWZsYXRlQ29weTtcbmV4cG9ydHMuZGVmbGF0ZVBhcmFtcyA9IGRlZmxhdGVQYXJhbXM7XG5leHBvcnRzLmRlZmxhdGVQZW5kaW5nID0gZGVmbGF0ZVBlbmRpbmc7XG5leHBvcnRzLmRlZmxhdGVQcmltZSA9IGRlZmxhdGVQcmltZTtcbmV4cG9ydHMuZGVmbGF0ZVR1bmUgPSBkZWZsYXRlVHVuZTtcbiovXG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gR1poZWFkZXIoKSB7XG4gIC8qIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHQgKi9cbiAgdGhpcy50ZXh0ICAgICAgID0gMDtcbiAgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi9cbiAgdGhpcy50aW1lICAgICAgID0gMDtcbiAgLyogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi9cbiAgdGhpcy54ZmxhZ3MgICAgID0gMDtcbiAgLyogb3BlcmF0aW5nIHN5c3RlbSAqL1xuICB0aGlzLm9zICAgICAgICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICovXG4gIHRoaXMuZXh0cmEgICAgICA9IG51bGw7XG4gIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqL1xuICB0aGlzLmV4dHJhX2xlbiAgPSAwOyAvLyBBY3R1YWxseSwgd2UgZG9uJ3QgbmVlZCBpdCBpbiBKUyxcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGxlYXZlIGZvciBmZXcgY29kZSBtb2RpZmljYXRpb25zXG5cbiAgLy9cbiAgLy8gU2V0dXAgbGltaXRzIGlzIG5vdCBuZWNlc3NhcnkgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeVxuICAvLyBmb3IgaW5mbGF0ZSB1c2UgY29uc3RhbnQgbGltaXQgaW4gNjU1MzYgYnl0ZXNcbiAgLy9cblxuICAvKiBzcGFjZSBhdCBleHRyYSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmV4dHJhX21heCAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICovXG4gIHRoaXMubmFtZSAgICAgICA9ICcnO1xuICAvKiBzcGFjZSBhdCBuYW1lIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMubmFtZV9tYXggICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGNvbW1lbnQgb3IgWl9OVUxMICovXG4gIHRoaXMuY29tbWVudCAgICA9ICcnO1xuICAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuY29tbV9tYXggICA9IDA7XG4gIC8qIHRydWUgaWYgdGhlcmUgd2FzIG9yIHdpbGwgYmUgYSBoZWFkZXIgY3JjICovXG4gIHRoaXMuaGNyYyAgICAgICA9IDA7XG4gIC8qIHRydWUgd2hlbiBkb25lIHJlYWRpbmcgZ3ppcCBoZWFkZXIgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi9cbiAgdGhpcy5kb25lICAgICAgID0gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR1poZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuLy8gU2VlIHN0YXRlIGRlZnMgZnJvbSBpbmZsYXRlLmpzXG52YXIgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xuXG4vKlxuICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZ1xuICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzXG4gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvclxuICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZVxuICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuXG5cbiAgIEVudHJ5IGFzc3VtcHRpb25zOlxuXG4gICAgICAgIHN0YXRlLm1vZGUgPT09IExFTlxuICAgICAgICBzdHJtLmF2YWlsX2luID49IDZcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPj0gMjU4XG4gICAgICAgIHN0YXJ0ID49IHN0cm0uYXZhaWxfb3V0XG4gICAgICAgIHN0YXRlLmJpdHMgPCA4XG5cbiAgIE9uIHJldHVybiwgc3RhdGUubW9kZSBpcyBvbmUgb2Y6XG5cbiAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0XG4gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrXG4gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhXG5cbiAgIE5vdGVzOlxuXG4gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGVcbiAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLFxuICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy5cbiAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkXG4gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLlxuXG4gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4XG4gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KClcbiAgICAgIHJlcXVpcmVzIHN0cm0uYXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvclxuICAgICAgb3V0cHV0IHNwYWNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmlucHV0ICovXG4gIHZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBoYXZlIGVub3VnaCBpbnB1dCB3aGlsZSBpbiA8IGxhc3QgKi9cbiAgdmFyIF9vdXQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi9cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIHZhciBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi9cbi8vI2VuZGlmXG4gIHZhciB3c2l6ZTsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdmFyIHdoYXZlOyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdmFyIHduZXh0OyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICAvLyBVc2UgYHNfd2luZG93YCBpbnN0ZWFkIGB3aW5kb3dgLCBhdm9pZCBjb25mbGljdCB3aXRoIGluc3RydW1lbnRhdGlvbiB0b29sc1xuICB2YXIgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmhvbGQgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uYml0cyAqL1xuICB2YXIgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovXG4gIHZhciBkY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmRpc3Rjb2RlICovXG4gIHZhciBsbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi9cbiAgdmFyIGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovXG4gIHZhciBoZXJlOyAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi9cbiAgdmFyIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovXG4gIHZhciBkaXN0OyAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcblxuXG4gIHZhciBpbnB1dCwgb3V0cHV0OyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG5cbiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi9cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICAvL2hlcmUgPSBzdGF0ZS5oZXJlO1xuICBfaW4gPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7XG4gIF9vdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTtcbiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICBkbWF4ID0gc3RhdGUuZG1heDtcbi8vI2VuZGlmXG4gIHdzaXplID0gc3RhdGUud3NpemU7XG4gIHdoYXZlID0gc3RhdGUud2hhdmU7XG4gIHduZXh0ID0gc3RhdGUud25leHQ7XG4gIHNfd2luZG93ID0gc3RhdGUud2luZG93O1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIGxjb2RlID0gc3RhdGUubGVuY29kZTtcbiAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTtcbiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7XG4gIGRtYXNrID0gKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMTtcblxuXG4gIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaFxuICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqL1xuXG4gIHRvcDpcbiAgZG8ge1xuICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgIH1cblxuICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdO1xuXG4gICAgZG9sZW46XG4gICAgZm9yICg7OykgeyAvLyBHb3RvIGVtdWxhdGlvblxuICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICBob2xkID4+Pj0gb3A7XG4gICAgICBiaXRzIC09IG9wO1xuICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuICAgICAgaWYgKG9wID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqL1xuICAgICAgICBsZW4gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICBpZiAob3ApIHtcbiAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBsZW4pKTtcbiAgICAgICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdO1xuXG4gICAgICAgIGRvZGlzdDpcbiAgICAgICAgZm9yICg7OykgeyAvLyBnb3RvIGVtdWxhdGlvblxuICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcblxuICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi9cbiAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBkaXN0KSk7XG4gICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7ICAgICAgICAgICAgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi9cbiAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgICAgICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYXVsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gb3AgLSB3aGF2ZSkge1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgIGxlbiAtPSBvcCAtIHdoYXZlO1xuLy8gICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpO1xuLy8gICAgICAgICAgICAgICAgaWYgKG9wID09PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmcm9tID0gMDsgLy8gd2luZG93IGluZGV4XG4gICAgICAgICAgICAgIGZyb21fc291cmNlID0gc193aW5kb3c7XG4gICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHduZXh0IDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSAwO1xuICAgICAgICAgICAgICAgICAgaWYgKHduZXh0IDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICAgIG9wID0gd25leHQ7XG4gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgICAgIC8qIGNvcHkgZGlyZWN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqL1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTtcbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICAgICAgaGVyZSA9IGRjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgICAgICBjb250aW51ZSBkb2Rpc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgIGNvbnRpbnVlIGRvbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuXG4gICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgIH1cbiAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTtcblxuICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi9cbiAgbGVuID0gYml0cyA+PiAzO1xuICBfaW4gLT0gbGVuO1xuICBiaXRzIC09IGxlbiA8PCAzO1xuICBob2xkICY9ICgxIDw8IGJpdHMpIC0gMTtcblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqL1xuICBzdHJtLm5leHRfaW4gPSBfaW47XG4gIHN0cm0ubmV4dF9vdXQgPSBfb3V0O1xuICBzdHJtLmF2YWlsX2luID0gKF9pbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBfaW4pIDogNSAtIChfaW4gLSBsYXN0KSk7XG4gIHN0cm0uYXZhaWxfb3V0ID0gKF9vdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gX291dCkgOiAyNTcgLSAoX291dCAtIGVuZCkpO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIHJldHVybjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzICAgICAgICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciBhZGxlcjMyICAgICAgID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICAgICAgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBpbmZsYXRlX2Zhc3QgID0gcmVxdWlyZSgnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IHJlcXVpcmUoJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24genN3YXAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA1OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7XG5cbiAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqL1xuICAgIHZpcmdpbiA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDtcbiAgc3RhdGUubGVuYml0cyA9IDk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gZGlzdGZpeDtcbiAgc3RhdGUuZGlzdGJpdHMgPSA1O1xufVxuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHtcbiAgdmFyIGRpc3Q7XG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqL1xuICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7XG4gICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IDA7XG5cbiAgICBzdGF0ZS53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzdGF0ZS53c2l6ZSk7XG4gIH1cblxuICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi9cbiAgaWYgKGNvcHkgPj0gc3RhdGUud3NpemUpIHtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTtcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDtcbiAgICBpZiAoZGlzdCA+IGNvcHkpIHtcbiAgICAgIGRpc3QgPSBjb3B5O1xuICAgIH1cbiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTtcbiAgICAgIHN0YXRlLnduZXh0ID0gY29weTtcbiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsgc3RhdGUud25leHQgPSAwOyB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgdXRpbHMuQnVmOCg0KTsgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgICAgY2FzZSBIRUFEOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCA9PT0gMCkge1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmICgoc3RhdGUud3JhcCAmIDIpICYmIGhvbGQgPT09IDB4OGIxZikgeyAgLyogZ3ppcCBoZWFkZXIgKi9cbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cblxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShzdGF0ZS53cmFwICYgMSkgfHwgICAvKiBjaGVjayBpZiB6bGliIGhlYWRlciBhbGxvd2VkICovXG4gICAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChob2xkICYgMHgwZikvKkJJVFMoNCkqLyAhPT0gWl9ERUZMQVRFRCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgICBiaXRzIC09IDQ7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgbGVuID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgODtcbiAgICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgICAgc3RhdGUud2JpdHMgPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmRtYXggPSAxIDw8IGxlbjtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICBzdGF0ZS5tb2RlID0gaG9sZCAmIDB4MjAwID8gRElDVElEIDogVFlQRTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGTEFHUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmZsYWdzID0gaG9sZDtcbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHhlMDAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50ZXh0ID0gKChob2xkID4+IDgpICYgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVElNRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDQsIDApO1xuICAgICAgICAgIC8vPT09XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBPUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRVhMRU47XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhMRU46XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZDtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhUUkE6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmhlYWQuZXh0cmFfbGVuIC0gc3RhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW50IHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbmV3IEFycmF5KHN0YXRlLmhlYWQuZXh0cmFfbGVuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1dGlscy5hcnJheVNldChcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgICAgLy8gZXh0cmEgZmllbGQgaXMgbGltaXRlZCB0byA2NTUzNiBieXRlc1xuICAgICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgICAvKmxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA/IHN0YXRlLmhlYWQuZXh0cmFfbWF4IDogY29weSwqL1xuICAgICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvL3ptZW1jcHkoc3RhdGUuaGVhZC5leHRyYSArIGxlbiwgbmV4dCxcbiAgICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE5BTUU6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGNvcHkgPSAwO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIFRPRE86IDIgb3IgMSBieXRlcz9cbiAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT01NRU5UOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBjb3B5ID0gMDtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8pKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIEhDUkM6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuaGNyYyA9ICgoc3RhdGUuZmxhZ3MgPj4gOSkgJiAxKTtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElDVElEOlxuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0genN3YXAzMihob2xkKTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJQ1Q6XG4gICAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAgIC8vLS0tXG4gICAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRTpcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIFRZUEVETzpcbiAgICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxhc3QgPSAoaG9sZCAmIDB4MDEpLypCSVRTKDEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAxO1xuICAgICAgICBiaXRzIC09IDE7XG4gICAgICAgIC8vLS0tLy9cblxuICAgICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykge1xuICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTVE9SRUQ6XG4gICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy8gLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqL1xuICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT09ICgoaG9sZCA+Pj4gMTYpIF4gMHhmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZCAmIDB4ZmZmZjtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT1BZXztcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFlfOlxuICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT1BZOlxuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgICAgIGlmIChjb3B5ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgICAgdXRpbHMuYXJyYXlTZXQob3V0cHV0LCBpbnB1dCwgbmV4dCwgY29weSwgcHV0KTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUQUJMRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm5sZW4gPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAyNTc7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg1KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNTtcbiAgICAgICAgYml0cyAtPSA1O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICAgIGlmIChzdGF0ZS5ubGVuID4gMjg2IHx8IHN0YXRlLm5kaXN0ID4gMzApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5MRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAgIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG4gICAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gNztcblxuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT0RFTEVOUzpcbiAgICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBoZXJlX3ZhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaGVyZV92YWwgPT09IDE2KSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgNyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoNykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi9cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgeyBicmVhazsgfVxuXG4gICAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgICBpZiAoc3RhdGUubGVuc1syNTZdID09PSAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUubGVuYml0cyB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgICAgLy8gc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjtcbiAgICAgICAgLy9zdGF0ZS5kaXN0Y29kZS5jb3B5KHN0YXRlLmNvZGVzKTtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjtcbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUuZGlzdGJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOXzpcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU46XG4gICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgICAvLy0tLVxuICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTtcbiAgICAgICAgICAvLy0tLSBMT0FEKCkgLS0tXG4gICAgICAgICAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gICAgICAgICAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gICAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gICAgICAgICAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gICAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7XG4gICAgICAgICAgLy8tLS1cblxuICAgICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7XG4gICAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmJhY2sgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgICAgc3RhdGUubGVuZ3RoID0gaGVyZV92YWw7XG4gICAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkVYVDpcbiAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElTVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESVNUOlxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgICBzdGF0ZS5leHRyYSA9IChoZXJlX29wKSAmIDE1O1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESVNURVhUOlxuICAgICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgICB9XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gc3RhdGUuZG1heCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTUFUQ0g7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTUFUQ0g6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBjb3B5ID0gX291dCAtIGxlZnQ7XG4gICAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5vZmZzZXQgLSBjb3B5O1xuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICBUcmFjZSgoc3RkZXJyLCBcImluZmxhdGUuYyB0b28gZmFyXFxuXCIpKTtcbi8vICAgICAgICAgIGNvcHkgLT0gc3RhdGUud2hhdmU7XG4vLyAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4vLyAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbi8vICAgICAgICAgIGxlZnQgLT0gY29weTtcbi8vICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuLy8gICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICBvdXRwdXRbcHV0KytdID0gMDtcbi8vICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4vLyAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbi8vICAgICAgICAgIGJyZWFrO1xuLy8jZW5kaWZcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgICAgY29weSAtPSBzdGF0ZS53bmV4dDtcbiAgICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuICAgICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0O1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBvdXRwdXRbcHV0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMSVQ6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBvdXRwdXRbcHV0KytdID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBsZWZ0LS07XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDSEVDSzpcbiAgICAgICAgaWYgKHN0YXRlLndyYXApIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAvLyBVc2UgJ3wnIGluc3RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgX291dCAtPSBsZWZ0O1xuICAgICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgICBpZiAoX291dCkge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkpO1xuXG4gICAgICAgICAgfVxuICAgICAgICAgIF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIC8vIE5COiBjcmMzMiBzdG9yZWQgYXMgc2lnbmVkIDMyLWJpdCBpbnQsIHpzd2FwMzIgcmV0dXJucyBzaWduZWQgdG9vXG4gICAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkdUSDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5HVEg6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwICYmIHN0YXRlLmZsYWdzKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLnRvdGFsICYgMHhmZmZmZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRE9ORTpcbiAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIEJBRDpcbiAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIE1FTTpcbiAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgICAgY2FzZSBTWU5DOlxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5mX2xlYXZlIDwtIGhlcmUgaXMgcmVhbCBwbGFjZSBmb3IgXCJnb3RvIGluZl9sZWF2ZVwiLCBlbXVsYXRlZCB2aWEgXCJicmVhayBpbmZfbGVhdmVcIlxuXG4gIC8qXG4gICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLlxuICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyXG4gICAgIGVycm9yLiAgQ2FsbCB1cGRhdGV3aW5kb3coKSB0byBjcmVhdGUgYW5kL29yIHVwZGF0ZSB0aGUgd2luZG93IHN0YXRlLlxuICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuXG4gICAqL1xuXG4gIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAvLy0tLVxuXG4gIGlmIChzdGF0ZS53c2l6ZSB8fCAoX291dCAhPT0gc3RybS5hdmFpbF9vdXQgJiYgc3RhdGUubW9kZSA8IEJBRCAmJlxuICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT09IFpfRklOSVNIKSkpIHtcbiAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0LCBfb3V0IC0gc3RybS5hdmFpbF9vdXQpKSB7XG4gICAgICBzdGF0ZS5tb2RlID0gTUVNO1xuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIH1cbiAgfVxuICBfaW4gLT0gc3RybS5hdmFpbF9pbjtcbiAgX291dCAtPSBzdHJtLmF2YWlsX291dDtcbiAgc3RybS50b3RhbF9pbiArPSBfaW47XG4gIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gIGlmIChzdGF0ZS53cmFwICYmIF9vdXQpIHtcbiAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAvKlVQREFURShzdGF0ZS5jaGVjaywgc3RybS5uZXh0X291dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSk7XG4gIH1cbiAgc3RybS5kYXRhX3R5cGUgPSBzdGF0ZS5iaXRzICsgKHN0YXRlLmxhc3QgPyA2NCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IFRZUEUgPyAxMjggOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBMRU5fIHx8IHN0YXRlLm1vZGUgPT09IENPUFlfID8gMjU2IDogMCk7XG4gIGlmICgoKF9pbiA9PT0gMCAmJiBfb3V0ID09PSAwKSB8fCBmbHVzaCA9PT0gWl9GSU5JU0gpICYmIHJldCA9PT0gWl9PSykge1xuICAgIHJldCA9IFpfQlVGX0VSUk9SO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVFbmQoc3RybSkge1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSAvKnx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKHN0YXRlLndpbmRvdykge1xuICAgIHN0YXRlLndpbmRvdyA9IG51bGw7XG4gIH1cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlR2V0SGVhZGVyKHN0cm0sIGhlYWQpIHtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoKHN0YXRlLndyYXAgJiAyKSA9PT0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cblxuICAvKiBzYXZlIGhlYWRlciBzdHJ1Y3R1cmUgKi9cbiAgc3RhdGUuaGVhZCA9IGhlYWQ7XG4gIGhlYWQuZG9uZSA9IGZhbHNlO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzdGF0ZTtcbiAgdmFyIGRpY3RpZDtcbiAgdmFyIHJldDtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gLyogPT0gWl9OVUxMICovIHx8ICFzdHJtLnN0YXRlIC8qID09IFpfTlVMTCAqLykgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIGlmIChzdGF0ZS53cmFwICE9PSAwICYmIHN0YXRlLm1vZGUgIT09IERJQ1QpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiBjaGVjayBmb3IgY29ycmVjdCBkaWN0aW9uYXJ5IGlkZW50aWZpZXIgKi9cbiAgaWYgKHN0YXRlLm1vZGUgPT09IERJQ1QpIHtcbiAgICBkaWN0aWQgPSAxOyAvKiBhZGxlcjMyKDAsIG51bGwsIDApKi9cbiAgICAvKiBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7ICovXG4gICAgZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICAgIGlmIChkaWN0aWQgIT09IHN0YXRlLmNoZWNrKSB7XG4gICAgICByZXR1cm4gWl9EQVRBX0VSUk9SO1xuICAgIH1cbiAgfVxuICAvKiBjb3B5IGRpY3Rpb25hcnkgdG8gd2luZG93IHVzaW5nIHVwZGF0ZXdpbmRvdygpLCB3aGljaCB3aWxsIGFtZW5kIHRoZVxuICAgZXhpc3RpbmcgZGljdGlvbmFyeSBpZiBhcHByb3ByaWF0ZSAqL1xuICByZXQgPSB1cGRhdGV3aW5kb3coc3RybSwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgZGljdExlbmd0aCk7XG4gIGlmIChyZXQpIHtcbiAgICBzdGF0ZS5tb2RlID0gTUVNO1xuICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgfVxuICBzdGF0ZS5oYXZlZGljdCA9IDE7XG4gIC8vIFRyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgZGljdGlvbmFyeSBzZXRcXG5cIikpO1xuICByZXR1cm4gWl9PSztcbn1cblxuZXhwb3J0cy5pbmZsYXRlUmVzZXQgPSBpbmZsYXRlUmVzZXQ7XG5leHBvcnRzLmluZmxhdGVSZXNldDIgPSBpbmZsYXRlUmVzZXQyO1xuZXhwb3J0cy5pbmZsYXRlUmVzZXRLZWVwID0gaW5mbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuaW5mbGF0ZUluaXQgPSBpbmZsYXRlSW5pdDtcbmV4cG9ydHMuaW5mbGF0ZUluaXQyID0gaW5mbGF0ZUluaXQyO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZUVuZCA9IGluZmxhdGVFbmQ7XG5leHBvcnRzLmluZmxhdGVHZXRIZWFkZXIgPSBpbmZsYXRlR2V0SGVhZGVyO1xuZXhwb3J0cy5pbmZsYXRlU2V0RGljdGlvbmFyeSA9IGluZmxhdGVTZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlSW5mbyA9ICdwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpJztcblxuLyogTm90IGltcGxlbWVudGVkXG5leHBvcnRzLmluZmxhdGVDb3B5ID0gaW5mbGF0ZUNvcHk7XG5leHBvcnRzLmluZmxhdGVHZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZUdldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVNYXJrID0gaW5mbGF0ZU1hcms7XG5leHBvcnRzLmluZmxhdGVQcmltZSA9IGluZmxhdGVQcmltZTtcbmV4cG9ydHMuaW5mbGF0ZVN5bmMgPSBpbmZsYXRlU3luYztcbmV4cG9ydHMuaW5mbGF0ZVN5bmNQb2ludCA9IGluZmxhdGVTeW5jUG9pbnQ7XG5leHBvcnRzLmluZmxhdGVVbmRlcm1pbmUgPSBpbmZsYXRlVW5kZXJtaW5lO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxudmFyIE1BWEJJVFMgPSAxNTtcbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbnZhciBsYmFzZSA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGJhc2UgKi9cbiAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSxcbiAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDBcbl07XG5cbnZhciBsZXh0ID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsXG4gIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCA3MiwgNzhcbl07XG5cbnZhciBkYmFzZSA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqL1xuICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsXG4gIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSxcbiAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMCwgMFxuXTtcblxudmFyIGRleHQgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjIsIDIyLFxuICAyMywgMjMsIDI0LCAyNCwgMjUsIDI1LCAyNiwgMjYsIDI3LCAyNyxcbiAgMjgsIDI4LCAyOSwgMjksIDY0LCA2NFxuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX3RhYmxlKHR5cGUsIGxlbnMsIGxlbnNfaW5kZXgsIGNvZGVzLCB0YWJsZSwgdGFibGVfaW5kZXgsIHdvcmssIG9wdHMpXG57XG4gIHZhciBiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy9oZXJlID0gb3B0cy5oZXJlOyAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi9cblxuICB2YXIgbGVuID0gMDsgICAgICAgICAgICAgICAvKiBhIGNvZGUncyBsZW5ndGggaW4gYml0cyAqL1xuICB2YXIgc3ltID0gMDsgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBjb2RlIHN5bWJvbHMgKi9cbiAgdmFyIG1pbiA9IDAsIG1heCA9IDA7ICAgICAgICAgIC8qIG1pbmltdW0gYW5kIG1heGltdW0gY29kZSBsZW5ndGhzICovXG4gIHZhciByb290ID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciByb290IHRhYmxlICovXG4gIHZhciBjdXJyID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciBjdXJyZW50IHRhYmxlICovXG4gIHZhciBkcm9wID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgYml0cyB0byBkcm9wIGZvciBzdWItdGFibGUgKi9cbiAgdmFyIGxlZnQgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcHJlZml4IGNvZGVzIGF2YWlsYWJsZSAqL1xuICB2YXIgdXNlZCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGVudHJpZXMgaW4gdGFibGUgdXNlZCAqL1xuICB2YXIgaHVmZiA9IDA7ICAgICAgICAgICAgICAvKiBIdWZmbWFuIGNvZGUgKi9cbiAgdmFyIGluY3I7ICAgICAgICAgICAgICAvKiBmb3IgaW5jcmVtZW50aW5nIGNvZGUsIGluZGV4ICovXG4gIHZhciBmaWxsOyAgICAgICAgICAgICAgLyogaW5kZXggZm9yIHJlcGxpY2F0aW5nIGVudHJpZXMgKi9cbiAgdmFyIGxvdzsgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5ICovXG4gIHZhciBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgbG93IHJvb3QgYml0cyAqL1xuICB2YXIgbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gdGFibGUgKi9cbiAgdmFyIGJhc2UgPSBudWxsOyAgICAgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi9cbiAgdmFyIGJhc2VfaW5kZXggPSAwO1xuLy8gIHZhciBzaG9leHRyYTsgICAgLyogZXh0cmEgYml0cyB0YWJsZSB0byB1c2UgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBiYXNlIGFuZCBleHRyYSBmb3Igc3ltYm9sID4gZW5kICovXG4gIHZhciBjb3VudCA9IG5ldyB1dGlscy5CdWYxNihNQVhCSVRTICsgMSk7IC8vW01BWEJJVFMrMV07ICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqL1xuICB2YXIgb2ZmcyA9IG5ldyB1dGlscy5CdWYxNihNQVhCSVRTICsgMSk7IC8vW01BWEJJVFMrMV07ICAgICAvKiBvZmZzZXRzIGluIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqL1xuICB2YXIgZXh0cmEgPSBudWxsO1xuICB2YXIgZXh0cmFfaW5kZXggPSAwO1xuXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsO1xuXG4gIC8qXG4gICBQcm9jZXNzIGEgc2V0IG9mIGNvZGUgbGVuZ3RocyB0byBjcmVhdGUgYSBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLiAgVGhlXG4gICBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBFYWNoIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGVcbiAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlXG4gICBzeW1ib2xzIGJ5IGxlbmd0aCBmcm9tIHNob3J0IHRvIGxvbmcsIGFuZCByZXRhaW5pbmcgdGhlIHN5bWJvbCBvcmRlclxuICAgZm9yIGNvZGVzIHdpdGggZXF1YWwgbGVuZ3Rocy4gIFRoZW4gdGhlIGNvZGUgc3RhcnRzIHdpdGggYWxsIHplcm8gYml0c1xuICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXJcbiAgIGluY3JlbWVudHMgZm9yIHRoZSBzYW1lIGxlbmd0aCwgYW5kIHplcm9zIGFyZSBhcHBlbmRlZCBhcyB0aGUgbGVuZ3RoXG4gICBpbmNyZWFzZXMuICBGb3IgdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVzZSBiaXRzIGFyZSBzdG9yZWQgYmFja3dhcmRzXG4gICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlXG4gICBkZWNvZGluZyB0YWJsZXMgYXJlIGJ1aWx0IGluIHRoZSBsYXJnZSBsb29wIGJlbG93LCB0aGUgaW50ZWdlciBjb2Rlc1xuICAgYXJlIGluY3JlbWVudGVkIGJhY2t3YXJkcy5cblxuICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW5cbiAgIGxlbnNbXSBhcmUgaW4gdGhlIHJhbmdlIDAuLk1BWEJJVFMuICBUaGUgY2FsbGVyIG11c3QgYXNzdXJlIHRoaXMuXG4gICAxLi5NQVhCSVRTIGlzIGludGVycHJldGVkIGFzIHRoYXQgY29kZSBsZW5ndGguICB6ZXJvIG1lYW5zIHRoYXQgdGhhdFxuICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS5cblxuICAgVGhlIGNvZGVzIGFyZSBzb3J0ZWQgYnkgY29tcHV0aW5nIGEgY291bnQgb2YgY29kZXMgZm9yIGVhY2ggbGVuZ3RoLFxuICAgY3JlYXRpbmcgZnJvbSB0aGF0IGEgdGFibGUgb2Ygc3RhcnRpbmcgaW5kaWNlcyBmb3IgZWFjaCBsZW5ndGggaW4gdGhlXG4gICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWRcbiAgIHRhYmxlLiAgVGhlIHNvcnRlZCB0YWJsZSBpcyB3b3JrW10sIHdpdGggdGhhdCBzcGFjZSBiZWluZyBwcm92aWRlZCBieVxuICAgdGhlIGNhbGxlci5cblxuICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZ1xuICAgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RoIGNvZGVzLCBkZXRlcm1pbmluZyBpZiB0aGVyZSBhcmUgYW55XG4gICBjb2RlcyBhdCBhbGwsIGNoZWNraW5nIGZvciBhIHZhbGlkIHNldCBvZiBsZW5ndGhzLCBhbmQgbG9va2luZyBhaGVhZFxuICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlXG4gICBkZWNvZGluZyB0YWJsZXMuXG4gICAqL1xuXG4gIC8qIGFjY3VtdWxhdGUgbGVuZ3RocyBmb3IgY29kZXMgKGFzc3VtZXMgbGVuc1tdIGFsbCBpbiAwLi5NQVhCSVRTKSAqL1xuICBmb3IgKGxlbiA9IDA7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGNvdW50W2xlbl0gPSAwO1xuICB9XG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgY291bnRbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rKztcbiAgfVxuXG4gIC8qIGJvdW5kIGNvZGUgbGVuZ3RocywgZm9yY2Ugcm9vdCB0byBiZSB3aXRoaW4gY29kZSBsZW5ndGhzICovXG4gIHJvb3QgPSBiaXRzO1xuICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkge1xuICAgIGlmIChjb3VudFttYXhdICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPiBtYXgpIHtcbiAgICByb290ID0gbWF4O1xuICB9XG4gIGlmIChtYXggPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAvKiBubyBzeW1ib2xzIHRvIGNvZGUgYXQgYWxsICovXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0OyAgLy9oZXJlLm9wID0gKHZhciBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTsgICAvL2hlcmUuYml0cyA9ICh2YXIgY2hhcikxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwOyAgIC8vaGVyZS52YWwgPSAodmFyIHNob3J0KTA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0O1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuICAgIG9wdHMuYml0cyA9IDE7XG4gICAgcmV0dXJuIDA7ICAgICAvKiBubyBzeW1ib2xzLCBidXQgd2FpdCBmb3IgZGVjb2RpbmcgdG8gcmVwb3J0IGVycm9yICovXG4gIH1cbiAgZm9yIChtaW4gPSAxOyBtaW4gPCBtYXg7IG1pbisrKSB7XG4gICAgaWYgKGNvdW50W21pbl0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA8IG1pbikge1xuICAgIHJvb3QgPSBtaW47XG4gIH1cblxuICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi9cbiAgbGVmdCA9IDE7XG4gIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgbGVmdCA8PD0gMTtcbiAgICBsZWZ0IC09IGNvdW50W2xlbl07XG4gICAgaWYgKGxlZnQgPCAwKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkICovXG4gIH1cbiAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09PSBDT0RFUyB8fCBtYXggIT09IDEpKSB7XG4gICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIHNldCAqL1xuICB9XG5cbiAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi9cbiAgb2Zmc1sxXSA9IDA7XG4gIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspIHtcbiAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgY291bnRbbGVuXTtcbiAgfVxuXG4gIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi9cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBpZiAobGVuc1tsZW5zX2luZGV4ICsgc3ltXSAhPT0gMCkge1xuICAgICAgd29ya1tvZmZzW2xlbnNbbGVuc19pbmRleCArIHN5bV1dKytdID0gc3ltO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBDcmVhdGUgYW5kIGZpbGwgaW4gZGVjb2RpbmcgdGFibGVzLiAgSW4gdGhpcyBsb29wLCB0aGUgdGFibGUgYmVpbmdcbiAgIGZpbGxlZCBpcyBhdCBuZXh0IGFuZCBoYXMgY3VyciBpbmRleCBiaXRzLiAgVGhlIGNvZGUgYmVpbmcgdXNlZCBpcyBodWZmXG4gICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3BcbiAgIGJpdHMgb2ZmIG9mIHRoZSBib3R0b20uICBGb3IgY29kZXMgd2hlcmUgbGVuIGlzIGxlc3MgdGhhbiBkcm9wICsgY3VycixcbiAgIHRob3NlIHRvcCBkcm9wICsgY3VyciAtIGxlbiBiaXRzIGFyZSBpbmNyZW1lbnRlZCB0aHJvdWdoIGFsbCB2YWx1ZXMgdG9cbiAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLlxuXG4gICByb290IGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgdGhlIHJvb3QgdGFibGUuICBXaGVuIGxlbiBleGNlZWRzXG4gICByb290LCBzdWItdGFibGVzIGFyZSBjcmVhdGVkIHBvaW50ZWQgdG8gYnkgdGhlIHJvb3QgZW50cnkgd2l0aCBhbiBpbmRleFxuICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGFcbiAgIG5ldyBzdWItdGFibGUgc2hvdWxkIGJlIHN0YXJ0ZWQuICBkcm9wIGlzIHplcm8gd2hlbiB0aGUgcm9vdCB0YWJsZSBpc1xuICAgYmVpbmcgZmlsbGVkLCBhbmQgZHJvcCBpcyByb290IHdoZW4gc3ViLXRhYmxlcyBhcmUgYmVpbmcgZmlsbGVkLlxuXG4gICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZVxuICAgY29kZSBsZW5ndGhzIHRvIGRldGVybWluZSB3aGF0IHNpemUgc3ViLXRhYmxlIGlzIG5lZWRlZC4gIFRoZSBsZW5ndGhcbiAgIGNvdW50cyBhcmUgdXNlZCBmb3IgdGhpcywgYW5kIHNvIGNvdW50W10gaXMgZGVjcmVtZW50ZWQgYXMgY29kZXMgYXJlXG4gICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuXG5cbiAgIHVzZWQga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdGFibGUgZW50cmllcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlXG4gICBwcm92aWRlZCAqdGFibGUgc3BhY2UuICBJdCBpcyBjaGVja2VkIGZvciBMRU5TIGFuZCBESVNUIHRhYmxlcyBhZ2FpbnN0XG4gICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluXG4gICB0aGUgaW5pdGlhbCByb290IHRhYmxlIHNpemUgY29uc3RhbnRzLiAgU2VlIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlblxuICAgYWxsIGNvZGVzIG9mIGxlbmd0aCBtYXgsIGkuZS4gYWxsIGNvZGVzLCBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhpc1xuICAgcm91dGluZSBwZXJtaXRzIGluY29tcGxldGUgY29kZXMsIHNvIGFub3RoZXIgbG9vcCBhZnRlciB0aGlzIG9uZSBmaWxsc1xuICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLlxuICAgKi9cblxuICAvKiBzZXQgdXAgZm9yIGNvZGUgdHlwZSAqL1xuICAvLyBwb29yIG1hbiBvcHRpbWl6YXRpb24gLSB1c2UgaWYtZWxzZSBpbnN0ZWFkIG9mIHN3aXRjaCxcbiAgLy8gdG8gYXZvaWQgZGVvcHRzIGluIG9sZCB2OFxuICBpZiAodHlwZSA9PT0gQ09ERVMpIHtcbiAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi9cbiAgICBlbmQgPSAxOTtcblxuICB9IGVsc2UgaWYgKHR5cGUgPT09IExFTlMpIHtcbiAgICBiYXNlID0gbGJhc2U7XG4gICAgYmFzZV9pbmRleCAtPSAyNTc7XG4gICAgZXh0cmEgPSBsZXh0O1xuICAgIGV4dHJhX2luZGV4IC09IDI1NztcbiAgICBlbmQgPSAyNTY7XG5cbiAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIERJU1RTICovXG4gICAgYmFzZSA9IGRiYXNlO1xuICAgIGV4dHJhID0gZGV4dDtcbiAgICBlbmQgPSAtMTtcbiAgfVxuXG4gIC8qIGluaXRpYWxpemUgb3B0cyBmb3IgbG9vcCAqL1xuICBodWZmID0gMDsgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSAqL1xuICBzeW0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBzeW1ib2wgKi9cbiAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovXG4gIG5leHQgPSB0YWJsZV9pbmRleDsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqL1xuICBjdXJyID0gcm9vdDsgICAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSBpbmRleCBiaXRzICovXG4gIGRyb3AgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGJpdHMgdG8gZHJvcCBmcm9tIGNvZGUgZm9yIGluZGV4ICovXG4gIGxvdyA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovXG4gIHVzZWQgPSAxIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi9cbiAgbWFzayA9IHVzZWQgLSAxOyAgICAgICAgICAgIC8qIG1hc2sgZm9yIGNvbXBhcmluZyBsb3cgKi9cblxuICAvKiBjaGVjayBhdmFpbGFibGUgdGFibGUgc3BhY2UgKi9cbiAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqL1xuICAgIGhlcmVfYml0cyA9IGxlbiAtIGRyb3A7XG4gICAgaWYgKHdvcmtbc3ltXSA8IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IDA7XG4gICAgICBoZXJlX3ZhbCA9IHdvcmtbc3ltXTtcbiAgICB9XG4gICAgZWxzZSBpZiAod29ya1tzeW1dID4gZW5kKSB7XG4gICAgICBoZXJlX29wID0gZXh0cmFbZXh0cmFfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgICAgaGVyZV92YWwgPSBiYXNlW2Jhc2VfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGhlcmVfb3AgPSAzMiArIDY0OyAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqL1xuICAgICAgaGVyZV92YWwgPSAwO1xuICAgIH1cblxuICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIGRyb3ApO1xuICAgIGZpbGwgPSAxIDw8IGN1cnI7XG4gICAgbWluID0gZmlsbDsgICAgICAgICAgICAgICAgIC8qIHNhdmUgb2Zmc2V0IHRvIG5leHQgdGFibGUgKi9cbiAgICBkbyB7XG4gICAgICBmaWxsIC09IGluY3I7XG4gICAgICB0YWJsZVtuZXh0ICsgKGh1ZmYgPj4gZHJvcCkgKyBmaWxsXSA9IChoZXJlX2JpdHMgPDwgMjQpIHwgKGhlcmVfb3AgPDwgMTYpIHwgaGVyZV92YWwgfDA7XG4gICAgfSB3aGlsZSAoZmlsbCAhPT0gMCk7XG5cbiAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSAxKTtcbiAgICB3aGlsZSAoaHVmZiAmIGluY3IpIHtcbiAgICAgIGluY3IgPj49IDE7XG4gICAgfVxuICAgIGlmIChpbmNyICE9PSAwKSB7XG4gICAgICBodWZmICY9IGluY3IgLSAxO1xuICAgICAgaHVmZiArPSBpbmNyO1xuICAgIH0gZWxzZSB7XG4gICAgICBodWZmID0gMDtcbiAgICB9XG5cbiAgICAvKiBnbyB0byBuZXh0IHN5bWJvbCwgdXBkYXRlIGNvdW50LCBsZW4gKi9cbiAgICBzeW0rKztcbiAgICBpZiAoLS1jb3VudFtsZW5dID09PSAwKSB7XG4gICAgICBpZiAobGVuID09PSBtYXgpIHsgYnJlYWs7IH1cbiAgICAgIGxlbiA9IGxlbnNbbGVuc19pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuXG4gICAgLyogY3JlYXRlIG5ldyBzdWItdGFibGUgaWYgbmVlZGVkICovXG4gICAgaWYgKGxlbiA+IHJvb3QgJiYgKGh1ZmYgJiBtYXNrKSAhPT0gbG93KSB7XG4gICAgICAvKiBpZiBmaXJzdCB0aW1lLCB0cmFuc2l0aW9uIHRvIHN1Yi10YWJsZXMgKi9cbiAgICAgIGlmIChkcm9wID09PSAwKSB7XG4gICAgICAgIGRyb3AgPSByb290O1xuICAgICAgfVxuXG4gICAgICAvKiBpbmNyZW1lbnQgcGFzdCBsYXN0IHRhYmxlICovXG4gICAgICBuZXh0ICs9IG1pbjsgICAgICAgICAgICAvKiBoZXJlIG1pbiBpcyAxIDw8IGN1cnIgKi9cblxuICAgICAgLyogZGV0ZXJtaW5lIGxlbmd0aCBvZiBuZXh0IHRhYmxlICovXG4gICAgICBjdXJyID0gbGVuIC0gZHJvcDtcbiAgICAgIGxlZnQgPSAxIDw8IGN1cnI7XG4gICAgICB3aGlsZSAoY3VyciArIGRyb3AgPCBtYXgpIHtcbiAgICAgICAgbGVmdCAtPSBjb3VudFtjdXJyICsgZHJvcF07XG4gICAgICAgIGlmIChsZWZ0IDw9IDApIHsgYnJlYWs7IH1cbiAgICAgICAgY3VycisrO1xuICAgICAgICBsZWZ0IDw8PSAxO1xuICAgICAgfVxuXG4gICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovXG4gICAgICB1c2VkICs9IDEgPDwgY3VycjtcbiAgICAgIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgLyogcG9pbnQgZW50cnkgaW4gcm9vdCB0YWJsZSB0byBzdWItdGFibGUgKi9cbiAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrO1xuICAgICAgLyp0YWJsZS5vcFtsb3ddID0gY3VycjtcbiAgICAgIHRhYmxlLmJpdHNbbG93XSA9IHJvb3Q7XG4gICAgICB0YWJsZS52YWxbbG93XSA9IG5leHQgLSBvcHRzLnRhYmxlX2luZGV4OyovXG4gICAgICB0YWJsZVtsb3ddID0gKHJvb3QgPDwgMjQpIHwgKGN1cnIgPDwgMTYpIHwgKG5leHQgLSB0YWJsZV9pbmRleCkgfDA7XG4gICAgfVxuICB9XG5cbiAgLyogZmlsbCBpbiByZW1haW5pbmcgdGFibGUgZW50cnkgaWYgY29kZSBpcyBpbmNvbXBsZXRlIChndWFyYW50ZWVkIHRvIGhhdmVcbiAgIGF0IG1vc3Qgb25lIHJlbWFpbmluZyBlbnRyeSwgc2luY2UgaWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSwgdGhlXG4gICBtYXhpbXVtIGNvZGUgbGVuZ3RoIHRoYXQgd2FzIGFsbG93ZWQgdG8gZ2V0IHRoaXMgZmFyIGlzIG9uZSBiaXQpICovXG4gIGlmIChodWZmICE9PSAwKSB7XG4gICAgLy90YWJsZS5vcFtuZXh0ICsgaHVmZl0gPSA2NDsgICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW25leHQgKyBodWZmXSA9IGxlbiAtIGRyb3A7XG4gICAgLy90YWJsZS52YWxbbmV4dCArIGh1ZmZdID0gMDtcbiAgICB0YWJsZVtuZXh0ICsgaHVmZl0gPSAoKGxlbiAtIGRyb3ApIDw8IDI0KSB8ICg2NCA8PCAxNikgfDA7XG4gIH1cblxuICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi9cbiAgLy9vcHRzLnRhYmxlX2luZGV4ICs9IHVzZWQ7XG4gIG9wdHMuYml0cyA9IHJvb3Q7XG4gIHJldHVybiAwO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgMjogICAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovXG4gIDE6ICAgICAgJ3N0cmVhbSBlbmQnLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqL1xuICAwOiAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi9cbiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovXG4gICctMic6ICAgJ3N0cmVhbSBlcnJvcicsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqL1xuICAnLTMnOiAgICdkYXRhIGVycm9yJywgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi9cbiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovXG4gICctNSc6ICAgJ2J1ZmZlciBlcnJvcicsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqL1xuICAnLTYnOiAgICdpbmNvbXBhdGlibGUgdmVyc2lvbicgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi9cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuLyogZXNsaW50LWRpc2FibGUgc3BhY2UtdW5hcnktb3BzICovXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vL3ZhciBaX0ZJTFRFUkVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfSFVGRk1BTl9PTkxZICAgICAgPSAyO1xuLy92YXIgWl9STEUgICAgICAgICAgICAgICA9IDM7XG52YXIgWl9GSVhFRCAgICAgICAgICAgICAgID0gNDtcbi8vdmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgPSAwO1xuXG4vKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovXG52YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbnZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICA9IDE7IC8vID0gWl9URVhUXG52YXIgWl9VTktOT1dOICAgICAgICAgICAgID0gMjtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuLy8gRnJvbSB6dXRpbC5oXG5cbnZhciBTVE9SRURfQkxPQ0sgPSAwO1xudmFyIFNUQVRJQ19UUkVFUyA9IDE7XG52YXIgRFlOX1RSRUVTICAgID0gMjtcbi8qIFRoZSB0aHJlZSBraW5kcyBvZiBibG9jayB0eXBlICovXG5cbnZhciBNSU5fTUFUQ0ggICAgPSAzO1xudmFyIE1BWF9NQVRDSCAgICA9IDI1ODtcbi8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi9cblxuLy8gRnJvbSBkZWZsYXRlLmhcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuXG4gKi9cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xuXG52YXIgTElURVJBTFMgICAgICA9IDI1Njtcbi8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqL1xuXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xuXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG5cbnZhciBCTF9DT0RFUyAgICAgID0gMTk7XG4vKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi9cblxudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xuXG52YXIgTUFYX0JJVFMgICAgICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBCdWZfc2l6ZSAgICAgID0gMTY7XG4vKiBzaXplIG9mIGJpdCBidWZmZXIgaW4gYmlfYnVmICovXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdGFudHNcbiAqL1xuXG52YXIgTUFYX0JMX0JJVFMgPSA3O1xuLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqL1xuXG52YXIgRU5EX0JMT0NLICAgPSAyNTY7XG4vKiBlbmQgb2YgYmxvY2sgbGl0ZXJhbCBjb2RlICovXG5cbnZhciBSRVBfM182ICAgICA9IDE2O1xuLyogcmVwZWF0IHByZXZpb3VzIGJpdCBsZW5ndGggMy02IHRpbWVzICgyIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG52YXIgUkVQWl8zXzEwICAgPSAxNztcbi8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG52YXIgUkVQWl8xMV8xMzggPSAxODtcbi8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDExLTEzOCB0aW1lcyAgKDcgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbi8qIGVzbGludC1kaXNhYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG52YXIgZXh0cmFfbGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggbGVuZ3RoIGNvZGUgKi9cbiAgWzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF07XG5cbnZhciBleHRyYV9kYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBkaXN0YW5jZSBjb2RlICovXG4gIFswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXTtcblxudmFyIGV4dHJhX2JsYml0cyA9ICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN107XG5cbnZhciBibF9vcmRlciA9XG4gIFsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XTtcbi8qIGVzbGludC1lbmFibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cblxuLyogVGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZ1xuICogcHJvYmFiaWxpdHksIHRvIGF2b2lkIHRyYW5zbWl0dGluZyB0aGUgbGVuZ3RocyBmb3IgdW51c2VkIGJpdCBsZW5ndGggY29kZXMuXG4gKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBMb2NhbCBkYXRhLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgb25seSBvbmNlLlxuICovXG5cbi8vIFdlIHByZS1maWxsIGFycmF5cyB3aXRoIDAgdG8gYXZvaWQgdW5pbml0aWFsaXplZCBnYXBzXG5cbnZhciBESVNUX0NPREVfTEVOID0gNTEyOyAvKiBzZWUgZGVmaW5pdGlvbiBvZiBhcnJheSBkaXN0X2NvZGUgYmVsb3cgKi9cblxuLy8gISEhISBVc2UgZmxhdCBhcnJheSBpbnN0ZWFkIG9mIHN0cnVjdHVyZSwgRnJlcSA9IGkqMiwgTGVuID0gaSoyKzFcbnZhciBzdGF0aWNfbHRyZWUgID0gbmV3IEFycmF5KChMX0NPREVTICsgMikgKiAyKTtcbnplcm8oc3RhdGljX2x0cmVlKTtcbi8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vXG4gKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlclxuICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIF90cl9pbml0XG4gKiBiZWxvdykuXG4gKi9cblxudmFyIHN0YXRpY19kdHJlZSAgPSBuZXcgQXJyYXkoRF9DT0RFUyAqIDIpO1xuemVybyhzdGF0aWNfZHRyZWUpO1xuLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlLiAoQWN0dWFsbHkgYSB0cml2aWFsIHRyZWUgc2luY2UgYWxsIGNvZGVzIHVzZVxuICogNSBiaXRzLilcbiAqL1xuXG52YXIgX2Rpc3RfY29kZSAgICA9IG5ldyBBcnJheShESVNUX0NPREVfTEVOKTtcbnplcm8oX2Rpc3RfY29kZSk7XG4vKiBEaXN0YW5jZSBjb2Rlcy4gVGhlIGZpcnN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgZGlzdGFuY2VzXG4gKiAzIC4uIDI1OCwgdGhlIGxhc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB0b3AgOCBiaXRzIG9mXG4gKiB0aGUgMTUgYml0IGRpc3RhbmNlcy5cbiAqL1xuXG52YXIgX2xlbmd0aF9jb2RlICA9IG5ldyBBcnJheShNQVhfTUFUQ0ggLSBNSU5fTUFUQ0ggKyAxKTtcbnplcm8oX2xlbmd0aF9jb2RlKTtcbi8qIGxlbmd0aCBjb2RlIGZvciBlYWNoIG5vcm1hbGl6ZWQgbWF0Y2ggbGVuZ3RoICgwID09IE1JTl9NQVRDSCkgKi9cblxudmFyIGJhc2VfbGVuZ3RoICAgPSBuZXcgQXJyYXkoTEVOR1RIX0NPREVTKTtcbnplcm8oYmFzZV9sZW5ndGgpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBsZW5ndGggZm9yIGVhY2ggY29kZSAoMCA9IE1JTl9NQVRDSCkgKi9cblxudmFyIGJhc2VfZGlzdCAgICAgPSBuZXcgQXJyYXkoRF9DT0RFUyk7XG56ZXJvKGJhc2VfZGlzdCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqL1xuXG5cbmZ1bmN0aW9uIFN0YXRpY1RyZWVEZXNjKHN0YXRpY190cmVlLCBleHRyYV9iaXRzLCBleHRyYV9iYXNlLCBlbGVtcywgbWF4X2xlbmd0aCkge1xuXG4gIHRoaXMuc3RhdGljX3RyZWUgID0gc3RhdGljX3RyZWU7ICAvKiBzdGF0aWMgdHJlZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYml0cyAgID0gZXh0cmFfYml0czsgICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGNvZGUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2Jhc2UgICA9IGV4dHJhX2Jhc2U7ICAgLyogYmFzZSBpbmRleCBmb3IgZXh0cmFfYml0cyAqL1xuICB0aGlzLmVsZW1zICAgICAgICA9IGVsZW1zOyAgICAgICAgLyogbWF4IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHJlZSAqL1xuICB0aGlzLm1heF9sZW5ndGggICA9IG1heF9sZW5ndGg7ICAgLyogbWF4IGJpdCBsZW5ndGggZm9yIHRoZSBjb2RlcyAqL1xuXG4gIC8vIHNob3cgaWYgYHN0YXRpY190cmVlYCBoYXMgZGF0YSBvciBkdW1teSAtIG5lZWRlZCBmb3IgbW9ub21vcnBoaWMgb2JqZWN0c1xuICB0aGlzLmhhc19zdHJlZSAgICA9IHN0YXRpY190cmVlICYmIHN0YXRpY190cmVlLmxlbmd0aDtcbn1cblxuXG52YXIgc3RhdGljX2xfZGVzYztcbnZhciBzdGF0aWNfZF9kZXNjO1xudmFyIHN0YXRpY19ibF9kZXNjO1xuXG5cbmZ1bmN0aW9uIFRyZWVEZXNjKGR5bl90cmVlLCBzdGF0X2Rlc2MpIHtcbiAgdGhpcy5keW5fdHJlZSA9IGR5bl90cmVlOyAgICAgLyogdGhlIGR5bmFtaWMgdHJlZSAqL1xuICB0aGlzLm1heF9jb2RlID0gMDsgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdGhpcy5zdGF0X2Rlc2MgPSBzdGF0X2Rlc2M7ICAgLyogdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHRyZWUgKi9cbn1cblxuXG5cbmZ1bmN0aW9uIGRfY29kZShkaXN0KSB7XG4gIHJldHVybiBkaXN0IDwgMjU2ID8gX2Rpc3RfY29kZVtkaXN0XSA6IF9kaXN0X2NvZGVbMjU2ICsgKGRpc3QgPj4+IDcpXTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIE91dHB1dCBhIHNob3J0IExTQiBmaXJzdCBvbiB0aGUgc3RyZWFtLlxuICogSU4gYXNzZXJ0aW9uOiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiBwZW5kaW5nQnVmLlxuICovXG5mdW5jdGlvbiBwdXRfc2hvcnQocywgdykge1xuLy8gICAgcHV0X2J5dGUocywgKHVjaCkoKHcpICYgMHhmZikpO1xuLy8gICAgcHV0X2J5dGUocywgKHVjaCkoKHVzaCkodykgPj4gOCkpO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcgPj4+IDgpICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSB2YWx1ZSBvbiBhIGdpdmVuIG51bWJlciBvZiBiaXRzLlxuICogSU4gYXNzZXJ0aW9uOiBsZW5ndGggPD0gMTYgYW5kIHZhbHVlIGZpdHMgaW4gbGVuZ3RoIGJpdHMuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYml0cyhzLCB2YWx1ZSwgbGVuZ3RoKSB7XG4gIGlmIChzLmJpX3ZhbGlkID4gKEJ1Zl9zaXplIC0gbGVuZ3RoKSkge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gdmFsdWUgPj4gKEJ1Zl9zaXplIC0gcy5iaV92YWxpZCk7XG4gICAgcy5iaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTtcbiAgfSBlbHNlIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcy5iaV92YWxpZCArPSBsZW5ndGg7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzZW5kX2NvZGUocywgYywgdHJlZSkge1xuICBzZW5kX2JpdHMocywgdHJlZVtjICogMl0vKi5Db2RlKi8sIHRyZWVbYyAqIDIgKyAxXS8qLkxlbiovKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyXG4gKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpXG4gKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1XG4gKi9cbmZ1bmN0aW9uIGJpX3JldmVyc2UoY29kZSwgbGVuKSB7XG4gIHZhciByZXMgPSAwO1xuICBkbyB7XG4gICAgcmVzIHw9IGNvZGUgJiAxO1xuICAgIGNvZGUgPj4+PSAxO1xuICAgIHJlcyA8PD0gMTtcbiAgfSB3aGlsZSAoLS1sZW4gPiAwKTtcbiAgcmV0dXJuIHJlcyA+Pj4gMTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyLCBrZWVwaW5nIGF0IG1vc3QgNyBiaXRzIGluIGl0LlxuICovXG5mdW5jdGlvbiBiaV9mbHVzaChzKSB7XG4gIGlmIChzLmJpX3ZhbGlkID09PSAxNikge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSAwO1xuICAgIHMuYmlfdmFsaWQgPSAwO1xuXG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+PSA4KSB7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZiAmIDB4ZmY7XG4gICAgcy5iaV9idWYgPj49IDg7XG4gICAgcy5iaV92YWxpZCAtPSA4O1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aFxuICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmRcbiAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlXG4gKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguXG4gKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzXG4gKiAgICAgbm90IG51bGwuXG4gKi9cbmZ1bmN0aW9uIGdlbl9iaXRsZW4ocywgZGVzYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB0cmVlX2Rlc2MgKmRlc2M7ICAgIC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi9cbntcbiAgdmFyIHRyZWUgICAgICAgICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBtYXhfY29kZSAgICAgICAgPSBkZXNjLm1heF9jb2RlO1xuICB2YXIgc3RyZWUgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7XG4gIHZhciBoYXNfc3RyZWUgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7XG4gIHZhciBleHRyYSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iaXRzO1xuICB2YXIgYmFzZSAgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYmFzZTtcbiAgdmFyIG1heF9sZW5ndGggICAgICA9IGRlc2Muc3RhdF9kZXNjLm1heF9sZW5ndGg7XG4gIHZhciBoOyAgICAgICAgICAgICAgLyogaGVhcCBpbmRleCAqL1xuICB2YXIgbiwgbTsgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgICAgICAgIC8qIGJpdCBsZW5ndGggKi9cbiAgdmFyIHhiaXRzOyAgICAgICAgICAvKiBleHRyYSBiaXRzICovXG4gIHZhciBmOyAgICAgICAgICAgICAgLyogZnJlcXVlbmN5ICovXG4gIHZhciBvdmVyZmxvdyA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYml0IGxlbmd0aCB0b28gbGFyZ2UgKi9cblxuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBzLmJsX2NvdW50W2JpdHNdID0gMDtcbiAgfVxuXG4gIC8qIEluIGEgZmlyc3QgcGFzcywgY29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyAod2hpY2ggbWF5XG4gICAqIG92ZXJmbG93IGluIHRoZSBjYXNlIG9mIHRoZSBiaXQgbGVuZ3RoIHRyZWUpLlxuICAgKi9cbiAgdHJlZVtzLmhlYXBbcy5oZWFwX21heF0gKiAyICsgMV0vKi5MZW4qLyA9IDA7IC8qIHJvb3Qgb2YgdGhlIGhlYXAgKi9cblxuICBmb3IgKGggPSBzLmhlYXBfbWF4ICsgMTsgaCA8IEhFQVBfU0laRTsgaCsrKSB7XG4gICAgbiA9IHMuaGVhcFtoXTtcbiAgICBiaXRzID0gdHJlZVt0cmVlW24gKiAyICsgMV0vKi5EYWQqLyAqIDIgKyAxXS8qLkxlbiovICsgMTtcbiAgICBpZiAoYml0cyA+IG1heF9sZW5ndGgpIHtcbiAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoO1xuICAgICAgb3ZlcmZsb3crKztcbiAgICB9XG4gICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgIC8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovXG5cbiAgICBpZiAobiA+IG1heF9jb2RlKSB7IGNvbnRpbnVlOyB9IC8qIG5vdCBhIGxlYWYgbm9kZSAqL1xuXG4gICAgcy5ibF9jb3VudFtiaXRzXSsrO1xuICAgIHhiaXRzID0gMDtcbiAgICBpZiAobiA+PSBiYXNlKSB7XG4gICAgICB4Yml0cyA9IGV4dHJhW24gLSBiYXNlXTtcbiAgICB9XG4gICAgZiA9IHRyZWVbbiAqIDJdLyouRnJlcSovO1xuICAgIHMub3B0X2xlbiArPSBmICogKGJpdHMgKyB4Yml0cyk7XG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuICs9IGYgKiAoc3RyZWVbbiAqIDIgKyAxXS8qLkxlbiovICsgeGJpdHMpO1xuICAgIH1cbiAgfVxuICBpZiAob3ZlcmZsb3cgPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgLy8gVHJhY2UoKHN0ZGVycixcIlxcbmJpdCBsZW5ndGggb3ZlcmZsb3dcXG5cIikpO1xuICAvKiBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgb24gb2JqMiBhbmQgcGljIG9mIHRoZSBDYWxnYXJ5IGNvcnB1cyAqL1xuXG4gIC8qIEZpbmQgdGhlIGZpcnN0IGJpdCBsZW5ndGggd2hpY2ggY291bGQgaW5jcmVhc2U6ICovXG4gIGRvIHtcbiAgICBiaXRzID0gbWF4X2xlbmd0aCAtIDE7XG4gICAgd2hpbGUgKHMuYmxfY291bnRbYml0c10gPT09IDApIHsgYml0cy0tOyB9XG4gICAgcy5ibF9jb3VudFtiaXRzXS0tOyAgICAgIC8qIG1vdmUgb25lIGxlYWYgZG93biB0aGUgdHJlZSAqL1xuICAgIHMuYmxfY291bnRbYml0cyArIDFdICs9IDI7IC8qIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIgKi9cbiAgICBzLmJsX2NvdW50W21heF9sZW5ndGhdLS07XG4gICAgLyogVGhlIGJyb3RoZXIgb2YgdGhlIG92ZXJmbG93IGl0ZW0gYWxzbyBtb3ZlcyBvbmUgc3RlcCB1cCxcbiAgICAgKiBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF1cbiAgICAgKi9cbiAgICBvdmVyZmxvdyAtPSAyO1xuICB9IHdoaWxlIChvdmVyZmxvdyA+IDApO1xuXG4gIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2FubmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAgICogaCBpcyBzdGlsbCBlcXVhbCB0byBIRUFQX1NJWkUuIChJdCBpcyBzaW1wbGVyIHRvIHJlY29uc3RydWN0IGFsbFxuICAgKiBsZW5ndGhzIGluc3RlYWQgb2YgZml4aW5nIG9ubHkgdGhlIHdyb25nIG9uZXMuIFRoaXMgaWRlYSBpcyB0YWtlblxuICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLilcbiAgICovXG4gIGZvciAoYml0cyA9IG1heF9sZW5ndGg7IGJpdHMgIT09IDA7IGJpdHMtLSkge1xuICAgIG4gPSBzLmJsX2NvdW50W2JpdHNdO1xuICAgIHdoaWxlIChuICE9PSAwKSB7XG4gICAgICBtID0gcy5oZWFwWy0taF07XG4gICAgICBpZiAobSA+IG1heF9jb2RlKSB7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAodHJlZVttICogMiArIDFdLyouTGVuKi8gIT09IGJpdHMpIHtcbiAgICAgICAgLy8gVHJhY2UoKHN0ZGVycixcImNvZGUgJWQgYml0cyAlZC0+JWRcXG5cIiwgbSwgdHJlZVttXS5MZW4sIGJpdHMpKTtcbiAgICAgICAgcy5vcHRfbGVuICs9IChiaXRzIC0gdHJlZVttICogMiArIDFdLyouTGVuKi8pICogdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgICAgIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAgIH1cbiAgICAgIG4tLTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEdlbmVyYXRlIHRoZSBjb2RlcyBmb3IgYSBnaXZlbiB0cmVlIGFuZCBiaXQgY291bnRzICh3aGljaCBuZWVkIG5vdCBiZVxuICogb3B0aW1hbCkuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgYml0IGxlbmd0aCBzdGF0aXN0aWNzIGZvclxuICogdGhlIGdpdmVuIHRyZWUgYW5kIHRoZSBmaWVsZCBsZW4gaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb246IHRoZSBmaWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uXG4gKiAgICAgemVybyBjb2RlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBibF9jb3VudClcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAgICAgICAgICAgIC8qIHRoZSB0cmVlIHRvIGRlY29yYXRlICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbi8vICAgIHVzaGYgKmJsX2NvdW50OyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggKi9cbntcbiAgdmFyIG5leHRfY29kZSA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpOyAvKiBuZXh0IGNvZGUgdmFsdWUgZm9yIGVhY2ggYml0IGxlbmd0aCAqL1xuICB2YXIgY29kZSA9IDA7ICAgICAgICAgICAgICAvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgLyogYml0IGluZGV4ICovXG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgaW5kZXggKi9cblxuICAvKiBUaGUgZGlzdHJpYnV0aW9uIGNvdW50cyBhcmUgZmlyc3QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZSB2YWx1ZXNcbiAgICogd2l0aG91dCBiaXQgcmV2ZXJzYWwuXG4gICAqL1xuICBmb3IgKGJpdHMgPSAxOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBuZXh0X2NvZGVbYml0c10gPSBjb2RlID0gKGNvZGUgKyBibF9jb3VudFtiaXRzIC0gMV0pIDw8IDE7XG4gIH1cbiAgLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZVxuICAgKiBtdXN0IGJlIGFsbCBvbmVzLlxuICAgKi9cbiAgLy9Bc3NlcnQgKGNvZGUgKyBibF9jb3VudFtNQVhfQklUU10tMSA9PSAoMTw8TUFYX0JJVFMpLTEsXG4gIC8vICAgICAgICBcImluY29uc2lzdGVudCBiaXQgY291bnRzXCIpO1xuICAvL1RyYWNldigoc3RkZXJyLFwiXFxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCBcIiwgbWF4X2NvZGUpKTtcblxuICBmb3IgKG4gPSAwOyAgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgdmFyIGxlbiA9IHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovO1xuICAgIGlmIChsZW4gPT09IDApIHsgY29udGludWU7IH1cbiAgICAvKiBOb3cgcmV2ZXJzZSB0aGUgYml0cyAqL1xuICAgIHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pO1xuXG4gICAgLy9UcmFjZWN2KHRyZWUgIT0gc3RhdGljX2x0cmVlLCAoc3RkZXJyLFwiXFxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSBcIixcbiAgICAvLyAgICAgbiwgKGlzZ3JhcGgobikgPyBuIDogJyAnKSwgbGVuLCB0cmVlW25dLkNvZGUsIG5leHRfY29kZVtsZW5dLTEpKTtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyAnY29uc3RhbnQnIHRhYmxlcy5cbiAqL1xuZnVuY3Rpb24gdHJfc3RhdGljX2luaXQoKSB7XG4gIHZhciBuOyAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgLyogYml0IGNvdW50ZXIgKi9cbiAgdmFyIGxlbmd0aDsgICAvKiBsZW5ndGggdmFsdWUgKi9cbiAgdmFyIGNvZGU7ICAgICAvKiBjb2RlIHZhbHVlICovXG4gIHZhciBkaXN0OyAgICAgLyogZGlzdGFuY2UgaW5kZXggKi9cbiAgdmFyIGJsX2NvdW50ID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vIGRvIGNoZWNrIGluIF90cl9pbml0KClcbiAgLy9pZiAoc3RhdGljX2luaXRfZG9uZSkgcmV0dXJuO1xuXG4gIC8qIEZvciBzb21lIGVtYmVkZGVkIHRhcmdldHMsIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdCBpbml0aWFsaXplZDogKi9cbi8qI2lmZGVmIE5PX0lOSVRfR0xPQkFMX1BPSU5URVJTXG4gIHN0YXRpY19sX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfbHRyZWU7XG4gIHN0YXRpY19sX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2xiaXRzO1xuICBzdGF0aWNfZF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2R0cmVlO1xuICBzdGF0aWNfZF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9kYml0cztcbiAgc3RhdGljX2JsX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2JsYml0cztcbiNlbmRpZiovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBsZW5ndGggKDAuLjI1NSkgLT4gbGVuZ3RoIGNvZGUgKDAuLjI4KSAqL1xuICBsZW5ndGggPSAwO1xuICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgTEVOR1RIX0NPREVTIC0gMTsgY29kZSsrKSB7XG4gICAgYmFzZV9sZW5ndGhbY29kZV0gPSBsZW5ndGg7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7XG4gICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGxlbmd0aCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IGxlbmd0aCAhPSAyNTZcIik7XG4gIC8qIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIDI1NSAobWF0Y2ggbGVuZ3RoIDI1OCkgY2FuIGJlIHJlcHJlc2VudGVkXG4gICAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlXG4gICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBlbmNvZGluZzpcbiAgICovXG4gIF9sZW5ndGhfY29kZVtsZW5ndGggLSAxXSA9IGNvZGU7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBkaXN0ICgwLi4zMkspIC0+IGRpc3QgY29kZSAoMC4uMjkpICovXG4gIGRpc3QgPSAwO1xuICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgMTY7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2RiaXRzW2NvZGVdKTsgbisrKSB7XG4gICAgICBfZGlzdF9jb2RlW2Rpc3QrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZGlzdCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IGRpc3QgIT0gMjU2XCIpO1xuICBkaXN0ID4+PSA3OyAvKiBmcm9tIG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi9cbiAgZm9yICg7IGNvZGUgPCBEX0NPREVTOyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0IDw8IDc7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IChleHRyYV9kYml0c1tjb2RlXSAtIDcpKTsgbisrKSB7XG4gICAgICBfZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZGlzdCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IDI1NitkaXN0ICE9IDUxMlwiKTtcblxuICAvKiBDb25zdHJ1Y3QgdGhlIGNvZGVzIG9mIHRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlICovXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIGJsX2NvdW50W2JpdHNdID0gMDtcbiAgfVxuXG4gIG4gPSAwO1xuICB3aGlsZSAobiA8PSAxNDMpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gODtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOF0rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyNTUpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gOTtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOV0rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyNzkpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gNztcbiAgICBuKys7XG4gICAgYmxfY291bnRbN10rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyODcpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gODtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOF0rKztcbiAgfVxuICAvKiBDb2RlcyAyODYgYW5kIDI4NyBkbyBub3QgZXhpc3QsIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGVcbiAgICogdHJlZSBjb25zdHJ1Y3Rpb24gdG8gZ2V0IGEgY2Fub25pY2FsIEh1ZmZtYW4gdHJlZSAobG9uZ2VzdCBjb2RlXG4gICAqIGFsbCBvbmVzKVxuICAgKi9cbiAgZ2VuX2NvZGVzKHN0YXRpY19sdHJlZSwgTF9DT0RFUyArIDEsIGJsX2NvdW50KTtcblxuICAvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi9cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7IG4rKykge1xuICAgIHN0YXRpY19kdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA1O1xuICAgIHN0YXRpY19kdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG4sIDUpO1xuICB9XG5cbiAgLy8gTm93IGRhdGEgcmVhZHkgYW5kIHdlIGNhbiBpbml0IHN0YXRpYyB0cmVlc1xuICBzdGF0aWNfbF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19sdHJlZSwgZXh0cmFfbGJpdHMsIExJVEVSQUxTICsgMSwgTF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfZF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2JsX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2MobmV3IEFycmF5KDApLCBleHRyYV9ibGJpdHMsIDAsICAgICAgICAgQkxfQ09ERVMsIE1BWF9CTF9CSVRTKTtcblxuICAvL3N0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSBhIG5ldyBibG9jay5cbiAqL1xuZnVuY3Rpb24gaW5pdF9ibG9jayhzKSB7XG4gIHZhciBuOyAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSB0cmVlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8IExfQ09ERVM7ICBuKyspIHsgcy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgeyBzLmR5bl9kdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKSB7IHMuYmxfdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG5cbiAgcy5keW5fbHRyZWVbRU5EX0JMT0NLICogMl0vKi5GcmVxKi8gPSAxO1xuICBzLm9wdF9sZW4gPSBzLnN0YXRpY19sZW4gPSAwO1xuICBzLmxhc3RfbGl0ID0gcy5tYXRjaGVzID0gMDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyIGFuZCBhbGlnbiB0aGUgb3V0cHV0IG9uIGEgYnl0ZSBib3VuZGFyeVxuICovXG5mdW5jdGlvbiBiaV93aW5kdXAocylcbntcbiAgaWYgKHMuYmlfdmFsaWQgPiA4KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID4gMCkge1xuICAgIC8vcHV0X2J5dGUocywgKEJ5dGUpcy0+YmlfYnVmKTtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmO1xuICB9XG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSBhIHN0b3JlZCBibG9jaywgc3RvcmluZyBmaXJzdCB0aGUgbGVuZ3RoIGFuZCBpdHNcbiAqIG9uZSdzIGNvbXBsZW1lbnQgaWYgcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiBjb3B5X2Jsb2NrKHMsIGJ1ZiwgbGVuLCBoZWFkZXIpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgICAgKmJ1ZjsgICAgLyogdGhlIGlucHV0IGRhdGEgKi9cbi8vdW5zaWduZWQgbGVuOyAgICAgLyogaXRzIGxlbmd0aCAqL1xuLy9pbnQgICAgICBoZWFkZXI7ICAvKiB0cnVlIGlmIGJsb2NrIGhlYWRlciBtdXN0IGJlIHdyaXR0ZW4gKi9cbntcbiAgYmlfd2luZHVwKHMpOyAgICAgICAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqL1xuXG4gIGlmIChoZWFkZXIpIHtcbiAgICBwdXRfc2hvcnQocywgbGVuKTtcbiAgICBwdXRfc2hvcnQocywgfmxlbik7XG4gIH1cbi8vICB3aGlsZSAobGVuLS0pIHtcbi8vICAgIHB1dF9ieXRlKHMsICpidWYrKyk7XG4vLyAgfVxuICB1dGlscy5hcnJheVNldChzLnBlbmRpbmdfYnVmLCBzLndpbmRvdywgYnVmLCBsZW4sIHMucGVuZGluZyk7XG4gIHMucGVuZGluZyArPSBsZW47XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW5cbiAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBzbWFsbGVyKHRyZWUsIG4sIG0sIGRlcHRoKSB7XG4gIHZhciBfbjIgPSBuICogMjtcbiAgdmFyIF9tMiA9IG0gKiAyO1xuICByZXR1cm4gKHRyZWVbX24yXS8qLkZyZXEqLyA8IHRyZWVbX20yXS8qLkZyZXEqLyB8fFxuICAgICAgICAgKHRyZWVbX24yXS8qLkZyZXEqLyA9PT0gdHJlZVtfbTJdLyouRnJlcSovICYmIGRlcHRoW25dIDw9IGRlcHRoW21dKSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVzdG9yZSB0aGUgaGVhcCBwcm9wZXJ0eSBieSBtb3ZpbmcgZG93biB0aGUgdHJlZSBzdGFydGluZyBhdCBub2RlIGssXG4gKiBleGNoYW5naW5nIGEgbm9kZSB3aXRoIHRoZSBzbWFsbGVzdCBvZiBpdHMgdHdvIHNvbnMgaWYgbmVjZXNzYXJ5LCBzdG9wcGluZ1xuICogd2hlbiB0aGUgaGVhcCBwcm9wZXJ0eSBpcyByZS1lc3RhYmxpc2hlZCAoZWFjaCBmYXRoZXIgc21hbGxlciB0aGFuIGl0c1xuICogdHdvIHNvbnMpLlxuICovXG5mdW5jdGlvbiBwcWRvd25oZWFwKHMsIHRyZWUsIGspXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgIC8qIHRoZSB0cmVlIHRvIHJlc3RvcmUgKi9cbi8vICAgIGludCBrOyAgICAgICAgICAgICAgIC8qIG5vZGUgdG8gbW92ZSBkb3duICovXG57XG4gIHZhciB2ID0gcy5oZWFwW2tdO1xuICB2YXIgaiA9IGsgPDwgMTsgIC8qIGxlZnQgc29uIG9mIGsgKi9cbiAgd2hpbGUgKGogPD0gcy5oZWFwX2xlbikge1xuICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovXG4gICAgaWYgKGogPCBzLmhlYXBfbGVuICYmXG4gICAgICBzbWFsbGVyKHRyZWUsIHMuaGVhcFtqICsgMV0sIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHtcbiAgICAgIGorKztcbiAgICB9XG4gICAgLyogRXhpdCBpZiB2IGlzIHNtYWxsZXIgdGhhbiBib3RoIHNvbnMgKi9cbiAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7IGJyZWFrOyB9XG5cbiAgICAvKiBFeGNoYW5nZSB2IHdpdGggdGhlIHNtYWxsZXN0IHNvbiAqL1xuICAgIHMuaGVhcFtrXSA9IHMuaGVhcFtqXTtcbiAgICBrID0gajtcblxuICAgIC8qIEFuZCBjb250aW51ZSBkb3duIHRoZSB0cmVlLCBzZXR0aW5nIGogdG8gdGhlIGxlZnQgc29uIG9mIGsgKi9cbiAgICBqIDw8PSAxO1xuICB9XG4gIHMuaGVhcFtrXSA9IHY7XG59XG5cblxuLy8gaW5saW5lZCBtYW51YWxseVxuLy8gdmFyIFNNQUxMRVNUID0gMTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIHRoZSBibG9jayBkYXRhIGNvbXByZXNzZWQgdXNpbmcgdGhlIGdpdmVuIEh1ZmZtYW4gdHJlZXNcbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NfYmxvY2socywgbHRyZWUsIGR0cmVlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGNvbnN0IGN0X2RhdGEgKmx0cmVlOyAvKiBsaXRlcmFsIHRyZWUgKi9cbi8vICAgIGNvbnN0IGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovXG57XG4gIHZhciBkaXN0OyAgICAgICAgICAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxjOyAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkgKi9cbiAgdmFyIGx4ID0gMDsgICAgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG4gIHZhciBjb2RlOyAgICAgICAgICAgLyogdGhlIGNvZGUgdG8gc2VuZCAqL1xuICB2YXIgZXh0cmE7ICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIHNlbmQgKi9cblxuICBpZiAocy5sYXN0X2xpdCAhPT0gMCkge1xuICAgIGRvIHtcbiAgICAgIGRpc3QgPSAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyXSA8PCA4KSB8IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDIgKyAxXSk7XG4gICAgICBsYyA9IHMucGVuZGluZ19idWZbcy5sX2J1ZiArIGx4XTtcbiAgICAgIGx4Kys7XG5cbiAgICAgIGlmIChkaXN0ID09PSAwKSB7XG4gICAgICAgIHNlbmRfY29kZShzLCBsYywgbHRyZWUpOyAvKiBzZW5kIGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAgIC8vVHJhY2Vjdihpc2dyYXBoKGxjKSwgKHN0ZGVycixcIiAnJWMnIFwiLCBsYykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqL1xuICAgICAgICBjb2RlID0gX2xlbmd0aF9jb2RlW2xjXTtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUgKyBMSVRFUkFMUyArIDEsIGx0cmVlKTsgLyogc2VuZCB0aGUgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTtcbiAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7XG4gICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07XG4gICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7ICAgICAgIC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovXG4gICAgICAgIH1cbiAgICAgICAgZGlzdC0tOyAvKiBkaXN0IGlzIG5vdyB0aGUgbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7XG4gICAgICAgIC8vQXNzZXJ0IChjb2RlIDwgRF9DT0RFUywgXCJiYWQgZF9jb2RlXCIpO1xuXG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlLCBkdHJlZSk7ICAgICAgIC8qIHNlbmQgdGhlIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgZXh0cmEgPSBleHRyYV9kYml0c1tjb2RlXTtcbiAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7XG4gICAgICAgICAgZGlzdCAtPSBiYXNlX2Rpc3RbY29kZV07XG4gICAgICAgICAgc2VuZF9iaXRzKHMsIGRpc3QsIGV4dHJhKTsgICAvKiBzZW5kIHRoZSBleHRyYSBkaXN0YW5jZSBiaXRzICovXG4gICAgICAgIH1cbiAgICAgIH0gLyogbGl0ZXJhbCBvciBtYXRjaCBwYWlyID8gKi9cblxuICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgb3ZlcmxheSBiZXR3ZWVuIHBlbmRpbmdfYnVmIGFuZCBkX2J1ZitsX2J1ZiBpcyBvazogKi9cbiAgICAgIC8vQXNzZXJ0KCh1SW50KShzLT5wZW5kaW5nKSA8IHMtPmxpdF9idWZzaXplICsgMipseCxcbiAgICAgIC8vICAgICAgIFwicGVuZGluZ0J1ZiBvdmVyZmxvd1wiKTtcblxuICAgIH0gd2hpbGUgKGx4IDwgcy5sYXN0X2xpdCk7XG4gIH1cblxuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3Qgb25lIEh1ZmZtYW4gdHJlZSBhbmQgYXNzaWducyB0aGUgY29kZSBiaXQgc3RyaW5ncyBhbmQgbGVuZ3Rocy5cbiAqIFVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBmcmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkcyBsZW4gYW5kIGNvZGUgYXJlIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoXG4gKiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgY29kZS4gVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXNcbiAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX3RyZWUocywgZGVzYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB0cmVlX2Rlc2MgKmRlc2M7IC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi9cbntcbiAgdmFyIHRyZWUgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIHN0cmVlICAgID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7XG4gIHZhciBoYXNfc3RyZWUgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7XG4gIHZhciBlbGVtcyAgICA9IGRlc2Muc3RhdF9kZXNjLmVsZW1zO1xuICB2YXIgbiwgbTsgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIGhlYXAgZWxlbWVudHMgKi9cbiAgdmFyIG1heF9jb2RlID0gLTE7IC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB2YXIgbm9kZTsgICAgICAgICAgLyogbmV3IG5vZGUgYmVpbmcgY3JlYXRlZCAqL1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgaW5pdGlhbCBoZWFwLCB3aXRoIGxlYXN0IGZyZXF1ZW50IGVsZW1lbnQgaW5cbiAgICogaGVhcFtTTUFMTEVTVF0uIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uXG4gICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuXG4gICAqL1xuICBzLmhlYXBfbGVuID0gMDtcbiAgcy5oZWFwX21heCA9IEhFQVBfU0laRTtcblxuICBmb3IgKG4gPSAwOyBuIDwgZWxlbXM7IG4rKykge1xuICAgIGlmICh0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkge1xuICAgICAgcy5oZWFwWysrcy5oZWFwX2xlbl0gPSBtYXhfY29kZSA9IG47XG4gICAgICBzLmRlcHRoW25dID0gMDtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cyxcbiAgICogYW5kIHRoYXQgYXQgbGVhc3Qgb25lIGJpdCBzaG91bGQgYmUgc2VudCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lXG4gICAqIHBvc3NpYmxlIGNvZGUuIFNvIHRvIGF2b2lkIHNwZWNpYWwgY2hlY2tzIGxhdGVyIG9uIHdlIGZvcmNlIGF0IGxlYXN0XG4gICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuXG4gICAqL1xuICB3aGlsZSAocy5oZWFwX2xlbiA8IDIpIHtcbiAgICBub2RlID0gcy5oZWFwWysrcy5oZWFwX2xlbl0gPSAobWF4X2NvZGUgPCAyID8gKyttYXhfY29kZSA6IDApO1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gMTtcbiAgICBzLmRlcHRoW25vZGVdID0gMDtcbiAgICBzLm9wdF9sZW4tLTtcblxuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiAtPSBzdHJlZVtub2RlICogMiArIDFdLyouTGVuKi87XG4gICAgfVxuICAgIC8qIG5vZGUgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqL1xuICB9XG4gIGRlc2MubWF4X2NvZGUgPSBtYXhfY29kZTtcblxuICAvKiBUaGUgZWxlbWVudHMgaGVhcFtoZWFwX2xlbi8yKzEgLi4gaGVhcF9sZW5dIGFyZSBsZWF2ZXMgb2YgdGhlIHRyZWUsXG4gICAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOlxuICAgKi9cbiAgZm9yIChuID0gKHMuaGVhcF9sZW4gPj4gMS8qaW50IC8yKi8pOyBuID49IDE7IG4tLSkgeyBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOyB9XG5cbiAgLyogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGxlYXN0IHR3b1xuICAgKiBmcmVxdWVudCBub2Rlcy5cbiAgICovXG4gIG5vZGUgPSBlbGVtczsgICAgICAgICAgICAgIC8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqL1xuICBkbyB7XG4gICAgLy9wcXJlbW92ZShzLCB0cmVlLCBuKTsgIC8qIG4gPSBub2RlIG9mIGxlYXN0IGZyZXF1ZW5jeSAqL1xuICAgIC8qKiogcHFyZW1vdmUgKioqL1xuICAgIG4gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG4gICAgcy5oZWFwWzEvKlNNQUxMRVNUKi9dID0gcy5oZWFwW3MuaGVhcF9sZW4tLV07XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcbiAgICAvKioqL1xuXG4gICAgbSA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTsgLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi9cblxuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqL1xuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbTtcblxuICAgIC8qIENyZWF0ZSBhIG5ldyBub2RlIGZhdGhlciBvZiBuIGFuZCBtICovXG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSB0cmVlW24gKiAyXS8qLkZyZXEqLyArIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAocy5kZXB0aFtuXSA+PSBzLmRlcHRoW21dID8gcy5kZXB0aFtuXSA6IHMuZGVwdGhbbV0pICsgMTtcbiAgICB0cmVlW24gKiAyICsgMV0vKi5EYWQqLyA9IHRyZWVbbSAqIDIgKyAxXS8qLkRhZCovID0gbm9kZTtcblxuICAgIC8qIGFuZCBpbnNlcnQgdGhlIG5ldyBub2RlIGluIHRoZSBoZWFwICovXG4gICAgcy5oZWFwWzEvKlNNQUxMRVNUKi9dID0gbm9kZSsrO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG5cbiAgfSB3aGlsZSAocy5oZWFwX2xlbiA+PSAyKTtcblxuICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcblxuICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LiBXZSBjYW4gbm93XG4gICAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy5cbiAgICovXG4gIGdlbl9iaXRsZW4ocywgZGVzYyk7XG5cbiAgLyogVGhlIGZpZWxkIGxlbiBpcyBub3cgc2V0LCB3ZSBjYW4gZ2VuZXJhdGUgdGhlIGJpdCBjb2RlcyAqL1xuICBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIHMuYmxfY291bnQpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2Rlc1xuICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS5cbiAqL1xuZnVuY3Rpb24gc2Nhbl90cmVlKHMsIHRyZWUsIG1heF9jb2RlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuICB0cmVlWyhtYXhfY29kZSArIDEpICogMiArIDFdLyouTGVuKi8gPSAweGZmZmY7IC8qIGd1YXJkICovXG5cbiAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgY3VybGVuID0gbmV4dGxlbjtcbiAgICBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdLyouTGVuKi87XG5cbiAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkge1xuICAgICAgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovICs9IGNvdW50O1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcblxuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikgeyBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8rKzsgfVxuICAgICAgcy5ibF90cmVlW1JFUF8zXzYgKiAyXS8qLkZyZXEqLysrO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkge1xuICAgICAgcy5ibF90cmVlW1JFUFpfM18xMCAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcy5ibF90cmVlW1JFUFpfMTFfMTM4ICogMl0vKi5GcmVxKi8rKztcbiAgICB9XG5cbiAgICBjb3VudCA9IDA7XG4gICAgcHJldmxlbiA9IGN1cmxlbjtcblxuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSBpbiBjb21wcmVzc2VkIGZvcm0sIHVzaW5nIHRoZSBjb2RlcyBpblxuICogYmxfdHJlZS5cbiAqL1xuZnVuY3Rpb24gc2VuZF90cmVlKHMsIHRyZWUsIG1heF9jb2RlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7IC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0vKi5MZW4qLzsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIC8qIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gLTE7ICovICAvKiBndWFyZCBhbHJlYWR5IHNldCAqL1xuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG5cbiAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgY3VybGVuID0gbmV4dGxlbjtcbiAgICBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdLyouTGVuKi87XG5cbiAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkge1xuICAgICAgZG8geyBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpOyB9IHdoaWxlICgtLWNvdW50ICE9PSAwKTtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7XG4gICAgICAgIHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7XG4gICAgICAgIGNvdW50LS07XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChjb3VudCA+PSAzICYmIGNvdW50IDw9IDYsIFwiIDNfNj9cIik7XG4gICAgICBzZW5kX2NvZGUocywgUkVQXzNfNiwgcy5ibF90cmVlKTtcbiAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDMsIDIpO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfM18xMCwgcy5ibF90cmVlKTtcbiAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDMsIDMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy5ibF90cmVlKTtcbiAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDExLCA3KTtcbiAgICB9XG5cbiAgICBjb3VudCA9IDA7XG4gICAgcHJldmxlbiA9IGN1cmxlbjtcbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgYW5kIHJldHVybiB0aGUgaW5kZXggaW5cbiAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLlxuICovXG5mdW5jdGlvbiBidWlsZF9ibF90cmVlKHMpIHtcbiAgdmFyIG1heF9ibGluZGV4OyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgYml0IGxlbmd0aCBmcmVxdWVuY2llcyBmb3IgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi9cbiAgc2Nhbl90cmVlKHMsIHMuZHluX2x0cmVlLCBzLmxfZGVzYy5tYXhfY29kZSk7XG4gIHNjYW5fdHJlZShzLCBzLmR5bl9kdHJlZSwgcy5kX2Rlc2MubWF4X2NvZGUpO1xuXG4gIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWU6ICovXG4gIGJ1aWxkX3RyZWUocywgcy5ibF9kZXNjKTtcbiAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdFxuICAgKiB0aGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aHMgY29kZXMgYW5kIHRoZSA1KzUrNCBiaXRzIGZvciB0aGUgY291bnRzLlxuICAgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXRcbiAgICogcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCA0IGJpdCBsZW5ndGggY29kZXMgYmUgc2VudC4gKGFwcG5vdGUudHh0IHNheXNcbiAgICogMyBidXQgdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGlzIDQuKVxuICAgKi9cbiAgZm9yIChtYXhfYmxpbmRleCA9IEJMX0NPREVTIC0gMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkge1xuICAgIGlmIChzLmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdICogMiArIDFdLyouTGVuKi8gIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBiaXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqL1xuICBzLm9wdF9sZW4gKz0gMyAqIChtYXhfYmxpbmRleCArIDEpICsgNSArIDUgKyA0O1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGRcIixcbiAgLy8gICAgICAgIHMtPm9wdF9sZW4sIHMtPnN0YXRpY19sZW4pKTtcblxuICByZXR1cm4gbWF4X2JsaW5kZXg7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcgZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGVcbiAqIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMsIHRoZSBsaXRlcmFsIHRyZWUgYW5kIHRoZSBkaXN0YW5jZSB0cmVlLlxuICogSU4gYXNzZXJ0aW9uOiBsY29kZXMgPj0gMjU3LCBkY29kZXMgPj0gMSwgYmxjb2RlcyA+PSA0LlxuICovXG5mdW5jdGlvbiBzZW5kX2FsbF90cmVlcyhzLCBsY29kZXMsIGRjb2RlcywgYmxjb2Rlcylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovXG57XG4gIHZhciByYW5rOyAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW4gYmxfb3JkZXIgKi9cblxuICAvL0Fzc2VydCAobGNvZGVzID49IDI1NyAmJiBkY29kZXMgPj0gMSAmJiBibGNvZGVzID49IDQsIFwibm90IGVub3VnaCBjb2Rlc1wiKTtcbiAgLy9Bc3NlcnQgKGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsXG4gIC8vICAgICAgICBcInRvbyBtYW55IGNvZGVzXCIpO1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvdW50czogXCIpKTtcbiAgc2VuZF9iaXRzKHMsIGxjb2RlcyAtIDI1NywgNSk7IC8qIG5vdCArMjU1IGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBzZW5kX2JpdHMocywgZGNvZGVzIC0gMSwgICA1KTtcbiAgc2VuZF9iaXRzKHMsIGJsY29kZXMgLSA0LCAgNCk7IC8qIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykge1xuICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY29kZSAlMmQgXCIsIGJsX29yZGVyW3JhbmtdKSk7XG4gICAgc2VuZF9iaXRzKHMsIHMuYmxfdHJlZVtibF9vcmRlcltyYW5rXSAqIDIgKyAxXS8qLkxlbiovLCAzKTtcbiAgfVxuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9sdHJlZSwgbGNvZGVzIC0gMSk7IC8qIGxpdGVyYWwgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmxpdCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fZHRyZWUsIGRjb2RlcyAtIDEpOyAvKiBkaXN0YW5jZSB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZGlzdCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENoZWNrIGlmIHRoZSBkYXRhIHR5cGUgaXMgVEVYVCBvciBCSU5BUlksIHVzaW5nIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOlxuICogLSBURVhUIGlmIHRoZSB0d28gY29uZGl0aW9ucyBiZWxvdyBhcmUgc2F0aXNmaWVkOlxuICogICAgYSkgVGhlcmUgYXJlIG5vIG5vbi1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJibGFjayBsaXN0XCIgKDAuLjYsIDE0Li4yNSwgMjguLjMxKS5cbiAqICAgIGIpIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwcmludGFibGUgY2hhcmFjdGVyIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwid2hpdGUgbGlzdFwiICg5IHtUQUJ9LCAxMCB7TEZ9LCAxMyB7Q1J9LCAzMi4uMjU1KS5cbiAqIC0gQklOQVJZIG90aGVyd2lzZS5cbiAqIC0gVGhlIGZvbGxvd2luZyBwYXJ0aWFsbHktcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGZvcm0gYVxuICogICBcImdyYXkgbGlzdFwiIHRoYXQgaXMgaWdub3JlZCBpbiB0aGlzIGRldGVjdGlvbiBhbGdvcml0aG06XG4gKiAgICg3IHtCRUx9LCA4IHtCU30sIDExIHtWVH0sIDEyIHtGRn0sIDI2IHtTVUJ9LCAyNyB7RVNDfSkuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgRnJlcSBvZiBkeW5fbHRyZWUgYXJlIHNldC5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0X2RhdGFfdHlwZShzKSB7XG4gIC8qIGJsYWNrX21hc2sgaXMgdGhlIGJpdCBtYXNrIG9mIGJsYWNrLWxpc3RlZCBieXRlc1xuICAgKiBzZXQgYml0cyAwLi42LCAxNC4uMjUsIGFuZCAyOC4uMzFcbiAgICogMHhmM2ZmYzA3ZiA9IGJpbmFyeSAxMTExMDAxMTExMTExMTExMTEwMDAwMDAwMTExMTExMVxuICAgKi9cbiAgdmFyIGJsYWNrX21hc2sgPSAweGYzZmZjMDdmO1xuICB2YXIgbjtcblxuICAvKiBDaGVjayBmb3Igbm9uLXRleHR1YWwgKFwiYmxhY2stbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDw9IDMxOyBuKyssIGJsYWNrX21hc2sgPj4+PSAxKSB7XG4gICAgaWYgKChibGFja19tYXNrICYgMSkgJiYgKHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkpIHtcbiAgICAgIHJldHVybiBaX0JJTkFSWTtcbiAgICB9XG4gIH1cblxuICAvKiBDaGVjayBmb3IgdGV4dHVhbCAoXCJ3aGl0ZS1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGlmIChzLmR5bl9sdHJlZVs5ICogMl0vKi5GcmVxKi8gIT09IDAgfHwgcy5keW5fbHRyZWVbMTAgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fFxuICAgICAgcy5keW5fbHRyZWVbMTMgKiAyXS8qLkZyZXEqLyAhPT0gMCkge1xuICAgIHJldHVybiBaX1RFWFQ7XG4gIH1cbiAgZm9yIChuID0gMzI7IG4gPCBMSVRFUkFMUzsgbisrKSB7XG4gICAgaWYgKHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkge1xuICAgICAgcmV0dXJuIFpfVEVYVDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGVyZSBhcmUgbm8gXCJibGFjay1saXN0ZWRcIiBvciBcIndoaXRlLWxpc3RlZFwiIGJ5dGVzOlxuICAgKiB0aGlzIHN0cmVhbSBlaXRoZXIgaXMgZW1wdHkgb3IgaGFzIHRvbGVyYXRlZCAoXCJncmF5LWxpc3RlZFwiKSBieXRlcyBvbmx5LlxuICAgKi9cbiAgcmV0dXJuIFpfQklOQVJZO1xufVxuXG5cbnZhciBzdGF0aWNfaW5pdF9kb25lID0gZmFsc2U7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBfdHJfaW5pdChzKVxue1xuXG4gIGlmICghc3RhdGljX2luaXRfZG9uZSkge1xuICAgIHRyX3N0YXRpY19pbml0KCk7XG4gICAgc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG4gIH1cblxuICBzLmxfZGVzYyAgPSBuZXcgVHJlZURlc2Mocy5keW5fbHRyZWUsIHN0YXRpY19sX2Rlc2MpO1xuICBzLmRfZGVzYyAgPSBuZXcgVHJlZURlc2Mocy5keW5fZHRyZWUsIHN0YXRpY19kX2Rlc2MpO1xuICBzLmJsX2Rlc2MgPSBuZXcgVHJlZURlc2Mocy5ibF90cmVlLCBzdGF0aWNfYmxfZGVzYyk7XG5cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcblxuICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi9cbiAgaW5pdF9ibG9jayhzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBzdG9yZWQgYmxvY2tcbiAqL1xuZnVuY3Rpb24gX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2sgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgc2VuZF9iaXRzKHMsIChTVE9SRURfQkxPQ0sgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7ICAgIC8qIHNlbmQgYmxvY2sgdHlwZSAqL1xuICBjb3B5X2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgdHJ1ZSk7IC8qIHdpdGggaGVhZGVyICovXG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIG9uZSBlbXB0eSBzdGF0aWMgYmxvY2sgdG8gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlLlxuICogVGhpcyB0YWtlcyAxMCBiaXRzLCBvZiB3aGljaCA3IG1heSByZW1haW4gaW4gdGhlIGJpdCBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIF90cl9hbGlnbihzKSB7XG4gIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVMgPDwgMSwgMyk7XG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7XG4gIGJpX2ZsdXNoKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nIGZvciB0aGUgY3VycmVudCBibG9jazogZHluYW1pYyB0cmVlcywgc3RhdGljXG4gKiB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwIGZpbGUuXG4gKi9cbmZ1bmN0aW9uIF90cl9mbHVzaF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2ssIG9yIE5VTEwgaWYgdG9vIG9sZCAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICB2YXIgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAgLyogb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBpbiBieXRlcyAqL1xuICB2YXIgbWF4X2JsaW5kZXggPSAwOyAgICAgICAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqL1xuXG4gIC8qIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzIHVubGVzcyBhIHN0b3JlZCBibG9jayBpcyBmb3JjZWQgKi9cbiAgaWYgKHMubGV2ZWwgPiAwKSB7XG5cbiAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBiaW5hcnkgb3IgdGV4dCAqL1xuICAgIGlmIChzLnN0cm0uZGF0YV90eXBlID09PSBaX1VOS05PV04pIHtcbiAgICAgIHMuc3RybS5kYXRhX3R5cGUgPSBkZXRlY3RfZGF0YV90eXBlKHMpO1xuICAgIH1cblxuICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi9cbiAgICBidWlsZF90cmVlKHMsIHMubF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuXG4gICAgYnVpbGRfdHJlZShzLCBzLmRfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG4gICAgLyogQXQgdGhpcyBwb2ludCwgb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mXG4gICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy5cbiAgICAgKi9cblxuICAgIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWUgZm9yIHRoZSBhYm92ZSB0d28gdHJlZXMsIGFuZCBnZXQgdGhlIGluZGV4XG4gICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gICAgICovXG4gICAgbWF4X2JsaW5kZXggPSBidWlsZF9ibF90cmVlKHMpO1xuXG4gICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqL1xuICAgIG9wdF9sZW5iID0gKHMub3B0X2xlbiArIDMgKyA3KSA+Pj4gMztcbiAgICBzdGF0aWNfbGVuYiA9IChzLnN0YXRpY19sZW4gKyAzICsgNykgPj4+IDM7XG5cbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSBcIixcbiAgICAvLyAgICAgICAgb3B0X2xlbmIsIHMtPm9wdF9sZW4sIHN0YXRpY19sZW5iLCBzLT5zdGF0aWNfbGVuLCBzdG9yZWRfbGVuLFxuICAgIC8vICAgICAgICBzLT5sYXN0X2xpdCkpO1xuXG4gICAgaWYgKHN0YXRpY19sZW5iIDw9IG9wdF9sZW5iKSB7IG9wdF9sZW5iID0gc3RhdGljX2xlbmI7IH1cblxuICB9IGVsc2Uge1xuICAgIC8vIEFzc2VydChidWYgIT0gKGNoYXIqKTAsIFwibG9zdCBidWZcIik7XG4gICAgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqL1xuICB9XG5cbiAgaWYgKChzdG9yZWRfbGVuICsgNCA8PSBvcHRfbGVuYikgJiYgKGJ1ZiAhPT0gLTEpKSB7XG4gICAgLyogNDogdHdvIHdvcmRzIGZvciB0aGUgbGVuZ3RocyAqL1xuXG4gICAgLyogVGhlIHRlc3QgYnVmICE9IE5VTEwgaXMgb25seSBuZWNlc3NhcnkgaWYgTElUX0JVRlNJWkUgPiBXU0laRS5cbiAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlXG4gICAgICogdGhlIGxhc3QgYmxvY2sgZmx1c2gsIGJlY2F1c2UgY29tcHJlc3Npb24gd291bGQgaGF2ZSBiZWVuXG4gICAgICogc3VjY2Vzc2Z1bC4gSWYgTElUX0JVRlNJWkUgPD0gV1NJWkUsIGl0IGlzIG5ldmVyIHRvbyBsYXRlIHRvXG4gICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay5cbiAgICAgKi9cbiAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCk7XG5cbiAgfSBlbHNlIGlmIChzLnN0cmF0ZWd5ID09PSBaX0ZJWEVEIHx8IHN0YXRpY19sZW5iID09PSBvcHRfbGVuYikge1xuXG4gICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVMgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7XG4gICAgY29tcHJlc3NfYmxvY2socywgc3RhdGljX2x0cmVlLCBzdGF0aWNfZHRyZWUpO1xuXG4gIH0gZWxzZSB7XG4gICAgc2VuZF9iaXRzKHMsIChEWU5fVFJFRVMgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7XG4gICAgc2VuZF9hbGxfdHJlZXMocywgcy5sX2Rlc2MubWF4X2NvZGUgKyAxLCBzLmRfZGVzYy5tYXhfY29kZSArIDEsIG1heF9ibGluZGV4ICsgMSk7XG4gICAgY29tcHJlc3NfYmxvY2socywgcy5keW5fbHRyZWUsIHMuZHluX2R0cmVlKTtcbiAgfVxuICAvLyBBc3NlcnQgKHMtPmNvbXByZXNzZWRfbGVuID09IHMtPmJpdHNfc2VudCwgXCJiYWQgY29tcHJlc3NlZCBzaXplXCIpO1xuICAvKiBUaGUgYWJvdmUgY2hlY2sgaXMgbWFkZSBtb2QgMl4zMiwgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDUxMiBNQlxuICAgKiBhbmQgdUxvbmcgaW1wbGVtZW50ZWQgb24gMzIgYml0cy5cbiAgICovXG4gIGluaXRfYmxvY2socyk7XG5cbiAgaWYgKGxhc3QpIHtcbiAgICBiaV93aW5kdXAocyk7XG4gIH1cbiAgLy8gVHJhY2V2KChzdGRlcnIsXCJcXG5jb21wcmxlbiAlbHUoJWx1KSBcIiwgcy0+Y29tcHJlc3NlZF9sZW4+PjMsXG4gIC8vICAgICAgIHMtPmNvbXByZXNzZWRfbGVuLTcqbGFzdCkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZlxuICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLlxuICovXG5mdW5jdGlvbiBfdHJfdGFsbHkocywgZGlzdCwgbGMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdW5zaWduZWQgZGlzdDsgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4vLyAgICB1bnNpZ25lZCBsYzsgICAgLyogbWF0Y2ggbGVuZ3RoLU1JTl9NQVRDSCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdD09MCkgKi9cbntcbiAgLy92YXIgb3V0X2xlbmd0aCwgaW5fbGVuZ3RoLCBkY29kZTtcblxuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMl0gICAgID0gKGRpc3QgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDIgKyAxXSA9IGRpc3QgJiAweGZmO1xuXG4gIHMucGVuZGluZ19idWZbcy5sX2J1ZiArIHMubGFzdF9saXRdID0gbGMgJiAweGZmO1xuICBzLmxhc3RfbGl0Kys7XG5cbiAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi9cbiAgICBzLmR5bl9sdHJlZVtsYyAqIDJdLyouRnJlcSovKys7XG4gIH0gZWxzZSB7XG4gICAgcy5tYXRjaGVzKys7XG4gICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqL1xuICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgIC8vQXNzZXJ0KCh1c2gpZGlzdCA8ICh1c2gpTUFYX0RJU1QocykgJiZcbiAgICAvLyAgICAgICAodXNoKWxjIDw9ICh1c2gpKE1BWF9NQVRDSC1NSU5fTUFUQ0gpICYmXG4gICAgLy8gICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICBcIl90cl90YWxseTogYmFkIG1hdGNoXCIpO1xuXG4gICAgcy5keW5fbHRyZWVbKF9sZW5ndGhfY29kZVtsY10gKyBMSVRFUkFMUyArIDEpICogMl0vKi5GcmVxKi8rKztcbiAgICBzLmR5bl9kdHJlZVtkX2NvZGUoZGlzdCkgKiAyXS8qLkZyZXEqLysrO1xuICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYXVsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG5cbi8vI2lmZGVmIFRSVU5DQVRFX0JMT0NLXG4vLyAgLyogVHJ5IHRvIGd1ZXNzIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gc3RvcCB0aGUgY3VycmVudCBibG9jayBoZXJlICovXG4vLyAgaWYgKChzLmxhc3RfbGl0ICYgMHgxZmZmKSA9PT0gMCAmJiBzLmxldmVsID4gMikge1xuLy8gICAgLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoICovXG4vLyAgICBvdXRfbGVuZ3RoID0gcy5sYXN0X2xpdCo4O1xuLy8gICAgaW5fbGVuZ3RoID0gcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQ7XG4vL1xuLy8gICAgZm9yIChkY29kZSA9IDA7IGRjb2RlIDwgRF9DT0RFUzsgZGNvZGUrKykge1xuLy8gICAgICBvdXRfbGVuZ3RoICs9IHMuZHluX2R0cmVlW2Rjb2RlKjJdLyouRnJlcSovICogKDUgKyBleHRyYV9kYml0c1tkY29kZV0pO1xuLy8gICAgfVxuLy8gICAgb3V0X2xlbmd0aCA+Pj49IDM7XG4vLyAgICAvL1RyYWNldigoc3RkZXJyLFwiXFxubGFzdF9saXQgJXUsIGluICVsZCwgb3V0IH4lbGQoJWxkJSUpIFwiLFxuLy8gICAgLy8gICAgICAgcy0+bGFzdF9saXQsIGluX2xlbmd0aCwgb3V0X2xlbmd0aCxcbi8vICAgIC8vICAgICAgIDEwMEwgLSBvdXRfbGVuZ3RoKjEwMEwvaW5fbGVuZ3RoKSk7XG4vLyAgICBpZiAocy5tYXRjaGVzIDwgKHMubGFzdF9saXQ+PjEpLyppbnQgLzIqLyAmJiBvdXRfbGVuZ3RoIDwgKGluX2xlbmd0aD4+MSkvKmludCAvMiovKSB7XG4vLyAgICAgIHJldHVybiB0cnVlO1xuLy8gICAgfVxuLy8gIH1cbi8vI2VuZGlmXG5cbiAgcmV0dXJuIChzLmxhc3RfbGl0ID09PSBzLmxpdF9idWZzaXplIC0gMSk7XG4gIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggbGl0X2J1ZnNpemUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0S1xuICAgKiBvbiAxNiBiaXQgbWFjaGluZXMgYW5kIGJlY2F1c2Ugc3RvcmVkIGJsb2NrcyBhcmUgcmVzdHJpY3RlZCB0b1xuICAgKiA2NEstMSBieXRlcy5cbiAgICovXG59XG5cbmV4cG9ydHMuX3RyX2luaXQgID0gX3RyX2luaXQ7XG5leHBvcnRzLl90cl9zdG9yZWRfYmxvY2sgPSBfdHJfc3RvcmVkX2Jsb2NrO1xuZXhwb3J0cy5fdHJfZmx1c2hfYmxvY2sgID0gX3RyX2ZsdXNoX2Jsb2NrO1xuZXhwb3J0cy5fdHJfdGFsbHkgPSBfdHJfdGFsbHk7XG5leHBvcnRzLl90cl9hbGlnbiA9IF90cl9hbGlnbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5mdW5jdGlvbiBaU3RyZWFtKCkge1xuICAvKiBuZXh0IGlucHV0IGJ5dGUgKi9cbiAgdGhpcy5pbnB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X2luID0gMDtcbiAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBpbnB1dCAqL1xuICB0aGlzLmF2YWlsX2luID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovXG4gIHRoaXMudG90YWxfaW4gPSAwO1xuICAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi9cbiAgdGhpcy5vdXRwdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9vdXQgPSAwO1xuICAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBvdXRwdXQgKi9cbiAgdGhpcy5hdmFpbF9vdXQgPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX291dCA9IDA7XG4gIC8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqL1xuICB0aGlzLm1zZyA9ICcnLypaX05VTEwqLztcbiAgLyogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICovXG4gIHRoaXMuc3RhdGUgPSBudWxsO1xuICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGJpbmFyeSBvciB0ZXh0ICovXG4gIHRoaXMuZGF0YV90eXBlID0gMi8qWl9VTktOT1dOKi87XG4gIC8qIGFkbGVyMzIgdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovXG4gIHRoaXMuYWRsZXIgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFpTdHJlYW07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvUGFyc2UuanMnKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRyYWNrID0gdHJhY2s7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG4vKipcbiAqIFBhcnNlLkFuYWx5dGljcyBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gUGFyc2UncyBsb2dnaW5nIGFuZCBhbmFseXRpY3NcbiAqIGJhY2tlbmQuXG4gKlxuICogQGNsYXNzIFBhcnNlLkFuYWx5dGljc1xuICogQHN0YXRpY1xuICogQGhpZGVjb25zdHJ1Y3RvclxuICovXG5cbi8qKlxuICogVHJhY2tzIHRoZSBvY2N1cnJlbmNlIG9mIGEgY3VzdG9tIGV2ZW50IHdpdGggYWRkaXRpb25hbCBkaW1lbnNpb25zLlxuICogUGFyc2Ugd2lsbCBzdG9yZSBhIGRhdGEgcG9pbnQgYXQgdGhlIHRpbWUgb2YgaW52b2NhdGlvbiB3aXRoIHRoZSBnaXZlblxuICogZXZlbnQgbmFtZS5cbiAqXG4gKiBEaW1lbnNpb25zIHdpbGwgYWxsb3cgc2VnbWVudGF0aW9uIG9mIHRoZSBvY2N1cnJlbmNlcyBvZiB0aGlzIGN1c3RvbVxuICogZXZlbnQuIEtleXMgYW5kIHZhbHVlcyBzaG91bGQgYmUge0Bjb2RlIFN0cmluZ31zLCBhbmQgd2lsbCB0aHJvd1xuICogb3RoZXJ3aXNlLlxuICpcbiAqIFRvIHRyYWNrIGEgdXNlciBzaWdudXAgYWxvbmcgd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhLCBjb25zaWRlciB0aGVcbiAqIGZvbGxvd2luZzpcbiAqIDxwcmU+XG4gKiB2YXIgZGltZW5zaW9ucyA9IHtcbiAqICBnZW5kZXI6ICdtJyxcbiAqICBzb3VyY2U6ICd3ZWInLFxuICogIGRheVR5cGU6ICd3ZWVrZW5kJ1xuICogfTtcbiAqIFBhcnNlLkFuYWx5dGljcy50cmFjaygnc2lnbnVwJywgZGltZW5zaW9ucyk7XG4gKiA8L3ByZT5cbiAqXG4gKiBUaGVyZSBpcyBhIGRlZmF1bHQgbGltaXQgb2YgOCBkaW1lbnNpb25zIHBlciBldmVudCB0cmFja2VkLlxuICpcbiAqIEBmdW5jdGlvbiB0cmFja1xuICogQG5hbWUgUGFyc2UuQW5hbHl0aWNzLnRyYWNrXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIGV2ZW50IHRvIHJlcG9ydCB0byBQYXJzZSBhc1xuICogaGF2aW5nIGhhcHBlbmVkLlxuICogQHBhcmFtIHtvYmplY3R9IGRpbWVuc2lvbnMgVGhlIGRpY3Rpb25hcnkgb2YgaW5mb3JtYXRpb24gYnkgd2hpY2ggdG9cbiAqIHNlZ21lbnQgdGhpcyBldmVudC5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSByb3VuZC10cmlwXG4gKiB0byB0aGUgc2VydmVyIGNvbXBsZXRlcy5cbiAqL1xuZnVuY3Rpb24gdHJhY2sobmFtZSwgZGltZW5zaW9ucykge1xuICBuYW1lID0gbmFtZSB8fCAnJztcbiAgbmFtZSA9IG5hbWUucmVwbGFjZSgvXlxccyovLCAnJyk7XG4gIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1xccyokLywgJycpO1xuICBpZiAobmFtZS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIG5hbWUgZm9yIHRoZSBjdXN0b20gZXZlbnQgbXVzdCBiZSBwcm92aWRlZCcpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIGRpbWVuc2lvbnMpIHtcbiAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIGRpbWVuc2lvbnNba2V5XSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RyYWNrKCkgZGltZW5zaW9ucyBleHBlY3RzIGtleXMgYW5kIHZhbHVlcyBvZiB0eXBlIFwic3RyaW5nXCIuJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBbmFseXRpY3NDb250cm9sbGVyKCkudHJhY2sobmFtZSwgZGltZW5zaW9ucyk7XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgdHJhY2sobmFtZSwgZGltZW5zaW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdldmVudHMvJyArIG5hbWUsIHtcbiAgICAgIGRpbWVuc2lvbnNcbiAgICB9KTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldEFuYWx5dGljc0NvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX1BhcnNlVXNlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VVc2VyXCIpKTtcbnZhciBfdXVpZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXVpZFwiKSk7XG5sZXQgcmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggQW5vbnltb3VzbHkgbG9nZ2VkLWluIHVzZXJzLiA8YnIgLz5cbiAqIEFub255bW91cyB1c2VycyBoYXZlIHNvbWUgdW5pcXVlIGNoYXJhY3RlcmlzdGljczpcbiAqIDx1bD5cbiAqICA8bGk+QW5vbnltb3VzIHVzZXJzIGRvbid0IG5lZWQgYSB1c2VyIG5hbWUgb3IgcGFzc3dvcmQuPC9saT5cbiAqICA8dWw+XG4gKiAgICA8bGk+T25jZSBsb2dnZWQgb3V0LCBhbiBhbm9ueW1vdXMgdXNlciBjYW5ub3QgYmUgcmVjb3ZlcmVkLjwvbGk+XG4gKiAgPC91bD5cbiAqICA8bGk+c2lnblVwIGNvbnZlcnRzIGFuIGFub255bW91cyB1c2VyIHRvIGEgc3RhbmRhcmQgdXNlciB3aXRoIHRoZSBnaXZlbiB1c2VybmFtZSBhbmQgcGFzc3dvcmQuPC9saT5cbiAqICA8dWw+XG4gKiAgICA8bGk+RGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFub255bW91cyB1c2VyIGlzIHJldGFpbmVkLjwvbGk+XG4gKiAgPC91bD5cbiAqICA8bGk+bG9nSW4gc3dpdGNoZXMgdXNlcnMgd2l0aG91dCBjb252ZXJ0aW5nIHRoZSBhbm9ueW1vdXMgdXNlci48L2xpPlxuICogIDx1bD5cbiAqICAgIDxsaT5EYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW5vbnltb3VzIHVzZXIgd2lsbCBiZSBsb3N0LjwvbGk+XG4gKiAgPC91bD5cbiAqICA8bGk+U2VydmljZSBsb2dJbiAoZS5nLiBGYWNlYm9vaywgVHdpdHRlcikgd2lsbCBhdHRlbXB0IHRvIGNvbnZlcnRcbiAqICB0aGUgYW5vbnltb3VzIHVzZXIgaW50byBhIHN0YW5kYXJkIHVzZXIgYnkgbGlua2luZyBpdCB0byB0aGUgc2VydmljZS48L2xpPlxuICogIDx1bD5cbiAqICAgIDxsaT5JZiBhIHVzZXIgYWxyZWFkeSBleGlzdHMgdGhhdCBpcyBsaW5rZWQgdG8gdGhlIHNlcnZpY2UsIGl0IHdpbGwgaW5zdGVhZCBzd2l0Y2ggdG8gdGhlIGV4aXN0aW5nIHVzZXIuPC9saT5cbiAqICA8L3VsPlxuICogIDxsaT5TZXJ2aWNlIGxpbmtpbmcgKGUuZy4gRmFjZWJvb2ssIFR3aXR0ZXIpIHdpbGwgY29udmVydCB0aGUgYW5vbnltb3VzIHVzZXJcbiAqICBpbnRvIGEgc3RhbmRhcmQgdXNlciBieSBsaW5raW5nIGl0IHRvIHRoZSBzZXJ2aWNlLjwvbGk+XG4gKiA8L3VsPlxuICpcbiAqIEBjbGFzcyBQYXJzZS5Bbm9ueW1vdXNVdGlsc1xuICogQHN0YXRpY1xuICovXG5jb25zdCBBbm9ueW1vdXNVdGlscyA9IHtcbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgdXNlciBoYXMgdGhlaXIgYWNjb3VudCBsaW5rZWQgdG8gYW5vbnltb3VzIHVzZXIuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBpc0xpbmtlZFxuICAgKiBAbmFtZSBQYXJzZS5Bbm9ueW1vdXNVdGlscy5pc0xpbmtlZFxuICAgKiBAcGFyYW0ge1BhcnNlLlVzZXJ9IHVzZXIgVXNlciB0byBjaGVjayBmb3IuXG4gICAqICAgICBUaGUgdXNlciBtdXN0IGJlIGxvZ2dlZCBpbiBvbiB0aGlzIGRldmljZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIGhhcyB0aGVpciBhY2NvdW50XG4gICAqICAgICBsaW5rZWQgdG8gYW4gYW5vbnltb3VzIHVzZXIuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGlzTGlua2VkKHVzZXIpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuX2dldEF1dGhQcm92aWRlcigpO1xuICAgIHJldHVybiB1c2VyLl9pc0xpbmtlZChwcm92aWRlci5nZXRBdXRoVHlwZSgpKTtcbiAgfSxcbiAgLyoqXG4gICAqIExvZ3MgaW4gYSB1c2VyIEFub255bW91c2x5LlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbG9nSW5cbiAgICogQG5hbWUgUGFyc2UuQW5vbnltb3VzVXRpbHMubG9nSW5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgTWFzdGVyS2V5IC8gU2Vzc2lvblRva2VuLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gTG9nZ2VkIGluIHVzZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgbG9nSW4ob3B0aW9ucykge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5fZ2V0QXV0aFByb3ZpZGVyKCk7XG4gICAgcmV0dXJuIF9QYXJzZVVzZXIuZGVmYXVsdC5sb2dJbldpdGgocHJvdmlkZXIuZ2V0QXV0aFR5cGUoKSwgcHJvdmlkZXIuZ2V0QXV0aERhdGEoKSwgb3B0aW9ucyk7XG4gIH0sXG4gIC8qKlxuICAgKiBMaW5rcyBBbm9ueW1vdXMgVXNlciB0byBhbiBleGlzdGluZyBQRlVzZXIuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBsaW5rXG4gICAqIEBuYW1lIFBhcnNlLkFub255bW91c1V0aWxzLmxpbmtcbiAgICogQHBhcmFtIHtQYXJzZS5Vc2VyfSB1c2VyIFVzZXIgdG8gbGluay4gVGhpcyBtdXN0IGJlIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE1hc3RlcktleSAvIFNlc3Npb25Ub2tlbi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IExpbmtlZCB3aXRoIFVzZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgbGluayh1c2VyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLl9nZXRBdXRoUHJvdmlkZXIoKTtcbiAgICByZXR1cm4gdXNlci5saW5rV2l0aChwcm92aWRlci5nZXRBdXRoVHlwZSgpLCBwcm92aWRlci5nZXRBdXRoRGF0YSgpLCBvcHRpb25zKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBBdXRoZW50aWNhdGlvbiBQcm92aWRlciBoYXMgYmVlbiByZWdpc3RlcmVkIGZvciB1c2UuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBpc1JlZ2lzdGVyZWRcbiAgICogQG5hbWUgUGFyc2UuQW5vbnltb3VzVXRpbHMuaXNSZWdpc3RlcmVkXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBpc1JlZ2lzdGVyZWQoKSB7XG4gICAgcmV0dXJuIHJlZ2lzdGVyZWQ7XG4gIH0sXG4gIF9nZXRBdXRoUHJvdmlkZXIoKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB7XG4gICAgICByZXN0b3JlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGdldEF1dGhUeXBlKCkge1xuICAgICAgICByZXR1cm4gJ2Fub255bW91cyc7XG4gICAgICB9LFxuICAgICAgZ2V0QXV0aERhdGEoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYXV0aERhdGE6IHtcbiAgICAgICAgICAgIGlkOiAoMCwgX3V1aWQuZGVmYXVsdCkoKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICghcmVnaXN0ZXJlZCkge1xuICAgICAgX1BhcnNlVXNlci5kZWZhdWx0Ll9yZWdpc3RlckF1dGhlbnRpY2F0aW9uUHJvdmlkZXIocHJvdmlkZXIpO1xuICAgICAgcmVnaXN0ZXJlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBwcm92aWRlcjtcbiAgfVxufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEFub255bW91c1V0aWxzOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldEpvYlN0YXR1cyA9IGdldEpvYlN0YXR1cztcbmV4cG9ydHMuZ2V0Sm9ic0RhdGEgPSBnZXRKb2JzRGF0YTtcbmV4cG9ydHMucnVuID0gcnVuO1xuZXhwb3J0cy5zdGFydEpvYiA9IHN0YXJ0Sm9iO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX2VuY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlUXVlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUXVlcnlcIikpO1xuLyoqXG4gKiBDb250YWlucyBmdW5jdGlvbnMgZm9yIGNhbGxpbmcgYW5kIGRlY2xhcmluZ1xuICogPGEgaHJlZj1cIi9kb2NzL2Nsb3VkX2NvZGVfZ3VpZGUjZnVuY3Rpb25zXCI+Y2xvdWQgZnVuY3Rpb25zPC9hPi5cbiAqIDxwPjxzdHJvbmc+PGVtPlxuICogICBTb21lIGZ1bmN0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgZnJvbSBDbG91ZCBDb2RlLlxuICogPC9lbT48L3N0cm9uZz48L3A+XG4gKlxuICogQGNsYXNzIFBhcnNlLkNsb3VkXG4gKiBAc3RhdGljXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKi9cblxuLyoqXG4gKiBNYWtlcyBhIGNhbGwgdG8gYSBjbG91ZCBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gcnVuXG4gKiBAbmFtZSBQYXJzZS5DbG91ZC5ydW5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBmdW5jdGlvbiBuYW1lLlxuICogQHBhcmFtIHtvYmplY3R9IGRhdGEgVGhlIHBhcmFtZXRlcnMgdG8gc2VuZCB0byB0aGUgY2xvdWQgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0XG4gKiBvZiB0aGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHJ1bihuYW1lLCBkYXRhLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2xvdWQgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICB9XG4gIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge307XG4gIGlmIChvcHRpb25zLnVzZU1hc3RlcktleSkge1xuICAgIHJlcXVlc3RPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICB9XG4gIGlmIChvcHRpb25zLnNlc3Npb25Ub2tlbikge1xuICAgIHJlcXVlc3RPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICB9XG4gIGlmIChvcHRpb25zLmluc3RhbGxhdGlvbklkKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPSBvcHRpb25zLmluc3RhbGxhdGlvbklkO1xuICB9XG4gIGlmIChvcHRpb25zLmNvbnRleHQgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICB9XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDbG91ZENvbnRyb2xsZXIoKS5ydW4obmFtZSwgZGF0YSwgcmVxdWVzdE9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEdldHMgZGF0YSBmb3IgdGhlIGN1cnJlbnQgc2V0IG9mIGNsb3VkIGpvYnMuXG4gKlxuICogQGZ1bmN0aW9uIGdldEpvYnNEYXRhXG4gKiBAbmFtZSBQYXJzZS5DbG91ZC5nZXRKb2JzRGF0YVxuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0XG4gKiBvZiB0aGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGdldEpvYnNEYXRhKCkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q2xvdWRDb250cm9sbGVyKCkuZ2V0Sm9ic0RhdGEoe1xuICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBTdGFydHMgYSBnaXZlbiBjbG91ZCBqb2IsIHdoaWNoIHdpbGwgcHJvY2VzcyBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAZnVuY3Rpb24gc3RhcnRKb2JcbiAqIEBuYW1lIFBhcnNlLkNsb3VkLnN0YXJ0Sm9iXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVuY3Rpb24gbmFtZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIFRoZSBwYXJhbWV0ZXJzIHRvIHNlbmQgdG8gdGhlIGNsb3VkIGZ1bmN0aW9uLlxuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgam9iU3RhdHVzSWRcbiAqIG9mIHRoZSBqb2IuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0Sm9iKG5hbWUsIGRhdGEpIHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nsb3VkIGpvYiBuYW1lIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gIH1cbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENsb3VkQ29udHJvbGxlcigpLnN0YXJ0Sm9iKG5hbWUsIGRhdGEsIHtcbiAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0cyBqb2Igc3RhdHVzIGJ5IElkXG4gKlxuICogQGZ1bmN0aW9uIGdldEpvYlN0YXR1c1xuICogQG5hbWUgUGFyc2UuQ2xvdWQuZ2V0Sm9iU3RhdHVzXG4gKiBAcGFyYW0ge3N0cmluZ30gam9iU3RhdHVzSWQgVGhlIElkIG9mIEpvYiBTdGF0dXMuXG4gKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBTdGF0dXMgb2YgSm9iLlxuICovXG5mdW5jdGlvbiBnZXRKb2JTdGF0dXMoam9iU3RhdHVzSWQpIHtcbiAgY29uc3QgcXVlcnkgPSBuZXcgX1BhcnNlUXVlcnkuZGVmYXVsdCgnX0pvYlN0YXR1cycpO1xuICByZXR1cm4gcXVlcnkuZ2V0KGpvYlN0YXR1c0lkLCB7XG4gICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gIH0pO1xufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIHJ1bihuYW1lLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBheWxvYWQgPSAoMCwgX2VuY29kZS5kZWZhdWx0KShkYXRhLCB0cnVlKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdmdW5jdGlvbnMvJyArIG5hbWUsIHBheWxvYWQsIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXF1ZXN0LnRoZW4ocmVzID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVzID09PSAnb2JqZWN0JyAmJiAoMCwgX2tleXMuZGVmYXVsdCkocmVzKS5sZW5ndGggPiAwICYmICFyZXMuaGFzT3duUHJvcGVydHkoJ3Jlc3VsdCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9KU09OLCAnVGhlIHNlcnZlciByZXR1cm5lZCBhbiBpbnZhbGlkIHJlc3BvbnNlLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVjb2RlZCA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKHJlcyk7XG4gICAgICBpZiAoZGVjb2RlZCAmJiBkZWNvZGVkLmhhc093blByb3BlcnR5KCdyZXN1bHQnKSkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGRlY29kZWQucmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0Sm9ic0RhdGEob3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2Nsb3VkX2NvZGUvam9icy9kYXRhJywgbnVsbCwgb3B0aW9ucyk7XG4gIH0sXG4gIGFzeW5jIHN0YXJ0Sm9iKG5hbWUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGF5bG9hZCA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKGRhdGEsIHRydWUpO1xuICAgIG9wdGlvbnMucmV0dXJuU3RhdHVzID0gdHJ1ZTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnam9icy8nICsgbmFtZSwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLl9oZWFkZXJzPy5bJ1gtUGFyc2UtSm9iLVN0YXR1cy1JZCddO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0Q2xvdWRDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG4vKiogQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LW5hdGl2ZS1hc3luYy1zdG9yYWdlL2FzeW5jLXN0b3JhZ2UvYmxvYi9tYWluL3BhY2thZ2VzL2RlZmF1bHQtc3RvcmFnZS1iYWNrZW5kL3NyYy90eXBlcy50cyAqL1xuXG5jb25zdCBjb25maWcgPSB7XG4gIElTX05PREU6IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAhIXByb2Nlc3MudmVyc2lvbnMgJiYgISFwcm9jZXNzLnZlcnNpb25zLm5vZGUgJiYgIXByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24sXG4gIFJFUVVFU1RfQVRURU1QVF9MSU1JVDogNSxcbiAgUkVRVUVTVF9CQVRDSF9TSVpFOiAyMCxcbiAgUkVRVUVTVF9IRUFERVJTOiB7fSxcbiAgU0VSVkVSX1VSTDogJ2h0dHBzOi8vYXBpLnBhcnNlLmNvbS8xJyxcbiAgU0VSVkVSX0FVVEhfVFlQRTogbnVsbCxcbiAgU0VSVkVSX0FVVEhfVE9LRU46IG51bGwsXG4gIExJVkVRVUVSWV9TRVJWRVJfVVJMOiBudWxsLFxuICBFTkNSWVBURURfS0VZOiBudWxsLFxuICBWRVJTSU9OOiAnanMnICsgXCI1LjMuMFwiLFxuICBBUFBMSUNBVElPTl9JRDogbnVsbCxcbiAgSkFWQVNDUklQVF9LRVk6IG51bGwsXG4gIE1BU1RFUl9LRVk6IG51bGwsXG4gIFVTRV9NQVNURVJfS0VZOiBmYWxzZSxcbiAgUEVSRk9STV9VU0VSX1JFV1JJVEU6IHRydWUsXG4gIEZPUkNFX1JFVk9DQUJMRV9TRVNTSU9OOiBmYWxzZSxcbiAgRU5DUllQVEVEX1VTRVI6IGZhbHNlLFxuICBJREVNUE9URU5DWTogZmFsc2UsXG4gIEFMTE9XX0NVU1RPTV9PQkpFQ1RfSUQ6IGZhbHNlLFxuICBQQVJTRV9FUlJPUlM6IFtdXG59O1xuZnVuY3Rpb24gcmVxdWlyZU1ldGhvZHMobmFtZSwgbWV0aG9kcywgY29udHJvbGxlcikge1xuICAoMCwgX2ZvckVhY2guZGVmYXVsdCkobWV0aG9kcykuY2FsbChtZXRob2RzLCBmdW5jID0+IHtcbiAgICBpZiAodHlwZW9mIGNvbnRyb2xsZXJbZnVuY10gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lfSBtdXN0IGltcGxlbWVudCAke2Z1bmN9KClgKTtcbiAgICB9XG4gIH0pO1xufVxuY29uc3QgQ29yZU1hbmFnZXIgPSB7XG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChjb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGNvbmZpZ1trZXldO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZ3VyYXRpb24ga2V5IG5vdCBmb3VuZDogJyArIGtleSk7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBjb25maWdba2V5XSA9IHZhbHVlO1xuICB9LFxuICBzZXRJZk5lZWRlZDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIWNvbmZpZy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb25maWdba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnW2tleV07XG4gIH0sXG4gIC8qIFNwZWNpYWxpemVkIENvbnRyb2xsZXIgU2V0dGVycy9HZXR0ZXJzICovXG5cbiAgc2V0QW5hbHl0aWNzQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0FuYWx5dGljc0NvbnRyb2xsZXInLCBbJ3RyYWNrJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snQW5hbHl0aWNzQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0QW5hbHl0aWNzQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydBbmFseXRpY3NDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldENsb3VkQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0Nsb3VkQ29udHJvbGxlcicsIFsncnVuJywgJ2dldEpvYnNEYXRhJywgJ3N0YXJ0Sm9iJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snQ2xvdWRDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRDbG91ZENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snQ2xvdWRDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldENvbmZpZ0NvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdDb25maWdDb250cm9sbGVyJywgWydjdXJyZW50JywgJ2dldCcsICdzYXZlJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snQ29uZmlnQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0Q29uZmlnQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydDb25maWdDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldENyeXB0b0NvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdDcnlwdG9Db250cm9sbGVyJywgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydDcnlwdG9Db250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRDcnlwdG9Db250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0NyeXB0b0NvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0RXZlbnRFbWl0dGVyKGV2ZW50RW1pdHRlcikge1xuICAgIGNvbmZpZ1snRXZlbnRFbWl0dGVyJ10gPSBldmVudEVtaXR0ZXI7XG4gIH0sXG4gIGdldEV2ZW50RW1pdHRlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydFdmVudEVtaXR0ZXInXTtcbiAgfSxcbiAgc2V0RmlsZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdGaWxlQ29udHJvbGxlcicsIFsnc2F2ZUZpbGUnLCAnc2F2ZUJhc2U2NCddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0ZpbGVDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBzZXRFdmVudHVhbGx5UXVldWUoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdFdmVudHVhbGx5UXVldWUnLCBbJ3BvbGwnLCAnc2F2ZScsICdkZXN0cm95J10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snRXZlbnR1YWxseVF1ZXVlJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRFdmVudHVhbGx5UXVldWUoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snRXZlbnR1YWxseVF1ZXVlJ107XG4gIH0sXG4gIGdldEZpbGVDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0ZpbGVDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdJbnN0YWxsYXRpb25Db250cm9sbGVyJywgWydjdXJyZW50SW5zdGFsbGF0aW9uSWQnLCAnY3VycmVudEluc3RhbGxhdGlvbicsICd1cGRhdGVJbnN0YWxsYXRpb25PbkRpc2snXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydJbnN0YWxsYXRpb25Db250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0luc3RhbGxhdGlvbkNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0TGl2ZVF1ZXJ5KGxpdmVRdWVyeSkge1xuICAgIGNvbmZpZ1snTGl2ZVF1ZXJ5J10gPSBsaXZlUXVlcnk7XG4gIH0sXG4gIGdldExpdmVRdWVyeSgpIHtcbiAgICByZXR1cm4gY29uZmlnWydMaXZlUXVlcnknXTtcbiAgfSxcbiAgc2V0T2JqZWN0Q29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ09iamVjdENvbnRyb2xsZXInLCBbJ3NhdmUnLCAnZmV0Y2gnLCAnZGVzdHJveSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ09iamVjdENvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldE9iamVjdENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snT2JqZWN0Q29udHJvbGxlciddO1xuICB9LFxuICBzZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdPYmplY3RTdGF0ZUNvbnRyb2xsZXInLCBbJ2dldFN0YXRlJywgJ2luaXRpYWxpemVTdGF0ZScsICdyZW1vdmVTdGF0ZScsICdnZXRTZXJ2ZXJEYXRhJywgJ3NldFNlcnZlckRhdGEnLCAnZ2V0UGVuZGluZ09wcycsICdzZXRQZW5kaW5nT3AnLCAncHVzaFBlbmRpbmdTdGF0ZScsICdwb3BQZW5kaW5nU3RhdGUnLCAnbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZScsICdnZXRPYmplY3RDYWNoZScsICdlc3RpbWF0ZUF0dHJpYnV0ZScsICdlc3RpbWF0ZUF0dHJpYnV0ZXMnLCAnY29tbWl0U2VydmVyQ2hhbmdlcycsICdlbnF1ZXVlVGFzaycsICdjbGVhckFsbFN0YXRlJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snT2JqZWN0U3RhdGVDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snT2JqZWN0U3RhdGVDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldFB1c2hDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnUHVzaENvbnRyb2xsZXInLCBbJ3NlbmQnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydQdXNoQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0UHVzaENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUHVzaENvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0UXVlcnlDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnUXVlcnlDb250cm9sbGVyJywgWydmaW5kJywgJ2FnZ3JlZ2F0ZSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ1F1ZXJ5Q29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0UXVlcnlDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1F1ZXJ5Q29udHJvbGxlciddO1xuICB9LFxuICBzZXRSRVNUQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1JFU1RDb250cm9sbGVyJywgWydyZXF1ZXN0JywgJ2FqYXgnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydSRVNUQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0UkVTVENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUkVTVENvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0U2NoZW1hQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1NjaGVtYUNvbnRyb2xsZXInLCBbJ2dldCcsICdjcmVhdGUnLCAndXBkYXRlJywgJ2RlbGV0ZScsICdzZW5kJywgJ3B1cmdlJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snU2NoZW1hQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0U2NoZW1hQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydTY2hlbWFDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldFNlc3Npb25Db250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnU2Vzc2lvbkNvbnRyb2xsZXInLCBbJ2dldFNlc3Npb24nXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydTZXNzaW9uQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0U2Vzc2lvbkNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snU2Vzc2lvbkNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0U3RvcmFnZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jKSB7XG4gICAgICByZXF1aXJlTWV0aG9kcygnQW4gYXN5bmMgU3RvcmFnZUNvbnRyb2xsZXInLCBbJ2dldEl0ZW1Bc3luYycsICdzZXRJdGVtQXN5bmMnLCAncmVtb3ZlSXRlbUFzeW5jJywgJ2dldEFsbEtleXNBc3luYyddLCBjb250cm9sbGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWlyZU1ldGhvZHMoJ0Egc3luY2hyb25vdXMgU3RvcmFnZUNvbnRyb2xsZXInLCBbJ2dldEl0ZW0nLCAnc2V0SXRlbScsICdyZW1vdmVJdGVtJywgJ2dldEFsbEtleXMnXSwgY29udHJvbGxlcik7XG4gICAgfVxuICAgIGNvbmZpZ1snU3RvcmFnZUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIHNldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlcicsIFsncGluV2l0aE5hbWUnLCAnZnJvbVBpbldpdGhOYW1lJywgJ3VuUGluV2l0aE5hbWUnLCAnZ2V0QWxsQ29udGVudHMnLCAnY2xlYXInXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0TG9jYWxEYXRhc3RvcmUoc3RvcmUpIHtcbiAgICBjb25maWdbJ0xvY2FsRGF0YXN0b3JlJ10gPSBzdG9yZTtcbiAgfSxcbiAgZ2V0TG9jYWxEYXRhc3RvcmUoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snTG9jYWxEYXRhc3RvcmUnXTtcbiAgfSxcbiAgZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snU3RvcmFnZUNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0QXN5bmNTdG9yYWdlKHN0b3JhZ2UpIHtcbiAgICBjb25maWdbJ0FzeW5jU3RvcmFnZSddID0gc3RvcmFnZTtcbiAgfSxcbiAgZ2V0QXN5bmNTdG9yYWdlKCkge1xuICAgIHJldHVybiBjb25maWdbJ0FzeW5jU3RvcmFnZSddO1xuICB9LFxuICBzZXRXZWJTb2NrZXRDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICBjb25maWdbJ1dlYlNvY2tldENvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFdlYlNvY2tldENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snV2ViU29ja2V0Q29udHJvbGxlciddO1xuICB9LFxuICBzZXRVc2VyQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1VzZXJDb250cm9sbGVyJywgWydzZXRDdXJyZW50VXNlcicsICdjdXJyZW50VXNlcicsICdjdXJyZW50VXNlckFzeW5jJywgJ3NpZ25VcCcsICdsb2dJbicsICdiZWNvbWUnLCAnbG9nT3V0JywgJ21lJywgJ3JlcXVlc3RQYXNzd29yZFJlc2V0JywgJ3VwZ3JhZGVUb1Jldm9jYWJsZVNlc3Npb24nLCAncmVxdWVzdEVtYWlsVmVyaWZpY2F0aW9uJywgJ3ZlcmlmeVBhc3N3b3JkJywgJ2xpbmtXaXRoJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snVXNlckNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFVzZXJDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1VzZXJDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldExpdmVRdWVyeUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdMaXZlUXVlcnlDb250cm9sbGVyJywgWydzZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50JywgJ2dldERlZmF1bHRMaXZlUXVlcnlDbGllbnQnLCAnX2NsZWFyQ2FjaGVkRGVmYXVsdENsaWVudCddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0xpdmVRdWVyeUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldExpdmVRdWVyeUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snTGl2ZVF1ZXJ5Q29udHJvbGxlciddO1xuICB9LFxuICBzZXRIb29rc0NvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdIb29rc0NvbnRyb2xsZXInLCBbJ2NyZWF0ZScsICdnZXQnLCAndXBkYXRlJywgJ3JlbW92ZSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0hvb2tzQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0SG9va3NDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0hvb2tzQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRQYXJzZU9wKG9wKSB7XG4gICAgY29uZmlnWydQYXJzZU9wJ10gPSBvcDtcbiAgfSxcbiAgZ2V0UGFyc2VPcCgpIHtcbiAgICByZXR1cm4gY29uZmlnWydQYXJzZU9wJ107XG4gIH0sXG4gIHNldFBhcnNlT2JqZWN0KG9iamVjdCkge1xuICAgIGNvbmZpZ1snUGFyc2VPYmplY3QnXSA9IG9iamVjdDtcbiAgfSxcbiAgZ2V0UGFyc2VPYmplY3QoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUGFyc2VPYmplY3QnXTtcbiAgfSxcbiAgc2V0UGFyc2VRdWVyeShxdWVyeSkge1xuICAgIGNvbmZpZ1snUGFyc2VRdWVyeSddID0gcXVlcnk7XG4gIH0sXG4gIGdldFBhcnNlUXVlcnkoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUGFyc2VRdWVyeSddO1xuICB9LFxuICBzZXRQYXJzZVJvbGUocm9sZSkge1xuICAgIGNvbmZpZ1snUGFyc2VSb2xlJ10gPSByb2xlO1xuICB9LFxuICBnZXRQYXJzZVJvbGUoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUGFyc2VSb2xlJ107XG4gIH0sXG4gIHNldFBhcnNlVXNlcih1c2VyKSB7XG4gICAgY29uZmlnWydQYXJzZVVzZXInXSA9IHVzZXI7XG4gIH0sXG4gIGdldFBhcnNlVXNlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydQYXJzZVVzZXInXTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gQ29yZU1hbmFnZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBDb3JlTWFuYWdlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbmxldCBBRVM7XG5sZXQgRU5DO1xuQUVTID0gcmVxdWlyZSgnY3J5cHRvLWpzL2FlcycpO1xuRU5DID0gcmVxdWlyZSgnY3J5cHRvLWpzL2VuYy11dGY4Jyk7XG5jb25zdCBDcnlwdG9Db250cm9sbGVyID0ge1xuICBlbmNyeXB0KG9iaiwgc2VjcmV0S2V5KSB7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gQUVTLmVuY3J5cHQoKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkob2JqKSwgc2VjcmV0S2V5KTtcbiAgICByZXR1cm4gZW5jcnlwdGVkLnRvU3RyaW5nKCk7XG4gIH0sXG4gIGRlY3J5cHQoZW5jcnlwdGVkVGV4dCwgc2VjcmV0S2V5KSB7XG4gICAgY29uc3QgZGVjcnlwdGVkU3RyID0gQUVTLmRlY3J5cHQoZW5jcnlwdGVkVGV4dCwgc2VjcmV0S2V5KS50b1N0cmluZyhFTkMpO1xuICAgIHJldHVybiBkZWNyeXB0ZWRTdHI7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IENyeXB0b0NvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBDcnlwdG9Db250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbi8qKlxuICogVGhpcyBpcyBhIHNpbXBsZSB3cmFwcGVyIHRvIHVuaWZ5IEV2ZW50RW1pdHRlciBpbXBsZW1lbnRhdGlvbnMgYWNyb3NzIHBsYXRmb3Jtcy5cbiAqL1xuXG5sZXQgRXZlbnRFbWl0dGVyO1xudHJ5IHtcbiAgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xufSBjYXRjaCAoXykge1xuICAvLyBFdmVudEVtaXR0ZXIgdW5hdmFpbGFibGVcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gRXZlbnRFbWl0dGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9zcGxpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NwbGljZVwiKSk7XG52YXIgX2ZpbmRJbmRleCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZC1pbmRleFwiKSk7XG52YXIgX3NldEludGVydmFsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvc2V0LWludGVydmFsXCIpKTtcbnZhciBfZmluZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xudmFyIF9QYXJzZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVF1ZXJ5XCIpKTtcbnZhciBfU3RvcmFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZVwiKSk7XG5jb25zdCBRVUVVRV9LRVkgPSAnUGFyc2UvRXZlbnR1YWxseS9RdWV1ZSc7XG5sZXQgcXVldWVDYWNoZSA9IFtdO1xubGV0IGRpcnR5Q2FjaGUgPSB0cnVlO1xubGV0IHBvbGxpbmcgPSB1bmRlZmluZWQ7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgdG8gcXVldWUgb2JqZWN0cyB0aGF0IHdpbGwgYmVcbiAqIHNhdmVkIHRvIHRoZSBzZXJ2ZXIgYXQgYSBsYXRlciBkYXRlLlxuICpcbiAqIEBjbGFzcyBQYXJzZS5FdmVudHVhbGx5UXVldWVcbiAqIEBzdGF0aWNcbiAqL1xuY29uc3QgRXZlbnR1YWxseVF1ZXVlID0ge1xuICAvKipcbiAgICogQWRkIG9iamVjdCB0byBxdWV1ZSB3aXRoIHNhdmUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gc2F2ZVxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuc2F2ZVxuICAgKiBAcGFyYW0ge1BhcnNlT2JqZWN0fSBvYmplY3QgUGFyc2UuT2JqZWN0IHRvIGJlIHNhdmVkIGV2ZW50dWFsbHlcbiAgICogQHBhcmFtIHtvYmplY3R9IFtzZXJ2ZXJPcHRpb25zXSBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuT2JqZWN0Lmh0bWwjc2F2ZSBQYXJzZS5PYmplY3Quc2F2ZX0gb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBpZiBvYmplY3QgaXMgYWRkZWQgdG8gcXVldWUuXG4gICAqIEBzdGF0aWNcbiAgICogQHNlZSBQYXJzZS5PYmplY3Qjc2F2ZUV2ZW50dWFsbHlcbiAgICovXG4gIHNhdmUob2JqZWN0KSB7XG4gICAgbGV0IHNlcnZlck9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHJldHVybiB0aGlzLmVucXVldWUoJ3NhdmUnLCBvYmplY3QsIHNlcnZlck9wdGlvbnMpO1xuICB9LFxuICAvKipcbiAgICogQWRkIG9iamVjdCB0byBxdWV1ZSB3aXRoIHNhdmUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gZGVzdHJveVxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuZGVzdHJveVxuICAgKiBAcGFyYW0ge1BhcnNlT2JqZWN0fSBvYmplY3QgUGFyc2UuT2JqZWN0IHRvIGJlIGRlc3Ryb3llZCBldmVudHVhbGx5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbc2VydmVyT3B0aW9uc10gU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLk9iamVjdC5odG1sI2Rlc3Ryb3kgUGFyc2UuT2JqZWN0LmRlc3Ryb3l9IG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBpZiBvYmplY3QgaXMgYWRkZWQgdG8gcXVldWUuXG4gICAqIEBzdGF0aWNcbiAgICogQHNlZSBQYXJzZS5PYmplY3QjZGVzdHJveUV2ZW50dWFsbHlcbiAgICovXG4gIGRlc3Ryb3kob2JqZWN0KSB7XG4gICAgbGV0IHNlcnZlck9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHJldHVybiB0aGlzLmVucXVldWUoJ2Rlc3Ryb3knLCBvYmplY3QsIHNlcnZlck9wdGlvbnMpO1xuICB9LFxuICAvKipcbiAgICogR2VuZXJhdGUgdW5pcXVlIGlkZW50aWZpZXIgdG8gYXZvaWQgZHVwbGljYXRlcyBhbmQgbWFpbnRhaW4gcHJldmlvdXMgc3RhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gc2F2ZSAvIGRlc3Ryb3lcbiAgICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCBQYXJzZS5PYmplY3QgdG8gYmUgcXVldWVkXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZ2VuZXJhdGVRdWV1ZUlkKGFjdGlvbiwgb2JqZWN0KSB7XG4gICAgb2JqZWN0Ll9nZXRJZCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGlkLFxuICAgICAgX2xvY2FsSWRcbiAgICB9ID0gb2JqZWN0O1xuICAgIGNvbnN0IHVuaXF1ZUlkID0gb2JqZWN0LmdldCgnaGFzaCcpIHx8IF9sb2NhbElkO1xuICAgIHJldHVybiBbYWN0aW9uLCBjbGFzc05hbWUsIGlkLCB1bmlxdWVJZF0uam9pbignXycpO1xuICB9LFxuICAvKipcbiAgICogQnVpbGQgcXVldWUgb2JqZWN0IGFuZCBhZGQgdG8gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gc2F2ZSAvIGRlc3Ryb3lcbiAgICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCBQYXJzZS5PYmplY3QgdG8gYmUgcXVldWVkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbc2VydmVyT3B0aW9uc11cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBpZiBvYmplY3QgaXMgYWRkZWQgdG8gcXVldWUuXG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgYXN5bmMgZW5xdWV1ZShhY3Rpb24sIG9iamVjdCwgc2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHF1ZXVlRGF0YSA9IGF3YWl0IHRoaXMuZ2V0UXVldWUoKTtcbiAgICBjb25zdCBxdWV1ZUlkID0gdGhpcy5nZW5lcmF0ZVF1ZXVlSWQoYWN0aW9uLCBvYmplY3QpO1xuICAgIGxldCBpbmRleCA9IHRoaXMucXVldWVJdGVtRXhpc3RzKHF1ZXVlRGF0YSwgcXVldWVJZCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIC8vIEFkZCBjYWNoZWQgdmFsdWVzIHRvIG5ldyBvYmplY3QgaWYgdGhleSBkb24ndCBleGlzdFxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIHF1ZXVlRGF0YVtpbmRleF0ub2JqZWN0KSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0LmdldChwcm9wKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBvYmplY3Quc2V0KHByb3AsIHF1ZXVlRGF0YVtpbmRleF0ub2JqZWN0W3Byb3BdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCA9IHF1ZXVlRGF0YS5sZW5ndGg7XG4gICAgfVxuICAgIHF1ZXVlRGF0YVtpbmRleF0gPSB7XG4gICAgICBxdWV1ZUlkLFxuICAgICAgYWN0aW9uLFxuICAgICAgb2JqZWN0OiBvYmplY3QudG9KU09OKCksXG4gICAgICBzZXJ2ZXJPcHRpb25zLFxuICAgICAgaWQ6IG9iamVjdC5pZCxcbiAgICAgIGNsYXNzTmFtZTogb2JqZWN0LmNsYXNzTmFtZSxcbiAgICAgIGhhc2g6IG9iamVjdC5nZXQoJ2hhc2gnKSxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2V0UXVldWUocXVldWVEYXRhKTtcbiAgfSxcbiAgc3RvcmUoZGF0YSkge1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhRVUVVRV9LRVksICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKGRhdGEpKTtcbiAgfSxcbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMoUVVFVUVfS0VZKTtcbiAgfSxcbiAgLyoqXG4gICAqIFNldHMgdGhlIGluLW1lbW9yeSBxdWV1ZSBmcm9tIGxvY2FsIHN0b3JhZ2UgYW5kIHJldHVybnMuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRRdWV1ZVxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuZ2V0UXVldWVcbiAgICogQHJldHVybnMge1Byb21pc2U8UXVldWVPYmplY3RbXT59XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGFzeW5jIGdldFF1ZXVlKCkge1xuICAgIGlmIChkaXJ0eUNhY2hlKSB7XG4gICAgICBxdWV1ZUNhY2hlID0gSlNPTi5wYXJzZSgoYXdhaXQgdGhpcy5sb2FkKCkpIHx8ICdbXScpO1xuICAgICAgZGlydHlDYWNoZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcXVldWVDYWNoZTtcbiAgfSxcbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBxdWV1ZSB0byBsb2NhbCBzdG9yYWdlXG4gICAqXG4gICAqIEBwYXJhbSB7UXVldWV9IHF1ZXVlIFF1ZXVlIGNvbnRhaW5pbmcgUGFyc2UuT2JqZWN0IGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiBxdWV1ZSBpcyBzdG9yZWQuXG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc2V0UXVldWUocXVldWUpIHtcbiAgICBxdWV1ZUNhY2hlID0gcXVldWU7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUocXVldWVDYWNoZSk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmVzIFBhcnNlLk9iamVjdCBkYXRhIGZyb20gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWV1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBQYXJzZS5PYmplY3QgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHF1ZXVlIGlzIHN0b3JlZC5cbiAgICogQHN0YXRpY1xuICAgKiBAaWdub3JlXG4gICAqL1xuICBhc3luYyByZW1vdmUocXVldWVJZCkge1xuICAgIGNvbnN0IHF1ZXVlRGF0YSA9IGF3YWl0IHRoaXMuZ2V0UXVldWUoKTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucXVldWVJdGVtRXhpc3RzKHF1ZXVlRGF0YSwgcXVldWVJZCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICgwLCBfc3BsaWNlLmRlZmF1bHQpKHF1ZXVlRGF0YSkuY2FsbChxdWV1ZURhdGEsIGluZGV4LCAxKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0UXVldWUocXVldWVEYXRhKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBvYmplY3RzIGZyb20gcXVldWUuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBjbGVhclxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuY2xlYXJcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHF1ZXVlIGlzIGNsZWFyZWQuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGNsZWFyKCkge1xuICAgIHF1ZXVlQ2FjaGUgPSBbXTtcbiAgICByZXR1cm4gdGhpcy5zdG9yZShbXSk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIGEgcXVldWVJZCBpbiB0aGUgcXVldWUuIFJldHVybnMgLTEgaWYgbm90IGZvdW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge1F1ZXVlfSBxdWV1ZSBRdWV1ZSBjb250YWluaW5nIFBhcnNlLk9iamVjdCBkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVldWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgUGFyc2UuT2JqZWN0IGRhdGEuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcXVldWVJdGVtRXhpc3RzKHF1ZXVlLCBxdWV1ZUlkKSB7XG4gICAgcmV0dXJuICgwLCBfZmluZEluZGV4LmRlZmF1bHQpKHF1ZXVlKS5jYWxsKHF1ZXVlLCBkYXRhID0+IGRhdGEucXVldWVJZCA9PT0gcXVldWVJZCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBxdWV1ZS5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGxlbmd0aFxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUubGVuZ3RoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGFzeW5jIGxlbmd0aCgpIHtcbiAgICBjb25zdCBxdWV1ZURhdGEgPSBhd2FpdCB0aGlzLmdldFF1ZXVlKCk7XG4gICAgcmV0dXJuIHF1ZXVlRGF0YS5sZW5ndGg7XG4gIH0sXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgcXVldWUgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQGZ1bmN0aW9uIHNlbmRRdWV1ZVxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuc2VuZFF1ZXVlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBSZXR1cm5zIHRydWUgaWYgcXVldWUgd2FzIHNlbnQgc3VjY2Vzc2Z1bGx5LlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBhc3luYyBzZW5kUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSBhd2FpdCB0aGlzLmdldFF1ZXVlKCk7XG4gICAgY29uc3QgcXVldWVEYXRhID0gWy4uLnF1ZXVlXTtcbiAgICBpZiAocXVldWVEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlRGF0YS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgcXVldWVPYmplY3QgPSBxdWV1ZURhdGFbaV07XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlkLFxuICAgICAgICBoYXNoLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgIH0gPSBxdWV1ZU9iamVjdDtcbiAgICAgIGNvbnN0IE9iamVjdFR5cGUgPSBfUGFyc2VPYmplY3QuZGVmYXVsdC5leHRlbmQoY2xhc3NOYW1lKTtcbiAgICAgIGlmIChpZCkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3MuYnlJZChPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCk7XG4gICAgICB9IGVsc2UgaWYgKGhhc2gpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzLmJ5SGFzaChPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3MuY3JlYXRlKE9iamVjdFR5cGUsIHF1ZXVlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8qKlxuICAgKiBCdWlsZCBxdWV1ZSBvYmplY3QgYW5kIGFkZCB0byBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZU9iamVjdH0gb2JqZWN0IFBhcnNlLk9iamVjdCB0byBiZSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtRdWV1ZU9iamVjdH0gcXVldWVPYmplY3QgUGFyc2UuT2JqZWN0IGRhdGEgZnJvbSB0aGUgcXVldWVcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuXG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgYXN5bmMgc2VuZFF1ZXVlQ2FsbGJhY2sob2JqZWN0LCBxdWV1ZU9iamVjdCkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmUocXVldWVPYmplY3QucXVldWVJZCk7XG4gICAgfVxuICAgIHN3aXRjaCAocXVldWVPYmplY3QuYWN0aW9uKSB7XG4gICAgICBjYXNlICdzYXZlJzpcbiAgICAgICAgLy8gUXVldWVkIHVwZGF0ZSB3YXMgb3ZlcndyaXR0ZW4gYnkgb3RoZXIgcmVxdWVzdC4gRG8gbm90IHNhdmVcbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QudXBkYXRlZEF0ICE9PSAndW5kZWZpbmVkJyAmJiBvYmplY3QudXBkYXRlZEF0ID4gbmV3IERhdGUocXVldWVPYmplY3Qub2JqZWN0LmNyZWF0ZWRBdCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmUocXVldWVPYmplY3QucXVldWVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvYmplY3Quc2F2ZShxdWV1ZU9iamVjdC5vYmplY3QsIHF1ZXVlT2JqZWN0LnNlcnZlck9wdGlvbnMpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlKHF1ZXVlT2JqZWN0LnF1ZXVlSWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUuY29kZSAhPT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5DT05ORUNUSU9OX0ZBSUxFRCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUocXVldWVPYmplY3QucXVldWVJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGVzdHJveSc6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb2JqZWN0LmRlc3Ryb3kocXVldWVPYmplY3Quc2VydmVyT3B0aW9ucyk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUocXVldWVPYmplY3QucXVldWVJZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZS5jb2RlICE9PSBfUGFyc2VFcnJvci5kZWZhdWx0LkNPTk5FQ1RJT05fRkFJTEVEKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZShxdWV1ZU9iamVjdC5xdWV1ZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogU3RhcnQgcG9sbGluZyBzZXJ2ZXIgZm9yIG5ldHdvcmsgY29ubmVjdGlvbi5cbiAgICogV2lsbCBzZW5kIHF1ZXVlIGlmIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBwb2xsXG4gICAqIEBuYW1lIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZS5wb2xsXG4gICAqIEBwYXJhbSBbbXNdIE1pbGxpc2Vjb25kcyB0byBwaW5nIHRoZSBzZXJ2ZXIuIERlZmF1bHQgMjAwMG1zXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHBvbGwoKSB7XG4gICAgbGV0IG1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAyMDAwO1xuICAgIGlmIChwb2xsaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBvbGxpbmcgPSAoMCwgX3NldEludGVydmFsMi5kZWZhdWx0KSgoKSA9PiB7XG4gICAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgICBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAnaGVhbHRoJykudGhlbihfcmVmID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBzdGF0dXNcbiAgICAgICAgfSA9IF9yZWY7XG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdvaycpIHtcbiAgICAgICAgICB0aGlzLnN0b3BQb2xsKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKGUgPT4gZSk7XG4gICAgfSwgbXMpO1xuICB9LFxuICAvKipcbiAgICogVHVybnMgb2ZmIHBvbGxpbmcuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBzdG9wUG9sbFxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuc3RvcFBvbGxcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RvcFBvbGwoKSB7XG4gICAgY2xlYXJJbnRlcnZhbChwb2xsaW5nKTtcbiAgICBwb2xsaW5nID0gdW5kZWZpbmVkO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgcGluZ2luZyB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gaXNQb2xsaW5nXG4gICAqIEBuYW1lIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZS5pc1BvbGxpbmdcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGlzUG9sbGluZygpIHtcbiAgICByZXR1cm4gISFwb2xsaW5nO1xuICB9LFxuICBfc2V0UG9sbGluZyhmbGFnKSB7XG4gICAgcG9sbGluZyA9IGZsYWc7XG4gIH0sXG4gIHByb2Nlc3M6IHtcbiAgICBjcmVhdGUoT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpIHtcbiAgICAgIGNvbnN0IG9iamVjdCA9IG5ldyBPYmplY3RUeXBlKCk7XG4gICAgICByZXR1cm4gRXZlbnR1YWxseVF1ZXVlLnNlbmRRdWV1ZUNhbGxiYWNrKG9iamVjdCwgcXVldWVPYmplY3QpO1xuICAgIH0sXG4gICAgYXN5bmMgYnlJZChPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzZXNzaW9uVG9rZW5cbiAgICAgIH0gPSBxdWV1ZU9iamVjdC5zZXJ2ZXJPcHRpb25zO1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgX1BhcnNlUXVlcnkuZGVmYXVsdChPYmplY3RUeXBlKTtcbiAgICAgIHF1ZXJ5LmVxdWFsVG8oJ29iamVjdElkJywgcXVldWVPYmplY3QuaWQpO1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0ICgwLCBfZmluZC5kZWZhdWx0KShxdWVyeSkuY2FsbChxdWVyeSwge1xuICAgICAgICBzZXNzaW9uVG9rZW5cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIEV2ZW50dWFsbHlRdWV1ZS5zZW5kUXVldWVDYWxsYmFjayhyZXN1bHRzWzBdLCBxdWV1ZU9iamVjdCk7XG4gICAgfSxcbiAgICBhc3luYyBieUhhc2goT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2Vzc2lvblRva2VuXG4gICAgICB9ID0gcXVldWVPYmplY3Quc2VydmVyT3B0aW9ucztcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IF9QYXJzZVF1ZXJ5LmRlZmF1bHQoT2JqZWN0VHlwZSk7XG4gICAgICBxdWVyeS5lcXVhbFRvKCdoYXNoJywgcXVldWVPYmplY3QuaGFzaCk7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgKDAsIF9maW5kLmRlZmF1bHQpKHF1ZXJ5KS5jYWxsKHF1ZXJ5LCB7XG4gICAgICAgIHNlc3Npb25Ub2tlblxuICAgICAgfSk7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBFdmVudHVhbGx5UXVldWUuc2VuZFF1ZXVlQ2FsbGJhY2socmVzdWx0c1swXSwgcXVldWVPYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEV2ZW50dWFsbHlRdWV1ZS5wcm9jZXNzLmNyZWF0ZShPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCk7XG4gICAgfVxuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBFdmVudHVhbGx5UXVldWU7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBFdmVudHVhbGx5UXVldWU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfUGFyc2VVc2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVVzZXJcIikpO1xuLyogZ2xvYmFsIEZCICovXG5cbmxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xubGV0IHJlcXVlc3RlZFBlcm1pc3Npb25zO1xubGV0IGluaXRPcHRpb25zO1xuY29uc3QgcHJvdmlkZXIgPSB7XG4gIGF1dGhlbnRpY2F0ZShvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBGQiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuZXJyb3IodGhpcywgJ0ZhY2Vib29rIFNESyBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIEZCLmxvZ2luKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5hdXRoUmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3VjY2Vzcykge1xuICAgICAgICAgIG9wdGlvbnMuc3VjY2Vzcyh0aGlzLCB7XG4gICAgICAgICAgICBpZDogcmVzcG9uc2UuYXV0aFJlc3BvbnNlLnVzZXJJRCxcbiAgICAgICAgICAgIGFjY2Vzc190b2tlbjogcmVzcG9uc2UuYXV0aFJlc3BvbnNlLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgZXhwaXJhdGlvbl9kYXRlOiBuZXcgRGF0ZShyZXNwb25zZS5hdXRoUmVzcG9uc2UuZXhwaXJlc0luICogMTAwMCArIG5ldyBEYXRlKCkuZ2V0VGltZSgpKS50b0pTT04oKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3B0aW9ucy5lcnJvcikge1xuICAgICAgICAgIG9wdGlvbnMuZXJyb3IodGhpcywgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgc2NvcGU6IHJlcXVlc3RlZFBlcm1pc3Npb25zXG4gICAgfSk7XG4gIH0sXG4gIHJlc3RvcmVBdXRoZW50aWNhdGlvbihhdXRoRGF0YSkge1xuICAgIGlmIChhdXRoRGF0YSkge1xuICAgICAgY29uc3QgbmV3T3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKGluaXRPcHRpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGluaXRPcHRpb25zKSB7XG4gICAgICAgICAgbmV3T3B0aW9uc1trZXldID0gaW5pdE9wdGlvbnNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU3VwcHJlc3MgY2hlY2tzIGZvciBsb2dpbiBzdGF0dXMgZnJvbSB0aGUgYnJvd3Nlci5cbiAgICAgIG5ld09wdGlvbnMuc3RhdHVzID0gZmFsc2U7XG5cbiAgICAgIC8vIElmIHRoZSB1c2VyIGRvZXNuJ3QgbWF0Y2ggdGhlIG9uZSBrbm93biBieSB0aGUgRkIgU0RLLCBsb2cgb3V0LlxuICAgICAgLy8gTW9zdCBvZiB0aGUgdGltZSwgdGhlIHVzZXJzIHdpbGwgbWF0Y2ggLS0gaXQncyBvbmx5IGluIGNhc2VzIHdoZXJlXG4gICAgICAvLyB0aGUgRkIgU0RLIGtub3dzIG9mIGEgZGlmZmVyZW50IHVzZXIgdGhhbiB0aGUgb25lIGJlaW5nIHJlc3RvcmVkXG4gICAgICAvLyBmcm9tIGEgUGFyc2UgVXNlciB0aGF0IGxvZ2dlZCBpbiB3aXRoIHVzZXJuYW1lL3Bhc3N3b3JkLlxuICAgICAgY29uc3QgZXhpc3RpbmdSZXNwb25zZSA9IEZCLmdldEF1dGhSZXNwb25zZSgpO1xuICAgICAgaWYgKGV4aXN0aW5nUmVzcG9uc2UgJiYgZXhpc3RpbmdSZXNwb25zZS51c2VySUQgIT09IGF1dGhEYXRhLmlkKSB7XG4gICAgICAgIEZCLmxvZ291dCgpO1xuICAgICAgfVxuICAgICAgRkIuaW5pdChuZXdPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGdldEF1dGhUeXBlKCkge1xuICAgIHJldHVybiAnZmFjZWJvb2snO1xuICB9LFxuICBkZWF1dGhlbnRpY2F0ZSgpIHtcbiAgICB0aGlzLnJlc3RvcmVBdXRoZW50aWNhdGlvbihudWxsKTtcbiAgfVxufTtcblxuLyoqXG4gKiBQcm92aWRlcyBhIHNldCBvZiB1dGlsaXRpZXMgZm9yIHVzaW5nIFBhcnNlIHdpdGggRmFjZWJvb2suXG4gKlxuICogQGNsYXNzIFBhcnNlLkZhY2Vib29rVXRpbHNcbiAqIEBzdGF0aWNcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqL1xuY29uc3QgRmFjZWJvb2tVdGlscyA9IHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIFBhcnNlIEZhY2Vib29rIGludGVncmF0aW9uLiAgQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIHlvdVxuICAgKiBoYXZlIGxvYWRlZCB0aGUgRmFjZWJvb2sgSmF2YXNjcmlwdCBTREsgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzXG4gICAqIGFzIHlvdSB3b3VsZCBwYXNzIHRvPGNvZGU+XG4gICAqIDxhIGhyZWY9XG4gICAqIFwiaHR0cHM6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L0ZCLmluaXQvXCI+XG4gICAqIEZCLmluaXQoKTwvYT48L2NvZGU+LiAgUGFyc2UuRmFjZWJvb2tVdGlscyB3aWxsIGludm9rZSBGQi5pbml0KCkgZm9yIHlvdVxuICAgKiB3aXRoIHRoZXNlIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGluaXRcbiAgICogQG5hbWUgUGFyc2UuRmFjZWJvb2tVdGlscy5pbml0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIEZhY2Vib29rIG9wdGlvbnMgYXJndW1lbnQgYXMgZGVzY3JpYmVkIGhlcmU6XG4gICAqICAgPGEgaHJlZj1cbiAgICogICBcImh0dHBzOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9GQi5pbml0L1wiPlxuICAgKiAgIEZCLmluaXQoKTwvYT4uIFRoZSBzdGF0dXMgZmxhZyB3aWxsIGJlIGNvZXJjZWQgdG8gJ2ZhbHNlJyBiZWNhdXNlIGl0XG4gICAqICAgaW50ZXJmZXJlcyB3aXRoIFBhcnNlIEZhY2Vib29rIGludGVncmF0aW9uLiBDYWxsIEZCLmdldExvZ2luU3RhdHVzKClcbiAgICogICBleHBsaWNpdGx5IGlmIHRoaXMgYmVoYXZpb3IgaXMgcmVxdWlyZWQgYnkgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG4gIGluaXQob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgRkIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBGYWNlYm9vayBKYXZhU2NyaXB0IFNESyBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgY2FsbGluZyBpbml0LicpO1xuICAgIH1cbiAgICBpbml0T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgICAgIGluaXRPcHRpb25zW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbml0T3B0aW9ucy5zdGF0dXMgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCB3YXJuID0gY29uc29sZS53YXJuIHx8IGNvbnNvbGUubG9nIHx8IGZ1bmN0aW9uICgpIHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgIHdhcm4uY2FsbChjb25zb2xlLCAnVGhlIFwic3RhdHVzXCIgZmxhZyBwYXNzZWQgaW50bycgKyAnIEZCLmluaXQsIHdoZW4gc2V0IHRvIHRydWUsIGNhbiBpbnRlcmZlcmUgd2l0aCBQYXJzZSBGYWNlYm9vaycgKyAnIGludGVncmF0aW9uLCBzbyBpdCBoYXMgYmVlbiBzdXBwcmVzc2VkLiBQbGVhc2UgY2FsbCcgKyAnIEZCLmdldExvZ2luU3RhdHVzKCkgZXhwbGljaXRseSBpZiB5b3UgcmVxdWlyZSB0aGlzIGJlaGF2aW9yLicpO1xuICAgIH1cbiAgICBpbml0T3B0aW9ucy5zdGF0dXMgPSBmYWxzZTtcbiAgICBGQi5pbml0KGluaXRPcHRpb25zKTtcbiAgICBfUGFyc2VVc2VyLmRlZmF1bHQuX3JlZ2lzdGVyQXV0aGVudGljYXRpb25Qcm92aWRlcihwcm92aWRlcik7XG4gICAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9LFxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSB1c2VyIGhhcyB0aGVpciBhY2NvdW50IGxpbmtlZCB0byBGYWNlYm9vay5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGlzTGlua2VkXG4gICAqIEBuYW1lIFBhcnNlLkZhY2Vib29rVXRpbHMuaXNMaW5rZWRcbiAgICogQHBhcmFtIHtQYXJzZS5Vc2VyfSB1c2VyIFVzZXIgdG8gY2hlY2sgZm9yIGEgZmFjZWJvb2sgbGluay5cbiAgICogICAgIFRoZSB1c2VyIG11c3QgYmUgbG9nZ2VkIGluIG9uIHRoaXMgZGV2aWNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgaGFzIHRoZWlyIGFjY291bnRcbiAgICogICAgIGxpbmtlZCB0byBGYWNlYm9vay5cbiAgICovXG4gIGlzTGlua2VkKHVzZXIpIHtcbiAgICByZXR1cm4gdXNlci5faXNMaW5rZWQoJ2ZhY2Vib29rJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB1c2luZyBGYWNlYm9vay4gVGhpcyBtZXRob2QgZGVsZWdhdGVzIHRvIHRoZSBGYWNlYm9va1xuICAgKiBTREsgdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLCBhbmQgdGhlbiBhdXRvbWF0aWNhbGx5IGxvZ3MgaW4gKG9yXG4gICAqIGNyZWF0ZXMsIGluIHRoZSBjYXNlIHdoZXJlIGl0IGlzIGEgbmV3IHVzZXIpIGEgUGFyc2UuVXNlci5cbiAgICpcbiAgICogU3RhbmRhcmQgQVBJOlxuICAgKlxuICAgKiA8Y29kZT5sb2dJbihwZXJtaXNzaW9uOiBzdHJpbmcsIGF1dGhEYXRhOiBPYmplY3QpOzwvY29kZT5cbiAgICpcbiAgICogQWR2YW5jZWQgQVBJOiBVc2VkIGZvciBoYW5kbGluZyB5b3VyIG93biBvQXV0aCB0b2tlbnNcbiAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9yZXN0L2d1aWRlLyNsaW5raW5nLXVzZXJzfVxuICAgKlxuICAgKiA8Y29kZT5sb2dJbihhdXRoRGF0YTogT2JqZWN0LCBvcHRpb25zPzogT2JqZWN0KTs8L2NvZGU+XG4gICAqXG4gICAqIEBmdW5jdGlvbiBsb2dJblxuICAgKiBAbmFtZSBQYXJzZS5GYWNlYm9va1V0aWxzLmxvZ0luXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IG9iamVjdCl9IHBlcm1pc3Npb25zIFRoZSBwZXJtaXNzaW9ucyByZXF1aXJlZCBmb3IgRmFjZWJvb2tcbiAgICogICAgbG9nIGluLiAgVGhpcyBpcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcgb2YgcGVybWlzc2lvbnMuXG4gICAqICAgIEFsdGVybmF0aXZlbHksIHN1cHBseSBhIEZhY2Vib29rIGF1dGhEYXRhIG9iamVjdCBhcyBkZXNjcmliZWQgaW4gb3VyXG4gICAqICAgIFJFU1QgQVBJIGRvY3MgaWYgeW91IHdhbnQgdG8gaGFuZGxlIGdldHRpbmcgZmFjZWJvb2sgYXV0aCB0b2tlbnNcbiAgICogICAgeW91cnNlbGYuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE1hc3RlcktleSAvIFNlc3Npb25Ub2tlbi4gQWx0ZXJuYXRpdmVseSBjYW4gYmUgdXNlZCBmb3IgYXV0aERhdGEgaWYgcGVybWlzc2lvbnMgaXMgYSBzdHJpbmdcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBsb2dJbihwZXJtaXNzaW9ucywgb3B0aW9ucykge1xuICAgIGlmICghcGVybWlzc2lvbnMgfHwgdHlwZW9mIHBlcm1pc3Npb25zID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IGluaXRpYWxpemUgRmFjZWJvb2tVdGlscyBiZWZvcmUgY2FsbGluZyBsb2dJbi4nKTtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3RlZFBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7XG4gICAgICByZXR1cm4gX1BhcnNlVXNlci5kZWZhdWx0LmxvZ0luV2l0aCgnZmFjZWJvb2snLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIF9QYXJzZVVzZXIuZGVmYXVsdC5sb2dJbldpdGgoJ2ZhY2Vib29rJywge1xuICAgICAgYXV0aERhdGE6IHBlcm1pc3Npb25zXG4gICAgfSwgb3B0aW9ucyk7XG4gIH0sXG4gIC8qKlxuICAgKiBMaW5rcyBGYWNlYm9vayB0byBhbiBleGlzdGluZyBQRlVzZXIuIFRoaXMgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGVcbiAgICogRmFjZWJvb2sgU0RLIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciwgYW5kIHRoZW4gYXV0b21hdGljYWxseSBsaW5rc1xuICAgKiB0aGUgYWNjb3VudCB0byB0aGUgUGFyc2UuVXNlci5cbiAgICpcbiAgICogU3RhbmRhcmQgQVBJOlxuICAgKlxuICAgKiA8Y29kZT5saW5rKHVzZXI6IFBhcnNlLlVzZXIsIHBlcm1pc3Npb246IHN0cmluZywgYXV0aERhdGE/OiBPYmplY3QpOzwvY29kZT5cbiAgICpcbiAgICogQWR2YW5jZWQgQVBJOiBVc2VkIGZvciBoYW5kbGluZyB5b3VyIG93biBvQXV0aCB0b2tlbnNcbiAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9yZXN0L2d1aWRlLyNsaW5raW5nLXVzZXJzfVxuICAgKlxuICAgKiA8Y29kZT5saW5rKHVzZXI6IFBhcnNlLlVzZXIsIGF1dGhEYXRhOiBPYmplY3QsIG9wdGlvbnM/OiBGdWxsT3B0aW9ucyk7PC9jb2RlPlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbGlua1xuICAgKiBAbmFtZSBQYXJzZS5GYWNlYm9va1V0aWxzLmxpbmtcbiAgICogQHBhcmFtIHtQYXJzZS5Vc2VyfSB1c2VyIFVzZXIgdG8gbGluayB0byBGYWNlYm9vay4gVGhpcyBtdXN0IGJlIHRoZVxuICAgKiAgICAgY3VycmVudCB1c2VyLlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBvYmplY3QpfSBwZXJtaXNzaW9ucyBUaGUgcGVybWlzc2lvbnMgcmVxdWlyZWQgZm9yIEZhY2Vib29rXG4gICAqICAgIGxvZyBpbi4gIFRoaXMgaXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIG9mIHBlcm1pc3Npb25zLlxuICAgKiAgICBBbHRlcm5hdGl2ZWx5LCBzdXBwbHkgYSBGYWNlYm9vayBhdXRoRGF0YSBvYmplY3QgYXMgZGVzY3JpYmVkIGluIG91clxuICAgKiAgICBSRVNUIEFQSSBkb2NzIGlmIHlvdSB3YW50IHRvIGhhbmRsZSBnZXR0aW5nIGZhY2Vib29rIGF1dGggdG9rZW5zXG4gICAqICAgIHlvdXJzZWxmLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBNYXN0ZXJLZXkgLyBTZXNzaW9uVG9rZW4uIEFsdGVybmF0aXZlbHkgY2FuIGJlIHVzZWQgZm9yIGF1dGhEYXRhIGlmIHBlcm1pc3Npb25zIGlzIGEgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgbGluayh1c2VyLCBwZXJtaXNzaW9ucywgb3B0aW9ucykge1xuICAgIGlmICghcGVybWlzc2lvbnMgfHwgdHlwZW9mIHBlcm1pc3Npb25zID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IGluaXRpYWxpemUgRmFjZWJvb2tVdGlscyBiZWZvcmUgY2FsbGluZyBsaW5rLicpO1xuICAgICAgfVxuICAgICAgcmVxdWVzdGVkUGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICAgIHJldHVybiB1c2VyLmxpbmtXaXRoKCdmYWNlYm9vaycsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlci5saW5rV2l0aCgnZmFjZWJvb2snLCB7XG4gICAgICBhdXRoRGF0YTogcGVybWlzc2lvbnNcbiAgICB9LCBvcHRpb25zKTtcbiAgfSxcbiAgLyoqXG4gICAqIFVubGlua3MgdGhlIFBhcnNlLlVzZXIgZnJvbSBhIEZhY2Vib29rIGFjY291bnQuXG4gICAqXG4gICAqIEBmdW5jdGlvbiB1bmxpbmtcbiAgICogQG5hbWUgUGFyc2UuRmFjZWJvb2tVdGlscy51bmxpbmtcbiAgICogQHBhcmFtIHtQYXJzZS5Vc2VyfSB1c2VyIFVzZXIgdG8gdW5saW5rIGZyb20gRmFjZWJvb2suIFRoaXMgbXVzdCBiZSB0aGVcbiAgICogICAgIGN1cnJlbnQgdXNlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU3RhbmRhcmQgb3B0aW9ucyBvYmplY3Qgd2l0aCBzdWNjZXNzIGFuZCBlcnJvclxuICAgKiAgICBjYWxsYmFja3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgdW5saW5rOiBmdW5jdGlvbiAodXNlciwgb3B0aW9ucykge1xuICAgIGlmICghaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgaW5pdGlhbGl6ZSBGYWNlYm9va1V0aWxzIGJlZm9yZSBjYWxsaW5nIHVubGluay4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXIuX3VubGlua0Zyb20oJ2ZhY2Vib29rJywgb3B0aW9ucyk7XG4gIH0sXG4gIC8vIFVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgX2dldEF1dGhQcm92aWRlcigpIHtcbiAgICByZXR1cm4gcHJvdmlkZXI7XG4gIH1cbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBGYWNlYm9va1V0aWxzOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2tleXNJbnN0YW5jZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uva2V5c1wiKTtcbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pZGJLZXl2YWwgPSByZXF1aXJlKFwiaWRiLWtleXZhbFwiKTtcbi8qIGdsb2JhbCB3aW5kb3cgKi9cblxubGV0IEluZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyO1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5pbmRleGVkREIpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBQYXJzZVN0b3JlID0gKDAsIF9pZGJLZXl2YWwuY3JlYXRlU3RvcmUpKCdwYXJzZURCJywgJ3BhcnNlU3RvcmUnKTtcbiAgICBJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlciA9IHtcbiAgICAgIGFzeW5jOiAxLFxuICAgICAgZ2V0SXRlbUFzeW5jKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaWRiS2V5dmFsLmdldCkocGF0aCwgUGFyc2VTdG9yZSk7XG4gICAgICB9LFxuICAgICAgc2V0SXRlbUFzeW5jKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAoMCwgX2lkYktleXZhbC5zZXQpKHBhdGgsIHZhbHVlLCBQYXJzZVN0b3JlKTtcbiAgICAgIH0sXG4gICAgICByZW1vdmVJdGVtQXN5bmMocGF0aCkge1xuICAgICAgICByZXR1cm4gKDAsIF9pZGJLZXl2YWwuZGVsKShwYXRoLCBQYXJzZVN0b3JlKTtcbiAgICAgIH0sXG4gICAgICBnZXRBbGxLZXlzQXN5bmMoKSB7XG4gICAgICAgIHJldHVybiAoMCwgX2tleXNJbnN0YW5jZVByb3BlcnR5KF9pZGJLZXl2YWwpKShQYXJzZVN0b3JlKTtcbiAgICAgIH0sXG4gICAgICBjbGVhcigpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaWRiS2V5dmFsLmNsZWFyKShQYXJzZVN0b3JlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9IGNhdGNoIChfKSB7XG4gICAgLy8gSW5kZXhlZERCIG5vdCBhY2Nlc3NpYmxlXG4gICAgSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIgPSB1bmRlZmluZWQ7XG4gIH1cbn0gZWxzZSB7XG4gIC8vIEluZGV4ZWREQiBub3Qgc3VwcG9ydGVkXG4gIEluZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyID0gdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEluZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9TdG9yYWdlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlXCIpKTtcbnZhciBfUGFyc2VJbnN0YWxsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlSW5zdGFsbGF0aW9uXCIpKTtcbnZhciBfdXVpZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXVpZFwiKSk7XG5jb25zdCBDVVJSRU5UX0lOU1RBTExBVElPTl9LRVkgPSAnY3VycmVudEluc3RhbGxhdGlvbic7XG5jb25zdCBDVVJSRU5UX0lOU1RBTExBVElPTl9JRF9LRVkgPSAnY3VycmVudEluc3RhbGxhdGlvbklkJztcbmxldCBpaWRDYWNoZSA9IG51bGw7XG5sZXQgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlID0gbnVsbDtcbmxldCBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGVNYXRjaGVzRGlzayA9IGZhbHNlO1xuY29uc3QgSW5zdGFsbGF0aW9uQ29udHJvbGxlciA9IHtcbiAgYXN5bmMgdXBkYXRlSW5zdGFsbGF0aW9uT25EaXNrKGluc3RhbGxhdGlvbikge1xuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX0lOU1RBTExBVElPTl9LRVkpO1xuICAgIGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuc2V0SXRlbUFzeW5jKHBhdGgsICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKGluc3RhbGxhdGlvbi50b0pTT04oKSkpO1xuICAgIHRoaXMuX3NldEN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZShpbnN0YWxsYXRpb24pO1xuICB9LFxuICBhc3luYyBjdXJyZW50SW5zdGFsbGF0aW9uSWQoKSB7XG4gICAgaWYgKHR5cGVvZiBpaWRDYWNoZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBpaWRDYWNoZTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfSU5TVEFMTEFUSU9OX0lEX0tFWSk7XG4gICAgbGV0IGlpZCA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKHBhdGgpO1xuICAgIGlmICghaWlkKSB7XG4gICAgICBpaWQgPSAoMCwgX3V1aWQuZGVmYXVsdCkoKTtcbiAgICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhwYXRoLCBpaWQpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpaWRDYWNoZSA9IGlpZDtcbiAgICAgICAgcmV0dXJuIGlpZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpaWRDYWNoZSA9IGlpZDtcbiAgICByZXR1cm4gaWlkO1xuICB9LFxuICBhc3luYyBjdXJyZW50SW5zdGFsbGF0aW9uKCkge1xuICAgIGlmIChjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUpIHtcbiAgICAgIHJldHVybiBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGU7XG4gICAgfVxuICAgIGlmIChjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGVNYXRjaGVzRGlzaykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX0lOU1RBTExBVElPTl9LRVkpO1xuICAgIGxldCBpbnN0YWxsYXRpb25EYXRhID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMocGF0aCk7XG4gICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlTWF0Y2hlc0Rpc2sgPSB0cnVlO1xuICAgIGlmIChpbnN0YWxsYXRpb25EYXRhKSB7XG4gICAgICBpbnN0YWxsYXRpb25EYXRhID0gSlNPTi5wYXJzZShpbnN0YWxsYXRpb25EYXRhKTtcbiAgICAgIGluc3RhbGxhdGlvbkRhdGEuY2xhc3NOYW1lID0gJ19JbnN0YWxsYXRpb24nO1xuICAgICAgY29uc3QgY3VycmVudCA9IF9QYXJzZUluc3RhbGxhdGlvbi5kZWZhdWx0LmZyb21KU09OKGluc3RhbGxhdGlvbkRhdGEpO1xuICAgICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlID0gY3VycmVudDtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBjb25zdCBpbnN0YWxsYXRpb25JZCA9IGF3YWl0IHRoaXMuY3VycmVudEluc3RhbGxhdGlvbklkKCk7XG4gICAgY29uc3QgaW5zdGFsbGF0aW9uID0gbmV3IF9QYXJzZUluc3RhbGxhdGlvbi5kZWZhdWx0KCk7XG4gICAgaW5zdGFsbGF0aW9uLnNldCgnZGV2aWNlVHlwZScsIF9QYXJzZUluc3RhbGxhdGlvbi5kZWZhdWx0LkRFVklDRV9UWVBFUy5XRUIpO1xuICAgIGluc3RhbGxhdGlvbi5zZXQoJ2luc3RhbGxhdGlvbklkJywgaW5zdGFsbGF0aW9uSWQpO1xuICAgIGluc3RhbGxhdGlvbi5zZXQoJ3BhcnNlVmVyc2lvbicsIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnVkVSU0lPTicpKTtcbiAgICBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUgPSBpbnN0YWxsYXRpb247XG4gICAgYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMocGF0aCwgKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoaW5zdGFsbGF0aW9uLnRvSlNPTigpKSk7XG4gICAgcmV0dXJuIGluc3RhbGxhdGlvbjtcbiAgfSxcbiAgX2NsZWFyQ2FjaGUoKSB7XG4gICAgaWlkQ2FjaGUgPSBudWxsO1xuICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZSA9IG51bGw7XG4gICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlTWF0Y2hlc0Rpc2sgPSBmYWxzZTtcbiAgfSxcbiAgX3NldEluc3RhbGxhdGlvbklkQ2FjaGUoaWlkKSB7XG4gICAgaWlkQ2FjaGUgPSBpaWQ7XG4gIH0sXG4gIF9zZXRDdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUoaW5zdGFsbGF0aW9uKSB7XG4gICAgbGV0IG1hdGNoZXNEaXNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZSA9IGluc3RhbGxhdGlvbjtcbiAgICBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGVNYXRjaGVzRGlzayA9IG1hdGNoZXNEaXNrO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBJbnN0YWxsYXRpb25Db250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gSW5zdGFsbGF0aW9uQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvbWFwXCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uva2V5c1wiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX3ZhbHVlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvdmFsdWVzXCIpKTtcbnZhciBfc2V0VGltZW91dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC10aW1lb3V0XCIpKTtcbnZhciBfYmluZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvYmluZFwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgX0xpdmVRdWVyeVN1YnNjcmlwdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uXCIpKTtcbnZhciBfcHJvbWlzZVV0aWxzID0gcmVxdWlyZShcIi4vcHJvbWlzZVV0aWxzXCIpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbi8vIFRoZSBMaXZlUXVlcnkgY2xpZW50IGlubmVyIHN0YXRlXG5jb25zdCBDTElFTlRfU1RBVEUgPSB7XG4gIElOSVRJQUxJWkVEOiAnaW5pdGlhbGl6ZWQnLFxuICBDT05ORUNUSU5HOiAnY29ubmVjdGluZycsXG4gIENPTk5FQ1RFRDogJ2Nvbm5lY3RlZCcsXG4gIENMT1NFRDogJ2Nsb3NlZCcsXG4gIFJFQ09OTkVDVElORzogJ3JlY29ubmVjdGluZycsXG4gIERJU0NPTk5FQ1RFRDogJ2Rpc2Nvbm5lY3RlZCdcbn07XG5cbi8vIFRoZSBldmVudCB0eXBlIHRoZSBMaXZlUXVlcnkgY2xpZW50IHNob3VsZCBzZW50IHRvIHNlcnZlclxuY29uc3QgT1BfVFlQRVMgPSB7XG4gIENPTk5FQ1Q6ICdjb25uZWN0JyxcbiAgU1VCU0NSSUJFOiAnc3Vic2NyaWJlJyxcbiAgVU5TVUJTQ1JJQkU6ICd1bnN1YnNjcmliZScsXG4gIEVSUk9SOiAnZXJyb3InXG59O1xuXG4vLyBUaGUgZXZlbnQgd2UgZ2V0IGJhY2sgZnJvbSBMaXZlUXVlcnkgc2VydmVyXG5jb25zdCBPUF9FVkVOVFMgPSB7XG4gIENPTk5FQ1RFRDogJ2Nvbm5lY3RlZCcsXG4gIFNVQlNDUklCRUQ6ICdzdWJzY3JpYmVkJyxcbiAgVU5TVUJTQ1JJQkVEOiAndW5zdWJzY3JpYmVkJyxcbiAgRVJST1I6ICdlcnJvcicsXG4gIENSRUFURTogJ2NyZWF0ZScsXG4gIFVQREFURTogJ3VwZGF0ZScsXG4gIEVOVEVSOiAnZW50ZXInLFxuICBMRUFWRTogJ2xlYXZlJyxcbiAgREVMRVRFOiAnZGVsZXRlJ1xufTtcblxuLy8gVGhlIGV2ZW50IHRoZSBMaXZlUXVlcnkgY2xpZW50IHNob3VsZCBlbWl0XG5jb25zdCBDTElFTlRfRU1NSVRFUl9UWVBFUyA9IHtcbiAgQ0xPU0U6ICdjbG9zZScsXG4gIEVSUk9SOiAnZXJyb3InLFxuICBPUEVOOiAnb3Blbidcbn07XG5cbi8vIFRoZSBldmVudCB0aGUgTGl2ZVF1ZXJ5IHN1YnNjcmlwdGlvbiBzaG91bGQgZW1pdFxuY29uc3QgU1VCU0NSSVBUSU9OX0VNTUlURVJfVFlQRVMgPSB7XG4gIE9QRU46ICdvcGVuJyxcbiAgQ0xPU0U6ICdjbG9zZScsXG4gIEVSUk9SOiAnZXJyb3InLFxuICBDUkVBVEU6ICdjcmVhdGUnLFxuICBVUERBVEU6ICd1cGRhdGUnLFxuICBFTlRFUjogJ2VudGVyJyxcbiAgTEVBVkU6ICdsZWF2ZScsXG4gIERFTEVURTogJ2RlbGV0ZSdcbn07XG5cbi8vIEV4cG9uZW50aWFsbHktZ3Jvd2luZyByYW5kb20gZGVsYXlcbmNvbnN0IGdlbmVyYXRlSW50ZXJ2YWwgPSBrID0+IHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiBNYXRoLm1pbigzMCwgTWF0aC5wb3coMiwgaykgLSAxKSAqIDEwMDA7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgTGl2ZVF1ZXJ5Q2xpZW50LlxuICogPGEgaHJlZj1cImh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZXZlbnRzLmh0bWwjZXZlbnRzX2NsYXNzX2V2ZW50ZW1pdHRlclwiPmNsb3VkIGZ1bmN0aW9uczwvYT4uXG4gKlxuICogQSB3cmFwcGVyIG9mIGEgc3RhbmRhcmQgV2ViU29ja2V0IGNsaWVudC4gV2UgYWRkIHNldmVyYWwgdXNlZnVsIG1ldGhvZHMgdG9cbiAqIGhlbHAgeW91IGNvbm5lY3QvZGlzY29ubmVjdCB0byBMaXZlUXVlcnlTZXJ2ZXIsIHN1YnNjcmliZS91bnN1YnNjcmliZSBhIFBhcnNlUXVlcnkgZWFzaWx5LlxuICpcbiAqIGphdmFzY3JpcHRLZXkgYW5kIG1hc3RlcktleSBhcmUgdXNlZCBmb3IgdmVyaWZ5aW5nIHRoZSBMaXZlUXVlcnlDbGllbnQgd2hlbiBpdCB0cmllc1xuICogdG8gY29ubmVjdCB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlclxuICpcbiAqIFdlIGV4cG9zZSB0aHJlZSBldmVudHMgdG8gaGVscCB5b3UgbW9uaXRvciB0aGUgc3RhdHVzIG9mIHRoZSBMaXZlUXVlcnlDbGllbnQuXG4gKlxuICogPHByZT5cbiAqIGNvbnN0IExpdmVRdWVyeUNsaWVudCA9IFBhcnNlLkxpdmVRdWVyeUNsaWVudDtcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBMaXZlUXVlcnlDbGllbnQoe1xuICogICBhcHBsaWNhdGlvbklkOiAnJyxcbiAqICAgc2VydmVyVVJMOiAnJyxcbiAqICAgamF2YXNjcmlwdEtleTogJycsXG4gKiAgIG1hc3RlcktleTogJydcbiAqICB9KTtcbiAqIDwvcHJlPlxuICpcbiAqIE9wZW4gLSBXaGVuIHdlIGVzdGFibGlzaCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqIDxwcmU+XG4gKiBjbGllbnQub24oJ29wZW4nLCAoKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+XG4gKlxuICogQ2xvc2UgLSBXaGVuIHdlIGxvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuXG4gKiA8cHJlPlxuICogY2xpZW50Lm9uKCdjbG9zZScsICgpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT5cbiAqXG4gKiBFcnJvciAtIFdoZW4gc29tZSBuZXR3b3JrIGVycm9yIG9yIExpdmVRdWVyeSBzZXJ2ZXIgZXJyb3IgaGFwcGVucywgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICogPHByZT5cbiAqIGNsaWVudC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuTGl2ZVF1ZXJ5Q2xpZW50XG4gKi9cbmNsYXNzIExpdmVRdWVyeUNsaWVudCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5hcHBsaWNhdGlvbklkIC0gYXBwbGljYXRpb25JZCBvZiB5b3VyIFBhcnNlIGFwcFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zZXJ2ZXJVUkwgLSA8Yj50aGUgVVJMIG9mIHlvdXIgTGl2ZVF1ZXJ5IHNlcnZlcjwvYj5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuamF2YXNjcmlwdEtleSAob3B0aW9uYWwpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm1hc3RlcktleSAob3B0aW9uYWwpIFlvdXIgUGFyc2UgTWFzdGVyIEtleS4gKE5vZGUuanMgb25seSEpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnNlc3Npb25Ub2tlbiAob3B0aW9uYWwpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmluc3RhbGxhdGlvbklkIChvcHRpb25hbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKF9yZWYpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIGxldCB7XG4gICAgICBhcHBsaWNhdGlvbklkLFxuICAgICAgc2VydmVyVVJMLFxuICAgICAgamF2YXNjcmlwdEtleSxcbiAgICAgIG1hc3RlcktleSxcbiAgICAgIHNlc3Npb25Ub2tlbixcbiAgICAgIGluc3RhbGxhdGlvbklkXG4gICAgfSA9IF9yZWY7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJhdHRlbXB0c1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiaWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlcXVlc3RJZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiYXBwbGljYXRpb25JZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic2VydmVyVVJMXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJqYXZhc2NyaXB0S2V5XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJtYXN0ZXJLZXlcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInNlc3Npb25Ub2tlblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiaW5zdGFsbGF0aW9uSWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJjb25uZWN0UHJvbWlzZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic3Vic2NyaXB0aW9uc1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic29ja2V0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzdGF0ZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVjb25uZWN0SGFuZGxlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJlbWl0dGVyXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiZW1pdFwiLCB2b2lkIDApO1xuICAgIGlmICghc2VydmVyVVJMIHx8ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShzZXJ2ZXJVUkwpLmNhbGwoc2VydmVyVVJMLCAnd3MnKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzZXQgYSBwcm9wZXIgUGFyc2UgTGl2ZVF1ZXJ5IHNlcnZlciB1cmwgYmVmb3JlIHVzaW5nIExpdmVRdWVyeUNsaWVudCcpO1xuICAgIH1cbiAgICB0aGlzLnJlY29ubmVjdEhhbmRsZSA9IG51bGw7XG4gICAgdGhpcy5hdHRlbXB0cyA9IDE7XG4gICAgdGhpcy5pZCA9IDA7XG4gICAgdGhpcy5yZXF1ZXN0SWQgPSAxO1xuICAgIHRoaXMuc2VydmVyVVJMID0gc2VydmVyVVJMO1xuICAgIHRoaXMuYXBwbGljYXRpb25JZCA9IGFwcGxpY2F0aW9uSWQ7XG4gICAgdGhpcy5qYXZhc2NyaXB0S2V5ID0gamF2YXNjcmlwdEtleSB8fCB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXN0ZXJLZXkgPSBtYXN0ZXJLZXkgfHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuc2Vzc2lvblRva2VuID0gc2Vzc2lvblRva2VuIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmluc3RhbGxhdGlvbklkID0gaW5zdGFsbGF0aW9uSWQgfHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuYWRkaXRpb25hbFByb3BlcnRpZXMgPSB0cnVlO1xuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IG5ldyBfbWFwLmRlZmF1bHQoKTtcbiAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLklOSVRJQUxJWkVEO1xuICAgIGNvbnN0IEV2ZW50RW1pdHRlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLm9uID0gKGV2ZW50TmFtZSwgbGlzdGVuZXIpID0+IHRoaXMuZW1pdHRlci5vbihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90aGlzLmVtaXR0ZXIuZW1pdChldmVudE5hbWUsIC4uLmFyZ3MpO1xuICAgIH07XG4gICAgLy8gYWRkaW5nIGxpc3RlbmVyIHNvIHByb2Nlc3MgZG9lcyBub3QgY3Jhc2hcbiAgICAvLyBiZXN0IHByYWN0aWNlIGlzIGZvciBkZXZlbG9wZXIgdG8gcmVnaXN0ZXIgdGhlaXIgb3duIGxpc3RlbmVyXG4gICAgdGhpcy5vbignZXJyb3InLCAoKSA9PiB7fSk7XG4gIH1cbiAgc2hvdWxkT3BlbigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0xJRU5UX1NUQVRFLklOSVRJQUxJWkVEIHx8IHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5ESVNDT05ORUNURUQ7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhIFBhcnNlUXVlcnlcbiAgICpcbiAgICogSWYgeW91IHByb3ZpZGUgdGhlIHNlc3Npb25Ub2tlbiwgd2hlbiB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciBnZXRzIFBhcnNlT2JqZWN0J3NcbiAgICogdXBkYXRlcyBmcm9tIHBhcnNlIHNlcnZlciwgaXQnbGwgdHJ5IHRvIGNoZWNrIHdoZXRoZXIgdGhlIHNlc3Npb25Ub2tlbiBmdWxmaWxsc1xuICAgKiB0aGUgUGFyc2VPYmplY3QncyBBQ0wuIFRoZSBMaXZlUXVlcnkgc2VydmVyIHdpbGwgb25seSBzZW5kIHVwZGF0ZXMgdG8gY2xpZW50cyB3aG9zZVxuICAgKiBzZXNzaW9uVG9rZW4gaXMgZml0IGZvciB0aGUgUGFyc2VPYmplY3QncyBBQ0wuIFlvdSBjYW4gY2hlY2sgdGhlIExpdmVRdWVyeSBwcm90b2NvbFxuICAgKiA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL3BhcnNlLWNvbW11bml0eS9wYXJzZS1zZXJ2ZXIvd2lraS9QYXJzZS1MaXZlUXVlcnktUHJvdG9jb2wtU3BlY2lmaWNhdGlvblwiPmhlcmU8L2E+IGZvciBtb3JlIGRldGFpbHMuIFRoZSBzdWJzY3JpcHRpb24geW91IGdldCBpcyB0aGUgc2FtZSBzdWJzY3JpcHRpb24geW91IGdldFxuICAgKiBmcm9tIG91ciBTdGFuZGFyZCBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2VRdWVyeX0gcXVlcnkgLSB0aGUgUGFyc2VRdWVyeSB5b3Ugd2FudCB0byBzdWJzY3JpYmUgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25Ub2tlbiAob3B0aW9uYWwpXG4gICAqIEByZXR1cm5zIHtMaXZlUXVlcnlTdWJzY3JpcHRpb24gfCB1bmRlZmluZWR9XG4gICAqL1xuICBzdWJzY3JpYmUocXVlcnksIHNlc3Npb25Ub2tlbikge1xuICAgIGlmICghcXVlcnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NOYW1lID0gcXVlcnkuY2xhc3NOYW1lO1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9IHF1ZXJ5LnRvSlNPTigpO1xuICAgIGNvbnN0IHdoZXJlID0gcXVlcnlKU09OLndoZXJlO1xuICAgIGNvbnN0IGtleXMgPSAoMCwgX2tleXMuZGVmYXVsdCkocXVlcnlKU09OKT8uc3BsaXQoJywnKTtcbiAgICBjb25zdCB3YXRjaCA9IHF1ZXJ5SlNPTi53YXRjaD8uc3BsaXQoJywnKTtcbiAgICBjb25zdCBzdWJzY3JpYmVSZXF1ZXN0ID0ge1xuICAgICAgb3A6IE9QX1RZUEVTLlNVQlNDUklCRSxcbiAgICAgIHJlcXVlc3RJZDogdGhpcy5yZXF1ZXN0SWQsXG4gICAgICBxdWVyeToge1xuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHdoZXJlLFxuICAgICAgICBrZXlzLFxuICAgICAgICB3YXRjaFxuICAgICAgfSxcbiAgICAgIHNlc3Npb25Ub2tlbjogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBpZiAoc2Vzc2lvblRva2VuKSB7XG4gICAgICBzdWJzY3JpYmVSZXF1ZXN0LnNlc3Npb25Ub2tlbiA9IHNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IF9MaXZlUXVlcnlTdWJzY3JpcHRpb24uZGVmYXVsdCh0aGlzLnJlcXVlc3RJZCwgcXVlcnksIHNlc3Npb25Ub2tlbik7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnNldCh0aGlzLnJlcXVlc3RJZCwgc3Vic2NyaXB0aW9uKTtcbiAgICB0aGlzLnJlcXVlc3RJZCArPSAxO1xuICAgIHRoaXMuY29ubmVjdFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKCgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHN1YnNjcmliZVJlcXVlc3QpKTtcbiAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24uc3Vic2NyaWJlUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH0pO1xuICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogQWZ0ZXIgY2FsbGluZyB1bnN1YnNjcmliZSB5b3UnbGwgc3RvcCByZWNlaXZpbmcgZXZlbnRzIGZyb20gdGhlIHN1YnNjcmlwdGlvbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdWJzY3JpcHRpb24gLSBzdWJzY3JpcHRpb24geW91IHdvdWxkIGxpa2UgdG8gdW5zdWJzY3JpYmUgZnJvbS5cbiAgICogQHJldHVybnMge1Byb21pc2UgfCB1bmRlZmluZWR9XG4gICAqL1xuICBhc3luYyB1bnN1YnNjcmliZShzdWJzY3JpcHRpb24pIHtcbiAgICBpZiAoIXN1YnNjcmlwdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1bnN1YnNjcmliZVJlcXVlc3QgPSB7XG4gICAgICBvcDogT1BfVFlQRVMuVU5TVUJTQ1JJQkUsXG4gICAgICByZXF1ZXN0SWQ6IHN1YnNjcmlwdGlvbi5pZFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5zb2NrZXQuc2VuZCgoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KSh1bnN1YnNjcmliZVJlcXVlc3QpKTtcbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmVQcm9taXNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFmdGVyIG9wZW4gaXMgY2FsbGVkLCB0aGUgTGl2ZVF1ZXJ5Q2xpZW50IHdpbGwgdHJ5IHRvIHNlbmQgYSBjb25uZWN0IHJlcXVlc3RcbiAgICogdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIuXG4gICAqXG4gICAqL1xuICBvcGVuKCkge1xuICAgIGNvbnN0IFdlYlNvY2tldEltcGxlbWVudGF0aW9uID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0V2ViU29ja2V0Q29udHJvbGxlcigpO1xuICAgIGlmICghV2ViU29ja2V0SW1wbGVtZW50YXRpb24pIHtcbiAgICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5FUlJPUiwgJ0NhbiBub3QgZmluZCBXZWJTb2NrZXQgaW1wbGVtZW50YXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IENMSUVOVF9TVEFURS5SRUNPTk5FQ1RJTkcpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDTElFTlRfU1RBVEUuQ09OTkVDVElORztcbiAgICB9XG4gICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0SW1wbGVtZW50YXRpb24odGhpcy5zZXJ2ZXJVUkwpO1xuICAgIHRoaXMuc29ja2V0LmNsb3NpbmdQcm9taXNlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcblxuICAgIC8vIEJpbmQgV2ViU29ja2V0IGNhbGxiYWNrc1xuICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2hhbmRsZVdlYlNvY2tldE9wZW4oKTtcbiAgICB9O1xuICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuX2hhbmRsZVdlYlNvY2tldE1lc3NhZ2UoZXZlbnQpO1xuICAgIH07XG4gICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuc29ja2V0LmNsb3NpbmdQcm9taXNlPy5yZXNvbHZlKGV2ZW50KTtcbiAgICAgIHRoaXMuX2hhbmRsZVdlYlNvY2tldENsb3NlKCk7XG4gICAgfTtcbiAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgdGhpcy5faGFuZGxlV2ViU29ja2V0RXJyb3IoZXJyb3IpO1xuICAgIH07XG4gIH1cbiAgcmVzdWJzY3JpYmUoKSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dCA9IHRoaXMuc3Vic2NyaXB0aW9ucykuY2FsbChfY29udGV4dCwgKHN1YnNjcmlwdGlvbiwgcmVxdWVzdElkKSA9PiB7XG4gICAgICBjb25zdCBxdWVyeSA9IHN1YnNjcmlwdGlvbi5xdWVyeTtcbiAgICAgIGNvbnN0IHF1ZXJ5SlNPTiA9IHF1ZXJ5LnRvSlNPTigpO1xuICAgICAgY29uc3Qgd2hlcmUgPSBxdWVyeUpTT04ud2hlcmU7XG4gICAgICBjb25zdCBrZXlzID0gKDAsIF9rZXlzLmRlZmF1bHQpKHF1ZXJ5SlNPTik/LnNwbGl0KCcsJyk7XG4gICAgICBjb25zdCB3YXRjaCA9IHF1ZXJ5SlNPTi53YXRjaD8uc3BsaXQoJywnKTtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICAgIGNvbnN0IHNlc3Npb25Ub2tlbiA9IHN1YnNjcmlwdGlvbi5zZXNzaW9uVG9rZW47XG4gICAgICBjb25zdCBzdWJzY3JpYmVSZXF1ZXN0ID0ge1xuICAgICAgICBvcDogT1BfVFlQRVMuU1VCU0NSSUJFLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgIHdoZXJlLFxuICAgICAgICAgIGtleXMsXG4gICAgICAgICAgd2F0Y2hcbiAgICAgICAgfSxcbiAgICAgICAgc2Vzc2lvblRva2VuOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgICBpZiAoc2Vzc2lvblRva2VuKSB7XG4gICAgICAgIHN1YnNjcmliZVJlcXVlc3Quc2Vzc2lvblRva2VuID0gc2Vzc2lvblRva2VuO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZCgoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShzdWJzY3JpYmVSZXF1ZXN0KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGNsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGlzIExpdmVRdWVyeUNsaWVudCxcbiAgICogY2FuY2VsIHRoZSBhdXRvIHJlY29ubmVjdCBhbmQgdW5zdWJzY3JpYmUgYWxsIHN1YnNjcmlwdGlvbnMgYmFzZWQgb24gaXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlIHwgdW5kZWZpbmVkfSBDbG9zZUV2ZW50IHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0L2Nsb3NlX2V2ZW50fVxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5JTklUSUFMSVpFRCB8fCB0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuRElTQ09OTkVDVEVEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSBDTElFTlRfU1RBVEUuRElTQ09OTkVDVEVEO1xuICAgIHRoaXMuc29ja2V0Py5jbG9zZSgpO1xuICAgIC8vIE5vdGlmeSBlYWNoIHN1YnNjcmlwdGlvbiBhYm91dCB0aGUgY2xvc2VcbiAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiAoMCwgX3ZhbHVlcy5kZWZhdWx0KShfY29udGV4dDIgPSB0aGlzLnN1YnNjcmlwdGlvbnMpLmNhbGwoX2NvbnRleHQyKSkge1xuICAgICAgdmFyIF9jb250ZXh0MjtcbiAgICAgIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICBzdWJzY3JpcHRpb24uZW1pdChTVUJTQ1JJUFRJT05fRU1NSVRFUl9UWVBFUy5DTE9TRSk7XG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZVJlc2V0KCk7XG4gICAgdGhpcy5lbWl0KENMSUVOVF9FTU1JVEVSX1RZUEVTLkNMT1NFKTtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LmNsb3NpbmdQcm9taXNlO1xuICB9XG5cbiAgLy8gZW5zdXJlIHdlIHN0YXJ0IHdpdGggdmFsaWQgc3RhdGUgaWYgY29ubmVjdCBpcyBjYWxsZWQgYWdhaW4gYWZ0ZXIgY2xvc2VcbiAgX2hhbmRsZVJlc2V0KCkge1xuICAgIHRoaXMuYXR0ZW1wdHMgPSAxO1xuICAgIHRoaXMuaWQgPSAwO1xuICAgIHRoaXMucmVxdWVzdElkID0gMTtcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgX21hcC5kZWZhdWx0KCk7XG4gIH1cbiAgX2hhbmRsZVdlYlNvY2tldE9wZW4oKSB7XG4gICAgY29uc3QgY29ubmVjdFJlcXVlc3QgPSB7XG4gICAgICBvcDogT1BfVFlQRVMuQ09OTkVDVCxcbiAgICAgIGFwcGxpY2F0aW9uSWQ6IHRoaXMuYXBwbGljYXRpb25JZCxcbiAgICAgIGphdmFzY3JpcHRLZXk6IHRoaXMuamF2YXNjcmlwdEtleSxcbiAgICAgIG1hc3RlcktleTogdGhpcy5tYXN0ZXJLZXksXG4gICAgICBzZXNzaW9uVG9rZW46IHRoaXMuc2Vzc2lvblRva2VuLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgaWYgKHRoaXMuYWRkaXRpb25hbFByb3BlcnRpZXMpIHtcbiAgICAgIGNvbm5lY3RSZXF1ZXN0Lmluc3RhbGxhdGlvbklkID0gdGhpcy5pbnN0YWxsYXRpb25JZDtcbiAgICB9XG4gICAgdGhpcy5zb2NrZXQuc2VuZCgoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShjb25uZWN0UmVxdWVzdCkpO1xuICB9XG4gIF9oYW5kbGVXZWJTb2NrZXRNZXNzYWdlKGV2ZW50KSB7XG4gICAgbGV0IGRhdGEgPSBldmVudC5kYXRhO1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH1cbiAgICBsZXQgc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICBpZiAoZGF0YS5yZXF1ZXN0SWQpIHtcbiAgICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaXB0aW9ucy5nZXQoZGF0YS5yZXF1ZXN0SWQpIHx8IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgY2xpZW50SWQ6IGRhdGEuY2xpZW50SWQsXG4gICAgICBpbnN0YWxsYXRpb25JZDogZGF0YS5pbnN0YWxsYXRpb25JZFxuICAgIH07XG4gICAgc3dpdGNoIChkYXRhLm9wKSB7XG4gICAgICBjYXNlIE9QX0VWRU5UUy5DT05ORUNURUQ6XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuUkVDT05ORUNUSU5HKSB7XG4gICAgICAgICAgdGhpcy5yZXN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5PUEVOKTtcbiAgICAgICAgdGhpcy5pZCA9IGRhdGEuY2xpZW50SWQ7XG4gICAgICAgIHRoaXMuY29ubmVjdFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLkNPTk5FQ1RFRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9QX0VWRU5UUy5TVUJTQ1JJQkVEOlxuICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgdGhpcy5hdHRlbXB0cyA9IDE7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnN1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAoMCwgX3NldFRpbWVvdXQyLmRlZmF1bHQpKCgpID0+IHN1YnNjcmlwdGlvbi5lbWl0KFNVQlNDUklQVElPTl9FTU1JVEVSX1RZUEVTLk9QRU4sIHJlc3BvbnNlKSwgMjAwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT1BfRVZFTlRTLkVSUk9SOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcGFyc2VFcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KGRhdGEuY29kZSwgZGF0YS5lcnJvcik7XG4gICAgICAgICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3RQcm9taXNlLnJlamVjdChwYXJzZUVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDTElFTlRfU1RBVEUuRElTQ09OTkVDVEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGF0YS5yZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnN1YnNjcmliZVByb21pc2UucmVqZWN0KHBhcnNlRXJyb3IpO1xuICAgICAgICAgICAgICAoMCwgX3NldFRpbWVvdXQyLmRlZmF1bHQpKCgpID0+IHN1YnNjcmlwdGlvbi5lbWl0KFNVQlNDUklQVElPTl9FTU1JVEVSX1RZUEVTLkVSUk9SLCBkYXRhLmVycm9yKSwgMjAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KENMSUVOVF9FTU1JVEVSX1RZUEVTLkVSUk9SLCBkYXRhLmVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRhdGEuZXJyb3IgPT09ICdBZGRpdGlvbmFsIHByb3BlcnRpZXMgbm90IGFsbG93ZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLnJlY29ubmVjdCkge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlUmVjb25uZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlIE9QX0VWRU5UUy5VTlNVQlNDUklCRUQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZGVsZXRlKGRhdGEucmVxdWVzdElkKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmVQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBjcmVhdGUsIHVwZGF0ZSwgZW50ZXIsIGxlYXZlLCBkZWxldGUgY2FzZXNcbiAgICAgICAgICBpZiAoIXN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBvdmVycmlkZSA9IGZhbHNlO1xuICAgICAgICAgIGlmIChkYXRhLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICBvdmVycmlkZSA9IHRydWU7XG4gICAgICAgICAgICBkZWxldGUgZGF0YS5vcmlnaW5hbC5fX3R5cGU7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgcmVtb3ZlZCBmaWVsZHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gZGF0YS5vcmlnaW5hbCkge1xuICAgICAgICAgICAgICBpZiAoIShmaWVsZCBpbiBkYXRhLm9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICBkYXRhLm9iamVjdFtmaWVsZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEub3JpZ2luYWwgPSBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTihkYXRhLm9yaWdpbmFsLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBkYXRhLm9iamVjdC5fX3R5cGU7XG4gICAgICAgICAgY29uc3QgcGFyc2VPYmplY3QgPSBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTihkYXRhLm9iamVjdCwgIShzdWJzY3JpcHRpb24ucXVlcnkgJiYgc3Vic2NyaXB0aW9uLnF1ZXJ5Ll9zZWxlY3QpID8gb3ZlcnJpZGUgOiBmYWxzZSk7XG4gICAgICAgICAgaWYgKGRhdGEub3JpZ2luYWwpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5lbWl0KGRhdGEub3AsIHBhcnNlT2JqZWN0LCBkYXRhLm9yaWdpbmFsLCByZXNwb25zZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5lbWl0KGRhdGEub3AsIHBhcnNlT2JqZWN0LCByZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICAgICAgICBpZiAob3ZlcnJpZGUgJiYgbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICAgICAgICBsb2NhbERhdGFzdG9yZS5fdXBkYXRlT2JqZWN0SWZQaW5uZWQocGFyc2VPYmplY3QpLnRoZW4oKCkgPT4ge30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuICBfaGFuZGxlV2ViU29ja2V0Q2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5ESVNDT05ORUNURUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IENMSUVOVF9TVEFURS5DTE9TRUQ7XG4gICAgdGhpcy5lbWl0KENMSUVOVF9FTU1JVEVSX1RZUEVTLkNMT1NFKTtcbiAgICAvLyBOb3RpZnkgZWFjaCBzdWJzY3JpcHRpb24gYWJvdXQgdGhlIGNsb3NlXG4gICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgKDAsIF92YWx1ZXMuZGVmYXVsdCkoX2NvbnRleHQzID0gdGhpcy5zdWJzY3JpcHRpb25zKS5jYWxsKF9jb250ZXh0MykpIHtcbiAgICAgIHZhciBfY29udGV4dDM7XG4gICAgICBzdWJzY3JpcHRpb24uZW1pdChTVUJTQ1JJUFRJT05fRU1NSVRFUl9UWVBFUy5DTE9TRSk7XG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZVJlY29ubmVjdCgpO1xuICB9XG4gIF9oYW5kbGVXZWJTb2NrZXRFcnJvcihlcnJvcikge1xuICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5FUlJPUiwgZXJyb3IpO1xuICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mICgwLCBfdmFsdWVzLmRlZmF1bHQpKF9jb250ZXh0NCA9IHRoaXMuc3Vic2NyaXB0aW9ucykuY2FsbChfY29udGV4dDQpKSB7XG4gICAgICB2YXIgX2NvbnRleHQ0O1xuICAgICAgc3Vic2NyaXB0aW9uLmVtaXQoU1VCU0NSSVBUSU9OX0VNTUlURVJfVFlQRVMuRVJST1IsIGVycm9yKTtcbiAgICB9XG4gICAgdGhpcy5faGFuZGxlUmVjb25uZWN0KCk7XG4gIH1cbiAgX2hhbmRsZVJlY29ubmVjdCgpIHtcbiAgICB2YXIgX2NvbnRleHQ1O1xuICAgIC8vIGlmIGNsb3NlZCBvciBjdXJyZW50bHkgcmVjb25uZWN0aW5nIHdlIHN0b3AgYXR0ZW1wdGluZyB0byByZWNvbm5lY3RcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQ0xJRU5UX1NUQVRFLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLlJFQ09OTkVDVElORztcbiAgICBjb25zdCB0aW1lID0gZ2VuZXJhdGVJbnRlcnZhbCh0aGlzLmF0dGVtcHRzKTtcblxuICAgIC8vIGhhbmRsZSBjYXNlIHdoZW4gYm90aCBjbG9zZS9lcnJvciBvY2N1ciBhdCBmcmVxdWVudCByYXRlcyB3ZSBlbnN1cmUgd2UgZG8gbm90IHJlY29ubmVjdCB1bm5lY2Vzc2FyaWx5LlxuICAgIC8vIHdlJ3JlIHVuYWJsZSB0byBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgYmV0d2VlbiBjbG9zZS9lcnJvciB3aGVuIHdlJ3JlIHVuYWJsZSB0byByZWNvbm5lY3QgdGhlcmVmb3JlXG4gICAgLy8gd2UgdHJ5IHRvIHJlY29ubmVjdCBpbiBib3RoIGNhc2VzXG4gICAgLy8gc2VydmVyIHNpZGUgd3MgYW5kIGJyb3dzZXIgV2ViU29ja2V0IGJlaGF2ZSBkaWZmZXJlbnRseSBpbiB3aGVuIGNsb3NlL2Vycm9yIGdldCB0cmlnZ2VyZWRcbiAgICBpZiAodGhpcy5yZWNvbm5lY3RIYW5kbGUpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdEhhbmRsZSk7XG4gICAgfVxuICAgIHRoaXMucmVjb25uZWN0SGFuZGxlID0gKDAsIF9zZXRUaW1lb3V0Mi5kZWZhdWx0KSgoMCwgX2JpbmQuZGVmYXVsdCkoX2NvbnRleHQ1ID0gKCkgPT4ge1xuICAgICAgdGhpcy5hdHRlbXB0cysrO1xuICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9KS5jYWxsKF9jb250ZXh0NSwgdGhpcyksIHRpbWUpO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBMaXZlUXVlcnlDbGllbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfcHJvbWlzZVV0aWxzID0gcmVxdWlyZShcIi4vcHJvbWlzZVV0aWxzXCIpO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IExpdmVRdWVyeSBTdWJzY3JpcHRpb24uXG4gKiA8YSBocmVmPVwiaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9ldmVudHMuaHRtbCNldmVudHNfY2xhc3NfZXZlbnRlbWl0dGVyXCI+Y2xvdWQgZnVuY3Rpb25zPC9hPi5cbiAqXG4gKiA8cD5SZXNwb25zZSBPYmplY3QgLSBDb250YWlucyBkYXRhIGZyb20gdGhlIGNsaWVudCB0aGF0IG1hZGUgdGhlIHJlcXVlc3RcbiAqIDx1bD5cbiAqIDxsaT5jbGllbnRJZDwvbGk+XG4gKiA8bGk+aW5zdGFsbGF0aW9uSWQgLSByZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgNC4wLjArPC9saT5cbiAqIDwvdWw+XG4gKiA8L3A+XG4gKlxuICogPHA+T3BlbiBFdmVudCAtIFdoZW4geW91IGNhbGwgcXVlcnkuc3Vic2NyaWJlKCksIHdlIHNlbmQgYSBzdWJzY3JpYmUgcmVxdWVzdCB0b1xuICogdGhlIExpdmVRdWVyeSBzZXJ2ZXIsIHdoZW4gd2UgZ2V0IHRoZSBjb25maXJtYXRpb24gZnJvbSB0aGUgTGl2ZVF1ZXJ5IHNlcnZlcixcbiAqIHRoaXMgZXZlbnQgd2lsbCBiZSBlbWl0dGVkLiBXaGVuIHRoZSBjbGllbnQgbG9zZXMgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlXG4gKiBMaXZlUXVlcnkgc2VydmVyLCB3ZSB3aWxsIHRyeSB0byBhdXRvIHJlY29ubmVjdCB0aGUgTGl2ZVF1ZXJ5IHNlcnZlci4gSWYgd2VcbiAqIHJlY29ubmVjdCB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciBhbmQgc3VjY2Vzc2Z1bGx5IHJlc3Vic2NyaWJlIHRoZSBQYXJzZVF1ZXJ5LFxuICogeW91J2xsIGFsc28gZ2V0IHRoaXMgZXZlbnQuXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbignb3BlbicsIChyZXNwb25zZSkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiA8cD5DcmVhdGUgRXZlbnQgLSBXaGVuIGEgbmV3IFBhcnNlT2JqZWN0IGlzIGNyZWF0ZWQgYW5kIGl0IGZ1bGZpbGxzIHRoZSBQYXJzZVF1ZXJ5IHlvdSBzdWJzY3JpYmUsXG4gKiB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuIFRoZSBvYmplY3QgaXMgdGhlIFBhcnNlT2JqZWN0IHdoaWNoIGlzIGNyZWF0ZWQuXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbignY3JlYXRlJywgKG9iamVjdCwgcmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+VXBkYXRlIEV2ZW50IC0gV2hlbiBhbiBleGlzdGluZyBQYXJzZU9iamVjdCAob3JpZ2luYWwpIHdoaWNoIGZ1bGZpbGxzIHRoZSBQYXJzZVF1ZXJ5IHlvdSBzdWJzY3JpYmVcbiAqIGlzIHVwZGF0ZWQgKFRoZSBQYXJzZU9iamVjdCBmdWxmaWxscyB0aGUgUGFyc2VRdWVyeSBiZWZvcmUgYW5kIGFmdGVyIGNoYW5nZXMpLFxuICogeW91J2xsIGdldCB0aGlzIGV2ZW50LiBUaGUgb2JqZWN0IGlzIHRoZSBQYXJzZU9iamVjdCB3aGljaCBpcyB1cGRhdGVkLlxuICogSXRzIGNvbnRlbnQgaXMgdGhlIGxhdGVzdCB2YWx1ZSBvZiB0aGUgUGFyc2VPYmplY3QuXG4gKlxuICogUGFyc2UtU2VydmVyIDMuMS4zKyBSZXF1aXJlZCBmb3Igb3JpZ2luYWwgb2JqZWN0IHBhcmFtZXRlclxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ3VwZGF0ZScsIChvYmplY3QsIG9yaWdpbmFsLCByZXNwb25zZSkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiA8cD5FbnRlciBFdmVudCAtIFdoZW4gYW4gZXhpc3RpbmcgUGFyc2VPYmplY3QncyAob3JpZ2luYWwpIG9sZCB2YWx1ZSBkb2Vzbid0IGZ1bGZpbGwgdGhlIFBhcnNlUXVlcnlcbiAqIGJ1dCBpdHMgbmV3IHZhbHVlIGZ1bGZpbGxzIHRoZSBQYXJzZVF1ZXJ5LCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuIFRoZSBvYmplY3QgaXMgdGhlXG4gKiBQYXJzZU9iamVjdCB3aGljaCBlbnRlcnMgdGhlIFBhcnNlUXVlcnkuIEl0cyBjb250ZW50IGlzIHRoZSBsYXRlc3QgdmFsdWUgb2YgdGhlIFBhcnNlT2JqZWN0LlxuICpcbiAqIFBhcnNlLVNlcnZlciAzLjEuMysgUmVxdWlyZWQgZm9yIG9yaWdpbmFsIG9iamVjdCBwYXJhbWV0ZXJcbiAqXG4gKiA8cHJlPlxuICogc3Vic2NyaXB0aW9uLm9uKCdlbnRlcicsIChvYmplY3QsIG9yaWdpbmFsLCByZXNwb25zZSkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKlxuICogPHA+VXBkYXRlIEV2ZW50IC0gV2hlbiBhbiBleGlzdGluZyBQYXJzZU9iamVjdCdzIG9sZCB2YWx1ZSBmdWxmaWxscyB0aGUgUGFyc2VRdWVyeSBidXQgaXRzIG5ldyB2YWx1ZVxuICogZG9lc24ndCBmdWxmaWxsIHRoZSBQYXJzZVF1ZXJ5LCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuIFRoZSBvYmplY3QgaXMgdGhlIFBhcnNlT2JqZWN0XG4gKiB3aGljaCBsZWF2ZXMgdGhlIFBhcnNlUXVlcnkuIEl0cyBjb250ZW50IGlzIHRoZSBsYXRlc3QgdmFsdWUgb2YgdGhlIFBhcnNlT2JqZWN0LlxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ2xlYXZlJywgKG9iamVjdCwgcmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICpcbiAqIDxwPkRlbGV0ZSBFdmVudCAtIFdoZW4gYW4gZXhpc3RpbmcgUGFyc2VPYmplY3Qgd2hpY2ggZnVsZmlsbHMgdGhlIFBhcnNlUXVlcnkgaXMgZGVsZXRlZCwgeW91J2xsXG4gKiBnZXQgdGhpcyBldmVudC4gVGhlIG9iamVjdCBpcyB0aGUgUGFyc2VPYmplY3Qgd2hpY2ggaXMgZGVsZXRlZC5cbiAqXG4gKiA8cHJlPlxuICogc3Vic2NyaXB0aW9uLm9uKCdkZWxldGUnLCAob2JqZWN0LCByZXNwb25zZSkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKlxuICogPHA+Q2xvc2UgRXZlbnQgLSBXaGVuIHRoZSBjbGllbnQgbG9zZXMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnlcbiAqIHNlcnZlciBhbmQgd2Ugc3RvcCByZWNlaXZpbmcgZXZlbnRzLCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbignY2xvc2UnLCAoKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICovXG5jbGFzcyBTdWJzY3JpcHRpb24ge1xuICAvKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBzdWJzY3JpcHRpb24gaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IC0gcXVlcnkgdG8gc3Vic2NyaWJlIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uVG9rZW4gLSBvcHRpb25hbCBzZXNzaW9uIHRva2VuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihpZCwgcXVlcnksIHNlc3Npb25Ub2tlbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJpZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicXVlcnlcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInNlc3Npb25Ub2tlblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic3Vic2NyaWJlUHJvbWlzZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwidW5zdWJzY3JpYmVQcm9taXNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzdWJzY3JpYmVkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJlbWl0dGVyXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiZW1pdFwiLCB2b2lkIDApO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgdGhpcy5zZXNzaW9uVG9rZW4gPSBzZXNzaW9uVG9rZW47XG4gICAgdGhpcy5zdWJzY3JpYmVQcm9taXNlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlUHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgY29uc3QgRXZlbnRFbWl0dGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMub24gPSAoZXZlbnROYW1lLCBsaXN0ZW5lcikgPT4gdGhpcy5lbWl0dGVyLm9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gX3RoaXMuZW1pdHRlci5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7XG4gICAgfTtcbiAgICAvLyBhZGRpbmcgbGlzdGVuZXIgc28gcHJvY2VzcyBkb2VzIG5vdCBjcmFzaFxuICAgIC8vIGJlc3QgcHJhY3RpY2UgaXMgZm9yIGRldmVsb3BlciB0byByZWdpc3RlciB0aGVpciBvd24gbGlzdGVuZXJcbiAgICB0aGlzLm9uKCdlcnJvcicsICgpID0+IHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgc3Vic2NyaXB0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgdW5zdWJzY3JpYmUoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExpdmVRdWVyeUNvbnRyb2xsZXIoKS5nZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50KCkudGhlbihsaXZlUXVlcnlDbGllbnQgPT4ge1xuICAgICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICAgICAgcmV0dXJuIGxpdmVRdWVyeUNsaWVudC51bnN1YnNjcmliZSh0aGlzKTtcbiAgICB9KTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gU3Vic2NyaXB0aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9zZXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldFwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfZmlsdGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maWx0ZXJcIikpO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9zdGFydHNXaXRoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zdGFydHMtd2l0aFwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9jb25jYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKSk7XG52YXIgX2Zyb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2Zyb21cIikpO1xudmFyIF9maW5kID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maW5kXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXJcIikpO1xudmFyIF9QYXJzZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVF1ZXJ5XCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVVdGlscyA9IHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlVXRpbHNcIik7XG4vKipcbiAqIFByb3ZpZGVzIGEgbG9jYWwgZGF0YXN0b3JlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LiA8YnIgLz5cbiAqIFRvIGVuYWJsZSB0aGlzIGZ1bmN0aW9uYWxpdHksIGNhbGwgPGNvZGU+UGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKTwvY29kZT4uXG4gKlxuICogUGluIG9iamVjdCB0byBhZGQgdG8gbG9jYWwgZGF0YXN0b3JlXG4gKlxuICogPHByZT5hd2FpdCBvYmplY3QucGluKCk7PC9wcmU+XG4gKiA8cHJlPmF3YWl0IG9iamVjdC5waW5XaXRoTmFtZSgncGluTmFtZScpOzwvcHJlPlxuICpcbiAqIFF1ZXJ5IHBpbm5lZCBvYmplY3RzXG4gKlxuICogPHByZT5xdWVyeS5mcm9tTG9jYWxEYXRhc3RvcmUoKTs8L3ByZT5cbiAqIDxwcmU+cXVlcnkuZnJvbVBpbigpOzwvcHJlPlxuICogPHByZT5xdWVyeS5mcm9tUGluV2l0aE5hbWUoKTs8L3ByZT5cbiAqXG4gKiA8cHJlPmNvbnN0IGxvY2FsT2JqZWN0cyA9IGF3YWl0IHF1ZXJ5LmZpbmQoKTs8L3ByZT5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuTG9jYWxEYXRhc3RvcmVcbiAqIEBzdGF0aWNcbiAqL1xuY29uc3QgTG9jYWxEYXRhc3RvcmUgPSB7XG4gIGlzRW5hYmxlZDogZmFsc2UsXG4gIGlzU3luY2luZzogZmFsc2UsXG4gIGZyb21QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmZyb21QaW5XaXRoTmFtZShuYW1lKTtcbiAgfSxcbiAgYXN5bmMgcGluV2l0aE5hbWUobmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIucGluV2l0aE5hbWUobmFtZSwgdmFsdWUpO1xuICB9LFxuICBhc3luYyB1blBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIudW5QaW5XaXRoTmFtZShuYW1lKTtcbiAgfSxcbiAgX2dldEFsbENvbnRlbnRzKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5nZXRBbGxDb250ZW50cygpO1xuICB9LFxuICAvLyBVc2UgZm9yIHRlc3RpbmdcbiAgYXN5bmMgX2dldFJhd1N0b3JhZ2UoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmdldFJhd1N0b3JhZ2UoKTtcbiAgfSxcbiAgYXN5bmMgX2NsZWFyKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5jbGVhcigpO1xuICB9LFxuICAvLyBQaW4gdGhlIG9iamVjdCBhbmQgY2hpbGRyZW4gcmVjdXJzaXZlbHlcbiAgLy8gU2F2ZXMgdGhlIG9iamVjdCBhbmQgY2hpbGRyZW4ga2V5IHRvIFBpbiBOYW1lXG4gIGFzeW5jIF9oYW5kbGVQaW5BbGxXaXRoTmFtZShuYW1lLCBvYmplY3RzKSB7XG4gICAgY29uc3QgcGluTmFtZSA9IHRoaXMuZ2V0UGluTmFtZShuYW1lKTtcbiAgICBjb25zdCB0b1BpblByb21pc2VzID0gW107XG4gICAgY29uc3Qgb2JqZWN0S2V5cyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG9iamVjdHMpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2hpbGRyZW4ocGFyZW50KTtcbiAgICAgIGNvbnN0IHBhcmVudEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KHBhcmVudCk7XG4gICAgICBjb25zdCBqc29uID0gcGFyZW50Ll90b0Z1bGxKU09OKHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICBpZiAocGFyZW50Ll9sb2NhbElkKSB7XG4gICAgICAgIGpzb24uX2xvY2FsSWQgPSBwYXJlbnQuX2xvY2FsSWQ7XG4gICAgICB9XG4gICAgICBjaGlsZHJlbltwYXJlbnRLZXldID0ganNvbjtcbiAgICAgIGZvciAoY29uc3Qgb2JqZWN0S2V5IGluIGNoaWxkcmVuKSB7XG4gICAgICAgIG9iamVjdEtleXMucHVzaChvYmplY3RLZXkpO1xuICAgICAgICB0b1BpblByb21pc2VzLnB1c2godGhpcy5waW5XaXRoTmFtZShvYmplY3RLZXksIFtjaGlsZHJlbltvYmplY3RLZXldXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBmcm9tUGluUHJvbWlzZSA9IHRoaXMuZnJvbVBpbldpdGhOYW1lKHBpbk5hbWUpO1xuICAgIGNvbnN0IFtwaW5uZWRdID0gYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwoW2Zyb21QaW5Qcm9taXNlLCB0b1BpblByb21pc2VzXSk7XG4gICAgY29uc3QgdG9QaW4gPSBbLi4ubmV3IF9zZXQuZGVmYXVsdChbLi4uKHBpbm5lZCB8fCBbXSksIC4uLm9iamVjdEtleXNdKV07XG4gICAgcmV0dXJuIHRoaXMucGluV2l0aE5hbWUocGluTmFtZSwgdG9QaW4pO1xuICB9LFxuICAvLyBSZW1vdmVzIG9iamVjdCBhbmQgY2hpbGRyZW4ga2V5cyBmcm9tIHBpbiBuYW1lXG4gIC8vIEtlZXBzIHRoZSBvYmplY3QgYW5kIGNoaWxkcmVuIHBpbm5lZFxuICBhc3luYyBfaGFuZGxlVW5QaW5BbGxXaXRoTmFtZShuYW1lLCBvYmplY3RzKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBhd2FpdCB0aGlzLl9nZXRBbGxDb250ZW50cygpO1xuICAgIGNvbnN0IHBpbk5hbWUgPSB0aGlzLmdldFBpbk5hbWUobmFtZSk7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICBsZXQgb2JqZWN0S2V5cyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG9iamVjdHMpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2hpbGRyZW4ocGFyZW50KTtcbiAgICAgIGNvbnN0IHBhcmVudEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KHBhcmVudCk7XG4gICAgICBvYmplY3RLZXlzLnB1c2gocGFyZW50S2V5LCAuLi4oMCwgX2tleXMuZGVmYXVsdCkoY2hpbGRyZW4pKTtcbiAgICB9XG4gICAgb2JqZWN0S2V5cyA9IFsuLi5uZXcgX3NldC5kZWZhdWx0KG9iamVjdEtleXMpXTtcbiAgICBsZXQgcGlubmVkID0gbG9jYWxEYXRhc3RvcmVbcGluTmFtZV0gfHwgW107XG4gICAgcGlubmVkID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkocGlubmVkKS5jYWxsKHBpbm5lZCwgaXRlbSA9PiAhKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShvYmplY3RLZXlzKS5jYWxsKG9iamVjdEtleXMsIGl0ZW0pKTtcbiAgICBpZiAocGlubmVkLmxlbmd0aCA9PSAwKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHRoaXMudW5QaW5XaXRoTmFtZShwaW5OYW1lKSk7XG4gICAgICBkZWxldGUgbG9jYWxEYXRhc3RvcmVbcGluTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2VzLnB1c2godGhpcy5waW5XaXRoTmFtZShwaW5OYW1lLCBwaW5uZWQpKTtcbiAgICAgIGxvY2FsRGF0YXN0b3JlW3Bpbk5hbWVdID0gcGlubmVkO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9iamVjdEtleSBvZiBvYmplY3RLZXlzKSB7XG4gICAgICBsZXQgaGFzUmVmZXJlbmNlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbERhdGFzdG9yZSkge1xuICAgICAgICBpZiAoa2V5ID09PSBfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiB8fCAoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuUElOX1BSRUZJWCkpIHtcbiAgICAgICAgICBjb25zdCBwaW5uZWRPYmplY3RzID0gbG9jYWxEYXRhc3RvcmVba2V5XSB8fCBbXTtcbiAgICAgICAgICBpZiAoKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShwaW5uZWRPYmplY3RzKS5jYWxsKHBpbm5lZE9iamVjdHMsIG9iamVjdEtleSkpIHtcbiAgICAgICAgICAgIGhhc1JlZmVyZW5jZSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaGFzUmVmZXJlbmNlKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2godGhpcy51blBpbldpdGhOYW1lKG9iamVjdEtleSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMpO1xuICB9LFxuICAvLyBSZXRyaWV2ZSBhbGwgcG9pbnRlciBmaWVsZHMgZnJvbSBvYmplY3QgcmVjdXJzaXZlbHlcbiAgX2dldENoaWxkcmVuKG9iamVjdCkge1xuICAgIGNvbnN0IGVuY291bnRlcmVkID0ge307XG4gICAgY29uc3QganNvbiA9IG9iamVjdC5fdG9GdWxsSlNPTih1bmRlZmluZWQsIHRydWUpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGpzb24pIHtcbiAgICAgIGlmIChqc29uW2tleV0gJiYganNvbltrZXldLl9fdHlwZSAmJiBqc29uW2tleV0uX190eXBlID09PSAnT2JqZWN0Jykge1xuICAgICAgICB0aGlzLl90cmF2ZXJzZShqc29uW2tleV0sIGVuY291bnRlcmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuY291bnRlcmVkO1xuICB9LFxuICBfdHJhdmVyc2Uob2JqZWN0LCBlbmNvdW50ZXJlZCkge1xuICAgIGlmICghb2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9iamVjdEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdCk7XG4gICAgICBpZiAoZW5jb3VudGVyZWRbb2JqZWN0S2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbmNvdW50ZXJlZFtvYmplY3RLZXldID0gb2JqZWN0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGxldCBqc29uID0gb2JqZWN0W2tleV07XG4gICAgICBpZiAoIW9iamVjdFtrZXldKSB7XG4gICAgICAgIGpzb24gPSBvYmplY3Q7XG4gICAgICB9XG4gICAgICBpZiAoanNvbi5fX3R5cGUgJiYganNvbi5fX3R5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgICAgIHRoaXMuX3RyYXZlcnNlKGpzb24sIGVuY291bnRlcmVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vIFRyYW5zZm9ybSBrZXlzIGluIHBpbiBuYW1lIHRvIG9iamVjdHNcbiAgYXN5bmMgX3NlcmlhbGl6ZU9iamVjdHNGcm9tUGluTmFtZShuYW1lKSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gYXdhaXQgdGhpcy5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICBjb25zdCBhbGxPYmplY3RzID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgIGlmICgoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuT0JKRUNUX1BSRUZJWCkpIHtcbiAgICAgICAgYWxsT2JqZWN0cy5wdXNoKGxvY2FsRGF0YXN0b3JlW2tleV1bMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHJldHVybiBhbGxPYmplY3RzO1xuICAgIH1cbiAgICBjb25zdCBwaW5OYW1lID0gdGhpcy5nZXRQaW5OYW1lKG5hbWUpO1xuICAgIGNvbnN0IHBpbm5lZCA9IGxvY2FsRGF0YXN0b3JlW3Bpbk5hbWVdO1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKHBpbm5lZCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSAoMCwgX21hcC5kZWZhdWx0KShwaW5uZWQpLmNhbGwocGlubmVkLCBvYmplY3RLZXkgPT4gdGhpcy5mcm9tUGluV2l0aE5hbWUob2JqZWN0S2V5KSk7XG4gICAgbGV0IG9iamVjdHMgPSBhd2FpdCBfcHJvbWlzZS5kZWZhdWx0LmFsbChwcm9taXNlcyk7XG4gICAgb2JqZWN0cyA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0ID0gW10pLmNhbGwoX2NvbnRleHQsIC4uLm9iamVjdHMpO1xuICAgIHJldHVybiAoMCwgX2ZpbHRlci5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIG9iamVjdCA9PiBvYmplY3QgIT0gbnVsbCk7XG4gIH0sXG4gIC8vIFJlcGxhY2VzIG9iamVjdCBwb2ludGVycyB3aXRoIHBpbm5lZCBwb2ludGVyc1xuICAvLyBUaGUgb2JqZWN0IHBvaW50ZXJzIG1heSBjb250YWluIG9sZCBkYXRhXG4gIC8vIFVzZXMgQnJlYWR0aCBGaXJzdCBTZWFyY2ggQWxnb3JpdGhtXG4gIGFzeW5jIF9zZXJpYWxpemVPYmplY3Qob2JqZWN0S2V5LCBsb2NhbERhdGFzdG9yZSkge1xuICAgIGxldCBMRFMgPSBsb2NhbERhdGFzdG9yZTtcbiAgICBpZiAoIUxEUykge1xuICAgICAgTERTID0gYXdhaXQgdGhpcy5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICB9XG4gICAgaWYgKCFMRFNbb2JqZWN0S2V5XSB8fCBMRFNbb2JqZWN0S2V5XS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByb290ID0gTERTW29iamVjdEtleV1bMF07XG4gICAgY29uc3QgcXVldWUgPSBbXTtcbiAgICBjb25zdCBtZXRhID0ge307XG4gICAgbGV0IHVuaXF1ZUlkID0gMDtcbiAgICBtZXRhW3VuaXF1ZUlkXSA9IHJvb3Q7XG4gICAgcXVldWUucHVzaCh1bmlxdWVJZCk7XG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3Qgbm9kZUlkID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIGNvbnN0IHN1YlRyZWVSb290ID0gbWV0YVtub2RlSWRdO1xuICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBzdWJUcmVlUm9vdCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHN1YlRyZWVSb290W2ZpZWxkXTtcbiAgICAgICAgaWYgKHZhbHVlLl9fdHlwZSAmJiB2YWx1ZS5fX3R5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXlGb3JPYmplY3QodmFsdWUpO1xuICAgICAgICAgIGlmIChMRFNba2V5XSAmJiBMRFNba2V5XS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludGVyID0gTERTW2tleV1bMF07XG4gICAgICAgICAgICB1bmlxdWVJZCsrO1xuICAgICAgICAgICAgbWV0YVt1bmlxdWVJZF0gPSBwb2ludGVyO1xuICAgICAgICAgICAgc3ViVHJlZVJvb3RbZmllbGRdID0gcG9pbnRlcjtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2godW5pcXVlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfSxcbiAgLy8gQ2FsbGVkIHdoZW4gYW4gb2JqZWN0IGlzIHNhdmUgLyBmZXRjaGVkXG4gIC8vIFVwZGF0ZSBvYmplY3QgcGluIHZhbHVlXG4gIGFzeW5jIF91cGRhdGVPYmplY3RJZlBpbm5lZChvYmplY3QpIHtcbiAgICBpZiAoIXRoaXMuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdCk7XG4gICAgY29uc3QgcGlubmVkID0gYXdhaXQgdGhpcy5mcm9tUGluV2l0aE5hbWUob2JqZWN0S2V5KTtcbiAgICBpZiAoIXBpbm5lZCB8fCBwaW5uZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBpbldpdGhOYW1lKG9iamVjdEtleSwgW29iamVjdC5fdG9GdWxsSlNPTigpXSk7XG4gIH0sXG4gIC8vIENhbGxlZCB3aGVuIG9iamVjdCBpcyBkZXN0cm95ZWRcbiAgLy8gVW5waW4gb2JqZWN0IGFuZCByZW1vdmUgYWxsIHJlZmVyZW5jZXMgZnJvbSBwaW4gbmFtZXNcbiAgLy8gVE9ETzogRGVzdHJveSBjaGlsZHJlbj9cbiAgYXN5bmMgX2Rlc3Ryb3lPYmplY3RJZlBpbm5lZChvYmplY3QpIHtcbiAgICBpZiAoIXRoaXMuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gYXdhaXQgdGhpcy5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChvYmplY3QpO1xuICAgIGNvbnN0IHBpbiA9IGxvY2FsRGF0YXN0b3JlW29iamVjdEtleV07XG4gICAgaWYgKCFwaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbdGhpcy51blBpbldpdGhOYW1lKG9iamVjdEtleSldO1xuICAgIGRlbGV0ZSBsb2NhbERhdGFzdG9yZVtvYmplY3RLZXldO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsRGF0YXN0b3JlKSB7XG4gICAgICBpZiAoa2V5ID09PSBfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiB8fCAoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuUElOX1BSRUZJWCkpIHtcbiAgICAgICAgbGV0IHBpbm5lZCA9IGxvY2FsRGF0YXN0b3JlW2tleV0gfHwgW107XG4gICAgICAgIGlmICgoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKHBpbm5lZCkuY2FsbChwaW5uZWQsIG9iamVjdEtleSkpIHtcbiAgICAgICAgICBwaW5uZWQgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShwaW5uZWQpLmNhbGwocGlubmVkLCBpdGVtID0+IGl0ZW0gIT09IG9iamVjdEtleSk7XG4gICAgICAgICAgaWYgKHBpbm5lZC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnVuUGluV2l0aE5hbWUoa2V5KSk7XG4gICAgICAgICAgICBkZWxldGUgbG9jYWxEYXRhc3RvcmVba2V5XTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnBpbldpdGhOYW1lKGtleSwgcGlubmVkKSk7XG4gICAgICAgICAgICBsb2NhbERhdGFzdG9yZVtrZXldID0gcGlubmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMpO1xuICB9LFxuICAvLyBVcGRhdGUgcGluIGFuZCByZWZlcmVuY2VzIG9mIHRoZSB1bnNhdmVkIG9iamVjdFxuICBhc3luYyBfdXBkYXRlTG9jYWxJZEZvck9iamVjdChsb2NhbElkLCBvYmplY3QpIHtcbiAgICBpZiAoIXRoaXMuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsS2V5ID0gYCR7X0xvY2FsRGF0YXN0b3JlVXRpbHMuT0JKRUNUX1BSRUZJWH0ke29iamVjdC5jbGFzc05hbWV9XyR7bG9jYWxJZH1gO1xuICAgIGNvbnN0IG9iamVjdEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdCk7XG4gICAgY29uc3QgdW5zYXZlZCA9IGF3YWl0IHRoaXMuZnJvbVBpbldpdGhOYW1lKGxvY2FsS2V5KTtcbiAgICBpZiAoIXVuc2F2ZWQgfHwgdW5zYXZlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbdGhpcy51blBpbldpdGhOYW1lKGxvY2FsS2V5KSwgdGhpcy5waW5XaXRoTmFtZShvYmplY3RLZXksIHVuc2F2ZWQpXTtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IGF3YWl0IHRoaXMuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgIGlmIChrZXkgPT09IF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOIHx8ICgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCBfTG9jYWxEYXRhc3RvcmVVdGlscy5QSU5fUFJFRklYKSkge1xuICAgICAgICBsZXQgcGlubmVkID0gbG9jYWxEYXRhc3RvcmVba2V5XSB8fCBbXTtcbiAgICAgICAgaWYgKCgwLCBfaW5jbHVkZXMuZGVmYXVsdCkocGlubmVkKS5jYWxsKHBpbm5lZCwgbG9jYWxLZXkpKSB7XG4gICAgICAgICAgcGlubmVkID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkocGlubmVkKS5jYWxsKHBpbm5lZCwgaXRlbSA9PiBpdGVtICE9PSBsb2NhbEtleSk7XG4gICAgICAgICAgcGlubmVkLnB1c2gob2JqZWN0S2V5KTtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMucGluV2l0aE5hbWUoa2V5LCBwaW5uZWQpKTtcbiAgICAgICAgICBsb2NhbERhdGFzdG9yZVtrZXldID0gcGlubmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LmFsbChwcm9taXNlcyk7XG4gIH0sXG4gIC8qKlxuICAgKiBVcGRhdGVzIExvY2FsIERhdGFzdG9yZSBmcm9tIFNlcnZlclxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5Mb2NhbERhdGFzdG9yZS51cGRhdGVGcm9tU2VydmVyKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAZnVuY3Rpb24gdXBkYXRlRnJvbVNlcnZlclxuICAgKiBAbmFtZSBQYXJzZS5Mb2NhbERhdGFzdG9yZS51cGRhdGVGcm9tU2VydmVyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUZyb21TZXJ2ZXIoKSB7XG4gICAgdmFyIF9jb250ZXh0MjtcbiAgICBpZiAoIXRoaXMuY2hlY2tJZkVuYWJsZWQoKSB8fCB0aGlzLmlzU3luY2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IGF3YWl0IHRoaXMuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgY29uc3Qga2V5cyA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsRGF0YXN0b3JlKSB7XG4gICAgICBpZiAoKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIF9Mb2NhbERhdGFzdG9yZVV0aWxzLk9CSkVDVF9QUkVGSVgpKSB7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc1N5bmNpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHBvaW50ZXJzSGFzaCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIC8vIElnbm9yZSB0aGUgT0JKRUNUX1BSRUZJWFxuICAgICAgbGV0IFssLCBjbGFzc05hbWUsIG9iamVjdElkXSA9IGtleS5zcGxpdCgnXycpO1xuXG4gICAgICAvLyBVc2VyIGtleSBpcyBzcGxpdCBpbnRvIFsgJ1BhcnNlJywgJ0xEUycsICcnLCAnVXNlcicsICdvYmplY3RJZCcgXVxuICAgICAgaWYgKGtleS5zcGxpdCgnXycpLmxlbmd0aCA9PT0gNSAmJiBrZXkuc3BsaXQoJ18nKVszXSA9PT0gJ1VzZXInKSB7XG4gICAgICAgIGNsYXNzTmFtZSA9ICdfVXNlcic7XG4gICAgICAgIG9iamVjdElkID0ga2V5LnNwbGl0KCdfJylbNF07XG4gICAgICB9XG4gICAgICBpZiAoKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKG9iamVjdElkKS5jYWxsKG9iamVjdElkLCAnbG9jYWwnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKGNsYXNzTmFtZSBpbiBwb2ludGVyc0hhc2gpKSB7XG4gICAgICAgIHBvaW50ZXJzSGFzaFtjbGFzc05hbWVdID0gbmV3IF9zZXQuZGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgcG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0uYWRkKG9iamVjdElkKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlQcm9taXNlcyA9ICgwLCBfbWFwLmRlZmF1bHQpKF9jb250ZXh0MiA9ICgwLCBfa2V5cy5kZWZhdWx0KShwb2ludGVyc0hhc2gpKS5jYWxsKF9jb250ZXh0MiwgY2xhc3NOYW1lID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdElkcyA9ICgwLCBfZnJvbS5kZWZhdWx0KShwb2ludGVyc0hhc2hbY2xhc3NOYW1lXSk7XG4gICAgICBjb25zdCBxdWVyeSA9IG5ldyBfUGFyc2VRdWVyeS5kZWZhdWx0KGNsYXNzTmFtZSk7XG4gICAgICBxdWVyeS5saW1pdChvYmplY3RJZHMubGVuZ3RoKTtcbiAgICAgIGlmIChvYmplY3RJZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHF1ZXJ5LmVxdWFsVG8oJ29iamVjdElkJywgb2JqZWN0SWRzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5LmNvbnRhaW5lZEluKCdvYmplY3RJZCcsIG9iamVjdElkcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKDAsIF9maW5kLmRlZmF1bHQpKHF1ZXJ5KS5jYWxsKHF1ZXJ5KTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwocXVlcnlQcm9taXNlcyk7XG4gICAgICBjb25zdCBvYmplY3RzID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoW10pLmFwcGx5KFtdLCByZXNwb25zZXMpO1xuICAgICAgY29uc3QgcGluUHJvbWlzZXMgPSAoMCwgX21hcC5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIG9iamVjdCA9PiB7XG4gICAgICAgIGNvbnN0IG9iamVjdEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbldpdGhOYW1lKG9iamVjdEtleSwgb2JqZWN0Ll90b0Z1bGxKU09OKCkpO1xuICAgICAgfSk7XG4gICAgICBhd2FpdCBfcHJvbWlzZS5kZWZhdWx0LmFsbChwaW5Qcm9taXNlcyk7XG4gICAgICB0aGlzLmlzU3luY2luZyA9IGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzeW5jaW5nIExvY2FsRGF0YXN0b3JlOiAnLCBlcnJvcik7XG4gICAgICB0aGlzLmlzU3luY2luZyA9IGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdCkge1xuICAgIGNvbnN0IG9iamVjdElkID0gb2JqZWN0Lm9iamVjdElkIHx8IG9iamVjdC5fZ2V0SWQoKTtcbiAgICByZXR1cm4gYCR7X0xvY2FsRGF0YXN0b3JlVXRpbHMuT0JKRUNUX1BSRUZJWH0ke29iamVjdC5jbGFzc05hbWV9XyR7b2JqZWN0SWR9YDtcbiAgfSxcbiAgZ2V0UGluTmFtZShwaW5OYW1lKSB7XG4gICAgaWYgKCFwaW5OYW1lIHx8IHBpbk5hbWUgPT09IF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOKSB7XG4gICAgICByZXR1cm4gX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU47XG4gICAgfVxuICAgIHJldHVybiBfTG9jYWxEYXRhc3RvcmVVdGlscy5QSU5fUFJFRklYICsgcGluTmFtZTtcbiAgfSxcbiAgY2hlY2tJZkVuYWJsZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgY29uc29sZS5lcnJvcignUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0VuYWJsZWQ7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IExvY2FsRGF0YXN0b3JlO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gTG9jYWxEYXRhc3RvcmU7XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5kZWZhdWx0KTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldExvY2FsRGF0YXN0b3JlKExvY2FsRGF0YXN0b3JlKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfcmVkdWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9yZWR1Y2VcIikpO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9Mb2NhbERhdGFzdG9yZVV0aWxzID0gcmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVVdGlsc1wiKTtcbnZhciBfU3RvcmFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZVwiKSk7XG5jb25zdCBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jIGZyb21QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMobmFtZSk7XG4gICAgaWYgKCF2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0cyA9IEpTT04ucGFyc2UodmFsdWVzKTtcbiAgICByZXR1cm4gb2JqZWN0cztcbiAgfSxcbiAgcGluV2l0aE5hbWUobmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KSh2YWx1ZSk7XG4gICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQuc2V0SXRlbUFzeW5jKG5hbWUsIHZhbHVlcyk7XG4gIH0sXG4gIHVuUGluV2l0aE5hbWUobmFtZSkge1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnJlbW92ZUl0ZW1Bc3luYyhuYW1lKTtcbiAgfSxcbiAgYXN5bmMgZ2V0QWxsQ29udGVudHMoKSB7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0QWxsS2V5c0FzeW5jKCk7XG4gICAgcmV0dXJuICgwLCBfcmVkdWNlLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywgYXN5bmMgKHByZXZpb3VzUHJvbWlzZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBMRFMgPSBhd2FpdCBwcmV2aW91c1Byb21pc2U7XG4gICAgICBpZiAoKDAsIF9Mb2NhbERhdGFzdG9yZVV0aWxzLmlzTG9jYWxEYXRhc3RvcmVLZXkpKGtleSkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhrZXkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIExEU1trZXldID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0QWxsQ29udGVudHM6ICcsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIExEUztcbiAgICB9LCBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoe30pKTtcbiAgfSxcbiAgLy8gVXNlZCBmb3IgdGVzdGluZ1xuICBhc3luYyBnZXRSYXdTdG9yYWdlKCkge1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIHJldHVybiAoMCwgX3JlZHVjZS5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGFzeW5jIChwcmV2aW91c1Byb21pc2UsIGtleSkgPT4ge1xuICAgICAgY29uc3QgTERTID0gYXdhaXQgcHJldmlvdXNQcm9taXNlO1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhrZXkpO1xuICAgICAgTERTW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiBMRFM7XG4gICAgfSwgX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHt9KSk7XG4gIH0sXG4gIGFzeW5jIGNsZWFyKCkge1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCgwLCBfTG9jYWxEYXRhc3RvcmVVdGlscy5pc0xvY2FsRGF0YXN0b3JlS2V5KShrZXkpKSB7XG4gICAgICAgIHRvUmVtb3ZlLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSAoMCwgX21hcC5kZWZhdWx0KSh0b1JlbW92ZSkuY2FsbCh0b1JlbW92ZSwgdGhpcy51blBpbldpdGhOYW1lKTtcbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMpO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlXCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyLmRlZmF1bHRcIikpO1xubGV0IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlciA9IF9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIyLmRlZmF1bHQ7XG5tb2R1bGUuZXhwb3J0cyA9IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlVXRpbHMgPSByZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZVV0aWxzXCIpO1xudmFyIF9TdG9yYWdlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlXCIpKTtcbmNvbnN0IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlciA9IHtcbiAgYXN5bmMgZnJvbVBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5nZXRJdGVtQXN5bmMobmFtZSk7XG4gICAgaWYgKCF2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0cyA9IEpTT04ucGFyc2UodmFsdWVzKTtcbiAgICByZXR1cm4gb2JqZWN0cztcbiAgfSxcbiAgYXN5bmMgcGluV2l0aE5hbWUobmFtZSwgdmFsdWUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWVzID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkodmFsdWUpO1xuICAgICAgYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQuc2V0SXRlbUFzeW5jKG5hbWUsIHZhbHVlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gUXVvdGEgZXhjZWVkZWQsIHBvc3NpYmx5IGR1ZSB0byBTYWZhcmkgUHJpdmF0ZSBCcm93c2luZyBtb2RlXG4gICAgICBjb25zb2xlLmVycm9yKGUubWVzc2FnZSk7XG4gICAgfVxuICB9LFxuICB1blBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQucmVtb3ZlSXRlbUFzeW5jKG5hbWUpO1xuICB9LFxuICBhc3luYyBnZXRBbGxDb250ZW50cygpIHtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQuZ2V0QWxsS2V5c0FzeW5jKCk7XG4gICAgY29uc3QgYmF0Y2ggPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoKDAsIF9Mb2NhbERhdGFzdG9yZVV0aWxzLmlzTG9jYWxEYXRhc3RvcmVLZXkpKGtleSkpIHtcbiAgICAgICAgYmF0Y2gucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBMRFMgPSB7fTtcbiAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHRzID0gYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQubXVsdGlHZXQoYmF0Y2gpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZXRBbGxDb250ZW50czogJywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocmVzdWx0cykuY2FsbChyZXN1bHRzLCBwYWlyID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhaXI7XG4gICAgICB0cnkge1xuICAgICAgICBMRFNba2V5XSA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgTERTW2tleV0gPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBMRFM7XG4gIH0sXG4gIC8vIFVzZWQgZm9yIHRlc3RpbmdcbiAgYXN5bmMgZ2V0UmF3U3RvcmFnZSgpIHtcbiAgICB2YXIgX2NvbnRleHQ7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB7fTtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQubXVsdGlHZXQoa2V5cyk7XG4gICAgKDAsIF9tYXAuZGVmYXVsdCkoX2NvbnRleHQgPSByZXN1bHRzKS5jYWxsKF9jb250ZXh0LCBwYWlyID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhaXI7XG4gICAgICBzdG9yYWdlW2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3RvcmFnZTtcbiAgfSxcbiAgYXN5bmMgY2xlYXIoKSB7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIGNvbnN0IGJhdGNoID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKCgwLCBfTG9jYWxEYXRhc3RvcmVVdGlscy5pc0xvY2FsRGF0YXN0b3JlS2V5KShrZXkpKSB7XG4gICAgICAgIGJhdGNoLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQubXVsdGlSZW1vdmUoYmF0Y2gpLmNhdGNoKGVycm9yID0+IGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNsZWFyaW5nIGxvY2FsIGRhdGFzdG9yZTogJywgZXJyb3IpKTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlBJTl9QUkVGSVggPSBleHBvcnRzLk9CSkVDVF9QUkVGSVggPSBleHBvcnRzLkRFRkFVTFRfUElOID0gdm9pZCAwO1xuZXhwb3J0cy5pc0xvY2FsRGF0YXN0b3JlS2V5ID0gaXNMb2NhbERhdGFzdG9yZUtleTtcbnZhciBfc3RhcnRzV2l0aCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGhcIikpO1xuY29uc3QgREVGQVVMVF9QSU4gPSBleHBvcnRzLkRFRkFVTFRfUElOID0gJ19kZWZhdWx0JztcbmNvbnN0IFBJTl9QUkVGSVggPSBleHBvcnRzLlBJTl9QUkVGSVggPSAncGFyc2VQaW5fJztcbmNvbnN0IE9CSkVDVF9QUkVGSVggPSBleHBvcnRzLk9CSkVDVF9QUkVGSVggPSAnUGFyc2VfTERTXyc7XG5mdW5jdGlvbiBpc0xvY2FsRGF0YXN0b3JlS2V5KGtleSkge1xuICByZXR1cm4gISEoa2V5ICYmIChrZXkgPT09IERFRkFVTFRfUElOIHx8ICgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCBQSU5fUFJFRklYKSB8fCAoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgT0JKRUNUX1BSRUZJWCkpKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jb21taXRTZXJ2ZXJDaGFuZ2VzID0gY29tbWl0U2VydmVyQ2hhbmdlcztcbmV4cG9ydHMuZGVmYXVsdFN0YXRlID0gZGVmYXVsdFN0YXRlO1xuZXhwb3J0cy5lc3RpbWF0ZUF0dHJpYnV0ZSA9IGVzdGltYXRlQXR0cmlidXRlO1xuZXhwb3J0cy5lc3RpbWF0ZUF0dHJpYnV0ZXMgPSBlc3RpbWF0ZUF0dHJpYnV0ZXM7XG5leHBvcnRzLm1lcmdlRmlyc3RQZW5kaW5nU3RhdGUgPSBtZXJnZUZpcnN0UGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5wb3BQZW5kaW5nU3RhdGUgPSBwb3BQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnB1c2hQZW5kaW5nU3RhdGUgPSBwdXNoUGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5zZXRQZW5kaW5nT3AgPSBzZXRQZW5kaW5nT3A7XG5leHBvcnRzLnNldFNlcnZlckRhdGEgPSBzZXRTZXJ2ZXJEYXRhO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9lbmNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG52YXIgX1Rhc2tRdWV1ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVGFza1F1ZXVlXCIpKTtcbnZhciBfUGFyc2VPcCA9IHJlcXVpcmUoXCIuL1BhcnNlT3BcIik7XG5mdW5jdGlvbiBkZWZhdWx0U3RhdGUoKSB7XG4gIHJldHVybiB7XG4gICAgc2VydmVyRGF0YToge30sXG4gICAgcGVuZGluZ09wczogW3t9XSxcbiAgICBvYmplY3RDYWNoZToge30sXG4gICAgdGFza3M6IG5ldyBfVGFza1F1ZXVlLmRlZmF1bHQoKSxcbiAgICBleGlzdGVkOiBmYWxzZVxuICB9O1xufVxuZnVuY3Rpb24gc2V0U2VydmVyRGF0YShzZXJ2ZXJEYXRhLCBhdHRyaWJ1dGVzKSB7XG4gIGZvciAoY29uc3QgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzW2F0dHJdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgc2VydmVyRGF0YVthdHRyXSA9IGF0dHJpYnV0ZXNbYXR0cl07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBzZXJ2ZXJEYXRhW2F0dHJdO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0UGVuZGluZ09wKHBlbmRpbmdPcHMsIGF0dHIsIG9wKSB7XG4gIGNvbnN0IGxhc3QgPSBwZW5kaW5nT3BzLmxlbmd0aCAtIDE7XG4gIGlmIChvcCkge1xuICAgIHBlbmRpbmdPcHNbbGFzdF1bYXR0cl0gPSBvcDtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgcGVuZGluZ09wc1tsYXN0XVthdHRyXTtcbiAgfVxufVxuZnVuY3Rpb24gcHVzaFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKSB7XG4gIHBlbmRpbmdPcHMucHVzaCh7fSk7XG59XG5mdW5jdGlvbiBwb3BQZW5kaW5nU3RhdGUocGVuZGluZ09wcykge1xuICBjb25zdCBmaXJzdCA9IHBlbmRpbmdPcHMuc2hpZnQoKTtcbiAgaWYgKCFwZW5kaW5nT3BzLmxlbmd0aCkge1xuICAgIHBlbmRpbmdPcHNbMF0gPSB7fTtcbiAgfVxuICByZXR1cm4gZmlyc3Q7XG59XG5mdW5jdGlvbiBtZXJnZUZpcnN0UGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpIHtcbiAgY29uc3QgZmlyc3QgPSBwb3BQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG4gIGNvbnN0IG5leHQgPSBwZW5kaW5nT3BzWzBdO1xuICBmb3IgKGNvbnN0IGF0dHIgaW4gZmlyc3QpIHtcbiAgICBpZiAobmV4dFthdHRyXSAmJiBmaXJzdFthdHRyXSkge1xuICAgICAgY29uc3QgbWVyZ2VkID0gbmV4dFthdHRyXS5tZXJnZVdpdGgoZmlyc3RbYXR0cl0pO1xuICAgICAgaWYgKG1lcmdlZCkge1xuICAgICAgICBuZXh0W2F0dHJdID0gbWVyZ2VkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0W2F0dHJdID0gZmlyc3RbYXR0cl07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlc3RpbWF0ZUF0dHJpYnV0ZShzZXJ2ZXJEYXRhLCBwZW5kaW5nT3BzLCBvYmplY3QsIGF0dHIpIHtcbiAgbGV0IHZhbHVlID0gc2VydmVyRGF0YVthdHRyXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwZW5kaW5nT3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHBlbmRpbmdPcHNbaV1bYXR0cl0pIHtcbiAgICAgIGlmIChwZW5kaW5nT3BzW2ldW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlT3AuUmVsYXRpb25PcCkge1xuICAgICAgICBpZiAob2JqZWN0LmlkKSB7XG4gICAgICAgICAgdmFsdWUgPSBwZW5kaW5nT3BzW2ldW2F0dHJdLmFwcGx5VG8odmFsdWUsIG9iamVjdCwgYXR0cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gcGVuZGluZ09wc1tpXVthdHRyXS5hcHBseVRvKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gZXN0aW1hdGVBdHRyaWJ1dGVzKHNlcnZlckRhdGEsIHBlbmRpbmdPcHMsIG9iamVjdCkge1xuICBjb25zdCBkYXRhID0ge307XG4gIGZvciAodmFyIGF0dHIgaW4gc2VydmVyRGF0YSkge1xuICAgIGRhdGFbYXR0cl0gPSBzZXJ2ZXJEYXRhW2F0dHJdO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZ09wcy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAoYXR0ciBpbiBwZW5kaW5nT3BzW2ldKSB7XG4gICAgICBpZiAocGVuZGluZ09wc1tpXVthdHRyXSBpbnN0YW5jZW9mIF9QYXJzZU9wLlJlbGF0aW9uT3ApIHtcbiAgICAgICAgaWYgKG9iamVjdC5pZCkge1xuICAgICAgICAgIGRhdGFbYXR0cl0gPSBwZW5kaW5nT3BzW2ldW2F0dHJdLmFwcGx5VG8oZGF0YVthdHRyXSwgb2JqZWN0LCBhdHRyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCgwLCBfaW5jbHVkZXMuZGVmYXVsdCkoYXR0cikuY2FsbChhdHRyLCAnLicpKSB7XG4gICAgICAgICAgLy8gc2ltaWxhciB0byBuZXN0ZWRTZXQgZnVuY3Rpb25cbiAgICAgICAgICBjb25zdCBmaWVsZHMgPSBhdHRyLnNwbGl0KCcuJyk7XG4gICAgICAgICAgY29uc3QgbGFzdCA9IGZpZWxkc1tmaWVsZHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgbGV0IG9iamVjdCA9IGRhdGE7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBmaWVsZHNbaV07XG4gICAgICAgICAgICBpZiAoIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXh0S2V5ID0gZmllbGRzW2kgKyAxXTtcbiAgICAgICAgICAgICAgaWYgKCFpc05hTihuZXh0S2V5KSkge1xuICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gW107XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IFsuLi5vYmplY3Rba2V5XV07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAuLi5vYmplY3Rba2V5XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3RbbGFzdF0gPSBwZW5kaW5nT3BzW2ldW2F0dHJdLmFwcGx5VG8ob2JqZWN0W2xhc3RdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhW2F0dHJdID0gcGVuZGluZ09wc1tpXVthdHRyXS5hcHBseVRvKGRhdGFbYXR0cl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEFsbG93cyBzZXR0aW5nIHByb3BlcnRpZXMvdmFyaWFibGVzIGRlZXAgaW4gYW4gb2JqZWN0LlxuICogQ29udmVydHMgYS5iIGludG8geyBhOiB7IGI6IHZhbHVlIH0gfSBmb3IgZG90IG5vdGF0aW9uIG9uIE9iamVjdHNcbiAqIENvbnZlcnRzIGEuMC5iIGludG8geyBhOiBbeyBiOiB2YWx1ZSB9XSB9IGZvciBkb3Qgbm90YXRpb24gb24gQXJyYXlzXG4gKlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGFzc2lnbiB0aGUgdmFsdWUgdG9cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBhc3NpZ24uIElmIGl0J3MgaW4gYSBkZWVwZXIgcGF0aCwgdGhlbiB1c2UgZG90IG5vdGF0aW9uIChgcHJvcDEucHJvcDIucHJvcDNgKVxuICogTm90ZSB0aGF0IGludGVybWVkaWF0ZSBvYmplY3QocykgaW4gdGhlIG5lc3RlZCBwYXRoIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaWYgdGhleSBkb24ndCBleGlzdC5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLiBJZiBpdCdzIGFuIGB1bmRlZmluZWRgIHRoZW4gdGhlIGtleSBpcyBkZWxldGVkLlxuICovXG5mdW5jdGlvbiBuZXN0ZWRTZXQob2JqLCBrZXksIHZhbHVlKSB7XG4gIGNvbnN0IHBhdGhzID0ga2V5LnNwbGl0KCcuJyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgcGF0aCA9IHBhdGhzW2ldO1xuICAgIGlmICghKHBhdGggaW4gb2JqKSkge1xuICAgICAgY29uc3QgbmV4dFBhdGggPSBwYXRoc1tpICsgMV07XG4gICAgICBpZiAoIWlzTmFOKG5leHRQYXRoKSkge1xuICAgICAgICBvYmpbcGF0aF0gPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtwYXRoXSA9IHt9O1xuICAgICAgfVxuICAgIH1cbiAgICBvYmogPSBvYmpbcGF0aF07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkZWxldGUgb2JqW3BhdGhzW3BhdGhzLmxlbmd0aCAtIDFdXTtcbiAgfSBlbHNlIHtcbiAgICBvYmpbcGF0aHNbcGF0aHMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNvbW1pdFNlcnZlckNoYW5nZXMoc2VydmVyRGF0YSwgb2JqZWN0Q2FjaGUsIGNoYW5nZXMpIHtcbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBmb3IgKGNvbnN0IGF0dHIgaW4gY2hhbmdlcykge1xuICAgIGNvbnN0IHZhbCA9IGNoYW5nZXNbYXR0cl07XG4gICAgbmVzdGVkU2V0KHNlcnZlckRhdGEsIGF0dHIsIHZhbCk7XG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhKHZhbCBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSAmJiAhKHZhbCBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCkgJiYgISh2YWwgaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSkge1xuICAgICAgY29uc3QganNvbiA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHZhbCwgZmFsc2UsIHRydWUpO1xuICAgICAgb2JqZWN0Q2FjaGVbYXR0cl0gPSAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShqc29uKTtcbiAgICB9XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfZmlsdGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maWx0ZXJcIikpO1xudmFyIF9zbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc2xpY2VcIikpO1xudmFyIF9pc0ludGVnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL251bWJlci9pcy1pbnRlZ2VyXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfZXF1YWxzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lcXVhbHNcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZVBvbHlnb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUG9seWdvblwiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xuLyoqXG4gKiBjb250YWlucyAtLSBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBjb250YWluZWQgaW4gYSBsaXN0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgUGFyc2UgcG9pbnRlcnMuXG4gKlxuICogQHBhcmFtIGhheXN0YWNrXG4gKiBAcGFyYW0gbmVlZGxlXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zKGhheXN0YWNrLCBuZWVkbGUpIHtcbiAgaWYgKG5lZWRsZSAmJiBuZWVkbGUuX190eXBlICYmIChuZWVkbGUuX190eXBlID09PSAnUG9pbnRlcicgfHwgbmVlZGxlLl9fdHlwZSA9PT0gJ09iamVjdCcpKSB7XG4gICAgZm9yIChjb25zdCBpIGluIGhheXN0YWNrKSB7XG4gICAgICBjb25zdCBwdHIgPSBoYXlzdGFja1tpXTtcbiAgICAgIGlmICh0eXBlb2YgcHRyID09PSAnc3RyaW5nJyAmJiBwdHIgPT09IG5lZWRsZS5vYmplY3RJZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwdHIuY2xhc3NOYW1lID09PSBuZWVkbGUuY2xhc3NOYW1lICYmIHB0ci5vYmplY3RJZCA9PT0gbmVlZGxlLm9iamVjdElkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShuZWVkbGUpKSB7XG4gICAgZm9yIChjb25zdCBuZWVkIG9mIG5lZWRsZSkge1xuICAgICAgaWYgKGNvbnRhaW5zKGhheXN0YWNrLCBuZWVkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuICgwLCBfaW5kZXhPZi5kZWZhdWx0KShoYXlzdGFjaykuY2FsbChoYXlzdGFjaywgbmVlZGxlKSA+IC0xO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtT2JqZWN0KG9iamVjdCkge1xuICBpZiAob2JqZWN0Ll90b0Z1bGxKU09OKSB7XG4gICAgcmV0dXJuIG9iamVjdC5fdG9GdWxsSlNPTigpO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbi8qKlxuICogbWF0Y2hlc1F1ZXJ5IC0tIERldGVybWluZXMgaWYgYW4gb2JqZWN0IHdvdWxkIGJlIHJldHVybmVkIGJ5IGEgUGFyc2UgUXVlcnlcbiAqIEl0J3MgYSBsaWdodHdlaWdodCwgd2hlcmUtY2xhdXNlIG9ubHkgaW1wbGVtZW50YXRpb24gb2YgYSBmdWxsIHF1ZXJ5IGVuZ2luZS5cbiAqIFNpbmNlIHdlIGZpbmQgcXVlcmllcyB0aGF0IG1hdGNoIG9iamVjdHMsIHJhdGhlciB0aGFuIG9iamVjdHMgdGhhdCBtYXRjaFxuICogcXVlcmllcywgd2UgY2FuIGF2b2lkIGJ1aWxkaW5nIGEgZnVsbC1ibG93biBxdWVyeSB0b29sLlxuICpcbiAqIEBwYXJhbSBjbGFzc05hbWVcbiAqIEBwYXJhbSBvYmplY3RcbiAqIEBwYXJhbSBvYmplY3RzXG4gKiBAcGFyYW0gcXVlcnlcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1F1ZXJ5KGNsYXNzTmFtZSwgb2JqZWN0LCBvYmplY3RzLCBxdWVyeSkge1xuICBpZiAob2JqZWN0LmNsYXNzTmFtZSAhPT0gY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBvYmogPSBvYmplY3Q7XG4gIGxldCBxID0gcXVlcnk7XG4gIGlmIChvYmplY3QudG9KU09OKSB7XG4gICAgb2JqID0gb2JqZWN0LnRvSlNPTigpO1xuICB9XG4gIGlmIChxdWVyeS50b0pTT04pIHtcbiAgICBxID0gcXVlcnkudG9KU09OKCkud2hlcmU7XG4gIH1cbiAgb2JqLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgZm9yIChjb25zdCBmaWVsZCBpbiBxKSB7XG4gICAgaWYgKCFtYXRjaGVzS2V5Q29uc3RyYWludHMoY2xhc3NOYW1lLCBvYmosIG9iamVjdHMsIGZpZWxkLCBxW2ZpZWxkXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBlcXVhbE9iamVjdHNHZW5lcmljKG9iaiwgY29tcGFyZVRvLCBlcWxGbikge1xuICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9iaikpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGVxbEZuKG9ialtpXSwgY29tcGFyZVRvKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBlcWxGbihvYmosIGNvbXBhcmVUbyk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgUmVsYXRpdmVUaW1lVG9EYXRlUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RhdHVzIFRoZSBjb252ZXJzaW9uIHN0YXR1cywgYGVycm9yYCBpZiBjb252ZXJzaW9uIGZhaWxlZCBvclxuICogYHN1Y2Nlc3NgIGlmIGNvbnZlcnNpb24gc3VjY2VlZGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGluZm8gVGhlIGVycm9yIG1lc3NhZ2UgaWYgY29udmVyc2lvbiBmYWlsZWQsIG9yIHRoZSByZWxhdGl2ZVxuICogdGltZSBpbmRpY2F0aW9uIChgcGFzdGAsIGBwcmVzZW50YCwgYGZ1dHVyZWApIGlmIGNvbnZlcnNpb24gc3VjY2VlZGVkLlxuICogQHByb3BlcnR5IHtEYXRlfHVuZGVmaW5lZH0gcmVzdWx0IFRoZSBjb252ZXJ0ZWQgZGF0ZSwgb3IgYHVuZGVmaW5lZGAgaWYgY29udmVyc2lvblxuICogZmFpbGVkLlxuICovXG4vKipcbiAqIENvbnZlcnRzIGh1bWFuIHJlYWRhYmxlIHJlbGF0aXZlIGRhdGUgc3RyaW5nLCBmb3IgZXhhbXBsZSwgJ2luIDEwIGRheXMnIHRvIGEgZGF0ZVxuICogcmVsYXRpdmUgdG8gbm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0ge0RhdGV9IFtub3ddIFRoZSBkYXRlIGZyb20gd2hpY2ggYWRkIG9yIHN1YnRyYWN0LiBEZWZhdWx0IGlzIG5vdy5cbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWVUb0RhdGVSZXN1bHR9XG4gKi9cbmZ1bmN0aW9uIHJlbGF0aXZlVGltZVRvRGF0ZSh0ZXh0KSB7XG4gIGxldCBub3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG5ldyBEYXRlKCk7XG4gIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGxldCBwYXJ0cyA9IHRleHQuc3BsaXQoJyAnKTtcblxuICAvLyBGaWx0ZXIgb3V0IHdoaXRlc3BhY2VcbiAgcGFydHMgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShwYXJ0cykuY2FsbChwYXJ0cywgcGFydCA9PiBwYXJ0ICE9PSAnJyk7XG4gIGNvbnN0IGZ1dHVyZSA9IHBhcnRzWzBdID09PSAnaW4nO1xuICBjb25zdCBwYXN0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPT09ICdhZ28nO1xuICBpZiAoIWZ1dHVyZSAmJiAhcGFzdCAmJiB0ZXh0ICE9PSAnbm93Jykge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBpbmZvOiBcIlRpbWUgc2hvdWxkIGVpdGhlciBzdGFydCB3aXRoICdpbicgb3IgZW5kIHdpdGggJ2FnbydcIlxuICAgIH07XG4gIH1cbiAgaWYgKGZ1dHVyZSAmJiBwYXN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIGluZm86IFwiVGltZSBjYW5ub3QgaGF2ZSBib3RoICdpbicgYW5kICdhZ28nXCJcbiAgICB9O1xuICB9XG5cbiAgLy8gc3RyaXAgdGhlICdhZ28nIG9yICdpbidcbiAgaWYgKGZ1dHVyZSkge1xuICAgIHBhcnRzID0gKDAsIF9zbGljZS5kZWZhdWx0KShwYXJ0cykuY2FsbChwYXJ0cywgMSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcGFzdFxuICAgIHBhcnRzID0gKDAsIF9zbGljZS5kZWZhdWx0KShwYXJ0cykuY2FsbChwYXJ0cywgMCwgcGFydHMubGVuZ3RoIC0gMSk7XG4gIH1cbiAgaWYgKHBhcnRzLmxlbmd0aCAlIDIgIT09IDAgJiYgdGV4dCAhPT0gJ25vdycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgaW5mbzogJ0ludmFsaWQgdGltZSBzdHJpbmcuIERhbmdsaW5nIHVuaXQgb3IgbnVtYmVyLidcbiAgICB9O1xuICB9XG4gIGNvbnN0IHBhaXJzID0gW107XG4gIHdoaWxlIChwYXJ0cy5sZW5ndGgpIHtcbiAgICBwYWlycy5wdXNoKFtwYXJ0cy5zaGlmdCgpLCBwYXJ0cy5zaGlmdCgpXSk7XG4gIH1cbiAgbGV0IHNlY29uZHMgPSAwO1xuICBmb3IgKGNvbnN0IFtudW0sIGludGVydmFsXSBvZiBwYWlycykge1xuICAgIGNvbnN0IHZhbCA9IE51bWJlcihudW0pO1xuICAgIGlmICghKDAsIF9pc0ludGVnZXIuZGVmYXVsdCkodmFsKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICBpbmZvOiBgJyR7bnVtfScgaXMgbm90IGFuIGludGVnZXIuYFxuICAgICAgfTtcbiAgICB9XG4gICAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgICAgY2FzZSAneXInOlxuICAgICAgY2FzZSAneXJzJzpcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICBzZWNvbmRzICs9IHZhbCAqIDMxNTM2MDAwOyAvLyAzNjUgKiAyNCAqIDYwICogNjBcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3ayc6XG4gICAgICBjYXNlICd3a3MnOlxuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgIHNlY29uZHMgKz0gdmFsICogNjA0ODAwOyAvLyA3ICogMjQgKiA2MCAqIDYwXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZCc6XG4gICAgICBjYXNlICdkYXknOlxuICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIHNlY29uZHMgKz0gdmFsICogODY0MDA7IC8vIDI0ICogNjAgKiA2MFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ2hycyc6XG4gICAgICBjYXNlICdob3VyJzpcbiAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgc2Vjb25kcyArPSB2YWwgKiAzNjAwOyAvLyA2MCAqIDYwXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWluJzpcbiAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBzZWNvbmRzICs9IHZhbCAqIDYwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlYyc6XG4gICAgICBjYXNlICdzZWNzJzpcbiAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgc2Vjb25kcyArPSB2YWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgaW5mbzogYEludmFsaWQgaW50ZXJ2YWw6ICcke2ludGVydmFsfSdgXG4gICAgICAgIH07XG4gICAgfVxuICB9XG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IHNlY29uZHMgKiAxMDAwO1xuICBpZiAoZnV0dXJlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgaW5mbzogJ2Z1dHVyZScsXG4gICAgICByZXN1bHQ6IG5ldyBEYXRlKG5vdy52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMpXG4gICAgfTtcbiAgfSBlbHNlIGlmIChwYXN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgaW5mbzogJ3Bhc3QnLFxuICAgICAgcmVzdWx0OiBuZXcgRGF0ZShub3cudmFsdWVPZigpIC0gbWlsbGlzZWNvbmRzKVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgaW5mbzogJ3ByZXNlbnQnLFxuICAgICAgcmVzdWx0OiBuZXcgRGF0ZShub3cudmFsdWVPZigpKVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gb2JqZWN0IG1hdGNoZXMgYSBzaW5nbGUga2V5J3MgY29uc3RyYWludHNcbiAqXG4gKiBAcGFyYW0gY2xhc3NOYW1lXG4gKiBAcGFyYW0gb2JqZWN0XG4gKiBAcGFyYW0gb2JqZWN0c1xuICogQHBhcmFtIGtleVxuICogQHBhcmFtIGNvbnN0cmFpbnRzXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNLZXlDb25zdHJhaW50cyhjbGFzc05hbWUsIG9iamVjdCwgb2JqZWN0cywga2V5LCBjb25zdHJhaW50cykge1xuICBpZiAoY29uc3RyYWludHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCAnLicpID49IDApIHtcbiAgICAvLyBLZXkgcmVmZXJlbmNlcyBhIHN1Ym9iamVjdFxuICAgIGNvbnN0IGtleUNvbXBvbmVudHMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICBjb25zdCBzdWJPYmplY3RLZXkgPSBrZXlDb21wb25lbnRzWzBdO1xuICAgIGNvbnN0IGtleVJlbWFpbmRlciA9ICgwLCBfc2xpY2UuZGVmYXVsdCkoa2V5Q29tcG9uZW50cykuY2FsbChrZXlDb21wb25lbnRzLCAxKS5qb2luKCcuJyk7XG4gICAgcmV0dXJuIG1hdGNoZXNLZXlDb25zdHJhaW50cyhjbGFzc05hbWUsIG9iamVjdFtzdWJPYmplY3RLZXldIHx8IHt9LCBvYmplY3RzLCBrZXlSZW1haW5kZXIsIGNvbnN0cmFpbnRzKTtcbiAgfVxuICBsZXQgaTtcbiAgaWYgKGtleSA9PT0gJyRvcicpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChtYXRjaGVzUXVlcnkoY2xhc3NOYW1lLCBvYmplY3QsIG9iamVjdHMsIGNvbnN0cmFpbnRzW2ldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09ICckYW5kJykge1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFtYXRjaGVzUXVlcnkoY2xhc3NOYW1lLCBvYmplY3QsIG9iamVjdHMsIGNvbnN0cmFpbnRzW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChrZXkgPT09ICckbm9yJykge1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG1hdGNoZXNRdWVyeShjbGFzc05hbWUsIG9iamVjdCwgb2JqZWN0cywgY29uc3RyYWludHNbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGtleSA9PT0gJyRyZWxhdGVkVG8nKSB7XG4gICAgLy8gQmFpbCEgV2UgY2FuJ3QgaGFuZGxlIHJlbGF0aW9uYWwgcXVlcmllcyBsb2NhbGx5XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghL15bQS1aYS16XVswLTlBLVphLXpfXSokLy50ZXN0KGtleSkpIHtcbiAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfS0VZX05BTUUsIGBJbnZhbGlkIEtleTogJHtrZXl9YCk7XG4gIH1cbiAgLy8gRXF1YWxpdHkgKG9yIEFycmF5IGNvbnRhaW5zKSBjYXNlc1xuICBpZiAodHlwZW9mIGNvbnN0cmFpbnRzICE9PSAnb2JqZWN0Jykge1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkob2JqZWN0W2tleV0pKSB7XG4gICAgICB2YXIgX2NvbnRleHQ7XG4gICAgICByZXR1cm4gKDAsIF9pbmRleE9mLmRlZmF1bHQpKF9jb250ZXh0ID0gb2JqZWN0W2tleV0pLmNhbGwoX2NvbnRleHQsIGNvbnN0cmFpbnRzKSA+IC0xO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IGNvbnN0cmFpbnRzO1xuICB9XG4gIGxldCBjb21wYXJlVG87XG4gIGlmIChjb25zdHJhaW50cy5fX3R5cGUpIHtcbiAgICBpZiAoY29uc3RyYWludHMuX190eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgIHJldHVybiBlcXVhbE9iamVjdHNHZW5lcmljKG9iamVjdFtrZXldLCBjb25zdHJhaW50cywgZnVuY3Rpb24gKG9iaiwgcHRyKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygb2JqICE9PSAndW5kZWZpbmVkJyAmJiBwdHIuY2xhc3NOYW1lID09PSBvYmouY2xhc3NOYW1lICYmIHB0ci5vYmplY3RJZCA9PT0gb2JqLm9iamVjdElkO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBlcXVhbE9iamVjdHNHZW5lcmljKCgwLCBfZGVjb2RlLmRlZmF1bHQpKG9iamVjdFtrZXldKSwgKDAsIF9kZWNvZGUuZGVmYXVsdCkoY29uc3RyYWludHMpLCBfZXF1YWxzLmRlZmF1bHQpO1xuICB9XG4gIC8vIE1vcmUgY29tcGxleCBjYXNlc1xuICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBpbiBjb25zdHJhaW50cykge1xuICAgIGNvbXBhcmVUbyA9IGNvbnN0cmFpbnRzW2NvbmRpdGlvbl07XG4gICAgaWYgKGNvbXBhcmVUbz8uX190eXBlKSB7XG4gICAgICBjb21wYXJlVG8gPSAoMCwgX2RlY29kZS5kZWZhdWx0KShjb21wYXJlVG8pO1xuICAgIH1cbiAgICAvLyBpcyBpdCBhICRyZWxhdGl2ZVRpbWU/IGNvbnZlcnQgdG8gZGF0ZVxuICAgIGlmIChjb21wYXJlVG8/LlsnJHJlbGF0aXZlVGltZSddKSB7XG4gICAgICBjb25zdCBwYXJzZXJSZXN1bHQgPSByZWxhdGl2ZVRpbWVUb0RhdGUoY29tcGFyZVRvWyckcmVsYXRpdmVUaW1lJ10pO1xuICAgICAgaWYgKHBhcnNlclJlc3VsdC5zdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfSlNPTiwgYGJhZCAkcmVsYXRpdmVUaW1lICgke2tleX0pIHZhbHVlLiAke3BhcnNlclJlc3VsdC5pbmZvfWApO1xuICAgICAgfVxuICAgICAgY29tcGFyZVRvID0gcGFyc2VyUmVzdWx0LnJlc3VsdDtcbiAgICB9XG4gICAgLy8gQ29tcGFyZSBEYXRlIE9iamVjdCBvciBEYXRlIFN0cmluZ1xuICAgIGlmICh0b1N0cmluZy5jYWxsKGNvbXBhcmVUbykgPT09ICdbb2JqZWN0IERhdGVdJyB8fCB0eXBlb2YgY29tcGFyZVRvID09PSAnc3RyaW5nJyAmJlxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBuZXcgRGF0ZShjb21wYXJlVG8pICE9PSAnSW52YWxpZCBEYXRlJyAmJlxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICAhaXNOYU4obmV3IERhdGUoY29tcGFyZVRvKSkpIHtcbiAgICAgIG9iamVjdFtrZXldID0gbmV3IERhdGUob2JqZWN0W2tleV0uaXNvID8gb2JqZWN0W2tleV0uaXNvIDogb2JqZWN0W2tleV0pO1xuICAgIH1cbiAgICBzd2l0Y2ggKGNvbmRpdGlvbikge1xuICAgICAgY2FzZSAnJGx0JzpcbiAgICAgICAgaWYgKG9iamVjdFtrZXldID49IGNvbXBhcmVUbykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRsdGUnOlxuICAgICAgICBpZiAob2JqZWN0W2tleV0gPiBjb21wYXJlVG8pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckZ3QnOlxuICAgICAgICBpZiAob2JqZWN0W2tleV0gPD0gY29tcGFyZVRvKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGd0ZSc6XG4gICAgICAgIGlmIChvYmplY3Rba2V5XSA8IGNvbXBhcmVUbykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRuZSc6XG4gICAgICAgIGlmICgoMCwgX2VxdWFscy5kZWZhdWx0KShvYmplY3Rba2V5XSwgY29tcGFyZVRvKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRpbic6XG4gICAgICAgIGlmICghY29udGFpbnMoY29tcGFyZVRvLCBvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckbmluJzpcbiAgICAgICAgaWYgKGNvbnRhaW5zKGNvbXBhcmVUbywgb2JqZWN0W2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGFsbCc6XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wYXJlVG8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgX2NvbnRleHQyO1xuICAgICAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoX2NvbnRleHQyID0gb2JqZWN0W2tleV0pLmNhbGwoX2NvbnRleHQyLCBjb21wYXJlVG9baV0pIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRleGlzdHMnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlFeGlzdHMgPSB0eXBlb2Ygb2JqZWN0W2tleV0gIT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgIGNvbnN0IGV4aXN0ZW5jZUlzUmVxdWlyZWQgPSBjb25zdHJhaW50c1snJGV4aXN0cyddO1xuICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RyYWludHNbJyRleGlzdHMnXSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAvLyBUaGUgU0RLIHdpbGwgbmV2ZXIgc3VibWl0IGEgbm9uLWJvb2xlYW4gZm9yICRleGlzdHMsIGJ1dCBpZiBzb21lb25lXG4gICAgICAgICAgICAvLyB0cmllcyB0byBzdWJtaXQgYSBub24tYm9vbGVhbiBmb3IgJGV4aXRzIG91dHNpZGUgdGhlIFNES3MsIGp1c3QgaWdub3JlIGl0LlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcHJvcGVydHlFeGlzdHMgJiYgZXhpc3RlbmNlSXNSZXF1aXJlZCB8fCBwcm9wZXJ0eUV4aXN0cyAmJiAhZXhpc3RlbmNlSXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJHJlZ2V4JzpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29tcGFyZVRvID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVUby50ZXN0KG9iamVjdFtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSlMgZG9lc24ndCBzdXBwb3J0IHBlcmwtc3R5bGUgZXNjYXBpbmdcbiAgICAgICAgICBsZXQgZXhwU3RyaW5nID0gJyc7XG4gICAgICAgICAgbGV0IGVzY2FwZUVuZCA9IC0yO1xuICAgICAgICAgIGxldCBlc2NhcGVTdGFydCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShjb21wYXJlVG8pLmNhbGwoY29tcGFyZVRvLCAnXFxcXFEnKTtcbiAgICAgICAgICB3aGlsZSAoZXNjYXBlU3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSB1bmVzY2FwZWQgcG9ydGlvblxuICAgICAgICAgICAgZXhwU3RyaW5nICs9IGNvbXBhcmVUby5zdWJzdHJpbmcoZXNjYXBlRW5kICsgMiwgZXNjYXBlU3RhcnQpO1xuICAgICAgICAgICAgZXNjYXBlRW5kID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKGNvbXBhcmVUbykuY2FsbChjb21wYXJlVG8sICdcXFxcRScsIGVzY2FwZVN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChlc2NhcGVFbmQgPiAtMSkge1xuICAgICAgICAgICAgICBleHBTdHJpbmcgKz0gY29tcGFyZVRvLnN1YnN0cmluZyhlc2NhcGVTdGFydCArIDIsIGVzY2FwZUVuZCkucmVwbGFjZSgvXFxcXFxcXFxcXFxcXFxcXEUvZywgJ1xcXFxFJykucmVwbGFjZSgvXFxXL2csICdcXFxcJCYnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVzY2FwZVN0YXJ0ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKGNvbXBhcmVUbykuY2FsbChjb21wYXJlVG8sICdcXFxcUScsIGVzY2FwZUVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4cFN0cmluZyArPSBjb21wYXJlVG8uc3Vic3RyaW5nKE1hdGgubWF4KGVzY2FwZVN0YXJ0LCBlc2NhcGVFbmQgKyAyKSk7XG4gICAgICAgICAgbGV0IG1vZGlmaWVycyA9IGNvbnN0cmFpbnRzLiRvcHRpb25zIHx8ICcnO1xuICAgICAgICAgIG1vZGlmaWVycyA9IG1vZGlmaWVycy5yZXBsYWNlKCd4JywgJycpLnJlcGxhY2UoJ3MnLCAnJyk7XG4gICAgICAgICAgLy8gUGFyc2UgU2VydmVyIC8gTW9uZ28gc3VwcG9ydCB4IGFuZCBzIG1vZGlmaWVycyBidXQgSlMgUmVnRXhwIGRvZXNuJ3RcbiAgICAgICAgICBjb25zdCBleHAgPSBuZXcgUmVnRXhwKGV4cFN0cmluZywgbW9kaWZpZXJzKTtcbiAgICAgICAgICBpZiAoIWV4cC50ZXN0KG9iamVjdFtrZXldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJG5lYXJTcGhlcmUnOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCFjb21wYXJlVG8gfHwgIW9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gY29tcGFyZVRvLnJhZGlhbnNUbyhvYmplY3Rba2V5XSk7XG4gICAgICAgICAgY29uc3QgbWF4ID0gY29uc3RyYWludHMuJG1heERpc3RhbmNlIHx8IEluZmluaXR5O1xuICAgICAgICAgIHJldHVybiBkaXN0YW5jZSA8PSBtYXg7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyR3aXRoaW4nOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCFjb21wYXJlVG8gfHwgIW9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNvdXRoV2VzdCA9IGNvbXBhcmVUby4kYm94WzBdO1xuICAgICAgICAgIGNvbnN0IG5vcnRoRWFzdCA9IGNvbXBhcmVUby4kYm94WzFdO1xuICAgICAgICAgIGlmIChzb3V0aFdlc3QubGF0aXR1ZGUgPiBub3J0aEVhc3QubGF0aXR1ZGUgfHwgc291dGhXZXN0LmxvbmdpdHVkZSA+IG5vcnRoRWFzdC5sb25naXR1ZGUpIHtcbiAgICAgICAgICAgIC8vIEludmFsaWQgYm94LCBjcm9zc2VzIHRoZSBkYXRlIGxpbmVcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldLmxhdGl0dWRlID4gc291dGhXZXN0LmxhdGl0dWRlICYmIG9iamVjdFtrZXldLmxhdGl0dWRlIDwgbm9ydGhFYXN0LmxhdGl0dWRlICYmIG9iamVjdFtrZXldLmxvbmdpdHVkZSA+IHNvdXRoV2VzdC5sb25naXR1ZGUgJiYgb2JqZWN0W2tleV0ubG9uZ2l0dWRlIDwgbm9ydGhFYXN0LmxvbmdpdHVkZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJG9wdGlvbnMnOlxuICAgICAgICAvLyBOb3QgYSBxdWVyeSB0eXBlLCBidXQgYSB3YXkgdG8gYWRkIG9wdGlvbnMgdG8gJHJlZ2V4LiBJZ25vcmUgYW5kXG4gICAgICAgIC8vIGF2b2lkIHRoZSBkZWZhdWx0XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJG1heERpc3RhbmNlJzpcbiAgICAgICAgLy8gTm90IGEgcXVlcnkgdHlwZSwgYnV0IGEgd2F5IHRvIGFkZCBhIGNhcCB0byAkbmVhclNwaGVyZS4gSWdub3JlIGFuZFxuICAgICAgICAvLyBhdm9pZCB0aGUgZGVmYXVsdFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRzZWxlY3QnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qgc3ViUXVlcnlPYmplY3RzID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCAob2JqLCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1F1ZXJ5KGNvbXBhcmVUby5xdWVyeS5jbGFzc05hbWUsIG9iaiwgYXJyLCBjb21wYXJlVG8ucXVlcnkud2hlcmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUXVlcnlPYmplY3RzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJPYmplY3QgPSB0cmFuc2Zvcm1PYmplY3Qoc3ViUXVlcnlPYmplY3RzW2ldKTtcbiAgICAgICAgICAgIHJldHVybiAoMCwgX2VxdWFscy5kZWZhdWx0KShvYmplY3Rba2V5XSwgc3ViT2JqZWN0W2NvbXBhcmVUby5rZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICBjYXNlICckZG9udFNlbGVjdCc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBzdWJRdWVyeU9iamVjdHMgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIChvYmosIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzUXVlcnkoY29tcGFyZVRvLnF1ZXJ5LmNsYXNzTmFtZSwgb2JqLCBhcnIsIGNvbXBhcmVUby5xdWVyeS53aGVyZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJRdWVyeU9iamVjdHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Yk9iamVjdCA9IHRyYW5zZm9ybU9iamVjdChzdWJRdWVyeU9iamVjdHNbaV0pO1xuICAgICAgICAgICAgcmV0dXJuICEoMCwgX2VxdWFscy5kZWZhdWx0KShvYmplY3Rba2V5XSwgc3ViT2JqZWN0W2NvbXBhcmVUby5rZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICBjYXNlICckaW5RdWVyeSc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBzdWJRdWVyeU9iamVjdHMgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIChvYmosIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzUXVlcnkoY29tcGFyZVRvLmNsYXNzTmFtZSwgb2JqLCBhcnIsIGNvbXBhcmVUby53aGVyZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJRdWVyeU9iamVjdHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Yk9iamVjdCA9IHRyYW5zZm9ybU9iamVjdChzdWJRdWVyeU9iamVjdHNbaV0pO1xuICAgICAgICAgICAgaWYgKG9iamVjdFtrZXldLmNsYXNzTmFtZSA9PT0gc3ViT2JqZWN0LmNsYXNzTmFtZSAmJiBvYmplY3Rba2V5XS5vYmplY3RJZCA9PT0gc3ViT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRub3RJblF1ZXJ5JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHN1YlF1ZXJ5T2JqZWN0cyA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgKG9iaiwgaW5kZXgsIGFycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNRdWVyeShjb21wYXJlVG8uY2xhc3NOYW1lLCBvYmosIGFyciwgY29tcGFyZVRvLndoZXJlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YlF1ZXJ5T2JqZWN0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViT2JqZWN0ID0gdHJhbnNmb3JtT2JqZWN0KHN1YlF1ZXJ5T2JqZWN0c1tpXSk7XG4gICAgICAgICAgICBpZiAob2JqZWN0W2tleV0uY2xhc3NOYW1lID09PSBzdWJPYmplY3QuY2xhc3NOYW1lICYmIG9iamVjdFtrZXldLm9iamVjdElkID09PSBzdWJPYmplY3Qub2JqZWN0SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJGNvbnRhaW5lZEJ5JzpcbiAgICAgICAge1xuICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqZWN0W2tleV0pIHtcbiAgICAgICAgICAgIGlmICghY29udGFpbnMoY29tcGFyZVRvLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJGdlb1dpdGhpbic6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoY29tcGFyZVRvLiRwb2x5Z29uKSB7XG4gICAgICAgICAgICB2YXIgX2NvbnRleHQzO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRzID0gKDAsIF9tYXAuZGVmYXVsdCkoX2NvbnRleHQzID0gY29tcGFyZVRvLiRwb2x5Z29uKS5jYWxsKF9jb250ZXh0MywgZ2VvUG9pbnQgPT4gW2dlb1BvaW50LmxhdGl0dWRlLCBnZW9Qb2ludC5sb25naXR1ZGVdKTtcbiAgICAgICAgICAgIGNvbnN0IHBvbHlnb24gPSBuZXcgX1BhcnNlUG9seWdvbi5kZWZhdWx0KHBvaW50cyk7XG4gICAgICAgICAgICByZXR1cm4gcG9seWdvbi5jb250YWluc1BvaW50KG9iamVjdFtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbXBhcmVUby4kY2VudGVyU3BoZXJlKSB7XG4gICAgICAgICAgICBjb25zdCBbV0dTODRQb2ludCwgbWF4RGlzdGFuY2VdID0gY29tcGFyZVRvLiRjZW50ZXJTcGhlcmU7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXJQb2ludCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KHtcbiAgICAgICAgICAgICAgbGF0aXR1ZGU6IFdHUzg0UG9pbnRbMV0sXG4gICAgICAgICAgICAgIGxvbmdpdHVkZTogV0dTODRQb2ludFswXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KG9iamVjdFtrZXldKTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gcG9pbnQucmFkaWFuc1RvKGNlbnRlclBvaW50KTtcbiAgICAgICAgICAgIHJldHVybiBkaXN0YW5jZSA8PSBtYXhEaXN0YW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICBjYXNlICckZ2VvSW50ZXJzZWN0cyc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBwb2x5Z29uID0gbmV3IF9QYXJzZVBvbHlnb24uZGVmYXVsdChvYmplY3Rba2V5XS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgY29uc3QgcG9pbnQgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdChjb21wYXJlVG8uJHBvaW50KTtcbiAgICAgICAgICByZXR1cm4gcG9seWdvbi5jb250YWluc1BvaW50KHBvaW50KTtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUXVlcnkocXVlcnkpIHtcbiAgdmFyIF9jb250ZXh0NDtcbiAgbGV0IHEgPSBxdWVyeTtcbiAgaWYgKHF1ZXJ5LnRvSlNPTikge1xuICAgIHEgPSBxdWVyeS50b0pTT04oKS53aGVyZTtcbiAgfVxuICBjb25zdCBzcGVjaWFsUXVlcnlrZXlzID0gWyckYW5kJywgJyRvcicsICckbm9yJywgJ19ycGVybScsICdfd3Blcm0nLCAnX3BlcmlzaGFibGVfdG9rZW4nLCAnX2VtYWlsX3ZlcmlmeV90b2tlbicsICdfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQnLCAnX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0JywgJ19mYWlsZWRfbG9naW5fY291bnQnXTtcbiAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NCA9ICgwLCBfa2V5cy5kZWZhdWx0KShxKSkuY2FsbChfY29udGV4dDQsIGtleSA9PiB7XG4gICAgaWYgKHEgJiYgcVtrZXldICYmIHFba2V5XS4kcmVnZXgpIHtcbiAgICAgIGlmICh0eXBlb2YgcVtrZXldLiRvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIXFba2V5XS4kb3B0aW9ucy5tYXRjaCgvXltpbXhzXSskLykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfUVVFUlksIGBCYWQgJG9wdGlvbnMgdmFsdWUgZm9yIHF1ZXJ5OiAke3Fba2V5XS4kb3B0aW9uc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHNwZWNpYWxRdWVyeWtleXMpLmNhbGwoc3BlY2lhbFF1ZXJ5a2V5cywga2V5KSA8IDAgJiYgIWtleS5tYXRjaCgvXlthLXpBLVpdW2EtekEtWjAtOV9cXC5dKiQvKSkge1xuICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0tFWV9OQU1FLCBgSW52YWxpZCBrZXkgbmFtZTogJHtrZXl9YCk7XG4gICAgfVxuICB9KTtcbn1cbmNvbnN0IE9mZmxpbmVRdWVyeSA9IHtcbiAgbWF0Y2hlc1F1ZXJ5OiBtYXRjaGVzUXVlcnksXG4gIHZhbGlkYXRlUXVlcnk6IHZhbGlkYXRlUXVlcnlcbn07XG5tb2R1bGUuZXhwb3J0cyA9IE9mZmxpbmVRdWVyeTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IE9mZmxpbmVRdWVyeTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9XZWFrTWFwID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXBcIik7XG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfZGVjb2RlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGVjb2RlXCIpKTtcbnZhciBfZW5jb2RlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfQ3J5cHRvQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ3J5cHRvQ29udHJvbGxlclwiKSk7XG52YXIgX0V2ZW50dWFsbHlRdWV1ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRXZlbnR1YWxseVF1ZXVlXCIpKTtcbnZhciBfSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0luZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyXCIpKTtcbnZhciBfSW5zdGFsbGF0aW9uQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSW5zdGFsbGF0aW9uQ29udHJvbGxlclwiKSk7XG52YXIgUGFyc2VPcCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL1BhcnNlT3BcIikpO1xudmFyIF9SRVNUQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUkVTVENvbnRyb2xsZXJcIikpO1xudmFyIF9QYXJzZUFDTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VBQ0xcIikpO1xudmFyIEFuYWx5dGljcyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL0FuYWx5dGljc1wiKSk7XG52YXIgX0Fub255bW91c1V0aWxzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Bbm9ueW1vdXNVdGlsc1wiKSk7XG52YXIgQ2xvdWQgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9DbG91ZFwiKSk7XG52YXIgX1BhcnNlQ0xQID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUNMUFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX0V2ZW50RW1pdHRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRXZlbnRFbWl0dGVyXCIpKTtcbnZhciBfUGFyc2VDb25maWcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQ29uZmlnXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX0ZhY2Vib29rVXRpbHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0ZhY2Vib29rVXRpbHNcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgSG9va3MgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9QYXJzZUhvb2tzXCIpKTtcbnZhciBfUGFyc2VHZW9Qb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VHZW9Qb2ludFwiKSk7XG52YXIgX1BhcnNlUG9seWdvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VQb2x5Z29uXCIpKTtcbnZhciBfUGFyc2VJbnN0YWxsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlSW5zdGFsbGF0aW9uXCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBQdXNoID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vUHVzaFwiKSk7XG52YXIgX1BhcnNlUXVlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUXVlcnlcIikpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbnZhciBfUGFyc2VSb2xlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJvbGVcIikpO1xudmFyIF9QYXJzZVNjaGVtYSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VTY2hlbWFcIikpO1xudmFyIF9QYXJzZVNlc3Npb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlU2Vzc2lvblwiKSk7XG52YXIgX1N0b3JhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VcIikpO1xudmFyIF9QYXJzZVVzZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlVXNlclwiKSk7XG52YXIgX1BhcnNlTGl2ZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUxpdmVRdWVyeVwiKSk7XG52YXIgX0xpdmVRdWVyeUNsaWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTGl2ZVF1ZXJ5Q2xpZW50XCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXJcIikpO1xudmFyIF9TdG9yYWdlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZUNvbnRyb2xsZXJcIikpO1xudmFyIF9XZWJTb2NrZXRDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9XZWJTb2NrZXRDb250cm9sbGVyXCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIF9XZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgdmFyIHIgPSBuZXcgX1dlYWtNYXAoKSxcbiAgICB0ID0gbmV3IF9XZWFrTWFwKCk7XG4gIHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZSA/IHQgOiByO1xuICB9KShlKTtcbn1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKGUsIHIpIHtcbiAgaWYgKCFyICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgZGVmYXVsdDogZVxuICB9O1xuICB2YXIgdCA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShyKTtcbiAgaWYgKHQgJiYgdC5oYXMoZSkpIHJldHVybiB0LmdldChlKTtcbiAgdmFyIG4gPSB7XG4gICAgX19wcm90b19fOiBudWxsXG4gIH07XG4gIGZvciAodmFyIHUgaW4gZSkgaWYgKFwiZGVmYXVsdFwiICE9PSB1ICYmIHt9Lmhhc093blByb3BlcnR5LmNhbGwoZSwgdSkpIHtcbiAgICB2YXIgaSA9IF9PYmplY3QkZGVmaW5lUHJvcGVydHkgJiYgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPyBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB1KSA6IG51bGw7XG4gICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gX09iamVjdCRkZWZpbmVQcm9wZXJ0eShuLCB1LCBpKSA6IG5bdV0gPSBlW3VdO1xuICB9XG4gIHJldHVybiBuLmRlZmF1bHQgPSBlLCB0ICYmIHQuc2V0KGUsIG4pLCBuO1xufVxuLyoqXG4gKiBDb250YWlucyBhbGwgUGFyc2UgQVBJIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAZ2xvYmFsXG4gKiBAY2xhc3NcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqL1xuXG5jb25zdCBQYXJzZSA9IHtcbiAgQUNMOiBfUGFyc2VBQ0wuZGVmYXVsdCxcbiAgQW5hbHl0aWNzOiBBbmFseXRpY3MsXG4gIEFub255bW91c1V0aWxzOiBfQW5vbnltb3VzVXRpbHMuZGVmYXVsdCxcbiAgQ2xvdWQ6IENsb3VkLFxuICBDTFA6IF9QYXJzZUNMUC5kZWZhdWx0LFxuICBDb3JlTWFuYWdlcjogX0NvcmVNYW5hZ2VyLmRlZmF1bHQsXG4gIENvbmZpZzogX1BhcnNlQ29uZmlnLmRlZmF1bHQsXG4gIEVycm9yOiBfUGFyc2VFcnJvci5kZWZhdWx0LFxuICBGYWNlYm9va1V0aWxzOiBfRmFjZWJvb2tVdGlscy5kZWZhdWx0LFxuICBGaWxlOiBfUGFyc2VGaWxlLmRlZmF1bHQsXG4gIEdlb1BvaW50OiBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0LFxuICBQb2x5Z29uOiBfUGFyc2VQb2x5Z29uLmRlZmF1bHQsXG4gIEluc3RhbGxhdGlvbjogX1BhcnNlSW5zdGFsbGF0aW9uLmRlZmF1bHQsXG4gIExvY2FsRGF0YXN0b3JlOiBfTG9jYWxEYXRhc3RvcmUuZGVmYXVsdCxcbiAgT2JqZWN0OiBfUGFyc2VPYmplY3QuZGVmYXVsdCxcbiAgT3A6IHtcbiAgICBTZXQ6IFBhcnNlT3AuU2V0T3AsXG4gICAgVW5zZXQ6IFBhcnNlT3AuVW5zZXRPcCxcbiAgICBJbmNyZW1lbnQ6IFBhcnNlT3AuSW5jcmVtZW50T3AsXG4gICAgQWRkOiBQYXJzZU9wLkFkZE9wLFxuICAgIFJlbW92ZTogUGFyc2VPcC5SZW1vdmVPcCxcbiAgICBBZGRVbmlxdWU6IFBhcnNlT3AuQWRkVW5pcXVlT3AsXG4gICAgUmVsYXRpb246IFBhcnNlT3AuUmVsYXRpb25PcFxuICB9LFxuICBQdXNoOiBQdXNoLFxuICBRdWVyeTogX1BhcnNlUXVlcnkuZGVmYXVsdCxcbiAgUmVsYXRpb246IF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQsXG4gIFJvbGU6IF9QYXJzZVJvbGUuZGVmYXVsdCxcbiAgU2NoZW1hOiBfUGFyc2VTY2hlbWEuZGVmYXVsdCxcbiAgU2Vzc2lvbjogX1BhcnNlU2Vzc2lvbi5kZWZhdWx0LFxuICBTdG9yYWdlOiBfU3RvcmFnZS5kZWZhdWx0LFxuICBVc2VyOiBfUGFyc2VVc2VyLmRlZmF1bHQsXG4gIExpdmVRdWVyeUNsaWVudDogX0xpdmVRdWVyeUNsaWVudC5kZWZhdWx0LFxuICBJbmRleGVkREI6IHVuZGVmaW5lZCxcbiAgSG9va3M6IHVuZGVmaW5lZCxcbiAgUGFyc2U6IHVuZGVmaW5lZCxcbiAgLyoqXG4gICAqIEBtZW1iZXIge0V2ZW50dWFsbHlRdWV1ZX0gUGFyc2UuRXZlbnR1YWxseVF1ZXVlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBFdmVudHVhbGx5UXVldWUocXVldWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRFdmVudHVhbGx5UXVldWUocXVldWUpO1xuICB9LFxuICBnZXQgRXZlbnR1YWxseVF1ZXVlKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudHVhbGx5UXVldWUoKTtcbiAgfSxcbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgZmlyc3QgdG8gc2V0IHVwIHlvdXIgYXV0aGVudGljYXRpb24gdG9rZW5zIGZvciBQYXJzZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGxpY2F0aW9uSWQgWW91ciBQYXJzZSBBcHBsaWNhdGlvbiBJRC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtqYXZhU2NyaXB0S2V5XSBZb3VyIFBhcnNlIEphdmFTY3JpcHQgS2V5IChOb3QgbmVlZGVkIGZvciBwYXJzZS1zZXJ2ZXIpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWFzdGVyS2V5XSBZb3VyIFBhcnNlIE1hc3RlciBLZXkuIChOb2RlLmpzIG9ubHkhKVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBpbml0aWFsaXplKGFwcGxpY2F0aW9uSWQsIGphdmFTY3JpcHRLZXkpIHtcbiAgICBpZiAoXCJicm93c2VyXCIgPT09ICdicm93c2VyJyAmJiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0lTX05PREUnKSAmJiAhcHJvY2Vzcy5lbnYuU0VSVkVSX1JFTkRFUklORykge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgY29uc29sZS5sb2coXCJJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyB0aGUgYnJvd3NlciB2ZXJzaW9uIG9mIHRoZSBTREsgaW4gYSBcIiArIFwibm9kZS5qcyBlbnZpcm9ubWVudC4gWW91IHNob3VsZCByZXF1aXJlKCdwYXJzZS9ub2RlJykgaW5zdGVhZC5cIik7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgICB9XG4gICAgUGFyc2UuX2luaXRpYWxpemUoYXBwbGljYXRpb25JZCwgamF2YVNjcmlwdEtleSk7XG4gIH0sXG4gIF9pbml0aWFsaXplKGFwcGxpY2F0aW9uSWQsIGphdmFTY3JpcHRLZXksIG1hc3RlcktleSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnQVBQTElDQVRJT05fSUQnLCBhcHBsaWNhdGlvbklkKTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0pBVkFTQ1JJUFRfS0VZJywgamF2YVNjcmlwdEtleSk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdNQVNURVJfS0VZJywgbWFzdGVyS2V5KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ1VTRV9NQVNURVJfS0VZJywgZmFsc2UpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdFdmVudEVtaXR0ZXInLCBfRXZlbnRFbWl0dGVyLmRlZmF1bHQpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdMaXZlUXVlcnknLCBuZXcgX1BhcnNlTGl2ZVF1ZXJ5LmRlZmF1bHQoKSk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ0NyeXB0b0NvbnRyb2xsZXInLCBfQ3J5cHRvQ29udHJvbGxlci5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnRXZlbnR1YWxseVF1ZXVlJywgX0V2ZW50dWFsbHlRdWV1ZS5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnSW5zdGFsbGF0aW9uQ29udHJvbGxlcicsIF9JbnN0YWxsYXRpb25Db250cm9sbGVyLmRlZmF1bHQpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXInLCBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyLmRlZmF1bHQpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdTdG9yYWdlQ29udHJvbGxlcicsIF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnV2ViU29ja2V0Q29udHJvbGxlcicsIF9XZWJTb2NrZXRDb250cm9sbGVyLmRlZmF1bHQpO1xuICAgIFBhcnNlLkluZGV4ZWREQiA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlcicsIF9JbmRleGVkREJTdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0KTtcbiAgfSxcbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgdG8gc2V0IHlvdXIgQXN5bmNTdG9yYWdlIGVuZ2luZVxuICAgKiBTdGFydGluZyBQYXJzZUAxLjExLCB0aGUgUGFyc2VTREsgZG8gbm90IHByb3ZpZGUgYSBSZWFjdCBBc3luY1N0b3JhZ2UgYXMgdGhlIFJlYWN0TmF0aXZlIG1vZHVsZVxuICAgKiBpcyBub3QgcHJvdmlkZWQgYXQgYSBzdGFibGUgcGF0aCBhbmQgY2hhbmdlcyBvdmVyIHZlcnNpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0FzeW5jU3RvcmFnZX0gc3RvcmFnZSBhIHJlYWN0IG5hdGl2ZSBhc3luYyBzdG9yYWdlLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXRBc3luY1N0b3JhZ2Uoc3RvcmFnZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldEFzeW5jU3RvcmFnZShzdG9yYWdlKTtcbiAgfSxcbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgdG8gc2V0IHlvdXIgTG9jYWxEYXRhc3RvcmVTdG9yYWdlIGVuZ2luZVxuICAgKiBJZiB1c2luZyBSZWFjdC1OYXRpdmUgdXNlIHtAbGluayBQYXJzZS5zZXRBc3luY1N0b3JhZ2UgUGFyc2Uuc2V0QXN5bmNTdG9yYWdlKCl9XG4gICAqXG4gICAqIEBwYXJhbSB7TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyfSBjb250cm9sbGVyIGEgZGF0YSBzdG9yYWdlLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcihjb250cm9sbGVyKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBjdXJyZW50IHNlcnZlcidzIGhlYWx0aFxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgZ2V0U2VydmVySGVhbHRoKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLnJlcXVlc3QoJ0dFVCcsICdoZWFsdGgnKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge3N0cmluZ30gUGFyc2UuYXBwbGljYXRpb25JZFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgYXBwbGljYXRpb25JZCh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnQVBQTElDQVRJT05fSUQnLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBhcHBsaWNhdGlvbklkKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FQUExJQ0FUSU9OX0lEJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLmphdmFTY3JpcHRLZXlcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IGphdmFTY3JpcHRLZXkodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0pBVkFTQ1JJUFRfS0VZJywgdmFsdWUpO1xuICB9LFxuICBnZXQgamF2YVNjcmlwdEtleSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdKQVZBU0NSSVBUX0tFWScpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5tYXN0ZXJLZXlcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IG1hc3RlcktleSh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnTUFTVEVSX0tFWScsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IG1hc3RlcktleSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdNQVNURVJfS0VZJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLnNlcnZlclVSTFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgc2VydmVyVVJMKHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdTRVJWRVJfVVJMJywgdmFsdWUpO1xuICB9LFxuICBnZXQgc2VydmVyVVJMKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9VUkwnKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge3N0cmluZ30gUGFyc2Uuc2VydmVyQXV0aFRva2VuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBzZXJ2ZXJBdXRoVG9rZW4odmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ1NFUlZFUl9BVVRIX1RPS0VOJywgdmFsdWUpO1xuICB9LFxuICBnZXQgc2VydmVyQXV0aFRva2VuKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RPS0VOJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLnNlcnZlckF1dGhUeXBlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBzZXJ2ZXJBdXRoVHlwZSh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnU0VSVkVSX0FVVEhfVFlQRScsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IHNlcnZlckF1dGhUeXBlKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RZUEUnKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge1BhcnNlTGl2ZVF1ZXJ5fSBQYXJzZS5MaXZlUXVlcnlcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IExpdmVRdWVyeShsaXZlUXVlcnkpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRMaXZlUXVlcnkobGl2ZVF1ZXJ5KTtcbiAgfSxcbiAgZ2V0IExpdmVRdWVyeSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TGl2ZVF1ZXJ5KCk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLmxpdmVRdWVyeVNlcnZlclVSTFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgbGl2ZVF1ZXJ5U2VydmVyVVJMKHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdMSVZFUVVFUllfU0VSVkVSX1VSTCcsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IGxpdmVRdWVyeVNlcnZlclVSTCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdMSVZFUVVFUllfU0VSVkVSX1VSTCcpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7Ym9vbGVhbn0gUGFyc2UuZW5jcnlwdGVkVXNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgZW5jcnlwdGVkVXNlcih2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnRU5DUllQVEVEX1VTRVInLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBlbmNyeXB0ZWRVc2VyKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9VU0VSJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLnNlY3JldFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgc2VjcmV0KHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdFTkNSWVBURURfS0VZJywgdmFsdWUpO1xuICB9LFxuICBnZXQgc2VjcmV0KCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9LRVknKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge2Jvb2xlYW59IFBhcnNlLmlkZW1wb3RlbmN5XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBpZGVtcG90ZW5jeSh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnSURFTVBPVEVOQ1knLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBpZGVtcG90ZW5jeSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJREVNUE9URU5DWScpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7Ym9vbGVhbn0gUGFyc2UuYWxsb3dDdXN0b21PYmplY3RJZFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgYWxsb3dDdXN0b21PYmplY3RJZCh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnQUxMT1dfQ1VTVE9NX09CSkVDVF9JRCcsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IGFsbG93Q3VzdG9tT2JqZWN0SWQoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQUxMT1dfQ1VTVE9NX09CSkVDVF9JRCcpO1xuICB9LFxuICBfcmVxdWVzdCgpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLnJlcXVlc3QuYXBwbHkobnVsbCwgYXJncyk7XG4gIH0sXG4gIF9hamF4KCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5hamF4LmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9LFxuICAvLyBXZSBhdHRlbXB0IHRvIG1hdGNoIHRoZSBzaWduYXR1cmVzIG9mIHRoZSBsZWdhY3kgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kc1xuICBfZGVjb2RlKF8sIHZhbHVlKSB7XG4gICAgcmV0dXJuICgwLCBfZGVjb2RlMi5kZWZhdWx0KSh2YWx1ZSk7XG4gIH0sXG4gIF9lbmNvZGUodmFsdWUsIF8sIGRpc2FsbG93T2JqZWN0cykge1xuICAgIHJldHVybiAoMCwgX2VuY29kZTIuZGVmYXVsdCkodmFsdWUsIGRpc2FsbG93T2JqZWN0cyk7XG4gIH0sXG4gIF9nZXRJbnN0YWxsYXRpb25JZCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcigpLmN1cnJlbnRJbnN0YWxsYXRpb25JZCgpO1xuICB9LFxuICAvKipcbiAgICogRW5hYmxlIHBpbm5pbmcgaW4geW91ciBhcHBsaWNhdGlvbi5cbiAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBgUGFyc2UuaW5pdGlhbGl6ZWAgaW4geW91ciBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIFtwb2xsaW5nXSBBbGxvdyBwaW5naW5nIHRoZSBzZXJ2ZXIgL2hlYWx0aCBlbmRwb2ludC4gRGVmYXVsdCB0cnVlXG4gICAqIEBwYXJhbSBbbXNdIE1pbGxpc2Vjb25kcyB0byBwaW5nIHRoZSBzZXJ2ZXIuIERlZmF1bHQgMjAwMG1zXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGVuYWJsZUxvY2FsRGF0YXN0b3JlKCkge1xuICAgIGxldCBwb2xsaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICAgIGxldCBtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMjAwMDtcbiAgICBpZiAoIXRoaXMuYXBwbGljYXRpb25JZCkge1xuICAgICAgY29uc29sZS5sb2coXCInZW5hYmxlTG9jYWxEYXRhU3RvcmUnIG11c3QgYmUgY2FsbGVkIGFmdGVyICdpbml0aWFsaXplJ1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLkxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgdGhpcy5Mb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgaWYgKHBvbGxpbmcpIHtcbiAgICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnR1YWxseVF1ZXVlKCkucG9sbChtcyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIExvY2FsIERhdGFzdG9yZSBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNMb2NhbERhdGFzdG9yZUVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuTG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkO1xuICB9LFxuICAvKipcbiAgICogR2V0cyBhbGwgY29udGVudHMgZnJvbSBMb2NhbCBEYXRhc3RvcmVcbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuZHVtcExvY2FsRGF0YXN0b3JlKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICBkdW1wTG9jYWxEYXRhc3RvcmUoKSB7XG4gICAgaWYgKCF0aGlzLkxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgY29uc29sZS5sb2coJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFBhcnNlLkxvY2FsRGF0YXN0b3JlLl9nZXRBbGxDb250ZW50cygpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEVuYWJsZSB0aGUgY3VycmVudCB1c2VyIGVuY3J5cHRpb24uXG4gICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGxvZ2luIGFueSB1c2VyLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBlbmFibGVFbmNyeXB0ZWRVc2VyKCkge1xuICAgIHRoaXMuZW5jcnlwdGVkVXNlciA9IHRydWU7XG4gIH0sXG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgRW5jcnlwdGVkIFVzZXIgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzRW5jcnlwdGVkVXNlckVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5jcnlwdGVkVXNlcjtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFJFU1RDb250cm9sbGVyKF9SRVNUQ29udHJvbGxlci5kZWZhdWx0KTtcbi8vIEZvciBsZWdhY3kgcmVxdWlyZXMsIG9mIHRoZSBmb3JtIGB2YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZScpLlBhcnNlYFxuUGFyc2UuUGFyc2UgPSBQYXJzZTtcbm1vZHVsZS5leHBvcnRzID0gUGFyc2U7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG5jb25zdCBQVUJMSUNfS0VZID0gJyonO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgQUNMLlxuICogSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBBQ0wgaGFzIG5vIHBlcm1pc3Npb25zIGZvciBhbnlvbmUuXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBQYXJzZS5Vc2VyLCB0aGUgQUNMIHdpbGwgaGF2ZSByZWFkIGFuZCB3cml0ZVxuICogICBwZXJtaXNzaW9uIGZvciBvbmx5IHRoYXQgdXNlci5cbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbnkgb3RoZXIgSlNPTiBvYmplY3QsIHRoYXQgb2JqZWN0IHdpbGwgYmUgaW50ZXJwcmV0dGVkXG4gKiAgIGFzIGEgc2VyaWFsaXplZCBBQ0wgY3JlYXRlZCB3aXRoIHRvSlNPTigpLlxuICpcbiAqIDxwPkFuIEFDTCwgb3IgQWNjZXNzIENvbnRyb2wgTGlzdCBjYW4gYmUgYWRkZWQgdG8gYW55XG4gKiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+IHRvIHJlc3RyaWN0IGFjY2VzcyB0byBvbmx5IGEgc3Vic2V0IG9mIHVzZXJzXG4gKiBvZiB5b3VyIGFwcGxpY2F0aW9uLjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuQUNMXG4gKi9cbmNsYXNzIFBhcnNlQUNMIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7KFBhcnNlLlVzZXIgfCBvYmplY3QpfSBhcmcxIFRoZSB1c2VyIHRvIGluaXRpYWxpemUgdGhlIEFDTCBmb3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZzEpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInBlcm1pc3Npb25zQnlJZFwiLCB2b2lkIDApO1xuICAgIHRoaXMucGVybWlzc2lvbnNCeUlkID0ge307XG4gICAgaWYgKGFyZzEgJiYgdHlwZW9mIGFyZzEgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBQYXJzZVVzZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVVzZXIoKTtcbiAgICAgIGlmIChhcmcxIGluc3RhbmNlb2YgUGFyc2VVc2VyKSB7XG4gICAgICAgIHRoaXMuc2V0UmVhZEFjY2VzcyhhcmcxLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRXcml0ZUFjY2VzcyhhcmcxLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgdXNlcklkIGluIGFyZzEpIHtcbiAgICAgICAgICBjb25zdCBhY2Nlc3NMaXN0ID0gYXJnMVt1c2VySWRdO1xuICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF0gPSB7fTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gaW4gYWNjZXNzTGlzdCkge1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IGFjY2Vzc0xpc3RbcGVybWlzc2lvbl07XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbiAhPT0gJ3JlYWQnICYmIHBlcm1pc3Npb24gIT09ICd3cml0ZScpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gY3JlYXRlIGFuIEFDTCB3aXRoIGFuIGludmFsaWQgcGVybWlzc2lvbiB0eXBlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhbGxvd2VkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gY3JlYXRlIGFuIEFDTCB3aXRoIGFuIGludmFsaWQgcGVybWlzc2lvbiB2YWx1ZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF1bcGVybWlzc2lvbl0gPSBhbGxvd2VkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZzEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhcnNlQUNMIGNvbnN0cnVjdGVkIHdpdGggYSBmdW5jdGlvbi4gRGlkIHlvdSBmb3JnZXQgKCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OLWVuY29kZWQgdmVyc2lvbiBvZiB0aGUgQUNMLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0ge307XG4gICAgZm9yIChjb25zdCBwIGluIHRoaXMucGVybWlzc2lvbnNCeUlkKSB7XG4gICAgICBwZXJtaXNzaW9uc1twXSA9IHRoaXMucGVybWlzc2lvbnNCeUlkW3BdO1xuICAgIH1cbiAgICByZXR1cm4gcGVybWlzc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgQUNMIGlzIGVxdWFsIHRvIGFub3RoZXIgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2VBQ0x9IG90aGVyIFRoZSBvdGhlciBvYmplY3QncyBBQ0wgdG8gY29tcGFyZSB0b1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGVxdWFscyhvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgUGFyc2VBQ0wpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJzID0gKDAsIF9rZXlzLmRlZmF1bHQpKHRoaXMucGVybWlzc2lvbnNCeUlkKTtcbiAgICBjb25zdCBvdGhlclVzZXJzID0gKDAsIF9rZXlzLmRlZmF1bHQpKG90aGVyLnBlcm1pc3Npb25zQnlJZCk7XG4gICAgaWYgKHVzZXJzLmxlbmd0aCAhPT0gb3RoZXJVc2Vycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB1IGluIHRoaXMucGVybWlzc2lvbnNCeUlkKSB7XG4gICAgICBpZiAoIW90aGVyLnBlcm1pc3Npb25zQnlJZFt1XSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wZXJtaXNzaW9uc0J5SWRbdV0ucmVhZCAhPT0gb3RoZXIucGVybWlzc2lvbnNCeUlkW3VdLnJlYWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGVybWlzc2lvbnNCeUlkW3VdLndyaXRlICE9PSBvdGhlci5wZXJtaXNzaW9uc0J5SWRbdV0ud3JpdGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBfc2V0QWNjZXNzKGFjY2Vzc1R5cGUsIHVzZXJJZCwgYWxsb3dlZCkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGNvbnN0IFBhcnNlVXNlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlVXNlcigpO1xuICAgIGlmICh1c2VySWQgaW5zdGFuY2VvZiBQYXJzZVVzZXIpIHtcbiAgICAgIHVzZXJJZCA9IHVzZXJJZC5pZDtcbiAgICB9IGVsc2UgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIFBhcnNlUm9sZSkge1xuICAgICAgY29uc3QgbmFtZSA9IHVzZXJJZC5nZXROYW1lKCk7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUm9sZSBtdXN0IGhhdmUgYSBuYW1lJyk7XG4gICAgICB9XG4gICAgICB1c2VySWQgPSAncm9sZTonICsgbmFtZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1c2VySWQgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhbGxvd2VkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FsbG93ZWQgbXVzdCBiZSBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4nKTtcbiAgICB9XG4gICAgbGV0IHBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc0J5SWRbdXNlcklkXTtcbiAgICBpZiAoIXBlcm1pc3Npb25zKSB7XG4gICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgLy8gVGhlIHVzZXIgYWxyZWFkeSBkb2Vzbid0IGhhdmUgdGhpcyBwZXJtaXNzaW9uLCBzbyBubyBhY3Rpb24gaXMgbmVlZGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlcm1pc3Npb25zID0ge307XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF0gPSBwZXJtaXNzaW9ucztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbG93ZWQpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF1bYWNjZXNzVHlwZV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgcGVybWlzc2lvbnNbYWNjZXNzVHlwZV07XG4gICAgICBpZiAoKDAsIF9rZXlzLmRlZmF1bHQpKHBlcm1pc3Npb25zKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9nZXRBY2Nlc3MoYWNjZXNzVHlwZSwgdXNlcklkKSB7XG4gICAgY29uc3QgUGFyc2VSb2xlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VSb2xlKCk7XG4gICAgY29uc3QgUGFyc2VVc2VyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VVc2VyKCk7XG4gICAgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIFBhcnNlVXNlcikge1xuICAgICAgdXNlcklkID0gdXNlcklkLmlkO1xuICAgICAgaWYgKCF1c2VySWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGFjY2VzcyBmb3IgYSBQYXJzZVVzZXIgd2l0aG91dCBhbiBJRCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodXNlcklkIGluc3RhbmNlb2YgUGFyc2VSb2xlKSB7XG4gICAgICBjb25zdCBuYW1lID0gdXNlcklkLmdldE5hbWUoKTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSb2xlIG11c3QgaGF2ZSBhIG5hbWUnKTtcbiAgICAgIH1cbiAgICAgIHVzZXJJZCA9ICdyb2xlOicgKyBuYW1lO1xuICAgIH1cbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF07XG4gICAgaWYgKCFwZXJtaXNzaW9ucykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gISFwZXJtaXNzaW9uc1thY2Nlc3NUeXBlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaXMgYWxsb3dlZCB0byByZWFkIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGF0IHVzZXIgc2hvdWxkIGhhdmUgcmVhZCBhY2Nlc3MuXG4gICAqL1xuICBzZXRSZWFkQWNjZXNzKHVzZXJJZCwgYWxsb3dlZCkge1xuICAgIHRoaXMuX3NldEFjY2VzcygncmVhZCcsIHVzZXJJZCwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaWQgaXMgKmV4cGxpY2l0bHkqIGFsbG93ZWQgdG8gcmVhZCB0aGlzIG9iamVjdC5cbiAgICogRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB1c2VyIG1heSBzdGlsbCBiZSBhYmxlIHRvIGFjY2VzcyBpdCBpZlxuICAgKiBnZXRQdWJsaWNSZWFkQWNjZXNzIHJldHVybnMgdHJ1ZSBvciBhIHJvbGUgdGhhdCB0aGUgdXNlciBiZWxvbmdzIHRvIGhhc1xuICAgKiB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRSZWFkQWNjZXNzKHVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3MoJ3JlYWQnLCB1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpZCBpcyBhbGxvd2VkIHRvIHdyaXRlIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGF0IHVzZXIgc2hvdWxkIGhhdmUgd3JpdGUgYWNjZXNzLlxuICAgKi9cbiAgc2V0V3JpdGVBY2Nlc3ModXNlcklkLCBhbGxvd2VkKSB7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCd3cml0ZScsIHVzZXJJZCwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlkIGlzICpleHBsaWNpdGx5KiBhbGxvd2VkIHRvIHdyaXRlIHRoaXMgb2JqZWN0LlxuICAgKiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHVzZXIgbWF5IHN0aWxsIGJlIGFibGUgdG8gd3JpdGUgaXQgaWZcbiAgICogZ2V0UHVibGljV3JpdGVBY2Nlc3MgcmV0dXJucyB0cnVlIG9yIGEgcm9sZSB0aGF0IHRoZSB1c2VyIGJlbG9uZ3MgdG8gaGFzXG4gICAqIHdyaXRlIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZCwgb3IgYSBQYXJzZS5Sb2xlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFdyaXRlQWNjZXNzKHVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3MoJ3dyaXRlJywgdXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZFxuICAgKi9cbiAgc2V0UHVibGljUmVhZEFjY2VzcyhhbGxvd2VkKSB7XG4gICAgdGhpcy5zZXRSZWFkQWNjZXNzKFBVQkxJQ19LRVksIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gcmVhZCB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRQdWJsaWNSZWFkQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFJlYWRBY2Nlc3MoUFVCTElDX0tFWSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkXG4gICAqL1xuICBzZXRQdWJsaWNXcml0ZUFjY2VzcyhhbGxvd2VkKSB7XG4gICAgdGhpcy5zZXRXcml0ZUFjY2VzcyhQVUJMSUNfS0VZLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHdyaXRlIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFB1YmxpY1dyaXRlQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFdyaXRlQWNjZXNzKFBVQkxJQ19LRVkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gcmVhZCB0aGlzIG9iamVjdC4gRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSByb2xlIG1heVxuICAgKiBzdGlsbCBiZSBhYmxlIHRvIHdyaXRlIGl0IGlmIGEgcGFyZW50IHJvbGUgaGFzIHJlYWQgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHJvbGUgaGFzIHJlYWQgYWNjZXNzLiBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBnZXRSb2xlUmVhZEFjY2Vzcyhyb2xlKSB7XG4gICAgY29uc3QgUGFyc2VSb2xlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VSb2xlKCk7XG4gICAgaWYgKHJvbGUgaW5zdGFuY2VvZiBQYXJzZVJvbGUpIHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byB0aGUgU3RyaW5nIG5hbWVcbiAgICAgIHJvbGUgPSByb2xlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByb2xlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm9sZSBtdXN0IGJlIGEgUGFyc2VSb2xlIG9yIGEgU3RyaW5nJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFJlYWRBY2Nlc3MoJ3JvbGU6JyArIHJvbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gd3JpdGUgdGhpcyBvYmplY3QuIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgcm9sZSBtYXlcbiAgICogc3RpbGwgYmUgYWJsZSB0byB3cml0ZSBpdCBpZiBhIHBhcmVudCByb2xlIGhhcyB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgcm9sZSBoYXMgd3JpdGUgYWNjZXNzLiBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBnZXRSb2xlV3JpdGVBY2Nlc3Mocm9sZSkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGlmIChyb2xlIGluc3RhbmNlb2YgUGFyc2VSb2xlKSB7XG4gICAgICAvLyBOb3JtYWxpemUgdG8gdGhlIFN0cmluZyBuYW1lXG4gICAgICByb2xlID0gcm9sZS5nZXROYW1lKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygcm9sZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JvbGUgbXVzdCBiZSBhIFBhcnNlUm9sZSBvciBhIFN0cmluZycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRXcml0ZUFjY2Vzcygncm9sZTonICsgcm9sZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byByZWFkIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhlIGdpdmVuIHJvbGUgY2FuIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBzZXRSb2xlUmVhZEFjY2Vzcyhyb2xlLCBhbGxvd2VkKSB7XG4gICAgY29uc3QgUGFyc2VSb2xlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VSb2xlKCk7XG4gICAgaWYgKHJvbGUgaW5zdGFuY2VvZiBQYXJzZVJvbGUpIHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byB0aGUgU3RyaW5nIG5hbWVcbiAgICAgIHJvbGUgPSByb2xlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByb2xlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm9sZSBtdXN0IGJlIGEgUGFyc2VSb2xlIG9yIGEgU3RyaW5nJyk7XG4gICAgfVxuICAgIHRoaXMuc2V0UmVhZEFjY2Vzcygncm9sZTonICsgcm9sZSwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCBXaGV0aGVyIHRoZSBnaXZlbiByb2xlIGNhbiB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIHNldFJvbGVXcml0ZUFjY2Vzcyhyb2xlLCBhbGxvd2VkKSB7XG4gICAgY29uc3QgUGFyc2VSb2xlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VSb2xlKCk7XG4gICAgaWYgKHJvbGUgaW5zdGFuY2VvZiBQYXJzZVJvbGUpIHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byB0aGUgU3RyaW5nIG5hbWVcbiAgICAgIHJvbGUgPSByb2xlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByb2xlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm9sZSBtdXN0IGJlIGEgUGFyc2VSb2xlIG9yIGEgU3RyaW5nJyk7XG4gICAgfVxuICAgIHRoaXMuc2V0V3JpdGVBY2Nlc3MoJ3JvbGU6JyArIHJvbGUsIGFsbG93ZWQpO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZUFDTDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL21hcFwiKSk7XG52YXIgX2VudHJpZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2VudHJpZXNcIikpO1xudmFyIF9hc3NpZ24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9hc3NpZ25cIikpO1xudmFyIF9zbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc2xpY2VcIikpO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9ldmVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZXZlcnlcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfUGFyc2VSb2xlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJvbGVcIikpO1xudmFyIF9QYXJzZVVzZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlVXNlclwiKSk7XG5jb25zdCBQVUJMSUNfS0VZID0gJyonO1xuY29uc3QgVkFMSURfUEVSTUlTU0lPTlMgPSBuZXcgX21hcC5kZWZhdWx0KCk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ2dldCcsIHt9KTtcblZBTElEX1BFUk1JU1NJT05TLnNldCgnZmluZCcsIHt9KTtcblZBTElEX1BFUk1JU1NJT05TLnNldCgnY291bnQnLCB7fSk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ2NyZWF0ZScsIHt9KTtcblZBTElEX1BFUk1JU1NJT05TLnNldCgndXBkYXRlJywge30pO1xuVkFMSURfUEVSTUlTU0lPTlMuc2V0KCdkZWxldGUnLCB7fSk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ2FkZEZpZWxkJywge30pO1xuY29uc3QgVkFMSURfUEVSTUlTU0lPTlNfRVhURU5ERUQgPSBuZXcgX21hcC5kZWZhdWx0KCk7XG5WQUxJRF9QRVJNSVNTSU9OU19FWFRFTkRFRC5zZXQoJ3Byb3RlY3RlZEZpZWxkcycsIHt9KTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IENMUC5cbiAqIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgQ0xQIGhhcyBubyBwZXJtaXNzaW9ucyBmb3IgYW55b25lLlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgUGFyc2UuVXNlciBvciBQYXJzZS5Sb2xlLCB0aGUgQ0xQIHdpbGwgaGF2ZSByZWFkIGFuZCB3cml0ZVxuICogICBwZXJtaXNzaW9uIGZvciBvbmx5IHRoYXQgdXNlciBvciByb2xlLlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGFueSBvdGhlciBKU09OIG9iamVjdCwgdGhhdCBvYmplY3Qgd2lsbCBiZSBpbnRlcnByZXR0ZWRcbiAqICAgYXMgYSBzZXJpYWxpemVkIENMUCBjcmVhdGVkIHdpdGggdG9KU09OKCkuXG4gKlxuICogPHA+QSBDTFAsIG9yIENsYXNzIExldmVsIFBlcm1pc3Npb25zIGNhbiBiZSBhZGRlZCB0byBhbnlcbiAqIDxjb2RlPlBhcnNlLlNjaGVtYTwvY29kZT4gdG8gcmVzdHJpY3QgYWNjZXNzIHRvIG9ubHkgYSBzdWJzZXQgb2YgdXNlcnNcbiAqIG9mIHlvdXIgYXBwbGljYXRpb24uPC9wPlxuICpcbiAqIDxwPlxuICogRm9yIGdldC9jb3VudC9maW5kL2NyZWF0ZS91cGRhdGUvZGVsZXRlL2FkZEZpZWxkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOlxuICpcbiAqIEVudGl0eSBpcyB0eXBlIFBhcnNlLlVzZXIgb3IgUGFyc2UuUm9sZSBvciBzdHJpbmdcbiAqIFJvbGUgaXMgdHlwZSBQYXJzZS5Sb2xlIG9yIE5hbWUgb2YgUGFyc2UuUm9sZVxuICpcbiAqIGdldEdldFJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0R2V0UmVxdWlyZXNBdXRoZW50aWNhdGlvbihhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0R2V0UG9pbnRlckZpZWxkcygpXG4gKiBzZXRHZXRQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0R2V0QWNjZXNzKGVudGl0eTogRW50aXR5KVxuICogc2V0R2V0QWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljR2V0QWNjZXNzKClcbiAqIHNldFB1YmxpY0dldEFjY2VzcyhhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Um9sZUdldEFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZUdldEFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0RmluZFJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0RmluZFJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldEZpbmRQb2ludGVyRmllbGRzKClcbiAqIHNldEZpbmRQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0RmluZEFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldEZpbmRBY2Nlc3MoZW50aXR5OiBFbnRpdHksIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRQdWJsaWNGaW5kQWNjZXNzKClcbiAqIHNldFB1YmxpY0ZpbmRBY2Nlc3MoYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFJvbGVGaW5kQWNjZXNzKHJvbGU6IFJvbGUpXG4gKiBzZXRSb2xlRmluZEFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Q291bnRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldENvdW50UmVxdWlyZXNBdXRoZW50aWNhdGlvbihhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Q291bnRQb2ludGVyRmllbGRzKClcbiAqIHNldENvdW50UG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldENvdW50QWNjZXNzKGVudGl0eTogRW50aXR5KVxuICogc2V0Q291bnRBY2Nlc3MoZW50aXR5OiBFbnRpdHksIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRQdWJsaWNDb3VudEFjY2VzcygpXG4gKiBzZXRQdWJsaWNDb3VudEFjY2VzcyhhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Um9sZUNvdW50QWNjZXNzKHJvbGU6IFJvbGUpXG4gKiBzZXRSb2xlQ291bnRBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldENyZWF0ZVJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0Q3JlYXRlUmVxdWlyZXNBdXRoZW50aWNhdGlvbihhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Q3JlYXRlUG9pbnRlckZpZWxkcygpXG4gKiBzZXRDcmVhdGVQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0Q3JlYXRlQWNjZXNzKGVudGl0eTogRW50aXR5KVxuICogc2V0Q3JlYXRlQWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljQ3JlYXRlQWNjZXNzKClcbiAqIHNldFB1YmxpY0NyZWF0ZUFjY2VzcyhhbGxvd2VkOiBCb29sZWFuKVxuICogZ2V0Um9sZUNyZWF0ZUFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZUNyZWF0ZUFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0VXBkYXRlUmVxdWlyZXNBdXRoZW50aWNhdGlvbigpXG4gKiBzZXRVcGRhdGVSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRVcGRhdGVQb2ludGVyRmllbGRzKClcbiAqIHNldFVwZGF0ZVBvaW50ZXJGaWVsZHMocG9pbnRlckZpZWxkczogc3RyaW5nW10pXG4gKiBnZXRVcGRhdGVBY2Nlc3MoZW50aXR5OiBFbnRpdHkpXG4gKiBzZXRVcGRhdGVBY2Nlc3MoZW50aXR5OiBFbnRpdHksIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRQdWJsaWNVcGRhdGVBY2Nlc3MoKVxuICogc2V0UHVibGljVXBkYXRlQWNjZXNzKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRSb2xlVXBkYXRlQWNjZXNzKHJvbGU6IFJvbGUpXG4gKiBzZXRSb2xlVXBkYXRlQWNjZXNzKHJvbGU6IFJvbGUsIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXREZWxldGVSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldERlbGV0ZVJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldERlbGV0ZVBvaW50ZXJGaWVsZHMoKVxuICogc2V0RGVsZXRlUG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldERlbGV0ZUFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldERlbGV0ZUFjY2VzcyhlbnRpdHk6IEVudGl0eSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFB1YmxpY0RlbGV0ZUFjY2VzcygpXG4gKiBzZXRQdWJsaWNEZWxldGVBY2Nlc3MoYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFJvbGVEZWxldGVBY2Nlc3Mocm9sZTogUm9sZSlcbiAqIHNldFJvbGVEZWxldGVBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldEFkZEZpZWxkUmVxdWlyZXNBdXRoZW50aWNhdGlvbigpXG4gKiBzZXRBZGRGaWVsZFJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldEFkZEZpZWxkUG9pbnRlckZpZWxkcygpXG4gKiBzZXRBZGRGaWVsZFBvaW50ZXJGaWVsZHMocG9pbnRlckZpZWxkczogc3RyaW5nW10pXG4gKiBnZXRBZGRGaWVsZEFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldEFkZEZpZWxkQWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljQWRkRmllbGRBY2Nlc3MoKVxuICogc2V0UHVibGljQWRkRmllbGRBY2Nlc3MoYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFJvbGVBZGRGaWVsZEFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZUFkZEZpZWxkQWNjZXNzKHJvbGU6IFJvbGUsIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiA8L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLkNMUFxuICovXG5jbGFzcyBQYXJzZUNMUCB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyhQYXJzZS5Vc2VyIHwgUGFyc2UuUm9sZSB8IG9iamVjdCl9IHVzZXJJZCBUaGUgdXNlciB0byBpbml0aWFsaXplIHRoZSBDTFAgZm9yXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih1c2VySWQpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInBlcm1pc3Npb25zTWFwXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5wZXJtaXNzaW9uc01hcCA9IHt9O1xuICAgIC8vIEluaXRpYWxpemUgcGVybWlzc2lvbnMgTWFwIHdpdGggZGVmYXVsdCBwZXJtaXNzaW9uc1xuICAgIGZvciAoY29uc3QgW29wZXJhdGlvbiwgZ3JvdXBdIG9mICgwLCBfZW50cmllcy5kZWZhdWx0KShWQUxJRF9QRVJNSVNTSU9OUykuY2FsbChWQUxJRF9QRVJNSVNTSU9OUykpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXSA9ICgwLCBfYXNzaWduLmRlZmF1bHQpKHt9LCBncm91cCk7XG4gICAgICBjb25zdCBhY3Rpb24gPSBvcGVyYXRpb24uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyAoMCwgX3NsaWNlLmRlZmF1bHQpKG9wZXJhdGlvbikuY2FsbChvcGVyYXRpb24sIDEpO1xuICAgICAgdGhpc1tgZ2V0JHthY3Rpb259UmVxdWlyZXNBdXRoZW50aWNhdGlvbmBdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKG9wZXJhdGlvbiwgJ3JlcXVpcmVzQXV0aGVudGljYXRpb24nKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BzZXQke2FjdGlvbn1SZXF1aXJlc0F1dGhlbnRpY2F0aW9uYF0gPSBmdW5jdGlvbiAoYWxsb3dlZCkge1xuICAgICAgICB0aGlzLl9zZXRBY2Nlc3Mob3BlcmF0aW9uLCAncmVxdWlyZXNBdXRoZW50aWNhdGlvbicsIGFsbG93ZWQpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYGdldCR7YWN0aW9ufVBvaW50ZXJGaWVsZHNgXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcyhvcGVyYXRpb24sICdwb2ludGVyRmllbGRzJywgZmFsc2UpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYHNldCR7YWN0aW9ufVBvaW50ZXJGaWVsZHNgXSA9IGZ1bmN0aW9uIChwb2ludGVyRmllbGRzKSB7XG4gICAgICAgIHRoaXMuX3NldEFycmF5QWNjZXNzKG9wZXJhdGlvbiwgJ3BvaW50ZXJGaWVsZHMnLCBwb2ludGVyRmllbGRzKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BnZXQke2FjdGlvbn1BY2Nlc3NgXSA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcyhvcGVyYXRpb24sIGVudGl0eSk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgc2V0JHthY3Rpb259QWNjZXNzYF0gPSBmdW5jdGlvbiAoZW50aXR5LCBhbGxvd2VkKSB7XG4gICAgICAgIHRoaXMuX3NldEFjY2VzcyhvcGVyYXRpb24sIGVudGl0eSwgYWxsb3dlZCk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgZ2V0UHVibGljJHthY3Rpb259QWNjZXNzYF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2BnZXQke2FjdGlvbn1BY2Nlc3NgXShQVUJMSUNfS0VZKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BzZXRQdWJsaWMke2FjdGlvbn1BY2Nlc3NgXSA9IGZ1bmN0aW9uIChhbGxvd2VkKSB7XG4gICAgICAgIHRoaXNbYHNldCR7YWN0aW9ufUFjY2Vzc2BdKFBVQkxJQ19LRVksIGFsbG93ZWQpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYGdldFJvbGUke2FjdGlvbn1BY2Nlc3NgXSA9IGZ1bmN0aW9uIChyb2xlKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2BnZXQke2FjdGlvbn1BY2Nlc3NgXSh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgc2V0Um9sZSR7YWN0aW9ufUFjY2Vzc2BdID0gZnVuY3Rpb24gKHJvbGUsIGFsbG93ZWQpIHtcbiAgICAgICAgdGhpc1tgc2V0JHthY3Rpb259QWNjZXNzYF0odGhpcy5fZ2V0Um9sZU5hbWUocm9sZSksIGFsbG93ZWQpO1xuICAgICAgfTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSBwZXJtaXNzaW9ucyBNYXAgd2l0aCBkZWZhdWx0IGV4dGVuZGVkIHBlcm1pc3Npb25zXG4gICAgZm9yIChjb25zdCBbb3BlcmF0aW9uLCBncm91cF0gb2YgKDAsIF9lbnRyaWVzLmRlZmF1bHQpKFZBTElEX1BFUk1JU1NJT05TX0VYVEVOREVEKS5jYWxsKFZBTElEX1BFUk1JU1NJT05TX0VYVEVOREVEKSkge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtvcGVyYXRpb25dID0gKDAsIF9hc3NpZ24uZGVmYXVsdCkoe30sIGdyb3VwKTtcbiAgICB9XG4gICAgaWYgKHVzZXJJZCAmJiB0eXBlb2YgdXNlcklkID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIF9QYXJzZVVzZXIuZGVmYXVsdCkge1xuICAgICAgICB0aGlzLnNldFJlYWRBY2Nlc3ModXNlcklkLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRXcml0ZUFjY2Vzcyh1c2VySWQsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmICh1c2VySWQgaW5zdGFuY2VvZiBfUGFyc2VSb2xlLmRlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5zZXRSb2xlUmVhZEFjY2Vzcyh1c2VySWQsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFJvbGVXcml0ZUFjY2Vzcyh1c2VySWQsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIGluIHVzZXJJZCkge1xuICAgICAgICAgIHZhciBfY29udGV4dDtcbiAgICAgICAgICBjb25zdCB1c2VycyA9IHVzZXJJZFtwZXJtaXNzaW9uXTtcbiAgICAgICAgICBjb25zdCBpc1ZhbGlkUGVybWlzc2lvbiA9ICEhVkFMSURfUEVSTUlTU0lPTlMuZ2V0KHBlcm1pc3Npb24pO1xuICAgICAgICAgIGNvbnN0IGlzVmFsaWRQZXJtaXNzaW9uRXh0ZW5kZWQgPSAhIVZBTElEX1BFUk1JU1NJT05TX0VYVEVOREVELmdldChwZXJtaXNzaW9uKTtcbiAgICAgICAgICBjb25zdCBpc1ZhbGlkR3JvdXBQZXJtaXNzaW9uID0gKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShfY29udGV4dCA9IFsncmVhZFVzZXJGaWVsZHMnLCAnd3JpdGVVc2VyRmllbGRzJ10pLmNhbGwoX2NvbnRleHQsIHBlcm1pc3Npb24pO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGVybWlzc2lvbiAhPT0gJ3N0cmluZycgfHwgIShpc1ZhbGlkUGVybWlzc2lvbiB8fCBpc1ZhbGlkUGVybWlzc2lvbkV4dGVuZGVkIHx8IGlzVmFsaWRHcm91cFBlcm1pc3Npb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBjcmVhdGUgYW4gQ0xQIHdpdGggYW4gaW52YWxpZCBwZXJtaXNzaW9uIHR5cGUuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1ZhbGlkR3JvdXBQZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAoKDAsIF9ldmVyeS5kZWZhdWx0KSh1c2VycykuY2FsbCh1c2VycywgcG9pbnRlciA9PiB0eXBlb2YgcG9pbnRlciA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl0gPSB1c2VycztcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBjcmVhdGUgYW4gQ0xQIHdpdGggYW4gaW52YWxpZCBwZXJtaXNzaW9uIHZhbHVlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHVzZXIgaW4gdXNlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSB1c2Vyc1t1c2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWxsb3dlZCAhPT0gJ2Jvb2xlYW4nICYmICFpc1ZhbGlkUGVybWlzc2lvbkV4dGVuZGVkICYmIHVzZXIgIT09ICdwb2ludGVyRmllbGRzJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBjcmVhdGUgYW4gQ0xQIHdpdGggYW4gaW52YWxpZCBwZXJtaXNzaW9uIHZhbHVlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VyXSA9IGFsbG93ZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdXNlcklkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXJzZUNMUCBjb25zdHJ1Y3RlZCB3aXRoIGEgZnVuY3Rpb24uIERpZCB5b3UgZm9yZ2V0ICgpPycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTi1lbmNvZGVkIHZlcnNpb24gb2YgdGhlIENMUC5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5wZXJtaXNzaW9uc01hcFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgQ0xQIGlzIGVxdWFsIHRvIGFub3RoZXIgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUgdG9cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFBhcnNlQ0xQKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9ICgwLCBfa2V5cy5kZWZhdWx0KSh0aGlzLnBlcm1pc3Npb25zTWFwKTtcbiAgICBjb25zdCBvdGhlclBlcm1pc3Npb25zID0gKDAsIF9rZXlzLmRlZmF1bHQpKG90aGVyLnBlcm1pc3Npb25zTWFwKTtcbiAgICBpZiAocGVybWlzc2lvbnMubGVuZ3RoICE9PSBvdGhlclBlcm1pc3Npb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gaW4gdGhpcy5wZXJtaXNzaW9uc01hcCkge1xuICAgICAgaWYgKCFvdGhlci5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB1c2VycyA9ICgwLCBfa2V5cy5kZWZhdWx0KSh0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dKTtcbiAgICAgIGNvbnN0IG90aGVyVXNlcnMgPSAoMCwgX2tleXMuZGVmYXVsdCkob3RoZXIucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl0pO1xuICAgICAgaWYgKHVzZXJzLmxlbmd0aCAhPT0gb3RoZXJVc2Vycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB1c2VyIGluIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl0pIHtcbiAgICAgICAgaWYgKCFvdGhlci5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VyXSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VyXSAhPT0gb3RoZXIucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcl0pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgX2dldFJvbGVOYW1lKHJvbGUpIHtcbiAgICBsZXQgbmFtZSA9IHJvbGU7XG4gICAgaWYgKHJvbGUgaW5zdGFuY2VvZiBfUGFyc2VSb2xlLmRlZmF1bHQpIHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byB0aGUgU3RyaW5nIG5hbWVcbiAgICAgIG5hbWUgPSByb2xlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm9sZSBtdXN0IGJlIGEgUGFyc2UuUm9sZSBvciBhIFN0cmluZycpO1xuICAgIH1cbiAgICByZXR1cm4gYHJvbGU6JHtuYW1lfWA7XG4gIH1cbiAgX3BhcnNlRW50aXR5KGVudGl0eSkge1xuICAgIGxldCB1c2VySWQgPSBlbnRpdHk7XG4gICAgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIF9QYXJzZVVzZXIuZGVmYXVsdCkge1xuICAgICAgdXNlcklkID0gdXNlcklkLmlkO1xuICAgICAgaWYgKCF1c2VySWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGFjY2VzcyBmb3IgYSBQYXJzZS5Vc2VyIHdpdGhvdXQgYW4gaWQuJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh1c2VySWQgaW5zdGFuY2VvZiBfUGFyc2VSb2xlLmRlZmF1bHQpIHtcbiAgICAgIHVzZXJJZCA9IHRoaXMuX2dldFJvbGVOYW1lKHVzZXJJZCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndXNlcklkIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VySWQ7XG4gIH1cbiAgX3NldEFjY2VzcyhwZXJtaXNzaW9uLCB1c2VySWQsIGFsbG93ZWQpIHtcbiAgICB1c2VySWQgPSB0aGlzLl9wYXJzZUVudGl0eSh1c2VySWQpO1xuICAgIGlmICh0eXBlb2YgYWxsb3dlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhbGxvd2VkIG11c3QgYmUgZWl0aGVyIHRydWUgb3IgZmFsc2UuJyk7XG4gICAgfVxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdO1xuICAgIGlmICghcGVybWlzc2lvbnMpIHtcbiAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICAvLyBUaGUgdXNlciBhbHJlYWR5IGRvZXNuJ3QgaGF2ZSB0aGlzIHBlcm1pc3Npb24sIHNvIG5vIGFjdGlvbiBpcyBuZWVkZWRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdID0ge307XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxvd2VkKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdO1xuICAgIH1cbiAgfVxuICBfZ2V0QWNjZXNzKHBlcm1pc3Npb24sIHVzZXJJZCkge1xuICAgIGxldCByZXR1cm5Cb29sZWFuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICAgIHVzZXJJZCA9IHRoaXMuX3BhcnNlRW50aXR5KHVzZXJJZCk7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF07XG4gICAgaWYgKHJldHVybkJvb2xlYW4pIHtcbiAgICAgIGlmICghcGVybWlzc2lvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuICEhdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdO1xuICAgIH1cbiAgICByZXR1cm4gcGVybWlzc2lvbnM7XG4gIH1cbiAgX3NldEFycmF5QWNjZXNzKHBlcm1pc3Npb24sIHVzZXJJZCwgZmllbGRzKSB7XG4gICAgdXNlcklkID0gdGhpcy5fcGFyc2VFbnRpdHkodXNlcklkKTtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXTtcbiAgICBpZiAoIXBlcm1pc3Npb25zKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF0gPSBbXTtcbiAgICB9XG4gICAgaWYgKCFmaWVsZHMgfHwgKDAsIF9pc0FycmF5LmRlZmF1bHQpKGZpZWxkcykgJiYgZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXTtcbiAgICB9IGVsc2UgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShmaWVsZHMpICYmICgwLCBfZXZlcnkuZGVmYXVsdCkoZmllbGRzKS5jYWxsKGZpZWxkcywgZmllbGQgPT4gdHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJykpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXSA9IGZpZWxkcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmllbGRzIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICB9XG4gIF9zZXRHcm91cFBvaW50ZXJQZXJtaXNzaW9uKG9wZXJhdGlvbiwgcG9pbnRlckZpZWxkcykge1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXTtcbiAgICBpZiAoIWZpZWxkcykge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtvcGVyYXRpb25dID0gW107XG4gICAgfVxuICAgIGlmICghcG9pbnRlckZpZWxkcyB8fCAoMCwgX2lzQXJyYXkuZGVmYXVsdCkocG9pbnRlckZpZWxkcykgJiYgcG9pbnRlckZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl07XG4gICAgfSBlbHNlIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkocG9pbnRlckZpZWxkcykgJiYgKDAsIF9ldmVyeS5kZWZhdWx0KShwb2ludGVyRmllbGRzKS5jYWxsKHBvaW50ZXJGaWVsZHMsIGZpZWxkID0+IHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl0gPSBwb2ludGVyRmllbGRzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke29wZXJhdGlvbn0ucG9pbnRlckZpZWxkcyBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3Mgb3IgdW5kZWZpbmVkLmApO1xuICAgIH1cbiAgfVxuICBfZ2V0R3JvdXBQb2ludGVyUGVybWlzc2lvbnMob3BlcmF0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVzZXIgcG9pbnRlciBmaWVsZHMgdG8gYWxsb3cgcGVybWlzc2lvbiBmb3IgZ2V0L2NvdW50L2ZpbmQgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcG9pbnRlckZpZWxkcyBVc2VyIHBvaW50ZXIgZmllbGRzXG4gICAqL1xuICBzZXRSZWFkVXNlckZpZWxkcyhwb2ludGVyRmllbGRzKSB7XG4gICAgdGhpcy5fc2V0R3JvdXBQb2ludGVyUGVybWlzc2lvbigncmVhZFVzZXJGaWVsZHMnLCBwb2ludGVyRmllbGRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IFVzZXIgcG9pbnRlciBmaWVsZHNcbiAgICovXG4gIGdldFJlYWRVc2VyRmllbGRzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRHcm91cFBvaW50ZXJQZXJtaXNzaW9ucygncmVhZFVzZXJGaWVsZHMnKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVzZXIgcG9pbnRlciBmaWVsZHMgdG8gYWxsb3cgcGVybWlzc2lvbiBmb3IgY3JlYXRlL2RlbGV0ZS91cGRhdGUvYWRkRmllbGQgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwb2ludGVyRmllbGRzIFVzZXIgcG9pbnRlciBmaWVsZHNcbiAgICovXG4gIHNldFdyaXRlVXNlckZpZWxkcyhwb2ludGVyRmllbGRzKSB7XG4gICAgdGhpcy5fc2V0R3JvdXBQb2ludGVyUGVybWlzc2lvbignd3JpdGVVc2VyRmllbGRzJywgcG9pbnRlckZpZWxkcyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBVc2VyIHBvaW50ZXIgZmllbGRzXG4gICAqL1xuICBnZXRXcml0ZVVzZXJGaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEdyb3VwUG9pbnRlclBlcm1pc3Npb25zKCd3cml0ZVVzZXJGaWVsZHMnKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaXMgYWxsb3dlZCB0byByZXRyaWV2ZSBmaWVsZHMgZnJvbSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBmaWVsZHMgZmllbGRzIHRvIGJlIHByb3RlY3RlZFxuICAgKi9cbiAgc2V0UHJvdGVjdGVkRmllbGRzKHVzZXJJZCwgZmllbGRzKSB7XG4gICAgdGhpcy5fc2V0QXJyYXlBY2Nlc3MoJ3Byb3RlY3RlZEZpZWxkcycsIHVzZXJJZCwgZmllbGRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFycmF5IG9mIGZpZWxkcyBhcmUgYWNjZXNzYWJsZSB0byB0aGlzIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZ2V0UHJvdGVjdGVkRmllbGRzKHVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3MoJ3Byb3RlY3RlZEZpZWxkcycsIHVzZXJJZCwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpcyBhbGxvd2VkIHRvIHJlYWQgZnJvbSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgd2hldGhlciB0aGF0IHVzZXIgc2hvdWxkIGhhdmUgcmVhZCBhY2Nlc3MuXG4gICAqL1xuICBzZXRSZWFkQWNjZXNzKHVzZXJJZCwgYWxsb3dlZCkge1xuICAgIHRoaXMuX3NldEFjY2VzcygnZmluZCcsIHVzZXJJZCwgYWxsb3dlZCk7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCdnZXQnLCB1c2VySWQsIGFsbG93ZWQpO1xuICAgIHRoaXMuX3NldEFjY2VzcygnY291bnQnLCB1c2VySWQsIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlkIGlzICpleHBsaWNpdGx5KiBhbGxvd2VkIHRvIHJlYWQgZnJvbSB0aGlzIGNsYXNzLlxuICAgKiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHVzZXIgbWF5IHN0aWxsIGJlIGFibGUgdG8gYWNjZXNzIGl0IGlmXG4gICAqIGdldFB1YmxpY1JlYWRBY2Nlc3MgcmV0dXJucyB0cnVlIG9yIGEgcm9sZSB0aGF0IHRoZSB1c2VyIGJlbG9uZ3MgdG8gaGFzXG4gICAqIHdyaXRlIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZCwgb3IgYSBQYXJzZS5Sb2xlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFJlYWRBY2Nlc3ModXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcygnZmluZCcsIHVzZXJJZCkgJiYgdGhpcy5fZ2V0QWNjZXNzKCdnZXQnLCB1c2VySWQpICYmIHRoaXMuX2dldEFjY2VzcygnY291bnQnLCB1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpZCBpcyBhbGxvd2VkIHRvIHdyaXRlIHRvIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCBXaGV0aGVyIHRoYXQgdXNlciBzaG91bGQgaGF2ZSB3cml0ZSBhY2Nlc3MuXG4gICAqL1xuICBzZXRXcml0ZUFjY2Vzcyh1c2VySWQsIGFsbG93ZWQpIHtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ2NyZWF0ZScsIHVzZXJJZCwgYWxsb3dlZCk7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCd1cGRhdGUnLCB1c2VySWQsIGFsbG93ZWQpO1xuICAgIHRoaXMuX3NldEFjY2VzcygnZGVsZXRlJywgdXNlcklkLCBhbGxvd2VkKTtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ2FkZEZpZWxkJywgdXNlcklkLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaWQgaXMgKmV4cGxpY2l0bHkqIGFsbG93ZWQgdG8gd3JpdGUgdG8gdGhpcyBjbGFzcy5cbiAgICogRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB1c2VyIG1heSBzdGlsbCBiZSBhYmxlIHRvIHdyaXRlIGl0IGlmXG4gICAqIGdldFB1YmxpY1dyaXRlQWNjZXNzIHJldHVybnMgdHJ1ZSBvciBhIHJvbGUgdGhhdCB0aGUgdXNlciBiZWxvbmdzIHRvIGhhc1xuICAgKiB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRXcml0ZUFjY2Vzcyh1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKCdjcmVhdGUnLCB1c2VySWQpICYmIHRoaXMuX2dldEFjY2VzcygndXBkYXRlJywgdXNlcklkKSAmJiB0aGlzLl9nZXRBY2Nlc3MoJ2RlbGV0ZScsIHVzZXJJZCkgJiYgdGhpcy5fZ2V0QWNjZXNzKCdhZGRGaWVsZCcsIHVzZXJJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byByZWFkIGZyb20gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkXG4gICAqL1xuICBzZXRQdWJsaWNSZWFkQWNjZXNzKGFsbG93ZWQpIHtcbiAgICB0aGlzLnNldFJlYWRBY2Nlc3MoUFVCTElDX0tFWSwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byByZWFkIGZyb20gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRQdWJsaWNSZWFkQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFJlYWRBY2Nlc3MoUFVCTElDX0tFWSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byB3cml0ZSB0byB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWRcbiAgICovXG4gIHNldFB1YmxpY1dyaXRlQWNjZXNzKGFsbG93ZWQpIHtcbiAgICB0aGlzLnNldFdyaXRlQWNjZXNzKFBVQkxJQ19LRVksIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gd3JpdGUgdG8gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRQdWJsaWNXcml0ZUFjY2VzcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRXcml0ZUFjY2VzcyhQVUJMSUNfS0VZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHByb3RlY3QgZmllbGRzIGluIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGZpZWxkc1xuICAgKi9cbiAgc2V0UHVibGljUHJvdGVjdGVkRmllbGRzKGZpZWxkcykge1xuICAgIHRoaXMuc2V0UHJvdGVjdGVkRmllbGRzKFBVQkxJQ19LRVksIGZpZWxkcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byByZWFkIGZpZWxkcyBmcm9tIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGdldFB1YmxpY1Byb3RlY3RlZEZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm90ZWN0ZWRGaWVsZHMoUFVCTElDX0tFWSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byByZWFkIGZyb20gdGhpcyBjbGFzcy4gRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSByb2xlIG1heVxuICAgKiBzdGlsbCBiZSBhYmxlIHRvIHdyaXRlIGl0IGlmIGEgcGFyZW50IHJvbGUgaGFzIHJlYWQgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHJvbGUgaGFzIHJlYWQgYWNjZXNzLiBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBnZXRSb2xlUmVhZEFjY2Vzcyhyb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVhZEFjY2Vzcyh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byB3cml0ZSB0byB0aGlzIHVzZXIuIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgcm9sZSBtYXlcbiAgICogc3RpbGwgYmUgYWJsZSB0byB3cml0ZSBpdCBpZiBhIHBhcmVudCByb2xlIGhhcyB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgcm9sZSBoYXMgd3JpdGUgYWNjZXNzLiBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBnZXRSb2xlV3JpdGVBY2Nlc3Mocm9sZSkge1xuICAgIHJldHVybiB0aGlzLmdldFdyaXRlQWNjZXNzKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHJlYWQgZnJvbSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhlIGdpdmVuIHJvbGUgY2FuIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBzZXRSb2xlUmVhZEFjY2Vzcyhyb2xlLCBhbGxvd2VkKSB7XG4gICAgdGhpcy5zZXRSZWFkQWNjZXNzKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHdyaXRlIHRvIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGUgZ2l2ZW4gcm9sZSBjYW4gd3JpdGUgdGhpcyBvYmplY3QuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBzZXRSb2xlV3JpdGVBY2Nlc3Mocm9sZSwgYWxsb3dlZCkge1xuICAgIHRoaXMuc2V0V3JpdGVBY2Nlc3ModGhpcy5fZ2V0Um9sZU5hbWUocm9sZSksIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gY291bnQgdG8gdGhpcyB1c2VyLiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvbGUgbWF5XG4gICAqIHN0aWxsIGJlIGFibGUgdG8gY291bnQgaXQgaWYgYSBwYXJlbnQgcm9sZSBoYXMgY291bnQgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgZ2V0Um9sZVByb3RlY3RlZEZpZWxkcyhyb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvdGVjdGVkRmllbGRzKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHNldCBhY2Nlc3MgZmllbGQgaW4gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGZpZWxkcyBGaWVsZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IFJvbGUuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBzZXRSb2xlUHJvdGVjdGVkRmllbGRzKHJvbGUsIGZpZWxkcykge1xuICAgIHRoaXMuc2V0UHJvdGVjdGVkRmllbGRzKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpLCBmaWVsZHMpO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZUNMUDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2RlY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGVjb2RlXCIpKTtcbnZhciBfZW5jb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lbmNvZGVcIikpO1xudmFyIF9lc2NhcGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VzY2FwZVwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9TdG9yYWdlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlXCIpKTtcbi8qKlxuICogUGFyc2UuQ29uZmlnIGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpb24gb2YgY29uZmlndXJhdGlvbiBkYXRhIHRoYXRcbiAqIGNhbiBiZSBzZXQgZnJvbSB0aGUgUGFyc2UgZGFzaGJvYXJkLlxuICpcbiAqIEBhbGlhcyBQYXJzZS5Db25maWdcbiAqL1xuY2xhc3MgUGFyc2VDb25maWcge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImF0dHJpYnV0ZXNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9lc2NhcGVkQXR0cmlidXRlc1wiLCB2b2lkIDApO1xuICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuICAgIHRoaXMuX2VzY2FwZWRBdHRyaWJ1dGVzID0ge307XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZ2V0KGF0dHIpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2F0dHJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEhUTUwtZXNjYXBlZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGVzY2FwZShhdHRyKSB7XG4gICAgY29uc3QgaHRtbCA9IHRoaXMuX2VzY2FwZWRBdHRyaWJ1dGVzW2F0dHJdO1xuICAgIGlmIChodG1sKSB7XG4gICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gdGhpcy5hdHRyaWJ1dGVzW2F0dHJdO1xuICAgIGxldCBlc2NhcGVkID0gJyc7XG4gICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICBlc2NhcGVkID0gKDAsIF9lc2NhcGUuZGVmYXVsdCkodmFsLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICB0aGlzLl9lc2NhcGVkQXR0cmlidXRlc1thdHRyXSA9IGVzY2FwZWQ7XG4gICAgcmV0dXJuIGVzY2FwZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudGx5LWZldGNoZWQgY29uZmlndXJhdGlvbiBvYmplY3QsIGVpdGhlciBmcm9tXG4gICAqIG1lbW9yeSBvciBmcm9tIGxvY2FsIHN0b3JhZ2UgaWYgbmVjZXNzYXJ5LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5Db25maWd9IFRoZSBtb3N0IHJlY2VudGx5LWZldGNoZWQgUGFyc2UuQ29uZmlnIGlmIGl0XG4gICAqICAgICBleGlzdHMsIGVsc2UgYW4gZW1wdHkgUGFyc2UuQ29uZmlnLlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENvbmZpZ0NvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5jdXJyZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIG5ldyBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGEgbmV3bHktY3JlYXRlZFxuICAgKiAgICAgY29uZmlndXJhdGlvbiBvYmplY3Qgd2hlbiB0aGUgZ2V0IGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBnZXQoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDb25maWdDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0KG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUga2V5cyB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRycyBUaGUgY29uZmlnIHBhcmFtZXRlcnMgYW5kIHZhbHVlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IG1hc3RlcktleU9ubHlGbGFncyBUaGUgZmxhZ3MgdGhhdCBkZWZpbmUgd2hldGhlciBjb25maWcgcGFyYW1ldGVycyBsaXN0ZWRcbiAgICogaW4gYGF0dHJzYCBzaG91bGQgYmUgcmV0cmlldmFibGUgb25seSBieSB1c2luZyB0aGUgbWFzdGVyIGtleS5cbiAgICogRm9yIGV4YW1wbGU6IGBwYXJhbTE6IHRydWVgIG1ha2VzIGBwYXJhbTFgIG9ubHkgcmV0cmlldmFibGUgYnkgdXNpbmcgdGhlIG1hc3RlciBrZXkuXG4gICAqIElmIGEgcGFyYW1ldGVyIGlzIG5vdCBwcm92aWRlZCBvciBzZXQgdG8gYGZhbHNlYCwgaXQgY2FuIGJlIHJldHJpZXZlZCB3aXRob3V0XG4gICAqIHVzaW5nIHRoZSBtYXN0ZXIga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhIG5ld2x5LWNyZWF0ZWRcbiAgICogICAgIGNvbmZpZ3VyYXRpb24gb2JqZWN0IG9yIHdpdGggdGhlIGN1cnJlbnQgd2l0aCB0aGUgdXBkYXRlLlxuICAgKi9cbiAgc3RhdGljIHNhdmUoYXR0cnMsIG1hc3RlcktleU9ubHlGbGFncykge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDb25maWdDb250cm9sbGVyKCk7XG4gICAgLy9UbyBhdm9pZCBhIG1pc21hdGNoIHdpdGggdGhlIGxvY2FsIGFuZCB0aGUgY2xvdWQgY29uZmlnIHdlIGdldCBhIG5ldyB2ZXJzaW9uXG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuc2F2ZShhdHRycywgbWFzdGVyS2V5T25seUZsYWdzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLmdldCh7XG4gICAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGZvciB0ZXN0aW5nXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgX2NsZWFyQ2FjaGUoKSB7XG4gICAgY3VycmVudENvbmZpZyA9IG51bGw7XG4gIH1cbn1cbmxldCBjdXJyZW50Q29uZmlnID0gbnVsbDtcbmNvbnN0IENVUlJFTlRfQ09ORklHX0tFWSA9ICdjdXJyZW50Q29uZmlnJztcbmZ1bmN0aW9uIGRlY29kZVBheWxvYWQoZGF0YSkge1xuICB0cnkge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIGlmIChqc29uICYmIHR5cGVvZiBqc29uID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuICgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24pO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgY3VycmVudCgpIHtcbiAgICBpZiAoY3VycmVudENvbmZpZykge1xuICAgICAgcmV0dXJuIGN1cnJlbnRDb25maWc7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBQYXJzZUNvbmZpZygpO1xuICAgIGNvbnN0IHN0b3JhZ2VQYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9DT05GSUdfS0VZKTtcbiAgICBpZiAoIV9TdG9yYWdlLmRlZmF1bHQuYXN5bmMoKSkge1xuICAgICAgY29uc3QgY29uZmlnRGF0YSA9IF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbShzdG9yYWdlUGF0aCk7XG4gICAgICBpZiAoY29uZmlnRGF0YSkge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGVjb2RlUGF5bG9hZChjb25maWdEYXRhKTtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBjb25maWcuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgICAgY3VycmVudENvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gICAgLy8gUmV0dXJuIGEgcHJvbWlzZSBmb3IgYXN5bmMgc3RvcmFnZSBjb250cm9sbGVyc1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhzdG9yYWdlUGF0aCkudGhlbihjb25maWdEYXRhID0+IHtcbiAgICAgIGlmIChjb25maWdEYXRhKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkZWNvZGVQYXlsb2FkKGNvbmZpZ0RhdGEpO1xuICAgICAgICBpZiAoYXR0cmlidXRlcykge1xuICAgICAgICAgIGNvbmZpZy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICAgICAgICBjdXJyZW50Q29uZmlnID0gY29uZmlnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0pO1xuICB9LFxuICBnZXQoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2NvbmZpZycsIHt9LCBvcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlLnBhcmFtcykge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9KU09OLCAnQ29uZmlnIEpTT04gcmVzcG9uc2UgaW52YWxpZC4nKTtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBQYXJzZUNvbmZpZygpO1xuICAgICAgY29uZmlnLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgYXR0ciBpbiByZXNwb25zZS5wYXJhbXMpIHtcbiAgICAgICAgY29uZmlnLmF0dHJpYnV0ZXNbYXR0cl0gPSAoMCwgX2RlY29kZS5kZWZhdWx0KShyZXNwb25zZS5wYXJhbXNbYXR0cl0pO1xuICAgICAgfVxuICAgICAgY3VycmVudENvbmZpZyA9IGNvbmZpZztcbiAgICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX0NPTkZJR19LRVkpLCAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShyZXNwb25zZS5wYXJhbXMpKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBzYXZlKGF0dHJzLCBtYXN0ZXJLZXlPbmx5RmxhZ3MpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3QgZW5jb2RlZEF0dHJzID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgIGVuY29kZWRBdHRyc1trZXldID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkoYXR0cnNba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQVVQnLCAnY29uZmlnJywge1xuICAgICAgcGFyYW1zOiBlbmNvZGVkQXR0cnMsXG4gICAgICBtYXN0ZXJLZXlPbmx5OiBtYXN0ZXJLZXlPbmx5RmxhZ3NcbiAgICB9LCB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgJ0Vycm9yIG9jY3VyZWQgdXBkYXRpbmcgQ29uZmlnLicpO1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0Q29uZmlnQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZUNvbmZpZzsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkyID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5MihleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBQYXJzZS5FcnJvciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gY29kZSBhbmQgbWVzc2FnZS5cbiAqXG4gKiBQYXJzZS5Db3JlTWFuYWdlci5zZXQoJ1BBUlNFX0VSUk9SUycsIFt7IGNvZGUsIG1lc3NhZ2UgfV0pIGNhbiBiZSB1c2UgdG8gb3ZlcnJpZGUgZXJyb3IgbWVzc2FnZXMuXG4gKlxuICogQGFsaWFzIFBhcnNlLkVycm9yXG4gKi9cbmNsYXNzIFBhcnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZSBBbiBlcnJvciBjb2RlIGNvbnN0YW50IGZyb20gPGNvZGU+UGFyc2UuRXJyb3I8L2NvZGU+LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBBIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICB2YXIgX2NvbnRleHQ7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkodGhpcywgXCJjb2RlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkodGhpcywgXCJtZXNzYWdlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkodGhpcywgXCJvYmplY3RcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KSh0aGlzLCBcImVycm9yc1wiLCB2b2lkIDApO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgbGV0IGN1c3RvbU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnUEFSU0VfRVJST1JTJykpLmNhbGwoX2NvbnRleHQsIGVycm9yID0+IHtcbiAgICAgIGlmIChlcnJvci5jb2RlID09PSBjb2RlICYmIGVycm9yLmNvZGUpIHtcbiAgICAgICAgY3VzdG9tTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgJ21lc3NhZ2UnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGN1c3RvbU1lc3NhZ2VcbiAgICB9KTtcbiAgfVxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1BhcnNlRXJyb3I6ICcgKyB0aGlzLmNvZGUgKyAnICcgKyB0aGlzLm1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHNvbWUgZXJyb3Igb3RoZXIgdGhhbiB0aG9zZSBlbnVtZXJhdGVkIGhlcmUuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBPVEhFUl9DQVVTRVxuICAgKiBAc3RhdGljXG4gICAqL1xufVxuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJPVEhFUl9DQVVTRVwiLCAtMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZyB3aXRoIHRoZSBzZXJ2ZXIuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVEVSTkFMX1NFUlZFUl9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVEVSTkFMX1NFUlZFUl9FUlJPUlwiLCAxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBQYXJzZSBzZXJ2ZXJzIGZhaWxlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gQ09OTkVDVElPTl9GQUlMRURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJDT05ORUNUSU9OX0ZBSUxFRFwiLCAxMDApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhlIHNwZWNpZmllZCBvYmplY3QgZG9lc24ndCBleGlzdC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gT0JKRUNUX05PVF9GT1VORFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk9CSkVDVF9OT1RfRk9VTkRcIiwgMTAxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHlvdSB0cmllZCB0byBxdWVyeSB3aXRoIGEgZGF0YXR5cGUgdGhhdCBkb2Vzbid0XG4gKiBzdXBwb3J0IGl0LCBsaWtlIGV4YWN0IG1hdGNoaW5nIGFuIGFycmF5IG9yIG9iamVjdC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9RVUVSWVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfUVVFUllcIiwgMTAyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgbWlzc2luZyBvciBpbnZhbGlkIGNsYXNzbmFtZS4gQ2xhc3NuYW1lcyBhcmVcbiAqIGNhc2Utc2Vuc2l0aXZlLiBUaGV5IG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciwgYW5kIGEtekEtWjAtOV8gYXJlIHRoZVxuICogb25seSB2YWxpZCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0NMQVNTX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0NMQVNTX05BTUVcIiwgMTAzKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIHVuc3BlY2lmaWVkIG9iamVjdCBpZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTUlTU0lOR19PQkpFQ1RfSURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJNSVNTSU5HX09CSkVDVF9JRFwiLCAxMDQpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBrZXkgbmFtZS4gS2V5cyBhcmUgY2FzZS1zZW5zaXRpdmUuIFRoZXlcbiAqIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciwgYW5kIGEtekEtWjAtOV8gYXJlIHRoZSBvbmx5IHZhbGlkIGNoYXJhY3RlcnMuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfS0VZX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0tFWV9OQU1FXCIsIDEwNSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhIG1hbGZvcm1lZCBwb2ludGVyLiBZb3Ugc2hvdWxkIG5vdCBzZWUgdGhpcyB1bmxlc3NcbiAqIHlvdSBoYXZlIGJlZW4gbXVja2luZyBhYm91dCBjaGFuZ2luZyBpbnRlcm5hbCBQYXJzZSBjb2RlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX1BPSU5URVJcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1BPSU5URVJcIiwgMTA2KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYmFkbHkgZm9ybWVkIEpTT04gd2FzIHJlY2VpdmVkIHVwc3RyZWFtLiBUaGlzXG4gKiBlaXRoZXIgaW5kaWNhdGVzIHlvdSBoYXZlIGRvbmUgc29tZXRoaW5nIHVudXN1YWwgd2l0aCBtb2RpZnlpbmcgaG93XG4gKiB0aGluZ3MgZW5jb2RlIHRvIEpTT04sIG9yIHRoZSBuZXR3b3JrIGlzIGZhaWxpbmcgYmFkbHkuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfSlNPTlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfSlNPTlwiLCAxMDcpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgZmVhdHVyZSB5b3UgdHJpZWQgdG8gYWNjZXNzIGlzIG9ubHlcbiAqIGF2YWlsYWJsZSBpbnRlcm5hbGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBDT01NQU5EX1VOQVZBSUxBQkxFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiQ09NTUFORF9VTkFWQUlMQUJMRVwiLCAxMDgpO1xuLyoqXG4gKiBZb3UgbXVzdCBjYWxsIFBhcnNlLmluaXRpYWxpemUgYmVmb3JlIHVzaW5nIHRoZSBQYXJzZSBsaWJyYXJ5LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBOT1RfSU5JVElBTElaRURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJOT1RfSU5JVElBTElaRURcIiwgMTA5KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBmaWVsZCB3YXMgc2V0IHRvIGFuIGluY29uc2lzdGVudCB0eXBlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTkNPUlJFQ1RfVFlQRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOQ09SUkVDVF9UWVBFXCIsIDExMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBpbnZhbGlkIGNoYW5uZWwgbmFtZS4gQSBjaGFubmVsIG5hbWUgaXMgZWl0aGVyXG4gKiBhbiBlbXB0eSBzdHJpbmcgKHRoZSBicm9hZGNhc3QgY2hhbm5lbCkgb3IgY29udGFpbnMgb25seSBhLXpBLVowLTlfXG4gKiBjaGFyYWN0ZXJzIGFuZCBzdGFydHMgd2l0aCBhIGxldHRlci5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9DSEFOTkVMX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0NIQU5ORUxfTkFNRVwiLCAxMTIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBwdXNoIGlzIG1pc2NvbmZpZ3VyZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFBVU0hfTUlTQ09ORklHVVJFRFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlBVU0hfTUlTQ09ORklHVVJFRFwiLCAxMTUpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgb2JqZWN0IGlzIHRvbyBsYXJnZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gT0JKRUNUX1RPT19MQVJHRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk9CSkVDVF9UT09fTEFSR0VcIiwgMTE2KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIG9wZXJhdGlvbiBpc24ndCBhbGxvd2VkIGZvciBjbGllbnRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBPUEVSQVRJT05fRk9SQklEREVOXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiT1BFUkFUSU9OX0ZPUkJJRERFTlwiLCAxMTkpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhlIHJlc3VsdCB3YXMgbm90IGZvdW5kIGluIHRoZSBjYWNoZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gQ0FDSEVfTUlTU1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkNBQ0hFX01JU1NcIiwgMTIwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYW4gaW52YWxpZCBrZXkgd2FzIHVzZWQgaW4gYSBuZXN0ZWRcbiAqIEpTT05PYmplY3QuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfTkVTVEVEX0tFWVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfTkVTVEVEX0tFWVwiLCAxMjEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhbiBpbnZhbGlkIGZpbGVuYW1lIHdhcyB1c2VkIGZvciBQYXJzZUZpbGUuXG4gKiBBIHZhbGlkIGZpbGUgbmFtZSBjb250YWlucyBvbmx5IGEtekEtWjAtOV8uIGNoYXJhY3RlcnMgYW5kIGlzIGJldHdlZW4gMVxuICogYW5kIDEyOCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0ZJTEVfTkFNRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfRklMRV9OQU1FXCIsIDEyMik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBpbnZhbGlkIEFDTCB3YXMgcHJvdmlkZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfQUNMXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9BQ0xcIiwgMTIzKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgdGltZWQgb3V0IG9uIHRoZSBzZXJ2ZXIuIFR5cGljYWxseVxuICogdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdCBpcyB0b28gZXhwZW5zaXZlIHRvIHJ1bi5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gVElNRU9VVFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlRJTUVPVVRcIiwgMTI0KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGVtYWlsIGFkZHJlc3Mgd2FzIGludmFsaWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfRU1BSUxfQUREUkVTU1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfRU1BSUxfQUREUkVTU1wiLCAxMjUpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYSBtaXNzaW5nIGNvbnRlbnQgdHlwZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTUlTU0lOR19DT05URU5UX1RZUEVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJNSVNTSU5HX0NPTlRFTlRfVFlQRVwiLCAxMjYpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYSBtaXNzaW5nIGNvbnRlbnQgbGVuZ3RoLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBNSVNTSU5HX0NPTlRFTlRfTEVOR1RIXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTUlTU0lOR19DT05URU5UX0xFTkdUSFwiLCAxMjcpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBjb250ZW50IGxlbmd0aC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9DT05URU5UX0xFTkdUSFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfQ09OVEVOVF9MRU5HVEhcIiwgMTI4KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgZmlsZSB0aGF0IHdhcyB0b28gbGFyZ2UuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZJTEVfVE9PX0xBUkdFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRklMRV9UT09fTEFSR0VcIiwgMTI5KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGVycm9yIHNhdmluZyBhIGZpbGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZJTEVfU0FWRV9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkZJTEVfU0FWRV9FUlJPUlwiLCAxMzApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHVuaXF1ZSBmaWVsZCB3YXMgZ2l2ZW4gYSB2YWx1ZSB0aGF0IGlzXG4gKiBhbHJlYWR5IHRha2VuLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBEVVBMSUNBVEVfVkFMVUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJEVVBMSUNBVEVfVkFMVUVcIiwgMTM3KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSByb2xlJ3MgbmFtZSBpcyBpbnZhbGlkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX1JPTEVfTkFNRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfUk9MRV9OQU1FXCIsIDEzOSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGFuIGFwcGxpY2F0aW9uIHF1b3RhIHdhcyBleGNlZWRlZC4gIFVwZ3JhZGUgdG9cbiAqIHJlc29sdmUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEVYQ0VFREVEX1FVT1RBXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRVhDRUVERURfUVVPVEFcIiwgMTQwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBDbG91ZCBDb2RlIHNjcmlwdCBmYWlsZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNDUklQVF9GQUlMRURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJTQ1JJUFRfRkFJTEVEXCIsIDE0MSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgQ2xvdWQgQ29kZSB2YWxpZGF0aW9uIGZhaWxlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gVkFMSURBVElPTl9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlZBTElEQVRJT05fRVJST1JcIiwgMTQyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgaW52YWxpZCBpbWFnZSBkYXRhIHdhcyBwcm92aWRlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9JTUFHRV9EQVRBXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9JTUFHRV9EQVRBXCIsIDE0Myk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiB1bnNhdmVkIGZpbGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFVOU0FWRURfRklMRV9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlVOU0FWRURfRklMRV9FUlJPUlwiLCAxNTEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBwdXNoIHRpbWUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfUFVTSF9USU1FX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9QVVNIX1RJTUVfRVJST1JcIiwgMTUyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGVycm9yIGRlbGV0aW5nIGEgZmlsZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRklMRV9ERUxFVEVfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJGSUxFX0RFTEVURV9FUlJPUlwiLCAxNTMpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gZXJyb3IgZGVsZXRpbmcgYW4gdW5uYW1lZCBmaWxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGSUxFX0RFTEVURV9VTk5BTUVEX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRklMRV9ERUxFVEVfVU5OQU1FRF9FUlJPUlwiLCAxNjEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gaGFzIGV4Y2VlZGVkIGl0cyByZXF1ZXN0XG4gKiBsaW1pdC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gUkVRVUVTVF9MSU1JVF9FWENFRURFRFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlJFUVVFU1RfTElNSVRfRVhDRUVERURcIiwgMTU1KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3Qgd2FzIGEgZHVwbGljYXRlIGFuZCBoYXMgYmVlbiBkaXNjYXJkZWQgZHVlIHRvXG4gKiBpZGVtcG90ZW5jeSBydWxlcy5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRFVQTElDQVRFX1JFUVVFU1RcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJEVVBMSUNBVEVfUkVRVUVTVFwiLCAxNTkpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBldmVudCBuYW1lLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0VWRU5UX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0VWRU5UX05BTUVcIiwgMTYwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBmaWVsZCBoYWQgYW4gaW52YWxpZCB2YWx1ZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9WQUxVRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfVkFMVUVcIiwgMTYyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXJuYW1lIGlzIG1pc3Npbmcgb3IgZW1wdHkuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFVTRVJOQU1FX01JU1NJTkdcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJVU0VSTkFNRV9NSVNTSU5HXCIsIDIwMCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBwYXNzd29yZCBpcyBtaXNzaW5nIG9yIGVtcHR5LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBQQVNTV09SRF9NSVNTSU5HXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiUEFTU1dPUkRfTUlTU0lOR1wiLCAyMDEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlcm5hbWUgaGFzIGFscmVhZHkgYmVlbiB0YWtlbi5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gVVNFUk5BTUVfVEFLRU5cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJVU0VSTkFNRV9UQUtFTlwiLCAyMDIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgZW1haWwgaGFzIGFscmVhZHkgYmVlbiB0YWtlbi5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRU1BSUxfVEFLRU5cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJFTUFJTF9UQUtFTlwiLCAyMDMpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgZW1haWwgaXMgbWlzc2luZywgYnV0IG11c3QgYmUgc3BlY2lmaWVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBFTUFJTF9NSVNTSU5HXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRU1BSUxfTUlTU0lOR1wiLCAyMDQpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGVtYWlsIHdhcyBub3QgZm91bmQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEVNQUlMX05PVF9GT1VORFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkVNQUlMX05PVF9GT1VORFwiLCAyMDUpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHVzZXIgb2JqZWN0IHdpdGhvdXQgYSB2YWxpZCBzZXNzaW9uIGNvdWxkXG4gKiBub3QgYmUgYWx0ZXJlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gU0VTU0lPTl9NSVNTSU5HXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiU0VTU0lPTl9NSVNTSU5HXCIsIDIwNik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgdXNlciBjYW4gb25seSBiZSBjcmVhdGVkIHRocm91Z2ggc2lnbnVwLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBNVVNUX0NSRUFURV9VU0VSX1RIUk9VR0hfU0lHTlVQXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTVVTVF9DUkVBVEVfVVNFUl9USFJPVUdIX1NJR05VUFwiLCAyMDcpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhbiBhbiBhY2NvdW50IGJlaW5nIGxpbmtlZCBpcyBhbHJlYWR5IGxpbmtlZFxuICogdG8gYW5vdGhlciB1c2VyLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBBQ0NPVU5UX0FMUkVBRFlfTElOS0VEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiQUNDT1VOVF9BTFJFQURZX0xJTktFRFwiLCAyMDgpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgY3VycmVudCBzZXNzaW9uIHRva2VuIGlzIGludmFsaWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfU0VTU0lPTl9UT0tFTlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfU0VTU0lPTl9UT0tFTlwiLCAyMDkpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gZXJyb3IgZW5hYmxpbmcgb3IgdmVyaWZ5aW5nIE1GQVxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBNRkFfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJNRkFfRVJST1JcIiwgMjEwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB2YWxpZCBNRkEgdG9rZW4gbXVzdCBiZSBwcm92aWRlZFxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBNRkFfVE9LRU5fUkVRVUlSRURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJNRkFfVE9LRU5fUkVRVUlSRURcIiwgMjExKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB1c2VyIGNhbm5vdCBiZSBsaW5rZWQgdG8gYW4gYWNjb3VudCBiZWNhdXNlXG4gKiB0aGF0IGFjY291bnQncyBpZCBjb3VsZCBub3QgYmUgZm91bmQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IExJTktFRF9JRF9NSVNTSU5HXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTElOS0VEX0lEX01JU1NJTkdcIiwgMjUwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB1c2VyIHdpdGggYSBsaW5rZWQgKGUuZy4gRmFjZWJvb2spIGFjY291bnRcbiAqIGhhcyBhbiBpbnZhbGlkIHNlc3Npb24uXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfTElOS0VEX1NFU1NJT05cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0xJTktFRF9TRVNTSU9OXCIsIDI1MSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgc2VydmljZSBiZWluZyBsaW5rZWQgKGUuZy4gRmFjZWJvb2sgb3JcbiAqIFR3aXR0ZXIpIGlzIHVuc3VwcG9ydGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBVTlNVUFBPUlRFRF9TRVJWSUNFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiVU5TVVBQT1JURURfU0VSVklDRVwiLCAyNTIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBvcGVyYXRpb24gb2NjdXJlZCBvbiBzY2hlbWFcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9TQ0hFTUFfT1BFUkFUSU9OXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9TQ0hFTUFfT1BFUkFUSU9OXCIsIDI1NSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZXJlIHdlcmUgbXVsdGlwbGUgZXJyb3JzLiBBZ2dyZWdhdGUgZXJyb3JzXG4gKiBoYXZlIGFuIFwiZXJyb3JzXCIgcHJvcGVydHksIHdoaWNoIGlzIGFuIGFycmF5IG9mIGVycm9yIG9iamVjdHMgd2l0aCBtb3JlXG4gKiBkZXRhaWwgYWJvdXQgZWFjaCBlcnJvciB0aGF0IG9jY3VycmVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBBR0dSRUdBVEVfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJBR0dSRUdBVEVfRVJST1JcIiwgNjAwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSBjbGllbnQgd2FzIHVuYWJsZSB0byByZWFkIGFuIGlucHV0IGZpbGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZJTEVfUkVBRF9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkZJTEVfUkVBRF9FUlJPUlwiLCA2MDEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYSByZWFsIGVycm9yIGNvZGUgaXMgdW5hdmFpbGFibGUgYmVjYXVzZVxuICogd2UgaGFkIHRvIHVzZSBhbiBYRG9tYWluUmVxdWVzdCBvYmplY3QgdG8gYWxsb3cgQ09SUyByZXF1ZXN0cyBpblxuICogSW50ZXJuZXQgRXhwbG9yZXIsIHdoaWNoIHN0cmlwcyB0aGUgYm9keSBmcm9tIEhUVFAgcmVzcG9uc2VzIHRoYXQgaGF2ZVxuICogYSBub24tMlhYIHN0YXR1cyBjb2RlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBYX0RPTUFJTl9SRVFVRVNUXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiWF9ET01BSU5fUkVRVUVTVFwiLCA2MDIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VFcnJvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX3NsaWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zbGljZVwiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfWGhyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9YaHIud2VhcHBcIikpO1xuLyogZ2xvYmFsIFhNTEh0dHBSZXF1ZXN0LCBCbG9iICovXG5cbmxldCBYSFIgPSBudWxsO1xuaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgWEhSID0gWE1MSHR0cFJlcXVlc3Q7XG59XG5mdW5jdGlvbiBiNjREaWdpdChudW1iZXIpIHtcbiAgaWYgKG51bWJlciA8IDI2KSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyBudW1iZXIpO1xuICB9XG4gIGlmIChudW1iZXIgPCA1Mikge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDk3ICsgKG51bWJlciAtIDI2KSk7XG4gIH1cbiAgaWYgKG51bWJlciA8IDYyKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoNDggKyAobnVtYmVyIC0gNTIpKTtcbiAgfVxuICBpZiAobnVtYmVyID09PSA2Mikge1xuICAgIHJldHVybiAnKyc7XG4gIH1cbiAgaWYgKG51bWJlciA9PT0gNjMpIHtcbiAgICByZXR1cm4gJy8nO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIGVuY29kZSBsYXJnZSBkaWdpdCAnICsgbnVtYmVyICsgJyBpbiBiYXNlNjQuJyk7XG59XG5cbi8qKlxuICogQSBQYXJzZS5GaWxlIGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpb24gb2YgYSBmaWxlIHRoYXQgaXMgc2F2ZWQgdG8gdGhlIFBhcnNlXG4gKiBjbG91ZC5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuRmlsZVxuICovXG5jbGFzcyBQYXJzZUZpbGUge1xuICAvKipcbiAgICogQHBhcmFtIG5hbWUge1N0cmluZ30gVGhlIGZpbGUncyBuYW1lLiBUaGlzIHdpbGwgYmUgcHJlZml4ZWQgYnkgYSB1bmlxdWVcbiAgICogICAgIHZhbHVlIG9uY2UgdGhlIGZpbGUgaGFzIGZpbmlzaGVkIHNhdmluZy4gVGhlIGZpbGUgbmFtZSBtdXN0IGJlZ2luIHdpdGhcbiAgICogICAgIGFuIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIsIGFuZCBjb25zaXN0IG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLFxuICAgKiAgICAgcGVyaW9kcywgc3BhY2VzLCB1bmRlcnNjb3Jlcywgb3IgZGFzaGVzLlxuICAgKiBAcGFyYW0gZGF0YSB7QXJyYXl9IFRoZSBkYXRhIGZvciB0aGUgZmlsZSwgYXMgZWl0aGVyOlxuICAgKiAgICAgMS4gYW4gQXJyYXkgb2YgYnl0ZSB2YWx1ZSBOdW1iZXJzLCBvclxuICAgKiAgICAgMi4gYW4gT2JqZWN0IGxpa2UgeyBiYXNlNjQ6IFwiLi4uXCIgfSB3aXRoIGEgYmFzZTY0LWVuY29kZWQgU3RyaW5nLlxuICAgKiAgICAgMy4gYW4gT2JqZWN0IGxpa2UgeyB1cmk6IFwiLi4uXCIgfSB3aXRoIGEgdXJpIFN0cmluZy5cbiAgICogICAgIDQuIGEgRmlsZSBvYmplY3Qgc2VsZWN0ZWQgd2l0aCBhIGZpbGUgdXBsb2FkIGNvbnRyb2wuICgzKSBvbmx5IHdvcmtzXG4gICAqICAgICAgICBpbiBGaXJlZm94IDMuNissIFNhZmFyaSA2LjAuMissIENocm9tZSA3KywgYW5kIElFIDEwKy5cbiAgICogICAgICAgIEZvciBleGFtcGxlOlxuICAgKiA8cHJlPlxuICAgKiB2YXIgZmlsZVVwbG9hZENvbnRyb2wgPSAkKFwiI3Byb2ZpbGVQaG90b0ZpbGVVcGxvYWRcIilbMF07XG4gICAqIGlmIChmaWxlVXBsb2FkQ29udHJvbC5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAqICAgdmFyIGZpbGUgPSBmaWxlVXBsb2FkQ29udHJvbC5maWxlc1swXTtcbiAgICogICB2YXIgbmFtZSA9IFwicGhvdG8uanBnXCI7XG4gICAqICAgdmFyIHBhcnNlRmlsZSA9IG5ldyBQYXJzZS5GaWxlKG5hbWUsIGZpbGUpO1xuICAgKiAgIHBhcnNlRmlsZS5zYXZlKCkudGhlbihmdW5jdGlvbigpIHtcbiAgICogICAgIC8vIFRoZSBmaWxlIGhhcyBiZWVuIHNhdmVkIHRvIFBhcnNlLlxuICAgKiAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAqICAgICAvLyBUaGUgZmlsZSBlaXRoZXIgY291bGQgbm90IGJlIHJlYWQsIG9yIGNvdWxkIG5vdCBiZSBzYXZlZCB0byBQYXJzZS5cbiAgICogICB9KTtcbiAgICogfTwvcHJlPlxuICAgKiBAcGFyYW0gdHlwZSB7U3RyaW5nfSBPcHRpb25hbCBDb250ZW50LVR5cGUgaGVhZGVyIHRvIHVzZSBmb3IgdGhlIGZpbGUuIElmXG4gICAqICAgICB0aGlzIGlzIG9taXR0ZWQsIHRoZSBjb250ZW50IHR5cGUgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSBuYW1lJ3NcbiAgICogICAgIGV4dGVuc2lvbi5cbiAgICogQHBhcmFtIG1ldGFkYXRhIHtvYmplY3R9IE9wdGlvbmFsIGtleSB2YWx1ZSBwYWlycyB0byBiZSBzdG9yZWQgd2l0aCBmaWxlIG9iamVjdFxuICAgKiBAcGFyYW0gdGFncyB7b2JqZWN0fSBPcHRpb25hbCBrZXkgdmFsdWUgcGFpcnMgdG8gYmUgc3RvcmVkIHdpdGggZmlsZSBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRhdGEsIHR5cGUsIG1ldGFkYXRhLCB0YWdzKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfbmFtZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3VybFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3NvdXJjZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3ByZXZpb3VzU2F2ZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2RhdGFcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9yZXF1ZXN0VGFza1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX21ldGFkYXRhXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdGFnc1wiLCB2b2lkIDApO1xuICAgIGNvbnN0IHNwZWNpZmllZFR5cGUgPSB0eXBlIHx8ICcnO1xuICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICAgIHRoaXMuX21ldGFkYXRhID0gbWV0YWRhdGEgfHwge307XG4gICAgdGhpcy5fdGFncyA9IHRhZ3MgfHwge307XG4gICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShkYXRhKSkge1xuICAgICAgICB0aGlzLl9kYXRhID0gUGFyc2VGaWxlLmVuY29kZUJhc2U2NChkYXRhKTtcbiAgICAgICAgdGhpcy5fc291cmNlID0ge1xuICAgICAgICAgIGZvcm1hdDogJ2Jhc2U2NCcsXG4gICAgICAgICAgYmFzZTY0OiB0aGlzLl9kYXRhLFxuICAgICAgICAgIHR5cGU6IHNwZWNpZmllZFR5cGVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHtcbiAgICAgICAgICBmb3JtYXQ6ICdmaWxlJyxcbiAgICAgICAgICBmaWxlOiBkYXRhLFxuICAgICAgICAgIHR5cGU6IHNwZWNpZmllZFR5cGVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YS51cmkgPT09ICdzdHJpbmcnICYmIGRhdGEudXJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fc291cmNlID0ge1xuICAgICAgICAgIGZvcm1hdDogJ3VyaScsXG4gICAgICAgICAgdXJpOiBkYXRhLnVyaSxcbiAgICAgICAgICB0eXBlOiBzcGVjaWZpZWRUeXBlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEuYmFzZTY0ID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgX2NvbnRleHQsIF9jb250ZXh0MiwgX2NvbnRleHQzO1xuICAgICAgICBjb25zdCBiYXNlNjQgPSAoMCwgX3NsaWNlLmRlZmF1bHQpKF9jb250ZXh0ID0gZGF0YS5iYXNlNjQuc3BsaXQoJywnKSkuY2FsbChfY29udGV4dCwgLTEpWzBdO1xuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IHNwZWNpZmllZFR5cGUgfHwgKDAsIF9zbGljZS5kZWZhdWx0KShfY29udGV4dDIgPSAoMCwgX3NsaWNlLmRlZmF1bHQpKF9jb250ZXh0MyA9IGRhdGEuYmFzZTY0LnNwbGl0KCc7JykpLmNhbGwoX2NvbnRleHQzLCAwLCAxKVswXS5zcGxpdCgnOicpKS5jYWxsKF9jb250ZXh0MiwgMSwgMilbMF0gfHwgJ3RleHQvcGxhaW4nO1xuICAgICAgICB0aGlzLl9kYXRhID0gYmFzZTY0O1xuICAgICAgICB0aGlzLl9zb3VyY2UgPSB7XG4gICAgICAgICAgZm9ybWF0OiAnYmFzZTY0JyxcbiAgICAgICAgICBiYXNlNjQsXG4gICAgICAgICAgdHlwZTogZGF0YVR5cGVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBQYXJzZS5GaWxlIHdpdGggdGhhdCBkYXRhLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSBmaWxlLCBkb3dubG9hZGluZyBpdCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LlxuICAgKiBEYXRhIGlzIHByZXNlbnQgaWYgaW5pdGlhbGl6ZWQgd2l0aCBCeXRlIEFycmF5LCBCYXNlNjQgb3IgU2F2ZWQgd2l0aCBVcmkuXG4gICAqIERhdGEgaXMgY2xlYXJlZCBpZiBzYXZlZCB3aXRoIEZpbGUgb2JqZWN0IHNlbGVjdGVkIHdpdGggYSBmaWxlIHVwbG9hZCBjb250cm9sXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZSB3aXRoIGJhc2U2NCBkYXRhXG4gICAqL1xuICBhc3luYyBnZXREYXRhKCkge1xuICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl91cmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJldHJpZXZlIGRhdGEgZm9yIHVuc2F2ZWQgUGFyc2VGaWxlLicpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RmlsZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250cm9sbGVyLmRvd25sb2FkKHRoaXMuX3VybCwge1xuICAgICAgcmVxdWVzdFRhc2s6IHRhc2sgPT4gdGhpcy5fcmVxdWVzdFRhc2sgPSB0YXNrXG4gICAgfSk7XG4gICAgdGhpcy5fZGF0YSA9IHJlc3VsdC5iYXNlNjQ7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gQmVmb3JlIHNhdmUgaXMgY2FsbGVkLCB0aGlzIGlzIHRoZSBmaWxlbmFtZVxuICAgKiBnaXZlbiBieSB0aGUgdXNlci4gQWZ0ZXIgc2F2ZSBpcyBjYWxsZWQsIHRoYXQgbmFtZSBnZXRzIHByZWZpeGVkIHdpdGggYVxuICAgKiB1bmlxdWUgaWRlbnRpZmllci5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdXJsIG9mIHRoZSBmaWxlLiBJdCBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB5b3Ugc2F2ZSB0aGUgZmlsZSBvclxuICAgKiBhZnRlciB5b3UgZ2V0IHRoZSBmaWxlIGZyb20gYSBQYXJzZS5PYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIEFuIG9iamVjdCB0byBzcGVjaWZ5IHVybCBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZm9yY2VTZWN1cmVdIGZvcmNlIHRoZSB1cmwgdG8gYmUgc2VjdXJlXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqL1xuICB1cmwob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmICghdGhpcy5fdXJsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZvcmNlU2VjdXJlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdXJsLnJlcGxhY2UoL15odHRwOlxcL1xcLy9pLCAnaHR0cHM6Ly8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbWV0YWRhdGEgb2YgdGhlIGZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICBtZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGFncyBvZiB0aGUgZmlsZS5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHRhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ3M7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIGZpbGUgdG8gdGhlIFBhcnNlIGNsb3VkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPnByb2dyZXNzOiBJbiBCcm93c2VyIG9ubHksIGNhbGxiYWNrIGZvciB1cGxvYWQgcHJvZ3Jlc3MuIEZvciBleGFtcGxlOlxuICAgKiA8cHJlPlxuICAgKiBsZXQgcGFyc2VGaWxlID0gbmV3IFBhcnNlLkZpbGUobmFtZSwgZmlsZSk7XG4gICAqIHBhcnNlRmlsZS5zYXZlKHtcbiAgICogICBwcm9ncmVzczogKHByb2dyZXNzVmFsdWUsIGxvYWRlZCwgdG90YWwsIHsgdHlwZSB9KSA9PiB7XG4gICAqICAgICBpZiAodHlwZSA9PT0gXCJ1cGxvYWRcIiAmJiBwcm9ncmVzc1ZhbHVlICE9PSBudWxsKSB7XG4gICAqICAgICAgIC8vIFVwZGF0ZSB0aGUgVUkgdXNpbmcgcHJvZ3Jlc3NWYWx1ZVxuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIDwvcHJlPlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZSB8IHVuZGVmaW5lZH0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIHNhdmUgZmluaXNoZXMuXG4gICAqL1xuICBzYXZlKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLnJlcXVlc3RUYXNrID0gdGFzayA9PiB0aGlzLl9yZXF1ZXN0VGFzayA9IHRhc2s7XG4gICAgb3B0aW9ucy5tZXRhZGF0YSA9IHRoaXMuX21ldGFkYXRhO1xuICAgIG9wdGlvbnMudGFncyA9IHRoaXMuX3RhZ3M7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEZpbGVDb250cm9sbGVyKCk7XG4gICAgaWYgKCF0aGlzLl9wcmV2aW91c1NhdmUpIHtcbiAgICAgIGlmICh0aGlzLl9zb3VyY2UuZm9ybWF0ID09PSAnZmlsZScpIHtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTYXZlID0gY29udHJvbGxlci5zYXZlRmlsZSh0aGlzLl9uYW1lLCB0aGlzLl9zb3VyY2UsIG9wdGlvbnMpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLl9uYW1lID0gcmVzLm5hbWU7XG4gICAgICAgICAgdGhpcy5fdXJsID0gcmVzLnVybDtcbiAgICAgICAgICB0aGlzLl9kYXRhID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2UuZm9ybWF0ID09PSAndXJpJykge1xuICAgICAgICB0aGlzLl9wcmV2aW91c1NhdmUgPSBjb250cm9sbGVyLmRvd25sb2FkKHRoaXMuX3NvdXJjZS51cmksIG9wdGlvbnMpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIShyZXN1bHQgJiYgcmVzdWx0LmJhc2U2NCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbmV3U291cmNlID0ge1xuICAgICAgICAgICAgZm9ybWF0OiAnYmFzZTY0JyxcbiAgICAgICAgICAgIGJhc2U2NDogcmVzdWx0LmJhc2U2NCxcbiAgICAgICAgICAgIHR5cGU6IHJlc3VsdC5jb250ZW50VHlwZVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fZGF0YSA9IHJlc3VsdC5iYXNlNjQ7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgICAgIHJldHVybiBjb250cm9sbGVyLnNhdmVCYXNlNjQodGhpcy5fbmFtZSwgbmV3U291cmNlLCBvcHRpb25zKTtcbiAgICAgICAgfSkudGhlbihyZXMgPT4ge1xuICAgICAgICAgIHRoaXMuX25hbWUgPSByZXMubmFtZTtcbiAgICAgICAgICB0aGlzLl91cmwgPSByZXMudXJsO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9wcmV2aW91c1NhdmUgPSBjb250cm9sbGVyLnNhdmVCYXNlNjQodGhpcy5fbmFtZSwgdGhpcy5fc291cmNlLCBvcHRpb25zKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5fbmFtZSA9IHJlcy5uYW1lO1xuICAgICAgICAgIHRoaXMuX3VybCA9IHJlcy51cmw7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZXZpb3VzU2F2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByZXZpb3VzU2F2ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIHRoZSByZXF1ZXN0IGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gc2VudC5cbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICBpZiAodGhpcy5fcmVxdWVzdFRhc2sgJiYgdHlwZW9mIHRoaXMuX3JlcXVlc3RUYXNrLmFib3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0VGFzay5fYWJvcnRlZCA9IHRydWU7XG4gICAgICB0aGlzLl9yZXF1ZXN0VGFzay5hYm9ydCgpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0VGFzayA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgZmlsZSBmcm9tIHRoZSBQYXJzZSBjbG91ZC5cbiAgICogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5IHdpdGggTWFzdGVyIEtleS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqIDxwcmU+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgZGVsZXRlIGZpbmlzaGVzLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgaWYgKCF0aGlzLl9uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LkZJTEVfREVMRVRFX1VOTkFNRURfRVJST1IsICdDYW5ub3QgZGVsZXRlIGFuIHVubmFtZWQgZmlsZS4nKTtcbiAgICB9XG4gICAgY29uc3QgZGVzdHJveU9wdGlvbnMgPSB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZGVzdHJveU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gISFvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEZpbGVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZGVsZXRlRmlsZSh0aGlzLl9uYW1lLCBkZXN0cm95T3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9kYXRhID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdGaWxlJyxcbiAgICAgIG5hbWU6IHRoaXMuX25hbWUsXG4gICAgICB1cmw6IHRoaXMuX3VybFxuICAgIH07XG4gIH1cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKHRoaXMgPT09IG90aGVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gVW5zYXZlZCBGaWxlcyBhcmUgbmV2ZXIgZXF1YWwsIHNpbmNlIHRoZXkgd2lsbCBiZSBzYXZlZCB0byBkaWZmZXJlbnQgVVJMc1xuICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFBhcnNlRmlsZSAmJiB0aGlzLm5hbWUoKSA9PT0gb3RoZXIubmFtZSgpICYmIHRoaXMudXJsKCkgPT09IG90aGVyLnVybCgpICYmIHR5cGVvZiB0aGlzLnVybCgpICE9PSAndW5kZWZpbmVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIG1ldGFkYXRhIHRvIGJlIHNhdmVkIHdpdGggZmlsZSBvYmplY3QuIE92ZXJ3cml0ZXMgZXhpc3RpbmcgbWV0YWRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG1ldGFkYXRhIEtleSB2YWx1ZSBwYWlycyB0byBiZSBzdG9yZWQgd2l0aCBmaWxlIG9iamVjdFxuICAgKi9cbiAgc2V0TWV0YWRhdGEobWV0YWRhdGEpIHtcbiAgICBpZiAobWV0YWRhdGEgJiYgdHlwZW9mIG1ldGFkYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIF9jb250ZXh0NDtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDQgPSAoMCwgX2tleXMuZGVmYXVsdCkobWV0YWRhdGEpKS5jYWxsKF9jb250ZXh0NCwga2V5ID0+IHtcbiAgICAgICAgdGhpcy5hZGRNZXRhZGF0YShrZXksIG1ldGFkYXRhW2tleV0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbWV0YWRhdGEgdG8gYmUgc2F2ZWQgd2l0aCBmaWxlIG9iamVjdC4gQWRkcyB0byBleGlzdGluZyBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBrZXkgdG8gc3RvcmUgdGhlIG1ldGFkYXRhXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgbWV0YWRhdGFcbiAgICovXG4gIGFkZE1ldGFkYXRhKGtleSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX21ldGFkYXRhW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0YWdzIHRvIGJlIHNhdmVkIHdpdGggZmlsZSBvYmplY3QuIE92ZXJ3cml0ZXMgZXhpc3RpbmcgdGFnc1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gdGFncyBLZXkgdmFsdWUgcGFpcnMgdG8gYmUgc3RvcmVkIHdpdGggZmlsZSBvYmplY3RcbiAgICovXG4gIHNldFRhZ3ModGFncykge1xuICAgIGlmICh0YWdzICYmIHR5cGVvZiB0YWdzID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIF9jb250ZXh0NTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDUgPSAoMCwgX2tleXMuZGVmYXVsdCkodGFncykpLmNhbGwoX2NvbnRleHQ1LCBrZXkgPT4ge1xuICAgICAgICB0aGlzLmFkZFRhZyhrZXksIHRhZ3Nba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0YWdzIHRvIGJlIHNhdmVkIHdpdGggZmlsZSBvYmplY3QuIEFkZHMgdG8gZXhpc3RpbmcgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBrZXkgdG8gc3RvcmUgdGFnc1xuICAgKiBAcGFyYW0geyp9IHZhbHVlIHRhZ1xuICAgKi9cbiAgYWRkVGFnKGtleSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3RhZ3Nba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZnJvbUpTT04ob2JqKSB7XG4gICAgaWYgKG9iai5fX3R5cGUgIT09ICdGaWxlJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSlNPTiBvYmplY3QgZG9lcyBub3QgcmVwcmVzZW50IGEgUGFyc2VGaWxlJyk7XG4gICAgfVxuICAgIGNvbnN0IGZpbGUgPSBuZXcgUGFyc2VGaWxlKG9iai5uYW1lKTtcbiAgICBmaWxlLl91cmwgPSBvYmoudXJsO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG4gIHN0YXRpYyBlbmNvZGVCYXNlNjQoYnl0ZXMpIHtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICBjaHVua3MubGVuZ3RoID0gTWF0aC5jZWlsKGJ5dGVzLmxlbmd0aCAvIDMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBiMSA9IGJ5dGVzW2kgKiAzXTtcbiAgICAgIGNvbnN0IGIyID0gYnl0ZXNbaSAqIDMgKyAxXSB8fCAwO1xuICAgICAgY29uc3QgYjMgPSBieXRlc1tpICogMyArIDJdIHx8IDA7XG4gICAgICBjb25zdCBoYXMyID0gaSAqIDMgKyAxIDwgYnl0ZXMubGVuZ3RoO1xuICAgICAgY29uc3QgaGFzMyA9IGkgKiAzICsgMiA8IGJ5dGVzLmxlbmd0aDtcbiAgICAgIGNodW5rc1tpXSA9IFtiNjREaWdpdChiMSA+PiAyICYgMHgzZiksIGI2NERpZ2l0KGIxIDw8IDQgJiAweDMwIHwgYjIgPj4gNCAmIDB4MGYpLCBoYXMyID8gYjY0RGlnaXQoYjIgPDwgMiAmIDB4M2MgfCBiMyA+PiA2ICYgMHgwMykgOiAnPScsIGhhczMgPyBiNjREaWdpdChiMyAmIDB4M2YpIDogJz0nXS5qb2luKCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNodW5rcy5qb2luKCcnKTtcbiAgfVxufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIHNhdmVGaWxlOiBhc3luYyBmdW5jdGlvbiAobmFtZSwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgaWYgKHNvdXJjZS5mb3JtYXQgIT09ICdmaWxlJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzYXZlRmlsZSBjYW4gb25seSBiZSB1c2VkIHdpdGggRmlsZS10eXBlIHNvdXJjZXMuJyk7XG4gICAgfVxuICAgIGNvbnN0IGJhc2U2NERhdGEgPSBhd2FpdCBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzLCByZWopID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXMocmVhZGVyLnJlc3VsdCk7XG4gICAgICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlaihlcnJvcik7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChzb3VyY2UuZmlsZSk7XG4gICAgfSk7XG4gICAgLy8gd2Ugb25seSB3YW50IHRoZSBkYXRhIGFmdGVyIHRoZSBjb21tYVxuICAgIC8vIEZvciBleGFtcGxlOiBcImRhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCxKVkJFUmkweExqUUtKLi4uXCIgd2Ugd291bGQgb25seSB3YW50IFwiSlZCRVJpMHhMalFLSi4uLlwiXG4gICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gYmFzZTY0RGF0YS5zcGxpdCgnLCcpO1xuICAgIC8vIGluIHRoZSBldmVudCB0aGVyZSBpcyBubyAnZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LCcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmFzZTY0IHN0cmluZ1xuICAgIC8vIHVzZSB0aGUgZW50aXJlIHN0cmluZyBpbnN0ZWFkXG4gICAgY29uc3QgZGF0YSA9IHNlY29uZCA/IHNlY29uZCA6IGZpcnN0O1xuICAgIGNvbnN0IG5ld1NvdXJjZSA9IHtcbiAgICAgIGZvcm1hdDogJ2Jhc2U2NCcsXG4gICAgICBiYXNlNjQ6IGRhdGEsXG4gICAgICB0eXBlOiBzb3VyY2UudHlwZSB8fCAoc291cmNlLmZpbGUgPyBzb3VyY2UuZmlsZS50eXBlIDogdW5kZWZpbmVkKVxuICAgIH07XG4gICAgcmV0dXJuIGF3YWl0IERlZmF1bHRDb250cm9sbGVyLnNhdmVCYXNlNjQobmFtZSwgbmV3U291cmNlLCBvcHRpb25zKTtcbiAgfSxcbiAgc2F2ZUJhc2U2NDogZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBpZiAoc291cmNlLmZvcm1hdCAhPT0gJ2Jhc2U2NCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2F2ZUJhc2U2NCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFzZTY0LXR5cGUgc291cmNlcy4nKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGJhc2U2NDogc291cmNlLmJhc2U2NCxcbiAgICAgIGZpbGVEYXRhOiB7XG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgLi4ub3B0aW9ucy5tZXRhZGF0YVxuICAgICAgICB9LFxuICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgLi4ub3B0aW9ucy50YWdzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGRlbGV0ZSBvcHRpb25zLm1ldGFkYXRhO1xuICAgIGRlbGV0ZSBvcHRpb25zLnRhZ3M7XG4gICAgaWYgKHNvdXJjZS50eXBlKSB7XG4gICAgICBkYXRhLl9Db250ZW50VHlwZSA9IHNvdXJjZS50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5yZXF1ZXN0KCdQT1NUJywgJ2ZpbGVzLycgKyBuYW1lLCBkYXRhLCBvcHRpb25zKTtcbiAgfSxcbiAgZG93bmxvYWQ6IGZ1bmN0aW9uICh1cmksIG9wdGlvbnMpIHtcbiAgICBpZiAoWEhSKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb3dubG9hZEFqYXgodXJpLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdDYW5ub3QgbWFrZSBhIHJlcXVlc3Q6IE5vIGRlZmluaXRpb24gb2YgWE1MSHR0cFJlcXVlc3Qgd2FzIGZvdW5kLicpO1xuICAgIH1cbiAgfSxcbiAgZG93bmxvYWRBamF4OiBmdW5jdGlvbiAodXJpLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHhociA9IG5ldyBYSFIoKTtcbiAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmksIHRydWUpO1xuICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH07XG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHhoci5ET05FKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5yZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHRoaXMucmVzcG9uc2UpO1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBiYXNlNjQ6IFBhcnNlRmlsZS5lbmNvZGVCYXNlNjQoYnl0ZXMpLFxuICAgICAgICAgIGNvbnRlbnRUeXBlOiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2NvbnRlbnQtdHlwZScpXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIG9wdGlvbnMucmVxdWVzdFRhc2soeGhyKTtcbiAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG4gIH0sXG4gIGRlbGV0ZUZpbGU6IGZ1bmN0aW9uIChuYW1lLCBvcHRpb25zKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdYLVBhcnNlLUFwcGxpY2F0aW9uLUlEJzogX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBUFBMSUNBVElPTl9JRCcpXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy51c2VNYXN0ZXJLZXkpIHtcbiAgICAgIGhlYWRlcnNbJ1gtUGFyc2UtTWFzdGVyLUtleSddID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdNQVNURVJfS0VZJyk7XG4gICAgfVxuICAgIGxldCB1cmwgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9VUkwnKTtcbiAgICBpZiAodXJsW3VybC5sZW5ndGggLSAxXSAhPT0gJy8nKSB7XG4gICAgICB1cmwgKz0gJy8nO1xuICAgIH1cbiAgICB1cmwgKz0gJ2ZpbGVzLycgKyBuYW1lO1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLmFqYXgoJ0RFTEVURScsIHVybCwgJycsIGhlYWRlcnMpLmNhdGNoKHJlc3BvbnNlID0+IHtcbiAgICAgIC8vIFRPRE86IHJldHVybiBKU09OIG9iamVjdCBpbiBzZXJ2ZXJcbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2UgPT09ICdTeW50YXhFcnJvcjogVW5leHBlY3RlZCBlbmQgb2YgSlNPTiBpbnB1dCcpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkuaGFuZGxlRXJyb3IocmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICBfc2V0WEhSKHhocikge1xuICAgIFhIUiA9IHhocjtcbiAgfSxcbiAgX2dldFhIUigpIHtcbiAgICByZXR1cm4gWEhSO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0RmlsZUNvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VGaWxlO1xuZXhwb3J0cy5iNjREaWdpdCA9IGI2NERpZ2l0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgR2VvUG9pbnQgd2l0aCBhbnkgb2YgdGhlIGZvbGxvd2luZyBmb3Jtczo8YnI+XG4gKiAgIDxwcmU+XG4gKiAgIG5ldyBHZW9Qb2ludChvdGhlckdlb1BvaW50KVxuICogICBuZXcgR2VvUG9pbnQoMzAsIDMwKVxuICogICBuZXcgR2VvUG9pbnQoWzMwLCAzMF0pXG4gKiAgIG5ldyBHZW9Qb2ludCh7bGF0aXR1ZGU6IDMwLCBsb25naXR1ZGU6IDMwfSlcbiAqICAgbmV3IEdlb1BvaW50KCkgIC8vIGRlZmF1bHRzIHRvICgwLCAwKVxuICogICA8L3ByZT5cbiAqIDxwPlJlcHJlc2VudHMgYSBsYXRpdHVkZSAvIGxvbmdpdHVkZSBwb2ludCB0aGF0IG1heSBiZSBhc3NvY2lhdGVkXG4gKiB3aXRoIGEga2V5IGluIGEgUGFyc2VPYmplY3Qgb3IgdXNlZCBhcyBhIHJlZmVyZW5jZSBwb2ludCBmb3IgZ2VvIHF1ZXJpZXMuXG4gKiBUaGlzIGFsbG93cyBwcm94aW1pdHktYmFzZWQgcXVlcmllcyBvbiB0aGUga2V5LjwvcD5cbiAqXG4gKiA8cD5Pbmx5IG9uZSBrZXkgaW4gYSBjbGFzcyBtYXkgY29udGFpbiBhIEdlb1BvaW50LjwvcD5cbiAqXG4gKiA8cD5FeGFtcGxlOjxwcmU+XG4gKiAgIHZhciBwb2ludCA9IG5ldyBQYXJzZS5HZW9Qb2ludCgzMC4wLCAtMjAuMCk7XG4gKiAgIHZhciBvYmplY3QgPSBuZXcgUGFyc2UuT2JqZWN0KFwiUGxhY2VPYmplY3RcIik7XG4gKiAgIG9iamVjdC5zZXQoXCJsb2NhdGlvblwiLCBwb2ludCk7XG4gKiAgIG9iamVjdC5zYXZlKCk7PC9wcmU+PC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5HZW9Qb2ludFxuICovXG4vKiBnbG9iYWwgbmF2aWdhdG9yICovXG5jbGFzcyBQYXJzZUdlb1BvaW50IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7KG51bWJlcltdIHwgb2JqZWN0IHwgbnVtYmVyKX0gYXJnMSBFaXRoZXIgYSBsaXN0IG9mIGNvb3JkaW5hdGUgcGFpcnMsIGFuIG9iamVjdCB3aXRoIGBsYXRpdHVkZWAsIGBsb25naXR1ZGVgLCBvciB0aGUgbGF0aXR1ZGUgb3IgdGhlIHBvaW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJnMiBUaGUgbG9uZ2l0dWRlIG9mIHRoZSBHZW9Qb2ludFxuICAgKi9cbiAgY29uc3RydWN0b3IoYXJnMSwgYXJnMikge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2xhdGl0dWRlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfbG9uZ2l0dWRlXCIsIHZvaWQgMCk7XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShhcmcxKSkge1xuICAgICAgUGFyc2VHZW9Qb2ludC5fdmFsaWRhdGUoYXJnMVswXSwgYXJnMVsxXSk7XG4gICAgICB0aGlzLl9sYXRpdHVkZSA9IGFyZzFbMF07XG4gICAgICB0aGlzLl9sb25naXR1ZGUgPSBhcmcxWzFdO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZzEgPT09ICdvYmplY3QnKSB7XG4gICAgICBQYXJzZUdlb1BvaW50Ll92YWxpZGF0ZShhcmcxLmxhdGl0dWRlLCBhcmcxLmxvbmdpdHVkZSk7XG4gICAgICB0aGlzLl9sYXRpdHVkZSA9IGFyZzEubGF0aXR1ZGU7XG4gICAgICB0aGlzLl9sb25naXR1ZGUgPSBhcmcxLmxvbmdpdHVkZTtcbiAgICB9IGVsc2UgaWYgKGFyZzEgIT09IHVuZGVmaW5lZCAmJiBhcmcyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIFBhcnNlR2VvUG9pbnQuX3ZhbGlkYXRlKGFyZzEsIGFyZzIpO1xuICAgICAgdGhpcy5fbGF0aXR1ZGUgPSBhcmcxO1xuICAgICAgdGhpcy5fbG9uZ2l0dWRlID0gYXJnMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGF0aXR1ZGUgPSAwO1xuICAgICAgdGhpcy5fbG9uZ2l0dWRlID0gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ydGgtc291dGggcG9ydGlvbiBvZiB0aGUgY29vcmRpbmF0ZSwgaW4gcmFuZ2UgWy05MCwgOTBdLlxuICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHNldCBvdXQgb2YgcmFuZ2UgaW4gYSBtb2Rlcm4gYnJvd3Nlci5cbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGxhdGl0dWRlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbGF0aXR1ZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhdGl0dWRlO1xuICB9XG4gIHNldCBsYXRpdHVkZSh2YWwpIHtcbiAgICBQYXJzZUdlb1BvaW50Ll92YWxpZGF0ZSh2YWwsIHRoaXMubG9uZ2l0dWRlKTtcbiAgICB0aGlzLl9sYXRpdHVkZSA9IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFYXN0LXdlc3QgcG9ydGlvbiBvZiB0aGUgY29vcmRpbmF0ZSwgaW4gcmFuZ2UgWy0xODAsIDE4MF0uXG4gICAqIFRocm93cyBpZiBzZXQgb3V0IG9mIHJhbmdlIGluIGEgbW9kZXJuIGJyb3dzZXIuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb25naXR1ZGVcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldCBsb25naXR1ZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvbmdpdHVkZTtcbiAgfVxuICBzZXQgbG9uZ2l0dWRlKHZhbCkge1xuICAgIFBhcnNlR2VvUG9pbnQuX3ZhbGlkYXRlKHRoaXMubGF0aXR1ZGUsIHZhbCk7XG4gICAgdGhpcy5fbG9uZ2l0dWRlID0gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBHZW9Qb2ludCwgc3VpdGFibGUgZm9yIFBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIFBhcnNlR2VvUG9pbnQuX3ZhbGlkYXRlKHRoaXMuX2xhdGl0dWRlLCB0aGlzLl9sb25naXR1ZGUpO1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdHZW9Qb2ludCcsXG4gICAgICBsYXRpdHVkZTogdGhpcy5fbGF0aXR1ZGUsXG4gICAgICBsb25naXR1ZGU6IHRoaXMuX2xvbmdpdHVkZVxuICAgIH07XG4gIH1cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgUGFyc2VHZW9Qb2ludCAmJiB0aGlzLmxhdGl0dWRlID09PSBvdGhlci5sYXRpdHVkZSAmJiB0aGlzLmxvbmdpdHVkZSA9PT0gb3RoZXIubG9uZ2l0dWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBHZW9Qb2ludCB0byBhbm90aGVyIGluIHJhZGlhbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50IHRoZSBvdGhlciBQYXJzZS5HZW9Qb2ludC5cbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIHJhZGlhbnNUbyhwb2ludCkge1xuICAgIGNvbnN0IGQyciA9IE1hdGguUEkgLyAxODAuMDtcbiAgICBjb25zdCBsYXQxcmFkID0gdGhpcy5sYXRpdHVkZSAqIGQycjtcbiAgICBjb25zdCBsb25nMXJhZCA9IHRoaXMubG9uZ2l0dWRlICogZDJyO1xuICAgIGNvbnN0IGxhdDJyYWQgPSBwb2ludC5sYXRpdHVkZSAqIGQycjtcbiAgICBjb25zdCBsb25nMnJhZCA9IHBvaW50LmxvbmdpdHVkZSAqIGQycjtcbiAgICBjb25zdCBzaW5EZWx0YUxhdERpdjIgPSBNYXRoLnNpbigobGF0MXJhZCAtIGxhdDJyYWQpIC8gMik7XG4gICAgY29uc3Qgc2luRGVsdGFMb25nRGl2MiA9IE1hdGguc2luKChsb25nMXJhZCAtIGxvbmcycmFkKSAvIDIpO1xuICAgIC8vIFNxdWFyZSBvZiBoYWxmIHRoZSBzdHJhaWdodCBsaW5lIGNob3JkIGRpc3RhbmNlIGJldHdlZW4gYm90aCBwb2ludHMuXG4gICAgbGV0IGEgPSBzaW5EZWx0YUxhdERpdjIgKiBzaW5EZWx0YUxhdERpdjIgKyBNYXRoLmNvcyhsYXQxcmFkKSAqIE1hdGguY29zKGxhdDJyYWQpICogc2luRGVsdGFMb25nRGl2MiAqIHNpbkRlbHRhTG9uZ0RpdjI7XG4gICAgYSA9IE1hdGgubWluKDEuMCwgYSk7XG4gICAgcmV0dXJuIDIgKiBNYXRoLmFzaW4oTWF0aC5zcXJ0KGEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgR2VvUG9pbnQgdG8gYW5vdGhlciBpbiBraWxvbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCB0aGUgb3RoZXIgUGFyc2UuR2VvUG9pbnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBraWxvbWV0ZXJzVG8ocG9pbnQpIHtcbiAgICByZXR1cm4gdGhpcy5yYWRpYW5zVG8ocG9pbnQpICogNjM3MS4wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBHZW9Qb2ludCB0byBhbm90aGVyIGluIG1pbGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCB0aGUgb3RoZXIgUGFyc2UuR2VvUG9pbnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBtaWxlc1RvKHBvaW50KSB7XG4gICAgcmV0dXJuIHRoaXMucmFkaWFuc1RvKHBvaW50KSAqIDM5NTguODtcbiAgfVxuXG4gIC8qXG4gICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGdpdmVuIGxhdC1sb25nIGlzIG91dCBvZiBib3VuZHMuXG4gICAqL1xuICBzdGF0aWMgX3ZhbGlkYXRlKGxhdGl0dWRlLCBsb25naXR1ZGUpIHtcbiAgICBpZiAoaXNOYU4obGF0aXR1ZGUpIHx8IGlzTmFOKGxvbmdpdHVkZSkgfHwgdHlwZW9mIGxhdGl0dWRlICE9PSAnbnVtYmVyJyB8fCB0eXBlb2YgbG9uZ2l0dWRlICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VvUG9pbnQgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBtdXN0IGJlIHZhbGlkIG51bWJlcnMnKTtcbiAgICB9XG4gICAgaWYgKGxhdGl0dWRlIDwgLTkwLjApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlb1BvaW50IGxhdGl0dWRlIG91dCBvZiBib3VuZHM6ICcgKyBsYXRpdHVkZSArICcgPCAtOTAuMC4nKTtcbiAgICB9XG4gICAgaWYgKGxhdGl0dWRlID4gOTAuMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VvUG9pbnQgbGF0aXR1ZGUgb3V0IG9mIGJvdW5kczogJyArIGxhdGl0dWRlICsgJyA+IDkwLjAuJyk7XG4gICAgfVxuICAgIGlmIChsb25naXR1ZGUgPCAtMTgwLjApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlb1BvaW50IGxvbmdpdHVkZSBvdXQgb2YgYm91bmRzOiAnICsgbG9uZ2l0dWRlICsgJyA8IC0xODAuMC4nKTtcbiAgICB9XG4gICAgaWYgKGxvbmdpdHVkZSA+IDE4MC4wKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW9Qb2ludCBsb25naXR1ZGUgb3V0IG9mIGJvdW5kczogJyArIGxvbmdpdHVkZSArICcgPiAxODAuMC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEdlb1BvaW50IHdpdGggdGhlIHVzZXIncyBjdXJyZW50IGxvY2F0aW9uLCBpZiBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmVuYWJsZUhpZ2hBY2N1cmFjeV0gQSBib29sZWFuIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBsaWtlIHRvIHJlY2VpdmUgdGhlIGJlc3QgcG9zc2libGUgcmVzdWx0cy5cbiAgICogIElmIHRydWUgYW5kIGlmIHRoZSBkZXZpY2UgaXMgYWJsZSB0byBwcm92aWRlIGEgbW9yZSBhY2N1cmF0ZSBwb3NpdGlvbiwgaXQgd2lsbCBkbyBzby5cbiAgICogIE5vdGUgdGhhdCB0aGlzIGNhbiByZXN1bHQgaW4gc2xvd2VyIHJlc3BvbnNlIHRpbWVzIG9yIGluY3JlYXNlZCBwb3dlciBjb25zdW1wdGlvbiAod2l0aCBhIEdQUyBjaGlwIG9uIGEgbW9iaWxlIGRldmljZSBmb3IgZXhhbXBsZSkuXG4gICAqICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgZmFsc2UsIHRoZSBkZXZpY2UgY2FuIHRha2UgdGhlIGxpYmVydHkgdG8gc2F2ZSByZXNvdXJjZXMgYnkgcmVzcG9uZGluZyBtb3JlIHF1aWNrbHkgYW5kL29yIHVzaW5nIGxlc3MgcG93ZXIuIERlZmF1bHQ6IGZhbHNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGltZW91dF0gQSBwb3NpdGl2ZSBsb25nIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0aGUgZGV2aWNlIGlzIGFsbG93ZWQgdG8gdGFrZSBpbiBvcmRlciB0byByZXR1cm4gYSBwb3NpdGlvbi5cbiAgICogIFRoZSBkZWZhdWx0IHZhbHVlIGlzIEluZmluaXR5LCBtZWFuaW5nIHRoYXQgZ2V0Q3VycmVudFBvc2l0aW9uKCkgd29uJ3QgcmV0dXJuIHVudGlsIHRoZSBwb3NpdGlvbiBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhpbXVtQWdlXSBBIHBvc2l0aXZlIGxvbmcgdmFsdWUgaW5kaWNhdGluZyB0aGUgbWF4aW11bSBhZ2UgaW4gbWlsbGlzZWNvbmRzIG9mIGEgcG9zc2libGUgY2FjaGVkIHBvc2l0aW9uIHRoYXQgaXMgYWNjZXB0YWJsZSB0byByZXR1cm4uXG4gICAqICBJZiBzZXQgdG8gMCwgaXQgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIGNhbm5vdCB1c2UgYSBjYWNoZWQgcG9zaXRpb24gYW5kIG11c3QgYXR0ZW1wdCB0byByZXRyaWV2ZSB0aGUgcmVhbCBjdXJyZW50IHBvc2l0aW9uLlxuICAgKiAgSWYgc2V0IHRvIEluZmluaXR5IHRoZSBkZXZpY2UgbXVzdCByZXR1cm4gYSBjYWNoZWQgcG9zaXRpb24gcmVnYXJkbGVzcyBvZiBpdHMgYWdlLiBEZWZhdWx0OiAwLlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFBhcnNlLkdlb1BvaW50Pn0gVXNlcidzIGN1cnJlbnQgbG9jYXRpb25cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihsb2NhdGlvbiA9PiB7XG4gICAgICAgIHJlc29sdmUobmV3IFBhcnNlR2VvUG9pbnQobG9jYXRpb24uY29vcmRzLmxhdGl0dWRlLCBsb2NhdGlvbi5jb29yZHMubG9uZ2l0dWRlKSk7XG4gICAgICB9LCByZWplY3QsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZUdlb1BvaW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNyZWF0ZSA9IGNyZWF0ZTtcbmV4cG9ydHMuY3JlYXRlRnVuY3Rpb24gPSBjcmVhdGVGdW5jdGlvbjtcbmV4cG9ydHMuY3JlYXRlVHJpZ2dlciA9IGNyZWF0ZVRyaWdnZXI7XG5leHBvcnRzLmdldEZ1bmN0aW9uID0gZ2V0RnVuY3Rpb247XG5leHBvcnRzLmdldEZ1bmN0aW9ucyA9IGdldEZ1bmN0aW9ucztcbmV4cG9ydHMuZ2V0VHJpZ2dlciA9IGdldFRyaWdnZXI7XG5leHBvcnRzLmdldFRyaWdnZXJzID0gZ2V0VHJpZ2dlcnM7XG5leHBvcnRzLnJlbW92ZSA9IHJlbW92ZTtcbmV4cG9ydHMucmVtb3ZlRnVuY3Rpb24gPSByZW1vdmVGdW5jdGlvbjtcbmV4cG9ydHMucmVtb3ZlVHJpZ2dlciA9IHJlbW92ZVRyaWdnZXI7XG5leHBvcnRzLnVwZGF0ZSA9IHVwZGF0ZTtcbmV4cG9ydHMudXBkYXRlRnVuY3Rpb24gPSB1cGRhdGVGdW5jdGlvbjtcbmV4cG9ydHMudXBkYXRlVHJpZ2dlciA9IHVwZGF0ZVRyaWdnZXI7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xuZnVuY3Rpb24gZ2V0RnVuY3Rpb25zKCkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkuZ2V0KCdmdW5jdGlvbnMnKTtcbn1cbmZ1bmN0aW9uIGdldFRyaWdnZXJzKCkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkuZ2V0KCd0cmlnZ2VycycpO1xufVxuZnVuY3Rpb24gZ2V0RnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkuZ2V0KCdmdW5jdGlvbnMnLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIGdldFRyaWdnZXIoY2xhc3NOYW1lLCB0cmlnZ2VyTmFtZSkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkuZ2V0KCd0cmlnZ2VycycsIGNsYXNzTmFtZSwgdHJpZ2dlck5hbWUpO1xufVxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oZnVuY3Rpb25OYW1lLCB1cmwpIHtcbiAgcmV0dXJuIGNyZWF0ZSh7XG4gICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgdXJsOiB1cmxcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVUcmlnZ2VyKGNsYXNzTmFtZSwgdHJpZ2dlck5hbWUsIHVybCkge1xuICByZXR1cm4gY3JlYXRlKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWUsXG4gICAgdXJsOiB1cmxcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGUoaG9vaykge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkuY3JlYXRlKGhvb2spO1xufVxuZnVuY3Rpb24gdXBkYXRlRnVuY3Rpb24oZnVuY3Rpb25OYW1lLCB1cmwpIHtcbiAgcmV0dXJuIHVwZGF0ZSh7XG4gICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgdXJsOiB1cmxcbiAgfSk7XG59XG5mdW5jdGlvbiB1cGRhdGVUcmlnZ2VyKGNsYXNzTmFtZSwgdHJpZ2dlck5hbWUsIHVybCkge1xuICByZXR1cm4gdXBkYXRlKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWUsXG4gICAgdXJsOiB1cmxcbiAgfSk7XG59XG5mdW5jdGlvbiB1cGRhdGUoaG9vaykge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkudXBkYXRlKGhvb2spO1xufVxuZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oZnVuY3Rpb25OYW1lKSB7XG4gIHJldHVybiByZW1vdmUoe1xuICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lXG4gIH0pO1xufVxuZnVuY3Rpb24gcmVtb3ZlVHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJOYW1lKSB7XG4gIHJldHVybiByZW1vdmUoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHRyaWdnZXJOYW1lOiB0cmlnZ2VyTmFtZVxuICB9KTtcbn1cbmZ1bmN0aW9uIHJlbW92ZShob29rKSB7XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRIb29rc0NvbnRyb2xsZXIoKS5yZW1vdmUoaG9vayk7XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgZ2V0KHR5cGUsIGZ1bmN0aW9uTmFtZSwgdHJpZ2dlck5hbWUpIHtcbiAgICBsZXQgdXJsID0gJy9ob29rcy8nICsgdHlwZTtcbiAgICBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgICB1cmwgKz0gJy8nICsgZnVuY3Rpb25OYW1lO1xuICAgICAgaWYgKHRyaWdnZXJOYW1lKSB7XG4gICAgICAgIHVybCArPSAnLycgKyB0cmlnZ2VyTmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3QoJ0dFVCcsIHVybCk7XG4gIH0sXG4gIGNyZWF0ZShob29rKSB7XG4gICAgbGV0IHVybDtcbiAgICBpZiAoaG9vay5mdW5jdGlvbk5hbWUgJiYgaG9vay51cmwpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvZnVuY3Rpb25zJztcbiAgICB9IGVsc2UgaWYgKGhvb2suY2xhc3NOYW1lICYmIGhvb2sudHJpZ2dlck5hbWUgJiYgaG9vay51cmwpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvdHJpZ2dlcnMnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3Qoe1xuICAgICAgICBlcnJvcjogJ2ludmFsaWQgaG9vayBkZWNsYXJhdGlvbicsXG4gICAgICAgIGNvZGU6IDE0M1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0KCdQT1NUJywgdXJsLCBob29rKTtcbiAgfSxcbiAgcmVtb3ZlKGhvb2spIHtcbiAgICBsZXQgdXJsO1xuICAgIGlmIChob29rLmZ1bmN0aW9uTmFtZSkge1xuICAgICAgdXJsID0gJy9ob29rcy9mdW5jdGlvbnMvJyArIGhvb2suZnVuY3Rpb25OYW1lO1xuICAgICAgZGVsZXRlIGhvb2suZnVuY3Rpb25OYW1lO1xuICAgIH0gZWxzZSBpZiAoaG9vay5jbGFzc05hbWUgJiYgaG9vay50cmlnZ2VyTmFtZSkge1xuICAgICAgdXJsID0gJy9ob29rcy90cmlnZ2Vycy8nICsgaG9vay5jbGFzc05hbWUgKyAnLycgKyBob29rLnRyaWdnZXJOYW1lO1xuICAgICAgZGVsZXRlIGhvb2suY2xhc3NOYW1lO1xuICAgICAgZGVsZXRlIGhvb2sudHJpZ2dlck5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCh7XG4gICAgICAgIGVycm9yOiAnaW52YWxpZCBob29rIGRlY2xhcmF0aW9uJyxcbiAgICAgICAgY29kZTogMTQzXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3QoJ1BVVCcsIHVybCwge1xuICAgICAgX19vcDogJ0RlbGV0ZSdcbiAgICB9KTtcbiAgfSxcbiAgdXBkYXRlKGhvb2spIHtcbiAgICBsZXQgdXJsO1xuICAgIGlmIChob29rLmZ1bmN0aW9uTmFtZSAmJiBob29rLnVybCkge1xuICAgICAgdXJsID0gJy9ob29rcy9mdW5jdGlvbnMvJyArIGhvb2suZnVuY3Rpb25OYW1lO1xuICAgICAgZGVsZXRlIGhvb2suZnVuY3Rpb25OYW1lO1xuICAgIH0gZWxzZSBpZiAoaG9vay5jbGFzc05hbWUgJiYgaG9vay50cmlnZ2VyTmFtZSAmJiBob29rLnVybCkge1xuICAgICAgdXJsID0gJy9ob29rcy90cmlnZ2Vycy8nICsgaG9vay5jbGFzc05hbWUgKyAnLycgKyBob29rLnRyaWdnZXJOYW1lO1xuICAgICAgZGVsZXRlIGhvb2suY2xhc3NOYW1lO1xuICAgICAgZGVsZXRlIGhvb2sudHJpZ2dlck5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCh7XG4gICAgICAgIGVycm9yOiAnaW52YWxpZCBob29rIGRlY2xhcmF0aW9uJyxcbiAgICAgICAgY29kZTogMTQzXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3QoJ1BVVCcsIHVybCwgaG9vayk7XG4gIH0sXG4gIHNlbmRSZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5KSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkucmVxdWVzdChtZXRob2QsIHVybCwgYm9keSwge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfSkudGhlbihyZXMgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKHJlcyk7XG4gICAgICBpZiAoZGVjb2RlZCkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGRlY29kZWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9KU09OLCAnVGhlIHNlcnZlciByZXR1cm5lZCBhbiBpbnZhbGlkIHJlc3BvbnNlLicpKTtcbiAgICB9KTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldEhvb2tzQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZW50cmllcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2VudHJpZXNcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbmNvbnN0IERFVklDRV9UWVBFUyA9IHtcbiAgSU9TOiAnaW9zJyxcbiAgTUFDT1M6ICdtYWNvcycsXG4gIFRWT1M6ICd0dm9zJyxcbiAgRkNNOiAnZmNtJyxcbiAgQU5EUk9JRDogJ2FuZHJvaWQnLFxuICBXRUI6ICd3ZWInXG59O1xuXG4vKipcbiAqIFBhcnNlLkluc3RhbGxhdGlvbiBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGluc3RhbGxhdGlvbiBkYXRhIHRoYXQgY2FuIGJlIHNhdmVkIGFuZCByZXRyaWV2ZWQgZnJvbSB0aGUgUGFyc2UgY2xvdWQuXG4gKiBUaGlzIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgYSBQYXJzZS5PYmplY3QsIGFuZCByZXRhaW5zIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgb2YgYSBQYXJzZS5PYmplY3QsIGJ1dCBhbHNvIGV4dGVuZHMgaXQgd2l0aCBpbnN0YWxsYXRpb24tc3BlY2lmaWMgZmVhdHVyZXMuXG4gKlxuICogPHA+QSB2YWxpZCBQYXJzZS5JbnN0YWxsYXRpb24gY2FuIG9ubHkgYmUgaW5zdGFudGlhdGVkIHZpYSA8Y29kZT5QYXJzZS5JbnN0YWxsYXRpb24uY3VycmVudEluc3RhbGxhdGlvbigpPC9jb2RlPlxuICpcbiAqIFBhcnNlLkluc3RhbGxhdGlvbiBvYmplY3RzIHdoaWNoIGhhdmUgYSB2YWxpZCA8Y29kZT5kZXZpY2VUb2tlbjwvY29kZT4gYW5kIGFyZSBzYXZlZCB0byB0aGUgUGFyc2UgY2xvdWQgY2FuIGJlIHVzZWQgdG8gdGFyZ2V0IHB1c2ggbm90aWZpY2F0aW9ucy5cbiAqIDwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuSW5zdGFsbGF0aW9uXG4gKi9cbmNsYXNzIFBhcnNlSW5zdGFsbGF0aW9uIGV4dGVuZHMgX1BhcnNlT2JqZWN0LmRlZmF1bHQge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgVGhlIGluaXRpYWwgc2V0IG9mIGRhdGEgdG8gc3RvcmUgaW4gdGhlIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHtcbiAgICBzdXBlcignX0luc3RhbGxhdGlvbicpO1xuICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKCF0aGlzLnNldChhdHRyaWJ1dGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgYW4gaW52YWxpZCBJbnN0YWxsYXRpb25cIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgaW5zdGFsbGF0aW9u4oCZcyBjbGllbnQgYXBwbGljYXRpb24uIEluIGlPUywgdGhpcyBpcyB0aGUgQnVuZGxlIElkZW50aWZpZXIuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZGVudGlmaWVyXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBhcHBJZGVudGlmaWVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnYXBwSWRlbnRpZmllcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHRvIHdoaWNoIHRoaXMgaW5zdGFsbGF0aW9uIGJlbG9uZ3MuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBWZXJzaW9uXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBhcHBWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnYXBwVmVyc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiB0byB3aGljaCB0aGlzIGluc3RhbGxhdGlvbiBiZWxvbmdzLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXBwTmFtZVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgYXBwTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2FwcE5hbWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaWNvbiBiYWRnZSBmb3IgaU9TIGFwcHMuXG4gICAqIENoYW5nZXMgdG8gdGhpcyB2YWx1ZSBvbiB0aGUgc2VydmVyIHdpbGwgYmUgdXNlZFxuICAgKiBmb3IgZnV0dXJlIGJhZGdlLWluY3JlbWVudCBwdXNoIG5vdGlmaWNhdGlvbnMuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBiYWRnZVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgYmFkZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdiYWRnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHRoZSBjaGFubmVscyB0byB3aGljaCBhIGRldmljZSBpcyBjdXJyZW50bHkgc3Vic2NyaWJlZC5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY2hhbm5lbHNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBnZXQgY2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdjaGFubmVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRva2VuIHVzZWQgdG8gZGVsaXZlciBwdXNoIG5vdGlmaWNhdGlvbnMgdG8gdGhlIGRldmljZS5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGRldmljZVRva2VuXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBkZXZpY2VUb2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2RldmljZVRva2VuJyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgZGV2aWNlLCDigJxpb3PigJ0sIOKAnGFuZHJvaWTigJ0sIOKAnHdlYuKAnSwgZXRjLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZGV2aWNlVHlwZVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZGV2aWNlVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2RldmljZVR5cGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBHQ00gc2VuZGVyIGlkZW50aWZpZXIgZm9yIHRoaXMgaW5zdGFsbGF0aW9uXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHQ01TZW5kZXJJZFxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgR0NNU2VuZGVySWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdHQ01TZW5kZXJJZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuaXZlcnNhbGx5IFVuaXF1ZSBJZGVudGlmaWVyIChVVUlEKSBmb3IgdGhlIGRldmljZSB1c2VkIGJ5IFBhcnNlLiBJdCBtdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIG9mIGFuIGFwcOKAmXMgaW5zdGFsbGF0aW9ucy5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxhdGlvbklkXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnN0YWxsYXRpb25JZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2luc3RhbGxhdGlvbklkJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbG9jYWwgaWRlbnRpZmllciBmb3IgdGhpcyBpbnN0YWxsYXRpb25cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGxvY2FsZUlkZW50aWZpZXJcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZUlkZW50aWZpZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdsb2NhbGVJZGVudGlmaWVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcGFyc2Ugc2VydmVyIHZlcnNpb24gZm9yIHRoaXMgaW5zdGFsbGF0aW9uXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXJzZVZlcnNpb25cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHBhcnNlVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3BhcnNlVmVyc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgZm9yIGRpcmVjdGluZyBQYXJzZSB0byB0aGUgcHVzaCBkZWxpdmVyeSBuZXR3b3JrIHRvIGJlIHVzZWQuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwdXNoVHlwZVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcHVzaFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdwdXNoVHlwZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRpbWUgem9uZSBmb3IgdGhpcyBpbnN0YWxsYXRpb25cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVab25lXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCB0aW1lWm9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3RpbWVab25lJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGV2aWNlIHR5cGVzIGZvciB1c2VkIGZvciBQdXNoIE5vdGlmaWNhdGlvbnMuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIFBhcnNlLkluc3RhbGxhdGlvbi5ERVZJQ0VfVFlQRVMuSU9TXG4gICAqIFBhcnNlLkluc3RhbGxhdGlvbi5ERVZJQ0VfVFlQRVMuTUFDT1NcbiAgICogUGFyc2UuSW5zdGFsbGF0aW9uLkRFVklDRV9UWVBFUy5UVk9TXG4gICAqIFBhcnNlLkluc3RhbGxhdGlvbi5ERVZJQ0VfVFlQRVMuRkNNXG4gICAqIFBhcnNlLkluc3RhbGxhdGlvbi5ERVZJQ0VfVFlQRVMuQU5EUk9JRFxuICAgKiBQYXJzZS5JbnN0YWxsYXRpb24uREVWSUNFX1RZUEVTLldFQlxuICAgKiA8L3ByZVxuICAgKlxuICAgKiBAcHJvcGVydHkge29iamVjdH0gREVWSUNFX1RZUEVTXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREVWSUNFX1RZUEVTKCkge1xuICAgIHJldHVybiBERVZJQ0VfVFlQRVM7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZGVmYXVsdCBmZXRjaCBiZWhhdmlvciB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gdXBkYXRlIGxvY2FsIHN0b3JhZ2UuXG4gICAqIElmIHRoZSBpbnN0YWxsYXRpb24gaXMgZGVsZXRlZCBvbiB0aGUgc2VydmVyLCByZXRyeSB0aGUgZmV0Y2ggYXMgYSBzYXZlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBhc3luYyBmZXRjaCgpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdXBlci5mZXRjaC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlICE9PSBfUGFyc2VFcnJvci5kZWZhdWx0Lk9CSkVDVF9OT1RfRk9VTkQpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBpbnN0YWxsYXRpb24gd2FzIGRlbGV0ZWQgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgLy8gV2UgYWx3YXlzIHdhbnQgZmV0Y2ggdG8gc3VjY2VlZC5cbiAgICAgIGRlbGV0ZSB0aGlzLmlkO1xuICAgICAgdGhpcy5fZ2V0SWQoKTsgLy8gR2VuZXJhdGUgbG9jYWxJZFxuICAgICAgdGhpcy5fbWFya0FsbEZpZWxkc0RpcnR5KCk7XG4gICAgICBhd2FpdCBzdXBlci5zYXZlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgICBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCkudXBkYXRlSW5zdGFsbGF0aW9uT25EaXNrKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGRlZmF1bHQgc2F2ZSBiZWhhdmlvciB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gdXBkYXRlIHRoZSBsb2NhbCBzdG9yYWdlLlxuICAgKiBJZiB0aGUgaW5zdGFsbGF0aW9uIGlzIGRlbGV0ZWQgb24gdGhlIHNlcnZlciwgcmV0cnkgc2F2aW5nIGEgbmV3IGluc3RhbGxhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBhc3luYyBzYXZlKCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuc2F2ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlICE9PSBfUGFyc2VFcnJvci5kZWZhdWx0Lk9CSkVDVF9OT1RfRk9VTkQpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBpbnN0YWxsYXRpb24gd2FzIGRlbGV0ZWQgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgLy8gV2UgYWx3YXlzIHdhbnQgc2F2ZSB0byBzdWNjZWVkLlxuICAgICAgZGVsZXRlIHRoaXMuaWQ7XG4gICAgICB0aGlzLl9nZXRJZCgpOyAvLyBHZW5lcmF0ZSBsb2NhbElkXG4gICAgICB0aGlzLl9tYXJrQWxsRmllbGRzRGlydHkoKTtcbiAgICAgIGF3YWl0IHN1cGVyLnNhdmUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIGF3YWl0IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoKS51cGRhdGVJbnN0YWxsYXRpb25PbkRpc2sodGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgX21hcmtBbGxGaWVsZHNEaXJ0eSgpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAoMCwgX2VudHJpZXMuZGVmYXVsdCkodGhpcy5hdHRyaWJ1dGVzKSkge1xuICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBQYXJzZS5JbnN0YWxsYXRpb24gZnJvbSBkaXNrLiBJZiBkb2Vzbid0IGV4aXN0cywgY3JlYXRlIGFuIG5ldyBpbnN0YWxsYXRpb24uXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGNvbnN0IGluc3RhbGxhdGlvbiA9IGF3YWl0IFBhcnNlLkluc3RhbGxhdGlvbi5jdXJyZW50SW5zdGFsbGF0aW9uKCk7XG4gICAqIGluc3RhbGxhdGlvbi5zZXQoJ2RldmljZVRva2VuJywgJzEyMycpO1xuICAgKiBhd2FpdCBpbnN0YWxsYXRpb24uc2F2ZSgpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBsb2NhbCBpbnN0YWxsYXRpb24gb2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnRJbnN0YWxsYXRpb24oKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoKS5jdXJyZW50SW5zdGFsbGF0aW9uKCk7XG4gIH1cbn1cbl9QYXJzZU9iamVjdC5kZWZhdWx0LnJlZ2lzdGVyU3ViY2xhc3MoJ19JbnN0YWxsYXRpb24nLCBQYXJzZUluc3RhbGxhdGlvbik7XG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlSW5zdGFsbGF0aW9uO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VJbnN0YWxsYXRpb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfTGl2ZVF1ZXJ5Q2xpZW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9MaXZlUXVlcnlDbGllbnRcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuZnVuY3Rpb24gZ2V0TGl2ZVF1ZXJ5Q2xpZW50KCkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TGl2ZVF1ZXJ5Q29udHJvbGxlcigpLmdldERlZmF1bHRMaXZlUXVlcnlDbGllbnQoKTtcbn1cblxuLyoqXG4gKiBXZSBleHBvc2UgdGhyZWUgZXZlbnRzIHRvIGhlbHAgeW91IG1vbml0b3IgdGhlIHN0YXR1cyBvZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb246XG4gKlxuICogPHA+T3BlbiAtIFdoZW4gd2UgZXN0YWJsaXNoIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciwgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICpcbiAqIDxwcmU+XG4gKiBQYXJzZS5MaXZlUXVlcnkub24oJ29wZW4nLCAoKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIDxwPkNsb3NlIC0gV2hlbiB3ZSBsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciwgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICpcbiAqIDxwcmU+XG4gKiBQYXJzZS5MaXZlUXVlcnkub24oJ2Nsb3NlJywgKCkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiA8cD5FcnJvciAtIFdoZW4gc29tZSBuZXR3b3JrIGVycm9yIG9yIExpdmVRdWVyeSBzZXJ2ZXIgZXJyb3IgaGFwcGVucywgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICpcbiAqIDxwcmU+XG4gKiBQYXJzZS5MaXZlUXVlcnkub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIEBjbGFzcyBQYXJzZS5MaXZlUXVlcnlcbiAqIEBzdGF0aWNcbiAqL1xuY2xhc3MgTGl2ZVF1ZXJ5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImVtaXR0ZXJcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJlbWl0XCIsIHZvaWQgMCk7XG4gICAgY29uc3QgRXZlbnRFbWl0dGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMub24gPSAoZXZlbnROYW1lLCBsaXN0ZW5lcikgPT4gdGhpcy5lbWl0dGVyLm9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gX3RoaXMuZW1pdHRlci5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7XG4gICAgfTtcbiAgICAvLyBhZGRpbmcgbGlzdGVuZXIgc28gcHJvY2VzcyBkb2VzIG5vdCBjcmFzaFxuICAgIC8vIGJlc3QgcHJhY3RpY2UgaXMgZm9yIGRldmVsb3BlciB0byByZWdpc3RlciB0aGVpciBvd24gbGlzdGVuZXJcbiAgICB0aGlzLm9uKCdlcnJvcicsICgpID0+IHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZnRlciBvcGVuIGlzIGNhbGxlZCwgdGhlIExpdmVRdWVyeSB3aWxsIHRyeSB0byBzZW5kIGEgY29ubmVjdCByZXF1ZXN0XG4gICAqIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLlxuICAgKi9cbiAgYXN5bmMgb3BlbigpIHtcbiAgICBjb25zdCBsaXZlUXVlcnlDbGllbnQgPSBhd2FpdCBnZXRMaXZlUXVlcnlDbGllbnQoKTtcbiAgICBsaXZlUXVlcnlDbGllbnQub3BlbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4geW91J3JlIGRvbmUgdXNpbmcgTGl2ZVF1ZXJ5LCB5b3UgY2FuIGNhbGwgUGFyc2UuTGl2ZVF1ZXJ5LmNsb3NlKCkuXG4gICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsXG4gICAqIGNhbmNlbCB0aGUgYXV0byByZWNvbm5lY3QsIGFuZCB1bnN1YnNjcmliZSBhbGwgc3Vic2NyaXB0aW9ucyBiYXNlZCBvbiBpdC5cbiAgICogSWYgeW91IGNhbGwgcXVlcnkuc3Vic2NyaWJlKCkgYWZ0ZXIgdGhpcywgd2UnbGwgY3JlYXRlIGEgbmV3IFdlYlNvY2tldFxuICAgKiBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgY29uc3QgbGl2ZVF1ZXJ5Q2xpZW50ID0gYXdhaXQgZ2V0TGl2ZVF1ZXJ5Q2xpZW50KCk7XG4gICAgbGl2ZVF1ZXJ5Q2xpZW50LmNsb3NlKCk7XG4gIH1cbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IExpdmVRdWVyeTtcbmxldCBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50O1xuY29uc3QgRGVmYXVsdExpdmVRdWVyeUNvbnRyb2xsZXIgPSB7XG4gIHNldERlZmF1bHRMaXZlUXVlcnlDbGllbnQobGl2ZVF1ZXJ5Q2xpZW50KSB7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudCA9IGxpdmVRdWVyeUNsaWVudDtcbiAgfSxcbiAgYXN5bmMgZ2V0RGVmYXVsdExpdmVRdWVyeUNsaWVudCgpIHtcbiAgICBpZiAoZGVmYXVsdExpdmVRdWVyeUNsaWVudCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQ7XG4gICAgfVxuICAgIGNvbnN0IFtjdXJyZW50VXNlciwgaW5zdGFsbGF0aW9uSWRdID0gYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwoW19Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCkuY3VycmVudFVzZXJBc3luYygpLCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCkuY3VycmVudEluc3RhbGxhdGlvbklkKCldKTtcbiAgICBjb25zdCBzZXNzaW9uVG9rZW4gPSBjdXJyZW50VXNlciA/IGN1cnJlbnRVc2VyLmdldFNlc3Npb25Ub2tlbigpIDogdW5kZWZpbmVkO1xuICAgIGxldCBsaXZlUXVlcnlTZXJ2ZXJVUkwgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0xJVkVRVUVSWV9TRVJWRVJfVVJMJyk7XG4gICAgaWYgKGxpdmVRdWVyeVNlcnZlclVSTCAmJiAoMCwgX2luZGV4T2YuZGVmYXVsdCkobGl2ZVF1ZXJ5U2VydmVyVVJMKS5jYWxsKGxpdmVRdWVyeVNlcnZlclVSTCwgJ3dzJykgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gc2V0IGEgcHJvcGVyIFBhcnNlIExpdmVRdWVyeSBzZXJ2ZXIgdXJsIGJlZm9yZSB1c2luZyBMaXZlUXVlcnlDbGllbnQnKTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBjYW4gbm90IGZpbmQgUGFyc2UubGl2ZVF1ZXJ5U2VydmVyVVJMLCB3ZSB0cnkgdG8gZXh0cmFjdCBpdCBmcm9tIFBhcnNlLnNlcnZlclVSTFxuICAgIGlmICghbGl2ZVF1ZXJ5U2VydmVyVVJMKSB7XG4gICAgICBjb25zdCBzZXJ2ZXJVUkwgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9VUkwnKTtcbiAgICAgIGNvbnN0IHByb3RvY29sID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKHNlcnZlclVSTCkuY2FsbChzZXJ2ZXJVUkwsICdodHRwcycpID09PSAwID8gJ3dzczovLycgOiAnd3M6Ly8nO1xuICAgICAgY29uc3QgaG9zdCA9IHNlcnZlclVSTC5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcLy8sICcnKTtcbiAgICAgIGxpdmVRdWVyeVNlcnZlclVSTCA9IHByb3RvY29sICsgaG9zdDtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnTElWRVFVRVJZX1NFUlZFUl9VUkwnLCBsaXZlUXVlcnlTZXJ2ZXJVUkwpO1xuICAgIH1cbiAgICBjb25zdCBhcHBsaWNhdGlvbklkID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBUFBMSUNBVElPTl9JRCcpO1xuICAgIGNvbnN0IGphdmFzY3JpcHRLZXkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0pBVkFTQ1JJUFRfS0VZJyk7XG4gICAgY29uc3QgbWFzdGVyS2V5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdNQVNURVJfS0VZJyk7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudCA9IG5ldyBfTGl2ZVF1ZXJ5Q2xpZW50LmRlZmF1bHQoe1xuICAgICAgYXBwbGljYXRpb25JZCxcbiAgICAgIHNlcnZlclVSTDogbGl2ZVF1ZXJ5U2VydmVyVVJMLFxuICAgICAgamF2YXNjcmlwdEtleSxcbiAgICAgIG1hc3RlcktleSxcbiAgICAgIHNlc3Npb25Ub2tlbixcbiAgICAgIGluc3RhbGxhdGlvbklkXG4gICAgfSk7XG4gICAgY29uc3QgTGl2ZVF1ZXJ5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TGl2ZVF1ZXJ5KCk7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudC5vbignZXJyb3InLCBlcnJvciA9PiB7XG4gICAgICBMaXZlUXVlcnkuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgfSk7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudC5vbignb3BlbicsICgpID0+IHtcbiAgICAgIExpdmVRdWVyeS5lbWl0KCdvcGVuJyk7XG4gICAgfSk7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICBMaXZlUXVlcnkuZW1pdCgnY2xvc2UnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGVmYXVsdExpdmVRdWVyeUNsaWVudDtcbiAgfSxcbiAgX2NsZWFyQ2FjaGVkRGVmYXVsdENsaWVudCgpIHtcbiAgICBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50ID0gbnVsbDtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldExpdmVRdWVyeUNvbnRyb2xsZXIoRGVmYXVsdExpdmVRdWVyeUNvbnRyb2xsZXIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX1dlYWtNYXAgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS93ZWFrLW1hcFwiKTtcbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5MiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkyKGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9mcmVlemUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9mcmVlemVcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX2luY2x1ZGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmNsdWRlc1wiKSk7XG52YXIgX2dldFByb3RvdHlwZU9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiKSk7XG52YXIgX2NvbmNhdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfY3JlYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvY3JlYXRlXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpKTtcbnZhciBfZmluZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZFwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfY2FuQmVTZXJpYWxpemVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jYW5CZVNlcmlhbGl6ZWRcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX2VuY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfZXNjYXBlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lc2NhcGVcIikpO1xudmFyIF9QYXJzZUFDTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VBQ0xcIikpO1xudmFyIF9wYXJzZURhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlRGF0ZVwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX3Byb21pc2VVdGlscyA9IHJlcXVpcmUoXCIuL3Byb21pc2VVdGlsc1wiKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVVdGlscyA9IHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlVXRpbHNcIik7XG52YXIgX3V1aWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V1aWRcIikpO1xudmFyIF9QYXJzZU9wID0gcmVxdWlyZShcIi4vUGFyc2VPcFwiKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG52YXIgU2luZ2xlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9TaW5nbGVJbnN0YW5jZVN0YXRlQ29udHJvbGxlclwiKSk7XG52YXIgX3VuaXF1ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdW5pcXVlXCIpKTtcbnZhciBVbmlxdWVJbnN0YW5jZVN0YXRlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL1VuaXF1ZUluc3RhbmNlU3RhdGVDb250cm9sbGVyXCIpKTtcbnZhciBfdW5zYXZlZENoaWxkcmVuID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91bnNhdmVkQ2hpbGRyZW5cIikpO1xuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgX1dlYWtNYXApIHJldHVybiBudWxsO1xuICB2YXIgciA9IG5ldyBfV2Vha01hcCgpLFxuICAgIHQgPSBuZXcgX1dlYWtNYXAoKTtcbiAgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBlID8gdCA6IHI7XG4gIH0pKGUpO1xufVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoZSwgcikge1xuICBpZiAoIXIgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICBkZWZhdWx0OiBlXG4gIH07XG4gIHZhciB0ID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKHIpO1xuICBpZiAodCAmJiB0LmhhcyhlKSkgcmV0dXJuIHQuZ2V0KGUpO1xuICB2YXIgbiA9IHtcbiAgICBfX3Byb3RvX186IG51bGxcbiAgfTtcbiAgZm9yICh2YXIgdSBpbiBlKSBpZiAoXCJkZWZhdWx0XCIgIT09IHUgJiYge30uaGFzT3duUHJvcGVydHkuY2FsbChlLCB1KSkge1xuICAgIHZhciBpID0gX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIgJiYgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPyBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB1KSA6IG51bGw7XG4gICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIobiwgdSwgaSkgOiBuW3VdID0gZVt1XTtcbiAgfVxuICByZXR1cm4gbi5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCBuKSwgbjtcbn1cbi8vIE1hcHBpbmcgb2YgY2xhc3MgbmFtZXMgdG8gY29uc3RydWN0b3JzLCBzbyB3ZSBjYW4gcG9wdWxhdGUgb2JqZWN0cyBmcm9tIHRoZVxuLy8gc2VydmVyIHdpdGggYXBwcm9wcmlhdGUgc3ViY2xhc3NlcyBvZiBQYXJzZU9iamVjdFxuY29uc3QgY2xhc3NNYXAgPSB7fTtcblxuLy8gR2xvYmFsIGNvdW50ZXIgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIElkcyBmb3Igbm9uLXNpbmdsZS1pbnN0YW5jZSBvYmplY3RzXG5sZXQgb2JqZWN0Q291bnQgPSAwO1xuLy8gT24gd2ViIGNsaWVudHMsIG9iamVjdHMgYXJlIHNpbmdsZS1pbnN0YW5jZTogYW55IHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWUgSWRcbi8vIHdpbGwgaGF2ZSB0aGUgc2FtZSBhdHRyaWJ1dGVzLiBIb3dldmVyLCB0aGlzIG1heSBiZSBkYW5nZXJvdXMgZGVmYXVsdFxuLy8gYmVoYXZpb3IgaW4gYSBzZXJ2ZXIgc2NlbmFyaW9cbmxldCBzaW5nbGVJbnN0YW5jZSA9ICFfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0lTX05PREUnKTtcbmlmIChzaW5nbGVJbnN0YW5jZSkge1xuICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoU2luZ2xlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIpO1xufSBlbHNlIHtcbiAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKFVuaXF1ZUluc3RhbmNlU3RhdGVDb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIGdldFNlcnZlclVybFBhdGgoKSB7XG4gIGxldCBzZXJ2ZXJVcmwgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9VUkwnKTtcbiAgaWYgKHNlcnZlclVybFtzZXJ2ZXJVcmwubGVuZ3RoIC0gMV0gIT09ICcvJykge1xuICAgIHNlcnZlclVybCArPSAnLyc7XG4gIH1cbiAgY29uc3QgdXJsID0gc2VydmVyVXJsLnJlcGxhY2UoL2h0dHBzPzpcXC9cXC8vLCAnJyk7XG4gIHJldHVybiB1cmwuc3Vic3RyKCgwLCBfaW5kZXhPZi5kZWZhdWx0KSh1cmwpLmNhbGwodXJsLCAnLycpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1vZGVsIHdpdGggZGVmaW5lZCBhdHRyaWJ1dGVzLlxuICpcbiAqIDxwPllvdSB3b24ndCBub3JtYWxseSBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdFxuICogeW91IHVzZSBhIHN1YmNsYXNzIG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4gaW5zdGVhZCwgY3JlYXRlZCBieSBjYWxsaW5nXG4gKiA8Y29kZT5leHRlbmQ8L2NvZGU+LjwvcD5cbiAqXG4gKiA8cD5Ib3dldmVyLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgYSBzdWJjbGFzcywgb3IgYXJlbid0IHN1cmUgd2hpY2hcbiAqIHN1YmNsYXNzIGlzIGFwcHJvcHJpYXRlLCB5b3UgY2FuIHVzZSB0aGlzIGZvcm06PHByZT5cbiAqICAgICB2YXIgb2JqZWN0ID0gbmV3IFBhcnNlLk9iamVjdChcIkNsYXNzTmFtZVwiKTtcbiAqIDwvcHJlPlxuICogVGhhdCBpcyBiYXNpY2FsbHkgZXF1aXZhbGVudCB0bzo8cHJlPlxuICogICAgIHZhciBNeUNsYXNzID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIkNsYXNzTmFtZVwiKTtcbiAqICAgICB2YXIgb2JqZWN0ID0gbmV3IE15Q2xhc3MoKTtcbiAqIDwvcHJlPjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuT2JqZWN0XG4gKi9cbmNsYXNzIFBhcnNlT2JqZWN0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgVGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBvYmplY3RcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgVGhlIGluaXRpYWwgc2V0IG9mIGRhdGEgdG8gc3RvcmUgaW4gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoaXMgb2JqZWN0IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmlnbm9yZVZhbGlkYXRpb25dIFNldCB0byBgdHJ1ZWAgaWdub3JlIGFueSBhdHRyaWJ1dGUgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGFzc05hbWUsIGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhpcyBvYmplY3QsIHVuaXF1ZSB3aXRoaW4gaXRzIGNsYXNzLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGlkXG4gICAgICovXG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJpZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2xvY2FsSWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9vYmpDb3VudFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiY2xhc3NOYW1lXCIsIHZvaWQgMCk7XG4gICAgLy8gRW5hYmxlIGxlZ2FjeSBpbml0aWFsaXplcnNcbiAgICBpZiAodHlwZW9mIHRoaXMuaW5pdGlhbGl6ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIGxldCB0b1NldCA9IG51bGw7XG4gICAgdGhpcy5fb2JqQ291bnQgPSBvYmplY3RDb3VudCsrO1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdG9TZXQgPSBhdHRyaWJ1dGVzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lICYmIHR5cGVvZiBjbGFzc05hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZS5jbGFzc05hbWU7XG4gICAgICB0b1NldCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBhdHRyIGluIGNsYXNzTmFtZSkge1xuICAgICAgICBpZiAoYXR0ciAhPT0gJ2NsYXNzTmFtZScpIHtcbiAgICAgICAgICB0b1NldFthdHRyXSA9IGNsYXNzTmFtZVthdHRyXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGF0dHJpYnV0ZXMgJiYgdHlwZW9mIGF0dHJpYnV0ZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdGlvbnMgPSBhdHRyaWJ1dGVzO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodG9TZXQgJiYgIXRoaXMuc2V0KHRvU2V0LCBvcHRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIGFuIGludmFsaWQgUGFyc2UgT2JqZWN0XCIpO1xuICAgIH1cbiAgfVxuICAvKiBQcm90b3R5cGUgZ2V0dGVycyAvIHNldHRlcnMgKi9cblxuICBnZXQgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gKDAsIF9mcmVlemUuZGVmYXVsdCkoc3RhdGVDb250cm9sbGVyLmVzdGltYXRlQXR0cmlidXRlcyh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmaXJzdCB0aW1lIHRoaXMgb2JqZWN0IHdhcyBzYXZlZCBvbiB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcHJvcGVydHkge0RhdGV9IGNyZWF0ZWRBdFxuICAgKiBAcmV0dXJucyB7RGF0ZX1cbiAgICovXG4gIGdldCBjcmVhdGVkQXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldFNlcnZlckRhdGEoKS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxhc3QgdGltZSB0aGlzIG9iamVjdCB3YXMgdXBkYXRlZCBvbiB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcHJvcGVydHkge0RhdGV9IHVwZGF0ZWRBdFxuICAgKiBAcmV0dXJucyB7RGF0ZX1cbiAgICovXG4gIGdldCB1cGRhdGVkQXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldFNlcnZlckRhdGEoKS51cGRhdGVkQXQ7XG4gIH1cblxuICAvKiBQcml2YXRlIG1ldGhvZHMgKi9cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxvY2FsIG9yIHNlcnZlciBJZCB1c2VkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBfZ2V0SWQoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmlkID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5fbG9jYWxJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sb2NhbElkO1xuICAgIH1cbiAgICBjb25zdCBsb2NhbElkID0gJ2xvY2FsJyArICgwLCBfdXVpZC5kZWZhdWx0KSgpO1xuICAgIHRoaXMuX2xvY2FsSWQgPSBsb2NhbElkO1xuICAgIHJldHVybiBsb2NhbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciB1c2VkIHRvIHB1bGwgZGF0YSBmcm9tIHRoZSBTdGF0ZSBDb250cm9sbGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fG9iamVjdH1cbiAgICovXG4gIF9nZXRTdGF0ZUlkZW50aWZpZXIoKSB7XG4gICAgaWYgKHNpbmdsZUluc3RhbmNlKSB7XG4gICAgICBsZXQgaWQgPSB0aGlzLmlkO1xuICAgICAgaWYgKCFpZCkge1xuICAgICAgICBpZCA9IHRoaXMuX2dldElkKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfVxuICBfZ2V0U2VydmVyRGF0YSgpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gc3RhdGVDb250cm9sbGVyLmdldFNlcnZlckRhdGEodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICB9XG4gIF9jbGVhclNlcnZlckRhdGEoKSB7XG4gICAgY29uc3Qgc2VydmVyRGF0YSA9IHRoaXMuX2dldFNlcnZlckRhdGEoKTtcbiAgICBjb25zdCB1bnNldCA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBzZXJ2ZXJEYXRhKSB7XG4gICAgICB1bnNldFthdHRyXSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgc3RhdGVDb250cm9sbGVyLnNldFNlcnZlckRhdGEodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIHVuc2V0KTtcbiAgfVxuICBfZ2V0UGVuZGluZ09wcygpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gc3RhdGVDb250cm9sbGVyLmdldFBlbmRpbmdPcHModGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2tleXNUb0NsZWFyXSAtIGlmIHNwZWNpZmllZCwgb25seSBvcHMgbWF0Y2hpbmdcbiAgICogdGhlc2UgZmllbGRzIHdpbGwgYmUgY2xlYXJlZFxuICAgKi9cbiAgX2NsZWFyUGVuZGluZ09wcyhrZXlzVG9DbGVhcikge1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgY29uc3QgbGF0ZXN0ID0gcGVuZGluZ1twZW5kaW5nLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGtleXMgPSBrZXlzVG9DbGVhciB8fCAoMCwgX2tleXMuZGVmYXVsdCkobGF0ZXN0KTtcbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkgPT4ge1xuICAgICAgZGVsZXRlIGxhdGVzdFtrZXldO1xuICAgIH0pO1xuICB9XG4gIF9nZXREaXJ0eU9iamVjdEF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBvYmplY3RDYWNoZSA9IHN0YXRlQ29udHJvbGxlci5nZXRPYmplY3RDYWNoZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgY29uc3QgZGlydHkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgICAgY29uc3QgdmFsID0gYXR0cmlidXRlc1thdHRyXTtcbiAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgISh2YWwgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkgJiYgISh2YWwgaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQpICYmICEodmFsIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkpIHtcbiAgICAgICAgLy8gRHVlIHRvIHRoZSB3YXkgYnJvd3NlcnMgY29uc3RydWN0IG1hcHMsIHRoZSBrZXkgb3JkZXIgd2lsbCBub3QgY2hhbmdlXG4gICAgICAgIC8vIHVubGVzcyB0aGUgb2JqZWN0IGlzIGNoYW5nZWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBqc29uID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkodmFsLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShqc29uKTtcbiAgICAgICAgICBpZiAob2JqZWN0Q2FjaGVbYXR0cl0gIT09IHN0cmluZ2lmaWVkKSB7XG4gICAgICAgICAgICBkaXJ0eVthdHRyXSA9IHZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCwgcG9zc2libHkgYnkgYSBuZXN0ZWQgdW5zYXZlZCBwb2ludGVyIGluIGEgbXV0YWJsZSBjb250YWluZXJcbiAgICAgICAgICAvLyBObyBtYXR0ZXIgaG93IGl0IGhhcHBlbmVkLCBpdCBpbmRpY2F0ZXMgYSBjaGFuZ2UgaW4gdGhlIGF0dHJpYnV0ZVxuICAgICAgICAgIGRpcnR5W2F0dHJdID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXJ0eTtcbiAgfVxuICBfdG9GdWxsSlNPTihzZWVuLCBvZmZsaW5lKSB7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKHNlZW4sIG9mZmxpbmUpO1xuICAgIGpzb24uX190eXBlID0gJ09iamVjdCc7XG4gICAganNvbi5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBfZ2V0U2F2ZUpTT04oKSB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMuX2dldFBlbmRpbmdPcHMoKTtcbiAgICBjb25zdCBkaXJ0eU9iamVjdHMgPSB0aGlzLl9nZXREaXJ0eU9iamVjdEF0dHJpYnV0ZXMoKTtcbiAgICBjb25zdCBqc29uID0ge307XG4gICAgZm9yICh2YXIgYXR0ciBpbiBkaXJ0eU9iamVjdHMpIHtcbiAgICAgIGxldCBpc0RvdE5vdGF0aW9uID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmcubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBwZW5kaW5nW2ldKSB7XG4gICAgICAgICAgLy8gRG90IG5vdGF0aW9uIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgbGF0ZXJcbiAgICAgICAgICBpZiAoKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShmaWVsZCkuY2FsbChmaWVsZCwgJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGROYW1lID0gZmllbGQuc3BsaXQoJy4nKVswXTtcbiAgICAgICAgICAgIGlmIChmaWVsZE5hbWUgPT09IGF0dHIpIHtcbiAgICAgICAgICAgICAgaXNEb3ROb3RhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc0RvdE5vdGF0aW9uKSB7XG4gICAgICAgIGpzb25bYXR0cl0gPSBuZXcgX1BhcnNlT3AuU2V0T3AoZGlydHlPYmplY3RzW2F0dHJdKS50b0pTT04oKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChhdHRyIGluIHBlbmRpbmdbMF0pIHtcbiAgICAgIGpzb25bYXR0cl0gPSBwZW5kaW5nWzBdW2F0dHJdLnRvSlNPTigpO1xuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBfZ2V0U2F2ZVBhcmFtcygpIHtcbiAgICBsZXQgbWV0aG9kID0gdGhpcy5pZCA/ICdQVVQnIDogJ1BPU1QnO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLl9nZXRTYXZlSlNPTigpO1xuICAgIGxldCBwYXRoID0gJ2NsYXNzZXMvJyArIHRoaXMuY2xhc3NOYW1lO1xuICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FMTE9XX0NVU1RPTV9PQkpFQ1RfSUQnKSkge1xuICAgICAgaWYgKCF0aGlzLmNyZWF0ZWRBdCkge1xuICAgICAgICBtZXRob2QgPSAnUE9TVCc7XG4gICAgICAgIGJvZHkub2JqZWN0SWQgPSB0aGlzLmlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0aG9kID0gJ1BVVCc7XG4gICAgICAgIHBhdGggKz0gJy8nICsgdGhpcy5pZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaWQpIHtcbiAgICAgIHBhdGggKz0gJy8nICsgdGhpcy5pZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInKSB7XG4gICAgICBwYXRoID0gJ3VzZXJzJztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIGJvZHksXG4gICAgICBwYXRoXG4gICAgfTtcbiAgfVxuICBfZmluaXNoRmV0Y2goc2VydmVyRGF0YSkge1xuICAgIGlmICghdGhpcy5pZCAmJiBzZXJ2ZXJEYXRhLm9iamVjdElkKSB7XG4gICAgICB0aGlzLmlkID0gc2VydmVyRGF0YS5vYmplY3RJZDtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgc3RhdGVDb250cm9sbGVyLmluaXRpYWxpemVTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgY29uc3QgZGVjb2RlZCA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBzZXJ2ZXJEYXRhKSB7XG4gICAgICBpZiAoYXR0ciA9PT0gJ0FDTCcpIHtcbiAgICAgICAgZGVjb2RlZFthdHRyXSA9IG5ldyBfUGFyc2VBQ0wuZGVmYXVsdChzZXJ2ZXJEYXRhW2F0dHJdKTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0ciAhPT0gJ29iamVjdElkJykge1xuICAgICAgICBkZWNvZGVkW2F0dHJdID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkoc2VydmVyRGF0YVthdHRyXSk7XG4gICAgICAgIGlmIChkZWNvZGVkW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkge1xuICAgICAgICAgIGRlY29kZWRbYXR0cl0uX2Vuc3VyZVBhcmVudEFuZEtleSh0aGlzLCBhdHRyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVjb2RlZC5jcmVhdGVkQXQgJiYgdHlwZW9mIGRlY29kZWQuY3JlYXRlZEF0ID09PSAnc3RyaW5nJykge1xuICAgICAgZGVjb2RlZC5jcmVhdGVkQXQgPSAoMCwgX3BhcnNlRGF0ZS5kZWZhdWx0KShkZWNvZGVkLmNyZWF0ZWRBdCk7XG4gICAgfVxuICAgIGlmIChkZWNvZGVkLnVwZGF0ZWRBdCAmJiB0eXBlb2YgZGVjb2RlZC51cGRhdGVkQXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkZWNvZGVkLnVwZGF0ZWRBdCA9ICgwLCBfcGFyc2VEYXRlLmRlZmF1bHQpKGRlY29kZWQudXBkYXRlZEF0KTtcbiAgICB9XG4gICAgaWYgKCFkZWNvZGVkLnVwZGF0ZWRBdCAmJiBkZWNvZGVkLmNyZWF0ZWRBdCkge1xuICAgICAgZGVjb2RlZC51cGRhdGVkQXQgPSBkZWNvZGVkLmNyZWF0ZWRBdDtcbiAgICB9XG4gICAgc3RhdGVDb250cm9sbGVyLmNvbW1pdFNlcnZlckNoYW5nZXModGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIGRlY29kZWQpO1xuICB9XG4gIF9zZXRFeGlzdGVkKGV4aXN0ZWQpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgaWYgKHN0YXRlKSB7XG4gICAgICBzdGF0ZS5leGlzdGVkID0gZXhpc3RlZDtcbiAgICB9XG4gIH1cbiAgX21pZ3JhdGVJZChzZXJ2ZXJJZCkge1xuICAgIGlmICh0aGlzLl9sb2NhbElkICYmIHNlcnZlcklkKSB7XG4gICAgICBpZiAoc2luZ2xlSW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgICAgIGNvbnN0IG9sZFN0YXRlID0gc3RhdGVDb250cm9sbGVyLnJlbW92ZVN0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICAgICAgdGhpcy5pZCA9IHNlcnZlcklkO1xuICAgICAgICBkZWxldGUgdGhpcy5fbG9jYWxJZDtcbiAgICAgICAgaWYgKG9sZFN0YXRlKSB7XG4gICAgICAgICAgc3RhdGVDb250cm9sbGVyLmluaXRpYWxpemVTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgb2xkU3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlkID0gc2VydmVySWQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sb2NhbElkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfaGFuZGxlU2F2ZVJlc3BvbnNlKHJlc3BvbnNlLCBzdGF0dXMpIHtcbiAgICBjb25zdCBjaGFuZ2VzID0ge307XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGVuZGluZyA9IHN0YXRlQ29udHJvbGxlci5wb3BQZW5kaW5nU3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgIGZvciAodmFyIGF0dHIgaW4gcGVuZGluZykge1xuICAgICAgaWYgKHBlbmRpbmdbYXR0cl0gaW5zdGFuY2VvZiBfUGFyc2VPcC5SZWxhdGlvbk9wKSB7XG4gICAgICAgIGNoYW5nZXNbYXR0cl0gPSBwZW5kaW5nW2F0dHJdLmFwcGx5VG8odW5kZWZpbmVkLCB0aGlzLCBhdHRyKTtcbiAgICAgIH0gZWxzZSBpZiAoIShhdHRyIGluIHJlc3BvbnNlKSkge1xuICAgICAgICAvLyBPbmx5IFNldE9wcyBhbmQgVW5zZXRPcHMgc2hvdWxkIG5vdCBjb21lIGJhY2sgd2l0aCByZXN1bHRzXG4gICAgICAgIGNoYW5nZXNbYXR0cl0gPSBwZW5kaW5nW2F0dHJdLmFwcGx5VG8odW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChhdHRyIGluIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoKGF0dHIgPT09ICdjcmVhdGVkQXQnIHx8IGF0dHIgPT09ICd1cGRhdGVkQXQnKSAmJiB0eXBlb2YgcmVzcG9uc2VbYXR0cl0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNoYW5nZXNbYXR0cl0gPSAoMCwgX3BhcnNlRGF0ZS5kZWZhdWx0KShyZXNwb25zZVthdHRyXSk7XG4gICAgICB9IGVsc2UgaWYgKGF0dHIgPT09ICdBQ0wnKSB7XG4gICAgICAgIGNoYW5nZXNbYXR0cl0gPSBuZXcgX1BhcnNlQUNMLmRlZmF1bHQocmVzcG9uc2VbYXR0cl0pO1xuICAgICAgfSBlbHNlIGlmIChhdHRyICE9PSAnb2JqZWN0SWQnKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKHJlc3BvbnNlW2F0dHJdKTtcbiAgICAgICAgaWYgKHZhbCAmJiAoMCwgX2dldFByb3RvdHlwZU9mLmRlZmF1bHQpKHZhbCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgICBjaGFuZ2VzW2F0dHJdID0ge1xuICAgICAgICAgICAgLi4udGhpcy5hdHRyaWJ1dGVzW2F0dHJdLFxuICAgICAgICAgICAgLi4udmFsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VzW2F0dHJdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlT3AuVW5zZXRPcCkge1xuICAgICAgICAgIGNoYW5nZXNbYXR0cl0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuY3JlYXRlZEF0ICYmICFjaGFuZ2VzLnVwZGF0ZWRBdCkge1xuICAgICAgY2hhbmdlcy51cGRhdGVkQXQgPSBjaGFuZ2VzLmNyZWF0ZWRBdDtcbiAgICB9XG4gICAgdGhpcy5fbWlncmF0ZUlkKHJlc3BvbnNlLm9iamVjdElkKTtcbiAgICBpZiAoc3RhdHVzICE9PSAyMDEpIHtcbiAgICAgIHRoaXMuX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRlQ29udHJvbGxlci5jb21taXRTZXJ2ZXJDaGFuZ2VzKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpLCBjaGFuZ2VzKTtcbiAgfVxuICBfaGFuZGxlU2F2ZUVycm9yKCkge1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIHN0YXRlQ29udHJvbGxlci5tZXJnZUZpcnN0UGVuZGluZ1N0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgfVxuICBzdGF0aWMgX2dldENsYXNzTWFwKCkge1xuICAgIHJldHVybiBjbGFzc01hcDtcbiAgfVxuXG4gIC8qIFB1YmxpYyBtZXRob2RzICovXG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICAvLyBOT09QXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04gdmVyc2lvbiBvZiB0aGUgb2JqZWN0IHN1aXRhYmxlIGZvciBzYXZpbmcgdG8gUGFyc2UuXG4gICAqXG4gICAqIEBwYXJhbSBzZWVuXG4gICAqIEBwYXJhbSBvZmZsaW5lXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICB0b0pTT04oc2Vlbiwgb2ZmbGluZSkge1xuICAgIGNvbnN0IHNlZW5FbnRyeSA9IHRoaXMuaWQgPyB0aGlzLmNsYXNzTmFtZSArICc6JyArIHRoaXMuaWQgOiB0aGlzO1xuICAgIHNlZW4gPSBzZWVuIHx8IFtzZWVuRW50cnldO1xuICAgIGNvbnN0IGpzb24gPSB7fTtcbiAgICBjb25zdCBhdHRycyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cnMpIHtcbiAgICAgIGlmICgoYXR0ciA9PT0gJ2NyZWF0ZWRBdCcgfHwgYXR0ciA9PT0gJ3VwZGF0ZWRBdCcpICYmIGF0dHJzW2F0dHJdLnRvSlNPTikge1xuICAgICAgICBqc29uW2F0dHJdID0gYXR0cnNbYXR0cl0udG9KU09OKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uW2F0dHJdID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkoYXR0cnNbYXR0cl0sIGZhbHNlLCBmYWxzZSwgc2Vlbiwgb2ZmbGluZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgZm9yIChjb25zdCBhdHRyIGluIHBlbmRpbmdbMF0pIHtcbiAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoYXR0cikuY2FsbChhdHRyLCAnLicpIDwgMCkge1xuICAgICAgICBqc29uW2F0dHJdID0gcGVuZGluZ1swXVthdHRyXS50b0pTT04ob2ZmbGluZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlkKSB7XG4gICAgICBqc29uLm9iamVjdElkID0gdGhpcy5pZDtcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgUGFyc2VPYmplY3QgaXMgZXF1YWwgdG8gYW5vdGhlciBQYXJzZU9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3RoZXIgLSBBbiBvdGhlciBvYmplY3Qgb3QgY29tcGFyZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGVxdWFscyhvdGhlcikge1xuICAgIGlmICh0aGlzID09PSBvdGhlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0ICYmIHRoaXMuY2xhc3NOYW1lID09PSBvdGhlci5jbGFzc05hbWUgJiYgdGhpcy5pZCA9PT0gb3RoZXIuaWQgJiYgdHlwZW9mIHRoaXMuaWQgIT09ICd1bmRlZmluZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSBpdHMgbGFzdFxuICAgKiBzYXZlL3JlZnJlc2guICBJZiBhbiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCBpdCByZXR1cm5zIHRydWUgb25seSBpZiB0aGF0XG4gICAqIHBhcnRpY3VsYXIgYXR0cmlidXRlIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IHNhdmUvcmVmcmVzaC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgQW4gYXR0cmlidXRlIG5hbWUgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBkaXJ0eShhdHRyKSB7XG4gICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGVuZGluZ09wcyA9IHRoaXMuX2dldFBlbmRpbmdPcHMoKTtcbiAgICBjb25zdCBkaXJ0eU9iamVjdHMgPSB0aGlzLl9nZXREaXJ0eU9iamVjdEF0dHJpYnV0ZXMoKTtcbiAgICBpZiAoYXR0cikge1xuICAgICAgaWYgKGRpcnR5T2JqZWN0cy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZ09wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGVuZGluZ09wc1tpXS5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICgoMCwgX2tleXMuZGVmYXVsdCkocGVuZGluZ09wc1swXSkubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCgwLCBfa2V5cy5kZWZhdWx0KShkaXJ0eU9iamVjdHMpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGtleXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgbGFzdCBzYXZlL3JlZnJlc2hcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZGlydHlLZXlzKCkge1xuICAgIGNvbnN0IHBlbmRpbmdPcHMgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgY29uc3Qga2V5cyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZ09wcy5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChjb25zdCBhdHRyIGluIHBlbmRpbmdPcHNbaV0pIHtcbiAgICAgICAga2V5c1thdHRyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRpcnR5T2JqZWN0cyA9IHRoaXMuX2dldERpcnR5T2JqZWN0QXR0cmlidXRlcygpO1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBkaXJ0eU9iamVjdHMpIHtcbiAgICAgIGtleXNbYXR0cl0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIF9rZXlzLmRlZmF1bHQpKGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIGZldGNoZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNEYXRhQXZhaWxhYmxlKCkge1xuICAgIGNvbnN0IHNlcnZlckRhdGEgPSB0aGlzLl9nZXRTZXJ2ZXJEYXRhKCk7XG4gICAgcmV0dXJuICEhKDAsIF9rZXlzLmRlZmF1bHQpKHNlcnZlckRhdGEpLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgUG9pbnRlciByZWZlcmVuY2luZyB0aGlzIE9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge1BvaW50ZXJ9XG4gICAqL1xuICB0b1BvaW50ZXIoKSB7XG4gICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBwb2ludGVyIHRvIGFuIHVuc2F2ZWQgUGFyc2VPYmplY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIG9iamVjdElkOiB0aGlzLmlkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgUG9pbnRlciByZWZlcmVuY2luZyB0aGlzIE9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge1BvaW50ZXJ9XG4gICAqL1xuICB0b09mZmxpbmVQb2ludGVyKCkge1xuICAgIGlmICghdGhpcy5fbG9jYWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGEgb2ZmbGluZSBwb2ludGVyIHRvIGEgc2F2ZWQgUGFyc2VPYmplY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ09iamVjdCcsXG4gICAgICBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLFxuICAgICAgX2xvY2FsSWQ6IHRoaXMuX2xvY2FsSWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIHN0cmluZyBuYW1lIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBnZXQoYXR0cikge1xuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbYXR0cl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlbGF0aW9uIG9uIHRoZSBnaXZlbiBjbGFzcyBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIGF0dHJpYnV0ZSB0byBnZXQgdGhlIHJlbGF0aW9uIGZvci5cbiAgICogQHJldHVybnMge1BhcnNlLlJlbGF0aW9ufVxuICAgKi9cbiAgcmVsYXRpb24oYXR0cikge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoYXR0cik7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FsbGVkIHJlbGF0aW9uKCkgb24gbm9uLXJlbGF0aW9uIGZpZWxkICcgKyBhdHRyKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlLl9lbnN1cmVQYXJlbnRBbmRLZXkodGhpcywgYXR0cik7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCh0aGlzLCBhdHRyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBIVE1MLWVzY2FwZWQgdmFsdWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgc3RyaW5nIG5hbWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZXNjYXBlKGF0dHIpIHtcbiAgICBsZXQgdmFsID0gdGhpcy5hdHRyaWJ1dGVzW2F0dHJdO1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsLnRvU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHZhbCA9IHZhbC50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIF9lc2NhcGUuZGVmYXVsdCkodmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgY29udGFpbnMgYSB2YWx1ZSB0aGF0IGlzIG5vdFxuICAgKiBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIHN0cmluZyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaGFzKGF0dHIpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgIGlmIChhdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlc1thdHRyXSAhPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIGhhc2ggb2YgbW9kZWwgYXR0cmlidXRlcyBvbiB0aGUgb2JqZWN0LlxuICAgKlxuICAgKiA8cD5Zb3UgY2FuIGNhbGwgaXQgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyBrZXlzIGFuZCB2YWx1ZXMsIHdpdGggb25lXG4gICAqIGtleSBhbmQgdmFsdWUsIG9yIGRvdCBub3RhdGlvbi4gIEZvciBleGFtcGxlOjxwcmU+XG4gICAqICAgZ2FtZVR1cm4uc2V0KHtcbiAgICogICAgIHBsYXllcjogcGxheWVyMSxcbiAgICogICAgIGRpY2VSb2xsOiAyXG4gICAqICAgfSwge1xuICAgKiAgICAgZXJyb3I6IGZ1bmN0aW9uKGdhbWVUdXJuQWdhaW4sIGVycm9yKSB7XG4gICAqICAgICAgIC8vIFRoZSBzZXQgZmFpbGVkIHZhbGlkYXRpb24uXG4gICAqICAgICB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqICAgZ2FtZS5zZXQoXCJjdXJyZW50UGxheWVyXCIsIHBsYXllcjIsIHtcbiAgICogICAgIGVycm9yOiBmdW5jdGlvbihnYW1lVHVybkFnYWluLCBlcnJvcikge1xuICAgKiAgICAgICAvLyBUaGUgc2V0IGZhaWxlZCB2YWxpZGF0aW9uLlxuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIGdhbWUuc2V0KFwiZmluaXNoZWRcIiwgdHJ1ZSk7PC9wcmU+PC9wPlxuICAgKlxuICAgKiAgIGdhbWUuc2V0KFwicGxheWVyLnNjb3JlXCIsIDEwKTs8L3ByZT48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSBrZXkgVGhlIGtleSB0byBzZXQuXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZ2l2ZSBpdC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgQSBzZXQgb2Ygb3B0aW9ucyBmb3IgdGhlIHNldC5cbiAgICogICAgIFRoZSBvbmx5IHN1cHBvcnRlZCBvcHRpb24gaXMgPGNvZGU+ZXJyb3I8L2NvZGU+LlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0fGJvb2xlYW4pfSB0cnVlIGlmIHRoZSBzZXQgc3VjY2VlZGVkLlxuICAgKi9cbiAgc2V0KGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBsZXQgY2hhbmdlcyA9IHt9O1xuICAgIGNvbnN0IG5ld09wcyA9IHt9O1xuICAgIGlmIChrZXkgJiYgdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNoYW5nZXMgPSBrZXk7XG4gICAgICBvcHRpb25zID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgY2hhbmdlc1trZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBsZXQgcmVhZG9ubHkgPSBbXTtcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uc3RydWN0b3IucmVhZE9ubHlBdHRyaWJ1dGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZWFkb25seSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHJlYWRvbmx5KS5jYWxsKHJlYWRvbmx5LCB0aGlzLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlcygpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrIGluIGNoYW5nZXMpIHtcbiAgICAgIGlmIChrID09PSAnY3JlYXRlZEF0JyB8fCBrID09PSAndXBkYXRlZEF0Jykge1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IGlzIHJlYWQtb25seSwgYnV0IGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzaWxlbnRseVxuICAgICAgICAvLyBpZ25vcmUgaXRcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHJlYWRvbmx5KS5jYWxsKHJlYWRvbmx5LCBrKSA+IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1vZGlmeSByZWFkb25seSBhdHRyaWJ1dGU6ICcgKyBrKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnVuc2V0KSB7XG4gICAgICAgIG5ld09wc1trXSA9IG5ldyBfUGFyc2VPcC5VbnNldE9wKCk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXNba10gaW5zdGFuY2VvZiBfUGFyc2VPcC5PcCkge1xuICAgICAgICBuZXdPcHNba10gPSBjaGFuZ2VzW2tdO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzW2tdICYmIHR5cGVvZiBjaGFuZ2VzW2tdID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY2hhbmdlc1trXS5fX29wID09PSAnc3RyaW5nJykge1xuICAgICAgICBuZXdPcHNba10gPSAoMCwgX1BhcnNlT3Aub3BGcm9tSlNPTikoY2hhbmdlc1trXSk7XG4gICAgICB9IGVsc2UgaWYgKGsgPT09ICdvYmplY3RJZCcgfHwgayA9PT0gJ2lkJykge1xuICAgICAgICBpZiAodHlwZW9mIGNoYW5nZXNba10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5pZCA9IGNoYW5nZXNba107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoayA9PT0gJ0FDTCcgJiYgdHlwZW9mIGNoYW5nZXNba10gPT09ICdvYmplY3QnICYmICEoY2hhbmdlc1trXSBpbnN0YW5jZW9mIF9QYXJzZUFDTC5kZWZhdWx0KSkge1xuICAgICAgICBuZXdPcHNba10gPSBuZXcgX1BhcnNlT3AuU2V0T3AobmV3IF9QYXJzZUFDTC5kZWZhdWx0KGNoYW5nZXNba10pKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlc1trXSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpb24gPSBuZXcgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCh0aGlzLCBrKTtcbiAgICAgICAgcmVsYXRpb24udGFyZ2V0Q2xhc3NOYW1lID0gY2hhbmdlc1trXS50YXJnZXRDbGFzc05hbWU7XG4gICAgICAgIG5ld09wc1trXSA9IG5ldyBfUGFyc2VPcC5TZXRPcChyZWxhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdPcHNba10gPSBuZXcgX1BhcnNlT3AuU2V0T3AoY2hhbmdlc1trXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRBdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyB2YWx1ZXNcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gbmV3T3BzKSB7XG4gICAgICBpZiAobmV3T3BzW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlT3AuUmVsYXRpb25PcCkge1xuICAgICAgICBuZXdWYWx1ZXNbYXR0cl0gPSBuZXdPcHNbYXR0cl0uYXBwbHlUbyhjdXJyZW50QXR0cmlidXRlc1thdHRyXSwgdGhpcywgYXR0cik7XG4gICAgICB9IGVsc2UgaWYgKCEobmV3T3BzW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlT3AuVW5zZXRPcCkpIHtcbiAgICAgICAgbmV3VmFsdWVzW2F0dHJdID0gbmV3T3BzW2F0dHJdLmFwcGx5VG8oY3VycmVudEF0dHJpYnV0ZXNbYXR0cl0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5nZXNcbiAgICBpZiAoIW9wdGlvbnMuaWdub3JlVmFsaWRhdGlvbikge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMudmFsaWRhdGUobmV3VmFsdWVzKTtcbiAgICAgIGlmICh2YWxpZGF0aW9uKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9wdGlvbnMuZXJyb3IodGhpcywgdmFsaWRhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnNvbGlkYXRlIE9wc1xuICAgIGNvbnN0IHBlbmRpbmdPcHMgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgY29uc3QgbGFzdCA9IHBlbmRpbmdPcHMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gbmV3T3BzKSB7XG4gICAgICBjb25zdCBuZXh0T3AgPSBuZXdPcHNbYXR0cl0ubWVyZ2VXaXRoKHBlbmRpbmdPcHNbbGFzdF1bYXR0cl0pO1xuICAgICAgc3RhdGVDb250cm9sbGVyLnNldFBlbmRpbmdPcCh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgYXR0ciwgbmV4dE9wKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBtb2RlbC4gVGhpcyBpcyBhIG5vb3AgaWYgdGhlIGF0dHJpYnV0ZSBkb2Vzbid0XG4gICAqIGV4aXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgc3RyaW5nIG5hbWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICB1bnNldChhdHRyLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy51bnNldCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG51bGwsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZSB0aGUgbmV4dCB0aW1lIHRoZVxuICAgKiBvYmplY3QgaXMgc2F2ZWQuIElmIG5vIGFtb3VudCBpcyBzcGVjaWZpZWQsIDEgaXMgdXNlZCBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gYW1vdW50IHtOdW1iZXJ9IFRoZSBhbW91bnQgdG8gaW5jcmVtZW50IGJ5IChvcHRpb25hbCkuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3R8Ym9vbGVhbil9XG4gICAqL1xuICBpbmNyZW1lbnQoYXR0ciwgYW1vdW50KSB7XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBhbW91bnQgPSAxO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGluY3JlbWVudCBieSBhIG5vbi1udW1lcmljIGFtb3VudC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5JbmNyZW1lbnRPcChhbW91bnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdGhlIG5leHQgdGltZSB0aGVcbiAgICogb2JqZWN0IGlzIHNhdmVkLiBJZiBubyBhbW91bnQgaXMgc3BlY2lmaWVkLCAxIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGFtb3VudCB7TnVtYmVyfSBUaGUgYW1vdW50IHRvIGRlY3JlbWVudCBieSAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICBkZWNyZW1lbnQoYXR0ciwgYW1vdW50KSB7XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBhbW91bnQgPSAxO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGRlY3JlbWVudCBieSBhIG5vbi1udW1lcmljIGFtb3VudC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5JbmNyZW1lbnRPcChhbW91bnQgKiAtMSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgYWRkIGFuIG9iamVjdCB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICAgKiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBpdGVtIHt9IFRoZSBpdGVtIHRvIGFkZC5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgYWRkKGF0dHIsIGl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbmV3IF9QYXJzZU9wLkFkZE9wKFtpdGVtXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgYWRkIHRoZSBvYmplY3RzIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuXG4gICAqIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGl0ZW1zIHtPYmplY3RbXX0gVGhlIGl0ZW1zIHRvIGFkZC5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgYWRkQWxsKGF0dHIsIGl0ZW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5BZGRPcChpdGVtcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgYWRkIGFuIG9iamVjdCB0byB0aGUgYXJyYXkgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5LCBvbmx5XG4gICAqIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGFycmF5LiBUaGUgcG9zaXRpb24gb2YgdGhlIGluc2VydCBpc1xuICAgKiBub3QgZ3VhcmFudGVlZC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGl0ZW0ge30gVGhlIG9iamVjdCB0byBhZGQuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIGFkZFVuaXF1ZShhdHRyLCBpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5BZGRVbmlxdWVPcChbaXRlbV0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGFkZCB0aGUgb2JqZWN0cyB0byB0aGUgYXJyYXkgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5LCBvbmx5XG4gICAqIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGFycmF5LiBUaGUgcG9zaXRpb24gb2YgdGhlIGluc2VydCBpc1xuICAgKiBub3QgZ3VhcmFudGVlZC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGl0ZW1zIHtPYmplY3RbXX0gVGhlIG9iamVjdHMgdG8gYWRkLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICBhZGRBbGxVbmlxdWUoYXR0ciwgaXRlbXMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbmV3IF9QYXJzZU9wLkFkZFVuaXF1ZU9wKGl0ZW1zKSk7XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSByZW1vdmUgYWxsIGluc3RhbmNlcyBvZiBhbiBvYmplY3QgZnJvbSB0aGUgYXJyYXkgYXNzb2NpYXRlZFxuICAgKiB3aXRoIGEgZ2l2ZW4ga2V5LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gaXRlbSB7fSBUaGUgb2JqZWN0IHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgcmVtb3ZlKGF0dHIsIGl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbmV3IF9QYXJzZU9wLlJlbW92ZU9wKFtpdGVtXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgcmVtb3ZlIGFsbCBpbnN0YW5jZXMgb2YgdGhlIG9iamVjdHMgZnJvbSB0aGUgYXJyYXkgYXNzb2NpYXRlZFxuICAgKiB3aXRoIGEgZ2l2ZW4ga2V5LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gaXRlbXMge09iamVjdFtdfSBUaGUgb2JqZWN0IHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgcmVtb3ZlQWxsKGF0dHIsIGl0ZW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5SZW1vdmVPcChpdGVtcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBQYXJzZS5PcCBkZXNjcmliaW5nIHdoYXQga2luZCBvZlxuICAgKiBtb2RpZmljYXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkIG9uIHRoaXMgZmllbGQgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXNcbiAgICogc2F2ZWQuIEZvciBleGFtcGxlLCBhZnRlciBjYWxsaW5nIG9iamVjdC5pbmNyZW1lbnQoXCJ4XCIpLCBjYWxsaW5nXG4gICAqIG9iamVjdC5vcChcInhcIikgd291bGQgcmV0dXJuIGFuIGluc3RhbmNlIG9mIFBhcnNlLk9wLkluY3JlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHJldHVybnMge1BhcnNlLk9wIHwgdW5kZWZpbmVkfSBUaGUgb3BlcmF0aW9uLCBvciB1bmRlZmluZWQgaWYgbm9uZS5cbiAgICovXG4gIG9wKGF0dHIpIHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGZvciAobGV0IGkgPSBwZW5kaW5nLmxlbmd0aDsgaS0tOykge1xuICAgICAgaWYgKHBlbmRpbmdbaV1bYXR0cl0pIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdbaV1bYXR0cl07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbW9kZWwgd2l0aCBpZGVudGljYWwgYXR0cmlidXRlcyB0byB0aGlzIG9uZS5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH1cbiAgICovXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IGNsb25lID0gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5jbGFzc05hbWUpO1xuICAgIGxldCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgIGlmICh0eXBlb2YgdGhpcy5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHJlYWRvbmx5ID0gdGhpcy5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMoKSB8fCBbXTtcbiAgICAgIC8vIEF0dHJpYnV0ZXMgYXJlIGZyb3plbiwgc28gd2UgaGF2ZSB0byByZWJ1aWxkIGFuIG9iamVjdCxcbiAgICAgIC8vIHJhdGhlciB0aGFuIGRlbGV0ZSByZWFkb25seSBrZXlzXG4gICAgICBjb25zdCBjb3B5ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGEgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHJlYWRvbmx5KS5jYWxsKHJlYWRvbmx5LCBhKSA8IDApIHtcbiAgICAgICAgICBjb3B5W2FdID0gYXR0cmlidXRlc1thXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXR0cmlidXRlcyA9IGNvcHk7XG4gICAgfVxuICAgIGlmIChjbG9uZS5zZXQpIHtcbiAgICAgIGNsb25lLnNldChhdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBvYmplY3QuIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGNsb25lKClcbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH1cbiAgICovXG4gIG5ld0luc3RhbmNlKCkge1xuICAgIGNvbnN0IGNsb25lID0gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5jbGFzc05hbWUpO1xuICAgIGNsb25lLmlkID0gdGhpcy5pZDtcbiAgICBpZiAoc2luZ2xlSW5zdGFuY2UpIHtcbiAgICAgIC8vIEp1c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIHRoZSByaWdodCBpZFxuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoc3RhdGVDb250cm9sbGVyKSB7XG4gICAgICBzdGF0ZUNvbnRyb2xsZXIuZHVwbGljYXRlU3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIGNsb25lLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvYmplY3QgaGFzIG5ldmVyIGJlZW4gc2F2ZWQgdG8gUGFyc2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNOZXcoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9iamVjdCB3YXMgY3JlYXRlZCBieSB0aGUgUGFyc2Ugc2VydmVyIHdoZW4gdGhlXG4gICAqIG9iamVjdCBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiB0aGVyZSAoZS5nLiBpbiB0aGUgY2FzZSBvZiBhIEZhY2Vib29rXG4gICAqIGxvZ2luKVxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGV4aXN0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHN0YXRlID0gc3RhdGVDb250cm9sbGVyLmdldFN0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5leGlzdGVkO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgb2JqZWN0IGV4aXN0cyBvbiB0aGUgU2VydmVyXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBib29sZWFuIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgaWYgb2JqZWN0IGV4aXN0cy5cbiAgICovXG4gIGFzeW5jIGV4aXN0cyhvcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBQYXJzZVF1ZXJ5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VRdWVyeSgpO1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeSh0aGlzLmNsYXNzTmFtZSk7XG4gICAgICBhd2FpdCBxdWVyeS5nZXQodGhpcy5pZCwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlID09PSBfUGFyc2VFcnJvci5kZWZhdWx0Lk9CSkVDVF9OT1RfRk9VTkQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBtb2RlbCBpcyBjdXJyZW50bHkgaW4gYSB2YWxpZCBzdGF0ZS5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc1ZhbGlkKCkge1xuICAgIHJldHVybiAhdGhpcy52YWxpZGF0ZSh0aGlzLmF0dHJpYnV0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBzaG91bGQgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSB1bmxlc3MgeW91IHN1YmNsYXNzXG4gICAqIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4sIGluIHdoaWNoIGNhc2UgeW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZFxuICAgKiB0byBwcm92aWRlIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBvbiA8Y29kZT5zZXQ8L2NvZGU+IGFuZFxuICAgKiA8Y29kZT5zYXZlPC9jb2RlPi4gIFlvdXIgaW1wbGVtZW50YXRpb24gc2hvdWxkIHJldHVyblxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cnMgVGhlIGN1cnJlbnQgZGF0YSB0byB2YWxpZGF0ZS5cbiAgICogQHJldHVybnMge1BhcnNlLkVycm9yfGJvb2xlYW59IEZhbHNlIGlmIHRoZSBkYXRhIGlzIHZhbGlkLiAgQW4gZXJyb3Igb2JqZWN0IG90aGVyd2lzZS5cbiAgICogQHNlZSBQYXJzZS5PYmplY3Qjc2V0XG4gICAqL1xuICB2YWxpZGF0ZShhdHRycykge1xuICAgIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eSgnQUNMJykgJiYgIShhdHRycy5BQ0wgaW5zdGFuY2VvZiBfUGFyc2VBQ0wuZGVmYXVsdCkpIHtcbiAgICAgIHJldHVybiBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnQUNMIG11c3QgYmUgYSBQYXJzZSBBQ0wuJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgICBpZiAoIS9eW0EtWmEtel1bMC05QS1aYS16Xy5dKiQvLnRlc3Qoa2V5KSkge1xuICAgICAgICByZXR1cm4gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0tFWV9OQU1FKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIEFDTCBmb3IgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5BQ0x8bnVsbH0gQW4gaW5zdGFuY2Ugb2YgUGFyc2UuQUNMLlxuICAgKiBAc2VlIFBhcnNlLk9iamVjdCNnZXRcbiAgICovXG4gIGdldEFDTCgpIHtcbiAgICBjb25zdCBhY2wgPSB0aGlzLmdldCgnQUNMJyk7XG4gICAgaWYgKGFjbCBpbnN0YW5jZW9mIF9QYXJzZUFDTC5kZWZhdWx0KSB7XG4gICAgICByZXR1cm4gYWNsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBBQ0wgdG8gYmUgdXNlZCBmb3IgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2UuQUNMfSBhY2wgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuQUNMLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9IFdoZXRoZXIgdGhlIHNldCBwYXNzZWQgdmFsaWRhdGlvbi5cbiAgICogQHNlZSBQYXJzZS5PYmplY3Qjc2V0XG4gICAqL1xuICBzZXRBQ0woYWNsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KCdBQ0wnLCBhY2wsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbnkgKG9yIHNwZWNpZmljKSBjaGFuZ2VzIHRvIHRoaXMgb2JqZWN0IG1hZGUgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBzYXZlKClcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXlzXSAtIHNwZWNpZnkgd2hpY2ggZmllbGRzIHRvIHJldmVydFxuICAgKi9cbiAgcmV2ZXJ0KCkge1xuICAgIGxldCBrZXlzVG9SZXZlcnQ7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBrZXlzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBpZiAoa2V5cy5sZW5ndGgpIHtcbiAgICAgIGtleXNUb1JldmVydCA9IFtdO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBrZXlzVG9SZXZlcnQucHVzaChrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyc2UuT2JqZWN0I3JldmVydCBleHBlY3RzIGVpdGhlciBubywgb3IgYSBsaXN0IG9mIHN0cmluZywgYXJndW1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2NsZWFyUGVuZGluZ09wcyhrZXlzVG9SZXZlcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgYXR0cmlidXRlcyBvbiBhIG1vZGVsXG4gICAqXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgY29uc3QgZXJhc2FibGUgPSB7fTtcbiAgICBsZXQgcmVhZG9ubHkgPSBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uc3RydWN0b3IucmVhZE9ubHlBdHRyaWJ1dGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZWFkb25seSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHJlYWRvbmx5KS5jYWxsKHJlYWRvbmx5LCB0aGlzLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlcygpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkocmVhZG9ubHkpLmNhbGwocmVhZG9ubHksIGF0dHIpIDwgMCkge1xuICAgICAgICBlcmFzYWJsZVthdHRyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNldChlcmFzYWJsZSwge1xuICAgICAgdW5zZXQ6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgbW9kZWwgZnJvbSB0aGUgc2VydmVyLiBJZiB0aGUgc2VydmVyJ3MgcmVwcmVzZW50YXRpb24gb2YgdGhlXG4gICAqIG1vZGVsIGRpZmZlcnMgZnJvbSBpdHMgY3VycmVudCBhdHRyaWJ1dGVzLCB0aGV5IHdpbGwgYmUgb3ZlcnJpZGVuLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+aW5jbHVkZTogVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBpbmNsdWRlLiBDYW4gYmUgYSBzdHJpbmcsIGFuIGFycmF5IG9mIHN0cmluZ3MsXG4gICAqICAgICAgIG9yIGFuIGFycmF5IG9mIGFycmF5IG9mIHN0cmluZ3MuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRmluZGAgdHJpZ2dlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBmZXRjaFxuICAgKiAgICAgY29tcGxldGVzLlxuICAgKi9cbiAgZmV0Y2gob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZmV0Y2hPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGZldGNoT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZmV0Y2hPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdpbmNsdWRlJykpIHtcbiAgICAgIGZldGNoT3B0aW9ucy5pbmNsdWRlID0gW107XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9wdGlvbnMuaW5jbHVkZSkpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0O1xuICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQgPSBvcHRpb25zLmluY2x1ZGUpLmNhbGwoX2NvbnRleHQsIGtleSA9PiB7XG4gICAgICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgICAgICB2YXIgX2NvbnRleHQyO1xuICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmluY2x1ZGUgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDIgPSBmZXRjaE9wdGlvbnMuaW5jbHVkZSkuY2FsbChfY29udGV4dDIsIGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZldGNoT3B0aW9ucy5pbmNsdWRlLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmV0Y2hPcHRpb25zLmluY2x1ZGUucHVzaChvcHRpb25zLmluY2x1ZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmZldGNoKHRoaXMsIHRydWUsIGZldGNoT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIG1vZGVsIGZyb20gdGhlIHNlcnZlci4gSWYgdGhlIHNlcnZlcidzIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuICAgKiBtb2RlbCBkaWZmZXJzIGZyb20gaXRzIGN1cnJlbnQgYXR0cmlidXRlcywgdGhleSB3aWxsIGJlIG92ZXJyaWRlbi5cbiAgICpcbiAgICogSW5jbHVkZXMgbmVzdGVkIFBhcnNlLk9iamVjdHMgZm9yIHRoZSBwcm92aWRlZCBrZXkuIFlvdSBjYW4gdXNlIGRvdFxuICAgKiBub3RhdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkcyBpbiB0aGUgaW5jbHVkZWQgb2JqZWN0IGFyZSBhbHNvIGZldGNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgQXJyYXk8c3RyaW5nPj59IGtleXMgVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBmZXRjaFxuICAgKiAgICAgY29tcGxldGVzLlxuICAgKi9cbiAgZmV0Y2hXaXRoSW5jbHVkZShrZXlzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5pbmNsdWRlID0ga2V5cztcbiAgICByZXR1cm4gdGhpcy5mZXRjaChvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGlzIG9iamVjdCB0byB0aGUgc2VydmVyIGF0IHNvbWUgdW5zcGVjaWZpZWQgdGltZSBpbiB0aGUgZnV0dXJlLFxuICAgKiBldmVuIGlmIFBhcnNlIGlzIGN1cnJlbnRseSBpbmFjY2Vzc2libGUuXG4gICAqXG4gICAqIFVzZSB0aGlzIHdoZW4geW91IG1heSBub3QgaGF2ZSBhIHNvbGlkIG5ldHdvcmsgY29ubmVjdGlvbiwgYW5kIGRvbid0IG5lZWQgdG8ga25vdyB3aGVuIHRoZSBzYXZlIGNvbXBsZXRlcy5cbiAgICogSWYgdGhlcmUgaXMgc29tZSBwcm9ibGVtIHdpdGggdGhlIG9iamVjdCBzdWNoIHRoYXQgaXQgY2FuJ3QgYmUgc2F2ZWQsIGl0IHdpbGwgYmUgc2lsZW50bHkgZGlzY2FyZGVkLlxuICAgKlxuICAgKiBPYmplY3RzIHNhdmVkIHdpdGggdGhpcyBtZXRob2Qgd2lsbCBiZSBzdG9yZWQgbG9jYWxseSBpbiBhbiBvbi1kaXNrIGNhY2hlIHVudGlsIHRoZXkgY2FuIGJlIGRlbGl2ZXJlZCB0byBQYXJzZS5cbiAgICogVGhleSB3aWxsIGJlIHNlbnQgaW1tZWRpYXRlbHkgaWYgcG9zc2libGUuIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIHNlbnQgdGhlIG5leHQgdGltZSBhIG5ldHdvcmsgY29ubmVjdGlvbiBpc1xuICAgKiBhdmFpbGFibGUuIE9iamVjdHMgc2F2ZWQgdGhpcyB3YXkgd2lsbCBwZXJzaXN0IGV2ZW4gYWZ0ZXIgdGhlIGFwcCBpcyBjbG9zZWQsIGluIHdoaWNoIGNhc2UgdGhleSB3aWxsIGJlIHNlbnQgdGhlXG4gICAqIG5leHQgdGltZSB0aGUgYXBwIGlzIG9wZW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBVc2VkIHRvIHBhc3Mgb3B0aW9uIHBhcmFtZXRlcnMgdG8gbWV0aG9kIGlmIGFyZzEgYW5kIGFyZzIgd2VyZSBib3RoIHBhc3NlZCBhcyBzdHJpbmdzLlxuICAgKiBWYWxpZCBvcHRpb25zIGFyZTpcbiAgICogPHVsPlxuICAgKiA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPGxpPmNhc2NhZGVTYXZlOiBJZiBgZmFsc2VgLCBuZXN0ZWQgb2JqZWN0cyB3aWxsIG5vdCBiZSBzYXZlZCAoZGVmYXVsdCBpcyBgdHJ1ZWApLlxuICAgKiA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVTYXZlYCBhbmQgYGFmdGVyU2F2ZWAgdHJpZ2dlcnMuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgc2F2ZVxuICAgKiBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBzYXZlRXZlbnR1YWxseShvcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZShudWxsLCBvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlID09PSBfUGFyc2VFcnJvci5kZWZhdWx0LkNPTk5FQ1RJT05fRkFJTEVEKSB7XG4gICAgICAgIGF3YWl0IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50dWFsbHlRdWV1ZSgpLnNhdmUodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50dWFsbHlRdWV1ZSgpLnBvbGwoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgaGFzaCBvZiBtb2RlbCBhdHRyaWJ1dGVzLCBhbmQgc2F2ZSB0aGUgbW9kZWwgdG8gdGhlIHNlcnZlci5cbiAgICogdXBkYXRlZEF0IHdpbGwgYmUgdXBkYXRlZCB3aGVuIHRoZSByZXF1ZXN0IHJldHVybnMuXG4gICAqIFlvdSBjYW4gZWl0aGVyIGNhbGwgaXQgYXM6PHByZT5cbiAgICogb2JqZWN0LnNhdmUoKTs8L3ByZT5cbiAgICogb3I8cHJlPlxuICAgKiBvYmplY3Quc2F2ZShhdHRycyk7PC9wcmU+XG4gICAqIG9yPHByZT5cbiAgICogb2JqZWN0LnNhdmUobnVsbCwgb3B0aW9ucyk7PC9wcmU+XG4gICAqIG9yPHByZT5cbiAgICogb2JqZWN0LnNhdmUoYXR0cnMsIG9wdGlvbnMpOzwvcHJlPlxuICAgKiBvcjxwcmU+XG4gICAqIG9iamVjdC5zYXZlKGtleSwgdmFsdWUpOzwvcHJlPlxuICAgKiBvcjxwcmU+XG4gICAqIG9iamVjdC5zYXZlKGtleSwgdmFsdWUsIG9wdGlvbnMpOzwvcHJlPlxuICAgKlxuICAgKiBFeGFtcGxlIDE6IDxwcmU+XG4gICAqIGdhbWVUdXJuLnNhdmUoe1xuICAgKiBwbGF5ZXI6IFwiSmFrZSBDdXR0ZXJcIixcbiAgICogZGljZVJvbGw6IDJcbiAgICogfSkudGhlbihmdW5jdGlvbihnYW1lVHVybkFnYWluKSB7XG4gICAqIC8vIFRoZSBzYXZlIHdhcyBzdWNjZXNzZnVsLlxuICAgKiB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgKiAvLyBUaGUgc2F2ZSBmYWlsZWQuICBFcnJvciBpcyBhbiBpbnN0YW5jZSBvZiBQYXJzZS5FcnJvci5cbiAgICogfSk7PC9wcmU+XG4gICAqXG4gICAqIEV4YW1wbGUgMjogPHByZT5cbiAgICogZ2FtZVR1cm4uc2F2ZShcInBsYXllclwiLCBcIkpha2UgQ3V0dGVyXCIpOzwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG9iamVjdCB8IG51bGx9IFthcmcxXVxuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqIDxsaT5gT2JqZWN0YCAtIEtleS92YWx1ZSBwYWlycyB0byB1cGRhdGUgb24gdGhlIG9iamVjdC48L2xpPlxuICAgKiA8bGk+YFN0cmluZ2AgS2V5IC0gS2V5IG9mIGF0dHJpYnV0ZSB0byB1cGRhdGUgKHJlcXVpcmVzIGFyZzIgdG8gYWxzbyBiZSBzdHJpbmcpPC9saT5cbiAgICogPGxpPmBudWxsYCAtIFBhc3NpbmcgbnVsbCBmb3IgYXJnMSBhbGxvd3MgeW91IHRvIHNhdmUgdGhlIG9iamVjdCB3aXRoIG9wdGlvbnMgcGFzc2VkIGluIGFyZzIuPC9saT5cbiAgICogPC91bD5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBvYmplY3R9IFthcmcyXVxuICAgKiA8dWw+XG4gICAqIDxsaT5gU3RyaW5nYCBWYWx1ZSAtIElmIGFyZzEgd2FzIHBhc3NlZCBhcyBhIGtleSwgYXJnMiBpcyB0aGUgdmFsdWUgdGhhdCBzaG91bGQgYmUgc2V0IG9uIHRoYXQga2V5LjwvbGk+XG4gICAqIDxsaT5gT2JqZWN0YCBPcHRpb25zIC0gVmFsaWQgb3B0aW9ucyBhcmU6XG4gICAqIDx1bD5cbiAgICogPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPGxpPmNhc2NhZGVTYXZlOiBJZiBgZmFsc2VgLCBuZXN0ZWQgb2JqZWN0cyB3aWxsIG5vdCBiZSBzYXZlZCAoZGVmYXVsdCBpcyBgdHJ1ZWApLlxuICAgKiA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVTYXZlYCBhbmQgYGFmdGVyU2F2ZWAgdHJpZ2dlcnMuXG4gICAqIDwvdWw+XG4gICAqIDwvbGk+XG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnM11cbiAgICogVXNlZCB0byBwYXNzIG9wdGlvbiBwYXJhbWV0ZXJzIHRvIG1ldGhvZCBpZiBhcmcxIGFuZCBhcmcyIHdlcmUgYm90aCBwYXNzZWQgYXMgc3RyaW5ncy5cbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6XG4gICAqIDx1bD5cbiAgICogPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPGxpPmNhc2NhZGVTYXZlOiBJZiBgZmFsc2VgLCBuZXN0ZWQgb2JqZWN0cyB3aWxsIG5vdCBiZSBzYXZlZCAoZGVmYXVsdCBpcyBgdHJ1ZWApLlxuICAgKiA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVTYXZlYCBhbmQgYGFmdGVyU2F2ZWAgdHJpZ2dlcnMuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgc2F2ZVxuICAgKiBjb21wbGV0ZXMuXG4gICAqL1xuICBzYXZlKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBsZXQgYXR0cnM7XG4gICAgbGV0IG9wdGlvbnM7XG4gICAgaWYgKHR5cGVvZiBhcmcxID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgYXJnMSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGF0dHJzID0gYXJnMTtcbiAgICAgIGlmICh0eXBlb2YgYXJnMiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IGFyZzI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dHJzID0ge307XG4gICAgICBhdHRyc1thcmcxXSA9IGFyZzI7XG4gICAgICBvcHRpb25zID0gYXJnMztcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKGF0dHJzKSB7XG4gICAgICBsZXQgdmFsaWRhdGlvbkVycm9yO1xuICAgICAgb3B0aW9ucy5lcnJvciA9IChfLCB2YWxpZGF0aW9uKSA9PiB7XG4gICAgICAgIHZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRpb247XG4gICAgICB9O1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuc2V0KGF0dHJzLCBvcHRpb25zKTtcbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QodmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2F2ZU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHNhdmVPcHRpb25zLnVzZU1hc3RlcktleSA9ICEhb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSAmJiB0eXBlb2Ygb3B0aW9ucy5zZXNzaW9uVG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICBzYXZlT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2luc3RhbGxhdGlvbklkJykgJiYgdHlwZW9mIG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzYXZlT3B0aW9ucy5pbnN0YWxsYXRpb25JZCA9IG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHNhdmVPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdW5zYXZlZCA9IG9wdGlvbnMuY2FzY2FkZVNhdmUgIT09IGZhbHNlID8gKDAsIF91bnNhdmVkQ2hpbGRyZW4uZGVmYXVsdCkodGhpcykgOiBudWxsO1xuICAgIHJldHVybiBjb250cm9sbGVyLnNhdmUodW5zYXZlZCwgc2F2ZU9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuc2F2ZSh0aGlzLCBzYXZlT3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGlzIG9iamVjdCBmcm9tIHRoZSBzZXJ2ZXIgYXQgc29tZSB1bnNwZWNpZmllZCB0aW1lIGluIHRoZSBmdXR1cmUsXG4gICAqIGV2ZW4gaWYgUGFyc2UgaXMgY3VycmVudGx5IGluYWNjZXNzaWJsZS5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB5b3UgbWF5IG5vdCBoYXZlIGEgc29saWQgbmV0d29yayBjb25uZWN0aW9uLFxuICAgKiBhbmQgZG9uJ3QgbmVlZCB0byBrbm93IHdoZW4gdGhlIGRlbGV0ZSBjb21wbGV0ZXMuIElmIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSB3aXRoIHRoZSBvYmplY3RcbiAgICogc3VjaCB0aGF0IGl0IGNhbid0IGJlIGRlbGV0ZWQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgc2lsZW50bHkgZGlzY2FyZGVkLlxuICAgKlxuICAgKiBEZWxldGUgaW5zdHJ1Y3Rpb25zIG1hZGUgd2l0aCB0aGlzIG1ldGhvZCB3aWxsIGJlIHN0b3JlZCBsb2NhbGx5IGluIGFuIG9uLWRpc2sgY2FjaGUgdW50aWwgdGhleSBjYW4gYmUgdHJhbnNtaXR0ZWRcbiAgICogdG8gUGFyc2UuIFRoZXkgd2lsbCBiZSBzZW50IGltbWVkaWF0ZWx5IGlmIHBvc3NpYmxlLiBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSBzZW50IHRoZSBuZXh0IHRpbWUgYSBuZXR3b3JrIGNvbm5lY3Rpb25cbiAgICogaXMgYXZhaWxhYmxlLiBEZWxldGUgcmVxdWVzdHMgd2lsbCBwZXJzaXN0IGV2ZW4gYWZ0ZXIgdGhlIGFwcCBpcyBjbG9zZWQsIGluIHdoaWNoIGNhc2UgdGhleSB3aWxsIGJlIHNlbnQgdGhlXG4gICAqIG5leHQgdGltZSB0aGUgYXBwIGlzIG9wZW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRGVsZXRlYCBhbmQgYGFmdGVyRGVsZXRlYCB0cmlnZ2Vycy5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBkZXN0cm95XG4gICAqICAgICBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBkZXN0cm95RXZlbnR1YWxseShvcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveShvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlID09PSBfUGFyc2VFcnJvci5kZWZhdWx0LkNPTk5FQ1RJT05fRkFJTEVEKSB7XG4gICAgICAgIGF3YWl0IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50dWFsbHlRdWV1ZSgpLmRlc3Ryb3kodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50dWFsbHlRdWV1ZSgpLnBvbGwoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSB0aGlzIG1vZGVsIG9uIHRoZSBzZXJ2ZXIgaWYgaXQgd2FzIGFscmVhZHkgcGVyc2lzdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVEZWxldGVgIGFuZCBgYWZ0ZXJEZWxldGVgIHRyaWdnZXJzLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIGRlc3Ryb3lcbiAgICogICAgIGNvbXBsZXRlcy5cbiAgICovXG4gIGRlc3Ryb3kob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGRlc3Ryb3lPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBkZXN0cm95T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBkZXN0cm95T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZGVzdHJveU9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCkuZGVzdHJveSh0aGlzLCBkZXN0cm95T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgc3RvcmVzIHRoZSBvYmplY3QgYW5kIGV2ZXJ5IG9iamVjdCBpdCBwb2ludHMgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSxcbiAgICogcmVjdXJzaXZlbHksIHVzaW5nIGEgZGVmYXVsdCBwaW4gbmFtZTogX2RlZmF1bHQuXG4gICAqXG4gICAqIElmIHRob3NlIG90aGVyIG9iamVjdHMgaGF2ZSBub3QgYmVlbiBmZXRjaGVkIGZyb20gUGFyc2UsIHRoZXkgd2lsbCBub3QgYmUgc3RvcmVkLlxuICAgKiBIb3dldmVyLCBpZiB0aGV5IGhhdmUgY2hhbmdlZCBkYXRhLCBhbGwgdGhlIGNoYW5nZXMgd2lsbCBiZSByZXRhaW5lZC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgb2JqZWN0LnBpbigpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogVG8gcmV0cmlldmUgb2JqZWN0OlxuICAgKiA8Y29kZT5xdWVyeS5mcm9tTG9jYWxEYXRhc3RvcmUoKTwvY29kZT4gb3IgPGNvZGU+cXVlcnkuZnJvbVBpbigpPC9jb2RlPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHBpbiBjb21wbGV0ZXMuXG4gICAqL1xuICBwaW4oKSB7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LnBpbkFsbFdpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOLCBbdGhpc10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgdGhlIG9iamVjdCBhbmQgZXZlcnkgb2JqZWN0IGl0IHBvaW50cyB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLFxuICAgKiByZWN1cnNpdmVseSwgdXNpbmcgYSBkZWZhdWx0IHBpbiBuYW1lOiBfZGVmYXVsdC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgb2JqZWN0LnVuUGluKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVuUGluIGNvbXBsZXRlcy5cbiAgICovXG4gIHVuUGluKCkge1xuICAgIHJldHVybiBQYXJzZU9iamVjdC51blBpbkFsbFdpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOLCBbdGhpc10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJldHVybnMgaWYgdGhlIG9iamVjdCBpcyBwaW5uZWRcbiAgICpcbiAgICogPHByZT5cbiAgICogY29uc3QgaXNQaW5uZWQgPSBhd2FpdCBvYmplY3QuaXNQaW5uZWQoKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIGJvb2xlYW4gcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBpZiBvYmplY3QgaXMgcGlubmVkLlxuICAgKi9cbiAgYXN5bmMgaXNQaW5uZWQoKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gbG9jYWxEYXRhc3RvcmUuZ2V0S2V5Rm9yT2JqZWN0KHRoaXMpO1xuICAgIGNvbnN0IHBpbiA9IGF3YWl0IGxvY2FsRGF0YXN0b3JlLmZyb21QaW5XaXRoTmFtZShvYmplY3RLZXkpO1xuICAgIHJldHVybiBwaW4ubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSBzdG9yZXMgdGhlIG9iamVjdHMgYW5kIGV2ZXJ5IG9iamVjdCB0aGV5IHBvaW50IHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsIHJlY3Vyc2l2ZWx5LlxuICAgKlxuICAgKiBJZiB0aG9zZSBvdGhlciBvYmplY3RzIGhhdmUgbm90IGJlZW4gZmV0Y2hlZCBmcm9tIFBhcnNlLCB0aGV5IHdpbGwgbm90IGJlIHN0b3JlZC5cbiAgICogSG93ZXZlciwgaWYgdGhleSBoYXZlIGNoYW5nZWQgZGF0YSwgYWxsIHRoZSBjaGFuZ2VzIHdpbGwgYmUgcmV0YWluZWQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IG9iamVjdC5waW5XaXRoTmFtZShuYW1lKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIFRvIHJldHJpZXZlIG9iamVjdDpcbiAgICogPGNvZGU+cXVlcnkuZnJvbUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+IG9yIDxjb2RlPnF1ZXJ5LmZyb21QaW5XaXRoTmFtZShuYW1lKTwvY29kZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBQaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgcGluIGNvbXBsZXRlcy5cbiAgICovXG4gIHBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gUGFyc2VPYmplY3QucGluQWxsV2l0aE5hbWUobmFtZSwgW3RoaXNdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZW1vdmVzIHRoZSBvYmplY3QgYW5kIGV2ZXJ5IG9iamVjdCBpdCBwb2ludHMgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSwgcmVjdXJzaXZlbHkuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IG9iamVjdC51blBpbldpdGhOYW1lKG5hbWUpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBQaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgdW5QaW4gY29tcGxldGVzLlxuICAgKi9cbiAgdW5QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LnVuUGluQWxsV2l0aE5hbWUobmFtZSwgW3RoaXNdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSBsb2FkcyBkYXRhIGZyb20gdGhlIGxvY2FsIGRhdGFzdG9yZSBpbnRvIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBvYmplY3QuZmV0Y2hGcm9tTG9jYWxEYXRhc3RvcmUoKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIFlvdSBjYW4gY3JlYXRlIGFuIHVuZmV0Y2hlZCBwb2ludGVyIHdpdGggPGNvZGU+UGFyc2UuT2JqZWN0LmNyZWF0ZVdpdGhvdXREYXRhKCk8L2NvZGU+XG4gICAqIGFuZCB0aGVuIGNhbGwgPGNvZGU+ZmV0Y2hGcm9tTG9jYWxEYXRhc3RvcmUoKTwvY29kZT4gb24gaXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgZmV0Y2ggY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hGcm9tTG9jYWxEYXRhc3RvcmUoKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gbG9jYWxEYXRhc3RvcmUuZ2V0S2V5Rm9yT2JqZWN0KHRoaXMpO1xuICAgIGNvbnN0IHBpbm5lZCA9IGF3YWl0IGxvY2FsRGF0YXN0b3JlLl9zZXJpYWxpemVPYmplY3Qob2JqZWN0S2V5KTtcbiAgICBpZiAoIXBpbm5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmV0Y2ggYW4gdW5zYXZlZCBQYXJzZU9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBQYXJzZU9iamVjdC5mcm9tSlNPTihwaW5uZWQpO1xuICAgIHRoaXMuX2ZpbmlzaEZldGNoKHJlc3VsdC50b0pTT04oKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiBTdGF0aWMgbWV0aG9kcyAqL1xuXG4gIHN0YXRpYyBfY2xlYXJBbGxTdGF0ZSgpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBzdGF0ZUNvbnRyb2xsZXIuY2xlYXJBbGxTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGdpdmVuIGxpc3Qgb2YgUGFyc2UuT2JqZWN0LlxuICAgKiBJZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWQsIHN0b3BzIGFuZCBjYWxscyB0aGUgZXJyb3IgaGFuZGxlci5cbiAgICpcbiAgICogPHByZT5cbiAgICogICBQYXJzZS5PYmplY3QuZmV0Y2hBbGwoW29iamVjdDEsIG9iamVjdDIsIC4uLl0pXG4gICAqICAgIC50aGVuKChsaXN0KSA9PiB7XG4gICAqICAgICAgLy8gQWxsIHRoZSBvYmplY3RzIHdlcmUgZmV0Y2hlZC5cbiAgICogICAgfSwgKGVycm9yKSA9PiB7XG4gICAqICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZmV0Y2hpbmcgb25lIG9mIHRoZSBvYmplY3RzLlxuICAgKiAgICB9KTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5pbmNsdWRlOiBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGluY2x1ZGUuIENhbiBiZSBhIHN0cmluZywgYW4gYXJyYXkgb2Ygc3RyaW5ncyxcbiAgICogICAgICAgb3IgYW4gYXJyYXkgb2YgYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICogPC91bD5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0W119XG4gICAqL1xuICBzdGF0aWMgZmV0Y2hBbGwobGlzdCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjb25zdCBxdWVyeU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHF1ZXJ5T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBxdWVyeU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdpbmNsdWRlJykpIHtcbiAgICAgIHF1ZXJ5T3B0aW9ucy5pbmNsdWRlID0gUGFyc2VPYmplY3QuaGFuZGxlSW5jbHVkZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCkuZmV0Y2gobGlzdCwgdHJ1ZSwgcXVlcnlPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIFBhcnNlLk9iamVjdC5cbiAgICpcbiAgICogSW5jbHVkZXMgbmVzdGVkIFBhcnNlLk9iamVjdHMgZm9yIHRoZSBwcm92aWRlZCBrZXkuIFlvdSBjYW4gdXNlIGRvdFxuICAgKiBub3RhdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkcyBpbiB0aGUgaW5jbHVkZWQgb2JqZWN0IGFyZSBhbHNvIGZldGNoZWQuXG4gICAqXG4gICAqIElmIGFueSBlcnJvciBpcyBlbmNvdW50ZXJlZCwgc3RvcHMgYW5kIGNhbGxzIHRoZSBlcnJvciBoYW5kbGVyLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiAgIFBhcnNlLk9iamVjdC5mZXRjaEFsbFdpdGhJbmNsdWRlKFtvYmplY3QxLCBvYmplY3QyLCAuLi5dLCBbcG9pbnRlcjEsIHBvaW50ZXIyLCAuLi5dKVxuICAgKiAgICAudGhlbigobGlzdCkgPT4ge1xuICAgKiAgICAgIC8vIEFsbCB0aGUgb2JqZWN0cyB3ZXJlIGZldGNoZWQuXG4gICAqICAgIH0sIChlcnJvcikgPT4ge1xuICAgKiAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGZldGNoaW5nIG9uZSBvZiB0aGUgb2JqZWN0cy5cbiAgICogICAgfSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBsaXN0IEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IEFycmF5PHN0cmluZz4+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdFtdfVxuICAgKi9cbiAgc3RhdGljIGZldGNoQWxsV2l0aEluY2x1ZGUobGlzdCwga2V5cywgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuaW5jbHVkZSA9IGtleXM7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LmZldGNoQWxsKGxpc3QsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGdpdmVuIGxpc3Qgb2YgUGFyc2UuT2JqZWN0IGlmIG5lZWRlZC5cbiAgICogSWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkLCBzdG9wcyBhbmQgY2FsbHMgdGhlIGVycm9yIGhhbmRsZXIuXG4gICAqXG4gICAqIEluY2x1ZGVzIG5lc3RlZCBQYXJzZS5PYmplY3RzIGZvciB0aGUgcHJvdmlkZWQga2V5LiBZb3UgY2FuIHVzZSBkb3RcbiAgICogbm90YXRpb24gdG8gc3BlY2lmeSB3aGljaCBmaWVsZHMgaW4gdGhlIGluY2x1ZGVkIG9iamVjdCBhcmUgYWxzbyBmZXRjaGVkLlxuICAgKlxuICAgKiBJZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWQsIHN0b3BzIGFuZCBjYWxscyB0aGUgZXJyb3IgaGFuZGxlci5cbiAgICpcbiAgICogPHByZT5cbiAgICogICBQYXJzZS5PYmplY3QuZmV0Y2hBbGxJZk5lZWRlZFdpdGhJbmNsdWRlKFtvYmplY3QxLCBvYmplY3QyLCAuLi5dLCBbcG9pbnRlcjEsIHBvaW50ZXIyLCAuLi5dKVxuICAgKiAgICAudGhlbigobGlzdCkgPT4ge1xuICAgKiAgICAgIC8vIEFsbCB0aGUgb2JqZWN0cyB3ZXJlIGZldGNoZWQuXG4gICAqICAgIH0sIChlcnJvcikgPT4ge1xuICAgKiAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGZldGNoaW5nIG9uZSBvZiB0aGUgb2JqZWN0cy5cbiAgICogICAgfSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBsaXN0IEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IEFycmF5PHN0cmluZz4+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdFtdfVxuICAgKi9cbiAgc3RhdGljIGZldGNoQWxsSWZOZWVkZWRXaXRoSW5jbHVkZShsaXN0LCBrZXlzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5pbmNsdWRlID0ga2V5cztcbiAgICByZXR1cm4gUGFyc2VPYmplY3QuZmV0Y2hBbGxJZk5lZWRlZChsaXN0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIFBhcnNlLk9iamVjdCBpZiBuZWVkZWQuXG4gICAqIElmIGFueSBlcnJvciBpcyBlbmNvdW50ZXJlZCwgc3RvcHMgYW5kIGNhbGxzIHRoZSBlcnJvciBoYW5kbGVyLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiAgIFBhcnNlLk9iamVjdC5mZXRjaEFsbElmTmVlZGVkKFtvYmplY3QxLCAuLi5dKVxuICAgKiAgICAudGhlbigobGlzdCkgPT4ge1xuICAgKiAgICAgIC8vIE9iamVjdHMgd2VyZSBmZXRjaGVkIGFuZCB1cGRhdGVkLlxuICAgKiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICogICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBmZXRjaGluZyBvbmUgb2YgdGhlIG9iamVjdHMuXG4gICAqICAgIH0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gbGlzdCBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0W119XG4gICAqL1xuICBzdGF0aWMgZmV0Y2hBbGxJZk5lZWRlZChsaXN0LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcXVlcnlPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBxdWVyeU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgcXVlcnlPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaW5jbHVkZScpKSB7XG4gICAgICBxdWVyeU9wdGlvbnMuaW5jbHVkZSA9IFBhcnNlT2JqZWN0LmhhbmRsZUluY2x1ZGVPcHRpb25zKG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpLmZldGNoKGxpc3QsIGZhbHNlLCBxdWVyeU9wdGlvbnMpO1xuICB9XG4gIHN0YXRpYyBoYW5kbGVJbmNsdWRlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgbGV0IGluY2x1ZGUgPSBbXTtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9wdGlvbnMuaW5jbHVkZSkpIHtcbiAgICAgIHZhciBfY29udGV4dDM7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQzID0gb3B0aW9ucy5pbmNsdWRlKS5jYWxsKF9jb250ZXh0Mywga2V5ID0+IHtcbiAgICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgICAgaW5jbHVkZSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKGluY2x1ZGUpLmNhbGwoaW5jbHVkZSwga2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmNsdWRlLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluY2x1ZGUucHVzaChvcHRpb25zLmluY2x1ZGUpO1xuICAgIH1cbiAgICByZXR1cm4gaW5jbHVkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IHRoZSBnaXZlbiBsaXN0IG9mIG1vZGVscyBvbiB0aGUgc2VydmVyIGlmIGl0IHdhcyBhbHJlYWR5IHBlcnNpc3RlZC5cbiAgICpcbiAgICogPHA+VW5saWtlIHNhdmVBbGwsIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBkZWxldGluZyBhbiBpbmRpdmlkdWFsIG1vZGVsLFxuICAgKiB0aGlzIG1ldGhvZCB3aWxsIGNvbnRpbnVlIHRyeWluZyB0byBkZWxldGUgdGhlIHJlc3Qgb2YgdGhlIG1vZGVscyBpZlxuICAgKiBwb3NzaWJsZSwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIGEgZmF0YWwgZXJyb3IgbGlrZSBhIGNvbm5lY3Rpb24gZXJyb3IuXG4gICAqXG4gICAqIDxwPkluIHBhcnRpY3VsYXIsIHRoZSBQYXJzZS5FcnJvciBvYmplY3QgcmV0dXJuZWQgaW4gdGhlIGNhc2Ugb2YgZXJyb3IgbWF5XG4gICAqIGJlIG9uZSBvZiB0d28gdHlwZXM6XG4gICAqXG4gICAqIDx1bD5cbiAgICogPGxpPkEgUGFyc2UuRXJyb3IuQUdHUkVHQVRFX0VSUk9SLiBUaGlzIG9iamVjdCdzIFwiZXJyb3JzXCIgcHJvcGVydHkgaXMgYW5cbiAgICogYXJyYXkgb2Ygb3RoZXIgUGFyc2UuRXJyb3Igb2JqZWN0cy4gRWFjaCBlcnJvciBvYmplY3QgaW4gdGhpcyBhcnJheVxuICAgKiBoYXMgYW4gXCJvYmplY3RcIiBwcm9wZXJ0eSB0aGF0IHJlZmVyZW5jZXMgdGhlIG9iamVjdCB0aGF0IGNvdWxkIG5vdCBiZVxuICAgKiBkZWxldGVkIChmb3IgaW5zdGFuY2UsIGJlY2F1c2UgdGhhdCBvYmplY3QgY291bGQgbm90IGJlIGZvdW5kKS48L2xpPlxuICAgKiA8bGk+QSBub24tYWdncmVnYXRlIFBhcnNlLkVycm9yLiBUaGlzIGluZGljYXRlcyBhIHNlcmlvdXMgZXJyb3IgdGhhdFxuICAgKiBjYXVzZWQgdGhlIGRlbGV0ZSBvcGVyYXRpb24gdG8gYmUgYWJvcnRlZCBwYXJ0d2F5IHRocm91Z2ggKGZvclxuICAgKiBpbnN0YW5jZSwgYSBjb25uZWN0aW9uIGZhaWx1cmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZGVsZXRlKS48L2xpPlxuICAgKiA8L3VsPlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBQYXJzZS5PYmplY3QuZGVzdHJveUFsbChbb2JqZWN0MSwgb2JqZWN0MiwgLi4uXSlcbiAgICogLnRoZW4oKGxpc3QpID0+IHtcbiAgICogLy8gQWxsIHRoZSBvYmplY3RzIHdlcmUgZGVsZXRlZC5cbiAgICogfSwgKGVycm9yKSA9PiB7XG4gICAqIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGRlbGV0aW5nIG9uZSBvciBtb3JlIG9mIHRoZSBvYmplY3RzLlxuICAgKiAvLyBJZiB0aGlzIGlzIGFuIGFnZ3JlZ2F0ZSBlcnJvciwgdGhlbiB3ZSBjYW4gaW5zcGVjdCBlYWNoIGVycm9yXG4gICAqIC8vIG9iamVjdCBpbmRpdmlkdWFsbHkgdG8gZGV0ZXJtaW5lIHRoZSByZWFzb24gd2h5IGEgcGFydGljdWxhclxuICAgKiAvLyBvYmplY3Qgd2FzIG5vdCBkZWxldGVkLlxuICAgKiBpZiAoZXJyb3IuY29kZSA9PT0gUGFyc2UuRXJyb3IuQUdHUkVHQVRFX0VSUk9SKSB7XG4gICAqIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3IuZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAqIGNvbnNvbGUubG9nKFwiQ291bGRuJ3QgZGVsZXRlIFwiICsgZXJyb3IuZXJyb3JzW2ldLm9iamVjdC5pZCArXG4gICAqIFwiZHVlIHRvIFwiICsgZXJyb3IuZXJyb3JzW2ldLm1lc3NhZ2UpO1xuICAgKiB9XG4gICAqIH0gZWxzZSB7XG4gICAqIGNvbnNvbGUubG9nKFwiRGVsZXRlIGFib3J0ZWQgYmVjYXVzZSBvZiBcIiArIGVycm9yLm1lc3NhZ2UpO1xuICAgKiB9XG4gICAqIH0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gbGlzdCBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIGRlc3Ryb3lBbGxcbiAgICogY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGRlc3Ryb3lBbGwobGlzdCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjb25zdCBkZXN0cm95T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZGVzdHJveU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZGVzdHJveU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdiYXRjaFNpemUnKSAmJiB0eXBlb2Ygb3B0aW9ucy5iYXRjaFNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICBkZXN0cm95T3B0aW9ucy5iYXRjaFNpemUgPSBvcHRpb25zLmJhdGNoU2l6ZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZGVzdHJveU9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdENvbnRyb2xsZXIoKS5kZXN0cm95KGxpc3QsIGRlc3Ryb3lPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgZ2l2ZW4gbGlzdCBvZiBQYXJzZS5PYmplY3QuXG4gICAqIElmIGFueSBlcnJvciBpcyBlbmNvdW50ZXJlZCwgc3RvcHMgYW5kIGNhbGxzIHRoZSBlcnJvciBoYW5kbGVyLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBQYXJzZS5PYmplY3Quc2F2ZUFsbChbb2JqZWN0MSwgb2JqZWN0MiwgLi4uXSlcbiAgICogLnRoZW4oKGxpc3QpID0+IHtcbiAgICogLy8gQWxsIHRoZSBvYmplY3RzIHdlcmUgc2F2ZWQuXG4gICAqIH0sIChlcnJvcikgPT4ge1xuICAgKiAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgb25lIG9mIHRoZSBvYmplY3RzLlxuICAgKiB9KTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdFtdfVxuICAgKi9cbiAgc3RhdGljIHNhdmVBbGwobGlzdCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjb25zdCBzYXZlT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgc2F2ZU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgc2F2ZU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdiYXRjaFNpemUnKSAmJiB0eXBlb2Ygb3B0aW9ucy5iYXRjaFNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICBzYXZlT3B0aW9ucy5iYXRjaFNpemUgPSBvcHRpb25zLmJhdGNoU2l6ZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgc2F2ZU9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdENvbnRyb2xsZXIoKS5zYXZlKGxpc3QsIHNhdmVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcmVmZXJlbmNlIHRvIGEgc3ViY2xhc3Mgb2YgUGFyc2UuT2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkLiBUaGlzXG4gICAqIGRvZXMgbm90IGV4aXN0IG9uIFBhcnNlLk9iamVjdCwgb25seSBvbiBzdWJjbGFzc2VzLlxuICAgKlxuICAgKiA8cD5BIHNob3J0Y3V0IGZvcjogPHByZT5cbiAgICogIHZhciBGb28gPSBQYXJzZS5PYmplY3QuZXh0ZW5kKFwiRm9vXCIpO1xuICAgKiAgdmFyIHBvaW50ZXJUb0ZvbyA9IG5ldyBGb28oKTtcbiAgICogIHBvaW50ZXJUb0Zvby5pZCA9IFwibXlPYmplY3RJZFwiO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgb2JqZWN0IHRvIGNyZWF0ZSBhIHJlZmVyZW5jZSB0by5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBBIFBhcnNlLk9iamVjdCByZWZlcmVuY2UuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlV2l0aG91dERhdGEoaWQpIHtcbiAgICBjb25zdCBvYmogPSBuZXcgdGhpcygpO1xuICAgIG9iai5pZCA9IGlkO1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIFBhcnNlIE9iamVjdCBmcm9tIGEgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb24gVGhlIEpTT04gbWFwIG9mIHRoZSBPYmplY3QncyBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3ZlcnJpZGUgSW4gc2luZ2xlIGluc3RhbmNlIG1vZGUsIGFsbCBvbGQgc2VydmVyIGRhdGFcbiAgICogICBpcyBvdmVyd3JpdHRlbiBpZiB0aGlzIGlzIHNldCB0byB0cnVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlydHkgV2hldGhlciB0aGUgUGFyc2UuT2JqZWN0IHNob3VsZCBzZXQgSlNPTiBrZXlzIHRvIGRpcnR5XG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gQSBQYXJzZS5PYmplY3QgcmVmZXJlbmNlXG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oanNvbiwgb3ZlcnJpZGUsIGRpcnR5KSB7XG4gICAgaWYgKCFqc29uLmNsYXNzTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGFuIG9iamVjdCB3aXRob3V0IGEgY2xhc3NOYW1lJyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gY2xhc3NNYXBbanNvbi5jbGFzc05hbWVdO1xuICAgIGNvbnN0IG8gPSBjb25zdHJ1Y3RvciA/IG5ldyBjb25zdHJ1Y3Rvcihqc29uLmNsYXNzTmFtZSkgOiBuZXcgUGFyc2VPYmplY3QoanNvbi5jbGFzc05hbWUpO1xuICAgIGNvbnN0IG90aGVyQXR0cmlidXRlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBqc29uKSB7XG4gICAgICBpZiAoYXR0ciAhPT0gJ2NsYXNzTmFtZScgJiYgYXR0ciAhPT0gJ19fdHlwZScpIHtcbiAgICAgICAgb3RoZXJBdHRyaWJ1dGVzW2F0dHJdID0ganNvblthdHRyXTtcbiAgICAgICAgaWYgKGRpcnR5KSB7XG4gICAgICAgICAgby5zZXQoYXR0ciwganNvblthdHRyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG92ZXJyaWRlKSB7XG4gICAgICAvLyBpZCBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIGNsZWFyU2VydmVyRGF0YSBjYW4gd29ya1xuICAgICAgaWYgKG90aGVyQXR0cmlidXRlcy5vYmplY3RJZCkge1xuICAgICAgICBvLmlkID0gb3RoZXJBdHRyaWJ1dGVzLm9iamVjdElkO1xuICAgICAgfVxuICAgICAgbGV0IHByZXNlcnZlZCA9IG51bGw7XG4gICAgICBpZiAodHlwZW9mIG8uX3ByZXNlcnZlRmllbGRzT25GZXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcmVzZXJ2ZWQgPSBvLl9wcmVzZXJ2ZUZpZWxkc09uRmV0Y2goKTtcbiAgICAgIH1cbiAgICAgIG8uX2NsZWFyU2VydmVyRGF0YSgpO1xuICAgICAgaWYgKHByZXNlcnZlZCkge1xuICAgICAgICBvLl9maW5pc2hGZXRjaChwcmVzZXJ2ZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBvLl9maW5pc2hGZXRjaChvdGhlckF0dHJpYnV0ZXMpO1xuICAgIGlmIChqc29uLm9iamVjdElkKSB7XG4gICAgICBvLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBzdWJjbGFzcyBvZiBQYXJzZS5PYmplY3Qgd2l0aCBhIHNwZWNpZmljIGNsYXNzIG5hbWUuXG4gICAqIFdoZW4gb2JqZWN0cyBvZiB0aGF0IGNsYXNzIGFyZSByZXRyaWV2ZWQgZnJvbSBhIHF1ZXJ5LCB0aGV5IHdpbGwgYmVcbiAgICogaW5zdGFudGlhdGVkIHdpdGggdGhpcyBzdWJjbGFzcy5cbiAgICogVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIHVzaW5nIEVTNiBzdWJjbGFzc2luZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgc3ViY2xhc3NcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgVGhlIHN1YmNsYXNzXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJTdWJjbGFzcyhjbGFzc05hbWUsIGNvbnN0cnVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHZhbGlkIGNsYXNzIG5hbWUuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSBzdWJjbGFzcyBjb25zdHJ1Y3Rvci4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcmVnaXN0ZXIgdGhlIHN1YmNsYXNzIGNvbnN0cnVjdG9yLiAnICsgJ0RpZCB5b3UgYXR0ZW1wdCB0byByZWdpc3RlciBhbiBpbnN0YW5jZSBvZiB0aGUgc3ViY2xhc3M/Jyk7XG4gICAgfVxuICAgIGNsYXNzTWFwW2NsYXNzTmFtZV0gPSBjb25zdHJ1Y3RvcjtcbiAgICBpZiAoIWNvbnN0cnVjdG9yLmNsYXNzTmFtZSkge1xuICAgICAgY29uc3RydWN0b3IuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmVnaXN0ZXJzIGEgc3ViY2xhc3Mgb2YgUGFyc2UuT2JqZWN0IHdpdGggYSBzcGVjaWZpYyBjbGFzcyBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzdWJjbGFzc1xuICAgKi9cbiAgc3RhdGljIHVucmVnaXN0ZXJTdWJjbGFzcyhjbGFzc05hbWUpIHtcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgdmFsaWQgY2xhc3MgbmFtZS4nKTtcbiAgICB9XG4gICAgZGVsZXRlIGNsYXNzTWFwW2NsYXNzTmFtZV07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBzdWJjbGFzcyBvZiBQYXJzZS5PYmplY3QgZm9yIHRoZSBnaXZlbiBQYXJzZSBjbGFzcyBuYW1lLlxuICAgKlxuICAgKiA8cD5FdmVyeSBleHRlbnNpb24gb2YgYSBQYXJzZSBjbGFzcyB3aWxsIGluaGVyaXQgZnJvbSB0aGUgbW9zdCByZWNlbnRcbiAgICogcHJldmlvdXMgZXh0ZW5zaW9uIG9mIHRoYXQgY2xhc3MuIFdoZW4gYSBQYXJzZS5PYmplY3QgaXMgYXV0b21hdGljYWxseVxuICAgKiBjcmVhdGVkIGJ5IHBhcnNpbmcgSlNPTiwgaXQgd2lsbCB1c2UgdGhlIG1vc3QgcmVjZW50IGV4dGVuc2lvbiBvZiB0aGF0XG4gICAqIGNsYXNzLjwvcD5cbiAgICpcbiAgICogPHA+WW91IHNob3VsZCBjYWxsIGVpdGhlcjo8cHJlPlxuICAgKiAgICAgdmFyIE15Q2xhc3MgPSBQYXJzZS5PYmplY3QuZXh0ZW5kKFwiTXlDbGFzc1wiLCB7XG4gICAqICAgICAgICAgPGk+SW5zdGFuY2UgbWV0aG9kczwvaT4sXG4gICAqICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXR0cnMsIG9wdGlvbnMpIHtcbiAgICogICAgICAgICAgICAgdGhpcy5zb21lSW5zdGFuY2VQcm9wZXJ0eSA9IFtdLFxuICAgKiAgICAgICAgICAgICA8aT5PdGhlciBpbnN0YW5jZSBwcm9wZXJ0aWVzPC9pPlxuICAgKiAgICAgICAgIH1cbiAgICogICAgIH0sIHtcbiAgICogICAgICAgICA8aT5DbGFzcyBwcm9wZXJ0aWVzPC9pPlxuICAgKiAgICAgfSk7PC9wcmU+XG4gICAqIG9yLCBmb3IgQmFja2JvbmUgY29tcGF0aWJpbGl0eTo8cHJlPlxuICAgKiAgICAgdmFyIE15Q2xhc3MgPSBQYXJzZS5PYmplY3QuZXh0ZW5kKHtcbiAgICogICAgICAgICBjbGFzc05hbWU6IFwiTXlDbGFzc1wiLFxuICAgKiAgICAgICAgIDxpPkluc3RhbmNlIG1ldGhvZHM8L2k+LFxuICAgKiAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGF0dHJzLCBvcHRpb25zKSB7XG4gICAqICAgICAgICAgICAgIHRoaXMuc29tZUluc3RhbmNlUHJvcGVydHkgPSBbXSxcbiAgICogICAgICAgICAgICAgPGk+T3RoZXIgaW5zdGFuY2UgcHJvcGVydGllczwvaT5cbiAgICogICAgICAgICB9XG4gICAqICAgICB9LCB7XG4gICAqICAgICAgICAgPGk+Q2xhc3MgcHJvcGVydGllczwvaT5cbiAgICogICAgIH0pOzwvcHJlPjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgUGFyc2UgY2xhc3MgYmFja2luZyB0aGlzIG1vZGVsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW3Byb3RvUHJvcHNdIEluc3RhbmNlIHByb3BlcnRpZXMgdG8gYWRkIHRvIGluc3RhbmNlcyBvZiB0aGVcbiAgICogICAgIGNsYXNzIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY2xhc3NQcm9wc10gQ2xhc3MgcHJvcGVydGllcyB0byBhZGQgdGhlIGNsYXNzIHJldHVybmVkIGZyb21cbiAgICogICAgIHRoaXMgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBBIG5ldyBzdWJjbGFzcyBvZiBQYXJzZS5PYmplY3QuXG4gICAqL1xuICBzdGF0aWMgZXh0ZW5kKGNsYXNzTmFtZSwgcHJvdG9Qcm9wcywgY2xhc3NQcm9wcykge1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNsYXNzTmFtZSAmJiB0eXBlb2YgY2xhc3NOYW1lLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFBhcnNlT2JqZWN0LmV4dGVuZChjbGFzc05hbWUuY2xhc3NOYW1lLCBjbGFzc05hbWUsIHByb3RvUHJvcHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFyc2UuT2JqZWN0LmV4dGVuZCdzIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgY2xhc3NOYW1lLlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGFkanVzdGVkQ2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIGlmIChhZGp1c3RlZENsYXNzTmFtZSA9PT0gJ1VzZXInICYmIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnUEVSRk9STV9VU0VSX1JFV1JJVEUnKSkge1xuICAgICAgYWRqdXN0ZWRDbGFzc05hbWUgPSAnX1VzZXInO1xuICAgIH1cbiAgICBsZXQgcGFyZW50UHJvdG8gPSBQYXJzZU9iamVjdC5wcm90b3R5cGU7XG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ19fc3VwZXJfXycpICYmIHRoaXMuX19zdXBlcl9fKSB7XG4gICAgICBwYXJlbnRQcm90byA9IHRoaXMucHJvdG90eXBlO1xuICAgIH1cbiAgICBsZXQgUGFyc2VPYmplY3RTdWJjbGFzcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9IGFkanVzdGVkQ2xhc3NOYW1lO1xuICAgICAgdGhpcy5fb2JqQ291bnQgPSBvYmplY3RDb3VudCsrO1xuICAgICAgLy8gRW5hYmxlIGxlZ2FjeSBpbml0aWFsaXplcnNcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5pbml0aWFsaXplID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGluaXRpYWxpemVyIG9mIHRoaXMuX2luaXRpYWxpemVycykge1xuICAgICAgICAgIGluaXRpYWxpemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoIXRoaXMuc2V0KGF0dHJpYnV0ZXMgfHwge30sIG9wdGlvbnMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIGFuIGludmFsaWQgUGFyc2UgT2JqZWN0XCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoY2xhc3NNYXBbYWRqdXN0ZWRDbGFzc05hbWVdKSB7XG4gICAgICBQYXJzZU9iamVjdFN1YmNsYXNzID0gY2xhc3NNYXBbYWRqdXN0ZWRDbGFzc05hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBQYXJzZU9iamVjdFN1YmNsYXNzLmV4dGVuZCA9IGZ1bmN0aW9uIChuYW1lLCBwcm90b1Byb3BzLCBjbGFzc1Byb3BzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gUGFyc2VPYmplY3QuZXh0ZW5kLmNhbGwoUGFyc2VPYmplY3RTdWJjbGFzcywgbmFtZSwgcHJvdG9Qcm9wcywgY2xhc3NQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhcnNlT2JqZWN0LmV4dGVuZC5jYWxsKFBhcnNlT2JqZWN0U3ViY2xhc3MsIGFkanVzdGVkQ2xhc3NOYW1lLCBuYW1lLCBwcm90b1Byb3BzKTtcbiAgICAgIH07XG4gICAgICBQYXJzZU9iamVjdFN1YmNsYXNzLmNyZWF0ZVdpdGhvdXREYXRhID0gUGFyc2VPYmplY3QuY3JlYXRlV2l0aG91dERhdGE7XG4gICAgICBQYXJzZU9iamVjdFN1YmNsYXNzLmNsYXNzTmFtZSA9IGFkanVzdGVkQ2xhc3NOYW1lO1xuICAgICAgUGFyc2VPYmplY3RTdWJjbGFzcy5fX3N1cGVyX18gPSBwYXJlbnRQcm90bztcbiAgICAgIFBhcnNlT2JqZWN0U3ViY2xhc3MucHJvdG90eXBlID0gKDAsIF9jcmVhdGUuZGVmYXVsdCkocGFyZW50UHJvdG8sIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogUGFyc2VPYmplY3RTdWJjbGFzcyxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChwcm90b1Byb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcHJvdG9Qcm9wcykge1xuICAgICAgICBpZiAocHJvcCA9PT0gJ2luaXRpYWxpemUnKSB7XG4gICAgICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VPYmplY3RTdWJjbGFzcy5wcm90b3R5cGUsICdfaW5pdGlhbGl6ZXJzJywge1xuICAgICAgICAgICAgdmFsdWU6IFsuLi4oUGFyc2VPYmplY3RTdWJjbGFzcy5wcm90b3R5cGUuX2luaXRpYWxpemVycyB8fCBbXSksIHByb3RvUHJvcHNbcHJvcF1dLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wICE9PSAnY2xhc3NOYW1lJykge1xuICAgICAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlT2JqZWN0U3ViY2xhc3MucHJvdG90eXBlLCBwcm9wLCB7XG4gICAgICAgICAgICB2YWx1ZTogcHJvdG9Qcm9wc1twcm9wXSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2xhc3NQcm9wcykge1xuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGNsYXNzUHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjbGFzc05hbWUnKSB7XG4gICAgICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VPYmplY3RTdWJjbGFzcywgcHJvcCwge1xuICAgICAgICAgICAgdmFsdWU6IGNsYXNzUHJvcHNbcHJvcF0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY2xhc3NNYXBbYWRqdXN0ZWRDbGFzc05hbWVdID0gUGFyc2VPYmplY3RTdWJjbGFzcztcbiAgICByZXR1cm4gUGFyc2VPYmplY3RTdWJjbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgc2luZ2xlIGluc3RhbmNlIG9iamVjdHMsIHdoZXJlIGFueSBsb2NhbCBvYmplY3RzIHdpdGggdGhlIHNhbWUgSWRcbiAgICogc2hhcmUgdGhlIHNhbWUgYXR0cmlidXRlcywgYW5kIHN0YXkgc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlci5cbiAgICogVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGluIHNlcnZlciBlbnZpcm9ubWVudHMsIHNpbmNlIGl0IGNhbiBsZWFkIHRvXG4gICAqIHNlY3VyaXR5IGlzc3Vlcy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGVuYWJsZVNpbmdsZUluc3RhbmNlKCkge1xuICAgIHNpbmdsZUluc3RhbmNlID0gdHJ1ZTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoU2luZ2xlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgc2luZ2xlIGluc3RhbmNlIG9iamVjdHMsIHdoZXJlIGFueSBsb2NhbCBvYmplY3RzIHdpdGggdGhlIHNhbWUgSWRcbiAgICogc2hhcmUgdGhlIHNhbWUgYXR0cmlidXRlcywgYW5kIHN0YXkgc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlci5cbiAgICogV2hlbiBkaXNhYmxlZCwgeW91IGNhbiBoYXZlIHR3byBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgb2JqZWN0IGluIG1lbW9yeVxuICAgKiB3aXRob3V0IHRoZW0gc2hhcmluZyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZGlzYWJsZVNpbmdsZUluc3RhbmNlKCkge1xuICAgIHNpbmdsZUluc3RhbmNlID0gZmFsc2U7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKFVuaXF1ZUluc3RhbmNlU3RhdGVDb250cm9sbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSBzdG9yZXMgdGhlIG9iamVjdHMgYW5kIGV2ZXJ5IG9iamVjdCB0aGV5IHBvaW50IHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsXG4gICAqIHJlY3Vyc2l2ZWx5LCB1c2luZyBhIGRlZmF1bHQgcGluIG5hbWU6IF9kZWZhdWx0LlxuICAgKlxuICAgKiBJZiB0aG9zZSBvdGhlciBvYmplY3RzIGhhdmUgbm90IGJlZW4gZmV0Y2hlZCBmcm9tIFBhcnNlLCB0aGV5IHdpbGwgbm90IGJlIHN0b3JlZC5cbiAgICogSG93ZXZlciwgaWYgdGhleSBoYXZlIGNoYW5nZWQgZGF0YSwgYWxsIHRoZSBjaGFuZ2VzIHdpbGwgYmUgcmV0YWluZWQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLk9iamVjdC5waW5BbGwoWy4uLl0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogVG8gcmV0cmlldmUgb2JqZWN0OlxuICAgKiA8Y29kZT5xdWVyeS5mcm9tTG9jYWxEYXRhc3RvcmUoKTwvY29kZT4gb3IgPGNvZGU+cXVlcnkuZnJvbVBpbigpPC9jb2RlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBvYmplY3RzIEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHBpbiBjb21wbGV0ZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBwaW5BbGwob2JqZWN0cykge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBQYXJzZU9iamVjdC5waW5BbGxXaXRoTmFtZShfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiwgb2JqZWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgc3RvcmVzIHRoZSBvYmplY3RzIGFuZCBldmVyeSBvYmplY3QgdGhleSBwb2ludCB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLCByZWN1cnNpdmVseS5cbiAgICpcbiAgICogSWYgdGhvc2Ugb3RoZXIgb2JqZWN0cyBoYXZlIG5vdCBiZWVuIGZldGNoZWQgZnJvbSBQYXJzZSwgdGhleSB3aWxsIG5vdCBiZSBzdG9yZWQuXG4gICAqIEhvd2V2ZXIsIGlmIHRoZXkgaGF2ZSBjaGFuZ2VkIGRhdGEsIGFsbCB0aGUgY2hhbmdlcyB3aWxsIGJlIHJldGFpbmVkLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5PYmplY3QucGluQWxsV2l0aE5hbWUobmFtZSwgW29iajEsIG9iajIsIC4uLl0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogVG8gcmV0cmlldmUgb2JqZWN0OlxuICAgKiA8Y29kZT5xdWVyeS5mcm9tTG9jYWxEYXRhc3RvcmUoKTwvY29kZT4gb3IgPGNvZGU+cXVlcnkuZnJvbVBpbldpdGhOYW1lKG5hbWUpPC9jb2RlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIFBpbi5cbiAgICogQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBwaW4gY29tcGxldGVzLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cykge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbERhdGFzdG9yZS5faGFuZGxlUGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgcmVtb3ZlcyB0aGUgb2JqZWN0cyBhbmQgZXZlcnkgb2JqZWN0IHRoZXkgcG9pbnQgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSxcbiAgICogcmVjdXJzaXZlbHksIHVzaW5nIGEgZGVmYXVsdCBwaW4gbmFtZTogX2RlZmF1bHQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLk9iamVjdC51blBpbkFsbChbLi4uXSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBvYmplY3RzIEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVuUGluIGNvbXBsZXRlcy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHVuUGluQWxsKG9iamVjdHMpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gUGFyc2VPYmplY3QudW5QaW5BbGxXaXRoTmFtZShfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiwgb2JqZWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgcmVtb3ZlcyB0aGUgb2JqZWN0cyBhbmQgZXZlcnkgb2JqZWN0IHRoZXkgcG9pbnQgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSwgcmVjdXJzaXZlbHkuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLk9iamVjdC51blBpbkFsbFdpdGhOYW1lKG5hbWUsIFtvYmoxLCBvYmoyLCAuLi5dKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgUGluLlxuICAgKiBAcGFyYW0ge0FycmF5fSBvYmplY3RzIEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVuUGluIGNvbXBsZXRlcy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHVuUGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cykge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbERhdGFzdG9yZS5faGFuZGxlVW5QaW5BbGxXaXRoTmFtZShuYW1lLCBvYmplY3RzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZW1vdmVzIGFsbCBvYmplY3RzIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUgdXNpbmcgYSBkZWZhdWx0IHBpbiBuYW1lOiBfZGVmYXVsdC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuT2JqZWN0LnVuUGluQWxsT2JqZWN0cygpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1blBpbiBjb21wbGV0ZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyB1blBpbkFsbE9iamVjdHMoKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsRGF0YXN0b3JlLnVuUGluV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgYWxsIG9iamVjdHMgd2l0aCB0aGUgc3BlY2lmaWVkIHBpbiBuYW1lLlxuICAgKiBEZWxldGVzIHRoZSBwaW4gbmFtZSBhbHNvLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5PYmplY3QudW5QaW5BbGxPYmplY3RzV2l0aE5hbWUobmFtZSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIFBpbi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1blBpbiBjb21wbGV0ZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyB1blBpbkFsbE9iamVjdHNXaXRoTmFtZShuYW1lKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsRGF0YXN0b3JlLnVuUGluV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuUElOX1BSRUZJWCArIG5hbWUpO1xuICB9XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgZmV0Y2godGFyZ2V0LCBmb3JjZUZldGNoLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodGFyZ2V0KSkge1xuICAgICAgaWYgKHRhcmdldC5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoW10pO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2JqcyA9IFtdO1xuICAgICAgY29uc3QgaWRzID0gW107XG4gICAgICBsZXQgY2xhc3NOYW1lID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkodGFyZ2V0KS5jYWxsKHRhcmdldCwgZWwgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgICAgICBjbGFzc05hbWUgPSBlbC5jbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsYXNzTmFtZSAhPT0gZWwuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfQ0xBU1NfTkFNRSwgJ0FsbCBvYmplY3RzIHNob3VsZCBiZSBvZiB0aGUgc2FtZSBjbGFzcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZWwuaWQpIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuTUlTU0lOR19PQkpFQ1RfSUQsICdBbGwgb2JqZWN0cyBtdXN0IGhhdmUgYW4gSUQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9yY2VGZXRjaCB8fCAhZWwuaXNEYXRhQXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICBpZHMucHVzaChlbC5pZCk7XG4gICAgICAgICAgb2Jqcy5wdXNoKGVsKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRzLnB1c2goZWwpO1xuICAgICAgfSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IFBhcnNlUXVlcnkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVF1ZXJ5KCk7XG4gICAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KGNsYXNzTmFtZSk7XG4gICAgICBxdWVyeS5jb250YWluZWRJbignb2JqZWN0SWQnLCBpZHMpO1xuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNsdWRlKSB7XG4gICAgICAgIHF1ZXJ5LmluY2x1ZGUob3B0aW9ucy5pbmNsdWRlKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5Ll9saW1pdCA9IGlkcy5sZW5ndGg7XG4gICAgICByZXR1cm4gKDAsIF9maW5kLmRlZmF1bHQpKHF1ZXJ5KS5jYWxsKHF1ZXJ5LCBvcHRpb25zKS50aGVuKGFzeW5jIG9iamVjdHMgPT4ge1xuICAgICAgICBjb25zdCBpZE1hcCA9IHt9O1xuICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCBvID0+IHtcbiAgICAgICAgICBpZE1hcFtvLmlkXSA9IG87XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvYmogPSBvYmpzW2ldO1xuICAgICAgICAgIGlmICghb2JqIHx8ICFvYmouaWQgfHwgIWlkTWFwW29iai5pZF0pIHtcbiAgICAgICAgICAgIGlmIChmb3JjZUZldGNoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9CSkVDVF9OT1RfRk9VTkQsICdBbGwgb2JqZWN0cyBtdXN0IGV4aXN0IG9uIHRoZSBzZXJ2ZXIuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNpbmdsZUluc3RhbmNlKSB7XG4gICAgICAgICAgLy8gSWYgc2luZ2xlIGluc3RhbmNlIG9iamVjdHMgYXJlIGRpc2FibGVkLCB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhlXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBvYmogPSByZXN1bHRzW2ldO1xuICAgICAgICAgICAgaWYgKG9iaiAmJiBvYmouaWQgJiYgaWRNYXBbb2JqLmlkXSkge1xuICAgICAgICAgICAgICBjb25zdCBpZCA9IG9iai5pZDtcbiAgICAgICAgICAgICAgb2JqLl9maW5pc2hGZXRjaChpZE1hcFtpZF0udG9KU09OKCkpO1xuICAgICAgICAgICAgICByZXN1bHRzW2ldID0gaWRNYXBbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgYXdhaXQgbG9jYWxEYXRhc3RvcmUuX3VwZGF0ZU9iamVjdElmUGlubmVkKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShyZXN1bHRzKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgIGlmICghdGFyZ2V0LmlkKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk1JU1NJTkdfT0JKRUNUX0lELCAnT2JqZWN0IGRvZXMgbm90IGhhdmUgYW4gSUQnKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7fTtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZSkge1xuICAgICAgICBwYXJhbXMuaW5jbHVkZSA9IG9wdGlvbnMuaW5jbHVkZS5qb2luKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2NsYXNzZXMvJyArIHRhcmdldC5jbGFzc05hbWUgKyAnLycgKyB0YXJnZXQuX2dldElkKCksIHBhcmFtcywgb3B0aW9ucykudGhlbihhc3luYyByZXNwb25zZSA9PiB7XG4gICAgICAgIHRhcmdldC5fY2xlYXJQZW5kaW5nT3BzKCk7XG4gICAgICAgIHRhcmdldC5fY2xlYXJTZXJ2ZXJEYXRhKCk7XG4gICAgICAgIHRhcmdldC5fZmluaXNoRmV0Y2gocmVzcG9uc2UpO1xuICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fdXBkYXRlT2JqZWN0SWZQaW5uZWQodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH0sXG4gIGFzeW5jIGRlc3Ryb3kodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gb3B0aW9ucyAmJiBvcHRpb25zLmJhdGNoU2l6ZSA/IG9wdGlvbnMuYmF0Y2hTaXplIDogX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdSRVFVRVNUX0JBVENIX1NJWkUnKTtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodGFyZ2V0KSkge1xuICAgICAgaWYgKHRhcmdldC5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoW10pO1xuICAgICAgfVxuICAgICAgY29uc3QgYmF0Y2hlcyA9IFtbXV07XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkodGFyZ2V0KS5jYWxsKHRhcmdldCwgb2JqID0+IHtcbiAgICAgICAgaWYgKCFvYmouaWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYmF0Y2hlc1tiYXRjaGVzLmxlbmd0aCAtIDFdLnB1c2gob2JqKTtcbiAgICAgICAgaWYgKGJhdGNoZXNbYmF0Y2hlcy5sZW5ndGggLSAxXS5sZW5ndGggPj0gYmF0Y2hTaXplKSB7XG4gICAgICAgICAgYmF0Y2hlcy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoYmF0Y2hlc1tiYXRjaGVzLmxlbmd0aCAtIDFdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiB0aGUgbGFzdCBiYXRjaCBpcyBlbXB0eSwgcmVtb3ZlIGl0XG4gICAgICAgIGJhdGNoZXMucG9wKCk7XG4gICAgICB9XG4gICAgICBsZXQgZGVsZXRlQ29tcGxldGVkID0gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKCk7XG4gICAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShiYXRjaGVzKS5jYWxsKGJhdGNoZXMsIGJhdGNoID0+IHtcbiAgICAgICAgZGVsZXRlQ29tcGxldGVkID0gZGVsZXRlQ29tcGxldGVkLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2JhdGNoJywge1xuICAgICAgICAgICAgcmVxdWVzdHM6ICgwLCBfbWFwLmRlZmF1bHQpKGJhdGNoKS5jYWxsKGJhdGNoLCBvYmogPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgICAgICAgICAgcGF0aDogZ2V0U2VydmVyVXJsUGF0aCgpICsgJ2NsYXNzZXMvJyArIG9iai5jbGFzc05hbWUgKyAnLycgKyBvYmouX2dldElkKCksXG4gICAgICAgICAgICAgICAgYm9keToge31cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSwgb3B0aW9ucykudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAocmVzdWx0c1tpXSAmJiByZXN1bHRzW2ldLmhhc093blByb3BlcnR5KCdlcnJvcicpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQocmVzdWx0c1tpXS5lcnJvci5jb2RlLCByZXN1bHRzW2ldLmVycm9yLmVycm9yKTtcbiAgICAgICAgICAgICAgICBlcnIub2JqZWN0ID0gYmF0Y2hbaV07XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRlbGV0ZUNvbXBsZXRlZC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBhZ2dyZWdhdGUgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LkFHR1JFR0FURV9FUlJPUik7XG4gICAgICAgICAgYWdncmVnYXRlLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoYWdncmVnYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiB0YXJnZXQpIHtcbiAgICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fZGVzdHJveU9iamVjdElmUGlubmVkKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh0YXJnZXQpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0RFTEVURScsICdjbGFzc2VzLycgKyB0YXJnZXQuY2xhc3NOYW1lICsgJy8nICsgdGFyZ2V0Ll9nZXRJZCgpLCB7fSwgb3B0aW9ucykudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl9kZXN0cm95T2JqZWN0SWZQaW5uZWQodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh0YXJnZXQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodGFyZ2V0KTtcbiAgfSxcbiAgc2F2ZSh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBvcHRpb25zICYmIG9wdGlvbnMuYmF0Y2hTaXplID8gb3B0aW9ucy5iYXRjaFNpemUgOiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1JFUVVFU1RfQkFUQ0hfU0laRScpO1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBjb25zdCBtYXBJZEZvclBpbiA9IHt9O1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBhbGxvd0N1c3RvbU9iamVjdElkID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBTExPV19DVVNUT01fT0JKRUNUX0lEJyk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5yZXR1cm5TdGF0dXMgPSBvcHRpb25zLnJldHVyblN0YXR1cyB8fCB0cnVlO1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodGFyZ2V0KSkge1xuICAgICAgaWYgKHRhcmdldC5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoW10pO1xuICAgICAgfVxuICAgICAgbGV0IHVuc2F2ZWQgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KSh0YXJnZXQpLmNhbGwodGFyZ2V0KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldF9pID0gdGFyZ2V0W2ldO1xuICAgICAgICBpZiAodGFyZ2V0X2kgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgICAgIHVuc2F2ZWQgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KSh1bnNhdmVkKS5jYWxsKHVuc2F2ZWQsICgwLCBfdW5zYXZlZENoaWxkcmVuLmRlZmF1bHQpKHRhcmdldF9pLCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHVuc2F2ZWQgPSAoMCwgX3VuaXF1ZS5kZWZhdWx0KSh1bnNhdmVkKTtcbiAgICAgIGNvbnN0IGZpbGVzU2F2ZWQgPSBbXTtcbiAgICAgIGxldCBwZW5kaW5nID0gW107XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkodW5zYXZlZCkuY2FsbCh1bnNhdmVkLCBlbCA9PiB7XG4gICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCkge1xuICAgICAgICAgIGZpbGVzU2F2ZWQucHVzaChlbC5zYXZlKG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbCBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICAgICAgcGVuZGluZy5wdXNoKGVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5hbGwoZmlsZXNTYXZlZCkudGhlbigoKSA9PiB7XG4gICAgICAgIGxldCBvYmplY3RFcnJvciA9IG51bGw7XG4gICAgICAgIHJldHVybiAoMCwgX3Byb21pc2VVdGlscy5jb250aW51ZVdoaWxlKSgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHBlbmRpbmcubGVuZ3RoID4gMDtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJhdGNoID0gW107XG4gICAgICAgICAgY29uc3QgbmV4dFBlbmRpbmcgPSBbXTtcbiAgICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocGVuZGluZykuY2FsbChwZW5kaW5nLCBlbCA9PiB7XG4gICAgICAgICAgICBpZiAoYWxsb3dDdXN0b21PYmplY3RJZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZWwsICdpZCcpICYmICFlbC5pZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk1JU1NJTkdfT0JKRUNUX0lELCAnb2JqZWN0SWQgbXVzdCBub3QgYmUgZW1wdHkgb3IgbnVsbCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhdGNoLmxlbmd0aCA8IGJhdGNoU2l6ZSAmJiAoMCwgX2NhbkJlU2VyaWFsaXplZC5kZWZhdWx0KShlbCkpIHtcbiAgICAgICAgICAgICAgYmF0Y2gucHVzaChlbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBuZXh0UGVuZGluZy5wdXNoKGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwZW5kaW5nID0gbmV4dFBlbmRpbmc7XG4gICAgICAgICAgaWYgKGJhdGNoLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnVHJpZWQgdG8gc2F2ZSBhIGJhdGNoIHdpdGggYSBjeWNsZS4nKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUXVldWUgdXAgdGFza3MgZm9yIGVhY2ggb2JqZWN0IGluIHRoZSBiYXRjaC5cbiAgICAgICAgICAvLyBXaGVuIGV2ZXJ5IHRhc2sgaXMgcmVhZHksIHRoZSBBUEkgcmVxdWVzdCB3aWxsIGV4ZWN1dGVcbiAgICAgICAgICBjb25zdCBiYXRjaFJldHVybmVkID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICAgICAgICBjb25zdCBiYXRjaFJlYWR5ID0gW107XG4gICAgICAgICAgY29uc3QgYmF0Y2hUYXNrcyA9IFtdO1xuICAgICAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShiYXRjaCkuY2FsbChiYXRjaCwgKG9iaiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWR5ID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICAgICAgICAgIGJhdGNoUmVhZHkucHVzaChyZWFkeSk7XG4gICAgICAgICAgICBzdGF0ZUNvbnRyb2xsZXIucHVzaFBlbmRpbmdTdGF0ZShvYmouX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICAgICAgICAgIGJhdGNoVGFza3MucHVzaChzdGF0ZUNvbnRyb2xsZXIuZW5xdWV1ZVRhc2sob2JqLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZWFkeS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIHJldHVybiBiYXRjaFJldHVybmVkLnRoZW4ocmVzcG9uc2VzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VzW2luZGV4XS5oYXNPd25Qcm9wZXJ0eSgnc3VjY2VzcycpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBvYmplY3RJZCA9IHJlc3BvbnNlc1tpbmRleF0uc3VjY2Vzcy5vYmplY3RJZDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlc1tpbmRleF0uX3N0YXR1cztcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNwb25zZXNbaW5kZXhdLl9zdGF0dXM7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2VzW2luZGV4XS5faGVhZGVycztcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNwb25zZXNbaW5kZXhdLl94aHI7XG4gICAgICAgICAgICAgICAgICBtYXBJZEZvclBpbltvYmplY3RJZF0gPSBvYmouX2xvY2FsSWQ7XG4gICAgICAgICAgICAgICAgICBvYmouX2hhbmRsZVNhdmVSZXNwb25zZShyZXNwb25zZXNbaW5kZXhdLnN1Y2Nlc3MsIHN0YXR1cyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlmICghb2JqZWN0RXJyb3IgJiYgcmVzcG9uc2VzW2luZGV4XS5oYXNPd25Qcm9wZXJ0eSgnZXJyb3InKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2ZXJFcnJvciA9IHJlc3BvbnNlc1tpbmRleF0uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoc2VydmVyRXJyb3IuY29kZSwgc2VydmVyRXJyb3IuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAvLyBDYW5jZWwgdGhlIHJlc3Qgb2YgdGhlIHNhdmVcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IFtdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgb2JqLl9oYW5kbGVTYXZlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgICgwLCBfcHJvbWlzZVV0aWxzLndoZW4pKGJhdGNoUmVhZHkpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gS2ljayBvZmYgdGhlIGJhdGNoIHJlcXVlc3RcbiAgICAgICAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2JhdGNoJywge1xuICAgICAgICAgICAgICByZXF1ZXN0czogKDAsIF9tYXAuZGVmYXVsdCkoYmF0Y2gpLmNhbGwoYmF0Y2gsIG9iaiA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gb2JqLl9nZXRTYXZlUGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgcGFyYW1zLnBhdGggPSBnZXRTZXJ2ZXJVcmxQYXRoKCkgKyBwYXJhbXMucGF0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgICAgICAgfSkudGhlbihiYXRjaFJldHVybmVkLnJlc29sdmUsIGVycm9yID0+IHtcbiAgICAgICAgICAgIGJhdGNoUmV0dXJuZWQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5DT1JSRUNUX1RZUEUsIGVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gKDAsIF9wcm9taXNlVXRpbHMud2hlbikoYmF0Y2hUYXNrcyk7XG4gICAgICAgIH0pLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmIChvYmplY3RFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG9iamVjdEVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgdGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBpdCBpcyBhIFBhcnNlT2JqZWN0IGJlZm9yZSB1cGRhdGluZyBpdCBpbnRvIHRoZSBsb2NhbERhdGFTdG9yZVxuICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl91cGRhdGVMb2NhbElkRm9yT2JqZWN0KG1hcElkRm9yUGluW29iamVjdC5pZF0sIG9iamVjdCk7XG4gICAgICAgICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl91cGRhdGVPYmplY3RJZlBpbm5lZChvYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHRhcmdldCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgaWYgKGFsbG93Q3VzdG9tT2JqZWN0SWQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgJ2lkJykgJiYgIXRhcmdldC5pZCkge1xuICAgICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk1JU1NJTkdfT0JKRUNUX0lELCAnb2JqZWN0SWQgbXVzdCBub3QgYmUgZW1wdHkgb3IgbnVsbCcpO1xuICAgICAgfVxuICAgICAgLy8gZ2VuZXJhdGUgX2xvY2FsSWQgaW4gY2FzZSBpZiBjYXNjYWRlU2F2ZT1mYWxzZVxuICAgICAgdGFyZ2V0Ll9nZXRJZCgpO1xuICAgICAgY29uc3QgbG9jYWxJZCA9IHRhcmdldC5fbG9jYWxJZDtcbiAgICAgIC8vIGNvcHlpbmcgdGFyZ2V0IGxldHMgZ3VhcmFudGVlIHRoZSBwb2ludGVyIGlzbid0IG1vZGlmaWVkIGVsc2V3aGVyZVxuICAgICAgY29uc3QgdGFyZ2V0Q29weSA9IHRhcmdldDtcbiAgICAgIGNvbnN0IHRhc2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHRhcmdldENvcHkuX2dldFNhdmVQYXJhbXMoKTtcbiAgICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QocGFyYW1zLm1ldGhvZCwgcGFyYW1zLnBhdGgsIHBhcmFtcy5ib2R5LCBvcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5fc3RhdHVzO1xuICAgICAgICAgIGRlbGV0ZSByZXNwb25zZS5fc3RhdHVzO1xuICAgICAgICAgIGRlbGV0ZSByZXNwb25zZS5faGVhZGVycztcbiAgICAgICAgICBkZWxldGUgcmVzcG9uc2UuX3hocjtcbiAgICAgICAgICB0YXJnZXRDb3B5Ll9oYW5kbGVTYXZlUmVzcG9uc2UocmVzcG9uc2UsIHN0YXR1cyk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICB0YXJnZXRDb3B5Ll9oYW5kbGVTYXZlRXJyb3IoKTtcbiAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBzdGF0ZUNvbnRyb2xsZXIucHVzaFBlbmRpbmdTdGF0ZSh0YXJnZXQuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICAgIHJldHVybiBzdGF0ZUNvbnRyb2xsZXIuZW5xdWV1ZVRhc2sodGFyZ2V0Ll9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgdGFzaykudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl91cGRhdGVMb2NhbElkRm9yT2JqZWN0KGxvY2FsSWQsIHRhcmdldCk7XG4gICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl91cGRhdGVPYmplY3RJZlBpbm5lZCh0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFBhcnNlT2JqZWN0KFBhcnNlT2JqZWN0KTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldE9iamVjdENvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VPYmplY3Q7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuVW5zZXRPcCA9IGV4cG9ydHMuU2V0T3AgPSBleHBvcnRzLlJlbW92ZU9wID0gZXhwb3J0cy5SZWxhdGlvbk9wID0gZXhwb3J0cy5PcCA9IGV4cG9ydHMuSW5jcmVtZW50T3AgPSBleHBvcnRzLkFkZFVuaXF1ZU9wID0gZXhwb3J0cy5BZGRPcCA9IHZvaWQgMDtcbmV4cG9ydHMub3BGcm9tSlNPTiA9IG9wRnJvbUpTT047XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfY29uY2F0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXRcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfc3BsaWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zcGxpY2VcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX2FycmF5Q29udGFpbnNPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2FycmF5Q29udGFpbnNPYmplY3RcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX2VuY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG52YXIgX3VuaXF1ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdW5pcXVlXCIpKTtcbmZ1bmN0aW9uIG9wRnJvbUpTT04oanNvbikge1xuICBpZiAoIWpzb24gfHwgIWpzb24uX19vcCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHN3aXRjaCAoanNvbi5fX29wKSB7XG4gICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgIHJldHVybiBuZXcgVW5zZXRPcCgpO1xuICAgIGNhc2UgJ0luY3JlbWVudCc6XG4gICAgICByZXR1cm4gbmV3IEluY3JlbWVudE9wKGpzb24uYW1vdW50KTtcbiAgICBjYXNlICdBZGQnOlxuICAgICAgcmV0dXJuIG5ldyBBZGRPcCgoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9iamVjdHMpKTtcbiAgICBjYXNlICdBZGRVbmlxdWUnOlxuICAgICAgcmV0dXJuIG5ldyBBZGRVbmlxdWVPcCgoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9iamVjdHMpKTtcbiAgICBjYXNlICdSZW1vdmUnOlxuICAgICAgcmV0dXJuIG5ldyBSZW1vdmVPcCgoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9iamVjdHMpKTtcbiAgICBjYXNlICdBZGRSZWxhdGlvbic6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IHRvQWRkID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbi5vYmplY3RzKTtcbiAgICAgICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkodG9BZGQpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbk9wKFtdLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbk9wKHRvQWRkLCBbXSk7XG4gICAgICB9XG4gICAgY2FzZSAnUmVtb3ZlUmVsYXRpb24nOlxuICAgICAge1xuICAgICAgICBjb25zdCB0b1JlbW92ZSA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24ub2JqZWN0cyk7XG4gICAgICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKHRvUmVtb3ZlKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25PcChbXSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25PcChbXSwgdG9SZW1vdmUpO1xuICAgICAgfVxuICAgIGNhc2UgJ0JhdGNoJzpcbiAgICAgIHtcbiAgICAgICAgbGV0IHRvQWRkID0gW107XG4gICAgICAgIGxldCB0b1JlbW92ZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb24ub3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGpzb24ub3BzW2ldLl9fb3AgPT09ICdBZGRSZWxhdGlvbicpIHtcbiAgICAgICAgICAgIHRvQWRkID0gKDAsIF9jb25jYXQuZGVmYXVsdCkodG9BZGQpLmNhbGwodG9BZGQsICgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24ub3BzW2ldLm9iamVjdHMpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGpzb24ub3BzW2ldLl9fb3AgPT09ICdSZW1vdmVSZWxhdGlvbicpIHtcbiAgICAgICAgICAgIHRvUmVtb3ZlID0gKDAsIF9jb25jYXQuZGVmYXVsdCkodG9SZW1vdmUpLmNhbGwodG9SZW1vdmUsICgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24ub3BzW2ldLm9iamVjdHMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbk9wKHRvQWRkLCB0b1JlbW92ZSk7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5jbGFzcyBPcCB7XG4gIC8vIEVtcHR5IHBhcmVudCBjbGFzc1xuICBhcHBseVRvKCkge30gLyogZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbiAgbWVyZ2VXaXRoKCkge30gLyogZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbiAgdG9KU09OKCkge30gLyogZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbn1cbmV4cG9ydHMuT3AgPSBPcDtcbmNsYXNzIFNldE9wIGV4dGVuZHMgT3Age1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHN1cGVyKCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdmFsdWVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG4gIGFwcGx5VG8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIG1lcmdlV2l0aCgpIHtcbiAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuX3ZhbHVlKTtcbiAgfVxuICB0b0pTT04ob2ZmbGluZSkge1xuICAgIHJldHVybiAoMCwgX2VuY29kZS5kZWZhdWx0KSh0aGlzLl92YWx1ZSwgZmFsc2UsIHRydWUsIHVuZGVmaW5lZCwgb2ZmbGluZSk7XG4gIH1cbn1cbmV4cG9ydHMuU2V0T3AgPSBTZXRPcDtcbmNsYXNzIFVuc2V0T3AgZXh0ZW5kcyBPcCB7XG4gIGFwcGx5VG8oKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBtZXJnZVdpdGgoKSB7XG4gICAgcmV0dXJuIG5ldyBVbnNldE9wKCk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX29wOiAnRGVsZXRlJ1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydHMuVW5zZXRPcCA9IFVuc2V0T3A7XG5jbGFzcyBJbmNyZW1lbnRPcCBleHRlbmRzIE9wIHtcbiAgY29uc3RydWN0b3IoYW1vdW50KSB7XG4gICAgc3VwZXIoKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9hbW91bnRcIiwgdm9pZCAwKTtcbiAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0luY3JlbWVudCBPcCBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSBudW1lcmljIGFtb3VudC4nKTtcbiAgICB9XG4gICAgdGhpcy5fYW1vdW50ID0gYW1vdW50O1xuICB9XG4gIGFwcGx5VG8odmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2Ftb3VudDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBpbmNyZW1lbnQgYSBub24tbnVtZXJpYyB2YWx1ZS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Ftb3VudCArIHZhbHVlO1xuICB9XG4gIG1lcmdlV2l0aChwcmV2aW91cykge1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBTZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLmFwcGx5VG8ocHJldmlvdXMuX3ZhbHVlKSk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFVuc2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5fYW1vdW50KTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgSW5jcmVtZW50T3ApIHtcbiAgICAgIHJldHVybiBuZXcgSW5jcmVtZW50T3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl9hbW91bnQpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbWVyZ2UgSW5jcmVtZW50IE9wIHdpdGggdGhlIHByZXZpb3VzIE9wJyk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX29wOiAnSW5jcmVtZW50JyxcbiAgICAgIGFtb3VudDogdGhpcy5fYW1vdW50XG4gICAgfTtcbiAgfVxufVxuZXhwb3J0cy5JbmNyZW1lbnRPcCA9IEluY3JlbWVudE9wO1xuY2xhc3MgQWRkT3AgZXh0ZW5kcyBPcCB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgc3VwZXIoKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl92YWx1ZVwiLCB2b2lkIDApO1xuICAgIHRoaXMuX3ZhbHVlID0gKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgfVxuICBhcHBseVRvKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAoMCwgX2NvbmNhdC5kZWZhdWx0KSh2YWx1ZSkuY2FsbCh2YWx1ZSwgdGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgZWxlbWVudHMgdG8gYSBub24tYXJyYXkgdmFsdWUnKTtcbiAgfVxuICBtZXJnZVdpdGgocHJldmlvdXMpIHtcbiAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgU2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl92YWx1ZSkpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBVbnNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgQWRkT3ApIHtcbiAgICAgIHJldHVybiBuZXcgQWRkT3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl92YWx1ZSkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtZXJnZSBBZGQgT3Agd2l0aCB0aGUgcHJldmlvdXMgT3AnKTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fb3A6ICdBZGQnLFxuICAgICAgb2JqZWN0czogKDAsIF9lbmNvZGUuZGVmYXVsdCkodGhpcy5fdmFsdWUsIGZhbHNlLCB0cnVlKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydHMuQWRkT3AgPSBBZGRPcDtcbmNsYXNzIEFkZFVuaXF1ZU9wIGV4dGVuZHMgT3Age1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHN1cGVyKCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdmFsdWVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLl92YWx1ZSA9ICgwLCBfdW5pcXVlLmRlZmF1bHQpKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuICB9XG4gIGFwcGx5VG8odmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlIHx8IFtdO1xuICAgIH1cbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSkge1xuICAgICAgdmFyIF9jb250ZXh0O1xuICAgICAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICAgICAgY29uc3QgdG9BZGQgPSBbXTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dCA9IHRoaXMuX3ZhbHVlKS5jYWxsKF9jb250ZXh0LCB2ID0+IHtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgICAgIGlmICghKDAsIF9hcnJheUNvbnRhaW5zT2JqZWN0LmRlZmF1bHQpKHZhbHVlLCB2KSkge1xuICAgICAgICAgICAgdG9BZGQucHVzaCh2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KSh2YWx1ZSkuY2FsbCh2YWx1ZSwgdikgPCAwKSB7XG4gICAgICAgICAgICB0b0FkZC5wdXNoKHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gKDAsIF9jb25jYXQuZGVmYXVsdCkodmFsdWUpLmNhbGwodmFsdWUsIHRvQWRkKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIGEgbm9uLWFycmF5IHZhbHVlJyk7XG4gIH1cbiAgbWVyZ2VXaXRoKHByZXZpb3VzKSB7XG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fdmFsdWUpKTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgVW5zZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIEFkZFVuaXF1ZU9wKSB7XG4gICAgICByZXR1cm4gbmV3IEFkZFVuaXF1ZU9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fdmFsdWUpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbWVyZ2UgQWRkVW5pcXVlIE9wIHdpdGggdGhlIHByZXZpb3VzIE9wJyk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX29wOiAnQWRkVW5pcXVlJyxcbiAgICAgIG9iamVjdHM6ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHRoaXMuX3ZhbHVlLCBmYWxzZSwgdHJ1ZSlcbiAgICB9O1xuICB9XG59XG5leHBvcnRzLkFkZFVuaXF1ZU9wID0gQWRkVW5pcXVlT3A7XG5jbGFzcyBSZW1vdmVPcCBleHRlbmRzIE9wIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICBzdXBlcigpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3ZhbHVlXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5fdmFsdWUgPSAoMCwgX3VuaXF1ZS5kZWZhdWx0KSgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcbiAgfVxuICBhcHBseVRvKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgICAgIC8vIHZhciBpID0gdmFsdWUuaW5kZXhPZih0aGlzLl92YWx1ZSk7XG4gICAgICBjb25zdCByZW1vdmVkID0gKDAsIF9jb25jYXQuZGVmYXVsdCkodmFsdWUpLmNhbGwodmFsdWUsIFtdKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGluZGV4ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKHJlbW92ZWQpLmNhbGwocmVtb3ZlZCwgdGhpcy5fdmFsdWVbaV0pO1xuICAgICAgICB3aGlsZSAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICgwLCBfc3BsaWNlLmRlZmF1bHQpKHJlbW92ZWQpLmNhbGwocmVtb3ZlZCwgaW5kZXgsIDEpO1xuICAgICAgICAgIGluZGV4ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKHJlbW92ZWQpLmNhbGwocmVtb3ZlZCwgdGhpcy5fdmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl92YWx1ZVtpXSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0ICYmIHRoaXMuX3ZhbHVlW2ldLmlkKSB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZW1vdmVkLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZFtqXSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0ICYmIHRoaXMuX3ZhbHVlW2ldLmlkID09PSByZW1vdmVkW2pdLmlkKSB7XG4gICAgICAgICAgICAgICgwLCBfc3BsaWNlLmRlZmF1bHQpKHJlbW92ZWQpLmNhbGwocmVtb3ZlZCwgaiwgMSk7XG4gICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZW1vdmVkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZW1vdmUgZWxlbWVudHMgZnJvbSBhIG5vbi1hcnJheSB2YWx1ZScpO1xuICB9XG4gIG1lcmdlV2l0aChwcmV2aW91cykge1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBTZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLmFwcGx5VG8ocHJldmlvdXMuX3ZhbHVlKSk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFVuc2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgVW5zZXRPcCgpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBSZW1vdmVPcCkge1xuICAgICAgdmFyIF9jb250ZXh0MjtcbiAgICAgIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgICAgIGNvbnN0IHVuaXF1ZXMgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDIgPSBwcmV2aW91cy5fdmFsdWUpLmNhbGwoX2NvbnRleHQyLCBbXSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLl92YWx1ZVtpXSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICAgICAgaWYgKCEoMCwgX2FycmF5Q29udGFpbnNPYmplY3QuZGVmYXVsdCkodW5pcXVlcywgdGhpcy5fdmFsdWVbaV0pKSB7XG4gICAgICAgICAgICB1bmlxdWVzLnB1c2godGhpcy5fdmFsdWVbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHVuaXF1ZXMpLmNhbGwodW5pcXVlcywgdGhpcy5fdmFsdWVbaV0pIDwgMCkge1xuICAgICAgICAgICAgdW5pcXVlcy5wdXNoKHRoaXMuX3ZhbHVlW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmVtb3ZlT3AodW5pcXVlcyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1lcmdlIFJlbW92ZSBPcCB3aXRoIHRoZSBwcmV2aW91cyBPcCcpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19vcDogJ1JlbW92ZScsXG4gICAgICBvYmplY3RzOiAoMCwgX2VuY29kZS5kZWZhdWx0KSh0aGlzLl92YWx1ZSwgZmFsc2UsIHRydWUpXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0cy5SZW1vdmVPcCA9IFJlbW92ZU9wO1xuY2xhc3MgUmVsYXRpb25PcCBleHRlbmRzIE9wIHtcbiAgY29uc3RydWN0b3IoYWRkcywgcmVtb3Zlcykge1xuICAgIHN1cGVyKCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdGFyZ2V0Q2xhc3NOYW1lXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZWxhdGlvbnNUb0FkZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVsYXRpb25zVG9SZW1vdmVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLl90YXJnZXRDbGFzc05hbWUgPSBudWxsO1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoYWRkcykpIHtcbiAgICAgIHRoaXMucmVsYXRpb25zVG9BZGQgPSAoMCwgX3VuaXF1ZS5kZWZhdWx0KSgoMCwgX21hcC5kZWZhdWx0KShhZGRzKS5jYWxsKGFkZHMsIHRoaXMuX2V4dHJhY3RJZCwgdGhpcykpO1xuICAgIH1cbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHJlbW92ZXMpKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uc1RvUmVtb3ZlID0gKDAsIF91bmlxdWUuZGVmYXVsdCkoKDAsIF9tYXAuZGVmYXVsdCkocmVtb3ZlcykuY2FsbChyZW1vdmVzLCB0aGlzLl9leHRyYWN0SWQsIHRoaXMpKTtcbiAgICB9XG4gIH1cbiAgX2V4dHJhY3RJZChvYmopIHtcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIGlmICghb2JqLmlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgYWRkIG9yIHJlbW92ZSBhbiB1bnNhdmVkIFBhcnNlIE9iamVjdCBmcm9tIGEgcmVsYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl90YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgIHRoaXMuX3RhcmdldENsYXNzTmFtZSA9IG9iai5jbGFzc05hbWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YXJnZXRDbGFzc05hbWUgIT09IG9iai5jbGFzc05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gY3JlYXRlIGEgUmVsYXRpb24gd2l0aCAyIGRpZmZlcmVudCBvYmplY3QgdHlwZXM6ICcgKyB0aGlzLl90YXJnZXRDbGFzc05hbWUgKyAnIGFuZCAnICsgb2JqLmNsYXNzTmFtZSArICcuJyk7XG4gICAgfVxuICAgIHJldHVybiBvYmouaWQ7XG4gIH1cbiAgYXBwbHlUbyh2YWx1ZSwgcGFyZW50LCBrZXkpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBpZiAoIXBhcmVudCB8fCAha2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFwcGx5IGEgUmVsYXRpb25PcCB3aXRob3V0IGVpdGhlciBhIHByZXZpb3VzIHZhbHVlLCBvciBhbiBvYmplY3QgYW5kIGEga2V5Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxhdGlvbiA9IG5ldyBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KHBhcmVudCwga2V5KTtcbiAgICAgIHJlbGF0aW9uLnRhcmdldENsYXNzTmFtZSA9IHRoaXMuX3RhcmdldENsYXNzTmFtZTtcbiAgICAgIHJldHVybiByZWxhdGlvbjtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkge1xuICAgICAgaWYgKHRoaXMuX3RhcmdldENsYXNzTmFtZSkge1xuICAgICAgICBpZiAodmFsdWUudGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3RhcmdldENsYXNzTmFtZSAhPT0gdmFsdWUudGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbGF0ZWQgb2JqZWN0IG11c3QgYmUgYSAnICsgdmFsdWUudGFyZ2V0Q2xhc3NOYW1lICsgJywgYnV0IGEgJyArIHRoaXMuX3RhcmdldENsYXNzTmFtZSArICcgd2FzIHBhc3NlZCBpbi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUudGFyZ2V0Q2xhc3NOYW1lID0gdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVsYXRpb24gY2Fubm90IGJlIGFwcGxpZWQgdG8gYSBub24tcmVsYXRpb24gZmllbGQnKTtcbiAgICB9XG4gIH1cbiAgbWVyZ2VXaXRoKHByZXZpb3VzKSB7XG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFVuc2V0T3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBtb2RpZnkgYSByZWxhdGlvbiBhZnRlciBkZWxldGluZyBpdC4nKTtcbiAgICB9IGVsc2UgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgU2V0T3AgJiYgcHJldmlvdXMuX3ZhbHVlIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFJlbGF0aW9uT3ApIHtcbiAgICAgIHZhciBfY29udGV4dDMsIF9jb250ZXh0NCwgX2NvbnRleHQ1LCBfY29udGV4dDYsIF9jb250ZXh0NywgX2NvbnRleHQ4O1xuICAgICAgaWYgKHByZXZpb3VzLl90YXJnZXRDbGFzc05hbWUgJiYgcHJldmlvdXMuX3RhcmdldENsYXNzTmFtZSAhPT0gdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVsYXRlZCBvYmplY3QgbXVzdCBiZSBvZiBjbGFzcyAnICsgcHJldmlvdXMuX3RhcmdldENsYXNzTmFtZSArICcsIGJ1dCAnICsgKHRoaXMuX3RhcmdldENsYXNzTmFtZSB8fCAnbnVsbCcpICsgJyB3YXMgcGFzc2VkIGluLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3QWRkID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQzID0gcHJldmlvdXMucmVsYXRpb25zVG9BZGQpLmNhbGwoX2NvbnRleHQzLCBbXSk7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ0ID0gdGhpcy5yZWxhdGlvbnNUb1JlbW92ZSkuY2FsbChfY29udGV4dDQsIHIgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShuZXdBZGQpLmNhbGwobmV3QWRkLCByKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAoMCwgX3NwbGljZS5kZWZhdWx0KShuZXdBZGQpLmNhbGwobmV3QWRkLCBpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NSA9IHRoaXMucmVsYXRpb25zVG9BZGQpLmNhbGwoX2NvbnRleHQ1LCByID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkobmV3QWRkKS5jYWxsKG5ld0FkZCwgcik7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICBuZXdBZGQucHVzaChyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXdSZW1vdmUgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDYgPSBwcmV2aW91cy5yZWxhdGlvbnNUb1JlbW92ZSkuY2FsbChfY29udGV4dDYsIFtdKTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDcgPSB0aGlzLnJlbGF0aW9uc1RvQWRkKS5jYWxsKF9jb250ZXh0NywgciA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKG5ld1JlbW92ZSkuY2FsbChuZXdSZW1vdmUsIHIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICgwLCBfc3BsaWNlLmRlZmF1bHQpKG5ld1JlbW92ZSkuY2FsbChuZXdSZW1vdmUsIGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ4ID0gdGhpcy5yZWxhdGlvbnNUb1JlbW92ZSkuY2FsbChfY29udGV4dDgsIHIgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShuZXdSZW1vdmUpLmNhbGwobmV3UmVtb3ZlLCByKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgIG5ld1JlbW92ZS5wdXNoKHIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG5ld1JlbGF0aW9uID0gbmV3IFJlbGF0aW9uT3AobmV3QWRkLCBuZXdSZW1vdmUpO1xuICAgICAgbmV3UmVsYXRpb24uX3RhcmdldENsYXNzTmFtZSA9IHRoaXMuX3RhcmdldENsYXNzTmFtZTtcbiAgICAgIHJldHVybiBuZXdSZWxhdGlvbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbWVyZ2UgUmVsYXRpb24gT3Agd2l0aCB0aGUgcHJldmlvdXMgT3AnKTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgaWRUb1BvaW50ZXIgPSBpZCA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgICAgY2xhc3NOYW1lOiB0aGlzLl90YXJnZXRDbGFzc05hbWUsXG4gICAgICAgIG9iamVjdElkOiBpZFxuICAgICAgfTtcbiAgICB9O1xuICAgIGxldCBwb2ludGVycyA9IG51bGw7XG4gICAgbGV0IGFkZHMgPSBudWxsO1xuICAgIGxldCByZW1vdmVzID0gbnVsbDtcbiAgICBpZiAodGhpcy5yZWxhdGlvbnNUb0FkZC5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgX2NvbnRleHQ5O1xuICAgICAgcG9pbnRlcnMgPSAoMCwgX21hcC5kZWZhdWx0KShfY29udGV4dDkgPSB0aGlzLnJlbGF0aW9uc1RvQWRkKS5jYWxsKF9jb250ZXh0OSwgaWRUb1BvaW50ZXIpO1xuICAgICAgYWRkcyA9IHtcbiAgICAgICAgX19vcDogJ0FkZFJlbGF0aW9uJyxcbiAgICAgICAgb2JqZWN0czogcG9pbnRlcnNcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLnJlbGF0aW9uc1RvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBfY29udGV4dDEwO1xuICAgICAgcG9pbnRlcnMgPSAoMCwgX21hcC5kZWZhdWx0KShfY29udGV4dDEwID0gdGhpcy5yZWxhdGlvbnNUb1JlbW92ZSkuY2FsbChfY29udGV4dDEwLCBpZFRvUG9pbnRlcik7XG4gICAgICByZW1vdmVzID0ge1xuICAgICAgICBfX29wOiAnUmVtb3ZlUmVsYXRpb24nLFxuICAgICAgICBvYmplY3RzOiBwb2ludGVyc1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGFkZHMgJiYgcmVtb3Zlcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19vcDogJ0JhdGNoJyxcbiAgICAgICAgb3BzOiBbYWRkcywgcmVtb3Zlc11cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBhZGRzIHx8IHJlbW92ZXMgfHwge307XG4gIH1cbn1cbmV4cG9ydHMuUmVsYXRpb25PcCA9IFJlbGF0aW9uT3A7XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQYXJzZU9wKHtcbiAgT3AsXG4gIG9wRnJvbUpTT04sXG4gIFNldE9wLFxuICBVbnNldE9wLFxuICBJbmNyZW1lbnRPcCxcbiAgQWRkT3AsXG4gIFJlbGF0aW9uT3AsXG4gIFJlbW92ZU9wLFxuICBBZGRVbmlxdWVPcFxufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9QYXJzZUdlb1BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUdlb1BvaW50XCIpKTtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBQb2x5Z29uIHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6PGJyPlxuICogICA8cHJlPlxuICogICBuZXcgUG9seWdvbihbWzAsMF0sWzAsMV0sWzEsMV0sWzEsMF1dKVxuICogICBuZXcgUG9seWdvbihbR2VvUG9pbnQsIEdlb1BvaW50LCBHZW9Qb2ludF0pXG4gKiAgIDwvcHJlPlxuICpcbiAqIDxwPlJlcHJlc2VudHMgYSBjb29yZGluYXRlcyB0aGF0IG1heSBiZSBhc3NvY2lhdGVkXG4gKiB3aXRoIGEga2V5IGluIGEgUGFyc2VPYmplY3Qgb3IgdXNlZCBhcyBhIHJlZmVyZW5jZSBwb2ludCBmb3IgZ2VvIHF1ZXJpZXMuXG4gKiBUaGlzIGFsbG93cyBwcm94aW1pdHktYmFzZWQgcXVlcmllcyBvbiB0aGUga2V5LjwvcD5cbiAqXG4gKiA8cD5FeGFtcGxlOjxwcmU+XG4gKiAgIHZhciBwb2x5Z29uID0gbmV3IFBhcnNlLlBvbHlnb24oW1swLDBdLFswLDFdLFsxLDFdLFsxLDBdXSk7XG4gKiAgIHZhciBvYmplY3QgPSBuZXcgUGFyc2UuT2JqZWN0KFwiUGxhY2VPYmplY3RcIik7XG4gKiAgIG9iamVjdC5zZXQoXCJhcmVhXCIsIHBvbHlnb24pO1xuICogICBvYmplY3Quc2F2ZSgpOzwvcHJlPjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuUG9seWdvblxuICovXG5jbGFzcyBQYXJzZVBvbHlnb24ge1xuICAvKipcbiAgICogQHBhcmFtIHsoQ29vcmRpbmF0ZXMgfCBQYXJzZS5HZW9Qb2ludFtdKX0gY29vcmRpbmF0ZXMgQW4gQXJyYXkgb2YgY29vcmRpbmF0ZSBwYWlyc1xuICAgKi9cbiAgY29uc3RydWN0b3IoY29vcmRpbmF0ZXMpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9jb29yZGluYXRlc1wiLCB2b2lkIDApO1xuICAgIHRoaXMuX2Nvb3JkaW5hdGVzID0gUGFyc2VQb2x5Z29uLl92YWxpZGF0ZShjb29yZGluYXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29vcmRpbmF0ZXMgdmFsdWUgZm9yIHRoaXMgUG9seWdvbi5cbiAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBub3QgdmFsaWQgdHlwZS5cbiAgICpcbiAgICogQHByb3BlcnR5IHsoQ29vcmRpbmF0ZXMgfCBQYXJzZS5HZW9Qb2ludFtdKX0gY29vcmRpbmF0ZXMgbGlzdCBvZiBjb29yZGluYXRlc1xuICAgKiBAcmV0dXJucyB7Q29vcmRpbmF0ZXN9XG4gICAqL1xuICBnZXQgY29vcmRpbmF0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzO1xuICB9XG4gIHNldCBjb29yZGluYXRlcyhjb29yZHMpIHtcbiAgICB0aGlzLl9jb29yZGluYXRlcyA9IFBhcnNlUG9seWdvbi5fdmFsaWRhdGUoY29vcmRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgUG9seWdvbiwgc3VpdGFibGUgZm9yIFBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIFBhcnNlUG9seWdvbi5fdmFsaWRhdGUodGhpcy5fY29vcmRpbmF0ZXMpO1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiB0aGlzLl9jb29yZGluYXRlc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHR3byBwb2x5Z29ucyBhcmUgZXF1YWxcbiAgICpcbiAgICogQHBhcmFtIHsoUGFyc2UuUG9seWdvbiB8IG9iamVjdCl9IG90aGVyXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBQYXJzZVBvbHlnb24pIHx8IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoICE9PSBvdGhlci5jb29yZGluYXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IGlzRXF1YWwgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICh0aGlzLl9jb29yZGluYXRlc1tpXVswXSAhPSBvdGhlci5jb29yZGluYXRlc1tpXVswXSB8fCB0aGlzLl9jb29yZGluYXRlc1tpXVsxXSAhPSBvdGhlci5jb29yZGluYXRlc1tpXVsxXSkge1xuICAgICAgICBpc0VxdWFsID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNFcXVhbDtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBpZiB0aGUgcG9pbnQgaXMgY29udGFpbmVkIGluIHRoZSBwb2x5Z29uXG4gICAqL1xuICBjb250YWluc1BvaW50KHBvaW50KSB7XG4gICAgbGV0IG1pblggPSB0aGlzLl9jb29yZGluYXRlc1swXVswXTtcbiAgICBsZXQgbWF4WCA9IHRoaXMuX2Nvb3JkaW5hdGVzWzBdWzBdO1xuICAgIGxldCBtaW5ZID0gdGhpcy5fY29vcmRpbmF0ZXNbMF1bMV07XG4gICAgbGV0IG1heFkgPSB0aGlzLl9jb29yZGluYXRlc1swXVsxXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBwID0gdGhpcy5fY29vcmRpbmF0ZXNbaV07XG4gICAgICBtaW5YID0gTWF0aC5taW4ocFswXSwgbWluWCk7XG4gICAgICBtYXhYID0gTWF0aC5tYXgocFswXSwgbWF4WCk7XG4gICAgICBtaW5ZID0gTWF0aC5taW4ocFsxXSwgbWluWSk7XG4gICAgICBtYXhZID0gTWF0aC5tYXgocFsxXSwgbWF4WSk7XG4gICAgfVxuICAgIGNvbnN0IG91dHNpZGUgPSBwb2ludC5sYXRpdHVkZSA8IG1pblggfHwgcG9pbnQubGF0aXR1ZGUgPiBtYXhYIHx8IHBvaW50LmxvbmdpdHVkZSA8IG1pblkgfHwgcG9pbnQubG9uZ2l0dWRlID4gbWF4WTtcbiAgICBpZiAob3V0c2lkZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgaW5zaWRlID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGggLSAxOyBpIDwgdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoOyBqID0gaSsrKSB7XG4gICAgICBjb25zdCBzdGFydFggPSB0aGlzLl9jb29yZGluYXRlc1tpXVswXTtcbiAgICAgIGNvbnN0IHN0YXJ0WSA9IHRoaXMuX2Nvb3JkaW5hdGVzW2ldWzFdO1xuICAgICAgY29uc3QgZW5kWCA9IHRoaXMuX2Nvb3JkaW5hdGVzW2pdWzBdO1xuICAgICAgY29uc3QgZW5kWSA9IHRoaXMuX2Nvb3JkaW5hdGVzW2pdWzFdO1xuICAgICAgY29uc3QgaW50ZXJzZWN0ID0gc3RhcnRZID4gcG9pbnQubG9uZ2l0dWRlICE9IGVuZFkgPiBwb2ludC5sb25naXR1ZGUgJiYgcG9pbnQubGF0aXR1ZGUgPCAoZW5kWCAtIHN0YXJ0WCkgKiAocG9pbnQubG9uZ2l0dWRlIC0gc3RhcnRZKSAvIChlbmRZIC0gc3RhcnRZKSArIHN0YXJ0WDtcbiAgICAgIGlmIChpbnRlcnNlY3QpIHtcbiAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluc2lkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgbGlzdCBvZiBjb29yZGluYXRlcyBjYW4gZm9ybSBhIHZhbGlkIHBvbHlnb25cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gY29vcmRzIHRoZSBsaXN0IG9mIGNvb3JkaW5hdGVzIHRvIHZhbGlkYXRlIGFzIGEgcG9seWdvblxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9XG4gICAqIEByZXR1cm5zIHtudW1iZXJbXVtdfSBBcnJheSBvZiBjb29yZGluYXRlcyBpZiB2YWxpZGF0ZWQuXG4gICAqL1xuICBzdGF0aWMgX3ZhbGlkYXRlKGNvb3Jkcykge1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKGNvb3JkcykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nvb3JkaW5hdGVzIG11c3QgYmUgYW4gQXJyYXknKTtcbiAgICB9XG4gICAgaWYgKGNvb3Jkcy5sZW5ndGggPCAzKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQb2x5Z29uIG11c3QgaGF2ZSBhdCBsZWFzdCAzIEdlb1BvaW50cyBvciBQb2ludHMnKTtcbiAgICB9XG4gICAgY29uc3QgcG9pbnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuICAgICAgbGV0IGdlb1BvaW50O1xuICAgICAgaWYgKGNvb3JkIGluc3RhbmNlb2YgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCkge1xuICAgICAgICBnZW9Qb2ludCA9IGNvb3JkO1xuICAgICAgfSBlbHNlIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoY29vcmQpICYmIGNvb3JkLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBnZW9Qb2ludCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KGNvb3JkWzBdLCBjb29yZFsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5IG9mIEdlb1BvaW50cyBvciBQb2ludHMnKTtcbiAgICAgIH1cbiAgICAgIHBvaW50cy5wdXNoKFtnZW9Qb2ludC5sYXRpdHVkZSwgZ2VvUG9pbnQubG9uZ2l0dWRlXSk7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHM7XG4gIH1cbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlUG9seWdvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9zbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc2xpY2VcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX2ZpbHRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmlsdGVyXCIpKTtcbnZhciBfa2V5czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2tleXNcIikpO1xudmFyIF9jb25jYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKSk7XG52YXIgX2luY2x1ZGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmNsdWRlc1wiKSk7XG52YXIgX3NvcnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NvcnRcIikpO1xudmFyIF9zcGxpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NwbGljZVwiKSk7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9maW5kID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maW5kXCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9lbnRyaWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZW50cmllc1wiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2VuY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfcHJvbWlzZVV0aWxzID0gcmVxdWlyZShcIi4vcHJvbWlzZVV0aWxzXCIpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VHZW9Qb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VHZW9Qb2ludFwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgX09mZmxpbmVRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vT2ZmbGluZVF1ZXJ5XCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVVdGlscyA9IHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlVXRpbHNcIik7XG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSByZWdleCB0aGF0IG1hdGNoZXMgaXQuXG4gKiBTdXJyb3VuZGluZyB3aXRoIFxcUSAuLiBcXEUgZG9lcyB0aGlzLCB3ZSBqdXN0IG5lZWQgdG8gZXNjYXBlIGFueSBcXEUncyBpblxuICogdGhlIHRleHQgc2VwYXJhdGVseS5cbiAqXG4gKiBAcGFyYW0gc1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHF1b3RlKHMpIHtcbiAgcmV0dXJuICdcXFxcUScgKyBzLnJlcGxhY2UoJ1xcXFxFJywgJ1xcXFxFXFxcXFxcXFxFXFxcXFEnKSArICdcXFxcRSc7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNsYXNzIG5hbWUgZnJvbSBxdWVyaWVzLiBJZiBub3QgYWxsIHF1ZXJpZXMgaGF2ZSB0aGUgc2FtZVxuICogY2xhc3MgbmFtZSBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAqXG4gKiBAcGFyYW0gcXVlcmllc1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9nZXRDbGFzc05hbWVGcm9tUXVlcmllcyhxdWVyaWVzKSB7XG4gIGxldCBjbGFzc05hbWUgPSBudWxsO1xuICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocXVlcmllcykuY2FsbChxdWVyaWVzLCBxID0+IHtcbiAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lID0gcS5jbGFzc05hbWU7XG4gICAgfVxuICAgIGlmIChjbGFzc05hbWUgIT09IHEuY2xhc3NOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsbCBxdWVyaWVzIG11c3QgYmUgZm9yIHRoZSBzYW1lIGNsYXNzLicpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBjbGFzc05hbWU7XG59XG5cbi8qXG4gKiBIYW5kbGVzIHByZS1wb3B1bGF0aW5nIHRoZSByZXN1bHQgZGF0YSBvZiBhIHF1ZXJ5IHdpdGggc2VsZWN0IGZpZWxkcyxcbiAqIG1ha2luZyBzdXJlIHRoYXQgdGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5zIGtleXMgZm9yIGFsbCBvYmplY3RzIHRoYXQgaGF2ZVxuICogYmVlbiByZXF1ZXN0ZWQgd2l0aCBhIHNlbGVjdCwgc28gdGhhdCBvdXIgY2FjaGVkIHN0YXRlIHVwZGF0ZXMgY29ycmVjdGx5LlxuICovXG5mdW5jdGlvbiBoYW5kbGVTZWxlY3RSZXN1bHQoZGF0YSwgc2VsZWN0KSB7XG4gIGNvbnN0IHNlcnZlckRhdGFNYXNrID0ge307XG4gICgwLCBfZm9yRWFjaC5kZWZhdWx0KShzZWxlY3QpLmNhbGwoc2VsZWN0LCBmaWVsZCA9PiB7XG4gICAgY29uc3QgaGFzU3ViT2JqZWN0U2VsZWN0ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKGZpZWxkKS5jYWxsKGZpZWxkLCAnLicpICE9PSAtMTtcbiAgICBpZiAoIWhhc1N1Yk9iamVjdFNlbGVjdCAmJiAhZGF0YS5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHtcbiAgICAgIC8vIHRoaXMgZmllbGQgd2FzIHNlbGVjdGVkLCBidXQgaXMgbWlzc2luZyBmcm9tIHRoZSByZXRyaWV2ZWQgZGF0YVxuICAgICAgZGF0YVtmaWVsZF0gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChoYXNTdWJPYmplY3RTZWxlY3QpIHtcbiAgICAgIC8vIHRoaXMgZmllbGQgcmVmZXJlbmNlcyBhIHN1Yi1vYmplY3QsXG4gICAgICAvLyBzbyB3ZSBuZWVkIHRvIHdhbGsgZG93biB0aGUgcGF0aCBjb21wb25lbnRzXG4gICAgICBjb25zdCBwYXRoQ29tcG9uZW50cyA9IGZpZWxkLnNwbGl0KCcuJyk7XG4gICAgICBsZXQgb2JqID0gZGF0YTtcbiAgICAgIGxldCBzZXJ2ZXJNYXNrID0gc2VydmVyRGF0YU1hc2s7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocGF0aENvbXBvbmVudHMpLmNhbGwocGF0aENvbXBvbmVudHMsIChjb21wb25lbnQsIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgLy8gYWRkIGtleXMgaWYgdGhlIGV4cGVjdGVkIGRhdGEgaXMgbWlzc2luZ1xuICAgICAgICBpZiAob2JqICYmICFvYmouaGFzT3duUHJvcGVydHkoY29tcG9uZW50KSkge1xuICAgICAgICAgIG9ialtjb21wb25lbnRdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBvYmogPSBvYmpbY29tcG9uZW50XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYWRkIHRoaXMgcGF0aCBjb21wb25lbnQgdG8gdGhlIHNlcnZlciBtYXNrIHNvIHdlIGNhbiBmaWxsIGl0IGluIGxhdGVyIGlmIG5lZWRlZFxuICAgICAgICBpZiAoaW5kZXggPCBhcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGlmICghc2VydmVyTWFza1tjb21wb25lbnRdKSB7XG4gICAgICAgICAgICBzZXJ2ZXJNYXNrW2NvbXBvbmVudF0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VydmVyTWFzayA9IHNlcnZlck1hc2tbY29tcG9uZW50XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKCgwLCBfa2V5cy5kZWZhdWx0KShzZXJ2ZXJEYXRhTWFzaykubGVuZ3RoID4gMCkge1xuICAgIC8vIFdoZW4gc2VsZWN0aW5nIGZyb20gc3ViLW9iamVjdHMsIHdlIGRvbid0IHdhbnQgdG8gYmxvdyBhd2F5IHRoZSBtaXNzaW5nXG4gICAgLy8gaW5mb3JtYXRpb24gdGhhdCB3ZSBtYXkgaGF2ZSByZXRyaWV2ZWQgYmVmb3JlLiBXZSd2ZSBhbHJlYWR5IGFkZGVkIGFueVxuICAgIC8vIG1pc3Npbmcgc2VsZWN0ZWQga2V5cyB0byBzdWItb2JqZWN0cywgYnV0IHdlIHN0aWxsIG5lZWQgdG8gYWRkIGluIHRoZVxuICAgIC8vIGRhdGEgZm9yIGFueSBwcmV2aW91c2x5IHJldHJpZXZlZCBzdWItb2JqZWN0cyB0aGF0IHdlcmUgbm90IHNlbGVjdGVkLlxuXG4gICAgY29uc3Qgc2VydmVyRGF0YSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpLmdldFNlcnZlckRhdGEoe1xuICAgICAgaWQ6IGRhdGEub2JqZWN0SWQsXG4gICAgICBjbGFzc05hbWU6IGRhdGEuY2xhc3NOYW1lXG4gICAgfSk7XG4gICAgY29weU1pc3NpbmdEYXRhV2l0aE1hc2soc2VydmVyRGF0YSwgZGF0YSwgc2VydmVyRGF0YU1hc2ssIGZhbHNlKTtcbiAgfVxufVxuZnVuY3Rpb24gY29weU1pc3NpbmdEYXRhV2l0aE1hc2soc3JjLCBkZXN0LCBtYXNrLCBjb3B5VGhpc0xldmVsKSB7XG4gIC8vY29weSBtaXNzaW5nIGVsZW1lbnRzIGF0IHRoaXMgbGV2ZWxcbiAgaWYgKGNvcHlUaGlzTGV2ZWwpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzcmMpIHtcbiAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhZGVzdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGRlc3Rba2V5XSA9IHNyY1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBtYXNrKSB7XG4gICAgaWYgKGRlc3Rba2V5XSAhPT0gdW5kZWZpbmVkICYmIGRlc3Rba2V5XSAhPT0gbnVsbCAmJiBzcmMgIT09IHVuZGVmaW5lZCAmJiBzcmMgIT09IG51bGwpIHtcbiAgICAgIC8vdHJhdmVyc2UgaW50byBvYmplY3RzIGFzIG5lZWRlZFxuICAgICAgY29weU1pc3NpbmdEYXRhV2l0aE1hc2soc3JjW2tleV0sIGRlc3Rba2V5XSwgbWFza1trZXldLCB0cnVlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZU9mZmxpbmVTb3J0KGEsIGIsIHNvcnRzKSB7XG4gIGxldCBvcmRlciA9IHNvcnRzWzBdO1xuICBjb25zdCBvcGVyYXRvciA9ICgwLCBfc2xpY2UuZGVmYXVsdCkob3JkZXIpLmNhbGwob3JkZXIsIDAsIDEpO1xuICBjb25zdCBpc0Rlc2NlbmRpbmcgPSBvcGVyYXRvciA9PT0gJy0nO1xuICBpZiAoaXNEZXNjZW5kaW5nKSB7XG4gICAgb3JkZXIgPSBvcmRlci5zdWJzdHJpbmcoMSk7XG4gIH1cbiAgaWYgKG9yZGVyID09PSAnX2NyZWF0ZWRfYXQnKSB7XG4gICAgb3JkZXIgPSAnY3JlYXRlZEF0JztcbiAgfVxuICBpZiAob3JkZXIgPT09ICdfdXBkYXRlZF9hdCcpIHtcbiAgICBvcmRlciA9ICd1cGRhdGVkQXQnO1xuICB9XG4gIGlmICghL15bQS1aYS16XVswLTlBLVphLXpfXSokLy50ZXN0KG9yZGVyKSB8fCBvcmRlciA9PT0gJ3Bhc3N3b3JkJykge1xuICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9LRVlfTkFNRSwgYEludmFsaWQgS2V5OiAke29yZGVyfWApO1xuICB9XG4gIGNvbnN0IGZpZWxkMSA9IGEuZ2V0KG9yZGVyKTtcbiAgY29uc3QgZmllbGQyID0gYi5nZXQob3JkZXIpO1xuICBpZiAoZmllbGQxIDwgZmllbGQyKSB7XG4gICAgcmV0dXJuIGlzRGVzY2VuZGluZyA/IDEgOiAtMTtcbiAgfVxuICBpZiAoZmllbGQxID4gZmllbGQyKSB7XG4gICAgcmV0dXJuIGlzRGVzY2VuZGluZyA/IC0xIDogMTtcbiAgfVxuICBpZiAoc29ydHMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IHJlbWFpbmluZ1NvcnRzID0gKDAsIF9zbGljZS5kZWZhdWx0KShzb3J0cykuY2FsbChzb3J0cywgMSk7XG4gICAgcmV0dXJuIGhhbmRsZU9mZmxpbmVTb3J0KGEsIGIsIHJlbWFpbmluZ1NvcnRzKTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBwYXJzZSBQYXJzZS5RdWVyeSBmb3IgdGhlIGdpdmVuIFBhcnNlLk9iamVjdCBzdWJjbGFzcy5cbiAqXG4gKiA8cD5QYXJzZS5RdWVyeSBkZWZpbmVzIGEgcXVlcnkgdGhhdCBpcyB1c2VkIHRvIGZldGNoIFBhcnNlLk9iamVjdHMuIFRoZVxuICogbW9zdCBjb21tb24gdXNlIGNhc2UgaXMgZmluZGluZyBhbGwgb2JqZWN0cyB0aGF0IG1hdGNoIGEgcXVlcnkgdGhyb3VnaCB0aGVcbiAqIDxjb2RlPmZpbmQ8L2NvZGU+IG1ldGhvZC4gZm9yIGV4YW1wbGUsIHRoaXMgc2FtcGxlIGNvZGUgZmV0Y2hlcyBhbGwgb2JqZWN0c1xuICogb2YgY2xhc3MgPGNvZGU+bXljbGFzczwvY29kZT4uIGl0IGNhbGxzIGEgZGlmZmVyZW50IGZ1bmN0aW9uIGRlcGVuZGluZyBvblxuICogd2hldGhlciB0aGUgZmV0Y2ggc3VjY2VlZGVkIG9yIG5vdC5cbiAqXG4gKiA8cHJlPlxuICogdmFyIHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KG15Y2xhc3MpO1xuICogcXVlcnkuZmluZCgpLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAqICAgLy8gcmVzdWx0cyBpcyBhbiBhcnJheSBvZiBwYXJzZS5vYmplY3QuXG4gKiB9KS5jYXRjaCgoZXJyb3IpID0+ICB7XG4gKiAgLy8gZXJyb3IgaXMgYW4gaW5zdGFuY2Ugb2YgcGFyc2UuZXJyb3IuXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+YSBQYXJzZS5RdWVyeSBjYW4gYWxzbyBiZSB1c2VkIHRvIHJldHJpZXZlIGEgc2luZ2xlIG9iamVjdCB3aG9zZSBpZCBpc1xuICoga25vd24sIHRocm91Z2ggdGhlIGdldCBtZXRob2QuIGZvciBleGFtcGxlLCB0aGlzIHNhbXBsZSBjb2RlIGZldGNoZXMgYW5cbiAqIG9iamVjdCBvZiBjbGFzcyA8Y29kZT5teWNsYXNzPC9jb2RlPiBhbmQgaWQgPGNvZGU+bXlpZDwvY29kZT4uIGl0IGNhbGxzIGFcbiAqIGRpZmZlcmVudCBmdW5jdGlvbiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZmV0Y2ggc3VjY2VlZGVkIG9yIG5vdC5cbiAqXG4gKiA8cHJlPlxuICogdmFyIHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KG15Y2xhc3MpO1xuICogcXVlcnkuZ2V0KG15aWQpLnRoZW4oKG9iamVjdCkgPT4ge1xuICogICAgIC8vIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBwYXJzZS5vYmplY3QuXG4gKiB9KS5jYXRjaCgoZXJyb3IpID0+ICB7XG4gKiAgLy8gZXJyb3IgaXMgYW4gaW5zdGFuY2Ugb2YgcGFyc2UuZXJyb3IuXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+YSBQYXJzZS5RdWVyeSBjYW4gYWxzbyBiZSB1c2VkIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IG1hdGNoXG4gKiB0aGUgcXVlcnkgd2l0aG91dCByZXRyaWV2aW5nIGFsbCBvZiB0aG9zZSBvYmplY3RzLiBmb3IgZXhhbXBsZSwgdGhpc1xuICogc2FtcGxlIGNvZGUgY291bnRzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBvZiB0aGUgY2xhc3MgPGNvZGU+bXljbGFzczwvY29kZT5cbiAqIDxwcmU+XG4gKiB2YXIgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkobXljbGFzcyk7XG4gKiBxdWVyeS5jb3VudCgpLnRoZW4oKG51bWJlcikgPT4ge1xuICogICAgIC8vIHRoZXJlIGFyZSBudW1iZXIgaW5zdGFuY2VzIG9mIG15Y2xhc3MuXG4gKiB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAqICAgICAvLyBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiBQYXJzZS5FcnJvci5cbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuUXVlcnlcbiAqL1xuY2xhc3MgUGFyc2VRdWVyeSB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBQYXJzZS5PYmplY3QpfSBvYmplY3RDbGFzcyBBbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIFBhcnNlLk9iamVjdCwgb3IgYSBQYXJzZSBjbGFzc05hbWUgc3RyaW5nLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqZWN0Q2xhc3MpIHtcbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gY2xhc3NOYW1lXG4gICAgICovXG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJjbGFzc05hbWVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl93aGVyZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3dhdGNoXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfaW5jbHVkZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2V4Y2x1ZGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9zZWxlY3RcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9saW1pdFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3NraXBcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9jb3VudFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX29yZGVyXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfcmVhZFByZWZlcmVuY2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9pbmNsdWRlUmVhZFByZWZlcmVuY2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfcXVlcmllc0xvY2FsRGF0YXN0b3JlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfbG9jYWxEYXRhc3RvcmVQaW5OYW1lXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfZXh0cmFPcHRpb25zXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfaGludFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2V4cGxhaW5cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl94aHJSZXF1ZXN0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfY29tbWVudFwiLCB2b2lkIDApO1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0Q2xhc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAob2JqZWN0Q2xhc3MgPT09ICdVc2VyJyAmJiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1BFUkZPUk1fVVNFUl9SRVdSSVRFJykpIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAnX1VzZXInO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBvYmplY3RDbGFzcztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9iamVjdENsYXNzIGluc3RhbmNlb2YgX1BhcnNlT2JqZWN0LmRlZmF1bHQpIHtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gb2JqZWN0Q2xhc3MuY2xhc3NOYW1lO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iamVjdENsYXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBvYmpDbGFzcyA9IG9iamVjdENsYXNzO1xuICAgICAgaWYgKHR5cGVvZiBvYmpDbGFzcy5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gb2JqQ2xhc3MuY2xhc3NOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb2JqID0gbmV3IG9iakNsYXNzKCk7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gb2JqLmNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBQYXJzZVF1ZXJ5IG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFBhcnNlT2JqZWN0IG9yIGNsYXNzIG5hbWUuJyk7XG4gICAgfVxuICAgIHRoaXMuX3doZXJlID0ge307XG4gICAgdGhpcy5fd2F0Y2ggPSBbXTtcbiAgICB0aGlzLl9pbmNsdWRlID0gW107XG4gICAgdGhpcy5fZXhjbHVkZSA9IFtdO1xuICAgIHRoaXMuX2NvdW50ID0gZmFsc2U7XG4gICAgdGhpcy5fbGltaXQgPSAtMTsgLy8gbmVnYXRpdmUgbGltaXQgaXMgbm90IHNlbnQgaW4gdGhlIHNlcnZlciByZXF1ZXN0XG4gICAgdGhpcy5fc2tpcCA9IDA7XG4gICAgdGhpcy5fcmVhZFByZWZlcmVuY2UgPSBudWxsO1xuICAgIHRoaXMuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IG51bGw7XG4gICAgdGhpcy5fc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IG51bGw7XG4gICAgdGhpcy5fcXVlcmllc0xvY2FsRGF0YXN0b3JlID0gZmFsc2U7XG4gICAgdGhpcy5fbG9jYWxEYXRhc3RvcmVQaW5OYW1lID0gbnVsbDtcbiAgICB0aGlzLl9leHRyYU9wdGlvbnMgPSB7fTtcbiAgICB0aGlzLl94aHJSZXF1ZXN0ID0ge1xuICAgICAgdGFzazogbnVsbCxcbiAgICAgIG9uY2hhbmdlOiAoKSA9PiB7fVxuICAgIH07XG4gICAgdGhpcy5fY29tbWVudCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjb25zdHJhaW50IHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcyBtYXRjaGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBxdWVyaWVzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgX29yUXVlcnkocXVlcmllcykge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9ICgwLCBfbWFwLmRlZmF1bHQpKHF1ZXJpZXMpLmNhbGwocXVlcmllcywgcSA9PiB7XG4gICAgICByZXR1cm4gcS50b0pTT04oKS53aGVyZTtcbiAgICB9KTtcbiAgICB0aGlzLl93aGVyZS4kb3IgPSBxdWVyeUpTT047XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjb25zdHJhaW50IHRoYXQgYWxsIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcyBtYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gcXVlcmllc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIF9hbmRRdWVyeShxdWVyaWVzKSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gKDAsIF9tYXAuZGVmYXVsdCkocXVlcmllcykuY2FsbChxdWVyaWVzLCBxID0+IHtcbiAgICAgIHJldHVybiBxLnRvSlNPTigpLndoZXJlO1xuICAgIH0pO1xuICAgIHRoaXMuX3doZXJlLiRhbmQgPSBxdWVyeUpTT047XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjb25zdHJhaW50IHRoYXQgbm9uZSBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMgbWF0Y2guXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHF1ZXJpZXNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBfbm9yUXVlcnkocXVlcmllcykge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9ICgwLCBfbWFwLmRlZmF1bHQpKHF1ZXJpZXMpLmNhbGwocXVlcmllcywgcSA9PiB7XG4gICAgICByZXR1cm4gcS50b0pTT04oKS53aGVyZTtcbiAgICB9KTtcbiAgICB0aGlzLl93aGVyZS4kbm9yID0gcXVlcnlKU09OO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmb3IgY29uZGl0aW9uIHF1ZXJpZXNcbiAgICpcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcGFyYW0gY29uZGl0aW9uXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9XG4gICAqL1xuICBfYWRkQ29uZGl0aW9uKGtleSwgY29uZGl0aW9uLCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy5fd2hlcmVba2V5XSB8fCB0eXBlb2YgdGhpcy5fd2hlcmVba2V5XSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3doZXJlW2tleV0gPSB7fTtcbiAgICB9XG4gICAgdGhpcy5fd2hlcmVba2V5XVtjb25kaXRpb25dID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkodmFsdWUsIGZhbHNlLCB0cnVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBzdHJpbmcgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBhdCB0aGUgYmVnaW5uaW5nXG4gICAqXG4gICAqIEBwYXJhbSBzdHJpbmdcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIF9yZWdleFN0YXJ0V2l0aChzdHJpbmcpIHtcbiAgICByZXR1cm4gJ14nICsgcXVvdGUoc3RyaW5nKTtcbiAgfVxuICBhc3luYyBfaGFuZGxlT2ZmbGluZVF1ZXJ5KHBhcmFtcykge1xuICAgIHZhciBfY29udGV4dDtcbiAgICBfT2ZmbGluZVF1ZXJ5LmRlZmF1bHQudmFsaWRhdGVRdWVyeSh0aGlzKTtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgY29uc3Qgb2JqZWN0cyA9IGF3YWl0IGxvY2FsRGF0YXN0b3JlLl9zZXJpYWxpemVPYmplY3RzRnJvbVBpbk5hbWUodGhpcy5fbG9jYWxEYXRhc3RvcmVQaW5OYW1lKTtcbiAgICBsZXQgcmVzdWx0cyA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKF9jb250ZXh0ID0gKDAsIF9tYXAuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCAoanNvbiwgaW5kZXgsIGFycikgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0ID0gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04oanNvbiwgZmFsc2UpO1xuICAgICAgaWYgKGpzb24uX2xvY2FsSWQgJiYgIWpzb24ub2JqZWN0SWQpIHtcbiAgICAgICAgb2JqZWN0Ll9sb2NhbElkID0ganNvbi5fbG9jYWxJZDtcbiAgICAgIH1cbiAgICAgIGlmICghX09mZmxpbmVRdWVyeS5kZWZhdWx0Lm1hdGNoZXNRdWVyeSh0aGlzLmNsYXNzTmFtZSwgb2JqZWN0LCBhcnIsIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KSkuY2FsbChfY29udGV4dCwgb2JqZWN0ID0+IG9iamVjdCAhPT0gbnVsbCk7XG4gICAgaWYgKCgwLCBfa2V5czIuZGVmYXVsdCkocGFyYW1zKSkge1xuICAgICAgbGV0IGtleXMgPSAoMCwgX2tleXMyLmRlZmF1bHQpKHBhcmFtcykuc3BsaXQoJywnKTtcbiAgICAgIGtleXMgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIFsnY2xhc3NOYW1lJywgJ29iamVjdElkJywgJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnLCAnQUNMJ10pO1xuICAgICAgcmVzdWx0cyA9ICgwLCBfbWFwLmRlZmF1bHQpKHJlc3VsdHMpLmNhbGwocmVzdWx0cywgb2JqZWN0ID0+IHtcbiAgICAgICAgdmFyIF9jb250ZXh0MjtcbiAgICAgICAgY29uc3QganNvbiA9IG9iamVjdC5fdG9GdWxsSlNPTigpO1xuICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQyID0gKDAsIF9rZXlzLmRlZmF1bHQpKGpzb24pKS5jYWxsKF9jb250ZXh0Miwga2V5ID0+IHtcbiAgICAgICAgICBpZiAoISgwLCBfaW5jbHVkZXMuZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkpKSB7XG4gICAgICAgICAgICBkZWxldGUganNvbltrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTihqc29uLCBmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5vcmRlcikge1xuICAgICAgY29uc3Qgc29ydHMgPSBwYXJhbXMub3JkZXIuc3BsaXQoJywnKTtcbiAgICAgICgwLCBfc29ydC5kZWZhdWx0KShyZXN1bHRzKS5jYWxsKHJlc3VsdHMsIChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiBoYW5kbGVPZmZsaW5lU29ydChhLCBiLCBzb3J0cyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgbGV0IGNvdW50OyAvLyBjb3VudCB0b3RhbCBiZWZvcmUgYXBwbHlpbmcgbGltaXQvc2tpcFxuICAgIGlmIChwYXJhbXMuY291bnQpIHtcbiAgICAgIGNvdW50ID0gcmVzdWx0cy5sZW5ndGg7IC8vIHRvdGFsIGNvdW50IGZyb20gcmVzcG9uc2VcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5za2lwKSB7XG4gICAgICBpZiAocGFyYW1zLnNraXAgPj0gcmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0cyA9ICgwLCBfc3BsaWNlLmRlZmF1bHQpKHJlc3VsdHMpLmNhbGwocmVzdWx0cywgcGFyYW1zLnNraXAsIHJlc3VsdHMubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGxpbWl0ID0gcmVzdWx0cy5sZW5ndGg7XG4gICAgaWYgKHBhcmFtcy5saW1pdCAhPT0gMCAmJiBwYXJhbXMubGltaXQgPCByZXN1bHRzLmxlbmd0aCkge1xuICAgICAgbGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuICAgIHJlc3VsdHMgPSAoMCwgX3NwbGljZS5kZWZhdWx0KShyZXN1bHRzKS5jYWxsKHJlc3VsdHMsIDAsIGxpbWl0KTtcbiAgICBpZiAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0cyxcbiAgICAgICAgY291bnRcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBxdWVyeS5cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICB3aGVyZTogdGhpcy5fd2hlcmVcbiAgICB9O1xuICAgIGlmICh0aGlzLl93YXRjaC5sZW5ndGgpIHtcbiAgICAgIHBhcmFtcy53YXRjaCA9IHRoaXMuX3dhdGNoLmpvaW4oJywnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGUubGVuZ3RoKSB7XG4gICAgICBwYXJhbXMuaW5jbHVkZSA9IHRoaXMuX2luY2x1ZGUuam9pbignLCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXhjbHVkZS5sZW5ndGgpIHtcbiAgICAgIHBhcmFtcy5leGNsdWRlS2V5cyA9IHRoaXMuX2V4Y2x1ZGUuam9pbignLCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2VsZWN0KSB7XG4gICAgICBwYXJhbXMua2V5cyA9IHRoaXMuX3NlbGVjdC5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb3VudCkge1xuICAgICAgcGFyYW1zLmNvdW50ID0gMTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbWl0ID49IDApIHtcbiAgICAgIHBhcmFtcy5saW1pdCA9IHRoaXMuX2xpbWl0O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2tpcCA+IDApIHtcbiAgICAgIHBhcmFtcy5za2lwID0gdGhpcy5fc2tpcDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29yZGVyKSB7XG4gICAgICBwYXJhbXMub3JkZXIgPSB0aGlzLl9vcmRlci5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZWFkUHJlZmVyZW5jZSkge1xuICAgICAgcGFyYW1zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5fcmVhZFByZWZlcmVuY2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbmNsdWRlUmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHBhcmFtcy5pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSB0aGlzLl9pbmNsdWRlUmVhZFByZWZlcmVuY2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgICBwYXJhbXMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IHRoaXMuX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9oaW50KSB7XG4gICAgICBwYXJhbXMuaGludCA9IHRoaXMuX2hpbnQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9leHBsYWluKSB7XG4gICAgICBwYXJhbXMuZXhwbGFpbiA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb21tZW50KSB7XG4gICAgICBwYXJhbXMuY29tbWVudCA9IHRoaXMuX2NvbW1lbnQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX2V4dHJhT3B0aW9ucykge1xuICAgICAgcGFyYW1zW2tleV0gPSB0aGlzLl9leHRyYU9wdGlvbnNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBxdWVyeSB3aXRoIGNvbmRpdGlvbnMgZnJvbSBqc29uLCBjYW4gYmUgdXNlZnVsIHRvIHNlbmQgcXVlcnkgZnJvbSBzZXJ2ZXIgc2lkZSB0byBjbGllbnRcbiAgICogTm90IHN0YXRpYywgYWxsIHF1ZXJ5IGNvbmRpdGlvbnMgd2FzIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGJlIGRlbGV0ZWQuXG4gICAqIEZvciBleGFtcGxlIG9uIHRoZSBzZXJ2ZXIgc2lkZSB3ZSBoYXZlXG4gICAqIHZhciBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShcImNsYXNzTmFtZVwiKTtcbiAgICogcXVlcnkuZXF1YWxUbyhrZXk6IHZhbHVlKTtcbiAgICogcXVlcnkubGltaXQoMTAwKTtcbiAgICogLi4uIChvdGhlcnMgcXVlcmllcylcbiAgICogQ3JlYXRlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgUXVlcnkgT2JqZWN0XG4gICAqIHZhciBqc29uRnJvbVNlcnZlciA9IHF1ZXJ5LmZyb21KU09OKCk7XG4gICAqXG4gICAqIE9uIGNsaWVudCBzaWRlIGdldHRpbmcgcXVlcnk6XG4gICAqIHZhciBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShcImNsYXNzTmFtZVwiKTtcbiAgICogcXVlcnkuZnJvbUpTT04oanNvbkZyb21TZXJ2ZXIpO1xuICAgKlxuICAgKiBhbmQgY29udGludWUgdG8gcXVlcnkuLi5cbiAgICogcXVlcnkuc2tpcCgxMDApLmZpbmQoKS50aGVuKC4uLik7XG4gICAqXG4gICAqIEBwYXJhbSB7UXVlcnlKU09OfSBqc29uIGZyb20gUGFyc2UuUXVlcnkudG9KU09OKCkgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aEpTT04oanNvbikge1xuICAgIGlmIChqc29uLndoZXJlKSB7XG4gICAgICB0aGlzLl93aGVyZSA9IGpzb24ud2hlcmU7XG4gICAgfVxuICAgIGlmIChqc29uLndhdGNoKSB7XG4gICAgICB0aGlzLl93YXRjaCA9IGpzb24ud2F0Y2guc3BsaXQoJywnKTtcbiAgICB9XG4gICAgaWYgKGpzb24uaW5jbHVkZSkge1xuICAgICAgdGhpcy5faW5jbHVkZSA9IGpzb24uaW5jbHVkZS5zcGxpdCgnLCcpO1xuICAgIH1cbiAgICBpZiAoKDAsIF9rZXlzMi5kZWZhdWx0KShqc29uKSkge1xuICAgICAgdGhpcy5fc2VsZWN0ID0gKDAsIF9rZXlzMi5kZWZhdWx0KShqc29uKS5zcGxpdCgnLCcpO1xuICAgIH1cbiAgICBpZiAoanNvbi5leGNsdWRlS2V5cykge1xuICAgICAgdGhpcy5fZXhjbHVkZSA9IGpzb24uZXhjbHVkZUtleXMuc3BsaXQoJywnKTtcbiAgICB9XG4gICAgaWYgKGpzb24uY291bnQpIHtcbiAgICAgIHRoaXMuX2NvdW50ID0ganNvbi5jb3VudCA9PT0gMTtcbiAgICB9XG4gICAgaWYgKGpzb24ubGltaXQpIHtcbiAgICAgIHRoaXMuX2xpbWl0ID0ganNvbi5saW1pdDtcbiAgICB9XG4gICAgaWYgKGpzb24uc2tpcCkge1xuICAgICAgdGhpcy5fc2tpcCA9IGpzb24uc2tpcDtcbiAgICB9XG4gICAgaWYgKGpzb24ub3JkZXIpIHtcbiAgICAgIHRoaXMuX29yZGVyID0ganNvbi5vcmRlci5zcGxpdCgnLCcpO1xuICAgIH1cbiAgICBpZiAoanNvbi5yZWFkUHJlZmVyZW5jZSkge1xuICAgICAgdGhpcy5fcmVhZFByZWZlcmVuY2UgPSBqc29uLnJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAoanNvbi5pbmNsdWRlUmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHRoaXMuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IGpzb24uaW5jbHVkZVJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAoanNvbi5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgICB0aGlzLl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0ganNvbi5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAoanNvbi5oaW50KSB7XG4gICAgICB0aGlzLl9oaW50ID0ganNvbi5oaW50O1xuICAgIH1cbiAgICBpZiAoanNvbi5leHBsYWluKSB7XG4gICAgICB0aGlzLl9leHBsYWluID0gISFqc29uLmV4cGxhaW47XG4gICAgfVxuICAgIGlmIChqc29uLmNvbW1lbnQpIHtcbiAgICAgIHRoaXMuX2NvbW1lbnQgPSBqc29uLmNvbW1lbnQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGpzb24pIHtcbiAgICAgIGlmIChqc29uLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0MztcbiAgICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShfY29udGV4dDMgPSBbJ3doZXJlJywgJ2luY2x1ZGUnLCAna2V5cycsICdjb3VudCcsICdsaW1pdCcsICdza2lwJywgJ29yZGVyJywgJ3JlYWRQcmVmZXJlbmNlJywgJ2luY2x1ZGVSZWFkUHJlZmVyZW5jZScsICdzdWJxdWVyeVJlYWRQcmVmZXJlbmNlJywgJ2hpbnQnLCAnZXhwbGFpbicsICdjb21tZW50J10pLmNhbGwoX2NvbnRleHQzLCBrZXkpID09PSAtMSkge1xuICAgICAgICAgIHRoaXMuX2V4dHJhT3B0aW9uc1trZXldID0ganNvbltrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2QgdG8gcmVzdG9yZSBQYXJzZS5RdWVyeSBieSBqc29uIHJlcHJlc2VudGF0aW9uXG4gICAqIEludGVybmFsbHkgY2FsbGluZyBQYXJzZS5RdWVyeS53aXRoSlNPTlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG4gICAqIEBwYXJhbSB7UXVlcnlKU09OfSBqc29uIGZyb20gUGFyc2UuUXVlcnkudG9KU09OKCkgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gbmV3IGNyZWF0ZWQgcXVlcnlcbiAgICovXG4gIHN0YXRpYyBmcm9tSlNPTihjbGFzc05hbWUsIGpzb24pIHtcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIHF1ZXJ5LndpdGhKU09OKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBQYXJzZS5PYmplY3Qgd2hvc2UgaWQgaXMgYWxyZWFkeSBrbm93biBieSBmZXRjaGluZyBkYXRhIGZyb21cbiAgICogdGhlIHNlcnZlci4gVW5saWtlIHRoZSA8Y29kZT5maXJzdDwvY29kZT4gbWV0aG9kLCBpdCBuZXZlciByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdElkIFRoZSBpZCBvZiB0aGUgb2JqZWN0IHRvIGJlIGZldGNoZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZUZpbmRgIHRyaWdnZXIuXG4gICAqICAgPGxpPmpzb246IFJldHVybiByYXcganNvbiB3aXRob3V0IGNvbnZlcnRpbmcgdG8gUGFyc2UuT2JqZWN0XG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgZ2V0KG9iamVjdElkLCBvcHRpb25zKSB7XG4gICAgdGhpcy5lcXVhbFRvKCdvYmplY3RJZCcsIG9iamVjdElkKTtcbiAgICBjb25zdCBmaXJzdE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZmlyc3RPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZmlyc3RPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZpcnN0T3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KCdqc29uJykpIHtcbiAgICAgIGZpcnN0T3B0aW9ucy5qc29uID0gb3B0aW9ucy5qc29uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maXJzdChmaXJzdE9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yT2JqZWN0ID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PQkpFQ1RfTk9UX0ZPVU5ELCAnT2JqZWN0IG5vdCBmb3VuZC4nKTtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvck9iamVjdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBQYXJzZU9iamVjdHMgdGhhdCBzYXRpc2Z5IHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnNcbiAgICogYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZUZpbmRgIHRyaWdnZXIuXG4gICAqICAgPGxpPmpzb246IFJldHVybiByYXcganNvbiB3aXRob3V0IGNvbnZlcnRpbmcgdG8gUGFyc2UuT2JqZWN0XG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHRzIHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGZpbmQob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGZpbmRPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBmaW5kT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBmaW5kT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZmluZE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgdGhpcy5fc2V0UmVxdWVzdFRhc2soZmluZE9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRRdWVyeUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzZWxlY3QgPSB0aGlzLl9zZWxlY3Q7XG4gICAgaWYgKHRoaXMuX3F1ZXJpZXNMb2NhbERhdGFzdG9yZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZU9mZmxpbmVRdWVyeSh0aGlzLnRvSlNPTigpKTtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBfZmluZC5kZWZhdWx0KShjb250cm9sbGVyKS5jYWxsKGNvbnRyb2xsZXIsIHRoaXMuY2xhc3NOYW1lLCB0aGlzLnRvSlNPTigpLCBmaW5kT3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAvLyBSZXR1cm4gZ2VuZXJpYyBvYmplY3Qgd2hlbiBleHBsYWluIGlzIHVzZWRcbiAgICAgIGlmICh0aGlzLl9leHBsYWluKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHRzO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0cyA9IHJlc3BvbnNlLnJlc3VsdHM/Lm1hcChkYXRhID0+IHtcbiAgICAgICAgLy8gSW4gY2FzZXMgb2YgcmVsYXRpb25zLCB0aGUgc2VydmVyIG1heSBzZW5kIGJhY2sgYSBjbGFzc05hbWVcbiAgICAgICAgLy8gb24gdGhlIHRvcCBsZXZlbCBvZiB0aGUgcGF5bG9hZFxuICAgICAgICBjb25zdCBvdmVycmlkZSA9IHJlc3BvbnNlLmNsYXNzTmFtZSB8fCB0aGlzLmNsYXNzTmFtZTtcbiAgICAgICAgaWYgKCFkYXRhLmNsYXNzTmFtZSkge1xuICAgICAgICAgIGRhdGEuY2xhc3NOYW1lID0gb3ZlcnJpZGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5zIGtleXMgZm9yIGFsbCBvYmplY3RzIHRoYXRcbiAgICAgICAgLy8gaGF2ZSBiZWVuIHJlcXVlc3RlZCB3aXRoIGEgc2VsZWN0LCBzbyB0aGF0IG91ciBjYWNoZWQgc3RhdGVcbiAgICAgICAgLy8gdXBkYXRlcyBjb3JyZWN0bHkuXG4gICAgICAgIGlmIChzZWxlY3QpIHtcbiAgICAgICAgICBoYW5kbGVTZWxlY3RSZXN1bHQoZGF0YSwgc2VsZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKGRhdGEsICFzZWxlY3QpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNvdW50ID0gcmVzcG9uc2UuY291bnQ7XG4gICAgICBpZiAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc3VsdHMsXG4gICAgICAgICAgY291bnRcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIGNvbXBsZXRlIGxpc3Qgb2YgUGFyc2VPYmplY3RzIHRoYXQgc2F0aXNmeSB0aGlzIHF1ZXJ5LlxuICAgKiBVc2luZyBgZWFjaEJhdGNoYCB1bmRlciB0aGUgaG9vZCB0byBmZXRjaCBhbGwgdGhlIHZhbGlkIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+YmF0Y2hTaXplOiBIb3cgbWFueSBvYmplY3RzIHRvIHlpZWxkIGluIGVhY2ggYmF0Y2ggKGRlZmF1bHQ6IDEwMClcbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBmaW5kQWxsKG9wdGlvbnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgYXdhaXQgdGhpcy5lYWNoQmF0Y2gob2JqZWN0cyA9PiB7XG4gICAgICByZXN1bHQgPSBbLi4ucmVzdWx0LCAuLi5vYmplY3RzXTtcbiAgICB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgdGhhdCBtYXRjaCB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnVzZU1hc3RlcktleV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNlc3Npb25Ub2tlbl1cbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSBjb3VudCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBjb3VudChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZmluZE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRSZXF1ZXN0VGFzayhmaW5kT3B0aW9ucyk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFF1ZXJ5Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMudG9KU09OKCk7XG4gICAgcGFyYW1zLmxpbWl0ID0gMDtcbiAgICBwYXJhbXMuY291bnQgPSAxO1xuICAgIHJldHVybiAoMCwgX2ZpbmQuZGVmYXVsdCkoY29udHJvbGxlcikuY2FsbChjb250cm9sbGVyLCB0aGlzLmNsYXNzTmFtZSwgcGFyYW1zLCBmaW5kT3B0aW9ucykudGhlbihyZXN1bHQgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VsdC5jb3VudDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGRpc3RpbmN0IHF1ZXJ5IGFuZCByZXR1cm5zIHVuaXF1ZSB2YWx1ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBBIGZpZWxkIHRvIGZpbmQgZGlzdGluY3QgdmFsdWVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zZXNzaW9uVG9rZW5dIEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvbiBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgZGlzdGluY3Qoa2V5LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZGlzdGluY3RPcHRpb25zID0ge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGRpc3RpbmN0T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgdGhpcy5fc2V0UmVxdWVzdFRhc2soZGlzdGluY3RPcHRpb25zKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UXVlcnlDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgZGlzdGluY3Q6IGtleSxcbiAgICAgIHdoZXJlOiB0aGlzLl93aGVyZSxcbiAgICAgIGhpbnQ6IHRoaXMuX2hpbnRcbiAgICB9O1xuICAgIHJldHVybiBjb250cm9sbGVyLmFnZ3JlZ2F0ZSh0aGlzLmNsYXNzTmFtZSwgcGFyYW1zLCBkaXN0aW5jdE9wdGlvbnMpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSBhbmQgcmV0dXJucyBhZ2dyZWdhdGUgcmVzdWx0c1xuICAgKlxuICAgKiBAcGFyYW0geyhBcnJheXxvYmplY3QpfSBwaXBlbGluZSBBcnJheSBvciBPYmplY3Qgb2Ygc3RhZ2VzIHRvIHByb2Nlc3MgcXVlcnlcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNlc3Npb25Ub2tlbl0gQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBhZ2dyZWdhdGUocGlwZWxpbmUsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBhZ2dyZWdhdGVPcHRpb25zID0ge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGFnZ3JlZ2F0ZU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIHRoaXMuX3NldFJlcXVlc3RUYXNrKGFnZ3JlZ2F0ZU9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRRdWVyeUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KShwaXBlbGluZSkgJiYgdHlwZW9mIHBpcGVsaW5lICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBpcGVsaW5lIG11c3QgYmUgQXJyYXkgb3IgT2JqZWN0Jyk7XG4gICAgfVxuICAgIGlmICgoMCwgX2tleXMuZGVmYXVsdCkodGhpcy5fd2hlcmUgfHwge30pLmxlbmd0aCkge1xuICAgICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkocGlwZWxpbmUpKSB7XG4gICAgICAgIHBpcGVsaW5lID0gW3BpcGVsaW5lXTtcbiAgICAgIH1cbiAgICAgIHBpcGVsaW5lLnVuc2hpZnQoe1xuICAgICAgICAkbWF0Y2g6IHRoaXMuX3doZXJlXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgcGlwZWxpbmUsXG4gICAgICBoaW50OiB0aGlzLl9oaW50LFxuICAgICAgZXhwbGFpbjogdGhpcy5fZXhwbGFpbixcbiAgICAgIHJlYWRQcmVmZXJlbmNlOiB0aGlzLl9yZWFkUHJlZmVyZW5jZVxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuYWdncmVnYXRlKHRoaXMuY2xhc3NOYW1lLCBwYXJhbXMsIGFnZ3JlZ2F0ZU9wdGlvbnMpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhdCBtb3N0IG9uZSBQYXJzZS5PYmplY3QgdGhhdCBzYXRpc2ZpZXMgdGhpcyBxdWVyeS5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgb2JqZWN0IGlmIHRoZXJlIGlzIG9uZSwgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRmluZGAgdHJpZ2dlci5cbiAgICogICA8bGk+anNvbjogUmV0dXJuIHJhdyBqc29uIHdpdGhvdXQgY29udmVydGluZyB0byBQYXJzZS5PYmplY3RcbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIG9iamVjdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBmaXJzdCgpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY29uc3QgZmluZE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBmaW5kT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICB0aGlzLl9zZXRSZXF1ZXN0VGFzayhmaW5kT3B0aW9ucyk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFF1ZXJ5Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMudG9KU09OKCk7XG4gICAgcGFyYW1zLmxpbWl0ID0gMTtcbiAgICBjb25zdCBzZWxlY3QgPSB0aGlzLl9zZWxlY3Q7XG4gICAgaWYgKHRoaXMuX3F1ZXJpZXNMb2NhbERhdGFzdG9yZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZU9mZmxpbmVRdWVyeShwYXJhbXMpLnRoZW4ob2JqZWN0cyA9PiB7XG4gICAgICAgIGlmICghb2JqZWN0c1swXSkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdHNbMF07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBfZmluZC5kZWZhdWx0KShjb250cm9sbGVyKS5jYWxsKGNvbnRyb2xsZXIsIHRoaXMuY2xhc3NOYW1lLCBwYXJhbXMsIGZpbmRPcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdHMgPSByZXNwb25zZS5yZXN1bHRzO1xuICAgICAgaWYgKCFvYmplY3RzWzBdKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoIW9iamVjdHNbMF0uY2xhc3NOYW1lKSB7XG4gICAgICAgIG9iamVjdHNbMF0uY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGF0YSBvYmplY3QgY29udGFpbnMga2V5cyBmb3IgYWxsIG9iamVjdHMgdGhhdFxuICAgICAgLy8gaGF2ZSBiZWVuIHJlcXVlc3RlZCB3aXRoIGEgc2VsZWN0LCBzbyB0aGF0IG91ciBjYWNoZWQgc3RhdGVcbiAgICAgIC8vIHVwZGF0ZXMgY29ycmVjdGx5LlxuICAgICAgaWYgKHNlbGVjdCkge1xuICAgICAgICBoYW5kbGVTZWxlY3RSZXN1bHQob2JqZWN0c1swXSwgc2VsZWN0KTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdHNbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04ob2JqZWN0c1swXSwgIXNlbGVjdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciBvYmplY3RzIG1hdGNoaW5nIGEgcXVlcnksIGNhbGxpbmcgYSBjYWxsYmFjayBmb3IgZWFjaCBiYXRjaC5cbiAgICogSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSBwcm9taXNlLCB0aGUgaXRlcmF0aW9uIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsXG4gICAqIHRoYXQgcHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcmVqZWN0ZWRcbiAgICogcHJvbWlzZSwgdGhlbiBpdGVyYXRpb24gd2lsbCBzdG9wIHdpdGggdGhhdCBlcnJvci4gVGhlIGl0ZW1zIGFyZSBwcm9jZXNzZWRcbiAgICogaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIuIFRoZSBxdWVyeSBtYXkgbm90IGhhdmUgYW55IHNvcnQgb3JkZXIsIGFuZCBtYXlcbiAgICogbm90IHVzZSBsaW1pdCBvciBza2lwLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggZWFjaCByZXN1bHRcbiAgICogICAgIG9mIHRoZSBxdWVyeS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT5iYXRjaFNpemU6IEhvdyBtYW55IG9iamVjdHMgdG8geWllbGQgaW4gZWFjaCBiYXRjaCAoZGVmYXVsdDogMTAwKVxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRmluZGAgdHJpZ2dlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlXG4gICAqICAgICBpdGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIGVhY2hCYXRjaChjYWxsYmFjaywgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmICh0aGlzLl9vcmRlciB8fCB0aGlzLl9za2lwIHx8IHRoaXMuX2xpbWl0ID49IDApIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnQ2Fubm90IGl0ZXJhdGUgb24gYSBxdWVyeSB3aXRoIHNvcnQsIHNraXAsIG9yIGxpbWl0LicpO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KHRoaXMuY2xhc3NOYW1lKTtcbiAgICBxdWVyeS5fbGltaXQgPSBvcHRpb25zLmJhdGNoU2l6ZSB8fCAxMDA7XG4gICAgcXVlcnkuX2luY2x1ZGUgPSBbLi4udGhpcy5faW5jbHVkZV07XG4gICAgcXVlcnkuX2V4Y2x1ZGUgPSBbLi4udGhpcy5fZXhjbHVkZV07XG4gICAgaWYgKHRoaXMuX3NlbGVjdCkge1xuICAgICAgcXVlcnkuX3NlbGVjdCA9IFsuLi50aGlzLl9zZWxlY3RdO1xuICAgIH1cbiAgICBxdWVyeS5faGludCA9IHRoaXMuX2hpbnQ7XG4gICAgcXVlcnkuX3doZXJlID0ge307XG4gICAgZm9yIChjb25zdCBhdHRyIGluIHRoaXMuX3doZXJlKSB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLl93aGVyZVthdHRyXTtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsKSkge1xuICAgICAgICBxdWVyeS5fd2hlcmVbYXR0cl0gPSAoMCwgX21hcC5kZWZhdWx0KSh2YWwpLmNhbGwodmFsLCB2ID0+IHtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBjb25kaXRpb25NYXAgPSB7fTtcbiAgICAgICAgcXVlcnkuX3doZXJlW2F0dHJdID0gY29uZGl0aW9uTWFwO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmQgaW4gdmFsKSB7XG4gICAgICAgICAgY29uZGl0aW9uTWFwW2NvbmRdID0gdmFsW2NvbmRdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS5fd2hlcmVbYXR0cl0gPSB2YWw7XG4gICAgICB9XG4gICAgfVxuICAgIHF1ZXJ5LmFzY2VuZGluZygnb2JqZWN0SWQnKTtcbiAgICBjb25zdCBmaW5kT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZmluZE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZmluZE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZpbmRPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdqc29uJykpIHtcbiAgICAgIGZpbmRPcHRpb25zLmpzb24gPSBvcHRpb25zLmpzb247XG4gICAgfVxuICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICAgIGxldCBwcmV2aW91c1Jlc3VsdHMgPSBbXTtcbiAgICByZXR1cm4gKDAsIF9wcm9taXNlVXRpbHMuY29udGludWVXaGlsZSkoKCkgPT4ge1xuICAgICAgcmV0dXJuICFmaW5pc2hlZDtcbiAgICB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBbcmVzdWx0c10gPSBhd2FpdCBfcHJvbWlzZS5kZWZhdWx0LmFsbChbKDAsIF9maW5kLmRlZmF1bHQpKHF1ZXJ5KS5jYWxsKHF1ZXJ5LCBmaW5kT3B0aW9ucyksIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShwcmV2aW91c1Jlc3VsdHMubGVuZ3RoID4gMCAmJiBjYWxsYmFjayhwcmV2aW91c1Jlc3VsdHMpKV0pO1xuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID49IHF1ZXJ5Ll9saW1pdCkge1xuICAgICAgICBxdWVyeS5ncmVhdGVyVGhhbignb2JqZWN0SWQnLCByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uaWQpO1xuICAgICAgICBwcmV2aW91c1Jlc3VsdHMgPSByZXN1bHRzO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNhbGxiYWNrKHJlc3VsdHMpKTtcbiAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgZWFjaCByZXN1bHQgb2YgYSBxdWVyeSwgY2FsbGluZyBhIGNhbGxiYWNrIGZvciBlYWNoIG9uZS4gSWZcbiAgICogdGhlIGNhbGxiYWNrIHJldHVybnMgYSBwcm9taXNlLCB0aGUgaXRlcmF0aW9uIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsXG4gICAqIHRoYXQgcHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcmVqZWN0ZWRcbiAgICogcHJvbWlzZSwgdGhlbiBpdGVyYXRpb24gd2lsbCBzdG9wIHdpdGggdGhhdCBlcnJvci4gVGhlIGl0ZW1zIGFyZVxuICAgKiBwcm9jZXNzZWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIuIFRoZSBxdWVyeSBtYXkgbm90IGhhdmUgYW55IHNvcnQgb3JkZXIsXG4gICAqIGFuZCBtYXkgbm90IHVzZSBsaW1pdCBvciBza2lwLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggZWFjaCByZXN1bHRcbiAgICogICAgIG9mIHRoZSBxdWVyeS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmpzb246IFJldHVybiByYXcganNvbiB3aXRob3V0IGNvbnZlcnRpbmcgdG8gUGFyc2UuT2JqZWN0XG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZVxuICAgKiAgICAgaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBlYWNoKGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaEJhdGNoKHJlc3VsdHMgPT4ge1xuICAgICAgbGV0IGNhbGxiYWNrc0RvbmUgPSBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShyZXN1bHRzKS5jYWxsKHJlc3VsdHMsIHJlc3VsdCA9PiB7XG4gICAgICAgIGNhbGxiYWNrc0RvbmUgPSBjYWxsYmFja3NEb25lLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrc0RvbmU7XG4gICAgfSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGhpbnQgdG8gZm9yY2UgaW5kZXggc2VsZWN0aW9uLiAoaHR0cHM6Ly9kb2NzLm1vbmdvZGIuY29tL21hbnVhbC9yZWZlcmVuY2Uvb3BlcmF0b3IvbWV0YS9oaW50LylcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdCl9IHZhbHVlIFN0cmluZyBvciBPYmplY3Qgb2YgaW5kZXggdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIGV4ZWN1dGluZyBxdWVyeVxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGhpbnQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgZGVsZXRlIHRoaXMuX2hpbnQ7XG4gICAgfVxuICAgIHRoaXMuX2hpbnQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZlc3RpZ2F0ZXMgdGhlIHF1ZXJ5IGV4ZWN1dGlvbiBwbGFuLiBVc2VmdWwgZm9yIG9wdGltaXppbmcgcXVlcmllcy4gKGh0dHBzOi8vZG9jcy5tb25nb2RiLmNvbS9tYW51YWwvcmVmZXJlbmNlL29wZXJhdG9yL21ldGEvZXhwbGFpbi8pXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXhwbGFpbiBVc2VkIHRvIHRvZ2dsZSB0aGUgaW5mb3JtYXRpb24gb24gdGhlIHF1ZXJ5IHBsYW4uXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZXhwbGFpbigpIHtcbiAgICBsZXQgZXhwbGFpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGV4cGxhaW4gIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2FuIG9ubHkgc2V0IGV4cGxhaW4gdG8gYSBib29sZWFuIHZhbHVlJyk7XG4gICAgfVxuICAgIHRoaXMuX2V4cGxhaW4gPSBleHBsYWluO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgZWFjaCByZXN1bHQgb2YgYSBxdWVyeSwgY2FsbGluZyBhIGNhbGxiYWNrIGZvciBlYWNoIG9uZS4gSWZcbiAgICogdGhlIGNhbGxiYWNrIHJldHVybnMgYSBwcm9taXNlLCB0aGUgaXRlcmF0aW9uIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsXG4gICAqIHRoYXQgcHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcmVqZWN0ZWRcbiAgICogcHJvbWlzZSwgdGhlbiBpdGVyYXRpb24gd2lsbCBzdG9wIHdpdGggdGhhdCBlcnJvci4gVGhlIGl0ZW1zIGFyZVxuICAgKiBwcm9jZXNzZWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIuIFRoZSBxdWVyeSBtYXkgbm90IGhhdmUgYW55IHNvcnQgb3JkZXIsXG4gICAqIGFuZCBtYXkgbm90IHVzZSBsaW1pdCBvciBza2lwLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayA8dWw+XG4gICAqICAgPGxpPmN1cnJlbnRPYmplY3Q6IFRoZSBjdXJyZW50IFBhcnNlLk9iamVjdCBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIGFycmF5LjwvbGk+XG4gICAqICAgPGxpPmluZGV4OiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgUGFyc2UuT2JqZWN0IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgYXJyYXkuPC9saT5cbiAgICogICA8bGk+cXVlcnk6IFRoZSBxdWVyeSBtYXAgd2FzIGNhbGxlZCB1cG9uLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgb25jZSB0aGVcbiAgICogICAgIGl0ZXJhdGlvbiBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgYXN5bmMgbWFwKGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGF3YWl0IHRoaXMuZWFjaChvYmplY3QgPT4ge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjYWxsYmFjayhvYmplY3QsIGluZGV4LCB0aGlzKSkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBhcnJheS5wdXNoKHJlc3VsdCk7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9KTtcbiAgICB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciBlYWNoIHJlc3VsdCBvZiBhIHF1ZXJ5LCBjYWxsaW5nIGEgY2FsbGJhY2sgZm9yIGVhY2ggb25lLiBJZlxuICAgKiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHByb21pc2UsIHRoZSBpdGVyYXRpb24gd2lsbCBub3QgY29udGludWUgdW50aWxcbiAgICogdGhhdCBwcm9taXNlIGhhcyBiZWVuIGZ1bGZpbGxlZC4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSByZWplY3RlZFxuICAgKiBwcm9taXNlLCB0aGVuIGl0ZXJhdGlvbiB3aWxsIHN0b3Agd2l0aCB0aGF0IGVycm9yLiBUaGUgaXRlbXMgYXJlXG4gICAqIHByb2Nlc3NlZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlci4gVGhlIHF1ZXJ5IG1heSBub3QgaGF2ZSBhbnkgc29ydCBvcmRlcixcbiAgICogYW5kIG1heSBub3QgdXNlIGxpbWl0IG9yIHNraXAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIDx1bD5cbiAgICogICA8bGk+YWNjdW11bGF0b3I6IFRoZSBhY2N1bXVsYXRvciBhY2N1bXVsYXRlcyB0aGUgY2FsbGJhY2sncyByZXR1cm4gdmFsdWVzLiBJdCBpcyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgcHJldmlvdXNseSByZXR1cm5lZCBpbiB0aGUgbGFzdCBpbnZvY2F0aW9uIG9mIHRoZSBjYWxsYmFjay48L2xpPlxuICAgKiAgIDxsaT5jdXJyZW50T2JqZWN0OiBUaGUgY3VycmVudCBQYXJzZS5PYmplY3QgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBhcnJheS48L2xpPlxuICAgKiAgIDxsaT5pbmRleDogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IFBhcnNlLk9iamVjdCBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIGFycmF5LjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7Kn0gaW5pdGlhbFZhbHVlIEEgdmFsdWUgdG8gdXNlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZmlyc3QgY2FsbCBvZiB0aGUgY2FsbGJhY2suIElmIG5vIGluaXRpYWxWYWx1ZSBpcyBzdXBwbGllZCwgdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgcXVlcnkgd2lsbCBiZSB1c2VkIGFuZCBza2lwcGVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlXG4gICAqICAgICBpdGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIGFzeW5jIHJlZHVjZShjYWxsYmFjaywgaW5pdGlhbFZhbHVlLCBvcHRpb25zKSB7XG4gICAgbGV0IGFjY3VtdWxhdG9yID0gaW5pdGlhbFZhbHVlO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgYXdhaXQgdGhpcy5lYWNoKG9iamVjdCA9PiB7XG4gICAgICAvLyBJZiBubyBpbml0aWFsIHZhbHVlIHdhcyBnaXZlbiwgd2UgdGFrZSB0aGUgZmlyc3Qgb2JqZWN0IGZyb20gdGhlIHF1ZXJ5XG4gICAgICAvLyBhcyB0aGUgaW5pdGlhbCB2YWx1ZSBhbmQgZG9uJ3QgY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBpdC5cbiAgICAgIGlmIChpbmRleCA9PT0gMCAmJiBpbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2N1bXVsYXRvciA9IG9iamVjdDtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjYWxsYmFjayhhY2N1bXVsYXRvciwgb2JqZWN0LCBpbmRleCkpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgYWNjdW11bGF0b3IgPSByZXN1bHQ7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9KTtcbiAgICB9LCBvcHRpb25zKTtcbiAgICBpZiAoaW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE1hdGNoIEFycmF5LnJlZHVjZSBiZWhhdmlvcjogXCJDYWxsaW5nIHJlZHVjZSgpIG9uIGFuIGVtcHR5IGFycmF5XG4gICAgICAvLyB3aXRob3V0IGFuIGluaXRpYWxWYWx1ZSB3aWxsIHRocm93IGEgVHlwZUVycm9yXCIuXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWR1Y2luZyBlbXB0eSBxdWVyeSByZXN1bHQgc2V0IHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciBlYWNoIHJlc3VsdCBvZiBhIHF1ZXJ5LCBjYWxsaW5nIGEgY2FsbGJhY2sgZm9yIGVhY2ggb25lLiBJZlxuICAgKiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHByb21pc2UsIHRoZSBpdGVyYXRpb24gd2lsbCBub3QgY29udGludWUgdW50aWxcbiAgICogdGhhdCBwcm9taXNlIGhhcyBiZWVuIGZ1bGZpbGxlZC4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSByZWplY3RlZFxuICAgKiBwcm9taXNlLCB0aGVuIGl0ZXJhdGlvbiB3aWxsIHN0b3Agd2l0aCB0aGF0IGVycm9yLiBUaGUgaXRlbXMgYXJlXG4gICAqIHByb2Nlc3NlZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlci4gVGhlIHF1ZXJ5IG1heSBub3QgaGF2ZSBhbnkgc29ydCBvcmRlcixcbiAgICogYW5kIG1heSBub3QgdXNlIGxpbWl0IG9yIHNraXAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIDx1bD5cbiAgICogICA8bGk+Y3VycmVudE9iamVjdDogVGhlIGN1cnJlbnQgUGFyc2UuT2JqZWN0IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgYXJyYXkuPC9saT5cbiAgICogICA8bGk+aW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBQYXJzZS5PYmplY3QgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBhcnJheS48L2xpPlxuICAgKiAgIDxsaT5xdWVyeTogVGhlIHF1ZXJ5IGZpbHRlciB3YXMgY2FsbGVkIHVwb24uPC9saT5cbiAgICogPC91bD5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZVxuICAgKiAgICAgaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBhc3luYyBmaWx0ZXIoY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBjb25zdCBhcnJheSA9IFtdO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgYXdhaXQgdGhpcy5lYWNoKG9iamVjdCA9PiB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNhbGxiYWNrKG9iamVjdCwgaW5kZXgsIHRoaXMpKS50aGVuKGZsYWcgPT4ge1xuICAgICAgICBpZiAoZmxhZykge1xuICAgICAgICAgIGFycmF5LnB1c2gob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfSk7XG4gICAgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyogUXVlcnkgQ29uZGl0aW9ucyAqL1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgUGFyc2UuT2JqZWN0IG11c3QgY29udGFpbi5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBlcXVhbFRvKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX2NvbnRleHQ0O1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NCA9ICgwLCBfZW50cmllcy5kZWZhdWx0KShrZXkpKS5jYWxsKF9jb250ZXh0NCwgX3JlZiA9PiB7XG4gICAgICAgIGxldCBbaywgdmFsXSA9IF9yZWY7XG4gICAgICAgIHJldHVybiB0aGlzLmVxdWFsVG8oaywgdmFsKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2VzTm90RXhpc3Qoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5fd2hlcmVba2V5XSA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHZhbHVlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIG5vdCBlcXVhbCB0byB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IG11c3Qgbm90IGJlIGVxdWFsbGVkLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIG5vdEVxdWFsVG8oa2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgJiYgdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBfY29udGV4dDU7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ1ID0gKDAsIF9lbnRyaWVzLmRlZmF1bHQpKGtleSkpLmNhbGwoX2NvbnRleHQ1LCBfcmVmMiA9PiB7XG4gICAgICAgIGxldCBbaywgdmFsXSA9IF9yZWYyO1xuICAgICAgICByZXR1cm4gdGhpcy5ub3RFcXVhbFRvKGssIHZhbCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRuZScsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgbGVzcyB0aGFuIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgcHJvdmlkZXMgYW4gdXBwZXIgYm91bmQuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbGVzc1RoYW4oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGx0JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBncmVhdGVyIHRoYW4gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCBwcm92aWRlcyBhbiBsb3dlciBib3VuZC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBncmVhdGVyVGhhbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZ3QnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHByb3ZpZGVzIGFuIHVwcGVyIGJvdW5kLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGxlc3NUaGFuT3JFcXVhbFRvKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRsdGUnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCBwcm92aWRlcyBhbiBsb3dlciBib3VuZC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBncmVhdGVyVGhhbk9yRXF1YWxUbyhrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZ3RlJywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBjb250YWluZWQgaW4gdGhlIHByb3ZpZGVkIGxpc3Qgb2YgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB7QXJyYXk8Kj59IHZhbHVlIFRoZSB2YWx1ZXMgdGhhdCB3aWxsIG1hdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNvbnRhaW5lZEluKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRpbicsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogbm90IGJlIGNvbnRhaW5lZCBpbiB0aGUgcHJvdmlkZWQgbGlzdCBvZiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHtBcnJheTwqPn0gdmFsdWUgVGhlIHZhbHVlcyB0aGF0IHdpbGwgbm90IG1hdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIG5vdENvbnRhaW5lZEluKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRuaW4nLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGNvbnRhaW5lZCBieSB0aGUgcHJvdmlkZWQgbGlzdCBvZiB2YWx1ZXMuIEdldCBvYmplY3RzIHdoZXJlIGFsbCBhcnJheSBlbGVtZW50cyBtYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0aGF0IHdpbGwgbWF0Y2guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgY29udGFpbmVkQnkoa2V5LCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRjb250YWluZWRCeScsIHZhbHVlcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGNvbnRhaW4gZWFjaCBvbmUgb2YgdGhlIHByb3ZpZGVkIGxpc3Qgb2YgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suICBUaGlzIGtleSdzIHZhbHVlIG11c3QgYmUgYW4gYXJyYXkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRoYXQgd2lsbCBtYXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjb250YWluc0FsbChrZXksIHZhbHVlcykge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGFsbCcsIHZhbHVlcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGNvbnRhaW4gZWFjaCBvbmUgb2YgdGhlIHByb3ZpZGVkIGxpc3Qgb2YgdmFsdWVzIHN0YXJ0aW5nIHdpdGggZ2l2ZW4gc3RyaW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLiAgVGhpcyBrZXkncyB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5LlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHZhbHVlcyBUaGUgc3RyaW5nIHZhbHVlcyB0aGF0IHdpbGwgbWF0Y2ggYXMgc3RhcnRpbmcgc3RyaW5nLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNvbnRhaW5zQWxsU3RhcnRpbmdXaXRoKGtleSwgdmFsdWVzKSB7XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWVzKSkge1xuICAgICAgdmFsdWVzID0gW3ZhbHVlc107XG4gICAgfVxuICAgIGNvbnN0IHJlZ2V4T2JqZWN0ID0gKDAsIF9tYXAuZGVmYXVsdCkodmFsdWVzKS5jYWxsKHZhbHVlcywgdmFsdWUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJHJlZ2V4OiB0aGlzLl9yZWdleFN0YXJ0V2l0aCh2YWx1ZSlcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbnNBbGwoa2V5LCByZWdleE9iamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgb2JqZWN0cyB0aGF0IGNvbnRhaW4gdGhlIGdpdmVuIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgc2hvdWxkIGV4aXN0LlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGV4aXN0cyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRleGlzdHMnLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCBmb3IgZmluZGluZyBvYmplY3RzIHRoYXQgZG8gbm90IGNvbnRhaW4gYSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHNob3VsZCBub3QgZXhpc3RcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBkb2VzTm90RXhpc3Qoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZXhpc3RzJywgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZWd1bGFyIGV4cHJlc3Npb24gY29uc3RyYWludCBmb3IgZmluZGluZyBzdHJpbmcgdmFsdWVzIHRoYXQgbWF0Y2hcbiAgICogdGhlIHByb3ZpZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICogVGhpcyBtYXkgYmUgc2xvdyBmb3IgbGFyZ2UgZGF0YXNldHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge1JlZ0V4cCB8IHN0cmluZ30gcmVnZXggVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kaWZpZXJzIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbW9kZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBtYXRjaGVzKGtleSwgcmVnZXgsIG1vZGlmaWVycykge1xuICAgIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckcmVnZXgnLCByZWdleCk7XG4gICAgaWYgKCFtb2RpZmllcnMpIHtcbiAgICAgIG1vZGlmaWVycyA9ICcnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZ2V4ICE9PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHJlZ2V4Lmlnbm9yZUNhc2UpIHtcbiAgICAgICAgbW9kaWZpZXJzICs9ICdpJztcbiAgICAgIH1cbiAgICAgIGlmIChyZWdleC5tdWx0aWxpbmUpIHtcbiAgICAgICAgbW9kaWZpZXJzICs9ICdtJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vZGlmaWVycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckb3B0aW9ucycsIG1vZGlmaWVycyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRoYXQgcmVxdWlyZXMgdGhhdCBhIGtleSdzIHZhbHVlIG1hdGNoZXMgYSBQYXJzZS5RdWVyeVxuICAgKiBjb25zdHJhaW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgY29udGFpbnMgdGhlIG9iamVjdCB0byBtYXRjaCB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICBxdWVyeS5cbiAgICogQHBhcmFtIHtQYXJzZS5RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IHRoYXQgc2hvdWxkIG1hdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIG1hdGNoZXNRdWVyeShrZXksIHF1ZXJ5KSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gcXVlcnkudG9KU09OKCk7XG4gICAgcXVlcnlKU09OLmNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRpblF1ZXJ5JywgcXVlcnlKU09OKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0aGF0IHJlcXVpcmVzIHRoYXQgYSBrZXkncyB2YWx1ZSBub3QgbWF0Y2hlcyBhXG4gICAqIFBhcnNlLlF1ZXJ5IGNvbnN0cmFpbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBjb250YWlucyB0aGUgb2JqZWN0IHRvIG1hdGNoIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge1BhcnNlLlF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgdGhhdCBzaG91bGQgbm90IG1hdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGRvZXNOb3RNYXRjaFF1ZXJ5KGtleSwgcXVlcnkpIHtcbiAgICBjb25zdCBxdWVyeUpTT04gPSBxdWVyeS50b0pTT04oKTtcbiAgICBxdWVyeUpTT04uY2xhc3NOYW1lID0gcXVlcnkuY2xhc3NOYW1lO1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJG5vdEluUXVlcnknLCBxdWVyeUpTT04pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRoYXQgcmVxdWlyZXMgdGhhdCBhIGtleSdzIHZhbHVlIG1hdGNoZXMgYSB2YWx1ZSBpblxuICAgKiBhbiBvYmplY3QgcmV0dXJuZWQgYnkgYSBkaWZmZXJlbnQgUGFyc2UuUXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZSB0aGF0IGlzIGJlaW5nXG4gICAqICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5S2V5IFRoZSBrZXkgaW4gdGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5IHRvXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0ge1BhcnNlLlF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgdG8gcnVuLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIG1hdGNoZXNLZXlJblF1ZXJ5KGtleSwgcXVlcnlLZXksIHF1ZXJ5KSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gcXVlcnkudG9KU09OKCk7XG4gICAgcXVlcnlKU09OLmNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRzZWxlY3QnLCB7XG4gICAgICBrZXk6IHF1ZXJ5S2V5LFxuICAgICAgcXVlcnk6IHF1ZXJ5SlNPTlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRoYXQgcmVxdWlyZXMgdGhhdCBhIGtleSdzIHZhbHVlIG5vdCBtYXRjaCBhIHZhbHVlIGluXG4gICAqIGFuIG9iamVjdCByZXR1cm5lZCBieSBhIGRpZmZlcmVudCBQYXJzZS5RdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIHRoYXQgaXMgYmVpbmdcbiAgICogICAgICAgICAgICAgICAgICAgICBleGNsdWRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5S2V5IFRoZSBrZXkgaW4gdGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5IHRvXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0ge1BhcnNlLlF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgdG8gcnVuLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGRvZXNOb3RNYXRjaEtleUluUXVlcnkoa2V5LCBxdWVyeUtleSwgcXVlcnkpIHtcbiAgICBjb25zdCBxdWVyeUpTT04gPSBxdWVyeS50b0pTT04oKTtcbiAgICBxdWVyeUpTT04uY2xhc3NOYW1lID0gcXVlcnkuY2xhc3NOYW1lO1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGRvbnRTZWxlY3QnLCB7XG4gICAgICBrZXk6IHF1ZXJ5S2V5LFxuICAgICAgcXVlcnk6IHF1ZXJ5SlNPTlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IGZvciBmaW5kaW5nIHN0cmluZyB2YWx1ZXMgdGhhdCBjb250YWluIGEgcHJvdmlkZWRcbiAgICogc3RyaW5nLiAgVGhpcyBtYXkgYmUgc2xvdyBmb3IgbGFyZ2UgZGF0YXNldHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3Vic3RyaW5nIFRoZSBzdWJzdHJpbmcgdGhhdCB0aGUgdmFsdWUgbXVzdCBjb250YWluLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNvbnRhaW5zKGtleSwgc3Vic3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBzdWJzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB2YWx1ZSBiZWluZyBzZWFyY2hlZCBmb3IgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckcmVnZXgnLCBxdW90ZShzdWJzdHJpbmcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCBmb3IgZmluZGluZyBzdHJpbmcgdmFsdWVzIHRoYXQgY29udGFpbiBhIHByb3ZpZGVkXG4gICAqIHN0cmluZy4gVGhpcyBtYXkgYmUgc2xvdyBmb3IgbGFyZ2UgZGF0YXNldHMuIFJlcXVpcmVzIFBhcnNlLVNlcnZlciA+IDIuNS4wXG4gICAqXG4gICAqIEluIG9yZGVyIHRvIHNvcnQgeW91IG11c3QgdXNlIHNlbGVjdCBhbmQgYXNjZW5kaW5nICgkc2NvcmUgaXMgcmVxdWlyZWQpXG4gICAqICA8cHJlPlxuICAgKiAgIHF1ZXJ5LmZ1bGxUZXh0KCdmaWVsZCcsICd0ZXJtJyk7XG4gICAqICAgcXVlcnkuYXNjZW5kaW5nKCckc2NvcmUnKTtcbiAgICogICBxdWVyeS5zZWxlY3QoJyRzY29yZScpO1xuICAgKiAgPC9wcmU+XG4gICAqXG4gICAqIFRvIHJldHJpZXZlIHRoZSB3ZWlnaHQgLyByYW5rXG4gICAqICA8cHJlPlxuICAgKiAgIG9iamVjdC0+Z2V0KCdzY29yZScpO1xuICAgKiAgPC9wcmU+XG4gICAqXG4gICAqIFlvdSBjYW4gZGVmaW5lIG9wdGlvbmFscyBieSBwcm92aWRpbmcgYW4gb2JqZWN0IGFzIGEgdGhpcmQgcGFyYW1ldGVyXG4gICAqICA8cHJlPlxuICAgKiAgIHF1ZXJ5LmZ1bGxUZXh0KCdmaWVsZCcsICd0ZXJtJywgeyBsYW5ndWFnZTogJ2VzJywgZGlhY3JpdGljU2Vuc2l0aXZlOiB0cnVlIH0pO1xuICAgKiAgPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVGhlIHN0cmluZyB0byBzZWFyY2hcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgKE9wdGlvbmFsKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5sYW5ndWFnZSBUaGUgbGFuZ3VhZ2UgdGhhdCBkZXRlcm1pbmVzIHRoZSBsaXN0IG9mIHN0b3Agd29yZHMgZm9yIHRoZSBzZWFyY2ggYW5kIHRoZSBydWxlcyBmb3IgdGhlIHN0ZW1tZXIgYW5kIHRva2VuaXplci5cbiAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmNhc2VTZW5zaXRpdmUgQSBib29sZWFuIGZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgY2FzZSBzZW5zaXRpdmUgc2VhcmNoLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuZGlhY3JpdGljU2Vuc2l0aXZlIEEgYm9vbGVhbiBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIGRpYWNyaXRpYyBzZW5zaXRpdmUgc2VhcmNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGZ1bGxUZXh0KGtleSwgdmFsdWUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBrZXkgaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzZWFyY2ggdGVybSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgYmVpbmcgc2VhcmNoZWQgZm9yIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIGNvbnN0IGZ1bGxPcHRpb25zID0ge307XG4gICAgZnVsbE9wdGlvbnMuJHRlcm0gPSB2YWx1ZTtcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBpbiBvcHRpb25zKSB7XG4gICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICBjYXNlICdsYW5ndWFnZSc6XG4gICAgICAgICAgZnVsbE9wdGlvbnMuJGxhbmd1YWdlID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjYXNlU2Vuc2l0aXZlJzpcbiAgICAgICAgICBmdWxsT3B0aW9ucy4kY2FzZVNlbnNpdGl2ZSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGlhY3JpdGljU2Vuc2l0aXZlJzpcbiAgICAgICAgICBmdWxsT3B0aW9ucy4kZGlhY3JpdGljU2Vuc2l0aXZlID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyR0ZXh0Jywge1xuICAgICAgJHNlYXJjaDogZnVsbE9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gc29ydCB0aGUgZnVsbCB0ZXh0IHNlYXJjaCBieSB0ZXh0IHNjb3JlXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgc29ydEJ5VGV4dFNjb3JlKCkge1xuICAgIHRoaXMuYXNjZW5kaW5nKCckc2NvcmUnKTtcbiAgICB0aGlzLnNlbGVjdChbJyRzY29yZSddKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCBmb3IgZmluZGluZyBzdHJpbmcgdmFsdWVzIHRoYXQgc3RhcnQgd2l0aCBhIHByb3ZpZGVkXG4gICAqIHN0cmluZy4gIFRoaXMgcXVlcnkgd2lsbCB1c2UgdGhlIGJhY2tlbmQgaW5kZXgsIHNvIGl0IHdpbGwgYmUgZmFzdCBldmVuXG4gICAqIGZvciBsYXJnZSBkYXRhc2V0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIHN0cmluZyB0byBtYXRjaCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggVGhlIHN1YnN0cmluZyB0aGF0IHRoZSB2YWx1ZSBtdXN0IHN0YXJ0IHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RpZmllcnMgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtb2RlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHN0YXJ0c1dpdGgoa2V5LCBwcmVmaXgsIG1vZGlmaWVycykge1xuICAgIGlmICh0eXBlb2YgcHJlZml4ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgYmVpbmcgc2VhcmNoZWQgZm9yIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hdGNoZXMoa2V5LCB0aGlzLl9yZWdleFN0YXJ0V2l0aChwcmVmaXgpLCBtb2RpZmllcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IGZvciBmaW5kaW5nIHN0cmluZyB2YWx1ZXMgdGhhdCBlbmQgd2l0aCBhIHByb3ZpZGVkXG4gICAqIHN0cmluZy4gIFRoaXMgd2lsbCBiZSBzbG93IGZvciBsYXJnZSBkYXRhc2V0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIHN0cmluZyB0byBtYXRjaCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXggVGhlIHN1YnN0cmluZyB0aGF0IHRoZSB2YWx1ZSBtdXN0IGVuZCB3aXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kaWZpZXJzIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbW9kZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBlbmRzV2l0aChrZXksIHN1ZmZpeCwgbW9kaWZpZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBzdWZmaXggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB2YWx1ZSBiZWluZyBzZWFyY2hlZCBmb3IgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhrZXksIHF1b3RlKHN1ZmZpeCkgKyAnJCcsIG1vZGlmaWVycyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHByb3hpbWl0eSBiYXNlZCBjb25zdHJhaW50IGZvciBmaW5kaW5nIG9iamVjdHMgd2l0aCBrZXkgcG9pbnRcbiAgICogdmFsdWVzIG5lYXIgdGhlIHBvaW50IGdpdmVuLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgUGFyc2UuR2VvUG9pbnQgaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCBUaGUgcmVmZXJlbmNlIFBhcnNlLkdlb1BvaW50IHRoYXQgaXMgdXNlZC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBuZWFyKGtleSwgcG9pbnQpIHtcbiAgICBpZiAoIShwb2ludCBpbnN0YW5jZW9mIF9QYXJzZUdlb1BvaW50LmRlZmF1bHQpKSB7XG4gICAgICAvLyBUcnkgdG8gY2FzdCBpdCBhcyBhIEdlb1BvaW50XG4gICAgICBwb2ludCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KHBvaW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckbmVhclNwaGVyZScsIHBvaW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcHJveGltaXR5IGJhc2VkIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgb2JqZWN0cyB3aXRoIGtleSBwb2ludFxuICAgKiB2YWx1ZXMgbmVhciB0aGUgcG9pbnQgZ2l2ZW4gYW5kIHdpdGhpbiB0aGUgbWF4aW11bSBkaXN0YW5jZSBnaXZlbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIFBhcnNlLkdlb1BvaW50IGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgVGhlIHJlZmVyZW5jZSBQYXJzZS5HZW9Qb2ludCB0aGF0IGlzIHVzZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhEaXN0YW5jZSBNYXhpbXVtIGRpc3RhbmNlIChpbiByYWRpYW5zKSBvZiByZXN1bHRzIHRvIHJldHVybi5cbiAgICogQHBhcmFtIHtib29sZWFufSBzb3J0ZWQgQSBCb29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiByZXN1bHRzIHNob3VsZCBiZVxuICAgKiBzb3J0ZWQgYnkgZGlzdGFuY2UgYXNjZW5kaW5nLCBmYWxzZSBpcyBubyBzb3J0aW5nIGlzIHJlcXVpcmVkLFxuICAgKiBkZWZhdWx0cyB0byB0cnVlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhpblJhZGlhbnMoa2V5LCBwb2ludCwgbWF4RGlzdGFuY2UsIHNvcnRlZCkge1xuICAgIGlmIChzb3J0ZWQgfHwgc29ydGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubmVhcihrZXksIHBvaW50KTtcbiAgICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJG1heERpc3RhbmNlJywgbWF4RGlzdGFuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRnZW9XaXRoaW4nLCB7XG4gICAgICAgICRjZW50ZXJTcGhlcmU6IFtbcG9pbnQubG9uZ2l0dWRlLCBwb2ludC5sYXRpdHVkZV0sIG1heERpc3RhbmNlXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwcm94aW1pdHkgYmFzZWQgY29uc3RyYWludCBmb3IgZmluZGluZyBvYmplY3RzIHdpdGgga2V5IHBvaW50XG4gICAqIHZhbHVlcyBuZWFyIHRoZSBwb2ludCBnaXZlbiBhbmQgd2l0aGluIHRoZSBtYXhpbXVtIGRpc3RhbmNlIGdpdmVuLlxuICAgKiBSYWRpdXMgb2YgZWFydGggdXNlZCBpcyAzOTU4LjggbWlsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBQYXJzZS5HZW9Qb2ludCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50IFRoZSByZWZlcmVuY2UgUGFyc2UuR2VvUG9pbnQgdGhhdCBpcyB1c2VkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4RGlzdGFuY2UgTWF4aW11bSBkaXN0YW5jZSAoaW4gbWlsZXMpIG9mIHJlc3VsdHMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNvcnRlZCBBIEJvb2wgdmFsdWUgdGhhdCBpcyB0cnVlIGlmIHJlc3VsdHMgc2hvdWxkIGJlXG4gICAqIHNvcnRlZCBieSBkaXN0YW5jZSBhc2NlbmRpbmcsIGZhbHNlIGlzIG5vIHNvcnRpbmcgaXMgcmVxdWlyZWQsXG4gICAqIGRlZmF1bHRzIHRvIHRydWUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aGluTWlsZXMoa2V5LCBwb2ludCwgbWF4RGlzdGFuY2UsIHNvcnRlZCkge1xuICAgIHJldHVybiB0aGlzLndpdGhpblJhZGlhbnMoa2V5LCBwb2ludCwgbWF4RGlzdGFuY2UgLyAzOTU4LjgsIHNvcnRlZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHByb3hpbWl0eSBiYXNlZCBjb25zdHJhaW50IGZvciBmaW5kaW5nIG9iamVjdHMgd2l0aCBrZXkgcG9pbnRcbiAgICogdmFsdWVzIG5lYXIgdGhlIHBvaW50IGdpdmVuIGFuZCB3aXRoaW4gdGhlIG1heGltdW0gZGlzdGFuY2UgZ2l2ZW4uXG4gICAqIFJhZGl1cyBvZiBlYXJ0aCB1c2VkIGlzIDYzNzEuMCBraWxvbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgUGFyc2UuR2VvUG9pbnQgaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCBUaGUgcmVmZXJlbmNlIFBhcnNlLkdlb1BvaW50IHRoYXQgaXMgdXNlZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heERpc3RhbmNlIE1heGltdW0gZGlzdGFuY2UgKGluIGtpbG9tZXRlcnMpIG9mIHJlc3VsdHMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNvcnRlZCBBIEJvb2wgdmFsdWUgdGhhdCBpcyB0cnVlIGlmIHJlc3VsdHMgc2hvdWxkIGJlXG4gICAqIHNvcnRlZCBieSBkaXN0YW5jZSBhc2NlbmRpbmcsIGZhbHNlIGlzIG5vIHNvcnRpbmcgaXMgcmVxdWlyZWQsXG4gICAqIGRlZmF1bHRzIHRvIHRydWUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aGluS2lsb21ldGVycyhrZXksIHBvaW50LCBtYXhEaXN0YW5jZSwgc29ydGVkKSB7XG4gICAgcmV0dXJuIHRoaXMud2l0aGluUmFkaWFucyhrZXksIHBvaW50LCBtYXhEaXN0YW5jZSAvIDYzNzEuMCwgc29ydGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3NcbiAgICogY29vcmRpbmF0ZXMgYmUgY29udGFpbmVkIHdpdGhpbiBhIGdpdmVuIHJlY3Rhbmd1bGFyIGdlb2dyYXBoaWMgYm91bmRpbmdcbiAgICogYm94LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gYmUgY29uc3RyYWluZWQuXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHNvdXRod2VzdFxuICAgKiAgICAgVGhlIGxvd2VyLWxlZnQgaW5jbHVzaXZlIGNvcm5lciBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBub3J0aGVhc3RcbiAgICogICAgIFRoZSB1cHBlci1yaWdodCBpbmNsdXNpdmUgY29ybmVyIG9mIHRoZSBib3guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aGluR2VvQm94KGtleSwgc291dGh3ZXN0LCBub3J0aGVhc3QpIHtcbiAgICBpZiAoIShzb3V0aHdlc3QgaW5zdGFuY2VvZiBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KSkge1xuICAgICAgc291dGh3ZXN0ID0gbmV3IF9QYXJzZUdlb1BvaW50LmRlZmF1bHQoc291dGh3ZXN0KTtcbiAgICB9XG4gICAgaWYgKCEobm9ydGhlYXN0IGluc3RhbmNlb2YgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCkpIHtcbiAgICAgIG5vcnRoZWFzdCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KG5vcnRoZWFzdCk7XG4gICAgfVxuICAgIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckd2l0aGluJywge1xuICAgICAgJGJveDogW3NvdXRod2VzdCwgbm9ydGhlYXN0XVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXknc1xuICAgKiBjb29yZGluYXRlcyBiZSBjb250YWluZWQgd2l0aGluIGFuZCBvbiB0aGUgYm91bmRzIG9mIGEgZ2l2ZW4gcG9seWdvbi5cbiAgICogU3VwcG9ydHMgY2xvc2VkIGFuZCBvcGVuIChsYXN0IHBvaW50IGlzIGNvbm5lY3RlZCB0byBmaXJzdCkgcGF0aHNcbiAgICpcbiAgICogUG9seWdvbiBtdXN0IGhhdmUgYXQgbGVhc3QgMyBwb2ludHNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGJlIGNvbnN0cmFpbmVkLlxuICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludHMgQXJyYXkgb2YgQ29vcmRpbmF0ZXMgLyBHZW9Qb2ludHNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3aXRoaW5Qb2x5Z29uKGtleSwgcG9pbnRzKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZ2VvV2l0aGluJywge1xuICAgICAgJHBvbHlnb246IHBvaW50c1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzXG4gICAqIGNvb3JkaW5hdGVzIHRoYXQgY29udGFpbnMgYSBQYXJzZUdlb1BvaW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBiZSBjb25zdHJhaW5lZC5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnRcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBwb2x5Z29uQ29udGFpbnMoa2V5LCBwb2ludCkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGdlb0ludGVyc2VjdHMnLCB7XG4gICAgICAkcG9pbnQ6IHBvaW50XG4gICAgfSk7XG4gIH1cblxuICAvKiBRdWVyeSBPcmRlcmluZ3MgKi9cblxuICAvKipcbiAgICogU29ydHMgdGhlIHJlc3VsdHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IGtleXMgVGhlIGtleSB0byBvcmRlciBieSwgd2hpY2ggaXMgYVxuICAgKiBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcywgb3IgYW4gQXJyYXkgb2Yga2V5cywgb3IgbXVsdGlwbGUga2V5cy5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhc2NlbmRpbmcoKSB7XG4gICAgdGhpcy5fb3JkZXIgPSBbXTtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGtleXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFkZEFzY2VuZGluZy5hcHBseSh0aGlzLCBrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgcmVzdWx0cyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGdpdmVuIGtleSxcbiAgICogYnV0IGNhbiBhbHNvIGFkZCBzZWNvbmRhcnkgc29ydCBkZXNjcmlwdG9ycyB3aXRob3V0IG92ZXJ3cml0aW5nIF9vcmRlci5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0ga2V5cyBUaGUga2V5IHRvIG9yZGVyIGJ5LCB3aGljaCBpcyBhXG4gICAqIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzLCBvciBhbiBBcnJheSBvZiBrZXlzLCBvciBtdWx0aXBsZSBrZXlzLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZEFzY2VuZGluZygpIHtcbiAgICBpZiAoIXRoaXMuX29yZGVyKSB7XG4gICAgICB0aGlzLl9vcmRlciA9IFtdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGtleXNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIHZhciBfY29udGV4dDY7XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAga2V5ID0ga2V5LmpvaW4oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX29yZGVyID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQ2ID0gdGhpcy5fb3JkZXIpLmNhbGwoX2NvbnRleHQ2LCBrZXkucmVwbGFjZSgvXFxzL2csICcnKS5zcGxpdCgnLCcpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgcmVzdWx0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IGtleXMgVGhlIGtleSB0byBvcmRlciBieSwgd2hpY2ggaXMgYVxuICAgKiBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcywgb3IgYW4gQXJyYXkgb2Yga2V5cywgb3IgbXVsdGlwbGUga2V5cy5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBkZXNjZW5kaW5nKCkge1xuICAgIHRoaXMuX29yZGVyID0gW107XG4gICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICBrZXlzW19rZXkzXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFkZERlc2NlbmRpbmcuYXBwbHkodGhpcywga2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgZ2l2ZW4ga2V5LFxuICAgKiBidXQgY2FuIGFsc28gYWRkIHNlY29uZGFyeSBzb3J0IGRlc2NyaXB0b3JzIHdpdGhvdXQgb3ZlcndyaXRpbmcgX29yZGVyLlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBrZXlzIFRoZSBrZXkgdG8gb3JkZXIgYnksIHdoaWNoIGlzIGFcbiAgICogc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMsIG9yIGFuIEFycmF5IG9mIGtleXMsIG9yIG11bHRpcGxlIGtleXMuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkRGVzY2VuZGluZygpIHtcbiAgICBpZiAoIXRoaXMuX29yZGVyKSB7XG4gICAgICB0aGlzLl9vcmRlciA9IFtdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgIGtleXNbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIHZhciBfY29udGV4dDcsIF9jb250ZXh0ODtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICBrZXkgPSBrZXkuam9pbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5fb3JkZXIgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDcgPSB0aGlzLl9vcmRlcikuY2FsbChfY29udGV4dDcsICgwLCBfbWFwLmRlZmF1bHQpKF9jb250ZXh0OCA9IGtleS5yZXBsYWNlKC9cXHMvZywgJycpLnNwbGl0KCcsJykpLmNhbGwoX2NvbnRleHQ4LCBrID0+IHtcbiAgICAgICAgcmV0dXJuICctJyArIGs7XG4gICAgICB9KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiBRdWVyeSBPcHRpb25zICovXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG51bWJlciBvZiByZXN1bHRzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyBhbnkgcmVzdWx0cy5cbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIHBhZ2luYXRpb24uXG4gICAqIERlZmF1bHQgaXMgdG8gc2tpcCB6ZXJvIHJlc3VsdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIHRoZSBudW1iZXIgb2YgcmVzdWx0cyB0byBza2lwLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHNraXAobikge1xuICAgIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbiBvbmx5IHNraXAgYnkgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgICB9XG4gICAgdGhpcy5fc2tpcCA9IG47XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbGltaXQgb2YgdGhlIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybi4gVGhlIGRlZmF1bHQgbGltaXQgaXMgMTAwLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbiB0aGUgbnVtYmVyIG9mIHJlc3VsdHMgdG8gbGltaXQgdG8uXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbGltaXQobikge1xuICAgIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbiBvbmx5IHNldCB0aGUgbGltaXQgdG8gYSBudW1lcmljIHZhbHVlJyk7XG4gICAgfVxuICAgIHRoaXMuX2xpbWl0ID0gbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBmbGFnIHRvIGluY2x1ZGUgd2l0aCByZXNwb25zZSB0aGUgdG90YWwgbnVtYmVyIG9mIG9iamVjdHMgc2F0aXNmeWluZyB0aGlzIHF1ZXJ5LFxuICAgKiBkZXNwaXRlIGxpbWl0cy9za2lwLiBNaWdodCBiZSB1c2VmdWwgZm9yIHBhZ2luYXRpb24uXG4gICAqIE5vdGUgdGhhdCByZXN1bHQgb2YgdGhpcyBxdWVyeSB3aWxsIGJlIHdyYXBwZWQgYXMgYW4gb2JqZWN0IHdpdGhcbiAgICogYHJlc3VsdHNgOiBob2xkaW5nIHtQYXJzZU9iamVjdH0gYXJyYXkgYW5kIGBjb3VudGA6IGludGVnZXIgaG9sZGluZyB0b3RhbCBudW1iZXJcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQ291bnQgZmFsc2UgLSBkaXNhYmxlLCB0cnVlIC0gZW5hYmxlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhDb3VudCgpIHtcbiAgICBsZXQgaW5jbHVkZUNvdW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICAgIGlmICh0eXBlb2YgaW5jbHVkZUNvdW50ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbiBvbmx5IHNldCB3aXRoQ291bnQgdG8gYSBib29sZWFuIHZhbHVlJyk7XG4gICAgfVxuICAgIHRoaXMuX2NvdW50ID0gaW5jbHVkZUNvdW50O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBJbmNsdWRlcyBuZXN0ZWQgUGFyc2UuT2JqZWN0cyBmb3IgdGhlIHByb3ZpZGVkIGtleS4gIFlvdSBjYW4gdXNlIGRvdFxuICAgKiBub3RhdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkcyBpbiB0aGUgaW5jbHVkZWQgb2JqZWN0IGFyZSBhbHNvIGZldGNoZWQuXG4gICAqXG4gICAqIFlvdSBjYW4gaW5jbHVkZSBhbGwgbmVzdGVkIFBhcnNlLk9iamVjdHMgYnkgcGFzc2luZyBpbiAnKicuXG4gICAqIFJlcXVpcmVzIFBhcnNlIFNlcnZlciAzLjAuMCtcbiAgICogPHByZT5xdWVyeS5pbmNsdWRlKCcqJyk7PC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7Li4uc3RyaW5nfEFycmF5PHN0cmluZz59IGtleXMgVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBpbmNsdWRlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGluY2x1ZGUoKSB7XG4gICAgZm9yICh2YXIgX2xlbjUgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW41KSwgX2tleTUgPSAwOyBfa2V5NSA8IF9sZW41OyBfa2V5NSsrKSB7XG4gICAgICBrZXlzW19rZXk1XSA9IGFyZ3VtZW50c1tfa2V5NV07XG4gICAgfVxuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSA9PiB7XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0OTtcbiAgICAgICAgdGhpcy5faW5jbHVkZSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0OSA9IHRoaXMuX2luY2x1ZGUpLmNhbGwoX2NvbnRleHQ5LCBrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5jbHVkZS5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5jbHVkZXMgYWxsIG5lc3RlZCBQYXJzZS5PYmplY3RzIG9uZSBsZXZlbCBkZWVwLlxuICAgKlxuICAgKiBSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgMy4wLjArXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgaW5jbHVkZUFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmNsdWRlKCcqJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdHJpY3RzIHRoZSBmaWVsZHMgb2YgdGhlIHJldHVybmVkIFBhcnNlLk9iamVjdHMgdG8gaW5jbHVkZSBvbmx5IHRoZVxuICAgKiBwcm92aWRlZCBrZXlzLiAgSWYgdGhpcyBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIHRoZW4gYWxsIG9mIHRoZSBrZXlzXG4gICAqIHNwZWNpZmllZCBpbiBlYWNoIG9mIHRoZSBjYWxscyB3aWxsIGJlIGluY2x1ZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLnN0cmluZ3xBcnJheTxzdHJpbmc+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBzZWxlY3QoKSB7XG4gICAgaWYgKCF0aGlzLl9zZWxlY3QpIHtcbiAgICAgIHRoaXMuX3NlbGVjdCA9IFtdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfbGVuNiA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjYpLCBfa2V5NiA9IDA7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcbiAgICAgIGtleXNbX2tleTZdID0gYXJndW1lbnRzW19rZXk2XTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICB2YXIgX2NvbnRleHQxMDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQxMCA9IHRoaXMuX3NlbGVjdCkuY2FsbChfY29udGV4dDEwLCBrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0LnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0cmljdHMgdGhlIGZpZWxkcyBvZiB0aGUgcmV0dXJuZWQgUGFyc2UuT2JqZWN0cyB0byBhbGwga2V5cyBleGNlcHQgdGhlXG4gICAqIHByb3ZpZGVkIGtleXMuIEV4Y2x1ZGUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHNlbGVjdCBhbmQgaW5jbHVkZS5cbiAgICpcbiAgICogUmVxdWlyZXMgUGFyc2UgU2VydmVyIDMuNi4wK1xuICAgKlxuICAgKiBAcGFyYW0gey4uLnN0cmluZ3xBcnJheTxzdHJpbmc+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gZXhjbHVkZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBleGNsdWRlKCkge1xuICAgIGZvciAodmFyIF9sZW43ID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuNyksIF9rZXk3ID0gMDsgX2tleTcgPCBfbGVuNzsgX2tleTcrKykge1xuICAgICAga2V5c1tfa2V5N10gPSBhcmd1bWVudHNbX2tleTddO1xuICAgIH1cbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkgPT4ge1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgIHZhciBfY29udGV4dDExO1xuICAgICAgICB0aGlzLl9leGNsdWRlID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQxMSA9IHRoaXMuX2V4Y2x1ZGUpLmNhbGwoX2NvbnRleHQxMSwga2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2V4Y2x1ZGUucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyaWN0cyBsaXZlIHF1ZXJ5IHRvIHRyaWdnZXIgb25seSBmb3Igd2F0Y2hlZCBmaWVsZHMuXG4gICAqXG4gICAqIFJlcXVpcmVzIFBhcnNlIFNlcnZlciA2LjAuMCtcbiAgICpcbiAgICogQHBhcmFtIHsuLi5zdHJpbmd8QXJyYXk8c3RyaW5nPn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIHdhdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdhdGNoKCkge1xuICAgIGZvciAodmFyIF9sZW44ID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuOCksIF9rZXk4ID0gMDsgX2tleTggPCBfbGVuODsgX2tleTgrKykge1xuICAgICAga2V5c1tfa2V5OF0gPSBhcmd1bWVudHNbX2tleThdO1xuICAgIH1cbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkgPT4ge1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgIHZhciBfY29udGV4dDEyO1xuICAgICAgICB0aGlzLl93YXRjaCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0MTIgPSB0aGlzLl93YXRjaCkuY2FsbChfY29udGV4dDEyLCBrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fd2F0Y2gucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHJlYWQgcHJlZmVyZW5jZSB0aGF0IHRoZSBiYWNrZW5kIHdpbGwgdXNlIHdoZW4gcGVyZm9ybWluZyB0aGUgcXVlcnkgdG8gdGhlIGRhdGFiYXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhZFByZWZlcmVuY2UgVGhlIHJlYWQgcHJlZmVyZW5jZSBmb3IgdGhlIG1haW4gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbmNsdWRlUmVhZFByZWZlcmVuY2UgVGhlIHJlYWQgcHJlZmVyZW5jZSBmb3IgdGhlIHF1ZXJpZXMgdG8gaW5jbHVkZSBwb2ludGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgVGhlIHJlYWQgcHJlZmVyZW5jZSBmb3IgdGhlIHN1YiBxdWVyaWVzLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHJlYWRQcmVmZXJlbmNlKHJlYWRQcmVmZXJlbmNlLCBpbmNsdWRlUmVhZFByZWZlcmVuY2UsIHN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UpIHtcbiAgICB0aGlzLl9yZWFkUHJlZmVyZW5jZSA9IHJlYWRQcmVmZXJlbmNlO1xuICAgIHRoaXMuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IGluY2x1ZGVSZWFkUHJlZmVyZW5jZSB8fCBudWxsO1xuICAgIHRoaXMuX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlIHx8IG51bGw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRoaXMgcXVlcnkgdG8gZ2V0IGxpdmVRdWVyeSB1cGRhdGVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uVG9rZW4gKG9wdGlvbmFsKSBEZWZhdWx0cyB0byB0aGUgY3VycmVudFVzZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8TGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uPn0gUmV0dXJucyB0aGUgbGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uLCBpdCdzIGFuIGV2ZW50IGVtaXR0ZXJcbiAgICogd2hpY2ggY2FuIGJlIHVzZWQgdG8gZ2V0IGxpdmVRdWVyeSB1cGRhdGVzLlxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlKHNlc3Npb25Ub2tlbikge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gYXdhaXQgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKS5jdXJyZW50VXNlckFzeW5jKCk7XG4gICAgaWYgKCFzZXNzaW9uVG9rZW4pIHtcbiAgICAgIHNlc3Npb25Ub2tlbiA9IGN1cnJlbnRVc2VyID8gY3VycmVudFVzZXIuZ2V0U2Vzc2lvblRva2VuKCkgfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBsaXZlUXVlcnlDbGllbnQgPSBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMaXZlUXVlcnlDb250cm9sbGVyKCkuZ2V0RGVmYXVsdExpdmVRdWVyeUNsaWVudCgpO1xuICAgIGlmIChsaXZlUXVlcnlDbGllbnQuc2hvdWxkT3BlbigpKSB7XG4gICAgICBsaXZlUXVlcnlDbGllbnQub3BlbigpO1xuICAgIH1cbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBsaXZlUXVlcnlDbGllbnQuc3Vic2NyaWJlKHRoaXMsIHNlc3Npb25Ub2tlbik7XG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUGFyc2UuUXVlcnkgdGhhdCBpcyB0aGUgT1Igb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzLiAgRm9yXG4gICAqIGV4YW1wbGU6XG4gICAqIDxwcmU+dmFyIGNvbXBvdW5kUXVlcnkgPSBQYXJzZS5RdWVyeS5vcihxdWVyeTEsIHF1ZXJ5MiwgcXVlcnkzKTs8L3ByZT5cbiAgICpcbiAgICogd2lsbCBjcmVhdGUgYSBjb21wb3VuZFF1ZXJ5IHRoYXQgaXMgYW4gb3Igb2YgdGhlIHF1ZXJ5MSwgcXVlcnkyLCBhbmRcbiAgICogcXVlcnkzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLlBhcnNlLlF1ZXJ5fSBxdWVyaWVzIFRoZSBsaXN0IG9mIHF1ZXJpZXMgdG8gT1IuXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBUaGUgcXVlcnkgdGhhdCBpcyB0aGUgT1Igb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzLlxuICAgKi9cbiAgc3RhdGljIG9yKCkge1xuICAgIGZvciAodmFyIF9sZW45ID0gYXJndW1lbnRzLmxlbmd0aCwgcXVlcmllcyA9IG5ldyBBcnJheShfbGVuOSksIF9rZXk5ID0gMDsgX2tleTkgPCBfbGVuOTsgX2tleTkrKykge1xuICAgICAgcXVlcmllc1tfa2V5OV0gPSBhcmd1bWVudHNbX2tleTldO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBfZ2V0Q2xhc3NOYW1lRnJvbVF1ZXJpZXMocXVlcmllcyk7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShjbGFzc05hbWUpO1xuICAgIHF1ZXJ5Ll9vclF1ZXJ5KHF1ZXJpZXMpO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUGFyc2UuUXVlcnkgdGhhdCBpcyB0aGUgQU5EIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcy4gIEZvclxuICAgKiBleGFtcGxlOlxuICAgKiA8cHJlPnZhciBjb21wb3VuZFF1ZXJ5ID0gUGFyc2UuUXVlcnkuYW5kKHF1ZXJ5MSwgcXVlcnkyLCBxdWVyeTMpOzwvcHJlPlxuICAgKlxuICAgKiB3aWxsIGNyZWF0ZSBhIGNvbXBvdW5kUXVlcnkgdGhhdCBpcyBhbiBhbmQgb2YgdGhlIHF1ZXJ5MSwgcXVlcnkyLCBhbmRcbiAgICogcXVlcnkzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLlBhcnNlLlF1ZXJ5fSBxdWVyaWVzIFRoZSBsaXN0IG9mIHF1ZXJpZXMgdG8gQU5ELlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gVGhlIHF1ZXJ5IHRoYXQgaXMgdGhlIEFORCBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMuXG4gICAqL1xuICBzdGF0aWMgYW5kKCkge1xuICAgIGZvciAodmFyIF9sZW4xMCA9IGFyZ3VtZW50cy5sZW5ndGgsIHF1ZXJpZXMgPSBuZXcgQXJyYXkoX2xlbjEwKSwgX2tleTEwID0gMDsgX2tleTEwIDwgX2xlbjEwOyBfa2V5MTArKykge1xuICAgICAgcXVlcmllc1tfa2V5MTBdID0gYXJndW1lbnRzW19rZXkxMF07XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IF9nZXRDbGFzc05hbWVGcm9tUXVlcmllcyhxdWVyaWVzKTtcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KGNsYXNzTmFtZSk7XG4gICAgcXVlcnkuX2FuZFF1ZXJ5KHF1ZXJpZXMpO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUGFyc2UuUXVlcnkgdGhhdCBpcyB0aGUgTk9SIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcy4gIEZvclxuICAgKiBleGFtcGxlOlxuICAgKiA8cHJlPmNvbnN0IGNvbXBvdW5kUXVlcnkgPSBQYXJzZS5RdWVyeS5ub3IocXVlcnkxLCBxdWVyeTIsIHF1ZXJ5Myk7PC9wcmU+XG4gICAqXG4gICAqIHdpbGwgY3JlYXRlIGEgY29tcG91bmRRdWVyeSB0aGF0IGlzIGEgbm9yIG9mIHRoZSBxdWVyeTEsIHF1ZXJ5MiwgYW5kXG4gICAqIHF1ZXJ5My5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5QYXJzZS5RdWVyeX0gcXVlcmllcyBUaGUgbGlzdCBvZiBxdWVyaWVzIHRvIE5PUi5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFRoZSBxdWVyeSB0aGF0IGlzIHRoZSBOT1Igb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzLlxuICAgKi9cbiAgc3RhdGljIG5vcigpIHtcbiAgICBmb3IgKHZhciBfbGVuMTEgPSBhcmd1bWVudHMubGVuZ3RoLCBxdWVyaWVzID0gbmV3IEFycmF5KF9sZW4xMSksIF9rZXkxMSA9IDA7IF9rZXkxMSA8IF9sZW4xMTsgX2tleTExKyspIHtcbiAgICAgIHF1ZXJpZXNbX2tleTExXSA9IGFyZ3VtZW50c1tfa2V5MTFdO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBfZ2V0Q2xhc3NOYW1lRnJvbVF1ZXJpZXMocXVlcmllcyk7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShjbGFzc05hbWUpO1xuICAgIHF1ZXJ5Ll9ub3JRdWVyeShxdWVyaWVzKTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBzb3VyY2Ugb2YgdGhpcyBxdWVyeSB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGZyb21OZXR3b3JrKCkge1xuICAgIHRoaXMuX3F1ZXJpZXNMb2NhbERhdGFzdG9yZSA9IGZhbHNlO1xuICAgIHRoaXMuX2xvY2FsRGF0YXN0b3JlUGluTmFtZSA9IG51bGw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgc291cmNlIG9mIHRoaXMgcXVlcnkgdG8gYWxsIHBpbm5lZCBvYmplY3RzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGZyb21Mb2NhbERhdGFzdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tUGluV2l0aE5hbWUobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgc291cmNlIG9mIHRoaXMgcXVlcnkgdG8gdGhlIGRlZmF1bHQgZ3JvdXAgb2YgcGlubmVkIG9iamVjdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZnJvbVBpbigpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tUGluV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHNvdXJjZSBvZiB0aGlzIHF1ZXJ5IHRvIGEgc3BlY2lmaWMgZ3JvdXAgb2YgcGlubmVkIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHF1ZXJ5IHNvdXJjZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBmcm9tUGluV2l0aE5hbWUobmFtZSkge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAobG9jYWxEYXRhc3RvcmUuY2hlY2tJZkVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5fcXVlcmllc0xvY2FsRGF0YXN0b3JlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2xvY2FsRGF0YXN0b3JlUGluTmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgdGhlIGN1cnJlbnQgbmV0d29yayByZXF1ZXN0IChpZiBhbnkgaXMgcnVubmluZykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLl94aHJSZXF1ZXN0LnRhc2sgJiYgdHlwZW9mIHRoaXMuX3hoclJlcXVlc3QudGFzay5hYm9ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5feGhyUmVxdWVzdC50YXNrLl9hYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3hoclJlcXVlc3QudGFzay5hYm9ydCgpO1xuICAgICAgdGhpcy5feGhyUmVxdWVzdC50YXNrID0gbnVsbDtcbiAgICAgIHRoaXMuX3hoclJlcXVlc3Qub25jaGFuZ2UgPSAoKSA9PiB7fTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl94aHJSZXF1ZXN0Lm9uY2hhbmdlID0gKCkgPT4gdGhpcy5jYW5jZWwoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBfc2V0UmVxdWVzdFRhc2sob3B0aW9ucykge1xuICAgIG9wdGlvbnMucmVxdWVzdFRhc2sgPSB0YXNrID0+IHtcbiAgICAgIHRoaXMuX3hoclJlcXVlc3QudGFzayA9IHRhc2s7XG4gICAgICB0aGlzLl94aHJSZXF1ZXN0Lm9uY2hhbmdlKCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgY29tbWVudCB0byB0aGUgcXVlcnkgc28gdGhhdCB0aGUgcXVlcnlcbiAgICogY2FuIGJlIGlkZW50aWZpZWQgd2hlbiB1c2luZyBhIHRoZSBwcm9maWxlciBmb3IgTW9uZ29EQi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIGEgY29tbWVudCBjYW4gbWFrZSB5b3VyIHByb2ZpbGUgZGF0YSBlYXNpZXIgdG8gaW50ZXJwcmV0IGFuZCB0cmFjZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjb21tZW50KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9jb21tZW50O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB2YWx1ZSBvZiBhIGNvbW1lbnQgdG8gYmUgc2VudCB3aXRoIHRoaXMgcXVlcnkgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgdGhpcy5fY29tbWVudCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgZmluZChjbGFzc05hbWUsIHBhcmFtcywgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2NsYXNzZXMvJyArIGNsYXNzTmFtZSwgcGFyYW1zLCBvcHRpb25zKTtcbiAgfSxcbiAgYWdncmVnYXRlKGNsYXNzTmFtZSwgcGFyYW1zLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAnYWdncmVnYXRlLycgKyBjbGFzc05hbWUsIHBhcmFtcywgb3B0aW9ucyk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQYXJzZVF1ZXJ5KFBhcnNlUXVlcnkpO1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UXVlcnlDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlUXVlcnk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFJlbGF0aW9uIGZvciB0aGUgZ2l2ZW4gcGFyZW50IG9iamVjdCBhbmQga2V5LiBUaGlzXG4gKiBjb25zdHJ1Y3RvciBzaG91bGQgcmFyZWx5IGJlIHVzZWQgZGlyZWN0bHksIGJ1dCByYXRoZXIgY3JlYXRlZCBieVxuICogUGFyc2UuT2JqZWN0LnJlbGF0aW9uLlxuICpcbiAqIDxwPlxuICogQSBjbGFzcyB0aGF0IGlzIHVzZWQgdG8gYWNjZXNzIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgYSBtYW55LXRvLW1hbnlcbiAqIHJlbGF0aW9uc2hpcC4gIEVhY2ggaW5zdGFuY2Ugb2YgUGFyc2UuUmVsYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGFcbiAqIHBhcnRpY3VsYXIgcGFyZW50IG9iamVjdCBhbmQga2V5LlxuICogPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5SZWxhdGlvblxuICovXG5jbGFzcyBQYXJzZVJlbGF0aW9uIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyc2UuT2JqZWN0fSBwYXJlbnQgVGhlIHBhcmVudCBvZiB0aGlzIHJlbGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgZm9yIHRoaXMgcmVsYXRpb24gb24gdGhlIHBhcmVudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudCwga2V5KSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJwYXJlbnRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImtleVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwidGFyZ2V0Q2xhc3NOYW1lXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgdGhpcy50YXJnZXRDbGFzc05hbWUgPSBudWxsO1xuICB9XG5cbiAgLypcbiAgICogTWFrZXMgc3VyZSB0aGF0IHRoaXMgcmVsYXRpb24gaGFzIHRoZSByaWdodCBwYXJlbnQgYW5kIGtleS5cbiAgICovXG4gIF9lbnN1cmVQYXJlbnRBbmRLZXkocGFyZW50LCBrZXkpIHtcbiAgICB0aGlzLmtleSA9IHRoaXMua2V5IHx8IGtleTtcbiAgICBpZiAodGhpcy5rZXkgIT09IGtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBFcnJvci4gUmVsYXRpb24gcmV0cmlldmVkIGZyb20gdHdvIGRpZmZlcmVudCBrZXlzLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudC5jbGFzc05hbWUgIT09IHBhcmVudC5jbGFzc05hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBFcnJvci4gUmVsYXRpb24gcmV0cmlldmVkIGZyb20gdHdvIGRpZmZlcmVudCBPYmplY3RzLicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGFyZW50LmlkKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudC5pZCAhPT0gcGFyZW50LmlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBFcnJvci4gUmVsYXRpb24gcmV0cmlldmVkIGZyb20gdHdvIGRpZmZlcmVudCBPYmplY3RzLicpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcmVudC5pZCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBQYXJzZS5PYmplY3Qgb3IgYW4gYXJyYXkgb2YgUGFyc2UuT2JqZWN0cyB0byB0aGUgcmVsYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7KFBhcnNlLk9iamVjdHxBcnJheSl9IG9iamVjdHMgVGhlIGl0ZW0gb3IgaXRlbXMgdG8gYWRkLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBUaGUgcGFyZW50IG9mIHRoZSByZWxhdGlvbi5cbiAgICovXG4gIGFkZChvYmplY3RzKSB7XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkob2JqZWN0cykpIHtcbiAgICAgIG9iamVjdHMgPSBbb2JqZWN0c107XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIFJlbGF0aW9uT3BcbiAgICB9ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPcCgpO1xuICAgIGNvbnN0IGNoYW5nZSA9IG5ldyBSZWxhdGlvbk9wKG9iamVjdHMsIFtdKTtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIHRvIGEgUmVsYXRpb24gd2l0aG91dCBhIHBhcmVudCcpO1xuICAgIH1cbiAgICBpZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudC5zZXQodGhpcy5rZXksIGNoYW5nZSk7XG4gICAgdGhpcy50YXJnZXRDbGFzc05hbWUgPSBjaGFuZ2UuX3RhcmdldENsYXNzTmFtZTtcbiAgICByZXR1cm4gcGFyZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBQYXJzZS5PYmplY3Qgb3IgYW4gYXJyYXkgb2YgUGFyc2UuT2JqZWN0cyBmcm9tIHRoaXMgcmVsYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7KFBhcnNlLk9iamVjdHxBcnJheSl9IG9iamVjdHMgVGhlIGl0ZW0gb3IgaXRlbXMgdG8gcmVtb3ZlLlxuICAgKi9cbiAgcmVtb3ZlKG9iamVjdHMpIHtcbiAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KShvYmplY3RzKSkge1xuICAgICAgb2JqZWN0cyA9IFtvYmplY3RzXTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgUmVsYXRpb25PcFxuICAgIH0gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9wKCk7XG4gICAgY29uc3QgY2hhbmdlID0gbmV3IFJlbGF0aW9uT3AoW10sIG9iamVjdHMpO1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlbW92ZSBmcm9tIGEgUmVsYXRpb24gd2l0aG91dCBhIHBhcmVudCcpO1xuICAgIH1cbiAgICBpZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQuc2V0KHRoaXMua2V5LCBjaGFuZ2UpO1xuICAgIHRoaXMudGFyZ2V0Q2xhc3NOYW1lID0gY2hhbmdlLl90YXJnZXRDbGFzc05hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04gdmVyc2lvbiBvZiB0aGUgb2JqZWN0IHN1aXRhYmxlIGZvciBzYXZpbmcgdG8gZGlzay5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH0gSlNPTiByZXByZXNlbnRhdGlvbiBvZiBSZWxhdGlvblxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdSZWxhdGlvbicsXG4gICAgICBjbGFzc05hbWU6IHRoaXMudGFyZ2V0Q2xhc3NOYW1lXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgUGFyc2UuUXVlcnkgdGhhdCBpcyBsaW1pdGVkIHRvIG9iamVjdHMgaW4gdGhpc1xuICAgKiByZWxhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZWxhdGlvbiBRdWVyeVxuICAgKi9cbiAgcXVlcnkoKSB7XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb25zdHJ1Y3QgYSBxdWVyeSBmb3IgYSBSZWxhdGlvbiB3aXRob3V0IGEgcGFyZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IFBhcnNlUXVlcnkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVF1ZXJ5KCk7XG4gICAgaWYgKCF0aGlzLnRhcmdldENsYXNzTmFtZSkge1xuICAgICAgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShwYXJlbnQuY2xhc3NOYW1lKTtcbiAgICAgIHF1ZXJ5Ll9leHRyYU9wdGlvbnMucmVkaXJlY3RDbGFzc05hbWVGb3JLZXkgPSB0aGlzLmtleTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeSh0aGlzLnRhcmdldENsYXNzTmFtZSk7XG4gICAgfVxuICAgIHF1ZXJ5Ll9hZGRDb25kaXRpb24oJyRyZWxhdGVkVG8nLCAnb2JqZWN0Jywge1xuICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICBjbGFzc05hbWU6IHBhcmVudC5jbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogcGFyZW50LmlkXG4gICAgfSk7XG4gICAgcXVlcnkuX2FkZENvbmRpdGlvbignJHJlbGF0ZWRUbycsICdrZXknLCB0aGlzLmtleSk7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZVJlbGF0aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlQUNMID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUFDTFwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgUm9sZSBvbiB0aGUgUGFyc2Ugc2VydmVyLiBSb2xlcyByZXByZXNlbnQgZ3JvdXBpbmdzIG9mXG4gKiBVc2VycyBmb3IgdGhlIHB1cnBvc2VzIG9mIGdyYW50aW5nIHBlcm1pc3Npb25zIChlLmcuIHNwZWNpZnlpbmcgYW4gQUNMXG4gKiBmb3IgYW4gT2JqZWN0KS4gUm9sZXMgYXJlIHNwZWNpZmllZCBieSB0aGVpciBzZXRzIG9mIGNoaWxkIHVzZXJzIGFuZFxuICogY2hpbGQgcm9sZXMsIGFsbCBvZiB3aGljaCBhcmUgZ3JhbnRlZCBhbnkgcGVybWlzc2lvbnMgdGhhdCB0aGUgcGFyZW50XG4gKiByb2xlIGhhcy5cbiAqXG4gKiA8cD5Sb2xlcyBtdXN0IGhhdmUgYSBuYW1lICh3aGljaCBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjcmVhdGlvbiBvZiB0aGVcbiAqIHJvbGUpLCBhbmQgbXVzdCBzcGVjaWZ5IGFuIEFDTC48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLlJvbGVcbiAqIEBhdWdtZW50cyBQYXJzZS5PYmplY3RcbiAqL1xuY2xhc3MgUGFyc2VSb2xlIGV4dGVuZHMgX1BhcnNlT2JqZWN0LmRlZmF1bHQge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIFJvbGUgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0ge1BhcnNlLkFDTH0gYWNsIFRoZSBBQ0wgZm9yIHRoaXMgcm9sZS4gUm9sZXMgbXVzdCBoYXZlIGFuIEFDTC5cbiAgICogQSBQYXJzZS5Sb2xlIGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpb24gb2YgYSByb2xlIHBlcnNpc3RlZCB0byB0aGUgUGFyc2VcbiAgICogY2xvdWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBhY2wpIHtcbiAgICBzdXBlcignX1JvbGUnKTtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIGFjbCBpbnN0YW5jZW9mIF9QYXJzZUFDTC5kZWZhdWx0KSB7XG4gICAgICB0aGlzLnNldE5hbWUobmFtZSk7XG4gICAgICB0aGlzLnNldEFDTChhY2wpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSByb2xlLiAgWW91IGNhbiBhbHRlcm5hdGl2ZWx5IGNhbGwgcm9sZS5nZXQoXCJuYW1lXCIpXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBuYW1lIG9mIHRoZSByb2xlLlxuICAgKi9cbiAgZ2V0TmFtZSgpIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXQoJ25hbWUnKTtcbiAgICBpZiAobmFtZSA9PSBudWxsIHx8IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuYW1lIGZvciBhIHJvbGUuIFRoaXMgdmFsdWUgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSByb2xlIGhhc1xuICAgKiBiZWVuIHNhdmVkIHRvIHRoZSBzZXJ2ZXIsIGFuZCBjYW5ub3QgYmUgc2V0IG9uY2UgdGhlIHJvbGUgaGFzIGJlZW5cbiAgICogc2F2ZWQuXG4gICAqXG4gICAqIDxwPlxuICAgKiAgIEEgcm9sZSdzIG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgXywgLSwgYW5kXG4gICAqICAgc3BhY2VzLlxuICAgKiA8L3A+XG4gICAqXG4gICAqIDxwPlRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIHJvbGUuc2V0KFwibmFtZVwiLCBuYW1lKTwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHJvbGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFN0YW5kYXJkIG9wdGlvbnMgb2JqZWN0IHdpdGggc3VjY2VzcyBhbmQgZXJyb3JcbiAgICogICAgIGNhbGxiYWNrcy5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdHxib29sZWFuKX0gdHJ1ZSBpZiB0aGUgc2V0IHN1Y2NlZWRlZC5cbiAgICovXG4gIHNldE5hbWUobmFtZSwgb3B0aW9ucykge1xuICAgIHRoaXMuX3ZhbGlkYXRlTmFtZShuYW1lKTtcbiAgICByZXR1cm4gdGhpcy5zZXQoJ25hbWUnLCBuYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBQYXJzZS5SZWxhdGlvbiBmb3IgdGhlIFBhcnNlLlVzZXJzIHRoYXQgYXJlIGRpcmVjdFxuICAgKiBjaGlsZHJlbiBvZiB0aGlzIHJvbGUuIFRoZXNlIHVzZXJzIGFyZSBncmFudGVkIGFueSBwcml2aWxlZ2VzIHRoYXQgdGhpc1xuICAgKiByb2xlIGhhcyBiZWVuIGdyYW50ZWQgKGUuZy4gcmVhZCBvciB3cml0ZSBhY2Nlc3MgdGhyb3VnaCBBQ0xzKS4gWW91IGNhblxuICAgKiBhZGQgb3IgcmVtb3ZlIHVzZXJzIGZyb20gdGhlIHJvbGUgdGhyb3VnaCB0aGlzIHJlbGF0aW9uLlxuICAgKlxuICAgKiA8cD5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyByb2xlLnJlbGF0aW9uKFwidXNlcnNcIik8L3A+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5SZWxhdGlvbn0gdGhlIHJlbGF0aW9uIGZvciB0aGUgdXNlcnMgYmVsb25naW5nIHRvIHRoaXNcbiAgICogICAgIHJvbGUuXG4gICAqL1xuICBnZXRVc2VycygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGlvbigndXNlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBQYXJzZS5SZWxhdGlvbiBmb3IgdGhlIFBhcnNlLlJvbGVzIHRoYXQgYXJlIGRpcmVjdFxuICAgKiBjaGlsZHJlbiBvZiB0aGlzIHJvbGUuIFRoZXNlIHJvbGVzJyB1c2VycyBhcmUgZ3JhbnRlZCBhbnkgcHJpdmlsZWdlcyB0aGF0XG4gICAqIHRoaXMgcm9sZSBoYXMgYmVlbiBncmFudGVkIChlLmcuIHJlYWQgb3Igd3JpdGUgYWNjZXNzIHRocm91Z2ggQUNMcykuIFlvdVxuICAgKiBjYW4gYWRkIG9yIHJlbW92ZSBjaGlsZCByb2xlcyBmcm9tIHRoaXMgcm9sZSB0aHJvdWdoIHRoaXMgcmVsYXRpb24uXG4gICAqXG4gICAqIDxwPlRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIHJvbGUucmVsYXRpb24oXCJyb2xlc1wiKTwvcD5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlJlbGF0aW9ufSB0aGUgcmVsYXRpb24gZm9yIHRoZSByb2xlcyBiZWxvbmdpbmcgdG8gdGhpc1xuICAgKiAgICAgcm9sZS5cbiAgICovXG4gIGdldFJvbGVzKCkge1xuICAgIHJldHVybiB0aGlzLnJlbGF0aW9uKCdyb2xlcycpO1xuICB9XG4gIF92YWxpZGF0ZU5hbWUobmV3TmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmV3TmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsIFwiQSByb2xlJ3MgbmFtZSBtdXN0IGJlIGEgU3RyaW5nLlwiKTtcbiAgICB9XG4gICAgaWYgKCEvXlswLTlhLXpBLVpcXC1fIF0rJC8udGVzdChuZXdOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgXCJBIHJvbGUncyBuYW1lIGNhbiBiZSBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIF8sIFwiICsgJy0sIGFuZCBzcGFjZXMuJyk7XG4gICAgfVxuICB9XG4gIHZhbGlkYXRlKGF0dHJzLCBvcHRpb25zKSB7XG4gICAgY29uc3QgaXNJbnZhbGlkID0gc3VwZXIudmFsaWRhdGUoYXR0cnMsIG9wdGlvbnMpO1xuICAgIGlmIChpc0ludmFsaWQpIHtcbiAgICAgIHJldHVybiBpc0ludmFsaWQ7XG4gICAgfVxuICAgIGlmICgnbmFtZScgaW4gYXR0cnMgJiYgYXR0cnMubmFtZSAhPT0gdGhpcy5nZXROYW1lKCkpIHtcbiAgICAgIGNvbnN0IG5ld05hbWUgPSBhdHRycy5uYW1lO1xuICAgICAgaWYgKHRoaXMuaWQgJiYgdGhpcy5pZCAhPT0gYXR0cnMub2JqZWN0SWQpIHtcbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBvYmplY3RJZCBiZWluZyBzZXQgbWF0Y2hlcyB0aGlzLmlkXG4gICAgICAgIC8vIFRoaXMgaGFwcGVucyBkdXJpbmcgYSBmZXRjaCAtLSB0aGUgaWQgaXMgc2V0IGJlZm9yZSBjYWxsaW5nIGZldGNoXG4gICAgICAgIC8vIExldCB0aGUgbmFtZSBiZSBzZXQgaW4gdGhpcyBjYXNlXG4gICAgICAgIHJldHVybiBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCBcIkEgcm9sZSdzIG5hbWUgY2FuIG9ubHkgYmUgc2V0IGJlZm9yZSBpdCBoYXMgYmVlbiBzYXZlZC5cIik7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZU5hbWUobmV3TmFtZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFBhcnNlUm9sZShQYXJzZVJvbGUpO1xuX1BhcnNlT2JqZWN0LmRlZmF1bHQucmVnaXN0ZXJTdWJjbGFzcygnX1JvbGUnLCBQYXJzZVJvbGUpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VSb2xlOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBfUGFyc2VDTFAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQ0xQXCIpKTtcbmNvbnN0IEZJRUxEX1RZUEVTID0gWydTdHJpbmcnLCAnTnVtYmVyJywgJ0Jvb2xlYW4nLCAnQnl0ZXMnLCAnRGF0ZScsICdGaWxlJywgJ0dlb1BvaW50JywgJ1BvbHlnb24nLCAnQXJyYXknLCAnT2JqZWN0JywgJ1BvaW50ZXInLCAnUmVsYXRpb24nXTtcbi8qKlxuICogQSBQYXJzZS5TY2hlbWEgb2JqZWN0IGlzIGZvciBoYW5kbGluZyBzY2hlbWEgZGF0YSBmcm9tIFBhcnNlLlxuICogPHA+QWxsIHRoZSBzY2hlbWFzIG1ldGhvZHMgcmVxdWlyZSBNYXN0ZXJLZXkuXG4gKlxuICogV2hlbiBhZGRpbmcgZmllbGRzLCB5b3UgbWF5IHNldCByZXF1aXJlZCBhbmQgZGVmYXVsdCB2YWx1ZXMuIChSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgMy43LjArKVxuICpcbiAqIDxwcmU+XG4gKiBjb25zdCBvcHRpb25zID0geyByZXF1aXJlZDogdHJ1ZSwgZGVmYXVsdFZhbHVlOiAnaGVsbG8gd29ybGQnIH07XG4gKiBjb25zdCBzY2hlbWEgPSBuZXcgUGFyc2UuU2NoZW1hKCdNeUNsYXNzJyk7XG4gKiBzY2hlbWEuYWRkU3RyaW5nKCdmaWVsZCcsIG9wdGlvbnMpO1xuICogc2NoZW1hLmFkZEluZGV4KCdpbmRleF9uYW1lJywgeyAnZmllbGQnOiAxIH0pO1xuICogc2NoZW1hLnNhdmUoKTtcbiAqIDwvcHJlPlxuICogPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5TY2hlbWFcbiAqL1xuY2xhc3MgUGFyc2VTY2hlbWEge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBQYXJzZSBDbGFzcyBzdHJpbmcuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGFzc05hbWUpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImNsYXNzTmFtZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2ZpZWxkc1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2luZGV4ZXNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9jbHBcIiwgdm9pZCAwKTtcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChjbGFzc05hbWUgPT09ICdVc2VyJyAmJiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1BFUkZPUk1fVVNFUl9SRVdSSVRFJykpIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAnX1VzZXInO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2ZpZWxkcyA9IHt9O1xuICAgIHRoaXMuX2luZGV4ZXMgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kIHRvIGdldCBhbGwgc2NoZW1hc1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBhbGwoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNjaGVtYUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5nZXQoJycpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2NoZW1hIG5vdCBmb3VuZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHRzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgU2NoZW1hIGZyb20gUGFyc2VcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBnZXQoKSB7XG4gICAgdGhpcy5hc3NlcnRDbGFzc05hbWUoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U2NoZW1hQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmdldCh0aGlzLmNsYXNzTmFtZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2NoZW1hIG5vdCBmb3VuZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgU2NoZW1hIG9uIFBhcnNlXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgc2F2ZSgpIHtcbiAgICB0aGlzLmFzc2VydENsYXNzTmFtZSgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTY2hlbWFDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIGZpZWxkczogdGhpcy5fZmllbGRzLFxuICAgICAgaW5kZXhlczogdGhpcy5faW5kZXhlcyxcbiAgICAgIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogdGhpcy5fY2xwXG4gICAgfTtcbiAgICByZXR1cm4gY29udHJvbGxlci5jcmVhdGUodGhpcy5jbGFzc05hbWUsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgU2NoZW1hIG9uIFBhcnNlXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgdXBkYXRlKCkge1xuICAgIHRoaXMuYXNzZXJ0Q2xhc3NOYW1lKCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNjaGVtYUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLFxuICAgICAgZmllbGRzOiB0aGlzLl9maWVsZHMsXG4gICAgICBpbmRleGVzOiB0aGlzLl9pbmRleGVzLFxuICAgICAgY2xhc3NMZXZlbFBlcm1pc3Npb25zOiB0aGlzLl9jbHBcbiAgICB9O1xuICAgIHRoaXMuX2ZpZWxkcyA9IHt9O1xuICAgIHRoaXMuX2luZGV4ZXMgPSB7fTtcbiAgICByZXR1cm4gY29udHJvbGxlci51cGRhdGUodGhpcy5jbGFzc05hbWUsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZpbmcgYSBTY2hlbWEgZnJvbSBQYXJzZVxuICAgKiBDYW4gb25seSBiZSB1c2VkIG9uIFNjaGVtYSB3aXRob3V0IG9iamVjdHNcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBkZWxldGUoKSB7XG4gICAgdGhpcy5hc3NlcnRDbGFzc05hbWUoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U2NoZW1hQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmRlbGV0ZSh0aGlzLmNsYXNzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIGEgU2NoZW1hIChjbGFzcykgaW4gUGFyc2UuXG4gICAqIEVYRVJDSVNFIENBVVRJT04sIHJ1bm5pbmcgdGhpcyB3aWxsIGRlbGV0ZSBhbGwgb2JqZWN0cyBmb3IgdGhpcyBzY2hlbWEgYW5kIGNhbm5vdCBiZSByZXZlcnNlZFxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIHB1cmdlKCkge1xuICAgIHRoaXMuYXNzZXJ0Q2xhc3NOYW1lKCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNjaGVtYUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5wdXJnZSh0aGlzLmNsYXNzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZXJ0IGlmIENsYXNzTmFtZSBoYXMgYmVlbiBmaWxsZWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFzc2VydENsYXNzTmFtZSgpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHNldCBhIENsYXNzIE5hbWUgYmVmb3JlIG1ha2luZyBhbnkgcmVxdWVzdC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBDbGFzcyBMZXZlbCBQZXJtaXNzaW9ucyB3aGVuIGNyZWF0aW5nIC8gdXBkYXRpbmcgYSBTY2hlbWEuXG4gICAqIEVYRVJDSVNFIENBVVRJT04sIHJ1bm5pbmcgdGhpcyBtYXkgb3ZlcnJpZGUgQ0xQIGZvciB0aGlzIHNjaGVtYSBhbmQgY2Fubm90IGJlIHJldmVyc2VkXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgUGFyc2UuQ0xQfSBjbHAgQ2xhc3MgTGV2ZWwgUGVybWlzc2lvbnNcbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHNldENMUChjbHApIHtcbiAgICBpZiAoY2xwIGluc3RhbmNlb2YgX1BhcnNlQ0xQLmRlZmF1bHQpIHtcbiAgICAgIHRoaXMuX2NscCA9IGNscC50b0pTT04oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2xwID0gY2xwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgYSBGaWVsZCB0byBDcmVhdGUgLyBVcGRhdGUgYSBTY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgQ2FuIGJlIGEgKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxEYXRlfFBhcnNlLkZpbGV8UGFyc2UuR2VvUG9pbnR8QXJyYXl8T2JqZWN0fFBvaW50ZXJ8UGFyc2UuUmVsYXRpb24pXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+cmVxdWlyZWQ6IElmIGZpZWxkIGlzIG5vdCBzZXQsIHNhdmUgb3BlcmF0aW9uIGZhaWxzIChSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgMy43LjArKVxuICAgKiAgIDxsaT5kZWZhdWx0VmFsdWU6IElmIGZpZWxkIGlzIG5vdCBzZXQsIGEgZGVmYXVsdCB2YWx1ZSBpcyBzZWxlY3RlZCAoUmVxdWlyZXMgUGFyc2UgU2VydmVyIDMuNy4wKylcbiAgICogICA8bGk+dGFyZ2V0Q2xhc3M6IFJlcXVpcmVkIGlmIHR5cGUgaXMgUG9pbnRlciBvciBQYXJzZS5SZWxhdGlvblxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkRmllbGQobmFtZSwgdHlwZSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICB0eXBlID0gdHlwZSB8fCAnU3RyaW5nJztcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmllbGQgbmFtZSBtYXkgbm90IGJlIG51bGwuJyk7XG4gICAgfVxuICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoRklFTERfVFlQRVMpLmNhbGwoRklFTERfVFlQRVMsIHR5cGUpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3R5cGV9IGlzIG5vdCBhIHZhbGlkIHR5cGUuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZFBvaW50ZXIobmFtZSwgb3B0aW9ucy50YXJnZXRDbGFzcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnUmVsYXRpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRSZWxhdGlvbihuYW1lLCBvcHRpb25zLnRhcmdldENsYXNzKTtcbiAgICB9XG4gICAgY29uc3QgZmllbGRPcHRpb25zID0ge1xuICAgICAgdHlwZVxuICAgIH07XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlcXVpcmVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGZpZWxkT3B0aW9ucy5yZXF1aXJlZCA9IG9wdGlvbnMucmVxdWlyZWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWVsZE9wdGlvbnMuZGVmYXVsdFZhbHVlID0gb3B0aW9ucy5kZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnRGF0ZScpIHtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGZpZWxkT3B0aW9ucy5kZWZhdWx0VmFsdWUgPSB7XG4gICAgICAgICAgX190eXBlOiAnRGF0ZScsXG4gICAgICAgICAgaXNvOiBuZXcgRGF0ZShvcHRpb25zLmRlZmF1bHRWYWx1ZSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdCeXRlcycpIHtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGZpZWxkT3B0aW9ucy5kZWZhdWx0VmFsdWUgPSB7XG4gICAgICAgICAgX190eXBlOiAnQnl0ZXMnLFxuICAgICAgICAgIGJhc2U2NDogb3B0aW9ucy5kZWZhdWx0VmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZmllbGRzW25hbWVdID0gZmllbGRPcHRpb25zO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBhbiBJbmRleCB0byBDcmVhdGUgLyBVcGRhdGUgYSBTY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgaW5kZXhcbiAgICogQHBhcmFtIHtvYmplY3R9IGluZGV4IHsgZmllbGQ6IHZhbHVlIH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICpcbiAgICogPHByZT5cbiAgICogc2NoZW1hLmFkZEluZGV4KCdpbmRleF9uYW1lJywgeyAnZmllbGQnOiAxIH0pO1xuICAgKiA8L3ByZT5cbiAgICovXG4gIGFkZEluZGV4KG5hbWUsIGluZGV4KSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luZGV4IG5hbWUgbWF5IG5vdCBiZSBudWxsLicpO1xuICAgIH1cbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luZGV4IG1heSBub3QgYmUgbnVsbC4nKTtcbiAgICB9XG4gICAgdGhpcy5faW5kZXhlc1tuYW1lXSA9IGluZGV4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBTdHJpbmcgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkU3RyaW5nKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnU3RyaW5nJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIE51bWJlciBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGROdW1iZXIobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdOdW1iZXInLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgQm9vbGVhbiBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRCb29sZWFuKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnQm9vbGVhbicsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBCeXRlcyBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRCeXRlcyhuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ0J5dGVzJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIERhdGUgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkRGF0ZShuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ0RhdGUnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgRmlsZSBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRGaWxlKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnRmlsZScsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBHZW9Qb2ludCBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRHZW9Qb2ludChuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ0dlb1BvaW50Jywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIFBvbHlnb24gRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkUG9seWdvbihuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ1BvbHlnb24nLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgQXJyYXkgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkQXJyYXkobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdBcnJheScsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBPYmplY3QgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkT2JqZWN0KG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnT2JqZWN0Jywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIFBvaW50ZXIgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldENsYXNzIE5hbWUgb2YgdGhlIHRhcmdldCBQb2ludGVyIENsYXNzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZFBvaW50ZXIobmFtZSwgdGFyZ2V0Q2xhc3MpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpZWxkIG5hbWUgbWF5IG5vdCBiZSBudWxsLicpO1xuICAgIH1cbiAgICBpZiAoIXRhcmdldENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHNldCB0aGUgdGFyZ2V0Q2xhc3Mgb2YgdGhlIFBvaW50ZXIuJyk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkT3B0aW9ucyA9IHtcbiAgICAgIHR5cGU6ICdQb2ludGVyJyxcbiAgICAgIHRhcmdldENsYXNzXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVxdWlyZWQgPT09ICdib29sZWFuJykge1xuICAgICAgZmllbGRPcHRpb25zLnJlcXVpcmVkID0gb3B0aW9ucy5yZXF1aXJlZDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpZWxkT3B0aW9ucy5kZWZhdWx0VmFsdWUgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChvcHRpb25zLmRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIF9QYXJzZU9iamVjdC5kZWZhdWx0KSB7XG4gICAgICAgIGZpZWxkT3B0aW9ucy5kZWZhdWx0VmFsdWUgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZS50b1BvaW50ZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZmllbGRzW25hbWVdID0gZmllbGRPcHRpb25zO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBSZWxhdGlvbiBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0Q2xhc3MgTmFtZSBvZiB0aGUgdGFyZ2V0IFBvaW50ZXIgQ2xhc3NcbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZFJlbGF0aW9uKG5hbWUsIHRhcmdldENsYXNzKSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpZWxkIG5hbWUgbWF5IG5vdCBiZSBudWxsLicpO1xuICAgIH1cbiAgICBpZiAoIXRhcmdldENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHNldCB0aGUgdGFyZ2V0Q2xhc3Mgb2YgdGhlIFJlbGF0aW9uLicpO1xuICAgIH1cbiAgICB0aGlzLl9maWVsZHNbbmFtZV0gPSB7XG4gICAgICB0eXBlOiAnUmVsYXRpb24nLFxuICAgICAgdGFyZ2V0Q2xhc3NcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0aW5nIGEgRmllbGQgdG8gVXBkYXRlIG9uIGEgU2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkXG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBkZWxldGVGaWVsZChuYW1lKSB7XG4gICAgdGhpcy5fZmllbGRzW25hbWVdID0ge1xuICAgICAgX19vcDogJ0RlbGV0ZSdcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0aW5nIGFuIEluZGV4IHRvIFVwZGF0ZSBvbiBhIFNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZFxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZGVsZXRlSW5kZXgobmFtZSkge1xuICAgIHRoaXMuX2luZGV4ZXNbbmFtZV0gPSB7XG4gICAgICBfX29wOiAnRGVsZXRlJ1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBzZW5kKGNsYXNzTmFtZSwgbWV0aG9kKSB7XG4gICAgbGV0IHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KG1ldGhvZCwgYHNjaGVtYXMvJHtjbGFzc05hbWV9YCwgcGFyYW1zLCB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9KTtcbiAgfSxcbiAgZ2V0KGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLnNlbmQoY2xhc3NOYW1lLCAnR0VUJyk7XG4gIH0sXG4gIGNyZWF0ZShjbGFzc05hbWUsIHBhcmFtcykge1xuICAgIHJldHVybiB0aGlzLnNlbmQoY2xhc3NOYW1lLCAnUE9TVCcsIHBhcmFtcyk7XG4gIH0sXG4gIHVwZGF0ZShjbGFzc05hbWUsIHBhcmFtcykge1xuICAgIHJldHVybiB0aGlzLnNlbmQoY2xhc3NOYW1lLCAnUFVUJywgcGFyYW1zKTtcbiAgfSxcbiAgZGVsZXRlKGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLnNlbmQoY2xhc3NOYW1lLCAnREVMRVRFJyk7XG4gIH0sXG4gIHB1cmdlKGNsYXNzTmFtZSkge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnREVMRVRFJywgYHB1cmdlLyR7Y2xhc3NOYW1lfWAsIHt9LCB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9KTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFNjaGVtYUNvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VTY2hlbWE7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2lzUmV2b2NhYmxlU2Vzc2lvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaXNSZXZvY2FibGVTZXNzaW9uXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBfUGFyc2VVc2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVVzZXJcIikpO1xuLyoqXG4gKiA8cD5BIFBhcnNlLlNlc3Npb24gb2JqZWN0IGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpb24gb2YgYSByZXZvY2FibGUgc2Vzc2lvbi5cbiAqIFRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiBhIFBhcnNlLk9iamVjdCwgYW5kIHJldGFpbnMgdGhlIHNhbWVcbiAqIGZ1bmN0aW9uYWxpdHkgb2YgYSBQYXJzZS5PYmplY3QuPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5TZXNzaW9uXG4gKiBAYXVnbWVudHMgUGFyc2UuT2JqZWN0XG4gKi9cbmNsYXNzIFBhcnNlU2Vzc2lvbiBleHRlbmRzIF9QYXJzZU9iamVjdC5kZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIFRoZSBpbml0aWFsIHNldCBvZiBkYXRhIHRvIHN0b3JlIGluIHRoZSB1c2VyLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykge1xuICAgIHN1cGVyKCdfU2Vzc2lvbicpO1xuICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKCF0aGlzLnNldChhdHRyaWJ1dGVzIHx8IHt9KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgYW4gaW52YWxpZCBTZXNzaW9uXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIHRva2VuIHN0cmluZy5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFNlc3Npb25Ub2tlbigpIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0KCdzZXNzaW9uVG9rZW4nKTtcbiAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgc3RhdGljIHJlYWRPbmx5QXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydjcmVhdGVkV2l0aCcsICdleHBpcmVzQXQnLCAnaW5zdGFsbGF0aW9uSWQnLCAncmVzdHJpY3RlZCcsICdzZXNzaW9uVG9rZW4nLCAndXNlciddO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgU2Vzc2lvbiBvYmplY3QgZm9yIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIHVzZU1hc3RlcktleVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSBQYXJzZS5TZXNzaW9uXG4gICAqIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBmZXRjaGVkLiBJZiB0aGVyZSBpcyBubyBjdXJyZW50IHVzZXIsIHRoZVxuICAgKiBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNlc3Npb25Db250cm9sbGVyKCk7XG4gICAgY29uc3Qgc2Vzc2lvbk9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHNlc3Npb25PcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICByZXR1cm4gX1BhcnNlVXNlci5kZWZhdWx0LmN1cnJlbnRBc3luYygpLnRoZW4odXNlciA9PiB7XG4gICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdUaGVyZSBpcyBubyBjdXJyZW50IHVzZXIuJyk7XG4gICAgICB9XG4gICAgICBzZXNzaW9uT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSB1c2VyLmdldFNlc3Npb25Ub2tlbigpO1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0U2Vzc2lvbihzZXNzaW9uT3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNlc3Npb24gdG9rZW4gaXMgcmV2b2NhYmxlLlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIG1pZ3JhdGluZyBFeHByZXNzLmpzIG9yIE5vZGUuanMgd2ViIGFwcHMgdG9cbiAgICogdXNlIHJldm9jYWJsZSBzZXNzaW9ucy4gSWYgeW91IGFyZSBtaWdyYXRpbmcgYW4gYXBwIHRoYXQgdXNlcyB0aGUgUGFyc2VcbiAgICogU0RLIGluIHRoZSBicm93c2VyIG9ubHksIHBsZWFzZSB1c2UgUGFyc2UuVXNlci5lbmFibGVSZXZvY2FibGVTZXNzaW9uKClcbiAgICogaW5zdGVhZCwgc28gdGhhdCBzZXNzaW9ucyBjYW4gYmUgYXV0b21hdGljYWxseSB1cGdyYWRlZC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0N1cnJlbnRTZXNzaW9uUmV2b2NhYmxlKCkge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gX1BhcnNlVXNlci5kZWZhdWx0LmN1cnJlbnQoKTtcbiAgICBpZiAoY3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiAoMCwgX2lzUmV2b2NhYmxlU2Vzc2lvbi5kZWZhdWx0KShjdXJyZW50VXNlci5nZXRTZXNzaW9uVG9rZW4oKSB8fCAnJyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuX1BhcnNlT2JqZWN0LmRlZmF1bHQucmVnaXN0ZXJTdWJjbGFzcygnX1Nlc3Npb24nLCBQYXJzZVNlc3Npb24pO1xuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIGdldFNlc3Npb24ob3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gbmV3IFBhcnNlU2Vzc2lvbigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAnc2Vzc2lvbnMvbWUnLCB7fSwgb3B0aW9ucykudGhlbihzZXNzaW9uRGF0YSA9PiB7XG4gICAgICBzZXNzaW9uLl9maW5pc2hGZXRjaChzZXNzaW9uRGF0YSk7XG4gICAgICBzZXNzaW9uLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgICAgcmV0dXJuIHNlc3Npb247XG4gICAgfSk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRTZXNzaW9uQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZVNlc3Npb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5MiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIikpO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfaXNSZXZvY2FibGVTZXNzaW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9pc1Jldm9jYWJsZVNlc3Npb25cIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBfU3RvcmFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZVwiKSk7XG5jb25zdCBDVVJSRU5UX1VTRVJfS0VZID0gJ2N1cnJlbnRVc2VyJztcbmxldCBjYW5Vc2VDdXJyZW50VXNlciA9ICFfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0lTX05PREUnKTtcbmxldCBjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2sgPSBmYWxzZTtcbmxldCBjdXJyZW50VXNlckNhY2hlID0gbnVsbDtcbmNvbnN0IGF1dGhQcm92aWRlcnMgPSB7fTtcblxuLyoqXG4gKiA8cD5BIFBhcnNlLlVzZXIgb2JqZWN0IGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpb24gb2YgYSB1c2VyIHBlcnNpc3RlZCB0byB0aGVcbiAqIFBhcnNlIGNsb3VkLiBUaGlzIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgYSBQYXJzZS5PYmplY3QsIGFuZCByZXRhaW5zIHRoZVxuICogc2FtZSBmdW5jdGlvbmFsaXR5IG9mIGEgUGFyc2UuT2JqZWN0LCBidXQgYWxzbyBleHRlbmRzIGl0IHdpdGggdmFyaW91c1xuICogdXNlciBzcGVjaWZpYyBtZXRob2RzLCBsaWtlIGF1dGhlbnRpY2F0aW9uLCBzaWduaW5nIHVwLCBhbmQgdmFsaWRhdGlvbiBvZlxuICogdW5pcXVlbmVzcy48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLlVzZXJcbiAqIEBhdWdtZW50cyBQYXJzZS5PYmplY3RcbiAqL1xuY2xhc3MgUGFyc2VVc2VyIGV4dGVuZHMgX1BhcnNlT2JqZWN0LmRlZmF1bHQge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgVGhlIGluaXRpYWwgc2V0IG9mIGRhdGEgdG8gc3RvcmUgaW4gdGhlIHVzZXIuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7XG4gICAgc3VwZXIoJ19Vc2VyJyk7XG4gICAgaWYgKGF0dHJpYnV0ZXMgJiYgdHlwZW9mIGF0dHJpYnV0ZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoIXRoaXMuc2V0KGF0dHJpYnV0ZXMgfHwge30pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSBhbiBpbnZhbGlkIFBhcnNlIFVzZXJcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYSByZXZvY2FibGUgc2Vzc2lvbiB0b2tlbiB0byByZXBsYWNlIHRoZSBvbGRlciBzdHlsZSBvZiB0b2tlbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIHJlcGxhY2VtZW50XG4gICAqICAgdG9rZW4gaGFzIGJlZW4gZmV0Y2hlZC5cbiAgICovXG4gIF91cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCB1cGdyYWRlT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgdXBncmFkZU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnVwZ3JhZGVUb1Jldm9jYWJsZVNlc3Npb24odGhpcywgdXBncmFkZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFsbG93cyB5b3UgdG8gbGluayB5b3VyIHVzZXJzIHdpdGgge0BsaW5rIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9wYXJzZS1zZXJ2ZXIvZ3VpZGUvI29hdXRoLWFuZC0zcmQtcGFydHktYXV0aGVudGljYXRpb24gM3JkIHBhcnR5IGF1dGhlbnRpY2F0aW9ufSwgZW5hYmxpbmdcbiAgICogeW91ciB1c2VycyB0byBzaWduIHVwIG9yIGxvZyBpbnRvIHlvdXIgYXBwbGljYXRpb24gdXNpbmcgdGhlaXIgZXhpc3RpbmcgaWRlbnRpdGllcy5cbiAgICogU2luY2UgMi45LjBcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL2pzL2d1aWRlLyNsaW5raW5nLXVzZXJzIExpbmtpbmcgVXNlcnN9XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXV0aFByb3ZpZGVyfSBwcm92aWRlciBOYW1lIG9mIGF1dGggcHJvdmlkZXIgb3Ige0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvQXV0aFByb3ZpZGVyLmh0bWwgQXV0aFByb3ZpZGVyfVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuYXV0aERhdGFdIEF1dGhEYXRhIHRvIGxpbmsgd2l0aFxuICAgKiA8dWw+XG4gICAqICAgPGxpPklmIHByb3ZpZGVyIGlzIHN0cmluZywgb3B0aW9ucyBpcyB7QGxpbmsgaHR0cDovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvcGFyc2Utc2VydmVyL2d1aWRlLyNzdXBwb3J0ZWQtM3JkLXBhcnR5LWF1dGhlbnRpY2F0aW9ucyBhdXRoRGF0YX1cbiAgICogICA8bGk+SWYgcHJvdmlkZXIgaXMgQXV0aFByb3ZpZGVyLCBvcHRpb25zIGlzIHNhdmVPcHRzXG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzYXZlT3B0cyB1c2VNYXN0ZXJLZXkgLyBzZXNzaW9uVG9rZW5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIGlzIGxpbmtlZFxuICAgKi9cbiAgbGlua1dpdGgocHJvdmlkZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgc2F2ZU9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHNhdmVPcHRzLnNlc3Npb25Ub2tlbiA9IHNhdmVPcHRzLnNlc3Npb25Ub2tlbiB8fCB0aGlzLmdldFNlc3Npb25Ub2tlbigpIHx8ICcnO1xuICAgIGxldCBhdXRoVHlwZTtcbiAgICBpZiAodHlwZW9mIHByb3ZpZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgYXV0aFR5cGUgPSBwcm92aWRlcjtcbiAgICAgIGlmIChhdXRoUHJvdmlkZXJzW3Byb3ZpZGVyXSkge1xuICAgICAgICBwcm92aWRlciA9IGF1dGhQcm92aWRlcnNbcHJvdmlkZXJdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYXV0aFByb3ZpZGVyID0ge1xuICAgICAgICAgIHJlc3RvcmVBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0QXV0aFR5cGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXV0aFR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhdXRoUHJvdmlkZXJzW2F1dGhQcm92aWRlci5nZXRBdXRoVHlwZSgpXSA9IGF1dGhQcm92aWRlcjtcbiAgICAgICAgcHJvdmlkZXIgPSBhdXRoUHJvdmlkZXI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF1dGhUeXBlID0gcHJvdmlkZXIuZ2V0QXV0aFR5cGUoKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYXV0aERhdGEnKSkge1xuICAgICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKSB8fCB7fTtcbiAgICAgIGlmICh0eXBlb2YgYXV0aERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0eXBlOiBhdXRoRGF0YSBmaWVsZCBzaG91bGQgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICBhdXRoRGF0YVthdXRoVHlwZV0gPSBvcHRpb25zLmF1dGhEYXRhO1xuICAgICAgY29uc3Qgb2xkQW5vbnltb3VzRGF0YSA9IGF1dGhEYXRhLmFub255bW91cztcbiAgICAgIHRoaXMuc3RyaXBBbm9ueW1pdHkoKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIubGlua1dpdGgodGhpcywgYXV0aERhdGEsIHNhdmVPcHRzKS5jYXRjaChlID0+IHtcbiAgICAgICAgZGVsZXRlIGF1dGhEYXRhW2F1dGhUeXBlXTtcbiAgICAgICAgdGhpcy5yZXN0b3JlQW5vbmltaXR5KG9sZEFub255bW91c0RhdGEpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHByb3ZpZGVyLmF1dGhlbnRpY2F0ZSh7XG4gICAgICAgICAgc3VjY2VzczogKHByb3ZpZGVyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSB7fTtcbiAgICAgICAgICAgIG9wdHMuYXV0aERhdGEgPSByZXN1bHQ7XG4gICAgICAgICAgICB0aGlzLmxpbmtXaXRoKHByb3ZpZGVyLCBvcHRzLCBzYXZlT3B0cykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAocHJvdmlkZXIsIGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHByb3ZpZGVyXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy5hdXRoRGF0YV1cbiAgICogQHBhcmFtIHNhdmVPcHRzXG4gICAqIEBkZXByZWNhdGVkIHNpbmNlIDIuOS4wIHNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5Vc2VyLmh0bWwjbGlua1dpdGggbGlua1dpdGh9XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgX2xpbmtXaXRoKHByb3ZpZGVyLCBvcHRpb25zKSB7XG4gICAgbGV0IHNhdmVPcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICByZXR1cm4gdGhpcy5saW5rV2l0aChwcm92aWRlciwgb3B0aW9ucywgc2F2ZU9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXplcyBhdXRoIGRhdGEgZm9yIGEgcHJvdmlkZXIgKGUuZy4gcHV0cyB0aGUgYWNjZXNzIHRva2VuIGluIHRoZVxuICAgKiByaWdodCBwbGFjZSB0byBiZSB1c2VkIGJ5IHRoZSBGYWNlYm9vayBTREspLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJcbiAgICovXG4gIF9zeW5jaHJvbml6ZUF1dGhEYXRhKHByb3ZpZGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzQ3VycmVudCgpIHx8ICFwcm92aWRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgYXV0aFR5cGU7XG4gICAgaWYgKHR5cGVvZiBwcm92aWRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGF1dGhUeXBlID0gcHJvdmlkZXI7XG4gICAgICBwcm92aWRlciA9IGF1dGhQcm92aWRlcnNbYXV0aFR5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdXRoVHlwZSA9IHByb3ZpZGVyLmdldEF1dGhUeXBlKCk7XG4gICAgfVxuICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJyk7XG4gICAgaWYgKCFwcm92aWRlciB8fCAhYXV0aERhdGEgfHwgdHlwZW9mIGF1dGhEYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdWNjZXNzID0gcHJvdmlkZXIucmVzdG9yZUF1dGhlbnRpY2F0aW9uKGF1dGhEYXRhW2F1dGhUeXBlXSk7XG4gICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICB0aGlzLl91bmxpbmtGcm9tKHByb3ZpZGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25pemVzIGF1dGhEYXRhIGZvciBhbGwgcHJvdmlkZXJzLlxuICAgKi9cbiAgX3N5bmNocm9uaXplQWxsQXV0aERhdGEoKSB7XG4gICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKTtcbiAgICBpZiAodHlwZW9mIGF1dGhEYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdXRoRGF0YSkge1xuICAgICAgdGhpcy5fc3luY2hyb25pemVBdXRoRGF0YShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIG51bGwgdmFsdWVzIGZyb20gYXV0aERhdGEgKHdoaWNoIGV4aXN0IHRlbXBvcmFyaWx5IGZvciB1bmxpbmtpbmcpXG4gICAqL1xuICBfY2xlYW51cEF1dGhEYXRhKCkge1xuICAgIGlmICghdGhpcy5pc0N1cnJlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpO1xuICAgIGlmICh0eXBlb2YgYXV0aERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGF1dGhEYXRhKSB7XG4gICAgICBpZiAoIWF1dGhEYXRhW2tleV0pIHtcbiAgICAgICAgZGVsZXRlIGF1dGhEYXRhW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVubGlua3MgYSB1c2VyIGZyb20gYSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEF1dGhQcm92aWRlcn0gcHJvdmlkZXIgTmFtZSBvZiBhdXRoIHByb3ZpZGVyIG9yIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL0F1dGhQcm92aWRlci5odG1sIEF1dGhQcm92aWRlcn1cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgTWFzdGVyS2V5IC8gU2Vzc2lvblRva2VuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgdW5saW5raW5nXG4gICAqICAgICBmaW5pc2hlcy5cbiAgICovXG4gIF91bmxpbmtGcm9tKHByb3ZpZGVyLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubGlua1dpdGgocHJvdmlkZXIsIHtcbiAgICAgIGF1dGhEYXRhOiBudWxsXG4gICAgfSwgb3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9zeW5jaHJvbml6ZUF1dGhEYXRhKHByb3ZpZGVyKTtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodGhpcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSB1c2VyIGlzIGxpbmtlZCB0byBhIHNlcnZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwcm92aWRlciBzZXJ2aWNlIHRvIGxpbmsgdG9cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgbGluayB3YXMgc3VjY2Vzc2Z1bFxuICAgKi9cbiAgX2lzTGlua2VkKHByb3ZpZGVyKSB7XG4gICAgbGV0IGF1dGhUeXBlO1xuICAgIGlmICh0eXBlb2YgcHJvdmlkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBhdXRoVHlwZSA9IHByb3ZpZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdXRoVHlwZSA9IHByb3ZpZGVyLmdldEF1dGhUeXBlKCk7XG4gICAgfVxuICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJykgfHwge307XG4gICAgaWYgKHR5cGVvZiBhdXRoRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhYXV0aERhdGFbYXV0aFR5cGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlYXV0aGVudGljYXRlcyBhbGwgcHJvdmlkZXJzLlxuICAgKi9cbiAgX2xvZ091dFdpdGhBbGwoKSB7XG4gICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKTtcbiAgICBpZiAodHlwZW9mIGF1dGhEYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdXRoRGF0YSkge1xuICAgICAgdGhpcy5fbG9nT3V0V2l0aChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWF1dGhlbnRpY2F0ZXMgYSBzaW5nbGUgcHJvdmlkZXIgKGUuZy4gcmVtb3ZpbmcgYWNjZXNzIHRva2VucyBmcm9tIHRoZVxuICAgKiBGYWNlYm9vayBTREspLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvdmlkZXIgc2VydmljZSB0byBsb2dvdXQgb2ZcbiAgICovXG4gIF9sb2dPdXRXaXRoKHByb3ZpZGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzQ3VycmVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvdmlkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcm92aWRlciA9IGF1dGhQcm92aWRlcnNbcHJvdmlkZXJdO1xuICAgIH1cbiAgICBpZiAocHJvdmlkZXIgJiYgcHJvdmlkZXIuZGVhdXRoZW50aWNhdGUpIHtcbiAgICAgIHByb3ZpZGVyLmRlYXV0aGVudGljYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsYXNzIGluc3RhbmNlIG1ldGhvZCB1c2VkIHRvIG1haW50YWluIHNwZWNpZmljIGtleXMgd2hlbiBhIGZldGNoIG9jY3Vycy5cbiAgICogVXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgc2Vzc2lvbiB0b2tlbiBpcyBub3QgbG9zdC5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH0gc2Vzc2lvblRva2VuXG4gICAqL1xuICBfcHJlc2VydmVGaWVsZHNPbkZldGNoKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXNzaW9uVG9rZW46IHRoaXMuZ2V0KCdzZXNzaW9uVG9rZW4nKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIDxjb2RlPmN1cnJlbnQ8L2NvZGU+IHdvdWxkIHJldHVybiB0aGlzIHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHVzZXIgaXMgY2FjaGVkIG9uIGRpc2tcbiAgICovXG4gIGlzQ3VycmVudCgpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gUGFyc2VVc2VyLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gISFjdXJyZW50ICYmIGN1cnJlbnQuaWQgPT09IHRoaXMuaWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIDxjb2RlPmN1cnJlbnQ8L2NvZGU+IHdvdWxkIHJldHVybiB0aGlzIHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSB0cnVlIGlmIHVzZXIgaXMgY2FjaGVkIG9uIGRpc2tcbiAgICovXG4gIGFzeW5jIGlzQ3VycmVudEFzeW5jKCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBQYXJzZVVzZXIuY3VycmVudEFzeW5jKCk7XG4gICAgcmV0dXJuICEhY3VycmVudCAmJiBjdXJyZW50LmlkID09PSB0aGlzLmlkO1xuICB9XG4gIHN0cmlwQW5vbnltaXR5KCkge1xuICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJyk7XG4gICAgaWYgKGF1dGhEYXRhICYmIHR5cGVvZiBhdXRoRGF0YSA9PT0gJ29iamVjdCcgJiYgYXV0aERhdGEuaGFzT3duUHJvcGVydHkoJ2Fub255bW91cycpKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHNldCBhbm9ueW1vdXMgdG8gbnVsbCBpbnN0ZWFkIG9mIGRlbGV0aW5nIGl0IGluIG9yZGVyIHRvIHJlbW92ZSBpdCBmcm9tIFBhcnNlLlxuICAgICAgYXV0aERhdGEuYW5vbnltb3VzID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmVzdG9yZUFub25pbWl0eShhbm9ueW1vdXNEYXRhKSB7XG4gICAgaWYgKGFub255bW91c0RhdGEpIHtcbiAgICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJyk7XG4gICAgICBhdXRoRGF0YS5hbm9ueW1vdXMgPSBhbm9ueW1vdXNEYXRhO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGdldChcInVzZXJuYW1lXCIpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0VXNlcm5hbWUoKSB7XG4gICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLmdldCgndXNlcm5hbWUnKTtcbiAgICBpZiAodXNlcm5hbWUgPT0gbnVsbCB8fCB0eXBlb2YgdXNlcm5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdXNlcm5hbWU7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBzZXQoXCJ1c2VybmFtZVwiLCB1c2VybmFtZSwgb3B0aW9ucykgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJuYW1lXG4gICAqL1xuICBzZXRVc2VybmFtZSh1c2VybmFtZSkge1xuICAgIHRoaXMuc3RyaXBBbm9ueW1pdHkoKTtcbiAgICB0aGlzLnNldCgndXNlcm5hbWUnLCB1c2VybmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgc2V0KFwicGFzc3dvcmRcIiwgcGFzc3dvcmQsIG9wdGlvbnMpIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBVc2VyJ3MgUGFzc3dvcmRcbiAgICovXG4gIHNldFBhc3N3b3JkKHBhc3N3b3JkKSB7XG4gICAgdGhpcy5zZXQoJ3Bhc3N3b3JkJywgcGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ2V0KFwiZW1haWxcIikuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFVzZXIncyBFbWFpbFxuICAgKi9cbiAgZ2V0RW1haWwoKSB7XG4gICAgY29uc3QgZW1haWwgPSB0aGlzLmdldCgnZW1haWwnKTtcbiAgICBpZiAoZW1haWwgPT0gbnVsbCB8fCB0eXBlb2YgZW1haWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZW1haWw7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBzZXQoXCJlbWFpbFwiLCBlbWFpbCkgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2V0RW1haWwoZW1haWwpIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoJ2VtYWlsJywgZW1haWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNlc3Npb24gdG9rZW4gZm9yIHRoaXMgdXNlciwgaWYgdGhlIHVzZXIgaGFzIGJlZW4gbG9nZ2VkIGluLFxuICAgKiBvciBpZiBpdCBpcyB0aGUgcmVzdWx0IG9mIGEgcXVlcnkgd2l0aCB0aGUgbWFzdGVyIGtleS4gT3RoZXJ3aXNlLCByZXR1cm5zXG4gICAqIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHNlc3Npb24gdG9rZW4sIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0U2Vzc2lvblRva2VuKCkge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXQoJ3Nlc3Npb25Ub2tlbicpO1xuICAgIGlmICh0b2tlbiA9PSBudWxsIHx8IHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgdXNlciBpcyB0aGUgY3VycmVudCB1c2VyIGFuZCBoYXMgYmVlbiBhdXRoZW50aWNhdGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGlzIHVzZXIgaXMgdGhlIGN1cnJlbnQgdXNlciBhbmQgaXMgbG9nZ2VkIGluLlxuICAgKi9cbiAgYXV0aGVudGljYXRlZCgpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gUGFyc2VVc2VyLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gISF0aGlzLmdldCgnc2Vzc2lvblRva2VuJykgJiYgISFjdXJyZW50ICYmIGN1cnJlbnQuaWQgPT09IHRoaXMuaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdXAgYSBuZXcgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgaW5zdGVhZCBvZiBzYXZlIGZvclxuICAgKiBuZXcgUGFyc2UuVXNlcnMuIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgUGFyc2UuVXNlciBvbiB0aGUgc2VydmVyLCBhbmRcbiAgICogYWxzbyBwZXJzaXN0IHRoZSBzZXNzaW9uIG9uIGRpc2sgc28gdGhhdCB5b3UgY2FuIGFjY2VzcyB0aGUgdXNlciB1c2luZ1xuICAgKiA8Y29kZT5jdXJyZW50PC9jb2RlPi5cbiAgICpcbiAgICogPHA+QSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgc2lnblVwLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJzIEV4dHJhIGZpZWxkcyB0byBzZXQgb24gdGhlIG5ldyB1c2VyLCBvciBudWxsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHNpZ251cFxuICAgKiAgICAgZmluaXNoZXMuXG4gICAqL1xuICBzaWduVXAoYXR0cnMsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBzaWdudXBPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBzaWdudXBPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaW5zdGFsbGF0aW9uSWQnKSkge1xuICAgICAgc2lnbnVwT3B0aW9ucy5pbnN0YWxsYXRpb25JZCA9IG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9wdGlvbnMuY29udGV4dCkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICBzaWdudXBPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnNpZ25VcCh0aGlzLCBhdHRycywgc2lnbnVwT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBpbiBhIFBhcnNlLlVzZXIuIE9uIHN1Y2Nlc3MsIHRoaXMgc2F2ZXMgdGhlIHNlc3Npb24gdG8gZGlzayxcbiAgICogc28geW91IGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIHVzaW5nXG4gICAqIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LlxuICAgKlxuICAgKiA8cD5BIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyBsb2dJbi48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgbG9naW4gaXMgY29tcGxldGUuXG4gICAqL1xuICBsb2dJbigpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgbG9naW5PcHRpb25zID0ge1xuICAgICAgdXNlUG9zdDogdHJ1ZVxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBsb2dpbk9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdpbnN0YWxsYXRpb25JZCcpKSB7XG4gICAgICBsb2dpbk9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPSBvcHRpb25zLmluc3RhbGxhdGlvbklkO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlUG9zdCcpKSB7XG4gICAgICBsb2dpbk9wdGlvbnMudXNlUG9zdCA9IG9wdGlvbnMudXNlUG9zdDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob3B0aW9ucy5jb250ZXh0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIGxvZ2luT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5sb2dJbih0aGlzLCBsb2dpbk9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGRlZmF1bHQgc2F2ZSBiZWhhdmlvciB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gc2F2ZSB0byBsb2NhbFxuICAgKiBzdG9yYWdlIGlmIHRoaXMgaXMgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBhd2FpdCBzdXBlci5zYXZlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmlzQ3VycmVudEFzeW5jKCk7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpLnVwZGF0ZVVzZXJPbkRpc2sodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGRlZmF1bHQgZGVzdHJveSBiZWhhdmlvciB3aXRoIGZ1bmN0aW9uYWxpdHkgdGhhdCBsb2dzIG91dFxuICAgKiB0aGUgY3VycmVudCB1c2VyIHdoZW4gaXQgaXMgZGVzdHJveWVkXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5Vc2VyfVxuICAgKi9cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZGVzdHJveS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5pc0N1cnJlbnRBc3luYygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKS5yZW1vdmVVc2VyRnJvbURpc2soKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZGVmYXVsdCBmZXRjaCBiZWhhdmlvciB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gc2F2ZSB0byBsb2NhbFxuICAgKiBzdG9yYWdlIGlmIHRoaXMgaXMgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuVXNlcn1cbiAgICovXG4gIGFzeW5jIGZldGNoKCkge1xuICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgYXJnc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgIH1cbiAgICBhd2FpdCBzdXBlci5mZXRjaC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5pc0N1cnJlbnRBc3luYygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKS51cGRhdGVVc2VyT25EaXNrKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBkZWZhdWx0IGZldGNoV2l0aEluY2x1ZGUgYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRvIHNhdmUgdG8gbG9jYWxcbiAgICogc3RvcmFnZSBpZiB0aGlzIGlzIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1BhcnNlLlVzZXJ9XG4gICAqL1xuICBhc3luYyBmZXRjaFdpdGhJbmNsdWRlKCkge1xuICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuICAgIH1cbiAgICBhd2FpdCBzdXBlci5mZXRjaFdpdGhJbmNsdWRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmlzQ3VycmVudEFzeW5jKCk7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpLnVwZGF0ZVVzZXJPbkRpc2sodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB3aGV0aGVyIGEgZ2l2ZW4gcGFzc3dvcmQgaXMgdGhlIHBhc3N3b3JkIG9mIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gYmUgdmVyaWZpZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmlnbm9yZUVtYWlsVmVyaWZpY2F0aW9uXSBTZXQgdG8gYHRydWVgIHRvIGJ5cGFzcyBlbWFpbCB2ZXJpZmljYXRpb24gYW5kIHZlcmlmeVxuICAgKiB0aGUgcGFzc3dvcmQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBlbWFpbCBoYXMgYmVlbiB2ZXJpZmllZC4gVGhpcyByZXF1aXJlcyB0aGUgbWFzdGVyIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGEgdXNlciB3aGVuIHRoZSBwYXNzd29yZCBpcyBjb3JyZWN0LlxuICAgKi9cbiAgdmVyaWZ5UGFzc3dvcmQocGFzc3dvcmQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZ2V0VXNlcm5hbWUoKSB8fCAnJztcbiAgICByZXR1cm4gUGFyc2VVc2VyLnZlcmlmeVBhc3N3b3JkKHVzZXJuYW1lLCBwYXNzd29yZCwgb3B0aW9ucyk7XG4gIH1cbiAgc3RhdGljIHJlYWRPbmx5QXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydzZXNzaW9uVG9rZW4nXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIGV4aXN0aW5nIFBhcnNlLlVzZXIgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwcm90b1Byb3BzIEEgc2V0IG9mIHByb3BlcnRpZXMgdG8gYWRkIHRvIHRoZSBwcm90b3R5cGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNsYXNzUHJvcHMgQSBzZXQgb2Ygc3RhdGljIHByb3BlcnRpZXMgdG8gYWRkIHRvIHRoZSBjbGFzc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5Vc2VyfSBUaGUgbmV3bHkgZXh0ZW5kZWQgUGFyc2UuVXNlciBjbGFzc1xuICAgKi9cbiAgc3RhdGljIGV4dGVuZChwcm90b1Byb3BzLCBjbGFzc1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwcm90b1Byb3BzKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY2xhc3NOYW1lJykge1xuICAgICAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkuZGVmYXVsdCkoUGFyc2VVc2VyLnByb3RvdHlwZSwgcHJvcCwge1xuICAgICAgICAgICAgdmFsdWU6IHByb3RvUHJvcHNbcHJvcF0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNsYXNzUHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBjbGFzc1Byb3BzKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY2xhc3NOYW1lJykge1xuICAgICAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkuZGVmYXVsdCkoUGFyc2VVc2VyLCBwcm9wLCB7XG4gICAgICAgICAgICB2YWx1ZTogY2xhc3NQcm9wc1twcm9wXSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUGFyc2VVc2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiBQYXJzZVVzZXIgd2l0aCBhIHZhbGlkIHNlc3Npb24sXG4gICAqIGVpdGhlciBmcm9tIG1lbW9yeSBvciBsb2NhbFN0b3JhZ2UsIGlmIG5lY2Vzc2FyeS5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBUaGUgY3VycmVudGx5IGxvZ2dlZCBpbiBQYXJzZS5Vc2VyLlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgaWYgKCFjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmN1cnJlbnRVc2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIFBhcnNlVXNlciBmcm9tIGFzeW5jaHJvbm91cyBTdG9yYWdlLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSBjdXJyZW50bHlcbiAgICogICBsb2dnZWQgaW4gUGFyc2UgVXNlclxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnRBc3luYygpIHtcbiAgICBpZiAoIWNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5jdXJyZW50VXNlckFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdXAgYSBuZXcgdXNlciB3aXRoIGEgdXNlcm5hbWUgKG9yIGVtYWlsKSBhbmQgcGFzc3dvcmQuXG4gICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgUGFyc2UuVXNlciBvbiB0aGUgc2VydmVyLCBhbmQgYWxzbyBwZXJzaXN0IHRoZVxuICAgKiBzZXNzaW9uIGluIGxvY2FsU3RvcmFnZSBzbyB0aGF0IHlvdSBjYW4gYWNjZXNzIHRoZSB1c2VyIHVzaW5nXG4gICAqIHtAbGluayAjY3VycmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgKG9yIGVtYWlsKSB0byBzaWduIHVwIHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gc2lnbiB1cCB3aXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cnMgRXh0cmEgZmllbGRzIHRvIHNldCBvbiB0aGUgbmV3IHVzZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIHdoZW5cbiAgICogICAgIHRoZSBzaWdudXAgY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIHNpZ25VcCh1c2VybmFtZSwgcGFzc3dvcmQsIGF0dHJzLCBvcHRpb25zKSB7XG4gICAgYXR0cnMgPSBhdHRycyB8fCB7fTtcbiAgICBhdHRycy51c2VybmFtZSA9IHVzZXJuYW1lO1xuICAgIGF0dHJzLnBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKGF0dHJzKTtcbiAgICByZXR1cm4gdXNlci5zaWduVXAoe30sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW4gYSB1c2VyIHdpdGggYSB1c2VybmFtZSAob3IgZW1haWwpIGFuZCBwYXNzd29yZC4gT24gc3VjY2VzcywgdGhpc1xuICAgKiBzYXZlcyB0aGUgc2Vzc2lvbiB0byBkaXNrLCBzbyB5b3UgY2FuIHJldHJpZXZlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluXG4gICAqIHVzZXIgdXNpbmcgPGNvZGU+Y3VycmVudDwvY29kZT4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgKG9yIGVtYWlsKSB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBsb2dJbih1c2VybmFtZSwgcGFzc3dvcmQsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdVc2VybmFtZSBtdXN0IGJlIGEgc3RyaW5nLicpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnUGFzc3dvcmQgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHVzZXIuX2ZpbmlzaEZldGNoKHtcbiAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkOiBwYXNzd29yZFxuICAgIH0pO1xuICAgIHJldHVybiB1c2VyLmxvZ0luKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW4gYSB1c2VyIHdpdGggYSB1c2VybmFtZSAob3IgZW1haWwpIGFuZCBwYXNzd29yZCwgYW5kIGF1dGhEYXRhLiBPbiBzdWNjZXNzLCB0aGlzXG4gICAqIHNhdmVzIHRoZSBzZXNzaW9uIHRvIGRpc2ssIHNvIHlvdSBjYW4gcmV0cmlldmUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW5cbiAgICogdXNlciB1c2luZyA8Y29kZT5jdXJyZW50PC9jb2RlPi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJuYW1lIFRoZSB1c2VybmFtZSAob3IgZW1haWwpIHRvIGxvZyBpbiB3aXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGxvZyBpbiB3aXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXV0aERhdGEgVGhlIGF1dGhEYXRhIHRvIGxvZyBpbiB3aXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgbG9naW4gY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGxvZ0luV2l0aEFkZGl0aW9uYWxBdXRoKHVzZXJuYW1lLCBwYXNzd29yZCwgYXV0aERhdGEsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdVc2VybmFtZSBtdXN0IGJlIGEgc3RyaW5nLicpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnUGFzc3dvcmQgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXV0aERhdGEpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdBdXRoIG11c3QgYmUgYW4gb2JqZWN0LicpKTtcbiAgICB9XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgdXNlci5fZmluaXNoRmV0Y2goe1xuICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgYXV0aERhdGFcbiAgICB9KTtcbiAgICByZXR1cm4gdXNlci5sb2dJbihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB3aXRoIGFuIG9iamVjdElkLiBPbiBzdWNjZXNzLCB0aGlzIHNhdmVzIHRoZSBzZXNzaW9uXG4gICAqIHRvIGRpc2ssIHNvIHlvdSBjYW4gcmV0cmlldmUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlciB1c2luZ1xuICAgKiA8Y29kZT5jdXJyZW50PC9jb2RlPi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJZCBUaGUgb2JqZWN0SWQgZm9yIHRoZSB1c2VyLlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgbG9naW4gY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGxvZ2luQXModXNlcklkKSB7XG4gICAgaWYgKCF1c2VySWQpIHtcbiAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuVVNFUk5BTUVfTUlTU0lORywgJ0Nhbm5vdCBsb2cgaW4gYXMgdXNlciB3aXRoIGFuIGVtcHR5IHVzZXIgaWQnKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIubG9naW5Bcyh1c2VyLCB1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW4gYSB1c2VyIHdpdGggYSBzZXNzaW9uIHRva2VuLiBPbiBzdWNjZXNzLCB0aGlzIHNhdmVzIHRoZSBzZXNzaW9uXG4gICAqIHRvIGRpc2ssIHNvIHlvdSBjYW4gcmV0cmlldmUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlciB1c2luZ1xuICAgKiA8Y29kZT5jdXJyZW50PC9jb2RlPi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25Ub2tlbiBUaGUgc2Vzc2lvblRva2VuIHRvIGxvZyBpbiB3aXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgbG9naW4gY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGJlY29tZShzZXNzaW9uVG9rZW4sIG9wdGlvbnMpIHtcbiAgICBpZiAoIWNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0l0IGlzIG5vdCBtZW1vcnktc2FmZSB0byBiZWNvbWUgYSB1c2VyIGluIGEgc2VydmVyIGVudmlyb25tZW50Jyk7XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGJlY29tZU9wdGlvbnMgPSB7XG4gICAgICBzZXNzaW9uVG9rZW46IHNlc3Npb25Ub2tlblxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBiZWNvbWVPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5iZWNvbWUodXNlciwgYmVjb21lT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgdXNlciB3aXRoIGEgc2Vzc2lvbiB0b2tlbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25Ub2tlbiBUaGUgc2Vzc2lvblRva2VuIHRvIGdldCB1c2VyIHdpdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIGlzIGZldGNoZWQuXG4gICAqL1xuICBzdGF0aWMgbWUoc2Vzc2lvblRva2VuKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IG1lT3B0aW9ucyA9IHtcbiAgICAgIHNlc3Npb25Ub2tlbjogc2Vzc2lvblRva2VuXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy51c2VNYXN0ZXJLZXkpIHtcbiAgICAgIG1lT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIubWUodXNlciwgbWVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB3aXRoIGEgc2Vzc2lvbiB0b2tlbi4gT24gc3VjY2VzcywgdGhpcyBzYXZlcyB0aGUgc2Vzc2lvblxuICAgKiB0byBkaXNrLCBzbyB5b3UgY2FuIHJldHJpZXZlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgdXNpbmdcbiAgICogPGNvZGU+Y3VycmVudDwvY29kZT4uIElmIHRoZXJlIGlzIG5vIHNlc3Npb24gdG9rZW4gdGhlIHVzZXIgd2lsbCBub3QgbG9nZ2VkIGluLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gdXNlckpTT04gVGhlIEpTT04gbWFwIG9mIHRoZSBVc2VyJ3MgZGF0YVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgbG9naW4gY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGh5ZHJhdGUodXNlckpTT04pIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5oeWRyYXRlKHVzZXIsIHVzZXJKU09OKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgdmVyc2lvbiBvZiB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5Vc2VyLmh0bWwjbGlua1dpdGggbGlua1dpdGh9XG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlclxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuYXV0aERhdGFdXG4gICAqIEBwYXJhbSBzYXZlT3B0c1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgc3RhdGljIGxvZ0luV2l0aChwcm92aWRlciwgb3B0aW9ucywgc2F2ZU9wdHMpIHtcbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICByZXR1cm4gdXNlci5saW5rV2l0aChwcm92aWRlciwgb3B0aW9ucywgc2F2ZU9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3Mgb3V0IHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgc2Vzc2lvbi4gVGhpcyB3aWxsIHJlbW92ZSB0aGVcbiAgICogc2Vzc2lvbiBmcm9tIGRpc2ssIGxvZyBvdXQgb2YgbGlua2VkIHNlcnZpY2VzLCBhbmQgZnV0dXJlIGNhbGxzIHRvXG4gICAqIDxjb2RlPmN1cnJlbnQ8L2NvZGU+IHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBzZXNzaW9uIGlzXG4gICAqICAgZGVzdHJveWVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBzdGF0aWMgbG9nT3V0KCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5sb2dPdXQob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYSBwYXNzd29yZCByZXNldCBlbWFpbCB0byBiZSBzZW50IHRvIHRoZSBzcGVjaWZpZWQgZW1haWwgYWRkcmVzc1xuICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgYWNjb3VudC4gVGhpcyBlbWFpbCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VjdXJlbHlcbiAgICogcmVzZXQgdGhlaXIgcGFzc3dvcmQgb24gdGhlIFBhcnNlIHNpdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbCBUaGUgZW1haWwgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdGhhdFxuICAgKiAgICAgZm9yZ290IHRoZWlyIHBhc3N3b3JkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgc3RhdGljIHJlcXVlc3RQYXNzd29yZFJlc2V0KGVtYWlsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5yZXF1ZXN0UGFzc3dvcmRSZXNldChlbWFpbCwgcmVxdWVzdE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYW4gZW1haWwgdmVyaWZpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW1haWwgVGhlIGVtYWlsIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRoYXRcbiAgICogICAgIG5lZWRzIHRvIHZlcmlmeSB0aGVpciBlbWFpbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHN0YXRpYyByZXF1ZXN0RW1haWxWZXJpZmljYXRpb24oZW1haWwsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgcmVxdWVzdE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnJlcXVlc3RFbWFpbFZlcmlmaWNhdGlvbihlbWFpbCwgcmVxdWVzdE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB3aGV0aGVyIGEgZ2l2ZW4gcGFzc3dvcmQgaXMgdGhlIHBhc3N3b3JkIG9mIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqIEBzdGF0aWNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJuYW1lICBUaGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgd2hvc2UgcGFzc3dvcmQgc2hvdWxkIGJlIHZlcmlmaWVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGJlIHZlcmlmaWVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pZ25vcmVFbWFpbFZlcmlmaWNhdGlvbl0gU2V0IHRvIGB0cnVlYCB0byBieXBhc3MgZW1haWwgdmVyaWZpY2F0aW9uIGFuZCB2ZXJpZnlcbiAgICogdGhlIHBhc3N3b3JkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZW1haWwgaGFzIGJlZW4gdmVyaWZpZWQuIFRoaXMgcmVxdWlyZXMgdGhlIG1hc3RlciBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhIHVzZXIgd2hlbiB0aGUgcGFzc3dvcmQgaXMgY29ycmVjdC5cbiAgICovXG4gIHN0YXRpYyB2ZXJpZnlQYXNzd29yZCh1c2VybmFtZSwgcGFzc3dvcmQsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdVc2VybmFtZSBtdXN0IGJlIGEgc3RyaW5nLicpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnUGFzc3dvcmQgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnZlcmlmeVBhc3N3b3JkKHVzZXJuYW1lLCBwYXNzd29yZCwgb3B0aW9ucyB8fCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgc29tZW9uZSB0byBkZWZpbmUgYSBjdXN0b20gVXNlciBjbGFzcyB3aXRob3V0IGNsYXNzTmFtZVxuICAgKiBiZWluZyByZXdyaXR0ZW4gdG8gX1VzZXIuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJld3JpdGVcbiAgICogVXNlciB0byBfVXNlciBmb3IgbGVnYWN5IHJlYXNvbnMuIFRoaXMgYWxsb3dzIGRldmVsb3BlcnMgdG9cbiAgICogb3ZlcnJpZGUgdGhhdCBiZWhhdmlvci5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBpc0FsbG93ZWQgV2hldGhlciBvciBub3QgdG8gYWxsb3cgY3VzdG9tIFVzZXIgY2xhc3NcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGFsbG93Q3VzdG9tVXNlckNsYXNzKGlzQWxsb3dlZCkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnUEVSRk9STV9VU0VSX1JFV1JJVEUnLCAhaXNBbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYSBsZWdhY3kgYXBwbGljYXRpb24gdG8gc3RhcnQgdXNpbmcgcmV2b2NhYmxlIHNlc3Npb25zLiBJZiB0aGVcbiAgICogY3VycmVudCBzZXNzaW9uIHRva2VuIGlzIG5vdCByZXZvY2FibGUsIGEgcmVxdWVzdCB3aWxsIGJlIG1hZGUgZm9yIGEgbmV3LFxuICAgKiByZXZvY2FibGUgc2Vzc2lvbi5cbiAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIHRoaXMgbWV0aG9kIGZyb20gY2xvdWQgY29kZSB1bmxlc3MgeW91IGFyZVxuICAgKiBoYW5kbGluZyB1c2VyIHNpZ251cCBvciBsb2dpbiBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gSW4gYSBjbG91ZCBjb2RlIGNhbGwsXG4gICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYXR0ZW1wdCB0byB1cGdyYWRlIHRoZSBjdXJyZW50IHRva2VuLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBwcm9jZXNzIGhhc1xuICAgKiAgIGNvbXBsZXRlZC4gSWYgYSByZXBsYWNlbWVudCBzZXNzaW9uIHRva2VuIGlzIHJlcXVlc3RlZCwgdGhlIHByb21pc2VcbiAgICogICB3aWxsIGJlIHJlc29sdmVkIGFmdGVyIGEgbmV3IHRva2VuIGhhcyBiZWVuIGZldGNoZWQuXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlUmV2b2NhYmxlU2Vzc2lvbihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdGT1JDRV9SRVZPQ0FCTEVfU0VTU0lPTicsIHRydWUpO1xuICAgIGlmIChjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgY29uc3QgY3VycmVudCA9IFBhcnNlVXNlci5jdXJyZW50KCk7XG4gICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudC5fdXBncmFkZVRvUmV2b2NhYmxlU2Vzc2lvbihvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIHVzZSBvZiBiZWNvbWUgb3IgdGhlIGN1cnJlbnQgdXNlciBpbiBhIHNlcnZlclxuICAgKiBlbnZpcm9ubWVudC4gVGhlc2UgZmVhdHVyZXMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQsIHNpbmNlIHRoZXkgZGVwZW5kIG9uXG4gICAqIGdsb2JhbCBvYmplY3RzIHRoYXQgYXJlIG5vdCBtZW1vcnktc2FmZSBmb3IgbW9zdCBzZXJ2ZXJzLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlVW5zYWZlQ3VycmVudFVzZXIoKSB7XG4gICAgY2FuVXNlQ3VycmVudFVzZXIgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIHRoZSB1c2Ugb2YgYmVjb21lIG9yIHRoZSBjdXJyZW50IHVzZXIgaW4gYW55IGVudmlyb25tZW50LlxuICAgKiBUaGVzZSBmZWF0dXJlcyBhcmUgZGlzYWJsZWQgb24gc2VydmVycyBieSBkZWZhdWx0LCBzaW5jZSB0aGV5IGRlcGVuZCBvblxuICAgKiBnbG9iYWwgb2JqZWN0cyB0aGF0IGFyZSBub3QgbWVtb3J5LXNhZmUgZm9yIG1vc3Qgc2VydmVycy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGRpc2FibGVVbnNhZmVDdXJyZW50VXNlcigpIHtcbiAgICBjYW5Vc2VDdXJyZW50VXNlciA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gcmVnaXN0ZXJpbmcgdXNlcnMgd2l0aCB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5Vc2VyLmh0bWwjbGlua1dpdGggbGlua1dpdGh9IGEgYmFzaWMgYXV0aCBwcm92aWRlclxuICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9yIHlvdS5cbiAgICpcbiAgICogRm9yIGFkdmFuY2VkIGF1dGhlbnRpY2F0aW9uLCB5b3UgY2FuIHJlZ2lzdGVyIGFuIEF1dGggcHJvdmlkZXIgdG9cbiAgICogaW1wbGVtZW50IGN1c3RvbSBhdXRoZW50aWNhdGlvbiwgZGVhdXRoZW50aWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvQXV0aFByb3ZpZGVyLmh0bWwgQXV0aFByb3ZpZGVyfVxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvanMvZ3VpZGUvI2N1c3RvbS1hdXRoZW50aWNhdGlvbi1tb2R1bGUgQ3VzdG9tIEF1dGhlbnRpY2F0aW9uIE1vZHVsZX1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIF9yZWdpc3RlckF1dGhlbnRpY2F0aW9uUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICBhdXRoUHJvdmlkZXJzW3Byb3ZpZGVyLmdldEF1dGhUeXBlKCldID0gcHJvdmlkZXI7XG4gICAgLy8gU3luY2hyb25pemUgdGhlIGN1cnJlbnQgdXNlciB3aXRoIHRoZSBhdXRoIHByb3ZpZGVyLlxuICAgIFBhcnNlVXNlci5jdXJyZW50QXN5bmMoKS50aGVuKGN1cnJlbnQgPT4ge1xuICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgY3VycmVudC5fc3luY2hyb25pemVBdXRoRGF0YShwcm92aWRlci5nZXRBdXRoVHlwZSgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLmF1dGhEYXRhXVxuICAgKiBAcGFyYW0gc2F2ZU9wdHNcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgMi45LjAgc2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlVzZXIuaHRtbCNsb2dJbldpdGggbG9nSW5XaXRofVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgc3RhdGljIF9sb2dJbldpdGgocHJvdmlkZXIsIG9wdGlvbnMsIHNhdmVPcHRzKSB7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIHVzZXIubGlua1dpdGgocHJvdmlkZXIsIG9wdGlvbnMsIHNhdmVPcHRzKTtcbiAgfVxuICBzdGF0aWMgX2NsZWFyQ2FjaGUoKSB7XG4gICAgY3VycmVudFVzZXJDYWNoZSA9IG51bGw7XG4gICAgY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrID0gZmFsc2U7XG4gIH1cbiAgc3RhdGljIF9zZXRDdXJyZW50VXNlckNhY2hlKHVzZXIpIHtcbiAgICBjdXJyZW50VXNlckNhY2hlID0gdXNlcjtcbiAgfVxufVxuX1BhcnNlT2JqZWN0LmRlZmF1bHQucmVnaXN0ZXJTdWJjbGFzcygnX1VzZXInLCBQYXJzZVVzZXIpO1xuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIHVwZGF0ZVVzZXJPbkRpc2sodXNlcikge1xuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX1VTRVJfS0VZKTtcbiAgICBjb25zdCBqc29uID0gdXNlci50b0pTT04oKTtcbiAgICBkZWxldGUganNvbi5wYXNzd29yZDtcbiAgICBqc29uLmNsYXNzTmFtZSA9ICdfVXNlcic7XG4gICAgbGV0IHVzZXJEYXRhID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoanNvbik7XG4gICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRU5DUllQVEVEX1VTRVInKSkge1xuICAgICAgY29uc3QgY3J5cHRvID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q3J5cHRvQ29udHJvbGxlcigpO1xuICAgICAgdXNlckRhdGEgPSBjcnlwdG8uZW5jcnlwdChqc29uLCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9LRVknKSk7XG4gICAgfVxuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhwYXRoLCB1c2VyRGF0YSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9KTtcbiAgfSxcbiAgcmVtb3ZlVXNlckZyb21EaXNrKCkge1xuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX1VTRVJfS0VZKTtcbiAgICBjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2sgPSB0cnVlO1xuICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSBudWxsO1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnJlbW92ZUl0ZW1Bc3luYyhwYXRoKTtcbiAgfSxcbiAgc2V0Q3VycmVudFVzZXIodXNlcikge1xuICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSB1c2VyO1xuICAgIHVzZXIuX2NsZWFudXBBdXRoRGF0YSgpO1xuICAgIHVzZXIuX3N5bmNocm9uaXplQWxsQXV0aERhdGEoKTtcbiAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIudXBkYXRlVXNlck9uRGlzayh1c2VyKTtcbiAgfSxcbiAgY3VycmVudFVzZXIoKSB7XG4gICAgaWYgKGN1cnJlbnRVc2VyQ2FjaGUpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VXNlckNhY2hlO1xuICAgIH1cbiAgICBpZiAoY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKF9TdG9yYWdlLmRlZmF1bHQuYXN5bmMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBjdXJyZW50VXNlcigpIHdoZW4gdXNpbmcgYSBwbGF0Zm9ybSB3aXRoIGFuIGFzeW5jICcgKyAnc3RvcmFnZSBzeXN0ZW0uIENhbGwgY3VycmVudFVzZXJBc3luYygpIGluc3RlYWQuJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX1VTRVJfS0VZKTtcbiAgICBsZXQgdXNlckRhdGEgPSBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW0ocGF0aCk7XG4gICAgY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrID0gdHJ1ZTtcbiAgICBpZiAoIXVzZXJEYXRhKSB7XG4gICAgICBjdXJyZW50VXNlckNhY2hlID0gbnVsbDtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfVVNFUicpKSB7XG4gICAgICBjb25zdCBjcnlwdG8gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDcnlwdG9Db250cm9sbGVyKCk7XG4gICAgICB1c2VyRGF0YSA9IGNyeXB0by5kZWNyeXB0KHVzZXJEYXRhLCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9LRVknKSk7XG4gICAgfVxuICAgIHVzZXJEYXRhID0gSlNPTi5wYXJzZSh1c2VyRGF0YSk7XG4gICAgaWYgKCF1c2VyRGF0YS5jbGFzc05hbWUpIHtcbiAgICAgIHVzZXJEYXRhLmNsYXNzTmFtZSA9ICdfVXNlcic7XG4gICAgfVxuICAgIGlmICh1c2VyRGF0YS5faWQpIHtcbiAgICAgIGlmICh1c2VyRGF0YS5vYmplY3RJZCAhPT0gdXNlckRhdGEuX2lkKSB7XG4gICAgICAgIHVzZXJEYXRhLm9iamVjdElkID0gdXNlckRhdGEuX2lkO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHVzZXJEYXRhLl9pZDtcbiAgICB9XG4gICAgaWYgKHVzZXJEYXRhLl9zZXNzaW9uVG9rZW4pIHtcbiAgICAgIHVzZXJEYXRhLnNlc3Npb25Ub2tlbiA9IHVzZXJEYXRhLl9zZXNzaW9uVG9rZW47XG4gICAgICBkZWxldGUgdXNlckRhdGEuX3Nlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudCA9IF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKHVzZXJEYXRhKTtcbiAgICBjdXJyZW50VXNlckNhY2hlID0gY3VycmVudDtcbiAgICBjdXJyZW50Ll9zeW5jaHJvbml6ZUFsbEF1dGhEYXRhKCk7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH0sXG4gIGN1cnJlbnRVc2VyQXN5bmMoKSB7XG4gICAgaWYgKGN1cnJlbnRVc2VyQ2FjaGUpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY3VycmVudFVzZXJDYWNoZSk7XG4gICAgfVxuICAgIGlmIChjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2spIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUobnVsbCk7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX1VTRVJfS0VZKTtcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMocGF0aCkudGhlbih1c2VyRGF0YSA9PiB7XG4gICAgICBjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2sgPSB0cnVlO1xuICAgICAgaWYgKCF1c2VyRGF0YSkge1xuICAgICAgICBjdXJyZW50VXNlckNhY2hlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9VU0VSJykpIHtcbiAgICAgICAgY29uc3QgY3J5cHRvID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q3J5cHRvQ29udHJvbGxlcigpO1xuICAgICAgICB1c2VyRGF0YSA9IGNyeXB0by5kZWNyeXB0KHVzZXJEYXRhLnRvU3RyaW5nKCksIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRU5DUllQVEVEX0tFWScpKTtcbiAgICAgIH1cbiAgICAgIHVzZXJEYXRhID0gSlNPTi5wYXJzZSh1c2VyRGF0YSk7XG4gICAgICBpZiAoIXVzZXJEYXRhLmNsYXNzTmFtZSkge1xuICAgICAgICB1c2VyRGF0YS5jbGFzc05hbWUgPSAnX1VzZXInO1xuICAgICAgfVxuICAgICAgaWYgKHVzZXJEYXRhLl9pZCkge1xuICAgICAgICBpZiAodXNlckRhdGEub2JqZWN0SWQgIT09IHVzZXJEYXRhLl9pZCkge1xuICAgICAgICAgIHVzZXJEYXRhLm9iamVjdElkID0gdXNlckRhdGEuX2lkO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB1c2VyRGF0YS5faWQ7XG4gICAgICB9XG4gICAgICBpZiAodXNlckRhdGEuX3Nlc3Npb25Ub2tlbikge1xuICAgICAgICB1c2VyRGF0YS5zZXNzaW9uVG9rZW4gPSB1c2VyRGF0YS5fc2Vzc2lvblRva2VuO1xuICAgICAgICBkZWxldGUgdXNlckRhdGEuX3Nlc3Npb25Ub2tlbjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTih1c2VyRGF0YSk7XG4gICAgICBjdXJyZW50VXNlckNhY2hlID0gY3VycmVudDtcbiAgICAgIGN1cnJlbnQuX3N5bmNocm9uaXplQWxsQXV0aERhdGEoKTtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY3VycmVudCk7XG4gICAgfSk7XG4gIH0sXG4gIHNpZ25VcCh1c2VyLCBhdHRycywgb3B0aW9ucykge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gYXR0cnMgJiYgYXR0cnMudXNlcm5hbWUgfHwgdXNlci5nZXQoJ3VzZXJuYW1lJyk7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBhdHRycyAmJiBhdHRycy5wYXNzd29yZCB8fCB1c2VyLmdldCgncGFzc3dvcmQnKTtcbiAgICBpZiAoIXVzZXJuYW1lIHx8ICF1c2VybmFtZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnQ2Fubm90IHNpZ24gdXAgdXNlciB3aXRoIGFuIGVtcHR5IHVzZXJuYW1lLicpKTtcbiAgICB9XG4gICAgaWYgKCFwYXNzd29yZCB8fCAhcGFzc3dvcmQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ0Nhbm5vdCBzaWduIHVwIHVzZXIgd2l0aCBhbiBlbXB0eSBwYXNzd29yZC4nKSk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyLnNhdmUoYXR0cnMsIG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gQ2xlYXIgdGhlIHBhc3N3b3JkIGZpZWxkXG4gICAgICB1c2VyLl9maW5pc2hGZXRjaCh7XG4gICAgICAgIHBhc3N3b3JkOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKGNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH0pO1xuICB9LFxuICBsb2dJbih1c2VyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IGF1dGggPSB7XG4gICAgICB1c2VybmFtZTogdXNlci5nZXQoJ3VzZXJuYW1lJyksXG4gICAgICBwYXNzd29yZDogdXNlci5nZXQoJ3Bhc3N3b3JkJyksXG4gICAgICBhdXRoRGF0YTogdXNlci5nZXQoJ2F1dGhEYXRhJylcbiAgICB9O1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KG9wdGlvbnMudXNlUG9zdCA/ICdQT1NUJyA6ICdHRVQnLCAnbG9naW4nLCBhdXRoLCBvcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIHVzZXIuX21pZ3JhdGVJZChyZXNwb25zZS5vYmplY3RJZCk7XG4gICAgICB1c2VyLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgICAgc3RhdGVDb250cm9sbGVyLnNldFBlbmRpbmdPcCh1c2VyLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgJ3VzZXJuYW1lJywgdW5kZWZpbmVkKTtcbiAgICAgIHN0YXRlQ29udHJvbGxlci5zZXRQZW5kaW5nT3AodXNlci5fZ2V0U3RhdGVJZGVudGlmaWVyKCksICdwYXNzd29yZCcsIHVuZGVmaW5lZCk7XG4gICAgICByZXNwb25zZS5wYXNzd29yZCA9IHVuZGVmaW5lZDtcbiAgICAgIHVzZXIuX2ZpbmlzaEZldGNoKHJlc3BvbnNlKTtcbiAgICAgIGlmICghY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgICAgLy8gV2UgY2FuJ3Qgc2V0IHRoZSBjdXJyZW50IHVzZXIsIHNvIGp1c3QgcmV0dXJuIHRoZSBvbmUgd2UgbG9nZ2VkIGluXG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodXNlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgfSk7XG4gIH0sXG4gIGxvZ2luQXModXNlciwgdXNlcklkKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2xvZ2luQXMnLCB7XG4gICAgICB1c2VySWRcbiAgICB9LCB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIHVzZXIuX2ZpbmlzaEZldGNoKHJlc3BvbnNlKTtcbiAgICAgIHVzZXIuX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgICBpZiAoIWNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodXNlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgfSk7XG4gIH0sXG4gIGJlY29tZSh1c2VyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAndXNlcnMvbWUnLCB7fSwgb3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICB1c2VyLl9maW5pc2hGZXRjaChyZXNwb25zZSk7XG4gICAgICB1c2VyLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH0pO1xuICB9LFxuICBoeWRyYXRlKHVzZXIsIHVzZXJKU09OKSB7XG4gICAgdXNlci5fZmluaXNoRmV0Y2godXNlckpTT04pO1xuICAgIHVzZXIuX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgaWYgKHVzZXJKU09OLnNlc3Npb25Ub2tlbiAmJiBjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVzZXIpO1xuICAgIH1cbiAgfSxcbiAgbWUodXNlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ3VzZXJzL21lJywge30sIG9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgdXNlci5fZmluaXNoRmV0Y2gocmVzcG9uc2UpO1xuICAgICAgdXNlci5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH0pO1xuICB9LFxuICBsb2dPdXQob3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBpZiAob3B0aW9ucy5zZXNzaW9uVG9rZW4pIHtcbiAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2xvZ291dCcsIHt9LCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLmN1cnJlbnRVc2VyQXN5bmMoKS50aGVuKGN1cnJlbnRVc2VyID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX1VTRVJfS0VZKTtcbiAgICAgIGxldCBwcm9taXNlID0gX1N0b3JhZ2UuZGVmYXVsdC5yZW1vdmVJdGVtQXN5bmMocGF0aCk7XG4gICAgICBpZiAoY3VycmVudFVzZXIgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFNlc3Npb24gPSBjdXJyZW50VXNlci5nZXRTZXNzaW9uVG9rZW4oKTtcbiAgICAgICAgaWYgKGN1cnJlbnRTZXNzaW9uICYmICgwLCBfaXNSZXZvY2FibGVTZXNzaW9uLmRlZmF1bHQpKGN1cnJlbnRTZXNzaW9uKSkge1xuICAgICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnbG9nb3V0Jywge30sIHtcbiAgICAgICAgICAgICAgc2Vzc2lvblRva2VuOiBjdXJyZW50U2Vzc2lvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFVzZXIuX2xvZ091dFdpdGhBbGwoKTtcbiAgICAgICAgY3VycmVudFVzZXIuX2ZpbmlzaEZldGNoKHtcbiAgICAgICAgICBzZXNzaW9uVG9rZW46IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzayA9IHRydWU7XG4gICAgICBjdXJyZW50VXNlckNhY2hlID0gbnVsbDtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH0pO1xuICB9LFxuICByZXF1ZXN0UGFzc3dvcmRSZXNldChlbWFpbCwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdyZXF1ZXN0UGFzc3dvcmRSZXNldCcsIHtcbiAgICAgIGVtYWlsOiBlbWFpbFxuICAgIH0sIG9wdGlvbnMpO1xuICB9LFxuICBhc3luYyB1cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uKHVzZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB0b2tlbiA9IHVzZXIuZ2V0U2Vzc2lvblRva2VuKCk7XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuU0VTU0lPTl9NSVNTSU5HLCAnQ2Fubm90IHVwZ3JhZGUgYSB1c2VyIHdpdGggbm8gc2Vzc2lvbiB0b2tlbicpKTtcbiAgICB9XG4gICAgb3B0aW9ucy5zZXNzaW9uVG9rZW4gPSB0b2tlbjtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICd1cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uJywge30sIG9wdGlvbnMpO1xuICAgIHVzZXIuX2ZpbmlzaEZldGNoKHtcbiAgICAgIHNlc3Npb25Ub2tlbjogcmVzdWx0Py5zZXNzaW9uVG9rZW4gfHwgJydcbiAgICB9KTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdXNlci5pc0N1cnJlbnRBc3luYygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodXNlcik7XG4gIH0sXG4gIGxpbmtXaXRoKHVzZXIsIGF1dGhEYXRhLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHVzZXIuc2F2ZSh7XG4gICAgICBhdXRoRGF0YVxuICAgIH0sIG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKGNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH0pO1xuICB9LFxuICB2ZXJpZnlQYXNzd29yZCh1c2VybmFtZSwgcGFzc3dvcmQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHVzZXJuYW1lLFxuICAgICAgcGFzc3dvcmQsXG4gICAgICAuLi4ob3B0aW9ucy5pZ25vcmVFbWFpbFZlcmlmaWNhdGlvbiAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgaWdub3JlRW1haWxWZXJpZmljYXRpb246IG9wdGlvbnMuaWdub3JlRW1haWxWZXJpZmljYXRpb25cbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ3ZlcmlmeVBhc3N3b3JkJywgZGF0YSwgb3B0aW9ucyk7XG4gIH0sXG4gIHJlcXVlc3RFbWFpbFZlcmlmaWNhdGlvbihlbWFpbCwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICd2ZXJpZmljYXRpb25FbWFpbFJlcXVlc3QnLCB7XG4gICAgICBlbWFpbDogZW1haWxcbiAgICB9LCBvcHRpb25zKTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFBhcnNlVXNlcihQYXJzZVVzZXIpO1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0VXNlckNvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VVc2VyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldFB1c2hTdGF0dXMgPSBnZXRQdXNoU3RhdHVzO1xuZXhwb3J0cy5zZW5kID0gc2VuZDtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VRdWVyeVwiKSk7XG4vKipcbiAqIENvbnRhaW5zIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggUHVzaCBpbiBQYXJzZS5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuUHVzaFxuICogQHN0YXRpY1xuICogQGhpZGVjb25zdHJ1Y3RvclxuICovXG5cbi8qKlxuICogU2VuZHMgYSBwdXNoIG5vdGlmaWNhdGlvbi5cbiAqICoqQXZhaWxhYmxlIGluIENsb3VkIENvZGUgb25seS4qKlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL2pzL2d1aWRlLyNwdXNoLW5vdGlmaWNhdGlvbnMgUHVzaCBOb3RpZmljYXRpb24gR3VpZGV9XG4gKlxuICogQGZ1bmN0aW9uIHNlbmRcbiAqIEBuYW1lIFBhcnNlLlB1c2guc2VuZFxuICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSAgVGhlIGRhdGEgb2YgdGhlIHB1c2ggbm90aWZpY2F0aW9uLiBWYWxpZCBmaWVsZHNcbiAqIGFyZTpcbiAqICAgPG9sPlxuICogICAgIDxsaT5jaGFubmVscyAtIEFuIEFycmF5IG9mIGNoYW5uZWxzIHRvIHB1c2ggdG8uPC9saT5cbiAqICAgICA8bGk+cHVzaF90aW1lIC0gQSBEYXRlIG9iamVjdCBmb3Igd2hlbiB0byBzZW5kIHRoZSBwdXNoLjwvbGk+XG4gKiAgICAgPGxpPmV4cGlyYXRpb25fdGltZSAtICBBIERhdGUgb2JqZWN0IGZvciB3aGVuIHRvIGV4cGlyZVxuICogICAgICAgICB0aGUgcHVzaC48L2xpPlxuICogICAgIDxsaT5leHBpcmF0aW9uX2ludGVydmFsIC0gVGhlIHNlY29uZHMgZnJvbSBub3cgdG8gZXhwaXJlIHRoZSBwdXNoLjwvbGk+XG4gKiAgICAgPGxpPndoZXJlIC0gQSBQYXJzZS5RdWVyeSBvdmVyIFBhcnNlLkluc3RhbGxhdGlvbiB0aGF0IGlzIHVzZWQgdG8gbWF0Y2hcbiAqICAgICAgICAgYSBzZXQgb2YgaW5zdGFsbGF0aW9ucyB0byBwdXNoIHRvLjwvbGk+XG4gKiAgICAgPGxpPmRhdGEgLSBUaGUgZGF0YSB0byBzZW5kIGFzIHBhcnQgb2YgdGhlIHB1c2guPC9saT5cbiAqICAgPG9sPlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9uc1xuICogYXJlOjx1bD5cbiAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gKiA8L3VsPlxuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBwdXNoIHJlcXVlc3RcbiAqICAgICBjb21wbGV0ZXMgYW5kIHJldHVybnMgYHB1c2hTdGF0dXNJZGAuXG4gKi9cbmZ1bmN0aW9uIHNlbmQoZGF0YSkge1xuICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIGlmIChkYXRhLndoZXJlICYmIGRhdGEud2hlcmUgaW5zdGFuY2VvZiBfUGFyc2VRdWVyeS5kZWZhdWx0KSB7XG4gICAgZGF0YS53aGVyZSA9IGRhdGEud2hlcmUudG9KU09OKCkud2hlcmU7XG4gIH1cbiAgaWYgKGRhdGEucHVzaF90aW1lICYmIHR5cGVvZiBkYXRhLnB1c2hfdGltZSA9PT0gJ29iamVjdCcpIHtcbiAgICBkYXRhLnB1c2hfdGltZSA9IGRhdGEucHVzaF90aW1lLnRvSlNPTigpO1xuICB9XG4gIGlmIChkYXRhLmV4cGlyYXRpb25fdGltZSAmJiB0eXBlb2YgZGF0YS5leHBpcmF0aW9uX3RpbWUgPT09ICdvYmplY3QnKSB7XG4gICAgZGF0YS5leHBpcmF0aW9uX3RpbWUgPSBkYXRhLmV4cGlyYXRpb25fdGltZS50b0pTT04oKTtcbiAgfVxuICBpZiAoZGF0YS5leHBpcmF0aW9uX3RpbWUgJiYgZGF0YS5leHBpcmF0aW9uX2ludGVydmFsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBpcmF0aW9uX3RpbWUgYW5kIGV4cGlyYXRpb25faW50ZXJ2YWwgY2Fubm90IGJvdGggYmUgc2V0LicpO1xuICB9XG4gIGNvbnN0IHB1c2hPcHRpb25zID0ge1xuICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICB9O1xuICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICBwdXNoT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgfVxuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UHVzaENvbnRyb2xsZXIoKS5zZW5kKGRhdGEsIHB1c2hPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBHZXRzIHB1c2ggc3RhdHVzIGJ5IElkXG4gKlxuICogQGZ1bmN0aW9uIGdldFB1c2hTdGF0dXNcbiAqIEBuYW1lIFBhcnNlLlB1c2guZ2V0UHVzaFN0YXR1c1xuICogQHBhcmFtIHtzdHJpbmd9IHB1c2hTdGF0dXNJZCBUaGUgSWQgb2YgUHVzaCBTdGF0dXMuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zXG4gKiBhcmU6PHVsPlxuICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAqIDwvdWw+XG4gKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBTdGF0dXMgb2YgUHVzaC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHVzaFN0YXR1cyhwdXNoU3RhdHVzSWQpIHtcbiAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICBjb25zdCBwdXNoT3B0aW9ucyA9IHtcbiAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgfTtcbiAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgcHVzaE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gIH1cbiAgY29uc3QgcXVlcnkgPSBuZXcgX1BhcnNlUXVlcnkuZGVmYXVsdCgnX1B1c2hTdGF0dXMnKTtcbiAgcmV0dXJuIHF1ZXJ5LmdldChwdXNoU3RhdHVzSWQsIHB1c2hPcHRpb25zKTtcbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBhc3luYyBzZW5kKGRhdGEsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnJldHVyblN0YXR1cyA9IHRydWU7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLnJlcXVlc3QoJ1BPU1QnLCAncHVzaCcsIGRhdGEsIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXNwb25zZS5faGVhZGVycz8uWydYLVBhcnNlLVB1c2gtU3RhdHVzLUlkJ107XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQdXNoQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfc2V0VGltZW91dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC10aW1lb3V0XCIpKTtcbnZhciBfdXVpZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXVpZFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9wcm9taXNlVXRpbHMgPSByZXF1aXJlKFwiLi9wcm9taXNlVXRpbHNcIik7XG52YXIgX1hociA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vWGhyLndlYXBwXCIpKTtcbi8qIGdsb2JhbCBYTUxIdHRwUmVxdWVzdCwgWERvbWFpblJlcXVlc3QgKi9cblxubGV0IFhIUiA9IG51bGw7XG5pZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICBYSFIgPSBYTUxIdHRwUmVxdWVzdDtcbn1cbmxldCB1c2VYRG9tYWluUmVxdWVzdCA9IGZhbHNlO1xuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBYRG9tYWluUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgISgnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKSkpIHtcbiAgdXNlWERvbWFpblJlcXVlc3QgPSB0cnVlO1xufVxuZnVuY3Rpb24gYWpheElFOShtZXRob2QsIHVybCwgZGF0YSwgaGVhZGVycywgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB4ZHIgPSBuZXcgWERvbWFpblJlcXVlc3QoKTtcbiAgICB4ZHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhkci5yZXNwb25zZVRleHQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB4ZHIub25lcnJvciA9IHhkci5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBMZXQncyBmYWtlIGEgcmVhbCBlcnJvciBtZXNzYWdlLlxuICAgICAgY29uc3QgZmFrZVJlc3BvbnNlID0ge1xuICAgICAgICByZXNwb25zZVRleHQ6ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHtcbiAgICAgICAgICBjb2RlOiBfUGFyc2VFcnJvci5kZWZhdWx0LlhfRE9NQUlOX1JFUVVFU1QsXG4gICAgICAgICAgZXJyb3I6IFwiSUUncyBYRG9tYWluUmVxdWVzdCBkb2VzIG5vdCBzdXBwbHkgZXJyb3IgaW5mby5cIlxuICAgICAgICB9KVxuICAgICAgfTtcbiAgICAgIHJlamVjdChmYWtlUmVzcG9uc2UpO1xuICAgIH07XG4gICAgeGRyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5wcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvcHRpb25zLnByb2dyZXNzKHhkci5yZXNwb25zZVRleHQpO1xuICAgICAgfVxuICAgIH07XG4gICAgeGRyLm9wZW4obWV0aG9kLCB1cmwpO1xuICAgIHhkci5zZW5kKGRhdGEpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZXF1ZXN0VGFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucy5yZXF1ZXN0VGFzayh4ZHIpO1xuICAgIH1cbiAgfSk7XG59XG5jb25zdCBSRVNUQ29udHJvbGxlciA9IHtcbiAgYWpheChtZXRob2QsIHVybCwgZGF0YSwgaGVhZGVycywgb3B0aW9ucykge1xuICAgIHZhciBfY29udGV4dDtcbiAgICBpZiAodXNlWERvbWFpblJlcXVlc3QpIHtcbiAgICAgIHJldHVybiBhamF4SUU5KG1ldGhvZCwgdXJsLCBkYXRhLCBoZWFkZXJzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgY29uc3QgaXNJZGVtcG90ZW50ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJREVNUE9URU5DWScpICYmICgwLCBfaW5jbHVkZXMuZGVmYXVsdCkoX2NvbnRleHQgPSBbJ1BPU1QnLCAnUFVUJ10pLmNhbGwoX2NvbnRleHQsIG1ldGhvZCk7XG4gICAgY29uc3QgcmVxdWVzdElkID0gaXNJZGVtcG90ZW50ID8gKDAsIF91dWlkLmRlZmF1bHQpKCkgOiAnJztcbiAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgIGNvbnN0IGRpc3BhdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKFhIUiA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1ha2UgYSByZXF1ZXN0OiBObyBkZWZpbml0aW9uIG9mIFhNTEh0dHBSZXF1ZXN0IHdhcyBmb3VuZC4nKTtcbiAgICAgIH1cbiAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCB4aHIgPSBuZXcgWEhSKCk7XG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IDQgfHwgaGFuZGxlZCB8fCB4aHIuX2Fib3J0ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVIZWFkZXJzID0gdHlwZW9mIHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMgPT09ICdmdW5jdGlvbicgPyB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgOiAnJztcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgeGhyLmdldFJlc3BvbnNlSGVhZGVyID09PSAnZnVuY3Rpb24nICYmIGF2YWlsYWJsZUhlYWRlcnM/LmluZGV4T2YoJ2FjY2Vzcy1jb250cm9sLWV4cG9zZS1oZWFkZXJzJykgPj0gMCkge1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2FjY2Vzcy1jb250cm9sLWV4cG9zZS1oZWFkZXJzJykuc3BsaXQoJywgJyk7XG4gICAgICAgICAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShyZXNwb25zZUhlYWRlcnMpLmNhbGwocmVzcG9uc2VIZWFkZXJzLCBoZWFkZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoYXZhaWxhYmxlSGVhZGVycykuY2FsbChhdmFpbGFibGVIZWFkZXJzLCBoZWFkZXIudG9Mb3dlckNhc2UoKSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgaGVhZGVyc1toZWFkZXJdID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlci50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KGUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgICAgICAgICAgeGhyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoeGhyLnN0YXR1cyA+PSA1MDAgfHwgeGhyLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgIC8vIHJldHJ5IG9uIDVYWCBvciBub2RlLXhtbGh0dHByZXF1ZXN0IGVycm9yXG4gICAgICAgICAgaWYgKCsrYXR0ZW1wdHMgPCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1JFUVVFU1RfQVRURU1QVF9MSU1JVCcpKSB7XG4gICAgICAgICAgICAvLyBFeHBvbmVudGlhbGx5LWdyb3dpbmcgcmFuZG9tIGRlbGF5XG4gICAgICAgICAgICBjb25zdCBkZWxheSA9IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDEyNSAqIE1hdGgucG93KDIsIGF0dGVtcHRzKSk7XG4gICAgICAgICAgICAoMCwgX3NldFRpbWVvdXQyLmRlZmF1bHQpKGRpc3BhdGNoLCBkZWxheSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdCgnVW5hYmxlIHRvIGNvbm5lY3QgdG8gdGhlIFBhcnNlIEFQSScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBZnRlciB0aGUgcmV0cnkgbGltaXQgaXMgcmVhY2hlZCwgZmFpbFxuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoeGhyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvbWlzZS5yZWplY3QoeGhyKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzIHx8IHt9O1xuICAgICAgaWYgKHR5cGVvZiBoZWFkZXJzWydDb250ZW50LVR5cGUnXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAndGV4dC9wbGFpbic7IC8vIEF2b2lkIHByZS1mbGlnaHRcbiAgICAgIH1cbiAgICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0lTX05PREUnKSkge1xuICAgICAgICBoZWFkZXJzWydVc2VyLUFnZW50J10gPSAnUGFyc2UvJyArIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnVkVSU0lPTicpICsgJyAoTm9kZUpTICcgKyBwcm9jZXNzLnZlcnNpb25zLm5vZGUgKyAnKSc7XG4gICAgICB9XG4gICAgICBpZiAoaXNJZGVtcG90ZW50KSB7XG4gICAgICAgIGhlYWRlcnNbJ1gtUGFyc2UtUmVxdWVzdC1JZCddID0gcmVxdWVzdElkO1xuICAgICAgfVxuICAgICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX0FVVEhfVFlQRScpICYmIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX0FVVEhfVE9LRU4nKSkge1xuICAgICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RZUEUnKSArICcgJyArIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX0FVVEhfVE9LRU4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1c3RvbUhlYWRlcnMgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1JFUVVFU1RfSEVBREVSUycpO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3VzdG9tSGVhZGVycykge1xuICAgICAgICBoZWFkZXJzW2tleV0gPSBjdXN0b21IZWFkZXJzW2tleV07XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5wcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBoYW5kbGVQcm9ncmVzcyA9IGZ1bmN0aW9uICh0eXBlLCBldmVudCkge1xuICAgICAgICAgIGlmIChldmVudC5sZW5ndGhDb21wdXRhYmxlKSB7XG4gICAgICAgICAgICBvcHRpb25zLnByb2dyZXNzKGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsLCBldmVudC5sb2FkZWQsIGV2ZW50LnRvdGFsLCB7XG4gICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLnByb2dyZXNzKG51bGwsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB4aHIub25wcm9ncmVzcyA9IGV2ZW50ID0+IHtcbiAgICAgICAgICBoYW5kbGVQcm9ncmVzcygnZG93bmxvYWQnLCBldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh4aHIudXBsb2FkKSB7XG4gICAgICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gZXZlbnQgPT4ge1xuICAgICAgICAgICAgaGFuZGxlUHJvZ3Jlc3MoJ3VwbG9hZCcsIGV2ZW50KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB4aHIub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgICBmb3IgKGNvbnN0IGggaW4gaGVhZGVycykge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoLCBoZWFkZXJzW2hdKTtcbiAgICAgIH1cbiAgICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBwcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICByZXN1bHRzOiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICAgIHhoclxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB4aHIuc2VuZChkYXRhKTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlcXVlc3RUYXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgb3B0aW9ucy5yZXF1ZXN0VGFzayh4aHIpO1xuICAgICAgfVxuICAgIH07XG4gICAgZGlzcGF0Y2goKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSxcbiAgcmVxdWVzdChtZXRob2QsIHBhdGgsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBsZXQgdXJsID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfVVJMJyk7XG4gICAgaWYgKHVybFt1cmwubGVuZ3RoIC0gMV0gIT09ICcvJykge1xuICAgICAgdXJsICs9ICcvJztcbiAgICB9XG4gICAgdXJsICs9IHBhdGg7XG4gICAgY29uc3QgcGF5bG9hZCA9IHt9O1xuICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCBrIGluIGRhdGEpIHtcbiAgICAgICAgcGF5bG9hZFtrXSA9IGRhdGFba107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGNvbnRleHRcbiAgICBjb25zdCBjb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIGlmIChjb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBheWxvYWQuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cbiAgICBpZiAobWV0aG9kICE9PSAnUE9TVCcpIHtcbiAgICAgIHBheWxvYWQuX21ldGhvZCA9IG1ldGhvZDtcbiAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICB9XG4gICAgcGF5bG9hZC5fQXBwbGljYXRpb25JZCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQVBQTElDQVRJT05fSUQnKTtcbiAgICBjb25zdCBqc0tleSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSkFWQVNDUklQVF9LRVknKTtcbiAgICBpZiAoanNLZXkpIHtcbiAgICAgIHBheWxvYWQuX0phdmFTY3JpcHRLZXkgPSBqc0tleTtcbiAgICB9XG4gICAgcGF5bG9hZC5fQ2xpZW50VmVyc2lvbiA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnVkVSU0lPTicpO1xuICAgIGxldCB1c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICBpZiAodHlwZW9mIHVzZU1hc3RlcktleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHVzZU1hc3RlcktleSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnVVNFX01BU1RFUl9LRVknKTtcbiAgICB9XG4gICAgaWYgKHVzZU1hc3RlcktleSkge1xuICAgICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTUFTVEVSX0tFWScpKSB7XG4gICAgICAgIGRlbGV0ZSBwYXlsb2FkLl9KYXZhU2NyaXB0S2V5O1xuICAgICAgICBwYXlsb2FkLl9NYXN0ZXJLZXkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ01BU1RFUl9LRVknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSB0aGUgTWFzdGVyIEtleSwgaXQgaGFzIG5vdCBiZWVuIHByb3ZpZGVkLicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdGT1JDRV9SRVZPQ0FCTEVfU0VTU0lPTicpKSB7XG4gICAgICBwYXlsb2FkLl9SZXZvY2FibGVTZXNzaW9uID0gJzEnO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YWxsYXRpb25JZCA9IG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQ7XG4gICAgbGV0IGluc3RhbGxhdGlvbklkUHJvbWlzZTtcbiAgICBpZiAoaW5zdGFsbGF0aW9uSWQgJiYgdHlwZW9mIGluc3RhbGxhdGlvbklkID09PSAnc3RyaW5nJykge1xuICAgICAgaW5zdGFsbGF0aW9uSWRQcm9taXNlID0gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGluc3RhbGxhdGlvbklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5zdGFsbGF0aW9uQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoKTtcbiAgICAgIGluc3RhbGxhdGlvbklkUHJvbWlzZSA9IGluc3RhbGxhdGlvbkNvbnRyb2xsZXIuY3VycmVudEluc3RhbGxhdGlvbklkKCk7XG4gICAgfVxuICAgIHJldHVybiBpbnN0YWxsYXRpb25JZFByb21pc2UudGhlbihpaWQgPT4ge1xuICAgICAgcGF5bG9hZC5fSW5zdGFsbGF0aW9uSWQgPSBpaWQ7XG4gICAgICBjb25zdCB1c2VyQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5zZXNzaW9uVG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUob3B0aW9ucy5zZXNzaW9uVG9rZW4pO1xuICAgICAgfSBlbHNlIGlmICh1c2VyQ29udHJvbGxlcikge1xuICAgICAgICByZXR1cm4gdXNlckNvbnRyb2xsZXIuY3VycmVudFVzZXJBc3luYygpLnRoZW4odXNlciA9PiB7XG4gICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodXNlci5nZXRTZXNzaW9uVG9rZW4oKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShudWxsKTtcbiAgICB9KS50aGVuKHRva2VuID0+IHtcbiAgICAgIGlmICh0b2tlbikge1xuICAgICAgICBwYXlsb2FkLl9TZXNzaW9uVG9rZW4gPSB0b2tlbjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBheWxvYWRTdHJpbmcgPSAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShwYXlsb2FkKTtcbiAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5hamF4KG1ldGhvZCwgdXJsLCBwYXlsb2FkU3RyaW5nLCB7fSwgb3B0aW9ucykudGhlbihfcmVmID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICB4aHJcbiAgICAgICAgfSA9IF9yZWY7XG4gICAgICAgIGlmIChvcHRpb25zLnJldHVyblN0YXR1cykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5yZXNwb25zZSxcbiAgICAgICAgICAgIF9zdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICAgIF9oZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgX3hocjogeGhyXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLmNhdGNoKFJFU1RDb250cm9sbGVyLmhhbmRsZUVycm9yKTtcbiAgfSxcbiAgaGFuZGxlRXJyb3IocmVzcG9uc2UpIHtcbiAgICAvLyBUcmFuc2Zvcm0gdGhlIGVycm9yIGludG8gYW4gaW5zdGFuY2Ugb2YgUGFyc2VFcnJvciBieSB0cnlpbmcgdG8gcGFyc2VcbiAgICAvLyB0aGUgZXJyb3Igc3RyaW5nIGFzIEpTT05cbiAgICBsZXQgZXJyb3I7XG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3BvbnNlVGV4dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXJyb3JKU09OID0gSlNPTi5wYXJzZShyZXNwb25zZS5yZXNwb25zZVRleHQpO1xuICAgICAgICBlcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KGVycm9ySlNPTi5jb2RlLCBlcnJvckpTT04uZXJyb3IpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiB3ZSBmYWlsIHRvIHBhcnNlIHRoZSBlcnJvciB0ZXh0LCB0aGF0J3Mgb2theS5cbiAgICAgICAgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfSlNPTiwgJ1JlY2VpdmVkIGFuIGVycm9yIHdpdGggaW52YWxpZCBKU09OIGZyb20gUGFyc2U6ICcgKyByZXNwb25zZS5yZXNwb25zZVRleHQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZSA/IHJlc3BvbnNlLm1lc3NhZ2UgOiByZXNwb25zZTtcbiAgICAgIGVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5DT05ORUNUSU9OX0ZBSUxFRCwgJ1hNTEh0dHBSZXF1ZXN0IGZhaWxlZDogJyArICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgfSxcbiAgX3NldFhIUih4aHIpIHtcbiAgICBYSFIgPSB4aHI7XG4gIH0sXG4gIF9nZXRYSFIoKSB7XG4gICAgcmV0dXJuIFhIUjtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gUkVTVENvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBSRVNUQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9XZWFrTWFwID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXBcIik7XG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNsZWFyQWxsU3RhdGUgPSBjbGVhckFsbFN0YXRlO1xuZXhwb3J0cy5jb21taXRTZXJ2ZXJDaGFuZ2VzID0gY29tbWl0U2VydmVyQ2hhbmdlcztcbmV4cG9ydHMuZHVwbGljYXRlU3RhdGUgPSBkdXBsaWNhdGVTdGF0ZTtcbmV4cG9ydHMuZW5xdWV1ZVRhc2sgPSBlbnF1ZXVlVGFzaztcbmV4cG9ydHMuZXN0aW1hdGVBdHRyaWJ1dGUgPSBlc3RpbWF0ZUF0dHJpYnV0ZTtcbmV4cG9ydHMuZXN0aW1hdGVBdHRyaWJ1dGVzID0gZXN0aW1hdGVBdHRyaWJ1dGVzO1xuZXhwb3J0cy5nZXRPYmplY3RDYWNoZSA9IGdldE9iamVjdENhY2hlO1xuZXhwb3J0cy5nZXRQZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcztcbmV4cG9ydHMuZ2V0U2VydmVyRGF0YSA9IGdldFNlcnZlckRhdGE7XG5leHBvcnRzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG5leHBvcnRzLmluaXRpYWxpemVTdGF0ZSA9IGluaXRpYWxpemVTdGF0ZTtcbmV4cG9ydHMubWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZSA9IG1lcmdlRmlyc3RQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnBvcFBlbmRpbmdTdGF0ZSA9IHBvcFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucHVzaFBlbmRpbmdTdGF0ZSA9IHB1c2hQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnJlbW92ZVN0YXRlID0gcmVtb3ZlU3RhdGU7XG5leHBvcnRzLnNldFBlbmRpbmdPcCA9IHNldFBlbmRpbmdPcDtcbmV4cG9ydHMuc2V0U2VydmVyRGF0YSA9IHNldFNlcnZlckRhdGE7XG52YXIgT2JqZWN0U3RhdGVNdXRhdGlvbnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9PYmplY3RTdGF0ZU11dGF0aW9uc1wiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoZSkge1xuICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBfV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gIHZhciByID0gbmV3IF9XZWFrTWFwKCksXG4gICAgdCA9IG5ldyBfV2Vha01hcCgpO1xuICByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGUgPyB0IDogcjtcbiAgfSkoZSk7XG59XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChlLCByKSB7XG4gIGlmICghciAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgIGRlZmF1bHQ6IGVcbiAgfTtcbiAgdmFyIHQgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUocik7XG4gIGlmICh0ICYmIHQuaGFzKGUpKSByZXR1cm4gdC5nZXQoZSk7XG4gIHZhciBuID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbFxuICB9O1xuICBmb3IgKHZhciB1IGluIGUpIGlmIChcImRlZmF1bHRcIiAhPT0gdSAmJiB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHUpKSB7XG4gICAgdmFyIGkgPSBfT2JqZWN0JGRlZmluZVByb3BlcnR5ICYmIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID8gX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdSkgOiBudWxsO1xuICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IF9PYmplY3QkZGVmaW5lUHJvcGVydHkobiwgdSwgaSkgOiBuW3VdID0gZVt1XTtcbiAgfVxuICByZXR1cm4gbi5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCBuKSwgbjtcbn1cbmxldCBvYmplY3RTdGF0ZSA9IHt9O1xuZnVuY3Rpb24gZ2V0U3RhdGUob2JqKSB7XG4gIGNvbnN0IGNsYXNzRGF0YSA9IG9iamVjdFN0YXRlW29iai5jbGFzc05hbWVdO1xuICBpZiAoY2xhc3NEYXRhKSB7XG4gICAgcmV0dXJuIGNsYXNzRGF0YVtvYmouaWRdIHx8IG51bGw7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBpbml0aWFsaXplU3RhdGUob2JqLCBpbml0aWFsKSB7XG4gIGxldCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAoIW9iamVjdFN0YXRlW29iai5jbGFzc05hbWVdKSB7XG4gICAgb2JqZWN0U3RhdGVbb2JqLmNsYXNzTmFtZV0gPSB7fTtcbiAgfVxuICBpZiAoIWluaXRpYWwpIHtcbiAgICBpbml0aWFsID0gT2JqZWN0U3RhdGVNdXRhdGlvbnMuZGVmYXVsdFN0YXRlKCk7XG4gIH1cbiAgc3RhdGUgPSBvYmplY3RTdGF0ZVtvYmouY2xhc3NOYW1lXVtvYmouaWRdID0gaW5pdGlhbDtcbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3RhdGUob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZGVsZXRlIG9iamVjdFN0YXRlW29iai5jbGFzc05hbWVdW29iai5pZF07XG4gIHJldHVybiBzdGF0ZTtcbn1cbmZ1bmN0aW9uIGdldFNlcnZlckRhdGEob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLnNlcnZlckRhdGE7XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuZnVuY3Rpb24gc2V0U2VydmVyRGF0YShvYmosIGF0dHJpYnV0ZXMpIHtcbiAgY29uc3Qgc2VydmVyRGF0YSA9IGluaXRpYWxpemVTdGF0ZShvYmopLnNlcnZlckRhdGE7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLnNldFNlcnZlckRhdGEoc2VydmVyRGF0YSwgYXR0cmlidXRlcyk7XG59XG5mdW5jdGlvbiBnZXRQZW5kaW5nT3BzKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5wZW5kaW5nT3BzO1xuICB9XG4gIHJldHVybiBbe31dO1xufVxuZnVuY3Rpb24gc2V0UGVuZGluZ09wKG9iaiwgYXR0ciwgb3ApIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGluaXRpYWxpemVTdGF0ZShvYmopLnBlbmRpbmdPcHM7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLnNldFBlbmRpbmdPcChwZW5kaW5nT3BzLCBhdHRyLCBvcCk7XG59XG5mdW5jdGlvbiBwdXNoUGVuZGluZ1N0YXRlKG9iaikge1xuICBjb25zdCBwZW5kaW5nT3BzID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikucGVuZGluZ09wcztcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMucHVzaFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKTtcbn1cbmZ1bmN0aW9uIHBvcFBlbmRpbmdTdGF0ZShvYmopIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGluaXRpYWxpemVTdGF0ZShvYmopLnBlbmRpbmdPcHM7XG4gIHJldHVybiBPYmplY3RTdGF0ZU11dGF0aW9ucy5wb3BQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG59XG5mdW5jdGlvbiBtZXJnZUZpcnN0UGVuZGluZ1N0YXRlKG9iaikge1xuICBjb25zdCBwZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcyhvYmopO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5tZXJnZUZpcnN0UGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xufVxuZnVuY3Rpb24gZ2V0T2JqZWN0Q2FjaGUob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLm9iamVjdENhY2hlO1xuICB9XG4gIHJldHVybiB7fTtcbn1cbmZ1bmN0aW9uIGVzdGltYXRlQXR0cmlidXRlKG9iaiwgYXR0cikge1xuICBjb25zdCBzZXJ2ZXJEYXRhID0gZ2V0U2VydmVyRGF0YShvYmopO1xuICBjb25zdCBwZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcyhvYmopO1xuICByZXR1cm4gT2JqZWN0U3RhdGVNdXRhdGlvbnMuZXN0aW1hdGVBdHRyaWJ1dGUoc2VydmVyRGF0YSwgcGVuZGluZ09wcywgb2JqLCBhdHRyKTtcbn1cbmZ1bmN0aW9uIGVzdGltYXRlQXR0cmlidXRlcyhvYmopIHtcbiAgY29uc3Qgc2VydmVyRGF0YSA9IGdldFNlcnZlckRhdGEob2JqKTtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHMob2JqKTtcbiAgcmV0dXJuIE9iamVjdFN0YXRlTXV0YXRpb25zLmVzdGltYXRlQXR0cmlidXRlcyhzZXJ2ZXJEYXRhLCBwZW5kaW5nT3BzLCBvYmopO1xufVxuZnVuY3Rpb24gY29tbWl0U2VydmVyQ2hhbmdlcyhvYmosIGNoYW5nZXMpIHtcbiAgY29uc3Qgc3RhdGUgPSBpbml0aWFsaXplU3RhdGUob2JqKTtcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMuY29tbWl0U2VydmVyQ2hhbmdlcyhzdGF0ZS5zZXJ2ZXJEYXRhLCBzdGF0ZS5vYmplY3RDYWNoZSwgY2hhbmdlcyk7XG59XG5mdW5jdGlvbiBlbnF1ZXVlVGFzayhvYmosIHRhc2spIHtcbiAgY29uc3Qgc3RhdGUgPSBpbml0aWFsaXplU3RhdGUob2JqKTtcbiAgcmV0dXJuIHN0YXRlLnRhc2tzLmVucXVldWUodGFzayk7XG59XG5mdW5jdGlvbiBjbGVhckFsbFN0YXRlKCkge1xuICBvYmplY3RTdGF0ZSA9IHt9O1xufVxuZnVuY3Rpb24gZHVwbGljYXRlU3RhdGUoc291cmNlLCBkZXN0KSB7XG4gIGRlc3QuaWQgPSBzb3VyY2UuaWQ7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbmNsYXNzIFNvY2tldFdlYXBwIHtcbiAgY29uc3RydWN0b3Ioc2VydmVyVVJMKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbm9wZW5cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9ubWVzc2FnZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25jbG9zZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25lcnJvclwiLCB2b2lkIDApO1xuICAgIHRoaXMub25vcGVuID0gKCkgPT4ge307XG4gICAgdGhpcy5vbm1lc3NhZ2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLm9uY2xvc2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLm9uZXJyb3IgPSAoKSA9PiB7fTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5vblNvY2tldE9wZW4oKCkgPT4ge1xuICAgICAgdGhpcy5vbm9wZW4oKTtcbiAgICB9KTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5vblNvY2tldE1lc3NhZ2UobXNnID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMub25tZXNzYWdlKG1zZyk7XG4gICAgfSk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3gub25Tb2NrZXRDbG9zZShldmVudCA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm9uY2xvc2UoZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4Lm9uU29ja2V0RXJyb3IoZXJyb3IgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5vbmVycm9yKGVycm9yKTtcbiAgICB9KTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5jb25uZWN0U29ja2V0KHtcbiAgICAgIHVybDogc2VydmVyVVJMXG4gICAgfSk7XG4gIH1cbiAgc2VuZChkYXRhKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4LnNlbmRTb2NrZXRNZXNzYWdlKHtcbiAgICAgIGRhdGFcbiAgICB9KTtcbiAgfVxuICBjbG9zZSgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3guY2xvc2VTb2NrZXQoKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBTb2NrZXRXZWFwcDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFNvY2tldFdlYXBwOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuY29uc3QgU3RvcmFnZSA9IHtcbiAgYXN5bmMoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuICEhY29udHJvbGxlci5hc3luYztcbiAgfSxcbiAgZ2V0SXRlbShwYXRoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3luY2hyb25vdXMgc3RvcmFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHN0b3JhZ2UgY29udHJvbGxlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5nZXRJdGVtKHBhdGgpO1xuICB9LFxuICBnZXRJdGVtQXN5bmMocGF0aCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5nZXRJdGVtQXN5bmMocGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY29udHJvbGxlci5nZXRJdGVtKHBhdGgpKTtcbiAgfSxcbiAgc2V0SXRlbShwYXRoLCB2YWx1ZSkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIHN0b3JhZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBzdG9yYWdlIGNvbnRyb2xsZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuc2V0SXRlbShwYXRoLCB2YWx1ZSk7XG4gIH0sXG4gIHNldEl0ZW1Bc3luYyhwYXRoLCB2YWx1ZSkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5zZXRJdGVtQXN5bmMocGF0aCwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNvbnRyb2xsZXIuc2V0SXRlbShwYXRoLCB2YWx1ZSkpO1xuICB9LFxuICByZW1vdmVJdGVtKHBhdGgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTeW5jaHJvbm91cyBzdG9yYWdlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgc3RvcmFnZSBjb250cm9sbGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLnJlbW92ZUl0ZW0ocGF0aCk7XG4gIH0sXG4gIHJlbW92ZUl0ZW1Bc3luYyhwYXRoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLnJlbW92ZUl0ZW1Bc3luYyhwYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjb250cm9sbGVyLnJlbW92ZUl0ZW0ocGF0aCkpO1xuICB9LFxuICBnZXRBbGxLZXlzKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIHN0b3JhZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBzdG9yYWdlIGNvbnRyb2xsZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0QWxsS2V5cygpO1xuICB9LFxuICBnZXRBbGxLZXlzQXN5bmMoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLmdldEFsbEtleXNBc3luYygpO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNvbnRyb2xsZXIuZ2V0QWxsS2V5cygpKTtcbiAgfSxcbiAgZ2VuZXJhdGVQYXRoKHBhdGgpIHtcbiAgICBpZiAoIV9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQVBQTElDQVRJT05fSUQnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBjYWxsIFBhcnNlLmluaXRpYWxpemUgYmVmb3JlIHVzaW5nIFBhcnNlLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIGdldCBhIFN0b3JhZ2UgcGF0aCB0aGF0IHdhcyBub3QgYSBTdHJpbmcuJyk7XG4gICAgfVxuICAgIGlmIChwYXRoWzBdID09PSAnLycpIHtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigxKTtcbiAgICB9XG4gICAgcmV0dXJuICdQYXJzZS8nICsgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBUFBMSUNBVElPTl9JRCcpICsgJy8nICsgcGF0aDtcbiAgfSxcbiAgX2NsZWFyKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmhhc093blByb3BlcnR5KCdjbGVhcicpKSB7XG4gICAgICBjb250cm9sbGVyLmNsZWFyKCk7XG4gICAgfVxuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gU3RvcmFnZTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vKiBnbG9iYWwgbG9jYWxTdG9yYWdlICovXG5cbmNvbnN0IFN0b3JhZ2VDb250cm9sbGVyID0ge1xuICBhc3luYzogMCxcbiAgZ2V0SXRlbShwYXRoKSB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHBhdGgpO1xuICB9LFxuICBzZXRJdGVtKHBhdGgsIHZhbHVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHBhdGgsIHZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBRdW90YSBleGNlZWRlZCwgcG9zc2libHkgZHVlIHRvIFNhZmFyaSBQcml2YXRlIEJyb3dzaW5nIG1vZGVcbiAgICAgIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7XG4gICAgfVxuICB9LFxuICByZW1vdmVJdGVtKHBhdGgpIHtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShwYXRoKTtcbiAgfSxcbiAgZ2V0QWxsS2V5cygpIHtcbiAgICBjb25zdCBrZXlzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGtleXMucHVzaChsb2NhbFN0b3JhZ2Uua2V5KGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG4gIH0sXG4gIGNsZWFyKCkge1xuICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN0b3JhZ2VDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbi8vIFdoZW4gdGhlcmUgaXMgbm8gbmF0aXZlIHN0b3JhZ2UgaW50ZXJmYWNlLCB3ZSBkZWZhdWx0IHRvIGFuIGluLW1lbW9yeSBtYXBcbmNvbnN0IG1lbU1hcCA9IHt9O1xuY29uc3QgU3RvcmFnZUNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jOiAwLFxuICBnZXRJdGVtKHBhdGgpIHtcbiAgICBpZiAobWVtTWFwLmhhc093blByb3BlcnR5KHBhdGgpKSB7XG4gICAgICByZXR1cm4gbWVtTWFwW3BhdGhdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgc2V0SXRlbShwYXRoLCB2YWx1ZSkge1xuICAgIG1lbU1hcFtwYXRoXSA9IFN0cmluZyh2YWx1ZSk7XG4gIH0sXG4gIHJlbW92ZUl0ZW0ocGF0aCkge1xuICAgIGRlbGV0ZSBtZW1NYXBbcGF0aF07XG4gIH0sXG4gIGdldEFsbEtleXMoKSB7XG4gICAgcmV0dXJuICgwLCBfa2V5cy5kZWZhdWx0KShtZW1NYXApO1xuICB9LFxuICBjbGVhcigpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBtZW1NYXApIHtcbiAgICAgIGlmIChtZW1NYXAuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBkZWxldGUgbWVtTWFwW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN0b3JhZ2VDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX1N0b3JhZ2VDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlQ29udHJvbGxlci5yZWFjdC1uYXRpdmVcIikpO1xudmFyIF9TdG9yYWdlQ29udHJvbGxlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VDb250cm9sbGVyLmJyb3dzZXJcIikpO1xudmFyIF9TdG9yYWdlQ29udHJvbGxlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VDb250cm9sbGVyLndlYXBwXCIpKTtcbnZhciBfU3RvcmFnZUNvbnRyb2xsZXI0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0XCIpKTtcbmxldCBTdG9yYWdlQ29udHJvbGxlciA9IF9TdG9yYWdlQ29udHJvbGxlcjQuZGVmYXVsdDtcblN0b3JhZ2VDb250cm9sbGVyID0gX1N0b3JhZ2VDb250cm9sbGVyMi5kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN0b3JhZ2VDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuY29uc3QgU3RvcmFnZUNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jOiAxLFxuICBnZXRJdGVtQXN5bmMocGF0aCkge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBc3luY1N0b3JhZ2UoKS5nZXRJdGVtKHBhdGgsIChlcnIsIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgc2V0SXRlbUFzeW5jKHBhdGgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLnNldEl0ZW0ocGF0aCwgdmFsdWUsIGVyciA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICByZW1vdmVJdGVtQXN5bmMocGF0aCkge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBc3luY1N0b3JhZ2UoKS5yZW1vdmVJdGVtKHBhdGgsIGVyciA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBnZXRBbGxLZXlzQXN5bmMoKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLmdldEFsbEtleXMoKGVyciwga2V5cykgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShrZXlzIHx8IFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIG11bHRpR2V0KGtleXMpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkubXVsdGlHZXQoa2V5cywgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIG11bHRpUmVtb3ZlKGtleXMpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkubXVsdGlSZW1vdmUoa2V5cywgZXJyID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoa2V5cyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBjbGVhcigpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkuY2xlYXIoKTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9rZXlzXCIpKTtcbmNvbnN0IFN0b3JhZ2VDb250cm9sbGVyID0ge1xuICBhc3luYzogMCxcbiAgZ2V0SXRlbShwYXRoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiB3eC5nZXRTdG9yYWdlU3luYyhwYXRoKTtcbiAgfSxcbiAgc2V0SXRlbShwYXRoLCB2YWx1ZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB3eC5zZXRTdG9yYWdlU3luYyhwYXRoLCB2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gUXVvdGEgZXhjZWVkZWRcbiAgICB9XG4gIH0sXG4gIHJlbW92ZUl0ZW0ocGF0aCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5yZW1vdmVTdG9yYWdlU3luYyhwYXRoKTtcbiAgfSxcbiAgZ2V0QWxsS2V5cygpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgcmVzID0gd3guZ2V0U3RvcmFnZUluZm9TeW5jKCk7XG4gICAgcmV0dXJuICgwLCBfa2V5cy5kZWZhdWx0KShyZXMpO1xuICB9LFxuICBjbGVhcigpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3guY2xlYXJTdG9yYWdlU3luYygpO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN0b3JhZ2VDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX3Byb21pc2VVdGlscyA9IHJlcXVpcmUoXCIuL3Byb21pc2VVdGlsc1wiKTtcbmNsYXNzIFRhc2tRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicXVldWVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLnF1ZXVlID0gW107XG4gIH1cbiAgZW5xdWV1ZSh0YXNrKSB7XG4gICAgY29uc3QgdGFza0NvbXBsZXRlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICB0aGlzLnF1ZXVlLnB1c2goe1xuICAgICAgdGFzazogdGFzayxcbiAgICAgIF9jb21wbGV0aW9uOiB0YXNrQ29tcGxldGVcbiAgICB9KTtcbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRhc2soKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZGVxdWV1ZSgpO1xuICAgICAgICB0YXNrQ29tcGxldGUucmVzb2x2ZSgpO1xuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLl9kZXF1ZXVlKCk7XG4gICAgICAgIHRhc2tDb21wbGV0ZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXNrQ29tcGxldGU7XG4gIH1cbiAgX2RlcXVldWUoKSB7XG4gICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCkge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMucXVldWVbMF07XG4gICAgICBuZXh0LnRhc2soKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZGVxdWV1ZSgpO1xuICAgICAgICBuZXh0Ll9jb21wbGV0aW9uLnJlc29sdmUoKTtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5fZGVxdWV1ZSgpO1xuICAgICAgICBuZXh0Ll9jb21wbGV0aW9uLnJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gVGFza1F1ZXVlO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gVGFza1F1ZXVlOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX1dlYWtNYXAyID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXBcIik7XG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jbGVhckFsbFN0YXRlID0gY2xlYXJBbGxTdGF0ZTtcbmV4cG9ydHMuY29tbWl0U2VydmVyQ2hhbmdlcyA9IGNvbW1pdFNlcnZlckNoYW5nZXM7XG5leHBvcnRzLmR1cGxpY2F0ZVN0YXRlID0gZHVwbGljYXRlU3RhdGU7XG5leHBvcnRzLmVucXVldWVUYXNrID0gZW5xdWV1ZVRhc2s7XG5leHBvcnRzLmVzdGltYXRlQXR0cmlidXRlID0gZXN0aW1hdGVBdHRyaWJ1dGU7XG5leHBvcnRzLmVzdGltYXRlQXR0cmlidXRlcyA9IGVzdGltYXRlQXR0cmlidXRlcztcbmV4cG9ydHMuZ2V0T2JqZWN0Q2FjaGUgPSBnZXRPYmplY3RDYWNoZTtcbmV4cG9ydHMuZ2V0UGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHM7XG5leHBvcnRzLmdldFNlcnZlckRhdGEgPSBnZXRTZXJ2ZXJEYXRhO1xuZXhwb3J0cy5nZXRTdGF0ZSA9IGdldFN0YXRlO1xuZXhwb3J0cy5pbml0aWFsaXplU3RhdGUgPSBpbml0aWFsaXplU3RhdGU7XG5leHBvcnRzLm1lcmdlRmlyc3RQZW5kaW5nU3RhdGUgPSBtZXJnZUZpcnN0UGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5wb3BQZW5kaW5nU3RhdGUgPSBwb3BQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnB1c2hQZW5kaW5nU3RhdGUgPSBwdXNoUGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5yZW1vdmVTdGF0ZSA9IHJlbW92ZVN0YXRlO1xuZXhwb3J0cy5zZXRQZW5kaW5nT3AgPSBzZXRQZW5kaW5nT3A7XG5leHBvcnRzLnNldFNlcnZlckRhdGEgPSBzZXRTZXJ2ZXJEYXRhO1xudmFyIF93ZWFrTWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS93ZWFrLW1hcFwiKSk7XG52YXIgT2JqZWN0U3RhdGVNdXRhdGlvbnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9PYmplY3RTdGF0ZU11dGF0aW9uc1wiKSk7XG52YXIgX1Rhc2tRdWV1ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVGFza1F1ZXVlXCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIF9XZWFrTWFwMikgcmV0dXJuIG51bGw7XG4gIHZhciByID0gbmV3IF9XZWFrTWFwMigpLFxuICAgIHQgPSBuZXcgX1dlYWtNYXAyKCk7XG4gIHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZSA/IHQgOiByO1xuICB9KShlKTtcbn1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKGUsIHIpIHtcbiAgaWYgKCFyICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgZGVmYXVsdDogZVxuICB9O1xuICB2YXIgdCA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShyKTtcbiAgaWYgKHQgJiYgdC5oYXMoZSkpIHJldHVybiB0LmdldChlKTtcbiAgdmFyIG4gPSB7XG4gICAgX19wcm90b19fOiBudWxsXG4gIH07XG4gIGZvciAodmFyIHUgaW4gZSkgaWYgKFwiZGVmYXVsdFwiICE9PSB1ICYmIHt9Lmhhc093blByb3BlcnR5LmNhbGwoZSwgdSkpIHtcbiAgICB2YXIgaSA9IF9PYmplY3QkZGVmaW5lUHJvcGVydHkgJiYgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPyBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB1KSA6IG51bGw7XG4gICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gX09iamVjdCRkZWZpbmVQcm9wZXJ0eShuLCB1LCBpKSA6IG5bdV0gPSBlW3VdO1xuICB9XG4gIHJldHVybiBuLmRlZmF1bHQgPSBlLCB0ICYmIHQuc2V0KGUsIG4pLCBuO1xufVxubGV0IG9iamVjdFN0YXRlID0gbmV3IF93ZWFrTWFwLmRlZmF1bHQoKTtcbmZ1bmN0aW9uIGdldFN0YXRlKG9iaikge1xuICBjb25zdCBjbGFzc0RhdGEgPSBvYmplY3RTdGF0ZS5nZXQob2JqKTtcbiAgcmV0dXJuIGNsYXNzRGF0YSB8fCBudWxsO1xufVxuZnVuY3Rpb24gaW5pdGlhbGl6ZVN0YXRlKG9iaiwgaW5pdGlhbCkge1xuICBsZXQgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKCFpbml0aWFsKSB7XG4gICAgaW5pdGlhbCA9IHtcbiAgICAgIHNlcnZlckRhdGE6IHt9LFxuICAgICAgcGVuZGluZ09wczogW3t9XSxcbiAgICAgIG9iamVjdENhY2hlOiB7fSxcbiAgICAgIHRhc2tzOiBuZXcgX1Rhc2tRdWV1ZS5kZWZhdWx0KCksXG4gICAgICBleGlzdGVkOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgc3RhdGUgPSBpbml0aWFsO1xuICBvYmplY3RTdGF0ZS5zZXQob2JqLCBzdGF0ZSk7XG4gIHJldHVybiBzdGF0ZTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0YXRlKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIG9iamVjdFN0YXRlLmRlbGV0ZShvYmopO1xuICByZXR1cm4gc3RhdGU7XG59XG5mdW5jdGlvbiBnZXRTZXJ2ZXJEYXRhKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5zZXJ2ZXJEYXRhO1xuICB9XG4gIHJldHVybiB7fTtcbn1cbmZ1bmN0aW9uIHNldFNlcnZlckRhdGEob2JqLCBhdHRyaWJ1dGVzKSB7XG4gIGNvbnN0IHNlcnZlckRhdGEgPSBpbml0aWFsaXplU3RhdGUob2JqKS5zZXJ2ZXJEYXRhO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5zZXRTZXJ2ZXJEYXRhKHNlcnZlckRhdGEsIGF0dHJpYnV0ZXMpO1xufVxuZnVuY3Rpb24gZ2V0UGVuZGluZ09wcyhvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUucGVuZGluZ09wcztcbiAgfVxuICByZXR1cm4gW3t9XTtcbn1cbmZ1bmN0aW9uIHNldFBlbmRpbmdPcChvYmosIGF0dHIsIG9wKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBpbml0aWFsaXplU3RhdGUob2JqKS5wZW5kaW5nT3BzO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5zZXRQZW5kaW5nT3AocGVuZGluZ09wcywgYXR0ciwgb3ApO1xufVxuZnVuY3Rpb24gcHVzaFBlbmRpbmdTdGF0ZShvYmopIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGluaXRpYWxpemVTdGF0ZShvYmopLnBlbmRpbmdPcHM7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLnB1c2hQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG59XG5mdW5jdGlvbiBwb3BQZW5kaW5nU3RhdGUob2JqKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBpbml0aWFsaXplU3RhdGUob2JqKS5wZW5kaW5nT3BzO1xuICByZXR1cm4gT2JqZWN0U3RhdGVNdXRhdGlvbnMucG9wUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xufVxuZnVuY3Rpb24gbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZShvYmopIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHMob2JqKTtcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMubWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKTtcbn1cbmZ1bmN0aW9uIGdldE9iamVjdENhY2hlKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5vYmplY3RDYWNoZTtcbiAgfVxuICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBlc3RpbWF0ZUF0dHJpYnV0ZShvYmosIGF0dHIpIHtcbiAgY29uc3Qgc2VydmVyRGF0YSA9IGdldFNlcnZlckRhdGEob2JqKTtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHMob2JqKTtcbiAgcmV0dXJuIE9iamVjdFN0YXRlTXV0YXRpb25zLmVzdGltYXRlQXR0cmlidXRlKHNlcnZlckRhdGEsIHBlbmRpbmdPcHMsIG9iaiwgYXR0cik7XG59XG5mdW5jdGlvbiBlc3RpbWF0ZUF0dHJpYnV0ZXMob2JqKSB7XG4gIGNvbnN0IHNlcnZlckRhdGEgPSBnZXRTZXJ2ZXJEYXRhKG9iaik7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzKG9iaik7XG4gIHJldHVybiBPYmplY3RTdGF0ZU11dGF0aW9ucy5lc3RpbWF0ZUF0dHJpYnV0ZXMoc2VydmVyRGF0YSwgcGVuZGluZ09wcywgb2JqKTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFNlcnZlckNoYW5nZXMob2JqLCBjaGFuZ2VzKSB7XG4gIGNvbnN0IHN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKG9iaik7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLmNvbW1pdFNlcnZlckNoYW5nZXMoc3RhdGUuc2VydmVyRGF0YSwgc3RhdGUub2JqZWN0Q2FjaGUsIGNoYW5nZXMpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVRhc2sob2JqLCB0YXNrKSB7XG4gIGNvbnN0IHN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKG9iaik7XG4gIHJldHVybiBzdGF0ZS50YXNrcy5lbnF1ZXVlKHRhc2spO1xufVxuZnVuY3Rpb24gZHVwbGljYXRlU3RhdGUoc291cmNlLCBkZXN0KSB7XG4gIGNvbnN0IG9sZFN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKHNvdXJjZSk7XG4gIGNvbnN0IG5ld1N0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKGRlc3QpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBvbGRTdGF0ZS5zZXJ2ZXJEYXRhKSB7XG4gICAgbmV3U3RhdGUuc2VydmVyRGF0YVtrZXldID0gb2xkU3RhdGUuc2VydmVyRGF0YVtrZXldO1xuICB9XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvbGRTdGF0ZS5wZW5kaW5nT3BzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9sZFN0YXRlLnBlbmRpbmdPcHNbaW5kZXhdKSB7XG4gICAgICBuZXdTdGF0ZS5wZW5kaW5nT3BzW2luZGV4XVtrZXldID0gb2xkU3RhdGUucGVuZGluZ09wc1tpbmRleF1ba2V5XTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gb2xkU3RhdGUub2JqZWN0Q2FjaGUpIHtcbiAgICBuZXdTdGF0ZS5vYmplY3RDYWNoZVtrZXldID0gb2xkU3RhdGUub2JqZWN0Q2FjaGVba2V5XTtcbiAgfVxuICBuZXdTdGF0ZS5leGlzdGVkID0gb2xkU3RhdGUuZXhpc3RlZDtcbn1cbmZ1bmN0aW9uIGNsZWFyQWxsU3RhdGUoKSB7XG4gIG9iamVjdFN0YXRlID0gbmV3IF93ZWFrTWFwLmRlZmF1bHQoKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF93cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIndzXCIpKTtcbnZhciBfU29ja2V0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Tb2NrZXQud2VhcHBcIikpO1xuLyogZ2xvYmFsIFdlYlNvY2tldCAqL1xuXG5sZXQgV2ViU29ja2V0Q29udHJvbGxlcjtcbnRyeSB7XG4gIFdlYlNvY2tldENvbnRyb2xsZXIgPSB0eXBlb2YgV2ViU29ja2V0ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBXZWJTb2NrZXQgPT09ICdvYmplY3QnID8gV2ViU29ja2V0IDogbnVsbDtcbn0gY2F0Y2ggKF8pIHtcbiAgLy8gV2ViU29ja2V0IHVuYXZhaWxhYmxlXG59XG5tb2R1bGUuZXhwb3J0cyA9IFdlYlNvY2tldENvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBXZWJTb2NrZXRDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuY2xhc3MgWGhyV2VhcHAge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIlVOU0VOVFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiT1BFTkVEXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJIRUFERVJTX1JFQ0VJVkVEXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJMT0FESU5HXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJET05FXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJoZWFkZXJcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlYWR5U3RhdGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInN0YXR1c1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVzcG9uc2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlc3BvbnNlVHlwZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVzcG9uc2VUZXh0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZXNwb25zZUhlYWRlclwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwibWV0aG9kXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJ1cmxcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uYWJvcnRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9ucHJvZ3Jlc3NcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uZXJyb3JcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVxdWVzdFRhc2tcIiwgdm9pZCAwKTtcbiAgICB0aGlzLlVOU0VOVCA9IDA7XG4gICAgdGhpcy5PUEVORUQgPSAxO1xuICAgIHRoaXMuSEVBREVSU19SRUNFSVZFRCA9IDI7XG4gICAgdGhpcy5MT0FESU5HID0gMztcbiAgICB0aGlzLkRPTkUgPSA0O1xuICAgIHRoaXMuaGVhZGVyID0ge307XG4gICAgdGhpcy5yZWFkeVN0YXRlID0gdGhpcy5ET05FO1xuICAgIHRoaXMuc3RhdHVzID0gMDtcbiAgICB0aGlzLnJlc3BvbnNlID0gJyc7XG4gICAgdGhpcy5yZXNwb25zZVR5cGUgPSAnJztcbiAgICB0aGlzLnJlc3BvbnNlVGV4dCA9ICcnO1xuICAgIHRoaXMucmVzcG9uc2VIZWFkZXIgPSB7fTtcbiAgICB0aGlzLm1ldGhvZCA9ICcnO1xuICAgIHRoaXMudXJsID0gJyc7XG4gICAgdGhpcy5vbmFib3J0ID0gKCkgPT4ge307XG4gICAgdGhpcy5vbnByb2dyZXNzID0gKCkgPT4ge307XG4gICAgdGhpcy5vbmVycm9yID0gKCkgPT4ge307XG4gICAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLnJlcXVlc3RUYXNrID0gbnVsbDtcbiAgfVxuICBnZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB7XG4gICAgbGV0IGhlYWRlciA9ICcnO1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMucmVzcG9uc2VIZWFkZXIpIHtcbiAgICAgIGhlYWRlciArPSBrZXkgKyAnOicgKyB0aGlzLmdldFJlc3BvbnNlSGVhZGVyKGtleSkgKyAnXFxyXFxuJztcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcjtcbiAgfVxuICBnZXRSZXNwb25zZUhlYWRlcihrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZUhlYWRlcltrZXldO1xuICB9XG4gIHNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWx1ZSkge1xuICAgIHRoaXMuaGVhZGVyW2tleV0gPSB2YWx1ZTtcbiAgfVxuICBvcGVuKG1ldGhvZCwgdXJsKSB7XG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gIH1cbiAgYWJvcnQoKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3RUYXNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVxdWVzdFRhc2suYWJvcnQoKTtcbiAgICB0aGlzLnN0YXR1cyA9IDA7XG4gICAgdGhpcy5yZXNwb25zZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9uYWJvcnQoKTtcbiAgICB0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZSgpO1xuICB9XG4gIHNlbmQoZGF0YSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnJlcXVlc3RUYXNrID0gd3gucmVxdWVzdCh7XG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBoZWFkZXI6IHRoaXMuaGVhZGVyLFxuICAgICAgcmVzcG9uc2VUeXBlOiB0aGlzLnJlc3BvbnNlVHlwZSxcbiAgICAgIHN1Y2Nlc3M6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gcmVzLnN0YXR1c0NvZGU7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXMuZGF0YTtcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlciA9IHJlcy5oZWFkZXI7XG4gICAgICAgIHRoaXMucmVzcG9uc2VUZXh0ID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkocmVzLmRhdGEpO1xuICAgICAgICB0aGlzLnJlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UoKTtcbiAgICAgIH0sXG4gICAgICBmYWlsOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLnJlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLm9uZXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlcXVlc3RUYXNrLm9uUHJvZ3Jlc3NVcGRhdGUocmVzID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiByZXMudG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZSAhPT0gMCxcbiAgICAgICAgbG9hZGVkOiByZXMudG90YWxCeXRlc1dyaXR0ZW4sXG4gICAgICAgIHRvdGFsOiByZXMudG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZVxuICAgICAgfTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMub25wcm9ncmVzcyhldmVudCk7XG4gICAgfSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gWGhyV2VhcHA7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBYaHJXZWFwcDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gYXJyYXlDb250YWluc09iamVjdDtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuZnVuY3Rpb24gYXJyYXlDb250YWluc09iamVjdChhcnJheSwgb2JqZWN0KSB7XG4gIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoYXJyYXkpLmNhbGwoYXJyYXksIG9iamVjdCkgPiAtMSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhcnJheVtpXSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0ICYmIGFycmF5W2ldLmNsYXNzTmFtZSA9PT0gb2JqZWN0LmNsYXNzTmFtZSAmJiBhcnJheVtpXS5fZ2V0SWQoKSA9PT0gb2JqZWN0Ll9nZXRJZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjYW5CZVNlcmlhbGl6ZWQ7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbmZ1bmN0aW9uIGNhbkJlU2VyaWFsaXplZChvYmopIHtcbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBpZiAoIShvYmogaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBhdHRyaWJ1dGVzID0gb2JqLmF0dHJpYnV0ZXM7XG4gIGZvciAoY29uc3QgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgY29uc3QgdmFsID0gYXR0cmlidXRlc1thdHRyXTtcbiAgICBpZiAoIWNhbkJlU2VyaWFsaXplZEhlbHBlcih2YWwpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY2FuQmVTZXJpYWxpemVkSGVscGVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICByZXR1cm4gISF2YWx1ZS5pZDtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQpIHtcbiAgICBpZiAodmFsdWUudXJsKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWNhbkJlU2VyaWFsaXplZEhlbHBlcih2YWx1ZVtpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IGsgaW4gdmFsdWUpIHtcbiAgICBpZiAoIWNhbkJlU2VyaWFsaXplZEhlbHBlcih2YWx1ZVtrXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGRlY29kZTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBfUGFyc2VHZW9Qb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VHZW9Qb2ludFwiKSk7XG52YXIgX1BhcnNlUG9seWdvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VQb2x5Z29uXCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG5mdW5jdGlvbiBkZWNvZGUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgY29uc3QgZHVwID0gW107XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHZhbHVlKS5jYWxsKHZhbHVlLCAodiwgaSkgPT4ge1xuICAgICAgZHVwW2ldID0gZGVjb2RlKHYpO1xuICAgIH0pO1xuICAgIHJldHVybiBkdXA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZS5fX29wID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHtcbiAgICAgIG9wRnJvbUpTT05cbiAgICB9ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPcCgpO1xuICAgIHJldHVybiBvcEZyb21KU09OKHZhbHVlKTtcbiAgfVxuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdQb2ludGVyJyAmJiB2YWx1ZS5jbGFzc05hbWUpIHtcbiAgICByZXR1cm4gUGFyc2VPYmplY3QuZnJvbUpTT04odmFsdWUpO1xuICB9XG4gIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdPYmplY3QnICYmIHZhbHVlLmNsYXNzTmFtZSkge1xuICAgIHJldHVybiBQYXJzZU9iamVjdC5mcm9tSlNPTih2YWx1ZSk7XG4gIH1cbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ1JlbGF0aW9uJykge1xuICAgIC8vIFRoZSBwYXJlbnQgYW5kIGtleSBmaWVsZHMgd2lsbCBiZSBwb3B1bGF0ZWQgYnkgdGhlIHBhcmVudFxuICAgIGNvbnN0IHJlbGF0aW9uID0gbmV3IF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQobnVsbCwgbnVsbCk7XG4gICAgcmVsYXRpb24udGFyZ2V0Q2xhc3NOYW1lID0gdmFsdWUuY2xhc3NOYW1lO1xuICAgIHJldHVybiByZWxhdGlvbjtcbiAgfVxuICBpZiAodmFsdWUuX190eXBlID09PSAnRGF0ZScpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUuaXNvKTtcbiAgfVxuICBpZiAodmFsdWUuX190eXBlID09PSAnRmlsZScpIHtcbiAgICByZXR1cm4gX1BhcnNlRmlsZS5kZWZhdWx0LmZyb21KU09OKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWUuX190eXBlID09PSAnR2VvUG9pbnQnKSB7XG4gICAgcmV0dXJuIG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KHtcbiAgICAgIGxhdGl0dWRlOiB2YWx1ZS5sYXRpdHVkZSxcbiAgICAgIGxvbmdpdHVkZTogdmFsdWUubG9uZ2l0dWRlXG4gICAgfSk7XG4gIH1cbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgcmV0dXJuIG5ldyBfUGFyc2VQb2x5Z29uLmRlZmF1bHQodmFsdWUuY29vcmRpbmF0ZXMpO1xuICB9XG4gIGNvbnN0IGNvcHkgPSB7fTtcbiAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XG4gICAgY29weVtrXSA9IGRlY29kZSh2YWx1ZVtrXSk7XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfc3RhcnRzV2l0aCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGhcIikpO1xudmFyIF9jb25jYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUFDTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VBQ0xcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xudmFyIF9QYXJzZVBvbHlnb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUG9seWdvblwiKSk7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xuZnVuY3Rpb24gZW5jb2RlKHZhbHVlLCBkaXNhbGxvd09iamVjdHMsIGZvcmNlUG9pbnRlcnMsIHNlZW4sIG9mZmxpbmUpIHtcbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgIGlmIChkaXNhbGxvd09iamVjdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFyc2UgT2JqZWN0cyBub3QgYWxsb3dlZCBoZXJlJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlZW5FbnRyeSA9IHZhbHVlLmlkID8gdmFsdWUuY2xhc3NOYW1lICsgJzonICsgdmFsdWUuaWQgOiB2YWx1ZTtcbiAgICBpZiAoZm9yY2VQb2ludGVycyB8fCAhc2VlbiB8fCAoMCwgX2luZGV4T2YuZGVmYXVsdCkoc2VlbikuY2FsbChzZWVuLCBzZWVuRW50cnkpID4gLTEgfHwgdmFsdWUuZGlydHkoKSB8fCAoMCwgX2tleXMuZGVmYXVsdCkodmFsdWUuX2dldFNlcnZlckRhdGEoKSkubGVuZ3RoIDwgMSkge1xuICAgICAgdmFyIF9jb250ZXh0O1xuICAgICAgaWYgKG9mZmxpbmUgJiYgKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKF9jb250ZXh0ID0gdmFsdWUuX2dldElkKCkpLmNhbGwoX2NvbnRleHQsICdsb2NhbCcpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b09mZmxpbmVQb2ludGVyKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUudG9Qb2ludGVyKCk7XG4gICAgfVxuICAgIHNlZW4gPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShzZWVuKS5jYWxsKHNlZW4sIHNlZW5FbnRyeSk7XG4gICAgcmV0dXJuIHZhbHVlLl90b0Z1bGxKU09OKHNlZW4sIG9mZmxpbmUpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBPcFxuICB9ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPcCgpO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZUFDTC5kZWZhdWx0IHx8IHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVBvbHlnb24uZGVmYXVsdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICByZXR1cm4gdmFsdWUudG9KU09OKCk7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlRmlsZS5kZWZhdWx0KSB7XG4gICAgaWYgKCF2YWx1ZS51cmwoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byBlbmNvZGUgYW4gdW5zYXZlZCBmaWxlLicpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUudG9KU09OKCk7XG4gIH1cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gZW5jb2RlIGFuIGludmFsaWQgZGF0ZS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ0RhdGUnLFxuICAgICAgaXNvOiB2YWx1ZS50b0pTT04oKVxuICAgIH07XG4gIH1cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmIHR5cGVvZiB2YWx1ZS5zb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNvdXJjZTtcbiAgfVxuICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSkge1xuICAgIHJldHVybiAoMCwgX21hcC5kZWZhdWx0KSh2YWx1ZSkuY2FsbCh2YWx1ZSwgdiA9PiB7XG4gICAgICByZXR1cm4gZW5jb2RlKHYsIGRpc2FsbG93T2JqZWN0cywgZm9yY2VQb2ludGVycywgc2Vlbiwgb2ZmbGluZSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gdmFsdWUpIHtcbiAgICAgIG91dHB1dFtrXSA9IGVuY29kZSh2YWx1ZVtrXSwgZGlzYWxsb3dPYmplY3RzLCBmb3JjZVBvaW50ZXJzLCBzZWVuLCBvZmZsaW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBfZGVmYXVsdCh2YWx1ZSwgZGlzYWxsb3dPYmplY3RzLCBmb3JjZVBvaW50ZXJzLCBzZWVuLCBvZmZsaW5lKSB7XG4gIHJldHVybiBlbmNvZGUodmFsdWUsICEhZGlzYWxsb3dPYmplY3RzLCAhIWZvcmNlUG9pbnRlcnMsIHNlZW4gfHwgW10sIG9mZmxpbmUpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBlcXVhbHM7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUFDTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VBQ0xcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xuZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICBpZiAodG9TdHJpbmcuY2FsbChhKSA9PT0gJ1tvYmplY3QgRGF0ZV0nIHx8IHRvU3RyaW5nLmNhbGwoYikgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIGNvbnN0IGRhdGVBID0gbmV3IERhdGUoYSk7XG4gICAgY29uc3QgZGF0ZUIgPSBuZXcgRGF0ZShiKTtcbiAgICByZXR1cm4gK2RhdGVBID09PSArZGF0ZUI7XG4gIH1cbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIWEgfHwgdHlwZW9mIGEgIT09ICdvYmplY3QnKSB7XG4gICAgLy8gYSBpcyBhIHByaW1pdGl2ZVxuICAgIHJldHVybiBhID09PSBiO1xuICB9XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoYSkgfHwgKDAsIF9pc0FycmF5LmRlZmF1bHQpKGIpKSB7XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkoYSkgfHwgISgwLCBfaXNBcnJheS5kZWZhdWx0KShiKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBhLmxlbmd0aDsgaS0tOykge1xuICAgICAgaWYgKCFlcXVhbHMoYVtpXSwgYltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGlmIChhIGluc3RhbmNlb2YgX1BhcnNlQUNMLmRlZmF1bHQgfHwgYSBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCB8fCBhIGluc3RhbmNlb2YgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCB8fCBhIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICByZXR1cm4gYS5lcXVhbHMoYik7XG4gIH1cbiAgaWYgKGIgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgIGlmIChhLl9fdHlwZSA9PT0gJ09iamVjdCcgfHwgYS5fX3R5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgcmV0dXJuIGEub2JqZWN0SWQgPT09IGIuaWQgJiYgYS5jbGFzc05hbWUgPT09IGIuY2xhc3NOYW1lO1xuICAgIH1cbiAgfVxuICBpZiAoKDAsIF9rZXlzLmRlZmF1bHQpKGEpLmxlbmd0aCAhPT0gKDAsIF9rZXlzLmRlZmF1bHQpKGIpLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IGsgaW4gYSkge1xuICAgIGlmICghZXF1YWxzKGFba10sIGJba10pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGVzY2FwZTtcbmNvbnN0IGVuY29kZWQgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnLyc6ICcmI3gyRjsnLFxuICBcIidcIjogJyYjeDI3OycsXG4gICdcIic6ICcmcXVvdDsnXG59O1xuZnVuY3Rpb24gZXNjYXBlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1smPD5cXC8nXCJdL2csIGZ1bmN0aW9uIChjaGFyKSB7XG4gICAgcmV0dXJuIGVuY29kZWRbY2hhcl07XG4gIH0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBpc1Jldm9jYWJsZVNlc3Npb247XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbmZ1bmN0aW9uIGlzUmV2b2NhYmxlU2Vzc2lvbih0b2tlbikge1xuICByZXR1cm4gKDAsIF9pbmRleE9mLmRlZmF1bHQpKHRva2VuKS5jYWxsKHRva2VuLCAncjonKSA+IC0xO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBwYXJzZURhdGU7XG52YXIgX3BhcnNlSW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcGFyc2UtaW50XCIpKTtcbmZ1bmN0aW9uIHBhcnNlRGF0ZShpc284NjAxKSB7XG4gIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoJ14oWzAtOV17MSw0fSktKFswLTldezEsMn0pLShbMC05XXsxLDJ9KScgKyAnVCcgKyAnKFswLTldezEsMn0pOihbMC05XXsxLDJ9KTooWzAtOV17MSwyfSknICsgJyguKFswLTldKykpPycgKyAnWiQnKTtcbiAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhpc284NjAxKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHllYXIgPSAoMCwgX3BhcnNlSW50Mi5kZWZhdWx0KShtYXRjaFsxXSkgfHwgMDtcbiAgY29uc3QgbW9udGggPSAoKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbMl0pIHx8IDEpIC0gMTtcbiAgY29uc3QgZGF5ID0gKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbM10pIHx8IDA7XG4gIGNvbnN0IGhvdXIgPSAoMCwgX3BhcnNlSW50Mi5kZWZhdWx0KShtYXRjaFs0XSkgfHwgMDtcbiAgY29uc3QgbWludXRlID0gKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbNV0pIHx8IDA7XG4gIGNvbnN0IHNlY29uZCA9ICgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzZdKSB8fCAwO1xuICBjb25zdCBtaWxsaSA9ICgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzhdKSB8fCAwO1xuICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpKSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY29udGludWVXaGlsZSA9IGNvbnRpbnVlV2hpbGU7XG5leHBvcnRzLnJlc29sdmluZ1Byb21pc2UgPSByZXNvbHZpbmdQcm9taXNlO1xuZXhwb3J0cy53aGVuID0gd2hlbjtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbi8vIENyZWF0ZSBEZWZlcnJlZCBQcm9taXNlXG5mdW5jdGlvbiByZXNvbHZpbmdQcm9taXNlKCkge1xuICBsZXQgcmVzO1xuICBsZXQgcmVqO1xuICBjb25zdCBwcm9taXNlID0gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlcyA9IHJlc29sdmU7XG4gICAgcmVqID0gcmVqZWN0O1xuICB9KTtcbiAgY29uc3QgZGVmZXIgPSBwcm9taXNlO1xuICBkZWZlci5yZXNvbHZlID0gcmVzO1xuICBkZWZlci5yZWplY3QgPSByZWo7XG4gIHJldHVybiBkZWZlcjtcbn1cbmZ1bmN0aW9uIHdoZW4ocHJvbWlzZXMpIHtcbiAgbGV0IG9iamVjdHM7XG4gIGNvbnN0IGFycmF5QXJndW1lbnQgPSAoMCwgX2lzQXJyYXkuZGVmYXVsdCkocHJvbWlzZXMpO1xuICBpZiAoYXJyYXlBcmd1bWVudCkge1xuICAgIG9iamVjdHMgPSBwcm9taXNlcztcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RzID0gYXJndW1lbnRzO1xuICB9XG4gIGxldCB0b3RhbCA9IG9iamVjdHMubGVuZ3RoO1xuICBsZXQgaGFkRXJyb3IgPSBmYWxzZTtcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICBjb25zdCByZXR1cm5WYWx1ZSA9IGFycmF5QXJndW1lbnQgPyBbcmVzdWx0c10gOiByZXN1bHRzO1xuICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgcmVzdWx0cy5sZW5ndGggPSBvYmplY3RzLmxlbmd0aDtcbiAgZXJyb3JzLmxlbmd0aCA9IG9iamVjdHMubGVuZ3RoO1xuICBpZiAodG90YWwgPT09IDApIHtcbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgfVxuICBjb25zdCBwcm9taXNlID0gcmVzb2x2aW5nUHJvbWlzZSgpO1xuICBjb25zdCByZXNvbHZlT25lID0gZnVuY3Rpb24gKCkge1xuICAgIHRvdGFsLS07XG4gICAgaWYgKHRvdGFsIDw9IDApIHtcbiAgICAgIGlmIChoYWRFcnJvcikge1xuICAgICAgICBwcm9taXNlLnJlamVjdChlcnJvcnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGNoYWluID0gZnVuY3Rpb24gKG9iamVjdCwgaW5kZXgpIHtcbiAgICBpZiAob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb2JqZWN0LnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IHJlc3VsdDtcbiAgICAgICAgcmVzb2x2ZU9uZSgpO1xuICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGVycm9yc1tpbmRleF0gPSBlcnJvcjtcbiAgICAgICAgaGFkRXJyb3IgPSB0cnVlO1xuICAgICAgICByZXNvbHZlT25lKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0c1tpbmRleF0gPSBvYmplY3Q7XG4gICAgICByZXNvbHZlT25lKCk7XG4gICAgfVxuICB9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjaGFpbihvYmplY3RzW2ldLCBpKTtcbiAgfVxuICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGNvbnRpbnVlV2hpbGUodGVzdCwgZW1pdHRlcikge1xuICBpZiAodGVzdCgpKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIoKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBjb250aW51ZVdoaWxlKHRlc3QsIGVtaXR0ZXIpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdW5pcXVlO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfYXJyYXlDb250YWluc09iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vYXJyYXlDb250YWluc09iamVjdFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG5mdW5jdGlvbiB1bmlxdWUoYXJyKSB7XG4gIGNvbnN0IHVuaXF1ZXMgPSBbXTtcbiAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGFycikuY2FsbChhcnIsIHZhbHVlID0+IHtcbiAgICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgIGlmICghKDAsIF9hcnJheUNvbnRhaW5zT2JqZWN0LmRlZmF1bHQpKHVuaXF1ZXMsIHZhbHVlKSkge1xuICAgICAgICB1bmlxdWVzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHVuaXF1ZXMpLmNhbGwodW5pcXVlcywgdmFsdWUpIDwgMCkge1xuICAgICAgICB1bmlxdWVzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB1bmlxdWVzO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1bnNhdmVkQ2hpbGRyZW47XG52YXIgX2NvbmNhdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbi8qKlxuICogUmV0dXJuIGFuIGFycmF5IG9mIHVuc2F2ZWQgY2hpbGRyZW4sIHdoaWNoIGFyZSBlaXRoZXIgUGFyc2UgT2JqZWN0cyBvciBGaWxlcy5cbiAqIElmIGl0IGVuY291bnRlcnMgYW55IGRpcnR5IE9iamVjdHMgd2l0aG91dCBJZHMsIGl0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFyc2UuT2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dEZWVwVW5zYXZlZFxuICogQHJldHVybnMge0FycmF5fVxuICovXG5mdW5jdGlvbiB1bnNhdmVkQ2hpbGRyZW4ob2JqLCBhbGxvd0RlZXBVbnNhdmVkKSB7XG4gIGNvbnN0IGVuY291bnRlcmVkID0ge1xuICAgIG9iamVjdHM6IHt9LFxuICAgIGZpbGVzOiBbXVxuICB9O1xuICBjb25zdCBpZGVudGlmaWVyID0gb2JqLmNsYXNzTmFtZSArICc6JyArIG9iai5fZ2V0SWQoKTtcbiAgZW5jb3VudGVyZWQub2JqZWN0c1tpZGVudGlmaWVyXSA9IG9iai5kaXJ0eSgpID8gb2JqIDogdHJ1ZTtcbiAgY29uc3QgYXR0cmlidXRlcyA9IG9iai5hdHRyaWJ1dGVzO1xuICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlc1thdHRyXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRyYXZlcnNlKGF0dHJpYnV0ZXNbYXR0cl0sIGVuY291bnRlcmVkLCBmYWxzZSwgISFhbGxvd0RlZXBVbnNhdmVkKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdW5zYXZlZCA9IFtdO1xuICBmb3IgKGNvbnN0IGlkIGluIGVuY291bnRlcmVkLm9iamVjdHMpIHtcbiAgICBpZiAoaWQgIT09IGlkZW50aWZpZXIgJiYgZW5jb3VudGVyZWQub2JqZWN0c1tpZF0gIT09IHRydWUpIHtcbiAgICAgIHVuc2F2ZWQucHVzaChlbmNvdW50ZXJlZC5vYmplY3RzW2lkXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiAoMCwgX2NvbmNhdC5kZWZhdWx0KSh1bnNhdmVkKS5jYWxsKHVuc2F2ZWQsIGVuY291bnRlcmVkLmZpbGVzKTtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlKG9iaiwgZW5jb3VudGVyZWQsIHNob3VsZFRocm93LCBhbGxvd0RlZXBVbnNhdmVkKSB7XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgaWYgKCFvYmouaWQgJiYgc2hvdWxkVGhyb3cpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBhIHBvaW50ZXIgdG8gYW4gdW5zYXZlZCBPYmplY3QuJyk7XG4gICAgfVxuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBvYmouY2xhc3NOYW1lICsgJzonICsgb2JqLl9nZXRJZCgpO1xuICAgIGlmICghZW5jb3VudGVyZWQub2JqZWN0c1tpZGVudGlmaWVyXSkge1xuICAgICAgZW5jb3VudGVyZWQub2JqZWN0c1tpZGVudGlmaWVyXSA9IG9iai5kaXJ0eSgpID8gb2JqIDogdHJ1ZTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBvYmouYXR0cmlidXRlcztcbiAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlc1thdHRyXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0cmF2ZXJzZShhdHRyaWJ1dGVzW2F0dHJdLCBlbmNvdW50ZXJlZCwgIWFsbG93RGVlcFVuc2F2ZWQsIGFsbG93RGVlcFVuc2F2ZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBpZiAob2JqIGluc3RhbmNlb2YgX1BhcnNlRmlsZS5kZWZhdWx0KSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgIGlmICghb2JqLnVybCgpICYmICgwLCBfaW5kZXhPZi5kZWZhdWx0KShfY29udGV4dCA9IGVuY291bnRlcmVkLmZpbGVzKS5jYWxsKF9jb250ZXh0LCBvYmopIDwgMCkge1xuICAgICAgZW5jb3VudGVyZWQuZmlsZXMucHVzaChvYmopO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG9iaiBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShvYmopKSB7XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKG9iaikuY2FsbChvYmosIGVsID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRyYXZlcnNlKGVsLCBlbmNvdW50ZXJlZCwgc2hvdWxkVGhyb3csIGFsbG93RGVlcFVuc2F2ZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZvciAoY29uc3QgayBpbiBvYmopIHtcbiAgICBpZiAodHlwZW9mIG9ialtrXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRyYXZlcnNlKG9ialtrXSwgZW5jb3VudGVyZWQsIHNob3VsZFRocm93LCBhbGxvd0RlZXBVbnNhdmVkKTtcbiAgICB9XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3V1aWQgPSByZXF1aXJlKFwidXVpZFwiKTtcbmxldCB1dWlkID0gX3V1aWQudjQ7XG5tb2R1bGUuZXhwb3J0cyA9IHV1aWQ7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB1dWlkOyIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRW5jcnlwdGVkUERGRXJyb3IsIEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IsIEZvcmVpZ25QYWdlRXJyb3IsIFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yLCB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IFBERkVtYmVkZGVkUGFnZSBmcm9tIFwiLi9QREZFbWJlZGRlZFBhZ2VcIjtcbmltcG9ydCBQREZGb250IGZyb20gXCIuL1BERkZvbnRcIjtcbmltcG9ydCBQREZJbWFnZSBmcm9tIFwiLi9QREZJbWFnZVwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4vUERGUGFnZVwiO1xuaW1wb3J0IFBERkZvcm0gZnJvbSBcIi4vZm9ybS9QREZGb3JtXCI7XG5pbXBvcnQgeyBQYWdlU2l6ZXMgfSBmcm9tIFwiLi9zaXplc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRm9udEVtYmVkZGVyLCBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIsIEpwZWdFbWJlZGRlciwgUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3IsIFBERkNhdGFsb2csIFBERkNvbnRleHQsIFBERkRpY3QsIFBERkhleFN0cmluZywgUERGTmFtZSwgUERGT2JqZWN0Q29waWVyLCBQREZQYWdlRW1iZWRkZXIsIFBERlBhZ2VMZWFmLCBQREZQYWdlVHJlZSwgUERGUGFyc2VyLCBQREZTdHJlYW1Xcml0ZXIsIFBERlN0cmluZywgUERGV3JpdGVyLCBQbmdFbWJlZGRlciwgU3RhbmRhcmRGb250RW1iZWRkZXIsIFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IsIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IFBhcnNlU3BlZWRzLCB9IGZyb20gXCIuL1BERkRvY3VtZW50T3B0aW9uc1wiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZCwgYXNzZXJ0T3JVbmRlZmluZWQsIGFzc2VydFJhbmdlLCBDYWNoZSwgY2FuQmVDb252ZXJ0ZWRUb1VpbnQ4QXJyYXksIGVuY29kZVRvQmFzZTY0LCBpc1N0YW5kYXJkRm9udCwgcGx1Y2tJbmRpY2VzLCByYW5nZSwgdG9VaW50OEFycmF5LCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IEZpbGVFbWJlZGRlciwgeyBBRlJlbGF0aW9uc2hpcCB9IGZyb20gXCIuLi9jb3JlL2VtYmVkZGVycy9GaWxlRW1iZWRkZXJcIjtcbmltcG9ydCBQREZFbWJlZGRlZEZpbGUgZnJvbSBcIi4vUERGRW1iZWRkZWRGaWxlXCI7XG5pbXBvcnQgUERGSmF2YVNjcmlwdCBmcm9tIFwiLi9QREZKYXZhU2NyaXB0XCI7XG5pbXBvcnQgSmF2YVNjcmlwdEVtYmVkZGVyIGZyb20gXCIuLi9jb3JlL2VtYmVkZGVycy9KYXZhU2NyaXB0RW1iZWRkZXJcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIFBERiBkb2N1bWVudC5cbiAqL1xudmFyIFBERkRvY3VtZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkRvY3VtZW50KGNvbnRleHQsIGlnbm9yZUVuY3J5cHRpb24sIHVwZGF0ZU1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8qKiBUaGUgZGVmYXVsdCB3b3JkIGJyZWFrcyB1c2VkIGluIFBERlBhZ2UuZHJhd1RleHQgKi9cbiAgICAgICAgdGhpcy5kZWZhdWx0V29yZEJyZWFrcyA9IFsnICddO1xuICAgICAgICB0aGlzLmNvbXB1dGVQYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYWdlcyA9IFtdO1xuICAgICAgICAgICAgX3RoaXMuY2F0YWxvZy5QYWdlcygpLnRyYXZlcnNlKGZ1bmN0aW9uIChub2RlLCByZWYpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFBERlBhZ2VMZWFmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYWdlID0gX3RoaXMucGFnZU1hcC5nZXQobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSA9IFBERlBhZ2Uub2Yobm9kZSwgcmVmLCBfdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5wYWdlTWFwLnNldChub2RlLCBwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYWdlcy5wdXNoKHBhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhZ2VzO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdldE9yQ3JlYXRlRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhY3JvRm9ybSA9IF90aGlzLmNhdGFsb2cuZ2V0T3JDcmVhdGVBY3JvRm9ybSgpO1xuICAgICAgICAgICAgcmV0dXJuIFBERkZvcm0ub2YoYWNyb0Zvcm0sIF90aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0SXMoY29udGV4dCwgJ2NvbnRleHQnLCBbW1BERkNvbnRleHQsICdQREZDb250ZXh0J11dKTtcbiAgICAgICAgYXNzZXJ0SXMoaWdub3JlRW5jcnlwdGlvbiwgJ2lnbm9yZUVuY3J5cHRpb24nLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY2F0YWxvZyA9IGNvbnRleHQubG9va3VwKGNvbnRleHQudHJhaWxlckluZm8uUm9vdCk7XG4gICAgICAgIHRoaXMuaXNFbmNyeXB0ZWQgPSAhIWNvbnRleHQubG9va3VwKGNvbnRleHQudHJhaWxlckluZm8uRW5jcnlwdCk7XG4gICAgICAgIHRoaXMucGFnZUNhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkodGhpcy5jb21wdXRlUGFnZXMpO1xuICAgICAgICB0aGlzLnBhZ2VNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZm9ybUNhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkodGhpcy5nZXRPckNyZWF0ZUZvcm0pO1xuICAgICAgICB0aGlzLmZvbnRzID0gW107XG4gICAgICAgIHRoaXMuaW1hZ2VzID0gW107XG4gICAgICAgIHRoaXMuZW1iZWRkZWRQYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLmVtYmVkZGVkRmlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5qYXZhU2NyaXB0cyA9IFtdO1xuICAgICAgICBpZiAoIWlnbm9yZUVuY3J5cHRpb24gJiYgdGhpcy5pc0VuY3J5cHRlZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFbmNyeXB0ZWRQREZFcnJvcigpO1xuICAgICAgICBpZiAodXBkYXRlTWV0YWRhdGEpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUluZm9EaWN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWQgYW4gZXhpc3RpbmcgW1tQREZEb2N1bWVudF1dLiBUaGUgaW5wdXQgZGF0YSBjYW4gYmUgcHJvdmlkZWQgaW5cbiAgICAgKiBtdWx0aXBsZSBmb3JtYXRzOlxuICAgICAqXG4gICAgICogfCBUeXBlICAgICAgICAgIHwgQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgICAqIHwgYHN0cmluZ2AgICAgICB8IEEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIChvciBkYXRhIFVSSSkgY29udGFpbmluZyBhIFBERiB8XG4gICAgICogfCBgVWludDhBcnJheWAgIHwgVGhlIHJhdyBieXRlcyBvZiBhIFBERiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBBcnJheUJ1ZmZlcmAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgUERGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiAvLyBwZGY9c3RyaW5nXG4gICAgICogY29uc3QgYmFzZTY0ID1cbiAgICAgKiAgJ0pWQkVSaTB4TGpjS0pZR0JnWUVLQ2pVZ01DQnZZbW9LUER3S0wwWnBiSFJsY2lBdlJteGhkR1ZFWldOdlpHVUtMMHhsYm0nICtcbiAgICAgKiAgJ2QwYUNBeE1EUUtQajRLYzNSeVpXRnRDbmljY3dyaE1sQUF3YUowTG4yUDFKeXkxSkxNNUVSZGMwTWpDd1VqRTRXUU5DNFEnICtcbiAgICAgKiAgJzZjTmxDRlprcUdDcVlHU3FFSkxMWldOdVlHWmlabWJrWXVac1ptbG1aR1JnWm1sdURDUU56YzNOVE0yTnpkek1YTXhNalEnICtcbiAgICAgKiAgJ3p0RkVLeXVFSzB1RnhEdUFBT0VSZFZDbVZ1WkhOMGNtVmhiUXBsYm1Sdlltb0tDallnTUNCdlltb0tQRHdLTDBacGJIUmwnICtcbiAgICAgKiAgJ2NpQXZSbXhoZEdWRVpXTnZaR1VLTDFSNWNHVWdMMDlpYWxOMGJRb3ZUaUEwQ2k5R2FYSnpkQ0F5TUFvdlRHVnVaM1JvSUQnICtcbiAgICAgKiAgJ0l4TlFvK1BncHpkSEpsWVcwS2VKeFZqOUdxd2pBTWh1L3pGSGtCelRvM25DQ0NpaUtJSFBFSUN1SkYzY0tvU0N1MkU4L2InICtcbiAgICAgKiAgJzIwd1BJcjFwOHY5LzhrVmhnaWxtR2Zhd1gyQ0dhVnJnY0FpMC9ic3kwbHJYN0lHV3B2SjRpSllFTjNnRW1yckdCbFF3R3MnICtcbiAgICAgKiAgJ0hITzlWQlgxd05yeEFxTVg4N1JCRDV4cEp1ZGRxd2Q4MnRqQUh4elYxVTVMUGd5NTJES1hXbnIxTGhlZytqL2MvcHpHVnInICtcbiAgICAgKiAgJ2lxVjBWbHdaUFhHUENKakVsdy95Ymt3VW1lb1dneGVzRFhHaEhKQy9EL2lpa3AxQXY4MHB0S1UwRmRCRWUyNXBQaWhBTTEnICtcbiAgICAgKiAgJ3U2eXRnYWFXZnMySHJ6MzVDSlQxK0VXbUFLWlc1a2MzUnlaV0Z0Q21WdVpHOWlhZ29LTnlBd0lHOWlhZ284UEFvdlUybDYnICtcbiAgICAgKiAgJ1pTQTRDaTlTYjI5MElESWdNQ0JTQ2k5R2FXeDBaWElnTDBac1lYUmxSR1ZqYjJSbENpOVVlWEJsSUM5WVVtVm1DaTlNWlcnICtcbiAgICAgKiAgJzVuZEdnZ016Z0tMMWNnV3lBeElESWdNaUJkQ2k5SmJtUmxlQ0JiSURBZ09DQmRDajQrQ25OMGNtVmhiUXA0bkJYRXdSRUEnICtcbiAgICAgKiAgJ0VCQUVzQ3d6M3ZydlJtT095eU9vR2haZHV0SE4yTVQ1NWZJQVZvY0QrQXBsYm1SemRISmxZVzBLWlc1a2IySnFDZ3B6ZEcnICtcbiAgICAgKiAgJ0Z5ZEhoeVpXWUtOVEV3Q2lVbFJVOUcnXG4gICAgICpcbiAgICAgKiBjb25zdCBkYXRhVXJpID0gJ2RhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCwnICsgYmFzZTY0XG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MxID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZChiYXNlNjQpXG4gICAgICogY29uc3QgcGRmRG9jMiA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoZGF0YVVyaSlcbiAgICAgKlxuICAgICAqIC8vIHBkZj1VaW50OEFycmF5XG4gICAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgICAqIGNvbnN0IHVpbnQ4QXJyYXkgPSBmcy5yZWFkRmlsZVN5bmMoJ3dpdGhfdXBkYXRlX3NlY3Rpb25zLnBkZicpXG4gICAgICogY29uc3QgcGRmRG9jMyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQodWludDhBcnJheSlcbiAgICAgKlxuICAgICAqIC8vIHBkZj1BcnJheUJ1ZmZlclxuICAgICAqIGNvbnN0IHVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy93aXRoX3VwZGF0ZV9zZWN0aW9ucy5wZGYnXG4gICAgICogY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4ocmVzID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGNvbnN0IHBkZkRvYzQgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKGFycmF5QnVmZmVyKVxuICAgICAqXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGRmIFRoZSBpbnB1dCBkYXRhIGNvbnRhaW5pbmcgYSBQREYgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGxvYWRpbmcgdGhlIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggYSBkb2N1bWVudCBsb2FkZWQgZnJvbSB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQubG9hZCA9IGZ1bmN0aW9uIChwZGYsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBpZ25vcmVFbmNyeXB0aW9uLCBfYiwgcGFyc2VTcGVlZCwgX2MsIHRocm93T25JbnZhbGlkT2JqZWN0LCBfZCwgdXBkYXRlTWV0YWRhdGEsIF9lLCBjYXBOdW1iZXJzLCBieXRlcywgY29udGV4dDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2YpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9mLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gb3B0aW9ucy5pZ25vcmVFbmNyeXB0aW9uLCBpZ25vcmVFbmNyeXB0aW9uID0gX2EgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EsIF9iID0gb3B0aW9ucy5wYXJzZVNwZWVkLCBwYXJzZVNwZWVkID0gX2IgPT09IHZvaWQgMCA/IFBhcnNlU3BlZWRzLlNsb3cgOiBfYiwgX2MgPSBvcHRpb25zLnRocm93T25JbnZhbGlkT2JqZWN0LCB0aHJvd09uSW52YWxpZE9iamVjdCA9IF9jID09PSB2b2lkIDAgPyBmYWxzZSA6IF9jLCBfZCA9IG9wdGlvbnMudXBkYXRlTWV0YWRhdGEsIHVwZGF0ZU1ldGFkYXRhID0gX2QgPT09IHZvaWQgMCA/IHRydWUgOiBfZCwgX2UgPSBvcHRpb25zLmNhcE51bWJlcnMsIGNhcE51bWJlcnMgPSBfZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHBkZiwgJ3BkZicsIFsnc3RyaW5nJywgVWludDhBcnJheSwgQXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGlnbm9yZUVuY3J5cHRpb24sICdpZ25vcmVFbmNyeXB0aW9uJywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMocGFyc2VTcGVlZCwgJ3BhcnNlU3BlZWQnLCBbJ251bWJlciddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHRocm93T25JbnZhbGlkT2JqZWN0LCAndGhyb3dPbkludmFsaWRPYmplY3QnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IHRvVWludDhBcnJheShwZGYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUERGUGFyc2VyLmZvckJ5dGVzV2l0aE9wdGlvbnMoYnl0ZXMsIHBhcnNlU3BlZWQsIHRocm93T25JbnZhbGlkT2JqZWN0LCBjYXBOdW1iZXJzKS5wYXJzZURvY3VtZW50KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gX2Yuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQREZEb2N1bWVudChjb250ZXh0LCBpZ25vcmVFbmNyeXB0aW9uLCB1cGRhdGVNZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBbW1BERkRvY3VtZW50XV0uXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5jcmVhdGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHVwZGF0ZU1ldGFkYXRhLCBjb250ZXh0LCBwYWdlVHJlZSwgcGFnZVRyZWVSZWYsIGNhdGFsb2c7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgX2EgPSBvcHRpb25zLnVwZGF0ZU1ldGFkYXRhLCB1cGRhdGVNZXRhZGF0YSA9IF9hID09PSB2b2lkIDAgPyB0cnVlIDogX2E7XG4gICAgICAgICAgICAgICAgY29udGV4dCA9IFBERkNvbnRleHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgcGFnZVRyZWUgPSBQREZQYWdlVHJlZS53aXRoQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBwYWdlVHJlZVJlZiA9IGNvbnRleHQucmVnaXN0ZXIocGFnZVRyZWUpO1xuICAgICAgICAgICAgICAgIGNhdGFsb2cgPSBQREZDYXRhbG9nLndpdGhDb250ZXh0QW5kUGFnZXMoY29udGV4dCwgcGFnZVRyZWVSZWYpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQudHJhaWxlckluZm8uUm9vdCA9IGNvbnRleHQucmVnaXN0ZXIoY2F0YWxvZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQREZEb2N1bWVudChjb250ZXh0LCBmYWxzZSwgdXBkYXRlTWV0YWRhdGEpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgZm9udGtpdCBpbnN0YW5jZS4gVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIGN1c3RvbSBmb250cyBjYW5cbiAgICAgKiBiZSBlbWJlZGRlZC4gU2VlIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vSG9wZGluZy9wZGYtbGliL3RyZWUvbWFzdGVyI2ZvbnRraXQtaW5zdGFsbGF0aW9uKVxuICAgICAqIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGluc3RhbGwgYW5kIHJlZ2lzdGVyIGEgZm9udGtpdCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqID4gWW91IGRvICoqbm90KiogbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIHRvIGVtYmVkIHN0YW5kYXJkIGZvbnRzLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCB9IGZyb20gJ3BkZi1saWInXG4gICAgICogaW1wb3J0IGZvbnRraXQgZnJvbSAnQHBkZi1saWIvZm9udGtpdCdcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogcGRmRG9jLnJlZ2lzdGVyRm9udGtpdChmb250a2l0KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGZvbnRraXQgVGhlIGZvbnRraXQgaW5zdGFuY2UgdG8gYmUgcmVnaXN0ZXJlZC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUucmVnaXN0ZXJGb250a2l0ID0gZnVuY3Rpb24gKGZvbnRraXQpIHtcbiAgICAgICAgdGhpcy5mb250a2l0ID0gZm9udGtpdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgW1tQREZGb3JtXV0gY29udGFpbmluZyBhbGwgaW50ZXJhY3RpdmUgZmllbGRzIGZvciB0aGlzIGRvY3VtZW50LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZHMgPSBmb3JtLmdldEZpZWxkcygpXG4gICAgICogZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAqICAgY29uc3QgdHlwZSA9IGZpZWxkLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgKiAgIGNvbnN0IG5hbWUgPSBmaWVsZC5nZXROYW1lKClcbiAgICAgKiAgIGNvbnNvbGUubG9nKGAke3R5cGV9OiAke25hbWV9YClcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBmb3JtIGZvciB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRGb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZm9ybSA9IHRoaXMuZm9ybUNhY2hlLmFjY2VzcygpO1xuICAgICAgICBpZiAoZm9ybS5oYXNYRkEoKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZW1vdmluZyBYRkEgZm9ybSBkYXRhIGFzIHBkZi1saWIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIG9yIHdyaXRpbmcgWEZBJyk7XG4gICAgICAgICAgICBmb3JtLmRlbGV0ZVhGQSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyB0aXRsZSBtZXRhZGF0YS4gVGhlIHRpdGxlIGFwcGVhcnMgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRpdGxlID0gcGRmRG9jLmdldFRpdGxlKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSB0aXRsZSBvZiB0aGlzIGRvY3VtZW50LCBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLlRpdGxlKTtcbiAgICAgICAgaWYgKCF0aXRsZSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKHRpdGxlKTtcbiAgICAgICAgcmV0dXJuIHRpdGxlLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3MgYXV0aG9yIG1ldGFkYXRhLiBUaGUgYXV0aG9yIGFwcGVhcnMgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGF1dGhvciA9IHBkZkRvYy5nZXRBdXRob3IoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGF1dGhvciBvZiB0aGlzIGRvY3VtZW50LCBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRBdXRob3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhdXRob3IgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuQXV0aG9yKTtcbiAgICAgICAgaWYgKCFhdXRob3IpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhhdXRob3IpO1xuICAgICAgICByZXR1cm4gYXV0aG9yLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3Mgc3ViamVjdCBtZXRhZGF0YS4gVGhlIHN1YmplY3QgYXBwZWFycyBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgc3ViamVjdCA9IHBkZkRvYy5nZXRTdWJqZWN0KClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBzdWJqZWN0IG9mIHRoaXMgZG9jdW1lbnQsIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldFN1YmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdWJqZWN0ID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLlN1YmplY3QpO1xuICAgICAgICBpZiAoIXN1YmplY3QpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhzdWJqZWN0KTtcbiAgICAgICAgcmV0dXJuIHN1YmplY3QuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBrZXl3b3JkcyBtZXRhZGF0YS4gVGhlIGtleXdvcmRzIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qga2V5d29yZHMgPSBwZGZEb2MuZ2V0S2V5d29yZHMoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGtleXdvcmRzIG9mIHRoaXMgZG9jdW1lbnQsIGlmIGl0IGhhcyBhbnkuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldEtleXdvcmRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIga2V5d29yZHMgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuS2V5d29yZHMpO1xuICAgICAgICBpZiAoIWtleXdvcmRzKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcoa2V5d29yZHMpO1xuICAgICAgICByZXR1cm4ga2V5d29yZHMuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBjcmVhdG9yIG1ldGFkYXRhLiBUaGUgY3JlYXRvciBhcHBlYXJzIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjcmVhdG9yID0gcGRmRG9jLmdldENyZWF0b3IoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNyZWF0b3Igb2YgdGhpcyBkb2N1bWVudCwgaWYgaXQgaGFzIG9uZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0Q3JlYXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNyZWF0b3IgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuQ3JlYXRvcik7XG4gICAgICAgIGlmICghY3JlYXRvcilcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKGNyZWF0b3IpO1xuICAgICAgICByZXR1cm4gY3JlYXRvci5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBkb2N1bWVudCdzIHByb2R1Y2VyIG1ldGFkYXRhLiBUaGUgcHJvZHVjZXIgYXBwZWFycyBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcHJvZHVjZXIgPSBwZGZEb2MuZ2V0UHJvZHVjZXIoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHByb2R1Y2VyIG9mIHRoaXMgZG9jdW1lbnQsIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldFByb2R1Y2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvZHVjZXIgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuUHJvZHVjZXIpO1xuICAgICAgICBpZiAoIXByb2R1Y2VyKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcocHJvZHVjZXIpO1xuICAgICAgICByZXR1cm4gcHJvZHVjZXIuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBjcmVhdGlvbiBkYXRlIG1ldGFkYXRhLiBUaGUgY3JlYXRpb24gZGF0ZSBhcHBlYXJzIGluXG4gICAgICogdGhlIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjcmVhdGlvbkRhdGUgPSBwZGZEb2MuZ2V0Q3JlYXRpb25EYXRlKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIERhdGUgY29udGFpbmluZyB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGlzIGRvY3VtZW50LFxuICAgICAqICAgICAgICAgIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldENyZWF0aW9uRGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNyZWF0aW9uRGF0ZSA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5DcmVhdGlvbkRhdGUpO1xuICAgICAgICBpZiAoIWNyZWF0aW9uRGF0ZSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKGNyZWF0aW9uRGF0ZSk7XG4gICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGUuZGVjb2RlRGF0ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBtb2RpZmljYXRpb24gZGF0ZSBtZXRhZGF0YS4gVGhlIG1vZGlmaWNhdGlvbiBkYXRlXG4gICAgICogYXBwZWFycyBpbiB0aGUgXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgbW9kaWZpY2F0aW9uID0gcGRmRG9jLmdldE1vZGlmaWNhdGlvbkRhdGUoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgRGF0ZSBjb250YWluaW5nIHRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGRvY3VtZW50LFxuICAgICAqICAgICAgICAgIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldE1vZGlmaWNhdGlvbkRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtb2RpZmljYXRpb25EYXRlID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLk1vZERhdGUpO1xuICAgICAgICBpZiAoIW1vZGlmaWNhdGlvbkRhdGUpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhtb2RpZmljYXRpb25EYXRlKTtcbiAgICAgICAgcmV0dXJuIG1vZGlmaWNhdGlvbkRhdGUuZGVjb2RlRGF0ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyB0aXRsZSBtZXRhZGF0YS4gVGhlIHRpdGxlIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0VGl0bGUoJ/CfpZogVGhlIExpZmUgb2YgYW4gRWdnIPCfjbMnKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVG8gZGlzcGxheSB0aGUgdGl0bGUgaW4gdGhlIHdpbmRvdydzIHRpdGxlIGJhciwgc2V0IHRoZVxuICAgICAqIGBzaG93SW5XaW5kb3dUaXRsZUJhcmAgb3B0aW9uIHRvIGB0cnVlYCAod29ya3MgZm9yIF9tb3N0XyBQREYgcmVhZGVycykuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0VGl0bGUoJ/CfpZogVGhlIExpZmUgb2YgYW4gRWdnIPCfjbMnLCB7IHNob3dJbldpbmRvd1RpdGxlQmFyOiB0cnVlIH0pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIHRpdGxlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRUaXRsZSA9IGZ1bmN0aW9uICh0aXRsZSwgb3B0aW9ucykge1xuICAgICAgICBhc3NlcnRJcyh0aXRsZSwgJ3RpdGxlJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdUaXRsZScpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KHRpdGxlKSk7XG4gICAgICAgIC8vIEluZGljYXRlIHRoYXQgcmVhZGVycyBzaG91bGQgZGlzcGxheSB0aGUgdGl0bGUgcmF0aGVyIHRoYW4gdGhlIGZpbGVuYW1lXG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2hvd0luV2luZG93VGl0bGVCYXIpIHtcbiAgICAgICAgICAgIHZhciBwcmVmcyA9IHRoaXMuY2F0YWxvZy5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzKCk7XG4gICAgICAgICAgICBwcmVmcy5zZXREaXNwbGF5RG9jVGl0bGUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgYXV0aG9yIG1ldGFkYXRhLiBUaGUgYXV0aG9yIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0QXV0aG9yKCdIdW1wdHkgRHVtcHR5JylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gYXV0aG9yIFRoZSBhdXRob3Igb2YgdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0QXV0aG9yID0gZnVuY3Rpb24gKGF1dGhvcikge1xuICAgICAgICBhc3NlcnRJcyhhdXRob3IsICdhdXRob3InLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ0F1dGhvcicpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KGF1dGhvcikpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBzdWJqZWN0IG1ldGFkYXRhLiBUaGUgc3ViamVjdCB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldFN1YmplY3QoJ/Cfk5ggQW4gRXBpYyBUYWxlIG9mIFdvZSDwn5OWJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gc3ViamVjdCBUaGUgc3ViamVjdCBvZiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRTdWJqZWN0ID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgYXNzZXJ0SXMoc3ViamVjdCwgJ2F1dGhvcicsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignU3ViamVjdCcpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KHN1YmplY3QpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3Mga2V5d29yZCBtZXRhZGF0YS4gVGhlc2Uga2V5d29yZHMgd2lsbCBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRLZXl3b3JkcyhbJ2VnZ3MnLCAnd2FsbCcsICdmYWxsJywgJ2tpbmcnLCAnaG9yc2VzJywgJ21lbiddKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBrZXl3b3JkcyBBbiBhcnJheSBvZiBrZXl3b3JkcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0S2V5d29yZHMgPSBmdW5jdGlvbiAoa2V5d29yZHMpIHtcbiAgICAgICAgYXNzZXJ0SXMoa2V5d29yZHMsICdrZXl3b3JkcycsIFtBcnJheV0pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignS2V5d29yZHMnKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERkhleFN0cmluZy5mcm9tVGV4dChrZXl3b3Jkcy5qb2luKCcgJykpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgY3JlYXRvciBtZXRhZGF0YS4gVGhlIGNyZWF0b3Igd2lsbCBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRDcmVhdG9yKCdQREYgQXBwIDkwMDAg8J+klicpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNyZWF0b3IgVGhlIGNyZWF0b3Igb2YgdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0Q3JlYXRvciA9IGZ1bmN0aW9uIChjcmVhdG9yKSB7XG4gICAgICAgIGFzc2VydElzKGNyZWF0b3IsICdjcmVhdG9yJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdDcmVhdG9yJyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZIZXhTdHJpbmcuZnJvbVRleHQoY3JlYXRvcikpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBwcm9kdWNlciBtZXRhZGF0YS4gVGhlIHByb2R1Y2VyIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0UHJvZHVjZXIoJ1BERiBBcHAgOTAwMCDwn6SWJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcHJvZHVjZXIgVGhlIHByb2R1Y2VyIG9mIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldFByb2R1Y2VyID0gZnVuY3Rpb24gKHByb2R1Y2VyKSB7XG4gICAgICAgIGFzc2VydElzKHByb2R1Y2VyLCAnY3JlYXRvcicsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignUHJvZHVjZXInKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERkhleFN0cmluZy5mcm9tVGV4dChwcm9kdWNlcikpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBsYW5ndWFnZSBtZXRhZGF0YS4gVGhlIGxhbmd1YWdlIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2Ygc29tZSBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0TGFuZ3VhZ2UoJ2VuLXVzJylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSBBbiBSRkMgMzA2NiBfTGFuZ3VhZ2UtVGFnXyBkZW5vdGluZyB0aGUgbGFuZ3VhZ2Ugb2YgdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICBkb2N1bWVudCwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBsYW5ndWFnZSBpcyB1bmtub3duLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRMYW5ndWFnZSA9IGZ1bmN0aW9uIChsYW5ndWFnZSkge1xuICAgICAgICBhc3NlcnRJcyhsYW5ndWFnZSwgJ2xhbmd1YWdlJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdMYW5nJyk7XG4gICAgICAgIHRoaXMuY2F0YWxvZy5zZXQoa2V5LCBQREZTdHJpbmcub2YobGFuZ3VhZ2UpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgY3JlYXRpb24gZGF0ZSBtZXRhZGF0YS4gVGhlIGNyZWF0aW9uIGRhdGUgd2lsbCBhcHBlYXJcbiAgICAgKiBpbiB0aGUgXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRDcmVhdGlvbkRhdGUobmV3IERhdGUoKSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY3JlYXRpb25EYXRlIFRoZSBkYXRlIHRoaXMgZG9jdW1lbnQgd2FzIGNyZWF0ZWQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldENyZWF0aW9uRGF0ZSA9IGZ1bmN0aW9uIChjcmVhdGlvbkRhdGUpIHtcbiAgICAgICAgYXNzZXJ0SXMoY3JlYXRpb25EYXRlLCAnY3JlYXRpb25EYXRlJywgW1tEYXRlLCAnRGF0ZSddXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdDcmVhdGlvbkRhdGUnKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERlN0cmluZy5mcm9tRGF0ZShjcmVhdGlvbkRhdGUpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgbW9kaWZpY2F0aW9uIGRhdGUgbWV0YWRhdGEuIFRoZSBtb2RpZmljYXRpb24gZGF0ZSB3aWxsXG4gICAgICogYXBwZWFyIGluIHRoZSBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvclxuICAgICAqIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0TW9kaWZpY2F0aW9uRGF0ZShuZXcgRGF0ZSgpKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBtb2RpZmljYXRpb25EYXRlIFRoZSBkYXRlIHRoaXMgZG9jdW1lbnQgd2FzIGxhc3QgbW9kaWZpZWQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldE1vZGlmaWNhdGlvbkRhdGUgPSBmdW5jdGlvbiAobW9kaWZpY2F0aW9uRGF0ZSkge1xuICAgICAgICBhc3NlcnRJcyhtb2RpZmljYXRpb25EYXRlLCAnbW9kaWZpY2F0aW9uRGF0ZScsIFtbRGF0ZSwgJ0RhdGUnXV0pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignTW9kRGF0ZScpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGU3RyaW5nLmZyb21EYXRlKG1vZGlmaWNhdGlvbkRhdGUpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHBhZ2VzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRvdGFsUGFnZXMgPSBwZGZEb2MuZ2V0UGFnZUNvdW50KClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIHBhZ2VzIGluIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldFBhZ2VDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFnZUNvdW50ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLnBhZ2VDb3VudCA9IHRoaXMuZ2V0UGFnZXMoKS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2VDb3VudDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhbiBhcnJheSBvZiBhbGwgdGhlIHBhZ2VzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50LiBUaGUgcGFnZXMgYXJlXG4gICAgICogc3RvcmVkIGluIHRoZSBhcnJheSBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJlbmRlcmVkIGluIHRoZVxuICAgICAqIGRvY3VtZW50LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBhZ2VzID0gcGRmRG9jLmdldFBhZ2VzKClcbiAgICAgKiBwYWdlc1swXSAgIC8vIFRoZSBmaXJzdCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBhZ2VzWzJdICAgLy8gVGhlIHRoaXJkIHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogcGFnZXNbMTk3XSAvLyBUaGUgMTk4dGggcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgdGhlIHBhZ2VzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRQYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZUNhY2hlLmFjY2VzcygpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwYWdlIHJlbmRlcmVkIGF0IGEgcGFydGljdWxhciBgaW5kZXhgIG9mIHRoZSBkb2N1bWVudC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2MuZ2V0UGFnZSgwKSAgIC8vIFRoZSBmaXJzdCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBkZkRvYy5nZXRQYWdlKDIpICAgLy8gVGhlIHRoaXJkIHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogcGRmRG9jLmdldFBhZ2UoMTk3KSAvLyBUaGUgMTk4dGggcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgW1tQREZQYWdlXV0gcmVuZGVyZWQgYXQgdGhlIGdpdmVuIGBpbmRleGAgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRQYWdlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBwYWdlcyA9IHRoaXMuZ2V0UGFnZXMoKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2UoaW5kZXgsICdpbmRleCcsIDAsIHBhZ2VzLmxlbmd0aCAtIDEpO1xuICAgICAgICByZXR1cm4gcGFnZXNbaW5kZXhdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IGFuIGFycmF5IG9mIGluZGljZXMgZm9yIGFsbCB0aGUgcGFnZXMgY29udGFpbmVkIGluIHRoaXMgZG9jdW1lbnQuIFRoZVxuICAgICAqIGFycmF5IHdpbGwgY29udGFpbiBhIHJhbmdlIG9mIGludGVnZXJzIGZyb21cbiAgICAgKiBgMC4ucGRmRG9jLmdldFBhZ2VDb3VudCgpIC0gMWAuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICogcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqIHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGluZGljZXMgPSBwZGZEb2MuZ2V0UGFnZUluZGljZXMoKVxuICAgICAqIGluZGljZXMgLy8gPT4gWzAsIDEsIDJdXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgaW5kaWNlcyBmb3IgYWxsIHBhZ2VzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRQYWdlSW5kaWNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlKDAsIHRoaXMuZ2V0UGFnZUNvdW50KCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBwYWdlIGF0IGEgZ2l2ZW4gaW5kZXggZnJvbSB0aGlzIGRvY3VtZW50LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5yZW1vdmVQYWdlKDApICAgLy8gUmVtb3ZlIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBkZkRvYy5yZW1vdmVQYWdlKDIpICAgLy8gUmVtb3ZlIHRoZSB0aGlyZCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBkZkRvYy5yZW1vdmVQYWdlKDE5NykgLy8gUmVtb3ZlIHRoZSAxOTh0aCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIGBgYFxuICAgICAqIE9uY2UgYSBwYWdlIGhhcyBiZWVuIHJlbW92ZWQsIGl0IHdpbGwgbm8gbG9uZ2VyIGJlIHJlbmRlcmVkIGF0IHRoYXQgaW5kZXhcbiAgICAgKiBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcGFnZSB0byBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5yZW1vdmVQYWdlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBwYWdlQ291bnQgPSB0aGlzLmdldFBhZ2VDb3VudCgpO1xuICAgICAgICBpZiAodGhpcy5wYWdlQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3IoKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2UoaW5kZXgsICdpbmRleCcsIDAsIHBhZ2VDb3VudCAtIDEpO1xuICAgICAgICB0aGlzLmNhdGFsb2cucmVtb3ZlTGVhZk5vZGUoaW5kZXgpO1xuICAgICAgICB0aGlzLnBhZ2VDb3VudCA9IHBhZ2VDb3VudCAtIDE7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBwYWdlIHRvIHRoZSBlbmQgb2YgdGhpcyBkb2N1bWVudC4gVGhpcyBtZXRob2QgYWNjZXB0cyB0aHJlZVxuICAgICAqIGRpZmZlcmVudCB2YWx1ZSB0eXBlcyBmb3IgdGhlIGBwYWdlYCBwYXJhbWV0ZXI6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgICAgICB8IEJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGB1bmRlZmluZWRgICAgICAgICB8IENyZWF0ZSBhIG5ldyBwYWdlIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGlzIGRvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBbbnVtYmVyLCBudW1iZXJdYCB8IENyZWF0ZSBhIG5ldyBwYWdlIHdpdGggdGhlIGdpdmVuIGRpbWVuc2lvbnMgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQgIHxcbiAgICAgKiB8IGBQREZQYWdlYCAgICAgICAgICB8IEFkZCB0aGUgZXhpc3RpbmcgcGFnZSB0byB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcGFnZT11bmRlZmluZWRcbiAgICAgKiBjb25zdCBuZXdQYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogLy8gcGFnZT1bbnVtYmVyLCBudW1iZXJdXG4gICAgICogaW1wb3J0IHsgUGFnZVNpemVzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKiBjb25zdCBuZXdQYWdlMSA9IHBkZkRvYy5hZGRQYWdlKFBhZ2VTaXplcy5BNylcbiAgICAgKiBjb25zdCBuZXdQYWdlMiA9IHBkZkRvYy5hZGRQYWdlKFBhZ2VTaXplcy5MZXR0ZXIpXG4gICAgICogY29uc3QgbmV3UGFnZTMgPSBwZGZEb2MuYWRkUGFnZShbNTAwLCA3NTBdKVxuICAgICAqXG4gICAgICogLy8gcGFnZT1QREZQYWdlXG4gICAgICogY29uc3QgcGRmRG9jMSA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3QgcGRmRG9jMiA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoLi4uKVxuICAgICAqIGNvbnN0IFtleGlzdGluZ1BhZ2VdID0gYXdhaXQgcGRmRG9jMS5jb3B5UGFnZXMocGRmRG9jMiwgWzBdKVxuICAgICAqIHBkZkRvYzEuYWRkUGFnZShleGlzdGluZ1BhZ2UpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZSBPcHRpb25hbGx5LCB0aGUgZGVzaXJlZCBkaW1lbnNpb25zIG9yIGV4aXN0aW5nIHBhZ2UuXG4gICAgICogQHJldHVybnMgVGhlIG5ld2x5IGNyZWF0ZWQgKG9yIGV4aXN0aW5nKSBwYWdlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5hZGRQYWdlID0gZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbJ3VuZGVmaW5lZCcsIFtQREZQYWdlLCAnUERGUGFnZSddLCBBcnJheV0pO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRQYWdlKHRoaXMuZ2V0UGFnZUNvdW50KCksIHBhZ2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGEgcGFnZSBhdCBhIGdpdmVuIGluZGV4IHdpdGhpbiB0aGlzIGRvY3VtZW50LiBUaGlzIG1ldGhvZCBhY2NlcHRzXG4gICAgICogdGhyZWUgZGlmZmVyZW50IHZhbHVlIHR5cGVzIGZvciB0aGUgYHBhZ2VgIHBhcmFtZXRlcjpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICAgICAgIHwgQmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgdW5kZWZpbmVkYCAgICAgICAgfCBDcmVhdGUgYSBuZXcgcGFnZSBhbmQgaW5zZXJ0IGl0IGludG8gdGhpcyBkb2N1bWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYFtudW1iZXIsIG51bWJlcl1gIHwgQ3JlYXRlIGEgbmV3IHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gZGltZW5zaW9ucyBhbmQgaW5zZXJ0IGl0IGludG8gdGhpcyBkb2N1bWVudCAgIHxcbiAgICAgKiB8IGBQREZQYWdlYCAgICAgICAgICB8IEluc2VydCB0aGUgZXhpc3RpbmcgcGFnZSBpbnRvIHRoaXMgZG9jdW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIHBhZ2U9dW5kZWZpbmVkXG4gICAgICogY29uc3QgbmV3UGFnZSA9IHBkZkRvYy5pbnNlcnRQYWdlKDIpXG4gICAgICpcbiAgICAgKiAvLyBwYWdlPVtudW1iZXIsIG51bWJlcl1cbiAgICAgKiBpbXBvcnQgeyBQYWdlU2l6ZXMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqIGNvbnN0IG5ld1BhZ2UxID0gcGRmRG9jLmluc2VydFBhZ2UoMiwgUGFnZVNpemVzLkE3KVxuICAgICAqIGNvbnN0IG5ld1BhZ2UyID0gcGRmRG9jLmluc2VydFBhZ2UoMCwgUGFnZVNpemVzLkxldHRlcilcbiAgICAgKiBjb25zdCBuZXdQYWdlMyA9IHBkZkRvYy5pbnNlcnRQYWdlKDE5OCwgWzUwMCwgNzUwXSlcbiAgICAgKlxuICAgICAqIC8vIHBhZ2U9UERGUGFnZVxuICAgICAqIGNvbnN0IHBkZkRvYzEgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHBkZkRvYzIgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKC4uLilcbiAgICAgKiBjb25zdCBbZXhpc3RpbmdQYWdlXSA9IGF3YWl0IHBkZkRvYzEuY29weVBhZ2VzKHBkZkRvYzIsIFswXSlcbiAgICAgKiBwZGZEb2MxLmluc2VydFBhZ2UoMCwgZXhpc3RpbmdQYWdlKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgcGFnZSBzaG91bGQgYmUgaW5zZXJ0ZWQgKHplcm8tYmFzZWQpLlxuICAgICAqIEBwYXJhbSBwYWdlIE9wdGlvbmFsbHksIHRoZSBkZXNpcmVkIGRpbWVuc2lvbnMgb3IgZXhpc3RpbmcgcGFnZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCAob3IgZXhpc3RpbmcpIHBhZ2UuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmluc2VydFBhZ2UgPSBmdW5jdGlvbiAoaW5kZXgsIHBhZ2UpIHtcbiAgICAgICAgdmFyIHBhZ2VDb3VudCA9IHRoaXMuZ2V0UGFnZUNvdW50KCk7XG4gICAgICAgIGFzc2VydFJhbmdlKGluZGV4LCAnaW5kZXgnLCAwLCBwYWdlQ291bnQpO1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFsndW5kZWZpbmVkJywgW1BERlBhZ2UsICdQREZQYWdlJ10sIEFycmF5XSk7XG4gICAgICAgIGlmICghcGFnZSB8fCBBcnJheS5pc0FycmF5KHBhZ2UpKSB7XG4gICAgICAgICAgICB2YXIgZGltcyA9IEFycmF5LmlzQXJyYXkocGFnZSkgPyBwYWdlIDogUGFnZVNpemVzLkE0O1xuICAgICAgICAgICAgcGFnZSA9IFBERlBhZ2UuY3JlYXRlKHRoaXMpO1xuICAgICAgICAgICAgcGFnZS5zZXRTaXplLmFwcGx5KHBhZ2UsIGRpbXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhZ2UuZG9jICE9PSB0aGlzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9yZWlnblBhZ2VFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRSZWYgPSB0aGlzLmNhdGFsb2cuaW5zZXJ0TGVhZk5vZGUocGFnZS5yZWYsIGluZGV4KTtcbiAgICAgICAgcGFnZS5ub2RlLnNldFBhcmVudChwYXJlbnRSZWYpO1xuICAgICAgICB0aGlzLnBhZ2VNYXAuc2V0KHBhZ2Uubm9kZSwgcGFnZSk7XG4gICAgICAgIHRoaXMucGFnZUNhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5wYWdlQ291bnQgPSBwYWdlQ291bnQgKyAxO1xuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvcHkgcGFnZXMgZnJvbSBhIHNvdXJjZSBkb2N1bWVudCBpbnRvIHRoaXMgZG9jdW1lbnQuIEFsbG93cyBwYWdlcyB0byBiZVxuICAgICAqIGNvcGllZCBiZXR3ZWVuIGRpZmZlcmVudCBbW1BERkRvY3VtZW50XV0gaW5zdGFuY2VzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3Qgc3JjRG9jID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZCguLi4pXG4gICAgICpcbiAgICAgKiBjb25zdCBjb3BpZWRQYWdlcyA9IGF3YWl0IHBkZkRvYy5jb3B5UGFnZXMoc3JjRG9jLCBbMCwgMywgODldKVxuICAgICAqIGNvbnN0IFtmaXJzdFBhZ2UsIGZvdXJ0aFBhZ2UsIG5pbmV0aWV0aFBhZ2VdID0gY29waWVkUGFnZXM7XG4gICAgICpcbiAgICAgKiBwZGZEb2MuYWRkUGFnZShmb3VydGhQYWdlKVxuICAgICAqIHBkZkRvYy5pbnNlcnRQYWdlKDAsIG5pbmV0aWV0aFBhZ2UpXG4gICAgICogcGRmRG9jLmFkZFBhZ2UoZmlyc3RQYWdlKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBzcmNEb2MgVGhlIGRvY3VtZW50IGZyb20gd2hpY2ggcGFnZXMgc2hvdWxkIGJlIGNvcGllZC5cbiAgICAgKiBAcGFyYW0gaW5kaWNlcyBUaGUgaW5kaWNlcyBvZiB0aGUgcGFnZXMgdGhhdCBzaG91bGQgYmUgY29waWVkLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcGFnZXMgY29waWVkIGludG8gdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuY29weVBhZ2VzID0gZnVuY3Rpb24gKHNyY0RvYywgaW5kaWNlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY29waWVyLCBzcmNQYWdlcywgY29waWVkUGFnZXMsIGlkeCwgbGVuLCBzcmNQYWdlLCBjb3BpZWRQYWdlLCByZWY7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhzcmNEb2MsICdzcmNEb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoaW5kaWNlcywgJ2luZGljZXMnLCBbQXJyYXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHNyY0RvYy5mbHVzaCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29waWVyID0gUERGT2JqZWN0Q29waWVyLmZvcihzcmNEb2MuY29udGV4dCwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhZ2VzID0gc3JjRG9jLmdldFBhZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRQYWdlcyA9IG5ldyBBcnJheShpbmRpY2VzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDAsIGxlbiA9IGluZGljZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGFnZSA9IHNyY1BhZ2VzW2luZGljZXNbaWR4XV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkUGFnZSA9IGNvcGllci5jb3B5KHNyY1BhZ2Uubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gdGhpcy5jb250ZXh0LnJlZ2lzdGVyKGNvcGllZFBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFBhZ2VzW2lkeF0gPSBQREZQYWdlLm9mKGNvcGllZFBhZ2UsIHJlZiwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29waWVkUGFnZXNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhIGNvcHkgb2YgdGhpcyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgc3JjRG9jID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZCguLi4pXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgc3JjRG9jLmNvcHkoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPiAqKk5PVEU6KiogIFRoaXMgbWV0aG9kIHdvbid0IGNvcHkgYWxsIGluZm9ybWF0aW9uIG92ZXIgdG8gdGhlIG5ld1xuICAgICAqID4gZG9jdW1lbnQgKGFjcm9mb3Jtcywgb3V0bGluZXMsIGV0Yy4uLikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIGEgY29weSB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcGRmQ29weSwgY29udGVudFBhZ2VzLCBpZHgsIGxlbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUERGRG9jdW1lbnQuY3JlYXRlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcGRmQ29weS5jb3B5UGFnZXModGhpcywgdGhpcy5nZXRQYWdlSW5kaWNlcygpKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQYWdlcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWR4ID0gMCwgbGVuID0gY29udGVudFBhZ2VzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuYWRkUGFnZShjb250ZW50UGFnZXNbaWR4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRBdXRob3IoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5zZXRBdXRob3IodGhpcy5nZXRBdXRob3IoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRDcmVhdGlvbkRhdGUoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5zZXRDcmVhdGlvbkRhdGUodGhpcy5nZXRDcmVhdGlvbkRhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRDcmVhdG9yKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0Q3JlYXRvcih0aGlzLmdldENyZWF0b3IoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRNb2RpZmljYXRpb25EYXRlKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0TW9kaWZpY2F0aW9uRGF0ZSh0aGlzLmdldE1vZGlmaWNhdGlvbkRhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRQcm9kdWNlcigpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldFByb2R1Y2VyKHRoaXMuZ2V0UHJvZHVjZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTdWJqZWN0KCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0U3ViamVjdCh0aGlzLmdldFN1YmplY3QoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRUaXRsZSgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldFRpdGxlKHRoaXMuZ2V0VGl0bGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LmRlZmF1bHRXb3JkQnJlYWtzID0gdGhpcy5kZWZhdWx0V29yZEJyZWFrcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBwZGZDb3B5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgSmF2YVNjcmlwdCB0byB0aGlzIGRvY3VtZW50LiBUaGUgc3VwcGxpZWQgYHNjcmlwdGAgaXMgZXhlY3V0ZWQgd2hlbiB0aGVcbiAgICAgKiBkb2N1bWVudCBpcyBvcGVuZWQuIFRoZSBgc2NyaXB0YCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHNvbWUgb3BlcmF0aW9uXG4gICAgICogd2hlbiB0aGUgZG9jdW1lbnQgaXMgb3BlbmVkIChlLmcuIGxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUpLCBvciBpdCBjYW4gYmVcbiAgICAgKiB1c2VkIHRvIGRlZmluZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgbGF0ZXIgaW4gYSBKYXZhU2NyaXB0XG4gICAgICogYWN0aW9uLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIFNob3cgXCJIZWxsbyBXb3JsZCFcIiBpbiB0aGUgY29uc29sZSB3aGVuIHRoZSBQREYgaXMgb3BlbmVkXG4gICAgICogcGRmRG9jLmFkZEphdmFTY3JpcHQoXG4gICAgICogICAnbWFpbicsXG4gICAgICogICAnY29uc29sZS5zaG93KCk7IGNvbnNvbGUucHJpbnRsbihcIkhlbGxvIFdvcmxkIVwiKTsnXG4gICAgICogKTtcbiAgICAgKlxuICAgICAqIC8vIERlZmluZSBhIGZ1bmN0aW9uIG5hbWVkIFwiZm9vXCIgdGhhdCBjYW4gYmUgY2FsbGVkIGluIEphdmFTY3JpcHQgQWN0aW9uc1xuICAgICAqIHBkZkRvYy5hZGRKYXZhU2NyaXB0KFxuICAgICAqICAgJ2ZvbycsXG4gICAgICogICAnZnVuY3Rpb24gZm9vKCkgeyByZXR1cm4gXCJmb29cIjsgfSdcbiAgICAgKiApO1xuICAgICAqIGBgYFxuICAgICAqIFNlZSB0aGUgW0phdmFTY3JpcHQgZm9yIEFjcm9iYXQgQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly93d3cuYWRvYmUuY29tL2NvbnRlbnQvZGFtL2Fjb20vZW4vZGV2bmV0L2Fjcm9iYXQvcGRmcy9qc19hcGlfcmVmZXJlbmNlLnBkZilcbiAgICAgKiBmb3IgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc2NyaXB0LiBNdXN0IGJlIHVuaXF1ZSBwZXIgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIHNjcmlwdCBUaGUgSmF2YVNjcmlwdCB0byBleGVjdXRlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5hZGRKYXZhU2NyaXB0ID0gZnVuY3Rpb24gKG5hbWUsIHNjcmlwdCkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICBhc3NlcnRJcyhzY3JpcHQsICdzY3JpcHQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGVtYmVkZGVyID0gSmF2YVNjcmlwdEVtYmVkZGVyLmZvcihzY3JpcHQsIG5hbWUpO1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgdmFyIGphdmFTY3JpcHQgPSBQREZKYXZhU2NyaXB0Lm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICB0aGlzLmphdmFTY3JpcHRzLnB1c2goamF2YVNjcmlwdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgYW4gYXR0YWNobWVudCB0byB0aGlzIGRvY3VtZW50LiBBdHRhY2htZW50cyBhcmUgdmlzaWJsZSBpbiB0aGVcbiAgICAgKiBcIkF0dGFjaG1lbnRzXCIgcGFuZWwgb2YgQWRvYmUgQWNyb2JhdCBhbmQgc29tZSBvdGhlciBQREYgcmVhZGVycy4gQW55XG4gICAgICogdHlwZSBvZiBmaWxlIGNhbiBiZSBhZGRlZCBhcyBhbiBhdHRhY2htZW50LiBUaGlzIGluY2x1ZGVzLCBidXQgaXMgbm90XG4gICAgICogbGltaXRlZCB0bywgYC5wbmdgLCBgLmpwZ2AsIGAucGRmYCwgYC5jc3ZgLCBgLmRvY3hgLCBhbmQgYC54bHN4YCBmaWxlcy5cbiAgICAgKlxuICAgICAqIFRoZSBpbnB1dCBkYXRhIGNhbiBiZSBwcm92aWRlZCBpbiBtdWx0aXBsZSBmb3JtYXRzOlxuICAgICAqXG4gICAgICogfCBUeXBlICAgICAgICAgIHwgQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGBzdHJpbmdgICAgICAgfCBBIGJhc2U2NCBlbmNvZGVkIHN0cmluZyAob3IgZGF0YSBVUkkpIGNvbnRhaW5pbmcgYW4gYXR0YWNobWVudCB8XG4gICAgICogfCBgVWludDhBcnJheWAgIHwgVGhlIHJhdyBieXRlcyBvZiBhbiBhdHRhY2htZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYEFycmF5QnVmZmVyYCB8IFRoZSByYXcgYnl0ZXMgb2YgYW4gYXR0YWNobWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gYXR0YWNobWVudD1zdHJpbmdcbiAgICAgKiBhd2FpdCBwZGZEb2MuYXR0YWNoKCcvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvMndCRC4uLicsICdjYXRfcmlkaW5nX3VuaWNvcm4uanBnJywge1xuICAgICAqICAgbWltZVR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICAgKiAgIGRlc2NyaXB0aW9uOiAnQ29vbCBjYXQgcmlkaW5nIGEgdW5pY29ybiEg8J+mhPCfkIjwn5W277iPJyxcbiAgICAgKiAgIGNyZWF0aW9uRGF0ZTogbmV3IERhdGUoJzIwMTkvMTIvMDEnKSxcbiAgICAgKiAgIG1vZGlmaWNhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDIwLzA0LzE5JyksXG4gICAgICogfSlcbiAgICAgKiBhd2FpdCBwZGZEb2MuYXR0YWNoKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRLi4uJywgJ2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnLCB7XG4gICAgICogICBtaW1lVHlwZTogJ2ltYWdlL2pwZWcnLFxuICAgICAqICAgZGVzY3JpcHRpb246ICdDb29sIGNhdCByaWRpbmcgYSB1bmljb3JuISDwn6aE8J+QiPCflbbvuI8nLFxuICAgICAqICAgY3JlYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAxOS8xMi8wMScpLFxuICAgICAqICAgbW9kaWZpY2F0aW9uRGF0ZTogbmV3IERhdGUoJzIwMjAvMDQvMTknKSxcbiAgICAgKiB9KVxuICAgICAqXG4gICAgICogLy8gYXR0YWNobWVudD1VaW50OEFycmF5XG4gICAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgICAqIGNvbnN0IHVpbnQ4QXJyYXkgPSBmcy5yZWFkRmlsZVN5bmMoJ2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnKVxuICAgICAqIGF3YWl0IHBkZkRvYy5hdHRhY2godWludDhBcnJheSwgJ2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnLCB7XG4gICAgICogICBtaW1lVHlwZTogJ2ltYWdlL2pwZWcnLFxuICAgICAqICAgZGVzY3JpcHRpb246ICdDb29sIGNhdCByaWRpbmcgYSB1bmljb3JuISDwn6aE8J+QiPCflbbvuI8nLFxuICAgICAqICAgY3JlYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAxOS8xMi8wMScpLFxuICAgICAqICAgbW9kaWZpY2F0aW9uRGF0ZTogbmV3IERhdGUoJzIwMjAvMDQvMTknKSxcbiAgICAgKiB9KVxuICAgICAqXG4gICAgICogLy8gYXR0YWNobWVudD1BcnJheUJ1ZmZlclxuICAgICAqIGNvbnN0IHVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy9jYXRfcmlkaW5nX3VuaWNvcm4uanBnJ1xuICAgICAqIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKHJlcyA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBhd2FpdCBwZGZEb2MuYXR0YWNoKGFycmF5QnVmZmVyLCAnY2F0X3JpZGluZ191bmljb3JuLmpwZycsIHtcbiAgICAgKiAgIG1pbWVUeXBlOiAnaW1hZ2UvanBlZycsXG4gICAgICogICBkZXNjcmlwdGlvbjogJ0Nvb2wgY2F0IHJpZGluZyBhIHVuaWNvcm4hIPCfpoTwn5CI8J+Vtu+4jycsXG4gICAgICogICBjcmVhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDE5LzEyLzAxJyksXG4gICAgICogICBtb2RpZmljYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAyMC8wNC8xOScpLFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCBUaGUgaW5wdXQgZGF0YSBjb250YWluaW5nIHRoZSBmaWxlIHRvIGJlIGF0dGFjaGVkLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGF0dGFjaGVkLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gdGhlIGF0dGFjaG1lbnQgaXMgY29tcGxldGUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmF0dGFjaCA9IGZ1bmN0aW9uIChhdHRhY2htZW50LCBuYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBieXRlcywgZW1iZWRkZXIsIHJlZiwgZW1iZWRkZWRGaWxlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGFzc2VydElzKGF0dGFjaG1lbnQsICdhdHRhY2htZW50JywgWydzdHJpbmcnLCBVaW50OEFycmF5LCBBcnJheUJ1ZmZlcl0pO1xuICAgICAgICAgICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5taW1lVHlwZSwgJ21pbWVUeXBlJywgWydzdHJpbmcnXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5kZXNjcmlwdGlvbiwgJ2Rlc2NyaXB0aW9uJywgWydzdHJpbmcnXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jcmVhdGlvbkRhdGUsICdvcHRpb25zLmNyZWF0aW9uRGF0ZScsIFtEYXRlXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5tb2RpZmljYXRpb25EYXRlLCAnb3B0aW9ucy5tb2RpZmljYXRpb25EYXRlJywgW1xuICAgICAgICAgICAgICAgICAgICBEYXRlLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmFmUmVsYXRpb25zaGlwLCAnb3B0aW9ucy5hZlJlbGF0aW9uc2hpcCcsIEFGUmVsYXRpb25zaGlwKTtcbiAgICAgICAgICAgICAgICBieXRlcyA9IHRvVWludDhBcnJheShhdHRhY2htZW50KTtcbiAgICAgICAgICAgICAgICBlbWJlZGRlciA9IEZpbGVFbWJlZGRlci5mb3IoYnl0ZXMsIG5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWRGaWxlID0gUERGRW1iZWRkZWRGaWxlLm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRkZWRGaWxlcy5wdXNoKGVtYmVkZGVkRmlsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgYSBmb250IGludG8gdGhpcyBkb2N1bWVudC4gVGhlIGlucHV0IGRhdGEgY2FuIGJlIHByb3ZpZGVkIGluIG11bHRpcGxlXG4gICAgICogZm9ybWF0czpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICAgIHwgQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGBTdGFuZGFyZEZvbnRzYCB8IE9uZSBvZiB0aGUgc3RhbmRhcmQgMTQgZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYHN0cmluZ2AgICAgICAgIHwgQSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgKG9yIGRhdGEgVVJJKSBjb250YWluaW5nIGEgZm9udCB8XG4gICAgICogfCBgVWludDhBcnJheWAgICAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgZm9udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBBcnJheUJ1ZmZlcmAgICB8IFRoZSByYXcgYnl0ZXMgb2YgYSBmb250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBmb250PVN0YW5kYXJkRm9udHNcbiAgICAgKiBpbXBvcnQgeyBTdGFuZGFyZEZvbnRzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKiBjb25zdCBmb250MSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICpcbiAgICAgKiAvLyBmb250PXN0cmluZ1xuICAgICAqIGNvbnN0IGZvbnQyID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udCgnQUFFQUFBQVZBUUFBQkFCUVJGTkpSeC91cGUuLi4nKVxuICAgICAqIGNvbnN0IGZvbnQzID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udCgnZGF0YTpmb250L29wZW50eXBlO2Jhc2U2NCxBQUVBQUEuLi4nKVxuICAgICAqXG4gICAgICogLy8gZm9udD1VaW50OEFycmF5XG4gICAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgICAqIGNvbnN0IGZvbnQ0ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChmcy5yZWFkRmlsZVN5bmMoJ1VidW50dS1SLnR0ZicpKVxuICAgICAqXG4gICAgICogLy8gZm9udD1BcnJheUJ1ZmZlclxuICAgICAqIGNvbnN0IHVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy91YnVudHUvVWJ1bnR1LVIudHRmJ1xuICAgICAqIGNvbnN0IHVidW50dUJ5dGVzID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKHJlcyA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBjb25zdCBmb250NSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQodWJ1bnR1Qnl0ZXMpXG4gICAgICogYGBgXG4gICAgICogU2VlIGFsc286IFtbcmVnaXN0ZXJGb250a2l0XV1cbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgaW5wdXQgZGF0YSBmb3IgYSBmb250LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBlbWJlZGRpbmcgdGhlIGZvbnQuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCB0aGUgZW1iZWRkZWQgZm9udC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRGb250ID0gZnVuY3Rpb24gKGZvbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBzdWJzZXQsIGN1c3RvbU5hbWUsIGZlYXR1cmVzLCBlbWJlZGRlciwgYnl0ZXMsIGZvbnRraXQsIF9iLCByZWYsIHBkZkZvbnQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9wdGlvbnMuc3Vic2V0LCBzdWJzZXQgPSBfYSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSwgY3VzdG9tTmFtZSA9IG9wdGlvbnMuY3VzdG9tTmFtZSwgZmVhdHVyZXMgPSBvcHRpb25zLmZlYXR1cmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbJ3N0cmluZycsIFVpbnQ4QXJyYXksIEFycmF5QnVmZmVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhzdWJzZXQsICdzdWJzZXQnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU3RhbmRhcmRGb250KGZvbnQpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVyID0gU3RhbmRhcmRGb250RW1iZWRkZXIuZm9yKGZvbnQsIGN1c3RvbU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FuQmVDb252ZXJ0ZWRUb1VpbnQ4QXJyYXkoZm9udCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSB0b1VpbnQ4QXJyYXkoZm9udCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250a2l0ID0gdGhpcy5hc3NlcnRGb250a2l0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNldCkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIuZm9yKGZvbnRraXQsIGJ5dGVzLCBjdXN0b21OYW1lLCBmZWF0dXJlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbNCAvKnlpZWxkKi8sIEN1c3RvbUZvbnRFbWJlZGRlci5mb3IoZm9udGtpdCwgYnl0ZXMsIGN1c3RvbU5hbWUsIGZlYXR1cmVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlciA9IF9iO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjogdGhyb3cgbmV3IFR5cGVFcnJvcignYGZvbnRgIG11c3QgYmUgb25lIG9mIGBTdGFuZGFyZEZvbnRzIHwgc3RyaW5nIHwgVWludDhBcnJheSB8IEFycmF5QnVmZmVyYCcpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSB0aGlzLmNvbnRleHQubmV4dFJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGRmRm9udCA9IFBERkZvbnQub2YocmVmLCB0aGlzLCBlbWJlZGRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvbnRzLnB1c2gocGRmRm9udCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcGRmRm9udF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgYSBzdGFuZGFyZCBmb250IGludG8gdGhpcyBkb2N1bWVudC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFN0YW5kYXJkRm9udHMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqIGNvbnN0IGhlbHZldGljYUZvbnQgPSBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBzdGFuZGFyZCBmb250IHRvIGJlIGVtYmVkZGVkLlxuICAgICAqIEBwYXJhbSBjdXN0b21OYW1lIFRoZSBuYW1lIHRvIGJlIHVzZWQgd2hlbiBlbWJlZGRpbmcgdGhlIGZvbnQuXG4gICAgICogQHJldHVybnMgVGhlIGVtYmVkZGVkIGZvbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkU3RhbmRhcmRGb250ID0gZnVuY3Rpb24gKGZvbnQsIGN1c3RvbU5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgaWYgKCFpc1N0YW5kYXJkRm9udChmb250KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGZvbnRgIG11c3QgYmUgb25lIG9mIHR5cGUgYFN0YW5kYXJkRm9udHNgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVtYmVkZGVyID0gU3RhbmRhcmRGb250RW1iZWRkZXIuZm9yKGZvbnQsIGN1c3RvbU5hbWUpO1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgdmFyIHBkZkZvbnQgPSBQREZGb250Lm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICB0aGlzLmZvbnRzLnB1c2gocGRmRm9udCk7XG4gICAgICAgIHJldHVybiBwZGZGb250O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgYSBKUEVHIGltYWdlIGludG8gdGhpcyBkb2N1bWVudC4gVGhlIGlucHV0IGRhdGEgY2FuIGJlIHByb3ZpZGVkIGluXG4gICAgICogbXVsdGlwbGUgZm9ybWF0czpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICB8IENvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgICAqIHwgYHN0cmluZ2AgICAgICB8IEEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIChvciBkYXRhIFVSSSkgY29udGFpbmluZyBhIEpQRUcgaW1hZ2UgfFxuICAgICAqIHwgYFVpbnQ4QXJyYXlgICB8IFRoZSByYXcgYnl0ZXMgb2YgYSBKUEVHIGltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYEFycmF5QnVmZmVyYCB8IFRoZSByYXcgYnl0ZXMgb2YgYSBKUEVHIGltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBqcGc9c3RyaW5nXG4gICAgICogY29uc3QgaW1hZ2UxID0gYXdhaXQgcGRmRG9jLmVtYmVkSnBnKCcvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvMndCRC4uLicpXG4gICAgICogY29uc3QgaW1hZ2UyID0gYXdhaXQgcGRmRG9jLmVtYmVkSnBnKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRLi4uJylcbiAgICAgKlxuICAgICAqIC8vIGpwZz1VaW50OEFycmF5XG4gICAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgICAqIGNvbnN0IHVpbnQ4QXJyYXkgPSBmcy5yZWFkRmlsZVN5bmMoJ2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnKVxuICAgICAqIGNvbnN0IGltYWdlMyA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZyh1aW50OEFycmF5KVxuICAgICAqXG4gICAgICogLy8ganBnPUFycmF5QnVmZmVyXG4gICAgICogY29uc3QgdXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnXG4gICAgICogY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4ocmVzID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGNvbnN0IGltYWdlNCA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZyhhcnJheUJ1ZmZlcilcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBqcGcgVGhlIGlucHV0IGRhdGEgZm9yIGEgSlBFRyBpbWFnZS5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIHRoZSBlbWJlZGRlZCBpbWFnZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRKcGcgPSBmdW5jdGlvbiAoanBnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBieXRlcywgZW1iZWRkZXIsIHJlZiwgcGRmSW1hZ2U7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhqcGcsICdqcGcnLCBbJ3N0cmluZycsIFVpbnQ4QXJyYXksIEFycmF5QnVmZmVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IHRvVWludDhBcnJheShqcGcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgSnBlZ0VtYmVkZGVyLmZvcihieXRlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlciA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZGZJbWFnZSA9IFBERkltYWdlLm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWFnZXMucHVzaChwZGZJbWFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcGRmSW1hZ2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIGEgUE5HIGltYWdlIGludG8gdGhpcyBkb2N1bWVudC4gVGhlIGlucHV0IGRhdGEgY2FuIGJlIHByb3ZpZGVkIGluXG4gICAgICogbXVsdGlwbGUgZm9ybWF0czpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICB8IENvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGBzdHJpbmdgICAgICAgfCBBIGJhc2U2NCBlbmNvZGVkIHN0cmluZyAob3IgZGF0YSBVUkkpIGNvbnRhaW5pbmcgYSBQTkcgaW1hZ2UgfFxuICAgICAqIHwgYFVpbnQ4QXJyYXlgICB8IFRoZSByYXcgYnl0ZXMgb2YgYSBQTkcgaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgQXJyYXlCdWZmZXJgIHwgVGhlIHJhdyBieXRlcyBvZiBhIFBORyBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcG5nPXN0cmluZ1xuICAgICAqIGNvbnN0IGltYWdlMSA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZygnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWxnQUFBRjMuLi4nKVxuICAgICAqIGNvbnN0IGltYWdlMiA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZygnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2cuLi4nKVxuICAgICAqXG4gICAgICogLy8gcG5nPVVpbnQ4QXJyYXlcbiAgICAgKiBpbXBvcnQgZnMgZnJvbSAnZnMnXG4gICAgICogY29uc3QgdWludDhBcnJheSA9IGZzLnJlYWRGaWxlU3luYygnc21hbGxfbWFyaW8ucG5nJylcbiAgICAgKiBjb25zdCBpbWFnZTMgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcodWludDhBcnJheSlcbiAgICAgKlxuICAgICAqIC8vIHBuZz1BcnJheUJ1ZmZlclxuICAgICAqIGNvbnN0IHVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy9zbWFsbF9tYXJpby5wbmcnXG4gICAgICogY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4ocmVzID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGNvbnN0IGltYWdlNCA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZyhhcnJheUJ1ZmZlcilcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbmcgVGhlIGlucHV0IGRhdGEgZm9yIGEgUE5HIGltYWdlLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggdGhlIGVtYmVkZGVkIGltYWdlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZFBuZyA9IGZ1bmN0aW9uIChwbmcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGJ5dGVzLCBlbWJlZGRlciwgcmVmLCBwZGZJbWFnZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHBuZywgJ3BuZycsIFsnc3RyaW5nJywgVWludDhBcnJheSwgQXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gdG9VaW50OEFycmF5KHBuZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQbmdFbWJlZGRlci5mb3IoYnl0ZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZXIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSB0aGlzLmNvbnRleHQubmV4dFJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGRmSW1hZ2UgPSBQREZJbWFnZS5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VzLnB1c2gocGRmSW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHBkZkltYWdlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbWJlZCBvbmUgb3IgbW9yZSBQREYgcGFnZXMgaW50byB0aGlzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqXG4gICAgICogY29uc3Qgc291cmNlUGRmVXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL3dpdGhfbGFyZ2VfcGFnZV9jb3VudC5wZGYnXG4gICAgICogY29uc3Qgc291cmNlUGRmID0gYXdhaXQgZmV0Y2goc291cmNlUGRmVXJsKS50aGVuKChyZXMpID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqXG4gICAgICogLy8gRW1iZWQgcGFnZSA3NCBvZiBgc291cmNlUGRmYCBpbnRvIGBwZGZEb2NgXG4gICAgICogY29uc3QgW2VtYmVkZGVkUGFnZV0gPSBhd2FpdCBwZGZEb2MuZW1iZWRQZGYoc291cmNlUGRmLCBbNzNdKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2VlIFtbUERGRG9jdW1lbnQubG9hZF1dIGZvciBleGFtcGxlcyBvZiB0aGUgYWxsb3dlZCBpbnB1dCBkYXRhIGZvcm1hdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGRmIFRoZSBpbnB1dCBkYXRhIGNvbnRhaW5pbmcgYSBQREYgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgb2YgdGhlIHBhZ2VzIHRoYXQgc2hvdWxkIGJlIGVtYmVkZGVkLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIGVtYmVkZGVkIHBhZ2VzLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZFBkZiA9IGZ1bmN0aW9uIChwZGYsIGluZGljZXMpIHtcbiAgICAgICAgaWYgKGluZGljZXMgPT09IHZvaWQgMCkgeyBpbmRpY2VzID0gWzBdOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzcmNEb2MsIF9hLCBzcmNQYWdlcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHBkZiwgJ3BkZicsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5QnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J10sXG4gICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGluZGljZXMsICdpbmRpY2VzJywgW0FycmF5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwZGYgaW5zdGFuY2VvZiBQREZEb2N1bWVudCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBwZGY7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCBQREZEb2N1bWVudC5sb2FkKHBkZildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3JjRG9jID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmNQYWdlcyA9IHBsdWNrSW5kaWNlcyhzcmNEb2MuZ2V0UGFnZXMoKSwgaW5kaWNlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5lbWJlZFBhZ2VzKHNyY1BhZ2VzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgYSBzaW5nbGUgUERGIHBhZ2UgaW50byB0aGlzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqXG4gICAgICogY29uc3Qgc291cmNlUGRmVXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL3dpdGhfbGFyZ2VfcGFnZV9jb3VudC5wZGYnXG4gICAgICogY29uc3Qgc291cmNlQnVmZmVyID0gYXdhaXQgZmV0Y2goc291cmNlUGRmVXJsKS50aGVuKChyZXMpID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGNvbnN0IHNvdXJjZVBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoc291cmNlQnVmZmVyKVxuICAgICAqIGNvbnN0IHNvdXJjZVBkZlBhZ2UgPSBzb3VyY2VQZGZEb2MuZ2V0UGFnZXMoKVs3M11cbiAgICAgKlxuICAgICAqIGNvbnN0IGVtYmVkZGVkUGFnZSA9IGF3YWl0IHBkZkRvYy5lbWJlZFBhZ2UoXG4gICAgICogICBzb3VyY2VQZGZQYWdlLFxuICAgICAqXG4gICAgICogICAvLyBDbGlwIGEgc2VjdGlvbiBvZiB0aGUgc291cmNlIHBhZ2Ugc28gdGhhdCB3ZSBvbmx5IGVtYmVkIHBhcnQgb2YgaXRcbiAgICAgKiAgIHsgbGVmdDogMTAwLCByaWdodDogNDUwLCBib3R0b206IDMzMCwgdG9wOiA1NzAgfSxcbiAgICAgKlxuICAgICAqICAgLy8gVHJhbnNsYXRlIGFsbCBkcmF3aW5ncyBvZiB0aGUgZW1iZWRkZWQgcGFnZSBieSAoMTAsIDIwMCkgdW5pdHNcbiAgICAgKiAgIFsxLCAwLCAwLCAxLCAxMCwgMjAwXSxcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byBiZSBlbWJlZGRlZC5cbiAgICAgKiBAcGFyYW0gYm91bmRpbmdCb3hcbiAgICAgKiBPcHRpb25hbGx5LCBhbiBhcmVhIG9mIHRoZSBzb3VyY2UgcGFnZSB0aGF0IHNob3VsZCBiZSBlbWJlZGRlZFxuICAgICAqIChkZWZhdWx0cyB0byBlbnRpcmUgcGFnZSkuXG4gICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uTWF0cml4XG4gICAgICogT3B0aW9uYWxseSwgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdGhhdCBpcyBhbHdheXMgYXBwbGllZCB0byB0aGUgZW1iZWRkZWRcbiAgICAgKiBwYWdlIGFueXdoZXJlIGl0IGlzIGRyYXduLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggdGhlIGVtYmVkZGVkIHBkZiBwYWdlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZFBhZ2UgPSBmdW5jdGlvbiAocGFnZSwgYm91bmRpbmdCb3gsIHRyYW5zZm9ybWF0aW9uTWF0cml4KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlbWJlZGRlZFBhZ2U7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZFBhZ2VzKFtwYWdlXSwgW2JvdW5kaW5nQm94XSwgW3RyYW5zZm9ybWF0aW9uTWF0cml4XSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZFBhZ2UgPSAoX2Euc2VudCgpKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBlbWJlZGRlZFBhZ2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIG9uZSBvciBtb3JlIFBERiBwYWdlcyBpbnRvIHRoaXMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBzb3VyY2VQZGZVcmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvd2l0aF9sYXJnZV9wYWdlX2NvdW50LnBkZidcbiAgICAgKiBjb25zdCBzb3VyY2VCdWZmZXIgPSBhd2FpdCBmZXRjaChzb3VyY2VQZGZVcmwpLnRoZW4oKHJlcykgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICogY29uc3Qgc291cmNlUGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZChzb3VyY2VCdWZmZXIpXG4gICAgICpcbiAgICAgKiBjb25zdCBwYWdlMSA9IHNvdXJjZVBkZkRvYy5nZXRQYWdlcygpWzBdXG4gICAgICogY29uc3QgcGFnZTIgPSBzb3VyY2VQZGZEb2MuZ2V0UGFnZXMoKVs1Ml1cbiAgICAgKiBjb25zdCBwYWdlMyA9IHNvdXJjZVBkZkRvYy5nZXRQYWdlcygpWzczXVxuICAgICAqXG4gICAgICogY29uc3QgZW1iZWRkZWRQYWdlcyA9IGF3YWl0IHBkZkRvYy5lbWJlZFBhZ2VzKFtwYWdlMSwgcGFnZTIsIHBhZ2UzXSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWdlXG4gICAgICogVGhlIHBhZ2VzIHRvIGJlIGVtYmVkZGVkICh0aGV5IG11c3QgYWxsIHNoYXJlIHRoZSBzYW1lIGNvbnRleHQpLlxuICAgICAqIEBwYXJhbSBib3VuZGluZ0JveGVzXG4gICAgICogT3B0aW9uYWxseSwgYW4gYXJyYXkgb2YgY2xpcHBpbmcgYm91bmRhcmllcyAtIG9uZSBmb3IgZWFjaCBwYWdlXG4gICAgICogKGRlZmF1bHRzIHRvIGVudGlyZXR5IG9mIGVhY2ggcGFnZSkuXG4gICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uTWF0cmljZXNcbiAgICAgKiBPcHRpb25hbGx5LCBhbiBhcnJheSBvZiB0cmFuc2Zvcm1hdGlvbiBtYXRyaWNlcyAtIG9uZSBmb3IgZWFjaCBwYWdlXG4gICAgICogKGVhY2ggcGFnZSdzIHRyYW5zZm9ybWF0aW9uIHdpbGwgYXBwbHkgYW55d2hlcmUgaXQgaXMgZHJhd24pLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIGVtYmVkZGVkIHBkZiBwYWdlcy5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRQYWdlcyA9IGZ1bmN0aW9uIChwYWdlcywgYm91bmRpbmdCb3hlcywgdHJhbnNmb3JtYXRpb25NYXRyaWNlcykge1xuICAgICAgICBpZiAoYm91bmRpbmdCb3hlcyA9PT0gdm9pZCAwKSB7IGJvdW5kaW5nQm94ZXMgPSBbXTsgfVxuICAgICAgICBpZiAodHJhbnNmb3JtYXRpb25NYXRyaWNlcyA9PT0gdm9pZCAwKSB7IHRyYW5zZm9ybWF0aW9uTWF0cmljZXMgPSBbXTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaWR4LCBsZW4sIGN1cnJQYWdlLCBuZXh0UGFnZSwgY29udGV4dCwgbWF5YmVDb3B5UGFnZSwgZW1iZWRkZWRQYWdlcywgaWR4LCBsZW4sIHBhZ2UsIGJveCwgbWF0cml4LCBlbWJlZGRlciwgcmVmO1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgW11dO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzZXJ0IGFsbCBwYWdlcyBoYXZlIHRoZSBzYW1lIGNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWR4ID0gMCwgbGVuID0gcGFnZXMubGVuZ3RoIC0gMTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJQYWdlID0gcGFnZXNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UGFnZSA9IHBhZ2VzW2lkeCArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyUGFnZS5ub2RlLmNvbnRleHQgIT09IG5leHRQYWdlLm5vZGUuY29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gcGFnZXNbMF0ubm9kZS5jb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVDb3B5UGFnZSA9IGNvbnRleHQgPT09IHRoaXMuY29udGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKHApIHsgcmV0dXJuIHA7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBERk9iamVjdENvcGllci5mb3IoY29udGV4dCwgdGhpcy5jb250ZXh0KS5jb3B5O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZWRQYWdlcyA9IG5ldyBBcnJheShwYWdlcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gMCwgbGVuID0gcGFnZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpZHggPCBsZW4pKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBtYXliZUNvcHlQYWdlKHBhZ2VzW2lkeF0ubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3ggPSBib3VuZGluZ0JveGVzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXggPSB0cmFuc2Zvcm1hdGlvbk1hdHJpY2VzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQREZQYWdlRW1iZWRkZXIuZm9yKHBhZ2UsIGJveCwgbWF0cml4KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVyID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkUGFnZXNbaWR4XSA9IFBERkVtYmVkZGVkUGFnZS5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgKF9hID0gdGhpcy5lbWJlZGRlZFBhZ2VzKS5wdXNoLmFwcGx5KF9hLCBlbWJlZGRlZFBhZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBlbWJlZGRlZFBhZ2VzXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3Ugc2hvdWxkbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlIFtbc2F2ZV1dXG4gICAgICogPiBhbmQgW1tzYXZlQXNCYXNlNjRdXSBtZXRob2RzIHdpbGwgYXV0b21hdGljYWxseSBlbnN1cmUgdGhhdCBhbGwgZW1iZWRkZWRcbiAgICAgKiA+IGFzc2V0cyBhcmUgZmx1c2hlZCBiZWZvcmUgc2VyaWFsaXppbmcgdGhlIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogRmx1c2ggYWxsIGVtYmVkZGVkIGZvbnRzLCBQREYgcGFnZXMsIGFuZCBpbWFnZXMgdG8gdGhpcyBkb2N1bWVudCdzXG4gICAgICogW1tjb250ZXh0XV0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aGVuIHRoZSBmbHVzaCBpcyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEFsbCh0aGlzLmZvbnRzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRBbGwodGhpcy5pbWFnZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEFsbCh0aGlzLmVtYmVkZGVkUGFnZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEFsbCh0aGlzLmVtYmVkZGVkRmlsZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEFsbCh0aGlzLmphdmFTY3JpcHRzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgdGhpcyBkb2N1bWVudCB0byBhbiBhcnJheSBvZiBieXRlcyBtYWtpbmcgdXAgYSBQREYgZmlsZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBkZkJ5dGVzID0gYXdhaXQgcGRmRG9jLnNhdmUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB5b3UgY2FuIGRvIHdpdGggdGhlIHNlcmlhbGl6ZWQgZG9jdW1lbnQsXG4gICAgICogZGVwZW5kaW5nIG9uIHRoZSBKYXZhU2NyaXB0IGVudmlyb25tZW50IHlvdSdyZSBydW5uaW5nIGluOlxuICAgICAqICogV3JpdGUgaXQgdG8gYSBmaWxlIGluIE5vZGUgb3IgUmVhY3QgTmF0aXZlXG4gICAgICogKiBEb3dubG9hZCBpdCBhcyBhIEJsb2IgaW4gdGhlIGJyb3dzZXJcbiAgICAgKiAqIFJlbmRlciBpdCBpbiBhbiBgaWZyYW1lYFxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIHNhdmluZyB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCB0aGUgYnl0ZXMgb2YgdGhlIHNlcmlhbGl6ZWQgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHVzZU9iamVjdFN0cmVhbXMsIF9iLCBhZGREZWZhdWx0UGFnZSwgX2MsIG9iamVjdHNQZXJUaWNrLCBfZCwgdXBkYXRlRmllbGRBcHBlYXJhbmNlcywgZm9ybSwgV3JpdGVyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBvcHRpb25zLnVzZU9iamVjdFN0cmVhbXMsIHVzZU9iamVjdFN0cmVhbXMgPSBfYSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hLCBfYiA9IG9wdGlvbnMuYWRkRGVmYXVsdFBhZ2UsIGFkZERlZmF1bHRQYWdlID0gX2IgPT09IHZvaWQgMCA/IHRydWUgOiBfYiwgX2MgPSBvcHRpb25zLm9iamVjdHNQZXJUaWNrLCBvYmplY3RzUGVyVGljayA9IF9jID09PSB2b2lkIDAgPyA1MCA6IF9jLCBfZCA9IG9wdGlvbnMudXBkYXRlRmllbGRBcHBlYXJhbmNlcywgdXBkYXRlRmllbGRBcHBlYXJhbmNlcyA9IF9kID09PSB2b2lkIDAgPyB0cnVlIDogX2Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyh1c2VPYmplY3RTdHJlYW1zLCAndXNlT2JqZWN0U3RyZWFtcycsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGFkZERlZmF1bHRQYWdlLCAnYWRkRGVmYXVsdFBhZ2UnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhvYmplY3RzUGVyVGljaywgJ29iamVjdHNQZXJUaWNrJywgWydudW1iZXInXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyh1cGRhdGVGaWVsZEFwcGVhcmFuY2VzLCAndXBkYXRlRmllbGRBcHBlYXJhbmNlcycsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGREZWZhdWx0UGFnZSAmJiB0aGlzLmdldFBhZ2VDb3VudCgpID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtID0gdGhpcy5mb3JtQ2FjaGUuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmZsdXNoKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBXcml0ZXIgPSB1c2VPYmplY3RTdHJlYW1zID8gUERGU3RyZWFtV3JpdGVyIDogUERGV3JpdGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFdyaXRlci5mb3JDb250ZXh0KHRoaXMuY29udGV4dCwgb2JqZWN0c1BlclRpY2spLnNlcmlhbGl6ZVRvQnVmZmVyKCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSB0aGlzIGRvY3VtZW50IHRvIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIG9yIGRhdGEgVVJJIG1ha2luZyB1cCBhXG4gICAgICogUERGIGZpbGUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYmFzZTY0U3RyaW5nID0gYXdhaXQgcGRmRG9jLnNhdmVBc0Jhc2U2NCgpXG4gICAgICogYmFzZTY0U3RyaW5nIC8vID0+ICdKVkJFUmkweExqY0tKWUdCZ1lFS0MuLi4nXG4gICAgICpcbiAgICAgKiBjb25zdCBiYXNlNjREYXRhVXJpID0gYXdhaXQgcGRmRG9jLnNhdmVBc0Jhc2U2NCh7IGRhdGFVcmk6IHRydWUgfSlcbiAgICAgKiBiYXNlNjREYXRhVXJpIC8vID0+ICdkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsSlZCRVJpMHhMamNLSllHQmdZRUtDLi4uJ1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIHNhdmluZyB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBvciBkYXRhIFVSSSBvZiB0aGVcbiAgICAgKiAgICAgICAgICBzZXJpYWxpemVkIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zYXZlQXNCYXNlNjQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIGRhdGFVcmksIG90aGVyT3B0aW9ucywgYnl0ZXMsIGJhc2U2NDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gb3B0aW9ucy5kYXRhVXJpLCBkYXRhVXJpID0gX2EgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EsIG90aGVyT3B0aW9ucyA9IF9fcmVzdChvcHRpb25zLCBbXCJkYXRhVXJpXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGRhdGFVcmksICdkYXRhVXJpJywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zYXZlKG90aGVyT3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NCA9IGVuY29kZVRvQmFzZTY0KGJ5dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhVXJpID8gXCJkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsXCIgKyBiYXNlNjQgOiBiYXNlNjRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5maW5kUGFnZUZvckFubm90YXRpb25SZWYgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHZhciBwYWdlcyA9IHRoaXMuZ2V0UGFnZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gcGFnZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgcGFnZSA9IHBhZ2VzW2lkeF07XG4gICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSBwYWdlLm5vZGUuQW5ub3RzKCk7XG4gICAgICAgICAgICBpZiAoKGFubm90YXRpb25zID09PSBudWxsIHx8IGFubm90YXRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhbm5vdGF0aW9ucy5pbmRleE9mKHJlZikpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkQWxsID0gZnVuY3Rpb24gKGVtYmVkZGFibGVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpZHgsIGxlbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IGVtYmVkZGFibGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBlbWJlZGRhYmxlc1tpZHhdLmVtYmVkKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS51cGRhdGVJbmZvRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBkZkxpYiA9IFwicGRmLWxpYiAoaHR0cHM6Ly9naXRodWIuY29tL0hvcGRpbmcvcGRmLWxpYilcIjtcbiAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBpbmZvID0gdGhpcy5nZXRJbmZvRGljdCgpO1xuICAgICAgICB0aGlzLnNldFByb2R1Y2VyKHBkZkxpYik7XG4gICAgICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShub3cpO1xuICAgICAgICBpZiAoIWluZm8uZ2V0KFBERk5hbWUub2YoJ0NyZWF0b3InKSkpXG4gICAgICAgICAgICB0aGlzLnNldENyZWF0b3IocGRmTGliKTtcbiAgICAgICAgaWYgKCFpbmZvLmdldChQREZOYW1lLm9mKCdDcmVhdGlvbkRhdGUnKSkpXG4gICAgICAgICAgICB0aGlzLnNldENyZWF0aW9uRGF0ZShub3cpO1xuICAgIH07XG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldEluZm9EaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZXhpc3RpbmdJbmZvID0gdGhpcy5jb250ZXh0Lmxvb2t1cCh0aGlzLmNvbnRleHQudHJhaWxlckluZm8uSW5mbyk7XG4gICAgICAgIGlmIChleGlzdGluZ0luZm8gaW5zdGFuY2VvZiBQREZEaWN0KVxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5mbztcbiAgICAgICAgdmFyIG5ld0luZm8gPSB0aGlzLmNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLkluZm8gPSB0aGlzLmNvbnRleHQucmVnaXN0ZXIobmV3SW5mbyk7XG4gICAgICAgIHJldHVybiBuZXdJbmZvO1xuICAgIH07XG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmFzc2VydEZvbnRraXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5mb250a2l0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9udGtpdDtcbiAgICB9O1xuICAgIHJldHVybiBQREZEb2N1bWVudDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZEb2N1bWVudDtcbi8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBvbmx5LWFycm93LWZ1bmN0aW9ucyAqL1xuZnVuY3Rpb24gYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcocGRmT2JqZWN0KSB7XG4gICAgaWYgKCEocGRmT2JqZWN0IGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSAmJlxuICAgICAgICAhKHBkZk9iamVjdCBpbnN0YW5jZW9mIFBERlN0cmluZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IoW1BERkhleFN0cmluZywgUERGU3RyaW5nXSwgcGRmT2JqZWN0KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZEb2N1bWVudC5qcy5tYXAiLCJleHBvcnQgdmFyIFBhcnNlU3BlZWRzO1xuKGZ1bmN0aW9uIChQYXJzZVNwZWVkcykge1xuICAgIFBhcnNlU3BlZWRzW1BhcnNlU3BlZWRzW1wiRmFzdGVzdFwiXSA9IEluZmluaXR5XSA9IFwiRmFzdGVzdFwiO1xuICAgIFBhcnNlU3BlZWRzW1BhcnNlU3BlZWRzW1wiRmFzdFwiXSA9IDE1MDBdID0gXCJGYXN0XCI7XG4gICAgUGFyc2VTcGVlZHNbUGFyc2VTcGVlZHNbXCJNZWRpdW1cIl0gPSA1MDBdID0gXCJNZWRpdW1cIjtcbiAgICBQYXJzZVNwZWVkc1tQYXJzZVNwZWVkc1tcIlNsb3dcIl0gPSAxMDBdID0gXCJTbG93XCI7XG59KShQYXJzZVNwZWVkcyB8fCAoUGFyc2VTcGVlZHMgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRG9jdW1lbnRPcHRpb25zLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFBERk5hbWUsIFBERkFycmF5LCBQREZEaWN0LCBQREZIZXhTdHJpbmcgfSBmcm9tIFwiLi4vY29yZVwiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgZmlsZSB0aGF0IGhhcyBiZWVuIGVtYmVkZGVkIGluIGEgW1tQREZEb2N1bWVudF1dLlxuICovXG52YXIgUERGRW1iZWRkZWRGaWxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkVtYmVkZGVkRmlsZShyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgdGhpcy5hbHJlYWR5RW1iZWRkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmVtYmVkZGVyID0gZW1iZWRkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZVxuICAgICAqID4gW1tQREZEb2N1bWVudC5zYXZlXV0gYW5kIFtbUERGRG9jdW1lbnQuc2F2ZUFzQmFzZTY0XV0gbWV0aG9kcyB3aWxsXG4gICAgICogPiBhdXRvbWF0aWNhbGx5IGVuc3VyZSBhbGwgZW1iZWRkYWJsZSBmaWxlcyBnZXQgZW1iZWRkZWQuXG4gICAgICpcbiAgICAgKiBFbWJlZCB0aGlzIGVtYmVkZGFibGUgZmlsZSBpbiBpdHMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aGVuIHRoZSBlbWJlZGRpbmcgaXMgY29tcGxldGUuXG4gICAgICovXG4gICAgUERGRW1iZWRkZWRGaWxlLnByb3RvdHlwZS5lbWJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlZiwgTmFtZXMsIEVtYmVkZGVkRmlsZXMsIEVGTmFtZXMsIEFGO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5hbHJlYWR5RW1iZWRkZWQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZGRlci5lbWJlZEludG9Db250ZXh0KHRoaXMuZG9jLmNvbnRleHQsIHRoaXMucmVmKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb2MuY2F0YWxvZy5oYXMoUERGTmFtZS5vZignTmFtZXMnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvYy5jYXRhbG9nLnNldChQREZOYW1lLm9mKCdOYW1lcycpLCB0aGlzLmRvYy5jb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXMgPSB0aGlzLmRvYy5jYXRhbG9nLmxvb2t1cChQREZOYW1lLm9mKCdOYW1lcycpLCBQREZEaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTmFtZXMuaGFzKFBERk5hbWUub2YoJ0VtYmVkZGVkRmlsZXMnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lcy5zZXQoUERGTmFtZS5vZignRW1iZWRkZWRGaWxlcycpLCB0aGlzLmRvYy5jb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRkZWRGaWxlcyA9IE5hbWVzLmxvb2t1cChQREZOYW1lLm9mKCdFbWJlZGRlZEZpbGVzJyksIFBERkRpY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFFbWJlZGRlZEZpbGVzLmhhcyhQREZOYW1lLm9mKCdOYW1lcycpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkZGVkRmlsZXMuc2V0KFBERk5hbWUub2YoJ05hbWVzJyksIHRoaXMuZG9jLmNvbnRleHQub2JqKFtdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBFRk5hbWVzID0gRW1iZWRkZWRGaWxlcy5sb29rdXAoUERGTmFtZS5vZignTmFtZXMnKSwgUERGQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRUZOYW1lcy5wdXNoKFBERkhleFN0cmluZy5mcm9tVGV4dCh0aGlzLmVtYmVkZGVyLmZpbGVOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFRk5hbWVzLnB1c2gocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogVGhlIEFGLVRhZyBpcyBuZWVkZWQgdG8gYWNoaWV2ZSBQREYtQTMgY29tcGxpYW5jZSBmb3IgZW1iZWRkZWQgZmlsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGRvY3VtZW50IG91dGxpbmVzIHRoZSB1c2VzIGNhc2VzIG9mIHRoZSBhc3NvY2lhdGVkIGZpbGVzIChBRikgdGFnLlxuICAgICAgICAgICAgICAgICAgICAgICAgICogU2VlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICogaHR0cHM6Ly93d3cucGRmYS5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMTgvMTAvUERGMjBfQU4wMDItQUYucGRmXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb2MuY2F0YWxvZy5oYXMoUERGTmFtZS5vZignQUYnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvYy5jYXRhbG9nLnNldChQREZOYW1lLm9mKCdBRicpLCB0aGlzLmRvYy5jb250ZXh0Lm9iaihbXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQUYgPSB0aGlzLmRvYy5jYXRhbG9nLmxvb2t1cChQREZOYW1lLm9mKCdBRicpLCBQREZBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBBRi5wdXNoKHJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFscmVhZHlFbWJlZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5hdHRhY2hdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlXG4gICAgICogaW5zdGFuY2VzIG9mIFtbUERGRW1iZWRkZWRGaWxlXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkVtYmVkZGVkRmlsZV1dIGZyb20gYW4gZXhpc3RpbmcgcmVmIGFuZCBlbWJlZGRlclxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBmaWxlLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBmaWxlIHdpbGwgYmVsb25nLlxuICAgICAqIEBwYXJhbSBlbWJlZGRlciBUaGUgZW1iZWRkZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZW1iZWQgdGhlIGZpbGUuXG4gICAgICovXG4gICAgUERGRW1iZWRkZWRGaWxlLm9mID0gZnVuY3Rpb24gKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkVtYmVkZGVkRmlsZShyZWYsIGRvYywgZW1iZWRkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkVtYmVkZGVkRmlsZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZFbWJlZGRlZEZpbGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZFbWJlZGRlZEZpbGUuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuL1BERkRvY3VtZW50XCI7XG5pbXBvcnQgeyBQREZQYWdlRW1iZWRkZXIsIFBERlJlZiB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcyB9IGZyb20gXCIuLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgUERGIHBhZ2UgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqL1xudmFyIFBERkVtYmVkZGVkUGFnZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZFbWJlZGRlZFBhZ2UocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHRoaXMuYWxyZWFkeUVtYmVkZGVkID0gZmFsc2U7XG4gICAgICAgIGFzc2VydElzKHJlZiwgJ3JlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZW1iZWRkZXIsICdlbWJlZGRlcicsIFtbUERGUGFnZUVtYmVkZGVyLCAnUERGUGFnZUVtYmVkZGVyJ11dKTtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLndpZHRoID0gZW1iZWRkZXIud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gZW1iZWRkZXIuaGVpZ2h0O1xuICAgICAgICB0aGlzLmVtYmVkZGVyID0gZW1iZWRkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhpcyBwYWdlIGFmdGVyIGJlaW5nIHNjYWxlZCBieSB0aGVcbiAgICAgKiBnaXZlbiBgZmFjdG9yYC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBlbWJlZGRlZFBhZ2Uud2lkdGggIC8vID0+IDUwMFxuICAgICAqIGVtYmVkZGVkUGFnZS5oZWlnaHQgLy8gPT4gMjUwXG4gICAgICpcbiAgICAgKiBjb25zdCBzY2FsZWQgPSBlbWJlZGRlZFBhZ2Uuc2NhbGUoMC41KVxuICAgICAqIHNjYWxlZC53aWR0aCAgLy8gPT4gMjUwXG4gICAgICogc2NhbGVkLmhlaWdodCAvLyA9PiAxMjVcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBvZnRlbiB1c2VmdWwgYmVmb3JlIGRyYXdpbmcgYSBwYWdlIHdpdGhcbiAgICAgKiBbW1BERlBhZ2UuZHJhd1BhZ2VdXSB0byBjb21wdXRlIHRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSBmYWN0b3IgVGhlIGZhY3RvciBieSB3aGljaCB0aGlzIHBhZ2Ugc2hvdWxkIGJlIHNjYWxlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFnZSBhZnRlciBiZWluZyBzY2FsZWQuXG4gICAgICovXG4gICAgUERGRW1iZWRkZWRQYWdlLnByb3RvdHlwZS5zY2FsZSA9IGZ1bmN0aW9uIChmYWN0b3IpIHtcbiAgICAgICAgYXNzZXJ0SXMoZmFjdG9yLCAnZmFjdG9yJywgWydudW1iZXInXSk7XG4gICAgICAgIHJldHVybiB7IHdpZHRoOiB0aGlzLndpZHRoICogZmFjdG9yLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0ICogZmFjdG9yIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZW1iZWRkZWRQYWdlLnNpemUoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkUGFnZS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGUoMSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBUaGVcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuc2F2ZV1dIGFuZCBbW1BERkRvY3VtZW50LnNhdmVBc0Jhc2U2NF1dIG1ldGhvZHMgd2lsbFxuICAgICAqID4gYXV0b21hdGljYWxseSBlbnN1cmUgYWxsIGVtYmVkZGFibGUgcGFnZXMgZ2V0IGVtYmVkZGVkLlxuICAgICAqXG4gICAgICogRW1iZWQgdGhpcyBlbWJlZGRhYmxlIHBhZ2UgaW4gaXRzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZW1iZWRkaW5nIGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkUGFnZS5wcm90b3R5cGUuZW1iZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMuYWxyZWFkeUVtYmVkZGVkKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRkZXIuZW1iZWRJbnRvQ29udGV4dCh0aGlzLmRvYy5jb250ZXh0LCB0aGlzLnJlZildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFscmVhZHlFbWJlZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5lbWJlZFBkZl1dIGFuZFxuICAgICAqID4gW1tQREZEb2N1bWVudC5lbWJlZFBhZ2VdXSBtZXRob2RzLCB3aGljaCB3aWxsIGNyZWF0ZSBpbnN0YW5jZXMgb2ZcbiAgICAgKiA+IFtbUERGRW1iZWRkZWRQYWdlXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkVtYmVkZGVkUGFnZV1dIGZyb20gYW4gZXhpc3RpbmcgcmVmIGFuZCBlbWJlZGRlclxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBlbWJlZGRlZCBwYWdlLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBlbWJlZGRlZCBwYWdlIHdpbGwgYmVsb25nLlxuICAgICAqIEBwYXJhbSBlbWJlZGRlciBUaGUgZW1iZWRkZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZW1iZWQgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGRW1iZWRkZWRQYWdlLm9mID0gZnVuY3Rpb24gKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkVtYmVkZGVkUGFnZShyZWYsIGRvYywgZW1iZWRkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkVtYmVkZGVkUGFnZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZFbWJlZGRlZFBhZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZFbWJlZGRlZFBhZ2UuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuL1BERkRvY3VtZW50XCI7XG5pbXBvcnQgeyBDdXN0b21Gb250RW1iZWRkZXIsIFBERlJlZiwgU3RhbmRhcmRGb250RW1iZWRkZXIsIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRPclVuZGVmaW5lZCB9IGZyb20gXCIuLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgZm9udCB0aGF0IGhhcyBiZWVuIGVtYmVkZGVkIGluIGEgW1tQREZEb2N1bWVudF1dLlxuICovXG52YXIgUERGRm9udCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZGb250KHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICB0aGlzLm1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgYXNzZXJ0SXMocmVmLCAncmVmJywgW1tQREZSZWYsICdQREZSZWYnXV0pO1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICBhc3NlcnRJcyhlbWJlZGRlciwgJ2VtYmVkZGVyJywgW1xuICAgICAgICAgICAgW0N1c3RvbUZvbnRFbWJlZGRlciwgJ0N1c3RvbUZvbnRFbWJlZGRlciddLFxuICAgICAgICAgICAgW1N0YW5kYXJkRm9udEVtYmVkZGVyLCAnU3RhbmRhcmRGb250RW1iZWRkZXInXSxcbiAgICAgICAgXSk7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5uYW1lID0gZW1iZWRkZXIuZm9udE5hbWU7XG4gICAgICAgIHRoaXMuZW1iZWRkZXIgPSBlbWJlZGRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlXG4gICAgICogPiBbW1BERlBhZ2UuZHJhd1RleHRdXSBtZXRob2Qgd2lsbCBhdXRvbWF0aWNhbGx5IGVuY29kZSB0aGUgdGV4dCBpdCBpc1xuICAgICAqID4gZ2l2ZW4uXG4gICAgICpcbiAgICAgKiBFbmNvZGVzIGEgc3RyaW5nIG9mIHRleHQgaW4gdGhpcyBmb250LlxuICAgICAqXG4gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgZW5jb2RlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgZW5jb2RlZCB0ZXh0IGFzIGEgaGV4IHN0cmluZy5cbiAgICAgKi9cbiAgICBQREZGb250LnByb3RvdHlwZS5lbmNvZGVUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgYXNzZXJ0SXModGV4dCwgJ3RleHQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdGhpcy5tb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVyLmVuY29kZVRleHQodGV4dCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNZWFzdXJlIHRoZSB3aWR0aCBvZiBhIHN0cmluZyBvZiB0ZXh0IGRyYXduIGluIHRoaXMgZm9udCBhdCBhIGdpdmVuIHNpemUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB3aWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUoJ0ZvbyBCYXIgUXV4IEJheicsIDM2KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBzdHJpbmcgb2YgdGV4dCB0byBiZSBtZWFzdXJlZC5cbiAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgZm9udCBzaXplIHRvIGJlIHVzZWQgZm9yIHRoaXMgbWVhc3VyZW1lbnQuXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIG9mIHRoZSBzdHJpbmcgb2YgdGV4dCB3aGVuIGRyYXduIGluIHRoaXMgZm9udCBhdCB0aGVcbiAgICAgKiAgICAgICAgICBnaXZlbiBzaXplLlxuICAgICAqL1xuICAgIFBERkZvbnQucHJvdG90eXBlLndpZHRoT2ZUZXh0QXRTaXplID0gZnVuY3Rpb24gKHRleHQsIHNpemUpIHtcbiAgICAgICAgYXNzZXJ0SXModGV4dCwgJ3RleHQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgYXNzZXJ0SXMoc2l6ZSwgJ3NpemUnLCBbJ251bWJlciddKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZXIud2lkdGhPZlRleHRBdFNpemUodGV4dCwgc2l6ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNZWFzdXJlIHRoZSBoZWlnaHQgb2YgdGhpcyBmb250IGF0IGEgZ2l2ZW4gc2l6ZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZSgyNClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBgb3B0aW9ucy5kZXNjZW5kZXJgIHZhbHVlIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBmb250J3NcbiAgICAgKiBkZXNjZW5kZXIgaXMgaW5jbHVkZWQgaW4gdGhlIGhlaWdodCBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaXplIFRoZSBmb250IHNpemUgdG8gYmUgdXNlZCBmb3IgdGhpcyBtZWFzdXJlbWVudC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gY29tcHV0aW5nIHRoaXMgbWVhc3VyZW1lbnQuXG4gICAgICogQHJldHVybnMgVGhlIGhlaWdodCBvZiB0aGlzIGZvbnQgYXQgdGhlIGdpdmVuIHNpemUuXG4gICAgICovXG4gICAgUERGRm9udC5wcm90b3R5cGUuaGVpZ2h0QXRTaXplID0gZnVuY3Rpb24gKHNpemUsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBhc3NlcnRJcyhzaXplLCAnc2l6ZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVzY2VuZGVyLCAnb3B0aW9ucy5kZXNjZW5kZXInLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVyLmhlaWdodE9mRm9udEF0U2l6ZShzaXplLCB7XG4gICAgICAgICAgICBkZXNjZW5kZXI6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZXNjZW5kZXIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgZm9udCBzaXplIGF0IHdoaWNoIHRoaXMgZm9udCBpcyBhIGdpdmVuIGhlaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb250U2l6ZSA9IGZvbnQuc2l6ZUF0SGVpZ2h0KDEyKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCB0byBiZSB1c2VkIGZvciB0aGlzIGNhbGN1bGF0aW9uLlxuICAgICAqIEByZXR1cm5zIFRoZSBmb250IHNpemUgYXQgd2hpY2ggdGhpcyBmb250IGlzIHRoZSBnaXZlbiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGRm9udC5wcm90b3R5cGUuc2l6ZUF0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZXIuc2l6ZU9mRm9udEF0SGVpZ2h0KGhlaWdodCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNldCBvZiB1bmljb2RlIGNvZGUgcG9pbnRzIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9udC5cbiAgICAgKiBAcmV0dXJucyBUaGUgc2V0IG9mIHVuaWNvZGUgY29kZSBwb2ludHMgc3VwcG9ydGVkIGJ5IHRoaXMgZm9udC5cbiAgICAgKi9cbiAgICBQREZGb250LnByb3RvdHlwZS5nZXRDaGFyYWN0ZXJTZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmVtYmVkZGVyIGluc3RhbmNlb2YgU3RhbmRhcmRGb250RW1iZWRkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVyLmVuY29kaW5nLnN1cHBvcnRlZENvZGVQb2ludHM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlci5mb250LmNoYXJhY3RlclNldDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlXG4gICAgICogPiBbW1BERkRvY3VtZW50LnNhdmVdXSBhbmQgW1tQREZEb2N1bWVudC5zYXZlQXNCYXNlNjRdXSBtZXRob2RzIHdpbGxcbiAgICAgKiA+IGF1dG9tYXRpY2FsbHkgZW5zdXJlIGFsbCBmb250cyBnZXQgZW1iZWRkZWQuXG4gICAgICpcbiAgICAgKiBFbWJlZCB0aGlzIGZvbnQgaW4gaXRzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZW1iZWRkaW5nIGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkZvbnQucHJvdG90eXBlLmVtYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubW9kaWZpZWQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZGRlci5lbWJlZEludG9Db250ZXh0KHRoaXMuZG9jLmNvbnRleHQsIHRoaXMucmVmKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkRvY3VtZW50LmVtYmVkRm9udF1dIGFuZFxuICAgICAqID4gW1tQREZEb2N1bWVudC5lbWJlZFN0YW5kYXJkRm9udF1dIG1ldGhvZHMsIHdoaWNoIHdpbGwgY3JlYXRlIGluc3RhbmNlc1xuICAgICAqID4gb2YgW1tQREZGb250XV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkZvbnRdXSBmcm9tIGFuIGV4aXN0aW5nIHJlZiBhbmQgZW1iZWRkZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgZm9udC5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgZm9udCB3aWxsIGJlbG9uZy5cbiAgICAgKiBAcGFyYW0gZW1iZWRkZXIgVGhlIGVtYmVkZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVtYmVkIHRoZSBmb250LlxuICAgICAqL1xuICAgIFBERkZvbnQub2YgPSBmdW5jdGlvbiAocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRm9udChyZWYsIGRvYywgZW1iZWRkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkZvbnQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRm9udDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkZvbnQuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuL1BERkRvY3VtZW50XCI7XG5pbXBvcnQgeyBKcGVnRW1iZWRkZXIsIFBERlJlZiwgUG5nRW1iZWRkZXIgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbWFnZSB0aGF0IGhhcyBiZWVuIGVtYmVkZGVkIGluIGEgW1tQREZEb2N1bWVudF1dLlxuICovXG52YXIgUERGSW1hZ2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGSW1hZ2UocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIGFzc2VydElzKHJlZiwgJ3JlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZW1iZWRkZXIsICdlbWJlZGRlcicsIFtcbiAgICAgICAgICAgIFtKcGVnRW1iZWRkZXIsICdKcGVnRW1iZWRkZXInXSxcbiAgICAgICAgICAgIFtQbmdFbWJlZGRlciwgJ1BuZ0VtYmVkZGVyJ10sXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMud2lkdGggPSBlbWJlZGRlci53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBlbWJlZGRlci5oZWlnaHQ7XG4gICAgICAgIHRoaXMuZW1iZWRkZXIgPSBlbWJlZGRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGlzIGltYWdlIGFmdGVyIGJlaW5nIHNjYWxlZCBieSB0aGVcbiAgICAgKiBnaXZlbiBgZmFjdG9yYC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbWFnZS53aWR0aCAgLy8gPT4gNTAwXG4gICAgICogaW1hZ2UuaGVpZ2h0IC8vID0+IDI1MFxuICAgICAqXG4gICAgICogY29uc3Qgc2NhbGVkID0gaW1hZ2Uuc2NhbGUoMC41KVxuICAgICAqIHNjYWxlZC53aWR0aCAgLy8gPT4gMjUwXG4gICAgICogc2NhbGVkLmhlaWdodCAvLyA9PiAxMjVcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBvZnRlbiB1c2VmdWwgYmVmb3JlIGRyYXdpbmcgYW4gaW1hZ2Ugd2l0aFxuICAgICAqIFtbUERGUGFnZS5kcmF3SW1hZ2VdXSB0byBjb21wdXRlIHRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSBmYWN0b3IgVGhlIGZhY3RvciBieSB3aGljaCB0aGlzIGltYWdlIHNob3VsZCBiZSBzY2FsZWQuXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGltYWdlIGFmdGVyIGJlaW5nIHNjYWxlZC5cbiAgICAgKi9cbiAgICBQREZJbWFnZS5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAoZmFjdG9yKSB7XG4gICAgICAgIGFzc2VydElzKGZhY3RvciwgJ2ZhY3RvcicsIFsnbnVtYmVyJ10pO1xuICAgICAgICByZXR1cm4geyB3aWR0aDogdGhpcy53aWR0aCAqIGZhY3RvciwgaGVpZ2h0OiB0aGlzLmhlaWdodCAqIGZhY3RvciB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoaXMgaW1hZ2UgYWZ0ZXIgc2NhbGluZyBpdCBhcyBsYXJnZSBhc1xuICAgICAqIHBvc3NpYmxlIHdoaWxlIG1haW50YWluaW5nIGl0cyBhc3BlY3QgcmF0aW8gYW5kIG5vdCBleGNlZWRpbmcgdGhlXG4gICAgICogc3BlY2lmaWVkIGB3aWR0aGAgYW5kIGBoZWlnaHRgLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBcbiAgICAgKiBpbWFnZS53aWR0aCAgLy8gPT4gNTAwXG4gICAgICogaW1hZ2UuaGVpZ2h0IC8vID0+IDI1MFxuICAgICAqXG4gICAgICogY29uc3Qgc2NhbGVkID0gaW1hZ2Uuc2NhbGVUb0ZpdCg3NTAsIDEwMDApXG4gICAgICogc2NhbGVkLndpZHRoICAvLyA9PiA3NTBcbiAgICAgKiBzY2FsZWQuaGVpZ2h0IC8vID0+IDM3NVxuICAgICAqIGBgYFxuICAgICAqIFRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBwYXJhbWV0ZXJzIGNhbiBhbHNvIGJlIHRob3VnaHQgb2YgYXMgdGhlIHdpZHRoXG4gICAgICogYW5kIGhlaWdodCBvZiBhIGJveCB0aGF0IHRoZSBzY2FsZWQgaW1hZ2UgbXVzdCBmaXQgd2l0aGluLlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgYm91bmRpbmcgYm94J3Mgd2lkdGguXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgYm91bmRpbmcgYm94J3MgaGVpZ2h0LlxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbWFnZSBhZnRlciBiZWluZyBzY2FsZWQuXG4gICAgICovXG4gICAgUERGSW1hZ2UucHJvdG90eXBlLnNjYWxlVG9GaXQgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgaW1nV2lkdGhTY2FsZSA9IHdpZHRoIC8gdGhpcy53aWR0aDtcbiAgICAgICAgdmFyIGltZ0hlaWdodFNjYWxlID0gaGVpZ2h0IC8gdGhpcy5oZWlnaHQ7XG4gICAgICAgIHZhciBzY2FsZSA9IE1hdGgubWluKGltZ1dpZHRoU2NhbGUsIGltZ0hlaWdodFNjYWxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGUoc2NhbGUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoaXMgaW1hZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBpbWFnZS5zaXplKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgUERGSW1hZ2UucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlKDEpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlXG4gICAgICogPiBbW1BERkRvY3VtZW50LnNhdmVdXSBhbmQgW1tQREZEb2N1bWVudC5zYXZlQXNCYXNlNjRdXSBtZXRob2RzIHdpbGxcbiAgICAgKiA+IGF1dG9tYXRpY2FsbHkgZW5zdXJlIGFsbCBpbWFnZXMgZ2V0IGVtYmVkZGVkLlxuICAgICAqXG4gICAgICogRW1iZWQgdGhpcyBpbWFnZSBpbiBpdHMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aGVuIHRoZSBlbWJlZGRpbmcgaXMgY29tcGxldGUuXG4gICAgICovXG4gICAgUERGSW1hZ2UucHJvdG90eXBlLmVtYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIGRvYywgcmVmO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVtYmVkZGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbWFnZSBzaG91bGQgb25seSBiZSBlbWJlZGRlZCBvbmNlLiBJZiB0aGVyZSdzIGEgcGVuZGluZyBlbWJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0aW9uIHRoZW4gd2FpdCBvbiBpdC4gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gc3RhcnQgdGhlIGVtYmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVtYmVkVGFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGhpcywgZG9jID0gX2EuZG9jLCByZWYgPSBfYS5yZWY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWJlZFRhc2sgPSB0aGlzLmVtYmVkZGVyLmVtYmVkSW50b0NvbnRleHQoZG9jLmNvbnRleHQsIHJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkVGFza107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNsZWFyIGB0aGlzLmVtYmVkZGVyYCBzbyB0aGF0IHRoZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgaW1hZ2UgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLCB0aHVzIGF2b2lkaW5nIGEgbWVtb3J5IGxlYWsuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0hvcGRpbmcvcGRmLWxpYi9wdWxsLzEwMzIvZmlsZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYmVkZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5lbWJlZFBuZ11dIGFuZCBbW1BERkRvY3VtZW50LmVtYmVkSnBnXV1cbiAgICAgKiA+IG1ldGhvZHMsIHdoaWNoIHdpbGwgY3JlYXRlIGluc3RhbmNlcyBvZiBbW1BERkltYWdlXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkltYWdlXV0gZnJvbSBhbiBleGlzdGluZyByZWYgYW5kIGVtYmVkZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIGltYWdlLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBpbWFnZSB3aWxsIGJlbG9uZy5cbiAgICAgKiBAcGFyYW0gZW1iZWRkZXIgVGhlIGVtYmVkZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVtYmVkIHRoZSBpbWFnZS5cbiAgICAgKi9cbiAgICBQREZJbWFnZS5vZiA9IGZ1bmN0aW9uIChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZJbWFnZShyZWYsIGRvYywgZW1iZWRkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkltYWdlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkltYWdlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGSW1hZ2UuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUERGTmFtZSwgUERGQXJyYXksIFBERkRpY3QsIFBERkhleFN0cmluZyB9IGZyb20gXCIuLi9jb3JlXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgSmF2YVNjcmlwdCB0aGF0IGhhcyBiZWVuIGVtYmVkZGVkIGluIGEgW1tQREZEb2N1bWVudF1dLlxuICovXG52YXIgUERGSmF2YVNjcmlwdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZKYXZhU2NyaXB0KHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICB0aGlzLmFscmVhZHlFbWJlZGRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuZW1iZWRkZXIgPSBlbWJlZGRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlXG4gICAgICogPiBbW1BERkRvY3VtZW50LnNhdmVdXSBhbmQgW1tQREZEb2N1bWVudC5zYXZlQXNCYXNlNjRdXSBtZXRob2RzIHdpbGxcbiAgICAgKiA+IGF1dG9tYXRpY2FsbHkgZW5zdXJlIGFsbCBKYXZhU2NyaXB0cyBnZXQgZW1iZWRkZWQuXG4gICAgICpcbiAgICAgKiBFbWJlZCB0aGlzIEphdmFTY3JpcHQgaW4gaXRzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZW1iZWRkaW5nIGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkphdmFTY3JpcHQucHJvdG90eXBlLmVtYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIGNhdGFsb2csIGNvbnRleHQsIHJlZiwgTmFtZXMsIEphdmFzY3JpcHQsIEpTTmFtZXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLmFscmVhZHlFbWJlZGRlZCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMuZG9jLCBjYXRhbG9nID0gX2EuY2F0YWxvZywgY29udGV4dCA9IF9hLmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkZGVyLmVtYmVkSW50b0NvbnRleHQodGhpcy5kb2MuY29udGV4dCwgdGhpcy5yZWYpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXRhbG9nLmhhcyhQREZOYW1lLm9mKCdOYW1lcycpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cuc2V0KFBERk5hbWUub2YoJ05hbWVzJyksIGNvbnRleHQub2JqKHt9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBOYW1lcyA9IGNhdGFsb2cubG9va3VwKFBERk5hbWUub2YoJ05hbWVzJyksIFBERkRpY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFOYW1lcy5oYXMoUERGTmFtZS5vZignSmF2YVNjcmlwdCcpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzLnNldChQREZOYW1lLm9mKCdKYXZhU2NyaXB0JyksIGNvbnRleHQub2JqKHt9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBKYXZhc2NyaXB0ID0gTmFtZXMubG9va3VwKFBERk5hbWUub2YoJ0phdmFTY3JpcHQnKSwgUERGRGljdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUphdmFzY3JpcHQuaGFzKFBERk5hbWUub2YoJ05hbWVzJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YXNjcmlwdC5zZXQoUERGTmFtZS5vZignTmFtZXMnKSwgY29udGV4dC5vYmooW10pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEpTTmFtZXMgPSBKYXZhc2NyaXB0Lmxvb2t1cChQREZOYW1lLm9mKCdOYW1lcycpLCBQREZBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBKU05hbWVzLnB1c2goUERGSGV4U3RyaW5nLmZyb21UZXh0KHRoaXMuZW1iZWRkZXIuc2NyaXB0TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSlNOYW1lcy5wdXNoKHJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFscmVhZHlFbWJlZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5hZGRKYXZhU2NyaXB0XV0gbWV0aG9kLCB3aGljaCB3aWxsXG4gICAgICogY3JlYXRlIGluc3RhbmNlcyBvZiBbW1BERkphdmFTY3JpcHRdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGSmF2YVNjcmlwdF1dIGZyb20gYW4gZXhpc3RpbmcgcmVmIGFuZCBzY3JpcHRcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgc2NyaXB0LlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBzY3JpcHQgd2lsbCBiZWxvbmcuXG4gICAgICogQHBhcmFtIGVtYmVkZGVyIFRoZSBlbWJlZGRlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBlbWJlZCB0aGUgc2NyaXB0LlxuICAgICAqL1xuICAgIFBERkphdmFTY3JpcHQub2YgPSBmdW5jdGlvbiAocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGSmF2YVNjcmlwdChyZWYsIGRvYywgZW1iZWRkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkphdmFTY3JpcHQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGSmF2YVNjcmlwdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkphdmFTY3JpcHQuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuL2NvbG9yc1wiO1xuaW1wb3J0IHsgZHJhd0ltYWdlLCBkcmF3TGluZSwgZHJhd0xpbmVzT2ZUZXh0LCBkcmF3UGFnZSwgZHJhd1JlY3RhbmdsZSwgZHJhd1N2Z1BhdGgsIGRyYXdFbGxpcHNlLCB9IGZyb20gXCIuL29wZXJhdGlvbnNcIjtcbmltcG9ydCB7IHBvcEdyYXBoaWNzU3RhdGUsIHB1c2hHcmFwaGljc1N0YXRlLCB0cmFuc2xhdGUsIExpbmVDYXBTdHlsZSwgc2NhbGUsIH0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgUERGRG9jdW1lbnQgZnJvbSBcIi4vUERGRG9jdW1lbnRcIjtcbmltcG9ydCBQREZFbWJlZGRlZFBhZ2UgZnJvbSBcIi4vUERGRW1iZWRkZWRQYWdlXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi9QREZGb250XCI7XG5pbXBvcnQgUERGSW1hZ2UgZnJvbSBcIi4vUERGSW1hZ2VcIjtcbmltcG9ydCB7IEJsZW5kTW9kZSwgfSBmcm9tIFwiLi9QREZQYWdlT3B0aW9uc1wiO1xuaW1wb3J0IHsgZGVncmVlcywgdG9EZWdyZWVzIH0gZnJvbSBcIi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEZvbnRzIH0gZnJvbSBcIi4vU3RhbmRhcmRGb250c1wiO1xuaW1wb3J0IHsgUERGQ29udGVudFN0cmVhbSwgUERGTmFtZSwgUERGT3BlcmF0b3IsIFBERlBhZ2VMZWFmLCBQREZSZWYsIFBERkRpY3QsIFBERkFycmF5LCB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRFYWNoSXMsIGFzc2VydElzLCBhc3NlcnRNdWx0aXBsZSwgYXNzZXJ0T3JVbmRlZmluZWQsIGJyZWFrVGV4dEludG9MaW5lcywgY2xlYW5UZXh0LCByZWN0YW5nbGVzQXJlRXF1YWwsIGxpbmVTcGxpdCwgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZCwgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkLCB9IGZyb20gXCIuLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2luZ2xlIHBhZ2Ugb2YgYSBbW1BERkRvY3VtZW50XV0uXG4gKi9cbnZhciBQREZQYWdlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERlBhZ2UobGVhZk5vZGUsIHJlZiwgZG9jKSB7XG4gICAgICAgIHRoaXMuZm9udFNpemUgPSAyNDtcbiAgICAgICAgdGhpcy5mb250Q29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIHRoaXMubGluZUhlaWdodCA9IDI0O1xuICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICB0aGlzLnkgPSAwO1xuICAgICAgICBhc3NlcnRJcyhsZWFmTm9kZSwgJ2xlYWZOb2RlJywgW1tQREZQYWdlTGVhZiwgJ1BERlBhZ2VMZWFmJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMocmVmLCAncmVmJywgW1tQREZSZWYsICdQREZSZWYnXV0pO1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICB0aGlzLm5vZGUgPSBsZWFmTm9kZTtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhpcyBwYWdlIGJ5IGEgbXVsdGlwbGUgb2YgOTAgZGVncmVlcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Um90YXRpb24oZGVncmVlcygtOTApKVxuICAgICAqIHBhZ2Uuc2V0Um90YXRpb24oZGVncmVlcygwKSlcbiAgICAgKiBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMoOTApKVxuICAgICAqIHBhZ2Uuc2V0Um90YXRpb24oZGVncmVlcygxODApKVxuICAgICAqIHBhZ2Uuc2V0Um90YXRpb24oZGVncmVlcygyNzApKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBhbmdsZSBUaGUgYW5nbGUgdG8gcm90YXRlIHRoaXMgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRSb3RhdGlvbiA9IGZ1bmN0aW9uIChhbmdsZSkge1xuICAgICAgICB2YXIgZGVncmVlc0FuZ2xlID0gdG9EZWdyZWVzKGFuZ2xlKTtcbiAgICAgICAgYXNzZXJ0TXVsdGlwbGUoZGVncmVlc0FuZ2xlLCAnZGVncmVlc0FuZ2xlJywgOTApO1xuICAgICAgICB0aGlzLm5vZGUuc2V0KFBERk5hbWUub2YoJ1JvdGF0ZScpLCB0aGlzLmRvYy5jb250ZXh0Lm9iaihkZWdyZWVzQW5nbGUpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIHBhZ2UncyByb3RhdGlvbiBhbmdsZSBpbiBkZWdyZWVzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJvdGF0aW9uQW5nbGUgPSBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGU7XG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSBwYWdlIGluIGRlZ3JlZXMgKGFsd2F5cyBhIG11bHRpcGxlIG9mXG4gICAgICogICAgICAgICAgOTAgZGVncmVlcykuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0Um90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBSb3RhdGUgPSB0aGlzLm5vZGUuUm90YXRlKCk7XG4gICAgICAgIHJldHVybiBkZWdyZWVzKFJvdGF0ZSA/IFJvdGF0ZS5hc051bWJlcigpIDogMCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhpcyBwYWdlIGJ5IGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyBpdHMgd2lkdGggYW5kIGhlaWdodC4gRm9yXG4gICAgICogZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2Uuc2V0U2l6ZSgyNTAsIDUwMClcbiAgICAgKiBwYWdlLnNldFNpemUocGFnZS5nZXRXaWR0aCgpICsgNTAsIHBhZ2UuZ2V0SGVpZ2h0KCkgKyAxMDApXG4gICAgICogcGFnZS5zZXRTaXplKHBhZ2UuZ2V0V2lkdGgoKSAtIDUwLCBwYWdlLmdldEhlaWdodCgpIC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBQREYgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyBmb3IgcGFnZXMgdG8gaGF2ZSBleHBsaWNpdFxuICAgICAqIHdpZHRocyBhbmQgaGVpZ2h0cy4gSW5zdGVhZCBpdCBkZWZpbmVzIHRoZSBcInNpemVcIiBvZiBhIHBhZ2UgaW4gdGVybXMgb2ZcbiAgICAgKiBmaXZlIHJlY3RhbmdsZXM6IHRoZSBNZWRpYUJveCwgQ3JvcEJveCwgQmxlZWRCb3gsIFRyaW1Cb3gsIGFuZCBBcnRCb3guIEFzIGFcbiAgICAgKiByZXN1bHQsIHRoaXMgbWV0aG9kIGNhbm5vdCBkaXJlY3RseSBjaGFuZ2UgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYSBwYWdlLlxuICAgICAqIEluc3RlYWQsIGl0IHdvcmtzIGJ5IGFkanVzdGluZyB0aGVzZSBmaXZlIGJveGVzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgICAgKiAgIDEuIFNldCB3aWR0aCAmIGhlaWdodCBvZiBNZWRpYUJveC5cbiAgICAgKiAgIDIuIFNldCB3aWR0aCAmIGhlaWdodCBvZiBDcm9wQm94LCBpZiBpdCBoYXMgc2FtZSBkaW1lbnNpb25zIGFzIE1lZGlhQm94LlxuICAgICAqICAgMy4gU2V0IHdpZHRoICYgaGVpZ2h0IG9mIEJsZWVkQm94LCBpZiBpdCBoYXMgc2FtZSBkaW1lbnNpb25zIGFzIE1lZGlhQm94LlxuICAgICAqICAgNC4gU2V0IHdpZHRoICYgaGVpZ2h0IG9mIFRyaW1Cb3gsIGlmIGl0IGhhcyBzYW1lIGRpbWVuc2lvbnMgYXMgTWVkaWFCb3guXG4gICAgICogICA1LiBTZXQgd2lkdGggJiBoZWlnaHQgb2YgQXJ0Qm94LCBpZiBpdCBoYXMgc2FtZSBkaW1lbnNpb25zIGFzIE1lZGlhQm94LlxuICAgICAqXG4gICAgICogVGhpcyBhcHByb2FjaCB3b3JrcyB3ZWxsIGZvciBtb3N0IFBERiBkb2N1bWVudHMgYXMgYWxsIFBERiBwYWdlcyBtdXN0XG4gICAgICogaGF2ZSBhIE1lZGlhQm94LCBidXQgcmVsYXRpdmVseSBmZXcgaGF2ZSBhIENyb3BCb3gsIEJsZWVkQm94LCBUcmltQm94LCBvclxuICAgICAqIEFydEJveC4gQW5kIHdoZW4gdGhleSBkbyBoYXZlIHRoZXNlIGFkZGl0aW9uYWwgYm94ZXMsIHRoZXkgb2Z0ZW4gaGF2ZSB0aGVcbiAgICAgKiBzYW1lIGRpbWVuc2lvbnMgYXMgdGhlIE1lZGlhQm94LiBIb3dldmVyLCBpZiB5b3UgZmluZCB0aGlzIG1ldGhvZCBkb2VzIG5vdFxuICAgICAqIHdvcmsgZm9yIHlvdXIgZG9jdW1lbnQsIGNvbnNpZGVyIHNldHRpbmcgdGhlIGJveGVzIGRpcmVjdGx5OlxuICAgICAqICAgKiBbW1BERlBhZ2Uuc2V0TWVkaWFCb3hdXVxuICAgICAqICAgKiBbW1BERlBhZ2Uuc2V0Q3JvcEJveF1dXG4gICAgICogICAqIFtbUERGUGFnZS5zZXRCbGVlZEJveF1dXG4gICAgICogICAqIFtbUERGUGFnZS5zZXRUcmltQm94XV1cbiAgICAgKiAgICogW1tQREZQYWdlLnNldEFydEJveF1dXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIG5ldyB3aWR0aCBvZiB0aGUgcGFnZS5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBuZXcgaGVpZ2h0IG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldFNpemUgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgbWVkaWFCb3ggPSB0aGlzLmdldE1lZGlhQm94KCk7XG4gICAgICAgIHRoaXMuc2V0TWVkaWFCb3gobWVkaWFCb3gueCwgbWVkaWFCb3gueSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHZhciBjcm9wQm94ID0gdGhpcy5nZXRDcm9wQm94KCk7XG4gICAgICAgIHZhciBibGVlZEJveCA9IHRoaXMuZ2V0QmxlZWRCb3goKTtcbiAgICAgICAgdmFyIHRyaW1Cb3ggPSB0aGlzLmdldFRyaW1Cb3goKTtcbiAgICAgICAgdmFyIGFydEJveCA9IHRoaXMuZ2V0QXJ0Qm94KCk7XG4gICAgICAgIHZhciBoYXNDcm9wQm94ID0gdGhpcy5ub2RlLkNyb3BCb3goKTtcbiAgICAgICAgdmFyIGhhc0JsZWVkQm94ID0gdGhpcy5ub2RlLkJsZWVkQm94KCk7XG4gICAgICAgIHZhciBoYXNUcmltQm94ID0gdGhpcy5ub2RlLlRyaW1Cb3goKTtcbiAgICAgICAgdmFyIGhhc0FydEJveCA9IHRoaXMubm9kZS5BcnRCb3goKTtcbiAgICAgICAgaWYgKGhhc0Nyb3BCb3ggJiYgcmVjdGFuZ2xlc0FyZUVxdWFsKGNyb3BCb3gsIG1lZGlhQm94KSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDcm9wQm94KG1lZGlhQm94LngsIG1lZGlhQm94LnksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNCbGVlZEJveCAmJiByZWN0YW5nbGVzQXJlRXF1YWwoYmxlZWRCb3gsIG1lZGlhQm94KSkge1xuICAgICAgICAgICAgdGhpcy5zZXRCbGVlZEJveChtZWRpYUJveC54LCBtZWRpYUJveC55LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzVHJpbUJveCAmJiByZWN0YW5nbGVzQXJlRXF1YWwodHJpbUJveCwgbWVkaWFCb3gpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFRyaW1Cb3gobWVkaWFCb3gueCwgbWVkaWFCb3gueSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0FydEJveCAmJiByZWN0YW5nbGVzQXJlRXF1YWwoYXJ0Qm94LCBtZWRpYUJveCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QXJ0Qm94KG1lZGlhQm94LngsIG1lZGlhQm94LnksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhpcyBwYWdlIGJ5IGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyBpdHMgd2lkdGguIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5zZXRXaWR0aCgyNTApXG4gICAgICogcGFnZS5zZXRXaWR0aChwYWdlLmdldFdpZHRoKCkgKyA1MClcbiAgICAgKiBwYWdlLnNldFdpZHRoKHBhZ2UuZ2V0V2lkdGgoKSAtIDUwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgdXNlcyBbW1BERlBhZ2Uuc2V0U2l6ZV1dIHRvIHNldCB0aGUgcGFnZSdzIHdpZHRoLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSBuZXcgd2lkdGggb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIHRoaXMuZ2V0U2l6ZSgpLmhlaWdodCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhpcyBwYWdlIGJ5IGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyBpdHMgaGVpZ2h0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2Uuc2V0SGVpZ2h0KDUwMClcbiAgICAgKiBwYWdlLnNldEhlaWdodChwYWdlLmdldFdpZHRoKCkgKyAxMDApXG4gICAgICogcGFnZS5zZXRIZWlnaHQocGFnZS5nZXRXaWR0aCgpIC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgdXNlcyBbW1BERlBhZ2Uuc2V0U2l6ZV1dIHRvIHNldCB0aGUgcGFnZSdzIGhlaWdodC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIG5ldyBoZWlnaHQgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5zZXRTaXplKHRoaXMuZ2V0U2l6ZSgpLndpZHRoLCBoZWlnaHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBNZWRpYUJveCBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgbWVkaWFCb3ggPSBwYWdlLmdldE1lZGlhQm94KClcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0TWVkaWFCb3goMCwgMCwgMjUwLCA1MDApXG4gICAgICogcGFnZS5zZXRNZWRpYUJveChtZWRpYUJveC54LCBtZWRpYUJveC55LCA1MCwgMTAwKVxuICAgICAqIHBhZ2Uuc2V0TWVkaWFCb3goMTUsIDUsIG1lZGlhQm94LndpZHRoIC0gNTAsIG1lZGlhQm94LmhlaWdodCAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBbW1BERlBhZ2UuZ2V0TWVkaWFCb3hdXSBmb3IgZGV0YWlscyBhYm91dCB3aGF0IHRoZSBNZWRpYUJveCByZXByZXNlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBNZWRpYUJveC5cbiAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IE1lZGlhQm94LlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG5ldyBNZWRpYUJveC5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIG5ldyBNZWRpYUJveC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRNZWRpYUJveCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBtZWRpYUJveCA9IHRoaXMuZG9jLmNvbnRleHQub2JqKFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdKTtcbiAgICAgICAgdGhpcy5ub2RlLnNldChQREZOYW1lLk1lZGlhQm94LCBtZWRpYUJveCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIENyb3BCb3ggb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNyb3BCb3ggPSBwYWdlLmdldENyb3BCb3goKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRDcm9wQm94KDAsIDAsIDI1MCwgNTAwKVxuICAgICAqIHBhZ2Uuc2V0Q3JvcEJveChjcm9wQm94LngsIGNyb3BCb3gueSwgNTAsIDEwMClcbiAgICAgKiBwYWdlLnNldENyb3BCb3goMTUsIDUsIGNyb3BCb3gud2lkdGggLSA1MCwgY3JvcEJveC5oZWlnaHQgLSAxMDApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTZWUgW1tQREZQYWdlLmdldENyb3BCb3hdXSBmb3IgZGV0YWlscyBhYm91dCB3aGF0IHRoZSBDcm9wQm94IHJlcHJlc2VudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IENyb3BCb3guXG4gICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBDcm9wQm94LlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG5ldyBDcm9wQm94LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbmV3IENyb3BCb3guXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0Q3JvcEJveCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBjcm9wQm94ID0gdGhpcy5kb2MuY29udGV4dC5vYmooW3gsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodF0pO1xuICAgICAgICB0aGlzLm5vZGUuc2V0KFBERk5hbWUuQ3JvcEJveCwgY3JvcEJveCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIEJsZWVkQm94IG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBibGVlZEJveCA9IHBhZ2UuZ2V0QmxlZWRCb3goKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRCbGVlZEJveCgwLCAwLCAyNTAsIDUwMClcbiAgICAgKiBwYWdlLnNldEJsZWVkQm94KGJsZWVkQm94LngsIGJsZWVkQm94LnksIDUwLCAxMDApXG4gICAgICogcGFnZS5zZXRCbGVlZEJveCgxNSwgNSwgYmxlZWRCb3gud2lkdGggLSA1MCwgYmxlZWRCb3guaGVpZ2h0IC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2VlIFtbUERGUGFnZS5nZXRCbGVlZEJveF1dIGZvciBkZXRhaWxzIGFib3V0IHdoYXQgdGhlIEJsZWVkQm94IHJlcHJlc2VudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IEJsZWVkQm94LlxuICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgQmxlZWRCb3guXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgbmV3IEJsZWVkQm94LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbmV3IEJsZWVkQm94LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEJsZWVkQm94ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIGJsZWVkQm94ID0gdGhpcy5kb2MuY29udGV4dC5vYmooW3gsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodF0pO1xuICAgICAgICB0aGlzLm5vZGUuc2V0KFBERk5hbWUuQmxlZWRCb3gsIGJsZWVkQm94KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgVHJpbUJveCBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdHJpbUJveCA9IHBhZ2UuZ2V0VHJpbUJveCgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldFRyaW1Cb3goMCwgMCwgMjUwLCA1MDApXG4gICAgICogcGFnZS5zZXRUcmltQm94KHRyaW1Cb3gueCwgdHJpbUJveC55LCA1MCwgMTAwKVxuICAgICAqIHBhZ2Uuc2V0VHJpbUJveCgxNSwgNSwgdHJpbUJveC53aWR0aCAtIDUwLCB0cmltQm94LmhlaWdodCAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBbW1BERlBhZ2UuZ2V0VHJpbUJveF1dIGZvciBkZXRhaWxzIGFib3V0IHdoYXQgdGhlIFRyaW1Cb3ggcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgVHJpbUJveC5cbiAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IFRyaW1Cb3guXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgbmV3IFRyaW1Cb3guXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBuZXcgVHJpbUJveC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRUcmltQm94ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIHRyaW1Cb3ggPSB0aGlzLmRvYy5jb250ZXh0Lm9iaihbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSk7XG4gICAgICAgIHRoaXMubm9kZS5zZXQoUERGTmFtZS5UcmltQm94LCB0cmltQm94KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgQXJ0Qm94IG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBhcnRCb3ggPSBwYWdlLmdldEFydEJveCgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEFydEJveCgwLCAwLCAyNTAsIDUwMClcbiAgICAgKiBwYWdlLnNldEFydEJveChhcnRCb3gueCwgYXJ0Qm94LnksIDUwLCAxMDApXG4gICAgICogcGFnZS5zZXRBcnRCb3goMTUsIDUsIGFydEJveC53aWR0aCAtIDUwLCBhcnRCb3guaGVpZ2h0IC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2VlIFtbUERGUGFnZS5nZXRBcnRCb3hdXSBmb3IgZGV0YWlscyBhYm91dCB3aGF0IHRoZSBBcnRCb3ggcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgQXJ0Qm94LlxuICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgQXJ0Qm94LlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG5ldyBBcnRCb3guXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBuZXcgQXJ0Qm94LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEFydEJveCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBhcnRCb3ggPSB0aGlzLmRvYy5jb250ZXh0Lm9iaihbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSk7XG4gICAgICAgIHRoaXMubm9kZS5zZXQoUERGTmFtZS5BcnRCb3gsIGFydEJveCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBwYWdlJ3Mgd2lkdGggYW5kIGhlaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHBhZ2UuZ2V0U2l6ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIFtbUERGUGFnZS5nZXRNZWRpYUJveF1dIHRvIG9idGFpbiB0aGUgcGFnZSdzXG4gICAgICogd2lkdGggYW5kIGhlaWdodC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0TWVkaWFCb3goKSwgd2lkdGggPSBfYS53aWR0aCwgaGVpZ2h0ID0gX2EuaGVpZ2h0O1xuICAgICAgICByZXR1cm4geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBwYWdlJ3Mgd2lkdGguIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgd2lkdGggPSBwYWdlLmdldFdpZHRoKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgW1tQREZQYWdlLmdldFNpemVdXSB0byBvYnRhaW4gdGhlIHBhZ2UncyBzaXplLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTaXplKCkud2lkdGg7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBwYWdlJ3MgaGVpZ2h0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlaWdodCA9IHBhZ2UuZ2V0SGVpZ2h0KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgW1tQREZQYWdlLmdldFNpemVdXSB0byBvYnRhaW4gdGhlIHBhZ2UncyBzaXplLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGhlaWdodCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNpemUoKS5oZWlnaHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlY3RhbmdsZSBkZWZpbmluZyB0aGlzIHBhZ2UncyBNZWRpYUJveC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHBhZ2UuZ2V0TWVkaWFCb3goKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIE1lZGlhQm94IG9mIGEgcGFnZSBkZWZpbmVzIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBwaHlzaWNhbCBtZWRpdW0gb25cbiAgICAgKiB3aGljaCB0aGUgcGFnZSBpcyB0byBiZSBkaXNwbGF5ZWQvcHJpbnRlZC4gSXQgbWF5IGluY2x1ZGUgZXh0ZW5kZWQgYXJlYVxuICAgICAqIHN1cnJvdW5kaW5nIHRoZSBwYWdlIGNvbnRlbnQgZm9yIGJsZWVkIG1hcmtzLCBwcmludGluZyBtYXJrcywgZXRjLi4uXG4gICAgICogSXQgbWF5IGFsc28gaW5jbHVkZSBhcmVhcyBjbG9zZSB0byB0aGUgZWRnZXMgb2YgdGhlIG1lZGl1bSB0aGF0IGNhbm5vdCBiZVxuICAgICAqIG1hcmtlZCBiZWNhdXNlIG9mIHBoeXNpY2FsIGxpbWl0YXRpb25zIG9mIHRoZSBvdXRwdXQgZGV2aWNlLiBDb250ZW50XG4gICAgICogZmFsbGluZyBvdXRzaWRlIHRoaXMgYm91bmRhcnkgbWF5IHNhZmVseSBiZSBkaXNjYXJkZWQgd2l0aG91dCBhZmZlY3RpbmdcbiAgICAgKiB0aGUgbWVhbmluZyBvZiB0aGUgUERGIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBNZWRpYUJveCBhbmQgaXRzXG4gICAgICogICAgICAgICAgd2lkdGggJiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0TWVkaWFCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtZWRpYUJveCA9IHRoaXMubm9kZS5NZWRpYUJveCgpO1xuICAgICAgICByZXR1cm4gbWVkaWFCb3guYXNSZWN0YW5nbGUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmVjdGFuZ2xlIGRlZmluaW5nIHRoaXMgcGFnZSdzIENyb3BCb3guIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldENyb3BCb3goKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIENyb3BCb3ggb2YgYSBwYWdlIGRlZmluZXMgdGhlIHJlZ2lvbiB0byB3aGljaCB0aGUgY29udGVudHMgb2YgdGhlIHBhZ2VcbiAgICAgKiBzaGFsbCBiZSBjbGlwcGVkIHdoZW4gZGlzcGxheWVkIG9yIHByaW50ZWQuIFVubGlrZSB0aGUgb3RoZXIgYm94ZXMsIHRoZVxuICAgICAqIENyb3BCb3ggZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVwcmVzZW50IHRoZSBwaHlzaWNhbCBwYWdlIGdlb21ldHJ5LiBJdFxuICAgICAqIG1lcmVseSBpbXBvc2VzIGNsaXBwaW5nIG9uIHRoZSBwYWdlIGNvbnRlbnRzLlxuICAgICAqXG4gICAgICogVGhlIENyb3BCb3gncyBkZWZhdWx0IHZhbHVlIGlzIHRoZSBwYWdlJ3MgTWVkaWFCb3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBDcm9wQm94IGFuZCBpdHNcbiAgICAgKiAgICAgICAgICB3aWR0aCAmIGhlaWdodC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRDcm9wQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBjcm9wQm94ID0gdGhpcy5ub2RlLkNyb3BCb3goKTtcbiAgICAgICAgcmV0dXJuIChfYSA9IGNyb3BCb3ggPT09IG51bGwgfHwgY3JvcEJveCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3JvcEJveC5hc1JlY3RhbmdsZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmdldE1lZGlhQm94KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlY3RhbmdsZSBkZWZpbmluZyB0aGlzIHBhZ2UncyBCbGVlZEJveC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHBhZ2UuZ2V0QmxlZWRCb3goKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIEJsZWVkQm94IG9mIGEgcGFnZSBkZWZpbmVzIHRoZSByZWdpb24gdG8gd2hpY2ggdGhlIGNvbnRlbnRzIG9mIHRoZVxuICAgICAqIHBhZ2Ugc2hhbGwgYmUgY2xpcHBlZCB3aGVuIG91dHB1dCBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuIFRoaXMgbWF5XG4gICAgICogaW5jbHVkZSBhbnkgZXh0cmEgYmxlZWQgYXJlYSBuZWVkZWQgdG8gYWNjb21tb2RhdGUgdGhlIHBoeXNpY2FsXG4gICAgICogbGltaXRhdGlvbnMgb2YgY3V0dGluZywgZm9sZGluZywgYW5kIHRyaW1taW5nIGVxdWlwbWVudC4gVGhlIGFjdHVhbFxuICAgICAqIHByaW50ZWQgcGFnZSBtYXkgaW5jbHVkZSBwcmludGluZyBtYXJrcyB0aGF0IGZhbGwgb3V0c2lkZSB0aGUgQmxlZWRCb3guXG4gICAgICpcbiAgICAgKiBUaGUgQmxlZWRCb3gncyBkZWZhdWx0IHZhbHVlIGlzIHRoZSBwYWdlJ3MgQ3JvcEJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBkZWZpbmluZyB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIEJsZWVkQm94IGFuZCBpdHNcbiAgICAgKiAgICAgICAgICB3aWR0aCAmIGhlaWdodC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRCbGVlZEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYmxlZWRCb3ggPSB0aGlzLm5vZGUuQmxlZWRCb3goKTtcbiAgICAgICAgcmV0dXJuIChfYSA9IGJsZWVkQm94ID09PSBudWxsIHx8IGJsZWVkQm94ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBibGVlZEJveC5hc1JlY3RhbmdsZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmdldENyb3BCb3goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmVjdGFuZ2xlIGRlZmluaW5nIHRoaXMgcGFnZSdzIFRyaW1Cb3guIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldFRyaW1Cb3goKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIFRyaW1Cb3ggb2YgYSBwYWdlIGRlZmluZXMgdGhlIGludGVuZGVkIGRpbWVuc2lvbnMgb2YgdGhlIGZpbmlzaGVkXG4gICAgICogcGFnZSBhZnRlciB0cmltbWluZy4gSXQgbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgTWVkaWFCb3ggdG8gYWxsb3cgZm9yXG4gICAgICogcHJvZHVjdGlvbi1yZWxhdGVkIGNvbnRlbnQsIHN1Y2ggYXMgcHJpbnRpbmcgaW5zdHJ1Y3Rpb25zLCBjdXQgbWFya3MsIG9yXG4gICAgICogY29sb3IgYmFycy5cbiAgICAgKlxuICAgICAqIFRoZSBUcmltQm94J3MgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgcGFnZSdzIENyb3BCb3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBUcmltQm94IGFuZCBpdHNcbiAgICAgKiAgICAgICAgICB3aWR0aCAmIGhlaWdodC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRUcmltQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0cmltQm94ID0gdGhpcy5ub2RlLlRyaW1Cb3goKTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRyaW1Cb3ggPT09IG51bGwgfHwgdHJpbUJveCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdHJpbUJveC5hc1JlY3RhbmdsZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmdldENyb3BCb3goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmVjdGFuZ2xlIGRlZmluaW5nIHRoaXMgcGFnZSdzIEFydEJveC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHBhZ2UuZ2V0QXJ0Qm94KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBBcnRCb3ggb2YgYSBwYWdlIGRlZmluZXMgdGhlIGV4dGVudCBvZiB0aGUgcGFnZSdzIG1lYW5pbmdmdWwgY29udGVudFxuICAgICAqIChpbmNsdWRpbmcgcG90ZW50aWFsIHdoaXRlIHNwYWNlKS5cbiAgICAgKlxuICAgICAqIFRoZSBBcnRCb3gncyBkZWZhdWx0IHZhbHVlIGlzIHRoZSBwYWdlJ3MgQ3JvcEJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBkZWZpbmluZyB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIEFydEJveCBhbmQgaXRzXG4gICAgICogICAgICAgICAgd2lkdGggJiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0QXJ0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBhcnRCb3ggPSB0aGlzLm5vZGUuQXJ0Qm94KCk7XG4gICAgICAgIHJldHVybiAoX2EgPSBhcnRCb3ggPT09IG51bGwgfHwgYXJ0Qm94ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcnRCb3guYXNSZWN0YW5nbGUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5nZXRDcm9wQm94KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGUgdGhpcyBwYWdlJ3MgY29udGVudCB0byBhIG5ldyBsb2NhdGlvbiBvbiB0aGUgcGFnZS4gVGhpcyBvcGVyYXRpb25cbiAgICAgKiBpcyBvZnRlbiB1c2VmdWwgYWZ0ZXIgcmVzaXppbmcgdGhlIHBhZ2Ugd2l0aCBbW3NldFNpemVdXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBBZGQgNTAgdW5pdHMgb2Ygd2hpdGVzcGFjZSB0byB0aGUgdG9wIGFuZCByaWdodCBvZiB0aGUgcGFnZVxuICAgICAqIHBhZ2Uuc2V0U2l6ZShwYWdlLmdldFdpZHRoKCkgKyA1MCwgcGFnZS5nZXRIZWlnaHQoKSArIDUwKVxuICAgICAqXG4gICAgICogLy8gTW92ZSB0aGUgcGFnZSdzIGNvbnRlbnQgZnJvbSB0aGUgbG93ZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBhZ2VcbiAgICAgKiAvLyB0byB0aGUgdG9wLXJpZ2h0IGNvcm5lci5cbiAgICAgKiBwYWdlLnRyYW5zbGF0ZUNvbnRlbnQoNTAsIDUwKVxuICAgICAqXG4gICAgICogLy8gTm93IHRoZXJlIGFyZSA1MCB1bml0cyBvZiB3aGl0ZXNwYWNlIHRvIHRoZSBsZWZ0IGFuZCBib3R0b20gb2YgdGhlIHBhZ2VcbiAgICAgKiBgYGBcbiAgICAgKiBTZWUgYWxzbzogW1tyZXNldFBvc2l0aW9uXV1cbiAgICAgKiBAcGFyYW0geCBUaGUgbmV3IHBvc2l0aW9uIG9uIHRoZSB4LWF4aXMgZm9yIHRoaXMgcGFnZSdzIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIHkgVGhlIG5ldyBwb3NpdGlvbiBvbiB0aGUgeS1heGlzIGZvciB0aGlzIHBhZ2UncyBjb250ZW50LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnRyYW5zbGF0ZUNvbnRlbnQgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLm5vZGUubm9ybWFsaXplKCk7XG4gICAgICAgIHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmNyZWF0ZUNvbnRlbnRTdHJlYW0ocHVzaEdyYXBoaWNzU3RhdGUoKSwgdHJhbnNsYXRlKHgsIHkpKTtcbiAgICAgICAgdmFyIHN0YXJ0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3RlcihzdGFydCk7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLmNyZWF0ZUNvbnRlbnRTdHJlYW0ocG9wR3JhcGhpY3NTdGF0ZSgpKTtcbiAgICAgICAgdmFyIGVuZFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIoZW5kKTtcbiAgICAgICAgdGhpcy5ub2RlLndyYXBDb250ZW50U3RyZWFtcyhzdGFydFJlZiwgZW5kUmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBzaXplLCBjb250ZW50LCBhbmQgYW5ub3RhdGlvbnMgb2YgYSBwYWdlLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLnNjYWxlKDAuNSwgMC41KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhlIHdpZHRoIGZvciB0aGUgcGFnZSBzaG91bGQgYmUgc2NhbGVkXG4gICAgICogICAgICAgICAgKGUuZy4gYDAuNWAgaXMgNTAlKS5cbiAgICAgKiBAcGFyYW0geSBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoZSBoZWlnaHQgZm9yIHRoZSBwYWdlIHNob3VsZCBiZSBzY2FsZWRcbiAgICAgKiAgICAgICAgICAoZS5nLiBgMi4wYCBpcyAyMDAlKS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zY2FsZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMuc2V0U2l6ZSh0aGlzLmdldFdpZHRoKCkgKiB4LCB0aGlzLmdldEhlaWdodCgpICogeSk7XG4gICAgICAgIHRoaXMuc2NhbGVDb250ZW50KHgsIHkpO1xuICAgICAgICB0aGlzLnNjYWxlQW5ub3RhdGlvbnMoeCwgeSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTY2FsZSB0aGUgY29udGVudCBvZiBhIHBhZ2UuIFRoaXMgaXMgdXNlZnVsIGFmdGVyIHJlc2l6aW5nIGFuIGV4aXN0aW5nXG4gICAgICogcGFnZS4gVGhpcyBzY2FsZXMgb25seSB0aGUgY29udGVudCwgbm90IHRoZSBhbm5vdGF0aW9ucy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gQmlzZWN0IHRoZSBzaXplIG9mIHRoZSBwYWdlXG4gICAgICogcGFnZS5zZXRTaXplKHBhZ2UuZ2V0V2lkdGgoKSAvIDIsIHBhZ2UuZ2V0SGVpZ2h0KCkgLyAyKTtcbiAgICAgKlxuICAgICAqIC8vIFNjYWxlIHRoZSBjb250ZW50IG9mIHRoZSBwYWdlIGRvd24gYnkgNTAlIGluIHggYW5kIHlcbiAgICAgKiBwYWdlLnNjYWxlQ29udGVudCgwLjUsIDAuNSk7XG4gICAgICogYGBgXG4gICAgICogU2VlIGFsc286IFtbc2NhbGVBbm5vdGF0aW9uc11dXG4gICAgICogQHBhcmFtIHggVGhlIGZhY3RvciBieSB3aGljaCB0aGUgeC1heGlzIGZvciB0aGUgY29udGVudCBzaG91bGQgYmUgc2NhbGVkXG4gICAgICogICAgICAgICAgKGUuZy4gYDAuNWAgaXMgNTAlKS5cbiAgICAgKiBAcGFyYW0geSBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoZSB5LWF4aXMgZm9yIHRoZSBjb250ZW50IHNob3VsZCBiZSBzY2FsZWRcbiAgICAgKiAgICAgICAgICAoZS5nLiBgMi4wYCBpcyAyMDAlKS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zY2FsZUNvbnRlbnQgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLm5vZGUubm9ybWFsaXplKCk7XG4gICAgICAgIHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmNyZWF0ZUNvbnRlbnRTdHJlYW0ocHVzaEdyYXBoaWNzU3RhdGUoKSwgc2NhbGUoeCwgeSkpO1xuICAgICAgICB2YXIgc3RhcnRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHN0YXJ0KTtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMuY3JlYXRlQ29udGVudFN0cmVhbShwb3BHcmFwaGljc1N0YXRlKCkpO1xuICAgICAgICB2YXIgZW5kUmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3RlcihlbmQpO1xuICAgICAgICB0aGlzLm5vZGUud3JhcENvbnRlbnRTdHJlYW1zKHN0YXJ0UmVmLCBlbmRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGFubm90YXRpb25zIG9mIGEgcGFnZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gc2NhbGUgYVxuICAgICAqIHBhZ2Ugd2l0aCBjb21tZW50cyBvciBvdGhlciBhbm5vdGF0aW9ucy5cbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIFNjYWxlIHRoZSBjb250ZW50IG9mIHRoZSBwYWdlIGRvd24gYnkgNTAlIGluIHggYW5kIHlcbiAgICAgKiBwYWdlLnNjYWxlQ29udGVudCgwLjUsIDAuNSk7XG4gICAgICpcbiAgICAgKiAvLyBTY2FsZSB0aGUgY29udGVudCBvZiB0aGUgcGFnZSBkb3duIGJ5IDUwJSBpbiB4IGFuZCB5XG4gICAgICogcGFnZS5zY2FsZUFubm90YXRpb25zKDAuNSwgMC41KTtcbiAgICAgKiBgYGBcbiAgICAgKiBTZWUgYWxzbzogW1tzY2FsZUNvbnRlbnRdXVxuICAgICAqIEBwYXJhbSB4IFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhlIHgtYXhpcyBmb3IgdGhlIGFubm90YXRpb25zIHNob3VsZCBiZVxuICAgICAqICAgICAgICAgIHNjYWxlZCAoZS5nLiBgMC41YCBpcyA1MCUpLlxuICAgICAqIEBwYXJhbSB5IFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhlIHktYXhpcyBmb3IgdGhlIGFubm90YXRpb25zIHNob3VsZCBiZVxuICAgICAqICAgICAgICAgIHNjYWxlZCAoZS5nLiBgMi4wYCBpcyAyMDAlKS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zY2FsZUFubm90YXRpb25zID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIGFubm90cyA9IHRoaXMubm9kZS5Bbm5vdHMoKTtcbiAgICAgICAgaWYgKCFhbm5vdHMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGFubm90cy5zaXplKCk7IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgYW5ub3QgPSBhbm5vdHMubG9va3VwKGlkeCk7XG4gICAgICAgICAgICBpZiAoYW5ub3QgaW5zdGFuY2VvZiBQREZEaWN0KVxuICAgICAgICAgICAgICAgIHRoaXMuc2NhbGVBbm5vdChhbm5vdCwgeCwgeSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIHRoaXMgcGFnZSB0byBgKDAsIDApYC4gVGhpcyBvcGVyYXRpb24gaXNcbiAgICAgKiBvZnRlbiB1c2VmdWwgYWZ0ZXIgY2FsbGluZyBbW3RyYW5zbGF0ZUNvbnRlbnRdXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBTaGlmdCB0aGUgcGFnZSdzIGNvbnRlbnRzIHVwIGFuZCB0byB0aGUgcmlnaHQgYnkgNTAgdW5pdHNcbiAgICAgKiBwYWdlLnRyYW5zbGF0ZUNvbnRlbnQoNTAsIDUwKVxuICAgICAqXG4gICAgICogLy8gVGhpcyB0ZXh0IHdpbGwgc2hpZnRlZCAtIGl0IHdpbGwgYmUgZHJhd24gYXQgKDUwLCA1MClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIGFtIHNoaWZ0ZWQnKVxuICAgICAqXG4gICAgICogLy8gTW92ZSBiYWNrIHRvICgwLCAwKVxuICAgICAqIHBhZ2UucmVzZXRQb3NpdGlvbigpXG4gICAgICpcbiAgICAgKiAvLyBUaGlzIHRleHQgd2lsbCBub3QgYmUgc2hpZnRlZCAtIGl0IHdpbGwgYmUgZHJhd24gYXQgKDAsIDApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSBhbSBub3Qgc2hpZnRlZCcpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUucmVzZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5nZXRDb250ZW50U3RyZWFtKGZhbHNlKTtcbiAgICAgICAgdGhpcy54ID0gMDtcbiAgICAgICAgdGhpcy55ID0gMDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSBhIGRlZmF1bHQgZm9udCBmb3IgdGhpcyBwYWdlLiBUaGUgZGVmYXVsdCBmb250IHdpbGwgYmUgdXNlZCB3aGVuZXZlclxuICAgICAqIHRleHQgaXMgZHJhd24gb24gdGhpcyBwYWdlIGFuZCBubyBmb250IGlzIHNwZWNpZmllZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBTdGFuZGFyZEZvbnRzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHRpbWVzUm9tYW5Gb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLlRpbWVzUm9tYW4pXG4gICAgICogY29uc3QgaGVsdmV0aWNhRm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgY291cmllckZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuQ291cmllcilcbiAgICAgKlxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEZvbnQoaGVsdmV0aWNhRm9udClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gSGVsdmV0aWNhJylcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Rm9udCh0aW1lc1JvbWFuRm9udClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gQ291cmllcicsIHsgZm9udDogY291cmllckZvbnQgfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZGVmYXVsdCBmb250IHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRleHQgb24gdGhpcyBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEZvbnQgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICAvLyBUT0RPOiBSZXVzZSBpbWFnZSBGb250IG5hbWUgaWYgd2UndmUgYWxyZWFkeSBhZGRlZCB0aGlzIGltYWdlIHRvIFJlc291cmNlcy5Gb250c1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICB0aGlzLmZvbnQgPSBmb250O1xuICAgICAgICB0aGlzLmZvbnRLZXkgPSB0aGlzLm5vZGUubmV3Rm9udERpY3Rpb25hcnkodGhpcy5mb250Lm5hbWUsIHRoaXMuZm9udC5yZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIGEgZGVmYXVsdCBmb250IHNpemUgZm9yIHRoaXMgcGFnZS4gVGhlIGRlZmF1bHQgZm9udCBzaXplIHdpbGwgYmVcbiAgICAgKiB1c2VkIHdoZW5ldmVyIHRleHQgaXMgZHJhd24gb24gdGhpcyBwYWdlIGFuZCBubyBmb250IHNpemUgaXMgc3BlY2lmaWVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5zZXRGb250U2l6ZSgxMilcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gc2l6ZSAxMicpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEZvbnRTaXplKDM2KVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBpbiBzaXplIDI0JywgeyBmb250U2l6ZTogMjQgfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udFNpemUgVGhlIGRlZmF1bHQgZm9udCBzaXplIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRleHQgb24gdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEZvbnRTaXplID0gZnVuY3Rpb24gKGZvbnRTaXplKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnRTaXplLCAnZm9udFNpemUnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IGZvbnRTaXplO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIGEgZGVmYXVsdCBmb250IGNvbG9yIGZvciB0aGlzIHBhZ2UuIFRoZSBkZWZhdWx0IGZvbnQgY29sb3Igd2lsbCBiZVxuICAgICAqIHVzZWQgd2hlbmV2ZXIgdGV4dCBpcyBkcmF3biBvbiB0aGlzIHBhZ2UgYW5kIG5vIGZvbnQgY29sb3IgaXMgc3BlY2lmaWVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgcmdiLCBjbXlrLCBncmF5c2NhbGUgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogcGFnZS5zZXRGb250Q29sb3IocmdiKDAuOTcsIDAuMDIsIDAuOTcpKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBpbiBwaW5rJylcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Rm9udENvbG9yKGNteWsoMC40LCAwLjcsIDAuMzksIDAuMTUpKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBpbiBncmF5JywgeyBjb2xvcjogZ3JheXNjYWxlKDAuNSkgfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udENvbG9yIFRoZSBkZWZhdWx0IGZvbnQgY29sb3IgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGV4dCBvblxuICAgICAqICAgICAgICAgICAgICAgICAgdGhpcyBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEZvbnRDb2xvciA9IGZ1bmN0aW9uIChmb250Q29sb3IpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udENvbG9yLCAnZm9udENvbG9yJywgW1tPYmplY3QsICdDb2xvciddXSk7XG4gICAgICAgIHRoaXMuZm9udENvbG9yID0gZm9udENvbG9yO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIGEgZGVmYXVsdCBsaW5lIGhlaWdodCBmb3IgdGhpcyBwYWdlLiBUaGUgZGVmYXVsdCBsaW5lIGhlaWdodCB3aWxsIGJlXG4gICAgICogdXNlZCB3aGVuZXZlciB0ZXh0IGlzIGRyYXduIG9uIHRoaXMgcGFnZSBhbmQgbm8gbGluZSBoZWlnaHQgaXMgc3BlY2lmaWVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5zZXRMaW5lSGVpZ2h0KDEyKTtcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdUaGVzZSBsaW5lcyB3aWxsIGJlIHZlcnRpY2FsbHkgXFxuIHNlcGFyYXRlZCBieSAxMiB1bml0cycpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldExpbmVIZWlnaHQoMzYpO1xuICAgICAqIHBhZ2UuZHJhd1RleHQoJ1RoZXNlIGxpbmVzIHdpbGwgYmUgdmVydGljYWxseSBcXG4gc2VwYXJhdGVkIGJ5IDI0IHVuaXRzJywge1xuICAgICAqICAgbGluZUhlaWdodDogMjRcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBsaW5lSGVpZ2h0IFRoZSBkZWZhdWx0IGxpbmUgaGVpZ2h0IHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRleHQgb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB0aGlzIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0TGluZUhlaWdodCA9IGZ1bmN0aW9uIChsaW5lSGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKGxpbmVIZWlnaHQsICdsaW5lSGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMubGluZUhlaWdodCA9IGxpbmVIZWlnaHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgeCwgeSB9ID0gcGFnZS5nZXRQb3NpdGlvbigpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7IHg6IHRoaXMueCwgeTogdGhpcy55IH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgeCBjb29yZGluYXRlIG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB4ID0gcGFnZS5nZXRYKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCB4IGNvb3JkaW5hdGUgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGVmYXVsdCB5IGNvb3JkaW5hdGUgb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHkgPSBwYWdlLmdldFkoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IHkgY29vcmRpbmF0ZSBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy55O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLm1vdmVUbygwLCAwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCB0aGUgb3JpZ2luJylcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZVRvKDAsIDI1KVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biAyNSB1bml0cyB1cCcpXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVUbygyNSwgMjUpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIDI1IHVuaXRzIHVwIGFuZCAyNSB1bml0cyB0byB0aGUgcmlnaHQnKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB4IFRoZSBuZXcgZGVmYXVsdCBwb3NpdGlvbiBvbiB0aGUgeC1heGlzIGZvciB0aGlzIHBhZ2UuXG4gICAgICogQHBhcmFtIHkgVGhlIG5ldyBkZWZhdWx0IHBvc2l0aW9uIG9uIHRoZSB5LWF4aXMgZm9yIHRoaXMgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoaXMgcGFnZSB0byBiZSBmdXJ0aGVyIGRvd24gdGhlIHktYXhpcy5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2UubW92ZVRvKDUwLCA1MClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDUwLCA1MCknKVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlRG93bigxMClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDUwLCA0MCknKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB5RGVjcmVhc2UgVGhlIGFtb3VudCBieSB3aGljaCB0aGUgcGFnZSdzIGRlZmF1bHQgcG9zaXRpb24gYWxvbmcgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICB5LWF4aXMgc2hvdWxkIGJlIGRlY3JlYXNlZC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5tb3ZlRG93biA9IGZ1bmN0aW9uICh5RGVjcmVhc2UpIHtcbiAgICAgICAgYXNzZXJ0SXMoeURlY3JlYXNlLCAneURlY3JlYXNlJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMueSAtPSB5RGVjcmVhc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhpcyBwYWdlIHRvIGJlIGZ1cnRoZXIgdXAgdGhlIHktYXhpcy5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2UubW92ZVRvKDUwLCA1MClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDUwLCA1MCknKVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlVXAoMTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNjApJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0geUluY3JlYXNlIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHBhZ2UncyBkZWZhdWx0IHBvc2l0aW9uIGFsb25nIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgeS1heGlzIHNob3VsZCBiZSBpbmNyZWFzZWQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUubW92ZVVwID0gZnVuY3Rpb24gKHlJbmNyZWFzZSkge1xuICAgICAgICBhc3NlcnRJcyh5SW5jcmVhc2UsICd5SW5jcmVhc2UnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy55ICs9IHlJbmNyZWFzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgZGVmYXVsdCBwb3NpdGlvbiBvZiB0aGlzIHBhZ2UgdG8gYmUgZnVydGhlciBsZWZ0IG9uIHRoZSB4LWF4aXMuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLm1vdmVUbyg1MCwgNTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNTApJylcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZUxlZnQoMTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg0MCwgNTApJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0geERlY3JlYXNlIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHBhZ2UncyBkZWZhdWx0IHBvc2l0aW9uIGFsb25nIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgeC1heGlzIHNob3VsZCBiZSBkZWNyZWFzZWQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUubW92ZUxlZnQgPSBmdW5jdGlvbiAoeERlY3JlYXNlKSB7XG4gICAgICAgIGFzc2VydElzKHhEZWNyZWFzZSwgJ3hEZWNyZWFzZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnggLT0geERlY3JlYXNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoaXMgcGFnZSB0byBiZSBmdXJ0aGVyIHJpZ2h0IG9uIHRoZSB5LWF4aXMuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLm1vdmVUbyg1MCwgNTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNTApJylcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZVJpZ2h0KDEwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNjAsIDUwKScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHhJbmNyZWFzZSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBwYWdlJ3MgZGVmYXVsdCBwb3NpdGlvbiBhbG9uZyB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgIHgtYXhpcyBzaG91bGQgYmUgaW5jcmVhc2VkLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLm1vdmVSaWdodCA9IGZ1bmN0aW9uICh4SW5jcmVhc2UpIHtcbiAgICAgICAgYXNzZXJ0SXMoeEluY3JlYXNlLCAneEluY3JlYXNlJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMueCArPSB4SW5jcmVhc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQdXNoIG9uZSBvciBtb3JlIG9wZXJhdG9ycyB0byB0aGUgZW5kIG9mIHRoaXMgcGFnZSdzIGN1cnJlbnQgY29udGVudFxuICAgICAqIHN0cmVhbS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQge1xuICAgICAqICAgcHVzaEdyYXBoaWNzU3RhdGUsXG4gICAgICogICBtb3ZlVG8sXG4gICAgICogICBsaW5lVG8sXG4gICAgICogICBjbG9zZVBhdGgsXG4gICAgICogICBzZXRGaWxsaW5nQ29sb3IsXG4gICAgICogICByZ2IsXG4gICAgICogICBmaWxsLFxuICAgICAqICAgcG9wR3JhcGhpY3NTdGF0ZSxcbiAgICAgKiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiAvLyBEcmF3IGEgZ3JlZW4gdHJpYW5nbGUgaW4gdGhlIGxvd2VyLWxlZnQgY29ybmVyIG9mIHRoZSBwYWdlXG4gICAgICogcGFnZS5wdXNoT3BlcmF0b3JzKFxuICAgICAqICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgKiAgIG1vdmVUbygwLCAwKSxcbiAgICAgKiAgIGxpbmVUbygxMDAsIDApLFxuICAgICAqICAgbGluZVRvKDUwLCAxMDApLFxuICAgICAqICAgY2xvc2VQYXRoKCksXG4gICAgICogICBzZXRGaWxsaW5nQ29sb3IocmdiKDAuMCwgMS4wLCAwLjApKSxcbiAgICAgKiAgIGZpbGwoKSxcbiAgICAgKiAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wZXJhdG9yIFRoZSBvcGVyYXRvcnMgdG8gYmUgcHVzaGVkLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnB1c2hPcGVyYXRvcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvcGVyYXRvciA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgb3BlcmF0b3JbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRFYWNoSXMob3BlcmF0b3IsICdvcGVyYXRvcicsIFtbUERGT3BlcmF0b3IsICdQREZPcGVyYXRvciddXSk7XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIGNvbnRlbnRTdHJlYW0ucHVzaC5hcHBseShjb250ZW50U3RyZWFtLCBvcGVyYXRvcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IG9uZSBvciBtb3JlIGxpbmVzIG9mIHRleHQgb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFN0YW5kYXJkRm9udHMsIHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2FGb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCB0aW1lc1JvbWFuRm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5UaW1lc1JvbWFuKVxuICAgICAqXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Rm9udChoZWx2ZXRpY2FGb250KVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlVG8oNSwgMjAwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ1RoZSBMaWZlIG9mIGFuIEVnZycsIHsgc2l6ZTogMzYgfSlcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZURvd24oMzYpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnQW4gRXBpYyBUYWxlIG9mIFdvZScsIHsgc2l6ZTogMzAgfSlcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd1RleHQoXG4gICAgICogICBgSHVtcHR5IER1bXB0eSBzYXQgb24gYSB3YWxsIFxcbmAgK1xuICAgICAqICAgYEh1bXB0eSBEdW1wdHkgaGFkIGEgZ3JlYXQgZmFsbDsgXFxuYCArXG4gICAgICogICBgQWxsIHRoZSBraW5nJ3MgaG9yc2VzIGFuZCBhbGwgdGhlIGtpbmcncyBtZW4gXFxuYCArXG4gICAgICogICBgQ291bGRuJ3QgcHV0IEh1bXB0eSB0b2dldGhlciBhZ2Fpbi4gXFxuYCxcbiAgICAgKiAgIHtcbiAgICAgKiAgICAgeDogMjUsXG4gICAgICogICAgIHk6IDEwMCxcbiAgICAgKiAgICAgZm9udDogdGltZXNSb21hbkZvbnQsXG4gICAgICogICAgIHNpemU6IDI0LFxuICAgICAqICAgICBjb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgICBsaW5lSGVpZ2h0OiAyNCxcbiAgICAgKiAgICAgb3BhY2l0eTogMC43NSxcbiAgICAgKiAgIH0sXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIGRyYXduLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSB0ZXh0LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdUZXh0ID0gZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBhc3NlcnRJcyh0ZXh0LCAndGV4dCcsIFsnc3RyaW5nJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmNvbG9yLCAnb3B0aW9ucy5jb2xvcicsIFtbT2JqZWN0LCAnQ29sb3InXV0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmZvbnQsICdvcHRpb25zLmZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5zaXplLCAnb3B0aW9ucy5zaXplJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2tldywgJ29wdGlvbnMueFNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55U2tldywgJ29wdGlvbnMueVNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueSwgJ29wdGlvbnMueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmxpbmVIZWlnaHQsICdvcHRpb25zLmxpbmVIZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5tYXhXaWR0aCwgJ29wdGlvbnMubWF4V2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy53b3JkQnJlYWtzLCAnb3B0aW9ucy53b3JkQnJlYWtzJywgW0FycmF5XSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIF9oID0gdGhpcy5zZXRPckVtYmVkRm9udChvcHRpb25zLmZvbnQpLCBvbGRGb250ID0gX2gub2xkRm9udCwgbmV3Rm9udCA9IF9oLm5ld0ZvbnQsIG5ld0ZvbnRLZXkgPSBfaC5uZXdGb250S2V5O1xuICAgICAgICB2YXIgZm9udFNpemUgPSBvcHRpb25zLnNpemUgfHwgdGhpcy5mb250U2l6ZTtcbiAgICAgICAgdmFyIHdvcmRCcmVha3MgPSBvcHRpb25zLndvcmRCcmVha3MgfHwgdGhpcy5kb2MuZGVmYXVsdFdvcmRCcmVha3M7XG4gICAgICAgIHZhciB0ZXh0V2lkdGggPSBmdW5jdGlvbiAodCkgeyByZXR1cm4gbmV3Rm9udC53aWR0aE9mVGV4dEF0U2l6ZSh0LCBmb250U2l6ZSk7IH07XG4gICAgICAgIHZhciBsaW5lcyA9IG9wdGlvbnMubWF4V2lkdGggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBsaW5lU3BsaXQoY2xlYW5UZXh0KHRleHQpKVxuICAgICAgICAgICAgOiBicmVha1RleHRJbnRvTGluZXModGV4dCwgd29yZEJyZWFrcywgb3B0aW9ucy5tYXhXaWR0aCwgdGV4dFdpZHRoKTtcbiAgICAgICAgdmFyIGVuY29kZWRMaW5lcyA9IG5ldyBBcnJheShsaW5lcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGVuY29kZWRMaW5lc1tpZHhdID0gbmV3Rm9udC5lbmNvZGVUZXh0KGxpbmVzW2lkeF0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdMaW5lc09mVGV4dChlbmNvZGVkTGluZXMsIHtcbiAgICAgICAgICAgIGNvbG9yOiAoX2EgPSBvcHRpb25zLmNvbG9yKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmZvbnRDb2xvcixcbiAgICAgICAgICAgIGZvbnQ6IG5ld0ZvbnRLZXksXG4gICAgICAgICAgICBzaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9iID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB4U2tldzogKF9jID0gb3B0aW9ucy54U2tldykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHlTa2V3OiAoX2QgPSBvcHRpb25zLnlTa2V3KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeDogKF9lID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2YgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IHRoaXMueSxcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IChfZyA9IG9wdGlvbnMubGluZUhlaWdodCkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdGhpcy5saW5lSGVpZ2h0LFxuICAgICAgICAgICAgZ3JhcGhpY3NTdGF0ZTogZ3JhcGhpY3NTdGF0ZUtleSxcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAob3B0aW9ucy5mb250KSB7XG4gICAgICAgICAgICBpZiAob2xkRm9udClcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvbnQob2xkRm9udCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvbnQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBhbiBpbWFnZSBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBqcGdVcmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvY2F0X3JpZGluZ191bmljb3JuLmpwZydcbiAgICAgKiBjb25zdCBqcGdJbWFnZUJ5dGVzID0gYXdhaXQgZmV0Y2goanBnVXJsKS50aGVuKChyZXMpID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqXG4gICAgICogY29uc3QganBnSW1hZ2UgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcoanBnSW1hZ2VCeXRlcylcbiAgICAgKiBjb25zdCBqcGdEaW1zID0ganBnSW1hZ2Uuc2NhbGUoMC41KVxuICAgICAqXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd0ltYWdlKGpwZ0ltYWdlLCB7XG4gICAgICogICB4OiAyNSxcbiAgICAgKiAgIHk6IDI1LFxuICAgICAqICAgd2lkdGg6IGpwZ0RpbXMud2lkdGgsXG4gICAgICogICBoZWlnaHQ6IGpwZ0RpbXMuaGVpZ2h0LFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDMwKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRvIGJlIGRyYXduLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBpbWFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3SW1hZ2UgPSBmdW5jdGlvbiAoaW1hZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICAvLyBUT0RPOiBSZXVzZSBpbWFnZSBYT2JqZWN0IG5hbWUgaWYgd2UndmUgYWxyZWFkeSBhZGRlZCB0aGlzIGltYWdlIHRvIFJlc291cmNlcy5YT2JqZWN0c1xuICAgICAgICBhc3NlcnRJcyhpbWFnZSwgJ2ltYWdlJywgW1tQREZJbWFnZSwgJ1BERkltYWdlJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueSwgJ29wdGlvbnMueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLndpZHRoLCAnb3B0aW9ucy53aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmhlaWdodCwgJ29wdGlvbnMuaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2tldywgJ29wdGlvbnMueFNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55U2tldywgJ29wdGlvbnMueVNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYmxlbmRNb2RlLCAnb3B0aW9ucy5ibGVuZE1vZGUnLCBCbGVuZE1vZGUpO1xuICAgICAgICB2YXIgeE9iamVjdEtleSA9IHRoaXMubm9kZS5uZXdYT2JqZWN0KCdJbWFnZScsIGltYWdlLnJlZik7XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdJbWFnZSh4T2JqZWN0S2V5LCB7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMueCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdGhpcy55LFxuICAgICAgICAgICAgd2lkdGg6IChfYyA9IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGltYWdlLnNpemUoKS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGltYWdlLnNpemUoKS5oZWlnaHQsXG4gICAgICAgICAgICByb3RhdGU6IChfZSA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeFNrZXc6IChfZiA9IG9wdGlvbnMueFNrZXcpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB5U2tldzogKF9nID0gb3B0aW9ucy55U2tldykgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYW4gZW1iZWRkZWQgUERGIHBhZ2Ugb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3Qgc291cmNlUGRmVXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL3dpdGhfbGFyZ2VfcGFnZV9jb3VudC5wZGYnXG4gICAgICogY29uc3Qgc291cmNlUGRmID0gYXdhaXQgZmV0Y2goc291cmNlUGRmVXJsKS50aGVuKChyZXMpID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqXG4gICAgICogLy8gRW1iZWQgcGFnZSA3NCBmcm9tIHRoZSBQREZcbiAgICAgKiBjb25zdCBbZW1iZWRkZWRQYWdlXSA9IGF3YWl0IHBkZkRvYy5lbWJlZFBkZihzb3VyY2VQZGYsIDczKVxuICAgICAqXG4gICAgICogcGFnZS5kcmF3UGFnZShlbWJlZGRlZFBhZ2UsIHtcbiAgICAgKiAgIHg6IDI1MCxcbiAgICAgKiAgIHk6IDIwMCxcbiAgICAgKiAgIHhTY2FsZTogMC41LFxuICAgICAqICAgeVNjYWxlOiAwLjUsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoMzApLFxuICAgICAqICAgb3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGBvcHRpb25zYCBhcmd1bWVudCBhY2NlcHRzIGJvdGggYHdpZHRoYC9gaGVpZ2h0YCBhbmQgYHhTY2FsZWAvYHlTY2FsZWBcbiAgICAgKiBhcyBvcHRpb25zLiBTaW5jZSBlYWNoIG9mIHRoZXNlIG9wdGlvbnMgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgZHJhd24gcGFnZSxcbiAgICAgKiBpZiBib3RoIG9wdGlvbnMgYXJlIGdpdmVuLCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCB0YWtlIHByZWNlZGVuY2UgYW5kIHRoZVxuICAgICAqIGNvcnJlc3BvbmRpbmcgc2NhbGUgdmFyaWFudHMgYXJlIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW1iZWRkZWRQYWdlIFRoZSBlbWJlZGRlZCBwYWdlIHRvIGJlIGRyYXduLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBlbWJlZGRlZCBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdQYWdlID0gZnVuY3Rpb24gKGVtYmVkZGVkUGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICAvLyBUT0RPOiBSZXVzZSBlbWJlZGRlZFBhZ2UgWE9iamVjdCBuYW1lIGlmIHdlJ3ZlIGFscmVhZHkgYWRkZWQgdGhpcyBlbWJlZGRlZFBhZ2UgdG8gUmVzb3VyY2VzLlhPYmplY3RzXG4gICAgICAgIGFzc2VydElzKGVtYmVkZGVkUGFnZSwgJ2VtYmVkZGVkUGFnZScsIFtcbiAgICAgICAgICAgIFtQREZFbWJlZGRlZFBhZ2UsICdQREZFbWJlZGRlZFBhZ2UnXSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2NhbGUsICdvcHRpb25zLnhTY2FsZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnlTY2FsZSwgJ29wdGlvbnMueVNjYWxlJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMud2lkdGgsICdvcHRpb25zLndpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuaGVpZ2h0LCAnb3B0aW9ucy5oZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5yb3RhdGUsICdvcHRpb25zLnJvdGF0ZScsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnhTa2V3LCAnb3B0aW9ucy54U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnlTa2V3LCAnb3B0aW9ucy55U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciB4T2JqZWN0S2V5ID0gdGhpcy5ub2RlLm5ld1hPYmplY3QoJ0VtYmVkZGVkUGRmUGFnZScsIGVtYmVkZGVkUGFnZS5yZWYpO1xuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZUtleSA9IHRoaXMubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogb3B0aW9ucy5vcGFjaXR5LFxuICAgICAgICAgICAgYmxlbmRNb2RlOiBvcHRpb25zLmJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB2YXIgeFNjYWxlID0gKG9wdGlvbnMud2lkdGggIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMud2lkdGggLyBlbWJlZGRlZFBhZ2Uud2lkdGhcbiAgICAgICAgICAgIDogb3B0aW9ucy54U2NhbGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMueFNjYWxlXG4gICAgICAgICAgICAgICAgOiAxKTtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHZhciB5U2NhbGUgPSAob3B0aW9ucy5oZWlnaHQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuaGVpZ2h0IC8gZW1iZWRkZWRQYWdlLmhlaWdodFxuICAgICAgICAgICAgOiBvcHRpb25zLnlTY2FsZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy55U2NhbGVcbiAgICAgICAgICAgICAgICA6IDEpO1xuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd1BhZ2UoeE9iamVjdEtleSwge1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMueSxcbiAgICAgICAgICAgIHhTY2FsZTogeFNjYWxlLFxuICAgICAgICAgICAgeVNjYWxlOiB5U2NhbGUsXG4gICAgICAgICAgICByb3RhdGU6IChfYyA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeFNrZXc6IChfZCA9IG9wdGlvbnMueFNrZXcpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB5U2tldzogKF9lID0gb3B0aW9ucy55U2tldykgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYW4gU1ZHIHBhdGggb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBzdmdQYXRoID0gJ00gMCwyMCBMIDEwMCwxNjAgUSAxMzAsMjAwIDE1MCwxMjAgQyAxOTAsLTQwIDIwMCwyMDAgMzAwLDE1MCBMIDQwMCw5MCdcbiAgICAgKlxuICAgICAqIC8vIERyYXcgcGF0aCBhcyBibGFjayBsaW5lXG4gICAgICogcGFnZS5kcmF3U3ZnUGF0aChzdmdQYXRoLCB7IHg6IDI1LCB5OiA3NSB9KVxuICAgICAqXG4gICAgICogLy8gQ2hhbmdlIGJvcmRlciBzdHlsZSBhbmQgb3BhY2l0eVxuICAgICAqIHBhZ2UuZHJhd1N2Z1BhdGgoc3ZnUGF0aCwge1xuICAgICAqICAgeDogMjUsXG4gICAgICogICB5OiAyNzUsXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAuNSwgMC41LCAwLjUpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICBib3JkZXJPcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICpcbiAgICAgKiAvLyBTZXQgZmlsbCBjb2xvciBhbmQgb3BhY2l0eVxuICAgICAqIHBhZ2UuZHJhd1N2Z1BhdGgoc3ZnUGF0aCwge1xuICAgICAqICAgeDogMjUsXG4gICAgICogICB5OiA0NzUsXG4gICAgICogICBjb2xvcjogcmdiKDEuMCwgMCwgMCksXG4gICAgICogICBvcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICpcbiAgICAgKiAvLyBEcmF3IDUwJSBvZiBvcmlnaW5hbCBzaXplXG4gICAgICogcGFnZS5kcmF3U3ZnUGF0aChzdmdQYXRoLCB7XG4gICAgICogICB4OiAyNSxcbiAgICAgKiAgIHk6IDY3NSxcbiAgICAgKiAgIHNjYWxlOiAwLjUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcGF0aCBUaGUgU1ZHIHBhdGggdG8gYmUgZHJhd24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIFNWRyBwYXRoLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdTdmdQYXRoID0gZnVuY3Rpb24gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2o7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIGFzc2VydElzKHBhdGgsICdwYXRoJywgWydzdHJpbmcnXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5zY2FsZSwgJ29wdGlvbnMuc2NhbGUnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5yb3RhdGUsICdvcHRpb25zLnJvdGF0ZScsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlcldpZHRoLCAnb3B0aW9ucy5ib3JkZXJXaWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmNvbG9yLCAnb3B0aW9ucy5jb2xvcicsIFtbT2JqZWN0LCAnQ29sb3InXV0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckNvbG9yLCAnb3B0aW9ucy5ib3JkZXJDb2xvcicsIFtcbiAgICAgICAgICAgIFtPYmplY3QsICdDb2xvciddLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoQXJyYXksICdvcHRpb25zLmJvcmRlckRhc2hBcnJheScsIFtcbiAgICAgICAgICAgIEFycmF5LFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UsICdvcHRpb25zLmJvcmRlckRhc2hQaGFzZScsIFtcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyTGluZUNhcCwgJ29wdGlvbnMuYm9yZGVyTGluZUNhcCcsIExpbmVDYXBTdHlsZSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJPcGFjaXR5LCAnb3B0aW9ucy5ib3JkZXJPcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGVLZXkgPSB0aGlzLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgIGJvcmRlck9wYWNpdHk6IG9wdGlvbnMuYm9yZGVyT3BhY2l0eSxcbiAgICAgICAgICAgIGJsZW5kTW9kZTogb3B0aW9ucy5ibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoISgnY29sb3InIGluIG9wdGlvbnMpICYmICEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd1N2Z1BhdGgocGF0aCwge1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMueSxcbiAgICAgICAgICAgIHNjYWxlOiBvcHRpb25zLnNjYWxlLFxuICAgICAgICAgICAgcm90YXRlOiAoX2MgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGNvbG9yOiAoX2QgPSBvcHRpb25zLmNvbG9yKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogKF9lID0gb3B0aW9ucy5ib3JkZXJDb2xvcikgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfZiA9IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDAsXG4gICAgICAgICAgICBib3JkZXJEYXNoQXJyYXk6IChfZyA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJEYXNoUGhhc2U6IChfaCA9IG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJMaW5lQ2FwOiAoX2ogPSBvcHRpb25zLmJvcmRlckxpbmVDYXApICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYSBsaW5lIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyByZ2IgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogcGFnZS5kcmF3TGluZSh7XG4gICAgICogICBzdGFydDogeyB4OiAyNSwgeTogNzUgfSxcbiAgICAgKiAgIGVuZDogeyB4OiAxMjUsIHk6IDE3NSB9LFxuICAgICAqICAgdGhpY2tuZXNzOiAyLFxuICAgICAqICAgY29sb3I6IHJnYigwLjc1LCAwLjIsIDAuMiksXG4gICAgICogICBvcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIGxpbmUuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd0xpbmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLnN0YXJ0LCAnb3B0aW9ucy5zdGFydCcsIFtcbiAgICAgICAgICAgIFtPYmplY3QsICd7IHg6IG51bWJlciwgeTogbnVtYmVyIH0nXSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMuZW5kLCAnb3B0aW9ucy5lbmQnLCBbXG4gICAgICAgICAgICBbT2JqZWN0LCAneyB4OiBudW1iZXIsIHk6IG51bWJlciB9J10sXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLnN0YXJ0LngsICdvcHRpb25zLnN0YXJ0LngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucy5zdGFydC55LCAnb3B0aW9ucy5zdGFydC55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMuZW5kLngsICdvcHRpb25zLmVuZC54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMuZW5kLnksICdvcHRpb25zLmVuZC55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMudGhpY2tuZXNzLCAnb3B0aW9ucy50aGlja25lc3MnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jb2xvciwgJ29wdGlvbnMuY29sb3InLCBbW09iamVjdCwgJ0NvbG9yJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5kYXNoQXJyYXksICdvcHRpb25zLmRhc2hBcnJheScsIFtBcnJheV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmRhc2hQaGFzZSwgJ29wdGlvbnMuZGFzaFBoYXNlJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmxpbmVDYXAsICdvcHRpb25zLmxpbmVDYXAnLCBMaW5lQ2FwU3R5bGUpO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBib3JkZXJPcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCEoJ2NvbG9yJyBpbiBvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd0xpbmUoe1xuICAgICAgICAgICAgc3RhcnQ6IG9wdGlvbnMuc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IG9wdGlvbnMuZW5kLFxuICAgICAgICAgICAgdGhpY2tuZXNzOiAoX2EgPSBvcHRpb25zLnRoaWNrbmVzcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMSxcbiAgICAgICAgICAgIGNvbG9yOiAoX2IgPSBvcHRpb25zLmNvbG9yKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkYXNoQXJyYXk6IChfYyA9IG9wdGlvbnMuZGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkYXNoUGhhc2U6IChfZCA9IG9wdGlvbnMuZGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBsaW5lQ2FwOiAoX2UgPSBvcHRpb25zLmxpbmVDYXApICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYSByZWN0YW5nbGUgb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGRlZ3JlZXMsIGdyYXlzY2FsZSwgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd1JlY3RhbmdsZSh7XG4gICAgICogICB4OiAyNSxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgd2lkdGg6IDI1MCxcbiAgICAgKiAgIGhlaWdodDogNzUsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoLTE1KSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiA1LFxuICAgICAqICAgYm9yZGVyQ29sb3I6IGdyYXlzY2FsZSgwLjUpLFxuICAgICAqICAgY29sb3I6IHJnYigwLjc1LCAwLjIsIDAuMiksXG4gICAgICogICBvcGFjaXR5OiAwLjUsXG4gICAgICogICBib3JkZXJPcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIHJlY3RhbmdsZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3UmVjdGFuZ2xlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX20sIF9vO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLngsICdvcHRpb25zLngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55LCAnb3B0aW9ucy55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMud2lkdGgsICdvcHRpb25zLndpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuaGVpZ2h0LCAnb3B0aW9ucy5oZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5yb3RhdGUsICdvcHRpb25zLnJvdGF0ZScsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnhTa2V3LCAnb3B0aW9ucy54U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnlTa2V3LCAnb3B0aW9ucy55U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlcldpZHRoLCAnb3B0aW9ucy5ib3JkZXJXaWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmNvbG9yLCAnb3B0aW9ucy5jb2xvcicsIFtbT2JqZWN0LCAnQ29sb3InXV0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckNvbG9yLCAnb3B0aW9ucy5ib3JkZXJDb2xvcicsIFtcbiAgICAgICAgICAgIFtPYmplY3QsICdDb2xvciddLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoQXJyYXksICdvcHRpb25zLmJvcmRlckRhc2hBcnJheScsIFtcbiAgICAgICAgICAgIEFycmF5LFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UsICdvcHRpb25zLmJvcmRlckRhc2hQaGFzZScsIFtcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyTGluZUNhcCwgJ29wdGlvbnMuYm9yZGVyTGluZUNhcCcsIExpbmVDYXBTdHlsZSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJPcGFjaXR5LCAnb3B0aW9ucy5ib3JkZXJPcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGVLZXkgPSB0aGlzLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgIGJvcmRlck9wYWNpdHk6IG9wdGlvbnMuYm9yZGVyT3BhY2l0eSxcbiAgICAgICAgICAgIGJsZW5kTW9kZTogb3B0aW9ucy5ibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoISgnY29sb3InIGluIG9wdGlvbnMpICYmICEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd1JlY3RhbmdsZSh7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMueCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdGhpcy55LFxuICAgICAgICAgICAgd2lkdGg6IChfYyA9IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDE1MCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDEwMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9lID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB4U2tldzogKF9mID0gb3B0aW9ucy54U2tldykgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHlTa2V3OiAoX2cgPSBvcHRpb25zLnlTa2V3KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfaCA9IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDAsXG4gICAgICAgICAgICBjb2xvcjogKF9qID0gb3B0aW9ucy5jb2xvcikgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IChfayA9IG9wdGlvbnMuYm9yZGVyQ29sb3IpICE9PSBudWxsICYmIF9rICE9PSB2b2lkIDAgPyBfayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckRhc2hBcnJheTogKF9sID0gb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXkpICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckRhc2hQaGFzZTogKF9tID0gb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UpICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgICAgICBib3JkZXJMaW5lQ2FwOiAoX28gPSBvcHRpb25zLmJvcmRlckxpbmVDYXApICE9PSBudWxsICYmIF9vICE9PSB2b2lkIDAgPyBfbyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBhIHNxdWFyZSBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgZGVncmVlcywgZ3JheXNjYWxlLCByZ2IgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogcGFnZS5kcmF3U3F1YXJlKHtcbiAgICAgKiAgIHg6IDI1LFxuICAgICAqICAgeTogNzUsXG4gICAgICogICBzaXplOiAxMDAsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoLTE1KSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiA1LFxuICAgICAqICAgYm9yZGVyQ29sb3I6IGdyYXlzY2FsZSgwLjUpLFxuICAgICAqICAgY29sb3I6IHJnYigwLjc1LCAwLjIsIDAuMiksXG4gICAgICogICBvcGFjaXR5OiAwLjUsXG4gICAgICogICBib3JkZXJPcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIHNxdWFyZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3U3F1YXJlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIHNpemUgPSBvcHRpb25zLnNpemU7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHNpemUsICdzaXplJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMuZHJhd1JlY3RhbmdsZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgd2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZSB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGFuIGVsbGlwc2Ugb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGdyYXlzY2FsZSwgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd0VsbGlwc2Uoe1xuICAgICAqICAgeDogMjAwLFxuICAgICAqICAgeTogNzUsXG4gICAgICogICB4U2NhbGU6IDEwMCxcbiAgICAgKiAgIHlTY2FsZTogNTAsXG4gICAgICogICBib3JkZXJXaWR0aDogNSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiBncmF5c2NhbGUoMC41KSxcbiAgICAgKiAgIGNvbG9yOiByZ2IoMC43NSwgMC4yLCAwLjIpLFxuICAgICAqICAgb3BhY2l0eTogMC41LFxuICAgICAqICAgYm9yZGVyT3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBlbGxpcHNlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdFbGxpcHNlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbDtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueSwgJ29wdGlvbnMueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnhTY2FsZSwgJ29wdGlvbnMueFNjYWxlJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueVNjYWxlLCAnb3B0aW9ucy55U2NhbGUnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5yb3RhdGUsICdvcHRpb25zLnJvdGF0ZScsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmNvbG9yLCAnb3B0aW9ucy5jb2xvcicsIFtbT2JqZWN0LCAnQ29sb3InXV0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckNvbG9yLCAnb3B0aW9ucy5ib3JkZXJDb2xvcicsIFtcbiAgICAgICAgICAgIFtPYmplY3QsICdDb2xvciddLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlck9wYWNpdHksICdvcHRpb25zLmJvcmRlck9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJXaWR0aCwgJ29wdGlvbnMuYm9yZGVyV2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoQXJyYXksICdvcHRpb25zLmJvcmRlckRhc2hBcnJheScsIFtcbiAgICAgICAgICAgIEFycmF5LFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UsICdvcHRpb25zLmJvcmRlckRhc2hQaGFzZScsIFtcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyTGluZUNhcCwgJ29wdGlvbnMuYm9yZGVyTGluZUNhcCcsIExpbmVDYXBTdHlsZSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGVLZXkgPSB0aGlzLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgIGJvcmRlck9wYWNpdHk6IG9wdGlvbnMuYm9yZGVyT3BhY2l0eSxcbiAgICAgICAgICAgIGJsZW5kTW9kZTogb3B0aW9ucy5ibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoISgnY29sb3InIGluIG9wdGlvbnMpICYmICEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd0VsbGlwc2Uoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMueSxcbiAgICAgICAgICAgIHhTY2FsZTogKF9jID0gb3B0aW9ucy54U2NhbGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDEwMCxcbiAgICAgICAgICAgIHlTY2FsZTogKF9kID0gb3B0aW9ucy55U2NhbGUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDEwMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9lID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbG9yOiAoX2YgPSBvcHRpb25zLmNvbG9yKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogKF9nID0gb3B0aW9ucy5ib3JkZXJDb2xvcikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfaCA9IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDAsXG4gICAgICAgICAgICBib3JkZXJEYXNoQXJyYXk6IChfaiA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJEYXNoUGhhc2U6IChfayA9IG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJMaW5lQ2FwOiAoX2wgPSBvcHRpb25zLmJvcmRlckxpbmVDYXApICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYSBjaXJjbGUgb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGdyYXlzY2FsZSwgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd0NpcmNsZSh7XG4gICAgICogICB4OiAyMDAsXG4gICAgICogICB5OiAxNTAsXG4gICAgICogICBzaXplOiAxMDAsXG4gICAgICogICBib3JkZXJXaWR0aDogNSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiBncmF5c2NhbGUoMC41KSxcbiAgICAgKiAgIGNvbG9yOiByZ2IoMC43NSwgMC4yLCAwLjIpLFxuICAgICAqICAgb3BhY2l0eTogMC41LFxuICAgICAqICAgYm9yZGVyT3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBlbGxpcHNlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdDaXJjbGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgX2EgPSBvcHRpb25zLnNpemUsIHNpemUgPSBfYSA9PT0gdm9pZCAwID8gMTAwIDogX2E7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHNpemUsICdzaXplJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMuZHJhd0VsbGlwc2UoX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHhTY2FsZTogc2l6ZSwgeVNjYWxlOiBzaXplIH0pKTtcbiAgICB9O1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldE9yRW1iZWRGb250ID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgdmFyIG9sZEZvbnQgPSB0aGlzLmZvbnQ7XG4gICAgICAgIHZhciBvbGRGb250S2V5ID0gdGhpcy5mb250S2V5O1xuICAgICAgICBpZiAoZm9udClcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9udChmb250KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5nZXRGb250KCk7XG4gICAgICAgIHZhciBuZXdGb250ID0gdGhpcy5mb250O1xuICAgICAgICB2YXIgbmV3Rm9udEtleSA9IHRoaXMuZm9udEtleTtcbiAgICAgICAgcmV0dXJuIHsgb2xkRm9udDogb2xkRm9udCwgb2xkRm9udEtleTogb2xkRm9udEtleSwgbmV3Rm9udDogbmV3Rm9udCwgbmV3Rm9udEtleTogbmV3Rm9udEtleSB9O1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0Rm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvbnQgfHwgIXRoaXMuZm9udEtleSkge1xuICAgICAgICAgICAgdmFyIGZvbnQgPSB0aGlzLmRvYy5lbWJlZFN0YW5kYXJkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSk7XG4gICAgICAgICAgICB0aGlzLnNldEZvbnQoZm9udCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0aGlzLmZvbnQsIHRoaXMuZm9udEtleV07XG4gICAgfTtcbiAgICBQREZQYWdlLnByb3RvdHlwZS5yZXNldEZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZm9udCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5mb250S2V5ID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0Q29udGVudFN0cmVhbSA9IGZ1bmN0aW9uICh1c2VFeGlzdGluZykge1xuICAgICAgICBpZiAodXNlRXhpc3RpbmcgPT09IHZvaWQgMCkgeyB1c2VFeGlzdGluZyA9IHRydWU7IH1cbiAgICAgICAgaWYgKHVzZUV4aXN0aW5nICYmIHRoaXMuY29udGVudFN0cmVhbSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRTdHJlYW07XG4gICAgICAgIHRoaXMuY29udGVudFN0cmVhbSA9IHRoaXMuY3JlYXRlQ29udGVudFN0cmVhbSgpO1xuICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW1SZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHRoaXMuY29udGVudFN0cmVhbSk7XG4gICAgICAgIHRoaXMubm9kZS5hZGRDb250ZW50U3RyZWFtKHRoaXMuY29udGVudFN0cmVhbVJlZik7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRTdHJlYW07XG4gICAgfTtcbiAgICBQREZQYWdlLnByb3RvdHlwZS5jcmVhdGVDb250ZW50U3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb3BlcmF0b3JzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBvcGVyYXRvcnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGljdCA9IHRoaXMuZG9jLmNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSBQREZDb250ZW50U3RyZWFtLm9mKGRpY3QsIG9wZXJhdG9ycyk7XG4gICAgICAgIHJldHVybiBjb250ZW50U3RyZWFtO1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgb3BhY2l0eSA9IG9wdGlvbnMub3BhY2l0eSwgYm9yZGVyT3BhY2l0eSA9IG9wdGlvbnMuYm9yZGVyT3BhY2l0eSwgYmxlbmRNb2RlID0gb3B0aW9ucy5ibGVuZE1vZGU7XG4gICAgICAgIGlmIChvcGFjaXR5ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGJvcmRlck9wYWNpdHkgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgYmxlbmRNb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGUgPSB0aGlzLmRvYy5jb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBUeXBlOiAnRXh0R1N0YXRlJyxcbiAgICAgICAgICAgIGNhOiBvcGFjaXR5LFxuICAgICAgICAgICAgQ0E6IGJvcmRlck9wYWNpdHksXG4gICAgICAgICAgICBCTTogYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGtleSA9IHRoaXMubm9kZS5uZXdFeHRHU3RhdGUoJ0dTJywgZ3JhcGhpY3NTdGF0ZSk7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfTtcbiAgICBQREZQYWdlLnByb3RvdHlwZS5zY2FsZUFubm90ID0gZnVuY3Rpb24gKGFubm90LCB4LCB5KSB7XG4gICAgICAgIHZhciBzZWxlY3RvcnMgPSBbJ1JEJywgJ0NMJywgJ1ZlcnRpY2VzJywgJ1F1YWRQb2ludHMnLCAnTCcsICdSZWN0J107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHNlbGVjdG9ycy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBsaXN0ID0gYW5ub3QubG9va3VwKFBERk5hbWUub2Yoc2VsZWN0b3JzW2lkeF0pKTtcbiAgICAgICAgICAgIGlmIChsaXN0IGluc3RhbmNlb2YgUERGQXJyYXkpXG4gICAgICAgICAgICAgICAgbGlzdC5zY2FsZVBERk51bWJlcnMoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlua0xpc3RzID0gYW5ub3QubG9va3VwKFBERk5hbWUub2YoJ0lua0xpc3QnKSk7XG4gICAgICAgIGlmIChpbmtMaXN0cyBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBpbmtMaXN0cy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gaW5rTGlzdHMubG9va3VwKGlkeCk7XG4gICAgICAgICAgICAgICAgaWYgKGFyciBpbnN0YW5jZW9mIFBERkFycmF5KVxuICAgICAgICAgICAgICAgICAgICBhcnIuc2NhbGVQREZOdW1iZXJzKHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuYWRkUGFnZV1dIGFuZCBbW1BERkRvY3VtZW50Lmluc2VydFBhZ2VdXVxuICAgICAqID4gbWV0aG9kcywgd2hpY2ggY2FuIGNyZWF0ZSBpbnN0YW5jZXMgb2YgW1tQREZQYWdlXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERlBhZ2VdXSBmcm9tIGFuIGV4aXN0aW5nIGxlYWYgbm9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZWFmTm9kZSBUaGUgbGVhZiBub2RlIHRvIGJlIHdyYXBwZWQuXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhlIHBhZ2UuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhlIHBhZ2Ugd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGUGFnZS5vZiA9IGZ1bmN0aW9uIChsZWFmTm9kZSwgcmVmLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZQYWdlKGxlYWZOb2RlLCByZWYsIGRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuYWRkUGFnZV1dIGFuZCBbW1BERkRvY3VtZW50Lmluc2VydFBhZ2VdXVxuICAgICAqID4gbWV0aG9kcywgd2hpY2ggY2FuIGNyZWF0ZSBpbnN0YW5jZXMgb2YgW1tQREZQYWdlXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERlBhZ2VdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBwYWdlIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERlBhZ2UuY3JlYXRlID0gZnVuY3Rpb24gKGRvYykge1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICB2YXIgZHVtbXlSZWYgPSBQREZSZWYub2YoLTEpO1xuICAgICAgICB2YXIgcGFnZUxlYWYgPSBQREZQYWdlTGVhZi53aXRoQ29udGV4dEFuZFBhcmVudChkb2MuY29udGV4dCwgZHVtbXlSZWYpO1xuICAgICAgICB2YXIgcGFnZVJlZiA9IGRvYy5jb250ZXh0LnJlZ2lzdGVyKHBhZ2VMZWFmKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZQYWdlKHBhZ2VMZWFmLCBwYWdlUmVmLCBkb2MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlBhZ2U7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUGFnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlBhZ2UuanMubWFwIiwiZXhwb3J0IHZhciBCbGVuZE1vZGU7XG4oZnVuY3Rpb24gKEJsZW5kTW9kZSkge1xuICAgIEJsZW5kTW9kZVtcIk5vcm1hbFwiXSA9IFwiTm9ybWFsXCI7XG4gICAgQmxlbmRNb2RlW1wiTXVsdGlwbHlcIl0gPSBcIk11bHRpcGx5XCI7XG4gICAgQmxlbmRNb2RlW1wiU2NyZWVuXCJdID0gXCJTY3JlZW5cIjtcbiAgICBCbGVuZE1vZGVbXCJPdmVybGF5XCJdID0gXCJPdmVybGF5XCI7XG4gICAgQmxlbmRNb2RlW1wiRGFya2VuXCJdID0gXCJEYXJrZW5cIjtcbiAgICBCbGVuZE1vZGVbXCJMaWdodGVuXCJdID0gXCJMaWdodGVuXCI7XG4gICAgQmxlbmRNb2RlW1wiQ29sb3JEb2RnZVwiXSA9IFwiQ29sb3JEb2RnZVwiO1xuICAgIEJsZW5kTW9kZVtcIkNvbG9yQnVyblwiXSA9IFwiQ29sb3JCdXJuXCI7XG4gICAgQmxlbmRNb2RlW1wiSGFyZExpZ2h0XCJdID0gXCJIYXJkTGlnaHRcIjtcbiAgICBCbGVuZE1vZGVbXCJTb2Z0TGlnaHRcIl0gPSBcIlNvZnRMaWdodFwiO1xuICAgIEJsZW5kTW9kZVtcIkRpZmZlcmVuY2VcIl0gPSBcIkRpZmZlcmVuY2VcIjtcbiAgICBCbGVuZE1vZGVbXCJFeGNsdXNpb25cIl0gPSBcIkV4Y2x1c2lvblwiO1xufSkoQmxlbmRNb2RlIHx8IChCbGVuZE1vZGUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUGFnZU9wdGlvbnMuanMubWFwIiwiZXhwb3J0IHZhciBTdGFuZGFyZEZvbnRzO1xuKGZ1bmN0aW9uIChTdGFuZGFyZEZvbnRzKSB7XG4gICAgU3RhbmRhcmRGb250c1tcIkNvdXJpZXJcIl0gPSBcIkNvdXJpZXJcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiQ291cmllckJvbGRcIl0gPSBcIkNvdXJpZXItQm9sZFwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJDb3VyaWVyT2JsaXF1ZVwiXSA9IFwiQ291cmllci1PYmxpcXVlXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIkNvdXJpZXJCb2xkT2JsaXF1ZVwiXSA9IFwiQ291cmllci1Cb2xkT2JsaXF1ZVwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJIZWx2ZXRpY2FcIl0gPSBcIkhlbHZldGljYVwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJIZWx2ZXRpY2FCb2xkXCJdID0gXCJIZWx2ZXRpY2EtQm9sZFwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJIZWx2ZXRpY2FPYmxpcXVlXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJIZWx2ZXRpY2FCb2xkT2JsaXF1ZVwiXSA9IFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIlRpbWVzUm9tYW5cIl0gPSBcIlRpbWVzLVJvbWFuXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIlRpbWVzUm9tYW5Cb2xkXCJdID0gXCJUaW1lcy1Cb2xkXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIlRpbWVzUm9tYW5JdGFsaWNcIl0gPSBcIlRpbWVzLUl0YWxpY1wiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJUaW1lc1JvbWFuQm9sZEl0YWxpY1wiXSA9IFwiVGltZXMtQm9sZEl0YWxpY1wiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJTeW1ib2xcIl0gPSBcIlN5bWJvbFwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJaYXBmRGluZ2JhdHNcIl0gPSBcIlphcGZEaW5nYmF0c1wiO1xufSkoU3RhbmRhcmRGb250cyB8fCAoU3RhbmRhcmRGb250cyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGFuZGFyZEZvbnRzLmpzLm1hcCIsImltcG9ydCB7IHNldEZpbGxpbmdDbXlrQ29sb3IsIHNldEZpbGxpbmdHcmF5c2NhbGVDb2xvciwgc2V0RmlsbGluZ1JnYkNvbG9yLCBzZXRTdHJva2luZ0NteWtDb2xvciwgc2V0U3Ryb2tpbmdHcmF5c2NhbGVDb2xvciwgc2V0U3Ryb2tpbmdSZ2JDb2xvciwgfSBmcm9tIFwiLi9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IGFzc2VydFJhbmdlLCBlcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuZXhwb3J0IHZhciBDb2xvclR5cGVzO1xuKGZ1bmN0aW9uIChDb2xvclR5cGVzKSB7XG4gICAgQ29sb3JUeXBlc1tcIkdyYXlzY2FsZVwiXSA9IFwiR3JheXNjYWxlXCI7XG4gICAgQ29sb3JUeXBlc1tcIlJHQlwiXSA9IFwiUkdCXCI7XG4gICAgQ29sb3JUeXBlc1tcIkNNWUtcIl0gPSBcIkNNWUtcIjtcbn0pKENvbG9yVHlwZXMgfHwgKENvbG9yVHlwZXMgPSB7fSkpO1xuZXhwb3J0IHZhciBncmF5c2NhbGUgPSBmdW5jdGlvbiAoZ3JheSkge1xuICAgIGFzc2VydFJhbmdlKGdyYXksICdncmF5JywgMC4wLCAxLjApO1xuICAgIHJldHVybiB7IHR5cGU6IENvbG9yVHlwZXMuR3JheXNjYWxlLCBncmF5OiBncmF5IH07XG59O1xuZXhwb3J0IHZhciByZ2IgPSBmdW5jdGlvbiAocmVkLCBncmVlbiwgYmx1ZSkge1xuICAgIGFzc2VydFJhbmdlKHJlZCwgJ3JlZCcsIDAsIDEpO1xuICAgIGFzc2VydFJhbmdlKGdyZWVuLCAnZ3JlZW4nLCAwLCAxKTtcbiAgICBhc3NlcnRSYW5nZShibHVlLCAnYmx1ZScsIDAsIDEpO1xuICAgIHJldHVybiB7IHR5cGU6IENvbG9yVHlwZXMuUkdCLCByZWQ6IHJlZCwgZ3JlZW46IGdyZWVuLCBibHVlOiBibHVlIH07XG59O1xuZXhwb3J0IHZhciBjbXlrID0gZnVuY3Rpb24gKGN5YW4sIG1hZ2VudGEsIHllbGxvdywga2V5KSB7XG4gICAgYXNzZXJ0UmFuZ2UoY3lhbiwgJ2N5YW4nLCAwLCAxKTtcbiAgICBhc3NlcnRSYW5nZShtYWdlbnRhLCAnbWFnZW50YScsIDAsIDEpO1xuICAgIGFzc2VydFJhbmdlKHllbGxvdywgJ3llbGxvdycsIDAsIDEpO1xuICAgIGFzc2VydFJhbmdlKGtleSwgJ2tleScsIDAsIDEpO1xuICAgIHJldHVybiB7IHR5cGU6IENvbG9yVHlwZXMuQ01ZSywgY3lhbjogY3lhbiwgbWFnZW50YTogbWFnZW50YSwgeWVsbG93OiB5ZWxsb3csIGtleToga2V5IH07XG59O1xudmFyIEdyYXlzY2FsZSA9IENvbG9yVHlwZXMuR3JheXNjYWxlLCBSR0IgPSBDb2xvclR5cGVzLlJHQiwgQ01ZSyA9IENvbG9yVHlwZXMuQ01ZSztcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciBzZXRGaWxsaW5nQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICByZXR1cm4gY29sb3IudHlwZSA9PT0gR3JheXNjYWxlID8gc2V0RmlsbGluZ0dyYXlzY2FsZUNvbG9yKGNvbG9yLmdyYXkpXG4gICAgICAgIDogY29sb3IudHlwZSA9PT0gUkdCID8gc2V0RmlsbGluZ1JnYkNvbG9yKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpXG4gICAgICAgICAgICA6IGNvbG9yLnR5cGUgPT09IENNWUsgPyBzZXRGaWxsaW5nQ215a0NvbG9yKGNvbG9yLmN5YW4sIGNvbG9yLm1hZ2VudGEsIGNvbG9yLnllbGxvdywgY29sb3Iua2V5KVxuICAgICAgICAgICAgICAgIDogZXJyb3IoXCJJbnZhbGlkIGNvbG9yOiBcIiArIEpTT04uc3RyaW5naWZ5KGNvbG9yKSk7XG59O1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdmFyIHNldFN0cm9raW5nQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICByZXR1cm4gY29sb3IudHlwZSA9PT0gR3JheXNjYWxlID8gc2V0U3Ryb2tpbmdHcmF5c2NhbGVDb2xvcihjb2xvci5ncmF5KVxuICAgICAgICA6IGNvbG9yLnR5cGUgPT09IFJHQiA/IHNldFN0cm9raW5nUmdiQ29sb3IoY29sb3IucmVkLCBjb2xvci5ncmVlbiwgY29sb3IuYmx1ZSlcbiAgICAgICAgICAgIDogY29sb3IudHlwZSA9PT0gQ01ZSyA/IHNldFN0cm9raW5nQ215a0NvbG9yKGNvbG9yLmN5YW4sIGNvbG9yLm1hZ2VudGEsIGNvbG9yLnllbGxvdywgY29sb3Iua2V5KVxuICAgICAgICAgICAgICAgIDogZXJyb3IoXCJJbnZhbGlkIGNvbG9yOiBcIiArIEpTT04uc3RyaW5naWZ5KGNvbG9yKSk7XG59O1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdmFyIGNvbXBvbmVudHNUb0NvbG9yID0gZnVuY3Rpb24gKGNvbXBzLCBzY2FsZSkge1xuICAgIGlmIChzY2FsZSA9PT0gdm9pZCAwKSB7IHNjYWxlID0gMTsgfVxuICAgIHJldHVybiAoKGNvbXBzID09PSBudWxsIHx8IGNvbXBzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wcy5sZW5ndGgpID09PSAxID8gZ3JheXNjYWxlKGNvbXBzWzBdICogc2NhbGUpXG4gICAgICAgIDogKGNvbXBzID09PSBudWxsIHx8IGNvbXBzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wcy5sZW5ndGgpID09PSAzID8gcmdiKGNvbXBzWzBdICogc2NhbGUsIGNvbXBzWzFdICogc2NhbGUsIGNvbXBzWzJdICogc2NhbGUpXG4gICAgICAgICAgICA6IChjb21wcyA9PT0gbnVsbCB8fCBjb21wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcHMubGVuZ3RoKSA9PT0gNCA/IGNteWsoY29tcHNbMF0gKiBzY2FsZSwgY29tcHNbMV0gKiBzY2FsZSwgY29tcHNbMl0gKiBzY2FsZSwgY29tcHNbM10gKiBzY2FsZSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCk7XG59O1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdmFyIGNvbG9yVG9Db21wb25lbnRzID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgcmV0dXJuIGNvbG9yLnR5cGUgPT09IEdyYXlzY2FsZSA/IFtjb2xvci5ncmF5XVxuICAgICAgICA6IGNvbG9yLnR5cGUgPT09IFJHQiA/IFtjb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlXVxuICAgICAgICAgICAgOiBjb2xvci50eXBlID09PSBDTVlLID8gW2NvbG9yLmN5YW4sIGNvbG9yLm1hZ2VudGEsIGNvbG9yLnllbGxvdywgY29sb3Iua2V5XVxuICAgICAgICAgICAgICAgIDogZXJyb3IoXCJJbnZhbGlkIGNvbG9yOiBcIiArIEpTT04uc3RyaW5naWZ5KGNvbG9yKSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29sb3JzLmpzLm1hcCIsIi8vIHRzbGludDpkaXNhYmxlOiBtYXgtY2xhc3Nlcy1wZXItZmlsZVxuaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG4vLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gZG9jdW1lbnRhdGlvbiB3aXRoIGV4YW1wbGVcbnZhciBFbmNyeXB0ZWRQREZFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRW5jcnlwdGVkUERGRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRW5jcnlwdGVkUERGRXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSAnSW5wdXQgZG9jdW1lbnQgdG8gYFBERkRvY3VtZW50LmxvYWRgIGlzIGVuY3J5cHRlZC4gWW91IGNhbiB1c2UgYFBERkRvY3VtZW50LmxvYWQoLi4uLCB7IGlnbm9yZUVuY3J5cHRpb246IHRydWUgfSlgIGlmIHlvdSB3aXNoIHRvIGxvYWQgdGhlIGRvY3VtZW50IGFueXdheXMuJztcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEVuY3J5cHRlZFBERkVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgRW5jcnlwdGVkUERGRXJyb3IgfTtcbi8vIFRPRE86IEluY2x1ZGUgbGluayB0byBkb2N1bWVudGF0aW9uIHdpdGggZXhhbXBsZVxudmFyIEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRm9udGtpdE5vdFJlZ2lzdGVyZWRFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9ICdJbnB1dCB0byBgUERGRG9jdW1lbnQuZW1iZWRGb250YCB3YXMgYSBjdXN0b20gZm9udCwgYnV0IG5vIGBmb250a2l0YCBpbnN0YW5jZSB3YXMgZm91bmQuIFlvdSBtdXN0IHJlZ2lzdGVyIGEgYGZvbnRraXRgIGluc3RhbmNlIHdpdGggYFBERkRvY3VtZW50LnJlZ2lzdGVyRm9udGtpdCguLi4pYCBiZWZvcmUgZW1iZWRkaW5nIGN1c3RvbSBmb250cy4nO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRm9udGtpdE5vdFJlZ2lzdGVyZWRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IgfTtcbi8vIFRPRE86IEluY2x1ZGUgbGluayB0byBkb2N1bWVudGF0aW9uIHdpdGggZXhhbXBsZVxudmFyIEZvcmVpZ25QYWdlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZvcmVpZ25QYWdlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRm9yZWlnblBhZ2VFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9ICdBIGBwYWdlYCBwYXNzZWQgdG8gYFBERkRvY3VtZW50LmFkZFBhZ2VgIG9yIGBQREZEb2N1bWVudC5pbnNlcnRQYWdlYCB3YXMgZnJvbSBhIGRpZmZlcmVudCAoZm9yZWlnbikgUERGIGRvY3VtZW50LiBJZiB5b3Ugd2FudCB0byBjb3B5IHBhZ2VzIGZyb20gb25lIFBERkRvY3VtZW50IHRvIGFub3RoZXIsIHlvdSBtdXN0IHVzZSBgUERGRG9jdW1lbnQuY29weVBhZ2VzKC4uLilgIHRvIGNvcHkgdGhlIHBhZ2VzIGJlZm9yZSBhZGRpbmcgb3IgaW5zZXJ0aW5nIHRoZW0uJztcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEZvcmVpZ25QYWdlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBGb3JlaWduUGFnZUVycm9yIH07XG4vLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gZG9jdW1lbnRhdGlvbiB3aXRoIGV4YW1wbGVcbnZhciBSZW1vdmVQYWdlRnJvbUVtcHR5RG9jdW1lbnRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSAnUERGRG9jdW1lbnQgaGFzIG5vIHBhZ2VzIHNvIGBQREZEb2N1bWVudC5yZW1vdmVQYWdlYCBjYW5ub3QgYmUgY2FsbGVkJztcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3IgfTtcbnZhciBOb1N1Y2hGaWVsZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb1N1Y2hGaWVsZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5vU3VjaEZpZWxkRXJyb3IobmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJQREZEb2N1bWVudCBoYXMgbm8gZm9ybSBmaWVsZCB3aXRoIHRoZSBuYW1lIFxcXCJcIiArIG5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE5vU3VjaEZpZWxkRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBOb1N1Y2hGaWVsZEVycm9yIH07XG52YXIgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIGV4cGVjdGVkLCBhY3R1YWwpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGV4cGVjdGVkVHlwZSA9IGV4cGVjdGVkID09PSBudWxsIHx8IGV4cGVjdGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleHBlY3RlZC5uYW1lO1xuICAgICAgICB2YXIgYWN0dWFsVHlwZSA9IChfYiA9IChfYSA9IGFjdHVhbCA9PT0gbnVsbCB8fCBhY3R1YWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjdHVhbC5jb25zdHJ1Y3RvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGFjdHVhbDtcbiAgICAgICAgdmFyIG1zZyA9IFwiRXhwZWN0ZWQgZmllbGQgXFxcIlwiICsgbmFtZSArIFwiXFxcIiB0byBiZSBvZiB0eXBlIFwiICsgZXhwZWN0ZWRUeXBlICsgXCIsIFwiICtcbiAgICAgICAgICAgIChcImJ1dCBpdCBpcyBhY3R1YWxseSBvZiB0eXBlIFwiICsgYWN0dWFsVHlwZSk7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IgfTtcbnZhciBNaXNzaW5nT25WYWx1ZUNoZWNrRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdPblZhbHVlQ2hlY2tFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nT25WYWx1ZUNoZWNrRXJyb3Iob25WYWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gc2VsZWN0IGNoZWNrIGJveCBkdWUgdG8gbWlzc2luZyBvblZhbHVlOiBcXFwiXCIgKyBvblZhbHVlICsgXCJcXFwiXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nT25WYWx1ZUNoZWNrRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nT25WYWx1ZUNoZWNrRXJyb3IgfTtcbnZhciBGaWVsZEFscmVhZHlFeGlzdHNFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IobmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lOiBcXFwiXCIgKyBuYW1lICsgXCJcXFwiXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBGaWVsZEFscmVhZHlFeGlzdHNFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yIH07XG52YXIgSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnZhbGlkRmllbGROYW1lUGFydEVycm9yKG5hbWVQYXJ0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZpZWxkIG5hbWUgY29udGFpbnMgaW52YWxpZCBjb21wb25lbnQ6IFxcXCJcIiArIG5hbWVQYXJ0ICsgXCJcXFwiXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbnZhbGlkRmllbGROYW1lUGFydEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvciB9O1xudmFyIEZpZWxkRXhpc3RzQXNOb25UZXJtaW5hbEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGaWVsZEV4aXN0c0FzTm9uVGVybWluYWxFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGaWVsZEV4aXN0c0FzTm9uVGVybWluYWxFcnJvcihuYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkEgbm9uLXRlcm1pbmFsIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lOiBcXFwiXCIgKyBuYW1lICsgXCJcXFwiXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBGaWVsZEV4aXN0c0FzTm9uVGVybWluYWxFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEZpZWxkRXhpc3RzQXNOb25UZXJtaW5hbEVycm9yIH07XG52YXIgUmljaFRleHRGaWVsZFJlYWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmljaFRleHRGaWVsZFJlYWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSaWNoVGV4dEZpZWxkUmVhZEVycm9yKGZpZWxkTmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJSZWFkaW5nIHJpY2ggdGV4dCBmaWVsZHMgaXMgbm90IHN1cHBvcnRlZDogQXR0ZW1wdGVkIHRvIHJlYWQgcmljaCB0ZXh0IGZpZWxkOiBcIiArIGZpZWxkTmFtZTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFJpY2hUZXh0RmllbGRSZWFkRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBSaWNoVGV4dEZpZWxkUmVhZEVycm9yIH07XG52YXIgQ29tYmVkVGV4dExheW91dEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb21iZWRUZXh0TGF5b3V0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29tYmVkVGV4dExheW91dEVycm9yKGxpbmVMZW5ndGgsIGNlbGxDb3VudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gbGF5b3V0IGNvbWJlZCB0ZXh0IGFzIGxpbmVMZW5ndGg9XCIgKyBsaW5lTGVuZ3RoICsgXCIgaXMgZ3JlYXRlciB0aGFuIGNlbGxDb3VudD1cIiArIGNlbGxDb3VudDtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIENvbWJlZFRleHRMYXlvdXRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IENvbWJlZFRleHRMYXlvdXRFcnJvciB9O1xudmFyIEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRXhjZWVkZWRNYXhMZW5ndGhFcnJvcih0ZXh0TGVuZ3RoLCBtYXhMZW5ndGgsIG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQXR0ZW1wdGVkIHRvIHNldCB0ZXh0IHdpdGggbGVuZ3RoPVwiICsgdGV4dExlbmd0aCArIFwiIGZvciBUZXh0RmllbGQgd2l0aCBtYXhMZW5ndGg9XCIgKyBtYXhMZW5ndGggKyBcIiBhbmQgbmFtZT1cIiArIG5hbWU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBFeGNlZWRlZE1heExlbmd0aEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgRXhjZWVkZWRNYXhMZW5ndGhFcnJvciB9O1xudmFyIEludmFsaWRNYXhMZW5ndGhFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52YWxpZE1heExlbmd0aEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEludmFsaWRNYXhMZW5ndGhFcnJvcih0ZXh0TGVuZ3RoLCBtYXhMZW5ndGgsIG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQXR0ZW1wdGVkIHRvIHNldCBtYXhMZW5ndGg9XCIgKyBtYXhMZW5ndGggKyBcIiwgd2hpY2ggaXMgbGVzcyB0aGFuIFwiICsgdGV4dExlbmd0aCArIFwiLCB0aGUgbGVuZ3RoIG9mIHRoaXMgZmllbGQncyBjdXJyZW50IHZhbHVlIChuYW1lPVwiICsgbmFtZSArIFwiKVwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSW52YWxpZE1heExlbmd0aEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgSW52YWxpZE1heExlbmd0aEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGUGFnZSBmcm9tIFwiLi4vUERGUGFnZVwiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4uL1BERkZvbnRcIjtcbmltcG9ydCB7IEltYWdlQWxpZ25tZW50IH0gZnJvbSBcIi4uL2ltYWdlL2FsaWdubWVudFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQXBwZWFyYW5jZSwgZGVmYXVsdEJ1dHRvbkFwcGVhcmFuY2VQcm92aWRlciwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuaW1wb3J0IFBERkZpZWxkLCB7IGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMsIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBQREZTdHJlYW0sIFBERkFjcm9QdXNoQnV0dG9uLCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0T3JVbmRlZmluZWQsIGFzc2VydFBvc2l0aXZlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBidXR0b24gZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERkJ1dHRvbl1dIGZpZWxkcyBhcmUgaW50ZXJhY3RpdmUgY29udHJvbHMgdGhhdCB1c2VycyBjYW4gY2xpY2sgd2l0aCB0aGVpclxuICogbW91c2UuIFRoaXMgdHlwZSBvZiBbW1BERkZpZWxkXV0gaXMgbm90IHN0YXRlZnVsLiBUaGUgcHVycG9zZSBvZiBhIGJ1dHRvblxuICogaXMgdG8gcGVyZm9ybSBhbiBhY3Rpb24gd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gaXQsIHN1Y2ggYXMgb3BlbmluZyBhIHByaW50XG4gKiBtb2RhbCBvciByZXNldHRpbmcgdGhlIGZvcm0uIEJ1dHRvbnMgYXJlIHR5cGljYWxseSByZWN0YW5ndWxhciBpbiBzaGFwZSBhbmRcbiAqIGhhdmUgYSB0ZXh0IGxhYmVsIGRlc2NyaWJpbmcgdGhlIGFjdGlvbiB0aGF0IHRoZXkgcGVyZm9ybSB3aGVuIGNsaWNrZWQuXG4gKi9cbnZhciBQREZCdXR0b24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkJ1dHRvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZCdXR0b24oYWNyb1B1c2hCdXR0b24sIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9QdXNoQnV0dG9uLCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb1B1c2hCdXR0b24sICdhY3JvQnV0dG9uJywgW1xuICAgICAgICAgICAgW1BERkFjcm9QdXNoQnV0dG9uLCAnUERGQWNyb1B1c2hCdXR0b24nXSxcbiAgICAgICAgXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9QdXNoQnV0dG9uO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc3BsYXkgYW4gaW1hZ2UgaW5zaWRlIHRoZSBib3VuZHMgb2YgdGhpcyBidXR0b24ncyB3aWRnZXRzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBuZ0ltYWdlID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKC4uLilcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmdldEJ1dHRvbignc29tZS5idXR0b24uZmllbGQnKVxuICAgICAqIGJ1dHRvbi5zZXRJbWFnZShwbmdJbWFnZSwgSW1hZ2VBbGlnbm1lbnQuQ2VudGVyKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGFwcGVhcmFuY2VzIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBidXR0b24ncyB3aWRnZXRzLlxuICAgICAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgICAqIEBwYXJhbSBhbGlnbm1lbnQgVGhlIGFsaWdubWVudCBvZiB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS5zZXRJbWFnZSA9IGZ1bmN0aW9uIChpbWFnZSwgYWxpZ25tZW50KSB7XG4gICAgICAgIGlmIChhbGlnbm1lbnQgPT09IHZvaWQgMCkgeyBhbGlnbm1lbnQgPSBJbWFnZUFsaWdubWVudC5DZW50ZXI7IH1cbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN0cmVhbVJlZiA9IHRoaXMuY3JlYXRlSW1hZ2VBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgaW1hZ2UsIGFsaWdubWVudCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VzKHdpZGdldCwgeyBub3JtYWw6IHN0cmVhbVJlZiB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZvbnQgc2l6ZSBmb3IgdGhpcyBmaWVsZC4gTGFyZ2VyIGZvbnQgc2l6ZXMgd2lsbCByZXN1bHQgaW4gbGFyZ2VyXG4gICAgICogdGV4dCBiZWluZyBkaXNwbGF5ZWQgd2hlbiBQREYgcmVhZGVycyByZW5kZXIgdGhpcyBidXR0b24uIEZvbnQgc2l6ZXMgbWF5XG4gICAgICogYmUgaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBTdXBwbHlpbmcgYSBuZWdhdGl2ZSBmb250IHNpemUgd2lsbFxuICAgICAqIGNhdXNlIHRoaXMgbWV0aG9kIHRvIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmdldEJ1dHRvbignc29tZS5idXR0b24uZmllbGQnKVxuICAgICAqIGJ1dHRvbi5zZXRGb250U2l6ZSg0KVxuICAgICAqIGJ1dHRvbi5zZXRGb250U2l6ZSgxNS43KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPiBUaGlzIG1ldGhvZCBkZXBlbmRzIHVwb24gdGhlIGV4aXN0ZW5jZSBvZiBhIGRlZmF1bHQgYXBwZWFyYW5jZVxuICAgICAqID4gKGAvREFgKSBzdHJpbmcuIElmIHRoaXMgZmllbGQgZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgYXBwZWFyYW5jZSBzdHJpbmcsXG4gICAgICogPiBvciB0aGF0IHN0cmluZyBkb2VzIG5vdCBjb250YWluIGEgZm9udCBzaXplICh2aWEgdGhlIGBUZmAgb3BlcmF0b3IpLFxuICAgICAqID4gdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvbnRTaXplIFRoZSBmb250IHNpemUgdG8gYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0ZXh0IGluIHRoaXMgZmllbGQuXG4gICAgICovXG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICBhc3NlcnRQb3NpdGl2ZShmb250U2l6ZSwgJ2ZvbnRTaXplJyk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGlzIGJ1dHRvbiBvbiB0aGUgc3BlY2lmaWVkIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gdGV4dC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB1YnVudHVGb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udCh1YnVudHVGb250Qnl0ZXMpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5jcmVhdGVCdXR0b24oJ3NvbWUuYnV0dG9uLmZpZWxkJylcbiAgICAgKlxuICAgICAqIGJ1dHRvbi5hZGRUb1BhZ2UoJ0RvIFN0dWZmJywgcGFnZSwge1xuICAgICAqICAgeDogNTAsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHdpZHRoOiAyMDAsXG4gICAgICogICBoZWlnaHQ6IDEwMCxcbiAgICAgKiAgIHRleHRDb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgYmFja2dyb3VuZENvbG9yOiByZ2IoMCwgMSwgMCksXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAsIDAsIDEpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoOTApLFxuICAgICAqICAgZm9udDogdWJ1bnR1Rm9udCxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgd2lkZ2V0IGZvciB0aGlzIGJ1dHRvbiBmaWVsZC5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBiZSBkaXNwbGF5ZWQgZm9yIHRoaXMgYnV0dG9uIHdpZGdldC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGlzIGJ1dHRvbiB3aWRnZXQgc2hvdWxkIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhpcyBidXR0b24gd2lkZ2V0LlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUuYWRkVG9QYWdlID0gZnVuY3Rpb24gKFxuICAgIC8vIFRPRE86IFRoaXMgbmVlZHMgdG8gYmUgb3B0aW9uYWwsIGUuZy4gZm9yIGltYWdlIGJ1dHRvbnNcbiAgICB0ZXh0LCBwYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2w7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHRleHQsICd0ZXh0JywgWydzdHJpbmcnXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHBhZ2UsICdwYWdlJywgW1tQREZQYWdlLCAnUERGUGFnZSddXSk7XG4gICAgICAgIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyBidXR0b25cbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0KHtcbiAgICAgICAgICAgIHg6ICgoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCkgLSAoKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwKSAvIDIsXG4gICAgICAgICAgICB5OiAoKF9jID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDApIC0gKChfZCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMCkgLyAyLFxuICAgICAgICAgICAgd2lkdGg6IChfZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMTAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2YgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiA1MCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogKF9nID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnRleHRDb2xvcikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogcmdiKDAsIDAsIDApLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAoX2ggPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiByZ2IoMC43NSwgMC43NSwgMC43NSksXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfaiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9rID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGNhcHRpb246IHRleHQsXG4gICAgICAgICAgICBoaWRkZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oaWRkZW4sXG4gICAgICAgICAgICBwYWdlOiBwYWdlLnJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGlzIGZpZWxkXG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLmFkZFdpZGdldCh3aWRnZXRSZWYpO1xuICAgICAgICAvLyBTZXQgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciB3aWRnZXRcbiAgICAgICAgdmFyIGZvbnQgPSAoX2wgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZm9udCkgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogdGhpcy5kb2MuZ2V0Rm9ybSgpLmdldERlZmF1bHRGb250KCk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoZSBnaXZlbiBwYWdlXG4gICAgICAgIHBhZ2Uubm9kZS5hZGRBbm5vdCh3aWRnZXRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBidXR0b24gaGFzIGJlZW4gbWFya2VkIGFzIGRpcnR5LCBvciBpZiBhbnkgb2YgdGhpc1xuICAgICAqIGJ1dHRvbidzIHdpZGdldHMgZG8gbm90IGhhdmUgYW4gYXBwZWFyYW5jZSBzdHJlYW0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5nZXRCdXR0b24oJ3NvbWUuYnV0dG9uLmZpZWxkJylcbiAgICAgKiBpZiAoYnV0dG9uLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUoKSkgY29uc29sZS5sb2coJ05lZWRzIHVwZGF0ZScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBidXR0b24gbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLmlzRGlydHkoKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgaGFzQXBwZWFyYW5jZXMgPSAoKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWwpIGluc3RhbmNlb2YgUERGU3RyZWFtO1xuICAgICAgICAgICAgaWYgKCFoYXNBcHBlYXJhbmNlcylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGJ1dHRvbidzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBidXR0b25zLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5nZXRCdXR0b24oJ3NvbWUuYnV0dG9uLmZpZWxkJylcbiAgICAgKiBidXR0b24uZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgdGhpcy51cGRhdGVBcHBlYXJhbmNlcyhmb250KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgYnV0dG9uJ3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBnaXZlbiBhcHBlYXJhbmNlIHByb3ZpZGVyLiBJZiBubyBgcHJvdmlkZXJgIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHRcbiAgICAgKiBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBidXR0b25zIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uZ2V0QnV0dG9uKCdzb21lLmJ1dHRvbi5maWVsZCcpXG4gICAgICogYnV0dG9uLnVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSwgKGZpZWxkLCB3aWRnZXQsIGZvbnQpID0+IHtcbiAgICAgKiAgIC4uLlxuICAgICAqICAgcmV0dXJuIHtcbiAgICAgKiAgICAgbm9ybWFsOiBkcmF3QnV0dG9uKC4uLiksXG4gICAgICogICAgIGRvd246IGRyYXdCdXR0b24oLi4uKSxcbiAgICAgKiAgIH1cbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIE9wdGlvbmFsbHksIHRoZSBhcHBlYXJhbmNlIHByb3ZpZGVyIHRvIGJlIHVzZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS51cGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250LCBwcm92aWRlcikge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwcm92aWRlciwgJ3Byb3ZpZGVyJywgW0Z1bmN0aW9uXSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIGFwUHJvdmlkZXIgPSBwcm92aWRlciAhPT0gbnVsbCAmJiBwcm92aWRlciAhPT0gdm9pZCAwID8gcHJvdmlkZXIgOiBkZWZhdWx0QnV0dG9uQXBwZWFyYW5jZVByb3ZpZGVyO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZXMgPSBub3JtYWxpemVBcHBlYXJhbmNlKGFwUHJvdmlkZXIodGhpcywgd2lkZ2V0LCBmb250KSk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZVdpdGhGb250KHdpZGdldCwgZm9udCwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0QnV0dG9uXV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZCdXR0b25dXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGQnV0dG9uXV0gZnJvbSBhbiBleGlzdGluZyBhY3JvUHVzaEJ1dHRvbiBhbmQgcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb1B1c2hCdXR0b24gVGhlIHVuZGVybHlpbmcgYFBERkFjcm9QdXNoQnV0dG9uYCBmb3IgdGhpcyBidXR0b24uXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBidXR0b24uXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhpcyBidXR0b24gd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGQnV0dG9uLm9mID0gZnVuY3Rpb24gKGFjcm9QdXNoQnV0dG9uLCByZWYsIGRvYykgeyByZXR1cm4gbmV3IFBERkJ1dHRvbihhY3JvUHVzaEJ1dHRvbiwgcmVmLCBkb2MpOyB9O1xuICAgIHJldHVybiBQREZCdXR0b247XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZCdXR0b247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZCdXR0b24uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGUGFnZSBmcm9tIFwiLi4vUERGUGFnZVwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQXBwZWFyYW5jZSwgZGVmYXVsdENoZWNrQm94QXBwZWFyYW5jZVByb3ZpZGVyLCB9IGZyb20gXCIuL2FwcGVhcmFuY2VzXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IFBERkZpZWxkLCB7IGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMsIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IFBERk5hbWUsIFBERkRpY3QsIFBERkFjcm9DaGVja0JveCwgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydE9yVW5kZWZpbmVkIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBjaGVjayBib3ggZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERkNoZWNrQm94XV0gZmllbGRzIGFyZSBpbnRlcmFjdGl2ZSBib3hlcyB0aGF0IHVzZXJzIGNhbiBjbGljayB3aXRoIHRoZWlyXG4gKiBtb3VzZS4gVGhpcyB0eXBlIG9mIFtbUERGRmllbGRdXSBoYXMgdHdvIHN0YXRlczogYG9uYCBhbmQgYG9mZmAuIFRoZSBwdXJwb3NlXG4gKiBvZiBhIGNoZWNrIGJveCBpcyB0byBlbmFibGUgdXNlcnMgdG8gc2VsZWN0IGZyb20gb25lIG9yIG1vcmUgb3B0aW9ucywgd2hlcmVcbiAqIGVhY2ggb3B0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGNoZWNrIGJveC4gQ2hlY2sgYm94ZXMgYXJlIHR5cGljYWxseVxuICogc3F1YXJlIGluIHNoYXBlIGFuZCBkaXNwbGF5IGEgY2hlY2sgbWFyayB3aGVuIHRoZXkgYXJlIGluIHRoZSBgb25gIHN0YXRlLlxuICovXG52YXIgUERGQ2hlY2tCb3ggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkNoZWNrQm94LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkNoZWNrQm94KGFjcm9DaGVja0JveCwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb0NoZWNrQm94LCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb0NoZWNrQm94LCAnYWNyb0NoZWNrQm94JywgW1xuICAgICAgICAgICAgW1BERkFjcm9DaGVja0JveCwgJ1BERkFjcm9DaGVja0JveCddLFxuICAgICAgICBdKTtcbiAgICAgICAgX3RoaXMuYWNyb0ZpZWxkID0gYWNyb0NoZWNrQm94O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhpcyBjaGVjayBib3guIFRoaXMgb3BlcmF0aW9uIGlzIGFuYWxvZ291cyB0byBhIGh1bWFuIHVzZXIgY2xpY2tpbmdcbiAgICAgKiBhIGNoZWNrIGJveCB0byBmaWxsIGl0IGluIGEgUERGIHJlYWRlci4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlXG4gICAgICogdW5kZXJseWluZyBzdGF0ZSBvZiB0aGUgY2hlY2sgYm94IGZpZWxkIHRvIGluZGljYXRlIGl0IGhhcyBiZWVuIHNlbGVjdGVkLlxuICAgICAqIFBERiBsaWJyYXJpZXMgYW5kIHJlYWRlcnMgd2lsbCBiZSBhYmxlIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSBmcm9tIHRoZVxuICAgICAqIHNhdmVkIGRvY3VtZW50IGFuZCBkZXRlcm1pbmUgdGhhdCBpdCB3YXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5nZXRDaGVja0JveCgnc29tZS5jaGVja0JveC5maWVsZCcpXG4gICAgICogY2hlY2tCb3guY2hlY2soKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgY2hlY2sgYm94IGFzIGRpcnR5LCBjYXVzaW5nIGl0cyBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB0byBiZSB1cGRhdGVkIHdoZW4gZWl0aGVyIFtbUERGRG9jdW1lbnQuc2F2ZV1dIG9yXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBpcyBjYWxsZWQuIFRoZSB1cGRhdGVkIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHdpbGwgZGlzcGxheSBhIGNoZWNrIG1hcmsgaW5zaWRlIHRoZSB3aWRnZXRzIG9mIHRoaXMgY2hlY2sgYm94XG4gICAgICogZmllbGQuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBvblZhbHVlID0gKF9hID0gdGhpcy5hY3JvRmllbGQuZ2V0T25WYWx1ZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBQREZOYW1lLm9mKCdZZXMnKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZShvblZhbHVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGlzIGNoZWNrIGJveC4gVGhpcyBvcGVyYXRpb24gaXMgYW5hbG9nb3VzIHRvIGEgaHVtYW4gdXNlciBjbGlja2luZ1xuICAgICAqIGEgY2hlY2sgYm94IHRvIHVubWFyayBpdCBpbiBhIFBERiByZWFkZXIuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZVxuICAgICAqIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlIGNoZWNrIGJveCBmaWVsZCB0byBpbmRpY2F0ZSBpdCBoYXMgYmVlbiBkZXNlbGVjdGVkLlxuICAgICAqIFBERiBsaWJyYXJpZXMgYW5kIHJlYWRlcnMgd2lsbCBiZSBhYmxlIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSBmcm9tIHRoZVxuICAgICAqIHNhdmVkIGRvY3VtZW50IGFuZCBkZXRlcm1pbmUgdGhhdCBpdCB3YXMgbm90IHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ3NvbWUuY2hlY2tCb3guZmllbGQnKVxuICAgICAqIGNoZWNrQm94LnVuY2hlY2soKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgY2hlY2sgYm94IGFzIGRpcnR5LiBTZWUgW1tQREZDaGVja0JveC5jaGVja11dXG4gICAgICogZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLnVuY2hlY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWUoUERGTmFtZS5vZignT2ZmJykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBjaGVjayBib3ggaXMgc2VsZWN0ZWQgKGVpdGhlciBieSBhIGh1bWFuIHVzZXIgdmlhXG4gICAgICogYSBQREYgcmVhZGVyLCBvciBlbHNlIHByb2dyYW1tYXRpY2FsbHkgdmlhIHNvZnR3YXJlKS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ3NvbWUuY2hlY2tCb3guZmllbGQnKVxuICAgICAqIGlmIChjaGVja0JveC5pc0NoZWNrZWQoKSkgY29uc29sZS5sb2coJ2NoZWNrIGJveCBpcyBzZWxlY3RlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBjaGVjayBib3ggaXMgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLmlzQ2hlY2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9uVmFsdWUgPSB0aGlzLmFjcm9GaWVsZC5nZXRPblZhbHVlKCk7XG4gICAgICAgIHJldHVybiAhIW9uVmFsdWUgJiYgb25WYWx1ZSA9PT0gdGhpcy5hY3JvRmllbGQuZ2V0VmFsdWUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNob3cgdGhpcyBjaGVjayBib3ggb24gdGhlIHNwZWNpZmllZCBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmNyZWF0ZUNoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKlxuICAgICAqIGNoZWNrQm94LmFkZFRvUGFnZShwYWdlLCB7XG4gICAgICogICB4OiA1MCxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgd2lkdGg6IDI1LFxuICAgICAqICAgaGVpZ2h0OiAyNSxcbiAgICAgKiAgIHRleHRDb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgYmFja2dyb3VuZENvbG9yOiByZ2IoMCwgMSwgMCksXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAsIDAsIDEpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoOTApLFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB3aWRnZXQgZm9yIHRoaXMgY2hlY2sgYm94IGZpZWxkLlxuICAgICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIHdoaWNoIHRoaXMgY2hlY2sgYm94IHdpZGdldCBzaG91bGQgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGFkZGluZyB0aGlzIGNoZWNrIGJveCB3aWRnZXQuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLmFkZFRvUGFnZSA9IGZ1bmN0aW9uIChwYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIGlmICghKCd0ZXh0Q29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy50ZXh0Q29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdiYWNrZ3JvdW5kQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgPSByZ2IoMSwgMSwgMSk7XG4gICAgICAgIGlmICghKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYm9yZGVyV2lkdGgnIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDE7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyBjaGVjayBib3hcbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0KHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiA1MCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDUwLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2UgPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwLFxuICAgICAgICAgICAgcm90YXRlOiAoX2YgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGhpZGRlbjogb3B0aW9ucy5oaWRkZW4sXG4gICAgICAgICAgICBwYWdlOiBwYWdlLnJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGlzIGZpZWxkXG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLmFkZFdpZGdldCh3aWRnZXRSZWYpO1xuICAgICAgICAvLyBTZXQgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciB3aWRnZXRcbiAgICAgICAgd2lkZ2V0LnNldEFwcGVhcmFuY2VTdGF0ZShQREZOYW1lLm9mKCdPZmYnKSk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIFBERk5hbWUub2YoJ1llcycpKTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGUgZ2l2ZW4gcGFnZVxuICAgICAgICBwYWdlLm5vZGUuYWRkQW5ub3Qod2lkZ2V0UmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIGFueSBvZiB0aGlzIGNoZWNrIGJveCdzIHdpZGdldHMgZG8gbm90IGhhdmUgYW5cbiAgICAgKiBhcHBlYXJhbmNlIHN0cmVhbSBmb3IgaXRzIGN1cnJlbnQgc3RhdGUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKiBpZiAoY2hlY2tCb3gubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSBjb25zb2xlLmxvZygnTmVlZHMgdXBkYXRlJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGNoZWNrIGJveCBuZWVkcyBhbiBhcHBlYXJhbmNlIHVwZGF0ZS5cbiAgICAgKi9cbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZVN0YXRlKCk7XG4gICAgICAgICAgICB2YXIgbm9ybWFsID0gKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWw7XG4gICAgICAgICAgICBpZiAoIShub3JtYWwgaW5zdGFuY2VvZiBQREZEaWN0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSAmJiAhbm9ybWFsLmhhcyhzdGF0ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBjaGVjayBib3gncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgY2hlY2sgYm94ZXMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKiBjaGVja0JveC5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgY2hlY2sgYm94J3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBnaXZlbiBhcHBlYXJhbmNlIHByb3ZpZGVyLiBJZiBubyBgcHJvdmlkZXJgIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHRcbiAgICAgKiBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBjaGVjayBib3hzIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ3NvbWUuY2hlY2tCb3guZmllbGQnKVxuICAgICAqIGNoZWNrQm94LnVwZGF0ZUFwcGVhcmFuY2VzKChmaWVsZCwgd2lkZ2V0KSA9PiB7XG4gICAgICogICAuLi5cbiAgICAgKiAgIHJldHVybiB7XG4gICAgICogICAgIG5vcm1hbDogeyBvbjogZHJhd0NoZWNrQm94KC4uLiksIG9mZjogZHJhd0NoZWNrQm94KC4uLikgfSxcbiAgICAgKiAgICAgZG93bjogeyBvbjogZHJhd0NoZWNrQm94KC4uLiksIG9mZjogZHJhd0NoZWNrQm94KC4uLikgfSxcbiAgICAgKiAgIH1cbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBwcm92aWRlciBPcHRpb25hbGx5LCB0aGUgYXBwZWFyYW5jZSBwcm92aWRlciB0byBiZSB1c2VkIGZvclxuICAgICAqICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS51cGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHByb3ZpZGVyLCAncHJvdmlkZXInLCBbRnVuY3Rpb25dKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIG9uVmFsdWUgPSAoX2EgPSB3aWRnZXQuZ2V0T25WYWx1ZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBQREZOYW1lLm9mKCdZZXMnKTtcbiAgICAgICAgICAgIGlmICghb25WYWx1ZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIG9uVmFsdWUsIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICh3aWRnZXQsIG9uVmFsdWUsIHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciBhcFByb3ZpZGVyID0gcHJvdmlkZXIgIT09IG51bGwgJiYgcHJvdmlkZXIgIT09IHZvaWQgMCA/IHByb3ZpZGVyIDogZGVmYXVsdENoZWNrQm94QXBwZWFyYW5jZVByb3ZpZGVyO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZXMgPSBub3JtYWxpemVBcHBlYXJhbmNlKGFwUHJvdmlkZXIodGhpcywgd2lkZ2V0KSk7XG4gICAgICAgIHRoaXMudXBkYXRlT25PZmZXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgb25WYWx1ZSwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0Q2hlY2tCb3hdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlIGFuXG4gICAgICogPiBpbnN0YW5jZSBvZiBbW1BERkNoZWNrQm94XV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkNoZWNrQm94XV0gZnJvbSBhbiBleGlzdGluZyBhY3JvQ2hlY2tCb3ggYW5kIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9DaGVja0JveCBUaGUgdW5kZXJseWluZyBgUERGQWNyb0NoZWNrQm94YCBmb3IgdGhpcyBjaGVjayBib3guXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBjaGVjayBib3guXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhpcyBjaGVjayBib3ggd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gub2YgPSBmdW5jdGlvbiAoYWNyb0NoZWNrQm94LCByZWYsIGRvYykge1xuICAgICAgICByZXR1cm4gbmV3IFBERkNoZWNrQm94KGFjcm9DaGVja0JveCwgcmVmLCBkb2MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkNoZWNrQm94O1xufShQREZGaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQ2hlY2tCb3g7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZDaGVja0JveC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuLi9QREZQYWdlXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi4vUERGRm9udFwiO1xuaW1wb3J0IFBERkZpZWxkLCB7IGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMsIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUFwcGVhcmFuY2UsIGRlZmF1bHREcm9wZG93bkFwcGVhcmFuY2VQcm92aWRlciwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuaW1wb3J0IHsgcmdiIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFBERkhleFN0cmluZywgUERGU3RyZWFtLCBQREZBY3JvQ29tYm9Cb3gsIEFjcm9DaG9pY2VGbGFncywgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydE9yVW5kZWZpbmVkLCBhc3NlcnRQb3NpdGl2ZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgZHJvcGRvd24gZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERkRyb3Bkb3duXV0gZmllbGRzIGFyZSBpbnRlcmFjdGl2ZSB0ZXh0IGJveGVzIHRoYXQgZGlzcGxheSBhIHNpbmdsZVxuICogZWxlbWVudCAodGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWx1ZSkuIFRoZSBwdXJwb3NlIG9mIGEgZHJvcGRvd24gaXMgdG9cbiAqIGVuYWJsZSB1c2VycyB0byBzZWxlY3QgYSBzaW5nbGUgb3B0aW9uIGZyb20gYSBzZXQgb2YgcG9zc2libGUgb3B0aW9ucy4gVXNlcnNcbiAqIGNhbiBjbGljayBvbiBhIGRyb3Bkb3duIHRvIHZpZXcgdGhlIGZ1bGwgbGlzdCBvZiBvcHRpb25zIGl0IHByb3ZpZGVzLlxuICogQ2xpY2tpbmcgb24gYW4gb3B0aW9uIGluIHRoZSBsaXN0IHdpbGwgY2F1c2UgaXQgdG8gYmUgc2VsZWN0ZWQgYW5kIGRpc3BsYXllZFxuICogaW4gdGhlIGRyb3Bkb3duJ3MgdGV4dCBib3guIFNvbWUgZHJvcGRvd25zIGFsbG93IHVzZXJzIHRvIGVudGVyIHRleHRcbiAqIGRpcmVjdGx5IGludG8gdGhlIGJveCBmcm9tIHRoZWlyIGtleWJvYXJkLCByYXRoZXIgdGhhbiBvbmx5IGJlaW5nIGFsbG93ZWQgdG9cbiAqIGNob29zZSBhbiBvcHRpb24gZnJvbSB0aGUgbGlzdCAoc2VlIFtbUERGRHJvcGRvd24uaXNFZGl0YWJsZV1dKS5cbiAqL1xudmFyIFBERkRyb3Bkb3duID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZEcm9wZG93biwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZEcm9wZG93bihhY3JvQ29tYm9Cb3gsIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9Db21ib0JveCwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9Db21ib0JveCwgJ2Fjcm9Db21ib0JveCcsIFtcbiAgICAgICAgICAgIFtQREZBY3JvQ29tYm9Cb3gsICdQREZBY3JvQ29tYm9Cb3gnXSxcbiAgICAgICAgXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9Db21ib0JveDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMgZm9yIHRoaXMgZHJvcGRvd24uIFRoZXNlIG9wdGlvbnMgd2lsbCBiZVxuICAgICAqIGRpc3BsYXllZCB0byB1c2VycyB3aG8gY2xpY2sgb24gdGhpcyBkcm9wZG93biBpbiBhIFBERiByZWFkZXIuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSBkcm9wZG93bi5nZXRPcHRpb25zKClcbiAgICAgKiBjb25zb2xlLmxvZygnRHJvcGRvd24gb3B0aW9uczonLCBvcHRpb25zKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpb25zIGZvciB0aGlzIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmF3T3B0aW9ucyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBuZXcgQXJyYXkocmF3T3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gcmF3T3B0aW9uc1tpZHhdLCBkaXNwbGF5ID0gX2EuZGlzcGxheSwgdmFsdWUgPSBfYS52YWx1ZTtcbiAgICAgICAgICAgIG9wdGlvbnNbaWR4XSA9IChkaXNwbGF5ICE9PSBudWxsICYmIGRpc3BsYXkgIT09IHZvaWQgMCA/IGRpc3BsYXkgOiB2YWx1ZSkuZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZWxlY3RlZCBvcHRpb25zIGZvciB0aGlzIGRyb3Bkb3duLiBUaGVzZSBhcmUgdGhlIHZhbHVlcyB0aGF0IHdlcmVcbiAgICAgKiBzZWxlY3RlZCBieSBhIGh1bWFuIHVzZXIgdmlhIGEgUERGIHJlYWRlciwgb3IgcHJvZ3JhbWF0aWNhbGx5IHZpYVxuICAgICAqIHNvZnR3YXJlLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBjb25zdCBzZWxlY3Rpb25zID0gZHJvcGRvd24uZ2V0U2VsZWN0ZWQoKVxuICAgICAqIGNvbnNvbGUubG9nKCdEcm9wZG93biBzZWxlY3Rpb25zOicsIHNlbGVjdGlvbnMpXG4gICAgICogYGBgXG4gICAgICogPiAqKk5PVEU6KiogTm90ZSB0aGF0IFBERiByZWFkZXJzIG9ubHkgZGlzcGxheSBvbmUgc2VsZWN0ZWQgb3B0aW9uIHdoZW5cbiAgICAgKiA+IHJlbmRlcmluZyBkcm9wZG93bnMuIEhvd2V2ZXIsIHRoZSBQREYgc3BlY2lmaWNhdGlvbiBkb2VzIGFsbG93IGZvclxuICAgICAqID4gbXVsdGlwbGUgdmFsdWVzIHRvIGJlIHNlbGVjdGVkIGluIGEgZHJvcGRvd24uIEFzIHN1Y2gsIHRoZSBgcGRmLWxpYmBcbiAgICAgKiA+IEFQSSBzdXBwb3J0cyB0aGlzLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIHRoZSBhcnJheSByZXR1cm5lZCBieSB0aGlzXG4gICAgICogPiBtZXRob2Qgd2lsbCBjb250YWluIG9ubHkgYSBzaW5nbGUgZWxlbWVudCAob3Igbm8gZWxlbWVudHMpLlxuICAgICAqIEByZXR1cm5zIFRoZSBzZWxlY3RlZCBvcHRpb25zIGluIHRoaXMgZHJvcGRvd24uXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmdldFNlbGVjdGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0VmFsdWVzKCk7XG4gICAgICAgIHZhciBzZWxlY3RlZCA9IG5ldyBBcnJheSh2YWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgc2VsZWN0ZWRbaWR4XSA9IHZhbHVlc1tpZHhdLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgZHJvcGRvd24uIFRoZXNlIGFyZVxuICAgICAqIHRoZSB2YWx1ZXMgdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgdG8gc2VsZWN0IHdoZW4gdGhleSB2aWV3IHRoaXNcbiAgICAgKiBkcm9wZG93biBpbiBhIFBERiByZWFkZXIuIE5vdGUgdGhhdCBwcmVleGlzdGluZyBvcHRpb25zIGZvciB0aGlzIGRyb3Bkb3duXG4gICAgICogd2lsbCBiZSByZW1vdmVkLiBPbmx5IHRoZSB2YWx1ZXMgcGFzc2VkIGFzIGBvcHRpb25zYCB3aWxsIGJlIGF2YWlsYWJsZSB0b1xuICAgICAqIHNlbGVjdC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bigncGxhbmV0cy5kcm9wZG93bicpXG4gICAgICogZHJvcGRvd24uc2V0T3B0aW9ucyhbJ0VhcnRoJywgJ01hcnMnLCAnUGx1dG8nLCAnVmVudXMnXSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhpcyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMsICdvcHRpb25zJywgW0FycmF5XSk7XG4gICAgICAgIHZhciBvcHRpb25PYmplY3RzID0gbmV3IEFycmF5KG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG9wdGlvbk9iamVjdHNbaWR4XSA9IHsgdmFsdWU6IFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb25zW2lkeF0pIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0T3B0aW9ucyhvcHRpb25PYmplY3RzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCB0byB0aGUgbGlzdCBvZiBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBkcm9wZG93bi4gVXNlcnNcbiAgICAgKiB3aWxsIGJlIGFibGUgdG8gc2VsZWN0IHRoZXNlIHZhbHVlcyBpbiBhIFBERiByZWFkZXIuIEluIGFkZGl0aW9uIHRvIHRoZVxuICAgICAqIHZhbHVlcyBwYXNzZWQgYXMgYG9wdGlvbnNgLCBhbnkgcHJlZXhpc3Rpbmcgb3B0aW9ucyBmb3IgdGhpcyBkcm9wZG93biB3aWxsXG4gICAgICogc3RpbGwgYmUgYXZhaWxhYmxlIGZvciB1c2VycyB0byBzZWxlY3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3JvY2tldHMuZHJvcGRvd24nKVxuICAgICAqIGRyb3Bkb3duLmFkZE9wdGlvbnMoWydTYXR1cm4gSVYnLCAnRmFsY29uIEhlYXZ5J10pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTmV3IG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoaXMgZHJvcGRvd24uXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmFkZE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLCAnb3B0aW9ucycsIFsnc3RyaW5nJywgQXJyYXldKTtcbiAgICAgICAgdmFyIG9wdGlvbnNBcnIgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IFtvcHRpb25zXTtcbiAgICAgICAgdmFyIGV4aXN0aW5nT3B0aW9ucyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIG5ld09wdGlvbnMgPSBuZXcgQXJyYXkob3B0aW9uc0Fyci5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zQXJyLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgbmV3T3B0aW9uc1tpZHhdID0geyB2YWx1ZTogUERGSGV4U3RyaW5nLmZyb21UZXh0KG9wdGlvbnNBcnJbaWR4XSkgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRPcHRpb25zKGV4aXN0aW5nT3B0aW9ucy5jb25jYXQobmV3T3B0aW9ucykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2VsZWN0IG9uZSBvciBtb3JlIHZhbHVlcyBmb3IgdGhpcyBkcm9wZG93bi4gVGhpcyBvcGVyYXRpb24gaXMgYW5hbG9nb3VzXG4gICAgICogdG8gYSBodW1hbiB1c2VyIG9wZW5pbmcgdGhlIGRyb3Bkb3duIGluIGEgUERGIHJlYWRlciBhbmQgY2xpY2tpbmcgb24gYVxuICAgICAqIHZhbHVlIHRvIHNlbGVjdCBpdC4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlXG4gICAgICogZHJvcGRvd24gdG8gaW5kaWNhdGUgd2hpY2ggdmFsdWVzIGhhdmUgYmVlbiBzZWxlY3RlZC4gUERGIGxpYnJhcmllcyBhbmRcbiAgICAgKiByZWFkZXJzIHdpbGwgYmUgYWJsZSB0byBleHRyYWN0IHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBzYXZlZCBkb2N1bWVudCBhbmRcbiAgICAgKiBkZXRlcm1pbmUgd2hpY2ggdmFsdWVzIHdlcmUgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignYmVzdC5zdXBlcmhlcm8uZHJvcGRvd24nKVxuICAgICAqIGRyb3Bkb3duLnNlbGVjdCgnT25lIFB1bmNoIE1hbicpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyBkcm9wZG93biBhcyBkaXJ0eSwgY2F1c2luZyBpdHMgYXBwZWFyYW5jZVxuICAgICAqIHN0cmVhbXMgdG8gYmUgdXBkYXRlZCB3aGVuIGVpdGhlciBbW1BERkRvY3VtZW50LnNhdmVdXSBvclxuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gaXMgY2FsbGVkLiBUaGUgdXBkYXRlZCBzdHJlYW1zIHdpbGxcbiAgICAgKiBkaXNwbGF5IHRoZSBzZWxlY3RlZCBvcHRpb24gaW5zaWRlIHRoZSB3aWRnZXRzIG9mIHRoaXMgZHJvcGRvd24uXG4gICAgICpcbiAgICAgKiAqKklNUE9SVEFOVDoqKiBUaGUgZGVmYXVsdCBmb250IHVzZWQgdG8gdXBkYXRlIGFwcGVhcmFuY2Ugc3RyZWFtcyBpc1xuICAgICAqIFtbU3RhbmRhcmRGb250cy5IZWx2ZXRpY2FdXS4gTm90ZSB0aGF0IHRoaXMgaXMgYSBXaW5BbnNpIGZvbnQuIFRoaXMgbWVhbnNcbiAgICAgKiB0aGF0IGVuY29kaW5nIGVycm9ycyB3aWxsIGJlIHRocm93biBpZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGZvciB0aGlzIGZpZWxkXG4gICAgICogY29udGFpbnMgY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBXaW5BbnNpIGNoYXJhY3RlciBzZXQgKHRoZSBsYXRpbiBhbHBoYWJldCkuXG4gICAgICpcbiAgICAgKiBFbWJlZGRpbmcgYSBjdXN0b20gZm9udCBhbmQgcGFzc2luZyBpdCB0b1xuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gb3IgW1tQREZEcm9wZG93bi51cGRhdGVBcHBlYXJhbmNlc11dXG4gICAgICogYWxsb3dzIHlvdSB0byBnZW5lcmF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgd2l0aCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlXG4gICAgICogbGF0aW4gYWxwaGFiZXQgKGFzc3VtaW5nIHRoZSBjdXN0b20gZm9udCBzdXBwb3J0cyB0aGVtKS5cbiAgICAgKlxuICAgICAqIFNlbGVjdGluZyBhbiBvcHRpb24gdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGRyb3Bkb3duJ3Mgb3B0aW9uIGxpc3RcbiAgICAgKiAoc2VlIFtbUERGRHJvcGRvd24uZ2V0T3B0aW9uc11dKSB3aWxsIGVuYWJsZSBlZGl0aW5nIG9uIHRoaXMgZHJvcGRvd25cbiAgICAgKiAoc2VlIFtbUERGRHJvcGRvd24uZW5hYmxlRWRpdGluZ11dKS5cbiAgICAgKlxuICAgICAqID4gKipOT1RFOioqIFBERiByZWFkZXJzIG9ubHkgZGlzcGxheSBvbmUgc2VsZWN0ZWQgb3B0aW9uIHdoZW4gcmVuZGVyaW5nXG4gICAgICogPiBkcm9wZG93bnMuIEhvd2V2ZXIsIHRoZSBQREYgc3BlY2lmaWNhdGlvbiBkb2VzIGFsbG93IGZvciBtdWx0aXBsZSB2YWx1ZXNcbiAgICAgKiA+IHRvIGJlIHNlbGVjdGVkIGluIGEgZHJvcGRvd24uIEFzIHN1Y2gsIHRoZSBgcGRmLWxpYmAgQVBJIHN1cHBvcnRzIHRoaXMuXG4gICAgICogPiBIb3dldmVyLCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gc2VsZWN0IG1vcmUgdGhhbiBvbmUgdmFsdWUgd2l0aCB0aGlzXG4gICAgICogPiBtZXRob2QsIGFzIG9ubHkgb25lIHdpbGwgYmUgdmlzaWJsZS4gW1tQREZPcHRpb25MaXN0XV0gZmllbGRzIGFyZSBiZXR0ZXJcbiAgICAgKiA+IHN1aXRlZCBmb3IgZGlzcGxheWluZyBtdWx0aXBsZSBzZWxlY3RlZCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSBzZWxlY3RlZC5cbiAgICAgKiBAcGFyYW0gbWVyZ2UgV2hldGhlciBvciBub3QgZXhpc3Rpbmcgc2VsZWN0aW9ucyBzaG91bGQgYmUgcHJlc2VydmVkLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbiAob3B0aW9ucywgbWVyZ2UpIHtcbiAgICAgICAgaWYgKG1lcmdlID09PSB2b2lkIDApIHsgbWVyZ2UgPSBmYWxzZTsgfVxuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLCAnb3B0aW9ucycsIFsnc3RyaW5nJywgQXJyYXldKTtcbiAgICAgICAgYXNzZXJ0SXMobWVyZ2UsICdtZXJnZScsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgdmFyIG9wdGlvbnNBcnIgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IFtvcHRpb25zXTtcbiAgICAgICAgdmFyIHZhbGlkT3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICB2YXIgaGFzQ3VzdG9tT3B0aW9uID0gb3B0aW9uc0Fyci5maW5kKGZ1bmN0aW9uIChvcHRpb24pIHsgcmV0dXJuICF2YWxpZE9wdGlvbnMuaW5jbHVkZXMob3B0aW9uKTsgfSk7XG4gICAgICAgIGlmIChoYXNDdXN0b21PcHRpb24pXG4gICAgICAgICAgICB0aGlzLmVuYWJsZUVkaXRpbmcoKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICBpZiAob3B0aW9uc0Fyci5sZW5ndGggPiAxIHx8IChvcHRpb25zQXJyLmxlbmd0aCA9PT0gMSAmJiBtZXJnZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlTXVsdGlzZWxlY3QoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVzID0gbmV3IEFycmF5KG9wdGlvbnNBcnIubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9uc0Fyci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhbHVlc1tpZHhdID0gUERGSGV4U3RyaW5nLmZyb21UZXh0KG9wdGlvbnNBcnJbaWR4XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlcyhleGlzdGluZ1ZhbHVlcy5jb25jYXQodmFsdWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZXModmFsdWVzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHNlbGVjdGVkIHZhbHVlcyBmb3IgdGhpcyBkcm9wZG93bi4gVGhpcyBvcGVyYXRpb24gaXMgZXF1aXZhbGVudFxuICAgICAqIHRvIHNlbGVjdGluZyBhbiBlbXB0eSBsaXN0LiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBzdGF0ZVxuICAgICAqIG9mIHRoZSBkcm9wZG93biB0byBpbmRpY2F0ZSB0aGF0IG5vIHZhbHVlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmNsZWFyKClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWUgW1tQREZEcm9wZG93bi5zZWxlY3RdXVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZXMoW10pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmb250IHNpemUgZm9yIHRoaXMgZmllbGQuIExhcmdlciBmb250IHNpemVzIHdpbGwgcmVzdWx0IGluIGxhcmdlclxuICAgICAqIHRleHQgYmVpbmcgZGlzcGxheWVkIHdoZW4gUERGIHJlYWRlcnMgcmVuZGVyIHRoaXMgZHJvcGRvd24uIEZvbnQgc2l6ZXMgbWF5XG4gICAgICogYmUgaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBTdXBwbHlpbmcgYSBuZWdhdGl2ZSBmb250IHNpemUgd2lsbFxuICAgICAqIGNhdXNlIHRoaXMgbWV0aG9kIHRvIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLnNldEZvbnRTaXplKDQpXG4gICAgICogZHJvcGRvd24uc2V0Rm9udFNpemUoMTUuNylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqID4gVGhpcyBtZXRob2QgZGVwZW5kcyB1cG9uIHRoZSBleGlzdGVuY2Ugb2YgYSBkZWZhdWx0IGFwcGVhcmFuY2VcbiAgICAgKiA+IChgL0RBYCkgc3RyaW5nLiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGFwcGVhcmFuY2Ugc3RyaW5nLFxuICAgICAqID4gb3IgdGhhdCBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhIGZvbnQgc2l6ZSAodmlhIHRoZSBgVGZgIG9wZXJhdG9yKSxcbiAgICAgKiA+IHRoZW4gdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb250U2l6ZSBUaGUgZm9udCBzaXplIHRvIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGV4dCBpbiB0aGlzIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICBhc3NlcnRQb3NpdGl2ZShmb250U2l6ZSwgJ2ZvbnRTaXplJyk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdXNlcnMgYXJlIGFsbG93ZWQgdG8gZWRpdCB0aGUgc2VsZWN0ZWQgdmFsdWUgb2YgdGhpc1xuICAgICAqIGRyb3Bkb3duIGRpcmVjdGx5IGFuZCBhcmUgbm90IGNvbnN0cmFpbmVkIGJ5IHRoZSBsaXN0IG9mIGF2YWlsYWJsZVxuICAgICAqIG9wdGlvbnMuIFNlZSBbW1BERkRyb3Bkb3duLmVuYWJsZUVkaXRpbmddXSBhbmRcbiAgICAgKiBbW1BERkRyb3Bkb3duLmRpc2FibGVFZGl0aW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBpZiAoZHJvcGRvd24uaXNFZGl0YWJsZSgpKSBjb25zb2xlLmxvZygnRWRpdGluZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGRyb3Bkb3duIGlzIGVkaXRhYmxlLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5pc0VkaXRhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuRWRpdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2VycyB0byBlZGl0IHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGlzIGRyb3Bkb3duIGluIFBERiByZWFkZXJzXG4gICAgICogd2l0aCB0aGVpciBrZXlib2FyZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGlzIGRyb3Bkb3duXG4gICAgICogd2lsbCBub3QgYmUgY29uc3RyYWluZWQgYnkgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMuIEhvd2V2ZXIsIGlmIHRoaXNcbiAgICAgKiBkcm9wZG93biBoYXMgYW55IGF2YWlsYWJsZSBvcHRpb25zLCB1c2VycyB3aWxsIHN0aWxsIGJlIGFsbG93ZWQgdG8gc2VsZWN0XG4gICAgICogZnJvbSB0aGF0IGxpc3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmVuYWJsZUVkaXRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5lbmFibGVFZGl0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkVkaXQsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IHVzZXJzIHRvIGVkaXQgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoaXMgZHJvcGRvd24gaW4gUERGXG4gICAgICogcmVhZGVycyB3aXRoIHRoZWlyIGtleWJvYXJkLiBUaGlzIHdpbGwgY29uc3RyYWluIHRoZSBzZWxlY3RlZCB2YWx1ZSBvZlxuICAgICAqIHRoaXMgZHJvcGRvd24gdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMuIFVzZXJzIHdpbGwgb25seSBiZSBhYmxlXG4gICAgICogdG8gc2VsZWN0IGFuIG9wdGlvbiBmcm9tIHRoYXQgbGlzdC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZGlzYWJsZUVkaXRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5kaXNhYmxlRWRpdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5FZGl0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb3B0aW9uIGxpc3Qgb2YgdGhpcyBkcm9wZG93biBpcyBhbHdheXMgZGlzcGxheWVkXG4gICAgICogaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBpcnJlc3BlY3RpdmUgb2YgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBvcHRpb25zXG4gICAgICogd2VyZSBhZGRlZCB0byB0aGUgZHJvcGRvd24uIFNlZSBbW1BERkRyb3Bkb3duLmVuYWJsZVNvcnRpbmddXSBhbmRcbiAgICAgKiBbW1BERkRyb3Bkb3duLmRpc2FibGVTb3J0aW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBpZiAoZHJvcGRvd24uaXNTb3J0ZWQoKSkgY29uc29sZS5sb2coJ1NvcnRpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBkcm9wZG93bidzIG9wdGlvbnMgYXJlIHNvcnRlZC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuaXNTb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5Tb3J0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsd2F5cyBkaXNwbGF5IHRoZSBvcHRpb24gbGlzdCBvZiB0aGlzIGRyb3Bkb3duIGluIGFscGhhYmV0aWNhbCBvcmRlcixcbiAgICAgKiBpcnJlc3BlY3RpdmUgb2YgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBvcHRpb25zIHdlcmUgYWRkZWQgdG8gdGhpcyBkcm9wZG93bi5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZW5hYmxlU29ydGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmVuYWJsZVNvcnRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgYWx3YXlzIGRpc3BsYXkgdGhlIG9wdGlvbiBsaXN0IG9mIHRoaXMgZHJvcGRvd24gaW4gYWxwaGFiZXRpY2FsXG4gICAgICogb3JkZXIuIEluc3RlYWQsIGRpc3BsYXkgdGhlIG9wdGlvbnMgaW4gd2hpY2hldmVyIG9yZGVyIHRoZXkgd2VyZSBhZGRlZFxuICAgICAqIHRvIHRoZSBsaXN0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZGlzYWJsZVNvcnRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5kaXNhYmxlU29ydGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Tb3J0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBtdWx0aXBsZSBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZCBmcm9tIHRoaXMgZHJvcGRvd24nc1xuICAgICAqIG9wdGlvbiBsaXN0LiBTZWUgW1tQREZEcm9wZG93bi5lbmFibGVNdWx0aXNlbGVjdF1dIGFuZFxuICAgICAqIFtbUERGRHJvcGRvd24uZGlzYWJsZU11bHRpc2VsZWN0XV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBpZiAoZHJvcGRvd24uaXNNdWx0aXNlbGVjdCgpKSBjb25zb2xlLmxvZygnTXVsdGlzZWxlY3QgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmlzTXVsdGlzZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5NdWx0aVNlbGVjdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2VycyB0byBzZWxlY3QgbW9yZSB0aGFuIG9uZSBvcHRpb24gZnJvbSB0aGlzIGRyb3Bkb3duJ3Mgb3B0aW9uXG4gICAgICogbGlzdC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmVuYWJsZU11bHRpc2VsZWN0KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZW5hYmxlTXVsdGlzZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IHVzZXJzIHRvIHNlbGVjdCBtb3JlIHRoYW4gb25lIG9wdGlvbiBmcm9tIHRoaXMgZHJvcGRvd24nc1xuICAgICAqIG9wdGlvbiBsaXN0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZGlzYWJsZU11bHRpc2VsZWN0KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZGlzYWJsZU11bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHNob3VsZCBiZSBzcGVsbCBjaGVja2VkIGJ5IFBERlxuICAgICAqIHJlYWRlcnMuIFNwZWxsIGNoZWNraW5nIHdpbGwgb25seSBiZSBwZXJmb3JtZWQgaWYgdGhpcyBkcm9wZG93biBhbGxvd3NcbiAgICAgKiBlZGl0aW5nIChzZWUgW1tQREZEcm9wZG93bi5pc0VkaXRhYmxlXV0pLiBTZWVcbiAgICAgKiBbW1BERkRyb3Bkb3duLmVuYWJsZVNwZWxsQ2hlY2tpbmddXSBhbmRcbiAgICAgKiBbW1BERkRyb3Bkb3duLmRpc2FibGVTcGVsbENoZWNraW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBpZiAoZHJvcGRvd24uaXNTcGVsbENoZWNrZWQoKSkgY29uc29sZS5sb2coJ1NwZWxsIGNoZWNraW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZHJvcGRvd24gY2FuIGJlIHNwZWxsIGNoZWNrZWQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmlzU3BlbGxDaGVja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLkRvTm90U3BlbGxDaGVjayk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBQREYgcmVhZGVycyB0byBzcGVsbCBjaGVjayB0aGUgc2VsZWN0ZWQgb3B0aW9uIG9mIHRoaXMgZHJvcGRvd24uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmVuYWJsZVNwZWxsQ2hlY2tpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5lbmFibGVTcGVsbENoZWNraW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkRvTm90U3BlbGxDaGVjaywgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IFBERiByZWFkZXJzIHRvIHNwZWxsIGNoZWNrIHRoZSBzZWxlY3RlZCBvcHRpb24gb2YgdGhpc1xuICAgICAqIGRyb3Bkb3duLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZGlzYWJsZVNwZWxsQ2hlY2tpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5kaXNhYmxlU3BlbGxDaGVja2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Eb05vdFNwZWxsQ2hlY2ssIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9wdGlvbiBzZWxlY3RlZCBieSBhIHVzZXIgaXMgc3RvcmVkLCBvciBcImNvbW1pdHRlZFwiLFxuICAgICAqIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBvcHRpb24uIFRoZSBhbHRlcm5hdGl2ZSBpcyB0aGF0IHRoZSB1c2VyJ3NcbiAgICAgKiBzZWxlY3Rpb24gaXMgc3RvcmVkIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoaXMgZHJvcGRvd24gZmllbGQgKGJ5IGNsaWNraW5nXG4gICAgICogb3V0c2lkZSBvZiBpdCAtIG9uIGFub3RoZXIgZmllbGQsIGZvciBleGFtcGxlKS4gU2VlXG4gICAgICogW1tQREZEcm9wZG93bi5lbmFibGVTZWxlY3RPbkNsaWNrXV0gYW5kXG4gICAgICogW1tQREZEcm9wZG93bi5kaXNhYmxlU2VsZWN0T25DbGlja11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogaWYgKGRyb3Bkb3duLmlzU2VsZWN0T25DbGljaygpKSBjb25zb2xlLmxvZygnU2VsZWN0IG9uIGNsaWNrIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IG9wdGlvbnMgYXJlIHNlbGVjdGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZXkgYXJlXG4gICAgICogICAgICAgICAgY2xpY2tlZC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuaXNTZWxlY3RPbkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuQ29tbWl0T25TZWxDaGFuZ2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3RvcmUgdGhlIG9wdGlvbiBzZWxlY3RlZCBieSBhIHVzZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZXIgY2xpY2tzIHRoZVxuICAgICAqIG9wdGlvbi4gRG8gbm90IHdhaXQgZm9yIHRoZSB1c2VyIHRvIGxlYXZlIHRoaXMgZHJvcGRvd24gZmllbGQgKGJ5IGNsaWNraW5nXG4gICAgICogb3V0c2lkZSBvZiBpdCAtIG9uIGFub3RoZXIgZmllbGQsIGZvciBleGFtcGxlKS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmVuYWJsZVNlbGVjdE9uQ2xpY2soKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5lbmFibGVTZWxlY3RPbkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkNvbW1pdE9uU2VsQ2hhbmdlLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdhaXQgdG8gc3RvcmUgdGhlIG9wdGlvbiBzZWxlY3RlZCBieSBhIHVzZXIgdW50aWwgdGhleSBsZWF2ZSB0aGlzIGRyb3Bkb3duXG4gICAgICogZmllbGQgKGJ5IGNsaWNraW5nIG91dHNpZGUgb2YgaXQgLSBvbiBhbm90aGVyIGZpZWxkLCBmb3IgZXhhbXBsZSkuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmRpc2FibGVTZWxlY3RPbkNsaWNrKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZGlzYWJsZVNlbGVjdE9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuQ29tbWl0T25TZWxDaGFuZ2UsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNob3cgdGhpcyBkcm9wZG93biBvbiB0aGUgc3BlY2lmaWVkIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdWJ1bnR1Rm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQodWJ1bnR1Rm9udEJ5dGVzKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5jcmVhdGVEcm9wZG93bignYmVzdC5ndW5kYW0nKVxuICAgICAqIGRyb3Bkb3duLnNldE9wdGlvbnMoWydFeGlhJywgJ0R5bmFtZXMnXSlcbiAgICAgKiBkcm9wZG93bi5zZWxlY3QoJ0V4aWEnKVxuICAgICAqXG4gICAgICogZHJvcGRvd24uYWRkVG9QYWdlKHBhZ2UsIHtcbiAgICAgKiAgIHg6IDUwLFxuICAgICAqICAgeTogNzUsXG4gICAgICogICB3aWR0aDogMjAwLFxuICAgICAqICAgaGVpZ2h0OiAxMDAsXG4gICAgICogICB0ZXh0Q29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgIGJhY2tncm91bmRDb2xvcjogcmdiKDAsIDEsIDApLFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLCAwLCAxKSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDkwKSxcbiAgICAgKiAgIGZvbnQ6IHVidW50dUZvbnQsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHdpZGdldCBmb3IgdGhpcyBkcm9wZG93biBmaWVsZC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGlzIGRyb3Bkb3duIHdpZGdldCBzaG91bGQgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGFkZGluZyB0aGlzIGRyb3Bkb3duIHdpZGdldC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuYWRkVG9QYWdlID0gZnVuY3Rpb24gKHBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIGlmICghKCd0ZXh0Q29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy50ZXh0Q29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdiYWNrZ3JvdW5kQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgPSByZ2IoMSwgMSwgMSk7XG4gICAgICAgIGlmICghKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYm9yZGVyV2lkdGgnIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDE7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyBkcm9wZG93blxuICAgICAgICB2YXIgd2lkZ2V0ID0gdGhpcy5jcmVhdGVXaWRnZXQoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwLFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwLFxuICAgICAgICAgICAgd2lkdGg6IChfYyA9IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDIwMCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDUwLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2UgPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwLFxuICAgICAgICAgICAgcm90YXRlOiAoX2YgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGhpZGRlbjogb3B0aW9ucy5oaWRkZW4sXG4gICAgICAgICAgICBwYWdlOiBwYWdlLnJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGlzIGZpZWxkXG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLmFkZFdpZGdldCh3aWRnZXRSZWYpO1xuICAgICAgICAvLyBTZXQgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciB3aWRnZXRcbiAgICAgICAgdmFyIGZvbnQgPSAoX2cgPSBvcHRpb25zLmZvbnQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHRoaXMuZG9jLmdldEZvcm0oKS5nZXREZWZhdWx0Rm9udCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGUgZ2l2ZW4gcGFnZVxuICAgICAgICBwYWdlLm5vZGUuYWRkQW5ub3Qod2lkZ2V0UmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgZHJvcGRvd24gaGFzIGJlZW4gbWFya2VkIGFzIGRpcnR5LCBvciBpZiBhbnkgb2ZcbiAgICAgKiB0aGlzIGRyb3Bkb3duJ3Mgd2lkZ2V0cyBkbyBub3QgaGF2ZSBhbiBhcHBlYXJhbmNlIHN0cmVhbS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGlmIChkcm9wZG93bi5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIGNvbnNvbGUubG9nKCdOZWVkcyB1cGRhdGUnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZHJvcGRvd24gbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSgpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBoYXNBcHBlYXJhbmNlcyA9ICgoX2EgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZXMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vcm1hbCkgaW5zdGFuY2VvZiBQREZTdHJlYW07XG4gICAgICAgICAgICBpZiAoIWhhc0FwcGVhcmFuY2VzKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgZHJvcGRvd24ncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgZHJvcGRvd25zLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoZm9udCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGRyb3Bkb3duJ3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBnaXZlbiBhcHBlYXJhbmNlIHByb3ZpZGVyLiBJZiBubyBgcHJvdmlkZXJgIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHRcbiAgICAgKiBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBkcm9wZG93bnMgd2lsbCBiZSB1c2VkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi51cGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EsIChmaWVsZCwgd2lkZ2V0LCBmb250KSA9PiB7XG4gICAgICogICAuLi5cbiAgICAgKiAgIHJldHVybiBkcmF3VGV4dEZpZWxkKC4uLilcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIE9wdGlvbmFsbHksIHRoZSBhcHBlYXJhbmNlIHByb3ZpZGVyIHRvIGJlIHVzZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLnVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHByb3ZpZGVyLCAncHJvdmlkZXInLCBbRnVuY3Rpb25dKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzQ2xlYW4oKTtcbiAgICB9O1xuICAgIC8vIGdldE9wdGlvbihpbmRleDogbnVtYmVyKTogc3RyaW5nIHt9XG4gICAgLy8gZ2V0U2VsZWN0ZWRJbmRpY2VzKCk6IG51bWJlcltdIHt9XG4gICAgLy8gcmVtb3ZlT3B0aW9ucyhvcHRpb246IHN0cmluZyB8IHN0cmluZ1tdKSB7fVxuICAgIC8vIHJlbW92ZUluZGljZXMob3B0aW9uOiBudW1iZXJbXSkge31cbiAgICAvLyBkZXNlbGVjdChvcHRpb25zOiBzdHJpbmcgfCBzdHJpbmdbXSkge31cbiAgICAvLyBkZXNlbGVjdEluZGljZXMob3B0aW9uSW5kaWNlczogbnVtYmVyW10pIHt9XG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBmb250LCBwcm92aWRlcikge1xuICAgICAgICB2YXIgYXBQcm92aWRlciA9IHByb3ZpZGVyICE9PSBudWxsICYmIHByb3ZpZGVyICE9PSB2b2lkIDAgPyBwcm92aWRlciA6IGRlZmF1bHREcm9wZG93bkFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCwgZm9udCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VXaXRoRm9udCh3aWRnZXQsIGZvbnQsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldERyb3Bkb3duXV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZEcm9wZG93bl1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZEcm9wZG93bl1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb0NvbWJvQm94IGFuZCByZWZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvQ29tYm9Cb3ggVGhlIHVuZGVybHlpbmcgYFBERkFjcm9Db21ib0JveGAgZm9yIHRoaXMgZHJvcGRvd24uXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBkcm9wZG93bi5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGlzIGRyb3Bkb3duIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLm9mID0gZnVuY3Rpb24gKGFjcm9Db21ib0JveCwgcmVmLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZEcm9wZG93bihhY3JvQ29tYm9Cb3gsIHJlZiwgZG9jKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZEcm9wZG93bjtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkRyb3Bkb3duO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRHJvcGRvd24uanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRG9jdW1lbnQgZnJvbSBcIi4uL1BERkRvY3VtZW50XCI7XG5pbXBvcnQgeyBjb2xvclRvQ29tcG9uZW50cywgc2V0RmlsbGluZ0NvbG9yIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgdG9EZWdyZWVzLCByb3RhdGVSZWN0YW5nbGUsIHJlZHVjZVJvdGF0aW9uLCBhZGp1c3REaW1zRm9yUm90YXRpb24sIGRlZ3JlZXMsIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgUERGUmVmLCBQREZXaWRnZXRBbm5vdGF0aW9uLCBQREZOYW1lLCBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yLCBBY3JvRmllbGRGbGFncywgUERGQWNyb1Rlcm1pbmFsLCBBbm5vdGF0aW9uRmxhZ3MsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRNdWx0aXBsZSwgYXNzZXJ0T3JVbmRlZmluZWQgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IEltYWdlQWxpZ25tZW50IH0gZnJvbSAnLi4vaW1hZ2UnO1xuaW1wb3J0IHsgZHJhd0ltYWdlLCByb3RhdGVJblBsYWNlIH0gZnJvbSAnLi4vb3BlcmF0aW9ucyc7XG5leHBvcnQgdmFyIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2lkdGgsICdvcHRpb25zLndpZHRoJywgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlaWdodCwgJ29wdGlvbnMuaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnRleHRDb2xvciwgJ29wdGlvbnMudGV4dENvbG9yJywgW1xuICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICBdKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLCAnb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3InLCBbXG4gICAgICAgIFtPYmplY3QsICdDb2xvciddLFxuICAgIF0pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJDb2xvciwgJ29wdGlvbnMuYm9yZGVyQ29sb3InLCBbXG4gICAgICAgIFtPYmplY3QsICdDb2xvciddLFxuICAgIF0pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJXaWR0aCwgJ29wdGlvbnMuYm9yZGVyV2lkdGgnLCBbJ251bWJlciddKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgYSBmaWVsZCBvZiBhIFtbUERGRm9ybV1dLlxuICpcbiAqIFRoaXMgY2xhc3MgaXMgZWZmZWN0aXZlbHkgYWJzdHJhY3QuIEFsbCBmaWVsZHMgaW4gYSBbW1BERkZvcm1dXSB3aWxsXG4gKiBhY3R1YWxseSBiZSBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIHRoaXMgY2xhc3MuXG4gKlxuICogTm90ZSB0aGF0IGVhY2ggZmllbGQgaW4gYSBQREYgaXMgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZmllbGQgb2JqZWN0LlxuICogSG93ZXZlciwgYSBnaXZlbiBmaWVsZCBvYmplY3QgbWF5IGJlIHJlbmRlcmVkIGF0IG11bHRpcGxlIGxvY2F0aW9ucyB3aXRoaW5cbiAqIHRoZSBkb2N1bWVudCAoYWNyb3NzIG9uZSBvciBtb3JlIHBhZ2VzKS4gVGhlIHJlbmRlcmluZyBvZiBhIGZpZWxkIGlzXG4gKiBjb250cm9sbGVkIGJ5IGl0cyB3aWRnZXRzLiBFYWNoIHdpZGdldCBjYXVzZXMgaXRzIGZpZWxkIHRvIGJlIGRpc3BsYXllZCBhdCBhXG4gKiBwYXJ0aWN1bGFyIGxvY2F0aW9uIGluIHRoZSBkb2N1bWVudC5cbiAqXG4gKiBNb3N0IG9mIHRoZSB0aW1lIGVhY2ggZmllbGQgaW4gYSBQREYgaGFzIG9ubHkgYSBzaW5nbGUgd2lkZ2V0LCBhbmQgdGh1cyBpc1xuICogb25seSByZW5kZXJlZCBvbmNlLiBIb3dldmVyLCBpZiBhIGZpZWxkIGlzIHJlbmRlcmVkIG11bHRpcGxlIHRpbWVzLCBpdCB3aWxsXG4gKiBoYXZlIG11bHRpcGxlIHdpZGdldHMgLSBvbmUgZm9yIGVhY2ggbG9jYXRpb24gaXQgaXMgcmVuZGVyZWQuXG4gKlxuICogVGhpcyBhYnN0cmFjdGlvbiBvZiBmaWVsZCBvYmplY3RzIGFuZCB3aWRnZXRzIGlzIGRlZmluZWQgaW4gdGhlIFBERlxuICogc3BlY2lmaWNhdGlvbiBhbmQgZGljdGF0ZXMgaG93IFBERiBmaWxlcyBzdG9yZSBmaWVsZHMgYW5kIHdoZXJlIHRoZXkgYXJlXG4gKiB0byBiZSByZW5kZXJlZC5cbiAqL1xudmFyIFBERkZpZWxkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkZpZWxkKGFjcm9GaWVsZCwgcmVmLCBkb2MpIHtcbiAgICAgICAgYXNzZXJ0SXMoYWNyb0ZpZWxkLCAnYWNyb0ZpZWxkJywgW1tQREZBY3JvVGVybWluYWwsICdQREZBY3JvVGVybWluYWwnXV0pO1xuICAgICAgICBhc3NlcnRJcyhyZWYsICdyZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIGFzc2VydElzKGRvYywgJ2RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkID0gYWNyb0ZpZWxkO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBmaWVsZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZHMgPSBmb3JtLmdldEZpZWxkcygpXG4gICAgICogZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAqICAgY29uc3QgbmFtZSA9IGZpZWxkLmdldE5hbWUoKVxuICAgICAqICAgY29uc29sZS5sb2coJ0ZpZWxkIG5hbWU6JywgbmFtZSlcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCBQREYgZmllbGRzIGFyZSBzdHJ1Y3R1cmVkIGFzIGEgdHJlZS4gRWFjaCBmaWVsZCBpcyB0aGVcbiAgICAgKiBkZXNjZW5kZW50IG9mIGEgc2VyaWVzIG9mIGFuY2VzdG9yIG5vZGVzIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSBmb3JtIG5vZGUsXG4gICAgICogd2hpY2ggaXMgYWx3YXlzIHRoZSByb290IG9mIHRoZSB0cmVlLiBFYWNoIG5vZGUgaW4gdGhlIHRyZWUgKGV4Y2VwdCBmb3JcbiAgICAgKiB0aGUgZm9ybSBub2RlKSBoYXMgYSBwYXJ0aWFsIG5hbWUuIFBhcnRpYWwgbmFtZXMgY2FuIGJlIGNvbXBvc2VkIG9mIGFueVxuICAgICAqIHVuaWNvZGUgY2hhcmFjdGVycyBleGNlcHQgYSBwZXJpb2QgKGAuYCkuIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhXG4gICAgICogZmllbGQgaXMgY29tcG9zZWQgb2YgdGhlIHBhcnRpYWwgbmFtZXMgb2YgYWxsIGl0cyBhbmNlc3RvcnMgam9pbmVkXG4gICAgICogd2l0aCBwZXJpb2RzLiBUaGlzIG1lYW5zIHRoYXQgc3BsaXR0aW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvblxuICAgICAqIHBlcmlvZHMgYW5kIHRha2luZyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSByZXN1bHRpbmcgYXJyYXkgd2lsbCBnaXZlIHlvdVxuICAgICAqIHRoZSBwYXJ0aWFsIG5hbWUgb2YgYSBzcGVjaWZpYyBmaWVsZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5hY3JvRmllbGQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBmaWVsZCBpcyByZWFkIG9ubHkuIFRoaXMgbWVhbnMgdGhhdCBQREYgcmVhZGVyc1xuICAgICAqIHdpbGwgbm90IGFsbG93IHVzZXJzIHRvIGludGVyYWN0IHdpdGggdGhlIGZpZWxkIG9yIGNoYW5nZSBpdHMgdmFsdWUuIFNlZVxuICAgICAqIFtbUERGRmllbGQuZW5hYmxlUmVhZE9ubHldXSBhbmQgW1tQREZGaWVsZC5kaXNhYmxlUmVhZE9ubHldXS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogaWYgKGZpZWxkLmlzUmVhZE9ubHkoKSkgY29uc29sZS5sb2coJ1JlYWQgb25seSBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGlzIGEgcmVhZCBvbmx5IGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5pc1JlYWRPbmx5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvRmllbGRGbGFncy5SZWFkT25seSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IFBERiByZWFkZXJzIGZyb20gYWxsb3dpbmcgdXNlcnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGlzIGZpZWxkIG9yXG4gICAgICogY2hhbmdlIGl0cyB2YWx1ZS4gVGhlIGZpZWxkIHdpbGwgbm90IHJlc3BvbmQgdG8gbW91c2Ugb3Iga2V5Ym9hcmQgaW5wdXQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGZpZWxkLmVuYWJsZVJlYWRPbmx5KClcbiAgICAgKiBgYGBcbiAgICAgKiBVc2VmdWwgZm9yIGZpZWxkcyB3aG9zZSB2YWx1ZXMgYXJlIGNvbXB1dGVkLCBpbXBvcnRlZCBmcm9tIGEgZGF0YWJhc2UsIG9yXG4gICAgICogcHJlZmlsbGVkIGJ5IHNvZnR3YXJlIGJlZm9yZSBiZWluZyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmVuYWJsZVJlYWRPbmx5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0ZpZWxkRmxhZ3MuUmVhZE9ubHksIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgdXNlcnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGlzIGZpZWxkIGFuZCBjaGFuZ2UgaXRzIHZhbHVlIGluIFBERlxuICAgICAqIHJlYWRlcnMgdmlhIG1vdXNlIGFuZCBrZXlib2FyZCBpbnB1dC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGZpZWxkLmRpc2FibGVSZWFkT25seSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmRpc2FibGVSZWFkT25seSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9GaWVsZEZsYWdzLlJlYWRPbmx5LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGZpZWxkIG11c3QgaGF2ZSBhIHZhbHVlIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLlxuICAgICAqIFNlZSBbW1BERkZpZWxkLmVuYWJsZVJlcXVpcmVkXV0gYW5kIFtbUERGRmllbGQuZGlzYWJsZVJlcXVpcmVkXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGlmIChmaWVsZC5pc1JlcXVpcmVkKCkpIGNvbnNvbGUubG9nKCdGaWVsZCBpcyByZXF1aXJlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBmaWVsZCBpcyByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuaXNSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0ZpZWxkRmxhZ3MuUmVxdWlyZWQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVxdWlyZSB0aGlzIGZpZWxkIHRvIGhhdmUgYSB2YWx1ZSB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogZmllbGQuZW5hYmxlUmVxdWlyZWQoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5lbmFibGVSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9GaWVsZEZsYWdzLlJlcXVpcmVkLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCByZXF1aXJlIHRoaXMgZmllbGQgdG8gaGF2ZSBhIHZhbHVlIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBmaWVsZC5kaXNhYmxlUmVxdWlyZWQoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5kaXNhYmxlUmVxdWlyZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvRmllbGRGbGFncy5SZXF1aXJlZCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBmaWVsZCdzIHZhbHVlIHNob3VsZCBiZSBleHBvcnRlZCB3aGVuIHRoZSBmb3JtIGlzXG4gICAgICogc3VibWl0dGVkLiBTZWUgW1tQREZGaWVsZC5lbmFibGVFeHBvcnRpbmddXSBhbmRcbiAgICAgKiBbW1BERkZpZWxkLmRpc2FibGVFeHBvcnRpbmddXS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogaWYgKGZpZWxkLmlzRXhwb3J0ZWQoKSkgY29uc29sZS5sb2coJ0V4cG9ydGluZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZpZWxkJ3MgdmFsdWUgc2hvdWxkIGJlIGV4cG9ydGVkLlxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5pc0V4cG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0ZpZWxkRmxhZ3MuTm9FeHBvcnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIGZpZWxkJ3MgdmFsdWUgc2hvdWxkIGJlIGV4cG9ydGVkIHdoZW4gdGhlIGZvcm0gaXNcbiAgICAgKiBzdWJtaXR0ZWQgaW4gYSBQREYgcmVhZGVyLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogZmllbGQuZW5hYmxlRXhwb3J0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZW5hYmxlRXhwb3J0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0ZpZWxkRmxhZ3MuTm9FeHBvcnQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBmaWVsZCdzIHZhbHVlIHNob3VsZCAqKm5vdCoqIGJlIGV4cG9ydGVkIHdoZW4gdGhlIGZvcm1cbiAgICAgKiBpcyBzdWJtaXR0ZWQgaW4gYSBQREYgcmVhZGVyLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogZmllbGQuZGlzYWJsZUV4cG9ydGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmRpc2FibGVFeHBvcnRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvRmllbGRGbGFncy5Ob0V4cG9ydCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICduZWVkc0FwcGVhcmFuY2VzVXBkYXRlJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoX2ZvbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzJyk7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUubWFya0FzRGlydHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZG9jLmdldEZvcm0oKS5tYXJrRmllbGRBc0RpcnR5KHRoaXMucmVmKTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5tYXJrQXNDbGVhbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kb2MuZ2V0Rm9ybSgpLm1hcmtGaWVsZEFzQ2xlYW4odGhpcy5yZWYpO1xuICAgIH07XG4gICAgUERGRmllbGQucHJvdG90eXBlLmlzRGlydHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXRGb3JtKCkuZmllbGRJc0RpcnR5KHRoaXMucmVmKTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5jcmVhdGVXaWRnZXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0ZXh0Q29sb3IgPSBvcHRpb25zLnRleHRDb2xvcjtcbiAgICAgICAgdmFyIGJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICB2YXIgYm9yZGVyQ29sb3IgPSBvcHRpb25zLmJvcmRlckNvbG9yO1xuICAgICAgICB2YXIgYm9yZGVyV2lkdGggPSBvcHRpb25zLmJvcmRlcldpZHRoO1xuICAgICAgICB2YXIgZGVncmVlc0FuZ2xlID0gdG9EZWdyZWVzKG9wdGlvbnMucm90YXRlKTtcbiAgICAgICAgdmFyIGNhcHRpb24gPSBvcHRpb25zLmNhcHRpb247XG4gICAgICAgIHZhciB4ID0gb3B0aW9ucy54O1xuICAgICAgICB2YXIgeSA9IG9wdGlvbnMueTtcbiAgICAgICAgdmFyIHdpZHRoID0gb3B0aW9ucy53aWR0aCArIGJvcmRlcldpZHRoO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgKyBib3JkZXJXaWR0aDtcbiAgICAgICAgdmFyIGhpZGRlbiA9IEJvb2xlYW4ob3B0aW9ucy5oaWRkZW4pO1xuICAgICAgICB2YXIgcGFnZVJlZiA9IG9wdGlvbnMucGFnZTtcbiAgICAgICAgYXNzZXJ0TXVsdGlwbGUoZGVncmVlc0FuZ2xlLCAnZGVncmVlc0FuZ2xlJywgOTApO1xuICAgICAgICAvLyBDcmVhdGUgYSB3aWRnZXQgZm9yIHRoaXMgZmllbGRcbiAgICAgICAgdmFyIHdpZGdldCA9IFBERldpZGdldEFubm90YXRpb24uY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQsIHRoaXMucmVmKTtcbiAgICAgICAgLy8gU2V0IHdpZGdldCBwcm9wZXJ0aWVzXG4gICAgICAgIHZhciByZWN0ID0gcm90YXRlUmVjdGFuZ2xlKHsgeDogeCwgeTogeSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9LCBib3JkZXJXaWR0aCwgZGVncmVlc0FuZ2xlKTtcbiAgICAgICAgd2lkZ2V0LnNldFJlY3RhbmdsZShyZWN0KTtcbiAgICAgICAgaWYgKHBhZ2VSZWYpXG4gICAgICAgICAgICB3aWRnZXQuc2V0UChwYWdlUmVmKTtcbiAgICAgICAgdmFyIGFjID0gd2lkZ2V0LmdldE9yQ3JlYXRlQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgICAgICBhYy5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3JUb0NvbXBvbmVudHMoYmFja2dyb3VuZENvbG9yKSk7XG4gICAgICAgIH1cbiAgICAgICAgYWMuc2V0Um90YXRpb24oZGVncmVlc0FuZ2xlKTtcbiAgICAgICAgaWYgKGNhcHRpb24pXG4gICAgICAgICAgICBhYy5zZXRDYXB0aW9ucyh7IG5vcm1hbDogY2FwdGlvbiB9KTtcbiAgICAgICAgaWYgKGJvcmRlckNvbG9yKVxuICAgICAgICAgICAgYWMuc2V0Qm9yZGVyQ29sb3IoY29sb3JUb0NvbXBvbmVudHMoYm9yZGVyQ29sb3IpKTtcbiAgICAgICAgdmFyIGJzID0gd2lkZ2V0LmdldE9yQ3JlYXRlQm9yZGVyU3R5bGUoKTtcbiAgICAgICAgaWYgKGJvcmRlcldpZHRoICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBicy5zZXRXaWR0aChib3JkZXJXaWR0aCk7XG4gICAgICAgIHdpZGdldC5zZXRGbGFnVG8oQW5ub3RhdGlvbkZsYWdzLlByaW50LCB0cnVlKTtcbiAgICAgICAgd2lkZ2V0LnNldEZsYWdUbyhBbm5vdGF0aW9uRmxhZ3MuSGlkZGVuLCBoaWRkZW4pO1xuICAgICAgICB3aWRnZXQuc2V0RmxhZ1RvKEFubm90YXRpb25GbGFncy5JbnZpc2libGUsIGZhbHNlKTtcbiAgICAgICAgLy8gU2V0IGFjcm9maWVsZCBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICh0ZXh0Q29sb3IpIHtcbiAgICAgICAgICAgIHZhciBkYSA9IChfYSA9IHRoaXMuYWNyb0ZpZWxkLmdldERlZmF1bHRBcHBlYXJhbmNlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgICAgICAgICAgdmFyIG5ld0RhID0gZGEgKyAnXFxuJyArIHNldEZpbGxpbmdDb2xvcih0ZXh0Q29sb3IpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXREZWZhdWx0QXBwZWFyYW5jZShuZXdEYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdpZGdldDtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlV2l0aEZvbnQgPSBmdW5jdGlvbiAod2lkZ2V0LCBmb250LCBfYSkge1xuICAgICAgICB2YXIgbm9ybWFsID0gX2Eubm9ybWFsLCByb2xsb3ZlciA9IF9hLnJvbGxvdmVyLCBkb3duID0gX2EuZG93bjtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlcyh3aWRnZXQsIHtcbiAgICAgICAgICAgIG5vcm1hbDogdGhpcy5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgbm9ybWFsLCBmb250KSxcbiAgICAgICAgICAgIHJvbGxvdmVyOiByb2xsb3ZlciAmJiB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0od2lkZ2V0LCByb2xsb3ZlciwgZm9udCksXG4gICAgICAgICAgICBkb3duOiBkb3duICYmIHRoaXMuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIGRvd24sIGZvbnQpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS51cGRhdGVPbk9mZldpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBvblZhbHVlLCBfYSkge1xuICAgICAgICB2YXIgbm9ybWFsID0gX2Eubm9ybWFsLCByb2xsb3ZlciA9IF9hLnJvbGxvdmVyLCBkb3duID0gX2EuZG93bjtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlcyh3aWRnZXQsIHtcbiAgICAgICAgICAgIG5vcm1hbDogdGhpcy5jcmVhdGVBcHBlYXJhbmNlRGljdCh3aWRnZXQsIG5vcm1hbCwgb25WYWx1ZSksXG4gICAgICAgICAgICByb2xsb3Zlcjogcm9sbG92ZXIgJiYgdGhpcy5jcmVhdGVBcHBlYXJhbmNlRGljdCh3aWRnZXQsIHJvbGxvdmVyLCBvblZhbHVlKSxcbiAgICAgICAgICAgIGRvd246IGRvd24gJiYgdGhpcy5jcmVhdGVBcHBlYXJhbmNlRGljdCh3aWRnZXQsIGRvd24sIG9uVmFsdWUpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uICh3aWRnZXQsIF9hKSB7XG4gICAgICAgIHZhciBub3JtYWwgPSBfYS5ub3JtYWwsIHJvbGxvdmVyID0gX2Eucm9sbG92ZXIsIGRvd24gPSBfYS5kb3duO1xuICAgICAgICB3aWRnZXQuc2V0Tm9ybWFsQXBwZWFyYW5jZShub3JtYWwpO1xuICAgICAgICBpZiAocm9sbG92ZXIpIHtcbiAgICAgICAgICAgIHdpZGdldC5zZXRSb2xsb3ZlckFwcGVhcmFuY2Uocm9sbG92ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2lkZ2V0LnJlbW92ZVJvbGxvdmVyQXBwZWFyYW5jZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb3duKSB7XG4gICAgICAgICAgICB3aWRnZXQuc2V0RG93bkFwcGVhcmFuY2UoZG93bik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWRnZXQucmVtb3ZlRG93bkFwcGVhcmFuY2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gLy8gVE9ETzogRG8gd2UgbmVlZCB0byBkbyB0aGlzLi4uP1xuICAgIC8vIHByaXZhdGUgZm9vKGZvbnQ6IFBERkZvbnQsIGRpY3Q6IFBERkRpY3QpIHtcbiAgICAvLyAgIGlmICghZGljdC5sb29rdXAoUERGTmFtZS5vZignRFInKSkpIHtcbiAgICAvLyAgICAgZGljdC5zZXQoUERGTmFtZS5vZignRFInKSwgZGljdC5jb250ZXh0Lm9iaih7fSkpO1xuICAgIC8vICAgfVxuICAgIC8vICAgY29uc3QgRFIgPSBkaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdEUicpLCBQREZEaWN0KTtcbiAgICAvLyAgIGlmICghRFIubG9va3VwKFBERk5hbWUub2YoJ0ZvbnQnKSkpIHtcbiAgICAvLyAgICAgRFIuc2V0KFBERk5hbWUub2YoJ0ZvbnQnKSwgZGljdC5jb250ZXh0Lm9iaih7fSkpO1xuICAgIC8vICAgfVxuICAgIC8vICAgY29uc3QgRm9udCA9IERSLmxvb2t1cChQREZOYW1lLm9mKCdGb250JyksIFBERkRpY3QpO1xuICAgIC8vICAgRm9udC5zZXQoUERGTmFtZS5vZihmb250Lm5hbWUpLCBmb250LnJlZik7XG4gICAgLy8gfVxuICAgIFBERkZpZWxkLnByb3RvdHlwZS5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtID0gZnVuY3Rpb24gKHdpZGdldCwgYXBwZWFyYW5jZSwgZm9udCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5hY3JvRmllbGQuZGljdC5jb250ZXh0O1xuICAgICAgICB2YXIgX2IgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCksIHdpZHRoID0gX2Iud2lkdGgsIGhlaWdodCA9IF9iLmhlaWdodDtcbiAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBkbyB0aGlzLi4uP1xuICAgICAgICAvLyBpZiAoZm9udCkge1xuICAgICAgICAvLyAgIHRoaXMuZm9vKGZvbnQsIHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gICB0aGlzLmZvbyhmb250LCB0aGlzLmRvYy5nZXRGb3JtKCkuYWNyb0Zvcm0uZGljdCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gRU5EIFRPRE9cbiAgICAgICAgdmFyIFJlc291cmNlcyA9IGZvbnQgJiYgeyBGb250OiAoX2EgPSB7fSwgX2FbZm9udC5uYW1lXSA9IGZvbnQucmVmLCBfYSkgfTtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRleHQuZm9ybVhPYmplY3QoYXBwZWFyYW5jZSwge1xuICAgICAgICAgICAgUmVzb3VyY2VzOiBSZXNvdXJjZXMsXG4gICAgICAgICAgICBCQm94OiBjb250ZXh0Lm9iaihbMCwgMCwgd2lkdGgsIGhlaWdodF0pLFxuICAgICAgICAgICAgTWF0cml4OiBjb250ZXh0Lm9iaihbMSwgMCwgMCwgMSwgMCwgMF0pLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHN0cmVhbVJlZiA9IGNvbnRleHQucmVnaXN0ZXIoc3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIHN0cmVhbVJlZjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIEZvcm1YT2JqZWN0IG9mIHRoZSBzdXBwbGllZCBpbWFnZSBhbmQgYWRkIGl0IHRvIGNvbnRleHQuXG4gICAgICogVGhlIEZvcm1YT2JqZWN0IHNpemUgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgd2lkZ2V0IChpbmNsdWRpbmdcbiAgICAgKiB0aGUgYWxpZ25tZW50KS5cbiAgICAgKiBAcGFyYW0gd2lkZ2V0IFRoZSB3aWRnZXQgdGhhdCBzaG91bGQgZGlzcGxheSB0aGUgaW1hZ2UuXG4gICAgICogQHBhcmFtIGFsaWdubWVudCBUaGUgYWxpZ25tZW50IG9mIHRoZSBpbWFnZS5cbiAgICAgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVmIGZvciB0aGUgRm9ybVhPYmplY3QgdGhhdCB3YXMgYWRkZWQgdG8gdGhlIGNvbnRleHQuXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmNyZWF0ZUltYWdlQXBwZWFyYW5jZVN0cmVhbSA9IGZ1bmN0aW9uICh3aWRnZXQsIGltYWdlLCBhbGlnbm1lbnQpIHtcbiAgICAgICAgLy8gTk9URTogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGhhbmRsZSBpbWFnZSBib3JkZXJzLlxuICAgICAgICAvLyBOT1RFOiBBY3JvYmF0IHNlZW1zIHRvIHJlc2l6ZSB0aGUgaW1hZ2UgKG1heWJlIGV2ZW4gc2tld2luZyBpdHMgYXNwZWN0XG4gICAgICAgIC8vICAgICAgIHJhdGlvKSB0byBmaXQgcGVyZmVjdGx5IHdpdGhpbiB0aGUgd2lkZ2V0J3MgcmVjdGFuZ2xlLiBUaGlzIG1ldGhvZFxuICAgICAgICAvLyAgICAgICBkb2VzIG5vdCBjdXJyZW50bHkgZG8gdGhhdC4gU2hvdWxkIHRoZXJlIGJlIGFuIG9wdGlvbiBmb3IgdGhhdD9cbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgX2I7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5hY3JvRmllbGQuZGljdC5jb250ZXh0O1xuICAgICAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgICAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgICAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICAgICAgdmFyIGJvcmRlcldpZHRoID0gKF9iID0gYnMgPT09IG51bGwgfHwgYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJzLmdldFdpZHRoKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRSb3RhdGlvbigpKTtcbiAgICAgICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICAgICAgdmFyIGFkaiA9IGFkanVzdERpbXNGb3JSb3RhdGlvbihyZWN0YW5nbGUsIHJvdGF0aW9uKTtcbiAgICAgICAgdmFyIGltYWdlRGltcyA9IGltYWdlLnNjYWxlVG9GaXQoYWRqLndpZHRoIC0gYm9yZGVyV2lkdGggKiAyLCBhZGouaGVpZ2h0IC0gYm9yZGVyV2lkdGggKiAyKTtcbiAgICAgICAgLy8gU3VwcG9ydCBib3JkZXJzIG9uIGltYWdlcyBhbmQgbWF5YmUgb3RoZXIgcHJvcGVydGllc1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHg6IGJvcmRlcldpZHRoLFxuICAgICAgICAgICAgeTogYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICB3aWR0aDogaW1hZ2VEaW1zLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZURpbXMuaGVpZ2h0LFxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIH07XG4gICAgICAgIGlmIChhbGlnbm1lbnQgPT09IEltYWdlQWxpZ25tZW50LkNlbnRlcikge1xuICAgICAgICAgICAgb3B0aW9ucy54ICs9IChhZGoud2lkdGggLSBib3JkZXJXaWR0aCAqIDIpIC8gMiAtIGltYWdlRGltcy53aWR0aCAvIDI7XG4gICAgICAgICAgICBvcHRpb25zLnkgKz0gKGFkai5oZWlnaHQgLSBib3JkZXJXaWR0aCAqIDIpIC8gMiAtIGltYWdlRGltcy5oZWlnaHQgLyAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFsaWdubWVudCA9PT0gSW1hZ2VBbGlnbm1lbnQuUmlnaHQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMueCA9IGFkai53aWR0aCAtIGJvcmRlcldpZHRoIC0gaW1hZ2VEaW1zLndpZHRoO1xuICAgICAgICAgICAgb3B0aW9ucy55ID0gYWRqLmhlaWdodCAtIGJvcmRlcldpZHRoIC0gaW1hZ2VEaW1zLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW1hZ2VOYW1lID0gdGhpcy5kb2MuY29udGV4dC5hZGRSYW5kb21TdWZmaXgoJ0ltYWdlJywgMTApO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZSA9IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd0ltYWdlKGltYWdlTmFtZSwgb3B0aW9ucykpO1xuICAgICAgICAvLy8vLy8vLy8vLy9cbiAgICAgICAgdmFyIFJlc291cmNlcyA9IHsgWE9iamVjdDogKF9hID0ge30sIF9hW2ltYWdlTmFtZV0gPSBpbWFnZS5yZWYsIF9hKSB9O1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udGV4dC5mb3JtWE9iamVjdChhcHBlYXJhbmNlLCB7XG4gICAgICAgICAgICBSZXNvdXJjZXM6IFJlc291cmNlcyxcbiAgICAgICAgICAgIEJCb3g6IGNvbnRleHQub2JqKFswLCAwLCByZWN0YW5nbGUud2lkdGgsIHJlY3RhbmdsZS5oZWlnaHRdKSxcbiAgICAgICAgICAgIE1hdHJpeDogY29udGV4dC5vYmooWzEsIDAsIDAsIDEsIDAsIDBdKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0LnJlZ2lzdGVyKHN0cmVhbSk7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUuY3JlYXRlQXBwZWFyYW5jZURpY3QgPSBmdW5jdGlvbiAod2lkZ2V0LCBhcHBlYXJhbmNlLCBvblZhbHVlKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5hY3JvRmllbGQuZGljdC5jb250ZXh0O1xuICAgICAgICB2YXIgb25TdHJlYW1SZWYgPSB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0od2lkZ2V0LCBhcHBlYXJhbmNlLm9uKTtcbiAgICAgICAgdmFyIG9mZlN0cmVhbVJlZiA9IHRoaXMuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIGFwcGVhcmFuY2Uub2ZmKTtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VEaWN0ID0gY29udGV4dC5vYmooe30pO1xuICAgICAgICBhcHBlYXJhbmNlRGljdC5zZXQob25WYWx1ZSwgb25TdHJlYW1SZWYpO1xuICAgICAgICBhcHBlYXJhbmNlRGljdC5zZXQoUERGTmFtZS5vZignT2ZmJyksIG9mZlN0cmVhbVJlZik7XG4gICAgICAgIHJldHVybiBhcHBlYXJhbmNlRGljdDtcbiAgICB9O1xuICAgIHJldHVybiBQREZGaWVsZDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZGaWVsZDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkZpZWxkLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduLCBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuLi9QREZEb2N1bWVudFwiO1xuaW1wb3J0IFBERkJ1dHRvbiBmcm9tIFwiLi9QREZCdXR0b25cIjtcbmltcG9ydCBQREZDaGVja0JveCBmcm9tIFwiLi9QREZDaGVja0JveFwiO1xuaW1wb3J0IFBERkRyb3Bkb3duIGZyb20gXCIuL1BERkRyb3Bkb3duXCI7XG5pbXBvcnQgUERGT3B0aW9uTGlzdCBmcm9tIFwiLi9QREZPcHRpb25MaXN0XCI7XG5pbXBvcnQgUERGUmFkaW9Hcm91cCBmcm9tIFwiLi9QREZSYWRpb0dyb3VwXCI7XG5pbXBvcnQgUERGU2lnbmF0dXJlIGZyb20gXCIuL1BERlNpZ25hdHVyZVwiO1xuaW1wb3J0IFBERlRleHRGaWVsZCBmcm9tIFwiLi9QREZUZXh0RmllbGRcIjtcbmltcG9ydCB7IE5vU3VjaEZpZWxkRXJyb3IsIFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvciwgRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IsIEludmFsaWRGaWVsZE5hbWVQYXJ0RXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4uL1BERkZvbnRcIjtcbmltcG9ydCB7IFN0YW5kYXJkRm9udHMgfSBmcm9tIFwiLi4vU3RhbmRhcmRGb250c1wiO1xuaW1wb3J0IHsgcm90YXRlSW5QbGFjZSB9IGZyb20gXCIuLi9vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBkcmF3T2JqZWN0LCBwb3BHcmFwaGljc1N0YXRlLCBwdXNoR3JhcGhpY3NTdGF0ZSwgdHJhbnNsYXRlLCB9IGZyb20gXCIuLi9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IFBERkFjcm9Gb3JtLCBQREZBY3JvQ2hlY2tCb3gsIFBERkFjcm9Db21ib0JveCwgUERGQWNyb0xpc3RCb3gsIFBERkFjcm9SYWRpb0J1dHRvbiwgUERGQWNyb1NpZ25hdHVyZSwgUERGQWNyb1RleHQsIFBERkFjcm9QdXNoQnV0dG9uLCBQREZBY3JvTm9uVGVybWluYWwsIFBERkRpY3QsIFBERlJlZiwgY3JlYXRlUERGQWNyb0ZpZWxkcywgUERGTmFtZSwgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIENhY2hlLCBhc3NlcnRPclVuZGVmaW5lZCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBpbnRlcmFjdGl2ZSBmb3JtIG9mIGEgW1tQREZEb2N1bWVudF1dLlxuICpcbiAqIEludGVyYWN0aXZlIGZvcm1zIChzb21ldGltZXMgY2FsbGVkIF9BY3JvRm9ybXNfKSBhcmUgY29sbGVjdGlvbnMgb2YgZmllbGRzXG4gKiBkZXNpZ25lZCB0byBnYXRoZXIgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXIuIEEgUERGIGRvY3VtZW50IG1heSBjb250YWlucyBhbnlcbiAqIG51bWJlciBvZiBmaWVsZHMgdGhhdCBhcHBlYXIgb24gdmFyaW91cyBwYWdlcywgYWxsIG9mIHdoaWNoIG1ha2UgdXAgYSBzaW5nbGUsXG4gKiBnbG9iYWwgaW50ZXJhY3RpdmUgZm9ybSBzcGFubmluZyB0aGUgZW50aXJlIGRvY3VtZW50LiBUaGlzIG1lYW5zIHRoYXRcbiAqIGluc3RhbmNlcyBvZiBbW1BERkRvY3VtZW50XV0gc2hhbGwgY29udGFpbiBhdCBtb3N0IG9uZSBbW1BERkZvcm1dXS5cbiAqXG4gKiBUaGUgZmllbGRzIG9mIGFuIGludGVyYWN0aXZlIGZvcm0gYXJlIHJlcHJlc2VudGVkIGJ5IFtbUERGRmllbGRdXSBpbnN0YW5jZXMuXG4gKi9cbnZhciBQREZGb3JtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkZvcm0oYWNyb0Zvcm0sIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmVtYmVkRGVmYXVsdEZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuZG9jLmVtYmVkU3RhbmRhcmRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0SXMoYWNyb0Zvcm0sICdhY3JvRm9ybScsIFtbUERGQWNyb0Zvcm0sICdQREZBY3JvRm9ybSddXSk7XG4gICAgICAgIGFzc2VydElzKGRvYywgJ2RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgIHRoaXMuYWNyb0Zvcm0gPSBhY3JvRm9ybTtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuZGlydHlGaWVsZHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuZGVmYXVsdEZvbnRDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KHRoaXMuZW1iZWREZWZhdWx0Rm9udCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgW1tQREZGb3JtXV0gaGFzIFhGQSBkYXRhLiBNb3N0IFBERnMgd2l0aCBmb3JtXG4gICAgICogZmllbGRzIGRvIG5vdCB1c2UgWEZBIGFzIGl0IGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIGJ5IFBERiByZWFkZXJzLlxuICAgICAqXG4gICAgICogPiBgcGRmLWxpYmAgZG9lcyBub3Qgc3VwcG9ydCBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uLCBvciByZWFkaW5nIG9mIFhGQVxuICAgICAqID4gZmllbGRzLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGlmIChmb3JtLmhhc1hGQSgpKSBjb25zb2xlLmxvZygnUERGIGhhcyBYRkEgZGF0YScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBmb3JtIGhhcyBYRkEgZGF0YS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5oYXNYRkEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9Gb3JtLmRpY3QuaGFzKFBERk5hbWUub2YoJ1hGQScpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3QgdGhlIFhGQSBkYXRhIGZyb20gdGhpcyBbW1BERkZvcm1dXSAoaWYgYW55IGV4aXN0cykuIFRoaXMgd2lsbFxuICAgICAqIGZvcmNlIHJlYWRlcnMgdG8gZmFsbGJhY2sgdG8gc3RhbmRhcmQgZmllbGRzIGlmIHRoZSBbW1BERkRvY3VtZW50XV1cbiAgICAgKiBjb250YWlucyBhbnkuIEZvciBleGFtcGxlOlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGZvcm0uZGVsZXRlWEZBKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5kZWxldGVYRkEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0Zvcm0uZGljdC5kZWxldGUoUERGTmFtZS5vZignWEZBJykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBmaWVsZHMgY29udGFpbmVkIGluIHRoaXMgW1tQREZGb3JtXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZHMgPSBmb3JtLmdldEZpZWxkcygpXG4gICAgICogZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAqICAgY29uc3QgdHlwZSA9IGZpZWxkLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgKiAgIGNvbnN0IG5hbWUgPSBmaWVsZC5nZXROYW1lKClcbiAgICAgKiAgIGNvbnNvbGUubG9nKGAke3R5cGV9OiAke25hbWV9YClcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFsbCBmaWVsZHMgaW4gdGhpcyBmb3JtLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldEZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFsbEZpZWxkcyA9IHRoaXMuYWNyb0Zvcm0uZ2V0QWxsRmllbGRzKCk7XG4gICAgICAgIHZhciBmaWVsZHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYWxsRmllbGRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gYWxsRmllbGRzW2lkeF0sIGFjcm9GaWVsZCA9IF9hWzBdLCByZWYgPSBfYVsxXTtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IGNvbnZlcnRUb1BERkZpZWxkKGFjcm9GaWVsZCwgcmVmLCB0aGlzLmRvYyk7XG4gICAgICAgICAgICBpZiAoZmllbGQpXG4gICAgICAgICAgICAgICAgZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZE1heWJlKCdQYWdlMS5Gb28uQmFyWzBdJylcbiAgICAgKiBpZiAoZmllbGQpIGNvbnNvbGUubG9nKCdGaWVsZCBleGlzdHMhJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBmaWVsZCBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBmaWVsZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgaWYgb25lIGV4aXN0cy5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRGaWVsZE1heWJlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGZpZWxkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpZHhdO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmdldE5hbWUoKSA9PT0gbmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdQYWdlMS5Gb28uQmFyWzBdJylcbiAgICAgKiBgYGBcbiAgICAgKiBJZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgZmllbGQgbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0RmllbGQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkTWF5YmUobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZClcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEZpZWxkRXJyb3IobmFtZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGJ1dHRvbiBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmdldEJ1dHRvbignUGFnZTEuRm9vLkJ1dHRvblswXScpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUsIG9yIGlmXG4gICAgICogdGhlIGZpZWxkIGV4aXN0cyBidXQgaXMgbm90IGEgYnV0dG9uLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIGJ1dHRvbiBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBidXR0b24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0QnV0dG9uID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQnV0dG9uKVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERkJ1dHRvbiwgZmllbGQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjaGVjayBib3ggZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ1BhZ2UxLkZvby5DaGVja0JveFswXScpXG4gICAgICogY2hlY2tCb3guY2hlY2soKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIGNoZWNrIGJveC5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBjaGVjayBib3ggbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2hlY2sgYm94IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldENoZWNrQm94ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQ2hlY2tCb3gpXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGQ2hlY2tCb3gsIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZHJvcGRvd24gZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ1BhZ2UxLkZvby5Ecm9wZG93blswXScpXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IGRyb3Bkb3duLmdldE9wdGlvbnMoKVxuICAgICAqIGRyb3Bkb3duLnNlbGVjdChvcHRpb25zWzBdKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIGRyb3Bkb3duLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIGRyb3Bkb3duIG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIGRyb3Bkb3duIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldERyb3Bkb3duID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGRHJvcGRvd24pXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGRHJvcGRvd24sIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgb3B0aW9uIGxpc3QgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdQYWdlMS5Gb28uT3B0aW9uTGlzdFswXScpXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IG9wdGlvbkxpc3QuZ2V0T3B0aW9ucygpXG4gICAgICogb3B0aW9uTGlzdC5zZWxlY3Qob3B0aW9uc1swXSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYW4gb3B0aW9uIGxpc3QuXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgb3B0aW9uIGxpc3QgbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW9uIGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0T3B0aW9uTGlzdCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERk9wdGlvbkxpc3QpXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGT3B0aW9uTGlzdCwgZmllbGQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByYWRpbyBncm91cCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ1BhZ2UxLkZvby5SYWRpb0dyb3VwWzBdJylcbiAgICAgKiBjb25zdCBvcHRpb25zID0gcmFkaW9Hcm91cC5nZXRPcHRpb25zKClcbiAgICAgKiByYWRpb0dyb3VwLnNlbGVjdChvcHRpb25zWzBdKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIHJhZGlvIGdyb3VwLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIHJhZGlvIGdyb3VwIG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIHJhZGlvIGdyb3VwIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldFJhZGlvR3JvdXAgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZSYWRpb0dyb3VwKVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERlJhZGlvR3JvdXAsIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2lnbmF0dXJlIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3Qgc2lnbmF0dXJlID0gZm9ybS5nZXRTaWduYXR1cmUoJ1BhZ2UxLkZvby5TaWduYXR1cmVbMF0nKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBzaWduYXR1cmUgbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgc2lnbmF0dXJlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldFNpZ25hdHVyZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERlNpZ25hdHVyZSlcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBQREZTaWduYXR1cmUsIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGV4dCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdQYWdlMS5Gb28uVGV4dEZpZWxkWzBdJylcbiAgICAgKiB0ZXh0RmllbGQuc2V0VGV4dCgnQXJlIHlvdSBkZXNpZ25lZCB0byBhY3Qgb3IgdG8gYmUgYWN0ZWQgdXBvbj8nKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIHRleHQgZmllbGQuXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgdGV4dCBmaWVsZCBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSB0ZXh0IGZpZWxkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldFRleHRGaWVsZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERlRleHRGaWVsZClcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBQREZUZXh0RmllbGQsIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBidXR0b24gZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5jcmVhdGVCdXR0b24oJ2Nvb2wubmV3LmJ1dHRvbicpXG4gICAgICpcbiAgICAgKiBidXR0b24uYWRkVG9QYWdlKCdEbyBTdHVmZicsIGZvbnQsIHBhZ2UpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBidXR0b24uXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBidXR0b24gZmllbGQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuY3JlYXRlQnV0dG9uID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IHNwbGl0RmllbGROYW1lKG5hbWUpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMobmFtZVBhcnRzLm5vblRlcm1pbmFsKTtcbiAgICAgICAgdmFyIGJ1dHRvbiA9IFBERkFjcm9QdXNoQnV0dG9uLmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgYnV0dG9uLnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIGFkZEZpZWxkVG9QYXJlbnQocGFyZW50LCBbYnV0dG9uLCBidXR0b24ucmVmXSwgbmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgcmV0dXJuIFBERkJ1dHRvbi5vZihidXR0b24sIGJ1dHRvbi5yZWYsIHRoaXMuZG9jKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBjaGVjayBib3ggZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmNyZWF0ZUNoZWNrQm94KCdjb29sLm5ldy5jaGVja0JveCcpXG4gICAgICpcbiAgICAgKiBjaGVja0JveC5hZGRUb1BhZ2UocGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBhIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciB0aGUgbmV3IGNoZWNrIGJveC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IGNoZWNrIGJveCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5jcmVhdGVDaGVja0JveCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBuYW1lUGFydHMgPSBzcGxpdEZpZWxkTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZmluZE9yQ3JlYXRlTm9uVGVybWluYWxzKG5hbWVQYXJ0cy5ub25UZXJtaW5hbCk7XG4gICAgICAgIHZhciBjaGVja0JveCA9IFBERkFjcm9DaGVja0JveC5jcmVhdGUodGhpcy5kb2MuY29udGV4dCk7XG4gICAgICAgIGNoZWNrQm94LnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIGFkZEZpZWxkVG9QYXJlbnQocGFyZW50LCBbY2hlY2tCb3gsIGNoZWNrQm94LnJlZl0sIG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIHJldHVybiBQREZDaGVja0JveC5vZihjaGVja0JveCwgY2hlY2tCb3gucmVmLCB0aGlzLmRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgZHJvcGRvd24gZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmNyZWF0ZURyb3Bkb3duKCdjb29sLm5ldy5kcm9wZG93bicpXG4gICAgICpcbiAgICAgKiBkcm9wZG93bi5hZGRUb1BhZ2UoZm9udCwgcGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBhIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciB0aGUgbmV3IGRyb3Bkb3duLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgZHJvcGRvd24gZmllbGQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuY3JlYXRlRHJvcGRvd24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgbmFtZVBhcnRzID0gc3BsaXRGaWVsZE5hbWUobmFtZSk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyhuYW1lUGFydHMubm9uVGVybWluYWwpO1xuICAgICAgICB2YXIgY29tYm9Cb3ggPSBQREZBY3JvQ29tYm9Cb3guY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICBjb21ib0JveC5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICBhZGRGaWVsZFRvUGFyZW50KHBhcmVudCwgW2NvbWJvQm94LCBjb21ib0JveC5yZWZdLCBuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICByZXR1cm4gUERGRHJvcGRvd24ub2YoY29tYm9Cb3gsIGNvbWJvQm94LnJlZiwgdGhpcy5kb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IG9wdGlvbiBsaXN0IGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmNyZWF0ZU9wdGlvbkxpc3QoJ2Nvb2wubmV3Lm9wdGlvbkxpc3QnKVxuICAgICAqXG4gICAgICogb3B0aW9uTGlzdC5hZGRUb1BhZ2UoZm9udCwgcGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBhIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciB0aGUgbmV3IG9wdGlvbiBsaXN0LlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgb3B0aW9uIGxpc3QgZmllbGQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuY3JlYXRlT3B0aW9uTGlzdCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBuYW1lUGFydHMgPSBzcGxpdEZpZWxkTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZmluZE9yQ3JlYXRlTm9uVGVybWluYWxzKG5hbWVQYXJ0cy5ub25UZXJtaW5hbCk7XG4gICAgICAgIHZhciBsaXN0Qm94ID0gUERGQWNyb0xpc3RCb3guY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICBsaXN0Qm94LnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIGFkZEZpZWxkVG9QYXJlbnQocGFyZW50LCBbbGlzdEJveCwgbGlzdEJveC5yZWZdLCBuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICByZXR1cm4gUERGT3B0aW9uTGlzdC5vZihsaXN0Qm94LCBsaXN0Qm94LnJlZiwgdGhpcy5kb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHJhZGlvIGdyb3VwIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmNyZWF0ZVJhZGlvR3JvdXAoJ2Nvb2wubmV3LnJhZGlvR3JvdXAnKVxuICAgICAqXG4gICAgICogcmFkaW9Hcm91cC5hZGRPcHRpb25Ub1BhZ2UoJ2lzLWRvZycsIHBhZ2UsIHsgeTogMCB9KVxuICAgICAqIHJhZGlvR3JvdXAuYWRkT3B0aW9uVG9QYWdlKCdpcy1jYXQnLCBwYWdlLCB7IHk6IDc1IH0pXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyByYWRpbyBncm91cC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IHJhZGlvIGdyb3VwIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmNyZWF0ZVJhZGlvR3JvdXAgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgbmFtZVBhcnRzID0gc3BsaXRGaWVsZE5hbWUobmFtZSk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyhuYW1lUGFydHMubm9uVGVybWluYWwpO1xuICAgICAgICB2YXIgcmFkaW9CdXR0b24gPSBQREZBY3JvUmFkaW9CdXR0b24uY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICByYWRpb0J1dHRvbi5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICBhZGRGaWVsZFRvUGFyZW50KHBhcmVudCwgW3JhZGlvQnV0dG9uLCByYWRpb0J1dHRvbi5yZWZdLCBuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICByZXR1cm4gUERGUmFkaW9Hcm91cC5vZihyYWRpb0J1dHRvbiwgcmFkaW9CdXR0b24ucmVmLCB0aGlzLmRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgdGV4dCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmNyZWF0ZVRleHRGaWVsZCgnY29vbC5uZXcudGV4dEZpZWxkJylcbiAgICAgKlxuICAgICAqIHRleHRGaWVsZC5hZGRUb1BhZ2UoZm9udCwgcGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBhIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciB0aGUgbmV3IHJhZGlvIGdyb3VwLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgcmFkaW8gZ3JvdXAgZmllbGQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuY3JlYXRlVGV4dEZpZWxkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IHNwbGl0RmllbGROYW1lKG5hbWUpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMobmFtZVBhcnRzLm5vblRlcm1pbmFsKTtcbiAgICAgICAgdmFyIHRleHQgPSBQREZBY3JvVGV4dC5jcmVhdGUodGhpcy5kb2MuY29udGV4dCk7XG4gICAgICAgIHRleHQuc2V0UGFydGlhbE5hbWUobmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgYWRkRmllbGRUb1BhcmVudChwYXJlbnQsIFt0ZXh0LCB0ZXh0LnJlZl0sIG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIHJldHVybiBQREZUZXh0RmllbGQub2YodGV4dCwgdGV4dC5yZWYsIHRoaXMuZG9jKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZsYXR0ZW4gYWxsIGZpZWxkcyBpbiB0aGlzIFtbUERGRm9ybV1dLlxuICAgICAqXG4gICAgICogRmxhdHRlbmluZyBhIGZvcm0gZmllbGQgd2lsbCB0YWtlIHRoZSBjdXJyZW50IGFwcGVhcmFuY2UgZm9yIGVhY2ggb2YgdGhhdFxuICAgICAqIGZpZWxkJ3Mgd2lkZ2V0cyBhbmQgbWFrZSB0aGVtIHBhcnQgb2YgdGhlaXIgcGFnZSdzIGNvbnRlbnQgc3RyZWFtLiBBbGwgZm9ybVxuICAgICAqIGZpZWxkcyBhbmQgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCBhcmUgdGhlbiByZW1vdmVkLiBOb3RlIHRoYXQgb25jZSBhIGZvcm1cbiAgICAgKiBoYXMgYmVlbiBmbGF0dGVuZWQgaXRzIGZpZWxkcyBjYW4gbm8gbG9uZ2VyIGJlIGFjY2Vzc2VkIG9yIGVkaXRlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgb3BlcmF0aW9uIGlzIG9mdGVuIHVzZWQgYWZ0ZXIgZmlsbGluZyBmb3JtIGZpZWxkcyB0byBlbnN1cmUgYVxuICAgICAqIGNvbnNpc3RlbnQgYXBwZWFyYW5jZSBhY3Jvc3MgZGlmZmVyZW50IFBERiByZWFkZXJzIGFuZC9vciBwcmludGVycy5cbiAgICAgKiBBbm90aGVyIGNvbW1vbiB1c2UgY2FzZSBpcyB0byBjb3B5IGEgdGVtcGxhdGUgZG9jdW1lbnQgd2l0aCBmb3JtIGZpZWxkc1xuICAgICAqIGludG8gYW5vdGhlciBkb2N1bWVudC4gSW4gdGhpcyBzY2VuYXJpbyB5b3Ugd291bGQgbG9hZCB0aGUgdGVtcGxhdGVcbiAgICAgKiBkb2N1bWVudCwgZmlsbCBpdHMgZmllbGRzLCBmbGF0dGVuIGl0LCBhbmQgdGhlbiBjb3B5IGl0cyBwYWdlcyBpbnRvIHRoZVxuICAgICAqIHJlY2lwaWVudCBkb2N1bWVudCAtIHRoZSBmaWxsZWQgZmllbGRzIHdpbGwgYmUgY29waWVkIG92ZXIuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpO1xuICAgICAqIGZvcm0uZmxhdHRlbigpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmZsYXR0ZW4gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7IHVwZGF0ZUZpZWxkQXBwZWFyYW5jZXM6IHRydWUgfTsgfVxuICAgICAgICBpZiAob3B0aW9ucy51cGRhdGVGaWVsZEFwcGVhcmFuY2VzKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmllbGRzID0gdGhpcy5nZXRGaWVsZHMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbkZpZWxkcyA9IGZpZWxkcy5sZW5ndGg7IGkgPCBsZW5GaWVsZHM7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgdmFyIHdpZGdldHMgPSBmaWVsZC5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGxlbldpZGdldHMgPSB3aWRnZXRzLmxlbmd0aDsgaiA8IGxlbldpZGdldHM7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2pdO1xuICAgICAgICAgICAgICAgIHZhciBwYWdlID0gdGhpcy5maW5kV2lkZ2V0UGFnZSh3aWRnZXQpO1xuICAgICAgICAgICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmZpbmRXaWRnZXRBcHBlYXJhbmNlUmVmKGZpZWxkLCB3aWRnZXQpO1xuICAgICAgICAgICAgICAgIHZhciB4T2JqZWN0S2V5ID0gcGFnZS5ub2RlLm5ld1hPYmplY3QoJ0ZsYXRXaWRnZXQnLCB3aWRnZXRSZWYpO1xuICAgICAgICAgICAgICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgICAgICAgICAgICAgdmFyIG9wZXJhdG9ycyA9IF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgICAgICAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlKHJlY3RhbmdsZS54LCByZWN0YW5nbGUueSlcbiAgICAgICAgICAgICAgICBdLCByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiAwIH0pKSwgW1xuICAgICAgICAgICAgICAgICAgICBkcmF3T2JqZWN0KHhPYmplY3RLZXkpLFxuICAgICAgICAgICAgICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgICAgICAgICAgICAgXSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICAgICAgICAgIHBhZ2UucHVzaE9wZXJhdG9ycy5hcHBseShwYWdlLCBvcGVyYXRvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWVsZChmaWVsZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGZpZWxkIGZyb20gdGhpcyBbW1BERkZvcm1dXS5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKCk7XG4gICAgICogY29uc3QgYWdlRmllbGQgPSBmb3JtLmdldEZpZWxkcygpLmZpbmQoeCA9PiB4LmdldE5hbWUoKSA9PT0gJ0FnZScpO1xuICAgICAqIGZvcm0ucmVtb3ZlRmllbGQoYWdlRmllbGQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLnJlbW92ZUZpZWxkID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIHZhciB3aWRnZXRzID0gZmllbGQuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgdmFyIHBhZ2VzID0gbmV3IFNldCgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaV07XG4gICAgICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5maW5kV2lkZ2V0QXBwZWFyYW5jZVJlZihmaWVsZCwgd2lkZ2V0KTtcbiAgICAgICAgICAgIHZhciBwYWdlID0gdGhpcy5maW5kV2lkZ2V0UGFnZSh3aWRnZXQpO1xuICAgICAgICAgICAgcGFnZXMuYWRkKHBhZ2UpO1xuICAgICAgICAgICAgcGFnZS5ub2RlLnJlbW92ZUFubm90KHdpZGdldFJlZik7XG4gICAgICAgIH1cbiAgICAgICAgcGFnZXMuZm9yRWFjaChmdW5jdGlvbiAocGFnZSkgeyByZXR1cm4gcGFnZS5ub2RlLnJlbW92ZUFubm90KGZpZWxkLnJlZik7IH0pO1xuICAgICAgICB0aGlzLmFjcm9Gb3JtLnJlbW92ZUZpZWxkKGZpZWxkLmFjcm9GaWVsZCk7XG4gICAgICAgIHZhciBmaWVsZEtpZHMgPSBmaWVsZC5hY3JvRmllbGQubm9ybWFsaXplZEVudHJpZXMoKS5LaWRzO1xuICAgICAgICB2YXIga2lkc0NvdW50ID0gZmllbGRLaWRzLnNpemUoKTtcbiAgICAgICAgZm9yICh2YXIgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBraWRzQ291bnQ7IGNoaWxkSW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gZmllbGRLaWRzLmdldChjaGlsZEluZGV4KTtcbiAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFBERlJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9jLmNvbnRleHQuZGVsZXRlKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvYy5jb250ZXh0LmRlbGV0ZShmaWVsZC5yZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGFsbCB3aWRnZXRzIG9mIGFsbCBmaWVsZHMgaW4gdGhpc1xuICAgICAqIFtbUERGRm9ybV1dLiBBcHBlYXJhbmNlIHN0cmVhbXMgd2lsbCBvbmx5IGJlIGNyZWF0ZWQgZm9yIGEgd2lkZ2V0IGlmIGl0XG4gICAgICogZG9lcyBub3QgaGF2ZSBhbnkgZXhpc3RpbmcgYXBwZWFyYW5jZSBzdHJlYW1zLCBvciB0aGUgZmllbGQncyB2YWx1ZSBoYXNcbiAgICAgKiBjaGFuZ2VkIChlLmcuIGJ5IGNhbGxpbmcgW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dIG9yXG4gICAgICogW1tQREZEcm9wZG93bi5zZWxlY3RdXSkuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvdXJpZXIgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuQ291cmllcilcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlcyhjb3VyaWVyKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogKipJTVBPUlRBTlQ6KiogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBgZm9udGAgcGFyYW1ldGVyIGlzXG4gICAgICogW1tTdGFuZGFyZEZvbnRzLkhlbHZldGljYV1dLiBOb3RlIHRoYXQgdGhpcyBpcyBhIFdpbkFuc2kgZm9udC4gVGhpcyBtZWFuc1xuICAgICAqIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHdpbGwgYmUgdGhyb3duIGlmIGFueSBmaWVsZHMgY29udGFpbiB0ZXh0IHdpdGhcbiAgICAgKiBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIFdpbkFuc2kgY2hhcmFjdGVyIHNldCAodGhlIGxhdGluIGFscGhhYmV0KS5cbiAgICAgKlxuICAgICAqIEVtYmVkZGluZyBhIGN1c3RvbSBmb250IGFuZCBwYXNzaW5nIHRoYXQgYXMgdGhlIGBmb250YFxuICAgICAqIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIGdlbmVyYXRlIGFwcGVhcmFuY2Ugc3RyZWFtcyB3aXRoIG5vbiBXaW5BbnNpXG4gICAgICogY2hhcmFjdGVycyAoYXNzdW1pbmcgeW91ciBjdXN0b20gZm9udCBzdXBwb3J0cyB0aGVtKS5cbiAgICAgKlxuICAgICAqID4gKipOT1RFOioqIFRoZSBbW1BERkRvY3VtZW50LnNhdmVdXSBtZXRob2Qgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvXG4gICAgICogPiB1cGRhdGUgYXBwZWFyYW5jZXMgYXV0b21hdGljYWxseSBpZiBhIGZvcm0gd2FzIGFjY2Vzc2VkIHZpYSB0aGVcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuZ2V0Rm9ybV1dIG1ldGhvZCBwcmlvciB0byBzYXZpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9udCBPcHRpb25hbGx5LCB0aGUgZm9udCB0byB1c2Ugd2hlbiBjcmVhdGluZyBuZXcgYXBwZWFyYW5jZXMuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUudXBkYXRlRmllbGRBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIGZvbnQgPSBmb250ICE9PSBudWxsICYmIGZvbnQgIT09IHZvaWQgMCA/IGZvbnQgOiB0aGlzLmdldERlZmF1bHRGb250KCk7XG4gICAgICAgIHZhciBmaWVsZHMgPSB0aGlzLmdldEZpZWxkcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBmaWVsZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaWR4XTtcbiAgICAgICAgICAgIGlmIChmaWVsZC5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoZm9udCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1hcmsgYSBmaWVsZCBhcyBkaXJ0eS4gVGhpcyB3aWxsIGNhdXNlIGl0cyBhcHBlYXJhbmNlIHN0cmVhbXMgdG8gYmVcbiAgICAgKiB1cGRhdGVkIGJ5IFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0uXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnZm9vLmJhcicpXG4gICAgICogZm9ybS5tYXJrRmllbGRBc0RpcnR5KGZpZWxkLnJlZilcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZmllbGRSZWYgVGhlIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgdGhhdCBzaG91bGQgYmUgbWFya2VkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLm1hcmtGaWVsZEFzRGlydHkgPSBmdW5jdGlvbiAoZmllbGRSZWYpIHtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQoZmllbGRSZWYsICdmaWVsZFJlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgdGhpcy5kaXJ0eUZpZWxkcy5hZGQoZmllbGRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWFyayBhIGZpZWxkIGFzIGRpcnR5LiBUaGlzIHdpbGwgY2F1c2UgaXRzIGFwcGVhcmFuY2Ugc3RyZWFtcyB0byBub3QgYmVcbiAgICAgKiB1cGRhdGVkIGJ5IFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0uXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnZm9vLmJhcicpXG4gICAgICogZm9ybS5tYXJrRmllbGRBc0NsZWFuKGZpZWxkLnJlZilcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZmllbGRSZWYgVGhlIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgdGhhdCBzaG91bGQgYmUgbWFya2VkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLm1hcmtGaWVsZEFzQ2xlYW4gPSBmdW5jdGlvbiAoZmllbGRSZWYpIHtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQoZmllbGRSZWYsICdmaWVsZFJlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgdGhpcy5kaXJ0eUZpZWxkcy5kZWxldGUoZmllbGRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaXMgdGhlIHNwZWNpZmllZCBmaWVsZCBoYXMgYmVlbiBtYXJrZWQgYXMgZGlydHkuXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnZm9vLmJhcicpXG4gICAgICogaWYgKGZvcm0uZmllbGRJc0RpcnR5KGZpZWxkLnJlZikpIGNvbnNvbGUubG9nKCdGaWVsZCBpcyBkaXJ0eScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZpZWxkUmVmIFRoZSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBmaWVsZCBpcyBkaXJ0eS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5maWVsZElzRGlydHkgPSBmdW5jdGlvbiAoZmllbGRSZWYpIHtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQoZmllbGRSZWYsICdmaWVsZFJlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlydHlGaWVsZHMuaGFzKGZpZWxkUmVmKTtcbiAgICB9O1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldERlZmF1bHRGb250ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0Rm9udENhY2hlLmFjY2VzcygpO1xuICAgIH07XG4gICAgUERGRm9ybS5wcm90b3R5cGUuZmluZFdpZGdldFBhZ2UgPSBmdW5jdGlvbiAod2lkZ2V0KSB7XG4gICAgICAgIHZhciBwYWdlUmVmID0gd2lkZ2V0LlAoKTtcbiAgICAgICAgdmFyIHBhZ2UgPSB0aGlzLmRvYy5nZXRQYWdlcygpLmZpbmQoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHgucmVmID09PSBwYWdlUmVmOyB9KTtcbiAgICAgICAgaWYgKHBhZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZG9jLmNvbnRleHQuZ2V0T2JqZWN0UmVmKHdpZGdldC5kaWN0KTtcbiAgICAgICAgICAgIGlmICh3aWRnZXRSZWYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgUERGUmVmIGZvciBQREZPYmplY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhZ2UgPSB0aGlzLmRvYy5maW5kUGFnZUZvckFubm90YXRpb25SZWYod2lkZ2V0UmVmKTtcbiAgICAgICAgICAgIGlmIChwYWdlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBwYWdlIGZvciBQREZSZWYgXCIgKyB3aWRnZXRSZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgIH07XG4gICAgUERGRm9ybS5wcm90b3R5cGUuZmluZFdpZGdldEFwcGVhcmFuY2VSZWYgPSBmdW5jdGlvbiAoZmllbGQsIHdpZGdldCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciByZWZPckRpY3QgPSB3aWRnZXQuZ2V0Tm9ybWFsQXBwZWFyYW5jZSgpO1xuICAgICAgICBpZiAocmVmT3JEaWN0IGluc3RhbmNlb2YgUERGRGljdCAmJlxuICAgICAgICAgICAgKGZpZWxkIGluc3RhbmNlb2YgUERGQ2hlY2tCb3ggfHwgZmllbGQgaW5zdGFuY2VvZiBQREZSYWRpb0dyb3VwKSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gZmllbGQuYWNyb0ZpZWxkLmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YXIgcmVmID0gKF9hID0gcmVmT3JEaWN0LmdldCh2YWx1ZSkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHJlZk9yRGljdC5nZXQoUERGTmFtZS5vZignT2ZmJykpO1xuICAgICAgICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIFBERlJlZikge1xuICAgICAgICAgICAgICAgIHJlZk9yRGljdCA9IHJlZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIShyZWZPckRpY3QgaW5zdGFuY2VvZiBQREZSZWYpKSB7XG4gICAgICAgICAgICB2YXIgbmFtZV8xID0gZmllbGQuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGV4dHJhY3QgYXBwZWFyYW5jZSByZWYgZm9yOiBcIiArIG5hbWVfMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZk9yRGljdDtcbiAgICB9O1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyA9IGZ1bmN0aW9uIChwYXJ0aWFsTmFtZXMpIHtcbiAgICAgICAgdmFyIG5vblRlcm1pbmFsID0gW1xuICAgICAgICAgICAgdGhpcy5hY3JvRm9ybSxcbiAgICAgICAgXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gcGFydGlhbE5hbWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIG5hbWVQYXJ0ID0gcGFydGlhbE5hbWVzW2lkeF07XG4gICAgICAgICAgICBpZiAoIW5hbWVQYXJ0KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRmllbGROYW1lUGFydEVycm9yKG5hbWVQYXJ0KTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IG5vblRlcm1pbmFsWzBdLCBwYXJlbnRSZWYgPSBub25UZXJtaW5hbFsxXTtcbiAgICAgICAgICAgIHZhciByZXMgPSB0aGlzLmZpbmROb25UZXJtaW5hbChuYW1lUGFydCwgcGFyZW50XzEpO1xuICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIG5vblRlcm1pbmFsID0gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBQREZBY3JvTm9uVGVybWluYWwuY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgIG5vZGUuc2V0UGFydGlhbE5hbWUobmFtZVBhcnQpO1xuICAgICAgICAgICAgICAgIG5vZGUuc2V0UGFyZW50KHBhcmVudFJlZik7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGVSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKG5vZGUuZGljdCk7XG4gICAgICAgICAgICAgICAgcGFyZW50XzEuYWRkRmllbGQobm9kZVJlZik7XG4gICAgICAgICAgICAgICAgbm9uVGVybWluYWwgPSBbbm9kZSwgbm9kZVJlZl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vblRlcm1pbmFsO1xuICAgIH07XG4gICAgUERGRm9ybS5wcm90b3R5cGUuZmluZE5vblRlcm1pbmFsID0gZnVuY3Rpb24gKHBhcnRpYWxOYW1lLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHBhcmVudCBpbnN0YW5jZW9mIFBERkFjcm9Gb3JtXG4gICAgICAgICAgICA/IHRoaXMuYWNyb0Zvcm0uZ2V0RmllbGRzKClcbiAgICAgICAgICAgIDogY3JlYXRlUERGQWNyb0ZpZWxkcyhwYXJlbnQuS2lkcygpKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZmllbGRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZmllbGRzW2lkeF0sIGZpZWxkID0gX2FbMF0sIHJlZiA9IF9hWzFdO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmdldFBhcnRpYWxOYW1lKCkgPT09IHBhcnRpYWxOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb05vblRlcm1pbmFsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2ZpZWxkLCByZWZdO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWVsZEFscmVhZHlFeGlzdHNFcnJvcihwYXJ0aWFsTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5nZXRGb3JtXV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZGb3JtXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkZvcm1dXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9Gb3JtIGFuZCBlbWJlZGRlclxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9Gb3JtIFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvRm9ybWAgZm9yIHRoaXMgZm9ybS5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgZm9ybSB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZGb3JtLm9mID0gZnVuY3Rpb24gKGFjcm9Gb3JtLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZGb3JtKGFjcm9Gb3JtLCBkb2MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkZvcm07XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRm9ybTtcbnZhciBjb252ZXJ0VG9QREZGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCwgcmVmLCBkb2MpIHtcbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvUHVzaEJ1dHRvbilcbiAgICAgICAgcmV0dXJuIFBERkJ1dHRvbi5vZihmaWVsZCwgcmVmLCBkb2MpO1xuICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9DaGVja0JveClcbiAgICAgICAgcmV0dXJuIFBERkNoZWNrQm94Lm9mKGZpZWxkLCByZWYsIGRvYyk7XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb0NvbWJvQm94KVxuICAgICAgICByZXR1cm4gUERGRHJvcGRvd24ub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvTGlzdEJveClcbiAgICAgICAgcmV0dXJuIFBERk9wdGlvbkxpc3Qub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvVGV4dClcbiAgICAgICAgcmV0dXJuIFBERlRleHRGaWVsZC5vZihmaWVsZCwgcmVmLCBkb2MpO1xuICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9SYWRpb0J1dHRvbikge1xuICAgICAgICByZXR1cm4gUERGUmFkaW9Hcm91cC5vZihmaWVsZCwgcmVmLCBkb2MpO1xuICAgIH1cbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvU2lnbmF0dXJlKSB7XG4gICAgICAgIHJldHVybiBQREZTaWduYXR1cmUub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG52YXIgc3BsaXRGaWVsZE5hbWUgPSBmdW5jdGlvbiAoZnVsbHlRdWFsaWZpZWROYW1lKSB7XG4gICAgaWYgKGZ1bGx5UXVhbGlmaWVkTmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQREYgZmllbGQgbmFtZXMgbXVzdCBub3QgYmUgZW1wdHkgc3RyaW5ncycpO1xuICAgIH1cbiAgICB2YXIgcGFydHMgPSBmdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoJy4nKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBwYXJ0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgaWYgKHBhcnRzW2lkeF0gPT09ICcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQZXJpb2RzIGluIFBERiBmaWVsZCBuYW1lcyBtdXN0IGJlIHNlcGFyYXRlZCBieSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyOiBcXFwiXCIgKyBmdWxseVF1YWxpZmllZE5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgcmV0dXJuIHsgbm9uVGVybWluYWw6IFtdLCB0ZXJtaW5hbDogcGFydHNbMF0gfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBub25UZXJtaW5hbDogcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSksXG4gICAgICAgIHRlcm1pbmFsOiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSxcbiAgICB9O1xufTtcbnZhciBhZGRGaWVsZFRvUGFyZW50ID0gZnVuY3Rpb24gKF9hLCBfYiwgcGFydGlhbE5hbWUpIHtcbiAgICB2YXIgcGFyZW50ID0gX2FbMF0sIHBhcmVudFJlZiA9IF9hWzFdO1xuICAgIHZhciBmaWVsZCA9IF9iWzBdLCBmaWVsZFJlZiA9IF9iWzFdO1xuICAgIHZhciBlbnRyaWVzID0gcGFyZW50Lm5vcm1hbGl6ZWRFbnRyaWVzKCk7XG4gICAgdmFyIGZpZWxkcyA9IGNyZWF0ZVBERkFjcm9GaWVsZHMoJ0tpZHMnIGluIGVudHJpZXMgPyBlbnRyaWVzLktpZHMgOiBlbnRyaWVzLkZpZWxkcyk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZmllbGRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBpZiAoZmllbGRzW2lkeF1bMF0uZ2V0UGFydGlhbE5hbWUoKSA9PT0gcGFydGlhbE5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGaWVsZEFscmVhZHlFeGlzdHNFcnJvcihwYXJ0aWFsTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyZW50LmFkZEZpZWxkKGZpZWxkUmVmKTtcbiAgICBmaWVsZC5zZXRQYXJlbnQocGFyZW50UmVmKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZGb3JtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4uL1BERlBhZ2VcIjtcbmltcG9ydCBQREZGb250IGZyb20gXCIuLi9QREZGb250XCI7XG5pbXBvcnQgUERGRmllbGQsIHsgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucywgfSBmcm9tIFwiLi9QREZGaWVsZFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQXBwZWFyYW5jZSwgZGVmYXVsdE9wdGlvbkxpc3RBcHBlYXJhbmNlUHJvdmlkZXIsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBQREZIZXhTdHJpbmcsIFBERlN0cmVhbSwgUERGQWNyb0xpc3RCb3gsIEFjcm9DaG9pY2VGbGFncywgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydElzU3Vic2V0LCBhc3NlcnRPclVuZGVmaW5lZCwgYXNzZXJ0UG9zaXRpdmUsIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gb3B0aW9uIGxpc3QgZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERk9wdGlvbkxpc3RdXSBmaWVsZHMgYXJlIGludGVyYWN0aXZlIGxpc3RzIG9mIG9wdGlvbnMuIFRoZSBwdXJwb3NlIG9mIGFuXG4gKiBvcHRpb24gbGlzdCBpcyB0byBlbmFibGUgdXNlcnMgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG9wdGlvbnMgZnJvbSBhIHNldCBvZlxuICogcG9zc2libGUgb3B0aW9ucy4gVXNlcnMgYXJlIGFibGUgdG8gc2VlIHRoZSBmdWxsIHNldCBvZiBvcHRpb25zIHdpdGhvdXRcbiAqIGZpcnN0IGhhdmluZyB0byBjbGljayBvbiB0aGUgZmllbGQgKHRob3VnaCBzY3JvbGxpbmcgbWF5IGJlIG5lY2Vzc2FyeSkuXG4gKiBDbGlja2luZyBhbiBvcHRpb24gaW4gdGhlIGxpc3Qgd2lsbCBjYXVzZSBpdCB0byBiZSBzZWxlY3RlZCBhbmQgZGlzcGxheWVkXG4gKiB3aXRoIGEgaGlnaGxpZ2h0ZWQgYmFja2dyb3VuZC4gU29tZSBvcHRpb24gbGlzdHMgYWxsb3cgdXNlcnMgdG8gc2VsZWN0XG4gKiBtb3JlIHRoYW4gb25lIG9wdGlvbiAoc2VlIFtbUERGT3B0aW9uTGlzdC5pc011bHRpc2VsZWN0XV0pLlxuICovXG52YXIgUERGT3B0aW9uTGlzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGT3B0aW9uTGlzdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZPcHRpb25MaXN0KGFjcm9MaXN0Qm94LCByZWYsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBhY3JvTGlzdEJveCwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9MaXN0Qm94LCAnYWNyb0xpc3RCb3gnLCBbW1BERkFjcm9MaXN0Qm94LCAnUERGQWNyb0xpc3RCb3gnXV0pO1xuICAgICAgICBfdGhpcy5hY3JvRmllbGQgPSBhY3JvTGlzdEJveDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMgZm9yIHRoaXMgb3B0aW9uIGxpc3QuIFRoZXNlIG9wdGlvbnMgd2lsbFxuICAgICAqIGJlIGRpc3BsYXllZCB0byB1c2VycyB3aG8gdmlldyB0aGlzIG9wdGlvbiBsaXN0IGluIGEgUERGIHJlYWRlci5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IG9wdGlvbkxpc3QuZ2V0T3B0aW9ucygpXG4gICAgICogY29uc29sZS5sb2coJ09wdGlvbiBMaXN0IG9wdGlvbnM6Jywgb3B0aW9ucylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW9ucyBmb3IgdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmF3T3B0aW9ucyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBuZXcgQXJyYXkocmF3T3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gcmF3T3B0aW9uc1tpZHhdLCBkaXNwbGF5ID0gX2EuZGlzcGxheSwgdmFsdWUgPSBfYS52YWx1ZTtcbiAgICAgICAgICAgIG9wdGlvbnNbaWR4XSA9IChkaXNwbGF5ICE9PSBudWxsICYmIGRpc3BsYXkgIT09IHZvaWQgMCA/IGRpc3BsYXkgOiB2YWx1ZSkuZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZWxlY3RlZCBvcHRpb25zIGZvciB0aGlzIG9wdGlvbiBsaXN0LiBUaGVzZSBhcmUgdGhlIHZhbHVlcyB0aGF0XG4gICAgICogd2VyZSBzZWxlY3RlZCBieSBhIGh1bWFuIHVzZXIgdmlhIGEgUERGIHJlYWRlciwgb3IgcHJvZ3JhbWF0aWNhbGx5IHZpYVxuICAgICAqIHNvZnR3YXJlLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBjb25zdCBzZWxlY3Rpb25zID0gb3B0aW9uTGlzdC5nZXRTZWxlY3RlZCgpXG4gICAgICogY29uc29sZS5sb2coJ09wdGlvbiBMaXN0IHNlbGVjdGlvbnM6Jywgc2VsZWN0aW9ucylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgc2VsZWN0ZWQgb3B0aW9ucyBmb3IgdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5nZXRTZWxlY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlcygpO1xuICAgICAgICB2YXIgc2VsZWN0ZWQgPSBuZXcgQXJyYXkodmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHNlbGVjdGVkW2lkeF0gPSB2YWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsaXN0IG9mIG9wdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbiBsaXN0LiBUaGVzZSBhcmVcbiAgICAgKiB0aGUgdmFsdWVzIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHVzZXJzIHRvIHNlbGVjdCB3aGVuIHRoZXkgdmlldyB0aGlzXG4gICAgICogb3B0aW9uIGxpc3QgaW4gYSBQREYgcmVhZGVyLiBOb3RlIHRoYXQgcHJlZXhpc3Rpbmcgb3B0aW9ucyBmb3IgdGhpc1xuICAgICAqIG9wdGlvbiBsaXN0IHdpbGwgYmUgcmVtb3ZlZC4gT25seSB0aGUgdmFsdWVzIHBhc3NlZCBhcyBgb3B0aW9uc2Agd2lsbCBiZVxuICAgICAqIGF2YWlsYWJsZSB0byBzZWxlY3QuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3BsYW5ldHMub3B0aW9uTGlzdCcpXG4gICAgICogb3B0aW9uTGlzdC5zZXRPcHRpb25zKFsnRWFydGgnLCAnTWFycycsICdQbHV0bycsICdWZW51cyddKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgb3B0aW9uIGxpc3QgYXMgZGlydHksIGNhdXNpbmcgaXRzIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHRvIGJlIHVwZGF0ZWQgd2hlbiBlaXRoZXIgW1tQREZEb2N1bWVudC5zYXZlXV0gb3JcbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIGlzIGNhbGxlZC4gVGhlIHVwZGF0ZWQgc3RyZWFtcyB3aWxsXG4gICAgICogZGlzcGxheSB0aGUgb3B0aW9ucyB0aGlzIGZpZWxkIGNvbnRhaW5zIGluc2lkZSB0aGUgd2lkZ2V0cyBvZiB0aGlzIHRleHRcbiAgICAgKiBmaWVsZCAod2l0aCBzZWxlY3RlZCBvcHRpb25zIGhpZ2hsaWdodGVkKS5cbiAgICAgKlxuICAgICAqICoqSU1QT1JUQU5UOioqIFRoZSBkZWZhdWx0IGZvbnQgdXNlZCB0byB1cGRhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIGlzXG4gICAgICogW1tTdGFuZGFyZEZvbnRzLkhlbHZldGljYV1dLiBOb3RlIHRoYXQgdGhpcyBpcyBhIFdpbkFuc2kgZm9udC4gVGhpcyBtZWFuc1xuICAgICAqIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHdpbGwgYmUgdGhyb3duIGlmIHRoaXMgZmllbGQgY29udGFpbnMgYW55IG9wdGlvbnNcbiAgICAgKiB3aXRoIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgV2luQW5zaSBjaGFyYWN0ZXIgc2V0ICh0aGUgbGF0aW4gYWxwaGFiZXQpLlxuICAgICAqXG4gICAgICogRW1iZWRkaW5nIGEgY3VzdG9tIGZvbnQgYW5kIHBhc3NpbmcgaXQgdG9cbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIG9yIFtbUERGT3B0aW9uTGlzdC51cGRhdGVBcHBlYXJhbmNlc11dXG4gICAgICogYWxsb3dzIHlvdSB0byBnZW5lcmF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgd2l0aCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlXG4gICAgICogbGF0aW4gYWxwaGFiZXQgKGFzc3VtaW5nIHRoZSBjdXN0b20gZm9udCBzdXBwb3J0cyB0aGVtKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLCAnb3B0aW9ucycsIFtBcnJheV0pO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHZhciBvcHRpb25PYmplY3RzID0gbmV3IEFycmF5KG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG9wdGlvbk9iamVjdHNbaWR4XSA9IHsgdmFsdWU6IFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb25zW2lkeF0pIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0T3B0aW9ucyhvcHRpb25PYmplY3RzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCB0byB0aGUgbGlzdCBvZiBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24gbGlzdC4gVXNlcnNcbiAgICAgKiB3aWxsIGJlIGFibGUgdG8gc2VsZWN0IHRoZXNlIHZhbHVlcyBpbiBhIFBERiByZWFkZXIuIEluIGFkZGl0aW9uIHRvIHRoZVxuICAgICAqIHZhbHVlcyBwYXNzZWQgYXMgYG9wdGlvbnNgLCBhbnkgcHJlZXhpc3Rpbmcgb3B0aW9ucyBmb3IgdGhpcyBvcHRpb24gbGlzdFxuICAgICAqIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlIGZvciB1c2VycyB0byBzZWxlY3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdyb2NrZXRzLm9wdGlvbkxpc3QnKVxuICAgICAqIG9wdGlvbkxpc3QuYWRkT3B0aW9ucyhbJ1NhdHVybiBJVicsICdGYWxjb24gSGVhdnknXSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyBvcHRpb24gbGlzdCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZPcHRpb25MaXN0LnNldE9wdGlvbnNdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBOZXcgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5hZGRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucywgJ29wdGlvbnMnLCBbJ3N0cmluZycsIEFycmF5XSk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdmFyIG9wdGlvbnNBcnIgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IFtvcHRpb25zXTtcbiAgICAgICAgdmFyIGV4aXN0aW5nT3B0aW9ucyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIG5ld09wdGlvbnMgPSBuZXcgQXJyYXkob3B0aW9uc0Fyci5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zQXJyLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgbmV3T3B0aW9uc1tpZHhdID0geyB2YWx1ZTogUERGSGV4U3RyaW5nLmZyb21UZXh0KG9wdGlvbnNBcnJbaWR4XSkgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRPcHRpb25zKGV4aXN0aW5nT3B0aW9ucy5jb25jYXQobmV3T3B0aW9ucykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2VsZWN0IG9uZSBvciBtb3JlIHZhbHVlcyBmb3IgdGhpcyBvcHRpb24gbGlzdC4gVGhpcyBvcGVyYXRpb24gaXMgYW5hbG9nb3VzXG4gICAgICogdG8gYSBodW1hbiB1c2VyIG9wZW5pbmcgdGhlIG9wdGlvbiBsaXN0IGluIGEgUERGIHJlYWRlciBhbmQgY2xpY2tpbmcgb24gb25lXG4gICAgICogb3IgbW9yZSB2YWx1ZXMgdG8gc2VsZWN0IHRoZW0uIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHN0YXRlXG4gICAgICogb2YgdGhlIG9wdGlvbiBsaXN0IHRvIGluZGljYXRlIHdoaWNoIHZhbHVlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuIFBERlxuICAgICAqIGxpYnJhcmllcyBhbmQgcmVhZGVycyB3aWxsIGJlIGFibGUgdG8gZXh0cmFjdCB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgc2F2ZWRcbiAgICAgKiBkb2N1bWVudCBhbmQgZGV0ZXJtaW5lIHdoaWNoIHZhbHVlcyB3ZXJlIHNlbGVjdGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnYmVzdC5zdXBlcmhlcm9lcy5vcHRpb25MaXN0JylcbiAgICAgKiBvcHRpb25MaXN0LnNlbGVjdChbJ09uZSBQdW5jaCBNYW4nLCAnSXJvbiBNYW4nXSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyBvcHRpb24gbGlzdCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZPcHRpb25MaXN0LnNldE9wdGlvbnNdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSBzZWxlY3RlZC5cbiAgICAgKiBAcGFyYW0gbWVyZ2UgV2hldGhlciBvciBub3QgZXhpc3Rpbmcgc2VsZWN0aW9ucyBzaG91bGQgYmUgcHJlc2VydmVkLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChvcHRpb25zLCBtZXJnZSkge1xuICAgICAgICBpZiAobWVyZ2UgPT09IHZvaWQgMCkgeyBtZXJnZSA9IGZhbHNlOyB9XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMsICdvcHRpb25zJywgWydzdHJpbmcnLCBBcnJheV0pO1xuICAgICAgICBhc3NlcnRJcyhtZXJnZSwgJ21lcmdlJywgWydib29sZWFuJ10pO1xuICAgICAgICB2YXIgb3B0aW9uc0FyciA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogW29wdGlvbnNdO1xuICAgICAgICB2YXIgdmFsaWRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICAgIGFzc2VydElzU3Vic2V0KG9wdGlvbnNBcnIsICdvcHRpb24nLCB2YWxpZE9wdGlvbnMpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIGlmIChvcHRpb25zQXJyLmxlbmd0aCA+IDEgfHwgKG9wdGlvbnNBcnIubGVuZ3RoID09PSAxICYmIG1lcmdlKSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVNdWx0aXNlbGVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkob3B0aW9uc0Fyci5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zQXJyLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFsdWVzW2lkeF0gPSBQREZIZXhTdHJpbmcuZnJvbVRleHQob3B0aW9uc0FycltpZHhdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgICAgIHZhciBleGlzdGluZ1ZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlcygpO1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWVzKGV4aXN0aW5nVmFsdWVzLmNvbmNhdCh2YWx1ZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlcyh2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhciBhbGwgc2VsZWN0ZWQgdmFsdWVzIGZvciB0aGlzIG9wdGlvbiBsaXN0LiBUaGlzIG9wZXJhdGlvbiBpc1xuICAgICAqIGVxdWl2YWxlbnQgdG8gc2VsZWN0aW5nIGFuIGVtcHR5IGxpc3QuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZVxuICAgICAqIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlIG9wdGlvbiBsaXN0IHRvIGluZGljYXRlIHRoYXQgbm8gdmFsdWVzIGhhdmUgYmVlblxuICAgICAqIHNlbGVjdGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmNsZWFyKClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyBvcHRpb24gbGlzdCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZPcHRpb25MaXN0LnNldE9wdGlvbnNdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZXMoW10pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmb250IHNpemUgZm9yIHRoZSB0ZXh0IGluIHRoaXMgZmllbGQuIFRoZXJlIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBkZWZhdWx0IGFwcGVhcmFuY2Ugc3RyaW5nIChEQSkgc2V0IHdpdGggYSBmb250IHZhbHVlIHNwZWNpZmllZFxuICAgICAqIGZvciB0aGlzIHRvIHdvcmsuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LnNldEZvbnRTaXplKDQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250U2l6ZSBUaGUgZm9udCBzaXplIHRvIHNldCB0aGUgZm9udCB0by5cbiAgICAgKi9cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZvbnQgc2l6ZSBmb3IgdGhpcyBmaWVsZC4gTGFyZ2VyIGZvbnQgc2l6ZXMgd2lsbCByZXN1bHQgaW4gbGFyZ2VyXG4gICAgICogdGV4dCBiZWluZyBkaXNwbGF5ZWQgd2hlbiBQREYgcmVhZGVycyByZW5kZXIgdGhpcyBvcHRpb24gbGlzdC4gRm9udCBzaXplc1xuICAgICAqIG1heSBiZSBpbnRlZ2VyIG9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIFN1cHBseWluZyBhIG5lZ2F0aXZlIGZvbnQgc2l6ZVxuICAgICAqIHdpbGwgY2F1c2UgdGhpcyBtZXRob2QgdG8gdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5zZXRGb250U2l6ZSg0KVxuICAgICAqIG9wdGlvbkxpc3Quc2V0Rm9udFNpemUoMTUuNylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqID4gVGhpcyBtZXRob2QgZGVwZW5kcyB1cG9uIHRoZSBleGlzdGVuY2Ugb2YgYSBkZWZhdWx0IGFwcGVhcmFuY2VcbiAgICAgKiA+IChgL0RBYCkgc3RyaW5nLiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGFwcGVhcmFuY2Ugc3RyaW5nLFxuICAgICAqID4gb3IgdGhhdCBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhIGZvbnQgc2l6ZSAodmlhIHRoZSBgVGZgIG9wZXJhdG9yKSxcbiAgICAgKiA+IHRoZW4gdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb250U2l6ZSBUaGUgZm9udCBzaXplIHRvIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGV4dCBpbiB0aGlzIGZpZWxkLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLnNldEZvbnRTaXplID0gZnVuY3Rpb24gKGZvbnRTaXplKSB7XG4gICAgICAgIGFzc2VydFBvc2l0aXZlKGZvbnRTaXplLCAnZm9udFNpemUnKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb3B0aW9ucyBvZiB0aGlzIG9wdGlvbiBsaXN0IGFyZSBhbHdheXMgZGlzcGxheWVkXG4gICAgICogaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBpcnJlc3BlY3RpdmUgb2YgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBvcHRpb25zXG4gICAgICogd2VyZSBhZGRlZCB0byB0aGUgb3B0aW9uIGxpc3QuIFNlZSBbW1BERk9wdGlvbkxpc3QuZW5hYmxlU29ydGluZ11dIGFuZFxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5kaXNhYmxlU29ydGluZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogaWYgKG9wdGlvbkxpc3QuaXNTb3J0ZWQoKSkgY29uc29sZS5sb2coJ1NvcnRpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBvcHRpb24gbGlzdCBpcyBzb3J0ZWQuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuaXNTb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5Tb3J0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsd2F5cyBkaXNwbGF5IHRoZSBvcHRpb25zIG9mIHRoaXMgb3B0aW9uIGxpc3QgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLFxuICAgICAqIGlycmVzcGVjdGl2ZSBvZiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIG9wdGlvbnMgd2VyZSBhZGRlZCB0byB0aGlzIG9wdGlvblxuICAgICAqIGxpc3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZW5hYmxlU29ydGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZW5hYmxlU29ydGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Tb3J0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbHdheXMgZGlzcGxheSB0aGUgb3B0aW9ucyBvZiB0aGlzIG9wdGlvbiBsaXN0IGluIGFscGhhYmV0aWNhbFxuICAgICAqIG9yZGVyLiBJbnN0ZWFkLCBkaXNwbGF5IHRoZSBvcHRpb25zIGluIHdoaWNoZXZlciBvcmRlciB0aGV5IHdlcmUgYWRkZWRcbiAgICAgKiB0byB0aGlzIG9wdGlvbiBsaXN0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5kaXNhYmxlU29ydGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZGlzYWJsZVNvcnRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqIFNlZSBbW1BERk9wdGlvbkxpc3QuZW5hYmxlTXVsdGlzZWxlY3RdXSBhbmRcbiAgICAgKiBbW1BERk9wdGlvbkxpc3QuZGlzYWJsZU11bHRpc2VsZWN0XV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBpZiAob3B0aW9uTGlzdC5pc011bHRpc2VsZWN0KCkpIGNvbnNvbGUubG9nKCdNdWx0aXNlbGVjdCBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBtdWx0aXBsZSBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5pc011bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgdXNlcnMgdG8gc2VsZWN0IG1vcmUgdGhhbiBvbmUgb3B0aW9uIGZyb20gdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5lbmFibGVNdWx0aXNlbGVjdCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZW5hYmxlTXVsdGlzZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IHVzZXJzIHRvIHNlbGVjdCBtb3JlIHRoYW4gb25lIG9wdGlvbiBmcm9tIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZGlzYWJsZU11bHRpc2VsZWN0KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5kaXNhYmxlTXVsdGlzZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIGlzIHN0b3JlZCwgb3IgXCJjb21taXR0ZWRcIixcbiAgICAgKiB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgb3B0aW9uLiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhhdCB0aGUgdXNlcidzXG4gICAgICogc2VsZWN0aW9uIGlzIHN0b3JlZCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGlzIG9wdGlvbiBsaXN0IGZpZWxkIChieVxuICAgICAqIGNsaWNraW5nIG91dHNpZGUgb2YgaXQgLSBvbiBhbm90aGVyIGZpZWxkLCBmb3IgZXhhbXBsZSkuIFNlZVxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5lbmFibGVTZWxlY3RPbkNsaWNrXV0gYW5kXG4gICAgICogW1tQREZPcHRpb25MaXN0LmRpc2FibGVTZWxlY3RPbkNsaWNrXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBpZiAob3B0aW9uTGlzdC5pc1NlbGVjdE9uQ2xpY2soKSkgY29uc29sZS5sb2coJ1NlbGVjdCBvbiBjbGljayBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBvcHRpb25zIGFyZSBzZWxlY3RlZCBpbW1lZGlhdGVseSBhZnRlciB0aGV5IGFyZVxuICAgICAqICAgICAgICAgIGNsaWNrZWQuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuaXNTZWxlY3RPbkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuQ29tbWl0T25TZWxDaGFuZ2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3RvcmUgdGhlIG9wdGlvbiBzZWxlY3RlZCBieSBhIHVzZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZXIgY2xpY2tzIHRoZVxuICAgICAqIG9wdGlvbi4gRG8gbm90IHdhaXQgZm9yIHRoZSB1c2VyIHRvIGxlYXZlIHRoaXMgb3B0aW9uIGxpc3QgZmllbGQgKGJ5XG4gICAgICogY2xpY2tpbmcgb3V0c2lkZSBvZiBpdCAtIG9uIGFub3RoZXIgZmllbGQsIGZvciBleGFtcGxlKS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZW5hYmxlU2VsZWN0T25DbGljaygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZW5hYmxlU2VsZWN0T25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Db21taXRPblNlbENoYW5nZSwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXYWl0IHRvIHN0b3JlIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIHVudGlsIHRoZXkgbGVhdmUgdGhpcyBvcHRpb25cbiAgICAgKiBsaXN0IGZpZWxkIChieSBjbGlja2luZyBvdXRzaWRlIG9mIGl0IC0gb24gYW5vdGhlciBmaWVsZCwgZm9yIGV4YW1wbGUpLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmRpc2FibGVTZWxlY3RPbkNsaWNrKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5kaXNhYmxlU2VsZWN0T25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Db21taXRPblNlbENoYW5nZSwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGlzIG9wdGlvbiBsaXN0IG9uIHRoZSBzcGVjaWZpZWQgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB1YnVudHVGb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udCh1YnVudHVGb250Qnl0ZXMpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uY3JlYXRlT3B0aW9uTGlzdCgnYmVzdC5ndW5kYW1zJylcbiAgICAgKiBvcHRpb25MaXN0LnNldE9wdGlvbnMoWydFeGlhJywgJ0R5bmFtZXMnLCAnS3lyaW9zJywgJ1ZpcnR1ZSddKVxuICAgICAqIG9wdGlvbkxpc3Quc2VsZWN0KFsnRXhpYScsICdWaXJ0dWUnXSlcbiAgICAgKlxuICAgICAqIG9wdGlvbkxpc3QuYWRkVG9QYWdlKHBhZ2UsIHtcbiAgICAgKiAgIHg6IDUwLFxuICAgICAqICAgeTogNzUsXG4gICAgICogICB3aWR0aDogMjAwLFxuICAgICAqICAgaGVpZ2h0OiAxMDAsXG4gICAgICogICB0ZXh0Q29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgIGJhY2tncm91bmRDb2xvcjogcmdiKDAsIDEsIDApLFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLCAwLCAxKSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDkwKSxcbiAgICAgKiAgIGZvbnQ6IHVidW50dUZvbnQsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHdpZGdldCBmb3IgdGhpcyBvcHRpb24gbGlzdCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGlzIG9wdGlvbiBsaXN0IHdpZGdldCBzaG91bGQgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGFkZGluZyB0aGlzIG9wdGlvbiBsaXN0IHdpZGdldC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5hZGRUb1BhZ2UgPSBmdW5jdGlvbiAocGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgW1tQREZQYWdlLCAnUERGUGFnZSddXSk7XG4gICAgICAgIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKCEoJ3RleHRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLnRleHRDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JhY2tncm91bmRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJhY2tncm91bmRDb2xvciA9IHJnYigxLCAxLCAxKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdib3JkZXJXaWR0aCcgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlcldpZHRoID0gMTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGZvciB0aGlzIG9wdGlvbiBsaXN0XG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmNyZWF0ZVdpZGdldCh7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDAsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDAsXG4gICAgICAgICAgICB3aWR0aDogKF9jID0gb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMTAwLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2UgPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwLFxuICAgICAgICAgICAgcm90YXRlOiAoX2YgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGhpZGRlbjogb3B0aW9ucy5oaWRkZW4sXG4gICAgICAgICAgICBwYWdlOiBwYWdlLnJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGlzIGZpZWxkXG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLmFkZFdpZGdldCh3aWRnZXRSZWYpO1xuICAgICAgICAvLyBTZXQgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciB3aWRnZXRcbiAgICAgICAgdmFyIGZvbnQgPSAoX2cgPSBvcHRpb25zLmZvbnQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHRoaXMuZG9jLmdldEZvcm0oKS5nZXREZWZhdWx0Rm9udCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGUgZ2l2ZW4gcGFnZVxuICAgICAgICBwYWdlLm5vZGUuYWRkQW5ub3Qod2lkZ2V0UmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgb3B0aW9uIGxpc3QgaGFzIGJlZW4gbWFya2VkIGFzIGRpcnR5LCBvciBpZiBhbnkgb2ZcbiAgICAgKiB0aGlzIG9wdGlvbiBsaXN0J3Mgd2lkZ2V0cyBkbyBub3QgaGF2ZSBhbiBhcHBlYXJhbmNlIHN0cmVhbS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIGlmIChvcHRpb25MaXN0Lm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUoKSkgY29uc29sZS5sb2coJ05lZWRzIHVwZGF0ZScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBvcHRpb24gbGlzdCBuZWVkcyBhbiBhcHBlYXJhbmNlIHVwZGF0ZS5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLmlzRGlydHkoKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgaGFzQXBwZWFyYW5jZXMgPSAoKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWwpIGluc3RhbmNlb2YgUERGU3RyZWFtO1xuICAgICAgICAgICAgaWYgKCFoYXNBcHBlYXJhbmNlcylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIG9wdGlvbiBsaXN0J3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIG9wdGlvbiBsaXN0cy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgdGhpcy51cGRhdGVBcHBlYXJhbmNlcyhmb250KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgb3B0aW9uIGxpc3QncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGdpdmVuIGFwcGVhcmFuY2UgcHJvdmlkZXIuIElmIG5vIGBwcm92aWRlcmAgaXMgcGFzc2VkLCB0aGUgZGVmYXVsdFxuICAgICAqIGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIG9wdGlvbiBsaXN0cyB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QudXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhLCAoZmllbGQsIHdpZGdldCwgZm9udCkgPT4ge1xuICAgICAqICAgLi4uXG4gICAgICogICByZXR1cm4gZHJhd09wdGlvbkxpc3QoLi4uKVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgT3B0aW9uYWxseSwgdGhlIGFwcGVhcmFuY2UgcHJvdmlkZXIgdG8gYmUgdXNlZCBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS51cGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250LCBwcm92aWRlcikge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwcm92aWRlciwgJ3Byb3ZpZGVyJywgW0Z1bmN0aW9uXSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICAvLyBnZXRPcHRpb24oaW5kZXg6IG51bWJlcik6IHN0cmluZyB7fVxuICAgIC8vIGdldFNlbGVjdGVkSW5kaWNlcygpOiBudW1iZXJbXSB7fVxuICAgIC8vIHJlbW92ZU9wdGlvbnMob3B0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXSkge31cbiAgICAvLyByZW1vdmVJbmRpY2VzKG9wdGlvbjogbnVtYmVyW10pIHt9XG4gICAgLy8gZGVzZWxlY3Qob3B0aW9uczogc3RyaW5nIHwgc3RyaW5nW10pIHt9XG4gICAgLy8gZGVzZWxlY3RJbmRpY2VzKG9wdGlvbkluZGljZXM6IG51bWJlcltdKSB7fVxuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBmb250LCBwcm92aWRlcikge1xuICAgICAgICB2YXIgYXBQcm92aWRlciA9IHByb3ZpZGVyICE9PSBudWxsICYmIHByb3ZpZGVyICE9PSB2b2lkIDAgPyBwcm92aWRlciA6IGRlZmF1bHRPcHRpb25MaXN0QXBwZWFyYW5jZVByb3ZpZGVyO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZXMgPSBub3JtYWxpemVBcHBlYXJhbmNlKGFwUHJvdmlkZXIodGhpcywgd2lkZ2V0LCBmb250KSk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZVdpdGhGb250KHdpZGdldCwgZm9udCwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0T3B0aW9uTGlzdF1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGVcbiAgICAgKiA+IGFuIGluc3RhbmNlIG9mIFtbUERGT3B0aW9uTGlzdF1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZPcHRpb25MaXN0XV0gZnJvbSBhbiBleGlzdGluZyBhY3JvTGlzdEJveCBhbmRcbiAgICAgKiByZWZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvQ29tYm9Cb3ggVGhlIHVuZGVybHlpbmcgYFBERkFjcm9MaXN0Qm94YCBmb3IgdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgb3B0aW9uIGxpc3Qgd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5vZiA9IGZ1bmN0aW9uIChhY3JvTGlzdEJveCwgcmVmLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZPcHRpb25MaXN0KGFjcm9MaXN0Qm94LCByZWYsIGRvYyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGT3B0aW9uTGlzdDtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9wdGlvbkxpc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPcHRpb25MaXN0LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4uL1BERlBhZ2VcIjtcbmltcG9ydCBQREZGaWVsZCwgeyBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zLCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyBub3JtYWxpemVBcHBlYXJhbmNlLCBkZWZhdWx0UmFkaW9Hcm91cEFwcGVhcmFuY2VQcm92aWRlciwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuaW1wb3J0IHsgcmdiIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFBERk5hbWUsIFBERkhleFN0cmluZywgUERGRGljdCwgUERGQWNyb1JhZGlvQnV0dG9uLCBBY3JvQnV0dG9uRmxhZ3MsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRPclVuZGVmaW5lZCwgYXNzZXJ0SXNPbmVPZiB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmFkaW8gZ3JvdXAgZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERlJhZGlvR3JvdXBdXSBmaWVsZHMgYXJlIGNvbGxlY3Rpb25zIG9mIHJhZGlvIGJ1dHRvbnMuIFRoZSBwdXJwb3NlIG9mIGFcbiAqIHJhZGlvIGdyb3VwIGlzIHRvIGVuYWJsZSB1c2VycyB0byBzZWxlY3Qgb25lIG9wdGlvbiBmcm9tIGEgc2V0IG9mIG11dHVhbGx5XG4gKiBleGNsdXNpdmUgY2hvaWNlcy4gRWFjaCBjaG9pY2UgaW4gYSByYWRpbyBncm91cCBpcyByZXByZXNlbnRlZCBieSBhIHJhZGlvXG4gKiBidXR0b24uIFJhZGlvIGJ1dHRvbnMgZWFjaCBoYXZlIHR3byBzdGF0ZXM6IGBvbmAgYW5kIGBvZmZgLiBBdCBtb3N0IG9uZVxuICogcmFkaW8gYnV0dG9uIGluIGEgZ3JvdXAgbWF5IGJlIGluIHRoZSBgb25gIHN0YXRlIGF0IGFueSB0aW1lLiBVc2VycyBjYW5cbiAqIGNsaWNrIG9uIGEgcmFkaW8gYnV0dG9uIHRvIHNlbGVjdCBpdCAoYW5kIHRoZXJlYnkgYXV0b21hdGljYWxseSBkZXNlbGVjdCBhbnlcbiAqIG90aGVyIHJhZGlvIGJ1dHRvbiB0aGF0IG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIHNlbGVjdGVkKS4gU29tZSByYWRpb1xuICogZ3JvdXBzIGFsbG93IHVzZXJzIHRvIHRvZ2dsZSBhIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBgb2ZmYCBieSBjbGlja2luZyBvblxuICogaXQgKHNlZSBbW1BERlJhZGlvR3JvdXAuaXNPZmZUb2dnbGVhYmxlXV0pLlxuICpcbiAqIE5vdGUgdGhhdCBzb21lIHJhZGlvIGdyb3VwcyBhbGxvdyBtdWx0aXBsZSByYWRpbyBidXR0b25zIHRvIGJlIGluIHRoZSBgb25gXG4gKiBzdGF0ZSBhdCB0aGUgc2FtZSB0eXBlICoqaWYqKiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSB1bmRlcmx5aW5nIHZhbHVlIChzZWVcbiAqIFtbUERGUmFkaW9Hcm91cC5pc011dHVhbGx5RXhjbHVzaXZlXV0pLlxuICovXG52YXIgUERGUmFkaW9Hcm91cCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUmFkaW9Hcm91cCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZSYWRpb0dyb3VwKGFjcm9SYWRpb0J1dHRvbiwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb1JhZGlvQnV0dG9uLCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb1JhZGlvQnV0dG9uLCAnYWNyb1JhZGlvQnV0dG9uJywgW1xuICAgICAgICAgICAgW1BERkFjcm9SYWRpb0J1dHRvbiwgJ1BERkFjcm9SYWRpb0J1dHRvbiddLFxuICAgICAgICBdKTtcbiAgICAgICAgX3RoaXMuYWNyb0ZpZWxkID0gYWNyb1JhZGlvQnV0dG9uO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgb3B0aW9ucyBmb3IgdGhpcyByYWRpbyBncm91cC4gRWFjaCBvcHRpb24gaXNcbiAgICAgKiByZXByZXNlbnRlZCBieSBhIHJhZGlvIGJ1dHRvbi4gVGhlc2UgcmFkaW8gYnV0dG9ucyBhcmUgZGlzcGxheWVkIGF0XG4gICAgICogdmFyaW91cyBsb2NhdGlvbnMgaW4gdGhlIGRvY3VtZW50LCBwb3RlbnRpYWxseSBvbiBkaWZmZXJlbnQgcGFnZXMgKHRob3VnaFxuICAgICAqIHR5cGljYWxseSB0aGV5IGFyZSBzdGFja2VkIGhvcml6b250YWxseSBvciB2ZXJ0aWNhbGx5IG9uIHRoZSBzYW1lIHBhZ2UpLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiBjb25zdCBvcHRpb25zID0gcmFkaW9Hcm91cC5nZXRPcHRpb25zKClcbiAgICAgKiBjb25zb2xlLmxvZygnUmFkaW8gR3JvdXAgb3B0aW9uczonLCBvcHRpb25zKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpb25zIGZvciB0aGlzIHJhZGlvIGdyb3VwLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBleHBvcnRWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRFeHBvcnRWYWx1ZXMoKTtcbiAgICAgICAgaWYgKGV4cG9ydFZhbHVlcykge1xuICAgICAgICAgICAgdmFyIGV4cG9ydE9wdGlvbnMgPSBuZXcgQXJyYXkoZXhwb3J0VmFsdWVzLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBleHBvcnRWYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgZXhwb3J0T3B0aW9uc1tpZHhdID0gZXhwb3J0VmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV4cG9ydE9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9uVmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0T25WYWx1ZXMoKTtcbiAgICAgICAgdmFyIG9uT3B0aW9ucyA9IG5ldyBBcnJheShvblZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvbk9wdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBvbk9wdGlvbnNbaWR4XSA9IG9uVmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvbk9wdGlvbnM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIG9wdGlvbiBmb3IgdGhpcyByYWRpbyBncm91cC4gVGhlIHNlbGVjdGVkIG9wdGlvbiBpc1xuICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoZSByYWRpbyBidXR0b24gaW4gdGhpcyBncm91cCB0aGF0IGlzIHR1cm5lZCBvbi4gQXQgbW9zdFxuICAgICAqIG9uZSByYWRpbyBidXR0b24gaW4gYSBncm91cCBjYW4gYmUgc2VsZWN0ZWQuIElmIG5vIGJ1dHRvbnMgaW4gdGhpcyBncm91cFxuICAgICAqIGFyZSBzZWxlY3RlZCwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIGNvbnN0IHNlbGVjdGVkID0gcmFkaW9Hcm91cC5nZXRTZWxlY3RlZCgpXG4gICAgICogY29uc29sZS5sb2coJ1NlbGVjdGVkIHJhZGlvIGJ1dHRvbjonLCBzZWxlY3RlZClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgc2VsZWN0ZWQgb3B0aW9uIGZvciB0aGlzIHJhZGlvIGdyb3VwLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmdldFNlbGVjdGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09IFBERk5hbWUub2YoJ09mZicpKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGV4cG9ydFZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldEV4cG9ydFZhbHVlcygpO1xuICAgICAgICBpZiAoZXhwb3J0VmFsdWVzKSB7XG4gICAgICAgICAgICB2YXIgb25WYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPblZhbHVlcygpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb25WYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9uVmFsdWVzW2lkeF0gPT09IHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0VmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZS5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvLyAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSB0aGlzIHNlZW1zIHRvIGNyYXNoIEFjcm9iYXQuIE1heWJlIGl0J3MgYmVjYXVzZSB3ZVxuICAgIC8vIC8vICAgICAgIGFyZW4ndCByZW1vdmluZyB0aGUgd2lkZ2V0IHJlZmVyZW5jZSBmcm9tIHRoZSBwYWdlJ3MgQW5ub3RzP1xuICAgIC8vIHJlbW92ZU9wdGlvbihvcHRpb246IHN0cmluZykge1xuICAgIC8vICAgYXNzZXJ0SXMob3B0aW9uLCAnb3B0aW9uJywgWydzdHJpbmcnXSk7XG4gICAgLy8gICAvLyBUT0RPOiBBc3NlcnQgaXMgdmFsaWQgYG9wdGlvbmAhXG4gICAgLy8gICBjb25zdCBvblZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9uVmFsdWVzKCk7XG4gICAgLy8gICBjb25zdCBleHBvcnRWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRFeHBvcnRWYWx1ZXMoKTtcbiAgICAvLyAgIGlmIChleHBvcnRWYWx1ZXMpIHtcbiAgICAvLyAgICAgZm9yIChsZXQgaWR4ID0gMCwgbGVuID0gZXhwb3J0VmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgIC8vICAgICAgIGlmIChleHBvcnRWYWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCkgPT09IG9wdGlvbikge1xuICAgIC8vICAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlV2lkZ2V0KGlkeCk7XG4gICAgLy8gICAgICAgICB0aGlzLmFjcm9GaWVsZC5yZW1vdmVFeHBvcnRWYWx1ZShpZHgpO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgZm9yIChsZXQgaWR4ID0gMCwgbGVuID0gb25WYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgLy8gICAgICAgY29uc3QgdmFsdWUgPSBvblZhbHVlc1tpZHhdO1xuICAgIC8vICAgICAgIGlmICh2YWx1ZS5kZWNvZGVUZXh0KCkgPT09IG9wdGlvbikge1xuICAgIC8vICAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlV2lkZ2V0KGlkeCk7XG4gICAgLy8gICAgICAgICB0aGlzLmFjcm9GaWVsZC5yZW1vdmVFeHBvcnRWYWx1ZShpZHgpO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICAvKipcbiAgICAgKiBTZWxlY3QgYW4gb3B0aW9uIGZvciB0aGlzIHJhZGlvIGdyb3VwLiBUaGlzIG9wZXJhdGlvbiBpcyBhbmFsb2dvdXMgdG8gYVxuICAgICAqIGh1bWFuIHVzZXIgY2xpY2tpbmcgb25lIG9mIHRoZSByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgdmlhIGEgUERGXG4gICAgICogcmVhZGVyIHRvIHRvZ2dsZSBpdCBvbi4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgc3RhdGUgb2ZcbiAgICAgKiB0aGUgcmFkaW8gZ3JvdXAgdG8gaW5kaWNhdGUgd2hpY2ggb3B0aW9uIGhhcyBiZWVuIHNlbGVjdGVkLiBQREYgbGlicmFyaWVzXG4gICAgICogYW5kIHJlYWRlcnMgd2lsbCBiZSBhYmxlIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSBmcm9tIHRoZSBzYXZlZCBkb2N1bWVudCBhbmRcbiAgICAgKiBkZXRlcm1pbmUgd2hpY2ggb3B0aW9uIHdhcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnYmVzdC5zdXBlcmhlcm8ucmFkaW9Hcm91cCcpXG4gICAgICogcmFkaW9Hcm91cC5zZWxlY3QoJ09uZSBQdW5jaCBNYW4nKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgcmFkaW8gZ3JvdXAgYXMgZGlydHksIGNhdXNpbmcgaXRzIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHRvIGJlIHVwZGF0ZWQgd2hlbiBlaXRoZXIgW1tQREZEb2N1bWVudC5zYXZlXV0gb3JcbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIGlzIGNhbGxlZC4gVGhlIHVwZGF0ZWQgYXBwZWFyYW5jZVxuICAgICAqIHN0cmVhbXMgd2lsbCBkaXNwbGF5IGEgZG90IGluc2lkZSB0aGUgd2lkZ2V0IG9mIHRoaXMgY2hlY2sgYm94IGZpZWxkXG4gICAgICogdGhhdCByZXByZXNlbnRzIHRoZSBzZWxlY3RlZCBvcHRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgICBhc3NlcnRJcyhvcHRpb24sICdvcHRpb24nLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIHZhbGlkT3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICBhc3NlcnRJc09uZU9mKG9wdGlvbiwgJ29wdGlvbicsIHZhbGlkT3B0aW9ucyk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdmFyIG9uVmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0T25WYWx1ZXMoKTtcbiAgICAgICAgdmFyIGV4cG9ydFZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldEV4cG9ydFZhbHVlcygpO1xuICAgICAgICBpZiAoZXhwb3J0VmFsdWVzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBleHBvcnRWYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cG9ydFZhbHVlc1tpZHhdLmRlY29kZVRleHQoKSA9PT0gb3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlKG9uVmFsdWVzW2lkeF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9uVmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9uVmFsdWVzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmRlY29kZVRleHQoKSA9PT0gb3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsZWFyIGFueSBzZWxlY3RlZCBvcHRpb24gZm9yIHRoaXMgZHJvcGRvd24uIFRoaXMgd2lsbCByZXN1bHQgaW4gYWxsXG4gICAgICogcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIGJlaW5nIHRvZ2dsZWQgb2ZmLiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZVxuICAgICAqIHRoZSB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZSBkcm9wZG93biB0byBpbmRpY2F0ZSB0aGF0IG5vIHJhZGlvIGJ1dHRvbnNcbiAgICAgKiBoYXZlIGJlZW4gc2VsZWN0ZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuY2xlYXIoKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHJhZGlvIGdyb3VwIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlJhZGlvR3JvdXAuc2VsZWN0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWUoUERGTmFtZS5vZignT2ZmJykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdXNlcnMgY2FuIGNsaWNrIG9uIHJhZGlvIGJ1dHRvbnMgaW4gdGhpcyBncm91cCB0byB0b2dnbGVcbiAgICAgKiB0aGVtIG9mZi4gVGhlIGFsdGVybmF0aXZlIGlzIHRoYXQgb25jZSBhIHVzZXIgY2xpY2tzIG9uIGEgcmFkaW8gYnV0dG9uXG4gICAgICogdG8gc2VsZWN0IGl0LCB0aGUgb25seSB3YXkgdG8gZGVzZWxlY3QgaXQgaXMgYnkgc2VsZWN0aW5nIG9uIGFub3RoZXIgcmFkaW9cbiAgICAgKiBidXR0b24gaW4gdGhlIGdyb3VwLiBTZWUgW1tQREZSYWRpb0dyb3VwLmVuYWJsZU9mZlRvZ2dsaW5nXV0gYW5kXG4gICAgICogW1tQREZSYWRpb0dyb3VwLmRpc2FibGVPZmZUb2dnbGluZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogaWYgKHJhZGlvR3JvdXAuaXNPZmZUb2dnbGVhYmxlKCkpIGNvbnNvbGUubG9nKCdPZmYgdG9nZ2xpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuaXNPZmZUb2dnbGVhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0J1dHRvbkZsYWdzLk5vVG9nZ2xlVG9PZmYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgdXNlcnMgdG8gY2xpY2sgb24gc2VsZWN0ZWQgcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIHRvIHRvZ2dsZVxuICAgICAqIHRoZW0gb2ZmLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC5lbmFibGVPZmZUb2dnbGluZygpXG4gICAgICogYGBgXG4gICAgICogPiAqKk5PVEU6KiogVGhpcyBmZWF0dXJlIGlzIGRvY3VtZW50ZWQgaW4gdGhlIFBERiBzcGVjaWZpY2F0aW9uXG4gICAgICogPiAoVGFibGUgMjI2KS4gSG93ZXZlciwgbW9zdCBQREYgcmVhZGVycyBkbyBub3QgcmVzcGVjdCB0aGlzIG9wdGlvbiBhbmRcbiAgICAgKiA+IHByZXZlbnQgdXNlcnMgZnJvbSB0b2dnbGluZyByYWRpbyBidXR0b25zIG9mZiBldmVuIHdoZW4gaXQgaXMgZW5hYmxlZC5cbiAgICAgKiA+IEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZyAoOS82LzIwMjApIE1hYydzIFByZXZpZXcgc29mdHdhcmUgZGlkXG4gICAgICogPiByZXNwZWN0IHRoZSBvcHRpb24uIEFkb2JlIEFjcm9iYXQsIEZveGl0IFJlYWRlciwgYW5kIEdvb2dsZSBDaHJvbWUgZGlkXG4gICAgICogPiBub3QuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuZW5hYmxlT2ZmVG9nZ2xpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQnV0dG9uRmxhZ3MuTm9Ub2dnbGVUb09mZiwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJldmVudCB1c2VycyBmcm9tIGNsaWNraW5nIG9uIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbnMgaW4gdGhpcyBncm91cCB0b1xuICAgICAqIHRvZ2dsZSB0aGVtIG9mZi4gQ2xpY2tpbmcgb24gYSBzZWxlY3RlZCByYWRpbyBidXR0b24gd2lsbCBoYXZlIG5vIGVmZmVjdC5cbiAgICAgKiBUaGUgb25seSB3YXkgdG8gZGVzZWxlY3QgYSBzZWxlY3RlZCByYWRpbyBidXR0b24gaXMgdG8gY2xpY2sgb24gYVxuICAgICAqIGRpZmZlcmVudCByYWRpbyBidXR0b24gaW4gdGhlIGdyb3VwLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC5kaXNhYmxlT2ZmVG9nZ2xpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmRpc2FibGVPZmZUb2dnbGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9CdXR0b25GbGFncy5Ob1RvZ2dsZVRvT2ZmLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS5cbiAgICAgKiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgcmFkaW8gYnV0dG9uLCBvbmx5IHRoYXQgc3BlY2lmaWNcbiAgICAgKiBidXR0b24gd2lsbCBiZSB0dXJuZWQgb24uIEV2ZW4gaWYgb3RoZXIgcmFkaW8gYnV0dG9ucyBpbiB0aGUgZ3JvdXBcbiAgICAgKiByZXByZXNlbnQgdGhlIHNhbWUgdmFsdWUsIHRoZXkgd2lsbCBub3QgYmUgZW5hYmxlZC4gVGhlIGFsdGVybmF0aXZlIHRvXG4gICAgICogdGhpcyBpcyB0aGF0IGNsaWNraW5nIGEgcmFkaW8gYnV0dG9uIHdpbGwgc2VsZWN0IHRoYXQgYnV0dG9uIGFsb25nIHdpdGhcbiAgICAgKiBhbnkgb3RoZXIgcmFkaW8gYnV0dG9ucyBpbiB0aGUgZ3JvdXAgdGhhdCBzaGFyZSB0aGUgc2FtZSB2YWx1ZS4gU2VlXG4gICAgICogW1tQREZSYWRpb0dyb3VwLmVuYWJsZU11dHVhbEV4Y2x1c2lvbl1dIGFuZFxuICAgICAqIFtbUERGUmFkaW9Hcm91cC5kaXNhYmxlTXV0dWFsRXhjbHVzaW9uXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIGlmIChyYWRpb0dyb3VwLmlzTXV0dWFsbHlFeGNsdXNpdmUoKSkgY29uc29sZS5sb2coJ011dHVhbCBleGNsdXNpb24gaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuaXNNdXR1YWxseUV4Y2x1c2l2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9CdXR0b25GbGFncy5SYWRpb3NJblVuaXNvbik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSB1c2VyIGNsaWNrcyBhIHJhZGlvIGJ1dHRvbiBpbiB0aGlzIGdyb3VwIGl0IHdpbGwgYmUgc2VsZWN0ZWQuIEluXG4gICAgICogYWRkaXRpb24sIGFueSBvdGhlciByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgdGhhdCBzaGFyZSB0aGUgc2FtZVxuICAgICAqIHVuZGVybHlpbmcgdmFsdWUgd2lsbCBhbHNvIGJlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC5lbmFibGVNdXR1YWxFeGNsdXNpb24oKVxuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBtdXN0IGJlIGVuYWJsZWQgcHJpb3IgdG8gYWRkaW5nIG9wdGlvbnMgdG8gdGhlXG4gICAgICogcmFkaW8gZ3JvdXAuIEl0IGRvZXMgbm90IGN1cnJlbnRseSBhcHBseSByZXRyb2FjdGl2ZWx5IHRvIGV4aXN0aW5nXG4gICAgICogcmFkaW8gYnV0dG9ucyBpbiB0aGUgZ3JvdXAuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuZW5hYmxlTXV0dWFsRXhjbHVzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0J1dHRvbkZsYWdzLlJhZGlvc0luVW5pc29uLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSB1c2VyIGNsaWNrcyBhIHJhZGlvIGJ1dHRvbiBpbiB0aGlzIGdyb3VwIG9ubHkgaXQgd2lsbCBiZSBzZWxlY3RlZC5cbiAgICAgKiBObyBvdGhlciByYWRpbyBidXR0b25zIGluIHRoZSBncm91cCB3aWxsIGJlIHNlbGVjdGVkLCBldmVuIGlmIHRoZXkgc2hhcmVcbiAgICAgKiB0aGUgc2FtZSB1bmRlcmx5aW5nIHZhbHVlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC5kaXNhYmxlTXV0dWFsRXhjbHVzaW9uKClcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gbXVzdCBiZSBkaXNhYmxlZCBwcmlvciB0byBhZGRpbmcgb3B0aW9ucyB0byB0aGVcbiAgICAgKiByYWRpbyBncm91cC4gSXQgZG9lcyBub3QgY3VycmVudGx5IGFwcGx5IHJldHJvYWN0aXZlbHkgdG8gZXhpc3RpbmdcbiAgICAgKiByYWRpbyBidXR0b25zIGluIHRoZSBncm91cC5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5kaXNhYmxlTXV0dWFsRXhjbHVzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0J1dHRvbkZsYWdzLlJhZGlvc0luVW5pc29uLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCBhIG5ldyByYWRpbyBidXR0b24gdG8gdGhpcyBncm91cCBvbiB0aGUgc3BlY2lmaWVkIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uY3JlYXRlUmFkaW9Hcm91cCgnYmVzdC5ndW5kYW0nKVxuICAgICAqXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgKiAgIHg6IDUwLFxuICAgICAqICAgd2lkdGg6IDI1LFxuICAgICAqICAgaGVpZ2h0OiAyNSxcbiAgICAgKiAgIHRleHRDb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgYmFja2dyb3VuZENvbG9yOiByZ2IoMCwgMSwgMCksXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAsIDAsIDEpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoOTApLFxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHJhZGlvR3JvdXAuYWRkT3B0aW9uVG9QYWdlKCdFeGlhJywgcGFnZSwgeyAuLi5vcHRpb25zLCB5OiA1MCB9KVxuICAgICAqIHJhZGlvR3JvdXAuYWRkT3B0aW9uVG9QYWdlKCdEeW5hbWVzJywgcGFnZSwgeyAuLi5vcHRpb25zLCB5OiAxMTAgfSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHJhZGlvIGJ1dHRvbiB3aWRnZXQgZm9yIHRoaXMgcmFkaW8gZ3JvdXAgZmllbGQuXG4gICAgICogQHBhcmFtIG9wdGlvbiBUaGUgb3B0aW9uIHRoYXQgdGhlIHJhZGlvIGJ1dHRvbiB3aWRnZXQgcmVwcmVzZW50cy5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGUgcmFkaW8gYnV0dG9uIHdpZGdldCBzaG91bGQgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGFkZGluZyB0aGUgcmFkaW8gYnV0dG9uIHdpZGdldC5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5hZGRPcHRpb25Ub1BhZ2UgPSBmdW5jdGlvbiAob3B0aW9uLCBwYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb24sICdvcHRpb24nLCBbJ3N0cmluZyddKTtcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbW1BERlBhZ2UsICdQREZQYWdlJ11dKTtcbiAgICAgICAgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGZvciB0aGlzIHJhZGlvIGJ1dHRvblxuICAgICAgICB2YXIgd2lkZ2V0ID0gdGhpcy5jcmVhdGVXaWRnZXQoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDAsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDUwLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiA1MCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogKF9lID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnRleHRDb2xvcikgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogcmdiKDAsIDAsIDApLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAoX2YgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiByZ2IoMSwgMSwgMSksXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogKF9nID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlckNvbG9yKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiByZ2IoMCwgMCwgMCksXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9oID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAxLFxuICAgICAgICAgICAgcm90YXRlOiAoX2ogPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgaGlkZGVuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB2YXIgYXBTdGF0ZVZhbHVlID0gdGhpcy5hY3JvRmllbGQuYWRkV2lkZ2V0V2l0aE9wdCh3aWRnZXRSZWYsIFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb24pLCAhdGhpcy5pc011dHVhbGx5RXhjbHVzaXZlKCkpO1xuICAgICAgICAvLyBTZXQgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciB3aWRnZXRcbiAgICAgICAgd2lkZ2V0LnNldEFwcGVhcmFuY2VTdGF0ZShQREZOYW1lLm9mKCdPZmYnKSk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGFwU3RhdGVWYWx1ZSk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIGdpdmVuIHBhZ2VcbiAgICAgICAgcGFnZS5ub2RlLmFkZEFubm90KHdpZGdldFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgb2YgdGhpcyBncm91cCdzIHJhZGlvIGJ1dHRvbiB3aWRnZXRzIGRvIG5vdCBoYXZlIGFuXG4gICAgICogYXBwZWFyYW5jZSBzdHJlYW0gZm9yIHRoZWlyIGN1cnJlbnQgc3RhdGUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiBpZiAocmFkaW9Hcm91cC5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIGNvbnNvbGUubG9nKCdOZWVkcyB1cGRhdGUnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgcmFkaW8gZ3JvdXAgbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZVN0YXRlKCk7XG4gICAgICAgICAgICB2YXIgbm9ybWFsID0gKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWw7XG4gICAgICAgICAgICBpZiAoIShub3JtYWwgaW5zdGFuY2VvZiBQREZEaWN0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSAmJiAhbm9ybWFsLmhhcyhzdGF0ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBncm91cCdzIHJhZGlvIGJ1dHRvbiB3aWRnZXRzXG4gICAgICogdXNpbmcgdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgcmFkaW8gZ3JvdXBzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVBcHBlYXJhbmNlcygpO1xuICAgIH07XG4gICAgLy8gcmcudXBkYXRlQXBwZWFyYW5jZXMoKGZpZWxkOiBhbnksIHdpZGdldDogYW55KSA9PiB7XG4gICAgLy8gICBhc3NlcnQoZmllbGQgPT09IHJnKTtcbiAgICAvLyAgIGFzc2VydCh3aWRnZXQgaW5zdGFuY2VvZiBQREZXaWRnZXRBbm5vdGF0aW9uKTtcbiAgICAvLyAgIHJldHVybiB7IG9uOiBbLi4ucmVjdGFuZ2xlLCAuLi5jaXJjbGVdLCBvZmY6IFsuLi5yZWN0YW5nbGUsIC4uLmNpcmNsZV0gfTtcbiAgICAvLyB9KTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGdyb3VwJ3MgcmFkaW8gYnV0dG9uIHdpZGdldHNcbiAgICAgKiB1c2luZyB0aGUgZ2l2ZW4gYXBwZWFyYW5jZSBwcm92aWRlci4gSWYgbm8gYHByb3ZpZGVyYCBpcyBwYXNzZWQsIHRoZVxuICAgICAqIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgcmFkaW8gZ3JvdXBzIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAudXBkYXRlQXBwZWFyYW5jZXMoKGZpZWxkLCB3aWRnZXQpID0+IHtcbiAgICAgKiAgIC4uLlxuICAgICAqICAgcmV0dXJuIHtcbiAgICAgKiAgICAgbm9ybWFsOiB7IG9uOiBkcmF3UmFkaW9CdXR0b24oLi4uKSwgb2ZmOiBkcmF3UmFkaW9CdXR0b24oLi4uKSB9LFxuICAgICAqICAgICBkb3duOiB7IG9uOiBkcmF3UmFkaW9CdXR0b24oLi4uKSwgb2ZmOiBkcmF3UmFkaW9CdXR0b24oLi4uKSB9LFxuICAgICAqICAgfVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIE9wdGlvbmFsbHksIHRoZSBhcHBlYXJhbmNlIHByb3ZpZGVyIHRvIGJlIHVzZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUudXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQocHJvdmlkZXIsICdwcm92aWRlcicsIFtGdW5jdGlvbl0pO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgb25WYWx1ZSA9IHdpZGdldC5nZXRPblZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoIW9uVmFsdWUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBvblZhbHVlLCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBvblZhbHVlLCBwcm92aWRlcikge1xuICAgICAgICB2YXIgYXBQcm92aWRlciA9IHByb3ZpZGVyICE9PSBudWxsICYmIHByb3ZpZGVyICE9PSB2b2lkIDAgPyBwcm92aWRlciA6IGRlZmF1bHRSYWRpb0dyb3VwQXBwZWFyYW5jZVByb3ZpZGVyO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZXMgPSBub3JtYWxpemVBcHBlYXJhbmNlKGFwUHJvdmlkZXIodGhpcywgd2lkZ2V0KSk7XG4gICAgICAgIHRoaXMudXBkYXRlT25PZmZXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgb25WYWx1ZSwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0T3B0aW9uTGlzdF1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGT3B0aW9uTGlzdF1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZPcHRpb25MaXN0XV0gZnJvbSBhbiBleGlzdGluZyBhY3JvUmFkaW9CdXR0b25cbiAgICAgKiBhbmQgcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb1JhZGlvQnV0dG9uIFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvUmFkaW9CdXR0b25gIGZvciB0aGlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICByYWRpbyBncm91cC5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIHJhZGlvIGdyb3VwLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgcmFkaW8gZ3JvdXAgd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5vZiA9IGZ1bmN0aW9uIChhY3JvUmFkaW9CdXR0b24sIHJlZiwgZG9jKSB7IHJldHVybiBuZXcgUERGUmFkaW9Hcm91cChhY3JvUmFkaW9CdXR0b24sIHJlZiwgZG9jKTsgfTtcbiAgICByZXR1cm4gUERGUmFkaW9Hcm91cDtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlJhZGlvR3JvdXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZSYWRpb0dyb3VwLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkZpZWxkIGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyBQREZBY3JvU2lnbmF0dXJlIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBzaWduYXR1cmUgZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERlNpZ25hdHVyZV1dIGZpZWxkcyBhcmUgZGlnaXRhbCBzaWduYXR1cmVzLiBgcGRmLWxpYmAgZG9lcyBub3RcbiAqIGN1cnJlbnRseSBwcm92aWRlIGFueSBzcGVjaWFsaXplZCBBUElzIGZvciBjcmVhdGluZyBkaWdpdGFsIHNpZ25hdHVyZXMgb3JcbiAqIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9mIGV4aXN0aW5nIGRpZ2l0YWwgc2lnbmF0dXJlcy5cbiAqL1xudmFyIFBERlNpZ25hdHVyZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGU2lnbmF0dXJlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlNpZ25hdHVyZShhY3JvU2lnbmF0dXJlLCByZWYsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBhY3JvU2lnbmF0dXJlLCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb1NpZ25hdHVyZSwgJ2Fjcm9TaWduYXR1cmUnLCBbXG4gICAgICAgICAgICBbUERGQWNyb1NpZ25hdHVyZSwgJ1BERkFjcm9TaWduYXR1cmUnXSxcbiAgICAgICAgXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9TaWduYXR1cmU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGU2lnbmF0dXJlLnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRm9ybS5nZXRTaWduYXR1cmVdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlIGFuXG4gICAgICogPiBpbnN0YW5jZSBvZiBbW1BERlNpZ25hdHVyZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZTaWduYXR1cmVdXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9TaWduYXR1cmUgYW5kXG4gICAgICogcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb1NpZ25hdHVyZSBUaGUgdW5kZXJseWluZyBgUERGQWNyb1NpZ25hdHVyZWAgZm9yIHRoaXMgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgc2lnbmF0dXJlIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERlNpZ25hdHVyZS5vZiA9IGZ1bmN0aW9uIChhY3JvU2lnbmF0dXJlLCByZWYsIGRvYykgeyByZXR1cm4gbmV3IFBERlNpZ25hdHVyZShhY3JvU2lnbmF0dXJlLCByZWYsIGRvYyk7IH07XG4gICAgcmV0dXJuIFBERlNpZ25hdHVyZTtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlNpZ25hdHVyZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlNpZ25hdHVyZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuLi9QREZQYWdlXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi4vUERGRm9udFwiO1xuaW1wb3J0IFBERkZpZWxkLCB7IGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMsIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUFwcGVhcmFuY2UsIGRlZmF1bHRUZXh0RmllbGRBcHBlYXJhbmNlUHJvdmlkZXIsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBSaWNoVGV4dEZpZWxkUmVhZEVycm9yLCBFeGNlZWRlZE1heExlbmd0aEVycm9yLCBJbnZhbGlkTWF4TGVuZ3RoRXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgSW1hZ2VBbGlnbm1lbnQgfSBmcm9tIFwiLi4vaW1hZ2UvYWxpZ25tZW50XCI7XG5pbXBvcnQgeyBUZXh0QWxpZ25tZW50IH0gZnJvbSBcIi4uL3RleHQvYWxpZ25tZW50XCI7XG5pbXBvcnQgeyBQREZIZXhTdHJpbmcsIFBERlN0cmVhbSwgUERGQWNyb1RleHQsIEFjcm9UZXh0RmxhZ3MsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRJc09uZU9mLCBhc3NlcnRPclVuZGVmaW5lZCwgYXNzZXJ0UG9zaXRpdmUsIGFzc2VydFJhbmdlT3JVbmRlZmluZWQsIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSB0ZXh0IGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZUZXh0RmllbGRdXSBmaWVsZHMgYXJlIGJveGVzIHRoYXQgZGlzcGxheSB0ZXh0IGVudGVyZWQgYnkgdGhlIHVzZXIuIFRoZVxuICogcHVycG9zZSBvZiBhIHRleHQgZmllbGQgaXMgdG8gZW5hYmxlIHVzZXJzIHRvIGVudGVyIHRleHQgb3IgdmlldyB0ZXh0IHZhbHVlc1xuICogaW4gdGhlIGRvY3VtZW50IHByZWZpbGxlZCBieSBzb2Z0d2FyZS4gVXNlcnMgY2FuIGNsaWNrIG9uIGEgdGV4dCBmaWVsZCBhbmRcbiAqIGlucHV0IHRleHQgdmlhIHRoZWlyIGtleWJvYXJkLiBTb21lIHRleHQgZmllbGRzIGFsbG93IG11bHRpcGxlIGxpbmVzIG9mIHRleHRcbiAqIHRvIGJlIGVudGVyZWQgKHNlZSBbW1BERlRleHRGaWVsZC5pc011bHRpbGluZV1dKS5cbiAqL1xudmFyIFBERlRleHRGaWVsZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGVGV4dEZpZWxkLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlRleHRGaWVsZChhY3JvVGV4dCwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb1RleHQsIHJlZiwgZG9jKSB8fCB0aGlzO1xuICAgICAgICBhc3NlcnRJcyhhY3JvVGV4dCwgJ2Fjcm9UZXh0JywgW1tQREZBY3JvVGV4dCwgJ1BERkFjcm9UZXh0J11dKTtcbiAgICAgICAgX3RoaXMuYWNyb0ZpZWxkID0gYWNyb1RleHQ7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB0ZXh0IHRoYXQgdGhpcyBmaWVsZCBjb250YWlucy4gVGhpcyB0ZXh0IGlzIHZpc2libGUgdG8gdXNlcnMgd2hvXG4gICAgICogdmlldyB0aGlzIGZpZWxkIGluIGEgUERGIHJlYWRlci5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogY29uc3QgdGV4dCA9IHRleHRGaWVsZC5nZXRUZXh0KClcbiAgICAgKiBjb25zb2xlLmxvZygnVGV4dCBmaWVsZCBjb250ZW50czonLCB0ZXh0KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IGlmIHRoaXMgdGV4dCBmaWVsZCBjb250YWlucyBubyB1bmRlcmx5aW5nIHZhbHVlLCBgdW5kZWZpbmVkYFxuICAgICAqIHdpbGwgYmUgcmV0dXJuZWQuIFRleHQgZmllbGRzIG1heSBhbHNvIGNvbnRhaW4gYW4gdW5kZXJseWluZyB2YWx1ZSB0aGF0XG4gICAgICogaXMgc2ltcGx5IGFuIGVtcHR5IHN0cmluZyAoYCcnYCkuIFRoaXMgZGV0YWlsIGlzIGxhcmdlbHkgaXJyZWxldmFudCBmb3JcbiAgICAgKiBtb3N0IGFwcGxpY2F0aW9ucy4gSW4gZ2VuZXJhbCwgeW91J2xsIHdhbnQgdG8gdHJlYXQgYm90aCBjYXNlcyB0aGUgc2FtZVxuICAgICAqIHdheSBhbmQgc2ltcGx5IGNvbnNpZGVyIHRoZSB0ZXh0IGZpZWxkIHRvIGJlIGVtcHR5LiBJbiBlaXRoZXIgY2FzZSwgdGhlXG4gICAgICogdGV4dCBmaWVsZCB3aWxsIGFwcGVhciBlbXB0eSB0byB1c2VycyB3aGVuIHZpZXdlZCBpbiBhIFBERiByZWFkZXIuXG4gICAgICpcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiB0aGlzIGlzIGEgcmljaCB0ZXh0IGZpZWxkLiBgcGRmLWxpYmAgZG9lcyBub3RcbiAgICAgKiBzdXBwb3J0IHJlYWRpbmcgcmljaCB0ZXh0IGZpZWxkcy4gTm9yIGRvIG1vc3QgUERGIHJlYWRlcnMgYW5kIHdyaXRlcnMuXG4gICAgICogUmljaCB0ZXh0IGZpZWxkcyBhcmUgYmFzZWQgb24gWEZBIChYTUwgRm9ybXMgQXJjaGl0ZWN0dXJlKS4gUmVsYXRpdmVseSBmZXdcbiAgICAgKiBQREZzIHVzZSByaWNoIHRleHQgZmllbGRzIG9yIFhGQS4gVW5saWtlIFBERiBpdHNlbGYsIFhGQSBpcyBub3QgYW4gSVNPXG4gICAgICogc3RhbmRhcmQuIFhGQSBoYXMgYmVlbiBkZXByZWNhdGVkIGluIFBERiAyLjA6XG4gICAgICogKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9YRkFcbiAgICAgKiAqIGh0dHA6Ly9ibG9nLnBkZnNoYXJlZm9ybXMuY29tL3BkZi0yLTAtcmVsZWFzZS1iaWQtZmFyZXdlbGwteGZhLWZvcm1zL1xuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHRleHQgY29udGFpbmVkIGluIHRoaXMgdGV4dCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmdldFRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlKCk7XG4gICAgICAgIGlmICghdmFsdWUgJiYgdGhpcy5pc1JpY2hGb3JtYXR0ZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJpY2hUZXh0RmllbGRSZWFkRXJyb3IodGhpcy5nZXROYW1lKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmFsdWUuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB0ZXh0IGZvciB0aGlzIGZpZWxkLiBUaGlzIG9wZXJhdGlvbiBpcyBhbmFsb2dvdXMgdG8gYSBodW1hbiB1c2VyXG4gICAgICogY2xpY2tpbmcgb24gdGhlIHRleHQgZmllbGQgaW4gYSBQREYgcmVhZGVyIGFuZCB0eXBpbmcgaW4gdGV4dCB2aWEgdGhlaXJcbiAgICAgKiBrZXlib2FyZC4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlIHRleHQgZmllbGRcbiAgICAgKiB0byBpbmRpY2F0ZSB3aGF0IHRleHQgaGFzIGJlZW4gc2V0LiBQREYgbGlicmFyaWVzIGFuZCByZWFkZXJzIHdpbGwgYmUgYWJsZVxuICAgICAqIHRvIGV4dHJhY3QgdGhlc2UgdmFsdWVzIGZyb20gdGhlIHNhdmVkIGRvY3VtZW50IGFuZCBkZXRlcm1pbmUgd2hhdCB0ZXh0XG4gICAgICogd2FzIHNldC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ2Jlc3Quc3VwZXJoZXJvLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5zZXRUZXh0KCdPbmUgUHVuY2ggTWFuJylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHksIGNhdXNpbmcgaXRzIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHRvIGJlIHVwZGF0ZWQgd2hlbiBlaXRoZXIgW1tQREZEb2N1bWVudC5zYXZlXV0gb3JcbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIGlzIGNhbGxlZC4gVGhlIHVwZGF0ZWQgc3RyZWFtcyB3aWxsXG4gICAgICogZGlzcGxheSB0aGUgdGV4dCB0aGlzIGZpZWxkIGNvbnRhaW5zIGluc2lkZSB0aGUgd2lkZ2V0cyBvZiB0aGlzIHRleHRcbiAgICAgKiBmaWVsZC5cbiAgICAgKlxuICAgICAqICoqSU1QT1JUQU5UOioqIFRoZSBkZWZhdWx0IGZvbnQgdXNlZCB0byB1cGRhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIGlzXG4gICAgICogW1tTdGFuZGFyZEZvbnRzLkhlbHZldGljYV1dLiBOb3RlIHRoYXQgdGhpcyBpcyBhIFdpbkFuc2kgZm9udC4gVGhpcyBtZWFuc1xuICAgICAqIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHdpbGwgYmUgdGhyb3duIGlmIHRoaXMgZmllbGQgY29udGFpbnMgdGV4dCBvdXRzaWRlXG4gICAgICogdGhlIFdpbkFuc2kgY2hhcmFjdGVyIHNldCAodGhlIGxhdGluIGFscGhhYmV0KS5cbiAgICAgKlxuICAgICAqIEVtYmVkZGluZyBhIGN1c3RvbSBmb250IGFuZCBwYXNzaW5nIGl0IHRvXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBvciBbW1BERlRleHRGaWVsZC51cGRhdGVBcHBlYXJhbmNlc11dXG4gICAgICogYWxsb3dzIHlvdSB0byBnZW5lcmF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgd2l0aCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlXG4gICAgICogbGF0aW4gYWxwaGFiZXQgKGFzc3VtaW5nIHRoZSBjdXN0b20gZm9udCBzdXBwb3J0cyB0aGVtKS5cbiAgICAgKlxuICAgICAqIElmIHRoaXMgaXMgYSByaWNoIHRleHQgZmllbGQsIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3RhbmRhcmQgdGV4dFxuICAgICAqIGZpZWxkIGluIG9yZGVyIHRvIHNldCB0aGUgdGV4dC4gYHBkZi1saWJgIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyByaWNoXG4gICAgICogdGV4dCBzdHJpbmdzLiBOb3IgZG8gbW9zdCBQREYgcmVhZGVycyBhbmQgd3JpdGVycy4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuZ2V0VGV4dF1dIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHJpY2ggdGV4dCBmaWVsZHMgYW5kXG4gICAgICogdGhlaXIgZGVwcmVjYXRpb24gaW4gUERGIDIuMC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRoaXMgZmllbGQgc2hvdWxkIGNvbnRhaW4uXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5zZXRUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQodGV4dCwgJ3RleHQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG1heExlbmd0aCA9IHRoaXMuZ2V0TWF4TGVuZ3RoKCk7XG4gICAgICAgIGlmIChtYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJiB0ZXh0ICYmIHRleHQubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZWVkZWRNYXhMZW5ndGhFcnJvcih0ZXh0Lmxlbmd0aCwgbWF4TGVuZ3RoLCB0aGlzLmdldE5hbWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmRpc2FibGVSaWNoRm9ybWF0dGluZygpO1xuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWUoUERGSGV4U3RyaW5nLmZyb21UZXh0KHRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZVZhbHVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYWxpZ25tZW50IGZvciB0aGlzIHRleHQgZmllbGQuIFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGVcbiAgICAgKiBqdXN0aWZpY2F0aW9uIG9mIHRoZSB0ZXh0IHdoZW4gaXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGluIFBERiByZWFkZXJzLlxuICAgICAqIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBhbGlnbm1lbnRzOiBsZWZ0LCBjZW50ZXIsIGFuZCByaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBjb25zdCBhbGlnbm1lbnQgPSB0ZXh0RmllbGQuZ2V0QWxpZ25tZW50KClcbiAgICAgKiBpZiAoYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LkxlZnQpIGNvbnNvbGUubG9nKCdUZXh0IGlzIGxlZnQganVzdGlmaWVkJylcbiAgICAgKiBpZiAoYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LkNlbnRlcikgY29uc29sZS5sb2coJ1RleHQgaXMgY2VudGVyZWQnKVxuICAgICAqIGlmIChhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuUmlnaHQpIGNvbnNvbGUubG9nKCdUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIGFsaWdubWVudCBvZiB0aGlzIHRleHQgZmllbGQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5nZXRBbGlnbm1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBxdWFkZGluZyA9IHRoaXMuYWNyb0ZpZWxkLmdldFF1YWRkaW5nKCk7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICByZXR1cm4gKHF1YWRkaW5nID09PSAwID8gVGV4dEFsaWdubWVudC5MZWZ0XG4gICAgICAgICAgICA6IHF1YWRkaW5nID09PSAxID8gVGV4dEFsaWdubWVudC5DZW50ZXJcbiAgICAgICAgICAgICAgICA6IHF1YWRkaW5nID09PSAyID8gVGV4dEFsaWdubWVudC5SaWdodFxuICAgICAgICAgICAgICAgICAgICA6IFRleHRBbGlnbm1lbnQuTGVmdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGFsaWdubWVudCBmb3IgdGhpcyB0ZXh0IGZpZWxkLiBUaGlzIHdpbGwgZGV0ZXJtaW5lIHRoZVxuICAgICAqIGp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQgd2hlbiBpdCBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgaW4gUERGIHJlYWRlcnMuXG4gICAgICogVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGFsaWdubWVudHM6IGxlZnQsIGNlbnRlciwgYW5kIHJpZ2h0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqXG4gICAgICogLy8gVGV4dCB3aWxsIGJlIGxlZnQganVzdGlmaWVkIHdoZW4gZGlzcGxheWVkXG4gICAgICogdGV4dEZpZWxkLnNldEFsaWdubWVudChUZXh0QWxpZ25tZW50LkxlZnQpXG4gICAgICpcbiAgICAgKiAvLyBUZXh0IHdpbGwgYmUgY2VudGVyZWQgd2hlbiBkaXNwbGF5ZWRcbiAgICAgKiB0ZXh0RmllbGQuc2V0QWxpZ25tZW50KFRleHRBbGlnbm1lbnQuQ2VudGVyKVxuICAgICAqXG4gICAgICogLy8gVGV4dCB3aWxsIGJlIHJpZ2h0IGp1c3RpZmllZCB3aGVuIGRpc3BsYXllZFxuICAgICAqIHRleHRGaWVsZC5zZXRBbGlnbm1lbnQoVGV4dEFsaWdubWVudC5SaWdodClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICogQHBhcmFtIGFsaWdubWVudCBUaGUgYWxpZ25tZW50IGZvciB0aGlzIHRleHQgZmllbGQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5zZXRBbGlnbm1lbnQgPSBmdW5jdGlvbiAoYWxpZ25tZW50KSB7XG4gICAgICAgIGFzc2VydElzT25lT2YoYWxpZ25tZW50LCAnYWxpZ25tZW50JywgVGV4dEFsaWdubWVudCk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0UXVhZGRpbmcoYWxpZ25tZW50KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZC4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZSBtYXhpbXVtXG4gICAgICogbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgdHlwZWQgaW50byB0aGlzIGZpZWxkIGJ5IHRoZSB1c2VyLiBJZlxuICAgICAqIHRoaXMgZmllbGQgZG9lcyBub3QgaGF2ZSBhIG1heGltdW0gbGVuZ3RoLCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGNvbnN0IG1heExlbmd0aCA9IHRleHRGaWVsZC5nZXRNYXhMZW5ndGgoKVxuICAgICAqIGlmIChtYXhMZW5ndGggPT09IHVuZGVmaW5lZCkgY29uc29sZS5sb2coJ05vIG1heCBsZW5ndGgnKVxuICAgICAqIGVsc2UgY29uc29sZS5sb2coYE1heCBsZW5ndGggaXMgJHttYXhMZW5ndGh9YClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbGxvd2VkIGluIHRoaXMgZmllbGQsIG9yXG4gICAgICogICAgICAgICAgYHVuZGVmaW5lZGAgaWYgbm8gbGltaXQgZXhpc3RzLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZ2V0TWF4TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuZ2V0TWF4TGVuZ3RoKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQuIFRoaXMgbGltaXRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVyc1xuICAgICAqIHRoYXQgY2FuIGJlIHR5cGVkIGludG8gdGhpcyBmaWVsZCBieSB0aGUgdXNlci4gVGhpcyBhbHNvIGxpbWl0cyB0aGUgbGVuZ3RoXG4gICAgICogb2YgdGhlIHN0cmluZyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dLiBUaGlzIGxpbWl0XG4gICAgICogY2FuIGJlIHJlbW92ZWQgYnkgcGFzc2luZyBgdW5kZWZpbmVkYCBhcyBgbWF4TGVuZ3RoYC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKlxuICAgICAqIC8vIEFsbG93IGJldHdlZW4gMCBhbmQgNSBjaGFyYWN0ZXJzIHRvIGJlIGVudGVyZWRcbiAgICAgKiB0ZXh0RmllbGQuc2V0TWF4TGVuZ3RoKDUpXG4gICAgICpcbiAgICAgKiAvLyBBbGxvdyBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgZW50ZXJlZFxuICAgICAqIHRleHRGaWVsZC5zZXRNYXhMZW5ndGgodW5kZWZpbmVkKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKiBAcGFyYW0gbWF4TGVuZ3RoIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhpcyBmaWVsZCwgb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgIGB1bmRlZmluZWRgIHRvIHJlbW92ZSB0aGUgbGltaXQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5zZXRNYXhMZW5ndGggPSBmdW5jdGlvbiAobWF4TGVuZ3RoKSB7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQobWF4TGVuZ3RoLCAnbWF4TGVuZ3RoJywgMCwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlTWF4TGVuZ3RoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGV4dCA9IHRoaXMuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE1heExlbmd0aEVycm9yKHRleHQubGVuZ3RoLCBtYXhMZW5ndGgsIHRoaXMuZ2V0TmFtZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldE1heExlbmd0aChtYXhMZW5ndGgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIG1heGltdW0gbGVuZ3RoIGZvciB0aGlzIHRleHQgZmllbGQuIFRoaXMgYWxsb3dzIGFueSBudW1iZXIgb2ZcbiAgICAgKiBjaGFyYWN0ZXJzIHRvIGJlIHR5cGVkIGludG8gdGhpcyBmaWVsZCBieSB0aGUgdXNlci4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQucmVtb3ZlTWF4TGVuZ3RoKClcbiAgICAgKiBgYGBcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBgdW5kZWZpbmVkYCB0b1xuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldE1heExlbmd0aF1dLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUucmVtb3ZlTWF4TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZU1heExlbmd0aCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzcGxheSBhbiBpbWFnZSBpbnNpZGUgdGhlIGJvdW5kcyBvZiB0aGlzIHRleHQgZmllbGQncyB3aWRnZXRzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBuZ0ltYWdlID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKC4uLilcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuc2V0SW1hZ2UocG5nSW1hZ2UpXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIHVwZGF0ZSB0aGUgYXBwZWFyYW5jZXMgc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIHRleHQgZmllbGQncyB3aWRnZXRzLlxuICAgICAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuc2V0SW1hZ2UgPSBmdW5jdGlvbiAoaW1hZ2UpIHtcbiAgICAgICAgdmFyIGZpZWxkQWxpZ25tZW50ID0gdGhpcy5nZXRBbGlnbm1lbnQoKTtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHZhciBhbGlnbm1lbnQgPSBmaWVsZEFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5DZW50ZXIgPyBJbWFnZUFsaWdubWVudC5DZW50ZXJcbiAgICAgICAgICAgIDogZmllbGRBbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuUmlnaHQgPyBJbWFnZUFsaWdubWVudC5SaWdodFxuICAgICAgICAgICAgICAgIDogSW1hZ2VBbGlnbm1lbnQuTGVmdDtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN0cmVhbVJlZiA9IHRoaXMuY3JlYXRlSW1hZ2VBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgaW1hZ2UsIGFsaWdubWVudCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VzKHdpZGdldCwgeyBub3JtYWw6IHN0cmVhbVJlZiB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZvbnQgc2l6ZSBmb3IgdGhpcyBmaWVsZC4gTGFyZ2VyIGZvbnQgc2l6ZXMgd2lsbCByZXN1bHQgaW4gbGFyZ2VyXG4gICAgICogdGV4dCBiZWluZyBkaXNwbGF5ZWQgd2hlbiBQREYgcmVhZGVycyByZW5kZXIgdGhpcyB0ZXh0IGZpZWxkLiBGb250IHNpemVzXG4gICAgICogbWF5IGJlIGludGVnZXIgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gU3VwcGx5aW5nIGEgbmVnYXRpdmUgZm9udCBzaXplXG4gICAgICogd2lsbCBjYXVzZSB0aGlzIG1ldGhvZCB0byB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLnNldEZvbnRTaXplKDQpXG4gICAgICogdGV4dEZpZWxkLnNldEZvbnRTaXplKDE1LjcpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA+IFRoaXMgbWV0aG9kIGRlcGVuZHMgdXBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBhcHBlYXJhbmNlXG4gICAgICogPiAoYC9EQWApIHN0cmluZy4gSWYgdGhpcyBmaWVsZCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBhcHBlYXJhbmNlIHN0cmluZyxcbiAgICAgKiA+IG9yIHRoYXQgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYSBmb250IHNpemUgKHZpYSB0aGUgYFRmYCBvcGVyYXRvciksXG4gICAgICogPiB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9udFNpemUgVGhlIGZvbnQgc2l6ZSB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRleHQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnNldEZvbnRTaXplID0gZnVuY3Rpb24gKGZvbnRTaXplKSB7XG4gICAgICAgIGFzc2VydFBvc2l0aXZlKGZvbnRTaXplLCAnZm9udFNpemUnKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBlYWNoIGxpbmUgb2YgdGV4dCBpcyBzaG93biBvbiBhIG5ldyBsaW5lIHdoZW4gdGhpc1xuICAgICAqIGZpZWxkIGlzIGRpc3BsYXllZCBpbiBhIFBERiByZWFkZXIuIFRoZSBhbHRlcm5hdGl2ZSBpcyB0aGF0IGFsbCBsaW5lcyBvZlxuICAgICAqIHRleHQgYXJlIG1lcmdlZCBvbnRvIGEgc2luZ2xlIGxpbmUgd2hlbiBkaXNwbGF5ZWQuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLmVuYWJsZU11bHRpbGluZV1dIGFuZCBbW1BERlRleHRGaWVsZC5kaXNhYmxlTXVsdGlsaW5lXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzTXVsdGlsaW5lKCkpIGNvbnNvbGUubG9nKCdNdWx0aWxpbmUgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBpcyBhIG11bHRpbGluZSB0ZXh0IGZpZWxkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNNdWx0aWxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9UZXh0RmxhZ3MuTXVsdGlsaW5lKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc3BsYXkgZWFjaCBsaW5lIG9mIHRleHQgb24gYSBuZXcgbGluZSB3aGVuIHRoaXMgZmllbGQgaXMgZGlzcGxheWVkIGluIGFcbiAgICAgKiBQREYgcmVhZGVyLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5lbmFibGVNdWx0aWxpbmUoKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZU11bHRpbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5NdWx0aWxpbmUsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzcGxheSBlYWNoIGxpbmUgb2YgdGV4dCBvbiB0aGUgc2FtZSBsaW5lIHdoZW4gdGhpcyBmaWVsZCBpcyBkaXNwbGF5ZWRcbiAgICAgKiBpbiBhIFBERiByZWFkZXIuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVNdWx0aWxpbmUoKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVNdWx0aWxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuTXVsdGlsaW5lLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIGEgcGFzc3dvcmQgdGV4dCBmaWVsZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBmaWVsZFxuICAgICAqIGlzIGludGVuZGVkIGZvciBzdG9yaW5nIGEgc2VjdXJlIHBhc3N3b3JkLiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5lbmFibGVQYXNzd29yZF1dIGFuZCBbW1BERlRleHRGaWVsZC5kaXNhYmxlUGFzc3dvcmRdXS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQuaXNQYXNzd29yZCgpKSBjb25zb2xlLmxvZygnUGFzc3dvcmQgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBpcyBhIHBhc3N3b3JkIHRleHQgZmllbGQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc1Bhc3N3b3JkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLlBhc3N3b3JkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyB0ZXh0IGZpZWxkIGlzIGludGVuZGVkIGZvciBzdG9yaW5nIGEgc2VjdXJlIHBhc3N3b3JkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZVBhc3N3b3JkKClcbiAgICAgKiBgYGBcbiAgICAgKiBWYWx1ZXMgZW50ZXJlZCBpbnRvIHBhc3N3b3JkIHRleHQgZmllbGRzIHNob3VsZCBub3QgYmUgZGlzcGxheWVkIG9uIHRoZVxuICAgICAqIHNjcmVlbiBieSBQREYgcmVhZGVycy4gTW9zdCBQREYgcmVhZGVycyB3aWxsIGRpc3BsYXkgdGhlIHZhbHVlIGFzXG4gICAgICogYXN0ZXJpc2tzIG9yIGJ1bGxldHMuIFBERiByZWFkZXJzIHNob3VsZCBuZXZlciBzdG9yZSB2YWx1ZXMgZW50ZXJlZCBieSB0aGVcbiAgICAgKiB1c2VyIGludG8gcGFzc3dvcmQgdGV4dCBmaWVsZHMuIFNpbWlsYXJseSwgYXBwbGljYXRpb25zIHNob3VsZCBub3RcbiAgICAgKiB3cml0ZSBkYXRhIHRvIGEgcGFzc3dvcmQgdGV4dCBmaWVsZC5cbiAgICAgKlxuICAgICAqICoqUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBjYXVzZSBlbnRlcmVkIHZhbHVlcyB0byBiZVxuICAgICAqIGVuY3J5cHRlZCBvciBzZWN1cmVkIGluIGFueSB3YXkhIEl0IHNpbXBseSBzZXRzIGEgZmxhZyB0aGF0IFBERiBzb2Z0d2FyZVxuICAgICAqIGFuZCByZWFkZXJzIGNhbiBhY2Nlc3MgdG8gZGV0ZXJtaW5lIHRoZSBfcHVycG9zZV8gb2YgdGhpcyBmaWVsZC4qKlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZW5hYmxlUGFzc3dvcmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLlBhc3N3b3JkLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyB0ZXh0IGZpZWxkIGlzICoqbm90KiogaW50ZW5kZWQgZm9yIHN0b3JpbmcgYSBzZWN1cmVcbiAgICAgKiBwYXNzd29yZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGlzYWJsZVBhc3N3b3JkKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVQYXNzd29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuUGFzc3dvcmQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIHRleHQgZmllbGQgcmVwcmVzZW50IGEgZmlsZSBwYXRoLlxuICAgICAqIFNlZSBbW1BERlRleHRGaWVsZC5lbmFibGVGaWxlU2VsZWN0aW9uXV0gYW5kXG4gICAgICogW1tQREZUZXh0RmllbGQuZGlzYWJsZUZpbGVTZWxlY3Rpb25dXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzRmlsZVNlbGVjdG9yKCkpIGNvbnNvbGUubG9nKCdJcyBhIGZpbGUgc2VsZWN0b3InKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgc2hvdWxkIGNvbnRhaW4gZmlsZSBwYXRocy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmlzRmlsZVNlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLkZpbGVTZWxlY3QpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIHRleHQgZmllbGQgaXMgaW50ZW5kZWQgdG8gc3RvcmUgYSBmaWxlIHBhdGguIFRoZVxuICAgICAqIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHN0b3JlZCBhdCB0aGF0IHBhdGggc2hvdWxkIGJlIHN1Ym1pdHRlZCBhcyB0aGUgdmFsdWVcbiAgICAgKiBvZiB0aGUgZmllbGQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZUZpbGVTZWxlY3Rpb24oKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZW5hYmxlRmlsZVNlbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuRmlsZVNlbGVjdCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgdGV4dCBmaWVsZCBpcyAqKm5vdCoqIGludGVuZGVkIHRvIHN0b3JlIGEgZmlsZSBwYXRoLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVGaWxlU2VsZWN0aW9uKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVGaWxlU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5GaWxlU2VsZWN0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdGV4dCBlbnRlcmVkIGluIHRoaXMgZmllbGQgc2hvdWxkIGJlIHNwZWxsIGNoZWNrZWRcbiAgICAgKiBieSBQREYgcmVhZGVycy4gU2VlIFtbUERGVGV4dEZpZWxkLmVuYWJsZVNwZWxsQ2hlY2tpbmddXSBhbmRcbiAgICAgKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlU3BlbGxDaGVja2luZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQuaXNTcGVsbENoZWNrZWQoKSkgY29uc29sZS5sb2coJ1NwZWxsIGNoZWNraW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgc2hvdWxkIGJlIHNwZWxsIGNoZWNrZWQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc1NwZWxsQ2hlY2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9UZXh0RmxhZ3MuRG9Ob3RTcGVsbENoZWNrKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IFBERiByZWFkZXJzIHRvIHNwZWxsIGNoZWNrIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5lbmFibGVTcGVsbENoZWNraW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZVNwZWxsQ2hlY2tpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkRvTm90U3BlbGxDaGVjaywgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IFBERiByZWFkZXJzIHRvIHNwZWxsIGNoZWNrIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlU3BlbGxDaGVja2luZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlU3BlbGxDaGVja2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuRG9Ob3RTcGVsbENoZWNrLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCBhbGxvdyB0aGUgdXNlciB0byBzY3JvbGwgdGhlIHRleHRcbiAgICAgKiBmaWVsZCB3aGVuIGl0cyBjb250ZW50cyBkbyBub3QgZml0IHdpdGhpbiB0aGUgZmllbGQncyB2aWV3IGJvdW5kcy4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuZW5hYmxlU2Nyb2xsaW5nXV0gYW5kIFtbUERGVGV4dEZpZWxkLmRpc2FibGVTY3JvbGxpbmddXS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQuaXNTY3JvbGxhYmxlKCkpIGNvbnNvbGUubG9nKCdTY3JvbGxpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGZpZWxkIGlzIHNjcm9sbGFibGUgaW4gUERGIHJlYWRlcnMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc1Njcm9sbGFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLkRvTm90U2Nyb2xsKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IFBERiByZWFkZXJzIHRvIHByZXNlbnQgYSBzY3JvbGwgYmFyIHRvIHRoZSB1c2VyIHdoZW4gdGhlIGNvbnRlbnRzXG4gICAgICogb2YgdGhpcyB0ZXh0IGZpZWxkIGRvIG5vdCBmaXQgd2l0aGluIGl0cyB2aWV3IGJvdW5kcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlU2Nyb2xsaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKiBBIGhvcml6b250YWwgc2Nyb2xsIGJhciBzaG91bGQgYmUgc2hvd24gZm9yIHNpbmdsZWxpbmUgZmllbGRzLiBBIHZlcnRpY2FsXG4gICAgICogc2Nyb2xsIGJhciBzaG91bGQgYmUgc2hvd24gZm9yIG11bHRpbGluZSBmaWVsZHMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVTY3JvbGxpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkRvTm90U2Nyb2xsLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgYWxsb3cgUERGIHJlYWRlcnMgdG8gcHJlc2VudCBhIHNjcm9sbCBiYXIgdG8gdGhlIHVzZXIgd2hlbiB0aGVcbiAgICAgKiBjb250ZW50cyBvZiB0aGlzIHRleHQgZmllbGQgZG8gbm90IGZpdCB3aXRoaW4gaXRzIHZpZXcgYm91bmRzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlU2Nyb2xsaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVTY3JvbGxpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkRvTm90U2Nyb2xsLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgaXMgYSBjb21iZWQgdGV4dCBmaWVsZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBmaWVsZFxuICAgICAqIGlzIHNwbGl0IGludG8gYG5gIGVxdWFsIHNpemUgY2VsbHMgd2l0aCBvbmUgY2hhcmFjdGVyIGluIGVhY2ggKHdoZXJlIGBuYFxuICAgICAqIGlzIGVxdWFsIHRvIHRoZSBtYXggbGVuZ3RoIG9mIHRoZSB0ZXh0IGZpZWxkKS4gVGhlIHJlc3VsdCBpcyB0aGF0IGFsbFxuICAgICAqIGNoYXJhY3RlcnMgaW4gdGhpcyBmaWVsZCBhcmUgZGlzcGxheWVkIGFuIGVxdWFsIGRpc3RhbmNlIGFwYXJ0IGZyb20gb25lXG4gICAgICogYW5vdGhlci4gU2VlIFtbUERGVGV4dEZpZWxkLmVuYWJsZUNvbWJpbmddXSBhbmRcbiAgICAgKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlQ29tYmluZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQuaXNDb21iZWQoKSkgY29uc29sZS5sb2coJ0NvbWJpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogTm90ZSB0aGF0IGluIG9yZGVyIGZvciBhIHRleHQgZmllbGQgdG8gYmUgY29tYmVkLCB0aGUgZm9sbG93aW5nIG11c3QgYmVcbiAgICAgKiB0cnVlIChpbiBhZGRpdGlvbiB0byBlbmFibGluZyBjb21iaW5nKTpcbiAgICAgKiAqIEl0IG11c3Qgbm90IGJlIGEgbXVsdGlsaW5lIGZpZWxkIChzZWUgW1tQREZUZXh0RmllbGQuaXNNdWx0aWxpbmVdXSlcbiAgICAgKiAqIEl0IG11c3Qgbm90IGJlIGEgcGFzc3dvcmQgZmllbGQgKHNlZSBbW1BERlRleHRGaWVsZC5pc1Bhc3N3b3JkXV0pXG4gICAgICogKiBJdCBtdXN0IG5vdCBiZSBhIGZpbGUgc2VsZWN0b3IgZmllbGQgKHNlZSBbW1BERlRleHRGaWVsZC5pc0ZpbGVTZWxlY3Rvcl1dKVxuICAgICAqICogSXQgbXVzdCBoYXZlIGEgbWF4IGxlbmd0aCBkZWZpbmVkIChzZWUgW1tQREZUZXh0RmllbGQuc2V0TWF4TGVuZ3RoXV0pXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBmaWVsZCBpcyBjb21iZWQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc0NvbWJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9UZXh0RmxhZ3MuQ29tYikgJiZcbiAgICAgICAgICAgICF0aGlzLmlzTXVsdGlsaW5lKCkgJiZcbiAgICAgICAgICAgICF0aGlzLmlzUGFzc3dvcmQoKSAmJlxuICAgICAgICAgICAgIXRoaXMuaXNGaWxlU2VsZWN0b3IoKSAmJlxuICAgICAgICAgICAgdGhpcy5nZXRNYXhMZW5ndGgoKSAhPT0gdW5kZWZpbmVkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNwbGl0IHRoaXMgZmllbGQgaW50byBgbmAgZXF1YWwgc2l6ZSBjZWxscyB3aXRoIG9uZSBjaGFyYWN0ZXIgaW4gZWFjaFxuICAgICAqICh3aGVyZSBgbmAgaXMgZXF1YWwgdG8gdGhlIG1heCBsZW5ndGggb2YgdGhlIHRleHQgZmllbGQpLiBUaGlzIHdpbGwgY2F1c2VcbiAgICAgKiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgZmllbGQgdG8gYmUgZGlzcGxheWVkIGFuIGVxdWFsIGRpc3RhbmNlIGFwYXJ0IGZyb21cbiAgICAgKiBvbmUgYW5vdGhlci4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlQ29tYmluZygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiBhZGRpdGlvbiB0byBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0ZXh0IGZpZWxkcyBtdXN0IGhhdmUgYSBtYXggbGVuZ3RoXG4gICAgICogZGVmaW5lZCBpbiBvcmRlciB0byBiZSBjb21iZWQgKHNlZSBbW1BERlRleHRGaWVsZC5zZXRNYXhMZW5ndGhdXSkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gY2FsbCB0aGUgZm9sbG93aW5nIHRocmVlIG1ldGhvZHMgaW50ZXJuYWxseTpcbiAgICAgKiAqIFtbUERGVGV4dEZpZWxkLmRpc2FibGVNdWx0aWxpbmVdXVxuICAgICAqICogW1tQREZUZXh0RmllbGQuZGlzYWJsZVBhc3N3b3JkXV1cbiAgICAgKiAqIFtbUERGVGV4dEZpZWxkLmRpc2FibGVGaWxlU2VsZWN0aW9uXV1cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZUNvbWJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmdldE1heExlbmd0aCgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBtc2cgPSBcIlBERlRleHRGaWVsZHMgbXVzdCBoYXZlIGEgbWF4IGxlbmd0aCBpbiBvcmRlciB0byBiZSBjb21iZWRcIjtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlsaW5lKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVBhc3N3b3JkKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZUZpbGVTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuQ29tYiwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUdXJuIG9mZiBjb21iaW5nIGZvciB0aGlzIHRleHQgZmllbGQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVDb21iaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKiBTZWUgW1tQREZUZXh0RmllbGQuaXNDb21iZWRdXSBhbmQgW1tQREZUZXh0RmllbGQuZW5hYmxlQ29tYmluZ11dIGZvciBtb3JlXG4gICAgICogaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBjb21iaW5nIGlzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgdGV4dCBmaWVsZCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGlzYWJsZUNvbWJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuQ29tYiwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyB0ZXh0IGZpZWxkIGNvbnRhaW5zIHJpY2ggdGV4dC4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuZW5hYmxlUmljaEZvcm1hdHRpbmddXSBhbmRcbiAgICAgKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlUmljaEZvcm1hdHRpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzUmljaEZvcm1hdHRlZCgpKSBjb25zb2xlLmxvZygnUmljaCBmb3JtYXR0aW5nIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgY29udGFpbnMgcmljaCB0ZXh0LlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNSaWNoRm9ybWF0dGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLlJpY2hUZXh0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBmaWVsZCBjb250YWlucyBYRkEgZGF0YSAtIG9yIHJpY2ggdGV4dC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlUmljaEZvcm1hdHRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCBgcGRmLWxpYmAgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIG9yIHdyaXRpbmcgcmljaCB0ZXh0IGZpZWxkcy5cbiAgICAgKiBOb3IgZG8gbW9zdCBQREYgcmVhZGVycyBhbmQgd3JpdGVycy4gUmljaCB0ZXh0IGZpZWxkcyBhcmUgYmFzZWQgb24gWEZBXG4gICAgICogKFhNTCBGb3JtcyBBcmNoaXRlY3R1cmUpLiBSZWxhdGl2ZWx5IGZldyBQREZzIHVzZSByaWNoIHRleHQgZmllbGRzIG9yIFhGQS5cbiAgICAgKiBVbmxpa2UgUERGIGl0c2VsZiwgWEZBIGlzIG5vdCBhbiBJU08gc3RhbmRhcmQuIFhGQSBoYXMgYmVlbiBkZXByZWNhdGVkIGluXG4gICAgICogUERGIDIuMDpcbiAgICAgKiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1hGQVxuICAgICAqICogaHR0cDovL2Jsb2cucGRmc2hhcmVmb3Jtcy5jb20vcGRmLTItMC1yZWxlYXNlLWJpZC1mYXJld2VsbC14ZmEtZm9ybXMvXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVSaWNoRm9ybWF0dGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuUmljaFRleHQsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIGlzIGEgc3RhbmRhcmQgdGV4dCBmaWVsZCB0aGF0IGRvZXMgbm90IFhGQSBkYXRhIChyaWNoXG4gICAgICogdGV4dCkuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVSaWNoRm9ybWF0dGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlUmljaEZvcm1hdHRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLlJpY2hUZXh0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93IHRoaXMgdGV4dCBmaWVsZCBvbiB0aGUgc3BlY2lmaWVkIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdWJ1bnR1Rm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQodWJ1bnR1Rm9udEJ5dGVzKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uY3JlYXRlVGV4dEZpZWxkKCdiZXN0Lmd1bmRhbScpXG4gICAgICogdGV4dEZpZWxkLnNldFRleHQoJ0V4aWEnKVxuICAgICAqXG4gICAgICogdGV4dEZpZWxkLmFkZFRvUGFnZShwYWdlLCB7XG4gICAgICogICB4OiA1MCxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgd2lkdGg6IDIwMCxcbiAgICAgKiAgIGhlaWdodDogMTAwLFxuICAgICAqICAgdGV4dENvbG9yOiByZ2IoMSwgMCwgMCksXG4gICAgICogICBiYWNrZ3JvdW5kQ29sb3I6IHJnYigwLCAxLCAwKSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiByZ2IoMCwgMCwgMSksXG4gICAgICogICBib3JkZXJXaWR0aDogMixcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcyg5MCksXG4gICAgICogICBmb250OiB1YnVudHVGb250LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB3aWRnZXQgZm9yIHRoaXMgdGV4dCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGlzIHRleHQgZmllbGQgd2lkZ2V0IHNob3VsZCBiZSBhZGRlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gYWRkaW5nIHRoaXMgdGV4dCBmaWVsZCB3aWRnZXQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5hZGRUb1BhZ2UgPSBmdW5jdGlvbiAocGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgW1tQREZQYWdlLCAnUERGUGFnZSddXSk7XG4gICAgICAgIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKCEoJ3RleHRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLnRleHRDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JhY2tncm91bmRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJhY2tncm91bmRDb2xvciA9IHJnYigxLCAxLCAxKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdib3JkZXJXaWR0aCcgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlcldpZHRoID0gMTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGZvciB0aGlzIHRleHQgZmllbGRcbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0KHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAyMDAsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiA1MCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9lID0gb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9mID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBoaWRkZW46IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5hZGRXaWRnZXQod2lkZ2V0UmVmKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHZhciBmb250ID0gKF9nID0gb3B0aW9ucy5mb250KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB0aGlzLmRvYy5nZXRGb3JtKCkuZ2V0RGVmYXVsdEZvbnQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIGdpdmVuIHBhZ2VcbiAgICAgICAgcGFnZS5ub2RlLmFkZEFubm90KHdpZGdldFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHRleHQgZmllbGQgaGFzIGJlZW4gbWFya2VkIGFzIGRpcnR5LCBvciBpZiBhbnkgb2ZcbiAgICAgKiB0aGlzIHRleHQgZmllbGQncyB3aWRnZXRzIGRvIG5vdCBoYXZlIGFuIGFwcGVhcmFuY2Ugc3RyZWFtLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSBjb25zb2xlLmxvZygnTmVlZHMgdXBkYXRlJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIHRleHQgZmllbGQgbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLmlzRGlydHkoKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgaGFzQXBwZWFyYW5jZXMgPSAoKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWwpIGluc3RhbmNlb2YgUERGU3RyZWFtO1xuICAgICAgICAgICAgaWYgKCFoYXNBcHBlYXJhbmNlcylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIHRleHQgZmllbGQncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgdGV4dCBmaWVsZHMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgdGhpcy51cGRhdGVBcHBlYXJhbmNlcyhmb250KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgdGV4dCBmaWVsZCdzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZ2l2ZW4gYXBwZWFyYW5jZSBwcm92aWRlci4gSWYgbm8gYHByb3ZpZGVyYCBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0XG4gICAgICogYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgdGV4dCBmaWVsZHMgd2lsbCBiZSB1c2VkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLnVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSwgKGZpZWxkLCB3aWRnZXQsIGZvbnQpID0+IHtcbiAgICAgKiAgIC4uLlxuICAgICAqICAgcmV0dXJuIGRyYXdUZXh0RmllbGQoLi4uKVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgT3B0aW9uYWxseSwgdGhlIGFwcGVhcmFuY2UgcHJvdmlkZXIgdG8gYmUgdXNlZCBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHByb3ZpZGVyLCAncHJvdmlkZXInLCBbRnVuY3Rpb25dKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzQ2xlYW4oKTtcbiAgICB9O1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciBhcFByb3ZpZGVyID0gcHJvdmlkZXIgIT09IG51bGwgJiYgcHJvdmlkZXIgIT09IHZvaWQgMCA/IHByb3ZpZGVyIDogZGVmYXVsdFRleHRGaWVsZEFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCwgZm9udCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VXaXRoRm9udCh3aWRnZXQsIGZvbnQsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldFRleHRGaWVsZF1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGVGV4dEZpZWxkXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERlRleHRGaWVsZF1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb1RleHQgYW5kIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9UZXh0IFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvVGV4dGAgZm9yIHRoaXMgdGV4dCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIHRleHQgZmllbGQuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhpcyB0ZXh0IGZpZWxkIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5vZiA9IGZ1bmN0aW9uIChhY3JvVGV4dCwgcmVmLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZUZXh0RmllbGQoYWNyb1RleHQsIHJlZiwgZG9jKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZUZXh0RmllbGQ7XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZUZXh0RmllbGQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZUZXh0RmllbGQuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBkcmF3Q2hlY2tCb3gsIHJvdGF0ZUluUGxhY2UsIGRyYXdSYWRpb0J1dHRvbiwgZHJhd0J1dHRvbiwgZHJhd1RleHRGaWVsZCwgZHJhd09wdGlvbkxpc3QsIH0gZnJvbSBcIi4uL29wZXJhdGlvbnNcIjtcbmltcG9ydCB7IHJnYiwgY29tcG9uZW50c1RvQ29sb3IsIHNldEZpbGxpbmdDb2xvciwgZ3JheXNjYWxlLCBjbXlrLCB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IHJlZHVjZVJvdGF0aW9uLCBhZGp1c3REaW1zRm9yUm90YXRpb24gfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBsYXlvdXRNdWx0aWxpbmVUZXh0LCBsYXlvdXRDb21iZWRUZXh0LCBsYXlvdXRTaW5nbGVsaW5lVGV4dCwgfSBmcm9tIFwiLi4vdGV4dC9sYXlvdXRcIjtcbmltcG9ydCB7IFRleHRBbGlnbm1lbnQgfSBmcm9tIFwiLi4vdGV4dC9hbGlnbm1lbnRcIjtcbmltcG9ydCB7IHNldEZvbnRBbmRTaXplIH0gZnJvbSBcIi4uL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgZmluZExhc3RNYXRjaCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqKioqKioqKioqKioqKioqKioqKiBBcHBlYXJhbmNlIFByb3ZpZGVyIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbmV4cG9ydCB2YXIgbm9ybWFsaXplQXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgaWYgKCdub3JtYWwnIGluIGFwcGVhcmFuY2UpXG4gICAgICAgIHJldHVybiBhcHBlYXJhbmNlO1xuICAgIHJldHVybiB7IG5vcm1hbDogYXBwZWFyYW5jZSB9O1xufTtcbi8vIEV4YW1wbGVzOlxuLy8gICBgL0hlbHYgMTIgVGZgIC0+IFsnL0hlbHYgMTIgVGYnLCAnSGVsdicsICcxMiddXG4vLyAgIGAvSGVCbyA4LjAwIFRmYCAtPiBbJy9IZUJvIDggVGYnLCAnSGVCbycsICc4LjAwJ11cbnZhciB0ZlJlZ2V4ID0gL1xcLyhbXlxcMFxcdFxcblxcZlxcclxcIF0rKVtcXDBcXHRcXG5cXGZcXHJcXCBdKyhcXGQqXFwuXFxkK3xcXGQrKVtcXDBcXHRcXG5cXGZcXHJcXCBdK1RmLztcbnZhciBnZXREZWZhdWx0Rm9udFNpemUgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHZhciBkYSA9IChfYSA9IGZpZWxkLmdldERlZmF1bHRBcHBlYXJhbmNlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIHZhciBkYU1hdGNoID0gKF9iID0gZmluZExhc3RNYXRjaChkYSwgdGZSZWdleCkubWF0Y2gpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdO1xuICAgIHZhciBkZWZhdWx0Rm9udFNpemUgPSBOdW1iZXIoZGFNYXRjaFsyXSk7XG4gICAgcmV0dXJuIGlzRmluaXRlKGRlZmF1bHRGb250U2l6ZSkgPyBkZWZhdWx0Rm9udFNpemUgOiB1bmRlZmluZWQ7XG59O1xuLy8gRXhhbXBsZXM6XG4vLyAgIGAwLjMgZ2AgLT4gWycwLjMnLCAnZyddXG4vLyAgIGAwLjMgMSAuMyByZ2AgLT4gWycwLjMnLCAnMScsICcuMycsICdyZyddXG4vLyAgIGAwLjMgMSAuMyAwIGtgIC0+IFsnMC4zJywgJzEnLCAnLjMnLCAnMCcsICdrJ11cbnZhciBjb2xvclJlZ2V4ID0gLyhcXGQqXFwuXFxkK3xcXGQrKVtcXDBcXHRcXG5cXGZcXHJcXCBdKihcXGQqXFwuXFxkK3xcXGQrKT9bXFwwXFx0XFxuXFxmXFxyXFwgXSooXFxkKlxcLlxcZCt8XFxkKyk/W1xcMFxcdFxcblxcZlxcclxcIF0qKFxcZCpcXC5cXGQrfFxcZCspP1tcXDBcXHRcXG5cXGZcXHJcXCBdKyhnfHJnfGspLztcbnZhciBnZXREZWZhdWx0Q29sb3IgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGRhID0gKF9hID0gZmllbGQuZ2V0RGVmYXVsdEFwcGVhcmFuY2UoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgdmFyIGRhTWF0Y2ggPSBmaW5kTGFzdE1hdGNoKGRhLCBjb2xvclJlZ2V4KS5tYXRjaDtcbiAgICB2YXIgX2IgPSBkYU1hdGNoICE9PSBudWxsICYmIGRhTWF0Y2ggIT09IHZvaWQgMCA/IGRhTWF0Y2ggOiBbXSwgYzEgPSBfYlsxXSwgYzIgPSBfYlsyXSwgYzMgPSBfYlszXSwgYzQgPSBfYls0XSwgY29sb3JTcGFjZSA9IF9iWzVdO1xuICAgIGlmIChjb2xvclNwYWNlID09PSAnZycgJiYgYzEpIHtcbiAgICAgICAgcmV0dXJuIGdyYXlzY2FsZShOdW1iZXIoYzEpKTtcbiAgICB9XG4gICAgaWYgKGNvbG9yU3BhY2UgPT09ICdyZycgJiYgYzEgJiYgYzIgJiYgYzMpIHtcbiAgICAgICAgcmV0dXJuIHJnYihOdW1iZXIoYzEpLCBOdW1iZXIoYzIpLCBOdW1iZXIoYzMpKTtcbiAgICB9XG4gICAgaWYgKGNvbG9yU3BhY2UgPT09ICdrJyAmJiBjMSAmJiBjMiAmJiBjMyAmJiBjNCkge1xuICAgICAgICByZXR1cm4gY215ayhOdW1iZXIoYzEpLCBOdW1iZXIoYzIpLCBOdW1iZXIoYzMpLCBOdW1iZXIoYzQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG52YXIgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoZmllbGQsIGNvbG9yLCBmb250LCBmb250U2l6ZSkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoZm9udFNpemUgPT09IHZvaWQgMCkgeyBmb250U2l6ZSA9IDA7IH1cbiAgICB2YXIgZGEgPSBbXG4gICAgICAgIHNldEZpbGxpbmdDb2xvcihjb2xvcikudG9TdHJpbmcoKSxcbiAgICAgICAgc2V0Rm9udEFuZFNpemUoKF9hID0gZm9udCA9PT0gbnVsbCB8fCBmb250ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb250Lm5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdkdW1teV9fbm9vcCcsIGZvbnRTaXplKS50b1N0cmluZygpLFxuICAgIF0uam9pbignXFxuJyk7XG4gICAgZmllbGQuc2V0RGVmYXVsdEFwcGVhcmFuY2UoZGEpO1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdENoZWNrQm94QXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKGNoZWNrQm94LCB3aWRnZXQpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAvLyBUaGUgYC9EQWAgZW50cnkgY2FuIGJlIGF0IHRoZSB3aWRnZXQgb3IgZmllbGQgbGV2ZWwgLSBzbyB3ZSBoYW5kbGUgYm90aFxuICAgIHZhciB3aWRnZXRDb2xvciA9IGdldERlZmF1bHRDb2xvcih3aWRnZXQpO1xuICAgIHZhciBmaWVsZENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKGNoZWNrQm94LmFjcm9GaWVsZCk7XG4gICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IChfYSA9IGJzID09PSBudWxsIHx8IGJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBicy5nZXRXaWR0aCgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRSb3RhdGlvbigpKTtcbiAgICB2YXIgX2QgPSBhZGp1c3REaW1zRm9yUm90YXRpb24ocmVjdGFuZ2xlLCByb3RhdGlvbiksIHdpZHRoID0gX2Qud2lkdGgsIGhlaWdodCA9IF9kLmhlaWdodDtcbiAgICB2YXIgcm90YXRlID0gcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogcm90YXRpb24gfSkpO1xuICAgIHZhciBibGFjayA9IHJnYigwLCAwLCAwKTtcbiAgICB2YXIgYm9yZGVyQ29sb3IgPSAoX2IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Qm9yZGVyQ29sb3IoKSkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGJsYWNrO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciBkb3duQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpLCAwLjgpO1xuICAgIC8vIFVwZGF0ZSBjb2xvclxuICAgIHZhciB0ZXh0Q29sb3IgPSAoX2MgPSB3aWRnZXRDb2xvciAhPT0gbnVsbCAmJiB3aWRnZXRDb2xvciAhPT0gdm9pZCAwID8gd2lkZ2V0Q29sb3IgOiBmaWVsZENvbG9yKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBibGFjaztcbiAgICBpZiAod2lkZ2V0Q29sb3IpIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uod2lkZ2V0LCB0ZXh0Q29sb3IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2UoY2hlY2tCb3guYWNyb0ZpZWxkLCB0ZXh0Q29sb3IpO1xuICAgIH1cbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgeDogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgeTogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIHRoaWNrbmVzczogMS41LFxuICAgICAgICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgbWFya0NvbG9yOiB0ZXh0Q29sb3IsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBub3JtYWw6IHtcbiAgICAgICAgICAgIG9uOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdDaGVja0JveChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvciwgZmlsbGVkOiB0cnVlIH0pKSksXG4gICAgICAgICAgICBvZmY6IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd0NoZWNrQm94KF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IGZhbHNlIH0pKSksXG4gICAgICAgIH0sXG4gICAgICAgIGRvd246IHtcbiAgICAgICAgICAgIG9uOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdDaGVja0JveChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IGRvd25CYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogdHJ1ZSB9KSkpLFxuICAgICAgICAgICAgb2ZmOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdDaGVja0JveChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IGRvd25CYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogZmFsc2UgfSkpKSxcbiAgICAgICAgfSxcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdFJhZGlvR3JvdXBBcHBlYXJhbmNlUHJvdmlkZXIgPSBmdW5jdGlvbiAocmFkaW9Hcm91cCwgd2lkZ2V0KSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcihyYWRpb0dyb3VwLmFjcm9GaWVsZCk7XG4gICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IChfYSA9IGJzID09PSBudWxsIHx8IGJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBicy5nZXRXaWR0aCgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRSb3RhdGlvbigpKTtcbiAgICB2YXIgX2QgPSBhZGp1c3REaW1zRm9yUm90YXRpb24ocmVjdGFuZ2xlLCByb3RhdGlvbiksIHdpZHRoID0gX2Qud2lkdGgsIGhlaWdodCA9IF9kLmhlaWdodDtcbiAgICB2YXIgcm90YXRlID0gcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogcm90YXRpb24gfSkpO1xuICAgIHZhciBibGFjayA9IHJnYigwLCAwLCAwKTtcbiAgICB2YXIgYm9yZGVyQ29sb3IgPSAoX2IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Qm9yZGVyQ29sb3IoKSkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGJsYWNrO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciBkb3duQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpLCAwLjgpO1xuICAgIC8vIFVwZGF0ZSBjb2xvclxuICAgIHZhciB0ZXh0Q29sb3IgPSAoX2MgPSB3aWRnZXRDb2xvciAhPT0gbnVsbCAmJiB3aWRnZXRDb2xvciAhPT0gdm9pZCAwID8gd2lkZ2V0Q29sb3IgOiBmaWVsZENvbG9yKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBibGFjaztcbiAgICBpZiAod2lkZ2V0Q29sb3IpIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uod2lkZ2V0LCB0ZXh0Q29sb3IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2UocmFkaW9Hcm91cC5hY3JvRmllbGQsIHRleHRDb2xvcik7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICB4OiB3aWR0aCAvIDIsXG4gICAgICAgIHk6IGhlaWdodCAvIDIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgZG90Q29sb3I6IHRleHRDb2xvcixcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vcm1hbDoge1xuICAgICAgICAgICAgb246IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd1JhZGlvQnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IHRydWUgfSkpKSxcbiAgICAgICAgICAgIG9mZjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3UmFkaW9CdXR0b24oX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogZmFsc2UgfSkpKSxcbiAgICAgICAgfSxcbiAgICAgICAgZG93bjoge1xuICAgICAgICAgICAgb246IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd1JhZGlvQnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogZG93bkJhY2tncm91bmRDb2xvciwgZmlsbGVkOiB0cnVlIH0pKSksXG4gICAgICAgICAgICBvZmY6IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd1JhZGlvQnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogZG93bkJhY2tncm91bmRDb2xvciwgZmlsbGVkOiBmYWxzZSB9KSkpLFxuICAgICAgICB9LFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBkZWZhdWx0QnV0dG9uQXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKGJ1dHRvbiwgd2lkZ2V0LCBmb250KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAvLyBUaGUgYC9EQWAgZW50cnkgY2FuIGJlIGF0IHRoZSB3aWRnZXQgb3IgZmllbGQgbGV2ZWwgLSBzbyB3ZSBoYW5kbGUgYm90aFxuICAgIHZhciB3aWRnZXRDb2xvciA9IGdldERlZmF1bHRDb2xvcih3aWRnZXQpO1xuICAgIHZhciBmaWVsZENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKGJ1dHRvbi5hY3JvRmllbGQpO1xuICAgIHZhciB3aWRnZXRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZSh3aWRnZXQpO1xuICAgIHZhciBmaWVsZEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKGJ1dHRvbi5hY3JvRmllbGQpO1xuICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICB2YXIgY2FwdGlvbnMgPSBhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Q2FwdGlvbnMoKTtcbiAgICB2YXIgbm9ybWFsVGV4dCA9IChfYSA9IGNhcHRpb25zID09PSBudWxsIHx8IGNhcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYXB0aW9ucy5ub3JtYWwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIHZhciBkb3duVGV4dCA9IChfYyA9IChfYiA9IGNhcHRpb25zID09PSBudWxsIHx8IGNhcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYXB0aW9ucy5kb3duKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBub3JtYWxUZXh0KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAnJztcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2QgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9mID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9mLndpZHRoLCBoZWlnaHQgPSBfZi5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciBkb3duQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpLCAwLjgpO1xuICAgIHZhciBib3VuZHMgPSB7XG4gICAgICAgIHg6IGJvcmRlcldpZHRoLFxuICAgICAgICB5OiBib3JkZXJXaWR0aCxcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGggKiAyLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoICogMixcbiAgICB9O1xuICAgIHZhciBub3JtYWxMYXlvdXQgPSBsYXlvdXRTaW5nbGVsaW5lVGV4dChub3JtYWxUZXh0LCB7XG4gICAgICAgIGFsaWdubWVudDogVGV4dEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICBmb250OiBmb250LFxuICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICB9KTtcbiAgICB2YXIgZG93bkxheW91dCA9IGxheW91dFNpbmdsZWxpbmVUZXh0KGRvd25UZXh0LCB7XG4gICAgICAgIGFsaWdubWVudDogVGV4dEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICBmb250OiBmb250LFxuICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICB9KTtcbiAgICAvLyBVcGRhdGUgZm9udCBzaXplIGFuZCBjb2xvclxuICAgIHZhciBmb250U2l6ZSA9IE1hdGgubWluKG5vcm1hbExheW91dC5mb250U2l6ZSwgZG93bkxheW91dC5mb250U2l6ZSk7XG4gICAgdmFyIHRleHRDb2xvciA9IChfZSA9IHdpZGdldENvbG9yICE9PSBudWxsICYmIHdpZGdldENvbG9yICE9PSB2b2lkIDAgPyB3aWRnZXRDb2xvciA6IGZpZWxkQ29sb3IpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IGJsYWNrO1xuICAgIGlmICh3aWRnZXRDb2xvciB8fCB3aWRnZXRGb250U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHdpZGdldCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZShidXR0b24uYWNyb0ZpZWxkLCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHg6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHk6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgdGV4dENvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IGZvbnQubmFtZSxcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbm9ybWFsOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdCdXR0b24oX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsIHRleHRMaW5lczogW25vcm1hbExheW91dC5saW5lXSB9KSkpLFxuICAgICAgICBkb3duOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdCdXR0b24oX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBkb3duQmFja2dyb3VuZENvbG9yLCB0ZXh0TGluZXM6IFtkb3duTGF5b3V0LmxpbmVdIH0pKSksXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIGRlZmF1bHRUZXh0RmllbGRBcHBlYXJhbmNlUHJvdmlkZXIgPSBmdW5jdGlvbiAodGV4dEZpZWxkLCB3aWRnZXQsIGZvbnQpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcih0ZXh0RmllbGQuYWNyb0ZpZWxkKTtcbiAgICB2YXIgd2lkZ2V0Rm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZSh0ZXh0RmllbGQuYWNyb0ZpZWxkKTtcbiAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgIHZhciBhcCA9IHdpZGdldC5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgdmFyIGJzID0gd2lkZ2V0LmdldEJvcmRlclN0eWxlKCk7XG4gICAgdmFyIHRleHQgPSAoX2EgPSB0ZXh0RmllbGQuZ2V0VGV4dCgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2IgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9lID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9lLndpZHRoLCBoZWlnaHQgPSBfZS5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciB0ZXh0TGluZXM7XG4gICAgdmFyIGZvbnRTaXplO1xuICAgIHZhciBwYWRkaW5nID0gdGV4dEZpZWxkLmlzQ29tYmVkKCkgPyAwIDogMTtcbiAgICB2YXIgYm91bmRzID0ge1xuICAgICAgICB4OiBib3JkZXJXaWR0aCArIHBhZGRpbmcsXG4gICAgICAgIHk6IGJvcmRlcldpZHRoICsgcGFkZGluZyxcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gKGJvcmRlcldpZHRoICsgcGFkZGluZykgKiAyLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIChib3JkZXJXaWR0aCArIHBhZGRpbmcpICogMixcbiAgICB9O1xuICAgIGlmICh0ZXh0RmllbGQuaXNNdWx0aWxpbmUoKSkge1xuICAgICAgICB2YXIgbGF5b3V0ID0gbGF5b3V0TXVsdGlsaW5lVGV4dCh0ZXh0LCB7XG4gICAgICAgICAgICBhbGlnbm1lbnQ6IHRleHRGaWVsZC5nZXRBbGlnbm1lbnQoKSxcbiAgICAgICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgICAgIGJvdW5kczogYm91bmRzLFxuICAgICAgICB9KTtcbiAgICAgICAgdGV4dExpbmVzID0gbGF5b3V0LmxpbmVzO1xuICAgICAgICBmb250U2l6ZSA9IGxheW91dC5mb250U2l6ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGV4dEZpZWxkLmlzQ29tYmVkKCkpIHtcbiAgICAgICAgdmFyIGxheW91dCA9IGxheW91dENvbWJlZFRleHQodGV4dCwge1xuICAgICAgICAgICAgZm9udFNpemU6IHdpZGdldEZvbnRTaXplICE9PSBudWxsICYmIHdpZGdldEZvbnRTaXplICE9PSB2b2lkIDAgPyB3aWRnZXRGb250U2l6ZSA6IGZpZWxkRm9udFNpemUsXG4gICAgICAgICAgICBmb250OiBmb250LFxuICAgICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgICAgICBjZWxsQ291bnQ6IChfYyA9IHRleHRGaWVsZC5nZXRNYXhMZW5ndGgoKSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRleHRMaW5lcyA9IGxheW91dC5jZWxscztcbiAgICAgICAgZm9udFNpemUgPSBsYXlvdXQuZm9udFNpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgbGF5b3V0ID0gbGF5b3V0U2luZ2xlbGluZVRleHQodGV4dCwge1xuICAgICAgICAgICAgYWxpZ25tZW50OiB0ZXh0RmllbGQuZ2V0QWxpZ25tZW50KCksXG4gICAgICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnQ6IGZvbnQsXG4gICAgICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRleHRMaW5lcyA9IFtsYXlvdXQubGluZV07XG4gICAgICAgIGZvbnRTaXplID0gbGF5b3V0LmZvbnRTaXplO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgZm9udCBzaXplIGFuZCBjb2xvclxuICAgIHZhciB0ZXh0Q29sb3IgPSAoX2QgPSB3aWRnZXRDb2xvciAhPT0gbnVsbCAmJiB3aWRnZXRDb2xvciAhPT0gdm9pZCAwID8gd2lkZ2V0Q29sb3IgOiBmaWVsZENvbG9yKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBibGFjaztcbiAgICBpZiAod2lkZ2V0Q29sb3IgfHwgd2lkZ2V0Rm9udFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZSh3aWRnZXQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2UodGV4dEZpZWxkLmFjcm9GaWVsZCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICB4OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB5OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoICE9PSBudWxsICYmIGJvcmRlcldpZHRoICE9PSB2b2lkIDAgPyBib3JkZXJXaWR0aCA6IDAsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgdGV4dENvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IGZvbnQubmFtZSxcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLFxuICAgICAgICB0ZXh0TGluZXM6IHRleHRMaW5lcyxcbiAgICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICB9O1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdUZXh0RmllbGQob3B0aW9ucykpO1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdERyb3Bkb3duQXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKGRyb3Bkb3duLCB3aWRnZXQsIGZvbnQpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAvLyBUaGUgYC9EQWAgZW50cnkgY2FuIGJlIGF0IHRoZSB3aWRnZXQgb3IgZmllbGQgbGV2ZWwgLSBzbyB3ZSBoYW5kbGUgYm90aFxuICAgIHZhciB3aWRnZXRDb2xvciA9IGdldERlZmF1bHRDb2xvcih3aWRnZXQpO1xuICAgIHZhciBmaWVsZENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKGRyb3Bkb3duLmFjcm9GaWVsZCk7XG4gICAgdmFyIHdpZGdldEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkRm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUoZHJvcGRvd24uYWNyb0ZpZWxkKTtcbiAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgIHZhciBhcCA9IHdpZGdldC5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgdmFyIGJzID0gd2lkZ2V0LmdldEJvcmRlclN0eWxlKCk7XG4gICAgdmFyIHRleHQgPSAoX2EgPSBkcm9wZG93bi5nZXRTZWxlY3RlZCgpWzBdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2IgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9kID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9kLndpZHRoLCBoZWlnaHQgPSBfZC5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciBwYWRkaW5nID0gMTtcbiAgICB2YXIgYm91bmRzID0ge1xuICAgICAgICB4OiBib3JkZXJXaWR0aCArIHBhZGRpbmcsXG4gICAgICAgIHk6IGJvcmRlcldpZHRoICsgcGFkZGluZyxcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gKGJvcmRlcldpZHRoICsgcGFkZGluZykgKiAyLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIChib3JkZXJXaWR0aCArIHBhZGRpbmcpICogMixcbiAgICB9O1xuICAgIHZhciBfZSA9IGxheW91dFNpbmdsZWxpbmVUZXh0KHRleHQsIHtcbiAgICAgICAgYWxpZ25tZW50OiBUZXh0QWxpZ25tZW50LkxlZnQsXG4gICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICBmb250OiBmb250LFxuICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICB9KSwgbGluZSA9IF9lLmxpbmUsIGZvbnRTaXplID0gX2UuZm9udFNpemU7XG4gICAgLy8gVXBkYXRlIGZvbnQgc2l6ZSBhbmQgY29sb3JcbiAgICB2YXIgdGV4dENvbG9yID0gKF9jID0gd2lkZ2V0Q29sb3IgIT09IG51bGwgJiYgd2lkZ2V0Q29sb3IgIT09IHZvaWQgMCA/IHdpZGdldENvbG9yIDogZmllbGRDb2xvcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogYmxhY2s7XG4gICAgaWYgKHdpZGdldENvbG9yIHx8IHdpZGdldEZvbnRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uod2lkZ2V0LCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKGRyb3Bkb3duLmFjcm9GaWVsZCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICB4OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB5OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoICE9PSBudWxsICYmIGJvcmRlcldpZHRoICE9PSB2b2lkIDAgPyBib3JkZXJXaWR0aCA6IDAsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgdGV4dENvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IGZvbnQubmFtZSxcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLFxuICAgICAgICB0ZXh0TGluZXM6IFtsaW5lXSxcbiAgICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICB9O1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdUZXh0RmllbGQob3B0aW9ucykpO1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdE9wdGlvbkxpc3RBcHBlYXJhbmNlUHJvdmlkZXIgPSBmdW5jdGlvbiAob3B0aW9uTGlzdCwgd2lkZ2V0LCBmb250KSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICAvLyBUaGUgYC9EQWAgZW50cnkgY2FuIGJlIGF0IHRoZSB3aWRnZXQgb3IgZmllbGQgbGV2ZWwgLSBzbyB3ZSBoYW5kbGUgYm90aFxuICAgIHZhciB3aWRnZXRDb2xvciA9IGdldERlZmF1bHRDb2xvcih3aWRnZXQpO1xuICAgIHZhciBmaWVsZENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKG9wdGlvbkxpc3QuYWNyb0ZpZWxkKTtcbiAgICB2YXIgd2lkZ2V0Rm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZShvcHRpb25MaXN0LmFjcm9GaWVsZCk7XG4gICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IChfYSA9IGJzID09PSBudWxsIHx8IGJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBicy5nZXRXaWR0aCgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRSb3RhdGlvbigpKTtcbiAgICB2YXIgX2MgPSBhZGp1c3REaW1zRm9yUm90YXRpb24ocmVjdGFuZ2xlLCByb3RhdGlvbiksIHdpZHRoID0gX2Mud2lkdGgsIGhlaWdodCA9IF9jLmhlaWdodDtcbiAgICB2YXIgcm90YXRlID0gcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogcm90YXRpb24gfSkpO1xuICAgIHZhciBibGFjayA9IHJnYigwLCAwLCAwKTtcbiAgICB2YXIgYm9yZGVyQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Qm9yZGVyQ29sb3IoKSk7XG4gICAgdmFyIG5vcm1hbEJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7XG4gICAgdmFyIG9wdGlvbnMgPSBvcHRpb25MaXN0LmdldE9wdGlvbnMoKTtcbiAgICB2YXIgc2VsZWN0ZWQgPSBvcHRpb25MaXN0LmdldFNlbGVjdGVkKCk7XG4gICAgaWYgKG9wdGlvbkxpc3QuaXNTb3J0ZWQoKSlcbiAgICAgICAgb3B0aW9ucy5zb3J0KCk7XG4gICAgdmFyIHRleHQgPSAnJztcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB0ZXh0ICs9IG9wdGlvbnNbaWR4XTtcbiAgICAgICAgaWYgKGlkeCA8IGxlbiAtIDEpXG4gICAgICAgICAgICB0ZXh0ICs9ICdcXG4nO1xuICAgIH1cbiAgICB2YXIgcGFkZGluZyA9IDE7XG4gICAgdmFyIGJvdW5kcyA9IHtcbiAgICAgICAgeDogYm9yZGVyV2lkdGggKyBwYWRkaW5nLFxuICAgICAgICB5OiBib3JkZXJXaWR0aCArIHBhZGRpbmcsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIChib3JkZXJXaWR0aCArIHBhZGRpbmcpICogMixcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSAoYm9yZGVyV2lkdGggKyBwYWRkaW5nKSAqIDIsXG4gICAgfTtcbiAgICB2YXIgX2QgPSBsYXlvdXRNdWx0aWxpbmVUZXh0KHRleHQsIHtcbiAgICAgICAgYWxpZ25tZW50OiBUZXh0QWxpZ25tZW50LkxlZnQsXG4gICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICBmb250OiBmb250LFxuICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICB9KSwgbGluZXMgPSBfZC5saW5lcywgZm9udFNpemUgPSBfZC5mb250U2l6ZSwgbGluZUhlaWdodCA9IF9kLmxpbmVIZWlnaHQ7XG4gICAgdmFyIHNlbGVjdGVkTGluZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBsaW5lc1tpZHhdO1xuICAgICAgICBpZiAoc2VsZWN0ZWQuaW5jbHVkZXMobGluZS50ZXh0KSlcbiAgICAgICAgICAgIHNlbGVjdGVkTGluZXMucHVzaChpZHgpO1xuICAgIH1cbiAgICB2YXIgYmx1ZSA9IHJnYigxNTMgLyAyNTUsIDE5MyAvIDI1NSwgMjE4IC8gMjU1KTtcbiAgICAvLyBVcGRhdGUgZm9udCBzaXplIGFuZCBjb2xvclxuICAgIHZhciB0ZXh0Q29sb3IgPSAoX2IgPSB3aWRnZXRDb2xvciAhPT0gbnVsbCAmJiB3aWRnZXRDb2xvciAhPT0gdm9pZCAwID8gd2lkZ2V0Q29sb3IgOiBmaWVsZENvbG9yKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBibGFjaztcbiAgICBpZiAod2lkZ2V0Q29sb3IgfHwgd2lkZ2V0Rm9udFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZSh3aWRnZXQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uob3B0aW9uTGlzdC5hY3JvRmllbGQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3T3B0aW9uTGlzdCh7XG4gICAgICAgIHg6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHk6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGggIT09IG51bGwgJiYgYm9yZGVyV2lkdGggIT09IHZvaWQgMCA/IGJvcmRlcldpZHRoIDogMCxcbiAgICAgICAgYm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yLFxuICAgICAgICB0ZXh0Q29sb3I6IHRleHRDb2xvcixcbiAgICAgICAgZm9udDogZm9udC5uYW1lLFxuICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgIGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIHRleHRMaW5lczogbGluZXMsXG4gICAgICAgIGxpbmVIZWlnaHQ6IGxpbmVIZWlnaHQsXG4gICAgICAgIHNlbGVjdGVkQ29sb3I6IGJsdWUsXG4gICAgICAgIHNlbGVjdGVkTGluZXM6IHNlbGVjdGVkTGluZXMsXG4gICAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgfSkpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwcGVhcmFuY2VzLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2FwcGVhcmFuY2VzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkJ1dHRvbiB9IGZyb20gXCIuL1BERkJ1dHRvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZDaGVja0JveCB9IGZyb20gXCIuL1BERkNoZWNrQm94XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkRyb3Bkb3duIH0gZnJvbSBcIi4vUERGRHJvcGRvd25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRmllbGQgfSBmcm9tIFwiLi9QREZGaWVsZFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZGb3JtIH0gZnJvbSBcIi4vUERGRm9ybVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPcHRpb25MaXN0IH0gZnJvbSBcIi4vUERGT3B0aW9uTGlzdFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZSYWRpb0dyb3VwIH0gZnJvbSBcIi4vUERGUmFkaW9Hcm91cFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZTaWduYXR1cmUgfSBmcm9tIFwiLi9QREZTaWduYXR1cmVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGVGV4dEZpZWxkIH0gZnJvbSBcIi4vUERGVGV4dEZpZWxkXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgdmFyIEltYWdlQWxpZ25tZW50O1xuKGZ1bmN0aW9uIChJbWFnZUFsaWdubWVudCkge1xuICAgIEltYWdlQWxpZ25tZW50W0ltYWdlQWxpZ25tZW50W1wiTGVmdFwiXSA9IDBdID0gXCJMZWZ0XCI7XG4gICAgSW1hZ2VBbGlnbm1lbnRbSW1hZ2VBbGlnbm1lbnRbXCJDZW50ZXJcIl0gPSAxXSA9IFwiQ2VudGVyXCI7XG4gICAgSW1hZ2VBbGlnbm1lbnRbSW1hZ2VBbGlnbm1lbnRbXCJSaWdodFwiXSA9IDJdID0gXCJSaWdodFwiO1xufSkoSW1hZ2VBbGlnbm1lbnQgfHwgKEltYWdlQWxpZ25tZW50ID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsaWdubWVudC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9hbGlnbm1lbnRcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2Zvcm1cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbWFnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb2JqZWN0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3BlcmF0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yb3RhdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NpemVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9QREZQYWdlT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUERGRG9jdW1lbnRPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdGFuZGFyZEZvbnRzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkRvY3VtZW50IH0gZnJvbSBcIi4vUERGRG9jdW1lbnRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRm9udCB9IGZyb20gXCIuL1BERkZvbnRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGSW1hZ2UgfSBmcm9tIFwiLi9QREZJbWFnZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZQYWdlIH0gZnJvbSBcIi4vUERGUGFnZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZFbWJlZGRlZFBhZ2UgfSBmcm9tIFwiLi9QREZFbWJlZGRlZFBhZ2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGSmF2YVNjcmlwdCB9IGZyb20gXCIuL1BERkphdmFTY3JpcHRcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IFBERk5hbWUsIFBERk51bWJlciB9IGZyb20gXCIuLi9jb3JlXCI7XG5leHBvcnQgdmFyIGFzUERGTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWUgaW5zdGFuY2VvZiBQREZOYW1lID8gbmFtZSA6IFBERk5hbWUub2YobmFtZSk7XG59O1xuZXhwb3J0IHZhciBhc1BERk51bWJlciA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICByZXR1cm4gbnVtIGluc3RhbmNlb2YgUERGTnVtYmVyID8gbnVtIDogUERGTnVtYmVyLm9mKG51bSk7XG59O1xuZXhwb3J0IHZhciBhc051bWJlciA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICByZXR1cm4gbnVtIGluc3RhbmNlb2YgUERGTnVtYmVyID8gbnVtLmFzTnVtYmVyKCkgOiBudW07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JqZWN0cy5qcy5tYXAiLCJpbXBvcnQgeyBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgc2V0RmlsbGluZ0NvbG9yLCBzZXRTdHJva2luZ0NvbG9yIH0gZnJvbSBcIi4vY29sb3JzXCI7XG5pbXBvcnQgeyBiZWdpblRleHQsIGNsb3NlUGF0aCwgZHJhd09iamVjdCwgZW5kVGV4dCwgZmlsbCwgZmlsbEFuZFN0cm9rZSwgbGluZVRvLCBtb3ZlVG8sIG5leHRMaW5lLCBwb3BHcmFwaGljc1N0YXRlLCBwdXNoR3JhcGhpY3NTdGF0ZSwgcm90YXRlQW5kU2tld1RleHRSYWRpYW5zQW5kVHJhbnNsYXRlLCByb3RhdGVSYWRpYW5zLCBzY2FsZSwgc2V0Rm9udEFuZFNpemUsIHNldExpbmVIZWlnaHQsIHNldExpbmVXaWR0aCwgc2hvd1RleHQsIHNrZXdSYWRpYW5zLCBzdHJva2UsIHRyYW5zbGF0ZSwgc2V0TGluZUNhcCwgcm90YXRlRGVncmVlcywgc2V0R3JhcGhpY3NTdGF0ZSwgc2V0RGFzaFBhdHRlcm4sIGJlZ2luTWFya2VkQ29udGVudCwgZW5kTWFya2VkQ29udGVudCwgY2xpcCwgZW5kUGF0aCwgYXBwZW5kQmV6aWVyQ3VydmUsIH0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzLCB0b1JhZGlhbnMgfSBmcm9tIFwiLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IHN2Z1BhdGhUb09wZXJhdG9ycyB9IGZyb20gXCIuL3N2Z1BhdGhcIjtcbmltcG9ydCB7IGFzTnVtYmVyIH0gZnJvbSBcIi4vb2JqZWN0c1wiO1xuZXhwb3J0IHZhciBkcmF3VGV4dCA9IGZ1bmN0aW9uIChsaW5lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgYmVnaW5UZXh0KCksXG4gICAgICAgIHNldEZpbGxpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgc2V0Rm9udEFuZFNpemUob3B0aW9ucy5mb250LCBvcHRpb25zLnNpemUpLFxuICAgICAgICByb3RhdGVBbmRTa2V3VGV4dFJhZGlhbnNBbmRUcmFuc2xhdGUodG9SYWRpYW5zKG9wdGlvbnMucm90YXRlKSwgdG9SYWRpYW5zKG9wdGlvbnMueFNrZXcpLCB0b1JhZGlhbnMob3B0aW9ucy55U2tldyksIG9wdGlvbnMueCwgb3B0aW9ucy55KSxcbiAgICAgICAgc2hvd1RleHQobGluZSksXG4gICAgICAgIGVuZFRleHQoKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd0xpbmVzT2ZUZXh0ID0gZnVuY3Rpb24gKGxpbmVzLCBvcHRpb25zKSB7XG4gICAgdmFyIG9wZXJhdG9ycyA9IFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgYmVnaW5UZXh0KCksXG4gICAgICAgIHNldEZpbGxpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgc2V0Rm9udEFuZFNpemUob3B0aW9ucy5mb250LCBvcHRpb25zLnNpemUpLFxuICAgICAgICBzZXRMaW5lSGVpZ2h0KG9wdGlvbnMubGluZUhlaWdodCksXG4gICAgICAgIHJvdGF0ZUFuZFNrZXdUZXh0UmFkaWFuc0FuZFRyYW5zbGF0ZSh0b1JhZGlhbnMob3B0aW9ucy5yb3RhdGUpLCB0b1JhZGlhbnMob3B0aW9ucy54U2tldyksIHRvUmFkaWFucyhvcHRpb25zLnlTa2V3KSwgb3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBvcGVyYXRvcnMucHVzaChzaG93VGV4dChsaW5lc1tpZHhdKSwgbmV4dExpbmUoKSk7XG4gICAgfVxuICAgIG9wZXJhdG9ycy5wdXNoKGVuZFRleHQoKSwgcG9wR3JhcGhpY3NTdGF0ZSgpKTtcbiAgICByZXR1cm4gb3BlcmF0b3JzO1xufTtcbmV4cG9ydCB2YXIgZHJhd0ltYWdlID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgICAgICByb3RhdGVSYWRpYW5zKHRvUmFkaWFucyhvcHRpb25zLnJvdGF0ZSkpLFxuICAgICAgICBzY2FsZShvcHRpb25zLndpZHRoLCBvcHRpb25zLmhlaWdodCksXG4gICAgICAgIHNrZXdSYWRpYW5zKHRvUmFkaWFucyhvcHRpb25zLnhTa2V3KSwgdG9SYWRpYW5zKG9wdGlvbnMueVNrZXcpKSxcbiAgICAgICAgZHJhd09iamVjdChuYW1lKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd1BhZ2UgPSBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIHRyYW5zbGF0ZShvcHRpb25zLngsIG9wdGlvbnMueSksXG4gICAgICAgIHJvdGF0ZVJhZGlhbnModG9SYWRpYW5zKG9wdGlvbnMucm90YXRlKSksXG4gICAgICAgIHNjYWxlKG9wdGlvbnMueFNjYWxlLCBvcHRpb25zLnlTY2FsZSksXG4gICAgICAgIHNrZXdSYWRpYW5zKHRvUmFkaWFucyhvcHRpb25zLnhTa2V3KSwgdG9SYWRpYW5zKG9wdGlvbnMueVNrZXcpKSxcbiAgICAgICAgZHJhd09iamVjdChuYW1lKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd0xpbmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBzZXRTdHJva2luZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBzZXRMaW5lV2lkdGgob3B0aW9ucy50aGlja25lc3MpLFxuICAgICAgICBzZXREYXNoUGF0dGVybigoX2EgPSBvcHRpb25zLmRhc2hBcnJheSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10sIChfYiA9IG9wdGlvbnMuZGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwKSxcbiAgICAgICAgbW92ZVRvKG9wdGlvbnMuc3RhcnQueCwgb3B0aW9ucy5zdGFydC55KSxcbiAgICAgICAgb3B0aW9ucy5saW5lQ2FwICYmIHNldExpbmVDYXAob3B0aW9ucy5saW5lQ2FwKSxcbiAgICAgICAgbW92ZVRvKG9wdGlvbnMuc3RhcnQueCwgb3B0aW9ucy5zdGFydC55KSxcbiAgICAgICAgbGluZVRvKG9wdGlvbnMuZW5kLngsIG9wdGlvbnMuZW5kLnkpLFxuICAgICAgICBzdHJva2UoKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd1JlY3RhbmdsZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIHNldEZpbGxpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciAmJiBzZXRTdHJva2luZ0NvbG9yKG9wdGlvbnMuYm9yZGVyQ29sb3IpLFxuICAgICAgICBzZXRMaW5lV2lkdGgob3B0aW9ucy5ib3JkZXJXaWR0aCksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyTGluZUNhcCAmJiBzZXRMaW5lQ2FwKG9wdGlvbnMuYm9yZGVyTGluZUNhcCksXG4gICAgICAgIHNldERhc2hQYXR0ZXJuKChfYSA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXSwgKF9iID0gb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDApLFxuICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgICAgICByb3RhdGVSYWRpYW5zKHRvUmFkaWFucyhvcHRpb25zLnJvdGF0ZSkpLFxuICAgICAgICBza2V3UmFkaWFucyh0b1JhZGlhbnMob3B0aW9ucy54U2tldyksIHRvUmFkaWFucyhvcHRpb25zLnlTa2V3KSksXG4gICAgICAgIG1vdmVUbygwLCAwKSxcbiAgICAgICAgbGluZVRvKDAsIG9wdGlvbnMuaGVpZ2h0KSxcbiAgICAgICAgbGluZVRvKG9wdGlvbnMud2lkdGgsIG9wdGlvbnMuaGVpZ2h0KSxcbiAgICAgICAgbGluZVRvKG9wdGlvbnMud2lkdGgsIDApLFxuICAgICAgICBjbG9zZVBhdGgoKSxcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgb3B0aW9ucy5ib3JkZXJXaWR0aCA/IGZpbGxBbmRTdHJva2UoKVxuICAgICAgICAgICAgOiBvcHRpb25zLmNvbG9yID8gZmlsbCgpXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zLmJvcmRlckNvbG9yID8gc3Ryb2tlKClcbiAgICAgICAgICAgICAgICAgICAgOiBjbG9zZVBhdGgoKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbnZhciBLQVBQQSA9IDQuMCAqICgoTWF0aC5zcXJ0KDIpIC0gMS4wKSAvIDMuMCk7XG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCB2YXIgZHJhd0VsbGlwc2VQYXRoID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIHZhciB4ID0gYXNOdW1iZXIoY29uZmlnLngpO1xuICAgIHZhciB5ID0gYXNOdW1iZXIoY29uZmlnLnkpO1xuICAgIHZhciB4U2NhbGUgPSBhc051bWJlcihjb25maWcueFNjYWxlKTtcbiAgICB2YXIgeVNjYWxlID0gYXNOdW1iZXIoY29uZmlnLnlTY2FsZSk7XG4gICAgeCAtPSB4U2NhbGU7XG4gICAgeSAtPSB5U2NhbGU7XG4gICAgdmFyIG94ID0geFNjYWxlICogS0FQUEE7XG4gICAgdmFyIG95ID0geVNjYWxlICogS0FQUEE7XG4gICAgdmFyIHhlID0geCArIHhTY2FsZSAqIDI7XG4gICAgdmFyIHllID0geSArIHlTY2FsZSAqIDI7XG4gICAgdmFyIHhtID0geCArIHhTY2FsZTtcbiAgICB2YXIgeW0gPSB5ICsgeVNjYWxlO1xuICAgIHJldHVybiBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG1vdmVUbyh4LCB5bSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHgsIHltIC0gb3ksIHhtIC0gb3gsIHksIHhtLCB5KSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeG0gKyBveCwgeSwgeGUsIHltIC0gb3ksIHhlLCB5bSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhlLCB5bSArIG95LCB4bSArIG94LCB5ZSwgeG0sIHllKSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeG0gLSBveCwgeWUsIHgsIHltICsgb3ksIHgsIHltKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF07XG59O1xudmFyIGRyYXdFbGxpcHNlQ3VydmVzID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIHZhciBjZW50ZXJYID0gYXNOdW1iZXIoY29uZmlnLngpO1xuICAgIHZhciBjZW50ZXJZID0gYXNOdW1iZXIoY29uZmlnLnkpO1xuICAgIHZhciB4U2NhbGUgPSBhc051bWJlcihjb25maWcueFNjYWxlKTtcbiAgICB2YXIgeVNjYWxlID0gYXNOdW1iZXIoY29uZmlnLnlTY2FsZSk7XG4gICAgdmFyIHggPSAteFNjYWxlO1xuICAgIHZhciB5ID0gLXlTY2FsZTtcbiAgICB2YXIgb3ggPSB4U2NhbGUgKiBLQVBQQTtcbiAgICB2YXIgb3kgPSB5U2NhbGUgKiBLQVBQQTtcbiAgICB2YXIgeGUgPSB4ICsgeFNjYWxlICogMjtcbiAgICB2YXIgeWUgPSB5ICsgeVNjYWxlICogMjtcbiAgICB2YXIgeG0gPSB4ICsgeFNjYWxlO1xuICAgIHZhciB5bSA9IHkgKyB5U2NhbGU7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgdHJhbnNsYXRlKGNlbnRlclgsIGNlbnRlclkpLFxuICAgICAgICByb3RhdGVSYWRpYW5zKHRvUmFkaWFucyhjb25maWcucm90YXRlKSksXG4gICAgICAgIG1vdmVUbyh4LCB5bSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHgsIHltIC0gb3ksIHhtIC0gb3gsIHksIHhtLCB5KSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeG0gKyBveCwgeSwgeGUsIHltIC0gb3ksIHhlLCB5bSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhlLCB5bSArIG95LCB4bSArIG94LCB5ZSwgeG0sIHllKSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeG0gLSBveCwgeWUsIHgsIHltICsgb3ksIHgsIHltKSxcbiAgICBdO1xufTtcbmV4cG9ydCB2YXIgZHJhd0VsbGlwc2UgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgc2V0RmlsbGluZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yICYmIHNldFN0cm9raW5nQ29sb3Iob3B0aW9ucy5ib3JkZXJDb2xvciksXG4gICAgICAgIHNldExpbmVXaWR0aChvcHRpb25zLmJvcmRlcldpZHRoKSxcbiAgICAgICAgb3B0aW9ucy5ib3JkZXJMaW5lQ2FwICYmIHNldExpbmVDYXAob3B0aW9ucy5ib3JkZXJMaW5lQ2FwKSxcbiAgICAgICAgc2V0RGFzaFBhdHRlcm4oKF9hID0gb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdLCAoX2IgPSBvcHRpb25zLmJvcmRlckRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMClcbiAgICBdLCAob3B0aW9ucy5yb3RhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGRyYXdFbGxpcHNlUGF0aCh7XG4gICAgICAgICAgICB4OiBvcHRpb25zLngsXG4gICAgICAgICAgICB5OiBvcHRpb25zLnksXG4gICAgICAgICAgICB4U2NhbGU6IG9wdGlvbnMueFNjYWxlLFxuICAgICAgICAgICAgeVNjYWxlOiBvcHRpb25zLnlTY2FsZSxcbiAgICAgICAgfSlcbiAgICAgICAgOiBkcmF3RWxsaXBzZUN1cnZlcyh7XG4gICAgICAgICAgICB4OiBvcHRpb25zLngsXG4gICAgICAgICAgICB5OiBvcHRpb25zLnksXG4gICAgICAgICAgICB4U2NhbGU6IG9wdGlvbnMueFNjYWxlLFxuICAgICAgICAgICAgeVNjYWxlOiBvcHRpb25zLnlTY2FsZSxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9jID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGRlZ3JlZXMoMCksXG4gICAgICAgIH0pKSwgW1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBvcHRpb25zLmJvcmRlcldpZHRoID8gZmlsbEFuZFN0cm9rZSgpXG4gICAgICAgICAgICA6IG9wdGlvbnMuY29sb3IgPyBmaWxsKClcbiAgICAgICAgICAgICAgICA6IG9wdGlvbnMuYm9yZGVyQ29sb3IgPyBzdHJva2UoKVxuICAgICAgICAgICAgICAgICAgICA6IGNsb3NlUGF0aCgpLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXSkuZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd1N2Z1BhdGggPSBmdW5jdGlvbiAocGF0aCwgb3B0aW9ucykge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIHRyYW5zbGF0ZShvcHRpb25zLngsIG9wdGlvbnMueSksXG4gICAgICAgIHJvdGF0ZVJhZGlhbnModG9SYWRpYW5zKChfYSA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBkZWdyZWVzKDApKSksXG4gICAgICAgIC8vIFNWRyBwYXRoIFkgYXhpcyBpcyBvcHBvc2l0ZSBwZGYtbGliJ3NcbiAgICAgICAgb3B0aW9ucy5zY2FsZSA/IHNjYWxlKG9wdGlvbnMuc2NhbGUsIC1vcHRpb25zLnNjYWxlKSA6IHNjYWxlKDEsIC0xKSxcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBzZXRGaWxsaW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgJiYgc2V0U3Ryb2tpbmdDb2xvcihvcHRpb25zLmJvcmRlckNvbG9yKSxcbiAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCAmJiBzZXRMaW5lV2lkdGgob3B0aW9ucy5ib3JkZXJXaWR0aCksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyTGluZUNhcCAmJiBzZXRMaW5lQ2FwKG9wdGlvbnMuYm9yZGVyTGluZUNhcCksXG4gICAgICAgIHNldERhc2hQYXR0ZXJuKChfYiA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXSwgKF9jID0gb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDApXG4gICAgXSwgc3ZnUGF0aFRvT3BlcmF0b3JzKHBhdGgpLCBbXG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIG9wdGlvbnMuYm9yZGVyV2lkdGggPyBmaWxsQW5kU3Ryb2tlKClcbiAgICAgICAgICAgIDogb3B0aW9ucy5jb2xvciA/IGZpbGwoKVxuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5ib3JkZXJDb2xvciA/IHN0cm9rZSgpXG4gICAgICAgICAgICAgICAgICAgIDogY2xvc2VQYXRoKCksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdKS5maWx0ZXIoQm9vbGVhbik7XG59O1xuZXhwb3J0IHZhciBkcmF3Q2hlY2tNYXJrID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgc2l6ZSA9IGFzTnVtYmVyKG9wdGlvbnMuc2l6ZSk7XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqIERlZmluZSBDaGVjayBNYXJrIFBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLy8gQSBjaGVjayBtYXJrIGlzIGRlZmluZWQgYnkgdGhyZWUgcG9pbnRzIGluIHNvbWUgY29vcmRpbmF0ZSBzcGFjZS4gSGVyZSwgd2VcbiAgICAvLyBkZWZpbmUgdGhlc2UgcG9pbnRzIGluIGEgdW5pdCBjb29yZGluYXRlIHN5c3RlbSwgd2hlcmUgdGhlIHJhbmdlIG9mIHRoZSB4XG4gICAgLy8gYW5kIHkgYXhpcyBhcmUgYm90aCBbLTEsIDFdLlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IHdlIGRvIG5vdCBoYXJkIGNvZGUgYHAxeWAgaW4gY2FzZSB3ZSB3aXNoIHRvIGNoYW5nZSB0aGVcbiAgICAvLyBzaXplL3NoYXBlIG9mIHRoZSBjaGVjayBtYXJrIGluIHRoZSBmdXR1cmUuIFdlIHdhbnQgdGhlIGNoZWNrIG1hcmsgdG9cbiAgICAvLyBhbHdheXMgZm9ybSBhIHJpZ2h0IGFuZ2xlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGRvdCBwcm9kdWN0IGJldHdlZW4gKHAxLXAyKVxuICAgIC8vIGFuZCAocDMtcDIpIHNob3VsZCBiZSB6ZXJvOlxuICAgIC8vXG4gICAgLy8gICAocDF4LXAyeCkgKiAocDN4LXAyeCkgKyAocDF5LXAyeSkgKiAocDN5LXAyeSkgPSAwXG4gICAgLy9cbiAgICAvLyBXZSBjYW4gbm93IHJlamlnZ2VyIHRoaXMgZXF1YXRpb24gdG8gc29sdmUgZm9yIGBwMXlgOlxuICAgIC8vXG4gICAgLy8gICAocDF5LXAyeSkgKiAocDN5LXAyeSkgPSAtKChwMXgtcDJ4KSAqIChwM3gtcDJ4KSlcbiAgICAvLyAgIChwMXktcDJ5KSA9IC0oKHAxeC1wMngpICogKHAzeC1wMngpKSAvIChwM3ktcDJ5KVxuICAgIC8vICAgcDF5ID0gLSgocDF4LXAyeCkgKiAocDN4LXAyeCkpIC8gKHAzeS1wMnkpICsgcDJ5XG4gICAgLy9cbiAgICAvLyBUaGFua3MgdG8gbXkgZnJpZW5kIEpvZWwgV2Fsa2VyIChodHRwczovL2dpdGh1Yi5jb20vSldhbGtlcjE5OTUpIGZvclxuICAgIC8vIGRldmlzaW5nIHRoZSBhYm92ZSBlcXVhdGlvbiBhbmQgdW5pdCBjb29yZGluYXRlIHN5c3RlbSBhcHByb2FjaCFcbiAgICAvLyAoeCwgeSkgY29vcmRzIG9mIHRoZSBjaGVjayBtYXJrJ3MgYm90dG9tbW9zdCBwb2ludFxuICAgIHZhciBwMnggPSAtMSArIDAuNzU7XG4gICAgdmFyIHAyeSA9IC0xICsgMC41MTtcbiAgICAvLyAoeCwgeSkgY29vcmRzIG9mIHRoZSBjaGVjayBtYXJrJ3MgdG9wbW9zdCBwb2ludFxuICAgIHZhciBwM3kgPSAxIC0gMC41MjU7XG4gICAgdmFyIHAzeCA9IDEgLSAwLjMxO1xuICAgIC8vICh4LCB5KSBjb29yZHMgb2YgdGhlIGNoZWNrIG1hcmsncyBjZW50ZXIgKHZlcnRpY2FsbHkpIHBvaW50XG4gICAgdmFyIHAxeCA9IC0xICsgMC4zMjU7XG4gICAgdmFyIHAxeSA9IC0oKHAxeCAtIHAyeCkgKiAocDN4IC0gcDJ4KSkgLyAocDN5IC0gcDJ5KSArIHAyeTtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIHNldFN0cm9raW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIHNldExpbmVXaWR0aChvcHRpb25zLnRoaWNrbmVzcyksXG4gICAgICAgIHRyYW5zbGF0ZShvcHRpb25zLngsIG9wdGlvbnMueSksXG4gICAgICAgIG1vdmVUbyhwMXggKiBzaXplLCBwMXkgKiBzaXplKSxcbiAgICAgICAgbGluZVRvKHAyeCAqIHNpemUsIHAyeSAqIHNpemUpLFxuICAgICAgICBsaW5lVG8ocDN4ICogc2l6ZSwgcDN5ICogc2l6ZSksXG4gICAgICAgIHN0cm9rZSgpLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XG59O1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdmFyIHJvdGF0ZUluUGxhY2UgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zLnJvdGF0aW9uID09PSAwID8gW1xuICAgICAgICB0cmFuc2xhdGUoMCwgMCksXG4gICAgICAgIHJvdGF0ZURlZ3JlZXMoMClcbiAgICBdXG4gICAgICAgIDogb3B0aW9ucy5yb3RhdGlvbiA9PT0gOTAgPyBbXG4gICAgICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy53aWR0aCwgMCksXG4gICAgICAgICAgICByb3RhdGVEZWdyZWVzKDkwKVxuICAgICAgICBdXG4gICAgICAgICAgICA6IG9wdGlvbnMucm90YXRpb24gPT09IDE4MCA/IFtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQpLFxuICAgICAgICAgICAgICAgIHJvdGF0ZURlZ3JlZXMoMTgwKVxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5yb3RhdGlvbiA9PT0gMjcwID8gW1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUoMCwgb3B0aW9ucy5oZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICByb3RhdGVEZWdyZWVzKDI3MClcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIDogW107XG59OyAvLyBJbnZhbGlkIHJvdGF0aW9uIC0gbm9vcFxuZXhwb3J0IHZhciBkcmF3Q2hlY2tCb3ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBvdXRsaW5lID0gZHJhd1JlY3RhbmdsZSh7XG4gICAgICAgIHg6IG9wdGlvbnMueCxcbiAgICAgICAgeTogb3B0aW9ucy55LFxuICAgICAgICB3aWR0aDogb3B0aW9ucy53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBvcHRpb25zLmhlaWdodCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IG9wdGlvbnMuYm9yZGVyV2lkdGgsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLmNvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgaWYgKCFvcHRpb25zLmZpbGxlZClcbiAgICAgICAgcmV0dXJuIG91dGxpbmU7XG4gICAgdmFyIHdpZHRoID0gYXNOdW1iZXIob3B0aW9ucy53aWR0aCk7XG4gICAgdmFyIGhlaWdodCA9IGFzTnVtYmVyKG9wdGlvbnMuaGVpZ2h0KTtcbiAgICB2YXIgY2hlY2tNYXJrU2l6ZSA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gMjtcbiAgICB2YXIgY2hlY2tNYXJrID0gZHJhd0NoZWNrTWFyayh7XG4gICAgICAgIHg6IHdpZHRoIC8gMixcbiAgICAgICAgeTogaGVpZ2h0IC8gMixcbiAgICAgICAgc2l6ZTogY2hlY2tNYXJrU2l6ZSxcbiAgICAgICAgdGhpY2tuZXNzOiBvcHRpb25zLnRoaWNrbmVzcyxcbiAgICAgICAgY29sb3I6IG9wdGlvbnMubWFya0NvbG9yLFxuICAgIH0pO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbcHVzaEdyYXBoaWNzU3RhdGUoKV0sIG91dGxpbmUsIGNoZWNrTWFyaywgW3BvcEdyYXBoaWNzU3RhdGUoKV0pO1xufTtcbmV4cG9ydCB2YXIgZHJhd1JhZGlvQnV0dG9uID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgd2lkdGggPSBhc051bWJlcihvcHRpb25zLndpZHRoKTtcbiAgICB2YXIgaGVpZ2h0ID0gYXNOdW1iZXIob3B0aW9ucy5oZWlnaHQpO1xuICAgIHZhciBvdXRsaW5lU2NhbGUgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDI7XG4gICAgdmFyIG91dGxpbmUgPSBkcmF3RWxsaXBzZSh7XG4gICAgICAgIHg6IG9wdGlvbnMueCxcbiAgICAgICAgeTogb3B0aW9ucy55LFxuICAgICAgICB4U2NhbGU6IG91dGxpbmVTY2FsZSxcbiAgICAgICAgeVNjYWxlOiBvdXRsaW5lU2NhbGUsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLmNvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgYm9yZGVyV2lkdGg6IG9wdGlvbnMuYm9yZGVyV2lkdGgsXG4gICAgfSk7XG4gICAgaWYgKCFvcHRpb25zLmZpbGxlZClcbiAgICAgICAgcmV0dXJuIG91dGxpbmU7XG4gICAgdmFyIGRvdCA9IGRyYXdFbGxpcHNlKHtcbiAgICAgICAgeDogb3B0aW9ucy54LFxuICAgICAgICB5OiBvcHRpb25zLnksXG4gICAgICAgIHhTY2FsZTogb3V0bGluZVNjYWxlICogMC40NSxcbiAgICAgICAgeVNjYWxlOiBvdXRsaW5lU2NhbGUgKiAwLjQ1LFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5kb3RDb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IDAsXG4gICAgfSk7XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFtwdXNoR3JhcGhpY3NTdGF0ZSgpXSwgb3V0bGluZSwgZG90LCBbcG9wR3JhcGhpY3NTdGF0ZSgpXSk7XG59O1xuZXhwb3J0IHZhciBkcmF3QnV0dG9uID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgeCA9IGFzTnVtYmVyKG9wdGlvbnMueCk7XG4gICAgdmFyIHkgPSBhc051bWJlcihvcHRpb25zLnkpO1xuICAgIHZhciB3aWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSBhc051bWJlcihvcHRpb25zLmhlaWdodCk7XG4gICAgdmFyIGJhY2tncm91bmQgPSBkcmF3UmVjdGFuZ2xlKHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeSxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IG9wdGlvbnMuYm9yZGVyV2lkdGgsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLmNvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgdmFyIGxpbmVzID0gZHJhd1RleHRMaW5lcyhvcHRpb25zLnRleHRMaW5lcywge1xuICAgICAgICBjb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IG9wdGlvbnMuZm9udCxcbiAgICAgICAgc2l6ZTogb3B0aW9ucy5mb250U2l6ZSxcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFtwdXNoR3JhcGhpY3NTdGF0ZSgpXSwgYmFja2dyb3VuZCwgbGluZXMsIFtwb3BHcmFwaGljc1N0YXRlKCldKTtcbn07XG5leHBvcnQgdmFyIGRyYXdUZXh0TGluZXMgPSBmdW5jdGlvbiAobGluZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3BlcmF0b3JzID0gW1xuICAgICAgICBiZWdpblRleHQoKSxcbiAgICAgICAgc2V0RmlsbGluZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBzZXRGb250QW5kU2l6ZShvcHRpb25zLmZvbnQsIG9wdGlvbnMuc2l6ZSksXG4gICAgXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIF9hID0gbGluZXNbaWR4XSwgZW5jb2RlZCA9IF9hLmVuY29kZWQsIHggPSBfYS54LCB5ID0gX2EueTtcbiAgICAgICAgb3BlcmF0b3JzLnB1c2gocm90YXRlQW5kU2tld1RleHRSYWRpYW5zQW5kVHJhbnNsYXRlKHRvUmFkaWFucyhvcHRpb25zLnJvdGF0ZSksIHRvUmFkaWFucyhvcHRpb25zLnhTa2V3KSwgdG9SYWRpYW5zKG9wdGlvbnMueVNrZXcpLCB4LCB5KSwgc2hvd1RleHQoZW5jb2RlZCkpO1xuICAgIH1cbiAgICBvcGVyYXRvcnMucHVzaChlbmRUZXh0KCkpO1xuICAgIHJldHVybiBvcGVyYXRvcnM7XG59O1xuZXhwb3J0IHZhciBkcmF3VGV4dEZpZWxkID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgeCA9IGFzTnVtYmVyKG9wdGlvbnMueCk7XG4gICAgdmFyIHkgPSBhc051bWJlcihvcHRpb25zLnkpO1xuICAgIHZhciB3aWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSBhc051bWJlcihvcHRpb25zLmhlaWdodCk7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gYXNOdW1iZXIob3B0aW9ucy5ib3JkZXJXaWR0aCk7XG4gICAgdmFyIHBhZGRpbmcgPSBhc051bWJlcihvcHRpb25zLnBhZGRpbmcpO1xuICAgIHZhciBjbGlwWCA9IHggKyBib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBjbGlwWSA9IHkgKyBib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBjbGlwV2lkdGggPSB3aWR0aCAtIChib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nKSAqIDI7XG4gICAgdmFyIGNsaXBIZWlnaHQgPSBoZWlnaHQgLSAoYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZykgKiAyO1xuICAgIHZhciBjbGlwcGluZ0FyZWEgPSBbXG4gICAgICAgIG1vdmVUbyhjbGlwWCwgY2xpcFkpLFxuICAgICAgICBsaW5lVG8oY2xpcFgsIGNsaXBZICsgY2xpcEhlaWdodCksXG4gICAgICAgIGxpbmVUbyhjbGlwWCArIGNsaXBXaWR0aCwgY2xpcFkgKyBjbGlwSGVpZ2h0KSxcbiAgICAgICAgbGluZVRvKGNsaXBYICsgY2xpcFdpZHRoLCBjbGlwWSksXG4gICAgICAgIGNsb3NlUGF0aCgpLFxuICAgICAgICBjbGlwKCksXG4gICAgICAgIGVuZFBhdGgoKSxcbiAgICBdO1xuICAgIHZhciBiYWNrZ3JvdW5kID0gZHJhd1JlY3RhbmdsZSh7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIHZhciBsaW5lcyA9IGRyYXdUZXh0TGluZXMob3B0aW9ucy50ZXh0TGluZXMsIHtcbiAgICAgICAgY29sb3I6IG9wdGlvbnMudGV4dENvbG9yLFxuICAgICAgICBmb250OiBvcHRpb25zLmZvbnQsXG4gICAgICAgIHNpemU6IG9wdGlvbnMuZm9udFNpemUsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIHZhciBtYXJrZWRDb250ZW50ID0gX19zcHJlYWRBcnJheXMoW1xuICAgICAgICBiZWdpbk1hcmtlZENvbnRlbnQoJ1R4JyksXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKClcbiAgICBdLCBsaW5lcywgW1xuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIGVuZE1hcmtlZENvbnRlbnQoKSxcbiAgICBdKTtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpXG4gICAgXSwgYmFja2dyb3VuZCwgY2xpcHBpbmdBcmVhLCBtYXJrZWRDb250ZW50LCBbXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIGRyYXdPcHRpb25MaXN0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgeCA9IGFzTnVtYmVyKG9wdGlvbnMueCk7XG4gICAgdmFyIHkgPSBhc051bWJlcihvcHRpb25zLnkpO1xuICAgIHZhciB3aWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSBhc051bWJlcihvcHRpb25zLmhlaWdodCk7XG4gICAgdmFyIGxpbmVIZWlnaHQgPSBhc051bWJlcihvcHRpb25zLmxpbmVIZWlnaHQpO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMuYm9yZGVyV2lkdGgpO1xuICAgIHZhciBwYWRkaW5nID0gYXNOdW1iZXIob3B0aW9ucy5wYWRkaW5nKTtcbiAgICB2YXIgY2xpcFggPSB4ICsgYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZztcbiAgICB2YXIgY2xpcFkgPSB5ICsgYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZztcbiAgICB2YXIgY2xpcFdpZHRoID0gd2lkdGggLSAoYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZykgKiAyO1xuICAgIHZhciBjbGlwSGVpZ2h0ID0gaGVpZ2h0IC0gKGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmcpICogMjtcbiAgICB2YXIgY2xpcHBpbmdBcmVhID0gW1xuICAgICAgICBtb3ZlVG8oY2xpcFgsIGNsaXBZKSxcbiAgICAgICAgbGluZVRvKGNsaXBYLCBjbGlwWSArIGNsaXBIZWlnaHQpLFxuICAgICAgICBsaW5lVG8oY2xpcFggKyBjbGlwV2lkdGgsIGNsaXBZICsgY2xpcEhlaWdodCksXG4gICAgICAgIGxpbmVUbyhjbGlwWCArIGNsaXBXaWR0aCwgY2xpcFkpLFxuICAgICAgICBjbG9zZVBhdGgoKSxcbiAgICAgICAgY2xpcCgpLFxuICAgICAgICBlbmRQYXRoKCksXG4gICAgXTtcbiAgICB2YXIgYmFja2dyb3VuZCA9IGRyYXdSZWN0YW5nbGUoe1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcbiAgICAgICAgY29sb3I6IG9wdGlvbnMuY29sb3IsXG4gICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICB9KTtcbiAgICB2YXIgaGlnaGxpZ2h0cyA9IFtdO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMuc2VsZWN0ZWRMaW5lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBvcHRpb25zLnRleHRMaW5lc1tvcHRpb25zLnNlbGVjdGVkTGluZXNbaWR4XV07XG4gICAgICAgIGhpZ2hsaWdodHMucHVzaC5hcHBseShoaWdobGlnaHRzLCBkcmF3UmVjdGFuZ2xlKHtcbiAgICAgICAgICAgIHg6IGxpbmUueCAtIHBhZGRpbmcsXG4gICAgICAgICAgICB5OiBsaW5lLnkgLSAobGluZUhlaWdodCAtIGxpbmUuaGVpZ2h0KSAvIDIsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogbGluZS5oZWlnaHQgKyAobGluZUhlaWdodCAtIGxpbmUuaGVpZ2h0KSAvIDIsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogMCxcbiAgICAgICAgICAgIGNvbG9yOiBvcHRpb25zLnNlbGVjdGVkQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB2YXIgbGluZXMgPSBkcmF3VGV4dExpbmVzKG9wdGlvbnMudGV4dExpbmVzLCB7XG4gICAgICAgIGNvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgZm9udDogb3B0aW9ucy5mb250LFxuICAgICAgICBzaXplOiBvcHRpb25zLmZvbnRTaXplLFxuICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICB9KTtcbiAgICB2YXIgbWFya2VkQ29udGVudCA9IF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgYmVnaW5NYXJrZWRDb250ZW50KCdUeCcpLFxuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpXG4gICAgXSwgbGluZXMsIFtcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBlbmRNYXJrZWRDb250ZW50KCksXG4gICAgXSk7XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKVxuICAgIF0sIGJhY2tncm91bmQsIGhpZ2hsaWdodHMsIGNsaXBwaW5nQXJlYSwgbWFya2VkQ29udGVudCwgW1xuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3BlcmF0aW9ucy5qcy5tYXAiLCJpbXBvcnQgeyBhc051bWJlciwgYXNQREZOYW1lLCBhc1BERk51bWJlciB9IGZyb20gXCIuL29iamVjdHNcIjtcbmltcG9ydCB7IGRlZ3JlZXNUb1JhZGlhbnMgfSBmcm9tIFwiLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFBERk9wZXJhdG9yLCBQREZPcGVyYXRvck5hbWVzIGFzIE9wcywgfSBmcm9tIFwiLi4vY29yZVwiO1xuLyogPT09PT09PT09PT09PT09PT09PT0gQ2xpcHBpbmcgUGF0aCBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgY2xpcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5DbGlwTm9uWmVybyk7IH07XG5leHBvcnQgdmFyIGNsaXBFdmVuT2RkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkNsaXBFdmVuT2RkKTsgfTtcbi8qID09PT09PT09PT09PT09PT09PT09IEdyYXBoaWNzIFN0YXRlIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xudmFyIGNvcyA9IE1hdGguY29zLCBzaW4gPSBNYXRoLnNpbiwgdGFuID0gTWF0aC50YW47XG5leHBvcnQgdmFyIGNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4LCBbXG4gICAgICAgIGFzUERGTnVtYmVyKGEpLFxuICAgICAgICBhc1BERk51bWJlcihiKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYyksXG4gICAgICAgIGFzUERGTnVtYmVyKGQpLFxuICAgICAgICBhc1BERk51bWJlcihlKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZiksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciB0cmFuc2xhdGUgPSBmdW5jdGlvbiAoeFBvcywgeVBvcykge1xuICAgIHJldHVybiBjb25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeCgxLCAwLCAwLCAxLCB4UG9zLCB5UG9zKTtcbn07XG5leHBvcnQgdmFyIHNjYWxlID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MpIHtcbiAgICByZXR1cm4gY29uY2F0VHJhbnNmb3JtYXRpb25NYXRyaXgoeFBvcywgMCwgMCwgeVBvcywgMCwgMCk7XG59O1xuZXhwb3J0IHZhciByb3RhdGVSYWRpYW5zID0gZnVuY3Rpb24gKGFuZ2xlKSB7XG4gICAgcmV0dXJuIGNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4KGNvcyhhc051bWJlcihhbmdsZSkpLCBzaW4oYXNOdW1iZXIoYW5nbGUpKSwgLXNpbihhc051bWJlcihhbmdsZSkpLCBjb3MoYXNOdW1iZXIoYW5nbGUpKSwgMCwgMCk7XG59O1xuZXhwb3J0IHZhciByb3RhdGVEZWdyZWVzID0gZnVuY3Rpb24gKGFuZ2xlKSB7XG4gICAgcmV0dXJuIHJvdGF0ZVJhZGlhbnMoZGVncmVlc1RvUmFkaWFucyhhc051bWJlcihhbmdsZSkpKTtcbn07XG5leHBvcnQgdmFyIHNrZXdSYWRpYW5zID0gZnVuY3Rpb24gKHhTa2V3QW5nbGUsIHlTa2V3QW5nbGUpIHtcbiAgICByZXR1cm4gY29uY2F0VHJhbnNmb3JtYXRpb25NYXRyaXgoMSwgdGFuKGFzTnVtYmVyKHhTa2V3QW5nbGUpKSwgdGFuKGFzTnVtYmVyKHlTa2V3QW5nbGUpKSwgMSwgMCwgMCk7XG59O1xuZXhwb3J0IHZhciBza2V3RGVncmVlcyA9IGZ1bmN0aW9uICh4U2tld0FuZ2xlLCB5U2tld0FuZ2xlKSB7XG4gICAgcmV0dXJuIHNrZXdSYWRpYW5zKGRlZ3JlZXNUb1JhZGlhbnMoYXNOdW1iZXIoeFNrZXdBbmdsZSkpLCBkZWdyZWVzVG9SYWRpYW5zKGFzTnVtYmVyKHlTa2V3QW5nbGUpKSk7XG59O1xuZXhwb3J0IHZhciBzZXREYXNoUGF0dGVybiA9IGZ1bmN0aW9uIChkYXNoQXJyYXksIGRhc2hQaGFzZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0TGluZURhc2hQYXR0ZXJuLCBbXG4gICAgICAgIFwiW1wiICsgZGFzaEFycmF5Lm1hcChhc1BERk51bWJlcikuam9pbignICcpICsgXCJdXCIsXG4gICAgICAgIGFzUERGTnVtYmVyKGRhc2hQaGFzZSksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciByZXN0b3JlRGFzaFBhdHRlcm4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBzZXREYXNoUGF0dGVybihbXSwgMCk7IH07XG5leHBvcnQgdmFyIExpbmVDYXBTdHlsZTtcbihmdW5jdGlvbiAoTGluZUNhcFN0eWxlKSB7XG4gICAgTGluZUNhcFN0eWxlW0xpbmVDYXBTdHlsZVtcIkJ1dHRcIl0gPSAwXSA9IFwiQnV0dFwiO1xuICAgIExpbmVDYXBTdHlsZVtMaW5lQ2FwU3R5bGVbXCJSb3VuZFwiXSA9IDFdID0gXCJSb3VuZFwiO1xuICAgIExpbmVDYXBTdHlsZVtMaW5lQ2FwU3R5bGVbXCJQcm9qZWN0aW5nXCJdID0gMl0gPSBcIlByb2plY3RpbmdcIjtcbn0pKExpbmVDYXBTdHlsZSB8fCAoTGluZUNhcFN0eWxlID0ge30pKTtcbmV4cG9ydCB2YXIgc2V0TGluZUNhcCA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0TGluZUNhcFN0eWxlLCBbYXNQREZOdW1iZXIoc3R5bGUpXSk7XG59O1xuZXhwb3J0IHZhciBMaW5lSm9pblN0eWxlO1xuKGZ1bmN0aW9uIChMaW5lSm9pblN0eWxlKSB7XG4gICAgTGluZUpvaW5TdHlsZVtMaW5lSm9pblN0eWxlW1wiTWl0ZXJcIl0gPSAwXSA9IFwiTWl0ZXJcIjtcbiAgICBMaW5lSm9pblN0eWxlW0xpbmVKb2luU3R5bGVbXCJSb3VuZFwiXSA9IDFdID0gXCJSb3VuZFwiO1xuICAgIExpbmVKb2luU3R5bGVbTGluZUpvaW5TdHlsZVtcIkJldmVsXCJdID0gMl0gPSBcIkJldmVsXCI7XG59KShMaW5lSm9pblN0eWxlIHx8IChMaW5lSm9pblN0eWxlID0ge30pKTtcbmV4cG9ydCB2YXIgc2V0TGluZUpvaW4gPSBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldExpbmVKb2luU3R5bGUsIFthc1BERk51bWJlcihzdHlsZSldKTtcbn07XG5leHBvcnQgdmFyIHNldEdyYXBoaWNzU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldEdyYXBoaWNzU3RhdGVQYXJhbXMsIFthc1BERk5hbWUoc3RhdGUpXSk7XG59O1xuZXhwb3J0IHZhciBwdXNoR3JhcGhpY3NTdGF0ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5QdXNoR3JhcGhpY3NTdGF0ZSk7IH07XG5leHBvcnQgdmFyIHBvcEdyYXBoaWNzU3RhdGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuUG9wR3JhcGhpY3NTdGF0ZSk7IH07XG5leHBvcnQgdmFyIHNldExpbmVXaWR0aCA9IGZ1bmN0aW9uICh3aWR0aCkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0TGluZVdpZHRoLCBbYXNQREZOdW1iZXIod2lkdGgpXSk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT0gUGF0aCBDb25zdHJ1Y3Rpb24gT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIGFwcGVuZEJlemllckN1cnZlID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkFwcGVuZEJlemllckN1cnZlLCBbXG4gICAgICAgIGFzUERGTnVtYmVyKHgxKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeTEpLFxuICAgICAgICBhc1BERk51bWJlcih4MiksXG4gICAgICAgIGFzUERGTnVtYmVyKHkyKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeDMpLFxuICAgICAgICBhc1BERk51bWJlcih5MyksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBhcHBlbmRRdWFkcmF0aWNDdXJ2ZSA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5Mikge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQ3VydmVUb1JlcGxpY2F0ZUluaXRpYWxQb2ludCwgW1xuICAgICAgICBhc1BERk51bWJlcih4MSksXG4gICAgICAgIGFzUERGTnVtYmVyKHkxKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeDIpLFxuICAgICAgICBhc1BERk51bWJlcih5MiksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBjbG9zZVBhdGggPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQ2xvc2VQYXRoKTsgfTtcbmV4cG9ydCB2YXIgbW92ZVRvID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLk1vdmVUbywgW2FzUERGTnVtYmVyKHhQb3MpLCBhc1BERk51bWJlcih5UG9zKV0pO1xufTtcbmV4cG9ydCB2YXIgbGluZVRvID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkxpbmVUbywgW2FzUERGTnVtYmVyKHhQb3MpLCBhc1BERk51bWJlcih5UG9zKV0pO1xufTtcbi8qKlxuICogQHBhcmFtIHhQb3MgeCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZVxuICogQHBhcmFtIHlQb3MgeSBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZVxuICogQHBhcmFtIHdpZHRoIHdpZHRoIG9mIHRoZSByZWN0YW5nbGVcbiAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGVcbiAqL1xuZXhwb3J0IHZhciByZWN0YW5nbGUgPSBmdW5jdGlvbiAoeFBvcywgeVBvcywgd2lkdGgsIGhlaWdodCkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQXBwZW5kUmVjdGFuZ2xlLCBbXG4gICAgICAgIGFzUERGTnVtYmVyKHhQb3MpLFxuICAgICAgICBhc1BERk51bWJlcih5UG9zKSxcbiAgICAgICAgYXNQREZOdW1iZXIod2lkdGgpLFxuICAgICAgICBhc1BERk51bWJlcihoZWlnaHQpLFxuICAgIF0pO1xufTtcbi8qKlxuICogQHBhcmFtIHhQb3MgeCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNxdWFyZVxuICogQHBhcmFtIHlQb3MgeSBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNxdWFyZVxuICogQHBhcmFtIHNpemUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3F1YXJlXG4gKi9cbmV4cG9ydCB2YXIgc3F1YXJlID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MsIHNpemUpIHtcbiAgICByZXR1cm4gcmVjdGFuZ2xlKHhQb3MsIHlQb3MsIHNpemUsIHNpemUpO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IFBhdGggUGFpbnRpbmcgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIHN0cm9rZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TdHJva2VQYXRoKTsgfTtcbmV4cG9ydCB2YXIgZmlsbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5GaWxsTm9uWmVybyk7IH07XG5leHBvcnQgdmFyIGZpbGxBbmRTdHJva2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuRmlsbE5vblplcm9BbmRTdHJva2UpOyB9O1xuZXhwb3J0IHZhciBlbmRQYXRoID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkVuZFBhdGgpOyB9O1xuLyogPT09PT09PT09PT09PT09PT09PT0gVGV4dCBQb3NpdGlvbmluZyBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgbmV4dExpbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuTmV4dExpbmUpOyB9O1xuZXhwb3J0IHZhciBtb3ZlVGV4dCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Nb3ZlVGV4dCwgW2FzUERGTnVtYmVyKHgpLCBhc1BERk51bWJlcih5KV0pO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IFRleHQgU2hvd2luZyBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgc2hvd1RleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2hvd1RleHQsIFt0ZXh0XSk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT0gVGV4dCBTdGF0ZSBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgYmVnaW5UZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkJlZ2luVGV4dCk7IH07XG5leHBvcnQgdmFyIGVuZFRleHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuRW5kVGV4dCk7IH07XG5leHBvcnQgdmFyIHNldEZvbnRBbmRTaXplID0gZnVuY3Rpb24gKG5hbWUsIHNpemUpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRGb250QW5kU2l6ZSwgW2FzUERGTmFtZShuYW1lKSwgYXNQREZOdW1iZXIoc2l6ZSldKTsgfTtcbmV4cG9ydCB2YXIgc2V0Q2hhcmFjdGVyU3BhY2luZyA9IGZ1bmN0aW9uIChzcGFjaW5nKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRDaGFyYWN0ZXJTcGFjaW5nLCBbYXNQREZOdW1iZXIoc3BhY2luZyldKTtcbn07XG5leHBvcnQgdmFyIHNldFdvcmRTcGFjaW5nID0gZnVuY3Rpb24gKHNwYWNpbmcpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldFdvcmRTcGFjaW5nLCBbYXNQREZOdW1iZXIoc3BhY2luZyldKTtcbn07XG4vKiogQHBhcmFtIHNxdWVlemUgaG9yaXpvbnRhbCBjaGFyYWN0ZXIgc3BhY2luZyAqL1xuZXhwb3J0IHZhciBzZXRDaGFyYWN0ZXJTcXVlZXplID0gZnVuY3Rpb24gKHNxdWVlemUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldFRleHRIb3Jpem9udGFsU2NhbGluZywgW2FzUERGTnVtYmVyKHNxdWVlemUpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRMaW5lSGVpZ2h0ID0gZnVuY3Rpb24gKGxpbmVIZWlnaHQpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldFRleHRMaW5lSGVpZ2h0LCBbYXNQREZOdW1iZXIobGluZUhlaWdodCldKTtcbn07XG5leHBvcnQgdmFyIHNldFRleHRSaXNlID0gZnVuY3Rpb24gKHJpc2UpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldFRleHRSaXNlLCBbYXNQREZOdW1iZXIocmlzZSldKTtcbn07XG5leHBvcnQgdmFyIFRleHRSZW5kZXJpbmdNb2RlO1xuKGZ1bmN0aW9uIChUZXh0UmVuZGVyaW5nTW9kZSkge1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiRmlsbFwiXSA9IDBdID0gXCJGaWxsXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJPdXRsaW5lXCJdID0gMV0gPSBcIk91dGxpbmVcIjtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIkZpbGxBbmRPdXRsaW5lXCJdID0gMl0gPSBcIkZpbGxBbmRPdXRsaW5lXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJJbnZpc2libGVcIl0gPSAzXSA9IFwiSW52aXNpYmxlXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJGaWxsQW5kQ2xpcFwiXSA9IDRdID0gXCJGaWxsQW5kQ2xpcFwiO1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiT3V0bGluZUFuZENsaXBcIl0gPSA1XSA9IFwiT3V0bGluZUFuZENsaXBcIjtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIkZpbGxBbmRPdXRsaW5lQW5kQ2xpcFwiXSA9IDZdID0gXCJGaWxsQW5kT3V0bGluZUFuZENsaXBcIjtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIkNsaXBcIl0gPSA3XSA9IFwiQ2xpcFwiO1xufSkoVGV4dFJlbmRlcmluZ01vZGUgfHwgKFRleHRSZW5kZXJpbmdNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgc2V0VGV4dFJlbmRlcmluZ01vZGUgPSBmdW5jdGlvbiAobW9kZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0VGV4dFJlbmRlcmluZ01vZGUsIFthc1BERk51bWJlcihtb2RlKV0pO1xufTtcbmV4cG9ydCB2YXIgc2V0VGV4dE1hdHJpeCA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRUZXh0TWF0cml4LCBbXG4gICAgICAgIGFzUERGTnVtYmVyKGEpLFxuICAgICAgICBhc1BERk51bWJlcihiKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYyksXG4gICAgICAgIGFzUERGTnVtYmVyKGQpLFxuICAgICAgICBhc1BERk51bWJlcihlKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZiksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciByb3RhdGVBbmRTa2V3VGV4dFJhZGlhbnNBbmRUcmFuc2xhdGUgPSBmdW5jdGlvbiAocm90YXRpb25BbmdsZSwgeFNrZXdBbmdsZSwgeVNrZXdBbmdsZSwgeCwgeSkge1xuICAgIHJldHVybiBzZXRUZXh0TWF0cml4KGNvcyhhc051bWJlcihyb3RhdGlvbkFuZ2xlKSksIHNpbihhc051bWJlcihyb3RhdGlvbkFuZ2xlKSkgKyB0YW4oYXNOdW1iZXIoeFNrZXdBbmdsZSkpLCAtc2luKGFzTnVtYmVyKHJvdGF0aW9uQW5nbGUpKSArIHRhbihhc051bWJlcih5U2tld0FuZ2xlKSksIGNvcyhhc051bWJlcihyb3RhdGlvbkFuZ2xlKSksIHgsIHkpO1xufTtcbmV4cG9ydCB2YXIgcm90YXRlQW5kU2tld1RleHREZWdyZWVzQW5kVHJhbnNsYXRlID0gZnVuY3Rpb24gKHJvdGF0aW9uQW5nbGUsIHhTa2V3QW5nbGUsIHlTa2V3QW5nbGUsIHgsIHkpIHtcbiAgICByZXR1cm4gcm90YXRlQW5kU2tld1RleHRSYWRpYW5zQW5kVHJhbnNsYXRlKGRlZ3JlZXNUb1JhZGlhbnMoYXNOdW1iZXIocm90YXRpb25BbmdsZSkpLCBkZWdyZWVzVG9SYWRpYW5zKGFzTnVtYmVyKHhTa2V3QW5nbGUpKSwgZGVncmVlc1RvUmFkaWFucyhhc051bWJlcih5U2tld0FuZ2xlKSksIHgsIHkpO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IFhPYmplY3QgT3BlcmF0b3IgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgZHJhd09iamVjdCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5EcmF3T2JqZWN0LCBbYXNQREZOYW1lKG5hbWUpXSk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT0gQ29sb3IgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIHNldEZpbGxpbmdHcmF5c2NhbGVDb2xvciA9IGZ1bmN0aW9uIChncmF5KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Ob25TdHJva2luZ0NvbG9yR3JheSwgW2FzUERGTnVtYmVyKGdyYXkpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRTdHJva2luZ0dyYXlzY2FsZUNvbG9yID0gZnVuY3Rpb24gKGdyYXkpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlN0cm9raW5nQ29sb3JHcmF5LCBbYXNQREZOdW1iZXIoZ3JheSldKTtcbn07XG5leHBvcnQgdmFyIHNldEZpbGxpbmdSZ2JDb2xvciA9IGZ1bmN0aW9uIChyZWQsIGdyZWVuLCBibHVlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Ob25TdHJva2luZ0NvbG9yUmdiLCBbXG4gICAgICAgIGFzUERGTnVtYmVyKHJlZCksXG4gICAgICAgIGFzUERGTnVtYmVyKGdyZWVuKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYmx1ZSksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBzZXRTdHJva2luZ1JnYkNvbG9yID0gZnVuY3Rpb24gKHJlZCwgZ3JlZW4sIGJsdWUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlN0cm9raW5nQ29sb3JSZ2IsIFtcbiAgICAgICAgYXNQREZOdW1iZXIocmVkKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZ3JlZW4pLFxuICAgICAgICBhc1BERk51bWJlcihibHVlKSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIHNldEZpbGxpbmdDbXlrQ29sb3IgPSBmdW5jdGlvbiAoY3lhbiwgbWFnZW50YSwgeWVsbG93LCBrZXkpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLk5vblN0cm9raW5nQ29sb3JDbXlrLCBbXG4gICAgICAgIGFzUERGTnVtYmVyKGN5YW4pLFxuICAgICAgICBhc1BERk51bWJlcihtYWdlbnRhKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeWVsbG93KSxcbiAgICAgICAgYXNQREZOdW1iZXIoa2V5KSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIHNldFN0cm9raW5nQ215a0NvbG9yID0gZnVuY3Rpb24gKGN5YW4sIG1hZ2VudGEsIHllbGxvdywga2V5KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TdHJva2luZ0NvbG9yQ215aywgW1xuICAgICAgICBhc1BERk51bWJlcihjeWFuKSxcbiAgICAgICAgYXNQREZOdW1iZXIobWFnZW50YSksXG4gICAgICAgIGFzUERGTnVtYmVyKHllbGxvdyksXG4gICAgICAgIGFzUERGTnVtYmVyKGtleSksXG4gICAgXSk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT0gTWFya2VkIENvbnRlbnQgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIGJlZ2luTWFya2VkQ29udGVudCA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkJlZ2luTWFya2VkQ29udGVudCwgW2FzUERGTmFtZSh0YWcpXSk7XG59O1xuZXhwb3J0IHZhciBlbmRNYXJrZWRDb250ZW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkVuZE1hcmtlZENvbnRlbnQpOyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3BlcmF0b3JzLmpzLm1hcCIsImltcG9ydCB7IGFzc2VydElzLCBlcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuZXhwb3J0IHZhciBSb3RhdGlvblR5cGVzO1xuKGZ1bmN0aW9uIChSb3RhdGlvblR5cGVzKSB7XG4gICAgUm90YXRpb25UeXBlc1tcIkRlZ3JlZXNcIl0gPSBcImRlZ3JlZXNcIjtcbiAgICBSb3RhdGlvblR5cGVzW1wiUmFkaWFuc1wiXSA9IFwicmFkaWFuc1wiO1xufSkoUm90YXRpb25UeXBlcyB8fCAoUm90YXRpb25UeXBlcyA9IHt9KSk7XG5leHBvcnQgdmFyIHJhZGlhbnMgPSBmdW5jdGlvbiAocmFkaWFuQW5nbGUpIHtcbiAgICBhc3NlcnRJcyhyYWRpYW5BbmdsZSwgJ3JhZGlhbkFuZ2xlJywgWydudW1iZXInXSk7XG4gICAgcmV0dXJuIHsgdHlwZTogUm90YXRpb25UeXBlcy5SYWRpYW5zLCBhbmdsZTogcmFkaWFuQW5nbGUgfTtcbn07XG5leHBvcnQgdmFyIGRlZ3JlZXMgPSBmdW5jdGlvbiAoZGVncmVlQW5nbGUpIHtcbiAgICBhc3NlcnRJcyhkZWdyZWVBbmdsZSwgJ2RlZ3JlZUFuZ2xlJywgWydudW1iZXInXSk7XG4gICAgcmV0dXJuIHsgdHlwZTogUm90YXRpb25UeXBlcy5EZWdyZWVzLCBhbmdsZTogZGVncmVlQW5nbGUgfTtcbn07XG52YXIgUmFkaWFucyA9IFJvdGF0aW9uVHlwZXMuUmFkaWFucywgRGVncmVlcyA9IFJvdGF0aW9uVHlwZXMuRGVncmVlcztcbmV4cG9ydCB2YXIgZGVncmVlc1RvUmFkaWFucyA9IGZ1bmN0aW9uIChkZWdyZWUpIHsgcmV0dXJuIChkZWdyZWUgKiBNYXRoLlBJKSAvIDE4MDsgfTtcbmV4cG9ydCB2YXIgcmFkaWFuc1RvRGVncmVlcyA9IGZ1bmN0aW9uIChyYWRpYW4pIHsgcmV0dXJuIChyYWRpYW4gKiAxODApIC8gTWF0aC5QSTsgfTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciB0b1JhZGlhbnMgPSBmdW5jdGlvbiAocm90YXRpb24pIHtcbiAgICByZXR1cm4gcm90YXRpb24udHlwZSA9PT0gUmFkaWFucyA/IHJvdGF0aW9uLmFuZ2xlXG4gICAgICAgIDogcm90YXRpb24udHlwZSA9PT0gRGVncmVlcyA/IGRlZ3JlZXNUb1JhZGlhbnMocm90YXRpb24uYW5nbGUpXG4gICAgICAgICAgICA6IGVycm9yKFwiSW52YWxpZCByb3RhdGlvbjogXCIgKyBKU09OLnN0cmluZ2lmeShyb3RhdGlvbikpO1xufTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciB0b0RlZ3JlZXMgPSBmdW5jdGlvbiAocm90YXRpb24pIHtcbiAgICByZXR1cm4gcm90YXRpb24udHlwZSA9PT0gUmFkaWFucyA/IHJhZGlhbnNUb0RlZ3JlZXMocm90YXRpb24uYW5nbGUpXG4gICAgICAgIDogcm90YXRpb24udHlwZSA9PT0gRGVncmVlcyA/IHJvdGF0aW9uLmFuZ2xlXG4gICAgICAgICAgICA6IGVycm9yKFwiSW52YWxpZCByb3RhdGlvbjogXCIgKyBKU09OLnN0cmluZ2lmeShyb3RhdGlvbikpO1xufTtcbmV4cG9ydCB2YXIgcmVkdWNlUm90YXRpb24gPSBmdW5jdGlvbiAoZGVncmVlQW5nbGUpIHtcbiAgICBpZiAoZGVncmVlQW5nbGUgPT09IHZvaWQgMCkgeyBkZWdyZWVBbmdsZSA9IDA7IH1cbiAgICB2YXIgcXVhZHJhbnRzID0gKGRlZ3JlZUFuZ2xlIC8gOTApICUgNDtcbiAgICBpZiAocXVhZHJhbnRzID09PSAwKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBpZiAocXVhZHJhbnRzID09PSAxKVxuICAgICAgICByZXR1cm4gOTA7XG4gICAgaWYgKHF1YWRyYW50cyA9PT0gMilcbiAgICAgICAgcmV0dXJuIDE4MDtcbiAgICBpZiAocXVhZHJhbnRzID09PSAzKVxuICAgICAgICByZXR1cm4gMjcwO1xuICAgIHJldHVybiAwOyAvLyBgZGVncmVlQW5nbGVgIGlzIG5vdCBhIG11bHRpcGxlIG9mIDkwXG59O1xuZXhwb3J0IHZhciBhZGp1c3REaW1zRm9yUm90YXRpb24gPSBmdW5jdGlvbiAoZGltcywgZGVncmVlQW5nbGUpIHtcbiAgICBpZiAoZGVncmVlQW5nbGUgPT09IHZvaWQgMCkgeyBkZWdyZWVBbmdsZSA9IDA7IH1cbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihkZWdyZWVBbmdsZSk7XG4gICAgcmV0dXJuIHJvdGF0aW9uID09PSA5MCB8fCByb3RhdGlvbiA9PT0gMjcwXG4gICAgICAgID8geyB3aWR0aDogZGltcy5oZWlnaHQsIGhlaWdodDogZGltcy53aWR0aCB9XG4gICAgICAgIDogeyB3aWR0aDogZGltcy53aWR0aCwgaGVpZ2h0OiBkaW1zLmhlaWdodCB9O1xufTtcbmV4cG9ydCB2YXIgcm90YXRlUmVjdGFuZ2xlID0gZnVuY3Rpb24gKHJlY3RhbmdsZSwgYm9yZGVyV2lkdGgsIGRlZ3JlZUFuZ2xlKSB7XG4gICAgaWYgKGJvcmRlcldpZHRoID09PSB2b2lkIDApIHsgYm9yZGVyV2lkdGggPSAwOyB9XG4gICAgaWYgKGRlZ3JlZUFuZ2xlID09PSB2b2lkIDApIHsgZGVncmVlQW5nbGUgPSAwOyB9XG4gICAgdmFyIHggPSByZWN0YW5nbGUueCwgeSA9IHJlY3RhbmdsZS55LCB3ID0gcmVjdGFuZ2xlLndpZHRoLCBoID0gcmVjdGFuZ2xlLmhlaWdodDtcbiAgICB2YXIgciA9IHJlZHVjZVJvdGF0aW9uKGRlZ3JlZUFuZ2xlKTtcbiAgICB2YXIgYiA9IGJvcmRlcldpZHRoIC8gMjtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBpZiAociA9PT0gMClcbiAgICAgICAgcmV0dXJuIHsgeDogeCAtIGIsIHk6IHkgLSBiLCB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG4gICAgZWxzZSBpZiAociA9PT0gOTApXG4gICAgICAgIHJldHVybiB7IHg6IHggLSBoICsgYiwgeTogeSAtIGIsIHdpZHRoOiBoLCBoZWlnaHQ6IHcgfTtcbiAgICBlbHNlIGlmIChyID09PSAxODApXG4gICAgICAgIHJldHVybiB7IHg6IHggLSB3ICsgYiwgeTogeSAtIGggKyBiLCB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG4gICAgZWxzZSBpZiAociA9PT0gMjcwKVxuICAgICAgICByZXR1cm4geyB4OiB4IC0gYiwgeTogeSAtIHcgKyBiLCB3aWR0aDogaCwgaGVpZ2h0OiB3IH07XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4geyB4OiB4IC0gYiwgeTogeSAtIGIsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yb3RhdGlvbnMuanMubWFwIiwiZXhwb3J0IHZhciBQYWdlU2l6ZXMgPSB7XG4gICAgJzRBMCc6IFs0NzY3Ljg3LCA2NzQwLjc5XSxcbiAgICAnMkEwJzogWzMzNzAuMzksIDQ3NjcuODddLFxuICAgIEEwOiBbMjM4My45NCwgMzM3MC4zOV0sXG4gICAgQTE6IFsxNjgzLjc4LCAyMzgzLjk0XSxcbiAgICBBMjogWzExOTAuNTUsIDE2ODMuNzhdLFxuICAgIEEzOiBbODQxLjg5LCAxMTkwLjU1XSxcbiAgICBBNDogWzU5NS4yOCwgODQxLjg5XSxcbiAgICBBNTogWzQxOS41MywgNTk1LjI4XSxcbiAgICBBNjogWzI5Ny42NCwgNDE5LjUzXSxcbiAgICBBNzogWzIwOS43NiwgMjk3LjY0XSxcbiAgICBBODogWzE0Ny40LCAyMDkuNzZdLFxuICAgIEE5OiBbMTA0Ljg4LCAxNDcuNF0sXG4gICAgQTEwOiBbNzMuNywgMTA0Ljg4XSxcbiAgICBCMDogWzI4MzQuNjUsIDQwMDguMTldLFxuICAgIEIxOiBbMjAwNC4wOSwgMjgzNC42NV0sXG4gICAgQjI6IFsxNDE3LjMyLCAyMDA0LjA5XSxcbiAgICBCMzogWzEwMDAuNjMsIDE0MTcuMzJdLFxuICAgIEI0OiBbNzA4LjY2LCAxMDAwLjYzXSxcbiAgICBCNTogWzQ5OC45LCA3MDguNjZdLFxuICAgIEI2OiBbMzU0LjMzLCA0OTguOV0sXG4gICAgQjc6IFsyNDkuNDUsIDM1NC4zM10sXG4gICAgQjg6IFsxNzUuNzUsIDI0OS40NV0sXG4gICAgQjk6IFsxMjQuNzIsIDE3NS43NV0sXG4gICAgQjEwOiBbODcuODcsIDEyNC43Ml0sXG4gICAgQzA6IFsyNTk5LjM3LCAzNjc2LjU0XSxcbiAgICBDMTogWzE4MzYuODUsIDI1OTkuMzddLFxuICAgIEMyOiBbMTI5OC4yNywgMTgzNi44NV0sXG4gICAgQzM6IFs5MTguNDMsIDEyOTguMjddLFxuICAgIEM0OiBbNjQ5LjEzLCA5MTguNDNdLFxuICAgIEM1OiBbNDU5LjIxLCA2NDkuMTNdLFxuICAgIEM2OiBbMzIzLjE1LCA0NTkuMjFdLFxuICAgIEM3OiBbMjI5LjYxLCAzMjMuMTVdLFxuICAgIEM4OiBbMTYxLjU3LCAyMjkuNjFdLFxuICAgIEM5OiBbMTEzLjM5LCAxNjEuNTddLFxuICAgIEMxMDogWzc5LjM3LCAxMTMuMzldLFxuICAgIFJBMDogWzI0MzcuOCwgMzQ1OC4yN10sXG4gICAgUkExOiBbMTcyOS4xMywgMjQzNy44XSxcbiAgICBSQTI6IFsxMjE4LjksIDE3MjkuMTNdLFxuICAgIFJBMzogWzg2NC41NywgMTIxOC45XSxcbiAgICBSQTQ6IFs2MDkuNDUsIDg2NC41N10sXG4gICAgU1JBMDogWzI1NTEuMTgsIDM2MjguMzVdLFxuICAgIFNSQTE6IFsxODE0LjE3LCAyNTUxLjE4XSxcbiAgICBTUkEyOiBbMTI3NS41OSwgMTgxNC4xN10sXG4gICAgU1JBMzogWzkwNy4wOSwgMTI3NS41OV0sXG4gICAgU1JBNDogWzYzNy44LCA5MDcuMDldLFxuICAgIEV4ZWN1dGl2ZTogWzUyMS44NiwgNzU2LjBdLFxuICAgIEZvbGlvOiBbNjEyLjAsIDkzNi4wXSxcbiAgICBMZWdhbDogWzYxMi4wLCAxMDA4LjBdLFxuICAgIExldHRlcjogWzYxMi4wLCA3OTIuMF0sXG4gICAgVGFibG9pZDogWzc5Mi4wLCAxMjI0LjBdLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpemVzLmpzLm1hcCIsIi8vIE9yaWdpbmF0ZWQgZnJvbSBwZGZraXQgQ29weXJpZ2h0IChjKSAyMDE0IERldm9uIEdvdmV0dFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0L2Jsb2IvMWU2MmU2ZmZlMjRiMzc4ZWI4OTBkZjUwN2E0NzYxMGY0YzRhN2IyNC9saWIvcGF0aC5qc1xuLy8gTUlUIExJQ0VOU0Vcbi8vIFVwZGF0ZWQgZm9yIHBkZi1saWIgJiBUeXBlU2NyaXB0IGJ5IEplcmVteSBNZXNzZW5nZXJcbmltcG9ydCB7IGFwcGVuZEJlemllckN1cnZlLCBhcHBlbmRRdWFkcmF0aWNDdXJ2ZSwgY2xvc2VQYXRoLCBsaW5lVG8sIG1vdmVUbywgfSBmcm9tIFwiLi9vcGVyYXRvcnNcIjtcbnZhciBjeCA9IDA7XG52YXIgY3kgPSAwO1xudmFyIHB4ID0gMDtcbnZhciBweSA9IDA7XG52YXIgc3ggPSAwO1xudmFyIHN5ID0gMDtcbnZhciBwYXJhbWV0ZXJzID0gbmV3IE1hcChbXG4gICAgWydBJywgN10sXG4gICAgWydhJywgN10sXG4gICAgWydDJywgNl0sXG4gICAgWydjJywgNl0sXG4gICAgWydIJywgMV0sXG4gICAgWydoJywgMV0sXG4gICAgWydMJywgMl0sXG4gICAgWydsJywgMl0sXG4gICAgWydNJywgMl0sXG4gICAgWydtJywgMl0sXG4gICAgWydRJywgNF0sXG4gICAgWydxJywgNF0sXG4gICAgWydTJywgNF0sXG4gICAgWydzJywgNF0sXG4gICAgWydUJywgMl0sXG4gICAgWyd0JywgMl0sXG4gICAgWydWJywgMV0sXG4gICAgWyd2JywgMV0sXG4gICAgWydaJywgMF0sXG4gICAgWyd6JywgMF0sXG5dKTtcbnZhciBwYXJzZSA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgdmFyIGNtZDtcbiAgICB2YXIgcmV0ID0gW107XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgY3VyQXJnID0gJyc7XG4gICAgdmFyIGZvdW5kRGVjaW1hbCA9IGZhbHNlO1xuICAgIHZhciBwYXJhbXMgPSAwO1xuICAgIGZvciAodmFyIF9pID0gMCwgcGF0aF8xID0gcGF0aDsgX2kgPCBwYXRoXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBjID0gcGF0aF8xW19pXTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuaGFzKGMpKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbWV0ZXJzLmdldChjKTtcbiAgICAgICAgICAgIGlmIChjbWQpIHtcbiAgICAgICAgICAgICAgICAvLyBzYXZlIGV4aXN0aW5nIGNvbW1hbmRcbiAgICAgICAgICAgICAgICBpZiAoY3VyQXJnLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aF0gPSArY3VyQXJnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXRbcmV0Lmxlbmd0aF0gPSB7IGNtZDogY21kLCBhcmdzOiBhcmdzIH07XG4gICAgICAgICAgICAgICAgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIGN1ckFyZyA9ICcnO1xuICAgICAgICAgICAgICAgIGZvdW5kRGVjaW1hbCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY21kID0gYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChbJyAnLCAnLCddLmluY2x1ZGVzKGMpIHx8XG4gICAgICAgICAgICAoYyA9PT0gJy0nICYmIGN1ckFyZy5sZW5ndGggPiAwICYmIGN1ckFyZ1tjdXJBcmcubGVuZ3RoIC0gMV0gIT09ICdlJykgfHxcbiAgICAgICAgICAgIChjID09PSAnLicgJiYgZm91bmREZWNpbWFsKSkge1xuICAgICAgICAgICAgaWYgKGN1ckFyZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gcGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIHJldXNlZCBjb21tYW5kc1xuICAgICAgICAgICAgICAgIHJldFtyZXQubGVuZ3RoXSA9IHsgY21kOiBjbWQsIGFyZ3M6IGFyZ3MgfTtcbiAgICAgICAgICAgICAgICBhcmdzID0gWytjdXJBcmddO1xuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhc3N1bWVkIGNvbW1hbmRzXG4gICAgICAgICAgICAgICAgaWYgKGNtZCA9PT0gJ00nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCA9ICdMJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNtZCA9PT0gJ20nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCA9ICdsJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcmdzW2FyZ3MubGVuZ3RoXSA9ICtjdXJBcmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3VuZERlY2ltYWwgPSBjID09PSAnLic7XG4gICAgICAgICAgICAvLyBmaXggZm9yIG5lZ2F0aXZlIG51bWJlcnMgb3IgcmVwZWF0ZWQgZGVjaW1hbHMgd2l0aCBubyBkZWxpbWV0ZXIgYmV0d2VlbiBjb21tYW5kc1xuICAgICAgICAgICAgY3VyQXJnID0gWyctJywgJy4nXS5pbmNsdWRlcyhjKSA/IGMgOiAnJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1ckFyZyArPSBjO1xuICAgICAgICAgICAgaWYgKGMgPT09ICcuJykge1xuICAgICAgICAgICAgICAgIGZvdW5kRGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYWRkIHRoZSBsYXN0IGNvbW1hbmRcbiAgICBpZiAoY3VyQXJnLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSBwYXJhbXMpIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSByZXVzZWQgY29tbWFuZHNcbiAgICAgICAgICAgIHJldFtyZXQubGVuZ3RoXSA9IHsgY21kOiBjbWQsIGFyZ3M6IGFyZ3MgfTtcbiAgICAgICAgICAgIGFyZ3MgPSBbK2N1ckFyZ107XG4gICAgICAgICAgICAvLyBoYW5kbGUgYXNzdW1lZCBjb21tYW5kc1xuICAgICAgICAgICAgaWYgKGNtZCA9PT0gJ00nKSB7XG4gICAgICAgICAgICAgICAgY21kID0gJ0wnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNtZCA9PT0gJ20nKSB7XG4gICAgICAgICAgICAgICAgY21kID0gJ2wnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aF0gPSArY3VyQXJnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldFtyZXQubGVuZ3RoXSA9IHsgY21kOiBjbWQsIGFyZ3M6IGFyZ3MgfTtcbiAgICByZXR1cm4gcmV0O1xufTtcbnZhciBhcHBseSA9IGZ1bmN0aW9uIChjb21tYW5kcykge1xuICAgIC8vIGN1cnJlbnQgcG9pbnQsIGNvbnRyb2wgcG9pbnQsIGFuZCBzdWJwYXRoIHN0YXJ0aW5nIHBvaW50XG4gICAgY3ggPSBjeSA9IHB4ID0gcHkgPSBzeCA9IHN5ID0gMDtcbiAgICAvLyBydW4gdGhlIGNvbW1hbmRzXG4gICAgdmFyIGNtZHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjID0gY29tbWFuZHNbaV07XG4gICAgICAgIGlmIChjLmNtZCAmJiB0eXBlb2YgcnVubmVyc1tjLmNtZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBjbWQgPSBydW5uZXJzW2MuY21kXShjLmFyZ3MpO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY21kKSkge1xuICAgICAgICAgICAgICAgIGNtZHMgPSBjbWRzLmNvbmNhdChjbWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY21kcy5wdXNoKGNtZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNtZHM7XG59O1xudmFyIHJ1bm5lcnMgPSB7XG4gICAgTTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggPSBhWzBdO1xuICAgICAgICBjeSA9IGFbMV07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICBzeCA9IGN4O1xuICAgICAgICBzeSA9IGN5O1xuICAgICAgICByZXR1cm4gbW92ZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBtOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCArPSBhWzBdO1xuICAgICAgICBjeSArPSBhWzFdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgc3ggPSBjeDtcbiAgICAgICAgc3kgPSBjeTtcbiAgICAgICAgcmV0dXJuIG1vdmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgQzogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggPSBhWzRdO1xuICAgICAgICBjeSA9IGFbNV07XG4gICAgICAgIHB4ID0gYVsyXTtcbiAgICAgICAgcHkgPSBhWzNdO1xuICAgICAgICByZXR1cm4gYXBwZW5kQmV6aWVyQ3VydmUoYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XSk7XG4gICAgfSxcbiAgICBjOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgY21kID0gYXBwZW5kQmV6aWVyQ3VydmUoYVswXSArIGN4LCBhWzFdICsgY3ksIGFbMl0gKyBjeCwgYVszXSArIGN5LCBhWzRdICsgY3gsIGFbNV0gKyBjeSk7XG4gICAgICAgIHB4ID0gY3ggKyBhWzJdO1xuICAgICAgICBweSA9IGN5ICsgYVszXTtcbiAgICAgICAgY3ggKz0gYVs0XTtcbiAgICAgICAgY3kgKz0gYVs1XTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIFM6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGlmIChweCA9PT0gbnVsbCB8fCBweSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHggPSBjeDtcbiAgICAgICAgICAgIHB5ID0gY3k7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNtZCA9IGFwcGVuZEJlemllckN1cnZlKGN4IC0gKHB4IC0gY3gpLCBjeSAtIChweSAtIGN5KSwgYVswXSwgYVsxXSwgYVsyXSwgYVszXSk7XG4gICAgICAgIHB4ID0gYVswXTtcbiAgICAgICAgcHkgPSBhWzFdO1xuICAgICAgICBjeCA9IGFbMl07XG4gICAgICAgIGN5ID0gYVszXTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIHM6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGlmIChweCA9PT0gbnVsbCB8fCBweSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHggPSBjeDtcbiAgICAgICAgICAgIHB5ID0gY3k7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNtZCA9IGFwcGVuZEJlemllckN1cnZlKGN4IC0gKHB4IC0gY3gpLCBjeSAtIChweSAtIGN5KSwgY3ggKyBhWzBdLCBjeSArIGFbMV0sIGN4ICsgYVsyXSwgY3kgKyBhWzNdKTtcbiAgICAgICAgcHggPSBjeCArIGFbMF07XG4gICAgICAgIHB5ID0gY3kgKyBhWzFdO1xuICAgICAgICBjeCArPSBhWzJdO1xuICAgICAgICBjeSArPSBhWzNdO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG4gICAgUTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcHggPSBhWzBdO1xuICAgICAgICBweSA9IGFbMV07XG4gICAgICAgIGN4ID0gYVsyXTtcbiAgICAgICAgY3kgPSBhWzNdO1xuICAgICAgICByZXR1cm4gYXBwZW5kUXVhZHJhdGljQ3VydmUoYVswXSwgYVsxXSwgY3gsIGN5KTtcbiAgICB9LFxuICAgIHE6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciBjbWQgPSBhcHBlbmRRdWFkcmF0aWNDdXJ2ZShhWzBdICsgY3gsIGFbMV0gKyBjeSwgYVsyXSArIGN4LCBhWzNdICsgY3kpO1xuICAgICAgICBweCA9IGN4ICsgYVswXTtcbiAgICAgICAgcHkgPSBjeSArIGFbMV07XG4gICAgICAgIGN4ICs9IGFbMl07XG4gICAgICAgIGN5ICs9IGFbM107XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbiAgICBUOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBpZiAocHggPT09IG51bGwgfHwgcHkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHB4ID0gY3g7XG4gICAgICAgICAgICBweSA9IGN5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHggPSBjeCAtIChweCAtIGN4KTtcbiAgICAgICAgICAgIHB5ID0gY3kgLSAocHkgLSBjeSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNtZCA9IGFwcGVuZFF1YWRyYXRpY0N1cnZlKHB4LCBweSwgYVswXSwgYVsxXSk7XG4gICAgICAgIHB4ID0gY3ggLSAocHggLSBjeCk7XG4gICAgICAgIHB5ID0gY3kgLSAocHkgLSBjeSk7XG4gICAgICAgIGN4ID0gYVswXTtcbiAgICAgICAgY3kgPSBhWzFdO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG4gICAgdDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgaWYgKHB4ID09PSBudWxsIHx8IHB5ID09PSBudWxsKSB7XG4gICAgICAgICAgICBweCA9IGN4O1xuICAgICAgICAgICAgcHkgPSBjeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHB4ID0gY3ggLSAocHggLSBjeCk7XG4gICAgICAgICAgICBweSA9IGN5IC0gKHB5IC0gY3kpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbWQgPSBhcHBlbmRRdWFkcmF0aWNDdXJ2ZShweCwgcHksIGN4ICsgYVswXSwgY3kgKyBhWzFdKTtcbiAgICAgICAgY3ggKz0gYVswXTtcbiAgICAgICAgY3kgKz0gYVsxXTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIEE6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciBjbWRzID0gc29sdmVBcmMoY3gsIGN5LCBhKTtcbiAgICAgICAgY3ggPSBhWzVdO1xuICAgICAgICBjeSA9IGFbNl07XG4gICAgICAgIHJldHVybiBjbWRzO1xuICAgIH0sXG4gICAgYTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgYVs1XSArPSBjeDtcbiAgICAgICAgYVs2XSArPSBjeTtcbiAgICAgICAgdmFyIGNtZHMgPSBzb2x2ZUFyYyhjeCwgY3ksIGEpO1xuICAgICAgICBjeCA9IGFbNV07XG4gICAgICAgIGN5ID0gYVs2XTtcbiAgICAgICAgcmV0dXJuIGNtZHM7XG4gICAgfSxcbiAgICBMOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCA9IGFbMF07XG4gICAgICAgIGN5ID0gYVsxXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHJldHVybiBsaW5lVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIGw6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN4ICs9IGFbMF07XG4gICAgICAgIGN5ICs9IGFbMV07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICByZXR1cm4gbGluZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBIOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCA9IGFbMF07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICByZXR1cm4gbGluZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBoOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCArPSBhWzBdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxpbmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgVjogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3kgPSBhWzBdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxpbmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgdjogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3kgKz0gYVswXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHJldHVybiBsaW5lVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIFo6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNtZCA9IGNsb3NlUGF0aCgpO1xuICAgICAgICBjeCA9IHN4O1xuICAgICAgICBjeSA9IHN5O1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG4gICAgejogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY21kID0gY2xvc2VQYXRoKCk7XG4gICAgICAgIGN4ID0gc3g7XG4gICAgICAgIGN5ID0gc3k7XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbn07XG52YXIgc29sdmVBcmMgPSBmdW5jdGlvbiAoeCwgeSwgY29vcmRzKSB7XG4gICAgdmFyIHJ4ID0gY29vcmRzWzBdLCByeSA9IGNvb3Jkc1sxXSwgcm90ID0gY29vcmRzWzJdLCBsYXJnZSA9IGNvb3Jkc1szXSwgc3dlZXAgPSBjb29yZHNbNF0sIGV4ID0gY29vcmRzWzVdLCBleSA9IGNvb3Jkc1s2XTtcbiAgICB2YXIgc2VncyA9IGFyY1RvU2VnbWVudHMoZXgsIGV5LCByeCwgcnksIGxhcmdlLCBzd2VlcCwgcm90LCB4LCB5KTtcbiAgICB2YXIgY21kcyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMCwgc2Vnc18xID0gc2VnczsgX2kgPCBzZWdzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBzZWcgPSBzZWdzXzFbX2ldO1xuICAgICAgICB2YXIgYmV6ID0gc2VnbWVudFRvQmV6aWVyLmFwcGx5KHZvaWQgMCwgc2VnKTtcbiAgICAgICAgY21kcy5wdXNoKGFwcGVuZEJlemllckN1cnZlLmFwcGx5KHZvaWQgMCwgYmV6KSk7XG4gICAgfVxuICAgIHJldHVybiBjbWRzO1xufTtcbi8vIGZyb20gSW5rc2NhcGUgc3ZndG9wZGYsIHRoYW5rcyFcbnZhciBhcmNUb1NlZ21lbnRzID0gZnVuY3Rpb24gKHgsIHksIHJ4LCByeSwgbGFyZ2UsIHN3ZWVwLCByb3RhdGVYLCBveCwgb3kpIHtcbiAgICB2YXIgdGggPSByb3RhdGVYICogKE1hdGguUEkgLyAxODApO1xuICAgIHZhciBzaW5UaCA9IE1hdGguc2luKHRoKTtcbiAgICB2YXIgY29zVGggPSBNYXRoLmNvcyh0aCk7XG4gICAgcnggPSBNYXRoLmFicyhyeCk7XG4gICAgcnkgPSBNYXRoLmFicyhyeSk7XG4gICAgcHggPSBjb3NUaCAqIChveCAtIHgpICogMC41ICsgc2luVGggKiAob3kgLSB5KSAqIDAuNTtcbiAgICBweSA9IGNvc1RoICogKG95IC0geSkgKiAwLjUgLSBzaW5UaCAqIChveCAtIHgpICogMC41O1xuICAgIHZhciBwbCA9IChweCAqIHB4KSAvIChyeCAqIHJ4KSArIChweSAqIHB5KSAvIChyeSAqIHJ5KTtcbiAgICBpZiAocGwgPiAxKSB7XG4gICAgICAgIHBsID0gTWF0aC5zcXJ0KHBsKTtcbiAgICAgICAgcnggKj0gcGw7XG4gICAgICAgIHJ5ICo9IHBsO1xuICAgIH1cbiAgICB2YXIgYTAwID0gY29zVGggLyByeDtcbiAgICB2YXIgYTAxID0gc2luVGggLyByeDtcbiAgICB2YXIgYTEwID0gLXNpblRoIC8gcnk7XG4gICAgdmFyIGExMSA9IGNvc1RoIC8gcnk7XG4gICAgdmFyIHgwID0gYTAwICogb3ggKyBhMDEgKiBveTtcbiAgICB2YXIgeTAgPSBhMTAgKiBveCArIGExMSAqIG95O1xuICAgIHZhciB4MSA9IGEwMCAqIHggKyBhMDEgKiB5O1xuICAgIHZhciB5MSA9IGExMCAqIHggKyBhMTEgKiB5O1xuICAgIHZhciBkID0gKHgxIC0geDApICogKHgxIC0geDApICsgKHkxIC0geTApICogKHkxIC0geTApO1xuICAgIHZhciBzZmFjdG9yU3EgPSAxIC8gZCAtIDAuMjU7XG4gICAgaWYgKHNmYWN0b3JTcSA8IDApIHtcbiAgICAgICAgc2ZhY3RvclNxID0gMDtcbiAgICB9XG4gICAgdmFyIHNmYWN0b3IgPSBNYXRoLnNxcnQoc2ZhY3RvclNxKTtcbiAgICBpZiAoc3dlZXAgPT09IGxhcmdlKSB7XG4gICAgICAgIHNmYWN0b3IgPSAtc2ZhY3RvcjtcbiAgICB9XG4gICAgdmFyIHhjID0gMC41ICogKHgwICsgeDEpIC0gc2ZhY3RvciAqICh5MSAtIHkwKTtcbiAgICB2YXIgeWMgPSAwLjUgKiAoeTAgKyB5MSkgKyBzZmFjdG9yICogKHgxIC0geDApO1xuICAgIHZhciB0aDAgPSBNYXRoLmF0YW4yKHkwIC0geWMsIHgwIC0geGMpO1xuICAgIHZhciB0aDEgPSBNYXRoLmF0YW4yKHkxIC0geWMsIHgxIC0geGMpO1xuICAgIHZhciB0aEFyYyA9IHRoMSAtIHRoMDtcbiAgICBpZiAodGhBcmMgPCAwICYmIHN3ZWVwID09PSAxKSB7XG4gICAgICAgIHRoQXJjICs9IDIgKiBNYXRoLlBJO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aEFyYyA+IDAgJiYgc3dlZXAgPT09IDApIHtcbiAgICAgICAgdGhBcmMgLT0gMiAqIE1hdGguUEk7XG4gICAgfVxuICAgIHZhciBzZWdtZW50cyA9IE1hdGguY2VpbChNYXRoLmFicyh0aEFyYyAvIChNYXRoLlBJICogMC41ICsgMC4wMDEpKSk7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudHM7IGkrKykge1xuICAgICAgICB2YXIgdGgyID0gdGgwICsgKGkgKiB0aEFyYykgLyBzZWdtZW50cztcbiAgICAgICAgdmFyIHRoMyA9IHRoMCArICgoaSArIDEpICogdGhBcmMpIC8gc2VnbWVudHM7XG4gICAgICAgIHJlc3VsdFtpXSA9IFt4YywgeWMsIHRoMiwgdGgzLCByeCwgcnksIHNpblRoLCBjb3NUaF07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIHNlZ21lbnRUb0JlemllciA9IGZ1bmN0aW9uIChjeDEsIGN5MSwgdGgwLCB0aDEsIHJ4LCByeSwgc2luVGgsIGNvc1RoKSB7XG4gICAgdmFyIGEwMCA9IGNvc1RoICogcng7XG4gICAgdmFyIGEwMSA9IC1zaW5UaCAqIHJ5O1xuICAgIHZhciBhMTAgPSBzaW5UaCAqIHJ4O1xuICAgIHZhciBhMTEgPSBjb3NUaCAqIHJ5O1xuICAgIHZhciB0aEhhbGYgPSAwLjUgKiAodGgxIC0gdGgwKTtcbiAgICB2YXIgdCA9ICgoOCAvIDMpICogTWF0aC5zaW4odGhIYWxmICogMC41KSAqIE1hdGguc2luKHRoSGFsZiAqIDAuNSkpIC9cbiAgICAgICAgTWF0aC5zaW4odGhIYWxmKTtcbiAgICB2YXIgeDEgPSBjeDEgKyBNYXRoLmNvcyh0aDApIC0gdCAqIE1hdGguc2luKHRoMCk7XG4gICAgdmFyIHkxID0gY3kxICsgTWF0aC5zaW4odGgwKSArIHQgKiBNYXRoLmNvcyh0aDApO1xuICAgIHZhciB4MyA9IGN4MSArIE1hdGguY29zKHRoMSk7XG4gICAgdmFyIHkzID0gY3kxICsgTWF0aC5zaW4odGgxKTtcbiAgICB2YXIgeDIgPSB4MyArIHQgKiBNYXRoLnNpbih0aDEpO1xuICAgIHZhciB5MiA9IHkzIC0gdCAqIE1hdGguY29zKHRoMSk7XG4gICAgdmFyIHJlc3VsdCA9IFtcbiAgICAgICAgYTAwICogeDEgKyBhMDEgKiB5MSxcbiAgICAgICAgYTEwICogeDEgKyBhMTEgKiB5MSxcbiAgICAgICAgYTAwICogeDIgKyBhMDEgKiB5MixcbiAgICAgICAgYTEwICogeDIgKyBhMTEgKiB5MixcbiAgICAgICAgYTAwICogeDMgKyBhMDEgKiB5MyxcbiAgICAgICAgYTEwICogeDMgKyBhMTEgKiB5MyxcbiAgICBdO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IHZhciBzdmdQYXRoVG9PcGVyYXRvcnMgPSBmdW5jdGlvbiAocGF0aCkgeyByZXR1cm4gYXBwbHkocGFyc2UocGF0aCkpOyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3ZnUGF0aC5qcy5tYXAiLCJleHBvcnQgdmFyIFRleHRBbGlnbm1lbnQ7XG4oZnVuY3Rpb24gKFRleHRBbGlnbm1lbnQpIHtcbiAgICBUZXh0QWxpZ25tZW50W1RleHRBbGlnbm1lbnRbXCJMZWZ0XCJdID0gMF0gPSBcIkxlZnRcIjtcbiAgICBUZXh0QWxpZ25tZW50W1RleHRBbGlnbm1lbnRbXCJDZW50ZXJcIl0gPSAxXSA9IFwiQ2VudGVyXCI7XG4gICAgVGV4dEFsaWdubWVudFtUZXh0QWxpZ25tZW50W1wiUmlnaHRcIl0gPSAyXSA9IFwiUmlnaHRcIjtcbn0pKFRleHRBbGlnbm1lbnQgfHwgKFRleHRBbGlnbm1lbnQgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxpZ25tZW50LmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2FsaWdubWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGF5b3V0XCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBDb21iZWRUZXh0TGF5b3V0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBUZXh0QWxpZ25tZW50IH0gZnJvbSBcIi4vYWxpZ25tZW50XCI7XG5pbXBvcnQgeyBjbGVhblRleHQsIGxpbmVTcGxpdCwgbWVyZ2VMaW5lcywgY2hhckF0SW5kZXgsIGNoYXJTcGxpdCwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBNSU5fRk9OVF9TSVpFID0gNDtcbnZhciBNQVhfRk9OVF9TSVpFID0gNTAwO1xudmFyIGNvbXB1dGVGb250U2l6ZSA9IGZ1bmN0aW9uIChsaW5lcywgZm9udCwgYm91bmRzLCBtdWx0aWxpbmUpIHtcbiAgICBpZiAobXVsdGlsaW5lID09PSB2b2lkIDApIHsgbXVsdGlsaW5lID0gZmFsc2U7IH1cbiAgICB2YXIgZm9udFNpemUgPSBNSU5fRk9OVF9TSVpFO1xuICAgIHdoaWxlIChmb250U2l6ZSA8IE1BWF9GT05UX1NJWkUpIHtcbiAgICAgICAgdmFyIGxpbmVzVXNlZCA9IDA7XG4gICAgICAgIGZvciAodmFyIGxpbmVJZHggPSAwLCBsaW5lTGVuID0gbGluZXMubGVuZ3RoOyBsaW5lSWR4IDwgbGluZUxlbjsgbGluZUlkeCsrKSB7XG4gICAgICAgICAgICBsaW5lc1VzZWQgKz0gMTtcbiAgICAgICAgICAgIHZhciBsaW5lID0gbGluZXNbbGluZUlkeF07XG4gICAgICAgICAgICB2YXIgd29yZHMgPSBsaW5lLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICAvLyBMYXlvdXQgdGhlIHdvcmRzIHVzaW5nIHRoZSBjdXJyZW50IGBmb250U2l6ZWAsIGxpbmUgd3JhcHBpbmdcbiAgICAgICAgICAgIC8vIHdoZW5ldmVyIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZS5cbiAgICAgICAgICAgIHZhciBzcGFjZUluTGluZVJlbWFpbmluZyA9IGJvdW5kcy53aWR0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdvcmRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBpc0xhc3RXb3JkID0gaWR4ID09PSBsZW4gLSAxO1xuICAgICAgICAgICAgICAgIHZhciB3b3JkID0gaXNMYXN0V29yZCA/IHdvcmRzW2lkeF0gOiB3b3Jkc1tpZHhdICsgJyAnO1xuICAgICAgICAgICAgICAgIHZhciB3aWR0aE9mV29yZCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUod29yZCwgZm9udFNpemUpO1xuICAgICAgICAgICAgICAgIHNwYWNlSW5MaW5lUmVtYWluaW5nIC09IHdpZHRoT2ZXb3JkO1xuICAgICAgICAgICAgICAgIGlmIChzcGFjZUluTGluZVJlbWFpbmluZyA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVzVXNlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBzcGFjZUluTGluZVJlbWFpbmluZyA9IGJvdW5kcy53aWR0aCAtIHdpZHRoT2ZXb3JkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZXR1cm4gaWYgd2UgZXhjZWVkZWQgdGhlIGFsbG93ZWQgd2lkdGhcbiAgICAgICAgaWYgKCFtdWx0aWxpbmUgJiYgbGluZXNVc2VkID4gbGluZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZvbnRTaXplIC0gMTtcbiAgICAgICAgdmFyIGhlaWdodCA9IGZvbnQuaGVpZ2h0QXRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdmFyIGxpbmVIZWlnaHQgPSBoZWlnaHQgKyBoZWlnaHQgKiAwLjI7XG4gICAgICAgIHZhciB0b3RhbEhlaWdodCA9IGxpbmVIZWlnaHQgKiBsaW5lc1VzZWQ7XG4gICAgICAgIC8vIFJldHVybiBpZiB3ZSBleGNlZWRlZCB0aGUgYWxsb3dlZCBoZWlnaHRcbiAgICAgICAgaWYgKHRvdGFsSGVpZ2h0ID4gTWF0aC5hYnMoYm91bmRzLmhlaWdodCkpXG4gICAgICAgICAgICByZXR1cm4gZm9udFNpemUgLSAxO1xuICAgICAgICBmb250U2l6ZSArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gZm9udFNpemU7XG59O1xudmFyIGNvbXB1dGVDb21iZWRGb250U2l6ZSA9IGZ1bmN0aW9uIChsaW5lLCBmb250LCBib3VuZHMsIGNlbGxDb3VudCkge1xuICAgIHZhciBjZWxsV2lkdGggPSBib3VuZHMud2lkdGggLyBjZWxsQ291bnQ7XG4gICAgdmFyIGNlbGxIZWlnaHQgPSBib3VuZHMuaGVpZ2h0O1xuICAgIHZhciBmb250U2l6ZSA9IE1JTl9GT05UX1NJWkU7XG4gICAgdmFyIGNoYXJzID0gY2hhclNwbGl0KGxpbmUpO1xuICAgIHdoaWxlIChmb250U2l6ZSA8IE1BWF9GT05UX1NJWkUpIHtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gY2hhcnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgYyA9IGNoYXJzW2lkeF07XG4gICAgICAgICAgICB2YXIgdG9vTG9uZyA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUoYywgZm9udFNpemUpID4gY2VsbFdpZHRoICogMC43NTtcbiAgICAgICAgICAgIGlmICh0b29Mb25nKVxuICAgICAgICAgICAgICAgIHJldHVybiBmb250U2l6ZSAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhlaWdodCA9IGZvbnQuaGVpZ2h0QXRTaXplKGZvbnRTaXplLCB7IGRlc2NlbmRlcjogZmFsc2UgfSk7XG4gICAgICAgIGlmIChoZWlnaHQgPiBjZWxsSGVpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIGZvbnRTaXplIC0gMTtcbiAgICAgICAgZm9udFNpemUgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGZvbnRTaXplO1xufTtcbnZhciBsYXN0SW5kZXhPZldoaXRlc3BhY2UgPSBmdW5jdGlvbiAobGluZSkge1xuICAgIGZvciAodmFyIGlkeCA9IGxpbmUubGVuZ3RoOyBpZHggPiAwOyBpZHgtLSkge1xuICAgICAgICBpZiAoL1xccy8udGVzdChsaW5lW2lkeF0pKVxuICAgICAgICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG52YXIgc3BsaXRPdXRMaW5lcyA9IGZ1bmN0aW9uIChpbnB1dCwgbWF4V2lkdGgsIGZvbnQsIGZvbnRTaXplKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBsYXN0V2hpdGVzcGFjZUlkeCA9IGlucHV0Lmxlbmd0aDtcbiAgICB3aGlsZSAobGFzdFdoaXRlc3BhY2VJZHggPiAwKSB7XG4gICAgICAgIHZhciBsaW5lID0gaW5wdXQuc3Vic3RyaW5nKDAsIGxhc3RXaGl0ZXNwYWNlSWR4KTtcbiAgICAgICAgdmFyIGVuY29kZWQgPSBmb250LmVuY29kZVRleHQobGluZSk7XG4gICAgICAgIHZhciB3aWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUobGluZSwgZm9udFNpemUpO1xuICAgICAgICBpZiAod2lkdGggPCBtYXhXaWR0aCkge1xuICAgICAgICAgICAgdmFyIHJlbWFpbmRlciA9IGlucHV0LnN1YnN0cmluZyhsYXN0V2hpdGVzcGFjZUlkeCkgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIHsgbGluZTogbGluZSwgZW5jb2RlZDogZW5jb2RlZCwgd2lkdGg6IHdpZHRoLCByZW1haW5kZXI6IHJlbWFpbmRlciB9O1xuICAgICAgICB9XG4gICAgICAgIGxhc3RXaGl0ZXNwYWNlSWR4ID0gKF9hID0gbGFzdEluZGV4T2ZXaGl0ZXNwYWNlKGxpbmUpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIH1cbiAgICAvLyBXZSB3ZXJlIHVuYWJsZSB0byBzcGxpdCB0aGUgaW5wdXQgZW5vdWdoIHRvIGdldCBhIGNodW5rIHRoYXQgd291bGQgZml0XG4gICAgLy8gd2l0aGluIHRoZSBzcGVjaWZpZWQgYG1heFdpZHRoYCBzbyB3ZSdsbCBqdXN0IHJldHVybiBldmVyeXRoaW5nXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGluZTogaW5wdXQsXG4gICAgICAgIGVuY29kZWQ6IGZvbnQuZW5jb2RlVGV4dChpbnB1dCksXG4gICAgICAgIHdpZHRoOiBmb250LndpZHRoT2ZUZXh0QXRTaXplKGlucHV0LCBmb250U2l6ZSksXG4gICAgICAgIHJlbWFpbmRlcjogdW5kZWZpbmVkLFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBsYXlvdXRNdWx0aWxpbmVUZXh0ID0gZnVuY3Rpb24gKHRleHQsIF9hKSB7XG4gICAgdmFyIGFsaWdubWVudCA9IF9hLmFsaWdubWVudCwgZm9udFNpemUgPSBfYS5mb250U2l6ZSwgZm9udCA9IF9hLmZvbnQsIGJvdW5kcyA9IF9hLmJvdW5kcztcbiAgICB2YXIgbGluZXMgPSBsaW5lU3BsaXQoY2xlYW5UZXh0KHRleHQpKTtcbiAgICBpZiAoZm9udFNpemUgPT09IHVuZGVmaW5lZCB8fCBmb250U2l6ZSA9PT0gMCkge1xuICAgICAgICBmb250U2l6ZSA9IGNvbXB1dGVGb250U2l6ZShsaW5lcywgZm9udCwgYm91bmRzLCB0cnVlKTtcbiAgICB9XG4gICAgdmFyIGhlaWdodCA9IGZvbnQuaGVpZ2h0QXRTaXplKGZvbnRTaXplKTtcbiAgICB2YXIgbGluZUhlaWdodCA9IGhlaWdodCArIGhlaWdodCAqIDAuMjtcbiAgICB2YXIgdGV4dExpbmVzID0gW107XG4gICAgdmFyIG1pblggPSBib3VuZHMueDtcbiAgICB2YXIgbWluWSA9IGJvdW5kcy55O1xuICAgIHZhciBtYXhYID0gYm91bmRzLnggKyBib3VuZHMud2lkdGg7XG4gICAgdmFyIG1heFkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQ7XG4gICAgdmFyIHkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQ7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBwcmV2UmVtYWluZGVyID0gbGluZXNbaWR4XTtcbiAgICAgICAgd2hpbGUgKHByZXZSZW1haW5kZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIF9iID0gc3BsaXRPdXRMaW5lcyhwcmV2UmVtYWluZGVyLCBib3VuZHMud2lkdGgsIGZvbnQsIGZvbnRTaXplKSwgbGluZSA9IF9iLmxpbmUsIGVuY29kZWQgPSBfYi5lbmNvZGVkLCB3aWR0aCA9IF9iLndpZHRoLCByZW1haW5kZXIgPSBfYi5yZW1haW5kZXI7XG4gICAgICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgIHZhciB4ID0gKGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5MZWZ0ID8gYm91bmRzLnhcbiAgICAgICAgICAgICAgICA6IGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5DZW50ZXIgPyBib3VuZHMueCArIChib3VuZHMud2lkdGggLyAyKSAtICh3aWR0aCAvIDIpXG4gICAgICAgICAgICAgICAgICAgIDogYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LlJpZ2h0ID8gYm91bmRzLnggKyBib3VuZHMud2lkdGggLSB3aWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBib3VuZHMueCk7XG4gICAgICAgICAgICB5IC09IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpXG4gICAgICAgICAgICAgICAgbWluWCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IG1pblkpXG4gICAgICAgICAgICAgICAgbWluWSA9IHk7XG4gICAgICAgICAgICBpZiAoeCArIHdpZHRoID4gbWF4WClcbiAgICAgICAgICAgICAgICBtYXhYID0geCArIHdpZHRoO1xuICAgICAgICAgICAgaWYgKHkgKyBoZWlnaHQgPiBtYXhZKVxuICAgICAgICAgICAgICAgIG1heFkgPSB5ICsgaGVpZ2h0O1xuICAgICAgICAgICAgdGV4dExpbmVzLnB1c2goeyB0ZXh0OiBsaW5lLCBlbmNvZGVkOiBlbmNvZGVkLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LCB4OiB4LCB5OiB5IH0pO1xuICAgICAgICAgICAgLy8gT25seSB0cmltIGxpbmVzIHRoYXQgd2UgaGFkIHRvIHNwbGl0IG91cnNlbHZlcy4gU28gd2Ugd29uJ3QgdHJpbSBsaW5lc1xuICAgICAgICAgICAgLy8gdGhhdCB0aGUgdXNlciBwcm92aWRlZCB0aGVtc2VsdmVzIHdpdGggd2hpdGVzcGFjZS5cbiAgICAgICAgICAgIHByZXZSZW1haW5kZXIgPSByZW1haW5kZXIgPT09IG51bGwgfHwgcmVtYWluZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZW1haW5kZXIudHJpbSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgbGluZUhlaWdodDogbGluZUhlaWdodCxcbiAgICAgICAgbGluZXM6IHRleHRMaW5lcyxcbiAgICAgICAgYm91bmRzOiB7XG4gICAgICAgICAgICB4OiBtaW5YLFxuICAgICAgICAgICAgeTogbWluWSxcbiAgICAgICAgICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcbiAgICAgICAgICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIGxheW91dENvbWJlZFRleHQgPSBmdW5jdGlvbiAodGV4dCwgX2EpIHtcbiAgICB2YXIgZm9udFNpemUgPSBfYS5mb250U2l6ZSwgZm9udCA9IF9hLmZvbnQsIGJvdW5kcyA9IF9hLmJvdW5kcywgY2VsbENvdW50ID0gX2EuY2VsbENvdW50O1xuICAgIHZhciBsaW5lID0gbWVyZ2VMaW5lcyhjbGVhblRleHQodGV4dCkpO1xuICAgIGlmIChsaW5lLmxlbmd0aCA+IGNlbGxDb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tYmVkVGV4dExheW91dEVycm9yKGxpbmUubGVuZ3RoLCBjZWxsQ291bnQpO1xuICAgIH1cbiAgICBpZiAoZm9udFNpemUgPT09IHVuZGVmaW5lZCB8fCBmb250U2l6ZSA9PT0gMCkge1xuICAgICAgICBmb250U2l6ZSA9IGNvbXB1dGVDb21iZWRGb250U2l6ZShsaW5lLCBmb250LCBib3VuZHMsIGNlbGxDb3VudCk7XG4gICAgfVxuICAgIHZhciBjZWxsV2lkdGggPSBib3VuZHMud2lkdGggLyBjZWxsQ291bnQ7XG4gICAgdmFyIGhlaWdodCA9IGZvbnQuaGVpZ2h0QXRTaXplKGZvbnRTaXplLCB7IGRlc2NlbmRlcjogZmFsc2UgfSk7XG4gICAgdmFyIHkgPSBib3VuZHMueSArIChib3VuZHMuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDIpO1xuICAgIHZhciBjZWxscyA9IFtdO1xuICAgIHZhciBtaW5YID0gYm91bmRzLng7XG4gICAgdmFyIG1pblkgPSBib3VuZHMueTtcbiAgICB2YXIgbWF4WCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoO1xuICAgIHZhciBtYXhZID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0O1xuICAgIHZhciBjZWxsT2Zmc2V0ID0gMDtcbiAgICB2YXIgY2hhck9mZnNldCA9IDA7XG4gICAgd2hpbGUgKGNlbGxPZmZzZXQgPCBjZWxsQ291bnQpIHtcbiAgICAgICAgdmFyIF9iID0gY2hhckF0SW5kZXgobGluZSwgY2hhck9mZnNldCksIGNoYXIgPSBfYlswXSwgY2hhckxlbmd0aCA9IF9iWzFdO1xuICAgICAgICB2YXIgZW5jb2RlZCA9IGZvbnQuZW5jb2RlVGV4dChjaGFyKTtcbiAgICAgICAgdmFyIHdpZHRoID0gZm9udC53aWR0aE9mVGV4dEF0U2l6ZShjaGFyLCBmb250U2l6ZSk7XG4gICAgICAgIHZhciBjZWxsQ2VudGVyID0gYm91bmRzLnggKyAoY2VsbFdpZHRoICogY2VsbE9mZnNldCArIGNlbGxXaWR0aCAvIDIpO1xuICAgICAgICB2YXIgeCA9IGNlbGxDZW50ZXIgLSB3aWR0aCAvIDI7XG4gICAgICAgIGlmICh4IDwgbWluWClcbiAgICAgICAgICAgIG1pblggPSB4O1xuICAgICAgICBpZiAoeSA8IG1pblkpXG4gICAgICAgICAgICBtaW5ZID0geTtcbiAgICAgICAgaWYgKHggKyB3aWR0aCA+IG1heFgpXG4gICAgICAgICAgICBtYXhYID0geCArIHdpZHRoO1xuICAgICAgICBpZiAoeSArIGhlaWdodCA+IG1heFkpXG4gICAgICAgICAgICBtYXhZID0geSArIGhlaWdodDtcbiAgICAgICAgY2VsbHMucHVzaCh7IHRleHQ6IGxpbmUsIGVuY29kZWQ6IGVuY29kZWQsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsIHg6IHgsIHk6IHkgfSk7XG4gICAgICAgIGNlbGxPZmZzZXQgKz0gMTtcbiAgICAgICAgY2hhck9mZnNldCArPSBjaGFyTGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgIGNlbGxzOiBjZWxscyxcbiAgICAgICAgYm91bmRzOiB7XG4gICAgICAgICAgICB4OiBtaW5YLFxuICAgICAgICAgICAgeTogbWluWSxcbiAgICAgICAgICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcbiAgICAgICAgICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIGxheW91dFNpbmdsZWxpbmVUZXh0ID0gZnVuY3Rpb24gKHRleHQsIF9hKSB7XG4gICAgdmFyIGFsaWdubWVudCA9IF9hLmFsaWdubWVudCwgZm9udFNpemUgPSBfYS5mb250U2l6ZSwgZm9udCA9IF9hLmZvbnQsIGJvdW5kcyA9IF9hLmJvdW5kcztcbiAgICB2YXIgbGluZSA9IG1lcmdlTGluZXMoY2xlYW5UZXh0KHRleHQpKTtcbiAgICBpZiAoZm9udFNpemUgPT09IHVuZGVmaW5lZCB8fCBmb250U2l6ZSA9PT0gMCkge1xuICAgICAgICBmb250U2l6ZSA9IGNvbXB1dGVGb250U2l6ZShbbGluZV0sIGZvbnQsIGJvdW5kcyk7XG4gICAgfVxuICAgIHZhciBlbmNvZGVkID0gZm9udC5lbmNvZGVUZXh0KGxpbmUpO1xuICAgIHZhciB3aWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUobGluZSwgZm9udFNpemUpO1xuICAgIHZhciBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZShmb250U2l6ZSwgeyBkZXNjZW5kZXI6IGZhbHNlIH0pO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHZhciB4ID0gKGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5MZWZ0ID8gYm91bmRzLnhcbiAgICAgICAgOiBhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuQ2VudGVyID8gYm91bmRzLnggKyAoYm91bmRzLndpZHRoIC8gMikgLSAod2lkdGggLyAyKVxuICAgICAgICAgICAgOiBhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuUmlnaHQgPyBib3VuZHMueCArIGJvdW5kcy53aWR0aCAtIHdpZHRoXG4gICAgICAgICAgICAgICAgOiBib3VuZHMueCk7XG4gICAgdmFyIHkgPSBib3VuZHMueSArIChib3VuZHMuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgbGluZTogeyB0ZXh0OiBsaW5lLCBlbmNvZGVkOiBlbmNvZGVkLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LCB4OiB4LCB5OiB5IH0sXG4gICAgICAgIGJvdW5kczogeyB4OiB4LCB5OiB5LCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH0sXG4gICAgfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYXlvdXQuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBwYWtvIGZyb20gJ3Bha28nO1xuaW1wb3J0IFBERkhlYWRlciBmcm9tIFwiLi9kb2N1bWVudC9QREZIZWFkZXJcIjtcbmltcG9ydCB7IFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGQm9vbCBmcm9tIFwiLi9vYmplY3RzL1BERkJvb2xcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVsbCBmcm9tIFwiLi9vYmplY3RzL1BERk51bGxcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vb2JqZWN0cy9QREZPYmplY3RcIjtcbmltcG9ydCBQREZSYXdTdHJlYW0gZnJvbSBcIi4vb2JqZWN0cy9QREZSYXdTdHJlYW1cIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZPcGVyYXRvciBmcm9tIFwiLi9vcGVyYXRvcnMvUERGT3BlcmF0b3JcIjtcbmltcG9ydCBPcHMgZnJvbSBcIi4vb3BlcmF0b3JzL1BERk9wZXJhdG9yTmFtZXNcIjtcbmltcG9ydCBQREZDb250ZW50U3RyZWFtIGZyb20gXCIuL3N0cnVjdHVyZXMvUERGQ29udGVudFN0cmVhbVwiO1xuaW1wb3J0IHsgdHlwZWRBcnJheUZvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgU2ltcGxlUk5HIH0gZnJvbSBcIi4uL3V0aWxzL3JuZ1wiO1xudmFyIGJ5QXNjZW5kaW5nT2JqZWN0TnVtYmVyID0gZnVuY3Rpb24gKF9hLCBfYikge1xuICAgIHZhciBhID0gX2FbMF07XG4gICAgdmFyIGIgPSBfYlswXTtcbiAgICByZXR1cm4gYS5vYmplY3ROdW1iZXIgLSBiLm9iamVjdE51bWJlcjtcbn07XG52YXIgUERGQ29udGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZDb250ZXh0KCkge1xuICAgICAgICB0aGlzLmxhcmdlc3RPYmplY3ROdW1iZXIgPSAwO1xuICAgICAgICB0aGlzLmhlYWRlciA9IFBERkhlYWRlci5mb3JWZXJzaW9uKDEsIDcpO1xuICAgICAgICB0aGlzLnRyYWlsZXJJbmZvID0ge307XG4gICAgICAgIHRoaXMuaW5kaXJlY3RPYmplY3RzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnJuZyA9IFNpbXBsZVJORy53aXRoU2VlZCgxKTtcbiAgICB9XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuYXNzaWduID0gZnVuY3Rpb24gKHJlZiwgb2JqZWN0KSB7XG4gICAgICAgIHRoaXMuaW5kaXJlY3RPYmplY3RzLnNldChyZWYsIG9iamVjdCk7XG4gICAgICAgIGlmIChyZWYub2JqZWN0TnVtYmVyID4gdGhpcy5sYXJnZXN0T2JqZWN0TnVtYmVyKSB7XG4gICAgICAgICAgICB0aGlzLmxhcmdlc3RPYmplY3ROdW1iZXIgPSByZWYub2JqZWN0TnVtYmVyO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5uZXh0UmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmxhcmdlc3RPYmplY3ROdW1iZXIgKz0gMTtcbiAgICAgICAgcmV0dXJuIFBERlJlZi5vZih0aGlzLmxhcmdlc3RPYmplY3ROdW1iZXIpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIHZhciByZWYgPSB0aGlzLm5leHRSZWYoKTtcbiAgICAgICAgdGhpcy5hc3NpZ24ocmVmLCBvYmplY3QpO1xuICAgICAgICByZXR1cm4gcmVmO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRpcmVjdE9iamVjdHMuZGVsZXRlKHJlZik7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5sb29rdXBNYXliZSA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0eXBlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBgcHJlc2VydmVQREZOdWxsYCBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNob3VsZCBiZVxuICAgICAgICAvLyByZW1vdmVkIGluIG5leHQgYnJlYWtpbmcgQVBJIGNoYW5nZS5cbiAgICAgICAgdmFyIHByZXNlcnZlUERGTnVsbCA9IHR5cGVzLmluY2x1ZGVzKFBERk51bGwpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVmIGluc3RhbmNlb2YgUERGUmVmID8gdGhpcy5pbmRpcmVjdE9iamVjdHMuZ2V0KHJlZikgOiByZWY7XG4gICAgICAgIGlmICghcmVzdWx0IHx8IChyZXN1bHQgPT09IFBERk51bGwgJiYgIXByZXNlcnZlUERGTnVsbCkpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0eXBlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gdHlwZXNbaWR4XTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBQREZOdWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gUERGTnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiB0eXBlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yKHR5cGVzLCByZXN1bHQpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHR5cGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSByZWYgaW5zdGFuY2VvZiBQREZSZWYgPyB0aGlzLmluZGlyZWN0T2JqZWN0cy5nZXQocmVmKSA6IHJlZjtcbiAgICAgICAgaWYgKHR5cGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHR5cGVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlc1tpZHhdO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFBERk51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBQREZOdWxsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIHR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IodHlwZXMsIHJlc3VsdCk7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5nZXRPYmplY3RSZWYgPSBmdW5jdGlvbiAocGRmT2JqZWN0KSB7XG4gICAgICAgIHZhciBlbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmluZGlyZWN0T2JqZWN0cy5lbnRyaWVzKCkpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCByZWYgPSBfYVswXSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgICAgICBpZiAob2JqZWN0ID09PSBwZGZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5lbnVtZXJhdGVJbmRpcmVjdE9iamVjdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuaW5kaXJlY3RPYmplY3RzLmVudHJpZXMoKSkuc29ydChieUFzY2VuZGluZ09iamVjdE51bWJlcik7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5vYmogPSBmdW5jdGlvbiAobGl0ZXJhbCkge1xuICAgICAgICBpZiAobGl0ZXJhbCBpbnN0YW5jZW9mIFBERk9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGxpdGVyYWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGl0ZXJhbCA9PT0gbnVsbCB8fCBsaXRlcmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQREZOdWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsaXRlcmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFBERk5hbWUub2YobGl0ZXJhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxpdGVyYWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gUERGTnVtYmVyLm9mKGxpdGVyYWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsaXRlcmFsID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiBsaXRlcmFsID8gUERGQm9vbC5UcnVlIDogUERGQm9vbC5GYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGxpdGVyYWwpKSB7XG4gICAgICAgICAgICB2YXIgYXJyYXkgPSBQREZBcnJheS53aXRoQ29udGV4dCh0aGlzKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxpdGVyYWwubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgYXJyYXkucHVzaCh0aGlzLm9iaihsaXRlcmFsW2lkeF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBkaWN0ID0gUERGRGljdC53aXRoQ29udGV4dCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMobGl0ZXJhbCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBrZXlzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2lkeF07XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gbGl0ZXJhbFtrZXldO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKGtleSksIHRoaXMub2JqKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGljdDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuc3RyZWFtID0gZnVuY3Rpb24gKGNvbnRlbnRzLCBkaWN0KSB7XG4gICAgICAgIGlmIChkaWN0ID09PSB2b2lkIDApIHsgZGljdCA9IHt9OyB9XG4gICAgICAgIHJldHVybiBQREZSYXdTdHJlYW0ub2YodGhpcy5vYmooZGljdCksIHR5cGVkQXJyYXlGb3IoY29udGVudHMpKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmZsYXRlU3RyZWFtID0gZnVuY3Rpb24gKGNvbnRlbnRzLCBkaWN0KSB7XG4gICAgICAgIGlmIChkaWN0ID09PSB2b2lkIDApIHsgZGljdCA9IHt9OyB9XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbShwYWtvLmRlZmxhdGUodHlwZWRBcnJheUZvcihjb250ZW50cykpLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGljdCksIHsgRmlsdGVyOiAnRmxhdGVEZWNvZGUnIH0pKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmNvbnRlbnRTdHJlYW0gPSBmdW5jdGlvbiAob3BlcmF0b3JzLCBkaWN0KSB7XG4gICAgICAgIGlmIChkaWN0ID09PSB2b2lkIDApIHsgZGljdCA9IHt9OyB9XG4gICAgICAgIHJldHVybiBQREZDb250ZW50U3RyZWFtLm9mKHRoaXMub2JqKGRpY3QpLCBvcGVyYXRvcnMpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZm9ybVhPYmplY3QgPSBmdW5jdGlvbiAob3BlcmF0b3JzLCBkaWN0KSB7XG4gICAgICAgIGlmIChkaWN0ID09PSB2b2lkIDApIHsgZGljdCA9IHt9OyB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRTdHJlYW0ob3BlcmF0b3JzLCBfX2Fzc2lnbihfX2Fzc2lnbih7IEJCb3g6IHRoaXMub2JqKFswLCAwLCAwLCAwXSksIE1hdHJpeDogdGhpcy5vYmooWzEsIDAsIDAsIDEsIDAsIDBdKSB9LCBkaWN0KSwgeyBUeXBlOiAnWE9iamVjdCcsIFN1YnR5cGU6ICdGb3JtJyB9KSk7XG4gICAgfTtcbiAgICAvKlxuICAgICAqIFJlZmVyZW5jZSB0byBQREZDb250ZW50U3RyZWFtIHRoYXQgY29udGFpbnMgYSBzaW5nbGUgUERGT3BlcmF0b3I6IGBxYC5cbiAgICAgKiBVc2VkIGJ5IFtbUERGUGFnZUxlYWZdXSBpbnN0YW5jZXMgdG8gZW5zdXJlIHRoYXQgd2hlbiBjb250ZW50IHN0cmVhbXMgYXJlXG4gICAgICogYWRkZWQgdG8gYSBtb2RpZmllZCBQREYsIHRoZXkgc3RhcnQgaW4gdGhlIGRlZmF1bHQsIHVuY2hhbmdlZCBncmFwaGljc1xuICAgICAqIHN0YXRlLlxuICAgICAqL1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmdldFB1c2hHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucHVzaEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wdXNoR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWY7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLm9iaih7fSk7XG4gICAgICAgIHZhciBvcCA9IFBERk9wZXJhdG9yLm9mKE9wcy5QdXNoR3JhcGhpY3NTdGF0ZSk7XG4gICAgICAgIHZhciBzdHJlYW0gPSBQREZDb250ZW50U3RyZWFtLm9mKGRpY3QsIFtvcF0pO1xuICAgICAgICB0aGlzLnB1c2hHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZiA9IHRoaXMucmVnaXN0ZXIoc3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVzaEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmO1xuICAgIH07XG4gICAgLypcbiAgICAgKiBSZWZlcmVuY2UgdG8gUERGQ29udGVudFN0cmVhbSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIFBERk9wZXJhdG9yOiBgUWAuXG4gICAgICogVXNlZCBieSBbW1BERlBhZ2VMZWFmXV0gaW5zdGFuY2VzIHRvIGVuc3VyZSB0aGF0IHdoZW4gY29udGVudCBzdHJlYW1zIGFyZVxuICAgICAqIGFkZGVkIHRvIGEgbW9kaWZpZWQgUERGLCB0aGV5IHN0YXJ0IGluIHRoZSBkZWZhdWx0LCB1bmNoYW5nZWQgZ3JhcGhpY3NcbiAgICAgKiBzdGF0ZS5cbiAgICAgKi9cbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5nZXRQb3BHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucG9wR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWYpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvcEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5vYmooe30pO1xuICAgICAgICB2YXIgb3AgPSBQREZPcGVyYXRvci5vZihPcHMuUG9wR3JhcGhpY3NTdGF0ZSk7XG4gICAgICAgIHZhciBzdHJlYW0gPSBQREZDb250ZW50U3RyZWFtLm9mKGRpY3QsIFtvcF0pO1xuICAgICAgICB0aGlzLnBvcEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmID0gdGhpcy5yZWdpc3RlcihzdHJlYW0pO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3BHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZjtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmFkZFJhbmRvbVN1ZmZpeCA9IGZ1bmN0aW9uIChwcmVmaXgsIHN1ZmZpeExlbmd0aCkge1xuICAgICAgICBpZiAoc3VmZml4TGVuZ3RoID09PSB2b2lkIDApIHsgc3VmZml4TGVuZ3RoID0gNDsgfVxuICAgICAgICByZXR1cm4gcHJlZml4ICsgXCItXCIgKyBNYXRoLmZsb29yKHRoaXMucm5nLm5leHRJbnQoKSAqIE1hdGgucG93KDEwLCBzdWZmaXhMZW5ndGgpKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQuY3JlYXRlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBERkNvbnRleHQoKTsgfTtcbiAgICByZXR1cm4gUERGQ29udGV4dDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZDb250ZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQ29udGV4dC5qcy5tYXAiLCJpbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4vb2JqZWN0cy9QREZTdHJlYW1cIjtcbmltcG9ydCBQREZQYWdlTGVhZiBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERlBhZ2VMZWFmXCI7XG4vKipcbiAqIFBERk9iamVjdENvcGllciBjb3BpZXMgUERGT2JqZWN0cyBmcm9tIGEgc3JjIGNvbnRleHQgdG8gYSBkZXN0IGNvbnRleHQuXG4gKiBUaGUgcHJpbWFyeSB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byBjb3B5IHBhZ2VzIGJldHdlZW4gUERGcy5cbiAqXG4gKiBfQ29weWluZ18gYW4gb2JqZWN0IHdpdGggYSBQREZPYmplY3RDb3BpZXIgaXMgZGlmZmVyZW50IGZyb20gX2Nsb25pbmdfIGFuXG4gKiBvYmplY3Qgd2l0aCBpdHMgW1tQREZPYmplY3QuY2xvbmVdXSBtZXRob2Q6XG4gKlxuICogYGBgXG4gKiAgIGNvbnN0IHNyYzogUERGQ29udGV4dCA9IC4uLlxuICogICBjb25zdCBkZXN0OiBQREZDb250ZXh0ID0gLi4uXG4gKiAgIGNvbnN0IG9yaWdpbmFsT2JqZWN0OiBQREZPYmplY3QgPSAuLi5cbiAqICAgY29uc3QgY29waWVkT2JqZWN0ID0gUERGT2JqZWN0Q29waWVyLmZvcihzcmMsIGRlc3QpLmNvcHkob3JpZ2luYWxPYmplY3QpO1xuICogICBjb25zdCBjbG9uZWRPYmplY3QgPSBvcmlnaW5hbE9iamVjdC5jbG9uZSgpO1xuICogYGBgXG4gKlxuICogQ29weWluZyBhbiBvYmplY3QgaXMgZXF1aXZhbGVudCB0byBjbG9uaW5nIGl0IGFuZCB0aGVuIGNvcHlpbmcgb3ZlciBhbnkgb3RoZXJcbiAqIG9iamVjdHMgdGhhdCBpdCByZWZlcmVuY2VzLiBOb3RlIHRoYXQgb25seSBkaWN0aW9uYXJpZXMsIGFycmF5cywgYW5kIHN0cmVhbXNcbiAqIChvciBzdHJ1Y3R1cmVzIGJ1aWxkIGZyb20gdGhlbSkgY2FuIGNvbnRhaW4gaW5kaXJlY3QgcmVmZXJlbmNlcyB0byBvdGhlclxuICogb2JqZWN0cy4gQ29weWluZyBhIFBERk9iamVjdCB0aGF0IGlzIG5vdCBhIGRpY3Rpb25hcnksIGFycmF5LCBvciBzdHJlYW0gaXNcbiAqIHN1cHBvcnRlZCwgYnV0IGlzIGVxdWl2YWxlbnQgdG8gY2xvbmluZyBpdC5cbiAqL1xudmFyIFBERk9iamVjdENvcGllciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZPYmplY3RDb3BpZXIoc3JjLCBkZXN0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMudHJhdmVyc2VkT2JqZWN0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHRoaXMuY29weSA9IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBQREZQYWdlTGVhZiA/IF90aGlzLmNvcHlQREZQYWdlKG9iamVjdClcbiAgICAgICAgICAgIDogb2JqZWN0IGluc3RhbmNlb2YgUERGRGljdCA/IF90aGlzLmNvcHlQREZEaWN0KG9iamVjdClcbiAgICAgICAgICAgICAgICA6IG9iamVjdCBpbnN0YW5jZW9mIFBERkFycmF5ID8gX3RoaXMuY29weVBERkFycmF5KG9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgOiBvYmplY3QgaW5zdGFuY2VvZiBQREZTdHJlYW0gPyBfdGhpcy5jb3B5UERGU3RyZWFtKG9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogb2JqZWN0IGluc3RhbmNlb2YgUERGUmVmID8gX3RoaXMuY29weVBERkluZGlyZWN0T2JqZWN0KG9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9iamVjdC5jbG9uZSgpKTsgfTtcbiAgICAgICAgdGhpcy5jb3B5UERGUGFnZSA9IGZ1bmN0aW9uIChvcmlnaW5hbFBhZ2UpIHtcbiAgICAgICAgICAgIHZhciBjbG9uZWRQYWdlID0gb3JpZ2luYWxQYWdlLmNsb25lKCk7XG4gICAgICAgICAgICAvLyBNb3ZlIGFueSBlbnRyaWVzIHRoYXQgdGhlIG9yaWdpbmFsUGFnZSBpcyBpbmhlcml0aW5nIGZyb20gaXRzIHBhcmVudFxuICAgICAgICAgICAgLy8gdHJlZSBub2RlcyBkaXJlY3RseSBpbnRvIG9yaWdpbmFsUGFnZSBzbyB0aGV5IGFyZSBwcmVzZXJ2ZWQgZHVyaW5nXG4gICAgICAgICAgICAvLyB0aGUgY29weS5cbiAgICAgICAgICAgIHZhciBJbmhlcml0YWJsZUVudHJpZXMgPSBQREZQYWdlTGVhZi5Jbmhlcml0YWJsZUVudHJpZXM7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBJbmhlcml0YWJsZUVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoSW5oZXJpdGFibGVFbnRyaWVzW2lkeF0pO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNsb25lZFBhZ2UuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsb25lZFBhZ2UuZ2V0KGtleSkgJiYgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIGNsb25lZFBhZ2Uuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBwYXJlbnQgcmVmZXJlbmNlIHRvIHByZXZlbnQgdGhlIHdob2xlIGRvbm9yIGRvY3VtZW50J3MgcGFnZVxuICAgICAgICAgICAgLy8gdHJlZSBmcm9tIGJlaW5nIGNvcGllZCB3aGVuIHdlIG9ubHkgbmVlZCBhIHNpbmdsZSBwYWdlLlxuICAgICAgICAgICAgY2xvbmVkUGFnZS5kZWxldGUoUERGTmFtZS5vZignUGFyZW50JykpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNvcHlQREZEaWN0KGNsb25lZFBhZ2UpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvcHlQREZEaWN0ID0gZnVuY3Rpb24gKG9yaWdpbmFsRGljdCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLnRyYXZlcnNlZE9iamVjdHMuaGFzKG9yaWdpbmFsRGljdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5nZXQob3JpZ2luYWxEaWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjbG9uZWREaWN0ID0gb3JpZ2luYWxEaWN0LmNsb25lKF90aGlzLmRlc3QpO1xuICAgICAgICAgICAgX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5zZXQob3JpZ2luYWxEaWN0LCBjbG9uZWREaWN0KTtcbiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gb3JpZ2luYWxEaWN0LmVudHJpZXMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICBjbG9uZWREaWN0LnNldChrZXksIF90aGlzLmNvcHkodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbG9uZWREaWN0O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvcHlQREZBcnJheSA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5KSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5oYXMob3JpZ2luYWxBcnJheSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5nZXQob3JpZ2luYWxBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2xvbmVkQXJyYXkgPSBvcmlnaW5hbEFycmF5LmNsb25lKF90aGlzLmRlc3QpO1xuICAgICAgICAgICAgX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5zZXQob3JpZ2luYWxBcnJheSwgY2xvbmVkQXJyYXkpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3JpZ2luYWxBcnJheS5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBvcmlnaW5hbEFycmF5LmdldChpZHgpO1xuICAgICAgICAgICAgICAgIGNsb25lZEFycmF5LnNldChpZHgsIF90aGlzLmNvcHkodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbG9uZWRBcnJheTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb3B5UERGU3RyZWFtID0gZnVuY3Rpb24gKG9yaWdpbmFsU3RyZWFtKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5oYXMob3JpZ2luYWxTdHJlYW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuZ2V0KG9yaWdpbmFsU3RyZWFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjbG9uZWRTdHJlYW0gPSBvcmlnaW5hbFN0cmVhbS5jbG9uZShfdGhpcy5kZXN0KTtcbiAgICAgICAgICAgIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuc2V0KG9yaWdpbmFsU3RyZWFtLCBjbG9uZWRTdHJlYW0pO1xuICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBvcmlnaW5hbFN0cmVhbS5kaWN0LmVudHJpZXMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICBjbG9uZWRTdHJlYW0uZGljdC5zZXQoa2V5LCBfdGhpcy5jb3B5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xvbmVkU3RyZWFtO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvcHlQREZJbmRpcmVjdE9iamVjdCA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgIHZhciBhbHJlYWR5TWFwcGVkID0gX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5oYXMocmVmKTtcbiAgICAgICAgICAgIGlmICghYWxyZWFkeU1hcHBlZCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdSZWYgPSBfdGhpcy5kZXN0Lm5leHRSZWYoKTtcbiAgICAgICAgICAgICAgICBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLnNldChyZWYsIG5ld1JlZik7XG4gICAgICAgICAgICAgICAgdmFyIGRlcmVmZXJlbmNlZFZhbHVlID0gX3RoaXMuc3JjLmxvb2t1cChyZWYpO1xuICAgICAgICAgICAgICAgIGlmIChkZXJlZmVyZW5jZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmVkID0gX3RoaXMuY29weShkZXJlZmVyZW5jZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmRlc3QuYXNzaWduKG5ld1JlZiwgY2xvbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5nZXQocmVmKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zcmMgPSBzcmM7XG4gICAgICAgIHRoaXMuZGVzdCA9IGRlc3Q7XG4gICAgfVxuICAgIFBERk9iamVjdENvcGllci5mb3IgPSBmdW5jdGlvbiAoc3JjLCBkZXN0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGT2JqZWN0Q29waWVyKHNyYywgZGVzdCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGT2JqZWN0Q29waWVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9iamVjdENvcGllcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9iamVjdENvcGllci5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQWNyb1Rlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9UZXJtaW5hbFwiO1xuaW1wb3J0IHsgSW5kZXhPdXRPZkJvdW5kc0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkFjcm9CdXR0b24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9CdXR0b24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb0J1dHRvbigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5PcHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwTWF5YmUoUERGTmFtZS5vZignT3B0JyksIFBERlN0cmluZywgUERGSGV4U3RyaW5nLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5zZXRPcHQgPSBmdW5jdGlvbiAob3B0KSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignT3B0JyksIHRoaXMuZGljdC5jb250ZXh0Lm9iaihvcHQpKTtcbiAgICB9O1xuICAgIFBERkFjcm9CdXR0b24ucHJvdG90eXBlLmdldEV4cG9ydFZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9wdCA9IHRoaXMuT3B0KCk7XG4gICAgICAgIGlmICghb3B0KVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG9wdCBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBvcHQgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBbb3B0XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdC5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9wdC5sb29rdXAoaWR4KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH07XG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUucmVtb3ZlRXhwb3J0VmFsdWUgPSBmdW5jdGlvbiAoaWR4KSB7XG4gICAgICAgIHZhciBvcHQgPSB0aGlzLk9wdCgpO1xuICAgICAgICBpZiAoIW9wdClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKG9wdCBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBvcHQgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgIGlmIChpZHggIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFcnJvcihpZHgsIDAsIDApO1xuICAgICAgICAgICAgdGhpcy5zZXRPcHQoW10pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID4gb3B0LnNpemUoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXJyb3IoaWR4LCAwLCBvcHQuc2l6ZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdC5yZW1vdmUoaWR4KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gRW5mb3JjZSB1c2UgdXNlIG9mIC9PcHQgZXZlbiBpZiBpdCBpc24ndCBzdHJpY3RseSBuZWNlc3NhcnlcbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5ub3JtYWxpemVFeHBvcnRWYWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgdmFyIGV4cG9ydFZhbHVlcyA9IChfYSA9IHRoaXMuZ2V0RXhwb3J0VmFsdWVzKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICB2YXIgT3B0ID0gW107XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIGV4cG9ydFZhbCA9IChfYiA9IGV4cG9ydFZhbHVlc1tpZHhdKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBQREZIZXhTdHJpbmcuZnJvbVRleHQoKF9kID0gKF9jID0gd2lkZ2V0LmdldE9uVmFsdWUoKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRlY29kZVRleHQoKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJycpO1xuICAgICAgICAgICAgT3B0LnB1c2goZXhwb3J0VmFsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldE9wdChPcHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV1c2VzIGV4aXN0aW5nIG9wdCBpZiBvbmUgZXhpc3RzIHdpdGggdGhlIHNhbWUgdmFsdWUgKGFzc3VtaW5nXG4gICAgICogYHVzZUV4aXN0aW5nSWR4YCBpcyBgdHJ1ZWApLiBSZXR1cm5zIGluZGV4IG9mIGV4aXN0aW5nIChvciBuZXcpIG9wdC5cbiAgICAgKi9cbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5hZGRPcHQgPSBmdW5jdGlvbiAob3B0LCB1c2VFeGlzdGluZ09wdElkeCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMubm9ybWFsaXplRXhwb3J0VmFsdWVzKCk7XG4gICAgICAgIHZhciBvcHRUZXh0ID0gb3B0LmRlY29kZVRleHQoKTtcbiAgICAgICAgdmFyIGV4aXN0aW5nSWR4O1xuICAgICAgICBpZiAodXNlRXhpc3RpbmdPcHRJZHgpIHtcbiAgICAgICAgICAgIHZhciBleHBvcnRWYWx1ZXMgPSAoX2EgPSB0aGlzLmdldEV4cG9ydFZhbHVlcygpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGV4cG9ydFZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZXhwb3J0VmFsID0gZXhwb3J0VmFsdWVzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKGV4cG9ydFZhbC5kZWNvZGVUZXh0KCkgPT09IG9wdFRleHQpXG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nSWR4ID0gaWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBPcHQgPSB0aGlzLk9wdCgpO1xuICAgICAgICBPcHQucHVzaChvcHQpO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdJZHggIT09IG51bGwgJiYgZXhpc3RpbmdJZHggIT09IHZvaWQgMCA/IGV4aXN0aW5nSWR4IDogT3B0LnNpemUoKSAtIDE7XG4gICAgfTtcbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5hZGRXaWRnZXRXaXRoT3B0ID0gZnVuY3Rpb24gKHdpZGdldCwgb3B0LCB1c2VFeGlzdGluZ09wdElkeCkge1xuICAgICAgICB2YXIgb3B0SWR4ID0gdGhpcy5hZGRPcHQob3B0LCB1c2VFeGlzdGluZ09wdElkeCk7XG4gICAgICAgIHZhciBhcFN0YXRlVmFsdWUgPSBQREZOYW1lLm9mKFN0cmluZyhvcHRJZHgpKTtcbiAgICAgICAgdGhpcy5hZGRXaWRnZXQod2lkZ2V0KTtcbiAgICAgICAgcmV0dXJuIGFwU3RhdGVWYWx1ZTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvQnV0dG9uO1xufShQREZBY3JvVGVybWluYWwpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9CdXR0b247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvQnV0dG9uLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9CdXR0b24gZnJvbSBcIi4vUERGQWNyb0J1dHRvblwiO1xuaW1wb3J0IHsgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGQWNyb0NoZWNrQm94ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvQ2hlY2tCb3gsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb0NoZWNrQm94KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9DaGVja0JveC5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgb25WYWx1ZSA9IChfYSA9IHRoaXMuZ2V0T25WYWx1ZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBQREZOYW1lLm9mKCdZZXMnKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBvblZhbHVlICYmIHZhbHVlICE9PSBQREZOYW1lLm9mKCdPZmYnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdWJyksIHZhbHVlKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB3aWRnZXQuZ2V0T25WYWx1ZSgpID09PSB2YWx1ZSA/IHZhbHVlIDogUERGTmFtZS5vZignT2ZmJyk7XG4gICAgICAgICAgICB3aWRnZXQuc2V0QXBwZWFyYW5jZVN0YXRlKHN0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQWNyb0NoZWNrQm94LnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHYgPSB0aGlzLlYoKTtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQREZOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIHJldHVybiBQREZOYW1lLm9mKCdPZmYnKTtcbiAgICB9O1xuICAgIFBERkFjcm9DaGVja0JveC5wcm90b3R5cGUuZ2V0T25WYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuZ2V0V2lkZ2V0cygpWzBdO1xuICAgICAgICByZXR1cm4gd2lkZ2V0ID09PSBudWxsIHx8IHdpZGdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2lkZ2V0LmdldE9uVmFsdWUoKTtcbiAgICB9O1xuICAgIFBERkFjcm9DaGVja0JveC5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvQ2hlY2tCb3goZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9DaGVja0JveC5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnQnRuJyxcbiAgICAgICAgICAgIEtpZHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0NoZWNrQm94KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0NoZWNrQm94O1xufShQREZBY3JvQnV0dG9uKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvQ2hlY2tCb3g7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvQ2hlY2tCb3guanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQWNyb1Rlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9UZXJtaW5hbFwiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCB7IEFjcm9DaG9pY2VGbGFncyB9IGZyb20gXCIuL2ZsYWdzXCI7XG5pbXBvcnQgeyBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvciwgTXVsdGlTZWxlY3RWYWx1ZUVycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZBY3JvQ2hvaWNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvQ2hvaWNlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9DaG9pY2UoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUuc2V0VmFsdWVzID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICBpZiAodGhpcy5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5Db21ibykgJiZcbiAgICAgICAgICAgICF0aGlzLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLkVkaXQpICYmXG4gICAgICAgICAgICAhdGhpcy52YWx1ZXNBcmVWYWxpZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdWJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1YnKSwgdmFsdWVzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5NdWx0aVNlbGVjdCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTXVsdGlTZWxlY3RWYWx1ZUVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1YnKSwgdGhpcy5kaWN0LmNvbnRleHQub2JqKHZhbHVlcykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRJbmRpY2VzKHZhbHVlcyk7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hvaWNlLnByb3RvdHlwZS52YWx1ZXNBcmVWYWxpZCA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoaWR4LCBsZW4pIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSB2YWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuZmluZChmdW5jdGlvbiAobykgeyByZXR1cm4gdmFsID09PSAoby5kaXNwbGF5IHx8IG8udmFsdWUpLmRlY29kZVRleHQoKTsgfSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHN0YXRlXzEgPSBfbG9vcF8xKGlkeCwgbGVuKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RhdGVfMSA9PT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGVfMS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIFBERkFjcm9DaG9pY2UucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGVkSW5kaWNlcyA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgaW5kaWNlcyA9IG5ldyBBcnJheSh2YWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICAgICAgICB2YXIgX2xvb3BfMiA9IGZ1bmN0aW9uIChpZHgsIGxlbikge1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSB2YWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCk7XG4gICAgICAgICAgICAgICAgaW5kaWNlc1tpZHhdID0gb3B0aW9ucy5maW5kSW5kZXgoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHZhbCA9PT0gKG8uZGlzcGxheSB8fCBvLnZhbHVlKS5kZWNvZGVUZXh0KCk7IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICBfbG9vcF8yKGlkeCwgbGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignSScpLCB0aGlzLmRpY3QuY29udGV4dC5vYmooaW5kaWNlcy5zb3J0KCkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignSScpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdiA9IHRoaXMuVigpO1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCB2IGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIFt2XTtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdi5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2Lmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcbiAgICBQREZBY3JvQ2hvaWNlLnByb3RvdHlwZS5PcHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwTWF5YmUoUERGTmFtZS5vZignT3B0JyksIFBERlN0cmluZywgUERGSGV4U3RyaW5nLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hvaWNlLnByb3RvdHlwZS5zZXRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG5ld09wdCA9IG5ldyBBcnJheShvcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBvcHRpb25zW2lkeF0sIHZhbHVlID0gX2EudmFsdWUsIGRpc3BsYXkgPSBfYS5kaXNwbGF5O1xuICAgICAgICAgICAgbmV3T3B0W2lkeF0gPSB0aGlzLmRpY3QuY29udGV4dC5vYmooW3ZhbHVlLCBkaXNwbGF5IHx8IHZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdPcHQnKSwgdGhpcy5kaWN0LmNvbnRleHQub2JqKG5ld09wdCkpO1xuICAgIH07XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIE9wdCA9IHRoaXMuT3B0KCk7XG4gICAgICAgIC8vIE5vdCBzdXBwb3NlZCB0byBoYXBwZW4gLSBPcHQgX3Nob3VsZF8gYWx3YXlzIGJlIGBQREZBcnJheSB8IHVuZGVmaW5lZGBcbiAgICAgICAgaWYgKE9wdCBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBPcHQgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBbeyB2YWx1ZTogT3B0LCBkaXNwbGF5OiBPcHQgfV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9wdCBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBPcHQuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBPcHQubG9va3VwKGlkeCk7XG4gICAgICAgICAgICAgICAgLy8gSWYgYGl0ZW1gIGlzIGEgc3RyaW5nLCB1c2UgdGhhdCBhcyBib3RoIHRoZSBleHBvcnQgYW5kIHRleHQgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBpdGVtIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKHsgdmFsdWU6IGl0ZW0sIGRpc3BsYXk6IGl0ZW0gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIGBpdGVtYCBpcyBhbiBhcnJheSBvZiBvbmUsIHRyZWF0IGl0IHRoZSBzYW1lIGFzIGp1c3QgYSBzdHJpbmcsXG4gICAgICAgICAgICAgICAgLy8gaWYgaXQncyBhbiBhcnJheSBvZiB0d28gdGhlbiBgaXRlbVswXWAgaXMgdGhlIGV4cG9ydCB2YWx1ZSBhbmRcbiAgICAgICAgICAgICAgICAvLyBgaXRlbVsxXWAgaXMgdGhlIHRleHQgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnNpemUoKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IGl0ZW0ubG9va3VwKDAsIFBERlN0cmluZywgUERGSGV4U3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWNvbmQgPSBpdGVtLmxvb2t1cE1heWJlKDEsIFBERlN0cmluZywgUERGSGV4U3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKHsgdmFsdWU6IGZpcnN0LCBkaXNwbGF5OiBzZWNvbmQgfHwgZmlyc3QgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvQ2hvaWNlO1xufShQREZBY3JvVGVybWluYWwpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9DaG9pY2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvQ2hvaWNlLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkFjcm9DaG9pY2UgZnJvbSBcIi4vUERGQWNyb0Nob2ljZVwiO1xuaW1wb3J0IHsgQWNyb0Nob2ljZUZsYWdzIH0gZnJvbSBcIi4vZmxhZ3NcIjtcbnZhciBQREZBY3JvQ29tYm9Cb3ggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9Db21ib0JveCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvQ29tYm9Cb3goKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb0NvbWJvQm94LmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9Db21ib0JveChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgUERGQWNyb0NvbWJvQm94LmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgRlQ6ICdDaCcsXG4gICAgICAgICAgICBGZjogQWNyb0Nob2ljZUZsYWdzLkNvbWJvLFxuICAgICAgICAgICAgS2lkczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvQ29tYm9Cb3goZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvQ29tYm9Cb3g7XG59KFBERkFjcm9DaG9pY2UpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9Db21ib0JveDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9Db21ib0JveC5qcy5tYXAiLCJpbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgeyBmaW5kTGFzdE1hdGNoIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBNaXNzaW5nREFFbnRyeUVycm9yLCBNaXNzaW5nVGZPcGVyYXRvckVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuLy8gRXhhbXBsZXM6XG4vLyAgIGAvSGVsdiAxMiBUZmAgLT4gWydIZWx2JywgJzEyJ11cbi8vICAgYC9IZUJvIDguMDAgVGZgIC0+IFsnSGVCbycsICc4LjAwJ11cbi8vICAgYC9IZUJvIFRmYCAtPiBbJ0hlQm8nLCB1bmRlZmluZWRdXG52YXIgdGZSZWdleCA9IC9cXC8oW15cXDBcXHRcXG5cXGZcXHJcXCBdKylbXFwwXFx0XFxuXFxmXFxyXFwgXSooXFxkKlxcLlxcZCt8XFxkKyk/W1xcMFxcdFxcblxcZlxcclxcIF0rVGYvO1xudmFyIFBERkFjcm9GaWVsZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZBY3JvRmllbGQoZGljdCwgcmVmKSB7XG4gICAgICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgIH1cbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLlQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwTWF5YmUoUERGTmFtZS5vZignVCcpLCBQREZTdHJpbmcsIFBERkhleFN0cmluZyk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLkZmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbnVtYmVyT3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUub2YoJ0ZmJykpO1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmNvbnRleHQubG9va3VwTWF5YmUobnVtYmVyT3JSZWYsIFBERk51bWJlcik7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLlYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZU9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLm9mKCdWJykpO1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmNvbnRleHQubG9va3VwKHZhbHVlT3JSZWYpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5LaWRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ0tpZHMnKSwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgLy8gUGFyZW50KCk6IFBERkRpY3QgfCB1bmRlZmluZWQge1xuICAgIC8vICAgcmV0dXJuIHRoaXMuZGljdC5sb29rdXBNYXliZShQREZOYW1lLm9mKCdQYXJlbnQnKSwgUERGRGljdCk7XG4gICAgLy8gfVxuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuREEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignREEnKSk7XG4gICAgICAgIGlmIChkYSBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBkYSBpbnN0YW5jZW9mIFBERkhleFN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBkYTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0S2lkcyA9IGZ1bmN0aW9uIChraWRzKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignS2lkcycpLCB0aGlzLmRpY3QuY29udGV4dC5vYmooa2lkcykpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5nZXRQYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGNvbnN0IHBhcmVudCA9IHRoaXMuUGFyZW50KCk7XG4gICAgICAgIC8vIGlmICghcGFyZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAvLyByZXR1cm4gbmV3IFBERkFjcm9GaWVsZChwYXJlbnQpO1xuICAgICAgICB2YXIgcGFyZW50UmVmID0gdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdQYXJlbnQnKSk7XG4gICAgICAgIGlmIChwYXJlbnRSZWYgaW5zdGFuY2VvZiBQREZSZWYpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignUGFyZW50JyksIFBERkRpY3QpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvRmllbGQocGFyZW50XzEsIHBhcmVudFJlZik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0UGFyZW50ID0gZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignUGFyZW50JykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1BhcmVudCcpLCBwYXJlbnQpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFBhcnRpYWxOYW1lKCk7XG4gICAgICAgIHJldHVybiBwYXJlbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgKyBcIi5cIiArIHRoaXMuZ2V0UGFydGlhbE5hbWUoKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuZ2V0UGFydGlhbE5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuVCgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXRQYXJ0aWFsTmFtZSA9IGZ1bmN0aW9uIChwYXJ0aWFsTmFtZSkge1xuICAgICAgICBpZiAoIXBhcnRpYWxOYW1lKVxuICAgICAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdUJykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1QnKSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KHBhcnRpYWxOYW1lKSk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldERlZmF1bHRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdEQScpLCBQREZTdHJpbmcub2YoYXBwZWFyYW5jZSkpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5nZXREZWZhdWx0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIERBID0gdGhpcy5EQSgpO1xuICAgICAgICBpZiAoREEgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBEQS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERBID09PSBudWxsIHx8IERBID09PSB2b2lkIDAgPyB2b2lkIDAgOiBEQS5hc1N0cmluZygpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBuYW1lID0gKF9hID0gdGhpcy5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgICAgIHZhciBkYSA9IHRoaXMuZ2V0RGVmYXVsdEFwcGVhcmFuY2UoKTtcbiAgICAgICAgaWYgKCFkYSlcbiAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nREFFbnRyeUVycm9yKG5hbWUpO1xuICAgICAgICB2YXIgZGFNYXRjaCA9IGZpbmRMYXN0TWF0Y2goZGEsIHRmUmVnZXgpO1xuICAgICAgICBpZiAoIWRhTWF0Y2gubWF0Y2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1RmT3BlcmF0b3JFcnJvcihuYW1lKTtcbiAgICAgICAgdmFyIGRhU3RhcnQgPSBkYS5zbGljZSgwLCBkYU1hdGNoLnBvcyAtIGRhTWF0Y2gubWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgdmFyIGRhRW5kID0gZGFNYXRjaC5wb3MgPD0gZGEubGVuZ3RoID8gZGEuc2xpY2UoZGFNYXRjaC5wb3MpIDogJyc7XG4gICAgICAgIHZhciBmb250TmFtZSA9IGRhTWF0Y2gubWF0Y2hbMV07XG4gICAgICAgIHZhciBtb2RpZmllZERhID0gZGFTdGFydCArIFwiIC9cIiArIGZvbnROYW1lICsgXCIgXCIgKyBmb250U2l6ZSArIFwiIFRmIFwiICsgZGFFbmQ7XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdEFwcGVhcmFuY2UobW9kaWZpZWREYSk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmdldEZsYWdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5GZigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0RmxhZ3MgPSBmdW5jdGlvbiAoZmxhZ3MpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdGZicpLCBQREZOdW1iZXIub2YoZmxhZ3MpKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuaGFzRmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBmbGFncyA9IHRoaXMuZ2V0RmxhZ3MoKTtcbiAgICAgICAgcmV0dXJuIChmbGFncyAmIGZsYWcpICE9PSAwO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXRGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5nZXRGbGFncygpO1xuICAgICAgICB0aGlzLnNldEZsYWdzKGZsYWdzIHwgZmxhZyk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmNsZWFyRmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBmbGFncyA9IHRoaXMuZ2V0RmxhZ3MoKTtcbiAgICAgICAgdGhpcy5zZXRGbGFncyhmbGFncyAmIH5mbGFnKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0RmxhZ1RvID0gZnVuY3Rpb24gKGZsYWcsIGVuYWJsZSkge1xuICAgICAgICBpZiAoZW5hYmxlKVxuICAgICAgICAgICAgdGhpcy5zZXRGbGFnKGZsYWcpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmNsZWFyRmxhZyhmbGFnKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgYXR0cmlidXRlO1xuICAgICAgICB0aGlzLmFzY2VuZChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUpXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlID0gbm9kZS5kaWN0LmdldChuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmFzY2VuZCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgICAgIHZpc2l0b3IodGhpcyk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICBpZiAocGFyZW50KVxuICAgICAgICAgICAgcGFyZW50LmFzY2VuZCh2aXNpdG9yKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvRmllbGQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb0ZpZWxkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0ZpZWxkLmpzLm1hcCIsImltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9Ob25UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvTm9uVGVybWluYWxcIjtcbmltcG9ydCB7IGNyZWF0ZVBERkFjcm9GaWVsZCwgY3JlYXRlUERGQWNyb0ZpZWxkcywgfSBmcm9tIFwiLi91dGlsc1wiO1xudmFyIFBERkFjcm9Gb3JtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkFjcm9Gb3JtKGRpY3QpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB9XG4gICAgUERGQWNyb0Zvcm0ucHJvdG90eXBlLkZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignRmllbGRzJykpO1xuICAgICAgICBpZiAoZmllbGRzIGluc3RhbmNlb2YgUERGQXJyYXkpXG4gICAgICAgICAgICByZXR1cm4gZmllbGRzO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQWNyb0Zvcm0ucHJvdG90eXBlLmdldEZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEZpZWxkcyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5GaWVsZHM7XG4gICAgICAgIHZhciBmaWVsZHMgPSBuZXcgQXJyYXkoRmllbGRzLnNpemUoKSk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEZpZWxkcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciByZWYgPSBGaWVsZHMuZ2V0KGlkeCk7XG4gICAgICAgICAgICB2YXIgZGljdCA9IEZpZWxkcy5sb29rdXAoaWR4LCBQREZEaWN0KTtcbiAgICAgICAgICAgIGZpZWxkc1tpZHhdID0gW2NyZWF0ZVBERkFjcm9GaWVsZChkaWN0LCByZWYpLCByZWZdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfTtcbiAgICBQREZBY3JvRm9ybS5wcm90b3R5cGUuZ2V0QWxsRmllbGRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYWxsRmllbGRzID0gW107XG4gICAgICAgIHZhciBwdXNoRmllbGRzID0gZnVuY3Rpb24gKGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKCFmaWVsZHMpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZmllbGRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpZHhdO1xuICAgICAgICAgICAgICAgIGFsbEZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRNb2RlbCA9IGZpZWxkWzBdO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZE1vZGVsIGluc3RhbmNlb2YgUERGQWNyb05vblRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hGaWVsZHMoY3JlYXRlUERGQWNyb0ZpZWxkcyhmaWVsZE1vZGVsLktpZHMoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcHVzaEZpZWxkcyh0aGlzLmdldEZpZWxkcygpKTtcbiAgICAgICAgcmV0dXJuIGFsbEZpZWxkcztcbiAgICB9O1xuICAgIFBERkFjcm9Gb3JtLnByb3RvdHlwZS5hZGRGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICB2YXIgRmllbGRzID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkZpZWxkcztcbiAgICAgICAgRmllbGRzID09PSBudWxsIHx8IEZpZWxkcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogRmllbGRzLnB1c2goZmllbGQpO1xuICAgIH07XG4gICAgUERGQWNyb0Zvcm0ucHJvdG90eXBlLnJlbW92ZUZpZWxkID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBmaWVsZC5nZXRQYXJlbnQoKTtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHBhcmVudCA9PT0gdW5kZWZpbmVkID8gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkZpZWxkcyA6IHBhcmVudC5LaWRzKCk7XG4gICAgICAgIHZhciBpbmRleCA9IGZpZWxkcyA9PT0gbnVsbCB8fCBmaWVsZHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkcy5pbmRleE9mKGZpZWxkLnJlZik7XG4gICAgICAgIGlmIChmaWVsZHMgPT09IHVuZGVmaW5lZCB8fCBpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmllZCB0byByZW1vdmUgaW5leGlzdGVudCBmaWVsZCBcIiArIGZpZWxkLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZHMucmVtb3ZlKGluZGV4KTtcbiAgICAgICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkICYmIGZpZWxkcy5zaXplKCkgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRmllbGQocGFyZW50KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQWNyb0Zvcm0ucHJvdG90eXBlLm5vcm1hbGl6ZWRFbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgRmllbGRzID0gdGhpcy5GaWVsZHMoKTtcbiAgICAgICAgaWYgKCFGaWVsZHMpIHtcbiAgICAgICAgICAgIEZpZWxkcyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihbXSk7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0ZpZWxkcycpLCBGaWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IEZpZWxkczogRmllbGRzIH07XG4gICAgfTtcbiAgICBQREZBY3JvRm9ybS5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0KSB7IHJldHVybiBuZXcgUERGQWNyb0Zvcm0oZGljdCk7IH07XG4gICAgUERGQWNyb0Zvcm0uY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7IEZpZWxkczogW10gfSk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0Zvcm0oZGljdCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0Zvcm07XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb0Zvcm07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvRm9ybS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBY3JvQ2hvaWNlIGZyb20gXCIuL1BERkFjcm9DaG9pY2VcIjtcbnZhciBQREZBY3JvTGlzdEJveCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb0xpc3RCb3gsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb0xpc3RCb3goKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb0xpc3RCb3guZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0xpc3RCb3goZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9MaXN0Qm94LmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgRlQ6ICdDaCcsXG4gICAgICAgICAgICBLaWRzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGRpY3QpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9MaXN0Qm94KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0xpc3RCb3g7XG59KFBERkFjcm9DaG9pY2UpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9MaXN0Qm94O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0xpc3RCb3guanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQWNyb0ZpZWxkIGZyb20gXCIuL1BERkFjcm9GaWVsZFwiO1xudmFyIFBERkFjcm9Ob25UZXJtaW5hbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb05vblRlcm1pbmFsLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9Ob25UZXJtaW5hbCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvTm9uVGVybWluYWwucHJvdG90eXBlLmFkZEZpZWxkID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLktpZHM7XG4gICAgICAgIEtpZHMgPT09IG51bGwgfHwgS2lkcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogS2lkcy5wdXNoKGZpZWxkKTtcbiAgICB9O1xuICAgIFBERkFjcm9Ob25UZXJtaW5hbC5wcm90b3R5cGUubm9ybWFsaXplZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIGlmICghS2lkcykge1xuICAgICAgICAgICAgS2lkcyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihbXSk7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0tpZHMnKSwgS2lkcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgS2lkczogS2lkcyB9O1xuICAgIH07XG4gICAgUERGQWNyb05vblRlcm1pbmFsLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9Ob25UZXJtaW5hbChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgUERGQWNyb05vblRlcm1pbmFsLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe30pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvTm9uVGVybWluYWwoZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvTm9uVGVybWluYWw7XG59KFBERkFjcm9GaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb05vblRlcm1pbmFsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb05vblRlcm1pbmFsLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkFjcm9CdXR0b24gZnJvbSBcIi4vUERGQWNyb0J1dHRvblwiO1xuaW1wb3J0IHsgQWNyb0J1dHRvbkZsYWdzIH0gZnJvbSBcIi4vZmxhZ3NcIjtcbnZhciBQREZBY3JvUHVzaEJ1dHRvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb1B1c2hCdXR0b24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb1B1c2hCdXR0b24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb1B1c2hCdXR0b24uZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1B1c2hCdXR0b24oZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9QdXNoQnV0dG9uLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgRlQ6ICdCdG4nLFxuICAgICAgICAgICAgRmY6IEFjcm9CdXR0b25GbGFncy5QdXNoQnV0dG9uLFxuICAgICAgICAgICAgS2lkczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvUHVzaEJ1dHRvbihkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9QdXNoQnV0dG9uO1xufShQREZBY3JvQnV0dG9uKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvUHVzaEJ1dHRvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9QdXNoQnV0dG9uLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9CdXR0b24gZnJvbSBcIi4vUERGQWNyb0J1dHRvblwiO1xuaW1wb3J0IHsgQWNyb0J1dHRvbkZsYWdzIH0gZnJvbSBcIi4vZmxhZ3NcIjtcbmltcG9ydCB7IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkFjcm9SYWRpb0J1dHRvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb1JhZGlvQnV0dG9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9SYWRpb0J1dHRvbigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvUmFkaW9CdXR0b24ucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBvblZhbHVlcyA9IHRoaXMuZ2V0T25WYWx1ZXMoKTtcbiAgICAgICAgaWYgKCFvblZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkgJiYgdmFsdWUgIT09IFBERk5hbWUub2YoJ09mZicpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1YnKSwgdmFsdWUpO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHdpZGdldC5nZXRPblZhbHVlKCkgPT09IHZhbHVlID8gdmFsdWUgOiBQREZOYW1lLm9mKCdPZmYnKTtcbiAgICAgICAgICAgIHdpZGdldC5zZXRBcHBlYXJhbmNlU3RhdGUoc3RhdGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZBY3JvUmFkaW9CdXR0b24ucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdiA9IHRoaXMuVigpO1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIFBERk5hbWUpXG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgcmV0dXJuIFBERk5hbWUub2YoJ09mZicpO1xuICAgIH07XG4gICAgUERGQWNyb1JhZGlvQnV0dG9uLnByb3RvdHlwZS5nZXRPblZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmdldFdpZGdldHMoKTtcbiAgICAgICAgdmFyIG9uVmFsdWVzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgb25WYWx1ZSA9IHdpZGdldHNbaWR4XS5nZXRPblZhbHVlKCk7XG4gICAgICAgICAgICBpZiAob25WYWx1ZSlcbiAgICAgICAgICAgICAgICBvblZhbHVlcy5wdXNoKG9uVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvblZhbHVlcztcbiAgICB9O1xuICAgIFBERkFjcm9SYWRpb0J1dHRvbi5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvUmFkaW9CdXR0b24oZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9SYWRpb0J1dHRvbi5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnQnRuJyxcbiAgICAgICAgICAgIEZmOiBBY3JvQnV0dG9uRmxhZ3MuUmFkaW8sXG4gICAgICAgICAgICBLaWRzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGRpY3QpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9SYWRpb0J1dHRvbihkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9SYWRpb0J1dHRvbjtcbn0oUERGQWNyb0J1dHRvbikpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb1JhZGlvQnV0dG9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb1JhZGlvQnV0dG9uLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkFjcm9UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvVGVybWluYWxcIjtcbnZhciBQREZBY3JvU2lnbmF0dXJlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvU2lnbmF0dXJlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9TaWduYXR1cmUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb1NpZ25hdHVyZS5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvU2lnbmF0dXJlKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb1NpZ25hdHVyZTtcbn0oUERGQWNyb1Rlcm1pbmFsKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvU2lnbmF0dXJlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb1NpZ25hdHVyZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBY3JvRmllbGQgZnJvbSBcIi4vUERGQWNyb0ZpZWxkXCI7XG5pbXBvcnQgUERGV2lkZ2V0QW5ub3RhdGlvbiBmcm9tIFwiLi4vYW5ub3RhdGlvbi9QREZXaWRnZXRBbm5vdGF0aW9uXCI7XG5pbXBvcnQgeyBJbmRleE91dE9mQm91bmRzRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGQWNyb1Rlcm1pbmFsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvVGVybWluYWwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb1Rlcm1pbmFsKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9UZXJtaW5hbC5wcm90b3R5cGUuRlQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBuYW1lT3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUub2YoJ0ZUJykpO1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmNvbnRleHQubG9va3VwKG5hbWVPclJlZiwgUERGTmFtZSk7XG4gICAgfTtcbiAgICBQREZBY3JvVGVybWluYWwucHJvdG90eXBlLmdldFdpZGdldHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBraWREaWN0cyA9IHRoaXMuS2lkcygpO1xuICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGl0c2VsZiBhIHdpZGdldFxuICAgICAgICBpZiAoIWtpZERpY3RzKVxuICAgICAgICAgICAgcmV0dXJuIFtQREZXaWRnZXRBbm5vdGF0aW9uLmZyb21EaWN0KHRoaXMuZGljdCldO1xuICAgICAgICAvLyBUaGlzIGZpZWxkJ3Mga2lkcyBhcmUgaXRzIHdpZGdldHNcbiAgICAgICAgdmFyIHdpZGdldHMgPSBuZXcgQXJyYXkoa2lkRGljdHMuc2l6ZSgpKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0ga2lkRGljdHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZGljdCA9IGtpZERpY3RzLmxvb2t1cChpZHgsIFBERkRpY3QpO1xuICAgICAgICAgICAgd2lkZ2V0c1tpZHhdID0gUERGV2lkZ2V0QW5ub3RhdGlvbi5mcm9tRGljdChkaWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkZ2V0cztcbiAgICB9O1xuICAgIFBERkFjcm9UZXJtaW5hbC5wcm90b3R5cGUuYWRkV2lkZ2V0ID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5LaWRzO1xuICAgICAgICBLaWRzLnB1c2gocmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXJtaW5hbC5wcm90b3R5cGUucmVtb3ZlV2lkZ2V0ID0gZnVuY3Rpb24gKGlkeCkge1xuICAgICAgICB2YXIga2lkRGljdHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgaWYgKCFraWREaWN0cykge1xuICAgICAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyBpdHNlbGYgYSB3aWRnZXRcbiAgICAgICAgICAgIGlmIChpZHggIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFcnJvcihpZHgsIDAsIDApO1xuICAgICAgICAgICAgdGhpcy5zZXRLaWRzKFtdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoaXMgZmllbGQncyBraWRzIGFyZSBpdHMgd2lkZ2V0c1xuICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID4ga2lkRGljdHMuc2l6ZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFcnJvcihpZHgsIDAsIGtpZERpY3RzLnNpemUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBraWREaWN0cy5yZW1vdmUoaWR4KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQWNyb1Rlcm1pbmFsLnByb3RvdHlwZS5ub3JtYWxpemVkRW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgLy8gSWYgdGhpcyBmaWVsZCBpcyBpdHNlbGYgYSB3aWRnZXQgKGJlY2F1c2UgaXQgd2FzIG9ubHkgcmVuZGVyZWQgb25jZSBpblxuICAgICAgICAvLyB0aGUgZG9jdW1lbnQsIHNvIHRoZSBmaWVsZCBhbmQgd2lkZ2V0IHByb3BlcnRpZXMgd2VyZSBtZXJnZWQpIHRoZW4gd2VcbiAgICAgICAgLy8gYWRkIGl0c2VsZiB0byB0aGUgYEtpZHNgIGFycmF5LiBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gdHJ5XG4gICAgICAgIC8vIHNwbGl0dGluZyBhcGFydCB0aGUgd2lkZ2V0IHByb3BlcnRpZXMgYW5kIGNyZWF0aW5nIGEgc2VwYXJhdGUgb2JqZWN0XG4gICAgICAgIC8vIGZvciB0aGVtLlxuICAgICAgICBpZiAoIUtpZHMpIHtcbiAgICAgICAgICAgIEtpZHMgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooW3RoaXMucmVmXSk7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0tpZHMnKSwgS2lkcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgS2lkczogS2lkcyB9O1xuICAgIH07XG4gICAgUERGQWNyb1Rlcm1pbmFsLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9UZXJtaW5hbChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9UZXJtaW5hbDtcbn0oUERGQWNyb0ZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvVGVybWluYWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvVGVybWluYWwuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQWNyb1Rlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9UZXJtaW5hbFwiO1xudmFyIFBERkFjcm9UZXh0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvVGV4dCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuTWF4TGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWF4TGVuID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdNYXhMZW4nKSk7XG4gICAgICAgIGlmIChtYXhMZW4gaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gbWF4TGVuO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLlEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBxID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdRJykpO1xuICAgICAgICBpZiAocSBpbnN0YW5jZW9mIFBERk51bWJlcilcbiAgICAgICAgICAgIHJldHVybiBxO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLnNldE1heExlbmd0aCA9IGZ1bmN0aW9uIChtYXhMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdNYXhMZW4nKSwgUERGTnVtYmVyLm9mKG1heExlbmd0aCkpO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLnJlbW92ZU1heExlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdNYXhMZW4nKSk7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuZ2V0TWF4TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLk1heExlbigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5zZXRRdWFkZGluZyA9IGZ1bmN0aW9uIChxdWFkZGluZykge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1EnKSwgUERGTnVtYmVyLm9mKHF1YWRkaW5nKSk7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuZ2V0UXVhZGRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuUSgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1YnKSwgdmFsdWUpO1xuICAgICAgICAvLyBjb25zdCB3aWRnZXRzID0gdGhpcy5nZXRXaWRnZXRzKCk7XG4gICAgICAgIC8vIGZvciAobGV0IGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIC8vICAgY29uc3Qgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAvLyAgIGNvbnN0IHN0YXRlID0gd2lkZ2V0LmdldE9uVmFsdWUoKSA9PT0gdmFsdWUgPyB2YWx1ZSA6IFBERk5hbWUub2YoJ09mZicpO1xuICAgICAgICAvLyAgIHdpZGdldC5zZXRBcHBlYXJhbmNlU3RhdGUoc3RhdGUpO1xuICAgICAgICAvLyB9XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUucmVtb3ZlVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignVicpKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHYgPSB0aGlzLlYoKTtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgdiBpbnN0YW5jZW9mIFBERkhleFN0cmluZylcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQuZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7IHJldHVybiBuZXcgUERGQWNyb1RleHQoZGljdCwgcmVmKTsgfTtcbiAgICBQREZBY3JvVGV4dC5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnVHgnLFxuICAgICAgICAgICAgS2lkczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvVGV4dChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9UZXh0O1xufShQREZBY3JvVGVybWluYWwpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9UZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb1RleHQuanMubWFwIiwidmFyIGZsYWcgPSBmdW5jdGlvbiAoYml0SW5kZXgpIHsgcmV0dXJuIDEgPDwgYml0SW5kZXg7IH07XG4vKiogRnJvbSBQREYgc3BlYyB0YWJsZSAyMjEgKi9cbmV4cG9ydCB2YXIgQWNyb0ZpZWxkRmxhZ3M7XG4oZnVuY3Rpb24gKEFjcm9GaWVsZEZsYWdzKSB7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgdXNlciBtYXkgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBBbnkgYXNzb2NpYXRlZFxuICAgICAqIHdpZGdldCBhbm5vdGF0aW9ucyB3aWxsIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyOyB0aGF0IGlzLCB0aGV5IHdpbGwgbm90XG4gICAgICogcmVzcG9uZCB0byBtb3VzZSBjbGlja3Mgb3IgY2hhbmdlIHRoZWlyIGFwcGVhcmFuY2UgaW4gcmVzcG9uc2UgdG8gbW91c2VcbiAgICAgKiBtb3Rpb25zLiBUaGlzIGZsYWcgaXMgdXNlZnVsIGZvciBmaWVsZHMgd2hvc2UgdmFsdWVzIGFyZSBjb21wdXRlZCBvclxuICAgICAqIGltcG9ydGVkIGZyb20gYSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBBY3JvRmllbGRGbGFnc1tBY3JvRmllbGRGbGFnc1tcIlJlYWRPbmx5XCJdID0gZmxhZygxIC0gMSldID0gXCJSZWFkT25seVwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIGhhdmUgYSB2YWx1ZSBhdCB0aGUgdGltZSBpdCBpcyBleHBvcnRlZCBieSBhXG4gICAgICogc3VibWl0LWZvcm0gYWN0aW9uIChzZWUgMTIuNy41LjIsIFwiU3VibWl0LUZvcm0gQWN0aW9uXCIpLlxuICAgICAqL1xuICAgIEFjcm9GaWVsZEZsYWdzW0Fjcm9GaWVsZEZsYWdzW1wiUmVxdWlyZWRcIl0gPSBmbGFnKDIgLSAxKV0gPSBcIlJlcXVpcmVkXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgbm90IGJlIGV4cG9ydGVkIGJ5IGEgc3VibWl0LWZvcm0gYWN0aW9uXG4gICAgICogKHNlZSAxMi43LjUuMiwgXCJTdWJtaXQtRm9ybSBBY3Rpb25cIikuXG4gICAgICovXG4gICAgQWNyb0ZpZWxkRmxhZ3NbQWNyb0ZpZWxkRmxhZ3NbXCJOb0V4cG9ydFwiXSA9IGZsYWcoMyAtIDEpXSA9IFwiTm9FeHBvcnRcIjtcbn0pKEFjcm9GaWVsZEZsYWdzIHx8IChBY3JvRmllbGRGbGFncyA9IHt9KSk7XG4vKiogRnJvbSBQREYgc3BlYyB0YWJsZSAyMjYgKi9cbmV4cG9ydCB2YXIgQWNyb0J1dHRvbkZsYWdzO1xuKGZ1bmN0aW9uIChBY3JvQnV0dG9uRmxhZ3MpIHtcbiAgICAvKipcbiAgICAgKiAoUmFkaW8gYnV0dG9ucyBvbmx5KSBJZiBzZXQsIGV4YWN0bHkgb25lIHJhZGlvIGJ1dHRvbiBzaGFsbCBiZSBzZWxlY3RlZCBhdFxuICAgICAqIGFsbCB0aW1lczsgc2VsZWN0aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnV0dG9uIGhhcyBubyBlZmZlY3QuIElmIGNsZWFyLFxuICAgICAqIGNsaWNraW5nIHRoZSBzZWxlY3RlZCBidXR0b24gZGVzZWxlY3RzIGl0LCBsZWF2aW5nIG5vIGJ1dHRvbiBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBBY3JvQnV0dG9uRmxhZ3NbQWNyb0J1dHRvbkZsYWdzW1wiTm9Ub2dnbGVUb09mZlwiXSA9IGZsYWcoMTUgLSAxKV0gPSBcIk5vVG9nZ2xlVG9PZmZcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHNldCBvZiByYWRpbyBidXR0b25zOyBpZiBjbGVhciwgdGhlIGZpZWxkIGlzIGEgY2hlY2tcbiAgICAgKiBib3guIFRoaXMgZmxhZyBtYXkgYmUgc2V0IG9ubHkgaWYgdGhlIFB1c2hidXR0b24gZmxhZyBpcyBjbGVhci5cbiAgICAgKi9cbiAgICBBY3JvQnV0dG9uRmxhZ3NbQWNyb0J1dHRvbkZsYWdzW1wiUmFkaW9cIl0gPSBmbGFnKDE2IC0gMSldID0gXCJSYWRpb1wiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgcHVzaGJ1dHRvbiB0aGF0IGRvZXMgbm90IHJldGFpbiBhIHBlcm1hbmVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBBY3JvQnV0dG9uRmxhZ3NbQWNyb0J1dHRvbkZsYWdzW1wiUHVzaEJ1dHRvblwiXSA9IGZsYWcoMTcgLSAxKV0gPSBcIlB1c2hCdXR0b25cIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGEgZ3JvdXAgb2YgcmFkaW8gYnV0dG9ucyB3aXRoaW4gYSByYWRpbyBidXR0b24gZmllbGQgdGhhdCB1c2UgdGhlXG4gICAgICogc2FtZSB2YWx1ZSBmb3IgdGhlIG9uIHN0YXRlIHdpbGwgdHVybiBvbiBhbmQgb2ZmIGluIHVuaXNvbjsgdGhhdCBpcyBpZiBvbmVcbiAgICAgKiBpcyBjaGVja2VkLCB0aGV5IGFyZSBhbGwgY2hlY2tlZC4gSWYgY2xlYXIsIHRoZSBidXR0b25zIGFyZSBtdXR1YWxseVxuICAgICAqIGV4Y2x1c2l2ZSAodGhlIHNhbWUgYmVoYXZpb3IgYXMgSFRNTCByYWRpbyBidXR0b25zKS5cbiAgICAgKi9cbiAgICBBY3JvQnV0dG9uRmxhZ3NbQWNyb0J1dHRvbkZsYWdzW1wiUmFkaW9zSW5Vbmlzb25cIl0gPSBmbGFnKDI2IC0gMSldID0gXCJSYWRpb3NJblVuaXNvblwiO1xufSkoQWNyb0J1dHRvbkZsYWdzIHx8IChBY3JvQnV0dG9uRmxhZ3MgPSB7fSkpO1xuLyoqIEZyb20gUERGIHNwZWMgdGFibGUgMjI4ICovXG5leHBvcnQgdmFyIEFjcm9UZXh0RmxhZ3M7XG4oZnVuY3Rpb24gKEFjcm9UZXh0RmxhZ3MpIHtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBtYXkgY29udGFpbiBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0OyBpZiBjbGVhciwgdGhlIGZpZWxkJ3NcbiAgICAgKiB0ZXh0IHNoYWxsIGJlIHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUgbGluZS5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJNdWx0aWxpbmVcIl0gPSBmbGFnKDEzIC0gMSldID0gXCJNdWx0aWxpbmVcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgZW50ZXJpbmcgYSBzZWN1cmUgcGFzc3dvcmQgdGhhdCBzaG91bGRcbiAgICAgKiBub3QgYmUgZWNob2VkIHZpc2libHkgdG8gdGhlIHNjcmVlbi4gQ2hhcmFjdGVycyB0eXBlZCBmcm9tIHRoZSBrZXlib2FyZFxuICAgICAqIHNoYWxsIGluc3RlYWQgYmUgZWNob2VkIGluIHNvbWUgdW5yZWFkYWJsZSBmb3JtLCBzdWNoIGFzIGFzdGVyaXNrcyBvclxuICAgICAqIGJ1bGxldCBjaGFyYWN0ZXJzLlxuICAgICAqID4gTk9URSAgIFRvIHByb3RlY3QgcGFzc3dvcmQgY29uZmlkZW50aWFsaXR5LCByZWFkZXJzIHNob3VsZCBuZXZlciBzdG9yZVxuICAgICAqID4gICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBmaWVsZCBpbiB0aGUgUERGIGZpbGUgaWYgdGhpcyBmbGFnIGlzIHNldC5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJQYXNzd29yZFwiXSA9IGZsYWcoMTQgLSAxKV0gPSBcIlBhc3N3b3JkXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCByZXByZXNlbnRzIHRoZSBwYXRobmFtZSBvZiBhIGZpbGVcbiAgICAgKiB3aG9zZSBjb250ZW50cyBzaGFsbCBiZSBzdWJtaXR0ZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJGaWxlU2VsZWN0XCJdID0gZmxhZygyMSAtIDEpXSA9IFwiRmlsZVNlbGVjdFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGwtY2hlY2tlZC5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJEb05vdFNwZWxsQ2hlY2tcIl0gPSBmbGFnKDIzIC0gMSldID0gXCJEb05vdFNwZWxsQ2hlY2tcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBub3Qgc2Nyb2xsIChob3Jpem9udGFsbHkgZm9yIHNpbmdsZS1saW5lIGZpZWxkcyxcbiAgICAgKiB2ZXJ0aWNhbGx5IGZvciBtdWx0aXBsZS1saW5lIGZpZWxkcykgdG8gYWNjb21tb2RhdGUgbW9yZSB0ZXh0IHRoYW4gZml0c1xuICAgICAqIHdpdGhpbiBpdHMgYW5ub3RhdGlvbiByZWN0YW5nbGUuIE9uY2UgdGhlIGZpZWxkIGlzIGZ1bGwsIG5vIGZ1cnRoZXIgdGV4dFxuICAgICAqIHNoYWxsIGJlIGFjY2VwdGVkIGZvciBpbnRlcmFjdGl2ZSBmb3JtIGZpbGxpbmc7IGZvciBub24taW50ZXJhY3RpdmUgZm9ybVxuICAgICAqIGZpbGxpbmcsIHRoZSBmaWxsZXIgc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gYWRkIG1vcmUgY2hhcmFjdGVyIHRoYW4gd2lsbFxuICAgICAqIHZpc2libHkgZml0IGluIHRoZSBkZWZpbmVkIGFyZWEuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiRG9Ob3RTY3JvbGxcIl0gPSBmbGFnKDI0IC0gMSldID0gXCJEb05vdFNjcm9sbFwiO1xuICAgIC8qKlxuICAgICAqIE1heSBiZSBzZXQgb25seSBpZiB0aGUgTWF4TGVuIGVudHJ5IGlzIHByZXNlbnQgaW4gdGhlIHRleHQgZmllbGQgZGljdGlvbmFyeVxuICAgICAqIChzZWUgVGFibGUgMjI5KSBhbmQgaWYgdGhlIE11bHRpbGluZSwgUGFzc3dvcmQsIGFuZCBGaWxlU2VsZWN0IGZsYWdzIGFyZVxuICAgICAqIGNsZWFyLiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBiZSBhdXRvbWF0aWNhbGx5IGRpdmlkZWQgaW50byBhcyBtYW55XG4gICAgICogZXF1YWxseSBzcGFjZWQgcG9zaXRpb25zLCBvciBjb21icywgYXMgdGhlIHZhbHVlIG9mIE1heExlbiwgYW5kIHRoZSB0ZXh0XG4gICAgICogaXMgbGFpZCBvdXQgaW50byB0aG9zZSBjb21icy5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJDb21iXCJdID0gZmxhZygyNSAtIDEpXSA9IFwiQ29tYlwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgc2hhbGwgYmUgYSByaWNoIHRleHQgc3RyaW5nXG4gICAgICogKHNlZSAxMi43LjMuNCwgXCJSaWNoIFRleHQgU3RyaW5nc1wiKS4gSWYgdGhlIGZpZWxkIGhhcyBhIHZhbHVlLCB0aGUgUlZcbiAgICAgKiBlbnRyeSBvZiB0aGUgZmllbGQgZGljdGlvbmFyeSAoVGFibGUgMjIyKSBzaGFsbCBzcGVjaWZ5IHRoZSByaWNoIHRleHRcbiAgICAgKiBzdHJpbmcuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiUmljaFRleHRcIl0gPSBmbGFnKDI2IC0gMSldID0gXCJSaWNoVGV4dFwiO1xufSkoQWNyb1RleHRGbGFncyB8fCAoQWNyb1RleHRGbGFncyA9IHt9KSk7XG4vKiogRnJvbSBQREYgc3BlYyB0YWJsZSAyMzAgKi9cbmV4cG9ydCB2YXIgQWNyb0Nob2ljZUZsYWdzO1xuKGZ1bmN0aW9uIChBY3JvQ2hvaWNlRmxhZ3MpIHtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIGNvbWJvIGJveDsgaWYgY2xlYXIsIHRoZSBmaWVsZCBpcyBhIGxpc3QgYm94LlxuICAgICAqL1xuICAgIEFjcm9DaG9pY2VGbGFnc1tBY3JvQ2hvaWNlRmxhZ3NbXCJDb21ib1wiXSA9IGZsYWcoMTggLSAxKV0gPSBcIkNvbWJvXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgY29tYm8gYm94IHNoYWxsIGluY2x1ZGUgYW4gZWRpdGFibGUgdGV4dCBib3ggYXMgd2VsbCBhcyBhXG4gICAgICogZHJvcC1kb3duIGxpc3Q7IGlmIGNsZWFyLCBpdCBzaGFsbCBpbmNsdWRlIG9ubHkgYSBkcm9wLWRvd24gbGlzdC4gVGhpc1xuICAgICAqIGZsYWcgc2hhbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBDb21ibyBmbGFnIGlzIHNldC5cbiAgICAgKi9cbiAgICBBY3JvQ2hvaWNlRmxhZ3NbQWNyb0Nob2ljZUZsYWdzW1wiRWRpdFwiXSA9IGZsYWcoMTkgLSAxKV0gPSBcIkVkaXRcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCdzIG9wdGlvbiBpdGVtcyBzaGFsbCBiZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuIFRoaXMgZmxhZ1xuICAgICAqIGlzIGludGVuZGVkIGZvciB1c2UgYnkgd3JpdGVycywgbm90IGJ5IHJlYWRlcnMuIENvbmZvcm1pbmcgcmVhZGVycyBzaGFsbFxuICAgICAqIGRpc3BsYXkgdGhlIG9wdGlvbnMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXIgaW4gdGhlIE9wdCBhcnJheVxuICAgICAqIChzZWUgVGFibGUgMjMxKS5cbiAgICAgKi9cbiAgICBBY3JvQ2hvaWNlRmxhZ3NbQWNyb0Nob2ljZUZsYWdzW1wiU29ydFwiXSA9IGZsYWcoMjAgLSAxKV0gPSBcIlNvcnRcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIG1vcmUgdGhhbiBvbmUgb2YgdGhlIGZpZWxkJ3Mgb3B0aW9uIGl0ZW1zIG1heSBiZSBzZWxlY3RlZFxuICAgICAqIHNpbXVsdGFuZW91c2x5OyBpZiBjbGVhciwgYXQgbW9zdCBvbmUgaXRlbSBzaGFsbCBiZSBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBBY3JvQ2hvaWNlRmxhZ3NbQWNyb0Nob2ljZUZsYWdzW1wiTXVsdGlTZWxlY3RcIl0gPSBmbGFnKDIyIC0gMSldID0gXCJNdWx0aVNlbGVjdFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGwtY2hlY2tlZC4gVGhpcyBmbGFnXG4gICAgICogc2hhbGwgbm90IGJlIHVzZWQgdW5sZXNzIHRoZSBDb21ibyBhbmQgRWRpdCBmbGFncyBhcmUgYm90aCBzZXQuXG4gICAgICovXG4gICAgQWNyb0Nob2ljZUZsYWdzW0Fjcm9DaG9pY2VGbGFnc1tcIkRvTm90U3BlbGxDaGVja1wiXSA9IGZsYWcoMjMgLSAxKV0gPSBcIkRvTm90U3BlbGxDaGVja1wiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIG5ldyB2YWx1ZSBzaGFsbCBiZSBjb21taXR0ZWQgYXMgc29vbiBhcyBhIHNlbGVjdGlvbiBpcyBtYWRlXG4gICAgICogKGNvbW1vbmx5IHdpdGggdGhlIHBvaW50aW5nIGRldmljZSkuIEluIHRoaXMgY2FzZSwgc3VwcGx5aW5nIGEgdmFsdWUgZm9yXG4gICAgICogYSBmaWVsZCBpbnZvbHZlcyB0aHJlZSBhY3Rpb25zOiBzZWxlY3RpbmcgdGhlIGZpZWxkIGZvciBmaWxsLWluLFxuICAgICAqIHNlbGVjdGluZyBhIGNob2ljZSBmb3IgdGhlIGZpbGwtaW4gdmFsdWUsIGFuZCBsZWF2aW5nIHRoYXQgZmllbGQsIHdoaWNoXG4gICAgICogZmluYWxpemVzIG9yIFwiY29tbWl0c1wiIHRoZSBkYXRhIGNob2ljZSBhbmQgdHJpZ2dlcnMgYW55IGFjdGlvbnMgYXNzb2NpYXRlZFxuICAgICAqIHdpdGggdGhlIGVudHJ5IG9yIGNoYW5naW5nIG9mIHRoaXMgZGF0YS4gSWYgdGhpcyBmbGFnIGlzIG9uLCB0aGVuXG4gICAgICogcHJvY2Vzc2luZyBkb2VzIG5vdCB3YWl0IGZvciBsZWF2aW5nIHRoZSBmaWVsZCBhY3Rpb24gdG8gb2NjdXIsIGJ1dFxuICAgICAqIGltbWVkaWF0ZWx5IHByb2NlZWRzIHRvIHRoZSB0aGlyZCBzdGVwLlxuICAgICAqXG4gICAgICogVGhpcyBvcHRpb24gZW5hYmxlcyBhcHBsaWNhdGlvbnMgdG8gcGVyZm9ybSBhbiBhY3Rpb24gb25jZSBhIHNlbGVjdGlvbiBpc1xuICAgICAqIG1hZGUsIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIGV4aXQgdGhlIGZpZWxkLiBJZiBjbGVhciwgdGhlIG5ld1xuICAgICAqIHZhbHVlIGlzIG5vdCBjb21taXR0ZWQgdW50aWwgdGhlIHVzZXIgZXhpdHMgdGhlIGZpZWxkLlxuICAgICAqL1xuICAgIEFjcm9DaG9pY2VGbGFnc1tBY3JvQ2hvaWNlRmxhZ3NbXCJDb21taXRPblNlbENoYW5nZVwiXSA9IGZsYWcoMjcgLSAxKV0gPSBcIkNvbW1pdE9uU2VsQ2hhbmdlXCI7XG59KShBY3JvQ2hvaWNlRmxhZ3MgfHwgKEFjcm9DaG9pY2VGbGFncyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbGFncy5qcy5tYXAiLCJleHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9CdXR0b24gfSBmcm9tIFwiLi9QREZBY3JvQnV0dG9uXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9DaGVja0JveCB9IGZyb20gXCIuL1BERkFjcm9DaGVja0JveFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvQ2hvaWNlIH0gZnJvbSBcIi4vUERGQWNyb0Nob2ljZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvQ29tYm9Cb3ggfSBmcm9tIFwiLi9QREZBY3JvQ29tYm9Cb3hcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb0ZpZWxkIH0gZnJvbSBcIi4vUERGQWNyb0ZpZWxkXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9Gb3JtIH0gZnJvbSBcIi4vUERGQWNyb0Zvcm1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb0xpc3RCb3ggfSBmcm9tIFwiLi9QREZBY3JvTGlzdEJveFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvTm9uVGVybWluYWwgfSBmcm9tIFwiLi9QREZBY3JvTm9uVGVybWluYWxcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb1B1c2hCdXR0b24gfSBmcm9tIFwiLi9QREZBY3JvUHVzaEJ1dHRvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvUmFkaW9CdXR0b24gfSBmcm9tIFwiLi9QREZBY3JvUmFkaW9CdXR0b25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb1NpZ25hdHVyZSB9IGZyb20gXCIuL1BERkFjcm9TaWduYXR1cmVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb1Rlcm1pbmFsIH0gZnJvbSBcIi4vUERGQWNyb1Rlcm1pbmFsXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9UZXh0IH0gZnJvbSBcIi4vUERGQWNyb1RleHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZsYWdzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZBY3JvVGVybWluYWwgZnJvbSBcIi4vUERGQWNyb1Rlcm1pbmFsXCI7XG5pbXBvcnQgUERGQWNyb05vblRlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9Ob25UZXJtaW5hbFwiO1xuaW1wb3J0IFBERkFjcm9TaWduYXR1cmUgZnJvbSBcIi4vUERGQWNyb1NpZ25hdHVyZVwiO1xuaW1wb3J0IFBERkFjcm9UZXh0IGZyb20gXCIuL1BERkFjcm9UZXh0XCI7XG5pbXBvcnQgUERGQWNyb1B1c2hCdXR0b24gZnJvbSBcIi4vUERGQWNyb1B1c2hCdXR0b25cIjtcbmltcG9ydCBQREZBY3JvUmFkaW9CdXR0b24gZnJvbSBcIi4vUERGQWNyb1JhZGlvQnV0dG9uXCI7XG5pbXBvcnQgUERGQWNyb0NoZWNrQm94IGZyb20gXCIuL1BERkFjcm9DaGVja0JveFwiO1xuaW1wb3J0IFBERkFjcm9Db21ib0JveCBmcm9tIFwiLi9QREZBY3JvQ29tYm9Cb3hcIjtcbmltcG9ydCBQREZBY3JvTGlzdEJveCBmcm9tIFwiLi9QREZBY3JvTGlzdEJveFwiO1xuaW1wb3J0IHsgQWNyb0J1dHRvbkZsYWdzLCBBY3JvQ2hvaWNlRmxhZ3MgfSBmcm9tIFwiLi9mbGFnc1wiO1xuZXhwb3J0IHZhciBjcmVhdGVQREZBY3JvRmllbGRzID0gZnVuY3Rpb24gKGtpZERpY3RzKSB7XG4gICAgaWYgKCFraWREaWN0cylcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIHZhciBraWRzID0gW107XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0ga2lkRGljdHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciByZWYgPSBraWREaWN0cy5nZXQoaWR4KTtcbiAgICAgICAgdmFyIGRpY3QgPSBraWREaWN0cy5sb29rdXAoaWR4KTtcbiAgICAgICAgLy8gaWYgKGRpY3QgaW5zdGFuY2VvZiBQREZEaWN0KSBraWRzLnB1c2goUERGQWNyb0ZpZWxkLmZyb21EaWN0KGRpY3QpKTtcbiAgICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIFBERlJlZiAmJiBkaWN0IGluc3RhbmNlb2YgUERGRGljdCkge1xuICAgICAgICAgICAga2lkcy5wdXNoKFtjcmVhdGVQREZBY3JvRmllbGQoZGljdCwgcmVmKSwgcmVmXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtpZHM7XG59O1xuZXhwb3J0IHZhciBjcmVhdGVQREZBY3JvRmllbGQgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgdmFyIGlzTm9uVGVybWluYWwgPSBpc05vblRlcm1pbmFsQWNyb0ZpZWxkKGRpY3QpO1xuICAgIGlmIChpc05vblRlcm1pbmFsKVxuICAgICAgICByZXR1cm4gUERGQWNyb05vblRlcm1pbmFsLmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgcmV0dXJuIGNyZWF0ZVBERkFjcm9UZXJtaW5hbChkaWN0LCByZWYpO1xufTtcbi8vIFRPRE86IE1heWJlIGp1c3QgY2hlY2sgaWYgdGhlIGRpY3QgaXMgKm5vdCogYSB3aWRnZXQ/IFRoYXQgbWlnaHQgYmUgYmV0dGVyLlxuLy8gQWNjb3JkaW5nIHRvIHRoZSBQREYgc3BlYzpcbi8vXG4vLyAgID4gQSBmaWVsZCdzIGNoaWxkcmVuIGluIHRoZSBoaWVyYXJjaHkgbWF5IGFsc28gaW5jbHVkZSB3aWRnZXQgYW5ub3RhdGlvbnNcbi8vICAgPiB0aGF0IGRlZmluZSBpdHMgYXBwZWFyYW5jZSBvbiB0aGUgcGFnZS4gQSBmaWVsZCB0aGF0IGhhcyBjaGlsZHJlbiB0aGF0XG4vLyAgID4gYXJlIGZpZWxkcyBpcyBjYWxsZWQgYSBub24tdGVybWluYWwgZmllbGQuIEEgZmllbGQgdGhhdCBkb2VzIG5vdCBoYXZlXG4vLyAgID4gY2hpbGRyZW4gdGhhdCBhcmUgZmllbGRzIGlzIGNhbGxlZCBhIHRlcm1pbmFsIGZpZWxkLlxuLy9cbi8vIFRoZSBzcGVjIGlzIG5vdCBlbnRpcmVseSBjbGVhciBhYm91dCBob3cgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlblxuLy8gZGljdGlvbmFyeSByZXByZXNlbnRzIGFuIGFjcm9maWVsZCBvciBhIHdpZGdldCBhbm5vdGF0aW9uLiBTbyB3ZSB3aWxsIGFzc3VtZVxuLy8gdGhhdCBhIGRpY3Rpb25hcnkgaXMgYW4gYWNyb2ZpZWxkIGlmIGl0IGlzIGEgbWVtYmVyIG9mIHRoZSBgL0tpZHNgIGFycmF5XG4vLyBhbmQgaXQgY29udGFpbnMgYSBgL1RgIGVudHJ5ICh3aWRnZXRzIGRvIG5vdCBoYXZlIGAvVGAgZW50cmllcykuIFRoaXMgaXNuJ3Rcbi8vIGEgYnVsbGV0IHByb29mIHNvbHV0aW9uLCBiZWNhdXNlIHRoZSBgL1RgIGVudHJ5IGlzIHRlY2huaWNhbGx5IGRlZmluZWQgYXNcbi8vIG9wdGlvbmFsIGZvciBhY3JvZmllbGRzIGJ5IHRoZSBQREYgc3BlYy4gQnV0IGluIHByYWN0aWNlIGFsbCBhY3JvZmllbGRzIHNlZW1cbi8vIHRvIGhhdmUgYSBgL1RgIGVudHJ5IGRlZmluZWQuXG52YXIgaXNOb25UZXJtaW5hbEFjcm9GaWVsZCA9IGZ1bmN0aW9uIChkaWN0KSB7XG4gICAgdmFyIGtpZHMgPSBkaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdLaWRzJykpO1xuICAgIGlmIChraWRzIGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0ga2lkcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBraWQgPSBraWRzLmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgdmFyIGtpZElzRmllbGQgPSBraWQgaW5zdGFuY2VvZiBQREZEaWN0ICYmIGtpZC5oYXMoUERGTmFtZS5vZignVCcpKTtcbiAgICAgICAgICAgIGlmIChraWRJc0ZpZWxkKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG52YXIgY3JlYXRlUERGQWNyb1Rlcm1pbmFsID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgIHZhciBmdE5hbWVPclJlZiA9IGdldEluaGVyaXRhYmxlQXR0cmlidXRlKGRpY3QsIFBERk5hbWUub2YoJ0ZUJykpO1xuICAgIHZhciB0eXBlID0gZGljdC5jb250ZXh0Lmxvb2t1cChmdE5hbWVPclJlZiwgUERGTmFtZSk7XG4gICAgaWYgKHR5cGUgPT09IFBERk5hbWUub2YoJ0J0bicpKVxuICAgICAgICByZXR1cm4gY3JlYXRlUERGQWNyb0J1dHRvbihkaWN0LCByZWYpO1xuICAgIGlmICh0eXBlID09PSBQREZOYW1lLm9mKCdDaCcpKVxuICAgICAgICByZXR1cm4gY3JlYXRlUERGQWNyb0Nob2ljZShkaWN0LCByZWYpO1xuICAgIGlmICh0eXBlID09PSBQREZOYW1lLm9mKCdUeCcpKVxuICAgICAgICByZXR1cm4gUERGQWNyb1RleHQuZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICBpZiAodHlwZSA9PT0gUERGTmFtZS5vZignU2lnJykpXG4gICAgICAgIHJldHVybiBQREZBY3JvU2lnbmF0dXJlLmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgLy8gV2Ugc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgbGluZS4gQnV0IHRoZXJlIGFyZSBhIGxvdCBvZiB3ZWlyZCBQREZzIG91dFxuICAgIC8vIHRoZXJlLiBTbywganVzdCB0byBiZSBzYWZlLCB3ZSdsbCB0cnkgdG8gaGFuZGxlIHRoaW5ncyBncmFjZWZ1bGx5IGluc3RlYWRcbiAgICAvLyBvZiB0aHJvd2luZyBhbiBlcnJvci5cbiAgICByZXR1cm4gUERGQWNyb1Rlcm1pbmFsLmZyb21EaWN0KGRpY3QsIHJlZik7XG59O1xudmFyIGNyZWF0ZVBERkFjcm9CdXR0b24gPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBmZk51bWJlck9yUmVmID0gZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoZGljdCwgUERGTmFtZS5vZignRmYnKSk7XG4gICAgdmFyIGZmTnVtYmVyID0gZGljdC5jb250ZXh0Lmxvb2t1cE1heWJlKGZmTnVtYmVyT3JSZWYsIFBERk51bWJlcik7XG4gICAgdmFyIGZsYWdzID0gKF9hID0gZmZOdW1iZXIgPT09IG51bGwgfHwgZmZOdW1iZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZmTnVtYmVyLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgaWYgKGZsYWdJc1NldChmbGFncywgQWNyb0J1dHRvbkZsYWdzLlB1c2hCdXR0b24pKSB7XG4gICAgICAgIHJldHVybiBQREZBY3JvUHVzaEJ1dHRvbi5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIH1cbiAgICBlbHNlIGlmIChmbGFnSXNTZXQoZmxhZ3MsIEFjcm9CdXR0b25GbGFncy5SYWRpbykpIHtcbiAgICAgICAgcmV0dXJuIFBERkFjcm9SYWRpb0J1dHRvbi5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFBERkFjcm9DaGVja0JveC5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIH1cbn07XG52YXIgY3JlYXRlUERGQWNyb0Nob2ljZSA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGZmTnVtYmVyT3JSZWYgPSBnZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShkaWN0LCBQREZOYW1lLm9mKCdGZicpKTtcbiAgICB2YXIgZmZOdW1iZXIgPSBkaWN0LmNvbnRleHQubG9va3VwTWF5YmUoZmZOdW1iZXJPclJlZiwgUERGTnVtYmVyKTtcbiAgICB2YXIgZmxhZ3MgPSAoX2EgPSBmZk51bWJlciA9PT0gbnVsbCB8fCBmZk51bWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmZOdW1iZXIuYXNOdW1iZXIoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICBpZiAoZmxhZ0lzU2V0KGZsYWdzLCBBY3JvQ2hvaWNlRmxhZ3MuQ29tYm8pKSB7XG4gICAgICAgIHJldHVybiBQREZBY3JvQ29tYm9Cb3guZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBQREZBY3JvTGlzdEJveC5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIH1cbn07XG52YXIgZmxhZ0lzU2V0ID0gZnVuY3Rpb24gKGZsYWdzLCBmbGFnKSB7XG4gICAgcmV0dXJuIChmbGFncyAmIGZsYWcpICE9PSAwO1xufTtcbnZhciBnZXRJbmhlcml0YWJsZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChzdGFydE5vZGUsIG5hbWUpIHtcbiAgICB2YXIgYXR0cmlidXRlO1xuICAgIGFzY2VuZChzdGFydE5vZGUsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmICghYXR0cmlidXRlKVxuICAgICAgICAgICAgYXR0cmlidXRlID0gbm9kZS5nZXQobmFtZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZTtcbn07XG52YXIgYXNjZW5kID0gZnVuY3Rpb24gKHN0YXJ0Tm9kZSwgdmlzaXRvcikge1xuICAgIHZpc2l0b3Ioc3RhcnROb2RlKTtcbiAgICB2YXIgUGFyZW50ID0gc3RhcnROb2RlLmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ1BhcmVudCcpLCBQREZEaWN0KTtcbiAgICBpZiAoUGFyZW50KVxuICAgICAgICBhc2NlbmQoUGFyZW50LCB2aXNpdG9yKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCJpbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbnZhciBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoZGljdCkge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIH1cbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5SID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgUiA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignUicpKTtcbiAgICAgICAgaWYgKFIgaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gUjtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLkJDID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQkMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0JDJykpO1xuICAgICAgICBpZiAoQkMgaW5zdGFuY2VvZiBQREZBcnJheSlcbiAgICAgICAgICAgIHJldHVybiBCQztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLkJHID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQkcgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0JHJykpO1xuICAgICAgICBpZiAoQkcgaW5zdGFuY2VvZiBQREZBcnJheSlcbiAgICAgICAgICAgIHJldHVybiBCRztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLkNBID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQ0EgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0NBJykpO1xuICAgICAgICBpZiAoQ0EgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcgfHwgQ0EgaW5zdGFuY2VvZiBQREZTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gQ0E7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5SQyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFJDID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdSQycpKTtcbiAgICAgICAgaWYgKFJDIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nIHx8IFJDIGluc3RhbmNlb2YgUERGU3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIFJDO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuQUMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBBQyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignQUMnKSk7XG4gICAgICAgIGlmIChBQyBpbnN0YW5jZW9mIFBERkhleFN0cmluZyB8fCBBQyBpbnN0YW5jZW9mIFBERlN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBBQztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLmdldFJvdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLlIoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCk7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5nZXRCb3JkZXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJDID0gdGhpcy5CQygpO1xuICAgICAgICBpZiAoIUJDKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gQkMgPT09IG51bGwgfHwgQkMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEJDLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IEJDLmdldChpZHgpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFBERk51bWJlcilcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50LmFzTnVtYmVyKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuZ2V0QmFja2dyb3VuZENvbG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQkcgPSB0aGlzLkJHKCk7XG4gICAgICAgIGlmICghQkcpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBCRyA9PT0gbnVsbCB8fCBCRyA9PT0gdm9pZCAwID8gdm9pZCAwIDogQkcuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gQkcuZ2V0KGlkeCk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQuYXNOdW1iZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5nZXRDYXB0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIENBID0gdGhpcy5DQSgpO1xuICAgICAgICB2YXIgUkMgPSB0aGlzLlJDKCk7XG4gICAgICAgIHZhciBBQyA9IHRoaXMuQUMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vcm1hbDogQ0EgPT09IG51bGwgfHwgQ0EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IENBLmRlY29kZVRleHQoKSxcbiAgICAgICAgICAgIHJvbGxvdmVyOiBSQyA9PT0gbnVsbCB8fCBSQyA9PT0gdm9pZCAwID8gdm9pZCAwIDogUkMuZGVjb2RlVGV4dCgpLFxuICAgICAgICAgICAgZG93bjogQUMgPT09IG51bGwgfHwgQUMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEFDLmRlY29kZVRleHQoKSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLnNldFJvdGF0aW9uID0gZnVuY3Rpb24gKHJvdGF0aW9uKSB7XG4gICAgICAgIHZhciBSID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKHJvdGF0aW9uKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdSJyksIFIpO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuc2V0Qm9yZGVyQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgdmFyIEJDID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGNvbG9yKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdCQycpLCBCQyk7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5zZXRCYWNrZ3JvdW5kQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgdmFyIEJHID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGNvbG9yKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdCRycpLCBCRyk7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5zZXRDYXB0aW9ucyA9IGZ1bmN0aW9uIChjYXB0aW9ucykge1xuICAgICAgICB2YXIgQ0EgPSBQREZIZXhTdHJpbmcuZnJvbVRleHQoY2FwdGlvbnMubm9ybWFsKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdDQScpLCBDQSk7XG4gICAgICAgIGlmIChjYXB0aW9ucy5yb2xsb3Zlcikge1xuICAgICAgICAgICAgdmFyIFJDID0gUERGSGV4U3RyaW5nLmZyb21UZXh0KGNhcHRpb25zLnJvbGxvdmVyKTtcbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUkMnKSwgUkMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdSQycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FwdGlvbnMuZG93bikge1xuICAgICAgICAgICAgdmFyIEFDID0gUERGSGV4U3RyaW5nLmZyb21UZXh0KGNhcHRpb25zLmRvd24pO1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdBQycpLCBBQyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ0FDJykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKGRpY3QpO1xuICAgIH07XG4gICAgcmV0dXJuIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3M7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MuanMubWFwIiwiaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbi8vIFRPRE86IEFsc28gaGFuZGxlIHRoZSBgL1NgIGFuZCBgL0RgIGVudHJpZXNcbnZhciBCb3JkZXJTdHlsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCb3JkZXJTdHlsZShkaWN0KSB7XG4gICAgICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgfVxuICAgIEJvcmRlclN0eWxlLnByb3RvdHlwZS5XID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgVyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignVycpKTtcbiAgICAgICAgaWYgKFcgaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gVztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEJvcmRlclN0eWxlLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuVygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMTtcbiAgICB9O1xuICAgIEJvcmRlclN0eWxlLnByb3RvdHlwZS5zZXRXaWR0aCA9IGZ1bmN0aW9uICh3aWR0aCkge1xuICAgICAgICB2YXIgVyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaih3aWR0aCk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVycpLCBXKTtcbiAgICB9O1xuICAgIEJvcmRlclN0eWxlLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QpIHsgcmV0dXJuIG5ldyBCb3JkZXJTdHlsZShkaWN0KTsgfTtcbiAgICByZXR1cm4gQm9yZGVyU3R5bGU7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQm9yZGVyU3R5bGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Cb3JkZXJTdHlsZS5qcy5tYXAiLCJpbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmVhbVwiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbnZhciBQREZBbm5vdGF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkFubm90YXRpb24oZGljdCkge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIH1cbiAgICAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IHJlcXVpcmVkIGJ5IHRoZSBQREYgc3BlY1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLlJlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1JlY3QnKSwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuQVAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwTWF5YmUoUERGTmFtZS5vZignQVAnKSwgUERGRGljdCk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5GID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbnVtYmVyT3JSZWYgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0YnKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QuY29udGV4dC5sb29rdXBNYXliZShudW1iZXJPclJlZiwgUERGTnVtYmVyKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmdldFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgUmVjdCA9IHRoaXMuUmVjdCgpO1xuICAgICAgICByZXR1cm4gKF9hID0gUmVjdCA9PT0gbnVsbCB8fCBSZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBSZWN0LmFzUmVjdGFuZ2xlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0UmVjdGFuZ2xlID0gZnVuY3Rpb24gKHJlY3QpIHtcbiAgICAgICAgdmFyIHggPSByZWN0LngsIHkgPSByZWN0LnksIHdpZHRoID0gcmVjdC53aWR0aCwgaGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XG4gICAgICAgIHZhciBSZWN0ID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdSZWN0JyksIFJlY3QpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0QXBwZWFyYW5jZVN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQVMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0FTJykpO1xuICAgICAgICBpZiAoQVMgaW5zdGFuY2VvZiBQREZOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIEFTO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0QXBwZWFyYW5jZVN0YXRlID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQVMnKSwgc3RhdGUpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0QXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZXMpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdBUCcpLCBhcHBlYXJhbmNlcyk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5lbnN1cmVBUCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5BUCgpO1xuICAgICAgICBpZiAoIUFQKSB7XG4gICAgICAgICAgICBBUCA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaih7fSk7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0FQJyksIEFQKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQVA7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXROb3JtYWxBcHBlYXJhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLmVuc3VyZUFQKCk7XG4gICAgICAgIHZhciBOID0gQVAuZ2V0KFBERk5hbWUub2YoJ04nKSk7XG4gICAgICAgIGlmIChOIGluc3RhbmNlb2YgUERGUmVmIHx8IE4gaW5zdGFuY2VvZiBQREZEaWN0KVxuICAgICAgICAgICAgcmV0dXJuIE47XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgTiB0eXBlOiBcIiArIChOID09PSBudWxsIHx8IE4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IE4uY29uc3RydWN0b3IubmFtZSkpO1xuICAgIH07XG4gICAgLyoqIEBwYXJhbSBhcHBlYXJhbmNlIEEgUERGRGljdCBvciBQREZTdHJlYW0gKGRpcmVjdCBvciByZWYpICovXG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0Tm9ybWFsQXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIHZhciBBUCA9IHRoaXMuZW5zdXJlQVAoKTtcbiAgICAgICAgQVAuc2V0KFBERk5hbWUub2YoJ04nKSwgYXBwZWFyYW5jZSk7XG4gICAgfTtcbiAgICAvKiogQHBhcmFtIGFwcGVhcmFuY2UgQSBQREZEaWN0IG9yIFBERlN0cmVhbSAoZGlyZWN0IG9yIHJlZikgKi9cbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRSb2xsb3ZlckFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLmVuc3VyZUFQKCk7XG4gICAgICAgIEFQLnNldChQREZOYW1lLm9mKCdSJyksIGFwcGVhcmFuY2UpO1xuICAgIH07XG4gICAgLyoqIEBwYXJhbSBhcHBlYXJhbmNlIEEgUERGRGljdCBvciBQREZTdHJlYW0gKGRpcmVjdCBvciByZWYpICovXG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0RG93bkFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLmVuc3VyZUFQKCk7XG4gICAgICAgIEFQLnNldChQREZOYW1lLm9mKCdEJyksIGFwcGVhcmFuY2UpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUucmVtb3ZlUm9sbG92ZXJBcHBlYXJhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLkFQKCk7XG4gICAgICAgIEFQID09PSBudWxsIHx8IEFQID09PSB2b2lkIDAgPyB2b2lkIDAgOiBBUC5kZWxldGUoUERGTmFtZS5vZignUicpKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnJlbW92ZURvd25BcHBlYXJhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLkFQKCk7XG4gICAgICAgIEFQID09PSBudWxsIHx8IEFQID09PSB2b2lkIDAgPyB2b2lkIDAgOiBBUC5kZWxldGUoUERGTmFtZS5vZignRCcpKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmdldEFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLkFQKCk7XG4gICAgICAgIGlmICghQVApXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgTiA9IEFQLmxvb2t1cChQREZOYW1lLm9mKCdOJyksIFBERkRpY3QsIFBERlN0cmVhbSk7XG4gICAgICAgIHZhciBSID0gQVAubG9va3VwTWF5YmUoUERGTmFtZS5vZignUicpLCBQREZEaWN0LCBQREZTdHJlYW0pO1xuICAgICAgICB2YXIgRCA9IEFQLmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ0QnKSwgUERGRGljdCwgUERGU3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIHsgbm9ybWFsOiBOLCByb2xsb3ZlcjogUiwgZG93bjogRCB9O1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0RmxhZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkYoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRGbGFncyA9IGZ1bmN0aW9uIChmbGFncykge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0YnKSwgUERGTnVtYmVyLm9mKGZsYWdzKSk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5oYXNGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5nZXRGbGFncygpO1xuICAgICAgICByZXR1cm4gKGZsYWdzICYgZmxhZykgIT09IDA7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5nZXRGbGFncygpO1xuICAgICAgICB0aGlzLnNldEZsYWdzKGZsYWdzIHwgZmxhZyk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5jbGVhckZsYWcgPSBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICB2YXIgZmxhZ3MgPSB0aGlzLmdldEZsYWdzKCk7XG4gICAgICAgIHRoaXMuc2V0RmxhZ3MoZmxhZ3MgJiB+ZmxhZyk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRGbGFnVG8gPSBmdW5jdGlvbiAoZmxhZywgZW5hYmxlKSB7XG4gICAgICAgIGlmIChlbmFibGUpXG4gICAgICAgICAgICB0aGlzLnNldEZsYWcoZmxhZyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGbGFnKGZsYWcpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0KSB7IHJldHVybiBuZXcgUERGQW5ub3RhdGlvbihkaWN0KTsgfTtcbiAgICByZXR1cm4gUERGQW5ub3RhdGlvbjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBbm5vdGF0aW9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQW5ub3RhdGlvbi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBCb3JkZXJTdHlsZSBmcm9tIFwiLi9Cb3JkZXJTdHlsZVwiO1xuaW1wb3J0IFBERkFubm90YXRpb24gZnJvbSBcIi4vUERGQW5ub3RhdGlvblwiO1xuaW1wb3J0IEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MgZnJvbSBcIi4vQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljc1wiO1xudmFyIFBERldpZGdldEFubm90YXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERldpZGdldEFubm90YXRpb24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGV2lkZ2V0QW5ub3RhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5NSyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIE1LID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdNSycpKTtcbiAgICAgICAgaWYgKE1LIGluc3RhbmNlb2YgUERGRGljdClcbiAgICAgICAgICAgIHJldHVybiBNSztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLkJTID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQlMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0JTJykpO1xuICAgICAgICBpZiAoQlMgaW5zdGFuY2VvZiBQREZEaWN0KVxuICAgICAgICAgICAgcmV0dXJuIEJTO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuREEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignREEnKSk7XG4gICAgICAgIGlmIChkYSBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBkYSBpbnN0YW5jZW9mIFBERkhleFN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBkYTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLlAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBQID0gdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdQJykpO1xuICAgICAgICBpZiAoUCBpbnN0YW5jZW9mIFBERlJlZilcbiAgICAgICAgICAgIHJldHVybiBQO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0UCA9IGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUCcpLCBwYWdlKTtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLnNldERlZmF1bHRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdEQScpLCBQREZTdHJpbmcub2YoYXBwZWFyYW5jZSkpO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0RGVmYXVsdEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBEQSA9IHRoaXMuREEoKTtcbiAgICAgICAgaWYgKERBIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gREEuZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEQSA9PT0gbnVsbCB8fCBEQSA9PT0gdm9pZCAwID8gdm9pZCAwIDogREEuYXNTdHJpbmcoKTtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBNSyA9IHRoaXMuTUsoKTtcbiAgICAgICAgaWYgKE1LKVxuICAgICAgICAgICAgcmV0dXJuIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MuZnJvbURpY3QoTUspO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0T3JDcmVhdGVBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgTUsgPSB0aGlzLk1LKCk7XG4gICAgICAgIGlmIChNSylcbiAgICAgICAgICAgIHJldHVybiBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmZyb21EaWN0KE1LKTtcbiAgICAgICAgdmFyIGFjID0gQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5mcm9tRGljdCh0aGlzLmRpY3QuY29udGV4dC5vYmooe30pKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdNSycpLCBhYy5kaWN0KTtcbiAgICAgICAgcmV0dXJuIGFjO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0Qm9yZGVyU3R5bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCUyA9IHRoaXMuQlMoKTtcbiAgICAgICAgaWYgKEJTKVxuICAgICAgICAgICAgcmV0dXJuIEJvcmRlclN0eWxlLmZyb21EaWN0KEJTKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldE9yQ3JlYXRlQm9yZGVyU3R5bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCUyA9IHRoaXMuQlMoKTtcbiAgICAgICAgaWYgKEJTKVxuICAgICAgICAgICAgcmV0dXJuIEJvcmRlclN0eWxlLmZyb21EaWN0KEJTKTtcbiAgICAgICAgdmFyIGJzID0gQm9yZGVyU3R5bGUuZnJvbURpY3QodGhpcy5kaWN0LmNvbnRleHQub2JqKHt9KSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQlMnKSwgYnMuZGljdCk7XG4gICAgICAgIHJldHVybiBicztcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldE9uVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIG5vcm1hbCA9IChfYSA9IHRoaXMuZ2V0QXBwZWFyYW5jZXMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vcm1hbDtcbiAgICAgICAgaWYgKG5vcm1hbCBpbnN0YW5jZW9mIFBERkRpY3QpIHtcbiAgICAgICAgICAgIHZhciBrZXlzID0gbm9ybWFsLmtleXMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGtleXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSBQREZOYW1lLm9mKCdPZmYnKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGV2lkZ2V0QW5ub3RhdGlvbihkaWN0KTtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24uY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQsIHBhcmVudCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIFR5cGU6ICdBbm5vdCcsXG4gICAgICAgICAgICBTdWJ0eXBlOiAnV2lkZ2V0JyxcbiAgICAgICAgICAgIFJlY3Q6IFswLCAwLCAwLCAwXSxcbiAgICAgICAgICAgIFBhcmVudDogcGFyZW50LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZXaWRnZXRBbm5vdGF0aW9uKGRpY3QpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERldpZGdldEFubm90YXRpb247XG59KFBERkFubm90YXRpb24pKTtcbmV4cG9ydCBkZWZhdWx0IFBERldpZGdldEFubm90YXRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZXaWRnZXRBbm5vdGF0aW9uLmpzLm1hcCIsInZhciBmbGFnID0gZnVuY3Rpb24gKGJpdEluZGV4KSB7IHJldHVybiAxIDw8IGJpdEluZGV4OyB9O1xuLyoqIEZyb20gUERGIHNwZWMgdGFibGUgMTY1ICovXG5leHBvcnQgdmFyIEFubm90YXRpb25GbGFncztcbihmdW5jdGlvbiAoQW5ub3RhdGlvbkZsYWdzKSB7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3QgZGlzcGxheSB0aGUgYW5ub3RhdGlvbiBpZiBpdCBkb2VzIG5vdCBiZWxvbmcgdG8gb25lIG9mIHRoZVxuICAgICAqIHN0YW5kYXJkIGFubm90YXRpb24gdHlwZXMgYW5kIG5vIGFubm90YXRpb24gaGFuZGxlciBpcyBhdmFpbGFibGUuIElmIGNsZWFyLFxuICAgICAqIGRpc3BsYXkgc3VjaCBhbiB1bmtub3duIGFubm90YXRpb24gdXNpbmcgYW4gYXBwZWFyYW5jZSBzdHJlYW0gc3BlY2lmaWVkIGJ5XG4gICAgICogaXRzIGFwcGVhcmFuY2UgZGljdGlvbmFyeSwgaWYgYW55LlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJJbnZpc2libGVcIl0gPSBmbGFnKDEgLSAxKV0gPSBcIkludmlzaWJsZVwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IGRpc3BsYXkgb3IgcHJpbnQgdGhlIGFubm90YXRpb24gb3IgYWxsb3cgaXQgdG8gaW50ZXJhY3Qgd2l0aFxuICAgICAqIHRoZSB1c2VyLCByZWdhcmRsZXNzIG9mIGl0cyBhbm5vdGF0aW9uIHR5cGUgb3Igd2hldGhlciBhbiBhbm5vdGF0aW9uXG4gICAgICogaGFuZGxlciBpcyBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBJbiBjYXNlcyB3aGVyZSBzY3JlZW4gc3BhY2UgaXMgbGltaXRlZCwgdGhlIGFiaWxpdHkgdG8gaGlkZSBhbmQgc2hvd1xuICAgICAqIGFubm90YXRpb25zIHNlbGVjdGl2ZWx5IGNhbiBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggYXBwZWFyYW5jZSBzdHJlYW1zXG4gICAgICogdG8gZGlzcGxheSBhdXhpbGlhcnkgcG9wLXVwIGluZm9ybWF0aW9uIHNpbWlsYXIgaW4gZnVuY3Rpb24gdG8gb25saW5lIGhlbHBcbiAgICAgKiBzeXN0ZW1zLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJIaWRkZW5cIl0gPSBmbGFnKDIgLSAxKV0gPSBcIkhpZGRlblwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgcHJpbnQgdGhlIGFubm90YXRpb24gd2hlbiB0aGUgcGFnZSBpcyBwcmludGVkLiBJZiBjbGVhciwgbmV2ZXJcbiAgICAgKiBwcmludCB0aGUgYW5ub3RhdGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBhbm5vdGF0aW9ucyByZXByZXNlbnRpbmcgaW50ZXJhY3RpdmUgcHVzaGJ1dHRvbnMsXG4gICAgICogd2hpY2ggd291bGQgc2VydmUgbm8gbWVhbmluZ2Z1bCBwdXJwb3NlIG9uIHRoZSBwcmludGVkIHBhZ2UuXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIlByaW50XCJdID0gZmxhZygzIC0gMSldID0gXCJQcmludFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IHNjYWxlIHRoZSBhbm5vdGF0aW9u4oCZcyBhcHBlYXJhbmNlIHRvIG1hdGNoIHRoZSBtYWduaWZpY2F0aW9uXG4gICAgICogb2YgdGhlIHBhZ2UuIFRoZSBsb2NhdGlvbiBvZiB0aGUgYW5ub3RhdGlvbiBvbiB0aGUgcGFnZSAoZGVmaW5lZCBieSB0aGVcbiAgICAgKiB1cHBlci1sZWZ0IGNvcm5lciBvZiBpdHMgYW5ub3RhdGlvbiByZWN0YW5nbGUpIHNoYWxsIHJlbWFpbiBmaXhlZCxcbiAgICAgKiByZWdhcmRsZXNzIG9mIHRoZSBwYWdlIG1hZ25pZmljYXRpb24uXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIk5vWm9vbVwiXSA9IGZsYWcoNCAtIDEpXSA9IFwiTm9ab29tXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3Qgcm90YXRlIHRoZSBhbm5vdGF0aW9u4oCZcyBhcHBlYXJhbmNlIHRvIG1hdGNoIHRoZSByb3RhdGlvbiBvZlxuICAgICAqIHRoZSBwYWdlLiBUaGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGFubm90YXRpb24gcmVjdGFuZ2xlIHNoYWxsIHJlbWFpbiBpblxuICAgICAqIGEgZml4ZWQgbG9jYXRpb24gb24gdGhlIHBhZ2UsIHJlZ2FyZGxlc3Mgb2YgdGhlIHBhZ2Ugcm90YXRpb24uXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIk5vUm90YXRlXCJdID0gZmxhZyg1IC0gMSldID0gXCJOb1JvdGF0ZVwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IGRpc3BsYXkgdGhlIGFubm90YXRpb24gb24gdGhlIHNjcmVlbiBvciBhbGxvdyBpdCB0byBpbnRlcmFjdFxuICAgICAqIHdpdGggdGhlIHVzZXIuIFRoZSBhbm5vdGF0aW9uIG1heSBiZSBwcmludGVkIChkZXBlbmRpbmcgb24gdGhlIHNldHRpbmcgb2ZcbiAgICAgKiB0aGUgUHJpbnQgZmxhZykgYnV0IHNob3VsZCBiZSBjb25zaWRlcmVkIGhpZGRlbiBmb3IgcHVycG9zZXMgb2Ygb24tc2NyZWVuXG4gICAgICogZGlzcGxheSBhbmQgdXNlciBpbnRlcmFjdGlvbi5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiTm9WaWV3XCJdID0gZmxhZyg2IC0gMSldID0gXCJOb1ZpZXdcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBhbGxvdyB0aGUgYW5ub3RhdGlvbiB0byBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyLiBUaGVcbiAgICAgKiBhbm5vdGF0aW9uIG1heSBiZSBkaXNwbGF5ZWQgb3IgcHJpbnRlZCAoZGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5ncyBvZiB0aGVcbiAgICAgKiBOb1ZpZXcgYW5kIFByaW50IGZsYWdzKSBidXQgc2hvdWxkIG5vdCByZXNwb25kIHRvIG1vdXNlIGNsaWNrcyBvciBjaGFuZ2VcbiAgICAgKiBpdHMgYXBwZWFyYW5jZSBpbiByZXNwb25zZSB0byBtb3VzZSBtb3Rpb25zLlxuICAgICAqXG4gICAgICogVGhpcyBmbGFnIHNoYWxsIGJlIGlnbm9yZWQgZm9yIHdpZGdldCBhbm5vdGF0aW9uczsgaXRzIGZ1bmN0aW9uIGlzXG4gICAgICogc3Vic3VtZWQgYnkgdGhlIFJlYWRPbmx5IGZsYWcgb2YgdGhlIGFzc29jaWF0ZWQgZm9ybSBmaWVsZC5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiUmVhZE9ubHlcIl0gPSBmbGFnKDcgLSAxKV0gPSBcIlJlYWRPbmx5XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3QgYWxsb3cgdGhlIGFubm90YXRpb24gdG8gYmUgZGVsZXRlZCBvciBpdHMgcHJvcGVydGllc1xuICAgICAqIChpbmNsdWRpbmcgcG9zaXRpb24gYW5kIHNpemUpIHRvIGJlIG1vZGlmaWVkIGJ5IHRoZSB1c2VyLiBIb3dldmVyLCB0aGlzXG4gICAgICogZmxhZyBkb2VzIG5vdCByZXN0cmljdCBjaGFuZ2VzIHRvIHRoZSBhbm5vdGF0aW9u4oCZcyBjb250ZW50cywgc3VjaCBhcyB0aGVcbiAgICAgKiB2YWx1ZSBvZiBhIGZvcm0gZmllbGQuXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIkxvY2tlZFwiXSA9IGZsYWcoOCAtIDEpXSA9IFwiTG9ja2VkXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBpbnZlcnQgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBOb1ZpZXcgZmxhZyBmb3IgY2VydGFpbiBldmVudHMuXG4gICAgICpcbiAgICAgKiBBIHR5cGljYWwgdXNlIGlzIHRvIGhhdmUgYW4gYW5ub3RhdGlvbiB0aGF0IGFwcGVhcnMgb25seSB3aGVuIGEgbW91c2VcbiAgICAgKiBjdXJzb3IgaXMgaGVsZCBvdmVyIGl0LlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJUb2dnbGVOb1ZpZXdcIl0gPSBmbGFnKDkgLSAxKV0gPSBcIlRvZ2dsZU5vVmlld1wiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IGFsbG93IHRoZSBjb250ZW50cyBvZiB0aGUgYW5ub3RhdGlvbiB0byBiZSBtb2RpZmllZCBieSB0aGVcbiAgICAgKiB1c2VyLiBUaGlzIGZsYWcgZG9lcyBub3QgcmVzdHJpY3QgZGVsZXRpb24gb2YgdGhlIGFubm90YXRpb24gb3IgY2hhbmdlcyB0b1xuICAgICAqIG90aGVyIGFubm90YXRpb24gcHJvcGVydGllcywgc3VjaCBhcyBwb3NpdGlvbiBhbmQgc2l6ZS5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiTG9ja2VkQ29udGVudHNcIl0gPSBmbGFnKDEwIC0gMSldID0gXCJMb2NrZWRDb250ZW50c1wiO1xufSkoQW5ub3RhdGlvbkZsYWdzIHx8IChBbm5vdGF0aW9uRmxhZ3MgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxhZ3MuanMubWFwIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBbm5vdGF0aW9uIH0gZnJvbSBcIi4vUERGQW5ub3RhdGlvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZXaWRnZXRBbm5vdGF0aW9uIH0gZnJvbSBcIi4vUERGV2lkZ2V0QW5ub3RhdGlvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzIH0gZnJvbSBcIi4vQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmxhZ3NcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciwgcGFkU3RhcnQgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogRW50cmllcyBzaG91bGQgYmUgYWRkZWQgdXNpbmcgdGhlIFtbYWRkRW50cnldXSBhbmQgW1thZGREZWxldGVkRW50cnldXVxuICogbWV0aG9kcyAqKmluIG9yZGVyIG9mIGFzY2VuZGluZyBvYmplY3QgbnVtYmVyKiouXG4gKi9cbnZhciBQREZDcm9zc1JlZlNlY3Rpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGQ3Jvc3NSZWZTZWN0aW9uKGZpcnN0RW50cnkpIHtcbiAgICAgICAgdGhpcy5zdWJzZWN0aW9ucyA9IGZpcnN0RW50cnkgPyBbW2ZpcnN0RW50cnldXSA6IFtdO1xuICAgICAgICB0aGlzLmNodW5rSWR4ID0gMDtcbiAgICAgICAgdGhpcy5jaHVua0xlbmd0aCA9IGZpcnN0RW50cnkgPyAxIDogMDtcbiAgICB9XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5hZGRFbnRyeSA9IGZ1bmN0aW9uIChyZWYsIG9mZnNldCkge1xuICAgICAgICB0aGlzLmFwcGVuZCh7IHJlZjogcmVmLCBvZmZzZXQ6IG9mZnNldCwgZGVsZXRlZDogZmFsc2UgfSk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLmFkZERlbGV0ZWRFbnRyeSA9IGZ1bmN0aW9uIChyZWYsIG5leHRGcmVlT2JqZWN0TnVtYmVyKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKHsgcmVmOiByZWYsIG9mZnNldDogbmV4dEZyZWVPYmplY3ROdW1iZXIsIGRlbGV0ZWQ6IHRydWUgfSk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2VjdGlvbiA9IFwieHJlZlxcblwiO1xuICAgICAgICBmb3IgKHZhciByYW5nZUlkeCA9IDAsIHJhbmdlTGVuID0gdGhpcy5zdWJzZWN0aW9ucy5sZW5ndGg7IHJhbmdlSWR4IDwgcmFuZ2VMZW47IHJhbmdlSWR4KyspIHtcbiAgICAgICAgICAgIHZhciByYW5nZSA9IHRoaXMuc3Vic2VjdGlvbnNbcmFuZ2VJZHhdO1xuICAgICAgICAgICAgc2VjdGlvbiArPSByYW5nZVswXS5yZWYub2JqZWN0TnVtYmVyICsgXCIgXCIgKyByYW5nZS5sZW5ndGggKyBcIlxcblwiO1xuICAgICAgICAgICAgZm9yICh2YXIgZW50cnlJZHggPSAwLCBlbnRyeUxlbiA9IHJhbmdlLmxlbmd0aDsgZW50cnlJZHggPCBlbnRyeUxlbjsgZW50cnlJZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHJhbmdlW2VudHJ5SWR4XTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9IHBhZFN0YXJ0KFN0cmluZyhlbnRyeS5vZmZzZXQpLCAxMCwgJzAnKTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9ICcgJztcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9IHBhZFN0YXJ0KFN0cmluZyhlbnRyeS5yZWYuZ2VuZXJhdGlvbk51bWJlciksIDUsICcwJyk7XG4gICAgICAgICAgICAgICAgc2VjdGlvbiArPSAnICc7XG4gICAgICAgICAgICAgICAgc2VjdGlvbiArPSBlbnRyeS5kZWxldGVkID8gJ2YnIDogJ24nO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gJyBcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWN0aW9uO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNpemUgPSA1O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnN1YnNlY3Rpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHN1YnNlY3Rpb24gPSB0aGlzLnN1YnNlY3Rpb25zW2lkeF07XG4gICAgICAgICAgICB2YXIgc3Vic2VjdGlvbkxlbmd0aCA9IHN1YnNlY3Rpb24ubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGZpcnN0RW50cnkgPSBzdWJzZWN0aW9uWzBdO1xuICAgICAgICAgICAgc2l6ZSArPSAyO1xuICAgICAgICAgICAgc2l6ZSArPSBTdHJpbmcoZmlyc3RFbnRyeS5yZWYub2JqZWN0TnVtYmVyKS5sZW5ndGg7XG4gICAgICAgICAgICBzaXplICs9IFN0cmluZyhzdWJzZWN0aW9uTGVuZ3RoKS5sZW5ndGg7XG4gICAgICAgICAgICBzaXplICs9IDIwICogc3Vic2VjdGlvbkxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy54O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5mO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIG9mZnNldCArPSB0aGlzLmNvcHlTdWJzZWN0aW9uc0ludG9CdWZmZXIodGhpcy5zdWJzZWN0aW9ucywgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuY29weVN1YnNlY3Rpb25zSW50b0J1ZmZlciA9IGZ1bmN0aW9uIChzdWJzZWN0aW9ucywgYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHZhciBsZW5ndGggPSBzdWJzZWN0aW9ucy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBzdWJzZWN0aW9uID0gdGhpcy5zdWJzZWN0aW9uc1tpZHhdO1xuICAgICAgICAgICAgdmFyIGZpcnN0T2JqZWN0TnVtYmVyID0gU3RyaW5nKHN1YnNlY3Rpb25bMF0ucmVmLm9iamVjdE51bWJlcik7XG4gICAgICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIoZmlyc3RPYmplY3ROdW1iZXIsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICB2YXIgcmFuZ2VMZW5ndGggPSBTdHJpbmcoc3Vic2VjdGlvbi5sZW5ndGgpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHJhbmdlTGVuZ3RoLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdGhpcy5jb3B5RW50cmllc0ludG9CdWZmZXIoc3Vic2VjdGlvbiwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5jb3B5RW50cmllc0ludG9CdWZmZXIgPSBmdW5jdGlvbiAoZW50cmllcywgYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2lkeF07XG4gICAgICAgICAgICB2YXIgZW50cnlPZmZzZXQgPSBwYWRTdGFydChTdHJpbmcoZW50cnkub2Zmc2V0KSwgMTAsICcwJyk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIoZW50cnlPZmZzZXQsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICB2YXIgZW50cnlHZW4gPSBwYWRTdGFydChTdHJpbmcoZW50cnkucmVmLmdlbmVyYXRpb25OdW1iZXIpLCA1LCAnMCcpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKGVudHJ5R2VuLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGVudHJ5LmRlbGV0ZWQgPyBDaGFyQ29kZXMuZiA6IENoYXJDb2Rlcy5uO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMjAgKiBsZW5ndGg7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIChjdXJyRW50cnkpIHtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2VjdGlvbnMucHVzaChbY3VyckVudHJ5XSk7XG4gICAgICAgICAgICB0aGlzLmNodW5rSWR4ID0gMDtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtMZW5ndGggPSAxO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaHVuayA9IHRoaXMuc3Vic2VjdGlvbnNbdGhpcy5jaHVua0lkeF07XG4gICAgICAgIHZhciBwcmV2RW50cnkgPSBjaHVua1t0aGlzLmNodW5rTGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjdXJyRW50cnkucmVmLm9iamVjdE51bWJlciAtIHByZXZFbnRyeS5yZWYub2JqZWN0TnVtYmVyID4gMSkge1xuICAgICAgICAgICAgdGhpcy5zdWJzZWN0aW9ucy5wdXNoKFtjdXJyRW50cnldKTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtJZHggKz0gMTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtMZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2h1bmsucHVzaChjdXJyRW50cnkpO1xuICAgICAgICAgICAgdGhpcy5jaHVua0xlbmd0aCArPSAxO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24uY3JlYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFBERkNyb3NzUmVmU2VjdGlvbih7XG4gICAgICAgICAgICByZWY6IFBERlJlZi5vZigwLCA2NTUzNSksXG4gICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICBkZWxldGVkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5jcmVhdGVFbXB0eSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBQREZDcm9zc1JlZlNlY3Rpb24oKTsgfTtcbiAgICByZXR1cm4gUERGQ3Jvc3NSZWZTZWN0aW9uO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkNyb3NzUmVmU2VjdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkNyb3NzUmVmU2VjdGlvbi5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjaGFyRnJvbUNvZGUsIGNvcHlTdHJpbmdJbnRvQnVmZmVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGSGVhZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkhlYWRlcihtYWpvciwgbWlub3IpIHtcbiAgICAgICAgdGhpcy5tYWpvciA9IFN0cmluZyhtYWpvcik7XG4gICAgICAgIHRoaXMubWlub3IgPSBTdHJpbmcobWlub3IpO1xuICAgIH1cbiAgICBQREZIZWFkZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYmMgPSBjaGFyRnJvbUNvZGUoMTI5KTtcbiAgICAgICAgcmV0dXJuIFwiJVBERi1cIiArIHRoaXMubWFqb3IgKyBcIi5cIiArIHRoaXMubWlub3IgKyBcIlxcbiVcIiArIGJjICsgYmMgKyBiYyArIGJjO1xuICAgIH07XG4gICAgUERGSGVhZGVyLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDEyICsgdGhpcy5tYWpvci5sZW5ndGggKyB0aGlzLm1pbm9yLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERkhlYWRlci5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5QZXJjZW50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlA7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuRDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5GO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkRhc2g7XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLm1ham9yLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUGVyaW9kO1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5taW5vciwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUGVyY2VudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IDEyOTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IDEyOTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IDEyOTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IDEyOTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZIZWFkZXIuZm9yVmVyc2lvbiA9IGZ1bmN0aW9uIChtYWpvciwgbWlub3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZIZWFkZXIobWFqb3IsIG1pbm9yKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZIZWFkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGSGVhZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGSGVhZGVyLmpzLm1hcCIsImltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGVHJhaWxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZUcmFpbGVyKGxhc3RYUmVmT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMubGFzdFhSZWZPZmZzZXQgPSBTdHJpbmcobGFzdFhSZWZPZmZzZXQpO1xuICAgIH1cbiAgICBQREZUcmFpbGVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwic3RhcnR4cmVmXFxuXCIgKyB0aGlzLmxhc3RYUmVmT2Zmc2V0ICsgXCJcXG4lJUVPRlwiO1xuICAgIH07XG4gICAgUERGVHJhaWxlci5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAxNiArIHRoaXMubGFzdFhSZWZPZmZzZXQubGVuZ3RoO1xuICAgIH07XG4gICAgUERGVHJhaWxlci5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5zO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuYTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMueDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5sYXN0WFJlZk9mZnNldCwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUGVyY2VudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5QZXJjZW50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTztcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5GO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERlRyYWlsZXIuZm9yTGFzdENyb3NzUmVmU2VjdGlvbk9mZnNldCA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZUcmFpbGVyKG9mZnNldCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGVHJhaWxlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZUcmFpbGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGVHJhaWxlci5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgUERGVHJhaWxlckRpY3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGVHJhaWxlckRpY3QoZGljdCkge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIH1cbiAgICBQREZUcmFpbGVyRGljdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcInRyYWlsZXJcXG5cIiArIHRoaXMuZGljdC50b1N0cmluZygpO1xuICAgIH07XG4gICAgUERGVHJhaWxlckRpY3QucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gOCArIHRoaXMuZGljdC5zaXplSW5CeXRlcygpO1xuICAgIH07XG4gICAgUERGVHJhaWxlckRpY3QucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmE7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuaTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5sO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBvZmZzZXQgKz0gdGhpcy5kaWN0LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERlRyYWlsZXJEaWN0Lm9mID0gZnVuY3Rpb24gKGRpY3QpIHsgcmV0dXJuIG5ldyBQREZUcmFpbGVyRGljdChkaWN0KTsgfTtcbiAgICByZXR1cm4gUERGVHJhaWxlckRpY3Q7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGVHJhaWxlckRpY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZUcmFpbGVyRGljdC5qcy5tYXAiLCJpbXBvcnQgeyB0b0hleFN0cmluZywgdG9IZXhTdHJpbmdPZk1pbkxlbmd0aCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgaGFzU3Vycm9nYXRlcywgaGlnaFN1cnJvZ2F0ZSwgaXNXaXRoaW5CTVAsIGxvd1N1cnJvZ2F0ZSwgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdW5pY29kZVwiO1xuLyoqIGBnbHlwaHNgIHNob3VsZCBiZSBhbiBhcnJheSBvZiB1bmlxdWUgZ2x5cGhzICovXG5leHBvcnQgdmFyIGNyZWF0ZUNtYXAgPSBmdW5jdGlvbiAoZ2x5cGhzLCBnbHlwaElkKSB7XG4gICAgdmFyIGJmQ2hhcnMgPSBuZXcgQXJyYXkoZ2x5cGhzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaWR4XTtcbiAgICAgICAgdmFyIGlkID0gY21hcEhleEZvcm1hdChjbWFwSGV4U3RyaW5nKGdseXBoSWQoZ2x5cGgpKSk7XG4gICAgICAgIHZhciB1bmljb2RlID0gY21hcEhleEZvcm1hdC5hcHBseSh2b2lkIDAsIGdseXBoLmNvZGVQb2ludHMubWFwKGNtYXBDb2RlUG9pbnRGb3JtYXQpKTtcbiAgICAgICAgYmZDaGFyc1tpZHhdID0gW2lkLCB1bmljb2RlXTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGxDbWFwVGVtcGxhdGUoYmZDaGFycyk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBUZW1wbGF0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbnZhciBmaWxsQ21hcFRlbXBsYXRlID0gZnVuY3Rpb24gKGJmQ2hhcnMpIHsgcmV0dXJuIFwiL0NJREluaXQgL1Byb2NTZXQgZmluZHJlc291cmNlIGJlZ2luXFxuMTIgZGljdCBiZWdpblxcbmJlZ2luY21hcFxcbi9DSURTeXN0ZW1JbmZvIDw8XFxuICAvUmVnaXN0cnkgKEFkb2JlKVxcbiAgL09yZGVyaW5nIChVQ1MpXFxuICAvU3VwcGxlbWVudCAwXFxuPj4gZGVmXFxuL0NNYXBOYW1lIC9BZG9iZS1JZGVudGl0eS1VQ1MgZGVmXFxuL0NNYXBUeXBlIDIgZGVmXFxuMSBiZWdpbmNvZGVzcGFjZXJhbmdlXFxuPDAwMDA+PGZmZmY+XFxuZW5kY29kZXNwYWNlcmFuZ2VcXG5cIiArIGJmQ2hhcnMubGVuZ3RoICsgXCIgYmVnaW5iZmNoYXJcXG5cIiArIGJmQ2hhcnMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBnbHlwaElkID0gX2FbMF0sIGNvZGVQb2ludCA9IF9hWzFdO1xuICAgIHJldHVybiBnbHlwaElkICsgXCIgXCIgKyBjb2RlUG9pbnQ7XG59KS5qb2luKCdcXG4nKSArIFwiXFxuZW5kYmZjaGFyXFxuZW5kY21hcFxcbkNNYXBOYW1lIGN1cnJlbnRkaWN0IC9DTWFwIGRlZmluZXJlc291cmNlIHBvcFxcbmVuZFxcbmVuZFwiOyB9O1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBVdGlsaXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbnZhciBjbWFwSGV4Rm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YWx1ZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgcmV0dXJuIFwiPFwiICsgdmFsdWVzLmpvaW4oJycpICsgXCI+XCI7XG59O1xudmFyIGNtYXBIZXhTdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgodmFsdWUsIDQpOyB9O1xudmFyIGNtYXBDb2RlUG9pbnRGb3JtYXQgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgaWYgKGlzV2l0aGluQk1QKGNvZGVQb2ludCkpXG4gICAgICAgIHJldHVybiBjbWFwSGV4U3RyaW5nKGNvZGVQb2ludCk7XG4gICAgaWYgKGhhc1N1cnJvZ2F0ZXMoY29kZVBvaW50KSkge1xuICAgICAgICB2YXIgaHMgPSBoaWdoU3Vycm9nYXRlKGNvZGVQb2ludCk7XG4gICAgICAgIHZhciBscyA9IGxvd1N1cnJvZ2F0ZShjb2RlUG9pbnQpO1xuICAgICAgICByZXR1cm4gXCJcIiArIGNtYXBIZXhTdHJpbmcoaHMpICsgY21hcEhleFN0cmluZyhscyk7XG4gICAgfVxuICAgIHZhciBoZXggPSB0b0hleFN0cmluZyhjb2RlUG9pbnQpO1xuICAgIHZhciBtc2cgPSBcIjB4XCIgKyBoZXggKyBcIiBpcyBub3QgYSB2YWxpZCBVVEYtOCBvciBVVEYtMTYgY29kZXBvaW50LlwiO1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNNYXAuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgY3JlYXRlQ21hcCB9IGZyb20gXCIuL0NNYXBcIjtcbmltcG9ydCB7IGRlcml2ZUZvbnRGbGFncyB9IGZyb20gXCIuL0ZvbnRGbGFnc1wiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgeyBieUFzY2VuZGluZ0lkLCBDYWNoZSwgc29ydGVkVW5pcSwgdG9IZXhTdHJpbmdPZk1pbkxlbmd0aCwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogQSBub3RlIG9mIHRoYW5rcyB0byB0aGUgZGV2ZWxvcGVycyBvZiBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQsIGFzXG4gKiB0aGlzIGNsYXNzIGJvcnJvd3MgZnJvbTpcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL2Rldm9uZ292ZXR0L3BkZmtpdC9ibG9iL2U3MWVkYWIwZGQ0NjU3YjVhNzY3ODA0YmE4NmM5NGM1OGQwMWZiY2EvbGliL2ltYWdlL2pwZWcuY29mZmVlXG4gKi9cbnZhciBDdXN0b21Gb250RW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ3VzdG9tRm9udEVtYmVkZGVyKGZvbnQsIGZvbnREYXRhLCBjdXN0b21OYW1lLCBmb250RmVhdHVyZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5hbGxHbHlwaHNJbkZvbnRTb3J0ZWRCeUlkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGdseXBocyA9IG5ldyBBcnJheShfdGhpcy5mb250LmNoYXJhY3RlclNldC5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBfdGhpcy5mb250LmNoYXJhY3RlclNldFtpZHhdO1xuICAgICAgICAgICAgICAgIGdseXBoc1tpZHhdID0gX3RoaXMuZm9udC5nbHlwaEZvckNvZGVQb2ludChjb2RlUG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNvcnRlZFVuaXEoZ2x5cGhzLnNvcnQoYnlBc2NlbmRpbmdJZCksIGZ1bmN0aW9uIChnKSB7IHJldHVybiBnLmlkOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mb250ID0gZm9udDtcbiAgICAgICAgdGhpcy5zY2FsZSA9IDEwMDAgLyB0aGlzLmZvbnQudW5pdHNQZXJFbTtcbiAgICAgICAgdGhpcy5mb250RGF0YSA9IGZvbnREYXRhO1xuICAgICAgICB0aGlzLmZvbnROYW1lID0gdGhpcy5mb250LnBvc3RzY3JpcHROYW1lIHx8ICdGb250JztcbiAgICAgICAgdGhpcy5jdXN0b21OYW1lID0gY3VzdG9tTmFtZTtcbiAgICAgICAgdGhpcy5mb250RmVhdHVyZXMgPSBmb250RmVhdHVyZXM7XG4gICAgICAgIHRoaXMuYmFzZUZvbnROYW1lID0gJyc7XG4gICAgICAgIHRoaXMuZ2x5cGhDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KHRoaXMuYWxsR2x5cGhzSW5Gb250U29ydGVkQnlJZCk7XG4gICAgfVxuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoZm9udGtpdCwgZm9udERhdGEsIGN1c3RvbU5hbWUsIGZvbnRGZWF0dXJlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZm9udDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgZm9udGtpdC5jcmVhdGUoZm9udERhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgQ3VzdG9tRm9udEVtYmVkZGVyKGZvbnQsIGZvbnREYXRhLCBjdXN0b21OYW1lLCBmb250RmVhdHVyZXMpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbmNvZGUgdGhlIEphdmFTY3JpcHQgc3RyaW5nIGludG8gdGhpcyBmb250LiAoSmF2YVNjcmlwdCBlbmNvZGVzIHN0cmluZ3MgaW5cbiAgICAgKiBVbmljb2RlLCBidXQgZW1iZWRkZWQgZm9udHMgdXNlIHRoZWlyIG93biBjdXN0b20gZW5jb2RpbmdzKVxuICAgICAqL1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW5jb2RlVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHZhciBnbHlwaHMgPSB0aGlzLmZvbnQubGF5b3V0KHRleHQsIHRoaXMuZm9udEZlYXR1cmVzKS5nbHlwaHM7XG4gICAgICAgIHZhciBoZXhDb2RlcyA9IG5ldyBBcnJheShnbHlwaHMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgaGV4Q29kZXNbaWR4XSA9IHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgoZ2x5cGhzW2lkeF0uaWQsIDQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQREZIZXhTdHJpbmcub2YoaGV4Q29kZXMuam9pbignJykpO1xuICAgIH07XG4gICAgLy8gVGhlIGFkdmFuY2VXaWR0aCB0YWtlcyBpbnRvIGFjY291bnQga2VybmluZyBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBkb24ndFxuICAgIC8vIGhhdmUgdG8gZG8gdGhhdCBtYW51YWxseSBsaWtlIHdlIGRvIGZvciB0aGUgc3RhbmRhcmQgZm9udHMuXG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS53aWR0aE9mVGV4dEF0U2l6ZSA9IGZ1bmN0aW9uICh0ZXh0LCBzaXplKSB7XG4gICAgICAgIHZhciBnbHlwaHMgPSB0aGlzLmZvbnQubGF5b3V0KHRleHQsIHRoaXMuZm9udEZlYXR1cmVzKS5nbHlwaHM7XG4gICAgICAgIHZhciB0b3RhbFdpZHRoID0gMDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdG90YWxXaWR0aCArPSBnbHlwaHNbaWR4XS5hZHZhbmNlV2lkdGggKiB0aGlzLnNjYWxlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzY2FsZSA9IHNpemUgLyAxMDAwO1xuICAgICAgICByZXR1cm4gdG90YWxXaWR0aCAqIHNjYWxlO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5oZWlnaHRPZkZvbnRBdFNpemUgPSBmdW5jdGlvbiAoc2l6ZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgX2EgPSBvcHRpb25zLmRlc2NlbmRlciwgZGVzY2VuZGVyID0gX2EgPT09IHZvaWQgMCA/IHRydWUgOiBfYTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5mb250LCBhc2NlbnQgPSBfYi5hc2NlbnQsIGRlc2NlbnQgPSBfYi5kZXNjZW50LCBiYm94ID0gX2IuYmJveDtcbiAgICAgICAgdmFyIHlUb3AgPSAoYXNjZW50IHx8IGJib3gubWF4WSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICB2YXIgeUJvdHRvbSA9IChkZXNjZW50IHx8IGJib3gubWluWSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICB2YXIgaGVpZ2h0ID0geVRvcCAtIHlCb3R0b207XG4gICAgICAgIGlmICghZGVzY2VuZGVyKVxuICAgICAgICAgICAgaGVpZ2h0IC09IE1hdGguYWJzKGRlc2NlbnQpIHx8IDA7XG4gICAgICAgIHJldHVybiAoaGVpZ2h0IC8gMTAwMCkgKiBzaXplO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5zaXplT2ZGb250QXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZm9udCwgYXNjZW50ID0gX2EuYXNjZW50LCBkZXNjZW50ID0gX2EuZGVzY2VudCwgYmJveCA9IF9hLmJib3g7XG4gICAgICAgIHZhciB5VG9wID0gKGFzY2VudCB8fCBiYm94Lm1heFkpICogdGhpcy5zY2FsZTtcbiAgICAgICAgdmFyIHlCb3R0b20gPSAoZGVzY2VudCB8fCBiYm94Lm1pblkpICogdGhpcy5zY2FsZTtcbiAgICAgICAgcmV0dXJuICgxMDAwICogaGVpZ2h0KSAvICh5VG9wIC0geUJvdHRvbSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHRoaXMuYmFzZUZvbnROYW1lID1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9tTmFtZSB8fCBjb250ZXh0LmFkZFJhbmRvbVN1ZmZpeCh0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRGb250RGljdChjb250ZXh0LCByZWYpO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEZvbnREaWN0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY2lkRm9udERpY3RSZWYsIHVuaWNvZGVDTWFwUmVmLCBmb250RGljdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZENJREZvbnREaWN0KGNvbnRleHQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2lkRm9udERpY3RSZWYgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlQ01hcFJlZiA9IHRoaXMuZW1iZWRVbmljb2RlQ21hcChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnREaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6ICdGb250JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlOiAnVHlwZTAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VGb250OiB0aGlzLmJhc2VGb250TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZzogJ0lkZW50aXR5LUgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NlbmRhbnRGb250czogW2NpZEZvbnREaWN0UmVmXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb1VuaWNvZGU6IHVuaWNvZGVDTWFwUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCBmb250RGljdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcihmb250RGljdCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuaXNDRkYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvbnQuY2ZmO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZENJREZvbnREaWN0ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZvbnREZXNjcmlwdG9yUmVmLCBjaWRGb250RGljdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEZvbnREZXNjcmlwdG9yKGNvbnRleHQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0b3JSZWYgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaWRGb250RGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnRm9udCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogdGhpcy5pc0NGRigpID8gJ0NJREZvbnRUeXBlMCcgOiAnQ0lERm9udFR5cGUyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSURUb0dJRE1hcDogJ0lkZW50aXR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlRm9udDogdGhpcy5iYXNlRm9udE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lEU3lzdGVtSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RyeTogUERGU3RyaW5nLm9mKCdBZG9iZScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmRlcmluZzogUERGU3RyaW5nLm9mKCdJZGVudGl0eScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwbGVtZW50OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9udERlc2NyaXB0b3I6IGZvbnREZXNjcmlwdG9yUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFc6IHRoaXMuY29tcHV0ZVdpZHRocygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3RlcihjaWRGb250RGljdCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRGb250RGVzY3JpcHRvciA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmb250U3RyZWFtUmVmLCBzY2FsZSwgX2EsIGl0YWxpY0FuZ2xlLCBhc2NlbnQsIGRlc2NlbnQsIGNhcEhlaWdodCwgeEhlaWdodCwgX2IsIG1pblgsIG1pblksIG1heFgsIG1heFksIGZvbnREZXNjcmlwdG9yO1xuICAgICAgICAgICAgdmFyIF9jO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkRm9udFN0cmVhbShjb250ZXh0KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTdHJlYW1SZWYgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHRoaXMuc2NhbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMuZm9udCwgaXRhbGljQW5nbGUgPSBfYS5pdGFsaWNBbmdsZSwgYXNjZW50ID0gX2EuYXNjZW50LCBkZXNjZW50ID0gX2EuZGVzY2VudCwgY2FwSGVpZ2h0ID0gX2EuY2FwSGVpZ2h0LCB4SGVpZ2h0ID0gX2EueEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gdGhpcy5mb250LmJib3gsIG1pblggPSBfYi5taW5YLCBtaW5ZID0gX2IubWluWSwgbWF4WCA9IF9iLm1heFgsIG1heFkgPSBfYi5tYXhZO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0b3IgPSBjb250ZXh0Lm9iaigoX2MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6ICdGb250RGVzY3JpcHRvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnROYW1lOiB0aGlzLmJhc2VGb250TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3M6IGRlcml2ZUZvbnRGbGFncyh0aGlzLmZvbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb250QkJveDogW21pblggKiBzY2FsZSwgbWluWSAqIHNjYWxlLCBtYXhYICogc2NhbGUsIG1heFkgKiBzY2FsZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0YWxpY0FuZ2xlOiBpdGFsaWNBbmdsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjZW50OiBhc2NlbnQgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY2VudDogZGVzY2VudCAqIHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBIZWlnaHQ6IChjYXBIZWlnaHQgfHwgYXNjZW50KSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYSGVpZ2h0OiAoeEhlaWdodCB8fCAwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3Qgc3VyZSBob3cgdG8gY29tcHV0ZS9maW5kIHRoaXMsIG5vciBpcyBhbnlib2R5IGVsc2UgcmVhbGx5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTQ4NTE3OS9zdGVtdi12YWx1ZS1vZi10aGUtdHJ1ZXR5cGUtZm9udFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGVtVjogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NbdGhpcy5pc0NGRigpID8gJ0ZvbnRGaWxlMycgOiAnRm9udEZpbGUyJ10gPSBmb250U3RyZWFtUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcihmb250RGVzY3JpcHRvcildO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuc2VyaWFsaXplRm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmZvbnREYXRhXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRGb250U3RyZWFtID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZvbnRTdHJlYW0sIF9hLCBfYjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gKF9hID0gY29udGV4dCkuZmxhdGVTdHJlYW07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNlcmlhbGl6ZUZvbnQoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTdHJlYW0gPSBfYi5hcHBseShfYSwgW19jLnNlbnQoKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlOiB0aGlzLmlzQ0ZGKCkgPyAnQ0lERm9udFR5cGUwQycgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoZm9udFN0cmVhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRVbmljb2RlQ21hcCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBjbWFwID0gY3JlYXRlQ21hcCh0aGlzLmdseXBoQ2FjaGUuYWNjZXNzKCksIHRoaXMuZ2x5cGhJZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdmFyIGNtYXBTdHJlYW0gPSBjb250ZXh0LmZsYXRlU3RyZWFtKGNtYXApO1xuICAgICAgICByZXR1cm4gY29udGV4dC5yZWdpc3RlcihjbWFwU3RyZWFtKTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZ2x5cGhJZCA9IGZ1bmN0aW9uIChnbHlwaCkge1xuICAgICAgICByZXR1cm4gZ2x5cGggPyBnbHlwaC5pZCA6IC0xO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5jb21wdXRlV2lkdGhzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5nbHlwaENhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgd2lkdGhzID0gW107XG4gICAgICAgIHZhciBjdXJyU2VjdGlvbiA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnbHlwaHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgY3VyckdseXBoID0gZ2x5cGhzW2lkeF07XG4gICAgICAgICAgICB2YXIgcHJldkdseXBoID0gZ2x5cGhzW2lkeCAtIDFdO1xuICAgICAgICAgICAgdmFyIGN1cnJHbHlwaElkID0gdGhpcy5nbHlwaElkKGN1cnJHbHlwaCk7XG4gICAgICAgICAgICB2YXIgcHJldkdseXBoSWQgPSB0aGlzLmdseXBoSWQocHJldkdseXBoKTtcbiAgICAgICAgICAgIGlmIChpZHggPT09IDApIHtcbiAgICAgICAgICAgICAgICB3aWR0aHMucHVzaChjdXJyR2x5cGhJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyR2x5cGhJZCAtIHByZXZHbHlwaElkICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgd2lkdGhzLnB1c2goY3VyclNlY3Rpb24pO1xuICAgICAgICAgICAgICAgIHdpZHRocy5wdXNoKGN1cnJHbHlwaElkKTtcbiAgICAgICAgICAgICAgICBjdXJyU2VjdGlvbiA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyclNlY3Rpb24ucHVzaChjdXJyR2x5cGguYWR2YW5jZVdpZHRoICogdGhpcy5zY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgd2lkdGhzLnB1c2goY3VyclNlY3Rpb24pO1xuICAgICAgICByZXR1cm4gd2lkdGhzO1xuICAgIH07XG4gICAgcmV0dXJuIEN1c3RvbUZvbnRFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBDdXN0b21Gb250RW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdXN0b21Gb250RW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgQ3VzdG9tRm9udEVtYmVkZGVyIGZyb20gXCIuL0N1c3RvbUZvbnRFbWJlZGRlclwiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCB7IENhY2hlLCBtZXJnZVVpbnQ4QXJyYXlzLCB0b0hleFN0cmluZ09mTWluTGVuZ3RoIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIEEgbm90ZSBvZiB0aGFua3MgdG8gdGhlIGRldmVsb3BlcnMgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0LCBhc1xuICogdGhpcyBjbGFzcyBib3Jyb3dzIGZyb206XG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZvbmdvdmV0dC9wZGZraXQvYmxvYi9lNzFlZGFiMGRkNDY1N2I1YTc2NzgwNGJhODZjOTRjNThkMDFmYmNhL2xpYi9pbWFnZS9qcGVnLmNvZmZlZVxuICovXG52YXIgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyKGZvbnQsIGZvbnREYXRhLCBjdXN0b21Gb250TmFtZSwgZm9udEZlYXR1cmVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGZvbnQsIGZvbnREYXRhLCBjdXN0b21Gb250TmFtZSwgZm9udEZlYXR1cmVzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdWJzZXQgPSBfdGhpcy5mb250LmNyZWF0ZVN1YnNldCgpO1xuICAgICAgICBfdGhpcy5nbHlwaHMgPSBbXTtcbiAgICAgICAgX3RoaXMuZ2x5cGhDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLmdseXBoczsgfSk7XG4gICAgICAgIF90aGlzLmdseXBoSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChmb250a2l0LCBmb250RGF0YSwgY3VzdG9tRm9udE5hbWUsIGZvbnRGZWF0dXJlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZm9udDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgZm9udGtpdC5jcmVhdGUoZm9udERhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyKGZvbnQsIGZvbnREYXRhLCBjdXN0b21Gb250TmFtZSwgZm9udEZlYXR1cmVzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLnByb3RvdHlwZS5lbmNvZGVUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgdmFyIGdseXBocyA9IHRoaXMuZm9udC5sYXlvdXQodGV4dCwgdGhpcy5mb250RmVhdHVyZXMpLmdseXBocztcbiAgICAgICAgdmFyIGhleENvZGVzID0gbmV3IEFycmF5KGdseXBocy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnbHlwaHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdWJzZXRHbHlwaElkID0gdGhpcy5zdWJzZXQuaW5jbHVkZUdseXBoKGdseXBoKTtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhzW3N1YnNldEdseXBoSWQgLSAxXSA9IGdseXBoO1xuICAgICAgICAgICAgdGhpcy5nbHlwaElkTWFwLnNldChnbHlwaC5pZCwgc3Vic2V0R2x5cGhJZCk7XG4gICAgICAgICAgICBoZXhDb2Rlc1tpZHhdID0gdG9IZXhTdHJpbmdPZk1pbkxlbmd0aChzdWJzZXRHbHlwaElkLCA0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdseXBoQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICByZXR1cm4gUERGSGV4U3RyaW5nLm9mKGhleENvZGVzLmpvaW4oJycpKTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5wcm90b3R5cGUuaXNDRkYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YnNldC5jZmY7XG4gICAgfTtcbiAgICBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIucHJvdG90eXBlLmdseXBoSWQgPSBmdW5jdGlvbiAoZ2x5cGgpIHtcbiAgICAgICAgcmV0dXJuIGdseXBoID8gdGhpcy5nbHlwaElkTWFwLmdldChnbHlwaC5pZCkgOiAtMTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5wcm90b3R5cGUuc2VyaWFsaXplRm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgICAgICAgICAgX3RoaXMuc3Vic2V0XG4gICAgICAgICAgICAgICAgLmVuY29kZVN0cmVhbSgpXG4gICAgICAgICAgICAgICAgLm9uKCdkYXRhJywgZnVuY3Rpb24gKGJ5dGVzKSB7IHJldHVybiBwYXJ0cy5wdXNoKGJ5dGVzKTsgfSlcbiAgICAgICAgICAgICAgICAub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc29sdmUobWVyZ2VVaW50OEFycmF5cyhwYXJ0cykpOyB9KVxuICAgICAgICAgICAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiByZWplY3QoZXJyKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlcjtcbn0oQ3VzdG9tRm9udEVtYmVkZGVyKSk7XG5leHBvcnQgZGVmYXVsdCBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdXN0b21Gb250U3Vic2V0RW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG4vKipcbiAqIEZyb20gdGhlIFBERi1BMyBzcGVjaWZpY2F0aW9uLCBzZWN0aW9uICoqMy4xLiBSZXF1aXJlbWVudHMgLSBHZW5lcmFsKiouXG4gKiBTZWU6XG4gKiAqIGh0dHBzOi8vd3d3LnBkZmEub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE4LzEwL1BERjIwX0FOMDAyLUFGLnBkZlxuICovXG5leHBvcnQgdmFyIEFGUmVsYXRpb25zaGlwO1xuKGZ1bmN0aW9uIChBRlJlbGF0aW9uc2hpcCkge1xuICAgIEFGUmVsYXRpb25zaGlwW1wiU291cmNlXCJdID0gXCJTb3VyY2VcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIkRhdGFcIl0gPSBcIkRhdGFcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIkFsdGVybmF0aXZlXCJdID0gXCJBbHRlcm5hdGl2ZVwiO1xuICAgIEFGUmVsYXRpb25zaGlwW1wiU3VwcGxlbWVudFwiXSA9IFwiU3VwcGxlbWVudFwiO1xuICAgIEFGUmVsYXRpb25zaGlwW1wiRW5jcnlwdGVkUGF5bG9hZFwiXSA9IFwiRW5jcnlwdGVkUGF5bG9hZFwiO1xuICAgIEFGUmVsYXRpb25zaGlwW1wiRm9ybURhdGFcIl0gPSBcIkVuY3J5cHRlZFBheWxvYWRcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIlNjaGVtYVwiXSA9IFwiU2NoZW1hXCI7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJVbnNwZWNpZmllZFwiXSA9IFwiVW5zcGVjaWZpZWRcIjtcbn0pKEFGUmVsYXRpb25zaGlwIHx8IChBRlJlbGF0aW9uc2hpcCA9IHt9KSk7XG52YXIgRmlsZUVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZpbGVFbWJlZGRlcihmaWxlRGF0YSwgZmlsZU5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdGhpcy5maWxlRGF0YSA9IGZpbGVEYXRhO1xuICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIEZpbGVFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoYnl0ZXMsIGZpbGVOYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBuZXcgRmlsZUVtYmVkZGVyKGJ5dGVzLCBmaWxlTmFtZSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBGaWxlRW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgbWltZVR5cGUsIGRlc2NyaXB0aW9uLCBjcmVhdGlvbkRhdGUsIG1vZGlmaWNhdGlvbkRhdGUsIGFmUmVsYXRpb25zaGlwLCBlbWJlZGRlZEZpbGVTdHJlYW0sIGVtYmVkZGVkRmlsZVN0cmVhbVJlZiwgZmlsZVNwZWNEaWN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIF9hID0gdGhpcy5vcHRpb25zLCBtaW1lVHlwZSA9IF9hLm1pbWVUeXBlLCBkZXNjcmlwdGlvbiA9IF9hLmRlc2NyaXB0aW9uLCBjcmVhdGlvbkRhdGUgPSBfYS5jcmVhdGlvbkRhdGUsIG1vZGlmaWNhdGlvbkRhdGUgPSBfYS5tb2RpZmljYXRpb25EYXRlLCBhZlJlbGF0aW9uc2hpcCA9IF9hLmFmUmVsYXRpb25zaGlwO1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkRmlsZVN0cmVhbSA9IGNvbnRleHQuZmxhdGVTdHJlYW0odGhpcy5maWxlRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnRW1iZWRkZWRGaWxlJyxcbiAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogbWltZVR5cGUgIT09IG51bGwgJiYgbWltZVR5cGUgIT09IHZvaWQgMCA/IG1pbWVUeXBlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFNpemU6IHRoaXMuZmlsZURhdGEubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25EYXRlOiBjcmVhdGlvbkRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFBERlN0cmluZy5mcm9tRGF0ZShjcmVhdGlvbkRhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBNb2REYXRlOiBtb2RpZmljYXRpb25EYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQREZTdHJpbmcuZnJvbURhdGUobW9kaWZpY2F0aW9uRGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZEZpbGVTdHJlYW1SZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGVtYmVkZGVkRmlsZVN0cmVhbSk7XG4gICAgICAgICAgICAgICAgZmlsZVNwZWNEaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnRmlsZXNwZWMnLFxuICAgICAgICAgICAgICAgICAgICBGOiBQREZTdHJpbmcub2YodGhpcy5maWxlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIFVGOiBQREZIZXhTdHJpbmcuZnJvbVRleHQodGhpcy5maWxlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIEVGOiB7IEY6IGVtYmVkZGVkRmlsZVN0cmVhbVJlZiB9LFxuICAgICAgICAgICAgICAgICAgICBEZXNjOiBkZXNjcmlwdGlvbiA/IFBERkhleFN0cmluZy5mcm9tVGV4dChkZXNjcmlwdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIEFGUmVsYXRpb25zaGlwOiBhZlJlbGF0aW9uc2hpcCAhPT0gbnVsbCAmJiBhZlJlbGF0aW9uc2hpcCAhPT0gdm9pZCAwID8gYWZSZWxhdGlvbnNoaXAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmFzc2lnbihyZWYsIGZpbGVTcGVjRGljdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoZmlsZVNwZWNEaWN0KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBGaWxlRW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgRmlsZUVtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZUVtYmVkZGVyLmpzLm1hcCIsIi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIG1ha2VGb250RmxhZ3MgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBmbGFncyA9IDA7XG4gICAgdmFyIGZsaXBCaXQgPSBmdW5jdGlvbiAoYml0KSB7IGZsYWdzIHw9ICgxIDw8IChiaXQgLSAxKSk7IH07XG4gICAgaWYgKG9wdGlvbnMuZml4ZWRQaXRjaClcbiAgICAgICAgZmxpcEJpdCgxKTtcbiAgICBpZiAob3B0aW9ucy5zZXJpZilcbiAgICAgICAgZmxpcEJpdCgyKTtcbiAgICBpZiAob3B0aW9ucy5zeW1ib2xpYylcbiAgICAgICAgZmxpcEJpdCgzKTtcbiAgICBpZiAob3B0aW9ucy5zY3JpcHQpXG4gICAgICAgIGZsaXBCaXQoNCk7XG4gICAgaWYgKG9wdGlvbnMubm9uc3ltYm9saWMpXG4gICAgICAgIGZsaXBCaXQoNik7XG4gICAgaWYgKG9wdGlvbnMuaXRhbGljKVxuICAgICAgICBmbGlwQml0KDcpO1xuICAgIGlmIChvcHRpb25zLmFsbENhcClcbiAgICAgICAgZmxpcEJpdCgxNyk7XG4gICAgaWYgKG9wdGlvbnMuc21hbGxDYXApXG4gICAgICAgIGZsaXBCaXQoMTgpO1xuICAgIGlmIChvcHRpb25zLmZvcmNlQm9sZClcbiAgICAgICAgZmxpcEJpdCgxOSk7XG4gICAgcmV0dXJuIGZsYWdzO1xufTtcbi8vIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdC9ibG9iLzgzZjVmNzI0MzE3MmEwMTdhZGNmNmE3ZmFhNTU0N2M1NTk4MmM1N2IvbGliL2ZvbnQvZW1iZWRkZWQuanMjTDEyMy1MMTI5XG5leHBvcnQgdmFyIGRlcml2ZUZvbnRGbGFncyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgdmFyIGZhbWlseUNsYXNzID0gZm9udFsnT1MvMiddID8gZm9udFsnT1MvMiddLnNGYW1pbHlDbGFzcyA6IDA7XG4gICAgdmFyIGZsYWdzID0gbWFrZUZvbnRGbGFncyh7XG4gICAgICAgIGZpeGVkUGl0Y2g6IGZvbnQucG9zdC5pc0ZpeGVkUGl0Y2gsXG4gICAgICAgIHNlcmlmOiAxIDw9IGZhbWlseUNsYXNzICYmIGZhbWlseUNsYXNzIDw9IDcsXG4gICAgICAgIHN5bWJvbGljOiB0cnVlLFxuICAgICAgICBzY3JpcHQ6IGZhbWlseUNsYXNzID09PSAxMCxcbiAgICAgICAgaXRhbGljOiBmb250LmhlYWQubWFjU3R5bGUuaXRhbGljLFxuICAgIH0pO1xuICAgIHJldHVybiBmbGFncztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Gb250RmxhZ3MuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbnZhciBKYXZhU2NyaXB0RW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSmF2YVNjcmlwdEVtYmVkZGVyKHNjcmlwdCwgc2NyaXB0TmFtZSkge1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdDtcbiAgICAgICAgdGhpcy5zY3JpcHROYW1lID0gc2NyaXB0TmFtZTtcbiAgICB9XG4gICAgSmF2YVNjcmlwdEVtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChzY3JpcHQsIHNjcmlwdE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKYXZhU2NyaXB0RW1iZWRkZXIoc2NyaXB0LCBzY3JpcHROYW1lKTtcbiAgICB9O1xuICAgIEphdmFTY3JpcHRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRJbnRvQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGpzQWN0aW9uRGljdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBqc0FjdGlvbkRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdBY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICBTOiAnSmF2YVNjcmlwdCcsXG4gICAgICAgICAgICAgICAgICAgIEpTOiBQREZIZXhTdHJpbmcuZnJvbVRleHQodGhpcy5zY3JpcHQpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCBqc0FjdGlvbkRpY3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKGpzQWN0aW9uRGljdCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gSmF2YVNjcmlwdEVtYmVkZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEphdmFTY3JpcHRFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUphdmFTY3JpcHRFbWJlZGRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBNQVJLRVJTID0gW1xuICAgIDB4ZmZjMCwgMHhmZmMxLCAweGZmYzIsXG4gICAgMHhmZmMzLCAweGZmYzUsIDB4ZmZjNixcbiAgICAweGZmYzcsIDB4ZmZjOCwgMHhmZmM5LFxuICAgIDB4ZmZjYSwgMHhmZmNiLCAweGZmY2MsXG4gICAgMHhmZmNkLCAweGZmY2UsIDB4ZmZjZixcbl07XG52YXIgQ29sb3JTcGFjZTtcbihmdW5jdGlvbiAoQ29sb3JTcGFjZSkge1xuICAgIENvbG9yU3BhY2VbXCJEZXZpY2VHcmF5XCJdID0gXCJEZXZpY2VHcmF5XCI7XG4gICAgQ29sb3JTcGFjZVtcIkRldmljZVJHQlwiXSA9IFwiRGV2aWNlUkdCXCI7XG4gICAgQ29sb3JTcGFjZVtcIkRldmljZUNNWUtcIl0gPSBcIkRldmljZUNNWUtcIjtcbn0pKENvbG9yU3BhY2UgfHwgKENvbG9yU3BhY2UgPSB7fSkpO1xudmFyIENoYW5uZWxUb0NvbG9yU3BhY2UgPSB7XG4gICAgMTogQ29sb3JTcGFjZS5EZXZpY2VHcmF5LFxuICAgIDM6IENvbG9yU3BhY2UuRGV2aWNlUkdCLFxuICAgIDQ6IENvbG9yU3BhY2UuRGV2aWNlQ01ZSyxcbn07XG4vKipcbiAqIEEgbm90ZSBvZiB0aGFua3MgdG8gdGhlIGRldmVsb3BlcnMgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0LCBhc1xuICogdGhpcyBjbGFzcyBib3Jyb3dzIGZyb206XG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdC9ibG9iL2E2YWY3NjQ2N2NlMDZiZDZhMmFmNGFhNzI3MWNjYWM5ZmYxNTJhN2QvbGliL2ltYWdlL2pwZWcuanNcbiAqL1xudmFyIEpwZWdFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBKcGVnRW1iZWRkZXIoaW1hZ2VEYXRhLCBiaXRzUGVyQ29tcG9uZW50LCB3aWR0aCwgaGVpZ2h0LCBjb2xvclNwYWNlKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgICAgICB0aGlzLmJpdHNQZXJDb21wb25lbnQgPSBiaXRzUGVyQ29tcG9uZW50O1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbG9yU3BhY2UgPSBjb2xvclNwYWNlO1xuICAgIH1cbiAgICBKcGVnRW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKGltYWdlRGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YVZpZXcsIHNvaSwgcG9zLCBtYXJrZXIsIGJpdHNQZXJDb21wb25lbnQsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxCeXRlLCBjaGFubmVsTmFtZSwgY29sb3JTcGFjZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhpbWFnZURhdGEuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBzb2kgPSBkYXRhVmlldy5nZXRVaW50MTYoMCk7XG4gICAgICAgICAgICAgICAgaWYgKHNvaSAhPT0gMHhmZmQ4KVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NPSSBub3QgZm91bmQgaW4gSlBFRycpO1xuICAgICAgICAgICAgICAgIHBvcyA9IDI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gZGF0YVZpZXcuZ2V0VWludDE2KHBvcyk7XG4gICAgICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTUFSS0VSUy5pbmNsdWRlcyhtYXJrZXIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHBvcyArPSBkYXRhVmlldy5nZXRVaW50MTYocG9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFNQVJLRVJTLmluY2x1ZGVzKG1hcmtlcikpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKUEVHJyk7XG4gICAgICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgICAgICAgICAgYml0c1BlckNvbXBvbmVudCA9IGRhdGFWaWV3LmdldFVpbnQ4KHBvcysrKTtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBkYXRhVmlldy5nZXRVaW50MTYocG9zKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgICAgICAgICB3aWR0aCA9IGRhdGFWaWV3LmdldFVpbnQxNihwb3MpO1xuICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICAgICAgICAgIGNoYW5uZWxCeXRlID0gZGF0YVZpZXcuZ2V0VWludDgocG9zKyspO1xuICAgICAgICAgICAgICAgIGNoYW5uZWxOYW1lID0gQ2hhbm5lbFRvQ29sb3JTcGFjZVtjaGFubmVsQnl0ZV07XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIEpQRUcgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgICAgICBjb2xvclNwYWNlID0gY2hhbm5lbE5hbWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBKcGVnRW1iZWRkZXIoaW1hZ2VEYXRhLCBiaXRzUGVyQ29tcG9uZW50LCB3aWR0aCwgaGVpZ2h0LCBjb2xvclNwYWNlKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBKcGVnRW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB4T2JqZWN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHhPYmplY3QgPSBjb250ZXh0LnN0cmVhbSh0aGlzLmltYWdlRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnWE9iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6ICdJbWFnZScsXG4gICAgICAgICAgICAgICAgICAgIEJpdHNQZXJDb21wb25lbnQ6IHRoaXMuYml0c1BlckNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgV2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIEhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2U6IHRoaXMuY29sb3JTcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgRmlsdGVyOiAnRENURGVjb2RlJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gQ01ZSyBKUEVHIHN0cmVhbXMgaW4gUERGIGFyZSB0eXBpY2FsbHkgc3RvcmVkIGNvbXBsZW1lbnRlZCxcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCAxIGFzICdvZmYnIGFuZCAwIGFzICdvbicgKFBERiAzMjAwMC0xOjIwMDgsIDguNi40LjQpLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGFuZGFsb25lIENNWUsgSlBFRyAodXN1YWxseSBleHBvcnRlZCBieSBQaG90b3Nob3ApIGFyZVxuICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZWQgaW52ZXJzZSwgd2l0aCAwIGFzICdvZmYnIGFuZCAxIGFzICdvbicsIGxpa2UgUkdCLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBBcHBseWluZyBhIHN3YXAgaGVyZSBhcyBhIGhlZGdlIHRoYXQgbW9zdCBieXRlcyBwYXNzaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhpcyBtZXRob2Qgd2lsbCBiZW5lZml0IGZyb20gaXQuXG4gICAgICAgICAgICAgICAgICAgIERlY29kZTogdGhpcy5jb2xvclNwYWNlID09PSBDb2xvclNwYWNlLkRldmljZUNNWUtcbiAgICAgICAgICAgICAgICAgICAgICAgID8gWzEsIDAsIDEsIDAsIDEsIDAsIDEsIDBdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYXNzaWduKHJlZiwgeE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoeE9iamVjdCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gSnBlZ0VtYmVkZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEpwZWdFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpwZWdFbWJlZGRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3IsIFVucmVjb2duaXplZFN0cmVhbVR5cGVFcnJvciwgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlJhd1N0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZSYXdTdHJlYW1cIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGU3RyZWFtXCI7XG5pbXBvcnQgeyBkZWNvZGVQREZSYXdTdHJlYW0gfSBmcm9tIFwiLi4vc3RyZWFtcy9kZWNvZGVcIjtcbmltcG9ydCBQREZDb250ZW50U3RyZWFtIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERkNvbnRlbnRTdHJlYW1cIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IG1lcmdlSW50b1R5cGVkQXJyYXkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBmdWxsUGFnZUJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICB2YXIgbWVkaWFCb3ggPSBwYWdlLk1lZGlhQm94KCk7XG4gICAgdmFyIHdpZHRoID0gbWVkaWFCb3gubG9va3VwKDIsIFBERk51bWJlcikuYXNOdW1iZXIoKSAtXG4gICAgICAgIG1lZGlhQm94Lmxvb2t1cCgwLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgdmFyIGhlaWdodCA9IG1lZGlhQm94Lmxvb2t1cCgzLCBQREZOdW1iZXIpLmFzTnVtYmVyKCkgLVxuICAgICAgICBtZWRpYUJveC5sb29rdXAoMSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgIHJldHVybiB7IGxlZnQ6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IHdpZHRoLCB0b3A6IGhlaWdodCB9O1xufTtcbi8vIFJldHVybnMgdGhlIGlkZW50aXR5IG1hdHJpeCwgbW9kaWZpZWQgdG8gcG9zaXRpb24gdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuXG4vLyBib3VuZGluZyBib3ggYXQgKDAsIDApLlxudmFyIGJvdW5kaW5nQm94QWRqdXN0ZWRNYXRyaXggPSBmdW5jdGlvbiAoYmIpIHsgcmV0dXJuIFsxLCAwLCAwLCAxLCAtYmIubGVmdCwgLWJiLmJvdHRvbV07IH07XG52YXIgUERGUGFnZUVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERlBhZ2VFbWJlZGRlcihwYWdlLCBib3VuZGluZ0JveCwgdHJhbnNmb3JtYXRpb25NYXRyaXgpIHtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICAgICAgdmFyIGJiID0gYm91bmRpbmdCb3ggIT09IG51bGwgJiYgYm91bmRpbmdCb3ggIT09IHZvaWQgMCA/IGJvdW5kaW5nQm94IDogZnVsbFBhZ2VCb3VuZGluZ0JveChwYWdlKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IGJiLnJpZ2h0IC0gYmIubGVmdDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBiYi50b3AgLSBiYi5ib3R0b207XG4gICAgICAgIHRoaXMuYm91bmRpbmdCb3ggPSBiYjtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IHRyYW5zZm9ybWF0aW9uTWF0cml4ICE9PSBudWxsICYmIHRyYW5zZm9ybWF0aW9uTWF0cml4ICE9PSB2b2lkIDAgPyB0cmFuc2Zvcm1hdGlvbk1hdHJpeCA6IGJvdW5kaW5nQm94QWRqdXN0ZWRNYXRyaXgoYmIpO1xuICAgIH1cbiAgICBQREZQYWdlRW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKHBhZ2UsIGJvdW5kaW5nQm94LCB0cmFuc2Zvcm1hdGlvbk1hdHJpeCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQREZQYWdlRW1iZWRkZXIocGFnZSwgYm91bmRpbmdCb3gsIHRyYW5zZm9ybWF0aW9uTWF0cml4KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZQYWdlRW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgQ29udGVudHMsIFJlc291cmNlcywgZGVjb2RlZENvbnRlbnRzLCBfYiwgbGVmdCwgYm90dG9tLCByaWdodCwgdG9wLCB4T2JqZWN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIF9hID0gdGhpcy5wYWdlLm5vcm1hbGl6ZWRFbnRyaWVzKCksIENvbnRlbnRzID0gX2EuQ29udGVudHMsIFJlc291cmNlcyA9IF9hLlJlc291cmNlcztcbiAgICAgICAgICAgICAgICBpZiAoIUNvbnRlbnRzKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgZGVjb2RlZENvbnRlbnRzID0gdGhpcy5kZWNvZGVDb250ZW50cyhDb250ZW50cyk7XG4gICAgICAgICAgICAgICAgX2IgPSB0aGlzLmJvdW5kaW5nQm94LCBsZWZ0ID0gX2IubGVmdCwgYm90dG9tID0gX2IuYm90dG9tLCByaWdodCA9IF9iLnJpZ2h0LCB0b3AgPSBfYi50b3A7XG4gICAgICAgICAgICAgICAgeE9iamVjdCA9IGNvbnRleHQuZmxhdGVTdHJlYW0oZGVjb2RlZENvbnRlbnRzLCB7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdYT2JqZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogJ0Zvcm0nLFxuICAgICAgICAgICAgICAgICAgICBGb3JtVHlwZTogMSxcbiAgICAgICAgICAgICAgICAgICAgQkJveDogW2xlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcF0sXG4gICAgICAgICAgICAgICAgICAgIE1hdHJpeDogdGhpcy50cmFuc2Zvcm1hdGlvbk1hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzOiBSZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmFzc2lnbihyZWYsIHhPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKHhPYmplY3QpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gYGNvbnRlbnRzYCBpcyBhbiBhcnJheSBvZiBzdHJlYW1zIHdoaWNoIGFyZSBtZXJnZWQgdG8gaW5jbHVkZSB0aGVtIGluIHRoZSBYT2JqZWN0LlxuICAgIC8vIFRoaXMgbWV0aG9kcyBleHRyYWN0cyBlYWNoIHN0cmVhbSBhbmQgam9pbnMgdGhlbSB3aXRoIGEgbmV3bGluZSBjaGFyYWN0ZXIuXG4gICAgUERGUGFnZUVtYmVkZGVyLnByb3RvdHlwZS5kZWNvZGVDb250ZW50cyA9IGZ1bmN0aW9uIChjb250ZW50cykge1xuICAgICAgICB2YXIgbmV3bGluZSA9IFVpbnQ4QXJyYXkub2YoQ2hhckNvZGVzLk5ld2xpbmUpO1xuICAgICAgICB2YXIgZGVjb2RlZENvbnRlbnRzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGNvbnRlbnRzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRlbnRzLmxvb2t1cChpZHgsIFBERlN0cmVhbSk7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBQREZSYXdTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gZGVjb2RlUERGUmF3U3RyZWFtKHN0cmVhbSkuZGVjb2RlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBQREZDb250ZW50U3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IHN0cmVhbS5nZXRVbmVuY29kZWRDb250ZW50cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVjb2duaXplZFN0cmVhbVR5cGVFcnJvcihzdHJlYW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjb2RlZENvbnRlbnRzLnB1c2goY29udGVudCwgbmV3bGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lcmdlSW50b1R5cGVkQXJyYXkuYXBwbHkodm9pZCAwLCBkZWNvZGVkQ29udGVudHMpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlBhZ2VFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZQYWdlRW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZQYWdlRW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUE5HIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3BuZ1wiO1xuLyoqXG4gKiBBIG5vdGUgb2YgdGhhbmtzIHRvIHRoZSBkZXZlbG9wZXJzIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdCwgYXNcbiAqIHRoaXMgY2xhc3MgYm9ycm93cyBmcm9tOlxuICogICBodHRwczovL2dpdGh1Yi5jb20vZGV2b25nb3ZldHQvcGRma2l0L2Jsb2IvZTcxZWRhYjBkZDQ2NTdiNWE3Njc4MDRiYTg2Yzk0YzU4ZDAxZmJjYS9saWIvaW1hZ2UvcG5nLmNvZmZlZVxuICovXG52YXIgUG5nRW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUG5nRW1iZWRkZXIocG5nKSB7XG4gICAgICAgIHRoaXMuaW1hZ2UgPSBwbmc7XG4gICAgICAgIHRoaXMuYml0c1BlckNvbXBvbmVudCA9IHBuZy5iaXRzUGVyQ29tcG9uZW50O1xuICAgICAgICB0aGlzLndpZHRoID0gcG5nLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHBuZy5oZWlnaHQ7XG4gICAgICAgIHRoaXMuY29sb3JTcGFjZSA9ICdEZXZpY2VSR0InO1xuICAgIH1cbiAgICBQbmdFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoaW1hZ2VEYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwbmc7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcG5nID0gUE5HLmxvYWQoaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFBuZ0VtYmVkZGVyKHBuZyldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUG5nRW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBTTWFzaywgeE9iamVjdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBTTWFzayA9IHRoaXMuZW1iZWRBbHBoYUNoYW5uZWwoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgeE9iamVjdCA9IGNvbnRleHQuZmxhdGVTdHJlYW0odGhpcy5pbWFnZS5yZ2JDaGFubmVsLCB7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdYT2JqZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogJ0ltYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgQml0c1BlckNvbXBvbmVudDogdGhpcy5pbWFnZS5iaXRzUGVyQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBXaWR0aDogdGhpcy5pbWFnZS53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgSGVpZ2h0OiB0aGlzLmltYWdlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZTogdGhpcy5jb2xvclNwYWNlLFxuICAgICAgICAgICAgICAgICAgICBTTWFzazogU01hc2ssXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmFzc2lnbihyZWYsIHhPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKHhPYmplY3QpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUG5nRW1iZWRkZXIucHJvdG90eXBlLmVtYmVkQWxwaGFDaGFubmVsID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlLmFscGhhQ2hhbm5lbClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciB4T2JqZWN0ID0gY29udGV4dC5mbGF0ZVN0cmVhbSh0aGlzLmltYWdlLmFscGhhQ2hhbm5lbCwge1xuICAgICAgICAgICAgVHlwZTogJ1hPYmplY3QnLFxuICAgICAgICAgICAgU3VidHlwZTogJ0ltYWdlJyxcbiAgICAgICAgICAgIEhlaWdodDogdGhpcy5pbWFnZS5oZWlnaHQsXG4gICAgICAgICAgICBXaWR0aDogdGhpcy5pbWFnZS53aWR0aCxcbiAgICAgICAgICAgIEJpdHNQZXJDb21wb25lbnQ6IHRoaXMuaW1hZ2UuYml0c1BlckNvbXBvbmVudCxcbiAgICAgICAgICAgIENvbG9yU3BhY2U6ICdEZXZpY2VHcmF5JyxcbiAgICAgICAgICAgIERlY29kZTogWzAsIDFdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVnaXN0ZXIoeE9iamVjdCk7XG4gICAgfTtcbiAgICByZXR1cm4gUG5nRW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUG5nRW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QbmdFbWJlZGRlci5qcy5tYXAiLCJpbXBvcnQgeyBFbmNvZGluZ3MsIEZvbnQsIEZvbnROYW1lcywgfSBmcm9tICdAcGRmLWxpYi9zdGFuZGFyZC1mb250cyc7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IHsgdG9Db2RlUG9pbnQsIHRvSGV4U3RyaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIEEgbm90ZSBvZiB0aGFua3MgdG8gdGhlIGRldmVsb3BlcnMgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0LCBhc1xuICogdGhpcyBjbGFzcyBib3Jyb3dzIGZyb206XG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdC9ibG9iL2Y5MWJkZDYxYzE2NGE3MmVhMDZiZTFhNDNkYzBhNDEyYWZjMzkyNWYvbGliL2ZvbnQvYWZtLmNvZmZlZVxuICovXG52YXIgU3RhbmRhcmRGb250RW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3RhbmRhcmRGb250RW1iZWRkZXIoZm9udE5hbWUsIGN1c3RvbU5hbWUpIHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSAoZm9udE5hbWUgPT09IEZvbnROYW1lcy5aYXBmRGluZ2JhdHMgPyBFbmNvZGluZ3MuWmFwZkRpbmdiYXRzXG4gICAgICAgICAgICA6IGZvbnROYW1lID09PSBGb250TmFtZXMuU3ltYm9sID8gRW5jb2RpbmdzLlN5bWJvbFxuICAgICAgICAgICAgICAgIDogRW5jb2RpbmdzLldpbkFuc2kpO1xuICAgICAgICB0aGlzLmZvbnQgPSBGb250LmxvYWQoZm9udE5hbWUpO1xuICAgICAgICB0aGlzLmZvbnROYW1lID0gdGhpcy5mb250LkZvbnROYW1lO1xuICAgICAgICB0aGlzLmN1c3RvbU5hbWUgPSBjdXN0b21OYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgdGhlIEphdmFTY3JpcHQgc3RyaW5nIGludG8gdGhpcyBmb250LiAoSmF2YVNjcmlwdCBlbmNvZGVzIHN0cmluZ3MgaW5cbiAgICAgKiBVbmljb2RlLCBidXQgc3RhbmRhcmQgZm9udHMgdXNlIGVpdGhlciBXaW5BbnNpLCBaYXBmRGluZ2JhdHMsIG9yIFN5bWJvbFxuICAgICAqIGVuY29kaW5ncylcbiAgICAgKi9cbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW5jb2RlVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHZhciBnbHlwaHMgPSB0aGlzLmVuY29kZVRleHRBc0dseXBocyh0ZXh0KTtcbiAgICAgICAgdmFyIGhleENvZGVzID0gbmV3IEFycmF5KGdseXBocy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnbHlwaHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBoZXhDb2Rlc1tpZHhdID0gdG9IZXhTdHJpbmcoZ2x5cGhzW2lkeF0uY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBERkhleFN0cmluZy5vZihoZXhDb2Rlcy5qb2luKCcnKSk7XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUud2lkdGhPZlRleHRBdFNpemUgPSBmdW5jdGlvbiAodGV4dCwgc2l6ZSkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5lbmNvZGVUZXh0QXNHbHlwaHModGV4dCk7XG4gICAgICAgIHZhciB0b3RhbFdpZHRoID0gMDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGxlZnQgPSBnbHlwaHNbaWR4XS5uYW1lO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gKGdseXBoc1tpZHggKyAxXSB8fCB7fSkubmFtZTtcbiAgICAgICAgICAgIHZhciBrZXJuQW1vdW50ID0gdGhpcy5mb250LmdldFhBeGlzS2VybmluZ0ZvclBhaXIobGVmdCwgcmlnaHQpIHx8IDA7XG4gICAgICAgICAgICB0b3RhbFdpZHRoICs9IHRoaXMud2lkdGhPZkdseXBoKGxlZnQpICsga2VybkFtb3VudDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2NhbGUgPSBzaXplIC8gMTAwMDtcbiAgICAgICAgcmV0dXJuIHRvdGFsV2lkdGggKiBzY2FsZTtcbiAgICB9O1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLnByb3RvdHlwZS5oZWlnaHRPZkZvbnRBdFNpemUgPSBmdW5jdGlvbiAoc2l6ZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgX2EgPSBvcHRpb25zLmRlc2NlbmRlciwgZGVzY2VuZGVyID0gX2EgPT09IHZvaWQgMCA/IHRydWUgOiBfYTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5mb250LCBBc2NlbmRlciA9IF9iLkFzY2VuZGVyLCBEZXNjZW5kZXIgPSBfYi5EZXNjZW5kZXIsIEZvbnRCQm94ID0gX2IuRm9udEJCb3g7XG4gICAgICAgIHZhciB5VG9wID0gQXNjZW5kZXIgfHwgRm9udEJCb3hbM107XG4gICAgICAgIHZhciB5Qm90dG9tID0gRGVzY2VuZGVyIHx8IEZvbnRCQm94WzFdO1xuICAgICAgICB2YXIgaGVpZ2h0ID0geVRvcCAtIHlCb3R0b207XG4gICAgICAgIGlmICghZGVzY2VuZGVyKVxuICAgICAgICAgICAgaGVpZ2h0ICs9IERlc2NlbmRlciB8fCAwO1xuICAgICAgICByZXR1cm4gKGhlaWdodCAvIDEwMDApICogc2l6ZTtcbiAgICB9O1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLnByb3RvdHlwZS5zaXplT2ZGb250QXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZm9udCwgQXNjZW5kZXIgPSBfYS5Bc2NlbmRlciwgRGVzY2VuZGVyID0gX2EuRGVzY2VuZGVyLCBGb250QkJveCA9IF9hLkZvbnRCQm94O1xuICAgICAgICB2YXIgeVRvcCA9IEFzY2VuZGVyIHx8IEZvbnRCQm94WzNdO1xuICAgICAgICB2YXIgeUJvdHRvbSA9IERlc2NlbmRlciB8fCBGb250QkJveFsxXTtcbiAgICAgICAgcmV0dXJuICgxMDAwICogaGVpZ2h0KSAvICh5VG9wIC0geUJvdHRvbSk7XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRJbnRvQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWYpIHtcbiAgICAgICAgdmFyIGZvbnREaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgVHlwZTogJ0ZvbnQnLFxuICAgICAgICAgICAgU3VidHlwZTogJ1R5cGUxJyxcbiAgICAgICAgICAgIEJhc2VGb250OiB0aGlzLmN1c3RvbU5hbWUgfHwgdGhpcy5mb250TmFtZSxcbiAgICAgICAgICAgIEVuY29kaW5nOiB0aGlzLmVuY29kaW5nID09PSBFbmNvZGluZ3MuV2luQW5zaSA/ICdXaW5BbnNpRW5jb2RpbmcnIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCBmb250RGljdCk7XG4gICAgICAgICAgICByZXR1cm4gcmVmO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucmVnaXN0ZXIoZm9udERpY3QpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUud2lkdGhPZkdseXBoID0gZnVuY3Rpb24gKGdseXBoTmFtZSkge1xuICAgICAgICAvLyBEZWZhdWx0IHRvIDI1MCBpZiBmb250IGRvZXNuJ3Qgc3BlY2lmeSBhIHdpZHRoXG4gICAgICAgIHJldHVybiB0aGlzLmZvbnQuZ2V0V2lkdGhPZkdseXBoKGdseXBoTmFtZSkgfHwgMjUwO1xuICAgIH07XG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLmVuY29kZVRleHRBc0dseXBocyA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHZhciBjb2RlUG9pbnRzID0gQXJyYXkuZnJvbSh0ZXh0KTtcbiAgICAgICAgdmFyIGdseXBocyA9IG5ldyBBcnJheShjb2RlUG9pbnRzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgY29kZVBvaW50ID0gdG9Db2RlUG9pbnQoY29kZVBvaW50c1tpZHhdKTtcbiAgICAgICAgICAgIGdseXBoc1tpZHhdID0gdGhpcy5lbmNvZGluZy5lbmNvZGVVbmljb2RlQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdseXBocztcbiAgICB9O1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChmb250TmFtZSwgY3VzdG9tTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFN0YW5kYXJkRm9udEVtYmVkZGVyKGZvbnROYW1lLCBjdXN0b21OYW1lKTtcbiAgICB9O1xuICAgIHJldHVybiBTdGFuZGFyZEZvbnRFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBTdGFuZGFyZEZvbnRFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0YW5kYXJkRm9udEVtYmVkZGVyLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYXJyYXlBc1N0cmluZyB9IGZyb20gXCIuLi91dGlsc1wiO1xudmFyIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcihjbGFzc05hbWUsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiTWV0aG9kIFwiICsgY2xhc3NOYW1lICsgXCIuXCIgKyBtZXRob2ROYW1lICsgXCIoKSBub3QgaW1wbGVtZW50ZWRcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIH07XG52YXIgUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFByaXZhdGVDb25zdHJ1Y3RvckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFByaXZhdGVDb25zdHJ1Y3RvckVycm9yKGNsYXNzTmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJDYW5ub3QgY29uc3RydWN0IFwiICsgY2xhc3NOYW1lICsgXCIgLSBpdCBoYXMgYSBwcml2YXRlIGNvbnN0cnVjdG9yXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQcml2YXRlQ29uc3RydWN0b3JFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yIH07XG52YXIgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yKGV4cGVjdGVkLCBhY3R1YWwpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG5hbWUgPSBmdW5jdGlvbiAodCkgeyB2YXIgX2EsIF9iOyByZXR1cm4gKF9hID0gdCA9PT0gbnVsbCB8fCB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0Lm5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChfYiA9IHQgPT09IG51bGwgfHwgdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdC5jb25zdHJ1Y3RvcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm5hbWU7IH07XG4gICAgICAgIHZhciBleHBlY3RlZFR5cGVzID0gQXJyYXkuaXNBcnJheShleHBlY3RlZClcbiAgICAgICAgICAgID8gZXhwZWN0ZWQubWFwKG5hbWUpXG4gICAgICAgICAgICA6IFtuYW1lKGV4cGVjdGVkKV07XG4gICAgICAgIHZhciBtc2cgPSBcIkV4cGVjdGVkIGluc3RhbmNlIG9mIFwiICsgZXhwZWN0ZWRUeXBlcy5qb2luKCcgb3IgJykgKyBcIiwgXCIgK1xuICAgICAgICAgICAgKFwiYnV0IGdvdCBpbnN0YW5jZSBvZiBcIiArIChhY3R1YWwgPyBuYW1lKGFjdHVhbCkgOiBhY3R1YWwpKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yIH07XG52YXIgVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVbnN1cHBvcnRlZEVuY29kaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yKGVuY29kaW5nKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBlbmNvZGluZyArIFwiIHN0cmVhbSBlbmNvZGluZyBub3Qgc3VwcG9ydGVkXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBVbnN1cHBvcnRlZEVuY29kaW5nRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBVbnN1cHBvcnRlZEVuY29kaW5nRXJyb3IgfTtcbnZhciBSZXBhcnNlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlcGFyc2VFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZXBhcnNlRXJyb3IoY2xhc3NOYW1lLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkNhbm5vdCBjYWxsIFwiICsgY2xhc3NOYW1lICsgXCIuXCIgKyBtZXRob2ROYW1lICsgXCIoKSBtb3JlIHRoYW4gb25jZVwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUmVwYXJzZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUmVwYXJzZUVycm9yIH07XG52YXIgTWlzc2luZ0NhdGFsb2dFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0NhdGFsb2dFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nQ2F0YWxvZ0Vycm9yKHJlZikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJNaXNzaW5nIGNhdGFsb2cgKHJlZj1cIiArIHJlZiArIFwiKVwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ0NhdGFsb2dFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdDYXRhbG9nRXJyb3IgfTtcbnZhciBNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdQYWdlQ29udGVudHNFbWJlZGRpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkNhbid0IGVtYmVkIHBhZ2Ugd2l0aCBtaXNzaW5nIENvbnRlbnRzXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3IgfTtcbnZhciBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVucmVjb2duaXplZFN0cmVhbVR5cGVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3Ioc3RyZWFtKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgc3RyZWFtVHlwZSA9IChfYyA9IChfYiA9IChfYSA9IHN0cmVhbSA9PT0gbnVsbCB8fCBzdHJlYW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0cmVhbS5jb250cnVjdG9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmFtZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RyZWFtID09PSBudWxsIHx8IHN0cmVhbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RyZWFtLm5hbWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHN0cmVhbTtcbiAgICAgICAgdmFyIG1zZyA9IFwiVW5yZWNvZ25pemVkIHN0cmVhbSB0eXBlOiBcIiArIHN0cmVhbVR5cGU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3IgfTtcbnZhciBQYWdlRW1iZWRkaW5nTWlzbWF0Y2hlZENvbnRleHRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZvdW5kIG1pc21hdGNoZWQgY29udGV4dHMgd2hpbGUgZW1iZWRkaW5nIHBhZ2VzLiBBbGwgcGFnZXMgaW4gdGhlIGFycmF5IHBhc3NlZCB0byBgUERGRG9jdW1lbnQuZW1iZWRQYWdlcygpYCBtdXN0IGJlIGZyb20gdGhlIHNhbWUgZG9jdW1lbnQuXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQYWdlRW1iZWRkaW5nTWlzbWF0Y2hlZENvbnRleHRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yIH07XG52YXIgUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBcnJheUlzTm90UmVjdGFuZ2xlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yKHNpemUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQXR0ZW1wdGVkIHRvIGNvbnZlcnQgUERGQXJyYXkgd2l0aCBcIiArIHNpemUgKyBcIiBlbGVtZW50cyB0byByZWN0YW5nbGUsIGJ1dCBtdXN0IGhhdmUgZXhhY3RseSA0IGVsZW1lbnRzLlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yIH07XG52YXIgSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkF0dGVtcHRlZCB0byBjb252ZXJ0IFxcXCJcIiArIHZhbHVlICsgXCJcXFwiIHRvIGEgZGF0ZSwgYnV0IGl0IGRvZXMgbm90IG1hdGNoIHRoZSBQREYgZGF0ZSBzdHJpbmcgZm9ybWF0LlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IgfTtcbnZhciBJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52YWxpZFRhcmdldEluZGV4RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW52YWxpZFRhcmdldEluZGV4RXJyb3IodGFyZ2V0SW5kZXgsIENvdW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkludmFsaWQgdGFyZ2V0SW5kZXggc3BlY2lmaWVkOiB0YXJnZXRJbmRleD1cIiArIHRhcmdldEluZGV4ICsgXCIgbXVzdCBiZSBsZXNzIHRoYW4gQ291bnQ9XCIgKyBDb3VudDtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEludmFsaWRUYXJnZXRJbmRleEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgSW52YWxpZFRhcmdldEluZGV4RXJyb3IgfTtcbnZhciBDb3JydXB0UGFnZVRyZWVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29ycnVwdFBhZ2VUcmVlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29ycnVwdFBhZ2VUcmVlRXJyb3IodGFyZ2V0SW5kZXgsIG9wZXJhdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gXCIgKyBvcGVyYXRpb24gKyBcIiBhdCB0YXJnZXRJbmRleD1cIiArIHRhcmdldEluZGV4ICsgXCIgZHVlIHRvIGNvcnJ1cHQgcGFnZSB0cmVlOiBJdCBpcyBsaWtlbHkgdGhhdCBvbmUgb3IgbW9yZSAnQ291bnQnIGVudHJpZXMgYXJlIGludmFsaWRcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIENvcnJ1cHRQYWdlVHJlZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgQ29ycnVwdFBhZ2VUcmVlRXJyb3IgfTtcbnZhciBJbmRleE91dE9mQm91bmRzRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEluZGV4T3V0T2ZCb3VuZHNFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbmRleE91dE9mQm91bmRzRXJyb3IoaW5kZXgsIG1pbiwgbWF4KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcImluZGV4IHNob3VsZCBiZSBhdCBsZWFzdCBcIiArIG1pbiArIFwiIGFuZCBhdCBtb3N0IFwiICsgbWF4ICsgXCIsIGJ1dCB3YXMgYWN0dWFsbHkgXCIgKyBpbmRleDtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEluZGV4T3V0T2ZCb3VuZHNFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEluZGV4T3V0T2ZCb3VuZHNFcnJvciB9O1xudmFyIEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQXR0ZW1wdGVkIHRvIHNldCBpbnZhbGlkIGZpZWxkIHZhbHVlXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yIH07XG52YXIgTXVsdGlTZWxlY3RWYWx1ZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNdWx0aVNlbGVjdFZhbHVlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTXVsdGlTZWxlY3RWYWx1ZUVycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBdHRlbXB0ZWQgdG8gc2VsZWN0IG11bHRpcGxlIHZhbHVlcyBmb3Igc2luZ2xlLXNlbGVjdCBmaWVsZFwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTXVsdGlTZWxlY3RWYWx1ZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTXVsdGlTZWxlY3RWYWx1ZUVycm9yIH07XG52YXIgTWlzc2luZ0RBRW50cnlFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0RBRW50cnlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nREFFbnRyeUVycm9yKGZpZWxkTmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJObyAvREEgKGRlZmF1bHQgYXBwZWFyYW5jZSkgZW50cnkgZm91bmQgZm9yIGZpZWxkOiBcIiArIGZpZWxkTmFtZTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdEQUVudHJ5RXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nREFFbnRyeUVycm9yIH07XG52YXIgTWlzc2luZ1RmT3BlcmF0b3JFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ1RmT3BlcmF0b3JFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nVGZPcGVyYXRvckVycm9yKGZpZWxkTmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJObyBUZiBvcGVyYXRvciBmb3VuZCBmb3IgREEgb2YgZmllbGQ6IFwiICsgZmllbGROYW1lO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ1RmT3BlcmF0b3JFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdUZk9wZXJhdG9yRXJyb3IgfTtcbnZhciBOdW1iZXJQYXJzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE51bWJlclBhcnNpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOdW1iZXJQYXJzaW5nRXJyb3IocG9zLCB2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgbnVtYmVyIFwiICtcbiAgICAgICAgICAgIChcIihsaW5lOlwiICsgcG9zLmxpbmUgKyBcIiBjb2w6XCIgKyBwb3MuY29sdW1uICsgXCIgb2Zmc2V0PVwiICsgcG9zLm9mZnNldCArIFwiKTogXFxcIlwiICsgdmFsdWUgKyBcIlxcXCJcIik7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBOdW1iZXJQYXJzaW5nRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBOdW1iZXJQYXJzaW5nRXJyb3IgfTtcbnZhciBQREZQYXJzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlBhcnNpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZQYXJzaW5nRXJyb3IocG9zLCBkZXRhaWxzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBwYXJzZSBQREYgZG9jdW1lbnQgXCIgK1xuICAgICAgICAgICAgKFwiKGxpbmU6XCIgKyBwb3MubGluZSArIFwiIGNvbDpcIiArIHBvcy5jb2x1bW4gKyBcIiBvZmZzZXQ9XCIgKyBwb3Mub2Zmc2V0ICsgXCIpOiBcIiArIGRldGFpbHMpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUERGUGFyc2luZ0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUERGUGFyc2luZ0Vycm9yIH07XG52YXIgTmV4dEJ5dGVBc3NlcnRpb25FcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmV4dEJ5dGVBc3NlcnRpb25FcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOZXh0Qnl0ZUFzc2VydGlvbkVycm9yKHBvcywgZXhwZWN0ZWRCeXRlLCBhY3R1YWxCeXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkV4cGVjdGVkIG5leHQgYnl0ZSB0byBiZSBcIiArIGV4cGVjdGVkQnl0ZSArIFwiIGJ1dCBpdCB3YXMgYWN0dWFsbHkgXCIgKyBhY3R1YWxCeXRlO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBOZXh0Qnl0ZUFzc2VydGlvbkVycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IE5leHRCeXRlQXNzZXJ0aW9uRXJyb3IgfTtcbnZhciBQREZPYmplY3RQYXJzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk9iamVjdFBhcnNpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZPYmplY3RQYXJzaW5nRXJyb3IocG9zLCBieXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBwYXJzZSBQREYgb2JqZWN0IHN0YXJ0aW5nIHdpdGggdGhlIGZvbGxvd2luZyBieXRlOiBcIiArIGJ5dGU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBERk9iamVjdFBhcnNpbmdFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBQREZPYmplY3RQYXJzaW5nRXJyb3IgfTtcbnZhciBQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkludmFsaWRPYmplY3RQYXJzaW5nRXJyb3IocG9zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBwYXJzZSBpbnZhbGlkIFBERiBvYmplY3RcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yIH07XG52YXIgUERGU3RyZWFtUGFyc2luZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZTdHJlYW1QYXJzaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGU3RyZWFtUGFyc2luZ0Vycm9yKHBvcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgUERGIHN0cmVhbVwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQREZTdHJlYW1QYXJzaW5nRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgUERGU3RyZWFtUGFyc2luZ0Vycm9yIH07XG52YXIgVW5iYWxhbmNlZFBhcmVudGhlc2lzRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yKHBvcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgUERGIGxpdGVyYWwgc3RyaW5nIGR1ZSB0byB1bmJhbGFuY2VkIHBhcmVudGhlc2lzXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yIH07XG52YXIgU3RhbGxlZFBhcnNlckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTdGFsbGVkUGFyc2VyRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU3RhbGxlZFBhcnNlckVycm9yKHBvcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJQYXJzZXIgc3RhbGxlZFwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBTdGFsbGVkUGFyc2VyRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgU3RhbGxlZFBhcnNlckVycm9yIH07XG52YXIgTWlzc2luZ1BERkhlYWRlckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nUERGSGVhZGVyRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ1BERkhlYWRlckVycm9yKHBvcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJObyBQREYgaGVhZGVyIGZvdW5kXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdQREZIZWFkZXJFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nUERGSGVhZGVyRXJyb3IgfTtcbnZhciBNaXNzaW5nS2V5d29yZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nS2V5d29yZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdLZXl3b3JkRXJyb3IocG9zLCBrZXl3b3JkKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkRpZCBub3QgZmluZCBleHBlY3RlZCBrZXl3b3JkICdcIiArIGFycmF5QXNTdHJpbmcoa2V5d29yZCkgKyBcIidcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ0tleXdvcmRFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nS2V5d29yZEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIiwiZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENoYXJDb2RlcyB9IGZyb20gXCIuL3N5bnRheC9DaGFyQ29kZXNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQ29udGV4dCB9IGZyb20gXCIuL1BERkNvbnRleHRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT2JqZWN0Q29waWVyIH0gZnJvbSBcIi4vUERGT2JqZWN0Q29waWVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERldyaXRlciB9IGZyb20gXCIuL3dyaXRlcnMvUERGV3JpdGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlN0cmVhbVdyaXRlciB9IGZyb20gXCIuL3dyaXRlcnMvUERGU3RyZWFtV3JpdGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkhlYWRlciB9IGZyb20gXCIuL2RvY3VtZW50L1BERkhlYWRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZUcmFpbGVyIH0gZnJvbSBcIi4vZG9jdW1lbnQvUERGVHJhaWxlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZUcmFpbGVyRGljdCB9IGZyb20gXCIuL2RvY3VtZW50L1BERlRyYWlsZXJEaWN0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkNyb3NzUmVmU2VjdGlvbiB9IGZyb20gXCIuL2RvY3VtZW50L1BERkNyb3NzUmVmU2VjdGlvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdGFuZGFyZEZvbnRFbWJlZGRlciB9IGZyb20gXCIuL2VtYmVkZGVycy9TdGFuZGFyZEZvbnRFbWJlZGRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDdXN0b21Gb250RW1iZWRkZXIgfSBmcm9tIFwiLi9lbWJlZGRlcnMvQ3VzdG9tRm9udEVtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlciB9IGZyb20gXCIuL2VtYmVkZGVycy9DdXN0b21Gb250U3Vic2V0RW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRmlsZUVtYmVkZGVyLCBBRlJlbGF0aW9uc2hpcCwgfSBmcm9tIFwiLi9lbWJlZGRlcnMvRmlsZUVtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEpwZWdFbWJlZGRlciB9IGZyb20gXCIuL2VtYmVkZGVycy9KcGVnRW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUG5nRW1iZWRkZXIgfSBmcm9tIFwiLi9lbWJlZGRlcnMvUG5nRW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUGFnZUVtYmVkZGVyLCB9IGZyb20gXCIuL2VtYmVkZGVycy9QREZQYWdlRW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVmlld2VyUHJlZmVyZW5jZXMsIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSwgUmVhZGluZ0RpcmVjdGlvbiwgUHJpbnRTY2FsaW5nLCBEdXBsZXgsIH0gZnJvbSBcIi4vaW50ZXJhY3RpdmUvVmlld2VyUHJlZmVyZW5jZXNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT2JqZWN0IH0gZnJvbSBcIi4vb2JqZWN0cy9QREZPYmplY3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQm9vbCB9IGZyb20gXCIuL29iamVjdHMvUERGQm9vbFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZOdW1iZXIgfSBmcm9tIFwiLi9vYmplY3RzL1BERk51bWJlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZTdHJpbmcgfSBmcm9tIFwiLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZIZXhTdHJpbmcgfSBmcm9tIFwiLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZOYW1lIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZOYW1lXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk51bGwgfSBmcm9tIFwiLi9vYmplY3RzL1BERk51bGxcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQXJyYXkgfSBmcm9tIFwiLi9vYmplY3RzL1BERkFycmF5XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkRpY3QgfSBmcm9tIFwiLi9vYmplY3RzL1BERkRpY3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUmVmIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZSZWZcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGSW52YWxpZE9iamVjdCB9IGZyb20gXCIuL29iamVjdHMvUERGSW52YWxpZE9iamVjdFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZTdHJlYW0gfSBmcm9tIFwiLi9vYmplY3RzL1BERlN0cmVhbVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZSYXdTdHJlYW0gfSBmcm9tIFwiLi9vYmplY3RzL1BERlJhd1N0cmVhbVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZDYXRhbG9nIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZDYXRhbG9nXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkNvbnRlbnRTdHJlYW0gfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERkNvbnRlbnRTdHJlYW1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQ3Jvc3NSZWZTdHJlYW0gfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERkNyb3NzUmVmU3RyZWFtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9iamVjdFN0cmVhbSB9IGZyb20gXCIuL3N0cnVjdHVyZXMvUERGT2JqZWN0U3RyZWFtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlBhZ2VUcmVlIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZQYWdlVHJlZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZQYWdlTGVhZiB9IGZyb20gXCIuL3N0cnVjdHVyZXMvUERGUGFnZUxlYWZcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRmxhdGVTdHJlYW0gfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERkZsYXRlU3RyZWFtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9wZXJhdG9yIH0gZnJvbSBcIi4vb3BlcmF0b3JzL1BERk9wZXJhdG9yXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9wZXJhdG9yTmFtZXMgfSBmcm9tIFwiLi9vcGVyYXRvcnMvUERGT3BlcmF0b3JOYW1lc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPYmplY3RQYXJzZXIgfSBmcm9tIFwiLi9wYXJzZXIvUERGT2JqZWN0UGFyc2VyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9iamVjdFN0cmVhbVBhcnNlciB9IGZyb20gXCIuL3BhcnNlci9QREZPYmplY3RTdHJlYW1QYXJzZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUGFyc2VyIH0gZnJvbSBcIi4vcGFyc2VyL1BERlBhcnNlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZYUmVmU3RyZWFtUGFyc2VyIH0gZnJvbSBcIi4vcGFyc2VyL1BERlhSZWZTdHJlYW1QYXJzZXJcIjtcbmV4cG9ydCB7IGRlY29kZVBERlJhd1N0cmVhbSB9IGZyb20gXCIuL3N0cmVhbXMvZGVjb2RlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hbm5vdGF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hY3JvZm9ybVwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGQm9vbCBmcm9tIFwiLi4vb2JqZWN0cy9QREZCb29sXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IHsgYXNzZXJ0RWFjaElzLCBhc3NlcnRJbnRlZ2VyLCBhc3NlcnRJc09uZU9mLCBhc3NlcnRSYW5nZSwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBhc0VudW0gPSBmdW5jdGlvbiAocmF3VmFsdWUsIGVudW1UeXBlKSB7XG4gICAgaWYgKHJhd1ZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGVudW1UeXBlW3Jhd1ZhbHVlXTtcbn07XG5leHBvcnQgdmFyIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZTtcbihmdW5jdGlvbiAoTm9uRnVsbFNjcmVlblBhZ2VNb2RlKSB7XG4gICAgLyoqXG4gICAgICogQWZ0ZXIgZXhpdGluZyBGdWxsU2NyZWVuIG1vZGUsIG5laXRoZXIgdGhlIGRvY3VtZW50IG91dGxpbmUgbm9yIHRodW1ibmFpbFxuICAgICAqIGltYWdlcyBzaG91bGQgYmUgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBOb25GdWxsU2NyZWVuUGFnZU1vZGVbXCJVc2VOb25lXCJdID0gXCJVc2VOb25lXCI7XG4gICAgLyoqIEFmdGVyIGV4aXRpbmcgRnVsbFNjcmVlbiBtb2RlLCB0aGUgZG9jdW1lbnQgb3V0bGluZSBzaG91bGQgYmUgdmlzaWJsZS4gKi9cbiAgICBOb25GdWxsU2NyZWVuUGFnZU1vZGVbXCJVc2VPdXRsaW5lc1wiXSA9IFwiVXNlT3V0bGluZXNcIjtcbiAgICAvKiogQWZ0ZXIgZXhpdGluZyBGdWxsU2NyZWVuIG1vZGUsIHRodW1ibmFpbCBpbWFnZXMgc2hvdWxkIGJlIHZpc2libGUuICovXG4gICAgTm9uRnVsbFNjcmVlblBhZ2VNb2RlW1wiVXNlVGh1bWJzXCJdID0gXCJVc2VUaHVtYnNcIjtcbiAgICAvKipcbiAgICAgKiBBZnRlciBleGl0aW5nIEZ1bGxTY3JlZW4gbW9kZSwgdGhlIG9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgcGFuZWwgc2hvdWxkIGJlXG4gICAgICogdmlzaWJsZS5cbiAgICAgKi9cbiAgICBOb25GdWxsU2NyZWVuUGFnZU1vZGVbXCJVc2VPQ1wiXSA9IFwiVXNlT0NcIjtcbn0pKE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSB8fCAoTm9uRnVsbFNjcmVlblBhZ2VNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgUmVhZGluZ0RpcmVjdGlvbjtcbihmdW5jdGlvbiAoUmVhZGluZ0RpcmVjdGlvbikge1xuICAgIC8qKiBUaGUgcHJlZG9taW5hbnQgcmVhZGluZyBvcmRlciBpcyBMZWZ0IHRvIFJpZ2h0LiAqL1xuICAgIFJlYWRpbmdEaXJlY3Rpb25bXCJMMlJcIl0gPSBcIkwyUlwiO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmVkb21pbmFudCByZWFkaW5nIG9yZGVyIGlzIFJpZ2h0IHRvIGxlZnQgKGluY2x1ZGluZyB2ZXJ0aWNhbCB3cml0aW5nXG4gICAgICogc3lzdGVtcywgc3VjaCBhcyBDaGluZXNlLCBKYXBhbmVzZSBhbmQgS29yZWFuKS5cbiAgICAgKi9cbiAgICBSZWFkaW5nRGlyZWN0aW9uW1wiUjJMXCJdID0gXCJSMkxcIjtcbn0pKFJlYWRpbmdEaXJlY3Rpb24gfHwgKFJlYWRpbmdEaXJlY3Rpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBQcmludFNjYWxpbmc7XG4oZnVuY3Rpb24gKFByaW50U2NhbGluZykge1xuICAgIC8qKiBObyBwYWdlIHNjYWxpbmcuICovXG4gICAgUHJpbnRTY2FsaW5nW1wiTm9uZVwiXSA9IFwiTm9uZVwiO1xuICAgIC8qIFVzZSB0aGUgUERGIHJlYWRlcidzIGRlZmF1bHQgcHJpbnQgc2NhbGluZy4gKi9cbiAgICBQcmludFNjYWxpbmdbXCJBcHBEZWZhdWx0XCJdID0gXCJBcHBEZWZhdWx0XCI7XG59KShQcmludFNjYWxpbmcgfHwgKFByaW50U2NhbGluZyA9IHt9KSk7XG5leHBvcnQgdmFyIER1cGxleDtcbihmdW5jdGlvbiAoRHVwbGV4KSB7XG4gICAgLyoqIFRoZSBQREYgcmVhZGVyIHNob3VsZCBwcmludCBzaW5nbGUtc2lkZWQuICovXG4gICAgRHVwbGV4W1wiU2ltcGxleFwiXSA9IFwiU2ltcGxleFwiO1xuICAgIC8qKlxuICAgICAqIFRoZSBQREYgcmVhZGVyIHNob3VsZCBwcmludCBkb3VibGUgc2lkZWQgYW5kIGZsaXAgb24gdGhlIHNob3J0IGVkZ2Ugb2YgdGhlXG4gICAgICogc2hlZXQuXG4gICAgICovXG4gICAgRHVwbGV4W1wiRHVwbGV4RmxpcFNob3J0RWRnZVwiXSA9IFwiRHVwbGV4RmxpcFNob3J0RWRnZVwiO1xuICAgIC8qKlxuICAgICAqIFRoZSBQREYgcmVhZGVyIHNob3VsZCBwcmludCBkb3VibGUgc2lkZWQgYW5kIGZsaXAgb24gdGhlIGxvbmcgZWRnZSBvZiB0aGVcbiAgICAgKiBzaGVldC5cbiAgICAgKi9cbiAgICBEdXBsZXhbXCJEdXBsZXhGbGlwTG9uZ0VkZ2VcIl0gPSBcIkR1cGxleEZsaXBMb25nRWRnZVwiO1xufSkoRHVwbGV4IHx8IChEdXBsZXggPSB7fSkpO1xudmFyIFZpZXdlclByZWZlcmVuY2VzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgZnVuY3Rpb24gVmlld2VyUHJlZmVyZW5jZXMoZGljdCkge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIH1cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUubG9va3VwQm9vbCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHJldHVybk9iaiA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZihrZXkpKTtcbiAgICAgICAgaWYgKHJldHVybk9iaiBpbnN0YW5jZW9mIFBERkJvb2wpXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuT2JqO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmxvb2t1cE5hbWUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciByZXR1cm5PYmogPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2Yoa2V5KSk7XG4gICAgICAgIGlmIChyZXR1cm5PYmogaW5zdGFuY2VvZiBQREZOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIHJldHVybk9iajtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkhpZGVUb29sYmFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdIaWRlVG9vbGJhcicpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuSGlkZU1lbnViYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJvb2woJ0hpZGVNZW51YmFyJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5IaWRlV2luZG93VUkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJvb2woJ0hpZGVXaW5kb3dVSScpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuRml0V2luZG93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdGaXRXaW5kb3cnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkNlbnRlcldpbmRvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQm9vbCgnQ2VudGVyV2luZG93Jyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5EaXNwbGF5RG9jVGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJvb2woJ0Rpc3BsYXlEb2NUaXRsZScpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuTm9uRnVsbFNjcmVlblBhZ2VNb2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBOYW1lKCdOb25GdWxsU2NyZWVuUGFnZU1vZGUnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkRpcmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTmFtZSgnRGlyZWN0aW9uJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5QcmludFNjYWxpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE5hbWUoJ1ByaW50U2NhbGluZycpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuRHVwbGV4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBOYW1lKCdEdXBsZXgnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLlBpY2tUcmF5QnlQREZTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdQaWNrVHJheUJ5UERGU2l6ZScpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuUHJpbnRQYWdlUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBQcmludFBhZ2VSYW5nZSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignUHJpbnRQYWdlUmFuZ2UnKSk7XG4gICAgICAgIGlmIChQcmludFBhZ2VSYW5nZSBpbnN0YW5jZW9mIFBERkFycmF5KVxuICAgICAgICAgICAgcmV0dXJuIFByaW50UGFnZVJhbmdlO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuTnVtQ29waWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgTnVtQ29waWVzID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdOdW1Db3BpZXMnKSk7XG4gICAgICAgIGlmIChOdW1Db3BpZXMgaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gTnVtQ29waWVzO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgUERGIHJlYWRlcnMgc2hvdWxkIGhpZGUgdGhlIHRvb2xiYXIgbWVudXMgd2hlbiBkaXNwbGF5aW5nXG4gICAgICogdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0b29sYmFycyBzaG91bGQgYmUgaGlkZGVuLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRIaWRlVG9vbGJhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuSGlkZVRvb2xiYXIoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCBoaWRlIHRoZSBtZW51IGJhciB3aGVuIGRpc3BsYXlpbmcgdGhpc1xuICAgICAqIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBtZW51IGJhciBzaG91bGQgYmUgaGlkZGVuLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRIaWRlTWVudWJhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuSGlkZU1lbnViYXIoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCBoaWRlIHRoZSB1c2VyIGludGVyZmFjZSBlbGVtZW50cyBpblxuICAgICAqIHRoZSBkb2N1bWVudCdzIHdpbmRvdyAoc3VjaCBhcyBzY3JvbGwgYmFycyBhbmQgbmF2aWdhdGlvbiBjb250cm9scyksXG4gICAgICogbGVhdmluZyBvbmx5IHRoZSBkb2N1bWVudCdzIGNvbnRlbnRzIGRpc3BsYXllZC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB1c2VyIGludGVyZmFjZSBlbGVtZW50cyBzaG91bGQgYmUgaGlkZGVuLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRIaWRlV2luZG93VUkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkhpZGVXaW5kb3dVSSgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNCb29sZWFuKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgUERGIHJlYWRlcnMgc2hvdWxkIHJlc2l6ZSB0aGUgZG9jdW1lbnQncyB3aW5kb3cgdG8gZml0XG4gICAgICogdGhlIHNpemUgb2YgdGhlIGZpcnN0IGRpc3BsYXllZCBwYWdlLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSB3aW5kb3cgc2hvdWxkIGJlIHJlc2l6ZWQgdG8gZml0LlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRGaXRXaW5kb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkZpdFdpbmRvdygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNCb29sZWFuKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgUERGIHJlYWRlcnMgc2hvdWxkIHBvc2l0aW9uIHRoZSBkb2N1bWVudCdzIHdpbmRvdyBpbiB0aGVcbiAgICAgKiBjZW50ZXIgb2YgdGhlIHNjcmVlbi5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0byBjZW50ZXIgdGhlIGRvY3VtZW50IHdpbmRvdy5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0Q2VudGVyV2luZG93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5DZW50ZXJXaW5kb3coKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSB3aW5kb3cncyB0aXRsZSBiYXIgc2hvdWxkIGRpc3BsYXkgdGhlIGRvY3VtZW50XG4gICAgICogYFRpdGxlYCwgdGFrZW4gZnJvbSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEgKHNlZSBbW1BERkRvY3VtZW50LmdldFRpdGxlXV0pLlxuICAgICAqIFJldHVybnMgYGZhbHNlYCBpZiB0aGUgdGl0bGUgYmFyIHNob3VsZCBpbnN0ZWFkIGRpc3BsYXkgdGhlIGZpbGVuYW1lIG9mIHRoZVxuICAgICAqIFBERiBmaWxlLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgZG9jdW1lbnQgdGl0bGUuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldERpc3BsYXlEb2NUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuRGlzcGxheURvY1RpdGxlKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc0Jvb2xlYW4oKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwYWdlIG1vZGUsIHdoaWNoIHRlbGxzIHRoZSBQREYgcmVhZGVyIGhvdyB0byBkaXNwbGF5IHRoZVxuICAgICAqIGRvY3VtZW50IGFmdGVyIGV4aXRpbmcgZnVsbC1zY3JlZW4gbW9kZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcGFnZSBtb2RlIGFmdGVyIGV4aXRpbmcgZnVsbC1zY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0Tm9uRnVsbFNjcmVlblBhZ2VNb2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB2YXIgbW9kZSA9IChfYSA9IHRoaXMuTm9uRnVsbFNjcmVlblBhZ2VNb2RlKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIHJldHVybiAoX2IgPSBhc0VudW0obW9kZSwgTm9uRnVsbFNjcmVlblBhZ2VNb2RlKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogTm9uRnVsbFNjcmVlblBhZ2VNb2RlLlVzZU5vbmU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcmVkb21pbmFudCByZWFkaW5nIG9yZGVyIGZvciB0ZXh0LlxuICAgICAqIEByZXR1cm5zIFRoZSB0ZXh0IHJlYWRpbmcgb3JkZXIuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldFJlYWRpbmdEaXJlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSAoX2EgPSB0aGlzLkRpcmVjdGlvbigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjb2RlVGV4dCgpO1xuICAgICAgICByZXR1cm4gKF9iID0gYXNFbnVtKGRpcmVjdGlvbiwgUmVhZGluZ0RpcmVjdGlvbikpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFJlYWRpbmdEaXJlY3Rpb24uTDJSO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGFnZSBzY2FsaW5nIG9wdGlvbiB0aGF0IHRoZSBQREYgcmVhZGVyIHNob3VsZCBzZWxlY3Qgd2hlbiB0aGVcbiAgICAgKiBwcmludCBkaWFsb2cgaXMgZGlzcGxheWVkLlxuICAgICAqIEByZXR1cm5zIFRoZSBwYWdlIHNjYWxpbmcgb3B0aW9uLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRQcmludFNjYWxpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBzY2FsaW5nID0gKF9hID0gdGhpcy5QcmludFNjYWxpbmcoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29kZVRleHQoKTtcbiAgICAgICAgcmV0dXJuIChfYiA9IGFzRW51bShzY2FsaW5nLCBQcmludFNjYWxpbmcpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBQcmludFNjYWxpbmcuQXBwRGVmYXVsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBhcGVyIGhhbmRsaW5nIG9wdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcHJpbnRpbmcgdGhlXG4gICAgICogZmlsZSBmcm9tIHRoZSBwcmludCBkaWFsb2cuXG4gICAgICogQHJldHVybnMgVGhlIHBhcGVyIGhhbmRsaW5nIG9wdGlvbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0RHVwbGV4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBkdXBsZXggPSAoX2EgPSB0aGlzLkR1cGxleCgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjb2RlVGV4dCgpO1xuICAgICAgICByZXR1cm4gYXNFbnVtKGR1cGxleCwgRHVwbGV4KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBQREYgcGFnZSBzaXplIHNob3VsZCBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgaW5wdXRcbiAgICAgKiBwYXBlciB0cmF5LlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBQREYgcGFnZSBzaXplIHNob3VsZCBiZSB1c2VkIHRvIHNlbGVjdCB0aGVcbiAgICAgKiAgICAgICAgICBpbnB1dCBwYXBlciB0cmF5LlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRQaWNrVHJheUJ5UERGU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5QaWNrVHJheUJ5UERGU2l6ZSgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNCb29sZWFuKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBhZ2UgbnVtYmVyIHJhbmdlcywgd2hpY2ggYXJlIHRoZSB2YWx1ZXMgdXNlZCB0b1xuICAgICAqIGluaXRpYWxpemUgdGhlIHByaW50IGRpYWxvZyBib3ggd2hlbiB0aGUgZmlsZSBpcyBwcmludGVkLiBFYWNoIHJhbmdlXG4gICAgICogc3BlY2lmaWVzIHRoZSBmaXJzdCAoYHN0YXJ0YCkgYW5kIGxhc3QgKGBlbmRgKSBwYWdlcyBpbiBhIHN1Yi1yYW5nZSBvZlxuICAgICAqIHBhZ2VzIHRvIGJlIHByaW50ZWQuIFRoZSBmaXJzdCBwYWdlIG9mIHRoZSBQREYgZmlsZSBpcyBkZW5vdGVkIGJ5IDAuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB2aWV3ZXJQcmVmcyA9IHBkZkRvYy5jYXRhbG9nLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMoKVxuICAgICAqIGNvbnN0IGluY2x1ZGVzUGFnZTMgPSB2aWV3ZXJQcmVmc1xuICAgICAqICAgLmdldFByaW50UmFuZ2VzKClcbiAgICAgKiAgIC5zb21lKHByID0+IHByLnN0YXJ0ID08IDIgJiYgcHIuZW5kID49IDIpXG4gICAgICogaWYgKGluY2x1ZGVzUGFnZTMpIGNvbnNvbGUubG9nKCdwcmludFJhbmdlIGluY2x1ZGVzIHBhZ2UgMycpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2Ygb2JqZWN0cywgZWFjaCB3aXRoIHRoZSBwcm9wZXJ0aWVzIGBzdGFydGAgYW5kIGBlbmRgLFxuICAgICAqICAgICAgICAgIGRlbm90aW5nIHBhZ2UgaW5kaWNlcy4gSWYgbm90LCBzcGVjaWZpZWQgYW4gZW1wdHkgYXJyYXkgaXNcbiAgICAgKiAgICAgICAgICByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0UHJpbnRQYWdlUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBybmcgPSB0aGlzLlByaW50UGFnZVJhbmdlKCk7XG4gICAgICAgIGlmICghcm5nKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB2YXIgcGFnZVJhbmdlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJuZy5zaXplKCk7IGkgKz0gMikge1xuICAgICAgICAgICAgLy8gRGVzcGl0ZSB0aGUgc3BlYyBjbGVhcmx5IHN0YXRpbmcgdGhhdCBcIlRoZSBmaXJzdCBwYWdlIG9mIHRoZSBQREYgZmlsZVxuICAgICAgICAgICAgLy8gc2hhbGwgYmUgZG9ub3RlZCBieSAxXCIsIHNldmVyYWwgdGVzdCBQREZzIChzcGVjIDEuNykgY3JlYXRlZCBpblxuICAgICAgICAgICAgLy8gQWNyb2JhdCBYSSAxMS4wIGFuZCBhbHNvIHJlYWQgd2l0aCBSZWFkZXIgREMgMjAyMC4wMTMgaW5kaWNhdGUgdGhpcyBpc1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgYSAwIGJhc2VkIGluZGV4LlxuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcm5nLmxvb2t1cChpLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICB2YXIgZW5kID0gcm5nLmxvb2t1cChpICsgMSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICAgICAgcGFnZVJhbmdlcy5wdXNoKHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZVJhbmdlcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb3BpZXMgdG8gYmUgcHJpbnRlZCB3aGVuIHRoZSBwcmludCBkaWFsb2cgaXMgb3BlbmVkXG4gICAgICogZm9yIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvcGllcyB0byBiZSBwcmludGVkLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXROdW1Db3BpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLk51bUNvcGllcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB3aGV0aGVyIHRoZSBQREYgcmVhZGVyJ3MgdG9vbGJhcnMgc2hvdWxkIGJlIGhpZGRlbiB3aGlsZSB0aGVcbiAgICAgKiBkb2N1bWVudCBpcyBhY3RpdmUuXG4gICAgICogQHBhcmFtIGhpZGVUb29sYmFyIGB0cnVlYCBpZiB0aGUgdG9vbGJhciBzaG91bGQgYmUgaGlkZGVuLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRIaWRlVG9vbGJhciA9IGZ1bmN0aW9uIChoaWRlVG9vbGJhcikge1xuICAgICAgICB2YXIgSGlkZVRvb2xiYXIgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooaGlkZVRvb2xiYXIpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0hpZGVUb29sYmFyJyksIEhpZGVUb29sYmFyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB3aGV0aGVyIHRoZSBQREYgcmVhZGVyJ3MgbWVudSBiYXIgc2hvdWxkIGJlIGhpZGRlbiB3aGlsZSB0aGVcbiAgICAgKiBkb2N1bWVudCBpcyBhY3RpdmUuXG4gICAgICogQHBhcmFtIGhpZGVNZW51YmFyIGB0cnVlYCBpZiB0aGUgbWVudSBiYXIgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0SGlkZU1lbnViYXIgPSBmdW5jdGlvbiAoaGlkZU1lbnViYXIpIHtcbiAgICAgICAgdmFyIEhpZGVNZW51YmFyID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGhpZGVNZW51YmFyKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdIaWRlTWVudWJhcicpLCBIaWRlTWVudWJhcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIHJlYWRlciBzaG91bGQgaGlkZSB1c2VyIGludGVyZmFjZSBlbGVtZW50cyBpbiB0aGVcbiAgICAgKiBkb2N1bWVudCdzIHdpbmRvdyAoc3VjaCBhcyBzY3JvbGwgYmFycyBhbmQgbmF2aWdhdGlvbiBjb250cm9scyksIGxlYXZpbmdcbiAgICAgKiBvbmx5IHRoZSBkb2N1bWVudCdzIGNvbnRlbnRzIGRpc3BsYXllZC5cbiAgICAgKiBAcGFyYW0gaGlkZVdpbmRvd1VJIGB0cnVlYCBpZiB0aGUgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0SGlkZVdpbmRvd1VJID0gZnVuY3Rpb24gKGhpZGVXaW5kb3dVSSkge1xuICAgICAgICB2YXIgSGlkZVdpbmRvd1VJID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGhpZGVXaW5kb3dVSSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignSGlkZVdpbmRvd1VJJyksIEhpZGVXaW5kb3dVSSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIHJlYWRlciBzaG91bGQgcmVzaXplIHRoZSBkb2N1bWVudCdzIHdpbmRvdyB0byBmaXRcbiAgICAgKiB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgZGlzcGxheWVkIHBhZ2UuXG4gICAgICogQHBhcmFtIGZpdFdpbmRvdyBgdHJ1ZWAgaWYgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXplZC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0Rml0V2luZG93ID0gZnVuY3Rpb24gKGZpdFdpbmRvdykge1xuICAgICAgICB2YXIgRml0V2luZG93ID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGZpdFdpbmRvdyk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRml0V2luZG93JyksIEZpdFdpbmRvdyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIHJlYWRlciBzaG91bGQgcG9zaXRpb24gdGhlIGRvY3VtZW50J3Mgd2luZG93IGluIHRoZVxuICAgICAqIGNlbnRlciBvZiB0aGUgc2NyZWVuLlxuICAgICAqIEBwYXJhbSBjZW50ZXJXaW5kb3cgYHRydWVgIGlmIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGNlbnRlcmVkLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRDZW50ZXJXaW5kb3cgPSBmdW5jdGlvbiAoY2VudGVyV2luZG93KSB7XG4gICAgICAgIHZhciBDZW50ZXJXaW5kb3cgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooY2VudGVyV2luZG93KTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdDZW50ZXJXaW5kb3cnKSwgQ2VudGVyV2luZG93KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB3aGV0aGVyIHRoZSB3aW5kb3cncyB0aXRsZSBiYXIgc2hvdWxkIGRpc3BsYXkgdGhlIGRvY3VtZW50IGBUaXRsZWBcbiAgICAgKiB0YWtlbiBmcm9tIHRoZSBkb2N1bWVudCBtZXRhZGF0YSAoc2VlIFtbUERGRG9jdW1lbnQuc2V0VGl0bGVdXSkuIElmXG4gICAgICogYGZhbHNlYCwgdGhlIHRpdGxlIGJhciBzaG91bGQgaW5zdGVhZCBkaXNwbGF5IHRoZSBQREYgZmlsZW5hbWUuXG4gICAgICogQHBhcmFtIGRpc3BsYXlUaXRsZSBgdHJ1ZWAgaWYgdGhlIGRvY3VtZW50IHRpdGxlIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldERpc3BsYXlEb2NUaXRsZSA9IGZ1bmN0aW9uIChkaXNwbGF5VGl0bGUpIHtcbiAgICAgICAgdmFyIERpc3BsYXlEb2NUaXRsZSA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihkaXNwbGF5VGl0bGUpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0Rpc3BsYXlEb2NUaXRsZScpLCBEaXNwbGF5RG9jVGl0bGUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIGhvdyB0aGUgUERGIHJlYWRlciBzaG91bGQgZGlzcGxheSB0aGUgZG9jdW1lbnQgdXBvbiBleGl0aW5nXG4gICAgICogZnVsbC1zY3JlZW4gbW9kZS4gVGhpcyBlbnRyeSBpcyBtZWFuaW5nZnVsIG9ubHkgaWYgdGhlIHZhbHVlIG9mIHRoZVxuICAgICAqIGBQYWdlTW9kZWAgZW50cnkgaW4gdGhlIGRvY3VtZW50J3MgW1tQREZDYXRhbG9nXV0gaXMgYEZ1bGxTY3JlZW5gLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCwgTm9uRnVsbFNjcmVlblBhZ2VNb2RlLCBQREZOYW1lIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICpcbiAgICAgKiAvLyBTZXQgdGhlIFBhZ2VNb2RlXG4gICAgICogcGRmRG9jLmNhdGFsb2cuc2V0KFBERk5hbWUub2YoJ1BhZ2VNb2RlJyksUERGTmFtZS5vZignRnVsbFNjcmVlbicpKVxuICAgICAqXG4gICAgICogLy8gU2V0IHdoYXQgaGFwcGVucyB3aGVuIGZ1bGwtc2NyZWVuIGlzIGNsb3NlZFxuICAgICAqIGNvbnN0IHZpZXdlclByZWZzID0gcGRmRG9jLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpXG4gICAgICogdmlld2VyUHJlZnMuc2V0Tm9uRnVsbFNjcmVlblBhZ2VNb2RlKE5vbkZ1bGxTY3JlZW5QYWdlTW9kZS5Vc2VPdXRsaW5lcylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBub25GdWxsU2NyZWVuUGFnZU1vZGUgSG93IHRoZSBkb2N1bWVudCBzaG91bGQgYmUgZGlzcGxheWVkIHVwb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRpbmcgZnVsbCBzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0Tm9uRnVsbFNjcmVlblBhZ2VNb2RlID0gZnVuY3Rpb24gKG5vbkZ1bGxTY3JlZW5QYWdlTW9kZSkge1xuICAgICAgICBhc3NlcnRJc09uZU9mKG5vbkZ1bGxTY3JlZW5QYWdlTW9kZSwgJ25vbkZ1bGxTY3JlZW5QYWdlTW9kZScsIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSk7XG4gICAgICAgIHZhciBtb2RlID0gUERGTmFtZS5vZihub25GdWxsU2NyZWVuUGFnZU1vZGUpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ05vbkZ1bGxTY3JlZW5QYWdlTW9kZScpLCBtb2RlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB0aGUgcHJlZG9taW5hbnQgcmVhZGluZyBvcmRlciBmb3IgdGV4dC5cbiAgICAgKlxuICAgICAqIFRoaXMgZW50cnkgaGFzIG5vIGRpcmVjdCBlZmZlY3Qgb24gdGhlIGRvY3VtZW50J3MgY29udGVudHMgb3IgcGFnZVxuICAgICAqIG51bWJlcmluZywgYnV0IG1heSBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgcGFnZXNcbiAgICAgKiB3aGVuIGRpc3BsYXllZCBzaWRlIGJ5IHNpZGUgb3IgcHJpbnRlZCBuLXVwLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCwgUmVhZGluZ0RpcmVjdGlvbiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHZpZXdlclByZWZzID0gcGRmRG9jLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpXG4gICAgICogdmlld2VyUHJlZnMuc2V0UmVhZGluZ0RpcmVjdGlvbihSZWFkaW5nRGlyZWN0aW9uLlIyTClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFkaW5nRGlyZWN0aW9uIFRoZSByZWFkaW5nIG9yZGVyIGZvciB0ZXh0LlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRSZWFkaW5nRGlyZWN0aW9uID0gZnVuY3Rpb24gKHJlYWRpbmdEaXJlY3Rpb24pIHtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZihyZWFkaW5nRGlyZWN0aW9uLCAncmVhZGluZ0RpcmVjdGlvbicsIFJlYWRpbmdEaXJlY3Rpb24pO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gUERGTmFtZS5vZihyZWFkaW5nRGlyZWN0aW9uKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdEaXJlY3Rpb24nKSwgZGlyZWN0aW9uKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB0aGUgcGFnZSBzY2FsaW5nIG9wdGlvbiB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGEgcHJpbnQgZGlhbG9nXG4gICAgICogaXMgZGlzcGxheWVkIGZvciB0aGlzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCwgUHJpbnRTY2FsaW5nIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3Qgdmlld2VyUHJlZnMgPSBwZGZEb2MuY2F0YWxvZy5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzKClcbiAgICAgKiB2aWV3ZXJQcmVmcy5zZXRQcmludFNjYWxpbmcoUHJpbnRTY2FsaW5nLk5vbmUpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJpbnRTY2FsaW5nIFRoZSBwcmludCBzY2FsaW5nIG9wdGlvbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0UHJpbnRTY2FsaW5nID0gZnVuY3Rpb24gKHByaW50U2NhbGluZykge1xuICAgICAgICBhc3NlcnRJc09uZU9mKHByaW50U2NhbGluZywgJ3ByaW50U2NhbGluZycsIFByaW50U2NhbGluZyk7XG4gICAgICAgIHZhciBzY2FsaW5nID0gUERGTmFtZS5vZihwcmludFNjYWxpbmcpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1ByaW50U2NhbGluZycpLCBzY2FsaW5nKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB0aGUgcGFwZXIgaGFuZGxpbmcgb3B0aW9uIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgaW4gdGhlXG4gICAgICogcHJpbnQgZGlhbG9nLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCwgRHVwbGV4IH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3Qgdmlld2VyUHJlZnMgPSBwZGZEb2MuY2F0YWxvZy5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzKClcbiAgICAgKiB2aWV3ZXJQcmVmcy5zZXREdXBsZXgoRHVwbGV4LkR1cGxleEZsaXBTaG9ydEVkZ2UpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZHVwbGV4IFRoZSBkb3VibGUgb3Igc2luZ2xlIHNpZGVkIHByaW50aW5nIG9wdGlvbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0RHVwbGV4ID0gZnVuY3Rpb24gKGR1cGxleCkge1xuICAgICAgICBhc3NlcnRJc09uZU9mKGR1cGxleCwgJ2R1cGxleCcsIER1cGxleCk7XG4gICAgICAgIHZhciBkdXAgPSBQREZOYW1lLm9mKGR1cGxleCk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRHVwbGV4JyksIGR1cCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIGRvY3VtZW50J3MgcGFnZSBzaXplIHNob3VsZCBiZSB1c2VkIHRvIHNlbGVjdCB0aGVcbiAgICAgKiBpbnB1dCBwYXBlciB0cmF5IHdoZW4gcHJpbnRpbmcuIFRoaXMgc2V0dGluZyBpbmZsdWVuY2VzIG9ubHkgdGhlIHByZXNldFxuICAgICAqIHZhbHVlcyB1c2VkIHRvIHBvcHVsYXRlIHRoZSBwcmludCBkaWFsb2cgcHJlc2VudGVkIGJ5IGEgUERGIHJlYWRlci5cbiAgICAgKlxuICAgICAqIElmIFBpY2tUcmF5QnlQREZTaXplIGlzIHRydWUsIHRoZSBjaGVjayBib3ggaW4gdGhlIHByaW50IGRpYWxvZyBhc3NvY2lhdGVkXG4gICAgICogd2l0aCBpbnB1dCBwYXBlciB0cmF5IHNob3VsZCBiZSBjaGVja2VkLiBUaGlzIHNldHRpbmcgaGFzIG5vIGVmZmVjdCBvblxuICAgICAqIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gcGljayB0aGUgaW5wdXQgdHJheVxuICAgICAqIGJ5IHNpemUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGlja1RyYXlCeVBERlNpemUgYHRydWVgIGlmIHRoZSBkb2N1bWVudCdzIHBhZ2Ugc2l6ZSBzaG91bGQgYmUgdXNlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZWxlY3QgdGhlIGlucHV0IHBhcGVyIHRyYXkuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldFBpY2tUcmF5QnlQREZTaXplID0gZnVuY3Rpb24gKHBpY2tUcmF5QnlQREZTaXplKSB7XG4gICAgICAgIHZhciBQaWNrVHJheUJ5UERGU2l6ZSA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihwaWNrVHJheUJ5UERGU2l6ZSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUGlja1RyYXlCeVBERlNpemUnKSwgUGlja1RyYXlCeVBERlNpemUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHRoZSBwYWdlIG51bWJlcnMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwcmludCBkaWFsb2cgYm94IHdoZW4gdGhlXG4gICAgICogZmlsZSBpcyBwcmludGVkLiBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgUERGIGZpbGUgaXMgZGVub3RlZCBieSAwLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHZpZXdlclByZWZzID0gcGRmRG9jLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpXG4gICAgICpcbiAgICAgKiAvLyBXZSBjYW4gc2V0IHRoZSBkZWZhdWx0IHByaW50IHJhbmdlIHRvIG9ubHkgdGhlIGZpcnN0IHBhZ2VcbiAgICAgKiB2aWV3ZXJQcmVmcy5zZXRQcmludFBhZ2VSYW5nZSh7IHN0YXJ0OiAwLCBlbmQ6IDAgfSlcbiAgICAgKlxuICAgICAqIC8vIE9yIHdlIGNhbiBzdXBwbHkgbm9uY29udGlndW91cyByYW5nZXMgKGUuZy4gcGFnZXMgMSwgMywgYW5kIDUtNylcbiAgICAgKiB2aWV3ZXJQcmVmcy5zZXRQcmludFBhZ2VSYW5nZShbXG4gICAgICogICB7IHN0YXJ0OiAwLCBlbmQ6IDAgfSxcbiAgICAgKiAgIHsgc3RhcnQ6IDIsIGVuZDogMiB9LFxuICAgICAqICAgeyBzdGFydDogNCwgZW5kOiA2IH0sXG4gICAgICogXSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcmludFBhZ2VSYW5nZSBBbiBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cywgZWFjaCB3aXRoIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIGBzdGFydGAgYW5kIGBlbmRgLCBkZW5vdGluZyBhIHJhbmdlIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgaW5kaWNlcy5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0UHJpbnRQYWdlUmFuZ2UgPSBmdW5jdGlvbiAocHJpbnRQYWdlUmFuZ2UpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByaW50UGFnZVJhbmdlKSlcbiAgICAgICAgICAgIHByaW50UGFnZVJhbmdlID0gW3ByaW50UGFnZVJhbmdlXTtcbiAgICAgICAgdmFyIGZsYXRSYW5nZSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBwcmludFBhZ2VSYW5nZS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGZsYXRSYW5nZS5wdXNoKHByaW50UGFnZVJhbmdlW2lkeF0uc3RhcnQpO1xuICAgICAgICAgICAgZmxhdFJhbmdlLnB1c2gocHJpbnRQYWdlUmFuZ2VbaWR4XS5lbmQpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydEVhY2hJcyhmbGF0UmFuZ2UsICdwcmludFBhZ2VSYW5nZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgcGFnZVJhbmdlcyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihmbGF0UmFuZ2UpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1ByaW50UGFnZVJhbmdlJyksIHBhZ2VSYW5nZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHRoZSBkZWZhdWx0IG51bWJlciBvZiBjb3BpZXMgdG8gYmUgcHJpbnRlZCB3aGVuIHRoZSBwcmludCBkaWFsb2cgaXNcbiAgICAgKiBvcGVuZWQgZm9yIHRoaXMgZmlsZS5cbiAgICAgKiBAcGFyYW0gbnVtQ29waWVzIFRoZSBkZWZhdWx0IG51bWJlciBvZiBjb3BpZXMuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldE51bUNvcGllcyA9IGZ1bmN0aW9uIChudW1Db3BpZXMpIHtcbiAgICAgICAgYXNzZXJ0UmFuZ2UobnVtQ29waWVzLCAnbnVtQ29waWVzJywgMSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIGFzc2VydEludGVnZXIobnVtQ29waWVzLCAnbnVtQ29waWVzJyk7XG4gICAgICAgIHZhciBOdW1Db3BpZXMgPSB0aGlzLmRpY3QuY29udGV4dC5vYmoobnVtQ29waWVzKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdOdW1Db3BpZXMnKSwgTnVtQ29waWVzKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMuZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCkge1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdlclByZWZlcmVuY2VzKGRpY3QpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3ZXJQcmVmZXJlbmNlcyhkaWN0KTtcbiAgICB9O1xuICAgIHJldHVybiBWaWV3ZXJQcmVmZXJlbmNlcztcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBWaWV3ZXJQcmVmZXJlbmNlcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZXdlclByZWZlcmVuY2VzLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcywgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4vUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkFycmF5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBcnJheSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBcnJheShjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmFycmF5ID0gW107XG4gICAgICAgIF90aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkFycmF5LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJheS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgdGhpcy5hcnJheS5wdXNoKG9iamVjdCk7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKGluZGV4LCBvYmplY3QpIHtcbiAgICAgICAgdGhpcy5hcnJheS5zcGxpY2UoaW5kZXgsIDAsIG9iamVjdCk7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5hcnJheS5pbmRleE9mKG9iamVjdCk7XG4gICAgICAgIHJldHVybiBpbmRleCA9PT0gLTEgPyB1bmRlZmluZWQgOiBpbmRleDtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5hcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChpZHgsIG9iamVjdCkge1xuICAgICAgICB0aGlzLmFycmF5W2lkeF0gPSBvYmplY3Q7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFycmF5W2luZGV4XTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5sb29rdXBNYXliZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0eXBlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdHlwZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuY29udGV4dCkubG9va3VwTWF5YmUuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXlzKFt0aGlzLmdldChpbmRleCldLCB0eXBlcykpO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmxvb2t1cCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0eXBlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdHlwZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuY29udGV4dCkubG9va3VwLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5cyhbdGhpcy5nZXQoaW5kZXgpXSwgdHlwZXMpKTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5hc1JlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSgpICE9PSA0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvcih0aGlzLnNpemUoKSk7XG4gICAgICAgIHZhciBsb3dlckxlZnRYID0gdGhpcy5sb29rdXAoMCwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICB2YXIgbG93ZXJMZWZ0WSA9IHRoaXMubG9va3VwKDEsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgdmFyIHVwcGVyUmlnaHRYID0gdGhpcy5sb29rdXAoMiwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICB2YXIgdXBwZXJSaWdodFkgPSB0aGlzLmxvb2t1cCgzLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIHZhciB4ID0gbG93ZXJMZWZ0WDtcbiAgICAgICAgdmFyIHkgPSBsb3dlckxlZnRZO1xuICAgICAgICB2YXIgd2lkdGggPSB1cHBlclJpZ2h0WCAtIGxvd2VyTGVmdFg7XG4gICAgICAgIHZhciBoZWlnaHQgPSB1cHBlclJpZ2h0WSAtIGxvd2VyTGVmdFk7XG4gICAgICAgIHJldHVybiB7IHg6IHgsIHk6IHksIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5hc0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJheS5zbGljZSgpO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNsb25lID0gUERGQXJyYXkud2l0aENvbnRleHQoY29udGV4dCB8fCB0aGlzLmNvbnRleHQpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgY2xvbmUucHVzaCh0aGlzLmFycmF5W2lkeF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5U3RyaW5nID0gJ1sgJztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGFycmF5U3RyaW5nICs9IHRoaXMuZ2V0KGlkeCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGFycmF5U3RyaW5nICs9ICcgJztcbiAgICAgICAgfVxuICAgICAgICBhcnJheVN0cmluZyArPSAnXSc7XG4gICAgICAgIHJldHVybiBhcnJheVN0cmluZztcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNpemUgPSAzO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgc2l6ZSArPSB0aGlzLmdldChpZHgpLnNpemVJbkJ5dGVzKCkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTGVmdFNxdWFyZUJyYWNrZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdGhpcy5nZXQoaWR4KS5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5SaWdodFNxdWFyZUJyYWNrZXQ7XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLnNjYWxlUERGTnVtYmVycyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgUERGTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZhY3RvciA9IGlkeCAlIDIgPT09IDAgPyB4IDogeTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChpZHgsIFBERk51bWJlci5vZihlbC5hc051bWJlcigpICogZmFjdG9yKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkFycmF5LndpdGhDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQpIHsgcmV0dXJuIG5ldyBQREZBcnJheShjb250ZXh0KTsgfTtcbiAgICByZXR1cm4gUERGQXJyYXk7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQXJyYXk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBcnJheS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbnZhciBFTkZPUkNFUiA9IHt9O1xudmFyIFBERkJvb2wgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkJvb2wsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQm9vbChlbmZvcmNlciwgdmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKGVuZm9yY2VyICE9PSBFTkZPUkNFUilcbiAgICAgICAgICAgIHRocm93IG5ldyBQcml2YXRlQ29uc3RydWN0b3JFcnJvcignUERGQm9vbCcpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGQm9vbC5wcm90b3R5cGUuYXNCb29sZWFuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFBERkJvb2wucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFBERkJvb2wucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgUERGQm9vbC5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlID8gNCA6IDU7XG4gICAgfTtcbiAgICBQREZCb29sLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnQ7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnU7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZjtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuYTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubDtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucztcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgICAgIHJldHVybiA1O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZCb29sLlRydWUgPSBuZXcgUERGQm9vbChFTkZPUkNFUiwgdHJ1ZSk7XG4gICAgUERGQm9vbC5GYWxzZSA9IG5ldyBQREZCb29sKEVORk9SQ0VSLCBmYWxzZSk7XG4gICAgcmV0dXJuIFBERkJvb2w7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQm9vbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkJvb2wuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzLCBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4vUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bGwgZnJvbSBcIi4vUERGTnVsbFwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbnZhciBQREZEaWN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZEaWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkRpY3QobWFwLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmRpY3QgPSBtYXA7XG4gICAgICAgIF90aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkRpY3QucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZGljdC5rZXlzKCkpO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmRpY3QudmFsdWVzKCkpO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5kaWN0LmVudHJpZXMoKSk7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KGtleSwgdmFsdWUpO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSwgXG4gICAgLy8gVE9ETzogYHByZXNlcnZlUERGTnVsbGAgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBTaG91bGQgYmVcbiAgICAvLyByZW1vdmVkIGluIG5leHQgYnJlYWtpbmcgQVBJIGNoYW5nZS5cbiAgICBwcmVzZXJ2ZVBERk51bGwpIHtcbiAgICAgICAgaWYgKHByZXNlcnZlUERGTnVsbCA9PT0gdm9pZCAwKSB7IHByZXNlcnZlUERGTnVsbCA9IGZhbHNlOyB9XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZGljdC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBQREZOdWxsICYmICFwcmVzZXJ2ZVBERk51bGwpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZGljdC5nZXQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IFBERk51bGw7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5sb29rdXBNYXliZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHR5cGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IGBwcmVzZXJ2ZVBERk51bGxgIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gU2hvdWxkIGJlXG4gICAgICAgIC8vIHJlbW92ZWQgaW4gbmV4dCBicmVha2luZyBBUEkgY2hhbmdlLlxuICAgICAgICB2YXIgcHJlc2VydmVQREZOdWxsID0gdHlwZXMuaW5jbHVkZXMoUERGTnVsbCk7XG4gICAgICAgIHZhciB2YWx1ZSA9IChfYSA9IHRoaXMuY29udGV4dCkubG9va3VwTWF5YmUuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXlzKFt0aGlzLmdldChrZXksIHByZXNlcnZlUERGTnVsbCldLCB0eXBlcykpO1xuICAgICAgICBpZiAodmFsdWUgPT09IFBERk51bGwgJiYgIXByZXNlcnZlUERGTnVsbClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmxvb2t1cCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHR5cGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IGBwcmVzZXJ2ZVBERk51bGxgIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gU2hvdWxkIGJlXG4gICAgICAgIC8vIHJlbW92ZWQgaW4gbmV4dCBicmVha2luZyBBUEkgY2hhbmdlLlxuICAgICAgICB2YXIgcHJlc2VydmVQREZOdWxsID0gdHlwZXMuaW5jbHVkZXMoUERGTnVsbCk7XG4gICAgICAgIHZhciB2YWx1ZSA9IChfYSA9IHRoaXMuY29udGV4dCkubG9va3VwLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5cyhbdGhpcy5nZXQoa2V5LCBwcmVzZXJ2ZVBERk51bGwpXSwgdHlwZXMpKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBQREZOdWxsICYmICFwcmVzZXJ2ZVBERk51bGwpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QuZGVsZXRlKGtleSk7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5hc01hcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAodGhpcy5kaWN0KTtcbiAgICB9O1xuICAgIC8qKiBHZW5lcmF0ZSBhIHJhbmRvbSBrZXkgdGhhdCBkb2Vzbid0IGV4aXN0IGluIGN1cnJlbnQga2V5IHNldCAqL1xuICAgIFBERkRpY3QucHJvdG90eXBlLnVuaXF1ZUtleSA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgaWYgKHRhZyA9PT0gdm9pZCAwKSB7IHRhZyA9ICcnOyB9XG4gICAgICAgIHZhciBleGlzdGluZ0tleXMgPSB0aGlzLmtleXMoKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YodGhpcy5jb250ZXh0LmFkZFJhbmRvbVN1ZmZpeCh0YWcsIDEwKSk7XG4gICAgICAgIHdoaWxlIChleGlzdGluZ0tleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAga2V5ID0gUERGTmFtZS5vZih0aGlzLmNvbnRleHQuYWRkUmFuZG9tU3VmZml4KHRhZywgMTApKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgY2xvbmUgPSBQREZEaWN0LndpdGhDb250ZXh0KGNvbnRleHQgfHwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBjbG9uZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaWN0U3RyaW5nID0gJzw8XFxuJztcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBkaWN0U3RyaW5nICs9IGtleS50b1N0cmluZygpICsgJyAnICsgdmFsdWUudG9TdHJpbmcoKSArICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGRpY3RTdHJpbmcgKz0gJz4+JztcbiAgICAgICAgcmV0dXJuIGRpY3RTdHJpbmc7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNpemUgPSA1O1xuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgIHNpemUgKz0ga2V5LnNpemVJbkJ5dGVzKCkgKyB2YWx1ZS5zaXplSW5CeXRlcygpICsgMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTGVzc1RoYW47XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTGVzc1RoYW47XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBvZmZzZXQgKz0ga2V5LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgICAgIG9mZnNldCArPSB2YWx1ZS5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkdyZWF0ZXJUaGFuO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkdyZWF0ZXJUaGFuO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERkRpY3Qud2l0aENvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCkgeyByZXR1cm4gbmV3IFBERkRpY3QobmV3IE1hcCgpLCBjb250ZXh0KTsgfTtcbiAgICBQREZEaWN0LmZyb21NYXBXaXRoQ29udGV4dCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZEaWN0KG1hcCwgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRGljdDtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZEaWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRGljdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciwgdG9IZXhTdHJpbmdPZk1pbkxlbmd0aCwgdXRmMTZEZWNvZGUsIHV0ZjE2RW5jb2RlLCBwZGZEb2NFbmNvZGluZ0RlY29kZSwgcGFyc2VEYXRlLCBoYXNVdGYxNkJPTSwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGSGV4U3RyaW5nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZIZXhTdHJpbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGSGV4U3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5hc0J5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBBcHBlbmQgYSB6ZXJvIGlmIHRoZSBudW1iZXIgb2YgZGlnaXRzIGlzIG9kZC4gU2VlIFBERiBzcGVjIDcuMy40LjNcbiAgICAgICAgdmFyIGhleCA9IHRoaXMudmFsdWUgKyAodGhpcy52YWx1ZS5sZW5ndGggJSAyID09PSAxID8gJzAnIDogJycpO1xuICAgICAgICB2YXIgaGV4TGVuZ3RoID0gaGV4Lmxlbmd0aDtcbiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoaGV4Lmxlbmd0aCAvIDIpO1xuICAgICAgICB2YXIgaGV4T2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIGJ5dGVzT2Zmc2V0ID0gMDtcbiAgICAgICAgLy8gSW50ZXJwcmV0IGVhY2ggcGFpciBvZiBoZXggZGlnaXRzIGFzIGEgc2luZ2xlIGJ5dGVcbiAgICAgICAgd2hpbGUgKGhleE9mZnNldCA8IGhleExlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKGhleE9mZnNldCwgaGV4T2Zmc2V0ICsgMiksIDE2KTtcbiAgICAgICAgICAgIGJ5dGVzW2J5dGVzT2Zmc2V0XSA9IGJ5dGU7XG4gICAgICAgICAgICBoZXhPZmZzZXQgKz0gMjtcbiAgICAgICAgICAgIGJ5dGVzT2Zmc2V0ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5kZWNvZGVUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmFzQnl0ZXMoKTtcbiAgICAgICAgaWYgKGhhc1V0ZjE2Qk9NKGJ5dGVzKSlcbiAgICAgICAgICAgIHJldHVybiB1dGYxNkRlY29kZShieXRlcyk7XG4gICAgICAgIHJldHVybiBwZGZEb2NFbmNvZGluZ0RlY29kZShieXRlcyk7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLmRlY29kZURhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ZXh0ID0gdGhpcy5kZWNvZGVUZXh0KCk7XG4gICAgICAgIHZhciBkYXRlID0gcGFyc2VEYXRlKHRleHQpO1xuICAgICAgICBpZiAoIWRhdGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvcih0ZXh0KTtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLmFzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQREZIZXhTdHJpbmcub2YodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCI8XCIgKyB0aGlzLnZhbHVlICsgXCI+XCI7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGggKyAyO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTGVzc1RoYW47XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLnZhbHVlLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuR3JlYXRlclRoYW47XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmxlbmd0aCArIDI7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcub2YgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIG5ldyBQREZIZXhTdHJpbmcodmFsdWUpOyB9O1xuICAgIFBERkhleFN0cmluZy5mcm9tVGV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgZW5jb2RlZCA9IHV0ZjE2RW5jb2RlKHZhbHVlKTtcbiAgICAgICAgdmFyIGhleCA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbmNvZGVkLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgaGV4ICs9IHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgoZW5jb2RlZFtpZHhdLCA0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFBERkhleFN0cmluZyhoZXgpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkhleFN0cmluZztcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZIZXhTdHJpbmc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZIZXhTdHJpbmcuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xudmFyIFBERkludmFsaWRPYmplY3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkludmFsaWRPYmplY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGSW52YWxpZE9iamVjdChkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkludmFsaWRPYmplY3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUERGSW52YWxpZE9iamVjdC5vZih0aGlzLmRhdGEuc2xpY2UoKSk7XG4gICAgfTtcbiAgICBQREZJbnZhbGlkT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiUERGSW52YWxpZE9iamVjdChcIiArIHRoaXMuZGF0YS5sZW5ndGggKyBcIiBieXRlcylcIjtcbiAgICB9O1xuICAgIFBERkludmFsaWRPYmplY3QucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERkludmFsaWRPYmplY3QucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSB0aGlzLmRhdGFbaWR4XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH07XG4gICAgUERGSW52YWxpZE9iamVjdC5vZiA9IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBuZXcgUERGSW52YWxpZE9iamVjdChkYXRhKTsgfTtcbiAgICByZXR1cm4gUERGSW52YWxpZE9iamVjdDtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZJbnZhbGlkT2JqZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGSW52YWxpZE9iamVjdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IElzSXJyZWd1bGFyIH0gZnJvbSBcIi4uL3N5bnRheC9JcnJlZ3VsYXJcIjtcbmltcG9ydCB7IGNoYXJGcm9tSGV4Q29kZSwgY29weVN0cmluZ0ludG9CdWZmZXIsIHRvQ2hhckNvZGUsIHRvSGV4U3RyaW5nLCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIGRlY29kZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoLyMoW1xcZEFCQ0RFRl17Mn0pL2csIGZ1bmN0aW9uIChfLCBoZXgpIHsgcmV0dXJuIGNoYXJGcm9tSGV4Q29kZShoZXgpOyB9KTtcbn07XG52YXIgaXNSZWd1bGFyQ2hhciA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICAgIHJldHVybiBjaGFyQ29kZSA+PSBDaGFyQ29kZXMuRXhjbGFtYXRpb25Qb2ludCAmJlxuICAgICAgICBjaGFyQ29kZSA8PSBDaGFyQ29kZXMuVGlsZGUgJiZcbiAgICAgICAgIUlzSXJyZWd1bGFyW2NoYXJDb2RlXTtcbn07XG52YXIgRU5GT1JDRVIgPSB7fTtcbnZhciBwb29sID0gbmV3IE1hcCgpO1xudmFyIFBERk5hbWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk5hbWUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGTmFtZShlbmZvcmNlciwgbmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZW5mb3JjZXIgIT09IEVORk9SQ0VSKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yKCdQREZOYW1lJyk7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgdmFyIGVuY29kZWROYW1lID0gJy8nO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBuYW1lLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNoYXJhY3RlciA9IG5hbWVbaWR4XTtcbiAgICAgICAgICAgIHZhciBjb2RlID0gdG9DaGFyQ29kZShjaGFyYWN0ZXIpO1xuICAgICAgICAgICAgZW5jb2RlZE5hbWUgKz0gaXNSZWd1bGFyQ2hhcihjb2RlKSA/IGNoYXJhY3RlciA6IFwiI1wiICsgdG9IZXhTdHJpbmcoY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMuZW5jb2RlZE5hbWUgPSBlbmNvZGVkTmFtZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZOYW1lLnByb3RvdHlwZS5hc0J5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZXMgPSBbXTtcbiAgICAgICAgdmFyIGhleCA9ICcnO1xuICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgcHVzaEJ5dGUgPSBmdW5jdGlvbiAoYnl0ZSkge1xuICAgICAgICAgICAgaWYgKGJ5dGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBieXRlcy5wdXNoKGJ5dGUpO1xuICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAxLCBsZW4gPSB0aGlzLmVuY29kZWROYW1lLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNoYXIgPSB0aGlzLmVuY29kZWROYW1lW2lkeF07XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRvQ2hhckNvZGUoY2hhcik7XG4gICAgICAgICAgICB2YXIgbmV4dENoYXIgPSB0aGlzLmVuY29kZWROYW1lW2lkeCArIDFdO1xuICAgICAgICAgICAgaWYgKCFlc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5IYXNoKVxuICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKGJ5dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKChieXRlID49IENoYXJDb2Rlcy5aZXJvICYmIGJ5dGUgPD0gQ2hhckNvZGVzLk5pbmUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChieXRlID49IENoYXJDb2Rlcy5hICYmIGJ5dGUgPD0gQ2hhckNvZGVzLmYpIHx8XG4gICAgICAgICAgICAgICAgICAgIChieXRlID49IENoYXJDb2Rlcy5BICYmIGJ5dGUgPD0gQ2hhckNvZGVzLkYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhleCArPSBjaGFyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgISgobmV4dENoYXIgPj0gJzAnICYmIG5leHRDaGFyIDw9ICc5JykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dENoYXIgPj0gJ2EnICYmIG5leHRDaGFyIDw9ICdmJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dENoYXIgPj0gJ0EnICYmIG5leHRDaGFyIDw9ICdGJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShwYXJzZUludChoZXgsIDE2KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZXggPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoYnl0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShieXRlcyk7XG4gICAgfTtcbiAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgYHV0ZjhEZWNvZGUoKWBcbiAgICAvLyBUT0RPOiBQb2x5ZmlsbCBBcnJheS5mcm9tP1xuICAgIFBERk5hbWUucHJvdG90eXBlLmRlY29kZVRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBieXRlcyA9IHRoaXMuYXNCeXRlcygpO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIEFycmF5LmZyb20oYnl0ZXMpKTtcbiAgICB9O1xuICAgIFBERk5hbWUucHJvdG90eXBlLmFzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVkTmFtZTtcbiAgICB9O1xuICAgIC8qKiBAZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBbW1BERk5hbWUuYXNTdHJpbmddXSAqL1xuICAgIFBERk5hbWUucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVkTmFtZTtcbiAgICB9O1xuICAgIFBERk5hbWUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFBERk5hbWUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVkTmFtZTtcbiAgICB9O1xuICAgIFBERk5hbWUucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVkTmFtZS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZOYW1lLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLmVuY29kZWROYW1lLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLmVuY29kZWROYW1lLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERk5hbWUub2YgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgZGVjb2RlZFZhbHVlID0gZGVjb2RlTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gcG9vbC5nZXQoZGVjb2RlZFZhbHVlKTtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgUERGTmFtZShFTkZPUkNFUiwgZGVjb2RlZFZhbHVlKTtcbiAgICAgICAgICAgIHBvb2wuc2V0KGRlY29kZWRWYWx1ZSwgaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICAgIC8qIHRzbGludDpkaXNhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuICAgIFBERk5hbWUuTGVuZ3RoID0gUERGTmFtZS5vZignTGVuZ3RoJyk7XG4gICAgUERGTmFtZS5GbGF0ZURlY29kZSA9IFBERk5hbWUub2YoJ0ZsYXRlRGVjb2RlJyk7XG4gICAgUERGTmFtZS5SZXNvdXJjZXMgPSBQREZOYW1lLm9mKCdSZXNvdXJjZXMnKTtcbiAgICBQREZOYW1lLkZvbnQgPSBQREZOYW1lLm9mKCdGb250Jyk7XG4gICAgUERGTmFtZS5YT2JqZWN0ID0gUERGTmFtZS5vZignWE9iamVjdCcpO1xuICAgIFBERk5hbWUuRXh0R1N0YXRlID0gUERGTmFtZS5vZignRXh0R1N0YXRlJyk7XG4gICAgUERGTmFtZS5Db250ZW50cyA9IFBERk5hbWUub2YoJ0NvbnRlbnRzJyk7XG4gICAgUERGTmFtZS5UeXBlID0gUERGTmFtZS5vZignVHlwZScpO1xuICAgIFBERk5hbWUuUGFyZW50ID0gUERGTmFtZS5vZignUGFyZW50Jyk7XG4gICAgUERGTmFtZS5NZWRpYUJveCA9IFBERk5hbWUub2YoJ01lZGlhQm94Jyk7XG4gICAgUERGTmFtZS5QYWdlID0gUERGTmFtZS5vZignUGFnZScpO1xuICAgIFBERk5hbWUuQW5ub3RzID0gUERGTmFtZS5vZignQW5ub3RzJyk7XG4gICAgUERGTmFtZS5UcmltQm94ID0gUERGTmFtZS5vZignVHJpbUJveCcpO1xuICAgIFBERk5hbWUuQXJ0Qm94ID0gUERGTmFtZS5vZignQXJ0Qm94Jyk7XG4gICAgUERGTmFtZS5CbGVlZEJveCA9IFBERk5hbWUub2YoJ0JsZWVkQm94Jyk7XG4gICAgUERGTmFtZS5Dcm9wQm94ID0gUERGTmFtZS5vZignQ3JvcEJveCcpO1xuICAgIFBERk5hbWUuUm90YXRlID0gUERGTmFtZS5vZignUm90YXRlJyk7XG4gICAgUERGTmFtZS5UaXRsZSA9IFBERk5hbWUub2YoJ1RpdGxlJyk7XG4gICAgUERGTmFtZS5BdXRob3IgPSBQREZOYW1lLm9mKCdBdXRob3InKTtcbiAgICBQREZOYW1lLlN1YmplY3QgPSBQREZOYW1lLm9mKCdTdWJqZWN0Jyk7XG4gICAgUERGTmFtZS5DcmVhdG9yID0gUERGTmFtZS5vZignQ3JlYXRvcicpO1xuICAgIFBERk5hbWUuS2V5d29yZHMgPSBQREZOYW1lLm9mKCdLZXl3b3JkcycpO1xuICAgIFBERk5hbWUuUHJvZHVjZXIgPSBQREZOYW1lLm9mKCdQcm9kdWNlcicpO1xuICAgIFBERk5hbWUuQ3JlYXRpb25EYXRlID0gUERGTmFtZS5vZignQ3JlYXRpb25EYXRlJyk7XG4gICAgUERGTmFtZS5Nb2REYXRlID0gUERGTmFtZS5vZignTW9kRGF0ZScpO1xuICAgIHJldHVybiBQREZOYW1lO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk5hbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZOYW1lLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbnZhciBQREZOdWxsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZOdWxsLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk51bGwoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGTnVsbC5wcm90b3R5cGUuYXNOdWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFBERk51bGwucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFBERk51bGwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIH07XG4gICAgUERGTnVsbC5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiA0O1xuICAgIH07XG4gICAgUERGTnVsbC5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm47XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMudTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5sO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmw7XG4gICAgICAgIHJldHVybiA0O1xuICAgIH07XG4gICAgcmV0dXJuIFBERk51bGw7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgbmV3IFBERk51bGwoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk51bGwuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciwgbnVtYmVyVG9TdHJpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG52YXIgUERGTnVtYmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZOdW1iZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGTnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm51bWJlclZhbHVlID0gdmFsdWU7XG4gICAgICAgIF90aGlzLnN0cmluZ1ZhbHVlID0gbnVtYmVyVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERk51bWJlci5wcm90b3R5cGUuYXNOdW1iZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlclZhbHVlO1xuICAgIH07XG4gICAgLyoqIEBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFtbUERGTnVtYmVyLmFzTnVtYmVyXV0gKi9cbiAgICBQREZOdW1iZXIucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXJWYWx1ZTtcbiAgICB9O1xuICAgIFBERk51bWJlci5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQREZOdW1iZXIub2YodGhpcy5udW1iZXJWYWx1ZSk7XG4gICAgfTtcbiAgICBQREZOdW1iZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdWYWx1ZTtcbiAgICB9O1xuICAgIFBERk51bWJlci5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ1ZhbHVlLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERk51bWJlci5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5zdHJpbmdWYWx1ZSwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdWYWx1ZS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZOdW1iZXIub2YgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIG5ldyBQREZOdW1iZXIodmFsdWUpOyB9O1xuICAgIHJldHVybiBQREZOdW1iZXI7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGTnVtYmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGTnVtYmVyLmpzLm1hcCIsImltcG9ydCB7IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGT2JqZWN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERk9iamVjdCgpIHtcbiAgICB9XG4gICAgUERGT2JqZWN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChfY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdjbG9uZScpO1xuICAgIH07XG4gICAgUERGT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAndG9TdHJpbmcnKTtcbiAgICB9O1xuICAgIFBERk9iamVjdC5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ3NpemVJbkJ5dGVzJyk7XG4gICAgfTtcbiAgICBQREZPYmplY3QucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoX2J1ZmZlciwgX29mZnNldCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdjb3B5Qnl0ZXNJbnRvJyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGT2JqZWN0O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9iamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9iamVjdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4vUERGU3RyZWFtXCI7XG5pbXBvcnQgeyBhcnJheUFzU3RyaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGUmF3U3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZSYXdTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUmF3U3RyZWFtKGRpY3QsIGNvbnRlbnRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRpY3QpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNvbnRlbnRzID0gY29udGVudHM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGUmF3U3RyZWFtLnByb3RvdHlwZS5hc1VpbnQ4QXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzLnNsaWNlKCk7XG4gICAgfTtcbiAgICBQREZSYXdTdHJlYW0ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIFBERlJhd1N0cmVhbS5vZih0aGlzLmRpY3QuY2xvbmUoY29udGV4dCksIHRoaXMuY29udGVudHMuc2xpY2UoKSk7XG4gICAgfTtcbiAgICBQREZSYXdTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJyYXlBc1N0cmluZyh0aGlzLmNvbnRlbnRzKTtcbiAgICB9O1xuICAgIFBERlJhd1N0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzO1xuICAgIH07XG4gICAgUERGUmF3U3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERlJhd1N0cmVhbS5vZiA9IGZ1bmN0aW9uIChkaWN0LCBjb250ZW50cykge1xuICAgICAgICByZXR1cm4gbmV3IFBERlJhd1N0cmVhbShkaWN0LCBjb250ZW50cyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGUmF3U3RyZWFtO1xufShQREZTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IFBERlJhd1N0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlJhd1N0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgRU5GT1JDRVIgPSB7fTtcbnZhciBwb29sID0gbmV3IE1hcCgpO1xudmFyIFBERlJlZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUmVmLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlJlZihlbmZvcmNlciwgb2JqZWN0TnVtYmVyLCBnZW5lcmF0aW9uTnVtYmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbmZvcmNlciAhPT0gRU5GT1JDRVIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IoJ1BERlJlZicpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9iamVjdE51bWJlciA9IG9iamVjdE51bWJlcjtcbiAgICAgICAgX3RoaXMuZ2VuZXJhdGlvbk51bWJlciA9IGdlbmVyYXRpb25OdW1iZXI7XG4gICAgICAgIF90aGlzLnRhZyA9IG9iamVjdE51bWJlciArIFwiIFwiICsgZ2VuZXJhdGlvbk51bWJlciArIFwiIFJcIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZSZWYucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFBERlJlZi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZztcbiAgICB9O1xuICAgIFBERlJlZi5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZy5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZSZWYucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMudGFnLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZy5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZSZWYub2YgPSBmdW5jdGlvbiAob2JqZWN0TnVtYmVyLCBnZW5lcmF0aW9uTnVtYmVyKSB7XG4gICAgICAgIGlmIChnZW5lcmF0aW9uTnVtYmVyID09PSB2b2lkIDApIHsgZ2VuZXJhdGlvbk51bWJlciA9IDA7IH1cbiAgICAgICAgdmFyIHRhZyA9IG9iamVjdE51bWJlciArIFwiIFwiICsgZ2VuZXJhdGlvbk51bWJlciArIFwiIFJcIjtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gcG9vbC5nZXQodGFnKTtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgUERGUmVmKEVORk9SQ0VSLCBvYmplY3ROdW1iZXIsIGdlbmVyYXRpb25OdW1iZXIpO1xuICAgICAgICAgICAgcG9vbC5zZXQodGFnLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlJlZjtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZSZWY7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZSZWYuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4vUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgUERGU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGU3RyZWFtKGRpY3QpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZGljdCA9IGRpY3Q7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChfY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdjbG9uZScpO1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnZ2V0Q29udGVudHNTdHJpbmcnKTtcbiAgICB9O1xuICAgIFBERlN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2dldENvbnRlbnRzJyk7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnZ2V0Q29udGVudHNTaXplJyk7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLnVwZGF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb250ZW50c1NpemUgPSB0aGlzLmdldENvbnRlbnRzU2l6ZSgpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUuTGVuZ3RoLCBQREZOdW1iZXIub2YoY29udGVudHNTaXplKSk7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZURpY3QoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5zaXplSW5CeXRlcygpICsgdGhpcy5nZXRDb250ZW50c1NpemUoKSArIDE4O1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEaWN0KCk7XG4gICAgICAgIHZhciBzdHJlYW1TdHJpbmcgPSB0aGlzLmRpY3QudG9TdHJpbmcoKTtcbiAgICAgICAgc3RyZWFtU3RyaW5nICs9ICdcXG5zdHJlYW1cXG4nO1xuICAgICAgICBzdHJlYW1TdHJpbmcgKz0gdGhpcy5nZXRDb250ZW50c1N0cmluZygpO1xuICAgICAgICBzdHJlYW1TdHJpbmcgKz0gJ1xcbmVuZHN0cmVhbSc7XG4gICAgICAgIHJldHVybiBzdHJlYW1TdHJpbmc7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEaWN0KCk7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBvZmZzZXQgKz0gdGhpcy5kaWN0LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucztcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5hO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm07XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgdmFyIGNvbnRlbnRzID0gdGhpcy5nZXRDb250ZW50cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBjb250ZW50cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBjb250ZW50c1tpZHhdO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm47XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5zO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmE7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICByZXR1cm4gUERGU3RyZWFtO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciwgcGFkU3RhcnQsIHV0ZjE2RGVjb2RlLCBwZGZEb2NFbmNvZGluZ0RlY29kZSwgdG9DaGFyQ29kZSwgcGFyc2VEYXRlLCBoYXNVdGYxNkJPTSwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGU3RyaW5nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZTdHJpbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5hc0J5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZXMgPSBbXTtcbiAgICAgICAgdmFyIG9jdGFsID0gJyc7XG4gICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgIHZhciBwdXNoQnl0ZSA9IGZ1bmN0aW9uIChieXRlKSB7XG4gICAgICAgICAgICBpZiAoYnl0ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGJ5dGVzLnB1c2goYnl0ZSk7XG4gICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMudmFsdWUubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgY2hhciA9IHRoaXMudmFsdWVbaWR4XTtcbiAgICAgICAgICAgIHZhciBieXRlID0gdG9DaGFyQ29kZShjaGFyKTtcbiAgICAgICAgICAgIHZhciBuZXh0Q2hhciA9IHRoaXMudmFsdWVbaWR4ICsgMV07XG4gICAgICAgICAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkJhY2tTbGFzaClcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShieXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTmV3bGluZSlcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMuQ2FycmlhZ2VSZXR1cm4pXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLm4pXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5OZXdsaW5lKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMucilcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLkNhcnJpYWdlUmV0dXJuKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMudClcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLlRhYik7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLmIpXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5CYWNrc3BhY2UpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5mKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuRm9ybUZlZWQpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5MZWZ0UGFyZW4pXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5MZWZ0UGFyZW4pO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5SaWdodFBhcmVuKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuUmlnaHRQYXJlbik7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkJhY2tzcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLkJhY2tTbGFzaCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA+PSBDaGFyQ29kZXMuWmVybyAmJiBieXRlIDw9IENoYXJDb2Rlcy5TZXZlbikge1xuICAgICAgICAgICAgICAgICAgICBvY3RhbCArPSBjaGFyO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2N0YWwubGVuZ3RoID09PSAzIHx8ICEobmV4dENoYXIgPj0gJzAnICYmIG5leHRDaGFyIDw9ICc3JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKHBhcnNlSW50KG9jdGFsLCA4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvY3RhbCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShieXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUuZGVjb2RlVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5hc0J5dGVzKCk7XG4gICAgICAgIGlmIChoYXNVdGYxNkJPTShieXRlcykpXG4gICAgICAgICAgICByZXR1cm4gdXRmMTZEZWNvZGUoYnl0ZXMpO1xuICAgICAgICByZXR1cm4gcGRmRG9jRW5jb2RpbmdEZWNvZGUoYnl0ZXMpO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5kZWNvZGVEYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGV4dCA9IHRoaXMuZGVjb2RlVGV4dCgpO1xuICAgICAgICB2YXIgZGF0ZSA9IHBhcnNlRGF0ZSh0ZXh0KTtcbiAgICAgICAgaWYgKCFkYXRlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IodGV4dCk7XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5hc1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBQREZTdHJpbmcucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUERGU3RyaW5nLm9mKHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiKFwiICsgdGhpcy52YWx1ZSArIFwiKVwiO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUubGVuZ3RoICsgMjtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkxlZnRQYXJlbjtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMudmFsdWUsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5SaWdodFBhcmVuO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGggKyAyO1xuICAgIH07XG4gICAgLy8gVGhlIFBERiBzcGVjIGFsbG93cyBuZXdsaW5lcyBhbmQgcGFyZW5zIHRvIGFwcGVhciBkaXJlY3RseSB3aXRoaW4gYSBsaXRlcmFsXG4gICAgLy8gc3RyaW5nLiBUaGVzZSBjaGFyYWN0ZXIgX21heV8gYmUgZXNjYXBlZC4gQnV0IHRoZXkgZG8gbm90IF9oYXZlXyB0byBiZS4gU29cbiAgICAvLyBmb3Igc2ltcGxpY2l0eSwgd2Ugd2lsbCBub3QgYm90aGVyIGVzY2FwaW5nIHRoZW0uXG4gICAgUERGU3RyaW5nLm9mID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBuZXcgUERGU3RyaW5nKHZhbHVlKTsgfTtcbiAgICBQREZTdHJpbmcuZnJvbURhdGUgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICB2YXIgeWVhciA9IHBhZFN0YXJ0KFN0cmluZyhkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpLCA0LCAnMCcpO1xuICAgICAgICB2YXIgbW9udGggPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENNb250aCgpICsgMSksIDIsICcwJyk7XG4gICAgICAgIHZhciBkYXkgPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENEYXRlKCkpLCAyLCAnMCcpO1xuICAgICAgICB2YXIgaG91cnMgPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENIb3VycygpKSwgMiwgJzAnKTtcbiAgICAgICAgdmFyIG1pbnMgPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENNaW51dGVzKCkpLCAyLCAnMCcpO1xuICAgICAgICB2YXIgc2VjcyA9IHBhZFN0YXJ0KFN0cmluZyhkYXRlLmdldFVUQ1NlY29uZHMoKSksIDIsICcwJyk7XG4gICAgICAgIHJldHVybiBuZXcgUERGU3RyaW5nKFwiRDpcIiArIHllYXIgKyBtb250aCArIGRheSArIGhvdXJzICsgbWlucyArIHNlY3MgKyBcIlpcIik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGU3RyaW5nO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlN0cmluZztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlN0cmluZy5qcy5tYXAiLCJpbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuLi9vYmplY3RzL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZPcGVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZPcGVyYXRvcihuYW1lLCBhcmdzKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3MgfHwgW107XG4gICAgfVxuICAgIFBERk9wZXJhdG9yLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KHRoaXMuYXJncy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGFyZyA9IHRoaXMuYXJnc1tpZHhdO1xuICAgICAgICAgICAgYXJnc1tpZHhdID0gYXJnIGluc3RhbmNlb2YgUERGT2JqZWN0ID8gYXJnLmNsb25lKGNvbnRleHQpIDogYXJnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQREZPcGVyYXRvci5vZih0aGlzLm5hbWUsIGFyZ3MpO1xuICAgIH07XG4gICAgUERGT3BlcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5hcmdzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFsdWUgKz0gU3RyaW5nKHRoaXMuYXJnc1tpZHhdKSArICcgJztcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSArPSB0aGlzLm5hbWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERk9wZXJhdG9yLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNpemUgPSAwO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLmFyZ3MubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgYXJnID0gdGhpcy5hcmdzW2lkeF07XG4gICAgICAgICAgICBzaXplICs9IChhcmcgaW5zdGFuY2VvZiBQREZPYmplY3QgPyBhcmcuc2l6ZUluQnl0ZXMoKSA6IGFyZy5sZW5ndGgpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBzaXplICs9IHRoaXMubmFtZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH07XG4gICAgUERGT3BlcmF0b3IucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuYXJncy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBhcmcgPSB0aGlzLmFyZ3NbaWR4XTtcbiAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBQREZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYXJnLmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKGFyZywgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgfVxuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5uYW1lLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGT3BlcmF0b3Iub2YgPSBmdW5jdGlvbiAobmFtZSwgYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFBERk9wZXJhdG9yKG5hbWUsIGFyZ3MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9wZXJhdG9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT3BlcmF0b3IuanMubWFwIiwidmFyIFBERk9wZXJhdG9yTmFtZXM7XG4oZnVuY3Rpb24gKFBERk9wZXJhdG9yTmFtZXMpIHtcbiAgICAvLyBOb24gU3Ryb2tpbmcgQ29sb3IgT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JcIl0gPSBcInNjXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JOXCJdID0gXCJzY25cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTm9uU3Ryb2tpbmdDb2xvclJnYlwiXSA9IFwicmdcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTm9uU3Ryb2tpbmdDb2xvckdyYXlcIl0gPSBcImdcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTm9uU3Ryb2tpbmdDb2xvckNteWtcIl0gPSBcImtcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTm9uU3Ryb2tpbmdDb2xvcnNwYWNlXCJdID0gXCJjc1wiO1xuICAgIC8vIFN0cm9raW5nIENvbG9yIE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yXCJdID0gXCJTQ1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yTlwiXSA9IFwiU0NOXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9raW5nQ29sb3JSZ2JcIl0gPSBcIlJHXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9raW5nQ29sb3JHcmF5XCJdID0gXCJHXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9raW5nQ29sb3JDbXlrXCJdID0gXCJLXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9raW5nQ29sb3JzcGFjZVwiXSA9IFwiQ1NcIjtcbiAgICAvLyBNYXJrZWQgQ29udGVudCBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQmVnaW5NYXJrZWRDb250ZW50U2VxdWVuY2VcIl0gPSBcIkJEQ1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJCZWdpbk1hcmtlZENvbnRlbnRcIl0gPSBcIkJNQ1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJFbmRNYXJrZWRDb250ZW50XCJdID0gXCJFTUNcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTWFya2VkQ29udGVudFBvaW50V2l0aFByb3BzXCJdID0gXCJEUFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJNYXJrZWRDb250ZW50UG9pbnRcIl0gPSBcIk1QXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkRyYXdPYmplY3RcIl0gPSBcIkRvXCI7XG4gICAgLy8gR3JhcGhpY3MgU3RhdGUgT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4XCJdID0gXCJjbVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJQb3BHcmFwaGljc1N0YXRlXCJdID0gXCJRXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlB1c2hHcmFwaGljc1N0YXRlXCJdID0gXCJxXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldEZsYXRuZXNzXCJdID0gXCJpXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldEdyYXBoaWNzU3RhdGVQYXJhbXNcIl0gPSBcImdzXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldExpbmVDYXBTdHlsZVwiXSA9IFwiSlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRMaW5lRGFzaFBhdHRlcm5cIl0gPSBcImRcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0TGluZUpvaW5TdHlsZVwiXSA9IFwialwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRMaW5lTWl0ZXJMaW1pdFwiXSA9IFwiTVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRMaW5lV2lkdGhcIl0gPSBcIndcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0VGV4dE1hdHJpeFwiXSA9IFwiVG1cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0UmVuZGVyaW5nSW50ZW50XCJdID0gXCJyaVwiO1xuICAgIC8vIEdyYXBoaWNzIE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJBcHBlbmRSZWN0YW5nbGVcIl0gPSBcInJlXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkJlZ2luSW5saW5lSW1hZ2VcIl0gPSBcIkJJXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkJlZ2luSW5saW5lSW1hZ2VEYXRhXCJdID0gXCJJRFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJFbmRJbmxpbmVJbWFnZVwiXSA9IFwiRUlcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQ2xpcEV2ZW5PZGRcIl0gPSBcIlcqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsaXBOb25aZXJvXCJdID0gXCJXXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsb3NlQW5kU3Ryb2tlXCJdID0gXCJzXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsb3NlRmlsbEV2ZW5PZGRBbmRTdHJva2VcIl0gPSBcImIqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsb3NlRmlsbE5vblplcm9BbmRTdHJva2VcIl0gPSBcImJcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQ2xvc2VQYXRoXCJdID0gXCJoXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkFwcGVuZEJlemllckN1cnZlXCJdID0gXCJjXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkN1cnZlVG9SZXBsaWNhdGVGaW5hbFBvaW50XCJdID0gXCJ5XCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkN1cnZlVG9SZXBsaWNhdGVJbml0aWFsUG9pbnRcIl0gPSBcInZcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRW5kUGF0aFwiXSA9IFwiblwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJGaWxsRXZlbk9kZEFuZFN0cm9rZVwiXSA9IFwiQipcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRmlsbEV2ZW5PZGRcIl0gPSBcImYqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkZpbGxOb25aZXJvQW5kU3Ryb2tlXCJdID0gXCJCXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkZpbGxOb25aZXJvXCJdID0gXCJmXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkxlZ2FjeUZpbGxOb25aZXJvXCJdID0gXCJGXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkxpbmVUb1wiXSA9IFwibFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJNb3ZlVG9cIl0gPSBcIm1cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2hhZGluZ0ZpbGxcIl0gPSBcInNoXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9rZVBhdGhcIl0gPSBcIlNcIjtcbiAgICAvLyBUZXh0IE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJCZWdpblRleHRcIl0gPSBcIkJUXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkVuZFRleHRcIl0gPSBcIkVUXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk1vdmVUZXh0XCJdID0gXCJUZFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJNb3ZlVGV4dFNldExlYWRpbmdcIl0gPSBcIlREXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5leHRMaW5lXCJdID0gXCJUKlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRDaGFyYWN0ZXJTcGFjaW5nXCJdID0gXCJUY1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRGb250QW5kU2l6ZVwiXSA9IFwiVGZcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0VGV4dEhvcml6b250YWxTY2FsaW5nXCJdID0gXCJUelwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRUZXh0TGluZUhlaWdodFwiXSA9IFwiVExcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0VGV4dFJlbmRlcmluZ01vZGVcIl0gPSBcIlRyXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFRleHRSaXNlXCJdID0gXCJUc1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRXb3JkU3BhY2luZ1wiXSA9IFwiVHdcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2hvd1RleHRcIl0gPSBcIlRqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNob3dUZXh0QWRqdXN0ZWRcIl0gPSBcIlRKXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNob3dUZXh0TGluZVwiXSA9IFwiJ1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTaG93VGV4dExpbmVBbmRTcGFjZVwiXSA9IFwiXFxcIlwiO1xuICAgIC8vIFR5cGUzIEZvbnQgT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlR5cGUzRDBcIl0gPSBcImQwXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlR5cGUzRDFcIl0gPSBcImQxXCI7XG4gICAgLy8gQ29tcGF0aWJpbGl0eSBTZWN0aW9uIE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJCZWdpbkNvbXBhdGliaWxpdHlTZWN0aW9uXCJdID0gXCJCWFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJFbmRDb21wYXRpYmlsaXR5U2VjdGlvblwiXSA9IFwiRVhcIjtcbn0pKFBERk9wZXJhdG9yTmFtZXMgfHwgKFBERk9wZXJhdG9yTmFtZXMgPSB7fSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGT3BlcmF0b3JOYW1lcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9wZXJhdG9yTmFtZXMuanMubWFwIiwiaW1wb3J0IHsgTnVtYmVyUGFyc2luZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgSXNEaWdpdCwgSXNOdW1lcmljIH0gZnJvbSBcIi4uL3N5bnRheC9OdW1lcmljXCI7XG5pbXBvcnQgeyBJc1doaXRlc3BhY2UgfSBmcm9tIFwiLi4vc3ludGF4L1doaXRlc3BhY2VcIjtcbmltcG9ydCB7IGNoYXJGcm9tQ29kZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIE5ld2xpbmUgPSBDaGFyQ29kZXMuTmV3bGluZSwgQ2FycmlhZ2VSZXR1cm4gPSBDaGFyQ29kZXMuQ2FycmlhZ2VSZXR1cm47XG4vLyBUT0RPOiBUaHJvdyBlcnJvciBpZiBlb2YgaXMgcmVhY2hlZCBiZWZvcmUgZmluaXNoaW5nIG9iamVjdCBwYXJzZS4uLlxudmFyIEJhc2VQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmFzZVBhcnNlcihieXRlcywgY2FwTnVtYmVycykge1xuICAgICAgICBpZiAoY2FwTnVtYmVycyA9PT0gdm9pZCAwKSB7IGNhcE51bWJlcnMgPSBmYWxzZTsgfVxuICAgICAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7XG4gICAgICAgIHRoaXMuY2FwTnVtYmVycyA9IGNhcE51bWJlcnM7XG4gICAgfVxuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLnBhcnNlUmF3SW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIGlmICghSXNEaWdpdFtieXRlXSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHZhbHVlICs9IGNoYXJGcm9tQ29kZSh0aGlzLmJ5dGVzLm5leHQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG51bWJlclZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAhaXNGaW5pdGUobnVtYmVyVmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyUGFyc2luZ0Vycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1iZXJWYWx1ZTtcbiAgICB9O1xuICAgIC8vIFRPRE86IE1heWJlIGhhbmRsZSBleHBvbmVudGlhbCBmb3JtYXQ/XG4gICAgLy8gVE9ETzogQ29tcGFyZSBwZXJmb3JtYW5jZSBvZiBzdHJpbmcgY29uY2F0ZW5hdGlvbiB0byBjaGFyRnJvbUNvZGUoLi4uYnl0ZXMpXG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUucGFyc2VSYXdOdW1iZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICAvLyBQYXJzZSBpbnRlZ2VyLXBhcnQsIHRoZSBsZWFkaW5nICgrIHwgLSB8IC4gfCAwLTkpXG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoIUlzTnVtZXJpY1tieXRlXSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHZhbHVlICs9IGNoYXJGcm9tQ29kZSh0aGlzLmJ5dGVzLm5leHQoKSk7XG4gICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLlBlcmlvZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXJzZSBkZWNpbWFsLXBhcnQsIHRoZSB0cmFpbGluZyAoMC05KVxuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKCFJc0RpZ2l0W2J5dGVdKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdmFsdWUgKz0gY2hhckZyb21Db2RlKHRoaXMuYnl0ZXMubmV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbnVtYmVyVmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICBpZiAoIXZhbHVlIHx8ICFpc0Zpbml0ZShudW1iZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJQYXJzaW5nRXJyb3IodGhpcy5ieXRlcy5wb3NpdGlvbigpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bWJlclZhbHVlID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhcE51bWJlcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0gXCJQYXJzZWQgbnVtYmVyIHRoYXQgaXMgdG9vIGxhcmdlIGZvciBzb21lIFBERiByZWFkZXJzOiBcIiArIHZhbHVlICsgXCIsIHVzaW5nIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIGluc3RlYWQuXCI7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG1zZyA9IFwiUGFyc2VkIG51bWJlciB0aGF0IGlzIHRvbyBsYXJnZSBmb3Igc29tZSBQREYgcmVhZGVyczogXCIgKyB2YWx1ZSArIFwiLCBub3QgY2FwcGluZy5cIjtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyVmFsdWU7XG4gICAgfTtcbiAgICBCYXNlUGFyc2VyLnByb3RvdHlwZS5za2lwV2hpdGVzcGFjZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSAmJiBJc1doaXRlc3BhY2VbdGhpcy5ieXRlcy5wZWVrKCldKSB7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUuc2tpcExpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoYnl0ZSA9PT0gTmV3bGluZSB8fCBieXRlID09PSBDYXJyaWFnZVJldHVybilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUuc2tpcENvbW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmJ5dGVzLnBlZWsoKSAhPT0gQ2hhckNvZGVzLlBlcmNlbnQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoYnl0ZSA9PT0gTmV3bGluZSB8fCBieXRlID09PSBDYXJyaWFnZVJldHVybilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZSgpO1xuICAgICAgICB3aGlsZSAodGhpcy5za2lwQ29tbWVudCgpKVxuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZSgpO1xuICAgIH07XG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUubWF0Y2hLZXl3b3JkID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBrZXl3b3JkLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYnl0ZXMuZG9uZSgpIHx8IHRoaXMuYnl0ZXMubmV4dCgpICE9PSBrZXl3b3JkW2lkeF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhpbml0aWFsT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZVBhcnNlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBCYXNlUGFyc2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmFzZVBhcnNlci5qcy5tYXAiLCJpbXBvcnQgeyBOZXh0Qnl0ZUFzc2VydGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgZGVjb2RlUERGUmF3U3RyZWFtIH0gZnJvbSBcIi4uL3N0cmVhbXMvZGVjb2RlXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG4vLyBUT0RPOiBTZWUgaG93IGxpbmUvY29sIHRyYWNraW5nIGFmZmVjdHMgcGVyZm9ybWFuY2VcbnZhciBCeXRlU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJ5dGVTdHJlYW0oYnl0ZXMpIHtcbiAgICAgICAgdGhpcy5pZHggPSAwO1xuICAgICAgICB0aGlzLmxpbmUgPSAwO1xuICAgICAgICB0aGlzLmNvbHVtbiA9IDA7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBieXRlcztcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLmJ5dGVzLmxlbmd0aDtcbiAgICB9XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUubW92ZVRvID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgICB0aGlzLmlkeCA9IG9mZnNldDtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlc1t0aGlzLmlkeCsrXTtcbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5OZXdsaW5lKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmUgKz0gMTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ5dGU7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5hc3NlcnROZXh0ID0gZnVuY3Rpb24gKGV4cGVjdGVkKSB7XG4gICAgICAgIGlmICh0aGlzLnBlZWsoKSAhPT0gZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOZXh0Qnl0ZUFzc2VydGlvbkVycm9yKHRoaXMucG9zaXRpb24oKSwgZXhwZWN0ZWQsIHRoaXMucGVlaygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KCk7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ieXRlc1t0aGlzLmlkeF07XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5wZWVrQWhlYWQgPSBmdW5jdGlvbiAoc3RlcHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5pZHggKyBzdGVwc107XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5wZWVrQXQgPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzW29mZnNldF07XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5kb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZHggPj0gdGhpcy5sZW5ndGg7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkeDtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXMuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5wb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHsgbGluZTogdGhpcy5saW5lLCBjb2x1bW46IHRoaXMuY29sdW1uLCBvZmZzZXQ6IHRoaXMuaWR4IH07XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLm9mID0gZnVuY3Rpb24gKGJ5dGVzKSB7IHJldHVybiBuZXcgQnl0ZVN0cmVhbShieXRlcyk7IH07XG4gICAgQnl0ZVN0cmVhbS5mcm9tUERGUmF3U3RyZWFtID0gZnVuY3Rpb24gKHJhd1N0cmVhbSkge1xuICAgICAgICByZXR1cm4gQnl0ZVN0cmVhbS5vZihkZWNvZGVQREZSYXdTdHJlYW0ocmF3U3RyZWFtKS5kZWNvZGUoKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQnl0ZVN0cmVhbTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBCeXRlU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Qnl0ZVN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFBERk9iamVjdFBhcnNpbmdFcnJvciwgUERGU3RyZWFtUGFyc2luZ0Vycm9yLCBVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvciwgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZCb29sIGZyb20gXCIuLi9vYmplY3RzL1BERkJvb2xcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVsbCBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdWxsXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlJhd1N0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZSYXdTdHJlYW1cIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IEJhc2VQYXJzZXIgZnJvbSBcIi4vQmFzZVBhcnNlclwiO1xuaW1wb3J0IEJ5dGVTdHJlYW0gZnJvbSBcIi4vQnl0ZVN0cmVhbVwiO1xuaW1wb3J0IFBERkNhdGFsb2cgZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGQ2F0YWxvZ1wiO1xuaW1wb3J0IFBERlBhZ2VMZWFmIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERlBhZ2VMZWFmXCI7XG5pbXBvcnQgUERGUGFnZVRyZWUgZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGUGFnZVRyZWVcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IElzRGVsaW1pdGVyIH0gZnJvbSBcIi4uL3N5bnRheC9EZWxpbWl0ZXJzXCI7XG5pbXBvcnQgeyBLZXl3b3JkcyB9IGZyb20gXCIuLi9zeW50YXgvS2V5d29yZHNcIjtcbmltcG9ydCB7IElzRGlnaXQsIElzTnVtZXJpYyB9IGZyb20gXCIuLi9zeW50YXgvTnVtZXJpY1wiO1xuaW1wb3J0IHsgSXNXaGl0ZXNwYWNlIH0gZnJvbSBcIi4uL3N5bnRheC9XaGl0ZXNwYWNlXCI7XG5pbXBvcnQgeyBjaGFyRnJvbUNvZGUgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8vIFRPRE86IFRocm93IGVycm9yIGlmIGVvZiBpcyByZWFjaGVkIGJlZm9yZSBmaW5pc2hpbmcgb2JqZWN0IHBhcnNlLi4uXG52YXIgUERGT2JqZWN0UGFyc2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZPYmplY3RQYXJzZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGT2JqZWN0UGFyc2VyKGJ5dGVTdHJlYW0sIGNvbnRleHQsIGNhcE51bWJlcnMpIHtcbiAgICAgICAgaWYgKGNhcE51bWJlcnMgPT09IHZvaWQgMCkgeyBjYXBOdW1iZXJzID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYnl0ZVN0cmVhbSwgY2FwTnVtYmVycykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gVE9ETzogSXMgaXQgcG9zc2libGUgdG8gcmVkdWNlIGR1cGxpY2F0ZSBwYXJzaW5nIGZvciByZWYgbG9va2FoZWFkcz9cbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnRydWUpKVxuICAgICAgICAgICAgcmV0dXJuIFBERkJvb2wuVHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmZhbHNlKSlcbiAgICAgICAgICAgIHJldHVybiBQREZCb29sLkZhbHNlO1xuICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMubnVsbCkpXG4gICAgICAgICAgICByZXR1cm4gUERGTnVsbDtcbiAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5MZXNzVGhhbiAmJlxuICAgICAgICAgICAgdGhpcy5ieXRlcy5wZWVrQWhlYWQoMSkgPT09IENoYXJDb2Rlcy5MZXNzVGhhbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEaWN0T3JTdHJlYW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkxlc3NUaGFuKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VIZXhTdHJpbmcoKTtcbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5MZWZ0UGFyZW4pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVN0cmluZygpO1xuICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkZvcndhcmRTbGFzaClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlTmFtZSgpO1xuICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkxlZnRTcXVhcmVCcmFja2V0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBcnJheSgpO1xuICAgICAgICBpZiAoSXNOdW1lcmljW2J5dGVdKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VOdW1iZXJPclJlZigpO1xuICAgICAgICB0aHJvdyBuZXcgUERGT2JqZWN0UGFyc2luZ0Vycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSwgYnl0ZSk7XG4gICAgfTtcbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlTnVtYmVyT3JSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmaXJzdE51bSA9IHRoaXMucGFyc2VSYXdOdW1iZXIoKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBsb29rYWhlYWRTdGFydCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgIGlmIChJc0RpZ2l0W3RoaXMuYnl0ZXMucGVlaygpXSkge1xuICAgICAgICAgICAgdmFyIHNlY29uZE51bSA9IHRoaXMucGFyc2VSYXdOdW1iZXIoKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnl0ZXMucGVlaygpID09PSBDaGFyQ29kZXMuUikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuUik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBERlJlZi5vZihmaXJzdE51bSwgc2Vjb25kTnVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhsb29rYWhlYWRTdGFydCk7XG4gICAgICAgIHJldHVybiBQREZOdW1iZXIub2YoZmlyc3ROdW0pO1xuICAgIH07XG4gICAgLy8gVE9ETzogTWF5YmUgdXBkYXRlIFBERkhleFN0cmluZy5vZigpIGxvZ2ljIHRvIHJlbW92ZSB3aGl0ZXNwYWNlIGFuZCB2YWxpZGF0ZSBpbnB1dD9cbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlSGV4U3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5MZXNzVGhhbik7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkgJiYgdGhpcy5ieXRlcy5wZWVrKCkgIT09IENoYXJDb2Rlcy5HcmVhdGVyVGhhbikge1xuICAgICAgICAgICAgdmFsdWUgKz0gY2hhckZyb21Db2RlKHRoaXMuYnl0ZXMubmV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkdyZWF0ZXJUaGFuKTtcbiAgICAgICAgcmV0dXJuIFBERkhleFN0cmluZy5vZih2YWx1ZSk7XG4gICAgfTtcbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbmVzdGluZ0x2bCA9IDA7XG4gICAgICAgIHZhciBpc0VzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgICAgICB2YWx1ZSArPSBjaGFyRnJvbUNvZGUoYnl0ZSk7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgdW5lc2NhcGVkIHBhcmVudGhlc2lzXG4gICAgICAgICAgICBpZiAoIWlzRXNjYXBlZCkge1xuICAgICAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTGVmdFBhcmVuKVxuICAgICAgICAgICAgICAgICAgICBuZXN0aW5nTHZsICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5SaWdodFBhcmVuKVxuICAgICAgICAgICAgICAgICAgICBuZXN0aW5nTHZsIC09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcmFjayB3aGV0aGVyIGN1cnJlbnQgY2hhcmFjdGVyIGlzIGJlaW5nIGVzY2FwZWQgb3Igbm90XG4gICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkJhY2tTbGFzaCkge1xuICAgICAgICAgICAgICAgIGlzRXNjYXBlZCA9ICFpc0VzY2FwZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0VzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICBpc0VzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE9uY2UgKGlmKSB0aGUgdW5lc2NhcGVkIHBhcmVudGhlc2lzIGJhbGFuY2Ugb3V0LCByZXR1cm4gdGhlaXIgY29udGVudHNcbiAgICAgICAgICAgIGlmIChuZXN0aW5nTHZsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBvdXRlciBwYXJlbnMgc28gdGhleSBhcmVuJ3QgcGFydCBvZiB0aGUgY29udGVudHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUERGU3RyaW5nLm9mKHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSk7XG4gICAgfTtcbiAgICAvLyBUT0RPOiBDb21wYXJlIHBlcmZvcm1hbmNlIG9mIHN0cmluZyBjb25jYXRlbmF0aW9uIHRvIGNoYXJGcm9tQ29kZSguLi5ieXRlcylcbiAgICAvLyBUT0RPOiBNYXliZSBwcmVhbGxvY2F0ZSBzbWFsbCBVaW50OEFycmF5IGlmIGNhbiB1c2UgY2hhckZyb21Db2RlP1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VOYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkZvcndhcmRTbGFzaCk7XG4gICAgICAgIHZhciBuYW1lID0gJyc7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoSXNXaGl0ZXNwYWNlW2J5dGVdIHx8IElzRGVsaW1pdGVyW2J5dGVdKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbmFtZSArPSBjaGFyRnJvbUNvZGUoYnl0ZSk7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUERGTmFtZS5vZihuYW1lKTtcbiAgICB9O1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5MZWZ0U3F1YXJlQnJhY2tldCk7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgcGRmQXJyYXkgPSBQREZBcnJheS53aXRoQ29udGV4dCh0aGlzLmNvbnRleHQpO1xuICAgICAgICB3aGlsZSAodGhpcy5ieXRlcy5wZWVrKCkgIT09IENoYXJDb2Rlcy5SaWdodFNxdWFyZUJyYWNrZXQpIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5wYXJzZU9iamVjdCgpO1xuICAgICAgICAgICAgcGRmQXJyYXkucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuUmlnaHRTcXVhcmVCcmFja2V0KTtcbiAgICAgICAgcmV0dXJuIHBkZkFycmF5O1xuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuTGVzc1RoYW4pO1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkxlc3NUaGFuKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBkaWN0ID0gbmV3IE1hcCgpO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpICYmXG4gICAgICAgICAgICB0aGlzLmJ5dGVzLnBlZWsoKSAhPT0gQ2hhckNvZGVzLkdyZWF0ZXJUaGFuICYmXG4gICAgICAgICAgICB0aGlzLmJ5dGVzLnBlZWtBaGVhZCgxKSAhPT0gQ2hhckNvZGVzLkdyZWF0ZXJUaGFuKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5wYXJzZU5hbWUoKTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMucGFyc2VPYmplY3QoKTtcbiAgICAgICAgICAgIGRpY3Quc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuR3JlYXRlclRoYW4pO1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkdyZWF0ZXJUaGFuKTtcbiAgICAgICAgdmFyIFR5cGUgPSBkaWN0LmdldChQREZOYW1lLm9mKCdUeXBlJykpO1xuICAgICAgICBpZiAoVHlwZSA9PT0gUERGTmFtZS5vZignQ2F0YWxvZycpKSB7XG4gICAgICAgICAgICByZXR1cm4gUERGQ2F0YWxvZy5mcm9tTWFwV2l0aENvbnRleHQoZGljdCwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChUeXBlID09PSBQREZOYW1lLm9mKCdQYWdlcycpKSB7XG4gICAgICAgICAgICByZXR1cm4gUERGUGFnZVRyZWUuZnJvbU1hcFdpdGhDb250ZXh0KGRpY3QsIHRoaXMuY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoVHlwZSA9PT0gUERGTmFtZS5vZignUGFnZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gUERGUGFnZUxlYWYuZnJvbU1hcFdpdGhDb250ZXh0KGRpY3QsIHRoaXMuY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUERGRGljdC5mcm9tTWFwV2l0aENvbnRleHQoZGljdCwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZURpY3RPclN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5ieXRlcy5wb3NpdGlvbigpO1xuICAgICAgICB2YXIgZGljdCA9IHRoaXMucGFyc2VEaWN0KCk7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0cmVhbUVPRjEpICYmXG4gICAgICAgICAgICAhdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RyZWFtRU9GMikgJiZcbiAgICAgICAgICAgICF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdHJlYW1FT0YzKSAmJlxuICAgICAgICAgICAgIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0cmVhbUVPRjQpICYmXG4gICAgICAgICAgICAhdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RyZWFtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRpY3Q7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgdmFyIGVuZDtcbiAgICAgICAgdmFyIExlbmd0aCA9IGRpY3QuZ2V0KFBERk5hbWUub2YoJ0xlbmd0aCcpKTtcbiAgICAgICAgaWYgKExlbmd0aCBpbnN0YW5jZW9mIFBERk51bWJlcikge1xuICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBMZW5ndGguYXNOdW1iZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKGVuZCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZW5kc3RyZWFtKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmZpbmRFbmRPZlN0cmVhbUZhbGxiYWNrKHN0YXJ0UG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuZCA9IHRoaXMuZmluZEVuZE9mU3RyZWFtRmFsbGJhY2soc3RhcnRQb3MpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250ZW50cyA9IHRoaXMuYnl0ZXMuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgIHJldHVybiBQREZSYXdTdHJlYW0ub2YoZGljdCwgY29udGVudHMpO1xuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5maW5kRW5kT2ZTdHJlYW1GYWxsYmFjayA9IGZ1bmN0aW9uIChzdGFydFBvcykge1xuICAgICAgICAvLyBNb3ZlIHRvIGVuZCBvZiBzdHJlYW0sIHdoaWxlIGhhbmRsaW5nIG5lc3RlZCBzdHJlYW1zXG4gICAgICAgIHZhciBuZXN0aW5nTHZsID0gMTtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIGVuZCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RyZWFtKSkge1xuICAgICAgICAgICAgICAgIG5lc3RpbmdMdmwgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLkVPRjFlbmRzdHJlYW0pIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuRU9GMmVuZHN0cmVhbSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5FT0YzZW5kc3RyZWFtKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVuZHN0cmVhbSkpIHtcbiAgICAgICAgICAgICAgICBuZXN0aW5nTHZsIC09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXN0aW5nTHZsID09PSAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXN0aW5nTHZsICE9PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFBERlN0cmVhbVBhcnNpbmdFcnJvcihzdGFydFBvcyk7XG4gICAgICAgIHJldHVybiBlbmQ7XG4gICAgfTtcbiAgICBQREZPYmplY3RQYXJzZXIuZm9yQnl0ZXMgPSBmdW5jdGlvbiAoYnl0ZXMsIGNvbnRleHQsIGNhcE51bWJlcnMpIHsgcmV0dXJuIG5ldyBQREZPYmplY3RQYXJzZXIoQnl0ZVN0cmVhbS5vZihieXRlcyksIGNvbnRleHQsIGNhcE51bWJlcnMpOyB9O1xuICAgIFBERk9iamVjdFBhcnNlci5mb3JCeXRlU3RyZWFtID0gZnVuY3Rpb24gKGJ5dGVTdHJlYW0sIGNvbnRleHQsIGNhcE51bWJlcnMpIHtcbiAgICAgICAgaWYgKGNhcE51bWJlcnMgPT09IHZvaWQgMCkgeyBjYXBOdW1iZXJzID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZPYmplY3RQYXJzZXIoYnl0ZVN0cmVhbSwgY29udGV4dCwgY2FwTnVtYmVycyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGT2JqZWN0UGFyc2VyO1xufShCYXNlUGFyc2VyKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPYmplY3RQYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPYmplY3RQYXJzZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBSZXBhcnNlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBCeXRlU3RyZWFtIGZyb20gXCIuL0J5dGVTdHJlYW1cIjtcbmltcG9ydCBQREZPYmplY3RQYXJzZXIgZnJvbSBcIi4vUERGT2JqZWN0UGFyc2VyXCI7XG5pbXBvcnQgeyB3YWl0Rm9yVGljayB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERk9iamVjdFN0cmVhbVBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGT2JqZWN0U3RyZWFtUGFyc2VyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk9iamVjdFN0cmVhbVBhcnNlcihyYXdTdHJlYW0sIHNob3VsZFdhaXRGb3JUaWNrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIEJ5dGVTdHJlYW0uZnJvbVBERlJhd1N0cmVhbShyYXdTdHJlYW0pLCByYXdTdHJlYW0uZGljdC5jb250ZXh0KSB8fCB0aGlzO1xuICAgICAgICB2YXIgZGljdCA9IHJhd1N0cmVhbS5kaWN0O1xuICAgICAgICBfdGhpcy5hbHJlYWR5UGFyc2VkID0gZmFsc2U7XG4gICAgICAgIF90aGlzLnNob3VsZFdhaXRGb3JUaWNrID0gc2hvdWxkV2FpdEZvclRpY2sgfHwgKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9KTtcbiAgICAgICAgX3RoaXMuZmlyc3RPZmZzZXQgPSBkaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdGaXJzdCcpLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIF90aGlzLm9iamVjdENvdW50ID0gZGljdC5sb29rdXAoUERGTmFtZS5vZignTicpLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGT2JqZWN0U3RyZWFtUGFyc2VyLnByb3RvdHlwZS5wYXJzZUludG9Db250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0c0FuZE9iamVjdE51bWJlcnMsIGlkeCwgbGVuLCBfYSwgb2JqZWN0TnVtYmVyLCBvZmZzZXQsIG9iamVjdCwgcmVmO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWxyZWFkeVBhcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXBhcnNlRXJyb3IoJ1BERk9iamVjdFN0cmVhbVBhcnNlcicsICdwYXJzZUludG9Db250ZXh0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFscmVhZHlQYXJzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c0FuZE9iamVjdE51bWJlcnMgPSB0aGlzLnBhcnNlT2Zmc2V0c0FuZE9iamVjdE51bWJlcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IG9mZnNldHNBbmRPYmplY3ROdW1iZXJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9mZnNldHNBbmRPYmplY3ROdW1iZXJzW2lkeF0sIG9iamVjdE51bWJlciA9IF9hLm9iamVjdE51bWJlciwgb2Zmc2V0ID0gX2Eub2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8odGhpcy5maXJzdE9mZnNldCArIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSBQREZSZWYub2Yob2JqZWN0TnVtYmVyLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hc3NpZ24ocmVmLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFdhaXRGb3JUaWNrKCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2FpdEZvclRpY2soKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtUGFyc2VyLnByb3RvdHlwZS5wYXJzZU9mZnNldHNBbmRPYmplY3ROdW1iZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb2Zmc2V0c0FuZE9iamVjdE51bWJlcnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vYmplY3RDb3VudDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICB2YXIgb2JqZWN0TnVtYmVyID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICAgICAgb2Zmc2V0c0FuZE9iamVjdE51bWJlcnMucHVzaCh7IG9iamVjdE51bWJlcjogb2JqZWN0TnVtYmVyLCBvZmZzZXQ6IG9mZnNldCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0c0FuZE9iamVjdE51bWJlcnM7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW1QYXJzZXIuZm9yU3RyZWFtID0gZnVuY3Rpb24gKHJhd1N0cmVhbSwgc2hvdWxkV2FpdEZvclRpY2spIHsgcmV0dXJuIG5ldyBQREZPYmplY3RTdHJlYW1QYXJzZXIocmF3U3RyZWFtLCBzaG91bGRXYWl0Rm9yVGljayk7IH07XG4gICAgcmV0dXJuIFBERk9iamVjdFN0cmVhbVBhcnNlcjtcbn0oUERGT2JqZWN0UGFyc2VyKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPYmplY3RTdHJlYW1QYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPYmplY3RTdHJlYW1QYXJzZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQ3Jvc3NSZWZTZWN0aW9uIGZyb20gXCIuLi9kb2N1bWVudC9QREZDcm9zc1JlZlNlY3Rpb25cIjtcbmltcG9ydCBQREZIZWFkZXIgZnJvbSBcIi4uL2RvY3VtZW50L1BERkhlYWRlclwiO1xuaW1wb3J0IFBERlRyYWlsZXIgZnJvbSBcIi4uL2RvY3VtZW50L1BERlRyYWlsZXJcIjtcbmltcG9ydCB7IE1pc3NpbmdLZXl3b3JkRXJyb3IsIE1pc3NpbmdQREZIZWFkZXJFcnJvciwgUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvciwgUmVwYXJzZUVycm9yLCBTdGFsbGVkUGFyc2VyRXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERkludmFsaWRPYmplY3QgZnJvbSBcIi4uL29iamVjdHMvUERGSW52YWxpZE9iamVjdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERlJhd1N0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZSYXdTdHJlYW1cIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgQnl0ZVN0cmVhbSBmcm9tIFwiLi9CeXRlU3RyZWFtXCI7XG5pbXBvcnQgUERGT2JqZWN0UGFyc2VyIGZyb20gXCIuL1BERk9iamVjdFBhcnNlclwiO1xuaW1wb3J0IFBERk9iamVjdFN0cmVhbVBhcnNlciBmcm9tIFwiLi9QREZPYmplY3RTdHJlYW1QYXJzZXJcIjtcbmltcG9ydCBQREZYUmVmU3RyZWFtUGFyc2VyIGZyb20gXCIuL1BERlhSZWZTdHJlYW1QYXJzZXJcIjtcbmltcG9ydCBQREZDb250ZXh0IGZyb20gXCIuLi9QREZDb250ZXh0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBLZXl3b3JkcyB9IGZyb20gXCIuLi9zeW50YXgvS2V5d29yZHNcIjtcbmltcG9ydCB7IElzRGlnaXQgfSBmcm9tIFwiLi4vc3ludGF4L051bWVyaWNcIjtcbmltcG9ydCB7IHdhaXRGb3JUaWNrIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGUGFyc2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZQYXJzZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUGFyc2VyKHBkZkJ5dGVzLCBvYmplY3RzUGVyVGljaywgdGhyb3dPbkludmFsaWRPYmplY3QsIGNhcE51bWJlcnMpIHtcbiAgICAgICAgaWYgKG9iamVjdHNQZXJUaWNrID09PSB2b2lkIDApIHsgb2JqZWN0c1BlclRpY2sgPSBJbmZpbml0eTsgfVxuICAgICAgICBpZiAodGhyb3dPbkludmFsaWRPYmplY3QgPT09IHZvaWQgMCkgeyB0aHJvd09uSW52YWxpZE9iamVjdCA9IGZhbHNlOyB9XG4gICAgICAgIGlmIChjYXBOdW1iZXJzID09PSB2b2lkIDApIHsgY2FwTnVtYmVycyA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIEJ5dGVTdHJlYW0ub2YocGRmQnl0ZXMpLCBQREZDb250ZXh0LmNyZWF0ZSgpLCBjYXBOdW1iZXJzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5hbHJlYWR5UGFyc2VkID0gZmFsc2U7XG4gICAgICAgIF90aGlzLnBhcnNlZE9iamVjdHMgPSAwO1xuICAgICAgICBfdGhpcy5zaG91bGRXYWl0Rm9yVGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnBhcnNlZE9iamVjdHMgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5wYXJzZWRPYmplY3RzICUgX3RoaXMub2JqZWN0c1BlclRpY2sgPT09IDA7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLm9iamVjdHNQZXJUaWNrID0gb2JqZWN0c1BlclRpY2s7XG4gICAgICAgIF90aGlzLnRocm93T25JbnZhbGlkT2JqZWN0ID0gdGhyb3dPbkludmFsaWRPYmplY3Q7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5wYXJzZURvY3VtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJldk9mZnNldCwgb2Zmc2V0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWxyZWFkeVBhcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXBhcnNlRXJyb3IoJ1BERlBhcnNlcicsICdwYXJzZURvY3VtZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFscmVhZHlQYXJzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmhlYWRlciA9IHRoaXMucGFyc2VIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5ieXRlcy5kb25lKCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5wYXJzZURvY3VtZW50U2VjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IHByZXZPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGxlZFBhcnNlckVycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2T2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF5YmVSZWNvdmVyUm9vdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5sb29rdXAoUERGUmVmLm9mKDApKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVtb3ZpbmcgcGFyc2VkIG9iamVjdDogMCAwIFInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZGVsZXRlKFBERlJlZi5vZigwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5jb250ZXh0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLm1heWJlUmVjb3ZlclJvb3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpc1ZhbGlkQ2F0YWxvZyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBQREZEaWN0ICYmXG4gICAgICAgICAgICAgICAgb2JqLmxvb2t1cChQREZOYW1lLm9mKCdUeXBlJykpID09PSBQREZOYW1lLm9mKCdDYXRhbG9nJyk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBjYXRhbG9nID0gdGhpcy5jb250ZXh0Lmxvb2t1cCh0aGlzLmNvbnRleHQudHJhaWxlckluZm8uUm9vdCk7XG4gICAgICAgIGlmICghaXNWYWxpZENhdGFsb2coY2F0YWxvZykpIHtcbiAgICAgICAgICAgIHZhciBpbmRpcmVjdE9iamVjdHMgPSB0aGlzLmNvbnRleHQuZW51bWVyYXRlSW5kaXJlY3RPYmplY3RzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBpbmRpcmVjdE9iamVjdHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gaW5kaXJlY3RPYmplY3RzW2lkeF0sIHJlZiA9IF9hWzBdLCBvYmplY3QgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZENhdGFsb2cob2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uUm9vdCA9IHJlZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUucGFyc2VIZWFkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5oZWFkZXIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ham9yID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuUGVyaW9kKTtcbiAgICAgICAgICAgICAgICB2YXIgbWlub3IgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IFBERkhlYWRlci5mb3JWZXJzaW9uKG1ham9yLCBtaW5vcik7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwQmluYXJ5SGVhZGVyQ29tbWVudCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1BERkhlYWRlckVycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSk7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnBhcnNlSW5kaXJlY3RPYmplY3RIZWFkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgb2JqZWN0TnVtYmVyID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIGdlbmVyYXRpb25OdW1iZXIgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLm9iaikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nS2V5d29yZEVycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSwgS2V5d29yZHMub2JqKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUERGUmVmLm9mKG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbk51bWJlcik7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLm1hdGNoSW5kaXJlY3RPYmplY3RIZWFkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VJbmRpcmVjdE9iamVjdEhlYWRlcigpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKGluaXRpYWxPZmZzZXQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnBhcnNlSW5kaXJlY3RPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZWYsIG9iamVjdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMucGFyc2VJbmRpcmVjdE9iamVjdEhlYWRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICghdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZW5kb2JqKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgbmV3IE1pc3NpbmdLZXl3b3JkRXJyb3IodGhpcy5ieXRlcy5wb3NpdGlvbigpLCBLZXl3b3Jkcy5lbmRvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogTG9nIGEgd2FybmluZyBpZiB0aGlzIGZhaWxzLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lbmRvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgUERGUmF3U3RyZWFtICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1R5cGUnKSkgPT09IFBERk5hbWUub2YoJ09ialN0bScpKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQREZPYmplY3RTdHJlYW1QYXJzZXIuZm9yU3RyZWFtKG9iamVjdCwgdGhpcy5zaG91bGRXYWl0Rm9yVGljaykucGFyc2VJbnRvQ29udGV4dCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQREZSYXdTdHJlYW0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZGljdC5sb29rdXAoUERGTmFtZS5vZignVHlwZScpKSA9PT0gUERGTmFtZS5vZignWFJlZicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGWFJlZlN0cmVhbVBhcnNlci5mb3JTdHJlYW0ob2JqZWN0KS5wYXJzZUludG9Db250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYXNzaWduKHJlZiwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBUT0RPOiBJbXByb3ZlIGFuZCBjbGVhbiB0aGlzIHVwXG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS50cnlUb1BhcnNlSW52YWxpZEluZGlyZWN0T2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLmJ5dGVzLnBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBtc2cgPSBcIlRyeWluZyB0byBwYXJzZSBpbnZhbGlkIG9iamVjdDogXCIgKyBKU09OLnN0cmluZ2lmeShzdGFydFBvcykgKyBcIilcIjtcbiAgICAgICAgaWYgKHRoaXMudGhyb3dPbkludmFsaWRPYmplY3QpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICAgIHZhciByZWYgPSB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3RIZWFkZXIoKTtcbiAgICAgICAgY29uc29sZS53YXJuKFwiSW52YWxpZCBvYmplY3QgcmVmOiBcIiArIHJlZik7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICB2YXIgZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVuZG9iaikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZmFpbGVkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhaWxlZClcbiAgICAgICAgICAgIHRocm93IG5ldyBQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yKHN0YXJ0UG9zKTtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCkgLSBLZXl3b3Jkcy5lbmRvYmoubGVuZ3RoO1xuICAgICAgICB2YXIgb2JqZWN0ID0gUERGSW52YWxpZE9iamVjdC5vZih0aGlzLmJ5dGVzLnNsaWNlKHN0YXJ0LCBlbmQpKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmFzc2lnbihyZWYsIG9iamVjdCk7XG4gICAgICAgIHJldHVybiByZWY7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnBhcnNlSW5kaXJlY3RPYmplY3RzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCwgZV8xO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKCF0aGlzLmJ5dGVzLmRvbmUoKSAmJiBJc0RpZ2l0W3RoaXMuYnl0ZXMucGVlaygpXSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE9mZnNldCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMiwgNCwgLCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3QoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBZGQgdHJhY2luZy9sb2dnaW5nIG1lY2hhbmlzbSB0byB0cmFjayB3aGVuIHRoaXMgaGFwcGVucyFcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKGluaXRpYWxPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlUb1BhcnNlSW52YWxpZEluZGlyZWN0T2JqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDYW4gdGhpcyBiZSBkb25lIG9ubHkgd2hlbiBuZWVkZWQsIHRvIGF2b2lkIGhhcm1pbmcgcGVyZm9ybWFuY2U/XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBKaWJiZXJpc2goKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRXYWl0Rm9yVGljaygpKSByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUubWF5YmVQYXJzZUNyb3NzUmVmU2VjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMueHJlZikpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgb2JqZWN0TnVtYmVyID0gLTE7XG4gICAgICAgIHZhciB4cmVmID0gUERGQ3Jvc3NSZWZTZWN0aW9uLmNyZWF0ZUVtcHR5KCk7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkgJiYgSXNEaWdpdFt0aGlzLmJ5dGVzLnBlZWsoKV0pIHtcbiAgICAgICAgICAgIHZhciBmaXJzdEludCA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgdmFyIHNlY29uZEludCA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMubiB8fCBieXRlID09PSBDaGFyQ29kZXMuZikge1xuICAgICAgICAgICAgICAgIHZhciByZWYgPSBQREZSZWYub2Yob2JqZWN0TnVtYmVyLCBzZWNvbmRJbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ5dGVzLm5leHQoKSA9PT0gQ2hhckNvZGVzLm4pIHtcbiAgICAgICAgICAgICAgICAgICAgeHJlZi5hZGRFbnRyeShyZWYsIGZpcnN0SW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuY29udGV4dC5kZWxldGUocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgeHJlZi5hZGREZWxldGVkRW50cnkocmVmLCBmaXJzdEludCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9iamVjdE51bWJlciArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TnVtYmVyID0gZmlyc3RJbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geHJlZjtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUubWF5YmVQYXJzZVRyYWlsZXJEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy50cmFpbGVyKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5wYXJzZURpY3QoKTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnRleHQudHJhaWxlckluZm8gPSB7XG4gICAgICAgICAgICBSb290OiBkaWN0LmdldChQREZOYW1lLm9mKCdSb290JykpIHx8IGNvbnRleHQudHJhaWxlckluZm8uUm9vdCxcbiAgICAgICAgICAgIEVuY3J5cHQ6IGRpY3QuZ2V0KFBERk5hbWUub2YoJ0VuY3J5cHQnKSkgfHwgY29udGV4dC50cmFpbGVySW5mby5FbmNyeXB0LFxuICAgICAgICAgICAgSW5mbzogZGljdC5nZXQoUERGTmFtZS5vZignSW5mbycpKSB8fCBjb250ZXh0LnRyYWlsZXJJbmZvLkluZm8sXG4gICAgICAgICAgICBJRDogZGljdC5nZXQoUERGTmFtZS5vZignSUQnKSkgfHwgY29udGV4dC50cmFpbGVySW5mby5JRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUubWF5YmVQYXJzZVRyYWlsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0YXJ0eHJlZikpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlKCk7XG4gICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVvZik7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lb2YpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgcmV0dXJuIFBERlRyYWlsZXIuZm9yTGFzdENyb3NzUmVmU2VjdGlvbk9mZnNldChvZmZzZXQpO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5wYXJzZURvY3VtZW50U2VjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3RzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heWJlUGFyc2VDcm9zc1JlZlNlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF5YmVQYXJzZVRyYWlsZXJEaWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heWJlUGFyc2VUcmFpbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDYW4gdGhpcyBiZSBkb25lIG9ubHkgd2hlbiBuZWVkZWQsIHRvIGF2b2lkIGhhcm1pbmcgcGVyZm9ybWFuY2U/XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBKaWJiZXJpc2goKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgbmVjZXNzYXJ5IGZvciB2YWxpZCBQREYgZmlsZXMuIEJ1dCBzb21lIGludmFsaWQgUERGc1xuICAgICAqIGNvbnRhaW4gamliYmVyaXNoIGluIGJldHdlZW4gaW5kaXJlY3Qgb2JqZWN0cy4gVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG9cbiAgICAgKiBza2lwIHBhc3QgdGhhdCBqaWJiZXJpc2gsIHNob3VsZCBpdCBleGlzdCwgdW50aWwgaXQgcmVhY2hlcyB0aGUgbmV4dFxuICAgICAqIGluZGlyZWN0IG9iamVjdCBoZWFkZXIsIGFuIHhyZWYgdGFibGUgc2VjdGlvbiwgb3IgdGhlIGZpbGUgdHJhaWxlci5cbiAgICAgKi9cbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnNraXBKaWJiZXJpc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgdmFyIGlzQWxwaGFOdW1lcmljID0gYnl0ZSA+PSBDaGFyQ29kZXMuU3BhY2UgJiYgYnl0ZSA8PSBDaGFyQ29kZXMuVGlsZGU7XG4gICAgICAgICAgICBpZiAoaXNBbHBoYU51bWVyaWMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMueHJlZikgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMudHJhaWxlcikgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RhcnR4cmVmKSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoSW5kaXJlY3RPYmplY3RIZWFkZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhpbml0aWFsT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNraXBzIHRoZSBiaW5hcnkgY29tbWVudCBmb2xsb3dpbmcgYSBQREYgaGVhZGVyLiBUaGUgc3BlY2lmaWNhdGlvblxuICAgICAqIGRlZmluZXMgdGhpcyBiaW5hcnkgY29tbWVudCAoc2VjdGlvbiA3LjUuMiBGaWxlIEhlYWRlcikgYXMgYSBzZXF1ZW5jZSBvZiA0XG4gICAgICogb3IgbW9yZSBieXRlcyB0aGF0IGFyZSAxMjggb3IgZ3JlYXRlciwgYW5kIHdoaWNoIGFyZSBwcmVjZWRlZCBieSBhIFwiJVwiLlxuICAgICAqXG4gICAgICogVGhpcyB3b3VsZCBpbXBseSB0aGF0IHRvIHN0cmlwIG91dCB0aGlzIGJpbmFyeSBjb21tZW50LCB3ZSBjb3VsZCBjaGVjayBmb3JcbiAgICAgKiBhIHNlcXVlbmNlIG9mIGJ5dGVzIHN0YXJ0aW5nIHdpdGggXCIlXCIsIGFuZCByZW1vdmUgYWxsIHN1YnNlcXVlbnQgYnl0ZXMgdGhhdFxuICAgICAqIGFyZSAxMjggb3IgZ3JlYXRlci4gVGhpcyB3b3JrcyBmb3IgbWFueSBkb2N1bWVudHMgdGhhdCBwcm9wZXJseSBjb21wbHkgd2l0aFxuICAgICAqIHRoZSBzcGVjLiBCdXQgaW4gdGhlIHdpbGQsIHRoZXJlIGFyZSBQREZzIHRoYXQgb21pdCB0aGUgbGVhZGluZyBcIiVcIiwgYW5kXG4gICAgICogaW5jbHVkZSBieXRlcyB0aGF0IGFyZSBsZXNzIHRoYW4gMTI4IChlLmcuIDAgb3IgMSkuIFNvIGluIG9yZGVyIHRvIHBhcnNlXG4gICAgICogdGhlc2UgaGVhZGVycyBjb3JyZWN0bHksIHdlIGp1c3QgdGhyb3cgb3V0IGFsbCBieXRlcyBsZWFkaW5nIHVwIHRvIHRoZVxuICAgICAqIGZpcnN0IGluZGlyZWN0IG9iamVjdCBoZWFkZXIuXG4gICAgICovXG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5za2lwQmluYXJ5SGVhZGVyQ29tbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgICAgICB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3RIZWFkZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKGluaXRpYWxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZQYXJzZXIuZm9yQnl0ZXNXaXRoT3B0aW9ucyA9IGZ1bmN0aW9uIChwZGZCeXRlcywgb2JqZWN0c1BlclRpY2ssIHRocm93T25JbnZhbGlkT2JqZWN0LCBjYXBOdW1iZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFyc2VyKHBkZkJ5dGVzLCBvYmplY3RzUGVyVGljaywgdGhyb3dPbkludmFsaWRPYmplY3QsIGNhcE51bWJlcnMpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlBhcnNlcjtcbn0oUERGT2JqZWN0UGFyc2VyKSk7XG5leHBvcnQgZGVmYXVsdCBQREZQYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZQYXJzZXIuanMubWFwIiwiaW1wb3J0IHsgUmVwYXJzZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBCeXRlU3RyZWFtIGZyb20gXCIuL0J5dGVTdHJlYW1cIjtcbnZhciBQREZYUmVmU3RyZWFtUGFyc2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERlhSZWZTdHJlYW1QYXJzZXIocmF3U3RyZWFtKSB7XG4gICAgICAgIHRoaXMuYWxyZWFkeVBhcnNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRpY3QgPSByYXdTdHJlYW0uZGljdDtcbiAgICAgICAgdGhpcy5ieXRlcyA9IEJ5dGVTdHJlYW0uZnJvbVBERlJhd1N0cmVhbShyYXdTdHJlYW0pO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmRpY3QuY29udGV4dDtcbiAgICAgICAgdmFyIFNpemUgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1NpemUnKSwgUERGTnVtYmVyKTtcbiAgICAgICAgdmFyIEluZGV4ID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdJbmRleCcpKTtcbiAgICAgICAgaWYgKEluZGV4IGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2VjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEluZGV4LnNpemUoKTsgaWR4IDwgbGVuOyBpZHggKz0gMikge1xuICAgICAgICAgICAgICAgIHZhciBmaXJzdE9iamVjdE51bWJlciA9IEluZGV4Lmxvb2t1cChpZHggKyAwLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgdmFyIGxlbmd0aF8xID0gSW5kZXgubG9va3VwKGlkeCArIDEsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNlY3Rpb25zLnB1c2goeyBmaXJzdE9iamVjdE51bWJlcjogZmlyc3RPYmplY3ROdW1iZXIsIGxlbmd0aDogbGVuZ3RoXzEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNlY3Rpb25zID0gW3sgZmlyc3RPYmplY3ROdW1iZXI6IDAsIGxlbmd0aDogU2l6ZS5hc051bWJlcigpIH1dO1xuICAgICAgICB9XG4gICAgICAgIHZhciBXID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdXJyksIFBERkFycmF5KTtcbiAgICAgICAgdGhpcy5ieXRlV2lkdGhzID0gWy0xLCAtMSwgLTFdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBXLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdGhpcy5ieXRlV2lkdGhzW2lkeF0gPSBXLmxvb2t1cChpZHgsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBQREZYUmVmU3RyZWFtUGFyc2VyLnByb3RvdHlwZS5wYXJzZUludG9Db250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5hbHJlYWR5UGFyc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVwYXJzZUVycm9yKCdQREZYUmVmU3RyZWFtUGFyc2VyJywgJ3BhcnNlSW50b0NvbnRleHQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFscmVhZHlQYXJzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRleHQudHJhaWxlckluZm8gPSB7XG4gICAgICAgICAgICBSb290OiB0aGlzLmRpY3QuZ2V0KFBERk5hbWUub2YoJ1Jvb3QnKSksXG4gICAgICAgICAgICBFbmNyeXB0OiB0aGlzLmRpY3QuZ2V0KFBERk5hbWUub2YoJ0VuY3J5cHQnKSksXG4gICAgICAgICAgICBJbmZvOiB0aGlzLmRpY3QuZ2V0KFBERk5hbWUub2YoJ0luZm8nKSksXG4gICAgICAgICAgICBJRDogdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdJRCcpKSxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLnBhcnNlRW50cmllcygpO1xuICAgICAgICAvLyBmb3IgKGxldCBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAvLyBjb25zdCBlbnRyeSA9IGVudHJpZXNbaWR4XTtcbiAgICAgICAgLy8gaWYgKGVudHJ5LmRlbGV0ZWQpIHRoaXMuY29udGV4dC5kZWxldGUoZW50cnkucmVmKTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gZW50cmllcztcbiAgICB9O1xuICAgIFBERlhSZWZTdHJlYW1QYXJzZXIucHJvdG90eXBlLnBhcnNlRW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5ieXRlV2lkdGhzLCB0eXBlRmllbGRXaWR0aCA9IF9hWzBdLCBvZmZzZXRGaWVsZFdpZHRoID0gX2FbMV0sIGdlbkZpZWxkV2lkdGggPSBfYVsyXTtcbiAgICAgICAgZm9yICh2YXIgc3Vic2VjdGlvbklkeCA9IDAsIHN1YnNlY3Rpb25MZW4gPSB0aGlzLnN1YnNlY3Rpb25zLmxlbmd0aDsgc3Vic2VjdGlvbklkeCA8IHN1YnNlY3Rpb25MZW47IHN1YnNlY3Rpb25JZHgrKykge1xuICAgICAgICAgICAgdmFyIF9iID0gdGhpcy5zdWJzZWN0aW9uc1tzdWJzZWN0aW9uSWR4XSwgZmlyc3RPYmplY3ROdW1iZXIgPSBfYi5maXJzdE9iamVjdE51bWJlciwgbGVuZ3RoXzIgPSBfYi5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBvYmpJZHggPSAwOyBvYmpJZHggPCBsZW5ndGhfMjsgb2JqSWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdHlwZUZpZWxkV2lkdGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICh0eXBlIDw8IDgpIHwgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9mZnNldEZpZWxkV2lkdGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA8PCA4KSB8IHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZ2VuZXJhdGlvbk51bWJlciA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2VuRmllbGRXaWR0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uTnVtYmVyID0gKGdlbmVyYXRpb25OdW1iZXIgPDwgOCkgfCB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgYHR5cGVgIGZpZWxkIGlzIGFic2VudCwgaXQgZGVmYXVsdHMgdG8gMVxuICAgICAgICAgICAgICAgIGlmICh0eXBlRmllbGRXaWR0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDE7XG4gICAgICAgICAgICAgICAgdmFyIG9iamVjdE51bWJlciA9IGZpcnN0T2JqZWN0TnVtYmVyICsgb2JqSWR4O1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmVmOiBQREZSZWYub2Yob2JqZWN0TnVtYmVyLCBnZW5lcmF0aW9uTnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZWQ6IHR5cGUgPT09IDAsXG4gICAgICAgICAgICAgICAgICAgIGluT2JqZWN0U3RyZWFtOiB0eXBlID09PSAyLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cmllcztcbiAgICB9O1xuICAgIFBERlhSZWZTdHJlYW1QYXJzZXIuZm9yU3RyZWFtID0gZnVuY3Rpb24gKHJhd1N0cmVhbSkge1xuICAgICAgICByZXR1cm4gbmV3IFBERlhSZWZTdHJlYW1QYXJzZXIocmF3U3RyZWFtKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZYUmVmU3RyZWFtUGFyc2VyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlhSZWZTdHJlYW1QYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZYUmVmU3RyZWFtUGFyc2VyLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBUaGUgQXNjaWk4NVN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBBc2NpaTg1U3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IERlY29kZVN0cmVhbSBmcm9tIFwiLi9EZWNvZGVTdHJlYW1cIjtcbnZhciBpc1NwYWNlID0gZnVuY3Rpb24gKGNoKSB7XG4gICAgcmV0dXJuIGNoID09PSAweDIwIHx8IGNoID09PSAweDA5IHx8IGNoID09PSAweDBkIHx8IGNoID09PSAweDBhO1xufTtcbnZhciBBc2NpaTg1U3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhBc2NpaTg1U3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFzY2lpODVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtYXliZUxlbmd0aCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBfdGhpcy5pbnB1dCA9IG5ldyBVaW50OEFycmF5KDUpO1xuICAgICAgICAvLyBNb3N0IHN0cmVhbXMgaW5jcmVhc2UgaW4gc2l6ZSB3aGVuIGRlY29kZWQsIGJ1dCBBc2NpaTg1IHN0cmVhbXNcbiAgICAgICAgLy8gdHlwaWNhbGx5IHNocmluayBieSB+MjAlLlxuICAgICAgICBpZiAobWF5YmVMZW5ndGgpIHtcbiAgICAgICAgICAgIG1heWJlTGVuZ3RoID0gMC44ICogbWF5YmVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBBc2NpaTg1U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBUSUxEQV9DSEFSID0gMHg3ZTsgLy8gJ34nXG4gICAgICAgIHZhciBaX0xPV0VSX0NIQVIgPSAweDdhOyAvLyAneidcbiAgICAgICAgdmFyIEVPRiA9IC0xO1xuICAgICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW07XG4gICAgICAgIHZhciBjID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgd2hpbGUgKGlzU3BhY2UoYykpIHtcbiAgICAgICAgICAgIGMgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjID09PSBFT0YgfHwgYyA9PT0gVElMREFfQ0hBUikge1xuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgdmFyIGJ1ZmZlcjtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIC8vIHNwZWNpYWwgY29kZSBmb3IgelxuICAgICAgICBpZiAoYyA9PT0gWl9MT1dFUl9DSEFSKSB7XG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyA0KTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gNDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IHRoaXMuaW5wdXQ7XG4gICAgICAgICAgICBpbnB1dFswXSA9IGM7XG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgKytpKSB7XG4gICAgICAgICAgICAgICAgYyA9IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGlzU3BhY2UoYykpIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlucHV0W2ldID0gYztcbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgaSAtIDEpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gaSAtIDE7XG4gICAgICAgICAgICAvLyBwYXJ0aWFsIGVuZGluZztcbiAgICAgICAgICAgIGlmIChpIDwgNSkge1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgNTsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0W2ldID0gMHgyMSArIDg0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdCA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7XG4gICAgICAgICAgICAgICAgdCA9IHQgKiA4NSArIChpbnB1dFtpXSAtIDB4MjEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMzsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSB0ICYgMHhmZjtcbiAgICAgICAgICAgICAgICB0ID4+PSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQXNjaWk4NVN0cmVhbTtcbn0oRGVjb2RlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBBc2NpaTg1U3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNjaWk4NVN0cmVhbS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIEFzY2lpSGV4U3RyZWFtIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBUeXBlU2NyaXB0IHBvcnQgb2YgdGhlXG4gKiBKYXZhU2NyaXB0IEFzY2lpSGV4U3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IERlY29kZVN0cmVhbSBmcm9tIFwiLi9EZWNvZGVTdHJlYW1cIjtcbnZhciBBc2NpaUhleFN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXNjaWlIZXhTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQXNjaWlIZXhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtYXliZUxlbmd0aCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBfdGhpcy5maXJzdERpZ2l0ID0gLTE7XG4gICAgICAgIC8vIE1vc3Qgc3RyZWFtcyBpbmNyZWFzZSBpbiBzaXplIHdoZW4gZGVjb2RlZCwgYnV0IEFzY2lpSGV4IHN0cmVhbXMgc2hyaW5rXG4gICAgICAgIC8vIGJ5IDUwJS5cbiAgICAgICAgaWYgKG1heWJlTGVuZ3RoKSB7XG4gICAgICAgICAgICBtYXliZUxlbmd0aCA9IDAuNSAqIG1heWJlTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQXNjaWlIZXhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFVQU1RSRUFNX0JMT0NLX1NJWkUgPSA4MDAwO1xuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLnN0cmVhbS5nZXRCeXRlcyhVUFNUUkVBTV9CTE9DS19TSVpFKTtcbiAgICAgICAgaWYgKCFieXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWF4RGVjb2RlTGVuZ3RoID0gKGJ5dGVzLmxlbmd0aCArIDEpID4+IDE7XG4gICAgICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIG1heERlY29kZUxlbmd0aCk7XG4gICAgICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgdmFyIGZpcnN0RGlnaXQgPSB0aGlzLmZpcnN0RGlnaXQ7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGJ5dGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaCA9IGJ5dGVzW2ldO1xuICAgICAgICAgICAgdmFyIGRpZ2l0ID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSkge1xuICAgICAgICAgICAgICAgIC8vICcwJy0nOSdcbiAgICAgICAgICAgICAgICBkaWdpdCA9IGNoICYgMHgwZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChjaCA+PSAweDQxICYmIGNoIDw9IDB4NDYpIHx8IChjaCA+PSAweDYxICYmIGNoIDw9IDB4NjYpKSB7XG4gICAgICAgICAgICAgICAgLy8gJ0EnLSdaJywgJ2EnLSd6J1xuICAgICAgICAgICAgICAgIGRpZ2l0ID0gKGNoICYgMHgwZikgKyA5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT09IDB4M2UpIHtcbiAgICAgICAgICAgICAgICAvLyAnPidcbiAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yaW5nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3REaWdpdCA8IDApIHtcbiAgICAgICAgICAgICAgICBmaXJzdERpZ2l0ID0gZGlnaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gKGZpcnN0RGlnaXQgPDwgNCkgfCBkaWdpdDtcbiAgICAgICAgICAgICAgICBmaXJzdERpZ2l0ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpcnN0RGlnaXQgPj0gMCAmJiB0aGlzLmVvZikge1xuICAgICAgICAgICAgLy8gaW5jb21wbGV0ZSBieXRlXG4gICAgICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gZmlyc3REaWdpdCA8PCA0O1xuICAgICAgICAgICAgZmlyc3REaWdpdCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyc3REaWdpdCA9IGZpcnN0RGlnaXQ7XG4gICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICAgIH07XG4gICAgcmV0dXJuIEFzY2lpSGV4U3RyZWFtO1xufShEZWNvZGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IEFzY2lpSGV4U3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNjaWlIZXhTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBTdHJlYW0gZnJvbSBcIi4vU3RyZWFtXCI7XG4vKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIERlY29kZVN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBEZWNvZGVTdHJlYW0gY2xhc3MgaW4gTW96aWxsYSdzIHBkZi5qcyBwcm9qZWN0LCBtYWRlIGF2YWlsYWJsZVxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2UgbGljZW5zZS5cbiAqL1xuLy8gTG90cyBvZiBEZWNvZGVTdHJlYW1zIGFyZSBjcmVhdGVkIHdob3NlIGJ1ZmZlcnMgYXJlIG5ldmVyIHVzZWQuICBGb3IgdGhlc2Vcbi8vIHdlIHNoYXJlIGEgc2luZ2xlIGVtcHR5IGJ1ZmZlci4gVGhpcyBpcyAoYSkgc3BhY2UtZWZmaWNpZW50IGFuZCAoYikgYXZvaWRzXG4vLyBoYXZpbmcgc3BlY2lhbCBjYXNlcyB0aGF0IHdvdWxkIGJlIHJlcXVpcmVkIGlmIHdlIHVzZWQgfG51bGx8IGZvciBhbiBlbXB0eVxuLy8gYnVmZmVyLlxudmFyIGVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG4vKipcbiAqIFN1cGVyIGNsYXNzIGZvciB0aGUgZGVjb2Rpbmcgc3RyZWFtc1xuICovXG52YXIgRGVjb2RlU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlY29kZVN0cmVhbShtYXliZU1pbkJ1ZmZlckxlbmd0aCkge1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5lb2YgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBlbXB0eUJ1ZmZlcjtcbiAgICAgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggPSA1MTI7XG4gICAgICAgIGlmIChtYXliZU1pbkJ1ZmZlckxlbmd0aCkge1xuICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZmlyc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgYXMgYmlnIGFzIG1heWJlTWluQnVmZmVyTGVuZ3RoLlxuICAgICAgICAgICAgd2hpbGUgKHRoaXMubWluQnVmZmVyTGVuZ3RoIDwgbWF5YmVNaW5CdWZmZXJMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbkJ1ZmZlckxlbmd0aCAqPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWNvZGVTdHJlYW0ucHJvdG90eXBlLCBcImlzRW1wdHlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHdoaWxlICghdGhpcy5lb2YgJiYgdGhpcy5idWZmZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyTGVuZ3RoID09PSAwO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5nZXRCeXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICh0aGlzLmJ1ZmZlckxlbmd0aCA8PSBwb3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVvZikge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zKytdO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5nZXRVaW50MTYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgaWYgKGIwID09PSAtMSB8fCBiMSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLmdldEludDMyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMiA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjMgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLmdldEJ5dGVzID0gZnVuY3Rpb24gKGxlbmd0aCwgZm9yY2VDbGFtcGVkKSB7XG4gICAgICAgIGlmIChmb3JjZUNsYW1wZWQgPT09IHZvaWQgMCkgeyBmb3JjZUNsYW1wZWQgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgZW5kO1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIGxlbmd0aCk7XG4gICAgICAgICAgICBlbmQgPSBwb3MgKyBsZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoIXRoaXMuZW9mICYmIHRoaXMuYnVmZmVyTGVuZ3RoIDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBidWZFbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPiBidWZFbmQpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBidWZFbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICB2YXIgc3ViYXJyYXkgPSB0aGlzLmJ1ZmZlci5zdWJhcnJheShwb3MsIGVuZCk7XG4gICAgICAgIC8vIGB0aGlzLmJ1ZmZlcmAgaXMgZWl0aGVyIGEgYFVpbnQ4QXJyYXlgIG9yIGBVaW50OENsYW1wZWRBcnJheWAgaGVyZS5cbiAgICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCAmJiAhKHN1YmFycmF5IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpXG4gICAgICAgICAgICA/IG5ldyBVaW50OENsYW1wZWRBcnJheShzdWJhcnJheSlcbiAgICAgICAgICAgIDogc3ViYXJyYXk7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnBlZWtCeXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGVla2VkQnl0ZSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB0aGlzLnBvcy0tO1xuICAgICAgICByZXR1cm4gcGVla2VkQnl0ZTtcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUucGVla0J5dGVzID0gZnVuY3Rpb24gKGxlbmd0aCwgZm9yY2VDbGFtcGVkKSB7XG4gICAgICAgIGlmIChmb3JjZUNsYW1wZWQgPT09IHZvaWQgMCkgeyBmb3JjZUNsYW1wZWQgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkKTtcbiAgICAgICAgdGhpcy5wb3MgLT0gYnl0ZXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiAobikge1xuICAgICAgICBpZiAoIW4pIHtcbiAgICAgICAgICAgIG4gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zICs9IG47XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLm1ha2VTdWJTdHJlYW0gPSBmdW5jdGlvbiAoc3RhcnQsIGxlbmd0aCAvKiBkaWN0ICovKSB7XG4gICAgICAgIHZhciBlbmQgPSBzdGFydCArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyTGVuZ3RoIDw9IGVuZCAmJiAhdGhpcy5lb2YpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5idWZmZXIsIHN0YXJ0LCBsZW5ndGggLyogZGljdCAqLyk7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmVvZilcbiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLCB0aGlzLmJ1ZmZlckxlbmd0aCk7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAncmVhZEJsb2NrJyk7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLmVuc3VyZUJ1ZmZlciA9IGZ1bmN0aW9uIChyZXF1ZXN0ZWQpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgICBpZiAocmVxdWVzdGVkIDw9IGJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzaXplID0gdGhpcy5taW5CdWZmZXJMZW5ndGg7XG4gICAgICAgIHdoaWxlIChzaXplIDwgcmVxdWVzdGVkKSB7XG4gICAgICAgICAgICBzaXplICo9IDI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJ1ZmZlcjIgPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICAgICAgYnVmZmVyMi5zZXQoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuICh0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjIpO1xuICAgIH07XG4gICAgcmV0dXJuIERlY29kZVN0cmVhbTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBEZWNvZGVTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZWNvZGVTdHJlYW0uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAxOTk2LTIwMDMgR2x5cGggJiBDb2csIExMQ1xuICpcbiAqIFRoZSBmbGF0ZSBzdHJlYW0gaW1wbGVtZW50YXRpb24gY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIEphdmFTY3JpcHQgcG9ydFxuICogb2YgWFBERidzIGltcGxlbWVudGF0aW9uLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZVxuICogbGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG4vKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIEZsYXRlU3RyZWFtIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBUeXBlU2NyaXB0IHBvcnQgb2YgdGhlXG4gKiBKYXZhU2NyaXB0IEZsYXRlU3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbi8qIHRzbGludDpkaXNhYmxlICBuby1jb25kaXRpb25hbC1hc3NpZ25tZW50ICovXG5pbXBvcnQgRGVjb2RlU3RyZWFtIGZyb20gXCIuL0RlY29kZVN0cmVhbVwiO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgY29kZUxlbkNvZGVNYXAgPSBuZXcgSW50MzJBcnJheShbXG4gICAgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNVxuXSk7XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBsZW5ndGhEZWNvZGUgPSBuZXcgSW50MzJBcnJheShbXG4gICAgMHgwMDAwMywgMHgwMDAwNCwgMHgwMDAwNSwgMHgwMDAwNiwgMHgwMDAwNywgMHgwMDAwOCwgMHgwMDAwOSwgMHgwMDAwYSxcbiAgICAweDEwMDBiLCAweDEwMDBkLCAweDEwMDBmLCAweDEwMDExLCAweDIwMDEzLCAweDIwMDE3LCAweDIwMDFiLCAweDIwMDFmLFxuICAgIDB4MzAwMjMsIDB4MzAwMmIsIDB4MzAwMzMsIDB4MzAwM2IsIDB4NDAwNDMsIDB4NDAwNTMsIDB4NDAwNjMsIDB4NDAwNzMsXG4gICAgMHg1MDA4MywgMHg1MDBhMywgMHg1MDBjMywgMHg1MDBlMywgMHgwMDEwMiwgMHgwMDEwMiwgMHgwMDEwMlxuXSk7XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBkaXN0RGVjb2RlID0gbmV3IEludDMyQXJyYXkoW1xuICAgIDB4MDAwMDEsIDB4MDAwMDIsIDB4MDAwMDMsIDB4MDAwMDQsIDB4MTAwMDUsIDB4MTAwMDcsIDB4MjAwMDksIDB4MjAwMGQsXG4gICAgMHgzMDAxMSwgMHgzMDAxOSwgMHg0MDAyMSwgMHg0MDAzMSwgMHg1MDA0MSwgMHg1MDA2MSwgMHg2MDA4MSwgMHg2MDBjMSxcbiAgICAweDcwMTAxLCAweDcwMTgxLCAweDgwMjAxLCAweDgwMzAxLCAweDkwNDAxLCAweDkwNjAxLCAweGEwODAxLCAweGEwYzAxLFxuICAgIDB4YjEwMDEsIDB4YjE4MDEsIDB4YzIwMDEsIDB4YzMwMDEsIDB4ZDQwMDEsIDB4ZDYwMDFcbl0pO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgZml4ZWRMaXRDb2RlVGFiID0gW25ldyBJbnQzMkFycmF5KFtcbiAgICAgICAgMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMCxcbiAgICAgICAgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMCwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMCxcbiAgICAgICAgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MCwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMCxcbiAgICAgICAgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMCwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMCxcbiAgICAgICAgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOCxcbiAgICAgICAgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOCwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOCxcbiAgICAgICAgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OCwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOCxcbiAgICAgICAgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOCwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOCxcbiAgICAgICAgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNCxcbiAgICAgICAgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNCwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNCxcbiAgICAgICAgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NCwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNCxcbiAgICAgICAgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNCwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNCxcbiAgICAgICAgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjYyxcbiAgICAgICAgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhYywgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlYyxcbiAgICAgICAgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5YywgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkYyxcbiAgICAgICAgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiYywgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmYyxcbiAgICAgICAgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMixcbiAgICAgICAgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMiwgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMixcbiAgICAgICAgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MiwgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMixcbiAgICAgICAgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMiwgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMixcbiAgICAgICAgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYSxcbiAgICAgICAgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYSwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYSxcbiAgICAgICAgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YSwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYSxcbiAgICAgICAgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYSwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYSxcbiAgICAgICAgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNixcbiAgICAgICAgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNiwgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNixcbiAgICAgICAgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NiwgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNixcbiAgICAgICAgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNiwgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNixcbiAgICAgICAgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZSxcbiAgICAgICAgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZSwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZSxcbiAgICAgICAgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZSwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZSxcbiAgICAgICAgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZSwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZSxcbiAgICAgICAgMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMSxcbiAgICAgICAgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMSwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMSxcbiAgICAgICAgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MSwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMSxcbiAgICAgICAgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMSwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMSxcbiAgICAgICAgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOSxcbiAgICAgICAgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOSwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOSxcbiAgICAgICAgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OSwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOSxcbiAgICAgICAgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOSwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOSxcbiAgICAgICAgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNSxcbiAgICAgICAgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNSwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNSxcbiAgICAgICAgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NSwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNSxcbiAgICAgICAgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNSwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNSxcbiAgICAgICAgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjZCxcbiAgICAgICAgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhZCwgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlZCxcbiAgICAgICAgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5ZCwgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkZCxcbiAgICAgICAgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiZCwgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmZCxcbiAgICAgICAgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMyxcbiAgICAgICAgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMywgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMyxcbiAgICAgICAgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MywgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMyxcbiAgICAgICAgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMywgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMyxcbiAgICAgICAgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYixcbiAgICAgICAgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYiwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYixcbiAgICAgICAgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YiwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYixcbiAgICAgICAgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYiwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYixcbiAgICAgICAgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNyxcbiAgICAgICAgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNywgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNyxcbiAgICAgICAgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NywgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNyxcbiAgICAgICAgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNywgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNyxcbiAgICAgICAgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZixcbiAgICAgICAgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZiwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZixcbiAgICAgICAgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZiwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZixcbiAgICAgICAgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZiwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZlxuICAgIF0pLCA5XTtcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGZpeGVkRGlzdENvZGVUYWIgPSBbbmV3IEludDMyQXJyYXkoW1xuICAgICAgICAweDUwMDAwLCAweDUwMDEwLCAweDUwMDA4LCAweDUwMDE4LCAweDUwMDA0LCAweDUwMDE0LCAweDUwMDBjLCAweDUwMDFjLFxuICAgICAgICAweDUwMDAyLCAweDUwMDEyLCAweDUwMDBhLCAweDUwMDFhLCAweDUwMDA2LCAweDUwMDE2LCAweDUwMDBlLCAweDAwMDAwLFxuICAgICAgICAweDUwMDAxLCAweDUwMDExLCAweDUwMDA5LCAweDUwMDE5LCAweDUwMDA1LCAweDUwMDE1LCAweDUwMDBkLCAweDUwMDFkLFxuICAgICAgICAweDUwMDAzLCAweDUwMDEzLCAweDUwMDBiLCAweDUwMDFiLCAweDUwMDA3LCAweDUwMDE3LCAweDUwMDBmLCAweDAwMDAwXG4gICAgXSksIDVdO1xudmFyIEZsYXRlU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGbGF0ZVN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGbGF0ZVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIHZhciBjbWYgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgZmxnID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgaWYgKGNtZiA9PT0gLTEgfHwgZmxnID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtOiBcIiArIGNtZiArIFwiLCBcIiArIGZsZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChjbWYgJiAweDBmKSAhPT0gMHgwOCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiBcIiArIGNtZiArIFwiLCBcIiArIGZsZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCgoY21mIDw8IDgpICsgZmxnKSAlIDMxICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgRkNIRUNLIGluIGZsYXRlIHN0cmVhbTogXCIgKyBjbWYgKyBcIiwgXCIgKyBmbGcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmbGcgJiAweDIwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGRElDVCBiaXQgc2V0IGluIGZsYXRlIHN0cmVhbTogXCIgKyBjbWYgKyBcIiwgXCIgKyBmbGcpO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmNvZGVTaXplID0gMDtcbiAgICAgICAgX3RoaXMuY29kZUJ1ZiA9IDA7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ1ZmZlcjtcbiAgICAgICAgdmFyIGxlbjtcbiAgICAgICAgdmFyIHN0ciA9IHRoaXMuc3RyZWFtO1xuICAgICAgICAvLyByZWFkIGJsb2NrIGhlYWRlclxuICAgICAgICB2YXIgaGRyID0gdGhpcy5nZXRCaXRzKDMpO1xuICAgICAgICBpZiAoaGRyICYgMSkge1xuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGhkciA+Pj0gMTtcbiAgICAgICAgaWYgKGhkciA9PT0gMCkge1xuICAgICAgICAgICAgLy8gdW5jb21wcmVzc2VkIGJsb2NrXG4gICAgICAgICAgICB2YXIgYiA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBibG9ja0xlbiA9IGI7XG4gICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBibG9ja0xlbiB8PSBiIDw8IDg7XG4gICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2hlY2sgPSBiO1xuICAgICAgICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2sgfD0gYiA8PCA4O1xuICAgICAgICAgICAgaWYgKGNoZWNrICE9PSAofmJsb2NrTGVuICYgMHhmZmZmKSAmJiAoYmxvY2tMZW4gIT09IDAgfHwgY2hlY2sgIT09IDApKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JpbmcgZXJyb3IgZm9yIGJhZCBcImVtcHR5XCIgYmxvY2sgKHNlZSBpc3N1ZSAxMjc3KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIHVuY29tcHJlc3NlZCBibG9jayBsZW5ndGggaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvZGVCdWYgPSAwO1xuICAgICAgICAgICAgdGhpcy5jb2RlU2l6ZSA9IDA7XG4gICAgICAgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBibG9ja0xlbik7XG4gICAgICAgICAgICB2YXIgZW5kID0gYnVmZmVyTGVuZ3RoICsgYmxvY2tMZW47XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGVuZDtcbiAgICAgICAgICAgIGlmIChibG9ja0xlbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChzdHIucGVla0J5dGUoKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBidWZmZXJMZW5ndGg7IG4gPCBlbmQ7ICsrbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltuXSA9IGI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsaXRDb2RlVGFibGU7XG4gICAgICAgIHZhciBkaXN0Q29kZVRhYmxlO1xuICAgICAgICBpZiAoaGRyID09PSAxKSB7XG4gICAgICAgICAgICAvLyBjb21wcmVzc2VkIGJsb2NrLCBmaXhlZCBjb2Rlc1xuICAgICAgICAgICAgbGl0Q29kZVRhYmxlID0gZml4ZWRMaXRDb2RlVGFiO1xuICAgICAgICAgICAgZGlzdENvZGVUYWJsZSA9IGZpeGVkRGlzdENvZGVUYWI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGRyID09PSAyKSB7XG4gICAgICAgICAgICAvLyBjb21wcmVzc2VkIGJsb2NrLCBkeW5hbWljIGNvZGVzXG4gICAgICAgICAgICB2YXIgbnVtTGl0Q29kZXMgPSB0aGlzLmdldEJpdHMoNSkgKyAyNTc7XG4gICAgICAgICAgICB2YXIgbnVtRGlzdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMTtcbiAgICAgICAgICAgIHZhciBudW1Db2RlTGVuQ29kZXMgPSB0aGlzLmdldEJpdHMoNCkgKyA0O1xuICAgICAgICAgICAgLy8gYnVpbGQgdGhlIGNvZGUgbGVuZ3RocyBjb2RlIHRhYmxlXG4gICAgICAgICAgICB2YXIgY29kZUxlbkNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbkNvZGVNYXAubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBpID0gdm9pZCAwO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNvZGVMZW5Db2RlczsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29kZUxlbkNvZGVMZW5ndGhzW2NvZGVMZW5Db2RlTWFwW2ldXSA9IHRoaXMuZ2V0Qml0cygzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjb2RlTGVuQ29kZVRhYiA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbkNvZGVMZW5ndGhzKTtcbiAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSBjb2RlIHRhYmxlc1xuICAgICAgICAgICAgbGVuID0gMDtcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgdmFyIGNvZGVzID0gbnVtTGl0Q29kZXMgKyBudW1EaXN0Q29kZXM7XG4gICAgICAgICAgICB2YXIgY29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheShjb2Rlcyk7XG4gICAgICAgICAgICB2YXIgYml0c0xlbmd0aCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciBiaXRzT2Zmc2V0ID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIHdoYXQgPSB2b2lkIDA7XG4gICAgICAgICAgICB3aGlsZSAoaSA8IGNvZGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGUgPSB0aGlzLmdldENvZGUoY29kZUxlbkNvZGVUYWIpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSAxNikge1xuICAgICAgICAgICAgICAgICAgICBiaXRzTGVuZ3RoID0gMjtcbiAgICAgICAgICAgICAgICAgICAgYml0c09mZnNldCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIHdoYXQgPSBsZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPT09IDE3KSB7XG4gICAgICAgICAgICAgICAgICAgIGJpdHNMZW5ndGggPSAzO1xuICAgICAgICAgICAgICAgICAgICBiaXRzT2Zmc2V0ID0gMztcbiAgICAgICAgICAgICAgICAgICAgd2hhdCA9IGxlbiA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgIGJpdHNMZW5ndGggPSA3O1xuICAgICAgICAgICAgICAgICAgICBiaXRzT2Zmc2V0ID0gMTE7XG4gICAgICAgICAgICAgICAgICAgIHdoYXQgPSBsZW4gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbmd0aHNbaSsrXSA9IGxlbiA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmVwZWF0TGVuZ3RoID0gdGhpcy5nZXRCaXRzKGJpdHNMZW5ndGgpICsgYml0c09mZnNldDtcbiAgICAgICAgICAgICAgICB3aGlsZSAocmVwZWF0TGVuZ3RoLS0gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSB3aGF0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpdENvZGVUYWJsZSA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMuc3ViYXJyYXkoMCwgbnVtTGl0Q29kZXMpKTtcbiAgICAgICAgICAgIGRpc3RDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KG51bUxpdENvZGVzLCBjb2RlcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGJsb2NrIHR5cGUgaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyID0gdGhpcy5idWZmZXI7XG4gICAgICAgIHZhciBsaW1pdCA9IGJ1ZmZlciA/IGJ1ZmZlci5sZW5ndGggOiAwO1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB2YXIgY29kZTEgPSB0aGlzLmdldENvZGUobGl0Q29kZVRhYmxlKTtcbiAgICAgICAgICAgIGlmIChjb2RlMSA8IDI1Nikge1xuICAgICAgICAgICAgICAgIGlmIChwb3MgKyAxID49IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIDEpO1xuICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3MrK10gPSBjb2RlMTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2RlMSA9PT0gMjU2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBwb3M7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZTEgLT0gMjU3O1xuICAgICAgICAgICAgY29kZTEgPSBsZW5ndGhEZWNvZGVbY29kZTFdO1xuICAgICAgICAgICAgdmFyIGNvZGUyID0gY29kZTEgPj4gMTY7XG4gICAgICAgICAgICBpZiAoY29kZTIgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29kZTIgPSB0aGlzLmdldEJpdHMoY29kZTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVuID0gKGNvZGUxICYgMHhmZmZmKSArIGNvZGUyO1xuICAgICAgICAgICAgY29kZTEgPSB0aGlzLmdldENvZGUoZGlzdENvZGVUYWJsZSk7XG4gICAgICAgICAgICBjb2RlMSA9IGRpc3REZWNvZGVbY29kZTFdO1xuICAgICAgICAgICAgY29kZTIgPSBjb2RlMSA+PiAxNjtcbiAgICAgICAgICAgIGlmIChjb2RlMiA+IDApIHtcbiAgICAgICAgICAgICAgICBjb2RlMiA9IHRoaXMuZ2V0Qml0cyhjb2RlMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZGlzdCA9IChjb2RlMSAmIDB4ZmZmZikgKyBjb2RlMjtcbiAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gPj0gbGltaXQpIHtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyBsZW4pO1xuICAgICAgICAgICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbGVuOyArK2ssICsrcG9zKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW3Bvc10gPSBidWZmZXJbcG9zIC0gZGlzdF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRCaXRzID0gZnVuY3Rpb24gKGJpdHMpIHtcbiAgICAgICAgdmFyIHN0ciA9IHRoaXMuc3RyZWFtO1xuICAgICAgICB2YXIgY29kZVNpemUgPSB0aGlzLmNvZGVTaXplO1xuICAgICAgICB2YXIgY29kZUJ1ZiA9IHRoaXMuY29kZUJ1ZjtcbiAgICAgICAgdmFyIGI7XG4gICAgICAgIHdoaWxlIChjb2RlU2l6ZSA8IGJpdHMpIHtcbiAgICAgICAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZUJ1ZiB8PSBiIDw8IGNvZGVTaXplO1xuICAgICAgICAgICAgY29kZVNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBiID0gY29kZUJ1ZiAmICgoMSA8PCBiaXRzKSAtIDEpO1xuICAgICAgICB0aGlzLmNvZGVCdWYgPSBjb2RlQnVmID4+IGJpdHM7XG4gICAgICAgIHRoaXMuY29kZVNpemUgPSBjb2RlU2l6ZSAtPSBiaXRzO1xuICAgICAgICByZXR1cm4gYjtcbiAgICB9O1xuICAgIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRDb2RlID0gZnVuY3Rpb24gKHRhYmxlKSB7XG4gICAgICAgIHZhciBzdHIgPSB0aGlzLnN0cmVhbTtcbiAgICAgICAgdmFyIGNvZGVzID0gdGFibGVbMF07XG4gICAgICAgIHZhciBtYXhMZW4gPSB0YWJsZVsxXTtcbiAgICAgICAgdmFyIGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTtcbiAgICAgICAgdmFyIGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7XG4gICAgICAgIHZhciBiO1xuICAgICAgICB3aGlsZSAoY29kZVNpemUgPCBtYXhMZW4pIHtcbiAgICAgICAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIHByZW1hdHVyZSBlbmQgb2Ygc3RyZWFtLiBjb2RlIG1pZ2h0IGhvd2V2ZXIgc3RpbGwgYmUgdmFsaWQuXG4gICAgICAgICAgICAgICAgLy8gY29kZVNpemUgPCBjb2RlTGVuIGNoZWNrIGJlbG93IGd1YXJkcyBhZ2FpbnN0IGluY29tcGxldGUgY29kZVZhbC5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTtcbiAgICAgICAgICAgIGNvZGVTaXplICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGUgPSBjb2Rlc1tjb2RlQnVmICYgKCgxIDw8IG1heExlbikgLSAxKV07XG4gICAgICAgIGlmICh0eXBlb2YgY29kZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRkxBVEU6JywgY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGVMZW4gPSBjb2RlID4+IDE2O1xuICAgICAgICB2YXIgY29kZVZhbCA9IGNvZGUgJiAweGZmZmY7XG4gICAgICAgIGlmIChjb2RlTGVuIDwgMSB8fCBjb2RlU2l6ZSA8IGNvZGVMZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29kZUJ1ZiA9IGNvZGVCdWYgPj4gY29kZUxlbjtcbiAgICAgICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC0gY29kZUxlbjtcbiAgICAgICAgcmV0dXJuIGNvZGVWYWw7XG4gICAgfTtcbiAgICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2VuZXJhdGVIdWZmbWFuVGFibGUgPSBmdW5jdGlvbiAobGVuZ3Rocykge1xuICAgICAgICB2YXIgbiA9IGxlbmd0aHMubGVuZ3RoO1xuICAgICAgICAvLyBmaW5kIG1heCBjb2RlIGxlbmd0aFxuICAgICAgICB2YXIgbWF4TGVuID0gMDtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChsZW5ndGhzW2ldID4gbWF4TGVuKSB7XG4gICAgICAgICAgICAgICAgbWF4TGVuID0gbGVuZ3Roc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBidWlsZCB0aGUgdGFibGVcbiAgICAgICAgdmFyIHNpemUgPSAxIDw8IG1heExlbjtcbiAgICAgICAgdmFyIGNvZGVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gICAgICAgIGZvciAodmFyIGxlbiA9IDEsIGNvZGUgPSAwLCBza2lwID0gMjsgbGVuIDw9IG1heExlbjsgKytsZW4sIGNvZGUgPDw9IDEsIHNraXAgPDw9IDEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHZhbCA9IDA7IHZhbCA8IG47ICsrdmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aHNbdmFsXSA9PT0gbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJpdC1yZXZlcnNlIHRoZSBjb2RlXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2RlMiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ID0gY29kZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlMiA9IChjb2RlMiA8PCAxKSB8ICh0ICYgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID4+PSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgdGhlIHRhYmxlIGVudHJpZXNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gY29kZTI7IGkgPCBzaXplOyBpICs9IHNraXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzW2ldID0gKGxlbiA8PCAxNikgfCB2YWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKytjb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvZGVzLCBtYXhMZW5dO1xuICAgIH07XG4gICAgcmV0dXJuIEZsYXRlU3RyZWFtO1xufShEZWNvZGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IEZsYXRlU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmxhdGVTdHJlYW0uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBMWldTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgTFpXU3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IERlY29kZVN0cmVhbSBmcm9tIFwiLi9EZWNvZGVTdHJlYW1cIjtcbnZhciBMWldTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKExaV1N0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBMWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgX3RoaXMuY2FjaGVkRGF0YSA9IDA7XG4gICAgICAgIF90aGlzLmJpdHNDYWNoZWQgPSAwO1xuICAgICAgICB2YXIgbWF4THp3RGljdGlvbmFyeVNpemUgPSA0MDk2O1xuICAgICAgICB2YXIgbHp3U3RhdGUgPSB7XG4gICAgICAgICAgICBlYXJseUNoYW5nZTogZWFybHlDaGFuZ2UsXG4gICAgICAgICAgICBjb2RlTGVuZ3RoOiA5LFxuICAgICAgICAgICAgbmV4dENvZGU6IDI1OCxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlWYWx1ZXM6IG5ldyBVaW50OEFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlMZW5ndGhzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLFxuICAgICAgICAgICAgZGljdGlvbmFyeVByZXZDb2RlczogbmV3IFVpbnQxNkFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZTogbmV3IFVpbnQ4QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLFxuICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoOiAwLFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gICAgICAgICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5VmFsdWVzW2ldID0gaTtcbiAgICAgICAgICAgIGx6d1N0YXRlLmRpY3Rpb25hcnlMZW5ndGhzW2ldID0gMTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5sendTdGF0ZSA9IGx6d1N0YXRlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIExaV1N0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYmxvY2tTaXplID0gNTEyO1xuICAgICAgICB2YXIgZXN0aW1hdGVkRGVjb2RlZFNpemUgPSBibG9ja1NpemUgKiAyO1xuICAgICAgICB2YXIgZGVjb2RlZFNpemVEZWx0YSA9IGJsb2NrU2l6ZTtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciBqO1xuICAgICAgICB2YXIgcTtcbiAgICAgICAgdmFyIGx6d1N0YXRlID0gdGhpcy5sendTdGF0ZTtcbiAgICAgICAgaWYgKCFsendTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBlb2Ygd2FzIGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVhcmx5Q2hhbmdlID0gbHp3U3RhdGUuZWFybHlDaGFuZ2U7XG4gICAgICAgIHZhciBuZXh0Q29kZSA9IGx6d1N0YXRlLm5leHRDb2RlO1xuICAgICAgICB2YXIgZGljdGlvbmFyeVZhbHVlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlWYWx1ZXM7XG4gICAgICAgIHZhciBkaWN0aW9uYXJ5TGVuZ3RocyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlMZW5ndGhzO1xuICAgICAgICB2YXIgZGljdGlvbmFyeVByZXZDb2RlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlQcmV2Q29kZXM7XG4gICAgICAgIHZhciBjb2RlTGVuZ3RoID0gbHp3U3RhdGUuY29kZUxlbmd0aDtcbiAgICAgICAgdmFyIHByZXZDb2RlID0gbHp3U3RhdGUucHJldkNvZGU7XG4gICAgICAgIHZhciBjdXJyZW50U2VxdWVuY2UgPSBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2U7XG4gICAgICAgIHZhciBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGg7XG4gICAgICAgIHZhciBkZWNvZGVkTGVuZ3RoID0gMDtcbiAgICAgICAgdmFyIGN1cnJlbnRCdWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tTaXplOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjb2RlID0gdGhpcy5yZWFkQml0cyhjb2RlTGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBoYXNQcmV2ID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoID4gMDtcbiAgICAgICAgICAgIGlmICghY29kZSB8fCBjb2RlIDwgMjU2KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlWzBdID0gY29kZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29kZSA+PSAyNTgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA8IG5leHRDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IGRpY3Rpb25hcnlMZW5ndGhzW2NvZGVdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBjdXJyZW50U2VxdWVuY2VMZW5ndGggLSAxLCBxID0gY29kZTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVtqXSA9IGRpY3Rpb25hcnlWYWx1ZXNbcV07XG4gICAgICAgICAgICAgICAgICAgICAgICBxID0gZGljdGlvbmFyeVByZXZDb2Rlc1txXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlW2N1cnJlbnRTZXF1ZW5jZUxlbmd0aCsrXSA9IGN1cnJlbnRTZXF1ZW5jZVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2RlID09PSAyNTYpIHtcbiAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoID0gOTtcbiAgICAgICAgICAgICAgICBuZXh0Q29kZSA9IDI1ODtcbiAgICAgICAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmx6d1N0YXRlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc1ByZXYpIHtcbiAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzW25leHRDb2RlXSA9IHByZXZDb2RlO1xuICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlMZW5ndGhzW25leHRDb2RlXSA9IGRpY3Rpb25hcnlMZW5ndGhzW3ByZXZDb2RlXSArIDE7XG4gICAgICAgICAgICAgICAgZGljdGlvbmFyeVZhbHVlc1tuZXh0Q29kZV0gPSBjdXJyZW50U2VxdWVuY2VbMF07XG4gICAgICAgICAgICAgICAgbmV4dENvZGUrKztcbiAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoID1cbiAgICAgICAgICAgICAgICAgICAgKG5leHRDb2RlICsgZWFybHlDaGFuZ2UpICYgKG5leHRDb2RlICsgZWFybHlDaGFuZ2UgLSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjb2RlTGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWluKE1hdGgubG9nKG5leHRDb2RlICsgZWFybHlDaGFuZ2UpIC8gMC42OTMxNDcxODA1NTk5NDUzICsgMSwgMTIpIHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZDb2RlID0gY29kZTtcbiAgICAgICAgICAgIGRlY29kZWRMZW5ndGggKz0gY3VycmVudFNlcXVlbmNlTGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVzdGltYXRlZERlY29kZWRTaXplIDwgZGVjb2RlZExlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkRGVjb2RlZFNpemUgKz0gZGVjb2RlZFNpemVEZWx0YTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChlc3RpbWF0ZWREZWNvZGVkU2l6ZSA8IGRlY29kZWRMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2N1cnJlbnRCdWZmZXJMZW5ndGgrK10gPSBjdXJyZW50U2VxdWVuY2Vbal07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbHp3U3RhdGUubmV4dENvZGUgPSBuZXh0Q29kZTtcbiAgICAgICAgbHp3U3RhdGUuY29kZUxlbmd0aCA9IGNvZGVMZW5ndGg7XG4gICAgICAgIGx6d1N0YXRlLnByZXZDb2RlID0gcHJldkNvZGU7XG4gICAgICAgIGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDtcbiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBjdXJyZW50QnVmZmVyTGVuZ3RoO1xuICAgIH07XG4gICAgTFpXU3RyZWFtLnByb3RvdHlwZS5yZWFkQml0cyA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHZhciBiaXRzQ2FjaGVkID0gdGhpcy5iaXRzQ2FjaGVkO1xuICAgICAgICB2YXIgY2FjaGVkRGF0YSA9IHRoaXMuY2FjaGVkRGF0YTtcbiAgICAgICAgd2hpbGUgKGJpdHNDYWNoZWQgPCBuKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgICAgIGlmIChjID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhY2hlZERhdGEgPSAoY2FjaGVkRGF0YSA8PCA4KSB8IGM7XG4gICAgICAgICAgICBiaXRzQ2FjaGVkICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaXRzQ2FjaGVkID0gYml0c0NhY2hlZCAtPSBuO1xuICAgICAgICB0aGlzLmNhY2hlZERhdGEgPSBjYWNoZWREYXRhO1xuICAgICAgICByZXR1cm4gKGNhY2hlZERhdGEgPj4+IGJpdHNDYWNoZWQpICYgKCgxIDw8IG4pIC0gMSk7XG4gICAgfTtcbiAgICByZXR1cm4gTFpXU3RyZWFtO1xufShEZWNvZGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IExaV1N0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxaV1N0cmVhbS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIFJ1bkxlbmd0aFN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBSdW5MZW5ndGhTdHJlYW0gY2xhc3MgaW4gTW96aWxsYSdzIHBkZi5qcyBwcm9qZWN0LCBtYWRlIGF2YWlsYWJsZVxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2UgbGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgRGVjb2RlU3RyZWFtIGZyb20gXCIuL0RlY29kZVN0cmVhbVwiO1xudmFyIFJ1bkxlbmd0aFN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUnVuTGVuZ3RoU3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJ1bkxlbmd0aFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUnVuTGVuZ3RoU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFRoZSByZXBlYXRIZWFkZXIgaGFzIGZvbGxvd2luZyBmb3JtYXQuIFRoZSBmaXJzdCBieXRlIGRlZmluZXMgdHlwZSBvZiBydW5cbiAgICAgICAgLy8gYW5kIGFtb3VudCBvZiBieXRlcyB0byByZXBlYXQvY29weTogbiA9IDAgdGhyb3VnaCAxMjcgLSBjb3B5IG5leHQgbiBieXRlc1xuICAgICAgICAvLyAoaW4gYWRkaXRpb24gdG8gdGhlIHNlY29uZCBieXRlIGZyb20gdGhlIGhlYWRlciksIG4gPSAxMjkgdGhyb3VnaCAyNTUgLVxuICAgICAgICAvLyBkdXBsaWNhdGUgdGhlIHNlY29uZCBieXRlIGZyb20gdGhlIGhlYWRlciAoMjU3IC0gbikgdGltZXMsIG4gPSAxMjggLSBlbmQuXG4gICAgICAgIHZhciByZXBlYXRIZWFkZXIgPSB0aGlzLnN0cmVhbS5nZXRCeXRlcygyKTtcbiAgICAgICAgaWYgKCFyZXBlYXRIZWFkZXIgfHwgcmVwZWF0SGVhZGVyLmxlbmd0aCA8IDIgfHwgcmVwZWF0SGVhZGVyWzBdID09PSAxMjgpIHtcbiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYnVmZmVyO1xuICAgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHZhciBuID0gcmVwZWF0SGVhZGVyWzBdO1xuICAgICAgICBpZiAobiA8IDEyOCkge1xuICAgICAgICAgICAgLy8gY29weSBuIGJ5dGVzXG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuICsgMSk7XG4gICAgICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gcmVwZWF0SGVhZGVyWzFdO1xuICAgICAgICAgICAgaWYgKG4gPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuc3RyZWFtLmdldEJ5dGVzKG4pO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXQoc291cmNlLCBidWZmZXJMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlckxlbmd0aCArPSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbiA9IDI1NyAtIG47XG4gICAgICAgICAgICB2YXIgYiA9IHJlcGVhdEhlYWRlclsxXTtcbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIG4gKyAxKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IGI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7XG4gICAgfTtcbiAgICByZXR1cm4gUnVuTGVuZ3RoU3RyZWFtO1xufShEZWNvZGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IFJ1bkxlbmd0aFN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJ1bkxlbmd0aFN0cmVhbS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIFN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBTdHJlYW0gY2xhc3MgaW4gTW96aWxsYSdzIHBkZi5qcyBwcm9qZWN0LCBtYWRlIGF2YWlsYWJsZVxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2UgbGljZW5zZS5cbiAqL1xudmFyIFN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdHJlYW0oYnVmZmVyLCBzdGFydCwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydCB8fCAwO1xuICAgICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIHRoaXMuZW5kID0gISFzdGFydCAmJiAhIWxlbmd0aCA/IHN0YXJ0ICsgbGVuZ3RoIDogdGhpcy5ieXRlcy5sZW5ndGg7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJlYW0ucHJvdG90eXBlLCBcImxlbmd0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5kIC0gdGhpcy5zdGFydDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJlYW0ucHJvdG90eXBlLCBcImlzRW1wdHlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFN0cmVhbS5wcm90b3R5cGUuZ2V0Qnl0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMuZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK107XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLmdldFVpbnQxNiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYjAgPDwgOCkgKyBiMTtcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUuZ2V0SW50MzIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIyID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMyA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMztcbiAgICB9O1xuICAgIC8vIFJldHVybnMgc3ViYXJyYXkgb2Ygb3JpZ2luYWwgYnVmZmVyLCBzaG91bGQgb25seSBiZSByZWFkLlxuICAgIFN0cmVhbS5wcm90b3R5cGUuZ2V0Qnl0ZXMgPSBmdW5jdGlvbiAobGVuZ3RoLCBmb3JjZUNsYW1wZWQpIHtcbiAgICAgICAgaWYgKGZvcmNlQ2xhbXBlZCA9PT0gdm9pZCAwKSB7IGZvcmNlQ2xhbXBlZCA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgdmFyIHN0ckVuZCA9IHRoaXMuZW5kO1xuICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHN1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBzdHJFbmQpO1xuICAgICAgICAgICAgLy8gYHRoaXMuYnl0ZXNgIGlzIGFsd2F5cyBhIGBVaW50OEFycmF5YCBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCA/IG5ldyBVaW50OENsYW1wZWRBcnJheShzdWJhcnJheSkgOiBzdWJhcnJheTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBlbmQgPSBwb3MgKyBsZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gc3RyRW5kKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gc3RyRW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgICAgICB2YXIgc3ViYXJyYXkgPSBieXRlcy5zdWJhcnJheShwb3MsIGVuZCk7XG4gICAgICAgICAgICAvLyBgdGhpcy5ieXRlc2AgaXMgYWx3YXlzIGEgYFVpbnQ4QXJyYXlgIGhlcmUuXG4gICAgICAgICAgICByZXR1cm4gZm9yY2VDbGFtcGVkID8gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN1YmFycmF5KSA6IHN1YmFycmF5O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLnBlZWtCeXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGVla2VkQnl0ZSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB0aGlzLnBvcy0tO1xuICAgICAgICByZXR1cm4gcGVla2VkQnl0ZTtcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUucGVla0J5dGVzID0gZnVuY3Rpb24gKGxlbmd0aCwgZm9yY2VDbGFtcGVkKSB7XG4gICAgICAgIGlmIChmb3JjZUNsYW1wZWQgPT09IHZvaWQgMCkgeyBmb3JjZUNsYW1wZWQgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkKTtcbiAgICAgICAgdGhpcy5wb3MgLT0gYnl0ZXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiAobikge1xuICAgICAgICBpZiAoIW4pIHtcbiAgICAgICAgICAgIG4gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zICs9IG47XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLm1vdmVTdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdGFydCA9IHRoaXMucG9zO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5tYWtlU3ViU3RyZWFtID0gZnVuY3Rpb24gKHN0YXJ0LCBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5ieXRlcywgc3RhcnQsIGxlbmd0aCk7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXM7XG4gICAgfTtcbiAgICByZXR1cm4gU3RyZWFtO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yLCBVbnN1cHBvcnRlZEVuY29kaW5nRXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IEFzY2lpODVTdHJlYW0gZnJvbSBcIi4vQXNjaWk4NVN0cmVhbVwiO1xuaW1wb3J0IEFzY2lpSGV4U3RyZWFtIGZyb20gXCIuL0FzY2lpSGV4U3RyZWFtXCI7XG5pbXBvcnQgRmxhdGVTdHJlYW0gZnJvbSBcIi4vRmxhdGVTdHJlYW1cIjtcbmltcG9ydCBMWldTdHJlYW0gZnJvbSBcIi4vTFpXU3RyZWFtXCI7XG5pbXBvcnQgUnVuTGVuZ3RoU3RyZWFtIGZyb20gXCIuL1J1bkxlbmd0aFN0cmVhbVwiO1xuaW1wb3J0IFN0cmVhbSBmcm9tIFwiLi9TdHJlYW1cIjtcbnZhciBkZWNvZGVTdHJlYW0gPSBmdW5jdGlvbiAoc3RyZWFtLCBlbmNvZGluZywgcGFyYW1zKSB7XG4gICAgaWYgKGVuY29kaW5nID09PSBQREZOYW1lLm9mKCdGbGF0ZURlY29kZScpKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmxhdGVTdHJlYW0oc3RyZWFtKTtcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nID09PSBQREZOYW1lLm9mKCdMWldEZWNvZGUnKSkge1xuICAgICAgICB2YXIgZWFybHlDaGFuZ2UgPSAxO1xuICAgICAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgUERGRGljdCkge1xuICAgICAgICAgICAgdmFyIEVhcmx5Q2hhbmdlID0gcGFyYW1zLmxvb2t1cChQREZOYW1lLm9mKCdFYXJseUNoYW5nZScpKTtcbiAgICAgICAgICAgIGlmIChFYXJseUNoYW5nZSBpbnN0YW5jZW9mIFBERk51bWJlcikge1xuICAgICAgICAgICAgICAgIGVhcmx5Q2hhbmdlID0gRWFybHlDaGFuZ2UuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IExaV1N0cmVhbShzdHJlYW0sIHVuZGVmaW5lZCwgZWFybHlDaGFuZ2UpO1xuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgPT09IFBERk5hbWUub2YoJ0FTQ0lJODVEZWNvZGUnKSkge1xuICAgICAgICByZXR1cm4gbmV3IEFzY2lpODVTdHJlYW0oc3RyZWFtKTtcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nID09PSBQREZOYW1lLm9mKCdBU0NJSUhleERlY29kZScpKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXNjaWlIZXhTdHJlYW0oc3RyZWFtKTtcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nID09PSBQREZOYW1lLm9mKCdSdW5MZW5ndGhEZWNvZGUnKSkge1xuICAgICAgICByZXR1cm4gbmV3IFJ1bkxlbmd0aFN0cmVhbShzdHJlYW0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yKGVuY29kaW5nLmFzU3RyaW5nKCkpO1xufTtcbmV4cG9ydCB2YXIgZGVjb2RlUERGUmF3U3RyZWFtID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGRpY3QgPSBfYS5kaWN0LCBjb250ZW50cyA9IF9hLmNvbnRlbnRzO1xuICAgIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKGNvbnRlbnRzKTtcbiAgICB2YXIgRmlsdGVyID0gZGljdC5sb29rdXAoUERGTmFtZS5vZignRmlsdGVyJykpO1xuICAgIHZhciBEZWNvZGVQYXJtcyA9IGRpY3QubG9va3VwKFBERk5hbWUub2YoJ0RlY29kZVBhcm1zJykpO1xuICAgIGlmIChGaWx0ZXIgaW5zdGFuY2VvZiBQREZOYW1lKSB7XG4gICAgICAgIHN0cmVhbSA9IGRlY29kZVN0cmVhbShzdHJlYW0sIEZpbHRlciwgRGVjb2RlUGFybXMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChGaWx0ZXIgaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBGaWx0ZXIuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBzdHJlYW0gPSBkZWNvZGVTdHJlYW0oc3RyZWFtLCBGaWx0ZXIubG9va3VwKGlkeCwgUERGTmFtZSksIERlY29kZVBhcm1zICYmIERlY29kZVBhcm1zLmxvb2t1cE1heWJlKGlkeCwgUERGRGljdCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKCEhRmlsdGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yKFtQREZOYW1lLCBQREZBcnJheV0sIEZpbHRlcik7XG4gICAgfVxuICAgIHJldHVybiBzdHJlYW07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVjb2RlLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IHsgUERGQWNyb0Zvcm0gfSBmcm9tIFwiLi4vYWNyb2Zvcm1cIjtcbmltcG9ydCBWaWV3ZXJQcmVmZXJlbmNlcyBmcm9tICcuLi9pbnRlcmFjdGl2ZS9WaWV3ZXJQcmVmZXJlbmNlcyc7XG52YXIgUERGQ2F0YWxvZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQ2F0YWxvZywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZDYXRhbG9nKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLlBhZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXAoUERGTmFtZS5vZignUGFnZXMnKSwgUERGRGljdCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5BY3JvRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5vZignQWNyb0Zvcm0nKSwgUERGRGljdCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5nZXRBY3JvRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLkFjcm9Gb3JtKCk7XG4gICAgICAgIGlmICghZGljdClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBQREZBY3JvRm9ybS5mcm9tRGljdChkaWN0KTtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLmdldE9yQ3JlYXRlQWNyb0Zvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhY3JvRm9ybSA9IHRoaXMuZ2V0QWNyb0Zvcm0oKTtcbiAgICAgICAgaWYgKCFhY3JvRm9ybSkge1xuICAgICAgICAgICAgYWNyb0Zvcm0gPSBQREZBY3JvRm9ybS5jcmVhdGUodGhpcy5jb250ZXh0KTtcbiAgICAgICAgICAgIHZhciBhY3JvRm9ybVJlZiA9IHRoaXMuY29udGV4dC5yZWdpc3RlcihhY3JvRm9ybS5kaWN0KTtcbiAgICAgICAgICAgIHRoaXMuc2V0KFBERk5hbWUub2YoJ0Fjcm9Gb3JtJyksIGFjcm9Gb3JtUmVmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNyb0Zvcm07XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5WaWV3ZXJQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5vZignVmlld2VyUHJlZmVyZW5jZXMnKSwgUERGRGljdCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5nZXRWaWV3ZXJQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLlZpZXdlclByZWZlcmVuY2VzKCk7XG4gICAgICAgIGlmICghZGljdClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBWaWV3ZXJQcmVmZXJlbmNlcy5mcm9tRGljdChkaWN0KTtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2aWV3ZXJQcmVmcyA9IHRoaXMuZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKTtcbiAgICAgICAgaWYgKCF2aWV3ZXJQcmVmcykge1xuICAgICAgICAgICAgdmlld2VyUHJlZnMgPSBWaWV3ZXJQcmVmZXJlbmNlcy5jcmVhdGUodGhpcy5jb250ZXh0KTtcbiAgICAgICAgICAgIHZhciB2aWV3ZXJQcmVmc1JlZiA9IHRoaXMuY29udGV4dC5yZWdpc3Rlcih2aWV3ZXJQcmVmcy5kaWN0KTtcbiAgICAgICAgICAgIHRoaXMuc2V0KFBERk5hbWUub2YoJ1ZpZXdlclByZWZlcmVuY2VzJyksIHZpZXdlclByZWZzUmVmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlld2VyUHJlZnM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSBnaXZlbiByZWYgYXMgYSBsZWFmIG5vZGUgb2YgdGhpcyBjYXRhbG9nJ3MgcGFnZSB0cmVlIGF0IHRoZVxuICAgICAqIHNwZWNpZmllZCBpbmRleCAoemVyby1iYXNlZCkuIEFsc28gaW5jcmVtZW50cyB0aGUgYENvdW50YCBvZiBlYWNoIG5vZGUgaW5cbiAgICAgKiB0aGUgcGFnZSB0cmVlIGhpZXJhcmNoeSB0byBhY2NvbW9kYXRlIHRoZSBuZXcgcGFnZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdGhlIHJlZiBvZiB0aGUgUERGUGFnZVRyZWUgbm9kZSBpbnRvIHdoaWNoIGBsZWFmUmVmYCB3YXMgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuaW5zZXJ0TGVhZk5vZGUgPSBmdW5jdGlvbiAobGVhZlJlZiwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHBhZ2VzUmVmID0gdGhpcy5nZXQoUERGTmFtZS5vZignUGFnZXMnKSk7XG4gICAgICAgIHZhciBtYXliZVBhcmVudFJlZiA9IHRoaXMuUGFnZXMoKS5pbnNlcnRMZWFmTm9kZShsZWFmUmVmLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBtYXliZVBhcmVudFJlZiB8fCBwYWdlc1JlZjtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLnJlbW92ZUxlYWZOb2RlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHRoaXMuUGFnZXMoKS5yZW1vdmVMZWFmTm9kZShpbmRleCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLndpdGhDb250ZXh0QW5kUGFnZXMgPSBmdW5jdGlvbiAoY29udGV4dCwgcGFnZXMpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBuZXcgTWFwKCk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ1R5cGUnKSwgUERGTmFtZS5vZignQ2F0YWxvZycpKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignUGFnZXMnKSwgcGFnZXMpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkNhdGFsb2coZGljdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLmZyb21NYXBXaXRoQ29udGV4dCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZDYXRhbG9nKG1hcCwgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQ2F0YWxvZztcbn0oUERGRGljdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQ2F0YWxvZztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkNhdGFsb2cuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRmxhdGVTdHJlYW0gZnJvbSBcIi4vUERGRmxhdGVTdHJlYW1cIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbnZhciBQREZDb250ZW50U3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZDb250ZW50U3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkNvbnRlbnRTdHJlYW0oZGljdCwgb3BlcmF0b3JzLCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGljdCwgZW5jb2RlKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vcGVyYXRvcnMgPSBvcGVyYXRvcnM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGQ29udGVudFN0cmVhbS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgb3BlcmF0b3JzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBvcGVyYXRvcnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLm9wZXJhdG9ycykucHVzaC5hcHBseShfYSwgb3BlcmF0b3JzKTtcbiAgICB9O1xuICAgIFBERkNvbnRlbnRTdHJlYW0ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IG5ldyBBcnJheSh0aGlzLm9wZXJhdG9ycy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG9wZXJhdG9yc1tpZHhdID0gdGhpcy5vcGVyYXRvcnNbaWR4XS5jbG9uZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2EgPSB0aGlzLCBkaWN0ID0gX2EuZGljdCwgZW5jb2RlID0gX2EuZW5jb2RlO1xuICAgICAgICByZXR1cm4gUERGQ29udGVudFN0cmVhbS5vZihkaWN0LmNsb25lKGNvbnRleHQpLCBvcGVyYXRvcnMsIGVuY29kZSk7XG4gICAgfTtcbiAgICBQREZDb250ZW50U3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy5vcGVyYXRvcnNbaWR4XSArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGQ29udGVudFN0cmVhbS5wcm90b3R5cGUuZ2V0VW5lbmNvZGVkQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0aGlzLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSgpKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRoaXMub3BlcmF0b3JzW2lkeF0uY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9O1xuICAgIFBERkNvbnRlbnRTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNpemUgPSAwO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHNpemUgKz0gdGhpcy5vcGVyYXRvcnNbaWR4XS5zaXplSW5CeXRlcygpICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFBERkNvbnRlbnRTdHJlYW0ub2YgPSBmdW5jdGlvbiAoZGljdCwgb3BlcmF0b3JzLCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZDb250ZW50U3RyZWFtKGRpY3QsIG9wZXJhdG9ycywgZW5jb2RlKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZDb250ZW50U3RyZWFtO1xufShQREZGbGF0ZVN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQ29udGVudFN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkNvbnRlbnRTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERkZsYXRlU3RyZWFtIGZyb20gXCIuL1BERkZsYXRlU3RyZWFtXCI7XG5pbXBvcnQgeyBieXRlc0ZvciwgQ2FjaGUsIHJldmVyc2VBcnJheSwgc2l6ZUluQnl0ZXMsIHN1bSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuZXhwb3J0IHZhciBFbnRyeVR5cGU7XG4oZnVuY3Rpb24gKEVudHJ5VHlwZSkge1xuICAgIEVudHJ5VHlwZVtFbnRyeVR5cGVbXCJEZWxldGVkXCJdID0gMF0gPSBcIkRlbGV0ZWRcIjtcbiAgICBFbnRyeVR5cGVbRW50cnlUeXBlW1wiVW5jb21wcmVzc2VkXCJdID0gMV0gPSBcIlVuY29tcHJlc3NlZFwiO1xuICAgIEVudHJ5VHlwZVtFbnRyeVR5cGVbXCJDb21wcmVzc2VkXCJdID0gMl0gPSBcIkNvbXByZXNzZWRcIjtcbn0pKEVudHJ5VHlwZSB8fCAoRW50cnlUeXBlID0ge30pKTtcbi8qKlxuICogRW50cmllcyBzaG91bGQgYmUgYWRkZWQgdXNpbmcgdGhlIFtbYWRkRGVsZXRlZEVudHJ5XV0sXG4gKiBbW2FkZFVuY29tcHJlc3NlZEVudHJ5XV0sIGFuZCBbW2FkZENvbXByZXNzZWRFbnRyeV1dIG1ldGhvZHNcbiAqICoqaW4gb3JkZXIgb2YgYXNjZW5kaW5nIG9iamVjdCBudW1iZXIqKi5cbiAqL1xudmFyIFBERkNyb3NzUmVmU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZDcm9zc1JlZlN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZDcm9zc1JlZlN0cmVhbShkaWN0LCBlbnRyaWVzLCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGljdCwgZW5jb2RlKSB8fCB0aGlzO1xuICAgICAgICAvLyBSZXR1cm5zIGFuIGFycmF5IG9mIGludGVnZXIgcGFpcnMgZm9yIGVhY2ggc3Vic2VjdGlvbiBvZiB0aGUgY3Jvc3MgcmVmXG4gICAgICAgIC8vIHNlY3Rpb24sIHdoZXJlIGVhY2ggaW50ZWdlciBwYWlyIHJlcHJlc2VudHM6XG4gICAgICAgIC8vICAgZmlyc3RPYmplY3ROdW1iZXIoT2ZTZWN0aW9uKSwgbGVuZ3RoKE9mU2VjdGlvbilcbiAgICAgICAgX3RoaXMuY29tcHV0ZUluZGV4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHN1YnNlY3Rpb25zID0gW107XG4gICAgICAgICAgICB2YXIgc3Vic2VjdGlvbkxlbmd0aCA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBfdGhpcy5lbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBjdXJyRW50cnkgPSBfdGhpcy5lbnRyaWVzW2lkeF07XG4gICAgICAgICAgICAgICAgdmFyIHByZXZFbnRyeSA9IF90aGlzLmVudHJpZXNbaWR4IC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzdWJzZWN0aW9ucy5wdXNoKGN1cnJFbnRyeS5yZWYub2JqZWN0TnVtYmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyckVudHJ5LnJlZi5vYmplY3ROdW1iZXIgLSBwcmV2RW50cnkucmVmLm9iamVjdE51bWJlciA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2VjdGlvbnMucHVzaChzdWJzZWN0aW9uTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2VjdGlvbnMucHVzaChjdXJyRW50cnkucmVmLm9iamVjdE51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNlY3Rpb25MZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdWJzZWN0aW9uTGVuZ3RoICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJzZWN0aW9ucy5wdXNoKHN1YnNlY3Rpb25MZW5ndGgpO1xuICAgICAgICAgICAgcmV0dXJuIHN1YnNlY3Rpb25zO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5jb21wdXRlRW50cnlUdXBsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZW50cnlUdXBsZXMgPSBuZXcgQXJyYXkoX3RoaXMuZW50cmllcy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gX3RoaXMuZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBfdGhpcy5lbnRyaWVzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09IEVudHJ5VHlwZS5EZWxldGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gZW50cnkudHlwZSwgbmV4dEZyZWVPYmplY3ROdW1iZXIgPSBlbnRyeS5uZXh0RnJlZU9iamVjdE51bWJlciwgcmVmID0gZW50cnkucmVmO1xuICAgICAgICAgICAgICAgICAgICBlbnRyeVR1cGxlc1tpZHhdID0gW3R5cGUsIG5leHRGcmVlT2JqZWN0TnVtYmVyLCByZWYuZ2VuZXJhdGlvbk51bWJlcl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbnRyeS50eXBlID09PSBFbnRyeVR5cGUuVW5jb21wcmVzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gZW50cnkudHlwZSwgb2Zmc2V0ID0gZW50cnkub2Zmc2V0LCByZWYgPSBlbnRyeS5yZWY7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5VHVwbGVzW2lkeF0gPSBbdHlwZSwgb2Zmc2V0LCByZWYuZ2VuZXJhdGlvbk51bWJlcl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbnRyeS50eXBlID09PSBFbnRyeVR5cGUuQ29tcHJlc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGVudHJ5LnR5cGUsIG9iamVjdFN0cmVhbVJlZiA9IGVudHJ5Lm9iamVjdFN0cmVhbVJlZiwgaW5kZXggPSBlbnRyeS5pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgZW50cnlUdXBsZXNbaWR4XSA9IFt0eXBlLCBvYmplY3RTdHJlYW1SZWYub2JqZWN0TnVtYmVyLCBpbmRleF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5VHVwbGVzO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5jb21wdXRlTWF4RW50cnlCeXRlV2lkdGhzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGVudHJ5VHVwbGVzID0gX3RoaXMuZW50cnlUdXBsZXNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgICAgIHZhciB3aWR0aHMgPSBbMCwgMCwgMF07XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyeVR1cGxlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBlbnRyeVR1cGxlc1tpZHhdLCBmaXJzdCA9IF9hWzBdLCBzZWNvbmQgPSBfYVsxXSwgdGhpcmQgPSBfYVsyXTtcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3RTaXplID0gc2l6ZUluQnl0ZXMoZmlyc3QpO1xuICAgICAgICAgICAgICAgIHZhciBzZWNvbmRTaXplID0gc2l6ZUluQnl0ZXMoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcmRTaXplID0gc2l6ZUluQnl0ZXModGhpcmQpO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdFNpemUgPiB3aWR0aHNbMF0pXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoc1swXSA9IGZpcnN0U2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAoc2Vjb25kU2l6ZSA+IHdpZHRoc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhzWzFdID0gc2Vjb25kU2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcmRTaXplID4gd2lkdGhzWzJdKVxuICAgICAgICAgICAgICAgICAgICB3aWR0aHNbMl0gPSB0aGlyZFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd2lkdGhzO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5lbnRyaWVzID0gZW50cmllcyB8fCBbXTtcbiAgICAgICAgX3RoaXMuZW50cnlUdXBsZXNDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KF90aGlzLmNvbXB1dGVFbnRyeVR1cGxlcyk7XG4gICAgICAgIF90aGlzLm1heEJ5dGVXaWR0aHNDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KF90aGlzLmNvbXB1dGVNYXhFbnRyeUJ5dGVXaWR0aHMpO1xuICAgICAgICBfdGhpcy5pbmRleENhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkoX3RoaXMuY29tcHV0ZUluZGV4KTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignVHlwZScpLCBQREZOYW1lLm9mKCdYUmVmJykpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS5hZGREZWxldGVkRW50cnkgPSBmdW5jdGlvbiAocmVmLCBuZXh0RnJlZU9iamVjdE51bWJlcikge1xuICAgICAgICB2YXIgdHlwZSA9IEVudHJ5VHlwZS5EZWxldGVkO1xuICAgICAgICB0aGlzLmVudHJpZXMucHVzaCh7IHR5cGU6IHR5cGUsIHJlZjogcmVmLCBuZXh0RnJlZU9iamVjdE51bWJlcjogbmV4dEZyZWVPYmplY3ROdW1iZXIgfSk7XG4gICAgICAgIHRoaXMuZW50cnlUdXBsZXNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5pbmRleENhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5jb250ZW50c0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS5hZGRVbmNvbXByZXNzZWRFbnRyeSA9IGZ1bmN0aW9uIChyZWYsIG9mZnNldCkge1xuICAgICAgICB2YXIgdHlwZSA9IEVudHJ5VHlwZS5VbmNvbXByZXNzZWQ7XG4gICAgICAgIHRoaXMuZW50cmllcy5wdXNoKHsgdHlwZTogdHlwZSwgcmVmOiByZWYsIG9mZnNldDogb2Zmc2V0IH0pO1xuICAgICAgICB0aGlzLmVudHJ5VHVwbGVzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuaW5kZXhDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuY29udGVudHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuYWRkQ29tcHJlc3NlZEVudHJ5ID0gZnVuY3Rpb24gKHJlZiwgb2JqZWN0U3RyZWFtUmVmLCBpbmRleCkge1xuICAgICAgICB2YXIgdHlwZSA9IEVudHJ5VHlwZS5Db21wcmVzc2VkO1xuICAgICAgICB0aGlzLmVudHJpZXMucHVzaCh7IHR5cGU6IHR5cGUsIHJlZjogcmVmLCBvYmplY3RTdHJlYW1SZWY6IG9iamVjdFN0cmVhbVJlZiwgaW5kZXg6IGluZGV4IH0pO1xuICAgICAgICB0aGlzLmVudHJ5VHVwbGVzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuaW5kZXhDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuY29udGVudHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBkaWN0ID0gX2EuZGljdCwgZW50cmllcyA9IF9hLmVudHJpZXMsIGVuY29kZSA9IF9hLmVuY29kZTtcbiAgICAgICAgcmV0dXJuIFBERkNyb3NzUmVmU3RyZWFtLm9mKGRpY3QuY2xvbmUoY29udGV4dCksIGVudHJpZXMuc2xpY2UoKSwgZW5jb2RlKTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVudHJ5VHVwbGVzID0gdGhpcy5lbnRyeVR1cGxlc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgYnl0ZVdpZHRocyA9IHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgZm9yICh2YXIgZW50cnlJZHggPSAwLCBlbnRyaWVzTGVuID0gZW50cnlUdXBsZXMubGVuZ3RoOyBlbnRyeUlkeCA8IGVudHJpZXNMZW47IGVudHJ5SWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJ5VHVwbGVzW2VudHJ5SWR4XSwgZmlyc3QgPSBfYVswXSwgc2Vjb25kID0gX2FbMV0sIHRoaXJkID0gX2FbMl07XG4gICAgICAgICAgICB2YXIgZmlyc3RCeXRlcyA9IHJldmVyc2VBcnJheShieXRlc0ZvcihmaXJzdCkpO1xuICAgICAgICAgICAgdmFyIHNlY29uZEJ5dGVzID0gcmV2ZXJzZUFycmF5KGJ5dGVzRm9yKHNlY29uZCkpO1xuICAgICAgICAgICAgdmFyIHRoaXJkQnl0ZXMgPSByZXZlcnNlQXJyYXkoYnl0ZXNGb3IodGhpcmQpKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IGJ5dGVXaWR0aHNbMF0gLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAoZmlyc3RCeXRlc1tpZHhdIHx8IDApLnRvU3RyaW5nKDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gYnl0ZVdpZHRoc1sxXSAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IChzZWNvbmRCeXRlc1tpZHhdIHx8IDApLnRvU3RyaW5nKDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gYnl0ZVdpZHRoc1syXSAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICAgICAgICAgIHZhbHVlICs9ICh0aGlyZEJ5dGVzW2lkeF0gfHwgMCkudG9TdHJpbmcoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZW50cnlUdXBsZXMgPSB0aGlzLmVudHJ5VHVwbGVzQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIHZhciBieXRlV2lkdGhzID0gdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0aGlzLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSgpKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAodmFyIGVudHJ5SWR4ID0gMCwgZW50cmllc0xlbiA9IGVudHJ5VHVwbGVzLmxlbmd0aDsgZW50cnlJZHggPCBlbnRyaWVzTGVuOyBlbnRyeUlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyeVR1cGxlc1tlbnRyeUlkeF0sIGZpcnN0ID0gX2FbMF0sIHNlY29uZCA9IF9hWzFdLCB0aGlyZCA9IF9hWzJdO1xuICAgICAgICAgICAgdmFyIGZpcnN0Qnl0ZXMgPSByZXZlcnNlQXJyYXkoYnl0ZXNGb3IoZmlyc3QpKTtcbiAgICAgICAgICAgIHZhciBzZWNvbmRCeXRlcyA9IHJldmVyc2VBcnJheShieXRlc0ZvcihzZWNvbmQpKTtcbiAgICAgICAgICAgIHZhciB0aGlyZEJ5dGVzID0gcmV2ZXJzZUFycmF5KGJ5dGVzRm9yKHRoaXJkKSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSBieXRlV2lkdGhzWzBdIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGZpcnN0Qnl0ZXNbaWR4XSB8fCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gYnl0ZVdpZHRoc1sxXSAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBzZWNvbmRCeXRlc1tpZHhdIHx8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSBieXRlV2lkdGhzWzJdIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IHRoaXJkQnl0ZXNbaWR4XSB8fCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuZ2V0VW5lbmNvZGVkQ29udGVudHNTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZVdpZHRocyA9IHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgZW50cnlXaWR0aCA9IHN1bShieXRlV2lkdGhzKTtcbiAgICAgICAgcmV0dXJuIGVudHJ5V2lkdGggKiB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLnVwZGF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUudXBkYXRlRGljdC5jYWxsKHRoaXMpO1xuICAgICAgICB2YXIgYnl0ZVdpZHRocyA9IHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4Q2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5kaWN0LmNvbnRleHQ7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVycpLCBjb250ZXh0Lm9iaihieXRlV2lkdGhzKSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignSW5kZXgnKSwgY29udGV4dC5vYmooaW5kZXgpKTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLmNyZWF0ZSA9IGZ1bmN0aW9uIChkaWN0LCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBQREZDcm9zc1JlZlN0cmVhbShkaWN0LCBbXSwgZW5jb2RlKTtcbiAgICAgICAgc3RyZWFtLmFkZERlbGV0ZWRFbnRyeShQREZSZWYub2YoMCwgNjU1MzUpLCAwKTtcbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLm9mID0gZnVuY3Rpb24gKGRpY3QsIGVudHJpZXMsIGVuY29kZSkge1xuICAgICAgICBpZiAoZW5jb2RlID09PSB2b2lkIDApIHsgZW5jb2RlID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gbmV3IFBERkNyb3NzUmVmU3RyZWFtKGRpY3QsIGVudHJpZXMsIGVuY29kZSk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQ3Jvc3NSZWZTdHJlYW07XG59KFBERkZsYXRlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBQREZDcm9zc1JlZlN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkNyb3NzUmVmU3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHBha28gZnJvbSAncGFrbyc7XG5pbXBvcnQgeyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERlN0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJlYW1cIjtcbmltcG9ydCB7IENhY2hlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGRmxhdGVTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkZsYXRlU3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkZsYXRlU3RyZWFtKGRpY3QsIGVuY29kZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkaWN0KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb21wdXRlQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdW5lbmNvZGVkQ29udGVudHMgPSBfdGhpcy5nZXRVbmVuY29kZWRDb250ZW50cygpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVuY29kZSA/IHBha28uZGVmbGF0ZSh1bmVuY29kZWRDb250ZW50cykgOiB1bmVuY29kZWRDb250ZW50cztcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuZW5jb2RlID0gZW5jb2RlO1xuICAgICAgICBpZiAoZW5jb2RlKVxuICAgICAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignRmlsdGVyJyksIFBERk5hbWUub2YoJ0ZsYXRlRGVjb2RlJykpO1xuICAgICAgICBfdGhpcy5jb250ZW50c0NhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkoX3RoaXMuY29tcHV0ZUNvbnRlbnRzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzQ2FjaGUuYWNjZXNzKCk7XG4gICAgfTtcbiAgICBQREZGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50c0NhY2hlLmFjY2VzcygpLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERkZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnZ2V0VW5lbmNvZGVkQ29udGVudHMnKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZGbGF0ZVN0cmVhbTtcbn0oUERGU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBQREZGbGF0ZVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkZsYXRlU3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZGbGF0ZVN0cmVhbSBmcm9tIFwiLi9QREZGbGF0ZVN0cmVhbVwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIGxhc3QgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZPYmplY3RTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk9iamVjdFN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZPYmplY3RTdHJlYW0oY29udGV4dCwgb2JqZWN0cywgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNvbnRleHQub2JqKHt9KSwgZW5jb2RlKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vYmplY3RzID0gb2JqZWN0cztcbiAgICAgICAgX3RoaXMub2Zmc2V0cyA9IF90aGlzLmNvbXB1dGVPYmplY3RPZmZzZXRzKCk7XG4gICAgICAgIF90aGlzLm9mZnNldHNTdHJpbmcgPSBfdGhpcy5jb21wdXRlT2Zmc2V0c1N0cmluZygpO1xuICAgICAgICBfdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdUeXBlJyksIFBERk5hbWUub2YoJ09ialN0bScpKTtcbiAgICAgICAgX3RoaXMuZGljdC5zZXQoUERGTmFtZS5vZignTicpLCBQREZOdW1iZXIub2YoX3RoaXMub2JqZWN0cy5sZW5ndGgpKTtcbiAgICAgICAgX3RoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRmlyc3QnKSwgUERGTnVtYmVyLm9mKF90aGlzLm9mZnNldHNTdHJpbmcubGVuZ3RoKSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5nZXRPYmplY3RzQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9iamVjdHMubGVuZ3RoO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBQREZPYmplY3RTdHJlYW0ud2l0aENvbnRleHRBbmRPYmplY3RzKGNvbnRleHQgfHwgdGhpcy5kaWN0LmNvbnRleHQsIHRoaXMub2JqZWN0cy5zbGljZSgpLCB0aGlzLmVuY29kZSk7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLm9mZnNldHNTdHJpbmc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub2JqZWN0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMub2JqZWN0c1tpZHhdLCBvYmplY3QgPSBfYVsxXTtcbiAgICAgICAgICAgIHZhbHVlICs9IG9iamVjdCArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuZ2V0VW5lbmNvZGVkQ29udGVudHNTaXplKCkpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5vZmZzZXRzU3RyaW5nLCBidWZmZXIsIDApO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9iamVjdHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLm9iamVjdHNbaWR4XSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgICAgICBvZmZzZXQgKz0gb2JqZWN0LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLm9mZnNldHNTdHJpbmcubGVuZ3RoICtcbiAgICAgICAgICAgIGxhc3QodGhpcy5vZmZzZXRzKVsxXSArXG4gICAgICAgICAgICBsYXN0KHRoaXMub2JqZWN0cylbMV0uc2l6ZUluQnl0ZXMoKSArXG4gICAgICAgICAgICAxKTtcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbS5wcm90b3R5cGUuY29tcHV0ZU9mZnNldHNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvZmZzZXRzU3RyaW5nID0gJyc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub2Zmc2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMub2Zmc2V0c1tpZHhdLCBvYmplY3ROdW1iZXIgPSBfYVswXSwgb2Zmc2V0ID0gX2FbMV07XG4gICAgICAgICAgICBvZmZzZXRzU3RyaW5nICs9IG9iamVjdE51bWJlciArIFwiIFwiICsgb2Zmc2V0ICsgXCIgXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldHNTdHJpbmc7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ucHJvdG90eXBlLmNvbXB1dGVPYmplY3RPZmZzZXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIG9mZnNldHMgPSBuZXcgQXJyYXkodGhpcy5vYmplY3RzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub2JqZWN0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMub2JqZWN0c1tpZHhdLCByZWYgPSBfYVswXSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgICAgICBvZmZzZXRzW2lkeF0gPSBbcmVmLm9iamVjdE51bWJlciwgb2Zmc2V0XTtcbiAgICAgICAgICAgIG9mZnNldCArPSBvYmplY3Quc2l6ZUluQnl0ZXMoKSArIDE7IC8vICdcXG4nXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldHM7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ud2l0aENvbnRleHRBbmRPYmplY3RzID0gZnVuY3Rpb24gKGNvbnRleHQsIG9iamVjdHMsIGVuY29kZSkge1xuICAgICAgICBpZiAoZW5jb2RlID09PSB2b2lkIDApIHsgZW5jb2RlID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gbmV3IFBERk9iamVjdFN0cmVhbShjb250ZXh0LCBvYmplY3RzLCBlbmNvZGUpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9iamVjdFN0cmVhbTtcbn0oUERGRmxhdGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9iamVjdFN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9iamVjdFN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGU3RyZWFtXCI7XG52YXIgUERGUGFnZUxlYWYgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlBhZ2VMZWFmLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlBhZ2VMZWFmKG1hcCwgY29udGV4dCwgYXV0b05vcm1hbGl6ZUNUTSkge1xuICAgICAgICBpZiAoYXV0b05vcm1hbGl6ZUNUTSA9PT0gdm9pZCAwKSB7IGF1dG9Ob3JtYWxpemVDVE0gPSB0cnVlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1hcCwgY29udGV4dCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubm9ybWFsaXplZCA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5hdXRvTm9ybWFsaXplQ1RNID0gYXV0b05vcm1hbGl6ZUNUTTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgY2xvbmUgPSBQREZQYWdlTGVhZi5mcm9tTWFwV2l0aENvbnRleHQobmV3IE1hcCgpLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCwgdGhpcy5hdXRvTm9ybWFsaXplQ1RNKTtcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBjbG9uZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLlBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5QYXJlbnQsIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLkNvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXAoUERGTmFtZS5vZignQ29udGVudHMnKSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuQW5ub3RzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBNYXliZShQREZOYW1lLkFubm90cywgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLkJsZWVkQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBNYXliZShQREZOYW1lLkJsZWVkQm94LCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuVHJpbUJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5UcmltQm94LCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuQXJ0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBNYXliZShQREZOYW1lLkFydEJveCwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLlJlc291cmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpY3RPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5SZXNvdXJjZXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0Lmxvb2t1cE1heWJlKGRpY3RPclJlZiwgUERGRGljdCk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuTWVkaWFCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheU9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLk1lZGlhQm94KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5sb29rdXAoYXJyYXlPclJlZiwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLkNyb3BCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheU9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLkNyb3BCb3gpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0Lmxvb2t1cE1heWJlKGFycmF5T3JSZWYsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5Sb3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBudW1iZXJPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5Sb3RhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0Lmxvb2t1cE1heWJlKG51bWJlck9yUmVmLCBQREZOdW1iZXIpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLmdldEluaGVyaXRhYmxlQXR0cmlidXRlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZTtcbiAgICAgICAgdGhpcy5hc2NlbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICghYXR0cmlidXRlKVxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IG5vZGUuZ2V0KG5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5zZXRQYXJlbnQgPSBmdW5jdGlvbiAocGFyZW50UmVmKSB7XG4gICAgICAgIHRoaXMuc2V0KFBERk5hbWUuUGFyZW50LCBwYXJlbnRSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLmFkZENvbnRlbnRTdHJlYW0gPSBmdW5jdGlvbiAoY29udGVudFN0cmVhbVJlZikge1xuICAgICAgICB2YXIgQ29udGVudHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuQ29udGVudHMgfHwgdGhpcy5jb250ZXh0Lm9iaihbXSk7XG4gICAgICAgIHRoaXMuc2V0KFBERk5hbWUuQ29udGVudHMsIENvbnRlbnRzKTtcbiAgICAgICAgQ29udGVudHMucHVzaChjb250ZW50U3RyZWFtUmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS53cmFwQ29udGVudFN0cmVhbXMgPSBmdW5jdGlvbiAoc3RhcnRTdHJlYW0sIGVuZFN0cmVhbSkge1xuICAgICAgICB2YXIgQ29udGVudHMgPSB0aGlzLkNvbnRlbnRzKCk7XG4gICAgICAgIGlmIChDb250ZW50cyBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgICAgICBDb250ZW50cy5pbnNlcnQoMCwgc3RhcnRTdHJlYW0pO1xuICAgICAgICAgICAgQ29udGVudHMucHVzaChlbmRTdHJlYW0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLmFkZEFubm90ID0gZnVuY3Rpb24gKGFubm90UmVmKSB7XG4gICAgICAgIHZhciBBbm5vdHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuQW5ub3RzO1xuICAgICAgICBBbm5vdHMucHVzaChhbm5vdFJlZik7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUucmVtb3ZlQW5ub3QgPSBmdW5jdGlvbiAoYW5ub3RSZWYpIHtcbiAgICAgICAgdmFyIEFubm90cyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5Bbm5vdHM7XG4gICAgICAgIHZhciBpbmRleCA9IEFubm90cy5pbmRleE9mKGFubm90UmVmKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIEFubm90cy5yZW1vdmUoaW5kZXgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuc2V0Rm9udERpY3Rpb25hcnkgPSBmdW5jdGlvbiAobmFtZSwgZm9udERpY3RSZWYpIHtcbiAgICAgICAgdmFyIEZvbnQgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuRm9udDtcbiAgICAgICAgRm9udC5zZXQobmFtZSwgZm9udERpY3RSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5ld0ZvbnREaWN0aW9uYXJ5S2V5ID0gZnVuY3Rpb24gKHRhZykge1xuICAgICAgICB2YXIgRm9udCA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5Gb250O1xuICAgICAgICByZXR1cm4gRm9udC51bmlxdWVLZXkodGFnKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5uZXdGb250RGljdGlvbmFyeSA9IGZ1bmN0aW9uICh0YWcsIGZvbnREaWN0UmVmKSB7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLm5ld0ZvbnREaWN0aW9uYXJ5S2V5KHRhZyk7XG4gICAgICAgIHRoaXMuc2V0Rm9udERpY3Rpb25hcnkoa2V5LCBmb250RGljdFJlZik7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuc2V0WE9iamVjdCA9IGZ1bmN0aW9uIChuYW1lLCB4T2JqZWN0UmVmKSB7XG4gICAgICAgIHZhciBYT2JqZWN0ID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLlhPYmplY3Q7XG4gICAgICAgIFhPYmplY3Quc2V0KG5hbWUsIHhPYmplY3RSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5ld1hPYmplY3RLZXkgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHZhciBYT2JqZWN0ID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLlhPYmplY3Q7XG4gICAgICAgIHJldHVybiBYT2JqZWN0LnVuaXF1ZUtleSh0YWcpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5ld1hPYmplY3QgPSBmdW5jdGlvbiAodGFnLCB4T2JqZWN0UmVmKSB7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLm5ld1hPYmplY3RLZXkodGFnKTtcbiAgICAgICAgdGhpcy5zZXRYT2JqZWN0KGtleSwgeE9iamVjdFJlZik7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuc2V0RXh0R1N0YXRlID0gZnVuY3Rpb24gKG5hbWUsIGV4dEdTdGF0ZVJlZikge1xuICAgICAgICB2YXIgRXh0R1N0YXRlID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkV4dEdTdGF0ZTtcbiAgICAgICAgRXh0R1N0YXRlLnNldChuYW1lLCBleHRHU3RhdGVSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5ld0V4dEdTdGF0ZUtleSA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgdmFyIEV4dEdTdGF0ZSA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5FeHRHU3RhdGU7XG4gICAgICAgIHJldHVybiBFeHRHU3RhdGUudW5pcXVlS2V5KHRhZyk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUubmV3RXh0R1N0YXRlID0gZnVuY3Rpb24gKHRhZywgZXh0R1N0YXRlUmVmKSB7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLm5ld0V4dEdTdGF0ZUtleSh0YWcpO1xuICAgICAgICB0aGlzLnNldEV4dEdTdGF0ZShrZXksIGV4dEdTdGF0ZVJlZik7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuYXNjZW5kID0gZnVuY3Rpb24gKHZpc2l0b3IpIHtcbiAgICAgICAgdmlzaXRvcih0aGlzKTtcbiAgICAgICAgdmFyIFBhcmVudCA9IHRoaXMuUGFyZW50KCk7XG4gICAgICAgIGlmIChQYXJlbnQpXG4gICAgICAgICAgICBQYXJlbnQuYXNjZW5kKHZpc2l0b3IpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubm9ybWFsaXplZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIHZhciBjb250ZW50c1JlZiA9IHRoaXMuZ2V0KFBERk5hbWUuQ29udGVudHMpO1xuICAgICAgICB2YXIgY29udGVudHMgPSB0aGlzLmNvbnRleHQubG9va3VwKGNvbnRlbnRzUmVmKTtcbiAgICAgICAgaWYgKGNvbnRlbnRzIGluc3RhbmNlb2YgUERGU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLnNldChQREZOYW1lLkNvbnRlbnRzLCBjb250ZXh0Lm9iaihbY29udGVudHNSZWZdKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXV0b05vcm1hbGl6ZUNUTSkge1xuICAgICAgICAgICAgdGhpcy53cmFwQ29udGVudFN0cmVhbXModGhpcy5jb250ZXh0LmdldFB1c2hHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbSgpLCB0aGlzLmNvbnRleHQuZ2V0UG9wR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogQ2xvbmUgYFJlc291cmNlc2AgaWYgaXQgaXMgaW5oZXJpdGVkXG4gICAgICAgIHZhciBkaWN0T3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUuUmVzb3VyY2VzKTtcbiAgICAgICAgdmFyIFJlc291cmNlcyA9IGNvbnRleHQubG9va3VwTWF5YmUoZGljdE9yUmVmLCBQREZEaWN0KSB8fCBjb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIHRoaXMuc2V0KFBERk5hbWUuUmVzb3VyY2VzLCBSZXNvdXJjZXMpO1xuICAgICAgICAvLyBUT0RPOiBDbG9uZSBgRm9udGAgaWYgaXQgaXMgaW5oZXJpdGVkXG4gICAgICAgIHZhciBGb250ID0gUmVzb3VyY2VzLmxvb2t1cE1heWJlKFBERk5hbWUuRm9udCwgUERGRGljdCkgfHwgY29udGV4dC5vYmooe30pO1xuICAgICAgICBSZXNvdXJjZXMuc2V0KFBERk5hbWUuRm9udCwgRm9udCk7XG4gICAgICAgIC8vIFRPRE86IENsb25lIGBYT2JqZWN0YCBpZiBpdCBpcyBpbmhlcml0ZWRcbiAgICAgICAgdmFyIFhPYmplY3QgPSBSZXNvdXJjZXMubG9va3VwTWF5YmUoUERGTmFtZS5YT2JqZWN0LCBQREZEaWN0KSB8fCBjb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIFJlc291cmNlcy5zZXQoUERGTmFtZS5YT2JqZWN0LCBYT2JqZWN0KTtcbiAgICAgICAgLy8gVE9ETzogQ2xvbmUgYEV4dEdTdGF0ZWAgaWYgaXQgaXMgaW5oZXJpdGVkXG4gICAgICAgIHZhciBFeHRHU3RhdGUgPSBSZXNvdXJjZXMubG9va3VwTWF5YmUoUERGTmFtZS5FeHRHU3RhdGUsIFBERkRpY3QpIHx8IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgUmVzb3VyY2VzLnNldChQREZOYW1lLkV4dEdTdGF0ZSwgRXh0R1N0YXRlKTtcbiAgICAgICAgdmFyIEFubm90cyA9IHRoaXMuQW5ub3RzKCkgfHwgY29udGV4dC5vYmooW10pO1xuICAgICAgICB0aGlzLnNldChQREZOYW1lLkFubm90cywgQW5ub3RzKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5ub3JtYWxpemVkRW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ub3JtYWxpemUoKTtcbiAgICAgICAgdmFyIEFubm90cyA9IHRoaXMuQW5ub3RzKCk7XG4gICAgICAgIHZhciBSZXNvdXJjZXMgPSB0aGlzLlJlc291cmNlcygpO1xuICAgICAgICB2YXIgQ29udGVudHMgPSB0aGlzLkNvbnRlbnRzKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBBbm5vdHM6IEFubm90cyxcbiAgICAgICAgICAgIFJlc291cmNlczogUmVzb3VyY2VzLFxuICAgICAgICAgICAgQ29udGVudHM6IENvbnRlbnRzLFxuICAgICAgICAgICAgRm9udDogUmVzb3VyY2VzLmxvb2t1cChQREZOYW1lLkZvbnQsIFBERkRpY3QpLFxuICAgICAgICAgICAgWE9iamVjdDogUmVzb3VyY2VzLmxvb2t1cChQREZOYW1lLlhPYmplY3QsIFBERkRpY3QpLFxuICAgICAgICAgICAgRXh0R1N0YXRlOiBSZXNvdXJjZXMubG9va3VwKFBERk5hbWUuRXh0R1N0YXRlLCBQREZEaWN0KSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLkluaGVyaXRhYmxlRW50cmllcyA9IFtcbiAgICAgICAgJ1Jlc291cmNlcycsXG4gICAgICAgICdNZWRpYUJveCcsXG4gICAgICAgICdDcm9wQm94JyxcbiAgICAgICAgJ1JvdGF0ZScsXG4gICAgXTtcbiAgICBQREZQYWdlTGVhZi53aXRoQ29udGV4dEFuZFBhcmVudCA9IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBuZXcgTWFwKCk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUuVHlwZSwgUERGTmFtZS5QYWdlKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5QYXJlbnQsIHBhcmVudCk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUuUmVzb3VyY2VzLCBjb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLk1lZGlhQm94LCBjb250ZXh0Lm9iaihbMCwgMCwgNjEyLCA3OTJdKSk7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZUxlYWYoZGljdCwgY29udGV4dCwgZmFsc2UpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYuZnJvbU1hcFdpdGhDb250ZXh0ID0gZnVuY3Rpb24gKG1hcCwgY29udGV4dCwgYXV0b05vcm1hbGl6ZUNUTSkge1xuICAgICAgICBpZiAoYXV0b05vcm1hbGl6ZUNUTSA9PT0gdm9pZCAwKSB7IGF1dG9Ob3JtYWxpemVDVE0gPSB0cnVlOyB9XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZUxlYWYobWFwLCBjb250ZXh0LCBhdXRvTm9ybWFsaXplQ1RNKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZQYWdlTGVhZjtcbn0oUERGRGljdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUGFnZUxlYWY7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZQYWdlTGVhZi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZQYWdlTGVhZiBmcm9tIFwiLi9QREZQYWdlTGVhZlwiO1xuaW1wb3J0IHsgSW52YWxpZFRhcmdldEluZGV4RXJyb3IsIENvcnJ1cHRQYWdlVHJlZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERlBhZ2VUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZQYWdlVHJlZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZQYWdlVHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUuUGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXAoUERGTmFtZS5vZignUGFyZW50JykpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLktpZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cChQREZOYW1lLm9mKCdLaWRzJyksIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5Db3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwKFBERk5hbWUub2YoJ0NvdW50JyksIFBERk51bWJlcik7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUucHVzaFRyZWVOb2RlID0gZnVuY3Rpb24gKHRyZWVSZWYpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgS2lkcy5wdXNoKHRyZWVSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLnB1c2hMZWFmTm9kZSA9IGZ1bmN0aW9uIChsZWFmUmVmKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIHRoaXMuaW5zZXJ0TGVhZktpZChLaWRzLnNpemUoKSwgbGVhZlJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSBnaXZlbiByZWYgYXMgYSBsZWFmIG5vZGUgb2YgdGhpcyBwYWdlIHRyZWUgYXQgdGhlIHNwZWNpZmllZFxuICAgICAqIGluZGV4ICh6ZXJvLWJhc2VkKS4gQWxzbyBpbmNyZW1lbnRzIHRoZSBgQ291bnRgIG9mIGVhY2ggcGFnZSB0cmVlIGluIHRoZVxuICAgICAqIGhpZXJhcmNoeSB0byBhY2NvbW9kYXRlIHRoZSBuZXcgcGFnZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdGhlIHJlZiBvZiB0aGUgUERGUGFnZVRyZWUgbm9kZSBpbnRvIHdoaWNoIGBsZWFmUmVmYCB3YXMgaW5zZXJ0ZWQsXG4gICAgICogb3IgYHVuZGVmaW5lZGAgaWYgaXQgd2FzIGluc2VydGVkIGludG8gdGhlIHJvb3Qgbm9kZSAodGhlIFBERlBhZ2VUcmVlIHVwb25cbiAgICAgKiB3aGljaCB0aGUgbWV0aG9kIHdhcyBmaXJzdCBjYWxsZWQpLlxuICAgICAqL1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5pbnNlcnRMZWFmTm9kZSA9IGZ1bmN0aW9uIChsZWFmUmVmLCB0YXJnZXRJbmRleCkge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICB2YXIgQ291bnQgPSB0aGlzLkNvdW50KCkuYXNOdW1iZXIoKTtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID4gQ291bnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvcih0YXJnZXRJbmRleCwgQ291bnQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0ID0gdGFyZ2V0SW5kZXg7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEtpZHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBpZiAobGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIEluc2VydCBwYWdlIGFuZCByZXR1cm5cbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExlYWZLaWQoaWR4LCBsZWFmUmVmKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGtpZFJlZiA9IEtpZHMuZ2V0KGlkeCk7XG4gICAgICAgICAgICB2YXIga2lkID0gdGhpcy5jb250ZXh0Lmxvb2t1cChraWRSZWYpO1xuICAgICAgICAgICAgaWYgKGtpZCBpbnN0YW5jZW9mIFBERlBhZ2VUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtpZC5Db3VudCgpLmFzTnVtYmVyKCkgPiBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERpZyBpblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGtpZC5pbnNlcnRMZWFmTm9kZShsZWFmUmVmLCBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0KSB8fCBraWRSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvblxuICAgICAgICAgICAgICAgICAgICBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0IC09IGtpZC5Db3VudCgpLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtpZCBpbnN0YW5jZW9mIFBERlBhZ2VMZWFmKSB7XG4gICAgICAgICAgICAgICAgLy8gTW92ZSBvblxuICAgICAgICAgICAgICAgIGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgLT0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gSW5zZXJ0IHBhZ2UgYXQgdGhlIGVuZCBhbmQgcmV0dXJuXG4gICAgICAgICAgICB0aGlzLmluc2VydExlYWZLaWQoS2lkcy5zaXplKCksIGxlYWZSZWYpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgaWYgYHRhcmdldEluZGV4YCBpcyB2YWxpZFxuICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFBhZ2VUcmVlRXJyb3IodGFyZ2V0SW5kZXgsICdpbnNlcnRMZWFmTm9kZScpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGVhZiBub2RlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggKHplcm8tYmFzZWQpIGZyb20gdGhpcyBwYWdlXG4gICAgICogdHJlZS4gQWxzbyBkZWNyZW1lbnRzIHRoZSBgQ291bnRgIG9mIGVhY2ggcGFnZSB0cmVlIGluIHRoZSBoaWVyYXJjaHkgdG9cbiAgICAgKiBhY2NvdW50IGZvciB0aGUgcmVtb3ZlZCBwYWdlLlxuICAgICAqXG4gICAgICogSWYgYHBydW5lYCBpcyB0cnVlLCB0aGVuIGludGVybWVkaWF0ZSB0cmVlIG5vZGVzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZVxuICAgICAqIHRyZWUgaWYgdGhleSBjb250YWluIDAgY2hpbGRyZW4gYWZ0ZXIgdGhlIGxlYWYgbm9kZSBpcyByZW1vdmVkLlxuICAgICAqL1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5yZW1vdmVMZWFmTm9kZSA9IGZ1bmN0aW9uICh0YXJnZXRJbmRleCwgcHJ1bmUpIHtcbiAgICAgICAgaWYgKHBydW5lID09PSB2b2lkIDApIHsgcHJ1bmUgPSB0cnVlOyB9XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIHZhciBDb3VudCA9IHRoaXMuQ291bnQoKS5hc051bWJlcigpO1xuICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gQ291bnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvcih0YXJnZXRJbmRleCwgQ291bnQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0ID0gdGFyZ2V0SW5kZXg7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEtpZHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIga2lkUmVmID0gS2lkcy5nZXQoaWR4KTtcbiAgICAgICAgICAgIHZhciBraWQgPSB0aGlzLmNvbnRleHQubG9va3VwKGtpZFJlZik7XG4gICAgICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUERGUGFnZVRyZWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2lkLkNvdW50KCkuYXNOdW1iZXIoKSA+IGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlnIGluXG4gICAgICAgICAgICAgICAgICAgIGtpZC5yZW1vdmVMZWFmTm9kZShsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0LCBwcnVuZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcnVuZSAmJiBraWQuS2lkcygpLnNpemUoKSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIEtpZHMucmVtb3ZlKGlkeCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb25cbiAgICAgICAgICAgICAgICAgICAgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCAtPSBraWQuQ291bnQoKS5hc051bWJlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChraWQgaW5zdGFuY2VvZiBQREZQYWdlTGVhZikge1xuICAgICAgICAgICAgICAgIGlmIChsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBwYWdlIGFuZCByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVLaWQoaWR4KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvblxuICAgICAgICAgICAgICAgICAgICBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0IC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciBnZXQgaGVyZSBpZiBgdGFyZ2V0SW5kZXhgIGlzIHZhbGlkXG4gICAgICAgIHRocm93IG5ldyBDb3JydXB0UGFnZVRyZWVFcnJvcih0YXJnZXRJbmRleCwgJ3JlbW92ZUxlYWZOb2RlJyk7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUuYXNjZW5kID0gZnVuY3Rpb24gKHZpc2l0b3IpIHtcbiAgICAgICAgdmlzaXRvcih0aGlzKTtcbiAgICAgICAgdmFyIFBhcmVudCA9IHRoaXMuUGFyZW50KCk7XG4gICAgICAgIGlmIChQYXJlbnQpXG4gICAgICAgICAgICBQYXJlbnQuYXNjZW5kKHZpc2l0b3IpO1xuICAgIH07XG4gICAgLyoqIFBlcmZvcm1zIGEgUG9zdC1PcmRlciB0cmF2ZXJzYWwgb2YgdGhpcyBwYWdlIHRyZWUgKi9cbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUudHJhdmVyc2UgPSBmdW5jdGlvbiAodmlzaXRvcikge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBLaWRzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGtpZFJlZiA9IEtpZHMuZ2V0KGlkeCk7XG4gICAgICAgICAgICB2YXIga2lkID0gdGhpcy5jb250ZXh0Lmxvb2t1cChraWRSZWYpO1xuICAgICAgICAgICAgaWYgKGtpZCBpbnN0YW5jZW9mIFBERlBhZ2VUcmVlKVxuICAgICAgICAgICAgICAgIGtpZC50cmF2ZXJzZSh2aXNpdG9yKTtcbiAgICAgICAgICAgIHZpc2l0b3Ioa2lkLCBraWRSZWYpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUuaW5zZXJ0TGVhZktpZCA9IGZ1bmN0aW9uIChraWRJZHgsIGxlYWZSZWYpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgdGhpcy5hc2NlbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHZhciBuZXdDb3VudCA9IG5vZGUuQ291bnQoKS5hc051bWJlcigpICsgMTtcbiAgICAgICAgICAgIG5vZGUuc2V0KFBERk5hbWUub2YoJ0NvdW50JyksIFBERk51bWJlci5vZihuZXdDb3VudCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgS2lkcy5pbnNlcnQoa2lkSWR4LCBsZWFmUmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5yZW1vdmVLaWQgPSBmdW5jdGlvbiAoa2lkSWR4KSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIHZhciBraWQgPSBLaWRzLmxvb2t1cChraWRJZHgpO1xuICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUERGUGFnZUxlYWYpIHtcbiAgICAgICAgICAgIHRoaXMuYXNjZW5kKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld0NvdW50ID0gbm9kZS5Db3VudCgpLmFzTnVtYmVyKCkgLSAxO1xuICAgICAgICAgICAgICAgIG5vZGUuc2V0KFBERk5hbWUub2YoJ0NvdW50JyksIFBERk51bWJlci5vZihuZXdDb3VudCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgS2lkcy5yZW1vdmUoa2lkSWR4KTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLndpdGhDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHBhcmVudCkge1xuICAgICAgICB2YXIgZGljdCA9IG5ldyBNYXAoKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignVHlwZScpLCBQREZOYW1lLm9mKCdQYWdlcycpKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignS2lkcycpLCBjb250ZXh0Lm9iaihbXSkpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdDb3VudCcpLCBjb250ZXh0Lm9iaigwKSk7XG4gICAgICAgIGlmIChwYXJlbnQpXG4gICAgICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdQYXJlbnQnKSwgcGFyZW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZQYWdlVHJlZShkaWN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLmZyb21NYXBXaXRoQ29udGV4dCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZQYWdlVHJlZShtYXAsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlBhZ2VUcmVlO1xufShQREZEaWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZQYWdlVHJlZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlBhZ2VUcmVlLmpzLm1hcCIsInZhciBDaGFyQ29kZXM7XG4oZnVuY3Rpb24gKENoYXJDb2Rlcykge1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJOdWxsXCJdID0gMF0gPSBcIk51bGxcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiQmFja3NwYWNlXCJdID0gOF0gPSBcIkJhY2tzcGFjZVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJUYWJcIl0gPSA5XSA9IFwiVGFiXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIk5ld2xpbmVcIl0gPSAxMF0gPSBcIk5ld2xpbmVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRm9ybUZlZWRcIl0gPSAxMl0gPSBcIkZvcm1GZWVkXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkNhcnJpYWdlUmV0dXJuXCJdID0gMTNdID0gXCJDYXJyaWFnZVJldHVyblwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJTcGFjZVwiXSA9IDMyXSA9IFwiU3BhY2VcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRXhjbGFtYXRpb25Qb2ludFwiXSA9IDMzXSA9IFwiRXhjbGFtYXRpb25Qb2ludFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJIYXNoXCJdID0gMzVdID0gXCJIYXNoXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlBlcmNlbnRcIl0gPSAzN10gPSBcIlBlcmNlbnRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTGVmdFBhcmVuXCJdID0gNDBdID0gXCJMZWZ0UGFyZW5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUmlnaHRQYXJlblwiXSA9IDQxXSA9IFwiUmlnaHRQYXJlblwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJQbHVzXCJdID0gNDNdID0gXCJQbHVzXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIk1pbnVzXCJdID0gNDVdID0gXCJNaW51c1wiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJEYXNoXCJdID0gNDVdID0gXCJEYXNoXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlBlcmlvZFwiXSA9IDQ2XSA9IFwiUGVyaW9kXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkZvcndhcmRTbGFzaFwiXSA9IDQ3XSA9IFwiRm9yd2FyZFNsYXNoXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlplcm9cIl0gPSA0OF0gPSBcIlplcm9cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiT25lXCJdID0gNDldID0gXCJPbmVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiVHdvXCJdID0gNTBdID0gXCJUd29cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiVGhyZWVcIl0gPSA1MV0gPSBcIlRocmVlXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkZvdXJcIl0gPSA1Ml0gPSBcIkZvdXJcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRml2ZVwiXSA9IDUzXSA9IFwiRml2ZVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJTaXhcIl0gPSA1NF0gPSBcIlNpeFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJTZXZlblwiXSA9IDU1XSA9IFwiU2V2ZW5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRWlnaHRcIl0gPSA1Nl0gPSBcIkVpZ2h0XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIk5pbmVcIl0gPSA1N10gPSBcIk5pbmVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTGVzc1RoYW5cIl0gPSA2MF0gPSBcIkxlc3NUaGFuXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkdyZWF0ZXJUaGFuXCJdID0gNjJdID0gXCJHcmVhdGVyVGhhblwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJBXCJdID0gNjVdID0gXCJBXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkRcIl0gPSA2OF0gPSBcIkRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRVwiXSA9IDY5XSA9IFwiRVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJGXCJdID0gNzBdID0gXCJGXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIk9cIl0gPSA3OV0gPSBcIk9cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUFwiXSA9IDgwXSA9IFwiUFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJSXCJdID0gODJdID0gXCJSXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxlZnRTcXVhcmVCcmFja2V0XCJdID0gOTFdID0gXCJMZWZ0U3F1YXJlQnJhY2tldFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJCYWNrU2xhc2hcIl0gPSA5Ml0gPSBcIkJhY2tTbGFzaFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJSaWdodFNxdWFyZUJyYWNrZXRcIl0gPSA5M10gPSBcIlJpZ2h0U3F1YXJlQnJhY2tldFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJhXCJdID0gOTddID0gXCJhXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImJcIl0gPSA5OF0gPSBcImJcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiZFwiXSA9IDEwMF0gPSBcImRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiZVwiXSA9IDEwMV0gPSBcImVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiZlwiXSA9IDEwMl0gPSBcImZcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiaVwiXSA9IDEwNV0gPSBcImlcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wialwiXSA9IDEwNl0gPSBcImpcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wibFwiXSA9IDEwOF0gPSBcImxcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wibVwiXSA9IDEwOV0gPSBcIm1cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiblwiXSA9IDExMF0gPSBcIm5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wib1wiXSA9IDExMV0gPSBcIm9cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiclwiXSA9IDExNF0gPSBcInJcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wic1wiXSA9IDExNV0gPSBcInNcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1widFwiXSA9IDExNl0gPSBcInRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1widVwiXSA9IDExN10gPSBcInVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wieFwiXSA9IDEyMF0gPSBcInhcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTGVmdEN1cmx5XCJdID0gMTIzXSA9IFwiTGVmdEN1cmx5XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlJpZ2h0Q3VybHlcIl0gPSAxMjVdID0gXCJSaWdodEN1cmx5XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlRpbGRlXCJdID0gMTI2XSA9IFwiVGlsZGVcIjtcbn0pKENoYXJDb2RlcyB8fCAoQ2hhckNvZGVzID0ge30pKTtcbmV4cG9ydCBkZWZhdWx0IENoYXJDb2Rlcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJDb2Rlcy5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuL0NoYXJDb2Rlc1wiO1xuZXhwb3J0IHZhciBJc0RlbGltaXRlciA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuTGVmdFBhcmVuXSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuUmlnaHRQYXJlbl0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLkxlc3NUaGFuXSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuR3JlYXRlclRoYW5dID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5MZWZ0U3F1YXJlQnJhY2tldF0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLlJpZ2h0U3F1YXJlQnJhY2tldF0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLkxlZnRDdXJseV0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLlJpZ2h0Q3VybHldID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5Gb3J3YXJkU2xhc2hdID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5QZXJjZW50XSA9IDE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZWxpbWl0ZXJzLmpzLm1hcCIsImltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4vQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBJc0RlbGltaXRlciB9IGZyb20gXCIuL0RlbGltaXRlcnNcIjtcbmltcG9ydCB7IElzV2hpdGVzcGFjZSB9IGZyb20gXCIuL1doaXRlc3BhY2VcIjtcbmV4cG9ydCB2YXIgSXNJcnJlZ3VsYXIgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gMjU2OyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgSXNJcnJlZ3VsYXJbaWR4XSA9IElzV2hpdGVzcGFjZVtpZHhdIHx8IElzRGVsaW1pdGVyW2lkeF0gPyAxIDogMDtcbn1cbklzSXJyZWd1bGFyW0NoYXJDb2Rlcy5IYXNoXSA9IDE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JcnJlZ3VsYXIuanMubWFwIiwiaW1wb3J0IHsgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4vQ2hhckNvZGVzXCI7XG52YXIgU3BhY2UgPSBDaGFyQ29kZXMuU3BhY2UsIENhcnJpYWdlUmV0dXJuID0gQ2hhckNvZGVzLkNhcnJpYWdlUmV0dXJuLCBOZXdsaW5lID0gQ2hhckNvZGVzLk5ld2xpbmU7XG52YXIgc3RyZWFtID0gW1xuICAgIENoYXJDb2Rlcy5zLFxuICAgIENoYXJDb2Rlcy50LFxuICAgIENoYXJDb2Rlcy5yLFxuICAgIENoYXJDb2Rlcy5lLFxuICAgIENoYXJDb2Rlcy5hLFxuICAgIENoYXJDb2Rlcy5tLFxuXTtcbnZhciBlbmRzdHJlYW0gPSBbXG4gICAgQ2hhckNvZGVzLmUsXG4gICAgQ2hhckNvZGVzLm4sXG4gICAgQ2hhckNvZGVzLmQsXG4gICAgQ2hhckNvZGVzLnMsXG4gICAgQ2hhckNvZGVzLnQsXG4gICAgQ2hhckNvZGVzLnIsXG4gICAgQ2hhckNvZGVzLmUsXG4gICAgQ2hhckNvZGVzLmEsXG4gICAgQ2hhckNvZGVzLm0sXG5dO1xuZXhwb3J0IHZhciBLZXl3b3JkcyA9IHtcbiAgICBoZWFkZXI6IFtcbiAgICAgICAgQ2hhckNvZGVzLlBlcmNlbnQsXG4gICAgICAgIENoYXJDb2Rlcy5QLFxuICAgICAgICBDaGFyQ29kZXMuRCxcbiAgICAgICAgQ2hhckNvZGVzLkYsXG4gICAgICAgIENoYXJDb2Rlcy5EYXNoLFxuICAgIF0sXG4gICAgZW9mOiBbXG4gICAgICAgIENoYXJDb2Rlcy5QZXJjZW50LFxuICAgICAgICBDaGFyQ29kZXMuUGVyY2VudCxcbiAgICAgICAgQ2hhckNvZGVzLkUsXG4gICAgICAgIENoYXJDb2Rlcy5PLFxuICAgICAgICBDaGFyQ29kZXMuRixcbiAgICBdLFxuICAgIG9iajogW0NoYXJDb2Rlcy5vLCBDaGFyQ29kZXMuYiwgQ2hhckNvZGVzLmpdLFxuICAgIGVuZG9iajogW1xuICAgICAgICBDaGFyQ29kZXMuZSxcbiAgICAgICAgQ2hhckNvZGVzLm4sXG4gICAgICAgIENoYXJDb2Rlcy5kLFxuICAgICAgICBDaGFyQ29kZXMubyxcbiAgICAgICAgQ2hhckNvZGVzLmIsXG4gICAgICAgIENoYXJDb2Rlcy5qLFxuICAgIF0sXG4gICAgeHJlZjogW0NoYXJDb2Rlcy54LCBDaGFyQ29kZXMuciwgQ2hhckNvZGVzLmUsIENoYXJDb2Rlcy5mXSxcbiAgICB0cmFpbGVyOiBbXG4gICAgICAgIENoYXJDb2Rlcy50LFxuICAgICAgICBDaGFyQ29kZXMucixcbiAgICAgICAgQ2hhckNvZGVzLmEsXG4gICAgICAgIENoYXJDb2Rlcy5pLFxuICAgICAgICBDaGFyQ29kZXMubCxcbiAgICAgICAgQ2hhckNvZGVzLmUsXG4gICAgICAgIENoYXJDb2Rlcy5yLFxuICAgIF0sXG4gICAgc3RhcnR4cmVmOiBbXG4gICAgICAgIENoYXJDb2Rlcy5zLFxuICAgICAgICBDaGFyQ29kZXMudCxcbiAgICAgICAgQ2hhckNvZGVzLmEsXG4gICAgICAgIENoYXJDb2Rlcy5yLFxuICAgICAgICBDaGFyQ29kZXMudCxcbiAgICAgICAgQ2hhckNvZGVzLngsXG4gICAgICAgIENoYXJDb2Rlcy5yLFxuICAgICAgICBDaGFyQ29kZXMuZSxcbiAgICAgICAgQ2hhckNvZGVzLmYsXG4gICAgXSxcbiAgICB0cnVlOiBbQ2hhckNvZGVzLnQsIENoYXJDb2Rlcy5yLCBDaGFyQ29kZXMudSwgQ2hhckNvZGVzLmVdLFxuICAgIGZhbHNlOiBbQ2hhckNvZGVzLmYsIENoYXJDb2Rlcy5hLCBDaGFyQ29kZXMubCwgQ2hhckNvZGVzLnMsIENoYXJDb2Rlcy5lXSxcbiAgICBudWxsOiBbQ2hhckNvZGVzLm4sIENoYXJDb2Rlcy51LCBDaGFyQ29kZXMubCwgQ2hhckNvZGVzLmxdLFxuICAgIHN0cmVhbTogc3RyZWFtLFxuICAgIHN0cmVhbUVPRjE6IF9fc3ByZWFkQXJyYXlzKHN0cmVhbSwgW1NwYWNlLCBDYXJyaWFnZVJldHVybiwgTmV3bGluZV0pLFxuICAgIHN0cmVhbUVPRjI6IF9fc3ByZWFkQXJyYXlzKHN0cmVhbSwgW0NhcnJpYWdlUmV0dXJuLCBOZXdsaW5lXSksXG4gICAgc3RyZWFtRU9GMzogX19zcHJlYWRBcnJheXMoc3RyZWFtLCBbQ2FycmlhZ2VSZXR1cm5dKSxcbiAgICBzdHJlYW1FT0Y0OiBfX3NwcmVhZEFycmF5cyhzdHJlYW0sIFtOZXdsaW5lXSksXG4gICAgZW5kc3RyZWFtOiBlbmRzdHJlYW0sXG4gICAgRU9GMWVuZHN0cmVhbTogX19zcHJlYWRBcnJheXMoW0NhcnJpYWdlUmV0dXJuLCBOZXdsaW5lXSwgZW5kc3RyZWFtKSxcbiAgICBFT0YyZW5kc3RyZWFtOiBfX3NwcmVhZEFycmF5cyhbQ2FycmlhZ2VSZXR1cm5dLCBlbmRzdHJlYW0pLFxuICAgIEVPRjNlbmRzdHJlYW06IF9fc3ByZWFkQXJyYXlzKFtOZXdsaW5lXSwgZW5kc3RyZWFtKSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1LZXl3b3Jkcy5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuL0NoYXJDb2Rlc1wiO1xuZXhwb3J0IHZhciBJc0RpZ2l0ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbklzRGlnaXRbQ2hhckNvZGVzLlplcm9dID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLk9uZV0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuVHdvXSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5UaHJlZV0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuRm91cl0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuRml2ZV0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuU2l4XSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5TZXZlbl0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuRWlnaHRdID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLk5pbmVdID0gMTtcbmV4cG9ydCB2YXIgSXNOdW1lcmljUHJlZml4ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbklzTnVtZXJpY1ByZWZpeFtDaGFyQ29kZXMuUGVyaW9kXSA9IDE7XG5Jc051bWVyaWNQcmVmaXhbQ2hhckNvZGVzLlBsdXNdID0gMTtcbklzTnVtZXJpY1ByZWZpeFtDaGFyQ29kZXMuTWludXNdID0gMTtcbmV4cG9ydCB2YXIgSXNOdW1lcmljID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAodmFyIGlkeCA9IDAsIGxlbiA9IDI1NjsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgIElzTnVtZXJpY1tpZHhdID0gSXNEaWdpdFtpZHhdIHx8IElzTnVtZXJpY1ByZWZpeFtpZHhdID8gMSA6IDA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OdW1lcmljLmpzLm1hcCIsImltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4vQ2hhckNvZGVzXCI7XG5leHBvcnQgdmFyIElzV2hpdGVzcGFjZSA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLk51bGxdID0gMTtcbklzV2hpdGVzcGFjZVtDaGFyQ29kZXMuVGFiXSA9IDE7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLk5ld2xpbmVdID0gMTtcbklzV2hpdGVzcGFjZVtDaGFyQ29kZXMuRm9ybUZlZWRdID0gMTtcbklzV2hpdGVzcGFjZVtDaGFyQ29kZXMuQ2FycmlhZ2VSZXR1cm5dID0gMTtcbklzV2hpdGVzcGFjZVtDaGFyQ29kZXMuU3BhY2VdID0gMTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoaXRlc3BhY2UuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGSGVhZGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZIZWFkZXJcIjtcbmltcG9ydCBQREZUcmFpbGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZUcmFpbGVyXCI7XG5pbXBvcnQgUERGSW52YWxpZE9iamVjdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZJbnZhbGlkT2JqZWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGU3RyZWFtXCI7XG5pbXBvcnQgUERGQ3Jvc3NSZWZTdHJlYW0gZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGQ3Jvc3NSZWZTdHJlYW1cIjtcbmltcG9ydCBQREZPYmplY3RTdHJlYW0gZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGT2JqZWN0U3RyZWFtXCI7XG5pbXBvcnQgUERGV3JpdGVyIGZyb20gXCIuL1BERldyaXRlclwiO1xuaW1wb3J0IHsgbGFzdCwgd2FpdEZvclRpY2sgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZTdHJlYW1Xcml0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlN0cmVhbVdyaXRlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZTdHJlYW1Xcml0ZXIoY29udGV4dCwgb2JqZWN0c1BlclRpY2ssIGVuY29kZVN0cmVhbXMsIG9iamVjdHNQZXJTdHJlYW0pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29udGV4dCwgb2JqZWN0c1BlclRpY2spIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmVuY29kZVN0cmVhbXMgPSBlbmNvZGVTdHJlYW1zO1xuICAgICAgICBfdGhpcy5vYmplY3RzUGVyU3RyZWFtID0gb2JqZWN0c1BlclN0cmVhbTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmNvbXB1dGVCdWZmZXJTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0TnVtYmVyLCBoZWFkZXIsIHNpemUsIHhyZWZTdHJlYW0sIHVuY29tcHJlc3NlZE9iamVjdHMsIGNvbXByZXNzZWRPYmplY3RzLCBvYmplY3RTdHJlYW1SZWZzLCBpbmRpcmVjdE9iamVjdHMsIGlkeCwgbGVuLCBpbmRpcmVjdE9iamVjdCwgcmVmLCBvYmplY3QsIHNob3VsZE5vdENvbXByZXNzLCBjaHVuaywgb2JqZWN0U3RyZWFtUmVmLCBpZHgsIGxlbiwgY2h1bmssIHJlZiwgb2JqZWN0U3RyZWFtLCB4cmVmU3RyZWFtUmVmLCB4cmVmT2Zmc2V0LCB0cmFpbGVyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TnVtYmVyID0gdGhpcy5jb250ZXh0Lmxhcmdlc3RPYmplY3ROdW1iZXIgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gUERGSGVhZGVyLmZvclZlcnNpb24oMSwgNyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gaGVhZGVyLnNpemVJbkJ5dGVzKCkgKyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZlN0cmVhbSA9IFBERkNyb3NzUmVmU3RyZWFtLmNyZWF0ZSh0aGlzLmNyZWF0ZVRyYWlsZXJEaWN0KCksIHRoaXMuZW5jb2RlU3RyZWFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRPYmplY3RzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkT2JqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0U3RyZWFtUmVmcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3RPYmplY3RzID0gdGhpcy5jb250ZXh0LmVudW1lcmF0ZUluZGlyZWN0T2JqZWN0cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gMCwgbGVuID0gaW5kaXJlY3RPYmplY3RzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpcmVjdE9iamVjdCA9IGluZGlyZWN0T2JqZWN0c1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gaW5kaXJlY3RPYmplY3RbMF0sIG9iamVjdCA9IGluZGlyZWN0T2JqZWN0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkTm90Q29tcHJlc3MgPSByZWYgPT09IHRoaXMuY29udGV4dC50cmFpbGVySW5mby5FbmNyeXB0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgUERGU3RyZWFtIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgUERGSW52YWxpZE9iamVjdCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5nZW5lcmF0aW9uTnVtYmVyICE9PSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGROb3RDb21wcmVzcykgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRPYmplY3RzLnB1c2goaW5kaXJlY3RPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZlN0cmVhbS5hZGRVbmNvbXByZXNzZWRFbnRyeShyZWYsIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0aGlzLmNvbXB1dGVJbmRpcmVjdE9iamVjdFNpemUoaW5kaXJlY3RPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFdhaXRGb3JUaWNrKDEpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rID0gbGFzdChjb21wcmVzc2VkT2JqZWN0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RTdHJlYW1SZWYgPSBsYXN0KG9iamVjdFN0cmVhbVJlZnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaHVuayB8fCBjaHVuay5sZW5ndGggJSB0aGlzLm9iamVjdHNQZXJTdHJlYW0gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuayA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRPYmplY3RzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFN0cmVhbVJlZiA9IFBERlJlZi5vZihvYmplY3ROdW1iZXIrKyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0U3RyZWFtUmVmcy5wdXNoKG9iamVjdFN0cmVhbVJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmU3RyZWFtLmFkZENvbXByZXNzZWRFbnRyeShyZWYsIG9iamVjdFN0cmVhbVJlZiwgY2h1bmsubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLnB1c2goaW5kaXJlY3RPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAwLCBsZW4gPSBjb21wcmVzc2VkT2JqZWN0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rID0gY29tcHJlc3NlZE9iamVjdHNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IG9iamVjdFN0cmVhbVJlZnNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFN0cmVhbSA9IFBERk9iamVjdFN0cmVhbS53aXRoQ29udGV4dEFuZE9iamVjdHModGhpcy5jb250ZXh0LCBjaHVuaywgdGhpcy5lbmNvZGVTdHJlYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW0uYWRkVW5jb21wcmVzc2VkRW50cnkocmVmLCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jb21wdXRlSW5kaXJlY3RPYmplY3RTaXplKFtyZWYsIG9iamVjdFN0cmVhbV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkT2JqZWN0cy5wdXNoKFtyZWYsIG9iamVjdFN0cmVhbV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFdhaXRGb3JUaWNrKGNodW5rLmxlbmd0aCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2FpdEZvclRpY2soKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gOTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW1SZWYgPSBQREZSZWYub2Yob2JqZWN0TnVtYmVyKyspO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZlN0cmVhbS5kaWN0LnNldChQREZOYW1lLm9mKCdTaXplJyksIFBERk51bWJlci5vZihvYmplY3ROdW1iZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW0uYWRkVW5jb21wcmVzc2VkRW50cnkoeHJlZlN0cmVhbVJlZiwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmT2Zmc2V0ID0gc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jb21wdXRlSW5kaXJlY3RPYmplY3RTaXplKFt4cmVmU3RyZWFtUmVmLCB4cmVmU3RyZWFtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRPYmplY3RzLnB1c2goW3hyZWZTdHJlYW1SZWYsIHhyZWZTdHJlYW1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsZXIgPSBQREZUcmFpbGVyLmZvckxhc3RDcm9zc1JlZlNlY3Rpb25PZmZzZXQoeHJlZk9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRyYWlsZXIuc2l6ZUluQnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IHNpemU6IHNpemUsIGhlYWRlcjogaGVhZGVyLCBpbmRpcmVjdE9iamVjdHM6IHVuY29tcHJlc3NlZE9iamVjdHMsIHRyYWlsZXI6IHRyYWlsZXIgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGU3RyZWFtV3JpdGVyLmZvckNvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgb2JqZWN0c1BlclRpY2ssIGVuY29kZVN0cmVhbXMsIG9iamVjdHNQZXJTdHJlYW0pIHtcbiAgICAgICAgaWYgKGVuY29kZVN0cmVhbXMgPT09IHZvaWQgMCkgeyBlbmNvZGVTdHJlYW1zID0gdHJ1ZTsgfVxuICAgICAgICBpZiAob2JqZWN0c1BlclN0cmVhbSA9PT0gdm9pZCAwKSB7IG9iamVjdHNQZXJTdHJlYW0gPSA1MDsgfVxuICAgICAgICByZXR1cm4gbmV3IFBERlN0cmVhbVdyaXRlcihjb250ZXh0LCBvYmplY3RzUGVyVGljaywgZW5jb2RlU3RyZWFtcywgb2JqZWN0c1BlclN0cmVhbSk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGU3RyZWFtV3JpdGVyO1xufShQREZXcml0ZXIpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlN0cmVhbVdyaXRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlN0cmVhbVdyaXRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQ3Jvc3NSZWZTZWN0aW9uIGZyb20gXCIuLi9kb2N1bWVudC9QREZDcm9zc1JlZlNlY3Rpb25cIjtcbmltcG9ydCBQREZIZWFkZXIgZnJvbSBcIi4uL2RvY3VtZW50L1BERkhlYWRlclwiO1xuaW1wb3J0IFBERlRyYWlsZXIgZnJvbSBcIi4uL2RvY3VtZW50L1BERlRyYWlsZXJcIjtcbmltcG9ydCBQREZUcmFpbGVyRGljdCBmcm9tIFwiLi4vZG9jdW1lbnQvUERGVHJhaWxlckRpY3RcIjtcbmltcG9ydCBQREZPYmplY3RTdHJlYW0gZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGT2JqZWN0U3RyZWFtXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciwgd2FpdEZvclRpY2sgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZXcml0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGV3JpdGVyKGNvbnRleHQsIG9iamVjdHNQZXJUaWNrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMucGFyc2VkT2JqZWN0cyA9IDA7XG4gICAgICAgIHRoaXMuc2hvdWxkV2FpdEZvclRpY2sgPSBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgX3RoaXMucGFyc2VkT2JqZWN0cyArPSBuO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnBhcnNlZE9iamVjdHMgJSBfdGhpcy5vYmplY3RzUGVyVGljayA9PT0gMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5vYmplY3RzUGVyVGljayA9IG9iamVjdHNQZXJUaWNrO1xuICAgIH1cbiAgICBQREZXcml0ZXIucHJvdG90eXBlLnNlcmlhbGl6ZVRvQnVmZmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHNpemUsIGhlYWRlciwgaW5kaXJlY3RPYmplY3RzLCB4cmVmLCB0cmFpbGVyRGljdCwgdHJhaWxlciwgb2Zmc2V0LCBidWZmZXIsIGlkeCwgbGVuLCBfYiwgcmVmLCBvYmplY3QsIG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbk51bWJlciwgbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jb21wdXRlQnVmZmVyU2l6ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYy5zZW50KCksIHNpemUgPSBfYS5zaXplLCBoZWFkZXIgPSBfYS5oZWFkZXIsIGluZGlyZWN0T2JqZWN0cyA9IF9hLmluZGlyZWN0T2JqZWN0cywgeHJlZiA9IF9hLnhyZWYsIHRyYWlsZXJEaWN0ID0gX2EudHJhaWxlckRpY3QsIHRyYWlsZXIgPSBfYS50cmFpbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGhlYWRlci5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IGluZGlyZWN0T2JqZWN0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBpbmRpcmVjdE9iamVjdHNbaWR4XSwgcmVmID0gX2JbMF0sIG9iamVjdCA9IF9iWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TnVtYmVyID0gU3RyaW5nKHJlZi5vYmplY3ROdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKG9iamVjdE51bWJlciwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25OdW1iZXIgPSBTdHJpbmcocmVmLmdlbmVyYXRpb25OdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKGdlbmVyYXRpb25OdW1iZXIsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm87XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmI7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmo7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gb2JqZWN0LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5uO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5vO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5iO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5qO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG9iamVjdCBpbnN0YW5jZW9mIFBERk9iamVjdFN0cmVhbSA/IG9iamVjdC5nZXRPYmplY3RzQ291bnQoKSA6IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEZvclRpY2sobikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2FpdEZvclRpY2soKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0geHJlZi5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhaWxlckRpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdHJhaWxlckRpY3QuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB0cmFpbGVyLmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGJ1ZmZlcl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGV3JpdGVyLnByb3RvdHlwZS5jb21wdXRlSW5kaXJlY3RPYmplY3RTaXplID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciByZWYgPSBfYVswXSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgIHZhciByZWZTaXplID0gcmVmLnNpemVJbkJ5dGVzKCkgKyAzOyAvLyAnUicgLT4gJ29ialxcbidcbiAgICAgICAgdmFyIG9iamVjdFNpemUgPSBvYmplY3Quc2l6ZUluQnl0ZXMoKSArIDk7IC8vICdcXG5lbmRvYmpcXG5cXG4nXG4gICAgICAgIHJldHVybiByZWZTaXplICsgb2JqZWN0U2l6ZTtcbiAgICB9O1xuICAgIFBERldyaXRlci5wcm90b3R5cGUuY3JlYXRlVHJhaWxlckRpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIFNpemU6IHRoaXMuY29udGV4dC5sYXJnZXN0T2JqZWN0TnVtYmVyICsgMSxcbiAgICAgICAgICAgIFJvb3Q6IHRoaXMuY29udGV4dC50cmFpbGVySW5mby5Sb290LFxuICAgICAgICAgICAgRW5jcnlwdDogdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLkVuY3J5cHQsXG4gICAgICAgICAgICBJbmZvOiB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uSW5mbyxcbiAgICAgICAgICAgIElEOiB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uSUQsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGV3JpdGVyLnByb3RvdHlwZS5jb21wdXRlQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciwgc2l6ZSwgeHJlZiwgaW5kaXJlY3RPYmplY3RzLCBpZHgsIGxlbiwgaW5kaXJlY3RPYmplY3QsIHJlZiwgeHJlZk9mZnNldCwgdHJhaWxlckRpY3QsIHRyYWlsZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBQREZIZWFkZXIuZm9yVmVyc2lvbigxLCA3KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBoZWFkZXIuc2l6ZUluQnl0ZXMoKSArIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmID0gUERGQ3Jvc3NSZWZTZWN0aW9uLmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3RPYmplY3RzID0gdGhpcy5jb250ZXh0LmVudW1lcmF0ZUluZGlyZWN0T2JqZWN0cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gMCwgbGVuID0gaW5kaXJlY3RPYmplY3RzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpcmVjdE9iamVjdCA9IGluZGlyZWN0T2JqZWN0c1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gaW5kaXJlY3RPYmplY3RbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmLmFkZEVudHJ5KHJlZiwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRoaXMuY29tcHV0ZUluZGlyZWN0T2JqZWN0U2l6ZShpbmRpcmVjdE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEZvclRpY2soMSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2FpdEZvclRpY2soKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZk9mZnNldCA9IHNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHhyZWYuc2l6ZUluQnl0ZXMoKSArIDE7IC8vICdcXG4nXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGVyRGljdCA9IFBERlRyYWlsZXJEaWN0Lm9mKHRoaXMuY3JlYXRlVHJhaWxlckRpY3QoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRyYWlsZXJEaWN0LnNpemVJbkJ5dGVzKCkgKyAyOyAvLyAnXFxuXFxuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxlciA9IFBERlRyYWlsZXIuZm9yTGFzdENyb3NzUmVmU2VjdGlvbk9mZnNldCh4cmVmT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdHJhaWxlci5zaXplSW5CeXRlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgc2l6ZTogc2l6ZSwgaGVhZGVyOiBoZWFkZXIsIGluZGlyZWN0T2JqZWN0czogaW5kaXJlY3RPYmplY3RzLCB4cmVmOiB4cmVmLCB0cmFpbGVyRGljdDogdHJhaWxlckRpY3QsIHRyYWlsZXI6IHRyYWlsZXIgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGV3JpdGVyLmZvckNvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgb2JqZWN0c1BlclRpY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZXcml0ZXIoY29udGV4dCwgb2JqZWN0c1BlclRpY2spO1xuICAgIH07XG4gICAgcmV0dXJuIFBERldyaXRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZXcml0ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZXcml0ZXIuanMubWFwIiwiZXhwb3J0ICogZnJvbSBcIi4vYXBpL2luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3JlL2luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsInZhciBDYWNoZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYWNoZShwb3B1bGF0ZSkge1xuICAgICAgICB0aGlzLnBvcHVsYXRlID0gcG9wdWxhdGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIENhY2hlLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBDYWNoZS5wcm90b3R5cGUuYWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsdWUpXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5wb3B1bGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIENhY2hlLnByb3RvdHlwZS5pbnZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQ2FjaGUucG9wdWxhdGVkQnkgPSBmdW5jdGlvbiAocG9wdWxhdGUpIHsgcmV0dXJuIG5ldyBDYWNoZShwb3B1bGF0ZSk7IH07XG4gICAgcmV0dXJuIENhY2hlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IENhY2hlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2FjaGUuanMubWFwIiwiaW1wb3J0IHsgZGVjb2RlRnJvbUJhc2U2NERhdGFVcmkgfSBmcm9tIFwiLi9iYXNlNjRcIjtcbmltcG9ydCB7IGNoYXJGcm9tQ29kZSB9IGZyb20gXCIuL3N0cmluZ3NcIjtcbmV4cG9ydCB2YXIgbGFzdCA9IGZ1bmN0aW9uIChhcnJheSkgeyByZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV07IH07XG4vLyBleHBvcnQgY29uc3QgZHJvcExhc3QgPSA8VD4oYXJyYXk6IFRbXSk6IFRbXSA9PlxuLy8gYXJyYXkuc2xpY2UoMCwgYXJyYXkubGVuZ3RoIC0gMSk7XG5leHBvcnQgdmFyIHR5cGVkQXJyYXlGb3IgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgdHlwZWRBcnJheSA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgICB0eXBlZEFycmF5W2lkeF0gPSB2YWx1ZS5jaGFyQ29kZUF0KGlkeCk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlZEFycmF5O1xufTtcbmV4cG9ydCB2YXIgbWVyZ2VJbnRvVHlwZWRBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJyYXlzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJyYXlzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBhcnJheUNvdW50ID0gYXJyYXlzLmxlbmd0aDtcbiAgICB2YXIgdHlwZWRBcnJheXMgPSBbXTtcbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBhcnJheUNvdW50OyBpZHgrKykge1xuICAgICAgICB2YXIgZWxlbWVudCA9IGFycmF5c1tpZHhdO1xuICAgICAgICB0eXBlZEFycmF5c1tpZHhdID1cbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gZWxlbWVudCA6IHR5cGVkQXJyYXlGb3IoZWxlbWVudCk7XG4gICAgfVxuICAgIHZhciB0b3RhbFNpemUgPSAwO1xuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGFycmF5Q291bnQ7IGlkeCsrKSB7XG4gICAgICAgIHRvdGFsU2l6ZSArPSBhcnJheXNbaWR4XS5sZW5ndGg7XG4gICAgfVxuICAgIHZhciBtZXJnZWQgPSBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpO1xuICAgIHZhciBvZmZzZXQgPSAwO1xuICAgIGZvciAodmFyIGFycklkeCA9IDA7IGFycklkeCA8IGFycmF5Q291bnQ7IGFycklkeCsrKSB7XG4gICAgICAgIHZhciBhcnIgPSB0eXBlZEFycmF5c1thcnJJZHhdO1xuICAgICAgICBmb3IgKHZhciBieXRlSWR4ID0gMCwgYXJyTGVuID0gYXJyLmxlbmd0aDsgYnl0ZUlkeCA8IGFyckxlbjsgYnl0ZUlkeCsrKSB7XG4gICAgICAgICAgICBtZXJnZWRbb2Zmc2V0KytdID0gYXJyW2J5dGVJZHhdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWQ7XG59O1xuZXhwb3J0IHZhciBtZXJnZVVpbnQ4QXJyYXlzID0gZnVuY3Rpb24gKGFycmF5cykge1xuICAgIHZhciB0b3RhbFNpemUgPSAwO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdG90YWxTaXplICs9IGFycmF5c1tpZHhdLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIG1lcmdlZEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRvdGFsU2l6ZSk7XG4gICAgdmFyIG9mZnNldCA9IDA7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXlzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaWR4XTtcbiAgICAgICAgbWVyZ2VkQnVmZmVyLnNldChhcnJheSwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IGFycmF5Lmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZEJ1ZmZlcjtcbn07XG5leHBvcnQgdmFyIGFycmF5QXNTdHJpbmcgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHN0ciArPSBjaGFyRnJvbUNvZGUoYXJyYXlbaWR4XSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59O1xuZXhwb3J0IHZhciBieUFzY2VuZGluZ0lkID0gZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9O1xuZXhwb3J0IHZhciBzb3J0ZWRVbmlxID0gZnVuY3Rpb24gKGFycmF5LCBpbmRleGVyKSB7XG4gICAgdmFyIHVuaXEgPSBbXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGN1cnIgPSBhcnJheVtpZHhdO1xuICAgICAgICB2YXIgcHJldiA9IGFycmF5W2lkeCAtIDFdO1xuICAgICAgICBpZiAoaWR4ID09PSAwIHx8IGluZGV4ZXIoY3VycikgIT09IGluZGV4ZXIocHJldikpIHtcbiAgICAgICAgICAgIHVuaXEucHVzaChjdXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5pcTtcbn07XG4vLyBBcnJheXMgYW5kIFR5cGVkQXJyYXlzIGluIEpTIGJvdGggaGF2ZSAucmV2ZXJzZSgpIG1ldGhvZHMsIHdoaWNoIHdvdWxkIHNlZW1cbi8vIHRvIG5lZ2F0ZSB0aGUgbmVlZCBmb3IgdGhpcyBmdW5jdGlvbi4gSG93ZXZlciwgbm90IGFsbCBydW50aW1lcyBzdXBwb3J0IHRoaXNcbi8vIG1ldGhvZCAoZS5nLiBSZWFjdCBOYXRpdmUpLiBUaGlzIGZ1bmN0aW9uIGNvbXBlbnNhdGVzIGZvciB0aGF0IGZhY3QuXG5leHBvcnQgdmFyIHJldmVyc2VBcnJheSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgIHZhciBhcnJheUxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBNYXRoLmZsb29yKGFycmF5TGVuIC8gMik7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGxlZnRJZHggPSBpZHg7XG4gICAgICAgIHZhciByaWdodElkeCA9IGFycmF5TGVuIC0gaWR4IC0gMTtcbiAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpZHhdO1xuICAgICAgICBhcnJheVtsZWZ0SWR4XSA9IGFycmF5W3JpZ2h0SWR4XTtcbiAgICAgICAgYXJyYXlbcmlnaHRJZHhdID0gdGVtcDtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufTtcbmV4cG9ydCB2YXIgc3VtID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgdmFyIHRvdGFsID0gMDtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdG90YWwgKz0gYXJyYXlbaWR4XTtcbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsO1xufTtcbmV4cG9ydCB2YXIgcmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZW5kIC0gc3RhcnQpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgYXJyW2lkeF0gPSBzdGFydCArIGlkeDtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbn07XG5leHBvcnQgdmFyIHBsdWNrSW5kaWNlcyA9IGZ1bmN0aW9uIChhcnIsIGluZGljZXMpIHtcbiAgICB2YXIgcGx1Y2tlZCA9IG5ldyBBcnJheShpbmRpY2VzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gaW5kaWNlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgcGx1Y2tlZFtpZHhdID0gYXJyW2luZGljZXNbaWR4XV07XG4gICAgfVxuICAgIHJldHVybiBwbHVja2VkO1xufTtcbmV4cG9ydCB2YXIgY2FuQmVDb252ZXJ0ZWRUb1VpbnQ4QXJyYXkgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJztcbn07XG5leHBvcnQgdmFyIHRvVWludDhBcnJheSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVGcm9tQmFzZTY0RGF0YVVyaShpbnB1dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BpbnB1dGAgbXVzdCBiZSBvbmUgb2YgYHN0cmluZyB8IEFycmF5QnVmZmVyIHwgVWludDhBcnJheWAnKTtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXlzLmpzLm1hcCIsIi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBhdCBsZWFzdCBvbmUgdGljayBvZiB0aGVcbiAqIE1hY3JvIFRhc2sgUXVldWUgb2NjdXJzLlxuICovXG5leHBvcnQgdmFyIHdhaXRGb3JUaWNrID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc29sdmUoKTsgfSwgMCk7XG4gICAgfSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXN5bmMuanMubWFwIiwiLypcbiAqIFRoZSBgY2hhcnNgLCBgbG9va3VwYCwgYGVuY29kZWAsIGFuZCBgZGVjb2RlYCBtZW1iZXJzIG9mIHRoaXMgZmlsZSBhcmVcbiAqIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICAgIGJhc2U2NC1hcnJheWJ1ZmZlclxuICogICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uaWtsYXN2aC9iYXNlNjQtYXJyYXlidWZmZXJcbiAqXG4gKiAgICAgQ29weXJpZ2h0IChjKSAyMDEyIE5pa2xhcyB2b24gSGVydHplblxuICogICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqXG4gKi9cbnZhciBjaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcbi8vIFVzZSBhIGxvb2t1cCB0YWJsZSB0byBmaW5kIHRoZSBpbmRleC5cbnZhciBsb29rdXAgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG59XG5leHBvcnQgdmFyIGVuY29kZVRvQmFzZTY0ID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgdmFyIGJhc2U2NCA9ICcnO1xuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107XG4gICAgfVxuICAgIGlmIChsZW4gJSAzID09PSAyKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nO1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JztcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U2NDtcbn07XG5leHBvcnQgdmFyIGRlY29kZUZyb21CYXNlNjQgPSBmdW5jdGlvbiAoYmFzZTY0KSB7XG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGJhc2U2NC5sZW5ndGggKiAwLjc1O1xuICAgIHZhciBsZW4gPSBiYXNlNjQubGVuZ3RoO1xuICAgIHZhciBpO1xuICAgIHZhciBwID0gMDtcbiAgICB2YXIgZW5jb2RlZDE7XG4gICAgdmFyIGVuY29kZWQyO1xuICAgIHZhciBlbmNvZGVkMztcbiAgICB2YXIgZW5jb2RlZDQ7XG4gICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMV0gPT09ICc9Jykge1xuICAgICAgICBidWZmZXJMZW5ndGgtLTtcbiAgICAgICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMl0gPT09ICc9Jykge1xuICAgICAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyTGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICAgICAgZW5jb2RlZDEgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBlbmNvZGVkMiA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMSldO1xuICAgICAgICBlbmNvZGVkMyA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMildO1xuICAgICAgICBlbmNvZGVkNCA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMyldO1xuICAgICAgICBieXRlc1twKytdID0gKGVuY29kZWQxIDw8IDIpIHwgKGVuY29kZWQyID4+IDQpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMiAmIDE1KSA8PCA0KSB8IChlbmNvZGVkMyA+PiAyKTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9ICgoZW5jb2RlZDMgJiAzKSA8PCA2KSB8IChlbmNvZGVkNCAmIDYzKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufTtcbi8vIFRoaXMgcmVnZXggaXMgZGVzaWduZWQgdG8gYmUgYXMgZmxleGlibGUgYXMgcG9zc2libGUuIEl0IHdpbGwgcGFyc2UgY2VydGFpblxuLy8gaW52YWxpZCBkYXRhIFVSSXMuXG52YXIgREFUQV9VUklfUFJFRklYX1JFR0VYID0gL14oZGF0YSk/Oj8oW1xcd1xcL1xcK10rKT87PyhjaGFyc2V0PVtcXHctXSt8YmFzZTY0KT8uKiwvaTtcbi8qKlxuICogSWYgdGhlIGBkYXRhVXJpYCBpbnB1dCBpcyBhIGRhdGEgVVJJLCB0aGVuIHRoZSBkYXRhIFVSSSBwcmVmaXggbXVzdCBub3QgYmVcbiAqIGxvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzLCBvciB0aGlzIGZ1bmN0aW9uIHdpbGwgZmFpbCB0byBkZWNvZGUgaXQuXG4gKlxuICogQHBhcmFtIGRhdGFVcmkgYSBiYXNlNjQgZGF0YSBVUkkgb3IgcGxhaW4gYmFzZTY0IHN0cmluZ1xuICogQHJldHVybnMgYSBVaW50OEFycmF5IGNvbnRhaW5pbmcgdGhlIGRlY29kZWQgaW5wdXRcbiAqL1xuZXhwb3J0IHZhciBkZWNvZGVGcm9tQmFzZTY0RGF0YVVyaSA9IGZ1bmN0aW9uIChkYXRhVXJpKSB7XG4gICAgdmFyIHRyaW1tZWRVcmkgPSBkYXRhVXJpLnRyaW0oKTtcbiAgICB2YXIgcHJlZml4ID0gdHJpbW1lZFVyaS5zdWJzdHJpbmcoMCwgMTAwKTtcbiAgICB2YXIgcmVzID0gcHJlZml4Lm1hdGNoKERBVEFfVVJJX1BSRUZJWF9SRUdFWCk7XG4gICAgLy8gQXNzdW1lIGl0J3Mgbm90IGEgZGF0YSBVUkkgLSBqdXN0IGEgcGxhaW4gYmFzZTY0IHN0cmluZ1xuICAgIGlmICghcmVzKVxuICAgICAgICByZXR1cm4gZGVjb2RlRnJvbUJhc2U2NCh0cmltbWVkVXJpKTtcbiAgICAvLyBSZW1vdmUgdGhlIGRhdGEgVVJJIHByZWZpeCBhbmQgcGFyc2UgdGhlIHJlbWFpbmRlciBhcyBhIGJhc2U2NCBzdHJpbmdcbiAgICB2YXIgZnVsbE1hdGNoID0gcmVzWzBdO1xuICAgIHZhciBkYXRhID0gdHJpbW1lZFVyaS5zdWJzdHJpbmcoZnVsbE1hdGNoLmxlbmd0aCk7XG4gICAgcmV0dXJuIGRlY29kZUZyb21CYXNlNjQoZGF0YSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZTY0LmpzLm1hcCIsImV4cG9ydCB2YXIgZXJyb3IgPSBmdW5jdGlvbiAobXNnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2FycmF5c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXN5bmNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmluZ3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3VuaWNvZGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL251bWJlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vYmFzZTY0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vYmplY3RzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wZGZEb2NFbmNvZGluZ1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDYWNoZSB9IGZyb20gXCIuL0NhY2hlXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyB0c2xpbnQ6ZGlzYWJsZSByYWRpeFxuLyoqXG4gKiBDb252ZXJ0cyBhIG51bWJlciB0byBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIGRlY2ltYWwuIFRoaXMgZnVuY3Rpb25cbiAqIGRpZmZlcnMgZnJvbSBzaW1wbHkgY29udmVydGluZyBhIG51bWJlciB0byBhIHN0cmluZyB3aXRoIGAudG9TdHJpbmcoKWBcbiAqIGJlY2F1c2UgdGhpcyBmdW5jdGlvbidzIG91dHB1dCBzdHJpbmcgd2lsbCAqKm5vdCoqIGNvbnRhaW4gZXhwb25lbnRpYWxcbiAqIG5vdGF0aW9uLlxuICpcbiAqIENyZWRpdDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2NTQ1NTE5XG4gKi9cbmV4cG9ydCB2YXIgbnVtYmVyVG9TdHJpbmcgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgdmFyIG51bVN0ciA9IFN0cmluZyhudW0pO1xuICAgIGlmIChNYXRoLmFicyhudW0pIDwgMS4wKSB7XG4gICAgICAgIHZhciBlID0gcGFyc2VJbnQobnVtLnRvU3RyaW5nKCkuc3BsaXQoJ2UtJylbMV0pO1xuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgdmFyIG5lZ2F0aXZlID0gbnVtIDwgMDtcbiAgICAgICAgICAgIGlmIChuZWdhdGl2ZSlcbiAgICAgICAgICAgICAgICBudW0gKj0gLTE7XG4gICAgICAgICAgICBudW0gKj0gTWF0aC5wb3coMTAsIGUgLSAxKTtcbiAgICAgICAgICAgIG51bVN0ciA9ICcwLicgKyBuZXcgQXJyYXkoZSkuam9pbignMCcpICsgbnVtLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpO1xuICAgICAgICAgICAgaWYgKG5lZ2F0aXZlKVxuICAgICAgICAgICAgICAgIG51bVN0ciA9ICctJyArIG51bVN0cjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGUgPSBwYXJzZUludChudW0udG9TdHJpbmcoKS5zcGxpdCgnKycpWzFdKTtcbiAgICAgICAgaWYgKGUgPiAyMCkge1xuICAgICAgICAgICAgZSAtPSAyMDtcbiAgICAgICAgICAgIG51bSAvPSBNYXRoLnBvdygxMCwgZSk7XG4gICAgICAgICAgICBudW1TdHIgPSBudW0udG9TdHJpbmcoKSArIG5ldyBBcnJheShlICsgMSkuam9pbignMCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudW1TdHI7XG59O1xuZXhwb3J0IHZhciBzaXplSW5CeXRlcyA9IGZ1bmN0aW9uIChuKSB7IHJldHVybiBNYXRoLmNlaWwobi50b1N0cmluZygyKS5sZW5ndGggLyA4KTsgfTtcbi8qKlxuICogQ29udmVydHMgYSBudW1iZXIgaW50byBpdHMgY29uc3RpdHVlbnQgYnl0ZXMgYW5kIHJldHVybnMgdGhlbSBhc1xuICogYSBudW1iZXJbXS5cbiAqXG4gKiBSZXR1cm5zIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBhcyBmaXJzdCBlbGVtZW50IGluIGFycmF5LiBJdCBtYXkgYmUgbmVjZXNzYXJ5XG4gKiB0byBjYWxsIC5yZXZlcnNlKCkgdG8gZ2V0IHRoZSBiaXRzIGluIHRoZSBkZXNpcmVkIG9yZGVyLlxuICpcbiAqIEV4YW1wbGU6XG4gKiAgIGJ5dGVzRm9yKDB4MDJBNDFFKSA9PiBbIDBiMTAsIDBiMTAxMDAxMDAsIDBiMTExMTAgXVxuICpcbiAqIENyZWRpdCBmb3IgYWxnb3JpdGhtOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTkzNjg2NVxuICovXG5leHBvcnQgdmFyIGJ5dGVzRm9yID0gZnVuY3Rpb24gKG4pIHtcbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShzaXplSW5CeXRlcyhuKSk7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYnl0ZXNbaSAtIDFdID0gbiA+PiAoKGJ5dGVzLmxlbmd0aCAtIGkpICogOCk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1udW1iZXJzLmpzLm1hcCIsImltcG9ydCB7IEZvbnROYW1lcyB9IGZyb20gJ0BwZGYtbGliL3N0YW5kYXJkLWZvbnRzJztcbmV4cG9ydCB2YXIgdmFsdWVzID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGspIHsgcmV0dXJuIG9ialtrXTsgfSk7IH07XG5leHBvcnQgdmFyIFN0YW5kYXJkRm9udFZhbHVlcyA9IHZhbHVlcyhGb250TmFtZXMpO1xuZXhwb3J0IHZhciBpc1N0YW5kYXJkRm9udCA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHJldHVybiBTdGFuZGFyZEZvbnRWYWx1ZXMuaW5jbHVkZXMoaW5wdXQpO1xufTtcbmV4cG9ydCB2YXIgcmVjdGFuZ2xlc0FyZUVxdWFsID0gZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEueCA9PT0gYi54ICYmIGEueSA9PT0gYi55ICYmIGEud2lkdGggPT09IGIud2lkdGggJiYgYS5oZWlnaHQgPT09IGIuaGVpZ2h0OyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JqZWN0cy5qcy5tYXAiLCJpbXBvcnQgeyB0b0NoYXJDb2RlIH0gZnJvbSBcIi4vc3RyaW5nc1wiO1xuLy8gTWFwcGluZyBmcm9tIFBERkRvY0VuY29kaW5nIHRvIFVuaWNvZGUgY29kZSBwb2ludFxudmFyIHBkZkRvY0VuY29kaW5nVG9Vbmljb2RlID0gbmV3IFVpbnQxNkFycmF5KDI1Nik7XG4vLyBJbml0aWFsaXplIHRoZSBjb2RlIHBvaW50cyB3aGljaCBhcmUgdGhlIHNhbWVcbmZvciAodmFyIGlkeCA9IDA7IGlkeCA8IDI1NjsgaWR4KyspIHtcbiAgICBwZGZEb2NFbmNvZGluZ1RvVW5pY29kZVtpZHhdID0gaWR4O1xufVxuLy8gU2V0IGRpZmZlcmVuY2VzIChzZWUgXCJUYWJsZSBELjIg4oCTIFBERkRvY0VuY29kaW5nIENoYXJhY3RlciBTZXRcIiBvZiB0aGUgUERGIHNwZWMpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDE2XSA9IHRvQ2hhckNvZGUoJ1xcdTAwMTcnKTsgLy8gU1lOQ1JPTk9VUyBJRExFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDE4XSA9IHRvQ2hhckNvZGUoJ1xcdTAyRDgnKTsgLy8gQlJFVkVcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MTldID0gdG9DaGFyQ29kZSgnXFx1MDJDNycpOyAvLyBDQVJPTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxYV0gPSB0b0NoYXJDb2RlKCdcXHUwMkM2Jyk7IC8vIE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVFxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxYl0gPSB0b0NoYXJDb2RlKCdcXHUwMkQ5Jyk7IC8vIERPVCBBQk9WRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxY10gPSB0b0NoYXJDb2RlKCdcXHUwMkREJyk7IC8vIERPVUJMRSBBQ1VURSBBQ0NFTlRcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MWRdID0gdG9DaGFyQ29kZSgnXFx1MDJEQicpOyAvLyBPR09ORUtcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MWVdID0gdG9DaGFyQ29kZSgnXFx1MDJEQScpOyAvLyBSSU5HIEFCT1ZFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDFmXSA9IHRvQ2hhckNvZGUoJ1xcdTAyREMnKTsgLy8gU01BTEwgVElMREVcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4N2ZdID0gdG9DaGFyQ29kZSgnXFx1RkZGRCcpOyAvLyBSRVBMQUNFTUVOVCBDSEFSQUNURVIgKGJveCB3aXRoIHF1ZXN0aW9ubWFyaylcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODBdID0gdG9DaGFyQ29kZSgnXFx1MjAyMicpOyAvLyBCVUxMRVRcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODFdID0gdG9DaGFyQ29kZSgnXFx1MjAyMCcpOyAvLyBEQUdHRVJcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODJdID0gdG9DaGFyQ29kZSgnXFx1MjAyMScpOyAvLyBET1VCTEUgREFHR0VSXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDgzXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMjYnKTsgLy8gSE9SSVpPTlRBTCBFTExJUFNJU1xucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4NF0gPSB0b0NoYXJDb2RlKCdcXHUyMDE0Jyk7IC8vIEVNIERBU0hcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODVdID0gdG9DaGFyQ29kZSgnXFx1MjAxMycpOyAvLyBFTiBEQVNIXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDg2XSA9IHRvQ2hhckNvZGUoJ1xcdTAxOTInKTsgLy8gTEFUSU4gU01BTEwgTEVUVEVSIFNDUklQVCBGXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDg3XSA9IHRvQ2hhckNvZGUoJ1xcdTIwNDQnKTsgLy8gRlJBQ1RJT04gU0xBU0ggKHNvbGlkdXMpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDg4XSA9IHRvQ2hhckNvZGUoJ1xcdTIwMzknKTsgLy8gU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUktcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODldID0gdG9DaGFyQ29kZSgnXFx1MjAzQScpOyAvLyBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUktcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OGFdID0gdG9DaGFyQ29kZSgnXFx1MjIxMicpOyAvLyBNSU5VUyBTSUdOXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDhiXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMzAnKTsgLy8gUEVSIE1JTExFIFNJR05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OGNdID0gdG9DaGFyQ29kZSgnXFx1MjAxRScpOyAvLyBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKHF1b3RlZGJsYmFzZSlcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OGRdID0gdG9DaGFyQ29kZSgnXFx1MjAxQycpOyAvLyBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAocXVvdGVkYmxsZWZ0KVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4ZV0gPSB0b0NoYXJDb2RlKCdcXHUyMDFEJyk7IC8vIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAocXVvdGVkYmxyaWdodClcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OGZdID0gdG9DaGFyQ29kZSgnXFx1MjAxOCcpOyAvLyBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAocXVvdGVsZWZ0KVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5MF0gPSB0b0NoYXJDb2RlKCdcXHUyMDE5Jyk7IC8vIFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAocXVvdGVyaWdodClcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTFdID0gdG9DaGFyQ29kZSgnXFx1MjAxQScpOyAvLyBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKHF1b3Rlc2luZ2xiYXNlKVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5Ml0gPSB0b0NoYXJDb2RlKCdcXHUyMTIyJyk7IC8vIFRSQURFIE1BUksgU0lHTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5M10gPSB0b0NoYXJDb2RlKCdcXHVGQjAxJyk7IC8vIExBVElOIFNNQUxMIExJR0FUVVJFIEZJXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDk0XSA9IHRvQ2hhckNvZGUoJ1xcdUZCMDInKTsgLy8gTEFUSU4gU01BTEwgTElHQVRVUkUgRkxcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTVdID0gdG9DaGFyQ29kZSgnXFx1MDE0MScpOyAvLyBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDk2XSA9IHRvQ2hhckNvZGUoJ1xcdTAxNTInKTsgLy8gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5N10gPSB0b0NoYXJDb2RlKCdcXHUwMTYwJyk7IC8vIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5OF0gPSB0b0NoYXJDb2RlKCdcXHUwMTc4Jyk7IC8vIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVNcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTldID0gdG9DaGFyQ29kZSgnXFx1MDE3RCcpOyAvLyBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OWFdID0gdG9DaGFyQ29kZSgnXFx1MDEzMScpOyAvLyBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDliXSA9IHRvQ2hhckNvZGUoJ1xcdTAxNDInKTsgLy8gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0VcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OWNdID0gdG9DaGFyQ29kZSgnXFx1MDE1MycpOyAvLyBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5ZF0gPSB0b0NoYXJDb2RlKCdcXHUwMTYxJyk7IC8vIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OWVdID0gdG9DaGFyQ29kZSgnXFx1MDE3RScpOyAvLyBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDlmXSA9IHRvQ2hhckNvZGUoJ1xcdUZGRkQnKTsgLy8gUkVQTEFDRU1FTlQgQ0hBUkFDVEVSIChib3ggd2l0aCBxdWVzdGlvbm1hcmspXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweGEwXSA9IHRvQ2hhckNvZGUoJ1xcdTIwQUMnKTsgLy8gRVVSTyBTSUdOXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweGFkXSA9IHRvQ2hhckNvZGUoJ1xcdUZGRkQnKTsgLy8gUkVQTEFDRU1FTlQgQ0hBUkFDVEVSIChib3ggd2l0aCBxdWVzdGlvbm1hcmspXG4vKipcbiAqIERlY29kZSBhIGJ5dGUgYXJyYXkgaW50byBhIHN0cmluZyB1c2luZyBQREZEb2NFbmNvZGluZy5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgYSBieXRlIGFycmF5IChkZWNpbWFsIHJlcHJlc2VudGF0aW9uKSBjb250YWluaW5nIGEgc3RyaW5nXG4gKiAgICAgICAgICAgICAgZW5jb2RlZCB3aXRoIFBERkRvY0VuY29kaW5nLlxuICovXG5leHBvcnQgdmFyIHBkZkRvY0VuY29kaW5nRGVjb2RlID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgdmFyIGNvZGVQb2ludHMgPSBuZXcgQXJyYXkoYnl0ZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBieXRlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgY29kZVBvaW50c1tpZHhdID0gcGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbYnl0ZXNbaWR4XV07XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBkZkRvY0VuY29kaW5nLmpzLm1hcCIsImltcG9ydCBVUE5HIGZyb20gJ0BwZGYtbGliL3VwbmcnO1xudmFyIGdldEltYWdlVHlwZSA9IGZ1bmN0aW9uIChjdHlwZSkge1xuICAgIGlmIChjdHlwZSA9PT0gMClcbiAgICAgICAgcmV0dXJuIFBuZ1R5cGUuR3JleXNjYWxlO1xuICAgIGlmIChjdHlwZSA9PT0gMilcbiAgICAgICAgcmV0dXJuIFBuZ1R5cGUuVHJ1ZWNvbG91cjtcbiAgICBpZiAoY3R5cGUgPT09IDMpXG4gICAgICAgIHJldHVybiBQbmdUeXBlLkluZGV4ZWRDb2xvdXI7XG4gICAgaWYgKGN0eXBlID09PSA0KVxuICAgICAgICByZXR1cm4gUG5nVHlwZS5HcmV5c2NhbGVXaXRoQWxwaGE7XG4gICAgaWYgKGN0eXBlID09PSA2KVxuICAgICAgICByZXR1cm4gUG5nVHlwZS5UcnVlY29sb3VyV2l0aEFscGhhO1xuICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY29sb3IgdHlwZTogXCIgKyBjdHlwZSk7XG59O1xudmFyIHNwbGl0QWxwaGFDaGFubmVsID0gZnVuY3Rpb24gKHJnYmFDaGFubmVsKSB7XG4gICAgdmFyIHBpeGVsQ291bnQgPSBNYXRoLmZsb29yKHJnYmFDaGFubmVsLmxlbmd0aCAvIDQpO1xuICAgIHZhciByZ2JDaGFubmVsID0gbmV3IFVpbnQ4QXJyYXkocGl4ZWxDb3VudCAqIDMpO1xuICAgIHZhciBhbHBoYUNoYW5uZWwgPSBuZXcgVWludDhBcnJheShwaXhlbENvdW50ICogMSk7XG4gICAgdmFyIHJnYmFPZmZzZXQgPSAwO1xuICAgIHZhciByZ2JPZmZzZXQgPSAwO1xuICAgIHZhciBhbHBoYU9mZnNldCA9IDA7XG4gICAgd2hpbGUgKHJnYmFPZmZzZXQgPCByZ2JhQ2hhbm5lbC5sZW5ndGgpIHtcbiAgICAgICAgcmdiQ2hhbm5lbFtyZ2JPZmZzZXQrK10gPSByZ2JhQ2hhbm5lbFtyZ2JhT2Zmc2V0KytdO1xuICAgICAgICByZ2JDaGFubmVsW3JnYk9mZnNldCsrXSA9IHJnYmFDaGFubmVsW3JnYmFPZmZzZXQrK107XG4gICAgICAgIHJnYkNoYW5uZWxbcmdiT2Zmc2V0KytdID0gcmdiYUNoYW5uZWxbcmdiYU9mZnNldCsrXTtcbiAgICAgICAgYWxwaGFDaGFubmVsW2FscGhhT2Zmc2V0KytdID0gcmdiYUNoYW5uZWxbcmdiYU9mZnNldCsrXTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmdiQ2hhbm5lbDogcmdiQ2hhbm5lbCwgYWxwaGFDaGFubmVsOiBhbHBoYUNoYW5uZWwgfTtcbn07XG5leHBvcnQgdmFyIFBuZ1R5cGU7XG4oZnVuY3Rpb24gKFBuZ1R5cGUpIHtcbiAgICBQbmdUeXBlW1wiR3JleXNjYWxlXCJdID0gXCJHcmV5c2NhbGVcIjtcbiAgICBQbmdUeXBlW1wiVHJ1ZWNvbG91clwiXSA9IFwiVHJ1ZWNvbG91clwiO1xuICAgIFBuZ1R5cGVbXCJJbmRleGVkQ29sb3VyXCJdID0gXCJJbmRleGVkQ29sb3VyXCI7XG4gICAgUG5nVHlwZVtcIkdyZXlzY2FsZVdpdGhBbHBoYVwiXSA9IFwiR3JleXNjYWxlV2l0aEFscGhhXCI7XG4gICAgUG5nVHlwZVtcIlRydWVjb2xvdXJXaXRoQWxwaGFcIl0gPSBcIlRydWVjb2xvdXJXaXRoQWxwaGFcIjtcbn0pKFBuZ1R5cGUgfHwgKFBuZ1R5cGUgPSB7fSkpO1xudmFyIFBORyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQTkcocG5nRGF0YSkge1xuICAgICAgICB2YXIgdXBuZyA9IFVQTkcuZGVjb2RlKHBuZ0RhdGEpO1xuICAgICAgICB2YXIgZnJhbWVzID0gVVBORy50b1JHQkE4KHVwbmcpO1xuICAgICAgICBpZiAoZnJhbWVzLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbmltYXRlZCBQTkdzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICB2YXIgZnJhbWUgPSBuZXcgVWludDhBcnJheShmcmFtZXNbMF0pO1xuICAgICAgICB2YXIgX2EgPSBzcGxpdEFscGhhQ2hhbm5lbChmcmFtZSksIHJnYkNoYW5uZWwgPSBfYS5yZ2JDaGFubmVsLCBhbHBoYUNoYW5uZWwgPSBfYS5hbHBoYUNoYW5uZWw7XG4gICAgICAgIHRoaXMucmdiQ2hhbm5lbCA9IHJnYkNoYW5uZWw7XG4gICAgICAgIHZhciBoYXNBbHBoYVZhbHVlcyA9IGFscGhhQ2hhbm5lbC5zb21lKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhIDwgMjU1OyB9KTtcbiAgICAgICAgaWYgKGhhc0FscGhhVmFsdWVzKVxuICAgICAgICAgICAgdGhpcy5hbHBoYUNoYW5uZWwgPSBhbHBoYUNoYW5uZWw7XG4gICAgICAgIHRoaXMudHlwZSA9IGdldEltYWdlVHlwZSh1cG5nLmN0eXBlKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IHVwbmcud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdXBuZy5oZWlnaHQ7XG4gICAgICAgIHRoaXMuYml0c1BlckNvbXBvbmVudCA9IDg7XG4gICAgfVxuICAgIFBORy5sb2FkID0gZnVuY3Rpb24gKHBuZ0RhdGEpIHsgcmV0dXJuIG5ldyBQTkcocG5nRGF0YSk7IH07XG4gICAgcmV0dXJuIFBORztcbn0oKSk7XG5leHBvcnQgeyBQTkcgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBuZy5qcy5tYXAiLCIvKipcbiAqIEdlbmVyYXRlcyBhIHBzZXVkbyByYW5kb20gbnVtYmVyLiBBbHRob3VnaCBpdCBpcyBub3QgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlXG4gKiBhbmQgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkLCBpdCBpcyBub3QgYSBjb25jZXJuIGZvciB0aGUgaW50ZW5kZWQgdXNlLWNhc2UsXG4gKiB3aGljaCBpcyB0byBnZW5lcmF0ZSBkaXN0aW5jdCBudW1iZXJzLlxuICpcbiAqIENyZWRpdDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5MzAzNzI1LzEwMjU0MDQ5XG4gKi9cbnZhciBTaW1wbGVSTkcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2ltcGxlUk5HKHNlZWQpIHtcbiAgICAgICAgdGhpcy5zZWVkID0gc2VlZDtcbiAgICB9XG4gICAgU2ltcGxlUk5HLnByb3RvdHlwZS5uZXh0SW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgeCA9IE1hdGguc2luKHRoaXMuc2VlZCsrKSAqIDEwMDAwO1xuICAgICAgICByZXR1cm4geCAtIE1hdGguZmxvb3IoeCk7XG4gICAgfTtcbiAgICBTaW1wbGVSTkcud2l0aFNlZWQgPSBmdW5jdGlvbiAoc2VlZCkgeyByZXR1cm4gbmV3IFNpbXBsZVJORyhzZWVkKTsgfTtcbiAgICByZXR1cm4gU2ltcGxlUk5HO1xufSgpKTtcbmV4cG9ydCB7IFNpbXBsZVJORyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm5nLmpzLm1hcCIsImV4cG9ydCB2YXIgdG9DaGFyQ29kZSA9IGZ1bmN0aW9uIChjaGFyYWN0ZXIpIHsgcmV0dXJuIGNoYXJhY3Rlci5jaGFyQ29kZUF0KDApOyB9O1xuZXhwb3J0IHZhciB0b0NvZGVQb2ludCA9IGZ1bmN0aW9uIChjaGFyYWN0ZXIpIHsgcmV0dXJuIGNoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKTsgfTtcbmV4cG9ydCB2YXIgdG9IZXhTdHJpbmdPZk1pbkxlbmd0aCA9IGZ1bmN0aW9uIChudW0sIG1pbkxlbmd0aCkge1xuICAgIHJldHVybiBwYWRTdGFydChudW0udG9TdHJpbmcoMTYpLCBtaW5MZW5ndGgsICcwJykudG9VcHBlckNhc2UoKTtcbn07XG5leHBvcnQgdmFyIHRvSGV4U3RyaW5nID0gZnVuY3Rpb24gKG51bSkgeyByZXR1cm4gdG9IZXhTdHJpbmdPZk1pbkxlbmd0aChudW0sIDIpOyB9O1xuZXhwb3J0IHZhciBjaGFyRnJvbUNvZGUgPSBmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsgfTtcbmV4cG9ydCB2YXIgY2hhckZyb21IZXhDb2RlID0gZnVuY3Rpb24gKGhleCkgeyByZXR1cm4gY2hhckZyb21Db2RlKHBhcnNlSW50KGhleCwgMTYpKTsgfTtcbmV4cG9ydCB2YXIgcGFkU3RhcnQgPSBmdW5jdGlvbiAodmFsdWUsIGxlbmd0aCwgcGFkQ2hhcikge1xuICAgIHZhciBwYWRkaW5nID0gJyc7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGVuZ3RoIC0gdmFsdWUubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHBhZGRpbmcgKz0gcGFkQ2hhcjtcbiAgICB9XG4gICAgcmV0dXJuIHBhZGRpbmcgKyB2YWx1ZTtcbn07XG5leHBvcnQgdmFyIGNvcHlTdHJpbmdJbnRvQnVmZmVyID0gZnVuY3Rpb24gKHN0ciwgYnVmZmVyLCBvZmZzZXQpIHtcbiAgICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBzdHIuY2hhckNvZGVBdChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gbGVuZ3RoO1xufTtcbmV4cG9ydCB2YXIgYWRkUmFuZG9tU3VmZml4ID0gZnVuY3Rpb24gKHByZWZpeCwgc3VmZml4TGVuZ3RoKSB7XG4gICAgaWYgKHN1ZmZpeExlbmd0aCA9PT0gdm9pZCAwKSB7IHN1ZmZpeExlbmd0aCA9IDQ7IH1cbiAgICByZXR1cm4gcHJlZml4ICsgXCItXCIgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBNYXRoLnBvdygxMCwgc3VmZml4TGVuZ3RoKSk7XG59O1xuZXhwb3J0IHZhciBlc2NhcGVSZWdFeHAgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xufTtcbmV4cG9ydCB2YXIgY2xlYW5UZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHR8XFx1MDA4NXxcXHUyMDI4fFxcdTIwMjkvZywgJyAgICAnKS5yZXBsYWNlKC9bXFxiXFx2XS9nLCAnJyk7XG59O1xuZXhwb3J0IHZhciBlc2NhcGVkTmV3bGluZUNoYXJzID0gWydcXFxcbicsICdcXFxcZicsICdcXFxccicsICdcXFxcdTAwMEInXTtcbmV4cG9ydCB2YXIgbmV3bGluZUNoYXJzID0gWydcXG4nLCAnXFxmJywgJ1xccicsICdcXHUwMDBCJ107XG5leHBvcnQgdmFyIGlzTmV3bGluZUNoYXIgPSBmdW5jdGlvbiAodGV4dCkgeyByZXR1cm4gL15bXFxuXFxmXFxyXFx1MDAwQl0kLy50ZXN0KHRleHQpOyB9O1xuZXhwb3J0IHZhciBsaW5lU3BsaXQgPSBmdW5jdGlvbiAodGV4dCkgeyByZXR1cm4gdGV4dC5zcGxpdCgvW1xcblxcZlxcclxcdTAwMEJdLyk7IH07XG5leHBvcnQgdmFyIG1lcmdlTGluZXMgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1tcXG5cXGZcXHJcXHUwMDBCXS9nLCAnICcpO1xufTtcbi8vIEphdmFTY3JpcHQncyBTdHJpbmcuY2hhckF0KCkgbWV0aG9kIGRvZXNuIHdvcmsgb24gc3RyaW5ncyBjb250YWluaW5nIFVURi0xNlxuLy8gY2hhcmFjdGVycyAod2l0aCBoaWdoIGFuZCBsb3cgc3Vycm9nYXRlIHBhaXJzKSwgc3VjaCBhcyDwn5KpIChwb28gZW1vamkpLiBUaGlzXG4vLyBgY2hhckF0SW5kZXgoKWAgZnVuY3Rpb24gZG9lcy5cbi8vXG4vLyBDcmVkaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXQvYmxvYi9tYXN0ZXIvYXQuanMjTDE0LUw0OFxuZXhwb3J0IHZhciBjaGFyQXRJbmRleCA9IGZ1bmN0aW9uICh0ZXh0LCBpbmRleCkge1xuICAgIC8vIEdldCB0aGUgZmlyc3QgY29kZSB1bml0IGFuZCBjb2RlIHVuaXQgdmFsdWVcbiAgICB2YXIgY3VGaXJzdCA9IHRleHQuY2hhckNvZGVBdChpbmRleCk7XG4gICAgdmFyIGN1U2Vjb25kO1xuICAgIHZhciBuZXh0SW5kZXggPSBpbmRleCArIDE7XG4gICAgdmFyIGxlbmd0aCA9IDE7XG4gICAgaWYgKFxuICAgIC8vIENoZWNrIGlmIGl0J3MgdGhlIHN0YXJ0IG9mIGEgc3Vycm9nYXRlIHBhaXIuXG4gICAgY3VGaXJzdCA+PSAweGQ4MDAgJiZcbiAgICAgICAgY3VGaXJzdCA8PSAweGRiZmYgJiYgLy8gaGlnaCBzdXJyb2dhdGVcbiAgICAgICAgdGV4dC5sZW5ndGggPiBuZXh0SW5kZXggLy8gdGhlcmUgaXMgYSBuZXh0IGNvZGUgdW5pdFxuICAgICkge1xuICAgICAgICBjdVNlY29uZCA9IHRleHQuY2hhckNvZGVBdChuZXh0SW5kZXgpO1xuICAgICAgICBpZiAoY3VTZWNvbmQgPj0gMHhkYzAwICYmIGN1U2Vjb25kIDw9IDB4ZGZmZilcbiAgICAgICAgICAgIGxlbmd0aCA9IDI7IC8vIGxvdyBzdXJyb2dhdGVcbiAgICB9XG4gICAgcmV0dXJuIFt0ZXh0LnNsaWNlKGluZGV4LCBpbmRleCArIGxlbmd0aCksIGxlbmd0aF07XG59O1xuZXhwb3J0IHZhciBjaGFyU3BsaXQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgIHZhciBjaGFycyA9IFtdO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRleHQubGVuZ3RoOyBpZHggPCBsZW47KSB7XG4gICAgICAgIHZhciBfYSA9IGNoYXJBdEluZGV4KHRleHQsIGlkeCksIGMgPSBfYVswXSwgY0xlbiA9IF9hWzFdO1xuICAgICAgICBjaGFycy5wdXNoKGMpO1xuICAgICAgICBpZHggKz0gY0xlbjtcbiAgICB9XG4gICAgcmV0dXJuIGNoYXJzO1xufTtcbnZhciBidWlsZFdvcmRCcmVha1JlZ2V4ID0gZnVuY3Rpb24gKHdvcmRCcmVha3MpIHtcbiAgICB2YXIgbmV3bGluZUNoYXJVbmlvbiA9IGVzY2FwZWROZXdsaW5lQ2hhcnMuam9pbignfCcpO1xuICAgIHZhciBlc2NhcGVkUnVsZXMgPSBbJyQnXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3b3JkQnJlYWtzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgd29yZEJyZWFrID0gd29yZEJyZWFrc1tpZHhdO1xuICAgICAgICBpZiAoaXNOZXdsaW5lQ2hhcih3b3JkQnJlYWspKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYHdvcmRCcmVha2AgbXVzdCBub3QgaW5jbHVkZSBcIiArIG5ld2xpbmVDaGFyVW5pb24pO1xuICAgICAgICB9XG4gICAgICAgIGVzY2FwZWRSdWxlcy5wdXNoKHdvcmRCcmVhayA9PT0gJycgPyAnLicgOiBlc2NhcGVSZWdFeHAod29yZEJyZWFrKSk7XG4gICAgfVxuICAgIHZhciBicmVha1J1bGVzID0gZXNjYXBlZFJ1bGVzLmpvaW4oJ3wnKTtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcIihcIiArIG5ld2xpbmVDaGFyVW5pb24gKyBcIil8KCguKj8pKFwiICsgYnJlYWtSdWxlcyArIFwiKSlcIiwgJ2dtJyk7XG59O1xuZXhwb3J0IHZhciBicmVha1RleHRJbnRvTGluZXMgPSBmdW5jdGlvbiAodGV4dCwgd29yZEJyZWFrcywgbWF4V2lkdGgsIGNvbXB1dGVXaWR0aE9mVGV4dCkge1xuICAgIHZhciByZWdleCA9IGJ1aWxkV29yZEJyZWFrUmVnZXgod29yZEJyZWFrcyk7XG4gICAgdmFyIHdvcmRzID0gY2xlYW5UZXh0KHRleHQpLm1hdGNoKHJlZ2V4KTtcbiAgICB2YXIgY3VyckxpbmUgPSAnJztcbiAgICB2YXIgY3VycldpZHRoID0gMDtcbiAgICB2YXIgbGluZXMgPSBbXTtcbiAgICB2YXIgcHVzaEN1cnJMaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY3VyckxpbmUgIT09ICcnKVxuICAgICAgICAgICAgbGluZXMucHVzaChjdXJyTGluZSk7XG4gICAgICAgIGN1cnJMaW5lID0gJyc7XG4gICAgICAgIGN1cnJXaWR0aCA9IDA7XG4gICAgfTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3b3Jkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIHdvcmQgPSB3b3Jkc1tpZHhdO1xuICAgICAgICBpZiAoaXNOZXdsaW5lQ2hhcih3b3JkKSkge1xuICAgICAgICAgICAgcHVzaEN1cnJMaW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSBjb21wdXRlV2lkdGhPZlRleHQod29yZCk7XG4gICAgICAgICAgICBpZiAoY3VycldpZHRoICsgd2lkdGggPiBtYXhXaWR0aClcbiAgICAgICAgICAgICAgICBwdXNoQ3VyckxpbmUoKTtcbiAgICAgICAgICAgIGN1cnJMaW5lICs9IHdvcmQ7XG4gICAgICAgICAgICBjdXJyV2lkdGggKz0gd2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVzaEN1cnJMaW5lKCk7XG4gICAgcmV0dXJuIGxpbmVzO1xufTtcbi8vIFNlZSBzZWN0aW9uIFwiNy45LjQgRGF0ZXNcIiBvZiB0aGUgUERGIHNwZWNpZmljYXRpb25cbnZhciBkYXRlUmVnZXggPSAvXkQ6KFxcZFxcZFxcZFxcZCkoXFxkXFxkKT8oXFxkXFxkKT8oXFxkXFxkKT8oXFxkXFxkKT8oXFxkXFxkKT8oWytcXC1aXSk/KFxcZFxcZCk/Jz8oXFxkXFxkKT8nPyQvO1xuZXhwb3J0IHZhciBwYXJzZURhdGUgPSBmdW5jdGlvbiAoZGF0ZVN0cikge1xuICAgIHZhciBtYXRjaCA9IGRhdGVTdHIubWF0Y2goZGF0ZVJlZ2V4KTtcbiAgICBpZiAoIW1hdGNoKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZhciB5ZWFyID0gbWF0Y2hbMV0sIF9hID0gbWF0Y2hbMl0sIG1vbnRoID0gX2EgPT09IHZvaWQgMCA/ICcwMScgOiBfYSwgX2IgPSBtYXRjaFszXSwgZGF5ID0gX2IgPT09IHZvaWQgMCA/ICcwMScgOiBfYiwgX2MgPSBtYXRjaFs0XSwgaG91cnMgPSBfYyA9PT0gdm9pZCAwID8gJzAwJyA6IF9jLCBfZCA9IG1hdGNoWzVdLCBtaW5zID0gX2QgPT09IHZvaWQgMCA/ICcwMCcgOiBfZCwgX2UgPSBtYXRjaFs2XSwgc2VjcyA9IF9lID09PSB2b2lkIDAgPyAnMDAnIDogX2UsIF9mID0gbWF0Y2hbN10sIG9mZnNldFNpZ24gPSBfZiA9PT0gdm9pZCAwID8gJ1onIDogX2YsIF9nID0gbWF0Y2hbOF0sIG9mZnNldEhvdXJzID0gX2cgPT09IHZvaWQgMCA/ICcwMCcgOiBfZywgX2ggPSBtYXRjaFs5XSwgb2Zmc2V0TWlucyA9IF9oID09PSB2b2lkIDAgPyAnMDAnIDogX2g7XG4gICAgLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTE1LjkuMS4xNVxuICAgIHZhciB0ek9mZnNldCA9IG9mZnNldFNpZ24gPT09ICdaJyA/ICdaJyA6IFwiXCIgKyBvZmZzZXRTaWduICsgb2Zmc2V0SG91cnMgKyBcIjpcIiArIG9mZnNldE1pbnM7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh5ZWFyICsgXCItXCIgKyBtb250aCArIFwiLVwiICsgZGF5ICsgXCJUXCIgKyBob3VycyArIFwiOlwiICsgbWlucyArIFwiOlwiICsgc2VjcyArIHR6T2Zmc2V0KTtcbiAgICByZXR1cm4gZGF0ZTtcbn07XG5leHBvcnQgdmFyIGZpbmRMYXN0TWF0Y2ggPSBmdW5jdGlvbiAodmFsdWUsIHJlZ2V4KSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBwb3NpdGlvbiA9IDA7XG4gICAgdmFyIGxhc3RNYXRjaDtcbiAgICB3aGlsZSAocG9zaXRpb24gPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gdmFsdWUuc3Vic3RyaW5nKHBvc2l0aW9uKS5tYXRjaChyZWdleCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICByZXR1cm4geyBtYXRjaDogbGFzdE1hdGNoLCBwb3M6IHBvc2l0aW9uIH07XG4gICAgICAgIGxhc3RNYXRjaCA9IG1hdGNoO1xuICAgICAgICBwb3NpdGlvbiArPSAoKF9hID0gbWF0Y2guaW5kZXgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDApICsgbWF0Y2hbMF0ubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4geyBtYXRjaDogbGFzdE1hdGNoLCBwb3M6IHBvc2l0aW9uIH07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5ncy5qcy5tYXAiLCJpbXBvcnQgeyB0b0hleFN0cmluZyB9IGZyb20gXCIuL3N0cmluZ3NcIjtcbi8qKlxuICogRW5jb2RlcyBhIHN0cmluZyB0byBVVEYtOC5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgVGhlIHN0cmluZyB0byBiZSBlbmNvZGVkLlxuICogQHBhcmFtIGJ5dGVPcmRlck1hcmsgV2hldGhlciBvciBub3QgYSBieXRlIG9yZGVyIG1hcmtlciAoQk9NKSBzaG91bGQgYmUgYWRkZWRcbiAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBzdGFydCBvZiB0aGUgZW5jb2RpbmcuIChkZWZhdWx0IGB0cnVlYClcbiAqIEByZXR1cm5zIEEgVWludDhBcnJheSBjb250YWluaW5nIHRoZSBVVEYtOCBlbmNvZGluZyBvZiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSmF2YVNjcmlwdCBzdHJpbmdzIGFyZSBjb21wb3NlZCBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLiBDb2RlIHBvaW50cyBhcmVcbiAqIGludGVnZXJzIGluIHRoZSByYW5nZSAwIHRvIDEsMTE0LDExMSAoMHgxMEZGRkYpLiBXaGVuIHNlcmlhbGl6aW5nIGEgc3RyaW5nLFxuICogaXQgbXVzdCBiZSBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2Ygd29yZHMuIEEgd29yZCBpcyB0eXBpY2FsbHkgOCwgMTYsIG9yIDMyXG4gKiBieXRlcyBpbiBzaXplLiBBcyBzdWNoLCBVbmljb2RlIGRlZmluZXMgdGhyZWUgZW5jb2RpbmcgZm9ybXM6IFVURi04LCBVVEYtMTYsXG4gKiBhbmQgVVRGLTMyLiBUaGVzZSBlbmNvZGluZyBmb3JtcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBVbmljb2RlIHN0YW5kYXJkIFsxXS5cbiAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgVVRGLTggZW5jb2RpbmcgZm9ybS5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIEluIFVURi04LCBlYWNoIGNvZGUgcG9pbnQgaXMgbWFwcGVkIHRvIGEgc2VxdWVuY2Ugb2YgMSwgMiwgMywgb3IgNCBieXRlcy5cbiAqIE5vdGUgdGhhdCB0aGUgbG9naWMgd2hpY2ggZGVmaW5lcyB0aGlzIG1hcHBpbmcgaXMgc2xpZ2h0bHkgY29udm9sdXRlZCwgYW5kXG4gKiBub3QgYXMgc3RyYWlnaHRmb3J3YXJkIGFzIHRoZSBtYXBwaW5nIGxvZ2ljIGZvciBVVEYtMTYgb3IgVVRGLTMyLiBUaGUgVVRGLThcbiAqIG1hcHBpbmcgbG9naWMgaXMgYXMgZm9sbG93cyBbMl06XG4gKlxuICog4oCiIElmIGEgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVSswMDAwLi5VKzAwN0YsIHRoZW4gdmlldyBpdCBhcyBhIDctYml0XG4gKiAgIGludGVnZXI6IDBieHh4eHh4eC4gTWFwIHRoZSBjb2RlIHBvaW50IHRvIDEgYnl0ZSB3aXRoIHRoZSBmaXJzdCBoaWdoIG9yZGVyXG4gKiAgIGJpdCBzZXQgdG8gMDpcbiAqXG4gKiAgICAgICBiMT0wYjB4eHh4eHh4XG4gKlxuICog4oCiIElmIGEgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVSswMDgwLi5VKzA3RkYsIHRoZW4gdmlldyBpdCBhcyBhbiAxMS1iaXRcbiAqICAgaW50ZWdlcjogMGJ5eXl5eXh4eHh4eC4gTWFwIHRoZSBjb2RlIHBvaW50IHRvIDIgYnl0ZXMgd2l0aCB0aGUgZmlyc3QgNSBiaXRzXG4gKiAgIG9mIHRoZSBjb2RlIHBvaW50IHN0b3JlZCBpbiB0aGUgZmlyc3QgYnl0ZSwgYW5kIHRoZSBsYXN0IDYgYml0cyBzdG9yZWQgaW5cbiAqICAgdGhlIHNlY29uZCBieXRlOlxuICpcbiAqICAgICAgIGIxPTBiMTEweXl5eXkgICAgYjI9MGIxMHh4eHh4eFxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMDgwMC4uVStGRkZGLCB0aGVuIHZpZXcgaXQgYXMgYSAxNi1iaXRcbiAqICAgaW50ZWdlciwgMGJ6enp6eXl5eXl5eHh4eHh4LiBNYXAgdGhlIGNvZGUgcG9pbnQgdG8gMyBieXRlcyB3aXRoIHRoZSBmaXJzdFxuICogICA0IGJpdHMgc3RvcmVkIGluIHRoZSBmaXJzdCBieXRlLCB0aGUgbmV4dCA2IGJpdHMgc3RvcmVkIGluIHRoZSBzZWNvbmQgYnl0ZSxcbiAqICAgYW5kIHRoZSBsYXN0IDYgYml0cyBpbiB0aGUgdGhpcmQgYnl0ZTpcbiAqXG4gKiAgICAgICBiMT0wYjExMTB6enp6ICAgIGIyPTBiMTB5eXl5eXkgICAgYjM9MGIxMHh4eHh4eFxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMTAwMDAuLi5VKzEwRkZGRiwgdGhlbiB2aWV3IGl0IGFzIGFcbiAqICAgMjEtYml0IGludGVnZXIsIDBidnZ2enp6enp6eXl5eXl5eHh4eHh4LiBNYXAgdGhlIGNvZGUgcG9pbnQgdG8gNCBieXRlcyB3aXRoXG4gKiAgIHRoZSBmaXJzdCAzIGJpdHMgc3RvcmVkIGluIHRoZSBmaXJzdCBieXRlLCB0aGUgbmV4dCA2IGJpdHMgc3RvcmVkIGluIHRoZVxuICogICBzZWNvbmQgYnl0ZSwgdGhlIG5leHQgNiBiaXRzIHN0b3JlZCBpbiB0aGUgdGhpcmQgYnl0ZSwgYW5kIHRoZSBsYXN0IDYgYml0c1xuICogICBzdG9yZWQgaW4gdGhlIGZvdXJ0aCBieXRlOlxuICpcbiAqICAgICAgIGIxPTBiMTExMTB4eHggICAgYjI9MGIxMHp6enp6eiAgICBiMz0wYjEweXl5eXl5ICAgIGI0PTBiMTB4eHh4eHhcbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIEl0IGlzIGltcG9ydGFudCB0byBub3RlLCB3aGVuIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBjb2RlIHBvaW50cyBvZiBhIHN0cmluZ1xuICogaW4gSmF2YVNjcmlwdCwgdGhhdCBpZiBhIGNoYXJhY3RlciBpcyBlbmNvZGVkIGFzIGEgc3Vycm9nYXRlIHBhaXIgaXQgd2lsbFxuICogaW5jcmVhc2UgdGhlIHN0cmluZydzIGxlbmd0aCBieSAyIGluc3RlYWQgb2YgMSBbNF0uIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYFxuICogPiAnYScubGVuZ3RoXG4gKiAxXG4gKiA+ICfwn5KpJy5sZW5ndGhcbiAqIDJcbiAqID4gJ+iqnicubGVuZ3RoXG4gKiAxXG4gKiA+ICdh8J+SqeiqnicubGVuZ3RoXG4gKiA0XG4gKiBgYGBcbiAqXG4gKiBUaGUgcmVzdWx0cyBvZiB0aGUgYWJvdmUgZXhhbXBsZSBhcmUgZXhwbGFpbmVkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlXG4gKiBjaGFyYWN0ZXJzICdhJyBhbmQgJ+iqnicgYXJlIG5vdCByZXByZXNlbnRlZCBieSBzdXJyb2dhdGUgcGFpcnMsIGJ1dCAn8J+SqScgaXMuXG4gKlxuICogQmVjYXVzZSBvZiB0aGlzIGlkaW9zeW5jcmFzeSBpbiBKYXZhU2NyaXB0J3Mgc3RyaW5nIGltcGxlbWVudGF0aW9uIGFuZCBBUElzLFxuICogd2UgbXVzdCBcImp1bXBcIiBhbiBleHRyYSBpbmRleCBhZnRlciBlbmNvZGluZyBhIGNoYXJhY3RlciBhcyBhIHN1cnJvZ2F0ZVxuICogcGFpci4gSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgd2UgbXVzdCBpbmNyZW1lbnQgdGhlIGluZGV4IG9mIG91ciBmb3IgbG9vcCBieVxuICogMiBpZiB3ZSBlbmNvZGUgYSBzdXJyb2dhdGUgcGFpciwgYW5kIDEgaW4gYWxsIG90aGVyIGNhc2VzLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogUmVmZXJlbmNlczpcbiAqICAgLSBbMV0gaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTEyLjAuMC9Vbmljb2RlU3RhbmRhcmQtMTIuMC5wZGZcbiAqICAgICAgICAgMy45ICBVbmljb2RlIEVuY29kaW5nIEZvcm1zIC0gVVRGLThcbiAqICAgLSBbMl0gaHR0cDovL3d3dy5oZXJvbmd5YW5nLmNvbS9Vbmljb2RlL1VURi04LVVURi04LUVuY29kaW5nLmh0bWxcbiAqICAgLSBbM10gaHR0cDovL3d3dy5oZXJvbmd5YW5nLmNvbS9Vbmljb2RlL1VURi04LVVURi04LUVuY29kaW5nLUFsZ29yaXRobS5odG1sXG4gKiAgIC0gWzRdIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9sZW5ndGgjRGVzY3JpcHRpb25cbiAqXG4gKi9cbmV4cG9ydCB2YXIgdXRmOEVuY29kZSA9IGZ1bmN0aW9uIChpbnB1dCwgYnl0ZU9yZGVyTWFyaykge1xuICAgIGlmIChieXRlT3JkZXJNYXJrID09PSB2b2lkIDApIHsgYnl0ZU9yZGVyTWFyayA9IHRydWU7IH1cbiAgICB2YXIgZW5jb2RlZCA9IFtdO1xuICAgIGlmIChieXRlT3JkZXJNYXJrKVxuICAgICAgICBlbmNvZGVkLnB1c2goMHhlZiwgMHhiYiwgMHhiZik7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gaW5wdXQubGVuZ3RoOyBpZHggPCBsZW47KSB7XG4gICAgICAgIHZhciBjb2RlUG9pbnQgPSBpbnB1dC5jb2RlUG9pbnRBdChpZHgpO1xuICAgICAgICAvLyBPbmUgYnl0ZSBlbmNvZGluZ1xuICAgICAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgICAgICAgdmFyIGJ5dGUxID0gY29kZVBvaW50ICYgMHg3ZjtcbiAgICAgICAgICAgIGVuY29kZWQucHVzaChieXRlMSk7XG4gICAgICAgICAgICBpZHggKz0gMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUd28gYnl0ZSBlbmNvZGluZ1xuICAgICAgICBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDA4MDApIHtcbiAgICAgICAgICAgIHZhciBieXRlMSA9ICgoY29kZVBvaW50ID4+IDYpICYgMHgxZikgfCAweGMwO1xuICAgICAgICAgICAgdmFyIGJ5dGUyID0gKGNvZGVQb2ludCAmIDB4M2YpIHwgMHg4MDtcbiAgICAgICAgICAgIGVuY29kZWQucHVzaChieXRlMSwgYnl0ZTIpO1xuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhyZWUgYnl0ZSBlbmNvZGluZ1xuICAgICAgICBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDAxMDAwMCkge1xuICAgICAgICAgICAgdmFyIGJ5dGUxID0gKChjb2RlUG9pbnQgPj4gMTIpICYgMHgwZikgfCAweGUwO1xuICAgICAgICAgICAgdmFyIGJ5dGUyID0gKChjb2RlUG9pbnQgPj4gNikgJiAweDNmKSB8IDB4ODA7XG4gICAgICAgICAgICB2YXIgYnl0ZTMgPSAoY29kZVBvaW50ICYgMHgzZikgfCAweDgwO1xuICAgICAgICAgICAgZW5jb2RlZC5wdXNoKGJ5dGUxLCBieXRlMiwgYnl0ZTMpO1xuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm91ciBieXRlIGVuY29kaW5nIChzdXJyb2dhdGUgcGFpcilcbiAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgIHZhciBieXRlMSA9ICgoY29kZVBvaW50ID4+IDE4KSAmIDB4MDcpIHwgMHhmMDtcbiAgICAgICAgICAgIHZhciBieXRlMiA9ICgoY29kZVBvaW50ID4+IDEyKSAmIDB4M2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHZhciBieXRlMyA9ICgoY29kZVBvaW50ID4+IDYpICYgMHgzZikgfCAweDgwO1xuICAgICAgICAgICAgdmFyIGJ5dGU0ID0gKChjb2RlUG9pbnQgPj4gMCkgJiAweDNmKSB8IDB4ODA7XG4gICAgICAgICAgICBlbmNvZGVkLnB1c2goYnl0ZTEsIGJ5dGUyLCBieXRlMywgYnl0ZTQpO1xuICAgICAgICAgICAgaWR4ICs9IDI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgY2FzZVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvZGUgcG9pbnQ6IDB4XCIgKyB0b0hleFN0cmluZyhjb2RlUG9pbnQpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGVuY29kZWQpO1xufTtcbi8qKlxuICogRW5jb2RlcyBhIHN0cmluZyB0byBVVEYtMTYuXG4gKlxuICogQHBhcmFtIGlucHV0IFRoZSBzdHJpbmcgdG8gYmUgZW5jb2RlZC5cbiAqIEBwYXJhbSBieXRlT3JkZXJNYXJrIFdoZXRoZXIgb3Igbm90IGEgYnl0ZSBvcmRlciBtYXJrZXIgKEJPTSkgc2hvdWxkIGJlIGFkZGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgc3RhcnQgb2YgdGhlIGVuY29kaW5nLiAoZGVmYXVsdCBgdHJ1ZWApXG4gKiBAcmV0dXJucyBBIFVpbnQxNkFycmF5IGNvbnRhaW5pbmcgdGhlIFVURi0xNiBlbmNvZGluZyBvZiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSmF2YVNjcmlwdCBzdHJpbmdzIGFyZSBjb21wb3NlZCBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLiBDb2RlIHBvaW50cyBhcmVcbiAqIGludGVnZXJzIGluIHRoZSByYW5nZSAwIHRvIDEsMTE0LDExMSAoMHgxMEZGRkYpLiBXaGVuIHNlcmlhbGl6aW5nIGEgc3RyaW5nLFxuICogaXQgbXVzdCBiZSBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2Ygd29yZHMuIEEgd29yZCBpcyB0eXBpY2FsbHkgOCwgMTYsIG9yIDMyXG4gKiBieXRlcyBpbiBzaXplLiBBcyBzdWNoLCBVbmljb2RlIGRlZmluZXMgdGhyZWUgZW5jb2RpbmcgZm9ybXM6IFVURi04LCBVVEYtMTYsXG4gKiBhbmQgVVRGLTMyLiBUaGVzZSBlbmNvZGluZyBmb3JtcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBVbmljb2RlIHN0YW5kYXJkIFsxXS5cbiAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgVVRGLTE2IGVuY29kaW5nIGZvcm0uXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBJbiBVVEYtMTYsIGVhY2ggY29kZSBwb2ludCBpcyBtYXBwZWQgdG8gb25lIG9yIHR3byAxNi1iaXQgaW50ZWdlcnMuIFRoZVxuICogVVRGLTE2IG1hcHBpbmcgbG9naWMgaXMgYXMgZm9sbG93cyBbMl06XG4gKlxuICog4oCiIElmIGEgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVSswMDAwLi5VK0ZGRkYsIHRoZW4gbWFwIHRoZSBjb2RlIHBvaW50IHRvXG4gKiAgIGEgMTYtYml0IGludGVnZXIgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0LlxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMTAwMDAuLlUrMTAwMDAsIHRoZW4gbWFwIHRoZSBjb2RlIHBvaW50XG4gKiAgIHRvIHR3byAxNi1iaXQgaW50ZWdlcnMuIFRoZSBmaXJzdCBpbnRlZ2VyIHNob3VsZCBjb250YWluIHRoZSBoaWdoIHN1cnJvZ2F0ZVxuICogICBhbmQgdGhlIHNlY29uZCBpbnRlZ2VyIHNob3VsZCBjb250YWluIHRoZSBsb3cgc3Vycm9nYXRlLiBCb3RoIHN1cnJvZ2F0ZXNcbiAqICAgc2hvdWxkIGJlIHdyaXR0ZW4gd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0LlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUsIHdoZW4gaXRlcmF0aW5nIHRocm91Z2ggdGhlIGNvZGUgcG9pbnRzIG9mIGEgc3RyaW5nXG4gKiBpbiBKYXZhU2NyaXB0LCB0aGF0IGlmIGEgY2hhcmFjdGVyIGlzIGVuY29kZWQgYXMgYSBzdXJyb2dhdGUgcGFpciBpdCB3aWxsXG4gKiBpbmNyZWFzZSB0aGUgc3RyaW5nJ3MgbGVuZ3RoIGJ5IDIgaW5zdGVhZCBvZiAxIFs0XS4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiA+ICdhJy5sZW5ndGhcbiAqIDFcbiAqID4gJ/CfkqknLmxlbmd0aFxuICogMlxuICogPiAn6KqeJy5sZW5ndGhcbiAqIDFcbiAqID4gJ2Hwn5Kp6KqeJy5sZW5ndGhcbiAqIDRcbiAqIGBgYFxuICpcbiAqIFRoZSByZXN1bHRzIG9mIHRoZSBhYm92ZSBleGFtcGxlIGFyZSBleHBsYWluZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGVcbiAqIGNoYXJhY3RlcnMgJ2EnIGFuZCAn6KqeJyBhcmUgbm90IHJlcHJlc2VudGVkIGJ5IHN1cnJvZ2F0ZSBwYWlycywgYnV0ICfwn5KpJyBpcy5cbiAqXG4gKiBCZWNhdXNlIG9mIHRoaXMgaWRpb3N5bmNyYXN5IGluIEphdmFTY3JpcHQncyBzdHJpbmcgaW1wbGVtZW50YXRpb24gYW5kIEFQSXMsXG4gKiB3ZSBtdXN0IFwianVtcFwiIGFuIGV4dHJhIGluZGV4IGFmdGVyIGVuY29kaW5nIGEgY2hhcmFjdGVyIGFzIGEgc3Vycm9nYXRlXG4gKiBwYWlyLiBJbiBwcmFjdGljZSwgdGhpcyBtZWFucyB3ZSBtdXN0IGluY3JlbWVudCB0aGUgaW5kZXggb2Ygb3VyIGZvciBsb29wIGJ5XG4gKiAyIGlmIHdlIGVuY29kZSBhIHN1cnJvZ2F0ZSBwYWlyLCBhbmQgMSBpbiBhbGwgb3RoZXIgY2FzZXMuXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogICAtIFsxXSBodHRwczovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlMTIuMC4wL1VuaWNvZGVTdGFuZGFyZC0xMi4wLnBkZlxuICogICAgICAgICAzLjkgIFVuaWNvZGUgRW5jb2RpbmcgRm9ybXMgLSBVVEYtOFxuICogICAtIFsyXSBodHRwOi8vd3d3Lmhlcm9uZ3lhbmcuY29tL1VuaWNvZGUvVVRGLTE2LVVURi0xNi1FbmNvZGluZy5odG1sXG4gKiAgIC0gWzNdIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9sZW5ndGgjRGVzY3JpcHRpb25cbiAqXG4gKi9cbmV4cG9ydCB2YXIgdXRmMTZFbmNvZGUgPSBmdW5jdGlvbiAoaW5wdXQsIGJ5dGVPcmRlck1hcmspIHtcbiAgICBpZiAoYnl0ZU9yZGVyTWFyayA9PT0gdm9pZCAwKSB7IGJ5dGVPcmRlck1hcmsgPSB0cnVlOyB9XG4gICAgdmFyIGVuY29kZWQgPSBbXTtcbiAgICBpZiAoYnl0ZU9yZGVyTWFyaylcbiAgICAgICAgZW5jb2RlZC5wdXNoKDB4ZmVmZik7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gaW5wdXQubGVuZ3RoOyBpZHggPCBsZW47KSB7XG4gICAgICAgIHZhciBjb2RlUG9pbnQgPSBpbnB1dC5jb2RlUG9pbnRBdChpZHgpO1xuICAgICAgICAvLyBUd28gYnl0ZSBlbmNvZGluZ1xuICAgICAgICBpZiAoY29kZVBvaW50IDwgMHgwMTAwMDApIHtcbiAgICAgICAgICAgIGVuY29kZWQucHVzaChjb2RlUG9pbnQpO1xuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm91ciBieXRlIGVuY29kaW5nIChzdXJyb2dhdGUgcGFpcilcbiAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgIGVuY29kZWQucHVzaChoaWdoU3Vycm9nYXRlKGNvZGVQb2ludCksIGxvd1N1cnJvZ2F0ZShjb2RlUG9pbnQpKTtcbiAgICAgICAgICAgIGlkeCArPSAyO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciByZWFjaCB0aGlzIGNhc2VcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjb2RlIHBvaW50OiAweFwiICsgdG9IZXhTdHJpbmcoY29kZVBvaW50KSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDE2QXJyYXkoZW5jb2RlZCk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYGNvZGVQb2ludGAgaXMgd2l0aGluIHRoZVxuICogQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChCTVApLiBDb2RlIHBvaW50cyBpbnNpZGUgdGhlIEJNUCBhcmUgbm90IGVuY29kZWRcbiAqIHdpdGggc3Vycm9nYXRlIHBhaXJzLlxuICogQHBhcmFtIGNvZGVQb2ludCBUaGUgY29kZSBwb2ludCB0byBiZSBldmFsdWF0ZWQuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjRGVzY3JpcHRpb25cbiAqL1xuZXhwb3J0IHZhciBpc1dpdGhpbkJNUCA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gY29kZVBvaW50ID49IDAgJiYgY29kZVBvaW50IDw9IDB4ZmZmZjtcbn07XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBgY29kZVBvaW50YCBpcyB2YWxpZCBhbmQgbXVzdCBiZSByZXByZXNlbnRlZFxuICogd2l0aCBhIHN1cnJvZ2F0ZSBwYWlyIHdoZW4gZW5jb2RlZC5cbiAqIEBwYXJhbSBjb2RlUG9pbnQgVGhlIGNvZGUgcG9pbnQgdG8gYmUgZXZhbHVhdGVkLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0Rlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCB2YXIgaGFzU3Vycm9nYXRlcyA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gY29kZVBvaW50ID49IDB4MDEwMDAwICYmIGNvZGVQb2ludCA8PSAweDEwZmZmZjtcbn07XG4vLyBGcm9tIFVuaWNvZGUgMy4wIHNwZWMsIHNlY3Rpb24gMy43OlxuLy8gICBodHRwOi8vdW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTMuMC4wL2NoMDMucGRmXG5leHBvcnQgdmFyIGhpZ2hTdXJyb2dhdGUgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoKGNvZGVQb2ludCAtIDB4MTAwMDApIC8gMHg0MDApICsgMHhkODAwO1xufTtcbi8vIEZyb20gVW5pY29kZSAzLjAgc3BlYywgc2VjdGlvbiAzLjc6XG4vLyAgIGh0dHA6Ly91bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlMy4wLjAvY2gwMy5wZGZcbmV4cG9ydCB2YXIgbG93U3Vycm9nYXRlID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgIHJldHVybiAoKGNvZGVQb2ludCAtIDB4MTAwMDApICUgMHg0MDApICsgMHhkYzAwO1xufTtcbnZhciBCeXRlT3JkZXI7XG4oZnVuY3Rpb24gKEJ5dGVPcmRlcikge1xuICAgIEJ5dGVPcmRlcltcIkJpZ0VuZGlhblwiXSA9IFwiQmlnRW5kaWFuXCI7XG4gICAgQnl0ZU9yZGVyW1wiTGl0dGxlRW5kaWFuXCJdID0gXCJMaXR0bGVFbmRpYW5cIjtcbn0pKEJ5dGVPcmRlciB8fCAoQnl0ZU9yZGVyID0ge30pKTtcbnZhciBSRVBMQUNFTUVOVCA9ICfvv70nLmNvZGVQb2ludEF0KDApO1xuLyoqXG4gKiBEZWNvZGVzIGEgVWludDhBcnJheSBvZiBkYXRhIHRvIGEgc3RyaW5nIHVzaW5nIFVURi0xNi5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byByZWNvdmVyIGZyb20gZXJyb25vdXMgaW5wdXQgYnlcbiAqIGluc2VydGluZyB0aGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyICjvv70pIHRvIG1hcmsgaW52YWxpZCBjb2RlIHBvaW50c1xuICogYW5kIHN1cnJvZ2F0ZSBwYWlycy5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgQSBVaW50OEFycmF5IGNvbnRhaW5pbmcgVVRGLTE2IGVuY29kZWQgZGF0YVxuICogQHBhcmFtIGJ5dGVPcmRlck1hcmsgV2hldGhlciBvciBub3QgYSBieXRlIG9yZGVyIG1hcmtlciAoQk9NKSBzaG91bGQgYmUgcmVhZFxuICogICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIHN0YXJ0IG9mIHRoZSBlbmNvZGluZy4gKGRlZmF1bHQgYHRydWVgKVxuICogQHJldHVybnMgVGhlIGRlY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnQgdmFyIHV0ZjE2RGVjb2RlID0gZnVuY3Rpb24gKGlucHV0LCBieXRlT3JkZXJNYXJrKSB7XG4gICAgaWYgKGJ5dGVPcmRlck1hcmsgPT09IHZvaWQgMCkgeyBieXRlT3JkZXJNYXJrID0gdHJ1ZTsgfVxuICAgIC8vIE5lZWQgYXQgbGVhc3QgMiBieXRlcyBvZiBkYXRhIGluIFVURi0xNiBlbmNvZGluZ3NcbiAgICBpZiAoaW5wdXQubGVuZ3RoIDw9IDEpXG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChSRVBMQUNFTUVOVCk7XG4gICAgdmFyIGJ5dGVPcmRlciA9IGJ5dGVPcmRlck1hcmsgPyByZWFkQk9NKGlucHV0KSA6IEJ5dGVPcmRlci5CaWdFbmRpYW47XG4gICAgLy8gU2tpcCBieXRlIG9yZGVyIG1hcmsgaWYgbmVlZGVkXG4gICAgdmFyIGlkeCA9IGJ5dGVPcmRlck1hcmsgPyAyIDogMDtcbiAgICB2YXIgY29kZVBvaW50cyA9IFtdO1xuICAgIHdoaWxlIChpbnB1dC5sZW5ndGggLSBpZHggPj0gMikge1xuICAgICAgICB2YXIgZmlyc3QgPSBkZWNvZGVWYWx1ZXMoaW5wdXRbaWR4KytdLCBpbnB1dFtpZHgrK10sIGJ5dGVPcmRlcik7XG4gICAgICAgIGlmIChpc0hpZ2hTdXJyb2dhdGUoZmlyc3QpKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoIC0gaWR4IDwgMikge1xuICAgICAgICAgICAgICAgIC8vIE5lZWQgYXQgbGVhc3QgMiBieXRlcyBsZWZ0IGZvciB0aGUgbG93IHN1cnJvZ2F0ZSB0aGF0IGlzIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgY29kZVBvaW50cy5wdXNoKFJFUExBQ0VNRU5UKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBzZWNvbmQgPSBkZWNvZGVWYWx1ZXMoaW5wdXRbaWR4KytdLCBpbnB1dFtpZHgrK10sIGJ5dGVPcmRlcik7XG4gICAgICAgICAgICAgICAgaWYgKGlzTG93U3Vycm9nYXRlKHNlY29uZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZVBvaW50cy5wdXNoKGZpcnN0LCBzZWNvbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTG93IHN1cnJvZ2F0ZXMgc2hvdWxkIGFsd2F5cyBmb2xsb3cgaGlnaCBzdXJyb2dhdGVzXG4gICAgICAgICAgICAgICAgICAgIGNvZGVQb2ludHMucHVzaChSRVBMQUNFTUVOVCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTG93U3Vycm9nYXRlKGZpcnN0KSkge1xuICAgICAgICAgICAgLy8gSGlnaCBzdXJyb2dhdGVzIHNob3VsZCBhbHdheXMgY29tZSBmaXJzdCBzaW5jZSBgZGVjb2RlVmFsdWVzKClgXG4gICAgICAgICAgICAvLyBhY2NvdW50cyBmb3IgdGhlIGJ5dGUgb3JkZXJpbmdcbiAgICAgICAgICAgIGlkeCArPSAyO1xuICAgICAgICAgICAgY29kZVBvaW50cy5wdXNoKFJFUExBQ0VNRU5UKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvZGVQb2ludHMucHVzaChmaXJzdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGhlcmUgc2hvdWxkbid0IGJlIGV4dHJhIGJ5dGUocykgbGVmdCBvdmVyXG4gICAgaWYgKGlkeCA8IGlucHV0Lmxlbmd0aClcbiAgICAgICAgY29kZVBvaW50cy5wdXNoKFJFUExBQ0VNRU5UKTtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKTtcbn07XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBgY29kZVBvaW50YCBpcyBhIGhpZ2ggc3Vycm9nYXRlLlxuICogQHBhcmFtIGNvZGVQb2ludCBUaGUgY29kZSBwb2ludCB0byBiZSBldmFsdWF0ZWQuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjRGVzY3JpcHRpb25cbiAqL1xudmFyIGlzSGlnaFN1cnJvZ2F0ZSA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gY29kZVBvaW50ID49IDB4ZDgwMCAmJiBjb2RlUG9pbnQgPD0gMHhkYmZmO1xufTtcbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGBjb2RlUG9pbnRgIGlzIGEgbG93IHN1cnJvZ2F0ZS5cbiAqIEBwYXJhbSBjb2RlUG9pbnQgVGhlIGNvZGUgcG9pbnQgdG8gYmUgZXZhbHVhdGVkLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0Rlc2NyaXB0aW9uXG4gKi9cbnZhciBpc0xvd1N1cnJvZ2F0ZSA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gY29kZVBvaW50ID49IDB4ZGMwMCAmJiBjb2RlUG9pbnQgPD0gMHhkZmZmO1xufTtcbi8qKlxuICogRGVjb2RlcyB0aGUgZ2l2ZW4gdXRmLTE2IHZhbHVlcyBmaXJzdCBhbmQgc2Vjb25kIHVzaW5nIHRoZSBzcGVjaWZpZWRcbiAqIGJ5dGUgb3JkZXIuXG4gKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGVuY29kaW5nLlxuICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIGJ5dGUgb2YgdGhlIGVuY29kaW5nLlxuICogQHBhcmFtIGJ5dGVPcmRlciBUaGUgYnl0ZSBvcmRlciBvZiB0aGUgZW5jb2RpbmcuXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNFeGFtcGxlc1xuICovXG52YXIgZGVjb2RlVmFsdWVzID0gZnVuY3Rpb24gKGZpcnN0LCBzZWNvbmQsIGJ5dGVPcmRlcikge1xuICAgIC8vIEFwcGVuZCB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcmVjZWRpbmcgYnl0ZSBieSBzaGlmdGluZyB0aGVcbiAgICAvLyBmaXJzdCBvbmUgOCB0byB0aGUgbGVmdCBhbmQgdGhhbiBhcHBseWluZyBhIGJpdHdpc2Ugb3Itb3BlcmF0b3IgdG8gYXBwZW5kXG4gICAgLy8gdGhlIHNlY29uZCBvbmUuXG4gICAgaWYgKGJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkxpdHRsZUVuZGlhbilcbiAgICAgICAgcmV0dXJuIChzZWNvbmQgPDwgOCkgfCBmaXJzdDtcbiAgICBpZiAoYnl0ZU9yZGVyID09PSBCeXRlT3JkZXIuQmlnRW5kaWFuKVxuICAgICAgICByZXR1cm4gKGZpcnN0IDw8IDgpIHwgc2Vjb25kO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYnl0ZU9yZGVyOiBcIiArIGJ5dGVPcmRlcik7XG59O1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGFycmF5IGNvbnRhaW5zIGEgYnl0ZSBvcmRlciBtYXJrIGZvciB0aGVcbiAqIFVURi0xNkJFIG9yIFVURi0xNkxFIGVuY29kaW5nLiBJZiBpdCBoYXMgbmVpdGhlciwgQmlnRW5kaWFuIGlzIGFzc3VtZWQuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CeXRlX29yZGVyX21hcmsjVVRGLTE2XG4gKlxuICogQHBhcmFtIGJ5dGVzIFRoZSBieXRlIGFycmF5IHRvIGJlIGV2YWx1YXRlZC5cbiAqL1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgcmVhZEJPTSA9IGZ1bmN0aW9uIChieXRlcykgeyByZXR1cm4gKGhhc1V0ZjE2QmlnRW5kaWFuQk9NKGJ5dGVzKSA/IEJ5dGVPcmRlci5CaWdFbmRpYW5cbiAgICA6IGhhc1V0ZjE2TGl0dGxlRW5kaWFuQk9NKGJ5dGVzKSA/IEJ5dGVPcmRlci5MaXR0bGVFbmRpYW5cbiAgICAgICAgOiBCeXRlT3JkZXIuQmlnRW5kaWFuKTsgfTtcbnZhciBoYXNVdGYxNkJpZ0VuZGlhbkJPTSA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgIHJldHVybiBieXRlc1swXSA9PT0gMHhmZSAmJiBieXRlc1sxXSA9PT0gMHhmZjtcbn07XG52YXIgaGFzVXRmMTZMaXR0bGVFbmRpYW5CT00gPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICByZXR1cm4gYnl0ZXNbMF0gPT09IDB4ZmYgJiYgYnl0ZXNbMV0gPT09IDB4ZmU7XG59O1xuZXhwb3J0IHZhciBoYXNVdGYxNkJPTSA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgIHJldHVybiBoYXNVdGYxNkJpZ0VuZGlhbkJPTShieXRlcykgfHwgaGFzVXRmMTZMaXR0bGVFbmRpYW5CT00oYnl0ZXMpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaWNvZGUuanMubWFwIiwiLyogdHNsaW50OmRpc2FibGU6YmFuLXR5cGVzICovXG5pbXBvcnQgeyB2YWx1ZXMgYXMgb2JqZWN0VmFsdWVzIH0gZnJvbSBcIi4vb2JqZWN0c1wiO1xuZXhwb3J0IHZhciBiYWNrdGljayA9IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIFwiYFwiICsgdmFsICsgXCJgXCI7IH07XG5leHBvcnQgdmFyIHNpbmdsZVF1b3RlID0gZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gXCInXCIgKyB2YWwgKyBcIidcIjsgfTtcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGZvcm1hdFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gc2luZ2xlUXVvdGUodmFsdWUpO1xuICAgIGVsc2UgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm4gYmFja3RpY2sodmFsdWUpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xufTtcbmV4cG9ydCB2YXIgY3JlYXRlVmFsdWVFcnJvck1zZyA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCB2YWx1ZXMpIHtcbiAgICB2YXIgYWxsb3dlZFZhbHVlcyA9IG5ldyBBcnJheSh2YWx1ZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciB2ID0gdmFsdWVzW2lkeF07XG4gICAgICAgIGFsbG93ZWRWYWx1ZXNbaWR4XSA9IGZvcm1hdFZhbHVlKHYpO1xuICAgIH1cbiAgICB2YXIgam9pbmVkVmFsdWVzID0gYWxsb3dlZFZhbHVlcy5qb2luKCcgb3IgJyk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgcmV0dXJuIGJhY2t0aWNrKHZhbHVlTmFtZSkgKyBcIiBtdXN0IGJlIG9uZSBvZiBcIiArIGpvaW5lZFZhbHVlcyArIFwiLCBidXQgd2FzIGFjdHVhbGx5IFwiICsgZm9ybWF0VmFsdWUodmFsdWUpO1xufTtcbmV4cG9ydCB2YXIgYXNzZXJ0SXNPbmVPZiA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCBhbGxvd2VkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFsbG93ZWRWYWx1ZXMpKSB7XG4gICAgICAgIGFsbG93ZWRWYWx1ZXMgPSBvYmplY3RWYWx1ZXMoYWxsb3dlZFZhbHVlcyk7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFsbG93ZWRWYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gYWxsb3dlZFZhbHVlc1tpZHhdKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGNyZWF0ZVZhbHVlRXJyb3JNc2codmFsdWUsIHZhbHVlTmFtZSwgYWxsb3dlZFZhbHVlcykpO1xufTtcbmV4cG9ydCB2YXIgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIGFsbG93ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWxsb3dlZFZhbHVlcykpIHtcbiAgICAgICAgYWxsb3dlZFZhbHVlcyA9IG9iamVjdFZhbHVlcyhhbGxvd2VkVmFsdWVzKTtcbiAgICB9XG4gICAgYXNzZXJ0SXNPbmVPZih2YWx1ZSwgdmFsdWVOYW1lLCBhbGxvd2VkVmFsdWVzLmNvbmNhdCh1bmRlZmluZWQpKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydElzU3Vic2V0ID0gZnVuY3Rpb24gKHZhbHVlcywgdmFsdWVOYW1lLCBhbGxvd2VkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFsbG93ZWRWYWx1ZXMpKSB7XG4gICAgICAgIGFsbG93ZWRWYWx1ZXMgPSBvYmplY3RWYWx1ZXMoYWxsb3dlZFZhbHVlcyk7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZih2YWx1ZXNbaWR4XSwgdmFsdWVOYW1lLCBhbGxvd2VkVmFsdWVzKTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciBnZXRUeXBlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmICh2YWwgPT09IG51bGwpXG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgaWYgKGlzTmFOKHZhbCkpXG4gICAgICAgIHJldHVybiAnTmFOJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3ltYm9sJylcbiAgICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnYmlnaW50JylcbiAgICAgICAgcmV0dXJuICdiaWdpbnQnO1xuICAgIGlmICh2YWwuY29uc3RydWN0b3IgJiYgdmFsLmNvbnN0cnVjdG9yLm5hbWUpXG4gICAgICAgIHJldHVybiB2YWwuY29uc3RydWN0b3IubmFtZTtcbiAgICBpZiAodmFsLm5hbWUpXG4gICAgICAgIHJldHVybiB2YWwubmFtZTtcbiAgICBpZiAodmFsLmNvbnN0cnVjdG9yKVxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbC5jb25zdHJ1Y3Rvcik7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpO1xufTtcbmV4cG9ydCB2YXIgaXNUeXBlID0gZnVuY3Rpb24gKHZhbHVlLCB0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudWxsJylcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xuICAgIGlmICh0eXBlID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSk7XG4gICAgaWYgKHR5cGUgPT09ICdib29sZWFuJylcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICAgIGlmICh0eXBlID09PSAnc3ltYm9sJylcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCc7XG4gICAgaWYgKHR5cGUgPT09ICdiaWdpbnQnKVxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JztcbiAgICBpZiAodHlwZSA9PT0gRGF0ZSlcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZTtcbiAgICBpZiAodHlwZSA9PT0gQXJyYXkpXG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5O1xuICAgIGlmICh0eXBlID09PSBVaW50OEFycmF5KVxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5O1xuICAgIGlmICh0eXBlID09PSBBcnJheUJ1ZmZlcilcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG4gICAgaWYgKHR5cGUgPT09IEZ1bmN0aW9uKVxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbjtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiB0eXBlWzBdO1xufTtcbmV4cG9ydCB2YXIgY3JlYXRlVHlwZUVycm9yTXNnID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIHR5cGVzKSB7XG4gICAgdmFyIGFsbG93ZWRUeXBlcyA9IG5ldyBBcnJheSh0eXBlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHR5cGVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2lkeF07XG4gICAgICAgIGlmICh0eXBlID09PSAnbnVsbCcpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdudWxsJyk7XG4gICAgICAgIGlmICh0eXBlID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ3VuZGVmaW5lZCcpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdzdHJpbmcnKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdudW1iZXInKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnYm9vbGVhbicpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnc3ltYm9sJylcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ3N5bWJvbCcpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYmlnaW50JylcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ2JpZ2ludCcpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBBcnJheSlcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ0FycmF5Jyk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFVpbnQ4QXJyYXkpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdVaW50OEFycmF5Jyk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IEFycmF5QnVmZmVyKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnQXJyYXlCdWZmZXInKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljayh0eXBlWzFdKTtcbiAgICB9XG4gICAgdmFyIGpvaW5lZFR5cGVzID0gYWxsb3dlZFR5cGVzLmpvaW4oJyBvciAnKTtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICByZXR1cm4gYmFja3RpY2sodmFsdWVOYW1lKSArIFwiIG11c3QgYmUgb2YgdHlwZSBcIiArIGpvaW5lZFR5cGVzICsgXCIsIGJ1dCB3YXMgYWN0dWFsbHkgb2YgdHlwZSBcIiArIGJhY2t0aWNrKGdldFR5cGUodmFsdWUpKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydElzID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIHR5cGVzKSB7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdHlwZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGlmIChpc1R5cGUodmFsdWUsIHR5cGVzW2lkeF0pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGNyZWF0ZVR5cGVFcnJvck1zZyh2YWx1ZSwgdmFsdWVOYW1lLCB0eXBlcykpO1xufTtcbmV4cG9ydCB2YXIgYXNzZXJ0T3JVbmRlZmluZWQgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgdHlwZXMpIHtcbiAgICBhc3NlcnRJcyh2YWx1ZSwgdmFsdWVOYW1lLCB0eXBlcy5jb25jYXQoJ3VuZGVmaW5lZCcpKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydEVhY2hJcyA9IGZ1bmN0aW9uICh2YWx1ZXMsIHZhbHVlTmFtZSwgdHlwZXMpIHtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGFzc2VydElzKHZhbHVlc1tpZHhdLCB2YWx1ZU5hbWUsIHR5cGVzKTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciBhc3NlcnRSYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCBtaW4sIG1heCkge1xuICAgIGFzc2VydElzKHZhbHVlLCB2YWx1ZU5hbWUsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydElzKG1pbiwgJ21pbicsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydElzKG1heCwgJ21heCcsIFsnbnVtYmVyJ10pO1xuICAgIG1heCA9IE1hdGgubWF4KG1pbiwgbWF4KTtcbiAgICBpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpIHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihiYWNrdGljayh2YWx1ZU5hbWUpICsgXCIgbXVzdCBiZSBhdCBsZWFzdCBcIiArIG1pbiArIFwiIGFuZCBhdCBtb3N0IFwiICsgbWF4ICsgXCIsIGJ1dCB3YXMgYWN0dWFsbHkgXCIgKyB2YWx1ZSk7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCBtaW4sIG1heCkge1xuICAgIGFzc2VydElzKHZhbHVlLCB2YWx1ZU5hbWUsIFsnbnVtYmVyJywgJ3VuZGVmaW5lZCddKTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJylcbiAgICAgICAgYXNzZXJ0UmFuZ2UodmFsdWUsIHZhbHVlTmFtZSwgbWluLCBtYXgpO1xufTtcbmV4cG9ydCB2YXIgYXNzZXJ0TXVsdGlwbGUgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgbXVsdGlwbGllcikge1xuICAgIGFzc2VydElzKHZhbHVlLCB2YWx1ZU5hbWUsIFsnbnVtYmVyJ10pO1xuICAgIGlmICh2YWx1ZSAlIG11bHRpcGxpZXIgIT09IDApIHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihiYWNrdGljayh2YWx1ZU5hbWUpICsgXCIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFwiICsgbXVsdGlwbGllciArIFwiLCBidXQgd2FzIGFjdHVhbGx5IFwiICsgdmFsdWUpO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIGFzc2VydEludGVnZXIgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSkge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJhY2t0aWNrKHZhbHVlTmFtZSkgKyBcIiBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCB3YXMgYWN0dWFsbHkgXCIgKyB2YWx1ZSk7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgYXNzZXJ0UG9zaXRpdmUgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSkge1xuICAgIGlmICghWzEsIDBdLmluY2x1ZGVzKE1hdGguc2lnbih2YWx1ZSkpKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYmFja3RpY2sodmFsdWVOYW1lKSArIFwiIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgb3IgMCwgYnV0IHdhcyBhY3R1YWxseSBcIiArIHZhbHVlKTtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmFsaWRhdG9ycy5qcy5tYXAiLCIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jcmVhdGVCaW5kaW5nKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7XHJcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7XHJcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcclxuICAgIHJldHVybiB2YWx1ZTtcclxufVxyXG4iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJwcmludEpTXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInByaW50SlNcIl0gPSBmYWN0b3J5KCk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovICh7XG5cbi8qKiovIFwiLi9zcmMvaW5kZXguanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvaW5kZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2Fzc19pbmRleF9zY3NzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3Nhc3MvaW5kZXguc2NzcyAqLyBcIi4vc3JjL3Nhc3MvaW5kZXguc2Nzc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2Fzc19pbmRleF9zY3NzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX3Nhc3NfaW5kZXhfc2Nzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfanNfaW5pdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9qcy9pbml0ICovIFwiLi9zcmMvanMvaW5pdC5qc1wiKTtcblxuXG52YXIgcHJpbnRKUyA9IF9qc19pbml0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLmluaXQ7XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cucHJpbnRKUyA9IHByaW50SlM7XG59XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAocHJpbnRKUyk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL2Jyb3dzZXIuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9icm93c2VyLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbnZhciBCcm93c2VyID0ge1xuICAvLyBGaXJlZm94IDEuMCtcbiAgaXNGaXJlZm94OiBmdW5jdGlvbiBpc0ZpcmVmb3goKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBJbnN0YWxsVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCc7XG4gIH0sXG4gIC8vIEludGVybmV0IEV4cGxvcmVyIDYtMTFcbiAgaXNJRTogZnVuY3Rpb24gaXNJRSgpIHtcbiAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgIT09IC0xIHx8ICEhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuICB9LFxuICAvLyBFZGdlIDIwK1xuICBpc0VkZ2U6IGZ1bmN0aW9uIGlzRWRnZSgpIHtcbiAgICByZXR1cm4gIUJyb3dzZXIuaXNJRSgpICYmICEhd2luZG93LlN0eWxlTWVkaWE7XG4gIH0sXG4gIC8vIENocm9tZSAxK1xuICBpc0Nocm9tZTogZnVuY3Rpb24gaXNDaHJvbWUoKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHdpbmRvdztcbiAgICByZXR1cm4gISFjb250ZXh0LmNocm9tZTtcbiAgfSxcbiAgLy8gQXQgbGVhc3QgU2FmYXJpIDMrOiBcIltvYmplY3QgSFRNTEVsZW1lbnRDb25zdHJ1Y3Rvcl1cIlxuICBpc1NhZmFyaTogZnVuY3Rpb24gaXNTYWZhcmkoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cuSFRNTEVsZW1lbnQpLmluZGV4T2YoJ0NvbnN0cnVjdG9yJykgPiAwIHx8IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdzYWZhcmknKSAhPT0gLTE7XG4gIH0sXG4gIC8vIElPUyBDaHJvbWVcbiAgaXNJT1NDaHJvbWU6IGZ1bmN0aW9uIGlzSU9TQ2hyb21lKCkge1xuICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY3Jpb3MnKSAhPT0gLTE7XG4gIH1cbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKEJyb3dzZXIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9mdW5jdGlvbnMuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL2Z1bmN0aW9ucy5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogYWRkV3JhcHBlciwgY2FwaXRhbGl6ZVByaW50LCBjb2xsZWN0U3R5bGVzLCBhZGRIZWFkZXIsIGNsZWFuVXAsIGlzUmF3SFRNTCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRXcmFwcGVyXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gYWRkV3JhcHBlcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiY2FwaXRhbGl6ZVByaW50XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gY2FwaXRhbGl6ZVByaW50OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJjb2xsZWN0U3R5bGVzXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gY29sbGVjdFN0eWxlczsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYWRkSGVhZGVyXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gYWRkSGVhZGVyOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJjbGVhblVwXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gY2xlYW5VcDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNSYXdIVE1MXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gaXNSYXdIVE1MOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfbW9kYWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vbW9kYWwgKi8gXCIuL3NyYy9qcy9tb2RhbC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9icm93c2VyICovIFwiLi9zcmMvanMvYnJvd3Nlci5qc1wiKTtcbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuXG5cbmZ1bmN0aW9uIGFkZFdyYXBwZXIoaHRtbERhdGEsIHBhcmFtcykge1xuICB2YXIgYm9keVN0eWxlID0gJ2ZvbnQtZmFtaWx5OicgKyBwYXJhbXMuZm9udCArICcgIWltcG9ydGFudDsgZm9udC1zaXplOiAnICsgcGFyYW1zLmZvbnRfc2l6ZSArICcgIWltcG9ydGFudDsgd2lkdGg6MTAwJTsnO1xuICByZXR1cm4gJzxkaXYgc3R5bGU9XCInICsgYm9keVN0eWxlICsgJ1wiPicgKyBodG1sRGF0YSArICc8L2Rpdj4nO1xufVxuZnVuY3Rpb24gY2FwaXRhbGl6ZVByaW50KG9iaikge1xuICByZXR1cm4gb2JqLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgb2JqLnNsaWNlKDEpO1xufVxuZnVuY3Rpb24gY29sbGVjdFN0eWxlcyhlbGVtZW50LCBwYXJhbXMpIHtcbiAgdmFyIHdpbiA9IGRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgLy8gU3RyaW5nIHZhcmlhYmxlIHRvIGhvbGQgc3R5bGluZyBmb3IgZWFjaCBlbGVtZW50XG5cbiAgdmFyIGVsZW1lbnRTdHlsZSA9ICcnOyAvLyBMb29wIG92ZXIgY29tcHV0ZWQgc3R5bGVzXG5cbiAgdmFyIHN0eWxlcyA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsICcnKTtcblxuICBmb3IgKHZhciBrZXkgPSAwOyBrZXkgPCBzdHlsZXMubGVuZ3RoOyBrZXkrKykge1xuICAgIC8vIENoZWNrIGlmIHN0eWxlIHNob3VsZCBiZSBwcm9jZXNzZWRcbiAgICBpZiAocGFyYW1zLnRhcmdldFN0eWxlcy5pbmRleE9mKCcqJykgIT09IC0xIHx8IHBhcmFtcy50YXJnZXRTdHlsZS5pbmRleE9mKHN0eWxlc1trZXldKSAhPT0gLTEgfHwgdGFyZ2V0U3R5bGVzTWF0Y2gocGFyYW1zLnRhcmdldFN0eWxlcywgc3R5bGVzW2tleV0pKSB7XG4gICAgICBpZiAoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGVzW2tleV0pKSBlbGVtZW50U3R5bGUgKz0gc3R5bGVzW2tleV0gKyAnOicgKyBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZXNba2V5XSkgKyAnOyc7XG4gICAgfVxuICB9IC8vIFByaW50IGZyaWVuZGx5IGRlZmF1bHRzIChkZXByZWNhdGVkKVxuXG5cbiAgZWxlbWVudFN0eWxlICs9ICdtYXgtd2lkdGg6ICcgKyBwYXJhbXMubWF4V2lkdGggKyAncHggIWltcG9ydGFudDsgZm9udC1zaXplOiAnICsgcGFyYW1zLmZvbnRfc2l6ZSArICcgIWltcG9ydGFudDsnO1xuICByZXR1cm4gZWxlbWVudFN0eWxlO1xufVxuXG5mdW5jdGlvbiB0YXJnZXRTdHlsZXNNYXRjaChzdHlsZXMsIHZhbHVlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKF90eXBlb2YodmFsdWUpID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5pbmRleE9mKHN0eWxlc1tpXSkgIT09IC0xKSByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYWRkSGVhZGVyKHByaW50RWxlbWVudCwgcGFyYW1zKSB7XG4gIC8vIENyZWF0ZSB0aGUgaGVhZGVyIGNvbnRhaW5lciBkaXZcbiAgdmFyIGhlYWRlckNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBDaGVjayBpZiB0aGUgaGVhZGVyIGlzIHRleHQgb3IgcmF3IGh0bWxcblxuICBpZiAoaXNSYXdIVE1MKHBhcmFtcy5oZWFkZXIpKSB7XG4gICAgaGVhZGVyQ29udGFpbmVyLmlubmVySFRNTCA9IHBhcmFtcy5oZWFkZXI7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ3JlYXRlIGhlYWRlciBlbGVtZW50XG4gICAgdmFyIGhlYWRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMScpOyAvLyBDcmVhdGUgaGVhZGVyIHRleHQgbm9kZVxuXG4gICAgdmFyIGhlYWRlck5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXJhbXMuaGVhZGVyKTsgLy8gQnVpbGQgYW5kIHN0eWxlXG5cbiAgICBoZWFkZXJFbGVtZW50LmFwcGVuZENoaWxkKGhlYWRlck5vZGUpO1xuICAgIGhlYWRlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsIHBhcmFtcy5oZWFkZXJTdHlsZSk7XG4gICAgaGVhZGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKGhlYWRlckVsZW1lbnQpO1xuICB9XG5cbiAgcHJpbnRFbGVtZW50Lmluc2VydEJlZm9yZShoZWFkZXJDb250YWluZXIsIHByaW50RWxlbWVudC5jaGlsZE5vZGVzWzBdKTtcbn1cbmZ1bmN0aW9uIGNsZWFuVXAocGFyYW1zKSB7XG4gIC8vIElmIHdlIGFyZSBzaG93aW5nIGEgZmVlZGJhY2sgbWVzc2FnZSB0byB1c2VyLCByZW1vdmUgaXRcbiAgaWYgKHBhcmFtcy5zaG93TW9kYWwpIF9tb2RhbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5jbG9zZSgpOyAvLyBDaGVjayBmb3IgYSBmaW5pc2hlZCBsb2FkaW5nIGhvb2sgZnVuY3Rpb25cblxuICBpZiAocGFyYW1zLm9uTG9hZGluZ0VuZCkgcGFyYW1zLm9uTG9hZGluZ0VuZCgpOyAvLyBJZiBwcmVsb2FkaW5nIHBkZiBmaWxlcywgY2xlYW4gYmxvYiB1cmxcblxuICBpZiAocGFyYW1zLnNob3dNb2RhbCB8fCBwYXJhbXMub25Mb2FkaW5nU3RhcnQpIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHBhcmFtcy5wcmludGFibGUpOyAvLyBSdW4gb25QcmludERpYWxvZ0Nsb3NlIGNhbGxiYWNrXG5cbiAgdmFyIGV2ZW50ID0gJ21vdXNlb3Zlcic7XG5cbiAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLmlzQ2hyb21lKCkgfHwgX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uaXNGaXJlZm94KCkpIHtcbiAgICAvLyBQcy46IEZpcmVmb3ggd2lsbCByZXF1aXJlIGFuIGV4dHJhIGNsaWNrIGluIHRoZSBkb2N1bWVudCB0byBmaXJlIHRoZSBmb2N1cyBldmVudC5cbiAgICBldmVudCA9ICdmb2N1cyc7XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBldmVudCBvbmx5IGhhcHBlbnMgb25jZS5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgcGFyYW1zLm9uUHJpbnREaWFsb2dDbG9zZSgpOyAvLyBSZW1vdmUgaWZyYW1lIGZyb20gdGhlIERPTVxuXG4gICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtcy5mcmFtZUlkKTtcblxuICAgIGlmIChpZnJhbWUpIHtcbiAgICAgIGlmcmFtZS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xufVxuZnVuY3Rpb24gaXNSYXdIVE1MKHJhdykge1xuICB2YXIgcmVnZXhIdG1sID0gbmV3IFJlZ0V4cCgnPChbQS1aYS16XVtBLVphLXowLTldKilcXFxcYltePl0qPiguKj8pPC9cXFxcMT4nKTtcbiAgcmV0dXJuIHJlZ2V4SHRtbC50ZXN0KHJhdyk7XG59XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL2h0bWwuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9odG1sLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Z1bmN0aW9ucyAqLyBcIi4vc3JjL2pzL2Z1bmN0aW9ucy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJpbnQgKi8gXCIuL3NyYy9qcy9wcmludC5qc1wiKTtcbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoe1xuICBwcmludDogZnVuY3Rpb24gcHJpbnQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gR2V0IHRoZSBET00gcHJpbnRhYmxlIGVsZW1lbnRcbiAgICB2YXIgcHJpbnRFbGVtZW50ID0gaXNIdG1sRWxlbWVudChwYXJhbXMucHJpbnRhYmxlKSA/IHBhcmFtcy5wcmludGFibGUgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJhbXMucHJpbnRhYmxlKTsgLy8gQ2hlY2sgaWYgdGhlIGVsZW1lbnQgZXhpc3RzXG5cbiAgICBpZiAoIXByaW50RWxlbWVudCkge1xuICAgICAgd2luZG93LmNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgSFRNTCBlbGVtZW50IGlkOiAnICsgcGFyYW1zLnByaW50YWJsZSk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBDbG9uZSB0aGUgdGFyZ2V0IGVsZW1lbnQgaW5jbHVkaW5nIGl0cyBjaGlsZHJlbiAoaWYgYXZhaWxhYmxlKVxuXG5cbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudCA9IGNsb25lRWxlbWVudChwcmludEVsZW1lbnQsIHBhcmFtcyk7IC8vIEFkZCBoZWFkZXJcblxuICAgIGlmIChwYXJhbXMuaGVhZGVyKSB7XG4gICAgICBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiYWRkSGVhZGVyXCJdKShwYXJhbXMucHJpbnRhYmxlRWxlbWVudCwgcGFyYW1zKTtcbiAgICB9IC8vIFByaW50IGh0bWwgZWxlbWVudCBjb250ZW50c1xuXG5cbiAgICBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uc2VuZChwYXJhbXMsIHByaW50RnJhbWUpO1xuICB9XG59KTtcblxuZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHBhcmFtcykge1xuICAvLyBDbG9uZSB0aGUgbWFpbiBub2RlIChpZiBub3QgYWxyZWFkeSBpbnNpZGUgdGhlIHJlY3Vyc2lvbiBwcm9jZXNzKVxuICB2YXIgY2xvbmUgPSBlbGVtZW50LmNsb25lTm9kZSgpOyAvLyBMb29wIG92ZXIgYW5kIHByb2Nlc3MgdGhlIGNoaWxkcmVuIGVsZW1lbnRzIC8gbm9kZXMgKGluY2x1ZGluZyB0ZXh0IG5vZGVzKVxuXG4gIHZhciBjaGlsZE5vZGVzQXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlbGVtZW50LmNoaWxkTm9kZXMpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHNraXBwaW5nIHRoZSBjdXJyZW50IGVsZW1lbnRcbiAgICBpZiAocGFyYW1zLmlnbm9yZUVsZW1lbnRzLmluZGV4T2YoY2hpbGROb2Rlc0FycmF5W2ldLmlkKSAhPT0gLTEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gQ2xvbmUgdGhlIGNoaWxkIGVsZW1lbnRcblxuXG4gICAgdmFyIGNsb25lZENoaWxkID0gY2xvbmVFbGVtZW50KGNoaWxkTm9kZXNBcnJheVtpXSwgcGFyYW1zKTsgLy8gQXR0YWNoIHRoZSBjbG9uZWQgY2hpbGQgdG8gdGhlIGNsb25lZCBwYXJlbnQgbm9kZVxuXG4gICAgY2xvbmUuYXBwZW5kQ2hpbGQoY2xvbmVkQ2hpbGQpO1xuICB9IC8vIEdldCBhbGwgc3R5bGluZyBmb3IgcHJpbnQgZWxlbWVudCAoZm9yIG5vZGVzIG9mIHR5cGUgZWxlbWVudCBvbmx5KVxuXG5cbiAgaWYgKHBhcmFtcy5zY2FuU3R5bGVzICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImNvbGxlY3RTdHlsZXNcIl0pKGVsZW1lbnQsIHBhcmFtcykpO1xuICB9IC8vIENoZWNrIGlmIHRoZSBlbGVtZW50IG5lZWRzIGFueSBzdGF0ZSBwcm9jZXNzaW5nIChjb3B5IHVzZXIgaW5wdXQgZGF0YSlcblxuXG4gIHN3aXRjaCAoZWxlbWVudC50YWdOYW1lKSB7XG4gICAgY2FzZSAnU0VMRUNUJzpcbiAgICAgIC8vIENvcHkgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHZhbHVlIHRvIGl0cyBjbG9uZVxuICAgICAgY2xvbmUudmFsdWUgPSBlbGVtZW50LnZhbHVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdDQU5WQVMnOlxuICAgICAgLy8gQ29weSB0aGUgY2FudmFzIGNvbnRlbnQgdG8gaXRzIGNsb25lXG4gICAgICBjbG9uZS5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShlbGVtZW50LCAwLCAwKTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGNsb25lO1xufVxuXG5mdW5jdGlvbiBpc0h0bWxFbGVtZW50KHByaW50YWJsZSkge1xuICAvLyBDaGVjayBpZiBlbGVtZW50IGlzIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50IG9yIGhhcyBub2RlVHlwZSA9PT0gMSAoZm9yIGVsZW1lbnRzIGluIGlmcmFtZSlcbiAgcmV0dXJuIF90eXBlb2YocHJpbnRhYmxlKSA9PT0gJ29iamVjdCcgJiYgcHJpbnRhYmxlICYmIChwcmludGFibGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBwcmludGFibGUubm9kZVR5cGUgPT09IDEpO1xufVxuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9pbWFnZS5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9pbWFnZS5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZnVuY3Rpb25zICovIFwiLi9zcmMvanMvZnVuY3Rpb25zLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9wcmludCAqLyBcIi4vc3JjL2pzL3ByaW50LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Jyb3dzZXIgKi8gXCIuL3NyYy9qcy9icm93c2VyLmpzXCIpO1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9ICh7XG4gIHByaW50OiBmdW5jdGlvbiBwcmludChwYXJhbXMsIHByaW50RnJhbWUpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhcmUgcHJpbnRpbmcgb25lIGltYWdlIG9yIG11bHRpcGxlIGltYWdlc1xuICAgIGlmIChwYXJhbXMucHJpbnRhYmxlLmNvbnN0cnVjdG9yICE9PSBBcnJheSkge1xuICAgICAgLy8gQ3JlYXRlIGFycmF5IHdpdGggb25lIGltYWdlXG4gICAgICBwYXJhbXMucHJpbnRhYmxlID0gW3BhcmFtcy5wcmludGFibGVdO1xuICAgIH0gLy8gQ3JlYXRlIHByaW50YWJsZSBlbGVtZW50IChjb250YWluZXIpXG5cblxuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IC8vIENyZWF0ZSBhbGwgaW1hZ2UgZWxlbWVudHMgYW5kIGFwcGVuZCB0aGVtIHRvIHRoZSBwcmludGFibGUgY29udGFpbmVyXG5cbiAgICBwYXJhbXMucHJpbnRhYmxlLmZvckVhY2goZnVuY3Rpb24gKHNyYykge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBpbWFnZSBlbGVtZW50XG4gICAgICB2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICBpbWcuc2V0QXR0cmlidXRlKCdzdHlsZScsIHBhcmFtcy5pbWFnZVN0eWxlKTsgLy8gU2V0IGltYWdlIHNyYyB3aXRoIHRoZSBmaWxlIHVybFxuXG4gICAgICBpbWcuc3JjID0gc3JjOyAvLyBUaGUgZm9sbG93aW5nIGJsb2NrIGlzIGZvciBGaXJlZm94LCB3aGljaCBmb3Igc29tZSByZWFzb24gcmVxdWlyZXMgdGhlIGltYWdlJ3Mgc3JjIHRvIGJlIGZ1bGx5IHF1YWxpZmllZCBpblxuICAgICAgLy8gb3JkZXIgdG8gcHJpbnQgaXRcblxuICAgICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bXCJkZWZhdWx0XCJdLmlzRmlyZWZveCgpKSB7XG4gICAgICAgIHZhciBmdWxseVF1YWxpZmllZFNyYyA9IGltZy5zcmM7XG4gICAgICAgIGltZy5zcmMgPSBmdWxseVF1YWxpZmllZFNyYztcbiAgICAgIH0gLy8gQ3JlYXRlIHRoZSBpbWFnZSB3cmFwcGVyXG5cblxuICAgICAgdmFyIGltYWdlV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBBcHBlbmQgaW1hZ2UgdG8gdGhlIHdyYXBwZXIgZWxlbWVudFxuXG4gICAgICBpbWFnZVdyYXBwZXIuYXBwZW5kQ2hpbGQoaW1nKTsgLy8gQXBwZW5kIHdyYXBwZXIgdG8gdGhlIHByaW50YWJsZSBlbGVtZW50XG5cbiAgICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50LmFwcGVuZENoaWxkKGltYWdlV3JhcHBlcik7XG4gICAgfSk7IC8vIENoZWNrIGlmIHdlIGFyZSBhZGRpbmcgYSBwcmludCBoZWFkZXJcblxuICAgIGlmIChwYXJhbXMuaGVhZGVyKSBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiYWRkSGVhZGVyXCJdKShwYXJhbXMucHJpbnRhYmxlRWxlbWVudCwgcGFyYW1zKTsgLy8gUHJpbnQgaW1hZ2VcblxuICAgIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5zZW5kKHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gIH1cbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9pbml0LmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvaW5pdC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYnJvd3NlciAqLyBcIi4vc3JjL2pzL2Jyb3dzZXIuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX21vZGFsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL21vZGFsICovIFwiLi9zcmMvanMvbW9kYWwuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3BkZl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9wZGYgKi8gXCIuL3NyYy9qcy9wZGYuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2h0bWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vaHRtbCAqLyBcIi4vc3JjL2pzL2h0bWwuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3Jhd19odG1sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3Jhdy1odG1sICovIFwiLi9zcmMvanMvcmF3LWh0bWwuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2ltYWdlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2ltYWdlICovIFwiLi9zcmMvanMvaW1hZ2UuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2pzb25fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vanNvbiAqLyBcIi4vc3JjL2pzL2pzb24uanNcIik7XG5cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5cblxuXG5cblxuXG5cbnZhciBwcmludFR5cGVzID0gWydwZGYnLCAnaHRtbCcsICdpbWFnZScsICdqc29uJywgJ3Jhdy1odG1sJ107XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHtcbiAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgcHJpbnRhYmxlOiBudWxsLFxuICAgICAgZmFsbGJhY2tQcmludGFibGU6IG51bGwsXG4gICAgICB0eXBlOiAncGRmJyxcbiAgICAgIGhlYWRlcjogbnVsbCxcbiAgICAgIGhlYWRlclN0eWxlOiAnZm9udC13ZWlnaHQ6IDMwMDsnLFxuICAgICAgbWF4V2lkdGg6IDgwMCxcbiAgICAgIHByb3BlcnRpZXM6IG51bGwsXG4gICAgICBncmlkSGVhZGVyU3R5bGU6ICdmb250LXdlaWdodDogYm9sZDsgcGFkZGluZzogNXB4OyBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOycsXG4gICAgICBncmlkU3R5bGU6ICdib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7IG1hcmdpbi1ib3R0b206IC0xcHg7JyxcbiAgICAgIHNob3dNb2RhbDogZmFsc2UsXG4gICAgICBvbkVycm9yOiBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZGluZ1N0YXJ0OiBudWxsLFxuICAgICAgb25Mb2FkaW5nRW5kOiBudWxsLFxuICAgICAgb25QcmludERpYWxvZ0Nsb3NlOiBmdW5jdGlvbiBvblByaW50RGlhbG9nQ2xvc2UoKSB7fSxcbiAgICAgIG9uSW5jb21wYXRpYmxlQnJvd3NlcjogZnVuY3Rpb24gb25JbmNvbXBhdGlibGVCcm93c2VyKCkge30sXG4gICAgICBtb2RhbE1lc3NhZ2U6ICdSZXRyaWV2aW5nIERvY3VtZW50Li4uJyxcbiAgICAgIGZyYW1lSWQ6ICdwcmludEpTJyxcbiAgICAgIHByaW50YWJsZUVsZW1lbnQ6IG51bGwsXG4gICAgICBkb2N1bWVudFRpdGxlOiAnRG9jdW1lbnQnLFxuICAgICAgdGFyZ2V0U3R5bGU6IFsnY2xlYXInLCAnZGlzcGxheScsICd3aWR0aCcsICdtaW4td2lkdGgnLCAnaGVpZ2h0JywgJ21pbi1oZWlnaHQnLCAnbWF4LWhlaWdodCddLFxuICAgICAgdGFyZ2V0U3R5bGVzOiBbJ2JvcmRlcicsICdib3gnLCAnYnJlYWsnLCAndGV4dC1kZWNvcmF0aW9uJ10sXG4gICAgICBpZ25vcmVFbGVtZW50czogW10sXG4gICAgICByZXBlYXRUYWJsZUhlYWRlcjogdHJ1ZSxcbiAgICAgIGNzczogbnVsbCxcbiAgICAgIHN0eWxlOiBudWxsLFxuICAgICAgc2NhblN0eWxlczogdHJ1ZSxcbiAgICAgIGJhc2U2NDogZmFsc2UsXG4gICAgICAvLyBEZXByZWNhdGVkXG4gICAgICBvblBkZk9wZW46IG51bGwsXG4gICAgICBmb250OiAnVGltZXNOZXdSb21hbicsXG4gICAgICBmb250X3NpemU6ICcxMnB0JyxcbiAgICAgIGhvbm9yTWFyZ2luUGFkZGluZzogdHJ1ZSxcbiAgICAgIGhvbm9yQ29sb3I6IGZhbHNlLFxuICAgICAgaW1hZ2VTdHlsZTogJ21heC13aWR0aDogMTAwJTsnXG4gICAgfTsgLy8gQ2hlY2sgaWYgYSBwcmludGFibGUgZG9jdW1lbnQgb3Igb2JqZWN0IHdhcyBzdXBwbGllZFxuXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHNbMF07XG5cbiAgICBpZiAoYXJncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaW50SlMgZXhwZWN0cyBhdCBsZWFzdCAxIGF0dHJpYnV0ZS4nKTtcbiAgICB9IC8vIFByb2Nlc3MgcGFyYW1ldGVyc1xuXG5cbiAgICBzd2l0Y2ggKF90eXBlb2YoYXJncykpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHBhcmFtcy5wcmludGFibGUgPSBlbmNvZGVVUkkoYXJncyk7XG4gICAgICAgIHBhcmFtcy5mYWxsYmFja1ByaW50YWJsZSA9IHBhcmFtcy5wcmludGFibGU7XG4gICAgICAgIHBhcmFtcy50eXBlID0gYXJndW1lbnRzWzFdIHx8IHBhcmFtcy50eXBlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcGFyYW1zLnByaW50YWJsZSA9IGFyZ3MucHJpbnRhYmxlO1xuICAgICAgICBwYXJhbXMuZmFsbGJhY2tQcmludGFibGUgPSB0eXBlb2YgYXJncy5mYWxsYmFja1ByaW50YWJsZSAhPT0gJ3VuZGVmaW5lZCcgPyBhcmdzLmZhbGxiYWNrUHJpbnRhYmxlIDogcGFyYW1zLnByaW50YWJsZTtcbiAgICAgICAgcGFyYW1zLmZhbGxiYWNrUHJpbnRhYmxlID0gcGFyYW1zLmJhc2U2NCA/IFwiZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LFwiLmNvbmNhdChwYXJhbXMuZmFsbGJhY2tQcmludGFibGUpIDogcGFyYW1zLmZhbGxiYWNrUHJpbnRhYmxlO1xuXG4gICAgICAgIGZvciAodmFyIGsgaW4gcGFyYW1zKSB7XG4gICAgICAgICAgaWYgKGsgPT09ICdwcmludGFibGUnIHx8IGsgPT09ICdmYWxsYmFja1ByaW50YWJsZScpIGNvbnRpbnVlO1xuICAgICAgICAgIHBhcmFtc1trXSA9IHR5cGVvZiBhcmdzW2tdICE9PSAndW5kZWZpbmVkJyA/IGFyZ3Nba10gOiBwYXJhbXNba107XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGFyZ3VtZW50IHR5cGUhIEV4cGVjdGVkIFwic3RyaW5nXCIgb3IgXCJvYmplY3RcIiwgZ290ICcgKyBfdHlwZW9mKGFyZ3MpKTtcbiAgICB9IC8vIFZhbGlkYXRlIHByaW50YWJsZVxuXG5cbiAgICBpZiAoIXBhcmFtcy5wcmludGFibGUpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcmludGFibGUgaW5mb3JtYXRpb24uJyk7IC8vIFZhbGlkYXRlIHR5cGVcblxuICAgIGlmICghcGFyYW1zLnR5cGUgfHwgdHlwZW9mIHBhcmFtcy50eXBlICE9PSAnc3RyaW5nJyB8fCBwcmludFR5cGVzLmluZGV4T2YocGFyYW1zLnR5cGUudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHJpbnQgdHlwZS4gQXZhaWxhYmxlIHR5cGVzIGFyZTogcGRmLCBodG1sLCBpbWFnZSBhbmQganNvbi4nKTtcbiAgICB9IC8vIENoZWNrIGlmIHdlIGFyZSBzaG93aW5nIGEgZmVlZGJhY2sgbWVzc2FnZSB0byB0aGUgdXNlciAodXNlZnVsIGZvciBsYXJnZSBmaWxlcylcblxuXG4gICAgaWYgKHBhcmFtcy5zaG93TW9kYWwpIF9tb2RhbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5zaG93KHBhcmFtcyk7IC8vIENoZWNrIGZvciBhIHByaW50IHN0YXJ0IGhvb2sgZnVuY3Rpb25cblxuICAgIGlmIChwYXJhbXMub25Mb2FkaW5nU3RhcnQpIHBhcmFtcy5vbkxvYWRpbmdTdGFydCgpOyAvLyBUbyBwcmV2ZW50IGR1cGxpY2F0aW9uIGFuZCBpc3N1ZXMsIHJlbW92ZSBhbnkgdXNlZCBwcmludEZyYW1lIGZyb20gdGhlIERPTVxuXG4gICAgdmFyIHVzZWRGcmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtcy5mcmFtZUlkKTtcbiAgICBpZiAodXNlZEZyYW1lKSB1c2VkRnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh1c2VkRnJhbWUpOyAvLyBDcmVhdGUgYSBuZXcgaWZyYW1lIGZvciB0aGUgcHJpbnQgam9iXG5cbiAgICB2YXIgcHJpbnRGcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuXG4gICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzRmlyZWZveCgpKSB7XG4gICAgICAvLyBTZXQgdGhlIGlmcmFtZSB0byBiZSBpcyB2aXNpYmxlIG9uIHRoZSBwYWdlIChndWFyYW50ZWVkIGJ5IGZpeGVkIHBvc2l0aW9uKSBidXQgaGlkZGVuIHVzaW5nIG9wYWNpdHkgMCwgYmVjYXVzZVxuICAgICAgLy8gdGhpcyB3b3JrcyBpbiBGaXJlZm94LiBUaGUgaGVpZ2h0IG5lZWRzIHRvIGJlIHN1ZmZpY2llbnQgZm9yIHNvbWUgcGFydCBvZiB0aGUgZG9jdW1lbnQgb3RoZXIgdGhhbiB0aGUgUERGXG4gICAgICAvLyB2aWV3ZXIncyB0b29sYmFyIHRvIGJlIHZpc2libGUgaW4gdGhlIHBhZ2VcbiAgICAgIHByaW50RnJhbWUuc2V0QXR0cmlidXRlKCdzdHlsZScsICd3aWR0aDogMXB4OyBoZWlnaHQ6IDEwMHB4OyBwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IDA7IHRvcDogMDsgb3BhY2l0eTogMDsgYm9yZGVyLXdpZHRoOiAwOyBtYXJnaW46IDA7IHBhZGRpbmc6IDAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGlkZSB0aGUgaWZyYW1lIGluIG90aGVyIGJyb3dzZXJzXG4gICAgICBwcmludEZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAndmlzaWJpbGl0eTogaGlkZGVuOyBoZWlnaHQ6IDA7IHdpZHRoOiAwOyBwb3NpdGlvbjogYWJzb2x1dGU7IGJvcmRlcjogMCcpO1xuICAgIH0gLy8gU2V0IGlmcmFtZSBlbGVtZW50IGlkXG5cblxuICAgIHByaW50RnJhbWUuc2V0QXR0cmlidXRlKCdpZCcsIHBhcmFtcy5mcmFtZUlkKTsgLy8gRm9yIG5vbiBwZGYgcHJpbnRpbmcsIHBhc3MgYW4gaHRtbCBkb2N1bWVudCBzdHJpbmcgdG8gc3JjZG9jIChmb3JjZSBvbmxvYWQgY2FsbGJhY2spXG5cbiAgICBpZiAocGFyYW1zLnR5cGUgIT09ICdwZGYnKSB7XG4gICAgICBwcmludEZyYW1lLnNyY2RvYyA9ICc8aHRtbD48aGVhZD48dGl0bGU+JyArIHBhcmFtcy5kb2N1bWVudFRpdGxlICsgJzwvdGl0bGU+JzsgLy8gQXR0YWNoIGNzcyBmaWxlc1xuXG4gICAgICBpZiAocGFyYW1zLmNzcykge1xuICAgICAgICAvLyBBZGQgc3VwcG9ydCBmb3Igc2luZ2xlIGZpbGVcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5jc3MpKSBwYXJhbXMuY3NzID0gW3BhcmFtcy5jc3NdOyAvLyBDcmVhdGUgbGluayB0YWdzIGZvciBlYWNoIGNzcyBmaWxlXG5cbiAgICAgICAgcGFyYW1zLmNzcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgcHJpbnRGcmFtZS5zcmNkb2MgKz0gJzxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiJyArIGZpbGUgKyAnXCI+JztcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHByaW50RnJhbWUuc3JjZG9jICs9ICc8L2hlYWQ+PGJvZHk+PC9ib2R5PjwvaHRtbD4nO1xuICAgIH0gLy8gQ2hlY2sgcHJpbnRhYmxlIHR5cGVcblxuXG4gICAgc3dpdGNoIChwYXJhbXMudHlwZSkge1xuICAgICAgY2FzZSAncGRmJzpcbiAgICAgICAgLy8gQ2hlY2sgYnJvd3NlciBzdXBwb3J0IGZvciBwZGYgYW5kIGlmIG5vdCBzdXBwb3J0ZWQgd2Ugd2lsbCBqdXN0IG9wZW4gdGhlIHBkZiBmaWxlIGluc3RlYWRcbiAgICAgICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzSUUoKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oJ1ByaW50LmpzIGRvZXNuXFwndCBzdXBwb3J0IFBERiBwcmludGluZyBpbiBJbnRlcm5ldCBFeHBsb3Jlci4nKTtcbiAgICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3cub3BlbihwYXJhbXMuZmFsbGJhY2tQcmludGFibGUsICdfYmxhbmsnKTtcbiAgICAgICAgICAgIHdpbi5mb2N1cygpO1xuICAgICAgICAgICAgcGFyYW1zLm9uSW5jb21wYXRpYmxlQnJvd3NlcigpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBwYXJhbXMub25FcnJvcihlcnJvcik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBsb2FkaW5nIG1vZGFsIG9wZW5lZFxuICAgICAgICAgICAgaWYgKHBhcmFtcy5zaG93TW9kYWwpIF9tb2RhbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5jbG9zZSgpO1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5vbkxvYWRpbmdFbmQpIHBhcmFtcy5vbkxvYWRpbmdFbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3BkZl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fW1wiZGVmYXVsdFwiXS5wcmludChwYXJhbXMsIHByaW50RnJhbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgX2ltYWdlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X19bXCJkZWZhdWx0XCJdLnByaW50KHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgX2h0bWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1tcImRlZmF1bHRcIl0ucHJpbnQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3Jhdy1odG1sJzpcbiAgICAgICAgX3Jhd19odG1sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bXCJkZWZhdWx0XCJdLnByaW50KHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgX2pzb25fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfX1tcImRlZmF1bHRcIl0ucHJpbnQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvanNvbi5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL2pzb24uanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZnVuY3Rpb25zICovIFwiLi9zcmMvanMvZnVuY3Rpb25zLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9wcmludCAqLyBcIi4vc3JjL2pzL3ByaW50LmpzXCIpO1xuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9ICh7XG4gIHByaW50OiBmdW5jdGlvbiBwcmludChwYXJhbXMsIHByaW50RnJhbWUpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSByZWNlaXZlZCBwcm9wZXIgZGF0YVxuICAgIGlmIChfdHlwZW9mKHBhcmFtcy5wcmludGFibGUpICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGphdmFzY3JpcHQgZGF0YSBvYmplY3QgKEpTT04pLicpO1xuICAgIH0gLy8gVmFsaWRhdGUgcmVwZWF0VGFibGVIZWFkZXJcblxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucmVwZWF0VGFibGVIZWFkZXIgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciByZXBlYXRUYWJsZUhlYWRlciBhdHRyaWJ1dGUgKEpTT04pLicpO1xuICAgIH0gLy8gVmFsaWRhdGUgcHJvcGVydGllc1xuXG5cbiAgICBpZiAoIXBhcmFtcy5wcm9wZXJ0aWVzIHx8ICFBcnJheS5pc0FycmF5KHBhcmFtcy5wcm9wZXJ0aWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByb3BlcnRpZXMgYXJyYXkgZm9yIHlvdXIgSlNPTiBkYXRhLicpO1xuICAgIH0gLy8gV2Ugd2lsbCBmb3JtYXQgdGhlIHByb3BlcnR5IG9iamVjdHMgdG8ga2VlcCB0aGUgSlNPTiBhcGkgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHJlbGVhc2VzXG5cblxuICAgIHBhcmFtcy5wcm9wZXJ0aWVzID0gcGFyYW1zLnByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmllbGQ6IF90eXBlb2YocHJvcGVydHkpID09PSAnb2JqZWN0JyA/IHByb3BlcnR5LmZpZWxkIDogcHJvcGVydHksXG4gICAgICAgIGRpc3BsYXlOYW1lOiBfdHlwZW9mKHByb3BlcnR5KSA9PT0gJ29iamVjdCcgPyBwcm9wZXJ0eS5kaXNwbGF5TmFtZSA6IHByb3BlcnR5LFxuICAgICAgICBjb2x1bW5TaXplOiBfdHlwZW9mKHByb3BlcnR5KSA9PT0gJ29iamVjdCcgJiYgcHJvcGVydHkuY29sdW1uU2l6ZSA/IHByb3BlcnR5LmNvbHVtblNpemUgKyAnOycgOiAxMDAgLyBwYXJhbXMucHJvcGVydGllcy5sZW5ndGggKyAnJTsnXG4gICAgICB9O1xuICAgIH0pOyAvLyBDcmVhdGUgYSBwcmludCBjb250YWluZXIgZWxlbWVudFxuXG4gICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgLy8gQ2hlY2sgaWYgd2UgYXJlIGFkZGluZyBhIHByaW50IGhlYWRlclxuXG4gICAgaWYgKHBhcmFtcy5oZWFkZXIpIHtcbiAgICAgIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJhZGRIZWFkZXJcIl0pKHBhcmFtcy5wcmludGFibGVFbGVtZW50LCBwYXJhbXMpO1xuICAgIH0gLy8gQnVpbGQgdGhlIHByaW50YWJsZSBodG1sIGRhdGFcblxuXG4gICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQuaW5uZXJIVE1MICs9IGpzb25Ub0hUTUwocGFyYW1zKTsgLy8gUHJpbnQgdGhlIGpzb24gZGF0YVxuXG4gICAgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLnNlbmQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGpzb25Ub0hUTUwocGFyYW1zKSB7XG4gIC8vIEdldCB0aGUgcm93IGFuZCBjb2x1bW4gZGF0YVxuICB2YXIgZGF0YSA9IHBhcmFtcy5wcmludGFibGU7XG4gIHZhciBwcm9wZXJ0aWVzID0gcGFyYW1zLnByb3BlcnRpZXM7IC8vIENyZWF0ZSBhIGh0bWwgdGFibGVcblxuICB2YXIgaHRtbERhdGEgPSAnPHRhYmxlIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgd2lkdGg6IDEwMCU7XCI+JzsgLy8gQ2hlY2sgaWYgdGhlIGhlYWRlciBzaG91bGQgYmUgcmVwZWF0ZWRcblxuICBpZiAocGFyYW1zLnJlcGVhdFRhYmxlSGVhZGVyKSB7XG4gICAgaHRtbERhdGEgKz0gJzx0aGVhZD4nO1xuICB9IC8vIEFkZCB0aGUgdGFibGUgaGVhZGVyIHJvd1xuXG5cbiAgaHRtbERhdGEgKz0gJzx0cj4nOyAvLyBBZGQgdGhlIHRhYmxlIGhlYWRlciBjb2x1bW5zXG5cbiAgZm9yICh2YXIgYSA9IDA7IGEgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgYSsrKSB7XG4gICAgaHRtbERhdGEgKz0gJzx0aCBzdHlsZT1cIndpZHRoOicgKyBwcm9wZXJ0aWVzW2FdLmNvbHVtblNpemUgKyAnOycgKyBwYXJhbXMuZ3JpZEhlYWRlclN0eWxlICsgJ1wiPicgKyBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiY2FwaXRhbGl6ZVByaW50XCJdKShwcm9wZXJ0aWVzW2FdLmRpc3BsYXlOYW1lKSArICc8L3RoPic7XG4gIH0gLy8gQWRkIHRoZSBjbG9zaW5nIHRhZyBmb3IgdGhlIHRhYmxlIGhlYWRlciByb3dcblxuXG4gIGh0bWxEYXRhICs9ICc8L3RyPic7IC8vIElmIHRoZSB0YWJsZSBoZWFkZXIgaXMgbWFya2VkIGFzIHJlcGVhdGVkLCBhZGQgdGhlIGNsb3NpbmcgdGFnXG5cbiAgaWYgKHBhcmFtcy5yZXBlYXRUYWJsZUhlYWRlcikge1xuICAgIGh0bWxEYXRhICs9ICc8L3RoZWFkPic7XG4gIH0gLy8gQ3JlYXRlIHRoZSB0YWJsZSBib2R5XG5cblxuICBodG1sRGF0YSArPSAnPHRib2R5Pic7IC8vIEFkZCB0aGUgdGFibGUgZGF0YSByb3dzXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gQWRkIHRoZSByb3cgc3RhcnRpbmcgdGFnXG4gICAgaHRtbERhdGEgKz0gJzx0cj4nOyAvLyBQcmludCBzZWxlY3RlZCBwcm9wZXJ0aWVzIG9ubHlcblxuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgcHJvcGVydGllcy5sZW5ndGg7IG4rKykge1xuICAgICAgdmFyIHN0cmluZ0RhdGEgPSBkYXRhW2ldOyAvLyBTdXBwb3J0IG5lc3RlZCBvYmplY3RzXG5cbiAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbbl0uZmllbGQuc3BsaXQoJy4nKTtcblxuICAgICAgaWYgKHByb3BlcnR5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBwcm9wZXJ0eS5sZW5ndGg7IHArKykge1xuICAgICAgICAgIHN0cmluZ0RhdGEgPSBzdHJpbmdEYXRhW3Byb3BlcnR5W3BdXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyaW5nRGF0YSA9IHN0cmluZ0RhdGFbcHJvcGVydGllc1tuXS5maWVsZF07XG4gICAgICB9IC8vIEFkZCB0aGUgcm93IGNvbnRlbnRzIGFuZCBzdHlsZXNcblxuXG4gICAgICBodG1sRGF0YSArPSAnPHRkIHN0eWxlPVwid2lkdGg6JyArIHByb3BlcnRpZXNbbl0uY29sdW1uU2l6ZSArIHBhcmFtcy5ncmlkU3R5bGUgKyAnXCI+JyArIHN0cmluZ0RhdGEgKyAnPC90ZD4nO1xuICAgIH0gLy8gQWRkIHRoZSByb3cgY2xvc2luZyB0YWdcblxuXG4gICAgaHRtbERhdGEgKz0gJzwvdHI+JztcbiAgfSAvLyBBZGQgdGhlIHRhYmxlIGFuZCBib2R5IGNsb3NpbmcgdGFnc1xuXG5cbiAgaHRtbERhdGEgKz0gJzwvdGJvZHk+PC90YWJsZT4nO1xuICByZXR1cm4gaHRtbERhdGE7XG59XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL21vZGFsLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL21vZGFsLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG52YXIgTW9kYWwgPSB7XG4gIHNob3c6IGZ1bmN0aW9uIHNob3cocGFyYW1zKSB7XG4gICAgLy8gQnVpbGQgbW9kYWxcbiAgICB2YXIgbW9kYWxTdHlsZSA9ICdmb250LWZhbWlseTpzYW5zLXNlcmlmOyAnICsgJ2Rpc3BsYXk6dGFibGU7ICcgKyAndGV4dC1hbGlnbjpjZW50ZXI7ICcgKyAnZm9udC13ZWlnaHQ6MzAwOyAnICsgJ2ZvbnQtc2l6ZTozMHB4OyAnICsgJ2xlZnQ6MDsgdG9wOjA7JyArICdwb3NpdGlvbjpmaXhlZDsgJyArICd6LWluZGV4OiA5OTkwOycgKyAnY29sb3I6ICMwNDYwQjU7ICcgKyAnd2lkdGg6IDEwMCU7ICcgKyAnaGVpZ2h0OiAxMDAlOyAnICsgJ2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSk7JyArICd0cmFuc2l0aW9uOiBvcGFjaXR5IC4zcyBlYXNlOyc7IC8vIENyZWF0ZSB3cmFwcGVyXG5cbiAgICB2YXIgcHJpbnRNb2RhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHByaW50TW9kYWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIG1vZGFsU3R5bGUpO1xuICAgIHByaW50TW9kYWwuc2V0QXR0cmlidXRlKCdpZCcsICdwcmludEpTLU1vZGFsJyk7IC8vIENyZWF0ZSBjb250ZW50IGRpdlxuXG4gICAgdmFyIGNvbnRlbnREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50RGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTp0YWJsZS1jZWxsOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IHBhZGRpbmctYm90dG9tOjEwMHB4OycpOyAvLyBBZGQgY2xvc2UgYnV0dG9uIChyZXF1aXJlcyBwcmludC5jc3MpXG5cbiAgICB2YXIgY2xvc2VCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjbG9zZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3ByaW50Q2xvc2UnKTtcbiAgICBjbG9zZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3ByaW50Q2xvc2UnKTtcbiAgICBjb250ZW50RGl2LmFwcGVuZENoaWxkKGNsb3NlQnV0dG9uKTsgLy8gQWRkIHNwaW5uZXIgKHJlcXVpcmVzIHByaW50LmNzcylcblxuICAgIHZhciBzcGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHNwaW5uZXIuc2V0QXR0cmlidXRlKCdjbGFzcycsICdwcmludFNwaW5uZXInKTtcbiAgICBjb250ZW50RGl2LmFwcGVuZENoaWxkKHNwaW5uZXIpOyAvLyBBZGQgbWVzc2FnZVxuXG4gICAgdmFyIG1lc3NhZ2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFyYW1zLm1vZGFsTWVzc2FnZSk7XG4gICAgY29udGVudERpdi5hcHBlbmRDaGlsZChtZXNzYWdlTm9kZSk7IC8vIEFkZCBjb250ZW50RGl2IHRvIHByaW50TW9kYWxcblxuICAgIHByaW50TW9kYWwuYXBwZW5kQ2hpbGQoY29udGVudERpdik7IC8vIEFwcGVuZCBwcmludCBtb2RhbCBlbGVtZW50IHRvIGRvY3VtZW50IGJvZHlcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0uYXBwZW5kQ2hpbGQocHJpbnRNb2RhbCk7IC8vIEFkZCBldmVudCBsaXN0ZW5lciB0byBjbG9zZSBidXR0b25cblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmludENsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICBNb2RhbC5jbG9zZSgpO1xuICAgIH0pO1xuICB9LFxuICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgdmFyIHByaW50TW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpbnRKUy1Nb2RhbCcpO1xuXG4gICAgaWYgKHByaW50TW9kYWwpIHtcbiAgICAgIHByaW50TW9kYWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwcmludE1vZGFsKTtcbiAgICB9XG4gIH1cbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKE1vZGFsKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvcGRmLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9wZGYuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3ByaW50ICovIFwiLi9zcmMvanMvcHJpbnQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9mdW5jdGlvbnMgKi8gXCIuL3NyYy9qcy9mdW5jdGlvbnMuanNcIik7XG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9ICh7XG4gIHByaW50OiBmdW5jdGlvbiBwcmludChwYXJhbXMsIHByaW50RnJhbWUpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGJhc2U2NCBkYXRhXG4gICAgaWYgKHBhcmFtcy5iYXNlNjQpIHtcbiAgICAgIHZhciBieXRlc0FycmF5ID0gVWludDhBcnJheS5mcm9tKGF0b2IocGFyYW1zLnByaW50YWJsZSksIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjLmNoYXJDb2RlQXQoMCk7XG4gICAgICB9KTtcbiAgICAgIGNyZWF0ZUJsb2JBbmRQcmludChwYXJhbXMsIHByaW50RnJhbWUsIGJ5dGVzQXJyYXkpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRm9ybWF0IHBkZiB1cmxcblxuXG4gICAgcGFyYW1zLnByaW50YWJsZSA9IC9eKGJsb2J8aHR0cHxcXC9cXC8pL2kudGVzdChwYXJhbXMucHJpbnRhYmxlKSA/IHBhcmFtcy5wcmludGFibGUgOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgKHBhcmFtcy5wcmludGFibGUuY2hhckF0KDApICE9PSAnLycgPyAnLycgKyBwYXJhbXMucHJpbnRhYmxlIDogcGFyYW1zLnByaW50YWJsZSk7IC8vIEdldCB0aGUgZmlsZSB0aHJvdWdoIGEgaHR0cCByZXF1ZXN0IChQcmVsb2FkKVxuXG4gICAgdmFyIHJlcSA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcbiAgICByZXEucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICByZXEuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiY2xlYW5VcFwiXSkocGFyYW1zKTtcbiAgICAgIHBhcmFtcy5vbkVycm9yKHJlcS5zdGF0dXNUZXh0LCByZXEpOyAvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGEgcGRmIGRvY3VtZW50IGF2YWlsYWJsZSwgd2Ugd2lsbCBzdG9wIHRoZSBwcmludCBqb2JcbiAgICB9KTtcbiAgICByZXEuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIENoZWNrIGZvciBlcnJvcnNcbiAgICAgIGlmIChbMjAwLCAyMDFdLmluZGV4T2YocmVxLnN0YXR1cykgPT09IC0xKSB7XG4gICAgICAgIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJjbGVhblVwXCJdKShwYXJhbXMpO1xuICAgICAgICBwYXJhbXMub25FcnJvcihyZXEuc3RhdHVzVGV4dCwgcmVxKTsgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHBkZiBkb2N1bWVudCBhdmFpbGFibGUsIHdlIHdpbGwgc3RvcCB0aGUgcHJpbnQgam9iXG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBQcmludCByZXF1ZXN0ZWQgZG9jdW1lbnRcblxuXG4gICAgICBjcmVhdGVCbG9iQW5kUHJpbnQocGFyYW1zLCBwcmludEZyYW1lLCByZXEucmVzcG9uc2UpO1xuICAgIH0pO1xuICAgIHJlcS5vcGVuKCdHRVQnLCBwYXJhbXMucHJpbnRhYmxlLCB0cnVlKTtcbiAgICByZXEuc2VuZCgpO1xuICB9XG59KTtcblxuZnVuY3Rpb24gY3JlYXRlQmxvYkFuZFByaW50KHBhcmFtcywgcHJpbnRGcmFtZSwgZGF0YSkge1xuICAvLyBQYXNzIHJlc3BvbnNlIG9yIGJhc2U2NCBkYXRhIHRvIGEgYmxvYiBhbmQgY3JlYXRlIGEgbG9jYWwgb2JqZWN0IHVybFxuICB2YXIgbG9jYWxQZGYgPSBuZXcgd2luZG93LkJsb2IoW2RhdGFdLCB7XG4gICAgdHlwZTogJ2FwcGxpY2F0aW9uL3BkZidcbiAgfSk7XG4gIGxvY2FsUGRmID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobG9jYWxQZGYpOyAvLyBTZXQgaWZyYW1lIHNyYyB3aXRoIHBkZiBkb2N1bWVudCB1cmxcblxuICBwcmludEZyYW1lLnNldEF0dHJpYnV0ZSgnc3JjJywgbG9jYWxQZGYpO1xuICBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uc2VuZChwYXJhbXMsIHByaW50RnJhbWUpO1xufVxuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9wcmludC5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9wcmludC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Jyb3dzZXIgKi8gXCIuL3NyYy9qcy9icm93c2VyLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZnVuY3Rpb25zICovIFwiLi9zcmMvanMvZnVuY3Rpb25zLmpzXCIpO1xuXG5cbnZhciBQcmludCA9IHtcbiAgc2VuZDogZnVuY3Rpb24gc2VuZChwYXJhbXMsIHByaW50RnJhbWUpIHtcbiAgICAvLyBBcHBlbmQgaWZyYW1lIGVsZW1lbnQgdG8gZG9jdW1lbnQgYm9keVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0uYXBwZW5kQ2hpbGQocHJpbnRGcmFtZSk7IC8vIEdldCBpZnJhbWUgZWxlbWVudFxuXG4gICAgdmFyIGlmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJhbXMuZnJhbWVJZCk7IC8vIFdhaXQgZm9yIGlmcmFtZSB0byBsb2FkIGFsbCBjb250ZW50XG5cbiAgICBpZnJhbWVFbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ3BkZicpIHtcbiAgICAgICAgLy8gQWRkIGEgZGVsYXkgZm9yIEZpcmVmb3guIEluIG15IHRlc3RzLCAxMDAwbXMgd2FzIHN1ZmZpY2llbnQgYnV0IDEwMG1zIHdhcyBub3RcbiAgICAgICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzRmlyZWZveCgpKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcGVyZm9ybVByaW50KGlmcmFtZUVsZW1lbnQsIHBhcmFtcyk7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVyZm9ybVByaW50KGlmcmFtZUVsZW1lbnQsIHBhcmFtcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIEdldCBpZnJhbWUgZWxlbWVudCBkb2N1bWVudFxuXG5cbiAgICAgIHZhciBwcmludERvY3VtZW50ID0gaWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93IHx8IGlmcmFtZUVsZW1lbnQuY29udGVudERvY3VtZW50O1xuICAgICAgaWYgKHByaW50RG9jdW1lbnQuZG9jdW1lbnQpIHByaW50RG9jdW1lbnQgPSBwcmludERvY3VtZW50LmRvY3VtZW50OyAvLyBBcHBlbmQgcHJpbnRhYmxlIGVsZW1lbnQgdG8gdGhlIGlmcmFtZSBib2R5XG5cbiAgICAgIHByaW50RG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwYXJhbXMucHJpbnRhYmxlRWxlbWVudCk7IC8vIEFkZCBjdXN0b20gc3R5bGVcblxuICAgICAgaWYgKHBhcmFtcy50eXBlICE9PSAncGRmJyAmJiBwYXJhbXMuc3R5bGUpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHN0eWxlIGVsZW1lbnRcbiAgICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gcGFyYW1zLnN0eWxlOyAvLyBBcHBlbmQgc3R5bGUgZWxlbWVudCB0byBpZnJhbWUncyBoZWFkXG5cbiAgICAgICAgcHJpbnREb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgIH0gLy8gSWYgcHJpbnRpbmcgaW1hZ2VzLCB3YWl0IGZvciB0aGVtIHRvIGxvYWQgaW5zaWRlIHRoZSBpZnJhbWVcblxuXG4gICAgICB2YXIgaW1hZ2VzID0gcHJpbnREb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XG5cbiAgICAgIGlmIChpbWFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2FkSWZyYW1lSW1hZ2VzKEFycmF5LmZyb20oaW1hZ2VzKSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcmZvcm1QcmludChpZnJhbWVFbGVtZW50LCBwYXJhbXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlcmZvcm1QcmludChpZnJhbWVFbGVtZW50LCBwYXJhbXMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHBlcmZvcm1QcmludChpZnJhbWVFbGVtZW50LCBwYXJhbXMpIHtcbiAgdHJ5IHtcbiAgICBpZnJhbWVFbGVtZW50LmZvY3VzKCk7IC8vIElmIEVkZ2Ugb3IgSUUsIHRyeSBjYXRjaCB3aXRoIGV4ZWNDb21tYW5kXG5cbiAgICBpZiAoX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uaXNFZGdlKCkgfHwgX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uaXNJRSgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ3ByaW50JywgZmFsc2UsIG51bGwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cucHJpbnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXIgYnJvd3NlcnNcbiAgICAgIGlmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5wcmludCgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwYXJhbXMub25FcnJvcihlcnJvcik7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzRmlyZWZveCgpKSB7XG4gICAgICAvLyBNb3ZlIHRoZSBpZnJhbWUgZWxlbWVudCBvZmYtc2NyZWVuIGFuZCBtYWtlIGl0IGludmlzaWJsZVxuICAgICAgaWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICBpZnJhbWVFbGVtZW50LnN0eWxlLmxlZnQgPSAnLTFweCc7XG4gICAgfVxuXG4gICAgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImNsZWFuVXBcIl0pKHBhcmFtcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9hZElmcmFtZUltYWdlcyhpbWFnZXMpIHtcbiAgdmFyIHByb21pc2VzID0gaW1hZ2VzLm1hcChmdW5jdGlvbiAoaW1hZ2UpIHtcbiAgICBpZiAoaW1hZ2Uuc3JjICYmIGltYWdlLnNyYyAhPT0gd2luZG93LmxvY2F0aW9uLmhyZWYpIHtcbiAgICAgIHJldHVybiBsb2FkSWZyYW1lSW1hZ2UoaW1hZ2UpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59XG5cbmZ1bmN0aW9uIGxvYWRJZnJhbWVJbWFnZShpbWFnZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICB2YXIgcG9sbEltYWdlID0gZnVuY3Rpb24gcG9sbEltYWdlKCkge1xuICAgICAgIWltYWdlIHx8IHR5cGVvZiBpbWFnZS5uYXR1cmFsV2lkdGggPT09ICd1bmRlZmluZWQnIHx8IGltYWdlLm5hdHVyYWxXaWR0aCA9PT0gMCB8fCAhaW1hZ2UuY29tcGxldGUgPyBzZXRUaW1lb3V0KHBvbGxJbWFnZSwgNTAwKSA6IHJlc29sdmUoKTtcbiAgICB9O1xuXG4gICAgcG9sbEltYWdlKCk7XG4gIH0pO1xufVxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKFByaW50KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvcmF3LWh0bWwuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvcmF3LWh0bWwuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJpbnQgKi8gXCIuL3NyYy9qcy9wcmludC5qc1wiKTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9ICh7XG4gIHByaW50OiBmdW5jdGlvbiBwcmludChwYXJhbXMsIHByaW50RnJhbWUpIHtcbiAgICAvLyBDcmVhdGUgcHJpbnRhYmxlIGVsZW1lbnQgKGNvbnRhaW5lcilcbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6MTAwJScpOyAvLyBTZXQgb3VyIHJhdyBodG1sIGFzIHRoZSBwcmludGFibGUgZWxlbWVudCBpbm5lciBodG1sIGNvbnRlbnRcblxuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50LmlubmVySFRNTCA9IHBhcmFtcy5wcmludGFibGU7IC8vIFByaW50IGh0bWwgY29udGVudHNcblxuICAgIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5zZW5kKHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gIH1cbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9zYXNzL2luZGV4LnNjc3NcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL3Nhc3MvaW5kZXguc2NzcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5cbi8qKiovIH0pLFxuXG4vKioqLyAwOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiBtdWx0aSAuL3NyYy9pbmRleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vc3JjL2luZGV4LmpzICovXCIuL3NyYy9pbmRleC5qc1wiKTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyB9KVtcImRlZmF1bHRcIl07XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByaW50Lm1hcCIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB2YXIgaGFzID0gcmVxdWlyZSgnLi9saWIvaGFzJyk7XG5cbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHsgLyoqLyB9XG4gIH07XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGdldFN0YWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKFxuICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgICAgICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICtcbiAgICAgICAgICAgICAgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciAmJiAhKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJyArXG4gICAgICAgICAgICBsb2NhdGlvbiArICcgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICcgKyB0eXBlb2YgZXJyb3IgKyAnLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgKHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldHMgd2FybmluZyBjYWNoZSB3aGVuIHRlc3RpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUHJvcFR5cGVzO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9saWIvaGFzJyk7XG52YXIgY2hlY2tQcm9wVHlwZXMgPSByZXF1aXJlKCcuL2NoZWNrUHJvcFR5cGVzJyk7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfTtcbn1cblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgLyogZ2xvYmFsIFN5bWJvbCAqL1xuICB2YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG4gIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuXG4gICAqXG4gICAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBhcyBjb250ZXh0OlxuICAgKlxuICAgKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICAgKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpO1xuICAgKiAgICAgICAuLi5cbiAgICogICAgIH1cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gICAqIEByZXR1cm4gez9mdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gbWF5YmVJdGVyYWJsZSAmJiAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBtZXRob2RzIHRoYXQgYWxsb3cgZGVjbGFyYXRpb24gYW5kIHZhbGlkYXRpb24gb2YgcHJvcHMgdGhhdCBhcmVcbiAgICogc3VwcGxpZWQgdG8gUmVhY3QgY29tcG9uZW50cy4gRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICB2YXIgUHJvcHMgPSByZXF1aXJlKCdSZWFjdFByb3BUeXBlcycpO1xuICAgKiAgIHZhciBNeUFydGljbGUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIHByb3AgbmFtZWQgXCJkZXNjcmlwdGlvblwiLlxuICAgKiAgICAgICBkZXNjcmlwdGlvbjogUHJvcHMuc3RyaW5nLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHJlcXVpcmVkIGVudW0gcHJvcCBuYW1lZCBcImNhdGVnb3J5XCIuXG4gICAqICAgICAgIGNhdGVnb3J5OiBQcm9wcy5vbmVPZihbJ05ld3MnLCdQaG90b3MnXSkuaXNSZXF1aXJlZCxcbiAgICpcbiAgICogICAgICAgLy8gQSBwcm9wIG5hbWVkIFwiZGlhbG9nXCIgdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBEaWFsb2cuXG4gICAqICAgICAgIGRpYWxvZzogUHJvcHMuaW5zdGFuY2VPZihEaWFsb2cpLmlzUmVxdWlyZWRcbiAgICogICAgIH0sXG4gICAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkgeyAuLi4gfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBBIG1vcmUgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZXNlIG1ldGhvZHMgYXJlIHVzZWQ6XG4gICAqXG4gICAqICAgdHlwZSA6PSBhcnJheXxib29sfGZ1bmN8b2JqZWN0fG51bWJlcnxzdHJpbmd8b25lT2YoWy4uLl0pfGluc3RhbmNlT2YoLi4uKVxuICAgKiAgIGRlY2wgOj0gUmVhY3RQcm9wVHlwZXMue3R5cGV9KC5pc1JlcXVpcmVkKT9cbiAgICpcbiAgICogRWFjaCBhbmQgZXZlcnkgZGVjbGFyYXRpb24gcHJvZHVjZXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gVGhpc1xuICAgKiBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICB2YXIgTXlMaW5rID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgb3IgVVJJIHByb3AgbmFtZWQgXCJocmVmXCIuXG4gICAqICAgICAgaHJlZjogZnVuY3Rpb24ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAqICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgKiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmXG4gICAqICAgICAgICAgICAgIShwcm9wVmFsdWUgaW5zdGFuY2VvZiBVUkkpKSB7XG4gICAqICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFuIFVSSSBmb3IgJyArIHByb3BOYW1lICsgJyBpbiAnICtcbiAgICogICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAqICAgICAgICAgICk7XG4gICAqICAgICAgICB9XG4gICAqICAgICAgfVxuICAgKiAgICB9LFxuICAgKiAgICByZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn1cbiAgICogIH0pO1xuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cbiAgdmFyIEFOT05ZTU9VUyA9ICc8PGFub255bW91cz4+JztcblxuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSxcbiAgICBiaWdpbnQ6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdiaWdpbnQnKSxcbiAgICBib29sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYm9vbGVhbicpLFxuICAgIGZ1bmM6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdmdW5jdGlvbicpLFxuICAgIG51bWJlcjogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLFxuICAgIG9iamVjdDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ29iamVjdCcpLFxuICAgIHN0cmluZzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N0cmluZycpLFxuICAgIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5bWJvbCcpLFxuXG4gICAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLFxuICAgIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcixcbiAgICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSxcbiAgICBlbGVtZW50VHlwZTogY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpLFxuICAgIGluc3RhbmNlT2Y6IGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIsXG4gICAgbm9kZTogY3JlYXRlTm9kZUNoZWNrZXIoKSxcbiAgICBvYmplY3RPZjogY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcixcbiAgICBvbmVPZjogY3JlYXRlRW51bVR5cGVDaGVja2VyLFxuICAgIG9uZU9mVHlwZTogY3JlYXRlVW5pb25UeXBlQ2hlY2tlcixcbiAgICBzaGFwZTogY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcixcbiAgICBleGFjdDogY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcixcbiAgfTtcblxuICAvKipcbiAgICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAgICovXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi9cbiAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgICB9XG4gIH1cbiAgLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovXG5cbiAgLyoqXG4gICAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGxcbiAgICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZlciwgd2UgZG9uJ3QgdXNlIHJlYWxcbiAgICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbVxuICAgKiBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSBpZiB0aGV5IGFyZSBjcmVhdGVkIHRvbyBvZnRlbiwgc3VjaCBhcyB3aGF0XG4gICAqIGhhcHBlbnMgaW4gb25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC5cbiAgICovXG4gIGZ1bmN0aW9uIFByb3BUeXBlRXJyb3IobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5kYXRhID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhOiB7fTtcbiAgICB0aGlzLnN0YWNrID0gJyc7XG4gIH1cbiAgLy8gTWFrZSBgaW5zdGFuY2VvZiBFcnJvcmAgc3RpbGwgd29yayBmb3IgcmV0dXJuZWQgZXJyb3JzLlxuICBQcm9wVHlwZUVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZTtcblxuICBmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUgPSB7fTtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA9IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgcHJvcEZ1bGxOYW1lID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgICBpZiAoc2VjcmV0ICE9PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgICBpZiAodGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAgICAgICAgIC8vIE5ldyBiZWhhdmlvciBvbmx5IGZvciB1c2VycyBvZiBgcHJvcC10eXBlc2AgcGFja2FnZVxuICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAnVXNlIGBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKWAgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gT2xkIGJlaGF2aW9yIGZvciBwZW9wbGUgdXNpbmcgUmVhY3QuUHJvcFR5cGVzXG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gY29tcG9uZW50TmFtZSArICc6JyArIHByb3BOYW1lO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gJiZcbiAgICAgICAgICAgIC8vIEF2b2lkIHNwYW1taW5nIHRoZSBjb25zb2xlIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gbm90IGFjdGlvbmFibGUgZXhjZXB0IGZvciBsaWIgYXV0aG9yc1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPCAzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAgICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMgdmFsaWRhdGlvbiAnICtcbiAgICAgICAgICAgICAgJ2Z1bmN0aW9uIGZvciB0aGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBwcm9wIG9uIGAnICsgY29tcG9uZW50TmFtZSArICdgLiBUaGlzIGlzIGRlcHJlY2F0ZWQgJyArXG4gICAgICAgICAgICAgICdhbmQgd2lsbCB0aHJvdyBpbiB0aGUgc3RhbmRhbG9uZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAgICdZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIGEgdGhpcmQtcGFydHkgUHJvcFR5cGVzICcgK1xuICAgICAgICAgICAgICAnbGlicmFyeS4gU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1kb250LWNhbGwtcHJvcHR5cGVzICcgKyAnZm9yIGRldGFpbHMuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSA9IHRydWU7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAnICsgKCdpbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgbnVsbGAuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICAgIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRydWUpO1xuXG4gICAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICAvLyBgcHJvcFZhbHVlYCBiZWluZyBpbnN0YW5jZSBvZiwgc2F5LCBkYXRlL3JlZ2V4cCwgcGFzcyB0aGUgJ29iamVjdCdcbiAgICAgICAgLy8gY2hlY2ssIGJ1dCB3ZSBjYW4gb2ZmZXIgYSBtb3JlIHByZWNpc2UgZXJyb3IgbWVzc2FnZSBoZXJlIHJhdGhlciB0aGFuXG4gICAgICAgIC8vICdvZiB0eXBlIGBvYmplY3RgJy5cbiAgICAgICAgdmFyIHByZWNpc2VUeXBlID0gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcmVjaXNlVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnYCcgKyBleHBlY3RlZFR5cGUgKyAnYC4nKSxcbiAgICAgICAgICB7ZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGV9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGFycmF5LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwgaSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICdbJyArIGkgKyAnXScsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghUmVhY3RJcy5pc1ZhbGlkRWxlbWVudFR5cGUocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQgdHlwZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gYXJyYXksIGdvdCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLiAnICtcbiAgICAgICAgICAgICdBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHdyaXRlIG9uZU9mKHgsIHksIHopIGluc3RlYWQgb2Ygb25lT2YoW3gsIHksIHpdKS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpcyhwcm9wVmFsdWUsIGV4cGVjdGVkVmFsdWVzW2ldKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZFZhbHVlcywgZnVuY3Rpb24gcmVwbGFjZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgU3RyaW5nKHByb3BWYWx1ZSkgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgICAgaWYgKGhhcyhwcm9wVmFsdWUsIGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZS4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgY2hlY2sgZnVuY3Rpb25zLCBidXQgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkICcgKyBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcoY2hlY2tlcikgKyAnIGF0IGluZGV4ICcgKyBpICsgJy4nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICAgIHZhciBjaGVja2VyUmVzdWx0ID0gY2hlY2tlcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGNoZWNrZXJSZXN1bHQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja2VyUmVzdWx0LmRhdGEgJiYgaGFzKGNoZWNrZXJSZXN1bHQuZGF0YSwgJ2V4cGVjdGVkVHlwZScpKSB7XG4gICAgICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGNoZWNrZXJSZXN1bHQuZGF0YS5leHBlY3RlZFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgZXhwZWN0ZWRUeXBlc01lc3NhZ2UgPSAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPiAwKSA/ICcsIGV4cGVjdGVkIG9uZSBvZiB0eXBlIFsnICsgZXhwZWN0ZWRUeXBlcy5qb2luKCcsICcpICsgJ10nOiAnJztcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AnICsgZXhwZWN0ZWRUeXBlc01lc3NhZ2UgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludmFsaWRWYWxpZGF0b3JFcnJvcihjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBrZXksIHR5cGUpIHtcbiAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHByb3BGdWxsTmFtZSArICcuJyArIGtleSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZSArICdgLidcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBpbnZhbGlkVmFsaWRhdG9yRXJyb3IoY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwga2V5LCBnZXRQcmVjaXNlVHlwZShjaGVja2VyKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBhbGwga2V5cyBpbiBjYXNlIHNvbWUgYXJlIHJlcXVpcmVkIGJ1dCBtaXNzaW5nIGZyb20gcHJvcHMuXG4gICAgICB2YXIgYWxsS2V5cyA9IGFzc2lnbih7fSwgcHJvcHNbcHJvcE5hbWVdLCBzaGFwZVR5cGVzKTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhbGxLZXlzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoaGFzKHNoYXBlVHlwZXMsIGtleSkgJiYgdHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFZhbGlkYXRvckVycm9yKGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIGtleSwgZ2V0UHJlY2lzZVR5cGUoY2hlY2tlcikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBrZXkgYCcgKyBrZXkgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nICtcbiAgICAgICAgICAgICdcXG5CYWQgb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkocHJvcHNbcHJvcE5hbWVdLCBudWxsLCAnICAnKSArXG4gICAgICAgICAgICAnXFxuVmFsaWQga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHNoYXBlVHlwZXMpLCBudWxsLCAnICAnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAhcHJvcFZhbHVlO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8IGlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuICAgICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50cnlbMV0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpIHtcbiAgICAvLyBOYXRpdmUgU3ltYm9sLlxuICAgIGlmIChwcm9wVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGZhbHN5IHZhbHVlIGNhbid0IGJlIGEgU3ltYm9sXG4gICAgaWYgKCFwcm9wVmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJ1xuICAgIGlmIChwcm9wVmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBub24tc3BlYyBjb21wbGlhbnQgU3ltYm9scyB3aGljaCBhcmUgcG9seWZpbGxlZC5cbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEVxdWl2YWxlbnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJlZ2V4cC5cbiAgZnVuY3Rpb24gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKSB7XG4gICAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9XG4gICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgLy8gT2xkIHdlYmtpdHMgKGF0IGxlYXN0IHVudGlsIEFuZHJvaWQgNC4wKSByZXR1cm4gJ2Z1bmN0aW9uJyByYXRoZXIgdGhhblxuICAgICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgICAvLyBwYXNzZXMgUHJvcFR5cGVzLm9iamVjdC5cbiAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgLy8gU2VlIGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuXG4gIGZ1bmN0aW9uIGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyB8fCBwcm9wVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJyArIHByb3BWYWx1ZTtcbiAgICB9XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgfSBlbHNlIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuICdyZWdleHAnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcG9zdGZpeGVkIHRvIGEgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIHR5cGUuXG4gIC8vIEZvciBleGFtcGxlLCBcInVuZGVmaW5lZFwiIG9yIFwib2YgdHlwZSBhcnJheVwiXG4gIGZ1bmN0aW9uIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcmV0dXJuICdhbiAnICsgdHlwZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICdyZWdleHAnOlxuICAgICAgICByZXR1cm4gJ2EgJyArIHR5cGU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCwgaWYgYW55LlxuICBmdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7XG4gICAgaWYgKCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICByZXR1cm4gQU5PTllNT1VTO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGNoZWNrUHJvcFR5cGVzO1xuICBSZWFjdFByb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGNoZWNrUHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlO1xuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZsdXNoU3luYyB9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBSZXNpemVyIH0gZnJvbSAnLi9yZXNpemVyJztcbnZhciBERUZBVUxUX1NJWkUgPSB7XG4gICAgd2lkdGg6ICdhdXRvJyxcbiAgICBoZWlnaHQ6ICdhdXRvJyxcbn07XG52YXIgY2xhbXAgPSBmdW5jdGlvbiAobiwgbWluLCBtYXgpIHsgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKG4sIG1heCksIG1pbik7IH07XG52YXIgc25hcCA9IGZ1bmN0aW9uIChuLCBzaXplKSB7IHJldHVybiBNYXRoLnJvdW5kKG4gLyBzaXplKSAqIHNpemU7IH07XG52YXIgaGFzRGlyZWN0aW9uID0gZnVuY3Rpb24gKGRpciwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoZGlyLCAnaScpLnRlc3QodGFyZ2V0KTtcbn07XG4vLyBJTkZPOiBJbiBjYXNlIG9mIHdpbmRvdyBpcyBhIFByb3h5IGFuZCBkb2VzIG5vdCBwb3J4eSBFdmVudHMgY29ycmVjdGx5LCB1c2UgaXNUb3VjaEV2ZW50ICYgaXNNb3VzZUV2ZW50IHRvIGRpc3Rpbmd1aXNoIGV2ZW50IHR5cGUgaW5zdGVhZCBvZiBgaW5zdGFuY2VvZmAuXG52YXIgaXNUb3VjaEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCk7XG59O1xudmFyIGlzTW91c2VFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBCb29sZWFuKChldmVudC5jbGllbnRYIHx8IGV2ZW50LmNsaWVudFggPT09IDApICYmXG4gICAgICAgIChldmVudC5jbGllbnRZIHx8IGV2ZW50LmNsaWVudFkgPT09IDApKTtcbn07XG52YXIgZmluZENsb3Nlc3RTbmFwID0gZnVuY3Rpb24gKG4sIHNuYXBBcnJheSwgc25hcEdhcCkge1xuICAgIGlmIChzbmFwR2FwID09PSB2b2lkIDApIHsgc25hcEdhcCA9IDA7IH1cbiAgICB2YXIgY2xvc2VzdEdhcEluZGV4ID0gc25hcEFycmF5LnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyciwgaW5kZXgpIHsgcmV0dXJuIChNYXRoLmFicyhjdXJyIC0gbikgPCBNYXRoLmFicyhzbmFwQXJyYXlbcHJldl0gLSBuKSA/IGluZGV4IDogcHJldik7IH0sIDApO1xuICAgIHZhciBnYXAgPSBNYXRoLmFicyhzbmFwQXJyYXlbY2xvc2VzdEdhcEluZGV4XSAtIG4pO1xuICAgIHJldHVybiBzbmFwR2FwID09PSAwIHx8IGdhcCA8IHNuYXBHYXAgPyBzbmFwQXJyYXlbY2xvc2VzdEdhcEluZGV4XSA6IG47XG59O1xudmFyIGdldFN0cmluZ1NpemUgPSBmdW5jdGlvbiAobikge1xuICAgIG4gPSBuLnRvU3RyaW5nKCk7XG4gICAgaWYgKG4gPT09ICdhdXRvJykge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgaWYgKG4uZW5kc1dpdGgoJ3B4JykpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChuLmVuZHNXaXRoKCclJykpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChuLmVuZHNXaXRoKCd2aCcpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAobi5lbmRzV2l0aCgndncnKSkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgaWYgKG4uZW5kc1dpdGgoJ3ZtYXgnKSkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgaWYgKG4uZW5kc1dpdGgoJ3ZtaW4nKSkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgcmV0dXJuIG4gKyBcInB4XCI7XG59O1xudmFyIGdldFBpeGVsU2l6ZSA9IGZ1bmN0aW9uIChzaXplLCBwYXJlbnRTaXplLCBpbm5lcldpZHRoLCBpbm5lckhlaWdodCkge1xuICAgIGlmIChzaXplICYmIHR5cGVvZiBzaXplID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoc2l6ZS5lbmRzV2l0aCgncHgnKSkge1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlcihzaXplLnJlcGxhY2UoJ3B4JywgJycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2l6ZS5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAgICAgICB2YXIgcmF0aW8gPSBOdW1iZXIoc2l6ZS5yZXBsYWNlKCclJywgJycpKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRTaXplICogcmF0aW87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUuZW5kc1dpdGgoJ3Z3JykpIHtcbiAgICAgICAgICAgIHZhciByYXRpbyA9IE51bWJlcihzaXplLnJlcGxhY2UoJ3Z3JywgJycpKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBpbm5lcldpZHRoICogcmF0aW87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUuZW5kc1dpdGgoJ3ZoJykpIHtcbiAgICAgICAgICAgIHZhciByYXRpbyA9IE51bWJlcihzaXplLnJlcGxhY2UoJ3ZoJywgJycpKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBpbm5lckhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xufTtcbnZhciBjYWxjdWxhdGVOZXdNYXggPSBmdW5jdGlvbiAocGFyZW50U2l6ZSwgaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQsIG1pbldpZHRoLCBtaW5IZWlnaHQpIHtcbiAgICBtYXhXaWR0aCA9IGdldFBpeGVsU2l6ZShtYXhXaWR0aCwgcGFyZW50U2l6ZS53aWR0aCwgaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQpO1xuICAgIG1heEhlaWdodCA9IGdldFBpeGVsU2l6ZShtYXhIZWlnaHQsIHBhcmVudFNpemUuaGVpZ2h0LCBpbm5lcldpZHRoLCBpbm5lckhlaWdodCk7XG4gICAgbWluV2lkdGggPSBnZXRQaXhlbFNpemUobWluV2lkdGgsIHBhcmVudFNpemUud2lkdGgsIGlubmVyV2lkdGgsIGlubmVySGVpZ2h0KTtcbiAgICBtaW5IZWlnaHQgPSBnZXRQaXhlbFNpemUobWluSGVpZ2h0LCBwYXJlbnRTaXplLmhlaWdodCwgaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG1heFdpZHRoOiB0eXBlb2YgbWF4V2lkdGggPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogTnVtYmVyKG1heFdpZHRoKSxcbiAgICAgICAgbWF4SGVpZ2h0OiB0eXBlb2YgbWF4SGVpZ2h0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE51bWJlcihtYXhIZWlnaHQpLFxuICAgICAgICBtaW5XaWR0aDogdHlwZW9mIG1pbldpZHRoID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE51bWJlcihtaW5XaWR0aCksXG4gICAgICAgIG1pbkhlaWdodDogdHlwZW9mIG1pbkhlaWdodCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBOdW1iZXIobWluSGVpZ2h0KSxcbiAgICB9O1xufTtcbi8qKlxuICogdHJhbnNmb3JtIFQgfCBbVCwgVF0gdG8gW1QsIFRdXG4gKiBAcGFyYW0gdmFsXG4gKiBAcmV0dXJuc1xuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbnZhciBub3JtYWxpemVUb1BhaXIgPSBmdW5jdGlvbiAodmFsKSB7IHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbCwgdmFsXSk7IH07XG52YXIgZGVmaW5lZFByb3BzID0gW1xuICAgICdhcycsXG4gICAgJ3JlZicsXG4gICAgJ3N0eWxlJyxcbiAgICAnY2xhc3NOYW1lJyxcbiAgICAnZ3JpZCcsXG4gICAgJ3NuYXAnLFxuICAgICdib3VuZHMnLFxuICAgICdib3VuZHNCeURpcmVjdGlvbicsXG4gICAgJ3NpemUnLFxuICAgICdkZWZhdWx0U2l6ZScsXG4gICAgJ21pbldpZHRoJyxcbiAgICAnbWluSGVpZ2h0JyxcbiAgICAnbWF4V2lkdGgnLFxuICAgICdtYXhIZWlnaHQnLFxuICAgICdsb2NrQXNwZWN0UmF0aW8nLFxuICAgICdsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoJyxcbiAgICAnbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQnLFxuICAgICdlbmFibGUnLFxuICAgICdoYW5kbGVTdHlsZXMnLFxuICAgICdoYW5kbGVDbGFzc2VzJyxcbiAgICAnaGFuZGxlV3JhcHBlclN0eWxlJyxcbiAgICAnaGFuZGxlV3JhcHBlckNsYXNzJyxcbiAgICAnY2hpbGRyZW4nLFxuICAgICdvblJlc2l6ZVN0YXJ0JyxcbiAgICAnb25SZXNpemUnLFxuICAgICdvblJlc2l6ZVN0b3AnLFxuICAgICdoYW5kbGVDb21wb25lbnQnLFxuICAgICdzY2FsZScsXG4gICAgJ3Jlc2l6ZVJhdGlvJyxcbiAgICAnc25hcEdhcCcsXG5dO1xuLy8gSEFDSzogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNhbGN1bGF0ZSAlIHNpemUuXG52YXIgYmFzZUNsYXNzTmFtZSA9ICdfX3Jlc2l6YWJsZV9iYXNlX18nO1xudmFyIFJlc2l6YWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVzaXphYmxlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlc2l6YWJsZShwcm9wcykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5yYXRpbyA9IDE7XG4gICAgICAgIF90aGlzLnJlc2l6YWJsZSA9IG51bGw7XG4gICAgICAgIC8vIEZvciBwYXJlbnQgYm91bmRhcnlcbiAgICAgICAgX3RoaXMucGFyZW50TGVmdCA9IDA7XG4gICAgICAgIF90aGlzLnBhcmVudFRvcCA9IDA7XG4gICAgICAgIC8vIEZvciBib3VuZGFyeVxuICAgICAgICBfdGhpcy5yZXNpemFibGVMZWZ0ID0gMDtcbiAgICAgICAgX3RoaXMucmVzaXphYmxlUmlnaHQgPSAwO1xuICAgICAgICBfdGhpcy5yZXNpemFibGVUb3AgPSAwO1xuICAgICAgICBfdGhpcy5yZXNpemFibGVCb3R0b20gPSAwO1xuICAgICAgICAvLyBGb3IgdGFyZ2V0IGJvdW5kYXJ5XG4gICAgICAgIF90aGlzLnRhcmdldExlZnQgPSAwO1xuICAgICAgICBfdGhpcy50YXJnZXRUb3AgPSAwO1xuICAgICAgICBfdGhpcy5hcHBlbmRCYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5yZXNpemFibGUgfHwgIV90aGlzLndpbmRvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHBhcmVudCA9IF90aGlzLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBfdGhpcy53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gJ3NjYWxlKDAsIDApJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZmxleCA9ICcwIDAgMTAwJSc7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoYmFzZUNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSArPSBiYXNlQ2xhc3NOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLnJlbW92ZUJhc2UgPSBmdW5jdGlvbiAoYmFzZSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IF90aGlzLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChiYXNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIHdpZHRoOiAoX2IgPSAoX2EgPSBfdGhpcy5wcm9wc1NpemUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS53aWR0aCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJ2F1dG8nLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSAoX2MgPSBfdGhpcy5wcm9wc1NpemUpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICdhdXRvJyxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJ3JpZ2h0JyxcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiYWNrZ3JvdW5kU3R5bGU6IHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwwLDAsMCknLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAgICAgekluZGV4OiA5OTk5LFxuICAgICAgICAgICAgICAgIHRvcDogJzAnLFxuICAgICAgICAgICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgICAgICAgICBib3R0b206ICcwJyxcbiAgICAgICAgICAgICAgICByaWdodDogJzAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZsZXhCYXNpczogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5vblJlc2l6ZVN0YXJ0ID0gX3RoaXMub25SZXNpemVTdGFydC5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25Nb3VzZU1vdmUgPSBfdGhpcy5vbk1vdXNlTW92ZS5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25Nb3VzZVVwID0gX3RoaXMub25Nb3VzZVVwLmJpbmQoX3RoaXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNpemFibGUucHJvdG90eXBlLCBcInBhcmVudE5vZGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2l6YWJsZS5wYXJlbnROb2RlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlc2l6YWJsZS5wcm90b3R5cGUsIFwid2luZG93XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlLm93bmVyRG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2l6YWJsZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlc2l6YWJsZS5wcm90b3R5cGUsIFwicHJvcHNTaXplXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zaXplIHx8IHRoaXMucHJvcHMuZGVmYXVsdFNpemUgfHwgREVGQVVMVF9TSVpFO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlc2l6YWJsZS5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gMDtcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSAwO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzaXphYmxlICYmIHRoaXMud2luZG93KSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yZ1dpZHRoID0gdGhpcy5yZXNpemFibGUub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICAgICAgdmFyIG9yZ0hlaWdodCA9IHRoaXMucmVzaXphYmxlLm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICAvLyBIQUNLOiBTZXQgcG9zaXRpb24gYHJlbGF0aXZlYCB0byBnZXQgcGFyZW50IHNpemUuXG4gICAgICAgICAgICAgICAgLy8gICAgICAgVGhpcyBpcyBiZWNhdXNlIHdoZW4gcmUtcmVzaXphYmxlIHNldCBgYWJzb2x1dGVgLCBJIGNhbiBub3QgZ2V0IGJhc2Ugd2lkdGggY29ycmVjdGx5LlxuICAgICAgICAgICAgICAgIHZhciBvcmdQb3NpdGlvbiA9IHRoaXMucmVzaXphYmxlLnN0eWxlLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChvcmdQb3NpdGlvbiAhPT0gJ3JlbGF0aXZlJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6YWJsZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElORk86IFVzZSBvcmlnaW5hbCB3aWR0aCBvciBoZWlnaHQgaWYgc2V0IGF1dG8uXG4gICAgICAgICAgICAgICAgd2lkdGggPSB0aGlzLnJlc2l6YWJsZS5zdHlsZS53aWR0aCAhPT0gJ2F1dG8nID8gdGhpcy5yZXNpemFibGUub2Zmc2V0V2lkdGggOiBvcmdXaWR0aDtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLnJlc2l6YWJsZS5zdHlsZS5oZWlnaHQgIT09ICdhdXRvJyA/IHRoaXMucmVzaXphYmxlLm9mZnNldEhlaWdodCA6IG9yZ0hlaWdodDtcbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemFibGUuc3R5bGUucG9zaXRpb24gPSBvcmdQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNpemFibGUucHJvdG90eXBlLCBcInNpemVTdHlsZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5wcm9wcy5zaXplO1xuICAgICAgICAgICAgdmFyIGdldFNpemUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgX3RoaXMuc3RhdGVba2V5XSA9PT0gJ3VuZGVmaW5lZCcgfHwgX3RoaXMuc3RhdGVba2V5XSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnYXV0byc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5wcm9wc1NpemUgJiYgX3RoaXMucHJvcHNTaXplW2tleV0gJiYgKChfYSA9IF90aGlzLnByb3BzU2l6ZVtrZXldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudG9TdHJpbmcoKS5lbmRzV2l0aCgnJScpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuc3RhdGVba2V5XS50b1N0cmluZygpLmVuZHNXaXRoKCclJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5zdGF0ZVtrZXldLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFNpemUgPSBfdGhpcy5nZXRQYXJlbnRTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IE51bWJlcihfdGhpcy5zdGF0ZVtrZXldLnRvU3RyaW5nKCkucmVwbGFjZSgncHgnLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGVyY2VudCA9ICh2YWx1ZSAvIHBhcmVudFNpemVba2V5XSkgKiAxMDA7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwZXJjZW50ICsgXCIlXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRTdHJpbmdTaXplKF90aGlzLnN0YXRlW2tleV0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHNpemUgJiYgdHlwZW9mIHNpemUud2lkdGggIT09ICd1bmRlZmluZWQnICYmICF0aGlzLnN0YXRlLmlzUmVzaXppbmdcbiAgICAgICAgICAgICAgICA/IGdldFN0cmluZ1NpemUoc2l6ZS53aWR0aClcbiAgICAgICAgICAgICAgICA6IGdldFNpemUoJ3dpZHRoJyk7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gc2l6ZSAmJiB0eXBlb2Ygc2l6ZS5oZWlnaHQgIT09ICd1bmRlZmluZWQnICYmICF0aGlzLnN0YXRlLmlzUmVzaXppbmdcbiAgICAgICAgICAgICAgICA/IGdldFN0cmluZ1NpemUoc2l6ZS5oZWlnaHQpXG4gICAgICAgICAgICAgICAgOiBnZXRTaXplKCdoZWlnaHQnKTtcbiAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuZ2V0UGFyZW50U2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB3aWR0aDogdGhpcy53aW5kb3cuaW5uZXJXaWR0aCwgaGVpZ2h0OiB0aGlzLndpbmRvdy5pbm5lckhlaWdodCB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBiYXNlID0gdGhpcy5hcHBlbmRCYXNlKCk7XG4gICAgICAgIGlmICghYmFzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIElORk86IFRvIGNhbGN1bGF0ZSBwYXJlbnQgd2lkdGggd2l0aCBmbGV4IGxheW91dFxuICAgICAgICB2YXIgd3JhcENoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHdyYXAgPSB0aGlzLnBhcmVudE5vZGUuc3R5bGUuZmxleFdyYXA7XG4gICAgICAgIGlmICh3cmFwICE9PSAnd3JhcCcpIHtcbiAgICAgICAgICAgIHdyYXBDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5zdHlsZS5mbGV4V3JhcCA9ICd3cmFwJztcbiAgICAgICAgICAgIC8vIEhBQ0s6IFVzZSByZWxhdGl2ZSB0byBnZXQgcGFyZW50IHBhZGRpbmcgc2l6ZVxuICAgICAgICB9XG4gICAgICAgIGJhc2Uuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICBiYXNlLnN0eWxlLm1pbldpZHRoID0gJzEwMCUnO1xuICAgICAgICBiYXNlLnN0eWxlLm1pbkhlaWdodCA9ICcxMDAlJztcbiAgICAgICAgdmFyIHNpemUgPSB7XG4gICAgICAgICAgICB3aWR0aDogYmFzZS5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogYmFzZS5vZmZzZXRIZWlnaHQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh3cmFwQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlLnN0eWxlLmZsZXhXcmFwID0gd3JhcDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUJhc2UoYmFzZSk7XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5iaW5kRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlLCB7XG4gICAgICAgICAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUudW5iaW5kRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlIHx8ICF0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gdGhpcy53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnJlc2l6YWJsZSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMuc3RhdGUud2lkdGggfHwgdGhpcy5zaXplLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnN0YXRlLmhlaWdodCB8fCB0aGlzLnNpemUuaGVpZ2h0LFxuICAgICAgICAgICAgZmxleEJhc2lzOiBjb21wdXRlZFN0eWxlLmZsZXhCYXNpcyAhPT0gJ2F1dG8nID8gY29tcHV0ZWRTdHlsZS5mbGV4QmFzaXMgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMud2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmNyZWF0ZVNpemVGb3JDc3NQcm9wZXJ0eSA9IGZ1bmN0aW9uIChuZXdTaXplLCBraW5kKSB7XG4gICAgICAgIHZhciBwcm9wc1NpemUgPSB0aGlzLnByb3BzU2l6ZSAmJiB0aGlzLnByb3BzU2l6ZVtraW5kXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVba2luZF0gPT09ICdhdXRvJyAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5vcmlnaW5hbFtraW5kXSA9PT0gbmV3U2l6ZSAmJlxuICAgICAgICAgICAgKHR5cGVvZiBwcm9wc1NpemUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BzU2l6ZSA9PT0gJ2F1dG8nKVxuICAgICAgICAgICAgPyAnYXV0bydcbiAgICAgICAgICAgIDogbmV3U2l6ZTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuY2FsY3VsYXRlTmV3TWF4RnJvbUJvdW5kYXJ5ID0gZnVuY3Rpb24gKG1heFdpZHRoLCBtYXhIZWlnaHQpIHtcbiAgICAgICAgdmFyIGJvdW5kc0J5RGlyZWN0aW9uID0gdGhpcy5wcm9wcy5ib3VuZHNCeURpcmVjdGlvbjtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IHRoaXMuc3RhdGUuZGlyZWN0aW9uO1xuICAgICAgICB2YXIgd2lkdGhCeURpcmVjdGlvbiA9IGJvdW5kc0J5RGlyZWN0aW9uICYmIGhhc0RpcmVjdGlvbignbGVmdCcsIGRpcmVjdGlvbik7XG4gICAgICAgIHZhciBoZWlnaHRCeURpcmVjdGlvbiA9IGJvdW5kc0J5RGlyZWN0aW9uICYmIGhhc0RpcmVjdGlvbigndG9wJywgZGlyZWN0aW9uKTtcbiAgICAgICAgdmFyIGJvdW5kV2lkdGg7XG4gICAgICAgIHZhciBib3VuZEhlaWdodDtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSAncGFyZW50Jykge1xuICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gdGhpcy5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmVudF8xKSB7XG4gICAgICAgICAgICAgICAgYm91bmRXaWR0aCA9IHdpZHRoQnlEaXJlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnJlc2l6YWJsZVJpZ2h0IC0gdGhpcy5wYXJlbnRMZWZ0XG4gICAgICAgICAgICAgICAgICAgIDogcGFyZW50XzEub2Zmc2V0V2lkdGggKyAodGhpcy5wYXJlbnRMZWZ0IC0gdGhpcy5yZXNpemFibGVMZWZ0KTtcbiAgICAgICAgICAgICAgICBib3VuZEhlaWdodCA9IGhlaWdodEJ5RGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZXNpemFibGVCb3R0b20gLSB0aGlzLnBhcmVudFRvcFxuICAgICAgICAgICAgICAgICAgICA6IHBhcmVudF8xLm9mZnNldEhlaWdodCArICh0aGlzLnBhcmVudFRvcCAtIHRoaXMucmVzaXphYmxlVG9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgICAgIGJvdW5kV2lkdGggPSB3aWR0aEJ5RGlyZWN0aW9uID8gdGhpcy5yZXNpemFibGVSaWdodCA6IHRoaXMud2luZG93LmlubmVyV2lkdGggLSB0aGlzLnJlc2l6YWJsZUxlZnQ7XG4gICAgICAgICAgICAgICAgYm91bmRIZWlnaHQgPSBoZWlnaHRCeURpcmVjdGlvbiA/IHRoaXMucmVzaXphYmxlQm90dG9tIDogdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLnJlc2l6YWJsZVRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcykge1xuICAgICAgICAgICAgYm91bmRXaWR0aCA9IHdpZHRoQnlEaXJlY3Rpb25cbiAgICAgICAgICAgICAgICA/IHRoaXMucmVzaXphYmxlUmlnaHQgLSB0aGlzLnRhcmdldExlZnRcbiAgICAgICAgICAgICAgICA6IHRoaXMucHJvcHMuYm91bmRzLm9mZnNldFdpZHRoICsgKHRoaXMudGFyZ2V0TGVmdCAtIHRoaXMucmVzaXphYmxlTGVmdCk7XG4gICAgICAgICAgICBib3VuZEhlaWdodCA9IGhlaWdodEJ5RGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgPyB0aGlzLnJlc2l6YWJsZUJvdHRvbSAtIHRoaXMudGFyZ2V0VG9wXG4gICAgICAgICAgICAgICAgOiB0aGlzLnByb3BzLmJvdW5kcy5vZmZzZXRIZWlnaHQgKyAodGhpcy50YXJnZXRUb3AgLSB0aGlzLnJlc2l6YWJsZVRvcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJvdW5kV2lkdGggJiYgTnVtYmVyLmlzRmluaXRlKGJvdW5kV2lkdGgpKSB7XG4gICAgICAgICAgICBtYXhXaWR0aCA9IG1heFdpZHRoICYmIG1heFdpZHRoIDwgYm91bmRXaWR0aCA/IG1heFdpZHRoIDogYm91bmRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYm91bmRIZWlnaHQgJiYgTnVtYmVyLmlzRmluaXRlKGJvdW5kSGVpZ2h0KSkge1xuICAgICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SGVpZ2h0ICYmIG1heEhlaWdodCA8IGJvdW5kSGVpZ2h0ID8gbWF4SGVpZ2h0IDogYm91bmRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWF4V2lkdGg6IG1heFdpZHRoLCBtYXhIZWlnaHQ6IG1heEhlaWdodCB9O1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5jYWxjdWxhdGVOZXdTaXplRnJvbURpcmVjdGlvbiA9IGZ1bmN0aW9uIChjbGllbnRYLCBjbGllbnRZKSB7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMucHJvcHMuc2NhbGUgfHwgMTtcbiAgICAgICAgdmFyIF9hID0gbm9ybWFsaXplVG9QYWlyKHRoaXMucHJvcHMucmVzaXplUmF0aW8gfHwgMSksIHJlc2l6ZVJhdGlvWCA9IF9hWzBdLCByZXNpemVSYXRpb1kgPSBfYVsxXTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5zdGF0ZSwgZGlyZWN0aW9uID0gX2IuZGlyZWN0aW9uLCBvcmlnaW5hbCA9IF9iLm9yaWdpbmFsO1xuICAgICAgICB2YXIgX2MgPSB0aGlzLnByb3BzLCBsb2NrQXNwZWN0UmF0aW8gPSBfYy5sb2NrQXNwZWN0UmF0aW8sIGxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0ID0gX2MubG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQsIGxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGggPSBfYy5sb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoO1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBvcmlnaW5hbC53aWR0aDtcbiAgICAgICAgdmFyIG5ld0hlaWdodCA9IG9yaWdpbmFsLmhlaWdodDtcbiAgICAgICAgdmFyIGV4dHJhSGVpZ2h0ID0gbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQgfHwgMDtcbiAgICAgICAgdmFyIGV4dHJhV2lkdGggPSBsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoIHx8IDA7XG4gICAgICAgIGlmIChoYXNEaXJlY3Rpb24oJ3JpZ2h0JywgZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgbmV3V2lkdGggPSBvcmlnaW5hbC53aWR0aCArICgoY2xpZW50WCAtIG9yaWdpbmFsLngpICogcmVzaXplUmF0aW9YKSAvIHNjYWxlO1xuICAgICAgICAgICAgaWYgKGxvY2tBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IChuZXdXaWR0aCAtIGV4dHJhV2lkdGgpIC8gdGhpcy5yYXRpbyArIGV4dHJhSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNEaXJlY3Rpb24oJ2xlZnQnLCBkaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IG9yaWdpbmFsLndpZHRoIC0gKChjbGllbnRYIC0gb3JpZ2luYWwueCkgKiByZXNpemVSYXRpb1gpIC8gc2NhbGU7XG4gICAgICAgICAgICBpZiAobG9ja0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gKG5ld1dpZHRoIC0gZXh0cmFXaWR0aCkgLyB0aGlzLnJhdGlvICsgZXh0cmFIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0RpcmVjdGlvbignYm90dG9tJywgZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gb3JpZ2luYWwuaGVpZ2h0ICsgKChjbGllbnRZIC0gb3JpZ2luYWwueSkgKiByZXNpemVSYXRpb1kpIC8gc2NhbGU7XG4gICAgICAgICAgICBpZiAobG9ja0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSAobmV3SGVpZ2h0IC0gZXh0cmFIZWlnaHQpICogdGhpcy5yYXRpbyArIGV4dHJhV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0RpcmVjdGlvbigndG9wJywgZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gb3JpZ2luYWwuaGVpZ2h0IC0gKChjbGllbnRZIC0gb3JpZ2luYWwueSkgKiByZXNpemVSYXRpb1kpIC8gc2NhbGU7XG4gICAgICAgICAgICBpZiAobG9ja0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSAobmV3SGVpZ2h0IC0gZXh0cmFIZWlnaHQpICogdGhpcy5yYXRpbyArIGV4dHJhV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmV3V2lkdGg6IG5ld1dpZHRoLCBuZXdIZWlnaHQ6IG5ld0hlaWdodCB9O1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5jYWxjdWxhdGVOZXdTaXplRnJvbUFzcGVjdFJhdGlvID0gZnVuY3Rpb24gKG5ld1dpZHRoLCBuZXdIZWlnaHQsIG1heCwgbWluKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIGxvY2tBc3BlY3RSYXRpbyA9IF9hLmxvY2tBc3BlY3RSYXRpbywgbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQgPSBfYS5sb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodCwgbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aCA9IF9hLmxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGg7XG4gICAgICAgIHZhciBjb21wdXRlZE1pbldpZHRoID0gdHlwZW9mIG1pbi53aWR0aCA9PT0gJ3VuZGVmaW5lZCcgPyAxMCA6IG1pbi53aWR0aDtcbiAgICAgICAgdmFyIGNvbXB1dGVkTWF4V2lkdGggPSB0eXBlb2YgbWF4LndpZHRoID09PSAndW5kZWZpbmVkJyB8fCBtYXgud2lkdGggPCAwID8gbmV3V2lkdGggOiBtYXgud2lkdGg7XG4gICAgICAgIHZhciBjb21wdXRlZE1pbkhlaWdodCA9IHR5cGVvZiBtaW4uaGVpZ2h0ID09PSAndW5kZWZpbmVkJyA/IDEwIDogbWluLmhlaWdodDtcbiAgICAgICAgdmFyIGNvbXB1dGVkTWF4SGVpZ2h0ID0gdHlwZW9mIG1heC5oZWlnaHQgPT09ICd1bmRlZmluZWQnIHx8IG1heC5oZWlnaHQgPCAwID8gbmV3SGVpZ2h0IDogbWF4LmhlaWdodDtcbiAgICAgICAgdmFyIGV4dHJhSGVpZ2h0ID0gbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQgfHwgMDtcbiAgICAgICAgdmFyIGV4dHJhV2lkdGggPSBsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoIHx8IDA7XG4gICAgICAgIGlmIChsb2NrQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgIHZhciBleHRyYU1pbldpZHRoID0gKGNvbXB1dGVkTWluSGVpZ2h0IC0gZXh0cmFIZWlnaHQpICogdGhpcy5yYXRpbyArIGV4dHJhV2lkdGg7XG4gICAgICAgICAgICB2YXIgZXh0cmFNYXhXaWR0aCA9IChjb21wdXRlZE1heEhlaWdodCAtIGV4dHJhSGVpZ2h0KSAqIHRoaXMucmF0aW8gKyBleHRyYVdpZHRoO1xuICAgICAgICAgICAgdmFyIGV4dHJhTWluSGVpZ2h0ID0gKGNvbXB1dGVkTWluV2lkdGggLSBleHRyYVdpZHRoKSAvIHRoaXMucmF0aW8gKyBleHRyYUhlaWdodDtcbiAgICAgICAgICAgIHZhciBleHRyYU1heEhlaWdodCA9IChjb21wdXRlZE1heFdpZHRoIC0gZXh0cmFXaWR0aCkgLyB0aGlzLnJhdGlvICsgZXh0cmFIZWlnaHQ7XG4gICAgICAgICAgICB2YXIgbG9ja2VkTWluV2lkdGggPSBNYXRoLm1heChjb21wdXRlZE1pbldpZHRoLCBleHRyYU1pbldpZHRoKTtcbiAgICAgICAgICAgIHZhciBsb2NrZWRNYXhXaWR0aCA9IE1hdGgubWluKGNvbXB1dGVkTWF4V2lkdGgsIGV4dHJhTWF4V2lkdGgpO1xuICAgICAgICAgICAgdmFyIGxvY2tlZE1pbkhlaWdodCA9IE1hdGgubWF4KGNvbXB1dGVkTWluSGVpZ2h0LCBleHRyYU1pbkhlaWdodCk7XG4gICAgICAgICAgICB2YXIgbG9ja2VkTWF4SGVpZ2h0ID0gTWF0aC5taW4oY29tcHV0ZWRNYXhIZWlnaHQsIGV4dHJhTWF4SGVpZ2h0KTtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gY2xhbXAobmV3V2lkdGgsIGxvY2tlZE1pbldpZHRoLCBsb2NrZWRNYXhXaWR0aCk7XG4gICAgICAgICAgICBuZXdIZWlnaHQgPSBjbGFtcChuZXdIZWlnaHQsIGxvY2tlZE1pbkhlaWdodCwgbG9ja2VkTWF4SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gY2xhbXAobmV3V2lkdGgsIGNvbXB1dGVkTWluV2lkdGgsIGNvbXB1dGVkTWF4V2lkdGgpO1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gY2xhbXAobmV3SGVpZ2h0LCBjb21wdXRlZE1pbkhlaWdodCwgY29tcHV0ZWRNYXhIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5ld1dpZHRoOiBuZXdXaWR0aCwgbmV3SGVpZ2h0OiBuZXdIZWlnaHQgfTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuc2V0Qm91bmRpbmdDbGllbnRSZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBGb3IgcGFyZW50IGJvdW5kYXJ5XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gJ3BhcmVudCcpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMiA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRfMikge1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnRSZWN0ID0gcGFyZW50XzIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRMZWZ0ID0gcGFyZW50UmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50VG9wID0gcGFyZW50UmVjdC50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIHRhcmdldChodG1sIGVsZW1lbnQpIGJvdW5kYXJ5XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcyAmJiB0eXBlb2YgdGhpcy5wcm9wcy5ib3VuZHMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0UmVjdCA9IHRoaXMucHJvcHMuYm91bmRzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdGhpcy50YXJnZXRMZWZ0ID0gdGFyZ2V0UmVjdC5sZWZ0O1xuICAgICAgICAgICAgdGhpcy50YXJnZXRUb3AgPSB0YXJnZXRSZWN0LnRvcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgYm91bmRhcnlcbiAgICAgICAgaWYgKHRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLnJlc2l6YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgbGVmdCA9IF9hLmxlZnQsIHRvcF8xID0gX2EudG9wLCByaWdodCA9IF9hLnJpZ2h0LCBib3R0b20gPSBfYS5ib3R0b207XG4gICAgICAgICAgICB0aGlzLnJlc2l6YWJsZUxlZnQgPSBsZWZ0O1xuICAgICAgICAgICAgdGhpcy5yZXNpemFibGVSaWdodCA9IHJpZ2h0O1xuICAgICAgICAgICAgdGhpcy5yZXNpemFibGVUb3AgPSB0b3BfMTtcbiAgICAgICAgICAgIHRoaXMucmVzaXphYmxlQm90dG9tID0gYm90dG9tO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLm9uUmVzaXplU3RhcnQgPSBmdW5jdGlvbiAoZXZlbnQsIGRpcmVjdGlvbikge1xuICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlIHx8ICF0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbGllbnRYID0gMDtcbiAgICAgICAgdmFyIGNsaWVudFkgPSAwO1xuICAgICAgICBpZiAoZXZlbnQubmF0aXZlRXZlbnQgJiYgaXNNb3VzZUV2ZW50KGV2ZW50Lm5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAgICAgY2xpZW50WCA9IGV2ZW50Lm5hdGl2ZUV2ZW50LmNsaWVudFg7XG4gICAgICAgICAgICBjbGllbnRZID0gZXZlbnQubmF0aXZlRXZlbnQuY2xpZW50WTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldmVudC5uYXRpdmVFdmVudCAmJiBpc1RvdWNoRXZlbnQoZXZlbnQubmF0aXZlRXZlbnQpKSB7XG4gICAgICAgICAgICBjbGllbnRYID0gZXZlbnQubmF0aXZlRXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgICAgICAgY2xpZW50WSA9IGV2ZW50Lm5hdGl2ZUV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblJlc2l6ZVN0YXJ0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRSZXNpemUgPSB0aGlzLnByb3BzLm9uUmVzaXplU3RhcnQoZXZlbnQsIGRpcmVjdGlvbiwgdGhpcy5yZXNpemFibGUpO1xuICAgICAgICAgICAgICAgIGlmIChzdGFydFJlc2l6ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGaXggIzE2OFxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaXplKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuc2l6ZS5oZWlnaHQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucHJvcHMuc2l6ZS5oZWlnaHQgIT09IHRoaXMuc3RhdGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGhlaWdodDogdGhpcy5wcm9wcy5zaXplLmhlaWdodCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zaXplLndpZHRoICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnByb3BzLnNpemUud2lkdGggIT09IHRoaXMuc3RhdGUud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgd2lkdGg6IHRoaXMucHJvcHMuc2l6ZS53aWR0aCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgbG9ja0FzcGVjdFJhdGlvIGNhc2VcbiAgICAgICAgdGhpcy5yYXRpbyA9XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW8gPT09ICdudW1iZXInID8gdGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW8gOiB0aGlzLnNpemUud2lkdGggLyB0aGlzLnNpemUuaGVpZ2h0O1xuICAgICAgICB2YXIgZmxleEJhc2lzO1xuICAgICAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IHRoaXMud2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5yZXNpemFibGUpO1xuICAgICAgICBpZiAoY29tcHV0ZWRTdHlsZS5mbGV4QmFzaXMgIT09ICdhdXRvJykge1xuICAgICAgICAgICAgdmFyIHBhcmVudF8zID0gdGhpcy5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmVudF8zKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRpciA9IHRoaXMud2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50XzMpLmZsZXhEaXJlY3Rpb247XG4gICAgICAgICAgICAgICAgdGhpcy5mbGV4RGlyID0gZGlyLnN0YXJ0c1dpdGgoJ3JvdycpID8gJ3JvdycgOiAnY29sdW1uJztcbiAgICAgICAgICAgICAgICBmbGV4QmFzaXMgPSBjb21wdXRlZFN0eWxlLmZsZXhCYXNpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgYm91bmRhcnlcbiAgICAgICAgdGhpcy5zZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgICAgeDogY2xpZW50WCxcbiAgICAgICAgICAgICAgICB5OiBjbGllbnRZLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLnNpemUud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnNpemUuaGVpZ2h0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzUmVzaXppbmc6IHRydWUsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kU3R5bGU6IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLnN0YXRlLmJhY2tncm91bmRTdHlsZSksIHsgY3Vyc29yOiB0aGlzLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGV2ZW50LnRhcmdldCkuY3Vyc29yIHx8ICdhdXRvJyB9KSxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgICAgICAgZmxleEJhc2lzOiBmbGV4QmFzaXMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoc3RhdGUpO1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5vbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuaXNSZXNpemluZyB8fCAhdGhpcy5yZXNpemFibGUgfHwgIXRoaXMud2luZG93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMud2luZG93LlRvdWNoRXZlbnQgJiYgaXNUb3VjaEV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgb24gZmFpbFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIG1heFdpZHRoID0gX2EubWF4V2lkdGgsIG1heEhlaWdodCA9IF9hLm1heEhlaWdodCwgbWluV2lkdGggPSBfYS5taW5XaWR0aCwgbWluSGVpZ2h0ID0gX2EubWluSGVpZ2h0O1xuICAgICAgICB2YXIgY2xpZW50WCA9IGlzVG91Y2hFdmVudChldmVudCkgPyBldmVudC50b3VjaGVzWzBdLmNsaWVudFggOiBldmVudC5jbGllbnRYO1xuICAgICAgICB2YXIgY2xpZW50WSA9IGlzVG91Y2hFdmVudChldmVudCkgPyBldmVudC50b3VjaGVzWzBdLmNsaWVudFkgOiBldmVudC5jbGllbnRZO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLnN0YXRlLCBkaXJlY3Rpb24gPSBfYi5kaXJlY3Rpb24sIG9yaWdpbmFsID0gX2Iub3JpZ2luYWwsIHdpZHRoID0gX2Iud2lkdGgsIGhlaWdodCA9IF9iLmhlaWdodDtcbiAgICAgICAgdmFyIHBhcmVudFNpemUgPSB0aGlzLmdldFBhcmVudFNpemUoKTtcbiAgICAgICAgdmFyIG1heCA9IGNhbGN1bGF0ZU5ld01heChwYXJlbnRTaXplLCB0aGlzLndpbmRvdy5pbm5lcldpZHRoLCB0aGlzLndpbmRvdy5pbm5lckhlaWdodCwgbWF4V2lkdGgsIG1heEhlaWdodCwgbWluV2lkdGgsIG1pbkhlaWdodCk7XG4gICAgICAgIG1heFdpZHRoID0gbWF4Lm1heFdpZHRoO1xuICAgICAgICBtYXhIZWlnaHQgPSBtYXgubWF4SGVpZ2h0O1xuICAgICAgICBtaW5XaWR0aCA9IG1heC5taW5XaWR0aDtcbiAgICAgICAgbWluSGVpZ2h0ID0gbWF4Lm1pbkhlaWdodDtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzaXplXG4gICAgICAgIHZhciBfYyA9IHRoaXMuY2FsY3VsYXRlTmV3U2l6ZUZyb21EaXJlY3Rpb24oY2xpZW50WCwgY2xpZW50WSksIG5ld0hlaWdodCA9IF9jLm5ld0hlaWdodCwgbmV3V2lkdGggPSBfYy5uZXdXaWR0aDtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG1heCBzaXplIGZyb20gYm91bmRhcnkgc2V0dGluZ3NcbiAgICAgICAgdmFyIGJvdW5kYXJ5TWF4ID0gdGhpcy5jYWxjdWxhdGVOZXdNYXhGcm9tQm91bmRhcnkobWF4V2lkdGgsIG1heEhlaWdodCk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNuYXAgJiYgdGhpcy5wcm9wcy5zbmFwLngpIHtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gZmluZENsb3Nlc3RTbmFwKG5ld1dpZHRoLCB0aGlzLnByb3BzLnNuYXAueCwgdGhpcy5wcm9wcy5zbmFwR2FwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zbmFwICYmIHRoaXMucHJvcHMuc25hcC55KSB7XG4gICAgICAgICAgICBuZXdIZWlnaHQgPSBmaW5kQ2xvc2VzdFNuYXAobmV3SGVpZ2h0LCB0aGlzLnByb3BzLnNuYXAueSwgdGhpcy5wcm9wcy5zbmFwR2FwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYWxjdWxhdGUgbmV3IHNpemUgZnJvbSBhc3BlY3QgcmF0aW9cbiAgICAgICAgdmFyIG5ld1NpemUgPSB0aGlzLmNhbGN1bGF0ZU5ld1NpemVGcm9tQXNwZWN0UmF0aW8obmV3V2lkdGgsIG5ld0hlaWdodCwgeyB3aWR0aDogYm91bmRhcnlNYXgubWF4V2lkdGgsIGhlaWdodDogYm91bmRhcnlNYXgubWF4SGVpZ2h0IH0sIHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9KTtcbiAgICAgICAgbmV3V2lkdGggPSBuZXdTaXplLm5ld1dpZHRoO1xuICAgICAgICBuZXdIZWlnaHQgPSBuZXdTaXplLm5ld0hlaWdodDtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZ3JpZCkge1xuICAgICAgICAgICAgdmFyIG5ld0dyaWRXaWR0aCA9IHNuYXAobmV3V2lkdGgsIHRoaXMucHJvcHMuZ3JpZFswXSk7XG4gICAgICAgICAgICB2YXIgbmV3R3JpZEhlaWdodCA9IHNuYXAobmV3SGVpZ2h0LCB0aGlzLnByb3BzLmdyaWRbMV0pO1xuICAgICAgICAgICAgdmFyIGdhcCA9IHRoaXMucHJvcHMuc25hcEdhcCB8fCAwO1xuICAgICAgICAgICAgdmFyIHcgPSBnYXAgPT09IDAgfHwgTWF0aC5hYnMobmV3R3JpZFdpZHRoIC0gbmV3V2lkdGgpIDw9IGdhcCA/IG5ld0dyaWRXaWR0aCA6IG5ld1dpZHRoO1xuICAgICAgICAgICAgdmFyIGggPSBnYXAgPT09IDAgfHwgTWF0aC5hYnMobmV3R3JpZEhlaWdodCAtIG5ld0hlaWdodCkgPD0gZ2FwID8gbmV3R3JpZEhlaWdodCA6IG5ld0hlaWdodDtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gdztcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IGg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlbHRhID0ge1xuICAgICAgICAgICAgd2lkdGg6IG5ld1dpZHRoIC0gb3JpZ2luYWwud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IG5ld0hlaWdodCAtIG9yaWdpbmFsLmhlaWdodCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHdpZHRoICYmIHR5cGVvZiB3aWR0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh3aWR0aC5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSAobmV3V2lkdGggLyBwYXJlbnRTaXplLndpZHRoKSAqIDEwMDtcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHBlcmNlbnQgKyBcIiVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdpZHRoLmVuZHNXaXRoKCd2dycpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZ3ID0gKG5ld1dpZHRoIC8gdGhpcy53aW5kb3cuaW5uZXJXaWR0aCkgKiAxMDA7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSB2dyArIFwidndcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdpZHRoLmVuZHNXaXRoKCd2aCcpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZoID0gKG5ld1dpZHRoIC8gdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQpICogMTAwO1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gdmggKyBcInZoXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlaWdodCAmJiB0eXBlb2YgaGVpZ2h0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGhlaWdodC5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSAobmV3SGVpZ2h0IC8gcGFyZW50U2l6ZS5oZWlnaHQpICogMTAwO1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IHBlcmNlbnQgKyBcIiVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhlaWdodC5lbmRzV2l0aCgndncnKSkge1xuICAgICAgICAgICAgICAgIHZhciB2dyA9IChuZXdIZWlnaHQgLyB0aGlzLndpbmRvdy5pbm5lcldpZHRoKSAqIDEwMDtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSB2dyArIFwidndcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhlaWdodC5lbmRzV2l0aCgndmgnKSkge1xuICAgICAgICAgICAgICAgIHZhciB2aCA9IChuZXdIZWlnaHQgLyB0aGlzLndpbmRvdy5pbm5lckhlaWdodCkgKiAxMDA7XG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gdmggKyBcInZoXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMuY3JlYXRlU2l6ZUZvckNzc1Byb3BlcnR5KG5ld1dpZHRoLCAnd2lkdGgnKSxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5jcmVhdGVTaXplRm9yQ3NzUHJvcGVydHkobmV3SGVpZ2h0LCAnaGVpZ2h0JyksXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmZsZXhEaXIgPT09ICdyb3cnKSB7XG4gICAgICAgICAgICBuZXdTdGF0ZS5mbGV4QmFzaXMgPSBuZXdTdGF0ZS53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZsZXhEaXIgPT09ICdjb2x1bW4nKSB7XG4gICAgICAgICAgICBuZXdTdGF0ZS5mbGV4QmFzaXMgPSBuZXdTdGF0ZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdpZHRoQ2hhbmdlZCA9IHRoaXMuc3RhdGUud2lkdGggIT09IG5ld1N0YXRlLndpZHRoO1xuICAgICAgICB2YXIgaGVpZ2h0Q2hhbmdlZCA9IHRoaXMuc3RhdGUuaGVpZ2h0ICE9PSBuZXdTdGF0ZS5oZWlnaHQ7XG4gICAgICAgIHZhciBmbGV4QmFzZUNoYW5nZWQgPSB0aGlzLnN0YXRlLmZsZXhCYXNpcyAhPT0gbmV3U3RhdGUuZmxleEJhc2lzO1xuICAgICAgICB2YXIgY2hhbmdlZCA9IHdpZHRoQ2hhbmdlZCB8fCBoZWlnaHRDaGFuZ2VkIHx8IGZsZXhCYXNlQ2hhbmdlZDtcbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIC8vIEZvciB2MTgsIHVwZGF0ZSBzdGF0ZSBzeW5jXG4gICAgICAgICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uUmVzaXplKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25SZXNpemUoZXZlbnQsIGRpcmVjdGlvbiwgdGhpcy5yZXNpemFibGUsIGRlbHRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5vbk1vdXNlVXAgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdmFyIF9jID0gdGhpcy5zdGF0ZSwgaXNSZXNpemluZyA9IF9jLmlzUmVzaXppbmcsIGRpcmVjdGlvbiA9IF9jLmRpcmVjdGlvbiwgb3JpZ2luYWwgPSBfYy5vcmlnaW5hbDtcbiAgICAgICAgaWYgKCFpc1Jlc2l6aW5nIHx8ICF0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZWx0YSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnNpemUud2lkdGggLSBvcmlnaW5hbC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5zaXplLmhlaWdodCAtIG9yaWdpbmFsLmhlaWdodCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25SZXNpemVTdG9wKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uUmVzaXplU3RvcChldmVudCwgZGlyZWN0aW9uLCB0aGlzLnJlc2l6YWJsZSwgZGVsdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB3aWR0aDogKF9hID0gdGhpcy5wcm9wcy5zaXplLndpZHRoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnYXV0bycsIGhlaWdodDogKF9iID0gdGhpcy5wcm9wcy5zaXplLmhlaWdodCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJ2F1dG8nIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudW5iaW5kRXZlbnRzKCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kU3R5bGU6IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLnN0YXRlLmJhY2tncm91bmRTdHlsZSksIHsgY3Vyc29yOiAnYXV0bycgfSksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS51cGRhdGVTaXplID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHdpZHRoOiAoX2EgPSBzaXplLndpZHRoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnYXV0bycsIGhlaWdodDogKF9iID0gc2l6ZS5oZWlnaHQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICdhdXRvJyB9KTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUucmVuZGVyUmVzaXplciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgZW5hYmxlID0gX2EuZW5hYmxlLCBoYW5kbGVTdHlsZXMgPSBfYS5oYW5kbGVTdHlsZXMsIGhhbmRsZUNsYXNzZXMgPSBfYS5oYW5kbGVDbGFzc2VzLCBoYW5kbGVXcmFwcGVyU3R5bGUgPSBfYS5oYW5kbGVXcmFwcGVyU3R5bGUsIGhhbmRsZVdyYXBwZXJDbGFzcyA9IF9hLmhhbmRsZVdyYXBwZXJDbGFzcywgaGFuZGxlQ29tcG9uZW50ID0gX2EuaGFuZGxlQ29tcG9uZW50O1xuICAgICAgICBpZiAoIWVuYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc2l6ZXJzID0gT2JqZWN0LmtleXMoZW5hYmxlKS5tYXAoZnVuY3Rpb24gKGRpcikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZVtkaXJdICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVyLCB7IGtleTogZGlyLCBkaXJlY3Rpb246IGRpciwgb25SZXNpemVTdGFydDogX3RoaXMub25SZXNpemVTdGFydCwgcmVwbGFjZVN0eWxlczogaGFuZGxlU3R5bGVzICYmIGhhbmRsZVN0eWxlc1tkaXJdLCBjbGFzc05hbWU6IGhhbmRsZUNsYXNzZXMgJiYgaGFuZGxlQ2xhc3Nlc1tkaXJdIH0sIGhhbmRsZUNvbXBvbmVudCAmJiBoYW5kbGVDb21wb25lbnRbZGlyXSA/IGhhbmRsZUNvbXBvbmVudFtkaXJdIDogbnVsbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyAjOTMgV3JhcCB0aGUgcmVzaXplIGJveCBpbiBzcGFuICh3aWxsIG5vdCBicmVhayAxMDAlIHdpZHRoL2hlaWdodClcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBoYW5kbGVXcmFwcGVyQ2xhc3MsIHN0eWxlOiBoYW5kbGVXcmFwcGVyU3R5bGUgfSwgcmVzaXplcnMpKTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZXh0ZW5kc1Byb3BzID0gT2JqZWN0LmtleXModGhpcy5wcm9wcykucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICAgICAgaWYgKGRlZmluZWRQcm9wcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjY1trZXldID0gX3RoaXMucHJvcHNba2V5XTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgdmFyIHN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oeyBwb3NpdGlvbjogJ3JlbGF0aXZlJywgdXNlclNlbGVjdDogdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nID8gJ25vbmUnIDogJ2F1dG8nIH0sIHRoaXMucHJvcHMuc3R5bGUpLCB0aGlzLnNpemVTdHlsZSksIHsgbWF4V2lkdGg6IHRoaXMucHJvcHMubWF4V2lkdGgsIG1heEhlaWdodDogdGhpcy5wcm9wcy5tYXhIZWlnaHQsIG1pbldpZHRoOiB0aGlzLnByb3BzLm1pbldpZHRoLCBtaW5IZWlnaHQ6IHRoaXMucHJvcHMubWluSGVpZ2h0LCBib3hTaXppbmc6ICdib3JkZXItYm94JywgZmxleFNocmluazogMCB9KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZmxleEJhc2lzKSB7XG4gICAgICAgICAgICBzdHlsZS5mbGV4QmFzaXMgPSB0aGlzLnN0YXRlLmZsZXhCYXNpcztcbiAgICAgICAgfVxuICAgICAgICB2YXIgV3JhcHBlciA9IHRoaXMucHJvcHMuYXMgfHwgJ2Rpdic7XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVyLCBfX2Fzc2lnbih7IHN0eWxlOiBzdHlsZSwgY2xhc3NOYW1lOiB0aGlzLnByb3BzLmNsYXNzTmFtZSB9LCBleHRlbmRzUHJvcHMsIHsgXG4gICAgICAgICAgICAvLyBgcmVmYCBpcyBhZnRlciBgZXh0ZW5kc1Byb3BzYCB0byBlbnN1cmUgdGhpcyBvbmUgd2lucyBvdmVyIGEgdmVyc2lvblxuICAgICAgICAgICAgLy8gcGFzc2VkIGluXG4gICAgICAgICAgICByZWY6IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVzaXphYmxlID0gYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IH0pLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBzdHlsZTogdGhpcy5zdGF0ZS5iYWNrZ3JvdW5kU3R5bGUgfSksXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJSZXNpemVyKCkpKTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5kZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGFzOiAnZGl2JyxcbiAgICAgICAgb25SZXNpemVTdGFydDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvblJlc2l6ZTogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvblJlc2l6ZVN0b3A6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgZW5hYmxlOiB7XG4gICAgICAgICAgICB0b3A6IHRydWUsXG4gICAgICAgICAgICByaWdodDogdHJ1ZSxcbiAgICAgICAgICAgIGJvdHRvbTogdHJ1ZSxcbiAgICAgICAgICAgIGxlZnQ6IHRydWUsXG4gICAgICAgICAgICB0b3BSaWdodDogdHJ1ZSxcbiAgICAgICAgICAgIGJvdHRvbVJpZ2h0OiB0cnVlLFxuICAgICAgICAgICAgYm90dG9tTGVmdDogdHJ1ZSxcbiAgICAgICAgICAgIHRvcExlZnQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHN0eWxlOiB7fSxcbiAgICAgICAgZ3JpZDogWzEsIDFdLFxuICAgICAgICBsb2NrQXNwZWN0UmF0aW86IGZhbHNlLFxuICAgICAgICBsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoOiAwLFxuICAgICAgICBsb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodDogMCxcbiAgICAgICAgc2NhbGU6IDEsXG4gICAgICAgIHJlc2l6ZVJhdGlvOiAxLFxuICAgICAgICBzbmFwR2FwOiAwLFxuICAgIH07XG4gICAgcmV0dXJuIFJlc2l6YWJsZTtcbn0oUmVhY3QuUHVyZUNvbXBvbmVudCkpO1xuZXhwb3J0IHsgUmVzaXphYmxlIH07XG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciByb3dTaXplQmFzZSA9IHtcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIGhlaWdodDogJzEwcHgnLFxuICAgIHRvcDogJzBweCcsXG4gICAgbGVmdDogJzBweCcsXG4gICAgY3Vyc29yOiAncm93LXJlc2l6ZScsXG59O1xudmFyIGNvbFNpemVCYXNlID0ge1xuICAgIHdpZHRoOiAnMTBweCcsXG4gICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgdG9wOiAnMHB4JyxcbiAgICBsZWZ0OiAnMHB4JyxcbiAgICBjdXJzb3I6ICdjb2wtcmVzaXplJyxcbn07XG52YXIgZWRnZUJhc2UgPSB7XG4gICAgd2lkdGg6ICcyMHB4JyxcbiAgICBoZWlnaHQ6ICcyMHB4JyxcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbn07XG52YXIgc3R5bGVzID0ge1xuICAgIHRvcDogX19hc3NpZ24oX19hc3NpZ24oe30sIHJvd1NpemVCYXNlKSwgeyB0b3A6ICctNXB4JyB9KSxcbiAgICByaWdodDogX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbFNpemVCYXNlKSwgeyBsZWZ0OiB1bmRlZmluZWQsIHJpZ2h0OiAnLTVweCcgfSksXG4gICAgYm90dG9tOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcm93U2l6ZUJhc2UpLCB7IHRvcDogdW5kZWZpbmVkLCBib3R0b206ICctNXB4JyB9KSxcbiAgICBsZWZ0OiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29sU2l6ZUJhc2UpLCB7IGxlZnQ6ICctNXB4JyB9KSxcbiAgICB0b3BSaWdodDogX19hc3NpZ24oX19hc3NpZ24oe30sIGVkZ2VCYXNlKSwgeyByaWdodDogJy0xMHB4JywgdG9wOiAnLTEwcHgnLCBjdXJzb3I6ICduZS1yZXNpemUnIH0pLFxuICAgIGJvdHRvbVJpZ2h0OiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZWRnZUJhc2UpLCB7IHJpZ2h0OiAnLTEwcHgnLCBib3R0b206ICctMTBweCcsIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSksXG4gICAgYm90dG9tTGVmdDogX19hc3NpZ24oX19hc3NpZ24oe30sIGVkZ2VCYXNlKSwgeyBsZWZ0OiAnLTEwcHgnLCBib3R0b206ICctMTBweCcsIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSksXG4gICAgdG9wTGVmdDogX19hc3NpZ24oX19hc3NpZ24oe30sIGVkZ2VCYXNlKSwgeyBsZWZ0OiAnLTEwcHgnLCB0b3A6ICctMTBweCcsIGN1cnNvcjogJ253LXJlc2l6ZScgfSksXG59O1xudmFyIFJlc2l6ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlc2l6ZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVzaXplcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9uTW91c2VEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uUmVzaXplU3RhcnQoZSwgX3RoaXMucHJvcHMuZGlyZWN0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMub25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uUmVzaXplU3RhcnQoZSwgX3RoaXMucHJvcHMuZGlyZWN0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSZXNpemVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogdGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgJycsIHN0eWxlOiBfX2Fzc2lnbihfX2Fzc2lnbih7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB1c2VyU2VsZWN0OiAnbm9uZScgfSwgc3R5bGVzW3RoaXMucHJvcHMuZGlyZWN0aW9uXSksICh0aGlzLnByb3BzLnJlcGxhY2VTdHlsZXMgfHwge30pKSwgb25Nb3VzZURvd246IHRoaXMub25Nb3VzZURvd24sIG9uVG91Y2hTdGFydDogdGhpcy5vblRvdWNoU3RhcnQgfSwgdGhpcy5wcm9wcy5jaGlsZHJlbikpO1xuICAgIH07XG4gICAgcmV0dXJuIFJlc2l6ZXI7XG59KFJlYWN0LlB1cmVDb21wb25lbnQpKTtcbmV4cG9ydCB7IFJlc2l6ZXIgfTtcbiIsImltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlJztcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHknO1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIHdpdGhTaWRlRWZmZWN0KHJlZHVjZVByb3BzVG9TdGF0ZSwgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKHR5cGVvZiByZWR1Y2VQcm9wc1RvU3RhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVkdWNlUHJvcHNUb1N0YXRlIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmICh0eXBlb2YgV3JhcHBlZENvbXBvbmVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIFdyYXBwZWRDb21wb25lbnQgdG8gYmUgYSBSZWFjdCBjb21wb25lbnQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1vdW50ZWRJbnN0YW5jZXMgPSBbXTtcbiAgICB2YXIgc3RhdGU7XG5cbiAgICBmdW5jdGlvbiBlbWl0Q2hhbmdlKCkge1xuICAgICAgc3RhdGUgPSByZWR1Y2VQcm9wc1RvU3RhdGUobW91bnRlZEluc3RhbmNlcy5tYXAoZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5wcm9wcztcbiAgICAgIH0pKTtcbiAgICAgIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQoc3RhdGUpO1xuICAgIH1cblxuICAgIHZhciBTaWRlRWZmZWN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzTG9vc2UoU2lkZUVmZmVjdCwgX1B1cmVDb21wb25lbnQpO1xuXG4gICAgICBmdW5jdGlvbiBTaWRlRWZmZWN0KCkge1xuICAgICAgICByZXR1cm4gX1B1cmVDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgdG8gdXNlIGRpc3BsYXlOYW1lIG9mIHdyYXBwZWQgY29tcG9uZW50XG4gICAgICBTaWRlRWZmZWN0LnBlZWsgPSBmdW5jdGlvbiBwZWVrKCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9O1xuXG4gICAgICB2YXIgX3Byb3RvID0gU2lkZUVmZmVjdC5wcm90b3R5cGU7XG5cbiAgICAgIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzLnB1c2godGhpcyk7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB2YXIgaW5kZXggPSBtb3VudGVkSW5zdGFuY2VzLmluZGV4T2YodGhpcyk7XG4gICAgICAgIG1vdW50ZWRJbnN0YW5jZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgZW1pdENoYW5nZSgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIHRoaXMucHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFNpZGVFZmZlY3Q7XG4gICAgfShQdXJlQ29tcG9uZW50KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShTaWRlRWZmZWN0LCBcImRpc3BsYXlOYW1lXCIsIFwiU2lkZUVmZmVjdChcIiArIGdldERpc3BsYXlOYW1lKFdyYXBwZWRDb21wb25lbnQpICsgXCIpXCIpO1xuXG4gICAgcmV0dXJuIFNpZGVFZmZlY3Q7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTaWRlRWZmZWN0O1xuIiwiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKFwicmVhY3RcIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wicmVhY3RcIl0sZSk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5SZWFjdENvbmZldHRpPWUocmVxdWlyZShcInJlYWN0XCIpKTp0LlJlYWN0Q29uZmV0dGk9ZSh0LlJlYWN0KX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihyKXtpZihlW3JdKXJldHVybiBlW3JdLmV4cG9ydHM7dmFyIGk9ZVtyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5sPSEwLGkuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciByPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgaSBpbiB0KW4uZChyLGksZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxpKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0yKX0oW2Z1bmN0aW9uKGUsbil7ZS5leHBvcnRzPXR9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj17bGluZWFyOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKnQvcitlfSxlYXNlSW5RdWFkOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKih0Lz1yKSp0K2V9LGVhc2VPdXRRdWFkOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybi0obi1lKSoodC89cikqKHQtMikrZX0sZWFzZUluT3V0UXVhZDpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuKHQvPXIvMik8MT9pLzIqdCp0K2U6LWkvMiooLS10Kih0LTIpLTEpK2V9LGVhc2VJbkN1YmljOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKih0Lz1yKSp0KnQrZX0sZWFzZU91dEN1YmljOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKigodD10L3ItMSkqdCp0KzEpK2V9LGVhc2VJbk91dEN1YmljOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4odC89ci8yKTwxP2kvMip0KnQqdCtlOmkvMiooKHQtPTIpKnQqdCsyKStlfSxlYXNlSW5RdWFydDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSoodC89cikqdCp0KnQrZX0sZWFzZU91dFF1YXJ0OmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybi0obi1lKSooKHQ9dC9yLTEpKnQqdCp0LTEpK2V9LGVhc2VJbk91dFF1YXJ0OmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4odC89ci8yKTwxP2kvMip0KnQqdCp0K2U6LWkvMiooKHQtPTIpKnQqdCp0LTIpK2V9LGVhc2VJblF1aW50OmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKih0Lz1yKSp0KnQqdCp0K2V9LGVhc2VPdXRRdWludDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSooKHQ9dC9yLTEpKnQqdCp0KnQrMSkrZX0sZWFzZUluT3V0UXVpbnQ6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybih0Lz1yLzIpPDE/aS8yKnQqdCp0KnQqdCtlOmkvMiooKHQtPTIpKnQqdCp0KnQrMikrZX0sZWFzZUluU2luZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuLWkqTWF0aC5jb3ModC9yKihNYXRoLlBJLzIpKStpK2V9LGVhc2VPdXRTaW5lOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKk1hdGguc2luKHQvciooTWF0aC5QSS8yKSkrZX0sZWFzZUluT3V0U2luZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4tKG4tZSkvMiooTWF0aC5jb3MoTWF0aC5QSSp0L3IpLTEpK2V9LGVhc2VJbkV4cG86ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIDA9PXQ/ZToobi1lKSpNYXRoLnBvdygyLDEwKih0L3ItMSkpK2V9LGVhc2VPdXRFeHBvOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4gdD09cj9lK2k6aSooMS1NYXRoLnBvdygyLC0xMCp0L3IpKStlfSxlYXNlSW5PdXRFeHBvOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4gMD09PXQ/ZTp0PT09cj9lK2k6KHQvPXIvMik8MT9pLzIqTWF0aC5wb3coMiwxMCoodC0xKSkrZTppLzIqKDItTWF0aC5wb3coMiwtMTAqLS10KSkrZX0sZWFzZUluQ2lyYzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4tKG4tZSkqKE1hdGguc3FydCgxLSh0Lz1yKSp0KS0xKStlfSxlYXNlT3V0Q2lyYzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSpNYXRoLnNxcnQoMS0odD10L3ItMSkqdCkrZX0sZWFzZUluT3V0Q2lyYzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuKHQvPXIvMik8MT8taS8yKihNYXRoLnNxcnQoMS10KnQpLTEpK2U6aS8yKihNYXRoLnNxcnQoMS0odC09MikqdCkrMSkrZX0sZWFzZUluRWxhc3RpYzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLGEsYz1uLWU7cmV0dXJuIGE9MS43MDE1OCwwPT09dD9lOjE9PSh0Lz1yKT9lK2M6KChvPTApfHwobz0uMypyKSwoaT1jKTxNYXRoLmFicyhjKT8oaT1jLGE9by80KTphPW8vKDIqTWF0aC5QSSkqTWF0aC5hc2luKGMvaSksLWkqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0KnItYSkqKDIqTWF0aC5QSSkvbykrZSl9LGVhc2VPdXRFbGFzdGljOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG8sYSxjPW4tZTtyZXR1cm4gYT0xLjcwMTU4LDA9PT10P2U6MT09KHQvPXIpP2UrYzooKG89MCl8fChvPS4zKnIpLChpPWMpPE1hdGguYWJzKGMpPyhpPWMsYT1vLzQpOmE9by8oMipNYXRoLlBJKSpNYXRoLmFzaW4oYy9pKSxpKk1hdGgucG93KDIsLTEwKnQpKk1hdGguc2luKCh0KnItYSkqKDIqTWF0aC5QSSkvbykrYytlKX0sZWFzZUluT3V0RWxhc3RpYzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLGEsYz1uLWU7cmV0dXJuIGE9MS43MDE1OCwwPT09dD9lOjI9PSh0Lz1yLzIpP2UrYzooKG89MCl8fChvPXIqKC4zKjEuNSkpLChpPWMpPE1hdGguYWJzKGMpPyhpPWMsYT1vLzQpOmE9by8oMipNYXRoLlBJKSpNYXRoLmFzaW4oYy9pKSx0PDE/aSpNYXRoLnBvdygyLDEwKih0LT0xKSkqTWF0aC5zaW4oKHQqci1hKSooMipNYXRoLlBJKS9vKSotLjUrZTppKk1hdGgucG93KDIsLTEwKih0LT0xKSkqTWF0aC5zaW4oKHQqci1hKSooMipNYXRoLlBJKS9vKSouNStjK2UpfSxlYXNlSW5CYWNrOmZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIHZvaWQgMD09PWkmJihpPTEuNzAxNTgpLChuLWUpKih0Lz1yKSp0KigoaSsxKSp0LWkpK2V9LGVhc2VPdXRCYWNrOmZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIHZvaWQgMD09PWkmJihpPTEuNzAxNTgpLChuLWUpKigodD10L3ItMSkqdCooKGkrMSkqdCtpKSsxKStlfSxlYXNlSW5PdXRCYWNrOmZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89bi1lO3JldHVybiB2b2lkIDA9PT1pJiYoaT0xLjcwMTU4KSwodC89ci8yKTwxP28vMioodCp0KigoMSsoaSo9MS41MjUpKSp0LWkpKStlOm8vMiooKHQtPTIpKnQqKCgxKyhpKj0xLjUyNSkpKnQraSkrMikrZX0sZWFzZUluQm91bmNlOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvPW4tZTtyZXR1cm4gby1yLmVhc2VPdXRCb3VuY2UoaS10LDAsbyxpKStlfSxlYXNlT3V0Qm91bmNlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4odC89cik8MS8yLjc1P2kqKDcuNTYyNSp0KnQpK2U6dDwyLzIuNzU/aSooNy41NjI1Kih0LT0xLjUvMi43NSkqdCsuNzUpK2U6dDwyLjUvMi43NT9pKig3LjU2MjUqKHQtPTIuMjUvMi43NSkqdCsuOTM3NSkrZTppKig3LjU2MjUqKHQtPTIuNjI1LzIuNzUpKnQrLjk4NDM3NSkrZX0sZWFzZUluT3V0Qm91bmNlOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvPW4tZTtyZXR1cm4gdDxpLzI/LjUqci5lYXNlSW5Cb3VuY2UoMip0LDAsbyxpKStlOi41KnIuZWFzZU91dEJvdW5jZSgyKnQtaSwwLG8saSkrLjUqbytlfX07dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigzKX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKSxuLmQoZSxcIlJlYWN0Q29uZmV0dGlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUX0pKTt2YXIgcixpLG89bigwKSxhPW4ubihvKSxjPW4oMSkscz1uLm4oYyk7ZnVuY3Rpb24gdSh0LGUpe3JldHVybiB0K01hdGgucmFuZG9tKCkqKGUtdCl9ZnVuY3Rpb24gZih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gaCh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9IWZ1bmN0aW9uKHQpe3RbdC5DaXJjbGU9MF09XCJDaXJjbGVcIix0W3QuU3F1YXJlPTFdPVwiU3F1YXJlXCIsdFt0LlN0cmlwPTJdPVwiU3RyaXBcIn0ocnx8KHI9e30pKSxmdW5jdGlvbih0KXt0W3QuUG9zaXRpdmU9MV09XCJQb3NpdGl2ZVwiLHRbdC5OZWdhdGl2ZT0tMV09XCJOZWdhdGl2ZVwifShpfHwoaT17fSkpO3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4scixvKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLHQpLGgodGhpcyxcImNvbnRleHRcIix2b2lkIDApLGgodGhpcyxcInJhZGl1c1wiLHZvaWQgMCksaCh0aGlzLFwieFwiLHZvaWQgMCksaCh0aGlzLFwieVwiLHZvaWQgMCksaCh0aGlzLFwid1wiLHZvaWQgMCksaCh0aGlzLFwiaFwiLHZvaWQgMCksaCh0aGlzLFwidnhcIix2b2lkIDApLGgodGhpcyxcInZ5XCIsdm9pZCAwKSxoKHRoaXMsXCJzaGFwZVwiLHZvaWQgMCksaCh0aGlzLFwiYW5nbGVcIix2b2lkIDApLGgodGhpcyxcImFuZ3VsYXJTcGluXCIsdm9pZCAwKSxoKHRoaXMsXCJjb2xvclwiLHZvaWQgMCksaCh0aGlzLFwicm90YXRlWVwiLHZvaWQgMCksaCh0aGlzLFwicm90YXRpb25EaXJlY3Rpb25cIix2b2lkIDApLGgodGhpcyxcImdldE9wdGlvbnNcIix2b2lkIDApLHRoaXMuZ2V0T3B0aW9ucz1uO3ZhciBhLGMscz10aGlzLmdldE9wdGlvbnMoKSxmPXMuY29sb3JzLGw9cy5pbml0aWFsVmVsb2NpdHlYLHA9cy5pbml0aWFsVmVsb2NpdHlZO3RoaXMuY29udGV4dD1lLHRoaXMueD1yLHRoaXMueT1vLHRoaXMudz11KDUsMjApLHRoaXMuaD11KDUsMjApLHRoaXMucmFkaXVzPXUoNSwxMCksdGhpcy52eD1cIm51bWJlclwiPT10eXBlb2YgbD91KC1sLGwpOnUobC5taW4sbC5tYXgpLHRoaXMudnk9XCJudW1iZXJcIj09dHlwZW9mIHA/dSgtcCwwKTp1KHAubWluLHAubWF4KSx0aGlzLnNoYXBlPShhPTAsYz0yLE1hdGguZmxvb3IoYStNYXRoLnJhbmRvbSgpKihjLWErMSkpKSx0aGlzLmFuZ2xlPXUoMCwzNjApKk1hdGguUEkvMTgwLHRoaXMuYW5ndWxhclNwaW49dSgtLjIsLjIpLHRoaXMuY29sb3I9ZltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZi5sZW5ndGgpXSx0aGlzLnJvdGF0ZVk9dSgwLDEpLHRoaXMucm90YXRpb25EaXJlY3Rpb249dSgwLDEpP2kuUG9zaXRpdmU6aS5OZWdhdGl2ZX12YXIgZSxuLG87cmV0dXJuIGU9dCwobj1be2tleTpcInVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRPcHRpb25zKCksZT10LmdyYXZpdHksbj10LndpbmQsbz10LmZyaWN0aW9uLGE9dC5vcGFjaXR5LGM9dC5kcmF3U2hhcGU7dGhpcy54Kz10aGlzLnZ4LHRoaXMueSs9dGhpcy52eSx0aGlzLnZ5Kz1lLHRoaXMudngrPW4sdGhpcy52eCo9byx0aGlzLnZ5Kj1vLHRoaXMucm90YXRlWT49MSYmdGhpcy5yb3RhdGlvbkRpcmVjdGlvbj09PWkuUG9zaXRpdmU/dGhpcy5yb3RhdGlvbkRpcmVjdGlvbj1pLk5lZ2F0aXZlOnRoaXMucm90YXRlWTw9LTEmJnRoaXMucm90YXRpb25EaXJlY3Rpb249PT1pLk5lZ2F0aXZlJiYodGhpcy5yb3RhdGlvbkRpcmVjdGlvbj1pLlBvc2l0aXZlKTt2YXIgcz0uMSp0aGlzLnJvdGF0aW9uRGlyZWN0aW9uO2lmKHRoaXMucm90YXRlWSs9cyx0aGlzLmFuZ2xlKz10aGlzLmFuZ3VsYXJTcGluLHRoaXMuY29udGV4dC5zYXZlKCksdGhpcy5jb250ZXh0LnRyYW5zbGF0ZSh0aGlzLngsdGhpcy55KSx0aGlzLmNvbnRleHQucm90YXRlKHRoaXMuYW5nbGUpLHRoaXMuY29udGV4dC5zY2FsZSgxLHRoaXMucm90YXRlWSksdGhpcy5jb250ZXh0LnJvdGF0ZSh0aGlzLmFuZ2xlKSx0aGlzLmNvbnRleHQuYmVnaW5QYXRoKCksdGhpcy5jb250ZXh0LmZpbGxTdHlsZT10aGlzLmNvbG9yLHRoaXMuY29udGV4dC5zdHJva2VTdHlsZT10aGlzLmNvbG9yLHRoaXMuY29udGV4dC5nbG9iYWxBbHBoYT1hLHRoaXMuY29udGV4dC5saW5lQ2FwPVwicm91bmRcIix0aGlzLmNvbnRleHQubGluZVdpZHRoPTIsYyYmXCJmdW5jdGlvblwiPT10eXBlb2YgYyljLmNhbGwodGhpcyx0aGlzLmNvbnRleHQpO2Vsc2Ugc3dpdGNoKHRoaXMuc2hhcGUpe2Nhc2Ugci5DaXJjbGU6dGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpLHRoaXMuY29udGV4dC5hcmMoMCwwLHRoaXMucmFkaXVzLDAsMipNYXRoLlBJKSx0aGlzLmNvbnRleHQuZmlsbCgpO2JyZWFrO2Nhc2Ugci5TcXVhcmU6dGhpcy5jb250ZXh0LmZpbGxSZWN0KC10aGlzLncvMiwtdGhpcy5oLzIsdGhpcy53LHRoaXMuaCk7YnJlYWs7Y2FzZSByLlN0cmlwOnRoaXMuY29udGV4dC5maWxsUmVjdCgtdGhpcy53LzYsLXRoaXMuaC8yLHRoaXMudy8zLHRoaXMuaCl9dGhpcy5jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuY29udGV4dC5yZXN0b3JlKCl9fV0pJiZmKGUucHJvdG90eXBlLG4pLG8mJmYoZSxvKSx0fSgpO2Z1bmN0aW9uIHAodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fXZhciB2PWZ1bmN0aW9uIHQoZSxuKXt2YXIgcj10aGlzOyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsdCkscCh0aGlzLFwiY2FudmFzXCIsdm9pZCAwKSxwKHRoaXMsXCJjb250ZXh0XCIsdm9pZCAwKSxwKHRoaXMsXCJnZXRPcHRpb25zXCIsdm9pZCAwKSxwKHRoaXMsXCJ4XCIsMCkscCh0aGlzLFwieVwiLDApLHAodGhpcyxcIndcIiwwKSxwKHRoaXMsXCJoXCIsMCkscCh0aGlzLFwibGFzdE51bWJlck9mUGllY2VzXCIsMCkscCh0aGlzLFwidHdlZW5Jbml0VGltZVwiLERhdGUubm93KCkpLHAodGhpcyxcInBhcnRpY2xlc1wiLFtdKSxwKHRoaXMsXCJwYXJ0aWNsZXNHZW5lcmF0ZWRcIiwwKSxwKHRoaXMsXCJyZW1vdmVQYXJ0aWNsZUF0XCIsKGZ1bmN0aW9uKHQpe3IucGFydGljbGVzLnNwbGljZSh0LDEpfSkpLHAodGhpcyxcImdldFBhcnRpY2xlXCIsKGZ1bmN0aW9uKCl7dmFyIHQ9dShyLngsci53K3IueCksZT11KHIueSxyLmgrci55KTtyZXR1cm4gbmV3IGwoci5jb250ZXh0LHIuZ2V0T3B0aW9ucyx0LGUpfSkpLHAodGhpcyxcImFuaW1hdGVcIiwoZnVuY3Rpb24oKXt2YXIgdD1yLmNhbnZhcyxlPXIuY29udGV4dCxuPXIucGFydGljbGVzR2VuZXJhdGVkLGk9ci5sYXN0TnVtYmVyT2ZQaWVjZXMsbz1yLmdldE9wdGlvbnMoKSxhPW8ucnVuLGM9by5yZWN5Y2xlLHM9by5udW1iZXJPZlBpZWNlcyx1PW8uZGVidWcsZj1vLnR3ZWVuRnVuY3Rpb24saD1vLnR3ZWVuRHVyYXRpb247aWYoIWEpcmV0dXJuITE7dmFyIGw9ci5wYXJ0aWNsZXMubGVuZ3RoLHA9Yz9sOm4sdj1EYXRlLm5vdygpO2lmKHA8cyl7aSE9PXMmJihyLnR3ZWVuSW5pdFRpbWU9dixyLmxhc3ROdW1iZXJPZlBpZWNlcz1zKTtmb3IodmFyIHk9ci50d2VlbkluaXRUaW1lLGQ9Zih2LXk+aD9oOk1hdGgubWF4KDAsdi15KSxwLHMsaCksYj1NYXRoLnJvdW5kKGQtcCksZz0wO2c8YjtnKyspci5wYXJ0aWNsZXMucHVzaChyLmdldFBhcnRpY2xlKCkpO3IucGFydGljbGVzR2VuZXJhdGVkKz1ifXJldHVybiB1JiYoZS5mb250PVwiMTJweCBzYW5zLXNlcmlmXCIsZS5maWxsU3R5bGU9XCIjMzMzXCIsZS50ZXh0QWxpZ249XCJyaWdodFwiLGUuZmlsbFRleHQoXCJQYXJ0aWNsZXM6IFwiLmNvbmNhdChsKSx0LndpZHRoLTEwLHQuaGVpZ2h0LTIwKSksci5wYXJ0aWNsZXMuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXtlLnVwZGF0ZSgpLChlLnk+dC5oZWlnaHR8fGUueTwtMTAwfHxlLng+dC53aWR0aCsxMDB8fGUueDwtMTAwKSYmKGMmJnA8PXM/ci5wYXJ0aWNsZXNbbl09ci5nZXRQYXJ0aWNsZSgpOnIucmVtb3ZlUGFydGljbGVBdChuKSl9KSksbD4wfHxwPHN9KSksdGhpcy5jYW52YXM9ZTt2YXIgaT10aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7aWYoIWkpdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGdldCBjYW52YXMgY29udGV4dFwiKTt0aGlzLmNvbnRleHQ9aSx0aGlzLmdldE9wdGlvbnM9bn07ZnVuY3Rpb24geSh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gZCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj95KE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Zyh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6eShPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBiKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBnKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH12YXIgTz17d2lkdGg6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3cuaW5uZXJXaWR0aDozMDAsaGVpZ2h0OlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93LmlubmVySGVpZ2h0OjIwMCxudW1iZXJPZlBpZWNlczoyMDAsZnJpY3Rpb246Ljk5LHdpbmQ6MCxncmF2aXR5Oi4xLGluaXRpYWxWZWxvY2l0eVg6NCxpbml0aWFsVmVsb2NpdHlZOjEwLGNvbG9yczpbXCIjZjQ0MzM2XCIsXCIjZTkxZTYzXCIsXCIjOWMyN2IwXCIsXCIjNjczYWI3XCIsXCIjM2Y1MWI1XCIsXCIjMjE5NmYzXCIsXCIjMDNhOWY0XCIsXCIjMDBiY2Q0XCIsXCIjMDA5Njg4XCIsXCIjNENBRjUwXCIsXCIjOEJDMzRBXCIsXCIjQ0REQzM5XCIsXCIjRkZFQjNCXCIsXCIjRkZDMTA3XCIsXCIjRkY5ODAwXCIsXCIjRkY1NzIyXCIsXCIjNzk1NTQ4XCJdLG9wYWNpdHk6MSxkZWJ1ZzohMSx0d2VlbkZ1bmN0aW9uOnMuYS5lYXNlSW5PdXRRdWFkLHR3ZWVuRHVyYXRpb246NWUzLHJlY3ljbGU6ITAscnVuOiEwfSx3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe3ZhciByPXRoaXM7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0odGhpcyx0KSxnKHRoaXMsXCJjYW52YXNcIix2b2lkIDApLGcodGhpcyxcImNvbnRleHRcIix2b2lkIDApLGcodGhpcyxcIl9vcHRpb25zXCIsdm9pZCAwKSxnKHRoaXMsXCJnZW5lcmF0b3JcIix2b2lkIDApLGcodGhpcyxcInJhZklkXCIsdm9pZCAwKSxnKHRoaXMsXCJzZXRPcHRpb25zV2l0aERlZmF1bHRzXCIsKGZ1bmN0aW9uKHQpe3ZhciBlPXtjb25mZXR0aVNvdXJjZTp7eDowLHk6MCx3OnIuY2FudmFzLndpZHRoLGg6MH19O3IuX29wdGlvbnM9ZChkKGQoe30sZSksTyksdCksT2JqZWN0LmFzc2lnbihyLHQuY29uZmV0dGlTb3VyY2UpfSkpLGcodGhpcyxcInVwZGF0ZVwiLChmdW5jdGlvbigpe3ZhciB0PXIub3B0aW9ucyxlPXQucnVuLG49dC5vbkNvbmZldHRpQ29tcGxldGUsaT1yLmNhbnZhcyxvPXIuY29udGV4dDtlJiYoby5maWxsU3R5bGU9XCJ3aGl0ZVwiLG8uY2xlYXJSZWN0KDAsMCxpLndpZHRoLGkuaGVpZ2h0KSksci5nZW5lcmF0b3IuYW5pbWF0ZSgpP3IucmFmSWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIudXBkYXRlKToobiYmXCJmdW5jdGlvblwiPT10eXBlb2YgbiYmci5nZW5lcmF0b3IucGFydGljbGVzR2VuZXJhdGVkPjAmJm4uY2FsbChyLHIpLHIuX29wdGlvbnMucnVuPSExKX0pKSxnKHRoaXMsXCJyZXNldFwiLChmdW5jdGlvbigpe3IuZ2VuZXJhdG9yJiZyLmdlbmVyYXRvci5wYXJ0aWNsZXNHZW5lcmF0ZWQ+MCYmKHIuZ2VuZXJhdG9yLnBhcnRpY2xlc0dlbmVyYXRlZD0wLHIuZ2VuZXJhdG9yLnBhcnRpY2xlcz1bXSxyLmdlbmVyYXRvci5sYXN0TnVtYmVyT2ZQaWVjZXM9MCl9KSksZyh0aGlzLFwic3RvcFwiLChmdW5jdGlvbigpe3Iub3B0aW9ucz17cnVuOiExfSxyLnJhZklkJiYoY2FuY2VsQW5pbWF0aW9uRnJhbWUoci5yYWZJZCksci5yYWZJZD12b2lkIDApfSkpLHRoaXMuY2FudmFzPWU7dmFyIGk9dGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO2lmKCFpKXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBnZXQgY2FudmFzIGNvbnRleHRcIik7dGhpcy5jb250ZXh0PWksdGhpcy5nZW5lcmF0b3I9bmV3IHYodGhpcy5jYW52YXMsKGZ1bmN0aW9uKCl7cmV0dXJuIHIub3B0aW9uc30pKSx0aGlzLm9wdGlvbnM9bix0aGlzLnVwZGF0ZSgpfXZhciBlLG4scjtyZXR1cm4gZT10LChuPVt7a2V5Olwib3B0aW9uc1wiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcHRpb25zfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5ydW4sbj10aGlzLl9vcHRpb25zJiZ0aGlzLl9vcHRpb25zLnJlY3ljbGU7dGhpcy5zZXRPcHRpb25zV2l0aERlZmF1bHRzKHQpLHRoaXMuZ2VuZXJhdG9yJiYoT2JqZWN0LmFzc2lnbih0aGlzLmdlbmVyYXRvcix0aGlzLm9wdGlvbnMuY29uZmV0dGlTb3VyY2UpLFwiYm9vbGVhblwiPT10eXBlb2YgdC5yZWN5Y2xlJiZ0LnJlY3ljbGUmJiExPT09biYmKHRoaXMuZ2VuZXJhdG9yLmxhc3ROdW1iZXJPZlBpZWNlcz10aGlzLmdlbmVyYXRvci5wYXJ0aWNsZXMubGVuZ3RoKSksXCJib29sZWFuXCI9PXR5cGVvZiB0LnJ1biYmdC5ydW4mJiExPT09ZSYmdGhpcy51cGRhdGUoKX19XSkmJmIoZS5wcm90b3R5cGUsbiksciYmYihlLHIpLHR9KCk7ZnVuY3Rpb24gbSh0KXtyZXR1cm4gZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gQyh0KX0odCl8fGZ1bmN0aW9uKHQpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpcmV0dXJuIEFycmF5LmZyb20odCl9KHQpfHxTKHQpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfSgpfWZ1bmN0aW9uIHgodCl7cmV0dXJuKHg9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIFAoKXtyZXR1cm4oUD1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGoodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIE0odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/aihPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe1QodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOmooT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gSSh0LGUpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fSh0KXx8ZnVuY3Rpb24odCxlKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpKXJldHVybjt2YXIgbj1bXSxyPSEwLGk9ITEsbz12b2lkIDA7dHJ5e2Zvcih2YXIgYSxjPXRbU3ltYm9sLml0ZXJhdG9yXSgpOyEocj0oYT1jLm5leHQoKSkuZG9uZSkmJihuLnB1c2goYS52YWx1ZSksIWV8fG4ubGVuZ3RoIT09ZSk7cj0hMCk7fWNhdGNoKHQpe2k9ITAsbz10fWZpbmFsbHl7dHJ5e3J8fG51bGw9PWMucmV0dXJufHxjLnJldHVybigpfWZpbmFsbHl7aWYoaSl0aHJvdyBvfX1yZXR1cm4gbn0odCxlKXx8Uyh0LGUpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gUyh0LGUpe2lmKHQpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXJldHVybiBDKHQsZSk7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO3JldHVyblwiT2JqZWN0XCI9PT1uJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLFwiTWFwXCI9PT1ufHxcIlNldFwiPT09bj9BcnJheS5mcm9tKHQpOlwiQXJndW1lbnRzXCI9PT1ufHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKT9DKHQsZSk6dm9pZCAwfX1mdW5jdGlvbiBDKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gRCh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gRSh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gXyh0LGUpe3JldHVybihfPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiBSKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Rih0KTtpZihlKXt2YXIgaT1GKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBrKHRoaXMsbil9fWZ1bmN0aW9uIGsodCxlKXtyZXR1cm4hZXx8XCJvYmplY3RcIiE9PXgoZSkmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/QSh0KTplfWZ1bmN0aW9uIEEodCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9ZnVuY3Rpb24gRih0KXtyZXR1cm4oRj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gVCh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9dmFyIEI9YS5hLmNyZWF0ZVJlZigpLE49ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZfKHQsZSl9KG8sdCk7dmFyIGUsbixyLGk9UihvKTtmdW5jdGlvbiBvKHQpe3ZhciBlO0QodGhpcyxvKTtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGM9MTtjPG47YysrKXJbYy0xXT1hcmd1bWVudHNbY107cmV0dXJuIFQoQShlPWkuY2FsbC5hcHBseShpLFt0aGlzLHRdLmNvbmNhdChyKSkpLFwiY2FudmFzXCIsYS5hLmNyZWF0ZVJlZigpKSxUKEEoZSksXCJjb25mZXR0aVwiLHZvaWQgMCksZS5jYW52YXM9dC5jYW52YXNSZWZ8fEIsZX1yZXR1cm4gZT1vLChuPVt7a2V5OlwiY29tcG9uZW50RGlkTW91bnRcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuY2FudmFzLmN1cnJlbnQpe3ZhciB0PXEodGhpcy5wcm9wcylbMF07dGhpcy5jb25mZXR0aT1uZXcgdyh0aGlzLmNhbnZhcy5jdXJyZW50LHQpfX19LHtrZXk6XCJjb21wb25lbnREaWRVcGRhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXEodGhpcy5wcm9wcylbMF07dGhpcy5jb25mZXR0aSYmKHRoaXMuY29uZmV0dGkub3B0aW9ucz10KX19LHtrZXk6XCJjb21wb25lbnRXaWxsVW5tb3VudFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jb25mZXR0aSYmdGhpcy5jb25mZXR0aS5zdG9wKCksdGhpcy5jb25mZXR0aT12b2lkIDB9fSx7a2V5OlwicmVuZGVyXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1JKHEodGhpcy5wcm9wcyksMiksZT10WzBdLG49dFsxXSxyPU0oe3pJbmRleDoyLHBvc2l0aW9uOlwiYWJzb2x1dGVcIixwb2ludGVyRXZlbnRzOlwibm9uZVwiLHRvcDowLGxlZnQ6MCxib3R0b206MCxyaWdodDowfSxuLnN0eWxlKTtyZXR1cm4gYS5hLmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIixQKHt3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodCxyZWY6dGhpcy5jYW52YXN9LG4se3N0eWxlOnJ9KSl9fV0pJiZFKGUucHJvdG90eXBlLG4pLHImJkUoZSxyKSxvfShvLkNvbXBvbmVudCk7ZnVuY3Rpb24gcSh0KXt2YXIgZT17fSxuPXt9LHI9W10uY29uY2F0KG0oT2JqZWN0LmtleXMoTykpLFtcImNvbmZldHRpU291cmNlXCIsXCJkcmF3U2hhcGVcIixcIm9uQ29uZmV0dGlDb21wbGV0ZVwiXSksaT1bXCJjYW52YXNSZWZcIl07Zm9yKHZhciBvIGluIHQpe3ZhciBhPXRbb107ci5pbmNsdWRlcyhvKT9lW29dPWE6aS5pbmNsdWRlcyhvKT9pW29dPWE6bltvXT1hfXJldHVybltlLG4se31dfVQoTixcImRlZmF1bHRQcm9wc1wiLE0oe30sTykpLFQoTixcImRpc3BsYXlOYW1lXCIsXCJSZWFjdENvbmZldHRpXCIpO3ZhciBRPWEuYS5mb3J3YXJkUmVmKChmdW5jdGlvbih0LGUpe3JldHVybiBhLmEuY3JlYXRlRWxlbWVudChOLFAoe2NhbnZhc1JlZjplfSx0KSl9KSk7ZS5kZWZhdWx0PVF9XSkuZGVmYXVsdH0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWN0LWNvbmZldHRpLm1pbi5qcy5tYXAiLCIvKiFcbiAgcmVhY3QtZGF0ZXBpY2tlciB2Ny4zLjBcbiAgaHR0cHM6Ly9naXRodWIuY29tL0hhY2tlcjB4MDEvcmVhY3QtZGF0ZXBpY2tlclxuICBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4qL1xuIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/dChleHBvcnRzLHJlcXVpcmUoXCJjbHN4XCIpLHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwicmVhY3Qtb25jbGlja291dHNpZGVcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZERheXNcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZEhvdXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRNaW51dGVzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRNb250aHNcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZFF1YXJ0ZXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRTZWNvbmRzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRXZWVrc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkWWVhcnNcIikscmVxdWlyZShcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNcIikscmVxdWlyZShcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnNcIikscmVxdWlyZShcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnNcIikscmVxdWlyZShcImRhdGUtZm5zL2VuZE9mRGF5XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9lbmRPZk1vbnRoXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9lbmRPZldlZWtcIikscmVxdWlyZShcImRhdGUtZm5zL2VuZE9mWWVhclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZm9ybWF0XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXREYXRlXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXREYXlcIikscmVxdWlyZShcImRhdGUtZm5zL2dldEhvdXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRJU09XZWVrXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRNaW51dGVzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRNb250aFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0UXVhcnRlclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0U2Vjb25kc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0VGltZVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0WWVhclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNBZnRlclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNCZWZvcmVcIikscmVxdWlyZShcImRhdGUtZm5zL2lzRGF0ZVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNFcXVhbFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNTYW1lRGF5XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc1NhbWVNb250aFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNTYW1lUXVhcnRlclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNTYW1lWWVhclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNWYWxpZFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNXaXRoaW5JbnRlcnZhbFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvbWF4XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9taW5cIikscmVxdWlyZShcImRhdGUtZm5zL3BhcnNlXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9wYXJzZUlTT1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc2V0XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zZXRIb3Vyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc2V0TWludXRlc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc2V0TW9udGhcIikscmVxdWlyZShcImRhdGUtZm5zL3NldFF1YXJ0ZXJcIikscmVxdWlyZShcImRhdGUtZm5zL3NldFNlY29uZHNcIikscmVxdWlyZShcImRhdGUtZm5zL3NldFllYXJcIikscmVxdWlyZShcImRhdGUtZm5zL3N0YXJ0T2ZEYXlcIikscmVxdWlyZShcImRhdGUtZm5zL3N0YXJ0T2ZNb250aFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3RhcnRPZlF1YXJ0ZXJcIikscmVxdWlyZShcImRhdGUtZm5zL3N0YXJ0T2ZXZWVrXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdGFydE9mWWVhclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3ViRGF5c1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3ViTW9udGhzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdWJRdWFydGVyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3ViV2Vla3NcIikscmVxdWlyZShcImRhdGUtZm5zL3N1YlllYXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy90b0RhdGVcIikscmVxdWlyZShcIkBmbG9hdGluZy11aS9yZWFjdFwiKSxyZXF1aXJlKFwicmVhY3QtZG9tXCIpKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImV4cG9ydHNcIixcImNsc3hcIixcInJlYWN0XCIsXCJyZWFjdC1vbmNsaWNrb3V0c2lkZVwiLFwiZGF0ZS1mbnMvYWRkRGF5c1wiLFwiZGF0ZS1mbnMvYWRkSG91cnNcIixcImRhdGUtZm5zL2FkZE1pbnV0ZXNcIixcImRhdGUtZm5zL2FkZE1vbnRoc1wiLFwiZGF0ZS1mbnMvYWRkUXVhcnRlcnNcIixcImRhdGUtZm5zL2FkZFNlY29uZHNcIixcImRhdGUtZm5zL2FkZFdlZWtzXCIsXCJkYXRlLWZucy9hZGRZZWFyc1wiLFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzXCIsXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoc1wiLFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyc1wiLFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFyc1wiLFwiZGF0ZS1mbnMvZW5kT2ZEYXlcIixcImRhdGUtZm5zL2VuZE9mTW9udGhcIixcImRhdGUtZm5zL2VuZE9mV2Vla1wiLFwiZGF0ZS1mbnMvZW5kT2ZZZWFyXCIsXCJkYXRlLWZucy9mb3JtYXRcIixcImRhdGUtZm5zL2dldERhdGVcIixcImRhdGUtZm5zL2dldERheVwiLFwiZGF0ZS1mbnMvZ2V0SG91cnNcIixcImRhdGUtZm5zL2dldElTT1dlZWtcIixcImRhdGUtZm5zL2dldE1pbnV0ZXNcIixcImRhdGUtZm5zL2dldE1vbnRoXCIsXCJkYXRlLWZucy9nZXRRdWFydGVyXCIsXCJkYXRlLWZucy9nZXRTZWNvbmRzXCIsXCJkYXRlLWZucy9nZXRUaW1lXCIsXCJkYXRlLWZucy9nZXRZZWFyXCIsXCJkYXRlLWZucy9pc0FmdGVyXCIsXCJkYXRlLWZucy9pc0JlZm9yZVwiLFwiZGF0ZS1mbnMvaXNEYXRlXCIsXCJkYXRlLWZucy9pc0VxdWFsXCIsXCJkYXRlLWZucy9pc1NhbWVEYXlcIixcImRhdGUtZm5zL2lzU2FtZU1vbnRoXCIsXCJkYXRlLWZucy9pc1NhbWVRdWFydGVyXCIsXCJkYXRlLWZucy9pc1NhbWVZZWFyXCIsXCJkYXRlLWZucy9pc1ZhbGlkXCIsXCJkYXRlLWZucy9pc1dpdGhpbkludGVydmFsXCIsXCJkYXRlLWZucy9tYXhcIixcImRhdGUtZm5zL21pblwiLFwiZGF0ZS1mbnMvcGFyc2VcIixcImRhdGUtZm5zL3BhcnNlSVNPXCIsXCJkYXRlLWZucy9zZXRcIixcImRhdGUtZm5zL3NldEhvdXJzXCIsXCJkYXRlLWZucy9zZXRNaW51dGVzXCIsXCJkYXRlLWZucy9zZXRNb250aFwiLFwiZGF0ZS1mbnMvc2V0UXVhcnRlclwiLFwiZGF0ZS1mbnMvc2V0U2Vjb25kc1wiLFwiZGF0ZS1mbnMvc2V0WWVhclwiLFwiZGF0ZS1mbnMvc3RhcnRPZkRheVwiLFwiZGF0ZS1mbnMvc3RhcnRPZk1vbnRoXCIsXCJkYXRlLWZucy9zdGFydE9mUXVhcnRlclwiLFwiZGF0ZS1mbnMvc3RhcnRPZldlZWtcIixcImRhdGUtZm5zL3N0YXJ0T2ZZZWFyXCIsXCJkYXRlLWZucy9zdWJEYXlzXCIsXCJkYXRlLWZucy9zdWJNb250aHNcIixcImRhdGUtZm5zL3N1YlF1YXJ0ZXJzXCIsXCJkYXRlLWZucy9zdWJXZWVrc1wiLFwiZGF0ZS1mbnMvc3ViWWVhcnNcIixcImRhdGUtZm5zL3RvRGF0ZVwiLFwiQGZsb2F0aW5nLXVpL3JlYWN0XCIsXCJyZWFjdC1kb21cIl0sdCk6dCgoZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOmV8fHNlbGYpLkRhdGVQaWNrZXI9e30sZS5jbHN4LGUuUmVhY3QsZS5vbkNsaWNrT3V0c2lkZSxlLmFkZERheXMsZS5hZGRIb3VycyxlLmFkZE1pbnV0ZXMsZS5hZGRNb250aHMsZS5hZGRRdWFydGVycyxlLmFkZFNlY29uZHMsZS5hZGRXZWVrcyxlLmFkZFllYXJzLGUuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLGUuZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMsZS5kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzLGUuZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyxlLmVuZE9mRGF5LGUuZW5kT2ZNb250aCxlLmVuZE9mV2VlayxlLmVuZE9mWWVhcixlLmZvcm1hdCxlLmdldERhdGUsZS5nZXREYXksZS5nZXRIb3VycyxlLmdldElTT1dlZWssZS5nZXRNaW51dGVzLGUuZ2V0TW9udGgsZS5nZXRRdWFydGVyLGUuZ2V0U2Vjb25kcyxlLmdldFRpbWUsZS5nZXRZZWFyLGUuaXNBZnRlcixlLmlzQmVmb3JlLGUuaXNEYXRlLGUuaXNFcXVhbCQxLGUuaXNTYW1lRGF5JDEsZS5pc1NhbWVNb250aCQxLGUuaXNTYW1lUXVhcnRlciQxLGUuaXNTYW1lWWVhciQxLGUuaXNWYWxpZCQxLGUuaXNXaXRoaW5JbnRlcnZhbCxlLm1heCxlLm1pbixlLnBhcnNlLGUucGFyc2VJU08sZS5zZXQsZS5zZXRIb3VycyxlLnNldE1pbnV0ZXMsZS5zZXRNb250aCxlLnNldFF1YXJ0ZXIsZS5zZXRTZWNvbmRzLGUuc2V0WWVhcixlLnN0YXJ0T2ZEYXksZS5zdGFydE9mTW9udGgsZS5zdGFydE9mUXVhcnRlcixlLnN0YXJ0T2ZXZWVrLGUuc3RhcnRPZlllYXIsZS5zdWJEYXlzLGUuc3ViTW9udGhzLGUuc3ViUXVhcnRlcnMsZS5zdWJXZWVrcyxlLnN1YlllYXJzLGUudG9EYXRlLGUucmVhY3QsZS5SZWFjdERPTSl9KHRoaXMsKGZ1bmN0aW9uKGUsdCxyLG4sYSxvLHMsaSxsLGMscCxkLHUsZixoLG0sdixnLEQseSxrLHcsUyxiLE0sQyxfLEUsUCxZLHgsTixPLEksVCxSLEwsQSxGLEgsVyxRLHEsSyxCLFYsaixVLCQseixYLEcsSixaLGVlLHRlLHJlLG5lLGFlLG9lLHNlLGllLGxlLGNlLHBlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkZShlKXtyZXR1cm4gZSYmXCJvYmplY3RcIj09dHlwZW9mIGUmJlwiZGVmYXVsdFwiaW4gZT9lOntkZWZhdWx0OmV9fXZhciB1ZT1kZShyKSxmZT1kZShuKSxoZT1kZShwZSksbWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbWU9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJihlW3JdPXRbcl0pfSxtZShlLHQpfTtmdW5jdGlvbiB2ZShlLHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiK1N0cmluZyh0KStcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPWV9bWUoZSx0KSxlLnByb3RvdHlwZT1udWxsPT09dD9PYmplY3QuY3JlYXRlKHQpOihyLnByb3RvdHlwZT10LnByb3RvdHlwZSxuZXcgcil9dmFyIGdlPWZ1bmN0aW9uKCl7cmV0dXJuIGdlPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPTEsbj1hcmd1bWVudHMubGVuZ3RoO3I8bjtyKyspZm9yKHZhciBhIGluIHQ9YXJndW1lbnRzW3JdKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGEpJiYoZVthXT10W2FdKTtyZXR1cm4gZX0sZ2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtmdW5jdGlvbiBEZShlLHQscil7aWYocnx8Mj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBuLGE9MCxvPXQubGVuZ3RoO2E8bzthKyspIW4mJmEgaW4gdHx8KG58fChuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQsMCxhKSksblthXT10W2FdKTtyZXR1cm4gZS5jb25jYXQobnx8QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCkpfVwiZnVuY3Rpb25cIj09dHlwZW9mIFN1cHByZXNzZWRFcnJvciYmU3VwcHJlc3NlZEVycm9yO3ZhciB5ZSxrZT1mdW5jdGlvbihlKXt2YXIgdD1lLnNob3dUaW1lU2VsZWN0T25seSxyPXZvaWQgMCE9PXQmJnQsbj1lLnNob3dUaW1lLGE9dm9pZCAwIT09biYmbixvPWUuY2xhc3NOYW1lLHM9ZS5jaGlsZHJlbixpPXI/XCJDaG9vc2UgVGltZVwiOlwiQ2hvb3NlIERhdGVcIi5jb25jYXQoYT9cIiBhbmQgVGltZVwiOlwiXCIpO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOm8scm9sZTpcImRpYWxvZ1wiLFwiYXJpYS1sYWJlbFwiOmksXCJhcmlhLW1vZGFsXCI6XCJ0cnVlXCJ9LHMpfTtmdW5jdGlvbiB3ZSgpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Omdsb2JhbFRoaXN9IWZ1bmN0aW9uKGUpe2UuQXJyb3dVcD1cIkFycm93VXBcIixlLkFycm93RG93bj1cIkFycm93RG93blwiLGUuQXJyb3dMZWZ0PVwiQXJyb3dMZWZ0XCIsZS5BcnJvd1JpZ2h0PVwiQXJyb3dSaWdodFwiLGUuUGFnZVVwPVwiUGFnZVVwXCIsZS5QYWdlRG93bj1cIlBhZ2VEb3duXCIsZS5Ib21lPVwiSG9tZVwiLGUuRW5kPVwiRW5kXCIsZS5FbnRlcj1cIkVudGVyXCIsZS5TcGFjZT1cIiBcIixlLlRhYj1cIlRhYlwiLGUuRXNjYXBlPVwiRXNjYXBlXCIsZS5CYWNrc3BhY2U9XCJCYWNrc3BhY2VcIixlLlg9XCJ4XCJ9KHllfHwoeWU9e30pKTt2YXIgU2U9MTIsYmU9L1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7ZnVuY3Rpb24gTWUoZSl7aWYobnVsbD09ZSlyZXR1cm4gbmV3IERhdGU7dmFyIHQ9XCJzdHJpbmdcIj09dHlwZW9mIGU/Qi5wYXJzZUlTTyhlKTpsZS50b0RhdGUoZSk7cmV0dXJuIENlKHQpP3Q6bmV3IERhdGV9ZnVuY3Rpb24gQ2UoZSx0KXtyZXR1cm4gSC5pc1ZhbGlkKGUpJiYhTy5pc0JlZm9yZShlLG51bGwhPXQ/dDpuZXcgRGF0ZShcIjEvMS8xODAwXCIpKX1mdW5jdGlvbiBfZShlLHQscil7aWYoXCJlblwiPT09cilyZXR1cm4gay5mb3JtYXQoZSx0LHt1c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnM6ITAsdXNlQWRkaXRpb25hbERheU9mWWVhclRva2VuczohMH0pO3ZhciBuPXI/S2Uocik6dm9pZCAwO3JldHVybiByJiYhbiYmY29uc29sZS53YXJuKCdBIGxvY2FsZSBvYmplY3Qgd2FzIG5vdCBmb3VuZCBmb3IgdGhlIHByb3ZpZGVkIHN0cmluZyBbXCInLmNvbmNhdChyLCdcIl0uJykpLCFuJiZxZSgpJiZLZShxZSgpKSYmKG49S2UocWUoKSkpLGsuZm9ybWF0KGUsdCx7bG9jYWxlOm4sdXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zOiEwLHVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnM6ITB9KX1mdW5jdGlvbiBFZShlLHQpe3ZhciByPXQuZGF0ZUZvcm1hdCxuPXQubG9jYWxlLGE9QXJyYXkuaXNBcnJheShyKSYmci5sZW5ndGg+MD9yWzBdOnI7cmV0dXJuIGUmJl9lKGUsYSxuKXx8XCJcIn1mdW5jdGlvbiBQZShlLHQpe3ZhciByPXQuaG91cixuPXZvaWQgMD09PXI/MDpyLGE9dC5taW51dGUsbz12b2lkIDA9PT1hPzA6YSxzPXQuc2Vjb25kLGk9dm9pZCAwPT09cz8wOnM7cmV0dXJuIGouc2V0SG91cnMoVS5zZXRNaW51dGVzKFguc2V0U2Vjb25kcyhlLGkpLG8pLG4pfWZ1bmN0aW9uIFllKGUpe3JldHVybiBKLnN0YXJ0T2ZEYXkoZSl9ZnVuY3Rpb24geGUoZSx0LHIpe3ZhciBuPUtlKHR8fHFlKCkpO3JldHVybiB0ZS5zdGFydE9mV2VlayhlLHtsb2NhbGU6bix3ZWVrU3RhcnRzT246cn0pfWZ1bmN0aW9uIE5lKGUpe3JldHVybiBaLnN0YXJ0T2ZNb250aChlKX1mdW5jdGlvbiBPZShlKXtyZXR1cm4gcmUuc3RhcnRPZlllYXIoZSl9ZnVuY3Rpb24gSWUoZSl7cmV0dXJuIGVlLnN0YXJ0T2ZRdWFydGVyKGUpfWZ1bmN0aW9uIFRlKCl7cmV0dXJuIEouc3RhcnRPZkRheShNZSgpKX1mdW5jdGlvbiBSZShlKXtyZXR1cm4gdi5lbmRPZkRheShlKX1mdW5jdGlvbiBMZShlLHQpe3JldHVybiBlJiZ0P0YuaXNTYW1lWWVhcihlLHQpOiFlJiYhdH1mdW5jdGlvbiBBZShlLHQpe3JldHVybiBlJiZ0P0wuaXNTYW1lTW9udGgoZSx0KTohZSYmIXR9ZnVuY3Rpb24gRmUoZSx0KXtyZXR1cm4gZSYmdD9BLmlzU2FtZVF1YXJ0ZXIoZSx0KTohZSYmIXR9ZnVuY3Rpb24gSGUoZSx0KXtyZXR1cm4gZSYmdD9SLmlzU2FtZURheShlLHQpOiFlJiYhdH1mdW5jdGlvbiBXZShlLHQpe3JldHVybiBlJiZ0P1QuaXNFcXVhbChlLHQpOiFlJiYhdH1mdW5jdGlvbiBRZShlLHQscil7dmFyIG4sYT1KLnN0YXJ0T2ZEYXkodCksbz12LmVuZE9mRGF5KHIpO3RyeXtuPVcuaXNXaXRoaW5JbnRlcnZhbChlLHtzdGFydDphLGVuZDpvfSl9Y2F0Y2goZSl7bj0hMX1yZXR1cm4gbn1mdW5jdGlvbiBxZSgpe3JldHVybiB3ZSgpLl9fbG9jYWxlSWRfX31mdW5jdGlvbiBLZShlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSl7dmFyIHQ9d2UoKTtyZXR1cm4gdC5fX2xvY2FsZURhdGFfXz90Ll9fbG9jYWxlRGF0YV9fW2VdOnZvaWQgMH1yZXR1cm4gZX1mdW5jdGlvbiBCZShlLHQpe3JldHVybiBfZSgkLnNldE1vbnRoKE1lKCksZSksXCJMTExMXCIsdCl9ZnVuY3Rpb24gVmUoZSx0KXtyZXR1cm4gX2UoJC5zZXRNb250aChNZSgpLGUpLFwiTExMXCIsdCl9ZnVuY3Rpb24gamUoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLm1heERhdGUsbz1yLmV4Y2x1ZGVEYXRlcyxzPXIuZXhjbHVkZURhdGVJbnRlcnZhbHMsaT1yLmluY2x1ZGVEYXRlcyxsPXIuaW5jbHVkZURhdGVJbnRlcnZhbHMsYz1yLmZpbHRlckRhdGU7cmV0dXJuIHR0KGUse21pbkRhdGU6bixtYXhEYXRlOmF9KXx8byYmby5zb21lKChmdW5jdGlvbih0KXt2YXIgcjtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGU/SGUoZSx0KTpIZShlLG51bGwhPT0ocj10LmRhdGUpJiZ2b2lkIDAhPT1yP3I6bmV3IERhdGUpfSkpfHxzJiZzLnNvbWUoKGZ1bmN0aW9uKHQpe3ZhciByPXQuc3RhcnQsbj10LmVuZDtyZXR1cm4gVy5pc1dpdGhpbkludGVydmFsKGUse3N0YXJ0OnIsZW5kOm59KX0pKXx8aSYmIWkuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEhlKGUsdCl9KSl8fGwmJiFsLnNvbWUoKGZ1bmN0aW9uKHQpe3ZhciByPXQuc3RhcnQsbj10LmVuZDtyZXR1cm4gVy5pc1dpdGhpbkludGVydmFsKGUse3N0YXJ0OnIsZW5kOm59KX0pKXx8YyYmIWMoTWUoZSkpfHwhMX1mdW5jdGlvbiBVZShlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIuZXhjbHVkZURhdGVzLGE9ci5leGNsdWRlRGF0ZUludGVydmFscztyZXR1cm4gYSYmYS5sZW5ndGg+MD9hLnNvbWUoKGZ1bmN0aW9uKHQpe3ZhciByPXQuc3RhcnQsbj10LmVuZDtyZXR1cm4gVy5pc1dpdGhpbkludGVydmFsKGUse3N0YXJ0OnIsZW5kOm59KX0pKTpuJiZuLnNvbWUoKGZ1bmN0aW9uKHQpe3ZhciByO3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT9IZShlLHQpOkhlKGUsbnVsbCE9PShyPXQuZGF0ZSkmJnZvaWQgMCE9PXI/cjpuZXcgRGF0ZSl9KSl8fCExfWZ1bmN0aW9uICRlKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5tYXhEYXRlLG89ci5leGNsdWRlRGF0ZXMscz1yLmluY2x1ZGVEYXRlcyxpPXIuZmlsdGVyRGF0ZTtyZXR1cm4gdHQoZSx7bWluRGF0ZTpuP1ouc3RhcnRPZk1vbnRoKG4pOnZvaWQgMCxtYXhEYXRlOmE/Zy5lbmRPZk1vbnRoKGEpOnZvaWQgMH0pfHwobnVsbD09bz92b2lkIDA6by5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gQWUoZSx0IGluc3RhbmNlb2YgRGF0ZT90OnQuZGF0ZSl9KSkpfHxzJiYhcy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gQWUoZSx0KX0pKXx8aSYmIWkoTWUoZSkpfHwhMX1mdW5jdGlvbiB6ZShlLHQscixuKXt2YXIgYT14LmdldFllYXIoZSksbz1fLmdldE1vbnRoKGUpLHM9eC5nZXRZZWFyKHQpLGk9Xy5nZXRNb250aCh0KSxsPXguZ2V0WWVhcihuKTtyZXR1cm4gYT09PXMmJmE9PT1sP288PXImJnI8PWk6YTxzJiYobD09PWEmJm88PXJ8fGw9PT1zJiZpPj1yfHxsPHMmJmw+YSl9ZnVuY3Rpb24gWGUoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLm1heERhdGUsbz1yLmV4Y2x1ZGVEYXRlcyxzPXIuaW5jbHVkZURhdGVzO3JldHVybiB0dChlLHttaW5EYXRlOm4sbWF4RGF0ZTphfSl8fG8mJm8uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEFlKHQgaW5zdGFuY2VvZiBEYXRlP3Q6dC5kYXRlLGUpfSkpfHxzJiYhcy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gQWUodCxlKX0pKXx8ITF9ZnVuY3Rpb24gR2UoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLm1heERhdGUsbz1yLmV4Y2x1ZGVEYXRlcyxzPXIuaW5jbHVkZURhdGVzLGk9ci5maWx0ZXJEYXRlO3JldHVybiB0dChlLHttaW5EYXRlOm4sbWF4RGF0ZTphfSl8fChudWxsPT1vP3ZvaWQgMDpvLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBGZShlLHQgaW5zdGFuY2VvZiBEYXRlP3Q6dC5kYXRlKX0pKSl8fHMmJiFzLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBGZShlLHQpfSkpfHxpJiYhaShNZShlKSl8fCExfWZ1bmN0aW9uIEplKGUsdCxyKXtpZighdHx8IXIpcmV0dXJuITE7aWYoIUguaXNWYWxpZCh0KXx8IUguaXNWYWxpZChyKSlyZXR1cm4hMTt2YXIgbj14LmdldFllYXIodCksYT14LmdldFllYXIocik7cmV0dXJuIG48PWUmJmE+PWV9ZnVuY3Rpb24gWmUoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLm1heERhdGUsbz1yLmV4Y2x1ZGVEYXRlcyxzPXIuaW5jbHVkZURhdGVzLGk9ci5maWx0ZXJEYXRlLGw9bmV3IERhdGUoZSwwLDEpO3JldHVybiB0dChsLHttaW5EYXRlOm4/cmUuc3RhcnRPZlllYXIobik6dm9pZCAwLG1heERhdGU6YT95LmVuZE9mWWVhcihhKTp2b2lkIDB9KXx8KG51bGw9PW8/dm9pZCAwOm8uc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIExlKGwsZSBpbnN0YW5jZW9mIERhdGU/ZTplLmRhdGUpfSkpKXx8cyYmIXMuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIExlKGwsZSl9KSl8fGkmJiFpKE1lKGwpKXx8ITF9ZnVuY3Rpb24gZXQoZSx0LHIsbil7dmFyIGE9eC5nZXRZZWFyKGUpLG89RS5nZXRRdWFydGVyKGUpLHM9eC5nZXRZZWFyKHQpLGk9RS5nZXRRdWFydGVyKHQpLGw9eC5nZXRZZWFyKG4pO3JldHVybiBhPT09cyYmYT09PWw/bzw9ciYmcjw9aTphPHMmJihsPT09YSYmbzw9cnx8bD09PXMmJmk+PXJ8fGw8cyYmbD5hKX1mdW5jdGlvbiB0dChlLHQpe3ZhciByLG49dm9pZCAwPT09dD97fTp0LGE9bi5taW5EYXRlLG89bi5tYXhEYXRlO3JldHVybiBudWxsIT09KHI9YSYmdS5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSxhKTwwfHxvJiZ1LmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLG8pPjApJiZ2b2lkIDAhPT1yJiZyfWZ1bmN0aW9uIHJ0KGUsdCl7cmV0dXJuIHQuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGIuZ2V0SG91cnModCk9PT1iLmdldEhvdXJzKGUpJiZDLmdldE1pbnV0ZXModCk9PT1DLmdldE1pbnV0ZXMoZSkmJlAuZ2V0U2Vjb25kcyh0KT09PVAuZ2V0U2Vjb25kcyhlKX0pKX1mdW5jdGlvbiBudChlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIuZXhjbHVkZVRpbWVzLGE9ci5pbmNsdWRlVGltZXMsbz1yLmZpbHRlclRpbWU7cmV0dXJuIG4mJnJ0KGUsbil8fGEmJiFydChlLGEpfHxvJiYhbyhlKXx8ITF9ZnVuY3Rpb24gYXQoZSx0KXt2YXIgcj10Lm1pblRpbWUsbj10Lm1heFRpbWU7aWYoIXJ8fCFuKXRocm93IG5ldyBFcnJvcihcIkJvdGggbWluVGltZSBhbmQgbWF4VGltZSBwcm9wcyByZXF1aXJlZFwiKTt2YXIgYT1NZSgpO2E9ai5zZXRIb3VycyhhLGIuZ2V0SG91cnMoZSkpLGE9VS5zZXRNaW51dGVzKGEsQy5nZXRNaW51dGVzKGUpKSxhPVguc2V0U2Vjb25kcyhhLFAuZ2V0U2Vjb25kcyhlKSk7dmFyIG89TWUoKTtvPWouc2V0SG91cnMobyxiLmdldEhvdXJzKHIpKSxvPVUuc2V0TWludXRlcyhvLEMuZ2V0TWludXRlcyhyKSksbz1YLnNldFNlY29uZHMobyxQLmdldFNlY29uZHMocikpO3ZhciBzLGk9TWUoKTtpPWouc2V0SG91cnMoaSxiLmdldEhvdXJzKG4pKSxpPVUuc2V0TWludXRlcyhpLEMuZ2V0TWludXRlcyhuKSksaT1YLnNldFNlY29uZHMoaSxQLmdldFNlY29uZHMobikpO3RyeXtzPSFXLmlzV2l0aGluSW50ZXJ2YWwoYSx7c3RhcnQ6byxlbmQ6aX0pfWNhdGNoKGUpe3M9ITF9cmV0dXJuIHN9ZnVuY3Rpb24gb3QoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLmluY2x1ZGVEYXRlcyxvPWFlLnN1Yk1vbnRocyhlLDEpO3JldHVybiBuJiZmLmRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKG4sbyk+MHx8YSYmYS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIGYuZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoZSxvKT4wfSkpfHwhMX1mdW5jdGlvbiBzdChlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWF4RGF0ZSxhPXIuaW5jbHVkZURhdGVzLG89aS5hZGRNb250aHMoZSwxKTtyZXR1cm4gbiYmZi5kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhvLG4pPjB8fGEmJmEuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBmLmRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKG8sZSk+MH0pKXx8ITF9ZnVuY3Rpb24gaXQoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLmluY2x1ZGVEYXRlcyxvPWllLnN1YlllYXJzKGUsMSk7cmV0dXJuIG4mJm0uZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhuLG8pPjB8fGEmJmEuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBtLmRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMoZSxvKT4wfSkpfHwhMX1mdW5jdGlvbiBsdChlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWF4RGF0ZSxhPXIuaW5jbHVkZURhdGVzLG89ZC5hZGRZZWFycyhlLDEpO3JldHVybiBuJiZtLmRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobyxuKT4wfHxhJiZhLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gbS5kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKG8sZSk+MH0pKXx8ITF9ZnVuY3Rpb24gY3QoZSl7dmFyIHQ9ZS5taW5EYXRlLHI9ZS5pbmNsdWRlRGF0ZXM7aWYociYmdCl7dmFyIG49ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiB1LmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLHQpPj0wfSkpO3JldHVybiBxLm1pbihuKX1yZXR1cm4gcj9xLm1pbihyKTp0fWZ1bmN0aW9uIHB0KGUpe3ZhciB0PWUubWF4RGF0ZSxyPWUuaW5jbHVkZURhdGVzO2lmKHImJnQpe3ZhciBuPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gdS5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSx0KTw9MH0pKTtyZXR1cm4gUS5tYXgobil9cmV0dXJuIHI/US5tYXgocik6dH1mdW5jdGlvbiBkdChlLHQpe3ZhciByO3ZvaWQgMD09PWUmJihlPVtdKSx2b2lkIDA9PT10JiYodD1cInJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWRcIik7Zm9yKHZhciBuPW5ldyBNYXAsYT0wLG89ZS5sZW5ndGg7YTxvO2ErKyl7dmFyIHM9ZVthXTtpZihJLmlzRGF0ZShzKSl7dmFyIGk9X2UocyxcIk1NLmRkLnl5eXlcIik7KGY9bi5nZXQoaSl8fFtdKS5pbmNsdWRlcyh0KXx8KGYucHVzaCh0KSxuLnNldChpLGYpKX1lbHNlIGlmKFwib2JqZWN0XCI9PXR5cGVvZiBzKXt2YXIgbD1udWxsIT09KHI9T2JqZWN0LmtleXMocylbMF0pJiZ2b2lkIDAhPT1yP3I6XCJcIixjPXNbbF07aWYoXCJzdHJpbmdcIj09dHlwZW9mIGwmJkFycmF5LmlzQXJyYXkoYykpZm9yKHZhciBwPTAsZD1jLmxlbmd0aDtwPGQ7cCsrKXt2YXIgdT1jW3BdO2lmKHUpe3ZhciBmO2k9X2UodSxcIk1NLmRkLnl5eXlcIik7KGY9bi5nZXQoaSl8fFtdKS5pbmNsdWRlcyhsKXx8KGYucHVzaChsKSxuLnNldChpLGYpKX19fX1yZXR1cm4gbn1mdW5jdGlvbiB1dChlLHQpe3ZvaWQgMD09PWUmJihlPVtdKSx2b2lkIDA9PT10JiYodD1cInJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXNcIik7dmFyIHI9bmV3IE1hcDtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLmRhdGUsYT1lLmhvbGlkYXlOYW1lO2lmKEkuaXNEYXRlKG4pKXt2YXIgbz1fZShuLFwiTU0uZGQueXl5eVwiKSxzPXIuZ2V0KG8pfHx7Y2xhc3NOYW1lOlwiXCIsaG9saWRheU5hbWVzOltdfTtpZighKFwiY2xhc3NOYW1lXCJpbiBzKXx8cy5jbGFzc05hbWUhPT10fHwoaT1zLmhvbGlkYXlOYW1lcyxsPVthXSxpLmxlbmd0aCE9PWwubGVuZ3RofHwhaS5ldmVyeSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PWxbdF19KSkpKXt2YXIgaSxsO3MuY2xhc3NOYW1lPXQ7dmFyIGM9cy5ob2xpZGF5TmFtZXM7cy5ob2xpZGF5TmFtZXM9Yz9EZShEZShbXSxjLCEwKSxbYV0sITEpOlthXSxyLnNldChvLHMpfX19KSkscn1mdW5jdGlvbiBmdChlLHQscixuLGEpe2Zvcih2YXIgaT1hLmxlbmd0aCxsPVtdLHA9MDtwPGk7cCsrKXt2YXIgZD1lLHU9YVtwXTt1JiYoZD1vLmFkZEhvdXJzKGQsYi5nZXRIb3Vycyh1KSksZD1zLmFkZE1pbnV0ZXMoZCxDLmdldE1pbnV0ZXModSkpLGQ9Yy5hZGRTZWNvbmRzKGQsUC5nZXRTZWNvbmRzKHUpKSk7dmFyIGY9cy5hZGRNaW51dGVzKGUsKHIrMSkqbik7Ti5pc0FmdGVyKGQsdCkmJk8uaXNCZWZvcmUoZCxmKSYmbnVsbCE9dSYmbC5wdXNoKHUpfXJldHVybiBsfWZ1bmN0aW9uIGh0KGUpe3JldHVybiBlPDEwP1wiMFwiLmNvbmNhdChlKTpcIlwiLmNvbmNhdChlKX1mdW5jdGlvbiBtdChlLHQpe3ZvaWQgMD09PXQmJih0PVNlKTt2YXIgcj1NYXRoLmNlaWwoeC5nZXRZZWFyKGUpL3QpKnQ7cmV0dXJue3N0YXJ0UGVyaW9kOnItKHQtMSksZW5kUGVyaW9kOnJ9fWZ1bmN0aW9uIHZ0KGUpe3ZhciB0PWUuZ2V0U2Vjb25kcygpLHI9ZS5nZXRNaWxsaXNlY29uZHMoKTtyZXR1cm4gbGUudG9EYXRlKGUuZ2V0VGltZSgpLTFlMyp0LXIpfWZ1bmN0aW9uIGd0KGUpe2lmKCFJLmlzRGF0ZShlKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRhdGVcIik7dmFyIHQ9bmV3IERhdGUoZSk7cmV0dXJuIHQuc2V0SG91cnMoMCwwLDAsMCksdH1mdW5jdGlvbiBEdChlLHQpe2lmKCFJLmlzRGF0ZShlKXx8IUkuaXNEYXRlKHQpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGF0ZSByZWNlaXZlZFwiKTt2YXIgcj1ndChlKSxuPWd0KHQpO3JldHVybiBPLmlzQmVmb3JlKHIsbil9ZnVuY3Rpb24geXQoZSl7cmV0dXJuIGUua2V5PT09eWUuU3BhY2V9dmFyIGt0LHd0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIG4ub25UaW1lQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0LHI7bi5zZXRTdGF0ZSh7dGltZTplfSk7dmFyIGE9bi5wcm9wcy5kYXRlLG89YSBpbnN0YW5jZW9mIERhdGUmJiFpc05hTigrYSk/YTpuZXcgRGF0ZTtpZihudWxsPT1lP3ZvaWQgMDplLmluY2x1ZGVzKFwiOlwiKSl7dmFyIHM9ZS5zcGxpdChcIjpcIiksaT1zWzBdLGw9c1sxXTtvLnNldEhvdXJzKE51bWJlcihpKSksby5zZXRNaW51dGVzKE51bWJlcihsKSl9bnVsbD09PShyPSh0PW4ucHJvcHMpLm9uQ2hhbmdlKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsbyl9LG4ucmVuZGVyVGltZUlucHV0PWZ1bmN0aW9uKCl7dmFyIGU9bi5zdGF0ZS50aW1lLHQ9bi5wcm9wcyxhPXQuZGF0ZSxvPXQudGltZVN0cmluZyxzPXQuY3VzdG9tVGltZUlucHV0O3JldHVybiBzP3IuY2xvbmVFbGVtZW50KHMse2RhdGU6YSx2YWx1ZTplLG9uQ2hhbmdlOm4ub25UaW1lQ2hhbmdlfSk6dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIix7dHlwZTpcInRpbWVcIixjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0XCIscGxhY2Vob2xkZXI6XCJUaW1lXCIsbmFtZTpcInRpbWUtaW5wdXRcIixyZXF1aXJlZDohMCx2YWx1ZTplLG9uQ2hhbmdlOmZ1bmN0aW9uKGUpe24ub25UaW1lQ2hhbmdlKGUudGFyZ2V0LnZhbHVlfHxvKX19KX0sbi5zdGF0ZT17dGltZTpuLnByb3BzLnRpbWVTdHJpbmd9LG59cmV0dXJuIHZlKHQsZSksdC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50aW1lU3RyaW5nIT09dC50aW1lP3t0aW1lOmUudGltZVN0cmluZ306bnVsbH0sdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lclwifSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlci10aW1lX19jYXB0aW9uXCJ9LHRoaXMucHJvcHMudGltZUlucHV0TGFiZWwpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lclwifSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dFwifSx0aGlzLnJlbmRlclRpbWVJbnB1dCgpKSkpfSx0fShyLkNvbXBvbmVudCksU3Q9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe3ZhciBuPW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi5kYXlFbD1yLmNyZWF0ZVJlZigpLG4uaGFuZGxlQ2xpY2s9ZnVuY3Rpb24oZSl7IW4uaXNEaXNhYmxlZCgpJiZuLnByb3BzLm9uQ2xpY2smJm4ucHJvcHMub25DbGljayhlKX0sbi5oYW5kbGVNb3VzZUVudGVyPWZ1bmN0aW9uKGUpeyFuLmlzRGlzYWJsZWQoKSYmbi5wcm9wcy5vbk1vdXNlRW50ZXImJm4ucHJvcHMub25Nb3VzZUVudGVyKGUpfSxuLmhhbmRsZU9uS2V5RG93bj1mdW5jdGlvbihlKXt2YXIgdCxyO2Uua2V5PT09eWUuU3BhY2UmJihlLnByZXZlbnREZWZhdWx0KCksZS5rZXk9eWUuRW50ZXIpLG51bGw9PT0ocj0odD1uLnByb3BzKS5oYW5kbGVPbktleURvd24pfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKX0sbi5pc1NhbWVEYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIEhlKG4ucHJvcHMuZGF5LGUpfSxuLmlzS2V5Ym9hcmRTZWxlY3RlZD1mdW5jdGlvbigpe3ZhciBlO2lmKG4ucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24pcmV0dXJuITE7dmFyIHQ9bi5wcm9wcy5zZWxlY3RzTXVsdGlwbGU/bnVsbD09PShlPW4ucHJvcHMuc2VsZWN0ZWREYXRlcyl8fHZvaWQgMD09PWU/dm9pZCAwOmUuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIG4uaXNTYW1lRGF5T3JXZWVrKGUpfSkpOm4uaXNTYW1lRGF5T3JXZWVrKG4ucHJvcHMuc2VsZWN0ZWQpLHI9bi5wcm9wcy5wcmVTZWxlY3Rpb24mJm4uaXNEaXNhYmxlZChuLnByb3BzLnByZVNlbGVjdGlvbik7cmV0dXJuIXQmJm4uaXNTYW1lRGF5T3JXZWVrKG4ucHJvcHMucHJlU2VsZWN0aW9uKSYmIXJ9LG4uaXNEaXNhYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bi5wcm9wcy5kYXkpLGplKGUse21pbkRhdGU6bi5wcm9wcy5taW5EYXRlLG1heERhdGU6bi5wcm9wcy5tYXhEYXRlLGV4Y2x1ZGVEYXRlczpuLnByb3BzLmV4Y2x1ZGVEYXRlcyxleGNsdWRlRGF0ZUludGVydmFsczpuLnByb3BzLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzLGluY2x1ZGVEYXRlSW50ZXJ2YWxzOm4ucHJvcHMuaW5jbHVkZURhdGVJbnRlcnZhbHMsaW5jbHVkZURhdGVzOm4ucHJvcHMuaW5jbHVkZURhdGVzLGZpbHRlckRhdGU6bi5wcm9wcy5maWx0ZXJEYXRlfSl9LG4uaXNFeGNsdWRlZD1mdW5jdGlvbigpe3JldHVybiBVZShuLnByb3BzLmRheSx7ZXhjbHVkZURhdGVzOm4ucHJvcHMuZXhjbHVkZURhdGVzLGV4Y2x1ZGVEYXRlSW50ZXJ2YWxzOm4ucHJvcHMuZXhjbHVkZURhdGVJbnRlcnZhbHN9KX0sbi5pc1N0YXJ0T2ZXZWVrPWZ1bmN0aW9uKCl7cmV0dXJuIEhlKG4ucHJvcHMuZGF5LHhlKG4ucHJvcHMuZGF5LG4ucHJvcHMubG9jYWxlLG4ucHJvcHMuY2FsZW5kYXJTdGFydERheSkpfSxuLmlzU2FtZVdlZWs9ZnVuY3Rpb24oZSl7cmV0dXJuIG4ucHJvcHMuc2hvd1dlZWtQaWNrZXImJkhlKGUseGUobi5wcm9wcy5kYXksbi5wcm9wcy5sb2NhbGUsbi5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KSl9LG4uaXNTYW1lRGF5T3JXZWVrPWZ1bmN0aW9uKGUpe3JldHVybiBuLmlzU2FtZURheShlKXx8bi5pc1NhbWVXZWVrKGUpfSxuLmdldEhpZ2hMaWdodGVkQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLmhpZ2hsaWdodERhdGVzO2lmKCFyKXJldHVybiExO3ZhciBhPV9lKHQsXCJNTS5kZC55eXl5XCIpO3JldHVybiByLmdldChhKX0sbi5nZXRIb2xpZGF5c0NsYXNzPWZ1bmN0aW9uKCl7dmFyIGUsdD1uLnByb3BzLHI9dC5kYXksYT10LmhvbGlkYXlzO2lmKCFhKXJldHVyblt2b2lkIDBdO3ZhciBvPV9lKHIsXCJNTS5kZC55eXl5XCIpO3JldHVybiBhLmhhcyhvKT9bbnVsbD09PShlPWEuZ2V0KG8pKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jbGFzc05hbWVdOlt2b2lkIDBdfSxuLmlzSW5SYW5nZT1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMsdD1lLmRheSxyPWUuc3RhcnREYXRlLGE9ZS5lbmREYXRlO3JldHVybiEoIXJ8fCFhKSYmUWUodCxyLGEpfSxuLmlzSW5TZWxlY3RpbmdSYW5nZT1mdW5jdGlvbigpe3ZhciBlLHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5zZWxlY3RzU3RhcnQsbz10LnNlbGVjdHNFbmQscz10LnNlbGVjdHNSYW5nZSxpPXQuc2VsZWN0c0Rpc2FibGVkRGF5c0luUmFuZ2UsbD10LnN0YXJ0RGF0ZSxjPXQuZW5kRGF0ZSxwPW51bGwhPT0oZT1uLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT1lP2U6bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuISghKGF8fG98fHMpfHwhcHx8IWkmJm4uaXNEaXNhYmxlZCgpKSYmKGEmJmMmJihPLmlzQmVmb3JlKHAsYyl8fFdlKHAsYykpP1FlKHIscCxjKToobyYmbCYmKE4uaXNBZnRlcihwLGwpfHxXZShwLGwpKXx8ISghc3x8IWx8fGN8fCFOLmlzQWZ0ZXIocCxsKSYmIVdlKHAsbCkpKSYmUWUocixsLHApKX0sbi5pc1NlbGVjdGluZ1JhbmdlU3RhcnQ9ZnVuY3Rpb24oKXt2YXIgZTtpZighbi5pc0luU2VsZWN0aW5nUmFuZ2UoKSlyZXR1cm4hMTt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LnN0YXJ0RGF0ZSxvPXQuc2VsZWN0c1N0YXJ0LHM9bnVsbCE9PShlPW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PWU/ZTpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4gSGUocixvP3M6YSl9LG4uaXNTZWxlY3RpbmdSYW5nZUVuZD1mdW5jdGlvbigpe3ZhciBlO2lmKCFuLmlzSW5TZWxlY3RpbmdSYW5nZSgpKXJldHVybiExO3ZhciB0PW4ucHJvcHMscj10LmRheSxhPXQuZW5kRGF0ZSxvPXQuc2VsZWN0c0VuZCxzPXQuc2VsZWN0c1JhbmdlLGk9bnVsbCE9PShlPW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PWU/ZTpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4gSGUocixvfHxzP2k6YSl9LG4uaXNSYW5nZVN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5zdGFydERhdGUsYT1lLmVuZERhdGU7cmV0dXJuISghcnx8IWEpJiZIZShyLHQpfSxuLmlzUmFuZ2VFbmQ9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLnN0YXJ0RGF0ZSxhPWUuZW5kRGF0ZTtyZXR1cm4hKCFyfHwhYSkmJkhlKGEsdCl9LG4uaXNXZWVrZW5kPWZ1bmN0aW9uKCl7dmFyIGU9Uy5nZXREYXkobi5wcm9wcy5kYXkpO3JldHVybiAwPT09ZXx8Nj09PWV9LG4uaXNBZnRlck1vbnRoPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PW4ucHJvcHMubW9udGgmJihuLnByb3BzLm1vbnRoKzEpJTEyPT09Xy5nZXRNb250aChuLnByb3BzLmRheSl9LG4uaXNCZWZvcmVNb250aD1mdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT1uLnByb3BzLm1vbnRoJiYoXy5nZXRNb250aChuLnByb3BzLmRheSkrMSklMTI9PT1uLnByb3BzLm1vbnRofSxuLmlzQ3VycmVudERheT1mdW5jdGlvbigpe3JldHVybiBuLmlzU2FtZURheShNZSgpKX0sbi5pc1NlbGVjdGVkPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIG4ucHJvcHMuc2VsZWN0c011bHRpcGxlP251bGw9PT0oZT1uLnByb3BzLnNlbGVjdGVkRGF0ZXMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBuLmlzU2FtZURheU9yV2VlayhlKX0pKTpuLmlzU2FtZURheU9yV2VlayhuLnByb3BzLnNlbGVjdGVkKX0sbi5nZXRDbGFzc05hbWVzPWZ1bmN0aW9uKGUpe3ZhciByLGE9bi5wcm9wcy5kYXlDbGFzc05hbWU/bi5wcm9wcy5kYXlDbGFzc05hbWUoZSk6dm9pZCAwO3JldHVybiB0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19kYXlcIixhLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1cIitfZShuLnByb3BzLmRheSxcImRkZFwiLHIpLHtcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWRcIjpuLmlzRGlzYWJsZWQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZXhjbHVkZWRcIjpuLmlzRXhjbHVkZWQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tc2VsZWN0ZWRcIjpuLmlzU2VsZWN0ZWQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0ta2V5Ym9hcmQtc2VsZWN0ZWRcIjpuLmlzS2V5Ym9hcmRTZWxlY3RlZCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1yYW5nZS1zdGFydFwiOm4uaXNSYW5nZVN0YXJ0KCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXJhbmdlLWVuZFwiOm4uaXNSYW5nZUVuZCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZVwiOm4uaXNJblJhbmdlKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZVwiOm4uaXNJblNlbGVjdGluZ1JhbmdlKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGluZy1yYW5nZS1zdGFydFwiOm4uaXNTZWxlY3RpbmdSYW5nZVN0YXJ0KCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGluZy1yYW5nZS1lbmRcIjpuLmlzU2VsZWN0aW5nUmFuZ2VFbmQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tdG9kYXlcIjpuLmlzQ3VycmVudERheSgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS13ZWVrZW5kXCI6bi5pc1dlZWtlbmQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tb3V0c2lkZS1tb250aFwiOm4uaXNBZnRlck1vbnRoKCl8fG4uaXNCZWZvcmVNb250aCgpfSxuLmdldEhpZ2hMaWdodGVkQ2xhc3MoKSxuLmdldEhvbGlkYXlzQ2xhc3MoKSl9LG4uZ2V0QXJpYUxhYmVsPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5hcmlhTGFiZWxQcmVmaXhXaGVuRW5hYmxlZCxhPXZvaWQgMD09PXI/XCJDaG9vc2VcIjpyLG89ZS5hcmlhTGFiZWxQcmVmaXhXaGVuRGlzYWJsZWQscz12b2lkIDA9PT1vP1wiTm90IGF2YWlsYWJsZVwiOm8saT1uLmlzRGlzYWJsZWQoKXx8bi5pc0V4Y2x1ZGVkKCk/czphO3JldHVyblwiXCIuY29uY2F0KGksXCIgXCIpLmNvbmNhdChfZSh0LFwiUFBQUFwiLG4ucHJvcHMubG9jYWxlKSl9LG4uZ2V0VGl0bGU9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLmhvbGlkYXlzLGE9dm9pZCAwPT09cj9uZXcgTWFwOnIsbz1lLmV4Y2x1ZGVEYXRlcyxzPV9lKHQsXCJNTS5kZC55eXl5XCIpLGk9W107cmV0dXJuIGEuaGFzKHMpJiZpLnB1c2guYXBwbHkoaSxhLmdldChzKS5ob2xpZGF5TmFtZXMpLG4uaXNFeGNsdWRlZCgpJiZpLnB1c2gobnVsbD09bz92b2lkIDA6by5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZT9IZShlLHQpOkhlKG51bGw9PWU/dm9pZCAwOmUuZGF0ZSx0KX0pKS5tYXAoKGZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIERhdGUpKXJldHVybiBudWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2V9KSkpLGkuam9pbihcIiwgXCIpfSxuLmdldFRhYkluZGV4PWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcy5zZWxlY3RlZCx0PW4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybighbi5wcm9wcy5zaG93V2Vla1BpY2tlcnx8IW4ucHJvcHMuc2hvd1dlZWtOdW1iZXImJm4uaXNTdGFydE9mV2VlaygpKSYmKG4uaXNLZXlib2FyZFNlbGVjdGVkKCl8fG4uaXNTYW1lRGF5KGUpJiZIZSh0LGUpKT8wOi0xfSxuLmhhbmRsZUZvY3VzRGF5PWZ1bmN0aW9uKCl7dmFyIGU7bi5zaG91bGRGb2N1c0RheSgpJiYobnVsbD09PShlPW4uZGF5RWwuY3VycmVudCl8fHZvaWQgMD09PWV8fGUuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSl9LG4ucmVuZGVyRGF5Q29udGVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gbi5wcm9wcy5tb250aFNob3dzRHVwbGljYXRlRGF5c0VuZCYmbi5pc0FmdGVyTW9udGgoKXx8bi5wcm9wcy5tb250aFNob3dzRHVwbGljYXRlRGF5c1N0YXJ0JiZuLmlzQmVmb3JlTW9udGgoKT9udWxsOm4ucHJvcHMucmVuZGVyRGF5Q29udGVudHM/bi5wcm9wcy5yZW5kZXJEYXlDb250ZW50cyh3LmdldERhdGUobi5wcm9wcy5kYXkpLG4ucHJvcHMuZGF5KTp3LmdldERhdGUobi5wcm9wcy5kYXkpfSxuLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOm4uZGF5RWwsY2xhc3NOYW1lOm4uZ2V0Q2xhc3NOYW1lcyhuLnByb3BzLmRheSksb25LZXlEb3duOm4uaGFuZGxlT25LZXlEb3duLG9uQ2xpY2s6bi5oYW5kbGVDbGljayxvbk1vdXNlRW50ZXI6bi5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOm4uaGFuZGxlTW91c2VFbnRlcixvblBvaW50ZXJFbnRlcjpuLnByb3BzLnVzZVBvaW50ZXJFdmVudD9uLmhhbmRsZU1vdXNlRW50ZXI6dm9pZCAwLHRhYkluZGV4Om4uZ2V0VGFiSW5kZXgoKSxcImFyaWEtbGFiZWxcIjpuLmdldEFyaWFMYWJlbCgpLHJvbGU6XCJvcHRpb25cIix0aXRsZTpuLmdldFRpdGxlKCksXCJhcmlhLWRpc2FibGVkXCI6bi5pc0Rpc2FibGVkKCksXCJhcmlhLWN1cnJlbnRcIjpuLmlzQ3VycmVudERheSgpP1wiZGF0ZVwiOnZvaWQgMCxcImFyaWEtc2VsZWN0ZWRcIjpuLmlzU2VsZWN0ZWQoKXx8bi5pc0luUmFuZ2UoKX0sbi5yZW5kZXJEYXlDb250ZW50cygpLFwiXCIhPT1uLmdldFRpdGxlKCkmJnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwib3ZlcmxheVwifSxuLmdldFRpdGxlKCkpKX0sbn1yZXR1cm4gdmUobixlKSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMuaGFuZGxlRm9jdXNEYXkoKX0sbi5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVGb2N1c0RheSgpfSxuLnByb3RvdHlwZS5zaG91bGRGb2N1c0RheT1mdW5jdGlvbigpe3ZhciBlPSExO3JldHVybiAwPT09dGhpcy5nZXRUYWJJbmRleCgpJiZ0aGlzLmlzU2FtZURheSh0aGlzLnByb3BzLnByZVNlbGVjdGlvbikmJihkb2N1bWVudC5hY3RpdmVFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZG9jdW1lbnQuYm9keXx8KGU9ITApLHRoaXMucHJvcHMuaW5saW5lJiYhdGhpcy5wcm9wcy5zaG91bGRGb2N1c0RheUlubGluZSYmKGU9ITEpLHRoaXMuaXNEYXlBY3RpdmVFbGVtZW50KCkmJihlPSEwKSx0aGlzLmlzRHVwbGljYXRlRGF5KCkmJihlPSExKSksZX0sbi5wcm90b3R5cGUuaXNEYXlBY3RpdmVFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIGUsdCxyO3JldHVybihudWxsPT09KHQ9bnVsbD09PShlPXRoaXMucHJvcHMuY29udGFpbmVyUmVmKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jdXJyZW50KXx8dm9pZCAwPT09dD92b2lkIDA6dC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkmJihudWxsPT09KHI9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl8fHZvaWQgMD09PXI/dm9pZCAwOnIuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5XCIpKX0sbi5wcm90b3R5cGUuaXNEdXBsaWNhdGVEYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wcy5tb250aFNob3dzRHVwbGljYXRlRGF5c0VuZCYmdGhpcy5pc0FmdGVyTW9udGgoKXx8dGhpcy5wcm9wcy5tb250aFNob3dzRHVwbGljYXRlRGF5c1N0YXJ0JiZ0aGlzLmlzQmVmb3JlTW9udGgoKX0sbn0oci5Db21wb25lbnQpLGJ0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQud2Vla051bWJlckVsPXIuY3JlYXRlUmVmKCksdC5oYW5kbGVDbGljaz1mdW5jdGlvbihlKXt0LnByb3BzLm9uQ2xpY2smJnQucHJvcHMub25DbGljayhlKX0sdC5oYW5kbGVPbktleURvd249ZnVuY3Rpb24oZSl7dmFyIHIsbjtlLmtleT09PXllLlNwYWNlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUua2V5PXllLkVudGVyKSxudWxsPT09KG49KHI9dC5wcm9wcykuaGFuZGxlT25LZXlEb3duKXx8dm9pZCAwPT09bnx8bi5jYWxsKHIsZSl9LHQuaXNLZXlib2FyZFNlbGVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIXQucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24mJiFIZSh0LnByb3BzLmRhdGUsdC5wcm9wcy5zZWxlY3RlZCkmJkhlKHQucHJvcHMuZGF0ZSx0LnByb3BzLnByZVNlbGVjdGlvbil9LHQuZ2V0VGFiSW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm9wcy5zaG93V2Vla1BpY2tlciYmdC5wcm9wcy5zaG93V2Vla051bWJlciYmKHQuaXNLZXlib2FyZFNlbGVjdGVkKCl8fEhlKHQucHJvcHMuZGF0ZSx0LnByb3BzLnNlbGVjdGVkKSYmSGUodC5wcm9wcy5wcmVTZWxlY3Rpb24sdC5wcm9wcy5zZWxlY3RlZCkpPzA6LTF9LHQuaGFuZGxlRm9jdXNXZWVrTnVtYmVyPWZ1bmN0aW9uKGUpe3ZhciByPSExOzA9PT10LmdldFRhYkluZGV4KCkmJiEobnVsbD09ZT92b2lkIDA6ZS5pc0lucHV0Rm9jdXNlZCkmJkhlKHQucHJvcHMuZGF0ZSx0LnByb3BzLnByZVNlbGVjdGlvbikmJihkb2N1bWVudC5hY3RpdmVFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZG9jdW1lbnQuYm9keXx8KHI9ITApLHQucHJvcHMuaW5saW5lJiYhdC5wcm9wcy5zaG91bGRGb2N1c0RheUlubGluZSYmKHI9ITEpLHQucHJvcHMuY29udGFpbmVyUmVmJiZ0LnByb3BzLmNvbnRhaW5lclJlZi5jdXJyZW50JiZ0LnByb3BzLmNvbnRhaW5lclJlZi5jdXJyZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyXCIpJiYocj0hMCkpLHImJnQud2Vla051bWJlckVsLmN1cnJlbnQmJnQud2Vla051bWJlckVsLmN1cnJlbnQuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KX0sdH1yZXR1cm4gdmUobixlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobixcImRlZmF1bHRQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57YXJpYUxhYmVsUHJlZml4Olwid2VlayBcIn19LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZUZvY3VzV2Vla051bWJlcigpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy5oYW5kbGVGb2N1c1dlZWtOdW1iZXIoZSl9LG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMscj1lLndlZWtOdW1iZXIsYT1lLmFyaWFMYWJlbFByZWZpeCxvPXZvaWQgMD09PWE/bi5kZWZhdWx0UHJvcHMuYXJpYUxhYmVsUHJlZml4OmEscz1lLm9uQ2xpY2ssaT17XCJyZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlclwiOiEwLFwicmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWNsaWNrYWJsZVwiOiEhcyxcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZFwiOiEhcyYmSGUodGhpcy5wcm9wcy5kYXRlLHRoaXMucHJvcHMuc2VsZWN0ZWQpLFwicmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkXCI6dGhpcy5pc0tleWJvYXJkU2VsZWN0ZWQoKX07cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtyZWY6dGhpcy53ZWVrTnVtYmVyRWwsY2xhc3NOYW1lOnQuY2xzeChpKSxcImFyaWEtbGFiZWxcIjpcIlwiLmNvbmNhdChvLFwiIFwiKS5jb25jYXQodGhpcy5wcm9wcy53ZWVrTnVtYmVyKSxvbkNsaWNrOnRoaXMuaGFuZGxlQ2xpY2ssb25LZXlEb3duOnRoaXMuaGFuZGxlT25LZXlEb3duLHRhYkluZGV4OnRoaXMuZ2V0VGFiSW5kZXgoKX0scil9LG59KHIuQ29tcG9uZW50KSxNdD1mdW5jdGlvbihlKXtmdW5jdGlvbiByKCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0LmlzRGlzYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGplKGUse21pbkRhdGU6dC5wcm9wcy5taW5EYXRlLG1heERhdGU6dC5wcm9wcy5tYXhEYXRlLGV4Y2x1ZGVEYXRlczp0LnByb3BzLmV4Y2x1ZGVEYXRlcyxleGNsdWRlRGF0ZUludGVydmFsczp0LnByb3BzLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzLGluY2x1ZGVEYXRlSW50ZXJ2YWxzOnQucHJvcHMuaW5jbHVkZURhdGVJbnRlcnZhbHMsaW5jbHVkZURhdGVzOnQucHJvcHMuaW5jbHVkZURhdGVzLGZpbHRlckRhdGU6dC5wcm9wcy5maWx0ZXJEYXRlfSl9LHQuaGFuZGxlRGF5Q2xpY2s9ZnVuY3Rpb24oZSxyKXt0LnByb3BzLm9uRGF5Q2xpY2smJnQucHJvcHMub25EYXlDbGljayhlLHIpfSx0LmhhbmRsZURheU1vdXNlRW50ZXI9ZnVuY3Rpb24oZSl7dC5wcm9wcy5vbkRheU1vdXNlRW50ZXImJnQucHJvcHMub25EYXlNb3VzZUVudGVyKGUpfSx0LmhhbmRsZVdlZWtDbGljaz1mdW5jdGlvbihlLG4sYSl7Zm9yKHZhciBvLHMsaSxsPW5ldyBEYXRlKGUpLGM9MDtjPDc7YysrKXt2YXIgcD1uZXcgRGF0ZShlKTtpZihwLnNldERhdGUocC5nZXREYXRlKCkrYyksIXQuaXNEaXNhYmxlZChwKSl7bD1wO2JyZWFrfX1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnByb3BzLm9uV2Vla1NlbGVjdCYmdC5wcm9wcy5vbldlZWtTZWxlY3QobCxuLGEpLHQucHJvcHMuc2hvd1dlZWtQaWNrZXImJnQuaGFuZGxlRGF5Q2xpY2sobCxhKSwobnVsbCE9PShvPXQucHJvcHMuc2hvdWxkQ2xvc2VPblNlbGVjdCkmJnZvaWQgMCE9PW8/bzpyLmRlZmF1bHRQcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0KSYmKG51bGw9PT0oaT0ocz10LnByb3BzKS5zZXRPcGVuKXx8dm9pZCAwPT09aXx8aS5jYWxsKHMsITEpKX0sdC5mb3JtYXRXZWVrTnVtYmVyPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3BzLmZvcm1hdFdlZWtOdW1iZXI/dC5wcm9wcy5mb3JtYXRXZWVrTnVtYmVyKGUpOmZ1bmN0aW9uKGUpe3JldHVybiBNLmdldElTT1dlZWsoZSl9KGUpfSx0LnJlbmRlckRheXM9ZnVuY3Rpb24oKXt2YXIgZT10LnN0YXJ0T2ZXZWVrKCksbj1bXSxvPXQuZm9ybWF0V2Vla051bWJlcihlKTtpZih0LnByb3BzLnNob3dXZWVrTnVtYmVyKXt2YXIgcz10LnByb3BzLm9uV2Vla1NlbGVjdHx8dC5wcm9wcy5zaG93V2Vla1BpY2tlcj90LmhhbmRsZVdlZWtDbGljay5iaW5kKHQsZSxvKTp2b2lkIDA7bi5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChidCxnZSh7a2V5OlwiV1wifSxyLmRlZmF1bHRQcm9wcyx0LnByb3BzLHt3ZWVrTnVtYmVyOm8sZGF0ZTplLG9uQ2xpY2s6c30pKSl9cmV0dXJuIG4uY29uY2F0KFswLDEsMiwzLDQsNSw2XS5tYXAoKGZ1bmN0aW9uKG4pe3ZhciBvPWEuYWRkRGF5cyhlLG4pO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoU3QsZ2Uoe30sci5kZWZhdWx0UHJvcHMsdC5wcm9wcyx7YXJpYUxhYmVsUHJlZml4V2hlbkVuYWJsZWQ6dC5wcm9wcy5jaG9vc2VEYXlBcmlhTGFiZWxQcmVmaXgsYXJpYUxhYmVsUHJlZml4V2hlbkRpc2FibGVkOnQucHJvcHMuZGlzYWJsZWREYXlBcmlhTGFiZWxQcmVmaXgsa2V5Om8udmFsdWVPZigpLGRheTpvLG9uQ2xpY2s6dC5oYW5kbGVEYXlDbGljay5iaW5kKHQsbyksb25Nb3VzZUVudGVyOnQuaGFuZGxlRGF5TW91c2VFbnRlci5iaW5kKHQsbyl9KSl9KSkpfSx0LnN0YXJ0T2ZXZWVrPWZ1bmN0aW9uKCl7cmV0dXJuIHhlKHQucHJvcHMuZGF5LHQucHJvcHMubG9jYWxlLHQucHJvcHMuY2FsZW5kYXJTdGFydERheSl9LHQuaXNLZXlib2FyZFNlbGVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIXQucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24mJiFIZSh0LnN0YXJ0T2ZXZWVrKCksdC5wcm9wcy5zZWxlY3RlZCkmJkhlKHQuc3RhcnRPZldlZWsoKSx0LnByb3BzLnByZVNlbGVjdGlvbil9LHR9cmV0dXJuIHZlKHIsZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue3Nob3VsZENsb3NlT25TZWxlY3Q6ITB9fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLHIucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXtcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWtcIjohMCxcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstLXNlbGVjdGVkXCI6SGUodGhpcy5zdGFydE9mV2VlaygpLHRoaXMucHJvcHMuc2VsZWN0ZWQpLFwicmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay0ta2V5Ym9hcmQtc2VsZWN0ZWRcIjp0aGlzLmlzS2V5Ym9hcmRTZWxlY3RlZCgpfTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTp0LmNsc3goZSl9LHRoaXMucmVuZGVyRGF5cygpKX0scn0oci5Db21wb25lbnQpLEN0PVwidHdvX2NvbHVtbnNcIixfdD1cInRocmVlX2NvbHVtbnNcIixFdD1cImZvdXJfY29sdW1uc1wiLFB0PSgoa3Q9e30pW0N0XT17Z3JpZDpbWzAsMV0sWzIsM10sWzQsNV0sWzYsN10sWzgsOV0sWzEwLDExXV0sdmVydGljYWxOYXZpZ2F0aW9uT2Zmc2V0OjJ9LGt0W190XT17Z3JpZDpbWzAsMSwyXSxbMyw0LDVdLFs2LDcsOF0sWzksMTAsMTFdXSx2ZXJ0aWNhbE5hdmlnYXRpb25PZmZzZXQ6M30sa3RbRXRdPXtncmlkOltbMCwxLDIsM10sWzQsNSw2LDddLFs4LDksMTAsMTFdXSx2ZXJ0aWNhbE5hdmlnYXRpb25PZmZzZXQ6NH0sa3QpO2Z1bmN0aW9uIFl0KGUsdCl7cmV0dXJuIGU/RXQ6dD9DdDpfdH12YXIgeHQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe3ZhciBuPW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi5NT05USF9SRUZTPURlKFtdLEFycmF5KDEyKSwhMCkubWFwKChmdW5jdGlvbigpe3JldHVybiByLmNyZWF0ZVJlZigpfSkpLG4uUVVBUlRFUl9SRUZTPURlKFtdLEFycmF5KDQpLCEwKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIHIuY3JlYXRlUmVmKCl9KSksbi5pc0Rpc2FibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBqZShlLHttaW5EYXRlOm4ucHJvcHMubWluRGF0ZSxtYXhEYXRlOm4ucHJvcHMubWF4RGF0ZSxleGNsdWRlRGF0ZXM6bi5wcm9wcy5leGNsdWRlRGF0ZXMsZXhjbHVkZURhdGVJbnRlcnZhbHM6bi5wcm9wcy5leGNsdWRlRGF0ZUludGVydmFscyxpbmNsdWRlRGF0ZUludGVydmFsczpuLnByb3BzLmluY2x1ZGVEYXRlSW50ZXJ2YWxzLGluY2x1ZGVEYXRlczpuLnByb3BzLmluY2x1ZGVEYXRlcyxmaWx0ZXJEYXRlOm4ucHJvcHMuZmlsdGVyRGF0ZX0pfSxuLmlzRXhjbHVkZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIFVlKGUse2V4Y2x1ZGVEYXRlczpuLnByb3BzLmV4Y2x1ZGVEYXRlcyxleGNsdWRlRGF0ZUludGVydmFsczpuLnByb3BzLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzfSl9LG4uaGFuZGxlRGF5Q2xpY2s9ZnVuY3Rpb24oZSx0KXt2YXIgcixhO251bGw9PT0oYT0ocj1uLnByb3BzKS5vbkRheUNsaWNrKXx8dm9pZCAwPT09YXx8YS5jYWxsKHIsZSx0LG4ucHJvcHMub3JkZXJJbkRpc3BsYXkpfSxuLmhhbmRsZURheU1vdXNlRW50ZXI9ZnVuY3Rpb24oZSl7dmFyIHQscjtudWxsPT09KHI9KHQ9bi5wcm9wcykub25EYXlNb3VzZUVudGVyKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSl9LG4uaGFuZGxlTW91c2VMZWF2ZT1mdW5jdGlvbigpe3ZhciBlLHQ7bnVsbD09PSh0PShlPW4ucHJvcHMpLm9uTW91c2VMZWF2ZSl8fHZvaWQgMD09PXR8fHQuY2FsbChlKX0sbi5pc1JhbmdlU3RhcnRNb250aD1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LnN0YXJ0RGF0ZSxvPXQuZW5kRGF0ZTtyZXR1cm4hKCFhfHwhbykmJkFlKCQuc2V0TW9udGgocixlKSxhKX0sbi5pc1JhbmdlU3RhcnRRdWFydGVyPWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMscj10LmRheSxhPXQuc3RhcnREYXRlLG89dC5lbmREYXRlO3JldHVybiEoIWF8fCFvKSYmRmUoei5zZXRRdWFydGVyKHIsZSksYSl9LG4uaXNSYW5nZUVuZE1vbnRoPWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMscj10LmRheSxhPXQuc3RhcnREYXRlLG89dC5lbmREYXRlO3JldHVybiEoIWF8fCFvKSYmQWUoJC5zZXRNb250aChyLGUpLG8pfSxuLmlzUmFuZ2VFbmRRdWFydGVyPWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMscj10LmRheSxhPXQuc3RhcnREYXRlLG89dC5lbmREYXRlO3JldHVybiEoIWF8fCFvKSYmRmUoei5zZXRRdWFydGVyKHIsZSksbyl9LG4uaXNJblNlbGVjdGluZ1JhbmdlTW9udGg9ZnVuY3Rpb24oZSl7dmFyIHQscj1uLnByb3BzLGE9ci5kYXksbz1yLnNlbGVjdHNTdGFydCxzPXIuc2VsZWN0c0VuZCxpPXIuc2VsZWN0c1JhbmdlLGw9ci5zdGFydERhdGUsYz1yLmVuZERhdGUscD1udWxsIT09KHQ9bi5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09dD90Om4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybiEoIShvfHxzfHxpKXx8IXApJiYobyYmYz96ZShwLGMsZSxhKToocyYmbHx8ISghaXx8IWx8fGMpKSYmemUobCxwLGUsYSkpfSxuLmlzU2VsZWN0aW5nTW9udGhSYW5nZVN0YXJ0PWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFuLmlzSW5TZWxlY3RpbmdSYW5nZU1vbnRoKGUpKXJldHVybiExO3ZhciByPW4ucHJvcHMsYT1yLmRheSxvPXIuc3RhcnREYXRlLHM9ci5zZWxlY3RzU3RhcnQsaT0kLnNldE1vbnRoKGEsZSksbD1udWxsIT09KHQ9bi5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09dD90Om4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybiBBZShpLHM/bDpvKX0sbi5pc1NlbGVjdGluZ01vbnRoUmFuZ2VFbmQ9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIW4uaXNJblNlbGVjdGluZ1JhbmdlTW9udGgoZSkpcmV0dXJuITE7dmFyIHI9bi5wcm9wcyxhPXIuZGF5LG89ci5lbmREYXRlLHM9ci5zZWxlY3RzRW5kLGk9ci5zZWxlY3RzUmFuZ2UsbD0kLnNldE1vbnRoKGEsZSksYz1udWxsIT09KHQ9bi5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09dD90Om4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybiBBZShsLHN8fGk/YzpvKX0sbi5pc0luU2VsZWN0aW5nUmFuZ2VRdWFydGVyPWZ1bmN0aW9uKGUpe3ZhciB0LHI9bi5wcm9wcyxhPXIuZGF5LG89ci5zZWxlY3RzU3RhcnQscz1yLnNlbGVjdHNFbmQsaT1yLnNlbGVjdHNSYW5nZSxsPXIuc3RhcnREYXRlLGM9ci5lbmREYXRlLHA9bnVsbCE9PSh0PW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PXQ/dDpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4hKCEob3x8c3x8aSl8fCFwKSYmKG8mJmM/ZXQocCxjLGUsYSk6KHMmJmx8fCEoIWl8fCFsfHxjKSkmJmV0KGwscCxlLGEpKX0sbi5pc1dlZWtJbk1vbnRoPWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMuZGF5LHI9YS5hZGREYXlzKGUsNik7cmV0dXJuIEFlKGUsdCl8fEFlKHIsdCl9LG4uaXNDdXJyZW50TW9udGg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5nZXRZZWFyKGUpPT09eC5nZXRZZWFyKE1lKCkpJiZ0PT09Xy5nZXRNb250aChNZSgpKX0sbi5pc0N1cnJlbnRRdWFydGVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguZ2V0WWVhcihlKT09PXguZ2V0WWVhcihNZSgpKSYmdD09PUUuZ2V0UXVhcnRlcihNZSgpKX0sbi5pc1NlbGVjdGVkTW9udGg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBfLmdldE1vbnRoKHIpPT09dCYmeC5nZXRZZWFyKGUpPT09eC5nZXRZZWFyKHIpfSxuLmlzU2VsZWN0TW9udGhJbkxpc3Q9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiByLnNvbWUoKGZ1bmN0aW9uKHIpe3JldHVybiBuLmlzU2VsZWN0ZWRNb250aChlLHQscil9KSl9LG4uaXNTZWxlY3RlZFF1YXJ0ZXI9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBFLmdldFF1YXJ0ZXIoZSk9PT10JiZ4LmdldFllYXIoZSk9PT14LmdldFllYXIocil9LG4ucmVuZGVyV2Vla3M9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1uLnByb3BzLmZpeGVkSGVpZ2h0LHI9MCxhPSExLG89eGUoTmUobi5wcm9wcy5kYXkpLG4ucHJvcHMubG9jYWxlLG4ucHJvcHMuY2FsZW5kYXJTdGFydERheSkscz1uLnByb3BzLnNlbGVjdGVkP2Z1bmN0aW9uKGUpe3JldHVybiBuLnByb3BzLnNob3dXZWVrUGlja2VyP3hlKGUsbi5wcm9wcy5sb2NhbGUsbi5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KTpuLnByb3BzLnNlbGVjdGVkfShuLnByb3BzLnNlbGVjdGVkKTp2b2lkIDAsaT1uLnByb3BzLnByZVNlbGVjdGlvbj9mdW5jdGlvbihlKXtyZXR1cm4gbi5wcm9wcy5zaG93V2Vla1BpY2tlcj94ZShlLG4ucHJvcHMubG9jYWxlLG4ucHJvcHMuY2FsZW5kYXJTdGFydERheSk6bi5wcm9wcy5wcmVTZWxlY3Rpb259KG4ucHJvcHMucHJlU2VsZWN0aW9uKTp2b2lkIDA7ZS5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChNdCxnZSh7fSxuLnByb3BzLHthcmlhTGFiZWxQcmVmaXg6bi5wcm9wcy53ZWVrQXJpYUxhYmVsUHJlZml4LGtleTpyLGRheTpvLG1vbnRoOl8uZ2V0TW9udGgobi5wcm9wcy5kYXkpLG9uRGF5Q2xpY2s6bi5oYW5kbGVEYXlDbGljayxvbkRheU1vdXNlRW50ZXI6bi5oYW5kbGVEYXlNb3VzZUVudGVyLHNlbGVjdGVkOnMscHJlU2VsZWN0aW9uOmksc2hvd1dlZWtOdW1iZXI6bi5wcm9wcy5zaG93V2Vla051bWJlcnN9KSkpLCFhOyl7cisrLG89cC5hZGRXZWVrcyhvLDEpO3ZhciBsPXQmJnI+PTYsYz0hdCYmIW4uaXNXZWVrSW5Nb250aChvKTtpZihsfHxjKXtpZighbi5wcm9wcy5wZWVrTmV4dE1vbnRoKWJyZWFrO2E9ITB9fXJldHVybiBlfSxuLm9uTW9udGhDbGljaz1mdW5jdGlvbihlLHQpe3ZhciByPW4uaXNNb250aERpc2FibGVkRm9yTGFiZWxEYXRlKHQpLGE9ci5pc0Rpc2FibGVkLG89ci5sYWJlbERhdGU7YXx8bi5oYW5kbGVEYXlDbGljayhOZShvKSxlKX0sbi5vbk1vbnRoTW91c2VFbnRlcj1mdW5jdGlvbihlKXt2YXIgdD1uLmlzTW9udGhEaXNhYmxlZEZvckxhYmVsRGF0ZShlKSxyPXQuaXNEaXNhYmxlZCxhPXQubGFiZWxEYXRlO3J8fG4uaGFuZGxlRGF5TW91c2VFbnRlcihOZShhKSl9LG4uaGFuZGxlTW9udGhOYXZpZ2F0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIHIsYSxvLHM7bnVsbD09PShhPShyPW4ucHJvcHMpLnNldFByZVNlbGVjdGlvbil8fHZvaWQgMD09PWF8fGEuY2FsbChyLHQpLG51bGw9PT0ocz1udWxsPT09KG89bi5NT05USF9SRUZTW2VdKXx8dm9pZCAwPT09bz92b2lkIDA6by5jdXJyZW50KXx8dm9pZCAwPT09c3x8cy5mb2N1cygpfSxuLmhhbmRsZUtleWJvYXJkTmF2aWdhdGlvbj1mdW5jdGlvbihlLHQscil7dmFyIGEsbz1uLnByb3BzLHM9by5zZWxlY3RlZCxsPW8ucHJlU2VsZWN0aW9uLGM9by5zZXRQcmVTZWxlY3Rpb24scD1vLm1pbkRhdGUsZD1vLm1heERhdGUsdT1vLnNob3dGb3VyQ29sdW1uTW9udGhZZWFyUGlja2VyLGY9by5zaG93VHdvQ29sdW1uTW9udGhZZWFyUGlja2VyO2lmKGwpe3ZhciBoPVl0KHUsZiksbT1uLmdldFZlcnRpY2FsT2Zmc2V0KGgpLHY9bnVsbD09PShhPVB0W2hdKXx8dm9pZCAwPT09YT92b2lkIDA6YS5ncmlkLGc9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGEsbz10LHM9cjtzd2l0Y2goZSl7Y2FzZSB5ZS5BcnJvd1JpZ2h0Om89aS5hZGRNb250aHModCwxKSxzPTExPT09cj8wOnIrMTticmVhaztjYXNlIHllLkFycm93TGVmdDpvPWFlLnN1Yk1vbnRocyh0LDEpLHM9MD09PXI/MTE6ci0xO2JyZWFrO2Nhc2UgeWUuQXJyb3dVcDpvPWFlLnN1Yk1vbnRocyh0LG0pLHM9KG51bGw9PT0obj1udWxsPT12P3ZvaWQgMDp2WzBdKXx8dm9pZCAwPT09bj92b2lkIDA6bi5pbmNsdWRlcyhyKSk/cisxMi1tOnItbTticmVhaztjYXNlIHllLkFycm93RG93bjpvPWkuYWRkTW9udGhzKHQsbSkscz0obnVsbD09PShhPW51bGw9PXY/dm9pZCAwOnZbdi5sZW5ndGgtMV0pfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmluY2x1ZGVzKHIpKT9yLTEyK206cittfXJldHVybntuZXdDYWxjdWxhdGVkRGF0ZTpvLG5ld0NhbGN1bGF0ZWRNb250aDpzfX07aWYodCE9PXllLkVudGVyKXt2YXIgRD1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBhPWUsbz0hMSxzPTAsaT1nKGEsdCxyKSxsPWkubmV3Q2FsY3VsYXRlZERhdGUsYz1pLm5ld0NhbGN1bGF0ZWRNb250aDshbzspe2lmKHM+PTQwKXtsPXQsYz1yO2JyZWFrfXZhciB1O2lmKHAmJmw8cClhPXllLkFycm93UmlnaHQsbD0odT1nKGEsbCxjKSkubmV3Q2FsY3VsYXRlZERhdGUsYz11Lm5ld0NhbGN1bGF0ZWRNb250aDtpZihkJiZsPmQpYT15ZS5BcnJvd0xlZnQsbD0odT1nKGEsbCxjKSkubmV3Q2FsY3VsYXRlZERhdGUsYz11Lm5ld0NhbGN1bGF0ZWRNb250aDtpZihYZShsLG4ucHJvcHMpKWw9KHU9ZyhhLGwsYykpLm5ld0NhbGN1bGF0ZWREYXRlLGM9dS5uZXdDYWxjdWxhdGVkTW9udGg7ZWxzZSBvPSEwO3MrK31yZXR1cm57bmV3Q2FsY3VsYXRlZERhdGU6bCxuZXdDYWxjdWxhdGVkTW9udGg6Y319KHQsbCxyKSx5PUQubmV3Q2FsY3VsYXRlZERhdGUsaz1ELm5ld0NhbGN1bGF0ZWRNb250aDtzd2l0Y2godCl7Y2FzZSB5ZS5BcnJvd1JpZ2h0OmNhc2UgeWUuQXJyb3dMZWZ0OmNhc2UgeWUuQXJyb3dVcDpjYXNlIHllLkFycm93RG93bjpuLmhhbmRsZU1vbnRoTmF2aWdhdGlvbihrLHkpfX1lbHNlIG4uaXNNb250aERpc2FibGVkKHIpfHwobi5vbk1vbnRoQ2xpY2soZSxyKSxudWxsPT1jfHxjKHMpKX19LG4uZ2V0VmVydGljYWxPZmZzZXQ9ZnVuY3Rpb24oZSl7dmFyIHQscjtyZXR1cm4gbnVsbCE9PShyPW51bGw9PT0odD1QdFtlXSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQudmVydGljYWxOYXZpZ2F0aW9uT2Zmc2V0KSYmdm9pZCAwIT09cj9yOjB9LG4ub25Nb250aEtleURvd249ZnVuY3Rpb24oZSx0KXt2YXIgcj1uLnByb3BzLGE9ci5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbixvPXIuaGFuZGxlT25Nb250aEtleURvd24scz1lLmtleTtzIT09eWUuVGFiJiZlLnByZXZlbnREZWZhdWx0KCksYXx8bi5oYW5kbGVLZXlib2FyZE5hdmlnYXRpb24oZSxzLHQpLG8mJm8oZSl9LG4ub25RdWFydGVyQ2xpY2s9ZnVuY3Rpb24oZSx0KXt2YXIgcj16LnNldFF1YXJ0ZXIobi5wcm9wcy5kYXksdCk7R2UocixuLnByb3BzKXx8bi5oYW5kbGVEYXlDbGljayhJZShyKSxlKX0sbi5vblF1YXJ0ZXJNb3VzZUVudGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXouc2V0UXVhcnRlcihuLnByb3BzLmRheSxlKTtHZSh0LG4ucHJvcHMpfHxuLmhhbmRsZURheU1vdXNlRW50ZXIoSWUodCkpfSxuLmhhbmRsZVF1YXJ0ZXJOYXZpZ2F0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIHIsYSxvLHM7bi5pc0Rpc2FibGVkKHQpfHxuLmlzRXhjbHVkZWQodCl8fChudWxsPT09KGE9KHI9bi5wcm9wcykuc2V0UHJlU2VsZWN0aW9uKXx8dm9pZCAwPT09YXx8YS5jYWxsKHIsdCksbnVsbD09PShzPW51bGw9PT0obz1uLlFVQVJURVJfUkVGU1tlLTFdKXx8dm9pZCAwPT09bz92b2lkIDA6by5jdXJyZW50KXx8dm9pZCAwPT09c3x8cy5mb2N1cygpKX0sbi5vblF1YXJ0ZXJLZXlEb3duPWZ1bmN0aW9uKGUsdCl7dmFyIHIsYSxvPWUua2V5O2lmKCFuLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uKXN3aXRjaChvKXtjYXNlIHllLkVudGVyOm4ub25RdWFydGVyQ2xpY2soZSx0KSxudWxsPT09KGE9KHI9bi5wcm9wcykuc2V0UHJlU2VsZWN0aW9uKXx8dm9pZCAwPT09YXx8YS5jYWxsKHIsbi5wcm9wcy5zZWxlY3RlZCk7YnJlYWs7Y2FzZSB5ZS5BcnJvd1JpZ2h0OmlmKCFuLnByb3BzLnByZVNlbGVjdGlvbilicmVhaztuLmhhbmRsZVF1YXJ0ZXJOYXZpZ2F0aW9uKDQ9PT10PzE6dCsxLGwuYWRkUXVhcnRlcnMobi5wcm9wcy5wcmVTZWxlY3Rpb24sMSkpO2JyZWFrO2Nhc2UgeWUuQXJyb3dMZWZ0OmlmKCFuLnByb3BzLnByZVNlbGVjdGlvbilicmVhaztuLmhhbmRsZVF1YXJ0ZXJOYXZpZ2F0aW9uKDE9PT10PzQ6dC0xLG9lLnN1YlF1YXJ0ZXJzKG4ucHJvcHMucHJlU2VsZWN0aW9uLDEpKX19LG4uaXNNb250aERpc2FibGVkRm9yTGFiZWxEYXRlPWZ1bmN0aW9uKGUpe3ZhciB0LHI9bi5wcm9wcyxhPXIuZGF5LG89ci5taW5EYXRlLHM9ci5tYXhEYXRlLGk9ci5leGNsdWRlRGF0ZXMsbD1yLmluY2x1ZGVEYXRlcyxjPSQuc2V0TW9udGgoYSxlKTtyZXR1cm57aXNEaXNhYmxlZDpudWxsIT09KHQ9KG98fHN8fGl8fGwpJiYkZShjLG4ucHJvcHMpKSYmdm9pZCAwIT09dCYmdCxsYWJlbERhdGU6Y319LG4uaXNNb250aERpc2FibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBuLmlzTW9udGhEaXNhYmxlZEZvckxhYmVsRGF0ZShlKS5pc0Rpc2FibGVkfSxuLmdldE1vbnRoQ2xhc3NOYW1lcz1mdW5jdGlvbihlKXt2YXIgcj1uLnByb3BzLGE9ci5kYXksbz1yLnN0YXJ0RGF0ZSxzPXIuZW5kRGF0ZSxpPXIucHJlU2VsZWN0aW9uLGw9ci5tb250aENsYXNzTmFtZSxjPWw/bCgkLnNldE1vbnRoKGEsZSkpOnZvaWQgMCxwPW4uZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIHQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHRcIixcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLVwiLmNvbmNhdChlKSxjLHtcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkXCI6bi5pc01vbnRoRGlzYWJsZWQoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RlZFwiOnA/bi5pc1NlbGVjdE1vbnRoSW5MaXN0KGEsZSxwKTp2b2lkIDAsXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZFwiOiFuLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uJiZpJiZuLmlzU2VsZWN0ZWRNb250aChhLGUsaSkmJiFuLmlzTW9udGhEaXNhYmxlZChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZVwiOm4uaXNJblNlbGVjdGluZ1JhbmdlTW9udGgoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZVwiOm8mJnM/emUobyxzLGUsYSk6dm9pZCAwLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tcmFuZ2Utc3RhcnRcIjpuLmlzUmFuZ2VTdGFydE1vbnRoKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tcmFuZ2UtZW5kXCI6bi5pc1JhbmdlRW5kTW9udGgoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RpbmctcmFuZ2Utc3RhcnRcIjpuLmlzU2VsZWN0aW5nTW9udGhSYW5nZVN0YXJ0KGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tc2VsZWN0aW5nLXJhbmdlLWVuZFwiOm4uaXNTZWxlY3RpbmdNb250aFJhbmdlRW5kKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tdG9kYXlcIjpuLmlzQ3VycmVudE1vbnRoKGEsZSl9KX0sbi5nZXRUYWJJbmRleD1mdW5jdGlvbihlKXtpZihudWxsPT1uLnByb3BzLnByZVNlbGVjdGlvbilyZXR1cm5cIi0xXCI7dmFyIHQ9Xy5nZXRNb250aChuLnByb3BzLnByZVNlbGVjdGlvbik7cmV0dXJuIG4ucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb258fGUhPT10P1wiLTFcIjpcIjBcIn0sbi5nZXRRdWFydGVyVGFiSW5kZXg9ZnVuY3Rpb24oZSl7aWYobnVsbD09bi5wcm9wcy5wcmVTZWxlY3Rpb24pcmV0dXJuXCItMVwiO3ZhciB0PUUuZ2V0UXVhcnRlcihuLnByb3BzLnByZVNlbGVjdGlvbik7cmV0dXJuIG4ucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb258fGUhPT10P1wiLTFcIjpcIjBcIn0sbi5nZXRBcmlhTGFiZWw9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5wcm9wcyxyPXQuY2hvb3NlRGF5QXJpYUxhYmVsUHJlZml4LGE9dm9pZCAwPT09cj9cIkNob29zZVwiOnIsbz10LmRpc2FibGVkRGF5QXJpYUxhYmVsUHJlZml4LHM9dm9pZCAwPT09bz9cIk5vdCBhdmFpbGFibGVcIjpvLGk9dC5kYXksbD10LmxvY2FsZSxjPSQuc2V0TW9udGgoaSxlKSxwPW4uaXNEaXNhYmxlZChjKXx8bi5pc0V4Y2x1ZGVkKGMpP3M6YTtyZXR1cm5cIlwiLmNvbmNhdChwLFwiIFwiKS5jb25jYXQoX2UoYyxcIk1NTU0geXl5eVwiLGwpKX0sbi5nZXRRdWFydGVyQ2xhc3NOYW1lcz1mdW5jdGlvbihlKXt2YXIgcj1uLnByb3BzLGE9ci5kYXksbz1yLnN0YXJ0RGF0ZSxzPXIuZW5kRGF0ZSxpPXIuc2VsZWN0ZWQsbD1yLm1pbkRhdGUsYz1yLm1heERhdGUscD1yLmV4Y2x1ZGVEYXRlcyxkPXIuaW5jbHVkZURhdGVzLHU9ci5maWx0ZXJEYXRlLGY9ci5wcmVTZWxlY3Rpb24saD1yLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uLG09KGx8fGN8fHB8fGR8fHUpJiZHZSh6LnNldFF1YXJ0ZXIoYSxlKSxuLnByb3BzKTtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0XCIsXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLVwiLmNvbmNhdChlKSx7XCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkXCI6bSxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tc2VsZWN0ZWRcIjppP24uaXNTZWxlY3RlZFF1YXJ0ZXIoYSxlLGkpOnZvaWQgMCxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWRcIjohaCYmZiYmbi5pc1NlbGVjdGVkUXVhcnRlcihhLGUsZikmJiFtLFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2VcIjpuLmlzSW5TZWxlY3RpbmdSYW5nZVF1YXJ0ZXIoZSksXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlXCI6byYmcz9ldChvLHMsZSxhKTp2b2lkIDAsXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXJhbmdlLXN0YXJ0XCI6bi5pc1JhbmdlU3RhcnRRdWFydGVyKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1yYW5nZS1lbmRcIjpuLmlzUmFuZ2VFbmRRdWFydGVyKGUpfSl9LG4uZ2V0TW9udGhDb250ZW50PWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMscj10LnNob3dGdWxsTW9udGhZZWFyUGlja2VyLGE9dC5yZW5kZXJNb250aENvbnRlbnQsbz10LmxvY2FsZSxzPXQuZGF5LGk9VmUoZSxvKSxsPUJlKGUsbyk7cmV0dXJuIGE/YShlLGksbCxzKTpyP2w6aX0sbi5nZXRRdWFydGVyQ29udGVudD1mdW5jdGlvbihlKXt2YXIgdCxyPW4ucHJvcHMsYT1yLnJlbmRlclF1YXJ0ZXJDb250ZW50LG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gX2Uoei5zZXRRdWFydGVyKE1lKCksZSksXCJRUVFcIix0KX0oZSxyLmxvY2FsZSk7cmV0dXJuIG51bGwhPT0odD1udWxsPT1hP3ZvaWQgMDphKGUsbykpJiZ2b2lkIDAhPT10P3Q6b30sbi5yZW5kZXJNb250aHM9ZnVuY3Rpb24oKXt2YXIgZSx0PW4ucHJvcHMscj10LnNob3dUd29Db2x1bW5Nb250aFllYXJQaWNrZXIsYT10LnNob3dGb3VyQ29sdW1uTW9udGhZZWFyUGlja2VyLG89dC5kYXkscz10LnNlbGVjdGVkLGk9bnVsbD09PShlPVB0W1l0KGEscildKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5ncmlkO3JldHVybiBudWxsPT1pP3ZvaWQgMDppLm1hcCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXdyYXBwZXJcIixrZXk6dH0sZS5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtyZWY6bi5NT05USF9SRUZTW2VdLGtleTp0LG9uQ2xpY2s6ZnVuY3Rpb24odCl7bi5vbk1vbnRoQ2xpY2sodCxlKX0sb25LZXlEb3duOmZ1bmN0aW9uKHQpe3l0KHQpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQua2V5PXllLkVudGVyKSxuLm9uTW9udGhLZXlEb3duKHQsZSl9LG9uTW91c2VFbnRlcjpuLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5vbk1vbnRoTW91c2VFbnRlcihlKX0sb25Qb2ludGVyRW50ZXI6bi5wcm9wcy51c2VQb2ludGVyRXZlbnQ/ZnVuY3Rpb24oKXtyZXR1cm4gbi5vbk1vbnRoTW91c2VFbnRlcihlKX06dm9pZCAwLHRhYkluZGV4Ok51bWJlcihuLmdldFRhYkluZGV4KGUpKSxjbGFzc05hbWU6bi5nZXRNb250aENsYXNzTmFtZXMoZSksXCJhcmlhLWRpc2FibGVkXCI6bi5pc01vbnRoRGlzYWJsZWQoZSkscm9sZTpcIm9wdGlvblwiLFwiYXJpYS1sYWJlbFwiOm4uZ2V0QXJpYUxhYmVsKGUpLFwiYXJpYS1jdXJyZW50XCI6bi5pc0N1cnJlbnRNb250aChvLGUpP1wiZGF0ZVwiOnZvaWQgMCxcImFyaWEtc2VsZWN0ZWRcIjpzP24uaXNTZWxlY3RlZE1vbnRoKG8sZSxzKTp2b2lkIDB9LG4uZ2V0TW9udGhDb250ZW50KGUpKX0pKSl9KSl9LG4ucmVuZGVyUXVhcnRlcnM9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLnNlbGVjdGVkO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci13cmFwcGVyXCJ9LFsxLDIsMyw0XS5tYXAoKGZ1bmN0aW9uKGUsYSl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6YSxyZWY6bi5RVUFSVEVSX1JFRlNbYV0scm9sZTpcIm9wdGlvblwiLG9uQ2xpY2s6ZnVuY3Rpb24odCl7bi5vblF1YXJ0ZXJDbGljayh0LGUpfSxvbktleURvd246ZnVuY3Rpb24odCl7bi5vblF1YXJ0ZXJLZXlEb3duKHQsZSl9LG9uTW91c2VFbnRlcjpuLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5vblF1YXJ0ZXJNb3VzZUVudGVyKGUpfSxvblBvaW50ZXJFbnRlcjpuLnByb3BzLnVzZVBvaW50ZXJFdmVudD9mdW5jdGlvbigpe3JldHVybiBuLm9uUXVhcnRlck1vdXNlRW50ZXIoZSl9OnZvaWQgMCxjbGFzc05hbWU6bi5nZXRRdWFydGVyQ2xhc3NOYW1lcyhlKSxcImFyaWEtc2VsZWN0ZWRcIjpyP24uaXNTZWxlY3RlZFF1YXJ0ZXIodCxlLHIpOnZvaWQgMCx0YWJJbmRleDpOdW1iZXIobi5nZXRRdWFydGVyVGFiSW5kZXgoZSkpLFwiYXJpYS1jdXJyZW50XCI6bi5pc0N1cnJlbnRRdWFydGVyKHQsZSk/XCJkYXRlXCI6dm9pZCAwfSxuLmdldFF1YXJ0ZXJDb250ZW50KGUpKX0pKSl9LG4uZ2V0Q2xhc3NOYW1lcz1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMscj1lLnNlbGVjdGluZ0RhdGUsYT1lLnNlbGVjdHNTdGFydCxvPWUuc2VsZWN0c0VuZCxzPWUuc2hvd01vbnRoWWVhclBpY2tlcixpPWUuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyLGw9ZS5zaG93V2Vla1BpY2tlcjtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGhcIix7XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlXCI6ciYmKGF8fG8pfSx7XCJyZWFjdC1kYXRlcGlja2VyX19tb250aFBpY2tlclwiOnN9LHtcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXJQaWNrZXJcIjppfSx7XCJyZWFjdC1kYXRlcGlja2VyX193ZWVrUGlja2VyXCI6bH0pfSxufXJldHVybiB2ZShuLGUpLG4ucHJvdG90eXBlLmdldFNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLnNlbGVjdGVkLHI9ZS5zZWxlY3RlZERhdGVzO3JldHVybiBlLnNlbGVjdHNNdWx0aXBsZT9yOnQ/W3RdOnZvaWQgMH0sbi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuc2hvd01vbnRoWWVhclBpY2tlcixyPWUuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyLG49ZS5kYXksYT1lLmFyaWFMYWJlbFByZWZpeCxvPXZvaWQgMD09PWE/XCJNb250aCBcIjphLHM9bz9vLnRyaW0oKStcIiBcIjpcIlwiO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOnRoaXMuZ2V0Q2xhc3NOYW1lcygpLG9uTW91c2VMZWF2ZTp0aGlzLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6dGhpcy5oYW5kbGVNb3VzZUxlYXZlLG9uUG9pbnRlckxlYXZlOnRoaXMucHJvcHMudXNlUG9pbnRlckV2ZW50P3RoaXMuaGFuZGxlTW91c2VMZWF2ZTp2b2lkIDAsXCJhcmlhLWxhYmVsXCI6XCJcIi5jb25jYXQocykuY29uY2F0KF9lKG4sXCJNTU1NLCB5eXl5XCIsdGhpcy5wcm9wcy5sb2NhbGUpKSxyb2xlOlwibGlzdGJveFwifSx0P3RoaXMucmVuZGVyTW9udGhzKCk6cj90aGlzLnJlbmRlclF1YXJ0ZXJzKCk6dGhpcy5yZW5kZXJXZWVrcygpKX0sbn0oci5Db21wb25lbnQpLE50PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuaXNTZWxlY3RlZE1vbnRoPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3BzLm1vbnRoPT09ZX0sdC5yZW5kZXJPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvcHMubW9udGhOYW1lcy5tYXAoKGZ1bmN0aW9uKGUscil7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6dC5pc1NlbGVjdGVkTW9udGgocik/XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24gcmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLS1zZWxlY3RlZF9tb250aFwiOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uXCIsa2V5OmUsb25DbGljazp0Lm9uQ2hhbmdlLmJpbmQodCxyKSxcImFyaWEtc2VsZWN0ZWRcIjp0LmlzU2VsZWN0ZWRNb250aChyKT9cInRydWVcIjp2b2lkIDB9LHQuaXNTZWxlY3RlZE1vbnRoKHIpP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLS1zZWxlY3RlZFwifSxcIuKck1wiKTpcIlwiLGUpfSkpfSx0Lm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3BzLm9uQ2hhbmdlKGUpfSx0LmhhbmRsZUNsaWNrT3V0c2lkZT1mdW5jdGlvbigpe3JldHVybiB0LnByb3BzLm9uQ2FuY2VsKCl9LHR9cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93blwifSx0aGlzLnJlbmRlck9wdGlvbnMoKSl9LHR9KHIuQ29tcG9uZW50KSxPdD1mZS5kZWZhdWx0KE50KSxJdD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0LnN0YXRlPXtkcm9wZG93blZpc2libGU6ITF9LHQucmVuZGVyU2VsZWN0T3B0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLHtrZXk6ZSx2YWx1ZTp0fSxlKX0pKX0sdC5yZW5kZXJTZWxlY3RNb2RlPWZ1bmN0aW9uKGUpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIix7dmFsdWU6dC5wcm9wcy5tb250aCxjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1zZWxlY3RcIixvbkNoYW5nZTpmdW5jdGlvbihlKXtyZXR1cm4gdC5vbkNoYW5nZShwYXJzZUludChlLnRhcmdldC52YWx1ZSkpfX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zKGUpKX0sdC5yZW5kZXJSZWFkVmlldz1mdW5jdGlvbihlLHIpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7a2V5OlwicmVhZFwiLHN0eWxlOnt2aXNpYmlsaXR5OmU/XCJ2aXNpYmxlXCI6XCJoaWRkZW5cIn0sY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3XCIsb25DbGljazp0LnRvZ2dsZURyb3Bkb3dufSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvd1wifSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLXNlbGVjdGVkLW1vbnRoXCJ9LHJbdC5wcm9wcy5tb250aF0pKX0sdC5yZW5kZXJEcm9wZG93bj1mdW5jdGlvbihlKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE90LGdlKHtrZXk6XCJkcm9wZG93blwifSx0LnByb3BzLHttb250aE5hbWVzOmUsb25DaGFuZ2U6dC5vbkNoYW5nZSxvbkNhbmNlbDp0LnRvZ2dsZURyb3Bkb3dufSkpfSx0LnJlbmRlclNjcm9sbE1vZGU9ZnVuY3Rpb24oZSl7dmFyIHI9dC5zdGF0ZS5kcm9wZG93blZpc2libGUsbj1bdC5yZW5kZXJSZWFkVmlldyghcixlKV07cmV0dXJuIHImJm4udW5zaGlmdCh0LnJlbmRlckRyb3Bkb3duKGUpKSxufSx0Lm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3QudG9nZ2xlRHJvcGRvd24oKSxlIT09dC5wcm9wcy5tb250aCYmdC5wcm9wcy5vbkNoYW5nZShlKX0sdC50b2dnbGVEcm9wZG93bj1mdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHtkcm9wZG93blZpc2libGU6IXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlfSl9LHR9cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLHI9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTFdLm1hcCh0aGlzLnByb3BzLnVzZVNob3J0TW9udGhJbkRyb3Bkb3duP2Z1bmN0aW9uKGUpe3JldHVybiBWZShlLHQucHJvcHMubG9jYWxlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIEJlKGUsdC5wcm9wcy5sb2NhbGUpfSk7c3dpdGNoKHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKXtjYXNlXCJzY3JvbGxcIjplPXRoaXMucmVuZGVyU2Nyb2xsTW9kZShyKTticmVhaztjYXNlXCJzZWxlY3RcIjplPXRoaXMucmVuZGVyU2VsZWN0TW9kZShyKX1yZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLWNvbnRhaW5lciByZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi1jb250YWluZXItLVwiLmNvbmNhdCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl9LGUpfSx0fShyLkNvbXBvbmVudCk7ZnVuY3Rpb24gVHQoZSx0KXtmb3IodmFyIHI9W10sbj1OZShlKSxhPU5lKHQpOyFOLmlzQWZ0ZXIobixhKTspci5wdXNoKE1lKG4pKSxuPWkuYWRkTW9udGhzKG4sMSk7cmV0dXJuIHJ9dmFyIFJ0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIodCl7dmFyIHI9ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIHIucmVuZGVyT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiByLnN0YXRlLm1vbnRoWWVhcnNMaXN0Lm1hcCgoZnVuY3Rpb24oZSl7dmFyIHQ9WS5nZXRUaW1lKGUpLG49TGUoci5wcm9wcy5kYXRlLGUpJiZBZShyLnByb3BzLmRhdGUsZSk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6bj9cInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uLS1zZWxlY3RlZF9tb250aC15ZWFyXCI6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvblwiLGtleTp0LG9uQ2xpY2s6ci5vbkNoYW5nZS5iaW5kKHIsdCksXCJhcmlhLXNlbGVjdGVkXCI6bj9cInRydWVcIjp2b2lkIDB9LG4/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbi0tc2VsZWN0ZWRcIn0sXCLinJNcIik6XCJcIixfZShlLHIucHJvcHMuZGF0ZUZvcm1hdCxyLnByb3BzLmxvY2FsZSkpfSkpfSxyLm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiByLnByb3BzLm9uQ2hhbmdlKGUpfSxyLmhhbmRsZUNsaWNrT3V0c2lkZT1mdW5jdGlvbigpe3IucHJvcHMub25DYW5jZWwoKX0sci5zdGF0ZT17bW9udGhZZWFyc0xpc3Q6VHQoci5wcm9wcy5taW5EYXRlLHIucHJvcHMubWF4RGF0ZSl9LHJ9cmV0dXJuIHZlKHIsZSksci5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dC5jbHN4KHtcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd25cIjohMCxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tLXNjcm9sbGFibGVcIjp0aGlzLnByb3BzLnNjcm9sbGFibGVNb250aFllYXJEcm9wZG93bn0pO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOmV9LHRoaXMucmVuZGVyT3B0aW9ucygpKX0scn0oci5Db21wb25lbnQpLEx0PWZlLmRlZmF1bHQoUnQpLEF0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuc3RhdGU9e2Ryb3Bkb3duVmlzaWJsZTohMX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPU5lKHQucHJvcHMubWluRGF0ZSkscj1OZSh0LnByb3BzLm1heERhdGUpLG49W107IU4uaXNBZnRlcihlLHIpOyl7dmFyIGE9WS5nZXRUaW1lKGUpO24ucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIix7a2V5OmEsdmFsdWU6YX0sX2UoZSx0LnByb3BzLmRhdGVGb3JtYXQsdC5wcm9wcy5sb2NhbGUpKSksZT1pLmFkZE1vbnRocyhlLDEpfXJldHVybiBufSx0Lm9uU2VsZWN0Q2hhbmdlPWZ1bmN0aW9uKGUpe3Qub25DaGFuZ2UocGFyc2VJbnQoZS50YXJnZXQudmFsdWUpKX0sdC5yZW5kZXJTZWxlY3RNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiLHt2YWx1ZTpZLmdldFRpbWUoTmUodC5wcm9wcy5kYXRlKSksY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1zZWxlY3RcIixvbkNoYW5nZTp0Lm9uU2VsZWN0Q2hhbmdlfSx0LnJlbmRlclNlbGVjdE9wdGlvbnMoKSl9LHQucmVuZGVyUmVhZFZpZXc9ZnVuY3Rpb24oZSl7dmFyIHI9X2UodC5wcm9wcy5kYXRlLHQucHJvcHMuZGF0ZUZvcm1hdCx0LnByb3BzLmxvY2FsZSk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6XCJyZWFkXCIsc3R5bGU6e3Zpc2liaWxpdHk6ZT9cInZpc2libGVcIjpcImhpZGRlblwifSxjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlld1wiLG9uQ2xpY2s6dC50b2dnbGVEcm9wZG93bn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvd1wifSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tc2VsZWN0ZWQtbW9udGgteWVhclwifSxyKSl9LHQucmVuZGVyRHJvcGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEx0LGdlKHtrZXk6XCJkcm9wZG93blwifSx0LnByb3BzLHtvbkNoYW5nZTp0Lm9uQ2hhbmdlLG9uQ2FuY2VsOnQudG9nZ2xlRHJvcGRvd259KSl9LHQucmVuZGVyU2Nyb2xsTW9kZT1mdW5jdGlvbigpe3ZhciBlPXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlLHI9W3QucmVuZGVyUmVhZFZpZXcoIWUpXTtyZXR1cm4gZSYmci51bnNoaWZ0KHQucmVuZGVyRHJvcGRvd24oKSkscn0sdC5vbkNoYW5nZT1mdW5jdGlvbihlKXt0LnRvZ2dsZURyb3Bkb3duKCk7dmFyIHI9TWUoZSk7TGUodC5wcm9wcy5kYXRlLHIpJiZBZSh0LnByb3BzLmRhdGUscil8fHQucHJvcHMub25DaGFuZ2Uocil9LHQudG9nZ2xlRHJvcGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7ZHJvcGRvd25WaXNpYmxlOiF0LnN0YXRlLmRyb3Bkb3duVmlzaWJsZX0pfSx0fXJldHVybiB2ZSh0LGUpLHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlO3N3aXRjaCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl7Y2FzZVwic2Nyb2xsXCI6ZT10aGlzLnJlbmRlclNjcm9sbE1vZGUoKTticmVhaztjYXNlXCJzZWxlY3RcIjplPXRoaXMucmVuZGVyU2VsZWN0TW9kZSgpfXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXIgcmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXItLVwiLmNvbmNhdCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl9LGUpfSx0fShyLkNvbXBvbmVudCksRnQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciByPW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gci5zdGF0ZT17aGVpZ2h0Om51bGx9LHIuc2Nyb2xsVG9UaGVTZWxlY3RlZFRpbWU9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dmFyIGUsbixhO3IubGlzdCYmKHIubGlzdC5zY3JvbGxUb3A9bnVsbCE9PShhPXIuY2VudGVyTGkmJnQuY2FsY0NlbnRlclBvc2l0aW9uKHIucHJvcHMubW9udGhSZWY/ci5wcm9wcy5tb250aFJlZi5jbGllbnRIZWlnaHQtKG51bGwhPT0obj1udWxsPT09KGU9ci5oZWFkZXIpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNsaWVudEhlaWdodCkmJnZvaWQgMCE9PW4/bjowKTpyLmxpc3QuY2xpZW50SGVpZ2h0LHIuY2VudGVyTGkpKSYmdm9pZCAwIT09YT9hOjApfSkpfSxyLmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGUpe3ZhciB0LG47KHIucHJvcHMubWluVGltZXx8ci5wcm9wcy5tYXhUaW1lKSYmYXQoZSxyLnByb3BzKXx8KHIucHJvcHMuZXhjbHVkZVRpbWVzfHxyLnByb3BzLmluY2x1ZGVUaW1lc3x8ci5wcm9wcy5maWx0ZXJUaW1lKSYmbnQoZSxyLnByb3BzKXx8bnVsbD09PShuPSh0PXIucHJvcHMpLm9uQ2hhbmdlKXx8dm9pZCAwPT09bnx8bi5jYWxsKHQsZSl9LHIuaXNTZWxlY3RlZFRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHIucHJvcHMuc2VsZWN0ZWQmJih0PXIucHJvcHMuc2VsZWN0ZWQsbj1lLHZ0KHQpLmdldFRpbWUoKT09PXZ0KG4pLmdldFRpbWUoKSk7dmFyIHQsbn0sci5pc0Rpc2FibGVkVGltZT1mdW5jdGlvbihlKXtyZXR1cm4oci5wcm9wcy5taW5UaW1lfHxyLnByb3BzLm1heFRpbWUpJiZhdChlLHIucHJvcHMpfHwoci5wcm9wcy5leGNsdWRlVGltZXN8fHIucHJvcHMuaW5jbHVkZVRpbWVzfHxyLnByb3BzLmZpbHRlclRpbWUpJiZudChlLHIucHJvcHMpfSxyLmxpQ2xhc3Nlcz1mdW5jdGlvbihlKXt2YXIgbixhPVtcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtXCIsci5wcm9wcy50aW1lQ2xhc3NOYW1lP3IucHJvcHMudGltZUNsYXNzTmFtZShlKTp2b2lkIDBdO3JldHVybiByLmlzU2VsZWN0ZWRUaW1lKGUpJiZhLnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tc2VsZWN0ZWRcIiksci5pc0Rpc2FibGVkVGltZShlKSYmYS5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLWRpc2FibGVkXCIpLHIucHJvcHMuaW5qZWN0VGltZXMmJigzNjAwKmIuZ2V0SG91cnMoZSkrNjAqQy5nZXRNaW51dGVzKGUpK1AuZ2V0U2Vjb25kcyhlKSklKDYwKihudWxsIT09KG49ci5wcm9wcy5pbnRlcnZhbHMpJiZ2b2lkIDAhPT1uP246dC5kZWZhdWx0UHJvcHMuaW50ZXJ2YWxzKSkhPTAmJmEucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1pbmplY3RlZFwiKSxhLmpvaW4oXCIgXCIpfSxyLmhhbmRsZU9uS2V5RG93bj1mdW5jdGlvbihlLHQpe3ZhciBuLGE7ZS5rZXk9PT15ZS5TcGFjZSYmKGUucHJldmVudERlZmF1bHQoKSxlLmtleT15ZS5FbnRlciksKGUua2V5PT09eWUuQXJyb3dVcHx8ZS5rZXk9PT15ZS5BcnJvd0xlZnQpJiZlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZlLnRhcmdldC5wcmV2aW91c1NpYmxpbmcmJihlLnByZXZlbnREZWZhdWx0KCksZS50YXJnZXQucHJldmlvdXNTaWJsaW5nIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmUudGFyZ2V0LnByZXZpb3VzU2libGluZy5mb2N1cygpKSwoZS5rZXk9PT15ZS5BcnJvd0Rvd258fGUua2V5PT09eWUuQXJyb3dSaWdodCkmJmUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmUudGFyZ2V0Lm5leHRTaWJsaW5nJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUudGFyZ2V0Lm5leHRTaWJsaW5nIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmUudGFyZ2V0Lm5leHRTaWJsaW5nLmZvY3VzKCkpLGUua2V5PT09eWUuRW50ZXImJnIuaGFuZGxlQ2xpY2sodCksbnVsbD09PShhPShuPXIucHJvcHMpLmhhbmRsZU9uS2V5RG93bil8fHZvaWQgMD09PWF8fGEuY2FsbChuLGUpfSxyLnJlbmRlclRpbWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLG49W10sYT1yLnByb3BzLmZvcm1hdD9yLnByb3BzLmZvcm1hdDpcInBcIixvPW51bGwhPT0oZT1yLnByb3BzLmludGVydmFscykmJnZvaWQgMCE9PWU/ZTp0LmRlZmF1bHRQcm9wcy5pbnRlcnZhbHMsaT1yLnByb3BzLnNlbGVjdGVkfHxyLnByb3BzLm9wZW5Ub0RhdGV8fE1lKCksbD1ZZShpKSxjPXIucHJvcHMuaW5qZWN0VGltZXMmJnIucHJvcHMuaW5qZWN0VGltZXMuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5nZXRUaW1lKCktdC5nZXRUaW1lKCl9KSkscD02MCpmdW5jdGlvbihlKXt2YXIgdD1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLGUuZ2V0RGF0ZSgpKSxyPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSxlLmdldE1vbnRoKCksZS5nZXREYXRlKCksMjQpO3JldHVybiBNYXRoLnJvdW5kKCgrci0rdCkvMzZlNSl9KGkpLGQ9cC9vLHU9MDt1PGQ7dSsrKXt2YXIgZj1zLmFkZE1pbnV0ZXMobCx1Km8pO2lmKG4ucHVzaChmKSxjKXt2YXIgaD1mdChsLGYsdSxvLGMpO249bi5jb25jYXQoaCl9fXZhciBtPW4ucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiB0LmdldFRpbWUoKTw9aS5nZXRUaW1lKCk/dDplfSksblswXSk7cmV0dXJuIG4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIix7a2V5OmUudmFsdWVPZigpLG9uQ2xpY2s6ci5oYW5kbGVDbGljay5iaW5kKHIsZSksY2xhc3NOYW1lOnIubGlDbGFzc2VzKGUpLHJlZjpmdW5jdGlvbih0KXtlPT09bSYmKHIuY2VudGVyTGk9dCl9LG9uS2V5RG93bjpmdW5jdGlvbih0KXtyLmhhbmRsZU9uS2V5RG93bih0LGUpfSx0YWJJbmRleDplPT09bT8wOi0xLHJvbGU6XCJvcHRpb25cIixcImFyaWEtc2VsZWN0ZWRcIjpyLmlzU2VsZWN0ZWRUaW1lKGUpP1widHJ1ZVwiOnZvaWQgMCxcImFyaWEtZGlzYWJsZWRcIjpyLmlzRGlzYWJsZWRUaW1lKGUpP1widHJ1ZVwiOnZvaWQgMH0sX2UoZSxhLHIucHJvcHMubG9jYWxlKSl9KSl9LHJ9cmV0dXJuIHZlKHQsZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2ludGVydmFsczozMCx0b2RheUJ1dHRvbjpudWxsLHRpbWVDYXB0aW9uOlwiVGltZVwifX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMuc2Nyb2xsVG9UaGVTZWxlY3RlZFRpbWUoKSx0aGlzLnByb3BzLm1vbnRoUmVmJiZ0aGlzLmhlYWRlciYmdGhpcy5zZXRTdGF0ZSh7aGVpZ2h0OnRoaXMucHJvcHMubW9udGhSZWYuY2xpZW50SGVpZ2h0LXRoaXMuaGVhZGVyLmNsaWVudEhlaWdodH0pfSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZSxyPXRoaXMsbj10aGlzLnN0YXRlLmhlaWdodDtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIFwiLmNvbmNhdCgobnVsbCE9PShlPXRoaXMucHJvcHMudG9kYXlCdXR0b24pJiZ2b2lkIDAhPT1lP2U6dC5kZWZhdWx0UHJvcHMudG9kYXlCdXR0b24pP1wicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXItLXdpdGgtdG9kYXktYnV0dG9uXCI6XCJcIil9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXIgcmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lIFwiLmNvbmNhdCh0aGlzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seT9cInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZS0tb25seVwiOlwiXCIpLHJlZjpmdW5jdGlvbihlKXtyLmhlYWRlcj1lfX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyXCJ9LHRoaXMucHJvcHMudGltZUNhcHRpb24pKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZVwifSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3hcIn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0XCIscmVmOmZ1bmN0aW9uKGUpe3IubGlzdD1lfSxzdHlsZTpuP3toZWlnaHQ6bn06e30scm9sZTpcImxpc3Rib3hcIixcImFyaWEtbGFiZWxcIjp0aGlzLnByb3BzLnRpbWVDYXB0aW9ufSx0aGlzLnJlbmRlclRpbWVzKCkpKSkpfSx0LmNhbGNDZW50ZXJQb3NpdGlvbj1mdW5jdGlvbihlLHQpe3JldHVybiB0Lm9mZnNldFRvcC0oZS8yLXQuY2xpZW50SGVpZ2h0LzIpfSx0fShyLkNvbXBvbmVudCksSHQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihuKXt2YXIgYT1lLmNhbGwodGhpcyxuKXx8dGhpcztyZXR1cm4gYS5ZRUFSX1JFRlM9RGUoW10sQXJyYXkoYS5wcm9wcy55ZWFySXRlbU51bWJlciksITApLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gci5jcmVhdGVSZWYoKX0pKSxhLmlzRGlzYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGplKGUse21pbkRhdGU6YS5wcm9wcy5taW5EYXRlLG1heERhdGU6YS5wcm9wcy5tYXhEYXRlLGV4Y2x1ZGVEYXRlczphLnByb3BzLmV4Y2x1ZGVEYXRlcyxpbmNsdWRlRGF0ZXM6YS5wcm9wcy5pbmNsdWRlRGF0ZXMsZmlsdGVyRGF0ZTphLnByb3BzLmZpbHRlckRhdGV9KX0sYS5pc0V4Y2x1ZGVkPWZ1bmN0aW9uKGUpe3JldHVybiBVZShlLHtleGNsdWRlRGF0ZXM6YS5wcm9wcy5leGNsdWRlRGF0ZXN9KX0sYS5zZWxlY3RpbmdEYXRlPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIG51bGwhPT0oZT1hLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT1lP2U6YS5wcm9wcy5wcmVTZWxlY3Rpb259LGEudXBkYXRlRm9jdXNPblBhZ2luYXRlPWZ1bmN0aW9uKGUpe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dmFyIHQscjtudWxsPT09KHI9bnVsbD09PSh0PWEuWUVBUl9SRUZTW2VdKXx8dm9pZCAwPT09dD92b2lkIDA6dC5jdXJyZW50KXx8dm9pZCAwPT09cnx8ci5mb2N1cygpfSkpfSxhLmhhbmRsZVllYXJDbGljaz1mdW5jdGlvbihlLHQpe2EucHJvcHMub25EYXlDbGljayYmYS5wcm9wcy5vbkRheUNsaWNrKGUsdCl9LGEuaGFuZGxlWWVhck5hdmlnYXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcixuLG8scyxpPWEucHJvcHMsbD1pLmRhdGUsYz1pLnllYXJJdGVtTnVtYmVyO2lmKHZvaWQgMCE9PWwmJnZvaWQgMCE9PWMpe3ZhciBwPW10KGwsYykuc3RhcnRQZXJpb2Q7YS5pc0Rpc2FibGVkKHQpfHxhLmlzRXhjbHVkZWQodCl8fChudWxsPT09KG49KHI9YS5wcm9wcykuc2V0UHJlU2VsZWN0aW9uKXx8dm9pZCAwPT09bnx8bi5jYWxsKHIsdCksZS1wPDA/YS51cGRhdGVGb2N1c09uUGFnaW5hdGUoYy0ocC1lKSk6ZS1wPj1jP2EudXBkYXRlRm9jdXNPblBhZ2luYXRlKE1hdGguYWJzKGMtKGUtcCkpKTpudWxsPT09KHM9bnVsbD09PShvPWEuWUVBUl9SRUZTW2UtcF0pfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmN1cnJlbnQpfHx2b2lkIDA9PT1zfHxzLmZvY3VzKCkpfX0sYS5pc1NhbWVEYXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSGUoZSx0KX0sYS5pc0N1cnJlbnRZZWFyPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09eC5nZXRZZWFyKE1lKCkpfSxhLmlzUmFuZ2VTdGFydD1mdW5jdGlvbihlKXtyZXR1cm4gYS5wcm9wcy5zdGFydERhdGUmJmEucHJvcHMuZW5kRGF0ZSYmTGUoRy5zZXRZZWFyKE1lKCksZSksYS5wcm9wcy5zdGFydERhdGUpfSxhLmlzUmFuZ2VFbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGEucHJvcHMuc3RhcnREYXRlJiZhLnByb3BzLmVuZERhdGUmJkxlKEcuc2V0WWVhcihNZSgpLGUpLGEucHJvcHMuZW5kRGF0ZSl9LGEuaXNJblJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBKZShlLGEucHJvcHMuc3RhcnREYXRlLGEucHJvcHMuZW5kRGF0ZSl9LGEuaXNJblNlbGVjdGluZ1JhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWEucHJvcHMscj10LnNlbGVjdHNTdGFydCxuPXQuc2VsZWN0c0VuZCxvPXQuc2VsZWN0c1JhbmdlLHM9dC5zdGFydERhdGUsaT10LmVuZERhdGU7cmV0dXJuISghKHJ8fG58fG8pfHwhYS5zZWxlY3RpbmdEYXRlKCkpJiYociYmaT9KZShlLGEuc2VsZWN0aW5nRGF0ZSgpLGkpOihuJiZzfHwhKCFvfHwhc3x8aSkpJiZKZShlLHMsYS5zZWxlY3RpbmdEYXRlKCkpKX0sYS5pc1NlbGVjdGluZ1JhbmdlU3RhcnQ9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIWEuaXNJblNlbGVjdGluZ1JhbmdlKGUpKXJldHVybiExO3ZhciByPWEucHJvcHMsbj1yLnN0YXJ0RGF0ZSxvPXIuc2VsZWN0c1N0YXJ0LHM9Ry5zZXRZZWFyKE1lKCksZSk7cmV0dXJuIExlKHMsbz9udWxsIT09KHQ9YS5zZWxlY3RpbmdEYXRlKCkpJiZ2b2lkIDAhPT10P3Q6bnVsbDpudWxsIT1uP246bnVsbCl9LGEuaXNTZWxlY3RpbmdSYW5nZUVuZD1mdW5jdGlvbihlKXt2YXIgdDtpZighYS5pc0luU2VsZWN0aW5nUmFuZ2UoZSkpcmV0dXJuITE7dmFyIHI9YS5wcm9wcyxuPXIuZW5kRGF0ZSxvPXIuc2VsZWN0c0VuZCxzPXIuc2VsZWN0c1JhbmdlLGk9Ry5zZXRZZWFyKE1lKCksZSk7cmV0dXJuIExlKGksb3x8cz9udWxsIT09KHQ9YS5zZWxlY3RpbmdEYXRlKCkpJiZ2b2lkIDAhPT10P3Q6bnVsbDpudWxsIT1uP246bnVsbCl9LGEuaXNLZXlib2FyZFNlbGVjdGVkPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PWEucHJvcHMuZGF0ZSYmbnVsbCE9YS5wcm9wcy5zZWxlY3RlZCYmbnVsbCE9YS5wcm9wcy5wcmVTZWxlY3Rpb24pe3ZhciB0PWEucHJvcHMscj10Lm1pbkRhdGUsbj10Lm1heERhdGUsbz10LmV4Y2x1ZGVEYXRlcyxzPXQuaW5jbHVkZURhdGVzLGk9dC5maWx0ZXJEYXRlLGw9T2UoRy5zZXRZZWFyKGEucHJvcHMuZGF0ZSxlKSksYz0ocnx8bnx8b3x8c3x8aSkmJlplKGUsYS5wcm9wcyk7cmV0dXJuIWEucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24mJiFhLnByb3BzLmlubGluZSYmIUhlKGwsT2UoYS5wcm9wcy5zZWxlY3RlZCkpJiZIZShsLE9lKGEucHJvcHMucHJlU2VsZWN0aW9uKSkmJiFjfX0sYS5vblllYXJDbGljaz1mdW5jdGlvbihlLHQpe3ZhciByPWEucHJvcHMuZGF0ZTt2b2lkIDAhPT1yJiZhLmhhbmRsZVllYXJDbGljayhPZShHLnNldFllYXIocix0KSksZSl9LGEub25ZZWFyS2V5RG93bj1mdW5jdGlvbihlLHQpe3ZhciByLG4sbz1lLmtleSxzPWEucHJvcHMsaT1zLmRhdGUsbD1zLnllYXJJdGVtTnVtYmVyLGM9cy5oYW5kbGVPbktleURvd247aWYobyE9PXllLlRhYiYmZS5wcmV2ZW50RGVmYXVsdCgpLCFhLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uKXN3aXRjaChvKXtjYXNlIHllLkVudGVyOmlmKG51bGw9PWEucHJvcHMuc2VsZWN0ZWQpYnJlYWs7YS5vblllYXJDbGljayhlLHQpLG51bGw9PT0obj0ocj1hLnByb3BzKS5zZXRQcmVTZWxlY3Rpb24pfHx2b2lkIDA9PT1ufHxuLmNhbGwocixhLnByb3BzLnNlbGVjdGVkKTticmVhaztjYXNlIHllLkFycm93UmlnaHQ6aWYobnVsbD09YS5wcm9wcy5wcmVTZWxlY3Rpb24pYnJlYWs7YS5oYW5kbGVZZWFyTmF2aWdhdGlvbih0KzEsZC5hZGRZZWFycyhhLnByb3BzLnByZVNlbGVjdGlvbiwxKSk7YnJlYWs7Y2FzZSB5ZS5BcnJvd0xlZnQ6aWYobnVsbD09YS5wcm9wcy5wcmVTZWxlY3Rpb24pYnJlYWs7YS5oYW5kbGVZZWFyTmF2aWdhdGlvbih0LTEsaWUuc3ViWWVhcnMoYS5wcm9wcy5wcmVTZWxlY3Rpb24sMSkpO2JyZWFrO2Nhc2UgeWUuQXJyb3dVcDppZih2b2lkIDA9PT1pfHx2b2lkIDA9PT1sfHxudWxsPT1hLnByb3BzLnByZVNlbGVjdGlvbilicmVhazt2YXIgcD1tdChpLGwpLnN0YXJ0UGVyaW9kO2lmKChoPXQtKGY9MykpPHApe3ZhciB1PWwlZjt0Pj1wJiZ0PHArdT9mPXU6Zis9dSxoPXQtZn1hLmhhbmRsZVllYXJOYXZpZ2F0aW9uKGgsaWUuc3ViWWVhcnMoYS5wcm9wcy5wcmVTZWxlY3Rpb24sZikpO2JyZWFrO2Nhc2UgeWUuQXJyb3dEb3duOmlmKHZvaWQgMD09PWl8fHZvaWQgMD09PWx8fG51bGw9PWEucHJvcHMucHJlU2VsZWN0aW9uKWJyZWFrO3ZhciBmLGgsbT1tdChpLGwpLmVuZFBlcmlvZDtpZigoaD10KyhmPTMpKT5tKXt1PWwlZjt0PD1tJiZ0Pm0tdT9mPXU6Zis9dSxoPXQrZn1hLmhhbmRsZVllYXJOYXZpZ2F0aW9uKGgsZC5hZGRZZWFycyhhLnByb3BzLnByZVNlbGVjdGlvbixmKSl9YyYmYyhlKX0sYS5nZXRZZWFyQ2xhc3NOYW1lcz1mdW5jdGlvbihlKXt2YXIgcj1hLnByb3BzLG49ci5kYXRlLG89ci5taW5EYXRlLHM9ci5tYXhEYXRlLGk9ci5zZWxlY3RlZCxsPXIuZXhjbHVkZURhdGVzLGM9ci5pbmNsdWRlRGF0ZXMscD1yLmZpbHRlckRhdGUsZD1yLnllYXJDbGFzc05hbWU7cmV0dXJuIHQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dFwiLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1cIi5jb25jYXQoZSksbj9udWxsPT1kP3ZvaWQgMDpkKEcuc2V0WWVhcihuLGUpKTp2b2lkIDAse1wicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RlZFwiOmk/ZT09PXguZ2V0WWVhcihpKTp2b2lkIDAsXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkXCI6KG98fHN8fGx8fGN8fHApJiZaZShlLGEucHJvcHMpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZFwiOmEuaXNLZXlib2FyZFNlbGVjdGVkKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1yYW5nZS1zdGFydFwiOmEuaXNSYW5nZVN0YXJ0KGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1yYW5nZS1lbmRcIjphLmlzUmFuZ2VFbmQoZSksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlXCI6YS5pc0luUmFuZ2UoZSksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZVwiOmEuaXNJblNlbGVjdGluZ1JhbmdlKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RpbmctcmFuZ2Utc3RhcnRcIjphLmlzU2VsZWN0aW5nUmFuZ2VTdGFydChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0aW5nLXJhbmdlLWVuZFwiOmEuaXNTZWxlY3RpbmdSYW5nZUVuZChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tdG9kYXlcIjphLmlzQ3VycmVudFllYXIoZSl9KX0sYS5nZXRZZWFyVGFiSW5kZXg9ZnVuY3Rpb24oZSl7cmV0dXJuIGEucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb258fG51bGw9PWEucHJvcHMucHJlU2VsZWN0aW9uP1wiLTFcIjplPT09eC5nZXRZZWFyKGEucHJvcHMucHJlU2VsZWN0aW9uKT9cIjBcIjpcIi0xXCJ9LGEuZ2V0WWVhckNvbnRhaW5lckNsYXNzTmFtZXM9ZnVuY3Rpb24oKXt2YXIgZT1hLnByb3BzLHI9ZS5zZWxlY3RpbmdEYXRlLG49ZS5zZWxlY3RzU3RhcnQsbz1lLnNlbGVjdHNFbmQscz1lLnNlbGVjdHNSYW5nZTtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhclwiLHtcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZVwiOnImJihufHxvfHxzKX0pfSxhLmdldFllYXJDb250ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhLnByb3BzLnJlbmRlclllYXJDb250ZW50P2EucHJvcHMucmVuZGVyWWVhckNvbnRlbnQoZSk6ZX0sYX1yZXR1cm4gdmUobixlKSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9W10scj10aGlzLnByb3BzLG49ci5kYXRlLGE9ci55ZWFySXRlbU51bWJlcixvPXIub25ZZWFyTW91c2VFbnRlcixzPXIub25ZZWFyTW91c2VMZWF2ZTtpZih2b2lkIDA9PT1uKXJldHVybiBudWxsO2Zvcih2YXIgaT1tdChuLGEpLGw9aS5zdGFydFBlcmlvZCxjPWkuZW5kUGVyaW9kLHA9ZnVuY3Rpb24ocil7dC5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtyZWY6ZC5ZRUFSX1JFRlNbci1sXSxvbkNsaWNrOmZ1bmN0aW9uKHQpe2Uub25ZZWFyQ2xpY2sodCxyKX0sb25LZXlEb3duOmZ1bmN0aW9uKHQpe3l0KHQpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQua2V5PXllLkVudGVyKSxlLm9uWWVhcktleURvd24odCxyKX0sdGFiSW5kZXg6TnVtYmVyKGQuZ2V0WWVhclRhYkluZGV4KHIpKSxjbGFzc05hbWU6ZC5nZXRZZWFyQ2xhc3NOYW1lcyhyKSxvbk1vdXNlRW50ZXI6ZC5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOmZ1bmN0aW9uKGUpe3JldHVybiBvKGUscil9LG9uUG9pbnRlckVudGVyOmQucHJvcHMudXNlUG9pbnRlckV2ZW50P2Z1bmN0aW9uKGUpe3JldHVybiBvKGUscil9OnZvaWQgMCxvbk1vdXNlTGVhdmU6ZC5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOmZ1bmN0aW9uKGUpe3JldHVybiBzKGUscil9LG9uUG9pbnRlckxlYXZlOmQucHJvcHMudXNlUG9pbnRlckV2ZW50P2Z1bmN0aW9uKGUpe3JldHVybiBzKGUscil9OnZvaWQgMCxrZXk6cixcImFyaWEtY3VycmVudFwiOmQuaXNDdXJyZW50WWVhcihyKT9cImRhdGVcIjp2b2lkIDB9LGQuZ2V0WWVhckNvbnRlbnQocikpKX0sZD10aGlzLHU9bDt1PD1jO3UrKylwKHUpO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOnRoaXMuZ2V0WWVhckNvbnRhaW5lckNsYXNzTmFtZXMoKX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItd3JhcHBlclwiLG9uTW91c2VMZWF2ZTp0aGlzLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6dGhpcy5wcm9wcy5jbGVhclNlbGVjdGluZ0RhdGUsb25Qb2ludGVyTGVhdmU6dGhpcy5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dGhpcy5wcm9wcy5jbGVhclNlbGVjdGluZ0RhdGU6dm9pZCAwfSx0KSl9LG59KHIuQ29tcG9uZW50KTtmdW5jdGlvbiBXdChlLHQscixuKXtmb3IodmFyIGE9W10sbz0wO288Mip0KzE7bysrKXt2YXIgcz1lK3QtbyxpPSEwO3ImJihpPXguZ2V0WWVhcihyKTw9cyksbiYmaSYmKGk9eC5nZXRZZWFyKG4pPj1zKSxpJiZhLnB1c2gocyl9cmV0dXJuIGF9dmFyIFF0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7bi5yZW5kZXJPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcy55ZWFyLHQ9bi5zdGF0ZS55ZWFyc0xpc3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTplPT09dD9cInJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uIHJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLS1zZWxlY3RlZF95ZWFyXCI6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvblwiLGtleTp0LG9uQ2xpY2s6bi5vbkNoYW5nZS5iaW5kKG4sdCksXCJhcmlhLXNlbGVjdGVkXCI6ZT09PXQ/XCJ0cnVlXCI6dm9pZCAwfSxlPT09dD91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLS1zZWxlY3RlZFwifSxcIuKck1wiKTpcIlwiLHQpfSkpLHI9bi5wcm9wcy5taW5EYXRlP3guZ2V0WWVhcihuLnByb3BzLm1pbkRhdGUpOm51bGwsYT1uLnByb3BzLm1heERhdGU/eC5nZXRZZWFyKG4ucHJvcHMubWF4RGF0ZSk6bnVsbDtyZXR1cm4gYSYmbi5zdGF0ZS55ZWFyc0xpc3QuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1hfSkpfHx0LnVuc2hpZnQodWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uXCIsa2V5OlwidXBjb21pbmdcIixvbkNsaWNrOm4uaW5jcmVtZW50WWVhcnN9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbiByZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycyByZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZ1wifSkpKSxyJiZuLnN0YXRlLnllYXJzTGlzdC5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXJ9KSl8fHQucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb25cIixrZXk6XCJwcmV2aW91c1wiLG9uQ2xpY2s6bi5kZWNyZW1lbnRZZWFyc30sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYVwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uIHJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzIHJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzXCJ9KSkpLHR9LG4ub25DaGFuZ2U9ZnVuY3Rpb24oZSl7bi5wcm9wcy5vbkNoYW5nZShlKX0sbi5oYW5kbGVDbGlja091dHNpZGU9ZnVuY3Rpb24oKXtuLnByb3BzLm9uQ2FuY2VsKCl9LG4uc2hpZnRZZWFycz1mdW5jdGlvbihlKXt2YXIgdD1uLnN0YXRlLnllYXJzTGlzdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0K2V9KSk7bi5zZXRTdGF0ZSh7eWVhcnNMaXN0OnR9KX0sbi5pbmNyZW1lbnRZZWFycz1mdW5jdGlvbigpe3JldHVybiBuLnNoaWZ0WWVhcnMoMSl9LG4uZGVjcmVtZW50WWVhcnM9ZnVuY3Rpb24oKXtyZXR1cm4gbi5zaGlmdFllYXJzKC0xKX07dmFyIGE9dC55ZWFyRHJvcGRvd25JdGVtTnVtYmVyLG89dC5zY3JvbGxhYmxlWWVhckRyb3Bkb3duLHM9YXx8KG8/MTA6NSk7cmV0dXJuIG4uc3RhdGU9e3llYXJzTGlzdDpXdChuLnByb3BzLnllYXIscyxuLnByb3BzLm1pbkRhdGUsbi5wcm9wcy5tYXhEYXRlKX0sbi5kcm9wZG93blJlZj1yLmNyZWF0ZVJlZigpLG59cmV0dXJuIHZlKG4sZSksbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRyb3Bkb3duUmVmLmN1cnJlbnQ7aWYoZSl7dmFyIHQ9ZS5jaGlsZHJlbj9BcnJheS5mcm9tKGUuY2hpbGRyZW4pOm51bGwscj10P3QuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXJpYVNlbGVjdGVkfSkpOm51bGw7ZS5zY3JvbGxUb3A9ciYmciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50P3Iub2Zmc2V0VG9wKyhyLmNsaWVudEhlaWdodC1lLmNsaWVudEhlaWdodCkvMjooZS5zY3JvbGxIZWlnaHQtZS5jbGllbnRIZWlnaHQpLzJ9fSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmNsc3goe1wicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93blwiOiEwLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi0tc2Nyb2xsYWJsZVwiOnRoaXMucHJvcHMuc2Nyb2xsYWJsZVllYXJEcm9wZG93bn0pO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOmUscmVmOnRoaXMuZHJvcGRvd25SZWZ9LHRoaXMucmVuZGVyT3B0aW9ucygpKX0sbn0oci5Db21wb25lbnQpLHF0PWZlLmRlZmF1bHQoUXQpLEt0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuc3RhdGU9e2Ryb3Bkb3duVmlzaWJsZTohMX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXQucHJvcHMubWluRGF0ZT94LmdldFllYXIodC5wcm9wcy5taW5EYXRlKToxOTAwLHI9dC5wcm9wcy5tYXhEYXRlP3guZ2V0WWVhcih0LnByb3BzLm1heERhdGUpOjIxMDAsbj1bXSxhPWU7YTw9cjthKyspbi5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLHtrZXk6YSx2YWx1ZTphfSxhKSk7cmV0dXJuIG59LHQub25TZWxlY3RDaGFuZ2U9ZnVuY3Rpb24oZSl7dC5vbkNoYW5nZShwYXJzZUludChlLnRhcmdldC52YWx1ZSkpfSx0LnJlbmRlclNlbGVjdE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIse3ZhbHVlOnQucHJvcHMueWVhcixjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXNlbGVjdFwiLG9uQ2hhbmdlOnQub25TZWxlY3RDaGFuZ2V9LHQucmVuZGVyU2VsZWN0T3B0aW9ucygpKX0sdC5yZW5kZXJSZWFkVmlldz1mdW5jdGlvbihlKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTpcInJlYWRcIixzdHlsZTp7dmlzaWJpbGl0eTplP1widmlzaWJsZVwiOlwiaGlkZGVuXCJ9LGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3XCIsb25DbGljazpmdW5jdGlvbihlKXtyZXR1cm4gdC50b2dnbGVEcm9wZG93bihlKX19LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3dcIn0pLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLXNlbGVjdGVkLXllYXJcIn0sdC5wcm9wcy55ZWFyKSl9LHQucmVuZGVyRHJvcGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHF0LGdlKHtrZXk6XCJkcm9wZG93blwifSx0LnByb3BzLHtvbkNoYW5nZTp0Lm9uQ2hhbmdlLG9uQ2FuY2VsOnQudG9nZ2xlRHJvcGRvd259KSl9LHQucmVuZGVyU2Nyb2xsTW9kZT1mdW5jdGlvbigpe3ZhciBlPXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlLHI9W3QucmVuZGVyUmVhZFZpZXcoIWUpXTtyZXR1cm4gZSYmci51bnNoaWZ0KHQucmVuZGVyRHJvcGRvd24oKSkscn0sdC5vbkNoYW5nZT1mdW5jdGlvbihlKXt0LnRvZ2dsZURyb3Bkb3duKCksZSE9PXQucHJvcHMueWVhciYmdC5wcm9wcy5vbkNoYW5nZShlKX0sdC50b2dnbGVEcm9wZG93bj1mdW5jdGlvbihlKXt0LnNldFN0YXRlKHtkcm9wZG93blZpc2libGU6IXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlfSwoZnVuY3Rpb24oKXt0LnByb3BzLmFkanVzdERhdGVPbkNoYW5nZSYmdC5oYW5kbGVZZWFyQ2hhbmdlKHQucHJvcHMuZGF0ZSxlKX0pKX0sdC5oYW5kbGVZZWFyQ2hhbmdlPWZ1bmN0aW9uKGUscil7dC5vblNlbGVjdChlLHIpLHQuc2V0T3BlbigpfSx0Lm9uU2VsZWN0PWZ1bmN0aW9uKGUscil7dC5wcm9wcy5vblNlbGVjdCYmdC5wcm9wcy5vblNlbGVjdChlLHIpfSx0LnNldE9wZW49ZnVuY3Rpb24oKXt0LnByb3BzLnNldE9wZW4mJnQucHJvcHMuc2V0T3BlbighMCl9LHR9cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU7c3dpdGNoKHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKXtjYXNlXCJzY3JvbGxcIjplPXRoaXMucmVuZGVyU2Nyb2xsTW9kZSgpO2JyZWFrO2Nhc2VcInNlbGVjdFwiOmU9dGhpcy5yZW5kZXJTZWxlY3RNb2RlKCl9cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lciByZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tXCIuY29uY2F0KHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKX0sZSl9LHR9KHIuQ29tcG9uZW50KSxCdD1bXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXNlbGVjdFwiLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtc2VsZWN0XCIsXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXNlbGVjdFwiXSxWdD1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKG8pe3ZhciBzPWUuY2FsbCh0aGlzLG8pfHx0aGlzO3JldHVybiBzLm1vbnRoQ29udGFpbmVyPXZvaWQgMCxzLmhhbmRsZUNsaWNrT3V0c2lkZT1mdW5jdGlvbihlKXtzLnByb3BzLm9uQ2xpY2tPdXRzaWRlKGUpfSxzLnNldENsaWNrT3V0c2lkZVJlZj1mdW5jdGlvbigpe3JldHVybiBzLmNvbnRhaW5lclJlZi5jdXJyZW50fSxzLmhhbmRsZURyb3Bkb3duRm9jdXM9ZnVuY3Rpb24oZSl7dmFyIHQscixuLGE7bj1lLnRhcmdldCxhPShuLmNsYXNzTmFtZXx8XCJcIikuc3BsaXQoL1xccysvKSxCdC5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gYS5pbmRleE9mKGUpPj0wfSkpJiYobnVsbD09PShyPSh0PXMucHJvcHMpLm9uRHJvcGRvd25Gb2N1cyl8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpKX0scy5nZXREYXRlSW5WaWV3PWZ1bmN0aW9uKCl7dmFyIGU9cy5wcm9wcyx0PWUucHJlU2VsZWN0aW9uLHI9ZS5zZWxlY3RlZCxuPWUub3BlblRvRGF0ZSxhPWN0KHMucHJvcHMpLG89cHQocy5wcm9wcyksaT1NZSgpLGw9bnx8cnx8dDtyZXR1cm4gbHx8KGEmJk8uaXNCZWZvcmUoaSxhKT9hOm8mJk4uaXNBZnRlcihpLG8pP286aSl9LHMuaW5jcmVhc2VNb250aD1mdW5jdGlvbigpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0ZTtyZXR1cm57ZGF0ZTppLmFkZE1vbnRocyh0LDEpfX0pLChmdW5jdGlvbigpe3JldHVybiBzLmhhbmRsZU1vbnRoQ2hhbmdlKHMuc3RhdGUuZGF0ZSl9KSl9LHMuZGVjcmVhc2VNb250aD1mdW5jdGlvbigpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0ZTtyZXR1cm57ZGF0ZTphZS5zdWJNb250aHModCwxKX19KSwoZnVuY3Rpb24oKXtyZXR1cm4gcy5oYW5kbGVNb250aENoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmhhbmRsZURheUNsaWNrPWZ1bmN0aW9uKGUsdCxyKXtzLnByb3BzLm9uU2VsZWN0KGUsdCxyKSxzLnByb3BzLnNldFByZVNlbGVjdGlvbiYmcy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24oZSl9LHMuaGFuZGxlRGF5TW91c2VFbnRlcj1mdW5jdGlvbihlKXtzLnNldFN0YXRlKHtzZWxlY3RpbmdEYXRlOmV9KSxzLnByb3BzLm9uRGF5TW91c2VFbnRlciYmcy5wcm9wcy5vbkRheU1vdXNlRW50ZXIoZSl9LHMuaGFuZGxlTW9udGhNb3VzZUxlYXZlPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZSh7c2VsZWN0aW5nRGF0ZTp2b2lkIDB9KSxzLnByb3BzLm9uTW9udGhNb3VzZUxlYXZlJiZzLnByb3BzLm9uTW9udGhNb3VzZUxlYXZlKCl9LHMuaGFuZGxlWWVhck1vdXNlRW50ZXI9ZnVuY3Rpb24oZSx0KXtzLnNldFN0YXRlKHtzZWxlY3RpbmdEYXRlOkcuc2V0WWVhcihNZSgpLHQpfSkscy5wcm9wcy5vblllYXJNb3VzZUVudGVyJiZzLnByb3BzLm9uWWVhck1vdXNlRW50ZXIoZSx0KX0scy5oYW5kbGVZZWFyTW91c2VMZWF2ZT1mdW5jdGlvbihlLHQpe3MucHJvcHMub25ZZWFyTW91c2VMZWF2ZSYmcy5wcm9wcy5vblllYXJNb3VzZUxlYXZlKGUsdCl9LHMuaGFuZGxlWWVhckNoYW5nZT1mdW5jdGlvbihlKXtzLnByb3BzLm9uWWVhckNoYW5nZSYmKHMucHJvcHMub25ZZWFyQ2hhbmdlKGUpLHMuc2V0U3RhdGUoe2lzUmVuZGVyQXJpYUxpdmVNZXNzYWdlOiEwfSkpLHMucHJvcHMuYWRqdXN0RGF0ZU9uQ2hhbmdlJiYocy5wcm9wcy5vblNlbGVjdCYmcy5wcm9wcy5vblNlbGVjdChlKSxzLnByb3BzLnNldE9wZW4mJnMucHJvcHMuc2V0T3BlbighMCkpLHMucHJvcHMuc2V0UHJlU2VsZWN0aW9uJiZzLnByb3BzLnNldFByZVNlbGVjdGlvbihlKX0scy5oYW5kbGVNb250aENoYW5nZT1mdW5jdGlvbihlKXtzLmhhbmRsZUN1c3RvbU1vbnRoQ2hhbmdlKGUpLHMucHJvcHMuYWRqdXN0RGF0ZU9uQ2hhbmdlJiYocy5wcm9wcy5vblNlbGVjdCYmcy5wcm9wcy5vblNlbGVjdChlKSxzLnByb3BzLnNldE9wZW4mJnMucHJvcHMuc2V0T3BlbighMCkpLHMucHJvcHMuc2V0UHJlU2VsZWN0aW9uJiZzLnByb3BzLnNldFByZVNlbGVjdGlvbihlKX0scy5oYW5kbGVDdXN0b21Nb250aENoYW5nZT1mdW5jdGlvbihlKXtzLnByb3BzLm9uTW9udGhDaGFuZ2UmJihzLnByb3BzLm9uTW9udGhDaGFuZ2UoZSkscy5zZXRTdGF0ZSh7aXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITB9KSl9LHMuaGFuZGxlTW9udGhZZWFyQ2hhbmdlPWZ1bmN0aW9uKGUpe3MuaGFuZGxlWWVhckNoYW5nZShlKSxzLmhhbmRsZU1vbnRoQ2hhbmdlKGUpfSxzLmNoYW5nZVllYXI9ZnVuY3Rpb24oZSl7cy5zZXRTdGF0ZSgoZnVuY3Rpb24odCl7dmFyIHI9dC5kYXRlO3JldHVybntkYXRlOkcuc2V0WWVhcihyLE51bWJlcihlKSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmNoYW5nZU1vbnRoPWZ1bmN0aW9uKGUpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKHQpe3ZhciByPXQuZGF0ZTtyZXR1cm57ZGF0ZTokLnNldE1vbnRoKHIsTnVtYmVyKGUpKX19KSwoZnVuY3Rpb24oKXtyZXR1cm4gcy5oYW5kbGVNb250aENoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmNoYW5nZU1vbnRoWWVhcj1mdW5jdGlvbihlKXtzLnNldFN0YXRlKChmdW5jdGlvbih0KXt2YXIgcj10LmRhdGU7cmV0dXJue2RhdGU6Ry5zZXRZZWFyKCQuc2V0TW9udGgocixfLmdldE1vbnRoKGUpKSx4LmdldFllYXIoZSkpfX0pLChmdW5jdGlvbigpe3JldHVybiBzLmhhbmRsZU1vbnRoWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmhlYWRlcj1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT1zLnN0YXRlLmRhdGUpO3ZhciByPXhlKGUscy5wcm9wcy5sb2NhbGUscy5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KSxuPVtdO3JldHVybiBzLnByb3BzLnNob3dXZWVrTnVtYmVycyYmbi5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6XCJXXCIsY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWVcIn0scy5wcm9wcy53ZWVrTGFiZWx8fFwiI1wiKSksbi5jb25jYXQoWzAsMSwyLDMsNCw1LDZdLm1hcCgoZnVuY3Rpb24oZSl7dmFyIG49YS5hZGREYXlzKHIsZSksbz1zLmZvcm1hdFdlZWtkYXkobixzLnByb3BzLmxvY2FsZSksaT1zLnByb3BzLndlZWtEYXlDbGFzc05hbWU/cy5wcm9wcy53ZWVrRGF5Q2xhc3NOYW1lKG4pOnZvaWQgMDtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTplLFwiYXJpYS1sYWJlbFwiOl9lKG4sXCJFRUVFXCIscy5wcm9wcy5sb2NhbGUpLGNsYXNzTmFtZTp0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZVwiLGkpfSxvKX0pKSl9LHMuZm9ybWF0V2Vla2RheT1mdW5jdGlvbihlLHQpe3JldHVybiBzLnByb3BzLmZvcm1hdFdlZWtEYXk/ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB0KF9lKGUsXCJFRUVFXCIscikpfShlLHMucHJvcHMuZm9ybWF0V2Vla0RheSx0KTpzLnByb3BzLnVzZVdlZWtkYXlzU2hvcnQ/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gX2UoZSxcIkVFRVwiLHQpfShlLHQpOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9lKGUsXCJFRUVFRUVcIix0KX0oZSx0KX0scy5kZWNyZWFzZVllYXI9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKChmdW5jdGlvbihlKXt2YXIgdCxyPWUuZGF0ZTtyZXR1cm57ZGF0ZTppZS5zdWJZZWFycyhyLHMucHJvcHMuc2hvd1llYXJQaWNrZXI/bnVsbCE9PSh0PXMucHJvcHMueWVhckl0ZW1OdW1iZXIpJiZ2b2lkIDAhPT10P3Q6bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXI6MSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmNsZWFyU2VsZWN0aW5nRGF0ZT1mdW5jdGlvbigpe3Muc2V0U3RhdGUoe3NlbGVjdGluZ0RhdGU6dm9pZCAwfSl9LHMucmVuZGVyUHJldmlvdXNCdXR0b249ZnVuY3Rpb24oKXt2YXIgZTtpZighcy5wcm9wcy5yZW5kZXJDdXN0b21IZWFkZXIpe3ZhciB0O3N3aXRjaCghMCl7Y2FzZSBzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXI6dD1pdChzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dZZWFyUGlja2VyOnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLnllYXJJdGVtTnVtYmVyLG89dm9pZCAwPT09YT9TZTphLHM9bXQoT2UoaWUuc3ViWWVhcnMoZSxvKSksbykuZW5kUGVyaW9kLGk9biYmeC5nZXRZZWFyKG4pO3JldHVybiBpJiZpPnN8fCExfShzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcjp0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz1yZS5zdGFydE9mWWVhcihlKSxzPW9lLnN1YlF1YXJ0ZXJzKG8sMSk7cmV0dXJuIG4mJmguZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhuLHMpPjB8fGEmJmEuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBoLmRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMoZSxzKT4wfSkpfHwhMX0ocy5zdGF0ZS5kYXRlLHMucHJvcHMpO2JyZWFrO2RlZmF1bHQ6dD1vdChzLnN0YXRlLmRhdGUscy5wcm9wcyl9aWYoKChudWxsIT09KGU9cy5wcm9wcy5mb3JjZVNob3dNb250aE5hdmlnYXRpb24pJiZ2b2lkIDAhPT1lP2U6bi5kZWZhdWx0UHJvcHMuZm9yY2VTaG93TW9udGhOYXZpZ2F0aW9uKXx8cy5wcm9wcy5zaG93RGlzYWJsZWRNb250aE5hdmlnYXRpb258fCF0KSYmIXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5KXt2YXIgcj1bXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uXCIsXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1wcmV2aW91c1wiXSxhPXMuZGVjcmVhc2VNb250aDsocy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93WWVhclBpY2tlcikmJihhPXMuZGVjcmVhc2VZZWFyKSx0JiZzLnByb3BzLnNob3dEaXNhYmxlZE1vbnRoTmF2aWdhdGlvbiYmKHIucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXByZXZpb3VzLS1kaXNhYmxlZFwiKSxhPXZvaWQgMCk7dmFyIG89cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93WWVhclBpY2tlcixpPXMucHJvcHMsbD1pLnByZXZpb3VzTW9udGhCdXR0b25MYWJlbCxjPXZvaWQgMD09PWw/bi5kZWZhdWx0UHJvcHMucHJldmlvdXNNb250aEJ1dHRvbkxhYmVsOmwscD1pLnByZXZpb3VzWWVhckJ1dHRvbkxhYmVsLGQ9dm9pZCAwPT09cD9uLmRlZmF1bHRQcm9wcy5wcmV2aW91c1llYXJCdXR0b25MYWJlbDpwLHU9cy5wcm9wcyxmPXUucHJldmlvdXNNb250aEFyaWFMYWJlbCxtPXZvaWQgMD09PWY/XCJzdHJpbmdcIj09dHlwZW9mIGM/YzpcIlByZXZpb3VzIE1vbnRoXCI6Zix2PXUucHJldmlvdXNZZWFyQXJpYUxhYmVsLGc9dm9pZCAwPT09dj9cInN0cmluZ1wiPT10eXBlb2YgZD9kOlwiUHJldmlvdXMgWWVhclwiOnY7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLHt0eXBlOlwiYnV0dG9uXCIsY2xhc3NOYW1lOnIuam9pbihcIiBcIiksb25DbGljazphLG9uS2V5RG93bjpzLnByb3BzLmhhbmRsZU9uS2V5RG93bixcImFyaWEtbGFiZWxcIjpvP2c6bX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6W1wicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uXCIsXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLXByZXZpb3VzXCJdLmpvaW4oXCIgXCIpfSxvP2Q6YykpfX19LHMuaW5jcmVhc2VZZWFyPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZSgoZnVuY3Rpb24oZSl7dmFyIHQscj1lLmRhdGU7cmV0dXJue2RhdGU6ZC5hZGRZZWFycyhyLHMucHJvcHMuc2hvd1llYXJQaWNrZXI/bnVsbCE9PSh0PXMucHJvcHMueWVhckl0ZW1OdW1iZXIpJiZ2b2lkIDAhPT10P3Q6bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXI6MSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLnJlbmRlck5leHRCdXR0b249ZnVuY3Rpb24oKXt2YXIgZTtpZighcy5wcm9wcy5yZW5kZXJDdXN0b21IZWFkZXIpe3ZhciB0O3N3aXRjaCghMCl7Y2FzZSBzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXI6dD1sdChzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dZZWFyUGlja2VyOnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1heERhdGUsYT1yLnllYXJJdGVtTnVtYmVyLG89dm9pZCAwPT09YT9TZTphLHM9bXQoZC5hZGRZZWFycyhlLG8pLG8pLnN0YXJ0UGVyaW9kLGk9biYmeC5nZXRZZWFyKG4pO3JldHVybiBpJiZpPHN8fCExfShzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcjp0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5tYXhEYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz15LmVuZE9mWWVhcihlKSxzPWwuYWRkUXVhcnRlcnMobywxKTtyZXR1cm4gbiYmaC5kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzKHMsbik+MHx8YSYmYS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIGguZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhzLGUpPjB9KSl8fCExfShzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7ZGVmYXVsdDp0PXN0KHMuc3RhdGUuZGF0ZSxzLnByb3BzKX1pZigoKG51bGwhPT0oZT1zLnByb3BzLmZvcmNlU2hvd01vbnRoTmF2aWdhdGlvbikmJnZvaWQgMCE9PWU/ZTpuLmRlZmF1bHRQcm9wcy5mb3JjZVNob3dNb250aE5hdmlnYXRpb24pfHxzLnByb3BzLnNob3dEaXNhYmxlZE1vbnRoTmF2aWdhdGlvbnx8IXQpJiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpe3ZhciByPVtcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb25cIixcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHRcIl07cy5wcm9wcy5zaG93VGltZVNlbGVjdCYmci5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10aW1lXCIpLHMucHJvcHMudG9kYXlCdXR0b24mJnIucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLXdpdGgtdG9kYXktYnV0dG9uXCIpO3ZhciBhPXMuaW5jcmVhc2VNb250aDsocy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93WWVhclBpY2tlcikmJihhPXMuaW5jcmVhc2VZZWFyKSx0JiZzLnByb3BzLnNob3dEaXNhYmxlZE1vbnRoTmF2aWdhdGlvbiYmKHIucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLWRpc2FibGVkXCIpLGE9dm9pZCAwKTt2YXIgbz1zLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyfHxzLnByb3BzLnNob3dZZWFyUGlja2VyLGk9cy5wcm9wcyxjPWkubmV4dE1vbnRoQnV0dG9uTGFiZWwscD12b2lkIDA9PT1jP24uZGVmYXVsdFByb3BzLm5leHRNb250aEJ1dHRvbkxhYmVsOmMsdT1pLm5leHRZZWFyQnV0dG9uTGFiZWwsZj12b2lkIDA9PT11P24uZGVmYXVsdFByb3BzLm5leHRZZWFyQnV0dG9uTGFiZWw6dSxtPXMucHJvcHMsdj1tLm5leHRNb250aEFyaWFMYWJlbCxnPXZvaWQgMD09PXY/XCJzdHJpbmdcIj09dHlwZW9mIHA/cDpcIk5leHQgTW9udGhcIjp2LEQ9bS5uZXh0WWVhckFyaWFMYWJlbCxrPXZvaWQgMD09PUQ/XCJzdHJpbmdcIj09dHlwZW9mIGY/ZjpcIk5leHQgWWVhclwiOkQ7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLHt0eXBlOlwiYnV0dG9uXCIsY2xhc3NOYW1lOnIuam9pbihcIiBcIiksb25DbGljazphLG9uS2V5RG93bjpzLnByb3BzLmhhbmRsZU9uS2V5RG93bixcImFyaWEtbGFiZWxcIjpvP2s6Z30sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6W1wicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uXCIsXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLW5leHRcIl0uam9pbihcIiBcIil9LG8/ZjpwKSl9fX0scy5yZW5kZXJDdXJyZW50TW9udGg9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9cy5zdGF0ZS5kYXRlKTt2YXIgdD1bXCJyZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoXCJdO3JldHVybiBzLnByb3BzLnNob3dZZWFyRHJvcGRvd24mJnQucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgtLWhhc1llYXJEcm9wZG93blwiKSxzLnByb3BzLnNob3dNb250aERyb3Bkb3duJiZ0LnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLS1oYXNNb250aERyb3Bkb3duXCIpLHMucHJvcHMuc2hvd01vbnRoWWVhckRyb3Bkb3duJiZ0LnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLS1oYXNNb250aFllYXJEcm9wZG93blwiKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLHtjbGFzc05hbWU6dC5qb2luKFwiIFwiKX0sX2UoZSxzLnByb3BzLmRhdGVGb3JtYXQscy5wcm9wcy5sb2NhbGUpKX0scy5yZW5kZXJZZWFyRHJvcGRvd249ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSYmKGU9ITEpLHMucHJvcHMuc2hvd1llYXJEcm9wZG93biYmIWUpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLdCxnZSh7fSxuLmRlZmF1bHRQcm9wcyxzLnByb3BzLHtkYXRlOnMuc3RhdGUuZGF0ZSxvbkNoYW5nZTpzLmNoYW5nZVllYXIseWVhcjp4LmdldFllYXIocy5zdGF0ZS5kYXRlKX0pKX0scy5yZW5kZXJNb250aERyb3Bkb3duPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPSExKSxzLnByb3BzLnNob3dNb250aERyb3Bkb3duJiYhZSlyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEl0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse21vbnRoOl8uZ2V0TW9udGgocy5zdGF0ZS5kYXRlKSxvbkNoYW5nZTpzLmNoYW5nZU1vbnRofSkpfSxzLnJlbmRlck1vbnRoWWVhckRyb3Bkb3duPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPSExKSxzLnByb3BzLnNob3dNb250aFllYXJEcm9wZG93biYmIWUpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBdCxnZSh7fSxuLmRlZmF1bHRQcm9wcyxzLnByb3BzLHtkYXRlOnMuc3RhdGUuZGF0ZSxvbkNoYW5nZTpzLmNoYW5nZU1vbnRoWWVhcn0pKX0scy5oYW5kbGVUb2RheUJ1dHRvbkNsaWNrPWZ1bmN0aW9uKGUpe3MucHJvcHMub25TZWxlY3QoVGUoKSxlKSxzLnByb3BzLnNldFByZVNlbGVjdGlvbiYmcy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24oVGUoKSl9LHMucmVuZGVyVG9kYXlCdXR0b249ZnVuY3Rpb24oKXtpZihzLnByb3BzLnRvZGF5QnV0dG9uJiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190b2RheS1idXR0b25cIixvbkNsaWNrOnMuaGFuZGxlVG9kYXlCdXR0b25DbGlja30scy5wcm9wcy50b2RheUJ1dHRvbil9LHMucmVuZGVyRGVmYXVsdEhlYWRlcj1mdW5jdGlvbihlKXt2YXIgdD1lLm1vbnRoRGF0ZSxyPWUuaTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlciBcIi5jb25jYXQocy5wcm9wcy5zaG93VGltZVNlbGVjdD9cInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0taGFzLXRpbWUtc2VsZWN0XCI6XCJcIil9LHMucmVuZGVyQ3VycmVudE1vbnRoKHQpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXJfX2Ryb3Bkb3duIHJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlcl9fZHJvcGRvd24tLVwiLmNvbmNhdChzLnByb3BzLmRyb3Bkb3duTW9kZSksb25Gb2N1czpzLmhhbmRsZURyb3Bkb3duRm9jdXN9LHMucmVuZGVyTW9udGhEcm9wZG93bigwIT09cikscy5yZW5kZXJNb250aFllYXJEcm9wZG93bigwIT09cikscy5yZW5kZXJZZWFyRHJvcGRvd24oMCE9PXIpKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWVzXCJ9LHMuaGVhZGVyKHQpKSl9LHMucmVuZGVyQ3VzdG9tSGVhZGVyPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbj1lLm1vbnRoRGF0ZSxhPWUuaTtpZihzLnByb3BzLnNob3dUaW1lU2VsZWN0JiYhcy5zdGF0ZS5tb250aENvbnRhaW5lcnx8cy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpcmV0dXJuIG51bGw7dmFyIG89b3Qocy5zdGF0ZS5kYXRlLHMucHJvcHMpLGk9c3Qocy5zdGF0ZS5kYXRlLHMucHJvcHMpLGw9aXQocy5zdGF0ZS5kYXRlLHMucHJvcHMpLGM9bHQocy5zdGF0ZS5kYXRlLHMucHJvcHMpLHA9IXMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlciYmIXMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyJiYhcy5wcm9wcy5zaG93WWVhclBpY2tlcjtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlciByZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLWN1c3RvbVwiLG9uRm9jdXM6cy5wcm9wcy5vbkRyb3Bkb3duRm9jdXN9LG51bGw9PT0ocj0odD1zLnByb3BzKS5yZW5kZXJDdXN0b21IZWFkZXIpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmNhbGwodCxnZShnZSh7fSxzLnN0YXRlKSx7Y3VzdG9tSGVhZGVyQ291bnQ6YSxtb250aERhdGU6bixjaGFuZ2VNb250aDpzLmNoYW5nZU1vbnRoLGNoYW5nZVllYXI6cy5jaGFuZ2VZZWFyLGRlY3JlYXNlTW9udGg6cy5kZWNyZWFzZU1vbnRoLGluY3JlYXNlTW9udGg6cy5pbmNyZWFzZU1vbnRoLGRlY3JlYXNlWWVhcjpzLmRlY3JlYXNlWWVhcixpbmNyZWFzZVllYXI6cy5pbmNyZWFzZVllYXIscHJldk1vbnRoQnV0dG9uRGlzYWJsZWQ6byxuZXh0TW9udGhCdXR0b25EaXNhYmxlZDppLHByZXZZZWFyQnV0dG9uRGlzYWJsZWQ6bCxuZXh0WWVhckJ1dHRvbkRpc2FibGVkOmN9KSkscCYmdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lc1wifSxzLmhlYWRlcihuKSkpfSxzLnJlbmRlclllYXJIZWFkZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tb250aERhdGUscj1zLnByb3BzLGE9ci5zaG93WWVhclBpY2tlcixvPXIueWVhckl0ZW1OdW1iZXIsaT1tdCh0LHZvaWQgMD09PW8/bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXI6byksbD1pLnN0YXJ0UGVyaW9kLGM9aS5lbmRQZXJpb2Q7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXIgcmVhY3QtZGF0ZXBpY2tlci15ZWFyLWhlYWRlclwifSxhP1wiXCIuY29uY2F0KGwsXCIgLSBcIikuY29uY2F0KGMpOnguZ2V0WWVhcih0KSl9LHMucmVuZGVySGVhZGVyPWZ1bmN0aW9uKGUpe3ZhciB0PWUubW9udGhEYXRlLHI9ZS5pLG49e21vbnRoRGF0ZTp0LGk6dm9pZCAwPT09cj8wOnJ9O3N3aXRjaCghMCl7Y2FzZSB2b2lkIDAhPT1zLnByb3BzLnJlbmRlckN1c3RvbUhlYWRlcjpyZXR1cm4gcy5yZW5kZXJDdXN0b21IZWFkZXIobik7Y2FzZSBzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyfHxzLnByb3BzLnNob3dZZWFyUGlja2VyOnJldHVybiBzLnJlbmRlclllYXJIZWFkZXIobik7ZGVmYXVsdDpyZXR1cm4gcy5yZW5kZXJEZWZhdWx0SGVhZGVyKG4pfX0scy5yZW5kZXJNb250aHM9ZnVuY3Rpb24oKXt2YXIgZSx0O2lmKCFzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSYmIXMucHJvcHMuc2hvd1llYXJQaWNrZXIpe2Zvcih2YXIgcj1bXSxhPW51bGwhPT0oZT1zLnByb3BzLm1vbnRoc1Nob3duKSYmdm9pZCAwIT09ZT9lOm4uZGVmYXVsdFByb3BzLm1vbnRoc1Nob3duLG89cy5wcm9wcy5zaG93UHJldmlvdXNNb250aHM/YS0xOjAsbD1zLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyP2QuYWRkWWVhcnMocy5zdGF0ZS5kYXRlLG8pOmFlLnN1Yk1vbnRocyhzLnN0YXRlLmRhdGUsbyksYz1udWxsIT09KHQ9cy5wcm9wcy5tb250aFNlbGVjdGVkSW4pJiZ2b2lkIDAhPT10P3Q6byxwPTA7cDxhOysrcCl7dmFyIHU9cC1jK28sZj1zLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyP2QuYWRkWWVhcnMobCx1KTppLmFkZE1vbnRocyhsLHUpLGg9XCJtb250aC1cIi5jb25jYXQocCksbT1wPGEtMSx2PXA+MDtyLnB1c2godWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTpoLHJlZjpmdW5jdGlvbihlKXtzLm1vbnRoQ29udGFpbmVyPW51bGwhPWU/ZTp2b2lkIDB9LGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWNvbnRhaW5lclwifSxzLnJlbmRlckhlYWRlcih7bW9udGhEYXRlOmYsaTpwfSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHh0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse2FyaWFMYWJlbFByZWZpeDpzLnByb3BzLm1vbnRoQXJpYUxhYmVsUHJlZml4LGRheTpmLG9uRGF5Q2xpY2s6cy5oYW5kbGVEYXlDbGljayxoYW5kbGVPbktleURvd246cy5wcm9wcy5oYW5kbGVPbkRheUtleURvd24saGFuZGxlT25Nb250aEtleURvd246cy5wcm9wcy5oYW5kbGVPbktleURvd24sb25EYXlNb3VzZUVudGVyOnMuaGFuZGxlRGF5TW91c2VFbnRlcixvbk1vdXNlTGVhdmU6cy5oYW5kbGVNb250aE1vdXNlTGVhdmUsb3JkZXJJbkRpc3BsYXk6cCxzZWxlY3RpbmdEYXRlOnMuc3RhdGUuc2VsZWN0aW5nRGF0ZSxtb250aFNob3dzRHVwbGljYXRlRGF5c0VuZDptLG1vbnRoU2hvd3NEdXBsaWNhdGVEYXlzU3RhcnQ6dn0pKSkpfXJldHVybiByfX0scy5yZW5kZXJZZWFycz1mdW5jdGlvbigpe2lmKCFzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSlyZXR1cm4gcy5wcm9wcy5zaG93WWVhclBpY2tlcj91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tY29udGFpbmVyXCJ9LHMucmVuZGVySGVhZGVyKHttb250aERhdGU6cy5zdGF0ZS5kYXRlfSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEh0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse3NlbGVjdGluZ0RhdGU6cy5zdGF0ZS5zZWxlY3RpbmdEYXRlLGRhdGU6cy5zdGF0ZS5kYXRlLG9uRGF5Q2xpY2s6cy5oYW5kbGVEYXlDbGljayxjbGVhclNlbGVjdGluZ0RhdGU6cy5jbGVhclNlbGVjdGluZ0RhdGUsb25ZZWFyTW91c2VFbnRlcjpzLmhhbmRsZVllYXJNb3VzZUVudGVyLG9uWWVhck1vdXNlTGVhdmU6cy5oYW5kbGVZZWFyTW91c2VMZWF2ZX0pKSk6dm9pZCAwfSxzLnJlbmRlclRpbWVTZWN0aW9uPWZ1bmN0aW9uKCl7aWYocy5wcm9wcy5zaG93VGltZVNlbGVjdCYmKHMuc3RhdGUubW9udGhDb250YWluZXJ8fHMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5KSlyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEZ0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse29uQ2hhbmdlOnMucHJvcHMub25UaW1lQ2hhbmdlLGZvcm1hdDpzLnByb3BzLnRpbWVGb3JtYXQsaW50ZXJ2YWxzOnMucHJvcHMudGltZUludGVydmFscyxtb250aFJlZjpzLnN0YXRlLm1vbnRoQ29udGFpbmVyfSkpfSxzLnJlbmRlcklucHV0VGltZVNlY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT1zLnByb3BzLnNlbGVjdGVkP25ldyBEYXRlKHMucHJvcHMuc2VsZWN0ZWQpOnZvaWQgMCx0PWUmJkNlKGUpJiZCb29sZWFuKHMucHJvcHMuc2VsZWN0ZWQpP1wiXCIuY29uY2F0KGh0KGUuZ2V0SG91cnMoKSksXCI6XCIpLmNvbmNhdChodChlLmdldE1pbnV0ZXMoKSkpOlwiXCI7aWYocy5wcm9wcy5zaG93VGltZUlucHV0KXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQod3QsZ2Uoe30sbi5kZWZhdWx0UHJvcHMscy5wcm9wcyx7ZGF0ZTplLHRpbWVTdHJpbmc6dCxvbkNoYW5nZTpzLnByb3BzLm9uVGltZUNoYW5nZX0pKX0scy5yZW5kZXJBcmlhTGl2ZVJlZ2lvbj1mdW5jdGlvbigpe3ZhciBlLHQscj1tdChzLnN0YXRlLmRhdGUsbnVsbCE9PShlPXMucHJvcHMueWVhckl0ZW1OdW1iZXIpJiZ2b2lkIDAhPT1lP2U6bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXIpLGE9ci5zdGFydFBlcmlvZCxvPXIuZW5kUGVyaW9kO3JldHVybiB0PXMucHJvcHMuc2hvd1llYXJQaWNrZXI/XCJcIi5jb25jYXQoYSxcIiAtIFwiKS5jb25jYXQobyk6cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcj94LmdldFllYXIocy5zdGF0ZS5kYXRlKTpcIlwiLmNvbmNhdChCZShfLmdldE1vbnRoKHMuc3RhdGUuZGF0ZSkscy5wcm9wcy5sb2NhbGUpLFwiIFwiKS5jb25jYXQoeC5nZXRZZWFyKHMuc3RhdGUuZGF0ZSkpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7cm9sZTpcImFsZXJ0XCIsXCJhcmlhLWxpdmVcIjpcInBvbGl0ZVwiLGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2FyaWEtbGl2ZVwifSxzLnN0YXRlLmlzUmVuZGVyQXJpYUxpdmVNZXNzYWdlJiZ0KX0scy5yZW5kZXJDaGlsZHJlbj1mdW5jdGlvbigpe2lmKHMucHJvcHMuY2hpbGRyZW4pcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19jaGlsZHJlbi1jb250YWluZXJcIn0scy5wcm9wcy5jaGlsZHJlbil9LHMuY29udGFpbmVyUmVmPXIuY3JlYXRlUmVmKCkscy5zdGF0ZT17ZGF0ZTpzLmdldERhdGVJblZpZXcoKSxzZWxlY3RpbmdEYXRlOnZvaWQgMCxtb250aENvbnRhaW5lcjp2b2lkIDAsaXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITF9LHN9cmV0dXJuIHZlKG4sZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue21vbnRoc1Nob3duOjEsZm9yY2VTaG93TW9udGhOYXZpZ2F0aW9uOiExLHRpbWVDYXB0aW9uOlwiVGltZVwiLHByZXZpb3VzWWVhckJ1dHRvbkxhYmVsOlwiUHJldmlvdXMgWWVhclwiLG5leHRZZWFyQnV0dG9uTGFiZWw6XCJOZXh0IFllYXJcIixwcmV2aW91c01vbnRoQnV0dG9uTGFiZWw6XCJQcmV2aW91cyBNb250aFwiLG5leHRNb250aEJ1dHRvbkxhYmVsOlwiTmV4dCBNb250aFwiLHllYXJJdGVtTnVtYmVyOlNlfX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5wcm9wcy5zaG93VGltZVNlbGVjdCYmKHRoaXMuYXNzaWduTW9udGhDb250YWluZXI9dm9pZCBlLnNldFN0YXRlKHttb250aENvbnRhaW5lcjplLm1vbnRoQ29udGFpbmVyfSkpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZighdGhpcy5wcm9wcy5wcmVTZWxlY3Rpb258fEhlKHRoaXMucHJvcHMucHJlU2VsZWN0aW9uLGUucHJlU2VsZWN0aW9uKSYmdGhpcy5wcm9wcy5tb250aFNlbGVjdGVkSW49PT1lLm1vbnRoU2VsZWN0ZWRJbil0aGlzLnByb3BzLm9wZW5Ub0RhdGUmJiFIZSh0aGlzLnByb3BzLm9wZW5Ub0RhdGUsZS5vcGVuVG9EYXRlKSYmdGhpcy5zZXRTdGF0ZSh7ZGF0ZTp0aGlzLnByb3BzLm9wZW5Ub0RhdGV9KTtlbHNle3ZhciByPSFBZSh0aGlzLnN0YXRlLmRhdGUsdGhpcy5wcm9wcy5wcmVTZWxlY3Rpb24pO3RoaXMuc2V0U3RhdGUoe2RhdGU6dGhpcy5wcm9wcy5wcmVTZWxlY3Rpb259LChmdW5jdGlvbigpe3JldHVybiByJiZ0LmhhbmRsZUN1c3RvbU1vbnRoQ2hhbmdlKHQuc3RhdGUuZGF0ZSl9KSl9fSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmNvbnRhaW5lcnx8a2U7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtzdHlsZTp7ZGlzcGxheTpcImNvbnRlbnRzXCJ9LHJlZjp0aGlzLmNvbnRhaW5lclJlZn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGUse2NsYXNzTmFtZTp0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyXCIsdGhpcy5wcm9wcy5jbGFzc05hbWUse1wicmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5XCI6dGhpcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHl9KSxzaG93VGltZTp0aGlzLnByb3BzLnNob3dUaW1lU2VsZWN0fHx0aGlzLnByb3BzLnNob3dUaW1lSW5wdXQsc2hvd1RpbWVTZWxlY3RPbmx5OnRoaXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5fSx0aGlzLnJlbmRlckFyaWFMaXZlUmVnaW9uKCksdGhpcy5yZW5kZXJQcmV2aW91c0J1dHRvbigpLHRoaXMucmVuZGVyTmV4dEJ1dHRvbigpLHRoaXMucmVuZGVyTW9udGhzKCksdGhpcy5yZW5kZXJZZWFycygpLHRoaXMucmVuZGVyVG9kYXlCdXR0b24oKSx0aGlzLnJlbmRlclRpbWVTZWN0aW9uKCksdGhpcy5yZW5kZXJJbnB1dFRpbWVTZWN0aW9uKCksdGhpcy5yZW5kZXJDaGlsZHJlbigpKSl9LG59KHIuQ29tcG9uZW50KSxqdD1mdW5jdGlvbihlKXt2YXIgdD1lLmljb24scj1lLmNsYXNzTmFtZSxuPXZvaWQgMD09PXI/XCJcIjpyLGE9ZS5vbkNsaWNrLG89XCJyZWFjdC1kYXRlcGlja2VyX19jYWxlbmRhci1pY29uXCI7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQ/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaVwiLHtjbGFzc05hbWU6XCJcIi5jb25jYXQobyxcIiBcIikuY29uY2F0KHQsXCIgXCIpLmNvbmNhdChuKSxcImFyaWEtaGlkZGVuXCI6XCJ0cnVlXCIsb25DbGljazphfSk6dWUuZGVmYXVsdC5pc1ZhbGlkRWxlbWVudCh0KT91ZS5kZWZhdWx0LmNsb25lRWxlbWVudCh0LHtjbGFzc05hbWU6XCJcIi5jb25jYXQodC5wcm9wcy5jbGFzc05hbWV8fFwiXCIsXCIgXCIpLmNvbmNhdChvLFwiIFwiKS5jb25jYXQobiksb25DbGljazpmdW5jdGlvbihlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnByb3BzLm9uQ2xpY2smJnQucHJvcHMub25DbGljayhlKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBhJiZhKGUpfX0pOnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN2Z1wiLHtjbGFzc05hbWU6XCJcIi5jb25jYXQobyxcIiBcIikuY29uY2F0KG4pLHhtbG5zOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIix2aWV3Qm94OlwiMCAwIDQ0OCA1MTJcIixvbkNsaWNrOmF9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInBhdGhcIix7ZDpcIk05NiAzMlY2NEg0OEMyMS41IDY0IDAgODUuNSAwIDExMnY0OEg0NDhWMTEyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4SDM1MlYzMmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMlY2NEgxNjBWMzJjMC0xNy43LTE0LjMtMzItMzItMzJTOTYgMTQuMyA5NiAzMnpNNDQ4IDE5MkgwVjQ2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OEg0MDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhWMTkyelwifSkpfSxVdD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciByPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiByLnBvcnRhbFJvb3Q9bnVsbCxyLmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikscn1yZXR1cm4gdmUodCxlKSx0LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMucG9ydGFsUm9vdD0odGhpcy5wcm9wcy5wb3J0YWxIb3N0fHxkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQodGhpcy5wcm9wcy5wb3J0YWxJZCksdGhpcy5wb3J0YWxSb290fHwodGhpcy5wb3J0YWxSb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5wb3J0YWxSb290LnNldEF0dHJpYnV0ZShcImlkXCIsdGhpcy5wcm9wcy5wb3J0YWxJZCksKHRoaXMucHJvcHMucG9ydGFsSG9zdHx8ZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcy5wb3J0YWxSb290KSksdGhpcy5wb3J0YWxSb290LmFwcGVuZENoaWxkKHRoaXMuZWwpfSx0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMucG9ydGFsUm9vdCYmdGhpcy5wb3J0YWxSb290LnJlbW92ZUNoaWxkKHRoaXMuZWwpfSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaGUuZGVmYXVsdC5jcmVhdGVQb3J0YWwodGhpcy5wcm9wcy5jaGlsZHJlbix0aGlzLmVsKX0sdH0oci5Db21wb25lbnQpLCR0PWZ1bmN0aW9uKGUpe3JldHVybihlIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnR8fCFlLmRpc2FibGVkKSYmLTEhPT1lLnRhYkluZGV4fSx6dD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLmdldFRhYkNoaWxkcmVuPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG51bGw9PT0oZT1uLnRhYkxvb3BSZWYuY3VycmVudCl8fHZvaWQgMD09PWU/dm9pZCAwOmUucXVlcnlTZWxlY3RvckFsbChcIlt0YWJpbmRleF0sIGEsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWFcIiksMSwtMSkuZmlsdGVyKCR0KX0sbi5oYW5kbGVGb2N1c1N0YXJ0PWZ1bmN0aW9uKCl7dmFyIGU9bi5nZXRUYWJDaGlsZHJlbigpO2UmJmUubGVuZ3RoPjEmJmVbZS5sZW5ndGgtMV0uZm9jdXMoKX0sbi5oYW5kbGVGb2N1c0VuZD1mdW5jdGlvbigpe3ZhciBlPW4uZ2V0VGFiQ2hpbGRyZW4oKTtlJiZlLmxlbmd0aD4xJiZlWzBdLmZvY3VzKCl9LG4udGFiTG9vcFJlZj1yLmNyZWF0ZVJlZigpLG59cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuKG51bGwhPT0oZT10aGlzLnByb3BzLmVuYWJsZVRhYkxvb3ApJiZ2b2lkIDAhPT1lP2U6dC5kZWZhdWx0UHJvcHMuZW5hYmxlVGFiTG9vcCk/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RhYi1sb29wXCIscmVmOnRoaXMudGFiTG9vcFJlZn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RhYi1sb29wX19zdGFydFwiLHRhYkluZGV4OjAsb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzU3RhcnR9KSx0aGlzLnByb3BzLmNoaWxkcmVuLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190YWItbG9vcF9fZW5kXCIsdGFiSW5kZXg6MCxvbkZvY3VzOnRoaXMuaGFuZGxlRm9jdXNFbmR9KSk6dGhpcy5wcm9wcy5jaGlsZHJlbn0sdC5kZWZhdWx0UHJvcHM9e2VuYWJsZVRhYkxvb3A6ITB9LHR9KHIuQ29tcG9uZW50KTt2YXIgWHQsR3Q9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHZlKG4sZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2hpZGVQb3BwZXI6ITB9fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsYT1lLmNsYXNzTmFtZSxvPWUud3JhcHBlckNsYXNzTmFtZSxzPWUuaGlkZVBvcHBlcixpPXZvaWQgMD09PXM/bi5kZWZhdWx0UHJvcHMuaGlkZVBvcHBlcjpzLGw9ZS5wb3BwZXJDb21wb25lbnQsYz1lLnRhcmdldENvbXBvbmVudCxwPWUuZW5hYmxlVGFiTG9vcCxkPWUucG9wcGVyT25LZXlEb3duLHU9ZS5wb3J0YWxJZCxmPWUucG9ydGFsSG9zdCxoPWUucG9wcGVyUHJvcHMsbT1lLnNob3dBcnJvdyx2PXZvaWQgMDtpZighaSl7dmFyIGc9dC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlci1wb3BwZXJcIixhKTt2PXVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh6dCx7ZW5hYmxlVGFiTG9vcDpwfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOmgucmVmcy5zZXRGbG9hdGluZyxzdHlsZTpoLmZsb2F0aW5nU3R5bGVzLGNsYXNzTmFtZTpnLFwiZGF0YS1wbGFjZW1lbnRcIjpoLnBsYWNlbWVudCxvbktleURvd246ZH0sbCxtJiZ1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoY2UuRmxvYXRpbmdBcnJvdyx7cmVmOmguYXJyb3dSZWYsY29udGV4dDpoLmNvbnRleHQsZmlsbDpcImN1cnJlbnRDb2xvclwiLHN0cm9rZVdpZHRoOjEsaGVpZ2h0Ojgsd2lkdGg6MTYsc3R5bGU6e3RyYW5zZm9ybTpcInRyYW5zbGF0ZVkoLTFweClcIn0sY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGVcIn0pKSl9dGhpcy5wcm9wcy5wb3BwZXJDb250YWluZXImJih2PXIuY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLnBvcHBlckNvbnRhaW5lcix7fSx2KSksdSYmIWkmJih2PXVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChVdCx7cG9ydGFsSWQ6dSxwb3J0YWxIb3N0OmZ9LHYpKTt2YXIgRD10LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyLXdyYXBwZXJcIixvKTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHVlLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOmgucmVmcy5zZXRSZWZlcmVuY2UsY2xhc3NOYW1lOkR9LGMpLHYpfSxufShyLkNvbXBvbmVudCksSnQ9KFh0PUd0LGZ1bmN0aW9uKGUpe3ZhciB0LG49XCJib29sZWFuXCIhPXR5cGVvZiBlLmhpZGVQb3BwZXJ8fGUuaGlkZVBvcHBlcixhPXIudXNlUmVmKG51bGwpLG89Y2UudXNlRmxvYXRpbmcoZ2Uoe29wZW46IW4sd2hpbGVFbGVtZW50c01vdW50ZWQ6Y2UuYXV0b1VwZGF0ZSxwbGFjZW1lbnQ6ZS5wb3BwZXJQbGFjZW1lbnQsbWlkZGxld2FyZTpEZShbY2UuZmxpcCh7cGFkZGluZzoxNX0pLGNlLm9mZnNldCgxMCksY2UuYXJyb3coe2VsZW1lbnQ6YX0pXSxudWxsIT09KHQ9ZS5wb3BwZXJNb2RpZmllcnMpJiZ2b2lkIDAhPT10P3Q6W10sITApfSxlLnBvcHBlclByb3BzKSkscz1nZShnZSh7fSxlKSx7aGlkZVBvcHBlcjpuLHBvcHBlclByb3BzOmdlKGdlKHt9LG8pLHthcnJvd1JlZjphfSl9KTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFh0LGdlKHt9LHMpKX0pLFp0PVwicmVhY3QtZGF0ZXBpY2tlci1pZ25vcmUtb25jbGlja291dHNpZGVcIixlcj1mZS5kZWZhdWx0KFZ0KTt2YXIgdHI9XCJEYXRlIGlucHV0IG5vdCB2YWxpZC5cIixycj1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKG8pe3ZhciBzPWUuY2FsbCh0aGlzLG8pfHx0aGlzO3JldHVybiBzLmNhbGVuZGFyPW51bGwscy5pbnB1dD1udWxsLHMuZ2V0UHJlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHMucHJvcHMub3BlblRvRGF0ZT9zLnByb3BzLm9wZW5Ub0RhdGU6cy5wcm9wcy5zZWxlY3RzRW5kJiZzLnByb3BzLnN0YXJ0RGF0ZT9zLnByb3BzLnN0YXJ0RGF0ZTpzLnByb3BzLnNlbGVjdHNTdGFydCYmcy5wcm9wcy5lbmREYXRlP3MucHJvcHMuZW5kRGF0ZTpNZSgpfSxzLm1vZGlmeUhvbGlkYXlzPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIG51bGw9PT0oZT1zLnByb3BzLmhvbGlkYXlzKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7dmFyIHI9bmV3IERhdGUodC5kYXRlKTtyZXR1cm4gQ2Uocik/RGUoRGUoW10sZSwhMCksW2dlKGdlKHt9LHQpLHtkYXRlOnJ9KV0sITEpOmV9KSxbXSl9LHMuY2FsY0luaXRpYWxTdGF0ZT1mdW5jdGlvbigpe3ZhciBlLHQ9cy5nZXRQcmVTZWxlY3Rpb24oKSxyPWN0KHMucHJvcHMpLG49cHQocy5wcm9wcyksYT1yJiZPLmlzQmVmb3JlKHQsWWUocikpP3I6biYmTi5pc0FmdGVyKHQsUmUobikpP246dDtyZXR1cm57b3BlbjpzLnByb3BzLnN0YXJ0T3Blbnx8ITEscHJldmVudEZvY3VzOiExLGlucHV0VmFsdWU6bnVsbCxwcmVTZWxlY3Rpb246bnVsbCE9PShlPXMucHJvcHMuc2VsZWN0c1JhbmdlP3MucHJvcHMuc3RhcnREYXRlOnMucHJvcHMuc2VsZWN0ZWQpJiZ2b2lkIDAhPT1lP2U6YSxoaWdobGlnaHREYXRlczpkdChzLnByb3BzLmhpZ2hsaWdodERhdGVzKSxmb2N1c2VkOiExLHNob3VsZEZvY3VzRGF5SW5saW5lOiExLGlzUmVuZGVyQXJpYUxpdmVNZXNzYWdlOiExLHdhc0hpZGRlbjohMX19LHMucmVzZXRIaWRkZW5TdGF0dXM9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKGdlKGdlKHt9LHMuc3RhdGUpLHt3YXNIaWRkZW46ITF9KSl9LHMuc2V0SGlkZGVuU3RhdHVzPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZShnZShnZSh7fSxzLnN0YXRlKSx7d2FzSGlkZGVuOiEwfSkpfSxzLnNldEhpZGRlblN0YXRlT25WaXNpYmlsaXR5SGlkZGVuPWZ1bmN0aW9uKCl7XCJoaWRkZW5cIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmcy5zZXRIaWRkZW5TdGF0dXMoKX0scy5jbGVhclByZXZlbnRGb2N1c1RpbWVvdXQ9ZnVuY3Rpb24oKXtzLnByZXZlbnRGb2N1c1RpbWVvdXQmJmNsZWFyVGltZW91dChzLnByZXZlbnRGb2N1c1RpbWVvdXQpfSxzLnNldEZvY3VzPWZ1bmN0aW9uKCl7cy5pbnB1dCYmcy5pbnB1dC5mb2N1cyYmcy5pbnB1dC5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pfSxzLnNldEJsdXI9ZnVuY3Rpb24oKXtzLmlucHV0JiZzLmlucHV0LmJsdXImJnMuaW5wdXQuYmx1cigpLHMuY2FuY2VsRm9jdXNJbnB1dCgpfSxzLnNldE9wZW49ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD0hMSkscy5zZXRTdGF0ZSh7b3BlbjplLHByZVNlbGVjdGlvbjplJiZzLnN0YXRlLm9wZW4/cy5zdGF0ZS5wcmVTZWxlY3Rpb246cy5jYWxjSW5pdGlhbFN0YXRlKCkucHJlU2VsZWN0aW9uLGxhc3RQcmVTZWxlY3RDaGFuZ2U6YXJ9LChmdW5jdGlvbigpe2V8fHMuc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3JldHVybntmb2N1c2VkOiEhdCYmZS5mb2N1c2VkfX0pLChmdW5jdGlvbigpeyF0JiZzLnNldEJsdXIoKSxzLnNldFN0YXRlKHtpbnB1dFZhbHVlOm51bGx9KX0pKX0pKX0scy5pbnB1dE9rPWZ1bmN0aW9uKCl7cmV0dXJuIEkuaXNEYXRlKHMuc3RhdGUucHJlU2VsZWN0aW9uKX0scy5pc0NhbGVuZGFyT3Blbj1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1zLnByb3BzLm9wZW4/cy5zdGF0ZS5vcGVuJiYhcy5wcm9wcy5kaXNhYmxlZCYmIXMucHJvcHMucmVhZE9ubHk6cy5wcm9wcy5vcGVufSxzLmhhbmRsZUZvY3VzPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbj1zLnN0YXRlLndhc0hpZGRlbixhPSFufHxzLnN0YXRlLm9wZW47biYmcy5yZXNldEhpZGRlblN0YXR1cygpLCFzLnN0YXRlLnByZXZlbnRGb2N1cyYmYSYmKG51bGw9PT0ocj0odD1zLnByb3BzKS5vbkZvY3VzKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSkscy5wcm9wcy5wcmV2ZW50T3Blbk9uRm9jdXN8fHMucHJvcHMucmVhZE9ubHl8fHMuc2V0T3BlbighMCkpLHMuc2V0U3RhdGUoe2ZvY3VzZWQ6ITB9KX0scy5zZW5kRm9jdXNCYWNrVG9JbnB1dD1mdW5jdGlvbigpe3MucHJldmVudEZvY3VzVGltZW91dCYmcy5jbGVhclByZXZlbnRGb2N1c1RpbWVvdXQoKSxzLnNldFN0YXRlKHtwcmV2ZW50Rm9jdXM6ITB9LChmdW5jdGlvbigpe3MucHJldmVudEZvY3VzVGltZW91dD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Muc2V0Rm9jdXMoKSxzLnNldFN0YXRlKHtwcmV2ZW50Rm9jdXM6ITF9KX0pKX0pKX0scy5jYW5jZWxGb2N1c0lucHV0PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHMuaW5wdXRGb2N1c1RpbWVvdXQpLHMuaW5wdXRGb2N1c1RpbWVvdXQ9dm9pZCAwfSxzLmRlZmVyRm9jdXNJbnB1dD1mdW5jdGlvbigpe3MuY2FuY2VsRm9jdXNJbnB1dCgpLHMuaW5wdXRGb2N1c1RpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gcy5zZXRGb2N1cygpfSksMSl9LHMuaGFuZGxlRHJvcGRvd25Gb2N1cz1mdW5jdGlvbigpe3MuY2FuY2VsRm9jdXNJbnB1dCgpfSxzLmhhbmRsZUJsdXI9ZnVuY3Rpb24oZSl7dmFyIHQscjsoIXMuc3RhdGUub3Blbnx8cy5wcm9wcy53aXRoUG9ydGFsfHxzLnByb3BzLnNob3dUaW1lSW5wdXQpJiYobnVsbD09PShyPSh0PXMucHJvcHMpLm9uQmx1cil8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpKSxzLnNldFN0YXRlKHtmb2N1c2VkOiExfSl9LHMuaGFuZGxlQ2FsZW5kYXJDbGlja091dHNpZGU9ZnVuY3Rpb24oZSl7dmFyIHQscjtzLnByb3BzLmlubGluZXx8cy5zZXRPcGVuKCExKSxudWxsPT09KHI9KHQ9cy5wcm9wcykub25DbGlja091dHNpZGUpfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKSxzLnByb3BzLndpdGhQb3J0YWwmJmUucHJldmVudERlZmF1bHQoKX0scy5oYW5kbGVDaGFuZ2U9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07dmFyIHI9ZVswXTtpZighcy5wcm9wcy5vbkNoYW5nZVJhd3x8KHMucHJvcHMub25DaGFuZ2VSYXcuYXBwbHkocyxlKSxyJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiByLmlzRGVmYXVsdFByZXZlbnRlZCYmIXIuaXNEZWZhdWx0UHJldmVudGVkKCkpKXtzLnNldFN0YXRlKHtpbnB1dFZhbHVlOihudWxsPT1yP3ZvaWQgMDpyLnRhcmdldClpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQ/ci50YXJnZXQudmFsdWU6bnVsbCxsYXN0UHJlU2VsZWN0Q2hhbmdlOm5yfSk7dmFyIGE9cy5wcm9wcyxvPWEuZGF0ZUZvcm1hdCxpPXZvaWQgMD09PW8/bi5kZWZhdWx0UHJvcHMuZGF0ZUZvcm1hdDpvLGw9YS5zdHJpY3RQYXJzaW5nLGM9dm9pZCAwPT09bD9uLmRlZmF1bHRQcm9wcy5zdHJpY3RQYXJzaW5nOmwscD1mdW5jdGlvbihlLHQscixuLGEpe3ZhciBvLHM9bnVsbCxpPUtlKHIpfHxLZShxZSgpKSxsPSEwO2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG89Sy5wYXJzZShlLHQsbmV3IERhdGUse2xvY2FsZTppLHVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VuczohMCx1c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zOiEwfSk7biYmKGw9Q2UobyxhKSYmZT09PV9lKG8sdCxyKSksQ2UobyxhKSYmbCYmKHM9byl9KSkscztpZihzPUsucGFyc2UoZSx0LG5ldyBEYXRlLHtsb2NhbGU6aSx1c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnM6ITAsdXNlQWRkaXRpb25hbERheU9mWWVhclRva2VuczohMH0pLG4pbD1DZShzKSYmZT09PV9lKHMsdCxyKTtlbHNlIGlmKCFDZShzKSl7dmFyIGM9KG51bGwhPT0obz10Lm1hdGNoKGJlKSkmJnZvaWQgMCE9PW8/bzpbXSkubWFwKChmdW5jdGlvbihlKXt2YXIgdD1lWzBdO2lmKFwicFwiPT09dHx8XCJQXCI9PT10KXt2YXIgcj1rLmxvbmdGb3JtYXR0ZXJzW3RdO3JldHVybiBpP3IoZSxpLmZvcm1hdExvbmcpOnR9cmV0dXJuIGV9KSkuam9pbihcIlwiKTtlLmxlbmd0aD4wJiYocz1LLnBhcnNlKGUsYy5zbGljZSgwLGUubGVuZ3RoKSxuZXcgRGF0ZSx7dXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zOiEwLHVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnM6ITB9KSksQ2Uocyl8fChzPW5ldyBEYXRlKGUpKX1yZXR1cm4gQ2UocykmJmw/czpudWxsfSgobnVsbD09cj92b2lkIDA6ci50YXJnZXQpaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50P3IudGFyZ2V0LnZhbHVlOlwiXCIsaSxzLnByb3BzLmxvY2FsZSxjLHMucHJvcHMubWluRGF0ZSk7cy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkmJnMucHJvcHMuc2VsZWN0ZWQmJnAmJiFIZShwLHMucHJvcHMuc2VsZWN0ZWQpJiYocD1WLnNldChzLnByb3BzLnNlbGVjdGVkLHtob3VyczpiLmdldEhvdXJzKHApLG1pbnV0ZXM6Qy5nZXRNaW51dGVzKHApLHNlY29uZHM6UC5nZXRTZWNvbmRzKHApfSkpLCFwJiYobnVsbD09cj92b2lkIDA6ci50YXJnZXQpaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50JiYobnVsbD09cj92b2lkIDA6ci50YXJnZXQudmFsdWUpfHxzLnNldFNlbGVjdGVkKHAsciwhMCl9fSxzLmhhbmRsZVNlbGVjdD1mdW5jdGlvbihlLHQscil7aWYocy5wcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0JiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdCYmcy5zZW5kRm9jdXNCYWNrVG9JbnB1dCgpLHMucHJvcHMub25DaGFuZ2VSYXcmJnMucHJvcHMub25DaGFuZ2VSYXcodCkscy5zZXRTZWxlY3RlZChlLHQsITEscikscy5wcm9wcy5zaG93RGF0ZVNlbGVjdCYmcy5zZXRTdGF0ZSh7aXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITB9KSwhcy5wcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0fHxzLnByb3BzLnNob3dUaW1lU2VsZWN0KXMuc2V0UHJlU2VsZWN0aW9uKGUpO2Vsc2UgaWYoIXMucHJvcHMuaW5saW5lKXtzLnByb3BzLnNlbGVjdHNSYW5nZXx8cy5zZXRPcGVuKCExKTt2YXIgbj1zLnByb3BzLGE9bi5zdGFydERhdGUsbz1uLmVuZERhdGU7IWF8fG98fCFzLnByb3BzLnN3YXBSYW5nZSYmRHQoZSxhKXx8cy5zZXRPcGVuKCExKX19LHMuc2V0U2VsZWN0ZWQ9ZnVuY3Rpb24oZSx0LHIsYSl7dmFyIG8saT1lO2lmKHMucHJvcHMuc2hvd1llYXJQaWNrZXIpe2lmKG51bGwhPT1pJiZaZSh4LmdldFllYXIoaSkscy5wcm9wcykpcmV0dXJufWVsc2UgaWYocy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyKXtpZihudWxsIT09aSYmJGUoaSxzLnByb3BzKSlyZXR1cm59ZWxzZSBpZihudWxsIT09aSYmamUoaSxzLnByb3BzKSlyZXR1cm47dmFyIGw9cy5wcm9wcyxjPWwub25DaGFuZ2UscD1sLnNlbGVjdHNSYW5nZSxkPWwuc3RhcnREYXRlLHU9bC5lbmREYXRlLGY9bC5zZWxlY3RzTXVsdGlwbGUsaD1sLnNlbGVjdGVkRGF0ZXMsbT1sLm1pblRpbWUsdj1sLnN3YXBSYW5nZTtpZighV2Uocy5wcm9wcy5zZWxlY3RlZCxpKXx8cy5wcm9wcy5hbGxvd1NhbWVEYXl8fHB8fGYpaWYobnVsbCE9PWkmJighcy5wcm9wcy5zZWxlY3RlZHx8ciYmKHMucHJvcHMuc2hvd1RpbWVTZWxlY3R8fHMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5fHxzLnByb3BzLnNob3dUaW1lSW5wdXQpfHwoaT1QZShpLHtob3VyOmIuZ2V0SG91cnMocy5wcm9wcy5zZWxlY3RlZCksbWludXRlOkMuZ2V0TWludXRlcyhzLnByb3BzLnNlbGVjdGVkKSxzZWNvbmQ6UC5nZXRTZWNvbmRzKHMucHJvcHMuc2VsZWN0ZWQpfSkpLHJ8fCFzLnByb3BzLnNob3dUaW1lU2VsZWN0JiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHl8fG0mJihpPVBlKGkse2hvdXI6bS5nZXRIb3VycygpLG1pbnV0ZTptLmdldE1pbnV0ZXMoKSxzZWNvbmQ6bS5nZXRTZWNvbmRzKCl9KSkscy5wcm9wcy5pbmxpbmV8fHMuc2V0U3RhdGUoe3ByZVNlbGVjdGlvbjppfSkscy5wcm9wcy5mb2N1c1NlbGVjdGVkTW9udGh8fHMuc2V0U3RhdGUoe21vbnRoU2VsZWN0ZWRJbjphfSkpLHApe3ZhciBnPWQmJiF1LEQ9ZCYmdTshZCYmIXU/Yz9jKFtpLG51bGxdLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlOmcmJihudWxsPT09aT9jP2MoW251bGwsbnVsbF0sdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2U6RHQoaSxkKT92P2M/YyhbaSxkXSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZTpjP2MoW2ksbnVsbF0sdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2U6Yz9jKFtkLGldLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlKSxEJiYoYz9jKFtpLG51bGxdLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlKX1lbHNlIGlmKGYpe2lmKG51bGwhPT1pKWlmKG51bGw9PWg/dm9pZCAwOmgubGVuZ3RoKWlmKGguc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIEhlKGUsaSl9KSkpe3ZhciB5PWguZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hSGUoZSxpKX0pKTtjP2MoeSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZX1lbHNlIGM/YyhEZShEZShbXSxoLCEwKSxbaV0sITEpLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlO2Vsc2UgYz9jKFtpXSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZX1lbHNlIGM/YyhpLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlO3J8fCgobnVsbCE9PShvPXMucHJvcHMub25TZWxlY3QpJiZ2b2lkIDAhPT1vP286bi5kZWZhdWx0UHJvcHMub25TZWxlY3QpKGksdCkscy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZTpudWxsfSkpfSxzLnNldFByZVNlbGVjdGlvbj1mdW5jdGlvbihlKXt2YXIgdD1JLmlzRGF0ZShzLnByb3BzLm1pbkRhdGUpLHI9SS5pc0RhdGUocy5wcm9wcy5tYXhEYXRlKSxuPSEwO2lmKGUpe3ZhciBhPVllKGUpO2lmKHQmJnIpbj1RZShlLHMucHJvcHMubWluRGF0ZSxzLnByb3BzLm1heERhdGUpO2Vsc2UgaWYodCl7dmFyIG89WWUocy5wcm9wcy5taW5EYXRlKTtuPU4uaXNBZnRlcihlLG8pfHxXZShhLG8pfWVsc2UgaWYocil7dmFyIGk9UmUocy5wcm9wcy5tYXhEYXRlKTtuPU8uaXNCZWZvcmUoZSxpKXx8V2UoYSxpKX19biYmcy5zZXRTdGF0ZSh7cHJlU2VsZWN0aW9uOmV9KX0scy50b2dnbGVDYWxlbmRhcj1mdW5jdGlvbigpe3Muc2V0T3Blbighcy5zdGF0ZS5vcGVuKX0scy5oYW5kbGVUaW1lQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFzLnByb3BzLnNlbGVjdHNSYW5nZSYmIXMucHJvcHMuc2VsZWN0c011bHRpcGxlKXt2YXIgcj1zLnByb3BzLnNlbGVjdGVkP3MucHJvcHMuc2VsZWN0ZWQ6cy5nZXRQcmVTZWxlY3Rpb24oKSxhPXMucHJvcHMuc2VsZWN0ZWQ/ZTpQZShyLHtob3VyOmIuZ2V0SG91cnMoZSksbWludXRlOkMuZ2V0TWludXRlcyhlKX0pO3Muc2V0U3RhdGUoe3ByZVNlbGVjdGlvbjphfSksKG51bGwhPT0odD1zLnByb3BzLm9uQ2hhbmdlKSYmdm9pZCAwIT09dD90Om4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlKShhKSxzLnByb3BzLnNob3VsZENsb3NlT25TZWxlY3QmJiFzLnByb3BzLnNob3dUaW1lSW5wdXQmJihzLnNlbmRGb2N1c0JhY2tUb0lucHV0KCkscy5zZXRPcGVuKCExKSkscy5wcm9wcy5zaG93VGltZUlucHV0JiZzLnNldE9wZW4oITApLChzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seXx8cy5wcm9wcy5zaG93VGltZVNlbGVjdCkmJnMuc2V0U3RhdGUoe2lzUmVuZGVyQXJpYUxpdmVNZXNzYWdlOiEwfSkscy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZTpudWxsfSl9fSxzLm9uSW5wdXRDbGljaz1mdW5jdGlvbigpe3ZhciBlLHQ7cy5wcm9wcy5kaXNhYmxlZHx8cy5wcm9wcy5yZWFkT25seXx8cy5zZXRPcGVuKCEwKSxudWxsPT09KHQ9KGU9cy5wcm9wcykub25JbnB1dENsaWNrKXx8dm9pZCAwPT09dHx8dC5jYWxsKGUpfSxzLm9uSW5wdXRLZXlEb3duPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhLG87bnVsbD09PShyPSh0PXMucHJvcHMpLm9uS2V5RG93bil8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpO3ZhciBpPWUua2V5O2lmKHMuc3RhdGUub3Blbnx8cy5wcm9wcy5pbmxpbmV8fHMucHJvcHMucHJldmVudE9wZW5PbkZvY3VzKXtpZihzLnN0YXRlLm9wZW4pe2lmKGk9PT15ZS5BcnJvd0Rvd258fGk9PT15ZS5BcnJvd1VwKXtlLnByZXZlbnREZWZhdWx0KCk7dmFyIGw9cy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHk/XCIucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW1bdGFiaW5kZXg9JzAnXVwiOnMucHJvcHMuc2hvd1dlZWtQaWNrZXImJnMucHJvcHMuc2hvd1dlZWtOdW1iZXJzPycucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXJbdGFiaW5kZXg9XCIwXCJdJzpzLnByb3BzLnNob3dGdWxsTW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXI/Jy5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0W3RhYmluZGV4PVwiMFwiXSc6Jy5yZWFjdC1kYXRlcGlja2VyX19kYXlbdGFiaW5kZXg9XCIwXCJdJyxjPShudWxsPT09KG49cy5jYWxlbmRhcil8fHZvaWQgMD09PW4/dm9pZCAwOm4uY29tcG9uZW50Tm9kZSlpbnN0YW5jZW9mIEVsZW1lbnQmJnMuY2FsZW5kYXIuY29tcG9uZW50Tm9kZS5xdWVyeVNlbGVjdG9yKGwpO3JldHVybiB2b2lkKGMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmYy5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pKX12YXIgcD1NZShzLnN0YXRlLnByZVNlbGVjdGlvbik7aT09PXllLkVudGVyPyhlLnByZXZlbnREZWZhdWx0KCkscy5pbnB1dE9rKCkmJnMuc3RhdGUubGFzdFByZVNlbGVjdENoYW5nZT09PWFyPyhzLmhhbmRsZVNlbGVjdChwLGUpLCFzLnByb3BzLnNob3VsZENsb3NlT25TZWxlY3QmJnMuc2V0UHJlU2VsZWN0aW9uKHApKTpzLnNldE9wZW4oITEpKTppPT09eWUuRXNjYXBlPyhlLnByZXZlbnREZWZhdWx0KCkscy5zZW5kRm9jdXNCYWNrVG9JbnB1dCgpLHMuc2V0T3BlbighMSkpOmk9PT15ZS5UYWImJnMuc2V0T3BlbighMSkscy5pbnB1dE9rKCl8fG51bGw9PT0obz0oYT1zLnByb3BzKS5vbklucHV0RXJyb3IpfHx2b2lkIDA9PT1vfHxvLmNhbGwoYSx7Y29kZToxLG1zZzp0cn0pfX1lbHNlIGkhPT15ZS5BcnJvd0Rvd24mJmkhPT15ZS5BcnJvd1VwJiZpIT09eWUuRW50ZXJ8fHMub25JbnB1dENsaWNrKCl9LHMub25Qb3J0YWxLZXlEb3duPWZ1bmN0aW9uKGUpe2Uua2V5PT09eWUuRXNjYXBlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLHMuc2V0U3RhdGUoe3ByZXZlbnRGb2N1czohMH0sKGZ1bmN0aW9uKCl7cy5zZXRPcGVuKCExKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Muc2V0Rm9jdXMoKSxzLnNldFN0YXRlKHtwcmV2ZW50Rm9jdXM6ITF9KX0pKX0pKSl9LHMub25EYXlLZXlEb3duPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbixvLGw9cy5wcm9wcyxjPWwubWluRGF0ZSx1PWwubWF4RGF0ZSxmPWwuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24saD1sLnNob3dXZWVrUGlja2VyLG09bC5zaG91bGRDbG9zZU9uU2VsZWN0LHY9bC5sb2NhbGUsZz1sLmNhbGVuZGFyU3RhcnREYXkseT1sLmFkanVzdERhdGVPbkNoYW5nZSxrPWwuaW5saW5lO2lmKG51bGw9PT0ocj0odD1zLnByb3BzKS5vbktleURvd24pfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKSwhZil7dmFyIHc9ZS5rZXksUz1lLnNoaWZ0S2V5LGI9TWUocy5zdGF0ZS5wcmVTZWxlY3Rpb24pLE09ZnVuY3Rpb24oZSx0KXt2YXIgcj10O3N3aXRjaChlKXtjYXNlIHllLkFycm93UmlnaHQ6cj1oP3AuYWRkV2Vla3ModCwxKTphLmFkZERheXModCwxKTticmVhaztjYXNlIHllLkFycm93TGVmdDpyPWg/c2Uuc3ViV2Vla3ModCwxKTpuZS5zdWJEYXlzKHQsMSk7YnJlYWs7Y2FzZSB5ZS5BcnJvd1VwOnI9c2Uuc3ViV2Vla3ModCwxKTticmVhaztjYXNlIHllLkFycm93RG93bjpyPXAuYWRkV2Vla3ModCwxKTticmVhaztjYXNlIHllLlBhZ2VVcDpyPVM/aWUuc3ViWWVhcnModCwxKTphZS5zdWJNb250aHModCwxKTticmVhaztjYXNlIHllLlBhZ2VEb3duOnI9Uz9kLmFkZFllYXJzKHQsMSk6aS5hZGRNb250aHModCwxKTticmVhaztjYXNlIHllLkhvbWU6cj14ZSh0LHYsZyk7YnJlYWs7Y2FzZSB5ZS5FbmQ6cj1mdW5jdGlvbihlKXtyZXR1cm4gRC5lbmRPZldlZWsoZSl9KHQpfXJldHVybiByfTtpZih3PT09eWUuRW50ZXIpcmV0dXJuIGUucHJldmVudERlZmF1bHQoKSxzLmhhbmRsZVNlbGVjdChiLGUpLHZvaWQoIW0mJnMuc2V0UHJlU2VsZWN0aW9uKGIpKTtpZih3PT09eWUuRXNjYXBlKXJldHVybiBlLnByZXZlbnREZWZhdWx0KCkscy5zZXRPcGVuKCExKSx2b2lkKHMuaW5wdXRPaygpfHxudWxsPT09KG89KG49cy5wcm9wcykub25JbnB1dEVycm9yKXx8dm9pZCAwPT09b3x8by5jYWxsKG4se2NvZGU6MSxtc2c6dHJ9KSk7dmFyIEM9bnVsbDtzd2l0Y2godyl7Y2FzZSB5ZS5BcnJvd0xlZnQ6Y2FzZSB5ZS5BcnJvd1JpZ2h0OmNhc2UgeWUuQXJyb3dVcDpjYXNlIHllLkFycm93RG93bjpjYXNlIHllLlBhZ2VVcDpjYXNlIHllLlBhZ2VEb3duOmNhc2UgeWUuSG9tZTpjYXNlIHllLkVuZDpDPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPWUsbj0hMSxhPTAsbz1NKGUsdCk7IW47KXtpZihhPj00MCl7bz10O2JyZWFrfWMmJm88YyYmKHI9eWUuQXJyb3dSaWdodCxvPWplKGMscy5wcm9wcyk/TShyLG8pOmMpLHUmJm8+dSYmKHI9eWUuQXJyb3dMZWZ0LG89amUodSxzLnByb3BzKT9NKHIsbyk6dSksamUobyxzLnByb3BzKT8ociE9PXllLlBhZ2VVcCYmciE9PXllLkhvbWV8fChyPXllLkFycm93UmlnaHQpLHIhPT15ZS5QYWdlRG93biYmciE9PXllLkVuZHx8KHI9eWUuQXJyb3dMZWZ0KSxvPU0ocixvKSk6bj0hMCxhKyt9cmV0dXJuIG99KHcsYil9aWYoQyl7aWYoZS5wcmV2ZW50RGVmYXVsdCgpLHMuc2V0U3RhdGUoe2xhc3RQcmVTZWxlY3RDaGFuZ2U6YXJ9KSx5JiZzLnNldFNlbGVjdGVkKEMpLHMuc2V0UHJlU2VsZWN0aW9uKEMpLGspe3ZhciBFPV8uZ2V0TW9udGgoYiksUD1fLmdldE1vbnRoKEMpLFk9eC5nZXRZZWFyKGIpLE49eC5nZXRZZWFyKEMpO0UhPT1QfHxZIT09Tj9zLnNldFN0YXRlKHtzaG91bGRGb2N1c0RheUlubGluZTohMH0pOnMuc2V0U3RhdGUoe3Nob3VsZEZvY3VzRGF5SW5saW5lOiExfSl9fWVsc2Ugcy5wcm9wcy5vbklucHV0RXJyb3ImJnMucHJvcHMub25JbnB1dEVycm9yKHtjb2RlOjEsbXNnOnRyfSl9fSxzLm9uUG9wcGVyS2V5RG93bj1mdW5jdGlvbihlKXtlLmtleT09PXllLkVzY2FwZSYmKGUucHJldmVudERlZmF1bHQoKSxzLnNlbmRGb2N1c0JhY2tUb0lucHV0KCkpfSxzLm9uQ2xlYXJDbGljaz1mdW5jdGlvbihlKXtlJiZlLnByZXZlbnREZWZhdWx0JiZlLnByZXZlbnREZWZhdWx0KCkscy5zZW5kRm9jdXNCYWNrVG9JbnB1dCgpO3ZhciB0PXMucHJvcHMscj10LnNlbGVjdHNSYW5nZSxhPXQub25DaGFuZ2U7cj9hP2EoW251bGwsbnVsbF0sZSk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2UoKTphP2EobnVsbCxlKTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZSgpLHMuc2V0U3RhdGUoe2lucHV0VmFsdWU6bnVsbH0pfSxzLmNsZWFyPWZ1bmN0aW9uKCl7cy5vbkNsZWFyQ2xpY2soKX0scy5vblNjcm9sbD1mdW5jdGlvbihlKXtcImJvb2xlYW5cIj09dHlwZW9mIHMucHJvcHMuY2xvc2VPblNjcm9sbCYmcy5wcm9wcy5jbG9zZU9uU2Nyb2xsP2UudGFyZ2V0IT09ZG9jdW1lbnQmJmUudGFyZ2V0IT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZlLnRhcmdldCE9PWRvY3VtZW50LmJvZHl8fHMuc2V0T3BlbighMSk6XCJmdW5jdGlvblwiPT10eXBlb2Ygcy5wcm9wcy5jbG9zZU9uU2Nyb2xsJiZzLnByb3BzLmNsb3NlT25TY3JvbGwoZSkmJnMuc2V0T3BlbighMSl9LHMucmVuZGVyQ2FsZW5kYXI9ZnVuY3Rpb24oKXt2YXIgZSx0O3JldHVybiBzLnByb3BzLmlubGluZXx8cy5pc0NhbGVuZGFyT3BlbigpP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChlcixnZSh7cmVmOmZ1bmN0aW9uKGUpe3MuY2FsZW5kYXI9ZX19LHMucHJvcHMscy5zdGF0ZSx7c2V0T3BlbjpzLnNldE9wZW4sZGF0ZUZvcm1hdDpudWxsIT09KGU9cy5wcm9wcy5kYXRlRm9ybWF0Q2FsZW5kYXIpJiZ2b2lkIDAhPT1lP2U6bi5kZWZhdWx0UHJvcHMuZGF0ZUZvcm1hdENhbGVuZGFyLG9uU2VsZWN0OnMuaGFuZGxlU2VsZWN0LG9uQ2xpY2tPdXRzaWRlOnMuaGFuZGxlQ2FsZW5kYXJDbGlja091dHNpZGUsaG9saWRheXM6dXQocy5tb2RpZnlIb2xpZGF5cygpKSxvdXRzaWRlQ2xpY2tJZ25vcmVDbGFzczpadCxvbkRyb3Bkb3duRm9jdXM6cy5oYW5kbGVEcm9wZG93bkZvY3VzLG9uVGltZUNoYW5nZTpzLmhhbmRsZVRpbWVDaGFuZ2UsY2xhc3NOYW1lOnMucHJvcHMuY2FsZW5kYXJDbGFzc05hbWUsY29udGFpbmVyOnMucHJvcHMuY2FsZW5kYXJDb250YWluZXIsaGFuZGxlT25LZXlEb3duOnMucHJvcHMub25LZXlEb3duLGhhbmRsZU9uRGF5S2V5RG93bjpzLm9uRGF5S2V5RG93bixzZXRQcmVTZWxlY3Rpb246cy5zZXRQcmVTZWxlY3Rpb24sZHJvcGRvd25Nb2RlOm51bGwhPT0odD1zLnByb3BzLmRyb3Bkb3duTW9kZSkmJnZvaWQgMCE9PXQ/dDpuLmRlZmF1bHRQcm9wcy5kcm9wZG93bk1vZGV9KSxzLnByb3BzLmNoaWxkcmVuKTpudWxsfSxzLnJlbmRlckFyaWFMaXZlUmVnaW9uPWZ1bmN0aW9uKCl7dmFyIGUsdD1zLnByb3BzLHI9dC5kYXRlRm9ybWF0LGE9dm9pZCAwPT09cj9uLmRlZmF1bHRQcm9wcy5kYXRlRm9ybWF0OnIsbz10LmxvY2FsZSxpPXMucHJvcHMuc2hvd1RpbWVJbnB1dHx8cy5wcm9wcy5zaG93VGltZVNlbGVjdD9cIlBQUFBwXCI6XCJQUFBQXCI7cmV0dXJuIGU9cy5wcm9wcy5zZWxlY3RzUmFuZ2U/XCJTZWxlY3RlZCBzdGFydCBkYXRlOiBcIi5jb25jYXQoRWUocy5wcm9wcy5zdGFydERhdGUse2RhdGVGb3JtYXQ6aSxsb2NhbGU6b30pLFwiLiBcIikuY29uY2F0KHMucHJvcHMuZW5kRGF0ZT9cIkVuZCBkYXRlOiBcIitFZShzLnByb3BzLmVuZERhdGUse2RhdGVGb3JtYXQ6aSxsb2NhbGU6b30pOlwiXCIpOnMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5P1wiU2VsZWN0ZWQgdGltZTogXCIuY29uY2F0KEVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6YSxsb2NhbGU6b30pKTpzLnByb3BzLnNob3dZZWFyUGlja2VyP1wiU2VsZWN0ZWQgeWVhcjogXCIuY29uY2F0KEVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6XCJ5eXl5XCIsbG9jYWxlOm99KSk6cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyP1wiU2VsZWN0ZWQgbW9udGg6IFwiLmNvbmNhdChFZShzLnByb3BzLnNlbGVjdGVkLHtkYXRlRm9ybWF0OlwiTU1NTSB5eXl5XCIsbG9jYWxlOm99KSk6cy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXI/XCJTZWxlY3RlZCBxdWFydGVyOiBcIi5jb25jYXQoRWUocy5wcm9wcy5zZWxlY3RlZCx7ZGF0ZUZvcm1hdDpcInl5eXksIFFRUVwiLGxvY2FsZTpvfSkpOlwiU2VsZWN0ZWQgZGF0ZTogXCIuY29uY2F0KEVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6aSxsb2NhbGU6b30pKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse3JvbGU6XCJhbGVydFwiLFwiYXJpYS1saXZlXCI6XCJwb2xpdGVcIixjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19hcmlhLWxpdmVcIn0sZSl9LHMucmVuZGVyRGF0ZUlucHV0PWZ1bmN0aW9uKCl7dmFyIGUsYSxvLGk9dC5jbHN4KHMucHJvcHMuY2xhc3NOYW1lLCgoZT17fSlbWnRdPXMuc3RhdGUub3BlbixlKSksbD1zLnByb3BzLmN1c3RvbUlucHV0fHx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLHt0eXBlOlwidGV4dFwifSksYz1zLnByb3BzLmN1c3RvbUlucHV0UmVmfHxcInJlZlwiLHA9cy5wcm9wcyxkPXAuZGF0ZUZvcm1hdCx1PXZvaWQgMD09PWQ/bi5kZWZhdWx0UHJvcHMuZGF0ZUZvcm1hdDpkLGY9cC5sb2NhbGUsaD1cInN0cmluZ1wiPT10eXBlb2Ygcy5wcm9wcy52YWx1ZT9zLnByb3BzLnZhbHVlOlwic3RyaW5nXCI9PXR5cGVvZiBzLnN0YXRlLmlucHV0VmFsdWU/cy5zdGF0ZS5pbnB1dFZhbHVlOnMucHJvcHMuc2VsZWN0c1JhbmdlP2Z1bmN0aW9uKGUsdCxyKXtpZighZSlyZXR1cm5cIlwiO3ZhciBuPUVlKGUsciksYT10P0VlKHQscik6XCJcIjtyZXR1cm5cIlwiLmNvbmNhdChuLFwiIC0gXCIpLmNvbmNhdChhKX0ocy5wcm9wcy5zdGFydERhdGUscy5wcm9wcy5lbmREYXRlLHtkYXRlRm9ybWF0OnUsbG9jYWxlOmZ9KTpzLnByb3BzLnNlbGVjdHNNdWx0aXBsZT9mdW5jdGlvbihlLHQpe2lmKCEobnVsbD09ZT92b2lkIDA6ZS5sZW5ndGgpKXJldHVyblwiXCI7dmFyIHI9ZVswXT9FZShlWzBdLHQpOlwiXCI7aWYoMT09PWUubGVuZ3RoKXJldHVybiByO2lmKDI9PT1lLmxlbmd0aCYmZVsxXSl7dmFyIG49RWUoZVsxXSx0KTtyZXR1cm5cIlwiLmNvbmNhdChyLFwiLCBcIikuY29uY2F0KG4pfXZhciBhPWUubGVuZ3RoLTE7cmV0dXJuXCJcIi5jb25jYXQocixcIiAoK1wiKS5jb25jYXQoYSxcIilcIil9KG51bGwhPT0obz1zLnByb3BzLnNlbGVjdGVkRGF0ZXMpJiZ2b2lkIDAhPT1vP286W10se2RhdGVGb3JtYXQ6dSxsb2NhbGU6Zn0pOkVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6dSxsb2NhbGU6Zn0pO3JldHVybiByLmNsb25lRWxlbWVudChsLCgoYT17fSlbY109ZnVuY3Rpb24oZSl7cy5pbnB1dD1lfSxhLnZhbHVlPWgsYS5vbkJsdXI9cy5oYW5kbGVCbHVyLGEub25DaGFuZ2U9cy5oYW5kbGVDaGFuZ2UsYS5vbkNsaWNrPXMub25JbnB1dENsaWNrLGEub25Gb2N1cz1zLmhhbmRsZUZvY3VzLGEub25LZXlEb3duPXMub25JbnB1dEtleURvd24sYS5pZD1zLnByb3BzLmlkLGEubmFtZT1zLnByb3BzLm5hbWUsYS5mb3JtPXMucHJvcHMuZm9ybSxhLmF1dG9Gb2N1cz1zLnByb3BzLmF1dG9Gb2N1cyxhLnBsYWNlaG9sZGVyPXMucHJvcHMucGxhY2Vob2xkZXJUZXh0LGEuZGlzYWJsZWQ9cy5wcm9wcy5kaXNhYmxlZCxhLmF1dG9Db21wbGV0ZT1zLnByb3BzLmF1dG9Db21wbGV0ZSxhLmNsYXNzTmFtZT10LmNsc3gobC5wcm9wcy5jbGFzc05hbWUsaSksYS50aXRsZT1zLnByb3BzLnRpdGxlLGEucmVhZE9ubHk9cy5wcm9wcy5yZWFkT25seSxhLnJlcXVpcmVkPXMucHJvcHMucmVxdWlyZWQsYS50YWJJbmRleD1zLnByb3BzLnRhYkluZGV4LGFbXCJhcmlhLWRlc2NyaWJlZGJ5XCJdPXMucHJvcHMuYXJpYURlc2NyaWJlZEJ5LGFbXCJhcmlhLWludmFsaWRcIl09cy5wcm9wcy5hcmlhSW52YWxpZCxhW1wiYXJpYS1sYWJlbGxlZGJ5XCJdPXMucHJvcHMuYXJpYUxhYmVsbGVkQnksYVtcImFyaWEtcmVxdWlyZWRcIl09cy5wcm9wcy5hcmlhUmVxdWlyZWQsYSkpfSxzLnJlbmRlckNsZWFyQnV0dG9uPWZ1bmN0aW9uKCl7dmFyIGU9cy5wcm9wcyxyPWUuaXNDbGVhcmFibGUsbj1lLmRpc2FibGVkLGE9ZS5zZWxlY3RlZCxvPWUuc3RhcnREYXRlLGk9ZS5lbmREYXRlLGw9ZS5jbGVhckJ1dHRvblRpdGxlLGM9ZS5jbGVhckJ1dHRvbkNsYXNzTmFtZSxwPXZvaWQgMD09PWM/XCJcIjpjLGQ9ZS5hcmlhTGFiZWxDbG9zZSx1PXZvaWQgMD09PWQ/XCJDbG9zZVwiOmQsZj1lLnNlbGVjdGVkRGF0ZXM7cmV0dXJuIHImJihudWxsIT1hfHxudWxsIT1vfHxudWxsIT1pfHwobnVsbD09Zj92b2lkIDA6Zi5sZW5ndGgpKT91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIix7dHlwZTpcImJ1dHRvblwiLGNsYXNzTmFtZTp0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uXCIscCx7XCJyZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uLS1kaXNhYmxlZFwiOm59KSxkaXNhYmxlZDpuLFwiYXJpYS1sYWJlbFwiOnUsb25DbGljazpzLm9uQ2xlYXJDbGljayx0aXRsZTpsLHRhYkluZGV4Oi0xfSk6bnVsbH0scy5zdGF0ZT1zLmNhbGNJbml0aWFsU3RhdGUoKSxzLnByZXZlbnRGb2N1c1RpbWVvdXQ9dm9pZCAwLHN9cmV0dXJuIHZlKG4sZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FsbG93U2FtZURheTohMSxkYXRlRm9ybWF0OlwiTU0vZGQveXl5eVwiLGRhdGVGb3JtYXRDYWxlbmRhcjpcIkxMTEwgeXl5eVwiLG9uQ2hhbmdlOmZ1bmN0aW9uKCl7fSxkaXNhYmxlZDohMSxkaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbjohMSxkcm9wZG93bk1vZGU6XCJzY3JvbGxcIixvbkZvY3VzOmZ1bmN0aW9uKCl7fSxvbkJsdXI6ZnVuY3Rpb24oKXt9LG9uS2V5RG93bjpmdW5jdGlvbigpe30sb25JbnB1dENsaWNrOmZ1bmN0aW9uKCl7fSxvblNlbGVjdDpmdW5jdGlvbigpe30sb25DbGlja091dHNpZGU6ZnVuY3Rpb24oKXt9LG9uTW9udGhDaGFuZ2U6ZnVuY3Rpb24oKXt9LG9uQ2FsZW5kYXJPcGVuOmZ1bmN0aW9uKCl7fSxvbkNhbGVuZGFyQ2xvc2U6ZnVuY3Rpb24oKXt9LHByZXZlbnRPcGVuT25Gb2N1czohMSxvblllYXJDaGFuZ2U6ZnVuY3Rpb24oKXt9LG9uSW5wdXRFcnJvcjpmdW5jdGlvbigpe30sbW9udGhzU2hvd246MSxyZWFkT25seTohMSx3aXRoUG9ydGFsOiExLHNlbGVjdHNEaXNhYmxlZERheXNJblJhbmdlOiExLHNob3VsZENsb3NlT25TZWxlY3Q6ITAsc2hvd1RpbWVTZWxlY3Q6ITEsc2hvd1RpbWVJbnB1dDohMSxzaG93UHJldmlvdXNNb250aHM6ITEsc2hvd01vbnRoWWVhclBpY2tlcjohMSxzaG93RnVsbE1vbnRoWWVhclBpY2tlcjohMSxzaG93VHdvQ29sdW1uTW9udGhZZWFyUGlja2VyOiExLHNob3dGb3VyQ29sdW1uTW9udGhZZWFyUGlja2VyOiExLHNob3dZZWFyUGlja2VyOiExLHNob3dRdWFydGVyWWVhclBpY2tlcjohMSxzaG93V2Vla1BpY2tlcjohMSxzdHJpY3RQYXJzaW5nOiExLHN3YXBSYW5nZTohMSx0aW1lSW50ZXJ2YWxzOjMwLHRpbWVDYXB0aW9uOlwiVGltZVwiLHByZXZpb3VzTW9udGhBcmlhTGFiZWw6XCJQcmV2aW91cyBNb250aFwiLHByZXZpb3VzTW9udGhCdXR0b25MYWJlbDpcIlByZXZpb3VzIE1vbnRoXCIsbmV4dE1vbnRoQXJpYUxhYmVsOlwiTmV4dCBNb250aFwiLG5leHRNb250aEJ1dHRvbkxhYmVsOlwiTmV4dCBNb250aFwiLHByZXZpb3VzWWVhckFyaWFMYWJlbDpcIlByZXZpb3VzIFllYXJcIixwcmV2aW91c1llYXJCdXR0b25MYWJlbDpcIlByZXZpb3VzIFllYXJcIixuZXh0WWVhckFyaWFMYWJlbDpcIk5leHQgWWVhclwiLG5leHRZZWFyQnV0dG9uTGFiZWw6XCJOZXh0IFllYXJcIix0aW1lSW5wdXRMYWJlbDpcIlRpbWVcIixlbmFibGVUYWJMb29wOiEwLHllYXJJdGVtTnVtYmVyOlNlLGZvY3VzU2VsZWN0ZWRNb250aDohMSxzaG93UG9wcGVyQXJyb3c6ITAsZXhjbHVkZVNjcm9sbGJhcjohMCxjdXN0b21UaW1lSW5wdXQ6bnVsbCxjYWxlbmRhclN0YXJ0RGF5OnZvaWQgMCx0b2dnbGVDYWxlbmRhck9uSWNvbkNsaWNrOiExLHVzZVBvaW50ZXJFdmVudDohMX19LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLHRoaXMub25TY3JvbGwsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsdGhpcy5zZXRIaWRkZW5TdGF0ZU9uVmlzaWJpbGl0eUhpZGRlbil9LG4ucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihlLHQpe3ZhciByLG4sYSxvLHMsaTtlLmlubGluZSYmKHM9ZS5zZWxlY3RlZCxpPXRoaXMucHJvcHMuc2VsZWN0ZWQscyYmaT9fLmdldE1vbnRoKHMpIT09Xy5nZXRNb250aChpKXx8eC5nZXRZZWFyKHMpIT09eC5nZXRZZWFyKGkpOnMhPT1pKSYmdGhpcy5zZXRQcmVTZWxlY3Rpb24odGhpcy5wcm9wcy5zZWxlY3RlZCksdm9pZCAwIT09dGhpcy5zdGF0ZS5tb250aFNlbGVjdGVkSW4mJmUubW9udGhzU2hvd24hPT10aGlzLnByb3BzLm1vbnRoc1Nob3duJiZ0aGlzLnNldFN0YXRlKHttb250aFNlbGVjdGVkSW46MH0pLGUuaGlnaGxpZ2h0RGF0ZXMhPT10aGlzLnByb3BzLmhpZ2hsaWdodERhdGVzJiZ0aGlzLnNldFN0YXRlKHtoaWdobGlnaHREYXRlczpkdCh0aGlzLnByb3BzLmhpZ2hsaWdodERhdGVzKX0pLHQuZm9jdXNlZHx8V2UoZS5zZWxlY3RlZCx0aGlzLnByb3BzLnNlbGVjdGVkKXx8dGhpcy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZTpudWxsfSksdC5vcGVuIT09dGhpcy5zdGF0ZS5vcGVuJiYoITE9PT10Lm9wZW4mJiEwPT09dGhpcy5zdGF0ZS5vcGVuJiYobnVsbD09PShuPShyPXRoaXMucHJvcHMpLm9uQ2FsZW5kYXJPcGVuKXx8dm9pZCAwPT09bnx8bi5jYWxsKHIpKSwhMD09PXQub3BlbiYmITE9PT10aGlzLnN0YXRlLm9wZW4mJihudWxsPT09KG89KGE9dGhpcy5wcm9wcykub25DYWxlbmRhckNsb3NlKXx8dm9pZCAwPT09b3x8by5jYWxsKGEpKSl9LG4ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5jbGVhclByZXZlbnRGb2N1c1RpbWVvdXQoKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLHRoaXMub25TY3JvbGwsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsdGhpcy5zZXRIaWRkZW5TdGF0ZU9uVmlzaWJpbGl0eUhpZGRlbil9LG4ucHJvdG90eXBlLnJlbmRlcklucHV0Q29udGFpbmVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyxyPWUuc2hvd0ljb24sbj1lLmljb24sYT1lLmNhbGVuZGFySWNvbkNsYXNzbmFtZSxvPWUuY2FsZW5kYXJJY29uQ2xhc3NOYW1lLHM9ZS50b2dnbGVDYWxlbmRhck9uSWNvbkNsaWNrLGk9dGhpcy5zdGF0ZS5vcGVuO3JldHVybiBhJiZjb25zb2xlLndhcm4oXCJjYWxlbmRhckljb25DbGFzc25hbWUgcHJvcHMgaXMgZGVwcmVjYXRlZC4gc2hvdWxkIHVzZSBjYWxlbmRhckljb25DbGFzc05hbWUgcHJvcHMuXCIpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXJcIi5jb25jYXQocj9cIiByZWFjdC1kYXRlcGlja2VyX192aWV3LWNhbGVuZGFyLWljb25cIjpcIlwiKX0sciYmdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGp0LGdlKHtpY29uOm4sY2xhc3NOYW1lOnQuY2xzeChvLCFvJiZhLGkmJlwicmVhY3QtZGF0ZXBpY2tlci1pZ25vcmUtb25jbGlja291dHNpZGVcIil9LHM/e29uQ2xpY2s6dGhpcy50b2dnbGVDYWxlbmRhcn06bnVsbCkpLHRoaXMuc3RhdGUuaXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2UmJnRoaXMucmVuZGVyQXJpYUxpdmVSZWdpb24oKSx0aGlzLnJlbmRlckRhdGVJbnB1dCgpLHRoaXMucmVuZGVyQ2xlYXJCdXR0b24oKSl9LG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVuZGVyQ2FsZW5kYXIoKTtpZih0aGlzLnByb3BzLmlubGluZSlyZXR1cm4gZTtpZih0aGlzLnByb3BzLndpdGhQb3J0YWwpe3ZhciB0PXRoaXMuc3RhdGUub3Blbj91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoenQse2VuYWJsZVRhYkxvb3A6dGhpcy5wcm9wcy5lbmFibGVUYWJMb29wfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsXCIsdGFiSW5kZXg6LTEsb25LZXlEb3duOnRoaXMub25Qb3J0YWxLZXlEb3dufSxlKSk6bnVsbDtyZXR1cm4gdGhpcy5zdGF0ZS5vcGVuJiZ0aGlzLnByb3BzLnBvcnRhbElkJiYodD11ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVXQsZ2Uoe3BvcnRhbElkOnRoaXMucHJvcHMucG9ydGFsSWR9LHRoaXMucHJvcHMpLHQpKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixudWxsLHRoaXMucmVuZGVySW5wdXRDb250YWluZXIoKSx0KX1yZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEp0LGdlKHt9LHRoaXMucHJvcHMse2NsYXNzTmFtZTp0aGlzLnByb3BzLnBvcHBlckNsYXNzTmFtZSxoaWRlUG9wcGVyOiF0aGlzLmlzQ2FsZW5kYXJPcGVuKCksdGFyZ2V0Q29tcG9uZW50OnRoaXMucmVuZGVySW5wdXRDb250YWluZXIoKSxwb3BwZXJDb21wb25lbnQ6ZSxwb3BwZXJPbktleURvd246dGhpcy5vblBvcHBlcktleURvd24sc2hvd0Fycm93OnRoaXMucHJvcHMuc2hvd1BvcHBlckFycm93fSkpfSxufShyLkNvbXBvbmVudCksbnI9XCJpbnB1dFwiLGFyPVwibmF2aWdhdGVcIjtlLkNhbGVuZGFyQ29udGFpbmVyPWtlLGUuZGVmYXVsdD1ycixlLmdldERlZmF1bHRMb2NhbGU9cWUsZS5yZWdpc3RlckxvY2FsZT1mdW5jdGlvbihlLHQpe3ZhciByPXdlKCk7ci5fX2xvY2FsZURhdGFfX3x8KHIuX19sb2NhbGVEYXRhX189e30pLHIuX19sb2NhbGVEYXRhX19bZV09dH0sZS5zZXREZWZhdWx0TG9jYWxlPWZ1bmN0aW9uKGUpe3dlKCkuX19sb2NhbGVJZF9fPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZExlYWRpbmdaZXJvcyA9IGFkZExlYWRpbmdaZXJvcztcbmZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvcyhudW1iZXIsIHRhcmdldExlbmd0aCkge1xuICBjb25zdCBzaWduID0gbnVtYmVyIDwgMCA/IFwiLVwiIDogXCJcIjtcbiAgY29uc3Qgb3V0cHV0ID0gTWF0aC5hYnMobnVtYmVyKS50b1N0cmluZygpLnBhZFN0YXJ0KHRhcmdldExlbmd0aCwgXCIwXCIpO1xuICByZXR1cm4gc2lnbiArIG91dHB1dDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVmYXVsdExvY2FsZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfaW5kZXguZW5VUztcbiAgfSxcbn0pO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi9sb2NhbGUvZW4tVVMuanNcIik7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0RGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucztcbmV4cG9ydHMuc2V0RGVmYXVsdE9wdGlvbnMgPSBzZXREZWZhdWx0T3B0aW9ucztcblxubGV0IGRlZmF1bHRPcHRpb25zID0ge307XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkge1xuICByZXR1cm4gZGVmYXVsdE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHNldERlZmF1bHRPcHRpb25zKG5ld09wdGlvbnMpIHtcbiAgZGVmYXVsdE9wdGlvbnMgPSBuZXdPcHRpb25zO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmZvcm1hdHRlcnMgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uL2dldERheU9mWWVhci5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uL2dldElTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuLi8uLi9nZXRJU09XZWVrWWVhci5qc1wiKTtcbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4uLy4uL2dldFdlZWsuanNcIik7XG52YXIgX2luZGV4NSA9IHJlcXVpcmUoXCIuLi8uLi9nZXRXZWVrWWVhci5qc1wiKTtcblxudmFyIF9pbmRleDYgPSByZXF1aXJlKFwiLi4vYWRkTGVhZGluZ1plcm9zLmpzXCIpO1xudmFyIF9pbmRleDcgPSByZXF1aXJlKFwiLi9saWdodEZvcm1hdHRlcnMuanNcIik7XG5cbmNvbnN0IGRheVBlcmlvZEVudW0gPSB7XG4gIGFtOiBcImFtXCIsXG4gIHBtOiBcInBtXCIsXG4gIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gIG5vb246IFwibm9vblwiLFxuICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgYWZ0ZXJub29uOiBcImFmdGVybm9vblwiLFxuICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgbmlnaHQ6IFwibmlnaHRcIixcbn07XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8IE1pbGxpc2Vjb25kcyBpbiBkYXkgICAgICAgICAgICB8XG4gKiB8ICBiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICB8ICBCICB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICB8XG4gKiB8ICBjICB8IFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrICB8ICBDKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBlICB8IExvY2FsIGRheSBvZiB3ZWVrICAgICAgICAgICAgICB8ICBFICB8IERheSBvZiB3ZWVrICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBmICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBGKiB8IERheSBvZiB3ZWVrIGluIG1vbnRoICAgICAgICAgICB8XG4gKiB8ICBnKiB8IE1vZGlmaWVkIEp1bGlhbiBkYXkgICAgICAgICAgICB8ICBHICB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBpISB8IElTTyBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgICB8ICBJISB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICB8XG4gKiB8ICBqKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8ICBKKiB8IExvY2FsaXplZCBob3VyIHcvbyBkYXkgcGVyaW9kICB8XG4gKiB8ICBrICB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICB8ICBLICB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBsKiB8IChkZXByZWNhdGVkKSAgICAgICAgICAgICAgICAgICB8ICBMICB8IFN0YW5kLWFsb25lIG1vbnRoICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBuICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBOICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBvISB8IE9yZGluYWwgbnVtYmVyIG1vZGlmaWVyICAgICAgICB8ICBPICB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICB8XG4gKiB8ICBwISB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICB8ICBQISB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICB8XG4gKiB8ICBxICB8IFN0YW5kLWFsb25lIHF1YXJ0ZXIgICAgICAgICAgICB8ICBRICB8IFF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICByKiB8IFJlbGF0ZWQgR3JlZ29yaWFuIHllYXIgICAgICAgICB8ICBSISB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB0ISB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICB8ICBUISB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICB8XG4gKiB8ICB1ICB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICB8ICBVKiB8IEN5Y2xpYyB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICB2KiB8IFRpbWV6b25lIChnZW5lcmljIG5vbi1sb2NhdC4pICB8ICBWKiB8IFRpbWV6b25lIChsb2NhdGlvbikgICAgICAgICAgICB8XG4gKiB8ICB3ICB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICB8ICBXKiB8IFdlZWsgb2YgbW9udGggICAgICAgICAgICAgICAgICB8XG4gKiB8ICB4ICB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICB8ICBYICB8IFRpbWV6b25lIChJU08tODYwMSkgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICB8XG4gKiB8ICB6ICB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSB8ICBaKiB8IFRpbWV6b25lIChhbGlhc2VzKSAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICEgYXJlIG5vbi1zdGFuZGFyZCwgYnV0IGltcGxlbWVudGVkIGJ5IGRhdGUtZm5zOlxuICogLSBgb2AgbW9kaWZpZXMgdGhlIHByZXZpb3VzIHRva2VuIHRvIHR1cm4gaXQgaW50byBhbiBvcmRpbmFsIChzZWUgYGZvcm1hdGAgZG9jcylcbiAqIC0gYGlgIGlzIElTTyBkYXkgb2Ygd2Vlay4gRm9yIGBpYCBhbmQgYGlpYCBpcyByZXR1cm5zIG51bWVyaWMgSVNPIHdlZWsgZGF5cyxcbiAqICAgaS5lLiA3IGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICogLSBgSWAgaXMgSVNPIHdlZWsgb2YgeWVhciwgYXMgb3Bwb3NlZCB0byBgd2Agd2hpY2ggaXMgbG9jYWwgd2VlayBvZiB5ZWFyLlxuICogLSBgUmAgaXMgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIsIGFzIG9wcG9zZWQgdG8gYFlgIHdoaWNoIGlzIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiAgIGBSYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYElgIGFuZCBgaWBcbiAqICAgZm9yIHVuaXZlcnNhbCBJU08gd2Vlay1udW1iZXJpbmcgZGF0ZSwgd2hlcmVhc1xuICogICBgWWAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB3YCBhbmQgYGVgXG4gKiAgIGZvciB3ZWVrLW51bWJlcmluZyBkYXRlIHNwZWNpZmljIHRvIHRoZSBsb2NhbGUuXG4gKiAtIGBQYCBpcyBsb25nIGxvY2FsaXplZCBkYXRlIGZvcm1hdFxuICogLSBgcGAgaXMgbG9uZyBsb2NhbGl6ZWQgdGltZSBmb3JtYXRcbiAqL1xuXG5jb25zdCBmb3JtYXR0ZXJzID0gKGV4cG9ydHMuZm9ybWF0dGVycyA9IHtcbiAgLy8gRXJhXG4gIEc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBlcmEgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPiAwID8gMSA6IDA7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gQUQsIEJDXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICBjYXNlIFwiR0dHXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcImFiYnJldmlhdGVkXCIgfSk7XG4gICAgICAvLyBBLCBCXG4gICAgICBjYXNlIFwiR0dHR0dcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwibmFycm93XCIgfSk7XG4gICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdFxuICAgICAgY2FzZSBcIkdHR0dcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcIndpZGVcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gWWVhclxuICB5OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgLy8gT3JkaW5hbCBudW1iZXJcbiAgICBpZiAodG9rZW4gPT09IFwieW9cIikge1xuICAgICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgICBjb25zdCB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6IFwieWVhclwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy55KGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gIFk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzaWduZWRXZWVrWWVhciA9ICgwLCBfaW5kZXg1LmdldFdlZWtZZWFyKShkYXRlLCBvcHRpb25zKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHdlZWtZZWFyID0gc2lnbmVkV2Vla1llYXIgPiAwID8gc2lnbmVkV2Vla1llYXIgOiAxIC0gc2lnbmVkV2Vla1llYXI7XG5cbiAgICAvLyBUd28gZGlnaXQgeWVhclxuICAgIGlmICh0b2tlbiA9PT0gXCJZWVwiKSB7XG4gICAgICBjb25zdCB0d29EaWdpdFllYXIgPSB3ZWVrWWVhciAlIDEwMDtcbiAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHR3b0RpZ2l0WWVhciwgMik7XG4gICAgfVxuXG4gICAgLy8gT3JkaW5hbCBudW1iZXJcbiAgICBpZiAodG9rZW4gPT09IFwiWW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIod2Vla1llYXIsIHsgdW5pdDogXCJ5ZWFyXCIgfSk7XG4gICAgfVxuXG4gICAgLy8gUGFkZGluZ1xuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHdlZWtZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gIFI6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IGlzb1dlZWtZZWFyID0gKDAsIF9pbmRleDMuZ2V0SVNPV2Vla1llYXIpKGRhdGUpO1xuXG4gICAgLy8gUGFkZGluZ1xuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGlzb1dlZWtZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEV4dGVuZGVkIHllYXIuIFRoaXMgaXMgYSBzaW5nbGUgbnVtYmVyIGRlc2lnbmF0aW5nIHRoZSB5ZWFyIG9mIHRoaXMgY2FsZW5kYXIgc3lzdGVtLlxuICAvLyBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gYHlgIGFuZCBgdWAgbG9jYWxpemVycyBhcmUgQi5DLiB5ZWFyczpcbiAgLy8gfCBZZWFyIHwgYHlgIHwgYHVgIHxcbiAgLy8gfC0tLS0tLXwtLS0tLXwtLS0tLXxcbiAgLy8gfCBBQyAxIHwgICAxIHwgICAxIHxcbiAgLy8gfCBCQyAxIHwgICAxIHwgICAwIHxcbiAgLy8gfCBCQyAyIHwgICAyIHwgIC0xIHxcbiAgLy8gQWxzbyBgeXlgIGFsd2F5cyByZXR1cm5zIHRoZSBsYXN0IHR3byBkaWdpdHMgb2YgYSB5ZWFyLFxuICAvLyB3aGlsZSBgdXVgIHBhZHMgc2luZ2xlIGRpZ2l0IHllYXJzIHRvIDIgY2hhcmFjdGVycyBhbmQgcmV0dXJucyBvdGhlciB5ZWFycyB1bmNoYW5nZWQuXG4gIHU6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoeWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBRdWFydGVyXG4gIFE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJRXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSBcIlFRXCI6XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwiUW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwiUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcIlFRUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcIlFRUVFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyXG4gIHE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwicW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwicXFxXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcInFxcXFxXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcInFxcXFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBNb250aFxuICBNOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgIGNhc2UgXCJNTVwiOlxuICAgICAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMuTShkYXRlLCB0b2tlbik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIG1vbnRoXG4gIEw6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShtb250aCArIDEsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aFxuICAgICAgY2FzZSBcIkxvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKG1vbnRoICsgMSwgeyB1bml0OiBcIm1vbnRoXCIgfSk7XG4gICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWNcbiAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKLCBGLCAuLi4sIERcbiAgICAgIGNhc2UgXCJMTExMTFwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlclxuICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBMb2NhbCB3ZWVrIG9mIHllYXJcbiAgdzogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHdlZWsgPSAoMCwgX2luZGV4NC5nZXRXZWVrKShkYXRlLCBvcHRpb25zKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJ3b1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrLCB7IHVuaXQ6IFwid2Vla1wiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHdlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSVNPIHdlZWsgb2YgeWVhclxuICBJOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaXNvV2VlayA9ICgwLCBfaW5kZXgyLmdldElTT1dlZWspKGRhdGUpO1xuXG4gICAgaWYgKHRva2VuID09PSBcIklvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGlzb1dlZWssIHsgdW5pdDogXCJ3ZWVrXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoaXNvV2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwiZG9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXREYXRlKCksIHsgdW5pdDogXCJkYXRlXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLmQoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIERheSBvZiB5ZWFyXG4gIEQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBkYXlPZlllYXIgPSAoMCwgX2luZGV4LmdldERheU9mWWVhcikoZGF0ZSk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwiRG9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF5T2ZZZWFyLCB7IHVuaXQ6IFwiZGF5T2ZZZWFyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoZGF5T2ZZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIERheSBvZiB3ZWVrXG4gIEU6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJFRVwiOlxuICAgICAgY2FzZSBcIkVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcIkVFRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJFRUVFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJFRUVFXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIExvY2FsIGRheSBvZiB3ZWVrXG4gIGU6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChOdGggZGF5IG9mIHdlZWsgd2l0aCBjdXJyZW50IGxvY2FsZSBvciB3ZWVrU3RhcnRzT24pXG4gICAgICBjYXNlIFwiZVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGxvY2FsRGF5T2ZXZWVrKTtcbiAgICAgIC8vIFBhZGRlZCBudW1lcmljYWwgdmFsdWVcbiAgICAgIGNhc2UgXCJlZVwiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShsb2NhbERheU9mV2VlaywgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJlb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImVlZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJlZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJlZWVlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrXG4gIGM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChzYW1lIGFzIGluIGBlYClcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuICAgICAgY2FzZSBcImNjXCI6XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGxvY2FsRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoXG4gICAgICBjYXNlIFwiY29cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobG9jYWxEYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJjY2NjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiY2NjY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBJU08gZGF5IG9mIHdlZWtcbiAgaTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7XG4gICAgY29uc3QgaXNvRGF5T2ZXZWVrID0gZGF5T2ZXZWVrID09PSAwID8gNyA6IGRheU9mV2VlaztcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAyXG4gICAgICBjYXNlIFwiaVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGlzb0RheU9mV2Vlayk7XG4gICAgICAvLyAwMlxuICAgICAgY2FzZSBcImlpXCI6XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGlzb0RheU9mV2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgICAgIC8vIDJuZFxuICAgICAgY2FzZSBcImlvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGlzb0RheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImlpaWlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImlpaWlcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQU0gb3IgUE1cbiAgYTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGNvbnN0IGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICBjYXNlIFwiYWFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplXG4gICAgICAgICAgLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY2FzZSBcImFhYWFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcImFhYWFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQU0sIFBNLCBtaWRuaWdodCwgbm9vblxuICBiOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgbGV0IGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICBpZiAoaG91cnMgPT09IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA9PT0gMCkge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5taWRuaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gaG91cnMgLyAxMiA+PSAxID8gXCJwbVwiIDogXCJhbVwiO1xuICAgIH1cblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJiXCI6XG4gICAgICBjYXNlIFwiYmJcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplXG4gICAgICAgICAgLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY2FzZSBcImJiYmJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcImJiYmJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gaW4gdGhlIG1vcm5pbmcsIGluIHRoZSBhZnRlcm5vb24sIGluIHRoZSBldmVuaW5nLCBhdCBuaWdodFxuICBCOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgbGV0IGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICBpZiAoaG91cnMgPj0gMTcpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0uZXZlbmluZztcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmFmdGVybm9vbjtcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDQpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubW9ybmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5uaWdodDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiQlwiOlxuICAgICAgY2FzZSBcIkJCXCI6XG4gICAgICBjYXNlIFwiQkJCXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiQkJCQkJcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiQkJCQlwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBIb3VyIFsxLTEyXVxuICBoOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcImhvXCIpIHtcbiAgICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyO1xuICAgICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDEyO1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLmgoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIEhvdXIgWzAtMjNdXG4gIEg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwiSG9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRIb3VycygpLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5IKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTExXVxuICBLOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJLb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShob3VycywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBIb3VyIFsxLTI0XVxuICBrOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgbGV0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAyNDtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJrb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShob3VycywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaW51dGVcbiAgbTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJtb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldE1pbnV0ZXMoKSwgeyB1bml0OiBcIm1pbnV0ZVwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5tKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBTZWNvbmRcbiAgczogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJzb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldFNlY29uZHMoKSwgeyB1bml0OiBcInNlY29uZFwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLlMoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBhbHdheXMgYCdaJ2ApXG4gIFg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBpZiAodGltZXpvbmVPZmZzZXQgPT09IDApIHtcbiAgICAgIHJldHVybiBcIlpcIjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlc1xuICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYYFxuICAgICAgY2FzZSBcIlhYWFhcIjpcbiAgICAgIGNhc2UgXCJYWFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTtcblxuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgWFhYYFxuICAgICAgY2FzZSBcIlhYWFhYXCI6XG4gICAgICBjYXNlIFwiWFhYXCI6IC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBgJyswMDowMCdgIG9yIGVxdWl2YWxlbnQpXG4gIHg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlc1xuICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4YFxuICAgICAgY2FzZSBcInh4eHhcIjpcbiAgICAgIGNhc2UgXCJ4eFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTtcblxuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHh4YFxuICAgICAgY2FzZSBcInh4eHh4XCI6XG4gICAgICBjYXNlIFwieHh4XCI6IC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRpbWV6b25lIChHTVQpXG4gIE86IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBTaG9ydFxuICAgICAgY2FzZSBcIk9cIjpcbiAgICAgIGNhc2UgXCJPT1wiOlxuICAgICAgY2FzZSBcIk9PT1wiOlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lU2hvcnQodGltZXpvbmVPZmZzZXQsIFwiOlwiKTtcbiAgICAgIC8vIExvbmdcbiAgICAgIGNhc2UgXCJPT09PXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXRpb24pXG4gIHo6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBTaG9ydFxuICAgICAgY2FzZSBcInpcIjpcbiAgICAgIGNhc2UgXCJ6elwiOlxuICAgICAgY2FzZSBcInp6elwiOlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lU2hvcnQodGltZXpvbmVPZmZzZXQsIFwiOlwiKTtcbiAgICAgIC8vIExvbmdcbiAgICAgIGNhc2UgXCJ6enp6XCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFNlY29uZHMgdGltZXN0YW1wXG4gIHQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gTWF0aC50cnVuYyhkYXRlLmdldFRpbWUoKSAvIDEwMDApO1xuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gIFQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gZGF0ZS5nZXRUaW1lKCk7XG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykodGltZXN0YW1wLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxufSk7XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSBcIlwiKSB7XG4gIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTtcbiAgY29uc3QgbWludXRlcyA9IGFic09mZnNldCAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHNpZ24gKyBTdHJpbmcoaG91cnMpICsgZGVsaW1pdGVyICsgKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShtaW51dGVzLCAyKVxuICApO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXMob2Zmc2V0LCBkZWxpbWl0ZXIpIHtcbiAgaWYgKG9mZnNldCAlIDYwID09PSAwKSB7XG4gICAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICAgIHJldHVybiBzaWduICsgKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShNYXRoLmFicyhvZmZzZXQpIC8gNjAsIDIpO1xuICB9XG4gIHJldHVybiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRlbGltaXRlcik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGVsaW1pdGVyID0gXCJcIikge1xuICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gIGNvbnN0IGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7XG4gIGNvbnN0IGhvdXJzID0gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKSwgMik7XG4gIGNvbnN0IG1pbnV0ZXMgPSAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGFic09mZnNldCAlIDYwLCAyKTtcbiAgcmV0dXJuIHNpZ24gKyBob3VycyArIGRlbGltaXRlciArIG1pbnV0ZXM7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMubGlnaHRGb3JtYXR0ZXJzID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi9hZGRMZWFkaW5nWmVyb3MuanNcIik7XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICovXG5cbmNvbnN0IGxpZ2h0Rm9ybWF0dGVycyA9IChleHBvcnRzLmxpZ2h0Rm9ybWF0dGVycyA9IHtcbiAgLy8gWWVhclxuICB5KGRhdGUsIHRva2VuKSB7XG4gICAgLy8gRnJvbSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LTMxL3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0Zvcm1hdF90b2tlbnNcbiAgICAvLyB8IFllYXIgICAgIHwgICAgIHkgfCB5eSB8ICAgeXl5IHwgIHl5eXkgfCB5eXl5eSB8XG4gICAgLy8gfC0tLS0tLS0tLS18LS0tLS0tLXwtLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfFxuICAgIC8vIHwgQUQgMSAgICAgfCAgICAgMSB8IDAxIHwgICAwMDEgfCAgMDAwMSB8IDAwMDAxIHxcbiAgICAvLyB8IEFEIDEyICAgIHwgICAgMTIgfCAxMiB8ICAgMDEyIHwgIDAwMTIgfCAwMDAxMiB8XG4gICAgLy8gfCBBRCAxMjMgICB8ICAgMTIzIHwgMjMgfCAgIDEyMyB8ICAwMTIzIHwgMDAxMjMgfFxuICAgIC8vIHwgQUQgMTIzNCAgfCAgMTIzNCB8IDM0IHwgIDEyMzQgfCAgMTIzNCB8IDAxMjM0IHxcbiAgICAvLyB8IEFEIDEyMzQ1IHwgMTIzNDUgfCA0NSB8IDEyMzQ1IHwgMTIzNDUgfCAxMjM0NSB8XG5cbiAgICBjb25zdCBzaWduZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgY29uc3QgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyO1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoXG4gICAgICB0b2tlbiA9PT0gXCJ5eVwiID8geWVhciAlIDEwMCA6IHllYXIsXG4gICAgICB0b2tlbi5sZW5ndGgsXG4gICAgKTtcbiAgfSxcblxuICAvLyBNb250aFxuICBNKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgcmV0dXJuIHRva2VuID09PSBcIk1cIlxuICAgICAgPyBTdHJpbmcobW9udGggKyAxKVxuICAgICAgOiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykobW9udGggKyAxLCAyKTtcbiAgfSxcblxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKGRhdGUuZ2V0RGF0ZSgpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGEoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXRlLmdldEhvdXJzKCkgLyAxMiA+PSAxID8gXCJwbVwiIDogXCJhbVwiO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImFcIjpcbiAgICAgIGNhc2UgXCJhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgICBjYXNlIFwiYWFhYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZVswXTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlID09PSBcImFtXCIgPyBcImEubS5cIiA6IFwicC5tLlwiO1xuICAgIH1cbiAgfSxcblxuICAvLyBIb3VyIFsxLTEyXVxuICBoKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShcbiAgICAgIGRhdGUuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLFxuICAgICAgdG9rZW4ubGVuZ3RoLFxuICAgICk7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoZGF0ZS5nZXRIb3VycygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1pbnV0ZVxuICBtKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShkYXRlLmdldE1pbnV0ZXMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBTZWNvbmRcbiAgcyhkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoZGF0ZS5nZXRTZWNvbmRzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFMoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBudW1iZXJPZkRpZ2l0cyA9IHRva2VuLmxlbmd0aDtcbiAgICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYyhcbiAgICAgIG1pbGxpc2Vjb25kcyAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpLFxuICAgICk7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShmcmFjdGlvbmFsU2Vjb25kcywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmxvbmdGb3JtYXR0ZXJzID0gdm9pZCAwO1xuXG5jb25zdCBkYXRlTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgXCJQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICBjYXNlIFwiUFBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICBjYXNlIFwiUFBQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgIGNhc2UgXCJQUFBQXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gIH1cbn07XG5cbmNvbnN0IHRpbWVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcpID0+IHtcbiAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgY2FzZSBcInBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJzaG9ydFwiIH0pO1xuICAgIGNhc2UgXCJwcFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgIGNhc2UgXCJwcHBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJsb25nXCIgfSk7XG4gICAgY2FzZSBcInBwcHBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcImZ1bGxcIiB9KTtcbiAgfVxufTtcblxuY29uc3QgZGF0ZVRpbWVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcpID0+IHtcbiAgY29uc3QgbWF0Y2hSZXN1bHQgPSBwYXR0ZXJuLm1hdGNoKC8oUCspKHArKT8vKSB8fCBbXTtcbiAgY29uc3QgZGF0ZVBhdHRlcm4gPSBtYXRjaFJlc3VsdFsxXTtcbiAgY29uc3QgdGltZVBhdHRlcm4gPSBtYXRjaFJlc3VsdFsyXTtcblxuICBpZiAoIXRpbWVQYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpO1xuICB9XG5cbiAgbGV0IGRhdGVUaW1lRm9ybWF0O1xuXG4gIHN3aXRjaCAoZGF0ZVBhdHRlcm4pIHtcbiAgICBjYXNlIFwiUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBQXCI6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJsb25nXCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBQUFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBkYXRlVGltZUZvcm1hdFxuICAgIC5yZXBsYWNlKFwie3tkYXRlfX1cIiwgZGF0ZUxvbmdGb3JtYXR0ZXIoZGF0ZVBhdHRlcm4sIGZvcm1hdExvbmcpKVxuICAgIC5yZXBsYWNlKFwie3t0aW1lfX1cIiwgdGltZUxvbmdGb3JtYXR0ZXIodGltZVBhdHRlcm4sIGZvcm1hdExvbmcpKTtcbn07XG5cbmNvbnN0IGxvbmdGb3JtYXR0ZXJzID0gKGV4cG9ydHMubG9uZ0Zvcm1hdHRlcnMgPSB7XG4gIHA6IHRpbWVMb25nRm9ybWF0dGVyLFxuICBQOiBkYXRlVGltZUxvbmdGb3JtYXR0ZXIsXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzID0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEdvb2dsZSBDaHJvbWUgYXMgb2YgNjcuMC4zMzk2Ljg3IGludHJvZHVjZWQgdGltZXpvbmVzIHdpdGggb2Zmc2V0IHRoYXQgaW5jbHVkZXMgc2Vjb25kcy5cbiAqIFRoZXkgdXN1YWxseSBhcHBlYXIgZm9yIGRhdGVzIHRoYXQgZGVub3RlIHRpbWUgYmVmb3JlIHRoZSB0aW1lem9uZXMgd2VyZSBpbnRyb2R1Y2VkXG4gKiAoZS5nLiBmb3IgJ0V1cm9wZS9QcmFndWUnIHRpbWV6b25lIHRoZSBvZmZzZXQgaXMgR01UKzAwOjU3OjQ0IGJlZm9yZSAxIE9jdG9iZXIgMTg5MVxuICogYW5kIEdNVCswMTowMDowMCBhZnRlciB0aGF0IGRhdGUpXG4gKlxuICogRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIHRoZSBvZmZzZXQgaW4gbWludXRlcyBhbmQgd291bGQgcmV0dXJuIDU3IGZvciB0aGUgZXhhbXBsZSBhYm92ZSxcbiAqIHdoaWNoIHdvdWxkIGxlYWQgdG8gaW5jb3JyZWN0IGNhbGN1bGF0aW9ucy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRpbWV6b25lIG9mZnNldCBpbiBtaWxsaXNlY29uZHMgdGhhdCB0YWtlcyBzZWNvbmRzIGluIGFjY291bnQuXG4gKi9cbmZ1bmN0aW9uIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgdXRjRGF0ZSA9IG5ldyBEYXRlKFxuICAgIERhdGUuVVRDKFxuICAgICAgX2RhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIF9kYXRlLmdldE1vbnRoKCksXG4gICAgICBfZGF0ZS5nZXREYXRlKCksXG4gICAgICBfZGF0ZS5nZXRIb3VycygpLFxuICAgICAgX2RhdGUuZ2V0TWludXRlcygpLFxuICAgICAgX2RhdGUuZ2V0U2Vjb25kcygpLFxuICAgICAgX2RhdGUuZ2V0TWlsbGlzZWNvbmRzKCksXG4gICAgKSxcbiAgKTtcbiAgdXRjRGF0ZS5zZXRVVENGdWxsWWVhcihfZGF0ZS5nZXRGdWxsWWVhcigpKTtcbiAgcmV0dXJuICtkYXRlIC0gK3V0Y0RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbiA9IGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW47XG5leHBvcnRzLmlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbiA9IGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbjtcbmV4cG9ydHMud2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvciA9IHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3I7XG5jb25zdCBkYXlPZlllYXJUb2tlblJFID0gL15EKyQvO1xuY29uc3Qgd2Vla1llYXJUb2tlblJFID0gL15ZKyQvO1xuXG5jb25zdCB0aHJvd1Rva2VucyA9IFtcIkRcIiwgXCJERFwiLCBcIllZXCIsIFwiWVlZWVwiXTtcblxuZnVuY3Rpb24gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gZGF5T2ZZZWFyVG9rZW5SRS50ZXN0KHRva2VuKTtcbn1cblxuZnVuY3Rpb24gaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKHRva2VuKSB7XG4gIHJldHVybiB3ZWVrWWVhclRva2VuUkUudGVzdCh0b2tlbik7XG59XG5cbmZ1bmN0aW9uIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdCwgaW5wdXQpIHtcbiAgY29uc3QgX21lc3NhZ2UgPSBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KTtcbiAgY29uc29sZS53YXJuKF9tZXNzYWdlKTtcbiAgaWYgKHRocm93VG9rZW5zLmluY2x1ZGVzKHRva2VuKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoX21lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGNvbnN0IHN1YmplY3QgPSB0b2tlblswXSA9PT0gXCJZXCIgPyBcInllYXJzXCIgOiBcImRheXMgb2YgdGhlIG1vbnRoXCI7XG4gIHJldHVybiBgVXNlIFxcYCR7dG9rZW4udG9Mb3dlckNhc2UoKX1cXGAgaW5zdGVhZCBvZiBcXGAke3Rva2VufVxcYCAoaW4gXFxgJHtmb3JtYXR9XFxgKSBmb3IgZm9ybWF0dGluZyAke3N1YmplY3R9IHRvIHRoZSBpbnB1dCBcXGAke2lucHV0fVxcYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kYDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGREYXlzID0gYWRkRGF5cztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkRGF5c1xuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgZGF5cyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5cyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMTAgZGF5cyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkRGF5cyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMTApXG4gKiAvLz0+IFRodSBTZXAgMTEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBhZGREYXlzKGRhdGUsIGFtb3VudCkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgaWYgKGlzTmFOKGFtb3VudCkpIHJldHVybiAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCBOYU4pO1xuICBpZiAoIWFtb3VudCkge1xuICAgIC8vIElmIDAgZGF5cywgbm8tb3AgdG8gYXZvaWQgY2hhbmdpbmcgdGltZXMgaW4gdGhlIGhvdXIgYmVmb3JlIGVuZCBvZiBEU1RcbiAgICByZXR1cm4gX2RhdGU7XG4gIH1cbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBhbW91bnQpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkSG91cnMgPSBhZGRIb3VycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRNaWxsaXNlY29uZHMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRIb3Vyc1xuICogQGNhdGVnb3J5IEhvdXIgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgaG91cnMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGhvdXJzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAyIGhvdXJzIHRvIDEwIEp1bHkgMjAxNCAyMzowMDowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZEhvdXJzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAyMywgMCksIDIpXG4gKiAvLz0+IEZyaSBKdWwgMTEgMjAxNCAwMTowMDowMFxuICovXG5mdW5jdGlvbiBhZGRIb3VycyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkTWlsbGlzZWNvbmRzKShkYXRlLCBhbW91bnQgKiBfaW5kZXgyLm1pbGxpc2Vjb25kc0luSG91cik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkTWlsbGlzZWNvbmRzID0gYWRkTWlsbGlzZWNvbmRzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRNaWxsaXNlY29uZHNcbiAqIEBjYXRlZ29yeSBNaWxsaXNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbWlsbGlzZWNvbmRzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA3NTAgbWlsbGlzZWNvbmRzIHRvIDEwIEp1bHkgMjAxNCAxMjo0NTozMC4wMDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRNaWxsaXNlY29uZHMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCA0NSwgMzAsIDApLCA3NTApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjo0NTozMC43NTBcbiAqL1xuZnVuY3Rpb24gYWRkTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCkge1xuICBjb25zdCB0aW1lc3RhbXAgPSArKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICByZXR1cm4gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgdGltZXN0YW1wICsgYW1vdW50KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRNaW51dGVzID0gYWRkTWludXRlcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRNaWxsaXNlY29uZHMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRNaW51dGVzXG4gKiBAY2F0ZWdvcnkgTWludXRlIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaW51dGVzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbnV0ZXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBtaW51dGVzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaW51dGVzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAzMCBtaW51dGVzIHRvIDEwIEp1bHkgMjAxNCAxMjowMDowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1pbnV0ZXMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCAwKSwgMzApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjozMDowMFxuICovXG5mdW5jdGlvbiBhZGRNaW51dGVzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRNaWxsaXNlY29uZHMpKFxuICAgIGRhdGUsXG4gICAgYW1vdW50ICogX2luZGV4Mi5taWxsaXNlY29uZHNJbk1pbnV0ZSxcbiAgKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRNb250aHMgPSBhZGRNb250aHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZE1vbnRoc1xuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtb250aHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbW9udGhzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgbW9udGhzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtb250aHMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDUgbW9udGhzIHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRNb250aHMobmV3IERhdGUoMjAxNCwgOCwgMSksIDUpXG4gKiAvLz0+IFN1biBGZWIgMDEgMjAxNSAwMDowMDowMFxuICpcbiAqIC8vIEFkZCBvbmUgbW9udGggdG8gMzAgSmFudWFyeSAyMDIzOlxuICogY29uc3QgcmVzdWx0ID0gYWRkTW9udGhzKG5ldyBEYXRlKDIwMjMsIDAsIDMwKSwgMSlcbiAqIC8vPT4gVHVlIEZlYiAyOCAyMDIzIDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIGFkZE1vbnRocyhkYXRlLCBhbW91bnQpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGlmIChpc05hTihhbW91bnQpKSByZXR1cm4gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgTmFOKTtcbiAgaWYgKCFhbW91bnQpIHtcbiAgICAvLyBJZiAwIG1vbnRocywgbm8tb3AgdG8gYXZvaWQgY2hhbmdpbmcgdGltZXMgaW4gdGhlIGhvdXIgYmVmb3JlIGVuZCBvZiBEU1RcbiAgICByZXR1cm4gX2RhdGU7XG4gIH1cbiAgY29uc3QgZGF5T2ZNb250aCA9IF9kYXRlLmdldERhdGUoKTtcblxuICAvLyBUaGUgSlMgRGF0ZSBvYmplY3Qgc3VwcG9ydHMgZGF0ZSBtYXRoIGJ5IGFjY2VwdGluZyBvdXQtb2YtYm91bmRzIHZhbHVlcyBmb3JcbiAgLy8gbW9udGgsIGRheSwgZXRjLiBGb3IgZXhhbXBsZSwgbmV3IERhdGUoMjAyMCwgMCwgMCkgcmV0dXJucyAzMSBEZWMgMjAxOSBhbmRcbiAgLy8gbmV3IERhdGUoMjAyMCwgMTMsIDEpIHJldHVybnMgMSBGZWIgMjAyMS4gIFRoaXMgaXMgKmFsbW9zdCogdGhlIGJlaGF2aW9yIHdlXG4gIC8vIHdhbnQgZXhjZXB0IHRoYXQgZGF0ZXMgd2lsbCB3cmFwIGFyb3VuZCB0aGUgZW5kIG9mIGEgbW9udGgsIG1lYW5pbmcgdGhhdFxuICAvLyBuZXcgRGF0ZSgyMDIwLCAxMywgMzEpIHdpbGwgcmV0dXJuIDMgTWFyIDIwMjEgbm90IDI4IEZlYiAyMDIxIGFzIGRlc2lyZWQuIFNvXG4gIC8vIHdlJ2xsIGRlZmF1bHQgdG8gdGhlIGVuZCBvZiB0aGUgZGVzaXJlZCBtb250aCBieSBhZGRpbmcgMSB0byB0aGUgZGVzaXJlZFxuICAvLyBtb250aCBhbmQgdXNpbmcgYSBkYXRlIG9mIDAgdG8gYmFjayB1cCBvbmUgZGF5IHRvIHRoZSBlbmQgb2YgdGhlIGRlc2lyZWRcbiAgLy8gbW9udGguXG4gIGNvbnN0IGVuZE9mRGVzaXJlZE1vbnRoID0gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgX2RhdGUuZ2V0VGltZSgpKTtcbiAgZW5kT2ZEZXNpcmVkTW9udGguc2V0TW9udGgoX2RhdGUuZ2V0TW9udGgoKSArIGFtb3VudCArIDEsIDApO1xuICBjb25zdCBkYXlzSW5Nb250aCA9IGVuZE9mRGVzaXJlZE1vbnRoLmdldERhdGUoKTtcbiAgaWYgKGRheU9mTW9udGggPj0gZGF5c0luTW9udGgpIHtcbiAgICAvLyBJZiB3ZSdyZSBhbHJlYWR5IGF0IHRoZSBlbmQgb2YgdGhlIG1vbnRoLCB0aGVuIHRoaXMgaXMgdGhlIGNvcnJlY3QgZGF0ZVxuICAgIC8vIGFuZCB3ZSdyZSBkb25lLlxuICAgIHJldHVybiBlbmRPZkRlc2lyZWRNb250aDtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIHdlIG5vdyBrbm93IHRoYXQgc2V0dGluZyB0aGUgb3JpZ2luYWwgZGF5LW9mLW1vbnRoIHZhbHVlIHdvbid0XG4gICAgLy8gY2F1c2UgYW4gb3ZlcmZsb3csIHNvIHNldCB0aGUgZGVzaXJlZCBkYXktb2YtbW9udGguIE5vdGUgdGhhdCB3ZSBjYW4ndFxuICAgIC8vIGp1c3Qgc2V0IHRoZSBkYXRlIG9mIGBlbmRPZkRlc2lyZWRNb250aGAgYmVjYXVzZSB0aGF0IG9iamVjdCBtYXkgaGF2ZSBoYWRcbiAgICAvLyBpdHMgdGltZSBjaGFuZ2VkIGluIHRoZSB1bnVzdWFsIGNhc2Ugd2hlcmUgd2hlcmUgYSBEU1QgdHJhbnNpdGlvbiB3YXMgb25cbiAgICAvLyB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoIGFuZCBpdHMgbG9jYWwgdGltZSB3YXMgaW4gdGhlIGhvdXIgc2tpcHBlZCBvclxuICAgIC8vIHJlcGVhdGVkIG5leHQgdG8gYSBEU1QgdHJhbnNpdGlvbi4gIFNvIHdlIHVzZSBgZGF0ZWAgaW5zdGVhZCB3aGljaCBpc1xuICAgIC8vIGd1YXJhbnRlZWQgdG8gc3RpbGwgaGF2ZSB0aGUgb3JpZ2luYWwgdGltZS5cbiAgICBfZGF0ZS5zZXRGdWxsWWVhcihcbiAgICAgIGVuZE9mRGVzaXJlZE1vbnRoLmdldEZ1bGxZZWFyKCksXG4gICAgICBlbmRPZkRlc2lyZWRNb250aC5nZXRNb250aCgpLFxuICAgICAgZGF5T2ZNb250aCxcbiAgICApO1xuICAgIHJldHVybiBfZGF0ZTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZFF1YXJ0ZXJzID0gYWRkUXVhcnRlcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTW9udGhzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZFF1YXJ0ZXJzXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhciBxdWFydGVycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFyIHF1YXJ0ZXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgcXVhcnRlcnMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHF1YXJ0ZXJzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAxIHF1YXJ0ZXIgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFF1YXJ0ZXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAxKVxuICogLy89PiBNb24gRGVjIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkUXVhcnRlcnMoZGF0ZSwgYW1vdW50KSB7XG4gIGNvbnN0IG1vbnRocyA9IGFtb3VudCAqIDM7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZE1vbnRocykoZGF0ZSwgbW9udGhzKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRTZWNvbmRzID0gYWRkU2Vjb25kcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRNaWxsaXNlY29uZHMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkU2Vjb25kc1xuICogQGNhdGVnb3J5IFNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2Ygc2Vjb25kcyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgc2Vjb25kcyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMzAgc2Vjb25kcyB0byAxMCBKdWx5IDIwMTQgMTI6NDU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRTZWNvbmRzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAxMiwgNDUsIDApLCAzMClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjMwXG4gKi9cbmZ1bmN0aW9uIGFkZFNlY29uZHMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZE1pbGxpc2Vjb25kcykoZGF0ZSwgYW1vdW50ICogMTAwMCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkV2Vla3MgPSBhZGRXZWVrcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGREYXlzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZFdlZWtzXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2Vla3MgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHdlZWtzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSB3ZWVrcyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgNCB3ZWVrcyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkV2Vla3MobmV3IERhdGUoMjAxNCwgOCwgMSksIDQpXG4gKiAvLz0+IE1vbiBTZXAgMjkgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBhZGRXZWVrcyhkYXRlLCBhbW91bnQpIHtcbiAgY29uc3QgZGF5cyA9IGFtb3VudCAqIDc7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZERheXMpKGRhdGUsIGRheXMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZFllYXJzID0gYWRkWWVhcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTW9udGhzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZFllYXJzXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhcnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhcnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiB5ZWFycyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgeWVhcnMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDUgeWVhcnMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFllYXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA1KVxuICogLy89PiBTdW4gU2VwIDAxIDIwMTkgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkWWVhcnMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZE1vbnRocykoZGF0ZSwgYW1vdW50ICogMTIpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNlY29uZHNJblllYXIgPVxuICBleHBvcnRzLnNlY29uZHNJbldlZWsgPVxuICBleHBvcnRzLnNlY29uZHNJblF1YXJ0ZXIgPVxuICBleHBvcnRzLnNlY29uZHNJbk1vbnRoID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5NaW51dGUgPVxuICBleHBvcnRzLnNlY29uZHNJbkhvdXIgPVxuICBleHBvcnRzLnNlY29uZHNJbkRheSA9XG4gIGV4cG9ydHMucXVhcnRlcnNJblllYXIgPVxuICBleHBvcnRzLm1vbnRoc0luWWVhciA9XG4gIGV4cG9ydHMubW9udGhzSW5RdWFydGVyID1cbiAgZXhwb3J0cy5taW51dGVzSW5ZZWFyID1cbiAgZXhwb3J0cy5taW51dGVzSW5Nb250aCA9XG4gIGV4cG9ydHMubWludXRlc0luSG91ciA9XG4gIGV4cG9ydHMubWludXRlc0luRGF5ID1cbiAgZXhwb3J0cy5taW5UaW1lID1cbiAgZXhwb3J0cy5taWxsaXNlY29uZHNJbldlZWsgPVxuICBleHBvcnRzLm1pbGxpc2Vjb25kc0luU2Vjb25kID1cbiAgZXhwb3J0cy5taWxsaXNlY29uZHNJbk1pbnV0ZSA9XG4gIGV4cG9ydHMubWlsbGlzZWNvbmRzSW5Ib3VyID1cbiAgZXhwb3J0cy5taWxsaXNlY29uZHNJbkRheSA9XG4gIGV4cG9ydHMubWF4VGltZSA9XG4gIGV4cG9ydHMuZGF5c0luWWVhciA9XG4gIGV4cG9ydHMuZGF5c0luV2VlayA9XG4gICAgdm9pZCAwOyAvKipcbiAqIEBtb2R1bGUgY29uc3RhbnRzXG4gKiBAc3VtbWFyeSBVc2VmdWwgY29uc3RhbnRzXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbGxlY3Rpb24gb2YgdXNlZnVsIGRhdGUgY29uc3RhbnRzLlxuICpcbiAqIFRoZSBjb25zdGFudHMgY291bGQgYmUgaW1wb3J0ZWQgZnJvbSBgZGF0ZS1mbnMvY29uc3RhbnRzYDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgbWF4VGltZSwgbWluVGltZSB9IGZyb20gXCJkYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBmdW5jdGlvbiBpc0FsbG93ZWRUaW1lKHRpbWUpIHtcbiAqICAgcmV0dXJuIHRpbWUgPD0gbWF4VGltZSAmJiB0aW1lID49IG1pblRpbWU7XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgZGF5c0luV2Vla1xuICogQHN1bW1hcnkgRGF5cyBpbiAxIHdlZWsuXG4gKi9cbmNvbnN0IGRheXNJbldlZWsgPSAoZXhwb3J0cy5kYXlzSW5XZWVrID0gNyk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBkYXlzSW5ZZWFyXG4gKiBAc3VtbWFyeSBEYXlzIGluIDEgeWVhci5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhvdyBtYW55IGRheXMgaW4gYSB5ZWFyLlxuICpcbiAqIE9uZSB5ZWFycyBlcXVhbHMgMzY1LjI0MjUgZGF5cyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6XG4gKlxuICogPiBMZWFwIHllYXIgb2NjdXJlcyBldmVyeSA0IHllYXJzLCBleGNlcHQgZm9yIHllYXJzIHRoYXQgYXJlIGRpdmlzYWJsZSBieSAxMDAgYW5kIG5vdCBkaXZpc2FibGUgYnkgNDAwLlxuICogPiAxIG1lYW4geWVhciA9ICgzNjUrMS80LTEvMTAwKzEvNDAwKSBkYXlzID0gMzY1LjI0MjUgZGF5c1xuICovXG5jb25zdCBkYXlzSW5ZZWFyID0gKGV4cG9ydHMuZGF5c0luWWVhciA9IDM2NS4yNDI1KTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1heFRpbWVcbiAqIEBzdW1tYXJ5IE1heGltdW0gYWxsb3dlZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBtYXhUaW1lIH0gZnJvbSBcImRhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGNvbnN0IGlzVmFsaWQgPSA4NjQwMDAwMDAwMDAwMDAxIDw9IG1heFRpbWU7XG4gKiAvLz0+IGZhbHNlXG4gKlxuICogbmV3IERhdGUoODY0MDAwMDAwMDAwMDAwMSk7XG4gKiAvLz0+IEludmFsaWQgRGF0ZVxuICovXG5jb25zdCBtYXhUaW1lID0gKGV4cG9ydHMubWF4VGltZSA9IE1hdGgucG93KDEwLCA4KSAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWluVGltZVxuICogQHN1bW1hcnkgTWluaW11bSBhbGxvd2VkIHRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IG1pblRpbWUgfSBmcm9tIFwiZGF0ZS1mbnMvY29uc3RhbnRzXCI7XG4gKlxuICogY29uc3QgaXNWYWxpZCA9IC04NjQwMDAwMDAwMDAwMDAxID49IG1pblRpbWU7XG4gKiAvLz0+IGZhbHNlXG4gKlxuICogbmV3IERhdGUoLTg2NDAwMDAwMDAwMDAwMDEpXG4gKiAvLz0+IEludmFsaWQgRGF0ZVxuICovXG5jb25zdCBtaW5UaW1lID0gKGV4cG9ydHMubWluVGltZSA9IC1tYXhUaW1lKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luV2Vla1xuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgd2Vlay5cbiAqL1xuY29uc3QgbWlsbGlzZWNvbmRzSW5XZWVrID0gKGV4cG9ydHMubWlsbGlzZWNvbmRzSW5XZWVrID0gNjA0ODAwMDAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luRGF5XG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBkYXkuXG4gKi9cbmNvbnN0IG1pbGxpc2Vjb25kc0luRGF5ID0gKGV4cG9ydHMubWlsbGlzZWNvbmRzSW5EYXkgPSA4NjQwMDAwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbk1pbnV0ZVxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgbWludXRlXG4gKi9cbmNvbnN0IG1pbGxpc2Vjb25kc0luTWludXRlID0gKGV4cG9ydHMubWlsbGlzZWNvbmRzSW5NaW51dGUgPSA2MDAwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbkhvdXJcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIGhvdXJcbiAqL1xuY29uc3QgbWlsbGlzZWNvbmRzSW5Ib3VyID0gKGV4cG9ydHMubWlsbGlzZWNvbmRzSW5Ib3VyID0gMzYwMDAwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJblNlY29uZFxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgc2Vjb25kXG4gKi9cbmNvbnN0IG1pbGxpc2Vjb25kc0luU2Vjb25kID0gKGV4cG9ydHMubWlsbGlzZWNvbmRzSW5TZWNvbmQgPSAxMDAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJblllYXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSB5ZWFyLlxuICovXG5jb25zdCBtaW51dGVzSW5ZZWFyID0gKGV4cG9ydHMubWludXRlc0luWWVhciA9IDUyNTYwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5Nb250aFxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIG1vbnRoLlxuICovXG5jb25zdCBtaW51dGVzSW5Nb250aCA9IChleHBvcnRzLm1pbnV0ZXNJbk1vbnRoID0gNDMyMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luRGF5XG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgZGF5LlxuICovXG5jb25zdCBtaW51dGVzSW5EYXkgPSAoZXhwb3J0cy5taW51dGVzSW5EYXkgPSAxNDQwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbkhvdXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSBob3VyLlxuICovXG5jb25zdCBtaW51dGVzSW5Ib3VyID0gKGV4cG9ydHMubWludXRlc0luSG91ciA9IDYwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1vbnRoc0luUXVhcnRlclxuICogQHN1bW1hcnkgTW9udGhzIGluIDEgcXVhcnRlci5cbiAqL1xuY29uc3QgbW9udGhzSW5RdWFydGVyID0gKGV4cG9ydHMubW9udGhzSW5RdWFydGVyID0gMyk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtb250aHNJblllYXJcbiAqIEBzdW1tYXJ5IE1vbnRocyBpbiAxIHllYXIuXG4gKi9cbmNvbnN0IG1vbnRoc0luWWVhciA9IChleHBvcnRzLm1vbnRoc0luWWVhciA9IDEyKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHF1YXJ0ZXJzSW5ZZWFyXG4gKiBAc3VtbWFyeSBRdWFydGVycyBpbiAxIHllYXJcbiAqL1xuY29uc3QgcXVhcnRlcnNJblllYXIgPSAoZXhwb3J0cy5xdWFydGVyc0luWWVhciA9IDQpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luSG91clxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIGhvdXIuXG4gKi9cbmNvbnN0IHNlY29uZHNJbkhvdXIgPSAoZXhwb3J0cy5zZWNvbmRzSW5Ib3VyID0gMzYwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5NaW51dGVcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBtaW51dGUuXG4gKi9cbmNvbnN0IHNlY29uZHNJbk1pbnV0ZSA9IChleHBvcnRzLnNlY29uZHNJbk1pbnV0ZSA9IDYwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbkRheVxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIGRheS5cbiAqL1xuY29uc3Qgc2Vjb25kc0luRGF5ID0gKGV4cG9ydHMuc2Vjb25kc0luRGF5ID0gc2Vjb25kc0luSG91ciAqIDI0KTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbldlZWtcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSB3ZWVrLlxuICovXG5jb25zdCBzZWNvbmRzSW5XZWVrID0gKGV4cG9ydHMuc2Vjb25kc0luV2VlayA9IHNlY29uZHNJbkRheSAqIDcpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luWWVhclxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIHllYXIuXG4gKi9cbmNvbnN0IHNlY29uZHNJblllYXIgPSAoZXhwb3J0cy5zZWNvbmRzSW5ZZWFyID0gc2Vjb25kc0luRGF5ICogZGF5c0luWWVhcik7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5Nb250aFxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIG1vbnRoXG4gKi9cbmNvbnN0IHNlY29uZHNJbk1vbnRoID0gKGV4cG9ydHMuc2Vjb25kc0luTW9udGggPSBzZWNvbmRzSW5ZZWFyIC8gMTIpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luUXVhcnRlclxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIHF1YXJ0ZXIuXG4gKi9cbmNvbnN0IHNlY29uZHNJblF1YXJ0ZXIgPSAoZXhwb3J0cy5zZWNvbmRzSW5RdWFydGVyID0gc2Vjb25kc0luTW9udGggKiAzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5jb25zdHJ1Y3RGcm9tID0gY29uc3RydWN0RnJvbTtcblxuLyoqXG4gKiBAbmFtZSBjb25zdHJ1Y3RGcm9tXG4gKiBAY2F0ZWdvcnkgR2VuZXJpYyBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZGF0ZSB1c2luZyB0aGUgcmVmZXJlbmNlIGRhdGUgYW5kIHRoZSB2YWx1ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGZ1bmN0aW9uIGNvbnN0cnVjdHMgYSBuZXcgZGF0ZSB1c2luZyB0aGUgY29uc3RydWN0b3IgZnJvbSB0aGUgcmVmZXJlbmNlXG4gKiBkYXRlIGFuZCB0aGUgZ2l2ZW4gdmFsdWUuIEl0IGhlbHBzIHRvIGJ1aWxkIGdlbmVyaWMgZnVuY3Rpb25zIHRoYXQgYWNjZXB0XG4gKiBkYXRlIGV4dGVuc2lvbnMuXG4gKlxuICogSXQgZGVmYXVsdHMgdG8gYERhdGVgIGlmIHRoZSBwYXNzZWQgcmVmZXJlbmNlIGRhdGUgaXMgYSBudW1iZXIgb3IgYSBzdHJpbmcuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgcmVmZXJlbmNlIGRhdGUgdG8gdGFrZSBjb25zdHJ1Y3RvciBmcm9tXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY3JlYXRlIHRoZSBkYXRlXG4gKlxuICogQHJldHVybnMgRGF0ZSBpbml0aWFsaXplZCB1c2luZyB0aGUgZ2l2ZW4gZGF0ZSBhbmQgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gJ2RhdGUtZm5zJ1xuICpcbiAqIC8vIEEgZnVuY3Rpb24gdGhhdCBjbG9uZXMgYSBkYXRlIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIHR5cGVcbiAqIGZ1bmN0aW9uIGNsb25lRGF0ZTxEYXRlVHlwZSBleHRlbmRzIERhdGUoZGF0ZTogRGF0ZVR5cGUpOiBEYXRlVHlwZSB7XG4gKiAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKFxuICogICAgIGRhdGUsIC8vIFVzZSBjb250cnVzdG9yIGZyb20gdGhlIGdpdmVuIGRhdGVcbiAqICAgICBkYXRlLmdldFRpbWUoKSAvLyBVc2UgdGhlIGRhdGUgdmFsdWUgdG8gY3JlYXRlIGEgbmV3IGRhdGVcbiAqICAgKVxuICogfVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlKSB7XG4gIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBuZXcgZGF0ZS5jb25zdHJ1Y3Rvcih2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZEYXkuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdGltZXMgYXJlIHJlbW92ZWRcbiAqIGZyb20gdGhlIGRhdGVzIGFuZCB0aGVuIHRoZSBkaWZmZXJlbmNlIGluIGRheXMgaXMgY2FsY3VsYXRlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6MDA6MDAgYW5kIDIgSnVseSAyMDEyIDAwOjAwOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKFxuICogICBuZXcgRGF0ZSgyMDEyLCA2LCAyLCAwLCAwKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDApXG4gKiApXG4gKiAvLz0+IDM2NlxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6NTk6MDAgYW5kIDMgSnVseSAyMDExIDAwOjAxOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAzLCAwLCAxKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDU5KVxuICogKVxuICogLy89PiAxXG4gKi9cbmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IHN0YXJ0T2ZEYXlMZWZ0ID0gKDAsIF9pbmRleDIuc3RhcnRPZkRheSkoZGF0ZUxlZnQpO1xuICBjb25zdCBzdGFydE9mRGF5UmlnaHQgPSAoMCwgX2luZGV4Mi5zdGFydE9mRGF5KShkYXRlUmlnaHQpO1xuXG4gIGNvbnN0IHRpbWVzdGFtcExlZnQgPVxuICAgICtzdGFydE9mRGF5TGVmdCAtXG4gICAgKDAsIF9pbmRleDMuZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcykoc3RhcnRPZkRheUxlZnQpO1xuICBjb25zdCB0aW1lc3RhbXBSaWdodCA9XG4gICAgK3N0YXJ0T2ZEYXlSaWdodCAtXG4gICAgKDAsIF9pbmRleDMuZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcykoc3RhcnRPZkRheVJpZ2h0KTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIGRheXMgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBiZWNhdXNlIHRoZSBudW1iZXIgb2ZcbiAgLy8gbWlsbGlzZWNvbmRzIGluIGEgZGF5IGlzIG5vdCBjb25zdGFudCAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZlxuICAvLyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpLlxuICByZXR1cm4gTWF0aC5yb3VuZChcbiAgICAodGltZXN0YW1wTGVmdCAtIHRpbWVzdGFtcFJpZ2h0KSAvIF9pbmRleC5taWxsaXNlY29uZHNJbkRheSxcbiAgKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoc1xuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRocyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRocyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRoc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciBtb250aHMgYXJlIGJldHdlZW4gMzEgSmFudWFyeSAyMDE0IGFuZCAxIFNlcHRlbWJlciAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDgsIDEpLFxuICogICBuZXcgRGF0ZSgyMDE0LCAwLCAzMSlcbiAqIClcbiAqIC8vPT4gOFxuICovXG5mdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlTGVmdCk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVJpZ2h0KTtcblxuICBjb25zdCB5ZWFyRGlmZiA9IF9kYXRlTGVmdC5nZXRGdWxsWWVhcigpIC0gX2RhdGVSaWdodC5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtb250aERpZmYgPSBfZGF0ZUxlZnQuZ2V0TW9udGgoKSAtIF9kYXRlUmlnaHQuZ2V0TW9udGgoKTtcblxuICByZXR1cm4geWVhckRpZmYgKiAxMiArIG1vbnRoRGlmZjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9nZXRRdWFydGVyLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyc1xuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgcXVhcnRlcnMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBxdWFydGVycyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBlYXJsaWVyIGRhdGVcblxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciBxdWFydGVyc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciBxdWFydGVycyBhcmUgYmV0d2VlbiAzMSBEZWNlbWJlciAyMDEzIGFuZCAyIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIpLFxuICogICBuZXcgRGF0ZSgyMDEzLCAxMSwgMzEpXG4gKiApXG4gKiAvLz0+IDNcbiAqL1xuZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZUxlZnQpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlUmlnaHQpO1xuXG4gIGNvbnN0IHllYXJEaWZmID0gX2RhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgLSBfZGF0ZVJpZ2h0LmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IHF1YXJ0ZXJEaWZmID1cbiAgICAoMCwgX2luZGV4LmdldFF1YXJ0ZXIpKF9kYXRlTGVmdCkgLSAoMCwgX2luZGV4LmdldFF1YXJ0ZXIpKF9kYXRlUmlnaHQpO1xuXG4gIHJldHVybiB5ZWFyRGlmZiAqIDQgKyBxdWFydGVyRGlmZjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFyc1xuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgeWVhcnMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciB5ZWFycyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBlYXJsaWVyIGRhdGVcblxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciB5ZWFyc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciB5ZWFycyBhcmUgYmV0d2VlbiAzMSBEZWNlbWJlciAyMDEzIGFuZCAxMSBGZWJydWFyeSAyMDE1P1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhcbiAqICAgbmV3IERhdGUoMjAxNSwgMSwgMTEpLFxuICogICBuZXcgRGF0ZSgyMDEzLCAxMSwgMzEpXG4gKiApXG4gKiAvLz0+IDJcbiAqL1xuZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlTGVmdCk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVJpZ2h0KTtcblxuICByZXR1cm4gX2RhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgLSBfZGF0ZVJpZ2h0LmdldEZ1bGxZZWFyKCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZW5kT2ZEYXkgPSBlbmRPZkRheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZW5kT2ZEYXlcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBlbmQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGVuZCBvZiBhIGRheVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgZGF5IGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5mdW5jdGlvbiBlbmRPZkRheShkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBfZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZW5kT2ZNb250aCA9IGVuZE9mTW9udGg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGVuZCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGVuZCBvZiBhIG1vbnRoXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBlbmQgb2YgYSBtb250aCBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAzMCAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5mdW5jdGlvbiBlbmRPZk1vbnRoKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IG1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTtcbiAgX2RhdGUuc2V0RnVsbFllYXIoX2RhdGUuZ2V0RnVsbFllYXIoKSwgbW9udGggKyAxLCAwKTtcbiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmVuZE9mV2VlayA9IGVuZE9mV2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGVuZE9mV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mV2Vla1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBlbmQgb2YgYSB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBlbmQgb2YgYSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFNhdCBTZXAgMDYgMjAxNCAyMzo1OTo1OS45OTlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdGhlIHdlZWsgc3RhcnRzIG9uIE1vbmRheSwgdGhlIGVuZCBvZiB0aGUgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBTdW4gU2VwIDA3IDIwMTQgMjM6NTk6NTkuOTk5XG4gKi9cbmZ1bmN0aW9uIGVuZE9mV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDIuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpO1xuICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IC03IDogMCkgKyA2IC0gKGRheSAtIHdlZWtTdGFydHNPbik7XG5cbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBkaWZmKTtcbiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmVuZE9mWWVhciA9IGVuZE9mWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZW5kT2ZZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGVuZCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBlbmQgb2YgYSB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBlbmQgb2YgYSB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBlbmQgb2YgYSB5ZWFyIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMDApKVxuICogLy89PiBXZWQgRGVjIDMxIDIwMTQgMjM6NTk6NTkuOTk5XG4gKi9cbmZ1bmN0aW9uIGVuZE9mWWVhcihkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgX2RhdGUuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDApO1xuICBfZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZm9ybWF0ID0gZXhwb3J0cy5mb3JtYXREYXRlID0gZm9ybWF0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZm9ybWF0dGVyc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfaW5kZXgzLmZvcm1hdHRlcnM7XG4gIH0sXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxvbmdGb3JtYXR0ZXJzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9pbmRleDQubG9uZ0Zvcm1hdHRlcnM7XG4gIH0sXG59KTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRMb2NhbGUuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL19saWIvZm9ybWF0L2Zvcm1hdHRlcnMuanNcIik7XG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzLmpzXCIpO1xudmFyIF9pbmRleDUgPSByZXF1aXJlKFwiLi9fbGliL3Byb3RlY3RlZFRva2Vucy5qc1wiKTtcblxudmFyIF9pbmRleDYgPSByZXF1aXJlKFwiLi9pc1ZhbGlkLmpzXCIpO1xudmFyIF9pbmRleDcgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8vIFJleHBvcnRzIG9mIGludGVybmFsIGZvciBsaWJyYXJpZXMgdG8gdXNlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM2MzgjaXNzdWVjb21tZW50LTE4NzcwODI4NzRcblxuLy8gVGhpcyBSZWdFeHAgY29uc2lzdHMgb2YgdGhyZWUgcGFydHMgc2VwYXJhdGVkIGJ5IGB8YDpcbi8vIC0gW3lZUXFNTHdJZERlY2loSEtrbXNdbyBtYXRjaGVzIGFueSBhdmFpbGFibGUgb3JkaW5hbCBudW1iZXIgdG9rZW5cbi8vICAgKG9uZSBvZiB0aGUgY2VydGFpbiBsZXR0ZXJzIGZvbGxvd2VkIGJ5IGBvYClcbi8vIC0gKFxcdylcXDEqIG1hdGNoZXMgYW55IHNlcXVlbmNlcyBvZiB0aGUgc2FtZSBsZXR0ZXJcbi8vIC0gJycgbWF0Y2hlcyB0d28gcXVvdGUgY2hhcmFjdGVycyBpbiBhIHJvd1xuLy8gLSAnKCcnfFteJ10pKygnfCQpIG1hdGNoZXMgYW55dGhpbmcgc3Vycm91bmRlZCBieSB0d28gcXVvdGUgY2hhcmFjdGVycyAoJyksXG4vLyAgIGV4Y2VwdCBhIHNpbmdsZSBxdW90ZSBzeW1ib2wsIHdoaWNoIGVuZHMgdGhlIHNlcXVlbmNlLlxuLy8gICBUd28gcXVvdGUgY2hhcmFjdGVycyBkbyBub3QgZW5kIHRoZSBzZXF1ZW5jZS5cbi8vICAgSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc2luZ2xlIHF1b3RlXG4vLyAgIHRoZW4gdGhlIHNlcXVlbmNlIHdpbGwgY29udGludWUgdW50aWwgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLlxuLy8gLSAuIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIgdW5tYXRjaGVkIGJ5IHByZXZpb3VzIHBhcnRzIG9mIHRoZSBSZWdFeHBzXG5jb25zdCBmb3JtYXR0aW5nVG9rZW5zUmVnRXhwID1cbiAgL1t5WVFxTUx3SWREZWNpaEhLa21zXW98KFxcdylcXDEqfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nO1xuXG4vLyBUaGlzIFJlZ0V4cCBjYXRjaGVzIHN5bWJvbHMgZXNjYXBlZCBieSBxdW90ZXMsIGFuZCBhbHNvXG4vLyBzZXF1ZW5jZXMgb2Ygc3ltYm9scyBQLCBwLCBhbmQgdGhlIGNvbWJpbmF0aW9ucyBsaWtlIGBQUFBQUFBQcHBwcHBgXG5jb25zdCBsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9IC9QK3ArfFArfHArfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nO1xuXG5jb25zdCBlc2NhcGVkU3RyaW5nUmVnRXhwID0gL14nKFteXSo/KSc/JC87XG5jb25zdCBkb3VibGVRdW90ZVJlZ0V4cCA9IC8nJy9nO1xuY29uc3QgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAgPSAvW2EtekEtWl0vO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZm9ybWF0fSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZm9ybWF0XG4gKiBAYWxpYXMgZm9ybWF0RGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBGb3JtYXQgdGhlIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZyBpbiB0aGUgZ2l2ZW4gZm9ybWF0LiBUaGUgcmVzdWx0IG1heSB2YXJ5IGJ5IGxvY2FsZS5cbiAqXG4gKiA+IOKaoO+4jyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBgZm9ybWF0YCB0b2tlbnMgZGlmZmVyIGZyb20gTW9tZW50LmpzIGFuZCBvdGhlciBsaWJyYXJpZXMuXG4gKiA+IFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIFRoZSBjaGFyYWN0ZXJzIHdyYXBwZWQgYmV0d2VlbiB0d28gc2luZ2xlIHF1b3RlcyBjaGFyYWN0ZXJzICgnKSBhcmUgZXNjYXBlZC5cbiAqIFR3byBzaW5nbGUgcXVvdGVzIGluIGEgcm93LCB3aGV0aGVyIGluc2lkZSBvciBvdXRzaWRlIGEgcXVvdGVkIHNlcXVlbmNlLCByZXByZXNlbnQgYSAncmVhbCcgc2luZ2xlIHF1b3RlLlxuICogKHNlZSB0aGUgbGFzdCBleGFtcGxlKVxuICpcbiAqIEZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzIGJhc2VkIG9uIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9GaWVsZF9TeW1ib2xfVGFibGVcbiAqIHdpdGggYSBmZXcgYWRkaXRpb25zIChzZWUgbm90ZSA3IGJlbG93IHRoZSB0YWJsZSkuXG4gKlxuICogQWNjZXB0ZWQgcGF0dGVybnM6XG4gKiB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQYXR0ZXJuIHwgUmVzdWx0IGV4YW1wbGVzICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLXxcbiAqIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEcuLkdHRyAgfCBBRCwgQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHICAgIHwgQW5ubyBEb21pbmksIEJlZm9yZSBDaHJpc3QgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR0dHR0cgICB8IEEsIEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQ2FsZW5kYXIgeWVhciAgICAgICAgICAgICAgICAgICB8IHkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5byAgICAgIHwgNDR0aCwgMXN0LCAwdGgsIDE3dGggICAgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eSAgICAgfCAwNDQsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5ICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5eXkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICB8IFkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZbyAgICAgIHwgNDR0aCwgMXN0LCAxOTAwdGgsIDIwMTd0aCAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDUsOCAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWSAgICAgfCAwNDQsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZWVkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgICB8IFIgICAgICAgfCAtNDMsIDAsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUiAgICAgIHwgLTQzLCAwMCwgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSICAgICB8IC0wNDMsIDAwMCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlIgICAgfCAtMDA0MywgMDAwMCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlJSUiAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1LDcgfFxuICogfCBFeHRlbmRlZCB5ZWFyICAgICAgICAgICAgICAgICAgIHwgdSAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1ICAgICAgfCAtNDMsIDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXUgICAgIHwgLTA0MywgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dSAgICB8IC0wMDQzLCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dXV1ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IFF1YXJ0ZXIgKGZvcm1hdHRpbmcpICAgICAgICAgICAgfCBRICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUVFRICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8IFF1YXJ0ZXIgKHN0YW5kLWFsb25lKSAgICAgICAgICAgfCBxICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcXFxICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8IE1vbnRoIChmb3JtYXR0aW5nKSAgICAgICAgICAgICAgfCBNICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU0gICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTSAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTU1NICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1vbnRoIChzdGFuZC1hbG9uZSkgICAgICAgICAgICAgfCBMICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTEwgICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTCAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTExMICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgfCB3ICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHd3ICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICAgfCBJICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElJICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICAgfCBkICAgICAgIHwgMSwgMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDMxc3QgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRkICAgICAgfCAwMSwgMDIsIC4uLiwgMzEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICAgfCBEICAgICAgIHwgMSwgMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICAgIHwgOSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDM2NXRoLCAzNjZ0aCAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEREICAgICAgfCAwMSwgMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREQgICAgIHwgMDAxLCAwMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRERERCAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgRGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICAgICAgICB8IEUuLkVFRSAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUUgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUVFRSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgfCBpICAgICAgIHwgMSwgMiwgMywgLi4uLCA3ICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDd0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpICAgICAgfCAwMSwgMDIsIC4uLiwgMDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWkgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpaWkgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgNyAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgIHwgZSAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZSAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZWVlICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgZGF5IG9mIHdlZWsgKHN0YW5kLWFsb25lKSB8IGMgICAgICAgfCAyLCAzLCA0LCAuLi4sIDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjbyAgICAgIHwgMm5kLCAzcmQsIC4uLiwgMXN0ICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2MgICAgICB8IDAyLCAwMywgLi4uLCAwMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjYyAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2MgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2NjYyAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhLi5hYSAgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhICAgICB8IGFtLCBwbSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWEgICAgfCBhLm0uLCBwLm0uICAgICAgICAgICAgICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWFhYSAgIHwgYSwgcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgIHwgYi4uYmIgICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYiAgICAgfCBhbSwgcG0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiICAgIHwgYS5tLiwgcC5tLiwgbm9vbiwgbWlkbmlnaHQgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiYmIgICB8IGEsIHAsIG4sIG1pICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgICB8IEIuLkJCQiAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCICAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQkJCQkIgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgICB8IGggICAgICAgfCAxLCAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBobyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMTJ0aCAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGggICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgICB8IEggICAgICAgfCAwLCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIbyAgICAgIHwgMHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSEggICAgICB8IDAwLCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgICB8IEsgICAgICAgfCAxLCAyLCAuLi4sIDExLCAwICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMHRoICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS0sgICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgICB8IGsgICAgICAgfCAyNCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrbyAgICAgIHwgMjR0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2sgICAgICB8IDI0LCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgICB8IG0gICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW0gICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgICB8IHMgICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3MgICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgICB8IFMgICAgICAgfCAwLCAxLCAuLi4sIDkgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTUyAgICAgIHwgMDAsIDAxLCAuLi4sIDk5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTICAgICB8IDAwMCwgMDAxLCAuLi4sIDk5OSAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTU1MgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzICAgICB8XG4gKiB8IFRpbWV6b25lIChJU08tODYwMSB3LyBaKSAgICAgICAgfCBYICAgICAgIHwgLTA4LCArMDUzMCwgWiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFggICAgICB8IC0wODAwLCArMDUzMCwgWiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWCAgICAgfCAtMDg6MDAsICswNTozMCwgWiAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYICAgIHwgLTA4MDAsICswNTMwLCBaLCArMTIzNDU2ICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYWFggICB8IC0wODowMCwgKzA1OjMwLCBaLCArMTI6MzQ6NTYgICAgICB8ICAgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvbyBaKSAgICAgICB8IHggICAgICAgfCAtMDgsICswNTMwLCArMDAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eCAgICAgIHwgLTA4MDAsICswNTMwLCArMDAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4ICAgICB8IC0wODowMCwgKzA1OjMwLCArMDA6MDAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHggICAgfCAtMDgwMCwgKzA1MzAsICswMDAwLCArMTIzNDU2ICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHh4eCAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCwgKzEyOjM0OjU2IHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoR01UKSAgICAgICAgICAgICAgICAgIHwgTy4uLk9PTyB8IEdNVC04LCBHTVQrNTozMCwgR01UKzAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE9PT08gICAgfCBHTVQtMDg6MDAsIEdNVCswNTozMCwgR01UKzAwOjAwICAgfCAyICAgICB8XG4gKiB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSAgfCB6Li4uenp6IHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgNiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgenp6eiAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIsNiAgIHxcbiAqIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgICB8IHQgICAgICAgfCA1MTI5Njk1MjAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0dCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw3ICAgfFxuICogfCBNaWxsaXNlY29uZHMgdGltZXN0YW1wICAgICAgICAgIHwgVCAgICAgICB8IDUxMjk2OTUyMDkwMCAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICAgfCBQICAgICAgIHwgMDQvMjkvMTQ1MyAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFAgICAgICB8IEFwciAyOSwgMTQ1MyAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUCAgICAgfCBBcHJpbCAyOXRoLCAxNDUzICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBQICAgIHwgRnJpZGF5LCBBcHJpbCAyOXRoLCAxNDUzICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBMb25nIGxvY2FsaXplZCB0aW1lICAgICAgICAgICAgIHwgcCAgICAgICB8IDEyOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwICAgICAgfCAxMjowMDowMCBBTSAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHAgICAgIHwgMTI6MDA6MDAgQU0gR01UKzIgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHBwcCAgICB8IDEyOjAwOjAwIEFNIEdNVCswMjowMCAgICAgICAgICAgICB8IDIsNyAgIHxcbiAqIHwgQ29tYmluYXRpb24gb2YgZGF0ZSBhbmQgdGltZSAgICB8IFBwICAgICAgfCAwNC8yOS8xNDUzLCAxMjowMCBBTSAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUHBwICAgIHwgQXByIDI5LCAxNDUzLCAxMjowMDowMCBBTSAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQcHBwICB8IEFwcmlsIDI5dGgsIDE0NTMgYXQgLi4uICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFBwcHBwfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgYXQgLi4uICAgfCAyLDcgICB8XG4gKiBOb3RlczpcbiAqIDEuIFwiRm9ybWF0dGluZ1wiIHVuaXRzIChlLmcuIGZvcm1hdHRpbmcgcXVhcnRlcikgaW4gdGhlIGRlZmF1bHQgZW4tVVMgbG9jYWxlXG4gKiAgICBhcmUgdGhlIHNhbWUgYXMgXCJzdGFuZC1hbG9uZVwiIHVuaXRzLCBidXQgYXJlIGRpZmZlcmVudCBpbiBzb21lIGxhbmd1YWdlcy5cbiAqICAgIFwiRm9ybWF0dGluZ1wiIHVuaXRzIGFyZSBkZWNsaW5lZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIHRoZSBsYW5ndWFnZVxuICogICAgaW4gdGhlIGNvbnRleHQgb2YgYSBkYXRlLiBcIlN0YW5kLWFsb25lXCIgdW5pdHMgYXJlIGFsd2F5cyBub21pbmF0aXZlIHNpbmd1bGFyOlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTExMTCcsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWQnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTU1NTScsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWR1J2BcbiAqXG4gKiAyLiBBbnkgc2VxdWVuY2Ugb2YgdGhlIGlkZW50aWNhbCBsZXR0ZXJzIGlzIGEgcGF0dGVybiwgdW5sZXNzIGl0IGlzIGVzY2FwZWQgYnlcbiAqICAgIHRoZSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycyAoc2VlIGJlbG93KS5cbiAqICAgIElmIHRoZSBzZXF1ZW5jZSBpcyBsb25nZXIgdGhhbiBsaXN0ZWQgaW4gdGFibGUgKGUuZy4gYEVFRUVFRUVFRUVFYClcbiAqICAgIHRoZSBvdXRwdXQgd2lsbCBiZSB0aGUgc2FtZSBhcyBkZWZhdWx0IHBhdHRlcm4gZm9yIHRoaXMgdW5pdCwgdXN1YWxseVxuICogICAgdGhlIGxvbmdlc3Qgb25lIChpbiBjYXNlIG9mIElTTyB3ZWVrZGF5cywgYEVFRUVgKS4gRGVmYXVsdCBwYXR0ZXJucyBmb3IgdW5pdHNcbiAqICAgIGFyZSBtYXJrZWQgd2l0aCBcIjJcIiBpbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIHRhYmxlLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NJykgLy89PiAnTm92J2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTScpIC8vPT4gJ04nYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAzLiBTb21lIHBhdHRlcm5zIGNvdWxkIGJlIHVubGltaXRlZCBsZW5ndGggKHN1Y2ggYXMgYHl5eXl5eXl5YCkuXG4gKiAgICBUaGUgb3V0cHV0IHdpbGwgYmUgcGFkZGVkIHdpdGggemVyb3MgdG8gbWF0Y2ggdGhlIGxlbmd0aCBvZiB0aGUgcGF0dGVybi5cbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ3l5eXl5eXl5JykgLy89PiAnMDAwMDIwMTcnYFxuICpcbiAqIDQuIGBRUVFRUWAgYW5kIGBxcXFxcWAgY291bGQgYmUgbm90IHN0cmljdGx5IG51bWVyaWNhbCBpbiBzb21lIGxvY2FsZXMuXG4gKiAgICBUaGVzZSB0b2tlbnMgcmVwcmVzZW50IHRoZSBzaG9ydGVzdCBmb3JtIG9mIHRoZSBxdWFydGVyLlxuICpcbiAqIDUuIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBwYXR0ZXJucyBhcmUgQi5DLiB5ZWFyczpcbiAqXG4gKiAgICB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICogICAgfC0tLS0tLXwtLS0tLXwtLS0tLXxcbiAqICAgIHwgQUMgMSB8ICAgMSB8ICAgMSB8XG4gKiAgICB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICogICAgfCBCQyAyIHwgICAyIHwgIC0xIHxcbiAqXG4gKiAgICBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gKiAgICB3aGlsZSBgdXVgIHBhZHMgc2luZ2xlIGRpZ2l0IHllYXJzIHRvIDIgY2hhcmFjdGVycyBhbmQgcmV0dXJucyBvdGhlciB5ZWFycyB1bmNoYW5nZWQ6XG4gKlxuICogICAgfCBZZWFyIHwgYHl5YCB8IGB1dWAgfFxuICogICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfFxuICogICAgfCAxICAgIHwgICAwMSB8ICAgMDEgfFxuICogICAgfCAxNCAgIHwgICAxNCB8ICAgMTQgfFxuICogICAgfCAzNzYgIHwgICA3NiB8ICAzNzYgfFxuICogICAgfCAxNDUzIHwgICA1MyB8IDE0NTMgfFxuICpcbiAqICAgIFRoZSBzYW1lIGRpZmZlcmVuY2UgaXMgdHJ1ZSBmb3IgbG9jYWwgYW5kIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFycyAoYFlgIGFuZCBgUmApLFxuICogICAgZXhjZXB0IGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJzIGFyZSBkZXBlbmRlbnQgb24gYG9wdGlvbnMud2Vla1N0YXJ0c09uYFxuICogICAgYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKGNvbXBhcmUgW2dldElTT1dlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldElTT1dlZWtZZWFyKVxuICogICAgYW5kIFtnZXRXZWVrWWVhcl0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9nZXRXZWVrWWVhcikpLlxuICpcbiAqIDYuIFNwZWNpZmljIG5vbi1sb2NhdGlvbiB0aW1lem9uZXMgYXJlIGN1cnJlbnRseSB1bmF2YWlsYWJsZSBpbiBgZGF0ZS1mbnNgLFxuICogICAgc28gcmlnaHQgbm93IHRoZXNlIHRva2VucyBmYWxsIGJhY2sgdG8gR01UIHRpbWV6b25lcy5cbiAqXG4gKiA3LiBUaGVzZSBwYXR0ZXJucyBhcmUgbm90IGluIHRoZSBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzU6XG4gKiAgICAtIGBpYDogSVNPIGRheSBvZiB3ZWVrXG4gKiAgICAtIGBJYDogSVNPIHdlZWsgb2YgeWVhclxuICogICAgLSBgUmA6IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKiAgICAtIGB0YDogc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYFRgOiBtaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gKiAgICAtIGBvYDogb3JkaW5hbCBudW1iZXIgbW9kaWZpZXJcbiAqICAgIC0gYFBgOiBsb25nIGxvY2FsaXplZCBkYXRlXG4gKiAgICAtIGBwYDogbG9uZyBsb2NhbGl6ZWQgdGltZVxuICpcbiAqIDguIGBZWWAgYW5kIGBZWVlZYCB0b2tlbnMgcmVwcmVzZW50IHdlZWstbnVtYmVyaW5nIHllYXJzIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIHllYXJzLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zYCB0byB1c2UgdGhlbS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogOS4gYERgIGFuZCBgRERgIHRva2VucyByZXByZXNlbnQgZGF5cyBvZiB0aGUgeWVhciBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCBkYXlzIG9mIHRoZSBtb250aC5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gZm9ybWF0IC0gVGhlIHN0cmluZyBvZiB0b2tlbnNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmdcbiAqXG4gKiBAdGhyb3dzIGBkYXRlYCBtdXN0IG5vdCBiZSBJbnZhbGlkIERhdGVcbiAqIEB0aHJvd3MgYG9wdGlvbnMubG9jYWxlYCBtdXN0IGNvbnRhaW4gYGxvY2FsaXplYCBwcm9wZXJ0eVxuICogQHRocm93cyBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgZm9ybWF0TG9uZ2AgcHJvcGVydHlcbiAqIEB0aHJvd3MgdXNlIGB5eXl5YCBpbnN0ZWFkIG9mIGBZWVlZYCBmb3IgZm9ybWF0dGluZyB5ZWFycyB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgeXlgIGluc3RlYWQgb2YgYFlZYCBmb3IgZm9ybWF0dGluZyB5ZWFycyB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGAgaW5zdGVhZCBvZiBgRGAgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYGRkYCBpbnN0ZWFkIG9mIGBERGAgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyBmb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVwcmVzZW50IDExIEZlYnJ1YXJ5IDIwMTQgaW4gbWlkZGxlLWVuZGlhbiBmb3JtYXQ6XG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXQobmV3IERhdGUoMjAxNCwgMSwgMTEpLCAnTU0vZGQveXl5eScpXG4gKiAvLz0+ICcwMi8xMS8yMDE0J1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMiBKdWx5IDIwMTQgaW4gRXNwZXJhbnRvOlxuICogaW1wb3J0IHsgZW9Mb2NhbGUgfSBmcm9tICdkYXRlLWZucy9sb2NhbGUvZW8nXG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXQobmV3IERhdGUoMjAxNCwgNiwgMiksIFwiZG8gJ2RlJyBNTU1NIHl5eXlcIiwge1xuICogICBsb2NhbGU6IGVvTG9jYWxlXG4gKiB9KVxuICogLy89PiAnMi1hIGRlIGp1bGlvIDIwMTQnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEVzY2FwZSBzdHJpbmcgYnkgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnM6XG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXQobmV3IERhdGUoMjAxNCwgNiwgMiwgMTUpLCBcImggJ28nJ2Nsb2NrJ1wiKVxuICogLy89PiBcIjMgbydjbG9ja1wiXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdChkYXRlLCBmb3JtYXRTdHIsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4Mi5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgY29uc3QgbG9jYWxlID1cbiAgICBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMubG9jYWxlID8/IF9pbmRleC5kZWZhdWx0TG9jYWxlO1xuXG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3Qgd2Vla1N0YXJ0c09uID1cbiAgICBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgMDtcblxuICBjb25zdCBvcmlnaW5hbERhdGUgPSAoMCwgX2luZGV4Ny50b0RhdGUpKGRhdGUpO1xuXG4gIGlmICghKDAsIF9pbmRleDYuaXNWYWxpZCkob3JpZ2luYWxEYXRlKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB0aW1lIHZhbHVlXCIpO1xuICB9XG5cbiAgbGV0IHBhcnRzID0gZm9ybWF0U3RyXG4gICAgLm1hdGNoKGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwKVxuICAgIC5tYXAoKHN1YnN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwicFwiIHx8IGZpcnN0Q2hhcmFjdGVyID09PSBcIlBcIikge1xuICAgICAgICBjb25zdCBsb25nRm9ybWF0dGVyID0gX2luZGV4NC5sb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07XG4gICAgICAgIHJldHVybiBsb25nRm9ybWF0dGVyKHN1YnN0cmluZywgbG9jYWxlLmZvcm1hdExvbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1YnN0cmluZztcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpXG4gICAgLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnNSZWdFeHApXG4gICAgLm1hcCgoc3Vic3RyaW5nKSA9PiB7XG4gICAgICAvLyBSZXBsYWNlIHR3byBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycyB3aXRoIG9uZSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyXG4gICAgICBpZiAoc3Vic3RyaW5nID09PSBcIicnXCIpIHtcbiAgICAgICAgcmV0dXJuIHsgaXNUb2tlbjogZmFsc2UsIHZhbHVlOiBcIidcIiB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHN1YnN0cmluZ1swXTtcbiAgICAgIGlmIChmaXJzdENoYXJhY3RlciA9PT0gXCInXCIpIHtcbiAgICAgICAgcmV0dXJuIHsgaXNUb2tlbjogZmFsc2UsIHZhbHVlOiBjbGVhbkVzY2FwZWRTdHJpbmcoc3Vic3RyaW5nKSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoX2luZGV4My5mb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXSkge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiB0cnVlLCB2YWx1ZTogc3Vic3RyaW5nIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgXCJGb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXIgYFwiICtcbiAgICAgICAgICAgIGZpcnN0Q2hhcmFjdGVyICtcbiAgICAgICAgICAgIFwiYFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IHN1YnN0cmluZyB9O1xuICAgIH0pO1xuXG4gIC8vIGludm9rZSBsb2NhbGl6ZSBwcmVwcm9jZXNzb3IgKG9ubHkgZm9yIGZyZW5jaCBsb2NhbGVzIGF0IHRoZSBtb21lbnQpXG4gIGlmIChsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKSB7XG4gICAgcGFydHMgPSBsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKG9yaWdpbmFsRGF0ZSwgcGFydHMpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgd2Vla1N0YXJ0c09uLFxuICAgIGxvY2FsZSxcbiAgfTtcblxuICByZXR1cm4gcGFydHNcbiAgICAubWFwKChwYXJ0KSA9PiB7XG4gICAgICBpZiAoIXBhcnQuaXNUb2tlbikgcmV0dXJuIHBhcnQudmFsdWU7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gcGFydC52YWx1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICAoIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJlxuICAgICAgICAgICgwLCBfaW5kZXg1LmlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbikodG9rZW4pKSB8fFxuICAgICAgICAoIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnMgJiZcbiAgICAgICAgICAoMCwgX2luZGV4NS5pc1Byb3RlY3RlZERheU9mWWVhclRva2VuKSh0b2tlbikpXG4gICAgICApIHtcbiAgICAgICAgKDAsIF9pbmRleDUud2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcikodG9rZW4sIGZvcm1hdFN0ciwgU3RyaW5nKGRhdGUpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0dGVyID0gX2luZGV4My5mb3JtYXR0ZXJzW3Rva2VuWzBdXTtcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIob3JpZ2luYWxEYXRlLCB0b2tlbiwgbG9jYWxlLmxvY2FsaXplLCBmb3JtYXR0ZXJPcHRpb25zKTtcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpO1xufVxuXG5mdW5jdGlvbiBjbGVhbkVzY2FwZWRTdHJpbmcoaW5wdXQpIHtcbiAgY29uc3QgbWF0Y2hlZCA9IGlucHV0Lm1hdGNoKGVzY2FwZWRTdHJpbmdSZWdFeHApO1xuXG4gIGlmICghbWF0Y2hlZCkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVkWzFdLnJlcGxhY2UoZG91YmxlUXVvdGVSZWdFeHAsIFwiJ1wiKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXREYXRlID0gZ2V0RGF0ZTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0RGF0ZVxuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGRheSBvZiB0aGUgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGRheSBvZiB0aGUgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2YgbW9udGhcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggZGF5IG9mIHRoZSBtb250aCBpcyAyOSBGZWJydWFyeSAyMDEyP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0RGF0ZShuZXcgRGF0ZSgyMDEyLCAxLCAyOSkpXG4gKiAvLz0+IDI5XG4gKi9cbmZ1bmN0aW9uIGdldERhdGUoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGF5T2ZNb250aCA9IF9kYXRlLmdldERhdGUoKTtcbiAgcmV0dXJuIGRheU9mTW9udGg7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0RGF5ID0gZ2V0RGF5O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXREYXlcbiAqIEBjYXRlZ29yeSBXZWVrZGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2Ygd2VlaywgMCByZXByZXNlbnRzIFN1bmRheVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBkYXkgb2YgdGhlIHdlZWsgaXMgMjkgRmVicnVhcnkgMjAxMj9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldERheShuZXcgRGF0ZSgyMDEyLCAxLCAyOSkpXG4gKiAvLz0+IDNcbiAqL1xuZnVuY3Rpb24gZ2V0RGF5KGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpO1xuICByZXR1cm4gZGF5O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldERheU9mWWVhciA9IGdldERheU9mWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZZZWFyLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0RGF5T2ZZZWFyXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgZGF5IG9mIHRoZSB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2YgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBkYXkgb2YgdGhlIHllYXIgaXMgMiBKdWx5IDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBnZXREYXlPZlllYXIobmV3IERhdGUoMjAxNCwgNiwgMikpXG4gKiAvLz0+IDE4M1xuICovXG5mdW5jdGlvbiBnZXREYXlPZlllYXIoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgzLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRpZmYgPSAoMCwgX2luZGV4LmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cykoXG4gICAgX2RhdGUsXG4gICAgKDAsIF9pbmRleDIuc3RhcnRPZlllYXIpKF9kYXRlKSxcbiAgKTtcbiAgY29uc3QgZGF5T2ZZZWFyID0gZGlmZiArIDE7XG4gIHJldHVybiBkYXlPZlllYXI7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0RGF5c0luTW9udGggPSBnZXREYXlzSW5Nb250aDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0RGF5c0luTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIG1vbnRoXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGRheXMgYXJlIGluIEZlYnJ1YXJ5IDIwMDA/XG4gKiBjb25zdCByZXN1bHQgPSBnZXREYXlzSW5Nb250aChuZXcgRGF0ZSgyMDAwLCAxKSlcbiAqIC8vPT4gMjlcbiAqL1xuZnVuY3Rpb24gZ2V0RGF5c0luTW9udGgoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG1vbnRoSW5kZXggPSBfZGF0ZS5nZXRNb250aCgpO1xuICBjb25zdCBsYXN0RGF5T2ZNb250aCA9ICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBsYXN0RGF5T2ZNb250aC5zZXRGdWxsWWVhcih5ZWFyLCBtb250aEluZGV4ICsgMSwgMCk7XG4gIGxhc3REYXlPZk1vbnRoLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gbGFzdERheU9mTW9udGguZ2V0RGF0ZSgpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldERlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnM7XG5cbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldERlZmF1bHRPcHRpb25zXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCBkZWZhdWx0IG9wdGlvbnMuXG4gKiBAcHVyZSBmYWxzZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBkZWZhdWx0cyBmb3JcbiAqIGBvcHRpb25zLmxvY2FsZWAsIGBvcHRpb25zLndlZWtTdGFydHNPbmAgYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWBcbiAqIGFyZ3VtZW50cyBmb3IgYWxsIGZ1bmN0aW9ucy5cbiAqXG4gKiBZb3UgY2FuIGNoYW5nZSB0aGVzZSB3aXRoIFtzZXREZWZhdWx0T3B0aW9uc10oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9zZXREZWZhdWx0T3B0aW9ucykuXG4gKlxuICogQHJldHVybnMgVGhlIGRlZmF1bHQgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByZXN1bHQgPSBnZXREZWZhdWx0T3B0aW9ucygpXG4gKiAvLz0+IHt9XG4gKlxuICogQGV4YW1wbGVcbiAqIHNldERlZmF1bHRPcHRpb25zKHsgd2Vla1N0YXJzT246IDEsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCB9KVxuICogY29uc3QgcmVzdWx0ID0gZ2V0RGVmYXVsdE9wdGlvbnMoKVxuICogLy89PiB7IHdlZWtTdGFyc09uOiAxLCBmaXJzdFdlZWtDb250YWluc0RhdGU6IDQgfVxuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sICgwLCBfaW5kZXguZ2V0RGVmYXVsdE9wdGlvbnMpKCkpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldEhvdXJzID0gZ2V0SG91cnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldEhvdXJzXG4gKiBAY2F0ZWdvcnkgSG91ciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGhvdXJzIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBob3VycyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGhvdXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEdldCB0aGUgaG91cnMgb2YgMjkgRmVicnVhcnkgMjAxMiAxMTo0NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGdldEhvdXJzKG5ldyBEYXRlKDIwMTIsIDEsIDI5LCAxMSwgNDUpKVxuICogLy89PiAxMVxuICovXG5mdW5jdGlvbiBnZXRIb3VycyhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBob3VycyA9IF9kYXRlLmdldEhvdXJzKCk7XG4gIHJldHVybiBob3Vycztcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRJU09EYXkgPSBnZXRJU09EYXk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldElTT0RheVxuICogQGNhdGVnb3J5IFdlZWtkYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLFxuICogd2hpY2ggaXMgNyBmb3IgU3VuZGF5LCAxIGZvciBNb25kYXkgZXRjLlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGRheSBvZiBJU08gd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBkYXkgb2YgdGhlIElTTyB3ZWVrIGlzIDI2IEZlYnJ1YXJ5IDIwMTI/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09EYXkobmV3IERhdGUoMjAxMiwgMSwgMjYpKVxuICogLy89PiA3XG4gKi9cbmZ1bmN0aW9uIGdldElTT0RheShkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBsZXQgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7XG5cbiAgaWYgKGRheSA9PT0gMCkge1xuICAgIGRheSA9IDc7XG4gIH1cblxuICByZXR1cm4gZGF5O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldElTT1dlZWsgPSBnZXRJU09XZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZklTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZJU09XZWVrWWVhci5qc1wiKTtcbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldElTT1dlZWtcbiAqIEBjYXRlZ29yeSBJU08gV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIElTTyB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBJU08gd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG9mIHRoZSBJU08td2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldElTT1dlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDUzXG4gKi9cbmZ1bmN0aW9uIGdldElTT1dlZWsoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXg0LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRpZmYgPVxuICAgICsoMCwgX2luZGV4Mi5zdGFydE9mSVNPV2VlaykoX2RhdGUpIC1cbiAgICArKDAsIF9pbmRleDMuc3RhcnRPZklTT1dlZWtZZWFyKShfZGF0ZSk7XG5cbiAgLy8gUm91bmQgdGhlIG51bWJlciBvZiB3ZWVrcyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGJlY2F1c2UgdGhlIG51bWJlciBvZlxuICAvLyBtaWxsaXNlY29uZHMgaW4gYSB3ZWVrIGlzIG5vdCBjb25zdGFudCAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZlxuICAvLyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpLlxuICByZXR1cm4gTWF0aC5yb3VuZChkaWZmIC8gX2luZGV4Lm1pbGxpc2Vjb25kc0luV2VlaykgKyAxO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldElTT1dlZWtZZWFyID0gZ2V0SVNPV2Vla1llYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZklTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLFxuICogd2hpY2ggYWx3YXlzIHN0YXJ0cyAzIGRheXMgYmVmb3JlIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXkuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCAwLCAyKSlcbiAqIC8vPT4gMjAwNFxuICovXG5mdW5jdGlvbiBnZXRJU09XZWVrWWVhcihkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDMudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhciA9ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mTmV4dFllYXIgPSAoMCwgX2luZGV4Mi5zdGFydE9mSVNPV2VlaykoXG4gICAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhcixcbiAgKTtcblxuICBjb25zdCBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyID0gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZlRoaXNZZWFyID0gKDAsIF9pbmRleDIuc3RhcnRPZklTT1dlZWspKFxuICAgIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIsXG4gICk7XG5cbiAgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mTmV4dFllYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0TWludXRlcyA9IGdldE1pbnV0ZXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldE1pbnV0ZXNcbiAqIEBjYXRlZ29yeSBNaW51dGUgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBtaW51dGVzIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBtaW51dGVzIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbWludXRlc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZXQgdGhlIG1pbnV0ZXMgb2YgMjkgRmVicnVhcnkgMjAxMiAxMTo0NTowNTpcbiAqIGNvbnN0IHJlc3VsdCA9IGdldE1pbnV0ZXMobmV3IERhdGUoMjAxMiwgMSwgMjksIDExLCA0NSwgNSkpXG4gKiAvLz0+IDQ1XG4gKi9cbmZ1bmN0aW9uIGdldE1pbnV0ZXMoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgbWludXRlcyA9IF9kYXRlLmdldE1pbnV0ZXMoKTtcbiAgcmV0dXJuIG1pbnV0ZXM7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0TW9udGggPSBnZXRNb250aDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0TW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBtb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG1vbnRoIGluZGV4ICgwLTExKVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBtb250aCBpcyAyOSBGZWJydWFyeSAyMDEyP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0TW9udGgobmV3IERhdGUoMjAxMiwgMSwgMjkpKVxuICogLy89PiAxXG4gKi9cbmZ1bmN0aW9uIGdldE1vbnRoKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IG1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTtcbiAgcmV0dXJuIG1vbnRoO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFF1YXJ0ZXIgPSBnZXRRdWFydGVyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRRdWFydGVyXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHllYXIgcXVhcnRlciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgeWVhciBxdWFydGVyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgcXVhcnRlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBxdWFydGVyIGlzIDIgSnVseSAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0UXVhcnRlcihuZXcgRGF0ZSgyMDE0LCA2LCAyKSlcbiAqIC8vPT4gM1xuICovXG5mdW5jdGlvbiBnZXRRdWFydGVyKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLnRydW5jKF9kYXRlLmdldE1vbnRoKCkgLyAzKSArIDE7XG4gIHJldHVybiBxdWFydGVyO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFNlY29uZHMgPSBnZXRTZWNvbmRzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRTZWNvbmRzXG4gKiBAY2F0ZWdvcnkgU2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgc2Vjb25kcyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgc2Vjb25kcyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHNlY29uZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2V0IHRoZSBzZWNvbmRzIG9mIDI5IEZlYnJ1YXJ5IDIwMTIgMTE6NDU6MDUuMTIzOlxuICogY29uc3QgcmVzdWx0ID0gZ2V0U2Vjb25kcyhuZXcgRGF0ZSgyMDEyLCAxLCAyOSwgMTEsIDQ1LCA1LCAxMjMpKVxuICogLy89PiA1XG4gKi9cbmZ1bmN0aW9uIGdldFNlY29uZHMoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3Qgc2Vjb25kcyA9IF9kYXRlLmdldFNlY29uZHMoKTtcbiAgcmV0dXJuIHNlY29uZHM7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0VGltZSA9IGdldFRpbWU7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldFRpbWVcbiAqIEBjYXRlZ29yeSBUaW1lc3RhbXAgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBtaWxsaXNlY29uZHMgdGltZXN0YW1wIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBtaWxsaXNlY29uZHMgdGltZXN0YW1wIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgdGltZXN0YW1wXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEdldCB0aGUgdGltZXN0YW1wIG9mIDI5IEZlYnJ1YXJ5IDIwMTIgMTE6NDU6MDUuMTIzOlxuICogY29uc3QgcmVzdWx0ID0gZ2V0VGltZShuZXcgRGF0ZSgyMDEyLCAxLCAyOSwgMTEsIDQ1LCA1LCAxMjMpKVxuICogLy89PiAxMzMwNTE1OTA1MTIzXG4gKi9cbmZ1bmN0aW9uIGdldFRpbWUoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgdGltZXN0YW1wID0gX2RhdGUuZ2V0VGltZSgpO1xuICByZXR1cm4gdGltZXN0YW1wO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFdlZWsgPSBnZXRXZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZldlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZXZWVrWWVhci5qc1wiKTtcbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0V2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGdldFdlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbG9jYWwgd2VlayBpbmRleCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbG9jYWwgd2VlayBpbmRleCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG9mIHRoZSBsb2NhbCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1IHdpdGggZGVmYXVsdCBvcHRpb25zP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2VlayhuZXcgRGF0ZSgyMDA1LCAwLCAyKSlcbiAqIC8vPT4gMlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG9mIHRoZSBsb2NhbCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1LFxuICogLy8gaWYgTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWssXG4gKiAvLyBhbmQgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIgYWx3YXlzIGNvbnRhaW5zIDQgSmFudWFyeT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMiksIHtcbiAqICAgd2Vla1N0YXJ0c09uOiAxLFxuICogICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDRcbiAqIH0pXG4gKiAvLz0+IDUzXG4gKi9cblxuZnVuY3Rpb24gZ2V0V2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDQudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGlmZiA9XG4gICAgKygwLCBfaW5kZXgyLnN0YXJ0T2ZXZWVrKShfZGF0ZSwgb3B0aW9ucykgLVxuICAgICsoMCwgX2luZGV4My5zdGFydE9mV2Vla1llYXIpKF9kYXRlLCBvcHRpb25zKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBfaW5kZXgubWlsbGlzZWNvbmRzSW5XZWVrKSArIDE7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0V2Vla1llYXIgPSBnZXRXZWVrWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zdGFydE9mV2Vlay5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIik7XG5cbi8qKlxuICogVGhlIHtAbGluayBnZXRXZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGdldFdlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIFRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSlcbiAqIC8vPT4gMjAwNVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgaWYgd2VlayBzdGFydHMgb24gU2F0dXJkYXk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpLCB7IHdlZWtTdGFydHNPbjogNiB9KVxuICogLy89PiAyMDA0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB0aGUgZmlyc3Qgd2VlayBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpLCB7IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCB9KVxuICogLy89PiAyMDA0XG4gKi9cbmZ1bmN0aW9uIGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4My50b0RhdGUpKGRhdGUpO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcblxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9ICgwLCBfaW5kZXg0LmdldERlZmF1bHRPcHRpb25zKSgpO1xuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IGZpcnN0V2Vla09mTmV4dFllYXIgPSAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mTmV4dFllYXIgPSAoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoXG4gICAgZmlyc3RXZWVrT2ZOZXh0WWVhcixcbiAgICBvcHRpb25zLFxuICApO1xuXG4gIGNvbnN0IGZpcnN0V2Vla09mVGhpc1llYXIgPSAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZUaGlzWWVhciA9ICgwLCBfaW5kZXgyLnN0YXJ0T2ZXZWVrKShcbiAgICBmaXJzdFdlZWtPZlRoaXNZZWFyLFxuICAgIG9wdGlvbnMsXG4gICk7XG5cbiAgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mTmV4dFllYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0WWVhciA9IGdldFllYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldFllYXJcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggeWVhciBpcyAyIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFllYXIobmV3IERhdGUoMjAxNCwgNiwgMikpXG4gKiAvLz0+IDIwMTRcbiAqL1xuZnVuY3Rpb24gZ2V0WWVhcihkYXRlKSB7XG4gIHJldHVybiAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSkuZ2V0RnVsbFllYXIoKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc0FmdGVyID0gaXNBZnRlcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNBZnRlclxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZmlyc3QgZGF0ZSBhZnRlciB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIElzIHRoZSBmaXJzdCBkYXRlIGFmdGVyIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdGhhdCBzaG91bGQgYmUgYWZ0ZXIgdGhlIG90aGVyIG9uZSB0byByZXR1cm4gdHJ1ZVxuICogQHBhcmFtIGRhdGVUb0NvbXBhcmUgLSBUaGUgZGF0ZSB0byBjb21wYXJlIHdpdGhcbiAqXG4gKiBAcmV0dXJucyBUaGUgZmlyc3QgZGF0ZSBpcyBhZnRlciB0aGUgc2Vjb25kIGRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSXMgMTAgSnVseSAxOTg5IGFmdGVyIDExIEZlYnJ1YXJ5IDE5ODc/XG4gKiBjb25zdCByZXN1bHQgPSBpc0FmdGVyKG5ldyBEYXRlKDE5ODksIDYsIDEwKSwgbmV3IERhdGUoMTk4NywgMSwgMTEpKVxuICogLy89PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzQWZ0ZXIoZGF0ZSwgZGF0ZVRvQ29tcGFyZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgX2RhdGVUb0NvbXBhcmUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVRvQ29tcGFyZSk7XG4gIHJldHVybiBfZGF0ZS5nZXRUaW1lKCkgPiBfZGF0ZVRvQ29tcGFyZS5nZXRUaW1lKCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNCZWZvcmUgPSBpc0JlZm9yZTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNCZWZvcmVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGZpcnN0IGRhdGUgYmVmb3JlIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSXMgdGhlIGZpcnN0IGRhdGUgYmVmb3JlIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdGhhdCBzaG91bGQgYmUgYmVmb3JlIHRoZSBvdGhlciBvbmUgdG8gcmV0dXJuIHRydWVcbiAqIEBwYXJhbSBkYXRlVG9Db21wYXJlIC0gVGhlIGRhdGUgdG8gY29tcGFyZSB3aXRoXG4gKlxuICogQHJldHVybnMgVGhlIGZpcnN0IGRhdGUgaXMgYmVmb3JlIHRoZSBzZWNvbmQgZGF0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJcyAxMCBKdWx5IDE5ODkgYmVmb3JlIDExIEZlYnJ1YXJ5IDE5ODc/XG4gKiBjb25zdCByZXN1bHQgPSBpc0JlZm9yZShuZXcgRGF0ZSgxOTg5LCA2LCAxMCksIG5ldyBEYXRlKDE5ODcsIDEsIDExKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCZWZvcmUoZGF0ZSwgZGF0ZVRvQ29tcGFyZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgX2RhdGVUb0NvbXBhcmUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVRvQ29tcGFyZSk7XG4gIHJldHVybiArX2RhdGUgPCArX2RhdGVUb0NvbXBhcmU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlOyAvKipcbiAqIEBuYW1lIGlzRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSBkYXRlP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLiBUaGUgZnVuY3Rpb24gd29ya3MgZm9yIGRhdGVzIHRyYW5zZmVycmVkIGFjcm9zcyBpZnJhbWVzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgZGF0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgYSB2YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNEYXRlKG5ldyBEYXRlKCkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGFuIGludmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZShOYU4pKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBzb21lIHZhbHVlOlxuICogY29uc3QgcmVzdWx0ID0gaXNEYXRlKCcyMDE0LTAyLTMxJylcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGFuIG9iamVjdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSh7fSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gXCJbb2JqZWN0IERhdGVdXCIpXG4gICk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNFcXVhbCA9IGlzRXF1YWw7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzRXF1YWxcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBlcXVhbD9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgZXF1YWw/XG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGZpcnN0IGRhdGUgdG8gY29tcGFyZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBzZWNvbmQgZGF0ZSB0byBjb21wYXJlXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGVzIGFyZSBlcXVhbFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMiBKdWx5IDIwMTQgMDY6MzA6NDUuMDAwIGFuZCAyIEp1bHkgMjAxNCAwNjozMDo0NS41MDAgZXF1YWw/XG4gKiBjb25zdCByZXN1bHQgPSBpc0VxdWFsKFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCAyLCA2LCAzMCwgNDUsIDApLFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCAyLCA2LCAzMCwgNDUsIDUwMClcbiAqIClcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNFcXVhbChsZWZ0RGF0ZSwgcmlnaHREYXRlKSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgudG9EYXRlKShsZWZ0RGF0ZSk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSAoMCwgX2luZGV4LnRvRGF0ZSkocmlnaHREYXRlKTtcbiAgcmV0dXJuICtfZGF0ZUxlZnQgPT09ICtfZGF0ZVJpZ2h0O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzU2FtZURheSA9IGlzU2FtZURheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9zdGFydE9mRGF5LmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzU2FtZURheVxuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIGRheSAoYW5kIHllYXIgYW5kIG1vbnRoKT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgZGF5IChhbmQgeWVhciBhbmQgbW9udGgpP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIHNlY29uZCBkYXRlIHRvIGNoZWNrXG5cbiAqIEByZXR1cm5zIFRoZSBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgZGF5IChhbmQgeWVhciBhbmQgbW9udGgpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSA0IFNlcHRlbWJlciAwNjowMDowMCBhbmQgNCBTZXB0ZW1iZXIgMTg6MDA6MDAgaW4gdGhlIHNhbWUgZGF5P1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDQsIDYsIDApLCBuZXcgRGF0ZSgyMDE0LCA4LCA0LCAxOCwgMCkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDQgU2VwdGVtYmVyIGFuZCA0IE9jdG9iZXIgaW4gdGhlIHNhbWUgZGF5P1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDQpLCBuZXcgRGF0ZSgyMDE0LCA5LCA0KSlcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDQgU2VwdGVtYmVyLCAyMDE0IGFuZCA0IFNlcHRlbWJlciwgMjAxNSBpbiB0aGUgc2FtZSBkYXk/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVEYXkobmV3IERhdGUoMjAxNCwgOCwgNCksIG5ldyBEYXRlKDIwMTUsIDgsIDQpKVxuICogLy89PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1NhbWVEYXkoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBkYXRlTGVmdFN0YXJ0T2ZEYXkgPSAoMCwgX2luZGV4LnN0YXJ0T2ZEYXkpKGRhdGVMZWZ0KTtcbiAgY29uc3QgZGF0ZVJpZ2h0U3RhcnRPZkRheSA9ICgwLCBfaW5kZXguc3RhcnRPZkRheSkoZGF0ZVJpZ2h0KTtcblxuICByZXR1cm4gK2RhdGVMZWZ0U3RhcnRPZkRheSA9PT0gK2RhdGVSaWdodFN0YXJ0T2ZEYXk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNTYW1lTW9udGggPSBpc1NhbWVNb250aDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNTYW1lTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIG1vbnRoIChhbmQgeWVhcik/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIG1vbnRoIChhbmQgeWVhcik/XG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgc2Vjb25kIGRhdGUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF0ZXMgYXJlIGluIHRoZSBzYW1lIG1vbnRoIChhbmQgeWVhcilcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDIgU2VwdGVtYmVyIDIwMTQgYW5kIDI1IFNlcHRlbWJlciAyMDE0IGluIHRoZSBzYW1lIG1vbnRoP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiksIG5ldyBEYXRlKDIwMTQsIDgsIDI1KSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMiBTZXB0ZW1iZXIgMjAxNCBhbmQgMjUgU2VwdGVtYmVyIDIwMTUgaW4gdGhlIHNhbWUgbW9udGg/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAyKSwgbmV3IERhdGUoMjAxNSwgOCwgMjUpKVxuICogLy89PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1NhbWVNb250aChkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlTGVmdCk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVJpZ2h0KTtcbiAgcmV0dXJuIChcbiAgICBfZGF0ZUxlZnQuZ2V0RnVsbFllYXIoKSA9PT0gX2RhdGVSaWdodC5nZXRGdWxsWWVhcigpICYmXG4gICAgX2RhdGVMZWZ0LmdldE1vbnRoKCkgPT09IF9kYXRlUmlnaHQuZ2V0TW9udGgoKVxuICApO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzU2FtZVF1YXJ0ZXIgPSBpc1NhbWVRdWFydGVyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZRdWFydGVyLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzU2FtZVF1YXJ0ZXJcbiAqIEBjYXRlZ29yeSBRdWFydGVyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgcXVhcnRlciAoYW5kIHllYXIpP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBxdWFydGVyIChhbmQgeWVhcik/XG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgc2Vjb25kIGRhdGUgdG8gY2hlY2tcblxuICogQHJldHVybnMgVGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSBxdWFydGVyIChhbmQgeWVhcilcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDEgSmFudWFyeSAyMDE0IGFuZCA4IE1hcmNoIDIwMTQgaW4gdGhlIHNhbWUgcXVhcnRlcj9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZVF1YXJ0ZXIobmV3IERhdGUoMjAxNCwgMCwgMSksIG5ldyBEYXRlKDIwMTQsIDIsIDgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAxIEphbnVhcnkgMjAxNCBhbmQgMSBKYW51YXJ5IDIwMTUgaW4gdGhlIHNhbWUgcXVhcnRlcj9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZVF1YXJ0ZXIobmV3IERhdGUoMjAxNCwgMCwgMSksIG5ldyBEYXRlKDIwMTUsIDAsIDEpKVxuICogLy89PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1NhbWVRdWFydGVyKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgZGF0ZUxlZnRTdGFydE9mUXVhcnRlciA9ICgwLCBfaW5kZXguc3RhcnRPZlF1YXJ0ZXIpKGRhdGVMZWZ0KTtcbiAgY29uc3QgZGF0ZVJpZ2h0U3RhcnRPZlF1YXJ0ZXIgPSAoMCwgX2luZGV4LnN0YXJ0T2ZRdWFydGVyKShkYXRlUmlnaHQpO1xuXG4gIHJldHVybiArZGF0ZUxlZnRTdGFydE9mUXVhcnRlciA9PT0gK2RhdGVSaWdodFN0YXJ0T2ZRdWFydGVyO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzU2FtZVllYXIgPSBpc1NhbWVZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc1NhbWVZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIHllYXI/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIHllYXI/XG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgc2Vjb25kIGRhdGUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF0ZXMgYXJlIGluIHRoZSBzYW1lIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDIgU2VwdGVtYmVyIDIwMTQgYW5kIDI1IFNlcHRlbWJlciAyMDE0IGluIHRoZSBzYW1lIHllYXI/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDIpLCBuZXcgRGF0ZSgyMDE0LCA4LCAyNSkpXG4gKiAvLz0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNTYW1lWWVhcihkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlTGVmdCk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVJpZ2h0KTtcbiAgcmV0dXJuIF9kYXRlTGVmdC5nZXRGdWxsWWVhcigpID09PSBfZGF0ZVJpZ2h0LmdldEZ1bGxZZWFyKCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNWYWxpZCA9IGlzVmFsaWQ7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vaXNEYXRlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNWYWxpZFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gZGF0ZSB2YWxpZD9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgZmFsc2UgaWYgYXJndW1lbnQgaXMgSW52YWxpZCBEYXRlIGFuZCB0cnVlIG90aGVyd2lzZS5cbiAqIEFyZ3VtZW50IGlzIGNvbnZlcnRlZCB0byBEYXRlIHVzaW5nIGB0b0RhdGVgLiBTZWUgW3RvRGF0ZV0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy90b0RhdGUpXG4gKiBJbnZhbGlkIERhdGUgaXMgYSBEYXRlLCB3aG9zZSB0aW1lIHZhbHVlIGlzIE5hTi5cbiAqXG4gKiBUaW1lIHZhbHVlIG9mIERhdGU6IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuOS4xLjFcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGUgaXMgdmFsaWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZChuZXcgRGF0ZSgyMDE0LCAxLCAzMSkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWx1ZSwgY29udmVydGFibGUgaW50byBhIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKDEzOTM4MDQ4MDAwMDApXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKG5ldyBEYXRlKCcnKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZChkYXRlKSB7XG4gIGlmICghKDAsIF9pbmRleC5pc0RhdGUpKGRhdGUpICYmIHR5cGVvZiBkYXRlICE9PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlKTtcbiAgcmV0dXJuICFpc05hTihOdW1iZXIoX2RhdGUpKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc1dpdGhpbkludGVydmFsID0gaXNXaXRoaW5JbnRlcnZhbDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNXaXRoaW5JbnRlcnZhbFxuICogQGNhdGVnb3J5IEludGVydmFsIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBnaXZlbiBkYXRlIHdpdGhpbiB0aGUgaW50ZXJ2YWw/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJcyB0aGUgZ2l2ZW4gZGF0ZSB3aXRoaW4gdGhlIGludGVydmFsPyAoSW5jbHVkaW5nIHN0YXJ0IGFuZCBlbmQuKVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSBpbnRlcnZhbCAtIFRoZSBpbnRlcnZhbCB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIFRoZSBkYXRlIGlzIHdpdGhpbiB0aGUgaW50ZXJ2YWxcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSBkYXRlIHdpdGhpbiB0aGUgaW50ZXJ2YWw6XG4gKiBpc1dpdGhpbkludGVydmFsKG5ldyBEYXRlKDIwMTQsIDAsIDMpLCB7XG4gKiAgIHN0YXJ0OiBuZXcgRGF0ZSgyMDE0LCAwLCAxKSxcbiAqICAgZW5kOiBuZXcgRGF0ZSgyMDE0LCAwLCA3KVxuICogfSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIGRhdGUgb3V0c2lkZSBvZiB0aGUgaW50ZXJ2YWw6XG4gKiBpc1dpdGhpbkludGVydmFsKG5ldyBEYXRlKDIwMTQsIDAsIDEwKSwge1xuICogICBzdGFydDogbmV3IERhdGUoMjAxNCwgMCwgMSksXG4gKiAgIGVuZDogbmV3IERhdGUoMjAxNCwgMCwgNylcbiAqIH0pXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBkYXRlIGVxdWFsIHRvIGludGVydmFsIHN0YXJ0OlxuICogaXNXaXRoaW5JbnRlcnZhbChkYXRlLCB7IHN0YXJ0LCBlbmQ6IGRhdGUgfSlcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGRhdGUgZXF1YWwgdG8gaW50ZXJ2YWwgZW5kOlxuICogaXNXaXRoaW5JbnRlcnZhbChkYXRlLCB7IHN0YXJ0OiBkYXRlLCBlbmQgfSlcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNXaXRoaW5JbnRlcnZhbChkYXRlLCBpbnRlcnZhbCkge1xuICBjb25zdCB0aW1lID0gKygwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgW3N0YXJ0VGltZSwgZW5kVGltZV0gPSBbXG4gICAgKygwLCBfaW5kZXgudG9EYXRlKShpbnRlcnZhbC5zdGFydCksXG4gICAgKygwLCBfaW5kZXgudG9EYXRlKShpbnRlcnZhbC5lbmQpLFxuICBdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcblxuICByZXR1cm4gdGltZSA+PSBzdGFydFRpbWUgJiYgdGltZSA8PSBlbmRUaW1lO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmJ1aWxkRm9ybWF0TG9uZ0ZuID0gYnVpbGRGb3JtYXRMb25nRm47XG5cbmZ1bmN0aW9uIGJ1aWxkRm9ybWF0TG9uZ0ZuKGFyZ3MpIHtcbiAgcmV0dXJuIChvcHRpb25zID0ge30pID0+IHtcbiAgICAvLyBUT0RPOiBSZW1vdmUgU3RyaW5nKClcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICBjb25zdCBmb3JtYXQgPSBhcmdzLmZvcm1hdHNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0c1thcmdzLmRlZmF1bHRXaWR0aF07XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5idWlsZExvY2FsaXplRm4gPSBidWlsZExvY2FsaXplRm47IC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cbi8qKlxuICogVGhlIGxvY2FsaXplIGZ1bmN0aW9uIGFyZ3VtZW50IGNhbGxiYWNrIHdoaWNoIGFsbG93cyB0byBjb252ZXJ0IHJhdyB2YWx1ZSB0b1xuICogdGhlIGFjdHVhbCB0eXBlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gKlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCB2YWx1ZVxuICovXG5cbi8qKlxuICogVGhlIG1hcCBvZiBsb2NhbGl6ZWQgdmFsdWVzIGZvciBlYWNoIHdpZHRoLlxuICovXG5cbi8qKlxuICogVGhlIGluZGV4IHR5cGUgb2YgdGhlIGxvY2FsZSB1bml0IHZhbHVlLiBJdCB0eXBlcyBjb252ZXJzaW9uIG9mIHVuaXRzIG9mXG4gKiB2YWx1ZXMgdGhhdCBkb24ndCBzdGFydCBhdCAwIChpLmUuIHF1YXJ0ZXJzKS5cbiAqL1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSB1bml0IHZhbHVlIHRvIHRoZSB0dXBsZSBvZiB2YWx1ZXMuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIGVyYSB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgQkMsXG4gKiB0aGUgc2Vjb25kIGVsZW1lbnQgcmVwcmVzZW50cyBBRC5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgcXVhcnRlciB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgUTEuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIGRheSB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgU3VuZGF5LlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBtb250aCB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgSmFudWFyeS5cbiAqL1xuXG5mdW5jdGlvbiBidWlsZExvY2FsaXplRm4oYXJncykge1xuICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPyBTdHJpbmcob3B0aW9ucy5jb250ZXh0KSA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgbGV0IHZhbHVlc0FycmF5O1xuICAgIGlmIChjb250ZXh0ID09PSBcImZvcm1hdHRpbmdcIiAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdEZvcm1hdHRpbmdXaWR0aCB8fCBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBkZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID1cbiAgICAgICAgYXJncy5mb3JtYXR0aW5nVmFsdWVzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbZGVmYXVsdFdpZHRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID0gYXJncy52YWx1ZXNbd2lkdGhdIHx8IGFyZ3MudmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEZvciBzb21lIHJlYXNvbiBUeXBlU2NyaXB0IGp1c3QgZG9uJ3Qgd2FudCB0byBtYXRjaCBpdCwgbm8gbWF0dGVyIGhvdyBoYXJkIHdlIHRyeS4gSSBjaGFsbGVuZ2UgeW91IHRvIHRyeSB0byByZW1vdmUgaXQhXG4gICAgcmV0dXJuIHZhbHVlc0FycmF5W2luZGV4XTtcbiAgfTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5idWlsZE1hdGNoRm4gPSBidWlsZE1hdGNoRm47XG5cbmZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGg7XG5cbiAgICBjb25zdCBtYXRjaFBhdHRlcm4gPVxuICAgICAgKHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0pIHx8XG4gICAgICBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2gobWF0Y2hQYXR0ZXJuKTtcblxuICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVBhdHRlcm5zID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLnBhcnNlUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuXG4gICAgY29uc3Qga2V5ID0gQXJyYXkuaXNBcnJheShwYXJzZVBhdHRlcm5zKVxuICAgICAgPyBmaW5kSW5kZXgocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSlcbiAgICAgIDogLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gSSBjaGFsbGFuZ2UgeW91IHRvIGZpeCB0aGUgdHlwZVxuICAgICAgICBmaW5kS2V5KHBhcnNlUGF0dGVybnMsIChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZykpO1xuXG4gICAgbGV0IHZhbHVlO1xuXG4gICAgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2sgPyBhcmdzLnZhbHVlQ2FsbGJhY2soa2V5KSA6IGtleTtcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFja1xuICAgICAgPyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBJIGNoYWxsYW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgICAgIG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSlcbiAgICAgIDogdmFsdWU7XG5cbiAgICBjb25zdCByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcblxuICAgIHJldHVybiB7IHZhbHVlLCByZXN0IH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJlxuICAgICAgcHJlZGljYXRlKG9iamVjdFtrZXldKVxuICAgICkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgZm9yIChsZXQga2V5ID0gMDsga2V5IDwgYXJyYXkubGVuZ3RoOyBrZXkrKykge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlba2V5XSkpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYnVpbGRNYXRjaFBhdHRlcm5GbiA9IGJ1aWxkTWF0Y2hQYXR0ZXJuRm47XG5cbmZ1bmN0aW9uIGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oYXJncykge1xuICByZXR1cm4gKHN0cmluZywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5tYXRjaFBhdHRlcm4pO1xuICAgIGlmICghbWF0Y2hSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcblxuICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MucGFyc2VQYXR0ZXJuKTtcbiAgICBpZiAoIXBhcnNlUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBsZXQgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gYXJncy52YWx1ZUNhbGxiYWNrKHBhcnNlUmVzdWx0WzBdKVxuICAgICAgOiBwYXJzZVJlc3VsdFswXTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIEkgY2hhbGxhbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5lblVTID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2VuLVVTL19saWIvZm9ybWF0RGlzdGFuY2UuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2VuLVVTL19saWIvZm9ybWF0TG9uZy5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vZW4tVVMvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qc1wiKTtcbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vZW4tVVMvX2xpYi9sb2NhbGl6ZS5qc1wiKTtcbnZhciBfaW5kZXg1ID0gcmVxdWlyZShcIi4vZW4tVVMvX2xpYi9tYXRjaC5qc1wiKTtcblxuLyoqXG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgRW5nbGlzaCBsb2NhbGUgKFVuaXRlZCBTdGF0ZXMpLlxuICogQGxhbmd1YWdlIEVuZ2xpc2hcbiAqIEBpc28tNjM5LTIgZW5nXG4gKiBAYXV0aG9yIFNhc2hhIEtvc3MgW0Brb3Nzbm9jb3JwXShodHRwczovL2dpdGh1Yi5jb20va29zc25vY29ycClcbiAqIEBhdXRob3IgTGVzaGEgS29zcyBbQGxlc2hha29zc10oaHR0cHM6Ly9naXRodWIuY29tL2xlc2hha29zcylcbiAqL1xuY29uc3QgZW5VUyA9IChleHBvcnRzLmVuVVMgPSB7XG4gIGNvZGU6IFwiZW4tVVNcIixcbiAgZm9ybWF0RGlzdGFuY2U6IF9pbmRleC5mb3JtYXREaXN0YW5jZSxcbiAgZm9ybWF0TG9uZzogX2luZGV4Mi5mb3JtYXRMb25nLFxuICBmb3JtYXRSZWxhdGl2ZTogX2luZGV4My5mb3JtYXRSZWxhdGl2ZSxcbiAgbG9jYWxpemU6IF9pbmRleDQubG9jYWxpemUsXG4gIG1hdGNoOiBfaW5kZXg1Lm1hdGNoLFxuICBvcHRpb25zOiB7XG4gICAgd2Vla1N0YXJ0c09uOiAwIC8qIFN1bmRheSAqLyxcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDEsXG4gIH0sXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5mb3JtYXREaXN0YW5jZSA9IHZvaWQgMDtcblxuY29uc3QgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6IFwibGVzcyB0aGFuIGEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwibGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzXCIsXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBvbmU6IFwiMSBzZWNvbmRcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIGhhbGZBTWludXRlOiBcImhhbGYgYSBtaW51dGVcIixcblxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlc1wiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIjEgbWludXRlXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCJhYm91dCAxIGhvdXJcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gaG91cnNcIixcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBvbmU6IFwiMSBob3VyXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeERheXM6IHtcbiAgICBvbmU6IFwiMSBkYXlcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gZGF5c1wiLFxuICB9LFxuXG4gIGFib3V0WFdlZWtzOiB7XG4gICAgb25lOiBcImFib3V0IDEgd2Vla1wiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB3ZWVrc1wiLFxuICB9LFxuXG4gIHhXZWVrczoge1xuICAgIG9uZTogXCIxIHdlZWtcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICBhYm91dFhNb250aHM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBtb250aFwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSBtb250aHNcIixcbiAgfSxcblxuICB4TW9udGhzOiB7XG4gICAgb25lOiBcIjEgbW9udGhcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgeFllYXJzOiB7XG4gICAgb25lOiBcIjEgeWVhclwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIG92ZXJYWWVhcnM6IHtcbiAgICBvbmU6IFwib3ZlciAxIHllYXJcIixcbiAgICBvdGhlcjogXCJvdmVyIHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogXCJhbG1vc3QgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWxtb3N0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxufTtcblxuY29uc3QgZm9ybWF0RGlzdGFuY2UgPSAodG9rZW4sIGNvdW50LCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQ7XG5cbiAgY29uc3QgdG9rZW5WYWx1ZSA9IGZvcm1hdERpc3RhbmNlTG9jYWxlW3Rva2VuXTtcbiAgaWYgKHR5cGVvZiB0b2tlblZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZTtcbiAgfSBlbHNlIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub25lO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub3RoZXIucmVwbGFjZShcInt7Y291bnR9fVwiLCBjb3VudC50b1N0cmluZygpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5hZGRTdWZmaXgpIHtcbiAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHtcbiAgICAgIHJldHVybiBcImluIFwiICsgcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgXCIgYWdvXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnRzLmZvcm1hdERpc3RhbmNlID0gZm9ybWF0RGlzdGFuY2U7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZm9ybWF0TG9uZyA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vX2xpYi9idWlsZEZvcm1hdExvbmdGbi5qc1wiKTtcblxuY29uc3QgZGF0ZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiRUVFRSwgTU1NTSBkbywgeVwiLFxuICBsb25nOiBcIk1NTU0gZG8sIHlcIixcbiAgbWVkaXVtOiBcIk1NTSBkLCB5XCIsXG4gIHNob3J0OiBcIk1NL2RkL3l5eXlcIixcbn07XG5cbmNvbnN0IHRpbWVGb3JtYXRzID0ge1xuICBmdWxsOiBcImg6bW06c3MgYSB6enp6XCIsXG4gIGxvbmc6IFwiaDptbTpzcyBhIHpcIixcbiAgbWVkaXVtOiBcImg6bW06c3MgYVwiLFxuICBzaG9ydDogXCJoOm1tIGFcIixcbn07XG5cbmNvbnN0IGRhdGVUaW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJ7e2RhdGV9fSAnYXQnIHt7dGltZX19XCIsXG4gIGxvbmc6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBtZWRpdW06IFwie3tkYXRlfX0sIHt7dGltZX19XCIsXG4gIHNob3J0OiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxufTtcblxuY29uc3QgZm9ybWF0TG9uZyA9IChleHBvcnRzLmZvcm1hdExvbmcgPSB7XG4gIGRhdGU6ICgwLCBfaW5kZXguYnVpbGRGb3JtYXRMb25nRm4pKHtcbiAgICBmb3JtYXRzOiBkYXRlRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcblxuICB0aW1lOiAoMCwgX2luZGV4LmJ1aWxkRm9ybWF0TG9uZ0ZuKSh7XG4gICAgZm9ybWF0czogdGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgZGF0ZVRpbWU6ICgwLCBfaW5kZXguYnVpbGRGb3JtYXRMb25nRm4pKHtcbiAgICBmb3JtYXRzOiBkYXRlVGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5mb3JtYXRSZWxhdGl2ZSA9IHZvaWQgMDtcblxuY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcIidsYXN0JyBlZWVlICdhdCcgcFwiLFxuICB5ZXN0ZXJkYXk6IFwiJ3llc3RlcmRheSBhdCcgcFwiLFxuICB0b2RheTogXCIndG9kYXkgYXQnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ3RvbW9ycm93IGF0JyBwXCIsXG4gIG5leHRXZWVrOiBcImVlZWUgJ2F0JyBwXCIsXG4gIG90aGVyOiBcIlBcIixcbn07XG5cbmNvbnN0IGZvcm1hdFJlbGF0aXZlID0gKHRva2VuLCBfZGF0ZSwgX2Jhc2VEYXRlLCBfb3B0aW9ucykgPT5cbiAgZm9ybWF0UmVsYXRpdmVMb2NhbGVbdG9rZW5dO1xuZXhwb3J0cy5mb3JtYXRSZWxhdGl2ZSA9IGZvcm1hdFJlbGF0aXZlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmxvY2FsaXplID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi9fbGliL2J1aWxkTG9jYWxpemVGbi5qc1wiKTtcblxuY29uc3QgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkJcIiwgXCJBXCJdLFxuICBhYmJyZXZpYXRlZDogW1wiQkNcIiwgXCJBRFwiXSxcbiAgd2lkZTogW1wiQmVmb3JlIENocmlzdFwiLCBcIkFubm8gRG9taW5pXCJdLFxufTtcblxuY29uc3QgcXVhcnRlclZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCJdLFxuICBhYmJyZXZpYXRlZDogW1wiUTFcIiwgXCJRMlwiLCBcIlEzXCIsIFwiUTRcIl0sXG4gIHdpZGU6IFtcIjFzdCBxdWFydGVyXCIsIFwiMm5kIHF1YXJ0ZXJcIiwgXCIzcmQgcXVhcnRlclwiLCBcIjR0aCBxdWFydGVyXCJdLFxufTtcblxuLy8gTm90ZTogaW4gRW5nbGlzaCwgdGhlIG5hbWVzIG9mIGRheXMgb2YgdGhlIHdlZWsgYW5kIG1vbnRocyBhcmUgY2FwaXRhbGl6ZWQuXG4vLyBJZiB5b3UgYXJlIG1ha2luZyBhIG5ldyBsb2NhbGUgYmFzZWQgb24gdGhpcyBvbmUsIGNoZWNrIGlmIHRoZSBzYW1lIGlzIHRydWUgZm9yIHRoZSBsYW5ndWFnZSB5b3UncmUgd29ya2luZyBvbi5cbi8vIEdlbmVyYWxseSwgZm9ybWF0dGVkIGRhdGVzIHNob3VsZCBsb29rIGxpa2UgdGhleSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbnRlbmNlLFxuLy8gZS5nLiBpbiBTcGFuaXNoIGxhbmd1YWdlIHRoZSB3ZWVrZGF5cyBhbmQgbW9udGhzIHNob3VsZCBiZSBpbiB0aGUgbG93ZXJjYXNlLlxuY29uc3QgbW9udGhWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiSlwiLCBcIkZcIiwgXCJNXCIsIFwiQVwiLCBcIk1cIiwgXCJKXCIsIFwiSlwiLCBcIkFcIiwgXCJTXCIsIFwiT1wiLCBcIk5cIiwgXCJEXCJdLFxuICBhYmJyZXZpYXRlZDogW1xuICAgIFwiSmFuXCIsXG4gICAgXCJGZWJcIixcbiAgICBcIk1hclwiLFxuICAgIFwiQXByXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1blwiLFxuICAgIFwiSnVsXCIsXG4gICAgXCJBdWdcIixcbiAgICBcIlNlcFwiLFxuICAgIFwiT2N0XCIsXG4gICAgXCJOb3ZcIixcbiAgICBcIkRlY1wiLFxuICBdLFxuXG4gIHdpZGU6IFtcbiAgICBcIkphbnVhcnlcIixcbiAgICBcIkZlYnJ1YXJ5XCIsXG4gICAgXCJNYXJjaFwiLFxuICAgIFwiQXByaWxcIixcbiAgICBcIk1heVwiLFxuICAgIFwiSnVuZVwiLFxuICAgIFwiSnVseVwiLFxuICAgIFwiQXVndXN0XCIsXG4gICAgXCJTZXB0ZW1iZXJcIixcbiAgICBcIk9jdG9iZXJcIixcbiAgICBcIk5vdmVtYmVyXCIsXG4gICAgXCJEZWNlbWJlclwiLFxuICBdLFxufTtcblxuY29uc3QgZGF5VmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIlNcIiwgXCJNXCIsIFwiVFwiLCBcIldcIiwgXCJUXCIsIFwiRlwiLCBcIlNcIl0sXG4gIHNob3J0OiBbXCJTdVwiLCBcIk1vXCIsIFwiVHVcIiwgXCJXZVwiLCBcIlRoXCIsIFwiRnJcIiwgXCJTYVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXSxcbiAgd2lkZTogW1xuICAgIFwiU3VuZGF5XCIsXG4gICAgXCJNb25kYXlcIixcbiAgICBcIlR1ZXNkYXlcIixcbiAgICBcIldlZG5lc2RheVwiLFxuICAgIFwiVGh1cnNkYXlcIixcbiAgICBcIkZyaWRheVwiLFxuICAgIFwiU2F0dXJkYXlcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwiYVwiLFxuICAgIHBtOiBcInBcIixcbiAgICBtaWRuaWdodDogXCJtaVwiLFxuICAgIG5vb246IFwiblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIkFNXCIsXG4gICAgcG06IFwiUE1cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwiYS5tLlwiLFxuICAgIHBtOiBcInAubS5cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxufTtcblxuY29uc3QgZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwiYVwiLFxuICAgIHBtOiBcInBcIixcbiAgICBtaWRuaWdodDogXCJtaVwiLFxuICAgIG5vb246IFwiblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIkFNXCIsXG4gICAgcG06IFwiUE1cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwiYS5tLlwiLFxuICAgIHBtOiBcInAubS5cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxufTtcblxuY29uc3Qgb3JkaW5hbE51bWJlciA9IChkaXJ0eU51bWJlciwgX29wdGlvbnMpID0+IHtcbiAgY29uc3QgbnVtYmVyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTtcblxuICAvLyBJZiBvcmRpbmFsIG51bWJlcnMgZGVwZW5kIG9uIGNvbnRleHQsIGZvciBleGFtcGxlLFxuICAvLyBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBncmFtbWF0aWNhbCBnZW5kZXJzLFxuICAvLyB1c2UgYG9wdGlvbnMudW5pdGAuXG4gIC8vXG4gIC8vIGB1bml0YCBjYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RhdGUnLCAnZGF5T2ZZZWFyJyxcbiAgLy8gJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLlxuXG4gIGNvbnN0IHJlbTEwMCA9IG51bWJlciAlIDEwMDtcbiAgaWYgKHJlbTEwMCA+IDIwIHx8IHJlbTEwMCA8IDEwKSB7XG4gICAgc3dpdGNoIChyZW0xMDAgJSAxMCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJzdFwiO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJuZFwiO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJyZFwiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVtYmVyICsgXCJ0aFwiO1xufTtcblxuY29uc3QgbG9jYWxpemUgPSAoZXhwb3J0cy5sb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcixcblxuICBlcmE6ICgwLCBfaW5kZXguYnVpbGRMb2NhbGl6ZUZuKSh7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogKDAsIF9pbmRleC5idWlsZExvY2FsaXplRm4pKHtcbiAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBhcmd1bWVudENhbGxiYWNrOiAocXVhcnRlcikgPT4gcXVhcnRlciAtIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiAoMCwgX2luZGV4LmJ1aWxkTG9jYWxpemVGbikoe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5OiAoMCwgX2luZGV4LmJ1aWxkTG9jYWxpemVGbikoe1xuICAgIHZhbHVlczogZGF5VmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogKDAsIF9pbmRleC5idWlsZExvY2FsaXplRm4pKHtcbiAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGZvcm1hdHRpbmdWYWx1ZXM6IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMubWF0Y2ggPSB2b2lkIDA7XG5cbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoRm4uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanNcIik7XG5cbmNvbnN0IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXihcXGQrKSh0aHxzdHxuZHxyZCk/L2k7XG5jb25zdCBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL1xcZCsvaTtcblxuY29uc3QgbWF0Y2hFcmFQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihifGEpL2ksXG4gIGFiYnJldmlhdGVkOiAvXihiXFwuP1xccz9jXFwuP3xiXFwuP1xccz9jXFwuP1xccz9lXFwuP3xhXFwuP1xccz9kXFwuP3xjXFwuP1xccz9lXFwuPykvaSxcbiAgd2lkZTogL14oYmVmb3JlIGNocmlzdHxiZWZvcmUgY29tbW9uIGVyYXxhbm5vIGRvbWluaXxjb21tb24gZXJhKS9pLFxufTtcbmNvbnN0IHBhcnNlRXJhUGF0dGVybnMgPSB7XG4gIGFueTogWy9eYi9pLCAvXihhfGMpL2ldLFxufTtcblxuY29uc3QgbWF0Y2hRdWFydGVyUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bMTIzNF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9ecVsxMjM0XS9pLFxuICB3aWRlOiAvXlsxMjM0XSh0aHxzdHxuZHxyZCk/IHF1YXJ0ZXIvaSxcbn07XG5jb25zdCBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgYW55OiBbLzEvaSwgLzIvaSwgLzMvaSwgLzQvaV0sXG59O1xuXG5jb25zdCBtYXRjaE1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bamZtYXNvbmRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXihqYW58ZmVifG1hcnxhcHJ8bWF5fGp1bnxqdWx8YXVnfHNlcHxvY3R8bm92fGRlYykvaSxcbiAgd2lkZTogL14oamFudWFyeXxmZWJydWFyeXxtYXJjaHxhcHJpbHxtYXl8anVuZXxqdWx5fGF1Z3VzdHxzZXB0ZW1iZXJ8b2N0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcikvaSxcbn07XG5jb25zdCBwYXJzZU1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogW1xuICAgIC9eai9pLFxuICAgIC9eZi9pLFxuICAgIC9ebS9pLFxuICAgIC9eYS9pLFxuICAgIC9ebS9pLFxuICAgIC9eai9pLFxuICAgIC9eai9pLFxuICAgIC9eYS9pLFxuICAgIC9ecy9pLFxuICAgIC9eby9pLFxuICAgIC9ebi9pLFxuICAgIC9eZC9pLFxuICBdLFxuXG4gIGFueTogW1xuICAgIC9eamEvaSxcbiAgICAvXmYvaSxcbiAgICAvXm1hci9pLFxuICAgIC9eYXAvaSxcbiAgICAvXm1heS9pLFxuICAgIC9eanVuL2ksXG4gICAgL15qdWwvaSxcbiAgICAvXmF1L2ksXG4gICAgL15zL2ksXG4gICAgL15vL2ksXG4gICAgL15uL2ksXG4gICAgL15kL2ksXG4gIF0sXG59O1xuXG5jb25zdCBtYXRjaERheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eW3NtdHdmXS9pLFxuICBzaG9ydDogL14oc3V8bW98dHV8d2V8dGh8ZnJ8c2EpL2ksXG4gIGFiYnJldmlhdGVkOiAvXihzdW58bW9ufHR1ZXx3ZWR8dGh1fGZyaXxzYXQpL2ksXG4gIHdpZGU6IC9eKHN1bmRheXxtb25kYXl8dHVlc2RheXx3ZWRuZXNkYXl8dGh1cnNkYXl8ZnJpZGF5fHNhdHVyZGF5KS9pLFxufTtcbmNvbnN0IHBhcnNlRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogWy9ecy9pLCAvXm0vaSwgL150L2ksIC9edy9pLCAvXnQvaSwgL15mL2ksIC9ecy9pXSxcbiAgYW55OiBbL15zdS9pLCAvXm0vaSwgL150dS9pLCAvXncvaSwgL150aC9pLCAvXmYvaSwgL15zYS9pXSxcbn07XG5cbmNvbnN0IG1hdGNoRGF5UGVyaW9kUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oYXxwfG1pfG58KGluIHRoZXxhdCkgKG1vcm5pbmd8YWZ0ZXJub29ufGV2ZW5pbmd8bmlnaHQpKS9pLFxuICBhbnk6IC9eKFthcF1cXC4/XFxzP21cXC4/fG1pZG5pZ2h0fG5vb258KGluIHRoZXxhdCkgKG1vcm5pbmd8YWZ0ZXJub29ufGV2ZW5pbmd8bmlnaHQpKS9pLFxufTtcbmNvbnN0IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMgPSB7XG4gIGFueToge1xuICAgIGFtOiAvXmEvaSxcbiAgICBwbTogL15wL2ksXG4gICAgbWlkbmlnaHQ6IC9ebWkvaSxcbiAgICBub29uOiAvXm5vL2ksXG4gICAgbW9ybmluZzogL21vcm5pbmcvaSxcbiAgICBhZnRlcm5vb246IC9hZnRlcm5vb24vaSxcbiAgICBldmVuaW5nOiAvZXZlbmluZy9pLFxuICAgIG5pZ2h0OiAvbmlnaHQvaSxcbiAgfSxcbn07XG5cbmNvbnN0IG1hdGNoID0gKGV4cG9ydHMubWF0Y2ggPSB7XG4gIG9yZGluYWxOdW1iZXI6ICgwLCBfaW5kZXgyLmJ1aWxkTWF0Y2hQYXR0ZXJuRm4pKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZSkgPT4gcGFyc2VJbnQodmFsdWUsIDEwKSxcbiAgfSksXG5cbiAgZXJhOiAoMCwgX2luZGV4LmJ1aWxkTWF0Y2hGbikoe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6ICgwLCBfaW5kZXguYnVpbGRNYXRjaEZuKSh7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleCkgPT4gaW5kZXggKyAxLFxuICB9KSxcblxuICBtb250aDogKDAsIF9pbmRleC5idWlsZE1hdGNoRm4pKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaE1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5OiAoMCwgX2luZGV4LmJ1aWxkTWF0Y2hGbikoe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogKDAsIF9pbmRleC5idWlsZE1hdGNoRm4pKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcImFueVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMubWF4ID0gbWF4O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBtYXhcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBsYXRlc3Qgb2YgdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBsYXRlc3Qgb2YgdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlcyAtIFRoZSBkYXRlcyB0byBjb21wYXJlXG4gKlxuICogQHJldHVybnMgVGhlIGxhdGVzdCBvZiB0aGUgZGF0ZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggb2YgdGhlc2UgZGF0ZXMgaXMgdGhlIGxhdGVzdD9cbiAqIGNvbnN0IHJlc3VsdCA9IG1heChbXG4gKiAgIG5ldyBEYXRlKDE5ODksIDYsIDEwKSxcbiAqICAgbmV3IERhdGUoMTk4NywgMSwgMTEpLFxuICogICBuZXcgRGF0ZSgxOTk1LCA2LCAyKSxcbiAqICAgbmV3IERhdGUoMTk5MCwgMCwgMSlcbiAqIF0pXG4gKiAvLz0+IFN1biBKdWwgMDIgMTk5NSAwMDowMDowMFxuICovXG5mdW5jdGlvbiBtYXgoZGF0ZXMpIHtcbiAgbGV0IHJlc3VsdDtcbiAgZGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlydHlEYXRlKSB7XG4gICAgY29uc3QgY3VycmVudERhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGlydHlEYXRlKTtcblxuICAgIGlmIChcbiAgICAgIHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICByZXN1bHQgPCBjdXJyZW50RGF0ZSB8fFxuICAgICAgaXNOYU4oTnVtYmVyKGN1cnJlbnREYXRlKSlcbiAgICApIHtcbiAgICAgIHJlc3VsdCA9IGN1cnJlbnREYXRlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdCB8fCBuZXcgRGF0ZShOYU4pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLm1pbiA9IG1pbjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgbWluXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGVhcmxpZXN0IG9mIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgdGhlIGVhcmxpZXN0IG9mIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZXMgLSBUaGUgZGF0ZXMgdG8gY29tcGFyZVxuICpcbiAqIEByZXR1cm5zIFRoZSBlYXJsaWVzdCBvZiB0aGUgZGF0ZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggb2YgdGhlc2UgZGF0ZXMgaXMgdGhlIGVhcmxpZXN0P1xuICogY29uc3QgcmVzdWx0ID0gbWluKFtcbiAqICAgbmV3IERhdGUoMTk4OSwgNiwgMTApLFxuICogICBuZXcgRGF0ZSgxOTg3LCAxLCAxMSksXG4gKiAgIG5ldyBEYXRlKDE5OTUsIDYsIDIpLFxuICogICBuZXcgRGF0ZSgxOTkwLCAwLCAxKVxuICogXSlcbiAqIC8vPT4gV2VkIEZlYiAxMSAxOTg3IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIG1pbihkYXRlcykge1xuICBsZXQgcmVzdWx0O1xuXG4gIGRhdGVzLmZvckVhY2goKGRpcnR5RGF0ZSkgPT4ge1xuICAgIGNvbnN0IGRhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGlydHlEYXRlKTtcbiAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQgPiBkYXRlIHx8IGlzTmFOKCtkYXRlKSkge1xuICAgICAgcmVzdWx0ID0gZGF0ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQgfHwgbmV3IERhdGUoTmFOKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibG9uZ0Zvcm1hdHRlcnNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2luZGV4NS5sb25nRm9ybWF0dGVycztcbiAgfSxcbn0pO1xuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicGFyc2Vyc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfaW5kZXg3LnBhcnNlcnM7XG4gIH0sXG59KTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9nZXREZWZhdWx0T3B0aW9ucy5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0TG9jYWxlLmpzXCIpO1xudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbnZhciBfaW5kZXg1ID0gcmVxdWlyZShcIi4vX2xpYi9mb3JtYXQvbG9uZ0Zvcm1hdHRlcnMuanNcIik7XG52YXIgX2luZGV4NiA9IHJlcXVpcmUoXCIuL19saWIvcHJvdGVjdGVkVG9rZW5zLmpzXCIpO1xuXG52YXIgX2luZGV4NyA9IHJlcXVpcmUoXCIuL3BhcnNlL19saWIvcGFyc2Vycy5qc1wiKTtcblxudmFyIF9TZXR0ZXIgPSByZXF1aXJlKFwiLi9wYXJzZS9fbGliL1NldHRlci5qc1wiKTtcblxuLy8gUmV4cG9ydHMgb2YgaW50ZXJuYWwgZm9yIGxpYnJhcmllcyB0byB1c2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzYzOCNpc3N1ZWNvbW1lbnQtMTg3NzA4Mjg3NFxuXG4vKipcbiAqIFRoZSB7QGxpbmsgcGFyc2V9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLy8gVGhpcyBSZWdFeHAgY29uc2lzdHMgb2YgdGhyZWUgcGFydHMgc2VwYXJhdGVkIGJ5IGB8YDpcbi8vIC0gW3lZUXFNTHdJZERlY2loSEtrbXNdbyBtYXRjaGVzIGFueSBhdmFpbGFibGUgb3JkaW5hbCBudW1iZXIgdG9rZW5cbi8vICAgKG9uZSBvZiB0aGUgY2VydGFpbiBsZXR0ZXJzIGZvbGxvd2VkIGJ5IGBvYClcbi8vIC0gKFxcdylcXDEqIG1hdGNoZXMgYW55IHNlcXVlbmNlcyBvZiB0aGUgc2FtZSBsZXR0ZXJcbi8vIC0gJycgbWF0Y2hlcyB0d28gcXVvdGUgY2hhcmFjdGVycyBpbiBhIHJvd1xuLy8gLSAnKCcnfFteJ10pKygnfCQpIG1hdGNoZXMgYW55dGhpbmcgc3Vycm91bmRlZCBieSB0d28gcXVvdGUgY2hhcmFjdGVycyAoJyksXG4vLyAgIGV4Y2VwdCBhIHNpbmdsZSBxdW90ZSBzeW1ib2wsIHdoaWNoIGVuZHMgdGhlIHNlcXVlbmNlLlxuLy8gICBUd28gcXVvdGUgY2hhcmFjdGVycyBkbyBub3QgZW5kIHRoZSBzZXF1ZW5jZS5cbi8vICAgSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc2luZ2xlIHF1b3RlXG4vLyAgIHRoZW4gdGhlIHNlcXVlbmNlIHdpbGwgY29udGludWUgdW50aWwgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLlxuLy8gLSAuIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIgdW5tYXRjaGVkIGJ5IHByZXZpb3VzIHBhcnRzIG9mIHRoZSBSZWdFeHBzXG5jb25zdCBmb3JtYXR0aW5nVG9rZW5zUmVnRXhwID1cbiAgL1t5WVFxTUx3SWREZWNpaEhLa21zXW98KFxcdylcXDEqfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nO1xuXG4vLyBUaGlzIFJlZ0V4cCBjYXRjaGVzIHN5bWJvbHMgZXNjYXBlZCBieSBxdW90ZXMsIGFuZCBhbHNvXG4vLyBzZXF1ZW5jZXMgb2Ygc3ltYm9scyBQLCBwLCBhbmQgdGhlIGNvbWJpbmF0aW9ucyBsaWtlIGBQUFBQUFBQcHBwcHBgXG5jb25zdCBsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9IC9QK3ArfFArfHArfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nO1xuXG5jb25zdCBlc2NhcGVkU3RyaW5nUmVnRXhwID0gL14nKFteXSo/KSc/JC87XG5jb25zdCBkb3VibGVRdW90ZVJlZ0V4cCA9IC8nJy9nO1xuXG5jb25zdCBub3RXaGl0ZXNwYWNlUmVnRXhwID0gL1xcUy87XG5jb25zdCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCA9IC9bYS16QS1aXS87XG5cbi8qKlxuICogQG5hbWUgcGFyc2VcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgUGFyc2UgdGhlIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGRhdGUgcGFyc2VkIGZyb20gc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBmb3JtYXQgc3RyaW5nLlxuICpcbiAqID4g4pqg77iPIFBsZWFzZSBub3RlIHRoYXQgdGhlIGBmb3JtYXRgIHRva2VucyBkaWZmZXIgZnJvbSBNb21lbnQuanMgYW5kIG90aGVyIGxpYnJhcmllcy5cbiAqID4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogVGhlIGNoYXJhY3RlcnMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgd3JhcHBlZCBiZXR3ZWVuIHR3byBzaW5nbGUgcXVvdGVzIGNoYXJhY3RlcnMgKCcpIGFyZSBlc2NhcGVkLlxuICogVHdvIHNpbmdsZSBxdW90ZXMgaW4gYSByb3csIHdoZXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgYSBxdW90ZWQgc2VxdWVuY2UsIHJlcHJlc2VudCBhICdyZWFsJyBzaW5nbGUgcXVvdGUuXG4gKlxuICogRm9ybWF0IG9mIHRoZSBmb3JtYXQgc3RyaW5nIGlzIGJhc2VkIG9uIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9GaWVsZF9TeW1ib2xfVGFibGVcbiAqIHdpdGggYSBmZXcgYWRkaXRpb25zIChzZWUgbm90ZSA1IGJlbG93IHRoZSB0YWJsZSkuXG4gKlxuICogTm90IGFsbCB0b2tlbnMgYXJlIGNvbXBhdGlibGUuIENvbWJpbmF0aW9ucyB0aGF0IGRvbid0IG1ha2Ugc2Vuc2Ugb3IgY291bGQgbGVhZCB0byBidWdzIGFyZSBwcm9oaWJpdGVkXG4gKiBhbmQgd2lsbCB0aHJvdyBgUmFuZ2VFcnJvcmAuIEZvciBleGFtcGxlIHVzYWdlIG9mIDI0LWhvdXIgZm9ybWF0IHRva2VuIHdpdGggQU0vUE0gdG9rZW4gd2lsbCB0aHJvdyBhbiBleGNlcHRpb246XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcGFyc2UoJzIzIEFNJywgJ0hIIGEnLCBuZXcgRGF0ZSgpKVxuICogLy89PiBSYW5nZUVycm9yOiBUaGUgZm9ybWF0IHN0cmluZyBtdXN0bid0IGNvbnRhaW4gYEhIYCBhbmQgYGFgIGF0IHRoZSBzYW1lIHRpbWVcbiAqIGBgYFxuICpcbiAqIFNlZSB0aGUgY29tcGF0aWJpbGl0eSB0YWJsZTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvZS8yUEFDWC0xdlFPUFUzeFVocGxsbDZkeW9NbVZVWEhLbF84Q1JEczZfdWVMbWV4M1NvcXdodW9sa3VOM08wNWw0cnF4NWgxZEtYOGViNDZVbC1DQ1NycS9wdWJodG1sP2dpZD0wJnNpbmdsZT10cnVlXG4gKlxuICogQWNjZXB0ZWQgZm9ybWF0IHN0cmluZyBwYXR0ZXJuczpcbiAqIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8UHJpb3J8IFBhdHRlcm4gfCBSZXN1bHQgZXhhbXBsZXMgICAgICAgICAgICAgICAgICAgfCBOb3RlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfFxuICogfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQwIHwgRy4uR0dHICB8IEFELCBCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEdHR0cgICAgfCBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBHR0dHRyAgIHwgQSwgQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDYWxlbmRhciB5ZWFyICAgICAgICAgICAgICAgICAgIHwgMTMwIHwgeSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3LCA5OTk5ICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgOTk5OTk5OXRoICAgICAgfCA0LDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB5eSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeXl5ICAgICB8IDA0NCwgMDAxLCAxMjMsIDk5OSAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHl5eXkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB5eXl5eSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiw0ICAgfFxuICogfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgIHwgMTMwIHwgWSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3LCA5MDAwICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgOTk5OTk5OXRoICAgICAgfCA0LDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBZWSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNCw2ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWVlZICAgICB8IDA0NCwgMDAxLCAxMjMsIDk5OSAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFlZWVkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA0LDYgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBZWVlZWSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiw0ICAgfFxuICogfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgIHwgMTMwIHwgUiAgICAgICB8IC00MywgMSwgMTkwMCwgMjAxNywgOTk5OSwgLTk5OTkgICB8IDQsNSAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFJSICAgICAgfCAtNDMsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgfCA0LDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBSUlIgICAgIHwgLTA0MywgMDAxLCAxMjMsIDk5OSwgLTk5OSAgICAgICAgIHwgNCw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUlJSUiAgICB8IC0wMDQzLCAwMDAxLCAyMDE3LCA5OTk5LCAtOTk5OSAgICB8IDQsNSAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFJSUlJSICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyLDQsNSB8XG4gKiB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICAgfCAxMzAgfCB1ICAgICAgIHwgLTQzLCAxLCAxOTAwLCAyMDE3LCA5OTk5LCAtOTk5ICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgdXUgICAgICB8IC00MywgMDEsIDk5LCAtOTkgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHV1dSAgICAgfCAtMDQzLCAwMDEsIDEyMywgOTk5LCAtOTk5ICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB1dXV1ICAgIHwgLTAwNDMsIDAwMDEsIDIwMTcsIDk5OTksIC05OTk5ICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgdXV1dXUgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIsNCAgIHxcbiAqIHwgUXVhcnRlciAoZm9ybWF0dGluZykgICAgICAgICAgICB8IDEyMCB8IFEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBRbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUVEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFFRUSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBRUVFRICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUVFRUVEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgUXVhcnRlciAoc3RhbmQtYWxvbmUpICAgICAgICAgICB8IDEyMCB8IHEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBxbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgcXEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHFxcSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBxcXFxICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgcXFxcXEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgTW9udGggKGZvcm1hdHRpbmcpICAgICAgICAgICAgICB8IDExMCB8IE0gICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBNbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTU0gICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IE1NTSAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBNTU1NICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTU1NTU0gICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTW9udGggKHN0YW5kLWFsb25lKSAgICAgICAgICAgICB8IDExMCB8IEwgICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBMbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTEwgICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IExMTCAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBMTExMICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTExMTEwgICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgICB8IDEwMCB8IHcgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB3byAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgd3cgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgICB8IDEwMCB8IEkgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBJbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgSUkgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgICB8ICA5MCB8IGQgICAgICAgfCAxLCAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBkbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzFzdCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZGQgICAgICB8IDAxLCAwMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgICB8ICA5MCB8IEQgICAgICAgfCAxLCAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBEbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzY1dGgsIDM2NnRoICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgREQgICAgICB8IDAxLCAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IERERCAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBEREREICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCBEYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgICAgIHwgIDkwIHwgRS4uRUVFICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEVFRUUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBFRUVFRSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgRUVFRUVFICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICB8ICA5MCB8IGkgICAgICAgfCAxLCAyLCAzLCAuLi4sIDcgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBpbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgN3RoICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaWkgICAgICB8IDAxLCAwMiwgLi4uLCAwNyAgICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGlpaSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBpaWlpICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaWlpaWkgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGlpaWlpaSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCA1ICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgfCAgOTAgfCBlICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZW8gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGVlICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBlZWUgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZWVlZSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGVlZWVlICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBlZWVlZWUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoc3RhbmQtYWxvbmUpIHwgIDkwIHwgYyAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGNvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBjYyAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgY2NjICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGNjY2MgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBjY2NjYyAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgY2NjY2NjICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA4MCB8IGEuLmFhYSAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBhYWFhICAgIHwgYS5tLiwgcC5tLiAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgYWFhYWEgICB8IGEsIHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICB8ICA4MCB8IGIuLmJiYiAgfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBiYmJiICAgIHwgYS5tLiwgcC5tLiwgbm9vbiwgbWlkbmlnaHQgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgYmJiYmIgICB8IGEsIHAsIG4sIG1pICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgICB8ICA4MCB8IEIuLkJCQiAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBCQkJCICAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgQkJCQkIgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgICB8ICA3MCB8IGggICAgICAgfCAxLCAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBobyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMTJ0aCAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaGggICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgICB8ICA3MCB8IEggICAgICAgfCAwLCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBIbyAgICAgIHwgMHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgSEggICAgICB8IDAwLCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgICB8ICA3MCB8IEsgICAgICAgfCAxLCAyLCAuLi4sIDExLCAwICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBLbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMHRoICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgS0sgICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgICB8ICA3MCB8IGsgICAgICAgfCAyNCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBrbyAgICAgIHwgMjR0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwga2sgICAgICB8IDI0LCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2MCB8IG0gICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBtbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgbW0gICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1MCB8IHMgICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBzbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgc3MgICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgICB8ICA0MCB8IHQgICAgICAgfCA1MTI5Njk1MjAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB0dCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgIHwgIDMwIHwgUyAgICAgICB8IDAsIDEsIC4uLiwgOSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFNTICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBTU1MgICAgIHwgMDAwLCAwMDEsIC4uLiwgOTk5ICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgU1NTUyAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICB8ICAyMCB8IFQgICAgICAgfCA1MTI5Njk1MjA5MDAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBUVCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy8gWikgICAgICAgIHwgIDEwIHwgWCAgICAgICB8IC0wOCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFhYICAgICAgfCAtMDgwMCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBYWFggICAgIHwgLTA4OjAwLCArMDU6MzAsIFogICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWFhYWCAgICB8IC0wODAwLCArMDUzMCwgWiwgKzEyMzQ1NiAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFhYWFhYICAgfCAtMDg6MDAsICswNTozMCwgWiwgKzEyOjM0OjU2ICAgICAgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICAgfCAgMTAgfCB4ICAgICAgIHwgLTA4LCArMDUzMCwgKzAwICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeHggICAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHh4eCAgICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB4eHh4ICAgIHwgLTA4MDAsICswNTMwLCArMDAwMCwgKzEyMzQ1NiAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeHh4eHggICB8IC0wODowMCwgKzA1OjMwLCArMDA6MDAsICsxMjozNDo1NiB8ICAgICAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgICB8ICBOQSB8IFAgICAgICAgfCAwNS8yOS8xNDUzICAgICAgICAgICAgICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBQUCAgICAgIHwgTWF5IDI5LCAxNDUzICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUFBQICAgICB8IE1heSAyOXRoLCAxNDUzICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFBQUFAgICAgfCBTdW5kYXksIE1heSAyOXRoLCAxNDUzICAgICAgICAgICAgfCAyLDUsOCB8XG4gKiB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICAgfCAgTkEgfCBwICAgICAgIHwgMTI6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgcHAgICAgICB8IDEyOjAwOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQ29tYmluYXRpb24gb2YgZGF0ZSBhbmQgdGltZSAgICB8ICBOQSB8IFBwICAgICAgfCAwNS8yOS8xNDUzLCAxMjowMCBBTSAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBQUHBwICAgIHwgTWF5IDI5LCAxNDUzLCAxMjowMDowMCBBTSAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUFBQcHAgICB8IE1heSAyOXRoLCAxNDUzIGF0IC4uLiAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFBQUFBwcCAgfCBTdW5kYXksIE1heSAyOXRoLCAxNDUzIGF0IC4uLiAgICAgfCAyLDUsOCB8XG4gKiBOb3RlczpcbiAqIDEuIFwiRm9ybWF0dGluZ1wiIHVuaXRzIChlLmcuIGZvcm1hdHRpbmcgcXVhcnRlcikgaW4gdGhlIGRlZmF1bHQgZW4tVVMgbG9jYWxlXG4gKiAgICBhcmUgdGhlIHNhbWUgYXMgXCJzdGFuZC1hbG9uZVwiIHVuaXRzLCBidXQgYXJlIGRpZmZlcmVudCBpbiBzb21lIGxhbmd1YWdlcy5cbiAqICAgIFwiRm9ybWF0dGluZ1wiIHVuaXRzIGFyZSBkZWNsaW5lZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIHRoZSBsYW5ndWFnZVxuICogICAgaW4gdGhlIGNvbnRleHQgb2YgYSBkYXRlLiBcIlN0YW5kLWFsb25lXCIgdW5pdHMgYXJlIGFsd2F5cyBub21pbmF0aXZlIHNpbmd1bGFyLlxuICogICAgSW4gYGZvcm1hdGAgZnVuY3Rpb24sIHRoZXkgd2lsbCBwcm9kdWNlIGRpZmZlcmVudCByZXN1bHQ6XG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBMTExMJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZCdgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBNTU1NJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZHUnYFxuICpcbiAqICAgIGBwYXJzZWAgd2lsbCB0cnkgdG8gbWF0Y2ggYm90aCBmb3JtYXR0aW5nIGFuZCBzdGFuZC1hbG9uZSB1bml0cyBpbnRlcmNoYW5nYWJseS5cbiAqXG4gKiAyLiBBbnkgc2VxdWVuY2Ugb2YgdGhlIGlkZW50aWNhbCBsZXR0ZXJzIGlzIGEgcGF0dGVybiwgdW5sZXNzIGl0IGlzIGVzY2FwZWQgYnlcbiAqICAgIHRoZSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycyAoc2VlIGJlbG93KS5cbiAqICAgIElmIHRoZSBzZXF1ZW5jZSBpcyBsb25nZXIgdGhhbiBsaXN0ZWQgaW4gdGFibGU6XG4gKiAgICAtIGZvciBudW1lcmljYWwgdW5pdHMgKGB5eXl5eXl5eWApIGBwYXJzZWAgd2lsbCB0cnkgdG8gbWF0Y2ggYSBudW1iZXJcbiAqICAgICAgYXMgd2lkZSBhcyB0aGUgc2VxdWVuY2VcbiAqICAgIC0gZm9yIHRleHQgdW5pdHMgKGBNTU1NTU1NTWApIGBwYXJzZWAgd2lsbCB0cnkgdG8gbWF0Y2ggdGhlIHdpZGVzdCB2YXJpYXRpb24gb2YgdGhlIHVuaXQuXG4gKiAgICAgIFRoZXNlIHZhcmlhdGlvbnMgYXJlIG1hcmtlZCB3aXRoIFwiMlwiIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgdGFibGUuXG4gKlxuICogMy4gYFFRUVFRYCBhbmQgYHFxcXFxYCBjb3VsZCBiZSBub3Qgc3RyaWN0bHkgbnVtZXJpY2FsIGluIHNvbWUgbG9jYWxlcy5cbiAqICAgIFRoZXNlIHRva2VucyByZXByZXNlbnQgdGhlIHNob3J0ZXN0IGZvcm0gb2YgdGhlIHF1YXJ0ZXIuXG4gKlxuICogNC4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIHBhdHRlcm5zIGFyZSBCLkMuIHllYXJzOlxuICpcbiAqICAgIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICogICAgfCBBQyAxIHwgICAxIHwgICAxIHxcbiAqICAgIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gKiAgICB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICpcbiAqICAgIEFsc28gYHl5YCB3aWxsIHRyeSB0byBndWVzcyB0aGUgY2VudHVyeSBvZiB0d28gZGlnaXQgeWVhciBieSBwcm94aW1pdHkgd2l0aCBgcmVmZXJlbmNlRGF0ZWA6XG4gKlxuICogICAgYHBhcnNlKCc1MCcsICd5eScsIG5ldyBEYXRlKDIwMTgsIDAsIDEpKSAvLz0+IFNhdCBKYW4gMDEgMjA1MCAwMDowMDowMGBcbiAqXG4gKiAgICBgcGFyc2UoJzc1JywgJ3l5JywgbmV3IERhdGUoMjAxOCwgMCwgMSkpIC8vPT4gV2VkIEphbiAwMSAxOTc1IDAwOjAwOjAwYFxuICpcbiAqICAgIHdoaWxlIGB1dWAgd2lsbCBqdXN0IGFzc2lnbiB0aGUgeWVhciBhcyBpczpcbiAqXG4gKiAgICBgcGFyc2UoJzUwJywgJ3V1JywgbmV3IERhdGUoMjAxOCwgMCwgMSkpIC8vPT4gU2F0IEphbiAwMSAwMDUwIDAwOjAwOjAwYFxuICpcbiAqICAgIGBwYXJzZSgnNzUnLCAndXUnLCBuZXcgRGF0ZSgyMDE4LCAwLCAxKSkgLy89PiBUdWUgSmFuIDAxIDAwNzUgMDA6MDA6MDBgXG4gKlxuICogICAgVGhlIHNhbWUgZGlmZmVyZW5jZSBpcyB0cnVlIGZvciBsb2NhbCBhbmQgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJzIChgWWAgYW5kIGBSYCksXG4gKiAgICBleGNlcHQgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcnMgYXJlIGRlcGVuZGVudCBvbiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gXG4gKiAgICBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAoY29tcGFyZSBbc2V0SVNPV2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3Mvc2V0SVNPV2Vla1llYXIpXG4gKiAgICBhbmQgW3NldFdlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL3NldFdlZWtZZWFyKSkuXG4gKlxuICogNS4gVGhlc2UgcGF0dGVybnMgYXJlIG5vdCBpbiB0aGUgVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogICAgLSBgaWA6IElTTyBkYXkgb2Ygd2Vla1xuICogICAgLSBgSWA6IElTTyB3ZWVrIG9mIHllYXJcbiAqICAgIC0gYFJgOiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICogICAgLSBgb2A6IG9yZGluYWwgbnVtYmVyIG1vZGlmaWVyXG4gKiAgICAtIGBQYDogbG9uZyBsb2NhbGl6ZWQgZGF0ZVxuICogICAgLSBgcGA6IGxvbmcgbG9jYWxpemVkIHRpbWVcbiAqXG4gKiA2LiBgWVlgIGFuZCBgWVlZWWAgdG9rZW5zIHJlcHJlc2VudCB3ZWVrLW51bWJlcmluZyB5ZWFycyBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCB5ZWFycy5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIDcuIGBEYCBhbmQgYEREYCB0b2tlbnMgcmVwcmVzZW50IGRheXMgb2YgdGhlIHllYXIgYnV0IHRoZXkgYXJlIG9mdGhlbiBjb25mdXNlZCB3aXRoIGRheXMgb2YgdGhlIG1vbnRoLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbERheU9mWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIDguIGBQK2AgdG9rZW5zIGRvIG5vdCBoYXZlIGEgZGVmaW5lZCBwcmlvcml0eSBzaW5jZSB0aGV5IGFyZSBtZXJlbHkgYWxpYXNlcyB0byBvdGhlciB0b2tlbnMgYmFzZWRcbiAqICAgIG9uIHRoZSBnaXZlbiBsb2NhbGUuXG4gKlxuICogICAgdXNpbmcgYGVuLVVTYCBsb2NhbGU6IGBQYCA9PiBgTU0vZGQveXl5eWBcbiAqICAgIHVzaW5nIGBlbi1VU2AgbG9jYWxlOiBgcGAgPT4gYGhoOm1tIGFgXG4gKiAgICB1c2luZyBgcHQtQlJgIGxvY2FsZTogYFBgID0+IGBkZC9NTS95eXl5YFxuICogICAgdXNpbmcgYHB0LUJSYCBsb2NhbGU6IGBwYCA9PiBgSEg6bW1gXG4gKlxuICogVmFsdWVzIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGRhdGUgaW4gdGhlIGRlc2NlbmRpbmcgb3JkZXIgb2YgaXRzIHVuaXQncyBwcmlvcml0eS5cbiAqIFVuaXRzIG9mIGFuIGVxdWFsIHByaW9yaXR5IG92ZXJ3cml0ZSBlYWNoIG90aGVyIGluIHRoZSBvcmRlciBvZiBhcHBlYXJhbmNlLlxuICpcbiAqIElmIG5vIHZhbHVlcyBvZiBoaWdoZXIgcHJpb3JpdHkgYXJlIHBhcnNlZCAoZS5nLiB3aGVuIHBhcnNpbmcgc3RyaW5nICdKYW51YXJ5IDFzdCcgd2l0aG91dCBhIHllYXIpLFxuICogdGhlIHZhbHVlcyB3aWxsIGJlIHRha2VuIGZyb20gM3JkIGFyZ3VtZW50IGByZWZlcmVuY2VEYXRlYCB3aGljaCB3b3JrcyBhcyBhIGNvbnRleHQgb2YgcGFyc2luZy5cbiAqXG4gKiBgcmVmZXJlbmNlRGF0ZWAgbXVzdCBiZSBwYXNzZWQgZm9yIGNvcnJlY3Qgd29yayBvZiB0aGUgZnVuY3Rpb24uXG4gKiBJZiB5b3UncmUgbm90IHN1cmUgd2hpY2ggYHJlZmVyZW5jZURhdGVgIHRvIHN1cHBseSwgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIERhdGU6XG4gKiBgcGFyc2UoJzAyLzExLzIwMTQnLCAnTU0vZGQveXl5eScsIG5ldyBEYXRlKCkpYFxuICogSW4gdGhpcyBjYXNlIHBhcnNpbmcgd2lsbCBiZSBkb25lIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGRhdGUuXG4gKiBJZiBgcmVmZXJlbmNlRGF0ZWAgaXMgYEludmFsaWQgRGF0ZWAgb3IgYSB2YWx1ZSBub3QgY29udmVydGlibGUgdG8gdmFsaWQgYERhdGVgLFxuICogdGhlbiBgSW52YWxpZCBEYXRlYCB3aWxsIGJlIHJldHVybmVkLlxuICpcbiAqIFRoZSByZXN1bHQgbWF5IHZhcnkgYnkgbG9jYWxlLlxuICpcbiAqIElmIGBmb3JtYXRTdHJpbmdgIG1hdGNoZXMgd2l0aCBgZGF0ZVN0cmluZ2AgYnV0IGRvZXMgbm90IHByb3ZpZGVzIHRva2VucywgYHJlZmVyZW5jZURhdGVgIHdpbGwgYmUgcmV0dXJuZWQuXG4gKlxuICogSWYgcGFyc2luZyBmYWlsZWQsIGBJbnZhbGlkIERhdGVgIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBJbnZhbGlkIERhdGUgaXMgYSBEYXRlLCB3aG9zZSB0aW1lIHZhbHVlIGlzIE5hTi5cbiAqIFRpbWUgdmFsdWUgb2YgRGF0ZTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS45LjEuMVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlU3RyIC0gVGhlIHN0cmluZyB0byBwYXJzZVxuICogQHBhcmFtIGZvcm1hdFN0ciAtIFRoZSBzdHJpbmcgb2YgdG9rZW5zXG4gKiBAcGFyYW0gcmVmZXJlbmNlRGF0ZSAtIGRlZmluZXMgdmFsdWVzIG1pc3NpbmcgZnJvbSB0aGUgcGFyc2VkIGRhdGVTdHJpbmdcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqICAgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiAgIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZVxuICpcbiAqIEB0aHJvd3MgYG9wdGlvbnMubG9jYWxlYCBtdXN0IGNvbnRhaW4gYG1hdGNoYCBwcm9wZXJ0eVxuICogQHRocm93cyB1c2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGRgIGluc3RlYWQgb2YgYEREYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQYXJzZSAxMSBGZWJydWFyeSAyMDE0IGZyb20gbWlkZGxlLWVuZGlhbiBmb3JtYXQ6XG4gKiB2YXIgcmVzdWx0ID0gcGFyc2UoJzAyLzExLzIwMTQnLCAnTU0vZGQveXl5eScsIG5ldyBEYXRlKCkpXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQYXJzZSAyOHRoIG9mIEZlYnJ1YXJ5IGluIEVzcGVyYW50byBsb2NhbGUgaW4gdGhlIGNvbnRleHQgb2YgMjAxMCB5ZWFyOlxuICogaW1wb3J0IGVvIGZyb20gJ2RhdGUtZm5zL2xvY2FsZS9lbydcbiAqIHZhciByZXN1bHQgPSBwYXJzZSgnMjgtYSBkZSBmZWJydWFybycsIFwiZG8gJ2RlJyBNTU1NXCIsIG5ldyBEYXRlKDIwMTAsIDAsIDEpLCB7XG4gKiAgIGxvY2FsZTogZW9cbiAqIH0pXG4gKiAvLz0+IFN1biBGZWIgMjggMjAxMCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBwYXJzZShkYXRlU3RyLCBmb3JtYXRTdHIsIHJlZmVyZW5jZURhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4Mi5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgY29uc3QgbG9jYWxlID1cbiAgICBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMubG9jYWxlID8/IF9pbmRleDMuZGVmYXVsdExvY2FsZTtcblxuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgaWYgKGZvcm1hdFN0ciA9PT0gXCJcIikge1xuICAgIGlmIChkYXRlU3RyID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gKDAsIF9pbmRleDQudG9EYXRlKShyZWZlcmVuY2VEYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgTmFOKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdWJGbk9wdGlvbnMgPSB7XG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlLFxuICAgIHdlZWtTdGFydHNPbixcbiAgICBsb2NhbGUsXG4gIH07XG5cbiAgLy8gSWYgdGltZXpvbmUgaXNuJ3Qgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHNldCB0byB0aGUgc3lzdGVtIHRpbWV6b25lXG4gIGNvbnN0IHNldHRlcnMgPSBbbmV3IF9TZXR0ZXIuRGF0ZVRvU3lzdGVtVGltZXpvbmVTZXR0ZXIoKV07XG5cbiAgY29uc3QgdG9rZW5zID0gZm9ybWF0U3RyXG4gICAgLm1hdGNoKGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwKVxuICAgIC5tYXAoKHN1YnN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgaW4gX2luZGV4NS5sb25nRm9ybWF0dGVycykge1xuICAgICAgICBjb25zdCBsb25nRm9ybWF0dGVyID0gX2luZGV4NS5sb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07XG4gICAgICAgIHJldHVybiBsb25nRm9ybWF0dGVyKHN1YnN0cmluZywgbG9jYWxlLmZvcm1hdExvbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1YnN0cmluZztcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpXG4gICAgLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnNSZWdFeHApO1xuXG4gIGNvbnN0IHVzZWRUb2tlbnMgPSBbXTtcblxuICBmb3IgKGxldCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICBpZiAoXG4gICAgICAhb3B0aW9ucz8udXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zICYmXG4gICAgICAoMCwgX2luZGV4Ni5pc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4pKHRva2VuKVxuICAgICkge1xuICAgICAgKDAsIF9pbmRleDYud2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcikodG9rZW4sIGZvcm1hdFN0ciwgZGF0ZVN0cik7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFvcHRpb25zPy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zICYmXG4gICAgICAoMCwgX2luZGV4Ni5pc1Byb3RlY3RlZERheU9mWWVhclRva2VuKSh0b2tlbilcbiAgICApIHtcbiAgICAgICgwLCBfaW5kZXg2Lndhcm5PclRocm93UHJvdGVjdGVkRXJyb3IpKHRva2VuLCBmb3JtYXRTdHIsIGRhdGVTdHIpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gdG9rZW5bMF07XG4gICAgY29uc3QgcGFyc2VyID0gX2luZGV4Ny5wYXJzZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICBpZiAocGFyc2VyKSB7XG4gICAgICBjb25zdCB7IGluY29tcGF0aWJsZVRva2VucyB9ID0gcGFyc2VyO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5jb21wYXRpYmxlVG9rZW5zKSkge1xuICAgICAgICBjb25zdCBpbmNvbXBhdGlibGVUb2tlbiA9IHVzZWRUb2tlbnMuZmluZChcbiAgICAgICAgICAodXNlZFRva2VuKSA9PlxuICAgICAgICAgICAgaW5jb21wYXRpYmxlVG9rZW5zLmluY2x1ZGVzKHVzZWRUb2tlbi50b2tlbikgfHxcbiAgICAgICAgICAgIHVzZWRUb2tlbi50b2tlbiA9PT0gZmlyc3RDaGFyYWN0ZXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbmNvbXBhdGlibGVUb2tlbikge1xuICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgICAgYFRoZSBmb3JtYXQgc3RyaW5nIG11c3RuJ3QgY29udGFpbiBcXGAke2luY29tcGF0aWJsZVRva2VuLmZ1bGxUb2tlbn1cXGAgYW5kIFxcYCR7dG9rZW59XFxgIGF0IHRoZSBzYW1lIHRpbWVgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VyLmluY29tcGF0aWJsZVRva2VucyA9PT0gXCIqXCIgJiYgdXNlZFRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgIGBUaGUgZm9ybWF0IHN0cmluZyBtdXN0bid0IGNvbnRhaW4gXFxgJHt0b2tlbn1cXGAgYW5kIGFueSBvdGhlciB0b2tlbiBhdCB0aGUgc2FtZSB0aW1lYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdXNlZFRva2Vucy5wdXNoKHsgdG9rZW46IGZpcnN0Q2hhcmFjdGVyLCBmdWxsVG9rZW46IHRva2VuIH0pO1xuXG4gICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IHBhcnNlci5ydW4oXG4gICAgICAgIGRhdGVTdHIsXG4gICAgICAgIHRva2VuLFxuICAgICAgICBsb2NhbGUubWF0Y2gsXG4gICAgICAgIHN1YkZuT3B0aW9ucyxcbiAgICAgICk7XG5cbiAgICAgIGlmICghcGFyc2VSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgTmFOKTtcbiAgICAgIH1cblxuICAgICAgc2V0dGVycy5wdXNoKHBhcnNlUmVzdWx0LnNldHRlcik7XG5cbiAgICAgIGRhdGVTdHIgPSBwYXJzZVJlc3VsdC5yZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIubWF0Y2godW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHApKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgIFwiRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGBcIiArXG4gICAgICAgICAgICBmaXJzdENoYXJhY3RlciArXG4gICAgICAgICAgICBcImBcIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVwbGFjZSB0d28gc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgd2l0aCBvbmUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlclxuICAgICAgaWYgKHRva2VuID09PSBcIicnXCIpIHtcbiAgICAgICAgdG9rZW4gPSBcIidcIjtcbiAgICAgIH0gZWxzZSBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIHRva2VuID0gY2xlYW5Fc2NhcGVkU3RyaW5nKHRva2VuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3V0IHRva2VuIGZyb20gc3RyaW5nLCBvciwgaWYgc3RyaW5nIGRvZXNuJ3QgbWF0Y2ggdGhlIHRva2VuLCByZXR1cm4gSW52YWxpZCBEYXRlXG4gICAgICBpZiAoZGF0ZVN0ci5pbmRleE9mKHRva2VuKSA9PT0gMCkge1xuICAgICAgICBkYXRlU3RyID0gZGF0ZVN0ci5zbGljZSh0b2tlbi5sZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgTmFOKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgcmVtYWluaW5nIGlucHV0IGNvbnRhaW5zIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoaXRlc3BhY2VcbiAgaWYgKGRhdGVTdHIubGVuZ3RoID4gMCAmJiBub3RXaGl0ZXNwYWNlUmVnRXhwLnRlc3QoZGF0ZVN0cikpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShyZWZlcmVuY2VEYXRlLCBOYU4pO1xuICB9XG5cbiAgY29uc3QgdW5pcXVlUHJpb3JpdHlTZXR0ZXJzID0gc2V0dGVyc1xuICAgIC5tYXAoKHNldHRlcikgPT4gc2V0dGVyLnByaW9yaXR5KVxuICAgIC5zb3J0KChhLCBiKSA9PiBiIC0gYSlcbiAgICAuZmlsdGVyKChwcmlvcml0eSwgaW5kZXgsIGFycmF5KSA9PiBhcnJheS5pbmRleE9mKHByaW9yaXR5KSA9PT0gaW5kZXgpXG4gICAgLm1hcCgocHJpb3JpdHkpID0+XG4gICAgICBzZXR0ZXJzXG4gICAgICAgIC5maWx0ZXIoKHNldHRlcikgPT4gc2V0dGVyLnByaW9yaXR5ID09PSBwcmlvcml0eSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIuc3ViUHJpb3JpdHkgLSBhLnN1YlByaW9yaXR5KSxcbiAgICApXG4gICAgLm1hcCgoc2V0dGVyQXJyYXkpID0+IHNldHRlckFycmF5WzBdKTtcblxuICBsZXQgZGF0ZSA9ICgwLCBfaW5kZXg0LnRvRGF0ZSkocmVmZXJlbmNlRGF0ZSk7XG5cbiAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIE5hTik7XG4gIH1cblxuICBjb25zdCBmbGFncyA9IHt9O1xuICBmb3IgKGNvbnN0IHNldHRlciBvZiB1bmlxdWVQcmlvcml0eVNldHRlcnMpIHtcbiAgICBpZiAoIXNldHRlci52YWxpZGF0ZShkYXRlLCBzdWJGbk9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShyZWZlcmVuY2VEYXRlLCBOYU4pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHNldHRlci5zZXQoZGF0ZSwgZmxhZ3MsIHN1YkZuT3B0aW9ucyk7XG4gICAgLy8gUmVzdWx0IGlzIHR1cGxlIChkYXRlLCBmbGFncylcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBkYXRlID0gcmVzdWx0WzBdO1xuICAgICAgT2JqZWN0LmFzc2lnbihmbGFncywgcmVzdWx0WzFdKTtcbiAgICAgIC8vIFJlc3VsdCBpcyBkYXRlXG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGUgPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZyhpbnB1dCkge1xuICByZXR1cm4gaW5wdXQubWF0Y2goZXNjYXBlZFN0cmluZ1JlZ0V4cClbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cCwgXCInXCIpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnBhcnNlSVNPID0gcGFyc2VJU087XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RhbnRzLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgcGFyc2VJU099IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBwYXJzZUlTT1xuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBQYXJzZSBJU08gc3RyaW5nXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCBhbmQgcmV0dXJuIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogRnVuY3Rpb24gYWNjZXB0cyBjb21wbGV0ZSBJU08gODYwMSBmb3JtYXRzIGFzIHdlbGwgYXMgcGFydGlhbCBpbXBsZW1lbnRhdGlvbnMuXG4gKiBJU08gODYwMTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMVxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpc24ndCBhIHN0cmluZywgdGhlIGZ1bmN0aW9uIGNhbm5vdCBwYXJzZSB0aGUgc3RyaW5nIG9yXG4gKiB0aGUgdmFsdWVzIGFyZSBpbnZhbGlkLCBpdCByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBzdHJpbmcgJzIwMTQtMDItMTFUMTE6MzA6MzAnIHRvIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBwYXJzZUlTTygnMjAxNC0wMi0xMVQxMTozMDozMCcpXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IHN0cmluZyAnKzAyMDE0MTAxJyB0byBkYXRlLFxuICogLy8gaWYgdGhlIGFkZGl0aW9uYWwgbnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgZXh0ZW5kZWQgeWVhciBmb3JtYXQgaXMgMTpcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlSVNPKCcrMDIwMTQxMDEnLCB7IGFkZGl0aW9uYWxEaWdpdHM6IDEgfSlcbiAqIC8vPT4gRnJpIEFwciAxMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSVNPKGFyZ3VtZW50LCBvcHRpb25zKSB7XG4gIGNvbnN0IGFkZGl0aW9uYWxEaWdpdHMgPSBvcHRpb25zPy5hZGRpdGlvbmFsRGlnaXRzID8/IDI7XG4gIGNvbnN0IGRhdGVTdHJpbmdzID0gc3BsaXREYXRlU3RyaW5nKGFyZ3VtZW50KTtcblxuICBsZXQgZGF0ZTtcbiAgaWYgKGRhdGVTdHJpbmdzLmRhdGUpIHtcbiAgICBjb25zdCBwYXJzZVllYXJSZXN1bHQgPSBwYXJzZVllYXIoZGF0ZVN0cmluZ3MuZGF0ZSwgYWRkaXRpb25hbERpZ2l0cyk7XG4gICAgZGF0ZSA9IHBhcnNlRGF0ZShwYXJzZVllYXJSZXN1bHQucmVzdERhdGVTdHJpbmcsIHBhcnNlWWVhclJlc3VsdC55ZWFyKTtcbiAgfVxuXG4gIGlmICghZGF0ZSB8fCBpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgfVxuXG4gIGNvbnN0IHRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICBsZXQgdGltZSA9IDA7XG4gIGxldCBvZmZzZXQ7XG5cbiAgaWYgKGRhdGVTdHJpbmdzLnRpbWUpIHtcbiAgICB0aW1lID0gcGFyc2VUaW1lKGRhdGVTdHJpbmdzLnRpbWUpO1xuICAgIGlmIChpc05hTih0aW1lKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRhdGVTdHJpbmdzLnRpbWV6b25lKSB7XG4gICAgb2Zmc2V0ID0gcGFyc2VUaW1lem9uZShkYXRlU3RyaW5ncy50aW1lem9uZSk7XG4gICAgaWYgKGlzTmFOKG9mZnNldCkpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkaXJ0eURhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXAgKyB0aW1lKTtcbiAgICAvLyBKUyBwYXJzZWQgc3RyaW5nIGFzc3VtaW5nIGl0J3MgaW4gVVRDIHRpbWV6b25lXG4gICAgLy8gYnV0IHdlIG5lZWQgaXQgdG8gYmUgcGFyc2VkIGluIG91ciB0aW1lem9uZVxuICAgIC8vIHNvIHdlIHVzZSB1dGMgdmFsdWVzIHRvIGJ1aWxkIGRhdGUgaW4gb3VyIHRpbWV6b25lLlxuICAgIC8vIFllYXIgdmFsdWVzIGZyb20gMCB0byA5OSBtYXAgdG8gdGhlIHllYXJzIDE5MDAgdG8gMTk5OVxuICAgIC8vIHNvIHNldCB5ZWFyIGV4cGxpY2l0bHkgd2l0aCBzZXRGdWxsWWVhci5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRGF0ZSgwKTtcbiAgICByZXN1bHQuc2V0RnVsbFllYXIoXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENNb250aCgpLFxuICAgICAgZGlydHlEYXRlLmdldFVUQ0RhdGUoKSxcbiAgICApO1xuICAgIHJlc3VsdC5zZXRIb3VycyhcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENIb3VycygpLFxuICAgICAgZGlydHlEYXRlLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENTZWNvbmRzKCksXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBEYXRlKHRpbWVzdGFtcCArIHRpbWUgKyBvZmZzZXQpO1xufVxuXG5jb25zdCBwYXR0ZXJucyA9IHtcbiAgZGF0ZVRpbWVEZWxpbWl0ZXI6IC9bVCBdLyxcbiAgdGltZVpvbmVEZWxpbWl0ZXI6IC9bWiBdL2ksXG4gIHRpbWV6b25lOiAvKFtaKy1dLiopJC8sXG59O1xuXG5jb25zdCBkYXRlUmVnZXggPVxuICAvXi0/KD86KFxcZHszfSl8KFxcZHsyfSkoPzotPyhcXGR7Mn0pKT98VyhcXGR7Mn0pKD86LT8oXFxkezF9KSk/fCkkLztcbmNvbnN0IHRpbWVSZWdleCA9XG4gIC9eKFxcZHsyfSg/OlsuLF1cXGQqKT8pKD86Oj8oXFxkezJ9KD86Wy4sXVxcZCopPykpPyg/Ojo/KFxcZHsyfSg/OlsuLF1cXGQqKT8pKT8kLztcbmNvbnN0IHRpbWV6b25lUmVnZXggPSAvXihbKy1dKShcXGR7Mn0pKD86Oj8oXFxkezJ9KSk/JC87XG5cbmZ1bmN0aW9uIHNwbGl0RGF0ZVN0cmluZyhkYXRlU3RyaW5nKSB7XG4gIGNvbnN0IGRhdGVTdHJpbmdzID0ge307XG4gIGNvbnN0IGFycmF5ID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy5kYXRlVGltZURlbGltaXRlcik7XG4gIGxldCB0aW1lU3RyaW5nO1xuXG4gIC8vIFRoZSByZWdleCBtYXRjaCBzaG91bGQgb25seSByZXR1cm4gYXQgbWF4aW11bSB0d28gYXJyYXkgZWxlbWVudHMuXG4gIC8vIFtkYXRlXSwgW3RpbWVdLCBvciBbZGF0ZSwgdGltZV0uXG4gIGlmIChhcnJheS5sZW5ndGggPiAyKSB7XG4gICAgcmV0dXJuIGRhdGVTdHJpbmdzO1xuICB9XG5cbiAgaWYgKC86Ly50ZXN0KGFycmF5WzBdKSkge1xuICAgIHRpbWVTdHJpbmcgPSBhcnJheVswXTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlU3RyaW5ncy5kYXRlID0gYXJyYXlbMF07XG4gICAgdGltZVN0cmluZyA9IGFycmF5WzFdO1xuICAgIGlmIChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlci50ZXN0KGRhdGVTdHJpbmdzLmRhdGUpKSB7XG4gICAgICBkYXRlU3RyaW5ncy5kYXRlID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlcilbMF07XG4gICAgICB0aW1lU3RyaW5nID0gZGF0ZVN0cmluZy5zdWJzdHIoXG4gICAgICAgIGRhdGVTdHJpbmdzLmRhdGUubGVuZ3RoLFxuICAgICAgICBkYXRlU3RyaW5nLmxlbmd0aCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRpbWVTdHJpbmcpIHtcbiAgICBjb25zdCB0b2tlbiA9IHBhdHRlcm5zLnRpbWV6b25lLmV4ZWModGltZVN0cmluZyk7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBkYXRlU3RyaW5ncy50aW1lID0gdGltZVN0cmluZy5yZXBsYWNlKHRva2VuWzFdLCBcIlwiKTtcbiAgICAgIGRhdGVTdHJpbmdzLnRpbWV6b25lID0gdG9rZW5bMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGVTdHJpbmdzLnRpbWUgPSB0aW1lU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRlU3RyaW5ncztcbn1cblxuZnVuY3Rpb24gcGFyc2VZZWFyKGRhdGVTdHJpbmcsIGFkZGl0aW9uYWxEaWdpdHMpIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIFwiXig/OihcXFxcZHs0fXxbKy1dXFxcXGR7XCIgK1xuICAgICAgKDQgKyBhZGRpdGlvbmFsRGlnaXRzKSArXG4gICAgICBcIn0pfChcXFxcZHsyfXxbKy1dXFxcXGR7XCIgK1xuICAgICAgKDIgKyBhZGRpdGlvbmFsRGlnaXRzKSArXG4gICAgICBcIn0pJClcIixcbiAgKTtcblxuICBjb25zdCBjYXB0dXJlcyA9IGRhdGVTdHJpbmcubWF0Y2gocmVnZXgpO1xuICAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgeWVhclxuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4geyB5ZWFyOiBOYU4sIHJlc3REYXRlU3RyaW5nOiBcIlwiIH07XG5cbiAgY29uc3QgeWVhciA9IGNhcHR1cmVzWzFdID8gcGFyc2VJbnQoY2FwdHVyZXNbMV0pIDogbnVsbDtcbiAgY29uc3QgY2VudHVyeSA9IGNhcHR1cmVzWzJdID8gcGFyc2VJbnQoY2FwdHVyZXNbMl0pIDogbnVsbDtcblxuICAvLyBlaXRoZXIgeWVhciBvciBjZW50dXJ5IGlzIG51bGwsIG5vdCBib3RoXG4gIHJldHVybiB7XG4gICAgeWVhcjogY2VudHVyeSA9PT0gbnVsbCA/IHllYXIgOiBjZW50dXJ5ICogMTAwLFxuICAgIHJlc3REYXRlU3RyaW5nOiBkYXRlU3RyaW5nLnNsaWNlKChjYXB0dXJlc1sxXSB8fCBjYXB0dXJlc1syXSkubGVuZ3RoKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlKGRhdGVTdHJpbmcsIHllYXIpIHtcbiAgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHllYXJcbiAgaWYgKHllYXIgPT09IG51bGwpIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuXG4gIGNvbnN0IGNhcHR1cmVzID0gZGF0ZVN0cmluZy5tYXRjaChkYXRlUmVnZXgpO1xuICAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgc3RyaW5nXG4gIGlmICghY2FwdHVyZXMpIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuXG4gIGNvbnN0IGlzV2Vla0RhdGUgPSAhIWNhcHR1cmVzWzRdO1xuICBjb25zdCBkYXlPZlllYXIgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzFdKTtcbiAgY29uc3QgbW9udGggPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzJdKSAtIDE7XG4gIGNvbnN0IGRheSA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbM10pO1xuICBjb25zdCB3ZWVrID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1s0XSk7XG4gIGNvbnN0IGRheU9mV2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNV0pIC0gMTtcblxuICBpZiAoaXNXZWVrRGF0ZSkge1xuICAgIGlmICghdmFsaWRhdGVXZWVrRGF0ZSh5ZWFyLCB3ZWVrLCBkYXlPZldlZWspKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gICAgcmV0dXJuIGRheU9mSVNPV2Vla1llYXIoeWVhciwgd2VlaywgZGF5T2ZXZWVrKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgaWYgKFxuICAgICAgIXZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSB8fFxuICAgICAgIXZhbGlkYXRlRGF5T2ZZZWFyRGF0ZSh5ZWFyLCBkYXlPZlllYXIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5ZWFyLCBtb250aCwgTWF0aC5tYXgoZGF5T2ZZZWFyLCBkYXkpKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZURhdGVVbml0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IHBhcnNlSW50KHZhbHVlKSA6IDE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZSh0aW1lU3RyaW5nKSB7XG4gIGNvbnN0IGNhcHR1cmVzID0gdGltZVN0cmluZy5tYXRjaCh0aW1lUmVnZXgpO1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gTmFOOyAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgdGltZVxuXG4gIGNvbnN0IGhvdXJzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1sxXSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzJdKTtcbiAgY29uc3Qgc2Vjb25kcyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbM10pO1xuXG4gIGlmICghdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGhvdXJzICogX2luZGV4Lm1pbGxpc2Vjb25kc0luSG91ciArXG4gICAgbWludXRlcyAqIF9pbmRleC5taWxsaXNlY29uZHNJbk1pbnV0ZSArXG4gICAgc2Vjb25kcyAqIDEwMDBcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lVW5pdCh2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHBhcnNlRmxvYXQodmFsdWUucmVwbGFjZShcIixcIiwgXCIuXCIpKSkgfHwgMDtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lem9uZSh0aW1lem9uZVN0cmluZykge1xuICBpZiAodGltZXpvbmVTdHJpbmcgPT09IFwiWlwiKSByZXR1cm4gMDtcblxuICBjb25zdCBjYXB0dXJlcyA9IHRpbWV6b25lU3RyaW5nLm1hdGNoKHRpbWV6b25lUmVnZXgpO1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gMDtcblxuICBjb25zdCBzaWduID0gY2FwdHVyZXNbMV0gPT09IFwiK1wiID8gLTEgOiAxO1xuICBjb25zdCBob3VycyA9IHBhcnNlSW50KGNhcHR1cmVzWzJdKTtcbiAgY29uc3QgbWludXRlcyA9IChjYXB0dXJlc1szXSAmJiBwYXJzZUludChjYXB0dXJlc1szXSkpIHx8IDA7XG5cbiAgaWYgKCF2YWxpZGF0ZVRpbWV6b25lKGhvdXJzLCBtaW51dGVzKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHNpZ24gKlxuICAgIChob3VycyAqIF9pbmRleC5taWxsaXNlY29uZHNJbkhvdXIgKyBtaW51dGVzICogX2luZGV4Lm1pbGxpc2Vjb25kc0luTWludXRlKVxuICApO1xufVxuXG5mdW5jdGlvbiBkYXlPZklTT1dlZWtZZWFyKGlzb1dlZWtZZWFyLCB3ZWVrLCBkYXkpIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDApO1xuICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGlzb1dlZWtZZWFyLCAwLCA0KTtcbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5RGF5ID0gZGF0ZS5nZXRVVENEYXkoKSB8fCA3O1xuICBjb25zdCBkaWZmID0gKHdlZWsgLSAxKSAqIDcgKyBkYXkgKyAxIC0gZm91cnRoT2ZKYW51YXJ5RGF5O1xuICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBkaWZmKTtcbiAgcmV0dXJuIGRhdGU7XG59XG5cbi8vIFZhbGlkYXRpb24gZnVuY3Rpb25zXG5cbi8vIEZlYnJ1YXJ5IGlzIG51bGwgdG8gaGFuZGxlIHRoZSBsZWFwIHllYXIgKHVzaW5nIHx8KVxuY29uc3QgZGF5c0luTW9udGhzID0gWzMxLCBudWxsLCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07XG5cbmZ1bmN0aW9uIGlzTGVhcFllYXJJbmRleCh5ZWFyKSB7XG4gIHJldHVybiB5ZWFyICUgNDAwID09PSAwIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXRlKSB7XG4gIHJldHVybiAoXG4gICAgbW9udGggPj0gMCAmJlxuICAgIG1vbnRoIDw9IDExICYmXG4gICAgZGF0ZSA+PSAxICYmXG4gICAgZGF0ZSA8PSAoZGF5c0luTW9udGhzW21vbnRoXSB8fCAoaXNMZWFwWWVhckluZGV4KHllYXIpID8gMjkgOiAyOCkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGF5T2ZZZWFyRGF0ZSh5ZWFyLCBkYXlPZlllYXIpIHtcbiAgcmV0dXJuIGRheU9mWWVhciA+PSAxICYmIGRheU9mWWVhciA8PSAoaXNMZWFwWWVhckluZGV4KHllYXIpID8gMzY2IDogMzY1KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVXZWVrRGF0ZShfeWVhciwgd2VlaywgZGF5KSB7XG4gIHJldHVybiB3ZWVrID49IDEgJiYgd2VlayA8PSA1MyAmJiBkYXkgPj0gMCAmJiBkYXkgPD0gNjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSB7XG4gIGlmIChob3VycyA9PT0gMjQpIHtcbiAgICByZXR1cm4gbWludXRlcyA9PT0gMCAmJiBzZWNvbmRzID09PSAwO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBzZWNvbmRzID49IDAgJiZcbiAgICBzZWNvbmRzIDwgNjAgJiZcbiAgICBtaW51dGVzID49IDAgJiZcbiAgICBtaW51dGVzIDwgNjAgJiZcbiAgICBob3VycyA+PSAwICYmXG4gICAgaG91cnMgPCAyNVxuICApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRpbWV6b25lKF9ob3VycywgbWludXRlcykge1xuICByZXR1cm4gbWludXRlcyA+PSAwICYmIG1pbnV0ZXMgPD0gNTk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuUGFyc2VyID0gdm9pZCAwO1xudmFyIF9TZXR0ZXIgPSByZXF1aXJlKFwiLi9TZXR0ZXIuanNcIik7XG5cbmNsYXNzIFBhcnNlciB7XG4gIHJ1bihkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gsIG9wdGlvbnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCwgb3B0aW9ucyk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXR0ZXI6IG5ldyBfU2V0dGVyLlZhbHVlU2V0dGVyKFxuICAgICAgICByZXN1bHQudmFsdWUsXG4gICAgICAgIHRoaXMudmFsaWRhdGUsXG4gICAgICAgIHRoaXMuc2V0LFxuICAgICAgICB0aGlzLnByaW9yaXR5LFxuICAgICAgICB0aGlzLnN1YlByaW9yaXR5LFxuICAgICAgKSxcbiAgICAgIHJlc3Q6IHJlc3VsdC5yZXN0LFxuICAgIH07XG4gIH1cblxuICB2YWxpZGF0ZShfdXRjRGF0ZSwgX3ZhbHVlLCBfb3B0aW9ucykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5leHBvcnRzLlBhcnNlciA9IFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5WYWx1ZVNldHRlciA9XG4gIGV4cG9ydHMuU2V0dGVyID1cbiAgZXhwb3J0cy5EYXRlVG9TeXN0ZW1UaW1lem9uZVNldHRlciA9XG4gICAgdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi90cmFuc3Bvc2UuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG5jb25zdCBUSU1FWk9ORV9VTklUX1BSSU9SSVRZID0gMTA7XG5cbmNsYXNzIFNldHRlciB7XG4gIHN1YlByaW9yaXR5ID0gMDtcblxuICB2YWxpZGF0ZShfdXRjRGF0ZSwgX29wdGlvbnMpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuZXhwb3J0cy5TZXR0ZXIgPSBTZXR0ZXI7XG5cbmNsYXNzIFZhbHVlU2V0dGVyIGV4dGVuZHMgU2V0dGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgdmFsdWUsXG5cbiAgICB2YWxpZGF0ZVZhbHVlLFxuXG4gICAgc2V0VmFsdWUsXG5cbiAgICBwcmlvcml0eSxcbiAgICBzdWJQcmlvcml0eSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlID0gdmFsaWRhdGVWYWx1ZTtcbiAgICB0aGlzLnNldFZhbHVlID0gc2V0VmFsdWU7XG4gICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5O1xuICAgIGlmIChzdWJQcmlvcml0eSkge1xuICAgICAgdGhpcy5zdWJQcmlvcml0eSA9IHN1YlByaW9yaXR5O1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKGRhdGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVZhbHVlKGRhdGUsIHRoaXMudmFsdWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWUoZGF0ZSwgZmxhZ3MsIHRoaXMudmFsdWUsIG9wdGlvbnMpO1xuICB9XG59XG5leHBvcnRzLlZhbHVlU2V0dGVyID0gVmFsdWVTZXR0ZXI7XG5cbmNsYXNzIERhdGVUb1N5c3RlbVRpbWV6b25lU2V0dGVyIGV4dGVuZHMgU2V0dGVyIHtcbiAgcHJpb3JpdHkgPSBUSU1FWk9ORV9VTklUX1BSSU9SSVRZO1xuICBzdWJQcmlvcml0eSA9IC0xO1xuICBzZXQoZGF0ZSwgZmxhZ3MpIHtcbiAgICBpZiAoZmxhZ3MudGltZXN0YW1wSXNTZXQpIHJldHVybiBkYXRlO1xuICAgIHJldHVybiAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCAoMCwgX2luZGV4LnRyYW5zcG9zZSkoZGF0ZSwgRGF0ZSkpO1xuICB9XG59XG5leHBvcnRzLkRhdGVUb1N5c3RlbVRpbWV6b25lU2V0dGVyID0gRGF0ZVRvU3lzdGVtVGltZXpvbmVTZXR0ZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMudGltZXpvbmVQYXR0ZXJucyA9IGV4cG9ydHMubnVtZXJpY1BhdHRlcm5zID0gdm9pZCAwO1xuY29uc3QgbnVtZXJpY1BhdHRlcm5zID0gKGV4cG9ydHMubnVtZXJpY1BhdHRlcm5zID0ge1xuICBtb250aDogL14oMVswLTJdfDA/XFxkKS8sIC8vIDAgdG8gMTJcbiAgZGF0ZTogL14oM1swLTFdfFswLTJdP1xcZCkvLCAvLyAwIHRvIDMxXG4gIGRheU9mWWVhcjogL14oMzZbMC02XXwzWzAtNV1cXGR8WzAtMl0/XFxkP1xcZCkvLCAvLyAwIHRvIDM2NlxuICB3ZWVrOiAvXig1WzAtM118WzAtNF0/XFxkKS8sIC8vIDAgdG8gNTNcbiAgaG91cjIzaDogL14oMlswLTNdfFswLTFdP1xcZCkvLCAvLyAwIHRvIDIzXG4gIGhvdXIyNGg6IC9eKDJbMC00XXxbMC0xXT9cXGQpLywgLy8gMCB0byAyNFxuICBob3VyMTFoOiAvXigxWzAtMV18MD9cXGQpLywgLy8gMCB0byAxMVxuICBob3VyMTJoOiAvXigxWzAtMl18MD9cXGQpLywgLy8gMCB0byAxMlxuICBtaW51dGU6IC9eWzAtNV0/XFxkLywgLy8gMCB0byA1OVxuICBzZWNvbmQ6IC9eWzAtNV0/XFxkLywgLy8gMCB0byA1OVxuXG4gIHNpbmdsZURpZ2l0OiAvXlxcZC8sIC8vIDAgdG8gOVxuICB0d29EaWdpdHM6IC9eXFxkezEsMn0vLCAvLyAwIHRvIDk5XG4gIHRocmVlRGlnaXRzOiAvXlxcZHsxLDN9LywgLy8gMCB0byA5OTlcbiAgZm91ckRpZ2l0czogL15cXGR7MSw0fS8sIC8vIDAgdG8gOTk5OVxuXG4gIGFueURpZ2l0c1NpZ25lZDogL14tP1xcZCsvLFxuICBzaW5nbGVEaWdpdFNpZ25lZDogL14tP1xcZC8sIC8vIDAgdG8gOSwgLTAgdG8gLTlcbiAgdHdvRGlnaXRzU2lnbmVkOiAvXi0/XFxkezEsMn0vLCAvLyAwIHRvIDk5LCAtMCB0byAtOTlcbiAgdGhyZWVEaWdpdHNTaWduZWQ6IC9eLT9cXGR7MSwzfS8sIC8vIDAgdG8gOTk5LCAtMCB0byAtOTk5XG4gIGZvdXJEaWdpdHNTaWduZWQ6IC9eLT9cXGR7MSw0fS8sIC8vIDAgdG8gOTk5OSwgLTAgdG8gLTk5OTlcbn0pO1xuXG5jb25zdCB0aW1lem9uZVBhdHRlcm5zID0gKGV4cG9ydHMudGltZXpvbmVQYXR0ZXJucyA9IHtcbiAgYmFzaWNPcHRpb25hbE1pbnV0ZXM6IC9eKFsrLV0pKFxcZHsyfSkoXFxkezJ9KT98Wi8sXG4gIGJhc2ljOiAvXihbKy1dKShcXGR7Mn0pKFxcZHsyfSl8Wi8sXG4gIGJhc2ljT3B0aW9uYWxTZWNvbmRzOiAvXihbKy1dKShcXGR7Mn0pKFxcZHsyfSkoKFxcZHsyfSkpP3xaLyxcbiAgZXh0ZW5kZWQ6IC9eKFsrLV0pKFxcZHsyfSk6KFxcZHsyfSl8Wi8sXG4gIGV4dGVuZGVkT3B0aW9uYWxTZWNvbmRzOiAvXihbKy1dKShcXGR7Mn0pOihcXGR7Mn0pKDooXFxkezJ9KSk/fFovLFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMucGFyc2VycyA9IHZvaWQgMDtcbnZhciBfRXJhUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9FcmFQYXJzZXIuanNcIik7XG52YXIgX1llYXJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1llYXJQYXJzZXIuanNcIik7XG52YXIgX0xvY2FsV2Vla1llYXJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0xvY2FsV2Vla1llYXJQYXJzZXIuanNcIik7XG52YXIgX0lTT1dlZWtZZWFyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9JU09XZWVrWWVhclBhcnNlci5qc1wiKTtcbnZhciBfRXh0ZW5kZWRZZWFyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9FeHRlbmRlZFllYXJQYXJzZXIuanNcIik7XG52YXIgX1F1YXJ0ZXJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1F1YXJ0ZXJQYXJzZXIuanNcIik7XG52YXIgX1N0YW5kQWxvbmVRdWFydGVyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9TdGFuZEFsb25lUXVhcnRlclBhcnNlci5qc1wiKTtcbnZhciBfTW9udGhQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL01vbnRoUGFyc2VyLmpzXCIpO1xudmFyIF9TdGFuZEFsb25lTW9udGhQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1N0YW5kQWxvbmVNb250aFBhcnNlci5qc1wiKTtcbnZhciBfTG9jYWxXZWVrUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Mb2NhbFdlZWtQYXJzZXIuanNcIik7XG52YXIgX0lTT1dlZWtQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0lTT1dlZWtQYXJzZXIuanNcIik7XG52YXIgX0RhdGVQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0RhdGVQYXJzZXIuanNcIik7XG52YXIgX0RheU9mWWVhclBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvRGF5T2ZZZWFyUGFyc2VyLmpzXCIpO1xudmFyIF9EYXlQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0RheVBhcnNlci5qc1wiKTtcbnZhciBfTG9jYWxEYXlQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0xvY2FsRGF5UGFyc2VyLmpzXCIpO1xudmFyIF9TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1N0YW5kQWxvbmVMb2NhbERheVBhcnNlci5qc1wiKTtcbnZhciBfSVNPRGF5UGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9JU09EYXlQYXJzZXIuanNcIik7XG52YXIgX0FNUE1QYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0FNUE1QYXJzZXIuanNcIik7XG52YXIgX0FNUE1NaWRuaWdodFBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvQU1QTU1pZG5pZ2h0UGFyc2VyLmpzXCIpO1xudmFyIF9EYXlQZXJpb2RQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0RheVBlcmlvZFBhcnNlci5qc1wiKTtcbnZhciBfSG91cjF0bzEyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Ib3VyMXRvMTJQYXJzZXIuanNcIik7XG52YXIgX0hvdXIwdG8yM1BhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSG91cjB0bzIzUGFyc2VyLmpzXCIpO1xudmFyIF9Ib3VyMFRvMTFQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0hvdXIwVG8xMVBhcnNlci5qc1wiKTtcbnZhciBfSG91cjFUbzI0UGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Ib3VyMVRvMjRQYXJzZXIuanNcIik7XG52YXIgX01pbnV0ZVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvTWludXRlUGFyc2VyLmpzXCIpO1xudmFyIF9TZWNvbmRQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1NlY29uZFBhcnNlci5qc1wiKTtcbnZhciBfRnJhY3Rpb25PZlNlY29uZFBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvRnJhY3Rpb25PZlNlY29uZFBhcnNlci5qc1wiKTtcbnZhciBfSVNPVGltZXpvbmVXaXRoWlBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSVNPVGltZXpvbmVXaXRoWlBhcnNlci5qc1wiKTtcbnZhciBfSVNPVGltZXpvbmVQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0lTT1RpbWV6b25lUGFyc2VyLmpzXCIpO1xudmFyIF9UaW1lc3RhbXBTZWNvbmRzUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9UaW1lc3RhbXBTZWNvbmRzUGFyc2VyLmpzXCIpO1xudmFyIF9UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5qc1wiKTtcblxuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgTWlsbGlzZWNvbmRzIGluIGRheSAgICAgICAgICAgIHxcbiAqIHwgIGIgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgIHwgIEIgIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgIHxcbiAqIHwgIGMgIHwgU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWsgIHwgIEMqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGUgIHwgTG9jYWwgZGF5IG9mIHdlZWsgICAgICAgICAgICAgIHwgIEUgIHwgRGF5IG9mIHdlZWsgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGYgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEYqIHwgRGF5IG9mIHdlZWsgaW4gbW9udGggICAgICAgICAgIHxcbiAqIHwgIGcqIHwgTW9kaWZpZWQgSnVsaWFuIGRheSAgICAgICAgICAgIHwgIEcgIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGkhIHwgSVNPIGRheSBvZiB3ZWVrICAgICAgICAgICAgICAgIHwgIEkhIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgIHxcbiAqIHwgIGoqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHwgIEoqIHwgTG9jYWxpemVkIGhvdXIgdy9vIGRheSBwZXJpb2QgIHxcbiAqIHwgIGsgIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgIHwgIEsgIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGwqIHwgKGRlcHJlY2F0ZWQpICAgICAgICAgICAgICAgICAgIHwgIEwgIHwgU3RhbmQtYWxvbmUgbW9udGggICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG8hIHwgT3JkaW5hbCBudW1iZXIgbW9kaWZpZXIgICAgICAgIHwgIE8qIHwgVGltZXpvbmUgKEdNVCkgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHEgIHwgU3RhbmQtYWxvbmUgcXVhcnRlciAgICAgICAgICAgIHwgIFEgIHwgUXVhcnRlciAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHIqIHwgUmVsYXRlZCBHcmVnb3JpYW4geWVhciAgICAgICAgIHwgIFIhIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHQhIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgIHwgIFQhIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgIHxcbiAqIHwgIHUgIHwgRXh0ZW5kZWQgeWVhciAgICAgICAgICAgICAgICAgIHwgIFUqIHwgQ3ljbGljIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHYqIHwgVGltZXpvbmUgKGdlbmVyaWMgbm9uLWxvY2F0LikgIHwgIFYqIHwgVGltZXpvbmUgKGxvY2F0aW9uKSAgICAgICAgICAgIHxcbiAqIHwgIHcgIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgIHwgIFcqIHwgV2VlayBvZiBtb250aCAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHggIHwgVGltZXpvbmUgKElTTy04NjAxIHcvbyBaKSAgICAgIHwgIFggIHwgVGltZXpvbmUgKElTTy04NjAxKSAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgIHxcbiAqIHwgIHoqIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pIHwgIFoqIHwgVGltZXpvbmUgKGFsaWFzZXMpICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgISBhcmUgbm9uLXN0YW5kYXJkLCBidXQgaW1wbGVtZW50ZWQgYnkgZGF0ZS1mbnM6XG4gKiAtIGBvYCBtb2RpZmllcyB0aGUgcHJldmlvdXMgdG9rZW4gdG8gdHVybiBpdCBpbnRvIGFuIG9yZGluYWwgKHNlZSBgcGFyc2VgIGRvY3MpXG4gKiAtIGBpYCBpcyBJU08gZGF5IG9mIHdlZWsuIEZvciBgaWAgYW5kIGBpaWAgaXMgcmV0dXJucyBudW1lcmljIElTTyB3ZWVrIGRheXMsXG4gKiAgIGkuZS4gNyBmb3IgU3VuZGF5LCAxIGZvciBNb25kYXksIGV0Yy5cbiAqIC0gYElgIGlzIElTTyB3ZWVrIG9mIHllYXIsIGFzIG9wcG9zZWQgdG8gYHdgIHdoaWNoIGlzIGxvY2FsIHdlZWsgb2YgeWVhci5cbiAqIC0gYFJgIGlzIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyLCBhcyBvcHBvc2VkIHRvIGBZYCB3aGljaCBpcyBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogICBgUmAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGBJYCBhbmQgYGlgXG4gKiAgIGZvciB1bml2ZXJzYWwgSVNPIHdlZWstbnVtYmVyaW5nIGRhdGUsIHdoZXJlYXNcbiAqICAgYFlgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgd2AgYW5kIGBlYFxuICogICBmb3Igd2Vlay1udW1iZXJpbmcgZGF0ZSBzcGVjaWZpYyB0byB0aGUgbG9jYWxlLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBJdCdzIG9rLCB3ZSB3YW50IGFueSBoZXJlXG5jb25zdCBwYXJzZXJzID0gKGV4cG9ydHMucGFyc2VycyA9IHtcbiAgRzogbmV3IF9FcmFQYXJzZXIuRXJhUGFyc2VyKCksXG4gIHk6IG5ldyBfWWVhclBhcnNlci5ZZWFyUGFyc2VyKCksXG4gIFk6IG5ldyBfTG9jYWxXZWVrWWVhclBhcnNlci5Mb2NhbFdlZWtZZWFyUGFyc2VyKCksXG4gIFI6IG5ldyBfSVNPV2Vla1llYXJQYXJzZXIuSVNPV2Vla1llYXJQYXJzZXIoKSxcbiAgdTogbmV3IF9FeHRlbmRlZFllYXJQYXJzZXIuRXh0ZW5kZWRZZWFyUGFyc2VyKCksXG4gIFE6IG5ldyBfUXVhcnRlclBhcnNlci5RdWFydGVyUGFyc2VyKCksXG4gIHE6IG5ldyBfU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIoKSxcbiAgTTogbmV3IF9Nb250aFBhcnNlci5Nb250aFBhcnNlcigpLFxuICBMOiBuZXcgX1N0YW5kQWxvbmVNb250aFBhcnNlci5TdGFuZEFsb25lTW9udGhQYXJzZXIoKSxcbiAgdzogbmV3IF9Mb2NhbFdlZWtQYXJzZXIuTG9jYWxXZWVrUGFyc2VyKCksXG4gIEk6IG5ldyBfSVNPV2Vla1BhcnNlci5JU09XZWVrUGFyc2VyKCksXG4gIGQ6IG5ldyBfRGF0ZVBhcnNlci5EYXRlUGFyc2VyKCksXG4gIEQ6IG5ldyBfRGF5T2ZZZWFyUGFyc2VyLkRheU9mWWVhclBhcnNlcigpLFxuICBFOiBuZXcgX0RheVBhcnNlci5EYXlQYXJzZXIoKSxcbiAgZTogbmV3IF9Mb2NhbERheVBhcnNlci5Mb2NhbERheVBhcnNlcigpLFxuICBjOiBuZXcgX1N0YW5kQWxvbmVMb2NhbERheVBhcnNlci5TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIoKSxcbiAgaTogbmV3IF9JU09EYXlQYXJzZXIuSVNPRGF5UGFyc2VyKCksXG4gIGE6IG5ldyBfQU1QTVBhcnNlci5BTVBNUGFyc2VyKCksXG4gIGI6IG5ldyBfQU1QTU1pZG5pZ2h0UGFyc2VyLkFNUE1NaWRuaWdodFBhcnNlcigpLFxuICBCOiBuZXcgX0RheVBlcmlvZFBhcnNlci5EYXlQZXJpb2RQYXJzZXIoKSxcbiAgaDogbmV3IF9Ib3VyMXRvMTJQYXJzZXIuSG91cjF0bzEyUGFyc2VyKCksXG4gIEg6IG5ldyBfSG91cjB0bzIzUGFyc2VyLkhvdXIwdG8yM1BhcnNlcigpLFxuICBLOiBuZXcgX0hvdXIwVG8xMVBhcnNlci5Ib3VyMFRvMTFQYXJzZXIoKSxcbiAgazogbmV3IF9Ib3VyMVRvMjRQYXJzZXIuSG91cjFUbzI0UGFyc2VyKCksXG4gIG06IG5ldyBfTWludXRlUGFyc2VyLk1pbnV0ZVBhcnNlcigpLFxuICBzOiBuZXcgX1NlY29uZFBhcnNlci5TZWNvbmRQYXJzZXIoKSxcbiAgUzogbmV3IF9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyLkZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIoKSxcbiAgWDogbmV3IF9JU09UaW1lem9uZVdpdGhaUGFyc2VyLklTT1RpbWV6b25lV2l0aFpQYXJzZXIoKSxcbiAgeDogbmV3IF9JU09UaW1lem9uZVBhcnNlci5JU09UaW1lem9uZVBhcnNlcigpLFxuICB0OiBuZXcgX1RpbWVzdGFtcFNlY29uZHNQYXJzZXIuVGltZXN0YW1wU2Vjb25kc1BhcnNlcigpLFxuICBUOiBuZXcgX1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIoKSxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkFNUE1NaWRuaWdodFBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgQU1QTU1pZG5pZ2h0UGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDgwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJiXCI6XG4gICAgICBjYXNlIFwiYmJcIjpcbiAgICAgIGNhc2UgXCJiYmJcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSBcImJiYmJiXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJiXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRIb3VycygoMCwgX3V0aWxzLmRheVBlcmlvZEVudW1Ub0hvdXJzKSh2YWx1ZSksIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiYVwiLCBcIkJcIiwgXCJIXCIsIFwia1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5BTVBNTWlkbmlnaHRQYXJzZXIgPSBBTVBNTWlkbmlnaHRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuQU1QTVBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgQU1QTVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA4MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgY2FzZSBcImFhXCI6XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgXCJhYWFhYVwiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYWFhYVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0SG91cnMoKDAsIF91dGlscy5kYXlQZXJpb2RFbnVtVG9Ib3VycykodmFsdWUpLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcImJcIiwgXCJCXCIsIFwiSFwiLCBcImtcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuQU1QTVBhcnNlciA9IEFNUE1QYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRGF0ZVBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY29uc3QgREFZU19JTl9NT05USCA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcbmNvbnN0IERBWVNfSU5fTU9OVEhfTEVBUF9ZRUFSID0gW1xuICAzMSwgMjksIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxLFxuXTtcblxuLy8gRGF5IG9mIHRoZSBtb250aFxuY2xhc3MgRGF0ZVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcbiAgc3ViUHJpb3JpdHkgPSAxO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmRhdGUsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJkb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKGRhdGUsIHZhbHVlKSB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBpc0xlYXBZZWFyID0gKDAsIF91dGlscy5pc0xlYXBZZWFySW5kZXgpKHllYXIpO1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIGlmIChpc0xlYXBZZWFyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSBEQVlTX0lOX01PTlRIX0xFQVBfWUVBUlttb250aF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IERBWVNfSU5fTU9OVEhbbW9udGhdO1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXREYXRlKHZhbHVlKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiWVwiLFxuICAgIFwiUlwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwid1wiLFxuICAgIFwiSVwiLFxuICAgIFwiRFwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5EYXRlUGFyc2VyID0gRGF0ZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5EYXlPZlllYXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIERheU9mWWVhclBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcblxuICBzdWJwcmlvcml0eSA9IDE7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkRcIjpcbiAgICAgIGNhc2UgXCJERFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5kYXlPZlllYXIsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJEb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKGRhdGUsIHZhbHVlKSB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBpc0xlYXBZZWFyID0gKDAsIF91dGlscy5pc0xlYXBZZWFySW5kZXgpKHllYXIpO1xuICAgIGlmIChpc0xlYXBZZWFyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAzNjY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDM2NTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TW9udGgoMCwgdmFsdWUpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJZXCIsXG4gICAgXCJSXCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJFXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLkRheU9mWWVhclBhcnNlciA9IERheU9mWWVhclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5EYXlQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3NldERheS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxuLy8gRGF5IG9mIHdlZWtcbmNsYXNzIERheVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiRUVcIjpcbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gVFxuICAgICAgY2FzZSBcIkVFRUVFXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiRUVFRUVFXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcIkVFRUVcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDY7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIGRhdGUgPSAoMCwgX2luZGV4LnNldERheSkoZGF0ZSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJEXCIsIFwiaVwiLCBcImVcIiwgXCJjXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkRheVBhcnNlciA9IERheVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5EYXlQZXJpb2RQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbmNsYXNzIERheVBlcmlvZFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA4MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiQlwiOlxuICAgICAgY2FzZSBcIkJCXCI6XG4gICAgICBjYXNlIFwiQkJCXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgXCJCQkJCQlwiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiQkJCQlwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0SG91cnMoKDAsIF91dGlscy5kYXlQZXJpb2RFbnVtVG9Ib3VycykodmFsdWUpLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcImFcIiwgXCJiXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkRheVBlcmlvZFBhcnNlciA9IERheVBlcmlvZFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5FcmFQYXJzZXIgPSB2b2lkIDA7XG5cbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxuY2xhc3MgRXJhUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDE0MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBBRCwgQkNcbiAgICAgIGNhc2UgXCJHXCI6XG4gICAgICBjYXNlIFwiR0dcIjpcbiAgICAgIGNhc2UgXCJHR0dcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJhYmJyZXZpYXRlZFwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gQSwgQlxuICAgICAgY2FzZSBcIkdHR0dHXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiB9KTtcbiAgICAgIC8vIEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0XG4gICAgICBjYXNlIFwiR0dHR1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJ3aWRlXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJhYmJyZXZpYXRlZFwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlKSB7XG4gICAgZmxhZ3MuZXJhID0gdmFsdWU7XG4gICAgZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZSwgMCwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcIlJcIiwgXCJ1XCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkVyYVBhcnNlciA9IEVyYVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5FeHRlbmRlZFllYXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEV4dGVuZGVkWWVhclBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHtcbiAgICBpZiAodG9rZW4gPT09IFwidVwiKSB7XG4gICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHNTaWduZWQpKDQsIGRhdGVTdHJpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0c1NpZ25lZCkodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZSwgMCwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcIkdcIiwgXCJ5XCIsIFwiWVwiLCBcIlJcIiwgXCJ3XCIsIFwiSVwiLCBcImlcIiwgXCJlXCIsIFwiY1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5FeHRlbmRlZFllYXJQYXJzZXIgPSBFeHRlbmRlZFllYXJQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRnJhY3Rpb25PZlNlY29uZFBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgRnJhY3Rpb25PZlNlY29uZFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAzMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUpID0+XG4gICAgICBNYXRoLnRydW5jKHZhbHVlICogTWF0aC5wb3coMTAsIC10b2tlbi5sZW5ndGggKyAzKSk7XG4gICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksXG4gICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzKHZhbHVlKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5GcmFjdGlvbk9mU2Vjb25kUGFyc2VyID0gRnJhY3Rpb25PZlNlY29uZFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Ib3VyMFRvMTFQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEhvdXIwVG8xMVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA3MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiS1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5ob3VyMTFoLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiS29cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxMTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgY29uc3QgaXNQTSA9IGRhdGUuZ2V0SG91cnMoKSA+PSAxMjtcbiAgICBpZiAoaXNQTSAmJiB2YWx1ZSA8IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKHZhbHVlICsgMTIsIDAsIDAsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlLnNldEhvdXJzKHZhbHVlLCAwLCAwLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJoXCIsIFwiSFwiLCBcImtcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuSG91cjBUbzExUGFyc2VyID0gSG91cjBUbzExUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkhvdXIwdG8yM1BhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgSG91cjB0bzIzUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDcwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmhvdXIyM2gsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJIb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDIzO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldEhvdXJzKHZhbHVlLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcImFcIiwgXCJiXCIsIFwiaFwiLCBcIktcIiwgXCJrXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkhvdXIwdG8yM1BhcnNlciA9IEhvdXIwdG8yM1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Ib3VyMVRvMjRQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEhvdXIxVG8yNFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA3MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwia1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5ob3VyMjRoLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwia29cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAyNDtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgY29uc3QgaG91cnMgPSB2YWx1ZSA8PSAyNCA/IHZhbHVlICUgMjQgOiB2YWx1ZTtcbiAgICBkYXRlLnNldEhvdXJzKGhvdXJzLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcImFcIiwgXCJiXCIsIFwiaFwiLCBcIkhcIiwgXCJLXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkhvdXIxVG8yNFBhcnNlciA9IEhvdXIxVG8yNFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Ib3VyMXRvMTJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEhvdXIxdG8xMlBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA3MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiaFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5ob3VyMTJoLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiaG9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAxMjtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgY29uc3QgaXNQTSA9IGRhdGUuZ2V0SG91cnMoKSA+PSAxMjtcbiAgICBpZiAoaXNQTSAmJiB2YWx1ZSA8IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKHZhbHVlICsgMTIsIDAsIDAsIDApO1xuICAgIH0gZWxzZSBpZiAoIWlzUE0gJiYgdmFsdWUgPT09IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlLnNldEhvdXJzKHZhbHVlLCAwLCAwLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJIXCIsIFwiS1wiLCBcImtcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuSG91cjF0bzEyUGFyc2VyID0gSG91cjF0bzEyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLklTT0RheVBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vc2V0SVNPRGF5LmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBJU08gZGF5IG9mIHdlZWtcbmNsYXNzIElTT0RheVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDc7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDJcbiAgICAgIGNhc2UgXCJpXCI6XG4gICAgICBjYXNlIFwiaWlcIjogLy8gMDJcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgICAgLy8gMm5kXG4gICAgICBjYXNlIFwiaW9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiaWlpXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImlpaWlpXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJpaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiaWlpaVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSA3O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlID0gKDAsIF9pbmRleC5zZXRJU09EYXkpKGRhdGUsIHZhbHVlKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwieVwiLFxuICAgIFwiWVwiLFxuICAgIFwidVwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiRVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5JU09EYXlQYXJzZXIgPSBJU09EYXlQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSVNPVGltZXpvbmVQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanNcIik7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIFRpbWV6b25lIChJU08tODYwMSlcbmNsYXNzIElTT1RpbWV6b25lUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5iYXNpY09wdGlvbmFsTWludXRlcyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInh4XCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJ4eHh4XCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbFNlY29uZHMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJ4eHh4eFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkT3B0aW9uYWxTZWNvbmRzLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwieHh4XCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZSkge1xuICAgIGlmIChmbGFncy50aW1lc3RhbXBJc1NldCkgcmV0dXJuIGRhdGU7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoXG4gICAgICBkYXRlLFxuICAgICAgZGF0ZS5nZXRUaW1lKCkgLVxuICAgICAgICAoMCwgX2luZGV4Mi5nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKShkYXRlKSAtXG4gICAgICAgIHZhbHVlLFxuICAgICk7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJ0XCIsIFwiVFwiLCBcIlhcIl07XG59XG5leHBvcnRzLklTT1RpbWV6b25lUGFyc2VyID0gSVNPVGltZXpvbmVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSVNPVGltZXpvbmVXaXRoWlBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uLy4uL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy5qc1wiKTtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gVGltZXpvbmUgKElTTy04NjAxLiArMDA6MDAgaXMgYCdaJ2ApXG5jbGFzcyBJU09UaW1lem9uZVdpdGhaUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5iYXNpY09wdGlvbmFsTWludXRlcyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIlhYXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJYWFhYXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbFNlY29uZHMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJYWFhYWFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkT3B0aW9uYWxTZWNvbmRzLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiWFhYXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZSkge1xuICAgIGlmIChmbGFncy50aW1lc3RhbXBJc1NldCkgcmV0dXJuIGRhdGU7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoXG4gICAgICBkYXRlLFxuICAgICAgZGF0ZS5nZXRUaW1lKCkgLVxuICAgICAgICAoMCwgX2luZGV4Mi5nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKShkYXRlKSAtXG4gICAgICAgIHZhbHVlLFxuICAgICk7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJ0XCIsIFwiVFwiLCBcInhcIl07XG59XG5leHBvcnRzLklTT1RpbWV6b25lV2l0aFpQYXJzZXIgPSBJU09UaW1lem9uZVdpdGhaUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLklTT1dlZWtQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3NldElTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zdGFydE9mSVNPV2Vlay5qc1wiKTtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gSVNPIHdlZWsgb2YgeWVhclxuY2xhc3MgSVNPV2Vla1BhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMDA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIklcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMud2VlayxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIklvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJ3ZWVrXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gNTM7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIHJldHVybiAoMCwgX2luZGV4Mi5zdGFydE9mSVNPV2VlaykoKDAsIF9pbmRleC5zZXRJU09XZWVrKShkYXRlLCB2YWx1ZSkpO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwieVwiLFxuICAgIFwiWVwiLFxuICAgIFwidVwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5JU09XZWVrUGFyc2VyID0gSVNPV2Vla1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5JU09XZWVrWWVhclBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vc3RhcnRPZklTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuY2xhc3MgSVNPV2Vla1llYXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTMwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7XG4gICAgaWYgKHRva2VuID09PSBcIlJcIikge1xuICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzU2lnbmVkKSg0LCBkYXRlU3RyaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHNTaWduZWQpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGNvbnN0IGZpcnN0V2Vla09mWWVhciA9ICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICAgIGZpcnN0V2Vla09mWWVhci5zZXRGdWxsWWVhcih2YWx1ZSwgMCwgNCk7XG4gICAgZmlyc3RXZWVrT2ZZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiAoMCwgX2luZGV4LnN0YXJ0T2ZJU09XZWVrKShmaXJzdFdlZWtPZlllYXIpO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiR1wiLFxuICAgIFwieVwiLFxuICAgIFwiWVwiLFxuICAgIFwidVwiLFxuICAgIFwiUVwiLFxuICAgIFwicVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5JU09XZWVrWWVhclBhcnNlciA9IElTT1dlZWtZZWFyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkxvY2FsRGF5UGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zZXREYXkuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIExvY2FsIGRheSBvZiB3ZWVrXG5jbGFzcyBMb2NhbERheVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gV2Ugd2FudCBoZXJlIGZsb29yIGluc3RlYWQgb2YgdHJ1bmMsIHNvIHdlIGdldCAtNyBmb3IgdmFsdWUgMCBpbnN0ZWFkIG9mIDBcbiAgICAgIGNvbnN0IHdob2xlV2Vla0RheXMgPSBNYXRoLmZsb29yKCh2YWx1ZSAtIDEpIC8gNykgKiA3O1xuICAgICAgcmV0dXJuICgodmFsdWUgKyBvcHRpb25zLndlZWtTdGFydHNPbiArIDYpICUgNykgKyB3aG9sZVdlZWtEYXlzO1xuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAzXG4gICAgICBjYXNlIFwiZVwiOlxuICAgICAgY2FzZSBcImVlXCI6IC8vIDAzXG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gM3JkXG4gICAgICBjYXNlIFwiZW9cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgdW5pdDogXCJkYXlcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiZWVlXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJlZWVlZVwiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImVlZWVlZVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJlZWVlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA2O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBkYXRlID0gKDAsIF9pbmRleC5zZXREYXkpKGRhdGUsIHZhbHVlLCBvcHRpb25zKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwieVwiLFxuICAgIFwiUlwiLFxuICAgIFwidVwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiRVwiLFxuICAgIFwiaVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5Mb2NhbERheVBhcnNlciA9IExvY2FsRGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkxvY2FsV2Vla1BhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vc2V0V2Vlay5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uLy4uL3N0YXJ0T2ZXZWVrLmpzXCIpO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBMb2NhbCB3ZWVrIG9mIHllYXJcbmNsYXNzIExvY2FsV2Vla1BhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMDA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIndcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMud2VlayxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIndvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJ3ZWVrXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gNTM7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIHJldHVybiAoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoXG4gICAgICAoMCwgX2luZGV4LnNldFdlZWspKGRhdGUsIHZhbHVlLCBvcHRpb25zKSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcInlcIixcbiAgICBcIlJcIixcbiAgICBcInVcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIklcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuTG9jYWxXZWVrUGFyc2VyID0gTG9jYWxXZWVrUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkxvY2FsV2Vla1llYXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL2dldFdlZWtZZWFyLmpzXCIpO1xuXG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zdGFydE9mV2Vlay5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuY2xhc3MgTG9jYWxXZWVrWWVhclBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh5ZWFyKSA9PiAoe1xuICAgICAgeWVhcixcbiAgICAgIGlzVHdvRGlnaXRZZWFyOiB0b2tlbiA9PT0gXCJZWVwiLFxuICAgIH0pO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIllcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSg0LCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIllvXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHVuaXQ6IFwieWVhclwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUuaXNUd29EaWdpdFllYXIgfHwgdmFsdWUueWVhciA+IDA7XG4gIH1cblxuICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSAoMCwgX2luZGV4LmdldFdlZWtZZWFyKShkYXRlLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZS5pc1R3b0RpZ2l0WWVhcikge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR3b0RpZ2l0WWVhciA9ICgwLCBfdXRpbHMubm9ybWFsaXplVHdvRGlnaXRZZWFyKShcbiAgICAgICAgdmFsdWUueWVhcixcbiAgICAgICAgY3VycmVudFllYXIsXG4gICAgICApO1xuICAgICAgZGF0ZS5zZXRGdWxsWWVhcihcbiAgICAgICAgbm9ybWFsaXplZFR3b0RpZ2l0WWVhcixcbiAgICAgICAgMCxcbiAgICAgICAgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgICApO1xuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIHJldHVybiAoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoZGF0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgeWVhciA9XG4gICAgICAhKFwiZXJhXCIgaW4gZmxhZ3MpIHx8IGZsYWdzLmVyYSA9PT0gMSA/IHZhbHVlLnllYXIgOiAxIC0gdmFsdWUueWVhcjtcbiAgICBkYXRlLnNldEZ1bGxZZWFyKHllYXIsIDAsIG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiAoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoZGF0ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJ5XCIsXG4gICAgXCJSXCIsXG4gICAgXCJ1XCIsXG4gICAgXCJRXCIsXG4gICAgXCJxXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLkxvY2FsV2Vla1llYXJQYXJzZXIgPSBMb2NhbFdlZWtZZWFyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLk1pbnV0ZVBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgTWludXRlUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDYwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLm1pbnV0ZSxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIm1vXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJtaW51dGVcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA1OTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRNaW51dGVzKHZhbHVlLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5NaW51dGVQYXJzZXIgPSBNaW51dGVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuTW9udGhQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIE1vbnRoUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJZXCIsXG4gICAgXCJSXCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJMXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJJXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG5cbiAgcHJpb3JpdHkgPSAxMTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZSkgPT4gdmFsdWUgLSAxO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5tb250aCxcbiAgICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICAgKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gMDEsIDAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSgyLCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aFxuICAgICAgY2FzZSBcIk1vXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHVuaXQ6IFwibW9udGhcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG4gICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gSiwgRiwgLi4uLCBEXG4gICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlclxuICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxMTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRNb250aCh2YWx1ZSwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxufVxuZXhwb3J0cy5Nb250aFBhcnNlciA9IE1vbnRoUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlF1YXJ0ZXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIFF1YXJ0ZXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTIwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJRXCI6XG4gICAgICBjYXNlIFwiUVFcIjogLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwiUW9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwiUVFRXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwiUVFRUVFcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwiUVFRUVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSA0O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldE1vbnRoKCh2YWx1ZSAtIDEpICogMywgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIllcIixcbiAgICBcIlJcIixcbiAgICBcInFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcIklcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuUXVhcnRlclBhcnNlciA9IFF1YXJ0ZXJQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuU2Vjb25kUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBTZWNvbmRQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuc2Vjb25kLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwic29cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcInNlY29uZFwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDU5O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldFNlY29uZHModmFsdWUsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1widFwiLCBcIlRcIl07XG59XG5leHBvcnRzLlNlY29uZFBhcnNlciA9IFNlY29uZFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3NldERheS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWtcbmNsYXNzIFN0YW5kQWxvbmVMb2NhbERheVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlKSA9PiB7XG4gICAgICAvLyBXZSB3YW50IGhlcmUgZmxvb3IgaW5zdGVhZCBvZiB0cnVuYywgc28gd2UgZ2V0IC03IGZvciB2YWx1ZSAwIGluc3RlYWQgb2YgMFxuICAgICAgY29uc3Qgd2hvbGVXZWVrRGF5cyA9IE1hdGguZmxvb3IoKHZhbHVlIC0gMSkgLyA3KSAqIDc7XG4gICAgICByZXR1cm4gKCh2YWx1ZSArIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgNikgJSA3KSArIHdob2xlV2Vla0RheXM7XG4gICAgfTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDNcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICBjYXNlIFwiY2NcIjogLy8gMDNcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyAzcmRcbiAgICAgIGNhc2UgXCJjb1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB1bml0OiBcImRheVwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImNjY2NjXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiY2NjY2NjXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImNjY2NcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDY7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIGRhdGUgPSAoMCwgX2luZGV4LnNldERheSkoZGF0ZSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJ5XCIsXG4gICAgXCJSXCIsXG4gICAgXCJ1XCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJFXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLlN0YW5kQWxvbmVMb2NhbERheVBhcnNlciA9IFN0YW5kQWxvbmVMb2NhbERheVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5TdGFuZEFsb25lTW9udGhQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIFN0YW5kQWxvbmVNb250aFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZSkgPT4gdmFsdWUgLSAxO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5tb250aCxcbiAgICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICAgKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gMDEsIDAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSgyLCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aFxuICAgICAgY2FzZSBcIkxvXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHVuaXQ6IFwibW9udGhcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG4gICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gSiwgRiwgLi4uLCBEXG4gICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlclxuICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxMTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRNb250aCh2YWx1ZSwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIllcIixcbiAgICBcIlJcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIndcIixcbiAgICBcIklcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuU3RhbmRBbG9uZU1vbnRoUGFyc2VyID0gU3RhbmRBbG9uZU1vbnRoUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlN0YW5kQWxvbmVRdWFydGVyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBTdGFuZEFsb25lUXVhcnRlclBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMjA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgMywgNFxuICAgICAgY2FzZSBcInFcIjpcbiAgICAgIGNhc2UgXCJxcVwiOiAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJxb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJxcXFcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcbiAgICAgIGNhc2UgXCJxcXFxcVwiOlxuICAgICAgICByZXR1cm4gbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi5cbiAgICAgIGNhc2UgXCJxcXFxXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDQ7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TW9udGgoKHZhbHVlIC0gMSkgKiAzLCAxKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiWVwiLFxuICAgIFwiUlwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5TdGFuZEFsb25lUXVhcnRlclBhcnNlciA9IFN0YW5kQWxvbmVRdWFydGVyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlRpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDIwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcpIHtcbiAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZUFueURpZ2l0c1NpZ25lZCkoZGF0ZVN0cmluZyk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIHJldHVybiBbKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCB2YWx1ZSksIHsgdGltZXN0YW1wSXNTZXQ6IHRydWUgfV07XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBcIipcIjtcbn1cbmV4cG9ydHMuVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyID0gVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlRpbWVzdGFtcFNlY29uZHNQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIFRpbWVzdGFtcFNlY29uZHNQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNDA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZykge1xuICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlQW55RGlnaXRzU2lnbmVkKShkYXRlU3RyaW5nKTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgdmFsdWUgKiAxMDAwKSxcbiAgICAgIHsgdGltZXN0YW1wSXNTZXQ6IHRydWUgfSxcbiAgICBdO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gXCIqXCI7XG59XG5leHBvcnRzLlRpbWVzdGFtcFNlY29uZHNQYXJzZXIgPSBUaW1lc3RhbXBTZWNvbmRzUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlllYXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIEZyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS0zMS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9Gb3JtYXRfUGF0dGVybnNcbi8vIHwgWWVhciAgICAgfCAgICAgeSB8IHl5IHwgICB5eXkgfCAgeXl5eSB8IHl5eXl5IHxcbi8vIHwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXxcbi8vIHwgQUQgMSAgICAgfCAgICAgMSB8IDAxIHwgICAwMDEgfCAgMDAwMSB8IDAwMDAxIHxcbi8vIHwgQUQgMTIgICAgfCAgICAxMiB8IDEyIHwgICAwMTIgfCAgMDAxMiB8IDAwMDEyIHxcbi8vIHwgQUQgMTIzICAgfCAgIDEyMyB8IDIzIHwgICAxMjMgfCAgMDEyMyB8IDAwMTIzIHxcbi8vIHwgQUQgMTIzNCAgfCAgMTIzNCB8IDM0IHwgIDEyMzQgfCAgMTIzNCB8IDAxMjM0IHxcbi8vIHwgQUQgMTIzNDUgfCAxMjM0NSB8IDQ1IHwgMTIzNDUgfCAxMjM0NSB8IDEyMzQ1IHxcbmNsYXNzIFllYXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTMwO1xuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJZXCIsIFwiUlwiLCBcInVcIiwgXCJ3XCIsIFwiSVwiLCBcImlcIiwgXCJlXCIsIFwiY1wiLCBcInRcIiwgXCJUXCJdO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAoeWVhcikgPT4gKHtcbiAgICAgIHllYXIsXG4gICAgICBpc1R3b0RpZ2l0WWVhcjogdG9rZW4gPT09IFwieXlcIixcbiAgICB9KTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykoNCwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJ5b1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB1bml0OiBcInllYXJcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmlzVHdvRGlnaXRZZWFyIHx8IHZhbHVlLnllYXIgPiAwO1xuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZSkge1xuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gICAgaWYgKHZhbHVlLmlzVHdvRGlnaXRZZWFyKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkVHdvRGlnaXRZZWFyID0gKDAsIF91dGlscy5ub3JtYWxpemVUd29EaWdpdFllYXIpKFxuICAgICAgICB2YWx1ZS55ZWFyLFxuICAgICAgICBjdXJyZW50WWVhcixcbiAgICAgICk7XG4gICAgICBkYXRlLnNldEZ1bGxZZWFyKG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsIDAsIDEpO1xuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIGNvbnN0IHllYXIgPVxuICAgICAgIShcImVyYVwiIGluIGZsYWdzKSB8fCBmbGFncy5lcmEgPT09IDEgPyB2YWx1ZS55ZWFyIDogMSAtIHZhbHVlLnllYXI7XG4gICAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyLCAwLCAxKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG59XG5leHBvcnRzLlllYXJQYXJzZXIgPSBZZWFyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmRheVBlcmlvZEVudW1Ub0hvdXJzID0gZGF5UGVyaW9kRW51bVRvSG91cnM7XG5leHBvcnRzLmlzTGVhcFllYXJJbmRleCA9IGlzTGVhcFllYXJJbmRleDtcbmV4cG9ydHMubWFwVmFsdWUgPSBtYXBWYWx1ZTtcbmV4cG9ydHMubm9ybWFsaXplVHdvRGlnaXRZZWFyID0gbm9ybWFsaXplVHdvRGlnaXRZZWFyO1xuZXhwb3J0cy5wYXJzZUFueURpZ2l0c1NpZ25lZCA9IHBhcnNlQW55RGlnaXRzU2lnbmVkO1xuZXhwb3J0cy5wYXJzZU5EaWdpdHMgPSBwYXJzZU5EaWdpdHM7XG5leHBvcnRzLnBhcnNlTkRpZ2l0c1NpZ25lZCA9IHBhcnNlTkRpZ2l0c1NpZ25lZDtcbmV4cG9ydHMucGFyc2VOdW1lcmljUGF0dGVybiA9IHBhcnNlTnVtZXJpY1BhdHRlcm47XG5leHBvcnRzLnBhcnNlVGltZXpvbmVQYXR0ZXJuID0gcGFyc2VUaW1lem9uZVBhdHRlcm47XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uL2NvbnN0YW50cy5qc1wiKTtcblxudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG5cbmZ1bmN0aW9uIG1hcFZhbHVlKHBhcnNlRm5SZXN1bHQsIG1hcEZuKSB7XG4gIGlmICghcGFyc2VGblJlc3VsdCkge1xuICAgIHJldHVybiBwYXJzZUZuUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogbWFwRm4ocGFyc2VGblJlc3VsdC52YWx1ZSksXG4gICAgcmVzdDogcGFyc2VGblJlc3VsdC5yZXN0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZU51bWVyaWNQYXR0ZXJuKHBhdHRlcm4sIGRhdGVTdHJpbmcpIHtcbiAgY29uc3QgbWF0Y2hSZXN1bHQgPSBkYXRlU3RyaW5nLm1hdGNoKHBhdHRlcm4pO1xuXG4gIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHBhcnNlSW50KG1hdGNoUmVzdWx0WzBdLCAxMCksXG4gICAgcmVzdDogZGF0ZVN0cmluZy5zbGljZShtYXRjaFJlc3VsdFswXS5sZW5ndGgpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVRpbWV6b25lUGF0dGVybihwYXR0ZXJuLCBkYXRlU3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoUmVzdWx0ID0gZGF0ZVN0cmluZy5tYXRjaChwYXR0ZXJuKTtcblxuICBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBJbnB1dCBpcyAnWidcbiAgaWYgKG1hdGNoUmVzdWx0WzBdID09PSBcIlpcIikge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogMCxcbiAgICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UoMSksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHNpZ24gPSBtYXRjaFJlc3VsdFsxXSA9PT0gXCIrXCIgPyAxIDogLTE7XG4gIGNvbnN0IGhvdXJzID0gbWF0Y2hSZXN1bHRbMl0gPyBwYXJzZUludChtYXRjaFJlc3VsdFsyXSwgMTApIDogMDtcbiAgY29uc3QgbWludXRlcyA9IG1hdGNoUmVzdWx0WzNdID8gcGFyc2VJbnQobWF0Y2hSZXN1bHRbM10sIDEwKSA6IDA7XG4gIGNvbnN0IHNlY29uZHMgPSBtYXRjaFJlc3VsdFs1XSA/IHBhcnNlSW50KG1hdGNoUmVzdWx0WzVdLCAxMCkgOiAwO1xuXG4gIHJldHVybiB7XG4gICAgdmFsdWU6XG4gICAgICBzaWduICpcbiAgICAgIChob3VycyAqIF9pbmRleC5taWxsaXNlY29uZHNJbkhvdXIgK1xuICAgICAgICBtaW51dGVzICogX2luZGV4Lm1pbGxpc2Vjb25kc0luTWludXRlICtcbiAgICAgICAgc2Vjb25kcyAqIF9pbmRleC5taWxsaXNlY29uZHNJblNlY29uZCksXG4gICAgcmVzdDogZGF0ZVN0cmluZy5zbGljZShtYXRjaFJlc3VsdFswXS5sZW5ndGgpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZUFueURpZ2l0c1NpZ25lZChkYXRlU3RyaW5nKSB7XG4gIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmFueURpZ2l0c1NpZ25lZCxcbiAgICBkYXRlU3RyaW5nLFxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJzZU5EaWdpdHMobiwgZGF0ZVN0cmluZykge1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuc2luZ2xlRGlnaXQsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy50d29EaWdpdHMsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy50aHJlZURpZ2l0cyxcbiAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICk7XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmZvdXJEaWdpdHMsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihuZXcgUmVnRXhwKFwiXlxcXFxkezEsXCIgKyBuICsgXCJ9XCIpLCBkYXRlU3RyaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZU5EaWdpdHNTaWduZWQobiwgZGF0ZVN0cmluZykge1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuc2luZ2xlRGlnaXRTaWduZWQsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy50d29EaWdpdHNTaWduZWQsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy50aHJlZURpZ2l0c1NpZ25lZCxcbiAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICk7XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmZvdXJEaWdpdHNTaWduZWQsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihuZXcgUmVnRXhwKFwiXi0/XFxcXGR7MSxcIiArIG4gKyBcIn1cIiksIGRhdGVTdHJpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRheVBlcmlvZEVudW1Ub0hvdXJzKGRheVBlcmlvZCkge1xuICBzd2l0Y2ggKGRheVBlcmlvZCkge1xuICAgIGNhc2UgXCJtb3JuaW5nXCI6XG4gICAgICByZXR1cm4gNDtcbiAgICBjYXNlIFwiZXZlbmluZ1wiOlxuICAgICAgcmV0dXJuIDE3O1xuICAgIGNhc2UgXCJwbVwiOlxuICAgIGNhc2UgXCJub29uXCI6XG4gICAgY2FzZSBcImFmdGVybm9vblwiOlxuICAgICAgcmV0dXJuIDEyO1xuICAgIGNhc2UgXCJhbVwiOlxuICAgIGNhc2UgXCJtaWRuaWdodFwiOlxuICAgIGNhc2UgXCJuaWdodFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVUd29EaWdpdFllYXIodHdvRGlnaXRZZWFyLCBjdXJyZW50WWVhcikge1xuICBjb25zdCBpc0NvbW1vbkVyYSA9IGN1cnJlbnRZZWFyID4gMDtcbiAgLy8gQWJzb2x1dGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHllYXI6XG4gIC8vIDEgLT4gMSBBQ1xuICAvLyAwIC0+IDEgQkNcbiAgLy8gLTEgLT4gMiBCQ1xuICBjb25zdCBhYnNDdXJyZW50WWVhciA9IGlzQ29tbW9uRXJhID8gY3VycmVudFllYXIgOiAxIC0gY3VycmVudFllYXI7XG5cbiAgbGV0IHJlc3VsdDtcbiAgaWYgKGFic0N1cnJlbnRZZWFyIDw9IDUwKSB7XG4gICAgcmVzdWx0ID0gdHdvRGlnaXRZZWFyIHx8IDEwMDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCByYW5nZUVuZCA9IGFic0N1cnJlbnRZZWFyICsgNTA7XG4gICAgY29uc3QgcmFuZ2VFbmRDZW50dXJ5ID0gTWF0aC50cnVuYyhyYW5nZUVuZCAvIDEwMCkgKiAxMDA7XG4gICAgY29uc3QgaXNQcmV2aW91c0NlbnR1cnkgPSB0d29EaWdpdFllYXIgPj0gcmFuZ2VFbmQgJSAxMDA7XG4gICAgcmVzdWx0ID0gdHdvRGlnaXRZZWFyICsgcmFuZ2VFbmRDZW50dXJ5IC0gKGlzUHJldmlvdXNDZW50dXJ5ID8gMTAwIDogMCk7XG4gIH1cblxuICByZXR1cm4gaXNDb21tb25FcmEgPyByZXN1bHQgOiAxIC0gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc0xlYXBZZWFySW5kZXgoeWVhcikge1xuICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCAoeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0ID0gc2V0O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3NldE1vbnRoLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0XG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCBkYXRlIHZhbHVlcyB0byBhIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgZGF0ZSB2YWx1ZXMgdG8gYSBnaXZlbiBkYXRlLlxuICpcbiAqIFNldHMgdGltZSB2YWx1ZXMgdG8gZGF0ZSBmcm9tIG9iamVjdCBgdmFsdWVzYC5cbiAqIEEgdmFsdWUgaXMgbm90IHNldCBpZiBpdCBpcyB1bmRlZmluZWQgb3IgbnVsbCBvciBkb2Vzbid0IGV4aXN0IGluIGB2YWx1ZXNgLlxuICpcbiAqIE5vdGUgYWJvdXQgYnVuZGxlIHNpemU6IGBzZXRgIGRvZXMgbm90IGludGVybmFsbHkgdXNlIGBzZXRYYCBmdW5jdGlvbnMgZnJvbSBkYXRlLWZucyBidXQgaW5zdGVhZCBvcHRzXG4gKiB0byB1c2UgbmF0aXZlIGBEYXRlI3NldFhgIG1ldGhvZHMuIElmIHlvdSB1c2UgdGhpcyBmdW5jdGlvbiwgeW91IG1heSBub3Qgd2FudCB0byBpbmNsdWRlIHRoZVxuICogb3RoZXIgYHNldFhgIGZ1bmN0aW9ucyB0aGF0IGRhdGUtZm5zIHByb3ZpZGVzIGlmIHlvdSBhcmUgY29uY2VybmVkIGFib3V0IHRoZSBidW5kbGUgc2l6ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgZGF0ZSB2YWx1ZXMgdG8gYmUgc2V0XG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggb3B0aW9ucyBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVHJhbnNmb3JtIDEgU2VwdGVtYmVyIDIwMTQgaW50byAyMCBPY3RvYmVyIDIwMTUgaW4gYSBzaW5nbGUgbGluZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldChuZXcgRGF0ZSgyMDE0LCA4LCAyMCksIHsgeWVhcjogMjAxNSwgbW9udGg6IDksIGRhdGU6IDIwIH0pXG4gKiAvLz0+IFR1ZSBPY3QgMjAgMjAxNSAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgMTIgUE0gdG8gMSBTZXB0ZW1iZXIgMjAxNCAwMToyMzo0NSB0byAxIFNlcHRlbWJlciAyMDE0IDEyOjAwOjAwOlxuICogY29uc3QgcmVzdWx0ID0gc2V0KG5ldyBEYXRlKDIwMTQsIDgsIDEsIDEsIDIzLCA0NSksIHsgaG91cnM6IDEyIH0pXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAxMjoyMzo0NVxuICovXG5cbmZ1bmN0aW9uIHNldChkYXRlLCB2YWx1ZXMpIHtcbiAgbGV0IF9kYXRlID0gKDAsIF9pbmRleDMudG9EYXRlKShkYXRlKTtcblxuICAvLyBDaGVjayBpZiBkYXRlIGlzIEludmFsaWQgRGF0ZSBiZWNhdXNlIERhdGUucHJvdG90eXBlLnNldEZ1bGxZZWFyIGlnbm9yZXMgdGhlIHZhbHVlIG9mIEludmFsaWQgRGF0ZVxuICBpZiAoaXNOYU4oK19kYXRlKSkge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIE5hTik7XG4gIH1cblxuICBpZiAodmFsdWVzLnllYXIgIT0gbnVsbCkge1xuICAgIF9kYXRlLnNldEZ1bGxZZWFyKHZhbHVlcy55ZWFyKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMubW9udGggIT0gbnVsbCkge1xuICAgIF9kYXRlID0gKDAsIF9pbmRleDIuc2V0TW9udGgpKF9kYXRlLCB2YWx1ZXMubW9udGgpO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5kYXRlICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXREYXRlKHZhbHVlcy5kYXRlKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMuaG91cnMgIT0gbnVsbCkge1xuICAgIF9kYXRlLnNldEhvdXJzKHZhbHVlcy5ob3Vycyk7XG4gIH1cblxuICBpZiAodmFsdWVzLm1pbnV0ZXMgIT0gbnVsbCkge1xuICAgIF9kYXRlLnNldE1pbnV0ZXModmFsdWVzLm1pbnV0ZXMpO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5zZWNvbmRzICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXRTZWNvbmRzKHZhbHVlcy5zZWNvbmRzKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMubWlsbGlzZWNvbmRzICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXRNaWxsaXNlY29uZHModmFsdWVzLm1pbGxpc2Vjb25kcyk7XG4gIH1cblxuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0RGF5ID0gc2V0RGF5O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZERheXMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc2V0RGF5fSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc2V0RGF5XG4gKiBAY2F0ZWdvcnkgV2Vla2RheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIGRheSBvZiB0aGUgd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgZGF5IG9mIHRoZSB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGRheSAtIFRoZSBkYXkgb2YgdGhlIHdlZWsgb2YgdGhlIG5ldyBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheSBvZiB0aGUgd2VlayBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHdlZWsgZGF5IHRvIFN1bmRheSwgd2l0aCB0aGUgZGVmYXVsdCB3ZWVrU3RhcnRzT24gb2YgU3VuZGF5OlxuICogY29uc3QgcmVzdWx0ID0gc2V0RGF5KG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAwKVxuICogLy89PiBTdW4gQXVnIDMxIDIwMTQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHdlZWsgZGF5IHRvIFN1bmRheSwgd2l0aCBhIHdlZWtTdGFydHNPbiBvZiBNb25kYXk6XG4gKiBjb25zdCByZXN1bHQgPSBzZXREYXkobmV3IERhdGUoMjAxNCwgOCwgMSksIDAsIHsgd2Vla1N0YXJ0c09uOiAxIH0pXG4gKiAvLz0+IFN1biBTZXAgMDcgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzZXREYXkoZGF0ZSwgZGF5LCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDMuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBjdXJyZW50RGF5ID0gX2RhdGUuZ2V0RGF5KCk7XG5cbiAgY29uc3QgcmVtYWluZGVyID0gZGF5ICUgNztcbiAgY29uc3QgZGF5SW5kZXggPSAocmVtYWluZGVyICsgNykgJSA3O1xuXG4gIGNvbnN0IGRlbHRhID0gNyAtIHdlZWtTdGFydHNPbjtcbiAgY29uc3QgZGlmZiA9XG4gICAgZGF5IDwgMCB8fCBkYXkgPiA2XG4gICAgICA/IGRheSAtICgoY3VycmVudERheSArIGRlbHRhKSAlIDcpXG4gICAgICA6ICgoZGF5SW5kZXggKyBkZWx0YSkgJSA3KSAtICgoY3VycmVudERheSArIGRlbHRhKSAlIDcpO1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGREYXlzKShfZGF0ZSwgZGlmZik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0SG91cnMgPSBzZXRIb3VycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0SG91cnNcbiAqIEBjYXRlZ29yeSBIb3VyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgaG91cnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGhvdXJzIC0gVGhlIGhvdXJzIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBob3VycyBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IDQgaG91cnMgdG8gMSBTZXB0ZW1iZXIgMjAxNCAxMTozMDowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldEhvdXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEsIDExLCAzMCksIDQpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwNDozMDowMFxuICovXG5mdW5jdGlvbiBzZXRIb3VycyhkYXRlLCBob3Vycykge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgX2RhdGUuc2V0SG91cnMoaG91cnMpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0SVNPRGF5ID0gc2V0SVNPRGF5O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZERheXMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2dldElTT0RheS5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldElTT0RheVxuICogQGNhdGVnb3J5IFdlZWtkYXkgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICogSVNPIHdlZWsgc3RhcnRzIHdpdGggTW9uZGF5LlxuICogNyBpcyB0aGUgaW5kZXggb2YgU3VuZGF5LCAxIGlzIHRoZSBpbmRleCBvZiBNb25kYXkgZXRjLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGRheSAtIFRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgU3VuZGF5IHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRJU09EYXkobmV3IERhdGUoMjAxNCwgOCwgMSksIDcpXG4gKiAvLz0+IFN1biBTZXAgMDcgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzZXRJU09EYXkoZGF0ZSwgZGF5KSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDMudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgY3VycmVudERheSA9ICgwLCBfaW5kZXgyLmdldElTT0RheSkoX2RhdGUpO1xuICBjb25zdCBkaWZmID0gZGF5IC0gY3VycmVudERheTtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkRGF5cykoX2RhdGUsIGRpZmYpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldElTT1dlZWsgPSBzZXRJU09XZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2dldElTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBJU08gd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgSVNPIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUsIHNhdmluZyB0aGUgd2Vla2RheSBudW1iZXIuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHdlZWsgLSBUaGUgSVNPIHdlZWsgb2YgdGhlIG5ldyBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIElTTyB3ZWVrIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgdGhlIDUzcmQgSVNPIHdlZWsgdG8gNyBBdWd1c3QgMjAwNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldElTT1dlZWsobmV3IERhdGUoMjAwNCwgNywgNyksIDUzKVxuICogLy89PiBTYXQgSmFuIDAxIDIwMDUgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0SVNPV2VlayhkYXRlLCB3ZWVrKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGlmZiA9ICgwLCBfaW5kZXguZ2V0SVNPV2VlaykoX2RhdGUpIC0gd2VlaztcbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgLSBkaWZmICogNyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRNaW51dGVzID0gc2V0TWludXRlcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0TWludXRlc1xuICogQGNhdGVnb3J5IE1pbnV0ZSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIG1pbnV0ZXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIG1pbnV0ZXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gbWludXRlcyAtIFRoZSBtaW51dGVzIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaW51dGVzIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgNDUgbWludXRlcyB0byAxIFNlcHRlbWJlciAyMDE0IDExOjMwOjQwOlxuICogY29uc3QgcmVzdWx0ID0gc2V0TWludXRlcyhuZXcgRGF0ZSgyMDE0LCA4LCAxLCAxMSwgMzAsIDQwKSwgNDUpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAxMTo0NTo0MFxuICovXG5mdW5jdGlvbiBzZXRNaW51dGVzKGRhdGUsIG1pbnV0ZXMpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIF9kYXRlLnNldE1pbnV0ZXMobWludXRlcyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRNb250aCA9IHNldE1vbnRoO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2dldERheXNJbk1vbnRoLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0TW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIG1vbnRoIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBtb250aCB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBtb250aCAtIFRoZSBtb250aCBpbmRleCB0byBzZXQgKDAtMTEpXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIG1vbnRoIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgRmVicnVhcnkgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldE1vbnRoKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAxKVxuICogLy89PiBTYXQgRmViIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0TW9udGgoZGF0ZSwgbW9udGgpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4My50b0RhdGUpKGRhdGUpO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF0ZSgpO1xuXG4gIGNvbnN0IGRhdGVXaXRoRGVzaXJlZE1vbnRoID0gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZGF0ZVdpdGhEZXNpcmVkTW9udGguc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIDE1KTtcbiAgZGF0ZVdpdGhEZXNpcmVkTW9udGguc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IGRheXNJbk1vbnRoID0gKDAsIF9pbmRleDIuZ2V0RGF5c0luTW9udGgpKGRhdGVXaXRoRGVzaXJlZE1vbnRoKTtcbiAgLy8gU2V0IHRoZSBsYXN0IGRheSBvZiB0aGUgbmV3IG1vbnRoXG4gIC8vIGlmIHRoZSBvcmlnaW5hbCBkYXRlIHdhcyB0aGUgbGFzdCBkYXkgb2YgdGhlIGxvbmdlciBtb250aFxuICBfZGF0ZS5zZXRNb250aChtb250aCwgTWF0aC5taW4oZGF5LCBkYXlzSW5Nb250aCkpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0UXVhcnRlciA9IHNldFF1YXJ0ZXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vc2V0TW9udGguanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRRdWFydGVyXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIHllYXIgcXVhcnRlciB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgeWVhciBxdWFydGVyIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHF1YXJ0ZXIgLSBUaGUgcXVhcnRlciBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgcXVhcnRlciBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHRoZSAybmQgcXVhcnRlciB0byAyIEp1bHkgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFF1YXJ0ZXIobmV3IERhdGUoMjAxNCwgNiwgMiksIDIpXG4gKiAvLz0+IFdlZCBBcHIgMDIgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzZXRRdWFydGVyKGRhdGUsIHF1YXJ0ZXIpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBvbGRRdWFydGVyID0gTWF0aC50cnVuYyhfZGF0ZS5nZXRNb250aCgpIC8gMykgKyAxO1xuICBjb25zdCBkaWZmID0gcXVhcnRlciAtIG9sZFF1YXJ0ZXI7XG4gIHJldHVybiAoMCwgX2luZGV4LnNldE1vbnRoKShfZGF0ZSwgX2RhdGUuZ2V0TW9udGgoKSArIGRpZmYgKiAzKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRTZWNvbmRzID0gc2V0U2Vjb25kcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0U2Vjb25kc1xuICogQGNhdGVnb3J5IFNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIHNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIHNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gc2Vjb25kcyAtIFRoZSBzZWNvbmRzIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBzZWNvbmRzIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgNDUgc2Vjb25kcyB0byAxIFNlcHRlbWJlciAyMDE0IDExOjMwOjQwOlxuICogY29uc3QgcmVzdWx0ID0gc2V0U2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA4LCAxLCAxMSwgMzAsIDQwKSwgNDUpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAxMTozMDo0NVxuICovXG5mdW5jdGlvbiBzZXRTZWNvbmRzKGRhdGUsIHNlY29uZHMpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIF9kYXRlLnNldFNlY29uZHMoc2Vjb25kcyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRXZWVrID0gc2V0V2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9nZXRXZWVrLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogVGhlIHtAbGluayBzZXRXZWVrfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc2V0V2Vla1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBsb2NhbCB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBsb2NhbCB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLCBzYXZpbmcgdGhlIHdlZWtkYXkgbnVtYmVyLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1RoZV9JU09fd2Vla19kYXRlX3N5c3RlbVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHdlZWsgLSBUaGUgd2VlayBvZiB0aGUgbmV3IGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBsb2NhbCB3ZWVrIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgdGhlIDFzdCB3ZWVrIHRvIDIgSmFudWFyeSAyMDA1IHdpdGggZGVmYXVsdCBvcHRpb25zOlxuICogY29uc3QgcmVzdWx0ID0gc2V0V2VlayhuZXcgRGF0ZSgyMDA1LCAwLCAyKSwgMSlcbiAqIC8vPT4gU3VuIERlYyAyNiAyMDA0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB0aGUgMXN0IHdlZWsgdG8gMiBKYW51YXJ5IDIwMDUsXG4gKiAvLyBpZiBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayxcbiAqIC8vIGFuZCB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhciBhbHdheXMgY29udGFpbnMgNCBKYW51YXJ5OlxuICogY29uc3QgcmVzdWx0ID0gc2V0V2VlayhuZXcgRGF0ZSgyMDA1LCAwLCAyKSwgMSwge1xuICogICB3ZWVrU3RhcnRzT246IDEsXG4gKiAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNFxuICogfSlcbiAqIC8vPT4gU3VuIEphbiA0IDIwMDQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0V2VlayhkYXRlLCB3ZWVrLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGlmZiA9ICgwLCBfaW5kZXguZ2V0V2VlaykoX2RhdGUsIG9wdGlvbnMpIC0gd2VlaztcbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgLSBkaWZmICogNyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRZZWFyID0gc2V0WWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0WWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSB5ZWFyIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSB5ZWFyIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHllYXIgLSBUaGUgeWVhciBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgeWVhciBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHllYXIgMjAxMyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc2V0WWVhcihuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMjAxMylcbiAqIC8vPT4gU3VuIFNlcCAwMSAyMDEzIDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldFllYXIoZGF0ZSwgeWVhcikge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZSk7XG5cbiAgLy8gQ2hlY2sgaWYgZGF0ZSBpcyBJbnZhbGlkIERhdGUgYmVjYXVzZSBEYXRlLnByb3RvdHlwZS5zZXRGdWxsWWVhciBpZ25vcmVzIHRoZSB2YWx1ZSBvZiBJbnZhbGlkIERhdGVcbiAgaWYgKGlzTmFOKCtfZGF0ZSkpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCBOYU4pO1xuICB9XG5cbiAgX2RhdGUuc2V0RnVsbFllYXIoeWVhcik7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mRGF5ID0gc3RhcnRPZkRheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZkRheVxuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgZGF5IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgZGF5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIGRheSBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZEYXkoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mSVNPV2VlayA9IHN0YXJ0T2ZJU09XZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZXZWVrLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZJU09XZWVrKGRhdGUpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguc3RhcnRPZldlZWspKGRhdGUsIHsgd2Vla1N0YXJ0c09uOiAxIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZJU09XZWVrWWVhciA9IHN0YXJ0T2ZJU09XZWVrWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9nZXRJU09XZWVrWWVhci5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZklTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZklTT1dlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyLFxuICogd2hpY2ggYWx3YXlzIHN0YXJ0cyAzIGRheXMgYmVmb3JlIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXkuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDU6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mSVNPV2Vla1llYXIobmV3IERhdGUoMjAwNSwgNiwgMikpXG4gKiAvLz0+IE1vbiBKYW4gMDMgMjAwNSAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mSVNPV2Vla1llYXIoZGF0ZSkge1xuICBjb25zdCB5ZWFyID0gKDAsIF9pbmRleC5nZXRJU09XZWVrWWVhcikoZGF0ZSk7XG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeSA9ICgwLCBfaW5kZXgzLmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBmb3VydGhPZkphbnVhcnkuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuICgwLCBfaW5kZXgyLnN0YXJ0T2ZJU09XZWVrKShmb3VydGhPZkphbnVhcnkpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZNb250aCA9IHN0YXJ0T2ZNb250aDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZk1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSBtb250aFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSBtb250aCBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZk1vbnRoKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIF9kYXRlLnNldERhdGUoMSk7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZlF1YXJ0ZXIgPSBzdGFydE9mUXVhcnRlcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZlF1YXJ0ZXJcbiAqIEBjYXRlZ29yeSBRdWFydGVyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSB5ZWFyIHF1YXJ0ZXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgcXVhcnRlciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSBxdWFydGVyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHF1YXJ0ZXIgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mUXVhcnRlcihuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBUdWUgSnVsIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZlF1YXJ0ZXIoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgY3VycmVudE1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTtcbiAgY29uc3QgbW9udGggPSBjdXJyZW50TW9udGggLSAoY3VycmVudE1vbnRoICUgMyk7XG4gIF9kYXRlLnNldE1vbnRoKG1vbnRoLCAxKTtcbiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mV2VlayA9IHN0YXJ0T2ZXZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZldlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mV2Vla1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBTdW4gQXVnIDMxIDIwMTQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdGhlIHdlZWsgc3RhcnRzIG9uIE1vbmRheSwgdGhlIHN0YXJ0IG9mIHRoZSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSwgeyB3ZWVrU3RhcnRzT246IDEgfSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZXZWVrKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4Mi5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgY29uc3Qgd2Vla1N0YXJ0c09uID1cbiAgICBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgMDtcblxuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7XG4gIGNvbnN0IGRpZmYgPSAoZGF5IDwgd2Vla1N0YXJ0c09uID8gNyA6IDApICsgZGF5IC0gd2Vla1N0YXJ0c09uO1xuXG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpIC0gZGlmZik7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZldlZWtZZWFyID0gc3RhcnRPZldlZWtZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2dldFdlZWtZZWFyLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9zdGFydE9mV2Vlay5qc1wiKTtcblxudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZldlZWtZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZldlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhci5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhbiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1IHdpdGggZGVmYXVsdCBzZXR0aW5nczpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSlcbiAqIC8vPT4gU3VuIERlYyAyNiAyMDA0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1XG4gKiAvLyBpZiBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB3ZWVrXG4gKiAvLyBhbmQgNCBKYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhcjpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSwge1xuICogICB3ZWVrU3RhcnRzT246IDEsXG4gKiAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNFxuICogfSlcbiAqIC8vPT4gTW9uIEphbiAwMyAyMDA1IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZXZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDQuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3QgeWVhciA9ICgwLCBfaW5kZXgyLmdldFdlZWtZZWFyKShkYXRlLCBvcHRpb25zKTtcbiAgY29uc3QgZmlyc3RXZWVrID0gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZmlyc3RXZWVrLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vlay5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4My5zdGFydE9mV2VlaykoZmlyc3RXZWVrLCBvcHRpb25zKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZZZWFyID0gc3RhcnRPZlllYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHllYXIgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mWWVhcihuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDAwKSlcbiAqIC8vPT4gV2VkIEphbiAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZZZWFyKGRhdGUpIHtcbiAgY29uc3QgY2xlYW5EYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBfZGF0ZS5zZXRGdWxsWWVhcihjbGVhbkRhdGUuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3ViRGF5cyA9IHN1YkRheXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkRGF5cy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdWJEYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGRheXMgdG8gYmUgc3VidHJhY3RlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5cyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDEwIGRheXMgZnJvbSAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc3ViRGF5cyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMTApXG4gKiAvLz0+IEZyaSBBdWcgMjIgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdWJEYXlzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGREYXlzKShkYXRlLCAtYW1vdW50KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdWJNb250aHMgPSBzdWJNb250aHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTW9udGhzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN1Yk1vbnRoc1xuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1vbnRocyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbW9udGhzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBtb250aHMgdG8gYmUgc3VidHJhY3RlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbW9udGhzIHN1YnRyYWN0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgNSBtb250aHMgZnJvbSAxIEZlYnJ1YXJ5IDIwMTU6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJNb250aHMobmV3IERhdGUoMjAxNSwgMSwgMSksIDUpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdWJNb250aHMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZE1vbnRocykoZGF0ZSwgLWFtb3VudCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3ViUXVhcnRlcnMgPSBzdWJRdWFydGVycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRRdWFydGVycy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdWJRdWFydGVyc1xuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhciBxdWFydGVycyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhciBxdWFydGVycyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgcXVhcnRlcnMgdG8gYmUgc3VidHJhY3RlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgcXVhcnRlcnMgc3VidHJhY3RlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCAzIHF1YXJ0ZXJzIGZyb20gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1YlF1YXJ0ZXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAzKVxuICogLy89PiBTdW4gRGVjIDAxIDIwMTMgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3ViUXVhcnRlcnMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZFF1YXJ0ZXJzKShkYXRlLCAtYW1vdW50KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdWJXZWVrcyA9IHN1YldlZWtzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZFdlZWtzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN1YldlZWtzXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB3ZWVrcyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2Vla3MgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHdlZWtzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHdlZWtzIHN1YnRyYWN0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgNCB3ZWVrcyBmcm9tIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJXZWVrcyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgNClcbiAqIC8vPT4gTW9uIEF1ZyAwNCAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN1YldlZWtzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRXZWVrcykoZGF0ZSwgLWFtb3VudCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3ViWWVhcnMgPSBzdWJZZWFycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRZZWFycy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdWJZZWFyc1xuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhcnMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXJzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiB5ZWFycyB0byBiZSBzdWJ0cmFjdGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSB5ZWFycyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDUgeWVhcnMgZnJvbSAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc3ViWWVhcnMobmV3IERhdGUoMjAxNCwgOCwgMSksIDUpXG4gKiAvLz0+IFR1ZSBTZXAgMDEgMjAwOSAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdWJZZWFycyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkWWVhcnMpKGRhdGUsIC1hbW91bnQpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnRvRGF0ZSA9IHRvRGF0ZTtcblxuLyoqXG4gKiBAbmFtZSB0b0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIERhdGUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGl0cyBjbG9uZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBudW1iZXIsIGl0IGlzIHRyZWF0ZWQgYXMgYSB0aW1lc3RhbXAuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIG5vbmUgb2YgdGhlIGFib3ZlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBJbnZhbGlkIERhdGUuXG4gKlxuICogKipOb3RlKio6ICphbGwqIERhdGUgYXJndW1lbnRzIHBhc3NlZCB0byBhbnkgKmRhdGUtZm5zKiBmdW5jdGlvbiBpcyBwcm9jZXNzZWQgYnkgYHRvRGF0ZWAuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGFyZ3VtZW50IC0gVGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGRhdGUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDbG9uZSB0aGUgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvRGF0ZShuZXcgRGF0ZSgyMDE0LCAxLCAxMSwgMTEsIDMwLCAzMCkpXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IHRoZSB0aW1lc3RhbXAgdG8gZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvRGF0ZSgxMzkyMDk4NDMwMDAwKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqL1xuZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50KSB7XG4gIGNvbnN0IGFyZ1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCk7XG5cbiAgLy8gQ2xvbmUgdGhlIGRhdGVcbiAgaWYgKFxuICAgIGFyZ3VtZW50IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICh0eXBlb2YgYXJndW1lbnQgPT09IFwib2JqZWN0XCIgJiYgYXJnU3RyID09PSBcIltvYmplY3QgRGF0ZV1cIilcbiAgKSB7XG4gICAgLy8gUHJldmVudCB0aGUgZGF0ZSB0byBsb3NlIHRoZSBtaWxsaXNlY29uZHMgd2hlbiBwYXNzZWQgdG8gbmV3IERhdGUoKSBpbiBJRTEwXG4gICAgcmV0dXJuIG5ldyBhcmd1bWVudC5jb25zdHJ1Y3RvcigrYXJndW1lbnQpO1xuICB9IGVsc2UgaWYgKFxuICAgIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJudW1iZXJcIiB8fFxuICAgIGFyZ1N0ciA9PT0gXCJbb2JqZWN0IE51bWJlcl1cIiB8fFxuICAgIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIGFyZ1N0ciA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIlxuICApIHtcbiAgICAvLyBUT0RPOiBDYW4gd2UgZ2V0IHJpZCBvZiBhcz9cbiAgICByZXR1cm4gbmV3IERhdGUoYXJndW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IENhbiB3ZSBnZXQgcmlkIG9mIGFzP1xuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMudHJhbnNwb3NlID0gdHJhbnNwb3NlO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgdHJhbnNwb3NlXG4gKiBAY2F0ZWdvcnkgR2VuZXJpYyBIZWxwZXJzXG4gKiBAc3VtbWFyeSBUcmFuc3Bvc2UgdGhlIGRhdGUgdG8gdGhlIGdpdmVuIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGZ1bmN0aW9uIHRyYW5zcG9zZXMgdGhlIGRhdGUgdG8gdGhlIGdpdmVuIGNvbnN0cnVjdG9yLiBJdCBoZWxwcyB5b3VcbiAqIHRvIHRyYW5zcG9zZSB0aGUgZGF0ZSBpbiB0aGUgc3lzdGVtIHRpbWUgem9uZSB0byBzYXkgYFVUQ0RhdGVgIG9yIGFueSBvdGhlclxuICogZGF0ZSBleHRlbnNpb24uXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlSW5wdXRUeXBlIC0gVGhlIGlucHV0IGBEYXRlYCB0eXBlIGRlcml2ZWQgZnJvbSB0aGUgcGFzc2VkIGFyZ3VtZW50LlxuICogQHR5cGVQYXJhbSBEYXRlT3V0cHV0VHlwZSAtIFRoZSBvdXRwdXQgYERhdGVgIHR5cGUgZGVyaXZlZCBmcm9tIHRoZSBwYXNzZWQgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIGZyb21EYXRlIC0gVGhlIGRhdGUgdG8gdXNlIHZhbHVlcyBmcm9tXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgLSBUaGUgZGF0ZSBjb25zdHJ1Y3RvciB0byB1c2VcbiAqXG4gKiBAcmV0dXJucyBEYXRlIHRyYW5zcG9zZWQgdG8gdGhlIGdpdmVuIGNvbnN0cnVjdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBKdWx5IDEwLCAyMDIyIDAwOjAwIGluIGxvY2FsZSB0aW1lIHpvbmVcbiAqIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgyMDIyLCA2LCAxMClcbiAqIC8vPT4gJ1N1biBKdWwgMTAgMjAyMiAwMDowMDowMCBHTVQrMDgwMCAoU2luZ2Fwb3JlIFN0YW5kYXJkIFRpbWUpJ1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUcmFuc3Bvc2UgdGhlIGRhdGUgdG8gSnVseSAxMCwgMjAyMiAwMDowMCBpbiBVVENcbiAqIHRyYW5zcG9zZShkYXRlLCBVVENEYXRlKVxuICogLy89PiAnU3VuIEp1bCAxMCAyMDIyIDAwOjAwOjAwIEdNVCswMDAwIChDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSknXG4gKi9cbmZ1bmN0aW9uIHRyYW5zcG9zZShmcm9tRGF0ZSwgY29uc3RydWN0b3IpIHtcbiAgY29uc3QgZGF0ZSA9XG4gICAgY29uc3RydWN0b3IgaW5zdGFuY2VvZiBEYXRlXG4gICAgICA/ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoY29uc3RydWN0b3IsIDApXG4gICAgICA6IG5ldyBjb25zdHJ1Y3RvcigwKTtcbiAgZGF0ZS5zZXRGdWxsWWVhcihcbiAgICBmcm9tRGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgIGZyb21EYXRlLmdldE1vbnRoKCksXG4gICAgZnJvbURhdGUuZ2V0RGF0ZSgpLFxuICApO1xuICBkYXRlLnNldEhvdXJzKFxuICAgIGZyb21EYXRlLmdldEhvdXJzKCksXG4gICAgZnJvbURhdGUuZ2V0TWludXRlcygpLFxuICAgIGZyb21EYXRlLmdldFNlY29uZHMoKSxcbiAgICBmcm9tRGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgKTtcbiAgcmV0dXJuIGRhdGU7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1kb20uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIFNjaGVkdWxlciA9IHJlcXVpcmUoJ3NjaGVkdWxlcicpO1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxudmFyIHN1cHByZXNzV2FybmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gc2V0U3VwcHJlc3NXYXJuaW5nKG5ld1N1cHByZXNzV2FybmluZykge1xuICB7XG4gICAgc3VwcHJlc3NXYXJuaW5nID0gbmV3U3VwcHJlc3NXYXJuaW5nO1xuICB9XG59IC8vIEluIERFViwgY2FsbHMgdG8gY29uc29sZS53YXJuIGFuZCBjb25zb2xlLmVycm9yIGdldCByZXBsYWNlZFxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAgaWYgKCFzdXBwcmVzc1dhcm5pbmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIGlmICghc3VwcHJlc3NXYXJuaW5nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgRnVuY3Rpb25Db21wb25lbnQgPSAwO1xudmFyIENsYXNzQ29tcG9uZW50ID0gMTtcbnZhciBJbmRldGVybWluYXRlQ29tcG9uZW50ID0gMjsgLy8gQmVmb3JlIHdlIGtub3cgd2hldGhlciBpdCBpcyBmdW5jdGlvbiBvciBjbGFzc1xuXG52YXIgSG9zdFJvb3QgPSAzOyAvLyBSb290IG9mIGEgaG9zdCB0cmVlLiBDb3VsZCBiZSBuZXN0ZWQgaW5zaWRlIGFub3RoZXIgbm9kZS5cblxudmFyIEhvc3RQb3J0YWwgPSA0OyAvLyBBIHN1YnRyZWUuIENvdWxkIGJlIGFuIGVudHJ5IHBvaW50IHRvIGEgZGlmZmVyZW50IHJlbmRlcmVyLlxuXG52YXIgSG9zdENvbXBvbmVudCA9IDU7XG52YXIgSG9zdFRleHQgPSA2O1xudmFyIEZyYWdtZW50ID0gNztcbnZhciBNb2RlID0gODtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSA5O1xudmFyIENvbnRleHRQcm92aWRlciA9IDEwO1xudmFyIEZvcndhcmRSZWYgPSAxMTtcbnZhciBQcm9maWxlciA9IDEyO1xudmFyIFN1c3BlbnNlQ29tcG9uZW50ID0gMTM7XG52YXIgTWVtb0NvbXBvbmVudCA9IDE0O1xudmFyIFNpbXBsZU1lbW9Db21wb25lbnQgPSAxNTtcbnZhciBMYXp5Q29tcG9uZW50ID0gMTY7XG52YXIgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50ID0gMTc7XG52YXIgRGVoeWRyYXRlZEZyYWdtZW50ID0gMTg7XG52YXIgU3VzcGVuc2VMaXN0Q29tcG9uZW50ID0gMTk7XG52YXIgU2NvcGVDb21wb25lbnQgPSAyMTtcbnZhciBPZmZzY3JlZW5Db21wb25lbnQgPSAyMjtcbnZhciBMZWdhY3lIaWRkZW5Db21wb25lbnQgPSAyMztcbnZhciBDYWNoZUNvbXBvbmVudCA9IDI0O1xudmFyIFRyYWNpbmdNYXJrZXJDb21wb25lbnQgPSAyNTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZUNsaWVudFJlbmRlckZhbGxiYWNrT25UZXh0TWlzbWF0Y2ggPSB0cnVlOyAvLyBUT0RPOiBOZWVkIHRvIHJldmlldyB0aGlzIGNvZGUgb25lIG1vcmUgdGltZSBiZWZvcmUgbGFuZGluZ1xuLy8gdGhlIHJlYWN0LXJlY29uY2lsZXIgcGFja2FnZS5cblxudmFyIGVuYWJsZU5ld1JlY29uY2lsZXIgPSBmYWxzZTsgLy8gU3VwcG9ydCBsZWdhY3kgUHJpbWVyIHN1cHBvcnQgb24gaW50ZXJuYWwgRkIgd3d3XG5cbnZhciBlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uID0gZmFsc2U7IC8vIEZCLW9ubHkgdXNhZ2UuIFRoZSBuZXcgQVBJIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzLlxuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuXG52YXIgZW5hYmxlU3VzcGVuc2VBdm9pZFRoaXNGYWxsYmFjayA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRml6elxuLy8gUmVhY3QgRE9NIENob3BwaW5nIEJsb2NrXG4vL1xuLy8gU2ltaWxhciB0byBtYWluIENob3BwaW5nIEJsb2NrIGJ1dCBvbmx5IGZsYWdzIHJlbGF0ZWQgdG8gUmVhY3QgRE9NLiBUaGVzZSBhcmVcbi8vIGdyb3VwZWQgYmVjYXVzZSB3ZSB3aWxsIGxpa2VseSBiYXRjaCBhbGwgb2YgdGhlbSBpbnRvIGEgc2luZ2xlIG1ham9yIHJlbGVhc2UuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGlzYWJsZSBzdXBwb3J0IGZvciBjb21tZW50IG5vZGVzIGFzIFJlYWN0IERPTSBjb250YWluZXJzLiBBbHJlYWR5IGRpc2FibGVkXG4vLyBpbiBvcGVuIHNvdXJjZSwgYnV0IHd3dyBjb2RlYmFzZSBzdGlsbCByZWxpZXMgb24gaXQuIE5lZWQgdG8gcmVtb3ZlLlxuXG52YXIgZGlzYWJsZUNvbW1lbnRzQXNET01Db250YWluZXJzID0gdHJ1ZTsgLy8gRGlzYWJsZSBqYXZhc2NyaXB0OiBVUkwgc3RyaW5ncyBpbiBocmVmIGZvciBYU1MgcHJvdGVjdGlvbi5cbi8vIGFuZCBjbGllbnQgcmVuZGVyaW5nLCBtb3N0bHkgdG8gYWxsb3cgSlNYIGF0dHJpYnV0ZXMgdG8gYXBwbHkgdG8gdGhlIGN1c3RvbVxuLy8gZWxlbWVudCdzIG9iamVjdCBwcm9wZXJ0aWVzIGluc3RlYWQgb2Ygb25seSBIVE1MIGF0dHJpYnV0ZXMuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExMzQ3XG5cbnZhciBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ID0gZmFsc2U7IC8vIERpc2FibGVzIGNoaWxkcmVuIGZvciA8dGV4dGFyZWE+IGVsZW1lbnRzXG52YXIgd2FybkFib3V0U3RyaW5nUmVmcyA9IHRydWU7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEZWJ1Z2dpbmcgYW5kIERldlRvb2xzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWRkcyB1c2VyIHRpbWluZyBtYXJrcyBmb3IgZS5nLiBzdGF0ZSB1cGRhdGVzLCBzdXNwZW5zZSwgYW5kIHdvcmsgbG9vcCBzdHVmZixcbi8vIGZvciBhbiBleHBlcmltZW50YWwgdGltZWxpbmUgdG9vbC5cblxudmFyIGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlciA9IHRydWU7IC8vIEhlbHBzIGlkZW50aWZ5IHNpZGUgZWZmZWN0cyBpbiByZW5kZXItcGhhc2UgbGlmZWN5Y2xlIGhvb2tzIGFuZCBzZXRTdGF0ZVxuXG52YXIgZW5hYmxlUHJvZmlsZXJUaW1lciA9IHRydWU7IC8vIFJlY29yZCBkdXJhdGlvbnMgZm9yIGNvbW1pdCBhbmQgcGFzc2l2ZSBlZmZlY3RzIHBoYXNlcy5cblxudmFyIGVuYWJsZVByb2ZpbGVyQ29tbWl0SG9va3MgPSB0cnVlOyAvLyBQaGFzZSBwYXJhbSBwYXNzZWQgdG8gb25SZW5kZXIgY2FsbGJhY2sgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBhbiBcInVwZGF0ZVwiIGFuZCBhIFwiY2FzY2FkaW5nLXVwZGF0ZVwiLlxuXG52YXIgYWxsTmF0aXZlRXZlbnRzID0gbmV3IFNldCgpO1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gZXZlbnQgbmFtZVxuICovXG5cblxudmFyIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMgPSB7fTtcbi8qKlxuICogTWFwcGluZyBmcm9tIGxvd2VyY2FzZSByZWdpc3RyYXRpb24gbmFtZXMgdG8gdGhlIHByb3Blcmx5IGNhc2VkIHZlcnNpb24sXG4gKiB1c2VkIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBldmVudCBoYW5kbGVycy4gQXZhaWxhYmxlXG4gKiBvbmx5IGluIHRydWUuXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbnZhciBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gIHt9IDsgLy8gVHJ1c3QgdGhlIGRldmVsb3BlciB0byBvbmx5IHVzZSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzIGluIHRydWVcblxuZnVuY3Rpb24gcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcyk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSArICdDYXB0dXJlJywgZGVwZW5kZW5jaWVzKTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHtcbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSkge1xuICAgICAgZXJyb3IoJ0V2ZW50UmVnaXN0cnk6IE1vcmUgdGhhbiBvbmUgcGx1Z2luIGF0dGVtcHRlZCB0byBwdWJsaXNoIHRoZSBzYW1lICcgKyAncmVnaXN0cmF0aW9uIG5hbWUsIGAlc2AuJywgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSA9IGRlcGVuZGVuY2llcztcblxuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcmVnaXN0cmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdID0gcmVnaXN0cmF0aW9uTmFtZTtcblxuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25Eb3VibGVDbGljaycpIHtcbiAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMub25kYmxjbGljayA9IHJlZ2lzdHJhdGlvbk5hbWU7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBhbGxOYXRpdmVFdmVudHMuYWRkKGRlcGVuZGVuY2llc1tpXSk7XG4gIH1cbn1cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgYXR0cmlidXRlIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIGF0dHJpYnV0ZU5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbih2YWx1ZSwgcHJvcE5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBwcm9wIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgcHJvcE5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBDU1MgcHJvcGVydHkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgcHJvcE5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tIdG1sU3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgSFRNTCBtYXJrdXAgdXNlcyBhIHZhbHVlIG9mIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignRm9ybSBmaWVsZCB2YWx1ZXMgKHZhbHVlLCBjaGVja2VkLCBkZWZhdWx0VmFsdWUsIG9yIGRlZmF1bHRDaGVja2VkIHByb3BzKScgKyAnIG11c3QgYmUgc3RyaW5ncywgbm90ICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cblxuLy8gQSByZXNlcnZlZCBhdHRyaWJ1dGUuXG4vLyBJdCBpcyBoYW5kbGVkIGJ5IFJlYWN0IHNlcGFyYXRlbHkgYW5kIHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG52YXIgUkVTRVJWRUQgPSAwOyAvLyBBIHNpbXBsZSBzdHJpbmcgYXR0cmlidXRlLlxuLy8gQXR0cmlidXRlcyB0aGF0IGFyZW4ndCBpbiB0aGUgZmlsdGVyIGFyZSBwcmVzdW1lZCB0byBoYXZlIHRoaXMgdHlwZS5cblxudmFyIFNUUklORyA9IDE7IC8vIEEgc3RyaW5nIGF0dHJpYnV0ZSB0aGF0IGFjY2VwdHMgYm9vbGVhbnMgaW4gUmVhY3QuIEluIEhUTUwsIHRoZXNlIGFyZSBjYWxsZWRcbi8vIFwiZW51bWVyYXRlZFwiIGF0dHJpYnV0ZXMgd2l0aCBcInRydWVcIiBhbmQgXCJmYWxzZVwiIGFzIHBvc3NpYmxlIHZhbHVlcy5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHNldCB0byBhIFwidHJ1ZVwiIHN0cmluZy5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcImZhbHNlXCIgc3RyaW5nLlxuXG52YXIgQk9PTEVBTklTSF9TVFJJTkcgPSAyOyAvLyBBIHJlYWwgYm9vbGVhbiBhdHRyaWJ1dGUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cblxudmFyIEJPT0xFQU4gPSAzOyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgYXMgd2VsbCBhcyB3aXRoIGEgdmFsdWUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cbi8vIEZvciBhbnkgb3RoZXIgdmFsdWUsIHNob3VsZCBiZSBwcmVzZW50IHdpdGggdGhhdCB2YWx1ZS5cblxudmFyIE9WRVJMT0FERURfQk9PTEVBTiA9IDQ7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIG51bWVyaWMuXG4vLyBXaGVuIGZhbHN5LCBpdCBzaG91bGQgYmUgcmVtb3ZlZC5cblxudmFyIE5VTUVSSUMgPSA1OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIHBvc2l0aXZlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBwb3NpdGl2ZSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBQT1NJVElWRV9OVU1FUklDID0gNjtcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xudmFyIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgPSBcIjpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRcIjtcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG52YXIgQVRUUklCVVRFX05BTUVfQ0hBUiA9IEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyBcIlxcXFwtLjAtOVxcXFx1MDBCN1xcXFx1MDMwMC1cXFxcdTAzNkZcXFxcdTIwM0YtXFxcXHUyMDQwXCI7XG52YXIgVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVggPSBuZXcgUmVnRXhwKCdeWycgKyBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgJ11bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xudmFyIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xuZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKSB7XG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYLnRlc3QoYXR0cmlidXRlTmFtZSkpIHtcbiAgICB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cbiAge1xuICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lOiBgJXNgJywgYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRDtcbiAgfVxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChuYW1lLmxlbmd0aCA+IDIgJiYgKG5hbWVbMF0gPT09ICdvJyB8fCBuYW1lWzBdID09PSAnTycpICYmIChuYW1lWzFdID09PSAnbicgfHwgbmFtZVsxXSA9PT0gJ04nKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzogLy8gJEZsb3dJc3N1ZSBzeW1ib2wgaXMgcGVyZmVjdGx5IHZhbGlkIGhlcmVcblxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAge1xuICAgICAgICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuICFwcm9wZXJ0eUluZm8uYWNjZXB0c0Jvb2xlYW5zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwcmVmaXggPSBuYW1lLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCwgNSk7XG4gICAgICAgICAgcmV0dXJuIHByZWZpeCAhPT0gJ2RhdGEtJyAmJiBwcmVmaXggIT09ICdhcmlhLSc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5SW5mby50eXBlKSB7XG4gICAgICBjYXNlIEJPT0xFQU46XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG5cbiAgICAgIGNhc2UgT1ZFUkxPQURFRF9CT09MRUFOOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlO1xuXG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG5cbiAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKG5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIHR5cGUsIG11c3RVc2VQcm9wZXJ0eSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZXNwYWNlLCBzYW5pdGl6ZVVSTCwgcmVtb3ZlRW1wdHlTdHJpbmcpIHtcbiAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSB0eXBlID09PSBCT09MRUFOSVNIX1NUUklORyB8fCB0eXBlID09PSBCT09MRUFOIHx8IHR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTjtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBhdHRyaWJ1dGVOYW1lc3BhY2U7XG4gIHRoaXMubXVzdFVzZVByb3BlcnR5ID0gbXVzdFVzZVByb3BlcnR5O1xuICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2FuaXRpemVVUkwgPSBzYW5pdGl6ZVVSTDtcbiAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nO1xufSAvLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoaXMgbGlzdCwgYmUgc3VyZSB0byBhbHNvIGFkZCB0aGVtIHRvXG4vLyB0aGUgYHBvc3NpYmxlU3RhbmRhcmROYW1lc2AgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdFxuLy8gbmFtZSB3YXJuaW5ncy5cblxuXG52YXIgcHJvcGVydGllcyA9IHt9OyAvLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblxudmFyIHJlc2VydmVkUHJvcHMgPSBbJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJywgLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ107XG5cbnJlc2VydmVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBSRVNFUlZFRCwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIEEgZmV3IFJlYWN0IHN0cmluZyBhdHRyaWJ1dGVzIGhhdmUgYSBkaWZmZXJlbnQgbmFtZS5cbi8vIFRoaXMgaXMgYSBtYXBwaW5nIGZyb20gUmVhY3QgcHJvcCBuYW1lcyB0byB0aGUgYXR0cmlidXRlIG5hbWVzLlxuXG5bWydhY2NlcHRDaGFyc2V0JywgJ2FjY2VwdC1jaGFyc2V0J10sIFsnY2xhc3NOYW1lJywgJ2NsYXNzJ10sIFsnaHRtbEZvcicsICdmb3InXSwgWydodHRwRXF1aXYnLCAnaHR0cC1lcXVpdiddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBuYW1lID0gX3JlZlswXSxcbiAgICAgIGF0dHJpYnV0ZU5hbWUgPSBfcmVmWzFdO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIuXG4vLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5XG4vLyB0aGVzZSBhcmVuJ3QgYm9vbGVhbiBhdHRyaWJ1dGVzICh0aGV5IGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MpLlxuXG5bJ2NvbnRlbnRFZGl0YWJsZScsICdkcmFnZ2FibGUnLCAnc3BlbGxDaGVjaycsICd2YWx1ZSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBcImVudW1lcmF0ZWRcIiBTVkcgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cbi8vIFNpbmNlIHRoZXNlIGFyZSBTVkcgYXR0cmlidXRlcywgdGhlaXIgYXR0cmlidXRlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cblxuWydhdXRvUmV2ZXJzZScsICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJywgJ2ZvY3VzYWJsZScsICdwcmVzZXJ2ZUFscGhhJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOSVNIX1NUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGJvb2xlYW4gYXR0cmlidXRlcy5cblxuWydhbGxvd0Z1bGxTY3JlZW4nLCAnYXN5bmMnLCAvLyBOb3RlOiB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IHByZXZlbnRzIGl0IGZyb20gYmVpbmcgd3JpdHRlbiB0byB0aGUgRE9NXG4vLyBvbiB0aGUgY2xpZW50IHNpZGUgYmVjYXVzZSB0aGUgYnJvd3NlcnMgYXJlIGluY29uc2lzdGVudC4gSW5zdGVhZCB3ZSBjYWxsIGZvY3VzKCkuXG4nYXV0b0ZvY3VzJywgJ2F1dG9QbGF5JywgJ2NvbnRyb2xzJywgJ2RlZmF1bHQnLCAnZGVmZXInLCAnZGlzYWJsZWQnLCAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLCAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJywgJ2Zvcm1Ob1ZhbGlkYXRlJywgJ2hpZGRlbicsICdsb29wJywgJ25vTW9kdWxlJywgJ25vVmFsaWRhdGUnLCAnb3BlbicsICdwbGF5c0lubGluZScsICdyZWFkT25seScsICdyZXF1aXJlZCcsICdyZXZlcnNlZCcsICdzY29wZWQnLCAnc2VhbWxlc3MnLCAvLyBNaWNyb2RhdGFcbidpdGVtU2NvcGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSB0aGUgZmV3IFJlYWN0IHByb3BzIHRoYXQgd2Ugc2V0IGFzIERPTSBwcm9wZXJ0aWVzXG4vLyByYXRoZXIgdGhhbiBhdHRyaWJ1dGVzLiBUaGVzZSBhcmUgYWxsIGJvb2xlYW5zLlxuXG5bJ2NoZWNrZWQnLCAvLyBOb3RlOiBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2VsZWN0Lm11bHRpcGxlYCBpc1xuLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC4gV2UgaGF2ZSBzcGVjaWFsIGxvZ2ljIGZvciBoYW5kbGluZyB0aGlzLlxuJ211bHRpcGxlJywgJ211dGVkJywgJ3NlbGVjdGVkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCB0cnVlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYXJlIFwib3ZlcmxvYWRlZCBib29sZWFuc1wiOiB0aGV5IGJlaGF2ZSBsaWtlXG4vLyBib29sZWFucywgYnV0IGNhbiBhbHNvIGFjY2VwdCBhIHN0cmluZyB2YWx1ZS5cblxuWydjYXB0dXJlJywgJ2Rvd25sb2FkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBPVkVSTE9BREVEX0JPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1iZXJzLlxuXG5bJ2NvbHMnLCAncm93cycsICdzaXplJywgJ3NwYW4nIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFBPU0lUSVZFX05VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBudW1iZXJzLlxuXG5bJ3Jvd1NwYW4nLCAnc3RhcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIE5VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7XG52YXIgQ0FNRUxJWkUgPSAvW1xcLVxcOl0oW2Etel0pL2c7XG5cbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIHJldHVybiB0b2tlblsxXS50b1VwcGVyQ2FzZSgpO1xufTsgLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIFNWRyBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBzcGVjaWFsIGNhc2luZywgbmFtZXNwYWNpbmcsXG4vLyBvciBib29sZWFuIHZhbHVlIGFzc2lnbm1lbnQuIFJlZ3VsYXIgYXR0cmlidXRlcyB0aGF0IGp1c3QgYWNjZXB0IHN0cmluZ3Ncbi8vIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFyZSBvbWl0dGVkLCBqdXN0IGxpa2UgaW4gdGhlIEhUTUwgYXR0cmlidXRlIGZpbHRlci5cbi8vIFNvbWUgb2YgdGhlc2UgYXR0cmlidXRlcyBjYW4gYmUgaGFyZCB0byBmaW5kLiBUaGlzIGxpc3Qgd2FzIGNyZWF0ZWQgYnlcbi8vIHNjcmFwaW5nIHRoZSBNRE4gZG9jdW1lbnRhdGlvbi5cblxuXG5bJ2FjY2VudC1oZWlnaHQnLCAnYWxpZ25tZW50LWJhc2VsaW5lJywgJ2FyYWJpYy1mb3JtJywgJ2Jhc2VsaW5lLXNoaWZ0JywgJ2NhcC1oZWlnaHQnLCAnY2xpcC1wYXRoJywgJ2NsaXAtcnVsZScsICdjb2xvci1pbnRlcnBvbGF0aW9uJywgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsICdjb2xvci1wcm9maWxlJywgJ2NvbG9yLXJlbmRlcmluZycsICdkb21pbmFudC1iYXNlbGluZScsICdlbmFibGUtYmFja2dyb3VuZCcsICdmaWxsLW9wYWNpdHknLCAnZmlsbC1ydWxlJywgJ2Zsb29kLWNvbG9yJywgJ2Zsb29kLW9wYWNpdHknLCAnZm9udC1mYW1pbHknLCAnZm9udC1zaXplJywgJ2ZvbnQtc2l6ZS1hZGp1c3QnLCAnZm9udC1zdHJldGNoJywgJ2ZvbnQtc3R5bGUnLCAnZm9udC12YXJpYW50JywgJ2ZvbnQtd2VpZ2h0JywgJ2dseXBoLW5hbWUnLCAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCcsICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCcsICdob3Jpei1hZHYteCcsICdob3Jpei1vcmlnaW4teCcsICdpbWFnZS1yZW5kZXJpbmcnLCAnbGV0dGVyLXNwYWNpbmcnLCAnbGlnaHRpbmctY29sb3InLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdvdmVybGluZS1wb3NpdGlvbicsICdvdmVybGluZS10aGlja25lc3MnLCAncGFpbnQtb3JkZXInLCAncGFub3NlLTEnLCAncG9pbnRlci1ldmVudHMnLCAncmVuZGVyaW5nLWludGVudCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicsICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcycsICdzdHJva2UtZGFzaGFycmF5JywgJ3N0cm9rZS1kYXNob2Zmc2V0JywgJ3N0cm9rZS1saW5lY2FwJywgJ3N0cm9rZS1saW5lam9pbicsICdzdHJva2UtbWl0ZXJsaW1pdCcsICdzdHJva2Utb3BhY2l0eScsICdzdHJva2Utd2lkdGgnLCAndGV4dC1hbmNob3InLCAndGV4dC1kZWNvcmF0aW9uJywgJ3RleHQtcmVuZGVyaW5nJywgJ3VuZGVybGluZS1wb3NpdGlvbicsICd1bmRlcmxpbmUtdGhpY2tuZXNzJywgJ3VuaWNvZGUtYmlkaScsICd1bmljb2RlLXJhbmdlJywgJ3VuaXRzLXBlci1lbScsICd2LWFscGhhYmV0aWMnLCAndi1oYW5naW5nJywgJ3YtaWRlb2dyYXBoaWMnLCAndi1tYXRoZW1hdGljYWwnLCAndmVjdG9yLWVmZmVjdCcsICd2ZXJ0LWFkdi15JywgJ3ZlcnQtb3JpZ2luLXgnLCAndmVydC1vcmlnaW4teScsICd3b3JkLXNwYWNpbmcnLCAnd3JpdGluZy1tb2RlJywgJ3htbG5zOnhsaW5rJywgJ3gtaGVpZ2h0JyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeGxpbmsgbmFtZXNwYWNlLlxuXG5bJ3hsaW5rOmFjdHVhdGUnLCAneGxpbms6YXJjcm9sZScsICd4bGluazpyb2xlJywgJ3hsaW5rOnNob3cnLCAneGxpbms6dGl0bGUnLCAneGxpbms6dHlwZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bWwgbmFtZXNwYWNlLlxuXG5bJ3htbDpiYXNlJywgJ3htbDpsYW5nJywgJ3htbDpzcGFjZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlIGV4aXN0cyBib3RoIGluIEhUTUwgYW5kIFNWRy5cbi8vIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBjYXNlLXNlbnNpdGl2ZSBpbiBTVkcgc28gd2UgY2FuJ3QganVzdCB1c2Vcbi8vIHRoZSBSZWFjdCBuYW1lIGxpa2Ugd2UgZG8gZm9yIGF0dHJpYnV0ZXMgdGhhdCBleGlzdCBvbmx5IGluIEhUTUwuXG5cblsndGFiSW5kZXgnLCAnY3Jvc3NPcmlnaW4nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlcyBhY2NlcHQgVVJMcy4gVGhlc2UgbXVzdCBub3QgYWxsb3cgamF2YXNjcmlwdDogVVJMUy5cbi8vIFRoZXNlIHdpbGwgYWxzbyBuZWVkIHRvIGFjY2VwdCBUcnVzdGVkIFR5cGVzIG9iamVjdCBpbiB0aGUgZnV0dXJlLlxuXG52YXIgeGxpbmtIcmVmID0gJ3hsaW5rSHJlZic7XG5wcm9wZXJ0aWVzW3hsaW5rSHJlZl0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKCd4bGlua0hyZWYnLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbid4bGluazpocmVmJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCB0cnVlLCAvLyBzYW5pdGl6ZVVSTFxuZmFsc2UpO1xuWydzcmMnLCAnaHJlZicsICdhY3Rpb24nLCAnZm9ybUFjdGlvbiddLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgcHJvcGVydGllc1thdHRyaWJ1dGVOYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoYXR0cmlidXRlTmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbiAgdHJ1ZSk7XG59KTtcblxuLy8gYW5kIGFueSBuZXdsaW5lIG9yIHRhYiBhcmUgZmlsdGVyZWQgb3V0IGFzIGlmIHRoZXkncmUgbm90IHBhcnQgb2YgdGhlIFVSTC5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLXBhcnNpbmdcbi8vIFRhYiBvciBuZXdsaW5lIGFyZSBkZWZpbmVkIGFzIFxcclxcblxcdDpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS10YWItb3ItbmV3bGluZVxuLy8gQSBDMCBjb250cm9sIGlzIGEgY29kZSBwb2ludCBpbiB0aGUgcmFuZ2UgXFx1MDAwMCBOVUxMIHRvIFxcdTAwMUZcbi8vIElORk9STUFUSU9OIFNFUEFSQVRPUiBPTkUsIGluY2x1c2l2ZTpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNjMC1jb250cm9sLW9yLXNwYWNlXG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxudmFyIGlzSmF2YVNjcmlwdFByb3RvY29sID0gL15bXFx1MDAwMC1cXHUwMDFGIF0qaltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSp2W1xcclxcblxcdF0qYVtcXHJcXG5cXHRdKnNbXFxyXFxuXFx0XSpjW1xcclxcblxcdF0qcltcXHJcXG5cXHRdKmlbXFxyXFxuXFx0XSpwW1xcclxcblxcdF0qdFtcXHJcXG5cXHRdKlxcOi9pO1xudmFyIGRpZFdhcm4gPSBmYWxzZTtcblxuZnVuY3Rpb24gc2FuaXRpemVVUkwodXJsKSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm4gJiYgaXNKYXZhU2NyaXB0UHJvdG9jb2wudGVzdCh1cmwpKSB7XG4gICAgICBkaWRXYXJuID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ0EgZnV0dXJlIHZlcnNpb24gb2YgUmVhY3Qgd2lsbCBibG9jayBqYXZhc2NyaXB0OiBVUkxzIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4gJyArICdVc2UgZXZlbnQgaGFuZGxlcnMgaW5zdGVhZCBpZiB5b3UgY2FuLiBJZiB5b3UgbmVlZCB0byBnZW5lcmF0ZSB1bnNhZmUgSFRNTCB0cnkgJyArICd1c2luZyBkYW5nZXJvdXNseVNldElubmVySFRNTCBpbnN0ZWFkLiBSZWFjdCB3YXMgcGFzc2VkICVzLicsIEpTT04uc3RyaW5naWZ5KHVybCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLiBPbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqIFRoZSBcImV4cGVjdGVkXCIgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuXG4gKiBTb21lIHByb3BlcnRpZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvKSB7XG4gIHtcbiAgICBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG4gICAgICByZXR1cm4gbm9kZVtwcm9wZXJ0eU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGNoZWNrIHByb3RlY3RzIG11bHRpcGxlIHVzZXMgb2YgYGV4cGVjdGVkYCwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgLy8gcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb24gcnVsZSBpcyBkaXNhYmxlZCBpbiBzZXZlcmFsIHNwb3RzXG4gICAgICAvLyBiZWxvdy5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICggcHJvcGVydHlJbmZvLnNhbml0aXplVVJMKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgZnVsbHkgZGlzYWJsZWQgamF2YXNjcmlwdDogVVJMcywgYW5kIGlmXG4gICAgICAgIC8vIHRoZSBoeWRyYXRpb24gaXMgc3VjY2Vzc2Z1bCBvZiBhIGphdmFzY3JpcHQ6IFVSTCwgd2VcbiAgICAgICAgLy8gc3RpbGwgd2FudCB0byB3YXJuIG9uIHRoZSBjbGllbnQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBzYW5pdGl6ZVVSTCgnJyArIGV4cGVjdGVkKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgIHZhciBzdHJpbmdWYWx1ZSA9IG51bGw7XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOKSB7XG4gICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAvLyBXZSBoYWQgYW4gYXR0cmlidXRlIGJ1dCBzaG91bGRuJ3QgaGF2ZSBoYWQgb25lLCBzbyByZWFkIGl0XG4gICAgICAgICAgLy8gZm9yIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGEgYm9vbGVhbiwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgdmFsdWUgaXNcbiAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkLlxuICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgfSAvLyBFdmVuIGlmIHRoaXMgcHJvcGVydHkgdXNlcyBhIG5hbWVzcGFjZSB3ZSB1c2UgZ2V0QXR0cmlidXRlXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXNzdW1lIGl0cyBuYW1lc3BhY2VkIG5hbWUgaXMgdGhlIHNhbWUgYXMgb3VyIGNvbmZpZy5cbiAgICAgICAgLy8gVG8gdXNlIGdldEF0dHJpYnV0ZU5TIHdlIG5lZWQgdGhlIGxvY2FsIG5hbWUgd2hpY2ggd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAvLyBpbiBvdXIgY29uZmlnIGF0bS5cblxuXG4gICAgICAgIHN0cmluZ1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gbnVsbCA/IGV4cGVjdGVkIDogc3RyaW5nVmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCBleHBlY3RlZCwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAge1xuICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghbm9kZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgIHtcbiAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oZXhwZWN0ZWQsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5cbmZ1bmN0aW9uIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgdmFsdWUsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG5cbiAgaWYgKHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgdmFsdWUgPSBudWxsO1xuICB9XG5cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgfHwgcHJvcGVydHlJbmZvID09PSBudWxsKSB7XG4gICAgaWYgKGlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHZhciBfYXR0cmlidXRlTmFtZSA9IG5hbWU7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSwgICcnICsgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtdXN0VXNlUHJvcGVydHkgPSBwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5O1xuXG4gIGlmIChtdXN0VXNlUHJvcGVydHkpIHtcbiAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIHR5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcbiAgICAgIG5vZGVbcHJvcGVydHlOYW1lXSA9IHR5cGUgPT09IEJPT0xFQU4gPyBmYWxzZSA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250cmFyeSB0byBgc2V0QXR0cmlidXRlYCwgb2JqZWN0IHByb3BlcnRpZXMgYXJlIHByb3Blcmx5XG4gICAgICAvLyBgdG9TdHJpbmdgZWQgYnkgSUU4LzkuXG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gVGhlIHJlc3QgYXJlIHRyZWF0ZWQgYXMgYXR0cmlidXRlcyB3aXRoIHNwZWNpYWwgY2FzZXMuXG5cblxuICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lLFxuICAgICAgYXR0cmlidXRlTmFtZXNwYWNlID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWVzcGFjZTtcblxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgX3R5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcbiAgICB2YXIgYXR0cmlidXRlVmFsdWU7XG5cbiAgICBpZiAoX3R5cGUgPT09IEJPT0xFQU4gfHwgX3R5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTiAmJiB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gSWYgYXR0cmlidXRlIHR5cGUgaXMgYm9vbGVhbiwgd2Uga25vdyBmb3Igc3VyZSBpdCB3b24ndCBiZSBhbiBleGVjdXRpb24gc2lua1xuICAgICAgLy8gYW5kIHdlIHdvbid0IHJlcXVpcmUgVHJ1c3RlZCBUeXBlIGhlcmUuXG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgc2V0QXR0cmlidXRlYCB3aXRoIG9iamVjdHMgYmVjb21lcyBvbmx5IGBbb2JqZWN0XWAgaW4gSUU4LzksXG4gICAgICAvLyAoJycgKyB2YWx1ZSkgbWFrZXMgaXQgb3V0cHV0IHRoZSBjb3JyZWN0IHRvU3RyaW5nKCktdmFsdWUuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnR5SW5mby5zYW5pdGl6ZVVSTCkge1xuICAgICAgICBzYW5pdGl6ZVVSTChhdHRyaWJ1dGVWYWx1ZS50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXR0cmlidXRlTmFtZXNwYWNlKSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKGF0dHJpYnV0ZU5hbWVzcGFjZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zY29wZScpO1xudmFyIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZGVidWdfdHJhY2VfbW9kZScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGVnYWN5X2hpZGRlbicpO1xudmFyIFJFQUNUX0NBQ0hFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jYWNoZScpO1xudmFyIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC50cmFjaW5nX21hcmtlcicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgIHByZWZpeCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgICAgfVxuICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuXG5cblxuICAgIHJldHVybiAnXFxuJyArIHByZWZpeCArIG5hbWU7XG4gIH1cbn1cbnZhciByZWVudHJ5ID0gZmFsc2U7XG52YXIgY29tcG9uZW50RnJhbWVDYWNoZTtcblxue1xuICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuICBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuXG4gIGlmICggIWZuIHx8IHJlZW50cnkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB7XG4gICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udHJvbDtcbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLlxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldmlvdXNEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVDbGFzc0NvbXBvbmVudEZyYW1lKGN0b3IsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoY3RvciwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHtcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUsIHNob3VsZENvbnN0cnVjdCh0eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAvLyBNZW1vIG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRmliZXIoZmliZXIpIHtcbiAgdmFyIG93bmVyID0gIGZpYmVyLl9kZWJ1Z093bmVyID8gZmliZXIuX2RlYnVnT3duZXIudHlwZSA6IG51bGwgO1xuICB2YXIgc291cmNlID0gIGZpYmVyLl9kZWJ1Z1NvdXJjZSA7XG5cbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ0xhenknKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlLnJlbmRlcik7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHdvcmtJblByb2dyZXNzKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgZG8ge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKG5vZGUpO1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUpO1xuXG4gICAgcmV0dXJuIGluZm87XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gJ1xcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6ICcgKyB4Lm1lc3NhZ2UgKyAnXFxuJyArIHguc3RhY2s7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUkMShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lKTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lJDEodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHtcbiAgdmFyIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnQ2FjaGUnO1xuXG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lJDEocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRGVoeWRyYXRlZEZyYWdtZW50JztcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSQxKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgLy8gSG9zdCBjb21wb25lbnQgdHlwZSBpcyB0aGUgZGlzcGxheSBuYW1lIChlLmcuIFwiZGl2XCIsIFwiVmlld1wiKVxuICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcmV0dXJuICdSb290JztcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gJ1RleHQnO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgLy8gTmFtZSBjb21lcyBmcm9tIHRoZSB0eXBlIGluIHRoaXMgY2FzZTsgd2UgZG9uJ3QgaGF2ZSBhIHRhZy5cbiAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICBpZiAodHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSkge1xuICAgICAgICAvLyBEb24ndCBiZSBsZXNzIHNwZWNpZmljIHRoYW4gc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuICAgICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ01vZGUnO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICByZXR1cm4gJ09mZnNjcmVlbic7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTY29wZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnVHJhY2luZ01hcmtlcic7XG4gICAgLy8gVGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhpcyB0YWdzIGNvbWUgZnJvbSB0aGUgdXNlci1wcm92aWRlZCB0eXBlOlxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbnZhciBjdXJyZW50ID0gbnVsbDtcbnZhciBpc1JlbmRlcmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG93bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3duZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsXG4gICAgLy8gYW5kIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgdmVyc2lvbi5cblxuXG4gICAgcmV0dXJuIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChjdXJyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcbiAgICBjdXJyZW50ID0gbnVsbDtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50RmliZXIoZmliZXIpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gZmliZXIgPT09IG51bGwgPyBudWxsIDogZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldjtcbiAgICBjdXJyZW50ID0gZmliZXI7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyKCkge1xuICB7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldElzUmVuZGVyaW5nKHJlbmRlcmluZykge1xuICB7XG4gICAgaXNSZW5kZXJpbmcgPSByZW5kZXJpbmc7XG4gIH1cbn1cblxuLy8gRmxvdyBkb2VzIG5vdCBhbGxvdyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvZiBtb3N0IG5vbi1zdHJpbmcgdHlwZXMuIFRvIHdvcmtcbi8vIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHdlIHVzZSBhbiBvcGFxdWUgdHlwZSB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIGJ5XG4vLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAvLyBUaGUgY29lcmNpb24gc2FmZXR5IGNoZWNrIGlzIHBlcmZvcm1lZCBpbiBnZXRUb1N0cmluZ1ZhbHVlKCkuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBmdW5jdGlvbiwgc3ltYm9sIGFyZSBhc3NpZ25lZCBhcyBlbXB0eSBzdHJpbmdzXG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxudmFyIGhhc1JlYWRPbmx5VmFsdWUgPSB7XG4gIGJ1dHRvbjogdHJ1ZSxcbiAgY2hlY2tib3g6IHRydWUsXG4gIGltYWdlOiB0cnVlLFxuICBoaWRkZW46IHRydWUsXG4gIHJhZGlvOiB0cnVlLFxuICByZXNldDogdHJ1ZSxcbiAgc3VibWl0OiB0cnVlXG59O1xuZnVuY3Rpb24gY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcyh0YWdOYW1lLCBwcm9wcykge1xuICB7XG4gICAgaWYgKCEoaGFzUmVhZE9ubHlWYWx1ZVtwcm9wcy50eXBlXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5vbklucHV0IHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLnZhbHVlID09IG51bGwpKSB7XG4gICAgICBlcnJvcignWW91IHByb3ZpZGVkIGEgYHZhbHVlYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIShwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy5jaGVja2VkID09IG51bGwpKSB7XG4gICAgICBlcnJvcignWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdENoZWNrZWRgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2thYmxlKGVsZW0pIHtcbiAgdmFyIHR5cGUgPSBlbGVtLnR5cGU7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFja2VyKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX3ZhbHVlVHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gZGV0YWNoVHJhY2tlcihub2RlKSB7XG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlRnJvbU5vZGUobm9kZSkge1xuICB2YXIgdmFsdWUgPSAnJztcblxuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAoaXNDaGVja2FibGUobm9kZSkpIHtcbiAgICB2YWx1ZSA9IG5vZGUuY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBub2RlLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpIHtcbiAgdmFyIHZhbHVlRmllbGQgPSBpc0NoZWNrYWJsZShub2RlKSA/ICdjaGVja2VkJyA6ICd2YWx1ZSc7XG4gIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgdmFsdWVGaWVsZCk7XG5cbiAge1xuICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbihub2RlW3ZhbHVlRmllbGRdKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50VmFsdWUgPSAnJyArIG5vZGVbdmFsdWVGaWVsZF07IC8vIGlmIHNvbWVvbmUgaGFzIGFscmVhZHkgZGVmaW5lZCBhIHZhbHVlIG9yIFNhZmFyaSwgdGhlbiBiYWlsXG4gIC8vIGFuZCBkb24ndCB0cmFjayB2YWx1ZSB3aWxsIGNhdXNlIG92ZXIgcmVwb3J0aW5nIG9mIGNoYW5nZXMsXG4gIC8vIGJ1dCBpdCdzIGJldHRlciB0aGVuIGEgaGFyZCBmYWlsdXJlXG4gIC8vIChuZWVkZWQgZm9yIGNlcnRhaW4gdGVzdHMgdGhhdCBzcHlPbiBpbnB1dCB2YWx1ZXMgYW5kIFNhZmFyaSlcblxuICBpZiAobm9kZS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZUZpZWxkKSB8fCB0eXBlb2YgZGVzY3JpcHRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBkZXNjcmlwdG9yLnNldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBnZXQgPSBkZXNjcmlwdG9yLmdldCxcbiAgICAgIHNldCA9IGRlc2NyaXB0b3Iuc2V0O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgfVxuICB9KTsgLy8gV2UgY291bGQndmUgcGFzc2VkIHRoaXMgdGhlIGZpcnN0IHRpbWVcbiAgLy8gYnV0IGl0IHRyaWdnZXJzIGEgYnVnIGluIElFMTEgYW5kIEVkZ2UgMTQvMTUuXG4gIC8vIENhbGxpbmcgZGVmaW5lUHJvcGVydHkoKSBhZ2FpbiBzaG91bGQgYmUgZXF1aXZhbGVudC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTc2OFxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlXG4gIH0pO1xuICB2YXIgdHJhY2tlciA9IHtcbiAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9LFxuICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICB9LFxuICAgIHN0b3BUcmFja2luZzogZnVuY3Rpb24gKCkge1xuICAgICAgZGV0YWNoVHJhY2tlcihub2RlKTtcbiAgICAgIGRlbGV0ZSBub2RlW3ZhbHVlRmllbGRdO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIHRyYWNrKG5vZGUpIHtcbiAgaWYgKGdldFRyYWNrZXIobm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVE9ETzogT25jZSBpdCdzIGp1c3QgRmliZXIgd2UgY2FuIG1vdmUgdGhpcyB0byBub2RlLl93cmFwcGVyU3RhdGVcblxuXG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IHRyYWNrVmFsdWVPbk5vZGUobm9kZSk7XG59XG5mdW5jdGlvbiB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChub2RlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0cmFja2VyID0gZ2V0VHJhY2tlcihub2RlKTsgLy8gaWYgdGhlcmUgaXMgbm8gdHJhY2tlciBhdCB0aGlzIHBvaW50IGl0J3MgdW5saWtlbHlcbiAgLy8gdGhhdCB0cnlpbmcgYWdhaW4gd2lsbCBzdWNjZWVkXG5cbiAgaWYgKCF0cmFja2VyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbGFzdFZhbHVlID0gdHJhY2tlci5nZXRWYWx1ZSgpO1xuICB2YXIgbmV4dFZhbHVlID0gZ2V0VmFsdWVGcm9tTm9kZShub2RlKTtcblxuICBpZiAobmV4dFZhbHVlICE9PSBsYXN0VmFsdWUpIHtcbiAgICB0cmFja2VyLnNldFZhbHVlKG5leHRWYWx1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnQoZG9jKSB7XG4gIGRvYyA9IGRvYyB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogdW5kZWZpbmVkKTtcblxuICBpZiAodHlwZW9mIGRvYyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRvYy5hY3RpdmVFbGVtZW50IHx8IGRvYy5ib2R5O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGRvYy5ib2R5O1xuICB9XG59XG5cbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gZmFsc2U7XG52YXIgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaXNDb250cm9sbGVkKHByb3BzKSB7XG4gIHZhciB1c2VzQ2hlY2tlZCA9IHByb3BzLnR5cGUgPT09ICdjaGVja2JveCcgfHwgcHJvcHMudHlwZSA9PT0gJ3JhZGlvJztcbiAgcmV0dXJuIHVzZXNDaGVja2VkID8gcHJvcHMuY2hlY2tlZCAhPSBudWxsIDogcHJvcHMudmFsdWUgIT0gbnVsbDtcbn1cbi8qKlxuICogSW1wbGVtZW50cyBhbiA8aW5wdXQ+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgdGhlc2Ugb3B0aW9uYWxcbiAqIHByb3BzOiBgY2hlY2tlZGAsIGB2YWx1ZWAsIGBkZWZhdWx0Q2hlY2tlZGAsIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBJZiBgY2hlY2tlZGAgb3IgYHZhbHVlYCBhcmUgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9uc1xuICogdGhhdCBhZmZlY3QgdGhlIGNoZWNrZWQgc3RhdGUgb3IgdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgdGhleSBhcmUgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIG5vdFxuICogdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgcHJvcHMgbXVzdCBjaGFuZ2UgaW4gb3JkZXIgZm9yXG4gKiB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXMgdW5jaGVja2VkIChvciBgZGVmYXVsdENoZWNrZWRgKVxuICogd2l0aCBhbiBlbXB0eSB2YWx1ZSAob3IgYGRlZmF1bHRWYWx1ZWApLlxuICpcbiAqIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEyL1dELWh0bWw1LTIwMTIxMDI1L3RoZS1pbnB1dC1lbGVtZW50Lmh0bWxcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZDtcbiAgdmFyIGhvc3RQcm9wcyA9IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBkZWZhdWx0Q2hlY2tlZDogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgY2hlY2tlZDogY2hlY2tlZCAhPSBudWxsID8gY2hlY2tlZCA6IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZFxuICB9KTtcbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ2lucHV0JywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsID8gJycgOiBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsQ2hlY2tlZDogcHJvcHMuY2hlY2tlZCAhPSBudWxsID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSAhPSBudWxsID8gcHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWUpLFxuICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcylcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgJ2NoZWNrZWQnLCBjaGVja2VkLCBmYWxzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICB2YXIgY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG5cbiAgICBpZiAoIW5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvICcgKyAnYSBkZWZpbmVkIHZhbHVlLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSBhIGRlZmluZWQgdG8gJyArICd1bmRlZmluZWQsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpO1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPT09IDAgJiYgbm9kZS52YWx1ZSA9PT0gJycgfHwgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGNvZXJjZSB0byBudW1iZXIgaGVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnKSB7XG4gICAgLy8gU3VibWl0L3Jlc2V0IGlucHV0cyBuZWVkIHRoZSBhdHRyaWJ1dGUgcmVtb3ZlZCBjb21wbGV0ZWx5IHRvIGF2b2lkXG4gICAgLy8gYmxhbmstdGV4dCBidXR0b25zLlxuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIGNvbWVzIGZyb20gYSBjYXNjYWRlIG9mXG4gICAgLy8gcHJvcGVydGllczpcbiAgICAvLyAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMy4gT3RoZXJ3aXNlIHRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2VcbiAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBpdCBvbmx5IGNoYW5nZXMgd2hlbiBpdCBuZWVkc1xuICAgIC8vIHRvIGJlIHJlbW92ZWQsIHN1Y2ggYXMgdHJhbnNpdGlvbmluZyBmcm9tIGEgY2hlY2tib3ggaW50byBhIHRleHQgaW5wdXRcbiAgICBpZiAocHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlcihlbGVtZW50LCBwcm9wcywgaXNIeWRyYXRpbmcpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpIHx8IHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgIHZhciB0eXBlID0gcHJvcHMudHlwZTtcbiAgICB2YXIgaXNCdXR0b24gPSB0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnOyAvLyBBdm9pZCBzZXR0aW5nIHZhbHVlIGF0dHJpYnV0ZSBvbiBzdWJtaXQvcmVzZXQgaW5wdXRzIGFzIGl0IG92ZXJyaWRlcyB0aGVcbiAgICAvLyBkZWZhdWx0IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyLiBTZWU6ICMxMjg3MlxuXG4gICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsVmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICB7XG4gICAgICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgcHJvcGVydHkgc2hvdWxkIHVzZVxuICAgICAgICAvLyB0aGUgd3JhcHBlclN0YXRlLl9pbml0aWFsVmFsdWUgcHJvcGVydHkuIFRoaXMgdXNlczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAzLiBBbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICAgIG5vZGUudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgc3luY2hyb25pemVkIHRvIHRoZSBwcm9wZXJ0eSxcbiAgICAgIC8vIHNvIHdlIGFzc2lnbiBkZWZhdWx0VmFsdWUgdG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAvLyBhc3NpZ25tZW50IHN0ZXAgYWJvdmUuXG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB9XG4gIH0gLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYSBjaHJvbWUgYnVnIHdoZXJlIHNldHRpbmcgZGVmYXVsdENoZWNrZWRcbiAgLy8gd2lsbCBzb21ldGltZXMgaW5mbHVlbmNlIHRoZSB2YWx1ZSBvZiBjaGVja2VkIChldmVuIGFmdGVyIGRldGFjaG1lbnQpLlxuICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuc2V0IG5hbWUgdG8gYXZvaWQgZGlzcnVwdGluZyByYWRpbyBidXR0b24gZ3JvdXBzLlxuXG5cbiAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gJyc7XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgYm90aCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSBhbmRcbiAgICAvLyBhdHRyaWJ1dGUgYXJlIGFzc2lnbmVkIGF0IHRoZSBzYW1lIHRpbWUgdXNpbmcgZGVmYXVsdENoZWNrZWQuIFRoaXMgdXNlczpcbiAgICAvL1xuICAgIC8vICAgMS4gVGhlIGNoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAyLiBUaGUgZGVmYXVsdENoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAzLiBPdGhlcndpc2UsIGZhbHNlXG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIW5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcbiAgfVxuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB1cGRhdGVXcmFwcGVyKG5vZGUsIHByb3BzKTtcbiAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTmFtZWRDb3VzaW5zKHJvb3ROb2RlLCBwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG5cbiAgaWYgKHByb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmFtZSAhPSBudWxsKSB7XG4gICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlO1xuXG4gICAgd2hpbGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7XG4gICAgICBxdWVyeVJvb3QgPSBxdWVyeVJvb3QucGFyZW50Tm9kZTtcbiAgICB9IC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0uIEl0IG1pZ2h0IG5vdCBldmVuIGJlIGluIHRoZVxuICAgIC8vIGRvY3VtZW50LiBMZXQncyBqdXN0IHVzZSB0aGUgbG9jYWwgYHF1ZXJ5U2VsZWN0b3JBbGxgIHRvIGVuc3VyZSB3ZSBkb24ndFxuICAgIC8vIG1pc3MgYW55dGhpbmcuXG5cblxuICAgIHtcbiAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24obmFtZSwgJ25hbWUnKTtcbiAgICB9XG5cbiAgICB2YXIgZ3JvdXAgPSBxdWVyeVJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0nICsgSlNPTi5zdHJpbmdpZnkoJycgKyBuYW1lKSArICddW3R5cGU9XCJyYWRpb1wiXScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG90aGVyTm9kZSA9IGdyb3VwW2ldO1xuXG4gICAgICBpZiAob3RoZXJOb2RlID09PSByb290Tm9kZSB8fCBvdGhlck5vZGUuZm9ybSAhPT0gcm9vdE5vZGUuZm9ybSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gVGhpcyB3aWxsIHRocm93IGlmIHJhZGlvIGJ1dHRvbnMgcmVuZGVyZWQgYnkgZGlmZmVyZW50IGNvcGllcyBvZiBSZWFjdFxuICAgICAgLy8gYW5kIHRoZSBzYW1lIG5hbWUgYXJlIHJlbmRlcmVkIGludG8gdGhlIHNhbWUgZm9ybSAoc2FtZSBhcyAjMTkzOSkuXG4gICAgICAvLyBUaGF0J3MgcHJvYmFibHkgb2theTsgd2UgZG9uJ3Qgc3VwcG9ydCBpdCBqdXN0IGFzIHdlIGRvbid0IHN1cHBvcnRcbiAgICAgIC8vIG1peGluZyBSZWFjdCByYWRpbyBidXR0b25zIHdpdGggbm9uLVJlYWN0IG9uZXMuXG5cblxuICAgICAgdmFyIG90aGVyUHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKG90aGVyTm9kZSk7XG5cbiAgICAgIGlmICghb3RoZXJQcm9wcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0RE9NSW5wdXQ6IE1peGluZyBSZWFjdCBhbmQgbm9uLVJlYWN0IHJhZGlvIGlucHV0cyB3aXRoIHRoZSAnICsgJ3NhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9IC8vIFdlIG5lZWQgdXBkYXRlIHRoZSB0cmFja2VkIHZhbHVlIG9uIHRoZSBuYW1lZCBjb3VzaW4gc2luY2UgdGhlIHZhbHVlXG4gICAgICAvLyB3YXMgY2hhbmdlZCBidXQgdGhlIGlucHV0IHNhdyBubyBldmVudCBvciB2YWx1ZSBzZXRcblxuXG4gICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpOyAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cblxuICAgICAgdXBkYXRlV3JhcHBlcihvdGhlck5vZGUsIG90aGVyUHJvcHMpO1xuICAgIH1cbiAgfVxufSAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFsdWUgdG8gY2VydGFpbiBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLlxuLy8gRm9yIG51bWJlciBpbnB1dHMsIHRoZSBkaXNwbGF5IHZhbHVlIGxvc2VzIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnRzLiBGb3IgZW1haWwgaW5wdXRzLFxuLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbi8vXG4vLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtc1xuLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1M1xuXG5cbmZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanNcbiAgdHlwZSAhPT0gJ251bWJlcicgfHwgZ2V0QWN0aXZlRWxlbWVudChub2RlLm93bmVyRG9jdW1lbnQpICE9PSBub2RlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLmRlZmF1bHRWYWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gZmFsc2U7XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIC8vIElmIGEgdmFsdWUgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoZSBjaGlsZHJlbiBtdXN0IGJlIHNpbXBsZS5cbiAgICBpZiAocHJvcHMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ29iamVjdCcgJiYgcHJvcHMuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZENoaWxkKSB7XG4gICAgICAgICAgICBkaWRXYXJuSW52YWxpZENoaWxkID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCBpbmZlciB0aGUgb3B0aW9uIHZhbHVlIG9mIGNvbXBsZXggY2hpbGRyZW4uICcgKyAnUGFzcyBhIGB2YWx1ZWAgcHJvcCBvciB1c2UgYSBwbGFpbiBzdHJpbmcgYXMgY2hpbGRyZW4gdG8gPG9wdGlvbj4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MKSB7XG4gICAgICAgICAgZGlkV2FybkludmFsaWRJbm5lckhUTUwgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1Bhc3MgYSBgdmFsdWVgIHByb3AgaWYgeW91IHNldCBkYW5nZXJvdXNseUlubmVySFRNTCBzbyBSZWFjdCBrbm93cyAnICsgJ3doaWNoIHZhbHVlIHNob3VsZCBiZSBzZWxlY3RlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVE9ETzogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uXG5cblxuICAgIGlmIChwcm9wcy5zZWxlY3RlZCAhPSBudWxsICYmICFkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbikge1xuICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICcgKyAnc2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LicpO1xuXG4gICAgICBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gdmFsdWU9XCJcIiBzaG91bGQgbWFrZSBhIHZhbHVlIGF0dHJpYnV0ZSAoIzYyMTkpXG4gIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSkpKTtcbiAgfVxufVxuXG52YXIgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYSkge1xuICByZXR1cm4gaXNBcnJheUltcGwoYSk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMTtcblxue1xuICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gIGlmIChvd25lck5hbWUpIHtcbiAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIHZhbHVlUHJvcE5hbWVzID0gWyd2YWx1ZScsICdkZWZhdWx0VmFsdWUnXTtcbi8qKlxuICogVmFsaWRhdGlvbiBmdW5jdGlvbiBmb3IgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKi9cblxuZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3NlbGVjdCcsIHByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wTmFtZSA9IHZhbHVlUHJvcE5hbWVzW2ldO1xuXG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9wTmFtZUlzQXJyYXkgPSBpc0FycmF5KHByb3BzW3Byb3BOYW1lXSk7XG5cbiAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSAmJiAhcHJvcE5hbWVJc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfSBlbHNlIGlmICghcHJvcHMubXVsdGlwbGUgJiYgcHJvcE5hbWVJc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYSBzY2FsYXIgJyArICd2YWx1ZSBpZiBgbXVsdGlwbGVgIGlzIGZhbHNlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyhub2RlLCBtdWx0aXBsZSwgcHJvcFZhbHVlLCBzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgdmFyIG9wdGlvbnMgPSBub2RlLm9wdGlvbnM7XG5cbiAgaWYgKG11bHRpcGxlKSB7XG4gICAgdmFyIHNlbGVjdGVkVmFsdWVzID0gcHJvcFZhbHVlO1xuICAgIHZhciBzZWxlY3RlZFZhbHVlID0ge307XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBQcmVmaXggdG8gYXZvaWQgY2hhb3Mgd2l0aCBzcGVjaWFsIGtleXMuXG4gICAgICBzZWxlY3RlZFZhbHVlWyckJyArIHNlbGVjdGVkVmFsdWVzW2ldXSA9IHRydWU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG9wdGlvbnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVlLmhhc093blByb3BlcnR5KCckJyArIG9wdGlvbnNbX2ldLnZhbHVlKTtcblxuICAgICAgaWYgKG9wdGlvbnNbX2ldLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZWN0ZWQgJiYgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIERvIG5vdCBzZXQgYHNlbGVjdC52YWx1ZWAgYXMgZXhhY3QgYmVoYXZpb3IgaXNuJ3QgY29uc2lzdGVudCBhY3Jvc3MgYWxsXG4gICAgLy8gYnJvd3NlcnMgZm9yIGFsbCBjYXNlcy5cbiAgICB2YXIgX3NlbGVjdGVkVmFsdWUgPSB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BWYWx1ZSkpO1xuXG4gICAgdmFyIGRlZmF1bHRTZWxlY3RlZCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBvcHRpb25zLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIGlmIChvcHRpb25zW19pMl0udmFsdWUgPT09IF9zZWxlY3RlZFZhbHVlKSB7XG4gICAgICAgIG9wdGlvbnNbX2kyXS5zZWxlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICAgIG9wdGlvbnNbX2kyXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkID09PSBudWxsICYmICFvcHRpb25zW19pMl0uZGlzYWJsZWQpIHtcbiAgICAgICAgZGVmYXVsdFNlbGVjdGVkID0gb3B0aW9uc1tfaTJdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgIT09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRTZWxlY3RlZC5zZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEltcGxlbWVudHMgYSA8c2VsZWN0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBvcHRpb25hbGx5IHNldHRpbmcgdGhlXG4gKiBwcm9wcyBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC4gSWYgYG11bHRpcGxlYCBpcyBmYWxzZSwgdGhlIHByb3AgbXVzdCBiZSBhXG4gKiBzdHJpbmdhYmxlLiBJZiBgbXVsdGlwbGVgIGlzIHRydWUsIHRoZSBwcm9wIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nYWJsZXMuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgY2hhbmdlIHRoZVxuICogc2VsZWN0ZWQgb3B0aW9uIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSByZW5kZXJlZCBvcHRpb25zLlxuICpcbiAqIElmIGl0IGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIG9wdGlvbnMgd2lsbCBub3RcbiAqIHVwZGF0ZSBpbiByZXNwb25zZSB0byB1c2VyIGFjdGlvbnMuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgb3B0aW9ucyB0byB1cGRhdGUuXG4gKlxuICogSWYgYGRlZmF1bHRWYWx1ZWAgaXMgcHJvdmlkZWQsIGFueSBvcHRpb25zIHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlcyB3aWxsIGJlXG4gKiBzZWxlY3RlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHJldHVybiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZFxuICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICB3YXNNdWx0aXBsZTogISFwcm9wcy5tdWx0aXBsZVxuICB9O1xuXG4gIHtcbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEpIHtcbiAgICAgIGVycm9yKCdTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHNlbGVjdCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIG5vZGUubXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdFVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgd2FzTXVsdGlwbGUgPSBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHdhc011bHRpcGxlICE9PSAhIXByb3BzLm11bHRpcGxlKSB7XG4gICAgLy8gRm9yIHNpbXBsaWNpdHksIHJlYXBwbHkgYGRlZmF1bHRWYWx1ZWAgaWYgYG11bHRpcGxlYCBpcyB0b2dnbGVkLlxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXZlcnQgdGhlIHNlbGVjdCBiYWNrIHRvIGl0cyBkZWZhdWx0IHVuc2VsZWN0ZWQgc3RhdGUuXG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLm11bHRpcGxlID8gW10gOiAnJywgZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gZmFsc2U7XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIDx0ZXh0YXJlYT4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyBgdmFsdWVgLCBhbmRcbiAqIGBkZWZhdWx0VmFsdWVgLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdHJhZGl0aW9uYWwgRE9NIEFQSSBiZWNhdXNlIHZhbHVlIGlzXG4gKiB1c3VhbGx5IHNldCBhcyBQQ0RBVEEgY2hpbGRyZW4uXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZVxuICogdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGxcbiAqIG5vdCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBlbXB0eSB2YWx1ZSwgdGhlIHByb3BcbiAqIGBkZWZhdWx0VmFsdWVgIGlmIHNwZWNpZmllZCwgb3IgdGhlIGNoaWxkcmVuIGNvbnRlbnQgKGRlcHJlY2F0ZWQpLlxuICovXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2BkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LicpO1xuICB9IC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudFxuICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rU29waGllIHNlZW1lZCB0byBsaWtlIHRoaXNcbiAgLy8gc29sdXRpb24uIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3MgZm9yY2VkXG4gIC8vIHRvIGJlIGEgc3RyaW5nLlxuXG5cbiAgdmFyIGhvc3RQcm9wcyA9IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoaWxkcmVuOiB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKVxuICB9KTtcblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygndGV4dGFyZWEnLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbERlZmF1bHRWYWwpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhIHRleHRhcmVhIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ1RleHRhcmVhIGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCB0ZXh0YXJlYSAnICsgJ2FuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50Jyk7XG5cbiAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgaW5pdGlhbFZhbHVlID0gcHJvcHMudmFsdWU7IC8vIE9ubHkgYm90aGVyIGZldGNoaW5nIGRlZmF1bHQgdmFsdWUgaWYgd2UncmUgZ29pbmcgdG8gdXNlIGl0XG5cbiAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcblxuICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgaW5zdGVhZCBvZiBzZXR0aW5nICcgKyAnY2hpbGRyZW4gb24gPHRleHRhcmVhPi4nKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lmIHlvdSBzdXBwbHkgYGRlZmF1bHRWYWx1ZWAgb24gYSA8dGV4dGFyZWE+LCBkbyBub3QgcGFzcyBjaGlsZHJlbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJzx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdFZhbHVlID0gY2hpbGRyZW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0VmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICBpbml0aWFsVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKGluaXRpYWxWYWx1ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpO1xuICB2YXIgZGVmYXVsdFZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgLy8gQ2FzdCBgdmFsdWVgIHRvIGEgc3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNvcnJlY3RseS4gV2hpbGVcbiAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRvZXNuJ3QuXG4gICAgdmFyIG5ld1ZhbHVlID0gdG9TdHJpbmcodmFsdWUpOyAvLyBUbyBhdm9pZCBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgbG9zaW5nIHRleHQgc2VsZWN0aW9uKSwgb25seSBzZXQgdmFsdWUgaWYgY2hhbmdlZFxuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICBub2RlLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsICYmIG5vZGUuZGVmYXVsdFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKGRlZmF1bHRWYWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMyhlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7IC8vIFRoaXMgaXMgaW4gcG9zdE1vdW50IGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIERPTSBub2RlLCB3aGljaCBpcyBub3RcbiAgLy8gYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIG1vdW50ZWQuXG5cbiAgdmFyIHRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudDsgLy8gT25seSBzZXQgbm9kZS52YWx1ZSBpZiB0ZXh0Q29udGVudCBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWRcbiAgLy8gaW5pdGlhbCB2YWx1ZS4gSW4gSUUxMC9JRTExIHRoZXJlIGlzIGEgYnVnIHdoZXJlIHRoZSBwbGFjZWhvbGRlciBhdHRyaWJ1dGVcbiAgLy8gd2lsbCBwb3B1bGF0ZSB0ZXh0Q29udGVudCBhcyB3ZWxsLlxuICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMDE1MjUvXG5cbiAgaWYgKHRleHRDb250ZW50ID09PSBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKSB7XG4gICAgaWYgKHRleHRDb250ZW50ICE9PSAnJyAmJiB0ZXh0Q29udGVudCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS52YWx1ZSA9IHRleHRDb250ZW50O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIERPTSBjb21wb25lbnQgaXMgc3RpbGwgbW91bnRlZDsgdXBkYXRlXG4gIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcyk7XG59XG5cbnZhciBIVE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbnZhciBNQVRIX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbnZhciBTVkdfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJzsgLy8gQXNzdW1lcyB0aGVyZSBpcyBubyBwYXJlbnQgbmFtZXNwYWNlLlxuXG5mdW5jdGlvbiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdzdmcnOlxuICAgICAgcmV0dXJuIFNWR19OQU1FU1BBQ0U7XG5cbiAgICBjYXNlICdtYXRoJzpcbiAgICAgIHJldHVybiBNQVRIX05BTUVTUEFDRTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSFRNTF9OQU1FU1BBQ0U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkTmFtZXNwYWNlKHBhcmVudE5hbWVzcGFjZSwgdHlwZSkge1xuICBpZiAocGFyZW50TmFtZXNwYWNlID09IG51bGwgfHwgcGFyZW50TmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIC8vIE5vIChvciBkZWZhdWx0KSBwYXJlbnQgbmFtZXNwYWNlOiBwb3RlbnRpYWwgZW50cnkgcG9pbnQuXG4gICAgcmV0dXJuIGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuXG4gIGlmIChwYXJlbnROYW1lc3BhY2UgPT09IFNWR19OQU1FU1BBQ0UgJiYgdHlwZSA9PT0gJ2ZvcmVpZ25PYmplY3QnKSB7XG4gICAgLy8gV2UncmUgbGVhdmluZyBTVkcuXG4gICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9IC8vIEJ5IGRlZmF1bHQsIHBhc3MgbmFtZXNwYWNlIGJlbG93LlxuXG5cbiAgcmV0dXJuIHBhcmVudE5hbWVzcGFjZTtcbn1cblxuLyogZ2xvYmFscyBNU0FwcCAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIHdoaWNoIGhhcyAndW5zYWZlJyBwcml2aWxlZ2VzIChyZXF1aXJlZCBieSB3aW5kb3dzOCBhcHBzKVxuICovXG52YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gIGlmICh0eXBlb2YgTVNBcHAgIT09ICd1bmRlZmluZWQnICYmIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmdW5jKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnVuYztcbiAgfVxufTtcblxudmFyIHJldXNhYmxlU1ZHQ29udGFpbmVyO1xuLyoqXG4gKiBTZXQgdGhlIGlubmVySFRNTCBwcm9wZXJ0eSBvZiBhIG5vZGVcbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0SW5uZXJIVE1MID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgaHRtbCkge1xuICBpZiAobm9kZS5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcblxuICAgIGlmICghKCdpbm5lckhUTUwnIGluIG5vZGUpKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGlubmVySFRNTCBmb3IgU1ZHIG5vZGVzLCBzbyBpbnN0ZWFkIHdlIGluamVjdCB0aGVcbiAgICAgIC8vIG5ldyBtYXJrdXAgaW4gYSB0ZW1wIG5vZGUgYW5kIHRoZW4gbW92ZSB0aGUgY2hpbGQgbm9kZXMgYWNyb3NzIGludG9cbiAgICAgIC8vIHRoZSB0YXJnZXQgbm9kZVxuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIgPSByZXVzYWJsZVNWR0NvbnRhaW5lciB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyLmlubmVySFRNTCA9ICc8c3ZnPicgKyBodG1sLnZhbHVlT2YoKS50b1N0cmluZygpICsgJzwvc3ZnPic7XG4gICAgICB2YXIgc3ZnTm9kZSA9IHJldXNhYmxlU1ZHQ29udGFpbmVyLmZpcnN0Q2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoc3ZnTm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3ZnTm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG5vZGUuaW5uZXJIVE1MID0gaHRtbDtcbn0pO1xuXG4vKipcbiAqIEhUTUwgbm9kZVR5cGUgdmFsdWVzIHRoYXQgcmVwcmVzZW50IHRoZSB0eXBlIG9mIHRoZSBub2RlXG4gKi9cbnZhciBFTEVNRU5UX05PREUgPSAxO1xudmFyIFRFWFRfTk9ERSA9IDM7XG52YXIgQ09NTUVOVF9OT0RFID0gODtcbnZhciBET0NVTUVOVF9OT0RFID0gOTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFID0gMTE7XG5cbi8qKlxuICogU2V0IHRoZSB0ZXh0Q29udGVudCBwcm9wZXJ0eSBvZiBhIG5vZGUuIEZvciB0ZXh0IHVwZGF0ZXMsIGl0J3MgZmFzdGVyXG4gKiB0byBzZXQgdGhlIGBub2RlVmFsdWVgIG9mIHRoZSBUZXh0IG5vZGUgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZ1xuICogYC50ZXh0Q29udGVudGAgd2hpY2ggd2lsbCByZW1vdmUgdGhlIGV4aXN0aW5nIG5vZGUgYW5kIGNyZWF0ZSBhIG5ldyBvbmUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHtcbiAgaWYgKHRleHQpIHtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblxuICAgIGlmIChmaXJzdENoaWxkICYmIGZpcnN0Q2hpbGQgPT09IG5vZGUubGFzdENoaWxkICYmIGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xufTtcblxuLy8gTGlzdCBkZXJpdmVkIGZyb20gR2Vja28gc291cmNlIGNvZGU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9nZWNrby1kZXYvYmxvYi80ZTYzOGVmYzcxL2xheW91dC9zdHlsZS90ZXN0L3Byb3BlcnR5X2RhdGFiYXNlLmpzXG52YXIgc2hvcnRoYW5kVG9Mb25naGFuZCA9IHtcbiAgYW5pbWF0aW9uOiBbJ2FuaW1hdGlvbkRlbGF5JywgJ2FuaW1hdGlvbkRpcmVjdGlvbicsICdhbmltYXRpb25EdXJhdGlvbicsICdhbmltYXRpb25GaWxsTW9kZScsICdhbmltYXRpb25JdGVyYXRpb25Db3VudCcsICdhbmltYXRpb25OYW1lJywgJ2FuaW1hdGlvblBsYXlTdGF0ZScsICdhbmltYXRpb25UaW1pbmdGdW5jdGlvbiddLFxuICBiYWNrZ3JvdW5kOiBbJ2JhY2tncm91bmRBdHRhY2htZW50JywgJ2JhY2tncm91bmRDbGlwJywgJ2JhY2tncm91bmRDb2xvcicsICdiYWNrZ3JvdW5kSW1hZ2UnLCAnYmFja2dyb3VuZE9yaWdpbicsICdiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknLCAnYmFja2dyb3VuZFJlcGVhdCcsICdiYWNrZ3JvdW5kU2l6ZSddLFxuICBiYWNrZ3JvdW5kUG9zaXRpb246IFsnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJ10sXG4gIGJvcmRlcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnLCAnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tFbmQ6IFsnYm9yZGVyQmxvY2tFbmRDb2xvcicsICdib3JkZXJCbG9ja0VuZFN0eWxlJywgJ2JvcmRlckJsb2NrRW5kV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tTdGFydDogWydib3JkZXJCbG9ja1N0YXJ0Q29sb3InLCAnYm9yZGVyQmxvY2tTdGFydFN0eWxlJywgJ2JvcmRlckJsb2NrU3RhcnRXaWR0aCddLFxuICBib3JkZXJCb3R0b206IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnXSxcbiAgYm9yZGVyQ29sb3I6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyVG9wQ29sb3InXSxcbiAgYm9yZGVySW1hZ2U6IFsnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJ10sXG4gIGJvcmRlcklubGluZUVuZDogWydib3JkZXJJbmxpbmVFbmRDb2xvcicsICdib3JkZXJJbmxpbmVFbmRTdHlsZScsICdib3JkZXJJbmxpbmVFbmRXaWR0aCddLFxuICBib3JkZXJJbmxpbmVTdGFydDogWydib3JkZXJJbmxpbmVTdGFydENvbG9yJywgJ2JvcmRlcklubGluZVN0YXJ0U3R5bGUnLCAnYm9yZGVySW5saW5lU3RhcnRXaWR0aCddLFxuICBib3JkZXJMZWZ0OiBbJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJ10sXG4gIGJvcmRlclJhZGl1czogWydib3JkZXJCb3R0b21MZWZ0UmFkaXVzJywgJ2JvcmRlckJvdHRvbVJpZ2h0UmFkaXVzJywgJ2JvcmRlclRvcExlZnRSYWRpdXMnLCAnYm9yZGVyVG9wUmlnaHRSYWRpdXMnXSxcbiAgYm9yZGVyUmlnaHQ6IFsnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclJpZ2h0V2lkdGgnXSxcbiAgYm9yZGVyU3R5bGU6IFsnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyVG9wU3R5bGUnXSxcbiAgYm9yZGVyVG9wOiBbJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlcldpZHRoOiBbJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGNvbHVtblJ1bGU6IFsnY29sdW1uUnVsZUNvbG9yJywgJ2NvbHVtblJ1bGVTdHlsZScsICdjb2x1bW5SdWxlV2lkdGgnXSxcbiAgY29sdW1uczogWydjb2x1bW5Db3VudCcsICdjb2x1bW5XaWR0aCddLFxuICBmbGV4OiBbJ2ZsZXhCYXNpcycsICdmbGV4R3JvdycsICdmbGV4U2hyaW5rJ10sXG4gIGZsZXhGbG93OiBbJ2ZsZXhEaXJlY3Rpb24nLCAnZmxleFdyYXAnXSxcbiAgZm9udDogWydmb250RmFtaWx5JywgJ2ZvbnRGZWF0dXJlU2V0dGluZ3MnLCAnZm9udEtlcm5pbmcnLCAnZm9udExhbmd1YWdlT3ZlcnJpZGUnLCAnZm9udFNpemUnLCAnZm9udFNpemVBZGp1c3QnLCAnZm9udFN0cmV0Y2gnLCAnZm9udFN0eWxlJywgJ2ZvbnRWYXJpYW50JywgJ2ZvbnRWYXJpYW50QWx0ZXJuYXRlcycsICdmb250VmFyaWFudENhcHMnLCAnZm9udFZhcmlhbnRFYXN0QXNpYW4nLCAnZm9udFZhcmlhbnRMaWdhdHVyZXMnLCAnZm9udFZhcmlhbnROdW1lcmljJywgJ2ZvbnRWYXJpYW50UG9zaXRpb24nLCAnZm9udFdlaWdodCcsICdsaW5lSGVpZ2h0J10sXG4gIGZvbnRWYXJpYW50OiBbJ2ZvbnRWYXJpYW50QWx0ZXJuYXRlcycsICdmb250VmFyaWFudENhcHMnLCAnZm9udFZhcmlhbnRFYXN0QXNpYW4nLCAnZm9udFZhcmlhbnRMaWdhdHVyZXMnLCAnZm9udFZhcmlhbnROdW1lcmljJywgJ2ZvbnRWYXJpYW50UG9zaXRpb24nXSxcbiAgZ2FwOiBbJ2NvbHVtbkdhcCcsICdyb3dHYXAnXSxcbiAgZ3JpZDogWydncmlkQXV0b0NvbHVtbnMnLCAnZ3JpZEF1dG9GbG93JywgJ2dyaWRBdXRvUm93cycsICdncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgZ3JpZEFyZWE6IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnLCAnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZENvbHVtbjogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCddLFxuICBncmlkQ29sdW1uR2FwOiBbJ2NvbHVtbkdhcCddLFxuICBncmlkR2FwOiBbJ2NvbHVtbkdhcCcsICdyb3dHYXAnXSxcbiAgZ3JpZFJvdzogWydncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkUm93R2FwOiBbJ3Jvd0dhcCddLFxuICBncmlkVGVtcGxhdGU6IFsnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGxpc3RTdHlsZTogWydsaXN0U3R5bGVJbWFnZScsICdsaXN0U3R5bGVQb3NpdGlvbicsICdsaXN0U3R5bGVUeXBlJ10sXG4gIG1hcmdpbjogWydtYXJnaW5Cb3R0b20nLCAnbWFyZ2luTGVmdCcsICdtYXJnaW5SaWdodCcsICdtYXJnaW5Ub3AnXSxcbiAgbWFya2VyOiBbJ21hcmtlckVuZCcsICdtYXJrZXJNaWQnLCAnbWFya2VyU3RhcnQnXSxcbiAgbWFzazogWydtYXNrQ2xpcCcsICdtYXNrQ29tcG9zaXRlJywgJ21hc2tJbWFnZScsICdtYXNrTW9kZScsICdtYXNrT3JpZ2luJywgJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWScsICdtYXNrUmVwZWF0JywgJ21hc2tTaXplJ10sXG4gIG1hc2tQb3NpdGlvbjogWydtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknXSxcbiAgb3V0bGluZTogWydvdXRsaW5lQ29sb3InLCAnb3V0bGluZVN0eWxlJywgJ291dGxpbmVXaWR0aCddLFxuICBvdmVyZmxvdzogWydvdmVyZmxvd1gnLCAnb3ZlcmZsb3dZJ10sXG4gIHBhZGRpbmc6IFsncGFkZGluZ0JvdHRvbScsICdwYWRkaW5nTGVmdCcsICdwYWRkaW5nUmlnaHQnLCAncGFkZGluZ1RvcCddLFxuICBwbGFjZUNvbnRlbnQ6IFsnYWxpZ25Db250ZW50JywgJ2p1c3RpZnlDb250ZW50J10sXG4gIHBsYWNlSXRlbXM6IFsnYWxpZ25JdGVtcycsICdqdXN0aWZ5SXRlbXMnXSxcbiAgcGxhY2VTZWxmOiBbJ2FsaWduU2VsZicsICdqdXN0aWZ5U2VsZiddLFxuICB0ZXh0RGVjb3JhdGlvbjogWyd0ZXh0RGVjb3JhdGlvbkNvbG9yJywgJ3RleHREZWNvcmF0aW9uTGluZScsICd0ZXh0RGVjb3JhdGlvblN0eWxlJ10sXG4gIHRleHRFbXBoYXNpczogWyd0ZXh0RW1waGFzaXNDb2xvcicsICd0ZXh0RW1waGFzaXNTdHlsZSddLFxuICB0cmFuc2l0aW9uOiBbJ3RyYW5zaXRpb25EZWxheScsICd0cmFuc2l0aW9uRHVyYXRpb24nLCAndHJhbnNpdGlvblByb3BlcnR5JywgJ3RyYW5zaXRpb25UaW1pbmdGdW5jdGlvbiddLFxuICB3b3JkV3JhcDogWydvdmVyZmxvd1dyYXAnXVxufTtcblxuLyoqXG4gKiBDU1MgcHJvcGVydGllcyB3aGljaCBhY2NlcHQgbnVtYmVycyBidXQgYXJlIG5vdCBpbiB1bml0cyBvZiBcInB4XCIuXG4gKi9cbnZhciBpc1VuaXRsZXNzTnVtYmVyID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYXNwZWN0UmF0aW86IHRydWUsXG4gIGJvcmRlckltYWdlT3V0c2V0OiB0cnVlLFxuICBib3JkZXJJbWFnZVNsaWNlOiB0cnVlLFxuICBib3JkZXJJbWFnZVdpZHRoOiB0cnVlLFxuICBib3hGbGV4OiB0cnVlLFxuICBib3hGbGV4R3JvdXA6IHRydWUsXG4gIGJveE9yZGluYWxHcm91cDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGNvbHVtbnM6IHRydWUsXG4gIGZsZXg6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4UG9zaXRpdmU6IHRydWUsXG4gIGZsZXhTaHJpbms6IHRydWUsXG4gIGZsZXhOZWdhdGl2ZTogdHJ1ZSxcbiAgZmxleE9yZGVyOiB0cnVlLFxuICBncmlkQXJlYTogdHJ1ZSxcbiAgZ3JpZFJvdzogdHJ1ZSxcbiAgZ3JpZFJvd0VuZDogdHJ1ZSxcbiAgZ3JpZFJvd1NwYW46IHRydWUsXG4gIGdyaWRSb3dTdGFydDogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblNwYW46IHRydWUsXG4gIGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcbiAgZm9udFdlaWdodDogdHJ1ZSxcbiAgbGluZUNsYW1wOiB0cnVlLFxuICBsaW5lSGVpZ2h0OiB0cnVlLFxuICBvcGFjaXR5OiB0cnVlLFxuICBvcmRlcjogdHJ1ZSxcbiAgb3JwaGFuczogdHJ1ZSxcbiAgdGFiU2l6ZTogdHJ1ZSxcbiAgd2lkb3dzOiB0cnVlLFxuICB6SW5kZXg6IHRydWUsXG4gIHpvb206IHRydWUsXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IHRydWUsXG4gIGZsb29kT3BhY2l0eTogdHJ1ZSxcbiAgc3RvcE9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZURhc2hhcnJheTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogdHJ1ZSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSxcbiAgc3Ryb2tlT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlV2lkdGg6IHRydWVcbn07XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggdmVuZG9yLXNwZWNpZmljIHByZWZpeCwgZWc6IFdlYmtpdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBzdHlsZSBuYW1lLCBlZzogdHJhbnNpdGlvbkR1cmF0aW9uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHN0eWxlIG5hbWUgcHJlZml4ZWQgd2l0aCBgcHJlZml4YCwgcHJvcGVybHkgY2FtZWxDYXNlZCwgZWc6XG4gKiBXZWJraXRUcmFuc2l0aW9uRHVyYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBwcmVmaXhLZXkocHJlZml4LCBrZXkpIHtcbiAgcmV0dXJuIHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG59XG4vKipcbiAqIFN1cHBvcnQgc3R5bGUgbmFtZXMgdGhhdCBtYXkgY29tZSBwYXNzZWQgaW4gcHJlZml4ZWQgYnkgYWRkaW5nIHBlcm11dGF0aW9uc1xuICogb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG5cblxudmFyIHByZWZpeGVzID0gWydXZWJraXQnLCAnbXMnLCAnTW96JywgJ08nXTsgLy8gVXNpbmcgT2JqZWN0LmtleXMgaGVyZSwgb3IgZWxzZSB0aGUgdmFuaWxsYSBmb3ItaW4gbG9vcCBtYWtlcyBJRTggZ28gaW50byBhblxuLy8gaW5maW5pdGUgbG9vcCwgYmVjYXVzZSBpdCBpdGVyYXRlcyBvdmVyIHRoZSBuZXdseSBhZGRlZCBwcm9wcyB0b28uXG5cbk9iamVjdC5rZXlzKGlzVW5pdGxlc3NOdW1iZXIpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgcHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgaXNVbml0bGVzc051bWJlcltwcmVmaXhLZXkocHJlZml4LCBwcm9wKV0gPSBpc1VuaXRsZXNzTnVtYmVyW3Byb3BdO1xuICB9KTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSB2YWx1ZSBpbnRvIHRoZSBwcm9wZXIgY3NzIHdyaXRhYmxlIHZhbHVlLiBUaGUgc3R5bGUgbmFtZSBgbmFtZWBcbiAqIHNob3VsZCBiZSBsb2dpY2FsIChubyBoeXBoZW5zKSwgYXMgc3BlY2lmaWVkXG4gKiBpbiBgQ1NTUHJvcGVydHkuaXNVbml0bGVzc051bWJlcmAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQ1NTIHByb3BlcnR5IG5hbWUgc3VjaCBhcyBgdG9wTWFyZ2luYC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQ1NTIHByb3BlcnR5IHZhbHVlIHN1Y2ggYXMgYDEwcHhgLlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIHN0eWxlIHZhbHVlIHdpdGggZGltZW5zaW9ucyBhcHBsaWVkLlxuICovXG5cbmZ1bmN0aW9uIGRhbmdlcm91c1N0eWxlVmFsdWUobmFtZSwgdmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgLy8gTm90ZSB0aGF0IHdlJ3ZlIHJlbW92ZWQgZXNjYXBlVGV4dEZvckJyb3dzZXIoKSBjYWxscyBoZXJlIHNpbmNlIHRoZVxuICAvLyB3aG9sZSBzdHJpbmcgd2lsbCBiZSBlc2NhcGVkIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBpbmplY3RlZCBpbnRvXG4gIC8vIHRoZSBtYXJrdXAuIElmIHlvdSBwcm92aWRlIHVuc2FmZSB1c2VyIGRhdGEgaGVyZSB0aGV5IGNhbiBpbmplY3RcbiAgLy8gYXJiaXRyYXJ5IENTUyB3aGljaCBtYXkgYmUgcHJvYmxlbWF0aWMgKEkgY291bGRuJ3QgcmVwcm8gdGhpcyk6XG4gIC8vIGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvWFNTX0ZpbHRlcl9FdmFzaW9uX0NoZWF0X1NoZWV0XG4gIC8vIGh0dHA6Ly93d3cudGhlc3Bhbm5lci5jby51ay8yMDA3LzExLzI2L3VsdGltYXRlLXhzcy1jc3MtaW5qZWN0aW9uL1xuICAvLyBUaGlzIGlzIG5vdCBhbiBYU1MgaG9sZSBidXQgaW5zdGVhZCBhIHBvdGVudGlhbCBDU1MgaW5qZWN0aW9uIGlzc3VlXG4gIC8vIHdoaWNoIGhhcyBsZWFkIHRvIGEgZ3JlYXRlciBkaXNjdXNzaW9uIGFib3V0IGhvdyB3ZSdyZSBnb2luZyB0b1xuICAvLyB0cnVzdCBVUkxzIG1vdmluZyBmb3J3YXJkLiBTZWUgIzIxMTU5MDFcbiAgdmFyIGlzRW1wdHkgPSB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcblxuICBpZiAoaXNFbXB0eSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICghaXNDdXN0b21Qcm9wZXJ0eSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSAwICYmICEoaXNVbml0bGVzc051bWJlci5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBpc1VuaXRsZXNzTnVtYmVyW25hbWVdKSkge1xuICAgIHJldHVybiB2YWx1ZSArICdweCc7IC8vIFByZXN1bWVzIGltcGxpY2l0ICdweCcgc3VmZml4IGZvciB1bml0bGVzcyBudW1iZXJzXG4gIH1cblxuICB7XG4gICAgY2hlY2tDU1NQcm9wZXJ0eVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBuYW1lKTtcbiAgfVxuXG4gIHJldHVybiAoJycgKyB2YWx1ZSkudHJpbSgpO1xufVxuXG52YXIgdXBwZXJjYXNlUGF0dGVybiA9IC8oW0EtWl0pL2c7XG52YXIgbXNQYXR0ZXJuID0gL15tcy0vO1xuLyoqXG4gKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnYmFja2dyb3VuZENvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmQtY29sb3JcIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnTW96VHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbW96LXRyYW5zaXRpb25cIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnbXNUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tcy10cmFuc2l0aW9uXCJcbiAqXG4gKiBBcyBNb2Rlcm5penIgc3VnZ2VzdHMgKGh0dHA6Ly9tb2Rlcm5penIuY29tL2RvY3MvI3ByZWZpeGVkKSwgYW4gYG1zYCBwcmVmaXhcbiAqIGlzIGNvbnZlcnRlZCB0byBgLW1zLWAuXG4gKi9cblxuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZSh1cHBlcmNhc2VQYXR0ZXJuLCAnLSQxJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gJ21zVHJhbnNmb3JtJyBpcyBjb3JyZWN0LCBidXQgdGhlIG90aGVyIHByZWZpeGVzIHNob3VsZCBiZSBjYXBpdGFsaXplZFxuICB2YXIgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vO1xuICB2YXIgbXNQYXR0ZXJuJDEgPSAvXi1tcy0vO1xuICB2YXIgaHlwaGVuUGF0dGVybiA9IC8tKC4pL2c7IC8vIHN0eWxlIHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvblxuXG4gIHZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4gPSAvO1xccyokLztcbiAgdmFyIHdhcm5lZFN0eWxlTmFtZXMgPSB7fTtcbiAgdmFyIHdhcm5lZFN0eWxlVmFsdWVzID0ge307XG4gIHZhciB3YXJuZWRGb3JOYU5WYWx1ZSA9IGZhbHNlO1xuICB2YXIgd2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9IGZhbHNlO1xuXG4gIHZhciBjYW1lbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoaHlwaGVuUGF0dGVybiwgZnVuY3Rpb24gKF8sIGNoYXJhY3Rlcikge1xuICAgICAgcmV0dXJuIGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JywgbmFtZSwgLy8gQXMgQW5kaSBTbWl0aCBzdWdnZXN0c1xuICAgIC8vIChodHRwOi8vd3d3LmFuZGlzbWl0aC5jb20vYmxvZy8yMDEyLzAyL21vZGVybml6ci1wcmVmaXhlZC8pLCBhbiBgLW1zYCBwcmVmaXhcbiAgICAvLyBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGBtc2AuXG4gICAgY2FtZWxpemUobmFtZS5yZXBsYWNlKG1zUGF0dGVybiQxLCAnbXMtJykpKTtcbiAgfTtcblxuICB2YXIgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgdmVuZG9yLXByZWZpeGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JywgbmFtZSwgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSkpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSA9IHRydWU7XG5cbiAgICBlcnJvcihcIlN0eWxlIHByb3BlcnR5IHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvbi4gXCIgKyAnVHJ5IFwiJXM6ICVzXCIgaW5zdGVhZC4nLCBuYW1lLCB2YWx1ZS5yZXBsYWNlKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiwgJycpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc05hTiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRGb3JOYU5WYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvck5hTlZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgTmFOYCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJywgbmFtZSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRGb3JJbmZpbml0eVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9IHRydWU7XG5cbiAgICBlcnJvcignYEluZmluaXR5YCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJywgbmFtZSk7XG4gIH07XG5cbiAgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAobmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24obmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIHdhcm5TdHlsZVZhbHVlSXNOYU4obmFtZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICghaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eShuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUkMSA9IHdhcm5WYWxpZFN0eWxlO1xuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBDU1MgcHJvcGVydGllcy5cbiAqL1xuXG4vKipcbiAqIFRoaXMgY3JlYXRlcyBhIHN0cmluZyB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlIHN0eWxlXG4gKiBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGJ5IHNlcnZlci1zaWRlIHJlbmRlcmluZy4gSXQgYnktcGFzc2VzIHdhcm5pbmdzIGFuZFxuICogc2VjdXJpdHkgY2hlY2tzIHNvIGl0J3Mgbm90IHNhZmUgdG8gdXNlIHRoaXMgdmFsdWUgZm9yIGFueXRoaW5nIG90aGVyIHRoYW5cbiAqIGNvbXBhcmlzb24uIEl0IGlzIG9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURhbmdlcm91c1N0cmluZ0ZvclN0eWxlcyhzdHlsZXMpIHtcbiAge1xuICAgIHZhciBzZXJpYWxpemVkID0gJyc7XG4gICAgdmFyIGRlbGltaXRlciA9ICcnO1xuXG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0eWxlVmFsdWUgPSBzdHlsZXNbc3R5bGVOYW1lXTtcblxuICAgICAgaWYgKHN0eWxlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRlbGltaXRlciArIChpc0N1c3RvbVByb3BlcnR5ID8gc3R5bGVOYW1lIDogaHlwaGVuYXRlU3R5bGVOYW1lKHN0eWxlTmFtZSkpICsgJzonO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KTtcbiAgICAgICAgZGVsaW1pdGVyID0gJzsnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkIHx8IG51bGw7XG4gIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgZm9yIG11bHRpcGxlIHN0eWxlcyBvbiBhIG5vZGUuICBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBhc1xuICogJycgKGVtcHR5IHN0cmluZyksIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IHdpbGwgYmUgdW5zZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gc3R5bGVzXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JTdHlsZXMobm9kZSwgc3R5bGVzKSB7XG4gIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7XG5cbiAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG5cbiAgICB7XG4gICAgICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgICAgd2FyblZhbGlkU3R5bGUkMShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG5cbiAgICBpZiAoc3R5bGVOYW1lID09PSAnZmxvYXQnKSB7XG4gICAgICBzdHlsZU5hbWUgPSAnY3NzRmxvYXQnO1xuICAgIH1cblxuICAgIGlmIChpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShzdHlsZU5hbWUsIHN0eWxlVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZVtzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNWYWx1ZUVtcHR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcbn1cbi8qKlxuICogR2l2ZW4ge2NvbG9yOiAncmVkJywgb3ZlcmZsb3c6ICdoaWRkZW4nfSByZXR1cm5zIHtcbiAqICAgY29sb3I6ICdjb2xvcicsXG4gKiAgIG92ZXJmbG93WDogJ292ZXJmbG93JyxcbiAqICAgb3ZlcmZsb3dZOiAnb3ZlcmZsb3cnLFxuICogfS4gVGhpcyBjYW4gYmUgcmVhZCBhcyBcInRoZSBvdmVyZmxvd1kgcHJvcGVydHkgd2FzIHNldCBieSB0aGUgb3ZlcmZsb3dcbiAqIHNob3J0aGFuZFwiLiBUaGF0IGlzLCB0aGUgdmFsdWVzIGFyZSB0aGUgcHJvcGVydHkgdGhhdCBlYWNoIHdhcyBkZXJpdmVkIGZyb20uXG4gKi9cblxuXG5mdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVzKSB7XG4gIHZhciBleHBhbmRlZCA9IHt9O1xuXG4gIGZvciAodmFyIGtleSBpbiBzdHlsZXMpIHtcbiAgICB2YXIgbG9uZ2hhbmRzID0gc2hvcnRoYW5kVG9Mb25naGFuZFtrZXldIHx8IFtrZXldO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25naGFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4cGFuZGVkW2xvbmdoYW5kc1tpXV0gPSBrZXk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4cGFuZGVkO1xufVxuLyoqXG4gKiBXaGVuIG1peGluZyBzaG9ydGhhbmQgYW5kIGxvbmdoYW5kIHByb3BlcnR5IG5hbWVzLCB3ZSB3YXJuIGR1cmluZyB1cGRhdGVzIGlmXG4gKiB3ZSBleHBlY3QgYW4gaW5jb3JyZWN0IHJlc3VsdCB0byBvY2N1ci4gSW4gcGFydGljdWxhciwgd2Ugd2FybiBmb3I6XG4gKlxuICogVXBkYXRpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgb3ZlcndyaXR0ZW4pOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnQ6ICdiYXonLCBmb250VmFyaWFudDogJ2Jhcid9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnQgPSAnYmF6J1xuICogUmVtb3ZpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgbG9zdCB0b28pOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICcnXG4gKiBSZW1vdmluZyBhIGxvbmdoYW5kIHByb3BlcnR5IChzaG91bGQgcmV2ZXJ0IHRvIHNob3J0aGFuZDsgZG9lc24ndCk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2Zvbyd9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnRWYXJpYW50ID0gJydcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlU2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb25JbkRldihzdHlsZVVwZGF0ZXMsIG5leHRTdHlsZXMpIHtcbiAge1xuICAgIGlmICghbmV4dFN0eWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBleHBhbmRlZFVwZGF0ZXMgPSBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVVcGRhdGVzKTtcbiAgICB2YXIgZXhwYW5kZWRTdHlsZXMgPSBleHBhbmRTaG9ydGhhbmRNYXAobmV4dFN0eWxlcyk7XG4gICAgdmFyIHdhcm5lZEFib3V0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gZXhwYW5kZWRVcGRhdGVzKSB7XG4gICAgICB2YXIgb3JpZ2luYWxLZXkgPSBleHBhbmRlZFVwZGF0ZXNba2V5XTtcbiAgICAgIHZhciBjb3JyZWN0T3JpZ2luYWxLZXkgPSBleHBhbmRlZFN0eWxlc1trZXldO1xuXG4gICAgICBpZiAoY29ycmVjdE9yaWdpbmFsS2V5ICYmIG9yaWdpbmFsS2V5ICE9PSBjb3JyZWN0T3JpZ2luYWxLZXkpIHtcbiAgICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvcmlnaW5hbEtleSArICcsJyArIGNvcnJlY3RPcmlnaW5hbEtleTtcblxuICAgICAgICBpZiAod2FybmVkQWJvdXRbd2FybmluZ0tleV0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdhcm5lZEFib3V0W3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXMgYSBzdHlsZSBwcm9wZXJ0eSBkdXJpbmcgcmVyZW5kZXIgKCVzKSB3aGVuIGEgJyArICdjb25mbGljdGluZyBwcm9wZXJ0eSBpcyBzZXQgKCVzKSBjYW4gbGVhZCB0byBzdHlsaW5nIGJ1Z3MuIFRvICcgKyBcImF2b2lkIHRoaXMsIGRvbid0IG1peCBzaG9ydGhhbmQgYW5kIG5vbi1zaG9ydGhhbmQgcHJvcGVydGllcyBcIiArICdmb3IgdGhlIHNhbWUgdmFsdWU7IGluc3RlYWQsIHJlcGxhY2UgdGhlIHNob3J0aGFuZCB3aXRoICcgKyAnc2VwYXJhdGUgdmFsdWVzLicsIGlzVmFsdWVFbXB0eShzdHlsZVVwZGF0ZXNbb3JpZ2luYWxLZXldKSA/ICdSZW1vdmluZycgOiAnVXBkYXRpbmcnLCBvcmlnaW5hbEtleSwgY29ycmVjdE9yaWdpbmFsS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBzaG91bGQgb21pdCB0aGVpciBjbG9zZSB0YWcuIFdlIGtlZXAgYSBsaXN0IGZvclxuLy8gdGhvc2Ugc3BlY2lhbC1jYXNlIHRhZ3MuXG52YXIgb21pdHRlZENsb3NlVGFncyA9IHtcbiAgYXJlYTogdHJ1ZSxcbiAgYmFzZTogdHJ1ZSxcbiAgYnI6IHRydWUsXG4gIGNvbDogdHJ1ZSxcbiAgZW1iZWQ6IHRydWUsXG4gIGhyOiB0cnVlLFxuICBpbWc6IHRydWUsXG4gIGlucHV0OiB0cnVlLFxuICBrZXlnZW46IHRydWUsXG4gIGxpbms6IHRydWUsXG4gIG1ldGE6IHRydWUsXG4gIHBhcmFtOiB0cnVlLFxuICBzb3VyY2U6IHRydWUsXG4gIHRyYWNrOiB0cnVlLFxuICB3YnI6IHRydWUgLy8gTk9URTogbWVudWl0ZW0ncyBjbG9zZSB0YWcgc2hvdWxkIGJlIG9taXR0ZWQsIGJ1dCB0aGF0IGNhdXNlcyBwcm9ibGVtcy5cblxufTtcblxuLy8gYG9taXR0ZWRDbG9zZVRhZ3NgIGV4Y2VwdCB0aGF0IGBtZW51aXRlbWAgc2hvdWxkIHN0aWxsIGhhdmUgaXRzIGNsb3NpbmcgdGFnLlxuXG52YXIgdm9pZEVsZW1lbnRUYWdzID0gYXNzaWduKHtcbiAgbWVudWl0ZW06IHRydWVcbn0sIG9taXR0ZWRDbG9zZVRhZ3MpO1xuXG52YXIgSFRNTCA9ICdfX2h0bWwnO1xuXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfSAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXG5cbiAgaWYgKHZvaWRFbGVtZW50VGFnc1t0YWddKSB7XG4gICAgaWYgKHByb3BzLmNoaWxkcmVuICE9IG51bGwgfHwgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRhZyArIFwiIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgXCIgKyAndXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICBpZiAocHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBzZXQgb25lIG9mIGBjaGlsZHJlbmAgb3IgYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSAnb2JqZWN0JyB8fCAhKEhUTUwgaW4gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuICcgKyAnUGxlYXNlIHZpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kYW5nZXJvdXNseS1zZXQtaW5uZXItaHRtbCAnICsgJ2ZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoIXByb3BzLnN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyAmJiBwcm9wcy5jb250ZW50RWRpdGFibGUgJiYgcHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGBjb250ZW50RWRpdGFibGVgIGFuZCBjb250YWlucyBgY2hpbGRyZW5gIG1hbmFnZWQgYnkgJyArICdSZWFjdC4gSXQgaXMgbm93IHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZ3VhcmFudGVlIHRoYXQgbm9uZSBvZiAnICsgJ3Rob3NlIG5vZGVzIGFyZSB1bmV4cGVjdGVkbHkgbW9kaWZpZWQgb3IgZHVwbGljYXRlZC4gVGhpcyBpcyAnICsgJ3Byb2JhYmx5IG5vdCBpbnRlbnRpb25hbC4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMuc3R5bGUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcHMuc3R5bGUgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHN0eWxlYCBwcm9wIGV4cGVjdHMgYSBtYXBwaW5nIGZyb20gc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMsICcgKyBcIm5vdCBhIHN0cmluZy4gRm9yIGV4YW1wbGUsIHN0eWxlPXt7bWFyZ2luUmlnaHQ6IHNwYWNpbmcgKyAnZW0nfX0gd2hlbiBcIiArICd1c2luZyBKU1guJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDdXN0b21Db21wb25lbnQodGFnTmFtZSwgcHJvcHMpIHtcbiAgaWYgKHRhZ05hbWUuaW5kZXhPZignLScpID09PSAtMSkge1xuICAgIHJldHVybiB0eXBlb2YgcHJvcHMuaXMgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgLy8gVGhlc2UgYXJlIHJlc2VydmVkIFNWRyBhbmQgTWF0aE1MIGVsZW1lbnRzLlxuICAgIC8vIFdlIGRvbid0IG1pbmQgdGhpcyBsaXN0IHRvbyBtdWNoIGJlY2F1c2Ugd2UgZXhwZWN0IGl0IHRvIG5ldmVyIGdyb3cuXG4gICAgLy8gVGhlIGFsdGVybmF0aXZlIGlzIHRvIHRyYWNrIHRoZSBuYW1lc3BhY2UgaW4gYSBmZXcgcGxhY2VzIHdoaWNoIGlzIGNvbnZvbHV0ZWQuXG4gICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9jdXN0b20vI2N1c3RvbS1lbGVtZW50cy1jb3JlLWNvbmNlcHRzXG4gICAgY2FzZSAnYW5ub3RhdGlvbi14bWwnOlxuICAgIGNhc2UgJ2NvbG9yLXByb2ZpbGUnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlLXNyYyc6XG4gICAgY2FzZSAnZm9udC1mYWNlLXVyaSc6XG4gICAgY2FzZSAnZm9udC1mYWNlLWZvcm1hdCc6XG4gICAgY2FzZSAnZm9udC1mYWNlLW5hbWUnOlxuICAgIGNhc2UgJ21pc3NpbmctZ2x5cGgnOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8vIFdoZW4gYWRkaW5nIGF0dHJpYnV0ZXMgdG8gdGhlIEhUTUwgb3IgU1ZHIGFsbG93ZWQgYXR0cmlidXRlIGxpc3QsIGJlIHN1cmUgdG9cbi8vIGFsc28gYWRkIHRoZW0gdG8gdGhpcyBtb2R1bGUgdG8gZW5zdXJlIGNhc2luZyBhbmQgaW5jb3JyZWN0IG5hbWVcbi8vIHdhcm5pbmdzLlxudmFyIHBvc3NpYmxlU3RhbmRhcmROYW1lcyA9IHtcbiAgLy8gSFRNTFxuICBhY2NlcHQ6ICdhY2NlcHQnLFxuICBhY2NlcHRjaGFyc2V0OiAnYWNjZXB0Q2hhcnNldCcsXG4gICdhY2NlcHQtY2hhcnNldCc6ICdhY2NlcHRDaGFyc2V0JyxcbiAgYWNjZXNza2V5OiAnYWNjZXNzS2V5JyxcbiAgYWN0aW9uOiAnYWN0aW9uJyxcbiAgYWxsb3dmdWxsc2NyZWVuOiAnYWxsb3dGdWxsU2NyZWVuJyxcbiAgYWx0OiAnYWx0JyxcbiAgYXM6ICdhcycsXG4gIGFzeW5jOiAnYXN5bmMnLFxuICBhdXRvY2FwaXRhbGl6ZTogJ2F1dG9DYXBpdGFsaXplJyxcbiAgYXV0b2NvbXBsZXRlOiAnYXV0b0NvbXBsZXRlJyxcbiAgYXV0b2NvcnJlY3Q6ICdhdXRvQ29ycmVjdCcsXG4gIGF1dG9mb2N1czogJ2F1dG9Gb2N1cycsXG4gIGF1dG9wbGF5OiAnYXV0b1BsYXknLFxuICBhdXRvc2F2ZTogJ2F1dG9TYXZlJyxcbiAgY2FwdHVyZTogJ2NhcHR1cmUnLFxuICBjZWxscGFkZGluZzogJ2NlbGxQYWRkaW5nJyxcbiAgY2VsbHNwYWNpbmc6ICdjZWxsU3BhY2luZycsXG4gIGNoYWxsZW5nZTogJ2NoYWxsZW5nZScsXG4gIGNoYXJzZXQ6ICdjaGFyU2V0JyxcbiAgY2hlY2tlZDogJ2NoZWNrZWQnLFxuICBjaGlsZHJlbjogJ2NoaWxkcmVuJyxcbiAgY2l0ZTogJ2NpdGUnLFxuICBjbGFzczogJ2NsYXNzTmFtZScsXG4gIGNsYXNzaWQ6ICdjbGFzc0lEJyxcbiAgY2xhc3NuYW1lOiAnY2xhc3NOYW1lJyxcbiAgY29sczogJ2NvbHMnLFxuICBjb2xzcGFuOiAnY29sU3BhbicsXG4gIGNvbnRlbnQ6ICdjb250ZW50JyxcbiAgY29udGVudGVkaXRhYmxlOiAnY29udGVudEVkaXRhYmxlJyxcbiAgY29udGV4dG1lbnU6ICdjb250ZXh0TWVudScsXG4gIGNvbnRyb2xzOiAnY29udHJvbHMnLFxuICBjb250cm9sc2xpc3Q6ICdjb250cm9sc0xpc3QnLFxuICBjb29yZHM6ICdjb29yZHMnLFxuICBjcm9zc29yaWdpbjogJ2Nyb3NzT3JpZ2luJyxcbiAgZGFuZ2Vyb3VzbHlzZXRpbm5lcmh0bWw6ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcsXG4gIGRhdGE6ICdkYXRhJyxcbiAgZGF0ZXRpbWU6ICdkYXRlVGltZScsXG4gIGRlZmF1bHQ6ICdkZWZhdWx0JyxcbiAgZGVmYXVsdGNoZWNrZWQ6ICdkZWZhdWx0Q2hlY2tlZCcsXG4gIGRlZmF1bHR2YWx1ZTogJ2RlZmF1bHRWYWx1ZScsXG4gIGRlZmVyOiAnZGVmZXInLFxuICBkaXI6ICdkaXInLFxuICBkaXNhYmxlZDogJ2Rpc2FibGVkJyxcbiAgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmU6ICdkaXNhYmxlUGljdHVyZUluUGljdHVyZScsXG4gIGRpc2FibGVyZW1vdGVwbGF5YmFjazogJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsXG4gIGRvd25sb2FkOiAnZG93bmxvYWQnLFxuICBkcmFnZ2FibGU6ICdkcmFnZ2FibGUnLFxuICBlbmN0eXBlOiAnZW5jVHlwZScsXG4gIGVudGVya2V5aGludDogJ2VudGVyS2V5SGludCcsXG4gIGZvcjogJ2h0bWxGb3InLFxuICBmb3JtOiAnZm9ybScsXG4gIGZvcm1tZXRob2Q6ICdmb3JtTWV0aG9kJyxcbiAgZm9ybWFjdGlvbjogJ2Zvcm1BY3Rpb24nLFxuICBmb3JtZW5jdHlwZTogJ2Zvcm1FbmNUeXBlJyxcbiAgZm9ybW5vdmFsaWRhdGU6ICdmb3JtTm9WYWxpZGF0ZScsXG4gIGZvcm10YXJnZXQ6ICdmb3JtVGFyZ2V0JyxcbiAgZnJhbWVib3JkZXI6ICdmcmFtZUJvcmRlcicsXG4gIGhlYWRlcnM6ICdoZWFkZXJzJyxcbiAgaGVpZ2h0OiAnaGVpZ2h0JyxcbiAgaGlkZGVuOiAnaGlkZGVuJyxcbiAgaGlnaDogJ2hpZ2gnLFxuICBocmVmOiAnaHJlZicsXG4gIGhyZWZsYW5nOiAnaHJlZkxhbmcnLFxuICBodG1sZm9yOiAnaHRtbEZvcicsXG4gIGh0dHBlcXVpdjogJ2h0dHBFcXVpdicsXG4gICdodHRwLWVxdWl2JzogJ2h0dHBFcXVpdicsXG4gIGljb246ICdpY29uJyxcbiAgaWQ6ICdpZCcsXG4gIGltYWdlc2l6ZXM6ICdpbWFnZVNpemVzJyxcbiAgaW1hZ2VzcmNzZXQ6ICdpbWFnZVNyY1NldCcsXG4gIGlubmVyaHRtbDogJ2lubmVySFRNTCcsXG4gIGlucHV0bW9kZTogJ2lucHV0TW9kZScsXG4gIGludGVncml0eTogJ2ludGVncml0eScsXG4gIGlzOiAnaXMnLFxuICBpdGVtaWQ6ICdpdGVtSUQnLFxuICBpdGVtcHJvcDogJ2l0ZW1Qcm9wJyxcbiAgaXRlbXJlZjogJ2l0ZW1SZWYnLFxuICBpdGVtc2NvcGU6ICdpdGVtU2NvcGUnLFxuICBpdGVtdHlwZTogJ2l0ZW1UeXBlJyxcbiAga2V5cGFyYW1zOiAna2V5UGFyYW1zJyxcbiAga2V5dHlwZTogJ2tleVR5cGUnLFxuICBraW5kOiAna2luZCcsXG4gIGxhYmVsOiAnbGFiZWwnLFxuICBsYW5nOiAnbGFuZycsXG4gIGxpc3Q6ICdsaXN0JyxcbiAgbG9vcDogJ2xvb3AnLFxuICBsb3c6ICdsb3cnLFxuICBtYW5pZmVzdDogJ21hbmlmZXN0JyxcbiAgbWFyZ2lud2lkdGg6ICdtYXJnaW5XaWR0aCcsXG4gIG1hcmdpbmhlaWdodDogJ21hcmdpbkhlaWdodCcsXG4gIG1heDogJ21heCcsXG4gIG1heGxlbmd0aDogJ21heExlbmd0aCcsXG4gIG1lZGlhOiAnbWVkaWEnLFxuICBtZWRpYWdyb3VwOiAnbWVkaWFHcm91cCcsXG4gIG1ldGhvZDogJ21ldGhvZCcsXG4gIG1pbjogJ21pbicsXG4gIG1pbmxlbmd0aDogJ21pbkxlbmd0aCcsXG4gIG11bHRpcGxlOiAnbXVsdGlwbGUnLFxuICBtdXRlZDogJ211dGVkJyxcbiAgbmFtZTogJ25hbWUnLFxuICBub21vZHVsZTogJ25vTW9kdWxlJyxcbiAgbm9uY2U6ICdub25jZScsXG4gIG5vdmFsaWRhdGU6ICdub1ZhbGlkYXRlJyxcbiAgb3BlbjogJ29wZW4nLFxuICBvcHRpbXVtOiAnb3B0aW11bScsXG4gIHBhdHRlcm46ICdwYXR0ZXJuJyxcbiAgcGxhY2Vob2xkZXI6ICdwbGFjZWhvbGRlcicsXG4gIHBsYXlzaW5saW5lOiAncGxheXNJbmxpbmUnLFxuICBwb3N0ZXI6ICdwb3N0ZXInLFxuICBwcmVsb2FkOiAncHJlbG9hZCcsXG4gIHByb2ZpbGU6ICdwcm9maWxlJyxcbiAgcmFkaW9ncm91cDogJ3JhZGlvR3JvdXAnLFxuICByZWFkb25seTogJ3JlYWRPbmx5JyxcbiAgcmVmZXJyZXJwb2xpY3k6ICdyZWZlcnJlclBvbGljeScsXG4gIHJlbDogJ3JlbCcsXG4gIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICByZXZlcnNlZDogJ3JldmVyc2VkJyxcbiAgcm9sZTogJ3JvbGUnLFxuICByb3dzOiAncm93cycsXG4gIHJvd3NwYW46ICdyb3dTcGFuJyxcbiAgc2FuZGJveDogJ3NhbmRib3gnLFxuICBzY29wZTogJ3Njb3BlJyxcbiAgc2NvcGVkOiAnc2NvcGVkJyxcbiAgc2Nyb2xsaW5nOiAnc2Nyb2xsaW5nJyxcbiAgc2VhbWxlc3M6ICdzZWFtbGVzcycsXG4gIHNlbGVjdGVkOiAnc2VsZWN0ZWQnLFxuICBzaGFwZTogJ3NoYXBlJyxcbiAgc2l6ZTogJ3NpemUnLFxuICBzaXplczogJ3NpemVzJyxcbiAgc3BhbjogJ3NwYW4nLFxuICBzcGVsbGNoZWNrOiAnc3BlbGxDaGVjaycsXG4gIHNyYzogJ3NyYycsXG4gIHNyY2RvYzogJ3NyY0RvYycsXG4gIHNyY2xhbmc6ICdzcmNMYW5nJyxcbiAgc3Jjc2V0OiAnc3JjU2V0JyxcbiAgc3RhcnQ6ICdzdGFydCcsXG4gIHN0ZXA6ICdzdGVwJyxcbiAgc3R5bGU6ICdzdHlsZScsXG4gIHN1bW1hcnk6ICdzdW1tYXJ5JyxcbiAgdGFiaW5kZXg6ICd0YWJJbmRleCcsXG4gIHRhcmdldDogJ3RhcmdldCcsXG4gIHRpdGxlOiAndGl0bGUnLFxuICB0eXBlOiAndHlwZScsXG4gIHVzZW1hcDogJ3VzZU1hcCcsXG4gIHZhbHVlOiAndmFsdWUnLFxuICB3aWR0aDogJ3dpZHRoJyxcbiAgd21vZGU6ICd3bW9kZScsXG4gIHdyYXA6ICd3cmFwJyxcbiAgLy8gU1ZHXG4gIGFib3V0OiAnYWJvdXQnLFxuICBhY2NlbnRoZWlnaHQ6ICdhY2NlbnRIZWlnaHQnLFxuICAnYWNjZW50LWhlaWdodCc6ICdhY2NlbnRIZWlnaHQnLFxuICBhY2N1bXVsYXRlOiAnYWNjdW11bGF0ZScsXG4gIGFkZGl0aXZlOiAnYWRkaXRpdmUnLFxuICBhbGlnbm1lbnRiYXNlbGluZTogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgJ2FsaWdubWVudC1iYXNlbGluZSc6ICdhbGlnbm1lbnRCYXNlbGluZScsXG4gIGFsbG93cmVvcmRlcjogJ2FsbG93UmVvcmRlcicsXG4gIGFscGhhYmV0aWM6ICdhbHBoYWJldGljJyxcbiAgYW1wbGl0dWRlOiAnYW1wbGl0dWRlJyxcbiAgYXJhYmljZm9ybTogJ2FyYWJpY0Zvcm0nLFxuICAnYXJhYmljLWZvcm0nOiAnYXJhYmljRm9ybScsXG4gIGFzY2VudDogJ2FzY2VudCcsXG4gIGF0dHJpYnV0ZW5hbWU6ICdhdHRyaWJ1dGVOYW1lJyxcbiAgYXR0cmlidXRldHlwZTogJ2F0dHJpYnV0ZVR5cGUnLFxuICBhdXRvcmV2ZXJzZTogJ2F1dG9SZXZlcnNlJyxcbiAgYXppbXV0aDogJ2F6aW11dGgnLFxuICBiYXNlZnJlcXVlbmN5OiAnYmFzZUZyZXF1ZW5jeScsXG4gIGJhc2VsaW5lc2hpZnQ6ICdiYXNlbGluZVNoaWZ0JyxcbiAgJ2Jhc2VsaW5lLXNoaWZ0JzogJ2Jhc2VsaW5lU2hpZnQnLFxuICBiYXNlcHJvZmlsZTogJ2Jhc2VQcm9maWxlJyxcbiAgYmJveDogJ2Jib3gnLFxuICBiZWdpbjogJ2JlZ2luJyxcbiAgYmlhczogJ2JpYXMnLFxuICBieTogJ2J5JyxcbiAgY2FsY21vZGU6ICdjYWxjTW9kZScsXG4gIGNhcGhlaWdodDogJ2NhcEhlaWdodCcsXG4gICdjYXAtaGVpZ2h0JzogJ2NhcEhlaWdodCcsXG4gIGNsaXA6ICdjbGlwJyxcbiAgY2xpcHBhdGg6ICdjbGlwUGF0aCcsXG4gICdjbGlwLXBhdGgnOiAnY2xpcFBhdGgnLFxuICBjbGlwcGF0aHVuaXRzOiAnY2xpcFBhdGhVbml0cycsXG4gIGNsaXBydWxlOiAnY2xpcFJ1bGUnLFxuICAnY2xpcC1ydWxlJzogJ2NsaXBSdWxlJyxcbiAgY29sb3I6ICdjb2xvcicsXG4gIGNvbG9yaW50ZXJwb2xhdGlvbjogJ2NvbG9ySW50ZXJwb2xhdGlvbicsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uJzogJ2NvbG9ySW50ZXJwb2xhdGlvbicsXG4gIGNvbG9yaW50ZXJwb2xhdGlvbmZpbHRlcnM6ICdjb2xvckludGVycG9sYXRpb25GaWx0ZXJzJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyc6ICdjb2xvckludGVycG9sYXRpb25GaWx0ZXJzJyxcbiAgY29sb3Jwcm9maWxlOiAnY29sb3JQcm9maWxlJyxcbiAgJ2NvbG9yLXByb2ZpbGUnOiAnY29sb3JQcm9maWxlJyxcbiAgY29sb3JyZW5kZXJpbmc6ICdjb2xvclJlbmRlcmluZycsXG4gICdjb2xvci1yZW5kZXJpbmcnOiAnY29sb3JSZW5kZXJpbmcnLFxuICBjb250ZW50c2NyaXB0dHlwZTogJ2NvbnRlbnRTY3JpcHRUeXBlJyxcbiAgY29udGVudHN0eWxldHlwZTogJ2NvbnRlbnRTdHlsZVR5cGUnLFxuICBjdXJzb3I6ICdjdXJzb3InLFxuICBjeDogJ2N4JyxcbiAgY3k6ICdjeScsXG4gIGQ6ICdkJyxcbiAgZGF0YXR5cGU6ICdkYXRhdHlwZScsXG4gIGRlY2VsZXJhdGU6ICdkZWNlbGVyYXRlJyxcbiAgZGVzY2VudDogJ2Rlc2NlbnQnLFxuICBkaWZmdXNlY29uc3RhbnQ6ICdkaWZmdXNlQ29uc3RhbnQnLFxuICBkaXJlY3Rpb246ICdkaXJlY3Rpb24nLFxuICBkaXNwbGF5OiAnZGlzcGxheScsXG4gIGRpdmlzb3I6ICdkaXZpc29yJyxcbiAgZG9taW5hbnRiYXNlbGluZTogJ2RvbWluYW50QmFzZWxpbmUnLFxuICAnZG9taW5hbnQtYmFzZWxpbmUnOiAnZG9taW5hbnRCYXNlbGluZScsXG4gIGR1cjogJ2R1cicsXG4gIGR4OiAnZHgnLFxuICBkeTogJ2R5JyxcbiAgZWRnZW1vZGU6ICdlZGdlTW9kZScsXG4gIGVsZXZhdGlvbjogJ2VsZXZhdGlvbicsXG4gIGVuYWJsZWJhY2tncm91bmQ6ICdlbmFibGVCYWNrZ3JvdW5kJyxcbiAgJ2VuYWJsZS1iYWNrZ3JvdW5kJzogJ2VuYWJsZUJhY2tncm91bmQnLFxuICBlbmQ6ICdlbmQnLFxuICBleHBvbmVudDogJ2V4cG9uZW50JyxcbiAgZXh0ZXJuYWxyZXNvdXJjZXNyZXF1aXJlZDogJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICBmaWxsOiAnZmlsbCcsXG4gIGZpbGxvcGFjaXR5OiAnZmlsbE9wYWNpdHknLFxuICAnZmlsbC1vcGFjaXR5JzogJ2ZpbGxPcGFjaXR5JyxcbiAgZmlsbHJ1bGU6ICdmaWxsUnVsZScsXG4gICdmaWxsLXJ1bGUnOiAnZmlsbFJ1bGUnLFxuICBmaWx0ZXI6ICdmaWx0ZXInLFxuICBmaWx0ZXJyZXM6ICdmaWx0ZXJSZXMnLFxuICBmaWx0ZXJ1bml0czogJ2ZpbHRlclVuaXRzJyxcbiAgZmxvb2RvcGFjaXR5OiAnZmxvb2RPcGFjaXR5JyxcbiAgJ2Zsb29kLW9wYWNpdHknOiAnZmxvb2RPcGFjaXR5JyxcbiAgZmxvb2Rjb2xvcjogJ2Zsb29kQ29sb3InLFxuICAnZmxvb2QtY29sb3InOiAnZmxvb2RDb2xvcicsXG4gIGZvY3VzYWJsZTogJ2ZvY3VzYWJsZScsXG4gIGZvbnRmYW1pbHk6ICdmb250RmFtaWx5JyxcbiAgJ2ZvbnQtZmFtaWx5JzogJ2ZvbnRGYW1pbHknLFxuICBmb250c2l6ZTogJ2ZvbnRTaXplJyxcbiAgJ2ZvbnQtc2l6ZSc6ICdmb250U2l6ZScsXG4gIGZvbnRzaXplYWRqdXN0OiAnZm9udFNpemVBZGp1c3QnLFxuICAnZm9udC1zaXplLWFkanVzdCc6ICdmb250U2l6ZUFkanVzdCcsXG4gIGZvbnRzdHJldGNoOiAnZm9udFN0cmV0Y2gnLFxuICAnZm9udC1zdHJldGNoJzogJ2ZvbnRTdHJldGNoJyxcbiAgZm9udHN0eWxlOiAnZm9udFN0eWxlJyxcbiAgJ2ZvbnQtc3R5bGUnOiAnZm9udFN0eWxlJyxcbiAgZm9udHZhcmlhbnQ6ICdmb250VmFyaWFudCcsXG4gICdmb250LXZhcmlhbnQnOiAnZm9udFZhcmlhbnQnLFxuICBmb250d2VpZ2h0OiAnZm9udFdlaWdodCcsXG4gICdmb250LXdlaWdodCc6ICdmb250V2VpZ2h0JyxcbiAgZm9ybWF0OiAnZm9ybWF0JyxcbiAgZnJvbTogJ2Zyb20nLFxuICBmeDogJ2Z4JyxcbiAgZnk6ICdmeScsXG4gIGcxOiAnZzEnLFxuICBnMjogJ2cyJyxcbiAgZ2x5cGhuYW1lOiAnZ2x5cGhOYW1lJyxcbiAgJ2dseXBoLW5hbWUnOiAnZ2x5cGhOYW1lJyxcbiAgZ2x5cGhvcmllbnRhdGlvbmhvcml6b250YWw6ICdnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCcsXG4gICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJzogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgZ2x5cGhvcmllbnRhdGlvbnZlcnRpY2FsOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJzogJ2dseXBoT3JpZW50YXRpb25WZXJ0aWNhbCcsXG4gIGdseXBocmVmOiAnZ2x5cGhSZWYnLFxuICBncmFkaWVudHRyYW5zZm9ybTogJ2dyYWRpZW50VHJhbnNmb3JtJyxcbiAgZ3JhZGllbnR1bml0czogJ2dyYWRpZW50VW5pdHMnLFxuICBoYW5naW5nOiAnaGFuZ2luZycsXG4gIGhvcml6YWR2eDogJ2hvcml6QWR2WCcsXG4gICdob3Jpei1hZHYteCc6ICdob3JpekFkdlgnLFxuICBob3Jpem9yaWdpbng6ICdob3Jpek9yaWdpblgnLFxuICAnaG9yaXotb3JpZ2luLXgnOiAnaG9yaXpPcmlnaW5YJyxcbiAgaWRlb2dyYXBoaWM6ICdpZGVvZ3JhcGhpYycsXG4gIGltYWdlcmVuZGVyaW5nOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICAnaW1hZ2UtcmVuZGVyaW5nJzogJ2ltYWdlUmVuZGVyaW5nJyxcbiAgaW4yOiAnaW4yJyxcbiAgaW46ICdpbicsXG4gIGlubGlzdDogJ2lubGlzdCcsXG4gIGludGVyY2VwdDogJ2ludGVyY2VwdCcsXG4gIGsxOiAnazEnLFxuICBrMjogJ2syJyxcbiAgazM6ICdrMycsXG4gIGs0OiAnazQnLFxuICBrOiAnaycsXG4gIGtlcm5lbG1hdHJpeDogJ2tlcm5lbE1hdHJpeCcsXG4gIGtlcm5lbHVuaXRsZW5ndGg6ICdrZXJuZWxVbml0TGVuZ3RoJyxcbiAga2VybmluZzogJ2tlcm5pbmcnLFxuICBrZXlwb2ludHM6ICdrZXlQb2ludHMnLFxuICBrZXlzcGxpbmVzOiAna2V5U3BsaW5lcycsXG4gIGtleXRpbWVzOiAna2V5VGltZXMnLFxuICBsZW5ndGhhZGp1c3Q6ICdsZW5ndGhBZGp1c3QnLFxuICBsZXR0ZXJzcGFjaW5nOiAnbGV0dGVyU3BhY2luZycsXG4gICdsZXR0ZXItc3BhY2luZyc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgbGlnaHRpbmdjb2xvcjogJ2xpZ2h0aW5nQ29sb3InLFxuICAnbGlnaHRpbmctY29sb3InOiAnbGlnaHRpbmdDb2xvcicsXG4gIGxpbWl0aW5nY29uZWFuZ2xlOiAnbGltaXRpbmdDb25lQW5nbGUnLFxuICBsb2NhbDogJ2xvY2FsJyxcbiAgbWFya2VyZW5kOiAnbWFya2VyRW5kJyxcbiAgJ21hcmtlci1lbmQnOiAnbWFya2VyRW5kJyxcbiAgbWFya2VyaGVpZ2h0OiAnbWFya2VySGVpZ2h0JyxcbiAgbWFya2VybWlkOiAnbWFya2VyTWlkJyxcbiAgJ21hcmtlci1taWQnOiAnbWFya2VyTWlkJyxcbiAgbWFya2Vyc3RhcnQ6ICdtYXJrZXJTdGFydCcsXG4gICdtYXJrZXItc3RhcnQnOiAnbWFya2VyU3RhcnQnLFxuICBtYXJrZXJ1bml0czogJ21hcmtlclVuaXRzJyxcbiAgbWFya2Vyd2lkdGg6ICdtYXJrZXJXaWR0aCcsXG4gIG1hc2s6ICdtYXNrJyxcbiAgbWFza2NvbnRlbnR1bml0czogJ21hc2tDb250ZW50VW5pdHMnLFxuICBtYXNrdW5pdHM6ICdtYXNrVW5pdHMnLFxuICBtYXRoZW1hdGljYWw6ICdtYXRoZW1hdGljYWwnLFxuICBtb2RlOiAnbW9kZScsXG4gIG51bW9jdGF2ZXM6ICdudW1PY3RhdmVzJyxcbiAgb2Zmc2V0OiAnb2Zmc2V0JyxcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBvcGVyYXRvcjogJ29wZXJhdG9yJyxcbiAgb3JkZXI6ICdvcmRlcicsXG4gIG9yaWVudDogJ29yaWVudCcsXG4gIG9yaWVudGF0aW9uOiAnb3JpZW50YXRpb24nLFxuICBvcmlnaW46ICdvcmlnaW4nLFxuICBvdmVyZmxvdzogJ292ZXJmbG93JyxcbiAgb3ZlcmxpbmVwb3NpdGlvbjogJ292ZXJsaW5lUG9zaXRpb24nLFxuICAnb3ZlcmxpbmUtcG9zaXRpb24nOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gIG92ZXJsaW5ldGhpY2tuZXNzOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICAnb3ZlcmxpbmUtdGhpY2tuZXNzJzogJ292ZXJsaW5lVGhpY2tuZXNzJyxcbiAgcGFpbnRvcmRlcjogJ3BhaW50T3JkZXInLFxuICAncGFpbnQtb3JkZXInOiAncGFpbnRPcmRlcicsXG4gIHBhbm9zZTE6ICdwYW5vc2UxJyxcbiAgJ3Bhbm9zZS0xJzogJ3Bhbm9zZTEnLFxuICBwYXRobGVuZ3RoOiAncGF0aExlbmd0aCcsXG4gIHBhdHRlcm5jb250ZW50dW5pdHM6ICdwYXR0ZXJuQ29udGVudFVuaXRzJyxcbiAgcGF0dGVybnRyYW5zZm9ybTogJ3BhdHRlcm5UcmFuc2Zvcm0nLFxuICBwYXR0ZXJudW5pdHM6ICdwYXR0ZXJuVW5pdHMnLFxuICBwb2ludGVyZXZlbnRzOiAncG9pbnRlckV2ZW50cycsXG4gICdwb2ludGVyLWV2ZW50cyc6ICdwb2ludGVyRXZlbnRzJyxcbiAgcG9pbnRzOiAncG9pbnRzJyxcbiAgcG9pbnRzYXR4OiAncG9pbnRzQXRYJyxcbiAgcG9pbnRzYXR5OiAncG9pbnRzQXRZJyxcbiAgcG9pbnRzYXR6OiAncG9pbnRzQXRaJyxcbiAgcHJlZml4OiAncHJlZml4JyxcbiAgcHJlc2VydmVhbHBoYTogJ3ByZXNlcnZlQWxwaGEnLFxuICBwcmVzZXJ2ZWFzcGVjdHJhdGlvOiAncHJlc2VydmVBc3BlY3RSYXRpbycsXG4gIHByaW1pdGl2ZXVuaXRzOiAncHJpbWl0aXZlVW5pdHMnLFxuICBwcm9wZXJ0eTogJ3Byb3BlcnR5JyxcbiAgcjogJ3InLFxuICByYWRpdXM6ICdyYWRpdXMnLFxuICByZWZ4OiAncmVmWCcsXG4gIHJlZnk6ICdyZWZZJyxcbiAgcmVuZGVyaW5naW50ZW50OiAncmVuZGVyaW5nSW50ZW50JyxcbiAgJ3JlbmRlcmluZy1pbnRlbnQnOiAncmVuZGVyaW5nSW50ZW50JyxcbiAgcmVwZWF0Y291bnQ6ICdyZXBlYXRDb3VudCcsXG4gIHJlcGVhdGR1cjogJ3JlcGVhdER1cicsXG4gIHJlcXVpcmVkZXh0ZW5zaW9uczogJ3JlcXVpcmVkRXh0ZW5zaW9ucycsXG4gIHJlcXVpcmVkZmVhdHVyZXM6ICdyZXF1aXJlZEZlYXR1cmVzJyxcbiAgcmVzb3VyY2U6ICdyZXNvdXJjZScsXG4gIHJlc3RhcnQ6ICdyZXN0YXJ0JyxcbiAgcmVzdWx0OiAncmVzdWx0JyxcbiAgcmVzdWx0czogJ3Jlc3VsdHMnLFxuICByb3RhdGU6ICdyb3RhdGUnLFxuICByeDogJ3J4JyxcbiAgcnk6ICdyeScsXG4gIHNjYWxlOiAnc2NhbGUnLFxuICBzZWN1cml0eTogJ3NlY3VyaXR5JyxcbiAgc2VlZDogJ3NlZWQnLFxuICBzaGFwZXJlbmRlcmluZzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgJ3NoYXBlLXJlbmRlcmluZyc6ICdzaGFwZVJlbmRlcmluZycsXG4gIHNsb3BlOiAnc2xvcGUnLFxuICBzcGFjaW5nOiAnc3BhY2luZycsXG4gIHNwZWN1bGFyY29uc3RhbnQ6ICdzcGVjdWxhckNvbnN0YW50JyxcbiAgc3BlY3VsYXJleHBvbmVudDogJ3NwZWN1bGFyRXhwb25lbnQnLFxuICBzcGVlZDogJ3NwZWVkJyxcbiAgc3ByZWFkbWV0aG9kOiAnc3ByZWFkTWV0aG9kJyxcbiAgc3RhcnRvZmZzZXQ6ICdzdGFydE9mZnNldCcsXG4gIHN0ZGRldmlhdGlvbjogJ3N0ZERldmlhdGlvbicsXG4gIHN0ZW1oOiAnc3RlbWgnLFxuICBzdGVtdjogJ3N0ZW12JyxcbiAgc3RpdGNodGlsZXM6ICdzdGl0Y2hUaWxlcycsXG4gIHN0b3Bjb2xvcjogJ3N0b3BDb2xvcicsXG4gICdzdG9wLWNvbG9yJzogJ3N0b3BDb2xvcicsXG4gIHN0b3BvcGFjaXR5OiAnc3RvcE9wYWNpdHknLFxuICAnc3RvcC1vcGFjaXR5JzogJ3N0b3BPcGFjaXR5JyxcbiAgc3RyaWtldGhyb3VnaHBvc2l0aW9uOiAnc3RyaWtldGhyb3VnaFBvc2l0aW9uJyxcbiAgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nOiAnc3RyaWtldGhyb3VnaFBvc2l0aW9uJyxcbiAgc3RyaWtldGhyb3VnaHRoaWNrbmVzczogJ3N0cmlrZXRocm91Z2hUaGlja25lc3MnLFxuICAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gIHN0cmluZzogJ3N0cmluZycsXG4gIHN0cm9rZTogJ3N0cm9rZScsXG4gIHN0cm9rZWRhc2hhcnJheTogJ3N0cm9rZURhc2hhcnJheScsXG4gICdzdHJva2UtZGFzaGFycmF5JzogJ3N0cm9rZURhc2hhcnJheScsXG4gIHN0cm9rZWRhc2hvZmZzZXQ6ICdzdHJva2VEYXNob2Zmc2V0JyxcbiAgJ3N0cm9rZS1kYXNob2Zmc2V0JzogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICBzdHJva2VsaW5lY2FwOiAnc3Ryb2tlTGluZWNhcCcsXG4gICdzdHJva2UtbGluZWNhcCc6ICdzdHJva2VMaW5lY2FwJyxcbiAgc3Ryb2tlbGluZWpvaW46ICdzdHJva2VMaW5lam9pbicsXG4gICdzdHJva2UtbGluZWpvaW4nOiAnc3Ryb2tlTGluZWpvaW4nLFxuICBzdHJva2VtaXRlcmxpbWl0OiAnc3Ryb2tlTWl0ZXJsaW1pdCcsXG4gICdzdHJva2UtbWl0ZXJsaW1pdCc6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgc3Ryb2tld2lkdGg6ICdzdHJva2VXaWR0aCcsXG4gICdzdHJva2Utd2lkdGgnOiAnc3Ryb2tlV2lkdGgnLFxuICBzdHJva2VvcGFjaXR5OiAnc3Ryb2tlT3BhY2l0eScsXG4gICdzdHJva2Utb3BhY2l0eSc6ICdzdHJva2VPcGFjaXR5JyxcbiAgc3VwcHJlc3Njb250ZW50ZWRpdGFibGV3YXJuaW5nOiAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJyxcbiAgc3VwcHJlc3NoeWRyYXRpb253YXJuaW5nOiAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJyxcbiAgc3VyZmFjZXNjYWxlOiAnc3VyZmFjZVNjYWxlJyxcbiAgc3lzdGVtbGFuZ3VhZ2U6ICdzeXN0ZW1MYW5ndWFnZScsXG4gIHRhYmxldmFsdWVzOiAndGFibGVWYWx1ZXMnLFxuICB0YXJnZXR4OiAndGFyZ2V0WCcsXG4gIHRhcmdldHk6ICd0YXJnZXRZJyxcbiAgdGV4dGFuY2hvcjogJ3RleHRBbmNob3InLFxuICAndGV4dC1hbmNob3InOiAndGV4dEFuY2hvcicsXG4gIHRleHRkZWNvcmF0aW9uOiAndGV4dERlY29yYXRpb24nLFxuICAndGV4dC1kZWNvcmF0aW9uJzogJ3RleHREZWNvcmF0aW9uJyxcbiAgdGV4dGxlbmd0aDogJ3RleHRMZW5ndGgnLFxuICB0ZXh0cmVuZGVyaW5nOiAndGV4dFJlbmRlcmluZycsXG4gICd0ZXh0LXJlbmRlcmluZyc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgdG86ICd0bycsXG4gIHRyYW5zZm9ybTogJ3RyYW5zZm9ybScsXG4gIHR5cGVvZjogJ3R5cGVvZicsXG4gIHUxOiAndTEnLFxuICB1MjogJ3UyJyxcbiAgdW5kZXJsaW5lcG9zaXRpb246ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gICd1bmRlcmxpbmUtcG9zaXRpb24nOiAndW5kZXJsaW5lUG9zaXRpb24nLFxuICB1bmRlcmxpbmV0aGlja25lc3M6ICd1bmRlcmxpbmVUaGlja25lc3MnLFxuICAndW5kZXJsaW5lLXRoaWNrbmVzcyc6ICd1bmRlcmxpbmVUaGlja25lc3MnLFxuICB1bmljb2RlOiAndW5pY29kZScsXG4gIHVuaWNvZGViaWRpOiAndW5pY29kZUJpZGknLFxuICAndW5pY29kZS1iaWRpJzogJ3VuaWNvZGVCaWRpJyxcbiAgdW5pY29kZXJhbmdlOiAndW5pY29kZVJhbmdlJyxcbiAgJ3VuaWNvZGUtcmFuZ2UnOiAndW5pY29kZVJhbmdlJyxcbiAgdW5pdHNwZXJlbTogJ3VuaXRzUGVyRW0nLFxuICAndW5pdHMtcGVyLWVtJzogJ3VuaXRzUGVyRW0nLFxuICB1bnNlbGVjdGFibGU6ICd1bnNlbGVjdGFibGUnLFxuICB2YWxwaGFiZXRpYzogJ3ZBbHBoYWJldGljJyxcbiAgJ3YtYWxwaGFiZXRpYyc6ICd2QWxwaGFiZXRpYycsXG4gIHZhbHVlczogJ3ZhbHVlcycsXG4gIHZlY3RvcmVmZmVjdDogJ3ZlY3RvckVmZmVjdCcsXG4gICd2ZWN0b3ItZWZmZWN0JzogJ3ZlY3RvckVmZmVjdCcsXG4gIHZlcnNpb246ICd2ZXJzaW9uJyxcbiAgdmVydGFkdnk6ICd2ZXJ0QWR2WScsXG4gICd2ZXJ0LWFkdi15JzogJ3ZlcnRBZHZZJyxcbiAgdmVydG9yaWdpbng6ICd2ZXJ0T3JpZ2luWCcsXG4gICd2ZXJ0LW9yaWdpbi14JzogJ3ZlcnRPcmlnaW5YJyxcbiAgdmVydG9yaWdpbnk6ICd2ZXJ0T3JpZ2luWScsXG4gICd2ZXJ0LW9yaWdpbi15JzogJ3ZlcnRPcmlnaW5ZJyxcbiAgdmhhbmdpbmc6ICd2SGFuZ2luZycsXG4gICd2LWhhbmdpbmcnOiAndkhhbmdpbmcnLFxuICB2aWRlb2dyYXBoaWM6ICd2SWRlb2dyYXBoaWMnLFxuICAndi1pZGVvZ3JhcGhpYyc6ICd2SWRlb2dyYXBoaWMnLFxuICB2aWV3Ym94OiAndmlld0JveCcsXG4gIHZpZXd0YXJnZXQ6ICd2aWV3VGFyZ2V0JyxcbiAgdmlzaWJpbGl0eTogJ3Zpc2liaWxpdHknLFxuICB2bWF0aGVtYXRpY2FsOiAndk1hdGhlbWF0aWNhbCcsXG4gICd2LW1hdGhlbWF0aWNhbCc6ICd2TWF0aGVtYXRpY2FsJyxcbiAgdm9jYWI6ICd2b2NhYicsXG4gIHdpZHRoczogJ3dpZHRocycsXG4gIHdvcmRzcGFjaW5nOiAnd29yZFNwYWNpbmcnLFxuICAnd29yZC1zcGFjaW5nJzogJ3dvcmRTcGFjaW5nJyxcbiAgd3JpdGluZ21vZGU6ICd3cml0aW5nTW9kZScsXG4gICd3cml0aW5nLW1vZGUnOiAnd3JpdGluZ01vZGUnLFxuICB4MTogJ3gxJyxcbiAgeDI6ICd4MicsXG4gIHg6ICd4JyxcbiAgeGNoYW5uZWxzZWxlY3RvcjogJ3hDaGFubmVsU2VsZWN0b3InLFxuICB4aGVpZ2h0OiAneEhlaWdodCcsXG4gICd4LWhlaWdodCc6ICd4SGVpZ2h0JyxcbiAgeGxpbmthY3R1YXRlOiAneGxpbmtBY3R1YXRlJyxcbiAgJ3hsaW5rOmFjdHVhdGUnOiAneGxpbmtBY3R1YXRlJyxcbiAgeGxpbmthcmNyb2xlOiAneGxpbmtBcmNyb2xlJyxcbiAgJ3hsaW5rOmFyY3JvbGUnOiAneGxpbmtBcmNyb2xlJyxcbiAgeGxpbmtocmVmOiAneGxpbmtIcmVmJyxcbiAgJ3hsaW5rOmhyZWYnOiAneGxpbmtIcmVmJyxcbiAgeGxpbmtyb2xlOiAneGxpbmtSb2xlJyxcbiAgJ3hsaW5rOnJvbGUnOiAneGxpbmtSb2xlJyxcbiAgeGxpbmtzaG93OiAneGxpbmtTaG93JyxcbiAgJ3hsaW5rOnNob3cnOiAneGxpbmtTaG93JyxcbiAgeGxpbmt0aXRsZTogJ3hsaW5rVGl0bGUnLFxuICAneGxpbms6dGl0bGUnOiAneGxpbmtUaXRsZScsXG4gIHhsaW5rdHlwZTogJ3hsaW5rVHlwZScsXG4gICd4bGluazp0eXBlJzogJ3hsaW5rVHlwZScsXG4gIHhtbGJhc2U6ICd4bWxCYXNlJyxcbiAgJ3htbDpiYXNlJzogJ3htbEJhc2UnLFxuICB4bWxsYW5nOiAneG1sTGFuZycsXG4gICd4bWw6bGFuZyc6ICd4bWxMYW5nJyxcbiAgeG1sbnM6ICd4bWxucycsXG4gICd4bWw6c3BhY2UnOiAneG1sU3BhY2UnLFxuICB4bWxuc3hsaW5rOiAneG1sbnNYbGluaycsXG4gICd4bWxuczp4bGluayc6ICd4bWxuc1hsaW5rJyxcbiAgeG1sc3BhY2U6ICd4bWxTcGFjZScsXG4gIHkxOiAneTEnLFxuICB5MjogJ3kyJyxcbiAgeTogJ3knLFxuICB5Y2hhbm5lbHNlbGVjdG9yOiAneUNoYW5uZWxTZWxlY3RvcicsXG4gIHo6ICd6JyxcbiAgem9vbWFuZHBhbjogJ3pvb21BbmRQYW4nXG59O1xuXG52YXIgYXJpYVByb3BlcnRpZXMgPSB7XG4gICdhcmlhLWN1cnJlbnQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1kZXNjcmlwdGlvbic6IDAsXG4gICdhcmlhLWRldGFpbHMnOiAwLFxuICAnYXJpYS1kaXNhYmxlZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWhpZGRlbic6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWludmFsaWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAnYXJpYS1sYWJlbCc6IDAsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICdhcmlhLWNoZWNrZWQnOiAwLFxuICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAnYXJpYS1tb2RhbCc6IDAsXG4gICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgJ2FyaWEtc29ydCc6IDAsXG4gICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXRvbWljJzogMCxcbiAgJ2FyaWEtYnVzeSc6IDAsXG4gICdhcmlhLWxpdmUnOiAwLFxuICAnYXJpYS1yZWxldmFudCc6IDAsXG4gIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICdhcmlhLWNvbGluZGV4JzogMCxcbiAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAnYXJpYS1mbG93dG8nOiAwLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgJ2FyaWEtb3ducyc6IDAsXG4gICdhcmlhLXBvc2luc2V0JzogMCxcbiAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICdhcmlhLXJvd3NwYW4nOiAwLFxuICAnYXJpYS1zZXRzaXplJzogMFxufTtcblxudmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcbnZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIHJBUklBQ2FtZWwgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSwgbmFtZSkge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwod2FybmVkUHJvcGVydGllcywgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJBUklBQ2FtZWwudGVzdChuYW1lKSkge1xuICAgICAgdmFyIGFyaWFOYW1lID0gJ2FyaWEtJyArIG5hbWUuc2xpY2UoNCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBjb3JyZWN0TmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGFyaWFOYW1lKSA/IGFyaWFOYW1lIDogbnVsbDsgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG5cbiAgICAgIGlmIChjb3JyZWN0TmFtZSA9PSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIEFSSUEgYXR0cmlidXRlcyBmb2xsb3cgdGhlIHBhdHRlcm4gYXJpYS0qIGFuZCBtdXN0IGJlIGxvd2VyY2FzZS4nLCBuYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuXG5cbiAgICAgIGlmIChuYW1lICE9PSBjb3JyZWN0TmFtZSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBjb3JyZWN0TmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyQVJJQS50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgc3RhbmRhcmROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gbG93ZXJDYXNlZE5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKHN0YW5kYXJkTmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuXG5cbiAgICAgIGlmIChuYW1lICE9PSBzdGFuZGFyZE5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgc3RhbmRhcmROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB2YXIgaW52YWxpZFByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSh0eXBlLCBrZXkpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgaW52YWxpZFByb3BzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSBpbnZhbGlkUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgICB9KS5qb2luKCcsICcpO1xuXG4gICAgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWFyaWEtcHJvcHMnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfSBlbHNlIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID4gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWFyaWEtcHJvcHMnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcykge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpO1xufVxuXG52YXIgZGlkV2FyblZhbHVlTnVsbCA9IGZhbHNlO1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIGlmICh0eXBlICE9PSAnaW5wdXQnICYmIHR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdHlwZSAhPT0gJ3NlbGVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMgIT0gbnVsbCAmJiBwcm9wcy52YWx1ZSA9PT0gbnVsbCAmJiAhZGlkV2FyblZhbHVlTnVsbCkge1xuICAgICAgZGlkV2FyblZhbHVlTnVsbCA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlID09PSAnc2VsZWN0JyAmJiBwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICBlcnJvcignYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IGFycmF5IHdoZW4gYG11bHRpcGxlYCBpcyBzZXQgdG8gYHRydWVgICcgKyAndG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgICcgKyAnZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsaWRhdGVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgdmFyIHdhcm5lZFByb3BlcnRpZXMkMSA9IHt9O1xuICB2YXIgRVZFTlRfTkFNRV9SRUdFWCA9IC9eb24uLztcbiAgdmFyIElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWCA9IC9eb25bXkEtWl0vO1xuICB2YXIgckFSSUEkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuICB2YXIgckFSSUFDYW1lbCQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCB2YWx1ZSwgZXZlbnRSZWdpc3RyeSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMkMSwgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllcyQxW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdvbmZvY3VzaW4nIHx8IGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c291dCcpIHtcbiAgICAgIGVycm9yKCdSZWFjdCB1c2VzIG9uRm9jdXMgYW5kIG9uQmx1ciBpbnN0ZWFkIG9mIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dC4gJyArICdBbGwgUmVhY3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0ICcgKyAnYXJlIG5vdCBuZWVkZWQvc3VwcG9ydGVkIGJ5IFJlYWN0LicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXZSBjYW4ndCByZWx5IG9uIHRoZSBldmVudCBzeXN0ZW0gYmVpbmcgaW5qZWN0ZWQgb24gdGhlIHNlcnZlci5cblxuXG4gICAgaWYgKGV2ZW50UmVnaXN0cnkgIT0gbnVsbCkge1xuICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMgPSBldmVudFJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9IGV2ZW50UmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcztcblxuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lID0gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA6IG51bGw7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIEl0IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgLy8gSWYgbm8gZXZlbnQgcGx1Z2lucyBoYXZlIGJlZW4gaW5qZWN0ZWQsIHdlIGFyZSBpbiBhIHNlcnZlciBlbnZpcm9ubWVudC5cbiAgICAgIC8vIFNvIHdlIGNhbid0IHRlbGwgaWYgdGhlIGV2ZW50IG5hbWUgaXMgY29ycmVjdCBmb3Igc3VyZSwgYnV0IHdlIGNhbiBmaWx0ZXJcbiAgICAgIC8vIG91dCBrbm93biBiYWQgb25lcyBsaWtlIGBvbmNsaWNrYC4gV2UgY2FuJ3Qgc3VnZ2VzdCBhIHNwZWNpZmljIHJlcGxhY2VtZW50IHRob3VnaC5cbiAgICAgIGlmIChJTlZBTElEX0VWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuICcgKyAnUmVhY3QgZXZlbnRzIHVzZSB0aGUgY2FtZWxDYXNlIG5hbWluZyBjb252ZW50aW9uLCBmb3IgZXhhbXBsZSBgb25DbGlja2AuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIExldCB0aGUgQVJJQSBhdHRyaWJ1dGUgaG9vayB2YWxpZGF0ZSBBUklBIGF0dHJpYnV0ZXNcblxuXG4gICAgaWYgKHJBUklBJDEudGVzdChuYW1lKSB8fCByQVJJQUNhbWVsJDEudGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnaW5uZXJodG1sJykge1xuICAgICAgZXJyb3IoJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2FyaWEnKSB7XG4gICAgICBlcnJvcignVGhlIGBhcmlhYCBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgaW4gUmVhY3QuICcgKyAnUGFzcyBpbmRpdmlkdWFsIGBhcmlhLWAgYXR0cmlidXRlcyBpbnN0ZWFkLicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnaXMnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGEgYCVzYCBmb3IgYSBzdHJpbmcgYXR0cmlidXRlIGBpc2AuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgdHlwZW9mIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIE5hTiBmb3IgdGhlIGAlc2AgYXR0cmlidXRlLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIG5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcbiAgICB2YXIgaXNSZXNlcnZlZCA9IHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQ7IC8vIEtub3duIGF0dHJpYnV0ZXMgc2hvdWxkIG1hdGNoIHRoZSBjYXNpbmcgc3BlY2lmaWVkIGluIHRoZSBwcm9wZXJ0eSBjb25maWcuXG5cbiAgICBpZiAocG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV07XG5cbiAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgRE9NIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZCAmJiBuYW1lICE9PSBsb3dlckNhc2VkTmFtZSkge1xuICAgICAgLy8gVW5rbm93biBhdHRyaWJ1dGVzIHNob3VsZCBoYXZlIGxvd2VyY2FzZSBjYXNpbmcgc2luY2UgdGhhdCdzIGhvdyB0aGV5XG4gICAgICAvLyB3aWxsIGJlIGNhc2VkIGFueXdheSB3aXRoIHNlcnZlciByZW5kZXJpbmcuXG4gICAgICBlcnJvcignUmVhY3QgZG9lcyBub3QgcmVjb2duaXplIHRoZSBgJXNgIHByb3Agb24gYSBET00gZWxlbWVudC4gSWYgeW91ICcgKyAnaW50ZW50aW9uYWxseSB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUgRE9NIGFzIGEgY3VzdG9tICcgKyAnYXR0cmlidXRlLCBzcGVsbCBpdCBhcyBsb3dlcmNhc2UgYCVzYCBpbnN0ZWFkLiAnICsgJ0lmIHlvdSBhY2NpZGVudGFsbHkgcGFzc2VkIGl0IGZyb20gYSBwYXJlbnQgY29tcG9uZW50LCByZW1vdmUgJyArICdpdCBmcm9tIHRoZSBET00gZWxlbWVudC4nLCBuYW1lLCBsb3dlckNhc2VkTmFtZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHZhbHVlLCBuYW1lLCBuYW1lLCB2YWx1ZSwgbmFtZSwgbmFtZSwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIE5vdyB0aGF0IHdlJ3ZlIHZhbGlkYXRlZCBjYXNpbmcsIGRvIG5vdCB2YWxpZGF0ZVxuICAgIC8vIGRhdGEgdHlwZXMgZm9yIHJlc2VydmVkIHByb3BzXG5cblxuICAgIGlmIChpc1Jlc2VydmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFdhcm4gd2hlbiBhIGtub3duIGF0dHJpYnV0ZSBpcyBhIGJhZCB0eXBlXG5cblxuICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBXYXJuIHdoZW4gcGFzc2luZyB0aGUgc3RyaW5ncyAnZmFsc2UnIG9yICd0cnVlJyBpbnRvIGEgYm9vbGVhbiBwcm9wXG5cblxuICAgIGlmICgodmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgPT09ICd0cnVlJykgJiYgcHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBCT09MRUFOKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgdGhlIHN0cmluZyBgJXNgIGZvciB0aGUgYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC4gJyArICclcyAnICsgJ0RpZCB5b3UgbWVhbiAlcz17JXN9PycsIHZhbHVlLCBuYW1lLCB2YWx1ZSA9PT0gJ2ZhbHNlJyA/ICdUaGUgYnJvd3NlciB3aWxsIGludGVycHJldCBpdCBhcyBhIHRydXRoeSB2YWx1ZS4nIDogJ0FsdGhvdWdoIHRoaXMgd29ya3MsIGl0IHdpbGwgbm90IHdvcmsgYXMgZXhwZWN0ZWQgaWYgeW91IHBhc3MgdGhlIHN0cmluZyBcImZhbHNlXCIuJywgbmFtZSwgdmFsdWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbnZhciB3YXJuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAge1xuICAgIHZhciB1bmtub3duUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5JDEodHlwZSwga2V5LCBwcm9wc1trZXldLCBldmVudFJlZ2lzdHJ5KTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIHVua25vd25Qcm9wcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gdW5rbm93blByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gICAgfSkuam9pbignLCAnKTtcblxuICAgIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgcHJvcCAlcyBvbiA8JXM+IHRhZy4gRWl0aGVyIHJlbW92ZSBpdCBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgaXQgaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH0gZWxzZSBpZiAodW5rbm93blByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIHZhbHVlcyBmb3IgcHJvcHMgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgdGhlbSBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgdGhlbSBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciAnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSkge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FyblVua25vd25Qcm9wZXJ0aWVzKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KTtcbn1cblxudmFyIElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFID0gMTtcbnZhciBJU19OT05fREVMRUdBVEVEID0gMSA8PCAxO1xudmFyIElTX0NBUFRVUkVfUEhBU0UgPSAxIDw8IDI7XG4vLyBzZXQgdG8gTEVHQUNZX0ZCX1NVUFBPUlQuIExFR0FDWV9GQl9TVVBQT1JUIG9ubHkgZ2V0cyBzZXQgd2hlblxuLy8gd2UgY2FsbCB3aWxsRGVmZXJMYXRlckZvckxlZ2FjeUZCU3VwcG9ydCwgdGh1cyBub3QgYmFpbGluZyBvdXRcbi8vIHdpbGwgcmVzdWx0IGluIGVuZGxlc3MgY3ljbGVzIGxpa2UgYW4gaW5maW5pdGUgbG9vcC5cbi8vIFdlIGFsc28gZG9uJ3Qgd2FudCB0byBkZWZlciBkdXJpbmcgZXZlbnQgcmVwbGF5aW5nLlxuXG52YXIgU0hPVUxEX05PVF9QUk9DRVNTX1BPTFlGSUxMX0VWRU5UX1BMVUdJTlMgPSBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSB8IElTX05PTl9ERUxFR0FURUQgfCBJU19DQVBUVVJFX1BIQVNFO1xuXG4vLyBUaGlzIGV4aXN0cyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gUmVhY3RET01FdmVudFJlcGxheWluZ1xuLy8gYW5kIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxudmFyIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7XG5mdW5jdGlvbiBzZXRSZXBsYXlpbmdFdmVudChldmVudCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnRSZXBsYXlpbmdFdmVudCAhPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gYmUgbnVsbC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IGV2ZW50O1xufVxuZnVuY3Rpb24gcmVzZXRSZXBsYXlpbmdFdmVudCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50UmVwbGF5aW5nRXZlbnQgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBjdXJyZW50bHkgcmVwbGF5aW5nIGV2ZW50IHRvIG5vdCBiZSBudWxsLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzUmVwbGF5aW5nRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGV2ZW50ID09PSBjdXJyZW50UmVwbGF5aW5nRXZlbnQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdGFyZ2V0IG5vZGUgZnJvbSBhIG5hdGl2ZSBicm93c2VyIGV2ZW50IGJ5IGFjY291bnRpbmcgZm9yXG4gKiBpbmNvbnNpc3RlbmNpZXMgaW4gYnJvd3NlciBET00gQVBJcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtET01FdmVudFRhcmdldH0gVGFyZ2V0IG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpIHtcbiAgLy8gRmFsbGJhY2sgdG8gbmF0aXZlRXZlbnQuc3JjRWxlbWVudCBmb3IgSUU5XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDZcbiAgdmFyIHRhcmdldCA9IG5hdGl2ZUV2ZW50LnRhcmdldCB8fCBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IHdpbmRvdzsgLy8gTm9ybWFsaXplIFNWRyA8dXNlPiBlbGVtZW50IGV2ZW50cyAjNDk2M1xuXG4gIGlmICh0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpIHtcbiAgICB0YXJnZXQgPSB0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQ7XG4gIH0gLy8gU2FmYXJpIG1heSBmaXJlIGV2ZW50cyBvbiB0ZXh0IG5vZGVzIChOb2RlLlRFWFRfTk9ERSBpcyAzKS5cbiAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2pzL2V2ZW50c19wcm9wZXJ0aWVzLmh0bWxcblxuXG4gIHJldHVybiB0YXJnZXQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSA/IHRhcmdldC5wYXJlbnROb2RlIDogdGFyZ2V0O1xufVxuXG52YXIgcmVzdG9yZUltcGwgPSBudWxsO1xudmFyIHJlc3RvcmVUYXJnZXQgPSBudWxsO1xudmFyIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCkge1xuICAvLyBXZSBwZXJmb3JtIHRoaXMgdHJhbnNsYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgZXZlbnQgbG9vcCBzbyB0aGF0IHdlXG4gIC8vIGFsd2F5cyByZWNlaXZlIHRoZSBjb3JyZWN0IGZpYmVyIGhlcmVcbiAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKHRhcmdldCk7XG5cbiAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgLy8gVW5tb3VudGVkXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZXN0b3JlSW1wbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBhIHRhcmdldCBmb3IgY29udHJvbGxlZCAnICsgJ2V2ZW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHZhciBzdGF0ZU5vZGUgPSBpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZTsgLy8gR3VhcmQgYWdhaW5zdCBGaWJlciBiZWluZyB1bm1vdW50ZWQuXG5cbiAgaWYgKHN0YXRlTm9kZSkge1xuICAgIHZhciBfcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG5cbiAgICByZXN0b3JlSW1wbChpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZSwgaW50ZXJuYWxJbnN0YW5jZS50eXBlLCBfcHJvcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihpbXBsKSB7XG4gIHJlc3RvcmVJbXBsID0gaW1wbDtcbn1cbmZ1bmN0aW9uIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KSB7XG4gIGlmIChyZXN0b3JlVGFyZ2V0KSB7XG4gICAgaWYgKHJlc3RvcmVRdWV1ZSkge1xuICAgICAgcmVzdG9yZVF1ZXVlLnB1c2godGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdG9yZVF1ZXVlID0gW3RhcmdldF07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3RvcmVUYXJnZXQgPSB0YXJnZXQ7XG4gIH1cbn1cbmZ1bmN0aW9uIG5lZWRzU3RhdGVSZXN0b3JlKCkge1xuICByZXR1cm4gcmVzdG9yZVRhcmdldCAhPT0gbnVsbCB8fCByZXN0b3JlUXVldWUgIT09IG51bGw7XG59XG5mdW5jdGlvbiByZXN0b3JlU3RhdGVJZk5lZWRlZCgpIHtcbiAgaWYgKCFyZXN0b3JlVGFyZ2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRhcmdldCA9IHJlc3RvcmVUYXJnZXQ7XG4gIHZhciBxdWV1ZWRUYXJnZXRzID0gcmVzdG9yZVF1ZXVlO1xuICByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbiAgcmVzdG9yZVF1ZXVlID0gbnVsbDtcbiAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KTtcblxuICBpZiAocXVldWVkVGFyZ2V0cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWVkVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQocXVldWVkVGFyZ2V0c1tpXSk7XG4gICAgfVxuICB9XG59XG5cbi8vIHRoZSByZW5kZXJlci4gU3VjaCBhcyB3aGVuIHdlJ3JlIGRpc3BhdGNoaW5nIGV2ZW50cyBvciBpZiB0aGlyZCBwYXJ0eVxuLy8gbGlicmFyaWVzIG5lZWQgdG8gY2FsbCBiYXRjaGVkVXBkYXRlcy4gRXZlbnR1YWxseSwgdGhpcyBBUEkgd2lsbCBnbyBhd2F5IHdoZW5cbi8vIGV2ZXJ5dGhpbmcgaXMgYmF0Y2hlZCBieSBkZWZhdWx0LiBXZSdsbCB0aGVuIGhhdmUgYSBzaW1pbGFyIEFQSSB0byBvcHQtb3V0IG9mXG4vLyBzY2hlZHVsZWQgd29yayBhbmQgaW5zdGVhZCBkbyBzeW5jaHJvbm91cyB3b3JrLlxuLy8gRGVmYXVsdHNcblxudmFyIGJhdGNoZWRVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYm9va2tlZXBpbmcpIHtcbiAgcmV0dXJuIGZuKGJvb2trZWVwaW5nKTtcbn07XG5cbnZhciBmbHVzaFN5bmNJbXBsID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmaW5pc2hFdmVudEhhbmRsZXIoKSB7XG4gIC8vIEhlcmUgd2Ugd2FpdCB1bnRpbCBhbGwgdXBkYXRlcyBoYXZlIHByb3BhZ2F0ZWQsIHdoaWNoIGlzIGltcG9ydGFudFxuICAvLyB3aGVuIHVzaW5nIGNvbnRyb2xsZWQgY29tcG9uZW50cyB3aXRoaW4gbGF5ZXJzOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2OThcbiAgLy8gVGhlbiB3ZSByZXN0b3JlIHN0YXRlIG9mIGFueSBjb250cm9sbGVkIGNvbXBvbmVudC5cbiAgdmFyIGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzID0gbmVlZHNTdGF0ZVJlc3RvcmUoKTtcblxuICBpZiAoY29udHJvbGxlZENvbXBvbmVudHNIYXZlUGVuZGluZ1VwZGF0ZXMpIHtcbiAgICAvLyBJZiBhIGNvbnRyb2xsZWQgZXZlbnQgd2FzIGZpcmVkLCB3ZSBtYXkgbmVlZCB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZlxuICAgIC8vIHRoZSBET00gbm9kZSBiYWNrIHRvIHRoZSBjb250cm9sbGVkIHZhbHVlLiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuIFJlYWN0XG4gICAgLy8gYmFpbHMgb3V0IG9mIHRoZSB1cGRhdGUgd2l0aG91dCB0b3VjaGluZyB0aGUgRE9NLlxuICAgIC8vIFRPRE86IFJlc3RvcmUgc3RhdGUgaW4gdGhlIG1pY3JvdGFzaywgYWZ0ZXIgdGhlIGRpc2NyZXRlIHVwZGF0ZXMgZmx1c2gsXG4gICAgLy8gaW5zdGVhZCBvZiBlYXJseSBmbHVzaGluZyB0aGVtIGhlcmUuXG4gICAgZmx1c2hTeW5jSW1wbCgpO1xuICAgIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMoZm4sIGEsIGIpIHtcbiAgaWYgKGlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgYW5vdGhlciBiYXRjaCwgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0XG4gICAgLy8gZnVsbHkgY29tcGxldGVzIGJlZm9yZSByZXN0b3Jpbmcgc3RhdGUuXG4gICAgcmV0dXJuIGZuKGEsIGIpO1xuICB9XG5cbiAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhdGNoZWRVcGRhdGVzSW1wbChmbiwgYSwgYik7XG4gIH0gZmluYWxseSB7XG4gICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBmYWxzZTtcbiAgICBmaW5pc2hFdmVudEhhbmRsZXIoKTtcbiAgfVxufSAvLyBUT0RPOiBSZXBsYWNlIHdpdGggZmx1c2hTeW5jXG5mdW5jdGlvbiBzZXRCYXRjaGluZ0ltcGxlbWVudGF0aW9uKF9iYXRjaGVkVXBkYXRlc0ltcGwsIF9kaXNjcmV0ZVVwZGF0ZXNJbXBsLCBfZmx1c2hTeW5jSW1wbCkge1xuICBiYXRjaGVkVXBkYXRlc0ltcGwgPSBfYmF0Y2hlZFVwZGF0ZXNJbXBsO1xuICBmbHVzaFN5bmNJbXBsID0gX2ZsdXNoU3luY0ltcGw7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7XG4gIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJztcbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJldmVudE1vdXNlRXZlbnQobmFtZSwgdHlwZSwgcHJvcHMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnb25DbGljayc6XG4gICAgY2FzZSAnb25DbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2snOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bic6XG4gICAgY2FzZSAnb25Nb3VzZURvd25DYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmVDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlVXAnOlxuICAgIGNhc2UgJ29uTW91c2VVcENhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VFbnRlcic6XG4gICAgICByZXR1cm4gISEocHJvcHMuZGlzYWJsZWQgJiYgaXNJbnRlcmFjdGl2ZSh0eXBlKSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gKiBAcmV0dXJuIHs/ZnVuY3Rpb259IFRoZSBzdG9yZWQgY2FsbGJhY2suXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gIHZhciBzdGF0ZU5vZGUgPSBpbnN0LnN0YXRlTm9kZTtcblxuICBpZiAoc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgLy8gV29yayBpbiBwcm9ncmVzcyAoZXg6IG9ubG9hZCBldmVudHMgaW4gaW5jcmVtZW50YWwgbW9kZSkuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG5cbiAgaWYgKHByb3BzID09PSBudWxsKSB7XG4gICAgLy8gV29yayBpbiBwcm9ncmVzcy5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IHByb3BzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuXG4gIGlmIChzaG91bGRQcmV2ZW50TW91c2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBpbnN0LnR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGxpc3RlbmVyICYmIHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGBcIiArIHJlZ2lzdHJhdGlvbk5hbWUgKyBcImAgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgXCIgKyB0eXBlb2YgbGlzdGVuZXIgKyBcImAgdHlwZS5cIik7XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXI7XG59XG5cbnZhciBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlOyAvLyBDaGVjayBpZiBicm93c2VyIHN1cHBvcnQgZXZlbnRzIHdpdGggcGFzc2l2ZSBsaXN0ZW5lcnNcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI1NhZmVseV9kZXRlY3Rpbmdfb3B0aW9uX3N1cHBvcnRcblxuaWYgKGNhblVzZURPTSkge1xuICB0cnkge1xuICAgIHZhciBvcHRpb25zID0ge307IC8vICRGbG93Rml4TWU6IElnbm9yZSBGbG93IGNvbXBsYWluaW5nIGFib3V0IG5lZWRpbmcgYSB2YWx1ZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdGlvbnMsICdwYXNzaXZlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gIHRyeSB7XG4gICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCA9IGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2Q7XG5cbntcbiAgLy8gSW4gREVWIG1vZGUsIHdlIHN3YXAgb3V0IGludm9rZUd1YXJkZWRDYWxsYmFjayBmb3IgYSBzcGVjaWFsIHZlcnNpb25cbiAgLy8gdGhhdCBwbGF5cyBtb3JlIG5pY2VseSB3aXRoIHRoZSBicm93c2VyJ3MgRGV2VG9vbHMuIFRoZSBpZGVhIGlzIHRvIHByZXNlcnZlXG4gIC8vIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLiBCZWNhdXNlIFJlYWN0IHdyYXBzIGFsbCB1c2VyLXByb3ZpZGVkXG4gIC8vIGZ1bmN0aW9ucyBpbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGFuZCB0aGUgcHJvZHVjdGlvbiB2ZXJzaW9uIG9mXG4gIC8vIGludm9rZUd1YXJkZWRDYWxsYmFjayB1c2VzIGEgdHJ5LWNhdGNoLCBhbGwgdXNlciBleGNlcHRpb25zIGFyZSB0cmVhdGVkXG4gIC8vIGxpa2UgY2F1Z2h0IGV4Y2VwdGlvbnMsIGFuZCB0aGUgRGV2VG9vbHMgd29uJ3QgcGF1c2UgdW5sZXNzIHRoZSBkZXZlbG9wZXJcbiAgLy8gdGFrZXMgdGhlIGV4dHJhIHN0ZXAgb2YgZW5hYmxpbmcgcGF1c2Ugb24gY2F1Z2h0IGV4Y2VwdGlvbnMuIFRoaXMgaXNcbiAgLy8gdW5pbnR1aXRpdmUsIHRob3VnaCwgYmVjYXVzZSBldmVuIHRob3VnaCBSZWFjdCBoYXMgY2F1Z2h0IHRoZSBlcnJvciwgZnJvbVxuICAvLyB0aGUgZGV2ZWxvcGVyJ3MgcGVyc3BlY3RpdmUsIHRoZSBlcnJvciBpcyB1bmNhdWdodC5cbiAgLy9cbiAgLy8gVG8gcHJlc2VydmUgdGhlIGV4cGVjdGVkIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLCB3ZSBkb24ndCB1c2UgYVxuICAvLyB0cnktY2F0Y2ggaW4gREVWLiBJbnN0ZWFkLCB3ZSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoIGEgZmFrZSBldmVudCB0byBhIGZha2VcbiAgLy8gRE9NIG5vZGUsIGFuZCBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIGZyb20gaW5zaWRlIGFuIGV2ZW50IGhhbmRsZXJcbiAgLy8gZm9yIHRoYXQgZmFrZSBldmVudC4gSWYgdGhlIGNhbGxiYWNrIHRocm93cywgdGhlIGVycm9yIGlzIFwiY2FwdHVyZWRcIiB1c2luZ1xuICAvLyBhIGdsb2JhbCBldmVudCBoYW5kbGVyLiBCdXQgYmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVucyBpbiBhIGRpZmZlcmVudFxuICAvLyBldmVudCBsb29wIGNvbnRleHQsIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgbm9ybWFsIHByb2dyYW0gZmxvdy5cbiAgLy8gRWZmZWN0aXZlbHksIHRoaXMgZ2l2ZXMgdXMgdHJ5LWNhdGNoIGJlaGF2aW9yIHdpdGhvdXQgYWN0dWFsbHkgdXNpbmdcbiAgLy8gdHJ5LWNhdGNoLiBOZWF0IVxuICAvLyBDaGVjayB0aGF0IHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBBUElzIHdlIG5lZWQgdG8gaW1wbGVtZW50IG91ciBzcGVjaWFsXG4gIC8vIERFViB2ZXJzaW9uIG9mIGludm9rZUd1YXJkZWRDYWxsYmFja1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kaXNwYXRjaEV2ZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGZha2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncmVhY3QnKTtcblxuICAgIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBmdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tEZXYobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgLy8gSWYgZG9jdW1lbnQgZG9lc24ndCBleGlzdCB3ZSBrbm93IGZvciBzdXJlIHdlIHdpbGwgY3Jhc2ggaW4gdGhpcyBtZXRob2RcbiAgICAgIC8vIHdoZW4gd2UgY2FsbCBkb2N1bWVudC5jcmVhdGVFdmVudCgpLiBIb3dldmVyIHRoaXMgY2FuIGNhdXNlIGNvbmZ1c2luZ1xuICAgICAgLy8gZXJyb3JzOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svY3JlYXRlLXJlYWN0LWFwcC9pc3N1ZXMvMzQ4MlxuICAgICAgLy8gU28gd2UgcHJlZW1wdGl2ZWx5IHRocm93IHdpdGggYSBiZXR0ZXIgbWVzc2FnZSBpbnN0ZWFkLlxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgZG9jdW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYGRvY3VtZW50YCBnbG9iYWwgd2FzIGRlZmluZWQgd2hlbiBSZWFjdCB3YXMgaW5pdGlhbGl6ZWQsIGJ1dCBpcyBub3QgJyArICdkZWZpbmVkIGFueW1vcmUuIFRoaXMgY2FuIGhhcHBlbiBpbiBhIHRlc3QgZW52aXJvbm1lbnQgaWYgYSBjb21wb25lbnQgJyArICdzY2hlZHVsZXMgYW4gdXBkYXRlIGZyb20gYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBidXQgdGhlIHRlc3QgaGFzIGFscmVhZHkgJyArICdmaW5pc2hlZCBydW5uaW5nLiBUbyBzb2x2ZSB0aGlzLCB5b3UgY2FuIGVpdGhlciB1bm1vdW50IHRoZSBjb21wb25lbnQgYXQgJyArICd0aGUgZW5kIG9mIHlvdXIgdGVzdCAoYW5kIGVuc3VyZSB0aGF0IGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBnZXQgJyArICdjYW5jZWxlZCBpbiBgY29tcG9uZW50V2lsbFVubW91bnRgKSwgb3IgeW91IGNhbiBjaGFuZ2UgdGhlIHRlc3QgaXRzZWxmICcgKyAndG8gYmUgYXN5bmNocm9ub3VzLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICB2YXIgZGlkQ2FsbCA9IGZhbHNlOyAvLyBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLiBXZVxuICAgICAgLy8gc2V0IHRoaXMgdG8gdHJ1ZSBhdCB0aGUgYmVnaW5uaW5nLCB0aGVuIHNldCBpdCB0byBmYWxzZSByaWdodCBhZnRlclxuICAgICAgLy8gY2FsbGluZyB0aGUgZnVuY3Rpb24uIElmIHRoZSBmdW5jdGlvbiBlcnJvcnMsIGBkaWRFcnJvcmAgd2lsbCBuZXZlciBiZVxuICAgICAgLy8gc2V0IHRvIGZhbHNlLiBUaGlzIHN0cmF0ZWd5IHdvcmtzIGV2ZW4gaWYgdGhlIGJyb3dzZXIgaXMgZmxha3kgYW5kXG4gICAgICAvLyBmYWlscyB0byBjYWxsIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlciwgYmVjYXVzZSBpdCBkb2Vzbid0IHJlbHkgb25cbiAgICAgIC8vIHRoZSBlcnJvciBldmVudCBhdCBhbGwuXG5cbiAgICAgIHZhciBkaWRFcnJvciA9IHRydWU7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSB2YWx1ZSBvZiB3aW5kb3cuZXZlbnQgc28gdGhhdCB3ZSBjYW4gcmVzZXQgaXRcbiAgICAgIC8vIGR1cmluZyB0aGUgY2FsbGJhY2sgdG8gbGV0IHVzZXIgY29kZSBhY2Nlc3Mgd2luZG93LmV2ZW50IGluIHRoZVxuICAgICAgLy8gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGl0LlxuXG4gICAgICB2YXIgd2luZG93RXZlbnQgPSB3aW5kb3cuZXZlbnQ7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHdpbmRvdy5ldmVudCB0byByZXN0b3JlIGl0IGFmdGVyIGV2ZW50XG4gICAgICAvLyBkaXNwYXRjaGluZzogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzY4OFxuXG4gICAgICB2YXIgd2luZG93RXZlbnREZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdldmVudCcpO1xuXG4gICAgICBmdW5jdGlvbiByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpIHtcbiAgICAgICAgLy8gV2UgaW1tZWRpYXRlbHkgcmVtb3ZlIHRoZSBjYWxsYmFjayBmcm9tIGV2ZW50IGxpc3RlbmVycyBzbyB0aGF0XG4gICAgICAgIC8vIG5lc3RlZCBgaW52b2tlR3VhcmRlZENhbGxiYWNrYCBjYWxscyBkbyBub3QgY2xhc2guIE90aGVyd2lzZSwgYVxuICAgICAgICAvLyBuZXN0ZWQgY2FsbCB3b3VsZCB0cmlnZ2VyIHRoZSBmYWtlIGV2ZW50IGhhbmRsZXJzIG9mIGFueSBjYWxsIGhpZ2hlclxuICAgICAgICAvLyBpbiB0aGUgc3RhY2suXG4gICAgICAgIGZha2VOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFdlIGNoZWNrIGZvciB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykgdG8gcHJldmVudCB0aGVcbiAgICAgICAgLy8gd2luZG93LmV2ZW50IGFzc2lnbm1lbnQgaW4gYm90aCBJRSA8PSAxMCBhcyB0aGV5IHRocm93IGFuIGVycm9yXG4gICAgICAgIC8vIFwiTWVtYmVyIG5vdCBmb3VuZFwiIGluIHN0cmljdCBtb2RlLCBhbmQgaW4gRmlyZWZveCB3aGljaCBkb2VzIG5vdFxuICAgICAgICAvLyBzdXBwb3J0IHdpbmRvdy5ldmVudC5cblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5ldmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpKSB7XG4gICAgICAgICAgd2luZG93LmV2ZW50ID0gd2luZG93RXZlbnQ7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gQ3JlYXRlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIG91ciBmYWtlIGV2ZW50LiBXZSB3aWxsIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50IHVzaW5nIGBkaXNwYXRjaEV2ZW50YC4gSW5zaWRlIHRoZSBoYW5kbGVyLCB3ZVxuICAgICAgLy8gY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjay5cblxuXG4gICAgICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gICAgICBmdW5jdGlvbiBjYWxsQ2FsbGJhY2soKSB7XG4gICAgICAgIGRpZENhbGwgPSB0cnVlO1xuICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpO1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTtcbiAgICAgICAgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICAgIH0gLy8gQ3JlYXRlIGEgZ2xvYmFsIGVycm9yIGV2ZW50IGhhbmRsZXIuIFdlIHVzZSB0aGlzIHRvIGNhcHR1cmUgdGhlIHZhbHVlXG4gICAgICAvLyB0aGF0IHdhcyB0aHJvd24uIEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIGVycm9yIGhhbmRsZXIgd2lsbCBmaXJlIG1vcmVcbiAgICAgIC8vIHRoYW4gb25jZTsgZm9yIGV4YW1wbGUsIGlmIG5vbi1SZWFjdCBjb2RlIGFsc28gY2FsbHMgYGRpc3BhdGNoRXZlbnRgXG4gICAgICAvLyBhbmQgYSBoYW5kbGVyIGZvciB0aGF0IGV2ZW50IHRocm93cy4gV2Ugc2hvdWxkIGJlIHJlc2lsaWVudCB0byBtb3N0IG9mXG4gICAgICAvLyB0aG9zZSBjYXNlcy4gRXZlbiBpZiBvdXIgZXJyb3IgZXZlbnQgaGFuZGxlciBmaXJlcyBtb3JlIHRoYW4gb25jZSwgdGhlXG4gICAgICAvLyBsYXN0IGVycm9yIGV2ZW50IGlzIGFsd2F5cyB1c2VkLiBJZiB0aGUgY2FsbGJhY2sgYWN0dWFsbHkgZG9lcyBlcnJvcixcbiAgICAgIC8vIHdlIGtub3cgdGhhdCB0aGUgbGFzdCBlcnJvciBldmVudCBpcyB0aGUgY29ycmVjdCBvbmUsIGJlY2F1c2UgaXQncyBub3RcbiAgICAgIC8vIHBvc3NpYmxlIGZvciBhbnl0aGluZyBlbHNlIHRvIGhhdmUgaGFwcGVuZWQgaW4gYmV0d2VlbiBvdXIgY2FsbGJhY2tcbiAgICAgIC8vIGVycm9yaW5nIGFuZCB0aGUgY29kZSB0aGF0IGZvbGxvd3MgdGhlIGBkaXNwYXRjaEV2ZW50YCBjYWxsIGJlbG93LiBJZlxuICAgICAgLy8gdGhlIGNhbGxiYWNrIGRvZXNuJ3QgZXJyb3IsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgd2FzIGZpcmVkLCB3ZSBrbm93IHRvXG4gICAgICAvLyBpZ25vcmUgaXQgYmVjYXVzZSBgZGlkRXJyb3JgIHdpbGwgYmUgZmFsc2UsIGFzIGRlc2NyaWJlZCBhYm92ZS5cblxuXG4gICAgICB2YXIgZXJyb3I7IC8vIFVzZSB0aGlzIHRvIHRyYWNrIHdoZXRoZXIgdGhlIGVycm9yIGV2ZW50IGlzIGV2ZXIgY2FsbGVkLlxuXG4gICAgICB2YXIgZGlkU2V0RXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBpc0Nyb3NzT3JpZ2luRXJyb3IgPSBmYWxzZTtcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlV2luZG93RXJyb3IoZXZlbnQpIHtcbiAgICAgICAgZXJyb3IgPSBldmVudC5lcnJvcjtcbiAgICAgICAgZGlkU2V0RXJyb3IgPSB0cnVlO1xuXG4gICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCAmJiBldmVudC5jb2xubyA9PT0gMCAmJiBldmVudC5saW5lbm8gPT09IDApIHtcbiAgICAgICAgICBpc0Nyb3NzT3JpZ2luRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAvLyBTb21lIG90aGVyIGVycm9yIGhhbmRsZXIgaGFzIHByZXZlbnRlZCBkZWZhdWx0LlxuICAgICAgICAgIC8vIEJyb3dzZXJzIHNpbGVuY2UgdGhlIGVycm9yIHJlcG9ydCBpZiB0aGlzIGhhcHBlbnMuXG4gICAgICAgICAgLy8gV2UnbGwgcmVtZW1iZXIgdGhpcyB0byBsYXRlciBkZWNpZGUgd2hldGhlciB0byBsb2cgaXQgb3Igbm90LlxuICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoaW5uZXIpIHsvLyBJZ25vcmUuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhIGZha2UgZXZlbnQgdHlwZS5cblxuXG4gICAgICB2YXIgZXZ0VHlwZSA9IFwicmVhY3QtXCIgKyAobmFtZSA/IG5hbWUgOiAnaW52b2tlZ3VhcmRlZGNhbGxiYWNrJyk7IC8vIEF0dGFjaCBvdXIgZXZlbnQgaGFuZGxlcnNcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTsgLy8gU3luY2hyb25vdXNseSBkaXNwYXRjaCBvdXIgZmFrZSBldmVudC4gSWYgdGhlIHVzZXItcHJvdmlkZWQgZnVuY3Rpb25cbiAgICAgIC8vIGVycm9ycywgaXQgd2lsbCB0cmlnZ2VyIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlci5cblxuICAgICAgZXZ0LmluaXRFdmVudChldnRUeXBlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgZmFrZU5vZGUuZGlzcGF0Y2hFdmVudChldnQpO1xuXG4gICAgICBpZiAod2luZG93RXZlbnREZXNjcmlwdG9yKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdldmVudCcsIHdpbmRvd0V2ZW50RGVzY3JpcHRvcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWRDYWxsICYmIGRpZEVycm9yKSB7XG4gICAgICAgIGlmICghZGlkU2V0RXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgZXJyb3JlZCwgYnV0IHRoZSBlcnJvciBldmVudCBuZXZlciBmaXJlZC5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdBbiBlcnJvciB3YXMgdGhyb3duIGluc2lkZSBvbmUgb2YgeW91ciBjb21wb25lbnRzLCBidXQgUmVhY3QgJyArIFwiZG9lc24ndCBrbm93IHdoYXQgaXQgd2FzLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gYnJvd3NlciBcIiArICdmbGFraW5lc3MuIFJlYWN0IGRvZXMgaXRzIGJlc3QgdG8gcHJlc2VydmUgdGhlIFwiUGF1c2Ugb24gJyArICdleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIERldlRvb2xzLCB3aGljaCByZXF1aXJlcyBzb21lICcgKyBcIkRFVi1tb2RlIG9ubHkgdHJpY2tzLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlc2UgZG9uJ3Qgd29yayBpbiBcIiArICd5b3VyIGJyb3dzZXIuIFRyeSB0cmlnZ2VyaW5nIHRoZSBlcnJvciBpbiBwcm9kdWN0aW9uIG1vZGUsICcgKyAnb3Igc3dpdGNoaW5nIHRvIGEgbW9kZXJuIGJyb3dzZXIuIElmIHlvdSBzdXNwZWN0IHRoYXQgdGhpcyBpcyAnICsgJ2FjdHVhbGx5IGFuIGlzc3VlIHdpdGggUmVhY3QsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ3Jvc3NPcmlnaW5FcnJvcikge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXCJBIGNyb3NzLW9yaWdpbiBlcnJvciB3YXMgdGhyb3duLiBSZWFjdCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIFwiICsgJ3RoZSBhY3R1YWwgZXJyb3Igb2JqZWN0IGluIGRldmVsb3BtZW50LiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY3Jvc3NvcmlnaW4tZXJyb3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuXG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcblxuICAgICAgaWYgKCFkaWRDYWxsKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgYW5kIG91ciBldmVudCB3YXMgbm90IGRpc3BhdGNoZWQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY3MzRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjU4NVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxID0gaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbDtcblxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsOyAvLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxuXG52YXIgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG52YXIgcmV0aHJvd0Vycm9yID0gbnVsbDtcbnZhciByZXBvcnRlciA9IHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn07XG4vKipcbiAqIENhbGwgYSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LlxuICogUmV0dXJucyBhbiBlcnJvciBpZiBpdCB0aHJvd3MsIG90aGVyd2lzZSBudWxsLlxuICpcbiAqIEluIHByb2R1Y3Rpb24sIHRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSB0cnktY2F0Y2guIFRoZSByZWFzb24gd2UgZG9uJ3RcbiAqIHVzZSBhIHRyeS1jYXRjaCBkaXJlY3RseSBpcyBzbyB0aGF0IHdlIGNhbiBzd2FwIG91dCBhIGRpZmZlcmVudFxuICogaW1wbGVtZW50YXRpb24gaW4gREVWIG1vZGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGhhc0Vycm9yID0gZmFsc2U7XG4gIGNhdWdodEVycm9yID0gbnVsbDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpO1xufVxuLyoqXG4gKiBTYW1lIGFzIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLCBpdCBzdG9yZXNcbiAqIGl0IGluIGEgZ2xvYmFsIHNvIGl0IGNhbiBiZSByZXRocm93biBieSBgcmV0aHJvd0NhdWdodEVycm9yYCBsYXRlci5cbiAqIFRPRE86IFNlZSBpZiBjYXVnaHRFcnJvciBhbmQgcmV0aHJvd0Vycm9yIGNhbiBiZSB1bmlmaWVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICBpZiAoIWhhc1JldGhyb3dFcnJvcikge1xuICAgICAgaGFzUmV0aHJvd0Vycm9yID0gdHJ1ZTtcbiAgICAgIHJldGhyb3dFcnJvciA9IGVycm9yO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0aGUgZmlyc3QgZXJyb3Igd2hpY2hcbiAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAqL1xuXG5mdW5jdGlvbiByZXRocm93Q2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNSZXRocm93RXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSByZXRocm93RXJyb3I7XG4gICAgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG4gICAgcmV0aHJvd0Vycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuZnVuY3Rpb24gaGFzQ2F1Z2h0RXJyb3IoKSB7XG4gIHJldHVybiBoYXNFcnJvcjtcbn1cbmZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyQ2F1Z2h0RXJyb3Igd2FzIGNhbGxlZCBidXQgbm8gZXJyb3Igd2FzIGNhcHR1cmVkLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgY3VycmVudGx5IHNoYXJlZCBhbmQgYXNzdW1lZCB0byBiZSBzdGF0ZWxlc3MuXG4gKiBJZiB0aGlzIGJlY29tZXMgYW4gYWN0dWFsIE1hcCwgdGhhdCB3aWxsIGJyZWFrLlxuICovXG5mdW5jdGlvbiBnZXQoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxzO1xufVxuZnVuY3Rpb24gaGFzKGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscyAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAga2V5Ll9yZWFjdEludGVybmFscyA9IHZhbHVlO1xufVxuXG4vLyBEb24ndCBjaGFuZ2UgdGhlc2UgdHdvIHZhbHVlcy4gVGhleSdyZSB1c2VkIGJ5IFJlYWN0IERldiBUb29scy5cbnZhciBOb0ZsYWdzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIFBlcmZvcm1lZFdvcmsgPVxuLyogICAgICAgICAgICAgICAgKi9cbjE7IC8vIFlvdSBjYW4gY2hhbmdlIHRoZSByZXN0IChhbmQgYWRkIG1vcmUpLlxuXG52YXIgUGxhY2VtZW50ID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBVcGRhdGUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG40O1xudmFyIENoaWxkRGVsZXRpb24gPVxuLyogICAgICAgICAgICAgICAgKi9cbjE2O1xudmFyIENvbnRlbnRSZXNldCA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjMyO1xudmFyIENhbGxiYWNrID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjY0O1xudmFyIERpZENhcHR1cmUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjEyODtcbnZhciBGb3JjZUNsaWVudFJlbmRlciA9XG4vKiAgICAgICAgICAgICovXG4yNTY7XG52YXIgUmVmID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTEyO1xudmFyIFNuYXBzaG90ID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjEwMjQ7XG52YXIgUGFzc2l2ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBIeWRyYXRpbmcgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIFZpc2liaWxpdHkgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjgxOTI7XG52YXIgU3RvcmVDb25zaXN0ZW5jeSA9XG4vKiAgICAgICAgICAgICAqL1xuMTYzODQ7XG52YXIgTGlmZWN5Y2xlRWZmZWN0TWFzayA9IFBhc3NpdmUgfCBVcGRhdGUgfCBDYWxsYmFjayB8IFJlZiB8IFNuYXBzaG90IHwgU3RvcmVDb25zaXN0ZW5jeTsgLy8gVW5pb24gb2YgYWxsIGNvbW1pdCBmbGFncyAoZmxhZ3Mgd2l0aCB0aGUgbGlmZXRpbWUgb2YgYSBwYXJ0aWN1bGFyIGNvbW1pdClcblxudmFyIEhvc3RFZmZlY3RNYXNrID1cbi8qICAgICAgICAgICAgICAgKi9cbjMyNzY3OyAvLyBUaGVzZSBhcmUgbm90IHJlYWxseSBzaWRlIGVmZmVjdHMsIGJ1dCB3ZSBzdGlsbCByZXVzZSB0aGlzIGZpZWxkLlxuXG52YXIgSW5jb21wbGV0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMzI3Njg7XG52YXIgU2hvdWxkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAqL1xuNjU1MzY7XG52YXIgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSA9XG4vKiAqL1xuMTMxMDcyO1xudmFyIEZvcmtlZCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwNDg1NzY7IC8vIFN0YXRpYyB0YWdzIGRlc2NyaWJlIGFzcGVjdHMgb2YgYSBmaWJlciB0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8gYSByZW5kZXIsXG4vLyBlLmcuIGEgZmliZXIgdXNlcyBhIHBhc3NpdmUgZWZmZWN0IChldmVuIGlmIHRoZXJlIGFyZSBubyB1cGRhdGVzIG9uIHRoaXMgcGFydGljdWxhciByZW5kZXIpLlxuLy8gVGhpcyBlbmFibGVzIHVzIHRvIGRlZmVyIG1vcmUgd29yayBpbiB0aGUgdW5tb3VudCBjYXNlLFxuLy8gc2luY2Ugd2UgY2FuIGRlZmVyIHRyYXZlcnNpbmcgdGhlIHRyZWUgZHVyaW5nIGxheW91dCB0byBsb29rIGZvciBQYXNzaXZlIGVmZmVjdHMsXG4vLyBhbmQgaW5zdGVhZCByZWx5IG9uIHRoZSBzdGF0aWMgZmxhZyBhcyBhIHNpZ25hbCB0aGF0IHRoZXJlIG1heSBiZSBjbGVhbnVwIHdvcmsuXG5cbnZhciBSZWZTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yMDk3MTUyO1xudmFyIExheW91dFN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjQxOTQzMDQ7XG52YXIgUGFzc2l2ZVN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAqL1xuODM4ODYwODsgLy8gVGhlc2UgZmxhZ3MgYWxsb3cgdXMgdG8gdHJhdmVyc2UgdG8gZmliZXJzIHRoYXQgaGF2ZSBlZmZlY3RzIG9uIG1vdW50XG4vLyB3aXRob3V0IHRyYXZlcnNpbmcgdGhlIGVudGlyZSB0cmVlIGFmdGVyIGV2ZXJ5IGNvbW1pdCBmb3Jcbi8vIGRvdWJsZSBpbnZva2luZ1xuXG52YXIgTW91bnRMYXlvdXREZXYgPVxuLyogICAgICAgICAgICAgICAqL1xuMTY3NzcyMTY7XG52YXIgTW91bnRQYXNzaXZlRGV2ID1cbi8qICAgICAgICAgICAgICAqL1xuMzM1NTQ0MzI7IC8vIEdyb3VwcyBvZiBmbGFncyB0aGF0IGFyZSB1c2VkIGluIHRoZSBjb21taXQgcGhhc2UgdG8gc2tpcCBvdmVyIHRyZWVzIHRoYXRcbi8vIGRvbid0IGNvbnRhaW4gZWZmZWN0cywgYnkgY2hlY2tpbmcgc3VidHJlZUZsYWdzLlxuXG52YXIgQmVmb3JlTXV0YXRpb25NYXNrID0gLy8gVE9ETzogUmVtb3ZlIFVwZGF0ZSBmbGFnIGZyb20gYmVmb3JlIG11dGF0aW9uIHBoYXNlIGJ5IHJlLWxhbmRpbmcgVmlzaWJpbGl0eVxuLy8gZmxhZyBsb2dpYyAoc2VlICMyMDA0MylcblVwZGF0ZSB8IFNuYXBzaG90IHwgKCAwKTtcbnZhciBNdXRhdGlvbk1hc2sgPSBQbGFjZW1lbnQgfCBVcGRhdGUgfCBDaGlsZERlbGV0aW9uIHwgQ29udGVudFJlc2V0IHwgUmVmIHwgSHlkcmF0aW5nIHwgVmlzaWJpbGl0eTtcbnZhciBMYXlvdXRNYXNrID0gVXBkYXRlIHwgQ2FsbGJhY2sgfCBSZWYgfCBWaXNpYmlsaXR5OyAvLyBUT0RPOiBTcGxpdCBpbnRvIFBhc3NpdmVNb3VudE1hc2sgYW5kIFBhc3NpdmVVbm1vdW50TWFza1xuXG52YXIgUGFzc2l2ZU1hc2sgPSBQYXNzaXZlIHwgQ2hpbGREZWxldGlvbjsgLy8gVW5pb24gb2YgdGFncyB0aGF0IGRvbid0IGdldCByZXNldCBvbiBjbG9uZXMuXG4vLyBUaGlzIGFsbG93cyBjZXJ0YWluIGNvbmNlcHRzIHRvIHBlcnNpc3Qgd2l0aG91dCByZWNhbGN1bGF0aW5nIHRoZW0sXG4vLyBlLmcuIHdoZXRoZXIgYSBzdWJ0cmVlIGNvbnRhaW5zIHBhc3NpdmUgZWZmZWN0cyBvciBwb3J0YWxzLlxuXG52YXIgU3RhdGljTWFzayA9IExheW91dFN0YXRpYyB8IFBhc3NpdmVTdGF0aWMgfCBSZWZTdGF0aWM7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xuZnVuY3Rpb24gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikge1xuICB2YXIgbm9kZSA9IGZpYmVyO1xuICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBmaWJlcjtcblxuICBpZiAoIWZpYmVyLmFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhpcyBtaWdodCBiZSBhIG5ldyB0cmVlIHRoYXQgaXNuJ3QgaW5zZXJ0ZWRcbiAgICAvLyB5ZXQuIElmIGl0IGlzLCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHBlbmRpbmcgaW5zZXJ0aW9uIGVmZmVjdCBvbiBpdC5cbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlO1xuXG4gICAgZG8ge1xuICAgICAgbm9kZSA9IG5leHROb2RlO1xuXG4gICAgICBpZiAoKG5vZGUuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBpbnNlcnRpb24gb3IgaW4tcHJvZ3Jlc3MgaHlkcmF0aW9uLiBUaGUgbmVhcmVzdCBwb3NzaWJsZVxuICAgICAgICAvLyBtb3VudGVkIGZpYmVyIGlzIHRoZSBwYXJlbnQgYnV0IHdlIG5lZWQgdG8gY29udGludWUgdG8gZmlndXJlIG91dFxuICAgICAgICAvLyBpZiB0aGF0IG9uZSBpcyBzdGlsbCBtb3VudGVkLlxuICAgICAgICBuZWFyZXN0TW91bnRlZCA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0Tm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5leHROb2RlKTtcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAobm9kZS5yZXR1cm4pIHtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAobm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgdGhpcyB3YXMgYSBuZXN0ZWQgSG9zdFJvb3Qgd2hlbiB1c2VkIHdpdGhcbiAgICAvLyByZW5kZXJDb250YWluZXJJbnRvU3VidHJlZS5cbiAgICByZXR1cm4gbmVhcmVzdE1vdW50ZWQ7XG4gIH0gLy8gSWYgd2UgZGlkbid0IGhpdCB0aGUgcm9vdCwgdGhhdCBtZWFucyB0aGF0IHdlJ3JlIGluIGFuIGRpc2Nvbm5lY3RlZCB0cmVlXG4gIC8vIHRoYXQgaGFzIGJlZW4gdW5tb3VudGVkLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBzdXNwZW5zZVN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKGZpYmVyKSB7XG4gIHJldHVybiBmaWJlci50YWcgPT09IEhvc3RSb290ID8gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gOiBudWxsO1xufVxuZnVuY3Rpb24gaXNGaWJlck1vdW50ZWQoZmliZXIpIHtcbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cbmZ1bmN0aW9uIGlzTW91bnRlZChjb21wb25lbnQpIHtcbiAge1xuICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdmFyIG93bmVyRmliZXIgPSBvd25lcjtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG93bmVyRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoIWluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcikge1xuICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGlzTW91bnRlZCBpbnNpZGUgaXRzIHJlbmRlcigpIGZ1bmN0aW9uLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lckZpYmVyKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICBpZiAoIWZpYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7XG4gIGlmIChnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSAhPT0gZmliZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmICghYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGVuIHdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiBpdCBpcyBtb3VudGVkLlxuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IGZpYmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gSWYgd2UgaGF2ZSB0d28gcG9zc2libGUgYnJhbmNoZXMsIHdlJ2xsIHdhbGsgYmFja3dhcmRzIHVwIHRvIHRoZSByb290XG4gIC8vIHRvIHNlZSB3aGF0IHBhdGggdGhlIHJvb3QgcG9pbnRzIHRvLiBPbiB0aGUgd2F5IHdlIG1heSBoaXQgb25lIG9mIHRoZVxuICAvLyBzcGVjaWFsIGNhc2VzIGFuZCB3ZSdsbCBkZWFsIHdpdGggdGhlbS5cblxuXG4gIHZhciBhID0gZmliZXI7XG4gIHZhciBiID0gYWx0ZXJuYXRlO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHBhcmVudEEgPSBhLnJldHVybjtcblxuICAgIGlmIChwYXJlbnRBID09PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBhdCB0aGUgcm9vdC5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnRCID0gcGFyZW50QS5hbHRlcm5hdGU7XG5cbiAgICBpZiAocGFyZW50QiA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gYWx0ZXJuYXRlLiBUaGlzIGlzIGFuIHVudXN1YWwgY2FzZS4gQ3VycmVudGx5LCBpdCBvbmx5XG4gICAgICAvLyBoYXBwZW5zIHdoZW4gYSBTdXNwZW5zZSBjb21wb25lbnQgaXMgaGlkZGVuLiBBbiBleHRyYSBmcmFnbWVudCBmaWJlclxuICAgICAgLy8gaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0aGUgU3VzcGVuc2UgZmliZXIgYW5kIGl0cyBjaGlsZHJlbi4gU2tpcFxuICAgICAgLy8gb3ZlciB0aGlzIGV4dHJhIGZyYWdtZW50IGZpYmVyIGFuZCBwcm9jZWVkIHRvIHRoZSBuZXh0IHBhcmVudC5cbiAgICAgIHZhciBuZXh0UGFyZW50ID0gcGFyZW50QS5yZXR1cm47XG5cbiAgICAgIGlmIChuZXh0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGEgPSBiID0gbmV4dFBhcmVudDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSdyZSBhdCB0aGUgcm9vdC5cblxuXG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIGJvdGggY29waWVzIG9mIHRoZSBwYXJlbnQgZmliZXIgcG9pbnQgdG8gdGhlIHNhbWUgY2hpbGQsIHdlIGNhblxuICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBjaGlsZCBpcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBiYWlsb3V0IG9uIGxvd1xuICAgIC8vIHByaW9yaXR5OiB0aGUgYmFpbGVkIG91dCBmaWJlcidzIGNoaWxkIHJldXNlcyB0aGUgY3VycmVudCBjaGlsZC5cblxuXG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCA9PT0gYikge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBCIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGFsdGVybmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH0gLy8gV2Ugc2hvdWxkIG5ldmVyIGhhdmUgYW4gYWx0ZXJuYXRlIGZvciBhbnkgbW91bnRpbmcgbm9kZS4gU28gdGhlIG9ubHlcbiAgICAgIC8vIHdheSB0aGlzIGNvdWxkIHBvc3NpYmx5IGhhcHBlbiBpcyBpZiB0aGlzIHdhcyB1bm1vdW50ZWQsIGlmIGF0IGFsbC5cblxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAoYS5yZXR1cm4gIT09IGIucmV0dXJuKSB7XG4gICAgICAvLyBUaGUgcmV0dXJuIHBvaW50ZXIgb2YgQSBhbmQgdGhlIHJldHVybiBwb2ludGVyIG9mIEIgcG9pbnQgdG8gZGlmZmVyZW50XG4gICAgICAvLyBmaWJlcnMuIFdlIGFzc3VtZSB0aGF0IHJldHVybiBwb2ludGVycyBuZXZlciBjcmlzcy1jcm9zcywgc28gQSBtdXN0XG4gICAgICAvLyBiZWxvbmcgdG8gdGhlIGNoaWxkIHNldCBvZiBBLnJldHVybiwgYW5kIEIgbXVzdCBiZWxvbmcgdG8gdGhlIGNoaWxkXG4gICAgICAvLyBzZXQgb2YgQi5yZXR1cm4uXG4gICAgICBhID0gcGFyZW50QTtcbiAgICAgIGIgPSBwYXJlbnRCO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmV0dXJuIHBvaW50ZXJzIHBvaW50IHRvIHRoZSBzYW1lIGZpYmVyLiBXZSdsbCBoYXZlIHRvIHVzZSB0aGVcbiAgICAgIC8vIGRlZmF1bHQsIHNsb3cgcGF0aDogc2NhbiB0aGUgY2hpbGQgc2V0cyBvZiBlYWNoIHBhcmVudCBhbHRlcm5hdGUgdG8gc2VlXG4gICAgICAvLyB3aGljaCBjaGlsZCBiZWxvbmdzIHRvIHdoaWNoIHNldC5cbiAgICAgIC8vXG4gICAgICAvLyBTZWFyY2ggcGFyZW50IEEncyBjaGlsZCBzZXRcbiAgICAgIHZhciBkaWRGaW5kQ2hpbGQgPSBmYWxzZTtcbiAgICAgIHZhciBfY2hpbGQgPSBwYXJlbnRBLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgLy8gU2VhcmNoIHBhcmVudCBCJ3MgY2hpbGQgc2V0XG4gICAgICAgIF9jaGlsZCA9IHBhcmVudEIuY2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGlkRmluZENoaWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaGlsZCB3YXMgbm90IGZvdW5kIGluIGVpdGhlciBwYXJlbnQgc2V0LiBUaGlzIGluZGljYXRlcyBhIGJ1ZyAnICsgJ2luIFJlYWN0IHJlbGF0ZWQgdG8gdGhlIHJldHVybiBwb2ludGVyLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhLmFsdGVybmF0ZSAhPT0gYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmV0dXJuIGZpYmVycyBzaG91bGQgYWx3YXlzIGJlIGVhY2ggb3RoZXJzJyBhbHRlcm5hdGVzLiBcIiArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfSAvLyBJZiB0aGUgcm9vdCBpcyBub3QgYSBob3N0IGNvbnRhaW5lciwgd2UncmUgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZS4gSS5lLlxuICAvLyB1bm1vdW50ZWQuXG5cblxuICBpZiAoYS50YWcgIT09IEhvc3RSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cblxuICBpZiAoYS5zdGF0ZU5vZGUuY3VycmVudCA9PT0gYSkge1xuICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gT3RoZXJ3aXNlIEIgaGFzIHRvIGJlIGN1cnJlbnQgYnJhbmNoLlxuXG5cbiAgcmV0dXJuIGFsdGVybmF0ZTtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG4gIHJldHVybiBjdXJyZW50UGFyZW50ICE9PSBudWxsID8gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGN1cnJlbnRQYXJlbnQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKG5vZGUpIHtcbiAgLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICB2YXIgbWF0Y2ggPSBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwoY2hpbGQpO1xuXG4gICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuXG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuICByZXR1cm4gY3VycmVudFBhcmVudCAhPT0gbnVsbCA/IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwoY3VycmVudFBhcmVudCkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKG5vZGUpIHtcbiAgLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICBpZiAoY2hpbGQudGFnICE9PSBIb3N0UG9ydGFsKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGNoaWxkKTtcblxuICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVGhpcyBtb2R1bGUgb25seSBleGlzdHMgYXMgYW4gRVNNIHdyYXBwZXIgYXJvdW5kIHRoZSBleHRlcm5hbCBDb21tb25KU1xudmFyIHNjaGVkdWxlQ2FsbGJhY2sgPSBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbnZhciBjYW5jZWxDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbnZhciBzaG91bGRZaWVsZCA9IFNjaGVkdWxlci51bnN0YWJsZV9zaG91bGRZaWVsZDtcbnZhciByZXF1ZXN0UGFpbnQgPSBTY2hlZHVsZXIudW5zdGFibGVfcmVxdWVzdFBhaW50O1xudmFyIG5vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG52YXIgZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBTY2hlZHVsZXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw7XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk7XG52YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk7XG52YXIgTG93UHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTG93UHJpb3JpdHk7XG52YXIgSWRsZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0lkbGVQcmlvcml0eTtcbi8vIHRoaXMgZG9lc24ndCBhY3R1YWxseSBleGlzdCBvbiB0aGUgc2NoZWR1bGVyLCBidXQgaXQgKmRvZXMqXG4vLyBvbiBzY2hlZHVsZXIvdW5zdGFibGVfbW9jaywgd2hpY2ggd2UnbGwgbmVlZCBmb3IgaW50ZXJuYWwgdGVzdGluZ1xudmFyIHVuc3RhYmxlX3lpZWxkVmFsdWUgPSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZTtcbnZhciB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZTtcblxudmFyIHJlbmRlcmVySUQgPSBudWxsO1xudmFyIGluamVjdGVkSG9vayA9IG51bGw7XG52YXIgaW5qZWN0ZWRQcm9maWxpbmdIb29rcyA9IG51bGw7XG52YXIgaGFzTG9nZ2VkRXJyb3IgPSBmYWxzZTtcbnZhciBpc0RldlRvb2xzUHJlc2VudCA9IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnO1xuZnVuY3Rpb24gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscykge1xuICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBObyBEZXZUb29sc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBob29rID0gX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG4gIGlmIChob29rLmlzRGlzYWJsZWQpIHtcbiAgICAvLyBUaGlzIGlzbid0IGEgcmVhbCBwcm9wZXJ0eSBvbiB0aGUgaG9vaywgYnV0IGl0IGNhbiBiZSBzZXQgdG8gb3B0IG91dFxuICAgIC8vIG9mIERldlRvb2xzIGludGVncmF0aW9uIGFuZCBhc3NvY2lhdGVkIHdhcm5pbmdzIGFuZCBsb2dzLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzg3N1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFob29rLnN1cHBvcnRzRmliZXIpIHtcbiAgICB7XG4gICAgICBlcnJvcignVGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFJlYWN0IERldlRvb2xzIGlzIHRvbyBvbGQgYW5kIHdpbGwgbm90IHdvcmsgJyArICd3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUmVhY3QuIFBsZWFzZSB1cGRhdGUgUmVhY3QgRGV2VG9vbHMuICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyk7XG4gICAgfSAvLyBEZXZUb29scyBleGlzdHMsIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3Qgc3VwcG9ydCBGaWJlci5cblxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgIC8vIENvbmRpdGlvbmFsbHkgaW5qZWN0IHRoZXNlIGhvb2tzIG9ubHkgaWYgVGltZWxpbmUgcHJvZmlsZXIgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQuXG4gICAgICAvLyBUaGlzIGdpdmVzIERldlRvb2xzIGEgd2F5IHRvIGZlYXR1cmUgZGV0ZWN0IHRoYXQgaXNuJ3QgdGllZCB0byB2ZXJzaW9uIG51bWJlclxuICAgICAgLy8gKHNpbmNlIHByb2ZpbGluZyBhbmQgdGltZWxpbmUgYXJlIGNvbnRyb2xsZWQgYnkgZGlmZmVyZW50IGZlYXR1cmUgZmxhZ3MpLlxuICAgICAgaW50ZXJuYWxzID0gYXNzaWduKHt9LCBpbnRlcm5hbHMsIHtcbiAgICAgICAgZ2V0TGFuZUxhYmVsTWFwOiBnZXRMYW5lTGFiZWxNYXAsXG4gICAgICAgIGluamVjdFByb2ZpbGluZ0hvb2tzOiBpbmplY3RQcm9maWxpbmdIb29rc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyZXJJRCA9IGhvb2suaW5qZWN0KGludGVybmFscyk7IC8vIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGluamVjdGVkLCBzbyBub3cgaXQgaXMgc2FmZSB0byBzZXQgdXAgaG9va3MuXG5cbiAgICBpbmplY3RlZEhvb2sgPSBob29rO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBDYXRjaCBhbGwgZXJyb3JzIGJlY2F1c2UgaXQgaXMgdW5zYWZlIHRvIHRocm93IGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcy4nLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChob29rLmNoZWNrRENFKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcmVhbCBEZXZUb29scy5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGxpa2VseSBhIGhvb2sgaW5zdGFsbGVkIGJ5IEZhc3QgUmVmcmVzaCBydW50aW1lLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gb25TY2hlZHVsZVJvb3Qocm9vdCwgY2hpbGRyZW4pIHtcbiAge1xuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCBjaGlsZHJlbik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCAhaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0Um9vdChyb290LCBldmVudFByaW9yaXR5KSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgZGlkRXJyb3IgPSAocm9vdC5jdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IERpZENhcHR1cmU7XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50UHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSWRsZVByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHNjaGVkdWxlclByaW9yaXR5LCBkaWRFcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgdW5kZWZpbmVkLCBkaWRFcnJvcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uUG9zdENvbW1pdFJvb3Qocm9vdCkge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Qb3N0Q29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0VW5tb3VudChmaWJlcikge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50KHJlbmRlcmVySUQsIGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMobmV3SXNTdHJpY3RNb2RlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIHVuc3RhYmxlX3lpZWxkVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFdlJ3JlIGluIGEgdGVzdCBiZWNhdXNlIFNjaGVkdWxlci51bnN0YWJsZV95aWVsZFZhbHVlIG9ubHkgZXhpc3RzXG4gICAgICAvLyBpbiBTY2hlZHVsZXJNb2NrLiBUbyByZWR1Y2UgdGhlIG5vaXNlIGluIHN0cmljdCBtb2RlIHRlc3RzLFxuICAgICAgLy8gc3VwcHJlc3Mgd2FybmluZ3MgYW5kIGRpc2FibGUgc2NoZWR1bGVyIHlpZWxkaW5nIGR1cmluZyB0aGUgZG91YmxlIHJlbmRlclxuICAgICAgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUobmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIHNldFN1cHByZXNzV2FybmluZyhuZXdJc1N0cmljdE1vZGUpO1xuICAgIH1cblxuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5zZXRTdHJpY3RNb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZShyZW5kZXJlcklELCBuZXdJc1N0cmljdE1vZGUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gUHJvZmlsZXIgQVBJIGhvb2tzXG5cbmZ1bmN0aW9uIGluamVjdFByb2ZpbGluZ0hvb2tzKHByb2ZpbGluZ0hvb2tzKSB7XG4gIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBwcm9maWxpbmdIb29rcztcbn1cblxuZnVuY3Rpb24gZ2V0TGFuZUxhYmVsTWFwKCkge1xuICB7XG4gICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgbGFuZSA9IDE7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgVG90YWxMYW5lczsgaW5kZXgrKykge1xuICAgICAgdmFyIGxhYmVsID0gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpO1xuICAgICAgbWFwLnNldChsYW5lLCBsYWJlbCk7XG4gICAgICBsYW5lICo9IDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbW1pdFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZmliZXIsIHdha2VhYmxlLCBsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFN1c3BlbmRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50U3VzcGVuZGVkKGZpYmVyLCB3YWtlYWJsZSwgbGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlcllpZWxkZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIE5vTW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDsgLy8gVE9ETzogUmVtb3ZlIENvbmN1cnJlbnRNb2RlIGJ5IHJlYWRpbmcgZnJvbSB0aGUgcm9vdCB0YWcgaW5zdGVhZFxuXG52YXIgQ29uY3VycmVudE1vZGUgPVxuLyogICAgICAgICAgICAgICAgICovXG4xO1xudmFyIFByb2ZpbGVNb2RlID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBTdHJpY3RMZWdhY3lNb2RlID1cbi8qICAgICAgICAgICAgICAgKi9cbjg7XG52YXIgU3RyaWN0RWZmZWN0c01vZGUgPVxuLyogICAgICAgICAgICAgICovXG4xNjtcblxuLy8gVE9ETzogVGhpcyBpcyBwcmV0dHkgd2VsbCBzdXBwb3J0ZWQgYnkgYnJvd3NlcnMuIE1heWJlIHdlIGNhbiBkcm9wIGl0LlxudmFyIGNsejMyID0gTWF0aC5jbHozMiA/IE1hdGguY2x6MzIgOiBjbHozMkZhbGxiYWNrOyAvLyBDb3VudCBsZWFkaW5nIHplcm9zLlxuLy8gQmFzZWQgb246XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL2NsejMyXG5cbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcblxuZnVuY3Rpb24gY2x6MzJGYWxsYmFjayh4KSB7XG4gIHZhciBhc1VpbnQgPSB4ID4+PiAwO1xuXG4gIGlmIChhc1VpbnQgPT09IDApIHtcbiAgICByZXR1cm4gMzI7XG4gIH1cblxuICByZXR1cm4gMzEgLSAobG9nKGFzVWludCkgLyBMTjIgfCAwKSB8IDA7XG59XG5cbi8vIElmIHRob3NlIHZhbHVlcyBhcmUgY2hhbmdlZCB0aGF0IHBhY2thZ2Ugc2hvdWxkIGJlIHJlYnVpbHQgYW5kIHJlZGVwbG95ZWQuXG5cbnZhciBUb3RhbExhbmVzID0gMzE7XG52YXIgTm9MYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIE5vTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgU3luY0xhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTtcbnZhciBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lID1cbi8qICAgICovXG4yO1xudmFyIElucHV0Q29udGludW91c0xhbmUgPVxuLyogICAgICAgICAgICAgKi9cbjQ7XG52YXIgRGVmYXVsdEh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAqL1xuODtcbnZhciBEZWZhdWx0TGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4xNjtcbnZhciBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgVHJhbnNpdGlvbkxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE5NDI0MDtcbnZhciBUcmFuc2l0aW9uTGFuZTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgVHJhbnNpdGlvbkxhbmUyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEyODtcbnZhciBUcmFuc2l0aW9uTGFuZTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjU2O1xudmFyIFRyYW5zaXRpb25MYW5lNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7XG52YXIgVHJhbnNpdGlvbkxhbmU1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwMjQ7XG52YXIgVHJhbnNpdGlvbkxhbmU2ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjIwNDg7XG52YXIgVHJhbnNpdGlvbkxhbmU3ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVHJhbnNpdGlvbkxhbmU4ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgxOTI7XG52YXIgVHJhbnNpdGlvbkxhbmU5ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE2Mzg0O1xudmFyIFRyYW5zaXRpb25MYW5lMTAgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4zMjc2ODtcbnZhciBUcmFuc2l0aW9uTGFuZTExID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjU1MzY7XG52YXIgVHJhbnNpdGlvbkxhbmUxMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEzMTA3MjtcbnZhciBUcmFuc2l0aW9uTGFuZTEzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjYyMTQ0O1xudmFyIFRyYW5zaXRpb25MYW5lMTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG41MjQyODg7XG52YXIgVHJhbnNpdGlvbkxhbmUxNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwNDg1NzY7XG52YXIgVHJhbnNpdGlvbkxhbmUxNiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjIwOTcxNTI7XG52YXIgUmV0cnlMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTMwMDIzNDI0O1xudmFyIFJldHJ5TGFuZTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG40MTk0MzA0O1xudmFyIFJldHJ5TGFuZTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG44Mzg4NjA4O1xudmFyIFJldHJ5TGFuZTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xNjc3NzIxNjtcbnZhciBSZXRyeUxhbmU0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMzM1NTQ0MzI7XG52YXIgUmV0cnlMYW5lNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY3MTA4ODY0O1xudmFyIFNvbWVSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xudmFyIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgKi9cbjEzNDIxNzcyODtcbnZhciBOb25JZGxlTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4yNjg0MzU0NTU7XG52YXIgSWRsZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAqL1xuMjY4NDM1NDU2O1xudmFyIElkbGVMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUzNjg3MDkxMjtcbnZhciBPZmZzY3JlZW5MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMDczNzQxODI0OyAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBleHBlcmltZW50YWwgdGltZWxpbmUgKHJlYWN0LWRldnRvb2xzLXRpbWVsaW5lKVxuLy8gSXQgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBMYW5lcyB2YWx1ZXMgYWJvdmUuXG5cbmZ1bmN0aW9uIGdldExhYmVsRm9yTGFuZShsYW5lKSB7XG4gIHtcbiAgICBpZiAobGFuZSAmIFN5bmNMYW5lKSB7XG4gICAgICByZXR1cm4gJ1N5bmMnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdJbnB1dENvbnRpbnVvdXNIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSW5wdXRDb250aW51b3VzTGFuZSkge1xuICAgICAgcmV0dXJuICdJbnB1dENvbnRpbnVvdXMnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgRGVmYXVsdEh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnRGVmYXVsdEh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBEZWZhdWx0TGFuZSkge1xuICAgICAgcmV0dXJuICdEZWZhdWx0JztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ1RyYW5zaXRpb25IeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgVHJhbnNpdGlvbkxhbmVzKSB7XG4gICAgICByZXR1cm4gJ1RyYW5zaXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgUmV0cnlMYW5lcykge1xuICAgICAgcmV0dXJuICdSZXRyeSc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ1NlbGVjdGl2ZUh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJZGxlSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdJZGxlSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElkbGVMYW5lKSB7XG4gICAgICByZXR1cm4gJ0lkbGUnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgcmV0dXJuICdPZmZzY3JlZW4nO1xuICAgIH1cbiAgfVxufVxudmFyIE5vVGltZXN0YW1wID0gLTE7XG52YXIgbmV4dFRyYW5zaXRpb25MYW5lID0gVHJhbnNpdGlvbkxhbmUxO1xudmFyIG5leHRSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xuXG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhsYW5lcykge1xuICBzd2l0Y2ggKGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpKSB7XG4gICAgY2FzZSBTeW5jTGFuZTpcbiAgICAgIHJldHVybiBTeW5jTGFuZTtcblxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgcmV0dXJuIElucHV0Q29udGludW91c0xhbmU7XG5cbiAgICBjYXNlIERlZmF1bHRIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIERlZmF1bHRIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICAgIHJldHVybiBEZWZhdWx0TGFuZTtcblxuICAgIGNhc2UgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgICByZXR1cm4gbGFuZXMgJiBUcmFuc2l0aW9uTGFuZXM7XG5cbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgcmV0dXJuIGxhbmVzICYgUmV0cnlMYW5lcztcblxuICAgIGNhc2UgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBJZGxlSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgICByZXR1cm4gSWRsZUxhbmU7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkxhbmU6XG4gICAgICByZXR1cm4gT2Zmc2NyZWVuTGFuZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH0gLy8gVGhpcyBzaG91bGRuJ3QgYmUgcmVhY2hhYmxlLCBidXQgYXMgYSBmYWxsYmFjaywgcmV0dXJuIHRoZSBlbnRpcmUgYml0bWFzay5cblxuXG4gICAgICByZXR1cm4gbGFuZXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmV4dExhbmVzKHJvb3QsIHdpcExhbmVzKSB7XG4gIC8vIEVhcmx5IGJhaWxvdXQgaWYgdGhlcmUncyBubyBwZW5kaW5nIHdvcmsgbGVmdC5cbiAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuXG4gIGlmIChwZW5kaW5nTGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBuZXh0TGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuICB2YXIgcGluZ2VkTGFuZXMgPSByb290LnBpbmdlZExhbmVzOyAvLyBEbyBub3Qgd29yayBvbiBhbnkgaWRsZSB3b3JrIHVudGlsIGFsbCB0aGUgbm9uLWlkbGUgd29yayBoYXMgZmluaXNoZWQsXG4gIC8vIGV2ZW4gaWYgdGhlIHdvcmsgaXMgc3VzcGVuZGVkLlxuXG4gIHZhciBub25JZGxlUGVuZGluZ0xhbmVzID0gcGVuZGluZ0xhbmVzICYgTm9uSWRsZUxhbmVzO1xuXG4gIGlmIChub25JZGxlUGVuZGluZ0xhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIG5vbklkbGVVbmJsb2NrZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICBpZiAobm9uSWRsZVVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlVW5ibG9ja2VkTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9uSWRsZVBpbmdlZExhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIHBpbmdlZExhbmVzO1xuXG4gICAgICBpZiAobm9uSWRsZVBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKG5vbklkbGVQaW5nZWRMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoZSBvbmx5IHJlbWFpbmluZyB3b3JrIGlzIElkbGUuXG4gICAgdmFyIHVuYmxvY2tlZExhbmVzID0gcGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzO1xuXG4gICAgaWYgKHVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyh1bmJsb2NrZWRMYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwaW5nZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhwaW5nZWRMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgcmVhY2hhYmxlIGlmIHdlJ3JlIHN1c3BlbmRlZFxuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgaW4gdGhpcyBwYXRoIGlmIGEgZmFsbGJhY2sgdGltZXIgaXMgbm90IHNjaGVkdWxlZC5cbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfSAvLyBJZiB3ZSdyZSBhbHJlYWR5IGluIHRoZSBtaWRkbGUgb2YgYSByZW5kZXIsIHN3aXRjaGluZyBsYW5lcyB3aWxsIGludGVycnVwdFxuICAvLyBpdCBhbmQgd2UnbGwgbG9zZSBvdXIgcHJvZ3Jlc3MuIFdlIHNob3VsZCBvbmx5IGRvIHRoaXMgaWYgdGhlIG5ldyBsYW5lcyBhcmVcbiAgLy8gaGlnaGVyIHByaW9yaXR5LlxuXG5cbiAgaWYgKHdpcExhbmVzICE9PSBOb0xhbmVzICYmIHdpcExhbmVzICE9PSBuZXh0TGFuZXMgJiYgLy8gSWYgd2UgYWxyZWFkeSBzdXNwZW5kZWQgd2l0aCBhIGRlbGF5LCB0aGVuIGludGVycnVwdGluZyBpcyBmaW5lLiBEb24ndFxuICAvLyBib3RoZXIgd2FpdGluZyB1bnRpbCB0aGUgcm9vdCBpcyBjb21wbGV0ZS5cbiAgKHdpcExhbmVzICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgdmFyIG5leHRMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShuZXh0TGFuZXMpO1xuICAgIHZhciB3aXBMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSh3aXBMYW5lcyk7XG5cbiAgICBpZiAoIC8vIFRlc3RzIHdoZXRoZXIgdGhlIG5leHQgbGFuZSBpcyBlcXVhbCBvciBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSB3aXBcbiAgICAvLyBvbmUuIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYml0cyBkZWNyZWFzZSBpbiBwcmlvcml0eSBhcyB5b3UgZ28gbGVmdC5cbiAgICBuZXh0TGFuZSA+PSB3aXBMYW5lIHx8IC8vIERlZmF1bHQgcHJpb3JpdHkgdXBkYXRlcyBzaG91bGQgbm90IGludGVycnVwdCB0cmFuc2l0aW9uIHVwZGF0ZXMuIFRoZVxuICAgIC8vIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIGRlZmF1bHQgdXBkYXRlcyBhbmQgdHJhbnNpdGlvbiB1cGRhdGVzIGlzIHRoYXRcbiAgICAvLyBkZWZhdWx0IHVwZGF0ZXMgZG8gbm90IHN1cHBvcnQgcmVmcmVzaCB0cmFuc2l0aW9ucy5cbiAgICBuZXh0TGFuZSA9PT0gRGVmYXVsdExhbmUgJiYgKHdpcExhbmUgJiBUcmFuc2l0aW9uTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAvLyBLZWVwIHdvcmtpbmcgb24gdGhlIGV4aXN0aW5nIGluLXByb2dyZXNzIHRyZWUuIERvIG5vdCBpbnRlcnJ1cHQuXG4gICAgICByZXR1cm4gd2lwTGFuZXM7XG4gICAgfVxuICB9XG5cbiAgaWYgKChuZXh0TGFuZXMgJiBJbnB1dENvbnRpbnVvdXNMYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIC8vIFdoZW4gdXBkYXRlcyBhcmUgc3luYyBieSBkZWZhdWx0LCB3ZSBlbnRhbmdsZSBjb250aW51b3VzIHByaW9yaXR5IHVwZGF0ZXNcbiAgICAvLyBhbmQgZGVmYXVsdCB1cGRhdGVzLCBzbyB0aGV5IHJlbmRlciBpbiB0aGUgc2FtZSBiYXRjaC4gVGhlIG9ubHkgcmVhc29uXG4gICAgLy8gdGhleSB1c2Ugc2VwYXJhdGUgbGFuZXMgaXMgYmVjYXVzZSBjb250aW51b3VzIHVwZGF0ZXMgc2hvdWxkIGludGVycnVwdFxuICAgIC8vIHRyYW5zaXRpb25zLCBidXQgZGVmYXVsdCB1cGRhdGVzIHNob3VsZCBub3QuXG4gICAgbmV4dExhbmVzIHw9IHBlbmRpbmdMYW5lcyAmIERlZmF1bHRMYW5lO1xuICB9IC8vIENoZWNrIGZvciBlbnRhbmdsZWQgbGFuZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBiYXRjaC5cbiAgLy9cbiAgLy8gQSBsYW5lIGlzIHNhaWQgdG8gYmUgZW50YW5nbGVkIHdpdGggYW5vdGhlciB3aGVuIGl0J3Mgbm90IGFsbG93ZWQgdG8gcmVuZGVyXG4gIC8vIGluIGEgYmF0Y2ggdGhhdCBkb2VzIG5vdCBhbHNvIGluY2x1ZGUgdGhlIG90aGVyIGxhbmUuIFR5cGljYWxseSB3ZSBkbyB0aGlzXG4gIC8vIHdoZW4gbXVsdGlwbGUgdXBkYXRlcyBoYXZlIHRoZSBzYW1lIHNvdXJjZSwgYW5kIHdlIG9ubHkgd2FudCB0byByZXNwb25kIHRvXG4gIC8vIHRoZSBtb3N0IHJlY2VudCBldmVudCBmcm9tIHRoYXQgc291cmNlLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgd2UgYXBwbHkgZW50YW5nbGVtZW50cyAqYWZ0ZXIqIGNoZWNraW5nIGZvciBwYXJ0aWFsIHdvcmsgYWJvdmUuXG4gIC8vIFRoaXMgbWVhbnMgdGhhdCBpZiBhIGxhbmUgaXMgZW50YW5nbGVkIGR1cmluZyBhbiBpbnRlcmxlYXZlZCBldmVudCB3aGlsZVxuICAvLyBpdCdzIGFscmVhZHkgcmVuZGVyaW5nLCB3ZSB3b24ndCBpbnRlcnJ1cHQgaXQuIFRoaXMgaXMgaW50ZW50aW9uYWwsIHNpbmNlXG4gIC8vIGVudGFuZ2xlbWVudCBpcyB1c3VhbGx5IFwiYmVzdCBlZmZvcnRcIjogd2UnbGwgdHJ5IG91ciBiZXN0IHRvIHJlbmRlciB0aGVcbiAgLy8gbGFuZXMgaW4gdGhlIHNhbWUgYmF0Y2gsIGJ1dCBpdCdzIG5vdCB3b3J0aCB0aHJvd2luZyBvdXQgcGFydGlhbGx5XG4gIC8vIGNvbXBsZXRlZCB3b3JrIGluIG9yZGVyIHRvIGRvIGl0LlxuICAvLyBUT0RPOiBSZWNvbnNpZGVyIHRoaXMuIFRoZSBjb3VudGVyLWFyZ3VtZW50IGlzIHRoYXQgdGhlIHBhcnRpYWwgd29ya1xuICAvLyByZXByZXNlbnRzIGFuIGludGVybWVkaWF0ZSBzdGF0ZSwgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byBzaG93IHRvIHRoZSB1c2VyLlxuICAvLyBBbmQgYnkgc3BlbmRpbmcgZXh0cmEgdGltZSBmaW5pc2hpbmcgaXQsIHdlJ3JlIGluY3JlYXNpbmcgdGhlIGFtb3VudCBvZlxuICAvLyB0aW1lIGl0IHRha2VzIHRvIHNob3cgdGhlIGZpbmFsIHN0YXRlLCB3aGljaCBpcyB3aGF0IHRoZXkgYXJlIGFjdHVhbGx5XG4gIC8vIHdhaXRpbmcgZm9yLlxuICAvL1xuICAvLyBGb3IgdGhvc2UgZXhjZXB0aW9ucyB3aGVyZSBlbnRhbmdsZW1lbnQgaXMgc2VtYW50aWNhbGx5IGltcG9ydGFudCwgbGlrZVxuICAvLyB1c2VNdXRhYmxlU291cmNlLCB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gcGFydGlhbCB3b3JrIGF0IHRoZVxuICAvLyB0aW1lIHdlIGFwcGx5IHRoZSBlbnRhbmdsZW1lbnQuXG5cblxuICB2YXIgZW50YW5nbGVkTGFuZXMgPSByb290LmVudGFuZ2xlZExhbmVzO1xuXG4gIGlmIChlbnRhbmdsZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICAgIHZhciBsYW5lcyA9IG5leHRMYW5lcyAmIGVudGFuZ2xlZExhbmVzO1xuXG4gICAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgICBuZXh0TGFuZXMgfD0gZW50YW5nbGVtZW50c1tpbmRleF07XG4gICAgICBsYW5lcyAmPSB+bGFuZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dExhbmVzO1xufVxuZnVuY3Rpb24gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcykge1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciBldmVudFRpbWUgPSBldmVudFRpbWVzW2luZGV4XTtcblxuICAgIGlmIChldmVudFRpbWUgPiBtb3N0UmVjZW50RXZlbnRUaW1lKSB7XG4gICAgICBtb3N0UmVjZW50RXZlbnRUaW1lID0gZXZlbnRUaW1lO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG5cbiAgcmV0dXJuIG1vc3RSZWNlbnRFdmVudFRpbWU7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVFeHBpcmF0aW9uVGltZShsYW5lLCBjdXJyZW50VGltZSkge1xuICBzd2l0Y2ggKGxhbmUpIHtcbiAgICBjYXNlIFN5bmNMYW5lOlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICAvLyBVc2VyIGludGVyYWN0aW9ucyBzaG91bGQgZXhwaXJlIHNsaWdodGx5IG1vcmUgcXVpY2tseS5cbiAgICAgIC8vXG4gICAgICAvLyBOT1RFOiBUaGlzIGlzIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBjb25zdGFudCBhcyBpbiBTY2hlZHVsZXIuanMuXG4gICAgICAvLyBXaGVuIHdlIG1hZGUgaXQgbGFyZ2VyLCBhIHByb2R1Y3QgbWV0cmljIGluIHd3dyByZWdyZXNzZWQsIHN1Z2dlc3RpbmdcbiAgICAgIC8vIHRoZXJlJ3MgYSB1c2VyIGludGVyYWN0aW9uIHRoYXQncyBiZWluZyBzdGFydmVkIGJ5IGEgc2VyaWVzIG9mXG4gICAgICAvLyBzeW5jaHJvbm91cyB1cGRhdGVzLiBJZiB0aGF0IHRoZW9yeSBpcyBjb3JyZWN0LCB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzXG4gICAgICAvLyB0byBmaXggdGhlIHN0YXJ2YXRpb24uIEhvd2V2ZXIsIHRoaXMgc2NlbmFyaW8gc3VwcG9ydHMgdGhlIGlkZWEgdGhhdFxuICAgICAgLy8gZXhwaXJhdGlvbiB0aW1lcyBhcmUgYW4gaW1wb3J0YW50IHNhZmVndWFyZCB3aGVuIHN0YXJ2YXRpb25cbiAgICAgIC8vIGRvZXMgaGFwcGVuLlxuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgMjUwO1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgIGNhc2UgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgNTAwMDtcblxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICAvLyBUT0RPOiBSZXRyaWVzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGV4cGlyZSBpZiB0aGV5IGFyZSBDUFUgYm91bmQgZm9yXG4gICAgICAvLyB0b28gbG9uZywgYnV0IHdoZW4gSSBtYWRlIHRoaXMgY2hhbmdlIGl0IGNhdXNlZCBhIHNwaWtlIGluIGJyb3dzZXJcbiAgICAgIC8vIGNyYXNoZXMuIFRoZXJlIG11c3QgYmUgc29tZSBvdGhlciB1bmRlcmx5aW5nIGJ1Zzsgbm90IHN1cGVyIHVyZ2VudCBidXRcbiAgICAgIC8vIGlkZWFsbHkgc2hvdWxkIGZpZ3VyZSBvdXQgd2h5IGFuZCBmaXggaXQuIFVuZm9ydHVuYXRlbHkgd2UgZG9uJ3QgaGF2ZVxuICAgICAgLy8gYSByZXBybyBmb3IgdGhlIGNyYXNoZXMsIG9ubHkgZGV0ZWN0ZWQgdmlhIHByb2R1Y3Rpb24gbWV0cmljcy5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcblxuICAgIGNhc2UgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElkbGVIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgY2FzZSBPZmZzY3JlZW5MYW5lOlxuICAgICAgLy8gQW55dGhpbmcgaWRsZSBwcmlvcml0eSBvciBsb3dlciBzaG91bGQgbmV2ZXIgZXhwaXJlLlxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSkge1xuICAvLyBUT0RPOiBUaGlzIGdldHMgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgeWllbGQuIFdlIGNhbiBvcHRpbWl6ZSBieSBzdG9yaW5nXG4gIC8vIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUgb24gdGhlIHJvb3QuIFRoZW4gdXNlIHRoYXQgdG8gcXVpY2tseSBiYWlsIG91dFxuICAvLyBvZiB0aGlzIGZ1bmN0aW9uLlxuICB2YXIgcGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBwZW5kaW5nIGxhbmVzIGFuZCBjaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZWlyXG4gIC8vIGV4cGlyYXRpb24gdGltZS4gSWYgc28sIHdlJ2xsIGFzc3VtZSB0aGUgdXBkYXRlIGlzIGJlaW5nIHN0YXJ2ZWQgYW5kIG1hcmtcbiAgLy8gaXQgYXMgZXhwaXJlZCB0byBmb3JjZSBpdCB0byBmaW5pc2guXG5cbiAgdmFyIGxhbmVzID0gcGVuZGluZ0xhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWVzW2luZGV4XTtcblxuICAgIGlmIChleHBpcmF0aW9uVGltZSA9PT0gTm9UaW1lc3RhbXApIHtcbiAgICAgIC8vIEZvdW5kIGEgcGVuZGluZyBsYW5lIHdpdGggbm8gZXhwaXJhdGlvbiB0aW1lLiBJZiBpdCdzIG5vdCBzdXNwZW5kZWQsIG9yXG4gICAgICAvLyBpZiBpdCdzIHBpbmdlZCwgYXNzdW1lIGl0J3MgQ1BVLWJvdW5kLiBDb21wdXRlIGEgbmV3IGV4cGlyYXRpb24gdGltZVxuICAgICAgLy8gdXNpbmcgdGhlIGN1cnJlbnQgdGltZS5cbiAgICAgIGlmICgobGFuZSAmIHN1c3BlbmRlZExhbmVzKSA9PT0gTm9MYW5lcyB8fCAobGFuZSAmIHBpbmdlZExhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgICAgICAvLyBBc3N1bWVzIHRpbWVzdGFtcHMgYXJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy5cbiAgICAgICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IGNvbXB1dGVFeHBpcmF0aW9uVGltZShsYW5lLCBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChleHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGhpcyBsYW5lIGV4cGlyZWRcbiAgICAgIHJvb3QuZXhwaXJlZExhbmVzIHw9IGxhbmU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn0gLy8gVGhpcyByZXR1cm5zIHRoZSBoaWdoZXN0IHByaW9yaXR5IHBlbmRpbmcgbGFuZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXlcbi8vIGFyZSBzdXNwZW5kZWQuXG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eVBlbmRpbmdMYW5lcyhyb290KSB7XG4gIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhyb290LnBlbmRpbmdMYW5lcyk7XG59XG5mdW5jdGlvbiBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KSB7XG4gIHZhciBldmVyeXRoaW5nQnV0T2Zmc2NyZWVuID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+T2Zmc2NyZWVuTGFuZTtcblxuICBpZiAoZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybiBldmVyeXRoaW5nQnV0T2Zmc2NyZWVuO1xuICB9XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gJiBPZmZzY3JlZW5MYW5lKSB7XG4gICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG4gIH1cblxuICByZXR1cm4gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzU3luY0xhbmUobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFN5bmNMYW5lKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzTm9uSWRsZVdvcmsobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIE5vbklkbGVMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlSZXRyaWVzKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBSZXRyeUxhbmVzKSA9PT0gbGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlOb25VcmdlbnRMYW5lcyhsYW5lcykge1xuICB2YXIgVXJnZW50TGFuZXMgPSBTeW5jTGFuZSB8IElucHV0Q29udGludW91c0xhbmUgfCBEZWZhdWx0TGFuZTtcbiAgcmV0dXJuIChsYW5lcyAmIFVyZ2VudExhbmVzKSA9PT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKSB7XG5cbiAgdmFyIFN5bmNEZWZhdWx0TGFuZXMgPSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lIHwgSW5wdXRDb250aW51b3VzTGFuZSB8IERlZmF1bHRIeWRyYXRpb25MYW5lIHwgRGVmYXVsdExhbmU7XG4gIHJldHVybiAobGFuZXMgJiBTeW5jRGVmYXVsdExhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhIHNlcGFyYXRlIGNoZWNrIGZyb20gaW5jbHVkZXNCbG9ja2luZ0xhbmUgYmVjYXVzZSBhIGxhbmUgY2FuXG4gIC8vIGV4cGlyZSBhZnRlciBhIHJlbmRlciBoYXMgYWxyZWFkeSBzdGFydGVkLlxuICByZXR1cm4gKGxhbmVzICYgcm9vdC5leHBpcmVkTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNUcmFuc2l0aW9uTGFuZShsYW5lKSB7XG4gIHJldHVybiAobGFuZSAmIFRyYW5zaXRpb25MYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpIHtcbiAgLy8gQ3ljbGUgdGhyb3VnaCB0aGUgbGFuZXMsIGFzc2lnbmluZyBlYWNoIG5ldyB0cmFuc2l0aW9uIHRvIHRoZSBuZXh0IGxhbmUuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgbWVhbnMgZXZlcnkgdHJhbnNpdGlvbiBnZXRzIGl0cyBvd24gbGFuZSwgdW50aWwgd2VcbiAgLy8gcnVuIG91dCBvZiBsYW5lcyBhbmQgY3ljbGUgYmFjayB0byB0aGUgYmVnaW5uaW5nLlxuICB2YXIgbGFuZSA9IG5leHRUcmFuc2l0aW9uTGFuZTtcbiAgbmV4dFRyYW5zaXRpb25MYW5lIDw8PSAxO1xuXG4gIGlmICgobmV4dFRyYW5zaXRpb25MYW5lICYgVHJhbnNpdGlvbkxhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIG5leHRUcmFuc2l0aW9uTGFuZSA9IFRyYW5zaXRpb25MYW5lMTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gY2xhaW1OZXh0UmV0cnlMYW5lKCkge1xuICB2YXIgbGFuZSA9IG5leHRSZXRyeUxhbmU7XG4gIG5leHRSZXRyeUxhbmUgPDw9IDE7XG5cbiAgaWYgKChuZXh0UmV0cnlMYW5lICYgUmV0cnlMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBuZXh0UmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcykge1xuICByZXR1cm4gbGFuZXMgJiAtbGFuZXM7XG59XG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZShsYW5lcykge1xuICAvLyBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZ2V0cyBpbmxpbmVkLiBPbmx5IGV4aXN0cyBzbyB0byBjb21tdW5pY2F0ZSB0aGF0IGl0XG4gIC8vIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGJpdCBpcyBzZWxlY3RlZDsgeW91IGNhbiBwaWNrIGFueSBiaXQgd2l0aG91dFxuICAvLyBhZmZlY3RpbmcgdGhlIGFsZ29yaXRobXMgd2hlcmUgaXRzIHVzZWQuIEhlcmUgSSdtIHVzaW5nXG4gIC8vIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUgYmVjYXVzZSBpdCByZXF1aXJlcyB0aGUgZmV3ZXN0IG9wZXJhdGlvbnMuXG4gIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcykge1xuICByZXR1cm4gMzEgLSBjbHozMihsYW5lcyk7XG59XG5cbmZ1bmN0aW9uIGxhbmVUb0luZGV4KGxhbmUpIHtcbiAgcmV0dXJuIHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZSk7XG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVzU29tZUxhbmUoYSwgYikge1xuICByZXR1cm4gKGEgJiBiKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGlzU3Vic2V0T2ZMYW5lcyhzZXQsIHN1YnNldCkge1xuICByZXR1cm4gKHNldCAmIHN1YnNldCkgPT09IHN1YnNldDtcbn1cbmZ1bmN0aW9uIG1lcmdlTGFuZXMoYSwgYikge1xuICByZXR1cm4gYSB8IGI7XG59XG5mdW5jdGlvbiByZW1vdmVMYW5lcyhzZXQsIHN1YnNldCkge1xuICByZXR1cm4gc2V0ICYgfnN1YnNldDtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdExhbmVzKGEsIGIpIHtcbiAgcmV0dXJuIGEgJiBiO1xufSAvLyBTZWVtcyByZWR1bmRhbnQsIGJ1dCBpdCBjaGFuZ2VzIHRoZSB0eXBlIGZyb20gYSBzaW5nbGUgbGFuZSAodXNlZCBmb3Jcbi8vIHVwZGF0ZXMpIHRvIGEgZ3JvdXAgb2YgbGFuZXMgKHVzZWQgZm9yIGZsdXNoaW5nIHdvcmspLlxuXG5mdW5jdGlvbiBsYW5lVG9MYW5lcyhsYW5lKSB7XG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gaGlnaGVyUHJpb3JpdHlMYW5lKGEsIGIpIHtcbiAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXQgcmFuZ2VzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICByZXR1cm4gYSAhPT0gTm9MYW5lICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHtcbiAgLy8gSW50ZW50aW9uYWxseSBwdXNoaW5nIG9uZSBieSBvbmUuXG4gIC8vIGh0dHBzOi8vdjguZGV2L2Jsb2cvZWxlbWVudHMta2luZHMjYXZvaWQtY3JlYXRpbmctaG9sZXNcbiAgdmFyIGxhbmVNYXAgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IFRvdGFsTGFuZXM7IGkrKykge1xuICAgIGxhbmVNYXAucHVzaChpbml0aWFsKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lTWFwO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHVwZGF0ZUxhbmUsIGV2ZW50VGltZSkge1xuICByb290LnBlbmRpbmdMYW5lcyB8PSB1cGRhdGVMYW5lOyAvLyBJZiB0aGVyZSBhcmUgYW55IHN1c3BlbmRlZCB0cmFuc2l0aW9ucywgaXQncyBwb3NzaWJsZSB0aGlzIG5ldyB1cGRhdGVcbiAgLy8gY291bGQgdW5ibG9jayB0aGVtLiBDbGVhciB0aGUgc3VzcGVuZGVkIGxhbmVzIHNvIHRoYXQgd2UgY2FuIHRyeSByZW5kZXJpbmdcbiAgLy8gdGhlbSBhZ2Fpbi5cbiAgLy9cbiAgLy8gVE9ETzogV2UgcmVhbGx5IG9ubHkgbmVlZCB0byB1bnN1c3BlbmQgb25seSBsYW5lcyB0aGF0IGFyZSBpbiB0aGVcbiAgLy8gYHN1YnRyZWVMYW5lc2Agb2YgdGhlIHVwZGF0ZWQgZmliZXIsIG9yIHRoZSB1cGRhdGUgbGFuZXMgb2YgdGhlIHJldHVyblxuICAvLyBwYXRoLiBUaGlzIHdvdWxkIGV4Y2x1ZGUgc3VzcGVuZGVkIHVwZGF0ZXMgaW4gYW4gdW5yZWxhdGVkIHNpYmxpbmcgdHJlZSxcbiAgLy8gc2luY2UgdGhlcmUncyBubyB3YXkgZm9yIHRoaXMgdXBkYXRlIHRvIHVuYmxvY2sgaXQuXG4gIC8vXG4gIC8vIFdlIGRvbid0IGRvIHRoaXMgaWYgdGhlIGluY29taW5nIHVwZGF0ZSBpcyBpZGxlLCBiZWNhdXNlIHdlIG5ldmVyIHByb2Nlc3NcbiAgLy8gaWRsZSB1cGRhdGVzIHVudGlsIGFmdGVyIGFsbCB0aGUgcmVndWxhciB1cGRhdGVzIGhhdmUgZmluaXNoZWQ7IHRoZXJlJ3Mgbm9cbiAgLy8gd2F5IGl0IGNvdWxkIHVuYmxvY2sgYSB0cmFuc2l0aW9uLlxuXG4gIGlmICh1cGRhdGVMYW5lICE9PSBJZGxlTGFuZSkge1xuICAgIHJvb3Quc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KHVwZGF0ZUxhbmUpOyAvLyBXZSBjYW4gYWx3YXlzIG92ZXJ3cml0ZSBhbiBleGlzdGluZyB0aW1lc3RhbXAgYmVjYXVzZSB3ZSBwcmVmZXIgdGhlIG1vc3RcbiAgLy8gcmVjZW50IGV2ZW50LCBhbmQgd2UgYXNzdW1lIHRpbWUgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuXG4gIGV2ZW50VGltZXNbaW5kZXhdID0gZXZlbnRUaW1lO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyB8PSBzdXNwZW5kZWRMYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyAmPSB+c3VzcGVuZGVkTGFuZXM7IC8vIFRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBDUFUtYm91bmQuIENsZWFyIHRoZWlyIGV4cGlyYXRpb24gdGltZXMuXG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzO1xuICB2YXIgbGFuZXMgPSBzdXNwZW5kZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMsIGV2ZW50VGltZSkge1xuICByb290LnBpbmdlZExhbmVzIHw9IHJvb3Quc3VzcGVuZGVkTGFuZXMgJiBwaW5nZWRMYW5lcztcbn1cbmZ1bmN0aW9uIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpIHtcbiAgdmFyIG5vTG9uZ2VyUGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+cmVtYWluaW5nTGFuZXM7XG4gIHJvb3QucGVuZGluZ0xhbmVzID0gcmVtYWluaW5nTGFuZXM7IC8vIExldCdzIHRyeSBldmVyeXRoaW5nIGFnYWluXG5cbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICByb290LmV4cGlyZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gQ2xlYXIgdGhlIGxhbmVzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgcGVuZGluZyB3b3JrXG5cbiAgdmFyIGxhbmVzID0gbm9Mb25nZXJQZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IE5vTGFuZXM7XG4gICAgZXZlbnRUaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGVudGFuZ2xlZExhbmVzKSB7XG4gIC8vIEluIGFkZGl0aW9uIHRvIGVudGFuZ2xpbmcgZWFjaCBvZiB0aGUgZ2l2ZW4gbGFuZXMgd2l0aCBlYWNoIG90aGVyLCB3ZSBhbHNvXG4gIC8vIGhhdmUgdG8gY29uc2lkZXIgX3RyYW5zaXRpdmVfIGVudGFuZ2xlbWVudHMuIEZvciBlYWNoIGxhbmUgdGhhdCBpcyBhbHJlYWR5XG4gIC8vIGVudGFuZ2xlZCB3aXRoICphbnkqIG9mIHRoZSBnaXZlbiBsYW5lcywgdGhhdCBsYW5lIGlzIG5vdyB0cmFuc2l0aXZlbHlcbiAgLy8gZW50YW5nbGVkIHdpdGggKmFsbCogdGhlIGdpdmVuIGxhbmVzLlxuICAvL1xuICAvLyBUcmFuc2xhdGVkOiBJZiBDIGlzIGVudGFuZ2xlZCB3aXRoIEEsIHRoZW4gZW50YW5nbGluZyBBIHdpdGggQiBhbHNvXG4gIC8vIGVudGFuZ2xlcyBDIHdpdGggQi5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBoYXJkIHRvIGdyYXNwLCBpdCBtaWdodCBoZWxwIHRvIGludGVudGlvbmFsbHkgYnJlYWsgdGhpc1xuICAvLyBmdW5jdGlvbiBhbmQgbG9vayBhdCB0aGUgdGVzdHMgdGhhdCBmYWlsIGluIFJlYWN0VHJhbnNpdGlvbi10ZXN0LmpzLiBUcnlcbiAgLy8gY29tbWVudGluZyBvdXQgb25lIG9mIHRoZSBjb25kaXRpb25zIGJlbG93LlxuICB2YXIgcm9vdEVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcyB8PSBlbnRhbmdsZWRMYW5lcztcbiAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gIHZhciBsYW5lcyA9IHJvb3RFbnRhbmdsZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMpIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG5cbiAgICBpZiAoIC8vIElzIHRoaXMgb25lIG9mIHRoZSBuZXdseSBlbnRhbmdsZWQgbGFuZXM/XG4gICAgbGFuZSAmIGVudGFuZ2xlZExhbmVzIHwgLy8gSXMgdGhpcyBsYW5lIHRyYW5zaXRpdmVseSBlbnRhbmdsZWQgd2l0aCB0aGUgbmV3bHkgZW50YW5nbGVkIGxhbmVzP1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdICYgZW50YW5nbGVkTGFuZXMpIHtcbiAgICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdIHw9IGVudGFuZ2xlZExhbmVzO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uKHJvb3QsIHJlbmRlckxhbmVzKSB7XG4gIHZhciByZW5kZXJMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShyZW5kZXJMYW5lcyk7XG4gIHZhciBsYW5lO1xuXG4gIHN3aXRjaCAocmVuZGVyTGFuZSkge1xuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIGxhbmUgPSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgICAgbGFuZSA9IERlZmF1bHRIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIGxhbmUgPSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICAgIGxhbmUgPSBJZGxlSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpcyBhbHJlYWR5IGVpdGhlciBhIGh5ZHJhdGlvbiBsYW5lLCBvciBzaG91bGRuJ3RcbiAgICAgIC8vIGJlIHJldHJpZWQgYXQgYSBoeWRyYXRpb24gbGFuZS5cbiAgICAgIGxhbmUgPSBOb0xhbmU7XG4gICAgICBicmVhaztcbiAgfSAvLyBDaGVjayBpZiB0aGUgbGFuZSB3ZSBjaG9zZSBpcyBzdXNwZW5kZWQuIElmIHNvLCB0aGF0IGluZGljYXRlcyB0aGF0IHdlXG4gIC8vIGFscmVhZHkgYXR0ZW1wdGVkIGFuZCBmYWlsZWQgdG8gaHlkcmF0ZSBhdCB0aGF0IGxldmVsLiBBbHNvIGNoZWNrIGlmIHdlJ3JlXG4gIC8vIGFscmVhZHkgcmVuZGVyaW5nIHRoYXQgbGFuZSwgd2hpY2ggaXMgcmFyZSBidXQgY291bGQgaGFwcGVuLlxuXG5cbiAgaWYgKChsYW5lICYgKHJvb3Quc3VzcGVuZGVkTGFuZXMgfCByZW5kZXJMYW5lcykpICE9PSBOb0xhbmUpIHtcbiAgICAvLyBHaXZlIHVwIHRyeWluZyB0byBoeWRyYXRlIGFuZCBmYWxsIGJhY2sgdG8gY2xpZW50IHJlbmRlci5cbiAgICByZXR1cm4gTm9MYW5lO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgZmliZXIsIGxhbmVzKSB7XG5cbiAgaWYgKCFpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gcm9vdC5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciB1cGRhdGVycyA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuICAgIHVwZGF0ZXJzLmFkZChmaWJlcik7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcykge1xuXG4gIGlmICghaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDtcbiAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIHVwZGF0ZXJzID0gcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcFtpbmRleF07XG5cbiAgICBpZiAodXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgIHVwZGF0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCB8fCAhbWVtb2l6ZWRVcGRhdGVycy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB1cGRhdGVycy5jbGVhcigpO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKHJvb3QsIGxhbmVzKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgRGlzY3JldGVFdmVudFByaW9yaXR5ID0gU3luY0xhbmU7XG52YXIgQ29udGludW91c0V2ZW50UHJpb3JpdHkgPSBJbnB1dENvbnRpbnVvdXNMYW5lO1xudmFyIERlZmF1bHRFdmVudFByaW9yaXR5ID0gRGVmYXVsdExhbmU7XG52YXIgSWRsZUV2ZW50UHJpb3JpdHkgPSBJZGxlTGFuZTtcbnZhciBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBOb0xhbmU7XG5mdW5jdGlvbiBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlUHJpb3JpdHk7XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkobmV3UHJpb3JpdHkpIHtcbiAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gbmV3UHJpb3JpdHk7XG59XG5mdW5jdGlvbiBydW5XaXRoUHJpb3JpdHkocHJpb3JpdHksIGZuKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gY3VycmVudFVwZGF0ZVByaW9yaXR5O1xuXG4gIHRyeSB7XG4gICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJpb3JpdHk7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJldmlvdXNQcmlvcml0eTtcbiAgfVxufVxuZnVuY3Rpb24gaGlnaGVyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhICE9PSAwICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBsb3dlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSA9PT0gMCB8fCBhID4gYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gaXNIaWdoZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgIT09IDAgJiYgYSA8IGI7XG59XG5mdW5jdGlvbiBsYW5lc1RvRXZlbnRQcmlvcml0eShsYW5lcykge1xuICB2YXIgbGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xuXG4gIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSwgbGFuZSkpIHtcbiAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkoQ29udGludW91c0V2ZW50UHJpb3JpdHksIGxhbmUpKSB7XG4gICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgaWYgKGluY2x1ZGVzTm9uSWRsZVdvcmsobGFuZSkpIHtcbiAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICByZXR1cm4gSWRsZUV2ZW50UHJpb3JpdHk7XG59XG5cbi8vIFRoaXMgaXMgaW1wb3J0ZWQgYnkgdGhlIGV2ZW50IHJlcGxheWluZyBpbXBsZW1lbnRhdGlvbiBpbiBSZWFjdCBET00uIEl0J3Ncbi8vIGluIGEgc2VwYXJhdGUgZmlsZSB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgcmVuZGVyZXIgYW5kXG4vLyB0aGUgcmVjb25jaWxlci5cbmZ1bmN0aW9uIGlzUm9vdERlaHlkcmF0ZWQocm9vdCkge1xuICB2YXIgY3VycmVudFN0YXRlID0gcm9vdC5jdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBjdXJyZW50U3RhdGUuaXNEZWh5ZHJhdGVkO1xufVxuXG52YXIgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbjtcblxuZnVuY3Rpb24gc2V0QXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZuKSB7XG4gIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24gPSBmbjtcbn1cbmZ1bmN0aW9uIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcikge1xuICBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTtcbn1cbnZhciBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbjtcbmZ1bmN0aW9uIHNldEF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGZuKSB7XG4gIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5O1xuZnVuY3Rpb24gc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KGZuKSB7XG4gIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSA9IGZuO1xufVxudmFyIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxO1xuZnVuY3Rpb24gc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGZuKSB7XG4gIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eSA9IGZuO1xufSAvLyBUT0RPOiBVcGdyYWRlIHRoaXMgZGVmaW5pdGlvbiBvbmNlIHdlJ3JlIG9uIGEgbmV3ZXIgdmVyc2lvbiBvZiBGbG93IHRoYXRcbi8vIGhhcyB0aGlzIGRlZmluaXRpb24gYnVpbHQtaW4uXG5cbnZhciBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7IC8vIFRoZSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMgdG8gYmUgcmVwbGF5ZWQuXG5cbnZhciBxdWV1ZWREaXNjcmV0ZUV2ZW50cyA9IFtdOyAvLyBJbmRpY2F0ZXMgaWYgYW55IGNvbnRpbnVvdXMgZXZlbnQgdGFyZ2V0cyBhcmUgbm9uLW51bGwgZm9yIGVhcmx5IGJhaWxvdXQuXG4vLyBpZiB0aGUgbGFzdCB0YXJnZXQgd2FzIGRlaHlkcmF0ZWQuXG5cbnZhciBxdWV1ZWRGb2N1cyA9IG51bGw7XG52YXIgcXVldWVkRHJhZyA9IG51bGw7XG52YXIgcXVldWVkTW91c2UgPSBudWxsOyAvLyBGb3IgcG9pbnRlciBldmVudHMgdGhlcmUgY2FuIGJlIG9uZSBsYXRlc3QgZXZlbnQgcGVyIHBvaW50ZXJJZC5cblxudmFyIHF1ZXVlZFBvaW50ZXJzID0gbmV3IE1hcCgpO1xudmFyIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcyA9IG5ldyBNYXAoKTsgLy8gV2UgY291bGQgY29uc2lkZXIgcmVwbGF5aW5nIHNlbGVjdGlvbmNoYW5nZSBhbmQgdG91Y2htb3ZlcyB0b28uXG5cbnZhciBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXTtcbnZhciBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMgPSBbJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3RvdWNoY2FuY2VsJywgJ3RvdWNoZW5kJywgJ3RvdWNoc3RhcnQnLCAnYXV4Y2xpY2snLCAnZGJsY2xpY2snLCAncG9pbnRlcmNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVydXAnLCAnZHJhZ2VuZCcsICdkcmFnc3RhcnQnLCAnZHJvcCcsICdjb21wb3NpdGlvbmVuZCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnaW5wdXQnLCAndGV4dElucHV0JywgLy8gSW50ZW50aW9uYWxseSBjYW1lbENhc2Vcbidjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdjbGljaycsICdjaGFuZ2UnLCAnY29udGV4dG1lbnUnLCAncmVzZXQnLCAnc3VibWl0J107XG5mdW5jdGlvbiBpc0Rpc2NyZXRlRXZlbnRUaGF0UmVxdWlyZXNIeWRyYXRpb24oZXZlbnRUeXBlKSB7XG4gIHJldHVybiBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMuaW5kZXhPZihldmVudFR5cGUpID4gLTE7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVF1ZXVlZFJlcGxheWFibGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4ge1xuICAgIGJsb2NrZWRPbjogYmxvY2tlZE9uLFxuICAgIGRvbUV2ZW50TmFtZTogZG9tRXZlbnROYW1lLFxuICAgIGV2ZW50U3lzdGVtRmxhZ3M6IGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgbmF0aXZlRXZlbnQ6IG5hdGl2ZUV2ZW50LFxuICAgIHRhcmdldENvbnRhaW5lcnM6IFt0YXJnZXRDb250YWluZXJdXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgICAgcXVldWVkRHJhZyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgICAgcXVldWVkTW91c2UgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgICB7XG4gICAgICAgIHZhciBwb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJzLmRlbGV0ZShwb2ludGVySWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgICAge1xuICAgICAgICB2YXIgX3BvaW50ZXJJZCA9IG5hdGl2ZUV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmRlbGV0ZShfcG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChleGlzdGluZ1F1ZXVlZEV2ZW50LCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoZXhpc3RpbmdRdWV1ZWRFdmVudCA9PT0gbnVsbCB8fCBleGlzdGluZ1F1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50ICE9PSBuYXRpdmVFdmVudCkge1xuICAgIHZhciBxdWV1ZWRFdmVudCA9IGNyZWF0ZVF1ZXVlZFJlcGxheWFibGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgICBpZiAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2ZpYmVyMiA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBpbmNyZWFzZSB0aGUgcHJpb3JpdHkgb2YgdGhpcyB0YXJnZXQuXG4gICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKF9maWJlcjIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWV1ZWRFdmVudDtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFscmVhZHkgcXVldWVkIHRoaXMgZXhhY3QgZXZlbnQsIHRoZW4gaXQncyBiZWNhdXNlXG4gIC8vIHRoZSBkaWZmZXJlbnQgZXZlbnQgc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBET00gZXZlbnQgbGlzdGVuZXJzLlxuICAvLyBXZSBjYW4gYWNjdW11bGF0ZSB0aGUgZmxhZ3MsIGFuZCB0aGUgdGFyZ2V0Q29udGFpbmVycywgYW5kXG4gIC8vIHN0b3JlIGEgc2luZ2xlIGV2ZW50IHRvIGJlIHJlcGxheWVkLlxuXG5cbiAgZXhpc3RpbmdRdWV1ZWRFdmVudC5ldmVudFN5c3RlbUZsYWdzIHw9IGV2ZW50U3lzdGVtRmxhZ3M7XG4gIHZhciB0YXJnZXRDb250YWluZXJzID0gZXhpc3RpbmdRdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuXG4gIGlmICh0YXJnZXRDb250YWluZXIgIT09IG51bGwgJiYgdGFyZ2V0Q29udGFpbmVycy5pbmRleE9mKHRhcmdldENvbnRhaW5lcikgPT09IC0xKSB7XG4gICAgdGFyZ2V0Q29udGFpbmVycy5wdXNoKHRhcmdldENvbnRhaW5lcik7XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdRdWV1ZWRFdmVudDtcbn1cblxuZnVuY3Rpb24gcXVldWVJZkNvbnRpbnVvdXNFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICAvLyBUaGVzZSBzZXQgcmVsYXRlZFRhcmdldCB0byBudWxsIGJlY2F1c2UgdGhlIHJlcGxheWVkIGV2ZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiB3ZVxuICAvLyBtb3ZlZCBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdyAobm8gdGFyZ2V0KSBvbnRvIHRoZSB0YXJnZXQgb25jZSBpdCBoeWRyYXRlcy5cbiAgLy8gSW5zdGVhZCBvZiBtdXRhdGluZyB3ZSBjb3VsZCBjbG9uZSB0aGUgZXZlbnQuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICB7XG4gICAgICAgIHZhciBmb2N1c0V2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZEZvY3VzID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRGb2N1cywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZm9jdXNFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIGRyYWdFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWREcmFnID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWREcmFnLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBkcmFnRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBtb3VzZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZE1vdXNlID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRNb3VzZSwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbW91c2VFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBwb2ludGVySWQgPSBwb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5zZXQocG9pbnRlcklkLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJzLmdldChwb2ludGVySWQpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIHBvaW50ZXJFdmVudCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVyRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIF9wb2ludGVySWQyID0gX3BvaW50ZXJFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5zZXQoX3BvaW50ZXJJZDIsIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkUG9pbnRlckNhcHR1cmVzLmdldChfcG9pbnRlcklkMikgfHwgbnVsbCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgX3BvaW50ZXJFdmVudCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0gLy8gQ2hlY2sgaWYgdGhpcyB0YXJnZXQgaXMgdW5ibG9ja2VkLiBSZXR1cm5zIHRydWUgaWYgaXQncyB1bmJsb2NrZWQuXG5cbmZ1bmN0aW9uIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaGFyZXMgYSBsb3Qgb2YgbG9naWMgd2l0aCBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50LlxuICAvLyBUcnkgdG8gdW5pZnkgdGhlbS4gSXQncyBhIGJpdCB0cmlja3kgc2luY2UgaXQgd291bGQgcmVxdWlyZSB0d28gcmV0dXJuXG4gIC8vIHZhbHVlcy5cbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShxdWV1ZWRUYXJnZXQudGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7XG5cbiAgICAgIGlmICh0YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlJ3JlIGJsb2NrZWQgb24gaHlkcmF0aW5nIHRoaXMgYm91bmRhcnkuXG4gICAgICAgICAgLy8gSW5jcmVhc2UgaXRzIHByaW9yaXR5LlxuICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBpbnN0YW5jZTtcbiAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mXG4gICAgICAgICAgLy8gYSByb290IG90aGVyIHRoYW4gc3luYy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCkge1xuICAvLyBUT0RPOiBUaGlzIHdpbGwgcmVhZCB0aGUgcHJpb3JpdHkgaWYgaXQncyBkaXNwYXRjaGVkIGJ5IHRoZSBSZWFjdFxuICAvLyBldmVudCBzeXN0ZW0gYnV0IG5vdCBuYXRpdmUgZXZlbnRzLiBTaG91bGQgcmVhZCB3aW5kb3cuZXZlbnQudHlwZSwgbGlrZVxuICAvLyB3ZSBkbyBmb3IgdXBkYXRlcyAoZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkpLlxuICB2YXIgdXBkYXRlUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMSgpO1xuICB2YXIgcXVldWVkVGFyZ2V0ID0ge1xuICAgIGJsb2NrZWRPbjogbnVsbCxcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICBwcmlvcml0eTogdXBkYXRlUHJpb3JpdHlcbiAgfTtcbiAgdmFyIGkgPSAwO1xuXG4gIGZvciAoOyBpIDwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gU3RvcCBvbmNlIHdlIGhpdCB0aGUgZmlyc3QgdGFyZ2V0IHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhblxuICAgIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KHVwZGF0ZVByaW9yaXR5LCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbaV0ucHJpb3JpdHkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc3BsaWNlKGksIDAsIHF1ZXVlZFRhcmdldCk7XG5cbiAgaWYgKGkgPT09IDApIHtcbiAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgd2hpbGUgKHRhcmdldENvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChxdWV1ZWRFdmVudC5kb21FdmVudE5hbWUsIHF1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcXVldWVkRXZlbnQubmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKG5leHRCbG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIG5hdGl2ZUV2ZW50ID0gcXVldWVkRXZlbnQubmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBuYXRpdmVFdmVudENsb25lID0gbmV3IG5hdGl2ZUV2ZW50LmNvbnN0cnVjdG9yKG5hdGl2ZUV2ZW50LnR5cGUsIG5hdGl2ZUV2ZW50KTtcbiAgICAgICAgc2V0UmVwbGF5aW5nRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7XG4gICAgICAgIG5hdGl2ZUV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KG5hdGl2ZUV2ZW50Q2xvbmUpO1xuICAgICAgICByZXNldFJlcGxheWluZ0V2ZW50KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgIHZhciBfZmliZXIzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjMgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMyk7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBUaGlzIHRhcmdldCBjb250YWluZXIgd2FzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLiBUcnkgdGhlIG5leHQuXG5cblxuICAgIHRhcmdldENvbnRhaW5lcnMuc2hpZnQoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXAocXVldWVkRXZlbnQsIGtleSwgbWFwKSB7XG4gIGlmIChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSkge1xuICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYXlVbmJsb2NrZWRFdmVudHMoKSB7XG4gIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTtcblxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEZvY3VzKSkge1xuICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykpIHtcbiAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZE1vdXNlKSkge1xuICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgfVxuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcblxuICAgIGlmICghaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCkge1xuICAgICAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IHRydWU7IC8vIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gYXR0ZW1wdCByZXBsYXlpbmcgYXMgbWFueSBldmVudHMgYXMgYXJlXG4gICAgICAvLyBub3cgdW5ibG9ja2VkLiBUaGlzIGZpcnN0IG1pZ2h0IG5vdCBhY3R1YWxseSBiZSB1bmJsb2NrZWQgeWV0LlxuICAgICAgLy8gV2UgY291bGQgY2hlY2sgaXQgZWFybHkgdG8gYXZvaWQgc2NoZWR1bGluZyBhbiB1bm5lY2Vzc2FyeSBjYWxsYmFjay5cblxuICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCByZXBsYXlVbmJsb2NrZWRFdmVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeUlmQmxvY2tlZE9uKHVuYmxvY2tlZCkge1xuICAvLyBNYXJrIGFueXRoaW5nIHRoYXQgd2FzIGJsb2NrZWQgb24gdGhpcyBhcyBubyBsb25nZXIgYmxvY2tlZFxuICAvLyBhbmQgZWxpZ2libGUgZm9yIGEgcmVwbGF5LlxuICBpZiAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREaXNjcmV0ZUV2ZW50c1swXSwgdW5ibG9ja2VkKTsgLy8gVGhpcyBpcyBhIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgZWFjaCBib3VuZGFyeSB0aGF0IGNvbW1pdHMuIEkgdGhpbmsgaXQnc1xuICAgIC8vIHdvcnRoIGl0IGJlY2F1c2Ugd2UgZXhwZWN0IHZlcnkgZmV3IGRpc2NyZXRlIGV2ZW50cyB0byBxdWV1ZSB1cCBhbmQgb25jZVxuICAgIC8vIHdlIGFyZSBhY3R1YWxseSBmdWxseSB1bmJsb2NrZWQgaXQgd2lsbCBiZSBmYXN0IHRvIHJlcGxheSB0aGVtLlxuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlZEV2ZW50ID0gcXVldWVkRGlzY3JldGVFdmVudHNbaV07XG5cbiAgICAgIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERyYWcsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7XG4gIH1cblxuICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uIChxdWV1ZWRFdmVudCkge1xuICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCk7XG4gIH07XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaCh1bmJsb2NrKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2godW5ibG9jayk7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW19pXTtcblxuICAgIGlmIChxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RXhwbGljaXRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbMF07XG5cbiAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQobmV4dEV4cGxpY2l0VGFyZ2V0KTtcblxuICAgICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UncmUgdW5ibG9ja2VkLlxuICAgICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7IC8vIFRPRE86IGNhbiB3ZSBzdG9wIGV4cG9ydGluZyB0aGVzZT9cblxudmFyIF9lbmFibGVkID0gdHJ1ZTsgLy8gVGhpcyBpcyBleHBvcnRlZCBpbiBGQiBidWlsZHMgZm9yIHVzZSBieSBsZWdhY3kgRkIgbGF5ZXIgaW5mcmEuXG4vLyBXZSdkIGxpa2UgdG8gcmVtb3ZlIHRoaXMgYnV0IGl0J3Mgbm90IGNsZWFyIGlmIHRoaXMgaXMgc2FmZS5cblxuZnVuY3Rpb24gc2V0RW5hYmxlZChlbmFibGVkKSB7XG4gIF9lbmFibGVkID0gISFlbmFibGVkO1xufVxuZnVuY3Rpb24gaXNFbmFibGVkKCkge1xuICByZXR1cm4gX2VuYWJsZWQ7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICB2YXIgZXZlbnRQcmlvcml0eSA9IGdldEV2ZW50UHJpb3JpdHkoZG9tRXZlbnROYW1lKTtcbiAgdmFyIGxpc3RlbmVyV3JhcHBlcjtcblxuICBzd2l0Y2ggKGV2ZW50UHJpb3JpdHkpIHtcbiAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoQ29udGludW91c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgIGRlZmF1bHQ6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaEV2ZW50O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJXcmFwcGVyLmJpbmQobnVsbCwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaERpc2NyZXRlRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KENvbnRpbnVvdXNFdmVudFByaW9yaXR5KTtcbiAgICBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoIV9lbmFibGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGRpc3BhdGNoRXZlbnRXaXRoRW5hYmxlQ2FwdHVyZVBoYXNlU2VsZWN0aXZlSHlkcmF0aW9uV2l0aG91dERpc2NyZXRlRXZlbnRSZXBsYXkoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50V2l0aEVuYWJsZUNhcHR1cmVQaGFzZVNlbGVjdGl2ZUh5ZHJhdGlvbldpdGhvdXREaXNjcmV0ZUV2ZW50UmVwbGF5KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgYmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gIGlmIChibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgcmV0dXJuX3RhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcik7XG4gICAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocXVldWVJZkNvbnRpbnVvdXNFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkpIHtcbiAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgbmVlZCB0byBjbGVhciBvbmx5IGlmIHdlIGRpZG4ndCBxdWV1ZSBiZWNhdXNlXG4gIC8vIHF1ZXVlaW5nIGlzIGFjY3VtdWxhdGl2ZS5cblxuXG4gIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG5cbiAgaWYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFICYmIGlzRGlzY3JldGVFdmVudFRoYXRSZXF1aXJlc0h5ZHJhdGlvbihkb21FdmVudE5hbWUpKSB7XG4gICAgd2hpbGUgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShibG9ja2VkT24pO1xuXG4gICAgICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5leHRCbG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCByZXR1cm5fdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRCbG9ja2VkT24gPT09IGJsb2NrZWRPbikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gVGhpcyBpcyBub3QgcmVwbGF5YWJsZSBzbyB3ZSdsbCBpbnZva2UgaXQgYnV0IHdpdGhvdXQgYSB0YXJnZXQsXG4gIC8vIGluIGNhc2UgdGhlIGV2ZW50IHN5c3RlbSBuZWVkcyB0byB0cmFjZSBpdC5cblxuXG4gIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCBudWxsLCB0YXJnZXRDb250YWluZXIpO1xufVxuXG52YXIgcmV0dXJuX3RhcmdldEluc3QgPSBudWxsOyAvLyBSZXR1cm5zIGEgU3VzcGVuc2VJbnN0YW5jZSBvciBDb250YWluZXIgaWYgaXQncyBibG9ja2VkLlxuLy8gVGhlIHJldHVybl90YXJnZXRJbnN0IGZpZWxkIGFib3ZlIGlzIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZSByZXR1cm4gdmFsdWUuXG5cbmZ1bmN0aW9uIGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRPRE86IFdhcm4gaWYgX2VuYWJsZWQgaXMgZmFsc2UuXG4gIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgdGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgdHJlZSBoYXMgYmVlbiB1bm1vdW50ZWQgYWxyZWFkeS4gRGlzcGF0Y2ggd2l0aG91dCBhIHRhcmdldC5cbiAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBRdWV1ZSB0aGUgZXZlbnQgdG8gYmUgcmVwbGF5ZWQgbGF0ZXIuIEFib3J0IGRpc3BhdGNoaW5nIHNpbmNlIHdlXG4gICAgICAgICAgLy8gZG9uJ3Qgd2FudCB0aGlzIGV2ZW50IGRpc3BhdGNoZWQgdHdpY2UgdGhyb3VnaCB0aGUgZXZlbnQgc3lzdGVtLlxuICAgICAgICAgIC8vIFRPRE86IElmIHRoaXMgaXMgdGhlIGZpcnN0IGRpc2NyZXRlIGV2ZW50IGluIHRoZSBxdWV1ZS4gU2NoZWR1bGUgYW4gaW5jcmVhc2VkXG4gICAgICAgICAgLy8gcHJpb3JpdHkgZm9yIHRoaXMgYm91bmRhcnkuXG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9IC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgc29tZXRoaW5nIHdlbnQgd3JvbmcgYnV0IHRvIGF2b2lkIGJsb2NraW5nXG4gICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0sIGRpc3BhdGNoIHRoZSBldmVudCB3aXRob3V0IGEgdGFyZ2V0LlxuICAgICAgICAvLyBUT0RPOiBXYXJuLlxuXG5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMgZHVyaW5nIGEgcmVwbGF5IHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCBpdCBtaWdodCBibG9ja1xuICAgICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0uXG4gICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobmVhcmVzdE1vdW50ZWQgIT09IHRhcmdldEluc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdFxuICAgICAgICAvLyBjb21wb25lbnQncyBtb3VudCwgaWdub3JlIGl0IGZvciBub3cgKHRoYXQgaXMsIHRyZWF0IGl0IGFzIGlmIGl0IHdhcyBhblxuICAgICAgICAvLyBldmVudCBvbiBhIG5vbi1SZWFjdCB0cmVlKS4gV2UgbWlnaHQgYWxzbyBjb25zaWRlciBxdWV1ZWluZyBldmVudHMgYW5kXG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LlxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7IC8vIFdlJ3JlIG5vdCBibG9ja2VkIG9uIGFueXRoaW5nLlxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBVc2VkIGJ5IFNpbXBsZUV2ZW50UGx1Z2luOlxuICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgY2FzZSAnY2xpY2snOlxuICAgIGNhc2UgJ2Nsb3NlJzpcbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnY29weSc6XG4gICAgY2FzZSAnY3V0JzpcbiAgICBjYXNlICdhdXhjbGljayc6XG4gICAgY2FzZSAnZGJsY2xpY2snOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdpbnZhbGlkJzpcbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgIGNhc2UgJ3BhdXNlJzpcbiAgICBjYXNlICdwbGF5JzpcbiAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICBjYXNlICdwb2ludGVyZG93bic6XG4gICAgY2FzZSAncG9pbnRlcnVwJzpcbiAgICBjYXNlICdyYXRlY2hhbmdlJzpcbiAgICBjYXNlICdyZXNldCc6XG4gICAgY2FzZSAncmVzaXplJzpcbiAgICBjYXNlICdzZWVrZWQnOlxuICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgY2FzZSAndG91Y2hjYW5jZWwnOlxuICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICBjYXNlICd2b2x1bWVjaGFuZ2UnOiAvLyBVc2VkIGJ5IHBvbHlmaWxsczpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2NoYW5nZSc6XG4gICAgY2FzZSAnc2VsZWN0aW9uY2hhbmdlJzpcbiAgICBjYXNlICd0ZXh0SW5wdXQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uc3RhcnQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICBjYXNlICdjb21wb3NpdGlvbnVwZGF0ZSc6IC8vIE9ubHkgZW5hYmxlQ3JlYXRlRXZlbnRIYW5kbGVBUEk6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdiZWZvcmVibHVyJzpcbiAgICBjYXNlICdhZnRlcmJsdXInOiAvLyBOb3QgdXNlZCBieSBSZWFjdCBidXQgY291bGQgYmUgYnkgdXNlciBjb2RlOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnYmVmb3JlaW5wdXQnOlxuICAgIGNhc2UgJ2JsdXInOlxuICAgIGNhc2UgJ2Z1bGxzY3JlZW5jaGFuZ2UnOlxuICAgIGNhc2UgJ2ZvY3VzJzpcbiAgICBjYXNlICdoYXNoY2hhbmdlJzpcbiAgICBjYXNlICdwb3BzdGF0ZSc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICdzZWxlY3RzdGFydCc6XG4gICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuXG4gICAgY2FzZSAnZHJhZyc6XG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnZXhpdCc6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3Njcm9sbCc6XG4gICAgY2FzZSAndG9nZ2xlJzpcbiAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgIGNhc2UgJ3doZWVsJzogLy8gTm90IHVzZWQgYnkgUmVhY3QgYnV0IGNvdWxkIGJlIGJ5IHVzZXIgY29kZTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ21vdXNlZW50ZXInOlxuICAgIGNhc2UgJ21vdXNlbGVhdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJlbnRlcic6XG4gICAgY2FzZSAncG9pbnRlcmxlYXZlJzpcbiAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcblxuICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgICAge1xuICAgICAgICAvLyBXZSBtaWdodCBiZSBpbiB0aGUgU2NoZWR1bGVyIGNhbGxiYWNrLlxuICAgICAgICAvLyBFdmVudHVhbGx5IHRoaXMgbWVjaGFuaXNtIHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBjaGVja1xuICAgICAgICAvLyBvZiB0aGUgY3VycmVudCBwcmlvcml0eSBvbiB0aGUgbmF0aXZlIHNjaGVkdWxlci5cbiAgICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5ID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcblxuICAgICAgICBzd2l0Y2ggKHNjaGVkdWxlclByaW9yaXR5KSB7XG4gICAgICAgICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgICAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIExvd1NjaGVkdWxlclByaW9yaXR5LCBzb21laG93LiBNYXliZSB0aGUgc2FtZSBsYW5lIGFzIGh5ZHJhdGlvbi5cbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyLCBwYXNzaXZlKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyLCBwYXNzaXZlKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHtcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH0pO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5cbi8qKlxuICogVGhlc2UgdmFyaWFibGVzIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRleHQgY29udGVudCBvZiBhIHRhcmdldCBub2RlLFxuICogYWxsb3dpbmcgY29tcGFyaXNvbiBvZiBjb250ZW50IGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBJZGVudGlmeSB0aGUgbm9kZSB3aGVyZSBzZWxlY3Rpb24gY3VycmVudGx5IGJlZ2lucywgdGhlbiBvYnNlcnZlXG4gKiBib3RoIGl0cyB0ZXh0IGNvbnRlbnQgYW5kIGl0cyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBET00uIFNpbmNlIHRoZVxuICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW5cbiAqIHVzZSBpdHMgcG9zaXRpb24gdG8gZmluZCBpdHMgcmVwbGFjZW1lbnQuXG4gKlxuICpcbiAqL1xudmFyIHJvb3QgPSBudWxsO1xudmFyIHN0YXJ0VGV4dCA9IG51bGw7XG52YXIgZmFsbGJhY2tUZXh0ID0gbnVsbDtcbmZ1bmN0aW9uIGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcm9vdCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICBzdGFydFRleHQgPSBnZXRUZXh0KCk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcmVzZXQoKSB7XG4gIHJvb3QgPSBudWxsO1xuICBzdGFydFRleHQgPSBudWxsO1xuICBmYWxsYmFja1RleHQgPSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0RGF0YSgpIHtcbiAgaWYgKGZhbGxiYWNrVGV4dCkge1xuICAgIHJldHVybiBmYWxsYmFja1RleHQ7XG4gIH1cblxuICB2YXIgc3RhcnQ7XG4gIHZhciBzdGFydFZhbHVlID0gc3RhcnRUZXh0O1xuICB2YXIgc3RhcnRMZW5ndGggPSBzdGFydFZhbHVlLmxlbmd0aDtcbiAgdmFyIGVuZDtcbiAgdmFyIGVuZFZhbHVlID0gZ2V0VGV4dCgpO1xuICB2YXIgZW5kTGVuZ3RoID0gZW5kVmFsdWUubGVuZ3RoO1xuXG4gIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IHN0YXJ0TGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRdICE9PSBlbmRWYWx1ZVtzdGFydF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBtaW5FbmQgPSBzdGFydExlbmd0aCAtIHN0YXJ0O1xuXG4gIGZvciAoZW5kID0gMTsgZW5kIDw9IG1pbkVuZDsgZW5kKyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gIT09IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzbGljZVRhaWwgPSBlbmQgPiAxID8gMSAtIGVuZCA6IHVuZGVmaW5lZDtcbiAgZmFsbGJhY2tUZXh0ID0gZW5kVmFsdWUuc2xpY2Uoc3RhcnQsIHNsaWNlVGFpbCk7XG4gIHJldHVybiBmYWxsYmFja1RleHQ7XG59XG5mdW5jdGlvbiBnZXRUZXh0KCkge1xuICBpZiAoJ3ZhbHVlJyBpbiByb290KSB7XG4gICAgcmV0dXJuIHJvb3QudmFsdWU7XG4gIH1cblxuICByZXR1cm4gcm9vdC50ZXh0Q29udGVudDtcbn1cblxuLyoqXG4gKiBgY2hhckNvZGVgIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBcImNoYXJhY3RlciBjb2RlXCIgYW5kIGlzIHNhZmUgdG8gdXNlIHdpdGhcbiAqIGBTdHJpbmcuZnJvbUNoYXJDb2RlYC4gQXMgc3VjaCwgb25seSBrZXlzIHRoYXQgY29ycmVzcG9uZCB0byBwcmludGFibGVcbiAqIGNoYXJhY3RlcnMgcHJvZHVjZSBhIHZhbGlkIGBjaGFyQ29kZWAsIHRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIEVudGVyLlxuICogVGhlIFRhYi1rZXkgaXMgY29uc2lkZXJlZCBub24tcHJpbnRhYmxlIGFuZCBkb2VzIG5vdCBoYXZlIGEgYGNoYXJDb2RlYCxcbiAqIHByZXN1bWFibHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm9kdWNlIGEgdGFiLWNoYXJhY3RlciBpbiBicm93c2Vycy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IE5vcm1hbGl6ZWQgYGNoYXJDb2RlYCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkge1xuICB2YXIgY2hhckNvZGU7XG4gIHZhciBrZXlDb2RlID0gbmF0aXZlRXZlbnQua2V5Q29kZTtcblxuICBpZiAoJ2NoYXJDb2RlJyBpbiBuYXRpdmVFdmVudCkge1xuICAgIGNoYXJDb2RlID0gbmF0aXZlRXZlbnQuY2hhckNvZGU7IC8vIEZGIGRvZXMgbm90IHNldCBgY2hhckNvZGVgIGZvciB0aGUgRW50ZXIta2V5LCBjaGVjayBhZ2FpbnN0IGBrZXlDb2RlYC5cblxuICAgIGlmIChjaGFyQ29kZSA9PT0gMCAmJiBrZXlDb2RlID09PSAxMykge1xuICAgICAgY2hhckNvZGUgPSAxMztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSUU4IGRvZXMgbm90IGltcGxlbWVudCBgY2hhckNvZGVgLCBidXQgYGtleUNvZGVgIGhhcyB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICBjaGFyQ29kZSA9IGtleUNvZGU7XG4gIH0gLy8gSUUgYW5kIEVkZ2UgKG9uIFdpbmRvd3MpIGFuZCBDaHJvbWUgLyBTYWZhcmkgKG9uIFdpbmRvd3MgYW5kIExpbnV4KVxuICAvLyByZXBvcnQgRW50ZXIgYXMgY2hhckNvZGUgMTAgd2hlbiBjdHJsIGlzIHByZXNzZWQuXG5cblxuICBpZiAoY2hhckNvZGUgPT09IDEwKSB7XG4gICAgY2hhckNvZGUgPSAxMztcbiAgfSAvLyBTb21lIG5vbi1wcmludGFibGUga2V5cyBhcmUgcmVwb3J0ZWQgaW4gYGNoYXJDb2RlYC9ga2V5Q29kZWAsIGRpc2NhcmQgdGhlbS5cbiAgLy8gTXVzdCBub3QgZGlzY2FyZCB0aGUgKG5vbi0pcHJpbnRhYmxlIEVudGVyLWtleS5cblxuXG4gIGlmIChjaGFyQ29kZSA+PSAzMiB8fCBjaGFyQ29kZSA9PT0gMTMpIHtcbiAgICByZXR1cm4gY2hhckNvZGU7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn0gLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGEgZmFjdG9yeSBzbyB0aGF0IHdlIGhhdmUgZGlmZmVyZW50IHJldHVybmVkIGNvbnN0cnVjdG9ycy5cbi8vIElmIHdlIGhhZCBhIHNpbmdsZSBjb25zdHJ1Y3RvciwgaXQgd291bGQgYmUgbWVnYW1vcnBoaWMgYW5kIGVuZ2luZXMgd291bGQgZGVvcHQuXG5cblxuZnVuY3Rpb24gY3JlYXRlU3ludGhldGljRXZlbnQoSW50ZXJmYWNlKSB7XG4gIC8qKlxuICAgKiBTeW50aGV0aWMgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIGJ5IGV2ZW50IHBsdWdpbnMsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhXG4gICAqIHRvcC1sZXZlbCBldmVudCBkZWxlZ2F0aW9uIGhhbmRsZXIuXG4gICAqXG4gICAqIFRoZXNlIHN5c3RlbXMgc2hvdWxkIGdlbmVyYWxseSB1c2UgcG9vbGluZyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBnYXJiYWdlXG4gICAqIGNvbGxlY3Rpb24uIFRoZSBzeXN0ZW0gc2hvdWxkIGNoZWNrIGBpc1BlcnNpc3RlbnRgIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZVxuICAgKiBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgaW50byB0aGUgcG9vbCBhZnRlciBiZWluZyBkaXNwYXRjaGVkLiBVc2VycyB0aGF0XG4gICAqIG5lZWQgYSBwZXJzaXN0ZWQgZXZlbnQgc2hvdWxkIGludm9rZSBgcGVyc2lzdGAuXG4gICAqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgKGFuZCBzdWJjbGFzc2VzKSBpbXBsZW1lbnQgdGhlIERPTSBMZXZlbCAzIEV2ZW50cyBBUEkgYnlcbiAgICogbm9ybWFsaXppbmcgYnJvd3NlciBxdWlya3MuIFN1YmNsYXNzZXMgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gaW1wbGVtZW50IGFcbiAgICogRE9NIGludGVyZmFjZTsgY3VzdG9tIGFwcGxpY2F0aW9uLXNwZWNpZmljIGV2ZW50cyBjYW4gYWxzbyBzdWJjbGFzcyB0aGlzLlxuICAgKi9cbiAgZnVuY3Rpb24gU3ludGhldGljQmFzZUV2ZW50KHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHRoaXMuX3JlYWN0TmFtZSA9IHJlYWN0TmFtZTtcbiAgICB0aGlzLl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgICB0aGlzLnR5cGUgPSByZWFjdEV2ZW50VHlwZTtcbiAgICB0aGlzLm5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX3Byb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgICAgaWYgKCFJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkoX3Byb3BOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vcm1hbGl6ZSA9IEludGVyZmFjZVtfcHJvcE5hbWVdO1xuXG4gICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5vcm1hbGl6ZShuYXRpdmVFdmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW19wcm9wTmFtZV0gPSBuYXRpdmVFdmVudFtfcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IG5hdGl2ZUV2ZW50LnJldHVyblZhbHVlID09PSBmYWxzZTtcblxuICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYXNzaWduKFN5bnRoZXRpY0Jhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgIT09ICd1bmtub3duJykge1xuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgLy8gVGhlIENoYW5nZUV2ZW50UGx1Z2luIHJlZ2lzdGVycyBhIFwicHJvcGVydHljaGFuZ2VcIiBldmVudCBmb3JcbiAgICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgICAvLyB0eXBlb2YgY2hlY2sgb2YgXCJ1bmtub3duXCIgY2lyY3VtdmVudHMgdGhpcyBpc3N1ZSAoYW5kIGlzIGFsc29cbiAgICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICovXG4gICAgcGVyc2lzdDogZnVuY3Rpb24gKCkgey8vIE1vZGVybiBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNQZXJzaXN0ZW50OiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICB9KTtcbiAgcmV0dXJuIFN5bnRoZXRpY0Jhc2VFdmVudDtcbn1cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGV2ZW50UGhhc2U6IDAsXG4gIGJ1YmJsZXM6IDAsXG4gIGNhbmNlbGFibGU6IDAsXG4gIHRpbWVTdGFtcDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xuICB9LFxuICBkZWZhdWx0UHJldmVudGVkOiAwLFxuICBpc1RydXN0ZWQ6IDBcbn07XG52YXIgU3ludGhldGljRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChFdmVudEludGVyZmFjZSk7XG5cbnZhciBVSUV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICB2aWV3OiAwLFxuICBkZXRhaWw6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpO1xudmFyIGxhc3RNb3ZlbWVudFg7XG52YXIgbGFzdE1vdmVtZW50WTtcbnZhciBsYXN0TW91c2VFdmVudDtcblxuZnVuY3Rpb24gdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICE9PSBsYXN0TW91c2VFdmVudCkge1xuICAgIGlmIChsYXN0TW91c2VFdmVudCAmJiBldmVudC50eXBlID09PSAnbW91c2Vtb3ZlJykge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gMDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSAwO1xuICAgIH1cblxuICAgIGxhc3RNb3VzZUV2ZW50ID0gZXZlbnQ7XG4gIH1cbn1cbi8qKlxuICogQGludGVyZmFjZSBNb3VzZUV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBNb3VzZUV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHNjcmVlblg6IDAsXG4gIHNjcmVlblk6IDAsXG4gIGNsaWVudFg6IDAsXG4gIGNsaWVudFk6IDAsXG4gIHBhZ2VYOiAwLFxuICBwYWdlWTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICBidXR0b246IDAsXG4gIGJ1dHRvbnM6IDAsXG4gIHJlbGF0ZWRUYXJnZXQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC5yZWxhdGVkVGFyZ2V0ID09PSB1bmRlZmluZWQpIHJldHVybiBldmVudC5mcm9tRWxlbWVudCA9PT0gZXZlbnQuc3JjRWxlbWVudCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50O1xuICAgIHJldHVybiBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICB9LFxuICBtb3ZlbWVudFg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRYJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WDtcbiAgICB9XG5cbiAgICB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZShldmVudCk7XG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFg7XG4gIH0sXG4gIG1vdmVtZW50WTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFknIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRZO1xuICAgIH0gLy8gRG9uJ3QgbmVlZCB0byBjYWxsIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKCkgaGVyZVxuICAgIC8vIGJlY2F1c2UgaXQncyBndWFyYW50ZWVkIHRvIGhhdmUgYWxyZWFkeSBydW4gd2hlbiBtb3ZlbWVudFhcbiAgICAvLyB3YXMgY29waWVkLlxuXG5cbiAgICByZXR1cm4gbGFzdE1vdmVtZW50WTtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoTW91c2VFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRHJhZ0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgRHJhZ0V2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGFUcmFuc2ZlcjogMFxufSk7XG5cbnZhciBTeW50aGV0aWNEcmFnRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChEcmFnRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEZvY3VzRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBGb2N1c0V2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEZvY3VzRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtYW5pbWF0aW9ucy8jQW5pbWF0aW9uRXZlbnQtaW50ZXJmYWNlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BbmltYXRpb25FdmVudFxuICovXG5cbnZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgYW5pbWF0aW9uTmFtZTogMCxcbiAgZWxhcHNlZFRpbWU6IDAsXG4gIHBzZXVkb0VsZW1lbnQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQW5pbWF0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChBbmltYXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY2xpcGJvYXJkLWFwaXMvXG4gKi9cblxudmFyIENsaXBib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBjbGlwYm9hcmREYXRhOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2NsaXBib2FyZERhdGEnIGluIGV2ZW50ID8gZXZlbnQuY2xpcGJvYXJkRGF0YSA6IHdpbmRvdy5jbGlwYm9hcmREYXRhO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9uZXZlbnRzXG4gKi9cblxudmFyIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGE6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQ29tcG9zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1XG4gKiAgICAgIC8jZXZlbnRzLWlucHV0ZXZlbnRzXG4gKi9cbi8vIEhhcHBlbnMgdG8gc2hhcmUgdGhlIHNhbWUgbGlzdCBmb3Igbm93LlxuXG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7XG4vKipcbiAqIE5vcm1hbGl6YXRpb24gb2YgZGVwcmVjYXRlZCBIVE1MNSBga2V5YCB2YWx1ZXNcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIGxlZ2FjeSBga2V5Q29kZWAgdG8gSFRNTDUgYGtleWBcbiAqIE9ubHkgc3BlY2lhbCBrZXlzIHN1cHBvcnRlZCwgYWxsIG90aGVycyBkZXBlbmQgb24ga2V5Ym9hcmQgbGF5b3V0IG9yIGJyb3dzZXJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAnOCc6ICdCYWNrc3BhY2UnLFxuICAnOSc6ICdUYWInLFxuICAnMTInOiAnQ2xlYXInLFxuICAnMTMnOiAnRW50ZXInLFxuICAnMTYnOiAnU2hpZnQnLFxuICAnMTcnOiAnQ29udHJvbCcsXG4gICcxOCc6ICdBbHQnLFxuICAnMTknOiAnUGF1c2UnLFxuICAnMjAnOiAnQ2Fwc0xvY2snLFxuICAnMjcnOiAnRXNjYXBlJyxcbiAgJzMyJzogJyAnLFxuICAnMzMnOiAnUGFnZVVwJyxcbiAgJzM0JzogJ1BhZ2VEb3duJyxcbiAgJzM1JzogJ0VuZCcsXG4gICczNic6ICdIb21lJyxcbiAgJzM3JzogJ0Fycm93TGVmdCcsXG4gICczOCc6ICdBcnJvd1VwJyxcbiAgJzM5JzogJ0Fycm93UmlnaHQnLFxuICAnNDAnOiAnQXJyb3dEb3duJyxcbiAgJzQ1JzogJ0luc2VydCcsXG4gICc0Nic6ICdEZWxldGUnLFxuICAnMTEyJzogJ0YxJyxcbiAgJzExMyc6ICdGMicsXG4gICcxMTQnOiAnRjMnLFxuICAnMTE1JzogJ0Y0JyxcbiAgJzExNic6ICdGNScsXG4gICcxMTcnOiAnRjYnLFxuICAnMTE4JzogJ0Y3JyxcbiAgJzExOSc6ICdGOCcsXG4gICcxMjAnOiAnRjknLFxuICAnMTIxJzogJ0YxMCcsXG4gICcxMjInOiAnRjExJyxcbiAgJzEyMyc6ICdGMTInLFxuICAnMTQ0JzogJ051bUxvY2snLFxuICAnMTQ1JzogJ1Njcm9sbExvY2snLFxuICAnMjI0JzogJ01ldGEnXG59O1xuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgYGtleWAgcHJvcGVydHkuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cbiAgICAvLyBGaXJlRm94IGltcGxlbWVudHMgYGtleWAgYnV0IHJldHVybnMgYE1velByaW50YWJsZUtleWAgZm9yIGFsbFxuICAgIC8vIHByaW50YWJsZSBjaGFyYWN0ZXJzIChub3JtYWxpemVkIHRvIGBVbmlkZW50aWZpZWRgKSwgaWdub3JlIGl0LlxuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XSB8fCBuYXRpdmVFdmVudC5rZXk7XG5cbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH0gLy8gQnJvd3NlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGtleWAsIHBvbHlmaWxsIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLlxuXG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsgLy8gVGhlIGVudGVyLWtleSBpcyB0ZWNobmljYWxseSBib3RoIHByaW50YWJsZSBhbmQgbm9uLXByaW50YWJsZSBhbmQgY2FuXG4gICAgLy8gdGh1cyBiZSBjYXB0dXJlZCBieSBga2V5cHJlc3NgLCBubyBvdGhlciBub24tcHJpbnRhYmxlIGtleSBzaG91bGQuXG5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaFxuICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuXG4gICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIG1vZGlmaWVyIGtleSB0byB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBpbiB0aGUgZXZlbnQuXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8ja2V5cy1Nb2RpZmllcnNcbiAqL1xuXG5cbnZhciBtb2RpZmllcktleVRvUHJvcCA9IHtcbiAgQWx0OiAnYWx0S2V5JyxcbiAgQ29udHJvbDogJ2N0cmxLZXknLFxuICBNZXRhOiAnbWV0YUtleScsXG4gIFNoaWZ0OiAnc2hpZnRLZXknXG59OyAvLyBPbGRlciBicm93c2VycyAoU2FmYXJpIDw9IDEwLCBpT1MgU2FmYXJpIDw9IDEwLjIpIGRvIG5vdCBzdXBwb3J0XG4vLyBnZXRNb2RpZmllclN0YXRlLiBJZiBnZXRNb2RpZmllclN0YXRlIGlzIG5vdCBzdXBwb3J0ZWQsIHdlIG1hcCBpdCB0byBhIHNldCBvZlxuLy8gbW9kaWZpZXIga2V5cyBleHBvc2VkIGJ5IHRoZSBldmVudC4gSW4gdGhpcyBjYXNlLCBMb2NrLWtleXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cbmZ1bmN0aW9uIG1vZGlmaWVyU3RhdGVHZXR0ZXIoa2V5QXJnKSB7XG4gIHZhciBzeW50aGV0aWNFdmVudCA9IHRoaXM7XG4gIHZhciBuYXRpdmVFdmVudCA9IHN5bnRoZXRpY0V2ZW50Lm5hdGl2ZUV2ZW50O1xuXG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuXG4gIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtcbiAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIGtleTogZ2V0RXZlbnRLZXksXG4gIGNvZGU6IDAsXG4gIGxvY2F0aW9uOiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICByZXBlYXQ6IDAsXG4gIGxvY2FsZTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICAvLyBMZWdhY3kgSW50ZXJmYWNlXG4gIGNoYXJDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgY2hhckNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlQcmVzcyBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGUgYWN0dWFsIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gICAgLy8gS2V5UHJlc3MgaXMgZGVwcmVjYXRlZCwgYnV0IGl0cyByZXBsYWNlbWVudCBpcyBub3QgeWV0IGZpbmFsIGFuZCBub3RcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBhbnkgbWFqb3IgYnJvd3Nlci4gT25seSBLZXlQcmVzcyBoYXMgY2hhckNvZGUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGtleUNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlEb3duL1VwIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHBoeXNpY2FsIGtleWJvYXJkIGtleS5cbiAgICAvLyBUaGUgYWN0dWFsIG1lYW5pbmcgb2YgdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIHVzZXJzJyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWQuIEFzc3VtaW5nIHRoYXQgaXQgaXMgYSBVUyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyBwcm92aWRlcyBhIHN1cnByaXNpbmdseSBhY2N1cmF0ZSBtYXBwaW5nIGZvciBVUyBhbmQgRXVyb3BlYW4gdXNlcnMuXG4gICAgLy8gRHVlIHRvIHRoaXMsIGl0IGlzIGxlZnQgdG8gdGhlIHVzZXIgdG8gaW1wbGVtZW50IGF0IHRoaXMgdGltZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9LFxuICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYHdoaWNoYCBpcyBhbiBhbGlhcyBmb3IgZWl0aGVyIGBrZXlDb2RlYCBvciBgY2hhckNvZGVgIGRlcGVuZGluZyBvbiB0aGVcbiAgICAvLyB0eXBlIG9mIHRoZSBldmVudC5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljS2V5Ym9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEtleWJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFBvaW50ZXJFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9wb2ludGVyZXZlbnRzL1xuICovXG5cbnZhciBQb2ludGVyRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgcG9pbnRlcklkOiAwLFxuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBwcmVzc3VyZTogMCxcbiAgdGFuZ2VudGlhbFByZXNzdXJlOiAwLFxuICB0aWx0WDogMCxcbiAgdGlsdFk6IDAsXG4gIHR3aXN0OiAwLFxuICBwb2ludGVyVHlwZTogMCxcbiAgaXNQcmltYXJ5OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1BvaW50ZXJFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFBvaW50ZXJFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgVG91Y2hFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi90b3VjaC1ldmVudHMvXG4gKi9cblxudmFyIFRvdWNoRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgdG91Y2hlczogMCxcbiAgdGFyZ2V0VG91Y2hlczogMCxcbiAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxufSk7XG5cbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG91Y2hFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMDkwMzIwLyN0cmFuc2l0aW9uLWV2ZW50cy1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RyYW5zaXRpb25FdmVudFxuICovXG5cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIHByb3BlcnR5TmFtZTogMCxcbiAgZWxhcHNlZFRpbWU6IDAsXG4gIHBzZXVkb0VsZW1lbnQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBXaGVlbEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgV2hlZWxFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBkZWx0YVg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFYJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWCA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWGAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChyaWdodCBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFYJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWCA6IDA7XG4gIH0sXG4gIGRlbHRhWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVknIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFZYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YWAgZm9yIElFPDkgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGEnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGEgOiAwO1xuICB9LFxuICBkZWx0YVo6IDAsXG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgXCJkZWx0YU1vZGVcIiBpcyByZXBvcnRpbmcgaW4gcmF3IHdoZWVsIGRlbHRhIHdoZXJlIG9uZVxuICAvLyBub3RjaCBvbiB0aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0gMTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxzLlxuICAvLyBBIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBET01fREVMVEFfTElORSAoMSkgaXMgNSUgb2Ygdmlld3BvcnQgc2l6ZSBvclxuICAvLyB+NDAgcGl4ZWxzLCBmb3IgRE9NX0RFTFRBX1NDUkVFTiAoMikgaXQgaXMgODcuNSUgb2Ygdmlld3BvcnQgc2l6ZS5cbiAgZGVsdGFNb2RlOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1doZWVsRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChXaGVlbEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIEVORF9LRVlDT0RFUyA9IFs5LCAxMywgMjcsIDMyXTsgLy8gVGFiLCBSZXR1cm4sIEVzYywgU3BhY2VcblxudmFyIFNUQVJUX0tFWUNPREUgPSAyMjk7XG52YXIgY2FuVXNlQ29tcG9zaXRpb25FdmVudCA9IGNhblVzZURPTSAmJiAnQ29tcG9zaXRpb25FdmVudCcgaW4gd2luZG93O1xudmFyIGRvY3VtZW50TW9kZSA9IG51bGw7XG5cbmlmIChjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQpIHtcbiAgZG9jdW1lbnRNb2RlID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xufSAvLyBXZWJraXQgb2ZmZXJzIGEgdmVyeSB1c2VmdWwgYHRleHRJbnB1dGAgZXZlbnQgdGhhdCBjYW4gYmUgdXNlZCB0b1xuLy8gZGlyZWN0bHkgcmVwcmVzZW50IGBiZWZvcmVJbnB1dGAuIFRoZSBJRSBgdGV4dGlucHV0YCBldmVudCBpcyBub3QgYXNcbi8vIHVzZWZ1bCwgc28gd2UgZG9uJ3QgdXNlIGl0LlxuXG5cbnZhciBjYW5Vc2VUZXh0SW5wdXRFdmVudCA9IGNhblVzZURPTSAmJiAnVGV4dEV2ZW50JyBpbiB3aW5kb3cgJiYgIWRvY3VtZW50TW9kZTsgLy8gSW4gSUU5Kywgd2UgaGF2ZSBhY2Nlc3MgdG8gY29tcG9zaXRpb24gZXZlbnRzLCBidXQgdGhlIGRhdGEgc3VwcGxpZWRcbi8vIGJ5IHRoZSBuYXRpdmUgY29tcG9zaXRpb25lbmQgZXZlbnQgbWF5IGJlIGluY29ycmVjdC4gSmFwYW5lc2UgaWRlb2dyYXBoaWNcbi8vIHNwYWNlcywgZm9yIGluc3RhbmNlIChcXHUzMDAwKSBhcmUgbm90IHJlY29yZGVkIGNvcnJlY3RseS5cblxudmFyIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhID0gY2FuVXNlRE9NICYmICghY2FuVXNlQ29tcG9zaXRpb25FdmVudCB8fCBkb2N1bWVudE1vZGUgJiYgZG9jdW1lbnRNb2RlID4gOCAmJiBkb2N1bWVudE1vZGUgPD0gMTEpO1xudmFyIFNQQUNFQkFSX0NPREUgPSAzMjtcbnZhciBTUEFDRUJBUl9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZShTUEFDRUJBUl9DT0RFKTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25CZWZvcmVJbnB1dCcsIFsnY29tcG9zaXRpb25lbmQnLCAna2V5cHJlc3MnLCAndGV4dElucHV0JywgJ3Bhc3RlJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25FbmQnLCBbJ2NvbXBvc2l0aW9uZW5kJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25TdGFydCcsIFsnY29tcG9zaXRpb25zdGFydCcsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uVXBkYXRlJywgWydjb21wb3NpdGlvbnVwZGF0ZScsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbn0gLy8gVHJhY2sgd2hldGhlciB3ZSd2ZSBldmVyIGhhbmRsZWQgYSBrZXlwcmVzcyBvbiB0aGUgc3BhY2Uga2V5LlxuXG5cbnZhciBoYXNTcGFjZUtleXByZXNzID0gZmFsc2U7XG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGEgbmF0aXZlIGtleXByZXNzIGV2ZW50IGlzIGFzc3VtZWQgdG8gYmUgYSBjb21tYW5kLlxuICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIEZpcmVmb3ggZmlyZXMgYGtleXByZXNzYCBldmVudHMgZm9yIGtleSBjb21tYW5kc1xuICogKGN1dCwgY29weSwgc2VsZWN0LWFsbCwgZXRjLikgZXZlbiB0aG91Z2ggbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLlxuICovXG5cbmZ1bmN0aW9uIGlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiAobmF0aXZlRXZlbnQuY3RybEtleSB8fCBuYXRpdmVFdmVudC5hbHRLZXkgfHwgbmF0aXZlRXZlbnQubWV0YUtleSkgJiYgLy8gY3RybEtleSAmJiBhbHRLZXkgaXMgZXF1aXZhbGVudCB0byBBbHRHciwgYW5kIGlzIG5vdCBhIGNvbW1hbmQuXG4gICEobmF0aXZlRXZlbnQuY3RybEtleSAmJiBuYXRpdmVFdmVudC5hbHRLZXkpO1xufVxuLyoqXG4gKiBUcmFuc2xhdGUgbmF0aXZlIHRvcCBsZXZlbCBldmVudHMgaW50byBldmVudCB0eXBlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKGRvbUV2ZW50TmFtZSkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2NvbXBvc2l0aW9uc3RhcnQnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uU3RhcnQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uRW5kJztcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9udXBkYXRlJzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvblVwZGF0ZSc7XG4gIH1cbn1cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgYmVzdC1ndWVzcyBtb2RlbCB0aGluayB0aGlzIGV2ZW50IHNpZ25pZmllcyB0aGF0XG4gKiBjb21wb3NpdGlvbiBoYXMgYmVndW4/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJyAmJiBuYXRpdmVFdmVudC5rZXlDb2RlID09PSBTVEFSVF9LRVlDT0RFO1xufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBtb2RlIHRoaW5rIHRoYXQgdGhpcyBldmVudCBpcyB0aGUgZW5kIG9mIGNvbXBvc2l0aW9uP1xuICovXG5cblxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICAvLyBDb21tYW5kIGtleXMgaW5zZXJ0IG9yIGNsZWFyIElNRSBpbnB1dC5cbiAgICAgIHJldHVybiBFTkRfS0VZQ09ERVMuaW5kZXhPZihuYXRpdmVFdmVudC5rZXlDb2RlKSAhPT0gLTE7XG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICAgIC8vIEV4cGVjdCBJTUUga2V5Q29kZSBvbiBlYWNoIGtleWRvd24uIElmIHdlIGdldCBhbnkgb3RoZXJcbiAgICAgIC8vIGNvZGUgd2UgbXVzdCBoYXZlIGV4aXRlZCBlYXJsaWVyLlxuICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmtleUNvZGUgIT09IFNUQVJUX0tFWUNPREU7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICAvLyBFdmVudHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbmNlbGxpbmcgSU1FLlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIEdvb2dsZSBJbnB1dCBUb29scyBwcm92aWRlcyBjb21wb3NpdGlvbiBkYXRhIHZpYSBhIEN1c3RvbUV2ZW50LFxuICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRlZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIGV2ZW50IG9iamVjdCwgdXNlIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBwbGFpblxuICogY29tcG9zaXRpb24gZXZlbnQgYW5kIHdlIGhhdmUgbm90aGluZyBzcGVjaWFsIHRvIGV4dHJhY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHs/c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGV0YWlsID0gbmF0aXZlRXZlbnQuZGV0YWlsO1xuXG4gIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7XG4gICAgcmV0dXJuIGRldGFpbC5kYXRhO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIENoZWNrIGlmIGEgY29tcG9zaXRpb24gZXZlbnQgd2FzIHRyaWdnZXJlZCBieSBLb3JlYW4gSU1FLlxuICogT3VyIGZhbGxiYWNrIG1vZGUgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggSUUncyBLb3JlYW4gSU1FLFxuICogc28ganVzdCB1c2UgbmF0aXZlIGNvbXBvc2l0aW9uIGV2ZW50cyB3aGVuIEtvcmVhbiBJTUUgaXMgdXNlZC5cbiAqIEFsdGhvdWdoIENvbXBvc2l0aW9uRXZlbnQubG9jYWxlIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsXG4gKiBpdCBpcyBhdmFpbGFibGUgaW4gSUUsIHdoZXJlIG91ciBmYWxsYmFjayBtb2RlIGlzIGVuYWJsZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cblxuZnVuY3Rpb24gaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbmF0aXZlRXZlbnQubG9jYWxlID09PSAna28nO1xufSAvLyBUcmFjayB0aGUgY3VycmVudCBJTUUgY29tcG9zaXRpb24gc3RhdHVzLCBpZiBhbnkuXG5cblxudmFyIGlzQ29tcG9zaW5nID0gZmFsc2U7XG4vKipcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5cbiAqL1xuXG5mdW5jdGlvbiBleHRyYWN0Q29tcG9zaXRpb25FdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgZXZlbnRUeXBlO1xuICB2YXIgZmFsbGJhY2tEYXRhO1xuXG4gIGlmIChjYW5Vc2VDb21wb3NpdGlvbkV2ZW50KSB7XG4gICAgZXZlbnRUeXBlID0gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKTtcbiAgfSBlbHNlIGlmICghaXNDb21wb3NpbmcpIHtcbiAgICBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uU3RhcnQnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICBldmVudFR5cGUgPSAnb25Db21wb3NpdGlvbkVuZCc7XG4gIH1cblxuICBpZiAoIWV2ZW50VHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIFRoZSBjdXJyZW50IGNvbXBvc2l0aW9uIGlzIHN0b3JlZCBzdGF0aWNhbGx5IGFuZCBtdXN0IG5vdCBiZVxuICAgIC8vIG92ZXJ3cml0dGVuIHdoaWxlIGNvbXBvc2l0aW9uIGNvbnRpbnVlcy5cbiAgICBpZiAoIWlzQ29tcG9zaW5nICYmIGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25TdGFydCcpIHtcbiAgICAgIGlzQ29tcG9zaW5nID0gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uRW5kJykge1xuICAgICAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgICAgIGZhbGxiYWNrRGF0YSA9IGdldERhdGEoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIGV2ZW50VHlwZSk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoZXZlbnRUeXBlLCBkb21FdmVudE5hbWUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG5cbiAgICBpZiAoZmFsbGJhY2tEYXRhKSB7XG4gICAgICAvLyBJbmplY3QgZGF0YSBnZW5lcmF0ZWQgZnJvbSBmYWxsYmFjayBwYXRoIGludG8gdGhlIHN5bnRoZXRpYyBldmVudC5cbiAgICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgcHJvcGVydHkgb2YgbmF0aXZlIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UuXG4gICAgICBldmVudC5kYXRhID0gZmFsbGJhY2tEYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY3VzdG9tRGF0YSA9IGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuXG4gICAgICBpZiAoY3VzdG9tRGF0YSAhPT0gbnVsbCkge1xuICAgICAgICBldmVudC5kYXRhID0gY3VzdG9tRGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBJZiBuYXRpdmUgYHRleHRJbnB1dGAgZXZlbnRzIGFyZSBhdmFpbGFibGUsIG91ciBnb2FsIGlzIHRvIG1ha2VcbiAgICAgICAqIHVzZSBvZiB0aGVtLiBIb3dldmVyLCB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZTogdGhlIHNwYWNlYmFyIGtleS5cbiAgICAgICAqIEluIFdlYmtpdCwgcHJldmVudGluZyBkZWZhdWx0IG9uIGEgc3BhY2ViYXIgYHRleHRJbnB1dGAgZXZlbnRcbiAgICAgICAqIGNhbmNlbHMgY2hhcmFjdGVyIGluc2VydGlvbiwgYnV0IGl0ICphbHNvKiBjYXVzZXMgdGhlIGJyb3dzZXJcbiAgICAgICAqIHRvIGZhbGwgYmFjayB0byBpdHMgZGVmYXVsdCBzcGFjZWJhciBiZWhhdmlvciBvZiBzY3JvbGxpbmcgdGhlXG4gICAgICAgKiBwYWdlLlxuICAgICAgICpcbiAgICAgICAqIFRyYWNraW5nIGF0OlxuICAgICAgICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM1NTEwM1xuICAgICAgICpcbiAgICAgICAqIFRvIGF2b2lkIHRoaXMgaXNzdWUsIHVzZSB0aGUga2V5cHJlc3MgZXZlbnQgYXMgaWYgbm8gYHRleHRJbnB1dGBcbiAgICAgICAqIGV2ZW50IGlzIGF2YWlsYWJsZS5cbiAgICAgICAqL1xuICAgICAgdmFyIHdoaWNoID0gbmF0aXZlRXZlbnQud2hpY2g7XG5cbiAgICAgIGlmICh3aGljaCAhPT0gU1BBQ0VCQVJfQ09ERSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9IHRydWU7XG4gICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcblxuICAgIGNhc2UgJ3RleHRJbnB1dCc6XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgIHZhciBjaGFycyA9IG5hdGl2ZUV2ZW50LmRhdGE7IC8vIElmIGl0J3MgYSBzcGFjZWJhciBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkXG4gICAgICAvLyBpdCBhdCB0aGUga2V5cHJlc3MgbGV2ZWwgYW5kIGJhaWwgaW1tZWRpYXRlbHkuIEFuZHJvaWQgQ2hyb21lXG4gICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMsIHNvIHdlIG5lZWQgdG8gaWdub3JlIGl0LlxuXG4gICAgICBpZiAoY2hhcnMgPT09IFNQQUNFQkFSX0NIQVIgJiYgaGFzU3BhY2VLZXlwcmVzcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoYXJzO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEZvciBvdGhlciBuYXRpdmUgZXZlbnQgdHlwZXMsIGRvIG5vdGhpbmcuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBGb3IgYnJvd3NlcnMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUgYHRleHRJbnB1dGAgZXZlbnQsIGV4dHJhY3QgdGhlXG4gKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8gdXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBjb21wb3NpbmcgKElNRSkgYW5kIHVzaW5nIGEgZmFsbGJhY2sgdG8gZG8gc28sXG4gIC8vIHRyeSB0byBleHRyYWN0IHRoZSBjb21wb3NlZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZhbGxiYWNrIG9iamVjdC5cbiAgLy8gSWYgY29tcG9zaXRpb24gZXZlbnQgaXMgYXZhaWxhYmxlLCB3ZSBleHRyYWN0IGEgc3RyaW5nIG9ubHkgYXRcbiAgLy8gY29tcG9zaXRpb25ldmVudCwgb3RoZXJ3aXNlIGV4dHJhY3QgaXQgYXQgZmFsbGJhY2sgZXZlbnRzLlxuICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAnY29tcG9zaXRpb25lbmQnIHx8ICFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ICYmIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgdmFyIGNoYXJzID0gZ2V0RGF0YSgpO1xuICAgICAgcmVzZXQoKTtcbiAgICAgIGlzQ29tcG9zaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm4gY2hhcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICAgIC8vIElmIGEgcGFzdGUgZXZlbnQgb2NjdXJzIGFmdGVyIGEga2V5cHJlc3MsIHRocm93IG91dCB0aGUgaW5wdXRcbiAgICAgIC8vIGNoYXJzLiBQYXN0ZSBldmVudHMgc2hvdWxkIG5vdCBsZWFkIHRvIEJlZm9yZUlucHV0IGV2ZW50cy5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBBcyBvZiB2MjcsIEZpcmVmb3ggbWF5IGZpcmUga2V5cHJlc3MgZXZlbnRzIGV2ZW4gd2hlbiBubyBjaGFyYWN0ZXJcbiAgICAgICAqIHdpbGwgYmUgaW5zZXJ0ZWQuIEEgZmV3IHBvc3NpYmlsaXRpZXM6XG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIGAwYC4gQXJyb3cga2V5cywgRXNjIGtleSwgZXRjLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IG5vIGNoYXIgaXMgYXZhaWxhYmxlLlxuICAgICAgICogICBFeDogJ0FsdEdyICsgZGAgaW4gUG9saXNoLiBUaGVyZSBpcyBubyBtb2RpZmllZCBjaGFyYWN0ZXIgZm9yXG4gICAgICAgKiAgIHRoaXMga2V5IGNvbWJpbmF0aW9uIGFuZCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQgaW50byB0aGVcbiAgICAgICAqICAgZG9jdW1lbnQsIGJ1dCBGRiBmaXJlcyB0aGUga2V5cHJlc3MgZm9yIGNoYXIgY29kZSBgMTAwYCBhbnl3YXkuXG4gICAgICAgKiAgIE5vIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBhIGNvbW1hbmQgY29tYmluYXRpb24gaXNcbiAgICAgICAqICAgYmVpbmcgdXNlZC4gRXg6IGBDbWQrQ2AuIE5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCwgYW5kIG5vXG4gICAgICAgKiAgIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqL1xuICAgICAgaWYgKCFpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgLy8gSUUgZmlyZXMgdGhlIGBrZXlwcmVzc2AgZXZlbnQgd2hlbiBhIHVzZXIgdHlwZXMgYW4gZW1vamkgdmlhXG4gICAgICAgIC8vIFRvdWNoIGtleWJvYXJkIG9mIFdpbmRvd3MuICBJbiBzdWNoIGEgY2FzZSwgdGhlIGBjaGFyYCBwcm9wZXJ0eVxuICAgICAgICAvLyBob2xkcyBhbiBlbW9qaSBjaGFyYWN0ZXIgbGlrZSBgXFx1RDgzRFxcdURFMEFgLiAgQmVjYXVzZSBpdHMgbGVuZ3RoXG4gICAgICAgIC8vIGlzIDIsIHRoZSBwcm9wZXJ0eSBgd2hpY2hgIGRvZXMgbm90IHJlcHJlc2VudCBhbiBlbW9qaSBjb3JyZWN0bHkuXG4gICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlLCB3ZSBkaXJlY3RseSByZXR1cm4gdGhlIGBjaGFyYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHVzaW5nIGB3aGljaGAuXG4gICAgICAgIGlmIChuYXRpdmVFdmVudC5jaGFyICYmIG5hdGl2ZUV2ZW50LmNoYXIubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHJldHVybiBuYXRpdmVFdmVudC5jaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKG5hdGl2ZUV2ZW50LndoaWNoKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobmF0aXZlRXZlbnQud2hpY2gpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSA/IG51bGwgOiBuYXRpdmVFdmVudC5kYXRhO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEV4dHJhY3QgYSBTeW50aGV0aWNJbnB1dEV2ZW50IGZvciBgYmVmb3JlSW5wdXRgLCBiYXNlZCBvbiBlaXRoZXIgbmF0aXZlXG4gKiBgdGV4dElucHV0YCBvciBmYWxsYmFjayBiZWhhdmlvci5cbiAqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgY2hhcnM7XG5cbiAgaWYgKGNhblVzZVRleHRJbnB1dEV2ZW50KSB7XG4gICAgY2hhcnMgPSBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICB9IGVsc2Uge1xuICAgIGNoYXJzID0gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICB9IC8vIElmIG5vIGNoYXJhY3RlcnMgYXJlIGJlaW5nIGluc2VydGVkLCBubyBCZWZvcmVJbnB1dCBldmVudCBzaG91bGRcbiAgLy8gYmUgZmlyZWQuXG5cblxuICBpZiAoIWNoYXJzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsICdvbkJlZm9yZUlucHV0Jyk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0lucHV0RXZlbnQoJ29uQmVmb3JlSW5wdXQnLCAnYmVmb3JlaW5wdXQnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICAgIGV2ZW50LmRhdGEgPSBjaGFycztcbiAgfVxufVxuLyoqXG4gKiBDcmVhdGUgYW4gYG9uQmVmb3JlSW5wdXRgIGV2ZW50IHRvIG1hdGNoXG4gKiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNS8jZXZlbnRzLWlucHV0ZXZlbnRzLlxuICpcbiAqIFRoaXMgZXZlbnQgcGx1Z2luIGlzIGJhc2VkIG9uIHRoZSBuYXRpdmUgYHRleHRJbnB1dGAgZXZlbnRcbiAqIGF2YWlsYWJsZSBpbiBDaHJvbWUsIFNhZmFyaSwgT3BlcmEsIGFuZCBJRS4gVGhpcyBldmVudCBmaXJlcyBhZnRlclxuICogYG9uS2V5UHJlc3NgIGFuZCBgb25Db21wb3NpdGlvbkVuZGAsIGJ1dCBiZWZvcmUgYG9uSW5wdXRgLlxuICpcbiAqIGBiZWZvcmVJbnB1dGAgaXMgc3BlYydkIGJ1dCBub3QgaW1wbGVtZW50ZWQgaW4gYW55IGJyb3dzZXJzLCBhbmRcbiAqIHRoZSBgaW5wdXRgIGV2ZW50IGRvZXMgbm90IHByb3ZpZGUgYW55IHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGhhc1xuICogYWN0dWFsbHkgYmVlbiBhZGRlZCwgY29udHJhcnkgdG8gdGhlIHNwZWMuIFRodXMsIGB0ZXh0SW5wdXRgIGlzIHRoZSBiZXN0XG4gKiBhdmFpbGFibGUgZXZlbnQgdG8gaWRlbnRpZnkgdGhlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4gaW5zZXJ0ZWRcbiAqIGludG8gdGhlIHRhcmdldCBub2RlLlxuICpcbiAqIFRoaXMgcGx1Z2luIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGBjb21wb3NpdGlvbmAgZXZlbnRzLCB0aHVzXG4gKiBhbGxvd2luZyB1cyB0byBzaGFyZSBjb21wb3NpdGlvbiBmYWxsYmFjayBjb2RlIGZvciBib3RoIGBiZWZvcmVJbnB1dGAgYW5kXG4gKiBgY29tcG9zaXRpb25gIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvdGhlLWlucHV0LWVsZW1lbnQuaHRtbCNpbnB1dC10eXBlLWF0dHItc3VtbWFyeVxuICovXG52YXIgc3VwcG9ydGVkSW5wdXRUeXBlcyA9IHtcbiAgY29sb3I6IHRydWUsXG4gIGRhdGU6IHRydWUsXG4gIGRhdGV0aW1lOiB0cnVlLFxuICAnZGF0ZXRpbWUtbG9jYWwnOiB0cnVlLFxuICBlbWFpbDogdHJ1ZSxcbiAgbW9udGg6IHRydWUsXG4gIG51bWJlcjogdHJ1ZSxcbiAgcGFzc3dvcmQ6IHRydWUsXG4gIHJhbmdlOiB0cnVlLFxuICBzZWFyY2g6IHRydWUsXG4gIHRlbDogdHJ1ZSxcbiAgdGV4dDogdHJ1ZSxcbiAgdGltZTogdHJ1ZSxcbiAgdXJsOiB0cnVlLFxuICB3ZWVrOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBpc1RleHRJbnB1dEVsZW1lbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ2lucHV0Jykge1xuICAgIHJldHVybiAhIXN1cHBvcnRlZElucHV0VHlwZXNbZWxlbS50eXBlXTtcbiAgfVxuXG4gIGlmIChub2RlTmFtZSA9PT0gJ3RleHRhcmVhJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIE5PVEU6IFRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG5vbi1nZW5lcmljIGV2ZW50cyBzdWNoIGFzIGBjaGFuZ2VgLFxuICogYHJlc2V0YCwgYGxvYWRgLCBgZXJyb3JgLCBhbmQgYHNlbGVjdGAuXG4gKlxuICogQm9ycm93cyBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lU3VmZml4IEV2ZW50IG5hbWUsIGUuZy4gXCJjbGlja1wiLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgc3VwcG9ydGVkLlxuICogQGludGVybmFsXG4gKiBAbGljZW5zZSBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiAqL1xuXG5mdW5jdGlvbiBpc0V2ZW50U3VwcG9ydGVkKGV2ZW50TmFtZVN1ZmZpeCkge1xuICBpZiAoIWNhblVzZURPTSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBldmVudE5hbWUgPSAnb24nICsgZXZlbnROYW1lU3VmZml4O1xuICB2YXIgaXNTdXBwb3J0ZWQgPSAoZXZlbnROYW1lIGluIGRvY3VtZW50KTtcblxuICBpZiAoIWlzU3VwcG9ydGVkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShldmVudE5hbWUsICdyZXR1cm47Jyk7XG4gICAgaXNTdXBwb3J0ZWQgPSB0eXBlb2YgZWxlbWVudFtldmVudE5hbWVdID09PSAnZnVuY3Rpb24nO1xuICB9XG5cbiAgcmV0dXJuIGlzU3VwcG9ydGVkO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQxKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ2hhbmdlJywgWydjaGFuZ2UnLCAnY2xpY2snLCAnZm9jdXNpbicsICdmb2N1c291dCcsICdpbnB1dCcsICdrZXlkb3duJywgJ2tleXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpIHtcbiAgLy8gRmxhZyB0aGlzIGV2ZW50IGxvb3AgYXMgbmVlZGluZyBzdGF0ZSByZXN0b3JlLlxuICBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCk7XG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoaW5zdCwgJ29uQ2hhbmdlJyk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvbkNoYW5nZScsICdjaGFuZ2UnLCBudWxsLCBuYXRpdmVFdmVudCwgdGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBGb3IgSUUgc2hpbXNcbiAqL1xuXG5cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2hhbmdlYCBldmVudFxuICovXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNoYW5nZUV2ZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ3NlbGVjdCcgfHwgbm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgZWxlbS50eXBlID09PSAnZmlsZSc7XG59XG5cbmZ1bmN0aW9uIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpKTsgLy8gSWYgY2hhbmdlIGFuZCBwcm9wZXJ0eWNoYW5nZSBidWJibGVkLCB3ZSdkIGp1c3QgYmluZCB0byBpdCBsaWtlIGFsbCB0aGVcbiAgLy8gb3RoZXIgZXZlbnRzIGFuZCBoYXZlIGl0IGdvIHRocm91Z2ggUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLiBTaW5jZSBpdFxuICAvLyBkb2Vzbid0LCB3ZSBtYW51YWxseSBsaXN0ZW4gZm9yIHRoZSBldmVudHMgYW5kIHNvIHdlIGhhdmUgdG8gZW5xdWV1ZSBhbmRcbiAgLy8gcHJvY2VzcyB0aGUgYWJzdHJhY3QgZXZlbnQgbWFudWFsbHkuXG4gIC8vXG4gIC8vIEJhdGNoaW5nIGlzIG5lY2Vzc2FyeSBoZXJlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGFsbCBldmVudCBoYW5kbGVycyBydW5cbiAgLy8gYmVmb3JlIHRoZSBuZXh0IHJlcmVuZGVyIChpbmNsdWRpbmcgZXZlbnQgaGFuZGxlcnMgYXR0YWNoZWQgdG8gYW5jZXN0b3JcbiAgLy8gZWxlbWVudHMgaW5zdGVhZCBvZiBkaXJlY3RseSBvbiB0aGUgaW5wdXQpLiBXaXRob3V0IHRoaXMsIGNvbnRyb2xsZWRcbiAgLy8gY29tcG9uZW50cyBkb24ndCB3b3JrIHByb3Blcmx5IGluIGNvbmp1bmN0aW9uIHdpdGggZXZlbnQgYnViYmxpbmcgYmVjYXVzZVxuICAvLyB0aGUgY29tcG9uZW50IGlzIHJlcmVuZGVyZWQgYW5kIHRoZSB2YWx1ZSByZXZlcnRlZCBiZWZvcmUgYWxsIHRoZSBldmVudFxuICAvLyBoYW5kbGVycyBjYW4gcnVuLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MDguXG5cbiAgYmF0Y2hlZFVwZGF0ZXMocnVuRXZlbnRJbkJhdGNoLCBkaXNwYXRjaFF1ZXVlKTtcbn1cblxuZnVuY3Rpb24gcnVuRXZlbnRJbkJhdGNoKGRpc3BhdGNoUXVldWUpIHtcbiAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgMCk7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KSB7XG4gIHZhciB0YXJnZXROb2RlID0gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KTtcblxuICBpZiAodXBkYXRlVmFsdWVJZkNoYW5nZWQodGFyZ2V0Tm9kZSkpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBpbnB1dGAgZXZlbnRcbiAqL1xuXG5cbnZhciBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBmYWxzZTtcblxuaWYgKGNhblVzZURPTSkge1xuICAvLyBJRTkgY2xhaW1zIHRvIHN1cHBvcnQgdGhlIGlucHV0IGV2ZW50IGJ1dCBmYWlscyB0byB0cmlnZ2VyIGl0IHdoZW5cbiAgLy8gZGVsZXRpbmcgdGV4dCwgc28gd2UgaWdub3JlIGl0cyBpbnB1dCBldmVudHMuXG4gIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2lucHV0JykgJiYgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID4gOSk7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBTdGFydHMgdHJhY2tpbmcgcHJvcGVydHljaGFuZ2UgZXZlbnRzIG9uIHRoZSBwYXNzZWQtaW4gZWxlbWVudFxuICogYW5kIG92ZXJyaWRlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB1c2VyIGV2ZW50cyBmcm9tXG4gKiB2YWx1ZSBjaGFuZ2VzIGluIEpTLlxuICovXG5cblxuZnVuY3Rpb24gc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0O1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3Q7XG4gIGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBSZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lcnMgZnJvbSB0aGUgY3VycmVudGx5LXRyYWNrZWQgZWxlbWVudCxcbiAqIGlmIGFueSBleGlzdHMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHtcbiAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIEhhbmRsZXMgYSBwcm9wZXJ0eWNoYW5nZSBldmVudCwgc2VuZGluZyBhIGBjaGFuZ2VgIGV2ZW50IGlmXG4gKiB0aGUgdmFsdWUgb2YgdGhlIGFjdGl2ZSBlbGVtZW50IGhhcyBjaGFuZ2VkLlxuICovXG5cblxuZnVuY3Rpb24gaGFuZGxlUHJvcGVydHlDaGFuZ2UobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LnByb3BlcnR5TmFtZSAhPT0gJ3ZhbHVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpKSB7XG4gICAgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSwgdGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c2luJykge1xuICAgIC8vIEluIElFOSwgcHJvcGVydHljaGFuZ2UgZmlyZXMgZm9yIG1vc3QgaW5wdXQgZXZlbnRzIGJ1dCBpcyBidWdneSBhbmRcbiAgICAvLyBkb2Vzbid0IGZpcmUgd2hlbiB0ZXh0IGlzIGRlbGV0ZWQsIGJ1dCBjb252ZW5pZW50bHksIHNlbGVjdGlvbmNoYW5nZVxuICAgIC8vIGFwcGVhcnMgdG8gZmlyZSBpbiBhbGwgb2YgdGhlIHJlbWFpbmluZyBjYXNlcyBzbyB3ZSBjYXRjaCB0aG9zZSBhbmRcbiAgICAvLyBmb3J3YXJkIHRoZSBldmVudCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWRcbiAgICAvLyBJbiBlaXRoZXIgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIHRoZSB2YWx1ZVxuICAgIC8vIGlzIGNoYW5nZWQgZnJvbSBKUyBzbyB3ZSByZWRlZmluZSBhIHNldHRlciBmb3IgYC52YWx1ZWAgdGhhdCB1cGRhdGVzXG4gICAgLy8gb3VyIGFjdGl2ZUVsZW1lbnRWYWx1ZSB2YXJpYWJsZSwgYWxsb3dpbmcgdXMgdG8gaWdub3JlIHRob3NlIGNoYW5nZXNcbiAgICAvL1xuICAgIC8vIHN0b3BXYXRjaGluZygpIHNob3VsZCBiZSBhIG5vb3AgaGVyZSBidXQgd2UgY2FsbCBpdCBqdXN0IGluIGNhc2Ugd2VcbiAgICAvLyBtaXNzZWQgYSBibHVyIGV2ZW50IHNvbWVob3cuXG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgICBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KTtcbiAgfSBlbHNlIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c291dCcpIHtcbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICB9XG59IC8vIEZvciBJRTggYW5kIElFOS5cblxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnc2VsZWN0aW9uY2hhbmdlJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXl1cCcgfHwgZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicpIHtcbiAgICAvLyBPbiB0aGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50LCB0aGUgdGFyZ2V0IGlzIGp1c3QgZG9jdW1lbnQgd2hpY2ggaXNuJ3RcbiAgICAvLyBoZWxwZnVsIGZvciB1cyBzbyBqdXN0IGNoZWNrIGFjdGl2ZUVsZW1lbnQgaW5zdGVhZC5cbiAgICAvL1xuICAgIC8vIDk5JSBvZiB0aGUgdGltZSwga2V5ZG93biBhbmQga2V5dXAgYXJlbid0IG5lY2Vzc2FyeS4gSUU4IGZhaWxzIHRvIGZpcmVcbiAgICAvLyBwcm9wZXJ0eWNoYW5nZSBvbiB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYWZ0ZXIgc2V0dGluZyBgdmFsdWVgIGZyb20gYVxuICAgIC8vIHNjcmlwdCBhbmQgZmlyZXMgb25seSBrZXlkb3duLCBrZXlwcmVzcywga2V5dXAuIENhdGNoaW5nIGtleXVwIHVzdWFsbHlcbiAgICAvLyBnZXRzIGl0IGFuZCBjYXRjaGluZyBrZXlkb3duIGxldHMgdXMgZmlyZSBhbiBldmVudCBmb3IgdGhlIGZpcnN0XG4gICAgLy8ga2V5c3Ryb2tlIGlmIHVzZXIgZG9lcyBhIGtleSByZXBlYXQgKGl0J2xsIGJlIGEgbGl0dGxlIGRlbGF5ZWQ6IHJpZ2h0XG4gICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQga2V5c3Ryb2tlKS4gT3RoZXIgaW5wdXQgbWV0aG9kcyAoZS5nLiwgcGFzdGUpIHNlZW0gdG9cbiAgICAvLyBmaXJlIHNlbGVjdGlvbmNoYW5nZSBub3JtYWxseS5cbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0KTtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNsaWNrYCBldmVudFxuICovXG5cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2xpY2tFdmVudChlbGVtKSB7XG4gIC8vIFVzZSB0aGUgYGNsaWNrYCBldmVudCB0byBkZXRlY3QgY2hhbmdlcyB0byBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzLlxuICAvLyBUaGlzIGFwcHJvYWNoIHdvcmtzIGFjcm9zcyBhbGwgYnJvd3NlcnMsIHdoZXJlYXMgYGNoYW5nZWAgZG9lcyBub3QgZmlyZVxuICAvLyB1bnRpbCBgYmx1cmAgaW4gSUU4LlxuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW0udHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2xpY2snKSB7XG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnaW5wdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIobm9kZSkge1xuICB2YXIgc3RhdGUgPSBub2RlLl93cmFwcGVyU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuY29udHJvbGxlZCB8fCBub2RlLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIElmIGNvbnRyb2xsZWQsIGFzc2lnbiB0aGUgdmFsdWUgYXR0cmlidXRlIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9uIGJsdXJcbiAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgJ251bWJlcicsIG5vZGUudmFsdWUpO1xuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uQ2hhbmdlYCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgY2hhbmdlIGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuIFRoaXMgZXZlbnQgZmlyZXMgYXQgYSB0aW1lIHdoZW4gaXQncyBwb3NzaWJsZSB0b1xuICogY2hhbmdlIHRoZSBlbGVtZW50J3MgdmFsdWUgd2l0aG91dCBzZWVpbmcgYSBmbGlja2VyLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIHNlbGVjdFxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcbiAgdmFyIGdldFRhcmdldEluc3RGdW5jLCBoYW5kbGVFdmVudEZ1bmM7XG5cbiAgaWYgKHNob3VsZFVzZUNoYW5nZUV2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQ7XG4gIH0gZWxzZSBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpKSB7XG4gICAgaWYgKGlzSW5wdXRFdmVudFN1cHBvcnRlZCkge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICBoYW5kbGVFdmVudEZ1bmMgPSBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgfVxuICB9IGVsc2UgaWYgKHNob3VsZFVzZUNsaWNrRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50O1xuICB9XG5cbiAgaWYgKGdldFRhcmdldEluc3RGdW5jKSB7XG4gICAgdmFyIGluc3QgPSBnZXRUYXJnZXRJbnN0RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldEluc3QpO1xuXG4gICAgaWYgKGluc3QpIHtcbiAgICAgIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBpbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYW5kbGVFdmVudEZ1bmMpIHtcbiAgICBoYW5kbGVFdmVudEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXROb2RlLCB0YXJnZXRJbnN0KTtcbiAgfSAvLyBXaGVuIGJsdXJyaW5nLCBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSBmb3IgbnVtYmVyIGlucHV0c1xuXG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIodGFyZ2V0Tm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMigpIHtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUVudGVyJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uTW91c2VMZWF2ZScsIFsnbW91c2VvdXQnLCAnbW91c2VvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJFbnRlcicsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Qb2ludGVyTGVhdmUnLCBbJ3BvaW50ZXJvdXQnLCAncG9pbnRlcm92ZXInXSk7XG59XG4vKipcbiAqIEZvciBhbG1vc3QgZXZlcnkgaW50ZXJhY3Rpb24gd2UgY2FyZSBhYm91dCwgdGhlcmUgd2lsbCBiZSBib3RoIGEgdG9wLWxldmVsXG4gKiBgbW91c2VvdmVyYCBhbmQgYG1vdXNlb3V0YCBldmVudCB0aGF0IG9jY3Vycy4gT25seSB1c2UgYG1vdXNlb3V0YCBzbyB0aGF0XG4gKiB3ZSBkbyBub3QgZXh0cmFjdCBkdXBsaWNhdGUgZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhlXG4gKiBicm93c2VyIGZyb20gb3V0c2lkZSB3aWxsIG5vdCBmaXJlIGEgYG1vdXNlb3V0YCBldmVudC4gSW4gdGhpcyBjYXNlLCB3ZSB1c2VcbiAqIHRoZSBgbW91c2VvdmVyYCB0b3AtbGV2ZWwgZXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDIoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgaXNPdmVyRXZlbnQgPSBkb21FdmVudE5hbWUgPT09ICdtb3VzZW92ZXInIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJztcbiAgdmFyIGlzT3V0RXZlbnQgPSBkb21FdmVudE5hbWUgPT09ICdtb3VzZW91dCcgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm91dCc7XG5cbiAgaWYgKGlzT3ZlckV2ZW50ICYmICFpc1JlcGxheWluZ0V2ZW50KG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIElmIHRoaXMgaXMgYW4gb3ZlciBldmVudCB3aXRoIGEgdGFyZ2V0LCB3ZSBtaWdodCBoYXZlIGFscmVhZHkgZGlzcGF0Y2hlZFxuICAgIC8vIHRoZSBldmVudCBpbiB0aGUgb3V0IGV2ZW50IG9mIHRoZSBvdGhlciB0YXJnZXQuIElmIHRoaXMgaXMgcmVwbGF5ZWQsXG4gICAgLy8gdGhlbiBpdCdzIGJlY2F1c2Ugd2UgY291bGRuJ3QgZGlzcGF0Y2ggYWdhaW5zdCB0aGlzIHRhcmdldCBwcmV2aW91c2x5XG4gICAgLy8gc28gd2UgaGF2ZSB0byBkbyBpdCBub3cgaW5zdGVhZC5cbiAgICB2YXIgcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQ7XG5cbiAgICBpZiAocmVsYXRlZCkge1xuICAgICAgLy8gSWYgdGhlIHJlbGF0ZWQgbm9kZSBpcyBtYW5hZ2VkIGJ5IFJlYWN0LCB3ZSBjYW4gYXNzdW1lIHRoYXQgd2UgaGF2ZVxuICAgICAgLy8gYWxyZWFkeSBkaXNwYXRjaGVkIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50cyBkdXJpbmcgaXRzIG1vdXNlb3V0LlxuICAgICAgaWYgKGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJlbGF0ZWQpIHx8IGlzQ29udGFpbmVyTWFya2VkQXNSb290KHJlbGF0ZWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWlzT3V0RXZlbnQgJiYgIWlzT3ZlckV2ZW50KSB7XG4gICAgLy8gTXVzdCBub3QgYmUgYSBtb3VzZSBvciBwb2ludGVyIGluIG9yIG91dCAtIGlnbm9yaW5nLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB3aW47IC8vIFRPRE86IHdoeSBpcyB0aGlzIG51bGxhYmxlIGluIHRoZSB0eXBlcyBidXQgd2UgcmVhZCBmcm9tIGl0P1xuXG4gIGlmIChuYXRpdmVFdmVudFRhcmdldC53aW5kb3cgPT09IG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgLy8gYG5hdGl2ZUV2ZW50VGFyZ2V0YCBpcyBwcm9iYWJseSBhIHdpbmRvdyBvYmplY3QuXG4gICAgd2luID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1lbnRgIGlzIHNvbWV0aW1lcyB1bmRlZmluZWQgaW4gSUU4LlxuICAgIHZhciBkb2MgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50O1xuXG4gICAgaWYgKGRvYykge1xuICAgICAgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbiA9IHdpbmRvdztcbiAgICB9XG4gIH1cblxuICB2YXIgZnJvbTtcbiAgdmFyIHRvO1xuXG4gIGlmIChpc091dEV2ZW50KSB7XG4gICAgdmFyIF9yZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC50b0VsZW1lbnQ7XG5cbiAgICBmcm9tID0gdGFyZ2V0SW5zdDtcbiAgICB0byA9IF9yZWxhdGVkID8gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoX3JlbGF0ZWQpIDogbnVsbDtcblxuICAgIGlmICh0byAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0byk7XG5cbiAgICAgIGlmICh0byAhPT0gbmVhcmVzdE1vdW50ZWQgfHwgdG8udGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIHRvLnRhZyAhPT0gSG9zdFRleHQpIHtcbiAgICAgICAgdG8gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBNb3ZpbmcgdG8gYSBub2RlIGZyb20gb3V0c2lkZSB0aGUgd2luZG93LlxuICAgIGZyb20gPSBudWxsO1xuICAgIHRvID0gdGFyZ2V0SW5zdDtcbiAgfVxuXG4gIGlmIChmcm9tID09PSB0bykge1xuICAgIC8vIE5vdGhpbmcgcGVydGFpbnMgdG8gb3VyIG1hbmFnZWQgY29tcG9uZW50cy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgdmFyIGxlYXZlRXZlbnRUeXBlID0gJ29uTW91c2VMZWF2ZSc7XG4gIHZhciBlbnRlckV2ZW50VHlwZSA9ICdvbk1vdXNlRW50ZXInO1xuICB2YXIgZXZlbnRUeXBlUHJlZml4ID0gJ21vdXNlJztcblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm91dCcgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInKSB7XG4gICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50O1xuICAgIGxlYXZlRXZlbnRUeXBlID0gJ29uUG9pbnRlckxlYXZlJztcbiAgICBlbnRlckV2ZW50VHlwZSA9ICdvblBvaW50ZXJFbnRlcic7XG4gICAgZXZlbnRUeXBlUHJlZml4ID0gJ3BvaW50ZXInO1xuICB9XG5cbiAgdmFyIGZyb21Ob2RlID0gZnJvbSA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZShmcm9tKTtcbiAgdmFyIHRvTm9kZSA9IHRvID09IG51bGwgPyB3aW4gOiBnZXROb2RlRnJvbUluc3RhbmNlKHRvKTtcbiAgdmFyIGxlYXZlID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihsZWF2ZUV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2xlYXZlJywgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgbGVhdmUudGFyZ2V0ID0gZnJvbU5vZGU7XG4gIGxlYXZlLnJlbGF0ZWRUYXJnZXQgPSB0b05vZGU7XG4gIHZhciBlbnRlciA9IG51bGw7IC8vIFdlIHNob3VsZCBvbmx5IHByb2Nlc3MgdGhpcyBuYXRpdmVFdmVudCBpZiB3ZSBhcmUgcHJvY2Vzc2luZ1xuICAvLyB0aGUgZmlyc3QgYW5jZXN0b3IuIE5leHQgdGltZSwgd2Ugd2lsbCBpZ25vcmUgdGhlIGV2ZW50LlxuXG4gIHZhciBuYXRpdmVUYXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChuYXRpdmVUYXJnZXRJbnN0ID09PSB0YXJnZXRJbnN0KSB7XG4gICAgdmFyIGVudGVyRXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKGVudGVyRXZlbnRUeXBlLCBldmVudFR5cGVQcmVmaXggKyAnZW50ZXInLCB0bywgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBlbnRlckV2ZW50LnRhcmdldCA9IHRvTm9kZTtcbiAgICBlbnRlckV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBmcm9tTm9kZTtcbiAgICBlbnRlciA9IGVudGVyRXZlbnQ7XG4gIH1cblxuICBhY2N1bXVsYXRlRW50ZXJMZWF2ZVR3b1BoYXNlTGlzdGVuZXJzKGRpc3BhdGNoUXVldWUsIGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pO1xufVxuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIG9iamVjdElzID0gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGlzO1xuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cblxuZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKG9iamVjdElzKG9iakEsIG9iakIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzQVtpXTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBjdXJyZW50S2V5KSB8fCAhb2JqZWN0SXMob2JqQVtjdXJyZW50S2V5XSwgb2JqQltjdXJyZW50S2V5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5mdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGlsZCkge1xuICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cbi8qKlxuICogR2V0IHRoZSBuZXh0IHNpYmxpbmcgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIHdpbGwgd2FsayB1cCB0aGVcbiAqIERPTSBpZiBhIG5vZGUncyBzaWJsaW5ncyBoYXZlIGJlZW4gZXhoYXVzdGVkLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7P0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRTaWJsaW5nTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gIH1cbn1cbi8qKlxuICogR2V0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBub2RlcyB3aGljaCBjb250YWluIGNoYXJhY3RlcnMgYXQgb2Zmc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gcm9vdFxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQocm9vdCwgb2Zmc2V0KSB7XG4gIHZhciBub2RlID0gZ2V0TGVhZk5vZGUocm9vdCk7XG4gIHZhciBub2RlU3RhcnQgPSAwO1xuICB2YXIgbm9kZUVuZCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBub2RlRW5kID0gbm9kZVN0YXJ0ICsgbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG5cbiAgICAgIGlmIChub2RlU3RhcnQgPD0gb2Zmc2V0ICYmIG5vZGVFbmQgPj0gb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICBvZmZzZXQ6IG9mZnNldCAtIG5vZGVTdGFydFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBub2RlU3RhcnQgPSBub2RlRW5kO1xuICAgIH1cblxuICAgIG5vZGUgPSBnZXRMZWFmTm9kZShnZXRTaWJsaW5nTm9kZShub2RlKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG91dGVyTm9kZVxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRPZmZzZXRzKG91dGVyTm9kZSkge1xuICB2YXIgb3duZXJEb2N1bWVudCA9IG91dGVyTm9kZS5vd25lckRvY3VtZW50O1xuICB2YXIgd2luID0gb3duZXJEb2N1bWVudCAmJiBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24gJiYgd2luLmdldFNlbGVjdGlvbigpO1xuXG4gIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZSA9IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldDsgLy8gSW4gRmlyZWZveCwgYW5jaG9yTm9kZSBhbmQgZm9jdXNOb2RlIGNhbiBiZSBcImFub255bW91cyBkaXZzXCIsIGUuZy4gdGhlXG4gIC8vIHVwL2Rvd24gYnV0dG9ucyBvbiBhbiA8aW5wdXQgdHlwZT1cIm51bWJlclwiPi4gQW5vbnltb3VzIGRpdnMgZG8gbm90IHNlZW0gdG9cbiAgLy8gZXhwb3NlIHByb3BlcnRpZXMsIHRyaWdnZXJpbmcgYSBcIlBlcm1pc3Npb24gZGVuaWVkIGVycm9yXCIgaWYgYW55IG9mIGl0c1xuICAvLyBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZC4gVGhlIG9ubHkgc2VlbWluZ2x5IHBvc3NpYmxlIHdheSB0byBhdm9pZCBlcnJvcmluZ1xuICAvLyBpcyB0byBhY2Nlc3MgYSBwcm9wZXJ0eSB0aGF0IHR5cGljYWxseSB3b3JrcyBmb3Igbm9uLWFub255bW91cyBkaXZzIGFuZFxuICAvLyBjYXRjaCBhbnkgZXJyb3IgdGhhdCBtYXkgb3RoZXJ3aXNlIGFyaXNlLiBTZWVcbiAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NDI3XG5cbiAgdHJ5IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgICBhbmNob3JOb2RlLm5vZGVUeXBlO1xuICAgIGZvY3VzTm9kZS5ub2RlVHlwZTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0TW9kZXJuT2Zmc2V0c0Zyb21Qb2ludHMob3V0ZXJOb2RlLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHtzdGFydCwgZW5kfSB3aGVyZSBgc3RhcnRgIGlzIHRoZSBjaGFyYWN0ZXIvY29kZXBvaW50IGluZGV4IG9mXG4gKiAoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KSB3aXRoaW4gdGhlIHRleHRDb250ZW50IG9mIGBvdXRlck5vZGVgLCBhbmRcbiAqIGBlbmRgIGlzIHRoZSBpbmRleCBvZiAoZm9jdXNOb2RlLCBmb2N1c09mZnNldCkuXG4gKlxuICogUmV0dXJucyBudWxsIGlmIHlvdSBwYXNzIGluIGdhcmJhZ2UgaW5wdXQgYnV0IHdlIHNob3VsZCBwcm9iYWJseSBqdXN0IGNyYXNoLlxuICpcbiAqIEV4cG9ydGVkIG9ubHkgZm9yIHRlc3RpbmcuXG4gKi9cblxuZnVuY3Rpb24gZ2V0TW9kZXJuT2Zmc2V0c0Zyb21Qb2ludHMob3V0ZXJOb2RlLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpIHtcbiAgdmFyIGxlbmd0aCA9IDA7XG4gIHZhciBzdGFydCA9IC0xO1xuICB2YXIgZW5kID0gLTE7XG4gIHZhciBpbmRleFdpdGhpbkFuY2hvciA9IDA7XG4gIHZhciBpbmRleFdpdGhpbkZvY3VzID0gMDtcbiAgdmFyIG5vZGUgPSBvdXRlck5vZGU7XG4gIHZhciBwYXJlbnROb2RlID0gbnVsbDtcblxuICBvdXRlcjogd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbmV4dCA9IG51bGw7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IGFuY2hvck5vZGUgJiYgKGFuY2hvck9mZnNldCA9PT0gMCB8fCBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpKSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoICsgYW5jaG9yT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZm9jdXNOb2RlICYmIChmb2N1c09mZnNldCA9PT0gMCB8fCBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpKSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aCArIGZvY3VzT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICAgIGxlbmd0aCArPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUuZmlyc3RDaGlsZCkgPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgZmlyc3QgY2hpbGQgYG5leHRgLlxuXG5cbiAgICAgIHBhcmVudE5vZGUgPSBub2RlO1xuICAgICAgbm9kZSA9IG5leHQ7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBvdXRlck5vZGUpIHtcbiAgICAgICAgLy8gSWYgYG91dGVyTm9kZWAgaGFzIGNoaWxkcmVuLCB0aGlzIGlzIGFsd2F5cyB0aGUgc2Vjb25kIHRpbWUgdmlzaXRpbmdcbiAgICAgICAgLy8gaXQuIElmIGl0IGhhcyBubyBjaGlsZHJlbiwgdGhpcyBpcyBzdGlsbCB0aGUgZmlyc3QgbG9vcCwgYW5kIHRoZSBvbmx5XG4gICAgICAgIC8vIHZhbGlkIHNlbGVjdGlvbiBpcyBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgYm90aCBlcXVhbCB0byB0aGlzIG5vZGVcbiAgICAgICAgLy8gYW5kIGJvdGggb2Zmc2V0cyAwLCBpbiB3aGljaCBjYXNlIHdlIHdpbGwgaGF2ZSBoYW5kbGVkIGFib3ZlLlxuICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGFuY2hvck5vZGUgJiYgKytpbmRleFdpdGhpbkFuY2hvciA9PT0gYW5jaG9yT2Zmc2V0KSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gZm9jdXNOb2RlICYmICsraW5kZXhXaXRoaW5Gb2N1cyA9PT0gZm9jdXNPZmZzZXQpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5leHQgPSBub2RlLm5leHRTaWJsaW5nKSAhPT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBuZXh0IHNpYmxpbmcgYG5leHRgLlxuXG5cbiAgICBub2RlID0gbmV4dDtcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gLTEgfHwgZW5kID09PSAtMSkge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKFdvdWxkIGhhcHBlbiBpZiB0aGUgYW5jaG9yL2ZvY3VzIG5vZGVzIGFyZW4ndFxuICAgIC8vIGFjdHVhbGx5IGluc2lkZSB0aGUgcGFzc2VkLWluIG5vZGUuKVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogc3RhcnQsXG4gICAgZW5kOiBlbmRcbiAgfTtcbn1cbi8qKlxuICogSW4gbW9kZXJuIG5vbi1JRSBicm93c2Vycywgd2UgY2FuIHN1cHBvcnQgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZFxuICogc2VsZWN0aW9ucy5cbiAqXG4gKiBOb3RlOiBJRTEwKyBzdXBwb3J0cyB0aGUgU2VsZWN0aW9uIG9iamVjdCwgYnV0IGl0IGRvZXMgbm90IHN1cHBvcnRcbiAqIHRoZSBgZXh0ZW5kYCBtZXRob2QsIHdoaWNoIG1lYW5zIHRoYXQgZXZlbiBpbiBtb2Rlcm4gSUUsIGl0J3Mgbm90IHBvc3NpYmxlXG4gKiB0byBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZSBhIGJhY2t3YXJkIHNlbGVjdGlvbi4gVGh1cywgZm9yIGFsbCBJRVxuICogdmVyc2lvbnMsIHdlIHVzZSB0aGUgb2xkIElFIEFQSSB0byBjcmVhdGUgb3VyIHNlbGVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gb2Zmc2V0c1xuICovXG5cbmZ1bmN0aW9uIHNldE9mZnNldHMobm9kZSwgb2Zmc2V0cykge1xuICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xuICB2YXIgd2luID0gZG9jICYmIGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IC8vIEVkZ2UgZmFpbHMgd2l0aCBcIk9iamVjdCBleHBlY3RlZFwiIGluIHNvbWUgc2NlbmFyaW9zLlxuICAvLyAoRm9yIGluc3RhbmNlOiBUaW55TUNFIGVkaXRvciB1c2VkIGluIGEgbGlzdCBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyBwYXN0aW5nIHRvIGFkZCBtb3JlLFxuICAvLyBmYWlscyB3aGVuIHBhc3RpbmcgMTAwKyBpdGVtcylcblxuICBpZiAoIXdpbi5nZXRTZWxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICB2YXIgbGVuZ3RoID0gbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG4gIHZhciBzdGFydCA9IE1hdGgubWluKG9mZnNldHMuc3RhcnQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZCA9PT0gdW5kZWZpbmVkID8gc3RhcnQgOiBNYXRoLm1pbihvZmZzZXRzLmVuZCwgbGVuZ3RoKTsgLy8gSUUgMTEgdXNlcyBtb2Rlcm4gc2VsZWN0aW9uLCBidXQgZG9lc24ndCBzdXBwb3J0IHRoZSBleHRlbmQgbWV0aG9kLlxuICAvLyBGbGlwIGJhY2t3YXJkIHNlbGVjdGlvbnMsIHNvIHdlIGNhbiBzZXQgd2l0aCBhIHNpbmdsZSByYW5nZS5cblxuICBpZiAoIXNlbGVjdGlvbi5leHRlbmQgJiYgc3RhcnQgPiBlbmQpIHtcbiAgICB2YXIgdGVtcCA9IGVuZDtcbiAgICBlbmQgPSBzdGFydDtcbiAgICBzdGFydCA9IHRlbXA7XG4gIH1cblxuICB2YXIgc3RhcnRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIHN0YXJ0KTtcbiAgdmFyIGVuZE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgZW5kKTtcblxuICBpZiAoc3RhcnRNYXJrZXIgJiYgZW5kTWFya2VyKSB7XG4gICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAxICYmIHNlbGVjdGlvbi5hbmNob3JOb2RlID09PSBzdGFydE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgPT09IHN0YXJ0TWFya2VyLm9mZnNldCAmJiBzZWxlY3Rpb24uZm9jdXNOb2RlID09PSBlbmRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uZm9jdXNPZmZzZXQgPT09IGVuZE1hcmtlci5vZmZzZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZXRTdGFydChzdGFydE1hcmtlci5ub2RlLCBzdGFydE1hcmtlci5vZmZzZXQpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcblxuICAgIGlmIChzdGFydCA+IGVuZCkge1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgIHNlbGVjdGlvbi5leHRlbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZS5zZXRFbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNUZXh0Tm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gIGlmICghb3V0ZXJOb2RlIHx8ICFpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlID09PSBpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKG91dGVyTm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShpbm5lck5vZGUpKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZS5wYXJlbnROb2RlKTtcbiAgfSBlbHNlIGlmICgnY29udGFpbnMnIGluIG91dGVyTm9kZSkge1xuICAgIHJldHVybiBvdXRlck5vZGUuY29udGFpbnMoaW5uZXJOb2RlKTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICByZXR1cm4gISEob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGlubmVyTm9kZSkgJiAxNik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW5Eb2N1bWVudChub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBjb250YWluc05vZGUobm9kZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgbm9kZSk7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbkZyYW1lKGlmcmFtZSkge1xuICB0cnkge1xuICAgIC8vIEFjY2Vzc2luZyB0aGUgY29udGVudERvY3VtZW50IG9mIGEgSFRNTElmcmFtZUVsZW1lbnQgY2FuIGNhdXNlIHRoZSBicm93c2VyXG4gICAgLy8gdG8gdGhyb3csIGUuZy4gaWYgaXQgaGFzIGEgY3Jvc3Mtb3JpZ2luIHNyYyBhdHRyaWJ1dGUuXG4gICAgLy8gU2FmYXJpIHdpbGwgc2hvdyBhbiBlcnJvciBpbiB0aGUgY29uc29sZSB3aGVuIHRoZSBhY2Nlc3MgcmVzdWx0cyBpbiBcIkJsb2NrZWQgYSBmcmFtZSB3aXRoIG9yaWdpblwiLiBlLmc6XG4gICAgLy8gaWZyYW1lLmNvbnRlbnREb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAvLyBBIHNhZmV0eSB3YXkgaXMgdG8gYWNjZXNzIG9uZSBvZiB0aGUgY3Jvc3Mgb3JpZ2luIHByb3BlcnRpZXM6IFdpbmRvdyBvciBMb2NhdGlvblxuICAgIC8vIFdoaWNoIG1pZ2h0IHJlc3VsdCBpbiBcIlNlY3VyaXR5RXJyb3JcIiBET00gRXhjZXB0aW9uIGFuZCBpdCBpcyBjb21wYXRpYmxlIHRvIFNhZmFyaS5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9icm93c2Vycy5odG1sI2ludGVncmF0aW9uLXdpdGgtaWRsXG4gICAgcmV0dXJuIHR5cGVvZiBpZnJhbWUuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmID09PSAnc3RyaW5nJztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnREZWVwKCkge1xuICB2YXIgd2luID0gd2luZG93O1xuICB2YXIgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoKTtcblxuICB3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIHdpbi5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgIGlmIChpc1NhbWVPcmlnaW5GcmFtZShlbGVtZW50KSkge1xuICAgICAgd2luID0gZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCh3aW4uZG9jdW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG4vKipcbiAqIEBSZWFjdElucHV0U2VsZWN0aW9uOiBSZWFjdCBpbnB1dCBzZWxlY3Rpb24gbW9kdWxlLiBCYXNlZCBvbiBTZWxlY3Rpb24uanMsXG4gKiBidXQgbW9kaWZpZWQgdG8gYmUgc3VpdGFibGUgZm9yIHJlYWN0IGFuZCBoYXMgYSBjb3VwbGUgb2YgYnVnIGZpeGVzIChkb2Vzbid0XG4gKiBhc3N1bWUgYnV0dG9ucyBoYXZlIHJhbmdlIHNlbGVjdGlvbnMgYWxsb3dlZCkuXG4gKiBJbnB1dCBzZWxlY3Rpb24gbW9kdWxlIGZvciBSZWFjdC5cbiAqL1xuXG4vKipcbiAqIEBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6IHdlIGdldCB0aGUgZWxlbWVudCB0eXBlcyB0aGF0IHN1cHBvcnQgc2VsZWN0aW9uXG4gKiBmcm9tIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2RvLW5vdC1hcHBseSwgbG9va2luZyBhdCBgc2VsZWN0aW9uU3RhcnRgXG4gKiBhbmQgYHNlbGVjdGlvbkVuZGAgcm93cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSAmJiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ3RleHQnIHx8IGVsZW0udHlwZSA9PT0gJ3NlYXJjaCcgfHwgZWxlbS50eXBlID09PSAndGVsJyB8fCBlbGVtLnR5cGUgPT09ICd1cmwnIHx8IGVsZW0udHlwZSA9PT0gJ3Bhc3N3b3JkJykgfHwgbm9kZU5hbWUgPT09ICd0ZXh0YXJlYScgfHwgZWxlbS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJyk7XG59XG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpIHtcbiAgdmFyIGZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgcmV0dXJuIHtcbiAgICBmb2N1c2VkRWxlbTogZm9jdXNlZEVsZW0sXG4gICAgc2VsZWN0aW9uUmFuZ2U6IGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhmb2N1c2VkRWxlbSkgPyBnZXRTZWxlY3Rpb24oZm9jdXNlZEVsZW0pIDogbnVsbFxuICB9O1xufVxuLyoqXG4gKiBAcmVzdG9yZVNlbGVjdGlvbjogSWYgYW55IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB3YXMgcG90ZW50aWFsbHkgbG9zdCxcbiAqIHJlc3RvcmUgaXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcGVyZm9ybWluZyBvcGVyYXRpb25zIHRoYXQgY291bGQgcmVtb3ZlIGRvbVxuICogbm9kZXMgYW5kIHBsYWNlIHRoZW0gYmFjayBpbiwgcmVzdWx0aW5nIGluIGZvY3VzIGJlaW5nIGxvc3QuXG4gKi9cblxuZnVuY3Rpb24gcmVzdG9yZVNlbGVjdGlvbihwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uKSB7XG4gIHZhciBjdXJGb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7XG4gIHZhciBwcmlvckZvY3VzZWRFbGVtID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5mb2N1c2VkRWxlbTtcbiAgdmFyIHByaW9yU2VsZWN0aW9uUmFuZ2UgPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLnNlbGVjdGlvblJhbmdlO1xuXG4gIGlmIChjdXJGb2N1c2VkRWxlbSAhPT0gcHJpb3JGb2N1c2VkRWxlbSAmJiBpc0luRG9jdW1lbnQocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICBpZiAocHJpb3JTZWxlY3Rpb25SYW5nZSAhPT0gbnVsbCAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICAgIHNldFNlbGVjdGlvbihwcmlvckZvY3VzZWRFbGVtLCBwcmlvclNlbGVjdGlvblJhbmdlKTtcbiAgICB9IC8vIEZvY3VzaW5nIGEgbm9kZSBjYW4gY2hhbmdlIHRoZSBzY3JvbGwgcG9zaXRpb24sIHdoaWNoIGlzIHVuZGVzaXJhYmxlXG5cblxuICAgIHZhciBhbmNlc3RvcnMgPSBbXTtcbiAgICB2YXIgYW5jZXN0b3IgPSBwcmlvckZvY3VzZWRFbGVtO1xuXG4gICAgd2hpbGUgKGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKGFuY2VzdG9yLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgYW5jZXN0b3JzLnB1c2goe1xuICAgICAgICAgIGVsZW1lbnQ6IGFuY2VzdG9yLFxuICAgICAgICAgIGxlZnQ6IGFuY2VzdG9yLnNjcm9sbExlZnQsXG4gICAgICAgICAgdG9wOiBhbmNlc3Rvci5zY3JvbGxUb3BcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcmlvckZvY3VzZWRFbGVtLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcmlvckZvY3VzZWRFbGVtLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbmNlc3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpbmZvID0gYW5jZXN0b3JzW2ldO1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbExlZnQgPSBpbmZvLmxlZnQ7XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsVG9wID0gaW5mby50b3A7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEBnZXRTZWxlY3Rpb246IEdldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSBmb2N1c2VkIHRleHRhcmVhLCBpbnB1dCBvclxuICogY29udGVudEVkaXRhYmxlIG5vZGUuXG4gKiAtQGlucHV0OiBMb29rIHVwIHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dFxuICogLUByZXR1cm4ge3N0YXJ0OiBzZWxlY3Rpb25TdGFydCwgZW5kOiBzZWxlY3Rpb25FbmR9XG4gKi9cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKGlucHV0KSB7XG4gIHZhciBzZWxlY3Rpb247XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICAvLyBNb2Rlcm4gYnJvd3NlciB3aXRoIGlucHV0IG9yIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgIHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb250ZW50IGVkaXRhYmxlIG9yIG9sZCBJRSB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSBnZXRPZmZzZXRzKGlucHV0KTtcbiAgfVxuXG4gIHJldHVybiBzZWxlY3Rpb24gfHwge1xuICAgIHN0YXJ0OiAwLFxuICAgIGVuZDogMFxuICB9O1xufVxuLyoqXG4gKiBAc2V0U2VsZWN0aW9uOiBTZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgdGV4dGFyZWEgb3IgaW5wdXQgYW5kIGZvY3VzZXNcbiAqIHRoZSBpbnB1dC5cbiAqIC1AaW5wdXQgICAgIFNldCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXQgb3IgdGV4dGFyZWFcbiAqIC1Ab2Zmc2V0cyAgIE9iamVjdCBvZiBzYW1lIGZvcm0gdGhhdCBpcyByZXR1cm5lZCBmcm9tIGdldCpcbiAqL1xuXG5mdW5jdGlvbiBzZXRTZWxlY3Rpb24oaW5wdXQsIG9mZnNldHMpIHtcbiAgdmFyIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kO1xuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHN0YXJ0O1xuICB9XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICBpbnB1dC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgIGlucHV0LnNlbGVjdGlvbkVuZCA9IE1hdGgubWluKGVuZCwgaW5wdXQudmFsdWUubGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRPZmZzZXRzKGlucHV0LCBvZmZzZXRzKTtcbiAgfVxufVxuXG52YXIgc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSAxMTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvblNlbGVjdCcsIFsnZm9jdXNvdXQnLCAnY29udGV4dG1lbnUnLCAnZHJhZ2VuZCcsICdmb2N1c2luJywgJ2tleWRvd24nLCAna2V5dXAnLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG52YXIgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDtcbnZhciBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbnZhciBtb3VzZURvd24gPSBmYWxzZTtcbi8qKlxuICogR2V0IGFuIG9iamVjdCB3aGljaCBpcyBhIHVuaXF1ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIG5vdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBub2RlcyBvciBicm93c2VycywgYnV0XG4gKiB0d28gaWRlbnRpY2FsIHNlbGVjdGlvbnMgb24gdGhlIHNhbWUgbm9kZSB3aWxsIHJldHVybiBpZGVudGljYWwgb2JqZWN0cy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24kMShub2RlKSB7XG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIG5vZGUgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG5vZGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBub2RlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBub2RlLnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIHdpbiA9IG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuY2hvck5vZGU6IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0OiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlOiBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldFxuICAgIH07XG4gIH1cbn1cbi8qKlxuICogR2V0IGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgdGFyZ2V0LlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXREb2N1bWVudChldmVudFRhcmdldCkge1xuICByZXR1cm4gZXZlbnRUYXJnZXQud2luZG93ID09PSBldmVudFRhcmdldCA/IGV2ZW50VGFyZ2V0LmRvY3VtZW50IDogZXZlbnRUYXJnZXQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyBldmVudFRhcmdldCA6IGV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG59XG4vKipcbiAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFRhcmdldFxuICogQHJldHVybiB7P1N5bnRoZXRpY0V2ZW50fVxuICovXG5cblxuZnVuY3Rpb24gY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBlbGVtZW50LCBhbmQgdGhhdCB0aGUgdXNlciBpcyBub3QgZHJhZ2dpbmcgYVxuICAvLyBzZWxlY3Rpb24gKHRoaXMgbWF0Y2hlcyBuYXRpdmUgYHNlbGVjdGAgZXZlbnQgYmVoYXZpb3IpLiBJbiBIVE1MNSwgc2VsZWN0XG4gIC8vIGZpcmVzIG9ubHkgb24gaW5wdXQgYW5kIHRleHRhcmVhIHRodXMgaWYgdGhlcmUncyBubyBmb2N1c2VkIGVsZW1lbnQgd2VcbiAgLy8gd29uJ3QgZGlzcGF0Y2guXG4gIHZhciBkb2MgPSBnZXRFdmVudFRhcmdldERvY3VtZW50KG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobW91c2VEb3duIHx8IGFjdGl2ZUVsZW1lbnQkMSA9PSBudWxsIHx8IGFjdGl2ZUVsZW1lbnQkMSAhPT0gZ2V0QWN0aXZlRWxlbWVudChkb2MpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIE9ubHkgZmlyZSB3aGVuIHNlbGVjdGlvbiBoYXMgYWN0dWFsbHkgY2hhbmdlZC5cblxuXG4gIHZhciBjdXJyZW50U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uJDEoYWN0aXZlRWxlbWVudCQxKTtcblxuICBpZiAoIWxhc3RTZWxlY3Rpb24gfHwgIXNoYWxsb3dFcXVhbChsYXN0U2VsZWN0aW9uLCBjdXJyZW50U2VsZWN0aW9uKSkge1xuICAgIGxhc3RTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoYWN0aXZlRWxlbWVudEluc3QkMSwgJ29uU2VsZWN0Jyk7XG5cbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudCgnb25TZWxlY3QnLCAnc2VsZWN0JywgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICAgIH0pO1xuICAgICAgZXZlbnQudGFyZ2V0ID0gYWN0aXZlRWxlbWVudCQxO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvblNlbGVjdGAgZXZlbnQgdGhhdCBub3JtYWxpemVzIHNlbGVjdCBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIGNvbnRlbnRFZGl0YWJsZVxuICpcbiAqIFRoaXMgZGlmZmVycyBmcm9tIG5hdGl2ZSBicm93c2VyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKiAtIEZpcmVzIG9uIGNvbnRlbnRFZGl0YWJsZSBmaWVsZHMgYXMgd2VsbCBhcyBpbnB1dHMuXG4gKiAtIEZpcmVzIGZvciBjb2xsYXBzZWQgc2VsZWN0aW9uLlxuICogLSBGaXJlcyBhZnRlciB1c2VyIGlucHV0LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIC8vIFRyYWNrIHRoZSBpbnB1dCBub2RlIHRoYXQgaGFzIGZvY3VzLlxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSB8fCB0YXJnZXROb2RlLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IHRhcmdldE5vZGU7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSB0YXJnZXRJbnN0O1xuICAgICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xuICAgICAgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG4gICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIC8vIERvbid0IGZpcmUgdGhlIGV2ZW50IHdoaWxlIHRoZSB1c2VyIGlzIGRyYWdnaW5nLiBUaGlzIG1hdGNoZXMgdGhlXG4gICAgLy8gc2VtYW50aWNzIG9mIHRoZSBuYXRpdmUgc2VsZWN0IGV2ZW50LlxuXG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgIG1vdXNlRG93biA9IHRydWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICBjYXNlICdtb3VzZXVwJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgIG1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIENocm9tZSBhbmQgSUUgZmlyZSBub24tc3RhbmRhcmQgZXZlbnQgd2hlbiBzZWxlY3Rpb24gaXMgY2hhbmdlZCAoYW5kXG4gICAgLy8gc29tZXRpbWVzIHdoZW4gaXQgaGFzbid0KS4gSUUncyBldmVudCBmaXJlcyBvdXQgb2Ygb3JkZXIgd2l0aCByZXNwZWN0XG4gICAgLy8gdG8ga2V5IGFuZCBpbnB1dCBldmVudHMgb24gZGVsZXRpb24sIHNvIHdlIGRpc2NhcmQgaXQuXG4gICAgLy9cbiAgICAvLyBGaXJlZm94IGRvZXNuJ3Qgc3VwcG9ydCBzZWxlY3Rpb25jaGFuZ2UsIHNvIGNoZWNrIHNlbGVjdGlvbiBzdGF0dXNcbiAgICAvLyBhZnRlciBlYWNoIGtleSBlbnRyeS4gVGhlIHNlbGVjdGlvbiBjaGFuZ2VzIGFmdGVyIGtleWRvd24gYW5kIGJlZm9yZVxuICAgIC8vIGtleXVwLCBidXQgd2UgY2hlY2sgb24ga2V5ZG93biBhcyB3ZWxsIGluIHRoZSBjYXNlIG9mIGhvbGRpbmcgZG93biBhXG4gICAgLy8ga2V5LCB3aGVuIG11bHRpcGxlIGtleWRvd24gZXZlbnRzIGFyZSBmaXJlZCBidXQgb25seSBvbmUga2V5dXAgaXMuXG4gICAgLy8gVGhpcyBpcyBhbHNvIG91ciBhcHByb2FjaCBmb3IgSUUgaGFuZGxpbmcsIGZvciB0aGUgcmVhc29uIGFib3ZlLlxuXG4gICAgY2FzZSAnc2VsZWN0aW9uY2hhbmdlJzpcbiAgICAgIGlmIChza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBtYXBwaW5nIG9mIHN0YW5kYXJkIHZlbmRvciBwcmVmaXhlcyB1c2luZyB0aGUgZGVmaW5lZCBzdHlsZSBwcm9wZXJ0eSBhbmQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVQcm9wXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIG1ha2VQcmVmaXhNYXAoc3R5bGVQcm9wLCBldmVudE5hbWUpIHtcbiAgdmFyIHByZWZpeGVzID0ge307XG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1snV2Via2l0JyArIHN0eWxlUHJvcF0gPSAnd2Via2l0JyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ01veicgKyBzdHlsZVByb3BdID0gJ21veicgKyBldmVudE5hbWU7XG4gIHJldHVybiBwcmVmaXhlcztcbn1cbi8qKlxuICogQSBsaXN0IG9mIGV2ZW50IG5hbWVzIHRvIGEgY29uZmlndXJhYmxlIGxpc3Qgb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG5cblxudmFyIHZlbmRvclByZWZpeGVzID0ge1xuICBhbmltYXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25FbmQnKSxcbiAgYW5pbWF0aW9uaXRlcmF0aW9uOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uSXRlcmF0aW9uJyksXG4gIGFuaW1hdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uU3RhcnQnKSxcbiAgdHJhbnNpdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnVHJhbnNpdGlvbicsICdUcmFuc2l0aW9uRW5kJylcbn07XG4vKipcbiAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5kIHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS5cbiAqL1xuXG52YXIgcHJlZml4ZWRFdmVudE5hbWVzID0ge307XG4vKipcbiAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLlxuICovXG5cbnZhciBzdHlsZSA9IHt9O1xuLyoqXG4gKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLlxuICovXG5cbmlmIChjYW5Vc2VET00pIHtcbiAgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLlxuXG4gIGlmICghKCdBbmltYXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25lbmQuYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25zdGFydC5hbmltYXRpb247XG4gIH0gLy8gU2FtZSBhcyBhYm92ZVxuXG5cbiAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb247XG4gIH1cbn1cbi8qKlxuICogQXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHZlbmRvciBwcmVmaXhlZCBldmVudCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9IGVsc2UgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgfVxuXG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuXG4gIGZvciAodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApIHtcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXZlbnROYW1lO1xufVxuXG52YXIgQU5JTUFUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25lbmQnKTtcbnZhciBBTklNQVRJT05fSVRFUkFUSU9OID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbml0ZXJhdGlvbicpO1xudmFyIEFOSU1BVElPTl9TVEFSVCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25zdGFydCcpO1xudmFyIFRSQU5TSVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ3RyYW5zaXRpb25lbmQnKTtcblxudmFyIHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzID0gbmV3IE1hcCgpOyAvLyBOT1RFOiBDYXBpdGFsaXphdGlvbiBpcyBpbXBvcnRhbnQgaW4gdGhpcyBsaXN0IVxuLy9cbi8vIEUuZy4gaXQgbmVlZHMgXCJwb2ludGVyRG93blwiLCBub3QgXCJwb2ludGVyZG93blwiLlxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGRlcml2ZSBib3RoIFJlYWN0IG5hbWUgKFwib25Qb2ludGVyRG93blwiKVxuLy8gYW5kIERPTSBuYW1lIChcInBvaW50ZXJkb3duXCIpIGZyb20gdGhlIHNhbWUgbGlzdC5cbi8vXG4vLyBFeGNlcHRpb25zIHRoYXQgZG9uJ3QgbWF0Y2ggdGhpcyBjb252ZW50aW9uIGFyZSBsaXN0ZWQgc2VwYXJhdGVseS5cbi8vXG4vLyBwcmV0dGllci1pZ25vcmVcblxudmFyIHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzID0gWydhYm9ydCcsICdhdXhDbGljaycsICdjYW5jZWwnLCAnY2FuUGxheScsICdjYW5QbGF5VGhyb3VnaCcsICdjbGljaycsICdjbG9zZScsICdjb250ZXh0TWVudScsICdjb3B5JywgJ2N1dCcsICdkcmFnJywgJ2RyYWdFbmQnLCAnZHJhZ0VudGVyJywgJ2RyYWdFeGl0JywgJ2RyYWdMZWF2ZScsICdkcmFnT3ZlcicsICdkcmFnU3RhcnQnLCAnZHJvcCcsICdkdXJhdGlvbkNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdnb3RQb2ludGVyQ2FwdHVyZScsICdpbnB1dCcsICdpbnZhbGlkJywgJ2tleURvd24nLCAna2V5UHJlc3MnLCAna2V5VXAnLCAnbG9hZCcsICdsb2FkZWREYXRhJywgJ2xvYWRlZE1ldGFkYXRhJywgJ2xvYWRTdGFydCcsICdsb3N0UG9pbnRlckNhcHR1cmUnLCAnbW91c2VEb3duJywgJ21vdXNlTW92ZScsICdtb3VzZU91dCcsICdtb3VzZU92ZXInLCAnbW91c2VVcCcsICdwYXN0ZScsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncG9pbnRlckNhbmNlbCcsICdwb2ludGVyRG93bicsICdwb2ludGVyTW92ZScsICdwb2ludGVyT3V0JywgJ3BvaW50ZXJPdmVyJywgJ3BvaW50ZXJVcCcsICdwcm9ncmVzcycsICdyYXRlQ2hhbmdlJywgJ3Jlc2V0JywgJ3Jlc2l6ZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1Ym1pdCcsICdzdXNwZW5kJywgJ3RpbWVVcGRhdGUnLCAndG91Y2hDYW5jZWwnLCAndG91Y2hFbmQnLCAndG91Y2hTdGFydCcsICd2b2x1bWVDaGFuZ2UnLCAnc2Nyb2xsJywgJ3RvZ2dsZScsICd0b3VjaE1vdmUnLCAnd2FpdGluZycsICd3aGVlbCddO1xuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZUV2ZW50KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKSB7XG4gIHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzLnNldChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWFjdE5hbWUsIFtkb21FdmVudE5hbWVdKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudHMoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2ltcGxlRXZlbnRQbHVnaW5FdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZXZlbnROYW1lID0gc2ltcGxlRXZlbnRQbHVnaW5FdmVudHNbaV07XG4gICAgdmFyIGRvbUV2ZW50TmFtZSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBjYXBpdGFsaXplZEV2ZW50ID0gZXZlbnROYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBldmVudE5hbWUuc2xpY2UoMSk7XG4gICAgcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsICdvbicgKyBjYXBpdGFsaXplZEV2ZW50KTtcbiAgfSAvLyBTcGVjaWFsIGNhc2VzIHdoZXJlIGV2ZW50IG5hbWVzIGRvbid0IG1hdGNoLlxuXG5cbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fRU5ELCAnb25BbmltYXRpb25FbmQnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fSVRFUkFUSU9OLCAnb25BbmltYXRpb25JdGVyYXRpb24nKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fU1RBUlQsICdvbkFuaW1hdGlvblN0YXJ0Jyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2RibGNsaWNrJywgJ29uRG91YmxlQ2xpY2snKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZm9jdXNpbicsICdvbkZvY3VzJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2ZvY3Vzb3V0JywgJ29uQmx1cicpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KFRSQU5TSVRJT05fRU5ELCAnb25UcmFuc2l0aW9uRW5kJyk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciByZWFjdE5hbWUgPSB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5nZXQoZG9tRXZlbnROYW1lKTtcblxuICBpZiAocmVhY3ROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRXZlbnQ7XG4gIHZhciByZWFjdEV2ZW50VHlwZSA9IGRvbUV2ZW50TmFtZTtcblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGtleXByZXNzIGV2ZW50IGZvciBmdW5jdGlvbiBrZXlzIHRvby4gVGhpcyByZW1vdmVzXG4gICAgICAvLyB0aGUgdW53YW50ZWQga2V5cHJlc3MgZXZlbnRzLiBFbnRlciBpcyBob3dldmVyIGJvdGggcHJpbnRhYmxlIGFuZFxuICAgICAgLy8gbm9uLXByaW50YWJsZS4gT25lIHdvdWxkIGV4cGVjdCBUYWIgdG8gYmUgYXMgd2VsbCAoYnV0IGl0IGlzbid0KS5cbiAgICAgIGlmIChnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNLZXlib2FyZEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2ZvY3VzJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2JsdXInO1xuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYmVmb3JlYmx1cic6XG4gICAgY2FzZSAnYWZ0ZXJibHVyJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NsaWNrJzpcbiAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGNsaWNrIGV2ZW50IG9uIHJpZ2h0IG1vdXNlIGNsaWNrcy4gVGhpcyByZW1vdmVzIHRoZVxuICAgICAgLy8gdW53YW50ZWQgY2xpY2sgZXZlbnRzLlxuICAgICAgaWYgKG5hdGl2ZUV2ZW50LmJ1dHRvbiA9PT0gMikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdhdXhjbGljayc6XG4gICAgY2FzZSAnZGJsY2xpY2snOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICBjYXNlICdtb3VzZXVwJzogLy8gVE9ETzogRGlzYWJsZWQgZWxlbWVudHMgc2hvdWxkIG5vdCByZXNwb25kIHRvIG1vdXNlIGV2ZW50c1xuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZHJhZyc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnZXhpdCc6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICBjYXNlICdkcm9wJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0RyYWdFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndG91Y2hjYW5jZWwnOlxuICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgIGNhc2UgJ3RvdWNoc3RhcnQnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBBTklNQVRJT05fRU5EOlxuICAgIGNhc2UgQU5JTUFUSU9OX0lURVJBVElPTjpcbiAgICBjYXNlIEFOSU1BVElPTl9TVEFSVDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRSQU5TSVRJT05fRU5EOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzY3JvbGwnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVUlFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnd2hlZWwnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljV2hlZWxFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY29weSc6XG4gICAgY2FzZSAnY3V0JzpcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAncG9pbnRlcmNhbmNlbCc6XG4gICAgY2FzZSAncG9pbnRlcmRvd24nOlxuICAgIGNhc2UgJ3BvaW50ZXJtb3ZlJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcnVwJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGluQ2FwdHVyZVBoYXNlID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFKSAhPT0gMDtcblxuICB7XG4gICAgLy8gU29tZSBldmVudHMgZG9uJ3QgYnViYmxlIGluIHRoZSBicm93c2VyLlxuICAgIC8vIEluIHRoZSBwYXN0LCBSZWFjdCBoYXMgYWx3YXlzIGJ1YmJsZWQgdGhlbSwgYnV0IHRoaXMgY2FuIGJlIHN1cnByaXNpbmcuXG4gICAgLy8gV2UncmUgZ29pbmcgdG8gdHJ5IGFsaWduaW5nIGNsb3NlciB0byB0aGUgYnJvd3NlciBiZWhhdmlvciBieSBub3QgYnViYmxpbmdcbiAgICAvLyB0aGVtIGluIFJlYWN0IGVpdGhlci4gV2UnbGwgc3RhcnQgYnkgbm90IGJ1YmJsaW5nIG9uU2Nyb2xsLCBhbmQgdGhlbiBleHBhbmQuXG4gICAgdmFyIGFjY3VtdWxhdGVUYXJnZXRPbmx5ID0gIWluQ2FwdHVyZVBoYXNlICYmIC8vIFRPRE86IGlkZWFsbHksIHdlJ2QgZXZlbnR1YWxseSBhZGQgYWxsIGV2ZW50cyBmcm9tXG4gICAgLy8gbm9uRGVsZWdhdGVkRXZlbnRzIGxpc3QgaW4gRE9NUGx1Z2luRXZlbnRTeXN0ZW0uXG4gICAgLy8gVGhlbiB3ZSBjYW4gcmVtb3ZlIHRoaXMgc3BlY2lhbCBsaXN0LlxuICAgIC8vIFRoaXMgaXMgYSBicmVha2luZyBjaGFuZ2UgdGhhdCBjYW4gd2FpdCB1bnRpbCBSZWFjdCAxOC5cbiAgICBkb21FdmVudE5hbWUgPT09ICdzY3JvbGwnO1xuXG4gICAgdmFyIF9saXN0ZW5lcnMgPSBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgcmVhY3ROYW1lLCBuYXRpdmVFdmVudC50eXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHkpO1xuXG4gICAgaWYgKF9saXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBjcmVhdGUgZXZlbnQgbGF6aWx5LlxuICAgICAgdmFyIF9ldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IF9ldmVudCxcbiAgICAgICAgbGlzdGVuZXJzOiBfbGlzdGVuZXJzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRvcC1sZXZlbCBzaWRlIGVmZmVjdC5cbnJlZ2lzdGVyU2ltcGxlRXZlbnRzKCk7XG5yZWdpc3RlckV2ZW50cyQyKCk7XG5yZWdpc3RlckV2ZW50cyQxKCk7XG5yZWdpc3RlckV2ZW50cyQzKCk7XG5yZWdpc3RlckV2ZW50cygpO1xuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICAvLyBUT0RPOiB3ZSBzaG91bGQgcmVtb3ZlIHRoZSBjb25jZXB0IG9mIGEgXCJTaW1wbGVFdmVudFBsdWdpblwiLlxuICAvLyBUaGlzIGlzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBldmVudCBzeXN0ZW0uIEFsbFxuICAvLyB0aGUgb3RoZXIgcGx1Z2lucyBhcmUgZXNzZW50aWFsbHkgcG9seWZpbGxzLiBTbyB0aGUgcGx1Z2luXG4gIC8vIHNob3VsZCBwcm9iYWJseSBiZSBpbmxpbmVkIHNvbWV3aGVyZSBhbmQgaGF2ZSBpdHMgbG9naWNcbiAgLy8gYmUgY29yZSB0aGUgdG8gZXZlbnQgc3lzdGVtLiBUaGlzIHdvdWxkIHBvdGVudGlhbGx5IGFsbG93XG4gIC8vIHVzIHRvIHNoaXAgYnVpbGRzIG9mIFJlYWN0IHdpdGhvdXQgdGhlIHBvbHlmaWxsZWQgcGx1Z2lucyBiZWxvdy5cbiAgZXh0cmFjdEV2ZW50cyQ0KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzKTtcbiAgdmFyIHNob3VsZFByb2Nlc3NQb2x5ZmlsbFBsdWdpbnMgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TKSA9PT0gMDsgLy8gV2UgZG9uJ3QgcHJvY2VzcyB0aGVzZSBldmVudHMgdW5sZXNzIHdlIGFyZSBpbiB0aGVcbiAgLy8gZXZlbnQncyBuYXRpdmUgXCJidWJibGVcIiBwaGFzZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSdyZVxuICAvLyBub3QgaW4gdGhlIGNhcHR1cmUgcGhhc2UuIFRoYXQncyBiZWNhdXNlIHdlIGVtdWxhdGVcbiAgLy8gdGhlIGNhcHR1cmUgcGhhc2UgaGVyZSBzdGlsbC4gVGhpcyBpcyBhIHRyYWRlLW9mZixcbiAgLy8gYmVjYXVzZSBpbiBhbiBpZGVhbCB3b3JsZCB3ZSB3b3VsZCBub3QgZW11bGF0ZSBhbmQgdXNlXG4gIC8vIHRoZSBwaGFzZXMgcHJvcGVybHksIGxpa2Ugd2UgZG8gd2l0aCB0aGUgU2ltcGxlRXZlbnRcbiAgLy8gcGx1Z2luLiBIb3dldmVyLCB0aGUgcGx1Z2lucyBiZWxvdyBlaXRoZXIgZXhwZWN0XG4gIC8vIGVtdWxhdGlvbiAoRW50ZXJMZWF2ZSkgb3IgdXNlIHN0YXRlIGxvY2FsaXplZCB0byB0aGF0XG4gIC8vIHBsdWdpbiAoQmVmb3JlSW5wdXQsIENoYW5nZSwgU2VsZWN0KS4gVGhlIHN0YXRlIGluXG4gIC8vIHRoZXNlIG1vZHVsZXMgY29tcGxpY2F0ZXMgdGhpbmdzLCBhcyB5b3UnbGwgZXNzZW50aWFsbHlcbiAgLy8gZ2V0IHRoZSBjYXNlIHdoZXJlIHRoZSBjYXB0dXJlIHBoYXNlIGV2ZW50IG1pZ2h0IGNoYW5nZVxuICAvLyBzdGF0ZSwgb25seSBmb3IgdGhlIGZvbGxvd2luZyBidWJibGUgZXZlbnQgdG8gY29tZSBpblxuICAvLyBsYXRlciBhbmQgbm90IHRyaWdnZXIgYW55dGhpbmcgYXMgdGhlIHN0YXRlIG5vd1xuICAvLyBpbnZhbGlkYXRlcyB0aGUgaGV1cmlzdGljcyBvZiB0aGUgZXZlbnQgcGx1Z2luLiBXZVxuICAvLyBjb3VsZCBhbHRlciBhbGwgdGhlc2UgcGx1Z2lucyB0byB3b3JrIGluIHN1Y2ggd2F5cywgYnV0XG4gIC8vIHRoYXQgbWlnaHQgY2F1c2Ugb3RoZXIgdW5rbm93biBzaWRlLWVmZmVjdHMgdGhhdCB3ZVxuICAvLyBjYW4ndCBmb3Jlc2VlIHJpZ2h0IG5vdy5cblxuICBpZiAoc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucykge1xuICAgIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59IC8vIExpc3Qgb2YgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBpbmRpdmlkdWFsbHkgYXR0YWNoZWQgdG8gbWVkaWEgZWxlbWVudHMuXG5cblxudmFyIG1lZGlhRXZlbnRUeXBlcyA9IFsnYWJvcnQnLCAnY2FucGxheScsICdjYW5wbGF5dGhyb3VnaCcsICdkdXJhdGlvbmNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdsb2FkZWRkYXRhJywgJ2xvYWRlZG1ldGFkYXRhJywgJ2xvYWRzdGFydCcsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncHJvZ3Jlc3MnLCAncmF0ZWNoYW5nZScsICdyZXNpemUnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdXNwZW5kJywgJ3RpbWV1cGRhdGUnLCAndm9sdW1lY2hhbmdlJywgJ3dhaXRpbmcnXTsgLy8gV2Ugc2hvdWxkIG5vdCBkZWxlZ2F0ZSB0aGVzZSBldmVudHMgdG8gdGhlIGNvbnRhaW5lciwgYnV0IHJhdGhlclxuLy8gc2V0IHRoZW0gb24gdGhlIGFjdHVhbCB0YXJnZXQgZWxlbWVudCBpdHNlbGYuIFRoaXMgaXMgcHJpbWFyaWx5XG4vLyBiZWNhdXNlIHRoZXNlIGV2ZW50cyBkbyBub3QgY29uc2lzdGVudGx5IGJ1YmJsZSBpbiB0aGUgRE9NLlxuXG52YXIgbm9uRGVsZWdhdGVkRXZlbnRzID0gbmV3IFNldChbJ2NhbmNlbCcsICdjbG9zZScsICdpbnZhbGlkJywgJ2xvYWQnLCAnc2Nyb2xsJywgJ3RvZ2dsZSddLmNvbmNhdChtZWRpYUV2ZW50VHlwZXMpKTtcblxuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICB2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgJ3Vua25vd24tZXZlbnQnO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKHR5cGUsIGxpc3RlbmVyLCB1bmRlZmluZWQsIGV2ZW50KTtcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBkaXNwYXRjaExpc3RlbmVycywgaW5DYXB0dXJlUGhhc2UpIHtcbiAgdmFyIHByZXZpb3VzSW5zdGFuY2U7XG5cbiAgaWYgKGluQ2FwdHVyZVBoYXNlKSB7XG4gICAgZm9yICh2YXIgaSA9IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgX2Rpc3BhdGNoTGlzdGVuZXJzJGkgPSBkaXNwYXRjaExpc3RlbmVyc1tpXSxcbiAgICAgICAgICBpbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmluc3RhbmNlLFxuICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgIGxpc3RlbmVyID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkubGlzdGVuZXI7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAhPT0gcHJldmlvdXNJbnN0YW5jZSAmJiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kgPSBkaXNwYXRjaExpc3RlbmVyc1tfaV0sXG4gICAgICAgICAgX2luc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmluc3RhbmNlLFxuICAgICAgICAgIF9jdXJyZW50VGFyZ2V0ID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgX2xpc3RlbmVyID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmxpc3RlbmVyO1xuXG4gICAgICBpZiAoX2luc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIF9saXN0ZW5lciwgX2N1cnJlbnRUYXJnZXQpO1xuICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IF9pbnN0YW5jZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICB2YXIgaW5DYXB0dXJlUGhhc2UgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UpICE9PSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hRdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZGlzcGF0Y2hRdWV1ZSRpID0gZGlzcGF0Y2hRdWV1ZVtpXSxcbiAgICAgICAgZXZlbnQgPSBfZGlzcGF0Y2hRdWV1ZSRpLmV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnMgPSBfZGlzcGF0Y2hRdWV1ZSRpLmxpc3RlbmVycztcbiAgICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZUl0ZW1zSW5PcmRlcihldmVudCwgbGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSk7IC8vICBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgfSAvLyBUaGlzIHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHJldGhyb3cgaWYgYW55IG9mIHRoZSBldmVudCBoYW5kbGVycyB0aHJldy5cblxuXG4gIHJldGhyb3dDYXVnaHRFcnJvcigpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzKTtcbiAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncyk7XG59XG5cbmZ1bmN0aW9uIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRFbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgpIGNhbGwgZm9yIFwiJXNcIi4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBkb21FdmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyID0gZmFsc2U7XG4gIHZhciBsaXN0ZW5lclNldCA9IGdldEV2ZW50TGlzdGVuZXJTZXQodGFyZ2V0RWxlbWVudCk7XG4gIHZhciBsaXN0ZW5lclNldEtleSA9IGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG5cbiAgaWYgKCFsaXN0ZW5lclNldC5oYXMobGlzdGVuZXJTZXRLZXkpKSB7XG4gICAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgZG9tRXZlbnROYW1lLCBJU19OT05fREVMRUdBVEVELCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcbiAgICBsaXN0ZW5lclNldC5hZGQobGlzdGVuZXJTZXRLZXkpO1xuICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgdGFyZ2V0KSB7XG4gIHtcbiAgICBpZiAobm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpICYmICFpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgICBlcnJvcignRGlkIG5vdCBleHBlY3QgYSBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCkgY2FsbCBmb3IgXCIlc1wiIGluIHRoZSBidWJibGUgcGhhc2UuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZG9tRXZlbnROYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZXZlbnRTeXN0ZW1GbGFncyA9IDA7XG5cbiAgaWYgKGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICBldmVudFN5c3RlbUZsYWdzIHw9IElTX0NBUFRVUkVfUEhBU0U7XG4gIH1cblxuICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG59IC8vIFRoaXMgaXMgb25seSB1c2VkIGJ5IGNyZWF0ZUV2ZW50SGFuZGxlIHdoZW4gdGhlXG52YXIgbGlzdGVuaW5nTWFya2VyID0gJ19yZWFjdExpc3RlbmluZycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcbmZ1bmN0aW9uIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIGlmICghcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgIHJvb3RDb250YWluZXJFbGVtZW50W2xpc3RlbmluZ01hcmtlcl0gPSB0cnVlO1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb21FdmVudE5hbWUpIHtcbiAgICAgIC8vIFdlIGhhbmRsZSBzZWxlY3Rpb25jaGFuZ2Ugc2VwYXJhdGVseSBiZWNhdXNlIGl0XG4gICAgICAvLyBkb2Vzbid0IGJ1YmJsZSBhbmQgbmVlZHMgdG8gYmUgb24gdGhlIGRvY3VtZW50LlxuICAgICAgaWYgKGRvbUV2ZW50TmFtZSAhPT0gJ3NlbGVjdGlvbmNoYW5nZScpIHtcbiAgICAgICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZmFsc2UsIHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCB0cnVlLCByb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJFbGVtZW50IDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChvd25lckRvY3VtZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50IGFsc28gbmVlZHMgZGVkdXBsaWNhdGlvblxuICAgICAgLy8gYnV0IGl0IGlzIGF0dGFjaGVkIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmICghb3duZXJEb2N1bWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgICAgIG93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSA9IHRydWU7XG4gICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoJ3NlbGVjdGlvbmNoYW5nZScsIGZhbHNlLCBvd25lckRvY3VtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIGlzRGVmZXJyZWRMaXN0ZW5lckZvckxlZ2FjeUZCU3VwcG9ydCkge1xuICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncyk7IC8vIElmIHBhc3NpdmUgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmVcbiAgLy8gYWN0aXZlIGFuZCBub3QgcGFzc2l2ZS5cblxuICB2YXIgaXNQYXNzaXZlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkKSB7XG4gICAgLy8gQnJvd3NlcnMgaW50cm9kdWNlZCBhbiBpbnRlcnZlbnRpb24sIG1ha2luZyB0aGVzZSBldmVudHNcbiAgICAvLyBwYXNzaXZlIGJ5IGRlZmF1bHQgb24gZG9jdW1lbnQuIFJlYWN0IGRvZXNuJ3QgYmluZCB0aGVtXG4gICAgLy8gdG8gZG9jdW1lbnQgYW55bW9yZSwgYnV0IGNoYW5naW5nIHRoaXMgbm93IHdvdWxkIHVuZG9cbiAgICAvLyB0aGUgcGVyZm9ybWFuY2Ugd2lucyBmcm9tIHRoZSBjaGFuZ2UuIFNvIHdlIGVtdWxhdGVcbiAgICAvLyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgbWFudWFsbHkgb24gdGhlIHJvb3RzIG5vdy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5NjUxXG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNobW92ZScgfHwgZG9tRXZlbnROYW1lID09PSAnd2hlZWwnKSB7XG4gICAgICBpc1Bhc3NpdmVMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0Q29udGFpbmVyID0gIHRhcmdldENvbnRhaW5lcjtcbiAgdmFyIHVuc3Vic2NyaWJlTGlzdGVuZXI7IC8vIFdoZW4gbGVnYWN5RkJTdXBwb3J0IGlzIGVuYWJsZWQsIGl0J3MgZm9yIHdoZW4gd2VcblxuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lcikge1xuICByZXR1cm4gZ3JhbmRDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lciB8fCBncmFuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIGdyYW5kQ29udGFpbmVyLnBhcmVudE5vZGUgPT09IHRhcmdldENvbnRhaW5lcjtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgYW5jZXN0b3JJbnN0ID0gdGFyZ2V0SW5zdDtcblxuICBpZiAoKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSkgPT09IDAgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19OT05fREVMRUdBVEVEKSA9PT0gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXJOb2RlID0gdGFyZ2V0Q29udGFpbmVyOyAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGxlZ2FjeSBGQiBzdXBwb3J0IGZsYWcsIHdlXG5cbiAgICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIGJlbG93IGxvZ2ljIGF0dGVtcHRzIHRvIHdvcmsgb3V0IGlmIHdlIG5lZWQgdG8gY2hhbmdlXG4gICAgICAvLyB0aGUgdGFyZ2V0IGZpYmVyIHRvIGEgZGlmZmVyZW50IGFuY2VzdG9yLiBXZSBoYWQgc2ltaWxhciBsb2dpY1xuICAgICAgLy8gaW4gdGhlIGxlZ2FjeSBldmVudCBzeXN0ZW0sIGV4Y2VwdCB0aGUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlblxuICAgICAgLy8gc3lzdGVtcyBpcyB0aGF0IHRoZSBtb2Rlcm4gZXZlbnQgc3lzdGVtIG5vdyBoYXMgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgIC8vIGF0dGFjaGVkIHRvIGVhY2ggUmVhY3QgUm9vdCBhbmQgUmVhY3QgUG9ydGFsIFJvb3QuIFRvZ2V0aGVyLFxuICAgICAgLy8gdGhlIERPTSBub2RlcyByZXByZXNlbnRpbmcgdGhlc2Ugcm9vdHMgYXJlIHRoZSBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIFRvIGZpZ3VyZSBvdXQgd2hpY2ggYW5jZXN0b3IgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZSwgd2UgdHJhdmVyc2VcbiAgICAgIC8vIHVwIHRoZSBmaWJlciB0cmVlIGZyb20gdGhlIHRhcmdldCBpbnN0YW5jZSBhbmQgYXR0ZW1wdCB0byBmaW5kXG4gICAgICAvLyByb290IGJvdW5kYXJpZXMgdGhhdCBtYXRjaCB0aGF0IG9mIG91ciBjdXJyZW50IFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gSWYgd2UgZmluZCB0aGF0IFwicm9vdENvbnRhaW5lclwiLCB3ZSBmaW5kIHRoZSBwYXJlbnQgZmliZXJcbiAgICAgIC8vIHN1Yi10cmVlIGZvciB0aGF0IHJvb3QgYW5kIG1ha2UgdGhhdCBvdXIgYW5jZXN0b3IgaW5zdGFuY2UuXG4gICAgICB2YXIgbm9kZSA9IHRhcmdldEluc3Q7XG5cbiAgICAgIG1haW5Mb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub2RlVGFnID0gbm9kZS50YWc7XG5cbiAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RSb290IHx8IG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBpcyBhIHBvcnRhbCwgYnV0IGl0J3Mgbm90IHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgICAgICAgICAgLy8gTm9ybWFsbHkgcG9ydGFscyBoYW5kbGUgdGhlaXIgb3duIGV2ZW50cyBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSByb290LlxuICAgICAgICAgICAgLy8gU28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gc3RvcCBub3cuIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgdGhpcyBwb3J0YWxcbiAgICAgICAgICAgIC8vIHdhcyBwYXJ0IG9mICpvdXIqIHJvb3QuXG4gICAgICAgICAgICB2YXIgZ3JhbmROb2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgICAgICAgIHdoaWxlIChncmFuZE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGdyYW5kVGFnID0gZ3JhbmROb2RlLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZ3JhbmRUYWcgPT09IEhvc3RSb290IHx8IGdyYW5kVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYW5kQ29udGFpbmVyID0gZ3JhbmROb2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvciBhbmQgd2UgZm91bmQgaXQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGEgcGFyZW50IG9mIHRoZSBQb3J0YWwuIFRoYXQgbWVhbnMgd2UgY2FuIGlnbm9yZSBpdCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gUG9ydGFsIHdpbGwgYnViYmxlIHRocm91Z2ggdG8gdXMuXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ3JhbmROb2RlID0gZ3JhbmROb2RlLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgaXQncyBjb3JyZXNwb25kaW5nIGhvc3QgZmliZXIgaW4gdGhlIG90aGVyXG4gICAgICAgICAgLy8gdHJlZS4gVG8gZG8gdGhpcyB3ZSBjYW4gdXNlIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLCBidXQgd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGZpYmVyIGlzIGEgaG9zdCBpbnN0YW5jZSwgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cCB0aHJvdWdoIHRoZSBET00gdGlsbCB3ZSBmaW5kIHRoZSBjb3JyZWN0XG4gICAgICAgICAgLy8gbm9kZSB0aGF0IGlzIGZyb20gdGhlIG90aGVyIHRyZWUuXG5cblxuICAgICAgICAgIHdoaWxlIChjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnROb2RlID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50Tm9kZS50YWc7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRUYWcgPT09IEhvc3RDb21wb25lbnQgfHwgcGFyZW50VGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICAgICAgICBub2RlID0gYW5jZXN0b3JJbnN0ID0gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgY29udGludWUgbWFpbkxvb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBiYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCBhbmNlc3Rvckluc3QpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgIGN1cnJlbnRUYXJnZXQ6IGN1cnJlbnRUYXJnZXRcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUsIG5hdGl2ZUV2ZW50VHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5LCBuYXRpdmVFdmVudCkge1xuICB2YXIgY2FwdHVyZU5hbWUgPSByZWFjdE5hbWUgIT09IG51bGwgPyByZWFjdE5hbWUgKyAnQ2FwdHVyZScgOiBudWxsO1xuICB2YXIgcmVhY3RFdmVudE5hbWUgPSBpbkNhcHR1cmVQaGFzZSA/IGNhcHR1cmVOYW1lIDogcmVhY3ROYW1lO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyO1xuICB2YXIgbGFzdEhvc3RDb21wb25lbnQgPSBudWxsOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTIgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMi5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTIudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIGxhc3RIb3N0Q29tcG9uZW50ID0gc3RhdGVOb2RlOyAvLyBjcmVhdGVFdmVudEhhbmRsZSBsaXN0ZW5lcnNcblxuXG4gICAgICBpZiAocmVhY3RFdmVudE5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0RXZlbnROYW1lKTtcblxuICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBsYXN0SG9zdENvbXBvbmVudCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBJZiB3ZSBhcmUgb25seSBhY2N1bXVsYXRpbmcgZXZlbnRzIGZvciB0aGUgdGFyZ2V0LCB0aGVuIHdlIGRvbid0XG4gICAgLy8gY29udGludWUgdG8gcHJvcGFnYXRlIHRocm91Z2ggdGhlIFJlYWN0IGZpYmVyIHRyZWUgdG8gZmluZCBvdGhlclxuICAgIC8vIGxpc3RlbmVycy5cblxuXG4gICAgaWYgKGFjY3VtdWxhdGVUYXJnZXRPbmx5KSB7XG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIHdlIGFyZSBwcm9jZXNzaW5nIHRoZSBvbkJlZm9yZUJsdXIgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byB0YWtlXG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcnM7XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gQmVmb3JlSW5wdXRFdmVudFBsdWdpblxuLy8gLSBDaGFuZ2VFdmVudFBsdWdpblxuLy8gLSBTZWxlY3RFdmVudFBsdWdpblxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIG9ubHkgcHJvY2VzcyB0aGVzZSBwbHVnaW5zXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMgKHZpYSBlbXVsYXRpb24pLlxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSkge1xuICB2YXIgY2FwdHVyZU5hbWUgPSByZWFjdE5hbWUgKyAnQ2FwdHVyZSc7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0RmliZXI7IC8vIEFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBhbmQgbGlzdGVuZXJzIHZpYSB0aGUgdGFyZ2V0IC0+IHJvb3QgcGF0aC5cblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICB2YXIgX2luc3RhbmNlMyA9IGluc3RhbmNlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2UzLnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlMy50YWc7IC8vIEhhbmRsZSBsaXN0ZW5lcnMgdGhhdCBhcmUgb24gSG9zdENvbXBvbmVudHMgKGkuZS4gPGRpdj4pXG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG4gICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVOYW1lKTtcblxuICAgICAgaWYgKGNhcHR1cmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVhY3ROYW1lKTtcblxuICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgYnViYmxlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcnM7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudChpbnN0KSB7XG4gIGlmIChpbnN0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkbyB7XG4gICAgaW5zdCA9IGluc3QucmV0dXJuOyAvLyBUT0RPOiBJZiB0aGlzIGlzIGEgSG9zdFJvb3Qgd2UgbWlnaHQgd2FudCB0byBiYWlsIG91dC5cbiAgICAvLyBUaGF0IGlzIGRlcGVuZGluZyBvbiBpZiB3ZSB3YW50IG5lc3RlZCBzdWJ0cmVlcyAobGF5ZXJzKSB0byBidWJibGVcbiAgICAvLyBldmVudHMgdG8gdGhlaXIgcGFyZW50LiBXZSBjb3VsZCBhbHNvIGdvIHRocm91Z2ggcGFyZW50Tm9kZSBvbiB0aGVcbiAgICAvLyBob3N0IG5vZGUgYnV0IHRoYXQgd291bGRuJ3Qgd29yayBmb3IgUmVhY3QgTmF0aXZlIGFuZCBkb2Vzbid0IGxldCB1c1xuICAgIC8vIGRvIHRoZSBwb3J0YWwgZmVhdHVyZS5cbiAgfSB3aGlsZSAoaW5zdCAmJiBpbnN0LnRhZyAhPT0gSG9zdENvbXBvbmVudCk7XG5cbiAgaWYgKGluc3QpIHtcbiAgICByZXR1cm4gaW5zdDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBSZXR1cm4gdGhlIGxvd2VzdCBjb21tb24gYW5jZXN0b3Igb2YgQSBhbmQgQiwgb3IgbnVsbCBpZiB0aGV5IGFyZSBpblxuICogZGlmZmVyZW50IHRyZWVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7XG4gIHZhciBub2RlQSA9IGluc3RBO1xuICB2YXIgbm9kZUIgPSBpbnN0QjtcbiAgdmFyIGRlcHRoQSA9IDA7XG5cbiAgZm9yICh2YXIgdGVtcEEgPSBub2RlQTsgdGVtcEE7IHRlbXBBID0gZ2V0UGFyZW50KHRlbXBBKSkge1xuICAgIGRlcHRoQSsrO1xuICB9XG5cbiAgdmFyIGRlcHRoQiA9IDA7XG5cbiAgZm9yICh2YXIgdGVtcEIgPSBub2RlQjsgdGVtcEI7IHRlbXBCID0gZ2V0UGFyZW50KHRlbXBCKSkge1xuICAgIGRlcHRoQisrO1xuICB9IC8vIElmIEEgaXMgZGVlcGVyLCBjcmF3bCB1cC5cblxuXG4gIHdoaWxlIChkZXB0aEEgLSBkZXB0aEIgPiAwKSB7XG4gICAgbm9kZUEgPSBnZXRQYXJlbnQobm9kZUEpO1xuICAgIGRlcHRoQS0tO1xuICB9IC8vIElmIEIgaXMgZGVlcGVyLCBjcmF3bCB1cC5cblxuXG4gIHdoaWxlIChkZXB0aEIgLSBkZXB0aEEgPiAwKSB7XG4gICAgbm9kZUIgPSBnZXRQYXJlbnQobm9kZUIpO1xuICAgIGRlcHRoQi0tO1xuICB9IC8vIFdhbGsgaW4gbG9ja3N0ZXAgdW50aWwgd2UgZmluZCBhIG1hdGNoLlxuXG5cbiAgdmFyIGRlcHRoID0gZGVwdGhBO1xuXG4gIHdoaWxlIChkZXB0aC0tKSB7XG4gICAgaWYgKG5vZGVBID09PSBub2RlQiB8fCBub2RlQiAhPT0gbnVsbCAmJiBub2RlQSA9PT0gbm9kZUIuYWx0ZXJuYXRlKSB7XG4gICAgICByZXR1cm4gbm9kZUE7XG4gICAgfVxuXG4gICAgbm9kZUEgPSBnZXRQYXJlbnQobm9kZUEpO1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGV2ZW50LCB0YXJnZXQsIGNvbW1vbiwgaW5DYXB0dXJlUGhhc2UpIHtcbiAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5fcmVhY3ROYW1lO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldDtcblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICBpZiAoaW5zdGFuY2UgPT09IGNvbW1vbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIF9pbnN0YW5jZTQgPSBpbnN0YW5jZSxcbiAgICAgICAgYWx0ZXJuYXRlID0gX2luc3RhbmNlNC5hbHRlcm5hdGUsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTQuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2U0LnRhZztcblxuICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwgJiYgYWx0ZXJuYXRlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudFRhcmdldCA9IHN0YXRlTm9kZTtcblxuICAgICAgaWYgKGluQ2FwdHVyZVBoYXNlKSB7XG4gICAgICAgIHZhciBjYXB0dXJlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGNhcHR1cmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWluQ2FwdHVyZVBoYXNlKSB7XG4gICAgICAgIHZhciBidWJibGVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICBpZiAoYnViYmxlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gIH1cbn0gLy8gV2Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gZm9yOlxuLy8gLSBFbnRlckxlYXZlRXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhpcyBwbHVnaW5cbi8vIGluIHRoZSBidWJibGUgcGhhc2UsIHNvIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSB0d29cbi8vIHBoYXNlIGV2ZW50IGxpc3RlbmVycy5cblxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZVR3b1BoYXNlTGlzdGVuZXJzKGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGVudGVyRXZlbnQsIGZyb20sIHRvKSB7XG4gIHZhciBjb21tb24gPSBmcm9tICYmIHRvID8gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZnJvbSwgdG8pIDogbnVsbDtcblxuICBpZiAoZnJvbSAhPT0gbnVsbCkge1xuICAgIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbGVhdmVFdmVudCwgZnJvbSwgY29tbW9uLCBmYWxzZSk7XG4gIH1cblxuICBpZiAodG8gIT09IG51bGwgJiYgZW50ZXJFdmVudCAhPT0gbnVsbCkge1xuICAgIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZW50ZXJFdmVudCwgdG8sIGNvbW1vbiwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgY2FwdHVyZSkge1xuICByZXR1cm4gZG9tRXZlbnROYW1lICsgXCJfX1wiICsgKGNhcHR1cmUgPyAnY2FwdHVyZScgOiAnYnViYmxlJyk7XG59XG5cbnZhciBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IGZhbHNlO1xudmFyIERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MID0gJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJztcbnZhciBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgPSAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJztcbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyA9ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnO1xudmFyIEFVVE9GT0NVUyA9ICdhdXRvRm9jdXMnO1xudmFyIENISUxEUkVOID0gJ2NoaWxkcmVuJztcbnZhciBTVFlMRSA9ICdzdHlsZSc7XG52YXIgSFRNTCQxID0gJ19faHRtbCc7XG52YXIgd2FybmVkVW5rbm93blRhZ3M7XG52YXIgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudDtcbnZhciB3YXJuRm9yUHJvcERpZmZlcmVuY2U7XG52YXIgd2FybkZvckV4dHJhQXR0cmlidXRlcztcbnZhciB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXI7XG52YXIgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZztcbnZhciBub3JtYWxpemVIVE1MO1xuXG57XG4gIHdhcm5lZFVua25vd25UYWdzID0ge1xuICAgIC8vIFRoZXJlIGFyZSB3b3JraW5nIHBvbHlmaWxscyBmb3IgPGRpYWxvZz4uIExldCBwZW9wbGUgdXNlIGl0LlxuICAgIGRpYWxvZzogdHJ1ZSxcbiAgICAvLyBFbGVjdHJvbiBzaGlwcyBhIGN1c3RvbSA8d2Vidmlldz4gdGFnIHRvIGRpc3BsYXkgZXh0ZXJuYWwgd2ViIGNvbnRlbnQgaW5cbiAgICAvLyBhbiBpc29sYXRlZCBmcmFtZSBhbmQgcHJvY2Vzcy5cbiAgICAvLyBUaGlzIHRhZyBpcyBub3QgcHJlc2VudCBpbiBub24gRWxlY3Ryb24gZW52aXJvbm1lbnRzIHN1Y2ggYXMgSlNEb20gd2hpY2hcbiAgICAvLyBpcyBvZnRlbiB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9lbGVjdHJvbmpzLm9yZy9kb2NzL2FwaS93ZWJ2aWV3LXRhZ1xuICAgIHdlYnZpZXc6IHRydWVcbiAgfTtcblxuICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIHtcbiAgICAgIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzXG4gICAgfSk7XG4gIH07IC8vIElFIDExIHBhcnNlcyAmIG5vcm1hbGl6ZXMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhcyBvcHBvc2VkIHRvIG90aGVyXG4gIC8vIGJyb3dzZXJzLiBJdCBhZGRzIHNwYWNlcyBhbmQgc29ydHMgdGhlIHByb3BlcnRpZXMgaW4gc29tZVxuICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1NcbiAgLy8gcHJvcGVydGllcyBpbiB0aGUgY2xpZW50ICYgc2VydmVyIHZlcnNpb25zIG9yIGFwcGx5aW5nXG4gIC8vIGBleHBlY3RlZFN0eWxlYCB0byBhIHRlbXBvcmFyeSBET00gbm9kZSB0byByZWFkIGl0cyBgc3R5bGVgIGF0dHJpYnV0ZVxuICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzXG4gIC8vIGluIHRoYXQgYnJvd3NlciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mIGRvaW5nIGFsbCB0aGF0IHdvcmsuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExODA3XG5cblxuICBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nID0gY2FuVXNlRE9NICYmICFkb2N1bWVudC5kb2N1bWVudE1vZGU7XG5cbiAgd2FybkZvclByb3BEaWZmZXJlbmNlID0gZnVuY3Rpb24gKHByb3BOYW1lLCBzZXJ2ZXJWYWx1ZSwgY2xpZW50VmFsdWUpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZENsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclZhbHVlKTtcblxuICAgIGlmIChub3JtYWxpemVkU2VydmVyVmFsdWUgPT09IG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdQcm9wIGAlc2AgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiAlcyBDbGllbnQ6ICVzJywgcHJvcE5hbWUsIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSksIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkpO1xuICB9O1xuXG4gIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZXMpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9KTtcblxuICAgIGVycm9yKCdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7XG4gIH07XG5cbiAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGxpc3RlbmVyID09PSBmYWxzZSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYGZhbHNlYC5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGAlc2AgdHlwZS4nLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTsgLy8gUGFyc2UgdGhlIEhUTUwgYW5kIHJlYWQgaXQgYmFjayB0byBub3JtYWxpemUgdGhlIEhUTUwgc3RyaW5nIHNvIHRoYXQgaXRcbiAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uXG5cblxuICBub3JtYWxpemVIVE1MID0gZnVuY3Rpb24gKHBhcmVudCwgaHRtbCkge1xuICAgIC8vIFdlIGNvdWxkIGhhdmUgY3JlYXRlZCBhIHNlcGFyYXRlIGRvY3VtZW50IGhlcmUgdG8gYXZvaWRcbiAgICAvLyByZS1pbml0aWFsaXppbmcgY3VzdG9tIGVsZW1lbnRzIGlmIHRoZXkgZXhpc3QuIEJ1dCB0aGlzIGJyZWFrc1xuICAgIC8vIGhvdyA8bm9zY3JpcHQ+IGlzIGJlaW5nIGhhbmRsZWQuIFNvIHdlIHVzZSB0aGUgc2FtZSBkb2N1bWVudC5cbiAgICAvLyBTZWUgdGhlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTExNTcuXG4gICAgdmFyIHRlc3RFbGVtZW50ID0gcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UgPyBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHBhcmVudC50YWdOYW1lKSA6IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhwYXJlbnQubmFtZXNwYWNlVVJJLCBwYXJlbnQudGFnTmFtZSk7XG4gICAgdGVzdEVsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICByZXR1cm4gdGVzdEVsZW1lbnQuaW5uZXJIVE1MO1xuICB9O1xufSAvLyBIVE1MIHBhcnNpbmcgbm9ybWFsaXplcyBDUiBhbmQgQ1JMRiB0byBMRi5cbi8vIEl0IGFsc28gY2FuIHR1cm4gXFx1MDAwMCBpbnRvIFxcdUZGRkQgaW5zaWRlIGF0dHJpYnV0ZXMuXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc2luZ2xlLXBhZ2UuaHRtbCNwcmVwcm9jZXNzaW5nLXRoZS1pbnB1dC1zdHJlYW1cbi8vIElmIHdlIGhhdmUgYSBtaXNtYXRjaCwgaXQgbWlnaHQgYmUgY2F1c2VkIGJ5IHRoYXQuXG4vLyBXZSB3aWxsIHN0aWxsIHBhdGNoIHVwIGluIHRoaXMgY2FzZSBidXQgbm90IGZpcmUgdGhlIHdhcm5pbmcuXG5cblxudmFyIE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCA9IC9cXHJcXG4/L2c7XG52YXIgTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYID0gL1xcdTAwMDB8XFx1RkZGRC9nO1xuXG5mdW5jdGlvbiBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUobWFya3VwKSB7XG4gIHtcbiAgICBjaGVja0h0bWxTdHJpbmdDb2VyY2lvbihtYXJrdXApO1xuICB9XG5cbiAgdmFyIG1hcmt1cFN0cmluZyA9IHR5cGVvZiBtYXJrdXAgPT09ICdzdHJpbmcnID8gbWFya3VwIDogJycgKyBtYXJrdXA7XG4gIHJldHVybiBtYXJrdXBTdHJpbmcucmVwbGFjZShOT1JNQUxJWkVfTkVXTElORVNfUkVHRVgsICdcXG4nKS5yZXBsYWNlKE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCwgJycpO1xufVxuXG5mdW5jdGlvbiBjaGVja0ZvclVubWF0Y2hlZFRleHQoc2VydmVyVGV4dCwgY2xpZW50VGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldikge1xuICB2YXIgbm9ybWFsaXplZENsaWVudFRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoY2xpZW50VGV4dCk7XG4gIHZhciBub3JtYWxpemVkU2VydmVyVGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJUZXh0KTtcblxuICBpZiAobm9ybWFsaXplZFNlcnZlclRleHQgPT09IG5vcm1hbGl6ZWRDbGllbnRUZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFdhcm5EZXYpIHtcbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGV4dCBjb250ZW50IGRpZCBub3QgbWF0Y2guIFNlcnZlcjogXCIlc1wiIENsaWVudDogXCIlc1wiJywgbm9ybWFsaXplZFNlcnZlclRleHQsIG5vcm1hbGl6ZWRDbGllbnRUZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaXNDb25jdXJyZW50TW9kZSAmJiBlbmFibGVDbGllbnRSZW5kZXJGYWxsYmFja09uVGV4dE1pc21hdGNoKSB7XG4gICAgLy8gSW4gY29uY3VycmVudCByb290cywgd2UgdGhyb3cgd2hlbiB0aGVyZSdzIGEgdGV4dCBtaXNtYXRjaCBhbmQgcmV2ZXJ0IHRvXG4gICAgLy8gY2xpZW50IHJlbmRlcmluZywgdXAgdG8gdGhlIG5lYXJlc3QgU3VzcGVuc2UgYm91bmRhcnkuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUZXh0IGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggc2VydmVyLXJlbmRlcmVkIEhUTUwuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJFbGVtZW50IDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KG5vZGUpIHtcbiAgLy8gTW9iaWxlIFNhZmFyaSBkb2VzIG5vdCBmaXJlIHByb3Blcmx5IGJ1YmJsZSBjbGljayBldmVudHMgb25cbiAgLy8gbm9uLWludGVyYWN0aXZlIGVsZW1lbnRzLCB3aGljaCBtZWFucyBkZWxlZ2F0ZWQgY2xpY2sgbGlzdGVuZXJzIGRvIG5vdFxuICAvLyBmaXJlLiBUaGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBidWcgaW52b2x2ZXMgYXR0YWNoaW5nIGFuIGVtcHR5IGNsaWNrXG4gIC8vIGxpc3RlbmVyIG9uIHRoZSB0YXJnZXQgbm9kZS5cbiAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1sXG4gIC8vIEp1c3Qgc2V0IGl0IHVzaW5nIHRoZSBvbmNsaWNrIHByb3BlcnR5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBtYW5hZ2UgYW55XG4gIC8vIGJvb2trZWVwaW5nIGZvciBpdC4gTm90IHN1cmUgaWYgd2UgbmVlZCB0byBjbGVhciBpdCB3aGVuIHRoZSBsaXN0ZW5lciBpc1xuICAvLyByZW1vdmVkLlxuICAvLyBUT0RPOiBPbmx5IGRvIHRoaXMgZm9yIHRoZSByZWxldmFudCBTYWZhcmlzIG1heWJlP1xuICBub2RlLm9uY2xpY2sgPSBub29wO1xufVxuXG5mdW5jdGlvbiBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBuZXh0UHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGZvciAodmFyIHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXh0UHJvcCA9IG5leHRQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAvLyBGcmVlemUgdGhlIG5leHQgc3R5bGUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBiZVxuICAgICAgICAgIC8vIG11dGF0ZWQuIFdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgICAgT2JqZWN0LmZyZWV6ZShuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuXG5cblxuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIGluaXRpYWwgdGV4dENvbnRlbnQgd2hlbiB0aGUgdGV4dCBpcyBlbXB0eS4gSW4gSUUxMSBzZXR0aW5nXG4gICAgICAgIC8vIHRleHRDb250ZW50IG9uIGEgPHRleHRhcmVhPiB3aWxsIGNhdXNlIHRoZSBwbGFjZWhvbGRlciB0byBub3RcbiAgICAgICAgLy8gc2hvdyB3aXRoaW4gdGhlIDx0ZXh0YXJlYT4gdW50aWwgaXQgaGFzIGJlZW4gZm9jdXNlZCBhbmQgYmx1cnJlZCBhZ2Fpbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82NzMxI2lzc3VlY29tbWVudC0yNTQ4NzQ1NTNcbiAgICAgICAgdmFyIGNhblNldFRleHRDb250ZW50ID0gdGFnICE9PSAndGV4dGFyZWEnIHx8IG5leHRQcm9wICE9PSAnJztcblxuICAgICAgICBpZiAoY2FuU2V0VGV4dENvbnRlbnQpIHtcbiAgICAgICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyArIG5leHRQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBBVVRPRk9DVVMpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgLy8gVE9ETzogSGFuZGxlIHdhc0N1c3RvbUNvbXBvbmVudFRhZ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZVBheWxvYWQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgcHJvcEtleSA9IHVwZGF0ZVBheWxvYWRbaV07XG4gICAgdmFyIHByb3BWYWx1ZSA9IHVwZGF0ZVBheWxvYWRbaSArIDFdO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgcHJvcFZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50LCBwYXJlbnROYW1lc3BhY2UpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnOyAvLyBXZSBjcmVhdGUgdGFncyBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoZWlyIHBhcmVudCBjb250YWluZXIsIGV4Y2VwdCBIVE1MXG4gIC8vIHRhZ3MgZ2V0IG5vIG5hbWVzcGFjZS5cblxuICB2YXIgb3duZXJEb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHZhciBkb21FbGVtZW50O1xuICB2YXIgbmFtZXNwYWNlVVJJID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgbmFtZXNwYWNlVVJJID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICB7XG4gICAgICBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKTsgLy8gU2hvdWxkIHRoaXMgY2hlY2sgYmUgZ2F0ZWQgYnkgcGFyZW50IG5hbWVzcGFjZT8gTm90IHN1cmUgd2Ugd2FudCB0b1xuICAgICAgLy8gYWxsb3cgPFNWRz4gb3IgPG1BVEg+LlxuXG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIHR5cGUgIT09IHR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBlcnJvcignPCVzIC8+IGlzIHVzaW5nIGluY29ycmVjdCBjYXNpbmcuICcgKyAnVXNlIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMsICcgKyAnb3IgbG93ZXJjYXNlIGZvciBIVE1MIGVsZW1lbnRzLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnc2NyaXB0Jykge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBzY3JpcHQgdmlhIC5pbm5lckhUTUwgc28gaXRzIFwicGFyc2VyLWluc2VydGVkXCIgZmxhZyBpc1xuICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0IGRvZXMgbm90IGV4ZWN1dGVcbiAgICAgIHZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBkaXYuaW5uZXJIVE1MID0gJzxzY3JpcHQ+PCcgKyAnL3NjcmlwdD4nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAvLyBUaGlzIGlzIGd1YXJhbnRlZWQgdG8geWllbGQgYSBzY3JpcHQgZWxlbWVudC5cblxuICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBkaXYuZmlyc3RDaGlsZDtcbiAgICAgIGRvbUVsZW1lbnQgPSBkaXYucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcHJvcHMuaXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyAkRmxvd0lzc3VlIGBjcmVhdGVFbGVtZW50YCBzaG91bGQgYmUgdXBkYXRlZCBmb3IgV2ViIENvbXBvbmVudHNcbiAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSwge1xuICAgICAgICBpczogcHJvcHMuaXNcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZXBhcmF0ZSBlbHNlIGJyYW5jaCBpbnN0ZWFkIG9mIHVzaW5nIGBwcm9wcy5pcyB8fCB1bmRlZmluZWRgIGFib3ZlIGJlY2F1c2Ugb2YgYSBGaXJlZm94IGJ1Zy5cbiAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzY4OTZcbiAgICAgIC8vIGFuZCBkaXNjdXNzaW9uIGluIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNzYyNDBcbiAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7IC8vIE5vcm1hbGx5IGF0dHJpYnV0ZXMgYXJlIGFzc2lnbmVkIGluIGBzZXRJbml0aWFsRE9NUHJvcGVydGllc2AsIGhvd2V2ZXIgdGhlIGBtdWx0aXBsZWAgYW5kIGBzaXplYFxuICAgICAgLy8gYXR0cmlidXRlcyBvbiBgc2VsZWN0YHMgbmVlZHMgdG8gYmUgYWRkZWQgYmVmb3JlIGBvcHRpb25gcyBhcmUgaW5zZXJ0ZWQuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzOlxuICAgICAgLy8gLSBhIGJ1ZyB3aGVyZSB0aGUgYHNlbGVjdGAgZG9lcyBub3Qgc2Nyb2xsIHRvIHRoZSBjb3JyZWN0IG9wdGlvbiBiZWNhdXNlIHNpbmd1bGFyXG4gICAgICAvLyAgYHNlbGVjdGAgZWxlbWVudHMgYXV0b21hdGljYWxseSBwaWNrIHRoZSBmaXJzdCBpdGVtICMxMzIyMlxuICAgICAgLy8gLSBhIGJ1ZyB3aGVyZSB0aGUgYHNlbGVjdGAgc2V0IHRoZSBmaXJzdCBpdGVtIGFzIHNlbGVjdGVkIGRlc3BpdGUgdGhlIGBzaXplYCBhdHRyaWJ1dGUgIzE0MjM5XG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzIyMlxuICAgICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQyMzlcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHZhciBub2RlID0gZG9tRWxlbWVudDtcblxuICAgICAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgICBub2RlLm11bHRpcGxlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5zaXplKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBhIHNpemUgZ3JlYXRlciB0aGFuIDEgY2F1c2VzIGEgc2VsZWN0IHRvIGJlaGF2ZSBsaWtlIGBtdWx0aXBsZT10cnVlYCwgd2hlcmVcbiAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IG5vIG9wdGlvbiBpcyBzZWxlY3RlZC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiBhIHNlbGVjdCBpbiBcInNpbmdsZSBzZWxlY3Rpb24gbW9kZVwiLlxuICAgICAgICAgIG5vZGUuc2l6ZSA9IHByb3BzLnNpemU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgdHlwZSk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvbUVsZW1lbnQpID09PSAnW29iamVjdCBIVE1MVW5rbm93bkVsZW1lbnRdJyAmJiAhaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkpIHtcbiAgICAgICAgd2FybmVkVW5rbm93blRhZ3NbdHlwZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgdGFnIDwlcz4gaXMgdW5yZWNvZ25pemVkIGluIHRoaXMgYnJvd3Nlci4gJyArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoICcgKyAnYW4gdXBwZXJjYXNlIGxldHRlci4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpLmNyZWF0ZVRleHROb2RlKHRleHQpO1xufVxuZnVuY3Rpb24gc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHZhciBwcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpO1xuICBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBwcm9wcywgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlcihkb21FbGVtZW50LCByYXdQcm9wcywgZmFsc2UpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cbn0gLy8gQ2FsY3VsYXRlIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3byBvYmplY3RzLlxuXG5mdW5jdGlvbiBkaWZmUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIGxhc3RSYXdQcm9wcywgbmV4dFJhd1Byb3BzLCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIG5leHRSYXdQcm9wcyk7XG4gIH1cblxuICB2YXIgdXBkYXRlUGF5bG9hZCA9IG51bGw7XG4gIHZhciBsYXN0UHJvcHM7XG4gIHZhciBuZXh0UHJvcHM7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbGFzdFByb3BzID0gbGFzdFJhd1Byb3BzO1xuICAgICAgbmV4dFByb3BzID0gbmV4dFJhd1Byb3BzO1xuXG4gICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgbmV4dFByb3BzKTtcbiAgdmFyIHByb3BLZXk7XG4gIHZhciBzdHlsZU5hbWU7XG4gIHZhciBzdHlsZVVwZGF0ZXMgPSBudWxsO1xuXG4gIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbGFzdFByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgdmFyIGxhc3RTdHlsZSA9IGxhc3RQcm9wc1twcm9wS2V5XTtcblxuICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBmaWJlciBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFsbCBvdGhlciBkZWxldGVkIHByb3BlcnRpZXMgd2UgYWRkIGl0IHRvIHRoZSBxdWV1ZS4gV2UgdXNlXG4gICAgICAvLyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGluIHRoZSBjb21taXQgcGhhc2UgaW5zdGVhZC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFByb3ApIHtcbiAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkge1xuICAgICAgICAgIGlmIChsYXN0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVXBkYXRlIHN0eWxlcyB0aGF0IGNoYW5nZWQgc2luY2UgYGxhc3RQcm9wYC5cblxuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgbGFzdFByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bbc3R5bGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gbmV4dFByb3Bbc3R5bGVOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQucHVzaChwcm9wS2V5LCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3AgPyBsYXN0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRIdG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGVhZ2VybHkgbGlzdGVuIHRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBjb21taXR0ZWQgeWV0LlxuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCAmJiBsYXN0UHJvcCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgcHJvcHMgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgcHJvcGVydHkgd2UgYWx3YXlzIGFkZCBpdCB0byB0aGUgcXVldWUgYW5kIHRoZW4gd2VcbiAgICAgIC8vIGZpbHRlciBpdCBvdXQgdXNpbmcgdGhlIGFsbG93ZWQgcHJvcGVydHkgbGlzdCBkdXJpbmcgdGhlIGNvbW1pdC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0eWxlVXBkYXRlcykge1xuICAgIHtcbiAgICAgIHZhbGlkYXRlU2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb25JbkRldihzdHlsZVVwZGF0ZXMsIG5leHRQcm9wc1tTVFlMRV0pO1xuICAgIH1cblxuICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChTVFlMRSwgc3R5bGVVcGRhdGVzKTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVQYXlsb2FkO1xufSAvLyBBcHBseSB0aGUgZGlmZi5cblxuZnVuY3Rpb24gdXBkYXRlUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0YWcsIGxhc3RSYXdQcm9wcywgbmV4dFJhd1Byb3BzKSB7XG4gIC8vIFVwZGF0ZSBjaGVja2VkICpiZWZvcmUqIG5hbWUuXG4gIC8vIEluIHRoZSBtaWRkbGUgb2YgYW4gdXBkYXRlLCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGNoZWNrZWQuXG4gIC8vIFdoZW4gYSBjaGVja2VkIHJhZGlvIHRyaWVzIHRvIGNoYW5nZSBuYW1lLCBicm93c2VyIG1ha2VzIGFub3RoZXIgcmFkaW8ncyBjaGVja2VkIGZhbHNlLlxuICBpZiAodGFnID09PSAnaW5wdXQnICYmIG5leHRSYXdQcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5leHRSYXdQcm9wcy5uYW1lICE9IG51bGwpIHtcbiAgICB1cGRhdGVDaGVja2VkKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gIH1cblxuICB2YXIgd2FzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCBsYXN0UmF3UHJvcHMpO1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIG5leHRSYXdQcm9wcyk7IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG4gIHVwZGF0ZURPTVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgd2FzQ3VzdG9tQ29tcG9uZW50VGFnLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7IC8vIFRPRE86IEVuc3VyZSB0aGF0IGFuIHVwZGF0ZSBnZXRzIHNjaGVkdWxlZCBpZiBhbnkgb2YgdGhlIHNwZWNpYWwgcHJvcHNcbiAgLy8gY2hhbmdlZC5cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFVwZGF0ZSB0aGUgd3JhcHBlciBhcm91bmQgaW5wdXRzICphZnRlciogdXBkYXRpbmcgcHJvcHMuIFRoaXMgaGFzIHRvXG4gICAgICAvLyBoYXBwZW4gYWZ0ZXIgYHVwZGF0ZURPTVByb3BlcnRpZXNgLiBPdGhlcndpc2UgSFRNTDUgaW5wdXQgdmFsaWRhdGlvbnNcbiAgICAgIC8vIHJhaXNlIHdhcm5pbmdzIGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBiZWluZyBhc3NpZ25lZC5cbiAgICAgIHVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgdXBkYXRlV3JhcHBlciQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAvLyA8c2VsZWN0PiB2YWx1ZSB1cGRhdGUgbmVlZHMgdG8gb2NjdXIgYWZ0ZXIgPG9wdGlvbj4gY2hpbGRyZW5cbiAgICAgIC8vIHJlY29uY2lsaWF0aW9uXG4gICAgICBwb3N0VXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUocHJvcE5hbWUpIHtcbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHByb3BOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIXBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdIHx8IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZkh5ZHJhdGVkUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIHJhd1Byb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJFbGVtZW50LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZztcbiAgdmFyIGV4dHJhQXR0cmlidXRlTmFtZXM7XG5cbiAge1xuICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICBleHRyYUF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgIHZhciBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZXNbX2ldLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cbiAgICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NoZWNrZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgdXNlIHRoZSBvcmlnaW5hbCBuYW1lLlxuICAgICAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEwNjc2LlxuICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuYWRkKGF0dHJpYnV0ZXNbX2ldLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcblxuICBmb3IgKHZhciBwcm9wS2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCFyYXdQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcm9wID0gcmF3UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgY2hpbGRyZW4gd2UgY29tcGFyZSBhZ2FpbnN0IHRleHRDb250ZW50LiBUaGlzXG4gICAgICAvLyBtaWdodCBtYXRjaCBhZGRpdGlvbmFsIEhUTUwgdGhhdCBpcyBoaWRkZW4gd2hlbiB3ZSByZWFkIGl0IHVzaW5nXG4gICAgICAvLyB0ZXh0Q29udGVudC4gRS5nLiBcImZvb1wiIHdpbGwgbWF0Y2ggXCJmPHNwYW4+b288L3NwYW4+XCIgYnV0IHRoYXQgc3RpbGxcbiAgICAgIC8vIHNhdGlzZmllcyBvdXIgcmVxdWlyZW1lbnQuIE91ciByZXF1aXJlbWVudCBpcyBub3QgdG8gcHJvZHVjZSBwZXJmZWN0XG4gICAgICAvLyBIVE1MIGFuZCBhdHRyaWJ1dGVzLiBJZGVhbGx5IHdlIHNob3VsZCBwcmVzZXJ2ZSBzdHJ1Y3R1cmUgYnV0IGl0J3NcbiAgICAgIC8vIG9rIG5vdCB0byBpZiB0aGUgdmlzaWJsZSBjb250ZW50IGlzIHN0aWxsIGVub3VnaCB0byBpbmRpY2F0ZSB3aGF0XG4gICAgICAvLyBldmVuIGxpc3RlbmVycyB0aGVzZSBub2RlcyBtaWdodCBiZSB3aXJlZCB1cCB0by5cbiAgICAgIC8vIFRPRE86IFdhcm4gaWYgdGhlcmUgaXMgbW9yZSB0aGFuIGEgc2luZ2xlIHRleHROb2RlIGFzIGEgY2hpbGQuXG4gICAgICAvLyBUT0RPOiBTaG91bGQgd2UgdXNlIGRvbUVsZW1lbnQuZmlyc3RDaGlsZC5ub2RlVmFsdWUgdG8gY29tcGFyZT9cbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChkb21FbGVtZW50LnRleHRDb250ZW50LCBuZXh0UHJvcCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09ICcnICsgbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3AsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sICcnICsgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzaG91bGRXYXJuRGV2ICYmIHRydWUgJiYgLy8gQ29udmluY2UgRmxvdyB3ZSd2ZSBjYWxjdWxhdGVkIGl0IChpdCdzIERFVi1vbmx5IGluIHRoaXMgbWV0aG9kLilcbiAgICB0eXBlb2YgaXNDdXN0b21Db21wb25lbnRUYWcgPT09ICdib29sZWFuJykge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcHJvcGVydGllcyBjb3JyZXNwb25kIHRvIHRoZWlyIGV4cGVjdGVkIHZhbHVlcy5cbiAgICAgIHZhciBzZXJ2ZXJWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSBpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ID8gbnVsbCA6IGdldFByb3BlcnR5SW5mbyhwcm9wS2V5KTtcblxuICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSA9PT0gdHJ1ZSkgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgfHwgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkXG4gICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cbiAgICAgIHByb3BLZXkgPT09ICd2YWx1ZScgfHwgcHJvcEtleSA9PT0gJ2NoZWNrZWQnIHx8IHByb3BLZXkgPT09ICdzZWxlY3RlZCcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgICAgdmFyIHNlcnZlckhUTUwgPSBkb21FbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkSFRNTCA9IG5vcm1hbGl6ZUhUTUwoZG9tRWxlbWVudCwgbmV4dEh0bWwpO1xuXG4gICAgICAgICAgaWYgKGV4cGVjdGVkSFRNTCAhPT0gc2VydmVySFRNTCkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlckhUTUwsIGV4cGVjdGVkSFRNTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG5cbiAgICAgICAgaWYgKGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmcpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRTdHlsZSA9IGNyZWF0ZURhbmdlcm91c1N0cmluZ0ZvclN0eWxlcyhuZXh0UHJvcCk7XG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZFN0eWxlICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBleHBlY3RlZFN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgJiYgIWVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcblxuICAgICAgICBpZiAobmV4dFByb3AgIT09IHNlcnZlclZhbHVlKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZElnbm9yZUF0dHJpYnV0ZShwcm9wS2V5LCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSAmJiAhc2hvdWxkUmVtb3ZlQXR0cmlidXRlKHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgICAgICB2YXIgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBwYXJlbnROYW1lc3BhY2U7XG5cbiAgICAgICAgICBpZiAob3duTmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgICAgb3duTmFtZXNwYWNlID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHRhZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wS2V5KTtcblxuICAgICAgICAgICAgaWYgKHN0YW5kYXJkTmFtZSAhPT0gbnVsbCAmJiBzdGFuZGFyZE5hbWUgIT09IHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYW4gU1ZHIHByb3AgaXMgc3VwcGxpZWQgd2l0aCBiYWQgY2FzaW5nLCBpdCB3aWxsXG4gICAgICAgICAgICAgIC8vIGJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgZnJvbSBIVE1MLCBidXQgd2lsbCBwcm9kdWNlIGEgbWlzbWF0Y2hcbiAgICAgICAgICAgICAgLy8gKGFuZCB3b3VsZCBiZSBpbmNvcnJlY3RseSByZW5kZXJlZCBvbiB0aGUgY2xpZW50KS5cbiAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgYWxyZWFkeSB3YXJuIGFib3V0IGJhZCBjYXNpbmcgZWxzZXdoZXJlLlxuICAgICAgICAgICAgICAvLyBTbyB3ZSdsbCBza2lwIHRoZSBtaXNsZWFkaW5nIGV4dHJhIG1pc21hdGNoIHdhcm5pbmcgaW4gdGhpcyBjYXNlLlxuICAgICAgICAgICAgICBpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcgPSB0cnVlOyAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cbiAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUoc3RhbmRhcmROYW1lKTtcbiAgICAgICAgICAgIH0gLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuXG5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRvbnRXYXJuQ3VzdG9tRWxlbWVudCA9IGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgIDtcblxuICAgICAgICBpZiAoIWRvbnRXYXJuQ3VzdG9tRWxlbWVudCAmJiBuZXh0UHJvcCAhPT0gc2VydmVyVmFsdWUgJiYgIWlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZykge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChzaG91bGRXYXJuRGV2KSB7XG4gICAgICBpZiAoIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuc2l6ZSA+IDAgJiYgcmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyhleHRyYUF0dHJpYnV0ZU5hbWVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIHRydWUpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIC8vIEZvciBpbnB1dCBhbmQgdGV4dGFyZWEgd2UgY3VycmVudCBhbHdheXMgc2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSBhdFxuICAgICAgLy8gcG9zdCBtb3VudCB0byBmb3JjZSBpdCB0byBkaXZlcmdlIGZyb20gYXR0cmlidXRlcy4gSG93ZXZlciwgZm9yXG4gICAgICAvLyBvcHRpb24gYW5kIHNlbGVjdCB3ZSBkb24ndCBxdWl0ZSBkbyB0aGUgc2FtZSB0aGluZyBhbmQgc2VsZWN0XG4gICAgICAvLyBpcyBub3QgcmVzaWxpZW50IHRvIHRoZSBET00gc3RhdGUgY2hhbmdpbmcgc28gd2UgZG9uJ3QgZG8gdGhhdCBoZXJlLlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbm90IGRvaW5nIHRoaXMgZm9yIGlucHV0IGFuZCB0ZXh0YXJlYS5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcmF3UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFRleHQodGV4dE5vZGUsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgdmFyIGlzRGlmZmVyZW50ID0gdGV4dE5vZGUubm9kZVZhbHVlICE9PSB0ZXh0O1xuICByZXR1cm4gaXNEaWZmZXJlbnQ7XG59XG5mdW5jdGlvbiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGNoaWxkKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIDwlcz4gaW4gPCVzPi4nLCBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGNoaWxkKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiB0aGUgdGV4dCBub2RlIFwiJXNcIiBpbiA8JXM+LicsIGNoaWxkLm5vZGVWYWx1ZSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHRhZywgcHJvcHMpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgPCVzPiBpbiA8JXM+LicsIHRhZywgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpIHtcbiAge1xuICAgIGlmICh0ZXh0ID09PSAnJykge1xuICAgICAgLy8gV2UgZXhwZWN0IHRvIGluc2VydCBlbXB0eSB0ZXh0IG5vZGVzIHNpbmNlIHRoZXkncmUgbm90IHJlcHJlc2VudGVkIGluXG4gICAgICAvLyB0aGUgSFRNTC5cbiAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIHNwZWNpYWwgY2FzZSBpZiB3ZSBjYW4ganVzdCBhdm9pZCBpbnNlcnRpbmcgZW1wdHlcbiAgICAgIC8vIHRleHQgbm9kZXMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyB0ZXh0IG5vZGUgZm9yIFwiJXNcIiBpbiA8JXM+LicsIHRleHQsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMyhkb21FbGVtZW50LCB0YWcsIHByb3BzKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG4gIH1cbn1cblxudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vIFRoaXMgdmFsaWRhdGlvbiBjb2RlIHdhcyB3cml0dGVuIGJhc2VkIG9uIHRoZSBIVE1MNSBwYXJzaW5nIHNwZWM6XG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG4gIC8vXG4gIC8vIE5vdGU6IHRoaXMgZG9lcyBub3QgY2F0Y2ggYWxsIGludmFsaWQgbmVzdGluZywgbm9yIGRvZXMgaXQgdHJ5IHRvIChhcyBpdCdzXG4gIC8vIG5vdCBjbGVhciB3aGF0IHByYWN0aWNhbCBiZW5lZml0IGRvaW5nIHNvIHByb3ZpZGVzKTsgaW5zdGVhZCwgd2Ugd2FybiBvbmx5XG4gIC8vIGZvciBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIHdpbGwgZ2l2ZSBhIHBhcnNlIHRyZWUgZGlmZmVyaW5nIGZyb20gd2hhdCBSZWFjdFxuICAvLyBpbnRlbmRlZC4gRm9yIGV4YW1wbGUsIDxiPjxkaXY+PC9kaXY+PC9iPiBpcyBpbnZhbGlkIGJ1dCB3ZSBkb24ndCB3YXJuXG4gIC8vIGJlY2F1c2UgaXQgc3RpbGwgcGFyc2VzIGNvcnJlY3RseTsgd2UgZG8gd2FybiBmb3Igb3RoZXIgY2FzZXMgbGlrZSBuZXN0ZWRcbiAgLy8gPHA+IHRhZ3Mgd2hlcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgaW1wbGljaXRseSBjbG9zZXMgdGhlXG4gIC8vIGZpcnN0LCBjYXVzaW5nIGEgY29uZnVzaW5nIG1lc3MuXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3NwZWNpYWxcbiAgdmFyIHNwZWNpYWxUYWdzID0gWydhZGRyZXNzJywgJ2FwcGxldCcsICdhcmVhJywgJ2FydGljbGUnLCAnYXNpZGUnLCAnYmFzZScsICdiYXNlZm9udCcsICdiZ3NvdW5kJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FwdGlvbicsICdjZW50ZXInLCAnY29sJywgJ2NvbGdyb3VwJywgJ2RkJywgJ2RldGFpbHMnLCAnZGlyJywgJ2RpdicsICdkbCcsICdkdCcsICdlbWJlZCcsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb290ZXInLCAnZm9ybScsICdmcmFtZScsICdmcmFtZXNldCcsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsICdoZWFkJywgJ2hlYWRlcicsICdoZ3JvdXAnLCAnaHInLCAnaHRtbCcsICdpZnJhbWUnLCAnaW1nJywgJ2lucHV0JywgJ2lzaW5kZXgnLCAnbGknLCAnbGluaycsICdsaXN0aW5nJywgJ21haW4nLCAnbWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGEnLCAnbmF2JywgJ25vZW1iZWQnLCAnbm9mcmFtZXMnLCAnbm9zY3JpcHQnLCAnb2JqZWN0JywgJ29sJywgJ3AnLCAncGFyYW0nLCAncGxhaW50ZXh0JywgJ3ByZScsICdzY3JpcHQnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc291cmNlJywgJ3N0eWxlJywgJ3N1bW1hcnknLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGl0bGUnLCAndHInLCAndHJhY2snLCAndWwnLCAnd2JyJywgJ3htcCddOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuXG4gIHZhciBpblNjb3BlVGFncyA9IFsnYXBwbGV0JywgJ2NhcHRpb24nLCAnaHRtbCcsICd0YWJsZScsICd0ZCcsICd0aCcsICdtYXJxdWVlJywgJ29iamVjdCcsICd0ZW1wbGF0ZScsIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2h0bWwtaW50ZWdyYXRpb24tcG9pbnRcbiAgLy8gVE9ETzogRGlzdGluZ3Vpc2ggYnkgbmFtZXNwYWNlIGhlcmUgLS0gZm9yIDx0aXRsZT4sIGluY2x1ZGluZyBpdCBoZXJlXG4gIC8vIGVycnMgb24gdGhlIHNpZGUgb2YgZmV3ZXIgd2FybmluZ3NcbiAgJ2ZvcmVpZ25PYmplY3QnLCAnZGVzYycsICd0aXRsZSddOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1idXR0b24tc2NvcGVcblxuICB2YXIgYnV0dG9uU2NvcGVUYWdzID0gaW5TY29wZVRhZ3MuY29uY2F0KFsnYnV0dG9uJ10pOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNnZW5lcmF0ZS1pbXBsaWVkLWVuZC10YWdzXG5cbiAgdmFyIGltcGxpZWRFbmRUYWdzID0gWydkZCcsICdkdCcsICdsaScsICdvcHRpb24nLCAnb3B0Z3JvdXAnLCAncCcsICdycCcsICdydCddO1xuICB2YXIgZW1wdHlBbmNlc3RvckluZm8gPSB7XG4gICAgY3VycmVudDogbnVsbCxcbiAgICBmb3JtVGFnOiBudWxsLFxuICAgIGFUYWdJblNjb3BlOiBudWxsLFxuICAgIGJ1dHRvblRhZ0luU2NvcGU6IG51bGwsXG4gICAgbm9iclRhZ0luU2NvcGU6IG51bGwsXG4gICAgcFRhZ0luQnV0dG9uU2NvcGU6IG51bGwsXG4gICAgbGlzdEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbCxcbiAgICBkbEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbFxuICB9O1xuXG4gIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAob2xkSW5mbywgdGFnKSB7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IGFzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbyk7XG5cbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHRhZzogdGFnXG4gICAgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7XG4gICAgfSAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFncyBpblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEgJiYgdGFnICE9PSAnYWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBhbmNlc3RvckluZm8uY3VycmVudCA9IGluZm87XG5cbiAgICBpZiAodGFnID09PSAnZm9ybScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbm9icicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnZGQnIHx8IHRhZyA9PT0gJ2R0Jykge1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JJbmZvO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGlzVGFnVmFsaWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7XG4gICAgLy8gRmlyc3QsIGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uXG4gICAgc3dpdGNoIChwYXJlbnRUYWcpIHtcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdFxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JztcblxuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcblxuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRkXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jYXB0aW9uXG4gICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yIHNpbmNlIHRoZXNlIHJ1bGVzIGZhbGwgYmFjayB0byBcImluIGJvZHlcIiBtb2RlIGZvclxuICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG5cbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGJvZHlcblxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNvbGdyb3VwXG5cbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcblxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY2FwdGlvbicgfHwgdGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5JyB8fCB0YWcgPT09ICd0Zm9vdCcgfHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmhlYWRcblxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudFxuXG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknIHx8IHRhZyA9PT0gJ2ZyYW1lc2V0JztcblxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnZnJhbWUnO1xuXG4gICAgICBjYXNlICcjZG9jdW1lbnQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaHRtbCc7XG4gICAgfSAvLyBQcm9iYWJseSBpbiB0aGUgXCJpbiBib2R5XCIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zXG4gICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyAhPT0gJ2gxJyAmJiBwYXJlbnRUYWcgIT09ICdoMicgJiYgcGFyZW50VGFnICE9PSAnaDMnICYmIHBhcmVudFRhZyAhPT0gJ2g0JyAmJiBwYXJlbnRUYWcgIT09ICdoNScgJiYgcGFyZW50VGFnICE9PSAnaDYnO1xuXG4gICAgICBjYXNlICdycCc6XG4gICAgICBjYXNlICdydCc6XG4gICAgICAgIHJldHVybiBpbXBsaWVkRW5kVGFncy5pbmRleE9mKHBhcmVudFRhZykgPT09IC0xO1xuXG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgY2FzZSAnY29sJzpcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0ZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICBjYXNlICd0aCc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIC8vIFRoZXNlIHRhZ3MgYXJlIG9ubHkgdmFsaWQgd2l0aCBhIGZldyBwYXJlbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIGNoaWxkXG4gICAgICAgIC8vIHBhcnNpbmcgcnVsZXMgLS0gaWYgd2UncmUgZG93biBoZXJlLCB0aGVuIG5vbmUgb2YgdGhvc2UgbWF0Y2hlZCBhbmRcbiAgICAgICAgLy8gc28gd2UgYWxsb3cgaXQgb25seSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHBhcmVudCBpcywgYXMgYWxsIG90aGVyXG4gICAgICAgIC8vIGNhc2VzIGFyZSBpbnZhbGlkLlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnID09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdhZGRyZXNzJzpcbiAgICAgIGNhc2UgJ2FydGljbGUnOlxuICAgICAgY2FzZSAnYXNpZGUnOlxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgY2FzZSAnZGlyJzpcbiAgICAgIGNhc2UgJ2Rpdic6XG4gICAgICBjYXNlICdkbCc6XG4gICAgICBjYXNlICdmaWVsZHNldCc6XG4gICAgICBjYXNlICdmaWdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2ZpZ3VyZSc6XG4gICAgICBjYXNlICdmb290ZXInOlxuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgIGNhc2UgJ2hncm91cCc6XG4gICAgICBjYXNlICdtYWluJzpcbiAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgY2FzZSAnbmF2JzpcbiAgICAgIGNhc2UgJ29sJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnc2VjdGlvbic6XG4gICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGNhc2UgJ3VsJzpcbiAgICAgIGNhc2UgJ3ByZSc6XG4gICAgICBjYXNlICdsaXN0aW5nJzpcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ3htcCc6XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmZvcm1UYWcgfHwgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdsaSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnZGQnOlxuICAgICAgY2FzZSAnZHQnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAvLyBTcGVjIHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBzb3VuZHNcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGlzIGNoZWNrLlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdub2JyJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICB2YXIgZGlkV2FybiQxID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICBpZiAoY2hpbGRUYWcgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJyk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGFnID0gJyN0ZXh0JztcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNoaWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87XG4gICAgdmFyIGludmFsaWRBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgPyBudWxsIDogZmluZEludmFsaWRBbmNlc3RvckZvclRhZyhjaGlsZFRhZywgYW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW52YWxpZFBhcmVudE9yQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50IHx8IGludmFsaWRBbmNlc3RvcjtcblxuICAgIGlmICghaW52YWxpZFBhcmVudE9yQW5jZXN0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYW5jZXN0b3JUYWcgPSBpbnZhbGlkUGFyZW50T3JBbmNlc3Rvci50YWc7XG4gICAgdmFyIHdhcm5LZXkgPSAhIWludmFsaWRQYXJlbnQgKyAnfCcgKyBjaGlsZFRhZyArICd8JyArIGFuY2VzdG9yVGFnO1xuXG4gICAgaWYgKGRpZFdhcm4kMVt3YXJuS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm4kMVt3YXJuS2V5XSA9IHRydWU7XG4gICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7XG4gICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7XG5cbiAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHtcbiAgICAgIGlmICgvXFxTLy50ZXN0KGNoaWxkVGV4dCkpIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnO1xuICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9IFwiIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gXCIgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyArICc+JztcbiAgICB9XG5cbiAgICBpZiAoaW52YWxpZFBhcmVudCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+LCA8dGhlYWQ+IG9yIDx0Zm9vdD4gdG8geW91ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nlci4nO1xuICAgICAgfVxuXG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxID0gJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZyc7XG52YXIgU1VTUEVOU0VfU1RBUlRfREFUQSA9ICckJztcbnZhciBTVVNQRU5TRV9FTkRfREFUQSA9ICcvJCc7XG52YXIgU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBID0gJyQ/JztcbnZhciBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBID0gJyQhJztcbnZhciBTVFlMRSQxID0gJ3N0eWxlJztcbnZhciBldmVudHNFbmFibGVkID0gbnVsbDtcbnZhciBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGw7XG5mdW5jdGlvbiBnZXRSb290SG9zdENvbnRleHQocm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gIHZhciB0eXBlO1xuICB2YXIgbmFtZXNwYWNlO1xuICB2YXIgbm9kZVR5cGUgPSByb290Q29udGFpbmVySW5zdGFuY2Uubm9kZVR5cGU7XG5cbiAgc3dpdGNoIChub2RlVHlwZSkge1xuICAgIGNhc2UgRE9DVU1FTlRfTk9ERTpcbiAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6XG4gICAgICB7XG4gICAgICAgIHR5cGUgPSBub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/ICcjZG9jdW1lbnQnIDogJyNmcmFnbWVudCc7XG4gICAgICAgIHZhciByb290ID0gcm9vdENvbnRhaW5lckluc3RhbmNlLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgbmFtZXNwYWNlID0gcm9vdCA/IHJvb3QubmFtZXNwYWNlVVJJIDogZ2V0Q2hpbGROYW1lc3BhY2UobnVsbCwgJycpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckluc3RhbmNlLnBhcmVudE5vZGUgOiByb290Q29udGFpbmVySW5zdGFuY2U7XG4gICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBjb250YWluZXIubmFtZXNwYWNlVVJJIHx8IG51bGw7XG4gICAgICAgIHR5cGUgPSBjb250YWluZXIudGFnTmFtZTtcbiAgICAgICAgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2Uob3duTmFtZXNwYWNlLCB0eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIHZhbGlkYXRlZFRhZyA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhudWxsLCB2YWxpZGF0ZWRUYWcpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgIGFuY2VzdG9ySW5mbzogYW5jZXN0b3JJbmZvXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGRIb3N0Q29udGV4dChwYXJlbnRIb3N0Q29udGV4dCwgdHlwZSwgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gIHtcbiAgICB2YXIgcGFyZW50SG9zdENvbnRleHREZXYgPSBwYXJlbnRIb3N0Q29udGV4dDtcbiAgICB2YXIgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2UocGFyZW50SG9zdENvbnRleHREZXYubmFtZXNwYWNlLCB0eXBlKTtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhwYXJlbnRIb3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgIGFuY2VzdG9ySW5mbzogYW5jZXN0b3JJbmZvXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gcHJlcGFyZUZvckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIGV2ZW50c0VuYWJsZWQgPSBpc0VuYWJsZWQoKTtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpO1xuICB2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsO1xuXG4gIHNldEVuYWJsZWQoZmFsc2UpO1xuICByZXR1cm4gYWN0aXZlSW5zdGFuY2U7XG59XG5mdW5jdGlvbiByZXNldEFmdGVyQ29tbWl0KGNvbnRhaW5lckluZm8pIHtcbiAgcmVzdG9yZVNlbGVjdGlvbihzZWxlY3Rpb25JbmZvcm1hdGlvbik7XG4gIHNldEVuYWJsZWQoZXZlbnRzRW5hYmxlZCk7XG4gIGV2ZW50c0VuYWJsZWQgPSBudWxsO1xuICBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGw7XG59XG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZSh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICAvLyBUT0RPOiB0YWtlIG5hbWVzcGFjZSBpbnRvIGFjY291bnQgd2hlbiB2YWxpZGF0aW5nLlxuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyh0eXBlLCBudWxsLCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgcHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG5cbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH1cblxuICB2YXIgZG9tRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgcGFyZW50TmFtZXNwYWNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgZG9tRWxlbWVudCk7XG4gIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpO1xuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAgc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICByZXR1cm4gISFwcm9wcy5hdXRvRm9jdXM7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlVXBkYXRlKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG5cbiAgICBpZiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuICE9PSB0eXBlb2Ygb2xkUHJvcHMuY2hpbGRyZW4gJiYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIG5ld1Byb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcm9wcykge1xuICByZXR1cm4gdHlwZSA9PT0gJ3RleHRhcmVhJyB8fCB0eXBlID09PSAnbm9zY3JpcHQnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSBudWxsICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCAhPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCB0ZXh0LCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuICB9XG5cbiAgdmFyIHRleHROb2RlID0gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dE5vZGUpO1xuICByZXR1cm4gdGV4dE5vZGU7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSgpIHtcbiAgdmFyIGN1cnJlbnRFdmVudCA9IHdpbmRvdy5ldmVudDtcblxuICBpZiAoY3VycmVudEV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICByZXR1cm4gZ2V0RXZlbnRQcmlvcml0eShjdXJyZW50RXZlbnQudHlwZSk7XG59XG4vLyBpZiBhIGNvbXBvbmVudCBqdXN0IGltcG9ydHMgUmVhY3RET00gKGUuZy4gZm9yIGZpbmRET01Ob2RlKS5cbi8vIFNvbWUgZW52aXJvbm1lbnRzIG1pZ2h0IG5vdCBoYXZlIHNldFRpbWVvdXQgb3IgY2xlYXJUaW1lb3V0LlxuXG52YXIgc2NoZWR1bGVUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIGNhbmNlbFRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIG5vVGltZW91dCA9IC0xO1xudmFyIGxvY2FsUHJvbWlzZSA9IHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nID8gUHJvbWlzZSA6IHVuZGVmaW5lZDsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIHNjaGVkdWxlTWljcm90YXNrID0gdHlwZW9mIHF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nID8gcXVldWVNaWNyb3Rhc2sgOiB0eXBlb2YgbG9jYWxQcm9taXNlICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICByZXR1cm4gbG9jYWxQcm9taXNlLnJlc29sdmUobnVsbCkudGhlbihjYWxsYmFjaykuY2F0Y2goaGFuZGxlRXJyb3JJbk5leHRUaWNrKTtcbn0gOiBzY2hlZHVsZVRpbWVvdXQ7IC8vIFRPRE86IERldGVybWluZSB0aGUgYmVzdCBmYWxsYmFjayBoZXJlLlxuXG5mdW5jdGlvbiBoYW5kbGVFcnJvckluTmV4dFRpY2soZXJyb3IpIHtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBEZXNwaXRlIHRoZSBuYW1pbmcgdGhhdCBtaWdodCBpbXBseSBvdGhlcndpc2UsIHRoaXMgbWV0aG9kIG9ubHlcbiAgLy8gZmlyZXMgaWYgdGhlcmUgaXMgYW4gYFVwZGF0ZWAgZWZmZWN0IHNjaGVkdWxlZCBkdXJpbmcgbW91bnRpbmcuXG4gIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdFxuICAvLyBkb2VzIHRvIGltcGxlbWVudCB0aGUgYGF1dG9Gb2N1c2AgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQpLiBCdXRcbiAgLy8gdGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbiAoc3VjaCBhcyBwYXRjaGluZ1xuICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaWYgKG5ld1Byb3BzLmF1dG9Gb2N1cykge1xuICAgICAgICBkb21FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgICB7XG4gICAgICAgIGlmIChuZXdQcm9wcy5zcmMpIHtcbiAgICAgICAgICBkb21FbGVtZW50LnNyYyA9IG5ld1Byb3BzLnNyYztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBBcHBseSB0aGUgZGlmZiB0byB0aGUgRE9NIG5vZGUuXG4gIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTsgLy8gVXBkYXRlIHRoZSBwcm9wcyBoYW5kbGUgc28gdGhhdCB3ZSBrbm93IHdoaWNoIHByb3BzIGFyZSB0aGUgb25lcyB3aXRoXG4gIC8vIHdpdGggY3VycmVudCBldmVudCBoYW5kbGVycy5cblxuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCkge1xuICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyk7XG59XG5mdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gbmV3VGV4dDtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgdmFyIHBhcmVudE5vZGU7XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXI7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH0gLy8gVGhpcyBjb250YWluZXIgbWlnaHQgYmUgdXNlZCBmb3IgYSBwb3J0YWwuXG4gIC8vIElmIHNvbWV0aGluZyBpbnNpZGUgYSBwb3J0YWwgaXMgY2xpY2tlZCwgdGhhdCBjbGljayBzaG91bGQgYnViYmxlXG4gIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkXG4gIC8vIG5ldmVyIGJ1YmJsZSB0aHJvdWdoIHRoZSAqRE9NKiB0cmVlIHVubGVzcyBhbiBhbmNlc3RvciB3aXRoIG9uY2xpY2tcbiAgLy8gZXZlbnQgZXhpc3RzLiBTbyB3ZSB3b3VsZG4ndCBzZWUgaXQgYW5kIGRpc3BhdGNoIGl0LlxuICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2tcbiAgLy8gZGVmaW5lZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTkxOFxuXG5cbiAgdmFyIHJlYWN0Um9vdENvbnRhaW5lciA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gIGlmICgocmVhY3RSb290Q29udGFpbmVyID09PSBudWxsIHx8IHJlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSAmJiBwYXJlbnROb2RlLm9uY2xpY2sgPT09IG51bGwpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50SW5zdGFuY2UsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbn1cbmZ1bmN0aW9uIGluc2VydEluQ29udGFpbmVyQmVmb3JlKGNvbnRhaW5lciwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShwYXJlbnRJbnN0YW5jZSwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHN1c3BlbnNlSW5zdGFuY2U7IC8vIERlbGV0ZSBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgZG8ge1xuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobm9kZSk7XG5cbiAgICBpZiAobmV4dE5vZGUgJiYgbmV4dE5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBuZXh0Tm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobmV4dE5vZGUpOyAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cbiAgICAgICAgICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbmV4dE5vZGU7XG4gIH0gd2hpbGUgKG5vZGUpOyAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnlGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY29udGFpbmVyLnBhcmVudE5vZGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSk7XG4gIH0gLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gaGlkZUluc3RhbmNlKGluc3RhbmNlKSB7XG4gIC8vIFRPRE86IERvZXMgdGhpcyB3b3JrIGZvciBhbGwgZWxlbWVudCB0eXBlcz8gV2hhdCBhYm91dCBNYXRoTUw/IFNob3VsZCB3ZVxuICAvLyBwYXNzIGhvc3QgY29udGV4dCB0byB0aGlzIG1ldGhvZD9cbiAgaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgdmFyIHN0eWxlID0gaW5zdGFuY2Uuc3R5bGU7XG5cbiAgaWYgKHR5cGVvZiBzdHlsZS5zZXRQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7XG4gIH0gZWxzZSB7XG4gICAgc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuZnVuY3Rpb24gaGlkZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9ICcnO1xufVxuZnVuY3Rpb24gdW5oaWRlSW5zdGFuY2UoaW5zdGFuY2UsIHByb3BzKSB7XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZVByb3AgPSBwcm9wc1tTVFlMRSQxXTtcbiAgdmFyIGRpc3BsYXkgPSBzdHlsZVByb3AgIT09IHVuZGVmaW5lZCAmJiBzdHlsZVByb3AgIT09IG51bGwgJiYgc3R5bGVQcm9wLmhhc093blByb3BlcnR5KCdkaXNwbGF5JykgPyBzdHlsZVByb3AuZGlzcGxheSA6IG51bGw7XG4gIGluc3RhbmNlLnN0eWxlLmRpc3BsYXkgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKCdkaXNwbGF5JywgZGlzcGxheSk7XG59XG5mdW5jdGlvbiB1bmhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0KSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSB0ZXh0O1xufVxuZnVuY3Rpb24gY2xlYXJDb250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci50ZXh0Q29udGVudCA9ICcnO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIGlmIChjb250YWluZXIuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICE9PSBFTEVNRU5UX05PREUgfHwgdHlwZS50b0xvd2VyQ2FzZSgpICE9PSBpbnN0YW5jZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhbiBlbGVtZW50IG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKGluc3RhbmNlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSAnJyB8fCBpbnN0YW5jZS5ub2RlVHlwZSAhPT0gVEVYVF9OT0RFKSB7XG4gICAgLy8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IHBhcnNlZCBieSBIVE1MIHNvIHRoZXJlIHdvbid0IGJlIGEgY29ycmVjdCBtYXRjaCBoZXJlLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYSB0ZXh0IG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgc3VzcGVuc2Ugbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrRXJyb3JEZXRhaWxzKGluc3RhbmNlKSB7XG4gIHZhciBkYXRhc2V0ID0gaW5zdGFuY2UubmV4dFNpYmxpbmcgJiYgaW5zdGFuY2UubmV4dFNpYmxpbmcuZGF0YXNldDtcbiAgdmFyIGRpZ2VzdCwgbWVzc2FnZSwgc3RhY2s7XG5cbiAgaWYgKGRhdGFzZXQpIHtcbiAgICBkaWdlc3QgPSBkYXRhc2V0LmRnc3Q7XG5cbiAgICB7XG4gICAgICBtZXNzYWdlID0gZGF0YXNldC5tc2c7XG4gICAgICBzdGFjayA9IGRhdGFzZXQuc3RjaztcbiAgICB9XG4gIH1cblxuICB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICBkaWdlc3Q6IGRpZ2VzdCxcbiAgICAgIHN0YWNrOiBzdGFja1xuICAgIH07XG4gIH0gLy8gbGV0IHZhbHVlID0ge21lc3NhZ2U6IHVuZGVmaW5lZCwgaGFzaDogdW5kZWZpbmVkfTtcbiAgLy8gY29uc3QgbmV4dFNpYmxpbmcgPSBpbnN0YW5jZS5uZXh0U2libGluZztcbiAgLy8gaWYgKG5leHRTaWJsaW5nKSB7XG4gIC8vICAgY29uc3QgZGF0YXNldCA9ICgobmV4dFNpYmxpbmc6IGFueSk6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpLmRhdGFzZXQ7XG4gIC8vICAgdmFsdWUubWVzc2FnZSA9IGRhdGFzZXQubXNnO1xuICAvLyAgIHZhbHVlLmhhc2ggPSBkYXRhc2V0Lmhhc2g7XG4gIC8vICAgaWYgKHRydWUpIHtcbiAgLy8gICAgIHZhbHVlLnN0YWNrID0gZGF0YXNldC5zdGFjaztcbiAgLy8gICB9XG4gIC8vIH1cbiAgLy8gcmV0dXJuIHZhbHVlO1xuXG59XG5mdW5jdGlvbiByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShpbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgaW5zdGFuY2UuX3JlYWN0UmV0cnkgPSBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGUobm9kZSkge1xuICAvLyBTa2lwIG5vbi1oeWRyYXRhYmxlIG5vZGVzLlxuICBmb3IgKDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5uZXh0U2libGluZykge1xuICAgIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIG5vZGVEYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAobm9kZURhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShpbnN0YW5jZS5uZXh0U2libGluZyk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcbn1cbmZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50c1xuICAvLyBnZXQgYXR0YWNoZWQuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH0gLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpOyAvLyBUT0RPOiBUZW1wb3JhcnkgaGFjayB0byBjaGVjayBpZiB3ZSdyZSBpbiBhIGNvbmN1cnJlbnQgcm9vdC4gV2UgY2FuIGRlbGV0ZVxuICAvLyB3aGVuIHRoZSBsZWdhY3kgcm9vdCBBUEkgaXMgcmVtb3ZlZC5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlLm5leHRTaWJsaW5nOyAvLyBTa2lwIHBhc3QgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBub2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICB9IC8vIFRPRE86IFdhcm4sIHdlIGRpZG4ndCBmaW5kIHRoZSBlbmQgY29tbWVudCBib3VuZGFyeS5cblxuXG4gIHJldHVybiBudWxsO1xufSAvLyBSZXR1cm5zIHRoZSBTdXNwZW5zZUluc3RhbmNlIGlmIHRoaXMgbm9kZSBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhXG4vLyBTdXNwZW5zZUluc3RhbmNlLiBJLmUuIGlmIGl0cyBwcmV2aW91cyBzaWJsaW5nIGlzIGEgQ29tbWVudCB3aXRoXG4vLyBTVVNQRU5TRV94X1NUQVJUX0RBVEEuIE90aGVyd2lzZSwgbnVsbC5cblxuZnVuY3Rpb24gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXRJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHRhcmdldEluc3RhbmNlLnByZXZpb3VzU2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZENvbnRhaW5lcihjb250YWluZXIpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkge1xuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhwYXJlbnRUeXBlKSB7XG4gIHJldHVybiBwYXJlbnRUeXBlICE9PSAnaGVhZCcgJiYgcGFyZW50VHlwZSAhPT0gJ2JvZHknO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB2YXIgc2hvdWxkV2FybkRldiA9IHRydWU7XG4gIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgaWYgKHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuXG4gICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIGluc3RhbmNlLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHRleHQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAge1xuICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50SW5zdGFuY2UsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudEluc3RhbmNlLCB0ZXh0KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHBhcmVudENvbnRhaW5lcikge1xuICB7XG4gICAgLy8gVE9ETzogVGhpcyBnZXRzIGxvZ2dlZCBieSBvblJlY292ZXJhYmxlRXJyb3IsIHRvbywgc28gd2Ugc2hvdWxkIGJlXG4gICAgLy8gYWJsZSB0byByZW1vdmUgaXQuXG4gICAgZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24uIFRoZSBzZXJ2ZXIgSFRNTCB3YXMgcmVwbGFjZWQgd2l0aCBjbGllbnQgY29udGVudCBpbiA8JXM+LicsIHBhcmVudENvbnRhaW5lci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVBvcnRhbE1vdW50KHBvcnRhbEluc3RhbmNlKSB7XG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHBvcnRhbEluc3RhbmNlKTtcbn1cblxudmFyIHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xudmFyIGludGVybmFsSW5zdGFuY2VLZXkgPSAnX19yZWFjdEZpYmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxQcm9wc0tleSA9ICdfX3JlYWN0UHJvcHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5ID0gJ19fcmVhY3RDb250YWluZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXkgPSAnX19yZWFjdEV2ZW50cyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5ID0gJ19fcmVhY3RMaXN0ZW5lcnMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleSA9ICdfX3JlYWN0SGFuZGxlcyQnICsgcmFuZG9tS2V5O1xuZnVuY3Rpb24gZGV0YWNoRGVsZXRlZEluc3RhbmNlKG5vZGUpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBvbiBob3N0IGNvbXBvbmVudHMuIEkgZG9uJ3QgdGhpbmsgYWxsIG9mXG4gIC8vIHRoZXNlIGZpZWxkcyBhcmUgcmVsZXZhbnQuXG4gIGRlbGV0ZSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbFByb3BzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleV07XG59XG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5mdW5jdGlvbiBtYXJrQ29udGFpbmVyQXNSb290KGhvc3RSb290LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBob3N0Um9vdDtcbn1cbmZ1bmN0aW9uIHVubWFya0NvbnRhaW5lckFzUm9vdChub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xufVxuZnVuY3Rpb24gaXNDb250YWluZXJNYXJrZWRBc1Jvb3Qobm9kZSkge1xuICByZXR1cm4gISFub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xufSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci5cbi8vIElmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgaHlkcmF0ZWQgb3Igbm90IHlldCByZW5kZXJlZCBzdWJ0cmVlLCB0aGVuXG4vLyB0aGlzIG1heSBhbHNvIHJldHVybiBhIFN1c3BlbnNlQ29tcG9uZW50IG9yIEhvc3RSb290IHRvIGluZGljYXRlIHRoYXQuXG4vLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3Vcbi8vIHBhc3MgdGhlIENvbnRhaW5lciBub2RlIGFzIHRoZSB0YXJnZXROb2RlLCB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgZ2V0IHRoZVxuLy8gSG9zdFJvb3QgYmFjay4gVG8gZ2V0IHRvIHRoZSBIb3N0Um9vdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNoaWxkIG9mIGl0LlxuLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLlxuXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICBpZiAodGFyZ2V0SW5zdCkge1xuICAgIC8vIERvbid0IHJldHVybiBIb3N0Um9vdCBvciBTdXNwZW5zZUNvbXBvbmVudCBoZXJlLlxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9IC8vIElmIHRoZSBkaXJlY3QgZXZlbnQgdGFyZ2V0IGlzbid0IGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUsIHdlIG5lZWQgdG8gbG9va1xuICAvLyB0byBzZWUgaWYgb25lIG9mIGl0cyBwYXJlbnRzIGlzIGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUuXG5cblxuICB2YXIgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgIC8vIFdlJ2xsIGNoZWNrIGlmIHRoaXMgaXMgYSBjb250YWluZXIgcm9vdCB0aGF0IGNvdWxkIGluY2x1ZGVcbiAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGlmIHdlJ3JlIGEgY2hpbGQgb2YgYSBkZWh5ZHJhdGVkIGNvbnRhaW5lciwgd2UgbmVlZCB0byBmaXJzdFxuICAgIC8vIGZpbmQgdGhhdCBpbm5lciBjb250YWluZXIgYmVmb3JlIG1vdmluZyBvbiB0byBmaW5kaW5nIHRoZSBwYXJlbnRcbiAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlXG4gICAgLy8gaXRzZWxmIGJlY2F1c2UgdGhlIGZpYmVycyBhcmUgY29uY2VwdHVhbGx5IGJldHdlZW4gdGhlIGNvbnRhaW5lclxuICAgIC8vIG5vZGUgYW5kIHRoZSBmaXJzdCBjaGlsZC4gSXQgaXNuJ3Qgc3Vycm91bmRpbmcgdGhlIGNvbnRhaW5lciBub2RlLlxuICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLlxuICAgIHRhcmdldEluc3QgPSBwYXJlbnROb2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldIHx8IHBhcmVudE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICBpZiAodGFyZ2V0SW5zdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyB3YXNuJ3QgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlIGV2ZW50LCB3ZSBtaWdodCBoYXZlXG4gICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZFxuICAgICAgLy8gYWxzbyBoYXZlIGJlZW4gbm9uLVJlYWN0IG5vZGVzLiBXZSBuZWVkIHRvIGFuc3dlciB3aGljaCBvbmUuXG4gICAgICAvLyBJZiB3ZSB0aGUgaW5zdGFuY2UgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiwgdGhlbiB0aGVyZSBjYW4ndCBiZVxuICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0XG4gICAgICAvLyBiYWlsb3V0LiBNb3N0IG9mIHRoZSB0aW1lLCB3aGVuIHBlb3BsZSBhZGQgbm9uLVJlYWN0IGNoaWxkcmVuIHRvXG4gICAgICAvLyB0aGUgdHJlZSwgaXQgaXMgdXNpbmcgYSByZWYgdG8gYSBjaGlsZC1sZXNzIERPTSBub2RlLlxuICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdFxuICAgICAgLy8gaGFzIGV2ZXIgZ29uZSBmcm9tIGhhdmluZyBjaGlsZHJlbiB0byBkZWxldGluZyB0aGVtIG9yIHZpY2UgdmVyc2FcbiAgICAgIC8vIGl0IHdvdWxkIGhhdmUgZGVsZXRlZCB0aGUgZGVoeWRyYXRlZCBib3VuZGFyeSBuZXN0ZWQgaW5zaWRlIGFscmVhZHkuXG4gICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodFxuICAgICAgLy8gaGF2ZSBvbmUgb24gdGhlIGFsdGVybmF0ZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGluIGNhc2UgdGhpcyB3YXMgYVxuICAgICAgLy8gcm9vdC5cbiAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBOZXh0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgbm9kZSB0aGF0IHNraXBwZWQgcGFzdCBpc1xuICAgICAgICAvLyBuZXN0ZWQgd2l0aGluIGEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbmQgaWYgc28sIHdoaWNoIG9uZS5cbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgZm91bmQgYSBzdXNwZW5zZSBpbnN0YW5jZS4gVGhhdCBtZWFucyB0aGF0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAvLyBoeWRyYXRlZCBpdCB5ZXQuIEV2ZW4gdGhvdWdoIHdlIGxlYXZlIHRoZSBjb21tZW50cyBpbiB0aGVcbiAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTVxuICAgICAgICAgIC8vIHRoYXQgY291bGQgYWxyZWFkeSBiZSBoeWRyYXRlZCwgd2Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGVtXG4gICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIHBhc3Mgc2luY2UgaWYgdGhlIHRhcmdldCBpcyBoeWRyYXRlZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuXG4gICAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBmaWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN1c3BlbnNlQ29tcG9uZW50XG4gICAgICAgICAgLy8gYXMgdGhlIGRlZXBlc3QgaW5zdGFuY2UuXG4gICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3VzcGVuc2VJbnN0O1xuICAgICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgZmluZCBhIEZpYmVyIG9uIHRoZSBjb21tZW50LCBpdCBtaWdodCBiZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGFcbiAgICAgICAgICAvLyBwYXJlbnQgYm91bmRhcnkgdGhhdCBoYXNuJ3QgYWJvdmUgdGhpcyBvbmUgc28gd2UgbmVlZCB0byBmaW5kXG4gICAgICAgICAgLy8gdGhlIG91dGVyIG1vc3QgdGhhdCBpcyBrbm93bi5cblxuXG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7IC8vIElmIHdlIGRvbid0IGZpbmQgb25lLCB0aGVuIHRoYXQgc2hvdWxkIG1lYW4gdGhhdCB0aGUgcGFyZW50XG4gICAgICAgICAgLy8gaG9zdCBjb21wb25lbnQgYWxzbyBoYXNuJ3QgaHlkcmF0ZWQgeWV0LiBXZSBjYW4gcmV0dXJuIGl0XG4gICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG5cbiAgaWYgKGluc3QpIHtcbiAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKCdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpO1xufVxuZnVuY3Rpb24gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVGaWJlclByb3BzKG5vZGUsIHByb3BzKSB7XG4gIG5vZGVbaW50ZXJuYWxQcm9wc0tleV0gPSBwcm9wcztcbn1cbmZ1bmN0aW9uIGdldEV2ZW50TGlzdGVuZXJTZXQobm9kZSkge1xuICB2YXIgZWxlbWVudExpc3RlbmVyU2V0ID0gbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldO1xuXG4gIGlmIChlbGVtZW50TGlzdGVuZXJTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XSA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50TGlzdGVuZXJTZXQ7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbHVlU3RhY2sgPSBbXTtcbnZhciBmaWJlclN0YWNrO1xuXG57XG4gIGZpYmVyU3RhY2sgPSBbXTtcbn1cblxudmFyIGluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNyZWF0ZUN1cnNvcihkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiBkZWZhdWx0VmFsdWVcbiAgfTtcbn1cblxuZnVuY3Rpb24gcG9wKGN1cnNvciwgZmliZXIpIHtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHBvcC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKGZpYmVyICE9PSBmaWJlclN0YWNrW2luZGV4XSkge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgRmliZXIgcG9wcGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleF07XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gbnVsbDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBudWxsO1xuICB9XG5cbiAgaW5kZXgtLTtcbn1cblxuZnVuY3Rpb24gcHVzaChjdXJzb3IsIHZhbHVlLCBmaWJlcikge1xuICBpbmRleCsrO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IGN1cnNvci5jdXJyZW50O1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IGZpYmVyO1xuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZTtcbn1cblxudmFyIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dDtcblxue1xuICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQgPSB7fTtcbn1cblxudmFyIGVtcHR5Q29udGV4dE9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlDb250ZXh0T2JqZWN0KTtcbn0gLy8gQSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgbWVyZ2VkIGNvbnRleHQgb2JqZWN0IG9uIHRoZSBzdGFjay5cblxuXG52YXIgY29udGV4dFN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGVtcHR5Q29udGV4dE9iamVjdCk7IC8vIEEgY3Vyc29yIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQuXG5cbnZhciBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGZhbHNlKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgY29udGV4dCBvYmplY3QgdGhhdCB3YXMgb24gdGhlIHN0YWNrLlxuLy8gV2UgdXNlIHRoaXMgdG8gZ2V0IGFjY2VzcyB0byB0aGUgcGFyZW50IGNvbnRleHQgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5XG4vLyBwdXNoZWQgdGhlIG5leHQgY29udGV4dCBwcm92aWRlciwgYW5kIG5vdyBuZWVkIHRvIG1lcmdlIHRoZWlyIGNvbnRleHRzLlxuXG52YXIgcHJldmlvdXNDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG5mdW5jdGlvbiBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyKSB7XG4gIHtcbiAgICBpZiAoZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyICYmIGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIC8vIElmIHRoZSBmaWJlciBpcyBhIGNvbnRleHQgcHJvdmlkZXIgaXRzZWxmLCB3aGVuIHdlIHJlYWQgaXRzIGNvbnRleHRcbiAgICAgIC8vIHdlIG1heSBoYXZlIGFscmVhZHkgcHVzaGVkIGl0cyBvd24gY2hpbGQgY29udGV4dCBvbiB0aGUgc3RhY2suIEEgY29udGV4dFxuICAgICAgLy8gcHJvdmlkZXIgc2hvdWxkIG5vdCBcInNlZVwiIGl0cyBvd24gY2hpbGQgY29udGV4dC4gVGhlcmVmb3JlIHdlIHJlYWQgdGhlXG4gICAgICAvLyBwcmV2aW91cyAocGFyZW50KSBjb250ZXh0IGluc3RlYWQgZm9yIGEgY29udGV4dCBwcm92aWRlci5cbiAgICAgIHJldHVybiBwcmV2aW91c0NvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBtYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9IHVubWFza2VkQ29udGV4dDtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dCA9IG1hc2tlZENvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IHR5cGUuY29udGV4dFR5cGVzO1xuXG4gICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gICAgfSAvLyBBdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyB1bm1hc2tlZCBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuICAgIC8vIEZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBjYWxscyB0byBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLlxuICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaW5maW5pdGUgbG9vcHMgaWYgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBjYWxscyBzZXRTdGF0ZS5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPT09IHVubWFza2VkQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjb250ZXh0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dFR5cGVzKSB7XG4gICAgICBjb250ZXh0W2tleV0gPSB1bm1hc2tlZENvbnRleHRba2V5XTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNvbnRleHRUeXBlcywgY29udGV4dCwgJ2NvbnRleHQnLCBuYW1lKTtcbiAgICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgICAvLyBDb250ZXh0IGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjbGFzcyBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkIHNvIGNoZWNrIGZvciBpbnN0YW5jZS5cblxuXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzQ29udGV4dENoYW5nZWQoKSB7XG4gIHtcbiAgICByZXR1cm4gZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKHR5cGUpIHtcbiAge1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG4gICAgcmV0dXJuIGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyLCBjb250ZXh0LCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIGlmIChjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZW1wdHlDb250ZXh0T2JqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29udGV4dCBmb3VuZCBvbiBzdGFjay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBjb250ZXh0LCBmaWJlcik7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCB0eXBlLCBwYXJlbnRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlczsgLy8gVE9ETyAoYnZhdWdobikgUmVwbGFjZSB0aGlzIGJlaGF2aW9yIHdpdGggYW4gaW52YXJpYW50KCkgaW4gdGhlIGZ1dHVyZS5cbiAgICAvLyBJdCBoYXMgb25seSBiZWVuIGFkZGVkIGluIEZpYmVyIHRvIG1hdGNoIHRoZSAodW5pbnRlbnRpb25hbCkgYmVoYXZpb3IgaW4gU3RhY2suXG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuICAgICAgY2hlY2tQcm9wVHlwZXMoY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkIGNvbnRleHQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCFpc0ZpYmVyTW91bnRlZChmaWJlcikgfHwgZmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBzdWJ0cmVlIHBhcmVudCB0byBiZSBhIG1vdW50ZWQgY2xhc3MgY29tcG9uZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIGRvIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuY29udGV4dDtcblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBDb21wb25lbnQgPSBub2RlLnR5cGU7XG5cbiAgICAgICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVuZXhwZWN0ZWQgZGV0YWNoZWQgc3VidHJlZSBwYXJlbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQ29uY3VycmVudFJvb3QgPSAxO1xuXG52YXIgc3luY1F1ZXVlID0gbnVsbDtcbnZhciBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSBmYWxzZTtcbnZhciBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG5mdW5jdGlvbiBzY2hlZHVsZVN5bmNDYWxsYmFjayhjYWxsYmFjaykge1xuICAvLyBQdXNoIHRoaXMgY2FsbGJhY2sgaW50byBhbiBpbnRlcm5hbCBxdWV1ZS4gV2UnbGwgZmx1c2ggdGhlc2UgZWl0aGVyIGluXG4gIC8vIHRoZSBuZXh0IHRpY2ssIG9yIGVhcmxpZXIgaWYgc29tZXRoaW5nIGNhbGxzIGBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlYC5cbiAgaWYgKHN5bmNRdWV1ZSA9PT0gbnVsbCkge1xuICAgIHN5bmNRdWV1ZSA9IFtjYWxsYmFja107XG4gIH0gZWxzZSB7XG4gICAgLy8gUHVzaCBvbnRvIGV4aXN0aW5nIHF1ZXVlLiBEb24ndCBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2sgYmVjYXVzZVxuICAgIC8vIHdlIGFscmVhZHkgc2NoZWR1bGVkIG9uZSB3aGVuIHdlIGNyZWF0ZWQgdGhlIHF1ZXVlLlxuICAgIHN5bmNRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVMZWdhY3lTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpIHtcbiAgLy8gT25seSBmbHVzaGVzIHRoZSBxdWV1ZSBpZiB0aGVyZSdzIGEgbGVnYWN5IHN5bmMgY2FsbGJhY2sgc2NoZWR1bGVkLlxuICAvLyBUT0RPOiBUaGVyZSdzIG9ubHkgYSBzaW5nbGUgdHlwZSBvZiBjYWxsYmFjazogcGVyZm9ybVN5bmNPbldvcmtPblJvb3QuIFNvXG4gIC8vIGl0IG1pZ2h0IG1ha2UgbW9yZSBzZW5zZSBmb3IgdGhlIHF1ZXVlIHRvIGJlIGEgbGlzdCBvZiByb290cyBpbnN0ZWFkIG9mIGFcbiAgLy8gbGlzdCBvZiBnZW5lcmljIGNhbGxiYWNrcy4gVGhlbiB3ZSBjYW4gaGF2ZSB0d286IG9uZSBmb3IgbGVnYWN5IHJvb3RzLCBvbmVcbiAgLy8gZm9yIGNvbmN1cnJlbnQgcm9vdHMuIEFuZCB0aGlzIG1ldGhvZCB3b3VsZCBvbmx5IGZsdXNoIHRoZSBsZWdhY3kgb25lcy5cbiAgaWYgKGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcykge1xuICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja3MoKSB7XG4gIGlmICghaXNGbHVzaGluZ1N5bmNRdWV1ZSAmJiBzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSB0cnVlO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcHJldmlvdXNVcGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc1N5bmMgPSB0cnVlO1xuICAgICAgdmFyIHF1ZXVlID0gc3luY1F1ZXVlOyAvLyBUT0RPOiBJcyB0aGlzIG5lY2Vzc2FyeSBhbnltb3JlPyBUaGUgb25seSB1c2VyIGNvZGUgdGhhdCBydW5zIGluIHRoaXNcbiAgICAgIC8vIHF1ZXVlIGlzIGluIHRoZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlcy5cblxuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2soaXNTeW5jKTtcbiAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgfVxuXG4gICAgICBzeW5jUXVldWUgPSBudWxsO1xuICAgICAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgIGlmIChzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgc3luY1F1ZXVlID0gc3luY1F1ZXVlLnNsaWNlKGkgKyAxKTtcbiAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2tcblxuXG4gICAgICBzY2hlZHVsZUNhbGxiYWNrKEltbWVkaWF0ZVByaW9yaXR5LCBmbHVzaFN5bmNDYWxsYmFja3MpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZVByaW9yaXR5KTtcbiAgICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVE9ETzogVXNlIHRoZSB1bmlmaWVkIGZpYmVyIHN0YWNrIG1vZHVsZSBpbnN0ZWFkIG9mIHRoaXMgbG9jYWwgb25lP1xuLy8gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgaXQgeWV0IHRvIGRlcmlzayB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgYmVjYXVzZVxuLy8gdGhlIHdheSB3ZSBwdXNoL3BvcCB0aGVzZSB2YWx1ZXMgaXMgYSBiaXQgdW51c3VhbC4gSWYgdGhlcmUncyBhIG1pc3Rha2UsIEknZFxuLy8gcmF0aGVyIHRoZSBpZHMgYmUgd3JvbmcgdGhhbiBjcmFzaCB0aGUgd2hvbGUgcmVjb25jaWxlci5cbnZhciBmb3JrU3RhY2sgPSBbXTtcbnZhciBmb3JrU3RhY2tJbmRleCA9IDA7XG52YXIgdHJlZUZvcmtQcm92aWRlciA9IG51bGw7XG52YXIgdHJlZUZvcmtDb3VudCA9IDA7XG52YXIgaWRTdGFjayA9IFtdO1xudmFyIGlkU3RhY2tJbmRleCA9IDA7XG52YXIgdHJlZUNvbnRleHRQcm92aWRlciA9IG51bGw7XG52YXIgdHJlZUNvbnRleHRJZCA9IDE7XG52YXIgdHJlZUNvbnRleHRPdmVyZmxvdyA9ICcnO1xuZnVuY3Rpb24gaXNGb3JrZWRDaGlsZCh3b3JrSW5Qcm9ncmVzcykge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmtlZCkgIT09IE5vRmxhZ3M7XG59XG5mdW5jdGlvbiBnZXRGb3Jrc0F0TGV2ZWwod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiB0cmVlRm9ya0NvdW50O1xufVxuZnVuY3Rpb24gZ2V0VHJlZUlkKCkge1xuICB2YXIgb3ZlcmZsb3cgPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICB2YXIgaWRXaXRoTGVhZGluZ0JpdCA9IHRyZWVDb250ZXh0SWQ7XG4gIHZhciBpZCA9IGlkV2l0aExlYWRpbmdCaXQgJiB+Z2V0TGVhZGluZ0JpdChpZFdpdGhMZWFkaW5nQml0KTtcbiAgcmV0dXJuIGlkLnRvU3RyaW5nKDMyKSArIG92ZXJmbG93O1xufVxuZnVuY3Rpb24gcHVzaFRyZWVGb3JrKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHdlIHJlY29uY2lsZSBhbiBhcnJheSAob3IgaXRlcmF0b3IpIG9mIGNoaWxkXG4gIC8vIGZpYmVycywgYmVjYXVzZSB0aGF0J3MgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgd2Uga25vdyBob3cgbWFueSBjaGlsZHJlbiBpblxuICAvLyB0aGUgd2hvbGUgc2V0IHdpdGhvdXQgZG9pbmcgZXh0cmEgd29yayBsYXRlciwgb3Igc3RvcmluZyBhZGR0aW9uYWxcbiAgLy8gaW5mb3JtYXRpb24gb24gdGhlIGZpYmVyLlxuICAvL1xuICAvLyBUaGF0J3Mgd2h5IHRoaXMgZnVuY3Rpb24gaXMgc2VwYXJhdGUgZnJvbSBwdXNoVHJlZUlkIOKAlCBpdCdzIGNhbGxlZCBkdXJpbmdcbiAgLy8gdGhlIHJlbmRlciBwaGFzZSBvZiB0aGUgZm9yayBwYXJlbnQsIG5vdCB0aGUgY2hpbGQsIHdoaWNoIGlzIHdoZXJlIHdlIHB1c2hcbiAgLy8gdGhlIG90aGVyIGNvbnRleHQgdmFsdWVzLlxuICAvL1xuICAvLyBJbiB0aGUgRml6eiBpbXBsZW1lbnRhdGlvbiB0aGlzIGlzIG11Y2ggc2ltcGxlciBiZWNhdXNlIHRoZSBjaGlsZCBpc1xuICAvLyByZW5kZXJlZCBpbiB0aGUgc2FtZSBjYWxsc3RhY2sgYXMgdGhlIHBhcmVudC5cbiAgLy9cbiAgLy8gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGp1c3QgYWRkIGEgYGZvcmtzYCBmaWVsZCB0byB0aGUgRmliZXIgdHlwZS4gSXQgd291bGRcbiAgLy8gbWFrZSB0aGlzIG1vZHVsZSBzaW1wbGVyLlxuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtDb3VudDtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtQcm92aWRlcjtcbiAgdHJlZUZvcmtQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB0cmVlRm9ya0NvdW50ID0gdG90YWxDaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4sIGluZGV4KSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0SWQ7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dFByb3ZpZGVyO1xuICB0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBiYXNlSWRXaXRoTGVhZGluZ0JpdCA9IHRyZWVDb250ZXh0SWQ7XG4gIHZhciBiYXNlT3ZlcmZsb3cgPSB0cmVlQ29udGV4dE92ZXJmbG93OyAvLyBUaGUgbGVmdG1vc3QgMSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSwgbm9uLWluY2x1c2l2ZS4gSXQncyBub3QgcGFydFxuICAvLyBvZiB0aGUgaWQ7IHdlIHVzZSBpdCB0byBhY2NvdW50IGZvciBsZWFkaW5nIDBzLlxuXG4gIHZhciBiYXNlTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKGJhc2VJZFdpdGhMZWFkaW5nQml0KSAtIDE7XG4gIHZhciBiYXNlSWQgPSBiYXNlSWRXaXRoTGVhZGluZ0JpdCAmIH4oMSA8PCBiYXNlTGVuZ3RoKTtcbiAgdmFyIHNsb3QgPSBpbmRleCArIDE7XG4gIHZhciBsZW5ndGggPSBnZXRCaXRMZW5ndGgodG90YWxDaGlsZHJlbikgKyBiYXNlTGVuZ3RoOyAvLyAzMCBpcyB0aGUgbWF4IGxlbmd0aCB3ZSBjYW4gc3RvcmUgd2l0aG91dCBvdmVyZmxvd2luZywgdGFraW5nIGludG9cbiAgLy8gY29uc2lkZXJhdGlvbiB0aGUgbGVhZGluZyAxIHdlIHVzZSB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuXG4gIGlmIChsZW5ndGggPiAzMCkge1xuICAgIC8vIFdlIG92ZXJmbG93ZWQgdGhlIGJpdHdpc2Utc2FmZSByYW5nZS4gRmFsbCBiYWNrIHRvIHNsb3dlciBhbGdvcml0aG0uXG4gICAgLy8gVGhpcyBicmFuY2ggYXNzdW1lcyB0aGUgbGVuZ3RoIG9mIHRoZSBiYXNlIGlkIGlzIGdyZWF0ZXIgdGhhbiA1OyBpdCB3b24ndFxuICAgIC8vIHdvcmsgZm9yIHNtYWxsZXIgaWRzLCBiZWNhdXNlIHlvdSBuZWVkIDUgYml0cyBwZXIgY2hhcmFjdGVyLlxuICAgIC8vXG4gICAgLy8gV2UgZW5jb2RlIHRoZSBpZCBpbiBtdWx0aXBsZSBzdGVwczogZmlyc3QgdGhlIGJhc2UgaWQsIHRoZW4gdGhlXG4gICAgLy8gcmVtYWluaW5nIGRpZ2l0cy5cbiAgICAvL1xuICAgIC8vIEVhY2ggNSBiaXQgc2VxdWVuY2UgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgYmFzZSAzMiBjaGFyYWN0ZXIuIFNvIGZvclxuICAgIC8vIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50IGlkIGlzIDIzIGJpdHMgbG9uZywgd2UgY2FuIGNvbnZlcnQgMjAgb2YgdGhvc2VcbiAgICAvLyBiaXRzIGludG8gYSBzdHJpbmcgb2YgNCBjaGFyYWN0ZXJzLCB3aXRoIDMgYml0cyBsZWZ0IG92ZXIuXG4gICAgLy9cbiAgICAvLyBGaXJzdCBjYWxjdWxhdGUgaG93IG1hbnkgYml0cyBpbiB0aGUgYmFzZSBpZCByZXByZXNlbnQgYSBjb21wbGV0ZVxuICAgIC8vIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuXG4gICAgdmFyIG51bWJlck9mT3ZlcmZsb3dCaXRzID0gYmFzZUxlbmd0aCAtIGJhc2VMZW5ndGggJSA1OyAvLyBUaGVuIGNyZWF0ZSBhIGJpdG1hc2sgdGhhdCBzZWxlY3RzIG9ubHkgdGhvc2UgYml0cy5cblxuICAgIHZhciBuZXdPdmVyZmxvd0JpdHMgPSAoMSA8PCBudW1iZXJPZk92ZXJmbG93Qml0cykgLSAxOyAvLyBTZWxlY3QgdGhlIGJpdHMsIGFuZCBjb252ZXJ0IHRoZW0gdG8gYSBiYXNlIDMyIHN0cmluZy5cblxuICAgIHZhciBuZXdPdmVyZmxvdyA9IChiYXNlSWQgJiBuZXdPdmVyZmxvd0JpdHMpLnRvU3RyaW5nKDMyKTsgLy8gTm93IHdlIGNhbiByZW1vdmUgdGhvc2UgYml0cyBmcm9tIHRoZSBiYXNlIGlkLlxuXG4gICAgdmFyIHJlc3RPZkJhc2VJZCA9IGJhc2VJZCA+PiBudW1iZXJPZk92ZXJmbG93Qml0cztcbiAgICB2YXIgcmVzdE9mQmFzZUxlbmd0aCA9IGJhc2VMZW5ndGggLSBudW1iZXJPZk92ZXJmbG93Qml0czsgLy8gRmluYWxseSwgZW5jb2RlIHRoZSByZXN0IG9mIHRoZSBiaXRzIHVzaW5nIHRoZSBub3JtYWwgYWxnb3JpdGhtLiBCZWNhdXNlXG4gICAgLy8gd2UgbWFkZSBtb3JlIHJvb20sIHRoaXMgdGltZSBpdCB3b24ndCBvdmVyZmxvdy5cblxuICAgIHZhciByZXN0T2ZMZW5ndGggPSBnZXRCaXRMZW5ndGgodG90YWxDaGlsZHJlbikgKyByZXN0T2ZCYXNlTGVuZ3RoO1xuICAgIHZhciByZXN0T2ZOZXdCaXRzID0gc2xvdCA8PCByZXN0T2ZCYXNlTGVuZ3RoO1xuICAgIHZhciBpZCA9IHJlc3RPZk5ld0JpdHMgfCByZXN0T2ZCYXNlSWQ7XG4gICAgdmFyIG92ZXJmbG93ID0gbmV3T3ZlcmZsb3cgKyBiYXNlT3ZlcmZsb3c7XG4gICAgdHJlZUNvbnRleHRJZCA9IDEgPDwgcmVzdE9mTGVuZ3RoIHwgaWQ7XG4gICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IG92ZXJmbG93O1xuICB9IGVsc2Uge1xuICAgIC8vIE5vcm1hbCBwYXRoXG4gICAgdmFyIG5ld0JpdHMgPSBzbG90IDw8IGJhc2VMZW5ndGg7XG5cbiAgICB2YXIgX2lkID0gbmV3Qml0cyB8IGJhc2VJZDtcblxuICAgIHZhciBfb3ZlcmZsb3cgPSBiYXNlT3ZlcmZsb3c7XG4gICAgdHJlZUNvbnRleHRJZCA9IDEgPDwgbGVuZ3RoIHwgX2lkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBfb3ZlcmZsb3c7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7IC8vIFRoaXMgY29tcG9uZW50IG1hdGVyaWFsaXplZCBhbiBpZC4gVGhpcyB3aWxsIGFmZmVjdCBhbnkgaWRzIHRoYXQgYXBwZWFyXG4gIC8vIGluIGl0cyBjaGlsZHJlbi5cblxuICB2YXIgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG51bWJlck9mRm9ya3MgPSAxO1xuICAgIHZhciBzbG90SW5kZXggPSAwO1xuICAgIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCaXRMZW5ndGgobnVtYmVyKSB7XG4gIHJldHVybiAzMiAtIGNsejMyKG51bWJlcik7XG59XG5cbmZ1bmN0aW9uIGdldExlYWRpbmdCaXQoaWQpIHtcbiAgcmV0dXJuIDEgPDwgZ2V0Qml0TGVuZ3RoKGlkKSAtIDE7XG59XG5cbmZ1bmN0aW9uIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlcy5cbiAgLy8gVGhpcyBpcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gb3RoZXIgY29udGV4dC1saWtlIG1vZHVsZXMgaW4gRmliZXJcbiAgLy8gYmVjYXVzZSB0aGUgc2FtZSBGaWJlciBtYXkgYXBwZWFyIG9uIHRoZSBzdGFjayBtdWx0aXBsZSB0aW1lcyBhbmQgZm9yXG4gIC8vIGRpZmZlcmVudCByZWFzb25zLiBXZSBoYXZlIHRvIGtlZXAgcG9wcGluZyB1bnRpbCB0aGUgd29yay1pbi1wcm9ncmVzcyBpc1xuICAvLyBubyBsb25nZXIgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUZvcmtQcm92aWRlcikge1xuICAgIHRyZWVGb3JrUHJvdmlkZXIgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gICAgdHJlZUZvcmtDb3VudCA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XTtcbiAgICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxuXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUNvbnRleHRQcm92aWRlcikge1xuICAgIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVDb250ZXh0SWQgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5kZWRUcmVlQ29udGV4dCgpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG5cbiAgaWYgKHRyZWVDb250ZXh0UHJvdmlkZXIgIT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRyZWVDb250ZXh0SWQsXG4gICAgICBvdmVyZmxvdzogdHJlZUNvbnRleHRPdmVyZmxvd1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVTdXNwZW5kZWRUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuZGVkQ29udGV4dCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRJZCA9IHN1c3BlbmRlZENvbnRleHQuaWQ7XG4gIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBzdXNwZW5kZWRDb250ZXh0Lm92ZXJmbG93O1xuICB0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZk5vdEh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmICghZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGJlIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgJyArICdhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBtYXkgaGF2ZSBiZWVuIGFuIGluc2VydGlvbiBvciBhIGh5ZHJhdGlvbi5cblxudmFyIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbnZhciBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbnZhciBpc0h5ZHJhdGluZyA9IGZhbHNlOyAvLyBUaGlzIGZsYWcgYWxsb3dzIGZvciB3YXJuaW5nIHN1cHJlc3Npb24gd2hlbiB3ZSBleHBlY3QgdGhlcmUgdG8gYmUgbWlzbWF0Y2hlc1xuLy8gZHVlIHRvIGVhcmxpZXIgbWlzbWF0Y2hlcyBvciBhIHN1c3BlbmRlZCBmaWJlci5cblxudmFyIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7IC8vIEh5ZHJhdGlvbiBlcnJvcnMgdGhhdCB3ZXJlIHRocm93biBpbnNpZGUgdGhpcyBib3VuZGFyeVxuXG52YXIgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcblxuZnVuY3Rpb24gd2FybklmSHlkcmF0aW5nKCkge1xuICB7XG4gICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICBlcnJvcignV2Ugc2hvdWxkIG5vdCBiZSBoeWRyYXRpbmcgaGVyZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYSBidWcuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCkge1xuICB7XG4gICAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBkaWRTdXNwZW5kT3JFcnJvcldoaWxlSHlkcmF0aW5nREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFN1c3BlbmRPckVycm9yREVWO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVudGVySHlkcmF0aW9uU3RhdGUoZmliZXIpIHtcblxuICB2YXIgcGFyZW50SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluQ29udGFpbmVyKHBhcmVudEluc3RhbmNlKTtcbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVlbnRlckh5ZHJhdGlvblN0YXRlRnJvbURlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyLCBzdXNwZW5zZUluc3RhbmNlLCB0cmVlQ29udGV4dCkge1xuXG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpblN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcblxuICBpZiAodHJlZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQoZmliZXIsIHRyZWVDb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBpbnN0YW5jZSkge1xuICB7XG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlKHJldHVybkZpYmVyLnR5cGUsIHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHMsIHJldHVybkZpYmVyLnN0YXRlTm9kZSwgaW5zdGFuY2UsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gcmV0dXJuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCwgaW5zdGFuY2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpO1xuICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGNyZWF0ZUZpYmVyRnJvbUhvc3RJbnN0YW5jZUZvckRlbGV0aW9uKCk7XG4gIGNoaWxkVG9EZWxldGUuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gIGNoaWxkVG9EZWxldGUucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTtcbiAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICB7XG4gICAgaWYgKGRpZFN1c3BlbmRPckVycm9yREVWKSB7XG4gICAgICAvLyBJbnNpZGUgYSBib3VuZGFyeSB0aGF0IGFscmVhZHkgc3VzcGVuZGVkLiBXZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nIHRoZVxuICAgICAgLy8gc2libGluZ3Mgb2YgYSBzdXNwZW5kZWQgbm9kZS4gVGhlIG1pc21hdGNoIG1heSBiZSBkdWUgdG8gdGhlIG1pc3NpbmdcbiAgICAgIC8vIGRhdGEsIHNvIGl0J3MgcHJvYmFibHkgYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgICAgdmFyIF9wcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90eXBlLCBfcHJvcHMsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcblxuICAgICAgICAgICAgICAgIHZhciBfaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90ZXh0LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIF9pc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9wYXJlbnRJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICAgICAgICBpZiAoX3BhcmVudEluc3RhbmNlICE9PSBudWxsKSBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgX3R5cGUyID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIF9wcm9wczIgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKF9wYXJlbnRJbnN0YW5jZSwgX3R5cGUyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHZhciBfdGV4dDIgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90ZXh0Mik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKSB7XG4gIGZpYmVyLmZsYWdzID0gZmliZXIuZmxhZ3MgJiB+SHlkcmF0aW5nIHwgUGxhY2VtZW50O1xuICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiB0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjYW5IeWRyYXRlSW5zdGFuY2UobmV4dEluc3RhbmNlLCB0eXBlKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChpbnN0YW5jZSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UobmV4dEluc3RhbmNlLCB0ZXh0KTtcblxuICAgICAgICBpZiAodGV4dEluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gdGV4dEluc3RhbmNlO1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFRleHQgSW5zdGFuY2VzIGRvbid0IGhhdmUgY2hpbGRyZW4gc28gdGhlcmUncyBub3RoaW5nIHRvIGh5ZHJhdGUuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gY2FuSHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UobmV4dEluc3RhbmNlKTtcblxuICAgICAgICBpZiAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0ge1xuICAgICAgICAgICAgZGVoeWRyYXRlZDogc3VzcGVuc2VJbnN0YW5jZSxcbiAgICAgICAgICAgIHRyZWVDb250ZXh0OiBnZXRTdXNwZW5kZWRUcmVlQ29udGV4dCgpLFxuICAgICAgICAgICAgcmV0cnlMYW5lOiBPZmZzY3JlZW5MYW5lXG4gICAgICAgICAgfTtcbiAgICAgICAgICBmaWJlci5tZW1vaXplZFN0YXRlID0gc3VzcGVuc2VTdGF0ZTsgLy8gU3RvcmUgdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQgYXMgYSBjaGlsZCBmaWJlci5cbiAgICAgICAgICAvLyBUaGlzIHNpbXBsaWZpZXMgdGhlIGNvZGUgZm9yIGdldEhvc3RTaWJsaW5nIGFuZCBkZWxldGluZyBub2RlcyxcbiAgICAgICAgICAvLyBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgdG8gY29uc2lkZXIgYWxsIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gICAgICAgICAgLy8gY2hlY2sgaWYgdGhleSdyZSBkZWh5ZHJhdGVkIG9uZXMgb3Igbm90LlxuXG4gICAgICAgICAgdmFyIGRlaHlkcmF0ZWRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbURlaHlkcmF0ZWRGcmFnbWVudChzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgICBkZWh5ZHJhdGVkRnJhZ21lbnQucmV0dXJuID0gZmliZXI7XG4gICAgICAgICAgZmliZXIuY2hpbGQgPSBkZWh5ZHJhdGVkRnJhZ21lbnQ7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjsgLy8gV2hpbGUgYSBTdXNwZW5zZSBJbnN0YW5jZSBkb2VzIGhhdmUgY2hpbGRyZW4sIHdlIHdvbid0IHN0ZXAgaW50b1xuICAgICAgICAgIC8vIGl0IGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSW5zdGVhZCwgd2UnbGwgcmVlbnRlciBpdCBsYXRlci5cblxuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSB7XG4gIHJldHVybiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmIChmaWJlci5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzO1xufVxuXG5mdW5jdGlvbiB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goZmliZXIpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdIeWRyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIGluaXRpYWwgVUkgZG9lcyBub3QgbWF0Y2ggd2hhdCB3YXMgJyArICdyZW5kZXJlZCBvbiB0aGUgc2VydmVyLicpO1xufVxuXG5mdW5jdGlvbiB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZShmaWJlcikge1xuICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgaWYgKCFuZXh0SW5zdGFuY2UpIHtcbiAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTtcbiAgICB9IC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG5cblxuICAgIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UgPSBuZXh0SW5zdGFuY2U7XG5cbiAgaWYgKCF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBJZiB3ZSBjYW4ndCBoeWRyYXRlIHRoaXMgaW5zdGFuY2UgbGV0J3MgdHJ5IHRoZSBuZXh0IG9uZS5cbiAgICAvLyBXZSB1c2UgdGhpcyBhcyBhIGhldXJpc3RpYy4gSXQncyBiYXNlZCBvbiBpbnR1aXRpb24gYW5kIG5vdCBkYXRhIHNvIGl0XG4gICAgLy8gbWlnaHQgYmUgZmxhd2VkIG9yIHVubmVjZXNzYXJ5LlxuXG5cbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gICAgdmFyIHByZXZIeWRyYXRpb25QYXJlbnRGaWJlciA9IGh5ZHJhdGlvblBhcmVudEZpYmVyO1xuXG4gICAgaWYgKCFuZXh0SW5zdGFuY2UgfHwgIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG4gICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIG1hdGNoZWQgdGhlIG5leHQgb25lLCB3ZSdsbCBub3cgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IG9uZSB3YXNcbiAgICAvLyBzdXBlcmZsdW91cyBhbmQgd2UnbGwgZGVsZXRlIGl0LiBTaW5jZSB3ZSBjYW4ndCBlYWdlcmx5IGRlbGV0ZSBpdFxuICAgIC8vIHdlJ2xsIGhhdmUgdG8gc2NoZWR1bGUgYSBkZWxldGlvbi4gVG8gZG8gdGhhdCwgdGhpcyBub2RlIG5lZWRzIGEgZHVtbXlcbiAgICAvLyBmaWJlciBhc3NvY2lhdGVkIHdpdGggaXQuXG5cblxuICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIsIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2UoZmliZXIsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcblxuICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRXYXJuSWZNaXNtYXRjaERldiA9ICFkaWRTdXNwZW5kT3JFcnJvckRFVjtcbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGZpYmVyLCBzaG91bGRXYXJuSWZNaXNtYXRjaERldik7IC8vIFRPRE86IFR5cGUgdGhpcyBzcGVjaWZpYyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50LlxuXG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLlxuXG4gIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHRleHRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIHRleHRDb250ZW50ID0gZmliZXIubWVtb2l6ZWRQcm9wcztcbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGh5ZHJhdGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgZmliZXIpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBXZSBhc3N1bWUgdGhhdCBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSBpcyBjYWxsZWQgaW4gYSBjb250ZXh0IHdoZXJlIHRoZVxuICAgIC8vIGh5ZHJhdGlvbiBwYXJlbnQgaXMgdGhlIHBhcmVudCBob3N0IGNvbXBvbmVudCBvZiB0aGlzIGhvc3QgdGV4dC5cbiAgICB2YXIgcmV0dXJuRmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUyID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZTIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0U3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgaHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUgIT09IG51bGwgPyBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgOiBudWxsO1xuXG4gIGlmICghc3VzcGVuc2VJbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcikge1xuICB2YXIgcGFyZW50ID0gZmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwgJiYgcGFyZW50LnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBwYXJlbnQudGFnICE9PSBIb3N0Um9vdCAmJiBwYXJlbnQudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHBhcmVudDtcbn1cblxuZnVuY3Rpb24gcG9wSHlkcmF0aW9uU3RhdGUoZmliZXIpIHtcblxuICBpZiAoZmliZXIgIT09IGh5ZHJhdGlvblBhcmVudEZpYmVyKSB7XG4gICAgLy8gV2UncmUgZGVlcGVyIHRoYW4gdGhlIGN1cnJlbnQgaHlkcmF0aW9uIGNvbnRleHQsIGluc2lkZSBhbiBpbnNlcnRlZFxuICAgIC8vIHRyZWUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIC8vIElmIHdlJ3JlIG5vdCBjdXJyZW50bHkgaHlkcmF0aW5nIGJ1dCB3ZSdyZSBpbiBhIGh5ZHJhdGlvbiBjb250ZXh0LCB0aGVuXG4gICAgLy8gd2Ugd2VyZSBhbiBpbnNlcnRpb24gYW5kIG5vdyBuZWVkIHRvIHBvcCB1cCByZWVudGVyIGh5ZHJhdGlvbiBvZiBvdXJcbiAgICAvLyBzaWJsaW5ncy5cbiAgICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcbiAgICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIElmIHdlIGhhdmUgYW55IHJlbWFpbmluZyBoeWRyYXRhYmxlIG5vZGVzLCB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGVtIG5vdy5cbiAgLy8gV2Ugb25seSBkbyB0aGlzIGRlZXBlciB0aGFuIGhlYWQgYW5kIGJvZHkgc2luY2UgdGhleSB0ZW5kIHRvIGhhdmUgcmFuZG9tXG4gIC8vIG90aGVyIG5vZGVzIGluIHRoZW0uIFdlIGFsc28gaWdub3JlIGNvbXBvbmVudHMgd2l0aCBwdXJlIHRleHQgY29udGVudCBpblxuICAvLyBzaWRlIG9mIHRoZW0uIFdlIGFsc28gZG9uJ3QgZGVsZXRlIGFueXRoaW5nIGluc2lkZSB0aGUgcm9vdCBjb250YWluZXIuXG5cblxuICBpZiAoZmliZXIudGFnICE9PSBIb3N0Um9vdCAmJiAoZmliZXIudGFnICE9PSBIb3N0Q29tcG9uZW50IHx8IHNob3VsZERlbGV0ZVVuaHlkcmF0ZWRUYWlsSW5zdGFuY2VzKGZpYmVyLnR5cGUpICYmICFzaG91bGRTZXRUZXh0Q29udGVudChmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzKSkpIHtcbiAgICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICAgIGlmIChuZXh0SW5zdGFuY2UpIHtcbiAgICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgICB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKGZpYmVyKTtcbiAgICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgICAgICAgZGVsZXRlSHlkcmF0YWJsZUluc3RhbmNlKGZpYmVyLCBuZXh0SW5zdGFuY2UpO1xuICAgICAgICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcik7XG4gIH0gZWxzZSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGh5ZHJhdGlvblBhcmVudEZpYmVyID8gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpYmVyLnN0YXRlTm9kZSkgOiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZyAmJiBuZXh0SHlkcmF0YWJsZUluc3RhbmNlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKGZpYmVyKSB7XG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIHdoaWxlIChuZXh0SW5zdGFuY2UpIHtcbiAgICB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKGZpYmVyLCBuZXh0SW5zdGFuY2UpO1xuICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0SHlkcmF0aW9uU3RhdGUoKSB7XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKSB7XG4gIGlmIChoeWRyYXRpb25FcnJvcnMgIT09IG51bGwpIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIGEgZm9yY2VkIGNsaWVudCByZW5kZXIuIFRoZSBlcnJvcnMgdGhhdCBvY2N1cnJlZFxuICAgIC8vIGR1cmluZyB0aGUgaHlkcmF0aW9uIGF0dGVtcHQgYXJlIG5vdyByZWNvdmVyZWQuIFdlIHdpbGwgbG9nIHRoZW0gaW5cbiAgICAvLyBjb21taXQgcGhhc2UsIG9uY2UgdGhlIGVudGlyZSB0cmVlIGhhcyBmaW5pc2hlZC5cbiAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGh5ZHJhdGlvbkVycm9ycyk7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJc0h5ZHJhdGluZygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUh5ZHJhdGlvbkVycm9yKGVycm9yKSB7XG4gIGlmIChoeWRyYXRpb25FcnJvcnMgPT09IG51bGwpIHtcbiAgICBoeWRyYXRpb25FcnJvcnMgPSBbZXJyb3JdO1xuICB9IGVsc2Uge1xuICAgIGh5ZHJhdGlvbkVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIE5vVHJhbnNpdGlvbiA9IG51bGw7XG5mdW5jdGlvbiByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSB7XG4gIHJldHVybiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb247XG59XG5cbnZhciBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncyA9IHtcbiAgcmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LFxuICBmbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKCkge30sXG4gIHJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKCkge30sXG4gIGRpc2NhcmRQZW5kaW5nV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9XG59O1xuXG57XG4gIHZhciBmaW5kU3RyaWN0Um9vdCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgIHZhciBtYXliZVN0cmljdFJvb3QgPSBudWxsO1xuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgbWF5YmVTdHJpY3RSb290ID0gbm9kZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBtYXliZVN0cmljdFJvb3Q7XG4gIH07XG5cbiAgdmFyIHNldFRvU29ydGVkU3RyaW5nID0gZnVuY3Rpb24gKHNldCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoKS5qb2luKCcsICcpO1xuICB9O1xuXG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIC8vIERlZHVwZSBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG4gICAgaWYgKGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMuXG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSBkbyBhbiBpbml0aWFsIHBhc3MgdG8gZ2F0aGVyIGNvbXBvbmVudCBuYW1lc1xuICAgIHZhciBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfSAvLyBGaW5hbGx5LCB3ZSBmbHVzaCBhbGwgdGhlIHdhcm5pbmdzXG4gICAgLy8gVU5TQUZFXyBvbmVzIGJlZm9yZSB0aGUgZGVwcmVjYXRlZCBvbmVzLCBzaW5jZSB0aGV5J2xsIGJlICdsb3VkZXInXG5cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBzb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCBcIiArICdyZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMiA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczIpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxNb3VudCBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxNb3VudCB0byBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMzKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNCA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgcmVmYWN0b3IgeW91ciBcIiArICdjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczUgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsVXBkYXRlIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIHZhciBzdHJpY3RSb290ID0gZmluZFN0cmljdFJvb3QoZmliZXIpO1xuXG4gICAgaWYgKHN0cmljdFJvb3QgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cblxuXG4gICAgaWYgKGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhcm5pbmdzRm9yUm9vdCA9IHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5nZXQoc3RyaWN0Um9vdCk7XG5cbiAgICBpZiAoZmliZXIudHlwZS5jb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBmaWJlci50eXBlLmNoaWxkQ29udGV4dFR5cGVzICE9IG51bGwgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHdhcm5pbmdzRm9yUm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhcm5pbmdzRm9yUm9vdCA9IFtdO1xuICAgICAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuc2V0KHN0cmljdFJvb3QsIHdhcm5pbmdzRm9yUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5pbmdzRm9yUm9vdC5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZm9yRWFjaChmdW5jdGlvbiAoZmliZXJBcnJheSwgc3RyaWN0Um9vdCkge1xuICAgICAgaWYgKGZpYmVyQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpcnN0RmliZXIgPSBmaWJlckFycmF5WzBdO1xuICAgICAgdmFyIHVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgZmliZXJBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcodW5pcXVlTmFtZXMpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmlyc3RGaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0xlZ2FjeSBjb250ZXh0IEFQSSBoYXMgYmVlbiBkZXRlY3RlZCB3aXRoaW4gYSBzdHJpY3QtbW9kZSB0cmVlLicgKyAnXFxuXFxuVGhlIG9sZCBBUEkgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gYWxsIDE2LnggcmVsZWFzZXMsIGJ1dCBhcHBsaWNhdGlvbnMgJyArICd1c2luZyBpdCBzaG91bGQgbWlncmF0ZSB0byB0aGUgbmV3IHZlcnNpb24uJyArICdcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9sZWdhY3ktY29udGV4dCcsIHNvcnRlZE5hbWVzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZGlzY2FyZFBlbmRpbmdXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpO1xuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TWFwcztcbnZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nO1xudmFyIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZztcblxudmFyIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge307XG5cbntcbiAgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbiAgLyoqXG4gICAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAgICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gICAqIHVwZGF0ZXMuXG4gICAqL1xuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmcgPSB7fTtcblxuICB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHtcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hpbGQuX3N0b3JlIHx8IGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgfHwgY2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNoaWxkLl9zdG9yZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QgQ29tcG9uZW50IGluIHdhcm5Gb3JNaXNzaW5nS2V5IHNob3VsZCBoYXZlIGEgX3N0b3JlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0tleVVzZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlICcgKyAnXCJrZXlcIiBwcm9wLiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgJyArICdtb3JlIGluZm9ybWF0aW9uLicpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBpc1JlYWN0Q2xhc3ModHlwZSkge1xuICByZXR1cm4gdHlwZS5wcm90b3R5cGUgJiYgdHlwZS5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudDtcbn1cblxuZnVuY3Rpb24gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KSB7XG4gIHZhciBtaXhlZFJlZiA9IGVsZW1lbnQucmVmO1xuXG4gIGlmIChtaXhlZFJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnb2JqZWN0Jykge1xuICAgIHtcbiAgICAgIC8vIFRPRE86IENsZWFuIHRoaXMgdXAgb25jZSB3ZSB0dXJuIG9uIHRoZSBzdHJpbmcgcmVmIHdhcm5pbmcgZm9yXG4gICAgICAvLyBldmVyeW9uZSwgYmVjYXVzZSB0aGUgc3RyaWN0IG1vZGUgY2FzZSB3aWxsIG5vIGxvbmdlciBiZSByZWxldmFudFxuICAgICAgaWYgKChyZXR1cm5GaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSB8fCB3YXJuQWJvdXRTdHJpbmdSZWZzKSAmJiAvLyBXZSB3YXJuIGluIFJlYWN0RWxlbWVudC5qcyBpZiBvd25lciBhbmQgc2VsZiBhcmUgZXF1YWwgZm9yIHN0cmluZyByZWZzXG4gICAgICAvLyBiZWNhdXNlIHRoZXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvblxuICAgICAgLy8gdXNpbmcgYSBjb2RlbW9kLiBUaGVyZWZvcmUsIHdlIGRvbid0IGhhdmUgdG8gd2FybiBhYm91dCBzdHJpbmcgcmVmcyBhZ2Fpbi5cbiAgICAgICEoZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fc2VsZiAmJiBlbGVtZW50Ll9vd25lci5zdGF0ZU5vZGUgIT09IGVsZW1lbnQuX3NlbGYpICYmIC8vIFdpbGwgYWxyZWFkeSB0aHJvdyB3aXRoIFwiRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgaGF2ZSBzdHJpbmcgcmVmc1wiXG4gICAgICAhKGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyLnRhZyAhPT0gQ2xhc3NDb21wb25lbnQpICYmIC8vIFdpbGwgYWxyZWFkeSB3YXJuIHdpdGggXCJGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzXCJcbiAgICAgICEodHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNSZWFjdENsYXNzKGVsZW1lbnQudHlwZSkpICYmIC8vIFdpbGwgYWxyZWFkeSB0aHJvdyB3aXRoIFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoc29tZVN0cmluZ1JlZikgYnV0IG5vIG93bmVyIHdhcyBzZXRcIlxuICAgICAgZWxlbWVudC5fb3duZXIpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlcnJvcignQ29tcG9uZW50IFwiJXNcIiBjb250YWlucyB0aGUgc3RyaW5nIHJlZiBcIiVzXCIuIFN1cHBvcnQgZm9yIHN0cmluZyByZWZzICcgKyAnd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIFdlIHJlY29tbWVuZCB1c2luZyAnICsgJ3VzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgbWl4ZWRSZWYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuX293bmVyKSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBpbnN0O1xuXG4gICAgICBpZiAob3duZXIpIHtcbiAgICAgICAgdmFyIG93bmVyRmliZXIgPSBvd25lcjtcblxuICAgICAgICBpZiAob3duZXJGaWJlci50YWcgIT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBoYXZlIHN0cmluZyByZWZzLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5zdCA9IG93bmVyRmliZXIuc3RhdGVOb2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiBcIiArIG1peGVkUmVmICsgXCIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIFwiICsgJ2J1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9IC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3Qgc28gRmxvdyBrbm93cyBpdCB3b24ndCBjaGFuZ2UgaW4gdGhlIGNsb3N1cmVcblxuXG4gICAgICB2YXIgcmVzb2x2ZWRJbnN0ID0gaW5zdDtcblxuICAgICAge1xuICAgICAgICBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbihtaXhlZFJlZiwgJ3JlZicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjsgLy8gQ2hlY2sgaWYgcHJldmlvdXMgc3RyaW5nIHJlZiBtYXRjaGVzIG5ldyBzdHJpbmcgcmVmXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSBudWxsICYmIHR5cGVvZiBjdXJyZW50LnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBjdXJyZW50LnJlZi5fc3RyaW5nUmVmID09PSBzdHJpbmdSZWYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVmO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gcmVzb2x2ZWRJbnN0LnJlZnM7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgZGVsZXRlIHJlZnNbc3RyaW5nUmVmXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZzW3N0cmluZ1JlZl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmVmLl9zdHJpbmdSZWYgPSBzdHJpbmdSZWY7XG4gICAgICByZXR1cm4gcmVmO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIG1peGVkUmVmICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhIHN0cmluZywgYW4gb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZVJlZigpLCBvciBudWxsLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVsZW1lbnQuX293bmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgcmVmIHdhcyBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKFwiICsgbWl4ZWRSZWYgKyBcIikgYnV0IG5vIG93bmVyIHdhcyBzZXQuIFRoaXMgY291bGQgaGFwcGVuIGZvciBvbmUgb2ZcIiArICcgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBmdW5jdGlvbiBjb21wb25lbnRcXG4nICsgXCIyLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnQncyByZW5kZXIgbWV0aG9kXFxuXCIgKyAnMy4gWW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWZzLW11c3QtaGF2ZS1vd25lciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWl4ZWRSZWY7XG59XG5cbmZ1bmN0aW9uIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpIHtcbiAgdmFyIGNoaWxkU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ld0NoaWxkKTtcbiAgdGhyb3cgbmV3IEVycm9yKFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChjaGlsZFN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKG5ld0NoaWxkKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRTdHJpbmcpICsgXCIpLiBcIiArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZC4nKTtcbn1cblxuZnVuY3Rpb24gd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRnVuY3Rpb25zIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZC4gVGhpcyBtYXkgaGFwcGVuIGlmICcgKyAneW91IHJldHVybiBhIENvbXBvbmVudCBpbnN0ZWFkIG9mIDxDb21wb25lbnQgLz4gZnJvbSByZW5kZXIuICcgKyAnT3IgbWF5YmUgeW91IG1lYW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiByZXR1cm4gaXQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUxhenkobGF6eVR5cGUpIHtcbiAgdmFyIHBheWxvYWQgPSBsYXp5VHlwZS5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5VHlwZS5faW5pdDtcbiAgcmV0dXJuIGluaXQocGF5bG9hZCk7XG59IC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBleGlzdHMgYmVjYXVzZSBJIGV4cGVjdCB0byBjbG9uZSB0aGUgY29kZSBpbiBlYWNoIHBhdGhcbi8vIHRvIGJlIGFibGUgdG8gb3B0aW1pemUgZWFjaCBwYXRoIGluZGl2aWR1YWxseSBieSBicmFuY2hpbmcgZWFybHkuIFRoaXMgbmVlZHNcbi8vIGEgY29tcGlsZXIgb3Igd2UgY2FuIGRvIGl0IG1hbnVhbGx5LiBIZWxwZXJzIHRoYXQgZG9uJ3QgbmVlZCB0aGlzIGJyYW5jaGluZ1xuLy8gbGl2ZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24uXG5cblxuZnVuY3Rpb24gQ2hpbGRSZWNvbmNpbGVyKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCkge1xuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8gVE9ETzogRm9yIHRoZSBzaG91bGRDbG9uZSBjYXNlLCB0aGlzIGNvdWxkIGJlIG1pY3JvLW9wdGltaXplZCBhIGJpdCBieVxuICAgIC8vIGFzc3VtaW5nIHRoYXQgYWZ0ZXIgdGhlIGZpcnN0IGNoaWxkIHdlJ3ZlIGFscmVhZHkgYWRkZWQgZXZlcnl0aGluZy5cblxuXG4gICAgdmFyIGNoaWxkVG9EZWxldGUgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZFRvRGVsZXRlICE9PSBudWxsKSB7XG4gICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICBjaGlsZFRvRGVsZXRlID0gY2hpbGRUb0RlbGV0ZS5zaWJsaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgLy8gQWRkIHRoZSByZW1haW5pbmcgY2hpbGRyZW4gdG8gYSB0ZW1wb3JhcnkgbWFwIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlbSBieVxuICAgIC8vIGtleXMgcXVpY2tseS4gSW1wbGljaXQgKG51bGwpIGtleXMgZ2V0IGFkZGVkIHRvIHRoaXMgc2V0IHdpdGggdGhlaXIgaW5kZXhcbiAgICAvLyBpbnN0ZWFkLlxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgIHZhciBleGlzdGluZ0NoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoZXhpc3RpbmdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGV4aXN0aW5nQ2hpbGQua2V5ICE9PSBudWxsKSB7XG4gICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGV4aXN0aW5nQ2hpbGQua2V5LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGV4aXN0aW5nQ2hpbGQuaW5kZXgsIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBleGlzdGluZ0NoaWxkID0gZXhpc3RpbmdDaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBleGlzdGluZ0NoaWxkcmVuO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlRmliZXIoZmliZXIsIHBlbmRpbmdQcm9wcykge1xuICAgIC8vIFdlIGN1cnJlbnRseSBzZXQgc2libGluZyB0byBudWxsIGFuZCBpbmRleCB0byAwIGhlcmUgYmVjYXVzZSBpdCBpcyBlYXN5XG4gICAgLy8gdG8gZm9yZ2V0IHRvIGRvIGJlZm9yZSByZXR1cm5pbmcgaXQuIEUuZy4gZm9yIHRoZSBzaW5nbGUgY2hpbGQgY2FzZS5cbiAgICB2YXIgY2xvbmUgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhmaWJlciwgcGVuZGluZ1Byb3BzKTtcbiAgICBjbG9uZS5pbmRleCA9IDA7XG4gICAgY2xvbmUuc2libGluZyA9IG51bGw7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgZnVuY3Rpb24gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJbmRleCkge1xuICAgIG5ld0ZpYmVyLmluZGV4ID0gbmV3SW5kZXg7XG5cbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIER1cmluZyBoeWRyYXRpb24sIHRoZSB1c2VJZCBhbGdvcml0aG0gbmVlZHMgdG8ga25vdyB3aGljaCBmaWJlcnMgYXJlXG4gICAgICAvLyBwYXJ0IG9mIGEgbGlzdCBvZiBjaGlsZHJlbiAoYXJyYXlzLCBpdGVyYXRvcnMpLlxuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gRm9ya2VkO1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudCA9IG5ld0ZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgb2xkSW5kZXggPSBjdXJyZW50LmluZGV4O1xuXG4gICAgICBpZiAob2xkSW5kZXggPCBsYXN0UGxhY2VkSW5kZXgpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIG1vdmUuXG4gICAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXRlbSBjYW4gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgcmV0dXJuIG9sZEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbi5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGxhY2VTaW5nbGVDaGlsZChuZXdGaWJlcikge1xuICAgIC8vIFRoaXMgaXMgc2ltcGxlciBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLiBXZSBvbmx5IG5lZWQgdG8gZG8gYVxuICAgIC8vIHBsYWNlbWVudCBmb3IgaW5zZXJ0aW5nIG5ldyBjaGlsZHJlbi5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cyAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmliZXI7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudCwgdGV4dENvbnRlbnQsIGxhbmVzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHRleHRDb250ZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQsIGxhbmVzKSB7XG4gICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKGVsZW1lbnRUeXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIGxhbmVzLCBlbGVtZW50LmtleSk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChjdXJyZW50LmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSB8fCAoIC8vIEtlZXAgdGhpcyBjaGVjayBpbmxpbmUgc28gaXQgb25seSBydW5zIG9uIHRoZSBmYWxzZSBwYXRoOlxuICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhjdXJyZW50LCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLlxuICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBIb3QgUmVsb2FkaW5nIGNoZWNrIGFib3ZlLFxuICAgICAgLy8gYmVjYXVzZSBob3QgcmVsb2FkaW5nIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gcHJvZCBiZWNhdXNlXG4gICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuXG4gICAgICB0eXBlb2YgZWxlbWVudFR5cGUgPT09ICdvYmplY3QnICYmIGVsZW1lbnRUeXBlICE9PSBudWxsICYmIGVsZW1lbnRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiYgcmVzb2x2ZUxhenkoZWxlbWVudFR5cGUpID09PSBjdXJyZW50LnR5cGUpIHtcbiAgICAgICAgLy8gTW92ZSBiYXNlZCBvbiBpbmRleFxuICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKTtcbiAgICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgfVxuICAgIH0gLy8gSW5zZXJ0XG5cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFBvcnRhbCB8fCBjdXJyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fCBjdXJyZW50LnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiAhPT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZnJhZ21lbnQsIGxhbmVzLCBrZXkpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gRnJhZ21lbnQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmcmFnbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZnJhZ21lbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZFxuICAgICAgLy8gd2UgY2FuIGNvbnRpbnVlIHRvIHJlcGxhY2UgaXQgd2l0aG91dCBhYm9ydGluZyBldmVuIGlmIGl0IGlzIG5vdCBhIHRleHRcbiAgICAgIC8vIG5vZGUuXG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQoJycgKyBuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBudWxsLCBuZXdDaGlsZCk7XG4gICAgICAgICAgICBfY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQyID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgICAgICAgIF9jcmVhdGVkMi5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlZDI7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9jcmVhdGVkMyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgbnVsbCk7XG5cbiAgICAgICAgX2NyZWF0ZWQzLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICByZXR1cm4gX2NyZWF0ZWQzO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBmaWJlciBpZiB0aGUga2V5cyBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiBudWxsLlxuICAgIHZhciBrZXkgPSBvbGRGaWJlciAhPT0gbnVsbCA/IG9sZEZpYmVyLmtleSA6IG51bGw7XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBvbGRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yXG4gICAgICAvLyBuZXcgbm9kZSBmb3IgdGhlIGtleS4gSWYgYm90aCBhcmUgdGV4dCBub2RlcywgdGhleSBtYXRjaC5cbiAgICAgIHZhciBtYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX21hdGNoZWRGaWJlcjIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdDaGlsZC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXkpIHx8IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIzID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjMsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogV2FybnMgaWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgb3IgbWlzc2luZyBrZXlcbiAgICovXG5cblxuICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcgfHwgY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGtub3duS2V5cztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCwgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIHZhciBrZXkgPSBjaGlsZC5rZXk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChrbm93bktleXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGtub3duS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgha25vd25LZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvcignRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCBgJXNgLiAnICsgJ0tleXMgc2hvdWxkIGJlIHVuaXF1ZSBzbyB0aGF0IGNvbXBvbmVudHMgbWFpbnRhaW4gdGhlaXIgaWRlbnRpdHkgJyArICdhY3Jvc3MgdXBkYXRlcy4gTm9uLXVuaXF1ZSBrZXlzIG1heSBjYXVzZSBjaGlsZHJlbiB0byBiZSAnICsgJ2R1cGxpY2F0ZWQgYW5kL29yIG9taXR0ZWQg4oCUIHRoZSBiZWhhdmlvciBpcyB1bnN1cHBvcnRlZCBhbmQgJyArICdjb3VsZCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi4nLCBrZXkpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBjaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGNoaWxkLl9pbml0O1xuICAgICAgICAgIHdhcm5PbkludmFsaWRLZXkoaW5pdChwYXlsb2FkKSwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtub3duS2V5cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbiwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGFsZ29yaXRobSBjYW4ndCBvcHRpbWl6ZSBieSBzZWFyY2hpbmcgZnJvbSBib3RoIGVuZHMgc2luY2Ugd2VcbiAgICAvLyBkb24ndCBoYXZlIGJhY2twb2ludGVycyBvbiBmaWJlcnMuIEknbSB0cnlpbmcgdG8gc2VlIGhvdyBmYXIgd2UgY2FuIGdldFxuICAgIC8vIHdpdGggdGhhdCBtb2RlbC4gSWYgaXQgZW5kcyB1cCBub3QgYmVpbmcgd29ydGggdGhlIHRyYWRlb2Zmcywgd2UgY2FuXG4gICAgLy8gYWRkIGl0IGxhdGVyLlxuICAgIC8vIEV2ZW4gd2l0aCBhIHR3byBlbmRlZCBvcHRpbWl6YXRpb24sIHdlJ2Qgd2FudCB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhc2VcbiAgICAvLyB3aGVyZSB0aGVyZSBhcmUgZmV3IGNoYW5nZXMgYW5kIGJydXRlIGZvcmNlIHRoZSBjb21wYXJpc29uIGluc3RlYWQgb2ZcbiAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW5cbiAgICAvLyBmb3J3YXJkLW9ubHkgbW9kZSBhbmQgb25seSBnbyBmb3IgdGhlIE1hcCBvbmNlIHdlIG5vdGljZSB0aGF0IHdlIG5lZWRcbiAgICAvLyBsb3RzIG9mIGxvb2sgYWhlYWQuIFRoaXMgZG9lc24ndCBoYW5kbGUgcmV2ZXJzYWwgYXMgd2VsbCBhcyB0d28gZW5kZWRcbiAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG9cbiAgICAvLyB3b3JrIG9uIEl0ZXJhYmxlcywgd2UnZCBuZWVkIHRvIGNvcHkgdGhlIHdob2xlIHNldC5cbiAgICAvLyBJbiB0aGlzIGZpcnN0IGl0ZXJhdGlvbiwgd2UnbGwganVzdCBsaXZlIHdpdGggaGl0dGluZyB0aGUgYmFkIGNhc2VcbiAgICAvLyAoYWRkaW5nIGV2ZXJ5dGhpbmcgdG8gYSBNYXApIGluIGZvciBldmVyeSBpbnNlcnQvbW92ZS5cbiAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY29kZSwgYWxzbyB1cGRhdGUgcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcigpIHdoaWNoXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBhbGdvcml0aG0uXG4gICAge1xuICAgICAgLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAobmV3SWR4ID09PSBuZXdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBfbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIHZhciBfbmV3RmliZXIyID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjIuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyMi5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXIyLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgdmFyIF9udW1iZXJPZkZvcmtzMiA9IG5ld0lkeDtcbiAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbkl0ZXJhYmxlLCBsYW5lcykge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgcmVjb25jaWxlQ2hpbGRyZW5BcnJheSgpLFxuICAgIC8vIGJ1dCB1c2luZyB0aGUgaXRlcmF0b3IgaW5zdGVhZC5cbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVuZGVyaW5nIEdlbmVyYXRvcnMgYmVjYXVzZSBpdCdzIGEgbXV0YXRpb24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjk5NVxuICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCB0b1N0cmluZ1RhZ1xuICAgICAgbmV3Q2hpbGRyZW5JdGVyYWJsZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnR2VuZXJhdG9yJykge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEdlbmVyYXRvcnMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgR2VuZXJhdG9ycyBhcyBjaGlsZHJlbiBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBsaWtlbHkgeWllbGQgJyArICd1bmV4cGVjdGVkIHJlc3VsdHMgYmVjYXVzZSBlbnVtZXJhdGluZyBhIGdlbmVyYXRvciBtdXRhdGVzIGl0LiAnICsgJ1lvdSBtYXkgY29udmVydCBpdCB0byBhbiBhcnJheSB3aXRoIGBBcnJheS5mcm9tKClgIG9yIHRoZSAnICsgJ2BbLi4uc3ByZWFkXWAgb3BlcmF0b3IgYmVmb3JlIHJlbmRlcmluZy4gS2VlcCBpbiBtaW5kICcgKyAneW91IG1pZ2h0IG5lZWQgdG8gcG9seWZpbGwgdGhlc2UgZmVhdHVyZXMgZm9yIG9sZGVyIGJyb3dzZXJzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IHRydWU7XG4gICAgICB9IC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuXG5cbiAgICAgIGlmIChuZXdDaGlsZHJlbkl0ZXJhYmxlLmVudHJpZXMgPT09IGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICB9IC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgLy8gV2UnbGwgZ2V0IGEgZGlmZmVyZW50IGl0ZXJhdG9yIGxhdGVyIGZvciB0aGUgbWFpbiBwYXNzLlxuXG5cbiAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICAgIGlmIChfbmV3Q2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgICAgdmFyIF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgICAgICBmb3IgKDsgIV9zdGVwLmRvbmU7IF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKG5ld0NoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gaXRlcmFibGUgb2JqZWN0IHByb3ZpZGVkIG5vIGl0ZXJhdG9yLicpO1xuICAgIH1cblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG4gICAgdmFyIG9sZEZpYmVyID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgdmFyIGxhc3RQbGFjZWRJbmRleCA9IDA7XG4gICAgdmFyIG5ld0lkeCA9IDA7XG4gICAgdmFyIG5leHRPbGRGaWJlciA9IG51bGw7XG4gICAgdmFyIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCk7XG5cbiAgICBmb3IgKDsgb2xkRmliZXIgIT09IG51bGwgJiYgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgIGlmIChvbGRGaWJlci5pbmRleCA+IG5ld0lkeCkge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlcjtcbiAgICAgICAgb2xkRmliZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICBpZiAob2xkRmliZXIgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgc2xvdCwgYnV0IHdlIGRpZG4ndCByZXVzZSB0aGUgZXhpc3RpbmcgZmliZXIsIHNvIHdlXG4gICAgICAgICAgLy8gbmVlZCB0byBkZWxldGUgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgIH1cblxuICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIzID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgICBpZiAoX25ld0ZpYmVyMyA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIzLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyMztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIzO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgX251bWJlck9mRm9ya3MzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzMyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyNCA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyNCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXI0LmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjQua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyNC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyNCwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczQgPSBuZXdJZHg7XG4gICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzNCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBjaGVjayBmb3Iga2V5cyBvbiB0ZXh0IG5vZGVzIHNpbmNlIHdlIGRvbid0IGhhdmUgYVxuICAgIC8vIHdheSB0byBkZWZpbmUgdGhlbS5cbiAgICBpZiAoY3VycmVudEZpcnN0Q2hpbGQgIT09IG51bGwgJiYgY3VycmVudEZpcnN0Q2hpbGQudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG5vZGUgc28gbGV0J3MganVzdCB1cGRhdGUgaXQgYW5kIGRlbGV0ZVxuICAgICAgLy8gdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQuc2libGluZyk7XG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfSAvLyBUaGUgZXhpc3RpbmcgZmlyc3QgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZVxuICAgIC8vIGFuZCBkZWxldGUgdGhlIGV4aXN0aW5nIG9uZXMuXG5cblxuICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBGcmFnbWVudCkge1xuICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4pO1xuICAgICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjaGlsZC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUgfHwgKCAvLyBLZWVwIHRoaXMgY2hlY2sgaW5saW5lIHNvIGl0IG9ubHkgcnVucyBvbiB0aGUgZmFsc2UgcGF0aDpcbiAgICAgICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGNoaWxkLCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLlxuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgSG90IFJlbG9hZGluZyBjaGVjayBhYm92ZSxcbiAgICAgICAgICAvLyBiZWNhdXNlIGhvdCByZWxvYWRpbmcgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBwcm9kIGJlY2F1c2VcbiAgICAgICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuXG4gICAgICAgICAgdHlwZW9mIGVsZW1lbnRUeXBlID09PSAnb2JqZWN0JyAmJiBlbGVtZW50VHlwZSAhPT0gbnVsbCAmJiBlbGVtZW50VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY2hpbGQudHlwZSkge1xuICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuXG4gICAgICAgICAgICB2YXIgX2V4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQucHJvcHMpO1xuXG4gICAgICAgICAgICBfZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBfZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgX2V4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICAgICAgX2V4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfZXhpc3Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIERpZG4ndCBtYXRjaC5cblxuXG4gICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGVsZW1lbnQua2V5KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jcmVhdGVkNCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICBfY3JlYXRlZDQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCk7XG4gICAgICBfY3JlYXRlZDQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gX2NyZWF0ZWQ0O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICB2YXIga2V5ID0gcG9ydGFsLmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIGlmIChjaGlsZC50YWcgPT09IEhvc3RQb3J0YWwgJiYgY2hpbGQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gPT09IHBvcnRhbC5jb250YWluZXJJbmZvICYmIGNoaWxkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiA9PT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBwb3J0YWwuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfSAvLyBUaGlzIEFQSSB3aWxsIHRhZyB0aGUgY2hpbGRyZW4gd2l0aCB0aGUgc2lkZS1lZmZlY3Qgb2YgdGhlIHJlY29uY2lsaWF0aW9uXG4gIC8vIGl0c2VsZi4gVGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzaWRlLWVmZmVjdCBsaXN0IGFzIHdlIHBhc3MgdGhyb3VnaCB0aGVcbiAgLy8gY2hpbGRyZW4gYW5kIHRoZSBwYXJlbnQuXG5cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZEZpYmVycyhyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlY3Vyc2l2ZS5cbiAgICAvLyBJZiB0aGUgdG9wIGxldmVsIGl0ZW0gaXMgYW4gYXJyYXksIHdlIHRyZWF0IGl0IGFzIGEgc2V0IG9mIGNoaWxkcmVuLFxuICAgIC8vIG5vdCBhcyBhIGZyYWdtZW50LiBOZXN0ZWQgYXJyYXlzIG9uIHRoZSBvdGhlciBoYW5kIHdpbGwgYmUgdHJlYXRlZCBhc1xuICAgIC8vIGZyYWdtZW50IG5vZGVzLiBSZWN1cnNpb24gaGFwcGVucyBhdCB0aGUgbm9ybWFsIGZsb3cuXG4gICAgLy8gSGFuZGxlIHRvcCBsZXZlbCB1bmtleWVkIGZyYWdtZW50cyBhcyBpZiB0aGV5IHdlcmUgYXJyYXlzLlxuICAgIC8vIFRoaXMgbGVhZHMgdG8gYW4gYW1iaWd1aXR5IGJldHdlZW4gPD57Wy4uLl19PC8+IGFuZCA8Pi4uLjwvPi5cbiAgICAvLyBXZSB0cmVhdCB0aGUgYW1iaWd1b3VzIGNhc2VzIGFib3ZlIHRoZSBzYW1lLlxuICAgIHZhciBpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50ID0gdHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCAmJiBuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFICYmIG5ld0NoaWxkLmtleSA9PT0gbnVsbDtcblxuICAgIGlmIChpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50KSB7XG4gICAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuO1xuICAgIH0gLy8gSGFuZGxlIG9iamVjdCB0eXBlc1xuXG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpKTtcblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7IC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gYmUgbm9uLXJlY3Vyc2l2ZS5cblxuICAgICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycyhyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpKSB7XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgJycgKyBuZXdDaGlsZCwgbGFuZXMpKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfSAvLyBSZW1haW5pbmcgY2FzZXMgYXJlIGFsbCB0cmVhdGVkIGFzIGVtcHR5LlxuXG5cbiAgICByZXR1cm4gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgfVxuXG4gIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycztcbn1cblxudmFyIHJlY29uY2lsZUNoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKHRydWUpO1xudmFyIG1vdW50Q2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIoZmFsc2UpO1xuZnVuY3Rpb24gY2xvbmVDaGlsZEZpYmVycyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5jaGlsZCAhPT0gY3VycmVudC5jaGlsZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcblxuICB3aGlsZSAoY3VycmVudENoaWxkLnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICBjdXJyZW50Q2hpbGQgPSBjdXJyZW50Q2hpbGQuc2libGluZztcbiAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnNpYmxpbmcgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICAgIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgbmV3Q2hpbGQuc2libGluZyA9IG51bGw7XG59IC8vIFJlc2V0IGEgd29ya0luUHJvZ3Jlc3MgY2hpbGQgc2V0IHRvIHByZXBhcmUgaXQgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHJlc2V0V29ya0luUHJvZ3Jlc3MoY2hpbGQsIGxhbmVzKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxudmFyIHZhbHVlQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKG51bGwpO1xudmFyIHJlbmRlcmVyU2lnaWw7XG5cbntcbiAgLy8gVXNlIHRoaXMgdG8gZGV0ZWN0IG11bHRpcGxlIHJlbmRlcmVycyB1c2luZyB0aGUgc2FtZSBjb250ZXh0XG4gIHJlbmRlcmVyU2lnaWwgPSB7fTtcbn1cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gbnVsbDtcbnZhciBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xudmFyIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG52YXIgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuZnVuY3Rpb24gcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCkge1xuICAvLyBUaGlzIGlzIGNhbGxlZCByaWdodCBiZWZvcmUgUmVhY3QgeWllbGRzIGV4ZWN1dGlvbiwgdG8gZW5zdXJlIGByZWFkQ29udGV4dGBcbiAgLy8gY2Fubm90IGJlIGNhbGxlZCBvdXRzaWRlIHRoZSByZW5kZXIgcGhhc2UuXG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gbnVsbDtcbiAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbiAgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcblxuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCkge1xuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGV4aXREaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gcHVzaFByb3ZpZGVyKHByb3ZpZGVyRmliZXIsIGNvbnRleHQsIG5leHRWYWx1ZSkge1xuICB7XG4gICAgcHVzaCh2YWx1ZUN1cnNvciwgY29udGV4dC5fY3VycmVudFZhbHVlLCBwcm92aWRlckZpYmVyKTtcbiAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBuZXh0VmFsdWU7XG5cbiAgICB7XG4gICAgICBpZiAoY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSB1bmRlZmluZWQgJiYgY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSBudWxsICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gcmVuZGVyZXJTaWdpbCkge1xuICAgICAgICBlcnJvcignRGV0ZWN0ZWQgbXVsdGlwbGUgcmVuZGVyZXJzIGNvbmN1cnJlbnRseSByZW5kZXJpbmcgdGhlICcgKyAnc2FtZSBjb250ZXh0IHByb3ZpZGVyLiBUaGlzIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZC4nKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID0gcmVuZGVyZXJTaWdpbDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvcFByb3ZpZGVyKGNvbnRleHQsIHByb3ZpZGVyRmliZXIpIHtcbiAgdmFyIGN1cnJlbnRWYWx1ZSA9IHZhbHVlQ3Vyc29yLmN1cnJlbnQ7XG4gIHBvcCh2YWx1ZUN1cnNvciwgcHJvdmlkZXJGaWJlcik7XG5cbiAge1xuICAgIHtcbiAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgocGFyZW50LCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KSB7XG4gIC8vIFVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMgb2YgYWxsIHRoZSBhbmNlc3RvcnMsIGluY2x1ZGluZyB0aGUgYWx0ZXJuYXRlcy5cbiAgdmFyIG5vZGUgPSBwYXJlbnQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gbm9kZS5hbHRlcm5hdGU7XG5cbiAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgbm9kZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiAhaXNTdWJzZXRPZkxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBwcm9wYWdhdGlvblJvb3QpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBpZiAobm9kZSAhPT0gcHJvcGFnYXRpb25Sb290KSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJvcGFnYXRpb24gcm9vdCB3aGVuIHNjaGVkdWxpbmcgY29udGV4dCB3b3JrLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZV9lYWdlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VfZWFnZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKSB7XG5cbiAgdmFyIGZpYmVyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgaWYgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgZmliZXIucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIH1cblxuICB3aGlsZSAoZmliZXIgIT09IG51bGwpIHtcbiAgICB2YXIgbmV4dEZpYmVyID0gdm9pZCAwOyAvLyBWaXNpdCB0aGlzIGZpYmVyLlxuXG4gICAgdmFyIGxpc3QgPSBmaWJlci5kZXBlbmRlbmNpZXM7XG5cbiAgICBpZiAobGlzdCAhPT0gbnVsbCkge1xuICAgICAgbmV4dEZpYmVyID0gZmliZXIuY2hpbGQ7XG4gICAgICB2YXIgZGVwZW5kZW5jeSA9IGxpc3QuZmlyc3RDb250ZXh0O1xuXG4gICAgICB3aGlsZSAoZGVwZW5kZW5jeSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgY29udGV4dCBtYXRjaGVzLlxuICAgICAgICBpZiAoZGVwZW5kZW5jeS5jb250ZXh0ID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgLy8gTWF0Y2ghIFNjaGVkdWxlIGFuIHVwZGF0ZSBvbiB0aGlzIGZpYmVyLlxuICAgICAgICAgIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAvLyBTY2hlZHVsZSBhIGZvcmNlIHVwZGF0ZSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcy5cbiAgICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocmVuZGVyTGFuZXMpO1xuICAgICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gICAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7IC8vIFRPRE86IEJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIHdvcmstaW4tcHJvZ3Jlc3MsIHRoaXMgd2lsbCBhZGQgdGhlXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG8gdGhlIGN1cnJlbnQgZmliZXIsIHRvbywgd2hpY2ggbWVhbnMgaXQgd2lsbCBwZXJzaXN0IGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoaXMgcmVuZGVyIGlzIHRocm93biBhd2F5LiBTaW5jZSBpdCdzIGEgcmFjZSBjb25kaXRpb24sIG5vdCBzdXJlIGl0J3NcbiAgICAgICAgICAgIC8vIHdvcnRoIGZpeGluZy5cbiAgICAgICAgICAgIC8vIElubGluZWQgYGVucXVldWVVcGRhdGVgIHRvIHJlbW92ZSBpbnRlcmxlYXZlZCB1cGRhdGUgY2hlY2tcblxuICAgICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkgOyBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuICAgICAgICAgICAgICB2YXIgcGVuZGluZyA9IHNoYXJlZFF1ZXVlLnBlbmRpbmc7XG5cbiAgICAgICAgICAgICAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICAgICAgICAgICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgICAgICAgICAgICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2hhcmVkUXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKGZpYmVyLnJldHVybiwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTsgLy8gTWFyayB0aGUgdXBkYXRlZCBsYW5lcyBvbiB0aGUgbGlzdCwgdG9vLlxuXG4gICAgICAgICAgbGlzdC5sYW5lcyA9IG1lcmdlTGFuZXMobGlzdC5sYW5lcywgcmVuZGVyTGFuZXMpOyAvLyBTaW5jZSB3ZSBhbHJlYWR5IGZvdW5kIGEgbWF0Y2gsIHdlIGNhbiBzdG9wIHRyYXZlcnNpbmcgdGhlXG4gICAgICAgICAgLy8gZGVwZW5kZW5jeSBsaXN0LlxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jeS5uZXh0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBDb250ZXh0UHJvdmlkZXIpIHtcbiAgICAgIC8vIERvbid0IHNjYW4gZGVlcGVyIGlmIHRoaXMgaXMgYSBtYXRjaGluZyBwcm92aWRlclxuICAgICAgbmV4dEZpYmVyID0gZmliZXIudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MudHlwZSA/IG51bGwgOiBmaWJlci5jaGlsZDtcbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gRGVoeWRyYXRlZEZyYWdtZW50KSB7XG4gICAgICAvLyBJZiBhIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgaXMgaW4gdGhpcyBzdWJ0cmVlLCB3ZSBkb24ndCBrbm93XG4gICAgICAvLyBpZiBpdCB3aWxsIGhhdmUgYW55IGNvbnRleHQgY29uc3VtZXJzIGluIGl0LiBUaGUgYmVzdCB3ZSBjYW4gZG8gaXNcbiAgICAgIC8vIG1hcmsgaXQgYXMgaGF2aW5nIHVwZGF0ZXMuXG4gICAgICB2YXIgcGFyZW50U3VzcGVuc2UgPSBmaWJlci5yZXR1cm47XG5cbiAgICAgIGlmIChwYXJlbnRTdXNwZW5zZSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIGp1c3QgY2FtZSBmcm9tIGEgcGFyZW50IHNvIHdlIG11c3QgaGF2ZSBoYWQgYSBwYXJlbnQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHBhcmVudFN1c3BlbnNlLmxhbmVzID0gbWVyZ2VMYW5lcyhwYXJlbnRTdXNwZW5zZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9hbHRlcm5hdGUgPSBwYXJlbnRTdXNwZW5zZS5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChfYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgIF9hbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKF9hbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IHBhc3NpbmcgdGhpcyBmaWJlciBhcyB0aGUgcGFyZW50XG4gICAgICAvLyBiZWNhdXNlIHdlIHdhbnQgdG8gc2NoZWR1bGUgdGhpcyBmaWJlciBhcyBoYXZpbmcgd29ya1xuICAgICAgLy8gb24gaXRzIGNoaWxkcmVuLiBXZSdsbCB1c2UgdGhlIGNoaWxkTGFuZXMgb25cbiAgICAgIC8vIHRoaXMgZmliZXIgdG8gaW5kaWNhdGUgdGhhdCBhIGNvbnRleHQgaGFzIGNoYW5nZWQuXG5cblxuICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChwYXJlbnRTdXNwZW5zZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnNpYmxpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYXZlcnNlIGRvd24uXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICB9XG5cbiAgICBpZiAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgIG5leHRGaWJlci5yZXR1cm4gPSBmaWJlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2hpbGQuIFRyYXZlcnNlIHRvIG5leHQgc2libGluZy5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyO1xuXG4gICAgICB3aGlsZSAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChuZXh0RmliZXIgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmFjayB0byB0aGUgcm9vdCBvZiB0aGlzIHN1YnRyZWUuIEV4aXQuXG4gICAgICAgICAgbmV4dEZpYmVyID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaWJsaW5nID0gbmV4dEZpYmVyLnNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBzaWJsaW5nIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgICAgIHNpYmxpbmcucmV0dXJuID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgICAgICBuZXh0RmliZXIgPSBzaWJsaW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIE5vIG1vcmUgc2libGluZ3MuIFRyYXZlcnNlIHVwLlxuXG5cbiAgICAgICAgbmV4dEZpYmVyID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlciA9IG5leHRGaWJlcjtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG4gIHZhciBkZXBlbmRlbmNpZXMgPSB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXM7XG5cbiAgaWYgKGRlcGVuZGVuY2llcyAhPT0gbnVsbCkge1xuICAgIHtcbiAgICAgIHZhciBmaXJzdENvbnRleHQgPSBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0O1xuXG4gICAgICBpZiAoZmlyc3RDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKGRlcGVuZGVuY2llcy5sYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICAgICAgLy8gQ29udGV4dCBsaXN0IGhhcyBhIHBlbmRpbmcgdXBkYXRlLiBNYXJrIHRoYXQgdGhpcyBmaWJlciBwZXJmb3JtZWQgd29yay5cbiAgICAgICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgICAgICB9IC8vIFJlc2V0IHRoZSB3b3JrLWluLXByb2dyZXNzIGxpc3RcblxuXG4gICAgICAgIGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVhZENvbnRleHQoY29udGV4dCkge1xuICB7XG4gICAgLy8gVGhpcyB3YXJuaW5nIHdvdWxkIGZpcmUgaWYgeW91IHJlYWQgY29udGV4dCBpbnNpZGUgYSBIb29rIGxpa2UgdXNlTWVtby5cbiAgICAvLyBVbmxpa2UgdGhlIGNsYXNzIGNoZWNrIGJlbG93LCBpdCdzIG5vdCBlbmZvcmNlZCBpbiBwcm9kdWN0aW9uIGZvciBwZXJmLlxuICAgIGlmIChpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKSB7XG4gICAgICBlcnJvcignQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHZhbHVlID0gIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA7XG5cbiAgaWYgKGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9PT0gY29udGV4dCkgOyBlbHNlIHtcbiAgICB2YXIgY29udGV4dEl0ZW0gPSB7XG4gICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgbWVtb2l6ZWRWYWx1ZTogdmFsdWUsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmIChsYXN0Q29udGV4dERlcGVuZGVuY3kgPT09IG51bGwpIHtcbiAgICAgIGlmIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICAgICAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCBkZXBlbmRlbmN5IGZvciB0aGlzIGNvbXBvbmVudC4gQ3JlYXRlIGEgbmV3IGxpc3QuXG5cblxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY29udGV4dEl0ZW07XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5kZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBmaXJzdENvbnRleHQ6IGNvbnRleHRJdGVtXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgYSBuZXcgY29udGV4dCBpdGVtLlxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbGFzdENvbnRleHREZXBlbmRlbmN5Lm5leHQgPSBjb250ZXh0SXRlbTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJlbmRlci4gV2hlbiB0aGlzIHJlbmRlciBleGl0cywgZWl0aGVyIGJlY2F1c2UgaXQgZmluaXNoZXMgb3IgYmVjYXVzZSBpdCBpc1xuLy8gaW50ZXJydXB0ZWQsIHRoZSBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGwgYmUgdHJhbnNmZXJyZWQgb250byB0aGUgbWFpbiBwYXJ0XG4vLyBvZiB0aGUgcXVldWUuXG5cbnZhciBjb25jdXJyZW50UXVldWVzID0gbnVsbDtcbmZ1bmN0aW9uIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpIHtcbiAgaWYgKGNvbmN1cnJlbnRRdWV1ZXMgPT09IG51bGwpIHtcbiAgICBjb25jdXJyZW50UXVldWVzID0gW3F1ZXVlXTtcbiAgfSBlbHNlIHtcbiAgICBjb25jdXJyZW50UXVldWVzLnB1c2gocXVldWUpO1xuICB9XG59XG5mdW5jdGlvbiBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCkge1xuICAvLyBUcmFuc2ZlciB0aGUgaW50ZXJsZWF2ZWQgdXBkYXRlcyBvbnRvIHRoZSBtYWluIHF1ZXVlLiBFYWNoIHF1ZXVlIGhhcyBhXG4gIC8vIGBwZW5kaW5nYCBmaWVsZCBhbmQgYW4gYGludGVybGVhdmVkYCBmaWVsZC4gV2hlbiB0aGV5IGFyZSBub3QgbnVsbCwgdGhleVxuICAvLyBwb2ludCB0byB0aGUgbGFzdCBub2RlIGluIGEgY2lyY3VsYXIgbGlua2VkIGxpc3QuIFdlIG5lZWQgdG8gYXBwZW5kIHRoZVxuICAvLyBpbnRlcmxlYXZlZCBsaXN0IHRvIHRoZSBlbmQgb2YgdGhlIHBlbmRpbmcgbGlzdCBieSBqb2luaW5nIHRoZW0gaW50byBhXG4gIC8vIHNpbmdsZSwgY2lyY3VsYXIgbGlzdC5cbiAgaWYgKGNvbmN1cnJlbnRRdWV1ZXMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmN1cnJlbnRRdWV1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWV1ZSA9IGNvbmN1cnJlbnRRdWV1ZXNbaV07XG4gICAgICB2YXIgbGFzdEludGVybGVhdmVkVXBkYXRlID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGlmIChsYXN0SW50ZXJsZWF2ZWRVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgcXVldWUuaW50ZXJsZWF2ZWQgPSBudWxsO1xuICAgICAgICB2YXIgZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IGxhc3RJbnRlcmxlYXZlZFVwZGF0ZS5uZXh0O1xuICAgICAgICB2YXIgbGFzdFBlbmRpbmdVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gICAgICAgIGlmIChsYXN0UGVuZGluZ1VwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgICAgICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBmaXJzdEludGVybGVhdmVkVXBkYXRlO1xuICAgICAgICAgIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUucGVuZGluZyA9IGxhc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25jdXJyZW50UXVldWVzID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciBpbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG4gIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKSB7XG4gIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG59IC8vIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBvdXRzaWRlIHRoaXMgbW9kdWxlIHNob3VsZCBvbmx5IGJlIGRvbmUgZm9yIGJhY2t3YXJkc1xuLy8gY29tcGF0aWJpbGl0eSBhbmQgc2hvdWxkIGFsd2F5cyBiZSBhY2NvbXBhbmllZCBieSBhIHdhcm5pbmcuXG5cbnZhciB1bnNhZmVfbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdDtcblxuZnVuY3Rpb24gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Qoc291cmNlRmliZXIsIGxhbmUpIHtcbiAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgZmliZXIncyBsYW5lc1xuICBzb3VyY2VGaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoc291cmNlRmliZXIubGFuZXMsIGxhbmUpO1xuICB2YXIgYWx0ZXJuYXRlID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgbGFuZSk7XG4gIH1cblxuICB7XG4gICAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCAmJiAoc291cmNlRmliZXIuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgIH1cbiAgfSAvLyBXYWxrIHRoZSBwYXJlbnQgcGF0aCB0byB0aGUgcm9vdCBhbmQgdXBkYXRlIHRoZSBjaGlsZCBsYW5lcy5cblxuXG4gIHZhciBub2RlID0gc291cmNlRmliZXI7XG4gIHZhciBwYXJlbnQgPSBzb3VyY2VGaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIHBhcmVudC5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhwYXJlbnQuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgYWx0ZXJuYXRlID0gcGFyZW50LmFsdGVybmF0ZTtcblxuICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKChwYXJlbnQuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICB2YXIgcm9vdCA9IG5vZGUuc3RhdGVOb2RlO1xuICAgIHJldHVybiByb290O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7IC8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG5cbnZhciBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGU7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlO1xuXG57XG4gIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSBmYWxzZTtcbiAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBiYXNlU3RhdGU6IGZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgZmlyc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIHNoYXJlZDoge1xuICAgICAgcGVuZGluZzogbnVsbCxcbiAgICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgICAgbGFuZXM6IE5vTGFuZXNcbiAgICB9LFxuICAgIGVmZmVjdHM6IG51bGxcbiAgfTtcbiAgZmliZXIudXBkYXRlUXVldWUgPSBxdWV1ZTtcbn1cbmZ1bmN0aW9uIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gQ2xvbmUgdGhlIHVwZGF0ZSBxdWV1ZSBmcm9tIGN1cnJlbnQuIFVubGVzcyBpdCdzIGFscmVhZHkgYSBjbG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgdmFyIGNsb25lID0ge1xuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgZmlyc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlLFxuICAgICAgbGFzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZSxcbiAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgIGVmZmVjdHM6IGN1cnJlbnRRdWV1ZS5lZmZlY3RzXG4gICAgfTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGNsb25lO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgZXZlbnRUaW1lOiBldmVudFRpbWUsXG4gICAgbGFuZTogbGFuZSxcbiAgICB0YWc6IFVwZGF0ZVN0YXRlLFxuICAgIHBheWxvYWQ6IG51bGwsXG4gICAgY2FsbGJhY2s6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICByZXR1cm4gdXBkYXRlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIE9ubHkgb2NjdXJzIGlmIHRoZSBmaWJlciBoYXMgYmVlbiB1bm1vdW50ZWQuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAge1xuICAgIGlmIChjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPT09IHNoYXJlZFF1ZXVlICYmICFkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlKSB7XG4gICAgICBlcnJvcignQW4gdXBkYXRlIChzZXRTdGF0ZSwgcmVwbGFjZVN0YXRlLCBvciBmb3JjZVVwZGF0ZSkgd2FzIHNjaGVkdWxlZCAnICsgJ2Zyb20gaW5zaWRlIGFuIHVwZGF0ZSBmdW5jdGlvbi4gVXBkYXRlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHVyZSwgJyArICd3aXRoIHplcm8gc2lkZS1lZmZlY3RzLiBDb25zaWRlciB1c2luZyBjb21wb25lbnREaWRVcGRhdGUgb3IgYSAnICsgJ2NhbGxiYWNrLicpO1xuXG4gICAgICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNVbnNhZmVDbGFzc1JlbmRlclBoYXNlVXBkYXRlKCkpIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVuc2FmZSByZW5kZXIgcGhhc2UgdXBkYXRlLiBBZGQgZGlyZWN0bHkgdG8gdGhlIHVwZGF0ZVxuICAgIC8vIHF1ZXVlIHNvIHdlIGNhbiBwcm9jZXNzIGl0IGltbWVkaWF0ZWx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIuXG4gICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICB9XG5cbiAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlOyAvLyBVcGRhdGUgdGhlIGNoaWxkTGFuZXMgZXZlbiB0aG91Z2ggd2UncmUgbW9zdCBsaWtlbHkgYWxyZWFkeSByZW5kZXJpbmdcbiAgICAvLyB0aGlzIGZpYmVyLiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpbiB0aGUgY2FzZSB3aGVyZSB5b3VcbiAgICAvLyB1cGRhdGUgYSBkaWZmZXJlbnQgY29tcG9uZW50IGR1cmluZyByZW5kZXIgcGhhc2UgdGhhbiB0aGUgb25lIHRoYXQgaXNcbiAgICAvLyBjdXJyZW50bHkgcmVuZGVyaW5ncyAoYSBwYXR0ZXJuIHRoYXQgaXMgYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nKS5cblxuICAgIHJldHVybiB1bnNhZmVfbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbnF1ZXVlQ29uY3VycmVudENsYXNzVXBkYXRlKGZpYmVyLCBzaGFyZWRRdWV1ZSwgdXBkYXRlLCBsYW5lKTtcbiAgfVxufVxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSkge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBPbmx5IG9jY3VycyBpZiB0aGUgZmliZXIgaGFzIGJlZW4gdW5tb3VudGVkLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcblxuICBpZiAoaXNUcmFuc2l0aW9uTGFuZShsYW5lKSkge1xuICAgIHZhciBxdWV1ZUxhbmVzID0gc2hhcmVkUXVldWUubGFuZXM7IC8vIElmIGFueSBlbnRhbmdsZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBwZW5kaW5nIG9uIHRoZSByb290LCB0aGVuIHRoZXkgbXVzdFxuICAgIC8vIGhhdmUgZmluaXNoZWQuIFdlIGNhbiByZW1vdmUgdGhlbSBmcm9tIHRoZSBzaGFyZWQgcXVldWUsIHdoaWNoIHJlcHJlc2VudHNcbiAgICAvLyBhIHN1cGVyc2V0IG9mIHRoZSBhY3R1YWxseSBwZW5kaW5nIGxhbmVzLiBJbiBzb21lIGNhc2VzIHdlIG1heSBlbnRhbmdsZVxuICAgIC8vIG1vcmUgdGhhbiB3ZSBuZWVkIHRvLCBidXQgdGhhdCdzIE9LLiBJbiBmYWN0IGl0J3Mgd29yc2UgaWYgd2UgKmRvbid0KlxuICAgIC8vIGVudGFuZ2xlIHdoZW4gd2Ugc2hvdWxkLlxuXG4gICAgcXVldWVMYW5lcyA9IGludGVyc2VjdExhbmVzKHF1ZXVlTGFuZXMsIHJvb3QucGVuZGluZ0xhbmVzKTsgLy8gRW50YW5nbGUgdGhlIG5ldyB0cmFuc2l0aW9uIGxhbmUgd2l0aCB0aGUgb3RoZXIgdHJhbnNpdGlvbiBsYW5lcy5cblxuICAgIHZhciBuZXdRdWV1ZUxhbmVzID0gbWVyZ2VMYW5lcyhxdWV1ZUxhbmVzLCBsYW5lKTtcbiAgICBzaGFyZWRRdWV1ZS5sYW5lcyA9IG5ld1F1ZXVlTGFuZXM7IC8vIEV2ZW4gaWYgcXVldWUubGFuZXMgYWxyZWFkeSBpbmNsdWRlIGxhbmUsIHdlIGRvbid0IGtub3cgZm9yIGNlcnRhaW4gaWZcbiAgICAvLyB0aGUgbGFuZSBmaW5pc2hlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIGVudGFuZ2xlZCBpdC4gU28gd2UgbmVlZCB0b1xuICAgIC8vIGVudGFuZ2xlIGl0IGFnYWluLCBqdXN0IHRvIGJlIHN1cmUuXG5cbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBuZXdRdWV1ZUxhbmVzKTtcbiAgfVxufVxuZnVuY3Rpb24gZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBjYXB0dXJlZFVwZGF0ZSkge1xuICAvLyBDYXB0dXJlZCB1cGRhdGVzIGFyZSB1cGRhdGVzIHRoYXQgYXJlIHRocm93biBieSBhIGNoaWxkIGR1cmluZyB0aGUgcmVuZGVyXG4gIC8vIHBoYXNlLiBUaGV5IHNob3VsZCBiZSBkaXNjYXJkZWQgaWYgdGhlIHJlbmRlciBpcyBhYm9ydGVkLiBUaGVyZWZvcmUsXG4gIC8vIHdlIHNob3VsZCBvbmx5IHB1dCB0aGVtIG9uIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlLCBub3QgdGhlIGN1cnJlbnQgb25lLlxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsgLy8gQ2hlY2sgaWYgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaXMgYSBjbG9uZS5cblxuICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuXG4gICAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHtcbiAgICAgIC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQuIFRoaXMgaGFwcGVucyB3aGVuXG4gICAgICAvLyB3ZSBiYWlsIG91dCBvbiBhIHBhcmVudCBmaWJlciB0aGF0IHRoZW4gY2FwdHVyZXMgYW4gZXJyb3IgdGhyb3duIGJ5XG4gICAgICAvLyBhIGNoaWxkLiBTaW5jZSB3ZSB3YW50IHRvIGFwcGVuZCB0aGUgdXBkYXRlIG9ubHkgdG8gdGhlIHdvcmstaW5cbiAgICAgIC8vIC1wcm9ncmVzcyBxdWV1ZSwgd2UgbmVlZCB0byBjbG9uZSB0aGUgdXBkYXRlcy4gV2UgdXN1YWxseSBjbG9uZSBkdXJpbmdcbiAgICAgIC8vIHByb2Nlc3NVcGRhdGVRdWV1ZSwgYnV0IHRoYXQgZGlkbid0IGhhcHBlbiBpbiB0aGlzIGNhc2UgYmVjYXVzZSB3ZVxuICAgICAgLy8gc2tpcHBlZCBvdmVyIHRoZSBwYXJlbnQgd2hlbiB3ZSBiYWlsZWQgb3V0LlxuICAgICAgdmFyIG5ld0ZpcnN0ID0gbnVsbDtcbiAgICAgIHZhciBuZXdMYXN0ID0gbnVsbDtcbiAgICAgIHZhciBmaXJzdEJhc2VVcGRhdGUgPSBxdWV1ZS5maXJzdEJhc2VVcGRhdGU7XG5cbiAgICAgIGlmIChmaXJzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSB1cGRhdGVzIGFuZCBjbG9uZSB0aGVtLlxuICAgICAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZS5ldmVudFRpbWUsXG4gICAgICAgICAgICBsYW5lOiB1cGRhdGUubGFuZSxcbiAgICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNsb25lO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjbG9uZTtcbiAgICAgICAgICAgIG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICAgICAgfSB3aGlsZSAodXBkYXRlICE9PSBudWxsKTsgLy8gQXBwZW5kIHRoZSBjYXB0dXJlZCB1cGRhdGUgdGhlIGVuZCBvZiB0aGUgY2xvbmVkIGxpc3QuXG5cblxuICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICAgIG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIG5vIGJhc2UgdXBkYXRlcy5cbiAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlID0ge1xuICAgICAgICBiYXNlU3RhdGU6IGN1cnJlbnRRdWV1ZS5iYXNlU3RhdGUsXG4gICAgICAgIGZpcnN0QmFzZVVwZGF0ZTogbmV3Rmlyc3QsXG4gICAgICAgIGxhc3RCYXNlVXBkYXRlOiBuZXdMYXN0LFxuICAgICAgICBzaGFyZWQ6IGN1cnJlbnRRdWV1ZS5zaGFyZWQsXG4gICAgICAgIGVmZmVjdHM6IGN1cnJlbnRRdWV1ZS5lZmZlY3RzXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBxdWV1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gLy8gQXBwZW5kIHRoZSB1cGRhdGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cblxuXG4gIHZhciBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlO1xuXG4gIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgIHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIGxhc3RCYXNlVXBkYXRlLm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMsIGluc3RhbmNlKSB7XG4gIHN3aXRjaCAodXBkYXRlLnRhZykge1xuICAgIGNhc2UgUmVwbGFjZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIFVwZGF0ZXIgZnVuY3Rpb25cbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHBheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgICAgICB9IC8vIFN0YXRlIG9iamVjdFxuXG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENhcHR1cmVVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICB9XG4gICAgLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2hcblxuICAgIGNhc2UgVXBkYXRlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuICAgICAgICB2YXIgcGFydGlhbFN0YXRlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3BheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4aXREaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQYXJ0aWFsIHN0YXRlIG9iamVjdFxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIE51bGwgYW5kIHVuZGVmaW5lZCBhcmUgdHJlYXRlZCBhcyBuby1vcHMuXG4gICAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgICAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgICAgICAgcmV0dXJuIGFzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3JjZVVwZGF0ZTpcbiAgICAgIHtcbiAgICAgICAgaGFzRm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIHByZXZTdGF0ZTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBwcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZDtcbiAgfVxuXG4gIHZhciBmaXJzdEJhc2VVcGRhdGUgPSBxdWV1ZS5maXJzdEJhc2VVcGRhdGU7XG4gIHZhciBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlOyAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzLiBJZiBzbywgdHJhbnNmZXIgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmdRdWV1ZSAhPT0gbnVsbCkge1xuICAgIHF1ZXVlLnNoYXJlZC5wZW5kaW5nID0gbnVsbDsgLy8gVGhlIHBlbmRpbmcgcXVldWUgaXMgY2lyY3VsYXIuIERpc2Nvbm5lY3QgdGhlIHBvaW50ZXIgYmV0d2VlbiBmaXJzdFxuICAgIC8vIGFuZCBsYXN0IHNvIHRoYXQgaXQncyBub24tY2lyY3VsYXIuXG5cbiAgICB2YXIgbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7XG4gICAgdmFyIGZpcnN0UGVuZGluZ1VwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IG51bGw7IC8vIEFwcGVuZCBwZW5kaW5nIHVwZGF0ZXMgdG8gYmFzZSBxdWV1ZVxuXG4gICAgaWYgKGxhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICBmaXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgfVxuXG4gICAgbGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTsgLy8gSWYgdGhlcmUncyBhIGN1cnJlbnQgcXVldWUsIGFuZCBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBiYXNlIHF1ZXVlLCB0aGVuXG4gICAgLy8gd2UgbmVlZCB0byB0cmFuc2ZlciB0aGUgdXBkYXRlcyB0byB0aGF0IHF1ZXVlLCB0b28uIEJlY2F1c2UgdGhlIGJhc2VcbiAgICAvLyBxdWV1ZSBpcyBhIHNpbmdseS1saW5rZWQgbGlzdCB3aXRoIG5vIGN5Y2xlcywgd2UgY2FuIGFwcGVuZCB0byBib3RoXG4gICAgLy8gbGlzdHMgYW5kIHRha2UgYWR2YW50YWdlIG9mIHN0cnVjdHVyYWwgc2hhcmluZy5cbiAgICAvLyBUT0RPOiBQYXNzIGBjdXJyZW50YCBhcyBhcmd1bWVudFxuXG4gICAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhbHdheXMgbm9uLW51bGwgb24gYSBDbGFzc0NvbXBvbmVudCBvciBIb3N0Um9vdFxuICAgICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG4gICAgICB2YXIgY3VycmVudExhc3RCYXNlVXBkYXRlID0gY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoY3VycmVudExhc3RCYXNlVXBkYXRlICE9PSBsYXN0QmFzZVVwZGF0ZSkge1xuICAgICAgICBpZiAoY3VycmVudExhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgY3VycmVudFF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50TGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBUaGVzZSB2YWx1ZXMgbWF5IGNoYW5nZSBhcyB3ZSBwcm9jZXNzIHRoZSBxdWV1ZS5cblxuXG4gIGlmIChmaXJzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgdXBkYXRlcyB0byBjb21wdXRlIHRoZSByZXN1bHQuXG4gICAgdmFyIG5ld1N0YXRlID0gcXVldWUuYmFzZVN0YXRlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIGFjY3VtdWxhdGUgdGhpcy4gSW5zdGVhZCwgd2UgY2FuIHJlbW92ZSByZW5kZXJMYW5lc1xuICAgIC8vIGZyb20gdGhlIG9yaWdpbmFsIGxhbmVzLlxuXG4gICAgdmFyIG5ld0xhbmVzID0gTm9MYW5lcztcbiAgICB2YXIgbmV3QmFzZVN0YXRlID0gbnVsbDtcbiAgICB2YXIgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgbmV3TGFzdEJhc2VVcGRhdGUgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lO1xuICAgICAgdmFyIHVwZGF0ZUV2ZW50VGltZSA9IHVwZGF0ZS5ldmVudFRpbWU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZSA9IGNsb25lO1xuICAgICAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xhc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cblxuXG4gICAgICAgIG5ld0xhbmVzID0gbWVyZ2VMYW5lcyhuZXdMYW5lcywgdXBkYXRlTGFuZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIGhhdmUgc3VmZmljaWVudCBwcmlvcml0eS5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9jbG9uZSA9IHtcbiAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLFxuICAgICAgICAgICAgLy8gVGhpcyB1cGRhdGUgaXMgZ29pbmcgdG8gYmUgY29tbWl0dGVkIHNvIHdlIG5ldmVyIHdhbnQgdW5jb21taXRcbiAgICAgICAgICAgIC8vIGl0LiBVc2luZyBOb0xhbmUgd29ya3MgYmVjYXVzZSAwIGlzIGEgc3Vic2V0IG9mIGFsbCBiaXRtYXNrcywgc29cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBuZXZlciBiZSBza2lwcGVkIGJ5IHRoZSBjaGVjayBhYm92ZS5cbiAgICAgICAgICAgIGxhbmU6IE5vTGFuZSxcbiAgICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0xhc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUubmV4dCA9IF9jbG9uZTtcbiAgICAgICAgfSAvLyBQcm9jZXNzIHRoaXMgdXBkYXRlLlxuXG5cbiAgICAgICAgbmV3U3RhdGUgPSBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIG5ld1N0YXRlLCBwcm9wcywgaW5zdGFuY2UpO1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB1cGRhdGUuY2FsbGJhY2s7XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsICYmIC8vIElmIHRoZSB1cGRhdGUgd2FzIGFscmVhZHkgY29tbWl0dGVkLCB3ZSBzaG91bGQgbm90IHF1ZXVlIGl0c1xuICAgICAgICAvLyBjYWxsYmFjayBhZ2Fpbi5cbiAgICAgICAgdXBkYXRlLmxhbmUgIT09IE5vTGFuZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENhbGxiYWNrO1xuICAgICAgICAgIHZhciBlZmZlY3RzID0gcXVldWUuZWZmZWN0cztcblxuICAgICAgICAgIGlmIChlZmZlY3RzID09PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZS5lZmZlY3RzID0gW3VwZGF0ZV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaCh1cGRhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcblxuICAgICAgaWYgKHVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcblxuICAgICAgICBpZiAocGVuZGluZ1F1ZXVlID09PSBudWxsKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgZnJvbSBpbnNpZGUgYSByZWR1Y2VyLiBBZGQgdGhlIG5ld1xuICAgICAgICAgIC8vIHBlbmRpbmcgdXBkYXRlcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCBrZWVwIHByb2Nlc3NpbmcuXG4gICAgICAgICAgdmFyIF9sYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTsgLy8gSW50ZW50aW9uYWxseSB1bnNvdW5kLiBQZW5kaW5nIHVwZGF0ZXMgZm9ybSBhIGNpcmN1bGFyIGxpc3QsIGJ1dCB3ZVxuICAgICAgICAgIC8vIHVucmF2ZWwgdGhlbSB3aGVuIHRyYW5zZmVycmluZyB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuXG4gICAgICAgICAgdmFyIF9maXJzdFBlbmRpbmdVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBfbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IG51bGw7XG4gICAgICAgICAgdXBkYXRlID0gX2ZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IF9sYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlICh0cnVlKTtcblxuICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcXVldWUuYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICAgIHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IG5ld0ZpcnN0QmFzZVVwZGF0ZTtcbiAgICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlOyAvLyBJbnRlcmxlYXZlZCB1cGRhdGVzIGFyZSBzdG9yZWQgb24gYSBzZXBhcmF0ZSBxdWV1ZS4gV2UgYXJlbid0IGdvaW5nIHRvXG4gICAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXNcbiAgICAvLyBhcmUgcmVtYWluaW5nLlxuXG4gICAgdmFyIGxhc3RJbnRlcmxlYXZlZCA9IHF1ZXVlLnNoYXJlZC5pbnRlcmxlYXZlZDtcblxuICAgIGlmIChsYXN0SW50ZXJsZWF2ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbnRlcmxlYXZlZCA9IGxhc3RJbnRlcmxlYXZlZDtcblxuICAgICAgZG8ge1xuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIGludGVybGVhdmVkLmxhbmUpO1xuICAgICAgICBpbnRlcmxlYXZlZCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgICB9IHdoaWxlIChpbnRlcmxlYXZlZCAhPT0gbGFzdEludGVybGVhdmVkKTtcbiAgICB9IGVsc2UgaWYgKGZpcnN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gYHF1ZXVlLmxhbmVzYCBpcyB1c2VkIGZvciBlbnRhbmdsaW5nIHRyYW5zaXRpb25zLiBXZSBjYW4gc2V0IGl0IGJhY2sgdG9cbiAgICAgIC8vIHplcm8gb25jZSB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgICBxdWV1ZS5zaGFyZWQubGFuZXMgPSBOb0xhbmVzO1xuICAgIH0gLy8gU2V0IHRoZSByZW1haW5pbmcgZXhwaXJhdGlvbiB0aW1lIHRvIGJlIHdoYXRldmVyIGlzIHJlbWFpbmluZyBpbiB0aGUgcXVldWUuXG4gICAgLy8gVGhpcyBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHRoZSBvbmx5IHR3byBvdGhlciB0aGluZ3MgdGhhdCBjb250cmlidXRlIHRvXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lIGFyZSBwcm9wcyBhbmQgY29udGV4dC4gV2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIHRoZVxuICAgIC8vIGJlZ2luIHBoYXNlIGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBzbyB3ZSd2ZSBhbHJlYWR5XG4gICAgLy8gZGVhbHQgd2l0aCB0aGUgcHJvcHMuIENvbnRleHQgaW4gY29tcG9uZW50cyB0aGF0IHNwZWNpZnlcbiAgICAvLyBzaG91bGRDb21wb25lbnRVcGRhdGUgaXMgdHJpY2t5OyBidXQgd2UnbGwgaGF2ZSB0byBhY2NvdW50IGZvclxuICAgIC8vIHRoYXQgcmVnYXJkbGVzcy5cblxuXG4gICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhuZXdMYW5lcyk7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBuZXdMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICB7XG4gICAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgYXMgY2FsbGJhY2suIEV4cGVjdGVkIGEgZnVuY3Rpb24uIEluc3RlYWQgJyArIChcInJlY2VpdmVkOiBcIiArIGNhbGxiYWNrKSk7XG4gIH1cblxuICBjYWxsYmFjay5jYWxsKGNvbnRleHQpO1xufVxuXG5mdW5jdGlvbiByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpIHtcbiAgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB7XG4gIHJldHVybiBoYXNGb3JjZVVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgZmluaXNoZWRRdWV1ZSwgaW5zdGFuY2UpIHtcbiAgLy8gQ29tbWl0IHRoZSBlZmZlY3RzXG4gIHZhciBlZmZlY3RzID0gZmluaXNoZWRRdWV1ZS5lZmZlY3RzO1xuICBmaW5pc2hlZFF1ZXVlLmVmZmVjdHMgPSBudWxsO1xuXG4gIGlmIChlZmZlY3RzICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZmZlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWZmZWN0ID0gZWZmZWN0c1tpXTtcbiAgICAgIHZhciBjYWxsYmFjayA9IGVmZmVjdC5jYWxsYmFjaztcblxuICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgIGVmZmVjdC5jYWxsYmFjayA9IG51bGw7XG4gICAgICAgIGNhbGxDYWxsYmFjayhjYWxsYmFjaywgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgTk9fQ09OVEVYVCA9IHt9O1xudmFyIGNvbnRleHRTdGFja0N1cnNvciQxID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xuXG5mdW5jdGlvbiByZXF1aXJlZENvbnRleHQoYykge1xuICBpZiAoYyA9PT0gTk9fQ09OVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgaG9zdCBjb250ZXh0IHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7IC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG5cbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgTk9fQ09OVEVYVCwgZmliZXIpO1xuICB2YXIgbmV4dFJvb3RDb250ZXh0ID0gZ2V0Um9vdEhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpOyAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0aHJvdywgcmVwbGFjZSBpdC5cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dFJvb3RDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250YWluZXIoZmliZXIpIHtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xuICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICB2YXIgbmV4dENvbnRleHQgPSBnZXRDaGlsZEhvc3RDb250ZXh0KGNvbnRleHQsIGZpYmVyLnR5cGUpOyAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS5cblxuICBpZiAoY29udGV4dCA9PT0gbmV4dENvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGV4dChmaWJlcikge1xuICAvLyBEbyBub3QgcG9wIHVubGVzcyB0aGlzIEZpYmVyIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gIC8vIHB1c2hIb3N0Q29udGV4dCgpIG9ubHkgcHVzaGVzIEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuICBpZiAoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZmliZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbnZhciBEZWZhdWx0U3VzcGVuc2VDb250ZXh0ID0gMDsgLy8gVGhlIFN1c3BlbnNlIENvbnRleHQgaXMgc3BsaXQgaW50byB0d28gcGFydHMuIFRoZSBsb3dlciBiaXRzIGlzXG4vLyBpbmhlcml0ZWQgZGVlcGx5IGRvd24gdGhlIHN1YnRyZWUuIFRoZSB1cHBlciBiaXRzIG9ubHkgYWZmZWN0XG4vLyB0aGlzIGltbWVkaWF0ZSBzdXNwZW5zZSBib3VuZGFyeSBhbmQgZ2V0cyByZXNldCBlYWNoIG5ld1xuLy8gYm91bmRhcnkgb3Igc3VzcGVuc2UgbGlzdC5cblxudmFyIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrID0gMTsgLy8gU3VidHJlZSBGbGFnczpcbi8vIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCBpbmRpY2F0ZXMgdGhhdCBvbmUgb2Ygb3VyIHBhcmVudCBTdXNwZW5zZVxuLy8gYm91bmRhcmllcyBpcyBub3QgY3VycmVudGx5IHNob3dpbmcgdmlzaWJsZSBtYWluIGNvbnRlbnQuXG4vLyBFaXRoZXIgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBvciBpcyBub3QgbW91bnRlZCBhdCBhbGwuXG4vLyBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlc2lyYWJsZSB0byB0cmlnZ2VyIGEgZmFsbGJhY2sgYXRcbi8vIHRoZSBwYXJlbnQuIElmIG5vdCwgdGhlbiB3ZSBtaWdodCBuZWVkIHRvIHRyaWdnZXIgdW5kZXNpcmFibGUgYm91bmRhcmllc1xuLy8gYW5kL29yIHN1c3BlbmQgdGhlIGNvbW1pdCB0byBhdm9pZCBoaWRpbmcgdGhlIHBhcmVudCBjb250ZW50LlxuXG52YXIgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0ID0gMTsgLy8gU2hhbGxvdyBGbGFnczpcbi8vIEZvcmNlU3VzcGVuc2VGYWxsYmFjayBjYW4gYmUgdXNlZCBieSBTdXNwZW5zZUxpc3QgdG8gZm9yY2UgbmV3bHkgYWRkZWRcbi8vIGl0ZW1zIGludG8gdGhlaXIgZmFsbGJhY2sgc3RhdGUgZHVyaW5nIG9uZSBvZiB0aGUgcmVuZGVyIHBhc3Nlcy5cblxudmFyIEZvcmNlU3VzcGVuc2VGYWxsYmFjayA9IDI7XG52YXIgc3VzcGVuc2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihEZWZhdWx0U3VzcGVuc2VDb250ZXh0KTtcbmZ1bmN0aW9uIGhhc1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBmbGFnKSB7XG4gIHJldHVybiAocGFyZW50Q29udGV4dCAmIGZsYWcpICE9PSAwO1xufVxuZnVuY3Rpb24gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrO1xufVxuZnVuY3Rpb24gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzaGFsbG93Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrIHwgc2hhbGxvd0NvbnRleHQ7XG59XG5mdW5jdGlvbiBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHN1YnRyZWVDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0IHwgc3VidHJlZUNvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoU3VzcGVuc2VDb250ZXh0KGZpYmVyLCBuZXdDb250ZXh0KSB7XG4gIHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgbmV3Q29udGV4dCwgZmliZXIpO1xufVxuZnVuY3Rpb24gcG9wU3VzcGVuc2VDb250ZXh0KGZpYmVyKSB7XG4gIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhcHR1cmVTdXNwZW5zZSh3b3JrSW5Qcm9ncmVzcywgaGFzSW52aXNpYmxlUGFyZW50KSB7XG4gIC8vIElmIGl0IHdhcyB0aGUgcHJpbWFyeSBjaGlsZHJlbiB0aGF0IGp1c3Qgc3VzcGVuZGVkLCBjYXB0dXJlIGFuZCByZW5kZXIgdGhlXG4gIC8vIGZhbGxiYWNrLiBPdGhlcndpc2UsIGRvbid0IGNhcHR1cmUgYW5kIGJ1YmJsZSB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFsd2F5cyBjYXB0dXJlcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7IC8vIFJlZ3VsYXIgYm91bmRhcmllcyBhbHdheXMgY2FwdHVyZS5cblxuICB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gSWYgaXQncyBhIGJvdW5kYXJ5IHdlIHNob3VsZCBhdm9pZCwgdGhlbiB3ZSBwcmVmZXIgdG8gYnViYmxlIHVwIHRvIHRoZVxufVxuZnVuY3Rpb24gZmluZEZpcnN0U3VzcGVuZGVkKHJvdykge1xuICB2YXIgbm9kZSA9IHJvdztcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IG5vZGUubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgICBpZiAoZGVoeWRyYXRlZCA9PT0gbnVsbCB8fCBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGRlaHlkcmF0ZWQpIHx8IGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGRlaHlkcmF0ZWQpKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQgJiYgLy8gcmV2ZWFsT3JkZXIgdW5kZWZpbmVkIGNhbid0IGJlIHRydXN0ZWQgYmVjYXVzZSBpdCBkb24ndFxuICAgIC8vIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBpdCBzdXNwZW5kZWQgb3Igbm90LlxuICAgIG5vZGUubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZGlkU3VzcGVuZCA9IChub2RlLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgIGlmIChkaWRTdXNwZW5kKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcm93KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHJvdykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBOb0ZsYWdzJDEgPVxuLyogICAqL1xuMDsgLy8gUmVwcmVzZW50cyB3aGV0aGVyIGVmZmVjdCBzaG91bGQgZmlyZS5cblxudmFyIEhhc0VmZmVjdCA9XG4vKiAqL1xuMTsgLy8gUmVwcmVzZW50cyB0aGUgcGhhc2UgaW4gd2hpY2ggdGhlIGVmZmVjdCAobm90IHRoZSBjbGVhbi11cCkgZmlyZXMuXG5cbnZhciBJbnNlcnRpb24gPVxuLyogICovXG4yO1xudmFyIExheW91dCA9XG4vKiAgICAqL1xuNDtcbnZhciBQYXNzaXZlJDEgPVxuLyogICAqL1xuODtcblxuLy8gYW5kIHNob3VsZCBiZSByZXNldCBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgcmVuZGVyLlxuLy8gVGhpcyB0cmFja3Mgd2hpY2ggbXV0YWJsZSBzb3VyY2VzIG5lZWQgdG8gYmUgcmVzZXQgYWZ0ZXIgYSByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMgPSBbXTtcbmZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IHdvcmtJblByb2dyZXNzU291cmNlc1tpXTtcblxuICAgIHtcbiAgICAgIG11dGFibGVTb3VyY2UuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGggPSAwO1xufVxuLy8gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHZlcnNpb24gdXNlZCBmb3Igc2VydmVyIHJlbmRlcmluZyBtYXRjaGVzIHRoZSBvbmVcbi8vIHRoYXQgaXMgZXZlbnR1YWxseSByZWFkIGR1cmluZyBoeWRyYXRpb24uXG4vLyBJZiB0aGV5IGRvbid0IG1hdGNoIHRoZXJlJ3MgYSBwb3RlbnRpYWwgdGVhciBhbmQgYSBmdWxsIGRlb3B0IHJlbmRlciBpcyByZXF1aXJlZC5cblxuZnVuY3Rpb24gcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpIHtcbiAgdmFyIGdldFZlcnNpb24gPSBtdXRhYmxlU291cmNlLl9nZXRWZXJzaW9uO1xuICB2YXIgdmVyc2lvbiA9IGdldFZlcnNpb24obXV0YWJsZVNvdXJjZS5fc291cmNlKTsgLy8gVE9ETyBDbGVhciB0aGlzIGRhdGEgb25jZSBhbGwgcGVuZGluZyBoeWRyYXRpb24gd29yayBpcyBmaW5pc2hlZC5cbiAgLy8gUmV0YWluaW5nIGl0IGZvcmV2ZXIgbWF5IGludGVyZmVyZSB3aXRoIEdDLlxuXG4gIGlmIChyb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPT0gbnVsbCkge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IFttdXRhYmxlU291cmNlLCB2ZXJzaW9uXTtcbiAgfSBlbHNlIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChtdXRhYmxlU291cmNlLCB2ZXJzaW9uKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7XG52YXIgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90O1xuXG57XG4gIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuLy8gVGhlc2UgYXJlIHNldCByaWdodCBiZWZvcmUgY2FsbGluZyB0aGUgY29tcG9uZW50LlxudmFyIHJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIEkndmUgbmFtZWQgaXQgZGlmZmVyZW50bHkgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbVxuLy8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsOyAvLyBIb29rcyBhcmUgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIGZpYmVyJ3MgbWVtb2l6ZWRTdGF0ZSBmaWVsZC4gVGhlXG4vLyBjdXJyZW50IGhvb2sgbGlzdCBpcyB0aGUgbGlzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmliZXIuIFRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuXG52YXIgY3VycmVudEhvb2sgPSBudWxsO1xudmFyIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7IC8vIFdoZXRoZXIgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzXG4vLyBkb2VzIG5vdCBnZXQgcmVzZXQgaWYgd2UgZG8gYW5vdGhlciByZW5kZXIgcGFzczsgb25seSB3aGVuIHdlJ3JlIGNvbXBsZXRlbHlcbi8vIGZpbmlzaGVkIGV2YWx1YXRpbmcgdGhpcyBjb21wb25lbnQuIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHdlIGtub3dcbi8vIHdoZXRoZXIgd2UgbmVlZCB0byBjbGVhciByZW5kZXIgcGhhc2UgdXBkYXRlcyBhZnRlciBhIHRocm93LlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBXaGVyZSBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbmx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIgcGFzcy4gVGhpc1xuLy8gZ2V0cyByZXNldCBhZnRlciBlYWNoIGF0dGVtcHQuXG4vLyBUT0RPOiBNYXliZSB0aGVyZSdzIHNvbWUgd2F5IHRvIGNvbnNvbGlkYXRlIHRoaXMgd2l0aFxuLy8gYGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVgLiBPciB3aXRoIGBudW1iZXJPZlJlUmVuZGVyc2AuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTsgLy8gQ291bnRzIHRoZSBudW1iZXIgb2YgdXNlSWQgaG9va3MgaW4gdGhpcyBjb21wb25lbnQuXG5cbnZhciBsb2NhbElkQ291bnRlciA9IDA7IC8vIFVzZWQgZm9yIGlkcyB0aGF0IGFyZSBnZW5lcmF0ZWQgY29tcGxldGVseSBjbGllbnQtc2lkZSAoaS5lLiBub3QgZHVyaW5nXG4vLyBoeWRyYXRpb24pLiBUaGlzIGNvdW50ZXIgaXMgZ2xvYmFsLCBzbyBjbGllbnQgaWRzIGFyZSBub3Qgc3RhYmxlIGFjcm9zc1xuLy8gcmVuZGVyIGF0dGVtcHRzLlxuXG52YXIgZ2xvYmFsQ2xpZW50SWRDb3VudGVyID0gMDtcbnZhciBSRV9SRU5ERVJfTElNSVQgPSAyNTsgLy8gSW4gREVWLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHByaW1pdGl2ZSBob29rXG5cbnZhciBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7IC8vIEluIERFViwgdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBob29rcyBhcmUgY2FsbGVkIGluIHRoZSBzYW1lIG9yZGVyIGJldHdlZW4gcmVuZGVycy5cbi8vIFRoZSBsaXN0IHN0b3JlcyB0aGUgb3JkZXIgb2YgaG9va3MgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgcmVuZGVyIChtb3VudCkuXG4vLyBTdWJzZXF1ZW50IHJlbmRlcnMgKHVwZGF0ZXMpIHJlZmVyZW5jZSB0aGlzIGxpc3QuXG5cbnZhciBob29rVHlwZXNEZXYgPSBudWxsO1xudmFyIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIEluIERFViwgdGhpcyB0cmFja3Mgd2hldGhlciBjdXJyZW50bHkgcmVuZGVyaW5nIGNvbXBvbmVudCBuZWVkcyB0byBpZ25vcmVcbi8vIHRoZSBkZXBlbmRlbmNpZXMgZm9yIEhvb2tzIHRoYXQgbmVlZCB0aGVtIChlLmcuIHVzZUVmZmVjdCBvciB1c2VNZW1vKS5cbi8vIFdoZW4gdHJ1ZSwgc3VjaCBIb29rcyB3aWxsIGFsd2F5cyBiZSBcInJlbW91bnRlZFwiLiBPbmx5IHVzZWQgZHVyaW5nIGhvdCByZWxvYWQuXG5cbnZhciBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBtb3VudEhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiA9PT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzRGV2ID0gW2hvb2tOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va1R5cGVzRGV2LnB1c2goaG9va05hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2Kys7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXZbaG9va1R5cGVzVXBkYXRlSW5kZXhEZXZdICE9PSBob29rTmFtZSkge1xuICAgICAgICB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihob29rTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpIHtcbiAge1xuICAgIGlmIChkZXBzICE9PSB1bmRlZmluZWQgJiYgZGVwcyAhPT0gbnVsbCAmJiAhaXNBcnJheShkZXBzKSkge1xuICAgICAgLy8gVmVyaWZ5IGRlcHMsIGJ1dCBvbmx5IG9uIG1vdW50IHRvIGF2b2lkIGV4dHJhIGNoZWNrcy5cbiAgICAgIC8vIEl0J3MgdW5saWtlbHkgdGhlaXIgdHlwZSB3b3VsZCBjaGFuZ2UgYXMgdXN1YWxseSB5b3UgZGVmaW5lIHRoZW0gaW5saW5lLlxuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkgKGluc3RlYWQsIHJlY2VpdmVkIGAlc2ApLiBXaGVuICcgKyAnc3BlY2lmaWVkLCB0aGUgZmluYWwgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheS4nLCBjdXJyZW50SG9va05hbWVJbkRldiwgdHlwZW9mIGRlcHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihjdXJyZW50SG9va05hbWUpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxKTtcblxuICAgIGlmICghZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgdGFibGUgPSAnJztcbiAgICAgICAgdmFyIHNlY29uZENvbHVtblN0YXJ0ID0gMzA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXY7IGkrKykge1xuICAgICAgICAgIHZhciBvbGRIb29rTmFtZSA9IGhvb2tUeXBlc0RldltpXTtcbiAgICAgICAgICB2YXIgbmV3SG9va05hbWUgPSBpID09PSBob29rVHlwZXNVcGRhdGVJbmRleERldiA/IGN1cnJlbnRIb29rTmFtZSA6IG9sZEhvb2tOYW1lO1xuICAgICAgICAgIHZhciByb3cgPSBpICsgMSArIFwiLiBcIiArIG9sZEhvb2tOYW1lOyAvLyBFeHRyYSBzcGFjZSBzbyBzZWNvbmQgY29sdW1uIGxpbmVzIHVwXG4gICAgICAgICAgLy8gbG9sIEAgSUUgbm90IHN1cHBvcnRpbmcgU3RyaW5nI3JlcGVhdFxuXG4gICAgICAgICAgd2hpbGUgKHJvdy5sZW5ndGggPCBzZWNvbmRDb2x1bW5TdGFydCkge1xuICAgICAgICAgICAgcm93ICs9ICcgJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByb3cgKz0gbmV3SG9va05hbWUgKyAnXFxuJztcbiAgICAgICAgICB0YWJsZSArPSByb3c7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignUmVhY3QgaGFzIGRldGVjdGVkIGEgY2hhbmdlIGluIHRoZSBvcmRlciBvZiBIb29rcyBjYWxsZWQgYnkgJXMuICcgKyAnVGhpcyB3aWxsIGxlYWQgdG8gYnVncyBhbmQgZXJyb3JzIGlmIG5vdCBmaXhlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVhZCB0aGUgUnVsZXMgb2YgSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rc1xcblxcbicgKyAnICAgUHJldmlvdXMgcmVuZGVyICAgICAgICAgICAgTmV4dCByZW5kZXJcXG4nICsgJyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicgKyAnJXMnICsgJyAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxcbicsIGNvbXBvbmVudE5hbWUsIHRhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dJbnZhbGlkSG9va0Vycm9yKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3InICsgJyBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuJyArICcyLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuJyArICczLiBZb3UgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QgaW4gdGhlIHNhbWUgYXBwXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS4nKTtcbn1cblxuZnVuY3Rpb24gYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykge1xuICB7XG4gICAgaWYgKGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzKSB7XG4gICAgICAvLyBPbmx5IHRydWUgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyBiZWluZyBob3QgcmVsb2FkZWQuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByZXZEZXBzID09PSBudWxsKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgbm90IGR1cmluZyAnICsgJ3RoZSBwcmV2aW91cyByZW5kZXIuIEV2ZW4gdGhvdWdoIHRoZSBmaW5hbCBhcmd1bWVudCBpcyBvcHRpb25hbCwgJyArICdpdHMgdHlwZSBjYW5ub3QgY2hhbmdlIGJldHdlZW4gcmVuZGVycy4nLCBjdXJyZW50SG9va05hbWVJbkRldik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAge1xuICAgIC8vIERvbid0IGJvdGhlciBjb21wYXJpbmcgbGVuZ3RocyBpbiBwcm9kIGJlY2F1c2UgdGhlc2UgYXJyYXlzIHNob3VsZCBiZVxuICAgIC8vIHBhc3NlZCBpbmxpbmUuXG4gICAgaWYgKG5leHREZXBzLmxlbmd0aCAhPT0gcHJldkRlcHMubGVuZ3RoKSB7XG4gICAgICBlcnJvcignVGhlIGZpbmFsIGFyZ3VtZW50IHBhc3NlZCB0byAlcyBjaGFuZ2VkIHNpemUgYmV0d2VlbiByZW5kZXJzLiBUaGUgJyArICdvcmRlciBhbmQgc2l6ZSBvZiB0aGlzIGFycmF5IG11c3QgcmVtYWluIGNvbnN0YW50LlxcblxcbicgKyAnUHJldmlvdXM6ICVzXFxuJyArICdJbmNvbWluZzogJXMnLCBjdXJyZW50SG9va05hbWVJbkRldiwgXCJbXCIgKyBwcmV2RGVwcy5qb2luKCcsICcpICsgXCJdXCIsIFwiW1wiICsgbmV4dERlcHMuam9pbignLCAnKSArIFwiXVwiKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZEZXBzLmxlbmd0aCAmJiBpIDwgbmV4dERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob2JqZWN0SXMobmV4dERlcHNbaV0sIHByZXZEZXBzW2ldKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgc2Vjb25kQXJnLCBuZXh0UmVuZGVyTGFuZXMpIHtcbiAgcmVuZGVyTGFuZXMgPSBuZXh0UmVuZGVyTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSB3b3JrSW5Qcm9ncmVzcztcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzIDogbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBVc2VkIGZvciBob3QgcmVsb2FkaW5nOlxuXG4gICAgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lczsgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzZXRcbiAgLy8gY3VycmVudEhvb2sgPSBudWxsO1xuICAvLyB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuICAvLyBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gIC8vIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgLy8gVE9ETyBXYXJuIGlmIG5vIGhvb2tzIGFyZSB1c2VkIGF0IGFsbCBkdXJpbmcgbW91bnQsIHRoZW4gc29tZSBhcmUgdXNlZCBkdXJpbmcgdXBkYXRlLlxuICAvLyBDdXJyZW50bHkgd2Ugd2lsbCBpZGVudGlmeSB0aGUgdXBkYXRlIHJlbmRlciBhcyBhIG1vdW50IGJlY2F1c2UgbWVtb2l6ZWRTdGF0ZSA9PT0gbnVsbC5cbiAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSlcbiAgLy8gVXNpbmcgbWVtb2l6ZWRTdGF0ZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbW91bnQvdXBkYXRlIG9ubHkgd29ya3MgaWYgYXQgbGVhc3Qgb25lIHN0YXRlZnVsIGhvb2sgaXMgdXNlZC5cbiAgLy8gTm9uLXN0YXRlZnVsIGhvb2tzIChlLmcuIGNvbnRleHQpIGRvbid0IGdldCBhZGRlZCB0byBtZW1vaXplZFN0YXRlLFxuICAvLyBzbyBtZW1vaXplZFN0YXRlIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy5cblxuICB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgfSBlbHNlIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBoYW5kbGVzIGFuIGVkZ2UgY2FzZSB3aGVyZSBhIGNvbXBvbmVudCBpcyB1cGRhdGluZyxcbiAgICAgIC8vIGJ1dCBubyBzdGF0ZWZ1bCBob29rcyBoYXZlIGJlZW4gdXNlZC5cbiAgICAgIC8vIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3Rpb24gY29kZSBiZWhhdmlvciAod2hpY2ggd2lsbCB1c2UgSG9va3NEaXNwYXRjaGVyT25Nb3VudCksXG4gICAgICAvLyBidXQgd2l0aCB0aGUgZXh0cmEgREVWIHZhbGlkYXRpb24gdG8gZW5zdXJlIGhvb2tzIG9yZGVyaW5nIGhhc24ndCBjaGFuZ2VkLlxuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGRvZXMgdGhhdC5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVjtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpOyAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlXG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcykge1xuICAgIC8vIEtlZXAgcmVuZGVyaW5nIGluIGEgbG9vcCBmb3IgYXMgbG9uZyBhcyByZW5kZXIgcGhhc2UgdXBkYXRlcyBjb250aW51ZSB0b1xuICAgIC8vIGJlIHNjaGVkdWxlZC4gVXNlIGEgY291bnRlciB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLlxuICAgIHZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbiAgICAgIGxvY2FsSWRDb3VudGVyID0gMDtcblxuICAgICAgaWYgKG51bWJlck9mUmVSZW5kZXJzID49IFJFX1JFTkRFUl9MSU1JVCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBtYW55IHJlLXJlbmRlcnMuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlbmRlcnMgdG8gcHJldmVudCAnICsgJ2FuIGluZmluaXRlIGxvb3AuJyk7XG4gICAgICB9XG5cbiAgICAgIG51bWJlck9mUmVSZW5kZXJzICs9IDE7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gRXZlbiB3aGVuIGhvdCByZWxvYWRpbmcsIGFsbG93IGRlcGVuZGVuY2llcyB0byBzdGFiaWxpemVcbiAgICAgICAgLy8gYWZ0ZXIgZmlyc3QgcmVuZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuXG4gICAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICB9IC8vIFN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cblxuICAgICAgY3VycmVudEhvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAge1xuICAgICAgICAvLyBBbHNvIHZhbGlkYXRlIGhvb2sgb3JkZXIgZm9yIGNhc2NhZGluZyB1cGRhdGVzLlxuICAgICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgICAgfVxuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9ICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgO1xuICAgICAgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gICAgfSB3aGlsZSAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKTtcbiAgfSAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jZS5cblxuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBob29rVHlwZXNEZXY7XG4gIH0gLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuXG4gIC8vIGhvb2tUeXBlc0RldiBjb3VsZCBjYXRjaCBtb3JlIGNhc2VzIChlLmcuIGNvbnRleHQpIGJ1dCBvbmx5IGluIERFViBidW5kbGVzLlxuXG5cbiAgdmFyIGRpZFJlbmRlclRvb0Zld0hvb2tzID0gY3VycmVudEhvb2sgIT09IG51bGwgJiYgY3VycmVudEhvb2submV4dCAhPT0gbnVsbDtcbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBDb25maXJtIHRoYXQgYSBzdGF0aWMgZmxhZyB3YXMgbm90IGFkZGVkIG9yIHJlbW92ZWQgc2luY2UgdGhlIGxhc3RcbiAgICAvLyByZW5kZXIuIElmIHRoaXMgZmlyZXMsIGl0IHN1Z2dlc3RzIHRoYXQgd2UgaW5jb3JyZWN0bHkgcmVzZXQgdGhlIHN0YXRpY1xuICAgIC8vIGZsYWdzIGluIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgY29kZWJhc2UuIFRoaXMgaGFzIGhhcHBlbmVkIGJlZm9yZSwgZm9yXG4gICAgLy8gZXhhbXBsZSwgaW4gdGhlIFN1c3BlbnNlTGlzdCBpbXBsZW1lbnRhdGlvbi5cblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmZsYWdzICYgU3RhdGljTWFzaykgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIFN0YXRpY01hc2spICYmIC8vIERpc2FibGUgdGhpcyB3YXJuaW5nIGluIGxlZ2FjeSBtb2RlLCBiZWNhdXNlIGxlZ2FjeSBTdXNwZW5zZSBpcyB3ZWlyZFxuICAgIC8vIGFuZCBjcmVhdGVzIGZhbHNlIHBvc2l0aXZlcy4gVG8gbWFrZSB0aGlzIHdvcmsgaW4gbGVnYWN5IG1vZGUsIHdlJ2RcbiAgICAvLyBuZWVkIHRvIG1hcmsgZmliZXJzIHRoYXQgY29tbWl0IGluIGFuIGluY29tcGxldGUgc3RhdGUsIHNvbWVob3cuIEZvclxuICAgIC8vIG5vdyBJJ2xsIGRpc2FibGUgdGhlIHdhcm5pbmcgdGhhdCBtb3N0IG9mIHRoZSBidWdzIHRoYXQgd291bGQgdHJpZ2dlclxuICAgIC8vIGl0IGFyZSBlaXRoZXIgZXhjbHVzaXZlIHRvIGNvbmN1cnJlbnQgbW9kZSBvciBleGlzdCBpbiBib3RoLlxuICAgIChjdXJyZW50Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZXJyb3IoJ0ludGVybmFsIFJlYWN0IGVycm9yOiBFeHBlY3RlZCBzdGF0aWMgZmxhZyB3YXMgbWlzc2luZy4gUGxlYXNlICcgKyAnbm90aWZ5IHRoZSBSZWFjdCB0ZWFtLicpO1xuICAgIH1cbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gVGhpcyBpcyByZXNldCBieSBjaGVja0RpZFJlbmRlcklkSG9va1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgaWYgKGRpZFJlbmRlclRvb0Zld0hvb2tzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZW5kZXJlZCBmZXdlciBob29rcyB0aGFuIGV4cGVjdGVkLiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYW4gYWNjaWRlbnRhbCAnICsgJ2Vhcmx5IHJldHVybiBzdGF0ZW1lbnQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5mdW5jdGlvbiBjaGVja0RpZFJlbmRlcklkSG9vaygpIHtcbiAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGV2ZXJ5IHJlbmRlcldpdGhIb29rcyBjYWxsLlxuICAvLyBDb25jZXB0dWFsbHksIGl0J3MgcGFydCBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIHJlbmRlcldpdGhIb29rczsgaXQncyBvbmx5IGFcbiAgLy8gc2VwYXJhdGUgZnVuY3Rpb24gdG8gYXZvaWQgdXNpbmcgYW4gYXJyYXkgdHVwbGUuXG4gIHZhciBkaWRSZW5kZXJJZEhvb2sgPSBsb2NhbElkQ291bnRlciAhPT0gMDtcbiAgbG9jYWxJZENvdW50ZXIgPSAwO1xuICByZXR1cm4gZGlkUmVuZGVySWRIb29rO1xufVxuZnVuY3Rpb24gYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBsYW5lcykge1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gcmVzZXQgdGhlIGZsYWdzIGhlcmUsIGJlY2F1c2UgdGhleSdyZSByZXNldCBpbiB0aGVcbiAgLy8gY29tcGxldGUgcGhhc2UgKGJ1YmJsZVByb3BlcnRpZXMpLlxuXG4gIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH4oTW91bnRQYXNzaXZlRGV2IHwgTW91bnRMYXlvdXREZXYgfCBQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpO1xuICB9XG5cbiAgY3VycmVudC5sYW5lcyA9IHJlbW92ZUxhbmVzKGN1cnJlbnQubGFuZXMsIGxhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0SG9va3NBZnRlclRocm93KCkge1xuICAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jZS5cbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUpIHtcbiAgICAvLyBUaGVyZSB3ZXJlIHJlbmRlciBwaGFzZSB1cGRhdGVzLiBUaGVzZSBhcmUgb25seSB2YWxpZCBmb3IgdGhpcyByZW5kZXJcbiAgICAvLyBwaGFzZSwgd2hpY2ggd2UgYXJlIG5vdyBhYm9ydGluZy4gUmVtb3ZlIHRoZSB1cGRhdGVzIGZyb20gdGhlIHF1ZXVlcyBzb1xuICAgIC8vIHRoZXkgZG8gbm90IHBlcnNpc3QgdG8gdGhlIG5leHQgcmVuZGVyLiBEbyBub3QgcmVtb3ZlIHVwZGF0ZXMgZnJvbSBob29rc1xuICAgIC8vIHRoYXQgd2VyZW4ndCBwcm9jZXNzZWQuXG4gICAgLy9cbiAgICAvLyBPbmx5IHJlc2V0IHRoZSB1cGRhdGVzIGZyb20gdGhlIHF1ZXVlIGlmIGl0IGhhcyBhIGNsb25lLiBJZiBpdCBkb2VzXG4gICAgLy8gbm90IGhhdmUgYSBjbG9uZSwgdGhhdCBtZWFucyBpdCB3YXNuJ3QgcHJvY2Vzc2VkLCBhbmQgdGhlIHVwZGF0ZXMgd2VyZVxuICAgIC8vIHNjaGVkdWxlZCBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIHZhciBob29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuXG4gICAgd2hpbGUgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaG9vayA9IGhvb2submV4dDtcbiAgICB9XG5cbiAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gIH1cblxuICByZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsO1xuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIHZhciBob29rID0ge1xuICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgYmFzZVN0YXRlOiBudWxsLFxuICAgIGJhc2VRdWV1ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3RcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYm90aCBmb3IgdXBkYXRlcyBhbmQgZm9yIHJlLXJlbmRlcnMgdHJpZ2dlcmVkIGJ5IGFcbiAgLy8gcmVuZGVyIHBoYXNlIHVwZGF0ZS4gSXQgYXNzdW1lcyB0aGVyZSBpcyBlaXRoZXIgYSBjdXJyZW50IGhvb2sgd2UgY2FuXG4gIC8vIGNsb25lLCBvciBhIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBmcm9tIGEgcHJldmlvdXMgcmVuZGVyIHBhc3MgdGhhdCB3ZSBjYW5cbiAgLy8gdXNlIGFzIGEgYmFzZS4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBiYXNlIGxpc3QsIHdlIG11c3Qgc3dpdGNoIHRvXG4gIC8vIHRoZSBkaXNwYXRjaGVyIHVzZWQgZm9yIG1vdW50cy5cbiAgdmFyIG5leHRDdXJyZW50SG9vaztcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgfVxuXG4gIHZhciBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuICB9IGVsc2Uge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgfVxuXG4gIGlmIChuZXh0V29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuXG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbmV4dFdvcmtJblByb2dyZXNzSG9vaztcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2xvbmUgZnJvbSB0aGUgY3VycmVudCBob29rLlxuICAgIGlmIChuZXh0Q3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgbW9yZSBob29rcyB0aGFuIGR1cmluZyB0aGUgcHJldmlvdXMgcmVuZGVyLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICAgIHZhciBuZXdIb29rID0ge1xuICAgICAgbWVtb2l6ZWRTdGF0ZTogY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudEhvb2suYmFzZVN0YXRlLFxuICAgICAgYmFzZVF1ZXVlOiBjdXJyZW50SG9vay5iYXNlUXVldWUsXG4gICAgICBxdWV1ZTogY3VycmVudEhvb2sucXVldWUsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3QuXG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXdIb29rO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gbmV3SG9vaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NIb29rO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCkge1xuICByZXR1cm4ge1xuICAgIGxhc3RFZmZlY3Q6IG51bGwsXG4gICAgc3RvcmVzOiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJhc2ljU3RhdGVSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgcmV0dXJuIHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicgPyBhY3Rpb24oc3RhdGUpIDogYWN0aW9uO1xufVxuXG5mdW5jdGlvbiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBpbml0aWFsU3RhdGU7XG5cbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXQoaW5pdGlhbEFyZyk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbEFyZztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSB7XG4gICAgcGVuZGluZzogbnVsbCxcbiAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICBsYW5lczogTm9MYW5lcyxcbiAgICBkaXNwYXRjaDogbnVsbCxcbiAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiByZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoUmVkdWNlckFjdGlvbi5iaW5kKG51bGwsIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIHF1ZXVlKTtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnQgPSBjdXJyZW50SG9vazsgLy8gVGhlIGxhc3QgcmViYXNlIHVwZGF0ZSB0aGF0IGlzIE5PVCBwYXJ0IG9mIHRoZSBiYXNlIHN0YXRlLlxuXG4gIHZhciBiYXNlUXVldWUgPSBjdXJyZW50LmJhc2VRdWV1ZTsgLy8gVGhlIGxhc3QgcGVuZGluZyB1cGRhdGUgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIG5ldyB1cGRhdGVzIHRoYXQgaGF2ZW4ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG4gICAgLy8gV2UnbGwgYWRkIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG4gICAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gTWVyZ2UgdGhlIHBlbmRpbmcgcXVldWUgYW5kIHRoZSBiYXNlIHF1ZXVlLlxuICAgICAgdmFyIGJhc2VGaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgICAgdmFyIHBlbmRpbmdGaXJzdCA9IHBlbmRpbmdRdWV1ZS5uZXh0O1xuICAgICAgYmFzZVF1ZXVlLm5leHQgPSBwZW5kaW5nRmlyc3Q7XG4gICAgICBwZW5kaW5nUXVldWUubmV4dCA9IGJhc2VGaXJzdDtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3VycmVudC5iYXNlUXVldWUgIT09IGJhc2VRdWV1ZSkge1xuICAgICAgICAvLyBJbnRlcm5hbCBpbnZhcmlhbnQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZmVhc2libHkgY291bGQgaW5cbiAgICAgICAgLy8gdGhlIGZ1dHVyZSBpZiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcsIG9yIHNvbWUgZm9ybSBvZiB0aGF0LlxuICAgICAgICBlcnJvcignSW50ZXJuYWwgZXJyb3I6IEV4cGVjdGVkIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgdG8gYmUgYSBjbG9uZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnQuYmFzZVF1ZXVlID0gYmFzZVF1ZXVlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgYSBxdWV1ZSB0byBwcm9jZXNzLlxuICAgIHZhciBmaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgIHZhciBuZXdTdGF0ZSA9IGN1cnJlbnQuYmFzZVN0YXRlO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVGaXJzdCA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUxhc3QgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdCYXNlUXVldWVGaXJzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuICAgICAgICAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIGFjY3VtdWxhdGUgdGhpcy4gSW5zdGVhZCwgd2UgY2FuIHJlbW92ZVxuICAgICAgICAvLyByZW5kZXJMYW5lcyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9jbG9uZSA9IHtcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IF9jbG9uZTtcbiAgICAgICAgfSAvLyBQcm9jZXNzIHRoaXMgdXBkYXRlLlxuXG5cbiAgICAgICAgaWYgKHVwZGF0ZS5oYXNFYWdlclN0YXRlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyB1cGRhdGUgaXMgYSBzdGF0ZSB1cGRhdGUgKG5vdCBhIHJlZHVjZXIpIGFuZCB3YXMgcHJvY2Vzc2VkIGVhZ2VybHksXG4gICAgICAgICAgLy8gd2UgY2FuIHVzZSB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZVxuICAgICAgICAgIG5ld1N0YXRlID0gdXBkYXRlLmVhZ2VyU3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCAmJiB1cGRhdGUgIT09IGZpcnN0KTtcblxuICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gbmV3QmFzZVF1ZXVlRmlyc3Q7XG4gICAgfSAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgaG9vay5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAvLyBwcm9jZXNzIHRoZW0gZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgd2UgZG8gbmVlZCB0byB0cmFjayB3aGljaCBsYW5lc1xuICAvLyBhcmUgcmVtYWluaW5nLlxuXG5cbiAgdmFyIGxhc3RJbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChsYXN0SW50ZXJsZWF2ZWQgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWRMYW5lID0gaW50ZXJsZWF2ZWQubGFuZTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIGludGVybGVhdmVkTGFuZSk7XG4gICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGludGVybGVhdmVkTGFuZSk7XG4gICAgICBpbnRlcmxlYXZlZCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gIH0gZWxzZSBpZiAoYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gYHF1ZXVlLmxhbmVzYCBpcyB1c2VkIGZvciBlbnRhbmdsaW5nIHRyYW5zaXRpb25zLiBXZSBjYW4gc2V0IGl0IGJhY2sgdG9cbiAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgIHF1ZXVlLmxhbmVzID0gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7IC8vIFRoaXMgaXMgYSByZS1yZW5kZXIuIEFwcGx5IHRoZSBuZXcgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgdG8gdGhlIHByZXZpb3VzXG4gIC8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgdmFyIGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IHF1ZXVlLnBlbmRpbmc7XG4gIHZhciBuZXdTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobGFzdFJlbmRlclBoYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHF1ZXVlIGRvZXNuJ3QgcGVyc2lzdCBwYXN0IHRoaXMgcmVuZGVyIHBhc3MuXG4gICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgdmFyIGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUgPSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIC8vIFByb2Nlc3MgdGhpcyByZW5kZXIgcGhhc2UgdXBkYXRlLiBXZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZVxuICAgICAgLy8gcHJpb3JpdHkgYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBhcyB0aGUgY3VycmVudFxuICAgICAgLy8gcmVuZGVyJ3MuXG4gICAgICB2YXIgYWN0aW9uID0gdXBkYXRlLmFjdGlvbjtcbiAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSk7IC8vIE1hcmsgdGhhdCB0aGUgZmliZXIgcGVyZm9ybWVkIHdvcmssIGJ1dCBvbmx5IGlmIHRoZSBuZXcgc3RhdGUgaXNcbiAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS5cblxuXG4gICAgaWYgKCFvYmplY3RJcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSkge1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTsgLy8gRG9uJ3QgcGVyc2lzdCB0aGUgc3RhdGUgYWNjdW11bGF0ZWQgZnJvbSB0aGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgdG9cbiAgICAvLyB0aGUgYmFzZSBzdGF0ZSB1bmxlc3MgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgIC8vIFRPRE86IE5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGRlc2lyZWQgc2VtYW50aWNzLCBidXQgaXQncyB3aGF0IHdlXG4gICAgLy8gZG8gZm9yIGdEU0ZQLiBJIGNhbid0IHJlbWVtYmVyIHdoeS5cblxuICAgIGlmIChob29rLmJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9XG5cbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAgcmV0dXJuIFtuZXdTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiBtb3VudE11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dFNuYXBzaG90O1xuICB2YXIgaXNIeWRyYXRpbmcgPSBnZXRJc0h5ZHJhdGluZygpO1xuXG4gIGlmIChpc0h5ZHJhdGluZykge1xuICAgIGlmIChnZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZ2V0U2VydmVyU25hcHNob3QsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciAnICsgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBXaWxsIHJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLicpO1xuICAgIH1cblxuICAgIG5leHRTbmFwc2hvdCA9IGdldFNlcnZlclNuYXBzaG90KCk7XG5cbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICAgIGlmIChuZXh0U25hcHNob3QgIT09IGdldFNlcnZlclNuYXBzaG90KCkpIHtcbiAgICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTZXJ2ZXJTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXh0U25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICB2YXIgY2FjaGVkU25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICAgIGlmICghb2JqZWN0SXMobmV4dFNuYXBzaG90LCBjYWNoZWRTbmFwc2hvdCkpIHtcbiAgICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVW5sZXNzIHdlJ3JlIHJlbmRlcmluZyBhIGJsb2NraW5nIGxhbmUsIHNjaGVkdWxlIGEgY29uc2lzdGVuY3kgY2hlY2suXG4gICAgLy8gUmlnaHQgYmVmb3JlIGNvbW1pdHRpbmcsIHdlIHdpbGwgd2FsayB0aGUgdHJlZSBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZVxuICAgIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQuXG4gICAgLy9cbiAgICAvLyBXZSB3b24ndCBkbyB0aGlzIGlmIHdlJ3JlIGh5ZHJhdGluZyBzZXJ2ZXItcmVuZGVyZWQgY29udGVudCwgYmVjYXVzZSBpZlxuICAgIC8vIHRoZSBjb250ZW50IGlzIHN0YWxlLCBpdCdzIGFscmVhZHkgdmlzaWJsZSBhbnl3YXkuIEluc3RlYWQgd2UnbGwgcGF0Y2hcbiAgICAvLyBpdCB1cCBpbiBhIHBhc3NpdmUgZWZmZWN0LlxuXG5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB3b3JrLWluLXByb2dyZXNzIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmICghaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICB9XG4gIH0gLy8gUmVhZCB0aGUgY3VycmVudCBzbmFwc2hvdCBmcm9tIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXIuIFRoaXMgYnJlYWtzIHRoZVxuICAvLyBub3JtYWwgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmUgdXBkYXRlcyBhcmVcbiAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLlxuXG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV4dFNuYXBzaG90O1xuICB2YXIgaW5zdCA9IHtcbiAgICB2YWx1ZTogbmV4dFNuYXBzaG90LFxuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdFxuICB9O1xuICBob29rLnF1ZXVlID0gaW5zdDsgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmUuXG5cbiAgbW91bnRFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byB1cGRhdGUgdGhlIG11dGFibGUgaW5zdGFuY2UgZmllbGRzLiBXZSB3aWxsIHVwZGF0ZVxuICAvLyB0aGlzIHdoZW5ldmVyIHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIG9yIHZhbHVlIGNoYW5nZXMuIEJlY2F1c2UgdGhlcmUncyBub1xuICAvLyBjbGVhbi11cCBmdW5jdGlvbiwgYW5kIHdlIHRyYWNrIHRoZSBkZXBzIGNvcnJlY3RseSwgd2UgY2FuIGNhbGwgcHVzaEVmZmVjdFxuICAvLyBkaXJlY3RseSwgd2l0aG91dCBzdG9yaW5nIGFueSBhZGRpdGlvbmFsIHN0YXRlLiBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZVxuICAvLyBkb24ndCBuZWVkIHRvIHNldCBhIHN0YXRpYyBmbGFnLCBlaXRoZXIuXG4gIC8vIFRPRE86IFdlIGNhbiBtb3ZlIHRoaXMgdG8gdGhlIHBhc3NpdmUgcGhhc2Ugb25jZSB3ZSBhZGQgYSBwcmUtY29tbWl0XG4gIC8vIGNvbnNpc3RlbmN5IGNoZWNrLiBTZWUgdGhlIG5leHQgY29tbWVudC5cblxuICBmaWJlci5mbGFncyB8PSBQYXNzaXZlO1xuICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTtcbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTsgLy8gUmVhZCB0aGUgY3VycmVudCBzbmFwc2hvdCBmcm9tIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXIuIFRoaXMgYnJlYWtzIHRoZVxuICAvLyBub3JtYWwgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmUgdXBkYXRlcyBhcmVcbiAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLlxuXG4gIHZhciBuZXh0U25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICB2YXIgY2FjaGVkU25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcHJldlNuYXBzaG90ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICB2YXIgc25hcHNob3RDaGFuZ2VkID0gIW9iamVjdElzKHByZXZTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcblxuICBpZiAoc25hcHNob3RDaGFuZ2VkKSB7XG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV4dFNuYXBzaG90O1xuICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gIH1cblxuICB2YXIgaW5zdCA9IGhvb2sucXVldWU7XG4gIHVwZGF0ZUVmZmVjdChzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIHN1YnNjcmliZSksIFtzdWJzY3JpYmVdKTsgLy8gV2hlbmV2ZXIgZ2V0U25hcHNob3Qgb3Igc3Vic2NyaWJlIGNoYW5nZXMsIHdlIG5lZWQgdG8gY2hlY2sgaW4gdGhlXG4gIC8vIGNvbW1pdCBwaGFzZSBpZiB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgbXV0YXRpb24uIEluIGNvbmN1cnJlbnQgbW9kZVxuICAvLyB0aGlzIGNhbiBoYXBwZW4gYWxsIHRoZSB0aW1lLCBidXQgZXZlbiBpbiBzeW5jaHJvbm91cyBtb2RlLCBhbiBlYXJsaWVyXG4gIC8vIGVmZmVjdCBtYXkgaGF2ZSBtdXRhdGVkIHRoZSBzdG9yZS5cblxuICBpZiAoaW5zdC5nZXRTbmFwc2hvdCAhPT0gZ2V0U25hcHNob3QgfHwgc25hcHNob3RDaGFuZ2VkIHx8IC8vIENoZWNrIGlmIHRoZSBzdXNiY3JpYmUgZnVuY3Rpb24gY2hhbmdlZC4gV2UgY2FuIHNhdmUgc29tZSBtZW1vcnkgYnlcbiAgLy8gY2hlY2tpbmcgd2hldGhlciB3ZSBzY2hlZHVsZWQgYSBzdWJzY3JpcHRpb24gZWZmZWN0IGFib3ZlLlxuICB3b3JrSW5Qcm9ncmVzc0hvb2sgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3NIb29rLm1lbW9pemVkU3RhdGUudGFnICYgSGFzRWZmZWN0KSB7XG4gICAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTsgLy8gVW5sZXNzIHdlJ3JlIHJlbmRlcmluZyBhIGJsb2NraW5nIGxhbmUsIHNjaGVkdWxlIGEgY29uc2lzdGVuY3kgY2hlY2suXG4gICAgLy8gUmlnaHQgYmVmb3JlIGNvbW1pdHRpbmcsIHdlIHdpbGwgd2FsayB0aGUgdHJlZSBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZVxuICAgIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQuXG5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB3b3JrLWluLXByb2dyZXNzIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmICghaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFNuYXBzaG90O1xufVxuXG5mdW5jdGlvbiBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgcmVuZGVyZWRTbmFwc2hvdCkge1xuICBmaWJlci5mbGFncyB8PSBTdG9yZUNvbnNpc3RlbmN5O1xuICB2YXIgY2hlY2sgPSB7XG4gICAgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90LFxuICAgIHZhbHVlOiByZW5kZXJlZFNuYXBzaG90XG4gIH07XG4gIHZhciBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWU7XG5cbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZSA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlO1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcyA9IFtjaGVja107XG4gIH0gZWxzZSB7XG4gICAgdmFyIHN0b3JlcyA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcztcblxuICAgIGlmIChzdG9yZXMgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcyA9IFtjaGVja107XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3Jlcy5wdXNoKGNoZWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlU3RvcmVJbnN0YW5jZShmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCkge1xuICAvLyBUaGVzZSBhcmUgdXBkYXRlZCBpbiB0aGUgcGFzc2l2ZSBwaGFzZVxuICBpbnN0LnZhbHVlID0gbmV4dFNuYXBzaG90O1xuICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7IC8vIFNvbWV0aGluZyBtYXkgaGF2ZSBiZWVuIG11dGF0ZWQgaW4gYmV0d2VlbiByZW5kZXIgYW5kIGNvbW1pdC4gVGhpcyBjb3VsZFxuICAvLyBoYXZlIGJlZW4gaW4gYW4gZXZlbnQgdGhhdCBmaXJlZCBiZWZvcmUgdGhlIHBhc3NpdmUgZWZmZWN0cywgb3IgaXQgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGEgbGF5b3V0IGVmZmVjdC4gSW4gdGhhdCBjYXNlLCB3ZSB3b3VsZCBoYXZlIHVzZWQgdGhlIG9sZFxuICAvLyBzbmFwc2hvIGFuZCBnZXRTbmFwc2hvdCB2YWx1ZXMgdG8gYmFpbCBvdXQuIFdlIG5lZWQgdG8gY2hlY2sgb25lIG1vcmUgdGltZS5cblxuICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlVG9TdG9yZShmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSB7XG4gIHZhciBoYW5kbGVTdG9yZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGUgc3RvcmUgY2hhbmdlZC4gQ2hlY2sgaWYgdGhlIHNuYXBzaG90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZVxuICAgIC8vIHJlYWQgZnJvbSB0aGUgc3RvcmUuXG4gICAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgICAgZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKTtcbiAgICB9XG4gIH07IC8vIFN1YnNjcmliZSB0byB0aGUgc3RvcmUgYW5kIHJldHVybiBhIGNsZWFuLXVwIGZ1bmN0aW9uLlxuXG5cbiAgcmV0dXJuIHN1YnNjcmliZShoYW5kbGVTdG9yZUNoYW5nZSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkge1xuICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSBpbnN0LmdldFNuYXBzaG90O1xuICB2YXIgcHJldlZhbHVlID0gaW5zdC52YWx1ZTtcblxuICB0cnkge1xuICAgIHZhciBuZXh0VmFsdWUgPSBsYXRlc3RHZXRTbmFwc2hvdCgpO1xuICAgIHJldHVybiAhb2JqZWN0SXMocHJldlZhbHVlLCBuZXh0VmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcikge1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlKCk7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICBob29rLnF1ZXVlID0gcXVldWU7XG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoID0gZGlzcGF0Y2hTZXRTdGF0ZS5iaW5kKG51bGwsIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIHF1ZXVlKTtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiB1cGRhdGVSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHB1c2hFZmZlY3QodGFnLCBjcmVhdGUsIGRlc3Ryb3ksIGRlcHMpIHtcbiAgdmFyIGVmZmVjdCA9IHtcbiAgICB0YWc6IHRhZyxcbiAgICBjcmVhdGU6IGNyZWF0ZSxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIGRlcHM6IGRlcHMsXG4gICAgLy8gQ2lyY3VsYXJcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHZhciBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWU7XG5cbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZSA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlO1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFzdEVmZmVjdCA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG5cbiAgICBpZiAobGFzdEVmZmVjdCA9PT0gbnVsbCkge1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICBsYXN0RWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgICBlZmZlY3QubmV4dCA9IGZpcnN0RWZmZWN0O1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWZmZWN0O1xufVxuXG5mdW5jdGlvbiBtb3VudFJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIHtcbiAgICB2YXIgX3JlZjIgPSB7XG4gICAgICBjdXJyZW50OiBpbml0aWFsVmFsdWVcbiAgICB9O1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IF9yZWYyO1xuICAgIHJldHVybiBfcmVmMjtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHJldHVybiBob29rLm1lbW9pemVkU3RhdGU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIHVuZGVmaW5lZCwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgZGVzdHJveSA9IHVuZGVmaW5lZDtcblxuICBpZiAoY3VycmVudEhvb2sgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldkVmZmVjdCA9IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gICAgZGVzdHJveSA9IHByZXZFZmZlY3QuZGVzdHJveTtcblxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldkVmZmVjdC5kZXBzO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHJldHVybiBtb3VudEVmZmVjdEltcGwoTW91bnRQYXNzaXZlRGV2IHwgUGFzc2l2ZSB8IFBhc3NpdmVTdGF0aWMsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChQYXNzaXZlLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFVwZGF0ZSwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QoY3JlYXRlLCByZWYpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVmQ2FsbGJhY2sgPSByZWY7XG5cbiAgICB2YXIgX2luc3QgPSBjcmVhdGUoKTtcblxuICAgIHJlZkNhbGxiYWNrKF9pbnN0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmQ2FsbGJhY2sobnVsbCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVmT2JqZWN0ID0gcmVmO1xuXG4gICAge1xuICAgICAgaWYgKCFyZWZPYmplY3QuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIGZpcnN0IGFyZ3VtZW50IHRvIGVpdGhlciBiZSBhICcgKyAncmVmIGNhbGxiYWNrIG9yIFJlYWN0LmNyZWF0ZVJlZigpIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgJ2FuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhyZWZPYmplY3QpLmpvaW4oJywgJykgKyAnfScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfaW5zdDIgPSBjcmVhdGUoKTtcblxuICAgIHJlZk9iamVjdC5jdXJyZW50ID0gX2luc3QyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZPYmplY3QuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICB7XG4gICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gIH1cblxuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gIH1cblxuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIExheW91dCwgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSwgZWZmZWN0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIExheW91dCwgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSwgZWZmZWN0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHsvLyBUaGlzIGhvb2sgaXMgbm9ybWFsbHkgYSBuby1vcC5cbiAgLy8gVGhlIHJlYWN0LWRlYnVnLWhvb2tzIHBhY2thZ2UgaW5qZWN0cyBpdHMgb3duIGltcGxlbWVudGF0aW9uXG4gIC8vIHNvIHRoYXQgZS5nLiBEZXZUb29scyBjYW4gZGlzcGxheSBjdXN0b20gaG9vayB2YWx1ZXMuXG59XG5cbnZhciB1cGRhdGVEZWJ1Z1ZhbHVlID0gbW91bnREZWJ1Z1ZhbHVlO1xuXG5mdW5jdGlvbiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gbW91bnRNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEFzc3VtZSB0aGVzZSBhcmUgZGVmaW5lZC4gSWYgdGhleSdyZSBub3QsIGFyZUhvb2tJbnB1dHNFcXVhbCB3aWxsIHdhcm4uXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcmVzb2x2ZWRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rO1xuICB2YXIgcHJldlZhbHVlID0gcmVzb2x2ZWRDdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmIChjdXJyZW50SG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYSBtb3VudC5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlcmVuZGVyIGR1cmluZyBhbiB1cGRhdGUuXG4gICAgdmFyIHByZXZWYWx1ZSA9IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpIHtcbiAgdmFyIHNob3VsZERlZmVyVmFsdWUgPSAhaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMocmVuZGVyTGFuZXMpO1xuXG4gIGlmIChzaG91bGREZWZlclZhbHVlKSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cmdlbnQgdXBkYXRlLiBJZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQsIGtlZXAgdXNpbmcgdGhlXG4gICAgLy8gcHJldmlvdXMgdmFsdWUgYW5kIHNwYXduIGEgZGVmZXJyZWQgcmVuZGVyIHRvIHVwZGF0ZSBpdCBsYXRlci5cbiAgICBpZiAoIW9iamVjdElzKHZhbHVlLCBwcmV2VmFsdWUpKSB7XG4gICAgICAvLyBTY2hlZHVsZSBhIGRlZmVycmVkIHJlbmRlclxuICAgICAgdmFyIGRlZmVycmVkTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCk7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBkZWZlcnJlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhkZWZlcnJlZExhbmUpOyAvLyBTZXQgdGhpcyB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlbmRlcmVkIHZhbHVlIGlzIGluY29uc2lzdGVudFxuICAgICAgLy8gZnJvbSB0aGUgbGF0ZXN0IHZhbHVlLiBUaGUgbmFtZSBcImJhc2VTdGF0ZVwiIGRvZXNuJ3QgcmVhbGx5IG1hdGNoIGhvdyB3ZVxuICAgICAgLy8gdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZyBhIHN0YXRlIGhvb2sgZmllbGQgaW5zdGVhZCBvZiBjcmVhdGluZyBhXG4gICAgICAvLyBuZXcgb25lLlxuXG4gICAgICBob29rLmJhc2VTdGF0ZSA9IHRydWU7XG4gICAgfSAvLyBSZXVzZSB0aGUgcHJldmlvdXMgdmFsdWVcblxuXG4gICAgcmV0dXJuIHByZXZWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIG5vdCBhbiB1cmdlbnQgdXBkYXRlLCBzbyB3ZSBjYW4gdXNlIHRoZSBsYXRlc3QgdmFsdWUgcmVnYXJkbGVzc1xuICAgIC8vIG9mIHdoYXQgaXQgaXMuIE5vIG5lZWQgdG8gZGVmZXIgaXQuXG4gICAgLy8gSG93ZXZlciwgaWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhIHNwYXduZWQgcmVuZGVyLCB0aGVuIHdlIG5lZWQgdG8gbWFya1xuICAgIC8vIHRoaXMgYXMgYW4gdXBkYXRlIHRvIHByZXZlbnQgdGhlIGZpYmVyIGZyb20gYmFpbGluZyBvdXQuXG4gICAgLy9cbiAgICAvLyBgYmFzZVN0YXRlYCBpcyB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJlbmRlcmVkXG4gICAgLy8gdmFsdWUuIFRoZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IG1hdGNoIGhvdyB3ZSB1c2UgaXQgYmVjYXVzZSB3ZSdyZSByZXVzaW5nXG4gICAgLy8gYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIGlmIChob29rLmJhc2VTdGF0ZSkge1xuICAgICAgLy8gRmxpcCB0aGlzIGJhY2sgdG8gZmFsc2UuXG4gICAgICBob29rLmJhc2VTdGF0ZSA9IGZhbHNlO1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNldFBlbmRpbmcsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShoaWdoZXJFdmVudFByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHksIENvbnRpbnVvdXNFdmVudFByaW9yaXR5KSk7XG4gIHNldFBlbmRpbmcodHJ1ZSk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0ge307XG4gIHZhciBjdXJyZW50VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzZXRQZW5kaW5nKGZhbHNlKTtcbiAgICBjYWxsYmFjaygpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFRyYW5zaXRpb24oKSB7XG4gIHZhciBfbW91bnRTdGF0ZSA9IG1vdW50U3RhdGUoZmFsc2UpLFxuICAgICAgaXNQZW5kaW5nID0gX21vdW50U3RhdGVbMF0sXG4gICAgICBzZXRQZW5kaW5nID0gX21vdW50U3RhdGVbMV07IC8vIFRoZSBgc3RhcnRgIG1ldGhvZCBuZXZlciBjaGFuZ2VzLlxuXG5cbiAgdmFyIHN0YXJ0ID0gc3RhcnRUcmFuc2l0aW9uLmJpbmQobnVsbCwgc2V0UGVuZGluZyk7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gc3RhcnQ7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRyYW5zaXRpb24oKSB7XG4gIHZhciBfdXBkYXRlU3RhdGUgPSB1cGRhdGVTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3VwZGF0ZVN0YXRlWzBdO1xuXG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBzdGFydCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIFtpc1BlbmRpbmcsIHN0YXJ0XTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJUcmFuc2l0aW9uKCkge1xuICB2YXIgX3JlcmVuZGVyU3RhdGUgPSByZXJlbmRlclN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfcmVyZW5kZXJTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbnZhciBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudElkKCkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7IC8vIFRPRE86IEluIEZpenosIGlkIGdlbmVyYXRpb24gaXMgc3BlY2lmaWMgdG8gZWFjaCBzZXJ2ZXIgY29uZmlnLiBNYXliZSB3ZVxuICAvLyBzaG91bGQgZG8gdGhpcyBpbiBGaWJlciwgdG9vPyBEZWZlcnJpbmcgdGhpcyBkZWNpc2lvbiBmb3Igbm93IGJlY2F1c2VcbiAgLy8gdGhlcmUncyBubyBvdGhlciBwbGFjZSB0byBzdG9yZSB0aGUgcHJlZml4IGV4Y2VwdCBmb3IgYW4gaW50ZXJuYWwgZmllbGQgb25cbiAgLy8gdGhlIHB1YmxpYyBjcmVhdGVSb290IG9iamVjdCwgd2hpY2ggdGhlIGZpYmVyIHRyZWUgZG9lcyBub3QgY3VycmVudGx5IGhhdmVcbiAgLy8gYSByZWZlcmVuY2UgdG8uXG5cbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSByb290LmlkZW50aWZpZXJQcmVmaXg7XG4gIHZhciBpZDtcblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIHZhciB0cmVlSWQgPSBnZXRUcmVlSWQoKTsgLy8gVXNlIGEgY2FwdGlhbCBSIHByZWZpeCBmb3Igc2VydmVyLWdlbmVyYXRlZCBpZHMuXG5cbiAgICBpZCA9ICc6JyArIGlkZW50aWZpZXJQcmVmaXggKyAnUicgKyB0cmVlSWQ7IC8vIFVubGVzcyB0aGlzIGlzIHRoZSBmaXJzdCBpZCBhdCB0aGlzIGxldmVsLCBhcHBlbmQgYSBudW1iZXIgYXQgdGhlIGVuZFxuICAgIC8vIHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhpcyB1c2VJZCBob29rIGFtb25nIGFsbCB0aGUgdXNlSWRcbiAgICAvLyBob29rcyBmb3IgdGhpcyBmaWJlci5cblxuICAgIHZhciBsb2NhbElkID0gbG9jYWxJZENvdW50ZXIrKztcblxuICAgIGlmIChsb2NhbElkID4gMCkge1xuICAgICAgaWQgKz0gJ0gnICsgbG9jYWxJZC50b1N0cmluZygzMik7XG4gICAgfVxuXG4gICAgaWQgKz0gJzonO1xuICB9IGVsc2Uge1xuICAgIC8vIFVzZSBhIGxvd2VyY2FzZSByIHByZWZpeCBmb3IgY2xpZW50LWdlbmVyYXRlZCBpZHMuXG4gICAgdmFyIGdsb2JhbENsaWVudElkID0gZ2xvYmFsQ2xpZW50SWRDb3VudGVyKys7XG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ3InICsgZ2xvYmFsQ2xpZW50SWQudG9TdHJpbmcoMzIpICsgJzonO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaWQ7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSWQoKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBpZCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFJlZHVjZXJBY3Rpb24oZmliZXIsIHF1ZXVlLCBhY3Rpb24pIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcihcIlN0YXRlIHVwZGF0ZXMgZnJvbSB0aGUgdXNlU3RhdGUoKSBhbmQgdXNlUmVkdWNlcigpIEhvb2tzIGRvbid0IHN1cHBvcnQgdGhlIFwiICsgJ3NlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyICcgKyAncmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIHRoZSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGxhbmU6IGxhbmUsXG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgaGFzRWFnZXJTdGF0ZTogZmFsc2UsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpKSB7XG4gICAgZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKTtcbiAgICB9XG4gIH1cblxuICBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoU2V0U3RhdGUoZmliZXIsIHF1ZXVlLCBhY3Rpb24pIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcihcIlN0YXRlIHVwZGF0ZXMgZnJvbSB0aGUgdXNlU3RhdGUoKSBhbmQgdXNlUmVkdWNlcigpIEhvb2tzIGRvbid0IHN1cHBvcnQgdGhlIFwiICsgJ3NlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyICcgKyAncmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIHRoZSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGxhbmU6IGxhbmUsXG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgaGFzRWFnZXJTdGF0ZTogZmFsc2UsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpKSB7XG4gICAgZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoZmliZXIubGFuZXMgPT09IE5vTGFuZXMgJiYgKGFsdGVybmF0ZSA9PT0gbnVsbCB8fCBhbHRlcm5hdGUubGFuZXMgPT09IE5vTGFuZXMpKSB7XG4gICAgICAvLyBUaGUgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5LCB3aGljaCBtZWFucyB3ZSBjYW4gZWFnZXJseSBjb21wdXRlIHRoZVxuICAgICAgLy8gbmV4dCBzdGF0ZSBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gSWYgdGhlIG5ldyBzdGF0ZSBpcyB0aGVcbiAgICAgIC8vIHNhbWUgYXMgdGhlIGN1cnJlbnQgc3RhdGUsIHdlIG1heSBiZSBhYmxlIHRvIGJhaWwgb3V0IGVudGlyZWx5LlxuICAgICAgdmFyIGxhc3RSZW5kZXJlZFJlZHVjZXIgPSBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyO1xuXG4gICAgICBpZiAobGFzdFJlbmRlcmVkUmVkdWNlciAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnRTdGF0ZSA9IHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlO1xuICAgICAgICAgIHZhciBlYWdlclN0YXRlID0gbGFzdFJlbmRlcmVkUmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7IC8vIFN0YXNoIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlLCBhbmQgdGhlIHJlZHVjZXIgdXNlZCB0byBjb21wdXRlXG4gICAgICAgICAgLy8gaXQsIG9uIHRoZSB1cGRhdGUgb2JqZWN0LiBJZiB0aGUgcmVkdWNlciBoYXNuJ3QgY2hhbmdlZCBieSB0aGVcbiAgICAgICAgICAvLyB0aW1lIHdlIGVudGVyIHRoZSByZW5kZXIgcGhhc2UsIHRoZW4gdGhlIGVhZ2VyIHN0YXRlIGNhbiBiZSB1c2VkXG4gICAgICAgICAgLy8gd2l0aG91dCBjYWxsaW5nIHRoZSByZWR1Y2VyIGFnYWluLlxuXG4gICAgICAgICAgdXBkYXRlLmhhc0VhZ2VyU3RhdGUgPSB0cnVlO1xuICAgICAgICAgIHVwZGF0ZS5lYWdlclN0YXRlID0gZWFnZXJTdGF0ZTtcblxuICAgICAgICAgIGlmIChvYmplY3RJcyhlYWdlclN0YXRlLCBjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgICAgICAvLyBGYXN0IHBhdGguIFdlIGNhbiBiYWlsIG91dCB3aXRob3V0IHNjaGVkdWxpbmcgUmVhY3QgdG8gcmUtcmVuZGVyLlxuICAgICAgICAgICAgLy8gSXQncyBzdGlsbCBwb3NzaWJsZSB0aGF0IHdlJ2xsIG5lZWQgdG8gcmViYXNlIHRoaXMgdXBkYXRlIGxhdGVyLFxuICAgICAgICAgICAgLy8gaWYgdGhlIGNvbXBvbmVudCByZS1yZW5kZXJzIGZvciBhIGRpZmZlcmVudCByZWFzb24gYW5kIGJ5IHRoYXRcbiAgICAgICAgICAgIC8vIHRpbWUgdGhlIHJlZHVjZXIgaGFzIGNoYW5nZWQuXG4gICAgICAgICAgICAvLyBUT0RPOiBEbyB3ZSBzdGlsbCBuZWVkIHRvIGVudGFuZ2xlIHRyYW5zaXRpb25zIGluIHRoaXMgY2FzZT9cbiAgICAgICAgICAgIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZUFuZEVhZ2VybHlCYWlsb3V0KGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7Ly8gU3VwcHJlc3MgdGhlIGVycm9yLiBJdCB3aWxsIHRocm93IGFnYWluIGluIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUpO1xufVxuXG5mdW5jdGlvbiBpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gIHJldHVybiBmaWJlciA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgYWx0ZXJuYXRlID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xufVxuXG5mdW5jdGlvbiBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSkge1xuICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gU3Rhc2ggaXQgaW4gYSBsYXppbHktY3JlYXRlZCBtYXAgb2ZcbiAgLy8gcXVldWUgLT4gbGlua2VkIGxpc3Qgb2YgdXBkYXRlcy4gQWZ0ZXIgdGhpcyByZW5kZXIgcGFzcywgd2UnbGwgcmVzdGFydFxuICAvLyBhbmQgYXBwbHkgdGhlIHN0YXNoZWQgdXBkYXRlcyBvbiB0b3Agb2YgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IHRydWU7XG4gIHZhciBwZW5kaW5nID0gcXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xufSAvLyBUT0RPOiBNb3ZlIHRvIFJlYWN0RmliZXJDb25jdXJyZW50VXBkYXRlcz9cblxuXG5mdW5jdGlvbiBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpIHtcbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5XG4gICAgLy8gbXVzdCBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaFxuICAgIC8vIHJlcHJlc2VudHMgYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZVxuICAgIC8vIG1heSBlbnRhbmdsZSBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmXG4gICAgLy8gd2UgKmRvbid0KiBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgcXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUsIGFjdGlvbikge1xuXG4gIHtcbiAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICB9XG59XG5cbnZhciBDb250ZXh0T25seURpc3BhdGNoZXIgPSB7XG4gIHJlYWRDb250ZXh0OiByZWFkQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2s6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlQ29udGV4dDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJbnNlcnRpb25FZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTGF5b3V0RWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU1lbW86IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3RhdGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVRyYW5zaXRpb246IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTXV0YWJsZVNvdXJjZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJZDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbn07XG5cbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xuXG57XG4gIHZhciB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICB9O1xuXG4gIHZhciB3YXJuSW52YWxpZEhvb2tBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0RvIG5vdCBjYWxsIEhvb2tzIGluc2lkZSB1c2VFZmZlY3QoLi4uKSwgdXNlTWVtbyguLi4pLCBvciBvdGhlciBidWlsdC1pbiBIb29rcy4gJyArICdZb3UgY2FuIG9ubHkgY2FsbCBIb29rcyBhdCB0aGUgdG9wIGxldmVsIG9mIHlvdXIgUmVhY3QgZnVuY3Rpb24uICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rcycpO1xuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xufVxuXG52YXIgbm93JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfbm93O1xudmFyIGNvbW1pdFRpbWUgPSAwO1xudmFyIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IC0xO1xudmFyIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG52YXIgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xO1xuLyoqXG4gKiBUcmFja3Mgd2hldGhlciB0aGUgY3VycmVudCB1cGRhdGUgd2FzIGEgbmVzdGVkL2Nhc2NhZGluZyB1cGRhdGUgKHNjaGVkdWxlZCBmcm9tIGEgbGF5b3V0IGVmZmVjdCkuXG4gKlxuICogVGhlIG92ZXJhbGwgc2VxdWVuY2UgaXM6XG4gKiAgIDEuIHJlbmRlclxuICogICAyLiBjb21taXQgKGFuZCBjYWxsIGBvblJlbmRlcmAsIGBvbkNvbW1pdGApXG4gKiAgIDMuIGNoZWNrIGZvciBuZXN0ZWQgdXBkYXRlc1xuICogICA0LiBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgKGFuZCBjYWxsIGBvblBvc3RDb21taXRgKVxuICpcbiAqIE5lc3RlZCB1cGRhdGVzIGFyZSBpZGVudGlmaWVkIGluIHN0ZXAgMyBhYm92ZSxcbiAqIGJ1dCBzdGVwIDQgc3RpbGwgYXBwbGllcyB0byB0aGUgd29yayB0aGF0IHdhcyBqdXN0IGNvbW1pdHRlZC5cbiAqIFdlIHVzZSB0d28gZmxhZ3MgdG8gdHJhY2sgbmVzdGVkIHVwZGF0ZXMgdGhlbjpcbiAqIG9uZSB0cmFja3Mgd2hldGhlciB0aGUgdXBjb21pbmcgdXBkYXRlIGlzIGEgbmVzdGVkIHVwZGF0ZSxcbiAqIGFuZCB0aGUgb3RoZXIgdHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZCB1cGRhdGUuXG4gKiBUaGUgZmlyc3QgdmFsdWUgZ2V0cyBzeW5jZWQgdG8gdGhlIHNlY29uZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlbmRlciBwaGFzZS5cbiAqL1xuXG52YXIgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7XG52YXIgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRVcGRhdGVJc05lc3RlZDtcbn1cblxuZnVuY3Rpb24gbWFya05lc3RlZFVwZGF0ZVNjaGVkdWxlZCgpIHtcbiAge1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXROZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3luY05lc3RlZFVwZGF0ZUZsYWcoKSB7XG4gIHtcbiAgICBjdXJyZW50VXBkYXRlSXNOZXN0ZWQgPSBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQ7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q29tbWl0VGltZSgpIHtcbiAgcmV0dXJuIGNvbW1pdFRpbWU7XG59XG5cbmZ1bmN0aW9uIHJlY29yZENvbW1pdFRpbWUoKSB7XG5cbiAgY29tbWl0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0UHJvZmlsZXJUaW1lcihmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gbm93JDEoKTtcblxuICBpZiAoZmliZXIuYWN0dWFsU3RhcnRUaW1lIDwgMCkge1xuICAgIGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA9IG5vdyQxKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGZpYmVyLCBvdmVycmlkZUJhc2VUaW1lKSB7XG5cbiAgaWYgKHByb2ZpbGVyU3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gcHJvZmlsZXJTdGFydFRpbWU7XG4gICAgZmliZXIuYWN0dWFsRHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG5cbiAgICBpZiAob3ZlcnJpZGVCYXNlVGltZSkge1xuICAgICAgZmliZXIuc2VsZkJhc2VEdXJhdGlvbiA9IGVsYXBzZWRUaW1lO1xuICAgIH1cblxuICAgIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAobGF5b3V0RWZmZWN0U3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gbGF5b3V0RWZmZWN0U3RhcnRUaW1lO1xuICAgIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICByb290LmVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcGFyZW50U3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaWJlcikge1xuXG4gIGlmIChwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZTtcbiAgICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gLTE7IC8vIFN0b3JlIGR1cmF0aW9uIG9uIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3JcbiAgICAvLyBPciB0aGUgcm9vdCAoZm9yIHRoZSBEZXZUb29scyBQcm9maWxlciB0byByZWFkKVxuXG4gICAgdmFyIHBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAgd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAocGFyZW50U3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBEZXRhY2hlZCBmaWJlcnMgaGF2ZSB0aGVpciBzdGF0ZSBub2RlIGNsZWFyZWQgb3V0LlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgcmV0dXJuIHBvaW50ZXIgaXMgYWxzbyBjbGVhcmVkIG91dCxcbiAgICAgICAgICAgIC8vIHNvIHdlIHdvbid0IGJlIGFibGUgdG8gcmVwb3J0IHRoZSB0aW1lIHNwZW50IGluIHRoaXMgUHJvZmlsZXIncyBzdWJ0cmVlLlxuICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydExheW91dEVmZmVjdFRpbWVyKCkge1xuXG4gIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCkge1xuXG4gIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKGZpYmVyKSB7XG4gIC8vIFRyYW5zZmVyIHRpbWUgc3BlbnQgcmVuZGVyaW5nIHRoZXNlIGNoaWxkcmVuIHNvIHdlIGRvbid0IGxvc2UgaXRcbiAgLy8gYWZ0ZXIgd2UgcmVyZW5kZXIuIFRoaXMgaXMgdXNlZCBhcyBhIGhlbHBlciBpbiBzcGVjaWFsIGNhc2VzXG4gIC8vIHdoZXJlIHdlIHNob3VsZCBjb3VudCB0aGUgd29yayBvZiBtdWx0aXBsZSBwYXNzZXMuXG4gIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgYmFzZVByb3BzKSB7XG4gIGlmIChDb21wb25lbnQgJiYgQ29tcG9uZW50LmRlZmF1bHRQcm9wcykge1xuICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wcy4gVGFrZW4gZnJvbSBSZWFjdEVsZW1lbnRcbiAgICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGJhc2VQcm9wcyk7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IENvbXBvbmVudC5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9wcztcbiAgfVxuXG4gIHJldHVybiBiYXNlUHJvcHM7XG59XG5cbnZhciBmYWtlSW50ZXJuYWxJbnN0YW5jZSA9IHt9O1xudmFyIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGU7XG52YXIgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlO1xudmFyIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGU7XG52YXIgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlO1xudmFyIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25JbnZhbGlkQ2FsbGJhY2s7XG52YXIgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGU7XG52YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXM7XG52YXIgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlO1xudmFyIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMTtcblxue1xuICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcyA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEgPSBuZXcgU2V0KCk7XG4gIHZhciBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBuZXcgU2V0KCk7XG5cbiAgd2Fybk9uSW52YWxpZENhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgaWYgKGNhbGxiYWNrID09PSBudWxsIHx8IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBjYWxsZXJOYW1lICsgJ18nICsgY2FsbGJhY2s7XG5cbiAgICBpZiAoIWRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5oYXMoa2V5KSkge1xuICAgICAgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmFkZChrZXkpO1xuXG4gICAgICBlcnJvcignJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH07XG5cbiAgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gZnVuY3Rpb24gKHR5cGUsIHBhcnRpYWxTdGF0ZSkge1xuICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKTogQSB2YWxpZCBzdGF0ZSBvYmplY3QgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuICcgKyAnWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gVGhpcyBpcyBzbyBncm9zcyBidXQgaXQncyBhdCBsZWFzdCBub24tY3JpdGljYWwgYW5kIGNhbiBiZSByZW1vdmVkIGlmXG4gIC8vIGl0IGNhdXNlcyBwcm9ibGVtcy4gVGhpcyBpcyBtZWFudCB0byBnaXZlIGEgbmljZXIgZXJyb3IgbWVzc2FnZSBmb3JcbiAgLy8gUmVhY3RET00xNS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihyZWFjdERPTTE2Q29tcG9uZW50LFxuICAvLyAuLi4pKSB3aGljaCBvdGhlcndpc2UgdGhyb3dzIGEgXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYSBmdW5jdGlvblwiXG4gIC8vIGV4Y2VwdGlvbi5cblxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYWtlSW50ZXJuYWxJbnN0YW5jZSwgJ19wcm9jZXNzQ2hpbGRDb250ZXh0Jywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ19wcm9jZXNzQ2hpbGRDb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgaW4gUmVhY3QgMTYrLiBUaGlzIGxpa2VseSAnICsgJ21lYW5zIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBhbmQgYXJlIGF0dGVtcHRpbmcgdG8gbmVzdCAnICsgJ2EgUmVhY3QgMTUgdHJlZSBpbnNpZGUgYSBSZWFjdCAxNiB0cmVlIHVzaW5nICcgKyBcInVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLCB3aGljaCBpc24ndCBzdXBwb3J0ZWQuIFRyeSBcIiArICd0byBtYWtlIHN1cmUgeW91IGhhdmUgb25seSBvbmUgY29weSBvZiBSZWFjdCAoYW5kIGlkZWFsbHksIHN3aXRjaCAnICsgJ3RvIFJlYWN0RE9NLmNyZWF0ZVBvcnRhbCkuJyk7XG4gICAgfVxuICB9KTtcbiAgT2JqZWN0LmZyZWV6ZShmYWtlSW50ZXJuYWxJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5leHRQcm9wcykge1xuICB2YXIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG5cbiAge1xuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZShjdG9yLCBwYXJ0aWFsU3RhdGUpO1xuICB9IC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG5cblxuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCA/IHByZXZTdGF0ZSA6IGFzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbWVtb2l6ZWRTdGF0ZTsgLy8gT25jZSB0aGUgdXBkYXRlIHF1ZXVlIGlzIGVtcHR5LCBwZXJzaXN0IHRoZSBkZXJpdmVkIHN0YXRlIG9udG8gdGhlXG4gIC8vIGJhc2Ugc3RhdGUuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gUXVldWUgaXMgYWx3YXlzIG5vbi1udWxsIGZvciBjbGFzc2VzXG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gbWVtb2l6ZWRTdGF0ZTtcbiAgfVxufVxuXG52YXIgY2xhc3NDb21wb25lbnRVcGRhdGVyID0ge1xuICBpc01vdW50ZWQ6IGlzTW91bnRlZCxcbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9LFxuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnRhZyA9IFJlcGxhY2VTdGF0ZTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdyZXBsYWNlU3RhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9LFxuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHNob3VsZFVwZGF0ZSA9IGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcblxuICAgIHtcbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yKCclcy5zaG91bGRDb21wb25lbnRVcGRhdGUoKTogUmV0dXJuZWQgdW5kZWZpbmVkIGluc3RlYWQgb2YgYSAnICsgJ2Jvb2xlYW4gdmFsdWUuIE1ha2Ugc3VyZSB0byByZXR1cm4gdHJ1ZSBvciBmYWxzZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH1cblxuICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbChvbGRQcm9wcywgbmV3UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG4gICAgdmFyIHJlbmRlclByZXNlbnQgPSBpbnN0YW5jZS5yZW5kZXI7XG5cbiAgICBpZiAoIXJlbmRlclByZXNlbnQpIHtcbiAgICAgIGlmIChjdG9yLnByb3RvdHlwZSAmJiB0eXBlb2YgY3Rvci5wcm90b3R5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiBkaWQgeW91IGFjY2lkZW50YWxseSByZXR1cm4gYW4gb2JqZWN0IGZyb20gdGhlIGNvbnN0cnVjdG9yPycsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IHlvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gZGVmaW5lIGByZW5kZXJgLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUgJiYgIWluc3RhbmNlLmdldEluaXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCAmJiAhaW5zdGFuY2Uuc3RhdGUpIHtcbiAgICAgIGVycm9yKCdnZXRJbml0aWFsU3RhdGUgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3RlYWQ/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmdldERlZmF1bHRQcm9wcyAmJiAhaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ1VzZSBhIHN0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgZGVmYXVsdFByb3BzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnByb3BUeXBlcykge1xuICAgICAgZXJyb3IoJ3Byb3BUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIHByb3BUeXBlcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5jb250ZXh0VHlwZSkge1xuICAgICAgZXJyb3IoJ2NvbnRleHRUeXBlIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGUgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3Rvci5jaGlsZENvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmhhcyhjdG9yKSAmJiAvLyBTdHJpY3QgTW9kZSBoYXMgaXRzIG93biB3YXJuaW5nIGZvciBsZWdhY3kgY29udGV4dCwgc28gd2UgY2FuIHNraXBcbiAgICAgIC8vIHRoaXMgb25lLlxuICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5hZGQoY3Rvcik7XG5cbiAgICAgICAgZXJyb3IoJyVzIHVzZXMgdGhlIGxlZ2FjeSBjaGlsZENvbnRleHRUeXBlcyBBUEkgd2hpY2ggaXMgbm8gbG9uZ2VyICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gVXNlICcgKyAnUmVhY3QuY3JlYXRlQ29udGV4dCgpIGluc3RlYWRcXG5cXG4uJyArICdMZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEuaGFzKGN0b3IpICYmIC8vIFN0cmljdCBNb2RlIGhhcyBpdHMgb3duIHdhcm5pbmcgZm9yIGxlZ2FjeSBjb250ZXh0LCBzbyB3ZSBjYW4gc2tpcFxuICAgICAgLy8gdGhpcyBvbmUuXG4gICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmFkZChjdG9yKTtcblxuICAgICAgICBlcnJvcignJXMgdXNlcyB0aGUgbGVnYWN5IGNvbnRleHRUeXBlcyBBUEkgd2hpY2ggaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gVXNlICcgKyAnUmVhY3QuY3JlYXRlQ29udGV4dCgpIHdpdGggc3RhdGljIGNvbnRleHRUeXBlIGluc3RlYWQuXFxuXFxuJyArICdMZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyBkZWNsYXJlcyBib3RoIGNvbnRleHRUeXBlcyBhbmQgY29udGV4dFR5cGUgc3RhdGljIHByb3BlcnRpZXMuICcgKyAnVGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBzaG91bGRDb21wb25lbnRVcGRhdGUoKS4gJyArICdzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuICcgKyAnUGxlYXNlIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHVzZWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdBIHB1cmUgY29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFVubW91bnQoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRSZWNlaXZlUHJvcHMoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdJZiB5b3UgbWVhbnQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBpbiByZXNwb25zZSB0byBjaGFuZ2luZyBwcm9wcywgJyArICd1c2UgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpLiBJZiB5b3UgbWVhbnQgdG8gZmV0Y2ggZGF0YSBvciAnICsgJ3J1biBzaWRlLWVmZmVjdHMgb3IgbXV0YXRpb25zIGFmdGVyIFJlYWN0IGhhcyB1cGRhdGVkIHRoZSBVSSwgdXNlIGNvbXBvbmVudERpZFVwZGF0ZSgpLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgaGFzTXV0YXRlZFByb3BzID0gaW5zdGFuY2UucHJvcHMgIT09IG5ld1Byb3BzO1xuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSB1bmRlZmluZWQgJiYgaGFzTXV0YXRlZFByb3BzKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogV2hlbiBjYWxsaW5nIHN1cGVyKCkgaW4gYCVzYCwgbWFrZSBzdXJlIHRvIHBhc3MgJyArIFwidXAgdGhlIHNhbWUgcHJvcHMgdGhhdCB5b3VyIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHdhcyBwYXNzZWQuXCIsIG5hbWUsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGVycm9yKCdTZXR0aW5nIGRlZmF1bHRQcm9wcyBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQuJyArICcgSW5zdGVhZCwgZGVmaW5lIGRlZmF1bHRQcm9wcyBhcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiAlcy4nLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgIWRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5oYXMoY3RvcikpIHtcbiAgICAgIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5hZGQoY3Rvcik7XG5cbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBzaG91bGQgYmUgdXNlZCB3aXRoIGNvbXBvbmVudERpZFVwZGF0ZSgpLiAnICsgJ1RoaXMgY29tcG9uZW50IGRlZmluZXMgZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBvbmx5LicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGlzIGRlZmluZWQgYXMgYSBzdGF0aWMgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhbiBpbnN0YW5jZSBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIF9zdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gICAgaWYgKF9zdGF0ZSAmJiAodHlwZW9mIF9zdGF0ZSAhPT0gJ29iamVjdCcgfHwgaXNBcnJheShfc3RhdGUpKSkge1xuICAgICAgZXJyb3IoJyVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbCcsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjdG9yLmNoaWxkQ29udGV4dFR5cGVzICE9PSAnb2JqZWN0Jykge1xuICAgICAgZXJyb3IoJyVzLmdldENoaWxkQ29udGV4dCgpOiBjaGlsZENvbnRleHRUeXBlcyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gJyArICd1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuJywgbmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UudXBkYXRlciA9IGNsYXNzQ29tcG9uZW50VXBkYXRlcjtcbiAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gaW5zdGFuY2U7IC8vIFRoZSBpbnN0YW5jZSBuZWVkcyBhY2Nlc3MgdG8gdGhlIGZpYmVyIHNvIHRoYXQgaXQgY2FuIHNjaGVkdWxlIHVwZGF0ZXNcblxuICBzZXQoaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzKTtcblxuICB7XG4gICAgaW5zdGFuY2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IGZha2VJbnRlcm5hbEluc3RhbmNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHByb3BzKSB7XG4gIHZhciBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGZhbHNlO1xuICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcblxuICB7XG4gICAgaWYgKCdjb250ZXh0VHlwZScgaW4gY3Rvcikge1xuICAgICAgdmFyIGlzVmFsaWQgPSAvLyBBbGxvdyBudWxsIGZvciBjb25kaXRpb25hbCBkZWNsYXJhdGlvblxuICAgICAgY29udGV4dFR5cGUgPT09IG51bGwgfHwgY29udGV4dFR5cGUgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFICYmIGNvbnRleHRUeXBlLl9jb250ZXh0ID09PSB1bmRlZmluZWQ7IC8vIE5vdCBhIDxDb250ZXh0LkNvbnN1bWVyPlxuXG4gICAgICBpZiAoIWlzVmFsaWQgJiYgIWRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmFkZChjdG9yKTtcbiAgICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG5cbiAgICAgICAgaWYgKGNvbnRleHRUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIHVuZGVmaW5lZC4gJyArICdUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSB0eXBvIG9yIGJ5IG1peGluZyB1cCBuYW1lZCBhbmQgZGVmYXVsdCBpbXBvcnRzLiAnICsgJ1RoaXMgY2FuIGFsc28gaGFwcGVuIGR1ZSB0byBhIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHNvICcgKyAndHJ5IG1vdmluZyB0aGUgY3JlYXRlQ29udGV4dCgpIGNhbGwgdG8gYSBzZXBhcmF0ZSBmaWxlLic7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYSAnICsgdHlwZW9mIGNvbnRleHRUeXBlICsgJy4nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuUHJvdmlkZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLl9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyA8Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Db25zdW1lciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY29udGV4dFR5cGUpLmpvaW4oJywgJykgKyAnfS4nO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJyVzIGRlZmluZXMgYW4gaW52YWxpZCBjb250ZXh0VHlwZS4gJyArICdjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lcycsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSBjdG9yLmNvbnRleHRUeXBlcztcbiAgICBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGNvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBJbnN0YW50aWF0ZSB0d2ljZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG5cbiAge1xuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGUgIT09IG51bGwgJiYgaW5zdGFuY2Uuc3RhdGUgIT09IHVuZGVmaW5lZCA/IGluc3RhbmNlLnN0YXRlIDogbnVsbDtcbiAgYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgc3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAgIC8vIFdhcm4gYWJvdXQgdGhlc2UgbGlmZWN5Y2xlcyBpZiB0aGV5IGFyZSBwcmVzZW50LlxuICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC5cblxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgICB2YXIgbmV3QXBpTmFtZSA9IHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKScgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmhhcyhfY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmFkZChfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgICBlcnJvcignVW5zYWZlIGxlZ2FjeSBsaWZlY3ljbGVzIHdpbGwgbm90IGJlIGNhbGxlZCBmb3IgY29tcG9uZW50cyB1c2luZyBuZXcgY29tcG9uZW50IEFQSXMuXFxuXFxuJyArICclcyB1c2VzICVzIGJ1dCBhbHNvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVnYWN5IGxpZmVjeWNsZXM6JXMlcyVzXFxuXFxuJyArICdUaGUgYWJvdmUgbGlmZWN5Y2xlcyBzaG91bGQgYmUgcmVtb3ZlZC4gTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTpcXG4nICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMnLCBfY29tcG9uZW50TmFtZSwgbmV3QXBpTmFtZSwgZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsTW91bnROYW1lIDogJycsIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lIDogJycsIGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxVcGRhdGVOYW1lIDogJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgLy8gUmVhY3RGaWJlckNvbnRleHQgdXN1YWxseSB1cGRhdGVzIHRoaXMgY2FjaGUgYnV0IGNhbid0IGZvciBuZXdseS1jcmVhdGVkIGluc3RhbmNlcy5cblxuXG4gIGlmIChpc0xlZ2FjeUNvbnRleHRDb25zdW1lcikge1xuICAgIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgdmFyIG9sZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmIChvbGRTdGF0ZSAhPT0gaW5zdGFuY2Uuc3RhdGUpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbE1vdW50KCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byB0aGlzLnN0YXRlIGlzICcgKyBcImRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBvbGRTdGF0ZSkge1xuICAgIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byAnICsgXCJ0aGlzLnN0YXRlIGlzIGRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn0gLy8gSW52b2tlcyB0aGUgbW91bnQgbGlmZS1jeWNsZXMgb24gYSBwcmV2aW91c2x5IG5ldmVyIHJlbmRlcmVkIGluc3RhbmNlLlxuXG5cbmZ1bmN0aW9uIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICBpbnN0YW5jZS5yZWZzID0ge307XG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAge1xuICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYXNzaWduIHByb3BzIGRpcmVjdGx5IHRvIHN0YXRlICcgKyBcImJlY2F1c2UgdXBkYXRlcyB0byBwcm9wcyB3b24ndCBiZSByZWZsZWN0ZWQgaW4gc3RhdGUuIFwiICsgJ0luIG1vc3QgY2FzZXMsIGl0IGlzIGJldHRlciB0byB1c2UgcHJvcHMgZGlyZWN0bHkuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9IC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG5cbiAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpOyAvLyBJZiB3ZSBoYWQgYWRkaXRpb25hbCBzdGF0ZSB1cGRhdGVzIGR1cmluZyB0aGlzIGxpZmUtY3ljbGUsIGxldCdzXG4gICAgLy8gcHJvY2VzcyB0aGVtIG5vdy5cblxuICAgIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgfVxuXG4gICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzO1xuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIG5leHRDb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBuZXh0Q29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSkge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAgICAgIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIF9maWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgICAgIH1cblxuICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIF9maWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFncztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2ZpYmVyRmxhZ3MyID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIF9maWJlckZsYWdzMiB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgICB9XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IF9maWJlckZsYWdzMjtcbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59IC8vIEludm9rZXMgdGhlIHVwZGF0ZSBsaWZlLWN5Y2xlcyBhbmQgcmV0dXJucyBmYWxzZSBpZiBpdCBzaG91bGRuJ3QgcmVyZW5kZXIuXG5cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA/IHVucmVzb2x2ZWRPbGRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgdW5yZXNvbHZlZE9sZFByb3BzKTtcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIHVucmVzb2x2ZWROZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dFVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSB1bnJlc29sdmVkTmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyA9PT0gdW5yZXNvbHZlZE5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpICYmICEoZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgICkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB8fCBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB8fCAvLyBUT0RPOiBJbiBzb21lIGNhc2VzLCB3ZSdsbCBlbmQgdXAgY2hlY2tpbmcgaWYgY29udGV4dCBoYXMgY2hhbmdlZCB0d2ljZSxcbiAgLy8gYm90aCBiZWZvcmUgYW5kIGFmdGVyIGBzaG91bGRDb21wb25lbnRVcGRhdGVgIGhhcyBiZWVuIGNhbGxlZC4gTm90IGlkZWFsLFxuICAvLyBidXQgSSdtIGxvYXRoIHRvIHJlZmFjdG9yIHRoaXMgZnVuY3Rpb24uIFRoaXMgb25seSBoYXBwZW5zIGZvciBtZW1vaXplZFxuICAvLyBjb21wb25lbnRzIHNvIGl0J3Mgbm90IHRoYXQgY29tbW9uLlxuICBlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uICAgO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH0gLy8gSWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmVkIGZhbHNlLCB3ZSBzaG91bGQgc3RpbGwgdXBkYXRlIHRoZVxuICAgIC8vIG1lbW9pemVkIHByb3BzL3N0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuXG5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBuZXdQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gVXBkYXRlIHRoZSBleGlzdGluZyBpbnN0YW5jZSdzIHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgcG9pbnRlcnMgZXZlblxuICAvLyBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJucyBmYWxzZS5cblxuXG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gbmV3U3RhdGU7XG4gIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZSkge1xuICAvLyBJZiB0aGUgdmFsdWUgaXMgYW4gZXJyb3IsIGNhbGwgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBhZnRlciBpdCBpcyB0aHJvd25cbiAgLy8gc28gdGhlIHN0YWNrIGlzIGFjY3VyYXRlLlxuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzdGFjazogZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHNvdXJjZSksXG4gICAgZGlnZXN0OiBudWxsXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBkaWdlc3QsIHN0YWNrKSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHNvdXJjZTogbnVsbCxcbiAgICBzdGFjazogc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogbnVsbCxcbiAgICBkaWdlc3Q6IGRpZ2VzdCAhPSBudWxsID8gZGlnZXN0IDogbnVsbFxuICB9O1xufVxuXG4vLyBUaGlzIG1vZHVsZSBpcyBmb3JrZWQgaW4gZGlmZmVyZW50IGVudmlyb25tZW50cy5cbi8vIEJ5IGRlZmF1bHQsIHJldHVybiBgdHJ1ZWAgdG8gbG9nIGVycm9ycyB0byB0aGUgY29uc29sZS5cbi8vIEZvcmtzIGNhbiByZXR1cm4gYGZhbHNlYCBpZiB0aGlzIGlzbid0IGRlc2lyYWJsZS5cbmZ1bmN0aW9uIHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsb2dDYXB0dXJlZEVycm9yKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgdHJ5IHtcbiAgICB2YXIgbG9nRXJyb3IgPSBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbyk7IC8vIEFsbG93IGluamVjdGVkIHNob3dFcnJvckRpYWxvZygpIHRvIHByZXZlbnQgZGVmYXVsdCBjb25zb2xlLmVycm9yIGxvZ2dpbmcuXG4gICAgLy8gVGhpcyBlbmFibGVzIHJlbmRlcmVycyBsaWtlIFJlYWN0TmF0aXZlIHRvIGJldHRlciBtYW5hZ2UgcmVkYm94IGJlaGF2aW9yLlxuXG4gICAgaWYgKGxvZ0Vycm9yID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIGlmICh0cnVlKSB7XG4gICAgICB2YXIgc291cmNlID0gZXJyb3JJbmZvLnNvdXJjZTtcbiAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjaztcbiAgICAgIHZhciBjb21wb25lbnRTdGFjayA9IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJzsgLy8gQnJvd3NlcnMgc3VwcG9ydCBzaWxlbmNpbmcgdW5jYXVnaHQgZXJyb3JzIGJ5IGNhbGxpbmdcbiAgICAgIC8vIGBwcmV2ZW50RGVmYXVsdCgpYCBpbiB3aW5kb3cgYGVycm9yYCBoYW5kbGVyLlxuICAgICAgLy8gV2UgcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24gYXMgYW4gZXhwYW5kbyBvbiB0aGUgZXJyb3IuXG5cbiAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAvLyBUaGUgZXJyb3IgaXMgcmVjb3ZlcmFibGUgYW5kIHdhcyBzaWxlbmNlZC5cbiAgICAgICAgICAvLyBJZ25vcmUgaXQgYW5kIGRvbid0IHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cbiAgICAgICAgICAvLyBUaGlzIGlzIGhhbmR5IGZvciB0ZXN0aW5nIGVycm9yIGJvdW5kYXJpZXMgd2l0aG91dCBub2lzZS5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gVGhlIGVycm9yIGlzIGZhdGFsLiBTaW5jZSB0aGUgc2lsZW5jaW5nIG1pZ2h0IGhhdmVcbiAgICAgICAgLy8gYmVlbiBhY2NpZGVudGFsLCB3ZSdsbCBzdXJmYWNlIGl0IGFueXdheS5cbiAgICAgICAgLy8gSG93ZXZlciwgdGhlIGJyb3dzZXIgd291bGQgaGF2ZSBzaWxlbmNlZCB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICAgICAgLy8gc28gd2UnbGwgcHJpbnQgaXQgZmlyc3QsIGFuZCB0aGVuIHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cblxuXG4gICAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICAgICAgLy8gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGJsb2NrLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEzMzg0XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gc291cmNlID8gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihzb3VyY2UpIDogbnVsbDtcbiAgICAgIHZhciBjb21wb25lbnROYW1lTWVzc2FnZSA9IGNvbXBvbmVudE5hbWUgPyBcIlRoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiB0aGUgPFwiICsgY29tcG9uZW50TmFtZSArIFwiPiBjb21wb25lbnQ6XCIgOiAnVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIG9uZSBvZiB5b3VyIFJlYWN0IGNvbXBvbmVudHM6JztcbiAgICAgIHZhciBlcnJvckJvdW5kYXJ5TWVzc2FnZTtcblxuICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSAnQ29uc2lkZXIgYWRkaW5nIGFuIGVycm9yIGJvdW5kYXJ5IHRvIHlvdXIgdHJlZSB0byBjdXN0b21pemUgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3IuXFxuJyArICdWaXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZXJyb3ItYm91bmRhcmllcyB0byBsZWFybiBtb3JlIGFib3V0IGVycm9yIGJvdW5kYXJpZXMuJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBlcnJvckJvdW5kYXJ5TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoYm91bmRhcnkpIHx8ICdBbm9ueW1vdXMnO1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9IFwiUmVhY3Qgd2lsbCB0cnkgdG8gcmVjcmVhdGUgdGhpcyBjb21wb25lbnQgdHJlZSBmcm9tIHNjcmF0Y2ggXCIgKyAoXCJ1c2luZyB0aGUgZXJyb3IgYm91bmRhcnkgeW91IHByb3ZpZGVkLCBcIiArIGVycm9yQm91bmRhcnlOYW1lICsgXCIuXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29tYmluZWRNZXNzYWdlID0gY29tcG9uZW50TmFtZU1lc3NhZ2UgKyBcIlxcblwiICsgY29tcG9uZW50U3RhY2sgKyBcIlxcblxcblwiICsgKFwiXCIgKyBlcnJvckJvdW5kYXJ5TWVzc2FnZSk7IC8vIEluIGRldmVsb3BtZW50LCB3ZSBwcm92aWRlIG91ciBvd24gbWVzc2FnZSB3aXRoIGp1c3QgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAgICAgIC8vIFdlIGRvbid0IGluY2x1ZGUgdGhlIG9yaWdpbmFsIGVycm9yIG1lc3NhZ2UgYW5kIEpTIHN0YWNrIGJlY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAgIC8vIGhhcyBhbHJlYWR5IHByaW50ZWQgaXQuIEV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIHN3YWxsb3dzIHRoZSBlcnJvciwgaXQgaXMgc3RpbGxcbiAgICAgIC8vIGRpc3BsYXllZCBieSB0aGUgYnJvd3NlciB0aGFua3MgdG8gdGhlIERFVi1vbmx5IGZha2UgZXZlbnQgdHJpY2sgaW4gUmVhY3RFcnJvclV0aWxzLlxuXG4gICAgICBjb25zb2xlWydlcnJvciddKGNvbWJpbmVkTWVzc2FnZSk7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBwcm9kdWN0aW9uLCB3ZSBwcmludCB0aGUgZXJyb3IgZGlyZWN0bHkuXG4gICAgICAvLyBUaGlzIHdpbGwgaW5jbHVkZSB0aGUgbWVzc2FnZSwgdGhlIEpTIHN0YWNrLCBhbmQgYW55dGhpbmcgdGhlIGJyb3dzZXIgd2FudHMgdG8gc2hvdy5cbiAgICAgIC8vIFdlIHBhc3MgdGhlIGVycm9yIG9iamVjdCBpbnN0ZWFkIG9mIGN1c3RvbSBtZXNzYWdlIHNvIHRoYXQgdGhlIGJyb3dzZXIgZGlzcGxheXMgdGhlIGVycm9yIG5hdGl2ZWx5LlxuICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93LCBvciBSZWFjdCBpbnRlcm5hbCBzdGF0ZSB3aWxsIGdldCBtZXNzZWQgdXAuXG4gICAgLy8gSWYgY29uc29sZS5lcnJvciBpcyBvdmVycmlkZGVuLCBvciBsb2dDYXB0dXJlZEVycm9yKCkgc2hvd3MgYSBkaWFsb2cgdGhhdCB0aHJvd3MsXG4gICAgLy8gd2Ugd2FudCB0byByZXBvcnQgdGhpcyBlcnJvciBvdXRzaWRlIG9mIHRoZSBub3JtYWwgc3RhY2sgYXMgYSBsYXN0IHJlc29ydC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMTg4XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBQb3NzaWJseVdlYWtNYXAkMSA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdEVycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7IC8vIFVubW91bnQgdGhlIHJvb3QgYnkgcmVuZGVyaW5nIG51bGwuXG5cbiAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG4gIHVwZGF0ZS5wYXlsb2FkID0ge1xuICAgIGVsZW1lbnQ6IG51bGxcbiAgfTtcbiAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICBvblVuY2F1Z2h0RXJyb3IoZXJyb3IpO1xuICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gIH07XG5cbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpO1xuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9IGZpYmVyLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGVycm9yJDEgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgICB1cGRhdGUucGF5bG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IkMSk7XG4gICAgfTtcblxuICAgIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHtcbiAgICAgICAgbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpO1xuICAgICAgfVxuXG4gICAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuICAgIH07XG4gIH1cblxuICB2YXIgaW5zdCA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICBpZiAoaW5zdCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdC5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAge1xuICAgICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG5cbiAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRvIHByZXNlcnZlIHRoZSBwcmVleGlzdGluZyByZXRyeSBiZWhhdmlvciBvZiBlcnJvciBib3VuZGFyaWVzLFxuICAgICAgICAvLyB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIG9uZXMgYWxyZWFkeSBmYWlsZWQgZHVyaW5nIHRoaXMgYmF0Y2guXG4gICAgICAgIC8vIFRoaXMgZ2V0cyByZXNldCBiZWZvcmUgd2UgeWllbGQgYmFjayB0byB0aGUgYnJvd3Nlci5cbiAgICAgICAgLy8gVE9ETzogV2FybiBpbiBzdHJpY3QgbW9kZSBpZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXNcbiAgICAgICAgLy8gbm90IGRlZmluZWQuXG4gICAgICAgIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdGhpcy5jb21wb25lbnREaWRDYXRjaChlcnJvciQxLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJydcbiAgICAgIH0pO1xuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSWYgY29tcG9uZW50RGlkQ2F0Y2ggaXMgdGhlIG9ubHkgZXJyb3IgYm91bmRhcnkgbWV0aG9kIGRlZmluZWQsXG4gICAgICAgICAgLy8gdGhlbiBpdCBuZWVkcyB0byBjYWxsIHNldFN0YXRlIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuXG4gICAgICAgICAgLy8gSWYgbm8gc3RhdGUgdXBkYXRlIGlzIHNjaGVkdWxlZCB0aGVuIHRoZSBib3VuZGFyeSB3aWxsIHN3YWxsb3cgdGhlIGVycm9yLlxuICAgICAgICAgIGlmICghaW5jbHVkZXNTb21lTGFuZShmaWJlci5sYW5lcywgU3luY0xhbmUpKSB7XG4gICAgICAgICAgICBlcnJvcignJXM6IEVycm9yIGJvdW5kYXJpZXMgc2hvdWxkIGltcGxlbWVudCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKS4gJyArICdJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIC8vIEF0dGFjaCBhIHBpbmcgbGlzdGVuZXJcbiAgLy9cbiAgLy8gVGhlIGRhdGEgbWlnaHQgcmVzb2x2ZSBiZWZvcmUgd2UgaGF2ZSBhIGNoYW5jZSB0byBjb21taXQgdGhlIGZhbGxiYWNrLiBPcixcbiAgLy8gaW4gdGhlIGNhc2Ugb2YgYSByZWZyZXNoLCB3ZSdsbCBuZXZlciBjb21taXQgYSBmYWxsYmFjay4gU28gd2UgbmVlZCB0b1xuICAvLyBhdHRhY2ggYSBsaXN0ZW5lciBub3cuIFdoZW4gaXQgcmVzb2x2ZXMgKFwicGluZ3NcIiksIHdlIGNhbiBkZWNpZGUgd2hldGhlciB0b1xuICAvLyB0cnkgcmVuZGVyaW5nIHRoZSB0cmVlIGFnYWluLlxuICAvL1xuICAvLyBPbmx5IGF0dGFjaCBhIGxpc3RlbmVyIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgbGFuZXNcbiAgLy8gd2UncmUgY3VycmVudGx5IHJlbmRlcmluZyAod2hpY2ggYWN0cyBsaWtlIGEgXCJ0aHJlYWQgSURcIiBoZXJlKS5cbiAgLy9cbiAgLy8gV2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzXG4gIC8vIGNvbW1pdHMgZmFsbGJhY2tzIHN5bmNocm9ub3VzbHksIHNvIHRoZXJlIGFyZSBubyBwaW5ncy5cbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuICB2YXIgdGhyZWFkSURzO1xuXG4gIGlmIChwaW5nQ2FjaGUgPT09IG51bGwpIHtcbiAgICBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAkMSgpO1xuICAgIHRocmVhZElEcyA9IG5ldyBTZXQoKTtcbiAgICBwaW5nQ2FjaGUuc2V0KHdha2VhYmxlLCB0aHJlYWRJRHMpO1xuICB9IGVsc2Uge1xuICAgIHRocmVhZElEcyA9IHBpbmdDYWNoZS5nZXQod2FrZWFibGUpO1xuXG4gICAgaWYgKHRocmVhZElEcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgICBwaW5nQ2FjaGUuc2V0KHdha2VhYmxlLCB0aHJlYWRJRHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghdGhyZWFkSURzLmhhcyhsYW5lcykpIHtcbiAgICAvLyBNZW1vaXplIHVzaW5nIHRoZSB0aHJlYWQgSUQgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgIHRocmVhZElEcy5hZGQobGFuZXMpO1xuICAgIHZhciBwaW5nID0gcGluZ1N1c3BlbmRlZFJvb3QuYmluZChudWxsLCByb290LCB3YWtlYWJsZSwgbGFuZXMpO1xuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCByZXN0b3JlIHRoZSBvcmlnaW5hbCB1cGRhdGVyc1xuICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YWtlYWJsZS50aGVuKHBpbmcsIHBpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIC8vIFJldHJ5IGxpc3RlbmVyXG4gIC8vXG4gIC8vIElmIHRoZSBmYWxsYmFjayBkb2VzIGNvbW1pdCwgd2UgbmVlZCB0byBhdHRhY2ggYSBkaWZmZXJlbnQgdHlwZSBvZlxuICAvLyBsaXN0ZW5lci4gVGhpcyBvbmUgc2NoZWR1bGVzIGFuIHVwZGF0ZSBvbiB0aGUgU3VzcGVuc2UgYm91bmRhcnkgdG8gdHVyblxuICAvLyB0aGUgZmFsbGJhY2sgc3RhdGUgb2ZmLlxuICAvL1xuICAvLyBTdGFzaCB0aGUgd2FrZWFibGUgb24gdGhlIGJvdW5kYXJ5IGZpYmVyIHNvIHdlIGNhbiBhY2Nlc3MgaXQgaW4gdGhlXG4gIC8vIGNvbW1pdCBwaGFzZS5cbiAgLy9cbiAgLy8gV2hlbiB0aGUgd2FrZWFibGUgcmVzb2x2ZXMsIHdlJ2xsIGF0dGVtcHQgdG8gcmVuZGVyIHRoZSBib3VuZGFyeVxuICAvLyBhZ2FpbiAoXCJyZXRyeVwiKS5cbiAgdmFyIHdha2VhYmxlcyA9IHN1c3BlbnNlQm91bmRhcnkudXBkYXRlUXVldWU7XG5cbiAgaWYgKHdha2VhYmxlcyA9PT0gbnVsbCkge1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICB1cGRhdGVRdWV1ZS5hZGQod2FrZWFibGUpO1xuICAgIHN1c3BlbnNlQm91bmRhcnkudXBkYXRlUXVldWUgPSB1cGRhdGVRdWV1ZTtcbiAgfSBlbHNlIHtcbiAgICB3YWtlYWJsZXMuYWRkKHdha2VhYmxlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldFN1c3BlbmRlZENvbXBvbmVudChzb3VyY2VGaWJlciwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIEEgbGVnYWN5IG1vZGUgU3VzcGVuc2UgcXVpcmssIG9ubHkgcmVsZXZhbnQgdG8gaG9vayBjb21wb25lbnRzLlxuXG5cbiAgdmFyIHRhZyA9IHNvdXJjZUZpYmVyLnRhZztcblxuICBpZiAoKHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAodGFnID09PSBGdW5jdGlvbkNvbXBvbmVudCB8fCB0YWcgPT09IEZvcndhcmRSZWYgfHwgdGFnID09PSBTaW1wbGVNZW1vQ29tcG9uZW50KSkge1xuICAgIHZhciBjdXJyZW50U291cmNlID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnRTb3VyY2UpIHtcbiAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gY3VycmVudFNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgICAgIHNvdXJjZUZpYmVyLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50U291cmNlLm1lbW9pemVkU3RhdGU7XG4gICAgICBzb3VyY2VGaWJlci5sYW5lcyA9IGN1cnJlbnRTb3VyY2UubGFuZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIHNvdXJjZUZpYmVyLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcikge1xuICB2YXIgbm9kZSA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIHNob3VsZENhcHR1cmVTdXNwZW5zZShub2RlKSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSAvLyBUaGlzIGJvdW5kYXJ5IGFscmVhZHkgY2FwdHVyZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBDb250aW51ZSB0byB0aGUgbmV4dFxuICAgIC8vIGJvdW5kYXJ5LlxuXG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH0gd2hpbGUgKG5vZGUgIT09IG51bGwpO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBtYXJrcyBhIFN1c3BlbnNlIGJvdW5kYXJ5IHNvIHRoYXQgd2hlbiB3ZSdyZSB1bndpbmRpbmcgdGhlIHN0YWNrLFxuICAvLyBpdCBjYXB0dXJlcyB0aGUgc3VzcGVuZGVkIFwiZXhjZXB0aW9uXCIgYW5kIGRvZXMgYSBzZWNvbmQgKGZhbGxiYWNrKSBwYXNzLlxuICBpZiAoKHN1c3BlbnNlQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gTGVnYWN5IE1vZGUgU3VzcGVuc2VcbiAgICAvL1xuICAgIC8vIElmIHRoZSBib3VuZGFyeSBpcyBpbiBsZWdhY3kgbW9kZSwgd2Ugc2hvdWxkICpub3QqXG4gICAgLy8gc3VzcGVuZCB0aGUgY29tbWl0LiBQcmV0ZW5kIGFzIGlmIHRoZSBzdXNwZW5kZWQgY29tcG9uZW50IHJlbmRlcmVkXG4gICAgLy8gbnVsbCBhbmQga2VlcCByZW5kZXJpbmcuIFdoZW4gdGhlIFN1c3BlbnNlIGJvdW5kYXJ5IGNvbXBsZXRlcyxcbiAgICAvLyB3ZSdsbCBkbyBhIHNlY29uZCBwYXNzIHRvIHJlbmRlciB0aGUgZmFsbGJhY2suXG4gICAgaWYgKHN1c3BlbnNlQm91bmRhcnkgPT09IHJldHVybkZpYmVyKSB7XG4gICAgICAvLyBTcGVjaWFsIGNhc2Ugd2hlcmUgd2Ugc3VzcGVuZGVkIHdoaWxlIHJlY29uY2lsaW5nIHRoZSBjaGlsZHJlbiBvZlxuICAgICAgLy8gYSBTdXNwZW5zZSBib3VuZGFyeSdzIGlubmVyIE9mZnNjcmVlbiB3cmFwcGVyIGZpYmVyLiBUaGlzIGhhcHBlbnNcbiAgICAgIC8vIHdoZW4gYSBSZWFjdC5sYXp5IGNvbXBvbmVudCBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhXG4gICAgICAvLyBTdXNwZW5zZSBib3VuZGFyeS5cbiAgICAgIC8vXG4gICAgICAvLyBTdXNwZW5zZSBib3VuZGFyaWVzIGFyZSBpbXBsZW1lbnRlZCBhcyBtdWx0aXBsZSBmaWJlcnMsIGJ1dCB0aGV5XG4gICAgICAvLyBhcmUgYSBzaW5nbGUgY29uY2VwdHVhbCB1bml0LiBUaGUgbGVnYWN5IG1vZGUgYmVoYXZpb3Igd2hlcmUgd2VcbiAgICAgIC8vIHByZXRlbmQgdGhlIHN1c3BlbmRlZCBmaWJlciBjb21taXR0ZWQgYXMgYG51bGxgIHdvbid0IHdvcmssXG4gICAgICAvLyBiZWNhdXNlIGluIHRoaXMgY2FzZSB0aGUgXCJzdXNwZW5kZWRcIiBmaWJlciBpcyB0aGUgaW5uZXJcbiAgICAgIC8vIE9mZnNjcmVlbiB3cmFwcGVyLlxuICAgICAgLy9cbiAgICAgIC8vIEJlY2F1c2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBib3VuZGFyeSBoYXZlbid0IHN0YXJ0ZWQgcmVuZGVyaW5nXG4gICAgICAvLyB5ZXQgKGkuZS4gbm90aGluZyBpbiB0aGUgdHJlZSBoYXMgcGFydGlhbGx5IHJlbmRlcmVkKSB3ZSBjYW5cbiAgICAgIC8vIHN3aXRjaCB0byB0aGUgcmVndWxhciwgY29uY3VycmVudCBtb2RlIGJlaGF2aW9yOiBtYXJrIHRoZVxuICAgICAgLy8gYm91bmRhcnkgd2l0aCBTaG91bGRDYXB0dXJlIGFuZCBlbnRlciB0aGUgdW53aW5kIHBoYXNlLlxuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICBzb3VyY2VGaWJlci5mbGFncyB8PSBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlOyAvLyBXZSdyZSBnb2luZyB0byBjb21taXQgdGhpcyBmaWJlciBldmVuIHRob3VnaCBpdCBkaWRuJ3QgY29tcGxldGUuXG4gICAgICAvLyBCdXQgd2Ugc2hvdWxkbid0IGNhbGwgYW55IGxpZmVjeWNsZSBtZXRob2RzIG9yIGNhbGxiYWNrcy4gUmVtb3ZlXG4gICAgICAvLyBhbGwgbGlmZWN5Y2xlIGVmZmVjdCB0YWdzLlxuXG4gICAgICBzb3VyY2VGaWJlci5mbGFncyAmPSB+KExpZmVjeWNsZUVmZmVjdE1hc2sgfCBJbmNvbXBsZXRlKTtcblxuICAgICAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTb3VyY2VGaWJlciA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICBpZiAoY3VycmVudFNvdXJjZUZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudC4gQ2hhbmdlIHRoZSB0YWcgc28gaXQncyBub3QgbWlzdGFrZW4gZm9yIGFcbiAgICAgICAgICAvLyBjb21wbGV0ZWQgY2xhc3MgY29tcG9uZW50LiBGb3IgZXhhbXBsZSwgd2Ugc2hvdWxkIG5vdCBjYWxsXG4gICAgICAgICAgLy8gY29tcG9uZW50V2lsbFVubW91bnQgaWYgaXQgaXMgZGVsZXRlZC5cbiAgICAgICAgICBzb3VyY2VGaWJlci50YWcgPSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSB0cnkgcmVuZGVyaW5nIGFnYWluLCB3ZSBzaG91bGQgbm90IHJldXNlIHRoZSBjdXJyZW50IGZpYmVyLFxuICAgICAgICAgIC8vIHNpbmNlIGl0J3Mga25vd24gdG8gYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBVc2UgYSBmb3JjZSB1cGRhdGUgdG9cbiAgICAgICAgICAvLyBwcmV2ZW50IGEgYmFpbCBvdXQuXG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgU3luY0xhbmUpO1xuICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICBlbnF1ZXVlVXBkYXRlKHNvdXJjZUZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuIE1hcmsgaXQgd2l0aCBTeW5jIHByaW9yaXR5IHRvXG4gICAgICAvLyBpbmRpY2F0ZSB0aGF0IGl0IHN0aWxsIGhhcyBwZW5kaW5nIHdvcmsuXG5cblxuICAgICAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBTeW5jTGFuZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1c3BlbnNlQm91bmRhcnk7XG4gIH0gLy8gQ29uZmlybWVkIHRoYXQgdGhlIGJvdW5kYXJ5IGlzIGluIGEgY29uY3VycmVudCBtb2RlIHRyZWUuIENvbnRpbnVlXG4gIC8vIHdpdGggdGhlIG5vcm1hbCBzdXNwZW5kIHBhdGguXG4gIC8vXG4gIC8vIEFmdGVyIHRoaXMgd2UnbGwgdXNlIGEgc2V0IG9mIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpc1xuICAvLyByZW5kZXIgcGFzcyB3aWxsIHJ1biB0byBjb21wbGV0aW9uIG9yIHJlc3RhcnQgb3IgXCJzdXNwZW5kXCIgdGhlIGNvbW1pdC5cbiAgLy8gVGhlIGFjdHVhbCBsb2dpYyBmb3IgdGhpcyBpcyBzcHJlYWQgb3V0IGluIGRpZmZlcmVudCBwbGFjZXMuXG4gIC8vXG4gIC8vIFRoaXMgZmlyc3QgcHJpbmNpcGxlIGlzIHRoYXQgaWYgd2UncmUgZ29pbmcgdG8gc3VzcGVuZCB3aGVuIHdlIGNvbXBsZXRlXG4gIC8vIGEgcm9vdCwgdGhlbiB3ZSBzaG91bGQgYWxzbyByZXN0YXJ0IGlmIHdlIGdldCBhbiB1cGRhdGUgb3IgcGluZyB0aGF0XG4gIC8vIG1pZ2h0IHVuc3VzcGVuZCBpdCwgYW5kIHZpY2UgdmVyc2EuIFRoZSBvbmx5IHJlYXNvbiB0byBzdXNwZW5kIGlzXG4gIC8vIGJlY2F1c2UgeW91IHRoaW5rIHlvdSBtaWdodCB3YW50IHRvIHJlc3RhcnQgYmVmb3JlIGNvbW1pdHRpbmcuIEhvd2V2ZXIsXG4gIC8vIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZXN0YXJ0IG9ubHkgd2hpbGUgaW4gdGhlIHBlcmlvZCB3ZSdyZSBzdXNwZW5kZWQuXG4gIC8vXG4gIC8vIFJlc3RhcnRpbmcgdG9vIGFnZ3Jlc3NpdmVseSBpcyBhbHNvIG5vdCBnb29kIGJlY2F1c2UgaXQgc3RhcnZlcyBvdXQgYW55XG4gIC8vIGludGVybWVkaWF0ZSBsb2FkaW5nIHN0YXRlLiBTbyB3ZSB1c2UgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hlbi5cbiAgLy8gU3VzcGVuc2UgSGV1cmlzdGljc1xuICAvL1xuICAvLyBJZiBub3RoaW5nIHRocmV3IGEgUHJvbWlzZSBvciBhbGwgdGhlIHNhbWUgZmFsbGJhY2tzIGFyZSBhbHJlYWR5IHNob3dpbmcsXG4gIC8vIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LlxuICAvL1xuICAvLyBJZiB0aGlzIGlzIGFuIGluaXRpYWwgcmVuZGVyIG9mIGEgbmV3IHRyZWUgb2YgU3VzcGVuc2UgYm91bmRhcmllcyBhbmRcbiAgLy8gdGhvc2UgdHJpZ2dlciBhIGZhbGxiYWNrLCB0aGVuIGRvbid0IHN1c3BlbmQvcmVzdGFydC4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBjYW4gc2hvdyB0aGUgaW5pdGlhbCBsb2FkaW5nIHN0YXRlIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuXG4gIC8vXG4gIC8vIElmIHdlIGhpdCBhIFwiRGVsYXllZFwiIGNhc2UsIHN1Y2ggYXMgd2hlbiB3ZSdkIHN3aXRjaCBmcm9tIGNvbnRlbnQgYmFjayBpbnRvXG4gIC8vIGEgZmFsbGJhY2ssIHRoZW4gd2Ugc2hvdWxkIGFsd2F5cyBzdXNwZW5kL3Jlc3RhcnQuIFRyYW5zaXRpb25zIGFwcGx5XG4gIC8vIHRvIHRoaXMgY2FzZS4gSWYgbm9uZSBpcyBkZWZpbmVkLCBKTkQgaXMgdXNlZCBpbnN0ZWFkLlxuICAvL1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBhbmQgaXQgZ2V0cyBcInJldHJpZWRcIiwgYWxsb3dpbmcgdXMgdG8gc2hvd1xuICAvLyBhbm90aGVyIGxldmVsLCBidXQgdGhlcmUncyBzdGlsbCBhbiBpbm5lciBib3VuZGFyeSB0aGF0IHdvdWxkIHNob3cgYSBmYWxsYmFjayxcbiAgLy8gdGhlbiB3ZSBzdXNwZW5kL3Jlc3RhcnQgZm9yIDUwMG1zIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2Ugc2hvd2VkIGEgZmFsbGJhY2tcbiAgLy8gYW55d2hlcmUgaW4gdGhlIHRyZWUuIFRoaXMgZWZmZWN0aXZlbHkgdGhyb3R0bGVzIHByb2dyZXNzaXZlIGxvYWRpbmcgaW50byBhXG4gIC8vIGNvbnNpc3RlbnQgdHJhaW4gb2YgY29tbWl0cy4gVGhpcyBhbHNvIGdpdmVzIHVzIGFuIG9wcG9ydHVuaXR5IHRvIHJlc3RhcnQgdG9cbiAgLy8gZ2V0IHRvIHRoZSBjb21wbGV0ZWQgc3RhdGUgc2xpZ2h0bHkgZWFybGllci5cbiAgLy9cbiAgLy8gSWYgdGhlcmUncyBhbWJpZ3VpdHkgZHVlIHRvIGJhdGNoaW5nIGl0J3MgcmVzb2x2ZWQgaW4gcHJlZmVyZW5jZSBvZjpcbiAgLy8gMSkgXCJkZWxheWVkXCIsIDIpIFwiaW5pdGlhbCByZW5kZXJcIiwgMykgXCJyZXRyeVwiLlxuICAvL1xuICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IGEgXCJidXN5XCIgc3RhdGUgZG9lc24ndCBnZXQgZm9yY2UgY29tbWl0dGVkLiBXZSB3YW50IHRvXG4gIC8vIGVuc3VyZSB0aGF0IG5ldyBpbml0aWFsIGxvYWRpbmcgc3RhdGVzIGNhbiBjb21taXQgYXMgc29vbiBhcyBwb3NzaWJsZS5cblxuXG4gIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTsgLy8gVE9ETzogSSB0aGluayB3ZSBjYW4gcmVtb3ZlIHRoaXMsIHNpbmNlIHdlIG5vdyB1c2UgYERpZENhcHR1cmVgIGluXG4gIC8vIHRoZSBiZWdpbiBwaGFzZSB0byBwcmV2ZW50IGFuIGVhcmx5IGJhaWxvdXQuXG5cbiAgc3VzcGVuc2VCb3VuZGFyeS5sYW5lcyA9IHJvb3RSZW5kZXJMYW5lcztcbiAgcmV0dXJuIHN1c3BlbnNlQm91bmRhcnk7XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKHJvb3QsIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuXG4gIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG5cbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzXG4gICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUaGlzIGlzIGEgd2FrZWFibGUuIFRoZSBjb21wb25lbnQgc3VzcGVuZGVkLlxuICAgIHZhciB3YWtlYWJsZSA9IHZhbHVlO1xuICAgIHJlc2V0U3VzcGVuZGVkQ29tcG9uZW50KHNvdXJjZUZpYmVyKTtcblxuICAgIHtcbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgdmFyIHN1c3BlbnNlQm91bmRhcnkgPSBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcik7XG5cbiAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeSAhPT0gbnVsbCkge1xuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG4gICAgICBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBXZSBvbmx5IGF0dGFjaCBwaW5nIGxpc3RlbmVycyBpbiBjb25jdXJyZW50IG1vZGUuIExlZ2FjeSBTdXNwZW5zZSBhbHdheXNcbiAgICAgIC8vIGNvbW1pdHMgZmFsbGJhY2tzIHN5bmNocm9ub3VzbHksIHNvIHRoZXJlIGFyZSBubyBwaW5ncy5cblxuICAgICAgaWYgKHN1c3BlbnNlQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgYXR0YWNoUmV0cnlMaXN0ZW5lcihzdXNwZW5zZUJvdW5kYXJ5LCByb290LCB3YWtlYWJsZSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGJvdW5kYXJ5IHdhcyBmb3VuZC4gVW5sZXNzIHRoaXMgaXMgYSBzeW5jIHVwZGF0ZSwgdGhpcyBpcyBPSy5cbiAgICAgIC8vIFdlIGNhbiBzdXNwZW5kIGFuZCB3YWl0IGZvciBtb3JlIGRhdGEgdG8gYXJyaXZlLlxuICAgICAgaWYgKCFpbmNsdWRlc1N5bmNMYW5lKHJvb3RSZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBzeW5jIHVwZGF0ZS4gU3VzcGVuZC4gU2luY2Ugd2UncmUgbm90IGFjdGl2YXRpbmcgYVxuICAgICAgICAvLyBTdXNwZW5zZSBib3VuZGFyeSwgdGhpcyB3aWxsIHVud2luZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCB3aXRob3V0XG4gICAgICAgIC8vIHBlcmZvcm1pbmcgYSBzZWNvbmQgcGFzcyB0byByZW5kZXIgYSBmYWxsYmFjay4gKFRoaXMgaXMgYXJndWFibHkgaG93XG4gICAgICAgIC8vIHJlZnJlc2ggdHJhbnNpdGlvbnMgc2hvdWxkIHdvcmssIHRvbywgc2luY2Ugd2UncmUgbm90IGdvaW5nIHRvIGNvbW1pdFxuICAgICAgICAvLyB0aGUgZmFsbGJhY2tzIGFueXdheS4pXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgY2FzZSBhbHNvIGFwcGxpZXMgdG8gaW5pdGlhbCBoeWRyYXRpb24uXG4gICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFRoaXMgaXMgYSBzeW5jL2Rpc2NyZXRlIHVwZGF0ZS4gV2UgdHJlYXQgdGhpcyBjYXNlIGxpa2UgYW4gZXJyb3JcbiAgICAgIC8vIGJlY2F1c2UgZGlzY3JldGUgcmVuZGVycyBhcmUgZXhwZWN0ZWQgdG8gcHJvZHVjZSBhIGNvbXBsZXRlIHRyZWVcbiAgICAgIC8vIHN5bmNocm9ub3VzbHkgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCBleHRlcm5hbCBzdGF0ZS5cblxuXG4gICAgICB2YXIgdW5jYXVnaHRTdXNwZW5zZUVycm9yID0gbmV3IEVycm9yKCdBIGNvbXBvbmVudCBzdXNwZW5kZWQgd2hpbGUgcmVzcG9uZGluZyB0byBzeW5jaHJvbm91cyBpbnB1dC4gVGhpcyAnICsgJ3dpbGwgY2F1c2UgdGhlIFVJIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBsb2FkaW5nIGluZGljYXRvci4gVG8gJyArICdmaXgsIHVwZGF0ZXMgdGhhdCBzdXNwZW5kIHNob3VsZCBiZSB3cmFwcGVkICcgKyAnd2l0aCBzdGFydFRyYW5zaXRpb24uJyk7IC8vIElmIHdlJ3JlIG91dHNpZGUgYSB0cmFuc2l0aW9uLCBmYWxsIHRocm91Z2ggdG8gdGhlIHJlZ3VsYXIgZXJyb3IgcGF0aC5cbiAgICAgIC8vIFRoZSBlcnJvciB3aWxsIGJlIGNhdWdodCBieSB0aGUgbmVhcmVzdCBzdXNwZW5zZSBib3VuZGFyeS5cblxuICAgICAgdmFsdWUgPSB1bmNhdWdodFN1c3BlbnNlRXJyb3I7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSByZWd1bGFyIGVycm9yLCBub3QgYSBTdXNwZW5zZSB3YWtlYWJsZS5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCk7XG5cbiAgICAgIHZhciBfc3VzcGVuc2VCb3VuZGFyeSA9IGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKTsgLy8gSWYgdGhlIGVycm9yIHdhcyB0aHJvd24gZHVyaW5nIGh5ZHJhdGlvbiwgd2UgbWF5IGJlIGFibGUgdG8gcmVjb3ZlciBieVxuICAgICAgLy8gZGlzY2FyZGluZyB0aGUgZGVoeWRyYXRlZCBjb250ZW50IGFuZCBzd2l0Y2hpbmcgdG8gYSBjbGllbnQgcmVuZGVyLlxuICAgICAgLy8gSW5zdGVhZCBvZiBzdXJmYWNpbmcgdGhlIGVycm9yLCBmaW5kIHRoZSBuZWFyZXN0IFN1c3BlbnNlIGJvdW5kYXJ5XG4gICAgICAvLyBhbmQgcmVuZGVyIGl0IGFnYWluIHdpdGhvdXQgaHlkcmF0aW9uLlxuXG5cbiAgICAgIGlmIChfc3VzcGVuc2VCb3VuZGFyeSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoKF9zdXNwZW5zZUJvdW5kYXJ5LmZsYWdzICYgU2hvdWxkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBTZXQgYSBmbGFnIHRvIGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIHRyeSByZW5kZXJpbmcgdGhlIG5vcm1hbFxuICAgICAgICAgIC8vIGNoaWxkcmVuIGFnYWluLCBub3QgdGhlIGZhbGxiYWNrLlxuICAgICAgICAgIF9zdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKF9zdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7IC8vIEV2ZW4gdGhvdWdoIHRoZSB1c2VyIG1heSBub3QgYmUgYWZmZWN0ZWQgYnkgdGhpcyBlcnJvciwgd2Ugc2hvdWxkXG4gICAgICAgIC8vIHN0aWxsIGxvZyBpdCBzbyBpdCBjYW4gYmUgZml4ZWQuXG5cbiAgICAgICAgcXVldWVIeWRyYXRpb25FcnJvcihjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlRmliZXIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKTtcbiAgcmVuZGVyRGlkRXJyb3IodmFsdWUpOyAvLyBXZSBkaWRuJ3QgZmluZCBhIGJvdW5kYXJ5IHRoYXQgY291bGQgaGFuZGxlIHRoaXMgdHlwZSBvZiBleGNlcHRpb24uIFN0YXJ0XG4gIC8vIG92ZXIgYW5kIHRyYXZlcnNlIHBhcmVudCBwYXRoIGFnYWluLCB0aGlzIHRpbWUgdHJlYXRpbmcgdGhlIGV4Y2VwdGlvblxuICAvLyBhcyBhbiBlcnJvci5cblxuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSByZXR1cm5GaWJlcjtcblxuICBkbyB7XG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2Vycm9ySW5mbyA9IHZhbHVlO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG4gICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgbGFuZSk7XG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVJvb3RFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX2Vycm9ySW5mbywgbGFuZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAvLyBDYXB0dXJlIGFuZCByZXRyeVxuICAgICAgICB2YXIgZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgIHZhciBjdG9yID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncyAmJiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkpKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcblxuICAgICAgICAgIHZhciBfbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIF9sYW5lKTsgLy8gU2NoZWR1bGUgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHJlLXJlbmRlciB1c2luZyB1cGRhdGVkIHN0YXRlXG5cbiAgICAgICAgICB2YXIgX3VwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGVycm9ySW5mbywgX2xhbmUpO1xuXG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgfSB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpO1xufVxuXG5mdW5jdGlvbiBnZXRTdXNwZW5kZWRDYWNoZSgpIHtcbiAge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBTdXNwZW5zZSBib3VuZGFyeSBzdXNwZW5kcy4gSXQgcmV0dXJucyB0aGVcbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0QmFkQ2xhc3M7XG52YXIgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnM7XG52YXIgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcztcbnZhciBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcjtcbnZhciBkaWRXYXJuQWJvdXRUYWlsT3B0aW9ucztcbnZhciBkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50O1xuXG57XG4gIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307XG4gIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzID0ge307XG4gIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXIgPSB7fTtcbiAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnMgPSB7fTtcbiAgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xufVxuXG5mdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIElmIHRoaXMgaXMgYSBmcmVzaCBuZXcgY29tcG9uZW50IHRoYXQgaGFzbid0IGJlZW4gcmVuZGVyZWQgeWV0LCB3ZVxuICAgIC8vIHdvbid0IHVwZGF0ZSBpdHMgY2hpbGQgc2V0IGJ5IGFwcGx5aW5nIG1pbmltYWwgc2lkZS1lZmZlY3RzLiBJbnN0ZWFkLFxuICAgIC8vIHdlIHdpbGwgYWRkIHRoZW0gYWxsIHRvIHRoZSBjaGlsZCBiZWZvcmUgaXQgZ2V0cyByZW5kZXJlZC4gVGhhdCBtZWFuc1xuICAgIC8vIHdlIGNhbiBvcHRpbWl6ZSB0aGlzIHJlY29uY2lsaWF0aW9uIHBhc3MgYnkgbm90IHRyYWNraW5nIHNpZGUtZWZmZWN0cy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHRoZSBjdXJyZW50IGNoaWxkIGlzIHRoZSBzYW1lIGFzIHRoZSB3b3JrIGluIHByb2dyZXNzLCBpdCBtZWFucyB0aGF0XG4gICAgLy8gd2UgaGF2ZW4ndCB5ZXQgc3RhcnRlZCBhbnkgd29yayBvbiB0aGVzZSBjaGlsZHJlbi4gVGhlcmVmb3JlLCB3ZSB1c2VcbiAgICAvLyB0aGUgY2xvbmUgYWxnb3JpdGhtIHRvIGNyZWF0ZSBhIGNvcHkgb2YgYWxsIHRoZSBjdXJyZW50IGNoaWxkcmVuLlxuICAgIC8vIElmIHdlIGhhZCBhbnkgcHJvZ3Jlc3NlZCB3b3JrIGFscmVhZHksIHRoYXQgaXMgaW52YWxpZCBhdCB0aGlzIHBvaW50IHNvXG4gICAgLy8gbGV0J3MgdGhyb3cgaXQgb3V0LlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyBmb3JrIG9mIHJlY29uY2lsZUNoaWxkcmVuLiBJdCdzIHVzZWQgaW4gY2FzZXMgd2hlcmUgd2VcbiAgLy8gd2FudCB0byByZWNvbmNpbGUgd2l0aG91dCBtYXRjaGluZyBhZ2FpbnN0IHRoZSBleGlzdGluZyBzZXQuIFRoaXMgaGFzIHRoZVxuICAvLyBlZmZlY3Qgb2YgYWxsIGN1cnJlbnQgY2hpbGRyZW4gYmVpbmcgdW5tb3VudGVkOyBldmVuIGlmIHRoZSB0eXBlIGFuZCBrZXlcbiAgLy8gYXJlIHRoZSBzYW1lLCB0aGUgb2xkIGNoaWxkIGlzIHVubW91bnRlZCBhbmQgYSBuZXcgY2hpbGQgaXMgY3JlYXRlZC5cbiAgLy9cbiAgLy8gVG8gZG8gdGhpcywgd2UncmUgZ29pbmcgdG8gZ28gdGhyb3VnaCB0aGUgcmVjb25jaWxlIGFsZ29yaXRobSB0d2ljZS4gSW5cbiAgLy8gdGhlIGZpcnN0IHBhc3MsIHdlIHNjaGVkdWxlIGEgZGVsZXRpb24gZm9yIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbiBieVxuICAvLyBwYXNzaW5nIG51bGwuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTsgLy8gSW4gdGhlIHNlY29uZCBwYXNzLCB3ZSBtb3VudCB0aGUgbmV3IGNoaWxkcmVuLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0IHdlXG4gIC8vIHBhc3MgbnVsbCBpbiBwbGFjZSBvZiB3aGVyZSB3ZSB1c3VhbGx5IHBhc3MgdGhlIGN1cnJlbnQgY2hpbGQgc2V0LiBUaGlzIGhhc1xuICAvLyB0aGUgZWZmZWN0IG9mIHJlbW91bnRpbmcgYWxsIGNoaWxkcmVuIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVpclxuICAvLyBpZGVudGl0aWVzIG1hdGNoLlxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVGb3J3YXJkUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgYWZ0ZXIgdGhlIGZpcnN0IHJlbmRlciBzdXNwZW5kcy5cbiAgLy8gV2UnbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgZmluZSBvciBjYW4gY2F1c2UgaXNzdWVzLlxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciByZW5kZXIgPSBDb21wb25lbnQucmVuZGVyO1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmOyAvLyBUaGUgcmVzdCBpcyBhIGZvcmsgb2YgdXBkYXRlRnVuY3Rpb25Db21wb25lbnRcblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICB2YXIgaGFzSWQ7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlciwgbmV4dFByb3BzLCByZWYsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmICFkaWRSZWNlaXZlVXBkYXRlKSB7XG4gICAgYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7XG4gICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHZhciB0eXBlID0gQ29tcG9uZW50LnR5cGU7XG5cbiAgICBpZiAoaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSAmJiBDb21wb25lbnQuY29tcGFyZSA9PT0gbnVsbCAmJiAvLyBTaW1wbGVNZW1vQ29tcG9uZW50IGNvZGVwYXRoIGRvZXNuJ3QgcmVzb2x2ZSBvdXRlciBwcm9wcyBlaXRoZXIuXG4gICAgQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICAgICAge1xuICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG4gICAgICB9IC8vIElmIHRoaXMgaXMgYSBwbGFpbiBmdW5jdGlvbiBjb21wb25lbnQgd2l0aG91dCBkZWZhdWx0IHByb3BzLFxuICAgICAgLy8gYW5kIHdpdGggb25seSB0aGUgZGVmYXVsdCBzaGFsbG93IGNvbXBhcmlzb24sIHdlIHVwZ3JhZGUgaXRcbiAgICAgIC8vIHRvIGEgU2ltcGxlTWVtb0NvbXBvbmVudCB0byBhbGxvdyBmYXN0IHBhdGggdXBkYXRlcy5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBTaW1wbGVNZW1vQ29tcG9uZW50O1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVkVHlwZTtcblxuICAgICAge1xuICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIHR5cGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVzb2x2ZWRUeXBlLCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAgIC8vIFdlIGNvdWxkIG1vdmUgaXQgdGhlcmUsIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdGhpcyBmb3IgbGF6eSBjb2RlIHBhdGguXG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCBDb21wb25lbnQuZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkgfHwgJ1Vua25vd24nO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIGVycm9yKCclczogU3VwcG9ydCBmb3IgZGVmYXVsdFByb3BzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIG1lbW8gY29tcG9uZW50cyAnICsgJ2luIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIFVzZSBKYXZhU2NyaXB0IGRlZmF1bHQgcGFyYW1ldGVycyBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoQ29tcG9uZW50LnR5cGUsIG51bGwsIG5leHRQcm9wcywgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLm1vZGUsIHJlbmRlckxhbmVzKTtcbiAgICBjaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgY2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICB7XG4gICAgdmFyIF90eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgdmFyIF9pbm5lclByb3BUeXBlcyA9IF90eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChfaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgY2hlY2tQcm9wVHlwZXMoX2lubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShfdHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Q2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBUaGlzIGlzIGFsd2F5cyBleGFjdGx5IG9uZSBjaGlsZFxuXG4gIHZhciBoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgPSBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcyk7XG5cbiAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQpIHtcbiAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIHByb3BzIHdpdGggcmVzb2x2ZWQgZGVmYXVsdFByb3BzLFxuICAgIC8vIHVubGlrZSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgd2hpY2ggd2lsbCBiZSB0aGUgdW5yZXNvbHZlZCBvbmVzLlxuICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Q2hpbGQubWVtb2l6ZWRQcm9wczsgLy8gRGVmYXVsdCB0byBzaGFsbG93IGNvbXBhcmlzb25cblxuICAgIHZhciBjb21wYXJlID0gQ29tcG9uZW50LmNvbXBhcmU7XG4gICAgY29tcGFyZSA9IGNvbXBhcmUgIT09IG51bGwgPyBjb21wYXJlIDogc2hhbGxvd0VxdWFsO1xuXG4gICAgaWYgKGNvbXBhcmUocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgbmV4dFByb3BzKTtcbiAgbmV3Q2hpbGQucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXdDaGlsZDtcbiAgcmV0dXJuIG5ld0NoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgaW5uZXIgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgb3V0ZXJNZW1vVHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuXG4gICAgICBpZiAob3V0ZXJNZW1vVHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgIC8vIFdlIHdhcm4gd2hlbiB5b3UgZGVmaW5lIHByb3BUeXBlcyBvbiBsYXp5KClcbiAgICAgICAgLy8gc28gbGV0J3MganVzdCBza2lwIG92ZXIgaXQgdG8gZmluZCBtZW1vKCkgb3V0ZXIgd3JhcHBlci5cbiAgICAgICAgLy8gSW5uZXIgcHJvcHMgZm9yIG1lbW8gYXJlIHZhbGlkYXRlZCBsYXRlci5cbiAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSBvdXRlck1lbW9UeXBlO1xuICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBpbml0KHBheWxvYWQpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IG51bGw7XG4gICAgICAgIH0gLy8gSW5uZXIgcHJvcFR5cGVzIHdpbGwgYmUgdmFsaWRhdGVkIGluIHRoZSBmdW5jdGlvbiBjb21wb25lbnQgcGF0aC5cblxuXG4gICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IG91dGVyTWVtb1R5cGUgJiYgb3V0ZXJNZW1vVHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgKFNpbXBsZU1lbW9Db21wb25lbnQgaGFzIG5vIGRlZmF1bHRQcm9wcylcbiAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShvdXRlck1lbW9UeXBlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG5cbiAgICBpZiAoc2hhbGxvd0VxdWFsKHByZXZQcm9wcywgbmV4dFByb3BzKSAmJiBjdXJyZW50LnJlZiA9PT0gd29ya0luUHJvZ3Jlc3MucmVmICYmICggLy8gUHJldmVudCBiYWlsb3V0IGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VkIGR1ZSB0byBob3QgcmVsb2FkLlxuICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSBjdXJyZW50LnR5cGUgKSkge1xuICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlOyAvLyBUaGUgcHJvcHMgYXJlIHNoYWxsb3dseSBlcXVhbC4gUmV1c2UgdGhlIHByZXZpb3VzIHByb3BzIG9iamVjdCwgbGlrZSB3ZVxuICAgICAgLy8gd291bGQgZHVyaW5nIGEgbm9ybWFsIGZpYmVyIGJhaWxvdXQuXG4gICAgICAvL1xuICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBzdHJvbmcgZ3VhcmFudGVlcyB0aGF0IHRoZSBwcm9wcyBvYmplY3QgaXMgcmVmZXJlbnRpYWxseVxuICAgICAgLy8gZXF1YWwgZHVyaW5nIHVwZGF0ZXMgd2hlcmUgd2UgY2FuJ3QgYmFpbCBvdXQgYW55d2F5IOKAlCBsaWtlIGlmIHRoZSBwcm9wc1xuICAgICAgLy8gYXJlIHNoYWxsb3dseSBlcXVhbCwgYnV0IHRoZXJlJ3MgYSBsb2NhbCBzdGF0ZSBvciBjb250ZXh0IHVwZGF0ZSBpbiB0aGVcbiAgICAgIC8vIHNhbWUgYmF0Y2guXG4gICAgICAvL1xuICAgICAgLy8gSG93ZXZlciwgYXMgYSBwcmluY2lwbGUsIHdlIHNob3VsZCBhaW0gdG8gbWFrZSB0aGUgYmVoYXZpb3IgY29uc2lzdGVudFxuICAgICAgLy8gYWNyb3NzIGRpZmZlcmVudCB3YXlzIG9mIG1lbW9pemluZyBhIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIFJlYWN0Lm1lbW9cbiAgICAgIC8vIGhhcyBhIGRpZmZlcmVudCBpbnRlcm5hbCBGaWJlciBsYXlvdXQgaWYgeW91IHBhc3MgYSBub3JtYWwgZnVuY3Rpb25cbiAgICAgIC8vIGNvbXBvbmVudCAoU2ltcGxlTWVtb0NvbXBvbmVudCkgdmVyc3VzIGlmIHlvdSBwYXNzIGEgZGlmZmVyZW50IHR5cGVcbiAgICAgIC8vIGxpa2UgZm9yd2FyZFJlZiAoTWVtb0NvbXBvbmVudCkuIEJ1dCB0aGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC5cbiAgICAgIC8vIFdyYXBwaW5nIGEgY29tcG9uZW50IGluIGZvcndhcmRSZWYgKG9yIFJlYWN0LmxhenksIGV0Yykgc2hvdWxkbid0XG4gICAgICAvLyBhZmZlY3Qgd2hldGhlciB0aGUgcHJvcHMgb2JqZWN0IGlzIHJldXNlZCBkdXJpbmcgYSBiYWlsb3V0LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBuZXh0UHJvcHMgPSBwcmV2UHJvcHM7XG5cbiAgICAgIGlmICghY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICAgIC8vIFRoZSBwZW5kaW5nIGxhbmVzIHdlcmUgY2xlYXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGJlZ2luV29yay4gV2UncmVcbiAgICAgICAgLy8gYWJvdXQgdG8gYmFpbCBvdXQsIGJ1dCB0aGVyZSBtaWdodCBiZSBvdGhlciBsYW5lcyB0aGF0IHdlcmVuJ3RcbiAgICAgICAgLy8gaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgcmVuZGVyLiBVc3VhbGx5LCB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhlXG4gICAgICAgIC8vIHJlbWFpbmluZyB1cGRhdGVzIGlzIGFjY3VtdWxhdGVkIGR1cmluZyB0aGUgZXZhbHVhdGlvbiBvZiB0aGVcbiAgICAgICAgLy8gY29tcG9uZW50IChpLmUuIHdoZW4gcHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlKS4gQnV0IHNpbmNlIHNpbmNlXG4gICAgICAgIC8vIHdlJ3JlIGJhaWxpbmcgb3V0IGVhcmx5ICp3aXRob3V0KiBldmFsdWF0aW5nIHRoZSBjb21wb25lbnQsIHdlIG5lZWRcbiAgICAgICAgLy8gdG8gYWNjb3VudCBmb3IgaXQgaGVyZSwgdG9vLiBSZXNldCB0byB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgZmliZXIuXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgb25seSBhcHBsaWVzIHRvIFNpbXBsZU1lbW9Db21wb25lbnQsIG5vdCBNZW1vQ29tcG9uZW50LFxuICAgICAgICAvLyBiZWNhdXNlIGEgTWVtb0NvbXBvbmVudCBmaWJlciBkb2VzIG5vdCBoYXZlIGhvb2tzIG9yIGFuIHVwZGF0ZSBxdWV1ZTtcbiAgICAgICAgLy8gcmF0aGVyLCBpdCB3cmFwcyBhcm91bmQgYW4gaW5uZXIgY29tcG9uZW50LCB3aGljaCBtYXkgb3IgbWF5IG5vdFxuICAgICAgICAvLyBjb250YWlucyBob29rcy5cbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGUgcmVzZXQgYXQgaW4gYmVnaW5Xb3JrIG91dCBvZiB0aGUgY29tbW9uIHBhdGggc28gdGhhdFxuICAgICAgICAvLyB0aGlzIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgcHJldlN0YXRlID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSA6IG51bGw7XG5cbiAgaWYgKG5leHRQcm9wcy5tb2RlID09PSAnaGlkZGVuJyB8fCBlbmFibGVMZWdhY3lIaWRkZW4gKSB7XG4gICAgLy8gUmVuZGVyaW5nIGEgaGlkZGVuIHRyZWUuXG4gICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIGxlZ2FjeSBzeW5jIG1vZGUsIGRvbid0IGRlZmVyIHRoZSBzdWJ0cmVlLiBSZW5kZXIgaXQgbm93LlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgaG93IE9mZnNjcmVlbiBzaG91bGQgd29yayB3aXRoIHRyYW5zaXRpb25zIGluIHRoZSBmdXR1cmVcbiAgICAgIHZhciBuZXh0U3RhdGUgPSB7XG4gICAgICAgIGJhc2VMYW5lczogTm9MYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXh0U3RhdGU7XG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIE9mZnNjcmVlbkxhbmUpKSB7XG4gICAgICB2YXIgc3Bhd25lZENhY2hlUG9vbCA9IG51bGw7IC8vIFdlJ3JlIGhpZGRlbiwgYW5kIHdlJ3JlIG5vdCByZW5kZXJpbmcgYXQgT2Zmc2NyZWVuLiBXZSB3aWxsIGJhaWwgb3V0XG4gICAgICAvLyBhbmQgcmVzdW1lIHRoaXMgdHJlZSBsYXRlci5cblxuICAgICAgdmFyIG5leHRCYXNlTGFuZXM7XG5cbiAgICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZCYXNlTGFuZXMgPSBwcmV2U3RhdGUuYmFzZUxhbmVzO1xuICAgICAgICBuZXh0QmFzZUxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2QmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0QmFzZUxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgICB9IC8vIFNjaGVkdWxlIHRoaXMgZmliZXIgdG8gcmUtcmVuZGVyIGF0IG9mZnNjcmVlbiBwcmlvcml0eS4gVGhlbiBiYWlsb3V0LlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGxhbmVUb0xhbmVzKE9mZnNjcmVlbkxhbmUpO1xuICAgICAgdmFyIF9uZXh0U3RhdGUgPSB7XG4gICAgICAgIGJhc2VMYW5lczogbmV4dEJhc2VMYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBzcGF3bmVkQ2FjaGVQb29sLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBfbmV4dFN0YXRlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgLy8gdG8gYXZvaWQgYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG5cblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBuZXh0QmFzZUxhbmVzKTtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIHNlY29uZCByZW5kZXIuIFRoZSBzdXJyb3VuZGluZyB2aXNpYmxlIGNvbnRlbnQgaGFzIGFscmVhZHlcbiAgICAgIC8vIGNvbW1pdHRlZC4gTm93IHdlIHJlc3VtZSByZW5kZXJpbmcgdGhlIGhpZGRlbiB0cmVlLlxuICAgICAgLy8gUmVuZGVyaW5nIGF0IG9mZnNjcmVlbiwgc28gd2UgY2FuIGNsZWFyIHRoZSBiYXNlIGxhbmVzLlxuICAgICAgdmFyIF9uZXh0U3RhdGUyID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTI7IC8vIFB1c2ggdGhlIGxhbmVzIHRoYXQgd2VyZSBza2lwcGVkIHdoZW4gd2UgYmFpbGVkIG91dC5cblxuICAgICAgdmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHByZXZTdGF0ZSAhPT0gbnVsbCA/IHByZXZTdGF0ZS5iYXNlTGFuZXMgOiByZW5kZXJMYW5lcztcblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZW5kZXJpbmcgYSB2aXNpYmxlIHRyZWUuXG4gICAgdmFyIF9zdWJ0cmVlUmVuZGVyTGFuZXM7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBnb2luZyBmcm9tIGhpZGRlbiAtPiB2aXNpYmxlLlxuICAgICAgX3N1YnRyZWVSZW5kZXJMYW5lcyA9IG1lcmdlTGFuZXMocHJldlN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugd2VyZW4ndCBwcmV2aW91c2x5IGhpZGRlbiwgYW5kIHdlIHN0aWxsIGFyZW4ndCwgc28gdGhlcmUncyBub3RoaW5nXG4gICAgICAvLyBzcGVjaWFsIHRvIGRvLiBOZWVkIHRvIHB1c2ggdG8gdGhlIHN0YWNrIHJlZ2FyZGxlc3MsIHRob3VnaCwgdG8gYXZvaWRcbiAgICAgIC8vIGEgcHVzaC9wb3AgbWlzYWxpZ25tZW50LlxuICAgICAgX3N1YnRyZWVSZW5kZXJMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgIH1cblxuICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgX3N1YnRyZWVSZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn0gLy8gTm90ZTogVGhlc2UgaGFwcGVuIHRvIGhhdmUgaWRlbnRpY2FsIGJlZ2luIHBoYXNlcywgZm9yIG5vdy4gV2Ugc2hvdWxkbid0IGhvbGRcblxuZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG5cbiAgICB7XG4gICAgICAvLyBSZXNldCBlZmZlY3QgZHVyYXRpb25zIGZvciB0aGUgbmV4dCBldmVudHVhbCBlZmZlY3QgcGhhc2UuXG4gICAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsICYmIHJlZiAhPT0gbnVsbCB8fCBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSByZWYpIHtcbiAgICAvLyBTY2hlZHVsZSBhIFJlZiBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWY7XG5cbiAgICB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgY29udGV4dDtcblxuICB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgICBjb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHZhciBoYXNJZDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBlcnJvci5cbiAgICBzd2l0Y2ggKHNob3VsZEVycm9yKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUT0RPIFRoaXMgd2F5IG9mIHJlc2V0dGluZyB0aGUgZXJyb3IgYm91bmRhcnkgc3RhdGUgaXMgYSBoYWNrLlxuICAgICAgICAgIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzP1xuXG4gICAgICAgICAgdmFyIHRlbXBJbnN0YW5jZSA9IG5ldyBjdG9yKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMsIF9pbnN0YW5jZS5jb250ZXh0KTtcbiAgICAgICAgICB2YXIgc3RhdGUgPSB0ZW1wSW5zdGFuY2Uuc3RhdGU7XG5cbiAgICAgICAgICBfaW5zdGFuY2UudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUoX2luc3RhbmNlLCBzdGF0ZSwgbnVsbCk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIHRydWU6XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG5cbiAgICAgICAgICB2YXIgZXJyb3IkMSA9IG5ldyBFcnJvcignU2ltdWxhdGVkIGVycm9yIGNvbWluZyBmcm9tIERldlRvb2xzJyk7XG4gICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTsgLy8gU2NoZWR1bGUgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHJlLXJlbmRlciB1c2luZyB1cGRhdGVkIHN0YXRlXG5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IkMSwgd29ya0luUHJvZ3Jlc3MpLCBsYW5lKTtcbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIHVwZGF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRVcGRhdGU7XG5cbiAgaWYgKGluc3RhbmNlID09PSBudWxsKSB7XG4gICAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIEluIHRoZSBpbml0aWFsIHBhc3Mgd2UgbWlnaHQgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlLlxuXG4gICAgY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMpO1xuICAgIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICBzaG91bGRVcGRhdGUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbiBhIHJlc3VtZSwgd2UnbGwgYWxyZWFkeSBoYXZlIGFuIGluc3RhbmNlIHdlIGNhbiByZXVzZS5cbiAgICBzaG91bGRVcGRhdGUgPSByZXN1bWVNb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgc2hvdWxkVXBkYXRlID0gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBuZXh0VW5pdE9mV29yayA9IGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICB2YXIgaW5zdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmIChzaG91bGRVcGRhdGUgJiYgaW5zdC5wcm9wcyAhPT0gbmV4dFByb3BzKSB7XG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgZXJyb3IoJ0l0IGxvb2tzIGxpa2UgJXMgaXMgcmVhc3NpZ25pbmcgaXRzIG93biBgdGhpcy5wcm9wc2Agd2hpbGUgcmVuZGVyaW5nLiAnICsgJ1RoaXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgY2FuIGxlYWQgdG8gY29uZnVzaW5nIGJ1Z3MuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ2EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0VW5pdE9mV29yaztcbn1cblxuZnVuY3Rpb24gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcykge1xuICAvLyBSZWZzIHNob3VsZCB1cGRhdGUgZXZlbiBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJucyBmYWxzZVxuICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIGRpZENhcHR1cmVFcnJvciA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmICghc2hvdWxkVXBkYXRlICYmICFkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBDb250ZXh0IHByb3ZpZGVycyBzaG91bGQgZGVmZXIgdG8gc0NVIGZvciByZW5kZXJpbmdcbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gUmVyZW5kZXJcblxuICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIG5leHRDaGlsZHJlbjtcblxuICBpZiAoZGlkQ2FwdHVyZUVycm9yICYmIHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYgd2UgY2FwdHVyZWQgYW4gZXJyb3IsIGJ1dCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXMgbm90IGRlZmluZWQsXG4gICAgLy8gdW5tb3VudCBhbGwgdGhlIGNoaWxkcmVuLiBjb21wb25lbnREaWRDYXRjaCB3aWxsIHNjaGVkdWxlIGFuIHVwZGF0ZSB0b1xuICAgIC8vIHJlLXJlbmRlciBhIGZhbGxiYWNrLiBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB3ZSBtaWdyYXRlIGV2ZXJ5b25lIHRvXG4gICAgLy8gdGhlIG5ldyBBUEkuXG4gICAgLy8gVE9ETzogV2FybiBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgIG5leHRDaGlsZHJlbiA9IG51bGw7XG5cbiAgICB7XG4gICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGluc3RhbmNlLnJlbmRlcigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBJZiB3ZSdyZSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlY29uY2lsZSB3aXRob3V0IHJldXNpbmcgYW55IG9mXG4gICAgLy8gdGhlIGV4aXN0aW5nIGNoaWxkcmVuLiBDb25jZXB0dWFsbHksIHRoZSBub3JtYWwgY2hpbGRyZW4gYW5kIHRoZSBjaGlsZHJlblxuICAgIC8vIHRoYXQgYXJlIHNob3duIG9uIGVycm9yIGFyZSB0d28gZGlmZmVyZW50IHNldHMsIHNvIHdlIHNob3VsZG4ndCByZXVzZVxuICAgIC8vIG5vcm1hbCBjaGlsZHJlbiBldmVuIGlmIHRoZWlyIGlkZW50aXRpZXMgbWF0Y2guXG4gICAgZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IC8vIE1lbW9pemUgc3RhdGUgdXNpbmcgdGhlIHZhbHVlcyB3ZSBqdXN0IHVzZWQgdG8gcmVuZGVyLlxuICAvLyBUT0RPOiBSZXN0cnVjdHVyZSBzbyB3ZSBuZXZlciByZWFkIHZhbHVlcyBmcm9tIHRoZSBpbnN0YW5jZS5cblxuXG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTsgLy8gVGhlIGNvbnRleHQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNvIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgaXQuXG5cbiAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKSB7XG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmIChyb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5wZW5kaW5nQ29udGV4dCwgcm9vdC5wZW5kaW5nQ29udGV4dCAhPT0gcm9vdC5jb250ZXh0KTtcbiAgfSBlbHNlIGlmIChyb290LmNvbnRleHQpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGJlIHNldFxuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGV4dCwgZmFsc2UpO1xuICB9XG5cbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGFpbmVySW5mbyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RSb290KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBjdXJyZW50IGZpYmVyLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwcmV2Q2hpbGRyZW4gPSBwcmV2U3RhdGUuZWxlbWVudDtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG5cbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRTdGF0ZS5lbGVtZW50O1xuXG4gIGlmICggcHJldlN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgIC8vIFRoaXMgaXMgYSBoeWRyYXRpb24gcm9vdCB3aG9zZSBzaGVsbCBoYXMgbm90IHlldCBoeWRyYXRlZC4gV2Ugc2hvdWxkXG4gICAgLy8gYXR0ZW1wdCB0byBoeWRyYXRlLlxuICAgIC8vIEZsaXAgaXNEZWh5ZHJhdGVkIHRvIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgd2hlbiB0aGlzIHJlbmRlclxuICAgIC8vIGZpbmlzaGVzLCB0aGUgcm9vdCB3aWxsIG5vIGxvbmdlciBiZSBkZWh5ZHJhdGVkLlxuICAgIHZhciBvdmVycmlkZVN0YXRlID0ge1xuICAgICAgZWxlbWVudDogbmV4dENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBmYWxzZSxcbiAgICAgIGNhY2hlOiBuZXh0U3RhdGUuY2FjaGUsXG4gICAgICBwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOiBuZXh0U3RhdGUucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyxcbiAgICAgIHRyYW5zaXRpb25zOiBuZXh0U3RhdGUudHJhbnNpdGlvbnNcbiAgICB9O1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBgYmFzZVN0YXRlYCBjYW4gYWx3YXlzIGJlIHRoZSBsYXN0IHN0YXRlIGJlY2F1c2UgdGhlIHJvb3QgZG9lc24ndFxuICAgIC8vIGhhdmUgcmVkdWNlciBmdW5jdGlvbnMgc28gaXQgZG9lc24ndCBuZWVkIHJlYmFzaW5nLlxuXG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgYSBwcmV2aW91cyBhdHRlbXB0IHRvIGh5ZHJhdGUgdGhlIHNoZWxsLCBzbyB3ZVxuICAgICAgLy8gZm9yY2VkIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIobmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nLiBCZWNhdXNlIHRoZSBlcnJvciBoYXBwZW5lZCBvdXRzaWRlICcgKyAnb2YgYSBTdXNwZW5zZSBib3VuZGFyeSwgdGhlIGVudGlyZSByb290IHdpbGwgc3dpdGNoIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKTtcbiAgICB9IGVsc2UgaWYgKG5leHRDaGlsZHJlbiAhPT0gcHJldkNoaWxkcmVuKSB7XG4gICAgICB2YXIgX3JlY292ZXJhYmxlRXJyb3IgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihuZXcgRXJyb3IoJ1RoaXMgcm9vdCByZWNlaXZlZCBhbiBlYXJseSB1cGRhdGUsIGJlZm9yZSBhbnl0aGluZyB3YXMgYWJsZSAnICsgJ2h5ZHJhdGUuIFN3aXRjaGVkIHRoZSBlbnRpcmUgcm9vdCB0byBjbGllbnQgcmVuZGVyaW5nLicpLCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgX3JlY292ZXJhYmxlRXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgb3V0ZXJtb3N0IHNoZWxsIGhhcyBub3QgaHlkcmF0ZWQgeWV0LiBTdGFydCBoeWRyYXRpbmcuXG4gICAgICBlbnRlckh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgdmFyIGNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICAgICAgdmFyIG5vZGUgPSBjaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgLy8gTWFyayBlYWNoIGNoaWxkIGFzIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGZhc3QgcGF0aCB0byBrbm93IHdoZXRoZXIgdGhpc1xuICAgICAgICAvLyB0cmVlIGlzIHBhcnQgb2YgYSBoeWRyYXRpbmcgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkXG4gICAgICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgICAgICAvLyBDb25jZXB0dWFsbHkgdGhpcyBpcyBzaW1pbGFyIHRvIFBsYWNlbWVudCBpbiB0aGF0IGEgbmV3IHN1YnRyZWUgaXNcbiAgICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0aGUgUmVhY3QgdHJlZSBoZXJlLiBJdCBqdXN0IGhhcHBlbnMgdG8gbm90IG5lZWQgRE9NXG4gICAgICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgICAgICBub2RlLmZsYWdzID0gbm9kZS5mbGFncyAmIH5QbGFjZW1lbnQgfCBIeWRyYXRpbmc7XG4gICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJvb3QgaXMgbm90IGRlaHlkcmF0ZWQuIEVpdGhlciB0aGlzIGlzIGEgY2xpZW50LW9ubHkgcm9vdCwgb3IgaXRcbiAgICAvLyBhbHJlYWR5IGh5ZHJhdGVkLlxuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcblxuICAgIGlmIChuZXh0Q2hpbGRyZW4gPT09IHByZXZDaGlsZHJlbikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKSB7XG4gIC8vIFJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLlxuICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gIHF1ZXVlSHlkcmF0aW9uRXJyb3IocmVjb3ZlcmFibGVFcnJvcik7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBudWxsO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgaXNEaXJlY3RUZXh0Q2hpbGQgPSBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBuZXh0UHJvcHMpO1xuXG4gIGlmIChpc0RpcmVjdFRleHRDaGlsZCkge1xuICAgIC8vIFdlIHNwZWNpYWwgY2FzZSBhIGRpcmVjdCB0ZXh0IGNoaWxkIG9mIGEgaG9zdCBub2RlLiBUaGlzIGlzIGEgY29tbW9uXG4gICAgLy8gY2FzZS4gV2Ugd29uJ3QgaGFuZGxlIGl0IGFzIGEgcmVpZmllZCBjaGlsZC4gV2Ugd2lsbCBpbnN0ZWFkIGhhbmRsZVxuICAgIC8vIHRoaXMgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQgdGhhdCBhbHNvIGhhcyBhY2Nlc3MgdG8gdGhpcyBwcm9wLiBUaGF0XG4gICAgLy8gYXZvaWRzIGFsbG9jYXRpbmcgYW5vdGhlciBIb3N0VGV4dCBmaWJlciBhbmQgdHJhdmVyc2luZyBpdC5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXZQcm9wcyAhPT0gbnVsbCAmJiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcmV2UHJvcHMpKSB7XG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gYSBkaXJlY3QgdGV4dCBjaGlsZCB0byBhIG5vcm1hbCBjaGlsZCwgb3IgdG9cbiAgICAvLyBlbXB0eSwgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgdGV4dCBjb250ZW50IHRvIGJlIHJlc2V0LlxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENvbnRlbnRSZXNldDtcbiAgfVxuXG4gIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gTm90aGluZyB0byBkbyBoZXJlLiBUaGlzIGlzIHRlcm1pbmFsLiBXZSdsbCBkbyB0aGUgY29tcGxldGlvbiBzdGVwXG4gIC8vIGltbWVkaWF0ZWx5IGFmdGVyLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1vdW50TGF6eUNvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGxhenlDb21wb25lbnQgPSBlbGVtZW50VHlwZTtcbiAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG4gIHZhciBDb21wb25lbnQgPSBpbml0KHBheWxvYWQpOyAvLyBTdG9yZSB0aGUgdW53cmFwcGVkIGNvbXBvbmVudCBpbiB0aGUgdHlwZS5cblxuICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50O1xuICB2YXIgcmVzb2x2ZWRUYWcgPSB3b3JrSW5Qcm9ncmVzcy50YWcgPSByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpO1xuICB2YXIgcmVzb2x2ZWRQcm9wcyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCBwcm9wcyk7XG4gIHZhciBjaGlsZDtcblxuICBzd2l0Y2ggKHJlc29sdmVkVGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlRm9yd2FyZFJlZihudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCByZXNvbHZlZFByb3BzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZU1lbW9Db21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQudHlwZSwgcmVzb2x2ZWRQcm9wcyksIC8vIFRoZSBpbm5lciB0eXBlIGNhbiBoYXZlIGRlZmF1bHRzIHRvb1xuICAgICAgICByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgfVxuXG4gIHZhciBoaW50ID0gJyc7XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIENvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgIGhpbnQgPSAnIERpZCB5b3Ugd3JhcCBhIGNvbXBvbmVudCBpbiBSZWFjdC5sYXp5KCkgbW9yZSB0aGFuIG9uY2U/JztcbiAgICB9XG4gIH0gLy8gVGhpcyBtZXNzYWdlIGludGVudGlvbmFsbHkgZG9lc24ndCBtZW50aW9uIEZvcndhcmRSZWYgb3IgTWVtb0NvbXBvbmVudFxuICAvLyBiZWNhdXNlIHRoZSBmYWN0IHRoYXQgaXQncyBhIHNlcGFyYXRlIHR5cGUgb2Ygd29yayBpcyBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG5cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IHR5cGUgaXMgaW52YWxpZC4gUmVjZWl2ZWQgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG86IFwiICsgQ29tcG9uZW50ICsgXCIuIFwiICsgKFwiTGF6eSBlbGVtZW50IHR5cGUgbXVzdCByZXNvbHZlIHRvIGEgY2xhc3Mgb3IgZnVuY3Rpb24uXCIgKyBoaW50KSk7XG59XG5cbmZ1bmN0aW9uIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsgLy8gUHJvbW90ZSB0aGUgZmliZXIgdG8gYSBjbGFzcyBhbmQgdHJ5IHJlbmRlcmluZyBhZ2Fpbi5cblxuICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuICAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSB7XG4gIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgY29udGV4dDtcblxuICB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgdmFsdWU7XG4gIHZhciBoYXNJZDtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQucHJvdG90eXBlICYmIHR5cGVvZiBDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0QmFkQ2xhc3NbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoXCJUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGhhdmUgYSByZW5kZXIgbWV0aG9kLCBidXQgZG9lc24ndCBleHRlbmQgUmVhY3QuQ29tcG9uZW50LiBcIiArICdUaGlzIGlzIGxpa2VseSB0byBjYXVzZSBlcnJvcnMuIENoYW5nZSAlcyB0byBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuJywgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0QmFkQ2xhc3NbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIG51bGwpO1xuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG5cbiAge1xuICAgIC8vIFN1cHBvcnQgZm9yIG1vZHVsZSBjb21wb25lbnRzIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHJlbW92ZWQgYmVoaW5kIGEgZmxhZy5cbiAgICAvLyBXaGV0aGVyIG9yIG5vdCBpdCB3b3VsZCBjcmFzaCBsYXRlciwgd2Ugd2FudCB0byBzaG93IGEgZ29vZCBtZXNzYWdlIGluIERFViBmaXJzdC5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZSwgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCAvLyBSdW4gdGhlc2UgY2hlY2tzIGluIHByb2R1Y3Rpb24gb25seSBpZiB0aGUgZmxhZyBpcyBvZmYuXG4gIC8vIEV2ZW50dWFsbHkgd2UnbGwgZGVsZXRlIHRoaXMgYnJhbmNoIGFsdG9nZXRoZXIuXG4gICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTIgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTJdKSB7XG4gICAgICAgIGVycm9yKCdUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGJlIGEgZnVuY3Rpb24gY29tcG9uZW50IHRoYXQgcmV0dXJucyBhIGNsYXNzIGluc3RhbmNlLiAnICsgJ0NoYW5nZSAlcyB0byBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4gJyArIFwiSWYgeW91IGNhbid0IHVzZSBhIGNsYXNzIHRyeSBhc3NpZ25pbmcgdGhlIHByb3RvdHlwZSBvbiB0aGUgZnVuY3Rpb24gYXMgYSB3b3JrYXJvdW5kLiBcIiArIFwiYCVzLnByb3RvdHlwZSA9IFJlYWN0LkNvbXBvbmVudC5wcm90b3R5cGVgLiBEb24ndCB1c2UgYW4gYXJyb3cgZnVuY3Rpb24gc2luY2UgaXQgXCIgKyAnY2Fubm90IGJlIGNhbGxlZCB3aXRoIGBuZXdgIGJ5IFJlYWN0LicsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyLCBfY29tcG9uZW50TmFtZTIpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfSAvLyBQcm9jZWVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyBhIGNsYXNzIGluc3RhbmNlXG5cblxuICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IENsYXNzQ29tcG9uZW50OyAvLyBUaHJvdyBvdXQgYW55IGhvb2tzIHRoYXQgd2VyZSB1c2VkLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsOyAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAgIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cbiAgICB2YXIgaGFzQ29udGV4dCA9IGZhbHNlO1xuXG4gICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gdmFsdWUuc3RhdGUgIT09IG51bGwgJiYgdmFsdWUuc3RhdGUgIT09IHVuZGVmaW5lZCA/IHZhbHVlLnN0YXRlIDogbnVsbDtcbiAgICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICAgIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgdmFsdWUpO1xuICAgIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBmaW5pc2hDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBmdW5jdGlvbiBjb21wb25lbnRcbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBGdW5jdGlvbkNvbXBvbmVudDtcblxuICAgIHtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7XG4gICAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihudWxsLCB3b3JrSW5Qcm9ncmVzcywgdmFsdWUsIHJlbmRlckxhbmVzKTtcblxuICAgIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpIHtcbiAge1xuICAgIGlmIChDb21wb25lbnQpIHtcbiAgICAgIGlmIChDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb24gY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgIH1cblxuICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvd25lck5hbWUgfHwgJyc7XG4gICAgICB2YXIgZGVidWdTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2U7XG5cbiAgICAgIGlmIChkZWJ1Z1NvdXJjZSkge1xuICAgICAgICB3YXJuaW5nS2V5ID0gZGVidWdTb3VyY2UuZmlsZU5hbWUgKyAnOicgKyBkZWJ1Z1NvdXJjZS5saW5lTnVtYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmc1t3YXJuaW5nS2V5XSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzLiAnICsgJ0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHVzZSBSZWFjdC5mb3J3YXJkUmVmKCk/JXMnLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignJXM6IFN1cHBvcnQgZm9yIGRlZmF1bHRQcm9wcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBmdW5jdGlvbiBjb21wb25lbnRzICcgKyAnaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gVXNlIEphdmFTY3JpcHQgZGVmYXVsdCBwYXJhbWV0ZXJzIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUzID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdKSB7XG4gICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBjb250ZXh0VHlwZS4nLCBfY29tcG9uZW50TmFtZTQpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFNVU1BFTkRFRF9NQVJLRVIgPSB7XG4gIGRlaHlkcmF0ZWQ6IG51bGwsXG4gIHRyZWVDb250ZXh0OiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lcyxcbiAgICBjYWNoZVBvb2w6IGdldFN1c3BlbmRlZENhY2hlKCksXG4gICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjYWNoZVBvb2wgPSBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiBtZXJnZUxhbmVzKHByZXZPZmZzY3JlZW5TdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKSxcbiAgICBjYWNoZVBvb2w6IGNhY2hlUG9vbCxcbiAgICB0cmFuc2l0aW9uczogcHJldk9mZnNjcmVlblN0YXRlLnRyYW5zaXRpb25zXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgIC8vIGlzIHRydWUuIE1vcmUgcHJlY2lzZSBuYW1lIG1pZ2h0IGJlIFwiRm9yY2VSZW1haW5TdXNwZW5zZUZhbGxiYWNrXCIuXG4gICAgICAvLyBOb3RlOiBUaGlzIGlzIGEgZmFjdG9yaW5nIHNtZWxsLiBDYW4ndCByZW1haW4gb24gYSBmYWxsYmFjayBpZiB0aGVyZSdzXG4gICAgICAvLyBubyBmYWxsYmFjayB0byByZW1haW4gb24uXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IC8vIE5vdCBjdXJyZW50bHkgc2hvd2luZyBjb250ZW50LiBDb25zdWx0IHRoZSBTdXNwZW5zZSBjb250ZXh0LlxuXG5cbiAgcmV0dXJuIGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IFNob3VsZCBub3QgcmVtb3ZlIHJlbmRlciBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIGR1cmluZyB0aGlzIHJlbmRlclxuICByZXR1cm4gcmVtb3ZlTGFuZXMoY3VycmVudC5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBzdXNwZW5kLlxuXG4gIHtcbiAgICBpZiAoc2hvdWxkU3VzcGVuZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3dGYWxsYmFjayA9IGZhbHNlO1xuICB2YXIgZGlkU3VzcGVuZCA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChkaWRTdXNwZW5kIHx8IHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50KSkge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGlzIGJvdW5kYXJ5J3Mgc3VidHJlZSBhbHJlYWR5IHN1c3BlbmRlZC4gU3dpdGNoIHRvXG4gICAgLy8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICBzaG93RmFsbGJhY2sgPSB0cnVlO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5EaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIC8vIEF0dGVtcHRpbmcgdGhlIG1haW4gY29udGVudFxuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudCBvciB0aGlzIGJvdW5kYXJ5IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gTWFyayB0aGlzIHN1YnRyZWUgY29udGV4dCBhcyBoYXZpbmcgYXQgbGVhc3Qgb25lIGludmlzaWJsZSBwYXJlbnQgdGhhdCBjb3VsZFxuICAgICAgLy8gaGFuZGxlIHRoZSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIEF2b2lkZWQgYm91bmRhcmllcyBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2UgdGhleSBjYW5ub3QgaGFuZGxlIHByZWZlcnJlZCBmYWxsYmFjayBzdGF0ZXMuXG4gICAgICB7XG4gICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7IC8vIE9LLCB0aGUgbmV4dCBwYXJ0IGlzIGNvbmZ1c2luZy4gV2UncmUgYWJvdXQgdG8gcmVjb25jaWxlIHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSdzIGNoaWxkcmVuLiBUaGlzIGludm9sdmVzIHNvbWUgY3VzdG9tIHJlY29uY2lsaWF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaHlkcmF0aW5nLCB0cnkgdG8gaHlkcmF0ZSB0aGlzIGJvdW5kYXJ5LlxuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTsgLy8gVGhpcyBjb3VsZCd2ZSBiZWVuIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQuXG5cbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGRlaHlkcmF0ZWQgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChkZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgZGVoeWRyYXRlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIG5leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuXG4gICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgdmFyIGZhbGxiYWNrRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcblxuICAgICAgcmV0dXJuIGZhbGxiYWNrRnJhZ21lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cGRhdGUuXG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9kZWh5ZHJhdGVkID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChfZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kLCBuZXh0UHJvcHMsIF9kZWh5ZHJhdGVkLCBwcmV2U3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgX25leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4sIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3RhdGUgPSBjdXJyZW50LmNoaWxkLm1lbW9pemVkU3RhdGU7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLm1lbW9pemVkU3RhdGUgPSBwcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcblxuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4yID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MyA9IHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50MztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseVxuICAgIC8vIGNvbXBsZXRlZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfVxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW5gIGlzIGBhbnlgIHR5cGVkLCBzbyB3ZSB1c2VcbiAgLy8gdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNvbnN0cmFpbiBpdC5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgTm9MYW5lcywgbnVsbCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVXb3JrSW5Qcm9ncmVzc2AgaXMgYGFueWAgdHlwZWQsIHNvIHdlIHVzZSB0aGlzXG4gIC8vIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LlxuICByZXR1cm4gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDtcbiAgdmFyIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZztcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBEZWxldGUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50XG4gICAgdmFyIGRlbGV0aW9ucyA9IHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IFtjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50XTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAvLyBNYWtlIHN1cmUgd2UncmUgb24gdGhlIHNlY29uZCBwYXNzLCBpLmUuIHRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50IHdhc1xuICAvLyBhbHJlYWR5IGNsb25lZC4gSW4gbGVnYWN5IG1vZGUsIHRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhpcyBpc24ndCB0cnVlIGlzXG4gIC8vIHdoZW4gRGV2VG9vbHMgZm9yY2VzIHVzIHRvIGRpc3BsYXkgYSBmYWxsYmFjazsgd2Ugc2tpcCB0aGUgZmlyc3QgcmVuZGVyXG4gIC8vIHBhc3MgZW50aXJlbHkgYW5kIGdvIHN0cmFpZ2h0IHRvIHJlbmRlcmluZyB0aGUgZmFsbGJhY2suIChJbiBDb25jdXJyZW50XG4gIC8vIE1vZGUsIFN1c3BlbnNlTGlzdCBjYW4gYWxzbyB0cmlnZ2VyIHRoaXMgc2NlbmFyaW8sIGJ1dCB0aGlzIGlzIGEgbGVnYWN5LVxuICAvLyBvbmx5IGNvZGVwYXRoLilcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCkge1xuICAgIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gLy8gVGhlIGZhbGxiYWNrIGZpYmVyIHdhcyBhZGRlZCBhcyBhIGRlbGV0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGFzcy5cbiAgICAvLyBIb3dldmVyLCBzaW5jZSB3ZSdyZSBnb2luZyB0byByZW1haW4gb24gdGhlIGZhbGxiYWNrLCB3ZSBubyBsb25nZXIgd2FudFxuICAgIC8vIHRvIGRlbGV0ZSBpdC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LCBwcmltYXJ5Q2hpbGRQcm9wcyk7IC8vIFNpbmNlIHdlJ3JlIHJldXNpbmcgYSBjdXJyZW50IHRyZWUsIHdlIG5lZWQgdG8gcmV1c2UgdGhlIGZsYWdzLCB0b28uXG4gICAgLy8gKFdlIGRvbid0IGRvIHRoaXMgaW4gbGVnYWN5IG1vZGUsIGJlY2F1c2UgaW4gbGVnYWN5IG1vZGUgd2UgZG9uJ3QgcmUtdXNlXG4gICAgLy8gdGhlIGN1cnJlbnQgdHJlZTsgc2VlIHByZXZpb3VzIGJyYW5jaC4pXG5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zdWJ0cmVlRmxhZ3MgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgfVxuXG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBmYWxsYmFja0NoaWxkcmVuKTtcbiAgfSBlbHNlIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAgIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKSB7XG4gIC8vIEZhbGxpbmcgYmFjayB0byBjbGllbnQgcmVuZGVyaW5nLiBCZWNhdXNlIHRoaXMgaGFzIHBlcmZvcm1hbmNlXG4gIC8vIGltcGxpY2F0aW9ucywgaXQncyBjb25zaWRlcmVkIGEgcmVjb3ZlcmFibGUgZXJyb3IsIGV2ZW4gdGhvdWdoIHRoZSB1c2VyXG4gIC8vIGxpa2VseSB3b24ndCBvYnNlcnZlIGFueXRoaW5nIHdyb25nIHdpdGggdGhlIFVJLlxuICAvL1xuICAvLyBUaGUgZXJyb3IgaXMgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50IHRvIGVuZm9yY2UgdGhhdCBldmVyeSBjYWxsZXIgcHJvdmlkZVxuICAvLyBhIGN1c3RvbSBtZXNzYWdlLCBvciBleHBsaWNpdGx5IG9wdCBvdXQgKGN1cnJlbnRseSB0aGUgb25seSBwYXRoIHRoYXQgb3B0c1xuICAvLyBvdXQgaXMgbGVnYWN5IG1vZGU7IGV2ZXJ5IGNvbmN1cnJlbnQgcGF0aCBwcm92aWRlcyBhbiBlcnJvcikuXG4gIGlmIChyZWNvdmVyYWJsZUVycm9yICE9PSBudWxsKSB7XG4gICAgcXVldWVIeWRyYXRpb25FcnJvcihyZWNvdmVyYWJsZUVycm9yKTtcbiAgfSAvLyBUaGlzIHdpbGwgYWRkIHRoZSBvbGQgZmliZXIgdG8gdGhlIGRlbGV0aW9uIGxpc3RcblxuXG4gIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIFdlJ3JlIG5vdyBub3Qgc3VzcGVuZGVkIG5vciBkZWh5ZHJhdGVkLlxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbik7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGZpYmVyTW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIGZpYmVyTW9kZSk7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBmaWJlck1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlXG4gIC8vIGJvdW5kYXJ5KSBhbHJlYWR5IG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgIC8vIFdlIHdpbGwgaGF2ZSBkcm9wcGVkIHRoZSBlZmZlY3QgbGlzdCB3aGljaCBjb250YWlucyB0aGVcbiAgICAvLyBkZWxldGlvbi4gV2UgbmVlZCB0byByZWNvbmNpbGUgdG8gZGVsZXRlIHRoZSBjdXJyZW50IGNoaWxkLlxuICAgIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gRHVyaW5nIHRoZSBmaXJzdCBwYXNzLCB3ZSdsbCBiYWlsIG91dCBhbmQgbm90IGRyaWxsIGludG8gdGhlIGNoaWxkcmVuLlxuICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB0aGUgY29udGVudCBpbiBwbGFjZSBhbmQgdHJ5IHRvIGh5ZHJhdGUgaXQgbGF0ZXIuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ0Nhbm5vdCBoeWRyYXRlIFN1c3BlbnNlIGluIGxlZ2FjeSBtb2RlLiBTd2l0Y2ggZnJvbSAnICsgJ1JlYWN0RE9NLmh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyKSB0byAnICsgJ1JlYWN0RE9NQ2xpZW50Lmh5ZHJhdGVSb290KGNvbnRhaW5lciwgPEFwcCAvPiknICsgJy5yZW5kZXIoZWxlbWVudCkgb3IgcmVtb3ZlIHRoZSBTdXNwZW5zZSBjb21wb25lbnRzIGZyb20gJyArICd0aGUgc2VydmVyIHJlbmRlcmVkIGNvbXBvbmVudHMuJyk7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhTeW5jTGFuZSk7XG4gIH0gZWxzZSBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAvLyBUaGlzIGlzIGEgY2xpZW50LW9ubHkgYm91bmRhcnkuIFNpbmNlIHdlIHdvbid0IGdldCBhbnkgY29udGVudCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAvLyBmb3IgdGhpcywgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGF0IGF0IGEgaGlnaGVyIHByaW9yaXR5IGJhc2VkIG9uIHdoZW4gaXQgd291bGRcbiAgICAvLyBoYXZlIHRpbWVkIG91dC4gSW4gdGhlb3J5IHdlIGNvdWxkIHJlbmRlciBpdCBpbiB0aGlzIHBhc3MgYnV0IGl0IHdvdWxkIGhhdmUgdGhlXG4gICAgLy8gd3JvbmcgcHJpb3JpdHkgYXNzb2NpYXRlZCB3aXRoIGl0IGFuZCB3aWxsIHByZXZlbnQgaHlkcmF0aW9uIG9mIHBhcmVudCBwYXRoLlxuICAgIC8vIEluc3RlYWQsIHdlJ2xsIGxlYXZlIHdvcmsgbGVmdCBvbiBpdCB0byByZW5kZXIgaXQgaW4gYSBzZXBhcmF0ZSBjb21taXQuXG4gICAgLy8gVE9ETyBUaGlzIHRpbWUgc2hvdWxkIGJlIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBzZXJ2ZXIgcmVuZGVyZWQgcmVzcG9uc2UgdGhhdCBpc1xuICAgIC8vIGEgcGFyZW50IHRvIHRoaXMgYm91bmRhcnkgd2FzIGRpc3BsYXllZC4gSG93ZXZlciwgc2luY2Ugd2UgY3VycmVudGx5IGRvbid0IGhhdmVcbiAgICAvLyBhIHByb3RvY29sIHRvIHRyYW5zZmVyIHRoYXQgdGltZSwgd2UnbGwganVzdCBlc3RpbWF0ZSBpdCBieSB1c2luZyB0aGUgY3VycmVudFxuICAgIC8vIHRpbWUuIFRoaXMgd2lsbCBtZWFuIHRoYXQgU3VzcGVuc2UgdGltZW91dHMgYXJlIHNsaWdodGx5IHNoaWZ0ZWQgdG8gbGF0ZXIgdGhhblxuICAgIC8vIHRoZXkgc2hvdWxkIGJlLlxuICAgIC8vIFNjaGVkdWxlIGEgbm9ybWFsIHByaSB1cGRhdGUgdG8gcmVuZGVyIHRoaXMgY29udGVudC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKERlZmF1bHRIeWRyYXRpb25MYW5lKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSdsbCBjb250aW51ZSBoeWRyYXRpbmcgdGhlIHJlc3QgYXQgb2Zmc2NyZWVuIHByaW9yaXR5IHNpbmNlIHdlJ2xsIGFscmVhZHlcbiAgICAvLyBiZSBzaG93aW5nIHRoZSByaWdodCBjb250ZW50IGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXIsIGl0IGlzIG5vIHJ1c2guXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGRpZFN1c3BlbmQsIG5leHRQcm9wcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKCFkaWRTdXNwZW5kKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyIHBhc3MuIEF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgaHlkcmF0aW5nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgcGFzcyxcbiAgICAvLyBidXQgYWZ0ZXIgd2UndmUgYWxyZWFkeSBjb21taXR0ZWQgb25jZS5cbiAgICB3YXJuSWZIeWRyYXRpbmcoKTtcblxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCAvLyBUT0RPOiBXaGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZSwgd2Ugc2hvdWxkIG1ha2UgdGhpcyBlcnJvciBhcmd1bWVudFxuICAgICAgLy8gcmVxdWlyZWQg4oCUIGV2ZXJ5IGNvbmN1cnJlbnQgbW9kZSBwYXRoIHRoYXQgY2F1c2VzIGh5ZHJhdGlvbiB0b1xuICAgICAgLy8gZGUtb3B0IHRvIGNsaWVudCByZW5kZXJpbmcgc2hvdWxkIGhhdmUgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgIG51bGwpO1xuICAgIH1cblxuICAgIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgLy8gVGhpcyBib3VuZGFyeSBpcyBpbiBhIHBlcm1hbmVudCBmYWxsYmFjayBzdGF0ZS4gSW4gdGhpcyBjYXNlLCB3ZSdsbCBuZXZlclxuICAgICAgLy8gZ2V0IGFuIHVwZGF0ZSBhbmQgd2UnbGwgbmV2ZXIgYmUgYWJsZSB0byBoeWRyYXRlIHRoZSBmaW5hbCBjb250ZW50LiBMZXQncyBqdXN0IHRyeSB0aGVcbiAgICAgIC8vIGNsaWVudCBzaWRlIHJlbmRlciBpbnN0ZWFkLlxuICAgICAgdmFyIGRpZ2VzdCwgbWVzc2FnZSwgc3RhY2s7XG5cbiAgICAgIHtcbiAgICAgICAgdmFyIF9nZXRTdXNwZW5zZUluc3RhbmNlRiA9IGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhzdXNwZW5zZUluc3RhbmNlKTtcblxuICAgICAgICBkaWdlc3QgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYuZGlnZXN0O1xuICAgICAgICBtZXNzYWdlID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLm1lc3NhZ2U7XG4gICAgICAgIHN0YWNrID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLnN0YWNrO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3I7XG5cbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ1RoZSBzZXJ2ZXIgY291bGQgbm90IGZpbmlzaCB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LCBsaWtlbHkgJyArICdkdWUgdG8gYW4gZXJyb3IgZHVyaW5nIHNlcnZlciByZW5kZXJpbmcuIFN3aXRjaGVkIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBkaWdlc3QsIHN0YWNrKTtcbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIGNhcHR1cmVkVmFsdWUpO1xuICAgIH1cbiAgICAvLyBhbnkgY29udGV4dCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byB0cmVhdCBpcyBhcyBpZiB0aGUgaW5wdXQgbWlnaHQgaGF2ZSBjaGFuZ2VkLlxuXG5cbiAgICB2YXIgaGFzQ29udGV4dENoYW5nZWQgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBjdXJyZW50LmNoaWxkTGFuZXMpO1xuXG4gICAgaWYgKGRpZFJlY2VpdmVVcGRhdGUgfHwgaGFzQ29udGV4dENoYW5nZWQpIHtcbiAgICAgIC8vIFRoaXMgYm91bmRhcnkgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGZpcnN0IHJlbmRlci4gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3cgdW5hYmxlIHRvXG4gICAgICAvLyBoeWRyYXRlIGl0LiBXZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIGh5ZHJhdGUgaXQgdXNpbmcgYSBoaWdoZXIgcHJpb3JpdHkgbGFuZS5cbiAgICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lID0gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgaWYgKGF0dGVtcHRIeWRyYXRpb25BdExhbmUgIT09IE5vTGFuZSAmJiBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSkge1xuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbXV0YXRpbmcgc2luY2UgdGhpcyByZW5kZXIgd2lsbCBnZXQgaW50ZXJydXB0ZWQuIFRoaXNcbiAgICAgICAgICAvLyBpcyBvbmUgb2YgdGhlIHZlcnkgcmFyZSB0aW1lcyB3aGVyZSB3ZSBtdXRhdGUgdGhlIGN1cnJlbnQgdHJlZVxuICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZTsgLy8gVE9ETzogSWRlYWxseSB0aGlzIHdvdWxkIGluaGVyaXQgdGhlIGV2ZW50IHRpbWUgb2YgdGhlIGN1cnJlbnQgcmVuZGVyXG5cbiAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGN1cnJlbnQsIGF0dGVtcHRIeWRyYXRpb25BdExhbmUpO1xuICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIElmIHdlIGhhdmUgc2NoZWR1bGVkIGhpZ2hlciBwcmkgd29yayBhYm92ZSwgdGhpcyB3aWxsIHByb2JhYmx5IGp1c3QgYWJvcnQgdGhlIHJlbmRlclxuICAgICAgLy8gc2luY2Ugd2Ugbm93IGhhdmUgaGlnaGVyIHByaW9yaXR5IHdvcmssIGJ1dCBpbiBjYXNlIGl0IGRvZXNuJ3QsIHdlIG5lZWQgdG8gcHJlcGFyZSB0b1xuICAgICAgLy8gcmVuZGVyIHNvbWV0aGluZywgaWYgd2UgdGltZSBvdXQuIEV2ZW4gaWYgdGhhdCByZXF1aXJlcyB1cyB0byBkZWxldGUgZXZlcnl0aGluZyBhbmRcbiAgICAgIC8vIHNraXAgaHlkcmF0aW9uLlxuICAgICAgLy8gRGVsYXkgaGF2aW5nIHRvIGRvIHRoaXMgYXMgbG9uZyBhcyB0aGUgc3VzcGVuc2UgdGltZW91dCBhbGxvd3MgdXMuXG5cblxuICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuXG4gICAgICB2YXIgX2NhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhpcyBTdXNwZW5zZSBib3VuZGFyeSByZWNlaXZlZCBhbiB1cGRhdGUgYmVmb3JlIGl0IGZpbmlzaGVkICcgKyAnaHlkcmF0aW5nLiBUaGlzIGNhdXNlZCB0aGUgYm91bmRhcnkgdG8gc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcuICcgKyAnVGhlIHVzdWFsIHdheSB0byBmaXggdGhpcyBpcyB0byB3cmFwIHRoZSBvcmlnaW5hbCB1cGRhdGUgJyArICdpbiBzdGFydFRyYW5zaXRpb24uJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyBzdGlsbCBwZW5kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIsIHNvIHdlIGNhbid0IGh5ZHJhdGUgaXRzXG4gICAgICAvLyBjb250ZW50LiBXZSB0cmVhdCBpdCBhcyBpZiB0aGlzIGNvbXBvbmVudCBzdXNwZW5kZWQgaXRzZWxmLiBJdCBtaWdodCBzZWVtIGFzIGlmXG4gICAgICAvLyB3ZSBjb3VsZCBqdXN0IHRyeSB0byByZW5kZXIgaXQgY2xpZW50LXNpZGUgaW5zdGVhZC4gSG93ZXZlciwgdGhpcyB3aWxsIHBlcmZvcm0gYVxuICAgICAgLy8gbG90IG9mIHVubmVjZXNzYXJ5IHdvcmsgYW5kIGlzIHVubGlrZWx5IHRvIGNvbXBsZXRlIHNpbmNlIGl0IG9mdGVuIHdpbGwgc3VzcGVuZFxuICAgICAgLy8gb24gbWlzc2luZyBkYXRhIGFueXdheS4gQWRkaXRpb25hbGx5LCB0aGUgc2VydmVyIG1pZ2h0IGJlIGFibGUgdG8gcmVuZGVyIG1vcmVcbiAgICAgIC8vIHRoYW4gd2UgY2FuIG9uIHRoZSBjbGllbnQgeWV0LiBJbiB0aGF0IGNhc2Ugd2UnZCBlbmQgdXAgd2l0aCBtb3JlIGZhbGxiYWNrIHN0YXRlc1xuICAgICAgLy8gb24gdGhlIGNsaWVudCB0aGFuIGlmIHdlIGp1c3QgbGVhdmUgaXQgYWxvbmUuIElmIHRoZSBzZXJ2ZXIgdGltZXMgb3V0IG9yIGVycm9yc1xuICAgICAgLy8gdGhlc2Ugc2hvdWxkIHVwZGF0ZSB0aGlzIGJvdW5kYXJ5IHRvIHRoZSBwZXJtYW5lbnQgRmFsbGJhY2sgc3RhdGUgaW5zdGVhZC5cbiAgICAgIC8vIE1hcmsgaXQgYXMgaGF2aW5nIGNhcHR1cmVkIChpLmUuIHN1c3BlbmRlZCkuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBMZWF2ZSB0aGUgY2hpbGQgaW4gcGxhY2UuIEkuZS4gdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gUmVnaXN0ZXIgYSBjYWxsYmFjayB0byByZXRyeSB0aGlzIGJvdW5kYXJ5IG9uY2UgdGhlIHNlcnZlciBoYXMgc2VudCB0aGUgcmVzdWx0LlxuXG4gICAgICB2YXIgcmV0cnkgPSByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5LmJpbmQobnVsbCwgY3VycmVudCk7XG4gICAgICByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShzdXNwZW5zZUluc3RhbmNlLCByZXRyeSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICAgIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZS50cmVlQ29udGV4dCk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTWFyayB0aGUgY2hpbGRyZW4gYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgICAvLyB0cmVlIGlzIHBhcnQgb2YgYSBoeWRyYXRpbmcgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkXG4gICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0aGUgUmVhY3QgdHJlZSBoZXJlLiBJdCBqdXN0IGhhcHBlbnMgdG8gbm90IG5lZWQgRE9NXG4gICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cblxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gSHlkcmF0aW5nO1xuICAgICAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MuIFdlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIGh5ZHJhdGVkLCBidXRcbiAgICAvLyBzb21ldGhpbmcgZWl0aGVyIHN1c3BlbmRlZCBvciBlcnJvcmVkLlxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgaHlkcmF0aW9uLiBUcnkgYWdhaW4gd2l0aG91dCBoeWRyYXRpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICAgIHZhciBfY2FwdHVyZWRWYWx1ZTIgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZyB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LiAnICsgJ1N3aXRjaGVkIHRvIGNsaWVudCByZW5kZXJpbmcuJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZTIpO1xuICAgIH0gZWxzZSBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZCBhbmQgd2Ugc2hvdWxkIHN0aWxsIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIExlYXZlIHRoZSBleGlzdGluZyBjaGlsZCBpbiBwbGFjZS5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhlIGRlaHlkcmF0ZWQgY29tcGxldGlvbiBwYXNzIGV4cGVjdHMgdGhpcyBmbGFnIHRvIGJlIHRoZXJlXG4gICAgICAvLyBidXQgdGhlIG5vcm1hbCBzdXNwZW5zZSBwYXNzIGRvZXNuJ3QuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3VzcGVuZGVkIGJ1dCB3ZSBzaG91bGQgbm8gbG9uZ2VyIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIFRoZXJlZm9yZSB3ZSBub3cgaGF2ZSB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGZpYmVyLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KSB7XG4gIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpO1xufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGZpcnN0Q2hpbGQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIE1hcmsgYW55IFN1c3BlbnNlIGJvdW5kYXJpZXMgd2l0aCBmYWxsYmFja3MgYXMgaGF2aW5nIHdvcmsgdG8gZG8uXG4gIC8vIElmIHRoZXkgd2VyZSBwcmV2aW91c2x5IGZvcmNlZCBpbnRvIGZhbGxiYWNrcywgdGhleSBtYXkgbm93IGJlIGFibGVcbiAgLy8gdG8gdW5ibG9jay5cbiAgdmFyIG5vZGUgPSBmaXJzdENoaWxkO1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50KSB7XG4gICAgICAvLyBJZiB0aGUgdGFpbCBpcyBoaWRkZW4gdGhlcmUgbWlnaHQgbm90IGJlIGFuIFN1c3BlbnNlIGJvdW5kYXJpZXNcbiAgICAgIC8vIHRvIHNjaGVkdWxlIHdvcmsgb24uIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHNjaGVkdWxlIGl0IG9uIHRoZVxuICAgICAgLy8gbGlzdCBpdHNlbGYuXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHRyYXZlcnNlIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGlzdCBzaW5jZVxuICAgICAgLy8gdGhlIGxpc3Qgd2lsbCBwcm9wYWdhdGUgdGhlIGNoYW5nZSB3aGVuIGl0IHJlcmVuZGVycy5cbiAgICAgIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Q29udGVudFJvdyhmaXJzdENoaWxkKSB7XG4gIC8vIFRoaXMgaXMgZ29pbmcgdG8gZmluZCB0aGUgbGFzdCByb3cgYW1vbmcgdGhlc2UgY2hpbGRyZW4gdGhhdCBpcyBhbHJlYWR5XG4gIC8vIHNob3dpbmcgY29udGVudCBvbiB0aGUgc2NyZWVuLCBhcyBvcHBvc2VkIHRvIGJlaW5nIGluIGZhbGxiYWNrIHN0YXRlIG9yXG4gIC8vIG5ldy4gSWYgYSByb3cgaGFzIG11bHRpcGxlIFN1c3BlbnNlIGJvdW5kYXJpZXMsIGFueSBvZiB0aGVtIGJlaW5nIGluIHRoZVxuICAvLyBmYWxsYmFjayBzdGF0ZSwgY291bnRzIGFzIHRoZSB3aG9sZSByb3cgYmVpbmcgaW4gYSBmYWxsYmFjayBzdGF0ZS5cbiAgLy8gTm90ZSB0aGF0IHRoZSBcInJvd3NcIiB3aWxsIGJlIHdvcmtJblByb2dyZXNzLCBidXQgYW55IG5lc3RlZCBjaGlsZHJlblxuICAvLyB3aWxsIHN0aWxsIGJlIGN1cnJlbnQgc2luY2Ugd2UgaGF2ZW4ndCByZW5kZXJlZCB0aGVtIHlldC4gVGhlIG1vdW50ZWRcbiAgLy8gb3JkZXIgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgbmV3IG9yZGVyLiBXZSB1c2UgdGhlIG5ldyBvcmRlci5cbiAgdmFyIHJvdyA9IGZpcnN0Q2hpbGQ7XG4gIHZhciBsYXN0Q29udGVudFJvdyA9IG51bGw7XG5cbiAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50Um93ID0gcm93LmFsdGVybmF0ZTsgLy8gTmV3IHJvd3MgY2FuJ3QgYmUgY29udGVudCByb3dzLlxuXG4gICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICBsYXN0Q29udGVudFJvdyA9IHJvdztcbiAgICB9XG5cbiAgICByb3cgPSByb3cuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBsYXN0Q29udGVudFJvdztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHJldmVhbE9yZGVyICE9PSB1bmRlZmluZWQgJiYgcmV2ZWFsT3JkZXIgIT09ICdmb3J3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICdiYWNrd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAndG9nZXRoZXInICYmICFkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0pIHtcbiAgICAgIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgcmV2ZWFsT3JkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdVc2UgbG93ZXJjYXNlIFwiJXNcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmQnOlxuICAgICAgICAgIGNhc2UgJ2JhY2t3YXJkJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdSZWFjdCB1c2VzIHRoZSAtcyBzdWZmaXggaW4gdGhlIHNwZWxsaW5nLiBVc2UgXCIlc3NcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsIHJldmVhbE9yZGVyKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRhaWxPcHRpb25zKHRhaWxNb2RlLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHRhaWxNb2RlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSkge1xuICAgICAgaWYgKHRhaWxNb2RlICE9PSAnY29sbGFwc2VkJyAmJiB0YWlsTW9kZSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgdGFpbCBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcImNvbGxhcHNlZFwiIG9yIFwiaGlkZGVuXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfSBlbHNlIGlmIChyZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignPFN1c3BlbnNlTGlzdCB0YWlsPVwiJXNcIiAvPiBpcyBvbmx5IHZhbGlkIGlmIHJldmVhbE9yZGVyIGlzICcgKyAnXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCIuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHNwZWNpZnkgcmV2ZWFsT3JkZXI9XCJmb3J3YXJkc1wiPycsIHRhaWxNb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZFNsb3QsIGluZGV4KSB7XG4gIHtcbiAgICB2YXIgaXNBbkFycmF5ID0gaXNBcnJheShjaGlsZFNsb3QpO1xuICAgIHZhciBpc0l0ZXJhYmxlID0gIWlzQW5BcnJheSAmJiB0eXBlb2YgZ2V0SXRlcmF0b3JGbihjaGlsZFNsb3QpID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYgKGlzQW5BcnJheSB8fCBpc0l0ZXJhYmxlKSB7XG4gICAgICB2YXIgdHlwZSA9IGlzQW5BcnJheSA/ICdhcnJheScgOiAnaXRlcmFibGUnO1xuXG4gICAgICBlcnJvcignQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gJyArICdhbiBhZGRpdGlvbmFsIFN1c3BlbnNlTGlzdCB0byBjb25maWd1cmUgaXRzIHJldmVhbE9yZGVyOiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPiAuLi4gJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiAnICsgJzwvU3VzcGVuc2VMaXN0PicsIHR5cGUsIGluZGV4LCB0eXBlKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKGNoaWxkcmVuLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKChyZXZlYWxPcmRlciA9PT0gJ2ZvcndhcmRzJyB8fCByZXZlYWxPcmRlciA9PT0gJ2JhY2t3YXJkcycpICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZHJlbltpXSwgaSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuSXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuXG4gICAgICAgICAgaWYgKGNoaWxkcmVuSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB2YXIgX2kgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcignQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gJyArICdUaGlzIGlzIG5vdCB1c2VmdWwgc2luY2UgaXQgbmVlZHMgbXVsdGlwbGUgcm93cy4gJyArICdEaWQgeW91IG1lYW4gdG8gcGFzcyBtdWx0aXBsZSBjaGlsZHJlbiBvciBhbiBhcnJheT8nLCByZXZlYWxPcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBpc0JhY2t3YXJkcywgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKSB7XG4gIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcyxcbiAgICAgIHJlbmRlcmluZzogbnVsbCxcbiAgICAgIHJlbmRlcmluZ1N0YXJ0VGltZTogMCxcbiAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LFxuICAgICAgdGFpbDogdGFpbCxcbiAgICAgIHRhaWxNb2RlOiB0YWlsTW9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UgY2FuIHJldXNlIHRoZSBleGlzdGluZyBvYmplY3QgZnJvbSBwcmV2aW91cyByZW5kZXJzLlxuICAgIHJlbmRlclN0YXRlLmlzQmFja3dhcmRzID0gaXNCYWNrd2FyZHM7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPSAwO1xuICAgIHJlbmRlclN0YXRlLmxhc3QgPSBsYXN0Q29udGVudFJvdztcbiAgICByZW5kZXJTdGF0ZS50YWlsID0gdGFpbDtcbiAgICByZW5kZXJTdGF0ZS50YWlsTW9kZSA9IHRhaWxNb2RlO1xuICB9XG59IC8vIFRoaXMgY2FuIGVuZCB1cCByZW5kZXJpbmcgdGhpcyBjb21wb25lbnQgbXVsdGlwbGUgcGFzc2VzLlxuLy8gVGhlIGZpcnN0IHBhc3Mgc3BsaXRzIHRoZSBjaGlsZHJlbiBmaWJlcnMgaW50byB0d28gc2V0cy4gQSBoZWFkIGFuZCB0YWlsLlxuLy8gV2UgZmlyc3QgcmVuZGVyIHRoZSBoZWFkLiBJZiBhbnl0aGluZyBpcyBpbiBmYWxsYmFjayBzdGF0ZSwgd2UgZG8gYW5vdGhlclxuLy8gcGFzcyB0aHJvdWdoIGJlZ2luV29yayB0byByZXJlbmRlciBhbGwgY2hpbGRyZW4gKGluY2x1ZGluZyB0aGUgdGFpbCkgd2l0aFxuLy8gdGhlIGZvcmNlIHN1c3BlbmQgY29udGV4dC4gSWYgdGhlIGZpcnN0IHJlbmRlciBkaWRuJ3QgaGF2ZSBhbnl0aGluZyBpblxuLy8gaW4gZmFsbGJhY2sgc3RhdGUuIFRoZW4gd2UgcmVuZGVyIGVhY2ggcm93IGluIHRoZSB0YWlsIG9uZS1ieS1vbmUuXG4vLyBUaGF0IGhhcHBlbnMgaW4gdGhlIGNvbXBsZXRlV29yayBwaGFzZSB3aXRob3V0IGdvaW5nIGJhY2sgdG8gYmVnaW5Xb3JrLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJldmVhbE9yZGVyID0gbmV4dFByb3BzLnJldmVhbE9yZGVyO1xuICB2YXIgdGFpbE1vZGUgPSBuZXh0UHJvcHMudGFpbDtcbiAgdmFyIG5ld0NoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpO1xuICB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKG5ld0NoaWxkcmVuLCByZXZlYWxPcmRlcik7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvdWxkRm9yY2VGYWxsYmFjayA9IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG5cbiAgaWYgKHNob3VsZEZvcmNlRmFsbGJhY2spIHtcbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIHZhciBkaWRTdXNwZW5kQmVmb3JlID0gY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgaWYgKGRpZFN1c3BlbmRCZWZvcmUpIHtcbiAgICAgIC8vIElmIHdlIHByZXZpb3VzbHkgZm9yY2VkIGEgZmFsbGJhY2ssIHdlIG5lZWQgdG8gc2NoZWR1bGUgd29ya1xuICAgICAgLy8gb24gYW55IG5lc3RlZCBib3VuZGFyaWVzIHRvIGxldCB0aGVtIGtub3cgdG8gdHJ5IHRvIHJlbmRlclxuICAgICAgLy8gYWdhaW4uIFRoaXMgaXMgdGhlIHNhbWUgYXMgY29udGV4dCB1cGRhdGluZy5cbiAgICAgIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MuY2hpbGQsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICB9XG5cbiAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIC8vIEluIGxlZ2FjeSBtb2RlLCBTdXNwZW5zZUxpc3QgZG9lc24ndCB3b3JrIHNvIHdlIGp1c3RcbiAgICAvLyB1c2UgbWFrZSBpdCBhIG5vb3AgYnkgdHJlYXRpbmcgaXQgYXMgdGhlIGRlZmF1bHQgcmV2ZWFsT3JkZXIuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChyZXZlYWxPcmRlcikge1xuICAgICAgY2FzZSAnZm9yd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhc3RDb250ZW50Um93ID0gZmluZExhc3RDb250ZW50Um93KHdvcmtJblByb2dyZXNzLmNoaWxkKTtcbiAgICAgICAgICB2YXIgdGFpbDtcblxuICAgICAgICAgIGlmIChsYXN0Q29udGVudFJvdyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIHdob2xlIGxpc3QgaXMgcGFydCBvZiB0aGUgdGFpbC5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIGNvdWxkIGZhc3QgcGF0aCBieSBqdXN0IHJlbmRlcmluZyB0aGUgdGFpbCBub3cuXG4gICAgICAgICAgICB0YWlsID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIHRhaWwgcm93cyBhZnRlciB0aGUgY29udGVudCByb3cuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byByZW5kZXIgdGhlbSBzZXBhcmF0ZWx5IGxhdGVyLlxuICAgICAgICAgICAgdGFpbCA9IGxhc3RDb250ZW50Um93LnNpYmxpbmc7XG4gICAgICAgICAgICBsYXN0Q29udGVudFJvdy5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIHRhaWwsIGxhc3RDb250ZW50Um93LCB0YWlsTW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGZpbmQgdGhlIGZpcnN0IHJvdyB0aGF0IGhhcyBleGlzdGluZyBjb250ZW50LlxuICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UncmUgZ29pbmcgdG8gcmV2ZXJzZSB0aGUgbGlzdCBvZiBldmVyeXRoaW5nXG4gICAgICAgICAgLy8gd2UgcGFzcyBpbiB0aGUgbWVhbnRpbWUuIFRoYXQncyBnb2luZyB0byBiZSBvdXIgdGFpbCBpbiByZXZlcnNlXG4gICAgICAgICAgLy8gb3JkZXIuXG4gICAgICAgICAgdmFyIF90YWlsID0gbnVsbDtcbiAgICAgICAgICB2YXIgcm93ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuXG4gICAgICAgICAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Um93ICE9PSBudWxsICYmIGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50Um93KSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1haW4gY29udGVudC5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByb3c7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbmV4dFJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgcm93LnNpYmxpbmcgPSBfdGFpbDtcbiAgICAgICAgICAgIF90YWlsID0gcm93O1xuICAgICAgICAgICAgcm93ID0gbmV4dFJvdztcbiAgICAgICAgICB9IC8vIFRPRE86IElmIHdvcmtJblByb2dyZXNzLmNoaWxkIGlzIG51bGwsIHdlIGNhbiBjb250aW51ZSBvbiB0aGUgdGFpbCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCB0cnVlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIF90YWlsLCBudWxsLCAvLyBsYXN0XG4gICAgICAgICAgdGFpbE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAge1xuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgbnVsbCwgLy8gdGFpbFxuICAgICAgICAgIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB1bmRlZmluZWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgZGVmYXVsdCByZXZlYWwgb3JkZXIgaXMgdGhlIHNhbWUgYXMgbm90IGhhdmluZ1xuICAgICAgICAgIC8vIGEgYm91bmRhcnkuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFBvcnRhbHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB3ZSBkb24ndCBhcHBlbmQgdGhlIGNoaWxkcmVuIGR1cmluZyBtb3VudFxuICAgIC8vIGJ1dCBhdCBjb21taXQuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHRyYWNrIGluc2VydGlvbnMgd2hpY2ggdGhlIG5vcm1hbFxuICAgIC8vIGZsb3cgZG9lc24ndCBkbyBkdXJpbmcgbW91bnQuIFRoaXMgZG9lc24ndCBoYXBwZW4gYXQgdGhlIHJvb3QgYmVjYXVzZVxuICAgIC8vIHRoZSByb290IGFsd2F5cyBzdGFydHMgd2l0aCBhIFwiY3VycmVudFwiIHdpdGggYSBudWxsIGNoaWxkLlxuICAgIC8vIFRPRE86IENvbnNpZGVyIHVuaWZ5aW5nIHRoaXMgd2l0aCBob3cgdGhlIHJvb3Qgd29ya3MuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgcHJvdmlkZXJUeXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlclR5cGUuX2NvbnRleHQ7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG5ld1ZhbHVlID0gbmV3UHJvcHMudmFsdWU7XG5cbiAge1xuICAgIGlmICghKCd2YWx1ZScgaW4gbmV3UHJvcHMpKSB7XG4gICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGhlIGB2YWx1ZWAgcHJvcCBpcyByZXF1aXJlZCBmb3IgdGhlIGA8Q29udGV4dC5Qcm92aWRlcj5gLiBEaWQgeW91IG1pc3NwZWxsIGl0IG9yIGZvcmdldCB0byBwYXNzIGl0PycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcm92aWRlclByb3BUeXBlcyA9IHdvcmtJblByb2dyZXNzLnR5cGUucHJvcFR5cGVzO1xuXG4gICAgaWYgKHByb3ZpZGVyUHJvcFR5cGVzKSB7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm92aWRlclByb3BUeXBlcywgbmV3UHJvcHMsICdwcm9wJywgJ0NvbnRleHQuUHJvdmlkZXInKTtcbiAgICB9XG4gIH1cblxuICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcblxuICB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBudWxsKSB7XG4gICAgICB2YXIgb2xkVmFsdWUgPSBvbGRQcm9wcy52YWx1ZTtcblxuICAgICAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgLy8gTm8gY2hhbmdlLiBCYWlsb3V0IGVhcmx5IGlmIGNoaWxkcmVuIGFyZSB0aGUgc2FtZS5cbiAgICAgICAgaWYgKG9sZFByb3BzLmNoaWxkcmVuID09PSBuZXdQcm9wcy5jaGlsZHJlbiAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSkge1xuICAgICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgICAvLyB0aGVtIHRvIHVwZGF0ZS5cbiAgICAgICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG5cbiAge1xuICAgIGlmIChjb250ZXh0Ll9jb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQncyBhIENvbnRleHQgKHJhdGhlciB0aGFuIGEgQ29uc3VtZXIpLlxuICAgICAgLy8gT3IgaXQgbWF5IGJlIGJlY2F1c2UgaXQncyBvbGRlciBSZWFjdCB3aGVyZSB0aGV5J3JlIHRoZSBzYW1lIHRoaW5nLlxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHdhcm4gaWYgd2UncmUgc3VyZSBpdCdzIGEgbmV3IFJlYWN0LlxuICAgICAgaWYgKGNvbnRleHQgIT09IGNvbnRleHQuQ29uc3VtZXIpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIpIHtcbiAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dD4gZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5fY29udGV4dDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZW5kZXIgPSBuZXdQcm9wcy5jaGlsZHJlbjtcblxuICB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgJyArIFwidGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCBcIiArICd0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgJyArICdpcyBubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgYXJvdW5kIGl0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRyZW47XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5ld0NoaWxkcmVuID0gcmVuZGVyKG5ld1ZhbHVlKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpIHtcbiAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBSZXVzZSBwcmV2aW91cyBkZXBlbmRlbmNpZXNcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCB1cGRhdGUgXCJiYXNlXCIgcmVuZGVyIHRpbWVzIGZvciBiYWlsb3V0cy5cbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICB9XG5cbiAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcyk7IC8vIENoZWNrIGlmIHRoZSBjaGlsZHJlbiBoYXZlIGFueSBwZW5kaW5nIHdvcmsuXG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSkge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBkb24ndCBoYXZlIGFueSB3b3JrIGVpdGhlci4gV2UgY2FuIHNraXAgdGhlbS5cbiAgICAvLyBUT0RPOiBPbmNlIHdlIGFkZCBiYWNrIHJlc3VtaW5nLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGNoaWxkcmVuIGFyZVxuICAgIC8vIGEgd29yay1pbi1wcm9ncmVzcyBzZXQuIElmIHNvLCB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZWlyIGVmZmVjdHMuXG4gICAge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgLy8gZmliZXJzIGFuZCBjb250aW51ZS5cblxuXG4gIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHJlbW91bnRGaWJlcihjdXJyZW50LCBvbGRXb3JrSW5Qcm9ncmVzcywgbmV3V29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciByZXR1cm5GaWJlciA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIGlmIChyZXR1cm5GaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcmV2aW91cyBzaWJsaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZXZTaWJsaW5nLnNpYmxpbmcgPSBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgICB9IC8vIERlbGV0ZSB0aGUgb2xkIGZpYmVyIGFuZCBwbGFjZSB0aGUgbmV3IG9uZS5cbiAgICAvLyBTaW5jZSB0aGUgb2xkIGZpYmVyIGlzIGRpc2Nvbm5lY3RlZCwgd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBtYW51YWxseS5cblxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjdXJyZW50XTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDsgLy8gUmVzdGFydCB3b3JrIGZyb20gdGhlIG5ldyBmaWJlci5cblxuICAgIHJldHVybiBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBCZWZvcmUgcGVyZm9ybWluZyBhbiBlYXJseSBiYWlsb3V0LCB3ZSBtdXN0IGNoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nXG4gIC8vIHVwZGF0ZXMgb3IgY29udGV4dC5cbiAgdmFyIHVwZGF0ZUxhbmVzID0gY3VycmVudC5sYW5lcztcblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZSh1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm8gcGVuZGluZyB1cGRhdGUsIGJ1dCBiZWNhdXNlIGNvbnRleHQgaXMgcHJvcGFnYXRlZCBsYXppbHksIHdlIG5lZWRcblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZpYmVyIGRvZXMgbm90IGhhdmUgYW55IHBlbmRpbmcgd29yay4gQmFpbG91dCB3aXRob3V0IGVudGVyaW5nXG4gIC8vIHRoZSBiZWdpbiBwaGFzZS4gVGhlcmUncyBzdGlsbCBzb21lIGJvb2trZWVwaW5nIHdlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZVxuICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy52YWx1ZTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAge1xuICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgdmFyIGhhc0NoaWxkV29yayA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG4gICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFdlIGtub3cgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHN1c3BlbmQgYWdhaW4gYmVjYXVzZSBpZiBpdCBoYXNcbiAgICAgICAgICAgIC8vIGJlZW4gdW5zdXNwZW5kZWQgaXQgaGFzIGNvbW1pdHRlZCBhcyBhIHJlc29sdmVkIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgICAgIC8vIElmIGl0IG5lZWRzIHRvIGJlIHJldHJpZWQsIGl0IHNob3VsZCBoYXZlIHdvcmsgc2NoZWR1bGVkIG9uIGl0LlxuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBXZSBzaG91bGQgbmV2ZXIgcmVuZGVyIHRoZSBjaGlsZHJlbiBvZiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgdW50aWwgd2VcbiAgICAgICAgICAgIC8vIHVwZ3JhZGUgaXQuIFdlIHJldHVybiBudWxsIGluc3RlYWQgb2YgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yay5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSAvLyBJZiB0aGlzIGJvdW5kYXJ5IGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHdlIG5lZWQgdG8gZGVjaWRlXG4gICAgICAgICAgLy8gd2hldGhlciB0byByZXRyeSB0aGUgcHJpbWFyeSBjaGlsZHJlbiwgb3IgdG8gc2tpcCBvdmVyIGl0IGFuZFxuICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgLy8gY2hpbGQgZnJhZ21lbnQuXG5cblxuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgcHJpbWFyeUNoaWxkTGFuZXMpKSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBoYXZlIHBlbmRpbmcgd29yay4gVXNlIHRoZSBub3JtYWwgcGF0aFxuICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAvLyBvbiBpdFxuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGRvIG5vdCBoYXZlIHBlbmRpbmcgd29yayB3aXRoIHN1ZmZpY2llbnRcbiAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbiBhbmQgd29yayBvbiB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgICAgIHJldHVybiBjaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm90ZTogV2UgY2FuIHJldHVybiBgbnVsbGAgaGVyZSBiZWNhdXNlIHdlIGFscmVhZHkgY2hlY2tlZFxuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZXJlIHdlcmUgbmVzdGVkIGNvbnRleHQgY29uc3VtZXJzLCB2aWEgdGhlIGNhbGwgdG9cbiAgICAgICAgICAgICAgLy8gYGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmtgIGFib3ZlLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgdmFyIF9oYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2FzIGluIGZhbGxiYWNrIHN0YXRlIGxhc3QgdGltZSwgYW5kIHdlIGhhdmUgYWxsIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBjaGlsZHJlbiB0aGVuIHdlJ3JlIHN0aWxsIGluIHByb2dyZXNzaXZlIGxvYWRpbmcgc3RhdGUuXG4gICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAvLyB0cmVlIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSB0YWlsLiBTbyB3ZSBuZWVkIHRvIHVzZSB0aGUgbm9ybWFsXG4gICAgICAgICAgICAvLyBwYXRoIHRvIGNvbXB1dGUgdGhlIGNvcnJlY3QgdGFpbC5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAvLyB0aGVtIGdvdCByZXRyaWVkIHNvIHRoZXknbGwgc3RpbGwgYmUgYmxvY2tlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkIGJlZm9yZSBhbmQgd2UncmUgcmVuZGVyaW5nIHRoZSBzYW1lIGNoaWxkcmVuLFxuICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgLy8gaW4gdGhlIFwidG9nZXRoZXJcIiBtb2RlLCBzbyB3ZSBjYW4gY29udGludWUgZnJvbSB0aGUgc3RhdGUgd2UgaGFkLlxuXG5cbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBSZXNldCB0byB0aGUgXCJ0b2dldGhlclwiIG1vZGUgaW4gY2FzZSB3ZSd2ZSBzdGFydGVkIGEgZGlmZmVyZW50XG4gICAgICAgICAgLy8gdXBkYXRlIGluIHRoZSBwYXN0IGJ1dCBkaWRuJ3QgY29tcGxldGUgaXQuXG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG5cbiAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgdGhlIHRyZWUgc3RpbGwgbmVlZHMgdG8gYmUgZGVmZXJyZWQuIFRoaXMgaXNcbiAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAvLyBzbyB3ZSdsbCBqdXN0IGVudGVyIHRoYXQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2UnbGwgYmFpbCBvdXRcbiAgICAgICAgLy8gYXQgdGhlIG5leHQgbGV2ZWwgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYmVjYXVzZSB0aGUgY2hpbGQgcHJvcHNcbiAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIHJlZmFjdG9yIGBiZWdpbldvcmtgIHRvIHNwbGl0IHRoZSBiYWlsb3V0XG4gICAgICAgIC8vIHBhdGggZnJvbSB0aGUgbm9ybWFsIHBhdGguIEknbSB0ZW1wdGVkIHRvIGRvIGEgbGFiZWxlZCBicmVhayBoZXJlXG4gICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lcztcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gYmVnaW5Xb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCAmJiBjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHdpbGwgcmVzdGFydCB0aGUgYmVnaW4gcGhhc2Ugd2l0aCBhIG5ldyBmaWJlci5cbiAgICAgIHJldHVybiByZW1vdW50RmliZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5rZXksIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgfHwgbnVsbCwgd29ya0luUHJvZ3Jlc3MubW9kZSwgd29ya0luUHJvZ3Jlc3MubGFuZXMpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IGhhc0NvbnRleHRDaGFuZ2VkKCkgfHwgKCAvLyBGb3JjZSBhIHJlLXJlbmRlciBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZDpcbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIC8vIElmIHByb3BzIG9yIGNvbnRleHQgY2hhbmdlZCwgbWFyayB0aGUgZmliZXIgYXMgaGF2aW5nIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgLy8gVGhpcyBtYXkgYmUgdW5zZXQgaWYgdGhlIHByb3BzIGFyZSBkZXRlcm1pbmVkIHRvIGJlIGVxdWFsIGxhdGVyIChtZW1vKS5cbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIHByb3BzIG5vciBsZWdhY3kgY29udGV4dCBjaGFuZ2VzLiBDaGVjayBpZiB0aGVyZSdzIGEgcGVuZGluZ1xuICAgICAgLy8gdXBkYXRlIG9yIGNvbnRleHQgY2hhbmdlLlxuICAgICAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgJiYgLy8gSWYgdGhpcyBpcyB0aGUgc2Vjb25kIHBhc3Mgb2YgYW4gZXJyb3Igb3Igc3VzcGVuc2UgYm91bmRhcnksIHRoZXJlXG4gICAgICAvLyBtYXkgbm90IGJlIHdvcmsgc2NoZWR1bGVkIG9uIGBjdXJyZW50YCwgc28gd2UgY2hlY2sgZm9yIHRoaXMgZmxhZy5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIE5vIHBlbmRpbmcgdXBkYXRlcyBvciBjb250ZXh0LiBCYWlsIG91dCBub3cuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbiB0aGlzIGZpYmVyLCBidXQgdGhlcmUgYXJlIG5vIG5ldyBwcm9wc1xuICAgICAgICAvLyBub3IgbGVnYWN5IGNvbnRleHQuIFNldCB0aGlzIHRvIGZhbHNlLiBJZiBhbiB1cGRhdGUgcXVldWUgb3IgY29udGV4dFxuICAgICAgICAvLyBjb25zdW1lciBwcm9kdWNlcyBhIGNoYW5nZWQgdmFsdWUsIGl0IHdpbGwgc2V0IHRoaXMgdG8gdHJ1ZS4gT3RoZXJ3aXNlLFxuICAgICAgICAvLyB0aGUgY29tcG9uZW50IHdpbGwgYXNzdW1lIHRoZSBjaGlsZHJlbiBoYXZlIG5vdCBjaGFuZ2VkIGFuZCBiYWlsIG91dC5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjaGlsZCBiZWxvbmdzIHRvIGEgbGlzdCBvZiBtdWxpcGxlIGNoaWxkcmVuIGluXG4gICAgICAvLyBpdHMgcGFyZW50LlxuICAgICAgLy9cbiAgICAgIC8vIEluIGEgdHJ1ZSBtdWx0aS10aHJlYWRlZCBpbXBsZW1lbnRhdGlvbiwgd2Ugd291bGQgcmVuZGVyIGNoaWxkcmVuIG9uXG4gICAgICAvLyBwYXJhbGxlbCB0aHJlYWRzLiBUaGlzIHdvdWxkIHJlcHJlc2VudCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IHJlbmRlclxuICAgICAgLy8gdGhyZWFkIGZvciB0aGlzIHN1YnRyZWUuXG4gICAgICAvL1xuICAgICAgLy8gV2Ugb25seSB1c2UgdGhpcyBmb3IgaWQgZ2VuZXJhdGlvbiBkdXJpbmcgaHlkcmF0aW9uLCB3aGljaCBpcyB3aHkgdGhlXG4gICAgICAvLyBsb2dpYyBpcyBsb2NhdGVkIGluIHRoaXMgc3BlY2lhbCBicmFuY2guXG4gICAgICB2YXIgc2xvdEluZGV4ID0gd29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IGdldEZvcmtzQXRMZXZlbCgpO1xuICAgICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgICB9XG4gIH0gLy8gQmVmb3JlIGVudGVyaW5nIHRoZSBiZWdpbiBwaGFzZSwgY2xlYXIgcGVuZGluZyB1cGRhdGUgcHJpb3JpdHkuXG4gIC8vIFRPRE86IFRoaXMgYXNzdW1lcyB0aGF0IHdlJ3JlIGFib3V0IHRvIGV2YWx1YXRlIHRoZSBjb21wb25lbnQgYW5kIHByb2Nlc3NcbiAgLy8gdGhlIHVwZGF0ZSBxdWV1ZS4gSG93ZXZlciwgdGhlcmUncyBhbiBleGNlcHRpb246IFNpbXBsZU1lbW9Db21wb25lbnRcbiAgLy8gc29tZXRpbWVzIGJhaWxzIG91dCBsYXRlciBpbiB0aGUgYmVnaW4gcGhhc2UuIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkXG4gIC8vIG1vdmUgdGhpcyBhc3NpZ25tZW50IG91dCBvZiB0aGUgY29tbW9uIHBhdGggYW5kIGludG8gZWFjaCBicmFuY2guXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudExhenlDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gQ29tcG9uZW50ID8gdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHVucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50ID8gX3VucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCBfcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IHR5cGUgPyBfdW5yZXNvbHZlZFByb3BzMiA6IHJlc29sdmVEZWZhdWx0UHJvcHModHlwZSwgX3VucmVzb2x2ZWRQcm9wczIpO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGb3J3YXJkUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBfcmVzb2x2ZWRQcm9wczIsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTW9kZTpcbiAgICAgIHJldHVybiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX3R5cGUyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBSZXNvbHZlIG91dGVyIHByb3BzIGZpcnN0LCB0aGVuIHJlc29sdmUgaW5uZXIgcHJvcHMuXG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLCBfdW5yZXNvbHZlZFByb3BzMyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gX3R5cGUyLnByb3BUeXBlcztcblxuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBfcmVzb2x2ZWRQcm9wczMsIC8vIFJlc29sdmVkIGZvciBvdXRlciBvbmx5XG4gICAgICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKF90eXBlMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLnR5cGUsIF9yZXNvbHZlZFByb3BzMyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfdHlwZTIsIF9yZXNvbHZlZFByb3BzMywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9Db21wb25lbnQyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczQgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzNCA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudDIsIF91bnJlc29sdmVkUHJvcHM0KTtcblxuICAgICAgICByZXR1cm4gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9Db21wb25lbnQyLCBfcmVzb2x2ZWRQcm9wczQsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBcIiArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gVGFnIHRoZSBmaWJlciB3aXRoIGFuIHVwZGF0ZSBlZmZlY3QuIFRoaXMgdHVybnMgYSBQbGFjZW1lbnQgaW50b1xuICAvLyBhIFBsYWNlbWVudEFuZFVwZGF0ZS5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpIHtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gIH1cbn1cblxudmFyIGFwcGVuZEFsbENoaWxkcmVuO1xudmFyIHVwZGF0ZUhvc3RDb250YWluZXI7XG52YXIgdXBkYXRlSG9zdENvbXBvbmVudCQxO1xudmFyIHVwZGF0ZUhvc3RUZXh0JDE7XG5cbntcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgLy8gSW4gbXV0YXRpb24gbW9kZSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhIGJhaWxvdXQgYmVjYXVzZVxuICAgICAgLy8gd2Ugd29uJ3QgdG91Y2ggdGhpcyBub2RlIGV2ZW4gaWYgY2hpbGRyZW4gY2hhbmdlZC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGdldCB1cGRhdGVkIGJlY2F1c2Ugb25lIG9mIG91ciBjaGlsZHJlbiB1cGRhdGVkLCB3ZSBkb24ndFxuICAgIC8vIGhhdmUgbmV3UHJvcHMgc28gd2UnbGwgaGF2ZSB0byByZXVzZSB0aGVtLlxuICAgIC8vIFRPRE86IFNwbGl0IHRoZSB1cGRhdGUgQVBJIGFzIHNlcGFyYXRlIGZvciB0aGUgcHJvcHMgdnMuIGNoaWxkcmVuLlxuICAgIC8vIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIGNoaWxkcmVuIHdlcmVuJ3Qgc3BlY2lhbCBjYXNlZCBhdCBhbGwgdGhvLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG5cbiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IHByZXBhcmVVcGRhdGUoaW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG5cbiAgICBpZiAodXBkYXRlUGF5bG9hZCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgICAvLyBJZiB0aGUgdGV4dCBkaWZmZXJzLCBtYXJrIGl0IGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGluIGRvbmUgaW4gY29tbWl0V29yay5cbiAgICBpZiAob2xkVGV4dCAhPT0gbmV3VGV4dCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjaykge1xuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIC8vIElmIHdlJ3JlIGh5ZHJhdGluZywgd2Ugc2hvdWxkIGNvbnN1bWUgYXMgbWFueSBpdGVtcyBhcyB3ZSBjYW5cbiAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhbnkgYmVoaW5kLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAocmVuZGVyU3RhdGUudGFpbE1vZGUpIHtcbiAgICBjYXNlICdoaWRkZW4nOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIHRhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIGxhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHRhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGFzdFRhaWxOb2RlID0gdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFpbE5vZGUgPSB0YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKGxhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdjb2xsYXBzZWQnOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIF90YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBfbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoX3RhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKF90YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIF9sYXN0VGFpbE5vZGUgPSBfdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RhaWxOb2RlID0gX3RhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAoX2xhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgaWYgKCFoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2sgJiYgcmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gV2Ugc3VzcGVuZGVkIGR1cmluZyB0aGUgaGVhZC4gV2Ugd2FudCB0byBzaG93IGF0IGxlYXN0IG9uZVxuICAgICAgICAgICAgLy8gcm93IGF0IHRoZSB0YWlsLiBTbyB3ZSdsbCBrZWVwIG9uIGFuZCBjdXQgb2ZmIHRoZSByZXN0LlxuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIF9sYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBidWJibGVQcm9wZXJ0aWVzKGNvbXBsZXRlZFdvcmspIHtcbiAgdmFyIGRpZEJhaWxvdXQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZSAhPT0gbnVsbCAmJiBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZS5jaGlsZCA9PT0gY29tcGxldGVkV29yay5jaGlsZDtcbiAgdmFyIG5ld0NoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgc3VidHJlZUZsYWdzID0gTm9GbGFncztcblxuICBpZiAoIWRpZEJhaWxvdXQpIHtcbiAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXRcbiAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb247XG4gICAgICB2YXIgdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHZhciBjaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKGNoaWxkLmxhbmVzLCBjaGlsZC5jaGlsZExhbmVzKSk7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBjaGlsZC5zdWJ0cmVlRmxhZ3M7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBjaGlsZC5mbGFnczsgLy8gV2hlbiBhIGZpYmVyIGlzIGNsb25lZCwgaXRzIGFjdHVhbER1cmF0aW9uIGlzIHJlc2V0IHRvIDAuIFRoaXMgdmFsdWUgd2lsbFxuICAgICAgICAvLyBvbmx5IGJlIHVwZGF0ZWQgaWYgd29yayBpcyBkb25lIG9uIHRoZSBmaWJlciAoaS5lLiBpdCBkb2Vzbid0IGJhaWxvdXQpLlxuICAgICAgICAvLyBXaGVuIHdvcmsgaXMgZG9uZSwgaXQgc2hvdWxkIGJ1YmJsZSB0byB0aGUgcGFyZW50J3MgYWN0dWFsRHVyYXRpb24uIElmXG4gICAgICAgIC8vIHRoZSBmaWJlciBoYXMgbm90IGJlZW4gY2xvbmVkIHRob3VnaCwgKG1lYW5pbmcgbm8gd29yayB3YXMgZG9uZSksIHRoZW5cbiAgICAgICAgLy8gdGhpcyB2YWx1ZSB3aWxsIHJlZmxlY3QgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IHdvcmtpbmcgb24gYSBwcmV2aW91c1xuICAgICAgICAvLyByZW5kZXIuIEluIHRoYXQgY2FzZSBpdCBzaG91bGQgbm90IGJ1YmJsZS4gV2UgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd2FzXG4gICAgICAgIC8vIGNsb25lZCBieSBjb21wYXJpbmcgdGhlIGNoaWxkIHBvaW50ZXIuXG5cbiAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgIHRyZWVCYXNlRHVyYXRpb24gKz0gY2hpbGQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSB0cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZC5sYW5lcywgX2NoaWxkLmNoaWxkTGFuZXMpKTtcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5zdWJ0cmVlRmxhZ3M7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQuZmxhZ3M7IC8vIFVwZGF0ZSB0aGUgcmV0dXJuIHBvaW50ZXIgc28gdGhlIHRyZWUgaXMgY29uc2lzdGVudC4gVGhpcyBpcyBhIGNvZGVcbiAgICAgICAgLy8gc21lbGwgYmVjYXVzZSBpdCBhc3N1bWVzIHRoZSBjb21taXQgcGhhc2UgaXMgbmV2ZXIgY29uY3VycmVudCB3aXRoXG4gICAgICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuIFdpbGwgYWRkcmVzcyBkdXJpbmcgcmVmYWN0b3IgdG8gYWx0ZXJuYXRlIG1vZGVsLlxuXG4gICAgICAgIF9jaGlsZC5yZXR1cm4gPSBjb21wbGV0ZWRXb3JrO1xuICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLnN1YnRyZWVGbGFncyB8PSBzdWJ0cmVlRmxhZ3M7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG4gICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIHByb2ZpbGluZyBtb2RlLCByZXNldENoaWxkRXhwaXJhdGlvblRpbWUgaXMgYWxzbyB1c2VkIHRvIHJlc2V0XG4gICAgICAvLyBwcm9maWxlciBkdXJhdGlvbnMuXG4gICAgICB2YXIgX3RyZWVCYXNlRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB2YXIgX2NoaWxkMiA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQyICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkMi5sYW5lcywgX2NoaWxkMi5jaGlsZExhbmVzKSk7IC8vIFwiU3RhdGljXCIgZmxhZ3Mgc2hhcmUgdGhlIGxpZmV0aW1lIG9mIHRoZSBmaWJlci9ob29rIHRoZXkgYmVsb25nIHRvLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgYnViYmxlIHRob3NlIHVwIGV2ZW4gZHVyaW5nIGEgYmFpbG91dC4gQWxsIHRoZSBvdGhlclxuICAgICAgICAvLyBmbGFncyBoYXZlIGEgbGlmZXRpbWUgb25seSBvZiBhIHNpbmdsZSByZW5kZXIgKyBjb21taXQsIHNvIHdlIHNob3VsZFxuICAgICAgICAvLyBpZ25vcmUgdGhlbS5cblxuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMi5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMi5mbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIF90cmVlQmFzZUR1cmF0aW9uICs9IF9jaGlsZDIudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgX2NoaWxkMiA9IF9jaGlsZDIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gX3RyZWVCYXNlRHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY2hpbGQzID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZDMgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQzLmxhbmVzLCBfY2hpbGQzLmNoaWxkTGFuZXMpKTsgLy8gXCJTdGF0aWNcIiBmbGFncyBzaGFyZSB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpYmVyL2hvb2sgdGhleSBiZWxvbmcgdG8sXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyXG4gICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGlnbm9yZSB0aGVtLlxuXG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQzLnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQzLmZsYWdzICYgU3RhdGljTWFzazsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZVxuICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGhcbiAgICAgICAgLy8gdGhlIHJlbmRlciBwaGFzZS4gV2lsbCBhZGRyZXNzIGR1cmluZyByZWZhY3RvciB0byBhbHRlcm5hdGUgbW9kZWwuXG5cbiAgICAgICAgX2NoaWxkMy5yZXR1cm4gPSBjb21wbGV0ZWRXb3JrO1xuICAgICAgICBfY2hpbGQzID0gX2NoaWxkMy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgfVxuXG4gIGNvbXBsZXRlZFdvcmsuY2hpbGRMYW5lcyA9IG5ld0NoaWxkTGFuZXM7XG4gIHJldHVybiBkaWRCYWlsb3V0O1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0U3RhdGUpIHtcbiAgaWYgKGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSAmJiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2Rlcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyIHwgSW5jb21wbGV0ZSB8IFNob3VsZENhcHR1cmU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHdhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwgJiYgbmV4dFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAvLyBXZSBtaWdodCBiZSBpbnNpZGUgYSBoeWRyYXRpb24gc3RhdGUgdGhlIGZpcnN0IHRpbWUgd2UncmUgcGlja2luZyB1cCB0aGlzXG4gICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIGFuZCBhbHNvIGFmdGVyIHdlJ3ZlIHJlZW50ZXJlZCBpdCBmb3IgZnVydGhlciBoeWRyYXRpb24uXG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGlmICghd2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50IHdhcyBjb21wbGV0ZWQgd2l0aG91dCBhIGh5ZHJhdGVkIG5vZGUuICcgKyAnVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcHJlcGFyZVRvSHlkcmF0ZUhvc3RTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgdmFyIGlzVGltZWRPdXRTdXNwZW5zZSA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChpc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgbWlnaHQgaGF2ZSByZWVudGVyZWQgdGhpcyBib3VuZGFyeSB0byBoeWRyYXRlIGl0LiBJZiBzbywgd2UgbmVlZCB0byByZXNldCB0aGUgaHlkcmF0aW9uXG4gICAgICAvLyBzdGF0ZSBzaW5jZSB3ZSdyZSBub3cgZXhpdGluZyBvdXQgb2YgaXQuIHBvcEh5ZHJhdGlvblN0YXRlIGRvZXNuJ3QgZG8gdGhhdCBmb3IgdXMuXG4gICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGJvdW5kYXJ5IGRpZCBub3Qgc3VzcGVuZCBzbyBpdCdzIG5vdyBoeWRyYXRlZCBhbmQgdW5zdXNwZW5kZWQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgfSAvLyBJZiBub3RoaW5nIHN1c3BlbmRlZCwgd2UgbmVlZCB0byBzY2hlZHVsZSBhbiBlZmZlY3QgdG8gbWFyayB0aGlzIGJvdW5kYXJ5XG4gICAgICAvLyBhcyBoYXZpbmcgaHlkcmF0ZWQgc28gZXZlbnRzIGtub3cgdGhhdCB0aGV5J3JlIGZyZWUgdG8gYmUgaW52b2tlZC5cbiAgICAgIC8vIEl0J3MgYWxzbyBhIHNpZ25hbCB0byByZXBsYXkgZXZlbnRzIGFuZCB0aGUgc3VzcGVuc2UgY2FsbGJhY2suXG4gICAgICAvLyBJZiBzb21ldGhpbmcgc3VzcGVuZGVkLCBzY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIHJldHJ5IGxpc3RlbmVycy5cbiAgICAgIC8vIFNvIHdlIG1pZ2h0IGFzIHdlbGwgYWx3YXlzIG1hcmsgdGhpcy5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAge1xuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIHZhciBfaXNUaW1lZE91dFN1c3BlbnNlID0gbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKF9pc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAoX3ByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gX3ByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0aGlzIHRyZWUuIElmIHRoaXMgd2FzIGEgZm9yY2VkIGNsaWVudCByZW5kZXIsXG4gICAgLy8gdGhlcmUgbWF5IGhhdmUgYmVlbiByZWNvdmVyYWJsZSBlcnJvcnMgZHVyaW5nIGZpcnN0IGh5ZHJhdGlvblxuICAgIC8vIGF0dGVtcHQuIElmIHNvLCBhZGQgdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGVcbiAgICAvLyBjb21taXQgcGhhc2UuXG4gICAgdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKTsgLy8gRmFsbCB0aHJvdWdoIHRvIG5vcm1hbCBTdXNwZW5zZSBwYXRoXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG5cbiAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICBjYXNlIE1vZGU6XG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciBmaWJlclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcblxuICAgICAgICBpZiAoZmliZXJSb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgZmliZXJSb290LmNvbnRleHQgPSBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQ7XG4gICAgICAgICAgZmliZXJSb290LnBlbmRpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQuY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgcG9wIHNvIHRoYXQgd2UgY2FuIGRlbGV0ZSBhbnkgcmVtYWluaW5nIGNoaWxkcmVuXG4gICAgICAgICAgLy8gdGhhdCB3ZXJlbid0IGh5ZHJhdGVkLlxuICAgICAgICAgIHZhciB3YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmICh3YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHRoZW4gd2UnbGwgbmVlZCB0byBzY2hlZHVsZSBhbiB1cGRhdGUgZm9yXG4gICAgICAgICAgICAvLyB0aGUgY29tbWl0IHNpZGUtZWZmZWN0cyBvbiB0aGUgcm9vdC5cbiAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICAgIGlmICggLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGNsaWVudCByb290XG4gICAgICAgICAgICAgICFwcmV2U3RhdGUuaXNEZWh5ZHJhdGVkIHx8IC8vIENoZWNrIGlmIHdlIHJldmVydGVkIHRvIGNsaWVudCByZW5kZXJpbmcgKGUuZy4gZHVlIHRvIGFuIGVycm9yKVxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gY2xlYXIgdGhpcyBjb250YWluZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZVxuICAgICAgICAgICAgICAgIC8vIG5leHQgY29tbWl0LiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgUmVhY3QgcmVuZGVyaW5nIGludG8gYVxuICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lciB3aXRoIHByZXZpb3VzIGNoaWxkcmVuLiBJdCdzIGFsc28gc2FmZSB0byBkbyBmb3JcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIHRvbywgYmVjYXVzZSBjdXJyZW50LmNoaWxkIHdvdWxkIG9ubHkgYmUgbnVsbCBpZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyByZW5kZXIgd2FzIG51bGwgKHNvIHRoZSBjb250YWluZXIgd291bGQgYWxyZWFkeVxuICAgICAgICAgICAgICAgIC8vIGJlIGVtcHR5KS5cbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDsgLy8gSWYgdGhpcyB3YXMgYSBmb3JjZWQgY2xpZW50IHJlbmRlciwgdGhlcmUgbWF5IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uIGF0dGVtcHQuIElmIHNvLCBhZGRcbiAgICAgICAgICAgICAgICAvLyB0aGVtIHRvIGEgcXVldWUgc28gd2UgY2FuIGxvZyB0aGVtIGluIHRoZSBjb21taXQgcGhhc2UuXG5cbiAgICAgICAgICAgICAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpO1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB1cGRhdGVIb3N0Q29tcG9uZW50JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnQucmVmICE9PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghbmV3UHJvcHMpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cblxuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTsgLy8gVE9ETzogTW92ZSBjcmVhdGVJbnN0YW5jZSB0byBiZWdpbldvcmsgYW5kIGtlZXAgaXQgb24gYSBjb250ZXh0XG4gICAgICAgICAgLy8gXCJzdGFja1wiIGFzIHRoZSBwYXJlbnQuIFRoZW4gYXBwZW5kIGNoaWxkcmVuIGFzIHdlIGdvIGluIGJlZ2luV29ya1xuICAgICAgICAgIC8vIG9yIGNvbXBsZXRlV29yayBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSB3YW50IHRvIGFkZCB0aGVtIHRvcC0+ZG93biBvclxuICAgICAgICAgIC8vIGJvdHRvbS0+dXAuIFRvcC0+ZG93biBpcyBmYXN0ZXIgaW4gSUUxMS5cblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAoX3dhc0h5ZHJhdGVkKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYW5kIGNyZWF0ZUluc3RhbmNlIHN0ZXAgaW50byB0aGUgYmVnaW5QaGFzZVxuICAgICAgICAgICAgLy8gdG8gY29uc29saWRhdGUuXG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpKSB7XG4gICAgICAgICAgICAgIC8vIElmIGNoYW5nZXMgdG8gdGhlIGh5ZHJhdGVkIG5vZGUgbmVlZCB0byBiZSBhcHBsaWVkIGF0IHRoZVxuICAgICAgICAgICAgICAvLyBjb21taXQtcGhhc2Ugd2UgbWFyayB0aGlzIGFzIHN1Y2guXG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSh0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIGFwcGVuZEFsbENoaWxkcmVuKGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlOyAvLyBDZXJ0YWluIHJlbmRlcmVycyByZXF1aXJlIGNvbW1pdC10aW1lIGVmZmVjdHMgZm9yIGluaXRpYWwgbW91bnQuXG4gICAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIHN1cHBvcnRzIGF1dG8tZm9jdXMgZm9yIGNlcnRhaW4gZWxlbWVudHMpLlxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHN1Y2ggcmVuZGVyZXJzIGdldCBzY2hlZHVsZWQgZm9yIGxhdGVyIHdvcmsuXG5cbiAgICAgICAgICAgIGlmIChmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbihpbnN0YW5jZSwgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSByZWYgb24gYSBob3N0IG5vZGUgd2UgbmVlZCB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAgICAgICBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gbmV3UHJvcHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuXG4gICAgICAgICAgdXBkYXRlSG9zdFRleHQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTtcblxuICAgICAgICAgIHZhciBfY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTtcblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQyID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZDIpIHtcbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGNyZWF0ZVRleHRJbnN0YW5jZShuZXdUZXh0LCBfcm9vdENvbnRhaW5lckluc3RhbmNlLCBfY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7IC8vIFNwZWNpYWwgcGF0aCBmb3IgZGVoeWRyYXRlZCBib3VuZGFyaWVzLiBXZSBtYXkgZXZlbnR1YWxseSBtb3ZlIHRoaXNcbiAgICAgICAgLy8gdG8gaXRzIG93biBmaWJlciB0eXBlIHNvIHRoYXQgd2UgY2FuIGFkZCBvdGhlciBraW5kcyBvZiBoeWRyYXRpb25cbiAgICAgICAgLy8gYm91bmRhcmllcyB0aGF0IGFyZW4ndCBhc3NvY2lhdGVkIHdpdGggYSBTdXNwZW5zZSB0cmVlLiBJbiBhbnRpY2lwYXRpb25cbiAgICAgICAgLy8gb2Ygc3VjaCBhIHJlZmFjdG9yLCBhbGwgdGhlIGh5ZHJhdGlvbiBsb2dpYyBpcyBjb250YWluZWQgaW5cbiAgICAgICAgLy8gdGhpcyBicmFuY2guXG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGZhbGx0aHJvdWdoVG9Ob3JtYWxTdXNwZW5zZVBhdGggPSBjb21wbGV0ZURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0U3RhdGUpO1xuXG4gICAgICAgICAgaWYgKCFmYWxsdGhyb3VnaFRvTm9ybWFsU3VzcGVuc2VQYXRoKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZS4gVGhlcmUgd2VyZSByZW1haW5pbmcgdW5oeWRyYXRlZCBub2Rlcy4gV2UgdHJlYXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBhcyBhIG1pc21hdGNoLiBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRGlkIG5vdCBmaW5pc2ggaHlkcmF0aW5nLCBlaXRoZXIgYmVjYXVzZSB0aGlzIGlzIHRoZSBpbml0aWFsXG4gICAgICAgICAgICAgIC8vIHJlbmRlciBvciBiZWNhdXNlIHNvbWV0aGluZyBzdXNwZW5kZWQuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gQ29udGludWUgd2l0aCB0aGUgbm9ybWFsIFN1c3BlbnNlIHBhdGguXG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQuIFJlLXJlbmRlciB3aXRoIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzOyAvLyBEbyBub3QgcmVzZXQgdGhlIGVmZmVjdCBsaXN0LlxuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5leHREaWRUaW1lb3V0ID0gbmV4dFN0YXRlICE9PSBudWxsO1xuICAgICAgICB2YXIgcHJldkRpZFRpbWVvdXQgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgLy8gYSBwYXNzaXZlIGVmZmVjdCwgd2hpY2ggaXMgd2hlbiB3ZSBwcm9jZXNzIHRoZSB0cmFuc2l0aW9uc1xuXG5cbiAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0ICE9PSBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgIC8vIGFuIGVmZmVjdCB0byB0b2dnbGUgdGhlIHN1YnRyZWUncyB2aXNpYmlsaXR5LiBXaGVuIHdlIHN3aXRjaCBmcm9tXG4gICAgICAgICAgLy8gZmFsbGJhY2sgLT4gcHJpbWFyeSwgdGhlIGlubmVyIE9mZnNjcmVlbiBmaWJlciBzY2hlZHVsZXMgdGhpcyBlZmZlY3RcbiAgICAgICAgICAvLyBhcyBwYXJ0IG9mIGl0cyBub3JtYWwgY29tcGxldGUgcGhhc2UuIEJ1dCB3aGVuIHdlIHN3aXRjaCBmcm9tXG4gICAgICAgICAgLy8gcHJpbWFyeSAtPiBmYWxsYmFjaywgdGhlIGlubmVyIE9mZnNjcmVlbiBmaWJlciBkb2VzIG5vdCBoYXZlIGEgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZS4gU28gd2UgbmVlZCB0byBzY2hlZHVsZSBpdHMgZWZmZWN0IGhlcmUuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXZSBhbHNvIHVzZSB0aGlzIGZsYWcgdG8gY29ubmVjdC9kaXNjb25uZWN0IHRoZSBlZmZlY3RzLCBidXQgdGhlIHNhbWVcbiAgICAgICAgICAvLyBsb2dpYyBhcHBsaWVzOiB3aGVuIHJlLWNvbm5lY3RpbmcsIHRoZSBPZmZzY3JlZW4gZmliZXIncyBjb21wbGV0ZVxuICAgICAgICAgIC8vIHBoYXNlIHdpbGwgaGFuZGxlIHNjaGVkdWxpbmcgdGhlIGVmZmVjdC4gSXQncyBvbmx5IHdoZW4gdGhlIGZhbGxiYWNrXG4gICAgICAgICAgLy8gaXMgYWN0aXZlIHRoYXQgd2UgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLlxuXG5cbiAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIHZhciBfb2Zmc2NyZWVuRmliZXIyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICBfb2Zmc2NyZWVuRmliZXIyLmZsYWdzIHw9IFZpc2liaWxpdHk7IC8vIFRPRE86IFRoaXMgd2lsbCBzdGlsbCBzdXNwZW5kIGEgc3luY2hyb25vdXMgdHJlZSBpZiBhbnl0aGluZ1xuICAgICAgICAgICAgLy8gaW4gdGhlIGNvbmN1cnJlbnQgdHJlZSBhbHJlYWR5IHN1c3BlbmRlZCBkdXJpbmcgdGhpcyByZW5kZXIuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEga25vd24gYnVnLlxuXG4gICAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYmFjayB0byB0aHJvd0V4Y2VwdGlvbiBiZWNhdXNlIHRoaXMgaXMgdG9vIGxhdGVcbiAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxhcmdlIHRyZWUgd2hpY2ggaXMgY29tbW9uIGZvciBpbml0aWFsIGxvYWRzLiBXZVxuICAgICAgICAgICAgICAvLyBkb24ndCBrbm93IGlmIHdlIHNob3VsZCByZXN0YXJ0IGEgcmVuZGVyIG9yIG5vdCB1bnRpbCB3ZSBnZXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBtYXJrZXIsIGFuZCB0aGlzIGlzIHRvbyBsYXRlLlxuICAgICAgICAgICAgICAvLyBJZiB0aGlzIHJlbmRlciBhbHJlYWR5IGhhZCBhIHBpbmcgb3IgbG93ZXIgcHJpIHVwZGF0ZXMsXG4gICAgICAgICAgICAgIC8vIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGtub3cgd2UncmUgZ29pbmcgdG8gc3VzcGVuZCB3ZVxuICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgYWJsZSB0byBpbW1lZGlhdGVseSByZXN0YXJ0IGZyb20gd2l0aGluIHRocm93RXhjZXB0aW9uLlxuICAgICAgICAgICAgICB2YXIgaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0ID0gY3VycmVudCA9PT0gbnVsbCAmJiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayAhPT0gdHJ1ZSB8fCAhZW5hYmxlU3VzcGVuc2VBdm9pZFRoaXNGYWxsYmFjayk7XG5cbiAgICAgICAgICAgICAgaWYgKGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCB8fCBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgaW4gYW4gaW52aXNpYmxlIHRyZWUgb3IgYSBuZXcgcmVuZGVyLCB0aGVuIHNob3dpbmdcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGJvdW5kYXJ5IGlzIG9rLlxuICAgICAgICAgICAgICAgIHJlbmRlckRpZFN1c3BlbmQoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gaGlkZSBjb250ZW50IHNvIHdlIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIHN1c3BlbmQgZm9yIGxvbmdlciBpZiBwb3NzaWJsZS5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd2FrZWFibGVzID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHdha2VhYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggYSByZXRyeSBsaXN0ZW5lciB0byB0aGUgcHJvbWlzZS5cbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2VcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCkge1xuICAgICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHByZXBhcmVQb3J0YWxNb3VudCh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIC8vIFBvcCBwcm92aWRlciBmaWJlclxuICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBTYW1lIGFzIGNsYXNzIGNvbXBvbmVudCBjYXNlLiBJIHB1dCBpdCBkb3duIGhlcmUgc28gdGhhdCB0aGUgdGFncyBhcmVcbiAgICAgICAgLy8gc2VxdWVudGlhbCB0byBlbnN1cmUgdGhpcyBzd2l0Y2ggaXMgY29tcGlsZWQgdG8gYSBqdW1wIHRhYmxlLlxuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKF9Db21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIGluIHRoZSBkZWZhdWx0LCBcImluZGVwZW5kZW50XCIgbW9kZS5cbiAgICAgICAgICAvLyBXZSBkb24ndCBkbyBhbnl0aGluZyBpbiB0aGlzIG1vZGUuXG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlkU3VzcGVuZEFscmVhZHkgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcbiAgICAgICAgdmFyIHJlbmRlcmVkVGFpbCA9IHJlbmRlclN0YXRlLnJlbmRlcmluZztcblxuICAgICAgICBpZiAocmVuZGVyZWRUYWlsID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UganVzdCByZW5kZXJlZCB0aGUgaGVhZC5cbiAgICAgICAgICBpZiAoIWRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBwYXNzLiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgYW55dGhpbmcgaXMgc3RpbGxcbiAgICAgICAgICAgIC8vIHN1c3BlbmRlZCBpbiB0aGUgcmVuZGVyZWQgc2V0LlxuICAgICAgICAgICAgLy8gSWYgbmV3IGNvbnRlbnQgdW5zdXNwZW5kZWQsIGJ1dCB0aGVyZSdzIHN0aWxsIHNvbWUgY29udGVudCB0aGF0XG4gICAgICAgICAgICAvLyBkaWRuJ3QuIFRoZW4gd2UgbmVlZCB0byBkbyBhIHNlY29uZCBwYXNzIHRoYXQgZm9yY2VzIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAgIC8vIHRvIGtlZXAgc2hvd2luZyB0aGVpciBmYWxsYmFja3MuXG4gICAgICAgICAgICAvLyBXZSBtaWdodCBiZSBzdXNwZW5kZWQgaWYgc29tZXRoaW5nIGluIHRoaXMgcmVuZGVyIHBhc3Mgc3VzcGVuZGVkLCBvclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIGluIHRoZSBwcmV2aW91cyBjb21taXR0ZWQgcGFzcyBzdXNwZW5kZWQuIE90aGVyd2lzZSxcbiAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gY2hhbmNlIHNvIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgY2FsbCB0b1xuICAgICAgICAgICAgLy8gZmluZEZpcnN0U3VzcGVuZGVkLlxuICAgICAgICAgICAgdmFyIGNhbm5vdEJlU3VzcGVuZGVkID0gcmVuZGVySGFzTm90U3VzcGVuZGVkWWV0KCkgJiYgKGN1cnJlbnQgPT09IG51bGwgfHwgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncyk7XG5cbiAgICAgICAgICAgIGlmICghY2Fubm90QmVTdXNwZW5kZWQpIHtcbiAgICAgICAgICAgICAgdmFyIHJvdyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICAgIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJvdyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIElmIHRoaXMgaXMgYSBuZXdseSBzdXNwZW5kZWQgdHJlZSwgaXQgbWlnaHQgbm90IGdldCBjb21taXR0ZWQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIHNlY29uZCBwYXNzLiBJbiB0aGF0IGNhc2Ugbm90aGluZyB3aWxsIHN1YnNjcmliZSB0b1xuICAgICAgICAgICAgICAgICAgLy8gaXRzIHRoZW5hYmxlcy4gSW5zdGVhZCwgd2UnbGwgdHJhbnNmZXIgaXRzIHRoZW5hYmxlcyB0byB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbnNlTGlzdCBzbyB0aGF0IGl0IGNhbiByZXRyeSBpZiB0aGV5IHJlc29sdmUuXG4gICAgICAgICAgICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBtdWx0aXBsZSBvZiB0aGVzZSBpbiB0aGUgbGlzdCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIHdhaXQgZm9yIGFsbCBvZiB0aGVtIGFueXdheSwgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyXG4gICAgICAgICAgICAgICAgICAvLyB3aGljaCBvbmVzIGdldHMgdG8gcGluZy4gSW4gdGhlb3J5IHdlIGNvdWxkIGdldCBjbGV2ZXIgYW5kIGtlZXBcbiAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIG9mIGhvdyBtYW55IGRlcGVuZGVuY2llcyByZW1haW4gYnV0IGl0IGdldHMgdHJpY2t5IGJlY2F1c2VcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtZWFudGltZSwgd2UgY2FuIGFkZC9yZW1vdmUvY2hhbmdlIGl0ZW1zIGFuZCBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAgICAgICAvLyBXZSBtaWdodCBiYWlsIG91dCBvZiB0aGUgbG9vcCBiZWZvcmUgZmluZGluZyBhbnkgYnV0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoYXQgbWVhbnMgdGhhdCB0aGUgb3RoZXIgYm91bmRhcmllcyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyB3ZSBkaWQgZmluZCBhbHJlYWR5IGhhcyB0aGVpciBsaXN0ZW5lcnMgYXR0YWNoZWQuXG5cbiAgICAgICAgICAgICAgICAgIHZhciBuZXdUaGVuYWJsZXMgPSBzdXNwZW5kZWQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChuZXdUaGVuYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBuZXdUaGVuYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgICAgIH0gLy8gUmVyZW5kZXIgdGhlIHdob2xlIGxpc3QsIGJ1dCB0aGlzIHRpbWUsIHdlJ2xsIGZvcmNlIGZhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgZmxhZ3MgYmVmb3JlIGRvaW5nIHRoZSBzZWNvbmQgcGFzcyBzaW5jZSB0aGF0J3Mgbm93IGludmFsaWQuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgY2hpbGQgZmliZXJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLlxuXG5cbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgICAgICAgICAgICAgICByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7IC8vIFNldCB1cCB0aGUgU3VzcGVuc2UgQ29udGV4dCB0byBmb3JjZSBzdXNwZW5zZSBhbmQgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgIC8vIHJlcmVuZGVyIHRoZSBjaGlsZHJlbi5cblxuICAgICAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjaykpOyAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByb3cgPSByb3cuc2libGluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCAmJiBub3coKSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIGFscmVhZHkgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYnV0IHdlIHN0aWxsIGhhdmUgcm93c1xuICAgICAgICAgICAgICAvLyBsZWZ0IGluIHRoZSB0YWlsLiBXZSdsbCBqdXN0IGdpdmUgdXAgZnVydGhlciBhdHRlbXB0cyB0byByZW5kZXJcbiAgICAgICAgICAgICAgLy8gdGhlIG1haW4gY29udGVudCBhbmQgb25seSByZW5kZXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICB9IC8vIE5leHQgd2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZSB0YWlsLlxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSByZW5kZXJlZCByb3cgdG8gdGhlIGNoaWxkIGxpc3QuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgdmFyIF9zdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocmVuZGVyZWRUYWlsKTtcblxuICAgICAgICAgICAgaWYgKF9zdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlOyAvLyBFbnN1cmUgd2UgdHJhbnNmZXIgdGhlIHVwZGF0ZSBxdWV1ZSB0byB0aGUgcGFyZW50IHNvIHRoYXQgaXQgZG9lc24ndFxuICAgICAgICAgICAgICAvLyBnZXQgbG9zdCBpZiB0aGlzIHJvdyBlbmRzIHVwIGRyb3BwZWQgZHVyaW5nIGEgc2Vjb25kIHBhc3MuXG5cbiAgICAgICAgICAgICAgdmFyIF9uZXdUaGVuYWJsZXMgPSBfc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgIGlmIChfbmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBfbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgdHJ1ZSk7IC8vIFRoaXMgbWlnaHQgaGF2ZSBiZWVuIG1vZGlmaWVkLlxuXG4gICAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsID09PSBudWxsICYmIHJlbmRlclN0YXRlLnRhaWxNb2RlID09PSAnaGlkZGVuJyAmJiAhcmVuZGVyZWRUYWlsLmFsdGVybmF0ZSAmJiAhZ2V0SXNIeWRyYXRpbmcoKSAvLyBXZSBkb24ndCBjdXQgaXQgaWYgd2UncmUgaHlkcmF0aW5nLlxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUuXG4gICAgICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIC8vIFRoZSB0aW1lIGl0IHRvb2sgdG8gcmVuZGVyIGxhc3Qgcm93IGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmVtYWluaW5nXG4gICAgICAgICAgICAvLyB0aW1lIHdlIGhhdmUgdG8gcmVuZGVyLiBTbyByZW5kZXJpbmcgb25lIG1vcmUgcm93IHdvdWxkIGxpa2VseVxuICAgICAgICAgICAgLy8gZXhjZWVkIGl0LlxuICAgICAgICAgICAgbm93KCkgKiAyIC0gcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpICYmIHJlbmRlckxhbmVzICE9PSBPZmZzY3JlZW5MYW5lKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgbm93IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGFuZCB3ZSdsbCBqdXN0IGdpdmUgdXAgZnVydGhlclxuICAgICAgICAgICAgICAvLyBhdHRlbXB0cyB0byByZW5kZXIgdGhlIG1haW4gY29udGVudCBhbmQgb25seSByZW5kZXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgaXMgdXN1YWxseSBmYXN0ZXIuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWZmZWN0IGxpc3Qgb2YgdGhlIGJhY2t3YXJkcyB0YWlsIHdpbGwgaGF2ZSBiZWVuIGFkZGVkXG4gICAgICAgICAgICAvLyB0byB0aGUgZW5kLiBUaGlzIGJyZWFrcyB0aGUgZ3VhcmFudGVlIHRoYXQgbGlmZS1jeWNsZXMgZmlyZSBpblxuICAgICAgICAgICAgLy8gc2libGluZyBvcmRlciBidXQgdGhhdCBpc24ndCBhIHN0cm9uZyBndWFyYW50ZWUgcHJvbWlzZWQgYnkgUmVhY3QuXG4gICAgICAgICAgICAvLyBFc3BlY2lhbGx5IHNpbmNlIHRoZXNlIG1pZ2h0IGFsc28ganVzdCBwb3AgaW4gZHVyaW5nIGZ1dHVyZSBjb21taXRzLlxuICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuXG4gICAgICAgICAgICByZW5kZXJlZFRhaWwuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1NpYmxpbmcgPSByZW5kZXJTdGF0ZS5sYXN0O1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2libGluZy5zaWJsaW5nID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3QgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBzdGlsbCBoYXZlIHRhaWwgcm93cyB0byByZW5kZXIuXG4gICAgICAgICAgLy8gUG9wIGEgcm93LlxuICAgICAgICAgIHZhciBuZXh0ID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBuZXh0O1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBuZXh0LnNpYmxpbmc7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgbmV4dC5zaWJsaW5nID0gbnVsbDsgLy8gUmVzdG9yZSB0aGUgY29udGV4dC5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBjYW4gcHJvYmFibHkganVzdCBhdm9pZCBwb3BwaW5nIGl0IGluc3RlYWQgYW5kIG9ubHlcbiAgICAgICAgICAvLyBzZXR0aW5nIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGdvIGZyb20gbm90IHN1c3BlbmRlZCB0byBzdXNwZW5kZWQuXG5cbiAgICAgICAgICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKGRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBEbyBhIHBhc3Mgb3ZlciB0aGUgbmV4dCByb3cuXG4gICAgICAgICAgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIF9uZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICB2YXIgbmV4dElzSGlkZGVuID0gX25leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBwcmV2SXNIaWRkZW4gPSBfcHJldlN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKHByZXZJc0hpZGRlbiAhPT0gbmV4dElzSGlkZGVuICYmICggLy8gTGVnYWN5SGlkZGVuIGRvZXNuJ3QgZG8gYW55IGhpZGluZyDigJQgaXQgb25seSBwcmUtcmVuZGVycy5cbiAgICAgICAgICAhZW5hYmxlTGVnYWN5SGlkZGVuICkpIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZXh0SXNIaWRkZW4gfHwgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGZvciBoaWRkZW4gY2hpbGRyZW4gdW5sZXNzIHdlJ3JlIHJlbmRlcmluZ1xuICAgICAgICAgIC8vIGF0IG9mZnNjcmVlbiBwcmlvcml0eS5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShzdWJ0cmVlUmVuZGVyTGFuZXMsIE9mZnNjcmVlbkxhbmUpKSB7XG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZSBpbiB0aGUgaGlkZGVuIHN1YnRyZWUuXG4gICAgICAgICAgICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIGhpZGUgdGhvc2Ugbm9kZXMgaW4gdGhlIGNvbW1pdCBwaGFzZSwgc29cbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgYSB2aXNpYmlsaXR5IGVmZmVjdC5cbiAgICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgJiAoUGxhY2VtZW50IHwgVXBkYXRlKSkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFwiICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gdW53aW5kV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG4gIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBmbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICB2YXIgX2ZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKChfZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSAhPT0gTm9GbGFncyAmJiAoX2ZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgZHVyaW5nIHJlbmRlciB0aGF0IHdhc24ndCBjYXB0dXJlZCBieSBhIHN1c3BlbnNlXG4gICAgICAgICAgLy8gYm91bmRhcnkuIERvIGEgc2Vjb25kIHBhc3Mgb24gdGhlIHJvb3QgdG8gdW5tb3VudCB0aGUgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBfZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9IC8vIFdlIHVud291bmQgdG8gdGhlIHJvb3Qgd2l0aG91dCBjb21wbGV0aW5nIGl0LiBFeGl0LlxuXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFRPRE86IHBvcEh5ZHJhdGlvblN0YXRlXG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwgJiYgc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaHJldyBpbiBuZXdseSBtb3VudGVkIGRlaHlkcmF0ZWQgY29tcG9uZW50LiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiAnICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2ZsYWdzMiA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChfZmxhZ3MyICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzMiAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTsgLy8gQ2FwdHVyZWQgYSBzdXNwZW5zZSBlZmZlY3QuIFJlLXJlbmRlciB0aGUgYm91bmRhcnkuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7IC8vIFN1c3BlbnNlTGlzdCBkb2Vzbid0IGFjdHVhbGx5IGNhdGNoIGFueXRoaW5nLiBJdCBzaG91bGQndmUgYmVlblxuICAgICAgICAvLyBjYXVnaHQgYnkgYSBuZXN0ZWQgYm91bmRhcnkuIElmIG5vdCwgaXQgc2hvdWxkIGJ1YmJsZSB0aHJvdWdoLlxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yaywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG4gIHBvcFRyZWVDb250ZXh0KGludGVycnVwdGVkV29yayk7XG5cbiAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gaW50ZXJydXB0ZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3QoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHBvcFN1c3BlbnNlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHBvcFN1c3BlbnNlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBjb250ZXh0ID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBudWxsO1xuXG57XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbmV3IFNldCgpO1xufSAvLyBVc2VkIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlIHRvIHRyYWNrIHRoZSBzdGF0ZSBvZiB0aGUgT2Zmc2NyZWVuIGNvbXBvbmVudCBzdGFjay5cbi8vIEFsbG93cyB1cyB0byBhdm9pZCB0cmF2ZXJzaW5nIHRoZSByZXR1cm4gcGF0aCB0byBmaW5kIHRoZSBuZWFyZXN0IE9mZnNjcmVlbiBhbmNlc3Rvci5cbi8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVN1c3BlbnNlTGF5b3V0RWZmZWN0U2VtYW50aWNzIGlzIGVuYWJsZWQuXG5cblxudmFyIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGZhbHNlO1xudmFyIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBmYWxzZTtcbnZhciBQb3NzaWJseVdlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtTZXQgOiBTZXQ7XG52YXIgbmV4dEVmZmVjdCA9IG51bGw7IC8vIFVzZWQgZm9yIFByb2ZpbGluZyBidWlsZHMgdG8gdHJhY2sgdXBkYXRlcnMuXG5cbnZhciBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xudmFyIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbmZ1bmN0aW9uIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvcikge1xuICAvLyBXcmFwcGluZyBlYWNoIHNtYWxsIHBhcnQgb2YgdGhlIGNvbW1pdCBwaGFzZSBpbnRvIGEgZ3VhcmRlZFxuICAvLyBjYWxsYmFjayBpcyBhIGJpdCB0b28gc2xvdyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjE2NjYpLlxuICAvLyBCdXQgd2UgcmVseSBvbiBpdCB0byBzdXJmYWNlIGVycm9ycyB0byBERVYgdG9vbHMgbGlrZSBvdmVybGF5c1xuICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMTcxMikuXG4gIC8vIEFzIGEgY29tcHJvbWlzZSwgcmV0aHJvdyBvbmx5IGNhdWdodCBlcnJvcnMgaW4gYSBndWFyZC5cbiAge1xuICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgICBjbGVhckNhdWdodEVycm9yKCk7XG4gIH1cbn1cblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50LCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5wcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgIHRyeSB7XG4gICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgfVxufTsgLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0LCBjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgdW5tb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIoY3VycmVudCwgaW5zdGFuY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50RGlkTW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlBdHRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEF0dGFjaFJlZihjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJldFZhbDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyAmJiBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIHJldFZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsRGVzdHJveShjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KSB7XG4gIHRyeSB7XG4gICAgZGVzdHJveSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuXG52YXIgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcbnZhciBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaXJzdENoaWxkKSB7XG4gIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpOyAvLyBXZSBubyBsb25nZXIgbmVlZCB0byB0cmFjayB0aGUgYWN0aXZlIGluc3RhbmNlIGZpYmVyXG5cbiAgdmFyIHNob3VsZEZpcmUgPSBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXI7XG4gIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlO1xuICBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBudWxsO1xuICByZXR1cm4gc2hvdWxkRmlyZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2JlZ2luKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRoaXMgcGhhc2UgaXMgb25seSB1c2VkIGZvciBiZWZvcmVBY3RpdmVJbnN0YW5jZUJsdXIuXG5cbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgQmVmb3JlTXV0YXRpb25NYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmICgoZmxhZ3MgJiBTbmFwc2hvdCkgIT09IE5vRmxhZ3MpIHtcbiAgICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcblxuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzbmFwc2hvdCA9IGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBwcmV2UHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBwcmV2UHJvcHMpLCBwcmV2U3RhdGUpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBkaWRXYXJuU2V0ID0gZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKHNuYXBzaG90ID09PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5TZXQuaGFzKGZpbmlzaGVkV29yay50eXBlKSkge1xuICAgICAgICAgICAgICAgIGRpZFdhcm5TZXQuYWRkKGZpbmlzaGVkV29yay50eXBlKTtcblxuICAgICAgICAgICAgICAgIGVycm9yKCclcy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpOiBBIHNuYXBzaG90IHZhbHVlIChvciBudWxsKSAnICsgJ211c3QgYmUgcmV0dXJuZWQuIFlvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlID0gc25hcHNob3Q7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGZvciB0aGVzZSBjb21wb25lbnQgdHlwZXNcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzICcgKyAnbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChmbGFncywgZmluaXNoZWRXb3JrLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAgLy8gVW5tb3VudFxuICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuICAgICAgICBlZmZlY3QuZGVzdHJveSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoZmxhZ3MsIGZpbmlzaGVkV29yaykge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBmbGFncykgPT09IGZsYWdzKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIE1vdW50XG5cblxuICAgICAgICB2YXIgY3JlYXRlID0gZWZmZWN0LmNyZWF0ZTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcblxuICAgICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRlc3Ryb3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBob29rTmFtZSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKChlZmZlY3QudGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZWZmZWN0LnRhZyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUVmZmVjdCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBhZGRlbmR1bSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKGRlc3Ryb3kgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZCBudWxsLiBJZiB5b3VyIGVmZmVjdCBkb2VzIG5vdCByZXF1aXJlIGNsZWFuICcgKyAndXAsIHJldHVybiB1bmRlZmluZWQgKG9yIG5vdGhpbmcpLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZXN0cm95LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnXFxuXFxuSXQgbG9va3MgbGlrZSB5b3Ugd3JvdGUgJyArIGhvb2tOYW1lICsgJyhhc3luYyAoKSA9PiAuLi4pIG9yIHJldHVybmVkIGEgUHJvbWlzZS4gJyArICdJbnN0ZWFkLCB3cml0ZSB0aGUgYXN5bmMgZnVuY3Rpb24gaW5zaWRlIHlvdXIgZWZmZWN0ICcgKyAnYW5kIGNhbGwgaXQgaW1tZWRpYXRlbHk6XFxuXFxuJyArIGhvb2tOYW1lICsgJygoKSA9PiB7XFxuJyArICcgIGFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSgpIHtcXG4nICsgJyAgICAvLyBZb3UgY2FuIGF3YWl0IGhlcmVcXG4nICsgJyAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE15QVBJLmdldERhdGEoc29tZUlkKTtcXG4nICsgJyAgICAvLyAuLi5cXG4nICsgJyAgfVxcbicgKyAnICBmZXRjaERhdGEoKTtcXG4nICsgXCJ9LCBbc29tZUlkXSk7IC8vIE9yIFtdIGlmIGVmZmVjdCBkb2Vzbid0IG5lZWQgcHJvcHMgb3Igc3RhdGVcXG5cXG5cIiArICdMZWFybiBtb3JlIGFib3V0IGRhdGEgZmV0Y2hpbmcgd2l0aCBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2hvb2tzLWRhdGEtZmV0Y2hpbmcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZDogJyArIGRlc3Ryb3k7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVycm9yKCclcyBtdXN0IG5vdCByZXR1cm4gYW55dGhpbmcgYmVzaWRlcyBhIGZ1bmN0aW9uLCAnICsgJ3doaWNoIGlzIHVzZWQgZm9yIGNsZWFuLXVwLiVzJywgaG9va05hbWUsIGFkZGVuZHVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZUVmZmVjdER1cmF0aW9ucyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuICB7XG4gICAgLy8gT25seSBQcm9maWxlcnMgd2l0aCB3b3JrIGluIHRoZWlyIHN1YnRyZWUgd2lsbCBoYXZlIGFuIFVwZGF0ZSBlZmZlY3Qgc2NoZWR1bGVkLlxuICAgIGlmICgoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSAhPT0gTm9GbGFncykge1xuICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIF9maW5pc2hlZFdvcmskbWVtb2l6ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICAgIGlkID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLmlkLFxuICAgICAgICAgICAgICAgIG9uUG9zdENvbW1pdCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5vblBvc3RDb21taXQ7IC8vIFRoaXMgdmFsdWUgd2lsbCBzdGlsbCByZWZsZWN0IHRoZSBwcmV2aW91cyBjb21taXQgcGhhc2UuXG4gICAgICAgICAgICAvLyBJdCBkb2VzIG5vdCBnZXQgcmVzZXQgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGNvbW1pdCBwaGFzZS5cblxuICAgICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgcGhhc2UgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHBoYXNlID0gJ25lc3RlZC11cGRhdGUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25Qb3N0Q29tbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG9uUG9zdENvbW1pdChpZCwgcGhhc2UsIHBhc3NpdmVFZmZlY3REdXJhdGlvbiwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICB9IC8vIEJ1YmJsZSB0aW1lcyB0byB0aGUgbmV4dCBuZWFyZXN0IGFuY2VzdG9yIFByb2ZpbGVyLlxuICAgICAgICAgICAgLy8gQWZ0ZXIgd2UgcHJvY2VzcyB0aGF0IFByb2ZpbGVyLCB3ZSdsbCBidWJibGUgZnVydGhlciB1cC5cblxuXG4gICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuO1xuXG4gICAgICAgICAgICBvdXRlcjogd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgcm9vdC5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gcGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gcGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKGZpbmlzaGVkUm9vdCwgY3VycmVudCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcykge1xuICBpZiAoKGZpbmlzaGVkV29yay5mbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBsYXlvdXQgZWZmZWN0cyBoYXZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQgKGR1cmluZyBtdXRhdGlvbiBwaGFzZSkuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgdG8gcHJldmVudCBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLFxuICAgICAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgICAgICAvLyBieSBhIGNyZWF0ZSBmdW5jdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCBkdXJpbmcgdGhlIHNhbWUgY29tbWl0LlxuICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZE1vdW50LiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBjdXJyZW50Lm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBUT0RPOiBJIHRoaW5rIHRoaXMgaXMgbm93IGFsd2F5cyBub24tbnVsbCBieSB0aGUgdGltZSBpdCByZWFjaGVzIHRoZVxuICAgICAgICAgIC8vIGNvbW1pdCBwaGFzZS4gQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIHR5cGUgY2hlY2suXG5cblxuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cblxuICAgICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCB1cGRhdGVRdWV1ZSwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPOiBJIHRoaW5rIHRoaXMgaXMgbm93IGFsd2F5cyBub24tbnVsbCBieSB0aGUgdGltZSBpdCByZWFjaGVzIHRoZVxuICAgICAgICAgIC8vIGNvbW1pdCBwaGFzZS4gQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIHR5cGUgY2hlY2suXG4gICAgICAgICAgdmFyIF91cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmIChfdXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLmNoaWxkLnRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgX3VwZGF0ZVF1ZXVlLCBfaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UyID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gUmVuZGVyZXJzIG1heSBzY2hlZHVsZSB3b3JrIHRvIGJlIGRvbmUgYWZ0ZXIgaG9zdCBjb21wb25lbnRzIGFyZSBtb3VudGVkXG4gICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBtYXkgc2NoZWR1bGUgYXV0by1mb2N1cyBmb3IgaW5wdXRzIGFuZCBmb3JtIGNvbnRyb2xzKS5cbiAgICAgICAgICAvLyBUaGVzZSBlZmZlY3RzIHNob3VsZCBvbmx5IGJlIGNvbW1pdHRlZCB3aGVuIGNvbXBvbmVudHMgYXJlIGZpcnN0IG1vdW50ZWQsXG4gICAgICAgICAgLy8gYWthIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudC9hbHRlcm5hdGUuXG5cbiAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiBmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGU7XG4gICAgICAgICAgICB2YXIgcHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggdGV4dC5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIG5vIGxpZmUtY3ljbGVzIGFzc29jaWF0ZWQgd2l0aCBwb3J0YWxzLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplMiA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICAgIG9uQ29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vbkNvbW1pdCxcbiAgICAgICAgICAgICAgICBvblJlbmRlciA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25SZW5kZXI7XG4gICAgICAgICAgICB2YXIgZWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgcGhhc2UgPSBjdXJyZW50ID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHBoYXNlID0gJ25lc3RlZC11cGRhdGUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25SZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgb25SZW5kZXIoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uQ29tbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgb25Db21taXQoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBlZmZlY3REdXJhdGlvbiwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICAgIH0gLy8gU2NoZWR1bGUgYSBwYXNzaXZlIGVmZmVjdCBmb3IgdGhpcyBQcm9maWxlciB0byBjYWxsIG9uUG9zdENvbW1pdCBob29rcy5cbiAgICAgICAgICAgICAgLy8gVGhpcyBlZmZlY3Qgc2hvdWxkIGJlIHNjaGVkdWxlZCBldmVuIGlmIHRoZXJlIGlzIG5vIG9uUG9zdENvbW1pdCBjYWxsYmFjayBmb3IgdGhpcyBQcm9maWxlcixcbiAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZWZmZWN0IGlzIGFsc28gd2hlcmUgdGltZXMgYnViYmxlIHRvIHBhcmVudCBQcm9maWxlcnMuXG5cblxuICAgICAgICAgICAgICBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaW5pc2hlZFdvcmspOyAvLyBQcm9wYWdhdGUgbGF5b3V0IGVmZmVjdCBkdXJhdGlvbnMgdG8gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3Rvci5cbiAgICAgICAgICAgICAgLy8gRG8gbm90IHJlc2V0IHRoZXNlIHZhbHVlcyB1bnRpbCB0aGUgbmV4dCByZW5kZXIgc28gRGV2VG9vbHMgaGFzIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSBmaXJzdC5cblxuICAgICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuO1xuXG4gICAgICAgICAgICAgIG91dGVyOiB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzICcgKyAnbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgIHtcbiAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yayk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c09uRmliZXIobm9kZSkge1xuICAvLyBUdXJuIG9uIGxheW91dCBlZmZlY3RzIGluIGEgdHJlZSB0aGF0IHByZXZpb3VzbHkgZGlzYXBwZWFyZWQuXG4gIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljXG4gIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggbm9kZS5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudERpZE1vdW50KG5vZGUsIG5vZGUucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzYWZlbHlBdHRhY2hSZWYobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgc2FmZWx5QXR0YWNoUmVmKG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbikge1xuICAvLyBPbmx5IGhpZGUgb3IgdW5oaWRlIHRoZSB0b3AtbW9zdCBob3N0IG5vZGVzLlxuICB2YXIgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcblxuICB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbnVsbCkge1xuICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG5vZGU7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgICBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdW5oaWRlSW5zdGFuY2Uobm9kZS5zdGF0ZU5vZGUsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlMyA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKG5vZGUudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQgfHwgbm9kZS50YWcgPT09IExlZ2FjeUhpZGRlbkNvbXBvbmVudCkgJiYgbm9kZS5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmIG5vZGUgIT09IGZpbmlzaGVkV29yaykgOyBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG5vZGUpIHtcbiAgICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBub2RlKSB7XG4gICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEF0dGFjaFJlZihmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHJlZiA9IGZpbmlzaGVkV29yay5yZWY7XG5cbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgdmFyIGluc3RhbmNlVG9Vc2U7XG5cbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBpbnN0YW5jZTtcbiAgICB9IC8vIE1vdmVkIG91dHNpZGUgdG8gZW5zdXJlIERDRSB3b3JrcyB3aXRoIHRoaXMgZmxhZ1xuXG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciByZXRWYWw7XG5cbiAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICByZXRWYWwgPSByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0VmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsYmFjayByZWYgaW4gJXMuICcgKyAnQSBjYWxsYmFjayByZWYgc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbi4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFyZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiAnICsgJ1VzZSBlaXRoZXIgYSByZWYtc2V0dGVyIGZ1bmN0aW9uIG9yIFJlYWN0LmNyZWF0ZVJlZigpLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVmLmN1cnJlbnQgPSBpbnN0YW5jZVRvVXNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlck11dGF0aW9uKGZpYmVyKSB7XG4gIC8vIEN1dCBvZmYgdGhlIHJldHVybiBwb2ludGVyIHRvIGRpc2Nvbm5lY3QgaXQgZnJvbSB0aGUgdHJlZS5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIGRldGVjdCBhbmQgd2FybiBhZ2FpbnN0IHN0YXRlIHVwZGF0ZXMgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC5cbiAgLy8gSXQgYWxzbyBwcmV2ZW50cyBldmVudHMgZnJvbSBidWJibGluZyBmcm9tIHdpdGhpbiBkaXNjb25uZWN0ZWQgY29tcG9uZW50cy5cbiAgLy9cbiAgLy8gSWRlYWxseSwgd2Ugc2hvdWxkIGFsc28gY2xlYXIgdGhlIGNoaWxkIHBvaW50ZXIgb2YgdGhlIHBhcmVudCBhbHRlcm5hdGUgdG8gbGV0IHRoaXNcbiAgLy8gZ2V0IEdDOmVkIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIGZvciBzdXJlIHdoaWNoIHBhcmVudCBpcyB0aGUgY3VycmVudFxuICAvLyBvbmUgc28gd2UnbGwgc2V0dGxlIGZvciBHQzppbmcgdGhlIHN1YnRyZWUgb2YgdGhpcyBjaGlsZC5cbiAgLy8gVGhpcyBjaGlsZCBpdHNlbGYgd2lsbCBiZSBHQzplZCB3aGVuIHRoZSBwYXJlbnQgdXBkYXRlcyB0aGUgbmV4dCB0aW1lLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY2xlYXIgY2hpbGQgb3Igc2libGluZyBwb2ludGVycyB5ZXQuXG4gIC8vIFRoZXkncmUgbmVlZGVkIGZvciBwYXNzaXZlIGVmZmVjdHMgYW5kIGZvciBmaW5kRE9NTm9kZS5cbiAgLy8gV2UgZGVmZXIgdGhvc2UgZmllbGRzLCBhbmQgYWxsIG90aGVyIGNsZWFudXAsIHRvIHRoZSBwYXNzaXZlIHBoYXNlIChzZWUgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMpLlxuICAvL1xuICAvLyBEb24ndCByZXNldCB0aGUgYWx0ZXJuYXRlIHlldCwgZWl0aGVyLiBXZSBuZWVkIHRoYXQgc28gd2UgY2FuIGRldGFjaCB0aGVcbiAgLy8gYWx0ZXJuYXRlJ3MgZmllbGRzIGluIHRoZSBwYXNzaXZlIHBoYXNlLiBDbGVhcmluZyB0aGUgcmV0dXJuIHBvaW50ZXIgaXNcbiAgLy8gc3VmZmljaWVudCBmb3IgZmluZERPTU5vZGUgc2VtYW50aWNzLlxuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUucmV0dXJuID0gbnVsbDtcbiAgfVxuXG4gIGZpYmVyLnJldHVybiA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGZpYmVyLmFsdGVybmF0ZSA9IG51bGw7XG4gICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoYWx0ZXJuYXRlKTtcbiAgfSAvLyBOb3RlOiBEZWZlbnNpdmVseSB1c2luZyBuZWdhdGlvbiBpbnN0ZWFkIG9mIDwgaW4gY2FzZVxuICAvLyBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGlzIHVuZGVmaW5lZC5cblxuXG4gIHtcbiAgICAvLyBDbGVhciBjeWNsaWNhbCBGaWJlciBmaWVsZHMuIFRoaXMgbGV2ZWwgYWxvbmUgaXMgZGVzaWduZWQgdG8gcm91Z2hseVxuICAgIC8vIGFwcHJveGltYXRlIHRoZSBwbGFubmVkIEZpYmVyIHJlZmFjdG9yLiBJbiB0aGF0IHdvcmxkLCBgc2V0U3RhdGVgIHdpbGwgYmVcbiAgICAvLyBib3VuZCB0byBhIHNwZWNpYWwgXCJpbnN0YW5jZVwiIG9iamVjdCBpbnN0ZWFkIG9mIGEgRmliZXIuIFRoZSBJbnN0YW5jZVxuICAgIC8vIG9iamVjdCB3aWxsIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBmaWVsZHMuIEl0IHdpbGwgb25seSBiZSBjb25uZWN0ZWQgdG9cbiAgICAvLyB0aGUgZmliZXIgdHJlZSB2aWEgYSBzaW5nbGUgbGluayBhdCB0aGUgcm9vdC4gU28gaWYgdGhpcyBsZXZlbCBhbG9uZSBpc1xuICAgIC8vIHN1ZmZpY2llbnQgdG8gZml4IG1lbW9yeSBpc3N1ZXMsIHRoYXQgYm9kZXMgd2VsbCBmb3Igb3VyIHBsYW5zLlxuICAgIGZpYmVyLmNoaWxkID0gbnVsbDtcbiAgICBmaWJlci5kZWxldGlvbnMgPSBudWxsO1xuICAgIGZpYmVyLnNpYmxpbmcgPSBudWxsOyAvLyBUaGUgYHN0YXRlTm9kZWAgaXMgY3ljbGljYWwgYmVjYXVzZSBvbiBob3N0IG5vZGVzIGl0IHBvaW50cyB0byB0aGUgaG9zdFxuICAgIC8vIHRyZWUsIHdoaWNoIGhhcyBpdHMgb3duIHBvaW50ZXJzIHRvIGNoaWxkcmVuLCBwYXJlbnRzLCBhbmQgc2libGluZ3MuXG4gICAgLy8gVGhlIG90aGVyIGhvc3Qgbm9kZXMgYWxzbyBwb2ludCBiYWNrIHRvIGZpYmVycywgc28gd2Ugc2hvdWxkIGRldGFjaCB0aGF0XG4gICAgLy8gb25lLCB0b28uXG5cbiAgICBpZiAoZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgIGRldGFjaERlbGV0ZWRJbnN0YW5jZShob3N0SW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7IC8vIEknbSBpbnRlbnRpb25hbGx5IG5vdCBjbGVhcmluZyB0aGUgYHJldHVybmAgZmllbGQgaW4gdGhpcyBsZXZlbC4gV2VcbiAgICAvLyBhbHJlYWR5IGRpc2Nvbm5lY3QgdGhlIGByZXR1cm5gIHBvaW50ZXIgYXQgdGhlIHJvb3Qgb2YgdGhlIGRlbGV0ZWRcbiAgICAvLyBzdWJ0cmVlIChpbiBgZGV0YWNoRmliZXJNdXRhdGlvbmApLiBCZXNpZGVzLCBgcmV0dXJuYCBieSBpdHNlbGYgaXMgbm90XG4gICAgLy8gY3ljbGljYWwg4oCUIGl0J3Mgb25seSBjeWNsaWNhbCB3aGVuIGNvbWJpbmVkIHdpdGggYGNoaWxkYCwgYHNpYmxpbmdgLCBhbmRcbiAgICAvLyBgYWx0ZXJuYXRlYC4gQnV0IHdlJ2xsIGNsZWFyIGl0IGluIHRoZSBuZXh0IGxldmVsIGFueXdheSwganVzdCBpbiBjYXNlLlxuXG4gICAge1xuICAgICAgZmliZXIuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFRoZW9yZXRpY2FsbHksIG5vdGhpbmcgaW4gaGVyZSBzaG91bGQgYmUgbmVjZXNzYXJ5LCBiZWNhdXNlIHdlIGFscmVhZHlcbiAgICAgIC8vIGRpc2Nvbm5lY3RlZCB0aGUgZmliZXIgZnJvbSB0aGUgdHJlZS4gU28gZXZlbiBpZiBzb21ldGhpbmcgbGVha3MgdGhpc1xuICAgICAgLy8gcGFydGljdWxhciBmaWJlciwgaXQgd29uJ3QgbGVhayBhbnl0aGluZyBlbHNlXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBicmFuY2ggaXMgdG8gYmUgc3VwZXIgYWdncmVzc2l2ZSBzbyB3ZSBjYW4gbWVhc3VyZVxuICAgICAgLy8gaWYgdGhlcmUncyBhbnkgZGlmZmVyZW5jZSBpbiBtZW1vcnkgaW1wYWN0LiBJZiB0aGVyZSBpcywgdGhhdCBjb3VsZFxuICAgICAgLy8gaW5kaWNhdGUgYSBSZWFjdCBsZWFrIHdlIGRvbid0IGtub3cgYWJvdXQuXG4gICAgICBmaWJlci5yZXR1cm4gPSBudWxsO1xuICAgICAgZmliZXIuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDsgLy8gVE9ETzogTW92ZSB0byBgY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXJgIGluc3RlYWQuXG5cbiAgICAgIGZpYmVyLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFBhcmVudEZpYmVyKGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIGlmIChpc0hvc3RQYXJlbnQocGFyZW50KSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gaXNIb3N0UGFyZW50KGZpYmVyKSB7XG4gIHJldHVybiBmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgZmliZXIudGFnID09PSBIb3N0Um9vdCB8fCBmaWJlci50YWcgPT09IEhvc3RQb3J0YWw7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RTaWJsaW5nKGZpYmVyKSB7XG4gIC8vIFdlJ3JlIGdvaW5nIHRvIHNlYXJjaCBmb3J3YXJkIGludG8gdGhlIHRyZWUgdW50aWwgd2UgZmluZCBhIHNpYmxpbmcgaG9zdFxuICAvLyBub2RlLiBVbmZvcnR1bmF0ZWx5LCBpZiBtdWx0aXBsZSBpbnNlcnRpb25zIGFyZSBkb25lIGluIGEgcm93IHdlIGhhdmUgdG9cbiAgLy8gc2VhcmNoIHBhc3QgdGhlbS4gVGhpcyBsZWFkcyB0byBleHBvbmVudGlhbCBzZWFyY2ggZm9yIHRoZSBuZXh0IHNpYmxpbmcuXG4gIC8vIFRPRE86IEZpbmQgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcy5cbiAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICBzaWJsaW5nczogd2hpbGUgKHRydWUpIHtcbiAgICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZywgbGV0J3MgdHJ5IHRoZSBuZXh0IHNpYmxpbmcuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IGlzSG9zdFBhcmVudChub2RlLnJldHVybikpIHtcbiAgICAgICAgLy8gSWYgd2UgcG9wIG91dCBvZiB0aGUgcm9vdCBvciBoaXQgdGhlIHBhcmVudCB0aGUgZmliZXIgd2UgYXJlIHRoZVxuICAgICAgICAvLyBsYXN0IHNpYmxpbmcuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG5cbiAgICB3aGlsZSAobm9kZS50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgbm9kZS50YWcgIT09IEhvc3RUZXh0ICYmIG5vZGUudGFnICE9PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIGl0IGlzIG5vdCBob3N0IG5vZGUgYW5kLCB3ZSBtaWdodCBoYXZlIGEgaG9zdCBub2RlIGluc2lkZSBpdC5cbiAgICAgIC8vIFRyeSB0byBzZWFyY2ggZG93biB1bnRpbCB3ZSBmaW5kIG9uZS5cbiAgICAgIGlmIChub2RlLmZsYWdzICYgUGxhY2VtZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBjaGlsZCwgdHJ5IHRoZSBzaWJsaW5ncyBpbnN0ZWFkLlxuICAgICAgICBjb250aW51ZSBzaWJsaW5ncztcbiAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAvLyBXZSBhbHNvIHNraXAgcG9ydGFscyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoaXMgaG9zdCB0cmVlLlxuXG5cbiAgICAgIGlmIChub2RlLmNoaWxkID09PSBudWxsIHx8IG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIH1cbiAgICB9IC8vIENoZWNrIGlmIHRoaXMgaG9zdCBub2RlIGlzIHN0YWJsZSBvciBhYm91dCB0byBiZSBwbGFjZWQuXG5cblxuICAgIGlmICghKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpKSB7XG4gICAgICAvLyBGb3VuZCBpdCFcbiAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGxhY2VtZW50KGZpbmlzaGVkV29yaykge1xuXG5cbiAgdmFyIHBhcmVudEZpYmVyID0gZ2V0SG9zdFBhcmVudEZpYmVyKGZpbmlzaGVkV29yayk7IC8vIE5vdGU6IHRoZXNlIHR3byB2YXJpYWJsZXMgKm11c3QqIGFsd2F5cyBiZSB1cGRhdGVkIHRvZ2V0aGVyLlxuXG4gIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChwYXJlbnRGaWJlci5mbGFncyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHBhcmVudCBiZWZvcmUgZG9pbmcgYW55IGluc2VydGlvbnNcbiAgICAgICAgICByZXNldFRleHRDb250ZW50KHBhcmVudCk7IC8vIENsZWFyIENvbnRlbnRSZXNldCBmcm9tIHRoZSBlZmZlY3QgdGFnXG5cbiAgICAgICAgICBwYXJlbnRGaWJlci5mbGFncyAmPSB+Q29udGVudFJlc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7IC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAgICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuXG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShmaW5pc2hlZFdvcmssIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICB2YXIgX2JlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihmaW5pc2hlZFdvcmssIF9iZWZvcmUsIF9wYXJlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2hcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9zdCBwYXJlbnQgZmliZXIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QpIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCkge1xuICAgIHZhciBzdGF0ZU5vZGUgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGQocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIFRoZXNlIGFyZSB0cmFja2VkIG9uIHRoZSBzdGFjayBhcyB3ZSByZWN1cnNpdmVseSB0cmF2ZXJzZSBhXG4vLyBkZWxldGVkIHN1YnRyZWUuXG4vLyBUT0RPOiBVcGRhdGUgdGhlc2UgZHVyaW5nIHRoZSB3aG9sZSBtdXRhdGlvbiBwaGFzZSwgbm90IGp1c3QgZHVyaW5nXG4vLyBhIGRlbGV0aW9uLlxuXG5cbnZhciBob3N0UGFyZW50ID0gbnVsbDtcbnZhciBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzKHJvb3QsIHJldHVybkZpYmVyLCBkZWxldGVkRmliZXIpIHtcbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGRlbGV0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICAvLyBSZWN1cnNpdmVseSBkZWxldGUgYWxsIGhvc3Qgbm9kZXMgZnJvbSB0aGUgcGFyZW50LCBkZXRhY2ggcmVmcywgY2xlYW5cbiAgICAvLyB1cCBtb3VudGVkIGxheW91dCBlZmZlY3RzLCBhbmQgY2FsbCBjb21wb25lbnRXaWxsVW5tb3VudC5cbiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIHRoZSB0b3Btb3N0IGhvc3QgY2hpbGQgaW4gZWFjaCBicmFuY2guIEJ1dCB0aGVuIHdlXG4gICAgLy8gc3RpbGwgbmVlZCB0byBrZWVwIHRyYXZlcnNpbmcgdG8gdW5tb3VudCBlZmZlY3RzLCByZWZzLCBhbmQgY1dVLiBUT0RPOiBXZVxuICAgIC8vIGNvdWxkIHNwbGl0IHRoaXMgaW50byB0d28gc2VwYXJhdGUgdHJhdmVyc2FscyBmdW5jdGlvbnMsIHdoZXJlIHRoZSBzZWNvbmRcbiAgICAvLyBvbmUgZG9lc24ndCBpbmNsdWRlIGFueSByZW1vdmVDaGlsZCBsb2dpYy4gVGhpcyBpcyBtYXliZSB0aGUgc2FtZVxuICAgIC8vIGZ1bmN0aW9uIGFzIFwiZGlzYXBwZWFyTGF5b3V0RWZmZWN0c1wiIChvciB3aGF0ZXZlciB0aGF0IHR1cm5zIGludG8gYWZ0ZXJcbiAgICAvLyB0aGUgbGF5b3V0IHBoYXNlIGlzIHJlZmFjdG9yZWQgdG8gdXNlIHJlY3Vyc2lvbikuXG4gICAgLy8gQmVmb3JlIHN0YXJ0aW5nLCBmaW5kIHRoZSBuZWFyZXN0IGhvc3QgcGFyZW50IG9uIHRoZSBzdGFjayBzbyB3ZSBrbm93XG4gICAgLy8gd2hpY2ggaW5zdGFuY2UvY29udGFpbmVyIHRvIHJlbW92ZSB0aGUgY2hpbGRyZW4gZnJvbS5cbiAgICAvLyBUT0RPOiBJbnN0ZWFkIG9mIHNlYXJjaGluZyB1cCB0aGUgZmliZXIgcmV0dXJuIHBhdGggb24gZXZlcnkgZGVsZXRpb24sIHdlXG4gICAgLy8gY2FuIHRyYWNrIHRoZSBuZWFyZXN0IGhvc3QgY29tcG9uZW50IG9uIHRoZSBKUyBzdGFjayBhcyB3ZSB0cmF2ZXJzZSB0aGVcbiAgICAvLyB0cmVlIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlLiBUaGlzIHdvdWxkIG1ha2UgaW5zZXJ0aW9ucyBmYXN0ZXIsIHRvby5cbiAgICB2YXIgcGFyZW50ID0gcmV0dXJuRmliZXI7XG5cbiAgICBmaW5kUGFyZW50OiB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudC50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGhvc3RQYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihyb290LCByZXR1cm5GaWJlciwgZGVsZXRlZEZpYmVyKTtcbiAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgfVxuXG4gIGRldGFjaEZpYmVyTXV0YXRpb24oZGVsZXRlZEZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIHBhcmVudCkge1xuICAvLyBUT0RPOiBVc2UgYSBzdGF0aWMgZmxhZyB0byBza2lwIHRyZWVzIHRoYXQgZG9uJ3QgaGF2ZSB1bm1vdW50IGVmZmVjdHNcbiAgdmFyIGNoaWxkID0gcGFyZW50LmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBjaGlsZCk7XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpIHtcbiAgb25Db21taXRVbm1vdW50KGRlbGV0ZWRGaWJlcik7IC8vIFRoZSBjYXNlcyBpbiB0aGlzIG91dGVyIHN3aXRjaCBtb2RpZnkgdGhlIHN0YWNrIGJlZm9yZSB0aGV5IHRyYXZlcnNlXG4gIC8vIGludG8gdGhlaXIgc3VidHJlZS4gVGhlcmUgYXJlIHNpbXBsZXIgY2FzZXMgaW4gdGhlIGlubmVyIHN3aXRjaFxuICAvLyB0aGF0IGRvbid0IG1vZGlmeSB0aGUgc3RhY2suXG5cbiAgc3dpdGNoIChkZWxldGVkRmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgfSAvLyBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCB0byBuZXh0IGJyYW5jaFxuXG4gICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lLW5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIHRoZSBuZWFyZXN0IGhvc3QgY2hpbGQuIFNldCB0aGUgaG9zdCBwYXJlbnRcbiAgICAgICAgLy8gdG8gYG51bGxgIG9uIHRoZSBzdGFjayB0byBpbmRpY2F0ZSB0aGF0IG5lc3RlZCBjaGlsZHJlbiBkb24ndFxuICAgICAgICAvLyBuZWVkIHRvIGJlIHJlbW92ZWQuXG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBudWxsO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuXG4gICAgICAgICAgaWYgKGhvc3RQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIE5vdyB0aGF0IGFsbCB0aGUgY2hpbGQgZWZmZWN0cyBoYXZlIHVubW91bnRlZCwgd2UgY2FuIHJlbW92ZSB0aGVcbiAgICAgICAgICAgIC8vIG5vZGUgZnJvbSB0aGUgdHJlZS5cbiAgICAgICAgICAgIGlmIChob3N0UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGQoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBEZWh5ZHJhdGVkRnJhZ21lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIERlbGV0ZSB0aGUgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBhbmQgYWxsIG9mIGl0cyBjb250ZW50LlxuXG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChob3N0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSBnbyBpbnRvIGEgcG9ydGFsLCBpdCBiZWNvbWVzIHRoZSBwYXJlbnQgdG8gcmVtb3ZlIGZyb20uXG4gICAgICAgICAgdmFyIF9wcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgICAgICAgdmFyIF9wcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBob3N0UGFyZW50ID0gX3ByZXZIb3N0UGFyZW50O1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IF9wcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZGVsZXRlZEZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG5cbiAgICAgICAgICAgIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgX2VmZmVjdCA9IGVmZmVjdCxcbiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSA9IF9lZmZlY3QuZGVzdHJveSxcbiAgICAgICAgICAgICAgICAgICAgdGFnID0gX2VmZmVjdC50YWc7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICggZGVsZXRlZEZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnXG4gICAgICAgICBkZWxldGVkRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBvZmZzY3JlZW4gY29tcG9uZW50IGlzIGhpZGRlbiwgd2UgYWxyZWFkeSB1bm1vdW50ZWQgaXQuIEJlZm9yZVxuICAgICAgICAgIC8vIGRlbGV0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgdGhhdCBpdCdzIGFscmVhZHkgdW5tb3VudGVkIHNvIHRoYXQgd2VcbiAgICAgICAgICAvLyBkb24ndCBhdHRlbXB0IHRvIHVubW91bnQgdGhlIGVmZmVjdHMgYWdhaW4uXG4gICAgICAgICAgLy8gVE9ETzogSWYgdGhlIHRyZWUgaXMgaGlkZGVuLCBpbiBtb3N0IGNhc2VzIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNraXBcbiAgICAgICAgICAvLyBvdmVyIHRoZSBuZXN0ZWQgY2hpbGRyZW4gZW50aXJlbHkuIEFuIGV4Y2VwdGlvbiBpcyB3ZSBoYXZlbid0IHlldCBmb3VuZFxuICAgICAgICAgIC8vIHRoZSB0b3Btb3N0IGhvc3Qgbm9kZSB0byBkZWxldGUsIHdoaWNoIHdlIGFscmVhZHkgdHJhY2sgb24gdGhlIHN0YWNrLlxuICAgICAgICAgIC8vIEJ1dCB0aGUgb3RoZXIgY2FzZSBpcyBwb3J0YWxzLCB3aGljaCBuZWVkIHRvIGJlIGRldGFjaGVkIG5vIG1hdHRlciBob3dcbiAgICAgICAgICAvLyBkZWVwbHkgdGhleSBhcmUgbmVzdGVkLiBXZSBzaG91bGQgdXNlIGEgc3VidHJlZSBmbGFnIHRvIHRyYWNrIHdoZXRoZXIgYVxuICAgICAgICAgIC8vIHN1YnRyZWUgaW5jbHVkZXMgYSBuZXN0ZWQgcG9ydGFsLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUNhbGxiYWNrKGZpbmlzaGVkV29yaykge1xuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gcGFzc2l2ZSBwaGFzZVxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcblxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIElmIHRoaXMgYm91bmRhcnkganVzdCB0aW1lZCBvdXQsIHRoZW4gaXQgd2lsbCBoYXZlIGEgc2V0IG9mIHdha2VhYmxlcy5cbiAgLy8gRm9yIGVhY2ggd2FrZWFibGUsIGF0dGFjaCBhIGxpc3RlbmVyIHNvIHRoYXQgd2hlbiBpdCByZXNvbHZlcywgUmVhY3RcbiAgLy8gYXR0ZW1wdHMgdG8gcmUtcmVuZGVyIHRoZSBib3VuZGFyeSBpbiB0aGUgcHJpbWFyeSAocHJlLXRpbWVvdXQpIHN0YXRlLlxuICB2YXIgd2FrZWFibGVzID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgIGlmIChyZXRyeUNhY2hlID09PSBudWxsKSB7XG4gICAgICByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IG5ldyBQb3NzaWJseVdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICB3YWtlYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAod2FrZWFibGUpIHtcbiAgICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIGJvdW5kYXJ5IGZpYmVyIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICAgIHZhciByZXRyeSA9IHJlc29sdmVSZXRyeVdha2VhYmxlLmJpbmQobnVsbCwgZmluaXNoZWRXb3JrLCB3YWtlYWJsZSk7XG5cbiAgICAgIGlmICghcmV0cnlDYWNoZS5oYXMod2FrZWFibGUpKSB7XG4gICAgICAgIHJldHJ5Q2FjaGUuYWRkKHdha2VhYmxlKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgICAgICBpZiAoaW5Qcm9ncmVzc0xhbmVzICE9PSBudWxsICYmIGluUHJvZ3Jlc3NSb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCBhc3NvY2lhdGUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzIHdpdGggaXQuXG4gICAgICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMoaW5Qcm9ncmVzc1Jvb3QsIGluUHJvZ3Jlc3NMYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvcignRXhwZWN0ZWQgZmluaXNoZWQgcm9vdCBhbmQgbGFuZXMgdG8gYmUgc2V0LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSAvLyBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IGdvZXMgZnJvbSB2aXNpYmxlIHRvIGhpZGRlbi5cbmZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IGNvbW1pdHRlZExhbmVzO1xuICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuICBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaywgcm9vdCk7XG4gIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuICBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xuICBpblByb2dyZXNzUm9vdCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGxhbmVzKSB7XG4gIC8vIERlbGV0aW9ucyBlZmZlY3RzIGNhbiBiZSBzY2hlZHVsZWQgb24gYW55IGZpYmVyIHR5cGUuIFRoZXkgbmVlZCB0byBoYXBwZW5cbiAgLy8gYmVmb3JlIHRoZSBjaGlsZHJlbiBlZmZlY3RzIGhhZSBmaXJlZC5cbiAgdmFyIGRlbGV0aW9ucyA9IHBhcmVudEZpYmVyLmRlbGV0aW9ucztcblxuICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZFRvRGVsZXRlID0gZGVsZXRpb25zW2ldO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGNoaWxkVG9EZWxldGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY2hpbGRUb0RlbGV0ZSwgcGFyZW50RmliZXIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcHJldkRlYnVnRmliZXIgPSBnZXRDdXJyZW50RmliZXIoKTtcblxuICBpZiAocGFyZW50RmliZXIuc3VidHJlZUZsYWdzICYgTXV0YXRpb25NYXNrKSB7XG4gICAgdmFyIGNoaWxkID0gcGFyZW50RmliZXIuY2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihjaGlsZCk7XG4gICAgICBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGNoaWxkLCByb290KTtcbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG4gIH1cblxuICBzZXRDdXJyZW50RmliZXIocHJldkRlYnVnRmliZXIpO1xufVxuXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaywgcm9vdCwgbGFuZXMpIHtcbiAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7IC8vIFRoZSBlZmZlY3QgZmxhZyBzaG91bGQgYmUgY2hlY2tlZCAqYWZ0ZXIqIHdlIHJlZmluZSB0aGUgdHlwZSBvZiBmaWJlcixcbiAgLy8gYmVjYXVzZSB0aGUgZmliZXIgdGFnIGlzIG1vcmUgc3BlY2lmaWMuIEFuIGV4Y2VwdGlvbiBpcyBhbnkgZmxhZyByZWxhdGVkXG4gIC8vIHRvIHJlY29uY2lsYXRpb24sIGJlY2F1c2UgdGhvc2UgY2FuIGJlIHNldCBvbiBhbGwgZmliZXIgdHlwZXMuXG5cbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KEluc2VydGlvbiB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9IC8vIExheW91dCBlZmZlY3RzIGFyZSBkZXN0cm95ZWQgZHVyaW5nIHRoZSBtdXRhdGlvbiBwaGFzZSBzbyB0aGF0IGFsbFxuICAgICAgICAgIC8vIGRlc3Ryb3kgZnVuY3Rpb25zIGZvciBhbGwgZmliZXJzIGFyZSBjYWxsZWQgYmVmb3JlIGFueSBjcmVhdGUgZnVuY3Rpb25zLlxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IHNob3VsZCBuZXZlciBvdmVycmlkZSBhIHJlZiBzZXRcbiAgICAgICAgICAvLyBieSBhIGNyZWF0ZSBmdW5jdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCBkdXJpbmcgdGhlIHNhbWUgY29tbWl0LlxuXG5cbiAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IENvbnRlbnRSZXNldCBnZXRzIGNsZWFyZWQgYnkgdGhlIGNoaWxkcmVuIGR1cmluZyB0aGUgY29tbWl0XG4gICAgICAgICAgLy8gcGhhc2UuIFRoaXMgaXMgYSByZWZhY3RvciBoYXphcmQgYmVjYXVzZSBpdCBtZWFucyB3ZSBtdXN0IHJlYWRcbiAgICAgICAgICAvLyBmbGFncyB0aGUgZmxhZ3MgYWZ0ZXIgYGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0c2AgaGFzIGFscmVhZHkgcnVuO1xuICAgICAgICAgIC8vIHRoZSBvcmRlciBtYXR0ZXJzLiBXZSBzaG91bGQgcmVmYWN0b3Igc28gdGhhdCBDb250ZW50UmVzZXQgZG9lcyBub3RcbiAgICAgICAgICAvLyByZWx5IG9uIG11dGF0aW5nIHRoZSBmbGFnIGR1cmluZyBjb21taXQuIExpa2UgYnkgc2V0dGluZyBhIGZsYWdcbiAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSBpbnN0ZWFkLlxuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlNCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChfaW5zdGFuY2U0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gQ29tbWl0IHRoZSB3b3JrIHByZXBhcmVkIGVhcmxpZXIuXG4gICAgICAgICAgICAgIHZhciBuZXdQcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpblxuICAgICAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgICAgdmFyIG9sZFByb3BzID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG5ld1Byb3BzO1xuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlOyAvLyBUT0RPOiBUeXBlIHRoZSB1cGRhdGVRdWV1ZSB0byBiZSBzcGVjaWZpYyB0byBob3N0IGNvbXBvbmVudHMuXG5cbiAgICAgICAgICAgICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29tbWl0VXBkYXRlKF9pbnN0YW5jZTQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgc2hvdWxkIGhhdmUgYSB0ZXh0IG5vZGUgaW5pdGlhbGl6ZWQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICB2YXIgbmV3VGV4dCA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3VGV4dDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgcHJldlJvb3RTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgICAgICBpZiAocHJldlJvb3RTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29tbWl0SHlkcmF0ZWRDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIHZhciBvZmZzY3JlZW5GaWJlciA9IGZpbmlzaGVkV29yay5jaGlsZDtcblxuICAgICAgICBpZiAob2Zmc2NyZWVuRmliZXIuZmxhZ3MgJiBWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIG9mZnNjcmVlbkluc3RhbmNlID0gb2Zmc2NyZWVuRmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBuZXdTdGF0ZSA9IG9mZnNjcmVlbkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIGlzSGlkZGVuID0gbmV3U3RhdGUgIT09IG51bGw7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHN0YXRlIG9uIHRoZSBPZmZzY3JlZW4gaW5zdGFuY2Ugc28gd2UgY2FuXG4gICAgICAgICAgLy8gcmVhZCBpdCBkdXJpbmcgYW4gZXZlbnRcblxuICAgICAgICAgIG9mZnNjcmVlbkluc3RhbmNlLmlzSGlkZGVuID0gaXNIaWRkZW47XG5cbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIHZhciB3YXNIaWRkZW4gPSBvZmZzY3JlZW5GaWJlci5hbHRlcm5hdGUgIT09IG51bGwgJiYgb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICAgIGlmICghd2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdG8gcGFzc2l2ZSBwaGFzZVxuICAgICAgICAgICAgICBtYXJrQ29tbWl0VGltZU9mRmFsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0U3VzcGVuc2VDYWxsYmFjayhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF93YXNIaWRkZW4gPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoIC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlYWQgZmxhZ1xuICAgICAgICAgZmluaXNoZWRXb3JrLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICAgIC8vIEJlZm9yZSBjb21taXR0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgb24gdGhlIHN0YWNrIHdoZXRoZXIgdGhpc1xuICAgICAgICAgIC8vIG9mZnNjcmVlbiBzdWJ0cmVlIHdhcyBhbHJlYWR5IGhpZGRlbiwgc28gdGhhdCB3ZSBkb24ndCB1bm1vdW50IHRoZVxuICAgICAgICAgIC8vIGVmZmVjdHMgYWdhaW4uXG4gICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgX3dhc0hpZGRlbjtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgX29mZnNjcmVlbkluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgX25ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICB2YXIgX2lzSGlkZGVuID0gX25ld1N0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgdmFyIG9mZnNjcmVlbkJvdW5kYXJ5ID0gZmluaXNoZWRXb3JrOyAvLyBUcmFjayB0aGUgY3VycmVudCBzdGF0ZSBvbiB0aGUgT2Zmc2NyZWVuIGluc3RhbmNlIHNvIHdlIGNhblxuICAgICAgICAgIC8vIHJlYWQgaXQgZHVyaW5nIGFuIGV2ZW50XG5cbiAgICAgICAgICBfb2Zmc2NyZWVuSW5zdGFuY2UuaXNIaWRkZW4gPSBfaXNIaWRkZW47XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoX2lzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGlmICghX3dhc0hpZGRlbikge1xuICAgICAgICAgICAgICAgIGlmICgob2Zmc2NyZWVuQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQm91bmRhcnk7XG4gICAgICAgICAgICAgICAgICB2YXIgb2Zmc2NyZWVuQ2hpbGQgPSBvZmZzY3JlZW5Cb3VuZGFyeS5jaGlsZDtcblxuICAgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNjcmVlbkNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBvZmZzY3JlZW5DaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihvZmZzY3JlZW5DaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQ2hpbGQuc2libGluZztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIHJ1biB3aGVuZXZlciB0aGVyZSdzIGFuIGluc2VydGlvbiBvciB1cGRhdGVcbiAgICAgICAgICAgIC8vIGluc2lkZSBhIGhpZGRlbiBPZmZzY3JlZW4gdHJlZS5cbiAgICAgICAgICAgIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKG9mZnNjcmVlbkJvdW5kYXJ5LCBfaXNIaWRkZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gUGxhY2VtZW50IGVmZmVjdHMgKGluc2VydGlvbnMsIHJlb3JkZXJzKSBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlclxuICAvLyB0eXBlLiBUaGV5IG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgY2hpbGRyZW4gZWZmZWN0cyBoYXZlIGZpcmVkLCBidXRcbiAgLy8gYmVmb3JlIHRoZSBlZmZlY3RzIG9uIHRoaXMgZmliZXIgaGF2ZSBmaXJlZC5cbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmIChmbGFncyAmIFBsYWNlbWVudCkge1xuICAgIHRyeSB7XG4gICAgICBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgfSAvLyBDbGVhciB0aGUgXCJwbGFjZW1lbnRcIiBmcm9tIGVmZmVjdCB0YWcgc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhpcyBpc1xuICAgIC8vIGluc2VydGVkLCBiZWZvcmUgYW55IGxpZmUtY3ljbGVzIGxpa2UgY29tcG9uZW50RGlkTW91bnQgZ2V0cyBjYWxsZWQuXG4gICAgLy8gVE9ETzogZmluZERPTU5vZGUgZG9lc24ndCByZWx5IG9uIHRoaXMgYW55IG1vcmUgYnV0IGlzTW91bnRlZCBkb2VzXG4gICAgLy8gYW5kIGlzTW91bnRlZCBpcyBkZXByZWNhdGVkIGFueXdheSBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBraWxsIHRoaXMuXG5cblxuICAgIGZpbmlzaGVkV29yay5mbGFncyAmPSB+UGxhY2VtZW50O1xuICB9XG5cbiAgaWYgKGZsYWdzICYgSHlkcmF0aW5nKSB7XG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5IeWRyYXRpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IGNvbW1pdHRlZExhbmVzO1xuICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgLy8gU3VzcGVuc2UgbGF5b3V0IGVmZmVjdHMgc2VtYW50aWNzIGRvbid0IGNoYW5nZSBmb3IgbGVnYWN5IHJvb3RzLlxuICB2YXIgaXNNb2Rlcm5Sb290ID0gKHN1YnRyZWVSb290Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICggZmliZXIudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQgJiYgaXNNb2Rlcm5Sb290KSB7XG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBzdGFjaydzIHN0YXRlLlxuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBpc0hpZGRlbiB8fCBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG5cbiAgICAgIGlmIChuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4pIHtcbiAgICAgICAgLy8gVGhlIE9mZnNjcmVlbiB0cmVlIGlzIGhpZGRlbi4gU2tpcCBvdmVyIGl0cyBsYXlvdXQgZWZmZWN0cy5cbiAgICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBBbHNvIGNoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRNYXNrXG4gICAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICB2YXIgd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gd2FzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuOyAvLyBUcmF2ZXJzZSB0aGUgT2Zmc2NyZWVuIHN1YnRyZWUgd2l0aCB0aGUgY3VycmVudCBPZmZzY3JlZW4gYXMgdGhlIHJvb3QuXG5cbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcblxuICAgICAgICBpZiAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiAmJiAhcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByb290IG9mIGEgcmVhcHBlYXJpbmcgYm91bmRhcnkuIFR1cm4gaXRzIGxheW91dCBlZmZlY3RzXG4gICAgICAgICAgLy8gYmFjayBvbi5cbiAgICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKGZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZCA9IGZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgICAgICAgIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oY2hpbGQsIC8vIE5ldyByb290OyBidWJibGUgYmFjayB1cCB0byBoZXJlIGFuZCBzdG9wLlxuICAgICAgICAgIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gUmVzdG9yZSBPZmZzY3JlZW4gc3RhdGUgYW5kIHJlc3VtZSBpbiBvdXItcHJvZ3Jlc3MgdHJhdmVyc2FsLlxuXG5cbiAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzICYmIGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdExheW91dEVmZmVjdE9uRmliZXIocm9vdCwgY3VycmVudCwgZmliZXIsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgKFJlZlN0YXRpYyB8IExheW91dFN0YXRpYylcblxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCBmaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIFJlZlN0YXRpY1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZmliZXIsIGZpYmVyLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYVxuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBhbHJlYWR5IGhpZGRlbi4gRG9uJ3QgZGlzYXBwZWFyXG4gICAgICAgICAgICAvLyBpdHMgZWZmZWN0cy5cbiAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpY1xuXG5cbiAgICBpZiAoZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmIChmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCkge1xuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBzdGlsbCBoaWRkZW4uIERvbid0IHJlLWFwcGVhciBpdHMgZWZmZWN0cy5cbiAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuXG4gICAgaWYgKGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbm9kZSBtYXkgaGF2ZSBiZWVuIHJldXNlZCBmcm9tIGEgcHJldmlvdXMgcmVuZGVyLCBzbyB3ZSBjYW4ndFxuICAgICAgLy8gYXNzdW1lIGl0cyByZXR1cm4gcG9pbnRlciBpcyBjb3JyZWN0LlxuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIExheW91dFN0YXRpY1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgIHRyeSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNPbkZpYmVyKGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0XG4gICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuXG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICBuZXh0RWZmZWN0ID0gZmluaXNoZWRXb3JrO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2JlZ2luKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXRQYXNzaXZlTW91bnRPbkZpYmVyKHJvb3QsIGZpYmVyLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKGZpcnN0Q2hpbGQpIHtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpO1xufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfYmVnaW4oKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgobmV4dEVmZmVjdC5mbGFncyAmIENoaWxkRGVsZXRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgZGVsZXRpb25zID0gZmliZXIuZGVsZXRpb25zO1xuXG4gICAgICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpYmVyVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyVG9EZWxldGU7XG4gICAgICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihmaWJlclRvRGVsZXRlLCBmaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gQSBmaWJlciB3YXMgZGVsZXRlZCBmcm9tIHRoaXMgcGFyZW50IGZpYmVyLCBidXQgaXQncyBzdGlsbCBwYXJ0IG9mXG4gICAgICAgICAgLy8gdGhlIHByZXZpb3VzIChhbHRlcm5hdGUpIHBhcmVudCBmaWJlcidzIGxpc3Qgb2YgY2hpbGRyZW4uIEJlY2F1c2VcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhcmUgYSBsaW5rZWQgbGlzdCwgYW4gZWFybGllciBzaWJsaW5nIHRoYXQncyBzdGlsbCBhbGl2ZVxuICAgICAgICAgIC8vIHdpbGwgYmUgY29ubmVjdGVkIHRvIHRoZSBkZWxldGVkIGZpYmVyIHZpYSBpdHMgYGFsdGVybmF0ZWA6XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tYWx0ZXJuYXRlLS0+IHByZXZpb3VzIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tc2libGluZy0tPiBkZWxldGVkIGZpYmVyXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXZSBjYW4ndCBkaXNjb25uZWN0IGBhbHRlcm5hdGVgIG9uIG5vZGVzIHRoYXQgaGF2ZW4ndCBiZWVuIGRlbGV0ZWRcbiAgICAgICAgICAvLyB5ZXQsIGJ1dCB3ZSBjYW4gZGlzY29ubmVjdCB0aGUgYHNpYmxpbmdgIGFuZCBgY2hpbGRgIHBvaW50ZXJzLlxuICAgICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBkZXRhY2hlZENoaWxkID0gcHJldmlvdXNGaWJlci5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNGaWJlci5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBkZXRhY2hlZFNpYmxpbmcgPSBkZXRhY2hlZENoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBkZXRhY2hlZENoaWxkID0gZGV0YWNoZWRTaWJsaW5nO1xuICAgICAgICAgICAgICB9IHdoaWxlIChkZXRhY2hlZENoaWxkICE9PSBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2NvbXBsZXRlKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmliZXIpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihmaW5pc2hlZFdvcmspIHtcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oZGVsZXRlZFN1YnRyZWVSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gRGVsZXRpb24gZWZmZWN0cyBmaXJlIGluIHBhcmVudCAtPiBjaGlsZCBvcmRlclxuICAgIC8vIFRPRE86IENoZWNrIGlmIGZpYmVyIGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZ1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihmaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETzogT25seSB0cmF2ZXJzZSBzdWJ0cmVlIGlmIGl0IGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZy4gKEJ1dCwgaWYgd2VcbiAgICAvLyBkbyB0aGlzLCBzdGlsbCBuZWVkIHRvIGhhbmRsZSBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGNvcnJlY3RseS4pXG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2NvbXBsZXRlKGRlbGV0ZWRTdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfY29tcGxldGUoZGVsZXRlZFN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG4gICAgdmFyIHJldHVybkZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAge1xuICAgICAgLy8gUmVjdXJzaXZlbHkgdHJhdmVyc2UgdGhlIGVudGlyZSBkZWxldGVkIHRyZWUgYW5kIGNsZWFuIHVwIGZpYmVyIGZpZWxkcy5cbiAgICAgIC8vIFRoaXMgaXMgbW9yZSBhZ2dyZXNzaXZlIHRoYW4gaWRlYWwsIGFuZCB0aGUgbG9uZyB0ZXJtIGdvYWwgaXMgdG8gb25seVxuICAgICAgLy8gaGF2ZSB0byBkZXRhY2ggdGhlIGRlbGV0ZWQgdHJlZSBhdCB0aGUgcm9vdC5cbiAgICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKTtcblxuICAgICAgaWYgKGZpYmVyID09PSBkZWxldGVkU3VidHJlZVJvb3QpIHtcbiAgICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSByZXR1cm5GaWJlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHN3aXRjaCAoY3VycmVudC50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxLCBjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59IC8vIFRPRE86IFJldXNlIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyB0cmF2ZXJzYWwgaGVyZT9cblxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmliZXIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaWJlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RVbm1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdFVubW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIENPTVBPTkVOVF9UWVBFID0gMDtcbnZhciBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSAxO1xudmFyIFJPTEVfVFlQRSA9IDI7XG52YXIgVEVTVF9OQU1FX1RZUEUgPSAzO1xudmFyIFRFWFRfVFlQRSA9IDQ7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIENPTVBPTkVOVF9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5jb21wb25lbnQnKTtcbiAgSEFTX1BTRVVET19DTEFTU19UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5oYXNfcHNldWRvX2NsYXNzJyk7XG4gIFJPTEVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3Iucm9sZScpO1xuICBURVNUX05BTUVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IudGVzdF9pZCcpO1xuICBURVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnRleHQnKTtcbn1cbnZhciBjb21taXRIb29rcyA9IFtdO1xuZnVuY3Rpb24gb25Db21taXRSb290JDEoKSB7XG4gIHtcbiAgICBjb21taXRIb29rcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21taXRIb29rKSB7XG4gICAgICByZXR1cm4gY29tbWl0SG9vaygpO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlO1xuZnVuY3Rpb24gaXNMZWdhY3lBY3RFbnZpcm9ubWVudChmaWJlcikge1xuICB7XG4gICAgLy8gTGVnYWN5IG1vZGUuIFdlIHByZXNlcnZlIHRoZSBiZWhhdmlvciBvZiBSZWFjdCAxNydzIGFjdC4gSXQgYXNzdW1lcyBhblxuICAgIC8vIGFjdCBlbnZpcm9ubWVudCB3aGVuZXZlciBgamVzdGAgaXMgZGVmaW5lZCwgYnV0IHlvdSBjYW4gc3RpbGwgdHVybiBvZmZcbiAgICAvLyBzcHVyaW91cyB3YXJuaW5ncyBieSBzZXR0aW5nIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBleHBsaWNpdGx5XG4gICAgLy8gdG8gZmFsc2UuXG4gICAgdmFyIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCA9IC8vICRGbG93RXhwZWN0ZWRFcnJvciDigJMgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGdsb2JhbFxuICAgIHR5cGVvZiBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgIT09ICd1bmRlZmluZWQnID8gSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIDogdW5kZWZpbmVkOyAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBqZXN0XG5cbiAgICB2YXIgamVzdElzRGVmaW5lZCA9IHR5cGVvZiBqZXN0ICE9PSAndW5kZWZpbmVkJztcbiAgICByZXR1cm4gIGplc3RJc0RlZmluZWQgJiYgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICE9PSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSB7XG4gIHtcbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIOKAkyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gcmVsZXZhbnQgZG9jdW1lbnRhdGlvbiBwYWdlLlxuICAgICAgZXJyb3IoJ1RoZSBjdXJyZW50IHRlc3RpbmcgZW52aXJvbm1lbnQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCAnICsgJ2FjdCguLi4pJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbDtcbiAgfVxufVxuXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcixcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsXG4gICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlO1xudmFyIE5vQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAqL1xuMDtcbnZhciBCYXRjaGVkQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICovXG4xO1xudmFyIFJlbmRlckNvbnRleHQgPVxuLyogICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgQ29tbWl0Q29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBSb290SW5Qcm9ncmVzcyA9IDA7XG52YXIgUm9vdEZhdGFsRXJyb3JlZCA9IDE7XG52YXIgUm9vdEVycm9yZWQgPSAyO1xudmFyIFJvb3RTdXNwZW5kZWQgPSAzO1xudmFyIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgPSA0O1xudmFyIFJvb3RDb21wbGV0ZWQgPSA1O1xudmFyIFJvb3REaWROb3RDb21wbGV0ZSA9IDY7IC8vIERlc2NyaWJlcyB3aGVyZSB3ZSBhcmUgaW4gdGhlIFJlYWN0IGV4ZWN1dGlvbiBzdGFja1xuXG52YXIgZXhlY3V0aW9uQ29udGV4dCA9IE5vQ29udGV4dDsgLy8gVGhlIHJvb3Qgd2UncmUgd29ya2luZyBvblxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDsgLy8gVGhlIGZpYmVyIHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzID0gbnVsbDsgLy8gVGhlIGxhbmVzIHdlJ3JlIHJlbmRlcmluZ1xuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBTdGFjayB0aGF0IGFsbG93cyBjb21wb25lbnRzIHRvIGNoYW5nZSB0aGUgcmVuZGVyIGxhbmVzIGZvciBpdHMgc3VidHJlZVxuLy8gVGhpcyBpcyBhIHN1cGVyc2V0IG9mIHRoZSBsYW5lcyB3ZSBzdGFydGVkIHdvcmtpbmcgb24gYXQgdGhlIHJvb3QuIFRoZSBvbmx5XG4vLyBjYXNlIHdoZXJlIGl0J3MgZGlmZmVyZW50IGZyb20gYHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzYCBpcyB3aGVuIHdlXG4vLyBlbnRlciBhIHN1YnRyZWUgdGhhdCBpcyBoaWRkZW4gYW5kIG5lZWRzIHRvIGJlIHVuaGlkZGVuOiBTdXNwZW5zZSBhbmRcbi8vIE9mZnNjcmVlbiBjb21wb25lbnQuXG4vL1xuLy8gTW9zdCB0aGluZ3MgaW4gdGhlIHdvcmsgbG9vcCBzaG91bGQgZGVhbCB3aXRoIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLlxuLy8gTW9zdCB0aGluZ3MgaW4gYmVnaW4vY29tcGxldGUgcGhhc2VzIHNob3VsZCBkZWFsIHdpdGggc3VidHJlZVJlbmRlckxhbmVzLlxuXG52YXIgc3VidHJlZVJlbmRlckxhbmVzID0gTm9MYW5lcztcbnZhciBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTm9MYW5lcyk7IC8vIFdoZXRoZXIgdG8gcm9vdCBjb21wbGV0ZWQsIGVycm9yZWQsIHN1c3BlbmRlZCwgZXRjLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzOyAvLyBBIGZhdGFsIGVycm9yLCBpZiBvbmUgaXMgdGhyb3duXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gbnVsbDsgLy8gXCJJbmNsdWRlZFwiIGxhbmVzIHJlZmVyIHRvIGxhbmVzIHRoYXQgd2VyZSB3b3JrZWQgb24gZHVyaW5nIHRoaXMgcmVuZGVyLiBJdCdzXG4vLyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiBgcmVuZGVyTGFuZXNgIGJlY2F1c2UgYHJlbmRlckxhbmVzYCBjYW4gY2hhbmdlIGFzIHlvdVxuLy8gZW50ZXIgYW5kIGV4aXQgYW4gT2Zmc2NyZWVuIHRyZWUuIFRoaXMgdmFsdWUgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGFsbCByZW5kZXJcbi8vIGxhbmVzIGZvciB0aGUgZW50aXJlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgd29yayBsZWZ0IG92ZXIgYnkgY29tcG9uZW50cyB0aGF0IHdlcmUgdmlzaXRlZCBkdXJpbmcgdGhpcyByZW5kZXIuIE9ubHlcbi8vIGluY2x1ZGVzIHVucHJvY2Vzc2VkIHVwZGF0ZXMsIG5vdCB3b3JrIGluIGJhaWxlZCBvdXQgY2hpbGRyZW4uXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCAoaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQpIGR1cmluZyB0aGlzIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UgKCpub3QqIGFuIGludGVybGVhdmVkIGV2ZW50KS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lczsgLy8gRXJyb3JzIHRoYXQgYXJlIHRocm93biBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBudWxsOyAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgd2UgcmVjb3ZlcmVkIGZyb20gd2l0aG91dCBzdXJmYWNpbmcgdGhlbSB0byB0aGUgVUkuXG4vLyBXZSB3aWxsIGxvZyB0aGVtIG9uY2UgdGhlIHRyZWUgY29tbWl0cy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDsgLy8gVGhlIG1vc3QgcmVjZW50IHRpbWUgd2UgY29tbWl0dGVkIGEgZmFsbGJhY2suIFRoaXMgbGV0cyB1cyBlbnN1cmUgYSB0cmFpblxuLy8gbW9kZWwgd2hlcmUgd2UgZG9uJ3QgY29tbWl0IG5ldyBsb2FkaW5nIHN0YXRlcyBpbiB0b28gcXVpY2sgc3VjY2Vzc2lvbi5cblxudmFyIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwO1xudmFyIEZBTExCQUNLX1RIUk9UVExFX01TID0gNTAwOyAvLyBUaGUgYWJzb2x1dGUgdGltZSBmb3Igd2hlbiB3ZSBzaG91bGQgc3RhcnQgZ2l2aW5nIHVwIG9uIHJlbmRlcmluZ1xuLy8gbW9yZSBhbmQgcHJlZmVyIENQVSBzdXNwZW5zZSBoZXVyaXN0aWNzIGluc3RlYWQuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gSW5maW5pdHk7IC8vIEhvdyBsb25nIGEgcmVuZGVyIGlzIHN1cHBvc2VkIHRvIHRha2UgYmVmb3JlIHdlIHN0YXJ0IGZvbGxvd2luZyBDUFVcbi8vIHN1c3BlbnNlIGhldXJpc3RpY3MgYW5kIG9wdCBvdXQgb2YgcmVuZGVyaW5nIG1vcmUgY29udGVudC5cblxudmFyIFJFTkRFUl9USU1FT1VUX01TID0gNTAwO1xudmFyIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBudWxsO1xuXG5mdW5jdGlvbiByZXNldFJlbmRlclRpbWVyKCkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gbm93KCkgKyBSRU5ERVJfVElNRU9VVF9NUztcbn1cblxuZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWU7XG59XG52YXIgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xudmFyIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG52YXIgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsOyAvLyBPbmx5IHVzZWQgd2hlbiBlbmFibGVQcm9maWxlck5lc3RlZFVwZGF0ZVNjaGVkdWxlZEhvb2sgaXMgdHJ1ZTtcbnZhciByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDtcbnZhciBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG52YXIgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMgPSBbXTtcbnZhciBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDsgLy8gVXNlIHRoZXNlIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiBuZXN0ZWQgdXBkYXRlc1xuXG52YXIgTkVTVEVEX1VQREFURV9MSU1JVCA9IDUwO1xudmFyIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbnZhciByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xudmFyIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciBORVNURURfUEFTU0lWRV9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsOyAvLyBJZiB0d28gdXBkYXRlcyBhcmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUgc2FtZSBldmVudCwgd2Ugc2hvdWxkIHRyZWF0IHRoZWlyXG4vLyBldmVudCB0aW1lcyBhcyBzaW11bHRhbmVvdXMsIGV2ZW4gaWYgdGhlIGFjdHVhbCBjbG9jayB0aW1lIGhhcyBhZHZhbmNlZFxuLy8gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG52YXIgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xudmFyIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lcztcbnZhciBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldFdvcmtJblByb2dyZXNzUm9vdCgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdDtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RFdmVudFRpbWUoKSB7XG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICAvLyBXZSdyZSBpbnNpZGUgUmVhY3QsIHNvIGl0J3MgZmluZSB0byByZWFkIHRoZSBhY3R1YWwgdGltZS5cbiAgICByZXR1cm4gbm93KCk7XG4gIH0gLy8gV2UncmUgbm90IGluc2lkZSBSZWFjdCwgc28gd2UgbWF5IGJlIGluIHRoZSBtaWRkbGUgb2YgYSBicm93c2VyIGV2ZW50LlxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFRpbWUgIT09IE5vVGltZXN0YW1wKSB7XG4gICAgLy8gVXNlIHRoZSBzYW1lIHN0YXJ0IHRpbWUgZm9yIGFsbCB1cGRhdGVzIHVudGlsIHdlIGVudGVyIFJlYWN0IGFnYWluLlxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xuICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZSBzaW5jZSBSZWFjdCB5aWVsZGVkLiBDb21wdXRlIGEgbmV3IHN0YXJ0IHRpbWUuXG5cblxuICBjdXJyZW50RXZlbnRUaW1lID0gbm93KCk7XG4gIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xufVxuZnVuY3Rpb24gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpIHtcbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH0gZWxzZSBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBUaGVzZSBhcmUgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLiBUaGVcbiAgICAvLyBvbGQgYmVoYXZpb3IgaXMgdG8gZ2l2ZSB0aGlzIHRoZSBzYW1lIFwidGhyZWFkXCIgKGxhbmVzKSBhc1xuICAgIC8vIHdoYXRldmVyIGlzIGN1cnJlbnRseSByZW5kZXJpbmcuIFNvIGlmIHlvdSBjYWxsIGBzZXRTdGF0ZWAgb24gYSBjb21wb25lbnRcbiAgICAvLyB0aGF0IGhhcHBlbnMgbGF0ZXIgaW4gdGhlIHNhbWUgcmVuZGVyLCBpdCB3aWxsIGZsdXNoLiBJZGVhbGx5LCB3ZSB3YW50IHRvXG4gICAgLy8gcmVtb3ZlIHRoZSBzcGVjaWFsIGNhc2UgYW5kIHRyZWF0IHRoZW0gYXMgaWYgdGhleSBjYW1lIGZyb20gYW5cbiAgICAvLyBpbnRlcmxlYXZlZCBldmVudC4gUmVnYXJkbGVzcywgdGhpcyBwYXR0ZXJuIGlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC5cbiAgICAvLyBUaGlzIGJlaGF2aW9yIGlzIG9ubHkgYSBmYWxsYmFjay4gVGhlIGZsYWcgb25seSBleGlzdHMgdW50aWwgd2UgY2FuIHJvbGxcbiAgICAvLyBvdXQgdGhlIHNldFN0YXRlIHdhcm5pbmcsIHNpbmNlIGV4aXN0aW5nIGNvZGUgbWlnaHQgYWNjaWRlbnRhbGx5IHJlbHkgb25cbiAgICAvLyB0aGUgY3VycmVudCBiZWhhdmlvci5cbiAgICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmUod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIGlzVHJhbnNpdGlvbiA9IHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpICE9PSBOb1RyYW5zaXRpb247XG5cbiAgaWYgKGlzVHJhbnNpdGlvbikge1xuICAgIGlmICggUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICAgICAgaWYgKCF0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzKSB7XG4gICAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7XG4gICAgICB9XG5cbiAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuYWRkKGZpYmVyKTtcbiAgICB9IC8vIFRoZSBhbGdvcml0aG0gZm9yIGFzc2lnbmluZyBhbiB1cGRhdGUgdG8gYSBsYW5lIHNob3VsZCBiZSBzdGFibGUgZm9yIGFsbFxuICAgIC8vIHVwZGF0ZXMgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aGluIHRoZSBzYW1lIGV2ZW50LiBUbyBkbyB0aGlzLCB0aGVcbiAgICAvLyBpbnB1dHMgdG8gdGhlIGFsZ29yaXRobSBtdXN0IGJlIHRoZSBzYW1lLlxuICAgIC8vXG4gICAgLy8gVGhlIHRyaWNrIHdlIHVzZSBpcyB0byBjYWNoZSB0aGUgZmlyc3Qgb2YgZWFjaCBvZiB0aGVzZSBpbnB1dHMgd2l0aGluIGFuXG4gICAgLy8gZXZlbnQuIFRoZW4gcmVzZXQgdGhlIGNhY2hlZCB2YWx1ZXMgb25jZSB3ZSBjYW4gYmUgc3VyZSB0aGUgZXZlbnQgaXNcbiAgICAvLyBvdmVyLiBPdXIgaGV1cmlzdGljIGZvciB0aGF0IGlzIHdoZW5ldmVyIHdlIGVudGVyIGEgY29uY3VycmVudCB3b3JrIGxvb3AuXG5cblxuICAgIGlmIChjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAvLyBBbGwgdHJhbnNpdGlvbnMgd2l0aGluIHRoZSBzYW1lIGV2ZW50IGFyZSBhc3NpZ25lZCB0aGUgc2FtZSBsYW5lLlxuICAgICAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZTtcbiAgfSAvLyBVcGRhdGVzIG9yaWdpbmF0aW5nIGluc2lkZSBjZXJ0YWluIFJlYWN0IG1ldGhvZHMsIGxpa2UgZmx1c2hTeW5jLCBoYXZlXG4gIC8vIHRoZWlyIHByaW9yaXR5IHNldCBieSB0cmFja2luZyBpdCB3aXRoIGEgY29udGV4dCB2YXJpYWJsZS5cbiAgLy9cbiAgLy8gVGhlIG9wYXF1ZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbmZpZyBpcyBpbnRlcm5hbGx5IGEgbGFuZSwgc28gd2UgY2FuXG4gIC8vIHVzZSB0aGF0IGRpcmVjdGx5LlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIHRvIHRoZSBldmVudCBwcmlvcml0eSBtb2R1bGUuXG5cblxuICB2YXIgdXBkYXRlTGFuZSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gIGlmICh1cGRhdGVMYW5lICE9PSBOb0xhbmUpIHtcbiAgICByZXR1cm4gdXBkYXRlTGFuZTtcbiAgfSAvLyBUaGlzIHVwZGF0ZSBvcmlnaW5hdGVkIG91dHNpZGUgUmVhY3QuIEFzayB0aGUgaG9zdCBlbnZpcm9ubWVudCBmb3IgYW5cbiAgLy8gYXBwcm9wcmlhdGUgcHJpb3JpdHksIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGV2ZW50LlxuICAvL1xuICAvLyBUaGUgb3BhcXVlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29uZmlnIGlzIGludGVybmFsbHkgYSBsYW5lLCBzbyB3ZSBjYW5cbiAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuXG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS5cblxuXG4gIHZhciBldmVudExhbmUgPSBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSgpO1xuICByZXR1cm4gZXZlbnRMYW5lO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UmV0cnlMYW5lKGZpYmVyKSB7XG4gIC8vIFRoaXMgaXMgYSBmb3JrIG9mIGByZXF1ZXN0VXBkYXRlTGFuZWAgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciBTdXNwZW5zZVxuICAvLyBcInJldHJpZXNcIiDigJQgYSBzcGVjaWFsIHVwZGF0ZSB0aGF0IGF0dGVtcHRzIHRvIGZsaXAgYSBTdXNwZW5zZSBib3VuZGFyeVxuICAvLyBmcm9tIGl0cyBwbGFjZWhvbGRlciBzdGF0ZSB0byBpdHMgcHJpbWFyeS9yZXNvbHZlZCBzdGF0ZS5cbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH1cblxuICByZXR1cm4gY2xhaW1OZXh0UmV0cnlMYW5lKCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpO1xuXG4gIHtcbiAgICBpZiAoaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KSB7XG4gICAgICBlcnJvcigndXNlSW5zZXJ0aW9uRWZmZWN0IG11c3Qgbm90IHNjaGVkdWxlIHVwZGF0ZXMuJyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIH1cbiAgfSAvLyBNYXJrIHRoYXQgdGhlIHJvb3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuXG5cblxuICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9MYW5lcyAmJiByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBUaGlzIHVwZGF0ZSB3YXMgZGlzcGF0Y2hlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpcyBpcyBhIG1pc3Rha2VcbiAgICAvLyBpZiB0aGUgdXBkYXRlIG9yaWdpbmF0ZXMgZnJvbSB1c2VyIHNwYWNlICh3aXRoIHRoZSBleGNlcHRpb24gb2YgbG9jYWxcbiAgICAvLyBob29rIHVwZGF0ZXMsIHdoaWNoIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGFuZCBkb24ndCByZWFjaCB0aGlzXG4gICAgLy8gZnVuY3Rpb24pLCBidXQgdGhlcmUgYXJlIHNvbWUgaW50ZXJuYWwgUmVhY3QgZmVhdHVyZXMgdGhhdCB1c2UgdGhpcyBhc1xuICAgIC8vIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbGlrZSBzZWxlY3RpdmUgaHlkcmF0aW9uLlxuICAgIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKTsgLy8gVHJhY2sgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2VcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgbm9ybWFsIHVwZGF0ZSwgc2NoZWR1bGVkIGZyb20gb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLiBGb3JcbiAgICAvLyBleGFtcGxlLCBkdXJpbmcgYW4gaW5wdXQgZXZlbnQuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKTtcblxuICAgIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAgIC8vIFJlY2VpdmVkIGFuIHVwZGF0ZSB0byBhIHRyZWUgdGhhdCdzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyaW5nLiBNYXJrXG4gICAgICAvLyB0aGF0IHRoZXJlIHdhcyBhbiBpbnRlcmxlYXZlZCB1cGRhdGUgd29yayBvbiB0aGlzIHJvb3QuIFVubGVzcyB0aGVcbiAgICAgIC8vIGBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2hgIGZsYWcgaXMgb2ZmIGFuZCB0aGlzIGlzIGEgcmVuZGVyXG4gICAgICAvLyBwaGFzZSB1cGRhdGUuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgdHJlYXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXMgaWZcbiAgICAgIC8vIHRoZXkgd2VyZSBpbnRlcmxlYXZlZCwgZm9yIGJhY2t3YXJkcyBjb21wYXQgcmVhc29ucy5cbiAgICAgIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcywgbGFuZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgICAgIC8vIFRoZSByb290IGFscmVhZHkgc3VzcGVuZGVkIHdpdGggYSBkZWxheSwgd2hpY2ggbWVhbnMgdGhpcyByZW5kZXJcbiAgICAgICAgLy8gZGVmaW5pdGVseSB3b24ndCBmaW5pc2guIFNpbmNlIHdlIGhhdmUgYSBuZXcgdXBkYXRlLCBsZXQncyBtYXJrIGl0IGFzXG4gICAgICAgIC8vIHN1c3BlbmRlZCBub3csIHJpZ2h0IGJlZm9yZSBtYXJraW5nIHRoZSBpbmNvbWluZyB1cGRhdGUuIFRoaXMgaGFzIHRoZVxuICAgICAgICAvLyBlZmZlY3Qgb2YgaW50ZXJydXB0aW5nIHRoZSBjdXJyZW50IHJlbmRlciBhbmQgc3dpdGNoaW5nIHRvIHRoZSB1cGRhdGUuXG4gICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3Qgb3ZlcnJpZGUgcGluZ3MgdGhhdCBoYXBwZW4gd2hpbGUgd2UndmVcbiAgICAgICAgLy8gYWxyZWFkeSBzdGFydGVkIHJlbmRlcmluZy5cbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG5cbiAgICBpZiAobGFuZSA9PT0gU3luY0xhbmUgJiYgZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS5cbiAgICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kpKSB7XG4gICAgICAvLyBGbHVzaCB0aGUgc3luY2hyb25vdXMgd29yayBub3csIHVubGVzcyB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgb3IgaW5zaWRlXG4gICAgICAvLyBhIGJhdGNoLiBUaGlzIGlzIGludGVudGlvbmFsbHkgaW5zaWRlIHNjaGVkdWxlVXBkYXRlT25GaWJlciBpbnN0ZWFkIG9mXG4gICAgICAvLyBzY2hlZHVsZUNhbGxiYWNrRm9yRmliZXIgdG8gcHJlc2VydmUgdGhlIGFiaWxpdHkgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgLy8gd2l0aG91dCBpbW1lZGlhdGVseSBmbHVzaGluZyBpdC4gV2Ugb25seSBkbyB0aGlzIGZvciB1c2VyLWluaXRpYXRlZFxuICAgICAgLy8gdXBkYXRlcywgdG8gcHJlc2VydmUgaGlzdG9yaWNhbCBiZWhhdmlvciBvZiBsZWdhY3kgbW9kZS5cbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpIHtcbiAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgZm9yayBvZiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgdGhhdCBpcyBvbmx5IHVzZWQgdG9cbiAgLy8gc2NoZWR1bGUgdGhlIGluaXRpYWwgaHlkcmF0aW9uIG9mIGEgcm9vdCB0aGF0IGhhcyBqdXN0IGJlZW4gY3JlYXRlZC4gTW9zdFxuICAvLyBvZiB0aGUgc3R1ZmYgaW4gc2NoZWR1bGVVcGRhdGVPbkZpYmVyIGNhbiBiZSBza2lwcGVkLlxuICAvL1xuICAvLyBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgc2VwYXJhdGUgcGF0aCwgdGhvdWdoLCBpcyB0byBkaXN0aW5ndWlzaCB0aGVcbiAgLy8gaW5pdGlhbCBjaGlsZHJlbiBmcm9tIHN1YnNlcXVlbnQgdXBkYXRlcy4gSW4gZnVsbHkgY2xpZW50LXJlbmRlcmVkIHJvb3RzXG4gIC8vIChjcmVhdGVSb290IGluc3RlYWQgb2YgaHlkcmF0ZVJvb3QpLCBhbGwgdG9wLWxldmVsIHJlbmRlcnMgYXJlIG1vZGVsZWQgYXNcbiAgLy8gdXBkYXRlcywgYnV0IGh5ZHJhdGlvbiByb290cyBhcmUgc3BlY2lhbCBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0XG4gIC8vIG1hdGNoIHdoYXQgd2FzIHJlbmRlcmVkIG9uIHRoZSBzZXJ2ZXIuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICBjdXJyZW50LmxhbmVzID0gbGFuZTtcbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuZnVuY3Rpb24gaXNVbnNhZmVDbGFzc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSB7XG4gIC8vIENoZWNrIGlmIHRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBPbmx5IGNhbGxlZCBieSBjbGFzcyBjb21wb25lbnRzLFxuICAvLyB3aGljaCBzcGVjaWFsIChkZXByZWNhdGVkKSBiZWhhdmlvciBmb3IgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlIHByb3BzLlxuICByZXR1cm4gKC8vIFRPRE86IFJlbW92ZSBvdXRkYXRlZCBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2ggZXhwZXJpbWVudC4gV2VcbiAgICAvLyBkZWNpZGVkIG5vdCB0byBlbmFibGUgaXQuXG4gICAgIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dFxuICApO1xufSAvLyBVc2UgdGhpcyBmdW5jdGlvbiB0byBzY2hlZHVsZSBhIHRhc2sgZm9yIGEgcm9vdC4gVGhlcmUncyBvbmx5IG9uZSB0YXNrIHBlclxuLy8gcm9vdDsgaWYgYSB0YXNrIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCwgd2UnbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwcmlvcml0eVxuLy8gb2YgdGhlIGV4aXN0aW5nIHRhc2sgaXMgdGhlIHNhbWUgYXMgdGhlIHByaW9yaXR5IG9mIHRoZSBuZXh0IGxldmVsIHRoYXQgdGhlXG4vLyByb290IGhhcyB3b3JrIG9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBldmVyeSB1cGRhdGUsIGFuZCByaWdodCBiZWZvcmVcbi8vIGV4aXRpbmcgYSB0YXNrLlxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFRoZXJlJ3Mgbm90aGluZyB0byB3b3JrIG9uLlxuICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgfVxuXG4gICAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgdXNlIHRoZSBoaWdoZXN0IHByaW9yaXR5IGxhbmUgdG8gcmVwcmVzZW50IHRoZSBwcmlvcml0eSBvZiB0aGUgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuICB2YXIgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID0gcm9vdC5jYWxsYmFja1ByaW9yaXR5O1xuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPT09IG5ld0NhbGxiYWNrUHJpb3JpdHkgJiYgLy8gU3BlY2lhbCBjYXNlIHJlbGF0ZWQgdG8gYGFjdGAuIElmIHRoZSBjdXJyZW50bHkgc2NoZWR1bGVkIHRhc2sgaXMgYVxuICAvLyBTY2hlZHVsZXIgdGFzaywgcmF0aGVyIHRoYW4gYW4gYGFjdGAgdGFzaywgY2FuY2VsIGl0IGFuZCByZS1zY2hlZHVsZWRcbiAgLy8gb24gdGhlIGBhY3RgIHF1ZXVlLlxuICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IGZha2VBY3RDYWxsYmFja05vZGUpKSB7XG4gICAge1xuICAgICAgLy8gSWYgd2UncmUgZ29pbmcgdG8gcmUtdXNlIGFuIGV4aXN0aW5nIHRhc2ssIGl0IG5lZWRzIHRvIGV4aXN0LlxuICAgICAgLy8gQXNzdW1lIHRoYXQgZGlzY3JldGUgdXBkYXRlIG1pY3JvdGFza3MgYXJlIG5vbi1jYW5jZWxsYWJsZSBhbmQgbnVsbC5cbiAgICAgIC8vIFRPRE86IFRlbXBvcmFyeSB1bnRpbCB3ZSBjb25maXJtIHRoaXMgd2FybmluZyBpcyBub3QgZmlyZWQuXG4gICAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgIT09IFN5bmNMYW5lKSB7XG4gICAgICAgIGVycm9yKCdFeHBlY3RlZCBzY2hlZHVsZWQgY2FsbGJhY2sgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cblxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9IG51bGwpIHtcbiAgICAvLyBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ldyBvbmUgYmVsb3cuXG4gICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gIH0gLy8gU2NoZWR1bGUgYSBuZXcgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tOb2RlO1xuXG4gIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jTGFuZSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIGlmIChyb290LnRhZyA9PT0gTGVnYWN5Um9vdCkge1xuICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kgIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVTeW5jQ2FsbGJhY2socGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBxdWV1ZSBpbiBhIG1pY3JvdGFzay5cbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEluc2lkZSBgYWN0YCwgdXNlIG91ciBpbnRlcm5hbCBgYWN0YCBxdWV1ZSBzbyB0aGF0IHRoZXNlIGdldCBmbHVzaGVkXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2NvcGUgZXZlbiB3aGVuIHVzaW5nIHRoZSBzeW5jIHZlcnNpb25cbiAgICAgICAgLy8gb2YgYGFjdGAuXG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudC5wdXNoKGZsdXNoU3luY0NhbGxiYWNrcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlZHVsZU1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gSW4gU2FmYXJpLCBhcHBlbmRpbmcgYW4gaWZyYW1lIGZvcmNlcyBtaWNyb3Rhc2tzIHRvIHJ1bi5cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIyNDU5XG4gICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBydW5uaW5nIGNhbGxiYWNrcyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlclxuICAgICAgICAgIC8vIG9yIGNvbW1pdCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgdGhhdC5cbiAgICAgICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyB3b3VsZCBzdGlsbCBwcmVtYXR1cmVseSBmbHVzaCB0aGUgY2FsbGJhY2tzXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgb3V0c2lkZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlIChlLmcuIGluIGFuIGV2ZW50KS5cbiAgICAgICAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3Q2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbDtcblxuICAgIHN3aXRjaCAobGFuZXNUb0V2ZW50UHJpb3JpdHkobmV4dExhbmVzKSkge1xuICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJbW1lZGlhdGVQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgSWRsZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJZGxlUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlQ2FsbGJhY2skMShzY2hlZHVsZXJQcmlvcml0eUxldmVsLCBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gIH1cblxuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBuZXdDYWxsYmFja1ByaW9yaXR5O1xuICByb290LmNhbGxiYWNrTm9kZSA9IG5ld0NhbGxiYWNrTm9kZTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIGV2ZXJ5IGNvbmN1cnJlbnQgdGFzaywgaS5lLiBhbnl0aGluZyB0aGF0XG4vLyBnb2VzIHRocm91Z2ggU2NoZWR1bGVyLlxuXG5cbmZ1bmN0aW9uIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdChyb290LCBkaWRUaW1lb3V0KSB7XG4gIHtcbiAgICByZXNldE5lc3RlZFVwZGF0ZUZsYWcoKTtcbiAgfSAvLyBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIGEgUmVhY3QgZXZlbnQsIHdlIGNhbiBjbGVhciB0aGUgY3VycmVudFxuICAvLyBldmVudCB0aW1lLiBUaGUgbmV4dCB1cGRhdGUgd2lsbCBjb21wdXRlIGEgbmV3IGV2ZW50IHRpbWUuXG5cblxuICBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lcztcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfSAvLyBGbHVzaCBhbnkgcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMgYmVmb3JlIGRlY2lkaW5nIHdoaWNoIGxhbmVzIHRvIHdvcmsgb24sXG4gIC8vIGluIGNhc2UgdGhleSBzY2hlZHVsZSBhZGRpdGlvbmFsIHdvcmsuXG5cblxuICB2YXIgb3JpZ2luYWxDYWxsYmFja05vZGUgPSByb290LmNhbGxiYWNrTm9kZTtcbiAgdmFyIGRpZEZsdXNoUGFzc2l2ZUVmZmVjdHMgPSBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG5cbiAgaWYgKGRpZEZsdXNoUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHBhc3NpdmUgZWZmZWN0IHBoYXNlIG1heSBoYXZlIGNhbmNlbGVkIHRoZSBjdXJyZW50IHRhc2suXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhc2sgbm9kZSBmb3IgdGhpcyByb290IHdhcyBjaGFuZ2VkLlxuICAgIGlmIChyb290LmNhbGxiYWNrTm9kZSAhPT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IHRhc2sgd2FzIGNhbmNlbGVkLiBFeGl0LiBXZSBkb24ndCBuZWVkIHRvIGNhbGxcbiAgICAgIC8vIGBlbnN1cmVSb290SXNTY2hlZHVsZWRgIGJlY2F1c2UgdGhlIGNoZWNrIGFib3ZlIGltcGxpZXMgZWl0aGVyIHRoYXRcbiAgICAgIC8vIHRoZXJlJ3MgYSBuZXcgdGFzaywgb3IgdGhhdCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrIG9uIHRoaXMgcm9vdC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSAvLyBEZXRlcm1pbmUgdGhlIG5leHQgbGFuZXMgdG8gd29yayBvbiwgdXNpbmcgdGhlIGZpZWxkcyBzdG9yZWRcbiAgLy8gb24gdGhlIHJvb3QuXG5cblxuICB2YXIgbGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ID8gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgOiBOb0xhbmVzKTtcblxuICBpZiAobGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBEZWZlbnNpdmUgY29kaW5nLiBUaGlzIGlzIG5ldmVyIGV4cGVjdGVkIHRvIGhhcHBlbi5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBXZSBkaXNhYmxlIHRpbWUtc2xpY2luZyBpbiBzb21lIGNhc2VzOiBpZiB0aGUgd29yayBoYXMgYmVlbiBDUFUtYm91bmRcbiAgLy8gZm9yIHRvbyBsb25nIChcImV4cGlyZWRcIiB3b3JrLCB0byBwcmV2ZW50IHN0YXJ2YXRpb24pLCBvciB3ZSdyZSBpblxuICAvLyBzeW5jLXVwZGF0ZXMtYnktZGVmYXVsdCBtb2RlLlxuICAvLyBUT0RPOiBXZSBvbmx5IGNoZWNrIGBkaWRUaW1lb3V0YCBkZWZlbnNpdmVseSwgdG8gYWNjb3VudCBmb3IgYSBTY2hlZHVsZXJcbiAgLy8gYnVnIHdlJ3JlIHN0aWxsIGludmVzdGlnYXRpbmcuIE9uY2UgdGhlIGJ1ZyBpbiBTY2hlZHVsZXIgaXMgZml4ZWQsXG4gIC8vIHdlIGNhbiByZW1vdmUgdGhpcywgc2luY2Ugd2UgdHJhY2sgZXhwaXJhdGlvbiBvdXJzZWx2ZXMuXG5cblxuICB2YXIgc2hvdWxkVGltZVNsaWNlID0gIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKSAmJiAhaW5jbHVkZXNFeHBpcmVkTGFuZShyb290LCBsYW5lcykgJiYgKCAhZGlkVGltZW91dCk7XG4gIHZhciBleGl0U3RhdHVzID0gc2hvdWxkVGltZVNsaWNlID8gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpIDogcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gIGlmIChleGl0U3RhdHVzICE9PSBSb290SW5Qcm9ncmVzcykge1xuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgICAgLy8gSWYgc29tZXRoaW5nIHRocmV3IGFuIGVycm9yLCB0cnkgcmVuZGVyaW5nIG9uZSBtb3JlIHRpbWUuIFdlJ2xsXG4gICAgICAvLyByZW5kZXIgc3luY2hyb25vdXNseSB0byBibG9jayBjb25jdXJyZW50IGRhdGEgbXV0YXRpb25zLCBhbmQgd2UnbGxcbiAgICAgIC8vIGluY2x1ZGVzIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlclxuICAgICAgLy8gdGhlIHNlY29uZCBhdHRlbXB0LCB3ZSdsbCBnaXZlIHVwIGFuZCBjb21taXQgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgICAgdmFyIGVycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgICBpZiAoZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIGxhbmVzID0gZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgdmFyIGZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgICB0aHJvdyBmYXRhbEVycm9yO1xuICAgIH1cblxuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHtcbiAgICAgIC8vIFRoZSByZW5kZXIgdW53b3VuZCB3aXRob3V0IGNvbXBsZXRpbmcgdGhlIHRyZWUuIFRoaXMgaGFwcGVucyBpbiBzcGVjaWFsXG4gICAgICAvLyBjYXNlcyB3aGVyZSBuZWVkIHRvIGV4aXQgdGhlIGN1cnJlbnQgcmVuZGVyIHdpdGhvdXQgcHJvZHVjaW5nIGFcbiAgICAgIC8vIGNvbnNpc3RlbnQgdHJlZSBvciBjb21taXR0aW5nLlxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGR1cmluZyBhIGNvbmN1cnJlbnQgcmVuZGVyLCBub3QgYSBkaXNjcmV0ZSBvclxuICAgICAgLy8gc3luY2hyb25vdXMgdXBkYXRlLiBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHRoaXMgd2hlbiB3ZVxuICAgICAgLy8gdW53b3VuZCB0aGUgc3RhY2suXG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJlbmRlciBjb21wbGV0ZWQuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIHJlbmRlciBtYXkgaGF2ZSB5aWVsZGVkIHRvIGEgY29uY3VycmVudCBldmVudCwgYW5kIGlmIHNvLFxuICAgICAgLy8gY29uZmlybSB0aGF0IGFueSBuZXdseSByZW5kZXJlZCBzdG9yZXMgYXJlIGNvbnNpc3RlbnQuXG4gICAgICAvLyBUT0RPOiBJdCdzIHBvc3NpYmxlIHRoYXQgZXZlbiBhIGNvbmN1cnJlbnQgcmVuZGVyIG1heSBuZXZlciBoYXZlIHlpZWxkZWRcbiAgICAgIC8vIHRvIHRoZSBtYWluIHRocmVhZCwgaWYgaXQgd2FzIGZhc3QgZW5vdWdoLCBvciBpZiBpdCBleHBpcmVkLiBXZSBjb3VsZFxuICAgICAgLy8gc2tpcCB0aGUgY29uc2lzdGVuY3kgY2hlY2sgaW4gdGhhdCBjYXNlLCB0b28uXG4gICAgICB2YXIgcmVuZGVyV2FzQ29uY3VycmVudCA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcyk7XG4gICAgICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHJlbmRlcldhc0NvbmN1cnJlbnQgJiYgIWlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspKSB7XG4gICAgICAgIC8vIEEgc3RvcmUgd2FzIG11dGF0ZWQgaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQuIFJlbmRlciBhZ2FpbixcbiAgICAgICAgLy8gc3luY2hyb25vdXNseSwgdG8gYmxvY2sgZnVydGhlciBtdXRhdGlvbnMuXG4gICAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7IC8vIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4gaWYgc29tZXRoaW5nIHRocmV3XG5cbiAgICAgICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICAgICAgdmFyIF9lcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgICAgIGlmIChfZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgICBsYW5lcyA9IF9lcnJvclJldHJ5TGFuZXM7XG4gICAgICAgICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgX2Vycm9yUmV0cnlMYW5lcyk7IC8vIFdlIGFzc3VtZSB0aGUgdHJlZSBpcyBub3cgY29uc2lzdGVudCBiZWNhdXNlIHdlIGRpZG4ndCB5aWVsZCB0byBhbnlcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgZXZlbnRzLlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgICAgICAgdmFyIF9mYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgICAgIHRocm93IF9mYXRhbEVycm9yO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBUaGUgbmV4dCBzdGVwIGlzIGVpdGhlciB0byBjb21taXQgaXQsXG4gICAgICAvLyBvciwgaWYgc29tZXRoaW5nIHN1c3BlbmRlZCwgd2FpdCB0byBjb21taXQgaXQgYWZ0ZXIgYSB0aW1lb3V0LlxuXG5cbiAgICAgIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICAgICAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gICAgICBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyb290LmNhbGxiYWNrTm9kZSA9PT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAvLyBUaGUgdGFzayBub2RlIHNjaGVkdWxlZCBmb3IgdGhpcyByb290IGlzIHRoZSBzYW1lIG9uZSB0aGF0J3NcbiAgICAvLyBjdXJyZW50bHkgZXhlY3V0ZWQuIE5lZWQgdG8gcmV0dXJuIGEgY29udGludWF0aW9uLlxuICAgIHJldHVybiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpIHtcbiAgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbiwgZGlzY2FyZCBzZXJ2ZXIgcmVzcG9uc2UgYW5kIGZhbGxcbiAgLy8gYmFjayB0byBjbGllbnQgc2lkZSByZW5kZXIuXG4gIC8vIEJlZm9yZSByZW5kZXJpbmcgYWdhaW4sIHNhdmUgdGhlIGVycm9ycyBmcm9tIHRoZSBwcmV2aW91cyBhdHRlbXB0LlxuICB2YXIgZXJyb3JzRnJvbUZpcnN0QXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnM7XG5cbiAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAvLyBUaGUgc2hlbGwgZmFpbGVkIHRvIGh5ZHJhdGUuIFNldCBhIGZsYWcgdG8gZm9yY2UgYSBjbGllbnQgcmVuZGVyaW5nXG4gICAgLy8gZHVyaW5nIHRoZSBuZXh0IGF0dGVtcHQuIFRvIGRvIHRoaXMsIHdlIGNhbGwgcHJlcGFyZUZyZXNoU3RhY2sgbm93XG4gICAgLy8gdG8gY3JlYXRlIHRoZSByb290IHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIFRoaXMgaXMgYSBiaXQgd2VpcmQgaW4gdGVybXNcbiAgICAvLyBvZiBmYWN0b3JpbmcsIGJlY2F1c2UgaXQgcmVsaWVzIG9uIHJlbmRlclJvb3RTeW5jIG5vdCBjYWxsaW5nXG4gICAgLy8gcHJlcGFyZUZyZXNoU3RhY2sgYWdhaW4gaW4gdGhlIGNhbGwgYmVsb3csIHdoaWNoIGhhcHBlbnMgYmVjYXVzZSB0aGVcbiAgICAvLyByb290IGFuZCBsYW5lcyBoYXZlbid0IGNoYW5nZWQuXG4gICAgLy9cbiAgICAvLyBUT0RPOiBJIHRoaW5rIHdoYXQgd2Ugc2hvdWxkIGRvIGlzIHNldCBGb3JjZUNsaWVudFJlbmRlciBpbnNpZGVcbiAgICAvLyB0aHJvd0V4Y2VwdGlvbiwgbGlrZSB3ZSBkbyBmb3IgbmVzdGVkIFN1c3BlbnNlIGJvdW5kYXJpZXMuIFRoZSByZWFzb25cbiAgICAvLyBpdCdzIGhlcmUgaW5zdGVhZCBpcyBzbyB3ZSBjYW4gc3dpdGNoIHRvIHRoZSBzeW5jaHJvbm91cyB3b3JrIGxvb3AsIHRvby5cbiAgICAvLyBTb21ldGhpbmcgdG8gY29uc2lkZXIgZm9yIGEgZnV0dXJlIHJlZmFjdG9yLlxuICAgIHZhciByb290V29ya0luUHJvZ3Jlc3MgPSBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgIHJvb3RXb3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcblxuICAgIHtcbiAgICAgIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuXG4gIGlmIChleGl0U3RhdHVzICE9PSBSb290RXJyb3JlZCkge1xuICAgIC8vIFN1Y2Nlc3NmdWxseSBmaW5pc2hlZCByZW5kZXJpbmcgb24gcmV0cnlcbiAgICAvLyBUaGUgZXJyb3JzIGZyb20gdGhlIGZhaWxlZCBmaXJzdCBhdHRlbXB0IGhhdmUgYmVlbiByZWNvdmVyZWQuIEFkZFxuICAgIC8vIHRoZW0gdG8gdGhlIGNvbGxlY3Rpb24gb2YgcmVjb3ZlcmFibGUgZXJyb3JzLiBXZSdsbCBsb2cgdGhlbSBpbiB0aGVcbiAgICAvLyBjb21taXQgcGhhc2UuXG4gICAgdmFyIGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0ID0gd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnM7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBlcnJvcnNGcm9tRmlyc3RBdHRlbXB0OyAvLyBUaGUgZXJyb3JzIGZyb20gdGhlIHNlY29uZCBhdHRlbXB0IHNob3VsZCBiZSBxdWV1ZWQgYWZ0ZXIgdGhlIGVycm9yc1xuICAgIC8vIGZyb20gdGhlIGZpcnN0IGF0dGVtcHQsIHRvIHByZXNlcnZlIHRoZSBjYXVzYWwgc2VxdWVuY2UuXG5cbiAgICBpZiAoZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQgIT09IG51bGwpIHtcbiAgICAgIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGl0U3RhdHVzO1xufVxuXG5mdW5jdGlvbiBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9ycykge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGVycm9ycztcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycy5wdXNoLmFwcGx5KHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCBlcnJvcnMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENvbmN1cnJlbnRSZW5kZXIocm9vdCwgZXhpdFN0YXR1cywgbGFuZXMpIHtcbiAgc3dpdGNoIChleGl0U3RhdHVzKSB7XG4gICAgY2FzZSBSb290SW5Qcm9ncmVzczpcbiAgICBjYXNlIFJvb3RGYXRhbEVycm9yZWQ6XG4gICAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIC8vIEZsb3cga25vd3MgYWJvdXQgaW52YXJpYW50LCBzbyBpdCBjb21wbGFpbnMgaWYgSSBhZGQgYSBicmVha1xuICAgIC8vIHN0YXRlbWVudCwgYnV0IGVzbGludCBkb2Vzbid0IGtub3cgYWJvdXQgaW52YXJpYW50LCBzbyBpdCBjb21wbGFpbnNcbiAgICAvLyBpZiBJIGRvLiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgUm9vdEVycm9yZWQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIHJldHJ5IHRoaXMgdHJlZS4gSWYgd2UgcmVhY2hlZFxuICAgICAgICAvLyB0aGlzIHBvaW50LCBpdCBlcnJvcmVkIGFnYWluLiBDb21taXQgaXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdFN1c3BlbmRlZDpcbiAgICAgIHtcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7IC8vIFdlIGhhdmUgYW4gYWNjZXB0YWJsZSBsb2FkaW5nIHN0YXRlLiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgd2VcbiAgICAgICAgLy8gc2hvdWxkIGltbWVkaWF0ZWx5IGNvbW1pdCBpdCBvciB3YWl0IGEgYml0LlxuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlSZXRyaWVzKGxhbmVzKSAmJiAvLyBkbyBub3QgZGVsYXkgaWYgd2UncmUgaW5zaWRlIGFuIGFjdCgpIHNjb3BlXG4gICAgICAgICFzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSkge1xuICAgICAgICAgIC8vIFRoaXMgcmVuZGVyIG9ubHkgaW5jbHVkZWQgcmV0cmllcywgbm8gdXBkYXRlcy4gVGhyb3R0bGUgY29tbWl0dGluZ1xuICAgICAgICAgIC8vIHJldHJpZXMgc28gdGhhdCB3ZSBkb24ndCBzaG93IHRvbyBtYW55IGxvYWRpbmcgc3RhdGVzIHRvbyBxdWlja2x5LlxuICAgICAgICAgIHZhciBtc1VudGlsVGltZW91dCA9IGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgKyBGQUxMQkFDS19USFJPVFRMRV9NUyAtIG5vdygpOyAvLyBEb24ndCBib3RoZXIgd2l0aCBhIHZlcnkgc2hvcnQgc3VzcGVuc2UgdGltZS5cblxuICAgICAgICAgIGlmIChtc1VudGlsVGltZW91dCA+IDEwKSB7XG4gICAgICAgICAgICB2YXIgbmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuXG4gICAgICAgICAgICBpZiAobmV4dExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgICAgIC8vIFRoZXJlJ3MgYWRkaXRpb25hbCB3b3JrIG9uIHRoaXMgcm9vdC5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG5cbiAgICAgICAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHN1c3BlbmRlZExhbmVzLCBsYW5lcykpIHtcbiAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHByZWZlciB0byByZW5kZXIgdGhlIGZhbGxiYWNrIG9mIGF0IHRoZSBsYXN0XG4gICAgICAgICAgICAgIC8vIHN1c3BlbmRlZCBsZXZlbC4gUGluZyB0aGUgbGFzdCBzdXNwZW5kZWQgbGV2ZWwgdG8gdHJ5XG4gICAgICAgICAgICAgIC8vIHJlbmRlcmluZyBpdCBhZ2Fpbi5cbiAgICAgICAgICAgICAgLy8gRklYTUU6IFdoYXQgaWYgdGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgSWRsZT8gU2hvdWxkIG5vdCByZXN0YXJ0LlxuICAgICAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgICAgICAgICBtYXJrUm9vdFBpbmdlZChyb290LCBzdXNwZW5kZWRMYW5lcyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSAvLyBUaGUgcmVuZGVyIGlzIHN1c3BlbmRlZCwgaXQgaGFzbid0IHRpbWVkIG91dCwgYW5kIHRoZXJlJ3Mgbm9cbiAgICAgICAgICAgIC8vIGxvd2VyIHByaW9yaXR5IHdvcmsgdG8gZG8uIEluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZmFsbGJhY2tcbiAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5LCB3YWl0IGZvciBtb3JlIGRhdGEgdG8gYXJyaXZlLlxuXG5cbiAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBtc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVGhlIHdvcmsgZXhwaXJlZC4gQ29tbWl0IGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290U3VzcGVuZGVkV2l0aERlbGF5OlxuICAgICAge1xuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIHRyYW5zaXRpb24sIHNvIHdlIHNob3VsZCBleGl0IHdpdGhvdXQgY29tbWl0dGluZyBhXG4gICAgICAgICAgLy8gcGxhY2Vob2xkZXIgYW5kIHdpdGhvdXQgc2NoZWR1bGluZyBhIHRpbWVvdXQuIERlbGF5IGluZGVmaW5pdGVseVxuICAgICAgICAgIC8vIHVudGlsIHdlIHJlY2VpdmUgbW9yZSBkYXRhLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgdHJhbnNpdGlvbiwgYnV0IHdlIGRpZCB0cmlnZ2VyIGFuIGF2b2lkZWQgc3RhdGUuXG4gICAgICAgICAgLy8gU2NoZWR1bGUgYSBwbGFjZWhvbGRlciB0byBkaXNwbGF5IGFmdGVyIGEgc2hvcnQgZGVsYXksIHVzaW5nIHRoZSBKdXN0XG4gICAgICAgICAgLy8gTm90aWNlYWJsZSBEaWZmZXJlbmNlLlxuICAgICAgICAgIC8vIFRPRE86IElzIHRoZSBKTkQgb3B0aW1pemF0aW9uIHdvcnRoIHRoZSBhZGRlZCBjb21wbGV4aXR5PyBJZiB0aGlzIGlzXG4gICAgICAgICAgLy8gdGhlIG9ubHkgcmVhc29uIHdlIHRyYWNrIHRoZSBldmVudCB0aW1lLCB0aGVuIHByb2JhYmx5IG5vdC5cbiAgICAgICAgICAvLyBDb25zaWRlciByZW1vdmluZy5cbiAgICAgICAgICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IGdldE1vc3RSZWNlbnRFdmVudFRpbWUocm9vdCwgbGFuZXMpO1xuICAgICAgICAgIHZhciBldmVudFRpbWVNcyA9IG1vc3RSZWNlbnRFdmVudFRpbWU7XG4gICAgICAgICAgdmFyIHRpbWVFbGFwc2VkTXMgPSBub3coKSAtIGV2ZW50VGltZU1zO1xuXG4gICAgICAgICAgdmFyIF9tc1VudGlsVGltZW91dCA9IGpuZCh0aW1lRWxhcHNlZE1zKSAtIHRpbWVFbGFwc2VkTXM7IC8vIERvbid0IGJvdGhlciB3aXRoIGEgdmVyeSBzaG9ydCBzdXNwZW5zZSB0aW1lLlxuXG5cbiAgICAgICAgICBpZiAoX21zVW50aWxUaW1lb3V0ID4gMTApIHtcbiAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZmFsbGJhY2sgaW1tZWRpYXRlbHksIHdhaXQgZm9yIG1vcmUgZGF0YVxuICAgICAgICAgICAgLy8gdG8gYXJyaXZlLlxuICAgICAgICAgICAgcm9vdC50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KGNvbW1pdFJvb3QuYmluZChudWxsLCByb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyksIF9tc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gQ29tbWl0IHRoZSBwbGFjZWhvbGRlci5cblxuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdENvbXBsZXRlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gVGhlIHdvcmsgY29tcGxldGVkLiBSZWFkeSB0byBjb21taXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biByb290IGV4aXQgc3RhdHVzLicpO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gU2VhcmNoIHRoZSByZW5kZXJlZCB0cmVlIGZvciBleHRlcm5hbCBzdG9yZSByZWFkcywgYW5kIGNoZWNrIHdoZXRoZXIgdGhlXG4gIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQgaW4gYSBjb25jdXJyZW50IGV2ZW50LiBJbnRlbnRpb25hbGx5IHVzaW5nIGFuIGl0ZXJhdGl2ZVxuICAvLyBsb29wIGluc3RlYWQgb2YgcmVjdXJzaW9uIHNvIHdlIGNhbiBleGl0IGVhcmx5LlxuICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLmZsYWdzICYgU3RvcmVDb25zaXN0ZW5jeSkge1xuICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gbm9kZS51cGRhdGVRdWV1ZTtcblxuICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBjaGVja3MgPSB1cGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICAgICAgaWYgKGNoZWNrcyAhPT0gbnVsbCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hlY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hlY2sgPSBjaGVja3NbaV07XG4gICAgICAgICAgICB2YXIgZ2V0U25hcHNob3QgPSBjaGVjay5nZXRTbmFwc2hvdDtcbiAgICAgICAgICAgIHZhciByZW5kZXJlZFZhbHVlID0gY2hlY2sudmFsdWU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICghb2JqZWN0SXMoZ2V0U25hcHNob3QoKSwgcmVuZGVyZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3VuZCBhbiBpbmNvbnNpc3RlbnQgc3RvcmUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBJZiBgZ2V0U25hcHNob3RgIHRocm93cywgcmV0dXJuIGBmYWxzZWAuIFRoaXMgd2lsbCBzY2hlZHVsZVxuICAgICAgICAgICAgICAvLyBhIHJlLXJlbmRlciwgYW5kIHRoZSBlcnJvciB3aWxsIGJlIHJldGhyb3duIGR1cmluZyByZW5kZXIuXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKG5vZGUuc3VidHJlZUZsYWdzICYgU3RvcmVDb25zaXN0ZW5jeSAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBjaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH0gLy8gRmxvdyBkb2Vzbid0IGtub3cgdGhpcyBpcyB1bnJlYWNoYWJsZSwgYnV0IGVzbGludCBkb2VzXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnJlYWNoYWJsZVxuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgLy8gV2hlbiBzdXNwZW5kaW5nLCB3ZSBzaG91bGQgYWx3YXlzIGV4Y2x1ZGUgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBvciAobW9yZVxuICAvLyByYXJlbHksIHNpbmNlIHdlIHRyeSB0byBhdm9pZCBpdCkgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgLy8gVE9ETzogTG9sIG1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGZhY3RvciB0aGlzIGJlc2lkZXMgdGhpc1xuICAvLyBvYm5veGlvdXNseSBuYW1lZCBmdW5jdGlvbiA6KVxuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyk7XG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzKTtcbiAgbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3Igc3luY2hyb25vdXMgdGFza3MgdGhhdCBkb24ndCBnb1xuLy8gdGhyb3VnaCBTY2hlZHVsZXJcblxuXG5mdW5jdGlvbiBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCkge1xuICB7XG4gICAgc3luY05lc3RlZFVwZGF0ZUZsYWcoKTtcbiAgfVxuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9XG5cbiAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB2YXIgbGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgTm9MYW5lcyk7XG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGxhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICAvLyBUaGVyZSdzIG5vIHJlbWFpbmluZyBzeW5jIHdvcmsgbGVmdC5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG5cbiAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgLy8gSWYgc29tZXRoaW5nIHRocmV3IGFuIGVycm9yLCB0cnkgcmVuZGVyaW5nIG9uZSBtb3JlIHRpbWUuIFdlJ2xsIHJlbmRlclxuICAgIC8vIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsIGluY2x1ZGVzXG4gICAgLy8gYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyIHRoZSBzZWNvbmRcbiAgICAvLyBhdHRlbXB0LCB3ZSdsbCBnaXZlIHVwIGFuZCBjb21taXQgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgIGlmIChlcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIGxhbmVzID0gZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICB2YXIgZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICB0aHJvdyBmYXRhbEVycm9yO1xuICB9XG5cbiAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3REaWROb3RDb21wbGV0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBCZWNhdXNlIHRoaXMgaXMgYSBzeW5jIHJlbmRlciwgd2VcbiAgLy8gd2lsbCBjb21taXQgaXQgZXZlbiBpZiBzb21ldGhpbmcgc3VzcGVuZGVkLlxuXG5cbiAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBsYW5lcztcbiAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7IC8vIEJlZm9yZSBleGl0aW5nLCBtYWtlIHN1cmUgdGhlcmUncyBhIGNhbGxiYWNrIHNjaGVkdWxlZCBmb3IgdGhlIG5leHRcbiAgLy8gcGVuZGluZyBsZXZlbC5cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmx1c2hSb290KHJvb3QsIGxhbmVzKSB7XG4gIGlmIChsYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG1lcmdlTGFuZXMobGFuZXMsIFN5bmNMYW5lKSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMkMShmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gSWYgdGhlcmUgd2VyZSBsZWdhY3kgc3luYyB1cGRhdGVzLCBmbHVzaCB0aGVtIGF0IHRoZSBlbmQgb2YgdGhlIG91dGVyXG4gICAgLy8gbW9zdCBiYXRjaGVkVXBkYXRlcy1saWtlIG1ldGhvZC5cblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS5cbiAgICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kpKSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaXNjcmV0ZVVwZGF0ZXMoZm4sIGEsIGIsIGMsIGQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICByZXR1cm4gZm4oYSwgYiwgYywgZCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgIH1cbiAgfVxufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5mdW5jdGlvbiBmbHVzaFN5bmMoZm4pIHtcbiAgLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGZsdXNoIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlXG4gIC8vIG5leHQgZXZlbnQsIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBvbmUuXG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCAmJiByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy50YWcgPT09IExlZ2FjeVJvb3QgJiYgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9XG5cbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcblxuICAgIGlmIChmbikge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2guXG4gICAgLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBoYXBwZW4gZXZlbiBpZiBiYXRjaGVkVXBkYXRlcyBpcyBoaWdoZXIgdXBcbiAgICAvLyB0aGUgc3RhY2suXG5cbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQWxyZWFkeVJlbmRlcmluZygpIHtcbiAgLy8gVXNlZCBieSB0aGUgcmVuZGVyZXIgdG8gcHJpbnQgYSB3YXJuaW5nIGlmIGNlcnRhaW4gQVBJcyBhcmUgY2FsbGVkIGZyb21cbiAgLy8gdGhlIHdyb25nIGNvbnRleHQuXG4gIHJldHVybiAgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0O1xufVxuZnVuY3Rpb24gcHVzaFJlbmRlckxhbmVzKGZpYmVyLCBsYW5lcykge1xuICBwdXNoKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgc3VidHJlZVJlbmRlckxhbmVzLCBmaWJlcik7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IG1lcmdlTGFuZXMoc3VidHJlZVJlbmRlckxhbmVzLCBsYW5lcyk7XG4gIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMsIGxhbmVzKTtcbn1cbmZ1bmN0aW9uIHBvcFJlbmRlckxhbmVzKGZpYmVyKSB7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvci5jdXJyZW50O1xuICBwb3Aoc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKSB7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHRpbWVvdXRIYW5kbGUgPSByb290LnRpbWVvdXRIYW5kbGU7XG5cbiAgaWYgKHRpbWVvdXRIYW5kbGUgIT09IG5vVGltZW91dCkge1xuICAgIC8vIFRoZSByb290IHByZXZpb3VzIHN1c3BlbmRlZCBhbmQgc2NoZWR1bGVkIGEgdGltZW91dCB0byBjb21taXQgYSBmYWxsYmFja1xuICAgIC8vIHN0YXRlLiBOb3cgdGhhdCB3ZSBoYXZlIGFkZGl0aW9uYWwgd29yaywgY2FuY2VsIHRoZSB0aW1lb3V0LlxuICAgIHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDsgLy8gJEZsb3dGaXhNZSBDb21wbGFpbnMgbm9UaW1lb3V0IGlzIG5vdCBhIFRpbWVvdXRJRCwgZGVzcGl0ZSB0aGUgY2hlY2sgYWJvdmVcblxuICAgIGNhbmNlbFRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJydXB0ZWRXb3JrID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gICAgd2hpbGUgKGludGVycnVwdGVkV29yayAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpbnRlcnJ1cHRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBpbnRlcnJ1cHRlZFdvcmsgPSBpbnRlcnJ1cHRlZFdvcmsucmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHZhciByb290V29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhyb290LmN1cnJlbnQsIG51bGwpO1xuICB3b3JrSW5Qcm9ncmVzcyA9IHJvb3RXb3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBudWxsO1xuICBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCk7XG5cbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MoKTtcbiAgfVxuXG4gIHJldHVybiByb290V29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKSB7XG4gIGRvIHtcbiAgICB2YXIgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXNldCBtb2R1bGUtbGV2ZWwgc3RhdGUgdGhhdCB3YXMgc2V0IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTsgLy8gVE9ETzogSSBmb3VuZCBhbmQgYWRkZWQgdGhpcyBtaXNzaW5nIGxpbmUgd2hpbGUgaW52ZXN0aWdhdGluZyBhXG4gICAgICAvLyBzZXBhcmF0ZSBpc3N1ZS4gV3JpdGUgYSByZWdyZXNzaW9uIHRlc3QgdXNpbmcgc3RyaW5nIHJlZnMuXG5cbiAgICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG5cbiAgICAgIGlmIChlcnJvcmVkV29yayA9PT0gbnVsbCB8fCBlcnJvcmVkV29yay5yZXR1cm4gPT09IG51bGwpIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQgdG8gYmUgd29ya2luZyBvbiBhIG5vbi1yb290IGZpYmVyLiBUaGlzIGlzIGEgZmF0YWwgZXJyb3JcbiAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSdzIG5vIGFuY2VzdG9yIHRoYXQgY2FuIGhhbmRsZSBpdDsgdGhlIHJvb3QgaXNcbiAgICAgICAgLy8gc3VwcG9zZWQgdG8gY2FwdHVyZSBhbGwgZXJyb3JzIHRoYXQgd2VyZW4ndCBjYXVnaHQgYnkgYW4gZXJyb3JcbiAgICAgICAgLy8gYm91bmRhcnkuXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RmF0YWxFcnJvcmVkO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gdGhyb3duVmFsdWU7IC8vIFNldCBgd29ya0luUHJvZ3Jlc3NgIHRvIG51bGwuIFRoaXMgcmVwcmVzZW50cyBhZHZhbmNpbmcgdG8gdGhlIG5leHRcbiAgICAgICAgLy8gc2libGluZywgb3IgdGhlIHBhcmVudCBpZiB0aGVyZSBhcmUgbm8gc2libGluZ3MuIEJ1dCBzaW5jZSB0aGUgcm9vdFxuICAgICAgICAvLyBoYXMgbm8gc2libGluZ3Mgbm9yIGEgcGFyZW50LCB3ZSBzZXQgaXQgdG8gbnVsbC4gVXN1YWxseSB0aGlzIGlzXG4gICAgICAgIC8vIGhhbmRsZWQgYnkgYGNvbXBsZXRlVW5pdE9mV29ya2Agb3IgYHVud2luZFdvcmtgLCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgLy8gaW50ZW50aW9uYWxseSBub3QgY2FsbGluZyB0aG9zZSwgd2UgbmVlZCBzZXQgaXQgaGVyZS5cbiAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgY2FsbGluZyBgdW53aW5kV29ya2AgdG8gcG9wIHRoZSBjb250ZXh0cy5cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZXJyb3JlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgdGltZSBzcGVudCByZW5kZXJpbmcgYmVmb3JlIGFuIGVycm9yIHdhcyB0aHJvd24uIFRoaXNcbiAgICAgICAgLy8gYXZvaWRzIGluYWNjdXJhdGUgUHJvZmlsZXIgZHVyYXRpb25zIGluIHRoZSBjYXNlIG9mIGFcbiAgICAgICAgLy8gc3VzcGVuZGVkIHJlbmRlci5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShlcnJvcmVkV29yaywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcblxuICAgICAgICBpZiAodGhyb3duVmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHRocm93blZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGhyb3duVmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciB3YWtlYWJsZSA9IHRocm93blZhbHVlO1xuICAgICAgICAgIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZXJyb3JlZFdvcmssIHdha2VhYmxlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya0NvbXBvbmVudEVycm9yZWQoZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgZXJyb3JlZFdvcmsucmV0dXJuLCBlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIGNvbXBsZXRlVW5pdE9mV29yayhlcnJvcmVkV29yayk7XG4gICAgfSBjYXRjaCAoeWV0QW5vdGhlclRocm93blZhbHVlKSB7XG4gICAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHJldHVybiBwYXRoIGFsc28gdGhyZXcuXG4gICAgICB0aHJvd25WYWx1ZSA9IHlldEFub3RoZXJUaHJvd25WYWx1ZTtcblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSBlcnJvcmVkV29yayAmJiBlcnJvcmVkV29yayAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGhhcyBhbHJlYWR5IGVycm9yZWQsIHRoZW4gd2UgaGFkIHRyb3VibGUgcHJvY2Vzc2luZ1xuICAgICAgICAvLyB0aGUgZXJyb3IuIEJ1YmJsZSBpdCB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgICAgICAgZXJyb3JlZFdvcmsgPSBlcnJvcmVkV29yay5yZXR1cm47XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gZXJyb3JlZFdvcms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIFJldHVybiB0byB0aGUgbm9ybWFsIHdvcmsgbG9vcC5cblxuXG4gICAgcmV0dXJuO1xuICB9IHdoaWxlICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gcHVzaERpc3BhdGNoZXIoKSB7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50O1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAocHJldkRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAvLyBUaGUgUmVhY3QgaXNvbW9ycGhpYyBwYWNrYWdlIGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGRpc3BhdGNoZXIuXG4gICAgLy8gSW5zdGVhZCB0aGUgZmlyc3QgcmVuZGVyZXIgd2lsbCBsYXppbHkgYXR0YWNoIG9uZSwgaW4gb3JkZXIgdG8gZ2l2ZVxuICAgIC8vIG5pY2VyIGVycm9yIG1lc3NhZ2VzLlxuICAgIHJldHVybiBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZEaXNwYXRjaGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpIHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCkge1xuICBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gbm93KCk7XG59XG5mdW5jdGlvbiBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGxhbmUpIHtcbiAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gbWVyZ2VMYW5lcyhsYW5lLCB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMpO1xufVxuZnVuY3Rpb24gcmVuZGVyRGlkU3VzcGVuZCgpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcyB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkIHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHVwZGF0ZXMgdGhhdCB3ZSBza2lwcGVkIHRyZWUgdGhhdCBtaWdodCBoYXZlIHVuYmxvY2tlZFxuICAvLyB0aGlzIHJlbmRlci5cblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwgJiYgKGluY2x1ZGVzTm9uSWRsZVdvcmsod29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKSB8fCBpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzKSkpIHtcbiAgICAvLyBNYXJrIHRoZSBjdXJyZW50IHJlbmRlciBhcyBzdXNwZW5kZWQgc28gdGhhdCB3ZSBzd2l0Y2ggdG8gd29ya2luZyBvblxuICAgIC8vIHRoZSB1cGRhdGVzIHRoYXQgd2VyZSBza2lwcGVkLiBVc3VhbGx5IHdlIG9ubHkgc3VzcGVuZCBhdCB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIHJlbmRlciBwaGFzZS5cbiAgICAvLyBUT0RPOiBXZSBzaG91bGQgcHJvYmFibHkgYWx3YXlzIG1hcmsgdGhlIHJvb3QgYXMgc3VzcGVuZGVkIGltbWVkaWF0ZWx5XG4gICAgLy8gKGluc2lkZSB0aGlzIGZ1bmN0aW9uKSwgc2luY2UgYnkgc3VzcGVuZGluZyBhdCB0aGUgZW5kIG9mIHRoZSByZW5kZXJcbiAgICAvLyBwaGFzZSBpbnRyb2R1Y2VzIGEgcG90ZW50aWFsIG1pc3Rha2Ugd2hlcmUgd2Ugc3VzcGVuZCBsYW5lcyB0aGF0IHdlcmVcbiAgICAvLyBwaW5nZWQgb3IgdXBkYXRlZCB3aGlsZSB3ZSB3ZXJlIHJlbmRlcmluZy5cbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHdvcmtJblByb2dyZXNzUm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRFcnJvcihlcnJvcikge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RXJyb3JlZDtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IFtlcnJvcl07XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxufSAvLyBDYWxsZWQgZHVyaW5nIHJlbmRlciB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcgaGFzIHN1c3BlbmRlZC5cbi8vIFJldHVybnMgZmFsc2UgaWYgd2UncmUgbm90IHN1cmUuXG5cbmZ1bmN0aW9uIHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgb3IgY29tcGxldGVkLCB3ZSBjYW4ndCByZWFsbHkgYmUgc3VyZSxcbiAgLy8gc28gdGhvc2UgYXJlIGZhbHNlLlxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgICAgIH0gLy8gQXQgdGhpcyBwb2ludCwgbW92ZSBGaWJlcnMgdGhhdCBzY2hlZHVsZWQgdGhlIHVwY29taW5nIHdvcmsgZnJvbSB0aGUgTWFwIHRvIHRoZSBTZXQuXG4gICAgICAgIC8vIElmIHdlIGJhaWxvdXQgb24gdGhpcyB3b3JrLCB3ZSdsbCBtb3ZlIHRoZW0gYmFjayAobGlrZSBhYm92ZSkuXG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIG1vdmUgdGhlbSBub3cgaW4gY2FzZSB0aGUgd29yayBzcGF3bnMgbW9yZSB3b3JrIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGggZGlmZmVyZW50IHVwZGF0ZXJzLlxuICAgICAgICAvLyBUaGF0IHdheSB3ZSBjYW4ga2VlcCB0aGUgY3VycmVudCB1cGRhdGUgYW5kIGZ1dHVyZSB1cGRhdGVzIHNlcGFyYXRlLlxuXG5cbiAgICAgICAgbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcygpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wU3luYygpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSBzeW5jIHJlbmRlciwgc28gd2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgdGhlIHdob2xlIHRyZWUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IGFuIGluY29tcGxldGUgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgJyArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gU2V0IHRoaXMgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGVyZSdzIG5vIGluLXByb2dyZXNzIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG59IC8vIFRoZSB3b3JrIGxvb3AgaXMgYW4gZXh0cmVtZWx5IGhvdCBwYXRoLiBUZWxsIENsb3N1cmUgbm90IHRvIGlubGluZSBpdC5cblxuLyoqIEBub2lubGluZSAqL1xuXG5cbmZ1bmN0aW9uIHdvcmtMb29wU3luYygpIHtcbiAgLy8gQWxyZWFkeSB0aW1lZCBvdXQsIHNvIHBlcmZvcm0gd29yayB3aXRob3V0IGNoZWNraW5nIGlmIHdlIG5lZWQgdG8geWllbGQuXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIHBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGRvIHtcbiAgICB0cnkge1xuICAgICAgd29ya0xvb3BDb25jdXJyZW50KCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoICh0aHJvd25WYWx1ZSkge1xuICAgICAgaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpO1xuICAgIH1cbiAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBTdGlsbCB3b3JrIHJlbWFpbmluZy5cbiAgICB7XG4gICAgICBtYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBSb290SW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICAvLyBDb21wbGV0ZWQgdGhlIHRyZWUuXG4gICAge1xuICAgICAgbWFya1JlbmRlclN0b3BwZWQoKTtcbiAgICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBSZXR1cm4gdGhlIGZpbmFsIGV4aXQgc3RhdHVzLlxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG4gIH1cbn1cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcENvbmN1cnJlbnQoKSB7XG4gIC8vIFBlcmZvcm0gd29yayB1bnRpbCBTY2hlZHVsZXIgYXNrcyB1cyB0byB5aWVsZFxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwgJiYgIXNob3VsZFlpZWxkKCkpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gIC8vIG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZSBtZWFucyB0aGF0IHdlIGRvbid0XG4gIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgdmFyIGN1cnJlbnQgPSB1bml0T2ZXb3JrLmFsdGVybmF0ZTtcbiAgc2V0Q3VycmVudEZpYmVyKHVuaXRPZldvcmspO1xuICB2YXIgbmV4dDtcblxuICBpZiAoICh1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKHVuaXRPZldvcmssIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIG5leHQgPSBiZWdpbldvcmskMShjdXJyZW50LCB1bml0T2ZXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgdW5pdE9mV29yay5tZW1vaXplZFByb3BzID0gdW5pdE9mV29yay5wZW5kaW5nUHJvcHM7XG5cbiAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGRvZXNuJ3Qgc3Bhd24gbmV3IHdvcmssIGNvbXBsZXRlIHRoZSBjdXJyZW50IHdvcmsuXG4gICAgY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgfVxuXG4gIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKSB7XG4gIC8vIEF0dGVtcHQgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQgdW5pdCBvZiB3b3JrLCB0aGVuIG1vdmUgdG8gdGhlIG5leHRcbiAgLy8gc2libGluZy4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgc2libGluZ3MsIHJldHVybiB0byB0aGUgcGFyZW50IGZpYmVyLlxuICB2YXIgY29tcGxldGVkV29yayA9IHVuaXRPZldvcms7XG5cbiAgZG8ge1xuICAgIC8vIFRoZSBjdXJyZW50LCBmbHVzaGVkLCBzdGF0ZSBvZiB0aGlzIGZpYmVyIGlzIHRoZSBhbHRlcm5hdGUuIElkZWFsbHlcbiAgICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAgIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgICB2YXIgY3VycmVudCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgIHZhciByZXR1cm5GaWJlciA9IGNvbXBsZXRlZFdvcmsucmV0dXJuOyAvLyBDaGVjayBpZiB0aGUgd29yayBjb21wbGV0ZWQgb3IgaWYgc29tZXRoaW5nIHRocmV3LlxuXG4gICAgaWYgKChjb21wbGV0ZWRXb3JrLmZsYWdzICYgSW5jb21wbGV0ZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihjb21wbGV0ZWRXb3JrKTtcbiAgICAgIHZhciBuZXh0ID0gdm9pZCAwO1xuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIoY29tcGxldGVkV29yayk7XG4gICAgICAgIG5leHQgPSBjb21wbGV0ZVdvcmsoY3VycmVudCwgY29tcGxldGVkV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTsgLy8gVXBkYXRlIHJlbmRlciBkdXJhdGlvbiBhc3N1bWluZyB3ZSBkaWRuJ3QgZXJyb3IuXG5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENvbXBsZXRpbmcgdGhpcyBmaWJlciBzcGF3bmVkIG5ldyB3b3JrLiBXb3JrIG9uIHRoYXQgbmV4dC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBuZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIHNvbWV0aGluZyB0aHJldy4gUG9wIHZhbHVlcyBvZmZcbiAgICAgIC8vIHRoZSBzdGFjayB3aXRob3V0IGVudGVyaW5nIHRoZSBjb21wbGV0ZSBwaGFzZS4gSWYgdGhpcyBpcyBhIGJvdW5kYXJ5LFxuICAgICAgLy8gY2FwdHVyZSB2YWx1ZXMgaWYgcG9zc2libGUuXG4gICAgICB2YXIgX25leHQgPSB1bndpbmRXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmspOyAvLyBCZWNhdXNlIHRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSwgZG9uJ3QgcmVzZXQgaXRzIGxhbmVzLlxuXG5cbiAgICAgIGlmIChfbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiBjb21wbGV0aW5nIHRoaXMgd29yayBzcGF3bmVkIG5ldyB3b3JrLCBkbyB0aGF0IG5leHQuIFdlJ2xsIGNvbWVcbiAgICAgICAgLy8gYmFjayBoZXJlIGFnYWluLlxuICAgICAgICAvLyBTaW5jZSB3ZSdyZSByZXN0YXJ0aW5nLCByZW1vdmUgYW55dGhpbmcgdGhhdCBpcyBub3QgYSBob3N0IGVmZmVjdFxuICAgICAgICAvLyBmcm9tIHRoZSBlZmZlY3QgdGFnLlxuICAgICAgICBfbmV4dC5mbGFncyAmPSBIb3N0RWZmZWN0TWFzaztcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBfbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHJlbmRlciBkdXJhdGlvbiBmb3IgdGhlIGZpYmVyIHRoYXQgZXJyb3JlZC5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7IC8vIEluY2x1ZGUgdGhlIHRpbWUgc3BlbnQgd29ya2luZyBvbiBmYWlsZWQgY2hpbGRyZW4gYmVmb3JlIGNvbnRpbnVpbmcuXG5cbiAgICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAvLyBNYXJrIHRoZSBwYXJlbnQgZmliZXIgYXMgaW5jb21wbGV0ZSBhbmQgY2xlYXIgaXRzIHN1YnRyZWUgZmxhZ3MuXG4gICAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG4gICAgICAgIHJldHVybkZpYmVyLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSd2ZSB1bndvdW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdERpZE5vdENvbXBsZXRlO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2libGluZ0ZpYmVyID0gY29tcGxldGVkV29yay5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmdGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGRvIGluIHRoaXMgcmV0dXJuRmliZXIsIGRvIHRoYXQgbmV4dC5cbiAgICAgIHdvcmtJblByb2dyZXNzID0gc2libGluZ0ZpYmVyO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gT3RoZXJ3aXNlLCByZXR1cm4gdG8gdGhlIHBhcmVudFxuXG5cbiAgICBjb21wbGV0ZWRXb3JrID0gcmV0dXJuRmliZXI7IC8vIFVwZGF0ZSB0aGUgbmV4dCB0aGluZyB3ZSdyZSB3b3JraW5nIG9uIGluIGNhc2Ugc29tZXRoaW5nIHRocm93cy5cblxuICAgIHdvcmtJblByb2dyZXNzID0gY29tcGxldGVkV29yaztcbiAgfSB3aGlsZSAoY29tcGxldGVkV29yayAhPT0gbnVsbCk7IC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIHJvb3QuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdENvbXBsZXRlZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRSb290KHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucykge1xuICAvLyBUT0RPOiBUaGlzIG5vIGxvbmdlciBtYWtlcyBhbnkgc2Vuc2UuIFdlIGFscmVhZHkgd3JhcCB0aGUgbXV0YXRpb24gYW5kXG4gIC8vIGxheW91dCBwaGFzZXMuIFNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZS5cbiAgdmFyIHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRSb290SW1wbChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgZG8ge1xuICAgIC8vIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIGNhbGwgYGZsdXNoU3luY1VwZGF0ZVF1ZXVlYCBhdCB0aGUgZW5kLCB3aGljaFxuICAgIC8vIG1lYW5zIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIHNvbWV0aW1lcyByZXN1bHQgaW4gYWRkaXRpb25hbFxuICAgIC8vIHBhc3NpdmUgZWZmZWN0cy4gU28gd2UgbmVlZCB0byBrZWVwIGZsdXNoaW5nIGluIGEgbG9vcCB1bnRpbCB0aGVyZSBhcmVcbiAgICAvLyBubyBtb3JlIHBlbmRpbmcgZWZmZWN0cy5cbiAgICAvLyBUT0RPOiBNaWdodCBiZSBiZXR0ZXIgaWYgYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIGRpZCBub3QgYXV0b21hdGljYWxseVxuICAgIC8vIGZsdXNoIHN5bmNocm9ub3VzIHdvcmsgYXQgdGhlIGVuZCwgdG8gYXZvaWQgZmFjdG9yaW5nIGhhemFyZHMgbGlrZSB0aGlzLlxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSB3aGlsZSAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpO1xuXG4gIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9XG5cbiAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuZmluaXNoZWRXb3JrO1xuICB2YXIgbGFuZXMgPSByb290LmZpbmlzaGVkTGFuZXM7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IG51bGwpIHtcblxuICAgIHtcbiAgICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgICAgIGVycm9yKCdyb290LmZpbmlzaGVkTGFuZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSBkdXJpbmcgYSBjb21taXQuIFRoaXMgaXMgYSAnICsgJ2J1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKGZpbmlzaGVkV29yayA9PT0gcm9vdC5jdXJyZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IHRoZSBzYW1lIHRyZWUgYXMgYmVmb3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH0gLy8gY29tbWl0Um9vdCBuZXZlciByZXR1cm5zIGEgY29udGludWF0aW9uOyBpdCBhbHdheXMgZmluaXNoZXMgc3luY2hyb25vdXNseS5cbiAgLy8gU28gd2UgY2FuIGNsZWFyIHRoZXNlIG5vdyB0byBhbGxvdyBhIG5ldyBjYWxsYmFjayB0byBiZSBzY2hlZHVsZWQuXG5cblxuICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTsgLy8gVXBkYXRlIHRoZSBmaXJzdCBhbmQgbGFzdCBwZW5kaW5nIHRpbWVzIG9uIHRoaXMgcm9vdC4gVGhlIG5ldyBmaXJzdFxuICAvLyBwZW5kaW5nIHRpbWUgaXMgd2hhdGV2ZXIgaXMgbGVmdCBvbiB0aGUgcm9vdCBmaWJlci5cblxuICB2YXIgcmVtYWluaW5nTGFuZXMgPSBtZXJnZUxhbmVzKGZpbmlzaGVkV29yay5sYW5lcywgZmluaXNoZWRXb3JrLmNoaWxkTGFuZXMpO1xuICBtYXJrUm9vdEZpbmlzaGVkKHJvb3QsIHJlbWFpbmluZ0xhbmVzKTtcblxuICBpZiAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgLy8gV2UgY2FuIHJlc2V0IHRoZXNlIG5vdyB0aGF0IHRoZXkgYXJlIGZpbmlzaGVkLlxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgfSAvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMsIHNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gcHJvY2VzcyB0aGVtLlxuICAvLyBEbyB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCBzbyBpdCBpcyBxdWV1ZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgdGhhdFxuICAvLyBtaWdodCBnZXQgc2NoZWR1bGVkIGluIHRoZSBjb21taXQgcGhhc2UuIChTZWUgIzE2NzE0LilcbiAgLy8gVE9ETzogRGVsZXRlIGFsbCBvdGhlciBwbGFjZXMgdGhhdCBzY2hlZHVsZSB0aGUgcGFzc2l2ZSBlZmZlY3QgY2FsbGJhY2tcbiAgLy8gVGhleSdyZSByZWR1bmRhbnQuXG5cblxuICBpZiAoKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgfHwgKGZpbmlzaGVkV29yay5mbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncykge1xuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIC8vIHRvIHN0b3JlIGl0IGluIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgdW50aWwgdGhleSBnZXQgcHJvY2Vzc2VkXG4gICAgICAvLyBXZSBuZWVkIHRvIHBhc3MgdGhpcyB0aHJvdWdoIGFzIGFuIGFyZ3VtZW50IHRvIGNvbW1pdFJvb3RcbiAgICAgIC8vIGJlY2F1c2Ugd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyBtaWdodCBoYXZlIGNoYW5nZWQgYmV0d2VlblxuICAgICAgLy8gdGhlIHByZXZpb3VzIHJlbmRlciBhbmQgY29tbWl0IGlmIHdlIHRocm90dGxlIHRoZSBjb21taXRcbiAgICAgIC8vIHdpdGggc2V0VGltZW91dFxuXG4gICAgICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpOyAvLyBUaGlzIHJlbmRlciB0cmlnZ2VyZWQgcGFzc2l2ZSBlZmZlY3RzOiByZWxlYXNlIHRoZSByb290IGNhY2hlIHBvb2xcbiAgICAgICAgLy8gKmFmdGVyKiBwYXNzaXZlIGVmZmVjdHMgZmlyZSB0byBhdm9pZCBmcmVlaW5nIGEgY2FjaGUgcG9vbCB0aGF0IG1heVxuICAgICAgICAvLyBiZSByZWZlcmVuY2VkIGJ5IGEgbm9kZSBpbiB0aGUgdHJlZSAoSG9zdFJvb3QsIENhY2hlIGJvdW5kYXJ5IGV0YylcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGVmZmVjdHMgaW4gdGhlIHdob2xlIHRyZWUuXG4gIC8vIFRPRE86IFRoaXMgaXMgbGVmdCBvdmVyIGZyb20gdGhlIGVmZmVjdCBsaXN0IGltcGxlbWVudGF0aW9uLCB3aGVyZSB3ZSBoYWRcbiAgLy8gdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYGZpcnN0RWZmZWN0YCB0byBzYXRpc2Z5IEZsb3cuIEkgdGhpbmsgdGhlXG4gIC8vIG9ubHkgb3RoZXIgcmVhc29uIHRoaXMgb3B0aW1pemF0aW9uIGV4aXN0cyBpcyBiZWNhdXNlIGl0IGFmZmVjdHMgcHJvZmlsaW5nLlxuICAvLyBSZWNvbnNpZGVyIHdoZXRoZXIgdGhpcyBpcyBuZWNlc3NhcnkuXG5cblxuICB2YXIgc3VidHJlZUhhc0VmZmVjdHMgPSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcbiAgdmFyIHJvb3RIYXNFZmZlY3QgPSAoZmluaXNoZWRXb3JrLmZsYWdzICYgKEJlZm9yZU11dGF0aW9uTWFzayB8IE11dGF0aW9uTWFzayB8IExheW91dE1hc2sgfCBQYXNzaXZlTWFzaykpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChzdWJ0cmVlSGFzRWZmZWN0cyB8fCByb290SGFzRWZmZWN0KSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDsgLy8gUmVzZXQgdGhpcyB0byBudWxsIGJlZm9yZSBjYWxsaW5nIGxpZmVjeWNsZXNcblxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7IC8vIFRoZSBjb21taXQgcGhhc2UgaXMgYnJva2VuIGludG8gc2V2ZXJhbCBzdWItcGhhc2VzLiBXZSBkbyBhIHNlcGFyYXRlIHBhc3NcbiAgICAvLyBvZiB0aGUgZWZmZWN0IGxpc3QgZm9yIGVhY2ggcGhhc2U6IGFsbCBtdXRhdGlvbiBlZmZlY3RzIGNvbWUgYmVmb3JlIGFsbFxuICAgIC8vIGxheW91dCBlZmZlY3RzLCBhbmQgc28gb24uXG4gICAgLy8gVGhlIGZpcnN0IHBoYXNlIGEgXCJiZWZvcmUgbXV0YXRpb25cIiBwaGFzZS4gV2UgdXNlIHRoaXMgcGhhc2UgdG8gcmVhZCB0aGVcbiAgICAvLyBzdGF0ZSBvZiB0aGUgaG9zdCB0cmVlIHJpZ2h0IGJlZm9yZSB3ZSBtdXRhdGUgaXQuIFRoaXMgaXMgd2hlcmVcbiAgICAvLyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSBpcyBjYWxsZWQuXG5cbiAgICB2YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG5cbiAgICB7XG4gICAgICAvLyBNYXJrIHRoZSBjdXJyZW50IGNvbW1pdCB0aW1lIHRvIGJlIHNoYXJlZCBieSBhbGwgUHJvZmlsZXJzIGluIHRoaXNcbiAgICAgIC8vIGJhdGNoLiBUaGlzIGVuYWJsZXMgdGhlbSB0byBiZSBncm91cGVkIGxhdGVyLlxuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cblxuXG4gICAgY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuXG4gICAgcmVzZXRBZnRlckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAgIC8vIHRoZSBtdXRhdGlvbiBwaGFzZSwgc28gdGhhdCB0aGUgcHJldmlvdXMgdHJlZSBpcyBzdGlsbCBjdXJyZW50IGR1cmluZ1xuICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBsYXlvdXQgcGhhc2UsIHNvIHRoYXQgdGhlIGZpbmlzaGVkXG4gICAgLy8gd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIFRoZSBuZXh0IHBoYXNlIGlzIHRoZSBsYXlvdXQgcGhhc2UsIHdoZXJlIHdlIGNhbGwgZWZmZWN0cyB0aGF0IHJlYWRcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuXG4gICAgY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKTtcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgICAvLyBvcHBvcnR1bml0eSB0byBwYWludC5cblxuXG4gICAgcmVxdWVzdFBhaW50KCk7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBSZXNldCB0aGUgcHJpb3JpdHkgdG8gdGhlIHByZXZpb3VzIG5vbi1zeW5jIHZhbHVlLlxuXG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9IGVsc2Uge1xuICAgIC8vIE5vIGVmZmVjdHMuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBNZWFzdXJlIHRoZXNlIGFueXdheSBzbyB0aGUgZmxhbWVncmFwaCBleHBsaWNpdGx5IHNob3dzIHRoYXQgdGhlcmUgd2VyZVxuICAgIC8vIG5vIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gcmVwb3J0IHRoaXMuXG5cbiAgICB7XG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMgPSByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cztcblxuICBpZiAocm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBUaGlzIGNvbW1pdCBoYXMgcGFzc2l2ZSBlZmZlY3RzLiBTdGFzaCBhIHJlZmVyZW5jZSB0byB0aGVtLiBCdXQgZG9uJ3RcbiAgICAvLyBzY2hlZHVsZSBhIGNhbGxiYWNrIHVudGlsIGFmdGVyIGZsdXNoaW5nIGxheW91dCB3b3JrLlxuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSByb290O1xuICAgIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gbGFuZXM7XG4gIH0gZWxzZSB7XG5cbiAgICB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYW4gZWZmZWN0IG1pZ2h0IGhhdmUgdXBkYXRlZCBpdFxuXG5cbiAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lczsgLy8gQ2hlY2sgaWYgdGhlcmUncyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3RcbiAgLy8gVE9ETzogVGhpcyBpcyBwYXJ0IG9mIHRoZSBgY29tcG9uZW50RGlkQ2F0Y2hgIGltcGxlbWVudGF0aW9uLiBJdHMgcHVycG9zZVxuICAvLyBpcyB0byBkZXRlY3Qgd2hldGhlciBzb21ldGhpbmcgbWlnaHQgaGF2ZSBjYWxsZWQgc2V0U3RhdGUgaW5zaWRlXG4gIC8vIGBjb21wb25lbnREaWRDYXRjaGAuIFRoZSBtZWNoYW5pc20gaXMga25vd24gdG8gYmUgZmxhd2VkIGJlY2F1c2UgYHNldFN0YXRlYFxuICAvLyBpbnNpZGUgYGNvbXBvbmVudERpZENhdGNoYCBpcyBpdHNlbGYgZmxhd2VkIOKAlCB0aGF0J3Mgd2h5IHdlIHJlY29tbWVuZFxuICAvLyBgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yYCBpbnN0ZWFkLiBIb3dldmVyLCBpdCBjb3VsZCBiZSBpbXByb3ZlZCBieVxuICAvLyBjaGVja2luZyBpZiByZW1haW5pbmdMYW5lcyBpbmNsdWRlcyBTeW5jIHdvcmssIGluc3RlYWQgb2Ygd2hldGhlciB0aGVyZSdzXG4gIC8vIGFueSB3b3JrIHJlbWFpbmluZyBhdCBhbGwgKHdoaWNoIHdvdWxkIGFsc28gaW5jbHVkZSBzdHVmZiBsaWtlIFN1c3BlbnNlXG4gIC8vIHJldHJpZXMgb3IgdHJhbnNpdGlvbnMpLiBJdCdzIGJlZW4gbGlrZSB0aGlzIGZvciBhIHdoaWxlLCB0aG91Z2gsIHNvIGZpeGluZ1xuICAvLyBpdCBwcm9iYWJseSBpc24ndCB0aGF0IHVyZ2VudC5cblxuICBpZiAocmVtYWluaW5nTGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLCB3ZSBjYW4gY2xlYXIgdGhlIHNldCBvZiBhbHJlYWR5IGZhaWxlZFxuICAgIC8vIGVycm9yIGJvdW5kYXJpZXMuXG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICghcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKHJvb3QuY3VycmVudCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29tbWl0Um9vdChmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLCByZW5kZXJQcmlvcml0eUxldmVsKTtcblxuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICByb290Lm1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgb25Db21taXRSb290JDEoKTtcbiAgfSAvLyBBbHdheXMgY2FsbCB0aGlzIGJlZm9yZSBleGl0aW5nIGBjb21taXRSb290YCwgdG8gZW5zdXJlIHRoYXQgYW55XG4gIC8vIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QgaXMgc2NoZWR1bGVkLlxuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocmVjb3ZlcmFibGVFcnJvcnMgIT09IG51bGwpIHtcbiAgICAvLyBUaGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCByZWNvdmVyZWQgZnJvbSB0aGVtIHdpdGhvdXRcbiAgICAvLyBuZWVkaW5nIHRvIHN1cmZhY2UgaXQgdG8gdGhlIFVJLiBXZSBsb2cgdGhlbSBoZXJlLlxuICAgIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSByb290Lm9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb3ZlcmFibGVFcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gcmVjb3ZlcmFibGVFcnJvcnNbaV07XG4gICAgICB2YXIgY29tcG9uZW50U3RhY2sgPSByZWNvdmVyYWJsZUVycm9yLnN0YWNrO1xuICAgICAgdmFyIGRpZ2VzdCA9IHJlY292ZXJhYmxlRXJyb3IuZGlnZXN0O1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yKHJlY292ZXJhYmxlRXJyb3IudmFsdWUsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IGNvbXBvbmVudFN0YWNrLFxuICAgICAgICBkaWdlc3Q6IGRpZ2VzdFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG4gICAgdmFyIGVycm9yJDEgPSBmaXJzdFVuY2F1Z2h0RXJyb3I7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvciQxO1xuICB9IC8vIElmIHRoZSBwYXNzaXZlIGVmZmVjdHMgYXJlIHRoZSByZXN1bHQgb2YgYSBkaXNjcmV0ZSByZW5kZXIsIGZsdXNoIHRoZW1cbiAgLy8gc3luY2hyb25vdXNseSBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHRhc2sgc28gdGhhdCB0aGUgcmVzdWx0IGlzXG4gIC8vIGltbWVkaWF0ZWx5IG9ic2VydmFibGUuIE90aGVyd2lzZSwgd2UgYXNzdW1lIHRoYXQgdGhleSBhcmUgbm90XG4gIC8vIG9yZGVyLWRlcGVuZGVudCBhbmQgZG8gbm90IG5lZWQgdG8gYmUgb2JzZXJ2ZWQgYnkgZXh0ZXJuYWwgc3lzdGVtcywgc28gd2VcbiAgLy8gY2FuIHdhaXQgdW50aWwgYWZ0ZXIgcGFpbnQuXG4gIC8vIFRPRE86IFdlIGNhbiBvcHRpbWl6ZSB0aGlzIGJ5IG5vdCBzY2hlZHVsaW5nIHRoZSBjYWxsYmFjayBlYXJsaWVyLiBTaW5jZSB3ZVxuICAvLyBjdXJyZW50bHkgc2NoZWR1bGUgdGhlIGNhbGxiYWNrIGluIG11bHRpcGxlIHBsYWNlcywgd2lsbCB3YWl0IHVudGlsIHRob3NlXG4gIC8vIGFyZSBjb25zb2xpZGF0ZWQuXG5cblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcywgU3luY0xhbmUpICYmIHJvb3QudGFnICE9PSBMZWdhY3lSb290KSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYSBwYXNzaXZlIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVtYWluaW5nTGFuZXMsIFN5bmNMYW5lKSkge1xuICAgIHtcbiAgICAgIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKTtcbiAgICB9IC8vIENvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHJvb3Qgc3luY2hyb25vdXNseSByZS1yZW5kZXJzIHdpdGhvdXRcbiAgICAvLyBmaW5pc2hpbmcuIElmIHRoZXJlIGFyZSB0b28gbWFueSwgaXQgaW5kaWNhdGVzIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wLlxuXG5cbiAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gIH0gLy8gSWYgbGF5b3V0IHdvcmsgd2FzIHNjaGVkdWxlZCwgZmx1c2ggaXQgbm93LlxuXG5cbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0cygpIHtcbiAgLy8gUmV0dXJucyB3aGV0aGVyIHBhc3NpdmUgZWZmZWN0cyB3ZXJlIGZsdXNoZWQuXG4gIC8vIFRPRE86IENvbWJpbmUgdGhpcyBjaGVjayB3aXRoIHRoZSBvbmUgaW4gZmx1c2hQYXNzaXZlRUZmZWN0c0ltcGwuIFdlIHNob3VsZFxuICAvLyBwcm9iYWJseSBqdXN0IGNvbWJpbmUgdGhlIHR3byBmdW5jdGlvbnMuIEkgYmVsaWV2ZSB0aGV5IHdlcmUgb25seSBzZXBhcmF0ZVxuICAvLyBpbiB0aGUgZmlyc3QgcGxhY2UgYmVjYXVzZSB3ZSB1c2VkIHRvIHdyYXAgaXQgd2l0aFxuICAvLyBgU2NoZWR1bGVyLnJ1bldpdGhQcmlvcml0eWAsIHdoaWNoIGFjY2VwdHMgYSBmdW5jdGlvbi4gQnV0IG5vdyB3ZSB0cmFjayB0aGVcbiAgLy8gcHJpb3JpdHkgd2l0aGluIFJlYWN0IGl0c2VsZiwgc28gd2UgY2FuIG11dGF0ZSB0aGUgdmFyaWFibGUgZGlyZWN0bHkuXG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIHZhciByZW5kZXJQcmlvcml0eSA9IGxhbmVzVG9FdmVudFByaW9yaXR5KHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzKTtcbiAgICB2YXIgcHJpb3JpdHkgPSBsb3dlckV2ZW50UHJpb3JpdHkoRGVmYXVsdEV2ZW50UHJpb3JpdHksIHJlbmRlclByaW9yaXR5KTtcbiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByaW9yaXR5KTtcbiAgICAgIHJldHVybiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsgLy8gT25jZSBwYXNzaXZlIGVmZmVjdHMgaGF2ZSBydW4gZm9yIHRoZSB0cmVlIC0gZ2l2aW5nIGNvbXBvbmVudHMgYVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cy5wdXNoKGZpYmVyKTtcblxuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShOb3JtYWxQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCkge1xuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gQ2FjaGUgYW5kIGNsZWFyIHRoZSB0cmFuc2l0aW9ucyBmbGFnXG5cblxuICB2YXIgdHJhbnNpdGlvbnMgPSBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zO1xuICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDtcbiAgdmFyIHJvb3QgPSByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cztcbiAgdmFyIGxhbmVzID0gcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXM7XG4gIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDsgLy8gVE9ETzogVGhpcyBpcyBzb21ldGltZXMgb3V0IG9mIHN5bmMgd2l0aCByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy5cbiAgLy8gRmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4gSXQncyBub3QgY2F1c2luZyBhbnkga25vd24gaXNzdWVzIChwcm9iYWJseVxuICAvLyBiZWNhdXNlIGl0J3Mgb25seSB1c2VkIGZvciBwcm9maWxpbmcpLCBidXQgaXQncyBhIHJlZmFjdG9yIGhhemFyZC5cblxuICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZsdXNoIHBhc3NpdmUgZWZmZWN0cyB3aGlsZSBhbHJlYWR5IHJlbmRlcmluZy4nKTtcbiAgfVxuXG4gIHtcbiAgICBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDtcbiAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKHJvb3QuY3VycmVudCk7XG4gIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHMocm9vdCwgcm9vdC5jdXJyZW50LCBsYW5lcywgdHJhbnNpdGlvbnMpOyAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuICB7XG4gICAgdmFyIHByb2ZpbGVyRWZmZWN0cyA9IHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzO1xuICAgIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2ZpbGVyRWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIF9maWJlciA9IHByb2ZpbGVyRWZmZWN0c1tpXTtcbiAgICAgIGNvbW1pdFBhc3NpdmVFZmZlY3REdXJhdGlvbnMocm9vdCwgX2ZpYmVyKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpO1xuICB9XG5cbiAge1xuICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIHRydWUpO1xuICB9XG5cbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcblxuICB7XG4gICAgLy8gSWYgYWRkaXRpb25hbCBwYXNzaXZlIGVmZmVjdHMgd2VyZSBzY2hlZHVsZWQsIGluY3JlbWVudCBhIGNvdW50ZXIuIElmIHRoaXNcbiAgICAvLyBleGNlZWRzIHRoZSBsaW1pdCwgd2UnbGwgZmlyZSBhIHdhcm5pbmcuXG4gICAgaWYgKGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGlmIChyb290ID09PSByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IHJvb3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICB9IC8vIFRPRE86IE1vdmUgdG8gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c1xuXG5cbiAgb25Qb3N0Q29tbWl0Um9vdChyb290KTtcblxuICB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IHJvb3QuY3VycmVudC5zdGF0ZU5vZGU7XG4gICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIHJldHVybiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCAhPT0gbnVsbCAmJiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZChpbnN0YW5jZSkge1xuICBpZiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPT09IG51bGwpIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG5ldyBTZXQoW2luc3RhbmNlXSk7XG4gIH0gZWxzZSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IHRydWU7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn1cblxudmFyIG9uVW5jYXVnaHRFcnJvciA9IHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcjtcblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qocm9vdEZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpIHtcbiAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUocm9vdEZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3Ioc291cmNlRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yJDEpIHtcbiAge1xuICAgIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvciQxKTtcbiAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICB9XG5cbiAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBFcnJvciB3YXMgdGhyb3duIGF0IHRoZSByb290LiBUaGVyZSBpcyBubyBwYXJlbnQsIHNvIHRoZSByb290XG4gICAgLy8gaXRzZWxmIHNob3VsZCBjYXB0dXJlIGl0LlxuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHNvdXJjZUZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gbnVsbDtcblxuICB7XG4gICAgZmliZXIgPSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KGZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgY3RvciA9IGZpYmVyLnR5cGU7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICB2YXIgZXJyb3JJbmZvID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IkMSwgc291cmNlRmliZXIpO1xuICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gVE9ETzogVW50aWwgd2UgcmUtbGFuZCBza2lwVW5tb3VudGVkQm91bmRhcmllcyAoc2VlICMyMDE0NyksIHRoaXMgd2FybmluZ1xuICAgIC8vIHdpbGwgZmlyZSBmb3IgZXJyb3JzIHRoYXQgYXJlIHRocm93biBieSBkZXN0cm95IGZ1bmN0aW9ucyBpbnNpZGUgZGVsZXRlZFxuICAgIC8vIHRyZWVzLiBXaGF0IGl0IHNob3VsZCBpbnN0ZWFkIGRvIGlzIHByb3BhZ2F0ZSB0aGUgZXJyb3IgdG8gdGhlIHBhcmVudCBvZlxuICAgIC8vIHRoZSBkZWxldGVkIHRyZWUuIEluIHRoZSBtZWFudGltZSwgZG8gbm90IGFkZCB0aGlzIHdhcm5pbmcgdG8gdGhlXG4gICAgLy8gYWxsb3dsaXN0OyB0aGlzIGlzIG9ubHkgZm9yIG91ciBpbnRlcm5hbCB1c2UuXG4gICAgZXJyb3IoJ0ludGVybmFsIFJlYWN0IGVycm9yOiBBdHRlbXB0ZWQgdG8gY2FwdHVyZSBhIGNvbW1pdCBwaGFzZSBlcnJvciAnICsgJ2luc2lkZSBhIGRldGFjaGVkIHRyZWUuIFRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIFJlYWN0LiBMaWtlbHkgJyArICdjYXVzZXMgaW5jbHVkZSBkZWxldGluZyB0aGUgc2FtZSBmaWJlciBtb3JlIHRoYW4gb25jZSwgY29tbWl0dGluZyBhbiAnICsgJ2FscmVhZHktZmluaXNoZWQgdHJlZSwgb3IgYW4gaW5jb25zaXN0ZW50IHJldHVybiBwb2ludGVyLlxcblxcbicgKyAnRXJyb3IgbWVzc2FnZTpcXG5cXG4lcycsIGVycm9yJDEpO1xuICB9XG59XG5mdW5jdGlvbiBwaW5nU3VzcGVuZGVkUm9vdChyb290LCB3YWtlYWJsZSwgcGluZ2VkTGFuZXMpIHtcbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuXG4gIGlmIChwaW5nQ2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICBwaW5nQ2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzKTtcbiAgd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCk7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCA9PT0gcm9vdCAmJiBpc1N1YnNldE9mTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMsIHBpbmdlZExhbmVzKSkge1xuICAgIC8vIFJlY2VpdmVkIGEgcGluZyBhdCB0aGUgc2FtZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCB3ZSdyZSBjdXJyZW50bHlcbiAgICAvLyByZW5kZXJpbmcuIFdlIG1pZ2h0IHdhbnQgdG8gcmVzdGFydCB0aGlzIHJlbmRlci4gVGhpcyBzaG91bGQgbWlycm9yXG4gICAgLy8gdGhlIGxvZ2ljIG9mIHdoZXRoZXIgb3Igbm90IGEgcm9vdCBzdXNwZW5kcyBvbmNlIGl0IGNvbXBsZXRlcy5cbiAgICAvLyBUT0RPOiBJZiB3ZSdyZSByZW5kZXJpbmcgc3luYyBlaXRoZXIgZHVlIHRvIFN5bmMsIEJhdGNoZWQgb3IgZXhwaXJlZCxcbiAgICAvLyB3ZSBzaG91bGQgcHJvYmFibHkgbmV2ZXIgcmVzdGFydC5cbiAgICAvLyBJZiB3ZSdyZSBzdXNwZW5kZWQgd2l0aCBkZWxheSwgb3IgaWYgaXQncyBhIHJldHJ5LCB3ZSdsbCBhbHdheXMgc3VzcGVuZFxuICAgIC8vIHNvIHdlIGNhbiBhbHdheXMgcmVzdGFydC5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkICYmIGluY2x1ZGVzT25seVJldHJpZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpICYmIG5vdygpIC0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA8IEZBTExCQUNLX1RIUk9UVExFX01TKSB7XG4gICAgICAvLyBSZXN0YXJ0IGZyb20gdGhlIHJvb3QuXG4gICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRXZlbiB0aG91Z2ggd2UgY2FuJ3QgcmVzdGFydCByaWdodCBub3csIHdlIG1pZ2h0IGdldCBhblxuICAgICAgLy8gb3Bwb3J0dW5pdHkgbGF0ZXIuIFNvIHdlIG1hcmsgdGhpcyByZW5kZXIgYXMgaGF2aW5nIGEgcGluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcywgcGluZ2VkTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuXG5mdW5jdGlvbiByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKSB7XG4gIC8vIFRoZSBib3VuZGFyeSBmaWJlciAoYSBTdXNwZW5zZSBjb21wb25lbnQgb3IgU3VzcGVuc2VMaXN0IGNvbXBvbmVudClcbiAgLy8gcHJldmlvdXNseSB3YXMgcmVuZGVyZWQgaW4gaXRzIGZhbGxiYWNrIHN0YXRlLiBPbmUgb2YgdGhlIHByb21pc2VzIHRoYXRcbiAgLy8gc3VzcGVuZGVkIGl0IGhhcyByZXNvbHZlZCwgd2hpY2ggbWVhbnMgYXQgbGVhc3QgcGFydCBvZiB0aGUgdHJlZSB3YXNcbiAgLy8gbGlrZWx5IHVuYmxvY2tlZC4gVHJ5IHJlbmRlcmluZyBhZ2FpbiwgYXQgYSBuZXcgbGFuZXMuXG4gIGlmIChyZXRyeUxhbmUgPT09IE5vTGFuZSkge1xuICAgIC8vIFRPRE86IEFzc2lnbiB0aGlzIHRvIGBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZWA/IHRvIGF2b2lkXG4gICAgLy8gdW5uZWNlc3NhcnkgZW50YW5nbGVtZW50P1xuICAgIHJldHJ5TGFuZSA9IHJlcXVlc3RSZXRyeUxhbmUoYm91bmRhcnlGaWJlcik7XG4gIH0gLy8gVE9ETzogU3BlY2lhbCBjYXNlIGlkbGUgcHJpb3JpdHk/XG5cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHJldHJ5TGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVJldHJ5V2FrZWFibGUoYm91bmRhcnlGaWJlciwgd2FrZWFibGUpIHtcbiAgdmFyIHJldHJ5TGFuZSA9IE5vTGFuZTsgLy8gRGVmYXVsdFxuXG4gIHZhciByZXRyeUNhY2hlO1xuXG4gIHN3aXRjaCAoYm91bmRhcnlGaWJlci50YWcpIHtcbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaW5nZWQgdW5rbm93biBzdXNwZW5zZSBib3VuZGFyeSB0eXBlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH1cblxuICBpZiAocmV0cnlDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHJldHJ5Q2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufSAvLyBDb21wdXRlcyB0aGUgbmV4dCBKdXN0IE5vdGljZWFibGUgRGlmZmVyZW5jZSAoSk5EKSBib3VuZGFyeS5cbi8vIFRoZSB0aGVvcnkgaXMgdGhhdCBhIHBlcnNvbiBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc21hbGwgZGlmZmVyZW5jZXMgaW4gdGltZS5cbi8vIFRoZXJlZm9yZSwgaWYgd2Ugd2FpdCBhIGJpdCBsb25nZXIgdGhhbiBuZWNlc3NhcnkgdGhhdCB3b24ndCB0cmFuc2xhdGUgdG8gYSBub3RpY2VhYmxlXG4vLyBkaWZmZXJlbmNlIGluIHRoZSBleHBlcmllbmNlLiBIb3dldmVyLCB3YWl0aW5nIGZvciBsb25nZXIgbWlnaHQgbWVhbiB0aGF0IHdlIGNhbiBhdm9pZFxuLy8gc2hvd2luZyBhbiBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gVGhlIGxvbmdlciB3ZSBoYXZlIGFscmVhZHkgd2FpdGVkLCB0aGUgaGFyZGVyIGl0XG4vLyBpcyB0byB0ZWxsIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuIFRoZXJlZm9yZSwgdGhlIGxvbmdlciB3ZSd2ZSBhbHJlYWR5IHdhaXRlZCxcbi8vIHRoZSBsb25nZXIgd2UgY2FuIHdhaXQgYWRkaXRpb25hbGx5LiBBdCBzb21lIHBvaW50IHdlIGhhdmUgdG8gZ2l2ZSB1cCB0aG91Z2guXG4vLyBXZSBwaWNrIGEgdHJhaW4gbW9kZWwgd2hlcmUgdGhlIG5leHQgYm91bmRhcnkgY29tbWl0cyBhdCBhIGNvbnNpc3RlbnQgc2NoZWR1bGUuXG4vLyBUaGVzZSBwYXJ0aWN1bGFyIG51bWJlcnMgYXJlIHZhZ3VlIGVzdGltYXRlcy4gV2UgZXhwZWN0IHRvIGFkanVzdCB0aGVtIGJhc2VkIG9uIHJlc2VhcmNoLlxuXG5mdW5jdGlvbiBqbmQodGltZUVsYXBzZWQpIHtcbiAgcmV0dXJuIHRpbWVFbGFwc2VkIDwgMTIwID8gMTIwIDogdGltZUVsYXBzZWQgPCA0ODAgPyA0ODAgOiB0aW1lRWxhcHNlZCA8IDEwODAgPyAxMDgwIDogdGltZUVsYXBzZWQgPCAxOTIwID8gMTkyMCA6IHRpbWVFbGFwc2VkIDwgMzAwMCA/IDMwMDAgOiB0aW1lRWxhcHNlZCA8IDQzMjAgPyA0MzIwIDogY2VpbCh0aW1lRWxhcHNlZCAvIDE5NjApICogMTk2MDtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCkge1xuICBpZiAobmVzdGVkVXBkYXRlQ291bnQgPiBORVNURURfVVBEQVRFX0xJTUlUKSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArICdyZXBlYXRlZGx5IGNhbGxzIHNldFN0YXRlIGluc2lkZSBjb21wb25lbnRXaWxsVXBkYXRlIG9yICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgdXBkYXRlcyB0byAnICsgJ3ByZXZlbnQgaW5maW5pdGUgbG9vcHMuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAgICBlcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyBcImNhbGxzIHNldFN0YXRlIGluc2lkZSB1c2VFZmZlY3QsIGJ1dCB1c2VFZmZlY3QgZWl0aGVyIGRvZXNuJ3QgXCIgKyAnaGF2ZSBhIGRlcGVuZGVuY3kgYXJyYXksIG9yIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZXMgb24gJyArICdldmVyeSByZW5kZXIuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpIHtcbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihmaWJlciwgaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAge1xuICAgIC8vIFRPRE8gKFN0cmljdEVmZmVjdHMpIFNob3VsZCB3ZSBzZXQgYSBtYXJrZXIgb24gdGhlIHJvb3QgaWYgaXQgY29udGFpbnMgc3RyaWN0IGVmZmVjdHNcbiAgICAvLyBzbyB3ZSBkb24ndCB0cmF2ZXJzZSB1bm5lY2Vzc2FyaWx5PyBzaW1pbGFyIHRvIHN1YnRyZWVGbGFncyBidXQganVzdCBhdCB0aGUgcm9vdCBsZXZlbC5cbiAgICAvLyBNYXliZSBub3QgYSBiaWcgZGVhbCBzaW5jZSB0aGlzIGlzIERFViBvbmx5IGJlaGF2aW9yLlxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudExheW91dERldiwgaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYpO1xuXG4gICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50UGFzc2l2ZURldiwgaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlRWZmZWN0c0luRGV2KGZpcnN0Q2hpbGQsIGZpYmVyRmxhZ3MsIGludm9rZUVmZmVjdEZuKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICB2YXIgY3VycmVudCA9IGZpcnN0Q2hpbGQ7XG4gICAgdmFyIHN1YnRyZWVSb290ID0gbnVsbDtcblxuICAgIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJpbWFyeVN1YnRyZWVGbGFnID0gY3VycmVudC5zdWJ0cmVlRmxhZ3MgJiBmaWJlckZsYWdzO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gc3VidHJlZVJvb3QgJiYgY3VycmVudC5jaGlsZCAhPT0gbnVsbCAmJiBwcmltYXJ5U3VidHJlZUZsYWcgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBmaWJlckZsYWdzKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIGludm9rZUVmZmVjdEZuKGN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudCA9IHN1YnRyZWVSb290ID0gY3VycmVudC5yZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBudWxsO1xuZnVuY3Rpb24gd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gV2UgbGV0IHRoZSBvdGhlciB3YXJuaW5nIGFib3V0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGRlYWwgd2l0aCB0aGlzIG9uZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIShmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEluZGV0ZXJtaW5hdGVDb21wb25lbnQgJiYgdGFnICE9PSBIb3N0Um9vdCAmJiB0YWcgIT09IENsYXNzQ29tcG9uZW50ICYmIHRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgdGFnICE9PSBGb3J3YXJkUmVmICYmIHRhZyAhPT0gTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgIC8vIE9ubHkgd2FybiBmb3IgdXNlci1kZWZpbmVkIGNvbXBvbmVudHMsIG5vdCBpbnRlcm5hbCBvbmVzIGxpa2UgU3VzcGVuc2UuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBzaG93IHRoZSB3aG9sZSBzdGFjayBidXQgZGVkdXBlIG9uIHRoZSB0b3AgY29tcG9uZW50J3MgbmFtZSBiZWNhdXNlXG4gICAgLy8gdGhlIHByb2JsZW1hdGljIGNvZGUgYWxtb3N0IGFsd2F5cyBsaWVzIGluc2lkZSB0aGF0IGNvbXBvbmVudC5cblxuXG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnUmVhY3RDb21wb25lbnQnO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbmV3IFNldChbY29tcG9uZW50TmFtZV0pO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgIHRyeSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICBlcnJvcihcIkNhbid0IHBlcmZvcm0gYSBSZWFjdCBzdGF0ZSB1cGRhdGUgb24gYSBjb21wb25lbnQgdGhhdCBoYXNuJ3QgbW91bnRlZCB5ZXQuIFwiICsgJ1RoaXMgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgYSBzaWRlLWVmZmVjdCBpbiB5b3VyIHJlbmRlciBmdW5jdGlvbiB0aGF0ICcgKyAnYXN5bmNocm9ub3VzbHkgbGF0ZXIgY2FsbHMgdHJpZXMgdG8gdXBkYXRlIHRoZSBjb21wb25lbnQuIE1vdmUgdGhpcyB3b3JrIHRvICcgKyAndXNlRWZmZWN0IGluc3RlYWQuJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxudmFyIGJlZ2luV29yayQxO1xuXG57XG4gIHZhciBkdW1teUZpYmVyID0gbnVsbDtcblxuICBiZWdpbldvcmskMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcykge1xuICAgIC8vIElmIGEgY29tcG9uZW50IHRocm93cyBhbiBlcnJvciwgd2UgcmVwbGF5IGl0IGFnYWluIGluIGEgc3luY2hyb25vdXNseVxuICAgIC8vIGRpc3BhdGNoZWQgZXZlbnQsIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgdHJlYXQgaXQgYXMgYW4gdW5jYXVnaHRcbiAgICAvLyBlcnJvciBTZWUgUmVhY3RFcnJvclV0aWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNvcHkgdGhlIHdvcmstaW4tcHJvZ3Jlc3Mgb250byBhIGR1bW15XG4gICAgLy8gZmliZXIuIElmIGJlZ2luV29yayB0aHJvd3MsIHdlJ2xsIHVzZSB0aGlzIHRvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB2YXIgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihkdW1teUZpYmVyLCB1bml0T2ZXb3JrKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmVnaW5Xb3JrKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcbiAgICB9IGNhdGNoIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICBpZiAoZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHx8IG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IHByb21pc2VzLlxuICAgICAgICAvLyBEb24ndCByZXBsYXkgZXJyb3JzIGlmIHdlIGFyZSBoeWRyYXRpbmcgYW5kIGhhdmUgYWxyZWFkeSBzdXNwZW5kZWQgb3IgaGFuZGxlZCBhbiBlcnJvclxuICAgICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgICAgfSAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggaGFuZGxlRXJyb3I7IGFueSBjaGFuZ2VzIGhlcmUgbXVzdCBoYXZlXG4gICAgICAvLyBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdGhlcmUuXG5cblxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpOyAvLyBEb24ndCByZXNldCBjdXJyZW50IGRlYnVnIGZpYmVyLCBzaW5jZSB3ZSdyZSBhYm91dCB0byB3b3JrIG9uIHRoZVxuICAgICAgLy8gc2FtZSBmaWJlciBhZ2Fpbi5cbiAgICAgIC8vIFVud2luZCB0aGUgZmFpbGVkIHN0YWNrIGZyYW1lXG5cbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCB1bml0T2ZXb3JrKTsgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyBvZiB0aGUgZmliZXIuXG5cbiAgICAgIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHVuaXRPZldvcmssIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5KTtcblxuICAgICAgaWYgKCB1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIgdGltZXIuXG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIH0gLy8gUnVuIGJlZ2luV29yayBhZ2Fpbi5cblxuXG4gICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgYmVnaW5Xb3JrLCBudWxsLCBjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG5cbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIHZhciByZXBsYXlFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlcGxheUVycm9yID09PSAnb2JqZWN0JyAmJiByZXBsYXlFcnJvciAhPT0gbnVsbCAmJiByZXBsYXlFcnJvci5fc3VwcHJlc3NMb2dnaW5nICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yID09PSAnb2JqZWN0JyAmJiBvcmlnaW5hbEVycm9yICE9PSBudWxsICYmICFvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgICAvLyBJZiBzdXBwcmVzc2VkLCBsZXQgdGhlIGZsYWcgY2Fycnkgb3ZlciB0byB0aGUgb3JpZ2luYWwgZXJyb3Igd2hpY2ggaXMgdGhlIG9uZSB3ZSdsbCByZXRocm93LlxuICAgICAgICAgIG9yaWdpbmFsRXJyb3IuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gV2UgYWx3YXlzIHRocm93IHRoZSBvcmlnaW5hbCBlcnJvciBpbiBjYXNlIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MgaXMgbm90IGlkZW1wb3RlbnQuXG4gICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgYSBtZW1vaXplZCBmdW5jdGlvbiBvciBDb21tb25KUyBtb2R1bGUgZG9lc24ndCB0aHJvdyBhZnRlciBmaXJzdCBpbnZvY2F0aW9uLlxuXG5cbiAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmICFnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSkge1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUgPSB3b3JrSW5Qcm9ncmVzcyAmJiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnVW5rbm93bic7IC8vIERlZHVwZSBieSB0aGUgcmVuZGVyaW5nIGNvbXBvbmVudCBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLlxuXG4gICAgICAgICAgICB2YXIgZGVkdXBlS2V5ID0gcmVuZGVyaW5nQ29tcG9uZW50TmFtZTtcblxuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuaGFzKGRlZHVwZUtleSkpIHtcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChkZWR1cGVLZXkpO1xuICAgICAgICAgICAgICB2YXIgc2V0U3RhdGVDb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGEgY29tcG9uZW50IChgJXNgKSB3aGlsZSByZW5kZXJpbmcgYSAnICsgJ2RpZmZlcmVudCBjb21wb25lbnQgKGAlc2ApLiBUbyBsb2NhdGUgdGhlIGJhZCBzZXRTdGF0ZSgpIGNhbGwgaW5zaWRlIGAlc2AsICcgKyAnZm9sbG93IHRoZSBzdGFjayB0cmFjZSBhcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NldHN0YXRlLWluLXJlbmRlcicsIHNldFN0YXRlQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIpIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgZHVyaW5nIGFuIGV4aXN0aW5nIHN0YXRlIHRyYW5zaXRpb24gKHN1Y2ggYXMgJyArICd3aXRoaW4gYHJlbmRlcmApLiBSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlICcgKyAnZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLicpO1xuXG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuICAgICAgbWVtb2l6ZWRVcGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzY2hlZHVsaW5nRmliZXIpIHtcbiAgICAgICAgYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIHNjaGVkdWxpbmdGaWJlciwgbGFuZXMpO1xuICAgICAgfSk7IC8vIFRoaXMgZnVuY3Rpb24gaW50ZW50aW9uYWxseSBkb2VzIG5vdCBjbGVhciBtZW1vaXplZCB1cGRhdGVycy5cbiAgICAgIC8vIFRob3NlIG1heSBzdGlsbCBiZSByZWxldmFudCB0byB0aGUgY3VycmVudCBjb21taXRcbiAgICAgIC8vIGFuZCBhIGZ1dHVyZSBvbmUgKGUuZy4gU3VzcGVuc2UpLlxuICAgIH1cbiAgfVxufVxudmFyIGZha2VBY3RDYWxsYmFja05vZGUgPSB7fTtcblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFjayQxKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGFuIGBhY3RgIHNjb3BlLCBieXBhc3MgU2NoZWR1bGVyIGFuZCBwdXNoIHRvXG4gICAgLy8gdGhlIGBhY3RgIHF1ZXVlIGluc3RlYWQuXG4gICAgdmFyIGFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50O1xuXG4gICAgaWYgKGFjdFF1ZXVlICE9PSBudWxsKSB7XG4gICAgICBhY3RRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBmYWtlQWN0Q2FsbGJhY2tOb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbENhbGxiYWNrJDEoY2FsbGJhY2tOb2RlKSB7XG4gIGlmICggY2FsbGJhY2tOb2RlID09PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIEluIHByb2R1Y3Rpb24sIGFsd2F5cyBjYWxsIFNjaGVkdWxlci4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHN0cmlwcGVkIG91dC5cblxuXG4gIHJldHVybiBjYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSB7XG4gIC8vIE5ldmVyIGZvcmNlIGZsdXNoIGluIHByb2R1Y3Rpb24uIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGdldCBzdHJpcHBlZCBvdXQuXG4gIHJldHVybiAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIGlmICghaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSkge1xuICAgICAgICAvLyBOb3QgaW4gYW4gYWN0IGVudmlyb25tZW50LiBObyBuZWVkIHRvIHdhcm4uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVnYWN5IG1vZGUgaGFzIGFkZGl0aW9uYWwgY2FzZXMgd2hlcmUgd2Ugc3VwcHJlc3MgYSB3YXJuaW5nLlxuICAgICAgaWYgKCFpc0xlZ2FjeUFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChleGVjdXRpb25Db250ZXh0ICE9PSBOb0NvbnRleHQpIHtcbiAgICAgICAgLy8gTGVnYWN5IG1vZGUgZG9lc24ndCB3YXJuIGlmIHRoZSB1cGRhdGUgaXMgYmF0Y2hlZCwgaS5lLlxuICAgICAgICAvLyBiYXRjaGVkVXBkYXRlcyBvciBmbHVzaFN5bmMuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpYmVyLnRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgZmliZXIudGFnICE9PSBGb3J3YXJkUmVmICYmIGZpYmVyLnRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkge1xuICAgICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUtaG9va3MgY29kZSwgbGVnYWN5IG1vZGUgb25seVxuICAgICAgICAvLyB3YXJucyBmb3IgdXBkYXRlcyB0aGF0IG9yaWdpbmF0ZSBmcm9tIGEgaG9vay5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICBlcnJvcignQW4gdXBkYXRlIHRvICVzIGluc2lkZSBhIHRlc3Qgd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgY2F1c2VzIFJlYWN0IHN0YXRlIHVwZGF0ZXMgc2hvdWxkIGJlICcgKyAnd3JhcHBlZCBpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmlyZSBldmVudHMgdGhhdCB1cGRhdGUgc3RhdGUgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuSWZTdXNwZW5zZVJlc29sdXRpb25Ob3RXcmFwcGVkV2l0aEFjdERFVihyb290KSB7XG4gIHtcbiAgICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIHN1c3BlbmRlZCByZXNvdXJjZSBmaW5pc2hlZCBsb2FkaW5nIGluc2lkZSBhIHRlc3QsIGJ1dCB0aGUgZXZlbnQgJyArICd3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCByZXNvbHZlcyBzdXNwZW5kZWQgZGF0YSBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ2ludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaW5pc2ggbG9hZGluZyBzdXNwZW5kZWQgZGF0YSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoaXNSdW5uaW5nKSB7XG4gIHtcbiAgICBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBpc1J1bm5pbmc7XG4gIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2RlcyAqL1xudmFyIHJlc29sdmVGYW1pbHkgPSBudWxsOyAvLyAkRmxvd0ZpeE1lIEZsb3cgZ2V0cyBjb25mdXNlZCBieSBhIFdlYWtTZXQgZmVhdHVyZSBjaGVjayBiZWxvdy5cblxudmFyIGZhaWxlZEJvdW5kYXJpZXMgPSBudWxsO1xudmFyIHNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAge1xuICAgIHJlc29sdmVGYW1pbHkgPSBoYW5kbGVyO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgLy8gTm8gaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuXG4gIHJldHVybiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZWFsIGZvcndhcmRSZWYuIERvbid0IHdhbnQgdG8gY3Jhc2ggZWFybHkuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCAmJiB0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZvcndhcmRSZWYgaXMgc3BlY2lhbCBiZWNhdXNlIGl0cyByZXNvbHZlZCAudHlwZSBpcyBhbiBvYmplY3QsXG4gICAgICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2Ugb25seSBoYXZlIGl0cyBpbm5lciByZW5kZXIgZnVuY3Rpb24gaW4gdGhlIG1hcC5cbiAgICAgICAgLy8gSWYgdGhhdCBpbm5lciByZW5kZXIgZnVuY3Rpb24gaXMgZGlmZmVyZW50LCB3ZSdsbCBidWlsZCBhIG5ldyBmb3J3YXJkUmVmIHR5cGUuXG4gICAgICAgIHZhciBjdXJyZW50UmVuZGVyID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUucmVuZGVyKTtcblxuICAgICAgICBpZiAodHlwZS5yZW5kZXIgIT09IGN1cnJlbnRSZW5kZXIpIHtcbiAgICAgICAgICB2YXIgc3ludGhldGljVHlwZSA9IHtcbiAgICAgICAgICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgICAgICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN5bnRoZXRpY1R5cGUuZGlzcGxheU5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzeW50aGV0aWNUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGZpYmVyLCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHJldlR5cGUgPSBmaWJlci5lbGVtZW50VHlwZTtcbiAgICB2YXIgbmV4dFR5cGUgPSBlbGVtZW50LnR5cGU7IC8vIElmIHdlIGdvdCBoZXJlLCB3ZSBrbm93IHR5cGVzIGFyZW4ndCA9PT0gZXF1YWwuXG5cbiAgICB2YXIgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSBmYWxzZTtcbiAgICB2YXIgJCR0eXBlb2ZOZXh0VHlwZSA9IHR5cGVvZiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgbmV4dFR5cGUgIT09IG51bGwgPyBuZXh0VHlwZS4kJHR5cGVvZiA6IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBpbm5lciB0eXBlIHlldC5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBsYXp5IGlubmVyIHR5cGUgaXMgc3RhYmxlLFxuICAgICAgICAgICAgLy8gYW5kIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgcmVjb25jaWxpbmcgaXQgYXdheS5cbiAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byB1bndyYXAgb3IgYWN0dWFsbHkgdXNlIHRoZSBuZXcgbGF6eSB0eXBlLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpZiBpdCB3YXMgYnV0IGNhbiBubyBsb25nZXIgYmUgc2ltcGxlLFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHNldCB0aGlzLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gQ2hlY2sgaWYgYm90aCB0eXBlcyBoYXZlIGEgZmFtaWx5IGFuZCBpdCdzIHRoZSBzYW1lIG9uZS5cblxuXG4gICAgaWYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzKSB7XG4gICAgICAvLyBOb3RlOiBtZW1vKCkgYW5kIGZvcndhcmRSZWYoKSB3ZSdsbCBjb21wYXJlIG91dGVyIHJhdGhlciB0aGFuIGlubmVyIHR5cGUuXG4gICAgICAvLyBUaGlzIG1lYW5zIGJvdGggb2YgdGhlbSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgdG8gcHJlc2VydmUgc3RhdGUuXG4gICAgICAvLyBJZiB3ZSB1bndyYXBwZWQgYW5kIGNvbXBhcmVkIHRoZSBpbm5lciB0eXBlcyBmb3Igd3JhcHBlcnMgaW5zdGVhZCxcbiAgICAgIC8vIHRoZW4gd2Ugd291bGQgcmlzayBmYWxzZWx5IHNheWluZyB0d28gc2VwYXJhdGUgbWVtbyhGb28pXG4gICAgICAvLyBjYWxscyBhcmUgZXF1aXZhbGVudCBiZWNhdXNlIHRoZXkgd3JhcCB0aGUgc2FtZSBGb28gZnVuY3Rpb24uXG4gICAgICB2YXIgcHJldkZhbWlseSA9IHJlc29sdmVGYW1pbHkocHJldlR5cGUpO1xuXG4gICAgICBpZiAocHJldkZhbWlseSAhPT0gdW5kZWZpbmVkICYmIHByZXZGYW1pbHkgPT09IHJlc29sdmVGYW1pbHkobmV4dFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgV2Vha1NldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzID09PSBudWxsKSB7XG4gICAgICBmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICBmYWlsZWRCb3VuZGFyaWVzLmFkZChmaWJlcik7XG4gIH1cbn1cbnZhciBzY2hlZHVsZVJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgdXBkYXRlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3RhbGVGYW1pbGllcyA9IHVwZGF0ZS5zdGFsZUZhbWlsaWVzLFxuICAgICAgICB1cGRhdGVkRmFtaWxpZXMgPSB1cGRhdGUudXBkYXRlZEZhbWlsaWVzO1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2NoZWR1bGVSb290ID0gZnVuY3Rpb24gKHJvb3QsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290LmNvbnRleHQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgLy8gU3VwZXIgZWRnZSBjYXNlOiByb290IGhhcyBhIGxlZ2FjeSBfcmVuZGVyU3VidHJlZSBjb250ZXh0XG4gICAgICAvLyBidXQgd2UgZG9uJ3Qga25vdyB0aGUgcGFyZW50Q29tcG9uZW50IHNvIHdlIGNhbid0IHBhc3MgaXQuXG4gICAgICAvLyBKdXN0IGlnbm9yZS4gV2UnbGwgZGVsZXRlIHRoaXMgd2l0aCBfcmVuZGVyU3VidHJlZSBjb2RlIHBhdGggbGF0ZXIuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoZmliZXIsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcykge1xuICB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNvbHZlRmFtaWx5IHRvIGJlIHNldCBkdXJpbmcgaG90IHJlbG9hZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZW5kZXIgPSBmYWxzZTtcbiAgICB2YXIgbmVlZHNSZW1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkoY2FuZGlkYXRlVHlwZSk7XG5cbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RhbGVGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodXBkYXRlZEZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgaWYgKHRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZWRzUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMuaGFzKGZpYmVyKSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgZmFpbGVkQm91bmRhcmllcy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQpIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z05lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCB8fCBuZWVkc1JlbmRlcikge1xuICAgICAgdmFyIF9yb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChfcm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoX3Jvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiAhbmVlZHNSZW1vdW50KSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGNoaWxkLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgZmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBob3N0SW5zdGFuY2VzID0gbmV3IFNldCgpO1xuICAgIHZhciB0eXBlcyA9IG5ldyBTZXQoZmFtaWxpZXMubWFwKGZ1bmN0aW9uIChmYW1pbHkpIHtcbiAgICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgICB9KSk7XG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIHJldHVybiBob3N0SW5zdGFuY2VzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoZmliZXIsIHR5cGVzLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZGlkTWF0Y2ggPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKGNhbmRpZGF0ZVR5cGUpKSB7XG4gICAgICAgIGRpZE1hdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlkTWF0Y2gpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4gVGhpcyBvbmx5IGRyaWxscyBkb3duIHRvIHRoZSBjbG9zZXN0IGhvc3QgY29tcG9uZW50cy5cbiAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZWFyY2ggZGVlcGVyIGJlY2F1c2UgZm9yIHRoZSBwdXJwb3NlIG9mIGdpdmluZ1xuICAgICAgLy8gdmlzdWFsIGZlZWRiYWNrLCBcImZsYXNoaW5nXCIgb3V0ZXJtb3N0IHBhcmVudCByZWN0YW5nbGVzIGlzIHN1ZmZpY2llbnQuXG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwgbWF5YmUgdGhlcmUgd2lsbCBiZSBvbmUgZnVydGhlciBkb3duIGluIHRoZSBjaGlsZCB0cmVlLlxuICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShjaGlsZCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoc2libGluZywgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcblxuICAgIGlmIChmb3VuZEhvc3RJbnN0YW5jZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBob3N0IGNoaWxkcmVuLCBmYWxsYmFjayB0byBjbG9zZXN0IGhvc3QgcGFyZW50LlxuXG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gcmVhY2ggcm9vdCBmaXJzdC4nKTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBub2RlID0gZmliZXI7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICAvLyBXZSBnb3QgYSBtYXRjaC5cbiAgICAgICAgZm91bmRIb3N0SW5zdGFuY2VzID0gdHJ1ZTtcbiAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpOyAvLyBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSwgc28ga2VlcCBzZWFyY2hpbmcuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaWJlcikge1xuICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmliZXIpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc0JhZE1hcFBvbHlmaWxsO1xuXG57XG4gIGhhc0JhZE1hcFBvbHlmaWxsID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtub25FeHRlbnNpYmxlT2JqZWN0XSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXcgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgYWJvdXQgYmFkIHBvbHlmaWxsc1xuICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyBJbnN0YW5jZVxuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5rZXkgPSBrZXk7XG4gIHRoaXMuZWxlbWVudFR5cGUgPSBudWxsO1xuICB0aGlzLnR5cGUgPSBudWxsO1xuICB0aGlzLnN0YXRlTm9kZSA9IG51bGw7IC8vIEZpYmVyXG5cbiAgdGhpcy5yZXR1cm4gPSBudWxsO1xuICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgdGhpcy5zaWJsaW5nID0gbnVsbDtcbiAgdGhpcy5pbmRleCA9IDA7XG4gIHRoaXMucmVmID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7XG4gIHRoaXMubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gIHRoaXMudXBkYXRlUXVldWUgPSBudWxsO1xuICB0aGlzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB0aGlzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gIHRoaXMubW9kZSA9IG1vZGU7IC8vIEVmZmVjdHNcblxuICB0aGlzLmZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICB0aGlzLmRlbGV0aW9ucyA9IG51bGw7XG4gIHRoaXMubGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmFsdGVybmF0ZSA9IG51bGw7XG5cbiAge1xuICAgIC8vIE5vdGU6IFRoZSBmb2xsb3dpbmcgaXMgZG9uZSB0byBhdm9pZCBhIHY4IHBlcmZvcm1hbmNlIGNsaWZmLlxuICAgIC8vXG4gICAgLy8gSW5pdGlhbGl6aW5nIHRoZSBmaWVsZHMgYmVsb3cgdG8gc21pcyBhbmQgbGF0ZXIgdXBkYXRpbmcgdGhlbSB3aXRoXG4gICAgLy8gZG91YmxlIHZhbHVlcyB3aWxsIGNhdXNlIEZpYmVycyB0byBlbmQgdXAgaGF2aW5nIHNlcGFyYXRlIHNoYXBlcy5cbiAgICAvLyBUaGlzIGJlaGF2aW9yL2J1ZyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggT2JqZWN0LnByZXZlbnRFeHRlbnNpb24oKS5cbiAgICAvLyBGb3J0dW5hdGVseSB0aGlzIG9ubHkgaW1wYWN0cyBERVYgYnVpbGRzLlxuICAgIC8vIFVuZm9ydHVuYXRlbHkgaXQgbWFrZXMgUmVhY3QgdW51c2FibHkgc2xvdyBmb3Igc29tZSBhcHBsaWNhdGlvbnMuXG4gICAgLy8gVG8gd29yayBhcm91bmQgdGhpcywgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIGJlbG93IHdpdGggZG91Ymxlcy5cbiAgICAvL1xuICAgIC8vIExlYXJuIG1vcmUgYWJvdXQgdGhpcyBoZXJlOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQzNjVcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD04NTM4XG4gICAgdGhpcy5hY3R1YWxEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gTnVtYmVyLk5hTjsgLy8gSXQncyBva2F5IHRvIHJlcGxhY2UgdGhlIGluaXRpYWwgZG91YmxlcyB3aXRoIHNtaXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgLy8gVGhpcyB3b24ndCB0cmlnZ2VyIHRoZSBwZXJmb3JtYW5jZSBjbGlmZiBtZW50aW9uZWQgYWJvdmUsXG4gICAgLy8gYW5kIGl0IHNpbXBsaWZpZXMgb3RoZXIgcHJvZmlsZXIgY29kZSAoaW5jbHVkaW5nIERldlRvb2xzKS5cblxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIC8vIFRoaXMgaXNuJ3QgZGlyZWN0bHkgdXNlZCBidXQgaXMgaGFuZHkgZm9yIGRlYnVnZ2luZyBpbnRlcm5hbHM6XG4gICAgdGhpcy5fZGVidWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnTmVlZHNSZW1vdW50ID0gZmFsc2U7XG4gICAgdGhpcy5fZGVidWdIb29rVHlwZXMgPSBudWxsO1xuXG4gICAgaWYgKCFoYXNCYWRNYXBQb2x5ZmlsbCAmJiB0eXBlb2YgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICB9XG59IC8vIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYSBQT0pPIGNvbnN0cnVjdG9yLCBzdGlsbFxuLy8gcGxlYXNlIGVuc3VyZSB3ZSBkbyB0aGUgZm9sbG93aW5nOlxuLy8gMSkgTm9ib2R5IHNob3VsZCBhZGQgYW55IGluc3RhbmNlIG1ldGhvZHMgb24gdGhpcy4gSW5zdGFuY2UgbWV0aG9kcyBjYW4gYmVcbi8vICAgIG1vcmUgZGlmZmljdWx0IHRvIHByZWRpY3Qgd2hlbiB0aGV5IGdldCBvcHRpbWl6ZWQgYW5kIHRoZXkgYXJlIGFsbW9zdFxuLy8gICAgbmV2ZXIgaW5saW5lZCBwcm9wZXJseSBpbiBzdGF0aWMgY29tcGlsZXJzLlxuLy8gMikgTm9ib2R5IHNob3VsZCByZWx5IG9uIGBpbnN0YW5jZW9mIEZpYmVyYCBmb3IgdHlwZSB0ZXN0aW5nLiBXZSBzaG91bGRcbi8vICAgIGFsd2F5cyBrbm93IHdoZW4gaXQgaXMgYSBmaWJlci5cbi8vIDMpIFdlIG1pZ2h0IHdhbnQgdG8gZXhwZXJpbWVudCB3aXRoIHVzaW5nIG51bWVyaWMga2V5cyBzaW5jZSB0aGV5IGFyZSBlYXNpZXJcbi8vICAgIHRvIG9wdGltaXplIGluIGEgbm9uLUpJVCBlbnZpcm9ubWVudC5cbi8vIDQpIFdlIGNhbiBlYXNpbHkgZ28gZnJvbSBhIGNvbnN0cnVjdG9yIHRvIGEgY3JlYXRlRmliZXIgb2JqZWN0IGxpdGVyYWwgaWYgdGhhdFxuLy8gICAgaXMgZmFzdGVyLlxuLy8gNSkgSXQgc2hvdWxkIGJlIGVhc3kgdG8gcG9ydCB0aGlzIHRvIGEgQyBzdHJ1Y3QgYW5kIGtlZXAgYSBDIGltcGxlbWVudGF0aW9uXG4vLyAgICBjb21wYXRpYmxlLlxuXG5cbnZhciBjcmVhdGVGaWJlciA9IGZ1bmN0aW9uICh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gIC8vICRGbG93Rml4TWU6IHRoZSBzaGFwZXMgYXJlIGV4YWN0IGhlcmUgYnV0IEZsb3cgZG9lc24ndCBsaWtlIGNvbnN0cnVjdG9yc1xuICByZXR1cm4gbmV3IEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgIXNob3VsZENvbnN0cnVjdCQxKHR5cGUpICYmIHR5cGUuZGVmYXVsdFByb3BzID09PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpIHtcbiAgaWYgKHR5cGVvZiBDb21wb25lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSA/IENsYXNzQ29tcG9uZW50IDogRnVuY3Rpb25Db21wb25lbnQ7XG4gIH0gZWxzZSBpZiAoQ29tcG9uZW50ICE9PSB1bmRlZmluZWQgJiYgQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gQ29tcG9uZW50LiQkdHlwZW9mO1xuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICByZXR1cm4gRm9yd2FyZFJlZjtcbiAgICB9XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgcmV0dXJuIE1lbW9Db21wb25lbnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7XG59IC8vIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgYW4gYWx0ZXJuYXRlIGZpYmVyIHRvIGRvIHdvcmsgb24uXG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIHBlbmRpbmdQcm9wcykge1xuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSBjdXJyZW50LmFsdGVybmF0ZTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgPT09IG51bGwpIHtcbiAgICAvLyBXZSB1c2UgYSBkb3VibGUgYnVmZmVyaW5nIHBvb2xpbmcgdGVjaG5pcXVlIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHdlJ2xsXG4gICAgLy8gb25seSBldmVyIG5lZWQgYXQgbW9zdCB0d28gdmVyc2lvbnMgb2YgYSB0cmVlLiBXZSBwb29sIHRoZSBcIm90aGVyXCIgdW51c2VkXG4gICAgLy8gbm9kZSB0aGF0IHdlJ3JlIGZyZWUgdG8gcmV1c2UuIFRoaXMgaXMgbGF6aWx5IGNyZWF0ZWQgdG8gYXZvaWQgYWxsb2NhdGluZ1xuICAgIC8vIGV4dHJhIG9iamVjdHMgZm9yIHRoaW5ncyB0aGF0IGFyZSBuZXZlciB1cGRhdGVkLiBJdCBhbHNvIGFsbG93IHVzIHRvXG4gICAgLy8gcmVjbGFpbSB0aGUgZXh0cmEgbWVtb3J5IGlmIG5lZWRlZC5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZUZpYmVyKGN1cnJlbnQudGFnLCBwZW5kaW5nUHJvcHMsIGN1cnJlbnQua2V5LCBjdXJyZW50Lm1vZGUpO1xuICAgIHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID0gY3VycmVudC5lbGVtZW50VHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuXG4gICAge1xuICAgICAgLy8gREVWLW9ubHkgZmllbGRzXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2UgPSBjdXJyZW50Ll9kZWJ1Z1NvdXJjZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0hvb2tUeXBlcyA9IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IGN1cnJlbnQ7XG4gICAgY3VycmVudC5hbHRlcm5hdGUgPSB3b3JrSW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gYWx0ZXJuYXRlLlxuICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgdGFnLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBOb0ZsYWdzOyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuXG4gICAge1xuICAgICAgLy8gV2UgaW50ZW50aW9uYWxseSByZXNldCwgcmF0aGVyIHRoYW4gY29weSwgYWN0dWFsRHVyYXRpb24gJiBhY3R1YWxTdGFydFRpbWUuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHRpbWUgZnJvbSBlbmRsZXNzbHkgYWNjdW11bGF0aW5nIGluIG5ldyBjb21taXRzLlxuICAgICAgLy8gVGhpcyBoYXMgdGhlIGRvd25zaWRlIG9mIHJlc2V0dGluZyB2YWx1ZXMgZm9yIGRpZmZlcmVudCBwcmlvcml0eSByZW5kZXJzLFxuICAgICAgLy8gQnV0IHdvcmtzIGZvciB5aWVsZGluZyAodGhlIGNvbW1vbiBjYXNlKSBhbmQgc2hvdWxkIHN1cHBvcnQgcmVzdW1pbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICB9XG4gIH0gLy8gUmVzZXQgYWxsIGVmZmVjdHMgZXhjZXB0IHN0YXRpYyBvbmVzLlxuICAvLyBTdGF0aWMgZWZmZWN0cyBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBjdXJyZW50LmZsYWdzICYgU3RhdGljTWFzaztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgfTsgLy8gVGhlc2Ugd2lsbCBiZSBvdmVycmlkZGVuIGR1cmluZyB0aGUgcGFyZW50J3MgcmVjb25jaWxpYXRpb25cblxuICB3b3JrSW5Qcm9ncmVzcy5zaWJsaW5nID0gY3VycmVudC5zaWJsaW5nO1xuICB3b3JrSW5Qcm9ncmVzcy5pbmRleCA9IGN1cnJlbnQuaW5kZXg7XG4gIHdvcmtJblByb2dyZXNzLnJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ID0gY3VycmVudC5fZGVidWdOZWVkc1JlbW91bnQ7XG5cbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufSAvLyBVc2VkIHRvIHJldXNlIGEgRmliZXIgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3Mod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgcmVzZXRzIHRoZSBGaWJlciB0byB3aGF0IGNyZWF0ZUZpYmVyIG9yIGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkXG4gIC8vIGhhdmUgc2V0IHRoZSB2YWx1ZXMgdG8gYmVmb3JlIGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSWRlYWxseSB0aGlzIHdvdWxkbid0XG4gIC8vIGJlIG5lY2Vzc2FyeSBidXQgdW5mb3J0dW5hdGVseSBtYW55IGNvZGUgcGF0aHMgcmVhZHMgZnJvbSB0aGUgd29ya0luUHJvZ3Jlc3NcbiAgLy8gd2hlbiB0aGV5IHNob3VsZCBiZSByZWFkaW5nIGZyb20gY3VycmVudCBhbmQgd3JpdGluZyB0byB3b3JrSW5Qcm9ncmVzcy5cbiAgLy8gV2UgYXNzdW1lIHBlbmRpbmdQcm9wcywgaW5kZXgsIGtleSwgcmVmLCByZXR1cm4gYXJlIHN0aWxsIHVudG91Y2hlZCB0b1xuICAvLyBhdm9pZCBkb2luZyBhbm90aGVyIHJlY29uY2lsaWF0aW9uLlxuICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJ1dCBrZWVwIGFueSBQbGFjZW1lbnQgdGFncywgc2luY2UgdGhhdCdzIHNvbWV0aGluZ1xuICAvLyB0aGF0IGNoaWxkIGZpYmVyIGlzIHNldHRpbmcsIG5vdCB0aGUgcmVjb25jaWxpYXRpb24uXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IFN0YXRpY01hc2sgfCBQbGFjZW1lbnQ7IC8vIFRoZSBlZmZlY3RzIGFyZSBubyBsb25nZXIgdmFsaWQuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBSZXNldCB0byBjcmVhdGVGaWJlcidzIGluaXRpYWwgdmFsdWVzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZXNldCB0byB0aGUgY2xvbmVkIHZhbHVlcyB0aGF0IGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkJ3ZlLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gICAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gICAgdmFyIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgICAgZmlyc3RDb250ZXh0OiBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dFxuICAgIH07XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufVxuZnVuY3Rpb24gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSkge1xuICB2YXIgbW9kZTtcblxuICBpZiAodGFnID09PSBDb25jdXJyZW50Um9vdCkge1xuICAgIG1vZGUgPSBDb25jdXJyZW50TW9kZTtcblxuICAgIGlmIChpc1N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAge1xuICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBtb2RlID0gTm9Nb2RlO1xuICB9XG5cbiAgaWYgKCBpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIC8vIEFsd2F5cyBjb2xsZWN0IHByb2ZpbGUgdGltaW5ncyB3aGVuIERldlRvb2xzIGFyZSBwcmVzZW50LlxuICAgIC8vIFRoaXMgZW5hYmxlcyBEZXZUb29scyB0byBzdGFydCBjYXB0dXJpbmcgdGltaW5nIGF0IGFueSBwb2ludOKAk1xuICAgIC8vIFdpdGhvdXQgc29tZSBub2RlcyBpbiB0aGUgdHJlZSBoYXZpbmcgZW1wdHkgYmFzZSB0aW1lcy5cbiAgICBtb2RlIHw9IFByb2ZpbGVNb2RlO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyKEhvc3RSb290LCBudWxsLCBudWxsLCBtb2RlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCAvLyBSZWFjdCRFbGVtZW50VHlwZVxua2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXJUYWcgPSBJbmRldGVybWluYXRlQ29tcG9uZW50OyAvLyBUaGUgcmVzb2x2ZWQgdHlwZSBpcyBzZXQgaWYgd2Uga25vdyB3aGF0IHRoZSBmaW5hbCB0eXBlIHdpbGwgYmUuIEkuZS4gaXQncyBub3QgbGF6eS5cblxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoc2hvdWxkQ29uc3RydWN0JDEodHlwZSkpIHtcbiAgICAgIGZpYmVyVGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGZpYmVyVGFnID0gSG9zdENvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICBnZXRUYWc6IHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQocGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICBmaWJlclRhZyA9IE1vZGU7XG4gICAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAgICBpZiAoIChtb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAvLyBTdHJpY3QgZWZmZWN0cyBzaG91bGQgbmV2ZXIgcnVuIG9uIGxlZ2FjeSByb290c1xuICAgICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfU0NPUEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfQ0FDSEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfVFJBQ0lOR19NQVJLRVJfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dFByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gRm9yd2FyZFJlZjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTWVtb0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBMYXp5Q29tcG9uZW50O1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBcIiArICduYW1lZCBpbXBvcnRzLic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lciA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXIpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiAnICsgJ2NvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgY29tcG9uZW50cykgJyArIChcImJ1dCBnb3Q6IFwiICsgKHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSkgKyBcIi5cIiArIGluZm8pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKGZpYmVyVGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgZmliZXIudHlwZSA9IHJlc29sdmVkVHlwZTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBvd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIG93bmVyID0gbnVsbDtcblxuICB7XG4gICAgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBlbGVtZW50LnByb3BzO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwga2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcyk7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRnJhZ21lbnQsIGVsZW1lbnRzLCBrZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignUHJvZmlsZXIgbXVzdCBzcGVjaWZ5IGFuIFwiaWRcIiBvZiB0eXBlIGBzdHJpbmdgIGFzIGEgcHJvcC4gUmVjZWl2ZWQgdGhlIHR5cGUgYCVzYCBpbnN0ZWFkLicsIHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFByb2ZpbGVyLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSB8IFByb2ZpbGVNb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuXG4gIHtcbiAgICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgICBlZmZlY3REdXJhdGlvbjogMCxcbiAgICAgIHBhc3NpdmVFZmZlY3REdXJhdGlvbjogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihTdXNwZW5zZUNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VMaXN0Q29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKE9mZnNjcmVlbkNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX09GRlNDUkVFTl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICB2YXIgcHJpbWFyeUNoaWxkSW5zdGFuY2UgPSB7XG4gICAgaXNIaWRkZW46IGZhbHNlXG4gIH07XG4gIGZpYmVyLnN0YXRlTm9kZSA9IHByaW1hcnlDaGlsZEluc3RhbmNlO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gJ0RFTEVURUQnO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoZGVoeWRyYXRlZE5vZGUpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRGVoeWRyYXRlZEZyYWdtZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5zdGF0ZU5vZGUgPSBkZWh5ZHJhdGVkTm9kZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IHBvcnRhbC5jaGlsZHJlbiAhPT0gbnVsbCA/IHBvcnRhbC5jaGlsZHJlbiA6IFtdO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0UG9ydGFsLCBwZW5kaW5nUHJvcHMsIHBvcnRhbC5rZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgY29udGFpbmVySW5mbzogcG9ydGFsLmNvbnRhaW5lckluZm8sXG4gICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuICAgIC8vIFVzZWQgYnkgcGVyc2lzdGVudCB1cGRhdGVzXG4gICAgaW1wbGVtZW50YXRpb246IHBvcnRhbC5pbXBsZW1lbnRhdGlvblxuICB9O1xuICByZXR1cm4gZmliZXI7XG59IC8vIFVzZWQgZm9yIHN0YXNoaW5nIFdJUCBwcm9wZXJ0aWVzIHRvIHJlcGxheSBmYWlsZWQgd29yayBpbiBERVYuXG5cbmZ1bmN0aW9uIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHRhcmdldCwgc291cmNlKSB7XG4gIGlmICh0YXJnZXQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIEZpYmVyJ3MgaW5pdGlhbCBwcm9wZXJ0aWVzIHdpbGwgYWx3YXlzIGJlIG92ZXJ3cml0dGVuLlxuICAgIC8vIFdlIG9ubHkgdXNlIGEgRmliZXIgdG8gZW5zdXJlIHRoZSBzYW1lIGhpZGRlbiBjbGFzcyBzbyBERVYgaXNuJ3Qgc2xvdy5cbiAgICB0YXJnZXQgPSBjcmVhdGVGaWJlcihJbmRldGVybWluYXRlQ29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSB3cml0dGVuIGFzIGEgbGlzdCBvZiBhbGwgcHJvcGVydGllcy5cbiAgLy8gV2UgdHJpZWQgdG8gdXNlIE9iamVjdC5hc3NpZ24oKSBpbnN0ZWFkIGJ1dCB0aGlzIGlzIGNhbGxlZCBpblxuICAvLyB0aGUgaG90dGVzdCBwYXRoLCBhbmQgT2JqZWN0LmFzc2lnbigpIHdhcyB0b28gc2xvdzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwMlxuICAvLyBUaGlzIGNvZGUgaXMgREVWLW9ubHkgc28gc2l6ZSBpcyBub3QgYSBjb25jZXJuLlxuXG5cbiAgdGFyZ2V0LnRhZyA9IHNvdXJjZS50YWc7XG4gIHRhcmdldC5rZXkgPSBzb3VyY2Uua2V5O1xuICB0YXJnZXQuZWxlbWVudFR5cGUgPSBzb3VyY2UuZWxlbWVudFR5cGU7XG4gIHRhcmdldC50eXBlID0gc291cmNlLnR5cGU7XG4gIHRhcmdldC5zdGF0ZU5vZGUgPSBzb3VyY2Uuc3RhdGVOb2RlO1xuICB0YXJnZXQucmV0dXJuID0gc291cmNlLnJldHVybjtcbiAgdGFyZ2V0LmNoaWxkID0gc291cmNlLmNoaWxkO1xuICB0YXJnZXQuc2libGluZyA9IHNvdXJjZS5zaWJsaW5nO1xuICB0YXJnZXQuaW5kZXggPSBzb3VyY2UuaW5kZXg7XG4gIHRhcmdldC5yZWYgPSBzb3VyY2UucmVmO1xuICB0YXJnZXQucGVuZGluZ1Byb3BzID0gc291cmNlLnBlbmRpbmdQcm9wcztcbiAgdGFyZ2V0Lm1lbW9pemVkUHJvcHMgPSBzb3VyY2UubWVtb2l6ZWRQcm9wcztcbiAgdGFyZ2V0LnVwZGF0ZVF1ZXVlID0gc291cmNlLnVwZGF0ZVF1ZXVlO1xuICB0YXJnZXQubWVtb2l6ZWRTdGF0ZSA9IHNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICB0YXJnZXQuZGVwZW5kZW5jaWVzID0gc291cmNlLmRlcGVuZGVuY2llcztcbiAgdGFyZ2V0Lm1vZGUgPSBzb3VyY2UubW9kZTtcbiAgdGFyZ2V0LmZsYWdzID0gc291cmNlLmZsYWdzO1xuICB0YXJnZXQuc3VidHJlZUZsYWdzID0gc291cmNlLnN1YnRyZWVGbGFncztcbiAgdGFyZ2V0LmRlbGV0aW9ucyA9IHNvdXJjZS5kZWxldGlvbnM7XG4gIHRhcmdldC5sYW5lcyA9IHNvdXJjZS5sYW5lcztcbiAgdGFyZ2V0LmNoaWxkTGFuZXMgPSBzb3VyY2UuY2hpbGRMYW5lcztcbiAgdGFyZ2V0LmFsdGVybmF0ZSA9IHNvdXJjZS5hbHRlcm5hdGU7XG5cbiAge1xuICAgIHRhcmdldC5hY3R1YWxEdXJhdGlvbiA9IHNvdXJjZS5hY3R1YWxEdXJhdGlvbjtcbiAgICB0YXJnZXQuYWN0dWFsU3RhcnRUaW1lID0gc291cmNlLmFjdHVhbFN0YXJ0VGltZTtcbiAgICB0YXJnZXQuc2VsZkJhc2VEdXJhdGlvbiA9IHNvdXJjZS5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHRhcmdldC50cmVlQmFzZUR1cmF0aW9uID0gc291cmNlLnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87XG4gIHRoaXMucGVuZGluZ0NoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgdGhpcy5waW5nQ2FjaGUgPSBudWxsO1xuICB0aGlzLmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHRoaXMudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgdGhpcy5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lO1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5pZGVudGlmaWVyUHJlZml4ID0gaWRlbnRpZmllclByZWZpeDtcbiAgdGhpcy5vblJlY292ZXJhYmxlRXJyb3IgPSBvblJlY292ZXJhYmxlRXJyb3I7XG5cbiAge1xuICAgIHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IG51bGw7XG4gIH1cblxuICB7XG4gICAgdGhpcy5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgdGhpcy5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIHRoaXMubWVtb2l6ZWRVcGRhdGVycyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHRoaXMucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IFRvdGFsTGFuZXM7IF9pKyspIHtcbiAgICAgIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAucHVzaChuZXcgU2V0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZVJvb3QoKScgOiAnY3JlYXRlUm9vdCgpJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTGVnYWN5Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZSgpJyA6ICdyZW5kZXIoKSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCAvLyBUT0RPOiBXZSBoYXZlIHNldmVyYWwgb2YgdGhlc2UgYXJndW1lbnRzIHRoYXQgYXJlIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZVxuLy8gaG9zdCBjb25maWcsIGJ1dCBiZWNhdXNlIHRoZXkgYXJlIHBhc3NlZCBpbiBhdCBydW50aW1lLCB3ZSBoYXZlIHRvIHRocmVhZFxuLy8gdGhlbSB0aHJvdWdoIHRoZSByb290IGNvbnN0cnVjdG9yLiBQZXJoYXBzIHdlIHNob3VsZCBwdXQgdGhlbSBhbGwgaW50byBhXG4vLyBzaW5nbGUgdHlwZSwgbGlrZSBhIER5bmFtaWNIb3N0Q29uZmlnIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUgcmVuZGVyZXIuXG5pZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIC8vIHN0YXRlTm9kZSBpcyBhbnkuXG5cblxuICB2YXIgdW5pbml0aWFsaXplZEZpYmVyID0gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSk7XG4gIHJvb3QuY3VycmVudCA9IHVuaW5pdGlhbGl6ZWRGaWJlcjtcbiAgdW5pbml0aWFsaXplZEZpYmVyLnN0YXRlTm9kZSA9IHJvb3Q7XG5cbiAge1xuICAgIHZhciBfaW5pdGlhbFN0YXRlID0ge1xuICAgICAgZWxlbWVudDogaW5pdGlhbENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBoeWRyYXRlLFxuICAgICAgY2FjaGU6IG51bGwsXG4gICAgICAvLyBub3QgZW5hYmxlZCB5ZXRcbiAgICAgIHRyYW5zaXRpb25zOiBudWxsLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbnVsbFxuICAgIH07XG4gICAgdW5pbml0aWFsaXplZEZpYmVyLm1lbW9pemVkU3RhdGUgPSBfaW5pdGlhbFN0YXRlO1xuICB9XG5cbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7XG4gIHJldHVybiByb290O1xufVxuXG52YXIgUmVhY3RWZXJzaW9uID0gJzE4LjMuMSc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVySW5mbywgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgQVBJIGZvciBjcm9zcy1yZW5kZXJlciBpbXBsZW1lbnRhdGlvbi5cbmltcGxlbWVudGF0aW9uKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG5cbiAge1xuICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oa2V5KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IFBvcnRhbFxuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvblxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcztcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkge1xuICB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb21wb25lbnQpLmpvaW4oJywnKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgYSBSZWFjdENvbXBvbmVudC4gS2V5czogXCIgKyBrZXlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihob3N0RmliZXIpO1xuXG4gICAgICAgICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggaXMgaW5zaWRlIFN0cmljdE1vZGUuICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggcmVuZGVycyBTdHJpY3RNb2RlIGNoaWxkcmVuLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgLy8gSWRlYWxseSB0aGlzIHNob3VsZCByZXNldCB0byBwcmV2aW91cyBidXQgdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGluXG4gICAgICAgICAgLy8gcmVuZGVyIGFuZCB0aGVyZSdzIGFub3RoZXIgd2FybmluZyBmb3IgdGhhdCBhbnl3YXkuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihwcmV2aW91c0ZpYmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250YWluZXIoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBoeWRyYXRlID0gZmFsc2U7XG4gIHZhciBpbml0aWFsQ2hpbGRyZW4gPSBudWxsO1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIC8vIFRPRE86IFJlbW92ZSBgY2FsbGJhY2tgIHdoZW4gd2UgZGVsZXRlIGxlZ2FjeSBtb2RlLlxuY2FsbGJhY2ssIGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IHRydWU7XG4gIHZhciByb290ID0gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTsgLy8gVE9ETzogTW92ZSB0aGlzIHRvIEZpYmVyUm9vdCBjb25zdHJ1Y3RvclxuXG4gIHJvb3QuY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKG51bGwpOyAvLyBTY2hlZHVsZSB0aGUgaW5pdGlhbCByZW5kZXIuIEluIGEgaHlkcmF0aW9uIHJvb3QsIHRoaXMgaXMgZGlmZmVyZW50IGZyb21cbiAgLy8gYSByZWd1bGFyIHVwZGF0ZSBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0IG1hdGNoIHdhcyB3YXMgcmVuZGVyZWRcbiAgLy8gb24gdGhlIHNlcnZlci5cbiAgLy8gTk9URTogVGhpcyB1cGRhdGUgaW50ZW50aW9uYWxseSBkb2Vzbid0IGhhdmUgYSBwYXlsb2FkLiBXZSdyZSBvbmx5IHVzaW5nXG4gIC8vIHRoZSB1cGRhdGUgdG8gc2NoZWR1bGUgd29yayBvbiB0aGUgcm9vdCBmaWJlciAoYW5kLCBmb3IgbGVnYWN5IHJvb3RzLCB0b1xuICAvLyBlbnF1ZXVlIHRoZSBjYWxsYmFjayBpZiBvbmUgaXMgcHJvdmlkZWQpLlxuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGN1cnJlbnQpO1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwgPyBjYWxsYmFjayA6IG51bGw7XG4gIGVucXVldWVVcGRhdGUoY3VycmVudCwgdXBkYXRlLCBsYW5lKTtcbiAgc2NoZWR1bGVJbml0aWFsSHlkcmF0aW9uT25Sb290KHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIHJldHVybiByb290O1xufVxuZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIGNvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaykge1xuICB7XG4gICAgb25TY2hlZHVsZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KTtcbiAgfVxuXG4gIHZhciBjdXJyZW50JDEgPSBjb250YWluZXIuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50JDEpO1xuXG4gIHtcbiAgICBtYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICB9XG5cbiAgdmFyIGNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpO1xuXG4gIGlmIChjb250YWluZXIuY29udGV4dCA9PT0gbnVsbCkge1xuICAgIGNvbnRhaW5lci5jb250ZXh0ID0gY29udGV4dDtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucGVuZGluZ0NvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiBjdXJyZW50ICE9PSBudWxsICYmICFkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ1JlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlOyAnICsgJ3RyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyIGlzIG5vdCBhbGxvd2VkLiAnICsgJ0lmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiBjb21wb25lbnREaWRVcGRhdGUuXFxuXFxuJyArICdDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAlcy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpIHx8ICdVbmtub3duJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBlbGVtZW50XG4gIH07XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcblxuICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShjdXJyZW50JDEsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgY3VycmVudCQxLCBsYW5lLCBldmVudFRpbWUpO1xuICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgY3VycmVudCQxLCBsYW5lKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gZ2V0UHVibGljUm9vdEluc3RhbmNlKGNvbnRhaW5lcikge1xuICB2YXIgY29udGFpbmVyRmliZXIgPSBjb250YWluZXIuY3VycmVudDtcblxuICBpZiAoIWNvbnRhaW5lckZpYmVyLmNoaWxkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKGNvbnRhaW5lckZpYmVyLmNoaWxkLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBnZXRQdWJsaWNJbnN0YW5jZShjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGUpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiQxKGZpYmVyKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICAvLyBGbHVzaCB0aGUgZmlyc3Qgc2NoZWR1bGVkIFwidXBkYXRlXCIuXG4gICAgICAgICAgdmFyIGxhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5UGVuZGluZ0xhbmVzKHJvb3QpO1xuICAgICAgICAgIGZsdXNoUm9vdChyb290LCBsYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pOyAvLyBJZiB3ZSdyZSBzdGlsbCBibG9ja2VkIGFmdGVyIHRoaXMsIHdlIG5lZWQgdG8gaW5jcmVhc2VcbiAgICAgICAgLy8gdGhlIHByaW9yaXR5IG9mIGFueSBwcm9taXNlcyByZXNvbHZpbmcgd2l0aGluIHRoaXNcbiAgICAgICAgLy8gYm91bmRhcnkgc28gdGhhdCB0aGV5IG5leHQgYXR0ZW1wdCBhbHNvIGhhcyBoaWdoZXIgcHJpLlxuXG4gICAgICAgIHZhciByZXRyeUxhbmUgPSBTeW5jTGFuZTtcbiAgICAgICAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsICYmIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gaGlnaGVyUHJpb3JpdHlMYW5lKHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lLCByZXRyeUxhbmUpO1xuICB9XG59IC8vIEluY3JlYXNlcyB0aGUgcHJpb3JpdHkgb2YgdGhlbmFibGVzIHdoZW4gdGhleSByZXNvbHZlIHdpdGhpbiB0aGlzIGJvdW5kYXJ5LlxuXG5cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSkge1xuICAgIG1hcmtSZXRyeUxhbmVJbXBsKGFsdGVybmF0ZSwgcmV0cnlMYW5lKTtcbiAgfVxufVxuZnVuY3Rpb24gYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYW5lID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIH1cblxuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgb3RoZXIgdGhhbiBzeW5jaHJvbm91c2x5IGZsdXNoIGl0LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxuXG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xufVxuXG52YXIgc2hvdWxkRXJyb3JJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkRXJyb3IoZmliZXIpIHtcbiAgcmV0dXJuIHNob3VsZEVycm9ySW1wbChmaWJlcik7XG59XG5cbnZhciBzaG91bGRTdXNwZW5kSW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRTdXNwZW5kKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRTdXNwZW5kSW1wbChmaWJlcik7XG59XG52YXIgb3ZlcnJpZGVIb29rU3RhdGUgPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsO1xudmFyIHNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbnZhciBzZXRFcnJvckhhbmRsZXIgPSBudWxsO1xudmFyIHNldFN1c3BlbnNlSGFuZGxlciA9IG51bGw7XG5cbntcbiAgdmFyIGNvcHlXaXRoRGVsZXRlSW1wbCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIGluZGV4KSB7XG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7XG5cbiAgICBpZiAoaW5kZXggKyAxID09PSBwYXRoLmxlbmd0aCkge1xuICAgICAgaWYgKGlzQXJyYXkodXBkYXRlZCkpIHtcbiAgICAgICAgdXBkYXRlZC5zcGxpY2Uoa2V5LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH0gLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aERlbGV0ZUltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoRGVsZXRlID0gZnVuY3Rpb24gKG9iaiwgcGF0aCkge1xuICAgIHJldHVybiBjb3B5V2l0aERlbGV0ZUltcGwob2JqLCBwYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWVJbXBsID0gZnVuY3Rpb24gKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXgpIHtcbiAgICB2YXIgb2xkS2V5ID0gb2xkUGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IG9sZFBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgbmV3S2V5ID0gbmV3UGF0aFtpbmRleF07IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgICAgdXBkYXRlZFtuZXdLZXldID0gdXBkYXRlZFtvbGRLZXldO1xuXG4gICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShvbGRLZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbb2xkS2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgdXBkYXRlZFtvbGRLZXldID0gY29weVdpdGhSZW5hbWVJbXBsKCAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICBvYmpbb2xkS2V5XSwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWUgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgaWYgKG9sZFBhdGgubGVuZ3RoICE9PSBuZXdQYXRoLmxlbmd0aCkge1xuICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIG9mIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHtcbiAgICAgICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgdG8gYmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgZGVlcGVzdCBrZXknKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3B5V2l0aFJlbmFtZUltcGwob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXRJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgaWYgKGluZGV4ID49IHBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoU2V0SW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoU2V0ID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgdmFsdWUpIHtcbiAgICByZXR1cm4gY29weVdpdGhTZXRJbXBsKG9iaiwgcGF0aCwgMCwgdmFsdWUpO1xuICB9O1xuXG4gIHZhciBmaW5kSG9vayA9IGZ1bmN0aW9uIChmaWJlciwgaWQpIHtcbiAgICAvLyBGb3Igbm93LCB0aGUgXCJpZFwiIG9mIHN0YXRlZnVsIGhvb2tzIGlzIGp1c3QgdGhlIHN0YXRlZnVsIGhvb2sgaW5kZXguXG4gICAgLy8gVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgd2l0aCBlLmcuIG5lc3RlZCBob29rcy5cbiAgICB2YXIgY3VycmVudEhvb2sgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgd2hpbGUgKGN1cnJlbnRIb29rICE9PSBudWxsICYmIGlkID4gMCkge1xuICAgICAgY3VycmVudEhvb2sgPSBjdXJyZW50SG9vay5uZXh0O1xuICAgICAgaWQtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudEhvb2s7XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgZWRpdGFibGUgdmFsdWVzIGZvciB1c2VTdGF0ZSBhbmQgdXNlUmVkdWNlci5cblxuXG4gIG92ZXJyaWRlSG9va1N0YXRlID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgcGF0aCwgdmFsdWUpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhTZXQoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoLCB2YWx1ZSk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoRGVsZXRlKGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoUmVuYW1lKGhvb2subWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gU3VwcG9ydCBEZXZUb29scyBwcm9wcyBmb3IgZnVuY3Rpb24gY29tcG9uZW50cywgZm9yd2FyZFJlZiwgbWVtbywgaG9zdCBjb21wb25lbnRzLCBldGMuXG5cblxuICBvdmVycmlkZVByb3BzID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoLCB2YWx1ZSkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoU2V0KGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgsIHZhbHVlKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhEZWxldGUoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoUmVuYW1lKGZpYmVyLm1lbW9pemVkUHJvcHMsIG9sZFBhdGgsIG5ld1BhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgc2NoZWR1bGVVcGRhdGUgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgc2V0RXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKG5ld1Nob3VsZEVycm9ySW1wbCkge1xuICAgIHNob3VsZEVycm9ySW1wbCA9IG5ld1Nob3VsZEVycm9ySW1wbDtcbiAgfTtcblxuICBzZXRTdXNwZW5zZUhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkU3VzcGVuZEltcGwpIHtcbiAgICBzaG91bGRTdXNwZW5kSW1wbCA9IG5ld1Nob3VsZFN1c3BlbmRJbXBsO1xuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcihmaWJlcikge1xuICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xufVxuXG5mdW5jdGlvbiBlbXB0eUZpbmRGaWJlckJ5SG9zdEluc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scygpIHtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIGluamVjdEludG9EZXZUb29scyhkZXZUb29sc0NvbmZpZykge1xuICB2YXIgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2UgPSBkZXZUb29sc0NvbmZpZy5maW5kRmliZXJCeUhvc3RJbnN0YW5jZTtcbiAgdmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xuICByZXR1cm4gaW5qZWN0SW50ZXJuYWxzKHtcbiAgICBidW5kbGVUeXBlOiBkZXZUb29sc0NvbmZpZy5idW5kbGVUeXBlLFxuICAgIHZlcnNpb246IGRldlRvb2xzQ29uZmlnLnZlcnNpb24sXG4gICAgcmVuZGVyZXJQYWNrYWdlTmFtZTogZGV2VG9vbHNDb25maWcucmVuZGVyZXJQYWNrYWdlTmFtZSxcbiAgICByZW5kZXJlckNvbmZpZzogZGV2VG9vbHNDb25maWcucmVuZGVyZXJDb25maWcsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGU6IG92ZXJyaWRlSG9va1N0YXRlLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aDogb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aDogb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoLFxuICAgIG92ZXJyaWRlUHJvcHM6IG92ZXJyaWRlUHJvcHMsXG4gICAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6IG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoLFxuICAgIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoOiBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCxcbiAgICBzZXRFcnJvckhhbmRsZXI6IHNldEVycm9ySGFuZGxlcixcbiAgICBzZXRTdXNwZW5zZUhhbmRsZXI6IHNldFN1c3BlbnNlSGFuZGxlcixcbiAgICBzY2hlZHVsZVVwZGF0ZTogc2NoZWR1bGVVcGRhdGUsXG4gICAgY3VycmVudERpc3BhdGNoZXJSZWY6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6IGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyLFxuICAgIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSB8fCBlbXB0eUZpbmRGaWJlckJ5SG9zdEluc3RhbmNlLFxuICAgIC8vIFJlYWN0IFJlZnJlc2hcbiAgICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6ICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggLFxuICAgIHNjaGVkdWxlUmVmcmVzaDogIHNjaGVkdWxlUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSb290OiAgc2NoZWR1bGVSb290ICxcbiAgICBzZXRSZWZyZXNoSGFuZGxlcjogIHNldFJlZnJlc2hIYW5kbGVyICxcbiAgICAvLyBFbmFibGVzIERldlRvb2xzIHRvIGFwcGVuZCBvd25lciBzdGFja3MgdG8gZXJyb3IgbWVzc2FnZXMgaW4gREVWIG1vZGUuXG4gICAgZ2V0Q3VycmVudEZpYmVyOiAgZ2V0Q3VycmVudEZpYmVyRm9yRGV2VG9vbHMgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gZGV0ZWN0IHJlY29uY2lsZXIgdmVyc2lvbiByYXRoZXIgdGhhbiByZW5kZXJlciB2ZXJzaW9uXG4gICAgLy8gd2hpY2ggbWF5IG5vdCBtYXRjaCBmb3IgdGhpcmQgcGFydHkgcmVuZGVyZXJzLlxuICAgIHJlY29uY2lsZXJWZXJzaW9uOiBSZWFjdFZlcnNpb25cbiAgfSk7XG59XG5cbi8qIGdsb2JhbCByZXBvcnRFcnJvciAqL1xuXG52YXIgZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvciA9IHR5cGVvZiByZXBvcnRFcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IC8vIEluIG1vZGVybiBicm93c2VycywgcmVwb3J0RXJyb3Igd2lsbCBkaXNwYXRjaCBhbiBlcnJvciBldmVudCxcbi8vIGVtdWxhdGluZyBhbiB1bmNhdWdodCBKYXZhU2NyaXB0IGVycm9yLlxucmVwb3J0RXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgLy8gSW4gb2xkZXIgYnJvd3NlcnMgYW5kIHRlc3QgZW52aXJvbm1lbnRzLCBmYWxsYmFjayB0byBjb25zb2xlLmVycm9yLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpO1xufTtcblxuZnVuY3Rpb24gUmVhY3RET01Sb290KGludGVybmFsUm9vdCkge1xuICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBpbnRlcm5hbFJvb3Q7XG59XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUucmVuZGVyID0gUmVhY3RET01Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG5cbiAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYW4gdW5tb3VudGVkIHJvb3QuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH0gZWxzZSBpZiAoaXNWYWxpZENvbnRhaW5lcihhcmd1bWVudHNbMV0pKSB7XG4gICAgICBlcnJvcignWW91IHBhc3NlZCBhIGNvbnRhaW5lciB0byB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHJvb3QucmVuZGVyKC4uLikuICcgKyBcIllvdSBkb24ndCBuZWVkIHRvIHBhc3MgaXQgYWdhaW4gc2luY2UgeW91IGFscmVhZHkgcGFzc2VkIGl0IHRvIGNyZWF0ZSB0aGUgcm9vdC5cIik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBzZWNvbmQgYXJndW1lbnQgdG8gcm9vdC5yZW5kZXIoLi4uKSBidXQgaXQgb25seSBhY2NlcHRzICcgKyAnb25lIGFyZ3VtZW50LicpO1xuICAgIH1cblxuICAgIHZhciBjb250YWluZXIgPSByb290LmNvbnRhaW5lckluZm87XG5cbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhyb290LmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlKSB7XG4gICAgICAgIGlmIChob3N0SW5zdGFuY2UucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoZSAnICsgJ3Jvb3QgY29udGFpbmVyIHdhcyByZW1vdmVkIHdpdGhvdXQgdXNpbmcgUmVhY3QuIFRoaXMgaXMgbm90ICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGVycm9ycy4gSW5zdGVhZCwgY2FsbCAnICsgXCJyb290LnVubW91bnQoKSB0byBlbXB0eSBhIHJvb3QncyBjb250YWluZXIuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBudWxsLCBudWxsKTtcbn07XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5tb3VudCA9IFJlYWN0RE9NUm9vdC5wcm90b3R5cGUudW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcigndW5tb3VudCguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IGEgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBudWxsO1xuICAgIHZhciBjb250YWluZXIgPSByb290LmNvbnRhaW5lckluZm87XG5cbiAgICB7XG4gICAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgICAgZXJyb3IoJ0F0dGVtcHRlZCB0byBzeW5jaHJvbm91c2x5IHVubW91bnQgYSByb290IHdoaWxlIFJlYWN0IHdhcyBhbHJlYWR5ICcgKyAncmVuZGVyaW5nLiBSZWFjdCBjYW5ub3QgZmluaXNoIHVubW91bnRpbmcgdGhlIHJvb3QgdW50aWwgdGhlICcgKyAnY3VycmVudCByZW5kZXIgaGFzIGNvbXBsZXRlZCwgd2hpY2ggbWF5IGxlYWQgdG8gYSByYWNlIGNvbmRpdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKG51bGwsIHJvb3QsIG51bGwsIG51bGwpO1xuICAgIH0pO1xuICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlUm9vdCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuICB2YXIgaXNTdHJpY3RNb2RlID0gZmFsc2U7XG4gIHZhciBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlID0gZmFsc2U7XG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7XG4gIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yO1xuICB2YXIgdHJhbnNpdGlvbkNhbGxiYWNrcyA9IG51bGw7XG5cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAge1xuICAgICAgaWYgKG9wdGlvbnMuaHlkcmF0ZSkge1xuICAgICAgICB3YXJuKCdoeWRyYXRlIHRocm91Z2ggY3JlYXRlUm9vdCBpcyBkZXByZWNhdGVkLiBVc2UgUmVhY3RET01DbGllbnQuaHlkcmF0ZVJvb3QoY29udGFpbmVyLCA8QXBwIC8+KSBpbnN0ZWFkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgSlNYIGVsZW1lbnQgdG8gY3JlYXRlUm9vdC4gWW91IHByb2JhYmx5IG1lYW50IHRvICcgKyAnY2FsbCByb290LnJlbmRlciBpbnN0ZWFkLiAnICsgJ0V4YW1wbGUgdXNhZ2U6XFxuXFxuJyArICcgIGxldCByb290ID0gY3JlYXRlUm9vdChkb21Db250YWluZXIpO1xcbicgKyAnICByb290LnJlbmRlcig8QXBwIC8+KTsnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uQ2FsbGJhY2tzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyYW5zaXRpb25DYWxsYmFja3MgPSBvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3M7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSBjcmVhdGVDb250YWluZXIoY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgbnVsbCwgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTtcbiAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICByZXR1cm4gbmV3IFJlYWN0RE9NUm9vdChyb290KTtcbn1cblxuZnVuY3Rpb24gUmVhY3RET01IeWRyYXRpb25Sb290KGludGVybmFsUm9vdCkge1xuICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBpbnRlcm5hbFJvb3Q7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlSHlkcmF0aW9uKHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgcXVldWVFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpO1xuICB9XG59XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb24gPSBzY2hlZHVsZUh5ZHJhdGlvbjtcbmZ1bmN0aW9uIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdoeWRyYXRlUm9vdCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuXG4gIHtcbiAgICBpZiAoaW5pdGlhbENoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yKCdNdXN0IHByb3ZpZGUgaW5pdGlhbCBjaGlsZHJlbiBhcyBzZWNvbmQgYXJndW1lbnQgdG8gaHlkcmF0ZVJvb3QuICcgKyAnRXhhbXBsZSB1c2FnZTogaHlkcmF0ZVJvb3QoZG9tQ29udGFpbmVyLCA8QXBwIC8+KScpO1xuICAgIH1cbiAgfSAvLyBGb3Igbm93IHdlIHJldXNlIHRoZSB3aG9sZSBiYWcgb2Ygb3B0aW9ucyBzaW5jZSB0aGV5IGNvbnRhaW5cbiAgLy8gdGhlIGh5ZHJhdGlvbiBjYWxsYmFja3MuXG5cblxuICB2YXIgaHlkcmF0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IG51bGw7IC8vIFRPRE86IERlbGV0ZSB0aGlzIG9wdGlvblxuXG4gIHZhciBtdXRhYmxlU291cmNlcyA9IG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmh5ZHJhdGVkU291cmNlcyB8fCBudWxsO1xuICB2YXIgaXNTdHJpY3RNb2RlID0gZmFsc2U7XG4gIHZhciBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlID0gZmFsc2U7XG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7XG4gIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yO1xuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIG51bGwsIGNvbnRhaW5lciwgQ29uY3VycmVudFJvb3QsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTsgLy8gVGhpcyBjYW4ndCBiZSBhIGNvbW1lbnQgbm9kZSBzaW5jZSBoeWRyYXRpb24gZG9lc24ndCB3b3JrIG9uIGNvbW1lbnQgbm9kZXMgYW55d2F5LlxuXG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKGNvbnRhaW5lcik7XG5cbiAgaWYgKG11dGFibGVTb3VyY2VzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhYmxlU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG11dGFibGVTb3VyY2UgPSBtdXRhYmxlU291cmNlc1tpXTtcbiAgICAgIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFJlYWN0RE9NSHlkcmF0aW9uUm9vdChyb290KTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXIobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCAhZGlzYWJsZUNvbW1lbnRzQXNET01Db250YWluZXJzICApKTtcbn0gLy8gVE9ETzogUmVtb3ZlIHRoaXMgZnVuY3Rpb24gd2hpY2ggYWxzbyBpbmNsdWRlcyBjb21tZW50IG5vZGVzLlxuLy8gV2Ugb25seSB1c2UgaXQgaW4gcGxhY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBtb3JlIHJlbGF4ZWQuXG5cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXJMZWdhY3kobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgJykpO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcikge1xuICB7XG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ2NyZWF0ZVJvb3QoKTogQ3JlYXRpbmcgcm9vdHMgZGlyZWN0bHkgd2l0aCBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgdXNpbmcgYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpKSB7XG4gICAgICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIpIHtcbiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5yZW5kZXIoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkgb24gYSBjb250YWluZXIgdGhhdCAnICsgJ2hhcyBhbHJlYWR5IGJlZW4gcGFzc2VkIHRvIGNyZWF0ZVJvb3QoKSBiZWZvcmUuIEluc3RlYWQsIGNhbGwgJyArICdyb290LnJlbmRlcigpIG9uIHRoZSBleGlzdGluZyByb290IGluc3RlYWQgaWYgeW91IHdhbnQgdG8gdXBkYXRlIGl0LicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIHRvcExldmVsVXBkYXRlV2FybmluZ3M7XG5cbntcbiAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgJiYgY29udGFpbmVyLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lci5jdXJyZW50KTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSkge1xuICAgICAgICBpZiAoaG9zdEluc3RhbmNlLnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikge1xuICAgICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogSXQgbG9va3MgbGlrZSB0aGUgUmVhY3QtcmVuZGVyZWQgY29udGVudCBvZiB0aGlzICcgKyAnY29udGFpbmVyIHdhcyByZW1vdmVkIHdpdGhvdXQgdXNpbmcgUmVhY3QuIFRoaXMgaXMgbm90ICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGVycm9ycy4gSW5zdGVhZCwgY2FsbCAnICsgJ1JlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUgdG8gZW1wdHkgYSBjb250YWluZXIuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCA9ICEhY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKHJvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCkpO1xuXG4gICAgaWYgKGhhc05vblJvb3RSZWFjdENoaWxkICYmICFpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0KSB7XG4gICAgICBlcnJvcigncmVuZGVyKC4uLik6IFJlcGxhY2luZyBSZWFjdC1yZW5kZXJlZCBjaGlsZHJlbiB3aXRoIGEgbmV3IHJvb3QgJyArICdjb21wb25lbnQuIElmIHlvdSBpbnRlbmRlZCB0byB1cGRhdGUgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgJyArICd5b3Ugc2hvdWxkIGluc3RlYWQgaGF2ZSB0aGUgZXhpc3RpbmcgY2hpbGRyZW4gdXBkYXRlIHRoZWlyIHN0YXRlICcgKyAnYW5kIHJlbmRlciB0aGUgbmV3IGNvbXBvbmVudHMgaW5zdGVhZCBvZiBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgY29udGFpbmVyLnRhZ05hbWUgJiYgY29udGFpbmVyLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSB7XG4gICAgICBlcnJvcigncmVuZGVyKCk6IFJlbmRlcmluZyBjb21wb25lbnRzIGRpcmVjdGx5IGludG8gZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHJlbmRlcmluZyBpbnRvIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcE9uUmVjb3ZlcmFibGVFcnJvcigpIHsvLyBUaGlzIGlzbid0IHJlYWNoYWJsZSBiZWNhdXNlIG9uUmVjb3ZlcmFibGVFcnJvciBpc24ndCBjYWxsZWQgaW4gdGhlXG4gIC8vIGxlZ2FjeSBBUEkuXG59XG5cbmZ1bmN0aW9uIGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrLCBpc0h5ZHJhdGlvbkNvbnRhaW5lcikge1xuICBpZiAoaXNIeWRyYXRpb25Db250YWluZXIpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIGNhbGxiYWNrLCBjb250YWluZXIsIExlZ2FjeVJvb3QsIG51bGwsIC8vIGh5ZHJhdGlvbkNhbGxiYWNrc1xuICAgIGZhbHNlLCAvLyBpc1N0cmljdE1vZGVcbiAgICBmYWxzZSwgLy8gY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSxcbiAgICAnJywgLy8gaWRlbnRpZmllclByZWZpeFxuICAgIG5vb3BPblJlY292ZXJhYmxlRXJyb3IpO1xuICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gcm9vdDtcbiAgICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTtcbiAgICB2YXIgcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICBmbHVzaFN5bmMoKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfSBlbHNlIHtcbiAgICAvLyBGaXJzdCBjbGVhciBhbnkgZXhpc3RpbmcgY29udGVudC5cbiAgICB2YXIgcm9vdFNpYmxpbmc7XG5cbiAgICB3aGlsZSAocm9vdFNpYmxpbmcgPSBjb250YWluZXIubGFzdENoaWxkKSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQocm9vdFNpYmxpbmcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKF9yb290KTtcblxuICAgICAgICBfb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9yb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzXG4gICAgZmFsc2UsIC8vIGlzU3RyaWN0TW9kZVxuICAgIGZhbHNlLCAvLyBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLFxuICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4XG4gICAgbm9vcE9uUmVjb3ZlcmFibGVFcnJvcik7XG5cbiAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IF9yb290O1xuICAgIG1hcmtDb250YWluZXJBc1Jvb3QoX3Jvb3QuY3VycmVudCwgY29udGFpbmVyKTtcblxuICAgIHZhciBfcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuXG4gICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoX3Jvb3RDb250YWluZXJFbGVtZW50KTsgLy8gSW5pdGlhbCBtb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgX3Jvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHJldHVybiBfcm9vdDtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICB7XG4gICAgaWYgKGNhbGxiYWNrICE9PSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgY2hpbGRyZW4sIGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlLCBjYWxsYmFjaykge1xuICB7XG4gICAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyhjb250YWluZXIpO1xuICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2ssICdyZW5kZXInKTtcbiAgfVxuXG4gIHZhciBtYXliZVJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgdmFyIHJvb3Q7XG5cbiAgaWYgKCFtYXliZVJvb3QpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgcm9vdCA9IGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2ssIGZvcmNlSHlkcmF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdCA9IG1heWJlUm9vdDtcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gVXBkYXRlXG5cblxuICAgIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICByZXR1cm4gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xufVxuXG52YXIgZGlkV2FybkFib3V0RmluZERPTU5vZGUgPSBmYWxzZTtcbmZ1bmN0aW9uIGZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kRE9NTm9kZSkge1xuICAgICAgZGlkV2FybkFib3V0RmluZERPTU5vZGUgPSB0cnVlO1xuXG4gICAgICBlcnJvcignZmluZERPTU5vZGUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yICcgKyAncmVsZWFzZS4gSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50ICcgKyAndG8gcmVmZXJlbmNlLiBMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScpO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyJDMuY3VycmVudDtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci5zdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciB3YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXI7XG5cbiAgICAgIGlmICghd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBmaW5kRE9NTm9kZSBpbnNpZGUgaXRzIHJlbmRlcigpLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG93bmVyLnR5cGUpIHx8ICdBIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiBjb21wb25lbnRPckVsZW1lbnQ7XG4gIH1cblxuICB7XG4gICAgcmV0dXJuIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnRPckVsZW1lbnQsICdmaW5kRE9NTm9kZScpO1xuICB9XG59XG5mdW5jdGlvbiBoeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS5oeWRyYXRlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBoeWRyYXRlUm9vdCAnICsgJ2luc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gdGhlIG5ldyBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzICcgKyBcImlmIGl0J3MgcnVubmluZyBSZWFjdCAxNy4gTGVhcm4gXCIgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5oeWRyYXRlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCBoeWRyYXRlUm9vdChjb250YWluZXIsIGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiB0aHJvdyBvciB3YXJuIGlmIHdlIGNvdWxkbid0IGh5ZHJhdGU/XG5cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCB0cnVlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiByZW5kZXIoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLnJlbmRlciBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIFJlYWN0IDE4LiBVc2UgY3JlYXRlUm9vdCAnICsgJ2luc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gdGhlIG5ldyBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzICcgKyBcImlmIGl0J3MgcnVubmluZyBSZWFjdCAxNy4gTGVhcm4gXCIgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QucmVuZGVyKGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBlbGVtZW50LCBjb250YWluZXIsIGZhbHNlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00udW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkICcgKyAnaW4gUmVhY3QgMTguIENvbnNpZGVyIHVzaW5nIGEgcG9ydGFsIGluc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gJyArIFwidGhlIGNyZWF0ZVJvb3QgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyBpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgXCIgKyAnMTcuIExlYXJuIG1vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lck5vZGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgaWYgKHBhcmVudENvbXBvbmVudCA9PSBudWxsIHx8ICFoYXMocGFyZW50Q29tcG9uZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnQnKTtcbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGZhbHNlLCBjYWxsYmFjayk7XG59XG52YXIgZGlkV2FybkFib3V0VW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IGZhbHNlO1xuZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpIHtcbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0VW5tb3VudENvbXBvbmVudEF0Tm9kZSkge1xuICAgICAgZGlkV2FybkFib3V0VW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IHRydWU7XG5cbiAgICAgIGVycm9yKCd1bm1vdW50Q29tcG9uZW50QXROb2RlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgJyArICduZXh0IG1ham9yIHJlbGVhc2UuIFN3aXRjaCB0byB0aGUgY3JlYXRlUm9vdCBBUEkuIExlYXJuICcgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VubW91bnRDb21wb25lbnRBdE5vZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC51bm1vdW50KCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAge1xuICAgICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgdmFyIHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCA9IHJvb3RFbCAmJiAhZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpO1xuXG4gICAgICBpZiAocmVuZGVyZWRCeURpZmZlcmVudFJlYWN0KSB7XG4gICAgICAgIGVycm9yKFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfSAvLyBVbm1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIG51bGwsIGNvbnRhaW5lciwgZmFsc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSBUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgYGRlbGV0ZSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcmBcbiAgICAgICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSBudWxsO1xuICAgICAgICB1bm1hcmtDb250YWluZXJBc1Jvb3QoY29udGFpbmVyKTtcbiAgICAgIH0pO1xuICAgIH0pOyAvLyBJZiB5b3UgY2FsbCB1bm1vdW50Q29tcG9uZW50QXROb2RlIHR3aWNlIGluIHF1aWNrIHN1Y2Nlc3Npb24sIHlvdSdsbFxuICAgIC8vIGdldCBgdHJ1ZWAgdHdpY2UuIFRoYXQncyBwcm9iYWJseSBmaW5lP1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgdmFyIF9yb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcblxuICAgICAgdmFyIGhhc05vblJvb3RSZWFjdENoaWxkID0gISEoX3Jvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlKF9yb290RWwpKTsgLy8gQ2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpdHNlbGYgaXMgYSBSZWFjdCByb290IG5vZGUuXG5cbiAgICAgIHZhciBpc0NvbnRhaW5lclJlYWN0Um9vdCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyLnBhcmVudE5vZGUpICYmICEhY29udGFpbmVyLnBhcmVudE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lcjtcblxuICAgICAgaWYgKGhhc05vblJvb3RSZWFjdENoaWxkKSB7XG4gICAgICAgIGVycm9yKFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBSZWFjdCBhbmQgaXMgbm90IGEgdG9wLWxldmVsIGNvbnRhaW5lci4gJXMnLCBpc0NvbnRhaW5lclJlYWN0Um9vdCA/ICdZb3UgbWF5IGhhdmUgYWNjaWRlbnRhbGx5IHBhc3NlZCBpbiBhIFJlYWN0IHJvb3Qgbm9kZSBpbnN0ZWFkICcgKyAnb2YgaXRzIGNvbnRhaW5lci4nIDogJ0luc3RlYWQsIGhhdmUgdGhlIHBhcmVudCBjb21wb25lbnQgdXBkYXRlIGl0cyBzdGF0ZSBhbmQgJyArICdyZXJlbmRlciBpbiBvcmRlciB0byByZW1vdmUgdGhpcyBjb21wb25lbnQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbnNldEF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKTtcbnNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMSk7XG5zZXRHZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KTtcbnNldEF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KHJ1bldpdGhQcmlvcml0eSk7XG5cbntcbiAgaWYgKHR5cGVvZiBNYXAgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBNYXAgaGFzIG5vIHByb3RvdHlwZVxuICBNYXAucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIE1hcC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgU2V0ICE9PSAnZnVuY3Rpb24nIHx8IC8vICRGbG93SXNzdWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgU2V0IGhhcyBubyBwcm90b3R5cGVcbiAgU2V0LnByb3RvdHlwZSA9PSBudWxsIHx8IHR5cGVvZiBTZXQucHJvdG90eXBlLmNsZWFyICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICBlcnJvcignUmVhY3QgZGVwZW5kcyBvbiBNYXAgYW5kIFNldCBidWlsdC1pbiB0eXBlcy4gTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSAnICsgJ3BvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtcG9seWZpbGxzJyk7XG4gIH1cbn1cblxuc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMyk7XG5zZXRCYXRjaGluZ0ltcGxlbWVudGF0aW9uKGJhdGNoZWRVcGRhdGVzJDEsIGRpc2NyZXRlVXBkYXRlcywgZmx1c2hTeW5jKTtcblxuZnVuY3Rpb24gY3JlYXRlUG9ydGFsJDEoY2hpbGRyZW4sIGNvbnRhaW5lcikge1xuICB2YXIga2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9IC8vIFRPRE86IHBhc3MgUmVhY3RET00gcG9ydGFsIGltcGxlbWVudGF0aW9uIGFzIHRoaXJkIGFyZ3VtZW50XG4gIC8vICRGbG93Rml4TWUgVGhlIEZsb3cgdHlwZSBpcyBvcGFxdWUgYnV0IHRoZXJlJ3Mgbm8gd2F5IHRvIGFjdHVhbGx5IGNyZWF0ZSBpdC5cblxuXG4gIHJldHVybiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lciwgbnVsbCwga2V5KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuICByZXR1cm4gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjayk7XG59XG5cbnZhciBJbnRlcm5hbHMgPSB7XG4gIHVzaW5nQ2xpZW50RW50cnlQb2ludDogZmFsc2UsXG4gIC8vIEtlZXAgaW4gc3luYyB3aXRoIFJlYWN0VGVzdFV0aWxzLmpzLlxuICAvLyBUaGlzIGlzIGFuIGFycmF5IGZvciBiZXR0ZXIgbWluaWZpY2F0aW9uLlxuICBFdmVudHM6IFtnZXRJbnN0YW5jZUZyb21Ob2RlLCBnZXROb2RlRnJvbUluc3RhbmNlLCBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlLCBlbnF1ZXVlU3RhdGVSZXN0b3JlLCByZXN0b3JlU3RhdGVJZk5lZWRlZCwgYmF0Y2hlZFVwZGF0ZXMkMV1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3QkMShjb250YWluZXIsIG9wdGlvbnMpIHtcbiAge1xuICAgIGlmICghSW50ZXJuYWxzLnVzaW5nQ2xpZW50RW50cnlQb2ludCAmJiAhZmFsc2UpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGltcG9ydGluZyBjcmVhdGVSb290IGZyb20gXCJyZWFjdC1kb21cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUm9vdChjb250YWluZXIsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlUm9vdCQxKGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKSB7XG4gIHtcbiAgICBpZiAoIUludGVybmFscy51c2luZ0NsaWVudEVudHJ5UG9pbnQgJiYgIWZhbHNlKSB7XG4gICAgICBlcnJvcignWW91IGFyZSBpbXBvcnRpbmcgaHlkcmF0ZVJvb3QgZnJvbSBcInJlYWN0LWRvbVwiIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnWW91IHNob3VsZCBpbnN0ZWFkIGltcG9ydCBpdCBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBoeWRyYXRlUm9vdChjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucyk7XG59IC8vIE92ZXJsb2FkIHRoZSBkZWZpbml0aW9uIHRvIHRoZSB0d28gdmFsaWQgc2lnbmF0dXJlcy5cbi8vIFdhcm5pbmcsIHRoaXMgb3B0cy1vdXQgb2YgY2hlY2tpbmcgdGhlIGZ1bmN0aW9uIGJvZHkuXG5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuZnVuY3Rpb24gZmx1c2hTeW5jJDEoZm4pIHtcbiAge1xuICAgIGlmIChpc0FscmVhZHlSZW5kZXJpbmcoKSkge1xuICAgICAgZXJyb3IoJ2ZsdXNoU3luYyB3YXMgY2FsbGVkIGZyb20gaW5zaWRlIGEgbGlmZWN5Y2xlIG1ldGhvZC4gUmVhY3QgY2Fubm90ICcgKyAnZmx1c2ggd2hlbiBSZWFjdCBpcyBhbHJlYWR5IHJlbmRlcmluZy4gQ29uc2lkZXIgbW92aW5nIHRoaXMgY2FsbCB0byAnICsgJ2Egc2NoZWR1bGVyIHRhc2sgb3IgbWljcm8gdGFzay4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmx1c2hTeW5jKGZuKTtcbn1cbnZhciBmb3VuZERldlRvb2xzID0gaW5qZWN0SW50b0RldlRvb2xzKHtcbiAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICBidW5kbGVUeXBlOiAgMSAsXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcbiAgcmVuZGVyZXJQYWNrYWdlTmFtZTogJ3JlYWN0LWRvbSdcbn0pO1xuXG57XG4gIGlmICghZm91bmREZXZUb29scyAmJiBjYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2luZG93LnNlbGYpIHtcbiAgICAvLyBJZiB3ZSdyZSBpbiBDaHJvbWUgb3IgRmlyZWZveCwgcHJvdmlkZSBhIGRvd25sb2FkIGxpbmsgaWYgbm90IGluc3RhbGxlZC5cbiAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUnKSA+IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWRnZScpID09PSAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xKSB7XG4gICAgICB2YXIgcHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7IC8vIERvbid0IHdhcm4gaW4gZXhvdGljIGNhc2VzIGxpa2UgY2hyb21lLWV4dGVuc2lvbjovLy5cblxuICAgICAgaWYgKC9eKGh0dHBzP3xmaWxlKTokLy50ZXN0KHByb3RvY29sKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gICAgICAgIGNvbnNvbGUuaW5mbygnJWNEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgJyArICdmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnICsgKHByb3RvY29sID09PSAnZmlsZTonID8gJ1xcbllvdSBtaWdodCBuZWVkIHRvIHVzZSBhIGxvY2FsIEhUVFAgc2VydmVyIChpbnN0ZWFkIG9mIGZpbGU6Ly8pOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scy1mYXEnIDogJycpLCAnZm9udC13ZWlnaHQ6Ym9sZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gSW50ZXJuYWxzO1xuZXhwb3J0cy5jcmVhdGVQb3J0YWwgPSBjcmVhdGVQb3J0YWwkMTtcbmV4cG9ydHMuY3JlYXRlUm9vdCA9IGNyZWF0ZVJvb3QkMTtcbmV4cG9ydHMuZmluZERPTU5vZGUgPSBmaW5kRE9NTm9kZTtcbmV4cG9ydHMuZmx1c2hTeW5jID0gZmx1c2hTeW5jJDE7XG5leHBvcnRzLmh5ZHJhdGUgPSBoeWRyYXRlO1xuZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGh5ZHJhdGVSb290JDE7XG5leHBvcnRzLnJlbmRlciA9IHJlbmRlcjtcbmV4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IHVubW91bnRDb21wb25lbnRBdE5vZGU7XG5leHBvcnRzLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzID0gYmF0Y2hlZFVwZGF0ZXMkMTtcbmV4cG9ydHMudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIgPSByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gbS5jcmVhdGVSb290O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gbS5oeWRyYXRlUm9vdDtcbn0gZWxzZSB7XG4gIHZhciBpID0gbS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gZnVuY3Rpb24oYywgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uY3JlYXRlUm9vdChjLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbihjLCBoLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5oeWRyYXRlUm9vdChjLCBoLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiBzY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nID0gZmFsc2U7XG52YXIgZW5hYmxlUHJvZmlsaW5nID0gZmFsc2U7XG52YXIgZnJhbWVZaWVsZE1zID0gNTtcblxuZnVuY3Rpb24gcHVzaChoZWFwLCBub2RlKSB7XG4gIHZhciBpbmRleCA9IGhlYXAubGVuZ3RoO1xuICBoZWFwLnB1c2gobm9kZSk7XG4gIHNpZnRVcChoZWFwLCBub2RlLCBpbmRleCk7XG59XG5mdW5jdGlvbiBwZWVrKGhlYXApIHtcbiAgcmV0dXJuIGhlYXAubGVuZ3RoID09PSAwID8gbnVsbCA6IGhlYXBbMF07XG59XG5mdW5jdGlvbiBwb3AoaGVhcCkge1xuICBpZiAoaGVhcC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBmaXJzdCA9IGhlYXBbMF07XG4gIHZhciBsYXN0ID0gaGVhcC5wb3AoKTtcblxuICBpZiAobGFzdCAhPT0gZmlyc3QpIHtcbiAgICBoZWFwWzBdID0gbGFzdDtcbiAgICBzaWZ0RG93bihoZWFwLCBsYXN0LCAwKTtcbiAgfVxuXG4gIHJldHVybiBmaXJzdDtcbn1cblxuZnVuY3Rpb24gc2lmdFVwKGhlYXAsIG5vZGUsIGkpIHtcbiAgdmFyIGluZGV4ID0gaTtcblxuICB3aGlsZSAoaW5kZXggPiAwKSB7XG4gICAgdmFyIHBhcmVudEluZGV4ID0gaW5kZXggLSAxID4+PiAxO1xuICAgIHZhciBwYXJlbnQgPSBoZWFwW3BhcmVudEluZGV4XTtcblxuICAgIGlmIChjb21wYXJlKHBhcmVudCwgbm9kZSkgPiAwKSB7XG4gICAgICAvLyBUaGUgcGFyZW50IGlzIGxhcmdlci4gU3dhcCBwb3NpdGlvbnMuXG4gICAgICBoZWFwW3BhcmVudEluZGV4XSA9IG5vZGU7XG4gICAgICBoZWFwW2luZGV4XSA9IHBhcmVudDtcbiAgICAgIGluZGV4ID0gcGFyZW50SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgc21hbGxlci4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2lmdERvd24oaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuICB2YXIgbGVuZ3RoID0gaGVhcC5sZW5ndGg7XG4gIHZhciBoYWxmTGVuZ3RoID0gbGVuZ3RoID4+PiAxO1xuXG4gIHdoaWxlIChpbmRleCA8IGhhbGZMZW5ndGgpIHtcbiAgICB2YXIgbGVmdEluZGV4ID0gKGluZGV4ICsgMSkgKiAyIC0gMTtcbiAgICB2YXIgbGVmdCA9IGhlYXBbbGVmdEluZGV4XTtcbiAgICB2YXIgcmlnaHRJbmRleCA9IGxlZnRJbmRleCArIDE7XG4gICAgdmFyIHJpZ2h0ID0gaGVhcFtyaWdodEluZGV4XTsgLy8gSWYgdGhlIGxlZnQgb3IgcmlnaHQgbm9kZSBpcyBzbWFsbGVyLCBzd2FwIHdpdGggdGhlIHNtYWxsZXIgb2YgdGhvc2UuXG5cbiAgICBpZiAoY29tcGFyZShsZWZ0LCBub2RlKSA8IDApIHtcbiAgICAgIGlmIChyaWdodEluZGV4IDwgbGVuZ3RoICYmIGNvbXBhcmUocmlnaHQsIGxlZnQpIDwgMCkge1xuICAgICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0O1xuICAgICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgICAgaW5kZXggPSByaWdodEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhcFtpbmRleF0gPSBsZWZ0O1xuICAgICAgICBoZWFwW2xlZnRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IGxlZnRJbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbm9kZSkgPCAwKSB7XG4gICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0O1xuICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7XG4gICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5laXRoZXIgY2hpbGQgaXMgc21hbGxlci4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIC8vIENvbXBhcmUgc29ydCBpbmRleCBmaXJzdCwgdGhlbiB0YXNrIGlkLlxuICB2YXIgZGlmZiA9IGEuc29ydEluZGV4IC0gYi5zb3J0SW5kZXg7XG4gIHJldHVybiBkaWZmICE9PSAwID8gZGlmZiA6IGEuaWQgLSBiLmlkO1xufVxuXG4vLyBUT0RPOiBVc2Ugc3ltYm9scz9cbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IDE7XG52YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSAyO1xudmFyIE5vcm1hbFByaW9yaXR5ID0gMztcbnZhciBMb3dQcmlvcml0eSA9IDQ7XG52YXIgSWRsZVByaW9yaXR5ID0gNTtcblxuZnVuY3Rpb24gbWFya1Rhc2tFcnJvcmVkKHRhc2ssIG1zKSB7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG52YXIgaGFzUGVyZm9ybWFuY2VOb3cgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbic7XG5cbmlmIChoYXNQZXJmb3JtYW5jZU5vdykge1xuICB2YXIgbG9jYWxQZXJmb3JtYW5jZSA9IHBlcmZvcm1hbmNlO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbFBlcmZvcm1hbmNlLm5vdygpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIGxvY2FsRGF0ZSA9IERhdGU7XG4gIHZhciBpbml0aWFsVGltZSA9IGxvY2FsRGF0ZS5ub3coKTtcblxuICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbG9jYWxEYXRlLm5vdygpIC0gaW5pdGlhbFRpbWU7XG4gIH07XG59IC8vIE1heCAzMSBiaXQgaW50ZWdlci4gVGhlIG1heCBpbnRlZ2VyIHNpemUgaW4gVjggZm9yIDMyLWJpdCBzeXN0ZW1zLlxuLy8gTWF0aC5wb3coMiwgMzApIC0gMVxuLy8gMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcblxuXG52YXIgbWF4U2lnbmVkMzFCaXRJbnQgPSAxMDczNzQxODIzOyAvLyBUaW1lcyBvdXQgaW1tZWRpYXRlbHlcblxudmFyIElNTUVESUFURV9QUklPUklUWV9USU1FT1VUID0gLTE7IC8vIEV2ZW50dWFsbHkgdGltZXMgb3V0XG5cbnZhciBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZX1RJTUVPVVQgPSAyNTA7XG52YXIgTk9STUFMX1BSSU9SSVRZX1RJTUVPVVQgPSA1MDAwO1xudmFyIExPV19QUklPUklUWV9USU1FT1VUID0gMTAwMDA7IC8vIE5ldmVyIHRpbWVzIG91dFxuXG52YXIgSURMRV9QUklPUklUWV9USU1FT1VUID0gbWF4U2lnbmVkMzFCaXRJbnQ7IC8vIFRhc2tzIGFyZSBzdG9yZWQgb24gYSBtaW4gaGVhcFxuXG52YXIgdGFza1F1ZXVlID0gW107XG52YXIgdGltZXJRdWV1ZSA9IFtdOyAvLyBJbmNyZW1lbnRpbmcgaWQgY291bnRlci4gVXNlZCB0byBtYWludGFpbiBpbnNlcnRpb24gb3JkZXIuXG5cbnZhciB0YXNrSWRDb3VudGVyID0gMTsgLy8gUGF1c2luZyB0aGUgc2NoZWR1bGVyIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxudmFyIGN1cnJlbnRUYXNrID0gbnVsbDtcbnZhciBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5OyAvLyBUaGlzIGlzIHNldCB3aGlsZSBwZXJmb3JtaW5nIHdvcmssIHRvIHByZXZlbnQgcmUtZW50cmFuY2UuXG5cbnZhciBpc1BlcmZvcm1pbmdXb3JrID0gZmFsc2U7XG52YXIgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcbnZhciBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7IC8vIENhcHR1cmUgbG9jYWwgcmVmZXJlbmNlcyB0byBuYXRpdmUgQVBJcywgaW4gY2FzZSBhIHBvbHlmaWxsIG92ZXJyaWRlcyB0aGVtLlxuXG52YXIgbG9jYWxTZXRUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogbnVsbDtcbnZhciBsb2NhbENsZWFyVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiBudWxsO1xudmFyIGxvY2FsU2V0SW1tZWRpYXRlID0gdHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRJbW1lZGlhdGUgOiBudWxsOyAvLyBJRSBhbmQgTm9kZS5qcyArIGpzZG9tXG5cbnZhciBpc0lucHV0UGVuZGluZyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5zY2hlZHVsaW5nICE9PSB1bmRlZmluZWQgJiYgbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcgIT09IHVuZGVmaW5lZCA/IG5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nLmJpbmQobmF2aWdhdG9yLnNjaGVkdWxpbmcpIDogbnVsbDtcblxuZnVuY3Rpb24gYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSkge1xuICAvLyBDaGVjayBmb3IgdGFza3MgdGhhdCBhcmUgbm8gbG9uZ2VyIGRlbGF5ZWQgYW5kIGFkZCB0aGVtIHRvIHRoZSBxdWV1ZS5cbiAgdmFyIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICB3aGlsZSAodGltZXIgIT09IG51bGwpIHtcbiAgICBpZiAodGltZXIuY2FsbGJhY2sgPT09IG51bGwpIHtcbiAgICAgIC8vIFRpbWVyIHdhcyBjYW5jZWxsZWQuXG4gICAgICBwb3AodGltZXJRdWV1ZSk7XG4gICAgfSBlbHNlIGlmICh0aW1lci5zdGFydFRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgIC8vIFRpbWVyIGZpcmVkLiBUcmFuc2ZlciB0byB0aGUgdGFzayBxdWV1ZS5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICAgIHRpbWVyLnNvcnRJbmRleCA9IHRpbWVyLmV4cGlyYXRpb25UaW1lO1xuICAgICAgcHVzaCh0YXNrUXVldWUsIHRpbWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtYWluaW5nIHRpbWVycyBhcmUgcGVuZGluZy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlVGltZW91dChjdXJyZW50VGltZSkge1xuICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQpIHtcbiAgICBpZiAocGVlayh0YXNrUXVldWUpICE9PSBudWxsKSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIGZpcnN0VGltZXIuc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFdvcmsoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpIHtcblxuXG4gIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgaWYgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQpIHtcbiAgICAvLyBXZSBzY2hlZHVsZWQgYSB0aW1lb3V0IGJ1dCBpdCdzIG5vIGxvbmdlciBuZWVkZWQuIENhbmNlbCBpdC5cbiAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gICAgY2FuY2VsSG9zdFRpbWVvdXQoKTtcbiAgfVxuXG4gIGlzUGVyZm9ybWluZ1dvcmsgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICBpZiAoZW5hYmxlUHJvZmlsaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgICAgICBtYXJrVGFza0Vycm9yZWQoY3VycmVudFRhc2ssIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICBjdXJyZW50VGFzay5pc1F1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNhdGNoIGluIHByb2QgY29kZSBwYXRoLlxuICAgICAgcmV0dXJuIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFRhc2sgPSBudWxsO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuICB2YXIgY3VycmVudFRpbWUgPSBpbml0aWFsVGltZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuXG4gIHdoaWxlIChjdXJyZW50VGFzayAhPT0gbnVsbCAmJiAhKGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyApKSB7XG4gICAgaWYgKGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lID4gY3VycmVudFRpbWUgJiYgKCFoYXNUaW1lUmVtYWluaW5nIHx8IHNob3VsZFlpZWxkVG9Ib3N0KCkpKSB7XG4gICAgICAvLyBUaGlzIGN1cnJlbnRUYXNrIGhhc24ndCBleHBpcmVkLCBhbmQgd2UndmUgcmVhY2hlZCB0aGUgZGVhZGxpbmUuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgY2FsbGJhY2sgPSBjdXJyZW50VGFzay5jYWxsYmFjaztcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1cnJlbnRUYXNrLmNhbGxiYWNrID0gbnVsbDtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFRhc2sucHJpb3JpdHlMZXZlbDtcbiAgICAgIHZhciBkaWRVc2VyQ2FsbGJhY2tUaW1lb3V0ID0gY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWU7XG5cbiAgICAgIHZhciBjb250aW51YXRpb25DYWxsYmFjayA9IGNhbGxiYWNrKGRpZFVzZXJDYWxsYmFja1RpbWVvdXQpO1xuICAgICAgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbkNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGN1cnJlbnRUYXNrLmNhbGxiYWNrID0gY29udGludWF0aW9uQ2FsbGJhY2s7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmIChjdXJyZW50VGFzayA9PT0gcGVlayh0YXNrUXVldWUpKSB7XG4gICAgICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcCh0YXNrUXVldWUpO1xuICAgIH1cblxuICAgIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuICB9IC8vIFJldHVybiB3aGV0aGVyIHRoZXJlJ3MgYWRkaXRpb25hbCB3b3JrXG5cblxuICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZmlyc3RUaW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIGZpcnN0VGltZXIuc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkocHJpb3JpdHlMZXZlbCwgZXZlbnRIYW5kbGVyKSB7XG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9uZXh0KGV2ZW50SGFuZGxlcikge1xuICB2YXIgcHJpb3JpdHlMZXZlbDtcblxuICBzd2l0Y2ggKGN1cnJlbnRQcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAvLyBTaGlmdCBkb3duIHRvIG5vcm1hbCBwcmlvcml0eVxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gQW55dGhpbmcgbG93ZXIgdGhhbiBub3JtYWwgcHJpb3JpdHkgc2hvdWxkIHJlbWFpbiBhdCB0aGUgY3VycmVudCBsZXZlbC5cbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZlbnRIYW5kbGVyKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfd3JhcENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIHZhciBwYXJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgcnVuV2l0aFByaW9yaXR5LCBpbmxpbmVkIGZvciBwZXJmb3JtYW5jZS5cbiAgICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwYXJlbnRQcmlvcml0eUxldmVsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgdmFyIHN0YXJ0VGltZTtcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwpIHtcbiAgICB2YXIgZGVsYXkgPSBvcHRpb25zLmRlbGF5O1xuXG4gICAgaWYgKHR5cGVvZiBkZWxheSA9PT0gJ251bWJlcicgJiYgZGVsYXkgPiAwKSB7XG4gICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZSArIGRlbGF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gIH1cblxuICB2YXIgdGltZW91dDtcblxuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IElNTUVESUFURV9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSURMRV9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IExPV19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgIGRlZmF1bHQ6XG4gICAgICB0aW1lb3V0ID0gTk9STUFMX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBleHBpcmF0aW9uVGltZSA9IHN0YXJ0VGltZSArIHRpbWVvdXQ7XG4gIHZhciBuZXdUYXNrID0ge1xuICAgIGlkOiB0YXNrSWRDb3VudGVyKyssXG4gICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgIHByaW9yaXR5TGV2ZWw6IHByaW9yaXR5TGV2ZWwsXG4gICAgc3RhcnRUaW1lOiBzdGFydFRpbWUsXG4gICAgZXhwaXJhdGlvblRpbWU6IGV4cGlyYXRpb25UaW1lLFxuICAgIHNvcnRJbmRleDogLTFcbiAgfTtcblxuICBpZiAoc3RhcnRUaW1lID4gY3VycmVudFRpbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZGVsYXllZCB0YXNrLlxuICAgIG5ld1Rhc2suc29ydEluZGV4ID0gc3RhcnRUaW1lO1xuICAgIHB1c2godGltZXJRdWV1ZSwgbmV3VGFzayk7XG5cbiAgICBpZiAocGVlayh0YXNrUXVldWUpID09PSBudWxsICYmIG5ld1Rhc2sgPT09IHBlZWsodGltZXJRdWV1ZSkpIHtcbiAgICAgIC8vIEFsbCB0YXNrcyBhcmUgZGVsYXllZCwgYW5kIHRoaXMgaXMgdGhlIHRhc2sgd2l0aCB0aGUgZWFybGllc3QgZGVsYXkuXG4gICAgICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgICAgICAvLyBDYW5jZWwgYW4gZXhpc3RpbmcgdGltZW91dC5cbiAgICAgICAgY2FuY2VsSG9zdFRpbWVvdXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgfSAvLyBTY2hlZHVsZSBhIHRpbWVvdXQuXG5cblxuICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIHN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBleHBpcmF0aW9uVGltZTtcbiAgICBwdXNoKHRhc2tRdWV1ZSwgbmV3VGFzayk7XG4gICAgLy8gd2FpdCB1bnRpbCB0aGUgbmV4dCB0aW1lIHdlIHlpZWxkLlxuXG5cbiAgICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkICYmICFpc1BlcmZvcm1pbmdXb3JrKSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld1Rhc2s7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uKCkge1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbigpIHtcblxuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkICYmICFpc1BlcmZvcm1pbmdXb3JrKSB7XG4gICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSgpIHtcbiAgcmV0dXJuIHBlZWsodGFza1F1ZXVlKTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sodGFzaykge1xuICAvLyByZW1vdmUgZnJvbSB0aGUgcXVldWUgYmVjYXVzZSB5b3UgY2FuJ3QgcmVtb3ZlIGFyYml0cmFyeSBub2RlcyBmcm9tIGFuXG4gIC8vIGFycmF5IGJhc2VkIGhlYXAsIG9ubHkgdGhlIGZpcnN0IG9uZS4pXG5cblxuICB0YXNrLmNhbGxiYWNrID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7XG4gIHJldHVybiBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbn1cblxudmFyIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG52YXIgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDtcbnZhciB0YXNrVGltZW91dElEID0gLTE7IC8vIFNjaGVkdWxlciBwZXJpb2RpY2FsbHkgeWllbGRzIGluIGNhc2UgdGhlcmUgaXMgb3RoZXIgd29yayBvbiB0aGUgbWFpblxuLy8gdGhyZWFkLCBsaWtlIHVzZXIgZXZlbnRzLiBCeSBkZWZhdWx0LCBpdCB5aWVsZHMgbXVsdGlwbGUgdGltZXMgcGVyIGZyYW1lLlxuLy8gSXQgZG9lcyBub3QgYXR0ZW1wdCB0byBhbGlnbiB3aXRoIGZyYW1lIGJvdW5kYXJpZXMsIHNpbmNlIG1vc3QgdGFza3MgZG9uJ3Rcbi8vIG5lZWQgdG8gYmUgZnJhbWUgYWxpZ25lZDsgZm9yIHRob3NlIHRoYXQgZG8sIHVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXG5cbnZhciBmcmFtZUludGVydmFsID0gZnJhbWVZaWVsZE1zO1xudmFyIHN0YXJ0VGltZSA9IC0xO1xuXG5mdW5jdGlvbiBzaG91bGRZaWVsZFRvSG9zdCgpIHtcbiAgdmFyIHRpbWVFbGFwc2VkID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKSAtIHN0YXJ0VGltZTtcblxuICBpZiAodGltZUVsYXBzZWQgPCBmcmFtZUludGVydmFsKSB7XG4gICAgLy8gVGhlIG1haW4gdGhyZWFkIGhhcyBvbmx5IGJlZW4gYmxvY2tlZCBmb3IgYSByZWFsbHkgc2hvcnQgYW1vdW50IG9mIHRpbWU7XG4gICAgLy8gc21hbGxlciB0aGFuIGEgc2luZ2xlIGZyYW1lLiBEb24ndCB5aWVsZCB5ZXQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIFRoZSBtYWluIHRocmVhZCBoYXMgYmVlbiBibG9ja2VkIGZvciBhIG5vbi1uZWdsaWdpYmxlIGFtb3VudCBvZiB0aW1lLiBXZVxuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RQYWludCgpIHtcblxufVxuXG5mdW5jdGlvbiBmb3JjZUZyYW1lUmF0ZShmcHMpIHtcbiAgaWYgKGZwcyA8IDAgfHwgZnBzID4gMTI1KSB7XG4gICAgLy8gVXNpbmcgY29uc29sZVsnZXJyb3InXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG4gICAgY29uc29sZVsnZXJyb3InXSgnZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsICcgKyAnZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZnBzID4gMCkge1xuICAgIGZyYW1lSW50ZXJ2YWwgPSBNYXRoLmZsb29yKDEwMDAgLyBmcHMpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlc2V0IHRoZSBmcmFtZXJhdGVcbiAgICBmcmFtZUludGVydmFsID0gZnJhbWVZaWVsZE1zO1xuICB9XG59XG5cbnZhciBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydCB0aW1lIHNvIHdlIGNhbiBtZWFzdXJlIGhvdyBsb25nIHRoZSBtYWluIHRocmVhZFxuICAgIC8vIGhhcyBiZWVuIGJsb2NrZWQuXG5cbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICB2YXIgaGFzVGltZVJlbWFpbmluZyA9IHRydWU7IC8vIElmIGEgc2NoZWR1bGVyIHRhc2sgdGhyb3dzLCBleGl0IHRoZSBjdXJyZW50IGJyb3dzZXIgdGFzayBzbyB0aGVcbiAgICAvLyBlcnJvciBjYW4gYmUgb2JzZXJ2ZWQuXG4gICAgLy9cbiAgICAvLyBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBhIHRyeS1jYXRjaCwgc2luY2UgdGhhdCBtYWtlcyBzb21lIGRlYnVnZ2luZ1xuICAgIC8vIHRlY2huaXF1ZXMgaGFyZGVyLiBJbnN0ZWFkLCBpZiBgc2NoZWR1bGVkSG9zdENhbGxiYWNrYCBlcnJvcnMsIHRoZW5cbiAgICAvLyBgaGFzTW9yZVdvcmtgIHdpbGwgcmVtYWluIHRydWUsIGFuZCB3ZSdsbCBjb250aW51ZSB0aGUgd29yayBsb29wLlxuXG4gICAgdmFyIGhhc01vcmVXb3JrID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBoYXNNb3JlV29yayA9IHNjaGVkdWxlZEhvc3RDYWxsYmFjayhoYXNUaW1lUmVtYWluaW5nLCBjdXJyZW50VGltZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChoYXNNb3JlV29yaykge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgd29yaywgc2NoZWR1bGUgdGhlIG5leHQgbWVzc2FnZSBldmVudCBhdCB0aGUgZW5kXG4gICAgICAgIC8vIG9mIHRoZSBwcmVjZWRpbmcgb25lLlxuICAgICAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgfSAvLyBZaWVsZGluZyB0byB0aGUgYnJvd3NlciB3aWxsIGdpdmUgaXQgYSBjaGFuY2UgdG8gcGFpbnQsIHNvIHdlIGNhblxufTtcblxudmFyIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuXG5pZiAodHlwZW9mIGxvY2FsU2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIE5vZGUuanMgYW5kIG9sZCBJRS5cbiAgLy8gVGhlcmUncyBhIGZldyByZWFzb25zIGZvciB3aHkgd2UgcHJlZmVyIHNldEltbWVkaWF0ZS5cbiAgLy9cbiAgLy8gVW5saWtlIE1lc3NhZ2VDaGFubmVsLCBpdCBkb2Vzbid0IHByZXZlbnQgYSBOb2RlLmpzIHByb2Nlc3MgZnJvbSBleGl0aW5nLlxuICAvLyAoRXZlbiB0aG91Z2ggdGhpcyBpcyBhIERPTSBmb3JrIG9mIHRoZSBTY2hlZHVsZXIsIHlvdSBjb3VsZCBnZXQgaGVyZVxuICAvLyB3aXRoIGEgbWl4IG9mIE5vZGUuanMgMTUrLCB3aGljaCBoYXMgYSBNZXNzYWdlQ2hhbm5lbCwgYW5kIGpzZG9tLilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMDc1NlxuICAvL1xuICAvLyBCdXQgYWxzbywgaXQgcnVucyBlYXJsaWVyIHdoaWNoIGlzIHRoZSBzZW1hbnRpYyB3ZSB3YW50LlxuICAvLyBJZiBvdGhlciBicm93c2VycyBldmVyIGltcGxlbWVudCBpdCwgaXQncyBiZXR0ZXIgdG8gdXNlIGl0LlxuICAvLyBBbHRob3VnaCBib3RoIG9mIHRoZXNlIHdvdWxkIGJlIGluZmVyaW9yIHRvIG5hdGl2ZSBzY2hlZHVsaW5nLlxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldEltbWVkaWF0ZShwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUpO1xuICB9O1xufSBlbHNlIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIERPTSBhbmQgV29ya2VyIGVudmlyb25tZW50cy5cbiAgLy8gV2UgcHJlZmVyIE1lc3NhZ2VDaGFubmVsIGJlY2F1c2Ugb2YgdGhlIDRtcyBzZXRUaW1lb3V0IGNsYW1waW5nLlxuICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICB2YXIgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIHBvcnQucG9zdE1lc3NhZ2UobnVsbCk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBXZSBzaG91bGQgb25seSBmYWxsYmFjayBoZXJlIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbG9jYWxTZXRUaW1lb3V0KHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSwgMCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIb3N0Q2FsbGJhY2soY2FsbGJhY2spIHtcbiAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgaWYgKCFpc01lc3NhZ2VMb29wUnVubmluZykge1xuICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gdHJ1ZTtcbiAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIb3N0VGltZW91dChjYWxsYmFjaywgbXMpIHtcbiAgdGFza1RpbWVvdXRJRCA9IGxvY2FsU2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgY2FsbGJhY2soZXhwb3J0cy51bnN0YWJsZV9ub3coKSk7XG4gIH0sIG1zKTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsSG9zdFRpbWVvdXQoKSB7XG4gIGxvY2FsQ2xlYXJUaW1lb3V0KHRhc2tUaW1lb3V0SUQpO1xuICB0YXNrVGltZW91dElEID0gLTE7XG59XG5cbnZhciB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSByZXF1ZXN0UGFpbnQ7XG52YXIgdW5zdGFibGVfUHJvZmlsaW5nID0gIG51bGw7XG5cbmV4cG9ydHMudW5zdGFibGVfSWRsZVByaW9yaXR5ID0gSWRsZVByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSA9IEltbWVkaWF0ZVByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eSA9IExvd1ByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmcgPSB1bnN0YWJsZV9Qcm9maWxpbmc7XG5leHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5ID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrID0gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uID0gdW5zdGFibGVfY29udGludWVFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlID0gZm9yY2VGcmFtZVJhdGU7XG5leHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsID0gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw7XG5leHBvcnRzLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlID0gdW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU7XG5leHBvcnRzLnVuc3RhYmxlX25leHQgPSB1bnN0YWJsZV9uZXh0O1xuZXhwb3J0cy51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbiA9IHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQ7XG5leHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSA9IHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayA9IHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkID0gc2hvdWxkWWllbGRUb0hvc3Q7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjayA9IHVuc3RhYmxlX3dyYXBDYWxsYmFjaztcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRHJhZ2dhYmxlQ29yZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfRHJhZ2dhYmxlQ29yZS5kZWZhdWx0O1xuICB9XG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX3Byb3BUeXBlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xudmFyIF9yZWFjdERvbSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0LWRvbVwiKSk7XG52YXIgX2Nsc3ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbHN4XCIpKTtcbnZhciBfZG9tRm5zID0gcmVxdWlyZShcIi4vdXRpbHMvZG9tRm5zXCIpO1xudmFyIF9wb3NpdGlvbkZucyA9IHJlcXVpcmUoXCIuL3V0aWxzL3Bvc2l0aW9uRm5zXCIpO1xudmFyIF9zaGltcyA9IHJlcXVpcmUoXCIuL3V0aWxzL3NoaW1zXCIpO1xudmFyIF9EcmFnZ2FibGVDb3JlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9EcmFnZ2FibGVDb3JlXCIpKTtcbnZhciBfbG9nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dGlscy9sb2dcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaiwgbm9kZUludGVyb3ApIHsgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9IC8qOjogaW1wb3J0IHR5cGUge0NvbnRyb2xQb3NpdGlvbiwgUG9zaXRpb25PZmZzZXRDb250cm9sUG9zaXRpb24sIERyYWdnYWJsZUNvcmVQcm9wcywgRHJhZ2dhYmxlQ29yZURlZmF1bHRQcm9wc30gZnJvbSAnLi9EcmFnZ2FibGVDb3JlJzsqL1xuLyo6OiBpbXBvcnQgdHlwZSB7Qm91bmRzLCBEcmFnZ2FibGVFdmVudEhhbmRsZXJ9IGZyb20gJy4vdXRpbHMvdHlwZXMnOyovXG4vKjo6IGltcG9ydCB0eXBlIHtFbGVtZW50IGFzIFJlYWN0RWxlbWVudH0gZnJvbSAncmVhY3QnOyovXG4vKjo6IHR5cGUgRHJhZ2dhYmxlU3RhdGUgPSB7XG4gIGRyYWdnaW5nOiBib29sZWFuLFxuICBkcmFnZ2VkOiBib29sZWFuLFxuICB4OiBudW1iZXIsIHk6IG51bWJlcixcbiAgc2xhY2tYOiBudW1iZXIsIHNsYWNrWTogbnVtYmVyLFxuICBpc0VsZW1lbnRTVkc6IGJvb2xlYW4sXG4gIHByZXZQcm9wc1Bvc2l0aW9uOiA/Q29udHJvbFBvc2l0aW9uLFxufTsqL1xuLyo6OiBleHBvcnQgdHlwZSBEcmFnZ2FibGVEZWZhdWx0UHJvcHMgPSB7XG4gIC4uLkRyYWdnYWJsZUNvcmVEZWZhdWx0UHJvcHMsXG4gIGF4aXM6ICdib3RoJyB8ICd4JyB8ICd5JyB8ICdub25lJyxcbiAgYm91bmRzOiBCb3VuZHMgfCBzdHJpbmcgfCBmYWxzZSxcbiAgZGVmYXVsdENsYXNzTmFtZTogc3RyaW5nLFxuICBkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dpbmc6IHN0cmluZyxcbiAgZGVmYXVsdENsYXNzTmFtZURyYWdnZWQ6IHN0cmluZyxcbiAgZGVmYXVsdFBvc2l0aW9uOiBDb250cm9sUG9zaXRpb24sXG4gIHNjYWxlOiBudW1iZXIsXG59OyovXG4vKjo6IGV4cG9ydCB0eXBlIERyYWdnYWJsZVByb3BzID0ge1xuICAuLi5EcmFnZ2FibGVDb3JlUHJvcHMsXG4gIC4uLkRyYWdnYWJsZURlZmF1bHRQcm9wcyxcbiAgcG9zaXRpb25PZmZzZXQ6IFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uLFxuICBwb3NpdGlvbjogQ29udHJvbFBvc2l0aW9uLFxufTsqL1xuLy9cbi8vIERlZmluZSA8RHJhZ2dhYmxlPlxuLy9cbmNsYXNzIERyYWdnYWJsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCAvKjo6IDxEcmFnZ2FibGVQcm9wcywgRHJhZ2dhYmxlU3RhdGU+Ki97XG4gIC8vIFJlYWN0IDE2LjMrXG4gIC8vIEFyaXR5IChwcm9wcywgc3RhdGUpXG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoX3JlZiAvKjo6ICovLCBfcmVmMiAvKjo6ICovKSAvKjogP1BhcnRpYWw8RHJhZ2dhYmxlU3RhdGU+Ki97XG4gICAgbGV0IHtcbiAgICAgIHBvc2l0aW9uXG4gICAgfSAvKjogRHJhZ2dhYmxlUHJvcHMqLyA9IF9yZWYgLyo6IERyYWdnYWJsZVByb3BzKi87XG4gICAgbGV0IHtcbiAgICAgIHByZXZQcm9wc1Bvc2l0aW9uXG4gICAgfSAvKjogRHJhZ2dhYmxlU3RhdGUqLyA9IF9yZWYyIC8qOiBEcmFnZ2FibGVTdGF0ZSovO1xuICAgIC8vIFNldCB4L3kgaWYgYSBuZXcgcG9zaXRpb24gaXMgcHJvdmlkZWQgaW4gcHJvcHMgdGhhdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgcHJldmlvdXMuXG4gICAgaWYgKHBvc2l0aW9uICYmICghcHJldlByb3BzUG9zaXRpb24gfHwgcG9zaXRpb24ueCAhPT0gcHJldlByb3BzUG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ICE9PSBwcmV2UHJvcHNQb3NpdGlvbi55KSkge1xuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZTogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICVqJywge1xuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgcHJldlByb3BzUG9zaXRpb25cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcG9zaXRpb24ueCxcbiAgICAgICAgeTogcG9zaXRpb24ueSxcbiAgICAgICAgcHJldlByb3BzUG9zaXRpb246IHtcbiAgICAgICAgICAuLi5wb3NpdGlvblxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdHJ1Y3Rvcihwcm9wcyAvKjogRHJhZ2dhYmxlUHJvcHMqLykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvbkRyYWdTdGFydFwiLCAoZSwgY29yZURhdGEpID0+IHtcbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGU6IG9uRHJhZ1N0YXJ0OiAlaicsIGNvcmVEYXRhKTtcblxuICAgICAgLy8gU2hvcnQtY2lyY3VpdCBpZiB1c2VyJ3MgY2FsbGJhY2sga2lsbGVkIGl0LlxuICAgICAgY29uc3Qgc2hvdWxkU3RhcnQgPSB0aGlzLnByb3BzLm9uU3RhcnQoZSwgKDAsIF9wb3NpdGlvbkZucy5jcmVhdGVEcmFnZ2FibGVEYXRhKSh0aGlzLCBjb3JlRGF0YSkpO1xuICAgICAgLy8gS2lsbHMgc3RhcnQgZXZlbnQgb24gY29yZSBhcyB3ZWxsLCBzbyBtb3ZlIGhhbmRsZXJzIGFyZSBuZXZlciBib3VuZC5cbiAgICAgIGlmIChzaG91bGRTdGFydCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZzogdHJ1ZSxcbiAgICAgICAgZHJhZ2dlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25EcmFnXCIsIChlLCBjb3JlRGF0YSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnN0YXRlLmRyYWdnaW5nKSByZXR1cm4gZmFsc2U7XG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlOiBvbkRyYWc6ICVqJywgY29yZURhdGEpO1xuICAgICAgY29uc3QgdWlEYXRhID0gKDAsIF9wb3NpdGlvbkZucy5jcmVhdGVEcmFnZ2FibGVEYXRhKSh0aGlzLCBjb3JlRGF0YSk7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgeDogdWlEYXRhLngsXG4gICAgICAgIHk6IHVpRGF0YS55LFxuICAgICAgICBzbGFja1g6IDAsXG4gICAgICAgIHNsYWNrWTogMFxuICAgICAgfTtcblxuICAgICAgLy8gS2VlcCB3aXRoaW4gYm91bmRzLlxuICAgICAgaWYgKHRoaXMucHJvcHMuYm91bmRzKSB7XG4gICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgeCBhbmQgeS5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHgsXG4gICAgICAgICAgeVxuICAgICAgICB9ID0gbmV3U3RhdGU7XG5cbiAgICAgICAgLy8gQWRkIHNsYWNrIHRvIHRoZSB2YWx1ZXMgdXNlZCB0byBjYWxjdWxhdGUgYm91bmQgcG9zaXRpb24uIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCBpZlxuICAgICAgICAvLyB3ZSBzdGFydCByZW1vdmluZyBzbGFjaywgdGhlIGVsZW1lbnQgd29uJ3QgcmVhY3QgdG8gaXQgcmlnaHQgYXdheSB1bnRpbCBpdCdzIGJlZW5cbiAgICAgICAgLy8gY29tcGxldGVseSByZW1vdmVkLlxuICAgICAgICBuZXdTdGF0ZS54ICs9IHRoaXMuc3RhdGUuc2xhY2tYO1xuICAgICAgICBuZXdTdGF0ZS55ICs9IHRoaXMuc3RhdGUuc2xhY2tZO1xuXG4gICAgICAgIC8vIEdldCBib3VuZCBwb3NpdGlvbi4gVGhpcyB3aWxsIGNlaWwvZmxvb3IgdGhlIHggYW5kIHkgd2l0aGluIHRoZSBib3VuZGFyaWVzLlxuICAgICAgICBjb25zdCBbbmV3U3RhdGVYLCBuZXdTdGF0ZVldID0gKDAsIF9wb3NpdGlvbkZucy5nZXRCb3VuZFBvc2l0aW9uKSh0aGlzLCBuZXdTdGF0ZS54LCBuZXdTdGF0ZS55KTtcbiAgICAgICAgbmV3U3RhdGUueCA9IG5ld1N0YXRlWDtcbiAgICAgICAgbmV3U3RhdGUueSA9IG5ld1N0YXRlWTtcblxuICAgICAgICAvLyBSZWNhbGN1bGF0ZSBzbGFjayBieSBub3RpbmcgaG93IG11Y2ggd2FzIHNoYXZlZCBieSB0aGUgYm91bmRQb3NpdGlvbiBoYW5kbGVyLlxuICAgICAgICBuZXdTdGF0ZS5zbGFja1ggPSB0aGlzLnN0YXRlLnNsYWNrWCArICh4IC0gbmV3U3RhdGUueCk7XG4gICAgICAgIG5ld1N0YXRlLnNsYWNrWSA9IHRoaXMuc3RhdGUuc2xhY2tZICsgKHkgLSBuZXdTdGF0ZS55KTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIGV2ZW50IHdlIGZpcmUgdG8gcmVmbGVjdCB3aGF0IHJlYWxseSBoYXBwZW5lZCBhZnRlciBib3VuZHMgdG9vayBlZmZlY3QuXG4gICAgICAgIHVpRGF0YS54ID0gbmV3U3RhdGUueDtcbiAgICAgICAgdWlEYXRhLnkgPSBuZXdTdGF0ZS55O1xuICAgICAgICB1aURhdGEuZGVsdGFYID0gbmV3U3RhdGUueCAtIHRoaXMuc3RhdGUueDtcbiAgICAgICAgdWlEYXRhLmRlbHRhWSA9IG5ld1N0YXRlLnkgLSB0aGlzLnN0YXRlLnk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3J0LWNpcmN1aXQgaWYgdXNlcidzIGNhbGxiYWNrIGtpbGxlZCBpdC5cbiAgICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9IHRoaXMucHJvcHMub25EcmFnKGUsIHVpRGF0YSk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25EcmFnU3RvcFwiLCAoZSwgY29yZURhdGEpID0+IHtcbiAgICAgIGlmICghdGhpcy5zdGF0ZS5kcmFnZ2luZykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBTaG9ydC1jaXJjdWl0IGlmIHVzZXIncyBjYWxsYmFjayBraWxsZWQgaXQuXG4gICAgICBjb25zdCBzaG91bGRDb250aW51ZSA9IHRoaXMucHJvcHMub25TdG9wKGUsICgwLCBfcG9zaXRpb25GbnMuY3JlYXRlRHJhZ2dhYmxlRGF0YSkodGhpcywgY29yZURhdGEpKTtcbiAgICAgIGlmIChzaG91bGRDb250aW51ZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGU6IG9uRHJhZ1N0b3A6ICVqJywgY29yZURhdGEpO1xuICAgICAgY29uc3QgbmV3U3RhdGUgLyo6IFBhcnRpYWw8RHJhZ2dhYmxlU3RhdGU+Ki8gPSB7XG4gICAgICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICAgICAgc2xhY2tYOiAwLFxuICAgICAgICBzbGFja1k6IDBcbiAgICAgIH07XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgYSBjb250cm9sbGVkIGNvbXBvbmVudCwgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbiB3aWxsIGJlIHRvXG4gICAgICAvLyByZXZlcnQgYmFjayB0byB0aGUgb2xkIHBvc2l0aW9uLiBXZSBleHBlY3QgYSBoYW5kbGVyIG9uIGBvbkRyYWdTdG9wYCwgYXQgdGhlIGxlYXN0LlxuICAgICAgY29uc3QgY29udHJvbGxlZCA9IEJvb2xlYW4odGhpcy5wcm9wcy5wb3NpdGlvbik7XG4gICAgICBpZiAoY29udHJvbGxlZCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeCxcbiAgICAgICAgICB5XG4gICAgICAgIH0gPSB0aGlzLnByb3BzLnBvc2l0aW9uO1xuICAgICAgICBuZXdTdGF0ZS54ID0geDtcbiAgICAgICAgbmV3U3RhdGUueSA9IHk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgLy8gV2hldGhlciBvciBub3Qgd2UgYXJlIGN1cnJlbnRseSBkcmFnZ2luZy5cbiAgICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGhhdmUgYmVlbiBkcmFnZ2VkIGJlZm9yZS5cbiAgICAgIGRyYWdnZWQ6IGZhbHNlLFxuICAgICAgLy8gQ3VycmVudCB0cmFuc2Zvcm0geCBhbmQgeS5cbiAgICAgIHg6IHByb3BzLnBvc2l0aW9uID8gcHJvcHMucG9zaXRpb24ueCA6IHByb3BzLmRlZmF1bHRQb3NpdGlvbi54LFxuICAgICAgeTogcHJvcHMucG9zaXRpb24gPyBwcm9wcy5wb3NpdGlvbi55IDogcHJvcHMuZGVmYXVsdFBvc2l0aW9uLnksXG4gICAgICBwcmV2UHJvcHNQb3NpdGlvbjoge1xuICAgICAgICAuLi5wcm9wcy5wb3NpdGlvblxuICAgICAgfSxcbiAgICAgIC8vIFVzZWQgZm9yIGNvbXBlbnNhdGluZyBmb3Igb3V0LW9mLWJvdW5kcyBkcmFnc1xuICAgICAgc2xhY2tYOiAwLFxuICAgICAgc2xhY2tZOiAwLFxuICAgICAgLy8gQ2FuIG9ubHkgZGV0ZXJtaW5lIGlmIFNWRyBhZnRlciBtb3VudGluZ1xuICAgICAgaXNFbGVtZW50U1ZHOiBmYWxzZVxuICAgIH07XG4gICAgaWYgKHByb3BzLnBvc2l0aW9uICYmICEocHJvcHMub25EcmFnIHx8IHByb3BzLm9uU3RvcCkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ0EgYHBvc2l0aW9uYCB3YXMgYXBwbGllZCB0byB0aGlzIDxEcmFnZ2FibGU+LCB3aXRob3V0IGRyYWcgaGFuZGxlcnMuIFRoaXMgd2lsbCBtYWtlIHRoaXMgJyArICdjb21wb25lbnQgZWZmZWN0aXZlbHkgdW5kcmFnZ2FibGUuIFBsZWFzZSBhdHRhY2ggYG9uRHJhZ2Agb3IgYG9uU3RvcGAgaGFuZGxlcnMgc28geW91IGNhbiBhZGp1c3QgdGhlICcgKyAnYHBvc2l0aW9uYCBvZiB0aGlzIGVsZW1lbnQuJyk7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgZWxlbWVudCBwYXNzZWQgaXMgYW4gaW5zdGFuY2VvZiBTVkdFbGVtZW50XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuU1ZHRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5maW5kRE9NTm9kZSgpIGluc3RhbmNlb2Ygd2luZG93LlNWR0VsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0VsZW1lbnRTVkc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRyYWdnaW5nOiBmYWxzZVxuICAgIH0pOyAvLyBwcmV2ZW50cyBpbnZhcmlhbnQgaWYgdW5tb3VudGVkIHdoaWxlIGRyYWdnaW5nXG4gIH1cblxuICAvLyBSZWFjdCBTdHJpY3QgTW9kZSBjb21wYXRpYmlsaXR5OiBpZiBgbm9kZVJlZmAgaXMgcGFzc2VkLCB3ZSB3aWxsIHVzZSBpdCBpbnN0ZWFkIG9mIHRyeWluZyB0byBmaW5kXG4gIC8vIHRoZSB1bmRlcmx5aW5nIERPTSBub2RlIG91cnNlbHZlcy4gU2VlIHRoZSBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gIGZpbmRET01Ob2RlKCkgLyo6ID9IVE1MRWxlbWVudCove1xuICAgIHZhciBfdGhpcyRwcm9wcyRub2RlUmVmJGMsIF90aGlzJHByb3BzO1xuICAgIHJldHVybiAoX3RoaXMkcHJvcHMkbm9kZVJlZiRjID0gKF90aGlzJHByb3BzID0gdGhpcy5wcm9wcykgPT09IG51bGwgfHwgX3RoaXMkcHJvcHMgPT09IHZvaWQgMCB8fCAoX3RoaXMkcHJvcHMgPSBfdGhpcyRwcm9wcy5ub2RlUmVmKSA9PT0gbnVsbCB8fCBfdGhpcyRwcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcHJvcHMuY3VycmVudCkgIT09IG51bGwgJiYgX3RoaXMkcHJvcHMkbm9kZVJlZiRjICE9PSB2b2lkIDAgPyBfdGhpcyRwcm9wcyRub2RlUmVmJGMgOiBfcmVhY3REb20uZGVmYXVsdC5maW5kRE9NTm9kZSh0aGlzKTtcbiAgfVxuICByZW5kZXIoKSAvKjogUmVhY3RFbGVtZW50PGFueT4qL3tcbiAgICBjb25zdCB7XG4gICAgICBheGlzLFxuICAgICAgYm91bmRzLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBkZWZhdWx0UG9zaXRpb24sXG4gICAgICBkZWZhdWx0Q2xhc3NOYW1lLFxuICAgICAgZGVmYXVsdENsYXNzTmFtZURyYWdnaW5nLFxuICAgICAgZGVmYXVsdENsYXNzTmFtZURyYWdnZWQsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIHBvc2l0aW9uT2Zmc2V0LFxuICAgICAgc2NhbGUsXG4gICAgICAuLi5kcmFnZ2FibGVDb3JlUHJvcHNcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQgc3R5bGUgPSB7fTtcbiAgICBsZXQgc3ZnVHJhbnNmb3JtID0gbnVsbDtcblxuICAgIC8vIElmIHRoaXMgaXMgY29udHJvbGxlZCwgd2UgZG9uJ3Qgd2FudCB0byBtb3ZlIGl0IC0gdW5sZXNzIGl0J3MgZHJhZ2dpbmcuXG4gICAgY29uc3QgY29udHJvbGxlZCA9IEJvb2xlYW4ocG9zaXRpb24pO1xuICAgIGNvbnN0IGRyYWdnYWJsZSA9ICFjb250cm9sbGVkIHx8IHRoaXMuc3RhdGUuZHJhZ2dpbmc7XG4gICAgY29uc3QgdmFsaWRQb3NpdGlvbiA9IHBvc2l0aW9uIHx8IGRlZmF1bHRQb3NpdGlvbjtcbiAgICBjb25zdCB0cmFuc2Zvcm1PcHRzID0ge1xuICAgICAgLy8gU2V0IGxlZnQgaWYgaG9yaXpvbnRhbCBkcmFnIGlzIGVuYWJsZWRcbiAgICAgIHg6ICgwLCBfcG9zaXRpb25GbnMuY2FuRHJhZ1gpKHRoaXMpICYmIGRyYWdnYWJsZSA/IHRoaXMuc3RhdGUueCA6IHZhbGlkUG9zaXRpb24ueCxcbiAgICAgIC8vIFNldCB0b3AgaWYgdmVydGljYWwgZHJhZyBpcyBlbmFibGVkXG4gICAgICB5OiAoMCwgX3Bvc2l0aW9uRm5zLmNhbkRyYWdZKSh0aGlzKSAmJiBkcmFnZ2FibGUgPyB0aGlzLnN0YXRlLnkgOiB2YWxpZFBvc2l0aW9uLnlcbiAgICB9O1xuXG4gICAgLy8gSWYgdGhpcyBlbGVtZW50IHdhcyBTVkcsIHdlIHVzZSB0aGUgYHRyYW5zZm9ybWAgYXR0cmlidXRlLlxuICAgIGlmICh0aGlzLnN0YXRlLmlzRWxlbWVudFNWRykge1xuICAgICAgc3ZnVHJhbnNmb3JtID0gKDAsIF9kb21GbnMuY3JlYXRlU1ZHVHJhbnNmb3JtKSh0cmFuc2Zvcm1PcHRzLCBwb3NpdGlvbk9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCBhIENTUyB0cmFuc2Zvcm0gdG8gbW92ZSB0aGUgZWxlbWVudCBhcm91bmQuIFRoaXMgYWxsb3dzIHVzIHRvIG1vdmUgdGhlIGVsZW1lbnQgYXJvdW5kXG4gICAgICAvLyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHdoZXRoZXIgb3Igbm90IGl0IGlzIHJlbGF0aXZlbHkgb3IgYWJzb2x1dGVseSBwb3NpdGlvbmVkLlxuICAgICAgLy8gSWYgdGhlIGl0ZW0geW91IGFyZSBkcmFnZ2luZyBhbHJlYWR5IGhhcyBhIHRyYW5zZm9ybSBzZXQsIHdyYXAgaXQgaW4gYSA8c3Bhbj4gc28gPERyYWdnYWJsZT5cbiAgICAgIC8vIGhhcyBhIGNsZWFuIHNsYXRlLlxuICAgICAgc3R5bGUgPSAoMCwgX2RvbUZucy5jcmVhdGVDU1NUcmFuc2Zvcm0pKHRyYW5zZm9ybU9wdHMsIHBvc2l0aW9uT2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyBNYXJrIHdpdGggY2xhc3Mgd2hpbGUgZHJhZ2dpbmdcbiAgICBjb25zdCBjbGFzc05hbWUgPSAoMCwgX2Nsc3guZGVmYXVsdCkoY2hpbGRyZW4ucHJvcHMuY2xhc3NOYW1lIHx8ICcnLCBkZWZhdWx0Q2xhc3NOYW1lLCB7XG4gICAgICBbZGVmYXVsdENsYXNzTmFtZURyYWdnaW5nXTogdGhpcy5zdGF0ZS5kcmFnZ2luZyxcbiAgICAgIFtkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dlZF06IHRoaXMuc3RhdGUuZHJhZ2dlZFxuICAgIH0pO1xuXG4gICAgLy8gUmV1c2UgdGhlIGNoaWxkIHByb3ZpZGVkXG4gICAgLy8gVGhpcyBtYWtlcyBpdCBmbGV4aWJsZSB0byB1c2Ugd2hhdGV2ZXIgZWxlbWVudCBpcyB3YW50ZWQgKGRpdiwgdWwsIGV0YylcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0RyYWdnYWJsZUNvcmUuZGVmYXVsdCwgX2V4dGVuZHMoe30sIGRyYWdnYWJsZUNvcmVQcm9wcywge1xuICAgICAgb25TdGFydDogdGhpcy5vbkRyYWdTdGFydCxcbiAgICAgIG9uRHJhZzogdGhpcy5vbkRyYWcsXG4gICAgICBvblN0b3A6IHRoaXMub25EcmFnU3RvcFxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIC4uLmNoaWxkcmVuLnByb3BzLnN0eWxlLFxuICAgICAgICAuLi5zdHlsZVxuICAgICAgfSxcbiAgICAgIHRyYW5zZm9ybTogc3ZnVHJhbnNmb3JtXG4gICAgfSkpO1xuICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBEcmFnZ2FibGU7XG5fZGVmaW5lUHJvcGVydHkoRHJhZ2dhYmxlLCBcImRpc3BsYXlOYW1lXCIsICdEcmFnZ2FibGUnKTtcbl9kZWZpbmVQcm9wZXJ0eShEcmFnZ2FibGUsIFwicHJvcFR5cGVzXCIsIHtcbiAgLy8gQWNjZXB0cyBhbGwgcHJvcHMgPERyYWdnYWJsZUNvcmU+IGFjY2VwdHMuXG4gIC4uLl9EcmFnZ2FibGVDb3JlLmRlZmF1bHQucHJvcFR5cGVzLFxuICAvKipcbiAgICogYGF4aXNgIGRldGVybWluZXMgd2hpY2ggYXhpcyB0aGUgZHJhZ2dhYmxlIGNhbiBtb3ZlLlxuICAgKlxuICAgKiAgTm90ZSB0aGF0IGFsbCBjYWxsYmFja3Mgd2lsbCBzdGlsbCByZXR1cm4gZGF0YSBhcyBub3JtYWwuIFRoaXMgb25seVxuICAgKiAgY29udHJvbHMgZmx1c2hpbmcgdG8gdGhlIERPTS5cbiAgICpcbiAgICogJ2JvdGgnIGFsbG93cyBtb3ZlbWVudCBob3Jpem9udGFsbHkgYW5kIHZlcnRpY2FsbHkuXG4gICAqICd4JyBsaW1pdHMgbW92ZW1lbnQgdG8gaG9yaXpvbnRhbCBheGlzLlxuICAgKiAneScgbGltaXRzIG1vdmVtZW50IHRvIHZlcnRpY2FsIGF4aXMuXG4gICAqICdub25lJyBsaW1pdHMgYWxsIG1vdmVtZW50LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byAnYm90aCcuXG4gICAqL1xuICBheGlzOiBfcHJvcFR5cGVzLmRlZmF1bHQub25lT2YoWydib3RoJywgJ3gnLCAneScsICdub25lJ10pLFxuICAvKipcbiAgICogYGJvdW5kc2AgZGV0ZXJtaW5lcyB0aGUgcmFuZ2Ugb2YgbW92ZW1lbnQgYXZhaWxhYmxlIHRvIHRoZSBlbGVtZW50LlxuICAgKiBBdmFpbGFibGUgdmFsdWVzIGFyZTpcbiAgICpcbiAgICogJ3BhcmVudCcgcmVzdHJpY3RzIG1vdmVtZW50IHdpdGhpbiB0aGUgRHJhZ2dhYmxlJ3MgcGFyZW50IG5vZGUuXG4gICAqXG4gICAqIEFsdGVybmF0aXZlbHksIHBhc3MgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzLCBhbGwgb2Ygd2hpY2ggYXJlIG9wdGlvbmFsOlxuICAgKlxuICAgKiB7bGVmdDogTEVGVF9CT1VORCwgcmlnaHQ6IFJJR0hUX0JPVU5ELCBib3R0b206IEJPVFRPTV9CT1VORCwgdG9wOiBUT1BfQk9VTkR9XG4gICAqXG4gICAqIEFsbCB2YWx1ZXMgYXJlIGluIHB4LlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogICBsZXQgQXBwID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICogICAgICAgICByZXR1cm4gKFxuICAgKiAgICAgICAgICAgIDxEcmFnZ2FibGUgYm91bmRzPXt7cmlnaHQ6IDMwMCwgYm90dG9tOiAzMDB9fT5cbiAgICogICAgICAgICAgICAgIDxkaXY+Q29udGVudDwvZGl2PlxuICAgKiAgICAgICAgICAgPC9EcmFnZ2FibGU+XG4gICAqICAgICAgICAgKTtcbiAgICogICAgICAgfVxuICAgKiAgIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGJvdW5kczogX3Byb3BUeXBlcy5kZWZhdWx0Lm9uZU9mVHlwZShbX3Byb3BUeXBlcy5kZWZhdWx0LnNoYXBlKHtcbiAgICBsZWZ0OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLFxuICAgIHJpZ2h0OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLFxuICAgIHRvcDogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlcixcbiAgICBib3R0b206IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXJcbiAgfSksIF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsIF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZihbZmFsc2VdKV0pLFxuICBkZWZhdWx0Q2xhc3NOYW1lOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICBkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dpbmc6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2VkOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICAvKipcbiAgICogYGRlZmF1bHRQb3NpdGlvbmAgc3BlY2lmaWVzIHRoZSB4IGFuZCB5IHRoYXQgdGhlIGRyYWdnZWQgaXRlbSBzaG91bGQgc3RhcnQgYXRcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganN4XG4gICAqICAgICAgbGV0IEFwcCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAqICAgICAgICAgICAgICByZXR1cm4gKFxuICAgKiAgICAgICAgICAgICAgICAgIDxEcmFnZ2FibGUgZGVmYXVsdFBvc2l0aW9uPXt7eDogMjUsIHk6IDI1fX0+XG4gICAqICAgICAgICAgICAgICAgICAgICAgIDxkaXY+SSBzdGFydCB3aXRoIHRyYW5zZm9ybVg6IDI1cHggYW5kIHRyYW5zZm9ybVk6IDI1cHg7PC9kaXY+XG4gICAqICAgICAgICAgICAgICAgICAgPC9EcmFnZ2FibGU+XG4gICAqICAgICAgICAgICAgICApO1xuICAgKiAgICAgICAgICB9XG4gICAqICAgICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZGVmYXVsdFBvc2l0aW9uOiBfcHJvcFR5cGVzLmRlZmF1bHQuc2hhcGUoe1xuICAgIHg6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsXG4gICAgeTogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlclxuICB9KSxcbiAgcG9zaXRpb25PZmZzZXQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5zaGFwZSh7XG4gICAgeDogX3Byb3BUeXBlcy5kZWZhdWx0Lm9uZU9mVHlwZShbX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlciwgX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZ10pLFxuICAgIHk6IF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZlR5cGUoW19wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsIF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmddKVxuICB9KSxcbiAgLyoqXG4gICAqIGBwb3NpdGlvbmAsIGlmIHByZXNlbnQsIGRlZmluZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQuXG4gICAqXG4gICAqICBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IGZvcm0gZWxlbWVudHMgaW4gUmVhY3Qgd29yayAtIGlmIG5vIGBwb3NpdGlvbmAgaXMgc3VwcGxpZWQsIHRoZSBjb21wb25lbnRcbiAgICogIGlzIHVuY29udHJvbGxlZC5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganN4XG4gICAqICAgICAgbGV0IEFwcCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAqICAgICAgICAgICAgICByZXR1cm4gKFxuICAgKiAgICAgICAgICAgICAgICAgIDxEcmFnZ2FibGUgcG9zaXRpb249e3t4OiAyNSwgeTogMjV9fT5cbiAgICogICAgICAgICAgICAgICAgICAgICAgPGRpdj5JIHN0YXJ0IHdpdGggdHJhbnNmb3JtWDogMjVweCBhbmQgdHJhbnNmb3JtWTogMjVweDs8L2Rpdj5cbiAgICogICAgICAgICAgICAgICAgICA8L0RyYWdnYWJsZT5cbiAgICogICAgICAgICAgICAgICk7XG4gICAqICAgICAgICAgIH1cbiAgICogICAgICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwb3NpdGlvbjogX3Byb3BUeXBlcy5kZWZhdWx0LnNoYXBlKHtcbiAgICB4OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLFxuICAgIHk6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXJcbiAgfSksXG4gIC8qKlxuICAgKiBUaGVzZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZWZpbmVkIG9uIHRoZSBjaGlsZCwgbm90IGhlcmUuXG4gICAqL1xuICBjbGFzc05hbWU6IF9zaGltcy5kb250U2V0TWUsXG4gIHN0eWxlOiBfc2hpbXMuZG9udFNldE1lLFxuICB0cmFuc2Zvcm06IF9zaGltcy5kb250U2V0TWVcbn0pO1xuX2RlZmluZVByb3BlcnR5KERyYWdnYWJsZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICAuLi5fRHJhZ2dhYmxlQ29yZS5kZWZhdWx0LmRlZmF1bHRQcm9wcyxcbiAgYXhpczogJ2JvdGgnLFxuICBib3VuZHM6IGZhbHNlLFxuICBkZWZhdWx0Q2xhc3NOYW1lOiAncmVhY3QtZHJhZ2dhYmxlJyxcbiAgZGVmYXVsdENsYXNzTmFtZURyYWdnaW5nOiAncmVhY3QtZHJhZ2dhYmxlLWRyYWdnaW5nJyxcbiAgZGVmYXVsdENsYXNzTmFtZURyYWdnZWQ6ICdyZWFjdC1kcmFnZ2FibGUtZHJhZ2dlZCcsXG4gIGRlZmF1bHRQb3NpdGlvbjoge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9LFxuICBzY2FsZTogMVxufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9wcm9wVHlwZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcbnZhciBfcmVhY3REb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xudmFyIF9kb21GbnMgPSByZXF1aXJlKFwiLi91dGlscy9kb21GbnNcIik7XG52YXIgX3Bvc2l0aW9uRm5zID0gcmVxdWlyZShcIi4vdXRpbHMvcG9zaXRpb25GbnNcIik7XG52YXIgX3NoaW1zID0gcmVxdWlyZShcIi4vdXRpbHMvc2hpbXNcIik7XG52YXIgX2xvZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXRpbHMvbG9nXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChrZXkgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHsgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpOyByZXR1cm4gdHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmICh0eXBlb2YgcmVzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7IH1cbi8qOjogaW1wb3J0IHR5cGUge0V2ZW50SGFuZGxlciwgTW91c2VUb3VjaEV2ZW50fSBmcm9tICcuL3V0aWxzL3R5cGVzJzsqL1xuLyo6OiBpbXBvcnQgdHlwZSB7RWxlbWVudCBhcyBSZWFjdEVsZW1lbnR9IGZyb20gJ3JlYWN0JzsqL1xuLy8gU2ltcGxlIGFic3RyYWN0aW9uIGZvciBkcmFnZ2luZyBldmVudHMgbmFtZXMuXG5jb25zdCBldmVudHNGb3IgPSB7XG4gIHRvdWNoOiB7XG4gICAgc3RhcnQ6ICd0b3VjaHN0YXJ0JyxcbiAgICBtb3ZlOiAndG91Y2htb3ZlJyxcbiAgICBzdG9wOiAndG91Y2hlbmQnXG4gIH0sXG4gIG1vdXNlOiB7XG4gICAgc3RhcnQ6ICdtb3VzZWRvd24nLFxuICAgIG1vdmU6ICdtb3VzZW1vdmUnLFxuICAgIHN0b3A6ICdtb3VzZXVwJ1xuICB9XG59O1xuXG4vLyBEZWZhdWx0IHRvIG1vdXNlIGV2ZW50cy5cbmxldCBkcmFnRXZlbnRGb3IgPSBldmVudHNGb3IubW91c2U7XG4vKjo6IGV4cG9ydCB0eXBlIERyYWdnYWJsZURhdGEgPSB7XG4gIG5vZGU6IEhUTUxFbGVtZW50LFxuICB4OiBudW1iZXIsIHk6IG51bWJlcixcbiAgZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyLFxuICBsYXN0WDogbnVtYmVyLCBsYXN0WTogbnVtYmVyLFxufTsqL1xuLyo6OiBleHBvcnQgdHlwZSBEcmFnZ2FibGVFdmVudEhhbmRsZXIgPSAoZTogTW91c2VFdmVudCwgZGF0YTogRHJhZ2dhYmxlRGF0YSkgPT4gdm9pZCB8IGZhbHNlOyovXG4vKjo6IGV4cG9ydCB0eXBlIENvbnRyb2xQb3NpdGlvbiA9IHt4OiBudW1iZXIsIHk6IG51bWJlcn07Ki9cbi8qOjogZXhwb3J0IHR5cGUgUG9zaXRpb25PZmZzZXRDb250cm9sUG9zaXRpb24gPSB7eDogbnVtYmVyfHN0cmluZywgeTogbnVtYmVyfHN0cmluZ307Ki9cbi8qOjogZXhwb3J0IHR5cGUgRHJhZ2dhYmxlQ29yZURlZmF1bHRQcm9wcyA9IHtcbiAgYWxsb3dBbnlDbGljazogYm9vbGVhbixcbiAgZGlzYWJsZWQ6IGJvb2xlYW4sXG4gIGVuYWJsZVVzZXJTZWxlY3RIYWNrOiBib29sZWFuLFxuICBvblN0YXJ0OiBEcmFnZ2FibGVFdmVudEhhbmRsZXIsXG4gIG9uRHJhZzogRHJhZ2dhYmxlRXZlbnRIYW5kbGVyLFxuICBvblN0b3A6IERyYWdnYWJsZUV2ZW50SGFuZGxlcixcbiAgb25Nb3VzZURvd246IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkLFxuICBzY2FsZTogbnVtYmVyLFxufTsqL1xuLyo6OiBleHBvcnQgdHlwZSBEcmFnZ2FibGVDb3JlUHJvcHMgPSB7XG4gIC4uLkRyYWdnYWJsZUNvcmVEZWZhdWx0UHJvcHMsXG4gIGNhbmNlbDogc3RyaW5nLFxuICBjaGlsZHJlbjogUmVhY3RFbGVtZW50PGFueT4sXG4gIG9mZnNldFBhcmVudDogSFRNTEVsZW1lbnQsXG4gIGdyaWQ6IFtudW1iZXIsIG51bWJlcl0sXG4gIGhhbmRsZTogc3RyaW5nLFxuICBub2RlUmVmPzogP1JlYWN0LkVsZW1lbnRSZWY8YW55Pixcbn07Ki9cbi8vXG4vLyBEZWZpbmUgPERyYWdnYWJsZUNvcmU+LlxuLy9cbi8vIDxEcmFnZ2FibGVDb3JlPiBpcyBmb3IgYWR2YW5jZWQgdXNhZ2Ugb2YgPERyYWdnYWJsZT4uIEl0IG1haW50YWlucyBtaW5pbWFsIGludGVybmFsIHN0YXRlIHNvIGl0IGNhblxuLy8gd29yayB3ZWxsIHdpdGggbGlicmFyaWVzIHRoYXQgcmVxdWlyZSBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgZWxlbWVudC5cbi8vXG5cbmNsYXNzIERyYWdnYWJsZUNvcmUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgLyo6OiA8RHJhZ2dhYmxlQ29yZVByb3BzPiove1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRyYWdnaW5nXCIsIGZhbHNlKTtcbiAgICAvLyBVc2VkIHdoaWxlIGRyYWdnaW5nIHRvIGRldGVybWluZSBkZWx0YXMuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibGFzdFhcIiwgTmFOKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJsYXN0WVwiLCBOYU4pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInRvdWNoSWRlbnRpZmllclwiLCBudWxsKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJtb3VudGVkXCIsIGZhbHNlKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJoYW5kbGVEcmFnU3RhcnRcIiwgZSA9PiB7XG4gICAgICAvLyBNYWtlIGl0IHBvc3NpYmxlIHRvIGF0dGFjaCBldmVudCBoYW5kbGVycyBvbiB0b3Agb2YgdGhpcyBvbmUuXG4gICAgICB0aGlzLnByb3BzLm9uTW91c2VEb3duKGUpO1xuXG4gICAgICAvLyBPbmx5IGFjY2VwdCBsZWZ0LWNsaWNrcy5cbiAgICAgIGlmICghdGhpcy5wcm9wcy5hbGxvd0FueUNsaWNrICYmIHR5cGVvZiBlLmJ1dHRvbiA9PT0gJ251bWJlcicgJiYgZS5idXR0b24gIT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gR2V0IG5vZGVzLiBCZSBzdXJlIHRvIGdyYWIgcmVsYXRpdmUgZG9jdW1lbnQgKGNvdWxkIGJlIGlmcmFtZWQpXG4gICAgICBjb25zdCB0aGlzTm9kZSA9IHRoaXMuZmluZERPTU5vZGUoKTtcbiAgICAgIGlmICghdGhpc05vZGUgfHwgIXRoaXNOb2RlLm93bmVyRG9jdW1lbnQgfHwgIXRoaXNOb2RlLm93bmVyRG9jdW1lbnQuYm9keSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJzxEcmFnZ2FibGVDb3JlPiBub3QgbW91bnRlZCBvbiBEcmFnU3RhcnQhJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIG93bmVyRG9jdW1lbnRcbiAgICAgIH0gPSB0aGlzTm9kZTtcblxuICAgICAgLy8gU2hvcnQgY2lyY3VpdCBpZiBoYW5kbGUgb3IgY2FuY2VsIHByb3Agd2FzIHByb3ZpZGVkIGFuZCBzZWxlY3RvciBkb2Vzbid0IG1hdGNoLlxuICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQgfHwgIShlLnRhcmdldCBpbnN0YW5jZW9mIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuTm9kZSkgfHwgdGhpcy5wcm9wcy5oYW5kbGUgJiYgISgwLCBfZG9tRm5zLm1hdGNoZXNTZWxlY3RvckFuZFBhcmVudHNUbykoZS50YXJnZXQsIHRoaXMucHJvcHMuaGFuZGxlLCB0aGlzTm9kZSkgfHwgdGhpcy5wcm9wcy5jYW5jZWwgJiYgKDAsIF9kb21GbnMubWF0Y2hlc1NlbGVjdG9yQW5kUGFyZW50c1RvKShlLnRhcmdldCwgdGhpcy5wcm9wcy5jYW5jZWwsIHRoaXNOb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXZlbnQgc2Nyb2xsaW5nIG9uIG1vYmlsZSBkZXZpY2VzLCBsaWtlIGlwYWQvaXBob25lLlxuICAgICAgLy8gSW1wb3J0YW50IHRoYXQgdGhpcyBpcyBhZnRlciBoYW5kbGUvY2FuY2VsLlxuICAgICAgaWYgKGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIC8vIFNldCB0b3VjaCBpZGVudGlmaWVyIGluIGNvbXBvbmVudCBzdGF0ZSBpZiB0aGlzIGlzIGEgdG91Y2ggZXZlbnQuIFRoaXMgYWxsb3dzIHVzIHRvXG4gICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIGluZGl2aWR1YWwgdG91Y2hlcyBvbiBtdWx0aXRvdWNoIHNjcmVlbnMgYnkgaWRlbnRpZnlpbmcgd2hpY2hcbiAgICAgIC8vIHRvdWNocG9pbnQgd2FzIHNldCB0byB0aGlzIGVsZW1lbnQuXG4gICAgICBjb25zdCB0b3VjaElkZW50aWZpZXIgPSAoMCwgX2RvbUZucy5nZXRUb3VjaElkZW50aWZpZXIpKGUpO1xuICAgICAgdGhpcy50b3VjaElkZW50aWZpZXIgPSB0b3VjaElkZW50aWZpZXI7XG5cbiAgICAgIC8vIEdldCB0aGUgY3VycmVudCBkcmFnIHBvaW50IGZyb20gdGhlIGV2ZW50LiBUaGlzIGlzIHVzZWQgYXMgdGhlIG9mZnNldC5cbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gKDAsIF9wb3NpdGlvbkZucy5nZXRDb250cm9sUG9zaXRpb24pKGUsIHRvdWNoSWRlbnRpZmllciwgdGhpcyk7XG4gICAgICBpZiAocG9zaXRpb24gPT0gbnVsbCkgcmV0dXJuOyAvLyBub3QgcG9zc2libGUgYnV0IHNhdGlzZmllcyBmbG93XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSBwb3NpdGlvbjtcblxuICAgICAgLy8gQ3JlYXRlIGFuIGV2ZW50IG9iamVjdCB3aXRoIGFsbCB0aGUgZGF0YSBwYXJlbnRzIG5lZWQgdG8gbWFrZSBhIGRlY2lzaW9uIGhlcmUuXG4gICAgICBjb25zdCBjb3JlRXZlbnQgPSAoMCwgX3Bvc2l0aW9uRm5zLmNyZWF0ZUNvcmVEYXRhKSh0aGlzLCB4LCB5KTtcbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGVDb3JlOiBoYW5kbGVEcmFnU3RhcnQ6ICVqJywgY29yZUV2ZW50KTtcblxuICAgICAgLy8gQ2FsbCBldmVudCBoYW5kbGVyLiBJZiBpdCByZXR1cm5zIGV4cGxpY2l0IGZhbHNlLCBjYW5jZWwuXG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnY2FsbGluZycsIHRoaXMucHJvcHMub25TdGFydCk7XG4gICAgICBjb25zdCBzaG91bGRVcGRhdGUgPSB0aGlzLnByb3BzLm9uU3RhcnQoZSwgY29yZUV2ZW50KTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IGZhbHNlIHx8IHRoaXMubW91bnRlZCA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgLy8gQWRkIGEgc3R5bGUgdG8gdGhlIGJvZHkgdG8gZGlzYWJsZSB1c2VyLXNlbGVjdC4gVGhpcyBwcmV2ZW50cyB0ZXh0IGZyb21cbiAgICAgIC8vIGJlaW5nIHNlbGVjdGVkIGFsbCBvdmVyIHRoZSBwYWdlLlxuICAgICAgaWYgKHRoaXMucHJvcHMuZW5hYmxlVXNlclNlbGVjdEhhY2spICgwLCBfZG9tRm5zLmFkZFVzZXJTZWxlY3RTdHlsZXMpKG93bmVyRG9jdW1lbnQpO1xuXG4gICAgICAvLyBJbml0aWF0ZSBkcmFnZ2luZy4gU2V0IHRoZSBjdXJyZW50IHggYW5kIHkgYXMgb2Zmc2V0c1xuICAgICAgLy8gc28gd2Uga25vdyBob3cgbXVjaCB3ZSd2ZSBtb3ZlZCBkdXJpbmcgdGhlIGRyYWcuIFRoaXMgYWxsb3dzIHVzXG4gICAgICAvLyB0byBkcmFnIGVsZW1lbnRzIGFyb3VuZCBldmVuIGlmIHRoZXkgaGF2ZSBiZWVuIG1vdmVkLCB3aXRob3V0IGlzc3VlLlxuICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLmxhc3RYID0geDtcbiAgICAgIHRoaXMubGFzdFkgPSB5O1xuXG4gICAgICAvLyBBZGQgZXZlbnRzIHRvIHRoZSBkb2N1bWVudCBkaXJlY3RseSBzbyB3ZSBjYXRjaCB3aGVuIHRoZSB1c2VyJ3MgbW91c2UvdG91Y2ggbW92ZXMgb3V0c2lkZSBvZlxuICAgICAgLy8gdGhpcyBlbGVtZW50LiBXZSB1c2UgZGlmZmVyZW50IGV2ZW50cyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3Qgd2UgaGF2ZSBkZXRlY3RlZCB0aGF0IHRoaXNcbiAgICAgIC8vIGlzIGEgdG91Y2gtY2FwYWJsZSBkZXZpY2UuXG4gICAgICAoMCwgX2RvbUZucy5hZGRFdmVudCkob3duZXJEb2N1bWVudCwgZHJhZ0V2ZW50Rm9yLm1vdmUsIHRoaXMuaGFuZGxlRHJhZyk7XG4gICAgICAoMCwgX2RvbUZucy5hZGRFdmVudCkob3duZXJEb2N1bWVudCwgZHJhZ0V2ZW50Rm9yLnN0b3AsIHRoaXMuaGFuZGxlRHJhZ1N0b3ApO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImhhbmRsZURyYWdcIiwgZSA9PiB7XG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgZHJhZyBwb2ludCBmcm9tIHRoZSBldmVudC4gVGhpcyBpcyB1c2VkIGFzIHRoZSBvZmZzZXQuXG4gICAgICBjb25zdCBwb3NpdGlvbiA9ICgwLCBfcG9zaXRpb25GbnMuZ2V0Q29udHJvbFBvc2l0aW9uKShlLCB0aGlzLnRvdWNoSWRlbnRpZmllciwgdGhpcyk7XG4gICAgICBpZiAocG9zaXRpb24gPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgbGV0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHBvc2l0aW9uO1xuXG4gICAgICAvLyBTbmFwIHRvIGdyaWQgaWYgcHJvcCBoYXMgYmVlbiBwcm92aWRlZFxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5wcm9wcy5ncmlkKSkge1xuICAgICAgICBsZXQgZGVsdGFYID0geCAtIHRoaXMubGFzdFgsXG4gICAgICAgICAgZGVsdGFZID0geSAtIHRoaXMubGFzdFk7XG4gICAgICAgIFtkZWx0YVgsIGRlbHRhWV0gPSAoMCwgX3Bvc2l0aW9uRm5zLnNuYXBUb0dyaWQpKHRoaXMucHJvcHMuZ3JpZCwgZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgICBpZiAoIWRlbHRhWCAmJiAhZGVsdGFZKSByZXR1cm47IC8vIHNraXAgdXNlbGVzcyBkcmFnXG4gICAgICAgIHggPSB0aGlzLmxhc3RYICsgZGVsdGFYLCB5ID0gdGhpcy5sYXN0WSArIGRlbHRhWTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvcmVFdmVudCA9ICgwLCBfcG9zaXRpb25GbnMuY3JlYXRlQ29yZURhdGEpKHRoaXMsIHgsIHkpO1xuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZUNvcmU6IGhhbmRsZURyYWc6ICVqJywgY29yZUV2ZW50KTtcblxuICAgICAgLy8gQ2FsbCBldmVudCBoYW5kbGVyLiBJZiBpdCByZXR1cm5zIGV4cGxpY2l0IGZhbHNlLCB0cmlnZ2VyIGVuZC5cbiAgICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9IHRoaXMucHJvcHMub25EcmFnKGUsIGNvcmVFdmVudCk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSBmYWxzZSB8fCB0aGlzLm1vdW50ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gJEZsb3dJZ25vcmVcbiAgICAgICAgICB0aGlzLmhhbmRsZURyYWdTdG9wKG5ldyBNb3VzZUV2ZW50KCdtb3VzZXVwJykpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBPbGQgYnJvd3NlcnNcbiAgICAgICAgICBjb25zdCBldmVudCA9ICgoZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJykgLyo6IGFueSovKSAvKjogTW91c2VUb3VjaEV2ZW50Ki8pO1xuICAgICAgICAgIC8vIEkgc2VlIHdoeSB0aGlzIGluc2FuaXR5IHdhcyBkZXByZWNhdGVkXG4gICAgICAgICAgLy8gJEZsb3dJZ25vcmVcbiAgICAgICAgICBldmVudC5pbml0TW91c2VFdmVudCgnbW91c2V1cCcsIHRydWUsIHRydWUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlRHJhZ1N0b3AoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFggPSB4O1xuICAgICAgdGhpcy5sYXN0WSA9IHk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaGFuZGxlRHJhZ1N0b3BcIiwgZSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gKDAsIF9wb3NpdGlvbkZucy5nZXRDb250cm9sUG9zaXRpb24pKGUsIHRoaXMudG91Y2hJZGVudGlmaWVyLCB0aGlzKTtcbiAgICAgIGlmIChwb3NpdGlvbiA9PSBudWxsKSByZXR1cm47XG4gICAgICBsZXQge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gcG9zaXRpb247XG5cbiAgICAgIC8vIFNuYXAgdG8gZ3JpZCBpZiBwcm9wIGhhcyBiZWVuIHByb3ZpZGVkXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnByb3BzLmdyaWQpKSB7XG4gICAgICAgIGxldCBkZWx0YVggPSB4IC0gdGhpcy5sYXN0WCB8fCAwO1xuICAgICAgICBsZXQgZGVsdGFZID0geSAtIHRoaXMubGFzdFkgfHwgMDtcbiAgICAgICAgW2RlbHRhWCwgZGVsdGFZXSA9ICgwLCBfcG9zaXRpb25GbnMuc25hcFRvR3JpZCkodGhpcy5wcm9wcy5ncmlkLCBkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgIHggPSB0aGlzLmxhc3RYICsgZGVsdGFYLCB5ID0gdGhpcy5sYXN0WSArIGRlbHRhWTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvcmVFdmVudCA9ICgwLCBfcG9zaXRpb25GbnMuY3JlYXRlQ29yZURhdGEpKHRoaXMsIHgsIHkpO1xuXG4gICAgICAvLyBDYWxsIGV2ZW50IGhhbmRsZXJcbiAgICAgIGNvbnN0IHNob3VsZENvbnRpbnVlID0gdGhpcy5wcm9wcy5vblN0b3AoZSwgY29yZUV2ZW50KTtcbiAgICAgIGlmIChzaG91bGRDb250aW51ZSA9PT0gZmFsc2UgfHwgdGhpcy5tb3VudGVkID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLmZpbmRET01Ob2RlKCk7XG4gICAgICBpZiAodGhpc05vZGUpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHVzZXItc2VsZWN0IGhhY2tcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZW5hYmxlVXNlclNlbGVjdEhhY2spICgwLCBfZG9tRm5zLnJlbW92ZVVzZXJTZWxlY3RTdHlsZXMpKHRoaXNOb2RlLm93bmVyRG9jdW1lbnQpO1xuICAgICAgfVxuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZUNvcmU6IGhhbmRsZURyYWdTdG9wOiAlaicsIGNvcmVFdmVudCk7XG5cbiAgICAgIC8vIFJlc2V0IHRoZSBlbC5cbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubGFzdFggPSBOYU47XG4gICAgICB0aGlzLmxhc3RZID0gTmFOO1xuICAgICAgaWYgKHRoaXNOb2RlKSB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBoYW5kbGVyc1xuICAgICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlQ29yZTogUmVtb3ZpbmcgaGFuZGxlcnMnKTtcbiAgICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKHRoaXNOb2RlLm93bmVyRG9jdW1lbnQsIGRyYWdFdmVudEZvci5tb3ZlLCB0aGlzLmhhbmRsZURyYWcpO1xuICAgICAgICAoMCwgX2RvbUZucy5yZW1vdmVFdmVudCkodGhpc05vZGUub3duZXJEb2N1bWVudCwgZHJhZ0V2ZW50Rm9yLnN0b3AsIHRoaXMuaGFuZGxlRHJhZ1N0b3ApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uTW91c2VEb3duXCIsIGUgPT4ge1xuICAgICAgZHJhZ0V2ZW50Rm9yID0gZXZlbnRzRm9yLm1vdXNlOyAvLyBvbiB0b3VjaHNjcmVlbiBsYXB0b3BzIHdlIGNvdWxkIHN3aXRjaCBiYWNrIHRvIG1vdXNlXG5cbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZURyYWdTdGFydChlKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvbk1vdXNlVXBcIiwgZSA9PiB7XG4gICAgICBkcmFnRXZlbnRGb3IgPSBldmVudHNGb3IubW91c2U7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVEcmFnU3RvcChlKTtcbiAgICB9KTtcbiAgICAvLyBTYW1lIGFzIG9uTW91c2VEb3duIChzdGFydCBkcmFnKSwgYnV0IG5vdyBjb25zaWRlciB0aGlzIGEgdG91Y2ggZGV2aWNlLlxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uVG91Y2hTdGFydFwiLCBlID0+IHtcbiAgICAgIC8vIFdlJ3JlIG9uIGEgdG91Y2ggZGV2aWNlIG5vdywgc28gY2hhbmdlIHRoZSBldmVudCBoYW5kbGVyc1xuICAgICAgZHJhZ0V2ZW50Rm9yID0gZXZlbnRzRm9yLnRvdWNoO1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KGUpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uVG91Y2hFbmRcIiwgZSA9PiB7XG4gICAgICAvLyBXZSdyZSBvbiBhIHRvdWNoIGRldmljZSBub3csIHNvIGNoYW5nZSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgIGRyYWdFdmVudEZvciA9IGV2ZW50c0Zvci50b3VjaDtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZURyYWdTdG9wKGUpO1xuICAgIH0pO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgLy8gVG91Y2ggaGFuZGxlcnMgbXVzdCBiZSBhZGRlZCB3aXRoIHtwYXNzaXZlOiBmYWxzZX0gdG8gYmUgY2FuY2VsYWJsZS5cbiAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzAxL3Njcm9sbGluZy1pbnRlcnZlbnRpb25cbiAgICBjb25zdCB0aGlzTm9kZSA9IHRoaXMuZmluZERPTU5vZGUoKTtcbiAgICBpZiAodGhpc05vZGUpIHtcbiAgICAgICgwLCBfZG9tRm5zLmFkZEV2ZW50KSh0aGlzTm9kZSwgZXZlbnRzRm9yLnRvdWNoLnN0YXJ0LCB0aGlzLm9uVG91Y2hTdGFydCwge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICAgIC8vIFJlbW92ZSBhbnkgbGVmdG92ZXIgZXZlbnQgaGFuZGxlcnMuIFJlbW92ZSBib3RoIHRvdWNoIGFuZCBtb3VzZSBoYW5kbGVycyBpbiBjYXNlXG4gICAgLy8gc29tZSBicm93c2VyIHF1aXJrIGNhdXNlZCBhIHRvdWNoIGV2ZW50IHRvIGZpcmUgZHVyaW5nIGEgbW91c2UgbW92ZSwgb3IgdmljZSB2ZXJzYS5cbiAgICBjb25zdCB0aGlzTm9kZSA9IHRoaXMuZmluZERPTU5vZGUoKTtcbiAgICBpZiAodGhpc05vZGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb3duZXJEb2N1bWVudFxuICAgICAgfSA9IHRoaXNOb2RlO1xuICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKG93bmVyRG9jdW1lbnQsIGV2ZW50c0Zvci5tb3VzZS5tb3ZlLCB0aGlzLmhhbmRsZURyYWcpO1xuICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKG93bmVyRG9jdW1lbnQsIGV2ZW50c0Zvci50b3VjaC5tb3ZlLCB0aGlzLmhhbmRsZURyYWcpO1xuICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKG93bmVyRG9jdW1lbnQsIGV2ZW50c0Zvci5tb3VzZS5zdG9wLCB0aGlzLmhhbmRsZURyYWdTdG9wKTtcbiAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KShvd25lckRvY3VtZW50LCBldmVudHNGb3IudG91Y2guc3RvcCwgdGhpcy5oYW5kbGVEcmFnU3RvcCk7XG4gICAgICAoMCwgX2RvbUZucy5yZW1vdmVFdmVudCkodGhpc05vZGUsIGV2ZW50c0Zvci50b3VjaC5zdGFydCwgdGhpcy5vblRvdWNoU3RhcnQsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMucHJvcHMuZW5hYmxlVXNlclNlbGVjdEhhY2spICgwLCBfZG9tRm5zLnJlbW92ZVVzZXJTZWxlY3RTdHlsZXMpKG93bmVyRG9jdW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlYWN0IFN0cmljdCBNb2RlIGNvbXBhdGliaWxpdHk6IGlmIGBub2RlUmVmYCBpcyBwYXNzZWQsIHdlIHdpbGwgdXNlIGl0IGluc3RlYWQgb2YgdHJ5aW5nIHRvIGZpbmRcbiAgLy8gdGhlIHVuZGVybHlpbmcgRE9NIG5vZGUgb3Vyc2VsdmVzLiBTZWUgdGhlIFJFQURNRSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgZmluZERPTU5vZGUoKSAvKjogP0hUTUxFbGVtZW50Ki97XG4gICAgdmFyIF90aGlzJHByb3BzLCBfdGhpcyRwcm9wczI7XG4gICAgcmV0dXJuIChfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMpICE9PSBudWxsICYmIF90aGlzJHByb3BzICE9PSB2b2lkIDAgJiYgX3RoaXMkcHJvcHMubm9kZVJlZiA/IChfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzKSA9PT0gbnVsbCB8fCBfdGhpcyRwcm9wczIgPT09IHZvaWQgMCB8fCAoX3RoaXMkcHJvcHMyID0gX3RoaXMkcHJvcHMyLm5vZGVSZWYpID09PSBudWxsIHx8IF90aGlzJHByb3BzMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcHJvcHMyLmN1cnJlbnQgOiBfcmVhY3REb20uZGVmYXVsdC5maW5kRE9NTm9kZSh0aGlzKTtcbiAgfVxuICByZW5kZXIoKSAvKjogUmVhY3QuRWxlbWVudDxhbnk+Ki97XG4gICAgLy8gUmV1c2UgdGhlIGNoaWxkIHByb3ZpZGVkXG4gICAgLy8gVGhpcyBtYWtlcyBpdCBmbGV4aWJsZSB0byB1c2Ugd2hhdGV2ZXIgZWxlbWVudCBpcyB3YW50ZWQgKGRpdiwgdWwsIGV0YylcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChSZWFjdC5DaGlsZHJlbi5vbmx5KHRoaXMucHJvcHMuY2hpbGRyZW4pLCB7XG4gICAgICAvLyBOb3RlOiBtb3VzZU1vdmUgaGFuZGxlciBpcyBhdHRhY2hlZCB0byBkb2N1bWVudCBzbyBpdCB3aWxsIHN0aWxsIGZ1bmN0aW9uXG4gICAgICAvLyB3aGVuIHRoZSB1c2VyIGRyYWdzIHF1aWNrbHkgYW5kIGxlYXZlcyB0aGUgYm91bmRzIG9mIHRoZSBlbGVtZW50LlxuICAgICAgb25Nb3VzZURvd246IHRoaXMub25Nb3VzZURvd24sXG4gICAgICBvbk1vdXNlVXA6IHRoaXMub25Nb3VzZVVwLFxuICAgICAgLy8gb25Ub3VjaFN0YXJ0IGlzIGFkZGVkIG9uIGBjb21wb25lbnREaWRNb3VudGAgc28gdGhleSBjYW4gYmUgYWRkZWQgd2l0aFxuICAgICAgLy8ge3Bhc3NpdmU6IGZhbHNlfSwgd2hpY2ggYWxsb3dzIGl0IHRvIGNhbmNlbC4gU2VlXG4gICAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzAxL3Njcm9sbGluZy1pbnRlcnZlbnRpb25cbiAgICAgIG9uVG91Y2hFbmQ6IHRoaXMub25Ub3VjaEVuZFxuICAgIH0pO1xuICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBEcmFnZ2FibGVDb3JlO1xuX2RlZmluZVByb3BlcnR5KERyYWdnYWJsZUNvcmUsIFwiZGlzcGxheU5hbWVcIiwgJ0RyYWdnYWJsZUNvcmUnKTtcbl9kZWZpbmVQcm9wZXJ0eShEcmFnZ2FibGVDb3JlLCBcInByb3BUeXBlc1wiLCB7XG4gIC8qKlxuICAgKiBgYWxsb3dBbnlDbGlja2AgYWxsb3dzIGRyYWdnaW5nIHVzaW5nIGFueSBtb3VzZSBidXR0b24uXG4gICAqIEJ5IGRlZmF1bHQsIHdlIG9ubHkgYWNjZXB0IHRoZSBsZWZ0IGJ1dHRvbi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGFsbG93QW55Q2xpY2s6IF9wcm9wVHlwZXMuZGVmYXVsdC5ib29sLFxuICBjaGlsZHJlbjogX3Byb3BUeXBlcy5kZWZhdWx0Lm5vZGUuaXNSZXF1aXJlZCxcbiAgLyoqXG4gICAqIGBkaXNhYmxlZGAsIGlmIHRydWUsIHN0b3BzIHRoZSA8RHJhZ2dhYmxlPiBmcm9tIGRyYWdnaW5nLiBBbGwgaGFuZGxlcnMsXG4gICAqIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgb25Nb3VzZURvd25gLCB3aWxsIG5vdCBmaXJlLlxuICAgKi9cbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5ib29sLFxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgd2UgYWRkICd1c2VyLXNlbGVjdDpub25lJyBhdHRyaWJ1dGVzIHRvIHRoZSBkb2N1bWVudCBib2R5XG4gICAqIHRvIHByZXZlbnQgdWdseSB0ZXh0IHNlbGVjdGlvbiBkdXJpbmcgZHJhZy4gSWYgdGhpcyBpcyBjYXVzaW5nIHByb2JsZW1zXG4gICAqIGZvciB5b3VyIGFwcCwgc2V0IHRoaXMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGVuYWJsZVVzZXJTZWxlY3RIYWNrOiBfcHJvcFR5cGVzLmRlZmF1bHQuYm9vbCxcbiAgLyoqXG4gICAqIGBvZmZzZXRQYXJlbnRgLCBpZiBzZXQsIHVzZXMgdGhlIHBhc3NlZCBET00gbm9kZSB0byBjb21wdXRlIGRyYWcgb2Zmc2V0c1xuICAgKiBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBwYXJlbnQgbm9kZS5cbiAgICovXG4gIG9mZnNldFBhcmVudDogZnVuY3Rpb24gKHByb3BzIC8qOiBEcmFnZ2FibGVDb3JlUHJvcHMqLywgcHJvcE5hbWUgLyo6ICRLZXlzPERyYWdnYWJsZUNvcmVQcm9wcz4qLykge1xuICAgIGlmIChwcm9wc1twcm9wTmFtZV0gJiYgcHJvcHNbcHJvcE5hbWVdLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyYWdnYWJsZVxcJ3Mgb2Zmc2V0UGFyZW50IG11c3QgYmUgYSBET00gTm9kZS4nKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBgZ3JpZGAgc3BlY2lmaWVzIHRoZSB4IGFuZCB5IHRoYXQgZHJhZ2dpbmcgc2hvdWxkIHNuYXAgdG8uXG4gICAqL1xuICBncmlkOiBfcHJvcFR5cGVzLmRlZmF1bHQuYXJyYXlPZihfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyKSxcbiAgLyoqXG4gICAqIGBoYW5kbGVgIHNwZWNpZmllcyBhIHNlbGVjdG9yIHRvIGJlIHVzZWQgYXMgdGhlIGhhbmRsZSB0aGF0IGluaXRpYXRlcyBkcmFnLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogICBsZXQgQXBwID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICogICAgICAgICByZXR1cm4gKFxuICAgKiAgICAgICAgICAgIDxEcmFnZ2FibGUgaGFuZGxlPVwiLmhhbmRsZVwiPlxuICAgKiAgICAgICAgICAgICAgPGRpdj5cbiAgICogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImhhbmRsZVwiPkNsaWNrIG1lIHRvIGRyYWc8L2Rpdj5cbiAgICogICAgICAgICAgICAgICAgICA8ZGl2PlRoaXMgaXMgc29tZSBvdGhlciBjb250ZW50PC9kaXY+XG4gICAqICAgICAgICAgICAgICA8L2Rpdj5cbiAgICogICAgICAgICAgIDwvRHJhZ2dhYmxlPlxuICAgKiAgICAgICAgICk7XG4gICAqICAgICAgIH1cbiAgICogICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBoYW5kbGU6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIC8qKlxuICAgKiBgY2FuY2VsYCBzcGVjaWZpZXMgYSBzZWxlY3RvciB0byBiZSB1c2VkIHRvIHByZXZlbnQgZHJhZyBpbml0aWFsaXphdGlvbi5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganN4XG4gICAqICAgbGV0IEFwcCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAqICAgICAgICAgICByZXR1cm4oXG4gICAqICAgICAgICAgICAgICAgPERyYWdnYWJsZSBjYW5jZWw9XCIuY2FuY2VsXCI+XG4gICAqICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAqICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjYW5jZWxcIj5Zb3UgY2FuJ3QgZHJhZyBmcm9tIGhlcmU8L2Rpdj5cbiAgICogICAgICAgICAgICAgICAgICAgICA8ZGl2PkRyYWdnaW5nIGhlcmUgd29ya3MgZmluZTwvZGl2PlxuICAgKiAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICogICAgICAgICAgICAgICA8L0RyYWdnYWJsZT5cbiAgICogICAgICAgICAgICk7XG4gICAqICAgICAgIH1cbiAgICogICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBjYW5jZWw6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIC8qIElmIHJ1bm5pbmcgaW4gUmVhY3QgU3RyaWN0IG1vZGUsIFJlYWN0RE9NLmZpbmRET01Ob2RlKCkgaXMgZGVwcmVjYXRlZC5cbiAgICogVW5mb3J0dW5hdGVseSwgaW4gb3JkZXIgZm9yIDxEcmFnZ2FibGU+IHRvIHdvcmsgcHJvcGVybHksIHdlIG5lZWQgcmF3IGFjY2Vzc1xuICAgKiB0byB0aGUgdW5kZXJseWluZyBET00gbm9kZS4gSWYgeW91IHdhbnQgdG8gYXZvaWQgdGhlIHdhcm5pbmcsIHBhc3MgYSBgbm9kZVJlZmBcbiAgICogYXMgaW4gdGhpcyBleGFtcGxlOlxuICAgKlxuICAgKiBmdW5jdGlvbiBNeUNvbXBvbmVudCgpIHtcbiAgICogICBjb25zdCBub2RlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgKiAgIHJldHVybiAoXG4gICAqICAgICA8RHJhZ2dhYmxlIG5vZGVSZWY9e25vZGVSZWZ9PlxuICAgKiAgICAgICA8ZGl2IHJlZj17bm9kZVJlZn0+RXhhbXBsZSBUYXJnZXQ8L2Rpdj5cbiAgICogICAgIDwvRHJhZ2dhYmxlPlxuICAgKiAgICk7XG4gICAqIH1cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgYXJiaXRyYXJpbHkgbmVzdGVkIGNvbXBvbmVudHMsIHNvIGxvbmcgYXMgdGhlIHJlZiBlbmRzIHVwXG4gICAqIHBvaW50aW5nIHRvIHRoZSBhY3R1YWwgY2hpbGQgRE9NIG5vZGUgYW5kIG5vdCBhIGN1c3RvbSBjb21wb25lbnQuXG4gICAqL1xuICBub2RlUmVmOiBfcHJvcFR5cGVzLmRlZmF1bHQub2JqZWN0LFxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gZHJhZ2dpbmcgc3RhcnRzLlxuICAgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJvb2xlYW4gZmFsc2UsIGRyYWdnaW5nIHdpbGwgYmUgY2FuY2VsZWQuXG4gICAqL1xuICBvblN0YXJ0OiBfcHJvcFR5cGVzLmRlZmF1bHQuZnVuYyxcbiAgLyoqXG4gICAqIENhbGxlZCB3aGlsZSBkcmFnZ2luZy5cbiAgICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBib29sZWFuIGZhbHNlLCBkcmFnZ2luZyB3aWxsIGJlIGNhbmNlbGVkLlxuICAgKi9cbiAgb25EcmFnOiBfcHJvcFR5cGVzLmRlZmF1bHQuZnVuYyxcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGRyYWdnaW5nIHN0b3BzLlxuICAgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJvb2xlYW4gZmFsc2UsIHRoZSBkcmFnIHdpbGwgcmVtYWluIGFjdGl2ZS5cbiAgICovXG4gIG9uU3RvcDogX3Byb3BUeXBlcy5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBBIHdvcmthcm91bmQgb3B0aW9uIHdoaWNoIGNhbiBiZSBwYXNzZWQgaWYgb25Nb3VzZURvd24gbmVlZHMgdG8gYmUgYWNjZXNzZWQsXG4gICAqIHNpbmNlIGl0J2xsIGFsd2F5cyBiZSBibG9ja2VkIChhcyB0aGVyZSBpcyBpbnRlcm5hbCB1c2Ugb2Ygb25Nb3VzZURvd24pXG4gICAqL1xuICBvbk1vdXNlRG93bjogX3Byb3BUeXBlcy5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBgc2NhbGVgLCBpZiBzZXQsIGFwcGxpZXMgc2NhbGluZyB3aGlsZSBkcmFnZ2luZyBhbiBlbGVtZW50XG4gICAqL1xuICBzY2FsZTogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlcixcbiAgLyoqXG4gICAqIFRoZXNlIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlZmluZWQgb24gdGhlIGNoaWxkLCBub3QgaGVyZS5cbiAgICovXG4gIGNsYXNzTmFtZTogX3NoaW1zLmRvbnRTZXRNZSxcbiAgc3R5bGU6IF9zaGltcy5kb250U2V0TWUsXG4gIHRyYW5zZm9ybTogX3NoaW1zLmRvbnRTZXRNZVxufSk7XG5fZGVmaW5lUHJvcGVydHkoRHJhZ2dhYmxlQ29yZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBhbGxvd0FueUNsaWNrOiBmYWxzZSxcbiAgLy8gYnkgZGVmYXVsdCBvbmx5IGFjY2VwdCBsZWZ0IGNsaWNrXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgZW5hYmxlVXNlclNlbGVjdEhhY2s6IHRydWUsXG4gIG9uU3RhcnQ6IGZ1bmN0aW9uICgpIHt9LFxuICBvbkRyYWc6IGZ1bmN0aW9uICgpIHt9LFxuICBvblN0b3A6IGZ1bmN0aW9uICgpIHt9LFxuICBvbk1vdXNlRG93bjogZnVuY3Rpb24gKCkge30sXG4gIHNjYWxlOiAxXG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuY29uc3Qge1xuICBkZWZhdWx0OiBEcmFnZ2FibGUsXG4gIERyYWdnYWJsZUNvcmVcbn0gPSByZXF1aXJlKCcuL0RyYWdnYWJsZScpO1xuXG4vLyBQcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGxpYiBleHBvcnRlZCA8RHJhZ2dhYmxlPiBhcyB0aGUgcm9vdCBleHBvcnQuIEFzIHRvIG5vLS8vIHRoZW0sIG9yIFR5cGVTY3JpcHQsIHdlIGV4cG9ydCAqYm90aCogYXMgdGhlIHJvb3QgYW5kIGFzICdkZWZhdWx0Jy5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbXphYnJpc2tpZS9yZWFjdC1kcmFnZ2FibGUvcHVsbC8yNTRcbi8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vbXphYnJpc2tpZS9yZWFjdC1kcmFnZ2FibGUvaXNzdWVzLzI2NlxubW9kdWxlLmV4cG9ydHMgPSBEcmFnZ2FibGU7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gRHJhZ2dhYmxlO1xubW9kdWxlLmV4cG9ydHMuRHJhZ2dhYmxlQ29yZSA9IERyYWdnYWJsZUNvcmU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmFkZENsYXNzTmFtZSA9IGFkZENsYXNzTmFtZTtcbmV4cG9ydHMuYWRkRXZlbnQgPSBhZGRFdmVudDtcbmV4cG9ydHMuYWRkVXNlclNlbGVjdFN0eWxlcyA9IGFkZFVzZXJTZWxlY3RTdHlsZXM7XG5leHBvcnRzLmNyZWF0ZUNTU1RyYW5zZm9ybSA9IGNyZWF0ZUNTU1RyYW5zZm9ybTtcbmV4cG9ydHMuY3JlYXRlU1ZHVHJhbnNmb3JtID0gY3JlYXRlU1ZHVHJhbnNmb3JtO1xuZXhwb3J0cy5nZXRUb3VjaCA9IGdldFRvdWNoO1xuZXhwb3J0cy5nZXRUb3VjaElkZW50aWZpZXIgPSBnZXRUb3VjaElkZW50aWZpZXI7XG5leHBvcnRzLmdldFRyYW5zbGF0aW9uID0gZ2V0VHJhbnNsYXRpb247XG5leHBvcnRzLmlubmVySGVpZ2h0ID0gaW5uZXJIZWlnaHQ7XG5leHBvcnRzLmlubmVyV2lkdGggPSBpbm5lcldpZHRoO1xuZXhwb3J0cy5tYXRjaGVzU2VsZWN0b3IgPSBtYXRjaGVzU2VsZWN0b3I7XG5leHBvcnRzLm1hdGNoZXNTZWxlY3RvckFuZFBhcmVudHNUbyA9IG1hdGNoZXNTZWxlY3RvckFuZFBhcmVudHNUbztcbmV4cG9ydHMub2Zmc2V0WFlGcm9tUGFyZW50ID0gb2Zmc2V0WFlGcm9tUGFyZW50O1xuZXhwb3J0cy5vdXRlckhlaWdodCA9IG91dGVySGVpZ2h0O1xuZXhwb3J0cy5vdXRlcldpZHRoID0gb3V0ZXJXaWR0aDtcbmV4cG9ydHMucmVtb3ZlQ2xhc3NOYW1lID0gcmVtb3ZlQ2xhc3NOYW1lO1xuZXhwb3J0cy5yZW1vdmVFdmVudCA9IHJlbW92ZUV2ZW50O1xuZXhwb3J0cy5yZW1vdmVVc2VyU2VsZWN0U3R5bGVzID0gcmVtb3ZlVXNlclNlbGVjdFN0eWxlcztcbnZhciBfc2hpbXMgPSByZXF1aXJlKFwiLi9zaGltc1wiKTtcbnZhciBfZ2V0UHJlZml4ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vZ2V0UHJlZml4XCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaiwgbm9kZUludGVyb3ApIHsgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuLyo6OiBpbXBvcnQgdHlwZSB7Q29udHJvbFBvc2l0aW9uLCBQb3NpdGlvbk9mZnNldENvbnRyb2xQb3NpdGlvbiwgTW91c2VUb3VjaEV2ZW50fSBmcm9tICcuL3R5cGVzJzsqL1xubGV0IG1hdGNoZXNTZWxlY3RvckZ1bmMgPSAnJztcbmZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcihlbCAvKjogTm9kZSovLCBzZWxlY3RvciAvKjogc3RyaW5nKi8pIC8qOiBib29sZWFuKi97XG4gIGlmICghbWF0Y2hlc1NlbGVjdG9yRnVuYykge1xuICAgIG1hdGNoZXNTZWxlY3RvckZ1bmMgPSAoMCwgX3NoaW1zLmZpbmRJbkFycmF5KShbJ21hdGNoZXMnLCAnd2Via2l0TWF0Y2hlc1NlbGVjdG9yJywgJ21vek1hdGNoZXNTZWxlY3RvcicsICdtc01hdGNoZXNTZWxlY3RvcicsICdvTWF0Y2hlc1NlbGVjdG9yJ10sIGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgIC8vICRGbG93SWdub3JlOiBEb2Vzbid0IHRoaW5rIGVsZW1lbnRzIGFyZSBpbmRleGFibGVcbiAgICAgIHJldHVybiAoMCwgX3NoaW1zLmlzRnVuY3Rpb24pKGVsW21ldGhvZF0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gTWlnaHQgbm90IGJlIGZvdW5kIGVudGlyZWx5IChub3QgYW4gRWxlbWVudD8pIC0gaW4gdGhhdCBjYXNlLCBiYWlsXG4gIC8vICRGbG93SWdub3JlOiBEb2Vzbid0IHRoaW5rIGVsZW1lbnRzIGFyZSBpbmRleGFibGVcbiAgaWYgKCEoMCwgX3NoaW1zLmlzRnVuY3Rpb24pKGVsW21hdGNoZXNTZWxlY3RvckZ1bmNdKSkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vICRGbG93SWdub3JlOiBEb2Vzbid0IHRoaW5rIGVsZW1lbnRzIGFyZSBpbmRleGFibGVcbiAgcmV0dXJuIGVsW21hdGNoZXNTZWxlY3RvckZ1bmNdKHNlbGVjdG9yKTtcbn1cblxuLy8gV29ya3MgdXAgdGhlIHRyZWUgdG8gdGhlIGRyYWdnYWJsZSBpdHNlbGYgYXR0ZW1wdGluZyB0byBtYXRjaCBzZWxlY3Rvci5cbmZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvckFuZFBhcmVudHNUbyhlbCAvKjogTm9kZSovLCBzZWxlY3RvciAvKjogc3RyaW5nKi8sIGJhc2VOb2RlIC8qOiBOb2RlKi8pIC8qOiBib29sZWFuKi97XG4gIGxldCBub2RlID0gZWw7XG4gIGRvIHtcbiAgICBpZiAobWF0Y2hlc1NlbGVjdG9yKG5vZGUsIHNlbGVjdG9yKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG5vZGUgPT09IGJhc2VOb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gJEZsb3dJZ25vcmVbaW5jb21wYXRpYmxlLXR5cGVdXG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfSB3aGlsZSAobm9kZSk7XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50KGVsIC8qOiA/Tm9kZSovLCBldmVudCAvKjogc3RyaW5nKi8sIGhhbmRsZXIgLyo6IEZ1bmN0aW9uKi8sIGlucHV0T3B0aW9ucyAvKjogT2JqZWN0Ki8pIC8qOiB2b2lkKi97XG4gIGlmICghZWwpIHJldHVybjtcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIC4uLmlucHV0T3B0aW9uc1xuICB9O1xuICAvLyAkRmxvd0lnbm9yZVttZXRob2QtdW5iaW5kaW5nXVxuICBpZiAoZWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKGVsLmF0dGFjaEV2ZW50KSB7XG4gICAgZWwuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBoYW5kbGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyAkRmxvd0lnbm9yZTogRG9lc24ndCB0aGluayBlbGVtZW50cyBhcmUgaW5kZXhhYmxlXG4gICAgZWxbJ29uJyArIGV2ZW50XSA9IGhhbmRsZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50KGVsIC8qOiA/Tm9kZSovLCBldmVudCAvKjogc3RyaW5nKi8sIGhhbmRsZXIgLyo6IEZ1bmN0aW9uKi8sIGlucHV0T3B0aW9ucyAvKjogT2JqZWN0Ki8pIC8qOiB2b2lkKi97XG4gIGlmICghZWwpIHJldHVybjtcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIC4uLmlucHV0T3B0aW9uc1xuICB9O1xuICAvLyAkRmxvd0lnbm9yZVttZXRob2QtdW5iaW5kaW5nXVxuICBpZiAoZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKGVsLmRldGFjaEV2ZW50KSB7XG4gICAgZWwuZGV0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBoYW5kbGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyAkRmxvd0lnbm9yZTogRG9lc24ndCB0aGluayBlbGVtZW50cyBhcmUgaW5kZXhhYmxlXG4gICAgZWxbJ29uJyArIGV2ZW50XSA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIG91dGVySGVpZ2h0KG5vZGUgLyo6IEhUTUxFbGVtZW50Ki8pIC8qOiBudW1iZXIqL3tcbiAgLy8gVGhpcyBpcyBkZWxpYmVyYXRlbHkgZXhjbHVkaW5nIG1hcmdpbiBmb3Igb3VyIGNhbGN1bGF0aW9ucywgc2luY2Ugd2UgYXJlIHVzaW5nXG4gIC8vIG9mZnNldFRvcCB3aGljaCBpcyBpbmNsdWRpbmcgbWFyZ2luLiBTZWUgZ2V0Qm91bmRQb3NpdGlvblxuICBsZXQgaGVpZ2h0ID0gbm9kZS5jbGllbnRIZWlnaHQ7XG4gIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgaGVpZ2h0ICs9ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoKTtcbiAgaGVpZ2h0ICs9ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLmJvcmRlckJvdHRvbVdpZHRoKTtcbiAgcmV0dXJuIGhlaWdodDtcbn1cbmZ1bmN0aW9uIG91dGVyV2lkdGgobm9kZSAvKjogSFRNTEVsZW1lbnQqLykgLyo6IG51bWJlciove1xuICAvLyBUaGlzIGlzIGRlbGliZXJhdGVseSBleGNsdWRpbmcgbWFyZ2luIGZvciBvdXIgY2FsY3VsYXRpb25zLCBzaW5jZSB3ZSBhcmUgdXNpbmdcbiAgLy8gb2Zmc2V0TGVmdCB3aGljaCBpcyBpbmNsdWRpbmcgbWFyZ2luLiBTZWUgZ2V0Qm91bmRQb3NpdGlvblxuICBsZXQgd2lkdGggPSBub2RlLmNsaWVudFdpZHRoO1xuICBjb25zdCBjb21wdXRlZFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gIHdpZHRoICs9ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLmJvcmRlckxlZnRXaWR0aCk7XG4gIHdpZHRoICs9ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLmJvcmRlclJpZ2h0V2lkdGgpO1xuICByZXR1cm4gd2lkdGg7XG59XG5mdW5jdGlvbiBpbm5lckhlaWdodChub2RlIC8qOiBIVE1MRWxlbWVudCovKSAvKjogbnVtYmVyKi97XG4gIGxldCBoZWlnaHQgPSBub2RlLmNsaWVudEhlaWdodDtcbiAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICBoZWlnaHQgLT0gKDAsIF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCk7XG4gIGhlaWdodCAtPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tKTtcbiAgcmV0dXJuIGhlaWdodDtcbn1cbmZ1bmN0aW9uIGlubmVyV2lkdGgobm9kZSAvKjogSFRNTEVsZW1lbnQqLykgLyo6IG51bWJlciove1xuICBsZXQgd2lkdGggPSBub2RlLmNsaWVudFdpZHRoO1xuICBjb25zdCBjb21wdXRlZFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gIHdpZHRoIC09ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLnBhZGRpbmdMZWZ0KTtcbiAgd2lkdGggLT0gKDAsIF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUucGFkZGluZ1JpZ2h0KTtcbiAgcmV0dXJuIHdpZHRoO1xufVxuLyo6OiBpbnRlcmZhY2UgRXZlbnRXaXRoT2Zmc2V0IHtcbiAgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXJcbn0qL1xuLy8gR2V0IGZyb20gb2Zmc2V0UGFyZW50XG5mdW5jdGlvbiBvZmZzZXRYWUZyb21QYXJlbnQoZXZ0IC8qOiBFdmVudFdpdGhPZmZzZXQqLywgb2Zmc2V0UGFyZW50IC8qOiBIVE1MRWxlbWVudCovLCBzY2FsZSAvKjogbnVtYmVyKi8pIC8qOiBDb250cm9sUG9zaXRpb24qL3tcbiAgY29uc3QgaXNCb2R5ID0gb2Zmc2V0UGFyZW50ID09PSBvZmZzZXRQYXJlbnQub3duZXJEb2N1bWVudC5ib2R5O1xuICBjb25zdCBvZmZzZXRQYXJlbnRSZWN0ID0gaXNCb2R5ID8ge1xuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiAwXG4gIH0gOiBvZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHggPSAoZXZ0LmNsaWVudFggKyBvZmZzZXRQYXJlbnQuc2Nyb2xsTGVmdCAtIG9mZnNldFBhcmVudFJlY3QubGVmdCkgLyBzY2FsZTtcbiAgY29uc3QgeSA9IChldnQuY2xpZW50WSArIG9mZnNldFBhcmVudC5zY3JvbGxUb3AgLSBvZmZzZXRQYXJlbnRSZWN0LnRvcCkgLyBzY2FsZTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHlcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNTU1RyYW5zZm9ybShjb250cm9sUG9zIC8qOiBDb250cm9sUG9zaXRpb24qLywgcG9zaXRpb25PZmZzZXQgLyo6IFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uKi8pIC8qOiBPYmplY3QqL3tcbiAgY29uc3QgdHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbihjb250cm9sUG9zLCBwb3NpdGlvbk9mZnNldCwgJ3B4Jyk7XG4gIHJldHVybiB7XG4gICAgWygwLCBfZ2V0UHJlZml4LmJyb3dzZXJQcmVmaXhUb0tleSkoJ3RyYW5zZm9ybScsIF9nZXRQcmVmaXguZGVmYXVsdCldOiB0cmFuc2xhdGlvblxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlU1ZHVHJhbnNmb3JtKGNvbnRyb2xQb3MgLyo6IENvbnRyb2xQb3NpdGlvbiovLCBwb3NpdGlvbk9mZnNldCAvKjogUG9zaXRpb25PZmZzZXRDb250cm9sUG9zaXRpb24qLykgLyo6IHN0cmluZyove1xuICBjb25zdCB0cmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uKGNvbnRyb2xQb3MsIHBvc2l0aW9uT2Zmc2V0LCAnJyk7XG4gIHJldHVybiB0cmFuc2xhdGlvbjtcbn1cbmZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uKF9yZWYgLyo6OiAqLywgcG9zaXRpb25PZmZzZXQgLyo6IFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uKi8sIHVuaXRTdWZmaXggLyo6IHN0cmluZyovKSAvKjogc3RyaW5nKi97XG4gIGxldCB7XG4gICAgeCxcbiAgICB5XG4gIH0gLyo6IENvbnRyb2xQb3NpdGlvbiovID0gX3JlZiAvKjogQ29udHJvbFBvc2l0aW9uKi87XG4gIGxldCB0cmFuc2xhdGlvbiA9IFwidHJhbnNsYXRlKFwiLmNvbmNhdCh4KS5jb25jYXQodW5pdFN1ZmZpeCwgXCIsXCIpLmNvbmNhdCh5KS5jb25jYXQodW5pdFN1ZmZpeCwgXCIpXCIpO1xuICBpZiAocG9zaXRpb25PZmZzZXQpIHtcbiAgICBjb25zdCBkZWZhdWx0WCA9IFwiXCIuY29uY2F0KHR5cGVvZiBwb3NpdGlvbk9mZnNldC54ID09PSAnc3RyaW5nJyA/IHBvc2l0aW9uT2Zmc2V0LnggOiBwb3NpdGlvbk9mZnNldC54ICsgdW5pdFN1ZmZpeCk7XG4gICAgY29uc3QgZGVmYXVsdFkgPSBcIlwiLmNvbmNhdCh0eXBlb2YgcG9zaXRpb25PZmZzZXQueSA9PT0gJ3N0cmluZycgPyBwb3NpdGlvbk9mZnNldC55IDogcG9zaXRpb25PZmZzZXQueSArIHVuaXRTdWZmaXgpO1xuICAgIHRyYW5zbGF0aW9uID0gXCJ0cmFuc2xhdGUoXCIuY29uY2F0KGRlZmF1bHRYLCBcIiwgXCIpLmNvbmNhdChkZWZhdWx0WSwgXCIpXCIpICsgdHJhbnNsYXRpb247XG4gIH1cbiAgcmV0dXJuIHRyYW5zbGF0aW9uO1xufVxuZnVuY3Rpb24gZ2V0VG91Y2goZSAvKjogTW91c2VUb3VjaEV2ZW50Ki8sIGlkZW50aWZpZXIgLyo6IG51bWJlciovKSAvKjogP3tjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcn0qL3tcbiAgcmV0dXJuIGUudGFyZ2V0VG91Y2hlcyAmJiAoMCwgX3NoaW1zLmZpbmRJbkFycmF5KShlLnRhcmdldFRvdWNoZXMsIHQgPT4gaWRlbnRpZmllciA9PT0gdC5pZGVudGlmaWVyKSB8fCBlLmNoYW5nZWRUb3VjaGVzICYmICgwLCBfc2hpbXMuZmluZEluQXJyYXkpKGUuY2hhbmdlZFRvdWNoZXMsIHQgPT4gaWRlbnRpZmllciA9PT0gdC5pZGVudGlmaWVyKTtcbn1cbmZ1bmN0aW9uIGdldFRvdWNoSWRlbnRpZmllcihlIC8qOiBNb3VzZVRvdWNoRXZlbnQqLykgLyo6ID9udW1iZXIqL3tcbiAgaWYgKGUudGFyZ2V0VG91Y2hlcyAmJiBlLnRhcmdldFRvdWNoZXNbMF0pIHJldHVybiBlLnRhcmdldFRvdWNoZXNbMF0uaWRlbnRpZmllcjtcbiAgaWYgKGUuY2hhbmdlZFRvdWNoZXMgJiYgZS5jaGFuZ2VkVG91Y2hlc1swXSkgcmV0dXJuIGUuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcjtcbn1cblxuLy8gVXNlci1zZWxlY3QgSGFja3M6XG4vL1xuLy8gVXNlZnVsIGZvciBwcmV2ZW50aW5nIGJsdWUgaGlnaGxpZ2h0cyBhbGwgb3ZlciBldmVyeXRoaW5nIHdoZW4gZHJhZ2dpbmcuXG5cbi8vIE5vdGUgd2UncmUgcGFzc2luZyBgZG9jdW1lbnRgIGIvYyB3ZSBjb3VsZCBiZSBpZnJhbWVkXG5mdW5jdGlvbiBhZGRVc2VyU2VsZWN0U3R5bGVzKGRvYyAvKjogP0RvY3VtZW50Ki8pIHtcbiAgaWYgKCFkb2MpIHJldHVybjtcbiAgbGV0IHN0eWxlRWwgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoJ3JlYWN0LWRyYWdnYWJsZS1zdHlsZS1lbCcpO1xuICBpZiAoIXN0eWxlRWwpIHtcbiAgICBzdHlsZUVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbC50eXBlID0gJ3RleHQvY3NzJztcbiAgICBzdHlsZUVsLmlkID0gJ3JlYWN0LWRyYWdnYWJsZS1zdHlsZS1lbCc7XG4gICAgc3R5bGVFbC5pbm5lckhUTUwgPSAnLnJlYWN0LWRyYWdnYWJsZS10cmFuc3BhcmVudC1zZWxlY3Rpb24gKjo6LW1vei1zZWxlY3Rpb24ge2FsbDogaW5oZXJpdDt9XFxuJztcbiAgICBzdHlsZUVsLmlubmVySFRNTCArPSAnLnJlYWN0LWRyYWdnYWJsZS10cmFuc3BhcmVudC1zZWxlY3Rpb24gKjo6c2VsZWN0aW9uIHthbGw6IGluaGVyaXQ7fVxcbic7XG4gICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG4gIH1cbiAgaWYgKGRvYy5ib2R5KSBhZGRDbGFzc05hbWUoZG9jLmJvZHksICdyZWFjdC1kcmFnZ2FibGUtdHJhbnNwYXJlbnQtc2VsZWN0aW9uJyk7XG59XG5mdW5jdGlvbiByZW1vdmVVc2VyU2VsZWN0U3R5bGVzKGRvYyAvKjogP0RvY3VtZW50Ki8pIHtcbiAgaWYgKCFkb2MpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBpZiAoZG9jLmJvZHkpIHJlbW92ZUNsYXNzTmFtZShkb2MuYm9keSwgJ3JlYWN0LWRyYWdnYWJsZS10cmFuc3BhcmVudC1zZWxlY3Rpb24nKTtcbiAgICAvLyAkRmxvd0lnbm9yZTogSUVcbiAgICBpZiAoZG9jLnNlbGVjdGlvbikge1xuICAgICAgLy8gJEZsb3dJZ25vcmU6IElFXG4gICAgICBkb2Muc2VsZWN0aW9uLmVtcHR5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSBzZWxlY3Rpb24gY2F1c2VkIGJ5IHNjcm9sbCwgdW5sZXNzIGl0J3MgYSBmb2N1c2VkIGlucHV0XG4gICAgICAvLyAod2UgdXNlIGRvYy5kZWZhdWx0VmlldyBpbiBjYXNlIHdlJ3JlIGluIGFuIGlmcmFtZSlcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IChkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93KS5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnR5cGUgIT09ICdDYXJldCcpIHtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIHByb2JhYmx5IElFXG4gIH1cbn1cbmZ1bmN0aW9uIGFkZENsYXNzTmFtZShlbCAvKjogSFRNTEVsZW1lbnQqLywgY2xhc3NOYW1lIC8qOiBzdHJpbmcqLykge1xuICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgZWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICB9IGVsc2Uge1xuICAgIGlmICghZWwuY2xhc3NOYW1lLm1hdGNoKG5ldyBSZWdFeHAoXCIoPzpefFxcXFxzKVwiLmNvbmNhdChjbGFzc05hbWUsIFwiKD8hXFxcXFMpXCIpKSkpIHtcbiAgICAgIGVsLmNsYXNzTmFtZSArPSBcIiBcIi5jb25jYXQoY2xhc3NOYW1lKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzTmFtZShlbCAvKjogSFRNTEVsZW1lbnQqLywgY2xhc3NOYW1lIC8qOiBzdHJpbmcqLykge1xuICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICB9IGVsc2Uge1xuICAgIGVsLmNsYXNzTmFtZSA9IGVsLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoPzpefFxcXFxzKVwiLmNvbmNhdChjbGFzc05hbWUsIFwiKD8hXFxcXFMpXCIpLCAnZycpLCAnJyk7XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuYnJvd3NlclByZWZpeFRvS2V5ID0gYnJvd3NlclByZWZpeFRvS2V5O1xuZXhwb3J0cy5icm93c2VyUHJlZml4VG9TdHlsZSA9IGJyb3dzZXJQcmVmaXhUb1N0eWxlO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuZXhwb3J0cy5nZXRQcmVmaXggPSBnZXRQcmVmaXg7XG5jb25zdCBwcmVmaXhlcyA9IFsnTW96JywgJ1dlYmtpdCcsICdPJywgJ21zJ107XG5mdW5jdGlvbiBnZXRQcmVmaXgoKSAvKjogc3RyaW5nKi97XG4gIHZhciBfd2luZG93JGRvY3VtZW50O1xuICBsZXQgcHJvcCAvKjogc3RyaW5nKi8gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICd0cmFuc2Zvcm0nO1xuICAvLyBFbnN1cmUgd2UncmUgcnVubmluZyBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSB0aGVyZSBpcyBhY3R1YWxseSBhIGdsb2JhbFxuICAvLyBgd2luZG93YCBvYmpcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gJyc7XG5cbiAgLy8gSWYgd2UncmUgaW4gYSBwc2V1ZG8tYnJvd3NlciBzZXJ2ZXItc2lkZSBlbnZpcm9ubWVudCwgdGhpcyBhY2Nlc3NcbiAgLy8gcGF0aCBtYXkgbm90IGV4aXN0LCBzbyBiYWlsIG91dCBpZiBpdCBkb2Vzbid0LlxuICBjb25zdCBzdHlsZSA9IChfd2luZG93JGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50KSA9PT0gbnVsbCB8fCBfd2luZG93JGRvY3VtZW50ID09PSB2b2lkIDAgfHwgKF93aW5kb3ckZG9jdW1lbnQgPSBfd2luZG93JGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgPT09IG51bGwgfHwgX3dpbmRvdyRkb2N1bWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdyRkb2N1bWVudC5zdHlsZTtcbiAgaWYgKCFzdHlsZSkgcmV0dXJuICcnO1xuICBpZiAocHJvcCBpbiBzdHlsZSkgcmV0dXJuICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGJyb3dzZXJQcmVmaXhUb0tleShwcm9wLCBwcmVmaXhlc1tpXSkgaW4gc3R5bGUpIHJldHVybiBwcmVmaXhlc1tpXTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5mdW5jdGlvbiBicm93c2VyUHJlZml4VG9LZXkocHJvcCAvKjogc3RyaW5nKi8sIHByZWZpeCAvKjogc3RyaW5nKi8pIC8qOiBzdHJpbmcqL3tcbiAgcmV0dXJuIHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCkuY29uY2F0KGtlYmFiVG9UaXRsZUNhc2UocHJvcCkpIDogcHJvcDtcbn1cbmZ1bmN0aW9uIGJyb3dzZXJQcmVmaXhUb1N0eWxlKHByb3AgLyo6IHN0cmluZyovLCBwcmVmaXggLyo6IHN0cmluZyovKSAvKjogc3RyaW5nKi97XG4gIHJldHVybiBwcmVmaXggPyBcIi1cIi5jb25jYXQocHJlZml4LnRvTG93ZXJDYXNlKCksIFwiLVwiKS5jb25jYXQocHJvcCkgOiBwcm9wO1xufVxuZnVuY3Rpb24ga2ViYWJUb1RpdGxlQ2FzZShzdHIgLyo6IHN0cmluZyovKSAvKjogc3RyaW5nKi97XG4gIGxldCBvdXQgPSAnJztcbiAgbGV0IHNob3VsZENhcGl0YWxpemUgPSB0cnVlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzaG91bGRDYXBpdGFsaXplKSB7XG4gICAgICBvdXQgKz0gc3RyW2ldLnRvVXBwZXJDYXNlKCk7XG4gICAgICBzaG91bGRDYXBpdGFsaXplID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICctJykge1xuICAgICAgc2hvdWxkQ2FwaXRhbGl6ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSBzdHJbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8vIERlZmF1bHQgZXhwb3J0IGlzIHRoZSBwcmVmaXggaXRzZWxmLCBsaWtlICdNb3onLCAnV2Via2l0JywgZXRjXG4vLyBOb3RlIHRoYXQgeW91IG1heSBoYXZlIHRvIHJlLXRlc3QgZm9yIGNlcnRhaW4gdGhpbmdzOyBmb3IgaW5zdGFuY2UsIENocm9tZSA1MFxuLy8gY2FuIGhhbmRsZSB1bnByZWZpeGVkIGB0cmFuc2Zvcm1gLCBidXQgbm90IHVucHJlZml4ZWQgYHVzZXItc2VsZWN0YFxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gKGdldFByZWZpeCgpIC8qOiBzdHJpbmcqLyk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBsb2c7XG4vKmVzbGludCBuby1jb25zb2xlOjAqL1xuZnVuY3Rpb24gbG9nKCkge1xuICBpZiAodW5kZWZpbmVkKSBjb25zb2xlLmxvZyguLi5hcmd1bWVudHMpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jYW5EcmFnWCA9IGNhbkRyYWdYO1xuZXhwb3J0cy5jYW5EcmFnWSA9IGNhbkRyYWdZO1xuZXhwb3J0cy5jcmVhdGVDb3JlRGF0YSA9IGNyZWF0ZUNvcmVEYXRhO1xuZXhwb3J0cy5jcmVhdGVEcmFnZ2FibGVEYXRhID0gY3JlYXRlRHJhZ2dhYmxlRGF0YTtcbmV4cG9ydHMuZ2V0Qm91bmRQb3NpdGlvbiA9IGdldEJvdW5kUG9zaXRpb247XG5leHBvcnRzLmdldENvbnRyb2xQb3NpdGlvbiA9IGdldENvbnRyb2xQb3NpdGlvbjtcbmV4cG9ydHMuc25hcFRvR3JpZCA9IHNuYXBUb0dyaWQ7XG52YXIgX3NoaW1zID0gcmVxdWlyZShcIi4vc2hpbXNcIik7XG52YXIgX2RvbUZucyA9IHJlcXVpcmUoXCIuL2RvbUZuc1wiKTtcbi8qOjogaW1wb3J0IHR5cGUgRHJhZ2dhYmxlIGZyb20gJy4uL0RyYWdnYWJsZSc7Ki9cbi8qOjogaW1wb3J0IHR5cGUge0JvdW5kcywgQ29udHJvbFBvc2l0aW9uLCBEcmFnZ2FibGVEYXRhLCBNb3VzZVRvdWNoRXZlbnR9IGZyb20gJy4vdHlwZXMnOyovXG4vKjo6IGltcG9ydCB0eXBlIERyYWdnYWJsZUNvcmUgZnJvbSAnLi4vRHJhZ2dhYmxlQ29yZSc7Ki9cbmZ1bmN0aW9uIGdldEJvdW5kUG9zaXRpb24oZHJhZ2dhYmxlIC8qOiBEcmFnZ2FibGUqLywgeCAvKjogbnVtYmVyKi8sIHkgLyo6IG51bWJlciovKSAvKjogW251bWJlciwgbnVtYmVyXSove1xuICAvLyBJZiBubyBib3VuZHMsIHNob3J0LWNpcmN1aXQgYW5kIG1vdmUgb25cbiAgaWYgKCFkcmFnZ2FibGUucHJvcHMuYm91bmRzKSByZXR1cm4gW3gsIHldO1xuXG4gIC8vIENsb25lIG5ldyBib3VuZHNcbiAgbGV0IHtcbiAgICBib3VuZHNcbiAgfSA9IGRyYWdnYWJsZS5wcm9wcztcbiAgYm91bmRzID0gdHlwZW9mIGJvdW5kcyA9PT0gJ3N0cmluZycgPyBib3VuZHMgOiBjbG9uZUJvdW5kcyhib3VuZHMpO1xuICBjb25zdCBub2RlID0gZmluZERPTU5vZGUoZHJhZ2dhYmxlKTtcbiAgaWYgKHR5cGVvZiBib3VuZHMgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3Qge1xuICAgICAgb3duZXJEb2N1bWVudFxuICAgIH0gPSBub2RlO1xuICAgIGNvbnN0IG93bmVyV2luZG93ID0gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICBsZXQgYm91bmROb2RlO1xuICAgIGlmIChib3VuZHMgPT09ICdwYXJlbnQnKSB7XG4gICAgICBib3VuZE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvdW5kTm9kZSA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3Rvcihib3VuZHMpO1xuICAgIH1cbiAgICBpZiAoIShib3VuZE5vZGUgaW5zdGFuY2VvZiBvd25lcldpbmRvdy5IVE1MRWxlbWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQm91bmRzIHNlbGVjdG9yIFwiJyArIGJvdW5kcyArICdcIiBjb3VsZCBub3QgZmluZCBhbiBlbGVtZW50LicpO1xuICAgIH1cbiAgICBjb25zdCBib3VuZE5vZGVFbCAvKjogSFRNTEVsZW1lbnQqLyA9IGJvdW5kTm9kZTsgLy8gZm9yIEZsb3csIGNhbid0IHNlZW0gdG8gcmVmaW5lIGNvcnJlY3RseVxuICAgIGNvbnN0IG5vZGVTdHlsZSA9IG93bmVyV2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgY29uc3QgYm91bmROb2RlU3R5bGUgPSBvd25lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGJvdW5kTm9kZUVsKTtcbiAgICAvLyBDb21wdXRlIGJvdW5kcy4gVGhpcyBpcyBhIHBhaW4gd2l0aCBwYWRkaW5nIGFuZCBvZmZzZXRzIGJ1dCB0aGlzIGdldHMgaXQgZXhhY3RseSByaWdodC5cbiAgICBib3VuZHMgPSB7XG4gICAgICBsZWZ0OiAtbm9kZS5vZmZzZXRMZWZ0ICsgKDAsIF9zaGltcy5pbnQpKGJvdW5kTm9kZVN0eWxlLnBhZGRpbmdMZWZ0KSArICgwLCBfc2hpbXMuaW50KShub2RlU3R5bGUubWFyZ2luTGVmdCksXG4gICAgICB0b3A6IC1ub2RlLm9mZnNldFRvcCArICgwLCBfc2hpbXMuaW50KShib3VuZE5vZGVTdHlsZS5wYWRkaW5nVG9wKSArICgwLCBfc2hpbXMuaW50KShub2RlU3R5bGUubWFyZ2luVG9wKSxcbiAgICAgIHJpZ2h0OiAoMCwgX2RvbUZucy5pbm5lcldpZHRoKShib3VuZE5vZGVFbCkgLSAoMCwgX2RvbUZucy5vdXRlcldpZHRoKShub2RlKSAtIG5vZGUub2Zmc2V0TGVmdCArICgwLCBfc2hpbXMuaW50KShib3VuZE5vZGVTdHlsZS5wYWRkaW5nUmlnaHQpIC0gKDAsIF9zaGltcy5pbnQpKG5vZGVTdHlsZS5tYXJnaW5SaWdodCksXG4gICAgICBib3R0b206ICgwLCBfZG9tRm5zLmlubmVySGVpZ2h0KShib3VuZE5vZGVFbCkgLSAoMCwgX2RvbUZucy5vdXRlckhlaWdodCkobm9kZSkgLSBub2RlLm9mZnNldFRvcCArICgwLCBfc2hpbXMuaW50KShib3VuZE5vZGVTdHlsZS5wYWRkaW5nQm90dG9tKSAtICgwLCBfc2hpbXMuaW50KShub2RlU3R5bGUubWFyZ2luQm90dG9tKVxuICAgIH07XG4gIH1cblxuICAvLyBLZWVwIHggYW5kIHkgYmVsb3cgcmlnaHQgYW5kIGJvdHRvbSBsaW1pdHMuLi5cbiAgaWYgKCgwLCBfc2hpbXMuaXNOdW0pKGJvdW5kcy5yaWdodCkpIHggPSBNYXRoLm1pbih4LCBib3VuZHMucmlnaHQpO1xuICBpZiAoKDAsIF9zaGltcy5pc051bSkoYm91bmRzLmJvdHRvbSkpIHkgPSBNYXRoLm1pbih5LCBib3VuZHMuYm90dG9tKTtcblxuICAvLyBCdXQgYWJvdmUgbGVmdCBhbmQgdG9wIGxpbWl0cy5cbiAgaWYgKCgwLCBfc2hpbXMuaXNOdW0pKGJvdW5kcy5sZWZ0KSkgeCA9IE1hdGgubWF4KHgsIGJvdW5kcy5sZWZ0KTtcbiAgaWYgKCgwLCBfc2hpbXMuaXNOdW0pKGJvdW5kcy50b3ApKSB5ID0gTWF0aC5tYXgoeSwgYm91bmRzLnRvcCk7XG4gIHJldHVybiBbeCwgeV07XG59XG5mdW5jdGlvbiBzbmFwVG9HcmlkKGdyaWQgLyo6IFtudW1iZXIsIG51bWJlcl0qLywgcGVuZGluZ1ggLyo6IG51bWJlciovLCBwZW5kaW5nWSAvKjogbnVtYmVyKi8pIC8qOiBbbnVtYmVyLCBudW1iZXJdKi97XG4gIGNvbnN0IHggPSBNYXRoLnJvdW5kKHBlbmRpbmdYIC8gZ3JpZFswXSkgKiBncmlkWzBdO1xuICBjb25zdCB5ID0gTWF0aC5yb3VuZChwZW5kaW5nWSAvIGdyaWRbMV0pICogZ3JpZFsxXTtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cbmZ1bmN0aW9uIGNhbkRyYWdYKGRyYWdnYWJsZSAvKjogRHJhZ2dhYmxlKi8pIC8qOiBib29sZWFuKi97XG4gIHJldHVybiBkcmFnZ2FibGUucHJvcHMuYXhpcyA9PT0gJ2JvdGgnIHx8IGRyYWdnYWJsZS5wcm9wcy5heGlzID09PSAneCc7XG59XG5mdW5jdGlvbiBjYW5EcmFnWShkcmFnZ2FibGUgLyo6IERyYWdnYWJsZSovKSAvKjogYm9vbGVhbiove1xuICByZXR1cm4gZHJhZ2dhYmxlLnByb3BzLmF4aXMgPT09ICdib3RoJyB8fCBkcmFnZ2FibGUucHJvcHMuYXhpcyA9PT0gJ3knO1xufVxuXG4vLyBHZXQge3gsIHl9IHBvc2l0aW9ucyBmcm9tIGV2ZW50LlxuZnVuY3Rpb24gZ2V0Q29udHJvbFBvc2l0aW9uKGUgLyo6IE1vdXNlVG91Y2hFdmVudCovLCB0b3VjaElkZW50aWZpZXIgLyo6ID9udW1iZXIqLywgZHJhZ2dhYmxlQ29yZSAvKjogRHJhZ2dhYmxlQ29yZSovKSAvKjogP0NvbnRyb2xQb3NpdGlvbiove1xuICBjb25zdCB0b3VjaE9iaiA9IHR5cGVvZiB0b3VjaElkZW50aWZpZXIgPT09ICdudW1iZXInID8gKDAsIF9kb21GbnMuZ2V0VG91Y2gpKGUsIHRvdWNoSWRlbnRpZmllcikgOiBudWxsO1xuICBpZiAodHlwZW9mIHRvdWNoSWRlbnRpZmllciA9PT0gJ251bWJlcicgJiYgIXRvdWNoT2JqKSByZXR1cm4gbnVsbDsgLy8gbm90IHRoZSByaWdodCB0b3VjaFxuICBjb25zdCBub2RlID0gZmluZERPTU5vZGUoZHJhZ2dhYmxlQ29yZSk7XG4gIC8vIFVzZXIgY2FuIHByb3ZpZGUgYW4gb2Zmc2V0UGFyZW50IGlmIGRlc2lyZWQuXG4gIGNvbnN0IG9mZnNldFBhcmVudCA9IGRyYWdnYWJsZUNvcmUucHJvcHMub2Zmc2V0UGFyZW50IHx8IG5vZGUub2Zmc2V0UGFyZW50IHx8IG5vZGUub3duZXJEb2N1bWVudC5ib2R5O1xuICByZXR1cm4gKDAsIF9kb21GbnMub2Zmc2V0WFlGcm9tUGFyZW50KSh0b3VjaE9iaiB8fCBlLCBvZmZzZXRQYXJlbnQsIGRyYWdnYWJsZUNvcmUucHJvcHMuc2NhbGUpO1xufVxuXG4vLyBDcmVhdGUgYW4gZGF0YSBvYmplY3QgZXhwb3NlZCBieSA8RHJhZ2dhYmxlQ29yZT4ncyBldmVudHNcbmZ1bmN0aW9uIGNyZWF0ZUNvcmVEYXRhKGRyYWdnYWJsZSAvKjogRHJhZ2dhYmxlQ29yZSovLCB4IC8qOiBudW1iZXIqLywgeSAvKjogbnVtYmVyKi8pIC8qOiBEcmFnZ2FibGVEYXRhKi97XG4gIGNvbnN0IGlzU3RhcnQgPSAhKDAsIF9zaGltcy5pc051bSkoZHJhZ2dhYmxlLmxhc3RYKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmRET01Ob2RlKGRyYWdnYWJsZSk7XG4gIGlmIChpc1N0YXJ0KSB7XG4gICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgbW92ZSwgdXNlIHRoZSB4IGFuZCB5IGFzIGxhc3QgY29vcmRzLlxuICAgIHJldHVybiB7XG4gICAgICBub2RlLFxuICAgICAgZGVsdGFYOiAwLFxuICAgICAgZGVsdGFZOiAwLFxuICAgICAgbGFzdFg6IHgsXG4gICAgICBsYXN0WTogeSxcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UgY2FsY3VsYXRlIHByb3BlciB2YWx1ZXMuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGUsXG4gICAgICBkZWx0YVg6IHggLSBkcmFnZ2FibGUubGFzdFgsXG4gICAgICBkZWx0YVk6IHkgLSBkcmFnZ2FibGUubGFzdFksXG4gICAgICBsYXN0WDogZHJhZ2dhYmxlLmxhc3RYLFxuICAgICAgbGFzdFk6IGRyYWdnYWJsZS5sYXN0WSxcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfTtcbiAgfVxufVxuXG4vLyBDcmVhdGUgYW4gZGF0YSBleHBvc2VkIGJ5IDxEcmFnZ2FibGU+J3MgZXZlbnRzXG5mdW5jdGlvbiBjcmVhdGVEcmFnZ2FibGVEYXRhKGRyYWdnYWJsZSAvKjogRHJhZ2dhYmxlKi8sIGNvcmVEYXRhIC8qOiBEcmFnZ2FibGVEYXRhKi8pIC8qOiBEcmFnZ2FibGVEYXRhKi97XG4gIGNvbnN0IHNjYWxlID0gZHJhZ2dhYmxlLnByb3BzLnNjYWxlO1xuICByZXR1cm4ge1xuICAgIG5vZGU6IGNvcmVEYXRhLm5vZGUsXG4gICAgeDogZHJhZ2dhYmxlLnN0YXRlLnggKyBjb3JlRGF0YS5kZWx0YVggLyBzY2FsZSxcbiAgICB5OiBkcmFnZ2FibGUuc3RhdGUueSArIGNvcmVEYXRhLmRlbHRhWSAvIHNjYWxlLFxuICAgIGRlbHRhWDogY29yZURhdGEuZGVsdGFYIC8gc2NhbGUsXG4gICAgZGVsdGFZOiBjb3JlRGF0YS5kZWx0YVkgLyBzY2FsZSxcbiAgICBsYXN0WDogZHJhZ2dhYmxlLnN0YXRlLngsXG4gICAgbGFzdFk6IGRyYWdnYWJsZS5zdGF0ZS55XG4gIH07XG59XG5cbi8vIEEgbG90IGZhc3RlciB0aGFuIHN0cmluZ2lmeS9wYXJzZVxuZnVuY3Rpb24gY2xvbmVCb3VuZHMoYm91bmRzIC8qOiBCb3VuZHMqLykgLyo6IEJvdW5kcyove1xuICByZXR1cm4ge1xuICAgIGxlZnQ6IGJvdW5kcy5sZWZ0LFxuICAgIHRvcDogYm91bmRzLnRvcCxcbiAgICByaWdodDogYm91bmRzLnJpZ2h0LFxuICAgIGJvdHRvbTogYm91bmRzLmJvdHRvbVxuICB9O1xufVxuZnVuY3Rpb24gZmluZERPTU5vZGUoZHJhZ2dhYmxlIC8qOiBEcmFnZ2FibGUgfCBEcmFnZ2FibGVDb3JlKi8pIC8qOiBIVE1MRWxlbWVudCove1xuICBjb25zdCBub2RlID0gZHJhZ2dhYmxlLmZpbmRET01Ob2RlKCk7XG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignPERyYWdnYWJsZUNvcmU+OiBVbm1vdW50ZWQgZHVyaW5nIGV2ZW50IScpO1xuICB9XG4gIC8vICRGbG93SWdub3JlIHdlIGNhbid0IGFzc2VydCBvbiBIVE1MRWxlbWVudCBkdWUgdG8gdGVzdHMuLi4gRklYTUVcbiAgcmV0dXJuIG5vZGU7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRvbnRTZXRNZSA9IGRvbnRTZXRNZTtcbmV4cG9ydHMuZmluZEluQXJyYXkgPSBmaW5kSW5BcnJheTtcbmV4cG9ydHMuaW50ID0gaW50O1xuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcbmV4cG9ydHMuaXNOdW0gPSBpc051bTtcbi8vIEBjcmVkaXRzIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3JvZ296aG5pa29mZi9hNDNjZmVkMjdjNDFlNGU2OGNkY1xuZnVuY3Rpb24gZmluZEluQXJyYXkoYXJyYXkgLyo6IEFycmF5PGFueT4gfCBUb3VjaExpc3QqLywgY2FsbGJhY2sgLyo6IEZ1bmN0aW9uKi8pIC8qOiBhbnkqL3tcbiAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNhbGxiYWNrLmFwcGx5KGNhbGxiYWNrLCBbYXJyYXlbaV0sIGksIGFycmF5XSkpIHJldHVybiBhcnJheVtpXTtcbiAgfVxufVxuZnVuY3Rpb24gaXNGdW5jdGlvbihmdW5jIC8qOiBhbnkqLykgLyo6IGJvb2xlYW4gJWNoZWNrcyove1xuICAvLyAkRmxvd0lnbm9yZVttZXRob2QtdW5iaW5kaW5nXVxuICByZXR1cm4gdHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGZ1bmMpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuZnVuY3Rpb24gaXNOdW0obnVtIC8qOiBhbnkqLykgLyo6IGJvb2xlYW4gJWNoZWNrcyove1xuICByZXR1cm4gdHlwZW9mIG51bSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG51bSk7XG59XG5mdW5jdGlvbiBpbnQoYSAvKjogc3RyaW5nKi8pIC8qOiBudW1iZXIqL3tcbiAgcmV0dXJuIHBhcnNlSW50KGEsIDEwKTtcbn1cbmZ1bmN0aW9uIGRvbnRTZXRNZShwcm9wcyAvKjogT2JqZWN0Ki8sIHByb3BOYW1lIC8qOiBzdHJpbmcqLywgY29tcG9uZW50TmFtZSAvKjogc3RyaW5nKi8pIC8qOiA/RXJyb3IqL3tcbiAgaWYgKHByb3BzW3Byb3BOYW1lXSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoXCJJbnZhbGlkIHByb3AgXCIuY29uY2F0KHByb3BOYW1lLCBcIiBwYXNzZWQgdG8gXCIpLmNvbmNhdChjb21wb25lbnROYW1lLCBcIiAtIGRvIG5vdCBzZXQgdGhpcywgc2V0IGl0IG9uIHRoZSBjaGlsZC5cIikpO1xuICB9XG59IiwiZnVuY3Rpb24gcihlKXt2YXIgdCxmLG49XCJcIjtpZihcInN0cmluZ1wiPT10eXBlb2YgZXx8XCJudW1iZXJcIj09dHlwZW9mIGUpbis9ZTtlbHNlIGlmKFwib2JqZWN0XCI9PXR5cGVvZiBlKWlmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdJiYoZj1yKGVbdF0pKSYmKG4mJihuKz1cIiBcIiksbis9Zik7ZWxzZSBmb3IodCBpbiBlKWVbdF0mJihuJiYobis9XCIgXCIpLG4rPXQpO3JldHVybiBufWV4cG9ydCBmdW5jdGlvbiBjbHN4KCl7Zm9yKHZhciBlLHQsZj0wLG49XCJcIjtmPGFyZ3VtZW50cy5sZW5ndGg7KShlPWFyZ3VtZW50c1tmKytdKSYmKHQ9cihlKSkmJihuJiYobis9XCIgXCIpLG4rPXQpO3JldHVybiBufWV4cG9ydCBkZWZhdWx0IGNsc3g7IiwiLyogZ2xvYmFsIE1hcDpyZWFkb25seSwgU2V0OnJlYWRvbmx5LCBBcnJheUJ1ZmZlcjpyZWFkb25seSAqL1xuXG52YXIgaGFzRWxlbWVudFR5cGUgPSB0eXBlb2YgRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBoYXNTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nO1xudmFyIGhhc0FycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nICYmICEhQXJyYXlCdWZmZXIuaXNWaWV3O1xuXG4vLyBOb3RlOiBXZSAqKmRvbid0KiogbmVlZCBgZW52SGFzQmlnSW50NjRBcnJheWAgaW4gZmRlIGVzNi9pbmRleC5qc1xuXG5mdW5jdGlvbiBlcXVhbChhLCBiKSB7XG4gIC8vIFNUQVJUOiBmYXN0LWRlZXAtZXF1YWwgZXM2L2luZGV4LmpzIDMuMS4zXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09ICdvYmplY3QnICYmIHR5cGVvZiBiID09ICdvYmplY3QnKSB7XG4gICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW5ndGgsIGksIGtleXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICBpZiAoIWVxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBTVEFSVDogTW9kaWZpY2F0aW9uczpcbiAgICAvLyAxLiBFeHRyYSBgaGFzPFR5cGU+ICYmYCBoZWxwZXJzIGluIGluaXRpYWwgY29uZGl0aW9uIGFsbG93IGVzNiBjb2RlXG4gICAgLy8gICAgdG8gY28tZXhpc3Qgd2l0aCBlczUuXG4gICAgLy8gMi4gUmVwbGFjZSBgZm9yIG9mYCB3aXRoIGVzNSBjb21wbGlhbnQgaXRlcmF0aW9uIHVzaW5nIGBmb3JgLlxuICAgIC8vICAgIEJhc2ljYWxseSwgdGFrZTpcbiAgICAvL1xuICAgIC8vICAgIGBgYGpzXG4gICAgLy8gICAgZm9yIChpIG9mIGEuZW50cmllcygpKVxuICAgIC8vICAgICAgaWYgKCFiLmhhcyhpWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgIGBgYFxuICAgIC8vXG4gICAgLy8gICAgLi4uIGFuZCBjb252ZXJ0IHRvOlxuICAgIC8vXG4gICAgLy8gICAgYGBganNcbiAgICAvLyAgICBpdCA9IGEuZW50cmllcygpO1xuICAgIC8vICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgLy8gICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgYGBgXG4gICAgLy9cbiAgICAvLyAgICAqKk5vdGUqKjogYGlgIGFjY2VzcyBzd2l0Y2hlcyB0byBgaS52YWx1ZWAuXG4gICAgdmFyIGl0O1xuICAgIGlmIChoYXNNYXAgJiYgKGEgaW5zdGFuY2VvZiBNYXApICYmIChiIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICBpdCA9IGEuZW50cmllcygpO1xuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAgICAgaWYgKCFiLmhhcyhpLnZhbHVlWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgICAgIGlmICghZXF1YWwoaS52YWx1ZVsxXSwgYi5nZXQoaS52YWx1ZVswXSkpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaGFzU2V0ICYmIChhIGluc3RhbmNlb2YgU2V0KSAmJiAoYiBpbnN0YW5jZW9mIFNldCkpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBFTkQ6IE1vZGlmaWNhdGlvbnNcblxuICAgIGlmIChoYXNBcnJheUJ1ZmZlciAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGIpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBSZWdFeHApIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgICAvLyBTVEFSVDogTW9kaWZpY2F0aW9uczpcbiAgICAvLyBBcHBseSBndWFyZHMgZm9yIGBPYmplY3QuY3JlYXRlKG51bGwpYCBoYW5kbGluZy4gU2VlOlxuICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL0Zvcm1pZGFibGVMYWJzL3JlYWN0LWZhc3QtY29tcGFyZS9pc3N1ZXMvNjRcbiAgICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9lcG9iZXJlemtpbi9mYXN0LWRlZXAtZXF1YWwvaXNzdWVzLzQ5XG4gICAgaWYgKGEudmFsdWVPZiAhPT0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mICYmIHR5cGVvZiBhLnZhbHVlT2YgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGIudmFsdWVPZiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTtcbiAgICBpZiAoYS50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAmJiB0eXBlb2YgYS50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgYi50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGEudG9TdHJpbmcoKSA9PT0gYi50b1N0cmluZygpO1xuICAgIC8vIEVORDogTW9kaWZpY2F0aW9uc1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5c1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBFTkQ6IGZhc3QtZGVlcC1lcXVhbFxuXG4gICAgLy8gU1RBUlQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuICAgIC8vIGN1c3RvbSBoYW5kbGluZyBmb3IgRE9NIGVsZW1lbnRzXG4gICAgaWYgKGhhc0VsZW1lbnRUeXBlICYmIGEgaW5zdGFuY2VvZiBFbGVtZW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBjdXN0b20gaGFuZGxpbmcgZm9yIFJlYWN0L1ByZWFjdFxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgaWYgKChrZXlzW2ldID09PSAnX293bmVyJyB8fCBrZXlzW2ldID09PSAnX192JyB8fCBrZXlzW2ldID09PSAnX19vJykgJiYgYS4kJHR5cGVvZikge1xuICAgICAgICAvLyBSZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBSZWFjdCBlbGVtZW50cycgX293bmVyXG4gICAgICAgIC8vIFByZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBQcmVhY3QgZWxlbWVudHMnIF9fdiBhbmQgX19vXG4gICAgICAgIC8vICAgIF9fdiA9ICRfb3JpZ2luYWwgLyAkX3Zub2RlXG4gICAgICAgIC8vICAgIF9fbyA9ICRfb3duZXJcbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBjb250YWluIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIGFyZSBub3QgbmVlZGVkIHdoZW5cbiAgICAgICAgLy8gY29tcGFyaW5nIHRoZSBhY3R1YWwgZWxlbWVudHMgKGFuZCBub3QgdGhlaXIgb3duZXJzKVxuICAgICAgICAvLyAuJCR0eXBlb2YgYW5kIC5fc3RvcmUgb24ganVzdCByZWFzb25hYmxlIG1hcmtlcnMgb2YgZWxlbWVudHNcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYWxsIG90aGVyIHByb3BlcnRpZXMgc2hvdWxkIGJlIHRyYXZlcnNlZCBhcyB1c3VhbFxuICAgICAgaWYgKCFlcXVhbChhW2tleXNbaV1dLCBiW2tleXNbaV1dKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBFTkQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuXG4gICAgLy8gU1RBUlQ6IGZhc3QtZGVlcC1lcXVhbFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbn1cbi8vIGVuZCBmYXN0LWRlZXAtZXF1YWxcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXF1YWwoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCgoZXJyb3IubWVzc2FnZSB8fCAnJykubWF0Y2goL3N0YWNrfHJlY3Vyc2lvbi9pKSkpIHtcbiAgICAgIC8vIHdhcm4gb24gY2lyY3VsYXIgcmVmZXJlbmNlcywgZG9uJ3QgY3Jhc2hcbiAgICAgIC8vIGJyb3dzZXJzIGdpdmUgdGhpcyBkaWZmZXJlbnQgZXJyb3JzIG5hbWUgYW5kIG1lc3NhZ2VzOlxuICAgICAgLy8gY2hyb21lL3NhZmFyaTogXCJSYW5nZUVycm9yXCIsIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIlxuICAgICAgLy8gZmlyZWZveDogXCJJbnRlcm5hbEVycm9yXCIsIHRvbyBtdWNoIHJlY3Vyc2lvblwiXG4gICAgICAvLyBlZGdlOiBcIkVycm9yXCIsIFwiT3V0IG9mIHN0YWNrIHNwYWNlXCJcbiAgICAgIGNvbnNvbGUud2FybigncmVhY3QtZmFzdC1jb21wYXJlIGNhbm5vdCBoYW5kbGUgY2lyY3VsYXIgcmVmcycpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBzb21lIG90aGVyIGVycm9yLiB3ZSBzaG91bGQgZGVmaW5pdGVseSBrbm93IGFib3V0IHRoZXNlXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnZm9jdXMtbG9jay9jb25zdGFudHMnO1xuaW1wb3J0IHsgaW5saW5lUHJvcCB9IGZyb20gJy4vdXRpbCc7XG52YXIgQXV0b0ZvY3VzSW5zaWRlID0gZnVuY3Rpb24gQXV0b0ZvY3VzSW5zaWRlKF9yZWYpIHtcbiAgdmFyIF9yZWYkZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgIGRpc2FibGVkID0gX3JlZiRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJGRpc2FibGVkLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBfcmVmJGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYkY2xhc3NOYW1lID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfcmVmJGNsYXNzTmFtZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBpbmxpbmVQcm9wKGNvbnN0YW50cy5GT0NVU19BVVRPLCAhZGlzYWJsZWQpLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSksIGNoaWxkcmVuKTtcbn07XG5BdXRvRm9jdXNJbnNpZGUucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEF1dG9Gb2N1c0luc2lkZTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZvY3VzTG9ja1VJIGZyb20gJy4vTG9jayc7XG5pbXBvcnQgRm9jdXNUcmFwIGZyb20gJy4vVHJhcCc7XG52YXIgRm9jdXNMb2NrQ29tYmluYXRpb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb2N1c0xvY2tVSUNvbWJpbmF0aW9uKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzTG9ja1VJLCBfZXh0ZW5kcyh7XG4gICAgc2lkZUNhcjogRm9jdXNUcmFwLFxuICAgIHJlZjogcmVmXG4gIH0sIHByb3BzKSk7XG59KTtcbnZhciBfcmVmID0gRm9jdXNMb2NrVUkucHJvcFR5cGVzIHx8IHt9LFxuICBzaWRlQ2FyID0gX3JlZi5zaWRlQ2FyLFxuICBwcm9wVHlwZXMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBbXCJzaWRlQ2FyXCJdKTtcbkZvY3VzTG9ja0NvbWJpbmF0aW9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHByb3BUeXBlcyA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgRm9jdXNMb2NrQ29tYmluYXRpb247IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmV4cG9ydCB2YXIgaGlkZGVuR3VhcmQgPSB7XG4gIHdpZHRoOiAnMXB4JyxcbiAgaGVpZ2h0OiAnMHB4JyxcbiAgcGFkZGluZzogMCxcbiAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgdG9wOiAnMXB4JyxcbiAgbGVmdDogJzFweCdcbn07XG52YXIgSW5Gb2N1c0d1YXJkID0gZnVuY3Rpb24gSW5Gb2N1c0d1YXJkKF9yZWYpIHtcbiAgdmFyIF9yZWYkY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIGNoaWxkcmVuID0gX3JlZiRjaGlsZHJlbiA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkY2hpbGRyZW47XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJndWFyZC1maXJzdFwiLFxuICAgIFwiZGF0YS1mb2N1cy1ndWFyZFwiOiB0cnVlLFxuICAgIFwiZGF0YS1mb2N1cy1hdXRvLWd1YXJkXCI6IHRydWUsXG4gICAgc3R5bGU6IGhpZGRlbkd1YXJkXG4gIH0pLCBjaGlsZHJlbiwgY2hpbGRyZW4gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJndWFyZC1sYXN0XCIsXG4gICAgXCJkYXRhLWZvY3VzLWd1YXJkXCI6IHRydWUsXG4gICAgXCJkYXRhLWZvY3VzLWF1dG8tZ3VhcmRcIjogdHJ1ZSxcbiAgICBzdHlsZTogaGlkZGVuR3VhcmRcbiAgfSkpO1xufTtcbkluRm9jdXNHdWFyZC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZVxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgSW5Gb2N1c0d1YXJkOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICdmb2N1cy1sb2NrL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbmxpbmVQcm9wIH0gZnJvbSAnLi91dGlsJztcbnZhciBGcmVlRm9jdXNJbnNpZGUgPSBmdW5jdGlvbiBGcmVlRm9jdXNJbnNpZGUoX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIGlubGluZVByb3AoY29uc3RhbnRzLkZPQ1VTX0FMTE9XLCB0cnVlKSwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0pLCBjaGlsZHJlbik7XG59O1xuRnJlZUZvY3VzSW5zaWRlLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgRnJlZUZvY3VzSW5zaWRlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgbm9kZSwgYm9vbCwgc3RyaW5nLCBhbnksIGFycmF5T2YsIG9uZU9mVHlwZSwgb2JqZWN0LCBmdW5jIH0gZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnZm9jdXMtbG9jay9jb25zdGFudHMnO1xuaW1wb3J0IHsgdXNlTWVyZ2VSZWZzIH0gZnJvbSAndXNlLWNhbGxiYWNrLXJlZic7XG5pbXBvcnQgeyBoaWRkZW5HdWFyZCB9IGZyb20gJy4vRm9jdXNHdWFyZCc7XG5pbXBvcnQgeyBtZWRpdW1Gb2N1cywgbWVkaXVtQmx1ciwgbWVkaXVtU2lkZWNhciB9IGZyb20gJy4vbWVkaXVtJztcbmltcG9ydCB7IGZvY3VzU2NvcGUgfSBmcm9tICcuL3Njb3BlJztcbnZhciBlbXB0eUFycmF5ID0gW107XG52YXIgRm9jdXNMb2NrID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRm9jdXNMb2NrVUkocHJvcHMsIHBhcmVudFJlZikge1xuICB2YXIgX2V4dGVuZHMyO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoKSxcbiAgICByZWFsT2JzZXJ2ZWQgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgc2V0T2JzZXJ2ZWQgPSBfUmVhY3QkdXNlU3RhdGVbMV07XG4gIHZhciBvYnNlcnZlZCA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgaXNBY3RpdmUgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgb3JpZ2luYWxGb2N1c2VkRWxlbWVudCA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTIgPSBSZWFjdC51c2VTdGF0ZSh7fSksXG4gICAgdXBkYXRlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgX3Byb3BzJGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgZGlzYWJsZWQgPSBfcHJvcHMkZGlzYWJsZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVkLFxuICAgIF9wcm9wcyRub0ZvY3VzR3VhcmRzID0gcHJvcHMubm9Gb2N1c0d1YXJkcyxcbiAgICBub0ZvY3VzR3VhcmRzID0gX3Byb3BzJG5vRm9jdXNHdWFyZHMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJG5vRm9jdXNHdWFyZHMsXG4gICAgX3Byb3BzJHBlcnNpc3RlbnRGb2N1ID0gcHJvcHMucGVyc2lzdGVudEZvY3VzLFxuICAgIHBlcnNpc3RlbnRGb2N1cyA9IF9wcm9wcyRwZXJzaXN0ZW50Rm9jdSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkcGVyc2lzdGVudEZvY3UsXG4gICAgX3Byb3BzJGNyb3NzRnJhbWUgPSBwcm9wcy5jcm9zc0ZyYW1lLFxuICAgIGNyb3NzRnJhbWUgPSBfcHJvcHMkY3Jvc3NGcmFtZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRjcm9zc0ZyYW1lLFxuICAgIF9wcm9wcyRhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgYXV0b0ZvY3VzID0gX3Byb3BzJGF1dG9Gb2N1cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRhdXRvRm9jdXMsXG4gICAgYWxsb3dUZXh0U2VsZWN0aW9uID0gcHJvcHMuYWxsb3dUZXh0U2VsZWN0aW9uLFxuICAgIGdyb3VwID0gcHJvcHMuZ3JvdXAsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHdoaXRlTGlzdCA9IHByb3BzLndoaXRlTGlzdCxcbiAgICBoYXNQb3NpdGl2ZUluZGljZXMgPSBwcm9wcy5oYXNQb3NpdGl2ZUluZGljZXMsXG4gICAgX3Byb3BzJHNoYXJkcyA9IHByb3BzLnNoYXJkcyxcbiAgICBzaGFyZHMgPSBfcHJvcHMkc2hhcmRzID09PSB2b2lkIDAgPyBlbXB0eUFycmF5IDogX3Byb3BzJHNoYXJkcyxcbiAgICBfcHJvcHMkYXMgPSBwcm9wcy5hcyxcbiAgICBDb250YWluZXIgPSBfcHJvcHMkYXMgPT09IHZvaWQgMCA/ICdkaXYnIDogX3Byb3BzJGFzLFxuICAgIF9wcm9wcyRsb2NrUHJvcHMgPSBwcm9wcy5sb2NrUHJvcHMsXG4gICAgY29udGFpbmVyUHJvcHMgPSBfcHJvcHMkbG9ja1Byb3BzID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRsb2NrUHJvcHMsXG4gICAgU2lkZUNhciA9IHByb3BzLnNpZGVDYXIsXG4gICAgX3Byb3BzJHJldHVybkZvY3VzID0gcHJvcHMucmV0dXJuRm9jdXMsXG4gICAgc2hvdWxkUmV0dXJuRm9jdXMgPSBfcHJvcHMkcmV0dXJuRm9jdXMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHJldHVybkZvY3VzLFxuICAgIGZvY3VzT3B0aW9ucyA9IHByb3BzLmZvY3VzT3B0aW9ucyxcbiAgICBvbkFjdGl2YXRpb25DYWxsYmFjayA9IHByb3BzLm9uQWN0aXZhdGlvbixcbiAgICBvbkRlYWN0aXZhdGlvbkNhbGxiYWNrID0gcHJvcHMub25EZWFjdGl2YXRpb247XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoe30pLFxuICAgIGlkID0gX1JlYWN0JHVzZVN0YXRlM1swXTtcbiAgdmFyIG9uQWN0aXZhdGlvbiA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGNhcHR1cmVGb2N1c1Jlc3RvcmUgPSBfcmVmLmNhcHR1cmVGb2N1c1Jlc3RvcmU7XG4gICAgaWYgKCFvcmlnaW5hbEZvY3VzZWRFbGVtZW50LmN1cnJlbnQpIHtcbiAgICAgIHZhciBfZG9jdW1lbnQ7XG4gICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IChfZG9jdW1lbnQgPSBkb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgb3JpZ2luYWxGb2N1c2VkRWxlbWVudC5jdXJyZW50ID0gYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChhY3RpdmVFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIG9yaWdpbmFsRm9jdXNlZEVsZW1lbnQuY3VycmVudCA9IGNhcHR1cmVGb2N1c1Jlc3RvcmUoYWN0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvYnNlcnZlZC5jdXJyZW50ICYmIG9uQWN0aXZhdGlvbkNhbGxiYWNrKSB7XG4gICAgICBvbkFjdGl2YXRpb25DYWxsYmFjayhvYnNlcnZlZC5jdXJyZW50KTtcbiAgICB9XG4gICAgaXNBY3RpdmUuY3VycmVudCA9IHRydWU7XG4gICAgdXBkYXRlKCk7XG4gIH0sIFtvbkFjdGl2YXRpb25DYWxsYmFja10pO1xuICB2YXIgb25EZWFjdGl2YXRpb24gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgaXNBY3RpdmUuY3VycmVudCA9IGZhbHNlO1xuICAgIGlmIChvbkRlYWN0aXZhdGlvbkNhbGxiYWNrKSB7XG4gICAgICBvbkRlYWN0aXZhdGlvbkNhbGxiYWNrKG9ic2VydmVkLmN1cnJlbnQpO1xuICAgIH1cbiAgICB1cGRhdGUoKTtcbiAgfSwgW29uRGVhY3RpdmF0aW9uQ2FsbGJhY2tdKTtcbiAgdmFyIHJldHVybkZvY3VzID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGFsbG93RGVmZXIpIHtcbiAgICB2YXIgZm9jdXNSZXN0b3JlID0gb3JpZ2luYWxGb2N1c2VkRWxlbWVudC5jdXJyZW50O1xuICAgIGlmIChmb2N1c1Jlc3RvcmUpIHtcbiAgICAgIHZhciByZXR1cm5Gb2N1c1RvID0gKHR5cGVvZiBmb2N1c1Jlc3RvcmUgPT09ICdmdW5jdGlvbicgPyBmb2N1c1Jlc3RvcmUoKSA6IGZvY3VzUmVzdG9yZSkgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgIHZhciBob3dUb1JldHVybkZvY3VzID0gdHlwZW9mIHNob3VsZFJldHVybkZvY3VzID09PSAnZnVuY3Rpb24nID8gc2hvdWxkUmV0dXJuRm9jdXMocmV0dXJuRm9jdXNUbykgOiBzaG91bGRSZXR1cm5Gb2N1cztcbiAgICAgIGlmIChob3dUb1JldHVybkZvY3VzKSB7XG4gICAgICAgIHZhciByZXR1cm5Gb2N1c09wdGlvbnMgPSB0eXBlb2YgaG93VG9SZXR1cm5Gb2N1cyA9PT0gJ29iamVjdCcgPyBob3dUb1JldHVybkZvY3VzIDogdW5kZWZpbmVkO1xuICAgICAgICBvcmlnaW5hbEZvY3VzZWRFbGVtZW50LmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBpZiAoYWxsb3dEZWZlcikge1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldHVybkZvY3VzVG8uZm9jdXMocmV0dXJuRm9jdXNPcHRpb25zKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm5Gb2N1c1RvLmZvY3VzKHJldHVybkZvY3VzT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIFtzaG91bGRSZXR1cm5Gb2N1c10pO1xuICB2YXIgb25Gb2N1cyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChpc0FjdGl2ZS5jdXJyZW50KSB7XG4gICAgICBtZWRpdW1Gb2N1cy51c2VNZWRpdW0oZXZlbnQpO1xuICAgIH1cbiAgfSwgW10pO1xuICB2YXIgb25CbHVyID0gbWVkaXVtQmx1ci51c2VNZWRpdW07XG4gIHZhciBzZXRPYnNlcnZlTm9kZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChuZXdPYnNlcnZlZCkge1xuICAgIGlmIChvYnNlcnZlZC5jdXJyZW50ICE9PSBuZXdPYnNlcnZlZCkge1xuICAgICAgb2JzZXJ2ZWQuY3VycmVudCA9IG5ld09ic2VydmVkO1xuICAgICAgc2V0T2JzZXJ2ZWQobmV3T2JzZXJ2ZWQpO1xuICAgIH1cbiAgfSwgW10pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmICh0eXBlb2YgYWxsb3dUZXh0U2VsZWN0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS53YXJuKCdSZWFjdC1Gb2N1cy1Mb2NrOiBhbGxvd1RleHRTZWxlY3Rpb24gaXMgZGVwcmVjYXRlZCBhbmQgZW5hYmxlZCBieSBkZWZhdWx0Jyk7XG4gICAgfVxuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIW9ic2VydmVkLmN1cnJlbnQgJiYgdHlwZW9mIENvbnRhaW5lciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9jdXNMb2NrOiBjb3VsZCBub3Qgb2J0YWluIHJlZiB0byBpbnRlcm5hbCBub2RlJyk7XG4gICAgICB9XG4gICAgfSwgW10pO1xuICB9XG4gIHZhciBsb2NrUHJvcHMgPSBfZXh0ZW5kcygoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMltjb25zdGFudHMuRk9DVVNfRElTQUJMRURdID0gZGlzYWJsZWQgJiYgJ2Rpc2FibGVkJywgX2V4dGVuZHMyW2NvbnN0YW50cy5GT0NVU19HUk9VUF0gPSBncm91cCwgX2V4dGVuZHMyKSwgY29udGFpbmVyUHJvcHMpO1xuICB2YXIgaGFzTGVhZGluZ0d1YXJkcyA9IG5vRm9jdXNHdWFyZHMgIT09IHRydWU7XG4gIHZhciBoYXNUYWlsaW5nR3VhcmRzID0gaGFzTGVhZGluZ0d1YXJkcyAmJiBub0ZvY3VzR3VhcmRzICE9PSAndGFpbCc7XG4gIHZhciBtZXJnZWRSZWYgPSB1c2VNZXJnZVJlZnMoW3BhcmVudFJlZiwgc2V0T2JzZXJ2ZU5vZGVdKTtcbiAgdmFyIGZvY3VzU2NvcGVWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvYnNlcnZlZDogb2JzZXJ2ZWQsXG4gICAgICBzaGFyZHM6IHNoYXJkcyxcbiAgICAgIGVuYWJsZWQ6ICFkaXNhYmxlZCxcbiAgICAgIGFjdGl2ZTogaXNBY3RpdmUuY3VycmVudFxuICAgIH07XG4gIH0sIFtkaXNhYmxlZCwgaXNBY3RpdmUuY3VycmVudCwgc2hhcmRzLCByZWFsT2JzZXJ2ZWRdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBoYXNMZWFkaW5nR3VhcmRzICYmIFtcbiAgLyojX19QVVJFX18qL1xuICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiZ3VhcmQtZmlyc3RcIixcbiAgICBcImRhdGEtZm9jdXMtZ3VhcmRcIjogdHJ1ZSxcbiAgICB0YWJJbmRleDogZGlzYWJsZWQgPyAtMSA6IDAsXG4gICAgc3R5bGU6IGhpZGRlbkd1YXJkXG4gIH0pLCBoYXNQb3NpdGl2ZUluZGljZXMgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBcImd1YXJkLW5lYXJlc3RcIixcbiAgICBcImRhdGEtZm9jdXMtZ3VhcmRcIjogdHJ1ZSxcbiAgICB0YWJJbmRleDogZGlzYWJsZWQgPyAtMSA6IDEsXG4gICAgc3R5bGU6IGhpZGRlbkd1YXJkXG4gIH0pIDogbnVsbF0sICFkaXNhYmxlZCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTaWRlQ2FyLCB7XG4gICAgaWQ6IGlkLFxuICAgIHNpZGVDYXI6IG1lZGl1bVNpZGVjYXIsXG4gICAgb2JzZXJ2ZWQ6IHJlYWxPYnNlcnZlZCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgcGVyc2lzdGVudEZvY3VzOiBwZXJzaXN0ZW50Rm9jdXMsXG4gICAgY3Jvc3NGcmFtZTogY3Jvc3NGcmFtZSxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICB3aGl0ZUxpc3Q6IHdoaXRlTGlzdCxcbiAgICBzaGFyZHM6IHNoYXJkcyxcbiAgICBvbkFjdGl2YXRpb246IG9uQWN0aXZhdGlvbixcbiAgICBvbkRlYWN0aXZhdGlvbjogb25EZWFjdGl2YXRpb24sXG4gICAgcmV0dXJuRm9jdXM6IHJldHVybkZvY3VzLFxuICAgIGZvY3VzT3B0aW9uczogZm9jdXNPcHRpb25zXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250YWluZXIsIF9leHRlbmRzKHtcbiAgICByZWY6IG1lcmdlZFJlZlxuICB9LCBsb2NrUHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBvbkJsdXI6IG9uQmx1cixcbiAgICBvbkZvY3VzOiBvbkZvY3VzXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChmb2N1c1Njb3BlLlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGZvY3VzU2NvcGVWYWx1ZVxuICB9LCBjaGlsZHJlbikpLCBoYXNUYWlsaW5nR3VhcmRzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBcImRhdGEtZm9jdXMtZ3VhcmRcIjogdHJ1ZSxcbiAgICB0YWJJbmRleDogZGlzYWJsZWQgPyAtMSA6IDAsXG4gICAgc3R5bGU6IGhpZGRlbkd1YXJkXG4gIH0pKTtcbn0pO1xuRm9jdXNMb2NrLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgY2hpbGRyZW46IG5vZGUsXG4gIGRpc2FibGVkOiBib29sLFxuICByZXR1cm5Gb2N1czogb25lT2ZUeXBlKFtib29sLCBvYmplY3QsIGZ1bmNdKSxcbiAgZm9jdXNPcHRpb25zOiBvYmplY3QsXG4gIG5vRm9jdXNHdWFyZHM6IGJvb2wsXG4gIGhhc1Bvc2l0aXZlSW5kaWNlczogYm9vbCxcbiAgYWxsb3dUZXh0U2VsZWN0aW9uOiBib29sLFxuICBhdXRvRm9jdXM6IGJvb2wsXG4gIHBlcnNpc3RlbnRGb2N1czogYm9vbCxcbiAgY3Jvc3NGcmFtZTogYm9vbCxcbiAgZ3JvdXA6IHN0cmluZyxcbiAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gIHdoaXRlTGlzdDogZnVuYyxcbiAgc2hhcmRzOiBhcnJheU9mKGFueSksXG4gIGFzOiBvbmVPZlR5cGUoW3N0cmluZywgZnVuYywgb2JqZWN0XSksXG4gIGxvY2tQcm9wczogb2JqZWN0LFxuICBvbkFjdGl2YXRpb246IGZ1bmMsXG4gIG9uRGVhY3RpdmF0aW9uOiBmdW5jLFxuICBzaWRlQ2FyOiBhbnkuaXNSZXF1aXJlZFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgRm9jdXNMb2NrOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICdmb2N1cy1sb2NrL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbmxpbmVQcm9wIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IG1lZGl1bUVmZmVjdCB9IGZyb20gJy4vbWVkaXVtJztcbmV4cG9ydCB2YXIgdXNlRm9jdXNJbnNpZGUgPSBmdW5jdGlvbiB1c2VGb2N1c0luc2lkZShvYnNlcnZlZFJlZikge1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbmFibGVkID0gdHJ1ZTtcbiAgICBtZWRpdW1FZmZlY3QudXNlTWVkaXVtKGZ1bmN0aW9uIChjYXIpIHtcbiAgICAgIHZhciBvYnNlcnZlZCA9IG9ic2VydmVkUmVmICYmIG9ic2VydmVkUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoZW5hYmxlZCAmJiBvYnNlcnZlZCkge1xuICAgICAgICBpZiAoIWNhci5mb2N1c0luc2lkZShvYnNlcnZlZCkpIHtcbiAgICAgICAgICBjYXIubW92ZUZvY3VzSW5zaWRlKG9ic2VydmVkLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBlbmFibGVkID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW29ic2VydmVkUmVmXSk7XG59O1xuZnVuY3Rpb24gTW92ZUZvY3VzSW5zaWRlKF9yZWYpIHtcbiAgdmFyIF9yZWYkZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgIGlzRGlzYWJsZWQgPSBfcmVmJGRpc2FibGVkID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkZGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICB2YXIgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB1c2VGb2N1c0luc2lkZShpc0Rpc2FibGVkID8gdW5kZWZpbmVkIDogcmVmKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBpbmxpbmVQcm9wKGNvbnN0YW50cy5GT0NVU19BVVRPLCAhaXNEaXNhYmxlZCksIHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9KSwgY2hpbGRyZW4pO1xufVxuTW92ZUZvY3VzSW5zaWRlLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBNb3ZlRm9jdXNJbnNpZGU7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB3aXRoU2lkZUVmZmVjdCBmcm9tICdyZWFjdC1jbGllbnRzaWRlLWVmZmVjdCc7XG5pbXBvcnQgeyBtb3ZlRm9jdXNJbnNpZGUsIGZvY3VzSW5zaWRlLCBmb2N1c0lzSGlkZGVuLCBleHBhbmRGb2N1c2FibGVOb2RlcywgZm9jdXNOZXh0RWxlbWVudCwgZm9jdXNQcmV2RWxlbWVudCwgZm9jdXNGaXJzdEVsZW1lbnQsIGZvY3VzTGFzdEVsZW1lbnQsIGNhcHR1cmVGb2N1c1Jlc3RvcmUgfSBmcm9tICdmb2N1cy1sb2NrJztcbmltcG9ydCB7IGRlZmVyQWN0aW9uLCBleHRyYWN0UmVmIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IG1lZGl1bUZvY3VzLCBtZWRpdW1CbHVyLCBtZWRpdW1FZmZlY3QgfSBmcm9tICcuL21lZGl1bSc7XG52YXIgZm9jdXNPbkJvZHkgPSBmdW5jdGlvbiBmb2N1c09uQm9keSgpIHtcbiAgcmV0dXJuIGRvY3VtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGRvY3VtZW50LmJvZHk7XG59O1xudmFyIGlzRnJlZUZvY3VzID0gZnVuY3Rpb24gaXNGcmVlRm9jdXMoKSB7XG4gIHJldHVybiBmb2N1c09uQm9keSgpIHx8IGZvY3VzSXNIaWRkZW4oKTtcbn07XG52YXIgbGFzdEFjdGl2ZVRyYXAgPSBudWxsO1xudmFyIGxhc3RBY3RpdmVGb2N1cyA9IG51bGw7XG52YXIgbGFzdFBvcnRhbGVkRWxlbWVudCA9IG51bGw7XG52YXIgZm9jdXNXYXNPdXRzaWRlV2luZG93ID0gZmFsc2U7XG52YXIgZGVmYXVsdFdoaXRlbGlzdCA9IGZ1bmN0aW9uIGRlZmF1bHRXaGl0ZWxpc3QoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBmb2N1c1doaXRlbGlzdGVkID0gZnVuY3Rpb24gZm9jdXNXaGl0ZWxpc3RlZChhY3RpdmVFbGVtZW50KSB7XG4gIHJldHVybiAobGFzdEFjdGl2ZVRyYXAud2hpdGVMaXN0IHx8IGRlZmF1bHRXaGl0ZWxpc3QpKGFjdGl2ZUVsZW1lbnQpO1xufTtcbnZhciByZWNvcmRQb3J0YWwgPSBmdW5jdGlvbiByZWNvcmRQb3J0YWwob2JzZXJ2ZXJOb2RlLCBwb3J0YWxlZEVsZW1lbnQpIHtcbiAgbGFzdFBvcnRhbGVkRWxlbWVudCA9IHtcbiAgICBvYnNlcnZlck5vZGU6IG9ic2VydmVyTm9kZSxcbiAgICBwb3J0YWxlZEVsZW1lbnQ6IHBvcnRhbGVkRWxlbWVudFxuICB9O1xufTtcbnZhciBmb2N1c0lzUG9ydGFsZWRQYWlyID0gZnVuY3Rpb24gZm9jdXNJc1BvcnRhbGVkUGFpcihlbGVtZW50KSB7XG4gIHJldHVybiBsYXN0UG9ydGFsZWRFbGVtZW50ICYmIGxhc3RQb3J0YWxlZEVsZW1lbnQucG9ydGFsZWRFbGVtZW50ID09PSBlbGVtZW50O1xufTtcbmZ1bmN0aW9uIGF1dG9HdWFyZChzdGFydEluZGV4LCBlbmQsIHN0ZXAsIGFsbE5vZGVzKSB7XG4gIHZhciBsYXN0R3VhcmQgPSBudWxsO1xuICB2YXIgaSA9IHN0YXJ0SW5kZXg7XG4gIGRvIHtcbiAgICB2YXIgaXRlbSA9IGFsbE5vZGVzW2ldO1xuICAgIGlmIChpdGVtLmd1YXJkKSB7XG4gICAgICBpZiAoaXRlbS5ub2RlLmRhdGFzZXQuZm9jdXNBdXRvR3VhcmQpIHtcbiAgICAgICAgbGFzdEd1YXJkID0gaXRlbTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGl0ZW0ubG9ja0l0ZW0pIHtcbiAgICAgIGlmIChpICE9PSBzdGFydEluZGV4KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxhc3RHdWFyZCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSB3aGlsZSAoKGkgKz0gc3RlcCkgIT09IGVuZCk7XG4gIGlmIChsYXN0R3VhcmQpIHtcbiAgICBsYXN0R3VhcmQubm9kZS50YWJJbmRleCA9IDA7XG4gIH1cbn1cbnZhciBmb2N1c1dhc091dHNpZGUgPSBmdW5jdGlvbiBmb2N1c1dhc091dHNpZGUoY3Jvc3NGcmFtZU9wdGlvbikge1xuICBpZiAoY3Jvc3NGcmFtZU9wdGlvbikge1xuICAgIHJldHVybiBCb29sZWFuKGZvY3VzV2FzT3V0c2lkZVdpbmRvdyk7XG4gIH1cbiAgcmV0dXJuIGZvY3VzV2FzT3V0c2lkZVdpbmRvdyA9PT0gJ21lYW53aGlsZSc7XG59O1xudmFyIGNoZWNrSW5Ib3N0ID0gZnVuY3Rpb24gY2hlY2tJbkhvc3QoY2hlY2ssIGVsLCBib3VuZGFyeSkge1xuICByZXR1cm4gZWwgJiYgKGVsLmhvc3QgPT09IGNoZWNrICYmICghZWwuYWN0aXZlRWxlbWVudCB8fCBib3VuZGFyeS5jb250YWlucyhlbC5hY3RpdmVFbGVtZW50KSkgfHwgZWwucGFyZW50Tm9kZSAmJiBjaGVja0luSG9zdChjaGVjaywgZWwucGFyZW50Tm9kZSwgYm91bmRhcnkpKTtcbn07XG52YXIgd2l0aGluSG9zdCA9IGZ1bmN0aW9uIHdpdGhpbkhvc3QoYWN0aXZlRWxlbWVudCwgd29ya2luZ0FyZWEpIHtcbiAgcmV0dXJuIHdvcmtpbmdBcmVhLnNvbWUoZnVuY3Rpb24gKGFyZWEpIHtcbiAgICByZXR1cm4gY2hlY2tJbkhvc3QoYWN0aXZlRWxlbWVudCwgYXJlYSwgYXJlYSk7XG4gIH0pO1xufTtcbnZhciBhY3RpdmF0ZVRyYXAgPSBmdW5jdGlvbiBhY3RpdmF0ZVRyYXAoKSB7XG4gIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgaWYgKGxhc3RBY3RpdmVUcmFwKSB7XG4gICAgdmFyIF9sYXN0QWN0aXZlVHJhcCA9IGxhc3RBY3RpdmVUcmFwLFxuICAgICAgb2JzZXJ2ZWQgPSBfbGFzdEFjdGl2ZVRyYXAub2JzZXJ2ZWQsXG4gICAgICBwZXJzaXN0ZW50Rm9jdXMgPSBfbGFzdEFjdGl2ZVRyYXAucGVyc2lzdGVudEZvY3VzLFxuICAgICAgYXV0b0ZvY3VzID0gX2xhc3RBY3RpdmVUcmFwLmF1dG9Gb2N1cyxcbiAgICAgIHNoYXJkcyA9IF9sYXN0QWN0aXZlVHJhcC5zaGFyZHMsXG4gICAgICBjcm9zc0ZyYW1lID0gX2xhc3RBY3RpdmVUcmFwLmNyb3NzRnJhbWUsXG4gICAgICBmb2N1c09wdGlvbnMgPSBfbGFzdEFjdGl2ZVRyYXAuZm9jdXNPcHRpb25zO1xuICAgIHZhciB3b3JraW5nTm9kZSA9IG9ic2VydmVkIHx8IGxhc3RQb3J0YWxlZEVsZW1lbnQgJiYgbGFzdFBvcnRhbGVkRWxlbWVudC5wb3J0YWxlZEVsZW1lbnQ7XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIGlmICh3b3JraW5nTm9kZSkge1xuICAgICAgdmFyIHdvcmtpbmdBcmVhID0gW3dvcmtpbmdOb2RlXS5jb25jYXQoc2hhcmRzLm1hcChleHRyYWN0UmVmKS5maWx0ZXIoQm9vbGVhbikpO1xuICAgICAgaWYgKCFhY3RpdmVFbGVtZW50IHx8IGZvY3VzV2hpdGVsaXN0ZWQoYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgaWYgKHBlcnNpc3RlbnRGb2N1cyB8fCBmb2N1c1dhc091dHNpZGUoY3Jvc3NGcmFtZSkgfHwgIWlzRnJlZUZvY3VzKCkgfHwgIWxhc3RBY3RpdmVGb2N1cyAmJiBhdXRvRm9jdXMpIHtcbiAgICAgICAgICBpZiAod29ya2luZ05vZGUgJiYgIShmb2N1c0luc2lkZSh3b3JraW5nQXJlYSkgfHwgYWN0aXZlRWxlbWVudCAmJiB3aXRoaW5Ib3N0KGFjdGl2ZUVsZW1lbnQsIHdvcmtpbmdBcmVhKSB8fCBmb2N1c0lzUG9ydGFsZWRQYWlyKGFjdGl2ZUVsZW1lbnQsIHdvcmtpbmdOb2RlKSkpIHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudCAmJiAhbGFzdEFjdGl2ZUZvY3VzICYmIGFjdGl2ZUVsZW1lbnQgJiYgIWF1dG9Gb2N1cykge1xuICAgICAgICAgICAgICBpZiAoYWN0aXZlRWxlbWVudC5ibHVyKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gbW92ZUZvY3VzSW5zaWRlKHdvcmtpbmdBcmVhLCBsYXN0QWN0aXZlRm9jdXMsIHtcbiAgICAgICAgICAgICAgICBmb2N1c09wdGlvbnM6IGZvY3VzT3B0aW9uc1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbGFzdFBvcnRhbGVkRWxlbWVudCA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb2N1c1dhc091dHNpZGVXaW5kb3cgPSBmYWxzZTtcbiAgICAgICAgICBsYXN0QWN0aXZlRm9jdXMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZG9jdW1lbnQgJiYgYWN0aXZlRWxlbWVudCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1mb2N1cy1hdXRvLWd1YXJkXScpKSB7XG4gICAgICAgIHZhciBuZXdBY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgdmFyIGFsbE5vZGVzID0gZXhwYW5kRm9jdXNhYmxlTm9kZXMod29ya2luZ0FyZWEpO1xuICAgICAgICB2YXIgZm9jdXNlZEluZGV4ID0gYWxsTm9kZXMubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgdmFyIG5vZGUgPSBfcmVmLm5vZGU7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0pLmluZGV4T2YobmV3QWN0aXZlRWxlbWVudCk7XG4gICAgICAgIGlmIChmb2N1c2VkSW5kZXggPiAtMSkge1xuICAgICAgICAgIGFsbE5vZGVzLmZpbHRlcihmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICAgIHZhciBndWFyZCA9IF9yZWYyLmd1YXJkLFxuICAgICAgICAgICAgICBub2RlID0gX3JlZjIubm9kZTtcbiAgICAgICAgICAgIHJldHVybiBndWFyZCAmJiBub2RlLmRhdGFzZXQuZm9jdXNBdXRvR3VhcmQ7XG4gICAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgICAgIHZhciBub2RlID0gX3JlZjMubm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlLnJlbW92ZUF0dHJpYnV0ZSgndGFiSW5kZXgnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhdXRvR3VhcmQoZm9jdXNlZEluZGV4LCBhbGxOb2Rlcy5sZW5ndGgsICsxLCBhbGxOb2Rlcyk7XG4gICAgICAgICAgYXV0b0d1YXJkKGZvY3VzZWRJbmRleCwgLTEsIC0xLCBhbGxOb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgb25UcmFwID0gZnVuY3Rpb24gb25UcmFwKGV2ZW50KSB7XG4gIGlmIChhY3RpdmF0ZVRyYXAoKSAmJiBldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn07XG52YXIgb25CbHVyID0gZnVuY3Rpb24gb25CbHVyKCkge1xuICByZXR1cm4gZGVmZXJBY3Rpb24oYWN0aXZhdGVUcmFwKTtcbn07XG52YXIgb25Gb2N1cyA9IGZ1bmN0aW9uIG9uRm9jdXMoZXZlbnQpIHtcbiAgdmFyIHNvdXJjZSA9IGV2ZW50LnRhcmdldDtcbiAgdmFyIGN1cnJlbnROb2RlID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgaWYgKCFjdXJyZW50Tm9kZS5jb250YWlucyhzb3VyY2UpKSB7XG4gICAgcmVjb3JkUG9ydGFsKGN1cnJlbnROb2RlLCBzb3VyY2UpO1xuICB9XG59O1xudmFyIEZvY3VzV2F0Y2hlciA9IGZ1bmN0aW9uIEZvY3VzV2F0Y2hlcigpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xudmFyIEZvY3VzVHJhcCA9IGZ1bmN0aW9uIEZvY3VzVHJhcChfcmVmNCkge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmNC5jaGlsZHJlbjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBvbkJsdXI6IG9uQmx1cixcbiAgICBvbkZvY3VzOiBvbkZvY3VzXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5Gb2N1c1RyYXAucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZFxufSA6IHt9O1xudmFyIG9uV2luZG93Qmx1ciA9IGZ1bmN0aW9uIG9uV2luZG93Qmx1cigpIHtcbiAgZm9jdXNXYXNPdXRzaWRlV2luZG93ID0gJ2p1c3QnO1xuICBkZWZlckFjdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgZm9jdXNXYXNPdXRzaWRlV2luZG93ID0gJ21lYW53aGlsZSc7XG4gIH0pO1xufTtcbnZhciBhdHRhY2hIYW5kbGVyID0gZnVuY3Rpb24gYXR0YWNoSGFuZGxlcigpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG9uVHJhcCk7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25CbHVyKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbldpbmRvd0JsdXIpO1xufTtcbnZhciBkZXRhY2hIYW5kbGVyID0gZnVuY3Rpb24gZGV0YWNoSGFuZGxlcigpIHtcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG9uVHJhcCk7XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25CbHVyKTtcbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbldpbmRvd0JsdXIpO1xufTtcbmZ1bmN0aW9uIHJlZHVjZVByb3BzVG9TdGF0ZShwcm9wc0xpc3QpIHtcbiAgcmV0dXJuIHByb3BzTGlzdC5maWx0ZXIoZnVuY3Rpb24gKF9yZWY1KSB7XG4gICAgdmFyIGRpc2FibGVkID0gX3JlZjUuZGlzYWJsZWQ7XG4gICAgcmV0dXJuICFkaXNhYmxlZDtcbiAgfSk7XG59XG52YXIgZm9jdXNMb2NrQVBJID0ge1xuICBtb3ZlRm9jdXNJbnNpZGU6IG1vdmVGb2N1c0luc2lkZSxcbiAgZm9jdXNJbnNpZGU6IGZvY3VzSW5zaWRlLFxuICBmb2N1c05leHRFbGVtZW50OiBmb2N1c05leHRFbGVtZW50LFxuICBmb2N1c1ByZXZFbGVtZW50OiBmb2N1c1ByZXZFbGVtZW50LFxuICBmb2N1c0ZpcnN0RWxlbWVudDogZm9jdXNGaXJzdEVsZW1lbnQsXG4gIGZvY3VzTGFzdEVsZW1lbnQ6IGZvY3VzTGFzdEVsZW1lbnQsXG4gIGNhcHR1cmVGb2N1c1Jlc3RvcmU6IGNhcHR1cmVGb2N1c1Jlc3RvcmVcbn07XG5mdW5jdGlvbiBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50KHRyYXBzKSB7XG4gIHZhciB0cmFwID0gdHJhcHMuc2xpY2UoLTEpWzBdO1xuICBpZiAodHJhcCAmJiAhbGFzdEFjdGl2ZVRyYXApIHtcbiAgICBhdHRhY2hIYW5kbGVyKCk7XG4gIH1cbiAgdmFyIGxhc3RUcmFwID0gbGFzdEFjdGl2ZVRyYXA7XG4gIHZhciBzYW1lVHJhcCA9IGxhc3RUcmFwICYmIHRyYXAgJiYgdHJhcC5pZCA9PT0gbGFzdFRyYXAuaWQ7XG4gIGxhc3RBY3RpdmVUcmFwID0gdHJhcDtcbiAgaWYgKGxhc3RUcmFwICYmICFzYW1lVHJhcCkge1xuICAgIGxhc3RUcmFwLm9uRGVhY3RpdmF0aW9uKCk7XG4gICAgaWYgKCF0cmFwcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWY2KSB7XG4gICAgICB2YXIgaWQgPSBfcmVmNi5pZDtcbiAgICAgIHJldHVybiBpZCA9PT0gbGFzdFRyYXAuaWQ7XG4gICAgfSkubGVuZ3RoKSB7XG4gICAgICBsYXN0VHJhcC5yZXR1cm5Gb2N1cyghdHJhcCk7XG4gICAgfVxuICB9XG4gIGlmICh0cmFwKSB7XG4gICAgbGFzdEFjdGl2ZUZvY3VzID0gbnVsbDtcbiAgICBpZiAoIXNhbWVUcmFwIHx8IGxhc3RUcmFwLm9ic2VydmVkICE9PSB0cmFwLm9ic2VydmVkKSB7XG4gICAgICB0cmFwLm9uQWN0aXZhdGlvbihmb2N1c0xvY2tBUEkpO1xuICAgIH1cbiAgICBhY3RpdmF0ZVRyYXAodHJ1ZSk7XG4gICAgZGVmZXJBY3Rpb24oYWN0aXZhdGVUcmFwKTtcbiAgfSBlbHNlIHtcbiAgICBkZXRhY2hIYW5kbGVyKCk7XG4gICAgbGFzdEFjdGl2ZUZvY3VzID0gbnVsbDtcbiAgfVxufVxubWVkaXVtRm9jdXMuYXNzaWduU3luY01lZGl1bShvbkZvY3VzKTtcbm1lZGl1bUJsdXIuYXNzaWduTWVkaXVtKG9uQmx1cik7XG5tZWRpdW1FZmZlY3QuYXNzaWduTWVkaXVtKGZ1bmN0aW9uIChjYikge1xuICByZXR1cm4gY2IoZm9jdXNMb2NrQVBJKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFNpZGVFZmZlY3QocmVkdWNlUHJvcHNUb1N0YXRlLCBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50KShGb2N1c1dhdGNoZXIpOyIsImltcG9ydCBGb2N1c0xvY2tVSSBmcm9tICcuL0xvY2snO1xuaW1wb3J0IEF1dG9Gb2N1c0luc2lkZSBmcm9tICcuL0F1dG9Gb2N1c0luc2lkZSc7XG5pbXBvcnQgTW92ZUZvY3VzSW5zaWRlLCB7IHVzZUZvY3VzSW5zaWRlIH0gZnJvbSAnLi9Nb3ZlRm9jdXNJbnNpZGUnO1xuaW1wb3J0IEZyZWVGb2N1c0luc2lkZSBmcm9tICcuL0ZyZWVGb2N1c0luc2lkZSc7XG5pbXBvcnQgSW5Gb2N1c0d1YXJkIGZyb20gJy4vRm9jdXNHdWFyZCc7XG5pbXBvcnQgeyB1c2VGb2N1c0NvbnRyb2xsZXIsIHVzZUZvY3VzU2NvcGUgfSBmcm9tICcuL3VzZS1mb2N1cy1zY29wZSc7XG5pbXBvcnQgeyB1c2VGb2N1c1N0YXRlIH0gZnJvbSAnLi91c2UtZm9jdXMtc3RhdGUnO1xuZXhwb3J0IHsgQXV0b0ZvY3VzSW5zaWRlLCBNb3ZlRm9jdXNJbnNpZGUsIEZyZWVGb2N1c0luc2lkZSwgSW5Gb2N1c0d1YXJkLCBGb2N1c0xvY2tVSSwgdXNlRm9jdXNJbnNpZGUsIHVzZUZvY3VzQ29udHJvbGxlciwgdXNlRm9jdXNTY29wZSwgdXNlRm9jdXNTdGF0ZSB9O1xuZXhwb3J0IGRlZmF1bHQgRm9jdXNMb2NrVUk7IiwiaW1wb3J0IEZvY3VzTG9jayBmcm9tICcuL0NvbWJpbmF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vVUknO1xuZXhwb3J0IGRlZmF1bHQgRm9jdXNMb2NrOyIsImltcG9ydCB7IGNyZWF0ZU1lZGl1bSwgY3JlYXRlU2lkZWNhck1lZGl1bSB9IGZyb20gJ3VzZS1zaWRlY2FyJztcbmV4cG9ydCB2YXIgbWVkaXVtRm9jdXMgPSBjcmVhdGVNZWRpdW0oe30sIGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciB0YXJnZXQgPSBfcmVmLnRhcmdldCxcbiAgICBjdXJyZW50VGFyZ2V0ID0gX3JlZi5jdXJyZW50VGFyZ2V0O1xuICByZXR1cm4ge1xuICAgIHRhcmdldDogdGFyZ2V0LFxuICAgIGN1cnJlbnRUYXJnZXQ6IGN1cnJlbnRUYXJnZXRcbiAgfTtcbn0pO1xuZXhwb3J0IHZhciBtZWRpdW1CbHVyID0gY3JlYXRlTWVkaXVtKCk7XG5leHBvcnQgdmFyIG1lZGl1bUVmZmVjdCA9IGNyZWF0ZU1lZGl1bSgpO1xuZXhwb3J0IHZhciBtZWRpdW1TaWRlY2FyID0gY3JlYXRlU2lkZWNhck1lZGl1bSh7XG4gIGFzeW5jOiB0cnVlLFxuICBzc3I6IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcbn0pOyIsImV4cG9ydCB2YXIgY3JlYXRlTmFub0V2ZW50cyA9IGZ1bmN0aW9uIGNyZWF0ZU5hbm9FdmVudHMoKSB7XG4gIHJldHVybiB7XG4gICAgZW1pdDogZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwLCBjYWxsYmFja3MgPSB0aGlzLmV2ZW50c1tldmVudF0gfHwgW10sIGxlbmd0aCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjYWxsYmFja3NbaV0uYXBwbHkoY2FsbGJhY2tzLCBhcmdzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV2ZW50czoge30sXG4gICAgb246IGZ1bmN0aW9uIG9uKGV2ZW50LCBjYikge1xuICAgICAgdmFyIF90aGlzJGV2ZW50cyxcbiAgICAgICAgX3RoaXMgPSB0aGlzO1xuICAgICAgKChfdGhpcyRldmVudHMgPSB0aGlzLmV2ZW50cylbZXZlbnRdIHx8IChfdGhpcyRldmVudHNbZXZlbnRdID0gW10pKS5wdXNoKGNiKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyRldmVudHMkZXZlbnQ7XG4gICAgICAgIF90aGlzLmV2ZW50c1tldmVudF0gPSAoX3RoaXMkZXZlbnRzJGV2ZW50ID0gX3RoaXMuZXZlbnRzW2V2ZW50XSkgPT0gbnVsbCA/IHZvaWQgMCA6IF90aGlzJGV2ZW50cyRldmVudC5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICByZXR1cm4gY2IgIT09IGk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59OyIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIGZvY3VzU2NvcGUgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZm9jdXNTY29wZSB9IGZyb20gJy4vc2NvcGUnO1xuaW1wb3J0IHsgbWVkaXVtRWZmZWN0IH0gZnJvbSAnLi9tZWRpdW0nO1xuaW1wb3J0IHsgZXh0cmFjdFJlZiB9IGZyb20gJy4vdXRpbCc7XG52YXIgY29sbGFwc2VSZWZzID0gZnVuY3Rpb24gY29sbGFwc2VSZWZzKHNoYXJkcykge1xuICByZXR1cm4gc2hhcmRzLm1hcChleHRyYWN0UmVmKS5maWx0ZXIoQm9vbGVhbik7XG59O1xudmFyIHdpdGhNZWRpdW0gPSBmdW5jdGlvbiB3aXRoTWVkaXVtKGZuKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIHJldHVybiBtZWRpdW1FZmZlY3QudXNlTWVkaXVtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc29sdmUoZm4uYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuZXhwb3J0IHZhciB1c2VGb2N1c0NvbnRyb2xsZXIgPSBmdW5jdGlvbiB1c2VGb2N1c0NvbnRyb2xsZXIoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzaGFyZHMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc2hhcmRzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIGlmICghc2hhcmRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlRm9jdXNDb250cm9sbGVyIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB0YXJnZXQgZWxlbWVudCcpO1xuICB9XG4gIHZhciByZWYgPSB1c2VSZWYoc2hhcmRzKTtcbiAgcmVmLmN1cnJlbnQgPSBzaGFyZHM7XG4gIHJldHVybiB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXV0b0ZvY3VzOiBmdW5jdGlvbiBhdXRvRm9jdXMoZm9jdXNPcHRpb25zKSB7XG4gICAgICAgIGlmIChmb2N1c09wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGZvY3VzT3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aXRoTWVkaXVtKGZ1bmN0aW9uIChjYXIpIHtcbiAgICAgICAgICByZXR1cm4gY2FyLm1vdmVGb2N1c0luc2lkZShjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpLCBudWxsLCBmb2N1c09wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmb2N1c05leHQ6IGZ1bmN0aW9uIGZvY3VzTmV4dChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB3aXRoTWVkaXVtKGZ1bmN0aW9uIChjYXIpIHtcbiAgICAgICAgICBjYXIubW92ZUZvY3VzSW5zaWRlKGNvbGxhcHNlUmVmcyhyZWYuY3VycmVudCksIG51bGwpO1xuICAgICAgICAgIGNhci5mb2N1c05leHRFbGVtZW50KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIF9leHRlbmRzKHtcbiAgICAgICAgICAgIHNjb3BlOiBjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpXG4gICAgICAgICAgfSwgb3B0aW9ucykpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmb2N1c1ByZXY6IGZ1bmN0aW9uIGZvY3VzUHJldihvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB3aXRoTWVkaXVtKGZ1bmN0aW9uIChjYXIpIHtcbiAgICAgICAgICBjYXIubW92ZUZvY3VzSW5zaWRlKGNvbGxhcHNlUmVmcyhyZWYuY3VycmVudCksIG51bGwpO1xuICAgICAgICAgIGNhci5mb2N1c1ByZXZFbGVtZW50KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIF9leHRlbmRzKHtcbiAgICAgICAgICAgIHNjb3BlOiBjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpXG4gICAgICAgICAgfSwgb3B0aW9ucykpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmb2N1c0ZpcnN0OiBmdW5jdGlvbiBmb2N1c0ZpcnN0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhNZWRpdW0oZnVuY3Rpb24gKGNhcikge1xuICAgICAgICAgIGNhci5mb2N1c0ZpcnN0RWxlbWVudChjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZm9jdXNMYXN0OiBmdW5jdGlvbiBmb2N1c0xhc3Qob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gd2l0aE1lZGl1bShmdW5jdGlvbiAoY2FyKSB7XG4gICAgICAgICAgY2FyLmZvY3VzTGFzdEVsZW1lbnQoY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KSwgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcbn07XG5leHBvcnQgdmFyIHVzZUZvY3VzU2NvcGUgPSBmdW5jdGlvbiB1c2VGb2N1c1Njb3BlKCkge1xuICB2YXIgc2NvcGUgPSB1c2VDb250ZXh0KGZvY3VzU2NvcGUpO1xuICBpZiAoIXNjb3BlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGb2N1c0xvY2sgaXMgcmVxdWlyZWQgdG8gb3BlcmF0ZSB3aXRoIEZvY3VzU2NvcGUnKTtcbiAgfVxuICByZXR1cm4gdXNlRm9jdXNDb250cm9sbGVyLmFwcGx5KHZvaWQgMCwgW3Njb3BlLm9ic2VydmVkXS5jb25jYXQoc2NvcGUuc2hhcmRzKSk7XG59OyIsImltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVOYW5vRXZlbnRzIH0gZnJvbSAnLi9uYW5vLWV2ZW50cyc7XG52YXIgbWFpbmJ1cyA9IGNyZWF0ZU5hbm9FdmVudHMoKTtcbnZhciBzdWJzY3JpYmVDb3VudGVyID0gMDtcbnZhciBvbkZvY3VzSW4gPSBmdW5jdGlvbiBvbkZvY3VzSW4oZXZlbnQpIHtcbiAgcmV0dXJuIG1haW5idXMuZW1pdCgnYXNzaWduJywgZXZlbnQudGFyZ2V0KTtcbn07XG52YXIgb25Gb2N1c091dCA9IGZ1bmN0aW9uIG9uRm9jdXNPdXQoZXZlbnQpIHtcbiAgcmV0dXJuIG1haW5idXMuZW1pdCgncmVzZXQnLCBldmVudC50YXJnZXQpO1xufTtcbnZhciB1c2VEb2N1bWVudEZvY3VzU3Vic2NyaWJlID0gZnVuY3Rpb24gdXNlRG9jdW1lbnRGb2N1c1N1YnNjcmliZSgpIHtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN1YnNjcmliZUNvdW50ZXIpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvbkZvY3VzSW4pO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBvbkZvY3VzT3V0KTtcbiAgICB9XG4gICAgc3Vic2NyaWJlQ291bnRlciArPSAxO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBzdWJzY3JpYmVDb3VudGVyIC09IDE7XG4gICAgICBpZiAoIXN1YnNjcmliZUNvdW50ZXIpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG9uRm9jdXNJbik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25Gb2N1c091dCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW10pO1xufTtcbnZhciBnZXRGb2N1c1N0YXRlID0gZnVuY3Rpb24gZ2V0Rm9jdXNTdGF0ZSh0YXJnZXQsIGN1cnJlbnQpIHtcbiAgaWYgKHRhcmdldCA9PT0gY3VycmVudCkge1xuICAgIHJldHVybiAnc2VsZic7XG4gIH1cbiAgaWYgKGN1cnJlbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgIHJldHVybiAnd2l0aGluJztcbiAgfVxuICByZXR1cm4gJ3dpdGhpbi1ib3VuZGFyeSc7XG59O1xuZXhwb3J0IHZhciB1c2VGb2N1c1N0YXRlID0gZnVuY3Rpb24gdXNlRm9jdXNTdGF0ZShjYWxsYmFja3MpIHtcbiAgaWYgKGNhbGxiYWNrcyA9PT0gdm9pZCAwKSB7XG4gICAgY2FsbGJhY2tzID0ge307XG4gIH1cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICBhY3RpdmUgPSBfdXNlU3RhdGVbMF0sXG4gICAgc2V0QWN0aXZlID0gX3VzZVN0YXRlWzFdO1xuICB2YXIgX3VzZVN0YXRlMiA9IHVzZVN0YXRlKCcnKSxcbiAgICBzdGF0ZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3RhdGUgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgcmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgZm9jdXNTdGF0ZSA9IHVzZVJlZih7fSk7XG4gIHZhciBzdGF0ZVRyYWNrZXIgPSB1c2VSZWYoZmFsc2UpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChyZWYuY3VycmVudCkge1xuICAgICAgdmFyIGlzQWxyZWFkeUZvY3VzZWQgPSByZWYuY3VycmVudCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB8fCByZWYuY3VycmVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAgIHNldEFjdGl2ZShpc0FscmVhZHlGb2N1c2VkKTtcbiAgICAgIHNldFN0YXRlKGdldEZvY3VzU3RhdGUoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCwgcmVmLmN1cnJlbnQpKTtcbiAgICAgIGlmIChpc0FscmVhZHlGb2N1c2VkICYmIGNhbGxiYWNrcy5vbkZvY3VzKSB7XG4gICAgICAgIGNhbGxiYWNrcy5vbkZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbXSk7XG4gIHZhciBvbkZvY3VzID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKGUpIHtcbiAgICBmb2N1c1N0YXRlLmN1cnJlbnQgPSB7XG4gICAgICBmb2N1c2VkOiB0cnVlLFxuICAgICAgc3RhdGU6IGdldEZvY3VzU3RhdGUoZS50YXJnZXQsIGUuY3VycmVudFRhcmdldClcbiAgICB9O1xuICB9LCBbXSk7XG4gIHVzZURvY3VtZW50Rm9jdXNTdWJzY3JpYmUoKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZm91dCA9IG1haW5idXMub24oJ3Jlc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9jdXNTdGF0ZS5jdXJyZW50ID0ge307XG4gICAgfSk7XG4gICAgdmFyIGZpbiA9IG1haW5idXMub24oJ2Fzc2lnbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGZvY3VzU3RhdGUuY3VycmVudC5mb2N1c2VkIHx8IGZhbHNlO1xuICAgICAgc2V0QWN0aXZlKG5ld1N0YXRlKTtcbiAgICAgIHNldFN0YXRlKGZvY3VzU3RhdGUuY3VycmVudC5zdGF0ZSB8fCAnJyk7XG4gICAgICBpZiAobmV3U3RhdGUgIT09IHN0YXRlVHJhY2tlci5jdXJyZW50KSB7XG4gICAgICAgIHN0YXRlVHJhY2tlci5jdXJyZW50ID0gbmV3U3RhdGU7XG4gICAgICAgIGlmIChuZXdTdGF0ZSkge1xuICAgICAgICAgIGNhbGxiYWNrcy5vbkZvY3VzICYmIGNhbGxiYWNrcy5vbkZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2tzLm9uQmx1ciAmJiBjYWxsYmFja3Mub25CbHVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZm91dCgpO1xuICAgICAgZmluKCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4ge1xuICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgIHN0YXRlOiBzdGF0ZSxcbiAgICBvbkZvY3VzOiBvbkZvY3VzLFxuICAgIHJlZjogcmVmXG4gIH07XG59OyIsImV4cG9ydCBmdW5jdGlvbiBkZWZlckFjdGlvbihhY3Rpb24pIHtcbiAgc2V0VGltZW91dChhY3Rpb24sIDEpO1xufVxuZXhwb3J0IHZhciBpbmxpbmVQcm9wID0gZnVuY3Rpb24gaW5saW5lUHJvcChuYW1lLCB2YWx1ZSkge1xuICB2YXIgb2JqID0ge307XG4gIG9ialtuYW1lXSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufTtcbmV4cG9ydCB2YXIgZXh0cmFjdFJlZiA9IGZ1bmN0aW9uIGV4dHJhY3RSZWYocmVmKSB7XG4gIHJldHVybiByZWYgJiYgJ2N1cnJlbnQnIGluIHJlZiA/IHJlZi5jdXJyZW50IDogcmVmO1xufTsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpdGhTaWRlRWZmZWN0IGZyb20gJ3JlYWN0LXNpZGUtZWZmZWN0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ3JlYWN0LWZhc3QtY29tcGFyZSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IG9iamVjdEFzc2lnbiBmcm9tICdvYmplY3QtYXNzaWduJztcblxudmFyIEFUVFJJQlVURV9OQU1FUyA9IHtcbiAgICBCT0RZOiBcImJvZHlBdHRyaWJ1dGVzXCIsXG4gICAgSFRNTDogXCJodG1sQXR0cmlidXRlc1wiLFxuICAgIFRJVExFOiBcInRpdGxlQXR0cmlidXRlc1wiXG59O1xuXG52YXIgVEFHX05BTUVTID0ge1xuICAgIEJBU0U6IFwiYmFzZVwiLFxuICAgIEJPRFk6IFwiYm9keVwiLFxuICAgIEhFQUQ6IFwiaGVhZFwiLFxuICAgIEhUTUw6IFwiaHRtbFwiLFxuICAgIExJTks6IFwibGlua1wiLFxuICAgIE1FVEE6IFwibWV0YVwiLFxuICAgIE5PU0NSSVBUOiBcIm5vc2NyaXB0XCIsXG4gICAgU0NSSVBUOiBcInNjcmlwdFwiLFxuICAgIFNUWUxFOiBcInN0eWxlXCIsXG4gICAgVElUTEU6IFwidGl0bGVcIlxufTtcblxudmFyIFZBTElEX1RBR19OQU1FUyA9IE9iamVjdC5rZXlzKFRBR19OQU1FUykubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIFRBR19OQU1FU1tuYW1lXTtcbn0pO1xuXG52YXIgVEFHX1BST1BFUlRJRVMgPSB7XG4gICAgQ0hBUlNFVDogXCJjaGFyc2V0XCIsXG4gICAgQ1NTX1RFWFQ6IFwiY3NzVGV4dFwiLFxuICAgIEhSRUY6IFwiaHJlZlwiLFxuICAgIEhUVFBFUVVJVjogXCJodHRwLWVxdWl2XCIsXG4gICAgSU5ORVJfSFRNTDogXCJpbm5lckhUTUxcIixcbiAgICBJVEVNX1BST1A6IFwiaXRlbXByb3BcIixcbiAgICBOQU1FOiBcIm5hbWVcIixcbiAgICBQUk9QRVJUWTogXCJwcm9wZXJ0eVwiLFxuICAgIFJFTDogXCJyZWxcIixcbiAgICBTUkM6IFwic3JjXCIsXG4gICAgVEFSR0VUOiBcInRhcmdldFwiXG59O1xuXG52YXIgUkVBQ1RfVEFHX01BUCA9IHtcbiAgICBhY2Nlc3NrZXk6IFwiYWNjZXNzS2V5XCIsXG4gICAgY2hhcnNldDogXCJjaGFyU2V0XCIsXG4gICAgY2xhc3M6IFwiY2xhc3NOYW1lXCIsXG4gICAgY29udGVudGVkaXRhYmxlOiBcImNvbnRlbnRFZGl0YWJsZVwiLFxuICAgIGNvbnRleHRtZW51OiBcImNvbnRleHRNZW51XCIsXG4gICAgXCJodHRwLWVxdWl2XCI6IFwiaHR0cEVxdWl2XCIsXG4gICAgaXRlbXByb3A6IFwiaXRlbVByb3BcIixcbiAgICB0YWJpbmRleDogXCJ0YWJJbmRleFwiXG59O1xuXG52YXIgSEVMTUVUX1BST1BTID0ge1xuICAgIERFRkFVTFRfVElUTEU6IFwiZGVmYXVsdFRpdGxlXCIsXG4gICAgREVGRVI6IFwiZGVmZXJcIixcbiAgICBFTkNPREVfU1BFQ0lBTF9DSEFSQUNURVJTOiBcImVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzXCIsXG4gICAgT05fQ0hBTkdFX0NMSUVOVF9TVEFURTogXCJvbkNoYW5nZUNsaWVudFN0YXRlXCIsXG4gICAgVElUTEVfVEVNUExBVEU6IFwidGl0bGVUZW1wbGF0ZVwiXG59O1xuXG52YXIgSFRNTF9UQUdfTUFQID0gT2JqZWN0LmtleXMoUkVBQ1RfVEFHX01BUCkucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAgIG9ialtSRUFDVF9UQUdfTUFQW2tleV1dID0ga2V5O1xuICAgIHJldHVybiBvYmo7XG59LCB7fSk7XG5cbnZhciBTRUxGX0NMT1NJTkdfVEFHUyA9IFtUQUdfTkFNRVMuTk9TQ1JJUFQsIFRBR19OQU1FUy5TQ1JJUFQsIFRBR19OQU1FUy5TVFlMRV07XG5cbnZhciBIRUxNRVRfQVRUUklCVVRFID0gXCJkYXRhLXJlYWN0LWhlbG1ldFwiO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iajtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xufTtcblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBpbmhlcml0cyA9IGZ1bmN0aW9uIChzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzcztcbn07XG5cbnZhciBvYmplY3RXaXRob3V0UHJvcGVydGllcyA9IGZ1bmN0aW9uIChvYmosIGtleXMpIHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuXG4gIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTtcbiAgICB0YXJnZXRbaV0gPSBvYmpbaV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxudmFyIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gPSBmdW5jdGlvbiAoc2VsZiwgY2FsbCkge1xuICBpZiAoIXNlbGYpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjtcbn07XG5cbnZhciBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVycyA9IGZ1bmN0aW9uIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzKHN0cikge1xuICAgIHZhciBlbmNvZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG5cbiAgICBpZiAoZW5jb2RlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKS5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKS5yZXBsYWNlKC8nL2csIFwiJiN4Mjc7XCIpO1xufTtcblxudmFyIGdldFRpdGxlRnJvbVByb3BzTGlzdCA9IGZ1bmN0aW9uIGdldFRpdGxlRnJvbVByb3BzTGlzdChwcm9wc0xpc3QpIHtcbiAgICB2YXIgaW5uZXJtb3N0VGl0bGUgPSBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIFRBR19OQU1FUy5USVRMRSk7XG4gICAgdmFyIGlubmVybW9zdFRlbXBsYXRlID0gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuVElUTEVfVEVNUExBVEUpO1xuXG4gICAgaWYgKGlubmVybW9zdFRlbXBsYXRlICYmIGlubmVybW9zdFRpdGxlKSB7XG4gICAgICAgIC8vIHVzZSBmdW5jdGlvbiBhcmcgdG8gYXZvaWQgbmVlZCB0byBlc2NhcGUgJCBjaGFyYWN0ZXJzXG4gICAgICAgIHJldHVybiBpbm5lcm1vc3RUZW1wbGF0ZS5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShpbm5lcm1vc3RUaXRsZSkgPyBpbm5lcm1vc3RUaXRsZS5qb2luKFwiXCIpIDogaW5uZXJtb3N0VGl0bGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBpbm5lcm1vc3REZWZhdWx0VGl0bGUgPSBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIEhFTE1FVF9QUk9QUy5ERUZBVUxUX1RJVExFKTtcblxuICAgIHJldHVybiBpbm5lcm1vc3RUaXRsZSB8fCBpbm5lcm1vc3REZWZhdWx0VGl0bGUgfHwgdW5kZWZpbmVkO1xufTtcblxudmFyIGdldE9uQ2hhbmdlQ2xpZW50U3RhdGUgPSBmdW5jdGlvbiBnZXRPbkNoYW5nZUNsaWVudFN0YXRlKHByb3BzTGlzdCkge1xuICAgIHJldHVybiBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIEhFTE1FVF9QUk9QUy5PTl9DSEFOR0VfQ0xJRU5UX1NUQVRFKSB8fCBmdW5jdGlvbiAoKSB7fTtcbn07XG5cbnZhciBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdCA9IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZXNGcm9tUHJvcHNMaXN0KHRhZ1R5cGUsIHByb3BzTGlzdCkge1xuICAgIHJldHVybiBwcm9wc0xpc3QuZmlsdGVyKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHByb3BzW3RhZ1R5cGVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIH0pLm1hcChmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHByb3BzW3RhZ1R5cGVdO1xuICAgIH0pLnJlZHVjZShmdW5jdGlvbiAodGFnQXR0cnMsIGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCB0YWdBdHRycywgY3VycmVudCk7XG4gICAgfSwge30pO1xufTtcblxudmFyIGdldEJhc2VUYWdGcm9tUHJvcHNMaXN0ID0gZnVuY3Rpb24gZ2V0QmFzZVRhZ0Zyb21Qcm9wc0xpc3QocHJpbWFyeUF0dHJpYnV0ZXMsIHByb3BzTGlzdCkge1xuICAgIHJldHVybiBwcm9wc0xpc3QuZmlsdGVyKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHByb3BzW1RBR19OQU1FUy5CQVNFXSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgIHJldHVybiBwcm9wc1tUQUdfTkFNRVMuQkFTRV07XG4gICAgfSkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoaW5uZXJtb3N0QmFzZVRhZywgdGFnKSB7XG4gICAgICAgIGlmICghaW5uZXJtb3N0QmFzZVRhZy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGFnKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZUtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGxvd2VyQ2FzZUF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZUtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHByaW1hcnlBdHRyaWJ1dGVzLmluZGV4T2YobG93ZXJDYXNlQXR0cmlidXRlS2V5KSAhPT0gLTEgJiYgdGFnW2xvd2VyQ2FzZUF0dHJpYnV0ZUtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlubmVybW9zdEJhc2VUYWcuY29uY2F0KHRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlubmVybW9zdEJhc2VUYWc7XG4gICAgfSwgW10pO1xufTtcblxudmFyIGdldFRhZ3NGcm9tUHJvcHNMaXN0ID0gZnVuY3Rpb24gZ2V0VGFnc0Zyb21Qcm9wc0xpc3QodGFnTmFtZSwgcHJpbWFyeUF0dHJpYnV0ZXMsIHByb3BzTGlzdCkge1xuICAgIC8vIENhbGN1bGF0ZSBsaXN0IG9mIHRhZ3MsIGdpdmluZyBwcmlvcml0eSBpbm5lcm1vc3QgY29tcG9uZW50IChlbmQgb2YgdGhlIHByb3BzbGlzdClcbiAgICB2YXIgYXBwcm92ZWRTZWVuVGFncyA9IHt9O1xuXG4gICAgcmV0dXJuIHByb3BzTGlzdC5maWx0ZXIoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BzW3RhZ05hbWVdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wc1t0YWdOYW1lXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgd2FybihcIkhlbG1ldDogXCIgKyB0YWdOYW1lICsgXCIgc2hvdWxkIGJlIG9mIHR5cGUgXFxcIkFycmF5XFxcIi4gSW5zdGVhZCBmb3VuZCB0eXBlIFxcXCJcIiArIF90eXBlb2YocHJvcHNbdGFnTmFtZV0pICsgXCJcXFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgIHJldHVybiBwcm9wc1t0YWdOYW1lXTtcbiAgICB9KS5yZXZlcnNlKCkucmVkdWNlKGZ1bmN0aW9uIChhcHByb3ZlZFRhZ3MsIGluc3RhbmNlVGFncykge1xuICAgICAgICB2YXIgaW5zdGFuY2VTZWVuVGFncyA9IHt9O1xuXG4gICAgICAgIGluc3RhbmNlVGFncy5maWx0ZXIoZnVuY3Rpb24gKHRhZykge1xuICAgICAgICAgICAgdmFyIHByaW1hcnlBdHRyaWJ1dGVLZXkgPSB2b2lkIDA7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRhZyk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlS2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgbG93ZXJDYXNlQXR0cmlidXRlS2V5ID0gYXR0cmlidXRlS2V5LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIHJ1bGUgd2l0aCBsaW5rIHRhZ3MsIHNpbmNlIHJlbCBhbmQgaHJlZiBhcmUgYm90aCBwcmltYXJ5IHRhZ3MsIHJlbCB0YWtlcyBwcmlvcml0eVxuICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5QXR0cmlidXRlcy5pbmRleE9mKGxvd2VyQ2FzZUF0dHJpYnV0ZUtleSkgIT09IC0xICYmICEocHJpbWFyeUF0dHJpYnV0ZUtleSA9PT0gVEFHX1BST1BFUlRJRVMuUkVMICYmIHRhZ1twcmltYXJ5QXR0cmlidXRlS2V5XS50b0xvd2VyQ2FzZSgpID09PSBcImNhbm9uaWNhbFwiKSAmJiAhKGxvd2VyQ2FzZUF0dHJpYnV0ZUtleSA9PT0gVEFHX1BST1BFUlRJRVMuUkVMICYmIHRhZ1tsb3dlckNhc2VBdHRyaWJ1dGVLZXldLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVzaGVldFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QXR0cmlidXRlS2V5ID0gbG93ZXJDYXNlQXR0cmlidXRlS2V5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGlubmVySFRNTCB3aGljaCBkb2Vzbid0IHdvcmsgbG93ZXJjYXNlZFxuICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5QXR0cmlidXRlcy5pbmRleE9mKGF0dHJpYnV0ZUtleSkgIT09IC0xICYmIChhdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLklOTkVSX0hUTUwgfHwgYXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5DU1NfVEVYVCB8fCBhdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLklURU1fUFJPUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZUtleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghcHJpbWFyeUF0dHJpYnV0ZUtleSB8fCAhdGFnW3ByaW1hcnlBdHRyaWJ1dGVLZXldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0YWdbcHJpbWFyeUF0dHJpYnV0ZUtleV0udG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKCFhcHByb3ZlZFNlZW5UYWdzW3ByaW1hcnlBdHRyaWJ1dGVLZXldKSB7XG4gICAgICAgICAgICAgICAgYXBwcm92ZWRTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWluc3RhbmNlU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV0pIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVNlZW5UYWdzW3ByaW1hcnlBdHRyaWJ1dGVLZXldID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghYXBwcm92ZWRTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XVt2YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVNlZW5UYWdzW3ByaW1hcnlBdHRyaWJ1dGVLZXldW3ZhbHVlXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSkucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24gKHRhZykge1xuICAgICAgICAgICAgcmV0dXJuIGFwcHJvdmVkVGFncy5wdXNoKHRhZyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzZWVuIHRhZ3Mgd2l0aCB0YWdzIGZyb20gdGhpcyBpbnN0YW5jZVxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGluc3RhbmNlU2VlblRhZ3MpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVLZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgdmFyIHRhZ1VuaW9uID0gb2JqZWN0QXNzaWduKHt9LCBhcHByb3ZlZFNlZW5UYWdzW2F0dHJpYnV0ZUtleV0sIGluc3RhbmNlU2VlblRhZ3NbYXR0cmlidXRlS2V5XSk7XG5cbiAgICAgICAgICAgIGFwcHJvdmVkU2VlblRhZ3NbYXR0cmlidXRlS2V5XSA9IHRhZ1VuaW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcHJvdmVkVGFncztcbiAgICB9LCBbXSkucmV2ZXJzZSgpO1xufTtcblxudmFyIGdldElubmVybW9zdFByb3BlcnR5ID0gZnVuY3Rpb24gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBwcm9wZXJ0eSkge1xuICAgIGZvciAodmFyIGkgPSBwcm9wc0xpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIHByb3BzID0gcHJvcHNMaXN0W2ldO1xuXG4gICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wc1twcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciByZWR1Y2VQcm9wc1RvU3RhdGUgPSBmdW5jdGlvbiByZWR1Y2VQcm9wc1RvU3RhdGUocHJvcHNMaXN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZVRhZzogZ2V0QmFzZVRhZ0Zyb21Qcm9wc0xpc3QoW1RBR19QUk9QRVJUSUVTLkhSRUYsIFRBR19QUk9QRVJUSUVTLlRBUkdFVF0sIHByb3BzTGlzdCksXG4gICAgICAgIGJvZHlBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdChBVFRSSUJVVEVfTkFNRVMuQk9EWSwgcHJvcHNMaXN0KSxcbiAgICAgICAgZGVmZXI6IGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgSEVMTUVUX1BST1BTLkRFRkVSKSxcbiAgICAgICAgZW5jb2RlOiBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIEhFTE1FVF9QUk9QUy5FTkNPREVfU1BFQ0lBTF9DSEFSQUNURVJTKSxcbiAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IGdldEF0dHJpYnV0ZXNGcm9tUHJvcHNMaXN0KEFUVFJJQlVURV9OQU1FUy5IVE1MLCBwcm9wc0xpc3QpLFxuICAgICAgICBsaW5rVGFnczogZ2V0VGFnc0Zyb21Qcm9wc0xpc3QoVEFHX05BTUVTLkxJTkssIFtUQUdfUFJPUEVSVElFUy5SRUwsIFRBR19QUk9QRVJUSUVTLkhSRUZdLCBwcm9wc0xpc3QpLFxuICAgICAgICBtZXRhVGFnczogZ2V0VGFnc0Zyb21Qcm9wc0xpc3QoVEFHX05BTUVTLk1FVEEsIFtUQUdfUFJPUEVSVElFUy5OQU1FLCBUQUdfUFJPUEVSVElFUy5DSEFSU0VULCBUQUdfUFJPUEVSVElFUy5IVFRQRVFVSVYsIFRBR19QUk9QRVJUSUVTLlBST1BFUlRZLCBUQUdfUFJPUEVSVElFUy5JVEVNX1BST1BdLCBwcm9wc0xpc3QpLFxuICAgICAgICBub3NjcmlwdFRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5OT1NDUklQVCwgW1RBR19QUk9QRVJUSUVTLklOTkVSX0hUTUxdLCBwcm9wc0xpc3QpLFxuICAgICAgICBvbkNoYW5nZUNsaWVudFN0YXRlOiBnZXRPbkNoYW5nZUNsaWVudFN0YXRlKHByb3BzTGlzdCksXG4gICAgICAgIHNjcmlwdFRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5TQ1JJUFQsIFtUQUdfUFJPUEVSVElFUy5TUkMsIFRBR19QUk9QRVJUSUVTLklOTkVSX0hUTUxdLCBwcm9wc0xpc3QpLFxuICAgICAgICBzdHlsZVRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5TVFlMRSwgW1RBR19QUk9QRVJUSUVTLkNTU19URVhUXSwgcHJvcHNMaXN0KSxcbiAgICAgICAgdGl0bGU6IGdldFRpdGxlRnJvbVByb3BzTGlzdChwcm9wc0xpc3QpLFxuICAgICAgICB0aXRsZUF0dHJpYnV0ZXM6IGdldEF0dHJpYnV0ZXNGcm9tUHJvcHNMaXN0KEFUVFJJQlVURV9OQU1FUy5USVRMRSwgcHJvcHNMaXN0KVxuICAgIH07XG59O1xuXG52YXIgcmFmUG9seWZpbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNsb2NrID0gRGF0ZS5ub3coKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICBpZiAoY3VycmVudFRpbWUgLSBjbG9jayA+IDE2KSB7XG4gICAgICAgICAgICBjbG9jayA9IGN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgY2FsbGJhY2soY3VycmVudFRpbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmFmUG9seWZpbGwoY2FsbGJhY2spO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9O1xufSgpO1xuXG52YXIgY2FmUG9seWZpbGwgPSBmdW5jdGlvbiBjYWZQb2x5ZmlsbChpZCkge1xuICAgIHJldHVybiBjbGVhclRpbWVvdXQoaWQpO1xufTtcblxudmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIHx8IHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCByYWZQb2x5ZmlsbCA6IGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgcmFmUG9seWZpbGw7XG5cbnZhciBjYW5jZWxBbmltYXRpb25GcmFtZSA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSB8fCBjYWZQb2x5ZmlsbCA6IGdsb2JhbC5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCBjYWZQb2x5ZmlsbDtcblxudmFyIHdhcm4gPSBmdW5jdGlvbiB3YXJuKG1zZykge1xuICAgIHJldHVybiBjb25zb2xlICYmIHR5cGVvZiBjb25zb2xlLndhcm4gPT09IFwiZnVuY3Rpb25cIiAmJiBjb25zb2xlLndhcm4obXNnKTtcbn07XG5cbnZhciBfaGVsbWV0Q2FsbGJhY2sgPSBudWxsO1xuXG52YXIgaGFuZGxlQ2xpZW50U3RhdGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDbGllbnRTdGF0ZUNoYW5nZShuZXdTdGF0ZSkge1xuICAgIGlmIChfaGVsbWV0Q2FsbGJhY2spIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX2hlbG1ldENhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBpZiAobmV3U3RhdGUuZGVmZXIpIHtcbiAgICAgICAgX2hlbG1ldENhbGxiYWNrID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbW1pdFRhZ0NoYW5nZXMobmV3U3RhdGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfaGVsbWV0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbW1pdFRhZ0NoYW5nZXMobmV3U3RhdGUpO1xuICAgICAgICBfaGVsbWV0Q2FsbGJhY2sgPSBudWxsO1xuICAgIH1cbn07XG5cbnZhciBjb21taXRUYWdDaGFuZ2VzID0gZnVuY3Rpb24gY29tbWl0VGFnQ2hhbmdlcyhuZXdTdGF0ZSwgY2IpIHtcbiAgICB2YXIgYmFzZVRhZyA9IG5ld1N0YXRlLmJhc2VUYWcsXG4gICAgICAgIGJvZHlBdHRyaWJ1dGVzID0gbmV3U3RhdGUuYm9keUF0dHJpYnV0ZXMsXG4gICAgICAgIGh0bWxBdHRyaWJ1dGVzID0gbmV3U3RhdGUuaHRtbEF0dHJpYnV0ZXMsXG4gICAgICAgIGxpbmtUYWdzID0gbmV3U3RhdGUubGlua1RhZ3MsXG4gICAgICAgIG1ldGFUYWdzID0gbmV3U3RhdGUubWV0YVRhZ3MsXG4gICAgICAgIG5vc2NyaXB0VGFncyA9IG5ld1N0YXRlLm5vc2NyaXB0VGFncyxcbiAgICAgICAgb25DaGFuZ2VDbGllbnRTdGF0ZSA9IG5ld1N0YXRlLm9uQ2hhbmdlQ2xpZW50U3RhdGUsXG4gICAgICAgIHNjcmlwdFRhZ3MgPSBuZXdTdGF0ZS5zY3JpcHRUYWdzLFxuICAgICAgICBzdHlsZVRhZ3MgPSBuZXdTdGF0ZS5zdHlsZVRhZ3MsXG4gICAgICAgIHRpdGxlID0gbmV3U3RhdGUudGl0bGUsXG4gICAgICAgIHRpdGxlQXR0cmlidXRlcyA9IG5ld1N0YXRlLnRpdGxlQXR0cmlidXRlcztcblxuICAgIHVwZGF0ZUF0dHJpYnV0ZXMoVEFHX05BTUVTLkJPRFksIGJvZHlBdHRyaWJ1dGVzKTtcbiAgICB1cGRhdGVBdHRyaWJ1dGVzKFRBR19OQU1FUy5IVE1MLCBodG1sQXR0cmlidXRlcyk7XG5cbiAgICB1cGRhdGVUaXRsZSh0aXRsZSwgdGl0bGVBdHRyaWJ1dGVzKTtcblxuICAgIHZhciB0YWdVcGRhdGVzID0ge1xuICAgICAgICBiYXNlVGFnOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5CQVNFLCBiYXNlVGFnKSxcbiAgICAgICAgbGlua1RhZ3M6IHVwZGF0ZVRhZ3MoVEFHX05BTUVTLkxJTkssIGxpbmtUYWdzKSxcbiAgICAgICAgbWV0YVRhZ3M6IHVwZGF0ZVRhZ3MoVEFHX05BTUVTLk1FVEEsIG1ldGFUYWdzKSxcbiAgICAgICAgbm9zY3JpcHRUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5OT1NDUklQVCwgbm9zY3JpcHRUYWdzKSxcbiAgICAgICAgc2NyaXB0VGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuU0NSSVBULCBzY3JpcHRUYWdzKSxcbiAgICAgICAgc3R5bGVUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5TVFlMRSwgc3R5bGVUYWdzKVxuICAgIH07XG5cbiAgICB2YXIgYWRkZWRUYWdzID0ge307XG4gICAgdmFyIHJlbW92ZWRUYWdzID0ge307XG5cbiAgICBPYmplY3Qua2V5cyh0YWdVcGRhdGVzKS5mb3JFYWNoKGZ1bmN0aW9uICh0YWdUeXBlKSB7XG4gICAgICAgIHZhciBfdGFnVXBkYXRlcyR0YWdUeXBlID0gdGFnVXBkYXRlc1t0YWdUeXBlXSxcbiAgICAgICAgICAgIG5ld1RhZ3MgPSBfdGFnVXBkYXRlcyR0YWdUeXBlLm5ld1RhZ3MsXG4gICAgICAgICAgICBvbGRUYWdzID0gX3RhZ1VwZGF0ZXMkdGFnVHlwZS5vbGRUYWdzO1xuXG5cbiAgICAgICAgaWYgKG5ld1RhZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZGRlZFRhZ3NbdGFnVHlwZV0gPSBuZXdUYWdzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbGRUYWdzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVtb3ZlZFRhZ3NbdGFnVHlwZV0gPSB0YWdVcGRhdGVzW3RhZ1R5cGVdLm9sZFRhZ3M7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGNiICYmIGNiKCk7XG5cbiAgICBvbkNoYW5nZUNsaWVudFN0YXRlKG5ld1N0YXRlLCBhZGRlZFRhZ3MsIHJlbW92ZWRUYWdzKTtcbn07XG5cbnZhciBmbGF0dGVuQXJyYXkgPSBmdW5jdGlvbiBmbGF0dGVuQXJyYXkocG9zc2libGVBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBvc3NpYmxlQXJyYXkpID8gcG9zc2libGVBcnJheS5qb2luKFwiXCIpIDogcG9zc2libGVBcnJheTtcbn07XG5cbnZhciB1cGRhdGVUaXRsZSA9IGZ1bmN0aW9uIHVwZGF0ZVRpdGxlKHRpdGxlLCBhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKHR5cGVvZiB0aXRsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC50aXRsZSAhPT0gdGl0bGUpIHtcbiAgICAgICAgZG9jdW1lbnQudGl0bGUgPSBmbGF0dGVuQXJyYXkodGl0bGUpO1xuICAgIH1cblxuICAgIHVwZGF0ZUF0dHJpYnV0ZXMoVEFHX05BTUVTLlRJVExFLCBhdHRyaWJ1dGVzKTtcbn07XG5cbnZhciB1cGRhdGVBdHRyaWJ1dGVzID0gZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlcyh0YWdOYW1lLCBhdHRyaWJ1dGVzKSB7XG4gICAgdmFyIGVsZW1lbnRUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKVswXTtcblxuICAgIGlmICghZWxlbWVudFRhZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGhlbG1ldEF0dHJpYnV0ZVN0cmluZyA9IGVsZW1lbnRUYWcuZ2V0QXR0cmlidXRlKEhFTE1FVF9BVFRSSUJVVEUpO1xuICAgIHZhciBoZWxtZXRBdHRyaWJ1dGVzID0gaGVsbWV0QXR0cmlidXRlU3RyaW5nID8gaGVsbWV0QXR0cmlidXRlU3RyaW5nLnNwbGl0KFwiLFwiKSA6IFtdO1xuICAgIHZhciBhdHRyaWJ1dGVzVG9SZW1vdmUgPSBbXS5jb25jYXQoaGVsbWV0QXR0cmlidXRlcyk7XG4gICAgdmFyIGF0dHJpYnV0ZUtleXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlS2V5c1tpXTtcbiAgICAgICAgdmFyIHZhbHVlID0gYXR0cmlidXRlc1thdHRyaWJ1dGVdIHx8IFwiXCI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnRUYWcuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBlbGVtZW50VGFnLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoZWxtZXRBdHRyaWJ1dGVzLmluZGV4T2YoYXR0cmlidXRlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGhlbG1ldEF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGluZGV4VG9TYXZlID0gYXR0cmlidXRlc1RvUmVtb3ZlLmluZGV4T2YoYXR0cmlidXRlKTtcbiAgICAgICAgaWYgKGluZGV4VG9TYXZlICE9PSAtMSkge1xuICAgICAgICAgICAgYXR0cmlidXRlc1RvUmVtb3ZlLnNwbGljZShpbmRleFRvU2F2ZSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaSA9IGF0dHJpYnV0ZXNUb1JlbW92ZS5sZW5ndGggLSAxOyBfaSA+PSAwOyBfaS0tKSB7XG4gICAgICAgIGVsZW1lbnRUYWcucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZXNUb1JlbW92ZVtfaV0pO1xuICAgIH1cblxuICAgIGlmIChoZWxtZXRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gYXR0cmlidXRlc1RvUmVtb3ZlLmxlbmd0aCkge1xuICAgICAgICBlbGVtZW50VGFnLnJlbW92ZUF0dHJpYnV0ZShIRUxNRVRfQVRUUklCVVRFKTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRUYWcuZ2V0QXR0cmlidXRlKEhFTE1FVF9BVFRSSUJVVEUpICE9PSBhdHRyaWJ1dGVLZXlzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgIGVsZW1lbnRUYWcuc2V0QXR0cmlidXRlKEhFTE1FVF9BVFRSSUJVVEUsIGF0dHJpYnV0ZUtleXMuam9pbihcIixcIikpO1xuICAgIH1cbn07XG5cbnZhciB1cGRhdGVUYWdzID0gZnVuY3Rpb24gdXBkYXRlVGFncyh0eXBlLCB0YWdzKSB7XG4gICAgdmFyIGhlYWRFbGVtZW50ID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFRBR19OQU1FUy5IRUFEKTtcbiAgICB2YXIgdGFnTm9kZXMgPSBoZWFkRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHR5cGUgKyBcIltcIiArIEhFTE1FVF9BVFRSSUJVVEUgKyBcIl1cIik7XG4gICAgdmFyIG9sZFRhZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0YWdOb2Rlcyk7XG4gICAgdmFyIG5ld1RhZ3MgPSBbXTtcbiAgICB2YXIgaW5kZXhUb0RlbGV0ZSA9IHZvaWQgMDtcblxuICAgIGlmICh0YWdzICYmIHRhZ3MubGVuZ3RoKSB7XG4gICAgICAgIHRhZ3MuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGF0dHJpYnV0ZSBpbiB0YWcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnLmhhc093blByb3BlcnR5KGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuSU5ORVJfSFRNTCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUwgPSB0YWcuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IHRhZy5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRhZy5jc3NUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0eXBlb2YgdGFnW2F0dHJpYnV0ZV0gPT09IFwidW5kZWZpbmVkXCIgPyBcIlwiIDogdGFnW2F0dHJpYnV0ZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSwgXCJ0cnVlXCIpO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgYSBkdXBsaWNhdGUgdGFnIGZyb20gZG9tVGFnc3RvUmVtb3ZlLCBzbyBpdCBpc24ndCBjbGVhcmVkLlxuICAgICAgICAgICAgaWYgKG9sZFRhZ3Muc29tZShmdW5jdGlvbiAoZXhpc3RpbmdUYWcsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaW5kZXhUb0RlbGV0ZSA9IGluZGV4O1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50LmlzRXF1YWxOb2RlKGV4aXN0aW5nVGFnKTtcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgb2xkVGFncy5zcGxpY2UoaW5kZXhUb0RlbGV0ZSwgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1RhZ3MucHVzaChuZXdFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb2xkVGFncy5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgcmV0dXJuIHRhZy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhZyk7XG4gICAgfSk7XG4gICAgbmV3VGFncy5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgcmV0dXJuIGhlYWRFbGVtZW50LmFwcGVuZENoaWxkKHRhZyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBvbGRUYWdzOiBvbGRUYWdzLFxuICAgICAgICBuZXdUYWdzOiBuZXdUYWdzXG4gICAgfTtcbn07XG5cbnZhciBnZW5lcmF0ZUVsZW1lbnRBdHRyaWJ1dGVzQXNTdHJpbmcgPSBmdW5jdGlvbiBnZW5lcmF0ZUVsZW1lbnRBdHRyaWJ1dGVzQXNTdHJpbmcoYXR0cmlidXRlcykge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5yZWR1Y2UoZnVuY3Rpb24gKHN0ciwga2V5KSB7XG4gICAgICAgIHZhciBhdHRyID0gdHlwZW9mIGF0dHJpYnV0ZXNba2V5XSAhPT0gXCJ1bmRlZmluZWRcIiA/IGtleSArIFwiPVxcXCJcIiArIGF0dHJpYnV0ZXNba2V5XSArIFwiXFxcIlwiIDogXCJcIiArIGtleTtcbiAgICAgICAgcmV0dXJuIHN0ciA/IHN0ciArIFwiIFwiICsgYXR0ciA6IGF0dHI7XG4gICAgfSwgXCJcIik7XG59O1xuXG52YXIgZ2VuZXJhdGVUaXRsZUFzU3RyaW5nID0gZnVuY3Rpb24gZ2VuZXJhdGVUaXRsZUFzU3RyaW5nKHR5cGUsIHRpdGxlLCBhdHRyaWJ1dGVzLCBlbmNvZGUpIHtcbiAgICB2YXIgYXR0cmlidXRlU3RyaW5nID0gZ2VuZXJhdGVFbGVtZW50QXR0cmlidXRlc0FzU3RyaW5nKGF0dHJpYnV0ZXMpO1xuICAgIHZhciBmbGF0dGVuZWRUaXRsZSA9IGZsYXR0ZW5BcnJheSh0aXRsZSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVN0cmluZyA/IFwiPFwiICsgdHlwZSArIFwiIFwiICsgSEVMTUVUX0FUVFJJQlVURSArIFwiPVxcXCJ0cnVlXFxcIiBcIiArIGF0dHJpYnV0ZVN0cmluZyArIFwiPlwiICsgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnMoZmxhdHRlbmVkVGl0bGUsIGVuY29kZSkgKyBcIjwvXCIgKyB0eXBlICsgXCI+XCIgOiBcIjxcIiArIHR5cGUgKyBcIiBcIiArIEhFTE1FVF9BVFRSSUJVVEUgKyBcIj1cXFwidHJ1ZVxcXCI+XCIgKyBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVycyhmbGF0dGVuZWRUaXRsZSwgZW5jb2RlKSArIFwiPC9cIiArIHR5cGUgKyBcIj5cIjtcbn07XG5cbnZhciBnZW5lcmF0ZVRhZ3NBc1N0cmluZyA9IGZ1bmN0aW9uIGdlbmVyYXRlVGFnc0FzU3RyaW5nKHR5cGUsIHRhZ3MsIGVuY29kZSkge1xuICAgIHJldHVybiB0YWdzLnJlZHVjZShmdW5jdGlvbiAoc3RyLCB0YWcpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZUh0bWwgPSBPYmplY3Qua2V5cyh0YWcpLmZpbHRlcihmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gIShhdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLklOTkVSX0hUTUwgfHwgYXR0cmlidXRlID09PSBUQUdfUFJPUEVSVElFUy5DU1NfVEVYVCk7XG4gICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoc3RyaW5nLCBhdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIHZhciBhdHRyID0gdHlwZW9mIHRhZ1thdHRyaWJ1dGVdID09PSBcInVuZGVmaW5lZFwiID8gYXR0cmlidXRlIDogYXR0cmlidXRlICsgXCI9XFxcIlwiICsgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnModGFnW2F0dHJpYnV0ZV0sIGVuY29kZSkgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcgPyBzdHJpbmcgKyBcIiBcIiArIGF0dHIgOiBhdHRyO1xuICAgICAgICB9LCBcIlwiKTtcblxuICAgICAgICB2YXIgdGFnQ29udGVudCA9IHRhZy5pbm5lckhUTUwgfHwgdGFnLmNzc1RleHQgfHwgXCJcIjtcblxuICAgICAgICB2YXIgaXNTZWxmQ2xvc2luZyA9IFNFTEZfQ0xPU0lOR19UQUdTLmluZGV4T2YodHlwZSkgPT09IC0xO1xuXG4gICAgICAgIHJldHVybiBzdHIgKyBcIjxcIiArIHR5cGUgKyBcIiBcIiArIEhFTE1FVF9BVFRSSUJVVEUgKyBcIj1cXFwidHJ1ZVxcXCIgXCIgKyBhdHRyaWJ1dGVIdG1sICsgKGlzU2VsZkNsb3NpbmcgPyBcIi8+XCIgOiBcIj5cIiArIHRhZ0NvbnRlbnQgKyBcIjwvXCIgKyB0eXBlICsgXCI+XCIpO1xuICAgIH0sIFwiXCIpO1xufTtcblxudmFyIGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyA9IGZ1bmN0aW9uIGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyhhdHRyaWJ1dGVzKSB7XG4gICAgdmFyIGluaXRQcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlcykucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAgICAgICBvYmpbUkVBQ1RfVEFHX01BUFtrZXldIHx8IGtleV0gPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSwgaW5pdFByb3BzKTtcbn07XG5cbnZhciBjb252ZXJ0UmVhY3RQcm9wc3RvSHRtbEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiBjb252ZXJ0UmVhY3RQcm9wc3RvSHRtbEF0dHJpYnV0ZXMocHJvcHMpIHtcbiAgICB2YXIgaW5pdEF0dHJpYnV0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BzKS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwga2V5KSB7XG4gICAgICAgIG9ialtIVE1MX1RBR19NQVBba2V5XSB8fCBrZXldID0gcHJvcHNba2V5XTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCBpbml0QXR0cmlidXRlcyk7XG59O1xuXG52YXIgZ2VuZXJhdGVUaXRsZUFzUmVhY3RDb21wb25lbnQgPSBmdW5jdGlvbiBnZW5lcmF0ZVRpdGxlQXNSZWFjdENvbXBvbmVudCh0eXBlLCB0aXRsZSwgYXR0cmlidXRlcykge1xuICAgIHZhciBfaW5pdFByb3BzO1xuXG4gICAgLy8gYXNzaWduaW5nIGludG8gYW4gYXJyYXkgdG8gZGVmaW5lIHRvU3RyaW5nIGZ1bmN0aW9uIG9uIGl0XG4gICAgdmFyIGluaXRQcm9wcyA9IChfaW5pdFByb3BzID0ge1xuICAgICAgICBrZXk6IHRpdGxlXG4gICAgfSwgX2luaXRQcm9wc1tIRUxNRVRfQVRUUklCVVRFXSA9IHRydWUsIF9pbml0UHJvcHMpO1xuICAgIHZhciBwcm9wcyA9IGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyhhdHRyaWJ1dGVzLCBpbml0UHJvcHMpO1xuXG4gICAgcmV0dXJuIFtSZWFjdC5jcmVhdGVFbGVtZW50KFRBR19OQU1FUy5USVRMRSwgcHJvcHMsIHRpdGxlKV07XG59O1xuXG52YXIgZ2VuZXJhdGVUYWdzQXNSZWFjdENvbXBvbmVudCA9IGZ1bmN0aW9uIGdlbmVyYXRlVGFnc0FzUmVhY3RDb21wb25lbnQodHlwZSwgdGFncykge1xuICAgIHJldHVybiB0YWdzLm1hcChmdW5jdGlvbiAodGFnLCBpKSB7XG4gICAgICAgIHZhciBfbWFwcGVkVGFnO1xuXG4gICAgICAgIHZhciBtYXBwZWRUYWcgPSAoX21hcHBlZFRhZyA9IHtcbiAgICAgICAgICAgIGtleTogaVxuICAgICAgICB9LCBfbWFwcGVkVGFnW0hFTE1FVF9BVFRSSUJVVEVdID0gdHJ1ZSwgX21hcHBlZFRhZyk7XG5cbiAgICAgICAgT2JqZWN0LmtleXModGFnKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIHZhciBtYXBwZWRBdHRyaWJ1dGUgPSBSRUFDVF9UQUdfTUFQW2F0dHJpYnV0ZV0gfHwgYXR0cmlidXRlO1xuXG4gICAgICAgICAgICBpZiAobWFwcGVkQXR0cmlidXRlID09PSBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MIHx8IG1hcHBlZEF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IHRhZy5pbm5lckhUTUwgfHwgdGFnLmNzc1RleHQ7XG4gICAgICAgICAgICAgICAgbWFwcGVkVGFnLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID0geyBfX2h0bWw6IGNvbnRlbnQgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFwcGVkVGFnW21hcHBlZEF0dHJpYnV0ZV0gPSB0YWdbYXR0cmlidXRlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQodHlwZSwgbWFwcGVkVGFnKTtcbiAgICB9KTtcbn07XG5cbnZhciBnZXRNZXRob2RzRm9yVGFnID0gZnVuY3Rpb24gZ2V0TWV0aG9kc0ZvclRhZyh0eXBlLCB0YWdzLCBlbmNvZGUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBUQUdfTkFNRVMuVElUTEU6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvQ29tcG9uZW50OiBmdW5jdGlvbiB0b0NvbXBvbmVudCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGl0bGVBc1JlYWN0Q29tcG9uZW50KHR5cGUsIHRhZ3MudGl0bGUsIHRhZ3MudGl0bGVBdHRyaWJ1dGVzLCBlbmNvZGUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVUaXRsZUFzU3RyaW5nKHR5cGUsIHRhZ3MudGl0bGUsIHRhZ3MudGl0bGVBdHRyaWJ1dGVzLCBlbmNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgQVRUUklCVVRFX05BTUVTLkJPRFk6XG4gICAgICAgIGNhc2UgQVRUUklCVVRFX05BTUVTLkhUTUw6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvQ29tcG9uZW50OiBmdW5jdGlvbiB0b0NvbXBvbmVudCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyh0YWdzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlRWxlbWVudEF0dHJpYnV0ZXNBc1N0cmluZyh0YWdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b0NvbXBvbmVudDogZnVuY3Rpb24gdG9Db21wb25lbnQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVRhZ3NBc1JlYWN0Q29tcG9uZW50KHR5cGUsIHRhZ3MpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVUYWdzQXNTdHJpbmcodHlwZSwgdGFncywgZW5jb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgIH1cbn07XG5cbnZhciBtYXBTdGF0ZU9uU2VydmVyID0gZnVuY3Rpb24gbWFwU3RhdGVPblNlcnZlcihfcmVmKSB7XG4gICAgdmFyIGJhc2VUYWcgPSBfcmVmLmJhc2VUYWcsXG4gICAgICAgIGJvZHlBdHRyaWJ1dGVzID0gX3JlZi5ib2R5QXR0cmlidXRlcyxcbiAgICAgICAgZW5jb2RlID0gX3JlZi5lbmNvZGUsXG4gICAgICAgIGh0bWxBdHRyaWJ1dGVzID0gX3JlZi5odG1sQXR0cmlidXRlcyxcbiAgICAgICAgbGlua1RhZ3MgPSBfcmVmLmxpbmtUYWdzLFxuICAgICAgICBtZXRhVGFncyA9IF9yZWYubWV0YVRhZ3MsXG4gICAgICAgIG5vc2NyaXB0VGFncyA9IF9yZWYubm9zY3JpcHRUYWdzLFxuICAgICAgICBzY3JpcHRUYWdzID0gX3JlZi5zY3JpcHRUYWdzLFxuICAgICAgICBzdHlsZVRhZ3MgPSBfcmVmLnN0eWxlVGFncyxcbiAgICAgICAgX3JlZiR0aXRsZSA9IF9yZWYudGl0bGUsXG4gICAgICAgIHRpdGxlID0gX3JlZiR0aXRsZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IF9yZWYkdGl0bGUsXG4gICAgICAgIHRpdGxlQXR0cmlidXRlcyA9IF9yZWYudGl0bGVBdHRyaWJ1dGVzO1xuICAgIHJldHVybiB7XG4gICAgICAgIGJhc2U6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLkJBU0UsIGJhc2VUYWcsIGVuY29kZSksXG4gICAgICAgIGJvZHlBdHRyaWJ1dGVzOiBnZXRNZXRob2RzRm9yVGFnKEFUVFJJQlVURV9OQU1FUy5CT0RZLCBib2R5QXR0cmlidXRlcywgZW5jb2RlKSxcbiAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IGdldE1ldGhvZHNGb3JUYWcoQVRUUklCVVRFX05BTUVTLkhUTUwsIGh0bWxBdHRyaWJ1dGVzLCBlbmNvZGUpLFxuICAgICAgICBsaW5rOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5MSU5LLCBsaW5rVGFncywgZW5jb2RlKSxcbiAgICAgICAgbWV0YTogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuTUVUQSwgbWV0YVRhZ3MsIGVuY29kZSksXG4gICAgICAgIG5vc2NyaXB0OiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5OT1NDUklQVCwgbm9zY3JpcHRUYWdzLCBlbmNvZGUpLFxuICAgICAgICBzY3JpcHQ6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLlNDUklQVCwgc2NyaXB0VGFncywgZW5jb2RlKSxcbiAgICAgICAgc3R5bGU6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLlNUWUxFLCBzdHlsZVRhZ3MsIGVuY29kZSksXG4gICAgICAgIHRpdGxlOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5USVRMRSwgeyB0aXRsZTogdGl0bGUsIHRpdGxlQXR0cmlidXRlczogdGl0bGVBdHRyaWJ1dGVzIH0sIGVuY29kZSlcbiAgICB9O1xufTtcblxudmFyIEhlbG1ldCA9IGZ1bmN0aW9uIEhlbG1ldChDb21wb25lbnQpIHtcbiAgICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICAgIHJldHVybiBfdGVtcCA9IF9jbGFzcyA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgICAgIGluaGVyaXRzKEhlbG1ldFdyYXBwZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gICAgICAgIGZ1bmN0aW9uIEhlbG1ldFdyYXBwZXIoKSB7XG4gICAgICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIZWxtZXRXcmFwcGVyKTtcbiAgICAgICAgICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gIWlzRXF1YWwodGhpcy5wcm9wcywgbmV4dFByb3BzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5tYXBOZXN0ZWRDaGlsZHJlblRvUHJvcHMgPSBmdW5jdGlvbiBtYXBOZXN0ZWRDaGlsZHJlblRvUHJvcHMoY2hpbGQsIG5lc3RlZENoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoIW5lc3RlZENoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLlNDUklQVDpcbiAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5OT1NDUklQVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVySFRNTDogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLlNUWUxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dDogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiPFwiICsgY2hpbGQudHlwZSArIFwiIC8+IGVsZW1lbnRzIGFyZSBzZWxmLWNsb3NpbmcgYW5kIGNhbiBub3QgY29udGFpbiBjaGlsZHJlbi4gUmVmZXIgdG8gb3VyIEFQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUuZmxhdHRlbkFycmF5VHlwZUNoaWxkcmVuID0gZnVuY3Rpb24gZmxhdHRlbkFycmF5VHlwZUNoaWxkcmVuKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciBfYmFiZWxIZWxwZXJzJGV4dGVuZHM7XG5cbiAgICAgICAgICAgIHZhciBjaGlsZCA9IF9yZWYuY2hpbGQsXG4gICAgICAgICAgICAgICAgYXJyYXlUeXBlQ2hpbGRyZW4gPSBfcmVmLmFycmF5VHlwZUNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIG5ld0NoaWxkUHJvcHMgPSBfcmVmLm5ld0NoaWxkUHJvcHMsXG4gICAgICAgICAgICAgICAgbmVzdGVkQ2hpbGRyZW4gPSBfcmVmLm5lc3RlZENoaWxkcmVuO1xuXG4gICAgICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIGFycmF5VHlwZUNoaWxkcmVuLCAoX2JhYmVsSGVscGVycyRleHRlbmRzID0ge30sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kc1tjaGlsZC50eXBlXSA9IFtdLmNvbmNhdChhcnJheVR5cGVDaGlsZHJlbltjaGlsZC50eXBlXSB8fCBbXSwgW19leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzLCB0aGlzLm1hcE5lc3RlZENoaWxkcmVuVG9Qcm9wcyhjaGlsZCwgbmVzdGVkQ2hpbGRyZW4pKV0pLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5tYXBPYmplY3RUeXBlQ2hpbGRyZW4gPSBmdW5jdGlvbiBtYXBPYmplY3RUeXBlQ2hpbGRyZW4oX3JlZjIpIHtcbiAgICAgICAgICAgIHZhciBfYmFiZWxIZWxwZXJzJGV4dGVuZHMyLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMzO1xuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBfcmVmMi5jaGlsZCxcbiAgICAgICAgICAgICAgICBuZXdQcm9wcyA9IF9yZWYyLm5ld1Byb3BzLFxuICAgICAgICAgICAgICAgIG5ld0NoaWxkUHJvcHMgPSBfcmVmMi5uZXdDaGlsZFByb3BzLFxuICAgICAgICAgICAgICAgIG5lc3RlZENoaWxkcmVuID0gX3JlZjIubmVzdGVkQ2hpbGRyZW47XG5cbiAgICAgICAgICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLlRJVExFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIG5ld1Byb3BzLCAoX2JhYmVsSGVscGVycyRleHRlbmRzMiA9IHt9LCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMyW2NoaWxkLnR5cGVdID0gbmVzdGVkQ2hpbGRyZW4sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczIudGl0bGVBdHRyaWJ1dGVzID0gX2V4dGVuZHMoe30sIG5ld0NoaWxkUHJvcHMpLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMyKSk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5CT0RZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIG5ld1Byb3BzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5QXR0cmlidXRlczogX2V4dGVuZHMoe30sIG5ld0NoaWxkUHJvcHMpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuSFRNTDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywgKF9iYWJlbEhlbHBlcnMkZXh0ZW5kczMgPSB7fSwgX2JhYmVsSGVscGVycyRleHRlbmRzM1tjaGlsZC50eXBlXSA9IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKSwgX2JhYmVsSGVscGVycyRleHRlbmRzMykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLm1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyA9IGZ1bmN0aW9uIG1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyhhcnJheVR5cGVDaGlsZHJlbiwgbmV3UHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBuZXdGbGF0dGVuZWRQcm9wcyA9IF9leHRlbmRzKHt9LCBuZXdQcm9wcyk7XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFycmF5VHlwZUNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uIChhcnJheUNoaWxkTmFtZSkge1xuICAgICAgICAgICAgICAgIHZhciBfYmFiZWxIZWxwZXJzJGV4dGVuZHM0O1xuXG4gICAgICAgICAgICAgICAgbmV3RmxhdHRlbmVkUHJvcHMgPSBfZXh0ZW5kcyh7fSwgbmV3RmxhdHRlbmVkUHJvcHMsIChfYmFiZWxIZWxwZXJzJGV4dGVuZHM0ID0ge30sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczRbYXJyYXlDaGlsZE5hbWVdID0gYXJyYXlUeXBlQ2hpbGRyZW5bYXJyYXlDaGlsZE5hbWVdLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHM0KSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIG5ld0ZsYXR0ZW5lZFByb3BzO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLndhcm5PbkludmFsaWRDaGlsZHJlbiA9IGZ1bmN0aW9uIHdhcm5PbkludmFsaWRDaGlsZHJlbihjaGlsZCwgbmVzdGVkQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIVZBTElEX1RBR19OQU1FUy5zb21lKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC50eXBlID09PSBuYW1lO1xuICAgICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQudHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2FybihcIllvdSBtYXkgYmUgYXR0ZW1wdGluZyB0byBuZXN0IDxIZWxtZXQ+IGNvbXBvbmVudHMgd2l0aGluIGVhY2ggb3RoZXIsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBSZWZlciB0byBvdXIgQVBJIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3YXJuKFwiT25seSBlbGVtZW50cyB0eXBlcyBcIiArIFZBTElEX1RBR19OQU1FUy5qb2luKFwiLCBcIikgKyBcIiBhcmUgYWxsb3dlZC4gSGVsbWV0IGRvZXMgbm90IHN1cHBvcnQgcmVuZGVyaW5nIDxcIiArIGNoaWxkLnR5cGUgKyBcIj4gZWxlbWVudHMuIFJlZmVyIHRvIG91ciBBUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXN0ZWRDaGlsZHJlbiAmJiB0eXBlb2YgbmVzdGVkQ2hpbGRyZW4gIT09IFwic3RyaW5nXCIgJiYgKCFBcnJheS5pc0FycmF5KG5lc3RlZENoaWxkcmVuKSB8fCBuZXN0ZWRDaGlsZHJlbi5zb21lKGZ1bmN0aW9uIChuZXN0ZWRDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIG5lc3RlZENoaWxkICE9PSBcInN0cmluZ1wiO1xuICAgICAgICAgICAgICAgIH0pKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIZWxtZXQgZXhwZWN0cyBhIHN0cmluZyBhcyBhIGNoaWxkIG9mIDxcIiArIGNoaWxkLnR5cGUgKyBcIj4uIERpZCB5b3UgZm9yZ2V0IHRvIHdyYXAgeW91ciBjaGlsZHJlbiBpbiBicmFjZXM/ICggPFwiICsgY2hpbGQudHlwZSArIFwiPntgYH08L1wiICsgY2hpbGQudHlwZSArIFwiPiApIFJlZmVyIHRvIG91ciBBUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUubWFwQ2hpbGRyZW5Ub1Byb3BzID0gZnVuY3Rpb24gbWFwQ2hpbGRyZW5Ub1Byb3BzKGNoaWxkcmVuLCBuZXdQcm9wcykge1xuICAgICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgICAgIHZhciBhcnJheVR5cGVDaGlsZHJlbiA9IHt9O1xuXG4gICAgICAgICAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkIHx8ICFjaGlsZC5wcm9wcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIF9jaGlsZCRwcm9wcyA9IGNoaWxkLnByb3BzLFxuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbiA9IF9jaGlsZCRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRQcm9wcyA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9jaGlsZCRwcm9wcywgW1wiY2hpbGRyZW5cIl0pO1xuXG4gICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkUHJvcHMgPSBjb252ZXJ0UmVhY3RQcm9wc3RvSHRtbEF0dHJpYnV0ZXMoY2hpbGRQcm9wcyk7XG5cbiAgICAgICAgICAgICAgICBfdGhpczIud2Fybk9uSW52YWxpZENoaWxkcmVuKGNoaWxkLCBuZXN0ZWRDaGlsZHJlbik7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuTElOSzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuTUVUQTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuTk9TQ1JJUFQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLlNDUklQVDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuU1RZTEU6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGVDaGlsZHJlbiA9IF90aGlzMi5mbGF0dGVuQXJyYXlUeXBlQ2hpbGRyZW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkOiBjaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGVDaGlsZHJlbjogYXJyYXlUeXBlQ2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRQcm9wczogbmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbjogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gX3RoaXMyLm1hcE9iamVjdFR5cGVDaGlsZHJlbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQ6IGNoaWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzOiBuZXdQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZFByb3BzOiBuZXdDaGlsZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZENoaWxkcmVuOiBuZXN0ZWRDaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbmV3UHJvcHMgPSB0aGlzLm1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyhhcnJheVR5cGVDaGlsZHJlbiwgbmV3UHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld1Byb3BzO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIHByb3BzID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbXCJjaGlsZHJlblwiXSk7XG5cbiAgICAgICAgICAgIHZhciBuZXdQcm9wcyA9IF9leHRlbmRzKHt9LCBwcm9wcyk7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gdGhpcy5tYXBDaGlsZHJlblRvUHJvcHMoY2hpbGRyZW4sIG5ld1Byb3BzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBuZXdQcm9wcyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY3JlYXRlQ2xhc3MoSGVsbWV0V3JhcHBlciwgbnVsbCwgW3tcbiAgICAgICAgICAgIGtleTogXCJjYW5Vc2VET01cIixcblxuXG4gICAgICAgICAgICAvLyBDb21wb25lbnQucGVlayBjb21lcyBmcm9tIHJlYWN0LXNpZGUtZWZmZWN0OlxuICAgICAgICAgICAgLy8gRm9yIHRlc3RpbmcsIHlvdSBtYXkgdXNlIGEgc3RhdGljIHBlZWsoKSBtZXRob2QgYXZhaWxhYmxlIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQuXG4gICAgICAgICAgICAvLyBJdCBsZXRzIHlvdSBnZXQgdGhlIGN1cnJlbnQgc3RhdGUgd2l0aG91dCByZXNldHRpbmcgdGhlIG1vdW50ZWQgaW5zdGFuY2Ugc3RhY2suXG4gICAgICAgICAgICAvLyBEb27igJl0IHVzZSBpdCBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbiB0ZXN0aW5nLlxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiYXNlOiB7XCJ0YXJnZXRcIjogXCJfYmxhbmtcIiwgXCJocmVmXCI6IFwiaHR0cDovL215c2l0ZS5jb20vXCJ9XG4gICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYm9keUF0dHJpYnV0ZXM6IHtcImNsYXNzTmFtZVwiOiBcInJvb3RcIn1cbiAgICAgICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkZWZhdWx0VGl0bGU6IFwiRGVmYXVsdCBUaXRsZVwiXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRlZmVyOiB0cnVlXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzOiB0cnVlXG4gICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaHRtbEF0dHJpYnV0ZXM6IHtcImxhbmdcIjogXCJlblwiLCBcImFtcFwiOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBsaW5rOiBbe1wicmVsXCI6IFwiY2Fub25pY2FsXCIsIFwiaHJlZlwiOiBcImh0dHA6Ly9teXNpdGUuY29tL2V4YW1wbGVcIn1dXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXRhOiBbe1wibmFtZVwiOiBcImRlc2NyaXB0aW9uXCIsIFwiY29udGVudFwiOiBcIlRlc3QgZGVzY3JpcHRpb25cIn1dXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBub3NjcmlwdDogW3tcImlubmVySFRNTFwiOiBcIjxpbWcgc3JjPSdodHRwOi8vbXlzaXRlLmNvbS9qcy90ZXN0LmpzJ1wifV1cbiAgICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uQ2hhbmdlQ2xpZW50U3RhdGU6IFwiKG5ld1N0YXRlKSA9PiBjb25zb2xlLmxvZyhuZXdTdGF0ZSlcIlxuICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc2NyaXB0OiBbe1widHlwZVwiOiBcInRleHQvamF2YXNjcmlwdFwiLCBcInNyY1wiOiBcImh0dHA6Ly9teXNpdGUuY29tL2pzL3Rlc3QuanNcIn1dXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBzdHlsZTogW3tcInR5cGVcIjogXCJ0ZXh0L2Nzc1wiLCBcImNzc1RleHRcIjogXCJkaXYgeyBkaXNwbGF5OiBibG9jazsgY29sb3I6IGJsdWU7IH1cIn1dXG4gICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGl0bGU6IFwiVGl0bGVcIlxuICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRpdGxlQXR0cmlidXRlczoge1wiaXRlbXByb3BcIjogXCJuYW1lXCJ9XG4gICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGl0bGVUZW1wbGF0ZTogXCJNeVNpdGUuY29tIC0gJXNcIlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMShjYW5Vc2VET00pIHtcbiAgICAgICAgICAgICAgICBDb21wb25lbnQuY2FuVXNlRE9NID0gY2FuVXNlRE9NO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XSk7XG4gICAgICAgIHJldHVybiBIZWxtZXRXcmFwcGVyO1xuICAgIH0oUmVhY3QuQ29tcG9uZW50KSwgX2NsYXNzLnByb3BUeXBlcyA9IHtcbiAgICAgICAgYmFzZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgYm9keUF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubm9kZSksIFByb3BUeXBlcy5ub2RlXSksXG4gICAgICAgIGRlZmF1bHRUaXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgZGVmZXI6IFByb3BUeXBlcy5ib29sLFxuICAgICAgICBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogUHJvcFR5cGVzLmJvb2wsXG4gICAgICAgIGh0bWxBdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgICBsaW5rOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICAgICAgbWV0YTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgICAgIG5vc2NyaXB0OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICAgICAgb25DaGFuZ2VDbGllbnRTdGF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIHNjcmlwdDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgICAgIHN0eWxlOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICAgICAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgIHRpdGxlQXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgdGl0bGVUZW1wbGF0ZTogUHJvcFR5cGVzLnN0cmluZ1xuICAgIH0sIF9jbGFzcy5kZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGRlZmVyOiB0cnVlLFxuICAgICAgICBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogdHJ1ZVxuICAgIH0sIF9jbGFzcy5wZWVrID0gQ29tcG9uZW50LnBlZWssIF9jbGFzcy5yZXdpbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtYXBwZWRTdGF0ZSA9IENvbXBvbmVudC5yZXdpbmQoKTtcbiAgICAgICAgaWYgKCFtYXBwZWRTdGF0ZSkge1xuICAgICAgICAgICAgLy8gcHJvdmlkZSBmYWxsYmFjayBpZiBtYXBwZWRTdGF0ZSBpcyB1bmRlZmluZWRcbiAgICAgICAgICAgIG1hcHBlZFN0YXRlID0gbWFwU3RhdGVPblNlcnZlcih7XG4gICAgICAgICAgICAgICAgYmFzZVRhZzogW10sXG4gICAgICAgICAgICAgICAgYm9keUF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgICAgICAgIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICAgICAgICBsaW5rVGFnczogW10sXG4gICAgICAgICAgICAgICAgbWV0YVRhZ3M6IFtdLFxuICAgICAgICAgICAgICAgIG5vc2NyaXB0VGFnczogW10sXG4gICAgICAgICAgICAgICAgc2NyaXB0VGFnczogW10sXG4gICAgICAgICAgICAgICAgc3R5bGVUYWdzOiBbXSxcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJcIixcbiAgICAgICAgICAgICAgICB0aXRsZUF0dHJpYnV0ZXM6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXBwZWRTdGF0ZTtcbiAgICB9LCBfdGVtcDtcbn07XG5cbnZhciBOdWxsQ29tcG9uZW50ID0gZnVuY3Rpb24gTnVsbENvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciBIZWxtZXRTaWRlRWZmZWN0cyA9IHdpdGhTaWRlRWZmZWN0KHJlZHVjZVByb3BzVG9TdGF0ZSwgaGFuZGxlQ2xpZW50U3RhdGVDaGFuZ2UsIG1hcFN0YXRlT25TZXJ2ZXIpKE51bGxDb21wb25lbnQpO1xuXG52YXIgSGVsbWV0RXhwb3J0ID0gSGVsbWV0KEhlbG1ldFNpZGVFZmZlY3RzKTtcbkhlbG1ldEV4cG9ydC5yZW5kZXJTdGF0aWMgPSBIZWxtZXRFeHBvcnQucmV3aW5kO1xuXG5leHBvcnQgZGVmYXVsdCBIZWxtZXRFeHBvcnQ7XG5leHBvcnQgeyBIZWxtZXRFeHBvcnQgYXMgSGVsbWV0IH07XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1pcy5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX1NFUlZFUl9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zZXJ2ZXJfY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG52YXIgZW5hYmxlQ2FjaGVFbGVtZW50ID0gZmFsc2U7XG52YXIgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgPSBmYWxzZTsgLy8gTm8ga25vd24gYnVncywgYnV0IG5lZWRzIHBlcmZvcm1hbmNlIHRlc3RpbmdcblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcbi8vIHN0dWZmLiBJbnRlbmRlZCB0byBlbmFibGUgUmVhY3QgY29yZSBtZW1iZXJzIHRvIG1vcmUgZWFzaWx5IGRlYnVnIHNjaGVkdWxpbmdcbi8vIGlzc3VlcyBpbiBERVYgYnVpbGRzLlxuXG52YXIgZW5hYmxlRGVidWdUcmFjaW5nID0gZmFsc2U7IC8vIFRyYWNrIHdoaWNoIEZpYmVyKHMpIHNjaGVkdWxlIHJlbmRlciB3b3JrLlxuXG52YXIgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRTtcblxue1xuICBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFID0gU3ltYm9sLmZvcigncmVhY3QubW9kdWxlLnJlZmVyZW5jZScpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgZW5hYmxlRGVidWdUcmFjaW5nICB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiAgfHwgdHlwZSA9PT0gUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgIHx8IGVuYWJsZUNhY2hlRWxlbWVudCAgfHwgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIFRoaXMgbmVlZHMgdG8gaW5jbHVkZSBhbGwgcG9zc2libGUgbW9kdWxlIHJlZmVyZW5jZSBvYmplY3RcbiAgICAvLyB0eXBlcyBzdXBwb3J0ZWQgYnkgYW55IEZsaWdodCBjb25maWd1cmF0aW9uIGFueXdoZXJlIHNpbmNlXG4gICAgLy8gd2UgZG9uJ3Qga25vdyB3aGljaCBGbGlnaHQgYnVpbGQgdGhpcyB3aWxsIGVuZCB1cCBiZWluZyB1c2VkXG4gICAgLy8gd2l0aC5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFIHx8IHR5cGUuZ2V0TW9kdWxlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1NFUlZFUl9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBTdXNwZW5zZUxpc3QgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUxpc3Qob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xufVxuXG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuU3VzcGVuc2VMaXN0ID0gU3VzcGVuc2VMaXN0O1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzU3VzcGVuc2VMaXN0ID0gaXNTdXNwZW5zZUxpc3Q7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQge2NyZWF0ZUVsZW1lbnQsQ29tcG9uZW50fWZyb20ncmVhY3QnO2ltcG9ydCB7ZmluZERPTU5vZGV9ZnJvbSdyZWFjdC1kb20nO2Z1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcblxuICBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59LyoqXG4gKiBDaGVjayB3aGV0aGVyIHNvbWUgRE9NIG5vZGUgaXMgb3VyIENvbXBvbmVudCdzIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGlzTm9kZUZvdW5kKGN1cnJlbnQsIGNvbXBvbmVudE5vZGUsIGlnbm9yZUNsYXNzKSB7XG4gIGlmIChjdXJyZW50ID09PSBjb21wb25lbnROb2RlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gU1ZHIDx1c2UvPiBlbGVtZW50cyBkbyBub3QgdGVjaG5pY2FsbHkgcmVzaWRlIGluIHRoZSByZW5kZXJlZCBET00sIHNvXG4gIC8vIHRoZXkgZG8gbm90IGhhdmUgY2xhc3NMaXN0IGRpcmVjdGx5LCBidXQgdGhleSBvZmZlciBhIGxpbmsgdG8gdGhlaXJcbiAgLy8gY29ycmVzcG9uZGluZyBlbGVtZW50LCB3aGljaCBjYW4gaGF2ZSBjbGFzc0xpc3QuIFRoaXMgZXh0cmEgY2hlY2sgaXMgZm9yXG4gIC8vIHRoYXQgY2FzZS5cbiAgLy8gU2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9zdHJ1Y3QuaHRtbCNJbnRlcmZhY2VTVkdVc2VFbGVtZW50XG4gIC8vIERpc2N1c3Npb246IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb21heC9yZWFjdC1vbmNsaWNrb3V0c2lkZS9wdWxsLzE3XG5cblxuICBpZiAoY3VycmVudC5jb3JyZXNwb25kaW5nRWxlbWVudCkge1xuICAgIHJldHVybiBjdXJyZW50LmNvcnJlc3BvbmRpbmdFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhpZ25vcmVDbGFzcyk7XG4gIH1cblxuICByZXR1cm4gY3VycmVudC5jbGFzc0xpc3QuY29udGFpbnMoaWdub3JlQ2xhc3MpO1xufVxuLyoqXG4gKiBUcnkgdG8gZmluZCBvdXIgbm9kZSBpbiBhIGhpZXJhcmNoeSBvZiBub2RlcywgcmV0dXJuaW5nIHRoZSBkb2N1bWVudFxuICogbm9kZSBhcyBoaWdoZXN0IG5vZGUgaWYgb3VyIG5vZGUgaXMgbm90IGZvdW5kIGluIHRoZSBwYXRoIHVwLlxuICovXG5cbmZ1bmN0aW9uIGZpbmRIaWdoZXN0KGN1cnJlbnQsIGNvbXBvbmVudE5vZGUsIGlnbm9yZUNsYXNzKSB7XG4gIGlmIChjdXJyZW50ID09PSBjb21wb25lbnROb2RlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gSWYgc291cmNlPWxvY2FsIHRoZW4gdGhpcyBldmVudCBjYW1lIGZyb20gJ3NvbWV3aGVyZSdcbiAgLy8gaW5zaWRlIGFuZCBzaG91bGQgYmUgaWdub3JlZC4gV2UgY291bGQgaGFuZGxlIHRoaXMgd2l0aFxuICAvLyBhIGxheWVyZWQgYXBwcm9hY2gsIHRvbywgYnV0IHRoYXQgcmVxdWlyZXMgZ29pbmcgYmFjayB0b1xuICAvLyB0aGlua2luZyBpbiB0ZXJtcyBvZiBEb20gbm9kZSBuZXN0aW5nLCBydW5uaW5nIGNvdW50ZXJcbiAgLy8gdG8gUmVhY3QncyAneW91IHNob3VsZG4ndCBjYXJlIGFib3V0IHRoZSBET00nIHBoaWxvc29waHkuXG4gIC8vIEFsc28gY292ZXIgc2hhZG93Um9vdCBub2RlIGJ5IGNoZWNraW5nIGN1cnJlbnQuaG9zdFxuXG5cbiAgd2hpbGUgKGN1cnJlbnQucGFyZW50Tm9kZSB8fCBjdXJyZW50Lmhvc3QpIHtcbiAgICAvLyBPbmx5IGNoZWNrIG5vcm1hbCBub2RlIHdpdGhvdXQgc2hhZG93Um9vdFxuICAgIGlmIChjdXJyZW50LnBhcmVudE5vZGUgJiYgaXNOb2RlRm91bmQoY3VycmVudCwgY29tcG9uZW50Tm9kZSwgaWdub3JlQ2xhc3MpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnROb2RlIHx8IGN1cnJlbnQuaG9zdDtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50O1xufVxuLyoqXG4gKiBDaGVjayBpZiB0aGUgYnJvd3NlciBzY3JvbGxiYXIgd2FzIGNsaWNrZWRcbiAqL1xuXG5mdW5jdGlvbiBjbGlja2VkU2Nyb2xsYmFyKGV2dCkge1xuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIDw9IGV2dC5jbGllbnRYIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPD0gZXZ0LmNsaWVudFk7XG59Ly8gaWRlYWxseSB3aWxsIGdldCByZXBsYWNlZCB3aXRoIGV4dGVybmFsIGRlcFxuLy8gd2hlbiByYWZyZXgvZGV0ZWN0LXBhc3NpdmUtZXZlbnRzIzQgYW5kIHJhZnJleC9kZXRlY3QtcGFzc2l2ZS1ldmVudHMjNSBnZXQgbWVyZ2VkIGluXG52YXIgdGVzdFBhc3NpdmVFdmVudFN1cHBvcnQgPSBmdW5jdGlvbiB0ZXN0UGFzc2l2ZUV2ZW50U3VwcG9ydCgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYXNzaXZlID0gZmFsc2U7XG4gIHZhciBvcHRpb25zID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHBhc3NpdmUgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlRXZlbnRTdXBwb3J0Jywgbm9vcCwgb3B0aW9ucyk7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZUV2ZW50U3VwcG9ydCcsIG5vb3AsIG9wdGlvbnMpO1xuICByZXR1cm4gcGFzc2l2ZTtcbn07ZnVuY3Rpb24gYXV0b0luYyhzZWVkKSB7XG4gIGlmIChzZWVkID09PSB2b2lkIDApIHtcbiAgICBzZWVkID0gMDtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICsrc2VlZDtcbiAgfTtcbn1cblxudmFyIHVpZCA9IGF1dG9JbmMoKTt2YXIgcGFzc2l2ZUV2ZW50U3VwcG9ydDtcbnZhciBoYW5kbGVyc01hcCA9IHt9O1xudmFyIGVuYWJsZWRJbnN0YW5jZXMgPSB7fTtcbnZhciB0b3VjaEV2ZW50cyA9IFsndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnXTtcbnZhciBJR05PUkVfQ0xBU1NfTkFNRSA9ICdpZ25vcmUtcmVhY3Qtb25jbGlja291dHNpZGUnO1xuLyoqXG4gKiBPcHRpb25zIGZvciBhZGRFdmVudEhhbmRsZXIgYW5kIHJlbW92ZUV2ZW50SGFuZGxlclxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50SGFuZGxlck9wdGlvbnMoaW5zdGFuY2UsIGV2ZW50TmFtZSkge1xuICB2YXIgaGFuZGxlck9wdGlvbnMgPSB7fTtcbiAgdmFyIGlzVG91Y2hFdmVudCA9IHRvdWNoRXZlbnRzLmluZGV4T2YoZXZlbnROYW1lKSAhPT0gLTE7XG5cbiAgaWYgKGlzVG91Y2hFdmVudCAmJiBwYXNzaXZlRXZlbnRTdXBwb3J0KSB7XG4gICAgaGFuZGxlck9wdGlvbnMucGFzc2l2ZSA9ICFpbnN0YW5jZS5wcm9wcy5wcmV2ZW50RGVmYXVsdDtcbiAgfVxuXG4gIHJldHVybiBoYW5kbGVyT3B0aW9ucztcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgdGhlIEhPQyBmdW5jdGlvbiB0aGF0IHlvdSdsbCB1c2VcbiAqIGluIG9yZGVyIHRvIGltcGFydCBvbk91dHNpZGVDbGljayBsaXN0ZW5pbmcgdG8gYW5cbiAqIGFyYml0cmFyeSBjb21wb25lbnQuIEl0IGdldHMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlXG4gKiBib290c3RyYXBwaW5nIGNvZGUgdG8geWllbGQgYW4gaW5zdGFuY2Ugb2YgdGhlXG4gKiBvbkNsaWNrT3V0c2lkZUhPQyBmdW5jdGlvbiBkZWZpbmVkIGluc2lkZSBzZXR1cEhPQygpLlxuICovXG5cblxuZnVuY3Rpb24gb25DbGlja091dHNpZGVIT0MoV3JhcHBlZENvbXBvbmVudCwgY29uZmlnKSB7XG4gIHZhciBfY2xhc3MsIF90ZW1wO1xuXG4gIHZhciBjb21wb25lbnROYW1lID0gV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG4gIHJldHVybiBfdGVtcCA9IF9jbGFzcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgIF9pbmhlcml0c0xvb3NlKG9uQ2xpY2tPdXRzaWRlLCBfQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIG9uQ2xpY2tPdXRzaWRlKHByb3BzKSB7XG4gICAgICB2YXIgX3RoaXM7XG5cbiAgICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSB8fCB0aGlzO1xuXG4gICAgICBfdGhpcy5fX291dHNpZGVDbGlja0hhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBfdGhpcy5fX2NsaWNrT3V0c2lkZUhhbmRsZXJQcm9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgX3RoaXMuX19jbGlja091dHNpZGVIYW5kbGVyUHJvcChldmVudCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5zdGFuY2UgPSBfdGhpcy5nZXRJbnN0YW5jZSgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UucHJvcHMuaGFuZGxlQ2xpY2tPdXRzaWRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaW5zdGFuY2UucHJvcHMuaGFuZGxlQ2xpY2tPdXRzaWRlKGV2ZW50KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmhhbmRsZUNsaWNrT3V0c2lkZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGluc3RhbmNlLmhhbmRsZUNsaWNrT3V0c2lkZShldmVudCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JhcHBlZENvbXBvbmVudDogXCIgKyBjb21wb25lbnROYW1lICsgXCIgbGFja3MgYSBoYW5kbGVDbGlja091dHNpZGUoZXZlbnQpIGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIG91dHNpZGUgY2xpY2sgZXZlbnRzLlwiKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl9fZ2V0Q29tcG9uZW50Tm9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gX3RoaXMuZ2V0SW5zdGFuY2UoKTtcblxuICAgICAgICBpZiAoY29uZmlnICYmIHR5cGVvZiBjb25maWcuc2V0Q2xpY2tPdXRzaWRlUmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbmZpZy5zZXRDbGlja091dHNpZGVSZWYoKShpbnN0YW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLnNldENsaWNrT3V0c2lkZVJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5zZXRDbGlja091dHNpZGVSZWYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaW5kRE9NTm9kZShpbnN0YW5jZSk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5lbmFibGVPbkNsaWNrT3V0c2lkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgZW5hYmxlZEluc3RhbmNlc1tfdGhpcy5fdWlkXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcGFzc2l2ZUV2ZW50U3VwcG9ydCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBwYXNzaXZlRXZlbnRTdXBwb3J0ID0gdGVzdFBhc3NpdmVFdmVudFN1cHBvcnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVuYWJsZWRJbnN0YW5jZXNbX3RoaXMuX3VpZF0gPSB0cnVlO1xuICAgICAgICB2YXIgZXZlbnRzID0gX3RoaXMucHJvcHMuZXZlbnRUeXBlcztcblxuICAgICAgICBpZiAoIWV2ZW50cy5mb3JFYWNoKSB7XG4gICAgICAgICAgZXZlbnRzID0gW2V2ZW50c107XG4gICAgICAgIH1cblxuICAgICAgICBoYW5kbGVyc01hcFtfdGhpcy5fdWlkXSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGlmIChfdGhpcy5jb21wb25lbnROb2RlID09PSBudWxsKSByZXR1cm47XG4gICAgICAgICAgaWYgKF90aGlzLmluaXRUaW1lU3RhbXAgPiBldmVudC50aW1lU3RhbXApIHJldHVybjtcblxuICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMucHJvcHMuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMucHJvcHMuZXhjbHVkZVNjcm9sbGJhciAmJiBjbGlja2VkU2Nyb2xsYmFyKGV2ZW50KSkgcmV0dXJuO1xuICAgICAgICAgIHZhciBjdXJyZW50ID0gZXZlbnQuY29tcG9zZWQgJiYgZXZlbnQuY29tcG9zZWRQYXRoICYmIGV2ZW50LmNvbXBvc2VkUGF0aCgpLnNoaWZ0KCkgfHwgZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgaWYgKGZpbmRIaWdoZXN0KGN1cnJlbnQsIF90aGlzLmNvbXBvbmVudE5vZGUsIF90aGlzLnByb3BzLm91dHNpZGVDbGlja0lnbm9yZUNsYXNzKSAhPT0gZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5fX291dHNpZGVDbGlja0hhbmRsZXIoZXZlbnQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcnNNYXBbX3RoaXMuX3VpZF0sIGdldEV2ZW50SGFuZGxlck9wdGlvbnMoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIGV2ZW50TmFtZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmRpc2FibGVPbkNsaWNrT3V0c2lkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVsZXRlIGVuYWJsZWRJbnN0YW5jZXNbX3RoaXMuX3VpZF07XG4gICAgICAgIHZhciBmbiA9IGhhbmRsZXJzTWFwW190aGlzLl91aWRdO1xuXG4gICAgICAgIGlmIChmbiAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdmFyIGV2ZW50cyA9IF90aGlzLnByb3BzLmV2ZW50VHlwZXM7XG5cbiAgICAgICAgICBpZiAoIWV2ZW50cy5mb3JFYWNoKSB7XG4gICAgICAgICAgICBldmVudHMgPSBbZXZlbnRzXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZuLCBnZXRFdmVudEhhbmRsZXJPcHRpb25zKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBldmVudE5hbWUpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkZWxldGUgaGFuZGxlcnNNYXBbX3RoaXMuX3VpZF07XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmdldFJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmluc3RhbmNlUmVmID0gcmVmO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuX3VpZCA9IHVpZCgpO1xuICAgICAgX3RoaXMuaW5pdFRpbWVTdGFtcCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgdGhlIFdyYXBwZWRDb21wb25lbnQncyBpbnN0YW5jZS5cbiAgICAgKi9cblxuXG4gICAgdmFyIF9wcm90byA9IG9uQ2xpY2tPdXRzaWRlLnByb3RvdHlwZTtcblxuICAgIF9wcm90by5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uIGdldEluc3RhbmNlKCkge1xuICAgICAgaWYgKFdyYXBwZWRDb21wb25lbnQucHJvdG90eXBlICYmICFXcmFwcGVkQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gdGhpcy5pbnN0YW5jZVJlZjtcbiAgICAgIHJldHVybiByZWYuZ2V0SW5zdGFuY2UgPyByZWYuZ2V0SW5zdGFuY2UoKSA6IHJlZjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkIGNsaWNrIGxpc3RlbmVycyB0byB0aGUgY3VycmVudCBkb2N1bWVudCxcbiAgICAgKiBsaW5rZWQgdG8gdGhpcyBjb21wb25lbnQncyBzdGF0ZS5cbiAgICAgKi9cbiAgICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIC8vIElmIHdlIGFyZSBpbiBhbiBlbnZpcm9ubWVudCB3aXRob3V0IGEgRE9NIHN1Y2hcbiAgICAgIC8vIGFzIHNoYWxsb3cgcmVuZGVyaW5nIG9yIHNuYXBzaG90cyB0aGVuIHdlIGV4aXRcbiAgICAgIC8vIGVhcmx5IHRvIHByZXZlbnQgYW55IHVuaGFuZGxlZCBlcnJvcnMgYmVpbmcgdGhyb3duLlxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmdldEluc3RhbmNlKCk7XG5cbiAgICAgIGlmIChjb25maWcgJiYgdHlwZW9mIGNvbmZpZy5oYW5kbGVDbGlja091dHNpZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5fX2NsaWNrT3V0c2lkZUhhbmRsZXJQcm9wID0gY29uZmlnLmhhbmRsZUNsaWNrT3V0c2lkZShpbnN0YW5jZSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9fY2xpY2tPdXRzaWRlSGFuZGxlclByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcmFwcGVkQ29tcG9uZW50OiBcIiArIGNvbXBvbmVudE5hbWUgKyBcIiBsYWNrcyBhIGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIG91dHNpZGUgY2xpY2sgZXZlbnRzIHNwZWNpZmllZCBieSB0aGUgaGFuZGxlQ2xpY2tPdXRzaWRlIGNvbmZpZyBvcHRpb24uXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29tcG9uZW50Tm9kZSA9IHRoaXMuX19nZXRDb21wb25lbnROb2RlKCk7IC8vIHJldHVybiBlYXJseSBzbyB3ZSBkb250IGluaXRpYXRlIG9uQ2xpY2tPdXRzaWRlXG5cbiAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVPbkNsaWNrT3V0c2lkZSkgcmV0dXJuO1xuICAgICAgdGhpcy5lbmFibGVPbkNsaWNrT3V0c2lkZSgpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdGhpcy5jb21wb25lbnROb2RlID0gdGhpcy5fX2dldENvbXBvbmVudE5vZGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCBkb2N1bWVudCdzIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhpcyBjb21wb25lbnRcbiAgICAgKi9cbiAgICA7XG5cbiAgICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuZGlzYWJsZU9uQ2xpY2tPdXRzaWRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbiBiZSBjYWxsZWQgdG8gZXhwbGljaXRseSBlbmFibGUgZXZlbnQgbGlzdGVuaW5nXG4gICAgICogZm9yIGNsaWNrcyBhbmQgdG91Y2hlcyBvdXRzaWRlIG9mIHRoaXMgZWxlbWVudC5cbiAgICAgKi9cbiAgICA7XG5cbiAgICAvKipcbiAgICAgKiBQYXNzLXRocm91Z2ggcmVuZGVyXG4gICAgICovXG4gICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgICBfdGhpcyRwcm9wcy5leGNsdWRlU2Nyb2xsYmFyO1xuICAgICAgICAgIHZhciBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF90aGlzJHByb3BzLCBbXCJleGNsdWRlU2Nyb2xsYmFyXCJdKTtcblxuICAgICAgaWYgKFdyYXBwZWRDb21wb25lbnQucHJvdG90eXBlICYmIFdyYXBwZWRDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpIHtcbiAgICAgICAgcHJvcHMucmVmID0gdGhpcy5nZXRSZWY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wcy53cmFwcGVkUmVmID0gdGhpcy5nZXRSZWY7XG4gICAgICB9XG5cbiAgICAgIHByb3BzLmRpc2FibGVPbkNsaWNrT3V0c2lkZSA9IHRoaXMuZGlzYWJsZU9uQ2xpY2tPdXRzaWRlO1xuICAgICAgcHJvcHMuZW5hYmxlT25DbGlja091dHNpZGUgPSB0aGlzLmVuYWJsZU9uQ2xpY2tPdXRzaWRlO1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwgcHJvcHMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gb25DbGlja091dHNpZGU7XG4gIH0oQ29tcG9uZW50KSwgX2NsYXNzLmRpc3BsYXlOYW1lID0gXCJPbkNsaWNrT3V0c2lkZShcIiArIGNvbXBvbmVudE5hbWUgKyBcIilcIiwgX2NsYXNzLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBldmVudFR5cGVzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0J10sXG4gICAgZXhjbHVkZVNjcm9sbGJhcjogY29uZmlnICYmIGNvbmZpZy5leGNsdWRlU2Nyb2xsYmFyIHx8IGZhbHNlLFxuICAgIG91dHNpZGVDbGlja0lnbm9yZUNsYXNzOiBJR05PUkVfQ0xBU1NfTkFNRSxcbiAgICBwcmV2ZW50RGVmYXVsdDogZmFsc2UsXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZVxuICB9LCBfY2xhc3MuZ2V0Q2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFdyYXBwZWRDb21wb25lbnQuZ2V0Q2xhc3MgPyBXcmFwcGVkQ29tcG9uZW50LmdldENsYXNzKCkgOiBXcmFwcGVkQ29tcG9uZW50O1xuICB9LCBfdGVtcDtcbn1leHBvcnQgZGVmYXVsdCBvbkNsaWNrT3V0c2lkZUhPQztleHBvcnR7SUdOT1JFX0NMQVNTX05BTUV9OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHN0eWxlU2luZ2xldG9uIH0gZnJvbSAncmVhY3Qtc3R5bGUtc2luZ2xldG9uJztcbmltcG9ydCB7IGZ1bGxXaWR0aENsYXNzTmFtZSwgemVyb1JpZ2h0Q2xhc3NOYW1lLCBub1Njcm9sbGJhcnNDbGFzc05hbWUsIHJlbW92ZWRCYXJTaXplVmFyaWFibGUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRHYXBXaWR0aCB9IGZyb20gJy4vdXRpbHMnO1xudmFyIFN0eWxlID0gc3R5bGVTaW5nbGV0b24oKTtcbi8vIGltcG9ydGFudCB0aXAgLSBvbmNlIHdlIG1lYXN1cmUgc2Nyb2xsQmFyIHdpZHRoIGFuZCByZW1vdmUgdGhlbVxuLy8gd2UgY291bGQgbm90IHJlcGVhdCB0aGlzIG9wZXJhdGlvblxuLy8gdGh1cyB3ZSBhcmUgdXNpbmcgc3R5bGUtc2luZ2xldG9uIC0gb25seSB0aGUgZmlyc3QgXCJ5ZXQgY29ycmVjdFwiIHN0eWxlIHdpbGwgYmUgYXBwbGllZC5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiAoX2EsIGFsbG93UmVsYXRpdmUsIGdhcE1vZGUsIGltcG9ydGFudCkge1xuICAgIHZhciBsZWZ0ID0gX2EubGVmdCwgdG9wID0gX2EudG9wLCByaWdodCA9IF9hLnJpZ2h0LCBnYXAgPSBfYS5nYXA7XG4gICAgaWYgKGdhcE1vZGUgPT09IHZvaWQgMCkgeyBnYXBNb2RlID0gJ21hcmdpbic7IH1cbiAgICByZXR1cm4gXCJcXG4gIC5cIi5jb25jYXQobm9TY3JvbGxiYXJzQ2xhc3NOYW1lLCBcIiB7XFxuICAgb3ZlcmZsb3c6IGhpZGRlbiBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICAgcGFkZGluZy1yaWdodDogXCIpLmNvbmNhdChnYXAsIFwicHggXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgfVxcbiAgYm9keSB7XFxuICAgIG92ZXJmbG93OiBoaWRkZW4gXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluO1xcbiAgICBcIikuY29uY2F0KFtcbiAgICAgICAgYWxsb3dSZWxhdGl2ZSAmJiBcInBvc2l0aW9uOiByZWxhdGl2ZSBcIi5jb25jYXQoaW1wb3J0YW50LCBcIjtcIiksXG4gICAgICAgIGdhcE1vZGUgPT09ICdtYXJnaW4nICYmXG4gICAgICAgICAgICBcIlxcbiAgICBwYWRkaW5nLWxlZnQ6IFwiLmNvbmNhdChsZWZ0LCBcInB4O1xcbiAgICBwYWRkaW5nLXRvcDogXCIpLmNvbmNhdCh0b3AsIFwicHg7XFxuICAgIHBhZGRpbmctcmlnaHQ6IFwiKS5jb25jYXQocmlnaHQsIFwicHg7XFxuICAgIG1hcmdpbi1sZWZ0OjA7XFxuICAgIG1hcmdpbi10b3A6MDtcXG4gICAgbWFyZ2luLXJpZ2h0OiBcIikuY29uY2F0KGdhcCwgXCJweCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICAgIFwiKSxcbiAgICAgICAgZ2FwTW9kZSA9PT0gJ3BhZGRpbmcnICYmIFwicGFkZGluZy1yaWdodDogXCIuY29uY2F0KGdhcCwgXCJweCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XCIpLFxuICAgIF1cbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuam9pbignJyksIFwiXFxuICB9XFxuICBcXG4gIC5cIikuY29uY2F0KHplcm9SaWdodENsYXNzTmFtZSwgXCIge1xcbiAgICByaWdodDogXCIpLmNvbmNhdChnYXAsIFwicHggXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgfVxcbiAgXFxuICAuXCIpLmNvbmNhdChmdWxsV2lkdGhDbGFzc05hbWUsIFwiIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiBcIikuY29uY2F0KGdhcCwgXCJweCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICB9XFxuICBcXG4gIC5cIikuY29uY2F0KHplcm9SaWdodENsYXNzTmFtZSwgXCIgLlwiKS5jb25jYXQoemVyb1JpZ2h0Q2xhc3NOYW1lLCBcIiB7XFxuICAgIHJpZ2h0OiAwIFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gIH1cXG4gIFxcbiAgLlwiKS5jb25jYXQoZnVsbFdpZHRoQ2xhc3NOYW1lLCBcIiAuXCIpLmNvbmNhdChmdWxsV2lkdGhDbGFzc05hbWUsIFwiIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiAwIFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gIH1cXG4gIFxcbiAgYm9keSB7XFxuICAgIFwiKS5jb25jYXQocmVtb3ZlZEJhclNpemVWYXJpYWJsZSwgXCI6IFwiKS5jb25jYXQoZ2FwLCBcInB4O1xcbiAgfVxcblwiKTtcbn07XG4vKipcbiAqIFJlbW92ZXMgcGFnZSBzY3JvbGxiYXIgYW5kIGJsb2NrcyBwYWdlIHNjcm9sbCB3aGVuIG1vdW50ZWRcbiAqL1xuZXhwb3J0IHZhciBSZW1vdmVTY3JvbGxCYXIgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICB2YXIgbm9SZWxhdGl2ZSA9IHByb3BzLm5vUmVsYXRpdmUsIG5vSW1wb3J0YW50ID0gcHJvcHMubm9JbXBvcnRhbnQsIF9hID0gcHJvcHMuZ2FwTW9kZSwgZ2FwTW9kZSA9IF9hID09PSB2b2lkIDAgPyAnbWFyZ2luJyA6IF9hO1xuICAgIC8qXG4gICAgIGdhcCB3aWxsIGJlIG1lYXN1cmVkIG9uIGV2ZXJ5IGNvbXBvbmVudCBtb3VudFxuICAgICBob3dldmVyIGl0IHdpbGwgYmUgdXNlZCBvbmx5IGJ5IHRoZSBcImZpcnN0XCIgaW52b2NhdGlvblxuICAgICBkdWUgdG8gc2luZ2xldG9uIG5hdHVyZSBvZiA8U3R5bGVcbiAgICAgKi9cbiAgICB2YXIgZ2FwID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7IHJldHVybiBnZXRHYXBXaWR0aChnYXBNb2RlKTsgfSwgW2dhcE1vZGVdKTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdHlsZSwgeyBzdHlsZXM6IGdldFN0eWxlcyhnYXAsICFub1JlbGF0aXZlLCBnYXBNb2RlLCAhbm9JbXBvcnRhbnQgPyAnIWltcG9ydGFudCcgOiAnJykgfSk7XG59O1xuIiwiZXhwb3J0IHZhciB6ZXJvUmlnaHRDbGFzc05hbWUgPSAncmlnaHQtc2Nyb2xsLWJhci1wb3NpdGlvbic7XG5leHBvcnQgdmFyIGZ1bGxXaWR0aENsYXNzTmFtZSA9ICd3aWR0aC1iZWZvcmUtc2Nyb2xsLWJhcic7XG5leHBvcnQgdmFyIG5vU2Nyb2xsYmFyc0NsYXNzTmFtZSA9ICd3aXRoLXNjcm9sbC1iYXJzLWhpZGRlbic7XG4vKipcbiAqIE5hbWUgb2YgYSBDU1MgdmFyaWFibGUgY29udGFpbmluZyB0aGUgYW1vdW50IG9mIFwiaGlkZGVuXCIgc2Nyb2xsYmFyXG4gKiAhIG1pZ2h0IGJlIHVuZGVmaW5lZCAhIHVzZSB3aWxsIGZhbGxiYWNrIVxuICovXG5leHBvcnQgdmFyIHJlbW92ZWRCYXJTaXplVmFyaWFibGUgPSAnLS1yZW1vdmVkLWJvZHktc2Nyb2xsLWJhci1zaXplJztcbiIsImltcG9ydCB7IFJlbW92ZVNjcm9sbEJhciB9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7IHplcm9SaWdodENsYXNzTmFtZSwgZnVsbFdpZHRoQ2xhc3NOYW1lLCBub1Njcm9sbGJhcnNDbGFzc05hbWUsIHJlbW92ZWRCYXJTaXplVmFyaWFibGUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRHYXBXaWR0aCB9IGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0IHsgUmVtb3ZlU2Nyb2xsQmFyLCB6ZXJvUmlnaHRDbGFzc05hbWUsIGZ1bGxXaWR0aENsYXNzTmFtZSwgbm9TY3JvbGxiYXJzQ2xhc3NOYW1lLCByZW1vdmVkQmFyU2l6ZVZhcmlhYmxlLCBnZXRHYXBXaWR0aCwgfTtcbiIsImV4cG9ydCB2YXIgemVyb0dhcCA9IHtcbiAgICBsZWZ0OiAwLFxuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBnYXA6IDAsXG59O1xudmFyIHBhcnNlID0gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHBhcnNlSW50KHggfHwgJycsIDEwKSB8fCAwOyB9O1xudmFyIGdldE9mZnNldCA9IGZ1bmN0aW9uIChnYXBNb2RlKSB7XG4gICAgdmFyIGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSk7XG4gICAgdmFyIGxlZnQgPSBjc1tnYXBNb2RlID09PSAncGFkZGluZycgPyAncGFkZGluZ0xlZnQnIDogJ21hcmdpbkxlZnQnXTtcbiAgICB2YXIgdG9wID0gY3NbZ2FwTW9kZSA9PT0gJ3BhZGRpbmcnID8gJ3BhZGRpbmdUb3AnIDogJ21hcmdpblRvcCddO1xuICAgIHZhciByaWdodCA9IGNzW2dhcE1vZGUgPT09ICdwYWRkaW5nJyA/ICdwYWRkaW5nUmlnaHQnIDogJ21hcmdpblJpZ2h0J107XG4gICAgcmV0dXJuIFtwYXJzZShsZWZ0KSwgcGFyc2UodG9wKSwgcGFyc2UocmlnaHQpXTtcbn07XG5leHBvcnQgdmFyIGdldEdhcFdpZHRoID0gZnVuY3Rpb24gKGdhcE1vZGUpIHtcbiAgICBpZiAoZ2FwTW9kZSA9PT0gdm9pZCAwKSB7IGdhcE1vZGUgPSAnbWFyZ2luJzsgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gemVyb0dhcDtcbiAgICB9XG4gICAgdmFyIG9mZnNldHMgPSBnZXRPZmZzZXQoZ2FwTW9kZSk7XG4gICAgdmFyIGRvY3VtZW50V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgdmFyIHdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogb2Zmc2V0c1swXSxcbiAgICAgICAgdG9wOiBvZmZzZXRzWzFdLFxuICAgICAgICByaWdodDogb2Zmc2V0c1syXSxcbiAgICAgICAgZ2FwOiBNYXRoLm1heCgwLCB3aW5kb3dXaWR0aCAtIGRvY3VtZW50V2lkdGggKyBvZmZzZXRzWzJdIC0gb2Zmc2V0c1swXSksXG4gICAgfTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUmVtb3ZlU2Nyb2xsIH0gZnJvbSAnLi9VSSc7XG5pbXBvcnQgU2lkZUNhciBmcm9tICcuL3NpZGVjYXInO1xudmFyIFJlYWN0UmVtb3ZlU2Nyb2xsID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikgeyByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVtb3ZlU2Nyb2xsLCBfX2Fzc2lnbih7fSwgcHJvcHMsIHsgcmVmOiByZWYsIHNpZGVDYXI6IFNpZGVDYXIgfSkpKTsgfSk7XG5SZWFjdFJlbW92ZVNjcm9sbC5jbGFzc05hbWVzID0gUmVtb3ZlU2Nyb2xsLmNsYXNzTmFtZXM7XG5leHBvcnQgZGVmYXVsdCBSZWFjdFJlbW92ZVNjcm9sbDtcbiIsImltcG9ydCB7IF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlbW92ZVNjcm9sbEJhciB9IGZyb20gJ3JlYWN0LXJlbW92ZS1zY3JvbGwtYmFyJztcbmltcG9ydCB7IHN0eWxlU2luZ2xldG9uIH0gZnJvbSAncmVhY3Qtc3R5bGUtc2luZ2xldG9uJztcbmltcG9ydCB7IG5vblBhc3NpdmUgfSBmcm9tICcuL2FnZ3Jlc2l2ZUNhcHR1cmUnO1xuaW1wb3J0IHsgaGFuZGxlU2Nyb2xsLCBsb2NhdGlvbkNvdWxkQmVTY3JvbGxlZCB9IGZyb20gJy4vaGFuZGxlU2Nyb2xsJztcbmV4cG9ydCB2YXIgZ2V0VG91Y2hYWSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2hhbmdlZFRvdWNoZXMnIGluIGV2ZW50ID8gW2V2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFldIDogWzAsIDBdO1xufTtcbmV4cG9ydCB2YXIgZ2V0RGVsdGFYWSA9IGZ1bmN0aW9uIChldmVudCkgeyByZXR1cm4gW2V2ZW50LmRlbHRhWCwgZXZlbnQuZGVsdGFZXTsgfTtcbnZhciBleHRyYWN0UmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgIHJldHVybiByZWYgJiYgJ2N1cnJlbnQnIGluIHJlZiA/IHJlZi5jdXJyZW50IDogcmVmO1xufTtcbnZhciBkZWx0YUNvbXBhcmUgPSBmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4geFswXSA9PT0geVswXSAmJiB4WzFdID09PSB5WzFdOyB9O1xudmFyIGdlbmVyYXRlU3R5bGUgPSBmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIFwiXFxuICAuYmxvY2staW50ZXJhY3Rpdml0eS1cIi5jb25jYXQoaWQsIFwiIHtwb2ludGVyLWV2ZW50czogbm9uZTt9XFxuICAuYWxsb3ctaW50ZXJhY3Rpdml0eS1cIikuY29uY2F0KGlkLCBcIiB7cG9pbnRlci1ldmVudHM6IGFsbDt9XFxuXCIpOyB9O1xudmFyIGlkQ291bnRlciA9IDA7XG52YXIgbG9ja1N0YWNrID0gW107XG5leHBvcnQgZnVuY3Rpb24gUmVtb3ZlU2Nyb2xsU2lkZUNhcihwcm9wcykge1xuICAgIHZhciBzaG91bGRQcmV2ZW50UXVldWUgPSBSZWFjdC51c2VSZWYoW10pO1xuICAgIHZhciB0b3VjaFN0YXJ0UmVmID0gUmVhY3QudXNlUmVmKFswLCAwXSk7XG4gICAgdmFyIGFjdGl2ZUF4aXMgPSBSZWFjdC51c2VSZWYoKTtcbiAgICB2YXIgaWQgPSBSZWFjdC51c2VTdGF0ZShpZENvdW50ZXIrKylbMF07XG4gICAgdmFyIFN0eWxlID0gUmVhY3QudXNlU3RhdGUoc3R5bGVTaW5nbGV0b24pWzBdO1xuICAgIHZhciBsYXN0UHJvcHMgPSBSZWFjdC51c2VSZWYocHJvcHMpO1xuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxhc3RQcm9wcy5jdXJyZW50ID0gcHJvcHM7XG4gICAgfSwgW3Byb3BzXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHByb3BzLmluZXJ0KSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoXCJibG9jay1pbnRlcmFjdGl2aXR5LVwiLmNvbmNhdChpZCkpO1xuICAgICAgICAgICAgdmFyIGFsbG93XzEgPSBfX3NwcmVhZEFycmF5KFtwcm9wcy5sb2NrUmVmLmN1cnJlbnRdLCAocHJvcHMuc2hhcmRzIHx8IFtdKS5tYXAoZXh0cmFjdFJlZiksIHRydWUpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgIGFsbG93XzEuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoXCJhbGxvdy1pbnRlcmFjdGl2aXR5LVwiLmNvbmNhdChpZCkpOyB9KTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKFwiYmxvY2staW50ZXJhY3Rpdml0eS1cIi5jb25jYXQoaWQpKTtcbiAgICAgICAgICAgICAgICBhbGxvd18xLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5jbGFzc0xpc3QucmVtb3ZlKFwiYWxsb3ctaW50ZXJhY3Rpdml0eS1cIi5jb25jYXQoaWQpKTsgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9LCBbcHJvcHMuaW5lcnQsIHByb3BzLmxvY2tSZWYuY3VycmVudCwgcHJvcHMuc2hhcmRzXSk7XG4gICAgdmFyIHNob3VsZENhbmNlbEV2ZW50ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50LCBwYXJlbnQpIHtcbiAgICAgICAgaWYgKCd0b3VjaGVzJyBpbiBldmVudCAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgcmV0dXJuICFsYXN0UHJvcHMuY3VycmVudC5hbGxvd1BpbmNoWm9vbTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdG91Y2ggPSBnZXRUb3VjaFhZKGV2ZW50KTtcbiAgICAgICAgdmFyIHRvdWNoU3RhcnQgPSB0b3VjaFN0YXJ0UmVmLmN1cnJlbnQ7XG4gICAgICAgIHZhciBkZWx0YVggPSAnZGVsdGFYJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWCA6IHRvdWNoU3RhcnRbMF0gLSB0b3VjaFswXTtcbiAgICAgICAgdmFyIGRlbHRhWSA9ICdkZWx0YVknIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFZIDogdG91Y2hTdGFydFsxXSAtIHRvdWNoWzFdO1xuICAgICAgICB2YXIgY3VycmVudEF4aXM7XG4gICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgIHZhciBtb3ZlRGlyZWN0aW9uID0gTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkgPyAnaCcgOiAndic7XG4gICAgICAgIC8vIGFsbG93IGhvcml6b250YWwgdG91Y2ggbW92ZSBvbiBSYW5nZSBpbnB1dHMuIFRoZXkgd2lsbCBub3QgY2F1c2UgYW55IHNjcm9sbFxuICAgICAgICBpZiAoJ3RvdWNoZXMnIGluIGV2ZW50ICYmIG1vdmVEaXJlY3Rpb24gPT09ICdoJyAmJiB0YXJnZXQudHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjYW5CZVNjcm9sbGVkSW5NYWluRGlyZWN0aW9uID0gbG9jYXRpb25Db3VsZEJlU2Nyb2xsZWQobW92ZURpcmVjdGlvbiwgdGFyZ2V0KTtcbiAgICAgICAgaWYgKCFjYW5CZVNjcm9sbGVkSW5NYWluRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FuQmVTY3JvbGxlZEluTWFpbkRpcmVjdGlvbikge1xuICAgICAgICAgICAgY3VycmVudEF4aXMgPSBtb3ZlRGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudEF4aXMgPSBtb3ZlRGlyZWN0aW9uID09PSAndicgPyAnaCcgOiAndic7XG4gICAgICAgICAgICBjYW5CZVNjcm9sbGVkSW5NYWluRGlyZWN0aW9uID0gbG9jYXRpb25Db3VsZEJlU2Nyb2xsZWQobW92ZURpcmVjdGlvbiwgdGFyZ2V0KTtcbiAgICAgICAgICAgIC8vIG90aGVyIGF4aXMgbWlnaHQgYmUgbm90IHNjcm9sbGFibGVcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNhbkJlU2Nyb2xsZWRJbk1haW5EaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFjdGl2ZUF4aXMuY3VycmVudCAmJiAnY2hhbmdlZFRvdWNoZXMnIGluIGV2ZW50ICYmIChkZWx0YVggfHwgZGVsdGFZKSkge1xuICAgICAgICAgICAgYWN0aXZlQXhpcy5jdXJyZW50ID0gY3VycmVudEF4aXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjdXJyZW50QXhpcykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhbmNlbGluZ0F4aXMgPSBhY3RpdmVBeGlzLmN1cnJlbnQgfHwgY3VycmVudEF4aXM7XG4gICAgICAgIHJldHVybiBoYW5kbGVTY3JvbGwoY2FuY2VsaW5nQXhpcywgcGFyZW50LCBldmVudCwgY2FuY2VsaW5nQXhpcyA9PT0gJ2gnID8gZGVsdGFYIDogZGVsdGFZLCB0cnVlKTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIHNob3VsZFByZXZlbnQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoX2V2ZW50KSB7XG4gICAgICAgIHZhciBldmVudCA9IF9ldmVudDtcbiAgICAgICAgaWYgKCFsb2NrU3RhY2subGVuZ3RoIHx8IGxvY2tTdGFja1tsb2NrU3RhY2subGVuZ3RoIC0gMV0gIT09IFN0eWxlKSB7XG4gICAgICAgICAgICAvLyBub3QgdGhlIGxhc3QgYWN0aXZlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlbHRhID0gJ2RlbHRhWScgaW4gZXZlbnQgPyBnZXREZWx0YVhZKGV2ZW50KSA6IGdldFRvdWNoWFkoZXZlbnQpO1xuICAgICAgICB2YXIgc291cmNlRXZlbnQgPSBzaG91bGRQcmV2ZW50UXVldWUuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUubmFtZSA9PT0gZXZlbnQudHlwZSAmJiAoZS50YXJnZXQgPT09IGV2ZW50LnRhcmdldCB8fCBldmVudC50YXJnZXQgPT09IGUuc2hhZG93UGFyZW50KSAmJiBkZWx0YUNvbXBhcmUoZS5kZWx0YSwgZGVsdGEpOyB9KVswXTtcbiAgICAgICAgLy8gc2VsZiBldmVudCwgYW5kIHNob3VsZCBiZSBjYW5jZWxlZFxuICAgICAgICBpZiAoc291cmNlRXZlbnQgJiYgc291cmNlRXZlbnQuc2hvdWxkKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3V0c2lkZSBvciBzaGFyZCBldmVudFxuICAgICAgICBpZiAoIXNvdXJjZUV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgc2hhcmROb2RlcyA9IChsYXN0UHJvcHMuY3VycmVudC5zaGFyZHMgfHwgW10pXG4gICAgICAgICAgICAgICAgLm1hcChleHRyYWN0UmVmKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7IH0pO1xuICAgICAgICAgICAgdmFyIHNob3VsZFN0b3AgPSBzaGFyZE5vZGVzLmxlbmd0aCA+IDAgPyBzaG91bGRDYW5jZWxFdmVudChldmVudCwgc2hhcmROb2Rlc1swXSkgOiAhbGFzdFByb3BzLmN1cnJlbnQubm9Jc29sYXRpb247XG4gICAgICAgICAgICBpZiAoc2hvdWxkU3RvcCkge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgW10pO1xuICAgIHZhciBzaG91bGRDYW5jZWwgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobmFtZSwgZGVsdGEsIHRhcmdldCwgc2hvdWxkKSB7XG4gICAgICAgIHZhciBldmVudCA9IHsgbmFtZTogbmFtZSwgZGVsdGE6IGRlbHRhLCB0YXJnZXQ6IHRhcmdldCwgc2hvdWxkOiBzaG91bGQsIHNoYWRvd1BhcmVudDogZ2V0T3V0ZXJtb3N0U2hhZG93UGFyZW50KHRhcmdldCkgfTtcbiAgICAgICAgc2hvdWxkUHJldmVudFF1ZXVlLmN1cnJlbnQucHVzaChldmVudCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2hvdWxkUHJldmVudFF1ZXVlLmN1cnJlbnQgPSBzaG91bGRQcmV2ZW50UXVldWUuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUgIT09IGV2ZW50OyB9KTtcbiAgICAgICAgfSwgMSk7XG4gICAgfSwgW10pO1xuICAgIHZhciBzY3JvbGxUb3VjaFN0YXJ0ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHRvdWNoU3RhcnRSZWYuY3VycmVudCA9IGdldFRvdWNoWFkoZXZlbnQpO1xuICAgICAgICBhY3RpdmVBeGlzLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgfSwgW10pO1xuICAgIHZhciBzY3JvbGxXaGVlbCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBzaG91bGRDYW5jZWwoZXZlbnQudHlwZSwgZ2V0RGVsdGFYWShldmVudCksIGV2ZW50LnRhcmdldCwgc2hvdWxkQ2FuY2VsRXZlbnQoZXZlbnQsIHByb3BzLmxvY2tSZWYuY3VycmVudCkpO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgc2Nyb2xsVG91Y2hNb3ZlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHNob3VsZENhbmNlbChldmVudC50eXBlLCBnZXRUb3VjaFhZKGV2ZW50KSwgZXZlbnQudGFyZ2V0LCBzaG91bGRDYW5jZWxFdmVudChldmVudCwgcHJvcHMubG9ja1JlZi5jdXJyZW50KSk7XG4gICAgfSwgW10pO1xuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxvY2tTdGFjay5wdXNoKFN0eWxlKTtcbiAgICAgICAgcHJvcHMuc2V0Q2FsbGJhY2tzKHtcbiAgICAgICAgICAgIG9uU2Nyb2xsQ2FwdHVyZTogc2Nyb2xsV2hlZWwsXG4gICAgICAgICAgICBvbldoZWVsQ2FwdHVyZTogc2Nyb2xsV2hlZWwsXG4gICAgICAgICAgICBvblRvdWNoTW92ZUNhcHR1cmU6IHNjcm9sbFRvdWNoTW92ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgc2hvdWxkUHJldmVudCwgbm9uUGFzc2l2ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNob3VsZFByZXZlbnQsIG5vblBhc3NpdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgc2Nyb2xsVG91Y2hTdGFydCwgbm9uUGFzc2l2ZSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsb2NrU3RhY2sgPSBsb2NrU3RhY2suZmlsdGVyKGZ1bmN0aW9uIChpbnN0KSB7IHJldHVybiBpbnN0ICE9PSBTdHlsZTsgfSk7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHNob3VsZFByZXZlbnQsIG5vblBhc3NpdmUpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgc2hvdWxkUHJldmVudCwgbm9uUGFzc2l2ZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgc2Nyb2xsVG91Y2hTdGFydCwgbm9uUGFzc2l2ZSk7XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuICAgIHZhciByZW1vdmVTY3JvbGxCYXIgPSBwcm9wcy5yZW1vdmVTY3JvbGxCYXIsIGluZXJ0ID0gcHJvcHMuaW5lcnQ7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBpbmVydCA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3R5bGUsIHsgc3R5bGVzOiBnZW5lcmF0ZVN0eWxlKGlkKSB9KSA6IG51bGwsXG4gICAgICAgIHJlbW92ZVNjcm9sbEJhciA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVtb3ZlU2Nyb2xsQmFyLCB7IGdhcE1vZGU6IHByb3BzLmdhcE1vZGUgfSkgOiBudWxsKSk7XG59XG5mdW5jdGlvbiBnZXRPdXRlcm1vc3RTaGFkb3dQYXJlbnQobm9kZSkge1xuICAgIHZhciBzaGFkb3dQYXJlbnQgPSBudWxsO1xuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgc2hhZG93UGFyZW50ID0gbm9kZS5ob3N0O1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93UGFyZW50O1xufVxuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZnVsbFdpZHRoQ2xhc3NOYW1lLCB6ZXJvUmlnaHRDbGFzc05hbWUgfSBmcm9tICdyZWFjdC1yZW1vdmUtc2Nyb2xsLWJhci9jb25zdGFudHMnO1xuaW1wb3J0IHsgdXNlTWVyZ2VSZWZzIH0gZnJvbSAndXNlLWNhbGxiYWNrLXJlZic7XG5pbXBvcnQgeyBlZmZlY3RDYXIgfSBmcm9tICcuL21lZGl1bSc7XG52YXIgbm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm47XG59O1xuLyoqXG4gKiBSZW1vdmVzIHNjcm9sbGJhciBmcm9tIHRoZSBwYWdlIGFuZCBjb250YWluIHRoZSBzY3JvbGwgd2l0aGluIHRoZSBMb2NrXG4gKi9cbnZhciBSZW1vdmVTY3JvbGwgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcGFyZW50UmVmKSB7XG4gICAgdmFyIHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICB2YXIgX2EgPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgICAgIG9uU2Nyb2xsQ2FwdHVyZTogbm90aGluZyxcbiAgICAgICAgb25XaGVlbENhcHR1cmU6IG5vdGhpbmcsXG4gICAgICAgIG9uVG91Y2hNb3ZlQ2FwdHVyZTogbm90aGluZyxcbiAgICB9KSwgY2FsbGJhY2tzID0gX2FbMF0sIHNldENhbGxiYWNrcyA9IF9hWzFdO1xuICAgIHZhciBmb3J3YXJkUHJvcHMgPSBwcm9wcy5mb3J3YXJkUHJvcHMsIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSwgcmVtb3ZlU2Nyb2xsQmFyID0gcHJvcHMucmVtb3ZlU2Nyb2xsQmFyLCBlbmFibGVkID0gcHJvcHMuZW5hYmxlZCwgc2hhcmRzID0gcHJvcHMuc2hhcmRzLCBzaWRlQ2FyID0gcHJvcHMuc2lkZUNhciwgbm9Jc29sYXRpb24gPSBwcm9wcy5ub0lzb2xhdGlvbiwgaW5lcnQgPSBwcm9wcy5pbmVydCwgYWxsb3dQaW5jaFpvb20gPSBwcm9wcy5hbGxvd1BpbmNoWm9vbSwgX2IgPSBwcm9wcy5hcywgQ29udGFpbmVyID0gX2IgPT09IHZvaWQgMCA/ICdkaXYnIDogX2IsIGdhcE1vZGUgPSBwcm9wcy5nYXBNb2RlLCByZXN0ID0gX19yZXN0KHByb3BzLCBbXCJmb3J3YXJkUHJvcHNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcInJlbW92ZVNjcm9sbEJhclwiLCBcImVuYWJsZWRcIiwgXCJzaGFyZHNcIiwgXCJzaWRlQ2FyXCIsIFwibm9Jc29sYXRpb25cIiwgXCJpbmVydFwiLCBcImFsbG93UGluY2hab29tXCIsIFwiYXNcIiwgXCJnYXBNb2RlXCJdKTtcbiAgICB2YXIgU2lkZUNhciA9IHNpZGVDYXI7XG4gICAgdmFyIGNvbnRhaW5lclJlZiA9IHVzZU1lcmdlUmVmcyhbcmVmLCBwYXJlbnRSZWZdKTtcbiAgICB2YXIgY29udGFpbmVyUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzdCksIGNhbGxiYWNrcyk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBlbmFibGVkICYmIChSZWFjdC5jcmVhdGVFbGVtZW50KFNpZGVDYXIsIHsgc2lkZUNhcjogZWZmZWN0Q2FyLCByZW1vdmVTY3JvbGxCYXI6IHJlbW92ZVNjcm9sbEJhciwgc2hhcmRzOiBzaGFyZHMsIG5vSXNvbGF0aW9uOiBub0lzb2xhdGlvbiwgaW5lcnQ6IGluZXJ0LCBzZXRDYWxsYmFja3M6IHNldENhbGxiYWNrcywgYWxsb3dQaW5jaFpvb206ICEhYWxsb3dQaW5jaFpvb20sIGxvY2tSZWY6IHJlZiwgZ2FwTW9kZTogZ2FwTW9kZSB9KSksXG4gICAgICAgIGZvcndhcmRQcm9wcyA/IChSZWFjdC5jbG9uZUVsZW1lbnQoUmVhY3QuQ2hpbGRyZW4ub25seShjaGlsZHJlbiksIF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb250YWluZXJQcm9wcyksIHsgcmVmOiBjb250YWluZXJSZWYgfSkpKSA6IChSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRhaW5lciwgX19hc3NpZ24oe30sIGNvbnRhaW5lclByb3BzLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lLCByZWY6IGNvbnRhaW5lclJlZiB9KSwgY2hpbGRyZW4pKSkpO1xufSk7XG5SZW1vdmVTY3JvbGwuZGVmYXVsdFByb3BzID0ge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgcmVtb3ZlU2Nyb2xsQmFyOiB0cnVlLFxuICAgIGluZXJ0OiBmYWxzZSxcbn07XG5SZW1vdmVTY3JvbGwuY2xhc3NOYW1lcyA9IHtcbiAgICBmdWxsV2lkdGg6IGZ1bGxXaWR0aENsYXNzTmFtZSxcbiAgICB6ZXJvUmlnaHQ6IHplcm9SaWdodENsYXNzTmFtZSxcbn07XG5leHBvcnQgeyBSZW1vdmVTY3JvbGwgfTtcbiIsInZhciBwYXNzaXZlU3VwcG9ydGVkID0gZmFsc2U7XG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBwYXNzaXZlU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBwYXNzaXZlU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgfVxufVxuZXhwb3J0IHZhciBub25QYXNzaXZlID0gcGFzc2l2ZVN1cHBvcnRlZCA/IHsgcGFzc2l2ZTogZmFsc2UgfSA6IGZhbHNlO1xuIiwidmFyIGFsd2F5c0NvbnRhaW5zU2Nyb2xsID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyB0ZXh0YXJlYSB3aWxsIGFsd2F5cyBfY29udGFpbl8gc2Nyb2xsIGluc2lkZSBzZWxmLiBJdCBvbmx5IGNhbiBiZSBoaWRkZW5cbiAgICByZXR1cm4gbm9kZS50YWdOYW1lID09PSAnVEVYVEFSRUEnO1xufTtcbnZhciBlbGVtZW50Q2FuQmVTY3JvbGxlZCA9IGZ1bmN0aW9uIChub2RlLCBvdmVyZmxvdykge1xuICAgIHZhciBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICByZXR1cm4gKFxuICAgIC8vIG5vdC1ub3Qtc2Nyb2xsYWJsZVxuICAgIHN0eWxlc1tvdmVyZmxvd10gIT09ICdoaWRkZW4nICYmXG4gICAgICAgIC8vIGNvbnRhaW5zIHNjcm9sbCBpbnNpZGUgc2VsZlxuICAgICAgICAhKHN0eWxlcy5vdmVyZmxvd1kgPT09IHN0eWxlcy5vdmVyZmxvd1ggJiYgIWFsd2F5c0NvbnRhaW5zU2Nyb2xsKG5vZGUpICYmIHN0eWxlc1tvdmVyZmxvd10gPT09ICd2aXNpYmxlJykpO1xufTtcbnZhciBlbGVtZW50Q291bGRCZVZTY3JvbGxlZCA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBlbGVtZW50Q2FuQmVTY3JvbGxlZChub2RlLCAnb3ZlcmZsb3dZJyk7IH07XG52YXIgZWxlbWVudENvdWxkQmVIU2Nyb2xsZWQgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gZWxlbWVudENhbkJlU2Nyb2xsZWQobm9kZSwgJ292ZXJmbG93WCcpOyB9O1xuZXhwb3J0IHZhciBsb2NhdGlvbkNvdWxkQmVTY3JvbGxlZCA9IGZ1bmN0aW9uIChheGlzLCBub2RlKSB7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgdmFyIGN1cnJlbnQgPSBub2RlO1xuICAgIGRvIHtcbiAgICAgICAgLy8gU2tpcCBvdmVyIHNoYWRvdyByb290XG4gICAgICAgIGlmICh0eXBlb2YgU2hhZG93Um9vdCAhPT0gJ3VuZGVmaW5lZCcgJiYgY3VycmVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlzU2Nyb2xsYWJsZSA9IGVsZW1lbnRDb3VsZEJlU2Nyb2xsZWQoYXhpcywgY3VycmVudCk7XG4gICAgICAgIGlmIChpc1Njcm9sbGFibGUpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGdldFNjcm9sbFZhcmlhYmxlcyhheGlzLCBjdXJyZW50KSwgcyA9IF9hWzFdLCBkID0gX2FbMl07XG4gICAgICAgICAgICBpZiAocyA+IGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnROb2RlO1xuICAgIH0gd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gb3duZXJEb2N1bWVudC5ib2R5KTtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xudmFyIGdldFZTY3JvbGxWYXJpYWJsZXMgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgc2Nyb2xsVG9wID0gX2Euc2Nyb2xsVG9wLCBzY3JvbGxIZWlnaHQgPSBfYS5zY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCA9IF9hLmNsaWVudEhlaWdodDtcbiAgICByZXR1cm4gW1xuICAgICAgICBzY3JvbGxUb3AsXG4gICAgICAgIHNjcm9sbEhlaWdodCxcbiAgICAgICAgY2xpZW50SGVpZ2h0LFxuICAgIF07XG59O1xudmFyIGdldEhTY3JvbGxWYXJpYWJsZXMgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgc2Nyb2xsTGVmdCA9IF9hLnNjcm9sbExlZnQsIHNjcm9sbFdpZHRoID0gX2Euc2Nyb2xsV2lkdGgsIGNsaWVudFdpZHRoID0gX2EuY2xpZW50V2lkdGg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc2Nyb2xsTGVmdCxcbiAgICAgICAgc2Nyb2xsV2lkdGgsXG4gICAgICAgIGNsaWVudFdpZHRoLFxuICAgIF07XG59O1xudmFyIGVsZW1lbnRDb3VsZEJlU2Nyb2xsZWQgPSBmdW5jdGlvbiAoYXhpcywgbm9kZSkge1xuICAgIHJldHVybiBheGlzID09PSAndicgPyBlbGVtZW50Q291bGRCZVZTY3JvbGxlZChub2RlKSA6IGVsZW1lbnRDb3VsZEJlSFNjcm9sbGVkKG5vZGUpO1xufTtcbnZhciBnZXRTY3JvbGxWYXJpYWJsZXMgPSBmdW5jdGlvbiAoYXhpcywgbm9kZSkge1xuICAgIHJldHVybiBheGlzID09PSAndicgPyBnZXRWU2Nyb2xsVmFyaWFibGVzKG5vZGUpIDogZ2V0SFNjcm9sbFZhcmlhYmxlcyhub2RlKTtcbn07XG52YXIgZ2V0RGlyZWN0aW9uRmFjdG9yID0gZnVuY3Rpb24gKGF4aXMsIGRpcmVjdGlvbikge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBlbGVtZW50J3MgZGlyZWN0aW9uIGlzIHJ0bCAocmlnaHQtdG8tbGVmdCksIHRoZW4gc2Nyb2xsTGVmdCBpcyAwIHdoZW4gdGhlIHNjcm9sbGJhciBpcyBhdCBpdHMgcmlnaHRtb3N0IHBvc2l0aW9uLFxuICAgICAqIGFuZCB0aGVuIGluY3JlYXNpbmdseSBuZWdhdGl2ZSBhcyB5b3Ugc2Nyb2xsIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgY29udGVudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3Njcm9sbExlZnRcbiAgICAgKi9cbiAgICByZXR1cm4gYXhpcyA9PT0gJ2gnICYmIGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAtMSA6IDE7XG59O1xuZXhwb3J0IHZhciBoYW5kbGVTY3JvbGwgPSBmdW5jdGlvbiAoYXhpcywgZW5kVGFyZ2V0LCBldmVudCwgc291cmNlRGVsdGEsIG5vT3ZlcnNjcm9sbCkge1xuICAgIHZhciBkaXJlY3Rpb25GYWN0b3IgPSBnZXREaXJlY3Rpb25GYWN0b3IoYXhpcywgd2luZG93LmdldENvbXB1dGVkU3R5bGUoZW5kVGFyZ2V0KS5kaXJlY3Rpb24pO1xuICAgIHZhciBkZWx0YSA9IGRpcmVjdGlvbkZhY3RvciAqIHNvdXJjZURlbHRhO1xuICAgIC8vIGZpbmQgc2Nyb2xsYWJsZSB0YXJnZXRcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHZhciB0YXJnZXRJbkxvY2sgPSBlbmRUYXJnZXQuY29udGFpbnModGFyZ2V0KTtcbiAgICB2YXIgc2hvdWxkQ2FuY2VsU2Nyb2xsID0gZmFsc2U7XG4gICAgdmFyIGlzRGVsdGFQb3NpdGl2ZSA9IGRlbHRhID4gMDtcbiAgICB2YXIgYXZhaWxhYmxlU2Nyb2xsID0gMDtcbiAgICB2YXIgYXZhaWxhYmxlU2Nyb2xsVG9wID0gMDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBfYSA9IGdldFNjcm9sbFZhcmlhYmxlcyhheGlzLCB0YXJnZXQpLCBwb3NpdGlvbiA9IF9hWzBdLCBzY3JvbGxfMSA9IF9hWzFdLCBjYXBhY2l0eSA9IF9hWzJdO1xuICAgICAgICB2YXIgZWxlbWVudFNjcm9sbCA9IHNjcm9sbF8xIC0gY2FwYWNpdHkgLSBkaXJlY3Rpb25GYWN0b3IgKiBwb3NpdGlvbjtcbiAgICAgICAgaWYgKHBvc2l0aW9uIHx8IGVsZW1lbnRTY3JvbGwpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Q291bGRCZVNjcm9sbGVkKGF4aXMsIHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVTY3JvbGwgKz0gZWxlbWVudFNjcm9sbDtcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVTY3JvbGxUb3AgKz0gcG9zaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChcbiAgICAvLyBwb3J0YWxlZCBjb250ZW50XG4gICAgKCF0YXJnZXRJbkxvY2sgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudC5ib2R5KSB8fFxuICAgICAgICAvLyBzZWxmIGNvbnRlbnRcbiAgICAgICAgKHRhcmdldEluTG9jayAmJiAoZW5kVGFyZ2V0LmNvbnRhaW5zKHRhcmdldCkgfHwgZW5kVGFyZ2V0ID09PSB0YXJnZXQpKSk7XG4gICAgLy8gaGFuZGxlIGVwc2lsb24gYXJvdW5kIDAgKG5vbiBzdGFuZGFyZCB6b29tIGxldmVscylcbiAgICBpZiAoaXNEZWx0YVBvc2l0aXZlICYmXG4gICAgICAgICgobm9PdmVyc2Nyb2xsICYmIE1hdGguYWJzKGF2YWlsYWJsZVNjcm9sbCkgPCAxKSB8fCAoIW5vT3ZlcnNjcm9sbCAmJiBkZWx0YSA+IGF2YWlsYWJsZVNjcm9sbCkpKSB7XG4gICAgICAgIHNob3VsZENhbmNlbFNjcm9sbCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpc0RlbHRhUG9zaXRpdmUgJiZcbiAgICAgICAgKChub092ZXJzY3JvbGwgJiYgTWF0aC5hYnMoYXZhaWxhYmxlU2Nyb2xsVG9wKSA8IDEpIHx8ICghbm9PdmVyc2Nyb2xsICYmIC1kZWx0YSA+IGF2YWlsYWJsZVNjcm9sbFRvcCkpKSB7XG4gICAgICAgIHNob3VsZENhbmNlbFNjcm9sbCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzaG91bGRDYW5jZWxTY3JvbGw7XG59O1xuIiwiaW1wb3J0IHsgY3JlYXRlU2lkZWNhck1lZGl1bSB9IGZyb20gJ3VzZS1zaWRlY2FyJztcbmV4cG9ydCB2YXIgZWZmZWN0Q2FyID0gY3JlYXRlU2lkZWNhck1lZGl1bSgpO1xuIiwiaW1wb3J0IHsgZXhwb3J0U2lkZWNhciB9IGZyb20gJ3VzZS1zaWRlY2FyJztcbmltcG9ydCB7IFJlbW92ZVNjcm9sbFNpZGVDYXIgfSBmcm9tICcuL1NpZGVFZmZlY3QnO1xuaW1wb3J0IHsgZWZmZWN0Q2FyIH0gZnJvbSAnLi9tZWRpdW0nO1xuZXhwb3J0IGRlZmF1bHQgZXhwb3J0U2lkZWNhcihlZmZlY3RDYXIsIFJlbW92ZVNjcm9sbFNpZGVDYXIpO1xuIiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEcmFnZ2FibGUgZnJvbSAncmVhY3QtZHJhZ2dhYmxlJztcbmltcG9ydCB7IFJlc2l6YWJsZSB9IGZyb20gJ3JlLXJlc2l6YWJsZSc7XG5cbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbnZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cblxudmFyIHJlc2l6YWJsZVN0eWxlID0ge1xuICAgIHdpZHRoOiBcImF1dG9cIixcbiAgICBoZWlnaHQ6IFwiYXV0b1wiLFxuICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICB0b3A6IDAsXG4gICAgbGVmdDogMCxcbn07XG52YXIgZ2V0RW5hYmxlUmVzaXppbmdCeUZsYWcgPSBmdW5jdGlvbiAoZmxhZykgeyByZXR1cm4gKHtcbiAgICBib3R0b206IGZsYWcsXG4gICAgYm90dG9tTGVmdDogZmxhZyxcbiAgICBib3R0b21SaWdodDogZmxhZyxcbiAgICBsZWZ0OiBmbGFnLFxuICAgIHJpZ2h0OiBmbGFnLFxuICAgIHRvcDogZmxhZyxcbiAgICB0b3BMZWZ0OiBmbGFnLFxuICAgIHRvcFJpZ2h0OiBmbGFnLFxufSk7IH07XG52YXIgUm5kID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSbmQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUm5kKHByb3BzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5yZXNpemluZ1Bvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIF90aGlzLm9mZnNldEZyb21QYXJlbnQgPSB7IGxlZnQ6IDAsIHRvcDogMCB9O1xuICAgICAgICBfdGhpcy5yZXNpemFibGVFbGVtZW50ID0geyBjdXJyZW50OiBudWxsIH07XG4gICAgICAgIF90aGlzLm9yaWdpbmFsUG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICByZXNpemluZzogZmFsc2UsXG4gICAgICAgICAgICBib3VuZHM6IHtcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWF4V2lkdGg6IHByb3BzLm1heFdpZHRoLFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiBwcm9wcy5tYXhIZWlnaHQsXG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLm9uUmVzaXplU3RhcnQgPSBfdGhpcy5vblJlc2l6ZVN0YXJ0LmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5vblJlc2l6ZSA9IF90aGlzLm9uUmVzaXplLmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5vblJlc2l6ZVN0b3AgPSBfdGhpcy5vblJlc2l6ZVN0b3AuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uRHJhZ1N0YXJ0ID0gX3RoaXMub25EcmFnU3RhcnQuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uRHJhZyA9IF90aGlzLm9uRHJhZy5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25EcmFnU3RvcCA9IF90aGlzLm9uRHJhZ1N0b3AuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLmdldE1heFNpemVzRnJvbVByb3BzID0gX3RoaXMuZ2V0TWF4U2l6ZXNGcm9tUHJvcHMuYmluZChfdGhpcyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUm5kLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVPZmZzZXRGcm9tUGFyZW50KCk7XG4gICAgICAgIHZhciBfYSA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudCwgbGVmdCA9IF9hLmxlZnQsIHRvcCA9IF9hLnRvcDtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5nZXREcmFnZ2FibGVQb3NpdGlvbigpLCB4ID0gX2IueCwgeSA9IF9iLnk7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHg6IHggLSBsZWZ0LFxuICAgICAgICAgICAgeTogeSAtIHRvcCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEhBQ0s6IEFwcGx5IHBvc2l0aW9uIGFkanVzdG1lbnRcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH07XG4gICAgLy8gSEFDSzogVG8gZ2V0IGByZWFjdC1kcmFnZ2FibGVgIHN0YXRlIHggYW5kIHkuXG4gICAgUm5kLnByb3RvdHlwZS5nZXREcmFnZ2FibGVQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5kcmFnZ2FibGUuc3RhdGUsIHggPSBfYS54LCB5ID0gX2EueTtcbiAgICAgICAgcmV0dXJuIHsgeDogeCwgeTogeSB9O1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5nZXRQYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6YWJsZSAmJiB0aGlzLnJlc2l6YWJsZS5wYXJlbnROb2RlO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5nZXRQYXJlbnRTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemFibGUuZ2V0UGFyZW50U2l6ZSgpO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5nZXRNYXhTaXplc0Zyb21Qcm9wcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1heFdpZHRoID0gdHlwZW9mIHRoaXMucHJvcHMubWF4V2lkdGggPT09IFwidW5kZWZpbmVkXCIgPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IHRoaXMucHJvcHMubWF4V2lkdGg7XG4gICAgICAgIHZhciBtYXhIZWlnaHQgPSB0eXBlb2YgdGhpcy5wcm9wcy5tYXhIZWlnaHQgPT09IFwidW5kZWZpbmVkXCIgPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IHRoaXMucHJvcHMubWF4SGVpZ2h0O1xuICAgICAgICByZXR1cm4geyBtYXhXaWR0aDogbWF4V2lkdGgsIG1heEhlaWdodDogbWF4SGVpZ2h0IH07XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLmdldFNlbGZFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemFibGUgJiYgdGhpcy5yZXNpemFibGUucmVzaXphYmxlO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5nZXRPZmZzZXRIZWlnaHQgPSBmdW5jdGlvbiAoYm91bmRhcnkpIHtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5wcm9wcy5zY2FsZTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnByb3BzLmJvdW5kcykge1xuICAgICAgICAgICAgY2FzZSBcIndpbmRvd1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQgLyBzY2FsZTtcbiAgICAgICAgICAgIGNhc2UgXCJib2R5XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0IC8gc2NhbGU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBib3VuZGFyeS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUuZ2V0T2Zmc2V0V2lkdGggPSBmdW5jdGlvbiAoYm91bmRhcnkpIHtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5wcm9wcy5zY2FsZTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnByb3BzLmJvdW5kcykge1xuICAgICAgICAgICAgY2FzZSBcIndpbmRvd1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCAvIHNjYWxlO1xuICAgICAgICAgICAgY2FzZSBcImJvZHlcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCAvIHNjYWxlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYm91bmRhcnkub2Zmc2V0V2lkdGg7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUub25EcmFnU3RhcnQgPSBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkRyYWdTdGFydCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkRyYWdTdGFydChlLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcG9zID0gdGhpcy5nZXREcmFnZ2FibGVQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLm9yaWdpbmFsUG9zaXRpb24gPSBwb3M7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5ib3VuZHMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLnByb3BzLnNjYWxlO1xuICAgICAgICB2YXIgYm91bmRhcnk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJwYXJlbnRcIikge1xuICAgICAgICAgICAgYm91bmRhcnkgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwiYm9keVwiKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50UmVjdF8xID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdmFyIHBhcmVudExlZnRfMSA9IHBhcmVudFJlY3RfMS5sZWZ0O1xuICAgICAgICAgICAgdmFyIHBhcmVudFRvcF8xID0gcGFyZW50UmVjdF8xLnRvcDtcbiAgICAgICAgICAgIHZhciBib2R5UmVjdCA9IGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB2YXIgbGVmdF8xID0gLShwYXJlbnRMZWZ0XzEgLSBwYXJlbnQub2Zmc2V0TGVmdCAqIHNjYWxlIC0gYm9keVJlY3QubGVmdCkgLyBzY2FsZTtcbiAgICAgICAgICAgIHZhciB0b3BfMSA9IC0ocGFyZW50VG9wXzEgLSBwYXJlbnQub2Zmc2V0VG9wICogc2NhbGUgLSBib2R5UmVjdC50b3ApIC8gc2NhbGU7XG4gICAgICAgICAgICB2YXIgcmlnaHQgPSAoZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCAtIHRoaXMucmVzaXphYmxlLnNpemUud2lkdGggKiBzY2FsZSkgLyBzY2FsZSArIGxlZnRfMTtcbiAgICAgICAgICAgIHZhciBib3R0b20gPSAoZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQgLSB0aGlzLnJlc2l6YWJsZS5zaXplLmhlaWdodCAqIHNjYWxlKSAvIHNjYWxlICsgdG9wXzE7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZSh7IGJvdW5kczogeyB0b3A6IHRvcF8xLCByaWdodDogcmlnaHQsIGJvdHRvbTogYm90dG9tLCBsZWZ0OiBsZWZ0XzEgfSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJ3aW5kb3dcIikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgcGFyZW50UmVjdF8yID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdmFyIHBhcmVudExlZnRfMiA9IHBhcmVudFJlY3RfMi5sZWZ0O1xuICAgICAgICAgICAgdmFyIHBhcmVudFRvcF8yID0gcGFyZW50UmVjdF8yLnRvcDtcbiAgICAgICAgICAgIHZhciBsZWZ0XzIgPSAtKHBhcmVudExlZnRfMiAtIHBhcmVudC5vZmZzZXRMZWZ0ICogc2NhbGUpIC8gc2NhbGU7XG4gICAgICAgICAgICB2YXIgdG9wXzIgPSAtKHBhcmVudFRvcF8yIC0gcGFyZW50Lm9mZnNldFRvcCAqIHNjYWxlKSAvIHNjYWxlO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gKHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy5yZXNpemFibGUuc2l6ZS53aWR0aCAqIHNjYWxlKSAvIHNjYWxlICsgbGVmdF8yO1xuICAgICAgICAgICAgdmFyIGJvdHRvbSA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLnJlc2l6YWJsZS5zaXplLmhlaWdodCAqIHNjYWxlKSAvIHNjYWxlICsgdG9wXzI7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZSh7IGJvdW5kczogeyB0b3A6IHRvcF8yLCByaWdodDogcmlnaHQsIGJvdHRvbTogYm90dG9tLCBsZWZ0OiBsZWZ0XzIgfSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5ib3VuZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGJvdW5kYXJ5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnByb3BzLmJvdW5kcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgYm91bmRhcnkgPSB0aGlzLnByb3BzLmJvdW5kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShib3VuZGFyeSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBib3VuZGFyeVJlY3QgPSBib3VuZGFyeS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIGJvdW5kYXJ5TGVmdCA9IGJvdW5kYXJ5UmVjdC5sZWZ0O1xuICAgICAgICB2YXIgYm91bmRhcnlUb3AgPSBib3VuZGFyeVJlY3QudG9wO1xuICAgICAgICB2YXIgcGFyZW50UmVjdCA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIHBhcmVudExlZnQgPSBwYXJlbnRSZWN0LmxlZnQ7XG4gICAgICAgIHZhciBwYXJlbnRUb3AgPSBwYXJlbnRSZWN0LnRvcDtcbiAgICAgICAgdmFyIGxlZnQgPSAoYm91bmRhcnlMZWZ0IC0gcGFyZW50TGVmdCkgLyBzY2FsZTtcbiAgICAgICAgdmFyIHRvcCA9IGJvdW5kYXJ5VG9wIC0gcGFyZW50VG9wO1xuICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldEZyb21QYXJlbnQoKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudDtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBib3VuZHM6IHtcbiAgICAgICAgICAgICAgICB0b3A6IHRvcCAtIG9mZnNldC50b3AsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IGxlZnQgKyAoYm91bmRhcnkub2Zmc2V0V2lkdGggLSB0aGlzLnJlc2l6YWJsZS5zaXplLndpZHRoKSAtIG9mZnNldC5sZWZ0IC8gc2NhbGUsXG4gICAgICAgICAgICAgICAgYm90dG9tOiB0b3AgKyAoYm91bmRhcnkub2Zmc2V0SGVpZ2h0IC0gdGhpcy5yZXNpemFibGUuc2l6ZS5oZWlnaHQpIC0gb2Zmc2V0LnRvcCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBsZWZ0IC0gb2Zmc2V0LmxlZnQgLyBzY2FsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5vbkRyYWcgPSBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMub25EcmFnKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQsIGxlZnQgPSBfYS5sZWZ0LCB0b3AgPSBfYS50b3A7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5kcmFnQXhpcyB8fCB0aGlzLnByb3BzLmRyYWdBeGlzID09PSBcImJvdGhcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25EcmFnKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiBkYXRhLnggKyBsZWZ0LCB5OiBkYXRhLnkgKyB0b3AgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuZHJhZ0F4aXMgPT09IFwieFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vbkRyYWcoZSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRhdGEpLCB7IHg6IGRhdGEueCArIGxlZnQsIHk6IHRoaXMub3JpZ2luYWxQb3NpdGlvbi55ICsgdG9wLCBkZWx0YVk6IDAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuZHJhZ0F4aXMgPT09IFwieVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vbkRyYWcoZSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRhdGEpLCB7IHg6IHRoaXMub3JpZ2luYWxQb3NpdGlvbi54ICsgbGVmdCwgeTogZGF0YS55ICsgdG9wLCBkZWx0YVg6IDAgfSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLm9uRHJhZ1N0b3AgPSBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMub25EcmFnU3RvcClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5vZmZzZXRGcm9tUGFyZW50LCBsZWZ0ID0gX2EubGVmdCwgdG9wID0gX2EudG9wO1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMuZHJhZ0F4aXMgfHwgdGhpcy5wcm9wcy5kcmFnQXhpcyA9PT0gXCJib3RoXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLm9uRHJhZ1N0b3AoZSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRhdGEpLCB7IHg6IGRhdGEueCArIGxlZnQsIHk6IGRhdGEueSArIHRvcCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5kcmFnQXhpcyA9PT0gXCJ4XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLm9uRHJhZ1N0b3AoZSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRhdGEpLCB7IHg6IGRhdGEueCArIGxlZnQsIHk6IHRoaXMub3JpZ2luYWxQb3NpdGlvbi55ICsgdG9wLCBkZWx0YVk6IDAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuZHJhZ0F4aXMgPT09IFwieVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vbkRyYWdTdG9wKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueCArIGxlZnQsIHk6IGRhdGEueSArIHRvcCwgZGVsdGFYOiAwIH0pKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5vblJlc2l6ZVN0YXJ0ID0gZnVuY3Rpb24gKGUsIGRpciwgZWxlbWVudFJlZikge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHJlc2l6aW5nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5wcm9wcy5zY2FsZTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudDtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0RHJhZ2dhYmxlUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1Bvc2l0aW9uID0geyB4OiBwb3MueCArIG9mZnNldC5sZWZ0LCB5OiBwb3MueSArIG9mZnNldC50b3AgfTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0gcG9zO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IHRoaXMuZ2V0UGFyZW50KCk7XG4gICAgICAgICAgICB2YXIgYm91bmRhcnkgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwicGFyZW50XCIpIHtcbiAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHBhcmVudF8xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwiYm9keVwiKSB7XG4gICAgICAgICAgICAgICAgYm91bmRhcnkgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwid2luZG93XCIpIHtcbiAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHdpbmRvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnByb3BzLmJvdW5kcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgYm91bmRhcnkgPSB0aGlzLnByb3BzLmJvdW5kcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzZWxmXzEgPSB0aGlzLmdldFNlbGZFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAoc2VsZl8xIGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICAgICAgICAgIChib3VuZGFyeSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IGJvdW5kYXJ5ID09PSB3aW5kb3cpICYmXG4gICAgICAgICAgICAgICAgcGFyZW50XzEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0TWF4U2l6ZXNGcm9tUHJvcHMoKSwgbWF4V2lkdGggPSBfYS5tYXhXaWR0aCwgbWF4SGVpZ2h0ID0gX2EubWF4SGVpZ2h0O1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTaXplID0gdGhpcy5nZXRQYXJlbnRTaXplKCk7XG4gICAgICAgICAgICAgICAgaWYgKG1heFdpZHRoICYmIHR5cGVvZiBtYXhXaWR0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF4V2lkdGguZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmF0aW8gPSBOdW1iZXIobWF4V2lkdGgucmVwbGFjZShcIiVcIiwgXCJcIikpIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggPSBwYXJlbnRTaXplLndpZHRoICogcmF0aW87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWF4V2lkdGguZW5kc1dpdGgoXCJweFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggPSBOdW1iZXIobWF4V2lkdGgucmVwbGFjZShcInB4XCIsIFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWF4SGVpZ2h0ICYmIHR5cGVvZiBtYXhIZWlnaHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heEhlaWdodC5lbmRzV2l0aChcIiVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYXRpbyA9IE51bWJlcihtYXhIZWlnaHQucmVwbGFjZShcIiVcIiwgXCJcIikpIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gcGFyZW50U2l6ZS5oZWlnaHQgKiByYXRpbztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXhIZWlnaHQuZW5kc1dpdGgoXCJweFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTnVtYmVyKG1heEhlaWdodC5yZXBsYWNlKFwicHhcIiwgXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBzZWxmUmVjdCA9IHNlbGZfMS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZkxlZnQgPSBzZWxmUmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIHZhciBzZWxmVG9wID0gc2VsZlJlY3QudG9wO1xuICAgICAgICAgICAgICAgIHZhciBib3VuZGFyeVJlY3QgPSB0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJ3aW5kb3dcIiA/IHsgbGVmdDogMCwgdG9wOiAwIH0gOiBib3VuZGFyeS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICB2YXIgYm91bmRhcnlMZWZ0ID0gYm91bmRhcnlSZWN0LmxlZnQ7XG4gICAgICAgICAgICAgICAgdmFyIGJvdW5kYXJ5VG9wID0gYm91bmRhcnlSZWN0LnRvcDtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0V2lkdGggPSB0aGlzLmdldE9mZnNldFdpZHRoKGJvdW5kYXJ5KTtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gdGhpcy5nZXRPZmZzZXRIZWlnaHQoYm91bmRhcnkpO1xuICAgICAgICAgICAgICAgIHZhciBoYXNMZWZ0ID0gZGlyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoXCJsZWZ0XCIpO1xuICAgICAgICAgICAgICAgIHZhciBoYXNSaWdodCA9IGRpci50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFwicmlnaHRcIik7XG4gICAgICAgICAgICAgICAgdmFyIGhhc1RvcCA9IGRpci5zdGFydHNXaXRoKFwidG9wXCIpO1xuICAgICAgICAgICAgICAgIHZhciBoYXNCb3R0b20gPSBkaXIuc3RhcnRzV2l0aChcImJvdHRvbVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoKGhhc0xlZnQgfHwgaGFzVG9wKSAmJiB0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4ID0gKHNlbGZMZWZ0IC0gYm91bmRhcnlMZWZ0KSAvIHNjYWxlICsgdGhpcy5yZXNpemFibGUuc2l6ZS53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG1heFdpZHRoOiBtYXggPiBOdW1iZXIobWF4V2lkdGgpID8gbWF4V2lkdGggOiBtYXggfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElORk86IFRvIHNldCBib3VuZHMgaW4gYGxvY2sgYXNwZWN0IHJhdGlvIHdpdGggYm91bmRzYCBjYXNlLiBTZWUgYWxzbyB0aGF0IHN0b3J5LlxuICAgICAgICAgICAgICAgIGlmIChoYXNSaWdodCB8fCAodGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW8gJiYgIWhhc0xlZnQgJiYgIWhhc1RvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IG9mZnNldFdpZHRoICsgKGJvdW5kYXJ5TGVmdCAtIHNlbGZMZWZ0KSAvIHNjYWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgbWF4V2lkdGg6IG1heCA+IE51bWJlcihtYXhXaWR0aCkgPyBtYXhXaWR0aCA6IG1heCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChoYXNUb3AgfHwgaGFzTGVmdCkgJiYgdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IChzZWxmVG9wIC0gYm91bmRhcnlUb3ApIC8gc2NhbGUgKyB0aGlzLnJlc2l6YWJsZS5zaXplLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG1heCA+IE51bWJlcihtYXhIZWlnaHQpID8gbWF4SGVpZ2h0IDogbWF4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSU5GTzogVG8gc2V0IGJvdW5kcyBpbiBgbG9jayBhc3BlY3QgcmF0aW8gd2l0aCBib3VuZHNgIGNhc2UuIFNlZSBhbHNvIHRoYXQgc3RvcnkuXG4gICAgICAgICAgICAgICAgaWYgKGhhc0JvdHRvbSB8fCAodGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW8gJiYgIWhhc1RvcCAmJiAhaGFzTGVmdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IG9mZnNldEhlaWdodCArIChib3VuZGFyeVRvcCAtIHNlbGZUb3ApIC8gc2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBtYXggPiBOdW1iZXIobWF4SGVpZ2h0KSA/IG1heEhlaWdodCA6IG1heCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IHRoaXMucHJvcHMubWF4V2lkdGgsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiB0aGlzLnByb3BzLm1heEhlaWdodCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uUmVzaXplU3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25SZXNpemVTdGFydChlLCBkaXIsIGVsZW1lbnRSZWYpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLm9uUmVzaXplID0gZnVuY3Rpb24gKGUsIGRpcmVjdGlvbiwgZWxlbWVudFJlZiwgZGVsdGEpIHtcbiAgICAgICAgLy8gSU5GTzogQXBwbHkgeCBhbmQgeSBwb3NpdGlvbiBhZGp1c3RtZW50cyBjYXVzZWQgYnkgcmVzaXppbmcgdG8gZHJhZ2dhYmxlXG4gICAgICAgIHZhciBuZXdQb3MgPSB7IHg6IHRoaXMub3JpZ2luYWxQb3NpdGlvbi54LCB5OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueSB9O1xuICAgICAgICB2YXIgbGVmdCA9IC1kZWx0YS53aWR0aDtcbiAgICAgICAgdmFyIHRvcCA9IC1kZWx0YS5oZWlnaHQ7XG4gICAgICAgIHZhciBkaXJlY3Rpb25zID0gW1widG9wXCIsIFwibGVmdFwiLCBcInRvcExlZnRcIiwgXCJib3R0b21MZWZ0XCIsIFwidG9wUmlnaHRcIl07XG4gICAgICAgIGlmIChkaXJlY3Rpb25zLmluY2x1ZGVzKGRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IFwiYm90dG9tTGVmdFwiKSB7XG4gICAgICAgICAgICAgICAgbmV3UG9zLnggKz0gbGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gXCJ0b3BSaWdodFwiKSB7XG4gICAgICAgICAgICAgICAgbmV3UG9zLnkgKz0gdG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3UG9zLnggKz0gbGVmdDtcbiAgICAgICAgICAgICAgICBuZXdQb3MueSArPSB0b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRyYWdnYWJsZVN0YXRlID0gdGhpcy5kcmFnZ2FibGUuc3RhdGU7XG4gICAgICAgIGlmIChuZXdQb3MueCAhPT0gZHJhZ2dhYmxlU3RhdGUueCB8fCBuZXdQb3MueSAhPT0gZHJhZ2dhYmxlU3RhdGUueSkge1xuICAgICAgICAgICAgdGhpcy5kcmFnZ2FibGUuc2V0U3RhdGUobmV3UG9zKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldEZyb21QYXJlbnQoKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudDtcbiAgICAgICAgdmFyIHggPSB0aGlzLmdldERyYWdnYWJsZVBvc2l0aW9uKCkueCArIG9mZnNldC5sZWZ0O1xuICAgICAgICB2YXIgeSA9IHRoaXMuZ2V0RHJhZ2dhYmxlUG9zaXRpb24oKS55ICsgb2Zmc2V0LnRvcDtcbiAgICAgICAgdGhpcy5yZXNpemluZ1Bvc2l0aW9uID0geyB4OiB4LCB5OiB5IH07XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5vblJlc2l6ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9wcy5vblJlc2l6ZShlLCBkaXJlY3Rpb24sIGVsZW1lbnRSZWYsIGRlbHRhLCB7XG4gICAgICAgICAgICB4OiB4LFxuICAgICAgICAgICAgeTogeSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLm9uUmVzaXplU3RvcCA9IGZ1bmN0aW9uIChlLCBkaXJlY3Rpb24sIGVsZW1lbnRSZWYsIGRlbHRhKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcmVzaXppbmc6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5nZXRNYXhTaXplc0Zyb21Qcm9wcygpLCBtYXhXaWR0aCA9IF9hLm1heFdpZHRoLCBtYXhIZWlnaHQgPSBfYS5tYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBtYXhXaWR0aDogbWF4V2lkdGgsIG1heEhlaWdodDogbWF4SGVpZ2h0IH0pO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblJlc2l6ZVN0b3ApIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25SZXNpemVTdG9wKGUsIGRpcmVjdGlvbiwgZWxlbWVudFJlZiwgZGVsdGEsIHRoaXMucmVzaXppbmdQb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUudXBkYXRlU2l6ZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXNpemFibGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucmVzaXphYmxlLnVwZGF0ZVNpemUoeyB3aWR0aDogc2l6ZS53aWR0aCwgaGVpZ2h0OiBzaXplLmhlaWdodCB9KTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUudXBkYXRlUG9zaXRpb24gPSBmdW5jdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGUuc2V0U3RhdGUocG9zaXRpb24pO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS51cGRhdGVPZmZzZXRGcm9tUGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLnByb3BzLnNjYWxlO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLmdldFNlbGZFbGVtZW50KCk7XG4gICAgICAgIGlmICghcGFyZW50IHx8IHNlbGYgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRSZWN0ID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB2YXIgcGFyZW50TGVmdCA9IHBhcmVudFJlY3QubGVmdDtcbiAgICAgICAgdmFyIHBhcmVudFRvcCA9IHBhcmVudFJlY3QudG9wO1xuICAgICAgICB2YXIgc2VsZlJlY3QgPSBzZWxmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLmdldERyYWdnYWJsZVBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBzY3JvbGxMZWZ0ID0gcGFyZW50LnNjcm9sbExlZnQ7XG4gICAgICAgIHZhciBzY3JvbGxUb3AgPSBwYXJlbnQuc2Nyb2xsVG9wO1xuICAgICAgICB0aGlzLm9mZnNldEZyb21QYXJlbnQgPSB7XG4gICAgICAgICAgICBsZWZ0OiBzZWxmUmVjdC5sZWZ0IC0gcGFyZW50TGVmdCArIHNjcm9sbExlZnQgLSBwb3NpdGlvbi54ICogc2NhbGUsXG4gICAgICAgICAgICB0b3A6IHNlbGZSZWN0LnRvcCAtIHBhcmVudFRvcCArIHNjcm9sbFRvcCAtIHBvc2l0aW9uLnkgKiBzY2FsZSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBkaXNhYmxlRHJhZ2dpbmcgPSBfYS5kaXNhYmxlRHJhZ2dpbmcsIHN0eWxlID0gX2Euc3R5bGUsIGRyYWdIYW5kbGVDbGFzc05hbWUgPSBfYS5kcmFnSGFuZGxlQ2xhc3NOYW1lLCBwb3NpdGlvbiA9IF9hLnBvc2l0aW9uLCBvbk1vdXNlRG93biA9IF9hLm9uTW91c2VEb3duLCBvbk1vdXNlVXAgPSBfYS5vbk1vdXNlVXAsIGRyYWdBeGlzID0gX2EuZHJhZ0F4aXMsIGRyYWdHcmlkID0gX2EuZHJhZ0dyaWQsIGJvdW5kcyA9IF9hLmJvdW5kcywgZW5hYmxlVXNlclNlbGVjdEhhY2sgPSBfYS5lbmFibGVVc2VyU2VsZWN0SGFjaywgY2FuY2VsID0gX2EuY2FuY2VsLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBvblJlc2l6ZVN0YXJ0ID0gX2Eub25SZXNpemVTdGFydCwgb25SZXNpemUgPSBfYS5vblJlc2l6ZSwgb25SZXNpemVTdG9wID0gX2Eub25SZXNpemVTdG9wLCBvbkRyYWdTdGFydCA9IF9hLm9uRHJhZ1N0YXJ0LCBvbkRyYWcgPSBfYS5vbkRyYWcsIG9uRHJhZ1N0b3AgPSBfYS5vbkRyYWdTdG9wLCByZXNpemVIYW5kbGVTdHlsZXMgPSBfYS5yZXNpemVIYW5kbGVTdHlsZXMsIHJlc2l6ZUhhbmRsZUNsYXNzZXMgPSBfYS5yZXNpemVIYW5kbGVDbGFzc2VzLCByZXNpemVIYW5kbGVDb21wb25lbnQgPSBfYS5yZXNpemVIYW5kbGVDb21wb25lbnQsIGVuYWJsZVJlc2l6aW5nID0gX2EuZW5hYmxlUmVzaXppbmcsIHJlc2l6ZUdyaWQgPSBfYS5yZXNpemVHcmlkLCByZXNpemVIYW5kbGVXcmFwcGVyQ2xhc3MgPSBfYS5yZXNpemVIYW5kbGVXcmFwcGVyQ2xhc3MsIHJlc2l6ZUhhbmRsZVdyYXBwZXJTdHlsZSA9IF9hLnJlc2l6ZUhhbmRsZVdyYXBwZXJTdHlsZSwgc2NhbGUgPSBfYS5zY2FsZSwgYWxsb3dBbnlDbGljayA9IF9hLmFsbG93QW55Q2xpY2ssIHJlc2l6YWJsZVByb3BzID0gX19yZXN0KF9hLCBbXCJkaXNhYmxlRHJhZ2dpbmdcIiwgXCJzdHlsZVwiLCBcImRyYWdIYW5kbGVDbGFzc05hbWVcIiwgXCJwb3NpdGlvblwiLCBcIm9uTW91c2VEb3duXCIsIFwib25Nb3VzZVVwXCIsIFwiZHJhZ0F4aXNcIiwgXCJkcmFnR3JpZFwiLCBcImJvdW5kc1wiLCBcImVuYWJsZVVzZXJTZWxlY3RIYWNrXCIsIFwiY2FuY2VsXCIsIFwiY2hpbGRyZW5cIiwgXCJvblJlc2l6ZVN0YXJ0XCIsIFwib25SZXNpemVcIiwgXCJvblJlc2l6ZVN0b3BcIiwgXCJvbkRyYWdTdGFydFwiLCBcIm9uRHJhZ1wiLCBcIm9uRHJhZ1N0b3BcIiwgXCJyZXNpemVIYW5kbGVTdHlsZXNcIiwgXCJyZXNpemVIYW5kbGVDbGFzc2VzXCIsIFwicmVzaXplSGFuZGxlQ29tcG9uZW50XCIsIFwiZW5hYmxlUmVzaXppbmdcIiwgXCJyZXNpemVHcmlkXCIsIFwicmVzaXplSGFuZGxlV3JhcHBlckNsYXNzXCIsIFwicmVzaXplSGFuZGxlV3JhcHBlclN0eWxlXCIsIFwic2NhbGVcIiwgXCJhbGxvd0FueUNsaWNrXCJdKTtcbiAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHRoaXMucHJvcHMuZGVmYXVsdCA/IF9fYXNzaWduKHt9LCB0aGlzLnByb3BzLmRlZmF1bHQpIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBSZW1vdmUgdW5rbm93biBwcm9wcywgc2VlIGFsc28gaHR0cHM6Ly9yZWFjdGpzLm9yZy93YXJuaW5ncy91bmtub3duLXByb3AuaHRtbFxuICAgICAgICBkZWxldGUgcmVzaXphYmxlUHJvcHMuZGVmYXVsdDtcbiAgICAgICAgdmFyIGN1cnNvclN0eWxlID0gZGlzYWJsZURyYWdnaW5nIHx8IGRyYWdIYW5kbGVDbGFzc05hbWUgPyB7IGN1cnNvcjogXCJhdXRvXCIgfSA6IHsgY3Vyc29yOiBcIm1vdmVcIiB9O1xuICAgICAgICB2YXIgaW5uZXJTdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXNpemFibGVTdHlsZSksIGN1cnNvclN0eWxlKSwgc3R5bGUpO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQsIGxlZnQgPSBfYi5sZWZ0LCB0b3AgPSBfYi50b3A7XG4gICAgICAgIHZhciBkcmFnZ2FibGVQb3NpdGlvbjtcbiAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBkcmFnZ2FibGVQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB4OiBwb3NpdGlvbi54IC0gbGVmdCxcbiAgICAgICAgICAgICAgICB5OiBwb3NpdGlvbi55IC0gdG9wLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJTkZPOiBNYWtlIHVuY29udG9yb2xsZWQgY29tcG9uZW50IHdoZW4gcmVzaXppbmcgdG8gY29udHJvbCBwb3NpdGlvbiBieSBzZXRQb3N0aW9uLlxuICAgICAgICB2YXIgcG9zID0gdGhpcy5zdGF0ZS5yZXNpemluZyA/IHVuZGVmaW5lZCA6IGRyYWdnYWJsZVBvc2l0aW9uO1xuICAgICAgICB2YXIgZHJhZ0F4aXNPclVuZGVmaW5lZCA9IHRoaXMuc3RhdGUucmVzaXppbmcgPyBcImJvdGhcIiA6IGRyYWdBeGlzO1xuICAgICAgICByZXR1cm4gKGNyZWF0ZUVsZW1lbnQoRHJhZ2dhYmxlLCB7IHJlZjogZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnZ2FibGUgPSBjO1xuICAgICAgICAgICAgfSwgaGFuZGxlOiBkcmFnSGFuZGxlQ2xhc3NOYW1lID8gXCIuXCIuY29uY2F0KGRyYWdIYW5kbGVDbGFzc05hbWUpIDogdW5kZWZpbmVkLCBkZWZhdWx0UG9zaXRpb246IGRlZmF1bHRWYWx1ZSwgb25Nb3VzZURvd246IG9uTW91c2VEb3duLCBcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIG9uTW91c2VVcDogb25Nb3VzZVVwLCBvblN0YXJ0OiB0aGlzLm9uRHJhZ1N0YXJ0LCBvbkRyYWc6IHRoaXMub25EcmFnLCBvblN0b3A6IHRoaXMub25EcmFnU3RvcCwgYXhpczogZHJhZ0F4aXNPclVuZGVmaW5lZCwgZGlzYWJsZWQ6IGRpc2FibGVEcmFnZ2luZywgZ3JpZDogZHJhZ0dyaWQsIGJvdW5kczogYm91bmRzID8gdGhpcy5zdGF0ZS5ib3VuZHMgOiB1bmRlZmluZWQsIHBvc2l0aW9uOiBwb3MsIGVuYWJsZVVzZXJTZWxlY3RIYWNrOiBlbmFibGVVc2VyU2VsZWN0SGFjaywgY2FuY2VsOiBjYW5jZWwsIHNjYWxlOiBzY2FsZSwgYWxsb3dBbnlDbGljazogYWxsb3dBbnlDbGljaywgbm9kZVJlZjogdGhpcy5yZXNpemFibGVFbGVtZW50IH0sXG4gICAgICAgICAgICBjcmVhdGVFbGVtZW50KFJlc2l6YWJsZSwgX19hc3NpZ24oe30sIHJlc2l6YWJsZVByb3BzLCB7IHJlZjogZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZXNpemFibGUgPSBjO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZXNpemFibGVFbGVtZW50LmN1cnJlbnQgPSBjLnJlc2l6YWJsZTtcbiAgICAgICAgICAgICAgICB9LCBkZWZhdWx0U2l6ZTogZGVmYXVsdFZhbHVlLCBzaXplOiB0aGlzLnByb3BzLnNpemUsIGVuYWJsZTogdHlwZW9mIGVuYWJsZVJlc2l6aW5nID09PSBcImJvb2xlYW5cIiA/IGdldEVuYWJsZVJlc2l6aW5nQnlGbGFnKGVuYWJsZVJlc2l6aW5nKSA6IGVuYWJsZVJlc2l6aW5nLCBvblJlc2l6ZVN0YXJ0OiB0aGlzLm9uUmVzaXplU3RhcnQsIG9uUmVzaXplOiB0aGlzLm9uUmVzaXplLCBvblJlc2l6ZVN0b3A6IHRoaXMub25SZXNpemVTdG9wLCBzdHlsZTogaW5uZXJTdHlsZSwgbWluV2lkdGg6IHRoaXMucHJvcHMubWluV2lkdGgsIG1pbkhlaWdodDogdGhpcy5wcm9wcy5taW5IZWlnaHQsIG1heFdpZHRoOiB0aGlzLnN0YXRlLnJlc2l6aW5nID8gdGhpcy5zdGF0ZS5tYXhXaWR0aCA6IHRoaXMucHJvcHMubWF4V2lkdGgsIG1heEhlaWdodDogdGhpcy5zdGF0ZS5yZXNpemluZyA/IHRoaXMuc3RhdGUubWF4SGVpZ2h0IDogdGhpcy5wcm9wcy5tYXhIZWlnaHQsIGdyaWQ6IHJlc2l6ZUdyaWQsIGhhbmRsZVdyYXBwZXJDbGFzczogcmVzaXplSGFuZGxlV3JhcHBlckNsYXNzLCBoYW5kbGVXcmFwcGVyU3R5bGU6IHJlc2l6ZUhhbmRsZVdyYXBwZXJTdHlsZSwgbG9ja0FzcGVjdFJhdGlvOiB0aGlzLnByb3BzLmxvY2tBc3BlY3RSYXRpbywgbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aDogdGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoLCBsb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodDogdGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodCwgaGFuZGxlU3R5bGVzOiByZXNpemVIYW5kbGVTdHlsZXMsIGhhbmRsZUNsYXNzZXM6IHJlc2l6ZUhhbmRsZUNsYXNzZXMsIGhhbmRsZUNvbXBvbmVudDogcmVzaXplSGFuZGxlQ29tcG9uZW50LCBzY2FsZTogdGhpcy5wcm9wcy5zY2FsZSB9KSwgY2hpbGRyZW4pKSk7XG4gICAgfTtcbiAgICBSbmQuZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBtYXhXaWR0aDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgIG1heEhlaWdodDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgICBvblJlc2l6ZVN0YXJ0OiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uUmVzaXplOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uUmVzaXplU3RvcDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvbkRyYWdTdGFydDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvbkRyYWc6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25EcmFnU3RvcDogZnVuY3Rpb24gKCkgeyB9LFxuICAgIH07XG4gICAgcmV0dXJuIFJuZDtcbn0oUHVyZUNvbXBvbmVudCkpO1xuXG5leHBvcnQgeyBSbmQgfTtcbiIsImltcG9ydCB7IGNuYiB9IGZyb20gJ2NuYnVpbGRlcic7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB6b29tTGV2ZWwgfSBmcm9tICd6b29tLWxldmVsJztcbmltcG9ydCB7IERyYWdnYWJsZUNvcmUgfSBmcm9tICdyZWFjdC1kcmFnZ2FibGUnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbnZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn1cblxudmFyIGRvYyA9ICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihkb2N1bWVudCkpID09PSAnb2JqZWN0JyA/IGRvY3VtZW50IDogbnVsbDtcbnZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xudmFyIGlzVW5kZWYgPSBmdW5jdGlvbiBpc1VuZGVmKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJztcbn07XG52YXIgaXNGdW4gPSBmdW5jdGlvbiBpc0Z1bih2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJztcbn07XG52YXIgaXNOdW0gPSBmdW5jdGlvbiBpc051bSh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcic7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBXaWxsIHJldHVybiByZW5kZXJlciByZXN1bHQgaWYgcHJlc2VudGVkLCBkaXYgZWxlbWVudCBvdGhlcndpc2UuXHJcbiAqIElmIHJlbmRlcmVyIGlzIHByZXNlbnRlZCBpdCdsbCByZWNlaXZlIGBlbGVtZW50UmVmYCBmdW5jdGlvbiB3aGljaCBzaG91bGQgYmUgdXNlZCBhcyBIVE1MRWxlbWVudCdzIHJlZi5cclxuICpcclxuICogQHBhcmFtIHByb3BzIHtFbGVtZW50UHJvcHNXaXRoRWxlbWVudFJlZkFuZFJlbmRlcmVyfVxyXG4gKiBAcGFyYW0gZWxlbWVudFJlZiB7RWxlbWVudFJlZn1cclxuICovXG5cbnZhciByZW5kZXJEaXZXaXRoUmVuZGVyZXIgPSBmdW5jdGlvbiByZW5kZXJEaXZXaXRoUmVuZGVyZXIocHJvcHMsIGVsZW1lbnRSZWYpIHtcbiAgaWYgKGlzRnVuKHByb3BzLnJlbmRlcmVyKSkge1xuICAgIHByb3BzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgIHZhciByZW5kZXJlciA9IHByb3BzLnJlbmRlcmVyO1xuICAgIGRlbGV0ZSBwcm9wcy5yZW5kZXJlcjtcbiAgICByZXR1cm4gcmVuZGVyZXIocHJvcHMpO1xuICB9XG5cbiAgZGVsZXRlIHByb3BzLmVsZW1lbnRSZWY7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9fYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogZWxlbWVudFJlZlxuICB9KSk7XG59O1xuXG52YXIgZ2V0SW5uZXJTaXplID0gZnVuY3Rpb24gZ2V0SW5uZXJTaXplKGVsLCBkaW1lbnNpb24sIHBhZGRpbmcxLCBwYWRkaW5nMikge1xuICB2YXIgc3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG5cbiAgaWYgKHN0eWxlcy5ib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCAoTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzW2RpbWVuc2lvbl0pIHx8IDApIC0gKE51bWJlci5wYXJzZUZsb2F0KHN0eWxlc1twYWRkaW5nMV0pIHx8IDApIC0gKE51bWJlci5wYXJzZUZsb2F0KHN0eWxlc1twYWRkaW5nMl0pIHx8IDApKTtcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIucGFyc2VGbG9hdChzdHlsZXNbZGltZW5zaW9uXSkgfHwgMDtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIFJldHVybiBlbGVtZW50J3MgaGVpZ2h0IHdpdGhvdXQgcGFkZGluZ1xyXG4gKi9cblxuXG52YXIgZ2V0SW5uZXJIZWlnaHQgPSBmdW5jdGlvbiBnZXRJbm5lckhlaWdodChlbCkge1xuICByZXR1cm4gZ2V0SW5uZXJTaXplKGVsLCAnaGVpZ2h0JywgJ3BhZGRpbmdUb3AnLCAncGFkZGluZ0JvdHRvbScpO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIGVsZW1lbnQncyB3aWR0aCB3aXRob3V0IHBhZGRpbmdcclxuICovXG5cbnZhciBnZXRJbm5lcldpZHRoID0gZnVuY3Rpb24gZ2V0SW5uZXJXaWR0aChlbCkge1xuICByZXR1cm4gZ2V0SW5uZXJTaXplKGVsLCAnd2lkdGgnLCAncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0Jyk7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gdW5pcXVlIFVVSUQgdjRcclxuICovXG5cbnZhciB1dWlkID0gZnVuY3Rpb24gdXVpZCgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3dcbiAgdmFyIHV1aWQgPSAnJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICBzd2l0Y2ggKGkpIHtcbiAgICAgIGNhc2UgODpcbiAgICAgIGNhc2UgMjA6XG4gICAgICAgIHtcbiAgICAgICAgICB1dWlkICs9IFwiLVwiLmNvbmNhdChNYXRoLnRydW5jKE1hdGgucmFuZG9tKCkgKiAxNikudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDEyOlxuICAgICAgICB7XG4gICAgICAgICAgdXVpZCArPSAnLTQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgMTY6XG4gICAgICAgIHtcbiAgICAgICAgICB1dWlkICs9IFwiLVwiLmNvbmNhdCgoTWF0aC5yYW5kb20oKSAqIDE2IHwgMCAmIDMgfCA4KS50b1N0cmluZygxNikpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICB1dWlkICs9IE1hdGgudHJ1bmMoTWF0aC5yYW5kb20oKSAqIDE2KS50b1N0cmluZygxNik7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIENhbGN1bGF0ZSB0aHVtYiBzaXplIGZvciBnaXZlbiB2aWV3cG9ydCBhbmQgdHJhY2sgcGFyYW1ldGVyc1xyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY29udGVudFNpemUgLSBTY3JvbGxhYmxlIGNvbnRlbnQgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmlld3BvcnRTaXplIC0gVmlld3BvcnQgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdHJhY2tTaXplIC0gVHJhY2sgc2l6ZSB0aHVtYiBjYW4gbW92ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWluaW1hbFNpemUgLSBNaW5pbWFsIHRodW1iJ3Mgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4aW1hbFNpemUgLSBNYXhpbWFsIHRodW1iJ3Mgc2l6ZVxyXG4gKi9cblxudmFyIGNhbGNUaHVtYlNpemUgPSBmdW5jdGlvbiBjYWxjVGh1bWJTaXplKGNvbnRlbnRTaXplLCB2aWV3cG9ydFNpemUsIHRyYWNrU2l6ZSwgbWluaW1hbFNpemUsIG1heGltYWxTaXplKSB7XG4gIGlmICh2aWV3cG9ydFNpemUgPj0gY29udGVudFNpemUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciB0aHVtYlNpemUgPSB2aWV3cG9ydFNpemUgLyBjb250ZW50U2l6ZSAqIHRyYWNrU2l6ZTtcblxuICBpZiAoaXNOdW0obWF4aW1hbFNpemUpKSB7XG4gICAgdGh1bWJTaXplID0gTWF0aC5taW4obWF4aW1hbFNpemUsIHRodW1iU2l6ZSk7XG4gIH1cblxuICBpZiAoaXNOdW0obWluaW1hbFNpemUpKSB7XG4gICAgdGh1bWJTaXplID0gTWF0aC5tYXgobWluaW1hbFNpemUsIHRodW1iU2l6ZSk7XG4gIH1cblxuICByZXR1cm4gdGh1bWJTaXplO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2FsY3VsYXRlIHRodW1iIG9mZnNldCBmb3IgZ2l2ZW4gdmlld3BvcnQsIHRyYWNrIGFuZCB0aHVtYiBwYXJhbWV0ZXJzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb250ZW50U2l6ZSAtIFNjcm9sbGFibGUgY29udGVudCBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2aWV3cG9ydFNpemUgLSBWaWV3cG9ydCBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0cmFja1NpemUgLSBUcmFjayBzaXplIHRodW1iIGNhbiBtb3ZlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aHVtYlNpemUgLSBUaHVtYiBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzY3JvbGwgLSBTY3JvbGwgdmFsdWUgdG8gcmVwcmVzZW50XHJcbiAqL1xuXG52YXIgY2FsY1RodW1iT2Zmc2V0ID0gZnVuY3Rpb24gY2FsY1RodW1iT2Zmc2V0KGNvbnRlbnRTaXplLCB2aWV3cG9ydFNpemUsIHRyYWNrU2l6ZSwgdGh1bWJTaXplLCBzY3JvbGwpIHtcbiAgaWYgKCFzY3JvbGwgfHwgIXRodW1iU2l6ZSB8fCB2aWV3cG9ydFNpemUgPj0gY29udGVudFNpemUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiAodHJhY2tTaXplIC0gdGh1bWJTaXplKSAqIHNjcm9sbCAvIChjb250ZW50U2l6ZSAtIHZpZXdwb3J0U2l6ZSk7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDYWxjdWxhdGUgc2Nyb2xsIGZvciBnaXZlbiB2aWV3cG9ydCwgdHJhY2sgYW5kIHRodW1iIHBhcmFtZXRlcnNcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGNvbnRlbnRTaXplIC0gU2Nyb2xsYWJsZSBjb250ZW50IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHZpZXdwb3J0U2l6ZSAtIFZpZXdwb3J0IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHRyYWNrU2l6ZSAtIFRyYWNrIHNpemUgdGh1bWIgY2FuIG1vdmVcclxuICogQHBhcmFtIHtudW1iZXJ9IHRodW1iU2l6ZSAtIFRodW1iIHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHRodW1iT2Zmc2V0IC0gVGh1bWIncyBvZmZzZXQgcmVwcmVzZW50aW5nIHRoZSBzY3JvbGxcclxuICovXG5cbnZhciBjYWxjU2Nyb2xsRm9yVGh1bWJPZmZzZXQgPSBmdW5jdGlvbiBjYWxjU2Nyb2xsRm9yVGh1bWJPZmZzZXQoY29udGVudFNpemUsIHZpZXdwb3J0U2l6ZSwgdHJhY2tTaXplLCB0aHVtYlNpemUsIHRodW1iT2Zmc2V0KSB7XG4gIGlmICghdGh1bWJPZmZzZXQgfHwgIXRodW1iU2l6ZSB8fCB2aWV3cG9ydFNpemUgPj0gY29udGVudFNpemUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB0aHVtYk9mZnNldCAqIChjb250ZW50U2l6ZSAtIHZpZXdwb3J0U2l6ZSkgLyAodHJhY2tTaXplIC0gdGh1bWJTaXplKTtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgc2Nyb2xsYmFyIHdpZHRoIHNwZWNpZmljIGZvciBjdXJyZW50IGVudmlyb25tZW50LiBDYW4gcmV0dXJuIHVuZGVmaW5lZCBpZiBET00gaXMgbm90IHJlYWR5IHlldC5cclxuICovXG5cbnZhciBnZXRTY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uIGdldFNjcm9sbGJhcldpZHRoKGZvcmNlKSB7XG4gIGlmIChmb3JjZSA9PT0gdm9pZCAwKSB7XG4gICAgZm9yY2UgPSBmYWxzZTtcbiAgfVxuXG4gIGlmICghZG9jKSB7XG4gICAgZ2V0U2Nyb2xsYmFyV2lkdGguX2NhY2hlID0gMDtcbiAgICByZXR1cm4gZ2V0U2Nyb2xsYmFyV2lkdGguX2NhY2hlO1xuICB9XG5cbiAgaWYgKCFmb3JjZSAmJiAhaXNVbmRlZihnZXRTY3JvbGxiYXJXaWR0aC5fY2FjaGUpKSB7XG4gICAgcmV0dXJuIGdldFNjcm9sbGJhcldpZHRoLl9jYWNoZTtcbiAgfVxuXG4gIHZhciBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsICdwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDBweDtoZWlnaHQ6MTAwcHg7dG9wOi05OTlweDtsZWZ0Oi05OTlweDtvdmVyZmxvdzpzY3JvbGw7Jyk7XG4gIGRvYy5ib2R5LmFwcGVuZChlbCk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbiAgaWYgKGVsLmNsaWVudFdpZHRoID09PSAwKSB7XG4gICAgLy8gRG8gbm90IGV2ZW4gY2FjaGUgdGhpcyB2YWx1ZSBiZWNhdXNlIHRoZXJlIGlzIG5vIGNhbGN1bGF0aW9ucy4gSXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL3hvYm90eWkvcmVhY3Qtc2Nyb2xsYmFycy1jdXN0b20vaXNzdWVzLzEyM1xuICAgIGVsLnJlbW92ZSgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGdldFNjcm9sbGJhcldpZHRoLl9jYWNoZSA9IDEwMCAtIGVsLmNsaWVudFdpZHRoO1xuICBlbC5yZW1vdmUoKTtcbiAgcmV0dXJuIGdldFNjcm9sbGJhcldpZHRoLl9jYWNoZTtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIERldGVjdCBuZWVkIG9mIGhvcml6b250YWwgc2Nyb2xsIHJldmVyc2Ugd2hpbGUgUlRMLlxyXG4gKi9cblxudmFyIHNob3VsZFJldmVyc2VSdGxTY3JvbGwgPSBmdW5jdGlvbiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsKGZvcmNlKSB7XG4gIGlmIChmb3JjZSA9PT0gdm9pZCAwKSB7XG4gICAgZm9yY2UgPSBmYWxzZTtcbiAgfVxuXG4gIGlmICghZm9yY2UgJiYgIWlzVW5kZWYoc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbC5fY2FjaGUpKSB7XG4gICAgcmV0dXJuIHNob3VsZFJldmVyc2VSdGxTY3JvbGwuX2NhY2hlO1xuICB9XG5cbiAgaWYgKCFkb2MpIHtcbiAgICBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsLl9jYWNoZSA9IGZhbHNlO1xuICAgIHJldHVybiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsLl9jYWNoZTtcbiAgfVxuXG4gIHZhciBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdmFyIGNoaWxkID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBlbC5hcHBlbmQoY2hpbGQpO1xuICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMHB4O2hlaWdodDoxMDBweDt0b3A6LTk5OXB4O2xlZnQ6LTk5OXB4O292ZXJmbG93OnNjcm9sbDtkaXJlY3Rpb246cnRsJyk7XG4gIGNoaWxkLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6MTAwMHB4O2hlaWdodDoxMDAwcHgnKTtcbiAgZG9jLmJvZHkuYXBwZW5kKGVsKTtcbiAgZWwuc2Nyb2xsTGVmdCA9IC01MDtcbiAgc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbC5fY2FjaGUgPSBlbC5zY3JvbGxMZWZ0ID09PSAtNTA7XG4gIGVsLnJlbW92ZSgpO1xuICByZXR1cm4gc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbC5fY2FjaGU7XG59O1xuXG52YXIgRW1pdHRyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRW1pdHRyKG1heEhhbmRsZXJzKSB7XG4gICAgaWYgKG1heEhhbmRsZXJzID09PSB2b2lkIDApIHtcbiAgICAgIG1heEhhbmRsZXJzID0gMTA7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRNYXhIYW5kbGVycyhtYXhIYW5kbGVycyk7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG5cbiAgRW1pdHRyLl9jYWxsRXZlbnRIYW5kbGVycyA9IGZ1bmN0aW9uIChlbWl0dGVyLCBoYW5kbGVycywgYXJncykge1xuICAgIGlmICghaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGhhbmRsZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgUmVmbGVjdC5hcHBseShoYW5kbGVyc1swXSwgZW1pdHRlciwgYXJncyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaGFuZGxlcnMgPSBfX3NwcmVhZEFycmF5KFtdLCBoYW5kbGVycywgdHJ1ZSk7XG4gICAgdmFyIGlkeDtcblxuICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgaGFuZGxlcnMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgUmVmbGVjdC5hcHBseShoYW5kbGVyc1tpZHhdLCBlbWl0dGVyLCBhcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5zZXRNYXhIYW5kbGVycyA9IGZ1bmN0aW9uIChjb3VudCkge1xuICAgIGlmICghaXNOdW0oY291bnQpIHx8IGNvdW50IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBtYXhIYW5kbGVycyB0byBiZSBhIHBvc2l0aXZlIG51bWJlciwgZ290ICdcIi5jb25jYXQoY291bnQsIFwiJyBvZiB0eXBlIFwiKS5jb25jYXQoX3R5cGVvZihjb3VudCkpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhIYW5kbGVycyA9IGNvdW50O1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUuZ2V0TWF4SGFuZGxlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heEhhbmRsZXJzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cblxuICAgIGlmIChfdHlwZW9mKHRoaXMuX2hhbmRsZXJzW25hbWVdKSAhPT0gJ29iamVjdCcgfHwgIUFycmF5LmlzQXJyYXkodGhpcy5faGFuZGxlcnNbbmFtZV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgRW1pdHRyLl9jYWxsRXZlbnRIYW5kbGVycyh0aGlzLCB0aGlzLl9oYW5kbGVyc1tuYW1lXSwgYXJncyk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBFbWl0dHIuX2FkZEhhbmRsZXIodGhpcywgbmFtZSwgaGFuZGxlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLnByZXBlbmRPbiA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgRW1pdHRyLl9hZGRIYW5kbGVyKHRoaXMsIG5hbWUsIGhhbmRsZXIsIHRydWUpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAoIWlzRnVuKGhhbmRsZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgZXZlbnQgaGFuZGxlciB0byBiZSBhIGZ1bmN0aW9uLCBnb3QgXCIuY29uY2F0KF90eXBlb2YoaGFuZGxlcikpKTtcbiAgICB9XG5cbiAgICBFbWl0dHIuX2FkZEhhbmRsZXIodGhpcywgbmFtZSwgdGhpcy5fd3JhcE9uY2VIYW5kbGVyKG5hbWUsIGhhbmRsZXIpKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUucHJlcGVuZE9uY2UgPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIGlmICghaXNGdW4oaGFuZGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBldmVudCBoYW5kbGVyIHRvIGJlIGEgZnVuY3Rpb24sIGdvdCBcIi5jb25jYXQoX3R5cGVvZihoYW5kbGVyKSkpO1xuICAgIH1cblxuICAgIEVtaXR0ci5fYWRkSGFuZGxlcih0aGlzLCBuYW1lLCB0aGlzLl93cmFwT25jZUhhbmRsZXIobmFtZSwgaGFuZGxlciksIHRydWUpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIEVtaXR0ci5fcmVtb3ZlSGFuZGxlcih0aGlzLCBuYW1lLCBoYW5kbGVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUucmVtb3ZlQWxsSGFuZGxlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXJzID0gdGhpcy5faGFuZGxlcnM7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciByZW1vdmVIYW5kbGVycyA9IGhhbmRsZXJzLnJlbW92ZUhhbmRsZXI7XG4gICAgZGVsZXRlIGhhbmRsZXJzLnJlbW92ZUhhbmRsZXI7XG4gICAgdmFyIGlkeDtcbiAgICB2YXIgZXZlbnROYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluLG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cbiAgICBmb3IgKGV2ZW50TmFtZSBpbiBoYW5kbGVycykge1xuICAgICAgZm9yIChpZHggPSBoYW5kbGVyc1tldmVudE5hbWVdLmxlbmd0aCAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICBFbWl0dHIuX2NhbGxFdmVudEhhbmRsZXJzKHRoaXMsIHJlbW92ZUhhbmRsZXJzLCBbZXZlbnROYW1lLCBoYW5kbGVyc1tldmVudE5hbWVdW2lkeF0uaGFuZGxlciB8fCBoYW5kbGVyc1tldmVudE5hbWVdW2lkeF1dKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLl93cmFwT25jZUhhbmRsZXIgPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIHZhciBvbmNlU3RhdGUgPSB7XG4gICAgICBmaXJlZDogZmFsc2UsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgd3JhcHBlZEhhbmRsZXI6IHVuZGVmaW5lZCxcbiAgICAgIGVtaXR0ZXI6IHRoaXMsXG4gICAgICBldmVudDogbmFtZVxuICAgIH07XG5cbiAgICB2YXIgd3JhcHBlZEhhbmRsZXIgPSBFbWl0dHIuX29uY2VXcmFwcGVyLmJpbmQob25jZVN0YXRlKTtcblxuICAgIG9uY2VTdGF0ZS53cmFwcGVkSGFuZGxlciA9IHdyYXBwZWRIYW5kbGVyO1xuICAgIHdyYXBwZWRIYW5kbGVyLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHdyYXBwZWRIYW5kbGVyLmV2ZW50ID0gbmFtZTtcbiAgICByZXR1cm4gd3JhcHBlZEhhbmRsZXI7XG4gIH07XG5cbiAgRW1pdHRyLl9hZGRIYW5kbGVyID0gZnVuY3Rpb24gKGVtaXR0ZXIsIG5hbWUsIGhhbmRsZXIsIHByZXBlbmQpIHtcbiAgICBpZiAocHJlcGVuZCA9PT0gdm9pZCAwKSB7XG4gICAgICBwcmVwZW5kID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bihoYW5kbGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGV2ZW50IGhhbmRsZXIgdG8gYmUgYSBmdW5jdGlvbiwgZ290IFwiLmNvbmNhdChfdHlwZW9mKGhhbmRsZXIpKSk7XG4gICAgfVxuXG4gICAgZW1pdHRlci5faGFuZGxlcnNbbmFtZV0gPSBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXSB8fCBbXTtcbiAgICBlbWl0dGVyLmVtaXQoJ2FkZEhhbmRsZXInLCBuYW1lLCBoYW5kbGVyKTtcblxuICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS51bnNoaWZ0KGhhbmRsZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS5wdXNoKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBlbWl0dGVyO1xuICB9O1xuXG4gIEVtaXR0ci5fb25jZVdyYXBwZXIgPSBmdW5jdGlvbiBfb25jZVdyYXBwZXIoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZW1pdHRlci5vZmYodGhpcy5ldmVudCwgdGhpcy53cmFwcGVkSGFuZGxlcik7XG4gICAgICBSZWZsZWN0LmFwcGx5KHRoaXMuaGFuZGxlciwgdGhpcy5lbWl0dGVyLCBhcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgRW1pdHRyLl9yZW1vdmVIYW5kbGVyID0gZnVuY3Rpb24gKGVtaXR0ZXIsIG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAoIWlzRnVuKGhhbmRsZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgZXZlbnQgaGFuZGxlciB0byBiZSBhIGZ1bmN0aW9uLCBnb3QgXCIuY29uY2F0KF90eXBlb2YoaGFuZGxlcikpKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZihlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXSkgfHwgIWVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGVtaXR0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGlkeCA9IC0xO1xuXG4gICAgaWYgKGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdWzBdID09PSBoYW5kbGVyIHx8IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdWzBdLmhhbmRsZXIgPT09IGhhbmRsZXIpIHtcbiAgICAgICAgaWR4ID0gMDtcbiAgICAgICAgaGFuZGxlciA9IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdWzBdLmhhbmRsZXIgfHwgZW1pdHRlci5faGFuZGxlcnNbbmFtZV1bMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaWR4ID0gZW1pdHRlci5faGFuZGxlcnNbbmFtZV0ubGVuZ3RoIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgIGlmIChlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVtpZHhdID09PSBoYW5kbGVyIHx8IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdW2lkeF0uaGFuZGxlciA9PT0gaGFuZGxlcikge1xuICAgICAgICAgIGhhbmRsZXIgPSBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVtpZHhdLmhhbmRsZXIgfHwgZW1pdHRlci5faGFuZGxlcnNbbmFtZV1baWR4XTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZW1pdHRlcjtcbiAgICB9XG5cbiAgICBpZiAoaWR4ID09PSAwKSB7XG4gICAgICBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS5zcGxpY2UoaWR4LCAxKTtcbiAgICB9XG5cbiAgICBlbWl0dGVyLmVtaXQoJ3JlbW92ZUhhbmRsZXInLCBuYW1lLCBoYW5kbGVyKTtcbiAgICByZXR1cm4gZW1pdHRlcjtcbiAgfTtcblxuICByZXR1cm4gRW1pdHRyO1xufSgpO1xuXG52YXIgUkFGTG9vcCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJBRkxvb3AoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIHRhcmdldHMgdG8gdXBkYXRlXHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy50YXJnZXRzID0gW107XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSUQgb2YgcmVxdWVzdGVkIGFuaW1hdGlvbiBmcmFtZS4gVmFsdWFibGUgb25seSBpZiBsb29wIGlzIGFjdGl2ZSBhbmQgaGFzIGl0ZW1zIHRvIGl0ZXJhdGUuXHJcbiAgICAgKi9cblxuICAgIHRoaXMuYW5pbWF0aW9uRnJhbWVJRCA9IDA7XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTG9vcCdzIHN0YXRlLlxyXG4gICAgICovXG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFN0YXJ0IHRoZSBsb29wIGlmIGl0IHdhc24ndCB5ZXQuXHJcbiAgICAgKi9cblxuICAgIHRoaXMuc3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLl9pc0FjdGl2ZSAmJiBfdGhpcy50YXJnZXRzLmxlbmd0aCkge1xuICAgICAgICBfdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICBpZiAoX3RoaXMuYW5pbWF0aW9uRnJhbWVJRCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX3RoaXMuYW5pbWF0aW9uRnJhbWVJRCk7XG4gICAgICAgIF90aGlzLmFuaW1hdGlvbkZyYW1lSUQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMucmFmQ2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTdG9wIHRoZSBsb29wIGlmIGlzIHdhcyBhY3RpdmUuXHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgICBfdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgaWYgKF90aGlzLmFuaW1hdGlvbkZyYW1lSUQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKF90aGlzLmFuaW1hdGlvbkZyYW1lSUQpO1xuICAgICAgICBfdGhpcy5hbmltYXRpb25GcmFtZUlEID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIHRhcmdldCB0byB0aGUgaXRlcmF0aW9uIGxpc3QgaWYgaXQncyBub3QgdGhlcmUuXHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy5hZGRUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCBzaWxlbnQpIHtcbiAgICAgIGlmIChzaWxlbnQgPT09IHZvaWQgMCkge1xuICAgICAgICBzaWxlbnQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfdGhpcy50YXJnZXRzLmluY2x1ZGVzKHRhcmdldCkpIHtcbiAgICAgICAgX3RoaXMudGFyZ2V0cy5wdXNoKHRhcmdldCk7XG5cbiAgICAgICAgaWYgKF90aGlzLnRhcmdldHMubGVuZ3RoID09PSAxICYmICFzaWxlbnQpIF90aGlzLnN0YXJ0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJlbW92ZSB0YXJnZXQgZnJvbSBpdGVyYXRpb24gbGlzdCBpZiBpdCB3YXMgdGhlcmUuXHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy5yZW1vdmVUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICB2YXIgaWR4ID0gX3RoaXMudGFyZ2V0cy5pbmRleE9mKHRhcmdldCk7XG5cbiAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgIF90aGlzLnRhcmdldHMuc3BsaWNlKGlkeCwgMSk7XG5cbiAgICAgICAgaWYgKF90aGlzLnRhcmdldHMubGVuZ3RoID09PSAwKSBfdGhpcy5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENhbGxiYWNrIHRoYXQgY2FsbGVkIGVhY2ggYW5pbWF0aW9uIGZyYW1lLlxyXG4gICAgICovXG5cblxuICAgIHRoaXMucmFmQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfdGhpcy50YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghX3RoaXMudGFyZ2V0c1tpXS5fdW5tb3VudGVkKSBfdGhpcy50YXJnZXRzW2ldLnVwZGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5hbmltYXRpb25GcmFtZUlEID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnJhZkNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBfdGhpcy5hbmltYXRpb25GcmFtZUlEO1xuICAgIH07XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUkFGTG9vcC5wcm90b3R5cGUsIFwiaXNBY3RpdmVcIiwge1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIExvb3AncyBzdGF0ZS5cclxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlO1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gUkFGTG9vcDtcbn0oKTtcbnZhciBMb29wID0gbmV3IFJBRkxvb3AoKTtcblxudmFyIEFYSVNfRElSRUNUSU9OO1xuXG4oZnVuY3Rpb24gKEFYSVNfRElSRUNUSU9OKSB7XG4gIEFYSVNfRElSRUNUSU9OW1wiWFwiXSA9IFwieFwiO1xuICBBWElTX0RJUkVDVElPTltcIllcIl0gPSBcInlcIjtcbn0pKEFYSVNfRElSRUNUSU9OIHx8IChBWElTX0RJUkVDVElPTiA9IHt9KSk7XG5cbnZhciBUUkFDS19DTElDS19CRUhBVklPUjtcblxuKGZ1bmN0aW9uIChUUkFDS19DTElDS19CRUhBVklPUikge1xuICBUUkFDS19DTElDS19CRUhBVklPUltcIkpVTVBcIl0gPSBcImp1bXBcIjtcbiAgVFJBQ0tfQ0xJQ0tfQkVIQVZJT1JbXCJTVEVQXCJdID0gXCJzdGVwXCI7XG59KShUUkFDS19DTElDS19CRUhBVklPUiB8fCAoVFJBQ0tfQ0xJQ0tfQkVIQVZJT1IgPSB7fSkpO1xuXG52YXIgU2Nyb2xsYmFyVGh1bWIgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU2Nyb2xsYmFyVGh1bWIsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gU2Nyb2xsYmFyVGh1bWIoKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WCA9IDA7XG4gICAgX3RoaXMuaW5pdGlhbE9mZnNldFkgPSAwO1xuICAgIF90aGlzLmVsZW1lbnRSZWZIYWNrID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMubGFzdERyYWdEYXRhID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICBkZWx0YVg6IDAsXG4gICAgICBkZWx0YVk6IDAsXG4gICAgICBsYXN0WDogMCxcbiAgICAgIGxhc3RZOiAwXG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU9uRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKGV2LCBkYXRhKSB7XG4gICAgICBpZiAoIV90aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMuaGFuZGxlT25EcmFnU3RvcChldiwgZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNCcm93c2VyKSB7XG4gICAgICAgIF90aGlzLnByZXZVc2VyU2VsZWN0ID0gZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0O1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XG4gICAgICAgIF90aGlzLnByZXZPblNlbGVjdFN0YXJ0ID0gZG9jdW1lbnQub25zZWxlY3RzdGFydDtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBTY3JvbGxiYXJUaHVtYi5zZWxlY3RTdGFydFJlcGxhY2VyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLnByb3BzLm9uRHJhZ1N0YXJ0KSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uRHJhZ1N0YXJ0KF90aGlzLmxhc3REcmFnRGF0YSA9IHtcbiAgICAgICAgICB4OiBkYXRhLnggLSBfdGhpcy5pbml0aWFsT2Zmc2V0WCxcbiAgICAgICAgICB5OiBkYXRhLnkgLSBfdGhpcy5pbml0aWFsT2Zmc2V0WSxcbiAgICAgICAgICBsYXN0WDogZGF0YS5sYXN0WCAtIF90aGlzLmluaXRpYWxPZmZzZXRYLFxuICAgICAgICAgIGxhc3RZOiBkYXRhLmxhc3RZIC0gX3RoaXMuaW5pdGlhbE9mZnNldFksXG4gICAgICAgICAgZGVsdGFYOiBkYXRhLmRlbHRhWCxcbiAgICAgICAgICBkZWx0YVk6IGRhdGEuZGVsdGFZXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RyYWdnaW5nJyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU9uRHJhZyA9IGZ1bmN0aW9uIChldiwgZGF0YSkge1xuICAgICAgaWYgKCFfdGhpcy5lbGVtZW50KSB7XG4gICAgICAgIF90aGlzLmhhbmRsZU9uRHJhZ1N0b3AoZXYsIGRhdGEpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLnByb3BzLm9uRHJhZykge1xuICAgICAgICBfdGhpcy5wcm9wcy5vbkRyYWcoX3RoaXMubGFzdERyYWdEYXRhID0ge1xuICAgICAgICAgIHg6IGRhdGEueCAtIF90aGlzLmluaXRpYWxPZmZzZXRYLFxuICAgICAgICAgIHk6IGRhdGEueSAtIF90aGlzLmluaXRpYWxPZmZzZXRZLFxuICAgICAgICAgIGxhc3RYOiBkYXRhLmxhc3RYIC0gX3RoaXMuaW5pdGlhbE9mZnNldFgsXG4gICAgICAgICAgbGFzdFk6IGRhdGEubGFzdFkgLSBfdGhpcy5pbml0aWFsT2Zmc2V0WSxcbiAgICAgICAgICBkZWx0YVg6IGRhdGEuZGVsdGFYLFxuICAgICAgICAgIGRlbHRhWTogZGF0YS5kZWx0YVlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU9uRHJhZ1N0b3AgPSBmdW5jdGlvbiAoZXYsIGRhdGEpIHtcbiAgICAgIHZhciByZXN1bHREYXRhID0gZGF0YSA/IHtcbiAgICAgICAgeDogZGF0YS54IC0gX3RoaXMuaW5pdGlhbE9mZnNldFgsXG4gICAgICAgIHk6IGRhdGEueSAtIF90aGlzLmluaXRpYWxPZmZzZXRZLFxuICAgICAgICBsYXN0WDogZGF0YS5sYXN0WCAtIF90aGlzLmluaXRpYWxPZmZzZXRYLFxuICAgICAgICBsYXN0WTogZGF0YS5sYXN0WSAtIF90aGlzLmluaXRpYWxPZmZzZXRZLFxuICAgICAgICBkZWx0YVg6IGRhdGEuZGVsdGFYLFxuICAgICAgICBkZWx0YVk6IGRhdGEuZGVsdGFZXG4gICAgICB9IDogX3RoaXMubGFzdERyYWdEYXRhO1xuICAgICAgaWYgKF90aGlzLnByb3BzLm9uRHJhZ0VuZCkgX3RoaXMucHJvcHMub25EcmFnRW5kKHJlc3VsdERhdGEpO1xuICAgICAgaWYgKF90aGlzLmVsZW1lbnQpIF90aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dpbmcnKTtcblxuICAgICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSBfdGhpcy5wcmV2VXNlclNlbGVjdDtcblxuICAgICAgICBpZiAoX3RoaXMucHJldk9uU2VsZWN0U3RhcnQpIHtcbiAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIF90aGlzLnByZXZPblNlbGVjdFN0YXJ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnByZXZPblNlbGVjdFN0YXJ0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldFggPSAwO1xuICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldFkgPSAwO1xuICAgICAgX3RoaXMubGFzdERyYWdEYXRhID0ge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICBkZWx0YVg6IDAsXG4gICAgICAgIGRlbHRhWTogMCxcbiAgICAgICAgbGFzdFg6IDAsXG4gICAgICAgIGxhc3RZOiAwXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVPbk1vdXNlRG93biA9IGZ1bmN0aW9uIChldikge1xuICAgICAgaWYgKCFfdGhpcy5lbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBpZiAoIWlzVW5kZWYoZXYub2Zmc2V0WCkpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldFggPSBldi5vZmZzZXRYO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4gICAgICAgIF90aGlzLmluaXRpYWxPZmZzZXRZID0gZXYub2Zmc2V0WTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZWN0ID0gX3RoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WCA9IChldi5jbGllbnRYIHx8IGV2LnRvdWNoZXNbMF0uY2xpZW50WCkgLSByZWN0LmxlZnQ7XG4gICAgICAgIF90aGlzLmluaXRpYWxPZmZzZXRZID0gKGV2LmNsaWVudFkgfHwgZXYudG91Y2hlc1swXS5jbGllbnRZKSAtIHJlY3QudG9wO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLmVsZW1lbnRSZWYpKSBfdGhpcy5wcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICBfdGhpcy5lbGVtZW50ID0gcmVmOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAvLyBAdHMtaWdub3JlXG5cbiAgICAgIF90aGlzLmVsZW1lbnRSZWZIYWNrLmN1cnJlbnQgPSByZWY7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFNjcm9sbGJhclRodW1iLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIjxTY3JvbGxiYXJUaHVtYj4gRWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBTY3JvbGxiYXJUaHVtYi5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5oYW5kbGVPbkRyYWdTdG9wKCk7XG4gICAgdGhpcy5lbGVtZW50UmVmKG51bGwpO1xuICB9O1xuXG4gIFNjcm9sbGJhclRodW1iLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hID0gdGhpcy5wcm9wcztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmVsZW1lbnRSZWY7XG4gICAgICAgIHZhciBheGlzID0gX2EuYXhpcztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uRHJhZztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uRHJhZ0VuZDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uRHJhZ1N0YXJ0O1xuICAgICAgICB2YXIgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcImVsZW1lbnRSZWZcIiwgXCJheGlzXCIsIFwib25EcmFnXCIsIFwib25EcmFnRW5kXCIsIFwib25EcmFnU3RhcnRcIl0pO1xuXG4gICAgcHJvcHMuY2xhc3NOYW1lID0gY25iKCdTY3JvbGxiYXJzQ3VzdG9tLVRodW1iJywgYXhpcyA9PT0gQVhJU19ESVJFQ1RJT04uWCA/ICdTY3JvbGxiYXJzQ3VzdG9tLVRodW1iWCcgOiAnU2Nyb2xsYmFyc0N1c3RvbS1UaHVtYlknLCBwcm9wcy5jbGFzc05hbWUpO1xuXG4gICAgaWYgKHByb3BzLnJlbmRlcmVyKSB7XG4gICAgICBwcm9wcy5heGlzID0gYXhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChEcmFnZ2FibGVDb3JlLCB7XG4gICAgICBhbGxvd0FueUNsaWNrOiBmYWxzZSxcbiAgICAgIGVuYWJsZVVzZXJTZWxlY3RIYWNrOiBmYWxzZSxcbiAgICAgIG9uTW91c2VEb3duOiB0aGlzLmhhbmRsZU9uTW91c2VEb3duLFxuICAgICAgb25EcmFnOiB0aGlzLmhhbmRsZU9uRHJhZyxcbiAgICAgIG9uU3RhcnQ6IHRoaXMuaGFuZGxlT25EcmFnU3RhcnQsXG4gICAgICBvblN0b3A6IHRoaXMuaGFuZGxlT25EcmFnU3RvcCxcbiAgICAgIG5vZGVSZWY6IHRoaXMuZWxlbWVudFJlZkhhY2tcbiAgICB9LCByZW5kZXJEaXZXaXRoUmVuZGVyZXIocHJvcHMsIHRoaXMuZWxlbWVudFJlZikpO1xuICB9O1xuXG4gIFNjcm9sbGJhclRodW1iLnNlbGVjdFN0YXJ0UmVwbGFjZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHJldHVybiBTY3JvbGxiYXJUaHVtYjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIFNjcm9sbGJhclRyYWNrID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKFNjcm9sbGJhclRyYWNrLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIFNjcm9sbGJhclRyYWNrKCkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuZWxlbWVudCA9IG51bGw7XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLmVsZW1lbnRSZWYpKSBfdGhpcy5wcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICBfdGhpcy5lbGVtZW50ID0gcmVmO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIChldikge1xuICAgICAgaWYgKCFldiB8fCAhX3RoaXMuZWxlbWVudCB8fCBldi5idXR0b24gIT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMub25DbGljaykgJiYgZXYudGFyZ2V0ID09PSBfdGhpcy5lbGVtZW50KSB7XG4gICAgICAgIGlmICghaXNVbmRlZihldi5vZmZzZXRYKSkge1xuICAgICAgICAgIF90aGlzLnByb3BzLm9uQ2xpY2soZXYsIHtcbiAgICAgICAgICAgIGF4aXM6IF90aGlzLnByb3BzLmF4aXMsXG4gICAgICAgICAgICBvZmZzZXQ6IF90aGlzLnByb3BzLmF4aXMgPT09IEFYSVNfRElSRUNUSU9OLlggPyBldi5vZmZzZXRYIDogZXYub2Zmc2V0WVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIG9sZCBicm93c2Vyc1xuXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICB2YXIgcmVjdCA9IF90aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG4gICAgICAgICAgX3RoaXMucHJvcHMub25DbGljayhldiwge1xuICAgICAgICAgICAgYXhpczogX3RoaXMucHJvcHMuYXhpcyxcbiAgICAgICAgICAgIG9mZnNldDogX3RoaXMucHJvcHMuYXhpcyA9PT0gQVhJU19ESVJFQ1RJT04uWCA/IChldi5jbGllbnRYIHx8IGV2LnRvdWNoZXNbMF0uY2xpZW50WCkgLSByZWN0LmxlZnQgOiAoZXYuY2xpZW50WSB8fCBldi50b3VjaGVzWzBdLmNsaWVudFkpIC0gcmVjdC50b3BcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgU2Nyb2xsYmFyVHJhY2sucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuICB9O1xuXG4gIFNjcm9sbGJhclRyYWNrLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYobnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIFNjcm9sbGJhclRyYWNrLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hID0gdGhpcy5wcm9wcztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmVsZW1lbnRSZWY7XG4gICAgICAgIHZhciBheGlzID0gX2EuYXhpcztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uQ2xpY2s7XG4gICAgICAgIHZhciBwcm9wcyA9IF9fcmVzdChfYSwgW1wiZWxlbWVudFJlZlwiLCBcImF4aXNcIiwgXCJvbkNsaWNrXCJdKTtcblxuICAgIHByb3BzLmNsYXNzTmFtZSA9IGNuYignU2Nyb2xsYmFyc0N1c3RvbS1UcmFjaycsIGF4aXMgPT09IEFYSVNfRElSRUNUSU9OLlggPyAnU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1gnIDogJ1Njcm9sbGJhcnNDdXN0b20tVHJhY2tZJywgcHJvcHMuY2xhc3NOYW1lKTtcblxuICAgIGlmIChwcm9wcy5yZW5kZXJlcikge1xuICAgICAgcHJvcHMuYXhpcyA9IGF4aXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlckRpdldpdGhSZW5kZXJlcihwcm9wcywgdGhpcy5lbGVtZW50UmVmKTtcbiAgfTtcblxuICByZXR1cm4gU2Nyb2xsYmFyVHJhY2s7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBzdHlsZSA9IHtcbiAgaG9sZGVyOiB7XG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICBoZWlnaHQ6ICcxMDAlJ1xuICB9LFxuICB3cmFwcGVyOiB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIHJpZ2h0OiAwXG4gIH0sXG4gIGNvbnRlbnQ6IHtcbiAgICBib3hTaXppbmc6ICdib3JkZXItYm94J1xuICB9LFxuICB0cmFjazoge1xuICAgIGNvbW1vbjoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICBib3JkZXJSYWRpdXM6IDQsXG4gICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLDAsMCwuMSknLFxuICAgICAgdXNlclNlbGVjdDogJ25vbmUnXG4gICAgfSxcbiAgICB4OiB7XG4gICAgICBoZWlnaHQ6IDEwLFxuICAgICAgd2lkdGg6ICdjYWxjKDEwMCUgLSAyMHB4KScsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAxMFxuICAgIH0sXG4gICAgeToge1xuICAgICAgd2lkdGg6IDEwLFxuICAgICAgaGVpZ2h0OiAnY2FsYygxMDAlIC0gMjBweCknLFxuICAgICAgdG9wOiAxMFxuICAgIH1cbiAgfSxcbiAgdGh1bWI6IHtcbiAgICBjb21tb246IHtcbiAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgYm9yZGVyUmFkaXVzOiA0LFxuICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMCwwLDAsLjQpJ1xuICAgIH0sXG4gICAgeDoge1xuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB3aWR0aDogMFxuICAgIH0sXG4gICAgeToge1xuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogMFxuICAgIH1cbiAgfVxufTtcblxudmFyIHBhZ2Vab29tTGV2ZWwgPSBpc0Jyb3dzZXIgPyB6b29tTGV2ZWwoKSA6IDE7XG5cbmlmIChpc0Jyb3dzZXIpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBwYWdlWm9vbUxldmVsID0gem9vbUxldmVsKCk7XG4gIH0sIHtcbiAgICBwYXNzaXZlOiB0cnVlXG4gIH0pO1xufVxuXG52YXIgU2Nyb2xsYmFyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBwYXJlbnRTY3JvbGxiYXI6IG51bGxcbn0pO1xuXG52YXIgU2Nyb2xsYmFyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKFNjcm9sbGJhciwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBTY3JvbGxiYXIocHJvcHMpIHtcbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgY3VycmVudCBzY3JvbGwtcmVsYXRlZCB2YWx1ZXMuPGJyLz5cclxuICAgICAqIElmIDxpPmZvcmNlPC9pPiBpZiB0cnV0aHkgLSB3aWxsIHJlY2FsY3VsYXRlIHRoZW0gaW5zdGVhZCBvZiByZXR1cm5pbmcgY2FjaGVkIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIFNjcm9sbFN0YXRlXHJcbiAgICAgKi9cblxuXG4gICAgX3RoaXMuZ2V0U2Nyb2xsU3RhdGUgPSBmdW5jdGlvbiAoZm9yY2UpIHtcbiAgICAgIGlmIChmb3JjZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGZvcmNlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5zY3JvbGxWYWx1ZXMgJiYgIWZvcmNlKSB7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbih7fSwgX3RoaXMuc2Nyb2xsVmFsdWVzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNjcm9sbFN0YXRlID0ge1xuICAgICAgICBjbGllbnRIZWlnaHQ6IDAsXG4gICAgICAgIGNsaWVudFdpZHRoOiAwLFxuICAgICAgICBjb250ZW50U2Nyb2xsSGVpZ2h0OiAwLFxuICAgICAgICBjb250ZW50U2Nyb2xsV2lkdGg6IDAsXG4gICAgICAgIHNjcm9sbEhlaWdodDogMCxcbiAgICAgICAgc2Nyb2xsV2lkdGg6IDAsXG4gICAgICAgIHNjcm9sbFRvcDogMCxcbiAgICAgICAgc2Nyb2xsTGVmdDogMCxcbiAgICAgICAgc2Nyb2xsWUJsb2NrZWQ6IGZhbHNlLFxuICAgICAgICBzY3JvbGxYQmxvY2tlZDogZmFsc2UsXG4gICAgICAgIHNjcm9sbFlQb3NzaWJsZTogZmFsc2UsXG4gICAgICAgIHNjcm9sbFhQb3NzaWJsZTogZmFsc2UsXG4gICAgICAgIHRyYWNrWVZpc2libGU6IGZhbHNlLFxuICAgICAgICB0cmFja1hWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgem9vbUxldmVsOiBwYWdlWm9vbUxldmVsICogMSxcbiAgICAgICAgaXNSVEw6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIHZhciBwcm9wcyA9IF90aGlzLnByb3BzO1xuICAgICAgc2Nyb2xsU3RhdGUuaXNSVEwgPSBfdGhpcy5zdGF0ZS5pc1JUTDtcbiAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbFlCbG9ja2VkID0gcHJvcHMubm9TY3JvbGwgfHwgcHJvcHMubm9TY3JvbGxZO1xuICAgICAgc2Nyb2xsU3RhdGUuc2Nyb2xsWEJsb2NrZWQgPSBwcm9wcy5ub1Njcm9sbCB8fCBwcm9wcy5ub1Njcm9sbFg7XG5cbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgc2Nyb2xsU3RhdGUuY2xpZW50SGVpZ2h0ID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgc2Nyb2xsU3RhdGUuY2xpZW50V2lkdGggPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbEhlaWdodCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbFdpZHRoID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxUb3AgPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxMZWZ0ID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbFlQb3NzaWJsZSA9ICFzY3JvbGxTdGF0ZS5zY3JvbGxZQmxvY2tlZCAmJiBzY3JvbGxTdGF0ZS5zY3JvbGxIZWlnaHQgPiBzY3JvbGxTdGF0ZS5jbGllbnRIZWlnaHQ7XG4gICAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbFhQb3NzaWJsZSA9ICFzY3JvbGxTdGF0ZS5zY3JvbGxYQmxvY2tlZCAmJiBzY3JvbGxTdGF0ZS5zY3JvbGxXaWR0aCA+IHNjcm9sbFN0YXRlLmNsaWVudFdpZHRoO1xuICAgICAgICBzY3JvbGxTdGF0ZS50cmFja1lWaXNpYmxlID0gc2Nyb2xsU3RhdGUuc2Nyb2xsWVBvc3NpYmxlIHx8IHByb3BzLnBlcm1hbmVudFRyYWNrcyB8fCBwcm9wcy5wZXJtYW5lbnRUcmFja1k7XG4gICAgICAgIHNjcm9sbFN0YXRlLnRyYWNrWFZpc2libGUgPSBzY3JvbGxTdGF0ZS5zY3JvbGxYUG9zc2libGUgfHwgcHJvcHMucGVybWFuZW50VHJhY2tzIHx8IHByb3BzLnBlcm1hbmVudFRyYWNrWDtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLmNvbnRlbnRFbGVtZW50KSB7XG4gICAgICAgIHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxIZWlnaHQgPSBfdGhpcy5jb250ZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxXaWR0aCA9IF90aGlzLmNvbnRlbnRFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2Nyb2xsU3RhdGU7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTY3JvbGwgdG8gdG9wIGJvcmRlclxyXG4gICAgICovXG5cblxuICAgIF90aGlzLnNjcm9sbFRvVG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2Nyb2xsIHRvIGxlZnQgYm9yZGVyXHJcbiAgICAgKi9cblxuXG4gICAgX3RoaXMuc2Nyb2xsVG9MZWZ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNjcm9sbCB0byBib3R0b20gYm9yZGVyXHJcbiAgICAgKi9cblxuXG4gICAgX3RoaXMuc2Nyb2xsVG9Cb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2Nyb2xsIHRvIHJpZ2h0IGJvcmRlclxyXG4gICAgICovXG5cblxuICAgIF90aGlzLnNjcm9sbFRvUmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFdpZHRoIC0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgdGhlIHNjcm9sbHMgYXQgZ2l2ZW4gY29vcmRpbmF0ZXMuPGJyLz5cclxuICAgICAqIElmIGNvb3JkaW5hdGUgaXMgdW5kZWZpbmVkIC0gY3VycmVudCBzY3JvbGwgdmFsdWUgd2lsbCBwZXJzaXN0LlxyXG4gICAgICovXG5cblxuICAgIF90aGlzLnNjcm9sbFRvID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGlzTnVtKHgpKSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IHg7XG4gICAgICAgIGlmIChpc051bSh5KSkgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IHk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENlbnRlciB0aGUgdmlld3BvcnQgYXQgZ2l2ZW4gY29vcmRpbmF0ZXMuPGJyLz5cclxuICAgICAqIElmIGNvb3JkaW5hdGUgaXMgdW5kZWZpbmVkIC0gY3VycmVudCBzY3JvbGwgdmFsdWUgd2lsbCBwZXJzaXN0LlxyXG4gICAgICovXG5cblxuICAgIF90aGlzLmNlbnRlckF0ID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGlzTnVtKHgpKSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IHggLSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuY2xpZW50V2lkdGggLyAyO1xuICAgICAgICBpZiAoaXNOdW0oeSkpIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSB5IC0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudEhlaWdodCAvIDI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuXG4gICAgX3RoaXMudXBkYXRlID0gZnVuY3Rpb24gKGZvcmNlKSB7XG4gICAgICBpZiAoZm9yY2UgPT09IHZvaWQgMCkge1xuICAgICAgICBmb3JjZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIGF1dG9kZXRlY3QgZGlyZWN0aW9uIGlmIG5vdCBkZWZpbmVkXG5cblxuICAgICAgaWYgKGlzVW5kZWYoX3RoaXMuc3RhdGUuaXNSVEwpKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc1JUTDogZ2V0Q29tcHV0ZWRTdHlsZShfdGhpcy5zY3JvbGxlckVsZW1lbnQpLmRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIF90aGlzLmdldFNjcm9sbFN0YXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzY3JvbGxTdGF0ZSA9IF90aGlzLmdldFNjcm9sbFN0YXRlKHRydWUpO1xuXG4gICAgICB2YXIgcHJldlNjcm9sbFN0YXRlID0gX19hc3NpZ24oe30sIF90aGlzLnNjcm9sbFZhbHVlcyk7XG5cbiAgICAgIHZhciBwcm9wcyA9IF90aGlzLnByb3BzO1xuICAgICAgdmFyIGJpdG1hc2sgPSAwO1xuXG4gICAgICBpZiAoIWZvcmNlKSB7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuY2xpZW50SGVpZ2h0ICE9PSBzY3JvbGxTdGF0ZS5jbGllbnRIZWlnaHQpIGJpdG1hc2sgfD0gTWF0aC50cnVuYygxKTtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5jbGllbnRXaWR0aCAhPT0gc2Nyb2xsU3RhdGUuY2xpZW50V2lkdGgpIGJpdG1hc2sgfD0gMSA8PCAxO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbEhlaWdodCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsSGVpZ2h0KSBiaXRtYXNrIHw9IDEgPDwgMjtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxXaWR0aCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsV2lkdGgpIGJpdG1hc2sgfD0gMSA8PCAzO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbFRvcCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsVG9wKSBiaXRtYXNrIHw9IDEgPDwgNDtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxMZWZ0ICE9PSBzY3JvbGxTdGF0ZS5zY3JvbGxMZWZ0KSBiaXRtYXNrIHw9IDEgPDwgNTtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxZQmxvY2tlZCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsWUJsb2NrZWQpIGJpdG1hc2sgfD0gMSA8PCA2O1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbFhCbG9ja2VkICE9PSBzY3JvbGxTdGF0ZS5zY3JvbGxYQmxvY2tlZCkgYml0bWFzayB8PSAxIDw8IDc7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWVBvc3NpYmxlICE9PSBzY3JvbGxTdGF0ZS5zY3JvbGxZUG9zc2libGUpIGJpdG1hc2sgfD0gMSA8PCA4O1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbFhQb3NzaWJsZSAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsWFBvc3NpYmxlKSBiaXRtYXNrIHw9IDEgPDwgOTtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS50cmFja1lWaXNpYmxlICE9PSBzY3JvbGxTdGF0ZS50cmFja1lWaXNpYmxlKSBiaXRtYXNrIHw9IDEgPDwgMTA7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUudHJhY2tYVmlzaWJsZSAhPT0gc2Nyb2xsU3RhdGUudHJhY2tYVmlzaWJsZSkgYml0bWFzayB8PSAxIDw8IDExO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLmlzUlRMICE9PSBzY3JvbGxTdGF0ZS5pc1JUTCkgYml0bWFzayB8PSAxIDw8IDEyO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxIZWlnaHQgIT09IHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxIZWlnaHQpIGJpdG1hc2sgfD0gMSA8PCAxMztcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsV2lkdGggIT09IHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxXaWR0aCkgYml0bWFzayB8PSAxIDw8IDE0O1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnpvb21MZXZlbCAhPT0gc2Nyb2xsU3RhdGUuem9vbUxldmVsKSBiaXRtYXNrIHw9IDEgPDwgMTU7IC8vIGlmIG5vdCBmb3JjZWQgYW5kIG5vdGhpbmcgaGFzIGNoYW5nZWQgLSBza2lwIHRoaXMgdXBkYXRlXG5cbiAgICAgICAgaWYgKGJpdG1hc2sgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcHJldlNjcm9sbFN0YXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaXRtYXNrID0gMzI3Njc7XG4gICAgICB9XG5cbiAgICAgIGlmICghcHJvcHMubmF0aXZlICYmIF90aGlzLmhvbGRlckVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGJpdG1hc2sgJiAxIDw8IDEzICYmIChwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVlUb0hvbGRlcikpIHtcbiAgICAgICAgICBfdGhpcy5ob2xkZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9IFwiXCIuY29uY2F0KHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxIZWlnaHQsIFwicHhcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYml0bWFzayAmIDEgPDwgMTQgJiYgKHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWFRvSG9sZGVyKSkge1xuICAgICAgICAgIF90aGlzLmhvbGRlckVsZW1lbnQuc3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdChzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsV2lkdGgsIFwicHhcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVzVG9Ib2xkZXIgfHwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVZVG9Ib2xkZXIgfHwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVYVG9Ib2xkZXIpIHtcbiAgICAgICAgICBpZiAoIXNjcm9sbFN0YXRlLmNsaWVudEhlaWdodCAmJiBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsSGVpZ2h0IHx8ICFzY3JvbGxTdGF0ZS5jbGllbnRXaWR0aCAmJiBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsV2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy8gaWYgc2Nyb2xsYmFycyB2aXNpYmlsaXR5IGhhcyBjaGFuZ2VkXG5cblxuICAgICAgaWYgKGJpdG1hc2sgJiAxIDw8IDEwIHx8IGJpdG1hc2sgJiAxIDw8IDExKSB7XG4gICAgICAgIHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxZQmxvY2tlZCA9IHNjcm9sbFN0YXRlLnNjcm9sbFlCbG9ja2VkO1xuICAgICAgICBwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWEJsb2NrZWQgPSBzY3JvbGxTdGF0ZS5zY3JvbGxYQmxvY2tlZDtcbiAgICAgICAgcHJldlNjcm9sbFN0YXRlLnNjcm9sbFlQb3NzaWJsZSA9IHNjcm9sbFN0YXRlLnNjcm9sbFlQb3NzaWJsZTtcbiAgICAgICAgcHJldlNjcm9sbFN0YXRlLnNjcm9sbFhQb3NzaWJsZSA9IHNjcm9sbFN0YXRlLnNjcm9sbFhQb3NzaWJsZTtcblxuICAgICAgICBpZiAoX3RoaXMudHJhY2tZRWxlbWVudCAmJiBiaXRtYXNrICYgMSA8PCAxMCkge1xuICAgICAgICAgIF90aGlzLnRyYWNrWUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHNjcm9sbFN0YXRlLnRyYWNrWVZpc2libGUgPyAnJyA6ICdub25lJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpcy50cmFja1hFbGVtZW50ICYmIGJpdG1hc2sgJiAxIDw8IDExKSB7XG4gICAgICAgICAgX3RoaXMudHJhY2tYRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gc2Nyb2xsU3RhdGUudHJhY2tYVmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMuc2Nyb2xsVmFsdWVzID0gcHJldlNjcm9sbFN0YXRlO1xuXG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICB0cmFja1lWaXNpYmxlOiBfdGhpcy5zY3JvbGxWYWx1ZXMudHJhY2tZVmlzaWJsZSA9IHNjcm9sbFN0YXRlLnRyYWNrWVZpc2libGUsXG4gICAgICAgICAgdHJhY2tYVmlzaWJsZTogX3RoaXMuc2Nyb2xsVmFsdWVzLnRyYWNrWFZpc2libGUgPSBzY3JvbGxTdGF0ZS50cmFja1hWaXNpYmxlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgKHByb3BzLm5hdGl2ZSA/IF90aGlzLnVwZGF0ZXJOYXRpdmUgOiBfdGhpcy51cGRhdGVyQ3VzdG9tKShiaXRtYXNrLCBzY3JvbGxTdGF0ZSk7XG4gICAgICBfdGhpcy5zY3JvbGxWYWx1ZXMgPSBzY3JvbGxTdGF0ZTtcblxuICAgICAgaWYgKCFwcm9wcy5uYXRpdmUgJiYgYml0bWFzayAmIDEgPDwgMTUpIHtcbiAgICAgICAgZ2V0U2Nyb2xsYmFyV2lkdGgodHJ1ZSk7XG5cbiAgICAgICAgX3RoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZXZlbnRFbWl0dGVyLmVtaXQoJ3VwZGF0ZScsIF9fYXNzaWduKHt9LCBzY3JvbGxTdGF0ZSksIHByZXZTY3JvbGxTdGF0ZSk7XG5cbiAgICAgIGlmIChiaXRtYXNrICYgMSA8PCA0IHx8IGJpdG1hc2sgJiAxIDw8IDUpIF90aGlzLmV2ZW50RW1pdHRlci5lbWl0KCdzY3JvbGwnLCBfX2Fzc2lnbih7fSwgc2Nyb2xsU3RhdGUpLCBwcmV2U2Nyb2xsU3RhdGUpO1xuICAgICAgcmV0dXJuIF90aGlzLnNjcm9sbFZhbHVlcztcbiAgICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuXG5cbiAgICBfdGhpcy51cGRhdGVyTmF0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8ganVzdCBmb3IgZnV0dXJlXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgX3RoaXMudXBkYXRlckN1c3RvbSA9IGZ1bmN0aW9uIChiaXRtYXNrLCBzY3JvbGxWYWx1ZXMpIHtcbiAgICAgIHZhciBwcm9wcyA9IF90aGlzLnByb3BzO1xuXG4gICAgICBpZiAoX3RoaXMudHJhY2tZRWxlbWVudCkge1xuICAgICAgICBpZiAoX3RoaXMudGh1bWJZRWxlbWVudCAmJiAoYml0bWFzayAmIE1hdGgudHJ1bmMoMSkgfHwgYml0bWFzayAmIDEgPDwgMiB8fCBiaXRtYXNrICYgMSA8PCA0IHx8IGJpdG1hc2sgJiAxIDw8IDYgfHwgYml0bWFzayAmIDEgPDwgOCkpIHtcbiAgICAgICAgICBpZiAoc2Nyb2xsVmFsdWVzLnNjcm9sbFlQb3NzaWJsZSkge1xuICAgICAgICAgICAgdmFyIHRyYWNrSW5uZXJTaXplID0gZ2V0SW5uZXJIZWlnaHQoX3RoaXMudHJhY2tZRWxlbWVudCk7XG4gICAgICAgICAgICB2YXIgdGh1bWJTaXplID0gY2FsY1RodW1iU2l6ZShzY3JvbGxWYWx1ZXMuc2Nyb2xsSGVpZ2h0LCBzY3JvbGxWYWx1ZXMuY2xpZW50SGVpZ2h0LCB0cmFja0lubmVyU2l6ZSwgcHJvcHMubWluaW1hbFRodW1iWVNpemUgfHwgcHJvcHMubWluaW1hbFRodW1iU2l6ZSwgcHJvcHMubWF4aW1hbFRodW1iWVNpemUgfHwgcHJvcHMubWF4aW1hbFRodW1iU2l6ZSk7XG4gICAgICAgICAgICB2YXIgdGh1bWJPZmZzZXQgPSBjYWxjVGh1bWJPZmZzZXQoc2Nyb2xsVmFsdWVzLnNjcm9sbEhlaWdodCwgc2Nyb2xsVmFsdWVzLmNsaWVudEhlaWdodCwgdHJhY2tJbm5lclNpemUsIHRodW1iU2l6ZSwgc2Nyb2xsVmFsdWVzLnNjcm9sbFRvcCk7XG4gICAgICAgICAgICBfdGhpcy50aHVtYllFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IFwidHJhbnNsYXRlWShcIi5jb25jYXQodGh1bWJPZmZzZXQsIFwicHgpXCIpO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJZRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIlwiLmNvbmNhdCh0aHVtYlNpemUsIFwicHhcIik7XG4gICAgICAgICAgICBfdGhpcy50aHVtYllFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMudGh1bWJZRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgICAgICAgICAgIF90aGlzLnRodW1iWUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICBfdGhpcy50aHVtYllFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy50cmFja1hFbGVtZW50KSB7XG4gICAgICAgIGlmIChfdGhpcy50aHVtYlhFbGVtZW50ICYmIChiaXRtYXNrICYgMSA8PCAxIHx8IGJpdG1hc2sgJiAxIDw8IDMgfHwgYml0bWFzayAmIDEgPDwgNSB8fCBiaXRtYXNrICYgMSA8PCA3IHx8IGJpdG1hc2sgJiAxIDw8IDkgfHwgYml0bWFzayAmIDEgPDwgMTIpKSB7XG4gICAgICAgICAgaWYgKHNjcm9sbFZhbHVlcy5zY3JvbGxYUG9zc2libGUpIHtcbiAgICAgICAgICAgIHZhciB0cmFja0lubmVyU2l6ZSA9IGdldElubmVyV2lkdGgoX3RoaXMudHJhY2tYRWxlbWVudCk7XG4gICAgICAgICAgICB2YXIgdGh1bWJTaXplID0gY2FsY1RodW1iU2l6ZShzY3JvbGxWYWx1ZXMuc2Nyb2xsV2lkdGgsIHNjcm9sbFZhbHVlcy5jbGllbnRXaWR0aCwgdHJhY2tJbm5lclNpemUsIHByb3BzLm1pbmltYWxUaHVtYlhTaXplIHx8IHByb3BzLm1pbmltYWxUaHVtYlNpemUsIHByb3BzLm1heGltYWxUaHVtYlhTaXplIHx8IHByb3BzLm1heGltYWxUaHVtYlNpemUpO1xuICAgICAgICAgICAgdmFyIHRodW1iT2Zmc2V0ID0gY2FsY1RodW1iT2Zmc2V0KHNjcm9sbFZhbHVlcy5zY3JvbGxXaWR0aCwgc2Nyb2xsVmFsdWVzLmNsaWVudFdpZHRoLCB0cmFja0lubmVyU2l6ZSwgdGh1bWJTaXplLCBzY3JvbGxWYWx1ZXMuc2Nyb2xsTGVmdCk7XG5cbiAgICAgICAgICAgIGlmIChfdGhpcy5zdGF0ZS5pc1JUTCAmJiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsKCkpIHtcbiAgICAgICAgICAgICAgdGh1bWJPZmZzZXQgKz0gdHJhY2tJbm5lclNpemUgLSB0aHVtYlNpemU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF90aGlzLnRodW1iWEVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGVYKFwiLmNvbmNhdCh0aHVtYk9mZnNldCwgXCJweClcIik7XG4gICAgICAgICAgICBfdGhpcy50aHVtYlhFbGVtZW50LnN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQodGh1bWJTaXplLCBcInB4XCIpO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJYRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLnRodW1iWEVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgICAgICBfdGhpcy50aHVtYlhFbGVtZW50LnN0eWxlLndpZHRoID0gJzBweCc7XG4gICAgICAgICAgICBfdGhpcy50aHVtYlhFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmSG9sZGVyID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMuaG9sZGVyRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZldyYXBwZXIgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy53cmFwcGVyRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLndyYXBwZXJQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy53cmFwcGVyUHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmU2Nyb2xsZXIgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy5zY3JvbGxlclByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnNjcm9sbGVyUHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmQ29udGVudCA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLmNvbnRlbnRFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMuY29udGVudFByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLmNvbnRlbnRQcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZUcmFja1ggPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy50cmFja1hFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMudHJhY2tYUHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudHJhY2tYUHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmVHJhY2tZID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMudHJhY2tZRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLnRyYWNrWVByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRyYWNrWVByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZlRodW1iWCA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLnRodW1iWEVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy50aHVtYlhQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy50aHVtYlhQcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZUaHVtYlkgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy50aHVtYllFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMudGh1bWJZUHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudGh1bWJZUHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmFja1hDbGljayA9IGZ1bmN0aW9uIChldiwgdmFsdWVzKSB7XG4gICAgICBpZiAoX3RoaXMucHJvcHMudHJhY2tYUHJvcHMub25DbGljaykge1xuICAgICAgICBfdGhpcy5wcm9wcy50cmFja1hQcm9wcy5vbkNsaWNrKGV2LCB2YWx1ZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV90aGlzLnNjcm9sbGVyRWxlbWVudCB8fCAhX3RoaXMudHJhY2tYRWxlbWVudCB8fCAhX3RoaXMudGh1bWJYRWxlbWVudCB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzIHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuXG4gICAgICB2YXIgdGh1bWJTaXplID0gX3RoaXMudGh1bWJYRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIHZhciB0cmFja0lubmVyU2l6ZSA9IGdldElubmVyV2lkdGgoX3RoaXMudHJhY2tYRWxlbWVudCk7XG4gICAgICB2YXIgdGh1bWJPZmZzZXQgPSAoX3RoaXMuc2Nyb2xsVmFsdWVzLmlzUlRMICYmIHNob3VsZFJldmVyc2VSdGxTY3JvbGwoKSA/IHZhbHVlcy5vZmZzZXQgKyB0aHVtYlNpemUgLyAyIC0gdHJhY2tJbm5lclNpemUgOiB2YWx1ZXMub2Zmc2V0IC0gdGh1bWJTaXplIC8gMikgLSAoTnVtYmVyLnBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShfdGhpcy50cmFja1hFbGVtZW50KS5wYWRkaW5nTGVmdCkgfHwgMCk7XG4gICAgICB2YXIgdGFyZ2V0ID0gY2FsY1Njcm9sbEZvclRodW1iT2Zmc2V0KF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxXaWR0aCwgX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudFdpZHRoLCB0cmFja0lubmVyU2l6ZSwgdGh1bWJTaXplLCB0aHVtYk9mZnNldCk7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy50cmFja0NsaWNrQmVoYXZpb3IgPT09IFRSQUNLX0NMSUNLX0JFSEFWSU9SLlNURVApIHtcbiAgICAgICAgdGFyZ2V0ID0gKF90aGlzLnNjcm9sbFZhbHVlcy5pc1JUTCA/IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxMZWZ0ID4gdGFyZ2V0IDogX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbExlZnQgPCB0YXJnZXQpID8gX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbExlZnQgKyBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50V2lkdGggOiBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsTGVmdCAtIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRXaWR0aDtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSB0YXJnZXQ7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRyYWNrWUNsaWNrID0gZnVuY3Rpb24gKGV2LCB2YWx1ZXMpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy50cmFja1lQcm9wcy5vbkNsaWNrKSBfdGhpcy5wcm9wcy50cmFja1lQcm9wcy5vbkNsaWNrKGV2LCB2YWx1ZXMpO1xuXG4gICAgICBpZiAoIV90aGlzLnNjcm9sbGVyRWxlbWVudCB8fCAhX3RoaXMudHJhY2tZRWxlbWVudCB8fCAhX3RoaXMudGh1bWJZRWxlbWVudCB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzIHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsWVBvc3NpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuXG4gICAgICB2YXIgdGh1bWJTaXplID0gX3RoaXMudGh1bWJZRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB2YXIgdGFyZ2V0ID0gY2FsY1Njcm9sbEZvclRodW1iT2Zmc2V0KF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxIZWlnaHQsIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRIZWlnaHQsIGdldElubmVySGVpZ2h0KF90aGlzLnRyYWNrWUVsZW1lbnQpLCB0aHVtYlNpemUsIHZhbHVlcy5vZmZzZXQgLSB0aHVtYlNpemUgLyAyKSAtIChOdW1iZXIucGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKF90aGlzLnRyYWNrWUVsZW1lbnQpLnBhZGRpbmdUb3ApIHx8IDApO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMudHJhY2tDbGlja0JlaGF2aW9yID09PSBUUkFDS19DTElDS19CRUhBVklPUi5KVU1QKSB7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSB0YXJnZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFRvcCA8IHRhcmdldCA/IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxUb3AgKyBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50SGVpZ2h0IDogX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFRvcCAtIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRyYWNrWU1vdXNlV2hlZWwgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgIHZhciBwcm9wcyA9IF90aGlzLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMudHJhY2tZUHJvcHMgJiYgcHJvcHMudHJhY2tZUHJvcHMub25XaGVlbCkge1xuICAgICAgICBwcm9wcy50cmFja1lQcm9wcy5vbldoZWVsKGV2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmRpc2FibGVUcmFja3NNb3VzZXdoZWVsU2Nyb2xsaW5nIHx8IHByb3BzLmRpc2FibGVUcmFja1lNb3VzZXdoZWVsU2Nyb2xsaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuXG4gICAgICBpZiAoIV90aGlzLnNjcm9sbGVyRWxlbWVudCB8fCBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsWUJsb2NrZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zY3JvbGxUb3AgKz0gZXYuZGVsdGFZO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmFja1hNb3VzZVdoZWVsID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICB2YXIgcHJvcHMgPSBfdGhpcy5wcm9wcztcblxuICAgICAgaWYgKHByb3BzLnRyYWNrWFByb3BzICYmIHByb3BzLnRyYWNrWFByb3BzLm9uV2hlZWwpIHtcbiAgICAgICAgcHJvcHMudHJhY2tYUHJvcHMub25XaGVlbChldik7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5kaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZyB8fCBwcm9wcy5kaXNhYmxlVHJhY2tYTW91c2V3aGVlbFNjcm9sbGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFhCbG9ja2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2Nyb2xsTGVmdCArPSBldi5kZWx0YVg7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRodW1iWERyYWcgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBpZiAoIV90aGlzLnRyYWNrWEVsZW1lbnQgfHwgIV90aGlzLnRodW1iWEVsZW1lbnQgfHwgIV90aGlzLnNjcm9sbGVyRWxlbWVudCB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzIHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuXG4gICAgICB2YXIgdHJhY2tSZWN0ID0gX3RoaXMudHJhY2tYRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgdmFyIHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoX3RoaXMudHJhY2tYRWxlbWVudCk7XG4gICAgICB2YXIgcGFkZGluZ0xlZnQgPSBOdW1iZXIucGFyc2VGbG9hdChzdHlsZXMucGFkZGluZ0xlZnQpIHx8IDA7XG4gICAgICB2YXIgcGFkZGluZ1JpZ2h0ID0gTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdSaWdodCkgfHwgMDtcbiAgICAgIHZhciB0cmFja0lubmVyU2l6ZSA9IHRyYWNrUmVjdC53aWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0O1xuICAgICAgdmFyIHRodW1iU2l6ZSA9IF90aGlzLnRodW1iWEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICB2YXIgb2Zmc2V0ID0gX3RoaXMuc2Nyb2xsVmFsdWVzLmlzUlRMICYmIHNob3VsZFJldmVyc2VSdGxTY3JvbGwoKSA/IGRhdGEueCArIHRodW1iU2l6ZSAtIHRyYWNrSW5uZXJTaXplICsgcGFkZGluZ0xlZnQgOiBkYXRhLmxhc3RYIC0gcGFkZGluZ0xlZnQ7XG4gICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IGNhbGNTY3JvbGxGb3JUaHVtYk9mZnNldChfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsV2lkdGgsIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRXaWR0aCwgdHJhY2tJbm5lclNpemUsIHRodW1iU2l6ZSwgb2Zmc2V0KTtcblxuICAgICAgaWYgKChfYSA9IF90aGlzLnByb3BzLnRodW1iWFByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25EcmFnKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRodW1iWFByb3BzLm9uRHJhZyhkYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVGh1bWJYRHJhZ0VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICB2YXIgX2E7XG5cbiAgICAgIF90aGlzLmhhbmRsZVRodW1iWERyYWcoZGF0YSk7XG5cbiAgICAgIGlmICgoX2EgPSBfdGhpcy5wcm9wcy50aHVtYlhQcm9wcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uRHJhZ0VuZCkge1xuICAgICAgICBfdGhpcy5wcm9wcy50aHVtYlhQcm9wcy5vbkRyYWdFbmQoZGF0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRodW1iWURyYWcgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBpZiAoIV90aGlzLnNjcm9sbGVyRWxlbWVudCB8fCAhX3RoaXMudHJhY2tZRWxlbWVudCB8fCAhX3RoaXMudGh1bWJZRWxlbWVudCB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzIHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsWVBvc3NpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuXG4gICAgICB2YXIgdHJhY2tSZWN0ID0gX3RoaXMudHJhY2tZRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgdmFyIHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoX3RoaXMudHJhY2tZRWxlbWVudCk7XG4gICAgICB2YXIgcGFkZGluZ1RvcCA9IE51bWJlci5wYXJzZUZsb2F0KHN0eWxlcy5wYWRkaW5nVG9wKSB8fCAwO1xuICAgICAgdmFyIHBhZGRpbmdCb3R0b20gPSBOdW1iZXIucGFyc2VGbG9hdChzdHlsZXMucGFkZGluZ0JvdHRvbSkgfHwgMDtcbiAgICAgIHZhciB0cmFja0lubmVyU2l6ZSA9IHRyYWNrUmVjdC5oZWlnaHQgLSBwYWRkaW5nVG9wIC0gcGFkZGluZ0JvdHRvbTtcbiAgICAgIHZhciB0aHVtYlNpemUgPSBfdGhpcy50aHVtYllFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIHZhciBvZmZzZXQgPSBkYXRhLnkgLSBwYWRkaW5nVG9wO1xuICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IGNhbGNTY3JvbGxGb3JUaHVtYk9mZnNldChfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsSGVpZ2h0LCBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50SGVpZ2h0LCB0cmFja0lubmVyU2l6ZSwgdGh1bWJTaXplLCBvZmZzZXQpO1xuXG4gICAgICBpZiAoKF9hID0gX3RoaXMucHJvcHMudGh1bWJZUHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkRyYWcpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudGh1bWJZUHJvcHMub25EcmFnKGRhdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUaHVtYllEcmFnRW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgX3RoaXMuaGFuZGxlVGh1bWJZRHJhZyhkYXRhKTtcblxuICAgICAgaWYgKChfYSA9IF90aGlzLnByb3BzLnRodW1iWVByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25EcmFnRW5kKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRodW1iWVByb3BzLm9uRHJhZ0VuZChkYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlU2Nyb2xsZXJTY3JvbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uKCk7XG4gICAgfTtcblxuICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLl9zY3JvbGxEZXRlY3Rpb25UTykge1xuICAgICAgICBfdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCgnc2Nyb2xsU3RhcnQnLCBfdGhpcy5nZXRTY3JvbGxTdGF0ZSgpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNCcm93c2VyKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoX3RoaXMuX3Njcm9sbERldGVjdGlvblRPKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvblRPID0gaXNCcm93c2VyID8gd2luZG93LnNldFRpbWVvdXQoX3RoaXMuX3Njcm9sbERldGVjdGlvbkNhbGxiYWNrLCBfdGhpcy5wcm9wcy5zY3JvbGxEZXRlY3Rpb25UaHJlc2hvbGQgfHwgMCkgOiBudWxsO1xuICAgIH07XG5cbiAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uVE8gPSBudWxsO1xuXG4gICAgICBfdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCgnc2Nyb2xsU3RvcCcsIF90aGlzLmdldFNjcm9sbFN0YXRlKCkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHRyYWNrWFZpc2libGU6IGZhbHNlLFxuICAgICAgdHJhY2tZVmlzaWJsZTogZmFsc2UsXG4gICAgICBpc1JUTDogcHJvcHMucnRsXG4gICAgfTtcbiAgICBfdGhpcy5zY3JvbGxWYWx1ZXMgPSBfdGhpcy5nZXRTY3JvbGxTdGF0ZSh0cnVlKTtcbiAgICBfdGhpcy5ldmVudEVtaXR0ZXIgPSBuZXcgRW1pdHRyKDE1KTtcbiAgICBpZiAocHJvcHMub25VcGRhdGUpIF90aGlzLmV2ZW50RW1pdHRlci5vbigndXBkYXRlJywgcHJvcHMub25VcGRhdGUpO1xuICAgIGlmIChwcm9wcy5vblNjcm9sbCkgX3RoaXMuZXZlbnRFbWl0dGVyLm9uKCdzY3JvbGwnLCBwcm9wcy5vblNjcm9sbCk7XG4gICAgaWYgKHByb3BzLm9uU2Nyb2xsU3RhcnQpIF90aGlzLmV2ZW50RW1pdHRlci5vbignc2Nyb2xsU3RhcnQnLCBwcm9wcy5vblNjcm9sbFN0YXJ0KTtcbiAgICBpZiAocHJvcHMub25TY3JvbGxTdG9wKSBfdGhpcy5ldmVudEVtaXR0ZXIub24oJ3Njcm9sbFN0b3AnLCBwcm9wcy5vblNjcm9sbFN0b3ApO1xuICAgIF90aGlzLmlkID0gdXVpZCgpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTY3JvbGxiYXIucHJvdG90eXBlLCBcInNjcm9sbFRvcFwiLCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3NvcnQtY29tcFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodG9wKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gdG9wO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJzY3JvbGxMZWZ0XCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChsZWZ0KSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgICB9XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTY3JvbGxiYXIucHJvdG90eXBlLCBcInNjcm9sbEhlaWdodFwiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTY3JvbGxiYXIucHJvdG90eXBlLCBcInNjcm9sbFdpZHRoXCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJjbGllbnRIZWlnaHRcIiwge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJjbGllbnRXaWR0aFwiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3NvcnQtY29tcFxuXG4gIFNjcm9sbGJhci5jYWxjdWxhdGVTdHlsZXMgPSBmdW5jdGlvbiAocHJvcHMsIHN0YXRlLCBzY3JvbGxWYWx1ZXMsIHNjcm9sbGJhcldpZHRoKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuXG4gICAgdmFyIHVzZURlZmF1bHRTdHlsZXMgPSAhcHJvcHMubm9EZWZhdWx0U3R5bGVzO1xuICAgIHJldHVybiB7XG4gICAgICBob2xkZXI6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLmhvbGRlciksIHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgICAgIH0pLCBwcm9wcy5zdHlsZSksXG4gICAgICB3cmFwcGVyOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGUud3JhcHBlciksICFwcm9wcy5kaXNhYmxlVHJhY2tzV2lkdGhDb21wZW5zYXRpb24gJiYgIXByb3BzLmRpc2FibGVUcmFja1lXaWR0aENvbXBlbnNhdGlvbiAmJiAoX2EgPSB7fSwgX2Fbc3RhdGUuaXNSVEwgPyAnbGVmdCcgOiAncmlnaHQnXSA9IHN0YXRlLnRyYWNrWVZpc2libGUgPyAxMCA6IDAsIF9hKSksICFwcm9wcy5kaXNhYmxlVHJhY2tzV2lkdGhDb21wZW5zYXRpb24gJiYgIXByb3BzLmRpc2FibGVUcmFja1hXaWR0aENvbXBlbnNhdGlvbiAmJiB7XG4gICAgICAgIGJvdHRvbTogc3RhdGUudHJhY2tYVmlzaWJsZSA/IDEwIDogMFxuICAgICAgfSkpLCBwcm9wcy53cmFwcGVyUHJvcHMuc3R5bGUpLCB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgICAgIH0pLFxuICAgICAgY29udGVudDogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUuY29udGVudCksIHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWVRvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWFRvSG9sZGVyID8ge1xuICAgICAgICBkaXNwbGF5OiAndGFibGUtY2VsbCdcbiAgICAgIH0gOiB7XG4gICAgICAgIHBhZGRpbmc6IDAuMDUgLy8gbmVlZGVkIHRvIGRpc2FibGUgbWFyZ2luIGNvbGxhcHNpbmcgd2l0aG91dCBmbGV4Ym94ZXMsIG90aGVyIHBvc3NpYmxlIHNvbHV0aW9ucyBoZXJlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTcxODYzNC9ob3ctdG8tZGlzYWJsZS1tYXJnaW4tY29sbGFwc2luZ1xuXG4gICAgICB9KSwgdXNlRGVmYXVsdFN0eWxlcyAmJiAhKHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWVRvSG9sZGVyKSAmJiB7XG4gICAgICAgIG1pbkhlaWdodDogJzEwMCUnXG4gICAgICB9KSwgdXNlRGVmYXVsdFN0eWxlcyAmJiAhKHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWFRvSG9sZGVyKSAmJiB7XG4gICAgICAgIG1pbldpZHRoOiAnMTAwJSdcbiAgICAgIH0pLCBwcm9wcy5jb250ZW50UHJvcHMuc3R5bGUpLFxuICAgICAgc2Nyb2xsZXI6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKChfYiA9IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgcGFkZGluZ0JvdHRvbTogIXNjcm9sbGJhcldpZHRoICYmIHNjcm9sbFZhbHVlcy5zY3JvbGxYUG9zc2libGUgPyBwcm9wcy5mYWxsYmFja1Njcm9sbGJhcldpZHRoIDogdW5kZWZpbmVkXG4gICAgICB9LCBfYltzdGF0ZS5pc1JUTCA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0J10gPSAhc2Nyb2xsYmFyV2lkdGggJiYgc2Nyb2xsVmFsdWVzLnNjcm9sbFlQb3NzaWJsZSA/IHByb3BzLmZhbGxiYWNrU2Nyb2xsYmFyV2lkdGggOiB1bmRlZmluZWQsIF9iKSwgcHJvcHMuc2Nyb2xsZXJQcm9wcy5zdHlsZSksICFpc1VuZGVmKHByb3BzLnJ0bCkgJiYge1xuICAgICAgICBkaXJlY3Rpb246IHByb3BzLnJ0bCA/ICdydGwnIDogJ2x0cidcbiAgICAgIH0pLCBwcm9wcy5tb21lbnR1bSAmJiB7XG4gICAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAndG91Y2gnXG4gICAgICB9KSwgKF9jID0ge1xuICAgICAgICBvdmVyZmxvd1k6IHNjcm9sbFZhbHVlcy5zY3JvbGxZUG9zc2libGUgPyAnc2Nyb2xsJyA6ICdoaWRkZW4nLFxuICAgICAgICBvdmVyZmxvd1g6IHNjcm9sbFZhbHVlcy5zY3JvbGxYUG9zc2libGUgPyAnc2Nyb2xsJyA6ICdoaWRkZW4nLFxuICAgICAgICBtYXJnaW5Cb3R0b206IHNjcm9sbFZhbHVlcy5zY3JvbGxYUG9zc2libGUgPyAtKHNjcm9sbGJhcldpZHRoIHx8IHByb3BzLmZhbGxiYWNrU2Nyb2xsYmFyV2lkdGgpIC0gTnVtYmVyKHNjcm9sbFZhbHVlcy56b29tTGV2ZWwgIT09IDEpIDogdW5kZWZpbmVkXG4gICAgICB9LCBfY1tzdGF0ZS5pc1JUTCA/ICdtYXJnaW5MZWZ0JyA6ICdtYXJnaW5SaWdodCddID0gc2Nyb2xsVmFsdWVzLnNjcm9sbFlQb3NzaWJsZSA/IC0oc2Nyb2xsYmFyV2lkdGggfHwgcHJvcHMuZmFsbGJhY2tTY3JvbGxiYXJXaWR0aCkgLSBOdW1iZXIoc2Nyb2xsVmFsdWVzLnpvb21MZXZlbCAhPT0gMSkgOiB1bmRlZmluZWQsIF9jKSksXG4gICAgICB0cmFja1g6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRyYWNrLmNvbW1vbiksIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudHJhY2sueCksIHByb3BzLnRyYWNrWFByb3BzLnN0eWxlKSwgIXN0YXRlLnRyYWNrWFZpc2libGUgJiYge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgIH0pLFxuICAgICAgdHJhY2tZOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50cmFjay5jb21tb24pLCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRyYWNrLnkpLCB1c2VEZWZhdWx0U3R5bGVzICYmIChfZCA9IHt9LCBfZFtzdGF0ZS5pc1JUTCA/ICdsZWZ0JyA6ICdyaWdodCddID0gMCwgX2QpKSwgcHJvcHMudHJhY2tZUHJvcHMuc3R5bGUpLCAhc3RhdGUudHJhY2tZVmlzaWJsZSAmJiB7XG4gICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgfSksXG4gICAgICB0aHVtYlg6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRodW1iLmNvbW1vbiksIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudGh1bWIueCksIHByb3BzLnRodW1iWFByb3BzLnN0eWxlKSxcbiAgICAgIHRodW1iWTogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudGh1bWIuY29tbW9uKSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50aHVtYi55KSwgcHJvcHMudGh1bWJZUHJvcHMuc3R5bGUpXG4gICAgfTtcbiAgfTtcblxuICBTY3JvbGxiYXIucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzY3JvbGxlciBlbGVtZW50IHdhcyBub3QgY3JlYXRlZC4gUG9zc2libHkgeW91IGhhdmVuJ3QgcHJvdmlkZWQgSFRNTERpdkVsZW1lbnQgdG8gcmVuZGVyZXIncyBgZWxlbWVudFJlZmAgZnVuY3Rpb24uXCIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbnRlbnRFbGVtZW50KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29udGVudCBlbGVtZW50IHdhcyBub3QgY3JlYXRlZC4gUG9zc2libHkgeW91IGhhdmVuJ3QgcHJvdmlkZWQgSFRNTERpdkVsZW1lbnQgdG8gcmVuZGVyZXIncyBgZWxlbWVudFJlZmAgZnVuY3Rpb24uXCIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcblxuICAgIGlmICghcHJvcHMubmF0aXZlICYmICFwcm9wcy5tb2JpbGVOYXRpdmUpIHtcbiAgICAgIC8vIFRvRG86IG1vdmUgbmF0aXZlIHN0YXRlIHRvIHRoZSBzdGF0ZSBzbyBpdCBjYW4gYmUgc3luY2hyb25pemVkXG4gICAgICBpZiAoIXRoaXMuaG9sZGVyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJob2xkZXIgZWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLndyYXBwZXJFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIndyYXBwZXIgZWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBMb29wLmFkZFRhcmdldCh0aGlzKTtcblxuICAgIGlmICghaXNVbmRlZihwcm9wcy5zY3JvbGxUb3ApKSB7XG4gICAgICB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSBwcm9wcy5zY3JvbGxUb3A7XG4gICAgfVxuXG4gICAgaWYgKCFpc1VuZGVmKHByb3BzLnNjcm9sbExlZnQpKSB7XG4gICAgICB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0gcHJvcHMuc2Nyb2xsTGVmdDtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcbiAgfTtcblxuICBTY3JvbGxiYXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIExvb3AucmVtb3ZlVGFyZ2V0KHRoaXMpO1xuICB9O1xuXG4gIFNjcm9sbGJhci5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgaWYgKCF0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAocHJvcHMucnRsICE9PSBwcmV2UHJvcHMucnRsICYmIHByb3BzLnJ0bCAhPT0gdGhpcy5zdGF0ZS5pc1JUTCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzUlRMOiBwcm9wcy5ydGxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLmlzUlRMICE9PSBwcmV2U3RhdGUuaXNSVEwpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1VuZGVmKHByb3BzLnNjcm9sbFRvcCkgJiYgcHJvcHMuc2Nyb2xsVG9wICE9PSB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3ApIHtcbiAgICAgIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IHByb3BzLnNjcm9sbFRvcDtcbiAgICB9XG5cbiAgICBpZiAoIWlzVW5kZWYocHJvcHMuc2Nyb2xsTGVmdCkgJiYgcHJvcHMuc2Nyb2xsTGVmdCAhPT0gdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCkge1xuICAgICAgdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IHByb3BzLnNjcm9sbExlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5vblVwZGF0ZSAhPT0gcHJvcHMub25VcGRhdGUpIHtcbiAgICAgIGlmIChwcmV2UHJvcHMub25VcGRhdGUpIHRoaXMuZXZlbnRFbWl0dGVyLm9mZigndXBkYXRlJywgcHJldlByb3BzLm9uVXBkYXRlKTtcbiAgICAgIGlmIChwcm9wcy5vblVwZGF0ZSkgdGhpcy5ldmVudEVtaXR0ZXIub24oJ3VwZGF0ZScsIHByb3BzLm9uVXBkYXRlKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLm9uU2Nyb2xsICE9PSBwcm9wcy5vblNjcm9sbCkge1xuICAgICAgaWYgKHByZXZQcm9wcy5vblNjcm9sbCkgdGhpcy5ldmVudEVtaXR0ZXIub2ZmKCdzY3JvbGwnLCBwcmV2UHJvcHMub25TY3JvbGwpO1xuICAgICAgaWYgKHByb3BzLm9uU2Nyb2xsKSB0aGlzLmV2ZW50RW1pdHRlci5vbignc2Nyb2xsJywgcHJvcHMub25TY3JvbGwpO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMub25TY3JvbGxTdGFydCAhPT0gcHJvcHMub25TY3JvbGxTdGFydCkge1xuICAgICAgaWYgKHByZXZQcm9wcy5vblNjcm9sbFN0YXJ0KSB0aGlzLmV2ZW50RW1pdHRlci5vZmYoJ3Njcm9sbFN0YXJ0JywgcHJldlByb3BzLm9uU2Nyb2xsU3RhcnQpO1xuICAgICAgaWYgKHByb3BzLm9uU2Nyb2xsU3RhcnQpIHRoaXMuZXZlbnRFbWl0dGVyLm9uKCdzY3JvbGxTdGFydCcsIHByb3BzLm9uU2Nyb2xsU3RhcnQpO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMub25TY3JvbGxTdG9wICE9PSBwcm9wcy5vblNjcm9sbFN0b3ApIHtcbiAgICAgIGlmIChwcmV2UHJvcHMub25TY3JvbGxTdG9wKSB0aGlzLmV2ZW50RW1pdHRlci5vZmYoJ3Njcm9sbFN0b3AnLCBwcmV2UHJvcHMub25TY3JvbGxTdG9wKTtcbiAgICAgIGlmIChwcm9wcy5vblNjcm9sbFN0b3ApIHRoaXMuZXZlbnRFbWl0dGVyLm9uKCdzY3JvbGxTdG9wJywgcHJvcHMub25TY3JvbGxTdG9wKTtcbiAgICB9XG4gIH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9zb3J0LWNvbXBcblxuXG4gIFNjcm9sbGJhci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNyZWF0ZUNvbnRleHQgPSBfYS5jcmVhdGVDb250ZXh0LFxuICAgICAgICBydGwgPSBfYS5ydGwsXG4gICAgICAgIG5hdGl2ZSA9IF9hLm5hdGl2ZSxcbiAgICAgICAgbW9iaWxlTmF0aXZlID0gX2EubW9iaWxlTmF0aXZlLFxuICAgICAgICBtb21lbnR1bSA9IF9hLm1vbWVudHVtO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eubm9EZWZhdWx0U3R5bGVzO1xuICAgICAgICB2YXIgZGlzYWJsZVRyYWNrc01vdXNld2hlZWxTY3JvbGxpbmcgPSBfYS5kaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZyxcbiAgICAgICAgZGlzYWJsZVRyYWNrWE1vdXNld2hlZWxTY3JvbGxpbmcgPSBfYS5kaXNhYmxlVHJhY2tYTW91c2V3aGVlbFNjcm9sbGluZyxcbiAgICAgICAgZGlzYWJsZVRyYWNrWU1vdXNld2hlZWxTY3JvbGxpbmcgPSBfYS5kaXNhYmxlVHJhY2tZTW91c2V3aGVlbFNjcm9sbGluZztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmRpc2FibGVUcmFja3NXaWR0aENvbXBlbnNhdGlvbjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmRpc2FibGVUcmFja1hXaWR0aENvbXBlbnNhdGlvbjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmRpc2FibGVUcmFja1lXaWR0aENvbXBlbnNhdGlvbjtcbiAgICAgICAgdmFyIG5vU2Nyb2xsWCA9IF9hLm5vU2Nyb2xsWCxcbiAgICAgICAgbm9TY3JvbGxZID0gX2Eubm9TY3JvbGxZLFxuICAgICAgICBub1Njcm9sbCA9IF9hLm5vU2Nyb2xsLFxuICAgICAgICBwZXJtYW5lbnRUcmFja1ggPSBfYS5wZXJtYW5lbnRUcmFja1gsXG4gICAgICAgIHBlcm1hbmVudFRyYWNrWSA9IF9hLnBlcm1hbmVudFRyYWNrWSxcbiAgICAgICAgcGVybWFuZW50VHJhY2tzID0gX2EucGVybWFuZW50VHJhY2tzLFxuICAgICAgICByZW1vdmVUcmFja3NXaGVuTm90VXNlZCA9IF9hLnJlbW92ZVRyYWNrc1doZW5Ob3RVc2VkLFxuICAgICAgICByZW1vdmVUcmFja1lXaGVuTm90VXNlZCA9IF9hLnJlbW92ZVRyYWNrWVdoZW5Ob3RVc2VkLFxuICAgICAgICByZW1vdmVUcmFja1hXaGVuTm90VXNlZCA9IF9hLnJlbW92ZVRyYWNrWFdoZW5Ob3RVc2VkO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EubWluaW1hbFRodW1iU2l6ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm1heGltYWxUaHVtYlNpemU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5taW5pbWFsVGh1bWJYU2l6ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm1heGltYWxUaHVtYlhTaXplO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EubWluaW1hbFRodW1iWVNpemU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5tYXhpbWFsVGh1bWJZU2l6ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmZhbGxiYWNrU2Nyb2xsYmFyV2lkdGg7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5zY3JvbGxUb3A7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5zY3JvbGxMZWZ0O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EudHJhY2tDbGlja0JlaGF2aW9yO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Euc2Nyb2xsRGV0ZWN0aW9uVGhyZXNob2xkO1xuICAgICAgICB2YXIgcHJvcHNXcmFwcGVyUHJvcHMgPSBfYS53cmFwcGVyUHJvcHMsXG4gICAgICAgIHByb3BzU2Nyb2xsZXJQcm9wcyA9IF9hLnNjcm9sbGVyUHJvcHMsXG4gICAgICAgIHByb3BzQ29udGVudFByb3BzID0gX2EuY29udGVudFByb3BzLFxuICAgICAgICBwcm9wc1RyYWNrWFByb3BzID0gX2EudHJhY2tYUHJvcHMsXG4gICAgICAgIHByb3BzVHJhY2tZUHJvcHMgPSBfYS50cmFja1lQcm9wcyxcbiAgICAgICAgcHJvcHNUaHVtYlhQcm9wcyA9IF9hLnRodW1iWFByb3BzLFxuICAgICAgICBwcm9wc1RodW1iWVByb3BzID0gX2EudGh1bWJZUHJvcHMsXG4gICAgICAgIHByb3BzU2Nyb2xsYmFyV2lkdGggPSBfYS5zY3JvbGxiYXJXaWR0aDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmVsZW1lbnRSZWY7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vblVwZGF0ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uU2Nyb2xsO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eub25TY3JvbGxTdGFydDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uU2Nyb2xsU3RvcDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EudHJhbnNsYXRlQ29udGVudFNpemVZVG9Ib2xkZXI7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS50cmFuc2xhdGVDb250ZW50U2l6ZVhUb0hvbGRlcjtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzSG9sZGVyUHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNyZWF0ZUNvbnRleHRcIiwgXCJydGxcIiwgXCJuYXRpdmVcIiwgXCJtb2JpbGVOYXRpdmVcIiwgXCJtb21lbnR1bVwiLCBcIm5vRGVmYXVsdFN0eWxlc1wiLCBcImRpc2FibGVUcmFja3NNb3VzZXdoZWVsU2Nyb2xsaW5nXCIsIFwiZGlzYWJsZVRyYWNrWE1vdXNld2hlZWxTY3JvbGxpbmdcIiwgXCJkaXNhYmxlVHJhY2tZTW91c2V3aGVlbFNjcm9sbGluZ1wiLCBcImRpc2FibGVUcmFja3NXaWR0aENvbXBlbnNhdGlvblwiLCBcImRpc2FibGVUcmFja1hXaWR0aENvbXBlbnNhdGlvblwiLCBcImRpc2FibGVUcmFja1lXaWR0aENvbXBlbnNhdGlvblwiLCBcIm5vU2Nyb2xsWFwiLCBcIm5vU2Nyb2xsWVwiLCBcIm5vU2Nyb2xsXCIsIFwicGVybWFuZW50VHJhY2tYXCIsIFwicGVybWFuZW50VHJhY2tZXCIsIFwicGVybWFuZW50VHJhY2tzXCIsIFwicmVtb3ZlVHJhY2tzV2hlbk5vdFVzZWRcIiwgXCJyZW1vdmVUcmFja1lXaGVuTm90VXNlZFwiLCBcInJlbW92ZVRyYWNrWFdoZW5Ob3RVc2VkXCIsIFwibWluaW1hbFRodW1iU2l6ZVwiLCBcIm1heGltYWxUaHVtYlNpemVcIiwgXCJtaW5pbWFsVGh1bWJYU2l6ZVwiLCBcIm1heGltYWxUaHVtYlhTaXplXCIsIFwibWluaW1hbFRodW1iWVNpemVcIiwgXCJtYXhpbWFsVGh1bWJZU2l6ZVwiLCBcImZhbGxiYWNrU2Nyb2xsYmFyV2lkdGhcIiwgXCJzY3JvbGxUb3BcIiwgXCJzY3JvbGxMZWZ0XCIsIFwidHJhY2tDbGlja0JlaGF2aW9yXCIsIFwic2Nyb2xsRGV0ZWN0aW9uVGhyZXNob2xkXCIsIFwid3JhcHBlclByb3BzXCIsIFwic2Nyb2xsZXJQcm9wc1wiLCBcImNvbnRlbnRQcm9wc1wiLCBcInRyYWNrWFByb3BzXCIsIFwidHJhY2tZUHJvcHNcIiwgXCJ0aHVtYlhQcm9wc1wiLCBcInRodW1iWVByb3BzXCIsIFwic2Nyb2xsYmFyV2lkdGhcIiwgXCJlbGVtZW50UmVmXCIsIFwib25VcGRhdGVcIiwgXCJvblNjcm9sbFwiLCBcIm9uU2Nyb2xsU3RhcnRcIiwgXCJvblNjcm9sbFN0b3BcIiwgXCJ0cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlclwiLCBcInRyYW5zbGF0ZUNvbnRlbnRTaXplWVRvSG9sZGVyXCIsIFwidHJhbnNsYXRlQ29udGVudFNpemVYVG9Ib2xkZXJcIiwgXCJjaGlsZHJlblwiXSk7XG5cbiAgICB2YXIgc2Nyb2xsYmFyV2lkdGggPSAhaXNVbmRlZihwcm9wc1Njcm9sbGJhcldpZHRoKSA/IHByb3BzU2Nyb2xsYmFyV2lkdGggOiBnZXRTY3JvbGxiYXJXaWR0aCgpIHx8IDA7XG5cbiAgICBpZiAobmF0aXZlIHx8ICFzY3JvbGxiYXJXaWR0aCAmJiBtb2JpbGVOYXRpdmUpIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZkhvbGRlcihudWxsKTtcbiAgICAgIHRoaXMuZWxlbWVudFJlZldyYXBwZXIobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUcmFja1gobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUcmFja1kobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUaHVtYlgobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUaHVtYlkobnVsbCk7XG5cbiAgICAgIHZhciBjb250ZW50UHJvcHNfMSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc0NvbnRlbnRQcm9wcyksIHtcbiAgICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1Db250ZW50JyxcbiAgICAgICAgY2xhc3NOYW1lOiBjbmIoJ1Njcm9sbGJhcnNDdXN0b20tQ29udGVudCcsIHByb3BzQ29udGVudFByb3BzLmNsYXNzTmFtZSksXG4gICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgfSk7XG5cbiAgICAgIHZhciBzY3JvbGxlclByb3BzXzEgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNIb2xkZXJQcm9wcyksIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbmIoJ1Njcm9sbGJhcnNDdXN0b20gbmF0aXZlJywgdGhpcy5zdGF0ZS50cmFja1lWaXNpYmxlICYmICd0cmFja1lWaXNpYmxlJywgdGhpcy5zdGF0ZS50cmFja1hWaXNpYmxlICYmICd0cmFja1hWaXNpYmxlJywgdGhpcy5zdGF0ZS5pc1JUTCAmJiAncnRsJywgcHJvcHNIb2xkZXJQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzSG9sZGVyUHJvcHMuc3R5bGUpLCAhaXNVbmRlZihydGwpICYmIHtcbiAgICAgICAgICBkaXJlY3Rpb246IHJ0bCA/ICdydGwnIDogJ2x0cidcbiAgICAgICAgfSksIG1vbWVudHVtICYmIHtcbiAgICAgICAgICBXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogJ3RvdWNoJ1xuICAgICAgICB9KSwge1xuICAgICAgICAgIG92ZXJmbG93WDogbm9TY3JvbGwgfHwgbm9TY3JvbGxYID8gJ2hpZGRlbicgOiBwZXJtYW5lbnRUcmFja3MgfHwgcGVybWFuZW50VHJhY2tYID8gJ3Njcm9sbCcgOiAnYXV0bycsXG4gICAgICAgICAgb3ZlcmZsb3dZOiBub1Njcm9sbCB8fCBub1Njcm9sbFkgPyAnaGlkZGVuJyA6IHBlcm1hbmVudFRyYWNrcyB8fCBwZXJtYW5lbnRUcmFja1kgPyAnc2Nyb2xsJyA6ICdhdXRvJ1xuICAgICAgICB9KSxcbiAgICAgICAgb25TY3JvbGw6IHRoaXMuaGFuZGxlU2Nyb2xsZXJTY3JvbGwsXG4gICAgICAgIGNoaWxkcmVuOiByZW5kZXJEaXZXaXRoUmVuZGVyZXIoY29udGVudFByb3BzXzEsIHRoaXMuZWxlbWVudFJlZkNvbnRlbnQpLFxuICAgICAgICByZW5kZXJlcjogcHJvcHNTY3JvbGxlclByb3BzLnJlbmRlcmVyLFxuICAgICAgICBlbGVtZW50UmVmOiBwcm9wc1Njcm9sbGVyUHJvcHMuZWxlbWVudFJlZlxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZW5kZXJEaXZXaXRoUmVuZGVyZXIoc2Nyb2xsZXJQcm9wc18xLCB0aGlzLmVsZW1lbnRSZWZTY3JvbGxlcik7XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlcyA9IFNjcm9sbGJhci5jYWxjdWxhdGVTdHlsZXModGhpcy5wcm9wcywgdGhpcy5zdGF0ZSwgdGhpcy5zY3JvbGxWYWx1ZXMsIHNjcm9sbGJhcldpZHRoKTtcbiAgICB2YXIgaG9sZGVyQ2hpbGRyZW4gPSBbXTtcblxuICAgIHZhciBjb250ZW50UHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNDb250ZW50UHJvcHMpLCB7XG4gICAgICBrZXk6ICdTY3JvbGxiYXJzQ3VzdG9tLUNvbnRlbnQnLFxuICAgICAgY2xhc3NOYW1lOiBjbmIoJ1Njcm9sbGJhcnNDdXN0b20tQ29udGVudCcsIHByb3BzQ29udGVudFByb3BzLmNsYXNzTmFtZSksXG4gICAgICBzdHlsZTogc3R5bGVzLmNvbnRlbnQsXG4gICAgICBjaGlsZHJlbjogY3JlYXRlQ29udGV4dCA/IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9qc3gtbm8tY29uc3RydWN0ZWQtY29udGV4dC12YWx1ZXNcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsYmFyQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHBhcmVudFNjcm9sbGJhcjogdGhpc1xuICAgICAgICB9XG4gICAgICB9LCBjaGlsZHJlbikgOiBjaGlsZHJlblxuICAgIH0pO1xuXG4gICAgdmFyIHNjcm9sbGVyUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNTY3JvbGxlclByb3BzKSwge1xuICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1TY3JvbGxlcicsXG4gICAgICBjbGFzc05hbWU6IGNuYignU2Nyb2xsYmFyc0N1c3RvbS1TY3JvbGxlcicsIHByb3BzU2Nyb2xsZXJQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHN0eWxlcy5zY3JvbGxlcixcbiAgICAgIGNoaWxkcmVuOiByZW5kZXJEaXZXaXRoUmVuZGVyZXIoY29udGVudFByb3BzLCB0aGlzLmVsZW1lbnRSZWZDb250ZW50KSxcbiAgICAgIG9uU2Nyb2xsOiB0aGlzLmhhbmRsZVNjcm9sbGVyU2Nyb2xsXG4gICAgfSk7XG5cbiAgICB2YXIgd3JhcHBlclByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzV3JhcHBlclByb3BzKSwge1xuICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1XcmFwcGVyJyxcbiAgICAgIGNsYXNzTmFtZTogY25iKCdTY3JvbGxiYXJzQ3VzdG9tLVdyYXBwZXInLCBwcm9wc1dyYXBwZXJQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHN0eWxlcy53cmFwcGVyLFxuICAgICAgY2hpbGRyZW46IHJlbmRlckRpdldpdGhSZW5kZXJlcihzY3JvbGxlclByb3BzLCB0aGlzLmVsZW1lbnRSZWZTY3JvbGxlcilcbiAgICB9KTtcblxuICAgIGhvbGRlckNoaWxkcmVuLnB1c2gocmVuZGVyRGl2V2l0aFJlbmRlcmVyKHdyYXBwZXJQcm9wcywgdGhpcy5lbGVtZW50UmVmV3JhcHBlcikpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUudHJhY2tZVmlzaWJsZSB8fCAhcmVtb3ZlVHJhY2tzV2hlbk5vdFVzZWQgJiYgIXJlbW92ZVRyYWNrWVdoZW5Ob3RVc2VkKSB7XG4gICAgICB2YXIgdGh1bWJZUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNUaHVtYllQcm9wcyksIHtcbiAgICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1UaHVtYlknLFxuICAgICAgICBzdHlsZTogc3R5bGVzLnRodW1iWSxcbiAgICAgICAgZWxlbWVudFJlZjogdGhpcy5lbGVtZW50UmVmVGh1bWJZLFxuICAgICAgICBvbkRyYWc6IHRoaXMuaGFuZGxlVGh1bWJZRHJhZyxcbiAgICAgICAgb25EcmFnRW5kOiB0aGlzLmhhbmRsZVRodW1iWURyYWdFbmQsXG4gICAgICAgIGF4aXM6IEFYSVNfRElSRUNUSU9OLllcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgdHJhY2tZUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNUcmFja1lQcm9wcyksIHtcbiAgICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1knLFxuICAgICAgICBzdHlsZTogc3R5bGVzLnRyYWNrWSxcbiAgICAgICAgZWxlbWVudFJlZjogdGhpcy5lbGVtZW50UmVmVHJhY2tZLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZVRyYWNrWUNsaWNrXG4gICAgICB9KSwgKGRpc2FibGVUcmFja3NNb3VzZXdoZWVsU2Nyb2xsaW5nIHx8IGRpc2FibGVUcmFja1lNb3VzZXdoZWVsU2Nyb2xsaW5nKSAmJiB7XG4gICAgICAgIG9uV2hlZWw6IHRoaXMuaGFuZGxlVHJhY2tZTW91c2VXaGVlbFxuICAgICAgfSksIHtcbiAgICAgICAgYXhpczogQVhJU19ESVJFQ1RJT04uWVxuICAgICAgfSk7XG5cbiAgICAgIHRyYWNrWVByb3BzLmNoaWxkcmVuID0gUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxiYXJUaHVtYiwgX19hc3NpZ24oe30sIHRodW1iWVByb3BzKSk7XG4gICAgICBob2xkZXJDaGlsZHJlbi5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsYmFyVHJhY2ssIF9fYXNzaWduKHt9LCB0cmFja1lQcm9wcykpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50UmVmVHJhY2tZKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmVGh1bWJZKG51bGwpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLnRyYWNrWFZpc2libGUgfHwgIXJlbW92ZVRyYWNrc1doZW5Ob3RVc2VkICYmICFyZW1vdmVUcmFja1hXaGVuTm90VXNlZCkge1xuICAgICAgdmFyIHRodW1iWFByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzVGh1bWJYUHJvcHMpLCB7XG4gICAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tVGh1bWJYJyxcbiAgICAgICAgc3R5bGU6IHN0eWxlcy50aHVtYlgsXG4gICAgICAgIGVsZW1lbnRSZWY6IHRoaXMuZWxlbWVudFJlZlRodW1iWCxcbiAgICAgICAgb25EcmFnOiB0aGlzLmhhbmRsZVRodW1iWERyYWcsXG4gICAgICAgIG9uRHJhZ0VuZDogdGhpcy5oYW5kbGVUaHVtYlhEcmFnRW5kLFxuICAgICAgICBheGlzOiBBWElTX0RJUkVDVElPTi5YXG4gICAgICB9KTtcblxuICAgICAgdmFyIHRyYWNrWFByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzVHJhY2tYUHJvcHMpLCB7XG4gICAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tVHJhY2tYJyxcbiAgICAgICAgc3R5bGU6IHN0eWxlcy50cmFja1gsXG4gICAgICAgIGVsZW1lbnRSZWY6IHRoaXMuZWxlbWVudFJlZlRyYWNrWCxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVUcmFja1hDbGlja1xuICAgICAgfSksIChkaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZyB8fCBkaXNhYmxlVHJhY2tYTW91c2V3aGVlbFNjcm9sbGluZykgJiYge1xuICAgICAgICBvbldoZWVsOiB0aGlzLmhhbmRsZVRyYWNrWE1vdXNlV2hlZWxcbiAgICAgIH0pLCB7XG4gICAgICAgIGF4aXM6IEFYSVNfRElSRUNUSU9OLlhcbiAgICAgIH0pO1xuXG4gICAgICB0cmFja1hQcm9wcy5jaGlsZHJlbiA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsYmFyVGh1bWIsIF9fYXNzaWduKHt9LCB0aHVtYlhQcm9wcykpO1xuICAgICAgaG9sZGVyQ2hpbGRyZW4ucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGJhclRyYWNrLCBfX2Fzc2lnbih7fSwgdHJhY2tYUHJvcHMpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRyYWNrWChudWxsKTtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRodW1iWChudWxsKTtcbiAgICB9XG5cbiAgICB2YXIgaG9sZGVyUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNIb2xkZXJQcm9wcyksIHtcbiAgICAgIGNsYXNzTmFtZTogY25iKCdTY3JvbGxiYXJzQ3VzdG9tJywgdGhpcy5zdGF0ZS50cmFja1lWaXNpYmxlICYmICd0cmFja1lWaXNpYmxlJywgdGhpcy5zdGF0ZS50cmFja1hWaXNpYmxlICYmICd0cmFja1hWaXNpYmxlJywgdGhpcy5zdGF0ZS5pc1JUTCAmJiAncnRsJywgcHJvcHNIb2xkZXJQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHN0eWxlcy5ob2xkZXIsXG4gICAgICBjaGlsZHJlbjogaG9sZGVyQ2hpbGRyZW5cbiAgICB9KTtcblxuICAgIHJldHVybiByZW5kZXJEaXZXaXRoUmVuZGVyZXIoaG9sZGVyUHJvcHMsIHRoaXMuZWxlbWVudFJlZkhvbGRlcik7XG4gIH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9zdGF0aWMtcHJvcGVydHktcGxhY2VtZW50XG5cblxuICBTY3JvbGxiYXIuY29udGV4dFR5cGUgPSBTY3JvbGxiYXJDb250ZXh0OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvc3RhdGljLXByb3BlcnR5LXBsYWNlbWVudFxuXG4gIFNjcm9sbGJhci5kZWZhdWx0UHJvcHMgPSB7XG4gICAgbW9tZW50dW06IHRydWUsXG4gICAgbWluaW1hbFRodW1iU2l6ZTogMzAsXG4gICAgZmFsbGJhY2tTY3JvbGxiYXJXaWR0aDogMjAsXG4gICAgdHJhY2tDbGlja0JlaGF2aW9yOiBUUkFDS19DTElDS19CRUhBVklPUi5KVU1QLFxuICAgIHNjcm9sbERldGVjdGlvblRocmVzaG9sZDogMTAwLFxuICAgIHdyYXBwZXJQcm9wczoge30sXG4gICAgc2Nyb2xsZXJQcm9wczoge30sXG4gICAgY29udGVudFByb3BzOiB7fSxcbiAgICB0cmFja1hQcm9wczoge30sXG4gICAgdHJhY2tZUHJvcHM6IHt9LFxuICAgIHRodW1iWFByb3BzOiB7fSxcbiAgICB0aHVtYllQcm9wczoge31cbiAgfTtcbiAgcmV0dXJuIFNjcm9sbGJhcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0IHsgU2Nyb2xsYmFyLCBTY3JvbGxiYXJDb250ZXh0LCBTY3JvbGxiYXIgYXMgZGVmYXVsdCB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBSZWFjdF9fZGVmYXVsdCA9IF9pbnRlcm9wRGVmYXVsdChSZWFjdCk7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuZnVuY3Rpb24gd2l0aFNpZGVFZmZlY3QocmVkdWNlUHJvcHNUb1N0YXRlLCBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50LCBtYXBTdGF0ZU9uU2VydmVyKSB7XG4gIGlmICh0eXBlb2YgcmVkdWNlUHJvcHNUb1N0YXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZWR1Y2VQcm9wc1RvU3RhdGUgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtYXBTdGF0ZU9uU2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbWFwU3RhdGVPblNlcnZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbWFwU3RhdGVPblNlcnZlciB0byBlaXRoZXIgYmUgdW5kZWZpbmVkIG9yIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIGlmICh0eXBlb2YgV3JhcHBlZENvbXBvbmVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBXcmFwcGVkQ29tcG9uZW50IHRvIGJlIGEgUmVhY3QgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIHZhciBtb3VudGVkSW5zdGFuY2VzID0gW107XG4gICAgdmFyIHN0YXRlO1xuXG4gICAgZnVuY3Rpb24gZW1pdENoYW5nZSgpIHtcbiAgICAgIHN0YXRlID0gcmVkdWNlUHJvcHNUb1N0YXRlKG1vdW50ZWRJbnN0YW5jZXMubWFwKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UucHJvcHM7XG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChTaWRlRWZmZWN0LmNhblVzZURPTSkge1xuICAgICAgICBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50KHN0YXRlKTtcbiAgICAgIH0gZWxzZSBpZiAobWFwU3RhdGVPblNlcnZlcikge1xuICAgICAgICBzdGF0ZSA9IG1hcFN0YXRlT25TZXJ2ZXIoc3RhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBTaWRlRWZmZWN0ID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gICAgICBfaW5oZXJpdHNMb29zZShTaWRlRWZmZWN0LCBfUHVyZUNvbXBvbmVudCk7XG5cbiAgICAgIGZ1bmN0aW9uIFNpZGVFZmZlY3QoKSB7XG4gICAgICAgIHJldHVybiBfUHVyZUNvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyeSB0byB1c2UgZGlzcGxheU5hbWUgb2Ygd3JhcHBlZCBjb21wb25lbnRcbiAgICAgIC8vIEV4cG9zZSBjYW5Vc2VET00gc28gdGVzdHMgY2FuIG1vbmtleXBhdGNoIGl0XG4gICAgICBTaWRlRWZmZWN0LnBlZWsgPSBmdW5jdGlvbiBwZWVrKCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9O1xuXG4gICAgICBTaWRlRWZmZWN0LnJld2luZCA9IGZ1bmN0aW9uIHJld2luZCgpIHtcbiAgICAgICAgaWYgKFNpZGVFZmZlY3QuY2FuVXNlRE9NKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbWF5IG9ubHkgY2FsbCByZXdpbmQoKSBvbiB0aGUgc2VydmVyLiBDYWxsIHBlZWsoKSB0byByZWFkIHRoZSBjdXJyZW50IHN0YXRlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlY29yZGVkU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIG1vdW50ZWRJbnN0YW5jZXMgPSBbXTtcbiAgICAgICAgcmV0dXJuIHJlY29yZGVkU3RhdGU7XG4gICAgICB9O1xuXG4gICAgICB2YXIgX3Byb3RvID0gU2lkZUVmZmVjdC5wcm90b3R5cGU7XG5cbiAgICAgIF9wcm90by5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID0gZnVuY3Rpb24gVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgICAgbW91bnRlZEluc3RhbmNlcy5wdXNoKHRoaXMpO1xuICAgICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gbW91bnRlZEluc3RhbmNlcy5pbmRleE9mKHRoaXMpO1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIHRoaXMucHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFNpZGVFZmZlY3Q7XG4gICAgfShSZWFjdC5QdXJlQ29tcG9uZW50KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShTaWRlRWZmZWN0LCBcImRpc3BsYXlOYW1lXCIsIFwiU2lkZUVmZmVjdChcIiArIGdldERpc3BsYXlOYW1lKFdyYXBwZWRDb21wb25lbnQpICsgXCIpXCIpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KFNpZGVFZmZlY3QsIFwiY2FuVXNlRE9NXCIsIGNhblVzZURPTSk7XG5cbiAgICByZXR1cm4gU2lkZUVmZmVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3aXRoU2lkZUVmZmVjdDtcbiIsIiFmdW5jdGlvbihlLHQpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQocmVxdWlyZShcInByb3AtdHlwZXNcIikscmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJzaWduYXR1cmVfcGFkXCIpLHJlcXVpcmUoXCJ0cmltLWNhbnZhc1wiKSk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJwcm9wLXR5cGVzXCIsXCJyZWFjdFwiLFwic2lnbmF0dXJlX3BhZFwiLFwidHJpbS1jYW52YXNcIl0sdCk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5TaWduYXR1cmVDYW52YXM9dChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSxyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcInNpZ25hdHVyZV9wYWRcIikscmVxdWlyZShcInRyaW0tY2FudmFzXCIpKTplLlNpZ25hdHVyZUNhbnZhcz10KGVbXCJwcm9wLXR5cGVzXCJdLGUucmVhY3QsZS5zaWduYXR1cmVfcGFkLGVbXCJ0cmltLWNhbnZhc1wiXSl9KHRoaXMsZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBhPW5bcl09e2V4cG9ydHM6e30saWQ6cixsb2FkZWQ6ITF9O3JldHVybiBlW3JdLmNhbGwoYS5leHBvcnRzLGEsYS5leHBvcnRzLHQpLGEubG9hZGVkPSEwLGEuZXhwb3J0c312YXIgbj17fTtyZXR1cm4gdC5tPWUsdC5jPW4sdC5wPVwiXCIsdCgwKX0oW2Z1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX1mdW5jdGlvbiBhKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpdC5pbmRleE9mKHIpPj0wfHxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKG5bcl09ZVtyXSk7cmV0dXJuIG59ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4hdHx8XCJvYmplY3RcIiE9dHlwZW9mIHQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIHUoZSx0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksZj1uKDEpLHA9cihmKSxsPW4oMiksZD1yKGwpLHY9bigzKSxoPXIodiksXz1uKDQpLGc9cihfKSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgZSxuLHIsdTtvKHRoaXMsdCk7Zm9yKHZhciBzPWFyZ3VtZW50cy5sZW5ndGgsYz1BcnJheShzKSxmPTA7ZjxzO2YrKyljW2ZdPWFyZ3VtZW50c1tmXTtyZXR1cm4gbj1yPWkodGhpcywoZT10Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsLmFwcGx5KGUsW3RoaXNdLmNvbmNhdChjKSkpLHIuX3NpZ1BhZD1udWxsLHIuX2V4Y2x1ZGVPdXJQcm9wcz1mdW5jdGlvbigpe3ZhciBlPXIucHJvcHMsdD0oZS5jYW52YXNQcm9wcyxlLmNsZWFyT25SZXNpemUsYShlLFtcImNhbnZhc1Byb3BzXCIsXCJjbGVhck9uUmVzaXplXCJdKSk7cmV0dXJuIHR9LHIuZ2V0Q2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX2NhbnZhc30sci5nZXRUcmltbWVkQ2FudmFzPWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtyZXR1cm4gZS53aWR0aD1yLl9jYW52YXMud2lkdGgsZS5oZWlnaHQ9ci5fY2FudmFzLmhlaWdodCxlLmdldENvbnRleHQoXCIyZFwiKS5kcmF3SW1hZ2Uoci5fY2FudmFzLDAsMCksKDAsZy5kZWZhdWx0KShlKX0sci5nZXRTaWduYXR1cmVQYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gci5fc2lnUGFkfSxyLl9jaGVja0NsZWFyT25SZXNpemU9ZnVuY3Rpb24oKXtyLnByb3BzLmNsZWFyT25SZXNpemUmJnIuX3Jlc2l6ZUNhbnZhcygpfSxyLl9yZXNpemVDYW52YXM9ZnVuY3Rpb24oKXt2YXIgZT1yLnByb3BzLmNhbnZhc1Byb3BzfHx7fSx0PWUud2lkdGgsbj1lLmhlaWdodDtpZighdHx8IW4pe3ZhciBhPXIuX2NhbnZhcyxvPU1hdGgubWF4KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxLDEpO3R8fChhLndpZHRoPWEub2Zmc2V0V2lkdGgqbyksbnx8KGEuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0Km8pLGEuZ2V0Q29udGV4dChcIjJkXCIpLnNjYWxlKG8sbyksci5jbGVhcigpfX0sci5vbj1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHIuX2NoZWNrQ2xlYXJPblJlc2l6ZSksci5fc2lnUGFkLm9uKCl9LHIub2ZmPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsci5fY2hlY2tDbGVhck9uUmVzaXplKSxyLl9zaWdQYWQub2ZmKCl9LHIuY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gci5fc2lnUGFkLmNsZWFyKCl9LHIuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiByLl9zaWdQYWQuaXNFbXB0eSgpfSxyLmZyb21EYXRhVVJMPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuX3NpZ1BhZC5mcm9tRGF0YVVSTChlLHQpfSxyLnRvRGF0YVVSTD1mdW5jdGlvbihlLHQpe3JldHVybiByLl9zaWdQYWQudG9EYXRhVVJMKGUsdCl9LHIuZnJvbURhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuX3NpZ1BhZC5mcm9tRGF0YShlKX0sci50b0RhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gci5fc2lnUGFkLnRvRGF0YSgpfSx1PW4saShyLHUpfXJldHVybiB1KHQsZSksYyh0LFt7a2V5OlwiY29tcG9uZW50RGlkTW91bnRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX3NpZ1BhZD1uZXcgaC5kZWZhdWx0KHRoaXMuX2NhbnZhcyx0aGlzLl9leGNsdWRlT3VyUHJvcHMoKSksdGhpcy5fcmVzaXplQ2FudmFzKCksdGhpcy5vbigpfX0se2tleTpcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm9mZigpfX0se2tleTpcImNvbXBvbmVudERpZFVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7T2JqZWN0LmFzc2lnbih0aGlzLl9zaWdQYWQsdGhpcy5fZXhjbHVkZU91clByb3BzKCkpfX0se2tleTpcInJlbmRlclwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMucHJvcHMuY2FudmFzUHJvcHM7cmV0dXJuIGQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIscyh7cmVmOmZ1bmN0aW9uKHQpe2UuX2NhbnZhcz10fX0sdCkpfX1dKSx0fShsLkNvbXBvbmVudCk7bS5wcm9wVHlwZXM9e3ZlbG9jaXR5RmlsdGVyV2VpZ2h0OnAuZGVmYXVsdC5udW1iZXIsbWluV2lkdGg6cC5kZWZhdWx0Lm51bWJlcixtYXhXaWR0aDpwLmRlZmF1bHQubnVtYmVyLG1pbkRpc3RhbmNlOnAuZGVmYXVsdC5udW1iZXIsZG90U2l6ZTpwLmRlZmF1bHQub25lT2ZUeXBlKFtwLmRlZmF1bHQubnVtYmVyLHAuZGVmYXVsdC5mdW5jXSkscGVuQ29sb3I6cC5kZWZhdWx0LnN0cmluZyx0aHJvdHRsZTpwLmRlZmF1bHQubnVtYmVyLG9uRW5kOnAuZGVmYXVsdC5mdW5jLG9uQmVnaW46cC5kZWZhdWx0LmZ1bmMsY2FudmFzUHJvcHM6cC5kZWZhdWx0Lm9iamVjdCxjbGVhck9uUmVzaXplOnAuZGVmYXVsdC5ib29sfSxtLmRlZmF1bHRQcm9wcz17Y2xlYXJPblJlc2l6ZTohMH0sdC5kZWZhdWx0PW19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LGZ1bmN0aW9uKGUsbil7ZS5leHBvcnRzPXR9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPW59LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXJ9XSl9KTsiLCJpbXBvcnQgeyBzdHlsZUhvb2tTaW5nbGV0b24gfSBmcm9tICcuL2hvb2snO1xuLyoqXG4gKiBjcmVhdGUgYSBDb21wb25lbnQgdG8gYWRkIHN0eWxlcyBvbiBkZW1hbmRcbiAqIC0gc3R5bGVzIGFyZSBhZGRlZCB3aGVuIGZpcnN0IGluc3RhbmNlIGlzIG1vdW50ZWRcbiAqIC0gc3R5bGVzIGFyZSByZW1vdmVkIHdoZW4gdGhlIGxhc3QgaW5zdGFuY2UgaXMgdW5tb3VudGVkXG4gKiAtIGNoYW5naW5nIHN0eWxlcyBpbiBydW50aW1lIGRvZXMgbm90aGluZyB1bmxlc3MgZHluYW1pYyBpcyBzZXQuIEJ1dCB3aXRoIG11bHRpcGxlIGNvbXBvbmVudHMgdGhhdCBjYW4gbGVhZCB0byB0aGUgdW5kZWZpbmVkIGJlaGF2aW9yXG4gKi9cbmV4cG9ydCB2YXIgc3R5bGVTaW5nbGV0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHVzZVN0eWxlID0gc3R5bGVIb29rU2luZ2xldG9uKCk7XG4gICAgdmFyIFNoZWV0ID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBzdHlsZXMgPSBfYS5zdHlsZXMsIGR5bmFtaWMgPSBfYS5keW5hbWljO1xuICAgICAgICB1c2VTdHlsZShzdHlsZXMsIGR5bmFtaWMpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBTaGVldDtcbn07XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzdHlsZXNoZWV0U2luZ2xldG9uIH0gZnJvbSAnLi9zaW5nbGV0b24nO1xuLyoqXG4gKiBjcmVhdGVzIGEgaG9vayB0byBjb250cm9sIHN0eWxlIHNpbmdsZXRvblxuICogQHNlZSB7QGxpbmsgc3R5bGVTaW5nbGV0b259IGZvciBhIHNhZmVyIGNvbXBvbmVudCB2ZXJzaW9uXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB1c2VTdHlsZSA9IHN0eWxlSG9va1NpbmdsZXRvbigpO1xuICogLy8vXG4gKiB1c2VTdHlsZSgnYm9keSB7IG92ZXJmbG93OiBoaWRkZW59Jyk7XG4gKi9cbmV4cG9ydCB2YXIgc3R5bGVIb29rU2luZ2xldG9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzaGVldCA9IHN0eWxlc2hlZXRTaW5nbGV0b24oKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxlcywgaXNEeW5hbWljKSB7XG4gICAgICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzaGVldC5hZGQoc3R5bGVzKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2hlZXQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCBbc3R5bGVzICYmIGlzRHluYW1pY10pO1xuICAgIH07XG59O1xuIiwiZXhwb3J0IHsgc3R5bGVTaW5nbGV0b24gfSBmcm9tICcuL2NvbXBvbmVudCc7XG5leHBvcnQgeyBzdHlsZXNoZWV0U2luZ2xldG9uIH0gZnJvbSAnLi9zaW5nbGV0b24nO1xuZXhwb3J0IHsgc3R5bGVIb29rU2luZ2xldG9uIH0gZnJvbSAnLi9ob29rJztcbiIsImltcG9ydCB7IGdldE5vbmNlIH0gZnJvbSAnZ2V0LW5vbmNlJztcbmZ1bmN0aW9uIG1ha2VTdHlsZVRhZygpIHtcbiAgICBpZiAoIWRvY3VtZW50KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB2YXIgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICB0YWcudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgdmFyIG5vbmNlID0gZ2V0Tm9uY2UoKTtcbiAgICBpZiAobm9uY2UpIHtcbiAgICAgICAgdGFnLnNldEF0dHJpYnV0ZSgnbm9uY2UnLCBub25jZSk7XG4gICAgfVxuICAgIHJldHVybiB0YWc7XG59XG5mdW5jdGlvbiBpbmplY3RTdHlsZXModGFnLCBjc3MpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHRhZy5zdHlsZVNoZWV0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGFnLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnNlcnRTdHlsZVRhZyh0YWcpIHtcbiAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcbiAgICBoZWFkLmFwcGVuZENoaWxkKHRhZyk7XG59XG5leHBvcnQgdmFyIHN0eWxlc2hlZXRTaW5nbGV0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgIHZhciBzdHlsZXNoZWV0ID0gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBhZGQ6IGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgICAgICAgaWYgKGNvdW50ZXIgPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICgoc3R5bGVzaGVldCA9IG1ha2VTdHlsZVRhZygpKSkge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3RTdHlsZXMoc3R5bGVzaGVldCwgc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnRTdHlsZVRhZyhzdHlsZXNoZWV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY291bnRlci0tO1xuICAgICAgICAgICAgaWYgKCFjb3VudGVyICYmIHN0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0LnBhcmVudE5vZGUgJiYgc3R5bGVzaGVldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlc2hlZXQpO1xuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG4vLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nXG4vLyBpc3N1ZXMgaW4gREVWIGJ1aWxkcy5cblxudmFyIGVuYWJsZURlYnVnVHJhY2luZyA9IGZhbHNlOyAvLyBUcmFjayB3aGljaCBGaWJlcihzKSBzY2hlZHVsZSByZW5kZXIgd29yay5cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTsgLy8gSWYgb3VyIGNvbXBvbmVudCBmcmFtZSBpcyBsYWJlbGVkIFwiPGFub255bW91cz5cIlxuICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCBcImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW4gdG8gbWFrZSB0aGUgc3RhY2sgbW9yZSByZWFkYWJsZS5cblxuXG4gICAgICAgICAgICAgICAgaWYgKGZuLmRpc3BsYXlOYW1lICYmIF9mcmFtZS5pbmNsdWRlcygnPGFub255bW91cz4nKSkge1xuICAgICAgICAgICAgICAgICAgX2ZyYW1lID0gX2ZyYW1lLnJlcGxhY2UoJzxhbm9ueW1vdXM+JywgZm4uZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd247XG52YXIgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd247XG52YXIgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcsIHNlbGYpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBzZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBzZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSksIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAge1xuICAgIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAge1xuICAgIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmZjcy9wdWxsLzEwN1xuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqL1xuXG5mdW5jdGlvbiBqc3hERVYodHlwZSwgY29uZmlnLCBtYXliZUtleSwgc291cmNlLCBzZWxmKSB7XG4gIHtcbiAgICB2YXIgcHJvcE5hbWU7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIHZhciBrZXkgPSBudWxsO1xuICAgIHZhciByZWYgPSBudWxsOyAvLyBDdXJyZW50bHksIGtleSBjYW4gYmUgc3ByZWFkIGluIGFzIGEgcHJvcC4gVGhpcyBjYXVzZXMgYSBwb3RlbnRpYWxcbiAgICAvLyBpc3N1ZSBpZiBrZXkgaXMgYWxzbyBleHBsaWNpdGx5IGRlY2xhcmVkIChpZS4gPGRpdiB7Li4ucHJvcHN9IGtleT1cIkhpXCIgLz5cbiAgICAvLyBvciA8ZGl2IGtleT1cIkhpXCIgey4uLnByb3BzfSAvPiApLiBXZSB3YW50IHRvIGRlcHJlY2F0ZSBrZXkgc3ByZWFkLFxuICAgIC8vIGJ1dCBhcyBhbiBpbnRlcm1lZGlhcnkgc3RlcCwgd2Ugd2lsbCB1c2UganN4REVWIGZvciBldmVyeXRoaW5nIGV4Y2VwdFxuICAgIC8vIDxkaXYgey4uLnByb3BzfSBrZXk9XCJIaVwiIC8+LCBiZWNhdXNlIHdlIGFyZW4ndCBjdXJyZW50bHkgYWJsZSB0byB0ZWxsIGlmXG4gICAgLy8ga2V5IGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgdG8gYmUgdW5kZWZpbmVkIG9yIG5vdC5cblxuICAgIGlmIChtYXliZUtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWF5YmVLZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIG1heWJlS2V5O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcsIHNlbGYpO1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH0gLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG5cblxuICAgIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICAgIGZvciAocHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd247XG5cbntcbiAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSBmYWxzZTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB7XG4gICAgaWYgKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICB7XG4gICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgICAgdmFyIGxpbmVOdW1iZXIgPSBzb3VyY2UubGluZU51bWJlcjtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICogdXBkYXRlcy5cbiAqL1xuXG5cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gICAgaWYgKCFpbmZvKSB7XG4gICAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgICAgaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHRvcC1sZXZlbCByZW5kZXIgY2FsbCB1c2luZyA8XCIgKyBwYXJlbnROYW1lICsgXCI+LlwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmZvO1xuICB9XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgICAvLyBwcm9wZXJ0eSwgaXQgbWF5IGJlIHRoZSBjcmVhdG9yIG9mIHRoZSBjaGlsZCB0aGF0J3MgcmVzcG9uc2libGUgZm9yXG4gICAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gICAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQpIHtcbiAgICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgICAgY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGVsZW1lbnQuX293bmVyLnR5cGUpICsgXCIuXCI7XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgfVxufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgICAgLy8gYnV0IG5vdyB3ZSBwcmludCBhIHNlcGFyYXRlIHdhcm5pbmcgZm9yIHRoZW0gbGF0ZXIuXG4gICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgICAgdmFyIHN0ZXA7XG5cbiAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMgcHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbixcbiAqIHByb3ZpZGVkIGJ5IHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJvcFR5cGVzO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBOb3RlOiBNZW1vIG9ubHkgY2hlY2tzIG91dGVyIHByb3BzIGhlcmUuXG4gICAgLy8gSW5uZXIgcHJvcHMgYXJlIGNoZWNrZWQgaW4gdGhlIHJlY29uY2lsZXIuXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSkge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICAgIGVycm9yKCdDb21wb25lbnQgJXMgZGVjbGFyZWQgYFByb3BUeXBlc2AgaW5zdGVhZCBvZiBgcHJvcFR5cGVzYC4gRGlkIHlvdSBtaXNzcGVsbCB0aGUgcHJvcGVydHkgYXNzaWdubWVudD8nLCBfbmFtZSB8fCAnVW5rbm93bicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHlwZS5nZXREZWZhdWx0UHJvcHMgPT09ICdmdW5jdGlvbicgJiYgIXR5cGUuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIGlzIG9ubHkgdXNlZCBvbiBjbGFzc2ljIFJlYWN0LmNyZWF0ZUNsYXNzICcgKyAnZGVmaW5pdGlvbnMuIFVzZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBgZGVmYXVsdFByb3BzYCBpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhIGZyYWdtZW50LCB2YWxpZGF0ZSB0aGF0IGl0IGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdpdGggZnJhZ21lbnQgcHJvcHNcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBmcmFnbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVGcmFnbWVudFByb3BzKGZyYWdtZW50KSB7XG4gIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyYWdtZW50LnByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmIChrZXkgIT09ICdjaGlsZHJlbicgJiYga2V5ICE9PSAna2V5Jykge1xuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgICBlcnJvcignSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gJyArICdSZWFjdC5GcmFnbWVudCBjYW4gb25seSBoYXZlIGBrZXlgIGFuZCBgY2hpbGRyZW5gIHByb3BzLicsIGtleSk7XG5cbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYWdtZW50LnJlZiAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBgcmVmYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLicpO1xuXG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0S2V5U3ByZWFkID0ge307XG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywga2V5LCBpc1N0YXRpY0NoaWxkcmVuLCBzb3VyY2UsIHNlbGYpIHtcbiAge1xuICAgIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gICAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICAgIGlmICghdmFsaWRUeXBlKSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSk7XG5cbiAgICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0eXBlU3RyaW5nO1xuXG4gICAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHR5cGUpKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSBcIjxcIiArIChnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnVW5rbm93bicpICsgXCIgLz5cIjtcbiAgICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVvZiB0eXBlO1xuICAgICAgfVxuXG4gICAgICBlcnJvcignUmVhY3QuanN4OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciAnICsgJ2J1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgJyArICdjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGVTdHJpbmcsIGluZm8pO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50ID0ganN4REVWKHR5cGUsIHByb3BzLCBrZXksIHNvdXJjZSwgc2VsZik7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gICAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAgIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy5cbiAgICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gICAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pXG5cblxuICAgIGlmICh2YWxpZFR5cGUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuXG4gICAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaXNTdGF0aWNDaGlsZHJlbikge1xuICAgICAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhjaGlsZHJlbltpXSwgdHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignUmVhY3QuanN4OiBTdGF0aWMgY2hpbGRyZW4gc2hvdWxkIGFsd2F5cyBiZSBhbiBhcnJheS4gJyArICdZb3UgYXJlIGxpa2VseSBleHBsaWNpdGx5IGNhbGxpbmcgUmVhY3QuanN4cyBvciBSZWFjdC5qc3hERVYuICcgKyAnVXNlIHRoZSBCYWJlbCB0cmFuc2Zvcm0gaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW4sIHR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocHJvcHMsICdrZXknKSkge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcykuZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgcmV0dXJuIGsgIT09ICdrZXknO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGJlZm9yZUV4YW1wbGUgPSBrZXlzLmxlbmd0aCA+IDAgPyAne2tleTogc29tZUtleSwgJyArIGtleXMuam9pbignOiAuLi4sICcpICsgJzogLi4ufScgOiAne2tleTogc29tZUtleX0nO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0S2V5U3ByZWFkW2NvbXBvbmVudE5hbWUgKyBiZWZvcmVFeGFtcGxlXSkge1xuICAgICAgICAgIHZhciBhZnRlckV4YW1wbGUgPSBrZXlzLmxlbmd0aCA+IDAgPyAneycgKyBrZXlzLmpvaW4oJzogLi4uLCAnKSArICc6IC4uLn0nIDogJ3t9JztcblxuICAgICAgICAgIGVycm9yKCdBIHByb3BzIG9iamVjdCBjb250YWluaW5nIGEgXCJrZXlcIiBwcm9wIGlzIGJlaW5nIHNwcmVhZCBpbnRvIEpTWDpcXG4nICsgJyAgbGV0IHByb3BzID0gJXM7XFxuJyArICcgIDwlcyB7Li4ucHJvcHN9IC8+XFxuJyArICdSZWFjdCBrZXlzIG11c3QgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIEpTWCB3aXRob3V0IHVzaW5nIHNwcmVhZDpcXG4nICsgJyAgbGV0IHByb3BzID0gJXM7XFxuJyArICcgIDwlcyBrZXk9e3NvbWVLZXl9IHsuLi5wcm9wc30gLz4nLCBiZWZvcmVFeGFtcGxlLCBjb21wb25lbnROYW1lLCBhZnRlckV4YW1wbGUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZGlkV2FybkFib3V0S2V5U3ByZWFkW2NvbXBvbmVudE5hbWUgKyBiZWZvcmVFeGFtcGxlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufSAvLyBUaGVzZSB0d28gZnVuY3Rpb25zIGV4aXN0IHRvIHN0aWxsIGdldCBjaGlsZCB3YXJuaW5ncyBpbiBkZXZcbi8vIGV2ZW4gd2l0aCB0aGUgcHJvZCB0cmFuc2Zvcm0uIFRoaXMgbWVhbnMgdGhhdCBqc3hERVYgaXMgcHVyZWx5XG4vLyBvcHQtaW4gYmVoYXZpb3IgZm9yIGJldHRlciBtZXNzYWdlcyBidXQgdGhhdCB3ZSB3b24ndCBzdG9wXG4vLyBnaXZpbmcgeW91IHdhcm5pbmdzIGlmIHlvdSB1c2UgcHJvZHVjdGlvbiBhcGlzLlxuXG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGpzeFdpdGhWYWxpZGF0aW9uRHluYW1pYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgZmFsc2UpO1xuICB9XG59XG5cbnZhciBqc3ggPSAganN4V2l0aFZhbGlkYXRpb25EeW5hbWljIDsgLy8gd2UgbWF5IHdhbnQgdG8gc3BlY2lhbCBjYXNlIGpzeHMgaW50ZXJuYWxseSB0byB0YWtlIGFkdmFudGFnZSBvZiBzdGF0aWMgY2hpbGRyZW4uXG4vLyBmb3Igbm93IHdlIGNhbiBzaGlwIGlkZW50aWNhbCBwcm9kIGZ1bmN0aW9uc1xuXG52YXIganN4cyA9ICBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyA7XG5cbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5qc3ggPSBqc3g7XG5leHBvcnRzLmpzeHMgPSBqc3hzO1xuICB9KSgpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3RWZXJzaW9uID0gJzE4LjMuMSc7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci5cbiAqL1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBiYXRjaCdzIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyBob3cgbG9uZyBhbiB1cGRhdGVcbiAqIHNob3VsZCBzdXNwZW5kIGZvciBpZiBpdCBuZWVkcyB0by5cbiAqL1xudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0ge1xuICB0cmFuc2l0aW9uOiBudWxsXG59O1xuXG52YXIgUmVhY3RDdXJyZW50QWN0UXVldWUgPSB7XG4gIGN1cnJlbnQ6IG51bGwsXG4gIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuXG4gIGlzQmF0Y2hpbmdMZWdhY3k6IGZhbHNlLFxuICBkaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZTogZmFsc2Vcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb3duZXIuXG4gKlxuICogVGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIGNvbXBvbmVudCB3aG8gc2hvdWxkIG93biBhbnkgY29tcG9uZW50cyB0aGF0IGFyZVxuICogY3VycmVudGx5IGJlaW5nIGNvbnN0cnVjdGVkLlxuICovXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSB7fTtcbnZhciBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gbnVsbDtcbmZ1bmN0aW9uIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjaykge1xuICB7XG4gICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICB9XG59XG5cbntcbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUgPSBmdW5jdGlvbiAoc3RhY2spIHtcbiAgICB7XG4gICAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gICAgfVxuICB9OyAvLyBTdGFjayBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCBieSB0aGUgY3VycmVudCByZW5kZXJlci5cblxuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YWNrID0gJyc7IC8vIEFkZCBhbiBleHRyYSB0b3AgZnJhbWUgd2hpbGUgYW4gZWxlbWVudCBpcyBiZWluZyB2YWxpZGF0ZWRcblxuICAgIGlmIChjdXJyZW50RXh0cmFTdGFja0ZyYW1lKSB7XG4gICAgICBzdGFjayArPSBjdXJyZW50RXh0cmFTdGFja0ZyYW1lO1xuICAgIH0gLy8gRGVsZWdhdGUgdG8gdGhlIGluamVjdGVkIHJlbmRlcmVyLXNwZWNpZmljIGltcGxlbWVudGF0aW9uXG5cblxuICAgIHZhciBpbXBsID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2s7XG5cbiAgICBpZiAoaW1wbCkge1xuICAgICAgc3RhY2sgKz0gaW1wbCgpIHx8ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXJcbn07XG5cbntcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWU7XG59XG5cbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSB7fTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IF9jb25zdHJ1Y3RvciAmJiAoX2NvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IF9jb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcyc7XG4gICAgdmFyIHdhcm5pbmdLZXkgPSBjb21wb25lbnROYW1lICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVycm9yKFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlO1xuICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG5cblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG52YXIgZW1wdHlPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cblxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDsgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGVcbiAgLy8gcmVuZGVyZXIuXG5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5Db21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdvYmplY3QnICYmIHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdmdW5jdGlvbicgJiYgcGFydGlhbFN0YXRlICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgJyArICdmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJyk7XG4gIH1cblxuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xufTtcbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cblxuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuXG5cbntcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuXG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKTtcblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuXG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuXG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbnZhciBwdXJlQ29tcG9uZW50UHJvdG90eXBlID0gUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQdXJlQ29tcG9uZW50OyAvLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cblxuYXNzaWduKHB1cmVDb21wb25lbnRQcm90b3R5cGUsIENvbXBvbmVudC5wcm90b3R5cGUpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbi8vIGFuIGltbXV0YWJsZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBtdXRhYmxlIHZhbHVlXG5mdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG4gIHZhciByZWZPYmplY3QgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG5cbiAgcmV0dXJuIHJlZk9iamVjdDtcbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duLCBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBjb25maWcuX19zZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBjb25maWcuX19zZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTsgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xufVxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cbi8qKlxuICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2Nsb25lZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiICsgZWxlbWVudCArIFwiLlwiKTtcbiAgfVxuXG4gIHZhciBwcm9wTmFtZTsgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuXG4gIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjsgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cblxuICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7IC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGFcbiAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZVxuICAvLyB0cnVlIG93bmVyLlxuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7IC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG5cblxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuXG5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6Jztcbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGUoa2V5KSB7XG4gIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7XG4gIHZhciBlc2NhcGVyTG9va3VwID0ge1xuICAgICc9JzogJz0wJyxcbiAgICAnOic6ICc9MidcbiAgfTtcbiAgdmFyIGVzY2FwZWRTdHJpbmcgPSBrZXkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbiAgcmV0dXJuICckJyArIGVzY2FwZWRTdHJpbmc7XG59XG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuXG5mdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7XG59XG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBlbGVtZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGVsZW1lbnQgQSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFbGVtZW50S2V5KGVsZW1lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnICYmIGVsZW1lbnQgIT09IG51bGwgJiYgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHtcbiAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBlc2NhcGUoJycgKyBlbGVtZW50LmtleSk7XG4gIH0gLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcblxuXG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIG1hcEludG9BcnJheShjaGlsZHJlbiwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5hbWVTb0ZhciwgY2FsbGJhY2spIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIHZhciBpbnZva2VDYWxsYmFjayA9IGZhbHNlO1xuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCkge1xuICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBzd2l0Y2ggKGNoaWxkcmVuLiQkdHlwZW9mKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgaWYgKGludm9rZUNhbGxiYWNrKSB7XG4gICAgdmFyIF9jaGlsZCA9IGNoaWxkcmVuO1xuICAgIHZhciBtYXBwZWRDaGlsZCA9IGNhbGxiYWNrKF9jaGlsZCk7IC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93czpcblxuICAgIHZhciBjaGlsZEtleSA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRFbGVtZW50S2V5KF9jaGlsZCwgMCkgOiBuYW1lU29GYXI7XG5cbiAgICBpZiAoaXNBcnJheShtYXBwZWRDaGlsZCkpIHtcbiAgICAgIHZhciBlc2NhcGVkQ2hpbGRLZXkgPSAnJztcblxuICAgICAgaWYgKGNoaWxkS2V5ICE9IG51bGwpIHtcbiAgICAgICAgZXNjYXBlZENoaWxkS2V5ID0gZXNjYXBlVXNlclByb3ZpZGVkS2V5KGNoaWxkS2V5KSArICcvJztcbiAgICAgIH1cblxuICAgICAgbWFwSW50b0FycmF5KG1hcHBlZENoaWxkLCBhcnJheSwgZXNjYXBlZENoaWxkS2V5LCAnJywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHtcbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChtYXBwZWRDaGlsZCkpIHtcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBgaWZgIHN0YXRlbWVudCBoZXJlIHByZXZlbnRzIGF1dG8tZGlzYWJsaW5nIG9mIHRoZSBzYWZlXG4gICAgICAgICAgLy8gY29lcmNpb24gRVNMaW50IHJ1bGUsIHNvIHdlIG11c3QgbWFudWFsbHkgZGlzYWJsZSBpdCBiZWxvdy5cbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgICBpZiAobWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkpIHtcbiAgICAgICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWFwcGVkQ2hpbGQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICAgIGVzY2FwZWRQcmVmaXggKyAoIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICAgIGVzY2FwZVVzZXJQcm92aWRlZEtleSgnJyArIG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgICB9XG5cbiAgICAgIGFycmF5LnB1c2gobWFwcGVkQ2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkO1xuICB2YXIgbmV4dE5hbWU7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgaXRlcmFibGVDaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICB7XG4gICAgICAgIC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuICAgICAgICBpZiAoaXRlcmF0b3JGbiA9PT0gaXRlcmFibGVDaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgICB3YXJuKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoaXRlcmFibGVDaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHZhciBpaSA9IDA7XG5cbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBNYXBzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBjb3VudCA9IDA7XG4gIG1hcEludG9BcnJheShjaGlsZHJlbiwgcmVzdWx0LCAnJywgJycsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGNvdW50KyspO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmNvdW50XG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uXG4gKi9cblxuXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBuID0gMDtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBuKys7IC8vIERvbid0IHJldHVybiBhbnl0aGluZ1xuICB9KTtcbiAgcmV0dXJuIG47XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuZm9yZWFjaFxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmb3JFYWNoRnVuY1xuICogQHBhcmFtIHsqfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IGZvciBmb3JFYWNoQ29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpIHtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBmb3JFYWNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmcuXG4gIH0sIGZvckVhY2hDb250ZXh0KTtcbn1cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVudG9hcnJheVxuICovXG5cblxuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICByZXR1cm4gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZDtcbiAgfSkgfHwgW107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVub25seVxuICpcbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgc2luZ2xlIGNoaWxkIGdldHNcbiAqIHBhc3NlZCB3aXRob3V0IGEgd3JhcHBlciwgYnV0IHRoZSBwdXJwb3NlIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHRvXG4gKiBhYnN0cmFjdCBhd2F5IHRoZSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBvZiBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGNoaWxkcmVuIENoaWxkIGNvbGxlY3Rpb24gc3RydWN0dXJlLlxuICogQHJldHVybiB7UmVhY3RFbGVtZW50fSBUaGUgZmlyc3QgYW5kIG9ubHkgYFJlYWN0RWxlbWVudGAgY29udGFpbmVkIGluIHRoZVxuICogc3RydWN0dXJlLlxuICovXG5cblxuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gIGlmICghaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4nKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgLy8gVE9ETzogU2Vjb25kIGFyZ3VtZW50IHVzZWQgdG8gYmUgYW4gb3B0aW9uYWwgYGNhbGN1bGF0ZUNoYW5nZWRCaXRzYFxuICAvLyBmdW5jdGlvbi4gV2FybiB0byByZXNlcnZlIGZvciBmdXR1cmUgdXNlP1xuICB2YXIgY29udGV4dCA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgIC8vIEFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQgcmVuZGVyZXJzLCB3ZSBjYXRlZ29yaXplXG4gICAgLy8gc29tZSByZW5kZXJlcnMgYXMgcHJpbWFyeSBhbmQgb3RoZXJzIGFzIHNlY29uZGFyeS4gV2Ugb25seSBleHBlY3RcbiAgICAvLyB0aGVyZSB0byBiZSB0d28gY29uY3VycmVudCByZW5kZXJlcnMgYXQgbW9zdDogUmVhY3QgTmF0aXZlIChwcmltYXJ5KSBhbmRcbiAgICAvLyBGYWJyaWMgKHNlY29uZGFyeSk7IFJlYWN0IERPTSAocHJpbWFyeSkgYW5kIFJlYWN0IEFSVCAoc2Vjb25kYXJ5KS5cbiAgICAvLyBTZWNvbmRhcnkgcmVuZGVyZXJzIHN0b3JlIHRoZWlyIGNvbnRleHQgdmFsdWVzIG9uIHNlcGFyYXRlIGZpZWxkcy5cbiAgICBfY3VycmVudFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgX2N1cnJlbnRWYWx1ZTI6IGRlZmF1bHRWYWx1ZSxcbiAgICAvLyBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IGNvbmN1cnJlbnQgcmVuZGVyZXJzIHRoaXMgY29udGV4dCBjdXJyZW50bHlcbiAgICAvLyBzdXBwb3J0cyB3aXRoaW4gaW4gYSBzaW5nbGUgcmVuZGVyZXIuIFN1Y2ggYXMgcGFyYWxsZWwgc2VydmVyIHJlbmRlcmluZy5cbiAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgLy8gVGhlc2UgYXJlIGNpcmN1bGFyXG4gICAgUHJvdmlkZXI6IG51bGwsXG4gICAgQ29uc3VtZXI6IG51bGwsXG4gICAgLy8gQWRkIHRoZXNlIHRvIHVzZSBzYW1lIGhpZGRlbiBjbGFzcyBpbiBWTSBhcyBTZXJ2ZXJDb250ZXh0XG4gICAgX2RlZmF1bHRWYWx1ZTogbnVsbCxcbiAgICBfZ2xvYmFsTmFtZTogbnVsbFxuICB9O1xuICBjb250ZXh0LlByb3ZpZGVyID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9QUk9WSURFUl9UWVBFLFxuICAgIF9jb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gZmFsc2U7XG5cbiAge1xuICAgIC8vIEEgc2VwYXJhdGUgb2JqZWN0LCBidXQgcHJveGllcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9iamVjdCBmb3JcbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaGFzIGEgZGlmZmVyZW50ICQkdHlwZW9mLCBzbyB3ZSBjYW4gcHJvcGVybHlcbiAgICAvLyB3YXJuIGZvciB0aGUgaW5jb3JyZWN0IHVzYWdlIG9mIENvbnRleHQgYXMgYSBDb25zdW1lci5cbiAgICB2YXIgQ29uc3VtZXIgPSB7XG4gICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwge1xuICAgICAgUHJvdmlkZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLlByb3ZpZGVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LlByb3ZpZGVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LlByb3ZpZGVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfUHJvdmlkZXIpIHtcbiAgICAgICAgICBjb250ZXh0LlByb3ZpZGVyID0gX1Byb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWUyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlMikge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF90aHJlYWRDb3VudDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fdGhyZWFkQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF90aHJlYWRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuX3RocmVhZENvdW50ID0gX3RocmVhZENvdW50O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ29uc3VtZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycykge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLkNvbnN1bWVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlzcGxheU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lcikge1xuICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArIFwiWW91IHNob3VsZCBzZXQgaXQgZGlyZWN0bHkgb24gdGhlIGNvbnRleHQgd2l0aCBDb250ZXh0LmRpc3BsYXlOYW1lID0gJyVzJy5cIiwgZGlzcGxheU5hbWUpO1xuXG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvcGVydGllcyBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBkZWZpbmVQcm9wZXJ0eVxuXG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxudmFyIFVuaW5pdGlhbGl6ZWQgPSAtMTtcbnZhciBQZW5kaW5nID0gMDtcbnZhciBSZXNvbHZlZCA9IDE7XG52YXIgUmVqZWN0ZWQgPSAyO1xuXG5mdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXIocGF5bG9hZCkge1xuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgdmFyIHRoZW5hYmxlID0gY3RvcigpOyAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgIC8vIFRoaXMgbWlnaHQgdGhyb3cgZWl0aGVyIGJlY2F1c2UgaXQncyBtaXNzaW5nIG9yIHRocm93cy4gSWYgc28sIHdlIHRyZWF0IGl0XG4gICAgLy8gYXMgc3RpbGwgdW5pbml0aWFsaXplZCBhbmQgdHJ5IGFnYWluIG5leHQgdGltZS4gV2hpY2ggaXMgdGhlIHNhbWUgYXMgd2hhdFxuICAgIC8vIGhhcHBlbnMgaWYgdGhlIGN0b3Igb3IgYW55IHdyYXBwZXJzIHByb2Nlc3NpbmcgdGhlIGN0b3IgdGhyb3dzLiBUaGlzIG1pZ2h0XG4gICAgLy8gZW5kIHVwIGZpeGluZyBpdCBpZiB0aGUgcmVzb2x1dGlvbiB3YXMgYSBjb25jdXJyZW5jeSBidWcuXG5cbiAgICB0aGVuYWJsZS50aGVuKGZ1bmN0aW9uIChtb2R1bGVPYmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZXNvbHZlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlc29sdmVkLl9zdGF0dXMgPSBSZXNvbHZlZDtcbiAgICAgICAgcmVzb2x2ZWQuX3Jlc3VsdCA9IG1vZHVsZU9iamVjdDtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZWplY3RlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlamVjdGVkLl9zdGF0dXMgPSBSZWplY3RlZDtcbiAgICAgICAgcmVqZWN0ZWQuX3Jlc3VsdCA9IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgLy8gSW4gY2FzZSwgd2UncmUgc3RpbGwgdW5pbml0aWFsaXplZCwgdGhlbiB3ZSdyZSB3YWl0aW5nIGZvciB0aGUgdGhlbmFibGVcbiAgICAgIC8vIHRvIHJlc29sdmUuIFNldCBpdCBhcyBwZW5kaW5nIGluIHRoZSBtZWFudGltZS5cbiAgICAgIHZhciBwZW5kaW5nID0gcGF5bG9hZDtcbiAgICAgIHBlbmRpbmcuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgICBwZW5kaW5nLl9yZXN1bHQgPSB0aGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBSZXNvbHZlZCkge1xuICAgIHZhciBtb2R1bGVPYmplY3QgPSBwYXlsb2FkLl9yZXN1bHQ7XG5cbiAgICB7XG4gICAgICBpZiAobW9kdWxlT2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVxcblxcblwiICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHB1dCBjdXJseSBicmFjZXMgYXJvdW5kIHRoZSBpbXBvcnQ/JywgbW9kdWxlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoISgnZGVmYXVsdCcgaW4gbW9kdWxlT2JqZWN0KSkge1xuICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wJyArICdvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICdjb25zdCBNeUNvbXBvbmVudCA9IGxhenkoKCkgPT4gaW1wJyArIFwib3J0KCcuL015Q29tcG9uZW50JykpXCIsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZU9iamVjdC5kZWZhdWx0O1xuICB9IGVsc2Uge1xuICAgIHRocm93IHBheWxvYWQuX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXp5KGN0b3IpIHtcbiAgdmFyIHBheWxvYWQgPSB7XG4gICAgLy8gV2UgdXNlIHRoZXNlIGZpZWxkcyB0byBzdG9yZSB0aGUgcmVzdWx0LlxuICAgIF9zdGF0dXM6IFVuaW5pdGlhbGl6ZWQsXG4gICAgX3Jlc3VsdDogY3RvclxuICB9O1xuICB2YXIgbGF6eVR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogcGF5bG9hZCxcbiAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgZGVmYXVsdFByb3BzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9wVHlwZXM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFR5cGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgcHJvcFR5cGVzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgcHJvcFR5cGVzID0gbmV3UHJvcFR5cGVzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4gey4uLn0pO1xuICAgICAgICAvLyBUaGlzIGtpbmQgb2YgaW5uZXIgZnVuY3Rpb24gaXMgbm90IHVzZWQgZWxzZXdoZXJlIHNvIHRoZSBzaWRlIGVmZmVjdCBpcyBva2F5LlxuXG4gICAgICAgIGlmICghcmVuZGVyLm5hbWUgJiYgIXJlbmRlci5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHJlbmRlci5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7XG4gIHtcbiAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSkge1xuICAgICAgZXJyb3IoJ21lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkICcgKyAncmVjZWl2ZWQ6ICVzJywgdHlwZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB0eXBlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX01FTU9fVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGNvbXBhcmU6IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb21wYXJlXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QubWVtbygocHJvcHMpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXR5cGUubmFtZSAmJiAhdHlwZS5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICB7XG4gICAgaWYgKGRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG4gICAgfVxuICB9IC8vIFdpbGwgcmVzdWx0IGluIGEgbnVsbCBhY2Nlc3MgZXJyb3IgaWYgYWNjZXNzZWQgb3V0c2lkZSByZW5kZXIgcGhhc2UuIFdlXG4gIC8vIGludGVudGlvbmFsbHkgZG9uJ3QgdGhyb3cgb3VyIG93biBlcnJvciBiZWNhdXNlIHRoaXMgaXMgaW4gYSBob3QgcGF0aC5cbiAgLy8gQWxzbyBoZWxwcyBlbnN1cmUgdGhpcyBpcyBpbmxpbmVkLlxuXG5cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5mdW5jdGlvbiB1c2VDb250ZXh0KENvbnRleHQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuXG4gIHtcbiAgICAvLyBUT0RPOiBhZGQgYSBtb3JlIGdlbmVyaWMgd2FybmluZyBmb3IgaW52YWxpZCB2YWx1ZXMuXG4gICAgaWYgKENvbnRleHQuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlYWxDb250ZXh0ID0gQ29udGV4dC5fY29udGV4dDsgLy8gRG9uJ3QgZGVkdXBsaWNhdGUgYmVjYXVzZSB0aGlzIGxlZ2l0aW1hdGVseSBjYXVzZXMgYnVnc1xuICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLlxuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkLCBtYXkgY2F1c2UgYnVncywgYW5kIHdpbGwgYmUgJyArICdyZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH0gZWxzZSBpZiAocmVhbENvbnRleHQuUHJvdmlkZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQpO1xufVxuZnVuY3Rpb24gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbn1cbmZ1bmN0aW9uIHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG59XG5mdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVmKGluaXRpYWxWYWx1ZSk7XG59XG5mdW5jdGlvbiB1c2VFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZU1lbW8oY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTWVtbyhjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAge1xuICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb24oKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlVHJhbnNpdGlvbigpO1xufVxuZnVuY3Rpb24gdXNlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZURlZmVycmVkVmFsdWUodmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlSWQoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSWQoKTtcbn1cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICB9XG5cbiAge1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCk7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTsgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcblxuICAgICAgdmFyIF9uYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZztcblxuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG52YXIgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkpIHtcbiAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gdHJ1ZTtcblxuICAgICAgd2FybignUmVhY3QuY3JlYXRlRmFjdG9yeSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIENvbnNpZGVyIHVzaW5nIEpTWCAnICsgJ29yIHVzZSBSZWFjdC5jcmVhdGVFbGVtZW50KCkgZGlyZWN0bHkgaW5zdGVhZC4nKTtcbiAgICB9IC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcblxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbn1cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2NvcGUsIG9wdGlvbnMpIHtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzY29wZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSBmYWxzZTtcbnZhciBlbnF1ZXVlVGFza0ltcGwgPSBudWxsO1xuZnVuY3Rpb24gZW5xdWV1ZVRhc2sodGFzaykge1xuICBpZiAoZW5xdWV1ZVRhc2tJbXBsID09PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJlYWQgcmVxdWlyZSBvZmYgdGhlIG1vZHVsZSBvYmplY3QgdG8gZ2V0IGFyb3VuZCB0aGUgYnVuZGxlcnMuXG4gICAgICAvLyB3ZSBkb24ndCB3YW50IHRoZW0gdG8gZGV0ZWN0IGEgcmVxdWlyZSBhbmQgYnVuZGxlIGEgTm9kZSBwb2x5ZmlsbC5cbiAgICAgIHZhciByZXF1aXJlU3RyaW5nID0gKCdyZXF1aXJlJyArIE1hdGgucmFuZG9tKCkpLnNsaWNlKDAsIDcpO1xuICAgICAgdmFyIG5vZGVSZXF1aXJlID0gbW9kdWxlICYmIG1vZHVsZVtyZXF1aXJlU3RyaW5nXTsgLy8gYXNzdW1pbmcgd2UncmUgaW4gbm9kZSwgbGV0J3MgdHJ5IHRvIGdldCBub2RlJ3NcbiAgICAgIC8vIHZlcnNpb24gb2Ygc2V0SW1tZWRpYXRlLCBieXBhc3NpbmcgZmFrZSB0aW1lcnMgaWYgYW55LlxuXG4gICAgICBlbnF1ZXVlVGFza0ltcGwgPSBub2RlUmVxdWlyZS5jYWxsKG1vZHVsZSwgJ3RpbWVycycpLnNldEltbWVkaWF0ZTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXJcbiAgICAgIC8vIHdlIGNhbid0IHVzZSByZWd1bGFyIHRpbWVycyBiZWNhdXNlIHRoZXkgbWF5IHN0aWxsIGJlIGZha2VkXG4gICAgICAvLyBzbyB3ZSB0cnkgTWVzc2FnZUNoYW5uZWwrcG9zdE1lc3NhZ2UgaW5zdGVhZFxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdUaGlzIGJyb3dzZXIgZG9lcyBub3QgaGF2ZSBhIE1lc3NhZ2VDaGFubmVsIGltcGxlbWVudGF0aW9uLCAnICsgJ3NvIGVucXVldWluZyB0YXNrcyB2aWEgYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLikgd2lsbCBmYWlsLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMgJyArICdpZiB5b3UgZW5jb3VudGVyIHRoaXMgd2FybmluZy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKHVuZGVmaW5lZCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbnF1ZXVlVGFza0ltcGwodGFzayk7XG59XG5cbnZhciBhY3RTY29wZURlcHRoID0gMDtcbnZhciBkaWRXYXJuTm9Bd2FpdEFjdCA9IGZhbHNlO1xuZnVuY3Rpb24gYWN0KGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBgYWN0YCBjYWxscyBjYW4gYmUgbmVzdGVkLCBzbyB3ZSB0cmFjayB0aGUgZGVwdGguIFRoaXMgcmVwcmVzZW50cyB0aGVcbiAgICAvLyBudW1iZXIgb2YgYGFjdGAgc2NvcGVzIG9uIHRoZSBzdGFjay5cbiAgICB2YXIgcHJldkFjdFNjb3BlRGVwdGggPSBhY3RTY29wZURlcHRoO1xuICAgIGFjdFNjb3BlRGVwdGgrKztcblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBvdXRlcm1vc3QgYGFjdGAgc2NvcGUuIEluaXRpYWxpemUgdGhlIHF1ZXVlLiBUaGUgcmVjb25jaWxlclxuICAgICAgLy8gd2lsbCBkZXRlY3QgdGhlIHF1ZXVlIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBTY2hlZHVsZXIuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgfVxuXG4gICAgdmFyIHByZXZJc0JhdGNoaW5nTGVnYWN5ID0gUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuIE9ubHlcbiAgICAgIC8vIHNldCB0byBgdHJ1ZWAgd2hpbGUgdGhlIGdpdmVuIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBub3QgZm9yIHVwZGF0ZXNcbiAgICAgIC8vIHRyaWdnZXJlZCBkdXJpbmcgYW4gYXN5bmMgZXZlbnQsIGJlY2F1c2UgdGhpcyBpcyBob3cgdGhlIGxlZ2FjeVxuICAgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgYGFjdGAgYmVoYXZlZC5cbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gY2FsbGJhY2soKTsgLy8gUmVwbGljYXRlIGJlaGF2aW9yIG9mIG9yaWdpbmFsIGBhY3RgIGltcGxlbWVudGF0aW9uIGluIGxlZ2FjeSBtb2RlLFxuICAgICAgLy8gd2hpY2ggZmx1c2hlZCB1cGRhdGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzY29wZSBmdW5jdGlvbiBleGl0cywgZXZlblxuICAgICAgLy8gaWYgaXQncyBhbiBhc3luYyBmdW5jdGlvbi5cblxuICAgICAgaWYgKCFwcmV2SXNCYXRjaGluZ0xlZ2FjeSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSkge1xuICAgICAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSBwcmV2SXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRoZW5hYmxlUmVzdWx0ID0gcmVzdWx0OyAvLyBUaGUgY2FsbGJhY2sgaXMgYW4gYXN5bmMgZnVuY3Rpb24gKGkuZS4gcmV0dXJuZWQgYSBwcm9taXNlKS4gV2FpdFxuICAgICAgLy8gZm9yIGl0IHRvIHJlc29sdmUgYmVmb3JlIGV4aXRpbmcgdGhlIGN1cnJlbnQgc2NvcGUuXG5cbiAgICAgIHZhciB3YXNBd2FpdGVkID0gZmFsc2U7XG4gICAgICB2YXIgdGhlbmFibGUgPSB7XG4gICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICB3YXNBd2FpdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGVuYWJsZVJlc3VsdC50aGVuKGZ1bmN0aW9uIChyZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuXG4gICAgICAgICAgICBpZiAoYWN0U2NvcGVEZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAvLyBXZSd2ZSBleGl0ZWQgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZVxuICAgICAgICAgICAgICAvLyBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3IuXG4gICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB7XG4gICAgICAgIGlmICghZGlkV2Fybk5vQXdhaXRBY3QgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7fSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXdhc0F3YWl0ZWQpIHtcbiAgICAgICAgICAgICAgZGlkV2Fybk5vQXdhaXRBY3QgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdZb3UgY2FsbGVkIGFjdChhc3luYyAoKSA9PiAuLi4pIHdpdGhvdXQgYXdhaXQuICcgKyAnVGhpcyBjb3VsZCBsZWFkIHRvIHVuZXhwZWN0ZWQgdGVzdGluZyBiZWhhdmlvdXIsICcgKyAnaW50ZXJsZWF2aW5nIG11bHRpcGxlIGFjdCBjYWxscyBhbmQgbWl4aW5nIHRoZWlyICcgKyAnc2NvcGVzLiAnICsgJ1lvdSBzaG91bGQgLSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKTsnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhlbmFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIG5vdCBhbiBhc3luYyBmdW5jdGlvbi4gRXhpdCB0aGUgY3VycmVudCBzY29wZVxuICAgICAgLy8gaW1tZWRpYXRlbHksIHdpdGhvdXQgYXdhaXRpbmcuXG5cbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgLy8gRXhpdGluZyB0aGUgb3V0ZXJtb3N0IGFjdCBzY29wZS4gRmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3F1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAoX3F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShfcXVldWUpO1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9IC8vIFJldHVybiBhIHRoZW5hYmxlLiBJZiB0aGUgdXNlciBhd2FpdHMgaXQsIHdlJ2xsIGZsdXNoIGFnYWluIGluXG4gICAgICAgIC8vIGNhc2UgYWRkaXRpb25hbCB3b3JrIHdhcyBzY2hlZHVsZWQgYnkgYSBtaWNyb3Rhc2suXG5cblxuICAgICAgICB2YXIgX3RoZW5hYmxlID0ge1xuICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIC8vIENvbmZpcm0gd2UgaGF2ZW4ndCByZS1lbnRlcmVkIGFub3RoZXIgYGFjdGAgc2NvcGUsIGluIGNhc2VcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIGRvZXMgc29tZXRoaW5nIHdlaXJkIGxpa2UgYXdhaXQgdGhlIHRoZW5hYmxlXG4gICAgICAgICAgICAvLyBtdWx0aXBsZSB0aW1lcy5cbiAgICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZSBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW5jZSB3ZSdyZSBpbnNpZGUgYSBuZXN0ZWQgYGFjdGAgc2NvcGUsIHRoZSByZXR1cm5lZCB0aGVuYWJsZVxuICAgICAgICAvLyBpbW1lZGlhdGVseSByZXNvbHZlcy4gVGhlIG91dGVyIHNjb3BlIHdpbGwgZmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3RoZW5hYmxlMiA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGUyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCkge1xuICB7XG4gICAgaWYgKHByZXZBY3RTY29wZURlcHRoICE9PSBhY3RTY29wZURlcHRoIC0gMSkge1xuICAgICAgZXJyb3IoJ1lvdSBzZWVtIHRvIGhhdmUgb3ZlcmxhcHBpbmcgYWN0KCkgY2FsbHMsIHRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdCZSBzdXJlIHRvIGF3YWl0IHByZXZpb3VzIGFjdCgpIGNhbGxzIGJlZm9yZSBtYWtpbmcgYSBuZXcgb25lLiAnKTtcbiAgICB9XG5cbiAgICBhY3RTY29wZURlcHRoID0gcHJldkFjdFNjb3BlRGVwdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHtcbiAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKTtcbiAgICAgICAgZW5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkLiBGaW5pc2guXG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBLZWVwIGZsdXNoaW5nIHdvcmsgdW50aWwgdGhlcmUncyBub25lIGxlZnQuXG4gICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGlzRmx1c2hpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmx1c2hBY3RRdWV1ZShxdWV1ZSkge1xuICB7XG4gICAgaWYgKCFpc0ZsdXNoaW5nKSB7XG4gICAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgICAgaXNGbHVzaGluZyA9IHRydWU7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgICAgcXVldWUgPSBxdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgY3JlYXRlRWxlbWVudCQxID0gIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY2xvbmVFbGVtZW50JDEgPSAgY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNyZWF0ZUZhY3RvcnkgPSAgY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uIDtcbnZhciBDaGlsZHJlbiA9IHtcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgZm9yRWFjaDogZm9yRWFjaENoaWxkcmVuLFxuICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgdG9BcnJheTogdG9BcnJheSxcbiAgb25seTogb25seUNoaWxkXG59O1xuXG5leHBvcnRzLkNoaWxkcmVuID0gQ2hpbGRyZW47XG5leHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5Qcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuZXhwb3J0cy5hY3QgPSBhY3Q7XG5leHBvcnRzLmNsb25lRWxlbWVudCA9IGNsb25lRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDtcbmV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlRmFjdG9yeSA9IGNyZWF0ZUZhY3Rvcnk7XG5leHBvcnRzLmNyZWF0ZVJlZiA9IGNyZWF0ZVJlZjtcbmV4cG9ydHMuZm9yd2FyZFJlZiA9IGZvcndhcmRSZWY7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gaXNWYWxpZEVsZW1lbnQ7XG5leHBvcnRzLmxhenkgPSBsYXp5O1xuZXhwb3J0cy5tZW1vID0gbWVtbztcbmV4cG9ydHMuc3RhcnRUcmFuc2l0aW9uID0gc3RhcnRUcmFuc2l0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9hY3QgPSBhY3Q7XG5leHBvcnRzLnVzZUNhbGxiYWNrID0gdXNlQ2FsbGJhY2s7XG5leHBvcnRzLnVzZUNvbnRleHQgPSB1c2VDb250ZXh0O1xuZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gdXNlRGVidWdWYWx1ZTtcbmV4cG9ydHMudXNlRGVmZXJyZWRWYWx1ZSA9IHVzZURlZmVycmVkVmFsdWU7XG5leHBvcnRzLnVzZUVmZmVjdCA9IHVzZUVmZmVjdDtcbmV4cG9ydHMudXNlSWQgPSB1c2VJZDtcbmV4cG9ydHMudXNlSW1wZXJhdGl2ZUhhbmRsZSA9IHVzZUltcGVyYXRpdmVIYW5kbGU7XG5leHBvcnRzLnVzZUluc2VydGlvbkVmZmVjdCA9IHVzZUluc2VydGlvbkVmZmVjdDtcbmV4cG9ydHMudXNlTGF5b3V0RWZmZWN0ID0gdXNlTGF5b3V0RWZmZWN0O1xuZXhwb3J0cy51c2VNZW1vID0gdXNlTWVtbztcbmV4cG9ydHMudXNlUmVkdWNlciA9IHVzZVJlZHVjZXI7XG5leHBvcnRzLnVzZVJlZiA9IHVzZVJlZjtcbmV4cG9ydHMudXNlU3RhdGUgPSB1c2VTdGF0ZTtcbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZTtcbmV4cG9ydHMudXNlVHJhbnNpdGlvbiA9IHVzZVRyYW5zaXRpb247XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1ydW50aW1lLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQgJ2ZvY3VzLW91dGxpbmUtbWFuYWdlcic7XG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmLCBDb21wb25lbnQsIGNyZWF0ZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbiBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBzY3JvbGxTbW9vdGggZnJvbSAnc2Nyb2xsLXNtb290aCc7XG5pbXBvcnQgU2Nyb2xscGFyZW50IGZyb20gJ3Njcm9sbHBhcmVudCc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoLmRlYm91bmNlJztcbmltcG9ydCBGb2N1c0xvY2sgZnJvbSAncmVhY3QtZm9jdXMtbG9jayc7XG5pbXBvcnQgc3R5bGVkLCB7IGNyZWF0ZUdsb2JhbFN0eWxlIH0gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSc7XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIHtcbiAgKG51bGwgPT0gYSB8fCBhID4gci5sZW5ndGgpICYmIChhID0gci5sZW5ndGgpO1xuICBmb3IgKHZhciBlID0gMCwgbiA9IEFycmF5KGEpOyBlIDwgYTsgZSsrKSBuW2VdID0gcltlXTtcbiAgcmV0dXJuIG47XG59XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMocikge1xuICBpZiAoQXJyYXkuaXNBcnJheShyKSkgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKGUpIHtcbiAgaWYgKHZvaWQgMCA9PT0gZSkgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIF9jYWxsU3VwZXIodCwgbywgZSkge1xuICByZXR1cm4gbyA9IF9nZXRQcm90b3R5cGVPZihvKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCwgX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpID8gUmVmbGVjdC5jb25zdHJ1Y3QobywgZSB8fCBbXSwgX2dldFByb3RvdHlwZU9mKHQpLmNvbnN0cnVjdG9yKSA6IG8uYXBwbHkodCwgZSkpO1xufVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGEsIG4pIHtcbiAgaWYgKCEoYSBpbnN0YW5jZW9mIG4pKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xufVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMoZSwgcikge1xuICBmb3IgKHZhciB0ID0gMDsgdCA8IHIubGVuZ3RoOyB0KyspIHtcbiAgICB2YXIgbyA9IHJbdF07XG4gICAgby5lbnVtZXJhYmxlID0gby5lbnVtZXJhYmxlIHx8ICExLCBvLmNvbmZpZ3VyYWJsZSA9ICEwLCBcInZhbHVlXCIgaW4gbyAmJiAoby53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIF90b1Byb3BlcnR5S2V5KG8ua2V5KSwgbyk7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhlLCByLCB0KSB7XG4gIHJldHVybiByICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUucHJvdG90eXBlLCByKSwgdCAmJiBfZGVmaW5lUHJvcGVydGllcyhlLCB0KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogITFcbiAgfSksIGU7XG59XG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyLCBlKSB7XG4gIHZhciB0ID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKCF0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocikgfHwgKHQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikpIHx8IGUgJiYgciAmJiBcIm51bWJlclwiID09IHR5cGVvZiByLmxlbmd0aCkge1xuICAgICAgdCAmJiAociA9IHQpO1xuICAgICAgdmFyIG4gPSAwLFxuICAgICAgICBGID0gZnVuY3Rpb24gKCkge307XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzOiBGLFxuICAgICAgICBuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG4gPj0gci5sZW5ndGggPyB7XG4gICAgICAgICAgICBkb25lOiAhMFxuICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICBkb25lOiAhMSxcbiAgICAgICAgICAgIHZhbHVlOiByW24rK11cbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlOiBmdW5jdGlvbiAocikge1xuICAgICAgICAgIHRocm93IHI7XG4gICAgICAgIH0sXG4gICAgICAgIGY6IEZcbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgfVxuICB2YXIgbyxcbiAgICBhID0gITAsXG4gICAgdSA9ICExO1xuICByZXR1cm4ge1xuICAgIHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHQgPSB0LmNhbGwocik7XG4gICAgfSxcbiAgICBuOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgciA9IHQubmV4dCgpO1xuICAgICAgcmV0dXJuIGEgPSByLmRvbmUsIHI7XG4gICAgfSxcbiAgICBlOiBmdW5jdGlvbiAocikge1xuICAgICAgdSA9ICEwLCBvID0gcjtcbiAgICB9LFxuICAgIGY6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGEgfHwgbnVsbCA9PSB0LnJldHVybiB8fCB0LnJldHVybigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHUpIHRocm93IG87XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHtcbiAgcmV0dXJuIChyID0gX3RvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwge1xuICAgIHZhbHVlOiB0LFxuICAgIGVudW1lcmFibGU6ICEwLFxuICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgd3JpdGFibGU6ICEwXG4gIH0pIDogZVtyXSA9IHQsIGU7XG59XG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCkge1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtcbiAgfSwgX2dldFByb3RvdHlwZU9mKHQpO1xufVxuZnVuY3Rpb24gX2luaGVyaXRzKHQsIGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSAmJiBudWxsICE9PSBlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiB0LFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgIH1cbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6ICExXG4gIH0pLCBlICYmIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHQgPSAhQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpO1xuICB9IGNhdGNoICh0KSB7fVxuICByZXR1cm4gKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhdDtcbiAgfSkoKTtcbn1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7XG4gIHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07XG4gIGlmIChudWxsICE9IHQpIHtcbiAgICB2YXIgZSxcbiAgICAgIG4sXG4gICAgICBpLFxuICAgICAgdSxcbiAgICAgIGEgPSBbXSxcbiAgICAgIGYgPSAhMCxcbiAgICAgIG8gPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkge1xuICAgICAgICBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47XG4gICAgICAgIGYgPSAhMTtcbiAgICAgIH0gZWxzZSBmb3IgKDsgIShmID0gKGUgPSBpLmNhbGwodCkpLmRvbmUpICYmIChhLnB1c2goZS52YWx1ZSksIGEubGVuZ3RoICE9PSBsKTsgZiA9ICEwKTtcbiAgICB9IGNhdGNoIChyKSB7XG4gICAgICBvID0gITAsIG4gPSByO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWYgJiYgbnVsbCAhPSB0LnJldHVybiAmJiAodSA9IHQucmV0dXJuKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvKSB0aHJvdyBuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxufVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikge1xuICB2YXIgdCA9IE9iamVjdC5rZXlzKGUpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtcbiAgICByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7XG4gICAgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMihlKSB7XG4gIGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7XG4gICAgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9O1xuICAgIHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7XG4gICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGU7XG59XG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LCBlKSB7XG4gIGlmIChlICYmIChcIm9iamVjdFwiID09IHR5cGVvZiBlIHx8IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZSkpIHJldHVybiBlO1xuICBpZiAodm9pZCAwICE9PSBlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7XG4gIHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpO1xufVxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQsIGUpIHtcbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyA9IGUsIHQ7XG4gIH0sIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KHIsIGUpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQociwgZSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIsIGUpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cbmZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoZSwgdCkge1xuICByZXR1cm4gdCB8fCAodCA9IGUuc2xpY2UoMCkpLCBPYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIHtcbiAgICByYXc6IHtcbiAgICAgIHZhbHVlOiBPYmplY3QuZnJlZXplKHQpXG4gICAgfVxuICB9KSk7XG59XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgdCB8fCAhdCkgcmV0dXJuIHQ7XG4gIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIGkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkge1xuICB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTtcbiAgcmV0dXJuIFwic3ltYm9sXCIgPT0gdHlwZW9mIGkgPyBpIDogaSArIFwiXCI7XG59XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgYSkge1xuICBpZiAocikge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiByKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkociwgYSk7XG4gICAgdmFyIHQgPSB7fS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsIC0xKTtcbiAgICByZXR1cm4gXCJPYmplY3RcIiA9PT0gdCAmJiByLmNvbnN0cnVjdG9yICYmICh0ID0gci5jb25zdHJ1Y3Rvci5uYW1lKSwgXCJNYXBcIiA9PT0gdCB8fCBcIlNldFwiID09PSB0ID8gQXJyYXkuZnJvbShyKSA6IFwiQXJndW1lbnRzXCIgPT09IHQgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodCkgPyBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSA6IHZvaWQgMDtcbiAgfVxufVxuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDk7XG52YXIgR2xvYmFsU3R5bGUgPSBjcmVhdGVHbG9iYWxTdHlsZShfdGVtcGxhdGVPYmplY3QkOSB8fCAoX3RlbXBsYXRlT2JqZWN0JDkgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgLmZvY3VzLW91dGxpbmUtaGlkZGVuIDpmb2N1cyB7XFxuICAgICAgb3V0bGluZTogbm9uZTtcXG4gIH1cXG5cIl0pKSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkODtcbnZhciBTdmdCdXR0b24gPSBzdHlsZWQuYnV0dG9uKF90ZW1wbGF0ZU9iamVjdCQ4IHx8IChfdGVtcGxhdGVPYmplY3QkOCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBkaXNwbGF5OiBibG9jaztcXG4gIHBhZGRpbmc6IDA7XFxuICBib3JkZXI6IDA7XFxuICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgZm9udC1zaXplOiAwO1xcbiAgY3Vyc29yOiBcIiwgXCI7XFxuXCJdKSksIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuZGlzYWJsZWQgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInO1xufSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkNywgX3RlbXBsYXRlT2JqZWN0MjtcbnZhciBMYWJlbCA9IHN0eWxlZC5zcGFuKF90ZW1wbGF0ZU9iamVjdCQ3IHx8IChfdGVtcGxhdGVPYmplY3QkNyA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBmb250LXNpemU6IDEycHg7XFxuICBsaW5lLWhlaWdodDogMTtcXG5cIl0pKSk7XG5mdW5jdGlvbiBBcnJvdyhfcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgIGludmVydGVkID0gX3JlZi5pbnZlcnRlZCxcbiAgICBsYWJlbCA9IF9yZWYubGFiZWwsXG4gICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ZnQnV0dG9uLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBcImRhdGEtdG91ci1lbGVtXCI6IFwiXCIuY29uY2F0KGludmVydGVkID8gJ3JpZ2h0JyA6ICdsZWZ0JywgXCItYXJyb3dcIiksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gIH0sIGxhYmVsID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGFiZWwsIG51bGwsIGxhYmVsKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB2aWV3Qm94OiBcIjAgMCAxOC40IDE0LjRcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IGludmVydGVkID8gJ00xNyA3LjJIMU0xMC44IDFMMTcgNy4ybC02LjIgNi4yJyA6ICdNMS40IDcuMmgxNk03LjYgMUwxLjQgNy4ybDYuMiA2LjInLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHN0cm9rZTogXCJjdXJyZW50Q29sb3JcIixcbiAgICBzdHJva2VXaWR0aDogXCIyXCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZU1pdGVybGltaXQ6IFwiMTBcIlxuICB9KSkpO1xufVxuQXJyb3cucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaW52ZXJ0ZWQ6IFByb3BUeXBlcy5ib29sLFxuICBsYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbFxufTtcbnZhciBBcnJvdyQxID0gc3R5bGVkKEFycm93KShfdGVtcGxhdGVPYmplY3QyIHx8IChfdGVtcGxhdGVPYmplY3QyID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIGNvbG9yOiBcIiwgXCI7XFxuXFxuICBcIiwgXCI7XFxuICBcIiwgXCI7XFxuXFxuICAmOmhvdmVyIHtcXG4gICAgY29sb3I6IFwiLCBcIjtcXG4gIH1cXG5cIl0pKSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5kaXNhYmxlZCA/ICcjY2FjY2NlJyA6ICcjNjQ2NDY0Jztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuaW52ZXJ0ZWQgPyAnbWFyZ2luLWxlZnQ6IDI0cHg7JyA6ICdtYXJnaW4tcmlnaHQ6IDI0cHg7Jztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gIXByb3BzLmxhYmVsICYmIFwiXFxuICAgIHdpZHRoOiAxNnB4O1xcbiAgICBoZWlnaHQ6IDEycHg7XFxuICAgIGZsZXg6IDAgMCAxNnB4O1xcbiAgXCI7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmRpc2FibGVkID8gJyNjYWNjY2UnIDogJyMwMDAnO1xufSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkNjtcbmZ1bmN0aW9uIENsb3NlKF9yZWYpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2ssXG4gICAgYXJpYUxhYmVsID0gX3JlZi5hcmlhTGFiZWw7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdmdCdXR0b24sIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIFwiYXJpYS1sYWJlbFwiOiBhcmlhTGFiZWxcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHZpZXdCb3g6IFwiMCAwIDkuMSA5LjFcIixcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWUsXG4gICAgcm9sZTogXCJwcmVzZW50YXRpb25cIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgZDogXCJNNS45IDQuNWwyLjgtMi44Yy40LS40LjQtMSAwLTEuNC0uNC0uNC0xLS40LTEuNCAwTDQuNSAzLjEgMS43LjNDMS4zLS4xLjctLjEuMy4zYy0uNC40LS40IDEgMCAxLjRsMi44IDIuOEwuMyA3LjRjLS40LjQtLjQgMSAwIDEuNC4yLjIuNC4zLjcuM3MuNS0uMS43LS4zTDQuNSA2bDIuOCAyLjhjLjMuMi41LjMuOC4zcy41LS4xLjctLjNjLjQtLjQuNC0xIDAtMS40TDUuOSA0LjV6XCJcbiAgfSkpKTtcbn1cbkNsb3NlLnByb3BUeXBlcyA9IHtcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGFyaWFMYWJlbDogUHJvcFR5cGVzLnN0cmluZ1xufTtcbnZhciBTdHlsZWRDbG9zZSA9IHN0eWxlZChDbG9zZSkoX3RlbXBsYXRlT2JqZWN0JDYgfHwgKF90ZW1wbGF0ZU9iamVjdCQ2ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMjJweDtcXG4gIHJpZ2h0OiAyMnB4O1xcbiAgd2lkdGg6IDlweDtcXG4gIGhlaWdodDogOXB4O1xcbiAgY29sb3I6ICM1ZTVlNWU7XFxuICAmOmhvdmVyIHtcXG4gICAgY29sb3I6ICMwMDA7XFxuICB9XFxuXCJdKSkpO1xuXG5mdW5jdGlvbiBnZXROb2RlUmVjdChub2RlKSB7XG4gIHZhciBfbm9kZSRnZXRCb3VuZGluZ0NsaWUgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgIHRvcCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS50b3AsXG4gICAgcmlnaHQgPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUucmlnaHQsXG4gICAgYm90dG9tID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLmJvdHRvbSxcbiAgICBsZWZ0ID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLmxlZnQsXG4gICAgd2lkdGggPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUud2lkdGgsXG4gICAgaGVpZ2h0ID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLmhlaWdodDtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IHRvcCxcbiAgICByaWdodDogcmlnaHQsXG4gICAgYm90dG9tOiBib3R0b20sXG4gICAgbGVmdDogbGVmdCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldEhpZ2hsaWdodGVkUmVjdChub2RlLCBzdGVwKSB7XG4gIGlmICghc3RlcC5oaWdobGlnaHRlZFNlbGVjdG9ycykge1xuICAgIHJldHVybiBnZXROb2RlUmVjdChub2RlKTtcbiAgfVxuICB2YXIgYXR0cnMgPSBnZXROb2RlUmVjdChub2RlKTtcbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHN0ZXAuaGlnaGxpZ2h0ZWRTZWxlY3RvcnMpLFxuICAgIF9zdGVwO1xuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBfc3RlcC52YWx1ZTtcbiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZWN0ID0gZ2V0Tm9kZVJlY3QoZWxlbWVudCk7XG4gICAgICBpZiAocmVjdC50b3AgPCBhdHRycy50b3ApIHtcbiAgICAgICAgYXR0cnMudG9wID0gcmVjdC50b3A7XG4gICAgICB9XG4gICAgICBpZiAocmVjdC5yaWdodCA+IGF0dHJzLnJpZ2h0KSB7XG4gICAgICAgIGF0dHJzLnJpZ2h0ID0gcmVjdC5yaWdodDtcbiAgICAgIH1cbiAgICAgIGlmIChyZWN0LmJvdHRvbSA+IGF0dHJzLmJvdHRvbSkge1xuICAgICAgICBhdHRycy5ib3R0b20gPSByZWN0LmJvdHRvbTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWN0LmxlZnQgPCBhdHRycy5sZWZ0KSB7XG4gICAgICAgIGF0dHJzLmxlZnQgPSByZWN0LmxlZnQ7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cbiAgYXR0cnMud2lkdGggPSBhdHRycy5yaWdodCAtIGF0dHJzLmxlZnQ7XG4gIGF0dHJzLmhlaWdodCA9IGF0dHJzLmJvdHRvbSAtIGF0dHJzLnRvcDtcbiAgcmV0dXJuIGF0dHJzO1xufVxuZnVuY3Rpb24gaW5WaWV3KF9yZWYpIHtcbiAgdmFyIHRvcCA9IF9yZWYudG9wLFxuICAgIHJpZ2h0ID0gX3JlZi5yaWdodCxcbiAgICBib3R0b20gPSBfcmVmLmJvdHRvbSxcbiAgICBsZWZ0ID0gX3JlZi5sZWZ0LFxuICAgIHcgPSBfcmVmLncsXG4gICAgaCA9IF9yZWYuaCxcbiAgICBfcmVmJHRocmVzaG9sZCA9IF9yZWYudGhyZXNob2xkLFxuICAgIHRocmVzaG9sZCA9IF9yZWYkdGhyZXNob2xkID09PSB2b2lkIDAgPyAwIDogX3JlZiR0aHJlc2hvbGQ7XG4gIHJldHVybiB0b3AgPj0gMCArIHRocmVzaG9sZCAmJiBsZWZ0ID49IDAgKyB0aHJlc2hvbGQgJiYgYm90dG9tIDw9IGggLSB0aHJlc2hvbGQgJiYgcmlnaHQgPD0gdyAtIHRocmVzaG9sZDtcbn1cbmZ1bmN0aW9uIGlzQm9keShub2RlKSB7XG4gIHJldHVybiBub2RlID09PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykgfHwgbm9kZSA9PT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpO1xufVxudmFyIGlzSG9yaXogPSBmdW5jdGlvbiBpc0hvcml6KHBvcykge1xuICByZXR1cm4gLyhsZWZ0fHJpZ2h0KS8udGVzdChwb3MpO1xufTtcbnZhciBpc091dHNpZGVYID0gZnVuY3Rpb24gaXNPdXRzaWRlWCh2YWwsIHdpbmRvd1dpZHRoKSB7XG4gIHJldHVybiB2YWwgPiB3aW5kb3dXaWR0aDtcbn07XG52YXIgaXNPdXRzaWRlWSA9IGZ1bmN0aW9uIGlzT3V0c2lkZVkodmFsLCB3aW5kb3dIZWlnaHQpIHtcbiAgcmV0dXJuIHZhbCA+IHdpbmRvd0hlaWdodDtcbn07XG52YXIgc2FmZSA9IGZ1bmN0aW9uIHNhZmUoc3VtKSB7XG4gIHJldHVybiBzdW0gPCAwID8gMCA6IHN1bTtcbn07XG5mdW5jdGlvbiBiZXN0UG9zaXRpb25PZihwb3NpdGlvbnMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBvc2l0aW9ucykubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiBwLFxuICAgICAgdmFsdWU6IHBvc2l0aW9uc1twXVxuICAgIH07XG4gIH0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi52YWx1ZSAtIGEudmFsdWU7XG4gIH0pLm1hcChmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBwLnBvc2l0aW9uO1xuICB9KTtcbn1cblxudmFyIF90ZW1wbGF0ZU9iamVjdCQ1O1xudmFyIEd1aWRlID0gc3R5bGVkLmRpdihfdGVtcGxhdGVPYmplY3QkNSB8fCAoX3RlbXBsYXRlT2JqZWN0JDUgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgLS1yZWFjdG91ci1hY2NlbnQ6IFwiLCBcIjtcXG4gIFwiLCBcIlxcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3M7XFxuICB0b3A6IDA7XFxuICBsZWZ0OiAwO1xcbiAgei1pbmRleDogMTAwMDAwMDtcXG5cXG4gIHRyYW5zZm9ybTogXCIsIFwiO1xcblwiXSkpLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmFjY2VudENvbG9yO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5kZWZhdWx0U3R5bGVzID8gXCJcXG4gIG1heC13aWR0aDogMzMxcHg7XFxuICBtaW4td2lkdGg6IDE1MHB4O1xcbiAgcGFkZGluZy1yaWdodDogNDBweDtcXG4gIGJvcmRlci1yYWRpdXM6IFwiLmNvbmNhdChwcm9wcy5yb3VuZGVkLCBcInB4O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIHBhZGRpbmc6IDI0cHggMzBweDtcXG4gIGJveC1zaGFkb3c6IDAgMC41ZW0gM2VtIHJnYmEoMCwgMCwgMCwgMC4zKTtcXG4gIGNvbG9yOiBpbmhlcml0O1xcbiAgXCIpIDogJyc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIHRhcmdldFRvcCA9IHByb3BzLnRhcmdldFRvcCxcbiAgICB0YXJnZXRSaWdodCA9IHByb3BzLnRhcmdldFJpZ2h0LFxuICAgIHRhcmdldEJvdHRvbSA9IHByb3BzLnRhcmdldEJvdHRvbSxcbiAgICB0YXJnZXRMZWZ0ID0gcHJvcHMudGFyZ2V0TGVmdCxcbiAgICB3aW5kb3dXaWR0aCA9IHByb3BzLndpbmRvd1dpZHRoLFxuICAgIHdpbmRvd0hlaWdodCA9IHByb3BzLndpbmRvd0hlaWdodCxcbiAgICBoZWxwZXJXaWR0aCA9IHByb3BzLmhlbHBlcldpZHRoLFxuICAgIGhlbHBlckhlaWdodCA9IHByb3BzLmhlbHBlckhlaWdodCxcbiAgICBoZWxwZXJQb3NpdGlvbiA9IHByb3BzLmhlbHBlclBvc2l0aW9uLFxuICAgIHBhZGRpbmcgPSBwcm9wcy5wYWRkaW5nO1xuICB2YXIgYXZhaWxhYmxlID0ge1xuICAgIGxlZnQ6IHRhcmdldExlZnQsXG4gICAgcmlnaHQ6IHdpbmRvd1dpZHRoIC0gdGFyZ2V0UmlnaHQsXG4gICAgdG9wOiB0YXJnZXRUb3AsXG4gICAgYm90dG9tOiB3aW5kb3dIZWlnaHQgLSB0YXJnZXRCb3R0b21cbiAgfTtcbiAgdmFyIGNvdWxkUG9zaXRpb25BdCA9IGZ1bmN0aW9uIGNvdWxkUG9zaXRpb25BdChwb3NpdGlvbikge1xuICAgIHJldHVybiBhdmFpbGFibGVbcG9zaXRpb25dID4gKGlzSG9yaXoocG9zaXRpb24pID8gaGVscGVyV2lkdGggKyBwYWRkaW5nICogMiA6IGhlbHBlckhlaWdodCArIHBhZGRpbmcgKiAyKTtcbiAgfTtcbiAgdmFyIGF1dG9Qb3NpdGlvbiA9IGZ1bmN0aW9uIGF1dG9Qb3NpdGlvbihjb29yZHMpIHtcbiAgICB2YXIgcG9zaXRpb25zT3JkZXIgPSBiZXN0UG9zaXRpb25PZihhdmFpbGFibGUpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcG9zaXRpb25zT3JkZXIubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChjb3VsZFBvc2l0aW9uQXQocG9zaXRpb25zT3JkZXJbal0pKSB7XG4gICAgICAgIHJldHVybiBjb29yZHNbcG9zaXRpb25zT3JkZXJbal1dO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29vcmRzLmNlbnRlcjtcbiAgfTtcbiAgdmFyIHBvcyA9IGZ1bmN0aW9uIHBvcyhoZWxwZXJQb3NpdGlvbikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGhlbHBlclBvc2l0aW9uKSkge1xuICAgICAgdmFyIGlzT3V0WCA9IGlzT3V0c2lkZVgoaGVscGVyUG9zaXRpb25bMF0sIHdpbmRvd1dpZHRoKTtcbiAgICAgIHZhciBpc091dFkgPSBpc091dHNpZGVZKGhlbHBlclBvc2l0aW9uWzFdLCB3aW5kb3dIZWlnaHQpO1xuICAgICAgdmFyIHdhcm4gPSBmdW5jdGlvbiB3YXJuKGF4aXMsIG51bSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJcIi5jb25jYXQoYXhpcywgXCI6XCIpLmNvbmNhdChudW0sIFwiIGlzIG91dHNpZGUgd2luZG93LCBmYWxsaW5nIGJhY2sgdG8gY2VudGVyXCIpKTtcbiAgICAgIH07XG4gICAgICBpZiAoaXNPdXRYKSB3YXJuKCd4JywgaGVscGVyUG9zaXRpb25bMF0pO1xuICAgICAgaWYgKGlzT3V0WSkgd2FybigneScsIGhlbHBlclBvc2l0aW9uWzFdKTtcbiAgICAgIHJldHVybiBbaXNPdXRYID8gd2luZG93V2lkdGggLyAyIC0gaGVscGVyV2lkdGggLyAyIDogaGVscGVyUG9zaXRpb25bMF0sIGlzT3V0WSA/IHdpbmRvd0hlaWdodCAvIDIgLSBoZWxwZXJIZWlnaHQgLyAyIDogaGVscGVyUG9zaXRpb25bMV1dO1xuICAgIH1cbiAgICB2YXIgaFggPSBpc091dHNpZGVYKHRhcmdldExlZnQgKyBoZWxwZXJXaWR0aCwgd2luZG93V2lkdGgpID8gaXNPdXRzaWRlWCh0YXJnZXRSaWdodCArIHBhZGRpbmcsIHdpbmRvd1dpZHRoKSA/IHRhcmdldFJpZ2h0IC0gaGVscGVyV2lkdGggOiB0YXJnZXRSaWdodCAtIGhlbHBlcldpZHRoICsgcGFkZGluZyA6IHRhcmdldExlZnQgLSBwYWRkaW5nO1xuICAgIHZhciB4ID0gaFggPiBwYWRkaW5nID8gaFggOiBwYWRkaW5nO1xuICAgIHZhciBoWSA9IGlzT3V0c2lkZVkodGFyZ2V0VG9wICsgaGVscGVySGVpZ2h0LCB3aW5kb3dIZWlnaHQpID8gaXNPdXRzaWRlWSh0YXJnZXRCb3R0b20gKyBwYWRkaW5nLCB3aW5kb3dIZWlnaHQpID8gdGFyZ2V0Qm90dG9tIC0gaGVscGVySGVpZ2h0IDogdGFyZ2V0Qm90dG9tIC0gaGVscGVySGVpZ2h0ICsgcGFkZGluZyA6IHRhcmdldFRvcCAtIHBhZGRpbmc7XG4gICAgdmFyIHkgPSBoWSA+IHBhZGRpbmcgPyBoWSA6IHBhZGRpbmc7XG4gICAgdmFyIGNvb3JkcyA9IHtcbiAgICAgIHRvcDogW3gsIHRhcmdldFRvcCAtIGhlbHBlckhlaWdodCAtIHBhZGRpbmcgKiAyXSxcbiAgICAgIHJpZ2h0OiBbdGFyZ2V0UmlnaHQgKyBwYWRkaW5nICogMiwgeV0sXG4gICAgICBib3R0b206IFt4LCB0YXJnZXRCb3R0b20gKyBwYWRkaW5nICogMl0sXG4gICAgICBsZWZ0OiBbdGFyZ2V0TGVmdCAtIGhlbHBlcldpZHRoIC0gcGFkZGluZyAqIDIsIHldLFxuICAgICAgY2VudGVyOiBbd2luZG93V2lkdGggLyAyIC0gaGVscGVyV2lkdGggLyAyLCB3aW5kb3dIZWlnaHQgLyAyIC0gaGVscGVySGVpZ2h0IC8gMl1cbiAgICB9O1xuICAgIGlmIChoZWxwZXJQb3NpdGlvbiA9PT0gJ2NlbnRlcicgfHwgY291bGRQb3NpdGlvbkF0KGhlbHBlclBvc2l0aW9uKSkge1xuICAgICAgcmV0dXJuIGNvb3Jkc1toZWxwZXJQb3NpdGlvbl07XG4gICAgfVxuICAgIHJldHVybiBhdXRvUG9zaXRpb24oY29vcmRzKTtcbiAgfTtcbiAgdmFyIHAgPSBwb3MoaGVscGVyUG9zaXRpb24pO1xuICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIuY29uY2F0KE1hdGgucm91bmQocFswXSksIFwicHgsIFwiKS5jb25jYXQoTWF0aC5yb3VuZChwWzFdKSwgXCJweClcIik7XG59KTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCQ0O1xudmFyIEJhZGdlID0gc3R5bGVkLnNwYW4oX3RlbXBsYXRlT2JqZWN0JDQgfHwgKF90ZW1wbGF0ZU9iamVjdCQ0ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxuICBiYWNrZ3JvdW5kOiB2YXIoLS1yZWFjdG91ci1hY2NlbnQpO1xcbiAgYmFja2dyb3VuZDogXCIsIFwiO1xcbiAgaGVpZ2h0OiAxLjg3NWVtO1xcbiAgbGluZS1oZWlnaHQ6IDI7XFxuICBwYWRkaW5nLWxlZnQ6IDAuODEyNWVtO1xcbiAgcGFkZGluZy1yaWdodDogMC44MTI1ZW07XFxuICBmb250LXNpemU6IDFlbTtcXG4gIGJvcmRlci1yYWRpdXM6IDEuNjI1ZW07XFxuICBjb2xvcjogd2hpdGU7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBib3gtc2hhZG93OiAwIDAuMjVlbSAwLjVlbSByZ2JhKDAsIDAsIDAsIDAuMyk7XFxuICB0b3A6IC0wLjgxMjVlbTtcXG4gIGxlZnQ6IC0wLjgxMjVlbTtcXG5cIl0pKSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5hY2NlbnRDb2xvcjtcbn0pO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDM7XG52YXIgQ29udHJvbHMgPSBzdHlsZWQuZGl2KF90ZW1wbGF0ZU9iamVjdCQzIHx8IChfdGVtcGxhdGVPYmplY3QkMyA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgbWFyZ2luLXRvcDogMjRweDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG5cIl0pKSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkMjtcbnZhciBOYXZpZ2F0aW9uID0gc3R5bGVkLm5hdihfdGVtcGxhdGVPYmplY3QkMiB8fCAoX3RlbXBsYXRlT2JqZWN0JDIgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgY291bnRlci1yZXNldDogZG90O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGZsZXgtd3JhcDogd3JhcDtcXG5cIl0pKSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkMTtcbnZhciBEb3QgPSBzdHlsZWQuYnV0dG9uKF90ZW1wbGF0ZU9iamVjdCQxIHx8IChfdGVtcGxhdGVPYmplY3QkMSA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBjb3VudGVyLWluY3JlbWVudDogZG90O1xcbiAgd2lkdGg6IDhweDtcXG4gIGhlaWdodDogOHB4O1xcbiAgYm9yZGVyOiBcIiwgXCI7XFxuXFxuICBib3JkZXItcmFkaXVzOiAxMDAlO1xcbiAgcGFkZGluZzogMDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luOiA0cHg7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIHRyYW5zZm9ybSAwLjNzO1xcbiAgY3Vyc29yOiBcIiwgXCI7XFxuICB0cmFuc2Zvcm06IHNjYWxlKFwiLCBcIik7XFxuXFxuICBjb2xvcjogXCIsIFwiO1xcbiAgYmFja2dyb3VuZDogXCIsIFwiO1xcblxcbiAgY29sb3I6IFwiLCBcIjtcXG4gIGJhY2tncm91bmQ6IFwiLCBcIjtcXG5cXG4gICY6YmVmb3JlIHtcXG4gICAgY29udGVudDogY291bnRlcihkb3QpO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogY2FsYygxMDAlICsgMC4yNWVtKTtcXG4gICAgbGVmdDogNTAlO1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAxZW0pO1xcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xcbiAgICBkaXNwbGF5OiBcIiwgXCI7XFxuICB9XFxuXFxuICAmOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogY3VycmVudENvbG9yO1xcblxcbiAgICAmOmJlZm9yZSB7XFxuICAgICAgb3BhY2l0eTogMC41O1xcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC0ycHgpO1xcbiAgICB9XFxuICB9XFxuXCJdKSksIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuY3VycmVudCA9PT0gcHJvcHMuaW5kZXggPyAnMCcgOiAnMXB4IHNvbGlkICNjYWNjY2UnO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5kaXNhYmxlZCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcic7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmN1cnJlbnQgPT09IHByb3BzLmluZGV4ID8gMS4yNSA6IDE7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmN1cnJlbnQgPT09IHByb3BzLmluZGV4ID8gJ3ZhcigtLXJlYWN0b3VyLWFjY2VudCknIDogJyNjYWNjY2UnO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5jdXJyZW50ID09PSBwcm9wcy5pbmRleCA/ICd2YXIoLS1yZWFjdG91ci1hY2NlbnQpJyA6ICdub25lJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuY3VycmVudCA9PT0gcHJvcHMuaW5kZXggPyBwcm9wcy5hY2NlbnRDb2xvciA6ICcjY2FjY2NlJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuY3VycmVudCA9PT0gcHJvcHMuaW5kZXggPyBwcm9wcy5hY2NlbnRDb2xvciA6ICdub25lJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuc2hvd051bWJlciA/ICdibG9jaycgOiAnbm9uZSc7XG59KTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdDtcbnZhciBTdmdNYXNrV3JhcHBlciA9IHN0eWxlZC5kaXYoX3RlbXBsYXRlT2JqZWN0IHx8IChfdGVtcGxhdGVPYmplY3QgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgb3BhY2l0eTogXCIsIFwiO1xcbiAgY29sb3I6IFwiLCBcIjtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbGVmdDogMDtcXG4gIHRvcDogMDtcXG4gIGhlaWdodDogMTAwJTtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIHotaW5kZXg6IDk5OTk5O1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuXCJdKSksIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gIXByb3BzLm1hc2tDbGFzc05hbWUgJiYgMC43O1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiAhcHJvcHMubWFza0NsYXNzTmFtZSAmJiAnIzAwMCc7XG59KTtcbmZ1bmN0aW9uIFN2Z01hc2soX3JlZikge1xuICB2YXIgd2luZG93V2lkdGggPSBfcmVmLndpbmRvd1dpZHRoLFxuICAgIHdpbmRvd0hlaWdodCA9IF9yZWYud2luZG93SGVpZ2h0LFxuICAgIHRhcmdldFdpZHRoID0gX3JlZi50YXJnZXRXaWR0aCxcbiAgICB0YXJnZXRIZWlnaHQgPSBfcmVmLnRhcmdldEhlaWdodCxcbiAgICB0YXJnZXRUb3AgPSBfcmVmLnRhcmdldFRvcCxcbiAgICB0YXJnZXRMZWZ0ID0gX3JlZi50YXJnZXRMZWZ0LFxuICAgIHBhZGRpbmcgPSBfcmVmLnBhZGRpbmcsXG4gICAgcm91bmRlZCA9IF9yZWYucm91bmRlZCxcbiAgICByb3VuZGVkU3RlcCA9IF9yZWYucm91bmRlZFN0ZXAsXG4gICAgZGlzYWJsZUludGVyYWN0aW9uID0gX3JlZi5kaXNhYmxlSW50ZXJhY3Rpb24sXG4gICAgZGlzYWJsZUludGVyYWN0aW9uQ2xhc3NOYW1lID0gX3JlZi5kaXNhYmxlSW50ZXJhY3Rpb25DbGFzc05hbWUsXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgb25DbGljayA9IF9yZWYub25DbGljayxcbiAgICBoaWdobGlnaHRlZEJvcmRlciA9IF9yZWYuaGlnaGxpZ2h0ZWRCb3JkZXI7XG4gIHZhciB3aWR0aCA9IHNhZmUodGFyZ2V0V2lkdGggKyBwYWRkaW5nICogMik7XG4gIHZhciBoZWlnaHQgPSBzYWZlKHRhcmdldEhlaWdodCArIHBhZGRpbmcgKiAyKTtcbiAgdmFyIHRvcCA9IHNhZmUodGFyZ2V0VG9wIC0gcGFkZGluZyk7XG4gIHZhciBsZWZ0ID0gc2FmZSh0YXJnZXRMZWZ0IC0gcGFkZGluZyk7XG4gIHZhciByb3VuZGVkUmFkaXVzID0gcm91bmRlZFN0ZXAgPyBNYXRoLm1pbih3aWR0aCAvIDIsIGhlaWdodCAvIDIpIDogcm91bmRlZDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN2Z01hc2tXcmFwcGVyLCB7XG4gICAgb25DbGljazogb25DbGljayxcbiAgICBtYXNrQ2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcIm1hc2tcIiwge1xuICAgIGlkOiBcIm1hc2stbWFpblwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogbGVmdCxcbiAgICB5OiB0b3AsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiBsZWZ0IC0gMSxcbiAgICB5OiB0b3AgLSAxLFxuICAgIHdpZHRoOiByb3VuZGVkUmFkaXVzLFxuICAgIGhlaWdodDogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogbGVmdCArIHJvdW5kZWRSYWRpdXMsXG4gICAgY3k6IHRvcCArIHJvdW5kZWRSYWRpdXMsXG4gICAgcjogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcImJsYWNrXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogbGVmdCArIHdpZHRoIC0gcm91bmRlZFJhZGl1cyArIDEsXG4gICAgeTogdG9wIC0gMSxcbiAgICB3aWR0aDogcm91bmRlZFJhZGl1cyxcbiAgICBoZWlnaHQ6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IGxlZnQgKyB3aWR0aCAtIHJvdW5kZWRSYWRpdXMsXG4gICAgY3k6IHRvcCArIHJvdW5kZWRSYWRpdXMsXG4gICAgcjogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcImJsYWNrXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogbGVmdCAtIDEsXG4gICAgeTogdG9wICsgaGVpZ2h0IC0gcm91bmRlZFJhZGl1cyArIDEsXG4gICAgd2lkdGg6IHJvdW5kZWRSYWRpdXMsXG4gICAgaGVpZ2h0OiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiBsZWZ0ICsgcm91bmRlZFJhZGl1cyxcbiAgICBjeTogdG9wICsgaGVpZ2h0IC0gcm91bmRlZFJhZGl1cyxcbiAgICByOiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiBsZWZ0ICsgd2lkdGggLSByb3VuZGVkUmFkaXVzICsgMSxcbiAgICB5OiB0b3AgKyBoZWlnaHQgLSByb3VuZGVkUmFkaXVzICsgMSxcbiAgICB3aWR0aDogcm91bmRlZFJhZGl1cyxcbiAgICBoZWlnaHQ6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IGxlZnQgKyB3aWR0aCAtIHJvdW5kZWRSYWRpdXMsXG4gICAgY3k6IHRvcCArIGhlaWdodCAtIHJvdW5kZWRSYWRpdXMsXG4gICAgcjogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcImJsYWNrIFwiXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjbGlwUGF0aFwiLCB7XG4gICAgaWQ6IFwiY2xpcC1wYXRoXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgd2lkdGg6IHdpbmRvd1dpZHRoLFxuICAgIGhlaWdodDogdG9wXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDAsXG4gICAgeTogdG9wLFxuICAgIHdpZHRoOiBsZWZ0LFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IHRhcmdldExlZnQgKyB0YXJnZXRXaWR0aCArIHBhZGRpbmcsXG4gICAgeTogdG9wLFxuICAgIHdpZHRoOiBzYWZlKHdpbmRvd1dpZHRoIC0gdGFyZ2V0V2lkdGggLSBsZWZ0KSxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiAwLFxuICAgIHk6IHRhcmdldFRvcCArIHRhcmdldEhlaWdodCArIHBhZGRpbmcsXG4gICAgd2lkdGg6IHdpbmRvd1dpZHRoLFxuICAgIGhlaWdodDogc2FmZSh3aW5kb3dIZWlnaHQgLSB0YXJnZXRIZWlnaHQgLSB0b3ApXG4gIH0pKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIG1hc2s6IFwidXJsKCNtYXNrLW1haW4pXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIGNsaXBQYXRoOiBcInVybCgjY2xpcC1wYXRoKVwiLFxuICAgIHBvaW50ZXJFdmVudHM6IFwiYXV0b1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IGxlZnQsXG4gICAgeTogdG9wLFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBwb2ludGVyRXZlbnRzOiBcImF1dG9cIixcbiAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXG4gICAgZGlzcGxheTogZGlzYWJsZUludGVyYWN0aW9uID8gJ2Jsb2NrJyA6ICdub25lJyxcbiAgICBjbGFzc05hbWU6IGRpc2FibGVJbnRlcmFjdGlvbkNsYXNzTmFtZVxuICB9KSwgaGlnaGxpZ2h0ZWRCb3JkZXIgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiBzYWZlKGxlZnQgKyBoaWdobGlnaHRlZEJvcmRlci53aWR0aCAvIDIuMCksXG4gICAgeTogc2FmZSh0b3AgKyBoaWdobGlnaHRlZEJvcmRlci53aWR0aCAvIDIuMCksXG4gICAgd2lkdGg6IHNhZmUod2lkdGggLSBoaWdobGlnaHRlZEJvcmRlci53aWR0aCksXG4gICAgaGVpZ2h0OiBzYWZlKGhlaWdodCAtIGhpZ2hsaWdodGVkQm9yZGVyLndpZHRoKSxcbiAgICBwb2ludGVyRXZlbnRzOiBcImF1dG9cIixcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBzdHJva2VXaWR0aDogaGlnaGxpZ2h0ZWRCb3JkZXIud2lkdGgsXG4gICAgc3Ryb2tlOiBoaWdobGlnaHRlZEJvcmRlci5jb2xvcixcbiAgICByeDogcm91bmRlZFJhZGl1cyAtIDJcbiAgfSkpKTtcbn1cblN2Z01hc2sucHJvcFR5cGVzID0ge1xuICB3aW5kb3dXaWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB3aW5kb3dIZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdGFyZ2V0V2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdGFyZ2V0SGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHRhcmdldFRvcDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB0YXJnZXRMZWZ0OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHBhZGRpbmc6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcm91bmRlZDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICByb3VuZGVkU3RlcDogUHJvcFR5cGVzLmJvb2wsXG4gIGRpc2FibGVJbnRlcmFjdGlvbjogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgZGlzYWJsZUludGVyYWN0aW9uQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIGhpZ2hsaWdodGVkQm9yZGVyOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZFxuICB9KVxufTtcblxudmFyIFJlYWN0b3VyUmVzaXplT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyIHN0ZXAgPSBfcmVmLnN0ZXAsXG4gICAgcmVmcmVzaCA9IF9yZWYucmVmcmVzaDtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIG11dGF0aW9uc0NvdW50ZXIgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldE11dGF0aW9uc0NvdW50ZXIgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIC8vIG9ubHkgdXNlIHRvIG5vdGlmeSBtYWluIGxvZ2ljIGJlbG93XG4gIC8vIHRoYXQgYSByZXNpemVPYnNlcnZhYmxlIGhhcyBiZWVuIGFkZGVkIHRvIERPTSAob3IgcmVtb3ZlZCBmcm9tIGl0KVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3RlcC5yZXNpemVPYnNlcnZhYmxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5jcmVtZW50TXV0YXRpb25zQ291bnRlcklmT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIGluY3JlbWVudE11dGF0aW9uc0NvdW50ZXJJZk9ic2VydmFibGUobm9kZXMpIHtcbiAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihub2RlcyksXG4gICAgICAgIF9zdGVwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAgICAgdmFyIG5vZGUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAoIW5vZGUuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgcmV0dXJuIDE7IC8vIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBmb3VuZCA9IHN0ZXAucmVzaXplT2JzZXJ2YWJsZXMuZmluZChmdW5jdGlvbiAob2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWF0Y2hlcyhvYnNlcnZhYmxlKSB8fCBub2RlLnF1ZXJ5U2VsZWN0b3Iob2JzZXJ2YWJsZSkgIT0gbnVsbDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIHNldE11dGF0aW9uc0NvdW50ZXIobXV0YXRpb25zQ291bnRlciArIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICBpZiAoX2xvb3AoKSkgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dGF0aW9uc0xpc3QpIHtcbiAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobXV0YXRpb25zTGlzdCksXG4gICAgICAgIF9zdGVwMjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIG11dGF0aW9uID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgIGlmICgwICE9PSBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgaW5jcmVtZW50TXV0YXRpb25zQ291bnRlcklmT2JzZXJ2YWJsZShtdXRhdGlvbi5hZGRlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDAgIT09IG11dGF0aW9uLnJlbW92ZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGluY3JlbWVudE11dGF0aW9uc0NvdW50ZXJJZk9ic2VydmFibGUobXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBvYnNlcnZhYmxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHk7XG4gICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIHN1YnRyZWU6IHRydWVcbiAgICB9O1xuICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShvYnNlcnZhYmxlLCBjb25maWcpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9LCBbc3RlcCwgbXV0YXRpb25zQ291bnRlcl0pO1xuXG4gIC8vIHRoZSBtYWluIGxvZ2ljIGlzIGhlcmVcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN0ZXAucmVzaXplT2JzZXJ2YWJsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgICByZWZyZXNoKCk7XG4gICAgfSk7XG4gICAgdmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzdGVwLnJlc2l6ZU9ic2VydmFibGVzKSxcbiAgICAgIF9zdGVwMztcbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IzLnMoKTsgIShfc3RlcDMgPSBfaXRlcmF0b3IzLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBfc3RlcDMudmFsdWU7XG4gICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvYnNlcnZhYmxlKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IzLmUoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX2l0ZXJhdG9yMy5mKCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfSwgW3N0ZXAsIG11dGF0aW9uc0NvdW50ZXJdKTtcbiAgcmV0dXJuIG51bGw7XG59KTtcblxudmFyIFJlYWN0b3VyTXV0YXRpb25PYnNlcnZlciA9IChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgc3RlcCA9IF9yZWYuc3RlcCxcbiAgICByZWZyZXNoID0gX3JlZi5yZWZyZXNoO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3RlcC5tdXRhdGlvbk9ic2VydmFibGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByZWZyZXNoSGlnaGxpZ2h0ZWRSZWdpb25JZk9ic2VydmFibGUgPSBmdW5jdGlvbiByZWZyZXNoSGlnaGxpZ2h0ZWRSZWdpb25JZk9ic2VydmFibGUobm9kZXMpIHtcbiAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihub2RlcyksXG4gICAgICAgIF9zdGVwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAgICAgdmFyIG5vZGUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAoIW5vZGUuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgcmV0dXJuIDE7IC8vIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBmb3VuZCA9IHN0ZXAubXV0YXRpb25PYnNlcnZhYmxlcy5maW5kKGZ1bmN0aW9uIChvYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5tYXRjaGVzKG9ic2VydmFibGUpIHx8IG5vZGUucXVlcnlTZWxlY3RvcihvYnNlcnZhYmxlKSAhPSBudWxsO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgcmVmcmVzaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICBpZiAoX2xvb3AoKSkgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dGF0aW9uc0xpc3QpIHtcbiAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobXV0YXRpb25zTGlzdCksXG4gICAgICAgIF9zdGVwMjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIG11dGF0aW9uID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgIGlmICgwICE9PSBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVmcmVzaEhpZ2hsaWdodGVkUmVnaW9uSWZPYnNlcnZhYmxlKG11dGF0aW9uLmFkZGVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoMCAhPT0gbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVmcmVzaEhpZ2hsaWdodGVkUmVnaW9uSWZPYnNlcnZhYmxlKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IyLmYoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgb2JzZXJ2YWJsZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5O1xuICAgIHZhciBjb25maWcgPSB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgfTtcbiAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUob2JzZXJ2YWJsZSwgY29uZmlnKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfSwgW3N0ZXBdKTtcbiAgcmV0dXJuIG51bGw7XG59KTtcblxuZnVuY3Rpb24gUG9ydGFsKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIHJlZiA9IHVzZVJlZihudWxsKTtcbiAgaWYgKHJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgcmVmLmN1cnJlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICByZWYuY3VycmVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ19fX3JlYWN0b3VyJyk7XG4gIH1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHJlZi5jdXJyZW50KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChyZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW3JlZl0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL2NyZWF0ZVBvcnRhbChjaGlsZHJlbiwgcmVmLmN1cnJlbnQpO1xufVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBkaXNhYmxlRm9jdXNMb2NrOiBQcm9wVHlwZXMuYm9vbCxcbiAgYmFkZ2VDb250ZW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgaGlnaGxpZ2h0ZWRNYXNrQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm5vZGUsIFByb3BUeXBlcy5lbGVtZW50XSksXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2xvc2VCdXR0b25BcmlhTGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsb3NlV2l0aE1hc2s6IFByb3BUeXBlcy5ib29sLFxuICBpblZpZXdUaHJlc2hvbGQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIGlzT3BlbjogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgbGFzdFN0ZXBOZXh0QnV0dG9uOiBQcm9wVHlwZXMubm9kZSxcbiAgbWFza0NsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgbWFza1NwYWNlOiBQcm9wVHlwZXMubnVtYmVyLFxuICBuZXh0QnV0dG9uOiBQcm9wVHlwZXMubm9kZSxcbiAgb25BZnRlck9wZW46IFByb3BUeXBlcy5mdW5jLFxuICBvbkJlZm9yZUNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25SZXF1ZXN0Q2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuICBwcmV2QnV0dG9uOiBQcm9wVHlwZXMubm9kZSxcbiAgc2Nyb2xsRHVyYXRpb246IFByb3BUeXBlcy5udW1iZXIsXG4gIHNjcm9sbE9mZnNldDogUHJvcFR5cGVzLm51bWJlcixcbiAgc2hvd0J1dHRvbnM6IFByb3BUeXBlcy5ib29sLFxuICBzaG93Q2xvc2VCdXR0b246IFByb3BUeXBlcy5ib29sLFxuICBzaG93TmF2aWdhdGlvbjogUHJvcFR5cGVzLmJvb2wsXG4gIHNob3dOYXZpZ2F0aW9uTnVtYmVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgc2hvd051bWJlcjogUHJvcFR5cGVzLmJvb2wsXG4gIHN0YXJ0QXQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIGdvVG9TdGVwOiBQcm9wVHlwZXMubnVtYmVyLFxuICBnZXRDdXJyZW50U3RlcDogUHJvcFR5cGVzLmZ1bmMsXG4gIG5leHRTdGVwOiBQcm9wVHlwZXMuZnVuYyxcbiAgcHJldlN0ZXA6IFByb3BUeXBlcy5mdW5jLFxuICBzdGVwczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBzZWxlY3RvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjb250ZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubm9kZSwgUHJvcFR5cGVzLmVsZW1lbnQsIFByb3BUeXBlcy5mdW5jXSkuaXNSZXF1aXJlZCxcbiAgICBwb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm51bWJlciksIFByb3BUeXBlcy5vbmVPZihbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCcsICdjZW50ZXInXSldKSxcbiAgICBhY3Rpb246IFByb3BUeXBlcy5mdW5jLFxuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHN0ZXBJbnRlcmFjdGlvbjogUHJvcFR5cGVzLmJvb2wsXG4gICAgbmF2RG90QXJpYUxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHJvdW5kZWRTdGVwOiBQcm9wVHlwZXMuYm9vbFxuICB9KSksXG4gIHVwZGF0ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgdXBkYXRlRGVsYXk6IFByb3BUeXBlcy5udW1iZXIsXG4gIGRpc2FibGVJbnRlcmFjdGlvbjogUHJvcFR5cGVzLmJvb2wsXG4gIGRpc2FibGVEb3RzTmF2aWdhdGlvbjogUHJvcFR5cGVzLmJvb2wsXG4gIGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZihbJ2VzYycsICdyaWdodCcsICdsZWZ0J10pKSwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgcm91bmRlZDogUHJvcFR5cGVzLm51bWJlcixcbiAgYWNjZW50Q29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGhpZ2hsaWdodGVkQm9yZGVyOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZFxuICB9KVxufTtcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGRpc2FibGVGb2N1c0xvY2s6IGZhbHNlLFxuICBzaG93TmF2aWdhdGlvbjogdHJ1ZSxcbiAgc2hvd05hdmlnYXRpb25OdW1iZXI6IHRydWUsXG4gIHNob3dCdXR0b25zOiB0cnVlLFxuICBzaG93Q2xvc2VCdXR0b246IHRydWUsXG4gIGNsb3NlQnV0dG9uQXJpYUxhYmVsOiAnQ2xvc2UnLFxuICBzaG93TnVtYmVyOiB0cnVlLFxuICBzY3JvbGxEdXJhdGlvbjogMSxcbiAgbWFza1NwYWNlOiAxMCxcbiAgdXBkYXRlRGVsYXk6IDEsXG4gIGRpc2FibGVJbnRlcmFjdGlvbjogZmFsc2UsXG4gIHJvdW5kZWQ6IDAsXG4gIGFjY2VudENvbG9yOiAnIzAwN2FmZicsXG4gIGNsb3NlV2l0aE1hc2s6IHRydWVcbn07XG5cbnZhciBDTiA9IHtcbiAgbWFzazoge1xuICAgIGJhc2U6ICdyZWFjdG91cl9fbWFzaycsXG4gICAgaXNPcGVuOiAncmVhY3RvdXJfX21hc2stLWlzLW9wZW4nLFxuICAgIGRpc2FibGVJbnRlcmFjdGlvbjogJ3JlYWN0b3VyX19tYXNrLS1kaXNhYmxlLWludGVyYWN0aW9uJ1xuICB9LFxuICBoZWxwZXI6IHtcbiAgICBiYXNlOiAncmVhY3RvdXJfX2hlbHBlcicsXG4gICAgaXNPcGVuOiAncmVhY3RvdXJfX2hlbHBlci0taXMtb3BlbidcbiAgfSxcbiAgZG90OiB7XG4gICAgYmFzZTogJ3JlYWN0b3VyX19kb3QnLFxuICAgIGFjdGl2ZTogJ3JlYWN0b3VyX19kb3QtLWlzLWFjdGl2ZSdcbiAgfVxufTtcblxudmFyIFRvdXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgZnVuY3Rpb24gVG91cigpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRvdXIpO1xuICAgIF90aGlzID0gX2NhbGxTdXBlcih0aGlzLCBUb3VyKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwidW5sb2NrRm9jdXNcIiwgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzVW5sb2NrZWQ6IHRydWVcbiAgICAgIH0sIGNhbGxiYWNrKCkpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJzaG93U3RlcFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLmhlbHBlciB8fCAhX3RoaXMuaGVscGVyLmN1cnJlbnQpIHJldHVybjtcbiAgICAgIHZhciBzdGVwcyA9IF90aGlzLnByb3BzLnN0ZXBzO1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIGN1cnJlbnQgPSBfdGhpcyRzdGF0ZS5jdXJyZW50LFxuICAgICAgICBmb2N1c1VubG9ja2VkID0gX3RoaXMkc3RhdGUuZm9jdXNVbmxvY2tlZDtcbiAgICAgIGlmIChmb2N1c1VubG9ja2VkKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBmb2N1c1VubG9ja2VkOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBzdGVwID0gc3RlcHNbY3VycmVudF07XG4gICAgICB2YXIgbm9kZSA9IHN0ZXAuc2VsZWN0b3IgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHN0ZXAuc2VsZWN0b3IpIDogbnVsbDtcbiAgICAgIHZhciBzdGVwQ2FsbGJhY2sgPSBmdW5jdGlvbiBzdGVwQ2FsbGJhY2sobykge1xuICAgICAgICBpZiAoc3RlcC5hY3Rpb24gJiYgdHlwZW9mIHN0ZXAuYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgX3RoaXMudW5sb2NrRm9jdXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAuYWN0aW9uKG8pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKHN0ZXAub2JzZXJ2ZSkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzdGVwLm9ic2VydmUpO1xuICAgICAgICB2YXIgY29uZmlnID0ge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgIGlmIChwcmV2U3RhdGUub2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBwcmV2U3RhdGUub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvYnNlcnZlcjogbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dGF0aW9ucykge1xuICAgICAgICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobXV0YXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY2IgPSBmdW5jdGlvbiBjYigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXBDYWxsYmFjayhtdXRhdGlvbi5hZGRlZE5vZGVzWzBdKTtcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNhbGN1bGF0ZU5vZGUobXV0YXRpb24uYWRkZWROb2Rlc1swXSwgc3RlcCwgY2IpO1xuICAgICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIG11dGF0aW9uLnJlbW92ZWROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgX2NiID0gZnVuY3Rpb24gX2NiKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcENhbGxiYWNrKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIF90aGlzLmNhbGN1bGF0ZU5vZGUobm9kZSwgc3RlcCwgX2NiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9O1xuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLnN0YXRlLm9ic2VydmVyLm9ic2VydmUodGFyZ2V0LCBjb25maWcpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfdGhpcy5zdGF0ZS5vYnNlcnZlcikge1xuICAgICAgICAgIF90aGlzLnN0YXRlLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBvYnNlcnZlcjogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICB2YXIgY2IgPSBmdW5jdGlvbiBjYigpIHtcbiAgICAgICAgICByZXR1cm4gc3RlcENhbGxiYWNrKG5vZGUpO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5jYWxjdWxhdGVOb2RlKG5vZGUsIHN0ZXAsIGNiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHNldE5vZGVTdGF0ZShudWxsLCBzdGVwLCBfdGhpcy5oZWxwZXIuY3VycmVudCksIHN0ZXBDYWxsYmFjayk7XG4gICAgICAgIHN0ZXAuc2VsZWN0b3IgJiYgY29uc29sZS53YXJuKFwiRG9lc24ndCBmaW5kIGEgRE9NIG5vZGUgJ1wiLmNvbmNhdChzdGVwLnNlbGVjdG9yLCBcIicuIFBsZWFzZSBjaGVjayB0aGUgJ3N0ZXBzJyBUb3VyIHByb3AgQXJyYXkgYXQgcG9zaXRpb24gXCIpLmNvbmNhdChjdXJyZW50LCBcIi5cIikpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJjYWxjdWxhdGVOb2RlXCIsIGZ1bmN0aW9uIChub2RlLCBzdGVwLCBjYikge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHNjcm9sbER1cmF0aW9uID0gX3RoaXMkcHJvcHMuc2Nyb2xsRHVyYXRpb24sXG4gICAgICAgIGluVmlld1RocmVzaG9sZCA9IF90aGlzJHByb3BzLmluVmlld1RocmVzaG9sZCxcbiAgICAgICAgc2Nyb2xsT2Zmc2V0ID0gX3RoaXMkcHJvcHMuc2Nyb2xsT2Zmc2V0O1xuICAgICAgdmFyIGF0dHJzID0gZ2V0SGlnaGxpZ2h0ZWRSZWN0KG5vZGUsIHN0ZXApO1xuICAgICAgdmFyIHcgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xuICAgICAgdmFyIGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG4gICAgICBpZiAoIWluVmlldyhfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgYXR0cnMpLCB7fSwge1xuICAgICAgICB3OiB3LFxuICAgICAgICBoOiBoLFxuICAgICAgICB0aHJlc2hvbGQ6IGluVmlld1RocmVzaG9sZFxuICAgICAgfSkpKSB7XG4gICAgICAgIHZhciBwYXJlbnRTY3JvbGwgPSBTY3JvbGxwYXJlbnQobm9kZSk7XG4gICAgICAgIHZhciBvZmZzZXQgPSBzY3JvbGxPZmZzZXQgPyBzY3JvbGxPZmZzZXQgOiBhdHRycy5oZWlnaHQgPiBoID8gLTI1IDogLShoIC8gMikgKyBhdHRycy5oZWlnaHQgLyAyO1xuICAgICAgICBzY3JvbGxTbW9vdGgudG8obm9kZSwge1xuICAgICAgICAgIGNvbnRleHQ6IGlzQm9keShwYXJlbnRTY3JvbGwpID8gd2luZG93IDogcGFyZW50U2Nyb2xsLFxuICAgICAgICAgIGR1cmF0aW9uOiBzY3JvbGxEdXJhdGlvbixcbiAgICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobmQpIHtcbiAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHNldE5vZGVTdGF0ZShuZCwgc3RlcCwgX3RoaXMuaGVscGVyLmN1cnJlbnQpLCBjYik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHNldE5vZGVTdGF0ZShub2RlLCBzdGVwLCBfdGhpcy5oZWxwZXIuY3VycmVudCksIGNiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwicmVjYWxjdWxhdGVOb2RlXCIsIGZ1bmN0aW9uIChzdGVwKSB7XG4gICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc3RlcC5zZWxlY3Rvcik7XG4gICAgICB2YXIgc3RlcENhbGxiYWNrID0gZnVuY3Rpb24gc3RlcENhbGxiYWNrKG8pIHtcbiAgICAgICAgaWYgKHN0ZXAuYWN0aW9uICYmIHR5cGVvZiBzdGVwLmFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIF90aGlzLnVubG9ja0ZvY3VzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwLmFjdGlvbihvKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIF90aGlzLmNhbGN1bGF0ZU5vZGUobm9kZSwgc3RlcCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc3RlcENhbGxiYWNrKG5vZGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcIm1hc2tDbGlja0hhbmRsZXJcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgY2xvc2VXaXRoTWFzayA9IF90aGlzJHByb3BzMi5jbG9zZVdpdGhNYXNrLFxuICAgICAgICBvblJlcXVlc3RDbG9zZSA9IF90aGlzJHByb3BzMi5vblJlcXVlc3RDbG9zZTtcbiAgICAgIGlmIChjbG9zZVdpdGhNYXNrICYmICFlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ04ubWFzay5kaXNhYmxlSW50ZXJhY3Rpb24pKSB7XG4gICAgICAgIG9uUmVxdWVzdENsb3NlKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJuZXh0U3RlcFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHN0ZXBzID0gX3RoaXMkcHJvcHMzLnN0ZXBzLFxuICAgICAgICBnZXRDdXJyZW50U3RlcCA9IF90aGlzJHByb3BzMy5nZXRDdXJyZW50U3RlcDtcbiAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgdmFyIG5leHRTdGVwID0gcHJldlN0YXRlLmN1cnJlbnQgPCBzdGVwcy5sZW5ndGggLSAxID8gcHJldlN0YXRlLmN1cnJlbnQgKyAxIDogcHJldlN0YXRlLmN1cnJlbnQ7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0Q3VycmVudFN0ZXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBnZXRDdXJyZW50U3RlcChuZXh0U3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjdXJyZW50OiBuZXh0U3RlcFxuICAgICAgICB9O1xuICAgICAgfSwgX3RoaXMuc2hvd1N0ZXApO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJwcmV2U3RlcFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZ2V0Q3VycmVudFN0ZXAgPSBfdGhpcy5wcm9wcy5nZXRDdXJyZW50U3RlcDtcbiAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgdmFyIG5leHRTdGVwID0gcHJldlN0YXRlLmN1cnJlbnQgPiAwID8gcHJldlN0YXRlLmN1cnJlbnQgLSAxIDogcHJldlN0YXRlLmN1cnJlbnQ7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0Q3VycmVudFN0ZXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBnZXRDdXJyZW50U3RlcChuZXh0U3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjdXJyZW50OiBuZXh0U3RlcFxuICAgICAgICB9O1xuICAgICAgfSwgX3RoaXMuc2hvd1N0ZXApO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJnb3RvU3RlcFwiLCBmdW5jdGlvbiAobikge1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IF90aGlzLnByb3BzLFxuICAgICAgICBzdGVwcyA9IF90aGlzJHByb3BzNC5zdGVwcyxcbiAgICAgICAgZ2V0Q3VycmVudFN0ZXAgPSBfdGhpcyRwcm9wczQuZ2V0Q3VycmVudFN0ZXA7XG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBuZXh0U3RlcCA9IHN0ZXBzW25dID8gbiA6IHByZXZTdGF0ZS5jdXJyZW50O1xuICAgICAgICBpZiAodHlwZW9mIGdldEN1cnJlbnRTdGVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2V0Q3VycmVudFN0ZXAobmV4dFN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY3VycmVudDogbmV4dFN0ZXBcbiAgICAgICAgfTtcbiAgICAgIH0sIF90aGlzLnNob3dTdGVwKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwia2V5RG93bkhhbmRsZXJcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczUgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2UgPSBfdGhpcyRwcm9wczUub25SZXF1ZXN0Q2xvc2UsXG4gICAgICAgIG5leHRTdGVwID0gX3RoaXMkcHJvcHM1Lm5leHRTdGVwLFxuICAgICAgICBwcmV2U3RlcCA9IF90aGlzJHByb3BzNS5wcmV2U3RlcCxcbiAgICAgICAgZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbiA9IF90aGlzJHByb3BzNS5kaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmIChkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBpc0VzY0Rpc2FibGVkLCBpc1JpZ2h0RGlzYWJsZWQsIGlzTGVmdERpc2FibGVkO1xuICAgICAgaWYgKGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb24pIHtcbiAgICAgICAgaXNFc2NEaXNhYmxlZCA9IGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb24uaW5jbHVkZXMoJ2VzYycpO1xuICAgICAgICBpc1JpZ2h0RGlzYWJsZWQgPSBkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uLmluY2x1ZGVzKCdyaWdodCcpO1xuICAgICAgICBpc0xlZnREaXNhYmxlZCA9IGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb24uaW5jbHVkZXMoJ2xlZnQnKTtcbiAgICAgIH1cbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDI3ICYmICFpc0VzY0Rpc2FibGVkKSB7XG4gICAgICAgIC8vIGVzY1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9uUmVxdWVzdENsb3NlKCk7XG4gICAgICB9XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSAzOSAmJiAhaXNSaWdodERpc2FibGVkKSB7XG4gICAgICAgIC8vIHJpZ2h0XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdHlwZW9mIG5leHRTdGVwID09PSAnZnVuY3Rpb24nID8gbmV4dFN0ZXAoKSA6IF90aGlzLm5leHRTdGVwKCk7XG4gICAgICB9XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSAzNyAmJiAhaXNMZWZ0RGlzYWJsZWQpIHtcbiAgICAgICAgLy8gbGVmdFxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHR5cGVvZiBwcmV2U3RlcCA9PT0gJ2Z1bmN0aW9uJyA/IHByZXZTdGVwKCkgOiBfdGhpcy5wcmV2U3RlcCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgIGN1cnJlbnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIHc6IDAsXG4gICAgICBoOiAwLFxuICAgICAgaW5ET006IGZhbHNlLFxuICAgICAgb2JzZXJ2ZXI6IG51bGwsXG4gICAgICBmb2N1c1VubG9ja2VkOiBmYWxzZVxuICAgIH07XG4gICAgX3RoaXMuaGVscGVyID0gLyojX19QVVJFX18qL2NyZWF0ZVJlZigpO1xuICAgIF90aGlzLmhlbHBlckVsZW1lbnQgPSBudWxsO1xuICAgIF90aGlzLmRlYm91bmNlZFNob3dTdGVwID0gZGVib3VuY2UoX3RoaXMuc2hvd1N0ZXAsIDcwKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2luaGVyaXRzKFRvdXIsIF9Db21wb25lbnQpO1xuICByZXR1cm4gX2NyZWF0ZUNsYXNzKFRvdXIsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGlzT3BlbiA9IF90aGlzJHByb3BzNi5pc09wZW4sXG4gICAgICAgIHN0YXJ0QXQgPSBfdGhpcyRwcm9wczYuc3RhcnRBdDtcbiAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgdGhpcy5vcGVuKHN0YXJ0QXQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczcgPSB0aGlzLnByb3BzLFxuICAgICAgICBpc09wZW4gPSBfdGhpcyRwcm9wczcuaXNPcGVuLFxuICAgICAgICB1cGRhdGUgPSBfdGhpcyRwcm9wczcudXBkYXRlLFxuICAgICAgICB1cGRhdGVEZWxheSA9IF90aGlzJHByb3BzNy51cGRhdGVEZWxheTtcbiAgICAgIGlmICghaXNPcGVuICYmIG5leHRQcm9wcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5vcGVuKG5leHRQcm9wcy5zdGFydEF0KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPcGVuICYmICFuZXh0UHJvcHMuaXNPcGVuKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc09wZW4gJiYgdXBkYXRlICE9PSBuZXh0UHJvcHMudXBkYXRlKSB7XG4gICAgICAgIGlmIChuZXh0UHJvcHMuc3RlcHNbdGhpcy5zdGF0ZS5jdXJyZW50XSkge1xuICAgICAgICAgIHNldFRpbWVvdXQodGhpcy5zaG93U3RlcCwgdXBkYXRlRGVsYXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucHJvcHMub25SZXF1ZXN0Q2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzT3BlbiAmJiBuZXh0UHJvcHMuaXNPcGVuICYmIHRoaXMuc3RhdGUuY3VycmVudCAhPT0gbmV4dFByb3BzLmdvVG9TdGVwKSB7XG4gICAgICAgIHRoaXMuZ290b1N0ZXAobmV4dFByb3BzLmdvVG9TdGVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB2YXIgaXNPcGVuID0gdGhpcy5wcm9wcy5pc09wZW47XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXRlLm9ic2VydmVyKSB7XG4gICAgICAgIHRoaXMuc3RhdGUub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvcGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9wZW4oc3RhcnRBdCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB2YXIgb25BZnRlck9wZW4gPSB0aGlzLnByb3BzLm9uQWZ0ZXJPcGVuO1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgICAgIGN1cnJlbnQ6IHN0YXJ0QXQgIT09IHVuZGVmaW5lZCA/IHN0YXJ0QXQgOiBwcmV2U3RhdGUuY3VycmVudFxuICAgICAgICB9O1xuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRUaW1lb3V0KF90aGlzMi5zaG93U3RlcCwgMSk7XG4gICAgICAgIF90aGlzMi5oZWxwZXJFbGVtZW50ID0gX3RoaXMyLmhlbHBlci5jdXJyZW50O1xuICAgICAgICBpZiAoIV90aGlzMi5wcm9wcy5kaXNhYmxlRm9jdXNMb2NrKSBfdGhpczIuaGVscGVyLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgICAgaWYgKG9uQWZ0ZXJPcGVuKSB7XG4gICAgICAgICAgb25BZnRlck9wZW4oX3RoaXMyLmhlbHBlckVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmRlYm91bmNlZFNob3dTdGVwLCBmYWxzZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5RG93bkhhbmRsZXIsIGZhbHNlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgaWYgKHByZXZTdGF0ZS5vYnNlcnZlcikge1xuICAgICAgICAgIHByZXZTdGF0ZS5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc09wZW46IGZhbHNlLFxuICAgICAgICAgIG9ic2VydmVyOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9LCB0aGlzLm9uQmVmb3JlQ2xvc2UpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuZGVib3VuY2VkU2hvd1N0ZXApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleURvd25IYW5kbGVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25CZWZvcmVDbG9zZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkJlZm9yZUNsb3NlKCkge1xuICAgICAgdmFyIG9uQmVmb3JlQ2xvc2UgPSB0aGlzLnByb3BzLm9uQmVmb3JlQ2xvc2U7XG4gICAgICBpZiAob25CZWZvcmVDbG9zZSkge1xuICAgICAgICBvbkJlZm9yZUNsb3NlKHRoaXMuaGVscGVyRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczggPSB0aGlzLnByb3BzLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczguY2xhc3NOYW1lLFxuICAgICAgICBzdGVwcyA9IF90aGlzJHByb3BzOC5zdGVwcyxcbiAgICAgICAgbWFza0NsYXNzTmFtZSA9IF90aGlzJHByb3BzOC5tYXNrQ2xhc3NOYW1lLFxuICAgICAgICBzaG93QnV0dG9ucyA9IF90aGlzJHByb3BzOC5zaG93QnV0dG9ucyxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uID0gX3RoaXMkcHJvcHM4LnNob3dDbG9zZUJ1dHRvbixcbiAgICAgICAgY2xvc2VCdXR0b25BcmlhTGFiZWwgPSBfdGhpcyRwcm9wczguY2xvc2VCdXR0b25BcmlhTGFiZWwsXG4gICAgICAgIHNob3dOYXZpZ2F0aW9uID0gX3RoaXMkcHJvcHM4LnNob3dOYXZpZ2F0aW9uLFxuICAgICAgICBzaG93TmF2aWdhdGlvbk51bWJlciA9IF90aGlzJHByb3BzOC5zaG93TmF2aWdhdGlvbk51bWJlcixcbiAgICAgICAgc2hvd051bWJlciA9IF90aGlzJHByb3BzOC5zaG93TnVtYmVyLFxuICAgICAgICBvblJlcXVlc3RDbG9zZSA9IF90aGlzJHByb3BzOC5vblJlcXVlc3RDbG9zZSxcbiAgICAgICAgbWFza1NwYWNlID0gX3RoaXMkcHJvcHM4Lm1hc2tTcGFjZSxcbiAgICAgICAgbGFzdFN0ZXBOZXh0QnV0dG9uID0gX3RoaXMkcHJvcHM4Lmxhc3RTdGVwTmV4dEJ1dHRvbixcbiAgICAgICAgbmV4dEJ1dHRvbiA9IF90aGlzJHByb3BzOC5uZXh0QnV0dG9uLFxuICAgICAgICBwcmV2QnV0dG9uID0gX3RoaXMkcHJvcHM4LnByZXZCdXR0b24sXG4gICAgICAgIGJhZGdlQ29udGVudCA9IF90aGlzJHByb3BzOC5iYWRnZUNvbnRlbnQsXG4gICAgICAgIGhpZ2hsaWdodGVkTWFza0NsYXNzTmFtZSA9IF90aGlzJHByb3BzOC5oaWdobGlnaHRlZE1hc2tDbGFzc05hbWUsXG4gICAgICAgIGRpc2FibGVJbnRlcmFjdGlvbiA9IF90aGlzJHByb3BzOC5kaXNhYmxlSW50ZXJhY3Rpb24sXG4gICAgICAgIGRpc2FibGVEb3RzTmF2aWdhdGlvbiA9IF90aGlzJHByb3BzOC5kaXNhYmxlRG90c05hdmlnYXRpb24sXG4gICAgICAgIG5leHRTdGVwID0gX3RoaXMkcHJvcHM4Lm5leHRTdGVwLFxuICAgICAgICBwcmV2U3RlcCA9IF90aGlzJHByb3BzOC5wcmV2U3RlcCxcbiAgICAgICAgcm91bmRlZCA9IF90aGlzJHByb3BzOC5yb3VuZGVkLFxuICAgICAgICBhY2NlbnRDb2xvciA9IF90aGlzJHByb3BzOC5hY2NlbnRDb2xvcixcbiAgICAgICAgQ3VzdG9tSGVscGVyID0gX3RoaXMkcHJvcHM4LkN1c3RvbUhlbHBlcixcbiAgICAgICAgZGlzYWJsZUZvY3VzTG9jayA9IF90aGlzJHByb3BzOC5kaXNhYmxlRm9jdXNMb2NrLFxuICAgICAgICBoaWdobGlnaHRlZEJvcmRlciA9IF90aGlzJHByb3BzOC5oaWdobGlnaHRlZEJvcmRlcjtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTIgPSB0aGlzLnN0YXRlLFxuICAgICAgICBpc09wZW4gPSBfdGhpcyRzdGF0ZTIuaXNPcGVuLFxuICAgICAgICBjdXJyZW50ID0gX3RoaXMkc3RhdGUyLmN1cnJlbnQsXG4gICAgICAgIGluRE9NID0gX3RoaXMkc3RhdGUyLmluRE9NLFxuICAgICAgICB0YXJnZXRUb3AgPSBfdGhpcyRzdGF0ZTIudG9wLFxuICAgICAgICB0YXJnZXRSaWdodCA9IF90aGlzJHN0YXRlMi5yaWdodCxcbiAgICAgICAgdGFyZ2V0Qm90dG9tID0gX3RoaXMkc3RhdGUyLmJvdHRvbSxcbiAgICAgICAgdGFyZ2V0TGVmdCA9IF90aGlzJHN0YXRlMi5sZWZ0LFxuICAgICAgICB0YXJnZXRXaWR0aCA9IF90aGlzJHN0YXRlMi53aWR0aCxcbiAgICAgICAgdGFyZ2V0SGVpZ2h0ID0gX3RoaXMkc3RhdGUyLmhlaWdodCxcbiAgICAgICAgd2luZG93V2lkdGggPSBfdGhpcyRzdGF0ZTIudyxcbiAgICAgICAgd2luZG93SGVpZ2h0ID0gX3RoaXMkc3RhdGUyLmgsXG4gICAgICAgIGhlbHBlcldpZHRoID0gX3RoaXMkc3RhdGUyLmhlbHBlcldpZHRoLFxuICAgICAgICBoZWxwZXJIZWlnaHQgPSBfdGhpcyRzdGF0ZTIuaGVscGVySGVpZ2h0LFxuICAgICAgICBoZWxwZXJQb3NpdGlvbiA9IF90aGlzJHN0YXRlMi5oZWxwZXJQb3NpdGlvbjtcbiAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoR2xvYmFsU3R5bGUsIG51bGwpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdG91clJlc2l6ZU9ic2VydmVyLCB7XG4gICAgICAgICAgc3RlcDogc3RlcHNbY3VycmVudF0sXG4gICAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMucmVjYWxjdWxhdGVOb2RlKHN0ZXBzW2N1cnJlbnRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdG91ck11dGF0aW9uT2JzZXJ2ZXIsIHtcbiAgICAgICAgICBzdGVwOiBzdGVwc1tjdXJyZW50XSxcbiAgICAgICAgICByZWZyZXNoOiBmdW5jdGlvbiByZWZyZXNoKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5yZWNhbGN1bGF0ZU5vZGUoc3RlcHNbY3VycmVudF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN2Z01hc2ssIHtcbiAgICAgICAgICBvbkNsaWNrOiB0aGlzLm1hc2tDbGlja0hhbmRsZXIsXG4gICAgICAgICAgZm9yd2FyZFJlZjogZnVuY3Rpb24gZm9yd2FyZFJlZihjKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLm1hc2sgPSBjO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgd2luZG93V2lkdGg6IHdpbmRvd1dpZHRoLFxuICAgICAgICAgIHdpbmRvd0hlaWdodDogd2luZG93SGVpZ2h0LFxuICAgICAgICAgIHRhcmdldFdpZHRoOiB0YXJnZXRXaWR0aCxcbiAgICAgICAgICB0YXJnZXRIZWlnaHQ6IHRhcmdldEhlaWdodCxcbiAgICAgICAgICB0YXJnZXRUb3A6IHRhcmdldFRvcCxcbiAgICAgICAgICB0YXJnZXRMZWZ0OiB0YXJnZXRMZWZ0LFxuICAgICAgICAgIHBhZGRpbmc6IG1hc2tTcGFjZSxcbiAgICAgICAgICByb3VuZGVkOiByb3VuZGVkLFxuICAgICAgICAgIHJvdW5kZWRTdGVwOiBzdGVwc1tjdXJyZW50XS5yb3VuZGVkU3RlcCxcbiAgICAgICAgICBjbGFzc05hbWU6IG1hc2tDbGFzc05hbWUsXG4gICAgICAgICAgZGlzYWJsZUludGVyYWN0aW9uOiBzdGVwc1tjdXJyZW50XS5zdGVwSW50ZXJhY3Rpb24gPT09IGZhbHNlIHx8IGRpc2FibGVJbnRlcmFjdGlvbiA/ICFzdGVwc1tjdXJyZW50XS5zdGVwSW50ZXJhY3Rpb24gOiBkaXNhYmxlSW50ZXJhY3Rpb24sXG4gICAgICAgICAgZGlzYWJsZUludGVyYWN0aW9uQ2xhc3NOYW1lOiBcIlwiLmNvbmNhdChDTi5tYXNrLmRpc2FibGVJbnRlcmFjdGlvbiwgXCIgXCIpLmNvbmNhdChoaWdobGlnaHRlZE1hc2tDbGFzc05hbWUpLFxuICAgICAgICAgIGhpZ2hsaWdodGVkQm9yZGVyOiBoaWdobGlnaHRlZEJvcmRlclxuICAgICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9jdXNMb2NrLCB7XG4gICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVGb2N1c0xvY2ssXG4gICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZVxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChHdWlkZSwge1xuICAgICAgICAgIHJlZjogdGhpcy5oZWxwZXIsXG4gICAgICAgICAgdGFyZ2V0SGVpZ2h0OiB0YXJnZXRIZWlnaHQsXG4gICAgICAgICAgdGFyZ2V0V2lkdGg6IHRhcmdldFdpZHRoLFxuICAgICAgICAgIHRhcmdldFRvcDogdGFyZ2V0VG9wLFxuICAgICAgICAgIHRhcmdldFJpZ2h0OiB0YXJnZXRSaWdodCxcbiAgICAgICAgICB0YXJnZXRCb3R0b206IHRhcmdldEJvdHRvbSxcbiAgICAgICAgICB0YXJnZXRMZWZ0OiB0YXJnZXRMZWZ0LFxuICAgICAgICAgIHdpbmRvd1dpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICAgICAgICB3aW5kb3dIZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICAgICAgICBoZWxwZXJXaWR0aDogaGVscGVyV2lkdGgsXG4gICAgICAgICAgaGVscGVySGVpZ2h0OiBoZWxwZXJIZWlnaHQsXG4gICAgICAgICAgaGVscGVyUG9zaXRpb246IGhlbHBlclBvc2l0aW9uLFxuICAgICAgICAgIHBhZGRpbmc6IG1hc2tTcGFjZSxcbiAgICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgICAgY3VycmVudDogY3VycmVudCxcbiAgICAgICAgICBzdHlsZTogc3RlcHNbY3VycmVudF0uc3R5bGUgPyBzdGVwc1tjdXJyZW50XS5zdHlsZSA6IHt9LFxuICAgICAgICAgIHJvdW5kZWQ6IHJvdW5kZWQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBjbihDTi5oZWxwZXIuYmFzZSwgY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIENOLmhlbHBlci5pc09wZW4sIGlzT3BlbikpLFxuICAgICAgICAgIGFjY2VudENvbG9yOiBhY2NlbnRDb2xvcixcbiAgICAgICAgICBkZWZhdWx0U3R5bGVzOiAhQ3VzdG9tSGVscGVyLFxuICAgICAgICAgIHJvbGU6IFwiZGlhbG9nXCJcbiAgICAgICAgfSwgQ3VzdG9tSGVscGVyID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ3VzdG9tSGVscGVyLCB7XG4gICAgICAgICAgY3VycmVudDogY3VycmVudCxcbiAgICAgICAgICB0b3RhbFN0ZXBzOiBzdGVwcy5sZW5ndGgsXG4gICAgICAgICAgZ290b1N0ZXA6IHRoaXMuZ290b1N0ZXAsXG4gICAgICAgICAgY2xvc2U6IG9uUmVxdWVzdENsb3NlLFxuICAgICAgICAgIGNvbnRlbnQ6IHN0ZXBzW2N1cnJlbnRdICYmICh0eXBlb2Ygc3RlcHNbY3VycmVudF0uY29udGVudCA9PT0gJ2Z1bmN0aW9uJyA/IHN0ZXBzW2N1cnJlbnRdLmNvbnRlbnQoe1xuICAgICAgICAgICAgY2xvc2U6IG9uUmVxdWVzdENsb3NlLFxuICAgICAgICAgICAgZ29UbzogdGhpcy5nb3RvU3RlcCxcbiAgICAgICAgICAgIGluRE9NOiBpbkRPTSxcbiAgICAgICAgICAgIHN0ZXA6IGN1cnJlbnQgKyAxXG4gICAgICAgICAgfSkgOiBzdGVwc1tjdXJyZW50XS5jb250ZW50KVxuICAgICAgICB9LCB0aGlzLnByb3BzLmNoaWxkcmVuKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCB0aGlzLnByb3BzLmNoaWxkcmVuLCBzdGVwc1tjdXJyZW50XSAmJiAodHlwZW9mIHN0ZXBzW2N1cnJlbnRdLmNvbnRlbnQgPT09ICdmdW5jdGlvbicgPyBzdGVwc1tjdXJyZW50XS5jb250ZW50KHtcbiAgICAgICAgICBjbG9zZTogb25SZXF1ZXN0Q2xvc2UsXG4gICAgICAgICAgZ29UbzogdGhpcy5nb3RvU3RlcCxcbiAgICAgICAgICBpbkRPTTogaW5ET00sXG4gICAgICAgICAgc3RlcDogY3VycmVudCArIDFcbiAgICAgICAgfSkgOiBzdGVwc1tjdXJyZW50XS5jb250ZW50KSwgc2hvd051bWJlciAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCYWRnZSwge1xuICAgICAgICAgIFwiZGF0YS10b3VyLWVsZW1cIjogXCJiYWRnZVwiLFxuICAgICAgICAgIGFjY2VudENvbG9yOiBhY2NlbnRDb2xvclxuICAgICAgICB9LCB0eXBlb2YgYmFkZ2VDb250ZW50ID09PSAnZnVuY3Rpb24nID8gYmFkZ2VDb250ZW50KGN1cnJlbnQgKyAxLCBzdGVwcy5sZW5ndGgpIDogY3VycmVudCArIDEpLCAoc2hvd0J1dHRvbnMgfHwgc2hvd05hdmlnYXRpb24pICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRyb2xzLCB7XG4gICAgICAgICAgXCJkYXRhLXRvdXItZWxlbVwiOiBcImNvbnRyb2xzXCJcbiAgICAgICAgfSwgc2hvd0J1dHRvbnMgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQXJyb3ckMSwge1xuICAgICAgICAgIG9uQ2xpY2s6IHR5cGVvZiBwcmV2U3RlcCA9PT0gJ2Z1bmN0aW9uJyA/IHByZXZTdGVwIDogdGhpcy5wcmV2U3RlcCxcbiAgICAgICAgICBkaXNhYmxlZDogY3VycmVudCA9PT0gMCxcbiAgICAgICAgICBsYWJlbDogcHJldkJ1dHRvbiA/IHByZXZCdXR0b24gOiBudWxsXG4gICAgICAgIH0pLCBzaG93TmF2aWdhdGlvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChOYXZpZ2F0aW9uLCB7XG4gICAgICAgICAgXCJkYXRhLXRvdXItZWxlbVwiOiBcIm5hdmlnYXRpb25cIlxuICAgICAgICB9LCBzdGVwcy5tYXAoZnVuY3Rpb24gKHMsIGkpIHtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRG90LCB7XG4gICAgICAgICAgICBrZXk6IFwiXCIuY29uY2F0KHMuc2VsZWN0b3IgPyBzLnNlbGVjdG9yIDogJ3VuZGVmJywgXCJfXCIpLmNvbmNhdChpKSxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczMuZ290b1N0ZXAoaSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3VycmVudDogY3VycmVudCxcbiAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgYWNjZW50Q29sb3I6IGFjY2VudENvbG9yLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGN1cnJlbnQgPT09IGkgfHwgZGlzYWJsZURvdHNOYXZpZ2F0aW9uLFxuICAgICAgICAgICAgc2hvd051bWJlcjogc2hvd05hdmlnYXRpb25OdW1iZXIsXG4gICAgICAgICAgICBcImRhdGEtdG91ci1lbGVtXCI6IFwiZG90XCIsXG4gICAgICAgICAgICBjbGFzc05hbWU6IGNuKENOLmRvdC5iYXNlLCBfZGVmaW5lUHJvcGVydHkoe30sIENOLmRvdC5hY3RpdmUsIGN1cnJlbnQgPT09IGkpKSxcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiOiBzLm5hdkRvdEFyaWFMYWJlbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSksIHNob3dCdXR0b25zICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFycm93JDEsIHtcbiAgICAgICAgICBvbkNsaWNrOiBjdXJyZW50ID09PSBzdGVwcy5sZW5ndGggLSAxID8gbGFzdFN0ZXBOZXh0QnV0dG9uID8gb25SZXF1ZXN0Q2xvc2UgOiBmdW5jdGlvbiAoKSB7fSA6IHR5cGVvZiBuZXh0U3RlcCA9PT0gJ2Z1bmN0aW9uJyA/IG5leHRTdGVwIDogdGhpcy5uZXh0U3RlcCxcbiAgICAgICAgICBkaXNhYmxlZDogIWxhc3RTdGVwTmV4dEJ1dHRvbiAmJiBjdXJyZW50ID09PSBzdGVwcy5sZW5ndGggLSAxLFxuICAgICAgICAgIGludmVydGVkOiB0cnVlLFxuICAgICAgICAgIGxhYmVsOiBsYXN0U3RlcE5leHRCdXR0b24gJiYgY3VycmVudCA9PT0gc3RlcHMubGVuZ3RoIC0gMSA/IGxhc3RTdGVwTmV4dEJ1dHRvbiA6IG5leHRCdXR0b24gPyBuZXh0QnV0dG9uIDogbnVsbFxuICAgICAgICB9KSksIHNob3dDbG9zZUJ1dHRvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdHlsZWRDbG9zZSwge1xuICAgICAgICAgIG9uQ2xpY2s6IG9uUmVxdWVzdENsb3NlLFxuICAgICAgICAgIGNsYXNzTmFtZTogXCJyZWFjdG91cl9fY2xvc2VcIixcbiAgICAgICAgICBhcmlhTGFiZWw6IGNsb3NlQnV0dG9uQXJpYUxhYmVsXG4gICAgICAgIH0pKSkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfV0pO1xufShDb21wb25lbnQpO1xudmFyIHNldE5vZGVTdGF0ZSA9IGZ1bmN0aW9uIHNldE5vZGVTdGF0ZShub2RlLCBzdGVwLCBoZWxwZXIpIHtcbiAgaWYgKCFoZWxwZXIpIHJldHVybjtcbiAgdmFyIHcgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xuICB2YXIgaCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTtcbiAgdmFyIF9oeCRnZXROb2RlUmVjdCA9IGdldE5vZGVSZWN0KGhlbHBlciksXG4gICAgaGVscGVyV2lkdGggPSBfaHgkZ2V0Tm9kZVJlY3Qud2lkdGgsXG4gICAgaGVscGVySGVpZ2h0ID0gX2h4JGdldE5vZGVSZWN0LmhlaWdodDtcbiAgdmFyIGF0dHJzID0ge1xuICAgIHRvcDogaCArIDEwLFxuICAgIHJpZ2h0OiB3IC8gMiArIDksXG4gICAgYm90dG9tOiBoIC8gMiArIDksXG4gICAgbGVmdDogdyAvIDIgLSBoZWxwZXJXaWR0aCAvIDIsXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHc6IHcsXG4gICAgaDogaCxcbiAgICBoZWxwZXJQb3NpdGlvbjogJ2NlbnRlcidcbiAgfTtcbiAgaWYgKG5vZGUpIHtcbiAgICBhdHRycyA9IGdldEhpZ2hsaWdodGVkUmVjdChub2RlLCBzdGVwKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7XG4gICAgICB3OiB3LFxuICAgICAgaDogaCxcbiAgICAgIGhlbHBlcldpZHRoOiBoZWxwZXJXaWR0aCxcbiAgICAgIGhlbHBlckhlaWdodDogaGVscGVySGVpZ2h0LFxuICAgICAgaGVscGVyUG9zaXRpb246IHN0ZXAucG9zaXRpb25cbiAgICB9LCBhdHRycyksIHt9LCB7XG4gICAgICBpbkRPTTogbm9kZSA/IHRydWUgOiBmYWxzZVxuICAgIH0pO1xuICB9O1xufTtcblRvdXIucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuVG91ci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IFRvdXI7XG5leHBvcnQgeyBBcnJvdyQxIGFzIEFycm93LCBCYWRnZSwgU3R5bGVkQ2xvc2UgYXMgQ2xvc2UsIENvbnRyb2xzLCBEb3QsIE5hdmlnYXRpb24gfTtcbiIsIi8qIVxuICBDb3B5cmlnaHQgKGMpIDIwMTggSmVkIFdhdHNvbi5cbiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcbiAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRmdW5jdGlvbiBjbGFzc05hbWVzKCkge1xuXHRcdHZhciBjbGFzc2VzID0gW107XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGFyZyA9IGFyZ3VtZW50c1tpXTtcblx0XHRcdGlmICghYXJnKSBjb250aW51ZTtcblxuXHRcdFx0dmFyIGFyZ1R5cGUgPSB0eXBlb2YgYXJnO1xuXG5cdFx0XHRpZiAoYXJnVHlwZSA9PT0gJ3N0cmluZycgfHwgYXJnVHlwZSA9PT0gJ251bWJlcicpIHtcblx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGFyZyk7XG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuXHRcdFx0XHRpZiAoYXJnLmxlbmd0aCkge1xuXHRcdFx0XHRcdHZhciBpbm5lciA9IGNsYXNzTmFtZXMuYXBwbHkobnVsbCwgYXJnKTtcblx0XHRcdFx0XHRpZiAoaW5uZXIpIHtcblx0XHRcdFx0XHRcdGNsYXNzZXMucHVzaChpbm5lcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdGlmIChhcmcudG9TdHJpbmcgPT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcblx0XHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gYXJnKSB7XG5cdFx0XHRcdFx0XHRpZiAoaGFzT3duLmNhbGwoYXJnLCBrZXkpICYmIGFyZ1trZXldKSB7XG5cdFx0XHRcdFx0XHRcdGNsYXNzZXMucHVzaChrZXkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnLnRvU3RyaW5nKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0Y2xhc3NOYW1lcy5kZWZhdWx0ID0gY2xhc3NOYW1lcztcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuICB2YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG4gIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGdldFN0YWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKFxuICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgICAgICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgJiYgIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICcgK1xuICAgICAgICAgICAgbG9jYXRpb24gKyAnIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAnICsgdHlwZW9mIGVycm9yICsgJy4gJyArXG4gICAgICAgICAgICAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICtcbiAgICAgICAgICAgICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgICB2YXIgc3RhY2sgPSBnZXRTdGFjayA/IGdldFN0YWNrKCkgOiAnJztcblxuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdGYWlsZWQgJyArIGxvY2F0aW9uICsgJyB0eXBlOiAnICsgZXJyb3IubWVzc2FnZSArIChzdGFjayAhPSBudWxsID8gc3RhY2sgOiAnJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVzZXRzIHdhcm5pbmcgY2FjaGUgd2hlbiB0ZXN0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNoZWNrUHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlID0gZnVuY3Rpb24oKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1Byb3BUeXBlcztcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgnLi9jaGVja1Byb3BUeXBlcycpO1xuXG52YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpc1ZhbGlkRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAvKiBnbG9iYWwgU3ltYm9sICovXG4gIHZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbiAgdmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InOyAvLyBCZWZvcmUgU3ltYm9sIHNwZWMuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC5cbiAgICpcbiAgICogQmUgc3VyZSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZXJhYmxlIGFzIGNvbnRleHQ6XG4gICAqXG4gICAqICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obXlJdGVyYWJsZSk7XG4gICAqICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7XG4gICAqICAgICAgIC4uLlxuICAgKiAgICAgfVxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1heWJlSXRlcmFibGVcbiAgICogQHJldHVybiB7P2Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvckZuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyBkZWNsYXJhdGlvbiBhbmQgdmFsaWRhdGlvbiBvZiBwcm9wcyB0aGF0IGFyZVxuICAgKiBzdXBwbGllZCB0byBSZWFjdCBjb21wb25lbnRzLiBFeGFtcGxlIHVzYWdlOlxuICAgKlxuICAgKiAgIHZhciBQcm9wcyA9IHJlcXVpcmUoJ1JlYWN0UHJvcFR5cGVzJyk7XG4gICAqICAgdmFyIE15QXJ0aWNsZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgcHJvcCBuYW1lZCBcImRlc2NyaXB0aW9uXCIuXG4gICAqICAgICAgIGRlc2NyaXB0aW9uOiBQcm9wcy5zdHJpbmcsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcmVxdWlyZWQgZW51bSBwcm9wIG5hbWVkIFwiY2F0ZWdvcnlcIi5cbiAgICogICAgICAgY2F0ZWdvcnk6IFByb3BzLm9uZU9mKFsnTmV3cycsJ1Bob3RvcyddKS5pc1JlcXVpcmVkLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHByb3AgbmFtZWQgXCJkaWFsb2dcIiB0aGF0IHJlcXVpcmVzIGFuIGluc3RhbmNlIG9mIERpYWxvZy5cbiAgICogICAgICAgZGlhbG9nOiBQcm9wcy5pbnN0YW5jZU9mKERpYWxvZykuaXNSZXF1aXJlZFxuICAgKiAgICAgfSxcbiAgICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7IC4uLiB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIEEgbW9yZSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZDpcbiAgICpcbiAgICogICB0eXBlIDo9IGFycmF5fGJvb2x8ZnVuY3xvYmplY3R8bnVtYmVyfHN0cmluZ3xvbmVPZihbLi4uXSl8aW5zdGFuY2VPZiguLi4pXG4gICAqICAgZGVjbCA6PSBSZWFjdFByb3BUeXBlcy57dHlwZX0oLmlzUmVxdWlyZWQpP1xuICAgKlxuICAgKiBFYWNoIGFuZCBldmVyeSBkZWNsYXJhdGlvbiBwcm9kdWNlcyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLiBUaGlzXG4gICAqIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25zLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogIHZhciBNeUxpbmsgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBvciBVUkkgcHJvcCBuYW1lZCBcImhyZWZcIi5cbiAgICogICAgICBocmVmOiBmdW5jdGlvbihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICogICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAqICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHByb3BWYWx1ZSAhPT0gJ3N0cmluZycgJiZcbiAgICogICAgICAgICAgICAhKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFVSSSkpIHtcbiAgICogICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICogICAgICAgICAgICAnRXhwZWN0ZWQgYSBzdHJpbmcgb3IgYW4gVVJJIGZvciAnICsgcHJvcE5hbWUgKyAnIGluICcgK1xuICAgKiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICogICAgICAgICAgKTtcbiAgICogICAgICAgIH1cbiAgICogICAgICB9XG4gICAqICAgIH0sXG4gICAqICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7Li4ufVxuICAgKiAgfSk7XG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuICB2YXIgQU5PTllNT1VTID0gJzw8YW5vbnltb3VzPj4nO1xuXG4gIC8vIEltcG9ydGFudCFcbiAgLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBpbiBgLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdhcnJheScpLFxuICAgIGJvb2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdib29sZWFuJyksXG4gICAgZnVuYzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Z1bmN0aW9uJyksXG4gICAgbnVtYmVyOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignbnVtYmVyJyksXG4gICAgb2JqZWN0OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignb2JqZWN0JyksXG4gICAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3RyaW5nJyksXG4gICAgc3ltYm9sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3ltYm9sJyksXG5cbiAgICBhbnk6IGNyZWF0ZUFueVR5cGVDaGVja2VyKCksXG4gICAgYXJyYXlPZjogY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyLFxuICAgIGVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpLFxuICAgIGVsZW1lbnRUeXBlOiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCksXG4gICAgaW5zdGFuY2VPZjogY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcixcbiAgICBub2RlOiBjcmVhdGVOb2RlQ2hlY2tlcigpLFxuICAgIG9iamVjdE9mOiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyLFxuICAgIG9uZU9mOiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIsXG4gICAgb25lT2ZUeXBlOiBjcmVhdGVVbmlvblR5cGVDaGVja2VyLFxuICAgIHNoYXBlOiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyLFxuICAgIGV4YWN0OiBjcmVhdGVTdHJpY3RTaGFwZVR5cGVDaGVja2VyLFxuICB9O1xuXG4gIC8qKlxuICAgKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICAgKi9cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuICBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gICAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICAgIH1cbiAgfVxuICAvKmVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlKi9cblxuICAvKipcbiAgICogV2UgdXNlIGFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzIHBlb3BsZSBtYXkgY2FsbFxuICAgKiBQcm9wVHlwZXMgZGlyZWN0bHkgYW5kIGluc3BlY3QgdGhlaXIgb3V0cHV0LiBIb3dldmVyLCB3ZSBkb24ndCB1c2UgcmVhbFxuICAgKiBFcnJvcnMgYW55bW9yZS4gV2UgZG9uJ3QgaW5zcGVjdCB0aGVpciBzdGFjayBhbnl3YXksIGFuZCBjcmVhdGluZyB0aGVtXG4gICAqIGlzIHByb2hpYml0aXZlbHkgZXhwZW5zaXZlIGlmIHRoZXkgYXJlIGNyZWF0ZWQgdG9vIG9mdGVuLCBzdWNoIGFzIHdoYXRcbiAgICogaGFwcGVucyBpbiBvbmVPZlR5cGUoKSBmb3IgYW55IHR5cGUgYmVmb3JlIHRoZSBvbmUgdGhhdCBtYXRjaGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gUHJvcFR5cGVFcnJvcihtZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnN0YWNrID0gJyc7XG4gIH1cbiAgLy8gTWFrZSBgaW5zdGFuY2VvZiBFcnJvcmAgc3RpbGwgd29yayBmb3IgcmV0dXJuZWQgZXJyb3JzLlxuICBQcm9wVHlwZUVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZTtcblxuICBmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUgPSB7fTtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA9IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgcHJvcEZ1bGxOYW1lID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgICBpZiAoc2VjcmV0ICE9PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgICBpZiAodGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAgICAgICAgIC8vIE5ldyBiZWhhdmlvciBvbmx5IGZvciB1c2VycyBvZiBgcHJvcC10eXBlc2AgcGFja2FnZVxuICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAnVXNlIGBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKWAgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gT2xkIGJlaGF2aW9yIGZvciBwZW9wbGUgdXNpbmcgUmVhY3QuUHJvcFR5cGVzXG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gY29tcG9uZW50TmFtZSArICc6JyArIHByb3BOYW1lO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gJiZcbiAgICAgICAgICAgIC8vIEF2b2lkIHNwYW1taW5nIHRoZSBjb25zb2xlIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gbm90IGFjdGlvbmFibGUgZXhjZXB0IGZvciBsaWIgYXV0aG9yc1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPCAzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAgICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMgdmFsaWRhdGlvbiAnICtcbiAgICAgICAgICAgICAgJ2Z1bmN0aW9uIGZvciB0aGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBwcm9wIG9uIGAnICsgY29tcG9uZW50TmFtZSAgKyAnYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgK1xuICAgICAgICAgICAgICAnYW5kIHdpbGwgdGhyb3cgaW4gdGhlIHN0YW5kYWxvbmUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgICAnWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyAnICtcbiAgICAgICAgICAgICAgJ2xpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0eXBlcyAnICsgJ2ZvciBkZXRhaWxzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gPSB0cnVlO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICAgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhblxuICAgICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBhcnJheS4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnWycgKyBpICsgJ10nLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIVJlYWN0SXMuaXNWYWxpZEVsZW1lbnRUeXBlKHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50IHR5cGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyKGV4cGVjdGVkQ2xhc3MpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICAgIHZhciBleHBlY3RlZENsYXNzTmFtZSA9IGV4cGVjdGVkQ2xhc3MubmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgYWN0dWFsQ2xhc3NOYW1lICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdpbnN0YW5jZSBvZiBgJyArIGV4cGVjdGVkQ2xhc3NOYW1lICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIoZXhwZWN0ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZXMpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LCBnb3QgJyArIGFyZ3VtZW50cy5sZW5ndGggKyAnIGFyZ3VtZW50cy4gJyArXG4gICAgICAgICAgICAnQSBjb21tb24gbWlzdGFrZSBpcyB0byB3cml0ZSBvbmVPZih4LCB5LCB6KSBpbnN0ZWFkIG9mIG9uZU9mKFt4LCB5LCB6XSkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBhcnJheS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMsIGZ1bmN0aW9uIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIFN0cmluZyhwcm9wVmFsdWUpICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIG9uZSBvZiAnICsgdmFsdWVzU3RyaW5nICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIG9iamVjdC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcFZhbHVlKSB7XG4gICAgICAgIGlmIChoYXMocHJvcFZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVVbmlvblR5cGVDaGVja2VyKGFycmF5T2ZUeXBlQ2hlY2tlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2VycykpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUuIEV4cGVjdGVkIGFuIGFycmF5IG9mIGNoZWNrIGZ1bmN0aW9ucywgYnV0ICcgK1xuICAgICAgICAgICdyZWNlaXZlZCAnICsgZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKGNoZWNrZXIpICsgJyBhdCBpbmRleCAnICsgaSArICcuJ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICAgIGlmIChjaGVja2VyKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTdHJpY3RTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgICB9XG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGFsbCBrZXlzIGluIGNhc2Ugc29tZSBhcmUgcmVxdWlyZWQgYnV0IG1pc3NpbmcgZnJvbVxuICAgICAgLy8gcHJvcHMuXG4gICAgICB2YXIgYWxsS2V5cyA9IGFzc2lnbih7fSwgcHJvcHNbcHJvcE5hbWVdLCBzaGFwZVR5cGVzKTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhbGxLZXlzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAgICAgICAnSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Aga2V5IGAnICsga2V5ICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJyArXG4gICAgICAgICAgICAnXFxuQmFkIG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KHByb3BzW3Byb3BOYW1lXSwgbnVsbCwgJyAgJykgK1xuICAgICAgICAgICAgJ1xcblZhbGlkIGtleXM6ICcgKyAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoc2hhcGVUeXBlcyksIG51bGwsICcgICcpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZShwcm9wVmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wVmFsdWUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuICFwcm9wVmFsdWU7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BWYWx1ZS5ldmVyeShpc05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKHByb3BWYWx1ZSk7XG4gICAgICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKHByb3BWYWx1ZSk7XG4gICAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IHByb3BWYWx1ZS5lbnRyaWVzKSB7XG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIGlmICghaXNOb2RlKHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTm9kZShlbnRyeVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkge1xuICAgIC8vIE5hdGl2ZSBTeW1ib2wuXG4gICAgaWYgKHByb3BUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gZmFsc3kgdmFsdWUgY2FuJ3QgYmUgYSBTeW1ib2xcbiAgICBpZiAoIXByb3BWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnXG4gICAgaWYgKHByb3BWYWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zcGVjIGNvbXBsaWFudCBTeW1ib2xzIHdoaWNoIGFyZSBwb2x5ZmlsbGVkLlxuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gRXF1aXZhbGVudCBvZiBgdHlwZW9mYCBidXQgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciBhcnJheSBhbmQgcmVnZXhwLlxuICBmdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH1cbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBPbGQgd2Via2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhlciB0aGFuXG4gICAgICAvLyAnb2JqZWN0JyBmb3IgdHlwZW9mIGEgUmVnRXhwLiBXZSdsbCBub3JtYWxpemUgdGhpcyBoZXJlIHNvIHRoYXQgL2JsYS9cbiAgICAgIC8vIHBhc3NlcyBQcm9wVHlwZXMub2JqZWN0LlxuICAgICAgcmV0dXJuICdvYmplY3QnO1xuICAgIH1cbiAgICBpZiAoaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gVGhpcyBoYW5kbGVzIG1vcmUgdHlwZXMgdGhhbiBgZ2V0UHJvcFR5cGVgLiBPbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAvLyBTZWUgYGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyYC5cbiAgZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnICsgcHJvcFZhbHVlO1xuICAgIH1cbiAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgIGlmIChwcm9wVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwb3N0Zml4ZWQgdG8gYSB3YXJuaW5nIGFib3V0IGFuIGludmFsaWQgdHlwZS5cbiAgLy8gRm9yIGV4YW1wbGUsIFwidW5kZWZpbmVkXCIgb3IgXCJvZiB0eXBlIGFycmF5XCJcbiAgZnVuY3Rpb24gZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gJ2FuICcgKyB0eXBlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICAgIHJldHVybiAnYSAnICsgdHlwZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuXG4gIGZ1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHtcbiAgICBpZiAoIXByb3BWYWx1ZS5jb25zdHJ1Y3RvciB8fCAhcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpIHtcbiAgICAgIHJldHVybiBBTk9OWU1PVVM7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuXG4gIFJlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzID0gY2hlY2tQcm9wVHlwZXM7XG4gIFJlYWN0UHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlID0gY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGU7XG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKFJlYWN0SXMuaXNFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZWdleFBhcnNlclxuICogUGFyc2VzIGEgc3RyaW5nIGlucHV0LlxuICpcbiAqIEBuYW1lIFJlZ2V4UGFyc2VyXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgc3RyaW5nIGlucHV0IHRoYXQgc2hvdWxkIGJlIHBhcnNlZCBhcyByZWd1bGFyXG4gKiBleHByZXNzaW9uLlxuICogQHJldHVybiB7UmVnRXhwfSBUaGUgcGFyc2VkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqL1xudmFyIFJlZ2V4UGFyc2VyID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAvLyBWYWxpZGF0ZSBpbnB1dFxuICAgIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dC4gSW5wdXQgbXVzdCBiZSBhIHN0cmluZ1wiKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBpbnB1dFxuICAgIHZhciBtID0gaW5wdXQubWF0Y2goLyhcXC8/KSguKylcXDEoW2Etel0qKS9pKTtcblxuICAgIC8vIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsIHRocm93IGFuIGVycm9yXG4gICAgaWYgKCFtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZvcm1hdC5cIik7XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIHZhbGlkIGZsYWdzOiAnZycsICdpJywgJ20nLCAncycsICd1JywgYW5kICd5J1xuICAgIHZhciB2YWxpZEZsYWdzID0gQXJyYXkuZnJvbShuZXcgU2V0KG1bM10pKS5maWx0ZXIoZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgcmV0dXJuIFwiZ2ltc3V5XCIuaW5jbHVkZXMoZmxhZyk7XG4gICAgfSkuam9pbihcIlwiKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgcmVndWxhciBleHByZXNzaW9uXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAobVsyXSwgdmFsaWRGbGFncyk7XG59OyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9zY3JvbGxTbW9vdGggPSByZXF1aXJlKCcuL3Njcm9sbFNtb290aCcpO1xuXG52YXIgX3Njcm9sbFNtb290aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zY3JvbGxTbW9vdGgpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgIF9yZWYkcXVlcnkgPSBfcmVmLnF1ZXJ5LFxuICAgICAgcXVlcnkgPSBfcmVmJHF1ZXJ5ID09PSB1bmRlZmluZWQgPyAnW2hyZWZePVwiI1wiXTpub3QoW2hyZWY9XCIjXCJdJyA6IF9yZWYkcXVlcnksXG4gICAgICBfcmVmJG1hdGNoID0gX3JlZi5tYXRjaCxcbiAgICAgIG1hdGNoID0gX3JlZiRtYXRjaCA9PT0gdW5kZWZpbmVkID8gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXQuaGFzaC5zdWJzdHJpbmcoMSkpO1xuICB9IDogX3JlZiRtYXRjaCxcbiAgICAgIF9yZWYkaGFzaENoYW5nZSA9IF9yZWYuaGFzaENoYW5nZSxcbiAgICAgIGhhc2hDaGFuZ2UgPSBfcmVmJGhhc2hDaGFuZ2UgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBfcmVmJGhhc2hDaGFuZ2UsXG4gICAgICBzY3JvbGxTbW9vdGhDb25maWcgPSBfcmVmLnNjcm9sbFNtb290aENvbmZpZztcblxuICB2YXIgbGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KTtcbiAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiBoYW5kbGVyKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIGRlc3QgPSBtYXRjaChlLnRhcmdldCk7XG5cbiAgICBpZiAoIWRlc3QpIHJldHVybjtcblxuICAgIGlmIChoYXNoQ2hhbmdlKSB7XG4gICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBudWxsLCAnIycgKyBkZXN0LmlkKTtcbiAgICB9XG5cbiAgICAoMCwgX3Njcm9sbFNtb290aDIuZGVmYXVsdCkoZGVzdCwgX2V4dGVuZHMoe30sIHNjcm9sbFNtb290aENvbmZpZykpO1xuICB9O1xuXG4gIEFycmF5LmZyb20obGlua3MpLm1hcChmdW5jdGlvbiAobGluaykge1xuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyLCBmYWxzZSk7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3Njcm9sbFNtb290aCA9IHJlcXVpcmUoJy4vc2Nyb2xsU21vb3RoJyk7XG5cbnZhciBfc2Nyb2xsU21vb3RoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Njcm9sbFNtb290aCk7XG5cbnZhciBfdG9vbHMgPSByZXF1aXJlKCcuL3Rvb2xzJyk7XG5cbnZhciBfYW5jaG9yU2Nyb2xsID0gcmVxdWlyZSgnLi9hbmNob3JTY3JvbGwnKTtcblxudmFyIF9hbmNob3JTY3JvbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYW5jaG9yU2Nyb2xsKTtcblxudmFyIF9vYnNlcnZlID0gcmVxdWlyZSgnLi9vYnNlcnZlJyk7XG5cbnZhciBfb2JzZXJ2ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYnNlcnZlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICB0bzogX3Njcm9sbFNtb290aDIuZGVmYXVsdCxcbiAgY2FsY0VuZFBvaW50OiBfdG9vbHMuY2FsY0VuZFBvaW50LFxuICBhbmNob3JTY3JvbGw6IF9hbmNob3JTY3JvbGwyLmRlZmF1bHQsXG4gIG9ic2VydmU6IF9vYnNlcnZlMi5kZWZhdWx0XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICBfcmVmJGFjdGl2ZUNsYXNzID0gX3JlZi5hY3RpdmVDbGFzcyxcbiAgICAgIGFjdGl2ZUNsYXNzID0gX3JlZiRhY3RpdmVDbGFzcyA9PT0gdW5kZWZpbmVkID8gJ2FjdGl2ZScgOiBfcmVmJGFjdGl2ZUNsYXNzLFxuICAgICAgX3JlZiRxdWVyeSA9IF9yZWYucXVlcnksXG4gICAgICBxdWVyeSA9IF9yZWYkcXVlcnkgPT09IHVuZGVmaW5lZCA/ICdbaHJlZl49XCIjXCJdOm5vdChbaHJlZj1cIiNcIl0pOm5vdChbaHJlZj1cIiMwXCJdKScgOiBfcmVmJHF1ZXJ5LFxuICAgICAgX3JlZiR0aHJlc2hvbGQgPSBfcmVmLnRocmVzaG9sZCxcbiAgICAgIHRocmVzaG9sZCA9IF9yZWYkdGhyZXNob2xkID09PSB1bmRlZmluZWQgPyBbMC4yNSwgMC41LCAwLjc1XSA6IF9yZWYkdGhyZXNob2xkLFxuICAgICAgX3JlZiRkZXRlY3RUeXBlID0gX3JlZi5kZXRlY3RUeXBlLFxuICAgICAgZGV0ZWN0VHlwZSA9IF9yZWYkZGV0ZWN0VHlwZSA9PT0gdW5kZWZpbmVkID8gJ21heCcgOiBfcmVmJGRldGVjdFR5cGU7XG5cbiAgdmFyIG9wdGlvbnMgPSB7IHRocmVzaG9sZDogdGhyZXNob2xkIH07XG5cbiAgdmFyIHJlbW92ZUNsYXNzID0gZnVuY3Rpb24gcmVtb3ZlQ2xhc3Mobm9kZSkge1xuICAgIHJldHVybiBub2RlLmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlQ2xhc3MpO1xuICB9O1xuICB2YXIgYWRkQ2xhc3MgPSBmdW5jdGlvbiBhZGRDbGFzcyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzcyk7XG4gIH07XG5cbiAgdmFyIHVuc2V0QWxsQWN0aXZlcyA9IGZ1bmN0aW9uIHVuc2V0QWxsQWN0aXZlcygpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGFjdGl2ZUNsYXNzKS5mb3JFYWNoKHJlbW92ZUNsYXNzKTtcbiAgfTtcblxuICB2YXIgc2V0QWN0aXZlID0gZnVuY3Rpb24gc2V0QWN0aXZlKGFjdGl2ZU5vZGUpIHtcbiAgICB1bnNldEFsbEFjdGl2ZXMoKTtcbiAgICBhZGRDbGFzcyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhW2hyZWY9XCIjJyArIGFjdGl2ZU5vZGUuaWQgKyAnXCJdJykpO1xuICB9O1xuXG4gIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKGVudHJpZXMpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICBpZiAoZW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gPj0gTWF0aFtkZXRlY3RUeXBlXS5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkodGhyZXNob2xkKSkpIHtcbiAgICAgICAgc2V0QWN0aXZlKGVudHJ5LnRhcmdldCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxdWVyeSk7XG4gIHZhciBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihjYWxsYmFjaywgb3B0aW9ucyk7XG4gIHZhciBvYnNlcnZlVGFyZ2V0ID0gZnVuY3Rpb24gb2JzZXJ2ZVRhcmdldChsaW5rKSB7XG4gICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgbGluay5oYXNoLnNsaWNlKDEpKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRhcmdldCk7XG4gIH07XG5cbiAgbGlua3MuZm9yRWFjaChvYnNlcnZlVGFyZ2V0KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfdG9vbHMgPSByZXF1aXJlKFwiLi90b29sc1wiKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICBfcmVmJGR1cmF0aW9uID0gX3JlZi5kdXJhdGlvbixcbiAgICAgIGR1cmF0aW9uID0gX3JlZiRkdXJhdGlvbiA9PT0gdW5kZWZpbmVkID8gNTAwIDogX3JlZiRkdXJhdGlvbixcbiAgICAgIF9yZWYkY29udGV4dCA9IF9yZWYuY29udGV4dCxcbiAgICAgIGNvbnRleHQgPSBfcmVmJGNvbnRleHQgPT09IHVuZGVmaW5lZCA/IHdpbmRvdyA6IF9yZWYkY29udGV4dCxcbiAgICAgIF9yZWYkb2Zmc2V0ID0gX3JlZi5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfcmVmJG9mZnNldCA9PT0gdW5kZWZpbmVkID8gMCA6IF9yZWYkb2Zmc2V0LFxuICAgICAgX3JlZiRlYXNlID0gX3JlZi5lYXNlLFxuICAgICAgZWFzZSA9IF9yZWYkZWFzZSA9PT0gdW5kZWZpbmVkID8gXCJlYXNlSW5PdXRDdWJpY1wiIDogX3JlZiRlYXNlLFxuICAgICAgY2FsbGJhY2sgPSBfcmVmLmNhbGxiYWNrO1xuXG4gIGlmICgodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKHdpbmRvdykpICE9PSBcIm9iamVjdFwiKSByZXR1cm47XG5cbiAgdmFyIHN0YXJ0ID0gY29udGV4dC5zY3JvbGxUb3AgIT09IG51bGwgJiYgY29udGV4dC5zY3JvbGxUb3AgIT09IHVuZGVmaW5lZCA/IGNvbnRleHQuc2Nyb2xsVG9wIDogd2luZG93LnBhZ2VZT2Zmc2V0O1xuICB2YXIgZW5kID0gKDAsIF90b29scy5jYWxjRW5kUG9pbnQpKHRhcmdldCwgY29udGV4dCwgb2Zmc2V0KTtcbiAgdmFyIGNsb2NrID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIHZhciByQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG4gIHZhciB0aWNrID0gZnVuY3Rpb24gdGljaygpIHtcbiAgICB2YXIgZWxhcHNlZCA9IHBlcmZvcm1hbmNlLm5vdygpIC0gY2xvY2s7XG4gICAgdmFyIHBvcyA9ICgwLCBfdG9vbHMuc2V0UG9zaXRpb24pKHN0YXJ0LCBlbmQsIGVsYXBzZWQsIGR1cmF0aW9uLCBlYXNlKTtcbiAgICBpZiAoY29udGV4dCAhPT0gd2luZG93KSB7XG4gICAgICBjb250ZXh0LnNjcm9sbFRvcCA9IHBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LnNjcm9sbCgwLCBwb3MpO1xuICAgIH1cblxuICAgIGlmIChlbGFwc2VkID4gZHVyYXRpb24pIHtcbiAgICAgIHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiICYmIGNhbGxiYWNrKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJBRih0aWNrKTtcbiAgICB9XG4gIH07XG5cbiAgdGljaygpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG52YXIgZWFzZUZ1bmN0aW9ucyA9IGV4cG9ydHMuZWFzZUZ1bmN0aW9ucyA9IHtcbiAgbGluZWFyOiBmdW5jdGlvbiBsaW5lYXIodCkge1xuICAgIHJldHVybiB0O1xuICB9LFxuICBlYXNlSW5RdWFkOiBmdW5jdGlvbiBlYXNlSW5RdWFkKHQpIHtcbiAgICByZXR1cm4gdCAqIHQ7XG4gIH0sXG4gIGVhc2VPdXRRdWFkOiBmdW5jdGlvbiBlYXNlT3V0UXVhZCh0KSB7XG4gICAgcmV0dXJuIHQgKiAoMiAtIHQpO1xuICB9LFxuICBlYXNlSW5PdXRRdWFkOiBmdW5jdGlvbiBlYXNlSW5PdXRRdWFkKHQpIHtcbiAgICByZXR1cm4gdCA8IC41ID8gMiAqIHQgKiB0IDogLTEgKyAoNCAtIDIgKiB0KSAqIHQ7XG4gIH0sXG4gIGVhc2VJbkN1YmljOiBmdW5jdGlvbiBlYXNlSW5DdWJpYyh0KSB7XG4gICAgcmV0dXJuIHQgKiB0ICogdDtcbiAgfSxcbiAgZWFzZU91dEN1YmljOiBmdW5jdGlvbiBlYXNlT3V0Q3ViaWModCkge1xuICAgIHJldHVybiAtLXQgKiB0ICogdCArIDE7XG4gIH0sXG4gIGVhc2VJbk91dEN1YmljOiBmdW5jdGlvbiBlYXNlSW5PdXRDdWJpYyh0KSB7XG4gICAgcmV0dXJuIHQgPCAuNSA/IDQgKiB0ICogdCAqIHQgOiAodCAtIDEpICogKDIgKiB0IC0gMikgKiAoMiAqIHQgLSAyKSArIDE7XG4gIH0sXG4gIGVhc2VJblF1YXJ0OiBmdW5jdGlvbiBlYXNlSW5RdWFydCh0KSB7XG4gICAgcmV0dXJuIHQgKiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VPdXRRdWFydDogZnVuY3Rpb24gZWFzZU91dFF1YXJ0KHQpIHtcbiAgICByZXR1cm4gMSAtIC0tdCAqIHQgKiB0ICogdDtcbiAgfSxcbiAgZWFzZUluT3V0UXVhcnQ6IGZ1bmN0aW9uIGVhc2VJbk91dFF1YXJ0KHQpIHtcbiAgICByZXR1cm4gdCA8IC41ID8gOCAqIHQgKiB0ICogdCAqIHQgOiAxIC0gOCAqIC0tdCAqIHQgKiB0ICogdDtcbiAgfSxcbiAgZWFzZUluUXVpbnQ6IGZ1bmN0aW9uIGVhc2VJblF1aW50KHQpIHtcbiAgICByZXR1cm4gdCAqIHQgKiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VPdXRRdWludDogZnVuY3Rpb24gZWFzZU91dFF1aW50KHQpIHtcbiAgICByZXR1cm4gMSArIC0tdCAqIHQgKiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VJbk91dFF1aW50OiBmdW5jdGlvbiBlYXNlSW5PdXRRdWludCh0KSB7XG4gICAgcmV0dXJuIHQgPCAuNSA/IDE2ICogdCAqIHQgKiB0ICogdCAqIHQgOiAxICsgMTYgKiAtLXQgKiB0ICogdCAqIHQgKiB0O1xuICB9XG59O1xuXG52YXIgaXNOdW1lcmljID0gZXhwb3J0cy5pc051bWVyaWMgPSBmdW5jdGlvbiBpc051bWVyaWMobikge1xuICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xufTtcblxudmFyIHNldFBvc2l0aW9uID0gZXhwb3J0cy5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIHNldFBvc2l0aW9uKGJlZ2luLCBlbmQsIGVsYXBzZWQsIGR1cmF0aW9uKSB7XG4gIHZhciBlYXNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAnZWFzZUluT3V0Q3ViaWMnO1xuXG4gIHJldHVybiBlbGFwc2VkID4gZHVyYXRpb24gPyBlbmQgOiBiZWdpbiArIChlbmQgLSBiZWdpbikgKiBlYXNlRnVuY3Rpb25zW2Vhc2VdKGVsYXBzZWQgLyBkdXJhdGlvbik7XG59O1xuXG52YXIgY2FsY0VuZFBvaW50ID0gZXhwb3J0cy5jYWxjRW5kUG9pbnQgPSBmdW5jdGlvbiBjYWxjRW5kUG9pbnQodGFyZ2V0KSB7XG4gIHZhciBjb250ZXh0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB3aW5kb3c7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG5cbiAgaWYgKGlzTnVtZXJpYyh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRhcmdldCkgKyBvZmZzZXQ7XG4gIH1cblxuICB2YXIgeSA9IGNvbnRleHQgPT09IHdpbmRvdyB8fCBjb250ZXh0ID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgPyB3aW5kb3cucGFnZVlPZmZzZXQgOiBjb250ZXh0LnNjcm9sbFRvcCAtIGNvbnRleHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuXG4gIHZhciBkaXN0YW5jZSA9IHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaHRtbCcgPyAteSA6IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB5O1xuXG4gIHJldHVybiBkaXN0YW5jZSArIG9mZnNldDtcbn07IiwiKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuU2Nyb2xscGFyZW50ID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlZ2V4ID0gLyhhdXRvfHNjcm9sbCkvO1xuXG4gIHZhciBwYXJlbnRzID0gZnVuY3Rpb24gKG5vZGUsIHBzKSB7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSA9PT0gbnVsbCkgeyByZXR1cm4gcHM7IH1cblxuICAgIHJldHVybiBwYXJlbnRzKG5vZGUucGFyZW50Tm9kZSwgcHMuY29uY2F0KFtub2RlXSkpO1xuICB9O1xuXG4gIHZhciBzdHlsZSA9IGZ1bmN0aW9uIChub2RlLCBwcm9wKSB7XG4gICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKTtcbiAgfTtcblxuICB2YXIgb3ZlcmZsb3cgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBzdHlsZShub2RlLCBcIm92ZXJmbG93XCIpICsgc3R5bGUobm9kZSwgXCJvdmVyZmxvdy15XCIpICsgc3R5bGUobm9kZSwgXCJvdmVyZmxvdy14XCIpO1xuICB9O1xuXG4gIHZhciBzY3JvbGwgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgcmV0dXJuIHJlZ2V4LnRlc3Qob3ZlcmZsb3cobm9kZSkpO1xuICB9O1xuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiA7XG4gICAgfVxuXG4gICAgdmFyIHBzID0gcGFyZW50cyhub2RlLnBhcmVudE5vZGUsIFtdKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmIChzY3JvbGwocHNbaV0pKSB7XG4gICAgICAgIHJldHVybiBwc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH07XG5cbiAgcmV0dXJuIHNjcm9sbFBhcmVudDtcbn0pKTtcbiIsIi8vXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIsIGNvbXBhcmUsIGNvbXBhcmVDb250ZXh0KSB7XG4gIHZhciByZXQgPSBjb21wYXJlID8gY29tcGFyZS5jYWxsKGNvbXBhcmVDb250ZXh0LCBvYmpBLCBvYmpCKSA6IHZvaWQgMDtcblxuICBpZiAocmV0ICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gISFyZXQ7XG4gIH1cblxuICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSBcIm9iamVjdFwiIHx8ICFvYmpBIHx8IHR5cGVvZiBvYmpCICE9PSBcIm9iamVjdFwiIHx8ICFvYmpCKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBiSGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmJpbmQob2JqQik7XG5cbiAgLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cbiAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwga2V5c0EubGVuZ3RoOyBpZHgrKykge1xuICAgIHZhciBrZXkgPSBrZXlzQVtpZHhdO1xuXG4gICAgaWYgKCFiSGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZUEgPSBvYmpBW2tleV07XG4gICAgdmFyIHZhbHVlQiA9IG9iakJba2V5XTtcblxuICAgIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIHZhbHVlQSwgdmFsdWVCLCBrZXkpIDogdm9pZCAwO1xuXG4gICAgaWYgKHJldCA9PT0gZmFsc2UgfHwgKHJldCA9PT0gdm9pZCAwICYmIHZhbHVlQSAhPT0gdmFsdWVCKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3JlYWN0LWRhdGVwaWNrZXIuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3JlYWN0LWRhdGVwaWNrZXIuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9pbmRleC5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9pbmRleC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL29wZW5zaWduZHJpdmUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vb3BlbnNpZ25kcml2ZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NpZ25hdHVyZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zaWduYXR1cmUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzdHlsZXNJbkRPTSA9IFtdO1xuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuICAgIGlmIChpbmRleEJ5SWRlbnRpZmllciAhPT0gLTEpIHtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS5yZWZlcmVuY2VzKys7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0udXBkYXRlcihvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXBkYXRlciA9IGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5ieUluZGV4ID0gaTtcbiAgICAgIHN0eWxlc0luRE9NLnNwbGljZShpLCAwLCB7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IHVwZGF0ZXIsXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cbmZ1bmN0aW9uIGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpIHtcbiAgdmFyIGFwaSA9IG9wdGlvbnMuZG9tQVBJKG9wdGlvbnMpO1xuICBhcGkudXBkYXRlKG9iaik7XG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZXI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cbiAgICB2YXIgbmV3TGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKG5ld0xpc3QsIG9wdGlvbnMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcbiAgICAgIGlmIChzdHlsZXNJbkRPTVtfaW5kZXhdLnJlZmVyZW5jZXMgPT09IDApIHtcbiAgICAgICAgc3R5bGVzSW5ET01bX2luZGV4XS51cGRhdGVyKCk7XG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cbiAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRCeVNlbGVjdG9yKGluc2VydCwgc3R5bGUpIHtcbiAgdmFyIHRhcmdldCA9IGdldFRhcmdldChpbnNlcnQpO1xuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0QnlTZWxlY3RvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwiQG1lZGlhIFwiLmNvbmNhdChvYmoubWVkaWEsIFwiIHtcIik7XG4gIH1cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cbiAgY3NzICs9IG9iai5jc3M7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH1cblxuICAvLyBGb3Igb2xkIElFXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7fSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICB9O1xuICB9XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiLCJpbXBvcnR7dHlwZU9mIGFzIGUsaXNFbGVtZW50IGFzIHQsaXNWYWxpZEVsZW1lbnRUeXBlIGFzIG59ZnJvbVwicmVhY3QtaXNcIjtpbXBvcnQgcix7dXNlU3RhdGUgYXMgbyx1c2VDb250ZXh0IGFzIHMsdXNlTWVtbyBhcyBpLHVzZUVmZmVjdCBhcyBhLHVzZVJlZiBhcyBjLGNyZWF0ZUVsZW1lbnQgYXMgdSx1c2VMYXlvdXRFZmZlY3QgYXMgbH1mcm9tXCJyZWFjdFwiO2ltcG9ydCBkIGZyb21cInNoYWxsb3dlcXVhbFwiO2ltcG9ydCBoIGZyb21cIkBlbW90aW9uL3N0eWxpc1wiO2ltcG9ydCBwIGZyb21cIkBlbW90aW9uL3VuaXRsZXNzXCI7aW1wb3J0IGYgZnJvbVwiQGVtb3Rpb24vaXMtcHJvcC12YWxpZFwiO2ltcG9ydCBtIGZyb21cImhvaXN0LW5vbi1yZWFjdC1zdGF0aWNzXCI7ZnVuY3Rpb24geSgpe3JldHVybih5PU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIHY9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W2VbMF1dLHI9MCxvPXQubGVuZ3RoO3I8bztyKz0xKW4ucHVzaCh0W3JdLGVbcisxXSk7cmV0dXJuIG59LGc9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10JiZcIm9iamVjdFwiPT10eXBlb2YgdCYmXCJbb2JqZWN0IE9iamVjdF1cIj09PSh0LnRvU3RyaW5nP3QudG9TdHJpbmcoKTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpJiYhZSh0KX0sUz1PYmplY3QuZnJlZXplKFtdKSx3PU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIEUoZSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgZX1mdW5jdGlvbiBiKGUpe3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwic3RyaW5nXCI9PXR5cGVvZiBlJiZlfHxlLmRpc3BsYXlOYW1lfHxlLm5hbWV8fFwiQ29tcG9uZW50XCJ9ZnVuY3Rpb24gXyhlKXtyZXR1cm4gZSYmXCJzdHJpbmdcIj09dHlwZW9mIGUuc3R5bGVkQ29tcG9uZW50SWR9dmFyIE49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHByb2Nlc3MmJnZvaWQgMCE9PXByb2Nlc3MuZW52JiYocHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NDX0FUVFJ8fHByb2Nlc3MuZW52LlNDX0FUVFIpfHxcImRhdGEtc3R5bGVkXCIsQT1cIjUuMy4xMVwiLEM9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmXCJIVE1MRWxlbWVudFwiaW4gd2luZG93LEk9Qm9vbGVhbihcImJvb2xlYW5cIj09dHlwZW9mIFNDX0RJU0FCTEVfU1BFRURZP1NDX0RJU0FCTEVfU1BFRURZOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBwcm9jZXNzJiZ2b2lkIDAhPT1wcm9jZXNzLmVudiYmKHZvaWQgMCE9PXByb2Nlc3MuZW52LlJFQUNUX0FQUF9TQ19ESVNBQkxFX1NQRUVEWSYmXCJcIiE9PXByb2Nlc3MuZW52LlJFQUNUX0FQUF9TQ19ESVNBQkxFX1NQRUVEWT9cImZhbHNlXCIhPT1wcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfRElTQUJMRV9TUEVFRFkmJnByb2Nlc3MuZW52LlJFQUNUX0FQUF9TQ19ESVNBQkxFX1NQRUVEWTp2b2lkIDAhPT1wcm9jZXNzLmVudi5TQ19ESVNBQkxFX1NQRUVEWSYmXCJcIiE9PXByb2Nlc3MuZW52LlNDX0RJU0FCTEVfU1BFRURZP1wiZmFsc2VcIiE9PXByb2Nlc3MuZW52LlNDX0RJU0FCTEVfU1BFRURZJiZwcm9jZXNzLmVudi5TQ19ESVNBQkxFX1NQRUVEWTpcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WKSksUD17fSxPPVwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlY/ezE6XCJDYW5ub3QgY3JlYXRlIHN0eWxlZC1jb21wb25lbnQgZm9yIGNvbXBvbmVudDogJXMuXFxuXFxuXCIsMjpcIkNhbid0IGNvbGxlY3Qgc3R5bGVzIG9uY2UgeW91J3ZlIGNvbnN1bWVkIGEgYFNlcnZlclN0eWxlU2hlZXRgJ3Mgc3R5bGVzISBgU2VydmVyU3R5bGVTaGVldGAgaXMgYSBvbmUgb2ZmIGluc3RhbmNlIGZvciBlYWNoIHNlcnZlci1zaWRlIHJlbmRlciBjeWNsZS5cXG5cXG4tIEFyZSB5b3UgdHJ5aW5nIHRvIHJldXNlIGl0IGFjcm9zcyByZW5kZXJzP1xcbi0gQXJlIHlvdSBhY2NpZGVudGFsbHkgY2FsbGluZyBjb2xsZWN0U3R5bGVzIHR3aWNlP1xcblxcblwiLDM6XCJTdHJlYW1pbmcgU1NSIGlzIG9ubHkgc3VwcG9ydGVkIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudDsgUGxlYXNlIGRvIG5vdCB0cnkgdG8gY2FsbCB0aGlzIG1ldGhvZCBpbiB0aGUgYnJvd3Nlci5cXG5cXG5cIiw0OlwiVGhlIGBTdHlsZVNoZWV0TWFuYWdlcmAgZXhwZWN0cyBhIHZhbGlkIHRhcmdldCBvciBzaGVldCBwcm9wIVxcblxcbi0gRG9lcyB0aGlzIGVycm9yIG9jY3VyIG9uIHRoZSBjbGllbnQgYW5kIGlzIHlvdXIgdGFyZ2V0IGZhbHN5P1xcbi0gRG9lcyB0aGlzIGVycm9yIG9jY3VyIG9uIHRoZSBzZXJ2ZXIgYW5kIGlzIHRoZSBzaGVldCBmYWxzeT9cXG5cXG5cIiw1OlwiVGhlIGNsb25lIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCBvbiB0aGUgY2xpZW50IVxcblxcbi0gQXJlIHlvdSBydW5uaW5nIGluIGEgY2xpZW50LWxpa2UgZW52aXJvbm1lbnQgb24gdGhlIHNlcnZlcj9cXG4tIEFyZSB5b3UgdHJ5aW5nIHRvIHJ1biBTU1Igb24gdGhlIGNsaWVudD9cXG5cXG5cIiw2OlwiVHJ5aW5nIHRvIGluc2VydCBhIG5ldyBzdHlsZSB0YWcsIGJ1dCB0aGUgZ2l2ZW4gTm9kZSBpcyB1bm1vdW50ZWQhXFxuXFxuLSBBcmUgeW91IHVzaW5nIGEgY3VzdG9tIHRhcmdldCB0aGF0IGlzbid0IG1vdW50ZWQ/XFxuLSBEb2VzIHlvdXIgZG9jdW1lbnQgbm90IGhhdmUgYSB2YWxpZCBoZWFkIGVsZW1lbnQ/XFxuLSBIYXZlIHlvdSBhY2NpZGVudGFsbHkgcmVtb3ZlZCBhIHN0eWxlIHRhZyBtYW51YWxseT9cXG5cXG5cIiw3OidUaGVtZVByb3ZpZGVyOiBQbGVhc2UgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHlvdXIgXCJ0aGVtZVwiIHByb3AgZnVuY3Rpb24sIGUuZy5cXG5cXG5gYGBqc1xcbnRoZW1lPXsoKSA9PiAoe30pfVxcbmBgYFxcblxcbicsODonVGhlbWVQcm92aWRlcjogUGxlYXNlIG1ha2UgeW91ciBcInRoZW1lXCIgcHJvcCBhbiBvYmplY3QuXFxuXFxuJyw5OlwiTWlzc2luZyBkb2N1bWVudCBgPGhlYWQ+YFxcblxcblwiLDEwOlwiQ2Fubm90IGZpbmQgYSBTdHlsZVNoZWV0IGluc3RhbmNlLiBVc3VhbGx5IHRoaXMgaGFwcGVucyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29waWVzIG9mIHN0eWxlZC1jb21wb25lbnRzIGxvYWRlZCBhdCBvbmNlLiBDaGVjayBvdXQgdGhpcyBpc3N1ZSBmb3IgaG93IHRvIHRyb3VibGVzaG9vdCBhbmQgZml4IHRoZSBjb21tb24gY2FzZXMgd2hlcmUgdGhpcyBzaXR1YXRpb24gY2FuIGhhcHBlbjogaHR0cHM6Ly9naXRodWIuY29tL3N0eWxlZC1jb21wb25lbnRzL3N0eWxlZC1jb21wb25lbnRzL2lzc3Vlcy8xOTQxI2lzc3VlY29tbWVudC00MTc4NjIwMjFcXG5cXG5cIiwxMTpcIl9UaGlzIGVycm9yIHdhcyByZXBsYWNlZCB3aXRoIGEgZGV2LXRpbWUgd2FybmluZywgaXQgd2lsbCBiZSBkZWxldGVkIGZvciB2NCBmaW5hbC5fIFtjcmVhdGVHbG9iYWxTdHlsZV0gcmVjZWl2ZWQgY2hpbGRyZW4gd2hpY2ggd2lsbCBub3QgYmUgcmVuZGVyZWQuIFBsZWFzZSB1c2UgdGhlIGNvbXBvbmVudCB3aXRob3V0IHBhc3NpbmcgY2hpbGRyZW4gZWxlbWVudHMuXFxuXFxuXCIsMTI6XCJJdCBzZWVtcyB5b3UgYXJlIGludGVycG9sYXRpbmcgYSBrZXlmcmFtZSBkZWNsYXJhdGlvbiAoJXMpIGludG8gYW4gdW50YWdnZWQgc3RyaW5nLiBUaGlzIHdhcyBzdXBwb3J0ZWQgaW4gc3R5bGVkLWNvbXBvbmVudHMgdjMsIGJ1dCBpcyBub3QgbG9uZ2VyIHN1cHBvcnRlZCBpbiB2NCBhcyBrZXlmcmFtZXMgYXJlIG5vdyBpbmplY3RlZCBvbi1kZW1hbmQuIFBsZWFzZSB3cmFwIHlvdXIgc3RyaW5nIGluIHRoZSBjc3NcXFxcYFxcXFxgIGhlbHBlciB3aGljaCBlbnN1cmVzIHRoZSBzdHlsZXMgYXJlIGluamVjdGVkIGNvcnJlY3RseS4gU2VlIGh0dHBzOi8vd3d3LnN0eWxlZC1jb21wb25lbnRzLmNvbS9kb2NzL2FwaSNjc3NcXG5cXG5cIiwxMzpcIiVzIGlzIG5vdCBhIHN0eWxlZCBjb21wb25lbnQgYW5kIGNhbm5vdCBiZSByZWZlcnJlZCB0byB2aWEgY29tcG9uZW50IHNlbGVjdG9yLiBTZWUgaHR0cHM6Ly93d3cuc3R5bGVkLWNvbXBvbmVudHMuY29tL2RvY3MvYWR2YW5jZWQjcmVmZXJyaW5nLXRvLW90aGVyLWNvbXBvbmVudHMgZm9yIG1vcmUgZGV0YWlscy5cXG5cXG5cIiwxNDonVGhlbWVQcm92aWRlcjogXCJ0aGVtZVwiIHByb3AgaXMgcmVxdWlyZWQuXFxuXFxuJywxNTpcIkEgc3R5bGlzIHBsdWdpbiBoYXMgYmVlbiBzdXBwbGllZCB0aGF0IGlzIG5vdCBuYW1lZC4gV2UgbmVlZCBhIG5hbWUgZm9yIGVhY2ggcGx1Z2luIHRvIGJlIGFibGUgdG8gcHJldmVudCBzdHlsaW5nIGNvbGxpc2lvbnMgYmV0d2VlbiBkaWZmZXJlbnQgc3R5bGlzIGNvbmZpZ3VyYXRpb25zIHdpdGhpbiB0aGUgc2FtZSBhcHAuIEJlZm9yZSB5b3UgcGFzcyB5b3VyIHBsdWdpbiB0byBgPFN0eWxlU2hlZXRNYW5hZ2VyIHN0eWxpc1BsdWdpbnM9e1tdfT5gLCBwbGVhc2UgbWFrZSBzdXJlIGVhY2ggcGx1Z2luIGlzIHVuaXF1ZWx5LW5hbWVkLCBlLmcuXFxuXFxuYGBganNcXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoaW1wb3J0ZWRQbHVnaW4sICduYW1lJywgeyB2YWx1ZTogJ3NvbWUtdW5pcXVlLW5hbWUnIH0pO1xcbmBgYFxcblxcblwiLDE2OlwiUmVhY2hlZCB0aGUgbGltaXQgb2YgaG93IG1hbnkgc3R5bGVkIGNvbXBvbmVudHMgbWF5IGJlIGNyZWF0ZWQgYXQgZ3JvdXAgJXMuXFxuWW91IG1heSBvbmx5IGNyZWF0ZSB1cCB0byAxLDA3Myw3NDEsODI0IGNvbXBvbmVudHMuIElmIHlvdSdyZSBjcmVhdGluZyBjb21wb25lbnRzIGR5bmFtaWNhbGx5LFxcbmFzIGZvciBpbnN0YW5jZSBpbiB5b3VyIHJlbmRlciBtZXRob2QgdGhlbiB5b3UgbWF5IGJlIHJ1bm5pbmcgaW50byB0aGlzIGxpbWl0YXRpb24uXFxuXFxuXCIsMTc6XCJDU1NTdHlsZVNoZWV0IGNvdWxkIG5vdCBiZSBmb3VuZCBvbiBIVE1MU3R5bGVFbGVtZW50LlxcbkhhcyBzdHlsZWQtY29tcG9uZW50cycgc3R5bGUgdGFnIGJlZW4gdW5tb3VudGVkIG9yIGFsdGVyZWQgYnkgYW5vdGhlciBzY3JpcHQ/XFxuXCJ9Ont9O2Z1bmN0aW9uIFIoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHQ9W10sbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bis9MSl0LnB1c2gobjwwfHxhcmd1bWVudHMubGVuZ3RoPD1uP3ZvaWQgMDphcmd1bWVudHNbbl0pO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2U9ZS5yZXBsYWNlKC8lW2Etel0vLHQpfSkpLGV9ZnVuY3Rpb24gRChlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0PjE/dC0xOjApLHI9MTtyPHQ7cisrKW5bci0xXT1hcmd1bWVudHNbcl07dGhyb3dcInByb2R1Y3Rpb25cIj09PXByb2Nlc3MuZW52Lk5PREVfRU5WP25ldyBFcnJvcihcIkFuIGVycm9yIG9jY3VycmVkLiBTZWUgaHR0cHM6Ly9naXQuaW8vSlVJYUUjXCIrZStcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIisobi5sZW5ndGg+MD9cIiBBcmdzOiBcIituLmpvaW4oXCIsIFwiKTpcIlwiKSk6bmV3IEVycm9yKFIuYXBwbHkodm9pZCAwLFtPW2VdXS5jb25jYXQobikpLnRyaW0oKSl9dmFyIGo9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuZ3JvdXBTaXplcz1uZXcgVWludDMyQXJyYXkoNTEyKSx0aGlzLmxlbmd0aD01MTIsdGhpcy50YWc9ZX12YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5pbmRleE9mR3JvdXA9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj0wO248ZTtuKyspdCs9dGhpcy5ncm91cFNpemVzW25dO3JldHVybiB0fSx0Lmluc2VydFJ1bGVzPWZ1bmN0aW9uKGUsdCl7aWYoZT49dGhpcy5ncm91cFNpemVzLmxlbmd0aCl7Zm9yKHZhciBuPXRoaXMuZ3JvdXBTaXplcyxyPW4ubGVuZ3RoLG89cjtlPj1vOykobzw8PTEpPDAmJkQoMTYsXCJcIitlKTt0aGlzLmdyb3VwU2l6ZXM9bmV3IFVpbnQzMkFycmF5KG8pLHRoaXMuZ3JvdXBTaXplcy5zZXQobiksdGhpcy5sZW5ndGg9bztmb3IodmFyIHM9cjtzPG87cysrKXRoaXMuZ3JvdXBTaXplc1tzXT0wfWZvcih2YXIgaT10aGlzLmluZGV4T2ZHcm91cChlKzEpLGE9MCxjPXQubGVuZ3RoO2E8YzthKyspdGhpcy50YWcuaW5zZXJ0UnVsZShpLHRbYV0pJiYodGhpcy5ncm91cFNpemVzW2VdKyssaSsrKX0sdC5jbGVhckdyb3VwPWZ1bmN0aW9uKGUpe2lmKGU8dGhpcy5sZW5ndGgpe3ZhciB0PXRoaXMuZ3JvdXBTaXplc1tlXSxuPXRoaXMuaW5kZXhPZkdyb3VwKGUpLHI9bit0O3RoaXMuZ3JvdXBTaXplc1tlXT0wO2Zvcih2YXIgbz1uO288cjtvKyspdGhpcy50YWcuZGVsZXRlUnVsZShuKX19LHQuZ2V0R3JvdXA9ZnVuY3Rpb24oZSl7dmFyIHQ9XCJcIjtpZihlPj10aGlzLmxlbmd0aHx8MD09PXRoaXMuZ3JvdXBTaXplc1tlXSlyZXR1cm4gdDtmb3IodmFyIG49dGhpcy5ncm91cFNpemVzW2VdLHI9dGhpcy5pbmRleE9mR3JvdXAoZSksbz1yK24scz1yO3M8bztzKyspdCs9dGhpcy50YWcuZ2V0UnVsZShzKStcIi8qIXNjKi9cXG5cIjtyZXR1cm4gdH0sZX0oKSxUPW5ldyBNYXAseD1uZXcgTWFwLGs9MSxWPWZ1bmN0aW9uKGUpe2lmKFQuaGFzKGUpKXJldHVybiBULmdldChlKTtmb3IoO3guaGFzKGspOylrKys7dmFyIHQ9aysrO3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJigoMHx0KTwwfHx0PjE8PDMwKSYmRCgxNixcIlwiK3QpLFQuc2V0KGUsdCkseC5zZXQodCxlKSx0fSxCPWZ1bmN0aW9uKGUpe3JldHVybiB4LmdldChlKX0sej1mdW5jdGlvbihlLHQpe3Q+PWsmJihrPXQrMSksVC5zZXQoZSx0KSx4LnNldCh0LGUpfSxNPVwic3R5bGVbXCIrTisnXVtkYXRhLXN0eWxlZC12ZXJzaW9uPVwiNS4zLjExXCJdJyxHPW5ldyBSZWdFeHAoXCJeXCIrTisnXFxcXC5nKFxcXFxkKylcXFxcW2lkPVwiKFtcXFxcd1xcXFxkLV0rKVwiXFxcXF0uKj9cIihbXlwiXSopJyksTD1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByLG89bi5zcGxpdChcIixcIikscz0wLGk9by5sZW5ndGg7czxpO3MrKykocj1vW3NdKSYmZS5yZWdpc3Rlck5hbWUodCxyKX0sRj1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0odC50ZXh0Q29udGVudHx8XCJcIikuc3BsaXQoXCIvKiFzYyovXFxuXCIpLHI9W10sbz0wLHM9bi5sZW5ndGg7bzxzO28rKyl7dmFyIGk9bltvXS50cmltKCk7aWYoaSl7dmFyIGE9aS5tYXRjaChHKTtpZihhKXt2YXIgYz0wfHBhcnNlSW50KGFbMV0sMTApLHU9YVsyXTswIT09YyYmKHoodSxjKSxMKGUsdSxhWzNdKSxlLmdldFRhZygpLmluc2VydFJ1bGVzKGMscikpLHIubGVuZ3RoPTB9ZWxzZSByLnB1c2goaSl9fX0sWT1mdW5jdGlvbigpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXz9fX3dlYnBhY2tfbm9uY2VfXzpudWxsfSxxPWZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmhlYWQsbj1lfHx0LHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpLG89ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuY2hpbGROb2RlcyxuPXQubGVuZ3RoO24+PTA7bi0tKXt2YXIgcj10W25dO2lmKHImJjE9PT1yLm5vZGVUeXBlJiZyLmhhc0F0dHJpYnV0ZShOKSlyZXR1cm4gcn19KG4pLHM9dm9pZCAwIT09bz9vLm5leHRTaWJsaW5nOm51bGw7ci5zZXRBdHRyaWJ1dGUoTixcImFjdGl2ZVwiKSxyLnNldEF0dHJpYnV0ZShcImRhdGEtc3R5bGVkLXZlcnNpb25cIixcIjUuMy4xMVwiKTt2YXIgaT1ZKCk7cmV0dXJuIGkmJnIuc2V0QXR0cmlidXRlKFwibm9uY2VcIixpKSxuLmluc2VydEJlZm9yZShyLHMpLHJ9LEg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3ZhciB0PXRoaXMuZWxlbWVudD1xKGUpO3QuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIikpLHRoaXMuc2hlZXQ9ZnVuY3Rpb24oZSl7aWYoZS5zaGVldClyZXR1cm4gZS5zaGVldDtmb3IodmFyIHQ9ZG9jdW1lbnQuc3R5bGVTaGVldHMsbj0wLHI9dC5sZW5ndGg7bjxyO24rKyl7dmFyIG89dFtuXTtpZihvLm93bmVyTm9kZT09PWUpcmV0dXJuIG99RCgxNyl9KHQpLHRoaXMubGVuZ3RoPTB9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuaW5zZXJ0UnVsZT1mdW5jdGlvbihlLHQpe3RyeXtyZXR1cm4gdGhpcy5zaGVldC5pbnNlcnRSdWxlKHQsZSksdGhpcy5sZW5ndGgrKywhMH1jYXRjaChlKXtyZXR1cm4hMX19LHQuZGVsZXRlUnVsZT1mdW5jdGlvbihlKXt0aGlzLnNoZWV0LmRlbGV0ZVJ1bGUoZSksdGhpcy5sZW5ndGgtLX0sdC5nZXRSdWxlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2hlZXQuY3NzUnVsZXNbZV07cmV0dXJuIHZvaWQgMCE9PXQmJlwic3RyaW5nXCI9PXR5cGVvZiB0LmNzc1RleHQ/dC5jc3NUZXh0OlwiXCJ9LGV9KCksJD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9dGhpcy5lbGVtZW50PXEoZSk7dGhpcy5ub2Rlcz10LmNoaWxkTm9kZXMsdGhpcy5sZW5ndGg9MH12YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5pbnNlcnRSdWxlPWZ1bmN0aW9uKGUsdCl7aWYoZTw9dGhpcy5sZW5ndGgmJmU+PTApe3ZhciBuPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpLHI9dGhpcy5ub2Rlc1tlXTtyZXR1cm4gdGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZShuLHJ8fG51bGwpLHRoaXMubGVuZ3RoKyssITB9cmV0dXJuITF9LHQuZGVsZXRlUnVsZT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlc1tlXSksdGhpcy5sZW5ndGgtLX0sdC5nZXRSdWxlPWZ1bmN0aW9uKGUpe3JldHVybiBlPHRoaXMubGVuZ3RoP3RoaXMubm9kZXNbZV0udGV4dENvbnRlbnQ6XCJcIn0sZX0oKSxXPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLnJ1bGVzPVtdLHRoaXMubGVuZ3RoPTB9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuaW5zZXJ0UnVsZT1mdW5jdGlvbihlLHQpe3JldHVybiBlPD10aGlzLmxlbmd0aCYmKHRoaXMucnVsZXMuc3BsaWNlKGUsMCx0KSx0aGlzLmxlbmd0aCsrLCEwKX0sdC5kZWxldGVSdWxlPWZ1bmN0aW9uKGUpe3RoaXMucnVsZXMuc3BsaWNlKGUsMSksdGhpcy5sZW5ndGgtLX0sdC5nZXRSdWxlPWZ1bmN0aW9uKGUpe3JldHVybiBlPHRoaXMubGVuZ3RoP3RoaXMucnVsZXNbZV06XCJcIn0sZX0oKSxVPUMsSj17aXNTZXJ2ZXI6IUMsdXNlQ1NTT01JbmplY3Rpb246IUl9LFg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxuKXt2b2lkIDA9PT1lJiYoZT13KSx2b2lkIDA9PT10JiYodD17fSksdGhpcy5vcHRpb25zPXkoe30sSix7fSxlKSx0aGlzLmdzPXQsdGhpcy5uYW1lcz1uZXcgTWFwKG4pLHRoaXMuc2VydmVyPSEhZS5pc1NlcnZlciwhdGhpcy5zZXJ2ZXImJkMmJlUmJihVPSExLGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKE0pLG49MCxyPXQubGVuZ3RoO248cjtuKyspe3ZhciBvPXRbbl07byYmXCJhY3RpdmVcIiE9PW8uZ2V0QXR0cmlidXRlKE4pJiYoRihlLG8pLG8ucGFyZW50Tm9kZSYmby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pKX19KHRoaXMpKX1lLnJlZ2lzdGVySWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIFYoZSl9O3ZhciB0PWUucHJvdG90eXBlO3JldHVybiB0LnJlY29uc3RydWN0V2l0aE9wdGlvbnM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49ITApLG5ldyBlKHkoe30sdGhpcy5vcHRpb25zLHt9LHQpLHRoaXMuZ3MsbiYmdGhpcy5uYW1lc3x8dm9pZCAwKX0sdC5hbGxvY2F0ZUdTSW5zdGFuY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ3NbZV09KHRoaXMuZ3NbZV18fDApKzF9LHQuZ2V0VGFnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFnfHwodGhpcy50YWc9KG49KHQ9dGhpcy5vcHRpb25zKS5pc1NlcnZlcixyPXQudXNlQ1NTT01JbmplY3Rpb24sbz10LnRhcmdldCxlPW4/bmV3IFcobyk6cj9uZXcgSChvKTpuZXcgJChvKSxuZXcgaihlKSkpO3ZhciBlLHQsbixyLG99LHQuaGFzTmFtZUZvcklkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubmFtZXMuaGFzKGUpJiZ0aGlzLm5hbWVzLmdldChlKS5oYXModCl9LHQucmVnaXN0ZXJOYW1lPWZ1bmN0aW9uKGUsdCl7aWYoVihlKSx0aGlzLm5hbWVzLmhhcyhlKSl0aGlzLm5hbWVzLmdldChlKS5hZGQodCk7ZWxzZXt2YXIgbj1uZXcgU2V0O24uYWRkKHQpLHRoaXMubmFtZXMuc2V0KGUsbil9fSx0Lmluc2VydFJ1bGVzPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnJlZ2lzdGVyTmFtZShlLHQpLHRoaXMuZ2V0VGFnKCkuaW5zZXJ0UnVsZXMoVihlKSxuKX0sdC5jbGVhck5hbWVzPWZ1bmN0aW9uKGUpe3RoaXMubmFtZXMuaGFzKGUpJiZ0aGlzLm5hbWVzLmdldChlKS5jbGVhcigpfSx0LmNsZWFyUnVsZXM9ZnVuY3Rpb24oZSl7dGhpcy5nZXRUYWcoKS5jbGVhckdyb3VwKFYoZSkpLHRoaXMuY2xlYXJOYW1lcyhlKX0sdC5jbGVhclRhZz1mdW5jdGlvbigpe3RoaXMudGFnPXZvaWQgMH0sdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5nZXRUYWcoKSxuPXQubGVuZ3RoLHI9XCJcIixvPTA7bzxuO28rKyl7dmFyIHM9QihvKTtpZih2b2lkIDAhPT1zKXt2YXIgaT1lLm5hbWVzLmdldChzKSxhPXQuZ2V0R3JvdXAobyk7aWYoaSYmYSYmaS5zaXplKXt2YXIgYz1OK1wiLmdcIitvKydbaWQ9XCInK3MrJ1wiXScsdT1cIlwiO3ZvaWQgMCE9PWkmJmkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5sZW5ndGg+MCYmKHUrPWUrXCIsXCIpfSkpLHIrPVwiXCIrYStjKyd7Y29udGVudDpcIicrdSsnXCJ9Lyohc2MqL1xcbid9fX1yZXR1cm4gcn0odGhpcyl9LGV9KCksWj0vKGEpKGQpL2dpLEs9ZnVuY3Rpb24oZSl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZSsoZT4yNT8zOTo5NykpfTtmdW5jdGlvbiBRKGUpe3ZhciB0LG49XCJcIjtmb3IodD1NYXRoLmFicyhlKTt0PjUyO3Q9dC81MnwwKW49Syh0JTUyKStuO3JldHVybihLKHQlNTIpK24pLnJlcGxhY2UoWixcIiQxLSQyXCIpfXZhciBlZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10Lmxlbmd0aDtuOyllPTMzKmVedC5jaGFyQ29kZUF0KC0tbik7cmV0dXJuIGV9LHRlPWZ1bmN0aW9uKGUpe3JldHVybiBlZSg1MzgxLGUpfTtmdW5jdGlvbiBuZShlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrPTEpe3ZhciBuPWVbdF07aWYoRShuKSYmIV8obikpcmV0dXJuITF9cmV0dXJuITB9dmFyIHJlPXRlKFwiNS4zLjExXCIpLG9lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7dGhpcy5ydWxlcz1lLHRoaXMuc3RhdGljUnVsZXNJZD1cIlwiLHRoaXMuaXNTdGF0aWM9XCJwcm9kdWN0aW9uXCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOViYmKHZvaWQgMD09PW58fG4uaXNTdGF0aWMpJiZuZShlKSx0aGlzLmNvbXBvbmVudElkPXQsdGhpcy5iYXNlSGFzaD1lZShyZSx0KSx0aGlzLmJhc2VTdHlsZT1uLFgucmVnaXN0ZXJJZCh0KX1yZXR1cm4gZS5wcm90b3R5cGUuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuY29tcG9uZW50SWQsbz1bXTtpZih0aGlzLmJhc2VTdHlsZSYmby5wdXNoKHRoaXMuYmFzZVN0eWxlLmdlbmVyYXRlQW5kSW5qZWN0U3R5bGVzKGUsdCxuKSksdGhpcy5pc1N0YXRpYyYmIW4uaGFzaClpZih0aGlzLnN0YXRpY1J1bGVzSWQmJnQuaGFzTmFtZUZvcklkKHIsdGhpcy5zdGF0aWNSdWxlc0lkKSlvLnB1c2godGhpcy5zdGF0aWNSdWxlc0lkKTtlbHNle3ZhciBzPV9lKHRoaXMucnVsZXMsZSx0LG4pLmpvaW4oXCJcIiksaT1RKGVlKHRoaXMuYmFzZUhhc2gscyk+Pj4wKTtpZighdC5oYXNOYW1lRm9ySWQocixpKSl7dmFyIGE9bihzLFwiLlwiK2ksdm9pZCAwLHIpO3QuaW5zZXJ0UnVsZXMocixpLGEpfW8ucHVzaChpKSx0aGlzLnN0YXRpY1J1bGVzSWQ9aX1lbHNle2Zvcih2YXIgYz10aGlzLnJ1bGVzLmxlbmd0aCx1PWVlKHRoaXMuYmFzZUhhc2gsbi5oYXNoKSxsPVwiXCIsZD0wO2Q8YztkKyspe3ZhciBoPXRoaXMucnVsZXNbZF07aWYoXCJzdHJpbmdcIj09dHlwZW9mIGgpbCs9aCxcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiYodT1lZSh1LGgrZCkpO2Vsc2UgaWYoaCl7dmFyIHA9X2UoaCxlLHQsbiksZj1BcnJheS5pc0FycmF5KHApP3Auam9pbihcIlwiKTpwO3U9ZWUodSxmK2QpLGwrPWZ9fWlmKGwpe3ZhciBtPVEodT4+PjApO2lmKCF0Lmhhc05hbWVGb3JJZChyLG0pKXt2YXIgeT1uKGwsXCIuXCIrbSx2b2lkIDAscik7dC5pbnNlcnRSdWxlcyhyLG0seSl9by5wdXNoKG0pfX1yZXR1cm4gby5qb2luKFwiIFwiKX0sZX0oKSxzZT0vXlxccypcXC9cXC8uKiQvZ20saWU9W1wiOlwiLFwiW1wiLFwiLlwiLFwiI1wiXTtmdW5jdGlvbiBhZShlKXt2YXIgdCxuLHIsbyxzPXZvaWQgMD09PWU/dzplLGk9cy5vcHRpb25zLGE9dm9pZCAwPT09aT93OmksYz1zLnBsdWdpbnMsdT12b2lkIDA9PT1jP1M6YyxsPW5ldyBoKGEpLGQ9W10scD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe2lmKHQpdHJ5e2UodCtcIn1cIil9Y2F0Y2goZSl7fX1yZXR1cm4gZnVuY3Rpb24obixyLG8scyxpLGEsYyx1LGwsZCl7c3dpdGNoKG4pe2Nhc2UgMTppZigwPT09bCYmNjQ9PT1yLmNoYXJDb2RlQXQoMCkpcmV0dXJuIGUocitcIjtcIiksXCJcIjticmVhaztjYXNlIDI6aWYoMD09PXUpcmV0dXJuIHIrXCIvKnwqL1wiO2JyZWFrO2Nhc2UgMzpzd2l0Y2godSl7Y2FzZSAxMDI6Y2FzZSAxMTI6cmV0dXJuIGUob1swXStyKSxcIlwiO2RlZmF1bHQ6cmV0dXJuIHIrKDA9PT1kP1wiLyp8Ki9cIjpcIlwiKX1jYXNlLTI6ci5zcGxpdChcIi8qfCovfVwiKS5mb3JFYWNoKHQpfX19KChmdW5jdGlvbihlKXtkLnB1c2goZSl9KSksZj1mdW5jdGlvbihlLHIscyl7cmV0dXJuIDA9PT1yJiYtMSE9PWllLmluZGV4T2Yoc1tuLmxlbmd0aF0pfHxzLm1hdGNoKG8pP2U6XCIuXCIrdH07ZnVuY3Rpb24gbShlLHMsaSxhKXt2b2lkIDA9PT1hJiYoYT1cIiZcIik7dmFyIGM9ZS5yZXBsYWNlKHNlLFwiXCIpLHU9cyYmaT9pK1wiIFwiK3MrXCIgeyBcIitjK1wiIH1cIjpjO3JldHVybiB0PWEsbj1zLHI9bmV3IFJlZ0V4cChcIlxcXFxcIituK1wiXFxcXGJcIixcImdcIiksbz1uZXcgUmVnRXhwKFwiKFxcXFxcIituK1wiXFxcXGIpezIsfVwiKSxsKGl8fCFzP1wiXCI6cyx1KX1yZXR1cm4gbC51c2UoW10uY29uY2F0KHUsW2Z1bmN0aW9uKGUsdCxvKXsyPT09ZSYmby5sZW5ndGgmJm9bMF0ubGFzdEluZGV4T2Yobik+MCYmKG9bMF09b1swXS5yZXBsYWNlKHIsZikpfSxwLGZ1bmN0aW9uKGUpe2lmKC0yPT09ZSl7dmFyIHQ9ZDtyZXR1cm4gZD1bXSx0fX1dKSksbS5oYXNoPXUubGVuZ3RoP3UucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiB0Lm5hbWV8fEQoMTUpLGVlKGUsdC5uYW1lKX0pLDUzODEpLnRvU3RyaW5nKCk6XCJcIixtfXZhciBjZT1yLmNyZWF0ZUNvbnRleHQoKSx1ZT1jZS5Db25zdW1lcixsZT1yLmNyZWF0ZUNvbnRleHQoKSxkZT0obGUuQ29uc3VtZXIsbmV3IFgpLGhlPWFlKCk7ZnVuY3Rpb24gcGUoKXtyZXR1cm4gcyhjZSl8fGRlfWZ1bmN0aW9uIGZlKCl7cmV0dXJuIHMobGUpfHxoZX1mdW5jdGlvbiBtZShlKXt2YXIgdD1vKGUuc3R5bGlzUGx1Z2lucyksbj10WzBdLHM9dFsxXSxjPXBlKCksdT1pKChmdW5jdGlvbigpe3ZhciB0PWM7cmV0dXJuIGUuc2hlZXQ/dD1lLnNoZWV0OmUudGFyZ2V0JiYodD10LnJlY29uc3RydWN0V2l0aE9wdGlvbnMoe3RhcmdldDplLnRhcmdldH0sITEpKSxlLmRpc2FibGVDU1NPTUluamVjdGlvbiYmKHQ9dC5yZWNvbnN0cnVjdFdpdGhPcHRpb25zKHt1c2VDU1NPTUluamVjdGlvbjohMX0pKSx0fSksW2UuZGlzYWJsZUNTU09NSW5qZWN0aW9uLGUuc2hlZXQsZS50YXJnZXRdKSxsPWkoKGZ1bmN0aW9uKCl7cmV0dXJuIGFlKHtvcHRpb25zOntwcmVmaXg6IWUuZGlzYWJsZVZlbmRvclByZWZpeGVzfSxwbHVnaW5zOm59KX0pLFtlLmRpc2FibGVWZW5kb3JQcmVmaXhlcyxuXSk7cmV0dXJuIGEoKGZ1bmN0aW9uKCl7ZChuLGUuc3R5bGlzUGx1Z2lucyl8fHMoZS5zdHlsaXNQbHVnaW5zKX0pLFtlLnN0eWxpc1BsdWdpbnNdKSxyLmNyZWF0ZUVsZW1lbnQoY2UuUHJvdmlkZXIse3ZhbHVlOnV9LHIuY3JlYXRlRWxlbWVudChsZS5Qcm92aWRlcix7dmFsdWU6bH0sXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOVj9yLkNoaWxkcmVuLm9ubHkoZS5jaGlsZHJlbik6ZS5jaGlsZHJlbikpfXZhciB5ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt2YXIgbj10aGlzO3RoaXMuaW5qZWN0PWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9aGUpO3ZhciByPW4ubmFtZSt0Lmhhc2g7ZS5oYXNOYW1lRm9ySWQobi5pZCxyKXx8ZS5pbnNlcnRSdWxlcyhuLmlkLHIsdChuLnJ1bGVzLHIsXCJAa2V5ZnJhbWVzXCIpKX0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBEKDEyLFN0cmluZyhuLm5hbWUpKX0sdGhpcy5uYW1lPWUsdGhpcy5pZD1cInNjLWtleWZyYW1lcy1cIitlLHRoaXMucnVsZXM9dH1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9aGUpLHRoaXMubmFtZStlLmhhc2h9LGV9KCksdmU9LyhbQS1aXSkvLGdlPS8oW0EtWl0pL2csU2U9L15tcy0vLHdlPWZ1bmN0aW9uKGUpe3JldHVyblwiLVwiK2UudG9Mb3dlckNhc2UoKX07ZnVuY3Rpb24gRWUoZSl7cmV0dXJuIHZlLnRlc3QoZSk/ZS5yZXBsYWNlKGdlLHdlKS5yZXBsYWNlKFNlLFwiLW1zLVwiKTplfXZhciBiZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZXx8ITE9PT1lfHxcIlwiPT09ZX07ZnVuY3Rpb24gX2UoZSxuLHIsbyl7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciBzLGk9W10sYT0wLGM9ZS5sZW5ndGg7YTxjO2ErPTEpXCJcIiE9PShzPV9lKGVbYV0sbixyLG8pKSYmKEFycmF5LmlzQXJyYXkocyk/aS5wdXNoLmFwcGx5KGkscyk6aS5wdXNoKHMpKTtyZXR1cm4gaX1pZihiZShlKSlyZXR1cm5cIlwiO2lmKF8oZSkpcmV0dXJuXCIuXCIrZS5zdHlsZWRDb21wb25lbnRJZDtpZihFKGUpKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZihsPWUpfHxsLnByb3RvdHlwZSYmbC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudHx8IW4pcmV0dXJuIGU7dmFyIHU9ZShuKTtyZXR1cm5cInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZ0KHUpJiZjb25zb2xlLndhcm4oYihlKStcIiBpcyBub3QgYSBzdHlsZWQgY29tcG9uZW50IGFuZCBjYW5ub3QgYmUgcmVmZXJyZWQgdG8gdmlhIGNvbXBvbmVudCBzZWxlY3Rvci4gU2VlIGh0dHBzOi8vd3d3LnN0eWxlZC1jb21wb25lbnRzLmNvbS9kb2NzL2FkdmFuY2VkI3JlZmVycmluZy10by1vdGhlci1jb21wb25lbnRzIGZvciBtb3JlIGRldGFpbHMuXCIpLF9lKHUsbixyLG8pfXZhciBsO3JldHVybiBlIGluc3RhbmNlb2YgeWU/cj8oZS5pbmplY3QocixvKSxlLmdldE5hbWUobykpOmU6ZyhlKT9mdW5jdGlvbiBlKHQsbil7dmFyIHIsbyxzPVtdO2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJiFiZSh0W2ldKSYmKEFycmF5LmlzQXJyYXkodFtpXSkmJnRbaV0uaXNDc3N8fEUodFtpXSk/cy5wdXNoKEVlKGkpK1wiOlwiLHRbaV0sXCI7XCIpOmcodFtpXSk/cy5wdXNoLmFwcGx5KHMsZSh0W2ldLGkpKTpzLnB1c2goRWUoaSkrXCI6IFwiKyhyPWksbnVsbD09KG89dFtpXSl8fFwiYm9vbGVhblwiPT10eXBlb2Ygb3x8XCJcIj09PW8/XCJcIjpcIm51bWJlclwiIT10eXBlb2Ygb3x8MD09PW98fHIgaW4gcHx8ci5zdGFydHNXaXRoKFwiLS1cIik/U3RyaW5nKG8pLnRyaW0oKTpvK1wicHhcIikrXCI7XCIpKTtyZXR1cm4gbj9bbitcIiB7XCJdLmNvbmNhdChzLFtcIn1cIl0pOnN9KGUpOmUudG9TdHJpbmcoKX12YXIgTmU9ZnVuY3Rpb24oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJihlLmlzQ3NzPSEwKSxlfTtmdW5jdGlvbiBBZShlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0PjE/dC0xOjApLHI9MTtyPHQ7cisrKW5bci0xXT1hcmd1bWVudHNbcl07cmV0dXJuIEUoZSl8fGcoZSk/TmUoX2UodihTLFtlXS5jb25jYXQobikpKSk6MD09PW4ubGVuZ3RoJiYxPT09ZS5sZW5ndGgmJlwic3RyaW5nXCI9PXR5cGVvZiBlWzBdP2U6TmUoX2UodihlLG4pKSl9dmFyIENlPS9pbnZhbGlkIGhvb2sgY2FsbC9pLEllPW5ldyBTZXQsUGU9ZnVuY3Rpb24oZSx0KXtpZihcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WKXt2YXIgbj1cIlRoZSBjb21wb25lbnQgXCIrZSsodD8nIHdpdGggdGhlIGlkIG9mIFwiJyt0KydcIic6XCJcIikrXCIgaGFzIGJlZW4gY3JlYXRlZCBkeW5hbWljYWxseS5cXG5Zb3UgbWF5IHNlZSB0aGlzIHdhcm5pbmcgYmVjYXVzZSB5b3UndmUgY2FsbGVkIHN0eWxlZCBpbnNpZGUgYW5vdGhlciBjb21wb25lbnQuXFxuVG8gcmVzb2x2ZSB0aGlzIG9ubHkgY3JlYXRlIG5ldyBTdHlsZWRDb21wb25lbnRzIG91dHNpZGUgb2YgYW55IHJlbmRlciBtZXRob2QgYW5kIGZ1bmN0aW9uIGNvbXBvbmVudC5cIixyPWNvbnNvbGUuZXJyb3I7dHJ5e3ZhciBvPSEwO2NvbnNvbGUuZXJyb3I9ZnVuY3Rpb24oZSl7aWYoQ2UudGVzdChlKSlvPSExLEllLmRlbGV0ZShuKTtlbHNle2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLHM9bmV3IEFycmF5KHQ+MT90LTE6MCksaT0xO2k8dDtpKyspc1tpLTFdPWFyZ3VtZW50c1tpXTtyLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KHMpKX19LGMoKSxvJiYhSWUuaGFzKG4pJiYoY29uc29sZS53YXJuKG4pLEllLmFkZChuKSl9Y2F0Y2goZSl7Q2UudGVzdChlLm1lc3NhZ2UpJiZJZS5kZWxldGUobil9ZmluYWxseXtjb25zb2xlLmVycm9yPXJ9fX0sT2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj13KSxlLnRoZW1lIT09bi50aGVtZSYmZS50aGVtZXx8dHx8bi50aGVtZX0sUmU9L1shXCIjJCUmJygpKissLi86Ozw9Pj9AW1xcXFxcXF1eYHt8fX4tXSsvZyxEZT0vKF4tfC0kKS9nO2Z1bmN0aW9uIGplKGUpe3JldHVybiBlLnJlcGxhY2UoUmUsXCItXCIpLnJlcGxhY2UoRGUsXCJcIil9dmFyIFRlPWZ1bmN0aW9uKGUpe3JldHVybiBRKHRlKGUpPj4+MCl9O2Z1bmN0aW9uIHhlKGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlJiYoXCJwcm9kdWN0aW9uXCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOVnx8ZS5jaGFyQXQoMCk9PT1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpKX12YXIga2U9ZnVuY3Rpb24oZSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgZXx8XCJvYmplY3RcIj09dHlwZW9mIGUmJm51bGwhPT1lJiYhQXJyYXkuaXNBcnJheShlKX0sVmU9ZnVuY3Rpb24oZSl7cmV0dXJuXCJfX3Byb3RvX19cIiE9PWUmJlwiY29uc3RydWN0b3JcIiE9PWUmJlwicHJvdG90eXBlXCIhPT1lfTtmdW5jdGlvbiBCZShlLHQsbil7dmFyIHI9ZVtuXTtrZSh0KSYma2Uocik/emUocix0KTplW25dPXR9ZnVuY3Rpb24gemUoZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodD4xP3QtMTowKSxyPTE7cjx0O3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2Zvcih2YXIgbz0wLHM9bjtvPHMubGVuZ3RoO28rKyl7dmFyIGk9c1tvXTtpZihrZShpKSlmb3IodmFyIGEgaW4gaSlWZShhKSYmQmUoZSxpW2FdLGEpfXJldHVybiBlfXZhciBNZT1yLmNyZWF0ZUNvbnRleHQoKSxHZT1NZS5Db25zdW1lcjtmdW5jdGlvbiBMZShlKXt2YXIgdD1zKE1lKSxuPWkoKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuIEQoMTQpO2lmKEUoZSkpe3ZhciBuPWUodCk7cmV0dXJuXCJwcm9kdWN0aW9uXCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOVnx8bnVsbCE9PW4mJiFBcnJheS5pc0FycmF5KG4pJiZcIm9iamVjdFwiPT10eXBlb2Ygbj9uOkQoNyl9cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl8fFwib2JqZWN0XCIhPXR5cGVvZiBlP0QoOCk6dD95KHt9LHQse30sZSk6ZX0oZS50aGVtZSx0KX0pLFtlLnRoZW1lLHRdKTtyZXR1cm4gZS5jaGlsZHJlbj9yLmNyZWF0ZUVsZW1lbnQoTWUuUHJvdmlkZXIse3ZhbHVlOm59LGUuY2hpbGRyZW4pOm51bGx9dmFyIEZlPXt9O2Z1bmN0aW9uIFllKGUsdCxuKXt2YXIgbz1fKGUpLGk9IXhlKGUpLGE9dC5hdHRycyxjPXZvaWQgMD09PWE/UzphLGw9dC5jb21wb25lbnRJZCxkPXZvaWQgMD09PWw/ZnVuY3Rpb24oZSx0KXt2YXIgbj1cInN0cmluZ1wiIT10eXBlb2YgZT9cInNjXCI6amUoZSk7RmVbbl09KEZlW25dfHwwKSsxO3ZhciByPW4rXCItXCIrVGUoXCI1LjMuMTFcIituK0ZlW25dKTtyZXR1cm4gdD90K1wiLVwiK3I6cn0odC5kaXNwbGF5TmFtZSx0LnBhcmVudENvbXBvbmVudElkKTpsLGg9dC5kaXNwbGF5TmFtZSxwPXZvaWQgMD09PWg/ZnVuY3Rpb24oZSl7cmV0dXJuIHhlKGUpP1wic3R5bGVkLlwiK2U6XCJTdHlsZWQoXCIrYihlKStcIilcIn0oZSk6aCx2PXQuZGlzcGxheU5hbWUmJnQuY29tcG9uZW50SWQ/amUodC5kaXNwbGF5TmFtZSkrXCItXCIrdC5jb21wb25lbnRJZDp0LmNvbXBvbmVudElkfHxkLGc9byYmZS5hdHRycz9BcnJheS5wcm90b3R5cGUuY29uY2F0KGUuYXR0cnMsYykuZmlsdGVyKEJvb2xlYW4pOmMsTj10LnNob3VsZEZvcndhcmRQcm9wO28mJmUuc2hvdWxkRm9yd2FyZFByb3AmJihOPXQuc2hvdWxkRm9yd2FyZFByb3A/ZnVuY3Rpb24obixyLG8pe3JldHVybiBlLnNob3VsZEZvcndhcmRQcm9wKG4scixvKSYmdC5zaG91bGRGb3J3YXJkUHJvcChuLHIsbyl9OmUuc2hvdWxkRm9yd2FyZFByb3ApO3ZhciBBLEM9bmV3IG9lKG4sdixvP2UuY29tcG9uZW50U3R5bGU6dm9pZCAwKSxJPUMuaXNTdGF0aWMmJjA9PT1jLmxlbmd0aCxQPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWUuYXR0cnMsaT1lLmNvbXBvbmVudFN0eWxlLGE9ZS5kZWZhdWx0UHJvcHMsYz1lLmZvbGRlZENvbXBvbmVudElkcyxsPWUuc2hvdWxkRm9yd2FyZFByb3AsZD1lLnN0eWxlZENvbXBvbmVudElkLGg9ZS50YXJnZXQscD1mdW5jdGlvbihlLHQsbil7dm9pZCAwPT09ZSYmKGU9dyk7dmFyIHI9eSh7fSx0LHt0aGVtZTplfSksbz17fTtyZXR1cm4gbi5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdCxuLHMsaT1lO2Zvcih0IGluIEUoaSkmJihpPWkocikpLGkpclt0XT1vW3RdPVwiY2xhc3NOYW1lXCI9PT10PyhuPW9bdF0scz1pW3RdLG4mJnM/bitcIiBcIitzOm58fHMpOmlbdF19KSksW3Isb119KE9lKHQscyhNZSksYSl8fHcsdCxvKSxtPXBbMF0sdj1wWzFdLGc9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89cGUoKSxzPWZlKCksaT10P2UuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXModyxvLHMpOmUuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXMobixvLHMpO3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJiF0JiZyJiZyKGkpLGl9KGkscixtLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlY/ZS53YXJuVG9vTWFueUNsYXNzZXM6dm9pZCAwKSxTPW4sYj12LiRhc3x8dC4kYXN8fHYuYXN8fHQuYXN8fGgsXz14ZShiKSxOPXYhPT10P3koe30sdCx7fSx2KTp0LEE9e307Zm9yKHZhciBDIGluIE4pXCIkXCIhPT1DWzBdJiZcImFzXCIhPT1DJiYoXCJmb3J3YXJkZWRBc1wiPT09Qz9BLmFzPU5bQ106KGw/bChDLGYsYik6IV98fGYoQykpJiYoQVtDXT1OW0NdKSk7cmV0dXJuIHQuc3R5bGUmJnYuc3R5bGUhPT10LnN0eWxlJiYoQS5zdHlsZT15KHt9LHQuc3R5bGUse30sdi5zdHlsZSkpLEEuY2xhc3NOYW1lPUFycmF5LnByb3RvdHlwZS5jb25jYXQoYyxkLGchPT1kP2c6bnVsbCx0LmNsYXNzTmFtZSx2LmNsYXNzTmFtZSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpLEEucmVmPVMsdShiLEEpfShBLGUsdCxJKX07cmV0dXJuIFAuZGlzcGxheU5hbWU9cCwoQT1yLmZvcndhcmRSZWYoUCkpLmF0dHJzPWcsQS5jb21wb25lbnRTdHlsZT1DLEEuZGlzcGxheU5hbWU9cCxBLnNob3VsZEZvcndhcmRQcm9wPU4sQS5mb2xkZWRDb21wb25lbnRJZHM9bz9BcnJheS5wcm90b3R5cGUuY29uY2F0KGUuZm9sZGVkQ29tcG9uZW50SWRzLGUuc3R5bGVkQ29tcG9uZW50SWQpOlMsQS5zdHlsZWRDb21wb25lbnRJZD12LEEudGFyZ2V0PW8/ZS50YXJnZXQ6ZSxBLndpdGhDb21wb25lbnQ9ZnVuY3Rpb24oZSl7dmFyIHI9dC5jb21wb25lbnRJZCxvPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSlyZXR1cm57fTt2YXIgbixyLG89e30scz1PYmplY3Qua2V5cyhlKTtmb3Iocj0wO3I8cy5sZW5ndGg7cisrKW49c1tyXSx0LmluZGV4T2Yobik+PTB8fChvW25dPWVbbl0pO3JldHVybiBvfSh0LFtcImNvbXBvbmVudElkXCJdKSxzPXImJnIrXCItXCIrKHhlKGUpP2U6amUoYihlKSkpO3JldHVybiBZZShlLHkoe30sbyx7YXR0cnM6Zyxjb21wb25lbnRJZDpzfSksbil9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLFwiZGVmYXVsdFByb3BzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb2xkZWREZWZhdWx0UHJvcHN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9mb2xkZWREZWZhdWx0UHJvcHM9bz96ZSh7fSxlLmRlZmF1bHRQcm9wcyx0KTp0fX0pLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJihQZShwLHYpLEEud2FyblRvb01hbnlDbGFzc2VzPWZ1bmN0aW9uKGUsdCl7dmFyIG49e30scj0hMTtyZXR1cm4gZnVuY3Rpb24obyl7aWYoIXImJihuW29dPSEwLE9iamVjdC5rZXlzKG4pLmxlbmd0aD49MjAwKSl7dmFyIHM9dD8nIHdpdGggdGhlIGlkIG9mIFwiJyt0KydcIic6XCJcIjtjb25zb2xlLndhcm4oXCJPdmVyIDIwMCBjbGFzc2VzIHdlcmUgZ2VuZXJhdGVkIGZvciBjb21wb25lbnQgXCIrZStzK1wiLlxcbkNvbnNpZGVyIHVzaW5nIHRoZSBhdHRycyBtZXRob2QsIHRvZ2V0aGVyIHdpdGggYSBzdHlsZSBvYmplY3QgZm9yIGZyZXF1ZW50bHkgY2hhbmdlZCBzdHlsZXMuXFxuRXhhbXBsZTpcXG4gIGNvbnN0IENvbXBvbmVudCA9IHN0eWxlZC5kaXYuYXR0cnMocHJvcHMgPT4gKHtcXG4gICAgc3R5bGU6IHtcXG4gICAgICBiYWNrZ3JvdW5kOiBwcm9wcy5iYWNrZ3JvdW5kLFxcbiAgICB9LFxcbiAgfSkpYHdpZHRoOiAxMDAlO2BcXG5cXG4gIDxDb21wb25lbnQgLz5cIikscj0hMCxuPXt9fX19KHAsdikpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLFwidG9TdHJpbmdcIix7dmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cIi5cIitBLnN0eWxlZENvbXBvbmVudElkfX0pLGkmJm0oQSxlLHthdHRyczohMCxjb21wb25lbnRTdHlsZTohMCxkaXNwbGF5TmFtZTohMCxmb2xkZWRDb21wb25lbnRJZHM6ITAsc2hvdWxkRm9yd2FyZFByb3A6ITAsc3R5bGVkQ29tcG9uZW50SWQ6ITAsdGFyZ2V0OiEwLHdpdGhDb21wb25lbnQ6ITB9KSxBfXZhciBxZT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gZSh0LHIsbyl7aWYodm9pZCAwPT09byYmKG89dyksIW4ocikpcmV0dXJuIEQoMSxTdHJpbmcocikpO3ZhciBzPWZ1bmN0aW9uKCl7cmV0dXJuIHQocixvLEFlLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpKX07cmV0dXJuIHMud2l0aENvbmZpZz1mdW5jdGlvbihuKXtyZXR1cm4gZSh0LHIseSh7fSxvLHt9LG4pKX0scy5hdHRycz1mdW5jdGlvbihuKXtyZXR1cm4gZSh0LHIseSh7fSxvLHthdHRyczpBcnJheS5wcm90b3R5cGUuY29uY2F0KG8uYXR0cnMsbikuZmlsdGVyKEJvb2xlYW4pfSkpfSxzfShZZSxlKX07W1wiYVwiLFwiYWJiclwiLFwiYWRkcmVzc1wiLFwiYXJlYVwiLFwiYXJ0aWNsZVwiLFwiYXNpZGVcIixcImF1ZGlvXCIsXCJiXCIsXCJiYXNlXCIsXCJiZGlcIixcImJkb1wiLFwiYmlnXCIsXCJibG9ja3F1b3RlXCIsXCJib2R5XCIsXCJiclwiLFwiYnV0dG9uXCIsXCJjYW52YXNcIixcImNhcHRpb25cIixcImNpdGVcIixcImNvZGVcIixcImNvbFwiLFwiY29sZ3JvdXBcIixcImRhdGFcIixcImRhdGFsaXN0XCIsXCJkZFwiLFwiZGVsXCIsXCJkZXRhaWxzXCIsXCJkZm5cIixcImRpYWxvZ1wiLFwiZGl2XCIsXCJkbFwiLFwiZHRcIixcImVtXCIsXCJlbWJlZFwiLFwiZmllbGRzZXRcIixcImZpZ2NhcHRpb25cIixcImZpZ3VyZVwiLFwiZm9vdGVyXCIsXCJmb3JtXCIsXCJoMVwiLFwiaDJcIixcImgzXCIsXCJoNFwiLFwiaDVcIixcImg2XCIsXCJoZWFkXCIsXCJoZWFkZXJcIixcImhncm91cFwiLFwiaHJcIixcImh0bWxcIixcImlcIixcImlmcmFtZVwiLFwiaW1nXCIsXCJpbnB1dFwiLFwiaW5zXCIsXCJrYmRcIixcImtleWdlblwiLFwibGFiZWxcIixcImxlZ2VuZFwiLFwibGlcIixcImxpbmtcIixcIm1haW5cIixcIm1hcFwiLFwibWFya1wiLFwibWFycXVlZVwiLFwibWVudVwiLFwibWVudWl0ZW1cIixcIm1ldGFcIixcIm1ldGVyXCIsXCJuYXZcIixcIm5vc2NyaXB0XCIsXCJvYmplY3RcIixcIm9sXCIsXCJvcHRncm91cFwiLFwib3B0aW9uXCIsXCJvdXRwdXRcIixcInBcIixcInBhcmFtXCIsXCJwaWN0dXJlXCIsXCJwcmVcIixcInByb2dyZXNzXCIsXCJxXCIsXCJycFwiLFwicnRcIixcInJ1YnlcIixcInNcIixcInNhbXBcIixcInNjcmlwdFwiLFwic2VjdGlvblwiLFwic2VsZWN0XCIsXCJzbWFsbFwiLFwic291cmNlXCIsXCJzcGFuXCIsXCJzdHJvbmdcIixcInN0eWxlXCIsXCJzdWJcIixcInN1bW1hcnlcIixcInN1cFwiLFwidGFibGVcIixcInRib2R5XCIsXCJ0ZFwiLFwidGV4dGFyZWFcIixcInRmb290XCIsXCJ0aFwiLFwidGhlYWRcIixcInRpbWVcIixcInRpdGxlXCIsXCJ0clwiLFwidHJhY2tcIixcInVcIixcInVsXCIsXCJ2YXJcIixcInZpZGVvXCIsXCJ3YnJcIixcImNpcmNsZVwiLFwiY2xpcFBhdGhcIixcImRlZnNcIixcImVsbGlwc2VcIixcImZvcmVpZ25PYmplY3RcIixcImdcIixcImltYWdlXCIsXCJsaW5lXCIsXCJsaW5lYXJHcmFkaWVudFwiLFwibWFya2VyXCIsXCJtYXNrXCIsXCJwYXRoXCIsXCJwYXR0ZXJuXCIsXCJwb2x5Z29uXCIsXCJwb2x5bGluZVwiLFwicmFkaWFsR3JhZGllbnRcIixcInJlY3RcIixcInN0b3BcIixcInN2Z1wiLFwidGV4dFwiLFwidGV4dFBhdGhcIixcInRzcGFuXCJdLmZvckVhY2goKGZ1bmN0aW9uKGUpe3FlW2VdPXFlKGUpfSkpO3ZhciBIZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt0aGlzLnJ1bGVzPWUsdGhpcy5jb21wb25lbnRJZD10LHRoaXMuaXNTdGF0aWM9bmUoZSksWC5yZWdpc3RlcklkKHRoaXMuY29tcG9uZW50SWQrMSl9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuY3JlYXRlU3R5bGVzPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXIoX2UodGhpcy5ydWxlcyx0LG4scikuam9pbihcIlwiKSxcIlwiKSxzPXRoaXMuY29tcG9uZW50SWQrZTtuLmluc2VydFJ1bGVzKHMscyxvKX0sdC5yZW1vdmVTdHlsZXM9ZnVuY3Rpb24oZSx0KXt0LmNsZWFyUnVsZXModGhpcy5jb21wb25lbnRJZCtlKX0sdC5yZW5kZXJTdHlsZXM9ZnVuY3Rpb24oZSx0LG4scil7ZT4yJiZYLnJlZ2lzdGVySWQodGhpcy5jb21wb25lbnRJZCtlKSx0aGlzLnJlbW92ZVN0eWxlcyhlLG4pLHRoaXMuY3JlYXRlU3R5bGVzKGUsdCxuLHIpfSxlfSgpO2Z1bmN0aW9uICRlKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCksbz0xO288dDtvKyspbltvLTFdPWFyZ3VtZW50c1tvXTt2YXIgaT1BZS5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdChuKSksYT1cInNjLWdsb2JhbC1cIitUZShKU09OLnN0cmluZ2lmeShpKSksdT1uZXcgSGUoaSxhKTtmdW5jdGlvbiBkKGUpe3ZhciB0PXBlKCksbj1mZSgpLG89cyhNZSksZD1jKHQuYWxsb2NhdGVHU0luc3RhbmNlKGEpKS5jdXJyZW50O3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJnIuQ2hpbGRyZW4uY291bnQoZS5jaGlsZHJlbikmJmNvbnNvbGUud2FybihcIlRoZSBnbG9iYWwgc3R5bGUgY29tcG9uZW50IFwiK2ErXCIgd2FzIGdpdmVuIGNoaWxkIEpTWC4gY3JlYXRlR2xvYmFsU3R5bGUgZG9lcyBub3QgcmVuZGVyIGNoaWxkcmVuLlwiKSxcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZpLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlJiYtMSE9PWUuaW5kZXhPZihcIkBpbXBvcnRcIil9KSkmJmNvbnNvbGUud2FybihcIlBsZWFzZSBkbyBub3QgdXNlIEBpbXBvcnQgQ1NTIHN5bnRheCBpbiBjcmVhdGVHbG9iYWxTdHlsZSBhdCB0aGlzIHRpbWUsIGFzIHRoZSBDU1NPTSBBUElzIHdlIHVzZSBpbiBwcm9kdWN0aW9uIGRvIG5vdCBoYW5kbGUgaXQgd2VsbC4gSW5zdGVhZCwgd2UgcmVjb21tZW5kIHVzaW5nIGEgbGlicmFyeSBzdWNoIGFzIHJlYWN0LWhlbG1ldCB0byBpbmplY3QgYSB0eXBpY2FsIDxsaW5rPiBtZXRhIHRhZyB0byB0aGUgc3R5bGVzaGVldCwgb3Igc2ltcGx5IGVtYmVkZGluZyBpdCBtYW51YWxseSBpbiB5b3VyIGluZGV4Lmh0bWwgPGhlYWQ+IHNlY3Rpb24gZm9yIGEgc2ltcGxlciBhcHAuXCIpLHQuc2VydmVyJiZoKGQsZSx0LG8sbiksbCgoZnVuY3Rpb24oKXtpZighdC5zZXJ2ZXIpcmV0dXJuIGgoZCxlLHQsbyxuKSxmdW5jdGlvbigpe3JldHVybiB1LnJlbW92ZVN0eWxlcyhkLHQpfX0pLFtkLGUsdCxvLG5dKSxudWxsfWZ1bmN0aW9uIGgoZSx0LG4scixvKXtpZih1LmlzU3RhdGljKXUucmVuZGVyU3R5bGVzKGUsUCxuLG8pO2Vsc2V7dmFyIHM9eSh7fSx0LHt0aGVtZTpPZSh0LHIsZC5kZWZhdWx0UHJvcHMpfSk7dS5yZW5kZXJTdHlsZXMoZSxzLG4sbyl9fXJldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlBlKGEpLHIubWVtbyhkKX1mdW5jdGlvbiBXZShlKXtcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiZcIlJlYWN0TmF0aXZlXCI9PT1uYXZpZ2F0b3IucHJvZHVjdCYmY29uc29sZS53YXJuKFwiYGtleWZyYW1lc2AgY2Fubm90IGJlIHVzZWQgb24gUmVhY3ROYXRpdmUsIG9ubHkgb24gdGhlIHdlYi4gVG8gZG8gYW5pbWF0aW9uIGluIFJlYWN0TmF0aXZlIHBsZWFzZSB1c2UgQW5pbWF0ZWQuXCIpO2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCkscj0xO3I8dDtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTt2YXIgbz1BZS5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdChuKSkuam9pbihcIlwiKSxzPVRlKG8pO3JldHVybiBuZXcgeWUocyxvKX12YXIgVWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpczt0aGlzLl9lbWl0U2hlZXRDU1M9ZnVuY3Rpb24oKXt2YXIgdD1lLmluc3RhbmNlLnRvU3RyaW5nKCk7aWYoIXQpcmV0dXJuXCJcIjt2YXIgbj1ZKCk7cmV0dXJuXCI8c3R5bGUgXCIrW24mJidub25jZT1cIicrbisnXCInLE4rJz1cInRydWVcIicsJ2RhdGEtc3R5bGVkLXZlcnNpb249XCI1LjMuMTFcIiddLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKStcIj5cIit0K1wiPC9zdHlsZT5cIn0sdGhpcy5nZXRTdHlsZVRhZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gZS5zZWFsZWQ/RCgyKTplLl9lbWl0U2hlZXRDU1MoKX0sdGhpcy5nZXRTdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgdDtpZihlLnNlYWxlZClyZXR1cm4gRCgyKTt2YXIgbj0oKHQ9e30pW05dPVwiXCIsdFtcImRhdGEtc3R5bGVkLXZlcnNpb25cIl09XCI1LjMuMTFcIix0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXtfX2h0bWw6ZS5pbnN0YW5jZS50b1N0cmluZygpfSx0KSxvPVkoKTtyZXR1cm4gbyYmKG4ubm9uY2U9byksW3IuY3JlYXRlRWxlbWVudChcInN0eWxlXCIseSh7fSxuLHtrZXk6XCJzYy0wLTBcIn0pKV19LHRoaXMuc2VhbD1mdW5jdGlvbigpe2Uuc2VhbGVkPSEwfSx0aGlzLmluc3RhbmNlPW5ldyBYKHtpc1NlcnZlcjohMH0pLHRoaXMuc2VhbGVkPSExfXZhciB0PWUucHJvdG90eXBlO3JldHVybiB0LmNvbGxlY3RTdHlsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2VhbGVkP0QoMik6ci5jcmVhdGVFbGVtZW50KG1lLHtzaGVldDp0aGlzLmluc3RhbmNlfSxlKX0sdC5pbnRlcmxlYXZlV2l0aE5vZGVTdHJlYW09ZnVuY3Rpb24oZSl7cmV0dXJuIEQoMyl9LGV9KCksSmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ci5mb3J3YXJkUmVmKChmdW5jdGlvbih0LG4pe3ZhciBvPXMoTWUpLGk9ZS5kZWZhdWx0UHJvcHMsYT1PZSh0LG8saSk7cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmdm9pZCAwPT09YSYmY29uc29sZS53YXJuKCdbd2l0aFRoZW1lXSBZb3UgYXJlIG5vdCB1c2luZyBhIFRoZW1lUHJvdmlkZXIgbm9yIHBhc3NpbmcgYSB0aGVtZSBwcm9wIG9yIGEgdGhlbWUgaW4gZGVmYXVsdFByb3BzIGluIGNvbXBvbmVudCBjbGFzcyBcIicrYihlKSsnXCInKSxyLmNyZWF0ZUVsZW1lbnQoZSx5KHt9LHQse3RoZW1lOmEscmVmOm59KSl9KSk7cmV0dXJuIG0odCxlKSx0LmRpc3BsYXlOYW1lPVwiV2l0aFRoZW1lKFwiK2IoZSkrXCIpXCIsdH0sWGU9ZnVuY3Rpb24oKXtyZXR1cm4gcyhNZSl9LFplPXtTdHlsZVNoZWV0OlgsbWFzdGVyU2hlZXQ6ZGV9O1wicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBuYXZpZ2F0b3ImJlwiUmVhY3ROYXRpdmVcIj09PW5hdmlnYXRvci5wcm9kdWN0JiZjb25zb2xlLndhcm4oXCJJdCBsb29rcyBsaWtlIHlvdSd2ZSBpbXBvcnRlZCAnc3R5bGVkLWNvbXBvbmVudHMnIG9uIFJlYWN0IE5hdGl2ZS5cXG5QZXJoYXBzIHlvdSdyZSBsb29raW5nIHRvIGltcG9ydCAnc3R5bGVkLWNvbXBvbmVudHMvbmF0aXZlJz9cXG5SZWFkIG1vcmUgYWJvdXQgdGhpcyBhdCBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9iYXNpY3MjcmVhY3QtbmF0aXZlXCIpLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwidGVzdFwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3dbXCJfX3N0eWxlZC1jb21wb25lbnRzLWluaXRfX1wiXT13aW5kb3dbXCJfX3N0eWxlZC1jb21wb25lbnRzLWluaXRfX1wiXXx8MCwxPT09d2luZG93W1wiX19zdHlsZWQtY29tcG9uZW50cy1pbml0X19cIl0mJmNvbnNvbGUud2FybihcIkl0IGxvb2tzIGxpa2UgdGhlcmUgYXJlIHNldmVyYWwgaW5zdGFuY2VzIG9mICdzdHlsZWQtY29tcG9uZW50cycgaW5pdGlhbGl6ZWQgaW4gdGhpcyBhcHBsaWNhdGlvbi4gVGhpcyBtYXkgY2F1c2UgZHluYW1pYyBzdHlsZXMgdG8gbm90IHJlbmRlciBwcm9wZXJseSwgZXJyb3JzIGR1cmluZyB0aGUgcmVoeWRyYXRpb24gcHJvY2VzcywgYSBtaXNzaW5nIHRoZW1lIHByb3AsIGFuZCBtYWtlcyB5b3VyIGFwcGxpY2F0aW9uIGJpZ2dlciB3aXRob3V0IGdvb2QgcmVhc29uLlxcblxcblNlZSBodHRwczovL3MtYy5zaC8yQkFYemVkIGZvciBtb3JlIGluZm8uXCIpLHdpbmRvd1tcIl9fc3R5bGVkLWNvbXBvbmVudHMtaW5pdF9fXCJdKz0xKTtleHBvcnQgZGVmYXVsdCBxZTtleHBvcnR7VWUgYXMgU2VydmVyU3R5bGVTaGVldCx1ZSBhcyBTdHlsZVNoZWV0Q29uc3VtZXIsY2UgYXMgU3R5bGVTaGVldENvbnRleHQsbWUgYXMgU3R5bGVTaGVldE1hbmFnZXIsR2UgYXMgVGhlbWVDb25zdW1lcixNZSBhcyBUaGVtZUNvbnRleHQsTGUgYXMgVGhlbWVQcm92aWRlcixaZSBhcyBfX1BSSVZBVEVfXywkZSBhcyBjcmVhdGVHbG9iYWxTdHlsZSxBZSBhcyBjc3MsXyBhcyBpc1N0eWxlZENvbXBvbmVudCxXZSBhcyBrZXlmcmFtZXMsWGUgYXMgdXNlVGhlbWUsQSBhcyB2ZXJzaW9uLEplIGFzIHdpdGhUaGVtZX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHlsZWQtY29tcG9uZW50cy5icm93c2VyLmVzbS5qcy5tYXBcbiIsInZhciB1bml0bGVzc0tleXMgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiAxLFxuICBib3JkZXJJbWFnZU91dHNldDogMSxcbiAgYm9yZGVySW1hZ2VTbGljZTogMSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogMSxcbiAgYm94RmxleDogMSxcbiAgYm94RmxleEdyb3VwOiAxLFxuICBib3hPcmRpbmFsR3JvdXA6IDEsXG4gIGNvbHVtbkNvdW50OiAxLFxuICBjb2x1bW5zOiAxLFxuICBmbGV4OiAxLFxuICBmbGV4R3JvdzogMSxcbiAgZmxleFBvc2l0aXZlOiAxLFxuICBmbGV4U2hyaW5rOiAxLFxuICBmbGV4TmVnYXRpdmU6IDEsXG4gIGZsZXhPcmRlcjogMSxcbiAgZ3JpZFJvdzogMSxcbiAgZ3JpZFJvd0VuZDogMSxcbiAgZ3JpZFJvd1NwYW46IDEsXG4gIGdyaWRSb3dTdGFydDogMSxcbiAgZ3JpZENvbHVtbjogMSxcbiAgZ3JpZENvbHVtbkVuZDogMSxcbiAgZ3JpZENvbHVtblNwYW46IDEsXG4gIGdyaWRDb2x1bW5TdGFydDogMSxcbiAgbXNHcmlkUm93OiAxLFxuICBtc0dyaWRSb3dTcGFuOiAxLFxuICBtc0dyaWRDb2x1bW46IDEsXG4gIG1zR3JpZENvbHVtblNwYW46IDEsXG4gIGZvbnRXZWlnaHQ6IDEsXG4gIGxpbmVIZWlnaHQ6IDEsXG4gIG9wYWNpdHk6IDEsXG4gIG9yZGVyOiAxLFxuICBvcnBoYW5zOiAxLFxuICB0YWJTaXplOiAxLFxuICB3aWRvd3M6IDEsXG4gIHpJbmRleDogMSxcbiAgem9vbTogMSxcbiAgV2Via2l0TGluZUNsYW1wOiAxLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiAxLFxuICBmbG9vZE9wYWNpdHk6IDEsXG4gIHN0b3BPcGFjaXR5OiAxLFxuICBzdHJva2VEYXNoYXJyYXk6IDEsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IDEsXG4gIHN0cm9rZU1pdGVybGltaXQ6IDEsXG4gIHN0cm9rZU9wYWNpdHk6IDEsXG4gIHN0cm9rZVdpZHRoOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCB1bml0bGVzc0tleXM7XG4iLCIvKiFcbiogdGFiYmFibGUgNi4yLjBcbiogQGxpY2Vuc2UgTUlULCBodHRwczovL2dpdGh1Yi5jb20vZm9jdXMtdHJhcC90YWJiYWJsZS9ibG9iL21hc3Rlci9MSUNFTlNFXG4qL1xuLy8gTk9URTogc2VwYXJhdGUgYDpub3QoKWAgc2VsZWN0b3JzIGhhcyBicm9hZGVyIGJyb3dzZXIgc3VwcG9ydCB0aGFuIHRoZSBuZXdlclxuLy8gIGA6bm90KFtpbmVydF0sIFtpbmVydF0gKilgIChGZWIgMjAyMylcbi8vIENBUkVGVUw6IEpTRG9tIGRvZXMgbm90IHN1cHBvcnQgYDpub3QoW2luZXJ0XSAqKWAgYXMgYSBzZWxlY3RvcjsgdXNpbmcgaXQgY2F1c2VzXG4vLyAgdGhlIGVudGlyZSBxdWVyeSB0byBmYWlsLCByZXN1bHRpbmcgaW4gbm8gbm9kZXMgZm91bmQsIHdoaWNoIHdpbGwgYnJlYWsgYSBsb3Rcbi8vICBvZiB0aGluZ3MuLi4gc28gd2UgaGF2ZSB0byByZWx5IG9uIEpTIHRvIGlkZW50aWZ5IG5vZGVzIGluc2lkZSBhbiBpbmVydCBjb250YWluZXJcbnZhciBjYW5kaWRhdGVTZWxlY3RvcnMgPSBbJ2lucHV0Om5vdChbaW5lcnRdKScsICdzZWxlY3Q6bm90KFtpbmVydF0pJywgJ3RleHRhcmVhOm5vdChbaW5lcnRdKScsICdhW2hyZWZdOm5vdChbaW5lcnRdKScsICdidXR0b246bm90KFtpbmVydF0pJywgJ1t0YWJpbmRleF06bm90KHNsb3QpOm5vdChbaW5lcnRdKScsICdhdWRpb1tjb250cm9sc106bm90KFtpbmVydF0pJywgJ3ZpZGVvW2NvbnRyb2xzXTpub3QoW2luZXJ0XSknLCAnW2NvbnRlbnRlZGl0YWJsZV06bm90KFtjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiXSk6bm90KFtpbmVydF0pJywgJ2RldGFpbHM+c3VtbWFyeTpmaXJzdC1vZi10eXBlOm5vdChbaW5lcnRdKScsICdkZXRhaWxzOm5vdChbaW5lcnRdKSddO1xudmFyIGNhbmRpZGF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY2FuZGlkYXRlU2VsZWN0b3JzLmpvaW4oJywnKTtcbnZhciBOb0VsZW1lbnQgPSB0eXBlb2YgRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCc7XG52YXIgbWF0Y2hlcyA9IE5vRWxlbWVudCA/IGZ1bmN0aW9uICgpIHt9IDogRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyB8fCBFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG52YXIgZ2V0Um9vdE5vZGUgPSAhTm9FbGVtZW50ICYmIEVsZW1lbnQucHJvdG90eXBlLmdldFJvb3ROb2RlID8gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgdmFyIF9lbGVtZW50JGdldFJvb3ROb2RlO1xuICByZXR1cm4gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2VsZW1lbnQkZ2V0Um9vdE5vZGUgPSBlbGVtZW50LmdldFJvb3ROb2RlKSA9PT0gbnVsbCB8fCBfZWxlbWVudCRnZXRSb290Tm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZW1lbnQkZ2V0Um9vdE5vZGUuY2FsbChlbGVtZW50KTtcbn0gOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBub2RlIGlzIGluZXJ0IG9yIGluIGFuIGluZXJ0IGFuY2VzdG9yLlxuICogQHBhcmFtIHtFbGVtZW50fSBbbm9kZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvb2tVcF0gSWYgdHJ1ZSBhbmQgYG5vZGVgIGlzIG5vdCBpbmVydCwgbG9va3MgdXAgYXQgYW5jZXN0b3JzIHRvXG4gKiAgc2VlIGlmIGFueSBvZiB0aGVtIGFyZSBpbmVydC4gSWYgZmFsc2UsIG9ubHkgYG5vZGVgIGl0c2VsZiBpcyBjb25zaWRlcmVkLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgaW5lcnQgaXRzZWxmIG9yIGJ5IHdheSBvZiBiZWluZyBpbiBhbiBpbmVydCBhbmNlc3Rvci5cbiAqICBGYWxzZSBpZiBgbm9kZWAgaXMgZmFsc3kuXG4gKi9cbnZhciBpc0luZXJ0ID0gZnVuY3Rpb24gaXNJbmVydChub2RlLCBsb29rVXApIHtcbiAgdmFyIF9ub2RlJGdldEF0dHJpYnV0ZTtcbiAgaWYgKGxvb2tVcCA9PT0gdm9pZCAwKSB7XG4gICAgbG9va1VwID0gdHJ1ZTtcbiAgfVxuICAvLyBDQVJFRlVMOiBKU0RvbSBkb2VzIG5vdCBzdXBwb3J0IGluZXJ0IGF0IGFsbCwgc28gd2UgY2FuJ3QgdXNlIHRoZSBgSFRNTEVsZW1lbnQuaW5lcnRgXG4gIC8vICBKUyBBUEkgcHJvcGVydHk7IHdlIGhhdmUgdG8gY2hlY2sgdGhlIGF0dHJpYnV0ZSwgd2hpY2ggY2FuIGVpdGhlciBiZSBlbXB0eSBvciAndHJ1ZSc7XG4gIC8vICBpZiBpdCdzIGBudWxsYCAobm90IHNwZWNpZmllZCkgb3IgJ2ZhbHNlJywgaXQncyBhbiBhY3RpdmUgZWxlbWVudFxuICB2YXIgaW5lcnRBdHQgPSBub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfbm9kZSRnZXRBdHRyaWJ1dGUgPSBub2RlLmdldEF0dHJpYnV0ZSkgPT09IG51bGwgfHwgX25vZGUkZ2V0QXR0cmlidXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbm9kZSRnZXRBdHRyaWJ1dGUuY2FsbChub2RlLCAnaW5lcnQnKTtcbiAgdmFyIGluZXJ0ID0gaW5lcnRBdHQgPT09ICcnIHx8IGluZXJ0QXR0ID09PSAndHJ1ZSc7XG5cbiAgLy8gTk9URTogdGhpcyBjb3VsZCBhbHNvIGJlIGhhbmRsZWQgd2l0aCBgbm9kZS5tYXRjaGVzKCdbaW5lcnRdLCA6aXMoW2luZXJ0XSAqKScpYFxuICAvLyAgaWYgaXQgd2VyZW4ndCBmb3IgYG1hdGNoZXMoKWAgbm90IGJlaW5nIGEgZnVuY3Rpb24gb24gc2hhZG93IHJvb3RzOyB0aGUgZm9sbG93aW5nXG4gIC8vICBjb2RlIHdvcmtzIGZvciBhbnkga2luZCBvZiBub2RlXG4gIC8vIENBUkVGVUw6IEpTRG9tIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IGNlcnRhaW4gc2VsZWN0b3JzIGxpa2UgYDpub3QoW2luZXJ0XSAqKWBcbiAgLy8gIHNvIGl0IGxpa2VseSB3b3VsZCBub3Qgc3VwcG9ydCBgOmlzKFtpbmVydF0gKilgIGVpdGhlci4uLlxuICB2YXIgcmVzdWx0ID0gaW5lcnQgfHwgbG9va1VwICYmIG5vZGUgJiYgaXNJbmVydChub2RlLnBhcmVudE5vZGUpOyAvLyByZWN1cnNpdmVcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgbm9kZSdzIGNvbnRlbnQgaXMgZWRpdGFibGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IFtub2RlXVxuICogQHJldHVybnMgVHJ1ZSBpZiBpdCdzIGNvbnRlbnQtZWRpdGFibGU7IGZhbHNlIGlmIGl0J3Mgbm90IG9yIGBub2RlYCBpcyBmYWxzeS5cbiAqL1xudmFyIGlzQ29udGVudEVkaXRhYmxlID0gZnVuY3Rpb24gaXNDb250ZW50RWRpdGFibGUobm9kZSkge1xuICB2YXIgX25vZGUkZ2V0QXR0cmlidXRlMjtcbiAgLy8gQ0FSRUZVTDogSlNEb20gZG9lcyBub3Qgc3VwcG9ydCB0aGUgYEhUTUxFbGVtZW50LmlzQ29udGVudEVkaXRhYmxlYCBBUEkgc28gd2UgaGF2ZVxuICAvLyAgdG8gdXNlIHRoZSBhdHRyaWJ1dGUgZGlyZWN0bHkgdG8gY2hlY2sgZm9yIHRoaXMsIHdoaWNoIGNhbiBlaXRoZXIgYmUgZW1wdHkgb3IgJ3RydWUnO1xuICAvLyAgaWYgaXQncyBgbnVsbGAgKG5vdCBzcGVjaWZpZWQpIG9yICdmYWxzZScsIGl0J3MgYSBub24tZWRpdGFibGUgZWxlbWVudFxuICB2YXIgYXR0VmFsdWUgPSBub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfbm9kZSRnZXRBdHRyaWJ1dGUyID0gbm9kZS5nZXRBdHRyaWJ1dGUpID09PSBudWxsIHx8IF9ub2RlJGdldEF0dHJpYnV0ZTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ub2RlJGdldEF0dHJpYnV0ZTIuY2FsbChub2RlLCAnY29udGVudGVkaXRhYmxlJyk7XG4gIHJldHVybiBhdHRWYWx1ZSA9PT0gJycgfHwgYXR0VmFsdWUgPT09ICd0cnVlJztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBjb250YWluZXIgdG8gY2hlY2sgaW5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUNvbnRhaW5lciBhZGQgY29udGFpbmVyIHRvIGNoZWNrXG4gKiBAcGFyYW0geyhub2RlOiBFbGVtZW50KSA9PiBib29sZWFufSBmaWx0ZXIgZmlsdGVyIGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gKi9cbnZhciBnZXRDYW5kaWRhdGVzID0gZnVuY3Rpb24gZ2V0Q2FuZGlkYXRlcyhlbCwgaW5jbHVkZUNvbnRhaW5lciwgZmlsdGVyKSB7XG4gIC8vIGV2ZW4gaWYgYGluY2x1ZGVDb250YWluZXI9ZmFsc2VgLCB3ZSBzdGlsbCBoYXZlIHRvIGNoZWNrIGl0IGZvciBpbmVydG5lc3MgYmVjYXVzZVxuICAvLyAgaWYgaXQncyBpbmVydCwgYWxsIGl0cyBjaGlsZHJlbiBhcmUgaW5lcnRcbiAgaWYgKGlzSW5lcnQoZWwpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBjYW5kaWRhdGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGVsLnF1ZXJ5U2VsZWN0b3JBbGwoY2FuZGlkYXRlU2VsZWN0b3IpKTtcbiAgaWYgKGluY2x1ZGVDb250YWluZXIgJiYgbWF0Y2hlcy5jYWxsKGVsLCBjYW5kaWRhdGVTZWxlY3RvcikpIHtcbiAgICBjYW5kaWRhdGVzLnVuc2hpZnQoZWwpO1xuICB9XG4gIGNhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzLmZpbHRlcihmaWx0ZXIpO1xuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFNoYWRvd1Jvb3RcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCB0byBjaGVjayBmb3Igc2hhZG93IHJvb3RcbiAqIEByZXR1cm5zIHtTaGFkb3dSb290fGJvb2xlYW59IFNoYWRvd1Jvb3QgaWYgYXZhaWxhYmxlIG9yIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhIHNoYWRvd1Jvb3QgaXMgYXR0YWNoZWQgYnV0IG5vdCBhdmFpbGFibGUuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2hhZG93Um9vdEZpbHRlclxuICogQHBhcmFtIHtFbGVtZW50fSBzaGFkb3dIb3N0Tm9kZSB0aGUgZWxlbWVudCB3aGljaCBjb250YWlucyBzaGFkb3cgY29udGVudFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYSBzaGFkb3cgcm9vdCBjb3VsZCBwb3RlbnRpYWxseSBjb250YWluIHZhbGlkIGNhbmRpZGF0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDYW5kaWRhdGVTY29wZVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBzY29wZVBhcmVudCBjb250YWlucyBpbm5lciBjYW5kaWRhdGVzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gY2FuZGlkYXRlcyBsaXN0IG9mIGNhbmRpZGF0ZXMgZm91bmQgaW4gdGhlIHNjb3BlIHBhcmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSXRlcmF0aXZlT3B0aW9uc1xuICogQHByb3BlcnR5IHtHZXRTaGFkb3dSb290fGJvb2xlYW59IGdldFNoYWRvd1Jvb3QgdHJ1ZSBpZiBzaGFkb3cgc3VwcG9ydCBpcyBlbmFibGVkOyBmYWxzeSBpZiBub3Q7XG4gKiAgaWYgYSBmdW5jdGlvbiwgaW1wbGllcyBzaGFkb3cgc3VwcG9ydCBpcyBlbmFibGVkIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgc2hhZG93IHJvb3Qgb2YgYW4gZWxlbWVudFxuICogIG9yIGEgYm9vbGVhbiBzdGF0aW5nIGlmIGl0IGhhcyBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgcm9vdFxuICogQHByb3BlcnR5IHsobm9kZTogRWxlbWVudCkgPT4gYm9vbGVhbn0gZmlsdGVyIGZpbHRlciBjYW5kaWRhdGVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGZsYXR0ZW4gaWYgdHJ1ZSB0aGVuIHJlc3VsdCB3aWxsIGZsYXR0ZW4gYW55IENhbmRpZGF0ZVNjb3BlIGludG8gdGhlIHJldHVybmVkIGxpc3RcbiAqIEBwcm9wZXJ0eSB7U2hhZG93Um9vdEZpbHRlcn0gc2hhZG93Um9vdEZpbHRlciBmaWx0ZXIgc2hhZG93IHJvb3RzO1xuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50W119IGVsZW1lbnRzIGxpc3Qgb2YgZWxlbWVudCBjb250YWluZXJzIHRvIG1hdGNoIGNhbmRpZGF0ZXMgZnJvbVxuICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQ29udGFpbmVyIGFkZCBjb250YWluZXIgbGlzdCB0byBjaGVja1xuICogQHBhcmFtIHtJdGVyYXRpdmVPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJucyB7QXJyYXkuPEVsZW1lbnR8Q2FuZGlkYXRlU2NvcGU+fVxuICovXG52YXIgZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5ID0gZnVuY3Rpb24gZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5KGVsZW1lbnRzLCBpbmNsdWRlQ29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHZhciBjYW5kaWRhdGVzID0gW107XG4gIHZhciBlbGVtZW50c1RvQ2hlY2sgPSBBcnJheS5mcm9tKGVsZW1lbnRzKTtcbiAgd2hpbGUgKGVsZW1lbnRzVG9DaGVjay5sZW5ndGgpIHtcbiAgICB2YXIgZWxlbWVudCA9IGVsZW1lbnRzVG9DaGVjay5zaGlmdCgpO1xuICAgIGlmIChpc0luZXJ0KGVsZW1lbnQsIGZhbHNlKSkge1xuICAgICAgLy8gbm8gbmVlZCB0byBsb29rIHVwIHNpbmNlIHdlJ3JlIGRyaWxsaW5nIGRvd25cbiAgICAgIC8vIGFueXRoaW5nIGluc2lkZSB0aGlzIGNvbnRhaW5lciB3aWxsIGFsc28gYmUgaW5lcnRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0xPVCcpIHtcbiAgICAgIC8vIGFkZCBzaGFkb3cgZG9tIHNsb3Qgc2NvcGUgKHNsb3QgaXRzZWxmIGNhbm5vdCBiZSBmb2N1c2FibGUpXG4gICAgICB2YXIgYXNzaWduZWQgPSBlbGVtZW50LmFzc2lnbmVkRWxlbWVudHMoKTtcbiAgICAgIHZhciBjb250ZW50ID0gYXNzaWduZWQubGVuZ3RoID8gYXNzaWduZWQgOiBlbGVtZW50LmNoaWxkcmVuO1xuICAgICAgdmFyIG5lc3RlZENhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoY29udGVudCwgdHJ1ZSwgb3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5mbGF0dGVuKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaC5hcHBseShjYW5kaWRhdGVzLCBuZXN0ZWRDYW5kaWRhdGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgICAgc2NvcGVQYXJlbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgY2FuZGlkYXRlczogbmVzdGVkQ2FuZGlkYXRlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2hlY2sgY2FuZGlkYXRlIGVsZW1lbnRcbiAgICAgIHZhciB2YWxpZENhbmRpZGF0ZSA9IG1hdGNoZXMuY2FsbChlbGVtZW50LCBjYW5kaWRhdGVTZWxlY3Rvcik7XG4gICAgICBpZiAodmFsaWRDYW5kaWRhdGUgJiYgb3B0aW9ucy5maWx0ZXIoZWxlbWVudCkgJiYgKGluY2x1ZGVDb250YWluZXIgfHwgIWVsZW1lbnRzLmluY2x1ZGVzKGVsZW1lbnQpKSkge1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGl0ZXJhdGUgb3ZlciBzaGFkb3cgY29udGVudCBpZiBwb3NzaWJsZVxuICAgICAgdmFyIHNoYWRvd1Jvb3QgPSBlbGVtZW50LnNoYWRvd1Jvb3QgfHxcbiAgICAgIC8vIGNoZWNrIGZvciBhbiB1bmRpc2Nsb3NlZCBzaGFkb3dcbiAgICAgIHR5cGVvZiBvcHRpb25zLmdldFNoYWRvd1Jvb3QgPT09ICdmdW5jdGlvbicgJiYgb3B0aW9ucy5nZXRTaGFkb3dSb290KGVsZW1lbnQpO1xuXG4gICAgICAvLyBubyBpbmVydCBsb29rIHVwIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBkcmlsbGluZyBkb3duIGFuZCBjaGVja2luZyBmb3IgaW5lcnRuZXNzXG4gICAgICAvLyAgb24gdGhlIHdheSBkb3duLCBzbyBhbGwgY29udGFpbmVycyB0byB0aGlzIHJvb3Qgbm9kZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW5cbiAgICAgIC8vICB2ZXR0ZWQgYXMgbm9uLWluZXJ0XG4gICAgICB2YXIgdmFsaWRTaGFkb3dSb290ID0gIWlzSW5lcnQoc2hhZG93Um9vdCwgZmFsc2UpICYmICghb3B0aW9ucy5zaGFkb3dSb290RmlsdGVyIHx8IG9wdGlvbnMuc2hhZG93Um9vdEZpbHRlcihlbGVtZW50KSk7XG4gICAgICBpZiAoc2hhZG93Um9vdCAmJiB2YWxpZFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgLy8gYWRkIHNoYWRvdyBkb20gc2NvcGUgSUlGIGEgc2hhZG93IHJvb3Qgbm9kZSB3YXMgZ2l2ZW47IG90aGVyd2lzZSwgYW4gdW5kaXNjbG9zZWRcbiAgICAgICAgLy8gIHNoYWRvdyBleGlzdHMsIHNvIGxvb2sgYXQgbGlnaHQgZG9tIGNoaWxkcmVuIGFzIGZhbGxiYWNrIEJVVCBjcmVhdGUgYSBzY29wZSBmb3IgYW55XG4gICAgICAgIC8vICBjaGlsZCBjYW5kaWRhdGVzIGZvdW5kIGJlY2F1c2UgdGhleSdyZSBsaWtlbHkgc2xvdHRlZCBlbGVtZW50cyAoZWxlbWVudHMgdGhhdCBhcmVcbiAgICAgICAgLy8gIGNoaWxkcmVuIG9mIHRoZSB3ZWIgY29tcG9uZW50IGVsZW1lbnQgKHdoaWNoIGhhcyB0aGUgc2hhZG93KSwgaW4gdGhlIGxpZ2h0IGRvbSwgYnV0XG4gICAgICAgIC8vICBzbG90dGVkIHNvbWV3aGVyZSBfaW5zaWRlXyB0aGUgdW5kaXNjbG9zZWQgc2hhZG93KSAtLSB0aGUgc2NvcGUgaXMgY3JlYXRlZCBiZWxvdyxcbiAgICAgICAgLy8gIF9hZnRlcl8gd2UgcmV0dXJuIGZyb20gdGhpcyByZWN1cnNpdmUgY2FsbFxuICAgICAgICB2YXIgX25lc3RlZENhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoc2hhZG93Um9vdCA9PT0gdHJ1ZSA/IGVsZW1lbnQuY2hpbGRyZW4gOiBzaGFkb3dSb290LmNoaWxkcmVuLCB0cnVlLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZmxhdHRlbikge1xuICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaC5hcHBseShjYW5kaWRhdGVzLCBfbmVzdGVkQ2FuZGlkYXRlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgICAgIHNjb3BlUGFyZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgY2FuZGlkYXRlczogX25lc3RlZENhbmRpZGF0ZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlcmUncyBub3Qgc2hhZG93IHNvIGp1c3QgZGlnIGludG8gdGhlIGVsZW1lbnQncyAobGlnaHQgZG9tKSBjaGlsZHJlblxuICAgICAgICAvLyAgX193aXRob3V0X18gZ2l2aW5nIHRoZSBlbGVtZW50IHNwZWNpYWwgc2NvcGUgdHJlYXRtZW50XG4gICAgICAgIGVsZW1lbnRzVG9DaGVjay51bnNoaWZ0LmFwcGx5KGVsZW1lbnRzVG9DaGVjaywgZWxlbWVudC5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjYW5kaWRhdGVzO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogRGV0ZXJtaW5lcyBpZiB0aGUgbm9kZSBoYXMgYW4gZXhwbGljaXRseSBzcGVjaWZpZWQgYHRhYmluZGV4YCBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBzbzsgZmFsc2UgaWYgbm90LlxuICovXG52YXIgaGFzVGFiSW5kZXggPSBmdW5jdGlvbiBoYXNUYWJJbmRleChub2RlKSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VJbnQobm9kZS5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JyksIDEwKSk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB0aGUgdGFiIGluZGV4IG9mIGEgZ2l2ZW4gbm9kZS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRhYiBvcmRlciAobmVnYXRpdmUsIDAsIG9yIHBvc2l0aXZlIG51bWJlcikuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYG5vZGVgIGlzIGZhbHN5LlxuICovXG52YXIgZ2V0VGFiSW5kZXggPSBmdW5jdGlvbiBnZXRUYWJJbmRleChub2RlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gbm9kZSBwcm92aWRlZCcpO1xuICB9XG4gIGlmIChub2RlLnRhYkluZGV4IDwgMCkge1xuICAgIC8vIGluIENocm9tZSwgPGRldGFpbHMvPiwgPGF1ZGlvIGNvbnRyb2xzLz4gYW5kIDx2aWRlbyBjb250cm9scy8+IGVsZW1lbnRzIGdldCBhIGRlZmF1bHRcbiAgICAvLyBgdGFiSW5kZXhgIG9mIC0xIHdoZW4gdGhlICd0YWJpbmRleCcgYXR0cmlidXRlIGlzbid0IHNwZWNpZmllZCBpbiB0aGUgRE9NLFxuICAgIC8vIHlldCB0aGV5IGFyZSBzdGlsbCBwYXJ0IG9mIHRoZSByZWd1bGFyIHRhYiBvcmRlcjsgaW4gRkYsIHRoZXkgZ2V0IGEgZGVmYXVsdFxuICAgIC8vIGB0YWJJbmRleGAgb2YgMDsgc2luY2UgQ2hyb21lIHN0aWxsIHB1dHMgdGhvc2UgZWxlbWVudHMgaW4gdGhlIHJlZ3VsYXIgdGFiXG4gICAgLy8gb3JkZXIsIGNvbnNpZGVyIHRoZWlyIHRhYiBpbmRleCB0byBiZSAwLlxuICAgIC8vIEFsc28gYnJvd3NlcnMgZG8gbm90IHJldHVybiBgdGFiSW5kZXhgIGNvcnJlY3RseSBmb3IgY29udGVudEVkaXRhYmxlIG5vZGVzO1xuICAgIC8vIHNvIGlmIHRoZXkgZG9uJ3QgaGF2ZSBhIHRhYmluZGV4IGF0dHJpYnV0ZSBzcGVjaWZpY2FsbHkgc2V0LCBhc3N1bWUgaXQncyAwLlxuICAgIGlmICgoL14oQVVESU98VklERU98REVUQUlMUykkLy50ZXN0KG5vZGUudGFnTmFtZSkgfHwgaXNDb250ZW50RWRpdGFibGUobm9kZSkpICYmICFoYXNUYWJJbmRleChub2RlKSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG4gIHJldHVybiBub2RlLnRhYkluZGV4O1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIHRhYiBpbmRleCBvZiBhIGdpdmVuIG5vZGUgX19mb3Igc29ydCBvcmRlciBwdXJwb3Nlc19fLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtib29sZWFufSBbaXNTY29wZV0gVHJ1ZSBmb3IgYSBjdXN0b20gZWxlbWVudCB3aXRoIHNoYWRvdyByb290IG9yIHNsb3QgdGhhdCwgYnkgZGVmYXVsdCxcbiAqICBoYXMgdGFiSW5kZXggLTEsIGJ1dCBuZWVkcyB0byBiZSBzb3J0ZWQgYnkgZG9jdW1lbnQgb3JkZXIgaW4gb3JkZXIgZm9yIGl0cyBjb250ZW50IHRvIGJlXG4gKiAgaW5zZXJ0ZWQgaW50byB0aGUgY29ycmVjdCBzb3J0IHBvc2l0aW9uLlxuICogQHJldHVybnMge251bWJlcn0gVGFiIG9yZGVyIChuZWdhdGl2ZSwgMCwgb3IgcG9zaXRpdmUgbnVtYmVyKS5cbiAqL1xudmFyIGdldFNvcnRPcmRlclRhYkluZGV4ID0gZnVuY3Rpb24gZ2V0U29ydE9yZGVyVGFiSW5kZXgobm9kZSwgaXNTY29wZSkge1xuICB2YXIgdGFiSW5kZXggPSBnZXRUYWJJbmRleChub2RlKTtcbiAgaWYgKHRhYkluZGV4IDwgMCAmJiBpc1Njb3BlICYmICFoYXNUYWJJbmRleChub2RlKSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiB0YWJJbmRleDtcbn07XG52YXIgc29ydE9yZGVyZWRUYWJiYWJsZXMgPSBmdW5jdGlvbiBzb3J0T3JkZXJlZFRhYmJhYmxlcyhhLCBiKSB7XG4gIHJldHVybiBhLnRhYkluZGV4ID09PSBiLnRhYkluZGV4ID8gYS5kb2N1bWVudE9yZGVyIC0gYi5kb2N1bWVudE9yZGVyIDogYS50YWJJbmRleCAtIGIudGFiSW5kZXg7XG59O1xudmFyIGlzSW5wdXQgPSBmdW5jdGlvbiBpc0lucHV0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ0lOUFVUJztcbn07XG52YXIgaXNIaWRkZW5JbnB1dCA9IGZ1bmN0aW9uIGlzSGlkZGVuSW5wdXQobm9kZSkge1xuICByZXR1cm4gaXNJbnB1dChub2RlKSAmJiBub2RlLnR5cGUgPT09ICdoaWRkZW4nO1xufTtcbnZhciBpc0RldGFpbHNXaXRoU3VtbWFyeSA9IGZ1bmN0aW9uIGlzRGV0YWlsc1dpdGhTdW1tYXJ5KG5vZGUpIHtcbiAgdmFyIHIgPSBub2RlLnRhZ05hbWUgPT09ICdERVRBSUxTJyAmJiBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkobm9kZS5jaGlsZHJlbikuc29tZShmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQudGFnTmFtZSA9PT0gJ1NVTU1BUlknO1xuICB9KTtcbiAgcmV0dXJuIHI7XG59O1xudmFyIGdldENoZWNrZWRSYWRpbyA9IGZ1bmN0aW9uIGdldENoZWNrZWRSYWRpbyhub2RlcywgZm9ybSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG5vZGVzW2ldLmNoZWNrZWQgJiYgbm9kZXNbaV0uZm9ybSA9PT0gZm9ybSkge1xuICAgICAgcmV0dXJuIG5vZGVzW2ldO1xuICAgIH1cbiAgfVxufTtcbnZhciBpc1RhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc1RhYmJhYmxlUmFkaW8obm9kZSkge1xuICBpZiAoIW5vZGUubmFtZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciByYWRpb1Njb3BlID0gbm9kZS5mb3JtIHx8IGdldFJvb3ROb2RlKG5vZGUpO1xuICB2YXIgcXVlcnlSYWRpb3MgPSBmdW5jdGlvbiBxdWVyeVJhZGlvcyhuYW1lKSB7XG4gICAgcmV0dXJuIHJhZGlvU2NvcGUucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cInJhZGlvXCJdW25hbWU9XCInICsgbmFtZSArICdcIl0nKTtcbiAgfTtcbiAgdmFyIHJhZGlvU2V0O1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5DU1MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuQ1NTLmVzY2FwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJhZGlvU2V0ID0gcXVlcnlSYWRpb3Mod2luZG93LkNTUy5lc2NhcGUobm9kZS5uYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHJhZGlvU2V0ID0gcXVlcnlSYWRpb3Mobm9kZS5uYW1lKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKCdMb29rcyBsaWtlIHlvdSBoYXZlIGEgcmFkaW8gYnV0dG9uIHdpdGggYSBuYW1lIGF0dHJpYnV0ZSBjb250YWluaW5nIGludmFsaWQgQ1NTIHNlbGVjdG9yIGNoYXJhY3RlcnMgYW5kIG5lZWQgdGhlIENTUy5lc2NhcGUgcG9seWZpbGw6ICVzJywgZXJyLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICB2YXIgY2hlY2tlZCA9IGdldENoZWNrZWRSYWRpbyhyYWRpb1NldCwgbm9kZS5mb3JtKTtcbiAgcmV0dXJuICFjaGVja2VkIHx8IGNoZWNrZWQgPT09IG5vZGU7XG59O1xudmFyIGlzUmFkaW8gPSBmdW5jdGlvbiBpc1JhZGlvKG5vZGUpIHtcbiAgcmV0dXJuIGlzSW5wdXQobm9kZSkgJiYgbm9kZS50eXBlID09PSAncmFkaW8nO1xufTtcbnZhciBpc05vblRhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc05vblRhYmJhYmxlUmFkaW8obm9kZSkge1xuICByZXR1cm4gaXNSYWRpbyhub2RlKSAmJiAhaXNUYWJiYWJsZVJhZGlvKG5vZGUpO1xufTtcblxuLy8gZGV0ZXJtaW5lcyBpZiBhIG5vZGUgaXMgdWx0aW1hdGVseSBhdHRhY2hlZCB0byB0aGUgd2luZG93J3MgZG9jdW1lbnRcbnZhciBpc05vZGVBdHRhY2hlZCA9IGZ1bmN0aW9uIGlzTm9kZUF0dGFjaGVkKG5vZGUpIHtcbiAgdmFyIF9ub2RlUm9vdDtcbiAgLy8gVGhlIHJvb3Qgbm9kZSBpcyB0aGUgc2hhZG93IHJvb3QgaWYgdGhlIG5vZGUgaXMgaW4gYSBzaGFkb3cgRE9NOyBzb21lIGRvY3VtZW50IG90aGVyd2lzZVxuICAvLyAgKGJ1dCBOT1QgX3RoZV8gZG9jdW1lbnQ7IHNlZSBzZWNvbmQgJ0lmJyBjb21tZW50IGJlbG93IGZvciBtb3JlKS5cbiAgLy8gSWYgcm9vdE5vZGUgaXMgc2hhZG93IHJvb3QsIGl0J2xsIGhhdmUgYSBob3N0LCB3aGljaCBpcyB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgc2hhZG93XG4gIC8vICBpcyBhdHRhY2hlZCwgYW5kIHRoZSBvbmUgd2UgbmVlZCB0byBjaGVjayBpZiBpdCdzIGluIHRoZSBkb2N1bWVudCBvciBub3QgKGJlY2F1c2UgdGhlXG4gIC8vICBzaGFkb3csIGFuZCBhbGwgbm9kZXMgaXQgY29udGFpbnMsIGlzIG5ldmVyIGNvbnNpZGVyZWQgaW4gdGhlIGRvY3VtZW50IHNpbmNlIHNoYWRvd3NcbiAgLy8gIGJlaGF2ZSBsaWtlIHNlbGYtY29udGFpbmVkIERPTXM7IGJ1dCBpZiB0aGUgc2hhZG93J3MgSE9TVCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgZG9jdW1lbnQsXG4gIC8vICBpcyBoaWRkZW4sIG9yIGlzIG5vdCBpbiB0aGUgZG9jdW1lbnQgaXRzZWxmIGJ1dCBpcyBkZXRhY2hlZCwgaXQgd2lsbCBhZmZlY3QgdGhlIHNoYWRvdydzXG4gIC8vICB2aXNpYmlsaXR5LCBpbmNsdWRpbmcgYWxsIHRoZSBub2RlcyBpdCBjb250YWlucykuIFRoZSBob3N0IGNvdWxkIGJlIGFueSBub3JtYWwgbm9kZSxcbiAgLy8gIG9yIGEgY3VzdG9tIGVsZW1lbnQgKGkuZS4gd2ViIGNvbXBvbmVudCkuIEVpdGhlciB3YXksIHRoYXQncyB0aGUgb25lIHRoYXQgaXMgY29uc2lkZXJlZFxuICAvLyAgcGFydCBvZiB0aGUgZG9jdW1lbnQsIG5vdCB0aGUgc2hhZG93IHJvb3QsIG5vciBhbnkgb2YgaXRzIGNoaWxkcmVuIChpLmUuIHRoZSBub2RlIGJlaW5nXG4gIC8vICB0ZXN0ZWQpLlxuICAvLyBUbyBmdXJ0aGVyIGNvbXBsaWNhdGUgdGhpbmdzLCB3ZSBoYXZlIHRvIGxvb2sgYWxsIHRoZSB3YXkgdXAgdW50aWwgd2UgZmluZCBhIHNoYWRvdyBIT1NUXG4gIC8vICB0aGF0IGlzIGF0dGFjaGVkIChvciBmaW5kIG5vbmUpIGJlY2F1c2UgdGhlIG5vZGUgbWlnaHQgYmUgaW4gbmVzdGVkIHNoYWRvd3MuLi5cbiAgLy8gSWYgcm9vdE5vZGUgaXMgbm90IGEgc2hhZG93IHJvb3QsIGl0IHdvbid0IGhhdmUgYSBob3N0LCBhbmQgc28gcm9vdE5vZGUgc2hvdWxkIGJlIHRoZVxuICAvLyAgZG9jdW1lbnQgKHBlciB0aGUgZG9jcykgYW5kIHdoaWxlIGl0J3MgYSBEb2N1bWVudC10eXBlIG9iamVjdCwgdGhhdCBkb2N1bWVudCBkb2VzIG5vdFxuICAvLyAgYXBwZWFyIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBub2RlJ3MgYG93bmVyRG9jdW1lbnRgIGZvciBzb21lIHJlYXNvbiwgc28gaXQncyBzYWZlclxuICAvLyAgdG8gaWdub3JlIHRoZSByb290Tm9kZSBhdCB0aGlzIHBvaW50LCBhbmQgdXNlIGBub2RlLm93bmVyRG9jdW1lbnRgLiBPdGhlcndpc2UsXG4gIC8vICB1c2luZyBgcm9vdE5vZGUuY29udGFpbnMobm9kZSlgIHdpbGwgX2Fsd2F5c18gYmUgdHJ1ZSB3ZSdsbCBnZXQgZmFsc2UtcG9zaXRpdmVzIHdoZW5cbiAgLy8gIG5vZGUgaXMgYWN0dWFsbHkgZGV0YWNoZWQuXG4gIC8vIE5PVEU6IElmIGBub2RlUm9vdEhvc3RgIG9yIGBub2RlYCBoYXBwZW5zIHRvIGJlIHRoZSBgZG9jdW1lbnRgIGl0c2VsZiAod2hpY2ggaXMgcG9zc2libGVcbiAgLy8gIGlmIGEgdGFiYmFibGUvZm9jdXNhYmxlIG5vZGUgd2FzIHF1aWNrbHkgYWRkZWQgdG8gdGhlIERPTSwgZm9jdXNlZCwgYW5kIHRoZW4gcmVtb3ZlZFxuICAvLyAgZnJvbSB0aGUgRE9NIGFzIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAtcmVhY3QvaXNzdWVzLzkwNSksIHRoZW5cbiAgLy8gIGBvd25lckRvY3VtZW50YCB3aWxsIGJlIGBudWxsYCwgaGVuY2UgdGhlIG9wdGlvbmFsIGNoYWluaW5nIG9uIGl0LlxuICB2YXIgbm9kZVJvb3QgPSBub2RlICYmIGdldFJvb3ROb2RlKG5vZGUpO1xuICB2YXIgbm9kZVJvb3RIb3N0ID0gKF9ub2RlUm9vdCA9IG5vZGVSb290KSA9PT0gbnVsbCB8fCBfbm9kZVJvb3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ub2RlUm9vdC5ob3N0O1xuXG4gIC8vIGluIHNvbWUgY2FzZXMsIGEgZGV0YWNoZWQgbm9kZSB3aWxsIHJldHVybiBpdHNlbGYgYXMgdGhlIHJvb3QgaW5zdGVhZCBvZiBhIGRvY3VtZW50IG9yXG4gIC8vICBzaGFkb3cgcm9vdCBvYmplY3QsIGluIHdoaWNoIGNhc2UsIHdlIHNob3VsZG4ndCB0cnkgdG8gbG9vayBmdXJ0aGVyIHVwIHRoZSBob3N0IGNoYWluXG4gIHZhciBhdHRhY2hlZCA9IGZhbHNlO1xuICBpZiAobm9kZVJvb3QgJiYgbm9kZVJvb3QgIT09IG5vZGUpIHtcbiAgICB2YXIgX25vZGVSb290SG9zdCwgX25vZGVSb290SG9zdCRvd25lckRvLCBfbm9kZSRvd25lckRvY3VtZW50O1xuICAgIGF0dGFjaGVkID0gISEoKF9ub2RlUm9vdEhvc3QgPSBub2RlUm9vdEhvc3QpICE9PSBudWxsICYmIF9ub2RlUm9vdEhvc3QgIT09IHZvaWQgMCAmJiAoX25vZGVSb290SG9zdCRvd25lckRvID0gX25vZGVSb290SG9zdC5vd25lckRvY3VtZW50KSAhPT0gbnVsbCAmJiBfbm9kZVJvb3RIb3N0JG93bmVyRG8gIT09IHZvaWQgMCAmJiBfbm9kZVJvb3RIb3N0JG93bmVyRG8uY29udGFpbnMobm9kZVJvb3RIb3N0KSB8fCBub2RlICE9PSBudWxsICYmIG5vZGUgIT09IHZvaWQgMCAmJiAoX25vZGUkb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudCkgIT09IG51bGwgJiYgX25vZGUkb3duZXJEb2N1bWVudCAhPT0gdm9pZCAwICYmIF9ub2RlJG93bmVyRG9jdW1lbnQuY29udGFpbnMobm9kZSkpO1xuICAgIHdoaWxlICghYXR0YWNoZWQgJiYgbm9kZVJvb3RIb3N0KSB7XG4gICAgICB2YXIgX25vZGVSb290MiwgX25vZGVSb290SG9zdDIsIF9ub2RlUm9vdEhvc3QyJG93bmVyRDtcbiAgICAgIC8vIHNpbmNlIGl0J3Mgbm90IGF0dGFjaGVkIGFuZCB3ZSBoYXZlIGEgcm9vdCBob3N0LCB0aGUgbm9kZSBNVVNUIGJlIGluIGEgbmVzdGVkIHNoYWRvdyBET00sXG4gICAgICAvLyAgd2hpY2ggbWVhbnMgd2UgbmVlZCB0byBnZXQgdGhlIGhvc3QncyBob3N0IGFuZCBjaGVjayBpZiB0aGF0IHBhcmVudCBob3N0IGlzIGNvbnRhaW5lZFxuICAgICAgLy8gIGluIChpLmUuIGF0dGFjaGVkIHRvKSB0aGUgZG9jdW1lbnRcbiAgICAgIG5vZGVSb290ID0gZ2V0Um9vdE5vZGUobm9kZVJvb3RIb3N0KTtcbiAgICAgIG5vZGVSb290SG9zdCA9IChfbm9kZVJvb3QyID0gbm9kZVJvb3QpID09PSBudWxsIHx8IF9ub2RlUm9vdDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ub2RlUm9vdDIuaG9zdDtcbiAgICAgIGF0dGFjaGVkID0gISEoKF9ub2RlUm9vdEhvc3QyID0gbm9kZVJvb3RIb3N0KSAhPT0gbnVsbCAmJiBfbm9kZVJvb3RIb3N0MiAhPT0gdm9pZCAwICYmIChfbm9kZVJvb3RIb3N0MiRvd25lckQgPSBfbm9kZVJvb3RIb3N0Mi5vd25lckRvY3VtZW50KSAhPT0gbnVsbCAmJiBfbm9kZVJvb3RIb3N0MiRvd25lckQgIT09IHZvaWQgMCAmJiBfbm9kZVJvb3RIb3N0MiRvd25lckQuY29udGFpbnMobm9kZVJvb3RIb3N0KSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBhdHRhY2hlZDtcbn07XG52YXIgaXNaZXJvQXJlYSA9IGZ1bmN0aW9uIGlzWmVyb0FyZWEobm9kZSkge1xuICB2YXIgX25vZGUkZ2V0Qm91bmRpbmdDbGllID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICB3aWR0aCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS53aWR0aCxcbiAgICBoZWlnaHQgPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUuaGVpZ2h0O1xuICByZXR1cm4gd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwO1xufTtcbnZhciBpc0hpZGRlbiA9IGZ1bmN0aW9uIGlzSGlkZGVuKG5vZGUsIF9yZWYpIHtcbiAgdmFyIGRpc3BsYXlDaGVjayA9IF9yZWYuZGlzcGxheUNoZWNrLFxuICAgIGdldFNoYWRvd1Jvb3QgPSBfcmVmLmdldFNoYWRvd1Jvb3Q7XG4gIC8vIE5PVEU6IHZpc2liaWxpdHkgd2lsbCBiZSBgdW5kZWZpbmVkYCBpZiBub2RlIGlzIGRldGFjaGVkIGZyb20gdGhlIGRvY3VtZW50XG4gIC8vICAoc2VlIG5vdGVzIGFib3V0IHRoaXMgZnVydGhlciBkb3duKSwgd2hpY2ggbWVhbnMgd2Ugd2lsbCBjb25zaWRlciBpdCB2aXNpYmxlXG4gIC8vICAodGhpcyBpcyBsZWdhY3kgYmVoYXZpb3IgZnJvbSBhIHZlcnkgbG9uZyB3YXkgYmFjaylcbiAgLy8gTk9URTogd2UgY2hlY2sgdGhpcyByZWdhcmRsZXNzIG9mIGBkaXNwbGF5Q2hlY2s9XCJub25lXCJgIGJlY2F1c2UgdGhpcyBpcyBhXG4gIC8vICBfdmlzaWJpbGl0eV8gY2hlY2ssIG5vdCBhIF9kaXNwbGF5XyBjaGVja1xuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBpc0RpcmVjdFN1bW1hcnkgPSBtYXRjaGVzLmNhbGwobm9kZSwgJ2RldGFpbHM+c3VtbWFyeTpmaXJzdC1vZi10eXBlJyk7XG4gIHZhciBub2RlVW5kZXJEZXRhaWxzID0gaXNEaXJlY3RTdW1tYXJ5ID8gbm9kZS5wYXJlbnRFbGVtZW50IDogbm9kZTtcbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlVW5kZXJEZXRhaWxzLCAnZGV0YWlsczpub3QoW29wZW5dKSAqJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIWRpc3BsYXlDaGVjayB8fCBkaXNwbGF5Q2hlY2sgPT09ICdmdWxsJyB8fCBkaXNwbGF5Q2hlY2sgPT09ICdsZWdhY3ktZnVsbCcpIHtcbiAgICBpZiAodHlwZW9mIGdldFNoYWRvd1Jvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIGZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGNvbnNpZGVyIHRoZSBub2RlIHRvIGJlIGluIGFuIHVuZGlzY2xvc2VkIHNoYWRvdyBhbmQgdXNlIHRoZVxuICAgICAgLy8gICdub24temVyby1hcmVhJyBmYWxsYmFja1xuICAgICAgdmFyIG9yaWdpbmFsTm9kZSA9IG5vZGU7XG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICB2YXIgcGFyZW50RWxlbWVudCA9IG5vZGUucGFyZW50RWxlbWVudDtcbiAgICAgICAgdmFyIHJvb3ROb2RlID0gZ2V0Um9vdE5vZGUobm9kZSk7XG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICYmICFwYXJlbnRFbGVtZW50LnNoYWRvd1Jvb3QgJiYgZ2V0U2hhZG93Um9vdChwYXJlbnRFbGVtZW50KSA9PT0gdHJ1ZSAvLyBjaGVjayBpZiB0aGVyZSdzIGFuIHVuZGlzY2xvc2VkIHNoYWRvd1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyBub2RlIGhhcyBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgd2hpY2ggbWVhbnMgd2UgY2FuIG9ubHkgdHJlYXQgaXQgYXMgYSBibGFjayBib3gsIHNvIHdlXG4gICAgICAgICAgLy8gIGZhbGwgYmFjayB0byBhIG5vbi16ZXJvLWFyZWEgdGVzdFxuICAgICAgICAgIHJldHVybiBpc1plcm9BcmVhKG5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuYXNzaWduZWRTbG90KSB7XG4gICAgICAgICAgLy8gaXRlcmF0ZSB1cCBzbG90XG4gICAgICAgICAgbm9kZSA9IG5vZGUuYXNzaWduZWRTbG90O1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXJlbnRFbGVtZW50ICYmIHJvb3ROb2RlICE9PSBub2RlLm93bmVyRG9jdW1lbnQpIHtcbiAgICAgICAgICAvLyBjcm9zcyBzaGFkb3cgYm91bmRhcnlcbiAgICAgICAgICBub2RlID0gcm9vdE5vZGUuaG9zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpdGVyYXRlIHVwIG5vcm1hbCBkb21cbiAgICAgICAgICBub2RlID0gcGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbm9kZSA9IG9yaWdpbmFsTm9kZTtcbiAgICB9XG4gICAgLy8gZWxzZSwgYGdldFNoYWRvd1Jvb3RgIG1pZ2h0IGJlIHRydWUsIGJ1dCBhbGwgdGhhdCBkb2VzIGlzIGVuYWJsZSBzaGFkb3cgRE9NIHN1cHBvcnRcbiAgICAvLyAgKGkuZS4gaXQgZG9lcyBub3QgYWxzbyBwcmVzdW1lIHRoYXQgYWxsIG5vZGVzIG1pZ2h0IGhhdmUgdW5kaXNjbG9zZWQgc2hhZG93cyk7IG9yXG4gICAgLy8gIGl0IG1pZ2h0IGJlIGEgZmFsc3kgdmFsdWUsIHdoaWNoIG1lYW5zIHNoYWRvdyBET00gc3VwcG9ydCBpcyBkaXNhYmxlZFxuXG4gICAgLy8gU2luY2Ugd2UgZGlkbid0IGZpbmQgaXQgc2l0dGluZyBpbiBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgKG9yIHNoYWRvd3MgYXJlIGRpc2FibGVkKVxuICAgIC8vICBub3cgd2UgY2FuIGp1c3QgdGVzdCB0byBzZWUgaWYgaXQgd291bGQgbm9ybWFsbHkgYmUgdmlzaWJsZSBvciBub3QsIHByb3ZpZGVkIGl0J3NcbiAgICAvLyAgYXR0YWNoZWQgdG8gdGhlIG1haW4gZG9jdW1lbnQuXG4gICAgLy8gTk9URTogV2UgbXVzdCBjb25zaWRlciBjYXNlIHdoZXJlIG5vZGUgaXMgaW5zaWRlIGEgc2hhZG93IERPTSBhbmQgZ2l2ZW4gZGlyZWN0bHkgdG9cbiAgICAvLyAgYGlzVGFiYmFibGUoKWAgb3IgYGlzRm9jdXNhYmxlKClgIC0tIHJlZ2FyZGxlc3Mgb2YgYGdldFNoYWRvd1Jvb3RgIG9wdGlvbiBzZXR0aW5nLlxuXG4gICAgaWYgKGlzTm9kZUF0dGFjaGVkKG5vZGUpKSB7XG4gICAgICAvLyB0aGlzIHdvcmtzIHdoZXJldmVyIHRoZSBub2RlIGlzOiBpZiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjbGllbnQgcmVjdCwgaXQnc1xuICAgICAgLy8gIHNvbWVob3cgZGlzcGxheWVkOyBpdCBhbHNvIGNvdmVycyB0aGUgQ1NTICdkaXNwbGF5OiBjb250ZW50cycgY2FzZSB3aGVyZSB0aGVcbiAgICAgIC8vICBub2RlIGl0c2VsZiBpcyBoaWRkZW4gaW4gcGxhY2Ugb2YgaXRzIGNvbnRlbnRzOyBhbmQgdGhlcmUncyBubyBuZWVkIHRvIHNlYXJjaFxuICAgICAgLy8gIHVwIHRoZSBoaWVyYXJjaHkgZWl0aGVyXG4gICAgICByZXR1cm4gIW5vZGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gRWxzZSwgdGhlIG5vZGUgaXNuJ3QgYXR0YWNoZWQgdG8gdGhlIGRvY3VtZW50LCB3aGljaCBtZWFucyB0aGUgYGdldENsaWVudFJlY3RzKClgXG4gICAgLy8gIEFQSSB3aWxsIF9fYWx3YXlzX18gcmV0dXJuIHplcm8gcmVjdHMgKHRoaXMgY2FuIGhhcHBlbiwgZm9yIGV4YW1wbGUsIGlmIFJlYWN0XG4gICAgLy8gIGlzIHVzZWQgdG8gcmVuZGVyIG5vZGVzIG9udG8gYSBkZXRhY2hlZCB0cmVlLCBhcyBjb25maXJtZWQgaW4gdGhpcyB0aHJlYWQ6XG4gICAgLy8gIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvOTExNyNpc3N1ZWNvbW1lbnQtMjg0MjI4ODcwKVxuICAgIC8vXG4gICAgLy8gSXQgYWxzbyBtZWFucyB0aGF0IGV2ZW4gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSkuZGlzcGxheSB3aWxsIHJldHVybiBgdW5kZWZpbmVkYFxuICAgIC8vICBiZWNhdXNlIHN0eWxlcyBhcmUgb25seSBjb21wdXRlZCBmb3Igbm9kZXMgdGhhdCBhcmUgaW4gdGhlIGRvY3VtZW50LlxuICAgIC8vXG4gICAgLy8gTk9URTogVEhJUyBIQVMgQkVFTiBUSEUgQ0FTRSBGT1IgWUVBUlMuIEl0IGlzIG5vdCBuZXcsIG5vciBpcyBpdCBjYXVzZWQgYnkgdGFiYmFibGVcbiAgICAvLyAgc29tZWhvdy4gVGhvdWdoIGl0IHdhcyBuZXZlciBzdGF0ZWQgb2ZmaWNpYWxseSwgYW55b25lIHdobyBoYXMgZXZlciB1c2VkIHRhYmJhYmxlXG4gICAgLy8gIEFQSXMgb24gbm9kZXMgaW4gZGV0YWNoZWQgY29udGFpbmVycyBoYXMgYWN0dWFsbHkgaW1wbGljaXRseSB1c2VkIHRhYmJhYmxlIGluIHdoYXRcbiAgICAvLyAgd2FzIGxhdGVyIChhcyBvZiB2NS4yLjAgb24gQXByIDksIDIwMjEpIGNhbGxlZCBgZGlzcGxheUNoZWNrPVwibm9uZVwiYCBtb2RlIC0tIGVzc2VudGlhbGx5XG4gICAgLy8gIGNvbnNpZGVyaW5nIF9fZXZlcnl0aGluZ19fIHRvIGJlIHZpc2libGUgYmVjYXVzZSBvZiB0aGUgaW5uYWJpbGl0eSB0byBkZXRlcm1pbmUgc3R5bGVzLlxuICAgIC8vXG4gICAgLy8gdjYuMC4wOiBBcyBvZiB0aGlzIG1ham9yIHJlbGVhc2UsIHRoZSBkZWZhdWx0ICdmdWxsJyBvcHRpb24gX19ubyBsb25nZXIgdHJlYXRzIGRldGFjaGVkXG4gICAgLy8gIG5vZGVzIGFzIHZpc2libGUgd2l0aCB0aGUgJ25vbmUnIGZhbGxiYWNrLl9fXG4gICAgaWYgKGRpc3BsYXlDaGVjayAhPT0gJ2xlZ2FjeS1mdWxsJykge1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGhpZGRlblxuICAgIH1cbiAgICAvLyBlbHNlLCBmYWxsYmFjayB0byAnbm9uZScgbW9kZSBhbmQgY29uc2lkZXIgdGhlIG5vZGUgdmlzaWJsZVxuICB9IGVsc2UgaWYgKGRpc3BsYXlDaGVjayA9PT0gJ25vbi16ZXJvLWFyZWEnKSB7XG4gICAgLy8gTk9URTogRXZlbiB0aG91Z2ggdGhpcyB0ZXN0cyB0aGF0IHRoZSBub2RlJ3MgY2xpZW50IHJlY3QgaXMgbm9uLXplcm8gdG8gZGV0ZXJtaW5lXG4gICAgLy8gIHdoZXRoZXIgaXQncyBkaXNwbGF5ZWQsIGFuZCB0aGF0IGEgZGV0YWNoZWQgbm9kZSB3aWxsIF9fYWx3YXlzX18gaGF2ZSBhIHplcm8tYXJlYVxuICAgIC8vICBjbGllbnQgcmVjdCwgd2UgZG9uJ3Qgc3BlY2lhbC1jYXNlIGZvciB3aGV0aGVyIHRoZSBub2RlIGlzIGF0dGFjaGVkIG9yIG5vdC4gSW5cbiAgICAvLyAgdGhpcyBtb2RlLCB3ZSBkbyB3YW50IHRvIGNvbnNpZGVyIG5vZGVzIHRoYXQgaGF2ZSBhIHplcm8gYXJlYSB0byBiZSBoaWRkZW4gYXQgYWxsXG4gICAgLy8gIHRpbWVzLCBhbmQgdGhhdCBpbmNsdWRlcyBhdHRhY2hlZCBvciBub3QuXG4gICAgcmV0dXJuIGlzWmVyb0FyZWEobm9kZSk7XG4gIH1cblxuICAvLyB2aXNpYmxlLCBhcyBmYXIgYXMgd2UgY2FuIHRlbGwsIG9yIHBlciBjdXJyZW50IGBkaXNwbGF5Q2hlY2s9bm9uZWAgbW9kZSwgd2UgYXNzdW1lXG4gIC8vICBpdCdzIHZpc2libGVcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLy8gZm9ybSBmaWVsZHMgKG5lc3RlZCkgaW5zaWRlIGEgZGlzYWJsZWQgZmllbGRzZXQgYXJlIG5vdCBmb2N1c2FibGUvdGFiYmFibGVcbi8vICB1bmxlc3MgdGhleSBhcmUgaW4gdGhlIF9maXJzdF8gPGxlZ2VuZD4gZWxlbWVudCBvZiB0aGUgdG9wLW1vc3QgZGlzYWJsZWRcbi8vICBmaWVsZHNldFxudmFyIGlzRGlzYWJsZWRGcm9tRmllbGRzZXQgPSBmdW5jdGlvbiBpc0Rpc2FibGVkRnJvbUZpZWxkc2V0KG5vZGUpIHtcbiAgaWYgKC9eKElOUFVUfEJVVFRPTnxTRUxFQ1R8VEVYVEFSRUEpJC8udGVzdChub2RlLnRhZ05hbWUpKSB7XG4gICAgdmFyIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgLy8gY2hlY2sgaWYgYG5vZGVgIGlzIGNvbnRhaW5lZCBpbiBhIGRpc2FibGVkIDxmaWVsZHNldD5cbiAgICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgICAgaWYgKHBhcmVudE5vZGUudGFnTmFtZSA9PT0gJ0ZJRUxEU0VUJyAmJiBwYXJlbnROb2RlLmRpc2FibGVkKSB7XG4gICAgICAgIC8vIGxvb2sgZm9yIHRoZSBmaXJzdCA8bGVnZW5kPiBhbW9uZyB0aGUgY2hpbGRyZW4gb2YgdGhlIGRpc2FibGVkIDxmaWVsZHNldD5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gcGFyZW50Tm9kZS5jaGlsZHJlbi5pdGVtKGkpO1xuICAgICAgICAgIC8vIHdoZW4gdGhlIGZpcnN0IDxsZWdlbmQ+IChpbiBkb2N1bWVudCBvcmRlcikgaXMgZm91bmRcbiAgICAgICAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ0xFR0VORCcpIHtcbiAgICAgICAgICAgIC8vIGlmIGl0cyBwYXJlbnQgPGZpZWxkc2V0PiBpcyBub3QgbmVzdGVkIGluIGFub3RoZXIgZGlzYWJsZWQgPGZpZWxkc2V0PixcbiAgICAgICAgICAgIC8vIHJldHVybiB3aGV0aGVyIGBub2RlYCBpcyBhIGRlc2NlbmRhbnQgb2YgaXRzIGZpcnN0IDxsZWdlbmQ+XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcy5jYWxsKHBhcmVudE5vZGUsICdmaWVsZHNldFtkaXNhYmxlZF0gKicpID8gdHJ1ZSA6ICFjaGlsZC5jb250YWlucyhub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIGRpc2FibGVkIDxmaWVsZHNldD4gY29udGFpbmluZyBgbm9kZWAgaGFzIG5vIDxsZWdlbmQ+XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcbiAgICB9XG4gIH1cblxuICAvLyBlbHNlLCBub2RlJ3MgdGFiYmFibGUvZm9jdXNhYmxlIHN0YXRlIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgYSBmaWVsZHNldCdzXG4gIC8vICBlbmFibGVkL2Rpc2FibGVkIHN0YXRlXG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZSA9IGZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUob3B0aW9ucywgbm9kZSkge1xuICBpZiAobm9kZS5kaXNhYmxlZCB8fFxuICAvLyB3ZSBtdXN0IGRvIGFuIGluZXJ0IGxvb2sgdXAgdG8gZmlsdGVyIG91dCBhbnkgZWxlbWVudHMgaW5zaWRlIGFuIGluZXJ0IGFuY2VzdG9yXG4gIC8vICBiZWNhdXNlIHdlJ3JlIGxpbWl0ZWQgaW4gdGhlIHR5cGUgb2Ygc2VsZWN0b3JzIHdlIGNhbiB1c2UgaW4gSlNEb20gKHNlZSByZWxhdGVkXG4gIC8vICBub3RlIHJlbGF0ZWQgdG8gYGNhbmRpZGF0ZVNlbGVjdG9yc2ApXG4gIGlzSW5lcnQobm9kZSkgfHwgaXNIaWRkZW5JbnB1dChub2RlKSB8fCBpc0hpZGRlbihub2RlLCBvcHRpb25zKSB8fFxuICAvLyBGb3IgYSBkZXRhaWxzIGVsZW1lbnQgd2l0aCBhIHN1bW1hcnksIHRoZSBzdW1tYXJ5IGVsZW1lbnQgZ2V0cyB0aGUgZm9jdXNcbiAgaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkgfHwgaXNEaXNhYmxlZEZyb21GaWVsZHNldChub2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlID0gZnVuY3Rpb24gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlKG9wdGlvbnMsIG5vZGUpIHtcbiAgaWYgKGlzTm9uVGFiYmFibGVSYWRpbyhub2RlKSB8fCBnZXRUYWJJbmRleChub2RlKSA8IDAgfHwgIWlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUob3B0aW9ucywgbm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGlzVmFsaWRTaGFkb3dSb290VGFiYmFibGUgPSBmdW5jdGlvbiBpc1ZhbGlkU2hhZG93Um9vdFRhYmJhYmxlKHNoYWRvd0hvc3ROb2RlKSB7XG4gIHZhciB0YWJJbmRleCA9IHBhcnNlSW50KHNoYWRvd0hvc3ROb2RlLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgMTApO1xuICBpZiAoaXNOYU4odGFiSW5kZXgpIHx8IHRhYkluZGV4ID49IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBJZiBhIGN1c3RvbSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBuZWdhdGl2ZSB0YWJpbmRleCxcbiAgLy8gYnJvd3NlcnMgd2lsbCBub3QgYWxsb3cgdGFiIHRhcmdldGluZyBzYWlkIGVsZW1lbnQncyBjaGlsZHJlbi5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5LjxFbGVtZW50fENhbmRpZGF0ZVNjb3BlPn0gY2FuZGlkYXRlc1xuICogQHJldHVybnMgRWxlbWVudFtdXG4gKi9cbnZhciBzb3J0QnlPcmRlciA9IGZ1bmN0aW9uIHNvcnRCeU9yZGVyKGNhbmRpZGF0ZXMpIHtcbiAgdmFyIHJlZ3VsYXJUYWJiYWJsZXMgPSBbXTtcbiAgdmFyIG9yZGVyZWRUYWJiYWJsZXMgPSBbXTtcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgdmFyIGlzU2NvcGUgPSAhIWl0ZW0uc2NvcGVQYXJlbnQ7XG4gICAgdmFyIGVsZW1lbnQgPSBpc1Njb3BlID8gaXRlbS5zY29wZVBhcmVudCA6IGl0ZW07XG4gICAgdmFyIGNhbmRpZGF0ZVRhYmluZGV4ID0gZ2V0U29ydE9yZGVyVGFiSW5kZXgoZWxlbWVudCwgaXNTY29wZSk7XG4gICAgdmFyIGVsZW1lbnRzID0gaXNTY29wZSA/IHNvcnRCeU9yZGVyKGl0ZW0uY2FuZGlkYXRlcykgOiBlbGVtZW50O1xuICAgIGlmIChjYW5kaWRhdGVUYWJpbmRleCA9PT0gMCkge1xuICAgICAgaXNTY29wZSA/IHJlZ3VsYXJUYWJiYWJsZXMucHVzaC5hcHBseShyZWd1bGFyVGFiYmFibGVzLCBlbGVtZW50cykgOiByZWd1bGFyVGFiYmFibGVzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9yZGVyZWRUYWJiYWJsZXMucHVzaCh7XG4gICAgICAgIGRvY3VtZW50T3JkZXI6IGksXG4gICAgICAgIHRhYkluZGV4OiBjYW5kaWRhdGVUYWJpbmRleCxcbiAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgaXNTY29wZTogaXNTY29wZSxcbiAgICAgICAgY29udGVudDogZWxlbWVudHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvcmRlcmVkVGFiYmFibGVzLnNvcnQoc29ydE9yZGVyZWRUYWJiYWJsZXMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBzb3J0YWJsZSkge1xuICAgIHNvcnRhYmxlLmlzU2NvcGUgPyBhY2MucHVzaC5hcHBseShhY2MsIHNvcnRhYmxlLmNvbnRlbnQpIDogYWNjLnB1c2goc29ydGFibGUuY29udGVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10pLmNvbmNhdChyZWd1bGFyVGFiYmFibGVzKTtcbn07XG52YXIgdGFiYmFibGUgPSBmdW5jdGlvbiB0YWJiYWJsZShjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBjYW5kaWRhdGVzO1xuICBpZiAob3B0aW9ucy5nZXRTaGFkb3dSb290KSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXNJdGVyYXRpdmVseShbY29udGFpbmVyXSwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCB7XG4gICAgICBmaWx0ZXI6IGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpLFxuICAgICAgZmxhdHRlbjogZmFsc2UsXG4gICAgICBnZXRTaGFkb3dSb290OiBvcHRpb25zLmdldFNoYWRvd1Jvb3QsXG4gICAgICBzaGFkb3dSb290RmlsdGVyOiBpc1ZhbGlkU2hhZG93Um9vdFRhYmJhYmxlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXMoY29udGFpbmVyLCBvcHRpb25zLmluY2x1ZGVDb250YWluZXIsIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgfVxuICByZXR1cm4gc29ydEJ5T3JkZXIoY2FuZGlkYXRlcyk7XG59O1xudmFyIGZvY3VzYWJsZSA9IGZ1bmN0aW9uIGZvY3VzYWJsZShjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBjYW5kaWRhdGVzO1xuICBpZiAob3B0aW9ucy5nZXRTaGFkb3dSb290KSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXNJdGVyYXRpdmVseShbY29udGFpbmVyXSwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCB7XG4gICAgICBmaWx0ZXI6IGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUuYmluZChudWxsLCBvcHRpb25zKSxcbiAgICAgIGZsYXR0ZW46IHRydWUsXG4gICAgICBnZXRTaGFkb3dSb290OiBvcHRpb25zLmdldFNoYWRvd1Jvb3RcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlcyhjb250YWluZXIsIG9wdGlvbnMuaW5jbHVkZUNvbnRhaW5lciwgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG52YXIgaXNUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzVGFiYmFibGUobm9kZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlLCBjYW5kaWRhdGVTZWxlY3RvcikgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yVGFiYmFibGUob3B0aW9ucywgbm9kZSk7XG59O1xudmFyIGZvY3VzYWJsZUNhbmRpZGF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY2FuZGlkYXRlU2VsZWN0b3JzLmNvbmNhdCgnaWZyYW1lJykuam9pbignLCcpO1xudmFyIGlzRm9jdXNhYmxlID0gZnVuY3Rpb24gaXNGb2N1c2FibGUobm9kZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlLCBmb2N1c2FibGVDYW5kaWRhdGVTZWxlY3RvcikgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG9wdGlvbnMsIG5vZGUpO1xufTtcblxuZXhwb3J0IHsgZm9jdXNhYmxlLCBnZXRUYWJJbmRleCwgaXNGb2N1c2FibGUsIGlzVGFiYmFibGUsIHRhYmJhYmxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLnRyaW1DYW52YXM9dCgpOmUudHJpbUNhbnZhcz10KCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtpZihyW25dKXJldHVybiByW25dLmV4cG9ydHM7dmFyIG89cltuXT17ZXhwb3J0czp7fSxpZDpuLGxvYWRlZDohMX07cmV0dXJuIGVbbl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsdCksby5sb2FkZWQ9ITAsby5leHBvcnRzfXZhciByPXt9O3JldHVybiB0Lm09ZSx0LmM9cix0LnA9XCJcIix0KDApfShbZnVuY3Rpb24oZSx0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKGUpe3ZhciB0PWUuZ2V0Q29udGV4dChcIjJkXCIpLHI9ZS53aWR0aCxuPWUuaGVpZ2h0LG89dC5nZXRJbWFnZURhdGEoMCwwLHIsbikuZGF0YSxmPWEoITAscixuLG8pLGk9YSghMSxyLG4sbyksYz11KCEwLHIsbixvKSxkPXUoITEscixuLG8pLHA9ZC1jKzEsbD1pLWYrMSxzPXQuZ2V0SW1hZ2VEYXRhKGMsZixwLGwpO3JldHVybiBlLndpZHRoPXAsZS5oZWlnaHQ9bCx0LmNsZWFyUmVjdCgwLDAscCxsKSx0LnB1dEltYWdlRGF0YShzLDAsMCksZX1mdW5jdGlvbiBuKGUsdCxyLG4pe3JldHVybntyZWQ6bls0KihyKnQrZSldLGdyZWVuOm5bNCoocip0K2UpKzFdLGJsdWU6bls0KihyKnQrZSkrMl0sYWxwaGE6bls0KihyKnQrZSkrM119fWZ1bmN0aW9uIG8oZSx0LHIsbyl7cmV0dXJuIG4oZSx0LHIsbykuYWxwaGF9ZnVuY3Rpb24gYShlLHQscixuKXtmb3IodmFyIGE9ZT8xOi0xLHU9ZT8wOnItMSxmPXU7ZT9mPHI6Zj4tMTtmKz1hKWZvcih2YXIgaT0wO2k8dDtpKyspaWYobyhpLGYsdCxuKSlyZXR1cm4gZjtyZXR1cm4gbnVsbH1mdW5jdGlvbiB1KGUsdCxyLG4pe2Zvcih2YXIgYT1lPzE6LTEsdT1lPzA6dC0xLGY9dTtlP2Y8dDpmPi0xO2YrPWEpZm9yKHZhciBpPTA7aTxyO2krKylpZihvKGYsaSx0LG4pKXJldHVybiBmO3JldHVybiBudWxsfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD1yfV0pfSk7IiwiLyoqXG4gKiBBc3NpZ25zIGEgdmFsdWUgZm9yIGEgZ2l2ZW4gcmVmLCBubyBtYXR0ZXIgb2YgdGhlIHJlZiBmb3JtYXRcbiAqIEBwYXJhbSB7UmVmT2JqZWN0fSByZWYgLSBhIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIHJlZiBvYmplY3RcbiAqIEBwYXJhbSB2YWx1ZSAtIGEgbmV3IHZhbHVlXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L3VzZS1jYWxsYmFjay1yZWYjYXNzaWducmVmXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcmVmT2JqZWN0ID0gdXNlUmVmKCk7XG4gKiBjb25zdCByZWZGbiA9IChyZWYpID0+IHsuLi4ufVxuICpcbiAqIGFzc2lnblJlZihyZWZPYmplY3QsIFwicmVmVmFsdWVcIik7XG4gKiBhc3NpZ25SZWYocmVmRm4sIFwicmVmVmFsdWVcIik7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25SZWYocmVmLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlZih2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlZikge1xuICAgICAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVmO1xufVxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgYXNzaWduUmVmIH0gZnJvbSAnLi9hc3NpZ25SZWYnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tICcuL3VzZVJlZic7XG52YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0O1xudmFyIGN1cnJlbnRWYWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBNZXJnZXMgdHdvIG9yIG1vcmUgcmVmcyB0b2dldGhlciBwcm92aWRpbmcgYSBzaW5nbGUgaW50ZXJmYWNlIHRvIHNldCB0aGVpciB2YWx1ZVxuICogQHBhcmFtIHtSZWZPYmplY3R8UmVmfSByZWZzXG4gKiBAcmV0dXJucyB7TXV0YWJsZVJlZk9iamVjdH0gLSBhIG5ldyByZWYsIHdoaWNoIHRyYW5zbGF0ZXMgYWxsIGNoYW5nZXMgdG8ge3JlZnN9XG4gKlxuICogQHNlZSB7QGxpbmsgbWVyZ2VSZWZzfSBhIHZlcnNpb24gd2l0aG91dCBidWl0LWluIG1lbW9pemF0aW9uXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVLYXNoZXkvdXNlLWNhbGxiYWNrLXJlZiN1c2VtZXJnZXJlZnNcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBDb21wb25lbnQgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gKiAgIGNvbnN0IG93blJlZiA9IHVzZVJlZigpO1xuICogICBjb25zdCBkb21SZWYgPSB1c2VNZXJnZVJlZnMoW3JlZiwgb3duUmVmXSk7IC8vIPCfkYggbWVyZ2UgdG9nZXRoZXJcbiAqICAgcmV0dXJuIDxkaXYgcmVmPXtkb21SZWZ9Pi4uLjwvZGl2PlxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWVyZ2VSZWZzKHJlZnMsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHZhciBjYWxsYmFja1JlZiA9IHVzZUNhbGxiYWNrUmVmKGRlZmF1bHRWYWx1ZSB8fCBudWxsLCBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHJlZnMuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7IHJldHVybiBhc3NpZ25SZWYocmVmLCBuZXdWYWx1ZSk7IH0pO1xuICAgIH0pO1xuICAgIC8vIGhhbmRsZSByZWZzIGNoYW5nZXMgLSBhZGRlZCBvciByZW1vdmVkXG4gICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IGN1cnJlbnRWYWx1ZXMuZ2V0KGNhbGxiYWNrUmVmKTtcbiAgICAgICAgaWYgKG9sZFZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgcHJldlJlZnNfMSA9IG5ldyBTZXQob2xkVmFsdWUpO1xuICAgICAgICAgICAgdmFyIG5leHRSZWZzXzEgPSBuZXcgU2V0KHJlZnMpO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRfMSA9IGNhbGxiYWNrUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICBwcmV2UmVmc18xLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgICAgICAgICAgIGlmICghbmV4dFJlZnNfMS5oYXMocmVmKSkge1xuICAgICAgICAgICAgICAgICAgICBhc3NpZ25SZWYocmVmLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5leHRSZWZzXzEuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2UmVmc18xLmhhcyhyZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2lnblJlZihyZWYsIGN1cnJlbnRfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFZhbHVlcy5zZXQoY2FsbGJhY2tSZWYsIHJlZnMpO1xuICAgIH0sIFtyZWZzXSk7XG4gICAgcmV0dXJuIGNhbGxiYWNrUmVmO1xufVxuIiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIGNyZWF0ZXMgYSBNdXRhYmxlUmVmIHdpdGggcmVmIGNoYW5nZSBjYWxsYmFja1xuICogQHBhcmFtIGluaXRpYWxWYWx1ZSAtIGluaXRpYWwgcmVmIHZhbHVlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIGEgY2FsbGJhY2sgdG8gcnVuIHdoZW4gdmFsdWUgY2hhbmdlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByZWYgPSB1c2VDYWxsYmFja1JlZigwLCAobmV3VmFsdWUsIG9sZFZhbHVlKSA9PiBjb25zb2xlLmxvZyhvbGRWYWx1ZSwgJy0+JywgbmV3VmFsdWUpO1xuICogcmVmLmN1cnJlbnQgPSAxO1xuICogLy8gcHJpbnRzIDAgLT4gMVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2hvb2tzLXJlZmVyZW5jZS5odG1sI3VzZXJlZlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L3VzZS1jYWxsYmFjay1yZWYjdXNlY2FsbGJhY2tyZWYtLS10by1yZXBsYWNlLXJlYWN0dXNlcmVmXG4gKiBAcmV0dXJucyB7TXV0YWJsZVJlZk9iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNhbGxiYWNrUmVmKGluaXRpYWxWYWx1ZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgcmVmID0gdXNlU3RhdGUoZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgLy8gdmFsdWVcbiAgICAgICAgdmFsdWU6IGluaXRpYWxWYWx1ZSxcbiAgICAgICAgLy8gbGFzdCBjYWxsYmFja1xuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgIC8vIFwibWVtb2l6ZWRcIiBwdWJsaWMgaW50ZXJmYWNlXG4gICAgICAgIGZhY2FkZToge1xuICAgICAgICAgICAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZi52YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgY3VycmVudCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBsYXN0ID0gcmVmLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZWYudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVmLmNhbGxiYWNrKHZhbHVlLCBsYXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pOyB9KVswXTtcbiAgICAvLyB1cGRhdGUgY2FsbGJhY2tcbiAgICByZWYuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICByZXR1cm4gcmVmLmZhY2FkZTtcbn1cbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBTaWRlQ2FyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHNpZGVDYXIgPSBfYS5zaWRlQ2FyLCByZXN0ID0gX19yZXN0KF9hLCBbXCJzaWRlQ2FyXCJdKTtcbiAgICBpZiAoIXNpZGVDYXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaWRlY2FyOiBwbGVhc2UgcHJvdmlkZSBgc2lkZUNhcmAgcHJvcGVydHkgdG8gaW1wb3J0IHRoZSByaWdodCBjYXInKTtcbiAgICB9XG4gICAgdmFyIFRhcmdldCA9IHNpZGVDYXIucmVhZCgpO1xuICAgIGlmICghVGFyZ2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2lkZWNhciBtZWRpdW0gbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFRhcmdldCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbn07XG5TaWRlQ2FyLmlzU2lkZUNhckV4cG9ydCA9IHRydWU7XG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0U2lkZWNhcihtZWRpdW0sIGV4cG9ydGVkKSB7XG4gICAgbWVkaXVtLnVzZU1lZGl1bShleHBvcnRlZCk7XG4gICAgcmV0dXJuIFNpZGVDYXI7XG59XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuZnVuY3Rpb24gSXRvSShhKSB7XG4gICAgcmV0dXJuIGE7XG59XG5mdW5jdGlvbiBpbm5lckNyZWF0ZU1lZGl1bShkZWZhdWx0cywgbWlkZGxld2FyZSkge1xuICAgIGlmIChtaWRkbGV3YXJlID09PSB2b2lkIDApIHsgbWlkZGxld2FyZSA9IEl0b0k7IH1cbiAgICB2YXIgYnVmZmVyID0gW107XG4gICAgdmFyIGFzc2lnbmVkID0gZmFsc2U7XG4gICAgdmFyIG1lZGl1bSA9IHtcbiAgICAgICAgcmVhZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGFzc2lnbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaWRlY2FyOiBjb3VsZCBub3QgYHJlYWRgIGZyb20gYW4gYGFzc2lnbmVkYCBtZWRpdW0uIGByZWFkYCBjb3VsZCBiZSB1c2VkIG9ubHkgd2l0aCBgdXNlTWVkaXVtYC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgICAgIH0sXG4gICAgICAgIHVzZU1lZGl1bTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gbWlkZGxld2FyZShkYXRhLCBhc3NpZ25lZCk7XG4gICAgICAgICAgICBidWZmZXIucHVzaChpdGVtKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCAhPT0gaXRlbTsgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBhc3NpZ25TeW5jTWVkaXVtOiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgIGFzc2lnbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNicyA9IGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICBjYnMuZm9yRWFjaChjYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIgPSB7XG4gICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGNiKHgpOyB9LFxuICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gYnVmZmVyOyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgYXNzaWduTWVkaXVtOiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgIGFzc2lnbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBwZW5kaW5nUXVldWUgPSBbXTtcbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNicyA9IGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICBjYnMuZm9yRWFjaChjYik7XG4gICAgICAgICAgICAgICAgcGVuZGluZ1F1ZXVlID0gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGV4ZWN1dGVRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2JzID0gcGVuZGluZ1F1ZXVlO1xuICAgICAgICAgICAgICAgIHBlbmRpbmdRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgIGNicy5mb3JFYWNoKGNiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgY3ljbGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGV4ZWN1dGVRdWV1ZSk7IH07XG4gICAgICAgICAgICBjeWNsZSgpO1xuICAgICAgICAgICAgYnVmZmVyID0ge1xuICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdRdWV1ZS5wdXNoKHgpO1xuICAgICAgICAgICAgICAgICAgICBjeWNsZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdRdWV1ZSA9IHBlbmRpbmdRdWV1ZS5maWx0ZXIoZmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBtZWRpdW07XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVkaXVtKGRlZmF1bHRzLCBtaWRkbGV3YXJlKSB7XG4gICAgaWYgKG1pZGRsZXdhcmUgPT09IHZvaWQgMCkgeyBtaWRkbGV3YXJlID0gSXRvSTsgfVxuICAgIHJldHVybiBpbm5lckNyZWF0ZU1lZGl1bShkZWZhdWx0cywgbWlkZGxld2FyZSk7XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNpZGVjYXJNZWRpdW0ob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgdmFyIG1lZGl1bSA9IGlubmVyQ3JlYXRlTWVkaXVtKG51bGwpO1xuICAgIG1lZGl1bS5vcHRpb25zID0gX19hc3NpZ24oeyBhc3luYzogdHJ1ZSwgc3NyOiBmYWxzZSB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gbWVkaXVtO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgcmV0dXJuIHggPT09IHkgJiYgKHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5KSB8fCB4ICE9PSB4ICYmIHkgIT09IHkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgO1xufVxuXG52YXIgb2JqZWN0SXMgPSB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaXM7XG5cbnZhciB1c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlO1xuXG4vLyBmb3IgQ29tbW9uSlMgaW50ZXJvcC5cblxudmFyIHVzZVJlZiA9IFJlYWN0LnVzZVJlZixcbiAgICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gICAgdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8sXG4gICAgdXNlRGVidWdWYWx1ZSA9IFJlYWN0LnVzZURlYnVnVmFsdWU7IC8vIFNhbWUgYXMgdXNlU3luY0V4dGVybmFsU3RvcmUsIGJ1dCBzdXBwb3J0cyBzZWxlY3RvciBhbmQgaXNFcXVhbCBhcmd1bWVudHMuXG5cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90LCBzZWxlY3RvciwgaXNFcXVhbCkge1xuICAvLyBVc2UgdGhpcyB0byB0cmFjayB0aGUgcmVuZGVyZWQgc25hcHNob3QuXG4gIHZhciBpbnN0UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgaW5zdDtcblxuICBpZiAoaW5zdFJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgaW5zdCA9IHtcbiAgICAgIGhhc1ZhbHVlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBudWxsXG4gICAgfTtcbiAgICBpbnN0UmVmLmN1cnJlbnQgPSBpbnN0O1xuICB9IGVsc2Uge1xuICAgIGluc3QgPSBpbnN0UmVmLmN1cnJlbnQ7XG4gIH1cblxuICB2YXIgX3VzZU1lbW8gPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUcmFjayB0aGUgbWVtb2l6ZWQgc3RhdGUgdXNpbmcgY2xvc3VyZSB2YXJpYWJsZXMgdGhhdCBhcmUgbG9jYWwgdG8gdGhpc1xuICAgIC8vIG1lbW9pemVkIGluc3RhbmNlIG9mIGEgZ2V0U25hcHNob3QgZnVuY3Rpb24uIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGFcbiAgICAvLyB1c2VSZWYgaG9vaywgYmVjYXVzZSB0aGF0IHN0YXRlIHdvdWxkIGJlIHNoYXJlZCBhY3Jvc3MgYWxsIGNvbmN1cnJlbnRcbiAgICAvLyBjb3BpZXMgb2YgdGhlIGhvb2svY29tcG9uZW50LlxuICAgIHZhciBoYXNNZW1vID0gZmFsc2U7XG4gICAgdmFyIG1lbW9pemVkU25hcHNob3Q7XG4gICAgdmFyIG1lbW9pemVkU2VsZWN0aW9uO1xuXG4gICAgdmFyIG1lbW9pemVkU2VsZWN0b3IgPSBmdW5jdGlvbiAobmV4dFNuYXBzaG90KSB7XG4gICAgICBpZiAoIWhhc01lbW8pIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhlIGhvb2sgaXMgY2FsbGVkLCB0aGVyZSBpcyBubyBtZW1vaXplZCByZXN1bHQuXG4gICAgICAgIGhhc01lbW8gPSB0cnVlO1xuICAgICAgICBtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90O1xuXG4gICAgICAgIHZhciBfbmV4dFNlbGVjdGlvbiA9IHNlbGVjdG9yKG5leHRTbmFwc2hvdCk7XG5cbiAgICAgICAgaWYgKGlzRXF1YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEV2ZW4gaWYgdGhlIHNlbGVjdG9yIGhhcyBjaGFuZ2VkLCB0aGUgY3VycmVudGx5IHJlbmRlcmVkIHNlbGVjdGlvblxuICAgICAgICAgIC8vIG1heSBiZSBlcXVhbCB0byB0aGUgbmV3IHNlbGVjdGlvbi4gV2Ugc2hvdWxkIGF0dGVtcHQgdG8gcmV1c2UgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCB2YWx1ZSBpZiBwb3NzaWJsZSwgdG8gcHJlc2VydmUgZG93bnN0cmVhbSBtZW1vaXphdGlvbnMuXG4gICAgICAgICAgaWYgKGluc3QuaGFzVmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U2VsZWN0aW9uID0gaW5zdC52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGlzRXF1YWwoY3VycmVudFNlbGVjdGlvbiwgX25leHRTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgIG1lbW9pemVkU2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24gPSBfbmV4dFNlbGVjdGlvbjtcbiAgICAgICAgcmV0dXJuIF9uZXh0U2VsZWN0aW9uO1xuICAgICAgfSAvLyBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSB0aGUgcHJldmlvdXMgaW52b2NhdGlvbidzIHJlc3VsdC5cblxuXG4gICAgICAvLyBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSB0aGUgcHJldmlvdXMgaW52b2NhdGlvbidzIHJlc3VsdC5cbiAgICAgIHZhciBwcmV2U25hcHNob3QgPSBtZW1vaXplZFNuYXBzaG90O1xuICAgICAgdmFyIHByZXZTZWxlY3Rpb24gPSBtZW1vaXplZFNlbGVjdGlvbjtcblxuICAgICAgaWYgKG9iamVjdElzKHByZXZTbmFwc2hvdCwgbmV4dFNuYXBzaG90KSkge1xuICAgICAgICAvLyBUaGUgc25hcHNob3QgaXMgdGhlIHNhbWUgYXMgbGFzdCB0aW1lLiBSZXVzZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLlxuICAgICAgICByZXR1cm4gcHJldlNlbGVjdGlvbjtcbiAgICAgIH0gLy8gVGhlIHNuYXBzaG90IGhhcyBjaGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIGNvbXB1dGUgYSBuZXcgc2VsZWN0aW9uLlxuXG5cbiAgICAgIC8vIFRoZSBzbmFwc2hvdCBoYXMgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBjb21wdXRlIGEgbmV3IHNlbGVjdGlvbi5cbiAgICAgIHZhciBuZXh0U2VsZWN0aW9uID0gc2VsZWN0b3IobmV4dFNuYXBzaG90KTsgLy8gSWYgYSBjdXN0b20gaXNFcXVhbCBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdXNlIHRoYXQgdG8gY2hlY2sgaWYgdGhlIGRhdGFcbiAgICAgIC8vIGhhcyBjaGFuZ2VkLiBJZiBpdCBoYXNuJ3QsIHJldHVybiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLiBUaGF0IHNpZ25hbHNcbiAgICAgIC8vIHRvIFJlYWN0IHRoYXQgdGhlIHNlbGVjdGlvbnMgYXJlIGNvbmNlcHR1YWxseSBlcXVhbCwgYW5kIHdlIGNhbiBiYWlsXG4gICAgICAvLyBvdXQgb2YgcmVuZGVyaW5nLlxuXG4gICAgICAvLyBJZiBhIGN1c3RvbSBpc0VxdWFsIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB1c2UgdGhhdCB0byBjaGVjayBpZiB0aGUgZGF0YVxuICAgICAgLy8gaGFzIGNoYW5nZWQuIElmIGl0IGhhc24ndCwgcmV0dXJuIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uIFRoYXQgc2lnbmFsc1xuICAgICAgLy8gdG8gUmVhY3QgdGhhdCB0aGUgc2VsZWN0aW9ucyBhcmUgY29uY2VwdHVhbGx5IGVxdWFsLCBhbmQgd2UgY2FuIGJhaWxcbiAgICAgIC8vIG91dCBvZiByZW5kZXJpbmcuXG4gICAgICBpZiAoaXNFcXVhbCAhPT0gdW5kZWZpbmVkICYmIGlzRXF1YWwocHJldlNlbGVjdGlvbiwgbmV4dFNlbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTZWxlY3Rpb247XG4gICAgICB9XG5cbiAgICAgIG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3Q7XG4gICAgICBtZW1vaXplZFNlbGVjdGlvbiA9IG5leHRTZWxlY3Rpb247XG4gICAgICByZXR1cm4gbmV4dFNlbGVjdGlvbjtcbiAgICB9OyAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0YW50IHNvIHRoYXQgRmxvdyBrbm93cyBpdCBjYW4ndCBjaGFuZ2UuXG5cblxuICAgIC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3RhbnQgc28gdGhhdCBGbG93IGtub3dzIGl0IGNhbid0IGNoYW5nZS5cbiAgICB2YXIgbWF5YmVHZXRTZXJ2ZXJTbmFwc2hvdCA9IGdldFNlcnZlclNuYXBzaG90ID09PSB1bmRlZmluZWQgPyBudWxsIDogZ2V0U2VydmVyU25hcHNob3Q7XG5cbiAgICB2YXIgZ2V0U25hcHNob3RXaXRoU2VsZWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihnZXRTbmFwc2hvdCgpKTtcbiAgICB9O1xuXG4gICAgdmFyIGdldFNlcnZlclNuYXBzaG90V2l0aFNlbGVjdG9yID0gbWF5YmVHZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZW1vaXplZFNlbGVjdG9yKG1heWJlR2V0U2VydmVyU25hcHNob3QoKSk7XG4gICAgfTtcbiAgICByZXR1cm4gW2dldFNuYXBzaG90V2l0aFNlbGVjdG9yLCBnZXRTZXJ2ZXJTbmFwc2hvdFdpdGhTZWxlY3Rvcl07XG4gIH0sIFtnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QsIHNlbGVjdG9yLCBpc0VxdWFsXSksXG4gICAgICBnZXRTZWxlY3Rpb24gPSBfdXNlTWVtb1swXSxcbiAgICAgIGdldFNlcnZlclNlbGVjdGlvbiA9IF91c2VNZW1vWzFdO1xuXG4gIHZhciB2YWx1ZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U2VsZWN0aW9uLCBnZXRTZXJ2ZXJTZWxlY3Rpb24pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGluc3QuaGFzVmFsdWUgPSB0cnVlO1xuICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgfSwgW3ZhbHVlXSk7XG4gIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXdpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNQVhcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX21heC5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5JTFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbmlsLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicGFyc2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3BhcnNlLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3RyaW5naWZ5XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2MVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdi5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInYxVG9WNlwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjFUb1YuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2M1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjIuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjMuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjQuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NlwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjUuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NlRvVjFcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3Y2VG9WLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjdcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3Y2LmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidmFsaWRhdGVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3ZhbGlkYXRlLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidmVyc2lvblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdmVyc2lvbi5kZWZhdWx0O1xuICB9XG59KTtcbnZhciBfbWF4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9tYXguanNcIikpO1xudmFyIF9uaWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL25pbC5qc1wiKSk7XG52YXIgX3BhcnNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZS5qc1wiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpKTtcbnZhciBfdiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjEuanNcIikpO1xudmFyIF92MVRvViA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjFUb1Y2LmpzXCIpKTtcbnZhciBfdjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YzLmpzXCIpKTtcbnZhciBfdjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y0LmpzXCIpKTtcbnZhciBfdjQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y1LmpzXCIpKTtcbnZhciBfdjUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y2LmpzXCIpKTtcbnZhciBfdjZUb1YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y2VG9WMS5qc1wiKSk7XG52YXIgX3Y2ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92Ny5qc1wiKSk7XG52YXIgX3ZhbGlkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKSk7XG52YXIgX3ZlcnNpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3ZlcnNpb24uanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gJ2ZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZic7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEphdmFTY3JpcHQgTUQ1XG4gKlxuICogTW9kaWZpY2F0aW9uIG9mIEphdmFTY3JpcHQgTUQ1XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9KYXZhU2NyaXB0LU1ENVxuICpcbiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuXG4gKiBodHRwczovL2JsdWVpbXAubmV0XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqXG4gKiBCYXNlZCBvblxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZVxuICogRGlnZXN0IEFsZ29yaXRobSwgYXMgZGVmaW5lZCBpbiBSRkMgMTMyMS5cbiAqIFZlcnNpb24gMi4yIENvcHlyaWdodCAoQykgUGF1bCBKb2huc3RvbiAxOTk5IC0gMjAwOVxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlXG4gKiBTZWUgaHR0cDovL3BhamhvbWUub3JnLnVrL2NyeXB0L21kNSBmb3IgbW9yZSBpbmZvLlxuICovXG5mdW5jdGlvbiBtZDUoYnl0ZXMpIHtcbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KG1zZy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlc1tpXSA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWQ1VG9IZXhFbmNvZGVkQXJyYXkod29yZHNUb01kNShieXRlc1RvV29yZHMoYnl0ZXMpLCBieXRlcy5sZW5ndGggKiA4KSk7XG59XG5cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAqL1xuZnVuY3Rpb24gbWQ1VG9IZXhFbmNvZGVkQXJyYXkoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgbGVuZ3RoMzIgPSBpbnB1dC5sZW5ndGggKiAzMjtcbiAgdmFyIGhleFRhYiA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgdmFyIHggPSBpbnB1dFtpID4+IDVdID4+PiBpICUgMzIgJiAweGZmO1xuICAgIHZhciBoZXggPSBwYXJzZUludChoZXhUYWIuY2hhckF0KHggPj4+IDQgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpLCAxNik7XG4gICAgb3V0cHV0LnB1c2goaGV4KTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBvdXRwdXQgbGVuZ3RoIHdpdGggcGFkZGluZyBhbmQgYml0IGxlbmd0aFxuICovXG5mdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGg4KSB7XG4gIHJldHVybiAoaW5wdXRMZW5ndGg4ICsgNjQgPj4+IDkgPDwgNCkgKyAxNCArIDE7XG59XG5cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzLCBhbmQgYSBiaXQgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiB3b3Jkc1RvTWQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4W2dldE91dHB1dExlbmd0aChsZW4pIC0gMV0gPSBsZW47XG4gIHZhciBhID0gMTczMjU4NDE5MztcbiAgdmFyIGIgPSAtMjcxNzMzODc5O1xuICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xuICB2YXIgZCA9IDI3MTczMzg3ODtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxNikge1xuICAgIHZhciBvbGRhID0gYTtcbiAgICB2YXIgb2xkYiA9IGI7XG4gICAgdmFyIG9sZGMgPSBjO1xuICAgIHZhciBvbGRkID0gZDtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDZdLCA5LCAtMTA2OTUwMTYzMik7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTQsIDY0MzcxNzcxMyk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaV0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxMF0sIDksIDM4MDE2MDgzKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDldLCA1LCA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxNF0sIDksIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgOF0sIDIwLCAxMTYzNTMxNTAxKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMTNdLCA1LCAtMTQ0NDY4MTQ2Nyk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTQsIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyAxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA0LCAtMzc4NTU4KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgOF0sIDExLCAtMjAyMjU3NDQ2Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTYsIDE4MzkwMzA1NjIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxNF0sIDIzLCAtMzUzMDk1NTYpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNCwgLTE1MzA5OTIwNjApO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA0XSwgMTEsIDEyNzI4OTMzNTMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxMF0sIDIzLCAtMTA5NDczMDY0MCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNCwgNjgxMjc5MTc0KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpXSwgMTEsIC0zNTg1MzcyMjIpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTYsIC03MjI1MjE5NzkpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyA2XSwgMjMsIDc2MDI5MTg5KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgOV0sIDQsIC02NDAzNjQ0ODcpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyAxMl0sIDExLCAtNDIxODE1ODM1KTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNiwgNTMwNzQyNTIwKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMl0sIDIzLCAtOTk1MzM4NjUxKTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG4gICAgYSA9IHNhZmVBZGQoYSwgb2xkYSk7XG4gICAgYiA9IHNhZmVBZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVBZGQoYywgb2xkYyk7XG4gICAgZCA9IHNhZmVBZGQoZCwgb2xkZCk7XG4gIH1cbiAgcmV0dXJuIFthLCBiLCBjLCBkXTtcbn1cblxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgYnl0ZXMgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKi9cbmZ1bmN0aW9uIGJ5dGVzVG9Xb3JkcyhpbnB1dCkge1xuICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBsZW5ndGg4ID0gaW5wdXQubGVuZ3RoICogODtcbiAgdmFyIG91dHB1dCA9IG5ldyBVaW50MzJBcnJheShnZXRPdXRwdXRMZW5ndGgobGVuZ3RoOCkpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDg7IGkgKz0gOCkge1xuICAgIG91dHB1dFtpID4+IDVdIHw9IChpbnB1dFtpIC8gOF0gJiAweGZmKSA8PCBpICUgMzI7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLypcbiAqIEFkZCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHlcbiAqIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG4gKi9cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gIHJldHVybiBtc3cgPDwgMTYgfCBsc3cgJiAweGZmZmY7XG59XG5cbi8qXG4gKiBCaXR3aXNlIHJvdGF0ZSBhIDMyLWJpdCBudW1iZXIgdG8gdGhlIGxlZnQuXG4gKi9cbmZ1bmN0aW9uIGJpdFJvdGF0ZUxlZnQobnVtLCBjbnQpIHtcbiAgcmV0dXJuIG51bSA8PCBjbnQgfCBudW0gPj4+IDMyIC0gY250O1xufVxuXG4vKlxuICogVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgZm91ciBiYXNpYyBvcGVyYXRpb25zIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqL1xuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5mdW5jdGlvbiBtZDVmZihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGMgfCB+YiAmIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuZnVuY3Rpb24gbWQ1Z2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBkIHwgYyAmIH5kLCBhLCBiLCB4LCBzLCB0KTtcbn1cbmZ1bmN0aW9uIG1kNWhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBtZDU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgcmFuZG9tVVVJRCA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEICYmIGNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgcmFuZG9tVVVJRFxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF92YWxpZGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdmFsaWRhdGUuanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuZnVuY3Rpb24gcGFyc2UodXVpZCkge1xuICBpZiAoISgwLCBfdmFsaWRhdGUuZGVmYXVsdCkodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG4gIHZhciB2O1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuXG4gIC8vIFBhcnNlICMjIyMjIyMjLS4uLi4tLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuICBhcnJbMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0O1xuICBhcnJbMV0gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsyXSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbM10gPSB2ICYgMHhmZjtcblxuICAvLyBQYXJzZSAuLi4uLi4uLi0jIyMjLS4uLi4tLi4uLi0uLi4uLi4uLi4uLi5cbiAgYXJyWzRdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDksIDEzKSwgMTYpKSA+Pj4gODtcbiAgYXJyWzVdID0gdiAmIDB4ZmY7XG5cbiAgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0jIyMjLS4uLi4tLi4uLi4uLi4uLi4uXG4gIGFycls2XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTgpLCAxNikpID4+PiA4O1xuICBhcnJbN10gPSB2ICYgMHhmZjtcblxuICAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLS4uLi4tIyMjIy0uLi4uLi4uLi4uLi5cbiAgYXJyWzhdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDE5LCAyMyksIDE2KSkgPj4+IDg7XG4gIGFycls5XSA9IHYgJiAweGZmO1xuXG4gIC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0uLi4uLSMjIyMjIyMjIyMjI1xuICAvLyAoVXNlIFwiL1wiIHRvIGF2b2lkIDMyLWJpdCB0cnVuY2F0aW9uIHdoZW4gYml0LXNoaWZ0aW5nIGhpZ2gtb3JkZXIgYnl0ZXMpXG4gIGFyclsxMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMjQsIDM2KSwgMTYpKSAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBhcnJbMTFdID0gdiAvIDB4MTAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzEyXSA9IHYgPj4+IDI0ICYgMHhmZjtcbiAgYXJyWzEzXSA9IHYgPj4+IDE2ICYgMHhmZjtcbiAgYXJyWzE0XSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbMTVdID0gdiAmIDB4ZmY7XG4gIHJldHVybiBhcnI7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBwYXJzZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtOF1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwfGZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZikkL2k7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBybmc7XG4vLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cblxudmFyIGdldFJhbmRvbVZhbHVlcztcbnZhciBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmZ1bmN0aW9uIHJuZygpIHtcbiAgLy8gbGF6eSBsb2FkIHNvIHRoYXQgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBwb2x5ZmlsbCBoYXZlIGEgY2hhbmNlIHRvIGRvIHNvXG4gIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gZ2V0UmFuZG9tVmFsdWVzIG5lZWRzIHRvIGJlIGludm9rZWQgaW4gYSBjb250ZXh0IHdoZXJlIFwidGhpc1wiIGlzIGEgQ3J5cHRvIGltcGxlbWVudGF0aW9uLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byk7XG4gICAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vLyBBZGFwdGVkIGZyb20gQ2hyaXMgVmVuZXNzJyBTSEExIGNvZGUgYXRcbi8vIGh0dHA6Ly93d3cubW92YWJsZS10eXBlLmNvLnVrL3NjcmlwdHMvc2hhMS5odG1sXG5mdW5jdGlvbiBmKHMsIHgsIHksIHopIHtcbiAgc3dpdGNoIChzKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIHggJiB5IF4gfnggJiB6O1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuICB9XG59XG5mdW5jdGlvbiBST1RMKHgsIG4pIHtcbiAgcmV0dXJuIHggPDwgbiB8IHggPj4+IDMyIC0gbjtcbn1cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzLnB1c2gobXNnLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShieXRlcykpIHtcbiAgICAvLyBDb252ZXJ0IEFycmF5LWxpa2UgdG8gQXJyYXlcbiAgICBieXRlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJ5dGVzKTtcbiAgfVxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IE47ICsrX2kpIHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQzMkFycmF5KDE2KTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIGFycltqXSA9IGJ5dGVzW19pICogNjQgKyBqICogNF0gPDwgMjQgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAxXSA8PCAxNiB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDJdIDw8IDggfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAzXTtcbiAgICB9XG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cbiAgTVtOIC0gMV1bMTRdID0gKGJ5dGVzLmxlbmd0aCAtIDEpICogOCAvIE1hdGgucG93KDIsIDMyKTtcbiAgTVtOIC0gMV1bMTRdID0gTWF0aC5mbG9vcihNW04gLSAxXVsxNF0pO1xuICBNW04gLSAxXVsxNV0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4ICYgMHhmZmZmZmZmZjtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgTjsgKytfaTIpIHtcbiAgICB2YXIgVyA9IG5ldyBVaW50MzJBcnJheSg4MCk7XG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfdCA9IDE2OyBfdCA8IDgwOyArK190KSB7XG4gICAgICBXW190XSA9IFJPVEwoV1tfdCAtIDNdIF4gV1tfdCAtIDhdIF4gV1tfdCAtIDE0XSBeIFdbX3QgLSAxNl0sIDEpO1xuICAgIH1cbiAgICB2YXIgYSA9IEhbMF07XG4gICAgdmFyIGIgPSBIWzFdO1xuICAgIHZhciBjID0gSFsyXTtcbiAgICB2YXIgZCA9IEhbM107XG4gICAgdmFyIGUgPSBIWzRdO1xuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cbiAgICBIWzBdID0gSFswXSArIGEgPj4+IDA7XG4gICAgSFsxXSA9IEhbMV0gKyBiID4+PiAwO1xuICAgIEhbMl0gPSBIWzJdICsgYyA+Pj4gMDtcbiAgICBIWzNdID0gSFszXSArIGQgPj4+IDA7XG4gICAgSFs0XSA9IEhbNF0gKyBlID4+PiAwO1xuICB9XG4gIHJldHVybiBbSFswXSA+PiAyNCAmIDB4ZmYsIEhbMF0gPj4gMTYgJiAweGZmLCBIWzBdID4+IDggJiAweGZmLCBIWzBdICYgMHhmZiwgSFsxXSA+PiAyNCAmIDB4ZmYsIEhbMV0gPj4gMTYgJiAweGZmLCBIWzFdID4+IDggJiAweGZmLCBIWzFdICYgMHhmZiwgSFsyXSA+PiAyNCAmIDB4ZmYsIEhbMl0gPj4gMTYgJiAweGZmLCBIWzJdID4+IDggJiAweGZmLCBIWzJdICYgMHhmZiwgSFszXSA+PiAyNCAmIDB4ZmYsIEhbM10gPj4gMTYgJiAweGZmLCBIWzNdID4+IDggJiAweGZmLCBIWzNdICYgMHhmZiwgSFs0XSA+PiAyNCAmIDB4ZmYsIEhbNF0gPj4gMTYgJiAweGZmLCBIWzRdID4+IDggJiAweGZmLCBIWzRdICYgMHhmZl07XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBzaGExOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuZXhwb3J0cy51bnNhZmVTdHJpbmdpZnkgPSB1bnNhZmVTdHJpbmdpZnk7XG52YXIgX3ZhbGlkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cbnZhciBieXRlVG9IZXggPSBbXTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnNsaWNlKDEpKTtcbn1cbmZ1bmN0aW9uIHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIC8vXG4gIC8vIE5vdGUgdG8gZnV0dXJlLXNlbGY6IE5vLCB5b3UgY2FuJ3QgcmVtb3ZlIHRoZSBgdG9Mb3dlckNhc2UoKWAgY2FsbC5cbiAgLy8gUkVGOiBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC82NzcjaXNzdWVjb21tZW50LTE3NTczNTEzNTFcbiAgcmV0dXJuIChieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXSkudG9Mb3dlckNhc2UoKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgdmFyIHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpO1xuICAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG4gIGlmICghKDAsIF92YWxpZGF0ZS5kZWZhdWx0KSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cbiAgcmV0dXJuIHV1aWQ7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBzdHJpbmdpZnk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3JuZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcm5nLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcbnZhciBfY2xvY2tzZXE7XG5cbi8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwO1xuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkIGZvciBBUEkgZGV0YWlsc1xuZnVuY3Rpb24gdjEob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBBcnJheSgxNik7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbm9kZSA9IG9wdGlvbnMubm9kZTtcbiAgdmFyIGNsb2Nrc2VxID0gb3B0aW9ucy5jbG9ja3NlcTtcblxuICAvLyB2MSBvbmx5OiBVc2UgY2FjaGVkIGBub2RlYCBhbmQgYGNsb2Nrc2VxYCB2YWx1ZXNcbiAgaWYgKCFvcHRpb25zLl92Nikge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgbm9kZSA9IF9ub2RlSWQ7XG4gICAgfVxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcTtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgY2FzZXMgd2hlcmUgd2UgbmVlZCBlbnRyb3B5LiAgV2UgZG8gdGhpcyBsYXppbHkgdG8gbWluaW1pemUgaXNzdWVzXG4gIC8vIHJlbGF0ZWQgdG8gaW5zdWZmaWNpZW50IHN5c3RlbSBlbnRyb3B5LiAgU2VlICMxODlcbiAgaWYgKG5vZGUgPT0gbnVsbCB8fCBjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgdmFyIHNlZWRCeXRlcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBfcm5nLmRlZmF1bHQpKCk7XG5cbiAgICAvLyBSYW5kb21pemUgbm9kZVxuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIG5vZGUgPSBbc2VlZEJ5dGVzWzBdLCBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XV07XG5cbiAgICAgIC8vIHYxIG9ubHk6IGNhY2hlIG5vZGUgdmFsdWUgZm9yIHJldXNlXG4gICAgICBpZiAoIV9ub2RlSWQgJiYgIW9wdGlvbnMuX3Y2KSB7XG4gICAgICAgIC8vIHBlciBSRkM0MTIyIDQuNTogU2V0IE1BQyBtdWx0aWNhc3QgYml0ICh2MSBvbmx5KVxuICAgICAgICBub2RlWzBdIHw9IDB4MDE7IC8vIFNldCBtdWx0aWNhc3QgYml0XG5cbiAgICAgICAgX25vZGVJZCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmFuZG9taXplIGNsb2Nrc2VxXG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgICBpZiAoX2Nsb2Nrc2VxID09PSB1bmRlZmluZWQgJiYgIW9wdGlvbnMuX3Y2KSB7XG4gICAgICAgIF9jbG9ja3NlcSA9IGNsb2Nrc2VxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHYxICYgdjYgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvIHRpbWUgaXNcbiAgLy8gaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuICB2YXIgbXNlY3MgPSBvcHRpb25zLm1zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1zZWNzIDogRGF0ZS5ub3coKTtcblxuICAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG4gIHZhciBuc2VjcyA9IG9wdGlvbnMubnNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubnNlY3MgOiBfbGFzdE5TZWNzICsgMTtcblxuICAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG4gIHZhciBkdCA9IG1zZWNzIC0gX2xhc3RNU2VjcyArIChuc2VjcyAtIF9sYXN0TlNlY3MpIC8gMTAwMDA7XG5cbiAgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuICBpZiAoZHQgPCAwICYmIG9wdGlvbnMuY2xvY2tzZXEgPT09IHVuZGVmaW5lZCkge1xuICAgIGNsb2Nrc2VxID0gY2xvY2tzZXEgKyAxICYgMHgzZmZmO1xuICB9XG5cbiAgLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuICBpZiAoKGR0IDwgMCB8fCBtc2VjcyA+IF9sYXN0TVNlY3MpICYmIG9wdGlvbnMubnNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIG5zZWNzID0gMDtcbiAgfVxuXG4gIC8vIFBlciA0LjIuMS4yIFRocm93IGVycm9yIGlmIHRvbyBtYW55IHV1aWRzIGFyZSByZXF1ZXN0ZWRcbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWNcIik7XG4gIH1cbiAgX2xhc3RNU2VjcyA9IG1zZWNzO1xuICBfbGFzdE5TZWNzID0gbnNlY3M7XG4gIF9jbG9ja3NlcSA9IGNsb2Nrc2VxO1xuXG4gIC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuICBtc2VjcyArPSAxMjIxOTI5MjgwMDAwMDtcblxuICAvLyBgdGltZV9sb3dgXG4gIHZhciB0bCA9ICgobXNlY3MgJiAweGZmZmZmZmYpICogMTAwMDAgKyBuc2VjcykgJSAweDEwMDAwMDAwMDtcbiAgYltpKytdID0gdGwgPj4+IDI0ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDE2ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bCAmIDB4ZmY7XG5cbiAgLy8gYHRpbWVfbWlkYFxuICB2YXIgdG1oID0gbXNlY3MgLyAweDEwMDAwMDAwMCAqIDEwMDAwICYgMHhmZmZmZmZmO1xuICBiW2krK10gPSB0bWggPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bWggJiAweGZmO1xuXG4gIC8vIGB0aW1lX2hpZ2hfYW5kX3ZlcnNpb25gXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMjQgJiAweGYgfCAweDEwOyAvLyBpbmNsdWRlIHZlcnNpb25cbiAgYltpKytdID0gdG1oID4+PiAxNiAmIDB4ZmY7XG5cbiAgLy8gYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgIChQZXIgNC4yLjIgLSBpbmNsdWRlIHZhcmlhbnQpXG4gIGJbaSsrXSA9IGNsb2Nrc2VxID4+PiA4IHwgMHg4MDtcblxuICAvLyBgY2xvY2tfc2VxX2xvd2BcbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmO1xuXG4gIC8vIGBub2RlYFxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuICByZXR1cm4gYnVmIHx8ICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkoYik7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2MTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHYxVG9WNjtcbnZhciBfcGFyc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuLyoqXG4gKiBDb252ZXJ0IGEgdjEgVVVJRCB0byBhIHY2IFVVSURcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xVaW50OEFycmF5fSB1dWlkIC0gVGhlIHYxIFVVSUQgdG8gY29udmVydCB0byB2NlxuICogQHJldHVybnMge3N0cmluZ3xVaW50OEFycmF5fSBUaGUgdjYgVVVJRCBhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBgdXVpZGAgYXJnXG4gKiAoc3RyaW5nIG9yIFVpbnQ4QXJyYXkpXG4gKi9cbmZ1bmN0aW9uIHYxVG9WNih1dWlkKSB7XG4gIHZhciB2MUJ5dGVzID0gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIF9wYXJzZS5kZWZhdWx0KSh1dWlkKSA6IHV1aWQ7XG4gIHZhciB2NkJ5dGVzID0gX3YxVG9WNih2MUJ5dGVzKTtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyA/ICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkodjZCeXRlcykgOiB2NkJ5dGVzO1xufVxuXG4vLyBEbyB0aGUgZmllbGQgdHJhbnNmb3JtYXRpb24gbmVlZGVkIGZvciB2MSAtPiB2NlxuZnVuY3Rpb24gX3YxVG9WNih2MUJ5dGVzLCByYW5kb21pemUgPSBmYWxzZSkge1xuICByZXR1cm4gVWludDhBcnJheS5vZigodjFCeXRlc1s2XSAmIDB4MGYpIDw8IDQgfCB2MUJ5dGVzWzddID4+IDQgJiAweDBmLCAodjFCeXRlc1s3XSAmIDB4MGYpIDw8IDQgfCAodjFCeXRlc1s0XSAmIDB4ZjApID4+IDQsICh2MUJ5dGVzWzRdICYgMHgwZikgPDwgNCB8ICh2MUJ5dGVzWzVdICYgMHhmMCkgPj4gNCwgKHYxQnl0ZXNbNV0gJiAweDBmKSA8PCA0IHwgKHYxQnl0ZXNbMF0gJiAweGYwKSA+PiA0LCAodjFCeXRlc1swXSAmIDB4MGYpIDw8IDQgfCAodjFCeXRlc1sxXSAmIDB4ZjApID4+IDQsICh2MUJ5dGVzWzFdICYgMHgwZikgPDwgNCB8ICh2MUJ5dGVzWzJdICYgMHhmMCkgPj4gNCwgMHg2MCB8IHYxQnl0ZXNbMl0gJiAweDBmLCB2MUJ5dGVzWzNdLCB2MUJ5dGVzWzhdLCB2MUJ5dGVzWzldLCB2MUJ5dGVzWzEwXSwgdjFCeXRlc1sxMV0sIHYxQnl0ZXNbMTJdLCB2MUJ5dGVzWzEzXSwgdjFCeXRlc1sxNF0sIHYxQnl0ZXNbMTVdKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfdiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjM1LmpzXCIpKTtcbnZhciBfbWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL21kNS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG52YXIgdjMgPSAoMCwgX3YuZGVmYXVsdCkoJ3YzJywgMHgzMCwgX21kLmRlZmF1bHQpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdjM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlVSTCA9IGV4cG9ydHMuRE5TID0gdm9pZCAwO1xuZXhwb3J0cy5kZWZhdWx0ID0gdjM1O1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG52YXIgX3BhcnNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuICBzdHIgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgdmFyIGJ5dGVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxudmFyIEROUyA9IGV4cG9ydHMuRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG52YXIgVVJMID0gZXhwb3J0cy5VUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmZ1bmN0aW9uIHYzNShuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICB2YXIgX25hbWVzcGFjZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lc3BhY2UgPSAoMCwgX3BhcnNlLmRlZmF1bHQpKG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGlmICgoKF9uYW1lc3BhY2UgPSBuYW1lc3BhY2UpID09PSBudWxsIHx8IF9uYW1lc3BhY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uYW1lc3BhY2UubGVuZ3RoKSAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgaGFzaCBvZiBuYW1lc3BhY2UgYW5kIHZhbHVlLCBQZXIgNC4zXG4gICAgLy8gRnV0dXJlOiBVc2Ugc3ByZWFkIHN5bnRheCB3aGVuIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBlLmcuIGBieXRlcyA9XG4gICAgLy8gaGFzaGZ1bmMoWy4uLm5hbWVzcGFjZSwgLi4uIHZhbHVlXSlgXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcbiAgICBpZiAoYnVmKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlc1tpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX3N0cmluZ2lmeS51bnNhZmVTdHJpbmdpZnkpKGJ5dGVzKTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uI25hbWUgaXMgbm90IHNldHRhYmxlIG9uIHNvbWUgcGxhdGZvcm1zICgjMjcwKVxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTtcbiAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gIC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX25hdGl2ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbmF0aXZlLmpzXCIpKTtcbnZhciBfcm5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ybmcuanNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBpZiAoX25hdGl2ZS5kZWZhdWx0LnJhbmRvbVVVSUQgJiYgIWJ1ZiAmJiAhb3B0aW9ucykge1xuICAgIHJldHVybiBfbmF0aXZlLmRlZmF1bHQucmFuZG9tVVVJRCgpO1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBfcm5nLmRlZmF1bHQpKCk7XG5cbiAgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwO1xuXG4gIC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG4gIHJldHVybiAoMCwgX3N0cmluZ2lmeS51bnNhZmVTdHJpbmdpZnkpKHJuZHMpO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdjQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YzNS5qc1wiKSk7XG52YXIgX3NoYSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc2hhMS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG52YXIgdjUgPSAoMCwgX3YuZGVmYXVsdCkoJ3Y1JywgMHg1MCwgX3NoYS5kZWZhdWx0KTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHY1OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdjY7XG52YXIgX3N0cmluZ2lmeSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbnZhciBfdiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjEuanNcIikpO1xudmFyIF92MVRvViA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjFUb1Y2LmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHsgcmV0dXJuIChyID0gX3RvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgeyB2YWx1ZTogdCwgZW51bWVyYWJsZTogITAsIGNvbmZpZ3VyYWJsZTogITAsIHdyaXRhYmxlOiAhMCB9KSA6IGVbcl0gPSB0LCBlOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSB0eXBlb2YgaSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIHQgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIGkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuLyoqXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7VWludDhBcnJheT19IGJ1ZlxuICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHY2KG9wdGlvbnMgPSB7fSwgYnVmLCBvZmZzZXQgPSAwKSB7XG4gIC8vIHY2IGlzIHYxIHdpdGggZGlmZmVyZW50IGZpZWxkIGxheW91dCwgc28gd2Ugc3RhcnQgd2l0aCBhIHYxIFVVSUQsIGFsYmVpdFxuICAvLyB3aXRoIHNsaWdodGx5IGRpZmZlcmVudCBiZWhhdmlvciBhcm91bmQgaG93IHRoZSBjbG9ja19zZXEgYW5kIG5vZGUgZmllbGRzXG4gIC8vIGFyZSByYW5kb21pemVkLCB3aGljaCBpcyB3aHkgd2UgY2FsbCB2MSB3aXRoIF92NjogdHJ1ZS5cbiAgdmFyIGJ5dGVzID0gKDAsIF92LmRlZmF1bHQpKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgX3Y2OiB0cnVlXG4gIH0pLCBuZXcgVWludDhBcnJheSgxNikpO1xuXG4gIC8vIFJlb3JkZXIgdGhlIGZpZWxkcyB0byB2NiBsYXlvdXQuXG4gIGJ5dGVzID0gKDAsIF92MVRvVi5kZWZhdWx0KShieXRlcyk7XG5cbiAgLy8gUmV0dXJuIGFzIGEgYnl0ZSBhcnJheSBpZiByZXF1ZXN0ZWRcbiAgaWYgKGJ1Zikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cbiAgcmV0dXJuICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkoYnl0ZXMpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdjZUb1YxO1xudmFyIF9wYXJzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFyc2UuanNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG4vKipcbiAqIENvbnZlcnQgYSB2NiBVVUlEIHRvIGEgdjEgVVVJRFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfFVpbnQ4QXJyYXl9IHV1aWQgLSBUaGUgdjYgVVVJRCB0byBjb252ZXJ0IHRvIHY2XG4gKiBAcmV0dXJucyB7c3RyaW5nfFVpbnQ4QXJyYXl9IFRoZSB2MSBVVUlEIGFzIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGB1dWlkYCBhcmdcbiAqIChzdHJpbmcgb3IgVWludDhBcnJheSlcbiAqL1xuZnVuY3Rpb24gdjZUb1YxKHV1aWQpIHtcbiAgdmFyIHY2Qnl0ZXMgPSB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgPyAoMCwgX3BhcnNlLmRlZmF1bHQpKHV1aWQpIDogdXVpZDtcbiAgdmFyIHYxQnl0ZXMgPSBfdjZUb1YxKHY2Qnl0ZXMpO1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIF9zdHJpbmdpZnkudW5zYWZlU3RyaW5naWZ5KSh2MUJ5dGVzKSA6IHYxQnl0ZXM7XG59XG5cbi8vIERvIHRoZSBmaWVsZCB0cmFuc2Zvcm1hdGlvbiBuZWVkZWQgZm9yIHY2IC0+IHYxXG5mdW5jdGlvbiBfdjZUb1YxKHY2Qnl0ZXMpIHtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkub2YoKHY2Qnl0ZXNbM10gJiAweDBmKSA8PCA0IHwgdjZCeXRlc1s0XSA+PiA0ICYgMHgwZiwgKHY2Qnl0ZXNbNF0gJiAweDBmKSA8PCA0IHwgKHY2Qnl0ZXNbNV0gJiAweGYwKSA+PiA0LCAodjZCeXRlc1s1XSAmIDB4MGYpIDw8IDQgfCB2NkJ5dGVzWzZdICYgMHgwZiwgdjZCeXRlc1s3XSwgKHY2Qnl0ZXNbMV0gJiAweDBmKSA8PCA0IHwgKHY2Qnl0ZXNbMl0gJiAweGYwKSA+PiA0LCAodjZCeXRlc1syXSAmIDB4MGYpIDw8IDQgfCAodjZCeXRlc1szXSAmIDB4ZjApID4+IDQsIDB4MTAgfCAodjZCeXRlc1swXSAmIDB4ZjApID4+IDQsICh2NkJ5dGVzWzBdICYgMHgwZikgPDwgNCB8ICh2NkJ5dGVzWzFdICYgMHhmMCkgPj4gNCwgdjZCeXRlc1s4XSwgdjZCeXRlc1s5XSwgdjZCeXRlc1sxMF0sIHY2Qnl0ZXNbMTFdLCB2NkJ5dGVzWzEyXSwgdjZCeXRlc1sxM10sIHY2Qnl0ZXNbMTRdLCB2NkJ5dGVzWzE1XSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3JuZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcm5nLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuLyoqXG4gKiBVVUlEIFY3IC0gVW5peCBFcG9jaCB0aW1lLWJhc2VkIFVVSURcbiAqXG4gKiBUaGUgSUVURiBoYXMgcHVibGlzaGVkIFJGQzk1NjIsIGludHJvZHVjaW5nIDMgbmV3IFVVSUQgdmVyc2lvbnMgKDYsNyw4KS4gVGhpc1xuICogaW1wbGVtZW50YXRpb24gb2YgVjcgaXMgYmFzZWQgb24gdGhlIGFjY2VwdGVkLCB0aG91Z2ggbm90IHlldCBhcHByb3ZlZCxcbiAqIHJldmlzaW9ucy5cbiAqXG4gKiBSRkMgOTU2MjpodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTU2Mi5odG1sIFVuaXZlcnNhbGx5IFVuaXF1ZVxuICogSURlbnRpZmllcnMgKFVVSURzKVxuXG4gKlxuICogU2FtcGxlIFY3IHZhbHVlOlxuICogaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzk1NjIuaHRtbCNuYW1lLWV4YW1wbGUtb2YtYS11dWlkdjctdmFsdWVcbiAqXG4gKiBNb25vdG9uaWMgQml0IExheW91dDogUkZDIHJmYzk1NjIuNi4yIE1ldGhvZCAxLCBEZWRpY2F0ZWQgQ291bnRlciBCaXRzIHJlZjpcbiAqICAgICBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTU2Mi5odG1sI3NlY3Rpb24tNi4yLTUuMVxuICpcbiAqICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAwIDEgMiAzIDQgNSA2XG4gKiAgIDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDFcbiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXhfdHNfbXMgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAqICB8ICAgICAgICAgIHVuaXhfdHNfbXMgICAgICAgICAgIHwgIHZlciAgfCAgICAgICAgc2VxX2hpICAgICAgICAgfFxuICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gKiAgfHZhcnwgICAgICAgICAgICAgICBzZXFfbG93ICAgICAgICAgICAgICAgfCAgICAgICAgcmFuZCAgICAgICAgIHxcbiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAqXG4gKiBzZXEgaXMgYSAzMSBiaXQgc2VyaWFsaXplZCBjb3VudGVyOyBjb21wcmlzZWQgb2YgMTIgYml0IHNlcV9oaSBhbmQgMTkgYml0XG4gKiBzZXFfbG93LCBhbmQgcmFuZG9tbHkgaW5pdGlhbGl6ZWQgdXBvbiB0aW1lc3RhbXAgY2hhbmdlLiAzMSBiaXQgY291bnRlciBzaXplXG4gKiB3YXMgc2VsZWN0ZWQgYXMgYW55IGJpdHdpc2Ugb3BlcmF0aW9ucyBpbiBub2RlIGFyZSBkb25lIGFzIF9zaWduZWRfIDMyIGJpdFxuICogaW50cy4gd2UgZXhjbHVkZSB0aGUgc2lnbiBiaXQuXG4gKi9cblxudmFyIF9zZXFMb3cgPSBudWxsO1xudmFyIF9zZXFIaWdoID0gbnVsbDtcbnZhciBfbXNlY3MgPSAwO1xuZnVuY3Rpb24gdjcob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gaW5pdGlhbGl6ZSBidWZmZXIgYW5kIHBvaW50ZXJcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBVaW50OEFycmF5KDE2KTtcblxuICAvLyBybmRzIGlzIFVpbnQ4QXJyYXkoMTYpIGZpbGxlZCB3aXRoIHJhbmRvbSBieXRlc1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBfcm5nLmRlZmF1bHQpKCk7XG5cbiAgLy8gbWlsbGlzZWNvbmRzIHNpbmNlIHVuaXggZXBvY2gsIDE5NzAtMDEtMDEgMDA6MDBcbiAgdmFyIG1zZWNzID0gb3B0aW9ucy5tc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tc2VjcyA6IERhdGUubm93KCk7XG5cbiAgLy8gc2VxIGlzIHVzZXIgcHJvdmlkZWQgMzEgYml0IGNvdW50ZXJcbiAgdmFyIHNlcSA9IG9wdGlvbnMuc2VxICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnNlcSA6IG51bGw7XG5cbiAgLy8gaW5pdGlhbGl6ZSBsb2NhbCBzZXEgaGlnaC9sb3cgcGFydHNcbiAgdmFyIHNlcUhpZ2ggPSBfc2VxSGlnaDtcbiAgdmFyIHNlcUxvdyA9IF9zZXFMb3c7XG5cbiAgLy8gY2hlY2sgaWYgY2xvY2sgaGFzIGFkdmFuY2VkIGFuZCB1c2VyIGhhcyBub3QgcHJvdmlkZWQgbXNlY3NcbiAgaWYgKG1zZWNzID4gX21zZWNzICYmIG9wdGlvbnMubXNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIF9tc2VjcyA9IG1zZWNzO1xuXG4gICAgLy8gdW5sZXNzIHVzZXIgcHJvdmlkZWQgc2VxLCByZXNldCBzZXEgcGFydHNcbiAgICBpZiAoc2VxICE9PSBudWxsKSB7XG4gICAgICBzZXFIaWdoID0gbnVsbDtcbiAgICAgIHNlcUxvdyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgd2UgaGF2ZSBhIHVzZXIgcHJvdmlkZWQgc2VxXG4gIGlmIChzZXEgIT09IG51bGwpIHtcbiAgICAvLyB0cmltIHByb3ZpZGVkIHNlcSB0byAzMSBiaXRzIG9mIHZhbHVlLCBhdm9pZGluZyBvdmVyZmxvd1xuICAgIGlmIChzZXEgPiAweDdmZmZmZmZmKSB7XG4gICAgICBzZXEgPSAweDdmZmZmZmZmO1xuICAgIH1cblxuICAgIC8vIHNwbGl0IHByb3ZpZGVkIHNlcSBpbnRvIGhpZ2gvbG93IHBhcnRzXG4gICAgc2VxSGlnaCA9IHNlcSA+Pj4gMTkgJiAweGZmZjtcbiAgICBzZXFMb3cgPSBzZXEgJiAweDdmZmZmO1xuICB9XG5cbiAgLy8gcmFuZG9tbHkgaW5pdGlhbGl6ZSBzZXFcbiAgaWYgKHNlcUhpZ2ggPT09IG51bGwgfHwgc2VxTG93ID09PSBudWxsKSB7XG4gICAgc2VxSGlnaCA9IHJuZHNbNl0gJiAweDdmO1xuICAgIHNlcUhpZ2ggPSBzZXFIaWdoIDw8IDggfCBybmRzWzddO1xuICAgIHNlcUxvdyA9IHJuZHNbOF0gJiAweDNmOyAvLyBwYWQgZm9yIHZhclxuICAgIHNlcUxvdyA9IHNlcUxvdyA8PCA4IHwgcm5kc1s5XTtcbiAgICBzZXFMb3cgPSBzZXFMb3cgPDwgNSB8IHJuZHNbMTBdID4+PiAzO1xuICB9XG5cbiAgLy8gaW5jcmVtZW50IHNlcSBpZiB3aXRoaW4gbXNlY3Mgd2luZG93XG4gIGlmIChtc2VjcyArIDEwMDAwID4gX21zZWNzICYmIHNlcSA9PT0gbnVsbCkge1xuICAgIGlmICgrK3NlcUxvdyA+IDB4N2ZmZmYpIHtcbiAgICAgIHNlcUxvdyA9IDA7XG4gICAgICBpZiAoKytzZXFIaWdoID4gMHhmZmYpIHtcbiAgICAgICAgc2VxSGlnaCA9IDA7XG5cbiAgICAgICAgLy8gaW5jcmVtZW50IGludGVybmFsIF9tc2Vjcy4gdGhpcyBhbGxvd3MgdXMgdG8gY29udGludWUgaW5jcmVtZW50aW5nXG4gICAgICAgIC8vIHdoaWxlIHN0YXlpbmcgbW9ub3RvbmljLiBOb3RlLCBvbmNlIHdlIGhpdCAxMGsgbWlsbGlzZWNvbmRzIGJleW9uZCBzeXN0ZW1cbiAgICAgICAgLy8gY2xvY2ssIHdlIHdpbGwgcmVzZXQgYnJlYWtpbmcgbW9ub3RvbmljaXR5IChhZnRlciAoMl4zMSkqMTAwMDAgZ2VuZXJhdGlvbnMpXG4gICAgICAgIF9tc2VjcysrO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyByZXNldHRpbmc7IHdlIGhhdmUgYWR2YW5jZWQgbW9yZSB0aGFuXG4gICAgLy8gMTBrIG1pbGxpc2Vjb25kcyBiZXlvbmQgc3lzdGVtIGNsb2NrXG4gICAgX21zZWNzID0gbXNlY3M7XG4gIH1cbiAgX3NlcUhpZ2ggPSBzZXFIaWdoO1xuICBfc2VxTG93ID0gc2VxTG93O1xuXG4gIC8vIFtieXRlcyAwLTVdIDQ4IGJpdHMgb2YgbG9jYWwgdGltZXN0YW1wXG4gIGJbaSsrXSA9IF9tc2VjcyAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGJbaSsrXSA9IF9tc2VjcyAvIDB4MTAwMDAwMCAmIDB4ZmY7XG4gIGJbaSsrXSA9IF9tc2VjcyAvIDB4MTAwMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMCAmIDB4ZmY7XG4gIGJbaSsrXSA9IF9tc2VjcyAmIDB4ZmY7XG5cbiAgLy8gW2J5dGUgNl0gLSBzZXQgNCBiaXRzIG9mIHZlcnNpb24gKDcpIHdpdGggZmlyc3QgNCBiaXRzIHNlcV9oaVxuICBiW2krK10gPSBzZXFIaWdoID4+PiA0ICYgMHgwZiB8IDB4NzA7XG5cbiAgLy8gW2J5dGUgN10gcmVtYWluaW5nIDggYml0cyBvZiBzZXFfaGlcbiAgYltpKytdID0gc2VxSGlnaCAmIDB4ZmY7XG5cbiAgLy8gW2J5dGUgOF0gLSB2YXJpYW50ICgyIGJpdHMpLCBmaXJzdCA2IGJpdHMgc2VxX2xvd1xuICBiW2krK10gPSBzZXFMb3cgPj4+IDEzICYgMHgzZiB8IDB4ODA7XG5cbiAgLy8gW2J5dGUgOV0gOCBiaXRzIHNlcV9sb3dcbiAgYltpKytdID0gc2VxTG93ID4+PiA1ICYgMHhmZjtcblxuICAvLyBbYnl0ZSAxMF0gcmVtYWluaW5nIDUgYml0cyBzZXFfbG93LCAzIGJpdHMgcmFuZG9tXG4gIGJbaSsrXSA9IHNlcUxvdyA8PCAzICYgMHhmZiB8IHJuZHNbMTBdICYgMHgwNztcblxuICAvLyBbYnl0ZXMgMTEtMTVdIGFsd2F5cyByYW5kb21cbiAgYltpKytdID0gcm5kc1sxMV07XG4gIGJbaSsrXSA9IHJuZHNbMTJdO1xuICBiW2krK10gPSBybmRzWzEzXTtcbiAgYltpKytdID0gcm5kc1sxNF07XG4gIGJbaSsrXSA9IHJuZHNbMTVdO1xuICByZXR1cm4gYnVmIHx8ICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkoYik7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2NzsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmVnZXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JlZ2V4LmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbmZ1bmN0aW9uIHZhbGlkYXRlKHV1aWQpIHtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyAmJiBfcmVnZXguZGVmYXVsdC50ZXN0KHV1aWQpO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdmFsaWRhdGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3ZhbGlkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCEoMCwgX3ZhbGlkYXRlLmRlZmF1bHQpKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIFVVSUQnKTtcbiAgfVxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTUpLCAxNik7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2ZXJzaW9uOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgX19ERVZfXyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbic7XG5cbnZhciB3YXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKF9fREVWX18pIHtcbiAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIHByaW50V2FybmluZyhmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDEgPyBsZW4gLSAxIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMTsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAxXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgK1xuICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH1cblxuICB3YXJuaW5nID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArXG4gICAgICAgICAgJ21lc3NhZ2UgYXJndW1lbnQnXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgcHJpbnRXYXJuaW5nLmFwcGx5KG51bGwsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdhcm5pbmc7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3dzIGRvZXMgbm90IHdvcmsgaW4gdGhlIGJyb3dzZXIuIEJyb3dzZXIgY2xpZW50cyBtdXN0IHVzZSB0aGUgbmF0aXZlICcgK1xuICAgICAgJ1dlYlNvY2tldCBvYmplY3QnXG4gICk7XG59O1xuIiwiZnVuY3Rpb24gZShlLGksdCxvKXtmb3IoO2k+PXQmJiFlKFwiKG1pbi1yZXNvbHV0aW9uOiBcIitpL28rXCJkcHB4KVwiKS5tYXRjaGVzOylpLS07cmV0dXJuIGl9ZnVuY3Rpb24gaShpKXtpZih2b2lkIDA9PT1pJiYoaT13aW5kb3cpLCFpKXJldHVybiAxO2lmKHZvaWQgMCE9PWkuZGV2aWNlUGl4ZWxSYXRpbylyZXR1cm4gaS5kZXZpY2VQaXhlbFJhdGlvO3ZhciB0PWkuZG9jdW1lbnQuZnJhbWVzO3JldHVybiB2b2lkIDAhPT10P3ZvaWQgMCE9PXQuZGV2aWNlUGl4ZWxSYXRpbz90LmRldmljZVBpeGVsUmF0aW86dC5zY3JlZW4uZGV2aWNlWERQSS90LnNjcmVlbi5zeXN0ZW1YRFBJOnZvaWQgMCE9PWkubWF0Y2hNZWRpYT9mdW5jdGlvbihpKXtmb3IodmFyIHQ9aS5tYXRjaE1lZGlhLG89MTAsbj0uMSxyPTEsYT1vLGM9MDtjPDQ7YysrKW89KGE9MTAqZSh0LG8sbixyKSkrOSxuPWEscio9MTA7cmV0dXJuIGEvcn0oaSk6MX1mdW5jdGlvbiB0KGUsdCl7dmFyIG89KGUgaW5zdGFuY2VvZiBFbGVtZW50P2dldENvbXB1dGVkU3R5bGUoZSkuem9vbTplLnpvb20pfHwxO3JldHVybiBpKHQpKihcInN0cmluZ1wiPT10eXBlb2Ygbz9wYXJzZUZsb2F0KG8pOm8pfWV4cG9ydHt0IGFzIGVsZW1lbnRab29tTGV2ZWwsaSBhcyB6b29tTGV2ZWx9O1xuIiwiLyogKGlnbm9yZWQpICovIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS9mcm9tXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvaXMtYXJyYXlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9iaW5kXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZW50cmllc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2V2ZXJ5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmlsdGVyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmluZC1pbmRleFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2ZpbmRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9rZXlzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvbWFwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvcmVkdWNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc2xpY2VcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zb3J0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc3BsaWNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS92YWx1ZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9qc29uL3N0cmluZ2lmeVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL21hcFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL251bWJlci9pcy1pbnRlZ2VyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2Fzc2lnblwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9jcmVhdGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2VudHJpZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZnJlZXplXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2tleXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9wYXJzZS1pbnRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9wcm9taXNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvc2V0LWludGVydmFsXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvc2V0LXRpbWVvdXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9zZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS93ZWFrLW1hcFwiKTsiLCJ2YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvZmVhdHVyZXMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZShcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiKTtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7XG4gIHJldHVybiAociA9IHRvUHJvcGVydHlLZXkocikpIGluIGUgPyBfT2JqZWN0JGRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHtcbiAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICBcImRlZmF1bHRcIjogZVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF9TeW1ib2wkdG9QcmltaXRpdmUgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC90by1wcmltaXRpdmUuanNcIik7XG52YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuL3R5cGVvZi5qc1wiKVtcImRlZmF1bHRcIl07XG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbX1N5bWJvbCR0b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gdG9QcmltaXRpdmUsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuL3R5cGVvZi5qc1wiKVtcImRlZmF1bHRcIl07XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKFwiLi90b1ByaW1pdGl2ZS5qc1wiKTtcbmZ1bmN0aW9uIHRvUHJvcGVydHlLZXkodCkge1xuICB2YXIgaSA9IHRvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiO1xufVxubW9kdWxlLmV4cG9ydHMgPSB0b1Byb3BlcnR5S2V5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF9TeW1ib2wgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC9pbmRleC5qc1wiKTtcbnZhciBfU3ltYm9sJGl0ZXJhdG9yID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9mZWF0dXJlcy9zeW1ib2wvaXRlcmF0b3IuanNcIik7XG5mdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiAobW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBfU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIF9TeW1ib2wkaXRlcmF0b3IgPyBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiB0eXBlb2YgbztcbiAgfSA6IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBfU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IF9TeW1ib2wgJiYgbyAhPT0gX1N5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cyksIF90eXBlb2Yobyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhYmxlL3N5bWJvbCcpO1xuXG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5mdW5jdGlvbi5tZXRhZGF0YScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmFzeW5jLWRpc3Bvc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5kaXNwb3NlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wubWV0YWRhdGEnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhYmxlL3N5bWJvbC9pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9zdGFibGUvc3ltYm9sL3RvLXByaW1pdGl2ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZyb20nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmZyb207XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmlzLWFycmF5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5pc0FycmF5O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5jb25jYXQnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnY29uY2F0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZW50cmllcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5ldmVyeScpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdldmVyeScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5maWx0ZXInKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZmlsdGVyJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXgnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZmluZEluZGV4Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZmluZCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdmb3JFYWNoJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2luZGV4T2YnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdrZXlzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5Lm1hcCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdtYXAnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3JlZHVjZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5zbGljZScpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdzbGljZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5zb3J0Jyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3NvcnQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3NwbGljZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3ZhbHVlcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0Z1bmN0aW9uJywgJ2JpbmQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9mdW5jdGlvbi92aXJ0dWFsL2JpbmQnKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuYmluZDtcbiAgcmV0dXJuIGl0ID09PSBGdW5jdGlvblByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihGdW5jdGlvblByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gRnVuY3Rpb25Qcm90b3R5cGUuYmluZCkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvY29uY2F0Jyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmNvbmNhdDtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuY29uY2F0KSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9ldmVyeScpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5ldmVyeTtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuZXZlcnkpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2ZpbHRlcicpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5maWx0ZXI7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmZpbHRlcikgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvZmluZC1pbmRleCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5maW5kSW5kZXg7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmZpbmRJbmRleCkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvZmluZCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5maW5kO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5maW5kKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgYXJyYXlNZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2luY2x1ZGVzJyk7XG52YXIgc3RyaW5nTWV0aG9kID0gcmVxdWlyZSgnLi4vc3RyaW5nL3ZpcnR1YWwvaW5jbHVkZXMnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xudmFyIFN0cmluZ1Byb3RvdHlwZSA9IFN0cmluZy5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5pbmNsdWRlcztcbiAgaWYgKGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuaW5jbHVkZXMpKSByZXR1cm4gYXJyYXlNZXRob2Q7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgfHwgaXQgPT09IFN0cmluZ1Byb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihTdHJpbmdQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IFN0cmluZ1Byb3RvdHlwZS5pbmNsdWRlcykpIHtcbiAgICByZXR1cm4gc3RyaW5nTWV0aG9kO1xuICB9IHJldHVybiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvaW5kZXgtb2YnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuaW5kZXhPZjtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuaW5kZXhPZikgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvbWFwJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0Lm1hcDtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUubWFwKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9yZWR1Y2UnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQucmVkdWNlO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5yZWR1Y2UpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL3NsaWNlJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LnNsaWNlO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5zbGljZSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvc29ydCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5zb3J0O1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5zb3J0KSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9zcGxpY2UnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuc3BsaWNlO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5zcGxpY2UpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9zdHJpbmcvdmlydHVhbC9zdGFydHMtd2l0aCcpO1xuXG52YXIgU3RyaW5nUHJvdG90eXBlID0gU3RyaW5nLnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LnN0YXJ0c1dpdGg7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N0cmluZycgfHwgaXQgPT09IFN0cmluZ1Byb3RvdHlwZVxuICAgIHx8IChpc1Byb3RvdHlwZU9mKFN0cmluZ1Byb3RvdHlwZSwgaXQpICYmIG93biA9PT0gU3RyaW5nUHJvdG90eXBlLnN0YXJ0c1dpdGgpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuZGF0ZS50by1qc29uJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHknKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWpzb24gLS0gc2FmZVxuaWYgKCFwYXRoLkpTT04pIHBhdGguSlNPTiA9IHsgc3RyaW5naWZ5OiBKU09OLnN0cmluZ2lmeSB9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICByZXR1cm4gYXBwbHkocGF0aC5KU09OLnN0cmluZ2lmeSwgbnVsbCwgYXJndW1lbnRzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hcCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5tYXAuZ3JvdXAtYnknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk1hcDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXInKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5pc0ludGVnZXI7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5hc3NpZ247XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5jcmVhdGUnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxudmFyIE9iamVjdCA9IHBhdGguT2JqZWN0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKSB7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKFAsIEQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG52YXIgT2JqZWN0ID0gcGF0aC5PYmplY3Q7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYykge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpO1xufTtcblxuaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5zaGFtKSBkZWZpbmVQcm9wZXJ0eS5zaGFtID0gdHJ1ZTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5lbnRyaWVzO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZnJlZXplJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZnJlZXplO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbnZhciBPYmplY3QgPSBwYXRoLk9iamVjdDtcblxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSk7XG59O1xuXG5pZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5zaGFtKSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2hhbSA9IHRydWU7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5rZXlzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3Qua2V5cztcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucGFyc2UtaW50Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5wYXJzZUludDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYWdncmVnYXRlLWVycm9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYW55Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2Uud2l0aC1yZXNvbHZlcnMnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguUHJvbWlzZTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LmRpZmZlcmVuY2UudjInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LmludGVyc2VjdGlvbi52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuaXMtZGlzam9pbnQtZnJvbS52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuaXMtc3Vic2V0LW9mLnYyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnNldC5pcy1zdXBlcnNldC1vZi52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuc3ltbWV0cmljLWRpZmZlcmVuY2UudjInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LnVuaW9uLnYyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguU2V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnU3RyaW5nJywgJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdTdHJpbmcnLCAnc3RhcnRzV2l0aCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5jb25jYXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaGFzLWluc3RhbmNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5pcy1jb25jYXQtc3ByZWFkYWJsZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC1hbGwnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnJlcGxhY2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuc3BlY2llcycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuc3BsaXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wudG8tc3RyaW5nLXRhZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wudW5zY29wYWJsZXMnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5yZWZsZWN0LnRvLXN0cmluZy10YWcnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlN5bWJvbDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yJyk7XG52YXIgV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKCdpdGVyYXRvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5kYXRlLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wudG8tcHJpbWl0aXZlJyk7XG52YXIgV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKCd0b1ByaW1pdGl2ZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLndlYWstbWFwJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5XZWFrTWFwO1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9mdWxsL29iamVjdC9kZWZpbmUtcHJvcGVydHknKTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vZnVsbC9zeW1ib2wnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vZnVsbC9zeW1ib2wvaXRlcmF0b3InKTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vZnVsbC9zeW1ib2wvdG8tcHJpbWl0aXZlJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vYWN0dWFsL29iamVjdC9kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vYWN0dWFsL3N5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXJlZ2lzdGVyZWQtc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtd2VsbC1rbm93bi1zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5jdXN0b20tbWF0Y2hlcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUnKTtcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtcmVnaXN0ZXJlZCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXdlbGwta25vd24nKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5tYXRjaGVyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wubWV0YWRhdGEta2V5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucGF0dGVybi1tYXRjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLnJlcGxhY2UtYWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2FjdHVhbC9zeW1ib2wvaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vYWN0dWFsL3N5bWJvbC90by1wcmltaXRpdmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IElzQ2FsbGFibGUoYXJndW1lbnQpIGlzIHRydWVgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkgaXMgdHJ1ZWBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcG9zc2libGUtcHJvdG90eXBlJyk7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc1Bvc3NpYmxlUHJvdG90eXBlKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArICRTdHJpbmcoYXJndW1lbnQpICsgJyBhcyBhIHByb3RvdHlwZScpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBQZXJmb3JtID8gUmVxdWlyZUludGVybmFsU2xvdChNLCBbW1NldERhdGFdXSlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ29iamVjdCcgJiYgJ3NpemUnIGluIGl0ICYmICdoYXMnIGluIGl0ICYmICdhZGQnIGluIGl0ICYmICdkZWxldGUnIGluIGl0ICYmICdrZXlzJyBpbiBpdCkgcmV0dXJuIGl0O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhpdCkgKyAnIGlzIG5vdCBhIHNldCcpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFByb3RvdHlwZSkge1xuICBpZiAoaXNQcm90b3R5cGVPZihQcm90b3R5cGUsIGl0KSkgcmV0dXJuIGl0O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IFR5cGUoYXJndW1lbnQpIGlzIE9iamVjdGBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc09iamVjdChhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJFN0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBGRjI2LSBidWc6IEFycmF5QnVmZmVycyBhcmUgbm9uLWV4dGVuc2libGUsIGJ1dCBPYmplY3QuaXNFeHRlbnNpYmxlIGRvZXMgbm90IHJlcG9ydCBpdFxudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyID09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNleHRlbnNpYmxlLCBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIGlmIChPYmplY3QuaXNFeHRlbnNpYmxlKGJ1ZmZlcikpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShidWZmZXIsICdhJywgeyB2YWx1ZTogOCB9KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGZvckVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZm9yRWFjaDtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcblxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdmb3JFYWNoJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG5tb2R1bGUuZXhwb3J0cyA9ICFTVFJJQ1RfTUVUSE9EID8gZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGZvckVhY2godGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LXByb3RvdHlwZS1mb3JlYWNoIC0tIHNhZmVcbn0gOiBbXS5mb3JFYWNoO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3InKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbnZhciAkQXJyYXkgPSBBcnJheTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgSVNfQ09OU1RSVUNUT1IgPSBpc0NvbnN0cnVjdG9yKHRoaXMpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICBpZiAobWFwcGluZykgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoTyk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3IsIG5leHQsIHZhbHVlO1xuICAvLyBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBpdGVyYWJsZSBvciBpdCdzIGFuIGFycmF5IHdpdGggdGhlIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2UgYSBzaW1wbGUgY2FzZVxuICBpZiAoaXRlcmF0b3JNZXRob2QgJiYgISh0aGlzID09PSAkQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKCkgOiBbXTtcbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKE8sIGl0ZXJhdG9yTWV0aG9kKTtcbiAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgICBmb3IgKDshKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgcmVzdWx0ID0gSVNfQ09OU1RSVUNUT1IgPyBuZXcgdGhpcyhsZW5ndGgpIDogJEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIHZhbHVlID0gbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICAgIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIGlmICgoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykgJiYgT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4gIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiAgaW5kZXhPZjogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xuXG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgZm9yRWFjaCwgbWFwLCBmaWx0ZXIsIHNvbWUsIGV2ZXJ5LCBmaW5kLCBmaW5kSW5kZXgsIGZpbHRlclJlamVjdCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PT0gNjtcbiAgdmFyIElTX0ZJTFRFUl9SRUpFQ1QgPSBUWVBFID09PSA3O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShzZWxmKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgdGhhdCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY3JlYXRlID0gc3BlY2lmaWNDcmVhdGUgfHwgYXJyYXlTcGVjaWVzQ3JlYXRlO1xuICAgIHZhciB0YXJnZXQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgfHwgSVNfRklMVEVSX1JFSkVDVCA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbHVlLCByZXN1bHQ7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHB1c2godGFyZ2V0LCB2YWx1ZSk7ICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBmYWxzZTsgICAgICAgICAgICAgLy8gZXZlcnlcbiAgICAgICAgICBjYXNlIDc6IHB1c2godGFyZ2V0LCB2YWx1ZSk7ICAgICAgLy8gZmlsdGVyUmVqZWN0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG4gIGZvckVhY2g6IGNyZWF0ZU1ldGhvZCgwKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXBcbiAgbWFwOiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb21lXG4gIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5XG4gIGV2ZXJ5OiBjcmVhdGVNZXRob2QoNCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRJbmRleFxuICBmaW5kSW5kZXg6IGNyZWF0ZU1ldGhvZCg2KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJSZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maWx0ZXJpbmdcbiAgZmlsdGVyUmVqZWN0OiBjcmVhdGVNZXRob2QoNylcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIC8vIFdlIGNhbid0IHVzZSB0aGlzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc3XG4gIHJldHVybiBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gYXJyYXkuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGZvbzogMSB9O1xuICAgIH07XG4gICAgcmV0dXJuIGFycmF5W01FVEhPRF9OQU1FXShCb29sZWFuKS5mb28gIT09IDE7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgYXJndW1lbnQpIHtcbiAgdmFyIG1ldGhvZCA9IFtdW01FVEhPRF9OQU1FXTtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgbWV0aG9kLmNhbGwobnVsbCwgYXJndW1lbnQgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSwgMSk7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFJFRFVDRV9FTVBUWSA9ICdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJztcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IHJlZHVjZSwgcmVkdWNlUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19SSUdIVCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c0xlbmd0aCwgbWVtbykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhhdCk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICBhQ2FsbGFibGUoY2FsbGJhY2tmbik7XG4gICAgaWYgKGxlbmd0aCA9PT0gMCAmJiBhcmd1bWVudHNMZW5ndGggPCAyKSB0aHJvdyBuZXcgJFR5cGVFcnJvcihSRURVQ0VfRU1QVFkpO1xuICAgIHZhciBpbmRleCA9IElTX1JJR0hUID8gbGVuZ3RoIC0gMSA6IDA7XG4gICAgdmFyIGkgPSBJU19SSUdIVCA/IC0xIDogMTtcbiAgICBpZiAoYXJndW1lbnRzTGVuZ3RoIDwgMikgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgICAgIG1lbW8gPSBzZWxmW2luZGV4XTtcbiAgICAgICAgaW5kZXggKz0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpbmRleCArPSBpO1xuICAgICAgaWYgKElTX1JJR0hUID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICAgIHRocm93IG5ldyAkVHlwZUVycm9yKFJFRFVDRV9FTVBUWSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoO0lTX1JJR0hUID8gaW5kZXggPj0gMCA6IGxlbmd0aCA+IGluZGV4OyBpbmRleCArPSBpKSBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgbWVtbyA9IGNhbGxiYWNrZm4obWVtbywgc2VsZltpbmRleF0sIGluZGV4LCBPKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbW87XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VcbiAgbGVmdDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZXJpZ2h0XG4gIHJpZ2h0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIFNhZmFyaSA8IDEzIGRvZXMgbm90IHRocm93IGFuIGVycm9yIGluIHRoaXMgY2FzZVxudmFyIFNJTEVOVF9PTl9OT05fV1JJVEFCTEVfTEVOR1RIX1NFVCA9IERFU0NSSVBUT1JTICYmICFmdW5jdGlvbiAoKSB7XG4gIC8vIG1ha2VzIG5vIHNlbnNlIHdpdGhvdXQgcHJvcGVyIHN0cmljdCBtb2RlIHN1cHBvcnRcbiAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB3cml0YWJsZTogZmFsc2UgfSkubGVuZ3RoID0gMTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3I7XG4gIH1cbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPyBmdW5jdGlvbiAoTywgbGVuZ3RoKSB7XG4gIGlmIChpc0FycmF5KE8pICYmICFnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgJ2xlbmd0aCcpLndyaXRhYmxlKSB7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgnKTtcbiAgfSByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59IDogZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzKFtdLnNsaWNlKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbnZhciBzb3J0ID0gZnVuY3Rpb24gKGFycmF5LCBjb21wYXJlZm4pIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOCkge1xuICAgIC8vIGluc2VydGlvbiBzb3J0XG4gICAgdmFyIGkgPSAxO1xuICAgIHZhciBlbGVtZW50LCBqO1xuXG4gICAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICAgIGogPSBpO1xuICAgICAgZWxlbWVudCA9IGFycmF5W2ldO1xuICAgICAgd2hpbGUgKGogJiYgY29tcGFyZWZuKGFycmF5W2ogLSAxXSwgZWxlbWVudCkgPiAwKSB7XG4gICAgICAgIGFycmF5W2pdID0gYXJyYXlbLS1qXTtcbiAgICAgIH1cbiAgICAgIGlmIChqICE9PSBpKyspIGFycmF5W2pdID0gZWxlbWVudDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gbWVyZ2Ugc29ydFxuICAgIHZhciBtaWRkbGUgPSBmbG9vcihsZW5ndGggLyAyKTtcbiAgICB2YXIgbGVmdCA9IHNvcnQoYXJyYXlTbGljZShhcnJheSwgMCwgbWlkZGxlKSwgY29tcGFyZWZuKTtcbiAgICB2YXIgcmlnaHQgPSBzb3J0KGFycmF5U2xpY2UoYXJyYXksIG1pZGRsZSksIGNvbXBhcmVmbik7XG4gICAgdmFyIGxsZW5ndGggPSBsZWZ0Lmxlbmd0aDtcbiAgICB2YXIgcmxlbmd0aCA9IHJpZ2h0Lmxlbmd0aDtcbiAgICB2YXIgbGluZGV4ID0gMDtcbiAgICB2YXIgcmluZGV4ID0gMDtcblxuICAgIHdoaWxlIChsaW5kZXggPCBsbGVuZ3RoIHx8IHJpbmRleCA8IHJsZW5ndGgpIHtcbiAgICAgIGFycmF5W2xpbmRleCArIHJpbmRleF0gPSAobGluZGV4IDwgbGxlbmd0aCAmJiByaW5kZXggPCBybGVuZ3RoKVxuICAgICAgICA/IGNvbXBhcmVmbihsZWZ0W2xpbmRleF0sIHJpZ2h0W3JpbmRleF0pIDw9IDAgPyBsZWZ0W2xpbmRleCsrXSA6IHJpZ2h0W3JpbmRleCsrXVxuICAgICAgICA6IGxpbmRleCA8IGxsZW5ndGggPyBsZWZ0W2xpbmRleCsrXSA6IHJpZ2h0W3JpbmRleCsrXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3InKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciAkQXJyYXkgPSBBcnJheTtcblxuLy8gYSBwYXJ0IG9mIGBBcnJheVNwZWNpZXNDcmVhdGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXkpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsQXJyYXkpKSB7XG4gICAgQyA9IG9yaWdpbmFsQXJyYXkuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAoaXNDb25zdHJ1Y3RvcihDKSAmJiAoQyA9PT0gJEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/ICRBcnJheSA6IEM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFycmF5U3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3InKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKGFycmF5U3BlY2llc0NvbnN0cnVjdG9yKG9yaWdpbmFsQXJyYXkpKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtZXRob2ROYW1lLCBudW1BcmdzKSB7XG4gIHJldHVybiBudW1BcmdzID09PSAxID8gZnVuY3Rpb24gKG9iamVjdCwgYXJnKSB7XG4gICAgcmV0dXJuIG9iamVjdFttZXRob2ROYW1lXShhcmcpO1xuICB9IDogZnVuY3Rpb24gKG9iamVjdCwgYXJnMSwgYXJnMikge1xuICAgIHJldHVybiBvYmplY3RbbWV0aG9kTmFtZV0oYXJnMSwgYXJnMik7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20sIG5vLXRocm93LWxpdGVyYWwgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICB0cnkge1xuICAgIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgcmV0dXJuIGZhbHNlOyB9IC8vIHdvcmthcm91bmQgb2Ygb2xkIFdlYktpdCArIGBldmFsYCBidWdcbiAgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIG9iamVjdFtJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogSVRFUkFUSU9OX1NVUFBPUlQgPSB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBleGVjKG9iamVjdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIElURVJBVElPTl9TVVBQT1JUO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoe30udG9TdHJpbmcpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gc3RyaW5nU2xpY2UodG9TdHJpbmcoaXQpLCA4LCAtMSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdyhmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9ICRPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWdcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PT0gJ09iamVjdCcgJiYgaXNDYWxsYWJsZShPLmNhbGxlZSkgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yJyk7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lJyk7XG52YXIgY3JlYXRlSXRlclJlc3VsdE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlci1yZXN1bHQtb2JqZWN0Jyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLmZhc3RLZXk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIFByb3RvdHlwZSk7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAgICAgaW5kZXg6IGNyZWF0ZShudWxsKSxcbiAgICAgICAgZmlyc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkLFxuICAgICAgICBzaXplOiAwXG4gICAgICB9KTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMpIHRoYXQuc2l6ZSA9IDA7XG4gICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0ZXJhYmxlKSkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIFByb3RvdHlwZSA9IENvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIHZhciBkZWZpbmUgPSBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICB2YXIgcHJldmlvdXMsIGluZGV4O1xuICAgICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmxhc3QgPSBlbnRyeSA9IHtcbiAgICAgICAgICBpbmRleDogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cyA9IHN0YXRlLmxhc3QsXG4gICAgICAgICAgbmV4dDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlbW92ZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGlmICghc3RhdGUuZmlyc3QpIHN0YXRlLmZpcnN0ID0gZW50cnk7XG4gICAgICAgIGlmIChwcmV2aW91cykgcHJldmlvdXMubmV4dCA9IGVudHJ5O1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUrKztcbiAgICAgICAgZWxzZSB0aGF0LnNpemUrKztcbiAgICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfTtcblxuICAgIHZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAvLyBmYXN0IGNhc2VcbiAgICAgIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgICAgIHZhciBlbnRyeTtcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gc3RhdGUuaW5kZXhbaW5kZXhdO1xuICAgICAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gICAgICBmb3IgKGVudHJ5ID0gc3RhdGUuZmlyc3Q7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm5leHQpIHtcbiAgICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KSByZXR1cm4gZW50cnk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRlZmluZUJ1aWx0SW5zKFByb3RvdHlwZSwge1xuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuY2xlYXIoKWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmNsZWFyXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuY2xlYXJcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgICB2YXIgZW50cnkgPSBzdGF0ZS5maXJzdDtcbiAgICAgICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGVudHJ5LnByZXZpb3VzKSBlbnRyeS5wcmV2aW91cyA9IGVudHJ5LnByZXZpb3VzLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZpcnN0ID0gc3RhdGUubGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3RhdGUuaW5kZXggPSBjcmVhdGUobnVsbCk7XG4gICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZSA9IDA7XG4gICAgICAgIGVsc2UgdGhhdC5zaXplID0gMDtcbiAgICAgIH0sXG4gICAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS5kZWxldGUoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmRlbGV0ZVxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmRlbGV0ZVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm5leHQ7XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgICBkZWxldGUgc3RhdGUuaW5kZXhbZW50cnkuaW5kZXhdO1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm5leHQgPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnByZXZpb3VzID0gcHJldjtcbiAgICAgICAgICBpZiAoc3RhdGUuZmlyc3QgPT09IGVudHJ5KSBzdGF0ZS5maXJzdCA9IG5leHQ7XG4gICAgICAgICAgaWYgKHN0YXRlLmxhc3QgPT09IGVudHJ5KSBzdGF0ZS5sYXN0ID0gcHJldjtcbiAgICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUtLTtcbiAgICAgICAgICBlbHNlIHRoYXQuc2l6ZS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5mb3JlYWNoXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuZm9yZWFjaFxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7XG4gICAgICAgICAgYm91bmRGdW5jdGlvbihlbnRyeS52YWx1ZSwgZW50cnkua2V5LCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGB7IE1hcCwgU2V0fS5wcm90b3R5cGUuaGFzKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5oYXNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5oYXNcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGVmaW5lQnVpbHRJbnMoUHJvdG90eXBlLCBJU19NQVAgPyB7XG4gICAgICAvLyBgTWFwLnByb3RvdHlwZS5nZXQoa2V5KWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZ2V0XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnZhbHVlO1xuICAgICAgfSxcbiAgICAgIC8vIGBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuc2V0XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyBgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5hZGRcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykuc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH0sXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApIHtcbiAgICB2YXIgSVRFUkFUT1JfTkFNRSA9IENPTlNUUlVDVE9SX05BTUUgKyAnIEl0ZXJhdG9yJztcbiAgICB2YXIgZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuICAgIHZhciBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKElURVJBVE9SX05BTUUpO1xuICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLnsga2V5cywgdmFsdWVzLCBlbnRyaWVzLCBAQGl0ZXJhdG9yIH0oKWAgbWV0aG9kc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5lbnRyaWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmtleXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUudmFsdWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLUBAaXRlcmF0b3JcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuZW50cmllc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5rZXlzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLnZhbHVlc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4gICAgZGVmaW5lSXRlcmF0b3IoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICAgIHR5cGU6IElURVJBVE9SX05BTUUsXG4gICAgICAgIHRhcmdldDogaXRlcmF0ZWQsXG4gICAgICAgIHN0YXRlOiBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZShpdGVyYXRlZCksXG4gICAgICAgIGtpbmQ6IGtpbmQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlKHRoaXMpO1xuICAgICAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kO1xuICAgICAgdmFyIGVudHJ5ID0gc3RhdGUubGFzdDtcbiAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpIGVudHJ5ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCFzdGF0ZS50YXJnZXQgfHwgIShzdGF0ZS5sYXN0ID0gZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm5leHQgOiBzdGF0ZS5zdGF0ZS5maXJzdCkpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdCh1bmRlZmluZWQsIHRydWUpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT09ICdrZXlzJykgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QoZW50cnkua2V5LCBmYWxzZSk7XG4gICAgICBpZiAoa2luZCA9PT0gJ3ZhbHVlcycpIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KGVudHJ5LnZhbHVlLCBmYWxzZSk7XG4gICAgICByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdChbZW50cnkua2V5LCBlbnRyeS52YWx1ZV0sIGZhbHNlKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZVtAQHNwZWNpZXNdYCBhY2Nlc3NvcnNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1tYXAtQEBzcGVjaWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXQtc2V0LUBAc3BlY2llc1xuICAgIHNldFNwZWNpZXMoQ09OU1RSVUNUT1JfTkFNRSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucycpO1xudmFyIGdldFdlYWtEYXRhID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJykuZ2V0V2Vha0RhdGE7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgQXJyYXlJdGVyYXRpb25Nb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yO1xudmFyIGZpbmQgPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kO1xudmFyIGZpbmRJbmRleCA9IEFycmF5SXRlcmF0aW9uTW9kdWxlLmZpbmRJbmRleDtcbnZhciBzcGxpY2UgPSB1bmN1cnJ5VGhpcyhbXS5zcGxpY2UpO1xudmFyIGlkID0gMDtcblxuLy8gZmFsbGJhY2sgZm9yIHVuY2F1Z2h0IGZyb3plbiBrZXlzXG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZnJvemVuIHx8IChzdGF0ZS5mcm96ZW4gPSBuZXcgVW5jYXVnaHRGcm96ZW5TdG9yZSgpKTtcbn07XG5cbnZhciBVbmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVudHJpZXMgPSBbXTtcbn07XG5cbnZhciBmaW5kVW5jYXVnaHRGcm96ZW4gPSBmdW5jdGlvbiAoc3RvcmUsIGtleSkge1xuICByZXR1cm4gZmluZChzdG9yZS5lbnRyaWVzLCBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgfSk7XG59O1xuXG5VbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZSA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSByZXR1cm4gZW50cnlbMV07XG4gIH0sXG4gIGhhczogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSBlbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5lbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXgodGhpcy5lbnRyaWVzLCBmdW5jdGlvbiAoaXQpIHtcbiAgICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICAgIH0pO1xuICAgIGlmICh+aW5kZXgpIHNwbGljZSh0aGlzLmVudHJpZXMsIGluZGV4LCAxKTtcbiAgICByZXR1cm4gISF+aW5kZXg7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBQcm90b3R5cGUpO1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7XG4gICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsXG4gICAgICAgIGlkOiBpZCsrLFxuICAgICAgICBmcm96ZW46IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0ZXJhYmxlKSkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIFByb3RvdHlwZSA9IENvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIHZhciBkZWZpbmUgPSBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoYW5PYmplY3Qoa2V5KSwgdHJ1ZSk7XG4gICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgZWxzZSBkYXRhW3N0YXRlLmlkXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgfTtcblxuICAgIGRlZmluZUJ1aWx0SW5zKFByb3RvdHlwZSwge1xuICAgICAgLy8gYHsgV2Vha01hcCwgV2Vha1NldCB9LnByb3RvdHlwZS5kZWxldGUoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLnByb3RvdHlwZS5kZWxldGVcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha3NldC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpO1xuICAgICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpWydkZWxldGUnXShrZXkpO1xuICAgICAgICByZXR1cm4gZGF0YSAmJiBoYXNPd24oZGF0YSwgc3RhdGUuaWQpICYmIGRlbGV0ZSBkYXRhW3N0YXRlLmlkXTtcbiAgICAgIH0sXG4gICAgICAvLyBgeyBXZWFrTWFwLCBXZWFrU2V0IH0ucHJvdG90eXBlLmhhcyhrZXkpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWttYXAucHJvdG90eXBlLmhhc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrc2V0LnByb3RvdHlwZS5oYXNcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpO1xuICAgICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLmhhcyhrZXkpO1xuICAgICAgICByZXR1cm4gZGF0YSAmJiBoYXNPd24oZGF0YSwgc3RhdGUuaWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGVmaW5lQnVpbHRJbnMoUHJvdG90eXBlLCBJU19NQVAgPyB7XG4gICAgICAvLyBgV2Vha01hcC5wcm90b3R5cGUuZ2V0KGtleSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLnByb3RvdHlwZS5nZXRcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLmdldChrZXkpO1xuICAgICAgICAgIHJldHVybiBkYXRhID8gZGF0YVtzdGF0ZS5pZF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC5wcm90b3R5cGUuc2V0XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIC8vIGBXZWFrU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha3NldC5wcm90b3R5cGUuYWRkXG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIHZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5mb3JFYWNoO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSwgd3JhcHBlciwgY29tbW9uKSB7XG4gIHZhciBJU19NQVAgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ01hcCcpICE9PSAtMTtcbiAgdmFyIElTX1dFQUsgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ1dlYWsnKSAhPT0gLTE7XG4gIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7XG4gIHZhciBOYXRpdmVDb25zdHJ1Y3RvciA9IGdsb2JhbFtDT05TVFJVQ1RPUl9OQU1FXTtcbiAgdmFyIE5hdGl2ZVByb3RvdHlwZSA9IE5hdGl2ZUNvbnN0cnVjdG9yICYmIE5hdGl2ZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgdmFyIGV4cG9ydGVkID0ge307XG4gIHZhciBDb25zdHJ1Y3RvcjtcblxuICBpZiAoIURFU0NSSVBUT1JTIHx8ICFpc0NhbGxhYmxlKE5hdGl2ZUNvbnN0cnVjdG9yKVxuICAgIHx8ICEoSVNfV0VBSyB8fCBOYXRpdmVQcm90b3R5cGUuZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeyBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKS5lbnRyaWVzKCkubmV4dCgpOyB9KSlcbiAgKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDb25zdHJ1Y3RvciA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKTtcbiAgICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLmVuYWJsZSgpO1xuICB9IGVsc2Uge1xuICAgIENvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAodGFyZ2V0LCBpdGVyYWJsZSkge1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZShhbkluc3RhbmNlKHRhcmdldCwgUHJvdG90eXBlKSwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBjb2xsZWN0aW9uOiBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKVxuICAgICAgfSk7XG4gICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0ZXJhYmxlKSkgaXRlcmF0ZShpdGVyYWJsZSwgdGFyZ2V0W0FEREVSXSwgeyB0aGF0OiB0YXJnZXQsIEFTX0VOVFJJRVM6IElTX01BUCB9KTtcbiAgICB9KTtcblxuICAgIHZhciBQcm90b3R5cGUgPSBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICBmb3JFYWNoKFsnYWRkJywgJ2NsZWFyJywgJ2RlbGV0ZScsICdmb3JFYWNoJywgJ2dldCcsICdoYXMnLCAnc2V0JywgJ2tleXMnLCAndmFsdWVzJywgJ2VudHJpZXMnXSwgZnVuY3Rpb24gKEtFWSkge1xuICAgICAgdmFyIElTX0FEREVSID0gS0VZID09PSAnYWRkJyB8fCBLRVkgPT09ICdzZXQnO1xuICAgICAgaWYgKEtFWSBpbiBOYXRpdmVQcm90b3R5cGUgJiYgIShJU19XRUFLICYmIEtFWSA9PT0gJ2NsZWFyJykpIHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KFByb3RvdHlwZSwgS0VZLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHZhciBjb2xsZWN0aW9uID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5jb2xsZWN0aW9uO1xuICAgICAgICAgIGlmICghSVNfQURERVIgJiYgSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkpIHJldHVybiBLRVkgPT09ICdnZXQnID8gdW5kZWZpbmVkIDogZmFsc2U7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGNvbGxlY3Rpb25bS0VZXShhID09PSAwID8gMCA6IGEsIGIpO1xuICAgICAgICAgIHJldHVybiBJU19BRERFUiA/IHRoaXMgOiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgSVNfV0VBSyB8fCBkZWZpbmVQcm9wZXJ0eShQcm90b3R5cGUsICdzaXplJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLmNvbGxlY3Rpb24uc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgZXhwb3J0ZWRbQ09OU1RSVUNUT1JfTkFNRV0gPSBDb25zdHJ1Y3RvcjtcbiAgJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIGV4cG9ydGVkKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIG93bktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb3duLWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UsIGV4Y2VwdGlvbnMpIHtcbiAgdmFyIGtleXMgPSBvd25LZXlzKHNvdXJjZSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKCFoYXNPd24odGFyZ2V0LCBrZXkpICYmICEoZXhjZXB0aW9ucyAmJiBoYXNPd24oZXhjZXB0aW9ucywga2V5KSkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICB9XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHtcbiAgdmFyIHJlZ2V4cCA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgICB9IGNhdGNoIChlcnJvcjIpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiBmYWxzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gYENyZWF0ZUl0ZXJSZXN1bHRPYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVpdGVycmVzdWx0b2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSwgZG9uZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6IGRvbmUgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W2tleV0gPSB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBwYWRTdGFydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcGFkJykuc3RhcnQ7XG5cbnZhciAkUmFuZ2VFcnJvciA9IFJhbmdlRXJyb3I7XG52YXIgJGlzRmluaXRlID0gaXNGaW5pdGU7XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgRGF0ZVByb3RvdHlwZSA9IERhdGUucHJvdG90eXBlO1xudmFyIG5hdGl2ZURhdGVUb0lTT1N0cmluZyA9IERhdGVQcm90b3R5cGUudG9JU09TdHJpbmc7XG52YXIgdGhpc1RpbWVWYWx1ZSA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VGltZSk7XG52YXIgZ2V0VVRDRGF0ZSA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VVRDRGF0ZSk7XG52YXIgZ2V0VVRDRnVsbFllYXIgPSB1bmN1cnJ5VGhpcyhEYXRlUHJvdG90eXBlLmdldFVUQ0Z1bGxZZWFyKTtcbnZhciBnZXRVVENIb3VycyA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VVRDSG91cnMpO1xudmFyIGdldFVUQ01pbGxpc2Vjb25kcyA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VVRDTWlsbGlzZWNvbmRzKTtcbnZhciBnZXRVVENNaW51dGVzID0gdW5jdXJyeVRoaXMoRGF0ZVByb3RvdHlwZS5nZXRVVENNaW51dGVzKTtcbnZhciBnZXRVVENNb250aCA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VVRDTW9udGgpO1xudmFyIGdldFVUQ1NlY29uZHMgPSB1bmN1cnJ5VGhpcyhEYXRlUHJvdG90eXBlLmdldFVUQ1NlY29uZHMpO1xuXG4vLyBgRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1kYXRlLnByb3RvdHlwZS50b2lzb3N0cmluZ1xuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBmYWlscyBoZXJlOlxubW9kdWxlLmV4cG9ydHMgPSAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmF0aXZlRGF0ZVRvSVNPU3RyaW5nLmNhbGwobmV3IERhdGUoLTVlMTMgLSAxKSkgIT09ICcwMzg1LTA3LTI1VDA3OjA2OjM5Ljk5OVonO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgbmF0aXZlRGF0ZVRvSVNPU3RyaW5nLmNhbGwobmV3IERhdGUoTmFOKSk7XG59KSkgPyBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHtcbiAgaWYgKCEkaXNGaW5pdGUodGhpc1RpbWVWYWx1ZSh0aGlzKSkpIHRocm93IG5ldyAkUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XG4gIHZhciBkYXRlID0gdGhpcztcbiAgdmFyIHllYXIgPSBnZXRVVENGdWxsWWVhcihkYXRlKTtcbiAgdmFyIG1pbGxpc2Vjb25kcyA9IGdldFVUQ01pbGxpc2Vjb25kcyhkYXRlKTtcbiAgdmFyIHNpZ24gPSB5ZWFyIDwgMCA/ICctJyA6IHllYXIgPiA5OTk5ID8gJysnIDogJyc7XG4gIHJldHVybiBzaWduICsgcGFkU3RhcnQoYWJzKHllYXIpLCBzaWduID8gNiA6IDQsIDApICtcbiAgICAnLScgKyBwYWRTdGFydChnZXRVVENNb250aChkYXRlKSArIDEsIDIsIDApICtcbiAgICAnLScgKyBwYWRTdGFydChnZXRVVENEYXRlKGRhdGUpLCAyLCAwKSArXG4gICAgJ1QnICsgcGFkU3RhcnQoZ2V0VVRDSG91cnMoZGF0ZSksIDIsIDApICtcbiAgICAnOicgKyBwYWRTdGFydChnZXRVVENNaW51dGVzKGRhdGUpLCAyLCAwKSArXG4gICAgJzonICsgcGFkU3RhcnQoZ2V0VVRDU2Vjb25kcyhkYXRlKSwgMiwgMCkgK1xuICAgICcuJyArIHBhZFN0YXJ0KG1pbGxpc2Vjb25kcywgMywgMCkgK1xuICAgICdaJztcbn0gOiBuYXRpdmVEYXRlVG9JU09TdHJpbmc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5LmYodGFyZ2V0LCBuYW1lLCBkZXNjcmlwdG9yKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtZXJhYmxlKSB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgdmFsdWUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy51bnNhZmUgJiYgdGFyZ2V0W2tleV0pIHRhcmdldFtrZXldID0gc3JjW2tleV07XG4gICAgZWxzZSBkZWZpbmVCdWlsdEluKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIH0gcmV0dXJuIHRhcmdldDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICB0cnkge1xuICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbCwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBnbG9iYWxba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgUCkge1xuICBpZiAoIWRlbGV0ZSBPW1BdKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignQ2Fubm90IGRlbGV0ZSBwcm9wZXJ0eSAnICsgdHJ5VG9TdHJpbmcoUCkgKyAnIG9mICcgKyB0cnlUb1N0cmluZyhPKSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIERldGVjdCBJRTgncyBpbmNvbXBsZXRlIGRlZmluZVByb3BlcnR5IGltcGxlbWVudGF0aW9uXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSlbMV0gIT09IDc7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID4gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgJFR5cGVFcnJvcignTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBpdGVyYWJsZSBET00gY29sbGVjdGlvbnNcbi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxudmFyIGZpcmVmb3ggPSB1c2VyQWdlbnQubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvaSk7XG5cbm1vZHVsZS5leHBvcnRzID0gISFmaXJlZm94ICYmICtmaXJlZm94WzFdO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIElTX0RFTk8gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8nKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIUlTX0RFTk8gJiYgIUlTX05PREVcbiAgJiYgdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0J1xuICAmJiB0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCc7XG4iLCIndXNlIHN0cmljdCc7XG4vKiBnbG9iYWwgQnVuIC0tIEJ1biBjYXNlICovXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBCdW4gPT0gJ2Z1bmN0aW9uJyAmJiBCdW4gJiYgdHlwZW9mIEJ1bi52ZXJzaW9uID09ICdzdHJpbmcnO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZ2xvYmFsIERlbm8gLS0gRGVubyBjYXNlICovXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBEZW5vID09ICdvYmplY3QnICYmIERlbm8gJiYgdHlwZW9mIERlbm8udmVyc2lvbiA9PSAnb2JqZWN0JztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBVQSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC9NU0lFfFRyaWRlbnQvLnRlc3QoVUEpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC9pcGFkfGlwaG9uZXxpcG9kL2kudGVzdCh1c2VyQWdlbnQpICYmIHR5cGVvZiBQZWJibGUgIT0gJ3VuZGVmaW5lZCc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWRvcy9uby12dWxuZXJhYmxlIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gLyg/OmlwYWR8aXBob25lfGlwb2QpLiphcHBsZXdlYmtpdC9pLnRlc3QodXNlckFnZW50KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzb2YoZ2xvYmFsLnByb2Nlc3MpID09PSAncHJvY2Vzcyc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gL3dlYjBzKD8hLipjaHJvbWUpL2kudGVzdCh1c2VyQWdlbnQpO1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgbmF2aWdhdG9yICE9ICd1bmRlZmluZWQnICYmIFN0cmluZyhuYXZpZ2F0b3IudXNlckFnZW50KSB8fCAnJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgRGVubyA9IGdsb2JhbC5EZW5vO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zIHx8IERlbm8gJiYgRGVuby52ZXJzaW9uO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjg7XG52YXIgbWF0Y2gsIHZlcnNpb247XG5cbmlmICh2OCkge1xuICBtYXRjaCA9IHY4LnNwbGl0KCcuJyk7XG4gIC8vIGluIG9sZCBDaHJvbWUsIHZlcnNpb25zIG9mIFY4IGlzbid0IFY4ID0gQ2hyb21lIC8gMTBcbiAgLy8gYnV0IHRoZWlyIGNvcnJlY3QgdmVyc2lvbnMgYXJlIG5vdCBpbnRlcmVzdGluZyBmb3IgdXNcbiAgdmVyc2lvbiA9IG1hdGNoWzBdID4gMCAmJiBtYXRjaFswXSA8IDQgPyAxIDogKyhtYXRjaFswXSArIG1hdGNoWzFdKTtcbn1cblxuLy8gQnJvd3NlckZTIE5vZGVKUyBgcHJvY2Vzc2AgcG9seWZpbGwgaW5jb3JyZWN0bHkgc2V0IGAudjhgIHRvIGAwLjBgXG4vLyBzbyBjaGVjayBgdXNlckFnZW50YCBldmVuIGlmIGAudjhgIGV4aXN0cywgYnV0IDBcbmlmICghdmVyc2lvbiAmJiB1c2VyQWdlbnQpIHtcbiAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ2VcXC8oXFxkKykvKTtcbiAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSA+PSA3NCkge1xuICAgIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKTtcbiAgICBpZiAobWF0Y2gpIHZlcnNpb24gPSArbWF0Y2hbMV07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2ZXJzaW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG52YXIgd2Via2l0ID0gdXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFxcLyhcXGQrKVxcLi8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICEhd2Via2l0ICYmICt3ZWJraXRbMV07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gW1xuICAnY29uc3RydWN0b3InLFxuICAnaGFzT3duUHJvcGVydHknLFxuICAnaXNQcm90b3R5cGVPZicsXG4gICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJ1xuXTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyICRFcnJvciA9IEVycm9yO1xudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcblxudmFyIFRFU1QgPSAoZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gU3RyaW5nKG5ldyAkRXJyb3IoYXJnKS5zdGFjayk7IH0pKCd6eGNhc2QnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWRvcy9uby12dWxuZXJhYmxlIC0tIHNhZmVcbnZhciBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlkgPSAvXFxuXFxzKmF0IFteOl0qOlteXFxuXSovO1xudmFyIElTX1Y4X09SX0NIQUtSQV9TVEFDSyA9IFY4X09SX0NIQUtSQV9TVEFDS19FTlRSWS50ZXN0KFRFU1QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdGFjaywgZHJvcEVudHJpZXMpIHtcbiAgaWYgKElTX1Y4X09SX0NIQUtSQV9TVEFDSyAmJiB0eXBlb2Ygc3RhY2sgPT0gJ3N0cmluZycgJiYgISRFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSkge1xuICAgIHdoaWxlIChkcm9wRW50cmllcy0tKSBzdGFjayA9IHJlcGxhY2Uoc3RhY2ssIFY4X09SX0NIQUtSQV9TVEFDS19FTlRSWSwgJycpO1xuICB9IHJldHVybiBzdGFjaztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGNsZWFyRXJyb3JTdGFjayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhcicpO1xudmFyIEVSUk9SX1NUQUNLX0lOU1RBTExBQkxFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGxhYmxlJyk7XG5cbi8vIG5vbi1zdGFuZGFyZCBWOFxudmFyIGNhcHR1cmVTdGFja1RyYWNlID0gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGVycm9yLCBDLCBzdGFjaywgZHJvcEVudHJpZXMpIHtcbiAgaWYgKEVSUk9SX1NUQUNLX0lOU1RBTExBQkxFKSB7XG4gICAgaWYgKGNhcHR1cmVTdGFja1RyYWNlKSBjYXB0dXJlU3RhY2tUcmFjZShlcnJvciwgQyk7XG4gICAgZWxzZSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZXJyb3IsICdzdGFjaycsIGNsZWFyRXJyb3JTdGFjayhzdGFjaywgZHJvcEVudHJpZXMpKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcignYScpO1xuICBpZiAoISgnc3RhY2snIGluIGVycm9yKSkgcmV0dXJuIHRydWU7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICdzdGFjaycsIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCA3KSk7XG4gIHJldHVybiBlcnJvci5zdGFjayAhPT0gNztcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG4vLyBhZGQgZGVidWdnaW5nIGluZm9cbnJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxudmFyIHdyYXBDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChOYXRpdmVDb25zdHJ1Y3Rvcikge1xuICB2YXIgV3JhcHBlciA9IGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBXcmFwcGVyKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCk7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcihhKTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKGEsIGIpO1xuICAgICAgfSByZXR1cm4gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKGEsIGIsIGMpO1xuICAgIH0gcmV0dXJuIGFwcGx5KE5hdGl2ZUNvbnN0cnVjdG9yLCB0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuICBXcmFwcGVyLnByb3RvdHlwZSA9IE5hdGl2ZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgcmV0dXJuIFdyYXBwZXI7XG59O1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgICAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLmRvbnRDYWxsR2V0U2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuICBvcHRpb25zLm5hbWUgICAgICAgICAgIC0gdGhlIC5uYW1lIG9mIHRoZSBmdW5jdGlvbiBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0aGUga2V5XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgUFJPVE8gPSBvcHRpb25zLnByb3RvO1xuXG4gIHZhciBuYXRpdmVTb3VyY2UgPSBHTE9CQUwgPyBnbG9iYWwgOiBTVEFUSUMgPyBnbG9iYWxbVEFSR0VUXSA6IGdsb2JhbFtUQVJHRVRdICYmIGdsb2JhbFtUQVJHRVRdLnByb3RvdHlwZTtcblxuICB2YXIgdGFyZ2V0ID0gR0xPQkFMID8gcGF0aCA6IHBhdGhbVEFSR0VUXSB8fCBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkocGF0aCwgVEFSR0VULCB7fSlbVEFSR0VUXTtcbiAgdmFyIHRhcmdldFByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7XG5cbiAgdmFyIEZPUkNFRCwgVVNFX05BVElWRSwgVklSVFVBTF9QUk9UT1RZUEU7XG4gIHZhciBrZXksIHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSwgbmF0aXZlUHJvcGVydHksIHJlc3VsdFByb3BlcnR5LCBkZXNjcmlwdG9yO1xuXG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgVVNFX05BVElWRSA9ICFGT1JDRUQgJiYgbmF0aXZlU291cmNlICYmIGhhc093bihuYXRpdmVTb3VyY2UsIGtleSk7XG5cbiAgICB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuXG4gICAgaWYgKFVTRV9OQVRJVkUpIGlmIChvcHRpb25zLmRvbnRDYWxsR2V0U2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5hdGl2ZVNvdXJjZSwga2V5KTtcbiAgICAgIG5hdGl2ZVByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSBuYXRpdmVQcm9wZXJ0eSA9IG5hdGl2ZVNvdXJjZVtrZXldO1xuXG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBpbXBsZW1lbnRhdGlvblxuICAgIHNvdXJjZVByb3BlcnR5ID0gKFVTRV9OQVRJVkUgJiYgbmF0aXZlUHJvcGVydHkpID8gbmF0aXZlUHJvcGVydHkgOiBzb3VyY2Vba2V5XTtcblxuICAgIGlmICghRk9SQ0VEICYmICFQUk9UTyAmJiB0eXBlb2YgdGFyZ2V0UHJvcGVydHkgPT0gdHlwZW9mIHNvdXJjZVByb3BlcnR5KSBjb250aW51ZTtcblxuICAgIC8vIGJpbmQgbWV0aG9kcyB0byBnbG9iYWwgZm9yIGNhbGxpbmcgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGlmIChvcHRpb25zLmJpbmQgJiYgVVNFX05BVElWRSkgcmVzdWx0UHJvcGVydHkgPSBiaW5kKHNvdXJjZVByb3BlcnR5LCBnbG9iYWwpO1xuICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2VzIGluIHRoaXMgdmVyc2lvblxuICAgIGVsc2UgaWYgKG9wdGlvbnMud3JhcCAmJiBVU0VfTkFUSVZFKSByZXN1bHRQcm9wZXJ0eSA9IHdyYXBDb25zdHJ1Y3Rvcihzb3VyY2VQcm9wZXJ0eSk7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgZWxzZSBpZiAoUFJPVE8gJiYgaXNDYWxsYWJsZShzb3VyY2VQcm9wZXJ0eSkpIHJlc3VsdFByb3BlcnR5ID0gdW5jdXJyeVRoaXMoc291cmNlUHJvcGVydHkpO1xuICAgIC8vIGRlZmF1bHQgY2FzZVxuICAgIGVsc2UgcmVzdWx0UHJvcGVydHkgPSBzb3VyY2VQcm9wZXJ0eTtcblxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8IChzb3VyY2VQcm9wZXJ0eSAmJiBzb3VyY2VQcm9wZXJ0eS5zaGFtKSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShyZXN1bHRQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG5cbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGFyZ2V0LCBrZXksIHJlc3VsdFByb3BlcnR5KTtcblxuICAgIGlmIChQUk9UTykge1xuICAgICAgVklSVFVBTF9QUk9UT1RZUEUgPSBUQVJHRVQgKyAnUHJvdG90eXBlJztcbiAgICAgIGlmICghaGFzT3duKHBhdGgsIFZJUlRVQUxfUFJPVE9UWVBFKSkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkocGF0aCwgVklSVFVBTF9QUk9UT1RZUEUsIHt9KTtcbiAgICAgIH1cbiAgICAgIC8vIGV4cG9ydCB2aXJ0dWFsIHByb3RvdHlwZSBtZXRob2RzXG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkocGF0aFtWSVJUVUFMX1BST1RPVFlQRV0sIGtleSwgc291cmNlUHJvcGVydHkpO1xuICAgICAgLy8gZXhwb3J0IHJlYWwgcHJvdG90eXBlIG1ldGhvZHNcbiAgICAgIGlmIChvcHRpb25zLnJlYWwgJiYgdGFyZ2V0UHJvdG90eXBlICYmIChGT1JDRUQgfHwgIXRhcmdldFByb3RvdHlwZVtrZXldKSkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGFyZ2V0UHJvdG90eXBlLCBrZXksIHNvdXJjZVByb3BlcnR5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUsIGVzL25vLW9iamVjdC1wcmV2ZW50ZXh0ZW5zaW9ucyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBhcHBseSA9IEZ1bmN0aW9uUHJvdG90eXBlLmFwcGx5O1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tcmVmbGVjdCAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBSZWZsZWN0ID09ICdvYmplY3QnICYmIFJlZmxlY3QuYXBwbHkgfHwgKE5BVElWRV9CSU5EID8gY2FsbC5iaW5kKGFwcGx5KSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhbGwuYXBwbHkoYXBwbHksIGFyZ3VtZW50cyk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBOQVRJVkVfQklORCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZScpO1xuXG52YXIgYmluZCA9IHVuY3VycnlUaGlzKHVuY3VycnlUaGlzLmJpbmQpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0KSB7XG4gIGFDYWxsYWJsZShmbik7XG4gIHJldHVybiB0aGF0ID09PSB1bmRlZmluZWQgPyBmbiA6IE5BVElWRV9CSU5EID8gYmluZChmbiwgdGhhdCkgOiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBzYWZlXG4gIHZhciB0ZXN0ID0gKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkuYmluZCgpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuIHR5cGVvZiB0ZXN0ICE9ICdmdW5jdGlvbicgfHwgdGVzdC5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJyk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcbnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpO1xudmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTtcbnZhciBmYWN0b3JpZXMgPSB7fTtcblxudmFyIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIChDLCBhcmdzTGVuZ3RoLCBhcmdzKSB7XG4gIGlmICghaGFzT3duKGZhY3RvcmllcywgYXJnc0xlbmd0aCkpIHtcbiAgICB2YXIgbGlzdCA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKDsgaSA8IGFyZ3NMZW5ndGg7IGkrKykgbGlzdFtpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIGZhY3Rvcmllc1thcmdzTGVuZ3RoXSA9ICRGdW5jdGlvbignQyxhJywgJ3JldHVybiBuZXcgQygnICsgam9pbihsaXN0LCAnLCcpICsgJyknKTtcbiAgfSByZXR1cm4gZmFjdG9yaWVzW2FyZ3NMZW5ndGhdKEMsIGFyZ3MpO1xufTtcblxuLy8gYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBkZXRlY3Rpb25cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX0JJTkQgPyAkRnVuY3Rpb24uYmluZCA6IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgdmFyIEYgPSBhQ2FsbGFibGUodGhpcyk7XG4gIHZhciBQcm90b3R5cGUgPSBGLnByb3RvdHlwZTtcbiAgdmFyIHBhcnRBcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMsIDEpO1xuICB2YXIgYm91bmRGdW5jdGlvbiA9IGZ1bmN0aW9uIGJvdW5kKC8qIGFyZ3MuLi4gKi8pIHtcbiAgICB2YXIgYXJncyA9IGNvbmNhdChwYXJ0QXJncywgYXJyYXlTbGljZShhcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kRnVuY3Rpb24gPyBjb25zdHJ1Y3QoRiwgYXJncy5sZW5ndGgsIGFyZ3MpIDogRi5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfTtcbiAgaWYgKGlzT2JqZWN0KFByb3RvdHlwZSkpIGJvdW5kRnVuY3Rpb24ucHJvdG90eXBlID0gUHJvdG90eXBlO1xuICByZXR1cm4gYm91bmRGdW5jdGlvbjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX0JJTkQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUnKTtcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfQklORCA/IGNhbGwuYmluZChjYWxsKSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhbGwuYXBwbHkoY2FsbCwgYXJndW1lbnRzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0RGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBFWElTVFMgPSBoYXNPd24oRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJyk7XG4vLyBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZnJvbSBtaW5pZmllZCAvIG1hbmdsZWQgLyBkcm9wcGVkIGZ1bmN0aW9uIG5hbWVzXG52YXIgUFJPUEVSID0gRVhJU1RTICYmIChmdW5jdGlvbiBzb21ldGhpbmcoKSB7IC8qIGVtcHR5ICovIH0pLm5hbWUgPT09ICdzb21ldGhpbmcnO1xudmFyIENPTkZJR1VSQUJMRSA9IEVYSVNUUyAmJiAoIURFU0NSSVBUT1JTIHx8IChERVNDUklQVE9SUyAmJiBnZXREZXNjcmlwdG9yKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpLmNvbmZpZ3VyYWJsZSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRVhJU1RTOiBFWElTVFMsXG4gIFBST1BFUjogUFJPUEVSLFxuICBDT05GSUdVUkFCTEU6IENPTkZJR1VSQUJMRVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgbWV0aG9kKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxuICAgIHJldHVybiB1bmN1cnJ5VGhpcyhhQ2FsbGFibGUoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIGtleSlbbWV0aG9kXSkpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNsYXNzb2ZSYXcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4pIHtcbiAgLy8gTmFzaG9ybiBidWc6XG4gIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzExMjhcbiAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTEzMFxuICBpZiAoY2xhc3NvZlJhdyhmbikgPT09ICdGdW5jdGlvbicpIHJldHVybiB1bmN1cnJ5VGhpcyhmbik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcbnZhciB1bmN1cnJ5VGhpc1dpdGhCaW5kID0gTkFUSVZFX0JJTkQgJiYgRnVuY3Rpb25Qcm90b3R5cGUuYmluZC5iaW5kKGNhbGwsIGNhbGwpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9CSU5EID8gdW5jdXJyeVRoaXNXaXRoQmluZCA6IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYWxsLmFwcGx5KGZuLCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SLCBNRVRIT0QpIHtcbiAgdmFyIE5hbWVzcGFjZSA9IHBhdGhbQ09OU1RSVUNUT1IgKyAnUHJvdG90eXBlJ107XG4gIHZhciBwdXJlTWV0aG9kID0gTmFtZXNwYWNlICYmIE5hbWVzcGFjZVtNRVRIT0RdO1xuICBpZiAocHVyZU1ldGhvZCkgcmV0dXJuIHB1cmVNZXRob2Q7XG4gIHZhciBOYXRpdmVDb25zdHJ1Y3RvciA9IGdsb2JhbFtDT05TVFJVQ1RPUl07XG4gIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHJldHVybiBOYXRpdmVQcm90b3R5cGUgJiYgTmF0aXZlUHJvdG90eXBlW01FVEhPRF07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFyaWFibGUpIHtcbiAgcmV0dXJuIGlzQ2FsbGFibGUodmFyaWFibGUpID8gdmFyaWFibGUgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24ocGF0aFtuYW1lc3BhY2VdKSB8fCBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pXG4gICAgOiBwYXRoW25hbWVzcGFjZV0gJiYgcGF0aFtuYW1lc3BhY2VdW21ldGhvZF0gfHwgZ2xvYmFsW25hbWVzcGFjZV0gJiYgZ2xvYmFsW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBgR2V0SXRlcmF0b3JEaXJlY3Qob2JqKWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycy8jc2VjLWdldGl0ZXJhdG9yZGlyZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHtcbiAgICBpdGVyYXRvcjogb2JqLFxuICAgIG5leHQ6IG9iai5uZXh0LFxuICAgIGRvbmU6IGZhbHNlXG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpdCkpIHJldHVybiBnZXRNZXRob2QoaXQsIElURVJBVE9SKVxuICAgIHx8IGdldE1ldGhvZChpdCwgJ0BAaXRlcmF0b3InKVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50LCB1c2luZ0l0ZXJhdG9yKSB7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZ2V0SXRlcmF0b3JNZXRob2QoYXJndW1lbnQpIDogdXNpbmdJdGVyYXRvcjtcbiAgaWYgKGFDYWxsYWJsZShpdGVyYXRvck1ldGhvZCkpIHJldHVybiBhbk9iamVjdChjYWxsKGl0ZXJhdG9yTWV0aG9kLCBhcmd1bWVudCkpO1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVwbGFjZXIpIHtcbiAgaWYgKGlzQ2FsbGFibGUocmVwbGFjZXIpKSByZXR1cm4gcmVwbGFjZXI7XG4gIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJldHVybjtcbiAgdmFyIHJhd0xlbmd0aCA9IHJlcGxhY2VyLmxlbmd0aDtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXdMZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGVtZW50ID0gcmVwbGFjZXJbaV07XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnKSBwdXNoKGtleXMsIGVsZW1lbnQpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09ICdudW1iZXInIHx8IGNsYXNzb2YoZWxlbWVudCkgPT09ICdOdW1iZXInIHx8IGNsYXNzb2YoZWxlbWVudCkgPT09ICdTdHJpbmcnKSBwdXNoKGtleXMsIHRvU3RyaW5nKGVsZW1lbnQpKTtcbiAgfVxuICB2YXIga2V5c0xlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgcm9vdCA9IHRydWU7XG4gIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIGlmIChyb290KSB7XG4gICAgICByb290ID0gZmFsc2U7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KHRoaXMpKSByZXR1cm4gdmFsdWU7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzTGVuZ3RoOyBqKyspIGlmIChrZXlzW2pdID09PSBrZXkpIHJldHVybiB2YWx1ZTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xuXG4vLyBgR2V0TWV0aG9kYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChWLCBQKSB7XG4gIHZhciBmdW5jID0gVltQXTtcbiAgcmV0dXJuIGlzTnVsbE9yVW5kZWZpbmVkKGZ1bmMpID8gdW5kZWZpbmVkIDogYUNhbGxhYmxlKGZ1bmMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xudmFyIGdldEl0ZXJhdG9yRGlyZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1kaXJlY3QnKTtcblxudmFyIElOVkFMSURfU0laRSA9ICdJbnZhbGlkIHNpemUnO1xudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xudmFyIG1heCA9IE1hdGgubWF4O1xuXG52YXIgU2V0UmVjb3JkID0gZnVuY3Rpb24gKHNldCwgaW50U2l6ZSkge1xuICB0aGlzLnNldCA9IHNldDtcbiAgdGhpcy5zaXplID0gbWF4KGludFNpemUsIDApO1xuICB0aGlzLmhhcyA9IGFDYWxsYWJsZShzZXQuaGFzKTtcbiAgdGhpcy5rZXlzID0gYUNhbGxhYmxlKHNldC5rZXlzKTtcbn07XG5cblNldFJlY29yZC5wcm90b3R5cGUgPSB7XG4gIGdldEl0ZXJhdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEl0ZXJhdG9yRGlyZWN0KGFuT2JqZWN0KGNhbGwodGhpcy5rZXlzLCB0aGlzLnNldCkpKTtcbiAgfSxcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBjYWxsKHRoaXMuaGFzLCB0aGlzLnNldCwgaXQpO1xuICB9XG59O1xuXG4vLyBgR2V0U2V0UmVjb3JkYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1zZXQtbWV0aG9kcy8jc2VjLWdldHNldHJlY29yZFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIGFuT2JqZWN0KG9iaik7XG4gIHZhciBudW1TaXplID0gK29iai5zaXplO1xuICAvLyBOT1RFOiBJZiBzaXplIGlzIHVuZGVmaW5lZCwgdGhlbiBudW1TaXplIHdpbGwgYmUgTmFOXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gIGlmIChudW1TaXplICE9PSBudW1TaXplKSB0aHJvdyBuZXcgJFR5cGVFcnJvcihJTlZBTElEX1NJWkUpO1xuICB2YXIgaW50U2l6ZSA9IHRvSW50ZWdlck9ySW5maW5pdHkobnVtU2l6ZSk7XG4gIGlmIChpbnRTaXplIDwgMCkgdGhyb3cgbmV3ICRSYW5nZUVycm9yKElOVkFMSURfU0laRSk7XG4gIHJldHVybiBuZXcgU2V0UmVjb3JkKG9iaiwgaW50U2l6ZSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNoZWNrID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAmJiBpdC5NYXRoID09PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWdsb2JhbC10aGlzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIGdsb2JhbFRoaXMgPT0gJ29iamVjdCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gc2FmZVxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHxcbiAgY2hlY2sodHlwZW9mIHRoaXMgPT0gJ29iamVjdCcgJiYgdGhpcykgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIGZhbGxiYWNrXG4gIChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHt9Lmhhc093blByb3BlcnR5KTtcblxuLy8gYEhhc093blByb3BlcnR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaGFzb3ducHJvcGVydHlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaGFzb3duIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0Lmhhc093biB8fCBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkodG9PYmplY3QoaXQpLCBrZXkpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0ge307XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgLS0gc2FmZVxuICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rcyB0byBJRTggZm9yIGl0cyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPT0gNztcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3Ncbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgLS0gc2FmZVxuICByZXR1cm4gISRPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mKGl0KSA9PT0gJ1N0cmluZycgPyBzcGxpdChpdCwgJycpIDogJE9iamVjdChpdCk7XG59IDogJE9iamVjdDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbnZhciBmdW5jdGlvblRvU3RyaW5nID0gdW5jdXJyeVRoaXMoRnVuY3Rpb24udG9TdHJpbmcpO1xuXG4vLyB0aGlzIGhlbHBlciBicm9rZW4gaW4gYGNvcmUtanNAMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyXG5pZiAoIWlzQ2FsbGFibGUoc3RvcmUuaW5zcGVjdFNvdXJjZSkpIHtcbiAgc3RvcmUuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBmdW5jdGlvblRvU3RyaW5nKGl0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcblxuLy8gYEluc3RhbGxFcnJvckNhdXNlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1lcnJvci1jYXVzZS8jc2VjLWVycm9yb2JqZWN0cy1pbnN0YWxsLWVycm9yLWNhdXNlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBvcHRpb25zKSB7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSAmJiAnY2F1c2UnIGluIG9wdGlvbnMpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywgJ2NhdXNlJywgb3B0aW9ucy5jYXVzZSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsJyk7XG52YXIgaXNFeHRlbnNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1leHRlbnNpYmxlJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG5cbnZhciBSRVFVSVJFRCA9IGZhbHNlO1xudmFyIE1FVEFEQVRBID0gdWlkKCdtZXRhJyk7XG52YXIgaWQgPSAwO1xuXG52YXIgc2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgZGVmaW5lUHJvcGVydHkoaXQsIE1FVEFEQVRBLCB7IHZhbHVlOiB7XG4gICAgb2JqZWN0SUQ6ICdPJyArIGlkKyssIC8vIG9iamVjdCBJRFxuICAgIHdlYWtEYXRhOiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IH0pO1xufTtcblxudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gYSBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghaGFzT3duKGl0LCBNRVRBREFUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YWRhdGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFEQVRBXS5vYmplY3RJRDtcbn07XG5cbnZhciBnZXRXZWFrRGF0YSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzT3duKGl0LCBNRVRBREFUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YWRhdGEoaXQpO1xuICAvLyByZXR1cm4gdGhlIHN0b3JlIG9mIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFEQVRBXS53ZWFrRGF0YTtcbn07XG5cbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWklORyAmJiBSRVFVSVJFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXNPd24oaXQsIE1FVEFEQVRBKSkgc2V0TWV0YWRhdGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG52YXIgZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICBtZXRhLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbiAgUkVRVUlSRUQgPSB0cnVlO1xuICB2YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZjtcbiAgdmFyIHNwbGljZSA9IHVuY3VycnlUaGlzKFtdLnNwbGljZSk7XG4gIHZhciB0ZXN0ID0ge307XG4gIHRlc3RbTUVUQURBVEFdID0gMTtcblxuICAvLyBwcmV2ZW50IGV4cG9zaW5nIG9mIG1ldGFkYXRhIGtleVxuICBpZiAoZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0KS5sZW5ndGgpIHtcbiAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICAgIHZhciByZXN1bHQgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSByZXN1bHQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHJlc3VsdFtpXSA9PT0gTUVUQURBVEEpIHtcbiAgICAgICAgICBzcGxpY2UocmVzdWx0LCBpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAkKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHtcbiAgICAgIGdldE93blByb3BlcnR5TmFtZXM6IGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbE1vZHVsZS5mXG4gICAgfSk7XG4gIH1cbn07XG5cbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIGVuYWJsZTogZW5hYmxlLFxuICBmYXN0S2V5OiBmYXN0S2V5LFxuICBnZXRXZWFrRGF0YTogZ2V0V2Vha0RhdGEsXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcblxuaGlkZGVuS2V5c1tNRVRBREFUQV0gPSB0cnVlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24nKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQgPSAnT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTtcbiAgICB9IHJldHVybiBzdGF0ZTtcbiAgfTtcbn07XG5cbmlmIChOQVRJVkVfV0VBS19NQVAgfHwgc2hhcmVkLnN0YXRlKSB7XG4gIHZhciBzdG9yZSA9IHNoYXJlZC5zdGF0ZSB8fCAoc2hhcmVkLnN0YXRlID0gbmV3IFdlYWtNYXAoKSk7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtYXNzaWduIC0tIHByb3RvdHlwZSBtZXRob2RzIHByb3RlY3Rpb24gKi9cbiAgc3RvcmUuZ2V0ID0gc3RvcmUuZ2V0O1xuICBzdG9yZS5oYXMgPSBzdG9yZS5oYXM7XG4gIHN0b3JlLnNldCA9IHN0b3JlLnNldDtcbiAgLyogZXNsaW50LWVuYWJsZSBuby1zZWxmLWFzc2lnbiAtLSBwcm90b3R5cGUgbWV0aG9kcyBwcm90ZWN0aW9uICovXG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAoc3RvcmUuaGFzKGl0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgc3RvcmUuc2V0KGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gc3RvcmUuZ2V0KGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHN0b3JlLmhhcyhpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChoYXNPd24oaXQsIFNUQVRFKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZ3VtZW50KSB7XG4gIHJldHVybiBjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ0FycmF5Jztcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90XG52YXIgZG9jdW1lbnRBbGwgPSB0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCcgJiYgZG9jdW1lbnQuYWxsO1xuXG4vLyBgSXNDYWxsYWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXR5cGVvZi11bmRlZmluZWQgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIGRvY3VtZW50QWxsID09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50QWxsICE9PSB1bmRlZmluZWQgPyBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nIHx8IGFyZ3VtZW50ID09PSBkb2N1bWVudEFsbDtcbn0gOiBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgY29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTtcbnZhciBjb25zdHJ1Y3RvclJlZ0V4cCA9IC9eXFxzKig/OmNsYXNzfGZ1bmN0aW9uKVxcYi87XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGNvbnN0cnVjdG9yUmVnRXhwLmV4ZWMpO1xudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSAhY29uc3RydWN0b3JSZWdFeHAudGVzdChub29wKTtcblxudmFyIGlzQ29uc3RydWN0b3JNb2Rlcm4gPSBmdW5jdGlvbiBpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG4gIGlmICghaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdHJ1Y3Qobm9vcCwgW10sIGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBpc0NvbnN0cnVjdG9yTGVnYWN5ID0gZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHN3aXRjaCAoY2xhc3NvZihhcmd1bWVudCkpIHtcbiAgICBjYXNlICdBc3luY0Z1bmN0aW9uJzpcbiAgICBjYXNlICdHZW5lcmF0b3JGdW5jdGlvbic6XG4gICAgY2FzZSAnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbic6IHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIC8vIHdlIGNhbid0IGNoZWNrIC5wcm90b3R5cGUgc2luY2UgY29uc3RydWN0b3JzIHByb2R1Y2VkIGJ5IC5iaW5kIGhhdmVuJ3QgaXRcbiAgICAvLyBgRnVuY3Rpb24jdG9TdHJpbmdgIHRocm93cyBvbiBzb21lIGJ1aWx0LWl0IGZ1bmN0aW9uIGluIHNvbWUgbGVnYWN5IGVuZ2luZXNcbiAgICAvLyAoZm9yIGV4YW1wbGUsIGBET01RdWFkYCBhbmQgc2ltaWxhciBpbiBGRjQxLSlcbiAgICByZXR1cm4gSU5DT1JSRUNUX1RPX1NUUklORyB8fCAhIWV4ZWMoY29uc3RydWN0b3JSZWdFeHAsIGluc3BlY3RTb3VyY2UoYXJndW1lbnQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuaXNDb25zdHJ1Y3RvckxlZ2FjeS5zaGFtID0gdHJ1ZTtcblxuLy8gYElzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9ICFjb25zdHJ1Y3QgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgY2FsbGVkO1xuICByZXR1cm4gaXNDb25zdHJ1Y3Rvck1vZGVybihpc0NvbnN0cnVjdG9yTW9kZXJuLmNhbGwpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oT2JqZWN0KVxuICAgIHx8ICFpc0NvbnN0cnVjdG9yTW9kZXJuKGZ1bmN0aW9uICgpIHsgY2FsbGVkID0gdHJ1ZTsgfSlcbiAgICB8fCBjYWxsZWQ7XG59KSA/IGlzQ29uc3RydWN0b3JMZWdhY3kgOiBpc0NvbnN0cnVjdG9yTW9kZXJuO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09PSBQT0xZRklMTCA/IHRydWVcbiAgICA6IHZhbHVlID09PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogaXNDYWxsYWJsZShkZXRlY3Rpb24pID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBJc0ludGVncmFsTnVtYmVyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNpbnRlZ3JhbG51bWJlclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1pc2ludGVnZXIgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyB3ZSBjYW4ndCB1c2UganVzdCBgaXQgPT0gbnVsbGAgc2luY2Ugb2YgYGRvY3VtZW50LmFsbGAgc3BlY2lhbCBjYXNlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90LWFlY1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSBudWxsIHx8IGl0ID09PSB1bmRlZmluZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogaXNDYWxsYWJsZShpdCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNPYmplY3QoYXJndW1lbnQpIHx8IGFyZ3VtZW50ID09PSBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gdHJ1ZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxuLy8gYElzUmVnRXhwYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNyZWdleHBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNsYXNzb2YoaXQpID09PSAnUmVnRXhwJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVTRV9TWU1CT0xfQVNfVUlEID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHZhciAkU3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJyk7XG4gIHJldHVybiBpc0NhbGxhYmxlKCRTeW1ib2wpICYmIGlzUHJvdG90eXBlT2YoJFN5bWJvbC5wcm90b3R5cGUsICRPYmplY3QoaXQpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJlY29yZCwgZm4sIElURVJBVE9SX0lOU1RFQURfT0ZfUkVDT1JEKSB7XG4gIHZhciBpdGVyYXRvciA9IElURVJBVE9SX0lOU1RFQURfT0ZfUkVDT1JEID8gcmVjb3JkIDogcmVjb3JkLml0ZXJhdG9yO1xuICB2YXIgbmV4dCA9IHJlY29yZC5uZXh0O1xuICB2YXIgc3RlcCwgcmVzdWx0O1xuICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICByZXN1bHQgPSBmbihzdGVwLnZhbHVlKTtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgZ2V0SXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yJyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbnZhciBSZXN1bHQgPSBmdW5jdGlvbiAoc3RvcHBlZCwgcmVzdWx0KSB7XG4gIHRoaXMuc3RvcHBlZCA9IHN0b3BwZWQ7XG4gIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xufTtcblxudmFyIFJlc3VsdFByb3RvdHlwZSA9IFJlc3VsdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCB1bmJvdW5kRnVuY3Rpb24sIG9wdGlvbnMpIHtcbiAgdmFyIHRoYXQgPSBvcHRpb25zICYmIG9wdGlvbnMudGhhdDtcbiAgdmFyIEFTX0VOVFJJRVMgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuQVNfRU5UUklFUyk7XG4gIHZhciBJU19SRUNPUkQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfUkVDT1JEKTtcbiAgdmFyIElTX0lURVJBVE9SID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklTX0lURVJBVE9SKTtcbiAgdmFyIElOVEVSUlVQVEVEID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklOVEVSUlVQVEVEKTtcbiAgdmFyIGZuID0gYmluZCh1bmJvdW5kRnVuY3Rpb24sIHRoYXQpO1xuICB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBuZXh0LCBzdGVwO1xuXG4gIHZhciBzdG9wID0gZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgIGlmIChpdGVyYXRvcikgaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ25vcm1hbCcsIGNvbmRpdGlvbik7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQodHJ1ZSwgY29uZGl0aW9uKTtcbiAgfTtcblxuICB2YXIgY2FsbEZuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKEFTX0VOVFJJRVMpIHtcbiAgICAgIGFuT2JqZWN0KHZhbHVlKTtcbiAgICAgIHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSwgc3RvcCkgOiBmbih2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgIH0gcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWUsIHN0b3ApIDogZm4odmFsdWUpO1xuICB9O1xuXG4gIGlmIChJU19SRUNPUkQpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlLml0ZXJhdG9yO1xuICB9IGVsc2UgaWYgKElTX0lURVJBVE9SKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7XG4gICAgaWYgKCFpdGVyRm4pIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGl0ZXJhYmxlKSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG4gICAgLy8gb3B0aW1pc2F0aW9uIGZvciBhcnJheSBpdGVyYXRvcnNcbiAgICBpZiAoaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJGbikpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShpdGVyYWJsZSk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIHJlc3VsdCA9IGNhbGxGbihpdGVyYWJsZVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0ICYmIGlzUHJvdG90eXBlT2YoUmVzdWx0UHJvdG90eXBlLCByZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICAgICAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG4gICAgfVxuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoaXRlcmFibGUsIGl0ZXJGbik7XG4gIH1cblxuICBuZXh0ID0gSVNfUkVDT1JEID8gaXRlcmFibGUubmV4dCA6IGl0ZXJhdG9yLm5leHQ7XG4gIHdoaWxlICghKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBjYWxsRm4oc3RlcC52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ29iamVjdCcgJiYgcmVzdWx0ICYmIGlzUHJvdG90eXBlT2YoUmVzdWx0UHJvdG90eXBlLCByZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGtpbmQsIHZhbHVlKSB7XG4gIHZhciBpbm5lclJlc3VsdCwgaW5uZXJFcnJvcjtcbiAgYW5PYmplY3QoaXRlcmF0b3IpO1xuICB0cnkge1xuICAgIGlubmVyUmVzdWx0ID0gZ2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG4gICAgaWYgKCFpbm5lclJlc3VsdCkge1xuICAgICAgaWYgKGtpbmQgPT09ICd0aHJvdycpIHRocm93IHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpbm5lclJlc3VsdCA9IGNhbGwoaW5uZXJSZXN1bHQsIGl0ZXJhdG9yKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbm5lckVycm9yID0gdHJ1ZTtcbiAgICBpbm5lclJlc3VsdCA9IGVycm9yO1xuICB9XG4gIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgaWYgKGlubmVyRXJyb3IpIHRocm93IGlubmVyUmVzdWx0O1xuICBhbk9iamVjdChpbm5lclJlc3VsdCk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQsIEVOVU1FUkFCTEVfTkVYVCkge1xuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKCshRU5VTUVSQUJMRV9ORVhULCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpO1xuICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICByZXR1cm4gSXRlcmF0b3JDb25zdHJ1Y3Rvcjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBGdW5jdGlvbk5hbWUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3RvcicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBQUk9QRVJfRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5QUk9QRVI7XG52YXIgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuQ09ORklHVVJBQkxFO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gSXRlcmF0b3JzQ29yZS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG52YXIgRU5UUklFUyA9ICdlbnRyaWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYWJsZSwgTkFNRSwgSXRlcmF0b3JDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblxuICB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHtcbiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7XG4gICAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkgcmV0dXJuIEl0ZXJhYmxlUHJvdG90eXBlW0tJTkRdO1xuXG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzKTsgfTtcbiAgfTtcblxuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlO1xuICB2YXIgSXRlcmFibGVQcm90b3R5cGUgPSBJdGVyYWJsZS5wcm90b3R5cGU7XG4gIHZhciBuYXRpdmVJdGVyYXRvciA9IEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXVxuICAgIHx8IEl0ZXJhYmxlUHJvdG90eXBlWydAQGl0ZXJhdG9yJ11cbiAgICB8fCBERUZBVUxUICYmIEl0ZXJhYmxlUHJvdG90eXBlW0RFRkFVTFRdO1xuICB2YXIgZGVmYXVsdEl0ZXJhdG9yID0gIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgbmF0aXZlSXRlcmF0b3IgfHwgZ2V0SXRlcmF0aW9uTWV0aG9kKERFRkFVTFQpO1xuICB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yO1xuICB2YXIgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBtZXRob2RzLCBLRVk7XG5cbiAgLy8gZml4IG5hdGl2ZVxuICBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHtcbiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7XG4gICAgaWYgKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0NhbGxhYmxlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0pKSB7XG4gICAgICAgICAgZGVmaW5lQnVpbHRJbihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheS5wcm90b3R5cGUueyB2YWx1ZXMsIEBAaXRlcmF0b3IgfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKFBST1BFUl9GVU5DVElPTl9OQU1FICYmIERFRkFVTFQgPT09IFZBTFVFUyAmJiBuYXRpdmVJdGVyYXRvciAmJiBuYXRpdmVJdGVyYXRvci5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBpZiAoIUlTX1BVUkUgJiYgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYWJsZVByb3RvdHlwZSwgJ25hbWUnLCBWQUxVRVMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlO1xuICAgICAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gY2FsbChuYXRpdmVJdGVyYXRvciwgdGhpcyk7IH07XG4gICAgfVxuICB9XG5cbiAgLy8gZXhwb3J0IGFkZGl0aW9uYWwgbWV0aG9kc1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gZGVmYXVsdEl0ZXJhdG9yIDogZ2V0SXRlcmF0aW9uTWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKEtFWSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7XG4gICAgICAgIGRlZmluZUJ1aWx0SW4oSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICAvLyBkZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghSVNfUFVSRSB8fCBGT1JDRUQpICYmIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gZGVmYXVsdEl0ZXJhdG9yKSB7XG4gICAgZGVmaW5lQnVpbHRJbihJdGVyYWJsZVByb3RvdHlwZSwgSVRFUkFUT1IsIGRlZmF1bHRJdGVyYXRvciwgeyBuYW1lOiBERUZBVUxUIH0pO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlYCBvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1vYmplY3RcbnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1hcnJheS1wcm90b3R5cGUta2V5cyAtLSBzYWZlICovXG5pZiAoW10ua2V5cykge1xuICBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpO1xuICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgaWYgKCEoJ25leHQnIGluIGFycmF5SXRlcmF0b3IpKSBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gdHJ1ZTtcbiAgZWxzZSB7XG4gICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpO1xuICAgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG59XG5cbnZhciBORVdfSVRFUkFUT1JfUFJPVE9UWVBFID0gIWlzT2JqZWN0KEl0ZXJhdG9yUHJvdG90eXBlKSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZXN0ID0ge307XG4gIC8vIEZGNDQtIGxlZ2FjeSBpdGVyYXRvcnMgY2FzZVxuICByZXR1cm4gSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdLmNhbGwodGVzdCkgIT09IHRlc3Q7XG59KTtcblxuaWYgKE5FV19JVEVSQVRPUl9QUk9UT1RZUEUpIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5lbHNlIGlmIChJU19QVVJFKSBJdGVyYXRvclByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLUBAaXRlcmF0b3JcbmlmICghaXNDYWxsYWJsZShJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0pKSB7XG4gIGRlZmluZUJ1aWx0SW4oSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSXRlcmF0b3JQcm90b3R5cGU6IEl0ZXJhdG9yUHJvdG90eXBlLFxuICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcblxuLy8gYExlbmd0aE9mQXJyYXlMaWtlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbGVuZ3Rob2ZhcnJheWxpa2Vcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdG9MZW5ndGgob2JqLmxlbmd0aCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgY2FsbGVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGxlcicpO1xuXG52YXIgTWFwID0gZ2V0QnVpbHRJbignTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNYXA6IE1hcCxcbiAgc2V0OiBjYWxsZXIoJ3NldCcsIDIpLFxuICBnZXQ6IGNhbGxlcignZ2V0JywgMSksXG4gIGhhczogY2FsbGVyKCdoYXMnLCAxKSxcbiAgcmVtb3ZlOiBjYWxsZXIoJ2RlbGV0ZScsIDEpLFxuICBwcm90bzogTWFwLnByb3RvdHlwZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYE1hdGgudHJ1bmNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXRoLnRydW5jXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbWF0aC10cnVuYyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgudHJ1bmMgfHwgZnVuY3Rpb24gdHJ1bmMoeCkge1xuICB2YXIgbiA9ICt4O1xuICByZXR1cm4gKG4gPiAwID8gZmxvb3IgOiBjZWlsKShuKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNhZmVHZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NhZmUtZ2V0LWJ1aWx0LWluJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBRdWV1ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9xdWV1ZScpO1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zJyk7XG52YXIgSVNfSU9TX1BFQkJMRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZScpO1xudmFyIElTX1dFQk9TX1dFQktJVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0Jyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xuXG52YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG52YXIgbWljcm90YXNrID0gc2FmZUdldEJ1aWx0SW4oJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgbm90aWZ5LCB0b2dnbGUsIG5vZGUsIHByb21pc2UsIHRoZW47XG5cbi8vIG1vZGVybiBlbmdpbmVzIGhhdmUgcXVldWVNaWNyb3Rhc2sgbWV0aG9kXG5pZiAoIW1pY3JvdGFzaykge1xuICB2YXIgcXVldWUgPSBuZXcgUXVldWUoKTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKElTX05PREUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoZm4gPSBxdWV1ZS5nZXQoKSkgdHJ5IHtcbiAgICAgIGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChxdWV1ZS5oZWFkKSBub3RpZnkoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIC8vIGFsc28gZXhjZXB0IFdlYk9TIFdlYmtpdCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODk4XG4gIGlmICghSVNfSU9TICYmICFJU19OT0RFICYmICFJU19XRUJPU19XRUJLSVQgJiYgTXV0YXRpb25PYnNlcnZlciAmJiBkb2N1bWVudCkge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKCFJU19JT1NfUEVCQkxFICYmIFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgLy8gd29ya2Fyb3VuZCBvZiBXZWJLaXQgfiBpT1MgU2FmYXJpIDEwLjEgYnVnXG4gICAgcHJvbWlzZS5jb25zdHJ1Y3RvciA9IFByb21pc2U7XG4gICAgdGhlbiA9IGJpbmQocHJvbWlzZS50aGVuLCBwcm9taXNlKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBOb2RlLmpzIHdpdGhvdXQgcHJvbWlzZXNcbiAgfSBlbHNlIGlmIChJU19OT0RFKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnZVxuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICAvLyBgd2VicGFja2AgZGV2IHNlcnZlciBidWcgb24gSUUgZ2xvYmFsIG1ldGhvZHMgLSB1c2UgYmluZChmbiwgZ2xvYmFsKVxuICAgIG1hY3JvdGFzayA9IGJpbmQobWFjcm90YXNrLCBnbG9iYWwpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG1hY3JvdGFzayhmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIG1pY3JvdGFzayA9IGZ1bmN0aW9uIChmbikge1xuICAgIGlmICghcXVldWUuaGVhZCkgbm90aWZ5KCk7XG4gICAgcXVldWUuYWRkKGZuKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtaWNyb3Rhc2s7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFDYWxsYWJsZShyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhQ2FsbGFibGUocmVqZWN0KTtcbn07XG5cbi8vIGBOZXdQcm9taXNlQ2FwYWJpbGl0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW5ld3Byb21pc2VjYXBhYmlsaXR5XG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50LCAkZGVmYXVsdCkge1xuICByZXR1cm4gYXJndW1lbnQgPT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gJycgOiAkZGVmYXVsdCA6IHRvU3RyaW5nKGFyZ3VtZW50KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcmVnZXhwJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXNSZWdFeHAoaXQpKSB7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnNcIik7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgJHBhcnNlSW50ID0gZ2xvYmFsLnBhcnNlSW50O1xudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgSVRFUkFUT1IgPSBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIGhleCA9IC9eWystXT8weC9pO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcyhoZXguZXhlYyk7XG52YXIgRk9SQ0VEID0gJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzB4MTYnKSAhPT0gMjJcbiAgLy8gTVMgRWRnZSAxOC0gYnJva2VuIHdpdGggYm94ZWQgc3ltYm9sc1xuICB8fCAoSVRFUkFUT1IgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsgJHBhcnNlSW50KE9iamVjdChJVEVSQVRPUikpOyB9KSk7XG5cbi8vIGBwYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXBhcnNlaW50LXN0cmluZy1yYWRpeFxubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4KSB7XG4gIHZhciBTID0gdHJpbSh0b1N0cmluZyhzdHJpbmcpKTtcbiAgcmV0dXJuICRwYXJzZUludChTLCAocmFkaXggPj4+IDApIHx8IChleGVjKGhleCwgUykgPyAxNiA6IDEwKSk7XG59IDogJHBhcnNlSW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gc2FmZVxudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHNob3VsZCBoYXZlIGNvcnJlY3Qgb3JkZXIgb2Ygb3BlcmF0aW9ucyAoRWRnZSBidWcpXG4gIGlmIChERVNDUklQVE9SUyAmJiAkYXNzaWduKHsgYjogMSB9LCAkYXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ2InLCB7XG4gICAgICAgIHZhbHVlOiAzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1zeW1ib2wgLS0gc2FmZVxuICB2YXIgc3ltYm9sID0gU3ltYm9sKCdhc3NpZ24gZGV0ZWN0aW9uJyk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW3N5bWJvbF0gIT09IDcgfHwgb2JqZWN0S2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT09IGFscGhhYmV0O1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjtcbiAgd2hpbGUgKGFyZ3VtZW50c0xlbmd0aCA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJbmRleGVkT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBjb25jYXQob2JqZWN0S2V5cyhTKSwgZ2V0T3duUHJvcGVydHlTeW1ib2xzKFMpKSA6IG9iamVjdEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSB7XG4gICAgICBrZXkgPSBrZXlzW2orK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IGNhbGwocHJvcGVydHlJc0VudW1lcmFibGUsIFMsIGtleSkpIFRba2V5XSA9IFNba2V5XTtcbiAgICB9XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGdsb2JhbCBBY3RpdmVYT2JqZWN0IC0tIG9sZCBJRSwgV1NIICovXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG5cbnZhciBHVCA9ICc+JztcbnZhciBMVCA9ICc8JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBTQ1JJUFQgPSAnc2NyaXB0JztcbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcblxudmFyIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cbnZhciBzY3JpcHRUYWcgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4gTFQgKyBTQ1JJUFQgKyBHVCArIGNvbnRlbnQgKyBMVCArICcvJyArIFNDUklQVCArIEdUO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIEFjdGl2ZVggT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYID0gZnVuY3Rpb24gKGFjdGl2ZVhEb2N1bWVudCkge1xuICBhY3RpdmVYRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCcnKSk7XG4gIGFjdGl2ZVhEb2N1bWVudC5jbG9zZSgpO1xuICB2YXIgdGVtcCA9IGFjdGl2ZVhEb2N1bWVudC5wYXJlbnRXaW5kb3cuT2JqZWN0O1xuICBhY3RpdmVYRG9jdW1lbnQgPSBudWxsOyAvLyBhdm9pZCBtZW1vcnkgbGVha1xuICByZXR1cm4gdGVtcDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgSlMgPSAnamF2YScgKyBTQ1JJUFQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzQ3NVxuICBpZnJhbWUuc3JjID0gU3RyaW5nKEpTKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJ2RvY3VtZW50LkY9T2JqZWN0JykpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICByZXR1cm4gaWZyYW1lRG9jdW1lbnQuRjtcbn07XG5cbi8vIENoZWNrIGZvciBkb2N1bWVudC5kb21haW4gYW5kIGFjdGl2ZSB4IHN1cHBvcnRcbi8vIE5vIG5lZWQgdG8gdXNlIGFjdGl2ZSB4IGFwcHJvYWNoIHdoZW4gZG9jdW1lbnQuZG9tYWluIGlzIG5vdCBzZXRcbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzLzE1MFxuLy8gdmFyaWF0aW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9raXRjYW1icmlkZ2UvZXM1LXNoaW0vY29tbWl0LzRmNzM4YWMwNjYzNDZcbi8vIGF2b2lkIElFIEdDIGJ1Z1xudmFyIGFjdGl2ZVhEb2N1bWVudDtcbnZhciBOdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgYWN0aXZlWERvY3VtZW50ID0gbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGlnbm9yZSAqLyB9XG4gIE51bGxQcm90b09iamVjdCA9IHR5cGVvZiBkb2N1bWVudCAhPSAndW5kZWZpbmVkJ1xuICAgID8gZG9jdW1lbnQuZG9tYWluICYmIGFjdGl2ZVhEb2N1bWVudFxuICAgICAgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCkgLy8gb2xkIElFXG4gICAgICA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpXG4gICAgOiBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCk7IC8vIFdTSFxuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIE51bGxQcm90b09iamVjdCgpO1xufTtcblxuaGlkZGVuS2V5c1tJRV9QUk9UT10gPSB0cnVlO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtY3JlYXRlIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXNNb2R1bGUuZihyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydGllcyAtLSBzYWZlXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyAmJiAhVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIHByb3BzID0gdG9JbmRleGVkT2JqZWN0KFByb3BlcnRpZXMpO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaW5kZXgrK10sIHByb3BzW2tleV0pO1xuICByZXR1cm4gTztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgRU5VTUVSQUJMRSA9ICdlbnVtZXJhYmxlJztcbnZhciBDT05GSUdVUkFCTEUgPSAnY29uZmlndXJhYmxlJztcbnZhciBXUklUQUJMRSA9ICd3cml0YWJsZSc7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmICh0eXBlb2YgTyA9PT0gJ2Z1bmN0aW9uJyAmJiBQID09PSAncHJvdG90eXBlJyAmJiAndmFsdWUnIGluIEF0dHJpYnV0ZXMgJiYgV1JJVEFCTEUgaW4gQXR0cmlidXRlcyAmJiAhQXR0cmlidXRlc1tXUklUQUJMRV0pIHtcbiAgICB2YXIgY3VycmVudCA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudFtXUklUQUJMRV0pIHtcbiAgICAgIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICAgICAgQXR0cmlidXRlcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBDT05GSUdVUkFCTEUgaW4gQXR0cmlidXRlcyA/IEF0dHJpYnV0ZXNbQ09ORklHVVJBQkxFXSA6IGN1cnJlbnRbQ09ORklHVVJBQkxFXSxcbiAgICAgICAgZW51bWVyYWJsZTogRU5VTUVSQUJMRSBpbiBBdHRyaWJ1dGVzID8gQXR0cmlidXRlc1tFTlVNRVJBQkxFXSA6IGN1cnJlbnRbRU5VTUVSQUJMRV0sXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gIH0gcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbn0gOiAkZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gJGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IG5ldyAkVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhc093bihPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mLCBPLCBQKSwgT1tQXSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZSAqL1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpLmY7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gYXJyYXlTbGljZSh3aW5kb3dOYW1lcyk7XG4gIH1cbn07XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiBjbGFzc29mKGl0KSA9PT0gJ1dpbmRvdydcbiAgICA/IGdldFdpbmRvd05hbWVzKGl0KVxuICAgIDogJGdldE93blByb3BlcnR5TmFtZXModG9JbmRleGVkT2JqZWN0KGl0KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5c3ltYm9scyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlcicpO1xuXG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG52YXIgJE9iamVjdCA9IE9iamVjdDtcbnZhciBPYmplY3RQcm90b3R5cGUgPSAkT2JqZWN0LnByb3RvdHlwZTtcblxuLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRwcm90b3R5cGVvZlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/ICRPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykge1xuICB2YXIgb2JqZWN0ID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXNPd24ob2JqZWN0LCBJRV9QUk9UTykpIHJldHVybiBvYmplY3RbSUVfUFJPVE9dO1xuICB2YXIgY29uc3RydWN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gIGlmIChpc0NhbGxhYmxlKGNvbnN0cnVjdG9yKSAmJiBvYmplY3QgaW5zdGFuY2VvZiBjb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mICRPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBBUlJBWV9CVUZGRVJfTk9OX0VYVEVOU0lCTEUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLW5vbi1leHRlbnNpYmxlJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNleHRlbnNpYmxlIC0tIHNhZmVcbnZhciAkaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyAkaXNFeHRlbnNpYmxlKDEpOyB9KTtcblxuLy8gYE9iamVjdC5pc0V4dGVuc2libGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuaXNleHRlbnNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IChGQUlMU19PTl9QUklNSVRJVkVTIHx8IEFSUkFZX0JVRkZFUl9OT05fRVhURU5TSUJMRSkgPyBmdW5jdGlvbiBpc0V4dGVuc2libGUoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFSUkFZX0JVRkZFUl9OT05fRVhURU5TSUJMRSAmJiBjbGFzc29mKGl0KSA9PT0gJ0FycmF5QnVmZmVyJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gJGlzRXh0ZW5zaWJsZSA/ICRpc0V4dGVuc2libGUoaXQpIDogdHJ1ZTtcbn0gOiAkaXNFeHRlbnNpYmxlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzKHt9LmlzUHJvdG90eXBlT2YpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgaW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluZGV4T2Y7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzT3duKGhpZGRlbktleXMsIGtleSkgJiYgaGFzT3duKE8sIGtleSkgJiYgcHVzaChyZXN1bHQsIGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXNPd24oTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcHVzaChyZXN1bHQsIGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG4vLyBgT2JqZWN0LmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Qua2V5c1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1rZXlzIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhJHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUucHJvcGVydHlpc2VudW1lcmFibGVcbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gLS0gc2FmZSAqL1xudmFyIHVuY3VycnlUaGlzQWNjZXNzb3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWFjY2Vzc29yJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBhUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5zZXRwcm90b3R5cGVvZlxuLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LXNldHByb3RvdHlwZW9mIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgc2V0dGVyID0gdW5jdXJyeVRoaXNBY2Nlc3NvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJywgJ3NldCcpO1xuICAgIHNldHRlcih0ZXN0LCBbXSk7XG4gICAgQ09SUkVDVF9TRVRURVIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgcmVxdWlyZU9iamVjdENvZXJjaWJsZShPKTtcbiAgICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pO1xuICAgIGlmICghaXNPYmplY3QoTykpIHJldHVybiBPO1xuICAgIGlmIChDT1JSRUNUX1NFVFRFUikgc2V0dGVyKE8sIHByb3RvKTtcbiAgICBlbHNlIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIE87XG4gIH07XG59KCkgOiB1bmRlZmluZWQpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBvYmplY3RHZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKS5mO1xuXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSB1bmN1cnJ5VGhpcygkcHJvcGVydHlJc0VudW1lcmFibGUpO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxuLy8gaW4gc29tZSBJRSB2ZXJzaW9ucywgYHByb3BlcnR5SXNFbnVtZXJhYmxlYCByZXR1cm5zIGluY29ycmVjdCByZXN1bHQgb24gaW50ZWdlciBrZXlzXG4vLyBvZiBgbnVsbGAgcHJvdG90eXBlIG9iamVjdHNcbnZhciBJRV9CVUcgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtY3JlYXRlIC0tIHNhZmVcbiAgdmFyIE8gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBPWzJdID0gMjtcbiAgcmV0dXJuICFwcm9wZXJ0eUlzRW51bWVyYWJsZShPLCAyKTtcbn0pO1xuXG4vLyBgT2JqZWN0LnsgZW50cmllcywgdmFsdWVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVE9fRU5UUklFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gb2JqZWN0S2V5cyhPKTtcbiAgICB2YXIgSUVfV09SS0FST1VORCA9IElFX0JVRyAmJiBvYmplY3RHZXRQcm90b3R5cGVPZihPKSA9PT0gbnVsbDtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSB7XG4gICAgICBrZXkgPSBrZXlzW2krK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IChJRV9XT1JLQVJPVU5EID8ga2V5IGluIE8gOiBwcm9wZXJ0eUlzRW51bWVyYWJsZShPLCBrZXkpKSkge1xuICAgICAgICBwdXNoKHJlc3VsdCwgVE9fRU5UUklFUyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmVudHJpZXNcbiAgZW50cmllczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgT2JqZWN0LnZhbHVlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnZhbHVlc1xuICB2YWx1ZXM6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8ge30udG9TdHJpbmcgOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgT3JkaW5hcnlUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0LCBwcmVmKSB7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAocHJlZiA9PT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKGlzQ2FsbGFibGUoZm4gPSBpbnB1dC52YWx1ZU9mKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHByZWYgIT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChrZXlzLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvcicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfQlJPV1NFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3NlcicpO1xudmFyIElTX0RFTk8gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8nKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFNVQkNMQVNTSU5HID0gZmFsc2U7XG52YXIgTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UID0gaXNDYWxsYWJsZShnbG9iYWwuUHJvbWlzZVJlamVjdGlvbkV2ZW50KTtcblxudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gaXNGb3JjZWQoJ1Byb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSA9IGluc3BlY3RTb3VyY2UoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgdmFyIEdMT0JBTF9DT1JFX0pTX1BST01JU0UgPSBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSAhPT0gU3RyaW5nKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIC8vIFY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gIGlmICghR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiBWOF9WRVJTSU9OID09PSA2NikgcmV0dXJuIHRydWU7XG4gIC8vIFdlIG5lZWQgUHJvbWlzZSN7IGNhdGNoLCBmaW5hbGx5IH0gaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICEoTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnY2F0Y2gnXSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10pKSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbiAgaWYgKCFWOF9WRVJTSU9OIHx8IFY4X1ZFUlNJT04gPCA1MSB8fCAhL25hdGl2ZSBjb2RlLy50ZXN0KFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFKSkge1xuICAgIC8vIERldGVjdCBjb3JyZWN0bmVzcyBvZiBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSBuZXcgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUoMSk7IH0pO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgICB9O1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb21pc2UuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlO1xuICAgIFNVQkNMQVNTSU5HID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgICBpZiAoIVNVQkNMQVNTSU5HKSByZXR1cm4gdHJ1ZTtcbiAgLy8gVW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICB9IHJldHVybiAhR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiAoSVNfQlJPV1NFUiB8fCBJU19ERU5PKSAmJiAhTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDT05TVFJVQ1RPUjogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IsXG4gIFJFSkVDVElPTl9FVkVOVDogTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5ULFxuICBTVUJDTEFTU0lORzogU1VCQ0xBU1NJTkdcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5Qcm9taXNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3InKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG52YXIgRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKS5DT05TVFJVQ1RPUjtcblxubW9kdWxlLmV4cG9ydHMgPSBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IuYWxsKGl0ZXJhYmxlKS50aGVuKHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmhlYWQgPSBudWxsO1xuICB0aGlzLnRhaWwgPSBudWxsO1xufTtcblxuUXVldWUucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIGVudHJ5ID0geyBpdGVtOiBpdGVtLCBuZXh0OiBudWxsIH07XG4gICAgdmFyIHRhaWwgPSB0aGlzLnRhaWw7XG4gICAgaWYgKHRhaWwpIHRhaWwubmV4dCA9IGVudHJ5O1xuICAgIGVsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgdGhpcy50YWlsID0gZW50cnk7XG4gIH0sXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbnRyeSA9IHRoaXMuaGVhZDtcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIHZhciBuZXh0ID0gdGhpcy5oZWFkID0gZW50cnkubmV4dDtcbiAgICAgIGlmIChuZXh0ID09PSBudWxsKSB0aGlzLnRhaWwgPSBudWxsO1xuICAgICAgcmV0dXJuIGVudHJ5Lml0ZW07XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFF1ZXVlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc051bGxPclVuZGVmaW5lZChpdCkpIHRocm93IG5ldyAkVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBBdm9pZCBOb2RlSlMgZXhwZXJpbWVudGFsIHdhcm5pbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuIGdsb2JhbFtuYW1lXTtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsLCBuYW1lKTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGFwcGx5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIEVOR0lORV9JU19CVU4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWJ1bicpO1xudmFyIFVTRVJfQUdFTlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG52YXIgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aCcpO1xuXG52YXIgRnVuY3Rpb24gPSBnbG9iYWwuRnVuY3Rpb247XG4vLyBkaXJ0eSBJRTktIGFuZCBCdW4gMC4zLjAtIGNoZWNrc1xudmFyIFdSQVAgPSAvTVNJRSAuXFwuLy50ZXN0KFVTRVJfQUdFTlQpIHx8IEVOR0lORV9JU19CVU4gJiYgKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlcnNpb24gPSBnbG9iYWwuQnVuLnZlcnNpb24uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIHZlcnNpb24ubGVuZ3RoIDwgMyB8fCB2ZXJzaW9uWzBdID09PSAnMCcgJiYgKHZlcnNpb25bMV0gPCAzIHx8IHZlcnNpb25bMV0gPT09ICczJyAmJiB2ZXJzaW9uWzJdID09PSAnMCcpO1xufSkoKTtcblxuLy8gSUU5LSAvIEJ1biAwLjMuMC0gc2V0VGltZW91dCAvIHNldEludGVydmFsIC8gc2V0SW1tZWRpYXRlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmaXhcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjdGltZXJzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE2MzNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNjaGVkdWxlciwgaGFzVGltZUFyZykge1xuICB2YXIgZmlyc3RQYXJhbUluZGV4ID0gaGFzVGltZUFyZyA/IDIgOiAxO1xuICByZXR1cm4gV1JBUCA/IGZ1bmN0aW9uIChoYW5kbGVyLCB0aW1lb3V0IC8qICwgLi4uYXJndW1lbnRzICovKSB7XG4gICAgdmFyIGJvdW5kQXJncyA9IHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpID4gZmlyc3RQYXJhbUluZGV4O1xuICAgIHZhciBmbiA9IGlzQ2FsbGFibGUoaGFuZGxlcikgPyBoYW5kbGVyIDogRnVuY3Rpb24oaGFuZGxlcik7XG4gICAgdmFyIHBhcmFtcyA9IGJvdW5kQXJncyA/IGFycmF5U2xpY2UoYXJndW1lbnRzLCBmaXJzdFBhcmFtSW5kZXgpIDogW107XG4gICAgdmFyIGNhbGxiYWNrID0gYm91bmRBcmdzID8gZnVuY3Rpb24gKCkge1xuICAgICAgYXBwbHkoZm4sIHRoaXMsIHBhcmFtcyk7XG4gICAgfSA6IGZuO1xuICAgIHJldHVybiBoYXNUaW1lQXJnID8gc2NoZWR1bGVyKGNhbGxiYWNrLCB0aW1lb3V0KSA6IHNjaGVkdWxlcihjYWxsYmFjayk7XG4gIH0gOiBzY2hlZHVsZXI7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFNldEhlbHBlcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWhlbHBlcnMnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pdGVyYXRlJyk7XG5cbnZhciBTZXQgPSBTZXRIZWxwZXJzLlNldDtcbnZhciBhZGQgPSBTZXRIZWxwZXJzLmFkZDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0KSB7XG4gIHZhciByZXN1bHQgPSBuZXcgU2V0KCk7XG4gIGl0ZXJhdGUoc2V0LCBmdW5jdGlvbiAoaXQpIHtcbiAgICBhZGQocmVzdWx0LCBpdCk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Etc2V0Jyk7XG52YXIgU2V0SGVscGVycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaGVscGVycycpO1xudmFyIGNsb25lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1jbG9uZScpO1xudmFyIHNpemUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNpemUnKTtcbnZhciBnZXRTZXRSZWNvcmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1yZWNvcmQnKTtcbnZhciBpdGVyYXRlU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pdGVyYXRlJyk7XG52YXIgaXRlcmF0ZVNpbXBsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlLXNpbXBsZScpO1xuXG52YXIgaGFzID0gU2V0SGVscGVycy5oYXM7XG52YXIgcmVtb3ZlID0gU2V0SGVscGVycy5yZW1vdmU7XG5cbi8vIGBTZXQucHJvdG90eXBlLmRpZmZlcmVuY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlmZmVyZW5jZShvdGhlcikge1xuICB2YXIgTyA9IGFTZXQodGhpcyk7XG4gIHZhciBvdGhlclJlYyA9IGdldFNldFJlY29yZChvdGhlcik7XG4gIHZhciByZXN1bHQgPSBjbG9uZShPKTtcbiAgaWYgKHNpemUoTykgPD0gb3RoZXJSZWMuc2l6ZSkgaXRlcmF0ZVNldChPLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChvdGhlclJlYy5pbmNsdWRlcyhlKSkgcmVtb3ZlKHJlc3VsdCwgZSk7XG4gIH0pO1xuICBlbHNlIGl0ZXJhdGVTaW1wbGUob3RoZXJSZWMuZ2V0SXRlcmF0b3IoKSwgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoaGFzKE8sIGUpKSByZW1vdmUocmVzdWx0LCBlKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgY2FsbGVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGxlcicpO1xuXG52YXIgU2V0ID0gZ2V0QnVpbHRJbignU2V0Jyk7XG52YXIgU2V0UHJvdG90eXBlID0gU2V0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFNldDogU2V0LFxuICBhZGQ6IGNhbGxlcignYWRkJywgMSksXG4gIGhhczogY2FsbGVyKCdoYXMnLCAxKSxcbiAgcmVtb3ZlOiBjYWxsZXIoJ2RlbGV0ZScsIDEpLFxuICBwcm90bzogU2V0UHJvdG90eXBlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1zZXQnKTtcbnZhciBTZXRIZWxwZXJzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzJyk7XG52YXIgc2l6ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc2l6ZScpO1xudmFyIGdldFNldFJlY29yZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc2V0LXJlY29yZCcpO1xudmFyIGl0ZXJhdGVTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWl0ZXJhdGUnKTtcbnZhciBpdGVyYXRlU2ltcGxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlJyk7XG5cbnZhciBTZXQgPSBTZXRIZWxwZXJzLlNldDtcbnZhciBhZGQgPSBTZXRIZWxwZXJzLmFkZDtcbnZhciBoYXMgPSBTZXRIZWxwZXJzLmhhcztcblxuLy8gYFNldC5wcm90b3R5cGUuaW50ZXJzZWN0aW9uYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGludGVyc2VjdGlvbihvdGhlcikge1xuICB2YXIgTyA9IGFTZXQodGhpcyk7XG4gIHZhciBvdGhlclJlYyA9IGdldFNldFJlY29yZChvdGhlcik7XG4gIHZhciByZXN1bHQgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHNpemUoTykgPiBvdGhlclJlYy5zaXplKSB7XG4gICAgaXRlcmF0ZVNpbXBsZShvdGhlclJlYy5nZXRJdGVyYXRvcigpLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGhhcyhPLCBlKSkgYWRkKHJlc3VsdCwgZSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaXRlcmF0ZVNldChPLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKG90aGVyUmVjLmluY2x1ZGVzKGUpKSBhZGQocmVzdWx0LCBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1zZXQnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWhlbHBlcnMnKS5oYXM7XG52YXIgc2l6ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc2l6ZScpO1xudmFyIGdldFNldFJlY29yZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc2V0LXJlY29yZCcpO1xudmFyIGl0ZXJhdGVTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWl0ZXJhdGUnKTtcbnZhciBpdGVyYXRlU2ltcGxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlJyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pc0Rpc2pvaW50RnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldC1tZXRob2RzLyNTZXQucHJvdG90eXBlLmlzRGlzam9pbnRGcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGlzam9pbnRGcm9tKG90aGVyKSB7XG4gIHZhciBPID0gYVNldCh0aGlzKTtcbiAgdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTtcbiAgaWYgKHNpemUoTykgPD0gb3RoZXJSZWMuc2l6ZSkgcmV0dXJuIGl0ZXJhdGVTZXQoTywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAob3RoZXJSZWMuaW5jbHVkZXMoZSkpIHJldHVybiBmYWxzZTtcbiAgfSwgdHJ1ZSkgIT09IGZhbHNlO1xuICB2YXIgaXRlcmF0b3IgPSBvdGhlclJlYy5nZXRJdGVyYXRvcigpO1xuICByZXR1cm4gaXRlcmF0ZVNpbXBsZShpdGVyYXRvciwgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoaGFzKE8sIGUpKSByZXR1cm4gaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ25vcm1hbCcsIGZhbHNlKTtcbiAgfSkgIT09IGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Etc2V0Jyk7XG52YXIgc2l6ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc2l6ZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWl0ZXJhdGUnKTtcbnZhciBnZXRTZXRSZWNvcmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1yZWNvcmQnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuaXNTdWJzZXRPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldC1tZXRob2RzLyNTZXQucHJvdG90eXBlLmlzU3Vic2V0T2Zcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNTdWJzZXRPZihvdGhlcikge1xuICB2YXIgTyA9IGFTZXQodGhpcyk7XG4gIHZhciBvdGhlclJlYyA9IGdldFNldFJlY29yZChvdGhlcik7XG4gIGlmIChzaXplKE8pID4gb3RoZXJSZWMuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaXRlcmF0ZShPLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghb3RoZXJSZWMuaW5jbHVkZXMoZSkpIHJldHVybiBmYWxzZTtcbiAgfSwgdHJ1ZSkgIT09IGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Etc2V0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzJykuaGFzO1xudmFyIHNpemUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNpemUnKTtcbnZhciBnZXRTZXRSZWNvcmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1yZWNvcmQnKTtcbnZhciBpdGVyYXRlU2ltcGxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlJyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pc1N1cGVyc2V0T2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXQtbWV0aG9kcy8jU2V0LnByb3RvdHlwZS5pc1N1cGVyc2V0T2Zcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNTdXBlcnNldE9mKG90aGVyKSB7XG4gIHZhciBPID0gYVNldCh0aGlzKTtcbiAgdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTtcbiAgaWYgKHNpemUoTykgPCBvdGhlclJlYy5zaXplKSByZXR1cm4gZmFsc2U7XG4gIHZhciBpdGVyYXRvciA9IG90aGVyUmVjLmdldEl0ZXJhdG9yKCk7XG4gIHJldHVybiBpdGVyYXRlU2ltcGxlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghaGFzKE8sIGUpKSByZXR1cm4gaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ25vcm1hbCcsIGZhbHNlKTtcbiAgfSkgIT09IGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpdGVyYXRlU2ltcGxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldCwgZm4sIGludGVycnVwdGlibGUpIHtcbiAgcmV0dXJuIGludGVycnVwdGlibGUgPyBpdGVyYXRlU2ltcGxlKHNldC5rZXlzKCksIGZuLCB0cnVlKSA6IHNldC5mb3JFYWNoKGZuKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldCkge1xuICByZXR1cm4gc2V0LnNpemU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvcicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKENvbnN0cnVjdG9yLCBTUEVDSUVTLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICB9KTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Etc2V0Jyk7XG52YXIgU2V0SGVscGVycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaGVscGVycycpO1xudmFyIGNsb25lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1jbG9uZScpO1xudmFyIGdldFNldFJlY29yZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc2V0LXJlY29yZCcpO1xudmFyIGl0ZXJhdGVTaW1wbGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZS1zaW1wbGUnKTtcblxudmFyIGFkZCA9IFNldEhlbHBlcnMuYWRkO1xudmFyIGhhcyA9IFNldEhlbHBlcnMuaGFzO1xudmFyIHJlbW92ZSA9IFNldEhlbHBlcnMucmVtb3ZlO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5zeW1tZXRyaWNEaWZmZXJlbmNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN5bW1ldHJpY0RpZmZlcmVuY2Uob3RoZXIpIHtcbiAgdmFyIE8gPSBhU2V0KHRoaXMpO1xuICB2YXIga2V5c0l0ZXIgPSBnZXRTZXRSZWNvcmQob3RoZXIpLmdldEl0ZXJhdG9yKCk7XG4gIHZhciByZXN1bHQgPSBjbG9uZShPKTtcbiAgaXRlcmF0ZVNpbXBsZShrZXlzSXRlciwgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoaGFzKE8sIGUpKSByZW1vdmUocmVzdWx0LCBlKTtcbiAgICBlbHNlIGFkZChyZXN1bHQsIGUpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUQUcsIFNUQVRJQywgU0VUX01FVEhPRCkge1xuICB2YXIgdGFyZ2V0ID0gU1RBVElDID8gaXQgOiBpdCAmJiBpdC5wcm90b3R5cGU7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBpZiAoIWhhc093bih0YXJnZXQsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICAgIH1cbiAgICBpZiAoU0VUX01FVEhPRCAmJiAhVE9fU1RSSU5HX1RBR19TVVBQT1JUKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGFyZ2V0LCAndG9TdHJpbmcnLCB0b1N0cmluZyk7XG4gICAgfVxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1zZXQnKTtcbnZhciBhZGQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWhlbHBlcnMnKS5hZGQ7XG52YXIgY2xvbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWNsb25lJyk7XG52YXIgZ2V0U2V0UmVjb3JkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1zZXQtcmVjb3JkJyk7XG52YXIgaXRlcmF0ZVNpbXBsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlLXNpbXBsZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS51bmlvbmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB1bmlvbihvdGhlcikge1xuICB2YXIgTyA9IGFTZXQodGhpcyk7XG4gIHZhciBrZXlzSXRlciA9IGdldFNldFJlY29yZChvdGhlcikuZ2V0SXRlcmF0b3IoKTtcbiAgdmFyIHJlc3VsdCA9IGNsb25lKE8pO1xuICBpdGVyYXRlU2ltcGxlKGtleXNJdGVyLCBmdW5jdGlvbiAoaXQpIHtcbiAgICBhZGQocmVzdWx0LCBpdCk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHknKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWxUaGlzW1NIQVJFRF0gfHwgZGVmaW5lR2xvYmFsUHJvcGVydHkoU0hBUkVELCB7fSk7XG5cbihzdG9yZS52ZXJzaW9ucyB8fCAoc3RvcmUudmVyc2lvbnMgPSBbXSkpLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4zNy4xJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDE0LTIwMjQgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknLFxuICBsaWNlbnNlOiAnaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My4zNy4xL0xJQ0VOU0UnLFxuICBzb3VyY2U6ICdodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcydcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgfHwge30pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jb25zdHJ1Y3RvcicpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCBpc051bGxPclVuZGVmaW5lZChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUNvbnN0cnVjdG9yKFMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBjaGFyQ29kZUF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckNvZGVBdCk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoQ09OVkVSVF9UT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgcG9zKSB7XG4gICAgdmFyIFMgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyT3JJbmZpbml0eShwb3MpO1xuICAgIHZhciBzaXplID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBzaXplKSByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBmaXJzdCA9IGNoYXJDb2RlQXQoUywgcG9zaXRpb24pO1xuICAgIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemVcbiAgICAgIHx8IChzZWNvbmQgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uICsgMSkpIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRlxuICAgICAgICA/IENPTlZFUlRfVE9fU1RSSU5HXG4gICAgICAgICAgPyBjaGFyQXQoUywgcG9zaXRpb24pXG4gICAgICAgICAgOiBmaXJzdFxuICAgICAgICA6IENPTlZFUlRfVE9fU1RSSU5HXG4gICAgICAgICAgPyBzdHJpbmdTbGljZShTLCBwb3NpdGlvbiwgcG9zaXRpb24gKyAyKVxuICAgICAgICAgIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5jb2RlcG9pbnRhdFxuICBjb2RlQXQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxuICBjaGFyQXQ6IGNyZWF0ZU1ldGhvZCh0cnVlKVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgJHJlcGVhdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcmVwZWF0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyIHJlcGVhdCA9IHVuY3VycnlUaGlzKCRyZXBlYXQpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgcGFkU3RhcnQsIHBhZEVuZCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0VORCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcpIHtcbiAgICB2YXIgUyA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTtcbiAgICB2YXIgaW50TWF4TGVuZ3RoID0gdG9MZW5ndGgobWF4TGVuZ3RoKTtcbiAgICB2YXIgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpbGxTdHIgPSBmaWxsU3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiB0b1N0cmluZyhmaWxsU3RyaW5nKTtcbiAgICB2YXIgZmlsbExlbiwgc3RyaW5nRmlsbGVyO1xuICAgIGlmIChpbnRNYXhMZW5ndGggPD0gc3RyaW5nTGVuZ3RoIHx8IGZpbGxTdHIgPT09ICcnKSByZXR1cm4gUztcbiAgICBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoO1xuICAgIHN0cmluZ0ZpbGxlciA9IHJlcGVhdChmaWxsU3RyLCBjZWlsKGZpbGxMZW4gLyBmaWxsU3RyLmxlbmd0aCkpO1xuICAgIGlmIChzdHJpbmdGaWxsZXIubGVuZ3RoID4gZmlsbExlbikgc3RyaW5nRmlsbGVyID0gc3RyaW5nU2xpY2Uoc3RyaW5nRmlsbGVyLCAwLCBmaWxsTGVuKTtcbiAgICByZXR1cm4gSVNfRU5EID8gUyArIHN0cmluZ0ZpbGxlciA6IHN0cmluZ0ZpbGxlciArIFM7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucGFkc3RhcnRcbiAgc3RhcnQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnBhZEVuZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRlbmRcbiAgZW5kOiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUucmVwZWF0YCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVwZWF0KGNvdW50KSB7XG4gIHZhciBzdHIgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICB2YXIgbiA9IHRvSW50ZWdlck9ySW5maW5pdHkoY291bnQpO1xuICBpZiAobiA8IDAgfHwgbiA9PT0gSW5maW5pdHkpIHRocm93IG5ldyAkUmFuZ2VFcnJvcignV3JvbmcgbnVtYmVyIG9mIHJlcGV0aXRpb25zJyk7XG4gIGZvciAoO24gPiAwOyAobiA+Pj49IDEpICYmIChzdHIgKz0gc3RyKSkgaWYgKG4gJiAxKSByZXN1bHQgKz0gc3RyO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgbHRyaW0gPSBSZWdFeHAoJ15bJyArIHdoaXRlc3BhY2VzICsgJ10rJyk7XG52YXIgcnRyaW0gPSBSZWdFeHAoJyhefFteJyArIHdoaXRlc3BhY2VzICsgJ10pWycgKyB3aGl0ZXNwYWNlcyArICddKyQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltLCB0cmltU3RhcnQsIHRyaW1FbmQsIHRyaW1MZWZ0LCB0cmltUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMpIHtcbiAgICB2YXIgc3RyaW5nID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIGlmIChUWVBFICYgMSkgc3RyaW5nID0gcmVwbGFjZShzdHJpbmcsIGx0cmltLCAnJyk7XG4gICAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgcnRyaW0sICckMScpO1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltTGVmdCwgdHJpbVN0YXJ0IH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1zdGFydFxuICBzdGFydDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1SaWdodCwgdHJpbUVuZCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4gIGVuZDogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS50cmltYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1cbiAgdHJpbTogY3JlYXRlTWV0aG9kKDMpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgJFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG5tb2R1bGUuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgc3ltYm9sID0gU3ltYm9sKCdzeW1ib2wgZGV0ZWN0aW9uJyk7XG4gIC8vIENocm9tZSAzOCBTeW1ib2wgaGFzIGluY29ycmVjdCB0b1N0cmluZyBjb252ZXJzaW9uXG4gIC8vIGBnZXQtb3duLXByb3BlcnR5LXN5bWJvbHNgIHBvbHlmaWxsIHN5bWJvbHMgY29udmVydGVkIHRvIG9iamVjdCBhcmUgbm90IFN5bWJvbCBpbnN0YW5jZXNcbiAgLy8gbmI6IERvIG5vdCBjYWxsIGBTdHJpbmdgIGRpcmVjdGx5IHRvIGF2b2lkIHRoaXMgYmVpbmcgb3B0aW1pemVkIG91dCB0byBgc3ltYm9sKycnYCB3aGljaCB3aWxsLFxuICAvLyBvZiBjb3Vyc2UsIGZhaWwuXG4gIHJldHVybiAhJFN0cmluZyhzeW1ib2wpIHx8ICEoT2JqZWN0KHN5bWJvbCkgaW5zdGFuY2VvZiBTeW1ib2wpIHx8XG4gICAgLy8gQ2hyb21lIDM4LTQwIHN5bWJvbHMgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSBET00gY29sbGVjdGlvbnMgcHJvdG90eXBlcyB0byBpbnN0YW5jZXNcbiAgICAhU3ltYm9sLnNoYW0gJiYgVjhfVkVSU0lPTiAmJiBWOF9WRVJTSU9OIDwgNDE7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgU3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJyk7XG4gIHZhciBTeW1ib2xQcm90b3R5cGUgPSBTeW1ib2wgJiYgU3ltYm9sLnByb3RvdHlwZTtcbiAgdmFyIHZhbHVlT2YgPSBTeW1ib2xQcm90b3R5cGUgJiYgU3ltYm9sUHJvdG90eXBlLnZhbHVlT2Y7XG4gIHZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbiAgaWYgKFN5bWJvbFByb3RvdHlwZSAmJiAhU3ltYm9sUHJvdG90eXBlW1RPX1BSSU1JVElWRV0pIHtcbiAgICAvLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wucHJvdG90eXBlLUBAdG9wcmltaXRpdmVcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIC5sZW5ndGhcbiAgICBkZWZpbmVCdWlsdEluKFN5bWJvbFByb3RvdHlwZSwgVE9fUFJJTUlUSVZFLCBmdW5jdGlvbiAoaGludCkge1xuICAgICAgcmV0dXJuIGNhbGwodmFsdWVPZiwgdGhpcyk7XG4gICAgfSwgeyBhcml0eTogMSB9KTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgU3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJyk7XG52YXIga2V5Rm9yID0gU3ltYm9sLmtleUZvcjtcbnZhciB0aGlzU3ltYm9sVmFsdWUgPSB1bmN1cnJ5VGhpcyhTeW1ib2wucHJvdG90eXBlLnZhbHVlT2YpO1xuXG4vLyBgU3ltYm9sLmlzUmVnaXN0ZXJlZFN5bWJvbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtc3ltYm9sLXByZWRpY2F0ZXMvI3NlYy1zeW1ib2wtaXNyZWdpc3RlcmVkc3ltYm9sXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbC5pc1JlZ2lzdGVyZWRTeW1ib2wgfHwgZnVuY3Rpb24gaXNSZWdpc3RlcmVkU3ltYm9sKHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGtleUZvcih0aGlzU3ltYm9sVmFsdWUodmFsdWUpKSAhPT0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xudmFyICRpc1dlbGxLbm93blN5bWJvbCA9IFN5bWJvbC5pc1dlbGxLbm93blN5bWJvbDtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0QnVpbHRJbignT2JqZWN0JywgJ2dldE93blByb3BlcnR5TmFtZXMnKTtcbnZhciB0aGlzU3ltYm9sVmFsdWUgPSB1bmN1cnJ5VGhpcyhTeW1ib2wucHJvdG90eXBlLnZhbHVlT2YpO1xudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG5cbmZvciAodmFyIGkgPSAwLCBzeW1ib2xLZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhTeW1ib2wpLCBzeW1ib2xLZXlzTGVuZ3RoID0gc3ltYm9sS2V5cy5sZW5ndGg7IGkgPCBzeW1ib2xLZXlzTGVuZ3RoOyBpKyspIHtcbiAgLy8gc29tZSBvbGQgZW5naW5lcyB0aHJvd3Mgb24gYWNjZXNzIHRvIHNvbWUga2V5cyBsaWtlIGBhcmd1bWVudHNgIG9yIGBjYWxsZXJgXG4gIHRyeSB7XG4gICAgdmFyIHN5bWJvbEtleSA9IHN5bWJvbEtleXNbaV07XG4gICAgaWYgKGlzU3ltYm9sKFN5bWJvbFtzeW1ib2xLZXldKSkgd2VsbEtub3duU3ltYm9sKHN5bWJvbEtleSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn1cblxuLy8gYFN5bWJvbC5pc1dlbGxLbm93blN5bWJvbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtc3ltYm9sLXByZWRpY2F0ZXMvI3NlYy1zeW1ib2wtaXN3ZWxsa25vd25zeW1ib2xcbi8vIFdlIHNob3VsZCBwYXRjaCBpdCBmb3IgbmV3bHkgYWRkZWQgd2VsbC1rbm93biBzeW1ib2xzLiBJZiBpdCdzIG5vdCByZXF1aXJlZCwgdGhpcyBtb2R1bGUganVzdCB3aWxsIG5vdCBiZSBpbmplY3RlZFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1dlbGxLbm93blN5bWJvbCh2YWx1ZSkge1xuICBpZiAoJGlzV2VsbEtub3duU3ltYm9sICYmICRpc1dlbGxLbm93blN5bWJvbCh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIHZhciBzeW1ib2wgPSB0aGlzU3ltYm9sVmFsdWUodmFsdWUpO1xuICAgIGZvciAodmFyIGogPSAwLCBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhXZWxsS25vd25TeW1ib2xzU3RvcmUpLCBrZXlzTGVuZ3RoID0ga2V5cy5sZW5ndGg7IGogPCBrZXlzTGVuZ3RoOyBqKyspIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXEgLS0gcG9seWZpbGxlZCBzeW1ib2xzIGNhc2VcbiAgICAgIGlmIChXZWxsS25vd25TeW1ib2xzU3RvcmVba2V5c1tqXV0gPT0gc3ltYm9sKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcblxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHNhZmUgKi9cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX1NZTUJPTCAmJiAhIVN5bWJvbFsnZm9yJ10gJiYgISFTeW1ib2wua2V5Rm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGgnKTtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcycpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcblxudmFyIHNldCA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXIgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIEZ1bmN0aW9uID0gZ2xvYmFsLkZ1bmN0aW9uO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciAkbG9jYXRpb24sIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xuXG5mYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIERlbm8gdGhyb3dzIGEgUmVmZXJlbmNlRXJyb3Igb24gYGxvY2F0aW9uYCBhY2Nlc3Mgd2l0aG91dCBgLS1sb2NhdGlvbmAgZmxhZ1xuICAkbG9jYXRpb24gPSBnbG9iYWwubG9jYXRpb247XG59KTtcblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICBpZiAoaGFzT3duKHF1ZXVlLCBpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcnVuKGlkKTtcbiAgfTtcbn07XG5cbnZhciBldmVudExpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bihldmVudC5kYXRhKTtcbn07XG5cbnZhciBnbG9iYWxQb3N0TWVzc2FnZURlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpblxuICBnbG9iYWwucG9zdE1lc3NhZ2UoU3RyaW5nKGlkKSwgJGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArICRsb2NhdGlvbi5ob3N0KTtcbn07XG5cbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0IHx8ICFjbGVhcikge1xuICBzZXQgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoaGFuZGxlcikge1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBmbiA9IGlzQ2FsbGFibGUoaGFuZGxlcikgPyBoYW5kbGVyIDogRnVuY3Rpb24oaGFuZGxlcik7XG4gICAgdmFyIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwcGx5KGZuLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKElTX05PREUpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgLy8gZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82MjRcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCAmJiAhSVNfSU9TKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZXZlbnRMaXN0ZW5lcjtcbiAgICBkZWZlciA9IGJpbmQocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKFxuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmXG4gICAgaXNDYWxsYWJsZShnbG9iYWwucG9zdE1lc3NhZ2UpICYmXG4gICAgIWdsb2JhbC5pbXBvcnRTY3JpcHRzICYmXG4gICAgJGxvY2F0aW9uICYmICRsb2NhdGlvbi5wcm90b2NvbCAhPT0gJ2ZpbGU6JyAmJlxuICAgICFmYWlscyhnbG9iYWxQb3N0TWVzc2FnZURlZmVyKVxuICApIHtcbiAgICBkZWZlciA9IGdsb2JhbFBvc3RNZXNzYWdlRGVmZXI7XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBldmVudExpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChydW5uZXIoaWQpLCAwKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgY2xlYXI6IGNsZWFyXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4oaW50ZWdlciwgbGVuZ3RoKS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0cnVuYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYXRoLXRydW5jJyk7XG5cbi8vIGBUb0ludGVnZXJPckluZmluaXR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9pbnRlZ2Vyb3JpbmZpbml0eVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIG51bWJlciA9ICthcmd1bWVudDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgcmV0dXJuIG51bWJlciAhPT0gbnVtYmVyIHx8IG51bWJlciA9PT0gMCA/IDAgOiB0cnVuYyhudW1iZXIpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGxlbiA9IHRvSW50ZWdlck9ySW5maW5pdHkoYXJndW1lbnQpO1xuICByZXR1cm4gbGVuID4gMCA/IG1pbihsZW4sIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxuLy8gYFRvT2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9vYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiAkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcbnZhciBvcmRpbmFyeVRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGV4b3RpY1RvUHJpbSA9IGdldE1ldGhvZChpbnB1dCwgVE9fUFJJTUlUSVZFKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGV4b3RpY1RvUHJpbSkge1xuICAgIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnZGVmYXVsdCc7XG4gICAgcmVzdWx0ID0gY2FsbChleG90aWNUb1ByaW0sIGlucHV0LCBwcmVmKTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlc3VsdCkgfHwgaXNTeW1ib2wocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbiAgfVxuICBpZiAocHJlZiA9PT0gdW5kZWZpbmVkKSBwcmVmID0gJ251bWJlcic7XG4gIHJldHVybiBvcmRpbmFyeVRvUHJpbWl0aXZlKGlucHV0LCBwcmVmKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG5cbi8vIGBUb1Byb3BlcnR5S2V5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9wcm9wZXJ0eWtleVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCAnc3RyaW5nJyk7XG4gIHJldHVybiBpc1N5bWJvbChrZXkpID8ga2V5IDoga2V5ICsgJyc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciB0ZXN0ID0ge307XG5cbnRlc3RbVE9fU1RSSU5HX1RBR10gPSAneic7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RyaW5nKHRlc3QpID09PSAnW29iamVjdCB6XSc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoY2xhc3NvZihhcmd1bWVudCkgPT09ICdTeW1ib2wnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZycpO1xuICByZXR1cm4gJFN0cmluZyhhcmd1bWVudCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRTdHJpbmcgPSBTdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICRTdHJpbmcoYXJndW1lbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAnT2JqZWN0JztcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIGlkID0gMDtcbnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTtcbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKDEuMC50b1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnICsgKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXkpICsgJylfJyArIHRvU3RyaW5nKCsraWQgKyBwb3N0Zml4LCAzNik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX1NZTUJPTFxuICAmJiAhU3ltYm9sLnNoYW1cbiAgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIFY4IH4gQ2hyb21lIDM2LVxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzMzNFxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdwcm90b3R5cGUnLCB7XG4gICAgdmFsdWU6IDQyLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KS5wcm90b3R5cGUgIT09IDQyO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocGFzc2VkLCByZXF1aXJlZCkge1xuICBpZiAocGFzc2VkIDwgcmVxdWlyZWQpIHRocm93IG5ldyAkVHlwZUVycm9yKCdOb3QgZW5vdWdoIGFyZ3VtZW50cycpO1xuICByZXR1cm4gcGFzc2VkO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQ2FsbGFibGUoV2Vha01hcCkgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFN0cmluZyhXZWFrTWFwKSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLXdyYXBwZWQnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSkge1xuICB2YXIgU3ltYm9sID0gcGF0aC5TeW1ib2wgfHwgKHBhdGguU3ltYm9sID0ge30pO1xuICBpZiAoIWhhc093bihTeW1ib2wsIE5BTUUpKSBkZWZpbmVQcm9wZXJ0eShTeW1ib2wsIE5BTUUsIHtcbiAgICB2YWx1ZTogd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKE5BTUUpXG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuZXhwb3J0cy5mID0gd2VsbEtub3duU3ltYm9sO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbFsnZm9yJ10gfHwgU3ltYm9sIDogU3ltYm9sICYmIFN5bWJvbC53aXRob3V0U2V0dGVyIHx8IHVpZDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICBpZiAoIWhhc093bihXZWxsS25vd25TeW1ib2xzU3RvcmUsIG5hbWUpKSB7XG4gICAgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gTkFUSVZFX1NZTUJPTCAmJiBoYXNPd24oU3ltYm9sLCBuYW1lKVxuICAgICAgPyBTeW1ib2xbbmFtZV1cbiAgICAgIDogY3JlYXRlV2VsbEtub3duU3ltYm9sKCdTeW1ib2wuJyArIG5hbWUpO1xuICB9IHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gYSBzdHJpbmcgb2YgYWxsIHZhbGlkIHVuaWNvZGUgd2hpdGVzcGFjZXNcbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyJyArXG4gICdcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBpbnN0YWxsRXJyb3JDYXVzZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnN0YWxsLWVycm9yLWNhdXNlJyk7XG52YXIgaW5zdGFsbEVycm9yU3RhY2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbCcpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgJEVycm9yID0gRXJyb3I7XG52YXIgcHVzaCA9IFtdLnB1c2g7XG5cbnZhciAkQWdncmVnYXRlRXJyb3IgPSBmdW5jdGlvbiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UgLyogLCBvcHRpb25zICovKSB7XG4gIHZhciBpc0luc3RhbmNlID0gaXNQcm90b3R5cGVPZihBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSwgdGhpcyk7XG4gIHZhciB0aGF0O1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICB0aGF0ID0gc2V0UHJvdG90eXBlT2YobmV3ICRFcnJvcigpLCBpc0luc3RhbmNlID8gZ2V0UHJvdG90eXBlT2YodGhpcykgOiBBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhhdCA9IGlzSW5zdGFuY2UgPyB0aGlzIDogY3JlYXRlKEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlKTtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGhhdCwgVE9fU1RSSU5HX1RBRywgJ0Vycm9yJyk7XG4gIH1cbiAgaWYgKG1lc3NhZ2UgIT09IHVuZGVmaW5lZCkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdtZXNzYWdlJywgbm9ybWFsaXplU3RyaW5nQXJndW1lbnQobWVzc2FnZSkpO1xuICBpbnN0YWxsRXJyb3JTdGFjayh0aGF0LCAkQWdncmVnYXRlRXJyb3IsIHRoYXQuc3RhY2ssIDEpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIGluc3RhbGxFcnJvckNhdXNlKHRoYXQsIGFyZ3VtZW50c1syXSk7XG4gIHZhciBlcnJvcnNBcnJheSA9IFtdO1xuICBpdGVyYXRlKGVycm9ycywgcHVzaCwgeyB0aGF0OiBlcnJvcnNBcnJheSB9KTtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdlcnJvcnMnLCBlcnJvcnNBcnJheSk7XG4gIHJldHVybiB0aGF0O1xufTtcblxuaWYgKHNldFByb3RvdHlwZU9mKSBzZXRQcm90b3R5cGVPZigkQWdncmVnYXRlRXJyb3IsICRFcnJvcik7XG5lbHNlIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoJEFnZ3JlZ2F0ZUVycm9yLCAkRXJyb3IsIHsgbmFtZTogdHJ1ZSB9KTtcblxudmFyIEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlID0gJEFnZ3JlZ2F0ZUVycm9yLnByb3RvdHlwZSA9IGNyZWF0ZSgkRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJEFnZ3JlZ2F0ZUVycm9yKSxcbiAgbWVzc2FnZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsICcnKSxcbiAgbmFtZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsICdBZ2dyZWdhdGVFcnJvcicpXG59KTtcblxuLy8gYEFnZ3JlZ2F0ZUVycm9yYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hZ2dyZWdhdGUtZXJyb3ItY29uc3RydWN0b3JcbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBhcml0eTogMiB9LCB7XG4gIEFnZ3JlZ2F0ZUVycm9yOiAkQWdncmVnYXRlRXJyb3Jcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbW9kdWxlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyByZXBsYWNlZCB0byBtb2R1bGUgYmVsb3dcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYWdncmVnYXRlLWVycm9yLmNvbnN0cnVjdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2VzLW5vdC1leGNlZWQtc2FmZS1pbnRlZ2VyJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG52YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIFY4X1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24nKTtcblxudmFyIElTX0NPTkNBVF9TUFJFQURBQkxFID0gd2VsbEtub3duU3ltYm9sKCdpc0NvbmNhdFNwcmVhZGFibGUnKTtcblxuLy8gV2UgY2FuJ3QgdXNlIHRoaXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzXG4vLyBkZW9wdGltaXphdGlvbiBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxudmFyIElTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQgPSBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBhcnJheSA9IFtdO1xuICBhcnJheVtJU19DT05DQVRfU1BSRUFEQUJMRV0gPSBmYWxzZTtcbiAgcmV0dXJuIGFycmF5LmNvbmNhdCgpWzBdICE9PSBhcnJheTtcbn0pO1xuXG52YXIgaXNDb25jYXRTcHJlYWRhYmxlID0gZnVuY3Rpb24gKE8pIHtcbiAgaWYgKCFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgc3ByZWFkYWJsZSA9IE9bSVNfQ09OQ0FUX1NQUkVBREFCTEVdO1xuICByZXR1cm4gc3ByZWFkYWJsZSAhPT0gdW5kZWZpbmVkID8gISFzcHJlYWRhYmxlIDogaXNBcnJheShPKTtcbn07XG5cbnZhciBGT1JDRUQgPSAhSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCB8fCAhYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnY29uY2F0Jyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuY29uY2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmNvbmNhdFxuLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQGlzQ29uY2F0U3ByZWFkYWJsZSBhbmQgQEBzcGVjaWVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgYXJpdHk6IDEsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgY29uY2F0OiBmdW5jdGlvbiBjb25jYXQoYXJnKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGksIGssIGxlbmd0aCwgbGVuLCBFO1xuICAgIGZvciAoaSA9IC0xLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIEUgPSBpID09PSAtMSA/IE8gOiBhcmd1bWVudHNbaV07XG4gICAgICBpZiAoaXNDb25jYXRTcHJlYWRhYmxlKEUpKSB7XG4gICAgICAgIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKEUpO1xuICAgICAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobiArIGxlbik7XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBsZW47IGsrKywgbisrKSBpZiAoayBpbiBFKSBjcmVhdGVQcm9wZXJ0eShBLCBuLCBFW2tdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlcihuICsgMSk7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KEEsIG4rKywgRSk7XG4gICAgICB9XG4gICAgfVxuICAgIEEubGVuZ3RoID0gbjtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZXZlcnkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZXZlcnk7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG5cbnZhciBTVFJJQ1RfTUVUSE9EID0gYXJyYXlNZXRob2RJc1N0cmljdCgnZXZlcnknKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5ldmVyeVxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIVNUUklDVF9NRVRIT0QgfSwge1xuICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJGV2ZXJ5KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZmlsdGVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZpbHRlcjtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0Jyk7XG5cbnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnZmlsdGVyJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFIQVNfU1BFQ0lFU19TVVBQT1JUIH0sIHtcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJGZpbHRlcih0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGZpbmRJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5maW5kSW5kZXg7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcblxudmFyIEZJTkRfSU5ERVggPSAnZmluZEluZGV4JztcbnZhciBTS0lQU19IT0xFUyA9IHRydWU7XG5cbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWZpbmRpbmRleCAtLSB0ZXN0aW5nXG5pZiAoRklORF9JTkRFWCBpbiBbXSkgQXJyYXkoMSlbRklORF9JTkRFWF0oZnVuY3Rpb24gKCkgeyBTS0lQU19IT0xFUyA9IGZhbHNlOyB9KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZGluZGV4XG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTS0lQU19IT0xFUyB9LCB7XG4gIGZpbmRJbmRleDogZnVuY3Rpb24gZmluZEluZGV4KGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kSW5kZXgodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcyhGSU5EX0lOREVYKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZpbmQ7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcblxudmFyIEZJTkQgPSAnZmluZCc7XG52YXIgU0tJUFNfSE9MRVMgPSB0cnVlO1xuXG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LXByb3RvdHlwZS1maW5kIC0tIHRlc3RpbmdcbmlmIChGSU5EIGluIFtdKSBBcnJheSgxKVtGSU5EXShmdW5jdGlvbiAoKSB7IFNLSVBTX0hPTEVTID0gZmFsc2U7IH0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogU0tJUFNfSE9MRVMgfSwge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoRklORCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWZvcmVhY2ggLS0gc2FmZVxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogW10uZm9yRWFjaCAhPT0gZm9yRWFjaCB9LCB7XG4gIGZvckVhY2g6IGZvckVhY2hcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgZnJvbTogZnJvbVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkaW5jbHVkZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmNsdWRlcztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG5cbi8vIEZGOTkrIGJ1Z1xudmFyIEJST0tFTl9PTl9TUEFSU0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1wcm90b3R5cGUtaW5jbHVkZXMgLS0gZGV0ZWN0aW9uXG4gIHJldHVybiAhQXJyYXkoMSkuaW5jbHVkZXMoKTtcbn0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCUk9LRU5fT05fU1BBUlNFIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1hcnJheS1wcm90b3R5cGUtaW5kZXhvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZScpO1xudmFyICRpbmRleE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJykuaW5kZXhPZjtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcblxudmFyIG5hdGl2ZUluZGV4T2YgPSB1bmN1cnJ5VGhpcyhbXS5pbmRleE9mKTtcblxudmFyIE5FR0FUSVZFX1pFUk8gPSAhIW5hdGl2ZUluZGV4T2YgJiYgMSAvIG5hdGl2ZUluZGV4T2YoWzFdLCAxLCAtMCkgPCAwO1xudmFyIEZPUkNFRCA9IE5FR0FUSVZFX1pFUk8gfHwgIWFycmF5TWV0aG9kSXNTdHJpY3QoJ2luZGV4T2YnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICB2YXIgZnJvbUluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE5FR0FUSVZFX1pFUk9cbiAgICAgIC8vIGNvbnZlcnQgLTAgdG8gKzBcbiAgICAgID8gbmF0aXZlSW5kZXhPZih0aGlzLCBzZWFyY2hFbGVtZW50LCBmcm9tSW5kZXgpIHx8IDBcbiAgICAgIDogJGluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgZnJvbUluZGV4KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG5cbi8vIGBBcnJheS5pc0FycmF5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuaXNhcnJheVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzQXJyYXk6IGlzQXJyYXlcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUnKTtcbnZhciBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgQVJSQVlfSVRFUkFUT1IgPSAnQXJyYXkgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoQVJSQVlfSVRFUkFUT1IpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZW50cmllc1xuLy8gYEFycmF5LnByb3RvdHlwZS5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnZhbHVlc1xuLy8gYEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4vLyBgQ3JlYXRlQXJyYXlJdGVyYXRvcmAgaW50ZXJuYWwgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVhcnJheWl0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciB0YXJnZXQgPSBzdGF0ZS50YXJnZXQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuICBzd2l0Y2ggKHN0YXRlLmtpbmQpIHtcbiAgICBjYXNlICdrZXlzJzogcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QoaW5kZXgsIGZhbHNlKTtcbiAgICBjYXNlICd2YWx1ZXMnOiByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdCh0YXJnZXRbaW5kZXhdLCBmYWxzZSk7XG4gIH0gcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QoW2luZGV4LCB0YXJnZXRbaW5kZXhdXSwgZmFsc2UpO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRldW5tYXBwZWRhcmd1bWVudHNvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlbWFwcGVkYXJndW1lbnRzb2JqZWN0XG52YXIgdmFsdWVzID0gSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG5cbi8vIFY4IH4gQ2hyb21lIDQ1LSBidWdcbmlmICghSVNfUFVSRSAmJiBERVNDUklQVE9SUyAmJiB2YWx1ZXMubmFtZSAhPT0gJ3ZhbHVlcycpIHRyeSB7XG4gIGRlZmluZVByb3BlcnR5KHZhbHVlcywgJ25hbWUnLCB7IHZhbHVlOiAndmFsdWVzJyB9KTtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRtYXAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykubWFwO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcblxudmFyIEhBU19TUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdtYXAnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAc3BlY2llc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfSwge1xuICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkbWFwKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkcmVkdWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXJlZHVjZScpLmxlZnQ7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG52YXIgQ0hST01FX1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24nKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG5cbi8vIENocm9tZSA4MC04MiBoYXMgYSBjcml0aWNhbCBidWdcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwNDk5ODJcbnZhciBDSFJPTUVfQlVHID0gIUlTX05PREUgJiYgQ0hST01FX1ZFUlNJT04gPiA3OSAmJiBDSFJPTUVfVkVSU0lPTiA8IDgzO1xudmFyIEZPUkNFRCA9IENIUk9NRV9CVUcgfHwgIWFycmF5TWV0aG9kSXNTdHJpY3QoJ3JlZHVjZScpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICByZXR1cm4gJHJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBsZW5ndGgsIGxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0Jyk7XG52YXIgbmF0aXZlU2xpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2UnKTtcblxudmFyIEhBU19TUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdzbGljZScpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyICRBcnJheSA9IEFycmF5O1xudmFyIG1heCA9IE1hdGgubWF4O1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnNsaWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNsaWNlXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2UgRVMzIHN0cmluZ3MgYW5kIERPTSBvYmplY3RzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhSEFTX1NQRUNJRVNfU1VQUE9SVCB9LCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBrID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW5ndGgpO1xuICAgIHZhciBmaW4gPSB0b0Fic29sdXRlSW5kZXgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQsIGxlbmd0aCk7XG4gICAgLy8gaW5saW5lIGBBcnJheVNwZWNpZXNDcmVhdGVgIGZvciB1c2FnZSBuYXRpdmUgYEFycmF5I3NsaWNlYCB3aGVyZSBpdCdzIHBvc3NpYmxlXG4gICAgdmFyIENvbnN0cnVjdG9yLCByZXN1bHQsIG47XG4gICAgaWYgKGlzQXJyYXkoTykpIHtcbiAgICAgIENvbnN0cnVjdG9yID0gTy5jb25zdHJ1Y3RvcjtcbiAgICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgICBpZiAoaXNDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvcikgJiYgKENvbnN0cnVjdG9yID09PSAkQXJyYXkgfHwgaXNBcnJheShDb25zdHJ1Y3Rvci5wcm90b3R5cGUpKSkge1xuICAgICAgICBDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoQ29uc3RydWN0b3IpKSB7XG4gICAgICAgIENvbnN0cnVjdG9yID0gQ29uc3RydWN0b3JbU1BFQ0lFU107XG4gICAgICAgIGlmIChDb25zdHJ1Y3RvciA9PT0gbnVsbCkgQ29uc3RydWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoQ29uc3RydWN0b3IgPT09ICRBcnJheSB8fCBDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVTbGljZShPLCBrLCBmaW4pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQgPSBuZXcgKENvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgPyAkQXJyYXkgOiBDb25zdHJ1Y3RvcikobWF4KGZpbiAtIGssIDApKTtcbiAgICBmb3IgKG4gPSAwOyBrIDwgZmluOyBrKyssIG4rKykgaWYgKGsgaW4gTykgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBuLCBPW2tdKTtcbiAgICByZXN1bHQubGVuZ3RoID0gbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBkZWxldGVQcm9wZXJ0eU9yVGhyb3cgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpbnRlcm5hbFNvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc29ydCcpO1xudmFyIGFycmF5TWV0aG9kSXNTdHJpY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdCcpO1xudmFyIEZGID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1mZi12ZXJzaW9uJyk7XG52YXIgSUVfT1JfRURHRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZScpO1xudmFyIFY4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG52YXIgV0VCS0lUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbicpO1xuXG52YXIgdGVzdCA9IFtdO1xudmFyIG5hdGl2ZVNvcnQgPSB1bmN1cnJ5VGhpcyh0ZXN0LnNvcnQpO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyh0ZXN0LnB1c2gpO1xuXG4vLyBJRTgtXG52YXIgRkFJTFNfT05fVU5ERUZJTkVEID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICB0ZXN0LnNvcnQodW5kZWZpbmVkKTtcbn0pO1xuLy8gVjggYnVnXG52YXIgRkFJTFNfT05fTlVMTCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdGVzdC5zb3J0KG51bGwpO1xufSk7XG4vLyBPbGQgV2ViS2l0XG52YXIgU1RSSUNUX01FVEhPRCA9IGFycmF5TWV0aG9kSXNTdHJpY3QoJ3NvcnQnKTtcblxudmFyIFNUQUJMRV9TT1JUID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZmVhdHVyZSBkZXRlY3Rpb24gY2FuIGJlIHRvbyBzbG93LCBzbyBjaGVjayBlbmdpbmVzIHZlcnNpb25zXG4gIGlmIChWOCkgcmV0dXJuIFY4IDwgNzA7XG4gIGlmIChGRiAmJiBGRiA+IDMpIHJldHVybjtcbiAgaWYgKElFX09SX0VER0UpIHJldHVybiB0cnVlO1xuICBpZiAoV0VCS0lUKSByZXR1cm4gV0VCS0lUIDwgNjAzO1xuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgdmFyIGNvZGUsIGNociwgdmFsdWUsIGluZGV4O1xuXG4gIC8vIGdlbmVyYXRlIGFuIGFycmF5IHdpdGggbW9yZSA1MTIgZWxlbWVudHMgKENoYWtyYSBhbmQgb2xkIFY4IGZhaWxzIG9ubHkgaW4gdGhpcyBjYXNlKVxuICBmb3IgKGNvZGUgPSA2NTsgY29kZSA8IDc2OyBjb2RlKyspIHtcbiAgICBjaHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuXG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlIDY2OiBjYXNlIDY5OiBjYXNlIDcwOiBjYXNlIDcyOiB2YWx1ZSA9IDM7IGJyZWFrO1xuICAgICAgY2FzZSA2ODogY2FzZSA3MTogdmFsdWUgPSA0OyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHZhbHVlID0gMjtcbiAgICB9XG5cbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0NzsgaW5kZXgrKykge1xuICAgICAgdGVzdC5wdXNoKHsgazogY2hyICsgaW5kZXgsIHY6IHZhbHVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRlc3Quc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi52IC0gYS52OyB9KTtcblxuICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0ZXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNociA9IHRlc3RbaW5kZXhdLmsuY2hhckF0KDApO1xuICAgIGlmIChyZXN1bHQuY2hhckF0KHJlc3VsdC5sZW5ndGggLSAxKSAhPT0gY2hyKSByZXN1bHQgKz0gY2hyO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCAhPT0gJ0RHQkVGSEFDSUpLJztcbn0pO1xuXG52YXIgRk9SQ0VEID0gRkFJTFNfT05fVU5ERUZJTkVEIHx8ICFGQUlMU19PTl9OVUxMIHx8ICFTVFJJQ1RfTUVUSE9EIHx8ICFTVEFCTEVfU09SVDtcblxudmFyIGdldFNvcnRDb21wYXJlID0gZnVuY3Rpb24gKGNvbXBhcmVmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gLTE7XG4gICAgaWYgKHggPT09IHVuZGVmaW5lZCkgcmV0dXJuIDE7XG4gICAgaWYgKGNvbXBhcmVmbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gK2NvbXBhcmVmbih4LCB5KSB8fCAwO1xuICAgIHJldHVybiB0b1N0cmluZyh4KSA+IHRvU3RyaW5nKHkpID8gMSA6IC0xO1xuICB9O1xufTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5zb3J0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvcnRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7XG4gICAgaWYgKGNvbXBhcmVmbiAhPT0gdW5kZWZpbmVkKSBhQ2FsbGFibGUoY29tcGFyZWZuKTtcblxuICAgIHZhciBhcnJheSA9IHRvT2JqZWN0KHRoaXMpO1xuXG4gICAgaWYgKFNUQUJMRV9TT1JUKSByZXR1cm4gY29tcGFyZWZuID09PSB1bmRlZmluZWQgPyBuYXRpdmVTb3J0KGFycmF5KSA6IG5hdGl2ZVNvcnQoYXJyYXksIGNvbXBhcmVmbik7XG5cbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB2YXIgYXJyYXlMZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShhcnJheSk7XG4gICAgdmFyIGl0ZW1zTGVuZ3RoLCBpbmRleDtcblxuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGFycmF5TGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoaW5kZXggaW4gYXJyYXkpIHB1c2goaXRlbXMsIGFycmF5W2luZGV4XSk7XG4gICAgfVxuXG4gICAgaW50ZXJuYWxTb3J0KGl0ZW1zLCBnZXRTb3J0Q29tcGFyZShjb21wYXJlZm4pKTtcblxuICAgIGl0ZW1zTGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoaXRlbXMpO1xuICAgIGluZGV4ID0gMDtcblxuICAgIHdoaWxlIChpbmRleCA8IGl0ZW1zTGVuZ3RoKSBhcnJheVtpbmRleF0gPSBpdGVtc1tpbmRleCsrXTtcbiAgICB3aGlsZSAoaW5kZXggPCBhcnJheUxlbmd0aCkgZGVsZXRlUHJvcGVydHlPclRocm93KGFycmF5LCBpbmRleCsrKTtcblxuICAgIHJldHVybiBhcnJheTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIHNldEFycmF5TGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGgnKTtcbnZhciBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlcicpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWxldGUtcHJvcGVydHktb3ItdGhyb3cnKTtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0Jyk7XG5cbnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnc3BsaWNlJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc3BsaWNlXG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAc3BlY2llc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfSwge1xuICBzcGxpY2U6IGZ1bmN0aW9uIHNwbGljZShzdGFydCwgZGVsZXRlQ291bnQgLyogLCAuLi5pdGVtcyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBhY3R1YWxTdGFydCA9IHRvQWJzb2x1dGVJbmRleChzdGFydCwgbGVuKTtcbiAgICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgaW5zZXJ0Q291bnQsIGFjdHVhbERlbGV0ZUNvdW50LCBBLCBrLCBmcm9tLCB0bztcbiAgICBpZiAoYXJndW1lbnRzTGVuZ3RoID09PSAwKSB7XG4gICAgICBpbnNlcnRDb3VudCA9IGFjdHVhbERlbGV0ZUNvdW50ID0gMDtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50c0xlbmd0aCA9PT0gMSkge1xuICAgICAgaW5zZXJ0Q291bnQgPSAwO1xuICAgICAgYWN0dWFsRGVsZXRlQ291bnQgPSBsZW4gLSBhY3R1YWxTdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zZXJ0Q291bnQgPSBhcmd1bWVudHNMZW5ndGggLSAyO1xuICAgICAgYWN0dWFsRGVsZXRlQ291bnQgPSBtaW4obWF4KHRvSW50ZWdlck9ySW5maW5pdHkoZGVsZXRlQ291bnQpLCAwKSwgbGVuIC0gYWN0dWFsU3RhcnQpO1xuICAgIH1cbiAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobGVuICsgaW5zZXJ0Q291bnQgLSBhY3R1YWxEZWxldGVDb3VudCk7XG4gICAgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCBhY3R1YWxEZWxldGVDb3VudCk7XG4gICAgZm9yIChrID0gMDsgayA8IGFjdHVhbERlbGV0ZUNvdW50OyBrKyspIHtcbiAgICAgIGZyb20gPSBhY3R1YWxTdGFydCArIGs7XG4gICAgICBpZiAoZnJvbSBpbiBPKSBjcmVhdGVQcm9wZXJ0eShBLCBrLCBPW2Zyb21dKTtcbiAgICB9XG4gICAgQS5sZW5ndGggPSBhY3R1YWxEZWxldGVDb3VudDtcbiAgICBpZiAoaW5zZXJ0Q291bnQgPCBhY3R1YWxEZWxldGVDb3VudCkge1xuICAgICAgZm9yIChrID0gYWN0dWFsU3RhcnQ7IGsgPCBsZW4gLSBhY3R1YWxEZWxldGVDb3VudDsgaysrKSB7XG4gICAgICAgIGZyb20gPSBrICsgYWN0dWFsRGVsZXRlQ291bnQ7XG4gICAgICAgIHRvID0gayArIGluc2VydENvdW50O1xuICAgICAgICBpZiAoZnJvbSBpbiBPKSBPW3RvXSA9IE9bZnJvbV07XG4gICAgICAgIGVsc2UgZGVsZXRlUHJvcGVydHlPclRocm93KE8sIHRvKTtcbiAgICAgIH1cbiAgICAgIGZvciAoayA9IGxlbjsgayA+IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50ICsgaW5zZXJ0Q291bnQ7IGstLSkgZGVsZXRlUHJvcGVydHlPclRocm93KE8sIGsgLSAxKTtcbiAgICB9IGVsc2UgaWYgKGluc2VydENvdW50ID4gYWN0dWFsRGVsZXRlQ291bnQpIHtcbiAgICAgIGZvciAoayA9IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50OyBrID4gYWN0dWFsU3RhcnQ7IGstLSkge1xuICAgICAgICBmcm9tID0gayArIGFjdHVhbERlbGV0ZUNvdW50IC0gMTtcbiAgICAgICAgdG8gPSBrICsgaW5zZXJ0Q291bnQgLSAxO1xuICAgICAgICBpZiAoZnJvbSBpbiBPKSBPW3RvXSA9IE9bZnJvbV07XG4gICAgICAgIGVsc2UgZGVsZXRlUHJvcGVydHlPclRocm93KE8sIHRvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChrID0gMDsgayA8IGluc2VydENvdW50OyBrKyspIHtcbiAgICAgIE9bayArIGFjdHVhbFN0YXJ0XSA9IGFyZ3VtZW50c1trICsgMl07XG4gICAgfVxuICAgIHNldEFycmF5TGVuZ3RoKE8sIGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50ICsgaW5zZXJ0Q291bnQpO1xuICAgIHJldHVybiBBO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIHRvSVNPU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RhdGUtdG8taXNvLXN0cmluZycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IERhdGUoTmFOKS50b0pTT04oKSAhPT0gbnVsbFxuICAgIHx8IGNhbGwoRGF0ZS5wcm90b3R5cGUudG9KU09OLCB7IHRvSVNPU3RyaW5nOiBmdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9IH0pICE9PSAxO1xufSk7XG5cbi8vIGBEYXRlLnByb3RvdHlwZS50b0pTT05gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1kYXRlLnByb3RvdHlwZS50b2pzb25cbiQoeyB0YXJnZXQ6ICdEYXRlJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oa2V5KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgcHYgPSB0b1ByaW1pdGl2ZShPLCAnbnVtYmVyJyk7XG4gICAgcmV0dXJuIHR5cGVvZiBwdiA9PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUocHYpID8gbnVsbCA6XG4gICAgICAoISgndG9JU09TdHJpbmcnIGluIE8pICYmIGNsYXNzb2YoTykgPT09ICdEYXRlJykgPyBjYWxsKHRvSVNPU3RyaW5nLCBPKSA6IE8udG9JU09TdHJpbmcoKTtcbiAgfVxufSk7XG4iLCIvLyBlbXB0eVxuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZCcpO1xuXG4vLyBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYmluZFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWZ1bmN0aW9uLXByb3RvdHlwZS1iaW5kIC0tIGRldGVjdGlvblxuJCh7IHRhcmdldDogJ0Z1bmN0aW9uJywgcHJvdG86IHRydWUsIGZvcmNlZDogRnVuY3Rpb24uYmluZCAhPT0gYmluZCB9LCB7XG4gIGJpbmQ6IGJpbmRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xudmFyIGFycmF5U2xpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2UnKTtcbnZhciBnZXRSZXBsYWNlckZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1qc29uLXJlcGxhY2VyLWZ1bmN0aW9uJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcygvLi8uZXhlYyk7XG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBjaGFyQ29kZUF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckNvZGVBdCk7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIG51bWJlclRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxudmFyIHRlc3RlciA9IC9bXFx1RDgwMC1cXHVERkZGXS9nO1xudmFyIGxvdyA9IC9eW1xcdUQ4MDAtXFx1REJGRl0kLztcbnZhciBoaSA9IC9eW1xcdURDMDAtXFx1REZGRl0kLztcblxudmFyIFdST05HX1NZTUJPTFNfQ09OVkVSU0lPTiA9ICFOQVRJVkVfU1lNQk9MIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpKCdzdHJpbmdpZnkgZGV0ZWN0aW9uJyk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIHJldHVybiAkc3RyaW5naWZ5KFtzeW1ib2xdKSAhPT0gJ1tudWxsXSdcbiAgICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgICB8fCAkc3RyaW5naWZ5KHsgYTogc3ltYm9sIH0pICE9PSAne30nXG4gICAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgICB8fCAkc3RyaW5naWZ5KE9iamVjdChzeW1ib2wpKSAhPT0gJ3t9Jztcbn0pO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC13ZWxsLWZvcm1lZC1zdHJpbmdpZnlcbnZhciBJTExfRk9STUVEX1VOSUNPREUgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAkc3RyaW5naWZ5KCdcXHVERjA2XFx1RDgzNCcpICE9PSAnXCJcXFxcdWRmMDZcXFxcdWQ4MzRcIidcbiAgICB8fCAkc3RyaW5naWZ5KCdcXHVERUFEJykgIT09ICdcIlxcXFx1ZGVhZFwiJztcbn0pO1xuXG52YXIgc3RyaW5naWZ5V2l0aFN5bWJvbHNGaXggPSBmdW5jdGlvbiAoaXQsIHJlcGxhY2VyKSB7XG4gIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMpO1xuICB2YXIgJHJlcGxhY2VyID0gZ2V0UmVwbGFjZXJGdW5jdGlvbihyZXBsYWNlcik7XG4gIGlmICghaXNDYWxsYWJsZSgkcmVwbGFjZXIpICYmIChpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICBhcmdzWzFdID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAvLyBzb21lIG9sZCBpbXBsZW1lbnRhdGlvbnMgKGxpa2UgV2ViS2l0KSBjb3VsZCBwYXNzIG51bWJlcnMgYXMga2V5c1xuICAgIGlmIChpc0NhbGxhYmxlKCRyZXBsYWNlcikpIHZhbHVlID0gY2FsbCgkcmVwbGFjZXIsIHRoaXMsICRTdHJpbmcoa2V5KSwgdmFsdWUpO1xuICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIH07XG4gIHJldHVybiBhcHBseSgkc3RyaW5naWZ5LCBudWxsLCBhcmdzKTtcbn07XG5cbnZhciBmaXhJbGxGb3JtZWQgPSBmdW5jdGlvbiAobWF0Y2gsIG9mZnNldCwgc3RyaW5nKSB7XG4gIHZhciBwcmV2ID0gY2hhckF0KHN0cmluZywgb2Zmc2V0IC0gMSk7XG4gIHZhciBuZXh0ID0gY2hhckF0KHN0cmluZywgb2Zmc2V0ICsgMSk7XG4gIGlmICgoZXhlYyhsb3csIG1hdGNoKSAmJiAhZXhlYyhoaSwgbmV4dCkpIHx8IChleGVjKGhpLCBtYXRjaCkgJiYgIWV4ZWMobG93LCBwcmV2KSkpIHtcbiAgICByZXR1cm4gJ1xcXFx1JyArIG51bWJlclRvU3RyaW5nKGNoYXJDb2RlQXQobWF0Y2gsIDApLCAxNik7XG4gIH0gcmV0dXJuIG1hdGNoO1xufTtcblxuaWYgKCRzdHJpbmdpZnkpIHtcbiAgLy8gYEpTT04uc3RyaW5naWZ5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnN0cmluZ2lmeVxuICAkKHsgdGFyZ2V0OiAnSlNPTicsIHN0YXQ6IHRydWUsIGFyaXR5OiAzLCBmb3JjZWQ6IFdST05HX1NZTUJPTFNfQ09OVkVSU0lPTiB8fCBJTExfRk9STUVEX1VOSUNPREUgfSwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICAgICAgdmFyIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cyk7XG4gICAgICB2YXIgcmVzdWx0ID0gYXBwbHkoV1JPTkdfU1lNQk9MU19DT05WRVJTSU9OID8gc3RyaW5naWZ5V2l0aFN5bWJvbHNGaXggOiAkc3RyaW5naWZ5LCBudWxsLCBhcmdzKTtcbiAgICAgIHJldHVybiBJTExfRk9STUVEX1VOSUNPREUgJiYgdHlwZW9mIHJlc3VsdCA9PSAnc3RyaW5nJyA/IHJlcGxhY2UocmVzdWx0LCB0ZXN0ZXIsIGZpeElsbEZvcm1lZCkgOiByZXN1bHQ7XG4gICAgfVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcblxuLy8gSlNPTltAQHRvU3RyaW5nVGFnXSBwcm9wZXJ0eVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLUBAdG9zdHJpbmd0YWdcbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25TdHJvbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gYE1hcGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLW9iamVjdHNcbmNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgTWFwSGVscGVycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYXAtaGVscGVycycpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBNYXAgPSBNYXBIZWxwZXJzLk1hcDtcbnZhciBoYXMgPSBNYXBIZWxwZXJzLmhhcztcbnZhciBnZXQgPSBNYXBIZWxwZXJzLmdldDtcbnZhciBzZXQgPSBNYXBIZWxwZXJzLnNldDtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbnZhciBET0VTX05PVF9XT1JLX1dJVEhfUFJJTUlUSVZFUyA9IElTX1BVUkUgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWFwLmdyb3VwQnkoJ2FiJywgZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGl0O1xuICB9KS5nZXQoJ2EnKS5sZW5ndGggIT09IDE7XG59KTtcblxuLy8gYE1hcC5ncm91cEJ5YCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFycmF5LWdyb3VwaW5nXG4kKHsgdGFyZ2V0OiAnTWFwJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IERPRVNfTk9UX1dPUktfV0lUSF9QUklNSVRJVkVTIH0sIHtcbiAgZ3JvdXBCeTogZnVuY3Rpb24gZ3JvdXBCeShpdGVtcywgY2FsbGJhY2tmbikge1xuICAgIHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXRlbXMpO1xuICAgIGFDYWxsYWJsZShjYWxsYmFja2ZuKTtcbiAgICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICAgIHZhciBrID0gMDtcbiAgICBpdGVyYXRlKGl0ZW1zLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHZhciBrZXkgPSBjYWxsYmFja2ZuKHZhbHVlLCBrKyspO1xuICAgICAgaWYgKCFoYXMobWFwLCBrZXkpKSBzZXQobWFwLCBrZXksIFt2YWx1ZV0pO1xuICAgICAgZWxzZSBwdXNoKGdldChtYXAsIGtleSksIHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm1hcC5jb25zdHJ1Y3RvcicpO1xuIiwiLy8gZW1wdHlcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzSW50ZWdyYWxOdW1iZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyJyk7XG5cbi8vIGBOdW1iZXIuaXNJbnRlZ2VyYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzaW50ZWdlclxuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwge1xuICBpc0ludGVnZXI6IGlzSW50ZWdyYWxOdW1iZXJcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24nKTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWFzc2lnbiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGFyaXR5OiAyLCBmb3JjZWQ6IE9iamVjdC5hc3NpZ24gIT09IGFzc2lnbiB9LCB7XG4gIGFzc2lnbjogYXNzaWduXG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG5cbi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZVxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIGNyZWF0ZTogY3JlYXRlXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogT2JqZWN0LmRlZmluZVByb3BlcnR5ICE9PSBkZWZpbmVQcm9wZXJ0eSwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHtcbiAgZGVmaW5lUHJvcGVydHk6IGRlZmluZVByb3BlcnR5XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheScpLmVudHJpZXM7XG5cbi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoTykge1xuICAgIHJldHVybiAkZW50cmllcyhPKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBGUkVFWklORyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mcmVlemluZycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgb25GcmVlemUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5vbkZyZWV6ZTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1mcmVlemUgLS0gc2FmZVxudmFyICRmcmVlemUgPSBPYmplY3QuZnJlZXplO1xudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7ICRmcmVlemUoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmZyZWV6ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5mcmVlemVcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMsIHNoYW06ICFGUkVFWklORyB9LCB7XG4gIGZyZWV6ZTogZnVuY3Rpb24gZnJlZXplKGl0KSB7XG4gICAgcmV0dXJuICRmcmVlemUgJiYgaXNPYmplY3QoaXQpID8gJGZyZWV6ZShvbkZyZWV6ZShpdCkpIDogaXQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcblxudmFyIEZPUkNFRCA9ICFERVNDUklQVE9SUyB8fCBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcigxKTsgfSk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VELCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gICAgcmV0dXJuIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcih0b0luZGV4ZWRPYmplY3QoaXQpLCBrZXkpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcblxuLy8gVjggfiBDaHJvbWUgMzggYW5kIDM5IGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBmYWlscyBvbiBwcmltaXRpdmVzXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNDQzXG52YXIgRk9SQ0VEID0gIU5BVElWRV9TWU1CT0wgfHwgZmFpbHMoZnVuY3Rpb24gKCkgeyBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZigxKTsgfSk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5c3ltYm9sc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgICB2YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gJGdldE93blByb3BlcnR5U3ltYm9scyh0b09iamVjdChpdCkpIDogW107XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBuYXRpdmVHZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUdldFByb3RvdHlwZU9mKDEpOyB9KTtcblxuLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRwcm90b3R5cGVvZlxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUywgc2hhbTogIUNPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiB9LCB7XG4gIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiBuYXRpdmVHZXRQcm90b3R5cGVPZih0b09iamVjdChpdCkpO1xuICB9XG59KTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVLZXlzKDEpOyB9KTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMgfSwge1xuICBrZXlzOiBmdW5jdGlvbiBrZXlzKGl0KSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXModG9PYmplY3QoaXQpKTtcbiAgfVxufSk7XG4iLCIvLyBlbXB0eVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQnKTtcblxuLy8gYHBhcnNlSW50YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4XG4kKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IHBhcnNlSW50ICE9PSAkcGFyc2VJbnQgfSwge1xuICBwYXJzZUludDogJHBhcnNlSW50XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uJyk7XG5cbi8vIGBQcm9taXNlLmFsbFNldHRsZWRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbHNldHRsZWRcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGFsbFNldHRsZWQ6IGZ1bmN0aW9uIGFsbFNldHRsZWQoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgY2FsbChwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB7IHN0YXR1czogJ2Z1bGZpbGxlZCcsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdyZWplY3RlZCcsIHJlYXNvbjogZXJyb3IgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbicpO1xuXG4vLyBgUHJvbWlzZS5hbGxgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwoJHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbicpO1xuXG52YXIgUFJPTUlTRV9BTllfRVJST1IgPSAnTm8gb25lIHByb21pc2UgcmVzb2x2ZWQnO1xuXG4vLyBgUHJvbWlzZS5hbnlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFueVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgYW55OiBmdW5jdGlvbiBhbnkoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIEFnZ3JlZ2F0ZUVycm9yID0gZ2V0QnVpbHRJbignQWdncmVnYXRlRXJyb3InKTtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICB2YXIgYWxyZWFkeVJlc29sdmVkID0gZmFsc2U7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5UmVqZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwocHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlSZWplY3RlZCB8fCBhbHJlYWR5UmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5UmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgZXJyb3JzW2luZGV4XSA9IGVycm9yO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIFBST01JU0VfQU5ZX0VSUk9SKSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpLkNPTlNUUlVDVE9SO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvcicpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG5cbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmNhdGNoXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SLCByZWFsOiB0cnVlIH0sIHtcbiAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gIH1cbn0pO1xuXG4vLyBtYWtlcyBzdXJlIHRoYXQgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJcyBgUHJvbWlzZSNjYXRjaGAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG5pZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IpKSB7XG4gIHZhciBtZXRob2QgPSBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydjYXRjaCddO1xuICBpZiAoTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnY2F0Y2gnXSAhPT0gbWV0aG9kKSB7XG4gICAgZGVmaW5lQnVpbHRJbihOYXRpdmVQcm9taXNlUHJvdG90eXBlLCAnY2F0Y2gnLCBtZXRob2QsIHsgdW5zYWZlOiB0cnVlIH0pO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21pY3JvdGFzaycpO1xudmFyIGhvc3RSZXBvcnRFcnJvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzJyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgUXVldWUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcXVldWUnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yJyk7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IFByb21pc2VDb25zdHJ1Y3RvckRldGVjdGlvbi5DT05TVFJVQ1RPUjtcbnZhciBOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQgPSBQcm9taXNlQ29uc3RydWN0b3JEZXRlY3Rpb24uUkVKRUNUSU9OX0VWRU5UO1xudmFyIE5BVElWRV9QUk9NSVNFX1NVQkNMQVNTSU5HID0gUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uLlNVQkNMQVNTSU5HO1xudmFyIGdldEludGVybmFsUHJvbWlzZVN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoUFJPTUlTRSk7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIE5hdGl2ZVByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgJiYgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3I7XG52YXIgUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VQcm90b3R5cGU7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xudmFyIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5O1xuXG52YXIgRElTUEFUQ0hfRVZFTlQgPSAhIShkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFdmVudCAmJiBnbG9iYWwuZGlzcGF0Y2hFdmVudCk7XG52YXIgVU5IQU5ETEVEX1JFSkVDVElPTiA9ICd1bmhhbmRsZWRyZWplY3Rpb24nO1xudmFyIFJFSkVDVElPTl9IQU5ETEVEID0gJ3JlamVjdGlvbmhhbmRsZWQnO1xudmFyIFBFTkRJTkcgPSAwO1xudmFyIEZVTEZJTExFRCA9IDE7XG52YXIgUkVKRUNURUQgPSAyO1xudmFyIEhBTkRMRUQgPSAxO1xudmFyIFVOSEFORExFRCA9IDI7XG5cbnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyLCBuYXRpdmVUaGVuO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiBpc0NhbGxhYmxlKHRoZW4gPSBpdC50aGVuKSA/IHRoZW4gOiBmYWxzZTtcbn07XG5cbnZhciBjYWxsUmVhY3Rpb24gPSBmdW5jdGlvbiAocmVhY3Rpb24sIHN0YXRlKSB7XG4gIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICB2YXIgb2sgPSBzdGF0ZS5zdGF0ZSA9PT0gRlVMRklMTEVEO1xuICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7XG4gIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gIHZhciByZXN1bHQsIHRoZW4sIGV4aXRlZDtcbiAgdHJ5IHtcbiAgICBpZiAoaGFuZGxlcikge1xuICAgICAgaWYgKCFvaykge1xuICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDtcbiAgICAgIH1cbiAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIGNhbiB0aHJvd1xuICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgIGNhbGwodGhlbiwgcmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgfVxufTtcblxudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChzdGF0ZSwgaXNSZWplY3QpIHtcbiAgaWYgKHN0YXRlLm5vdGlmaWVkKSByZXR1cm47XG4gIHN0YXRlLm5vdGlmaWVkID0gdHJ1ZTtcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVhY3Rpb25zID0gc3RhdGUucmVhY3Rpb25zO1xuICAgIHZhciByZWFjdGlvbjtcbiAgICB3aGlsZSAocmVhY3Rpb24gPSByZWFjdGlvbnMuZ2V0KCkpIHtcbiAgICAgIGNhbGxSZWFjdGlvbihyZWFjdGlvbiwgc3RhdGUpO1xuICAgIH1cbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBldmVudC5yZWFzb24gPSByZWFzb247XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTtcbiAgaWYgKCFOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQgJiYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSkgaGFuZGxlcihldmVudCk7XG4gIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7XG59O1xuXG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY2FsbCh0YXNrLCBnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgSVNfVU5IQU5ETEVEID0gaXNVbmhhbmRsZWQoc3RhdGUpO1xuICAgIHZhciByZXN1bHQ7XG4gICAgaWYgKElTX1VOSEFORExFRCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChJU19OT0RFKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFVOSEFORExFRF9SRUpFQ1RJT04sIHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHN0YXRlLnJlamVjdGlvbiA9IElTX05PREUgfHwgaXNVbmhhbmRsZWQoc3RhdGUpID8gVU5IQU5ETEVEIDogSEFORExFRDtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5yZWplY3Rpb24gIT09IEhBTkRMRUQgJiYgIXN0YXRlLnBhcmVudDtcbn07XG5cbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjYWxsKHRhc2ssIGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkoc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlLmZhY2FkZSA9PT0gdmFsdWUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICB2YXIgdGhlbiA9IGlzVGhlbmFibGUodmFsdWUpO1xuICAgIGlmICh0aGVuKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYWxsKHRoZW4sIHZhbHVlLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlc29sdmUsIHdyYXBwZXIsIHN0YXRlKSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZWplY3QsIHdyYXBwZXIsIHN0YXRlKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaW50ZXJuYWxSZWplY3Qod3JhcHBlciwgZXJyb3IsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgICBzdGF0ZS5zdGF0ZSA9IEZVTEZJTExFRDtcbiAgICAgIG5vdGlmeShzdGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbnRlcm5hbFJlamVjdCh7IGRvbmU6IGZhbHNlIH0sIGVycm9yLCBzdGF0ZSk7XG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZVByb3RvdHlwZSk7XG4gICAgYUNhbGxhYmxlKGV4ZWN1dG9yKTtcbiAgICBjYWxsKEludGVybmFsLCB0aGlzKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoYmluZChpbnRlcm5hbFJlc29sdmUsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaW50ZXJuYWxSZWplY3Qoc3RhdGUsIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgUHJvbWlzZVByb3RvdHlwZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBQUk9NSVNFLFxuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICBub3RpZmllZDogZmFsc2UsXG4gICAgICBwYXJlbnQ6IGZhbHNlLFxuICAgICAgcmVhY3Rpb25zOiBuZXcgUXVldWUoKSxcbiAgICAgIHJlamVjdGlvbjogZmFsc2UsXG4gICAgICBzdGF0ZTogUEVORElORyxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfTtcblxuICAvLyBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUudGhlblxuICBJbnRlcm5hbC5wcm90b3R5cGUgPSBkZWZpbmVCdWlsdEluKFByb21pc2VQcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IpKTtcbiAgICBzdGF0ZS5wYXJlbnQgPSB0cnVlO1xuICAgIHJlYWN0aW9uLm9rID0gaXNDYWxsYWJsZShvbkZ1bGZpbGxlZCkgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgcmVhY3Rpb24uZmFpbCA9IGlzQ2FsbGFibGUob25SZWplY3RlZCkgJiYgb25SZWplY3RlZDtcbiAgICByZWFjdGlvbi5kb21haW4gPSBJU19OT0RFID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXRlLnN0YXRlID09PSBQRU5ESU5HKSBzdGF0ZS5yZWFjdGlvbnMuYWRkKHJlYWN0aW9uKTtcbiAgICBlbHNlIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsUmVhY3Rpb24ocmVhY3Rpb24sIHN0YXRlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgfSk7XG5cbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZShwcm9taXNlKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSk7XG4gICAgdGhpcy5yZWplY3QgPSBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSk7XG4gIH07XG5cbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgbmF0aXZlVGhlbiA9IE5hdGl2ZVByb21pc2VQcm90b3R5cGUudGhlbjtcblxuICAgIGlmICghTkFUSVZFX1BST01JU0VfU1VCQ0xBU1NJTkcpIHtcbiAgICAgIC8vIG1ha2UgYFByb21pc2UjdGhlbmAgcmV0dXJuIGEgcG9seWZpbGxlZCBgUHJvbWlzZWAgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ3RoZW4nLCBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGNhbGwobmF0aXZlVGhlbiwgdGhhdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjQwXG4gICAgICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIGAuY29uc3RydWN0b3IgPT09IFByb21pc2VgIHdvcmsgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICB0cnkge1xuICAgICAgZGVsZXRlIE5hdGl2ZVByb21pc2VQcm90b3R5cGUuY29uc3RydWN0b3I7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG4gICAgLy8gbWFrZSBgaW5zdGFuY2VvZiBQcm9taXNlYCB3b3JrIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICBzZXRQcm90b3R5cGVPZihOYXRpdmVQcm9taXNlUHJvdG90eXBlLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIHdyYXA6IHRydWUsIGZvcmNlZDogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3InKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcblxudmFyIE5hdGl2ZVByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgJiYgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuLy8gU2FmYXJpIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAwODI5XG52YXIgTk9OX0dFTkVSSUMgPSAhIU5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXRoZW5hYmxlIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIE5hdGl2ZVByb21pc2VQcm90b3R5cGVbJ2ZpbmFsbHknXS5jYWxsKHsgdGhlbjogZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9IH0sIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuLy8gYFByb21pc2UucHJvdG90eXBlLmZpbmFsbHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5maW5hbGx5XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IE5PTl9HRU5FUklDIH0sIHtcbiAgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgZ2V0QnVpbHRJbignUHJvbWlzZScpKTtcbiAgICB2YXIgaXNGdW5jdGlvbiA9IGlzQ2FsbGFibGUob25GaW5hbGx5KTtcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHksXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5XG4gICAgKTtcbiAgfVxufSk7XG5cbi8vIG1ha2VzIHN1cmUgdGhhdCBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzIGBQcm9taXNlI2ZpbmFsbHlgIHByb3Blcmx5IHdvcmtzIHdpdGggcGF0Y2hlZCBgUHJvbWlzZSN0aGVuYFxuaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKSkge1xuICB2YXIgbWV0aG9kID0gZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnZmluYWxseSddO1xuICBpZiAoTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnZmluYWxseSddICE9PSBtZXRob2QpIHtcbiAgICBkZWZpbmVCdWlsdEluKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICdmaW5hbGx5JywgbWV0aG9kLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbW9kdWxlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyBzcGxpdCB0byBtb2R1bGVzIGxpc3RlZCBiZWxvd1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UuYWxsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UuY2F0Y2gnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZS5yYWNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UucmVqZWN0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UucmVzb2x2ZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1zdGF0aWNzLWluY29ycmVjdC1pdGVyYXRpb24nKTtcblxuLy8gYFByb21pc2UucmFjZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIGNhbGwoJHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uJykuQ09OU1RSVUNUT1I7XG5cbi8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfSwge1xuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKHRoaXMpO1xuICAgIHZhciBjYXBhYmlsaXR5UmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgY2FwYWJpbGl0eVJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yJyk7XG52YXIgRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKS5DT05TVFJVQ1RPUjtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcblxudmFyIFByb21pc2VDb25zdHJ1Y3RvcldyYXBwZXIgPSBnZXRCdWlsdEluKCdQcm9taXNlJyk7XG52YXIgQ0hFQ0tfV1JBUFBFUiA9IElTX1BVUkUgJiYgIUZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SO1xuXG4vLyBgUHJvbWlzZS5yZXNvbHZlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZXNvbHZlXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiB9LCB7XG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDSEVDS19XUkFQUEVSICYmIHRoaXMgPT09IFByb21pc2VDb25zdHJ1Y3RvcldyYXBwZXIgPyBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbi8vIGBQcm9taXNlLndpdGhSZXNvbHZlcnNgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS13aXRoLXJlc29sdmVyc1xuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHtcbiAgd2l0aFJlc29sdmVyczogZnVuY3Rpb24gd2l0aFJlc29sdmVycygpIHtcbiAgICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKHRoaXMpO1xuICAgIHJldHVybiB7XG4gICAgICBwcm9taXNlOiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlLFxuICAgICAgcmVzb2x2ZTogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSxcbiAgICAgIHJlamVjdDogcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0XG4gICAgfTtcbiAgfVxufSk7XG4iLCIvLyBlbXB0eVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25TdHJvbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gYFNldGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LW9iamVjdHNcbmNvbGxlY3Rpb24oJ1NldCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBTZXQoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBkaWZmZXJlbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1kaWZmZXJlbmNlJyk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtbWV0aG9kLWFjY2VwdC1zZXQtbGlrZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5kaWZmZXJlbmNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ2RpZmZlcmVuY2UnKSB9LCB7XG4gIGRpZmZlcmVuY2U6IGRpZmZlcmVuY2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpbnRlcnNlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWludGVyc2VjdGlvbicpO1xudmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LW1ldGhvZC1hY2NlcHQtc2V0LWxpa2UnKTtcblxudmFyIElOQ09SUkVDVCA9ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpbnRlcnNlY3Rpb24nKSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tLCBlcy9uby1zZXQgLS0gdGVzdGluZ1xuICByZXR1cm4gU3RyaW5nKEFycmF5LmZyb20obmV3IFNldChbMSwgMiwgM10pLmludGVyc2VjdGlvbihuZXcgU2V0KFszLCAyXSkpKSkgIT09ICczLDInO1xufSk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmludGVyc2VjdGlvbmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVCB9LCB7XG4gIGludGVyc2VjdGlvbjogaW50ZXJzZWN0aW9uXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzRGlzam9pbnRGcm9tID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pcy1kaXNqb2ludC1mcm9tJyk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtbWV0aG9kLWFjY2VwdC1zZXQtbGlrZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pc0Rpc2pvaW50RnJvbWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpc0Rpc2pvaW50RnJvbScpIH0sIHtcbiAgaXNEaXNqb2ludEZyb206IGlzRGlzam9pbnRGcm9tXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzU3Vic2V0T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWlzLXN1YnNldC1vZicpO1xudmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LW1ldGhvZC1hY2NlcHQtc2V0LWxpa2UnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuaXNTdWJzZXRPZmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpc1N1YnNldE9mJykgfSwge1xuICBpc1N1YnNldE9mOiBpc1N1YnNldE9mXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzU3VwZXJzZXRPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaXMtc3VwZXJzZXQtb2YnKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmlzU3VwZXJzZXRPZmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpc1N1cGVyc2V0T2YnKSB9LCB7XG4gIGlzU3VwZXJzZXRPZjogaXNTdXBlcnNldE9mXG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnNldC5jb25zdHJ1Y3RvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgc3ltbWV0cmljRGlmZmVyZW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3ltbWV0cmljLWRpZmZlcmVuY2UnKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLnN5bW1ldHJpY0RpZmZlcmVuY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgnc3ltbWV0cmljRGlmZmVyZW5jZScpIH0sIHtcbiAgc3ltbWV0cmljRGlmZmVyZW5jZTogc3ltbWV0cmljRGlmZmVyZW5jZVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdW5pb24nKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLnVuaW9uYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ3VuaW9uJykgfSwge1xuICB1bmlvbjogdW5pb25cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgbm90QVJlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ub3QtYS1yZWdleHAnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJyk7XG5cbnZhciBzdHJpbmdJbmRleE9mID0gdW5jdXJyeVRoaXMoJycuaW5kZXhPZik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc1xuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFjb3JyZWN0SXNSZWdFeHBMb2dpYygnaW5jbHVkZXMnKSB9LCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICByZXR1cm4gISF+c3RyaW5nSW5kZXhPZihcbiAgICAgIHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpLFxuICAgICAgdG9TdHJpbmcobm90QVJlZ0V4cChzZWFyY2hTdHJpbmcpKSxcbiAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2hhckF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jaGFyQXQ7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZScpO1xudmFyIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXItcmVzdWx0LW9iamVjdCcpO1xuXG52YXIgU1RSSU5HX0lURVJBVE9SID0gJ1N0cmluZyBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IHRvU3RyaW5nKGl0ZXJhdGVkKSxcbiAgICBpbmRleDogMFxuICB9KTtcbi8vIGAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lc3RyaW5naXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciBzdHJpbmcgPSBzdGF0ZS5zdHJpbmc7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4O1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBzdHJpbmcubGVuZ3RoKSByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdCh1bmRlZmluZWQsIHRydWUpO1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdChwb2ludCwgZmFsc2UpO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIG5vdEFSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbm90LWEtcmVnZXhwJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYycpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgbWluID0gTWF0aC5taW47XG5cbnZhciBDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyA9IGNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdzdGFydHNXaXRoJyk7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9wdWxsLzcwMlxudmFyIE1ETl9QT0xZRklMTF9CVUcgPSAhSVNfUFVSRSAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgJiYgISFmdW5jdGlvbiAoKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZy5wcm90b3R5cGUsICdzdGFydHNXaXRoJyk7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLndyaXRhYmxlO1xufSgpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdGFydHN3aXRoXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIU1ETl9QT0xZRklMTF9CVUcgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDIH0sIHtcbiAgc3RhcnRzV2l0aDogZnVuY3Rpb24gc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICB2YXIgdGhhdCA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTtcbiAgICB2YXIgaW5kZXggPSB0b0xlbmd0aChtaW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7XG4gICAgdmFyIHNlYXJjaCA9IHRvU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuIHN0cmluZ1NsaWNlKHRoYXQsIGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5hc3luY0l0ZXJhdG9yYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuYXN5bmNpdGVyYXRvclxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdhc3luY0l0ZXJhdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcbnZhciAkdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgbmF0aXZlT2JqZWN0Q3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCcpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvcicpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkJyk7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xudmFyIGRlZmluZVN5bWJvbFRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1kZWZpbmUtdG8tcHJpbWl0aXZlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgJGZvckVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZm9yRWFjaDtcblxudmFyIEhJRERFTiA9IHNoYXJlZEtleSgnaGlkZGVuJyk7XG52YXIgU1lNQk9MID0gJ1N5bWJvbCc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNZTUJPTCk7XG5cbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3RbUFJPVE9UWVBFXTtcbnZhciAkU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBTeW1ib2xQcm90b3R5cGUgPSAkU3ltYm9sICYmICRTeW1ib2xbUFJPVE9UWVBFXTtcbnZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBRT2JqZWN0ID0gZ2xvYmFsLlFPYmplY3Q7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWwuZjtcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmY7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG52YXIgQWxsU3ltYm9scyA9IHNoYXJlZCgnc3ltYm9scycpO1xudmFyIE9iamVjdFByb3RvdHlwZVN5bWJvbHMgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKTtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xuXG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbnZhciBVU0VfU0VUVEVSID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgZmFsbGJhY2tEZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIHZhciBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yID0gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgUCk7XG4gIGlmIChPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKSBkZWxldGUgT2JqZWN0UHJvdG90eXBlW1BdO1xuICBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgaWYgKE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgJiYgTyAhPT0gT2JqZWN0UHJvdG90eXBlKSB7XG4gICAgbmF0aXZlRGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlLCBQLCBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKTtcbiAgfVxufTtcblxudmFyIHNldFN5bWJvbERlc2NyaXB0b3IgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RDcmVhdGUobmF0aXZlRGVmaW5lUHJvcGVydHkoe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkodGhpcywgJ2EnLCB7IHZhbHVlOiA3IH0pLmE7IH1cbiAgfSkpLmEgIT09IDc7XG59KSA/IGZhbGxiYWNrRGVmaW5lUHJvcGVydHkgOiBuYXRpdmVEZWZpbmVQcm9wZXJ0eTtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnLCBkZXNjcmlwdGlvbikge1xuICB2YXIgc3ltYm9sID0gQWxsU3ltYm9sc1t0YWddID0gbmF0aXZlT2JqZWN0Q3JlYXRlKFN5bWJvbFByb3RvdHlwZSk7XG4gIHNldEludGVybmFsU3RhdGUoc3ltYm9sLCB7XG4gICAgdHlwZTogU1lNQk9MLFxuICAgIHRhZzogdGFnLFxuICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvblxuICB9KTtcbiAgaWYgKCFERVNDUklQVE9SUykgc3ltYm9sLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gIHJldHVybiBzeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBpZiAoTyA9PT0gT2JqZWN0UHJvdG90eXBlKSAkZGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCwgQXR0cmlidXRlcyk7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5ID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChoYXNPd24oQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghQXR0cmlidXRlcy5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhc093bihPLCBISURERU4pKSBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBISURERU4sIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBuYXRpdmVPYmplY3RDcmVhdGUobnVsbCkpKTtcbiAgICAgIE9bSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhc093bihPLCBISURERU4pICYmIE9bSElEREVOXVtrZXldKSBPW0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgQXR0cmlidXRlcyA9IG5hdGl2ZU9iamVjdENyZWF0ZShBdHRyaWJ1dGVzLCB7IGVudW1lcmFibGU6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCBmYWxzZSkgfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzY3JpcHRvcihPLCBrZXksIEF0dHJpYnV0ZXMpO1xuICB9IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBrZXksIEF0dHJpYnV0ZXMpO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIgcHJvcGVydGllcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKHByb3BlcnRpZXMpLmNvbmNhdCgkZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByb3BlcnRpZXMpKTtcbiAgJGZvckVhY2goa2V5cywgZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICghREVTQ1JJUFRPUlMgfHwgY2FsbCgkcHJvcGVydHlJc0VudW1lcmFibGUsIHByb3BlcnRpZXMsIGtleSkpICRkZWZpbmVQcm9wZXJ0eShPLCBrZXksIHByb3BlcnRpZXNba2V5XSk7XG4gIH0pO1xuICByZXR1cm4gTztcbn07XG5cbnZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IG5hdGl2ZU9iamVjdENyZWF0ZShPKSA6ICRkZWZpbmVQcm9wZXJ0aWVzKG5hdGl2ZU9iamVjdENyZWF0ZShPKSwgUHJvcGVydGllcyk7XG59O1xuXG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgUCA9IHRvUHJvcGVydHlLZXkoVik7XG4gIHZhciBlbnVtZXJhYmxlID0gY2FsbChuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSwgdGhpcywgUCk7XG4gIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzT3duKEFsbFN5bWJvbHMsIFApICYmICFoYXNPd24oT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVudW1lcmFibGUgfHwgIWhhc093bih0aGlzLCBQKSB8fCAhaGFzT3duKEFsbFN5bWJvbHMsIFApIHx8IGhhc093bih0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtQXVxuICAgID8gZW51bWVyYWJsZSA6IHRydWU7XG59O1xuXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIHZhciBpdCA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgdmFyIGtleSA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG90eXBlICYmIGhhc093bihBbGxTeW1ib2xzLCBrZXkpICYmICFoYXNPd24oT2JqZWN0UHJvdG90eXBlU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgZGVzY3JpcHRvciA9IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KTtcbiAgaWYgKGRlc2NyaXB0b3IgJiYgaGFzT3duKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXNPd24oaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkge1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGRlc2NyaXB0b3I7XG59O1xuXG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgdmFyIG5hbWVzID0gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoTykpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFoYXNPd24oQWxsU3ltYm9scywga2V5KSAmJiAhaGFzT3duKGhpZGRlbktleXMsIGtleSkpIHB1c2gocmVzdWx0LCBrZXkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gKE8pIHtcbiAgdmFyIElTX09CSkVDVF9QUk9UT1RZUEUgPSBPID09PSBPYmplY3RQcm90b3R5cGU7XG4gIHZhciBuYW1lcyA9IG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMoSVNfT0JKRUNUX1BST1RPVFlQRSA/IE9iamVjdFByb3RvdHlwZVN5bWJvbHMgOiB0b0luZGV4ZWRPYmplY3QoTykpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKGhhc093bihBbGxTeW1ib2xzLCBrZXkpICYmICghSVNfT0JKRUNUX1BST1RPVFlQRSB8fCBoYXNPd24oT2JqZWN0UHJvdG90eXBlLCBrZXkpKSkge1xuICAgICAgcHVzaChyZXN1bHQsIEFsbFN5bWJvbHNba2V5XSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIGBTeW1ib2xgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC1jb25zdHJ1Y3RvclxuaWYgKCFOQVRJVkVfU1lNQk9MKSB7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgaWYgKGlzUHJvdG90eXBlT2YoU3ltYm9sUHJvdG90eXBlLCB0aGlzKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gIWFyZ3VtZW50cy5sZW5ndGggfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAkdG9TdHJpbmcoYXJndW1lbnRzWzBdKTtcbiAgICB2YXIgdGFnID0gdWlkKGRlc2NyaXB0aW9uKTtcbiAgICB2YXIgc2V0dGVyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB2YXIgJHRoaXMgPSB0aGlzID09PSB1bmRlZmluZWQgPyBnbG9iYWwgOiB0aGlzO1xuICAgICAgaWYgKCR0aGlzID09PSBPYmplY3RQcm90b3R5cGUpIGNhbGwoc2V0dGVyLCBPYmplY3RQcm90b3R5cGVTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzT3duKCR0aGlzLCBISURERU4pICYmIGhhc093bigkdGhpc1tISURERU5dLCB0YWcpKSAkdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldFN5bWJvbERlc2NyaXB0b3IoJHRoaXMsIHRhZywgZGVzY3JpcHRvcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgZmFsbGJhY2tEZWZpbmVQcm9wZXJ0eSgkdGhpcywgdGFnLCBkZXNjcmlwdG9yKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChERVNDUklQVE9SUyAmJiBVU0VfU0VUVEVSKSBzZXRTeW1ib2xEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiBzZXR0ZXIgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnLCBkZXNjcmlwdGlvbik7XG4gIH07XG5cbiAgU3ltYm9sUHJvdG90eXBlID0gJFN5bWJvbFtQUk9UT1RZUEVdO1xuXG4gIGRlZmluZUJ1aWx0SW4oU3ltYm9sUHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS50YWc7XG4gIH0pO1xuXG4gIGRlZmluZUJ1aWx0SW4oJFN5bWJvbCwgJ3dpdGhvdXRTZXR0ZXInLCBmdW5jdGlvbiAoZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gd3JhcCh1aWQoZGVzY3JpcHRpb24pLCBkZXNjcmlwdGlvbik7XG4gIH0pO1xuXG4gIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gIGRlZmluZVByb3BlcnR5TW9kdWxlLmYgPSAkZGVmaW5lUHJvcGVydHk7XG4gIGRlZmluZVByb3BlcnRpZXNNb2R1bGUuZiA9ICRkZWZpbmVQcm9wZXJ0aWVzO1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZiA9IGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB3cmFwKHdlbGxLbm93blN5bWJvbChuYW1lKSwgbmFtZSk7XG4gIH07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtU3ltYm9sLWRlc2NyaXB0aW9uXG4gICAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFN5bWJvbFByb3RvdHlwZSwgJ2Rlc2NyaXB0aW9uJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykuZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFJU19QVVJFKSB7XG4gICAgICBkZWZpbmVCdWlsdEluKE9iamVjdFByb3RvdHlwZSwgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIHdyYXA6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wsIHNoYW06ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgU3ltYm9sOiAkU3ltYm9sXG59KTtcblxuJGZvckVhY2gob2JqZWN0S2V5cyhXZWxsS25vd25TeW1ib2xzU3RvcmUpLCBmdW5jdGlvbiAobmFtZSkge1xuICBkZWZpbmVXZWxsS25vd25TeW1ib2wobmFtZSk7XG59KTtcblxuJCh7IHRhcmdldDogU1lNQk9MLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbiAoKSB7IFVTRV9TRVRURVIgPSB0cnVlOyB9LFxuICB1c2VTaW1wbGU6IGZ1bmN0aW9uICgpIHsgVVNFX1NFVFRFUiA9IGZhbHNlOyB9XG59KTtcblxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIC8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXNcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yc1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Jcbn0pO1xuXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCB9LCB7XG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXNcbn0pO1xuXG4vLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3ByaW1pdGl2ZVxuZGVmaW5lU3ltYm9sVG9QcmltaXRpdmUoKTtcblxuLy8gYFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11gIHByb3BlcnR5XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3N0cmluZ3RhZ1xuc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgU1lNQk9MKTtcblxuaGlkZGVuS2V5c1tISURERU5dID0gdHJ1ZTtcbiIsIi8vIGVtcHR5XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIE5BVElWRV9TWU1CT0xfUkVHSVNUUlkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLXJlZ2lzdHJ5LWRldGVjdGlvbicpO1xuXG52YXIgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeScpO1xudmFyIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC10by1zdHJpbmctcmVnaXN0cnknKTtcblxuLy8gYFN5bWJvbC5mb3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuZm9yXG4kKHsgdGFyZ2V0OiAnU3ltYm9sJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTF9SRUdJU1RSWSB9LCB7XG4gICdmb3InOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHN0cmluZyA9IHRvU3RyaW5nKGtleSk7XG4gICAgaWYgKGhhc093bihTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5LCBzdHJpbmcpKSByZXR1cm4gU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddO1xuICAgIHZhciBzeW1ib2wgPSBnZXRCdWlsdEluKCdTeW1ib2wnKShzdHJpbmcpO1xuICAgIFN0cmluZ1RvU3ltYm9sUmVnaXN0cnlbc3RyaW5nXSA9IHN5bWJvbDtcbiAgICBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5W3N5bWJvbF0gPSBzdHJpbmc7XG4gICAgcmV0dXJuIHN5bWJvbDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLmhhc0luc3RhbmNlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuaGFzaW5zdGFuY2VcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnaGFzSW5zdGFuY2UnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuaXNjb25jYXRzcHJlYWRhYmxlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2lzQ29uY2F0U3ByZWFkYWJsZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5pdGVyYXRvcmAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLml0ZXJhdG9yXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHNwbGl0IHRvIG1vZHVsZXMgbGlzdGVkIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN5bWJvbC5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zeW1ib2wuZm9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN5bWJvbC5rZXktZm9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MX1JFR0lTVFJZID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1yZWdpc3RyeS1kZXRlY3Rpb24nKTtcblxudmFyIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC10by1zdHJpbmctcmVnaXN0cnknKTtcblxuLy8gYFN5bWJvbC5rZXlGb3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wua2V5Zm9yXG4kKHsgdGFyZ2V0OiAnU3ltYm9sJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTF9SRUdJU1RSWSB9LCB7XG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkge1xuICAgIGlmICghaXNTeW1ib2woc3ltKSkgdGhyb3cgbmV3IFR5cGVFcnJvcih0cnlUb1N0cmluZyhzeW0pICsgJyBpcyBub3QgYSBzeW1ib2wnKTtcbiAgICBpZiAoaGFzT3duKFN5bWJvbFRvU3RyaW5nUmVnaXN0cnksIHN5bSkpIHJldHVybiBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5W3N5bV07XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5tYXRjaEFsbGAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLm1hdGNoYWxsXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoQWxsJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLm1hdGNoYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wubWF0Y2hcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wucmVwbGFjZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnJlcGxhY2VcbmRlZmluZVdlbGxLbm93blN5bWJvbCgncmVwbGFjZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5zZWFyY2hgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5zZWFyY2hcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnc2VhcmNoJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLnNwZWNpZXNgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5zcGVjaWVzXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuc3BsaXRgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5zcGxpdFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdzcGxpdCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcbnZhciBkZWZpbmVTeW1ib2xUb1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtZGVmaW5lLXRvLXByaW1pdGl2ZScpO1xuXG4vLyBgU3ltYm9sLnRvUHJpbWl0aXZlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9wcmltaXRpdmVcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTtcblxuLy8gYFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wucHJvdG90eXBlLUBAdG9wcmltaXRpdmVcbmRlZmluZVN5bWJvbFRvUHJpbWl0aXZlKCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcblxuLy8gYFN5bWJvbC50b1N0cmluZ1RhZ2Agd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnRvc3RyaW5ndGFnXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddYCBwcm9wZXJ0eVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wucHJvdG90eXBlLUBAdG9zdHJpbmd0YWdcbnNldFRvU3RyaW5nVGFnKGdldEJ1aWx0SW4oJ1N5bWJvbCcpLCAnU3ltYm9sJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLnVuc2NvcGFibGVzYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wudW5zY29wYWJsZXNcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBGUkVFWklORyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mcmVlemluZycpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBkZWZpbmVCdWlsdElucyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW5zJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25XZWFrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24td2VhaycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJykuZW5mb3JjZTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24nKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktaXNhcnJheSAtLSBzYWZlXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSAtLSBzYWZlXG52YXIgaXNFeHRlbnNpYmxlID0gJE9iamVjdC5pc0V4dGVuc2libGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZnJvemVuIC0tIHNhZmVcbnZhciBpc0Zyb3plbiA9ICRPYmplY3QuaXNGcm96ZW47XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzc2VhbGVkIC0tIHNhZmVcbnZhciBpc1NlYWxlZCA9ICRPYmplY3QuaXNTZWFsZWQ7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWZyZWV6ZSAtLSBzYWZlXG52YXIgZnJlZXplID0gJE9iamVjdC5mcmVlemU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LXNlYWwgLS0gc2FmZVxudmFyIHNlYWwgPSAkT2JqZWN0LnNlYWw7XG5cbnZhciBJU19JRTExID0gIWdsb2JhbC5BY3RpdmVYT2JqZWN0ICYmICdBY3RpdmVYT2JqZWN0JyBpbiBnbG9iYWw7XG52YXIgSW50ZXJuYWxXZWFrTWFwO1xuXG52YXIgd3JhcHBlciA9IGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICB9O1xufTtcblxuLy8gYFdlYWtNYXBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWttYXAtY29uc3RydWN0b3JcbnZhciAkV2Vha01hcCA9IGNvbGxlY3Rpb24oJ1dlYWtNYXAnLCB3cmFwcGVyLCBjb2xsZWN0aW9uV2Vhayk7XG52YXIgV2Vha01hcFByb3RvdHlwZSA9ICRXZWFrTWFwLnByb3RvdHlwZTtcbnZhciBuYXRpdmVTZXQgPSB1bmN1cnJ5VGhpcyhXZWFrTWFwUHJvdG90eXBlLnNldCk7XG5cbi8vIENoYWtyYSBFZGdlIGJ1ZzogYWRkaW5nIGZyb3plbiBhcnJheXMgdG8gV2Vha01hcCB1bmZyZWV6ZSB0aGVtXG52YXIgaGFzTVNFZGdlRnJlZXppbmdCdWcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBGUkVFWklORyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZyb3plbkFycmF5ID0gZnJlZXplKFtdKTtcbiAgICBuYXRpdmVTZXQobmV3ICRXZWFrTWFwKCksIGZyb3plbkFycmF5LCAxKTtcbiAgICByZXR1cm4gIWlzRnJvemVuKGZyb3plbkFycmF5KTtcbiAgfSk7XG59O1xuXG4vLyBJRTExIFdlYWtNYXAgZnJvemVuIGtleXMgZml4XG4vLyBXZSBjYW4ndCB1c2UgZmVhdHVyZSBkZXRlY3Rpb24gYmVjYXVzZSBpdCBjcmFzaCBzb21lIG9sZCBJRSBidWlsZHNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80ODVcbmlmIChOQVRJVkVfV0VBS19NQVApIGlmIChJU19JRTExKSB7XG4gIEludGVybmFsV2Vha01hcCA9IGNvbGxlY3Rpb25XZWFrLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsICdXZWFrTWFwJywgdHJ1ZSk7XG4gIEludGVybmFsTWV0YWRhdGFNb2R1bGUuZW5hYmxlKCk7XG4gIHZhciBuYXRpdmVEZWxldGUgPSB1bmN1cnJ5VGhpcyhXZWFrTWFwUHJvdG90eXBlWydkZWxldGUnXSk7XG4gIHZhciBuYXRpdmVIYXMgPSB1bmN1cnJ5VGhpcyhXZWFrTWFwUHJvdG90eXBlLmhhcyk7XG4gIHZhciBuYXRpdmVHZXQgPSB1bmN1cnJ5VGhpcyhXZWFrTWFwUHJvdG90eXBlLmdldCk7XG4gIGRlZmluZUJ1aWx0SW5zKFdlYWtNYXBQcm90b3R5cGUsIHtcbiAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlRGVsZXRlKHRoaXMsIGtleSkgfHwgc3RhdGUuZnJvemVuWydkZWxldGUnXShrZXkpO1xuICAgICAgfSByZXR1cm4gbmF0aXZlRGVsZXRlKHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUhhcyh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plbi5oYXMoa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZUhhcyh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVIYXModGhpcywga2V5KSA/IG5hdGl2ZUdldCh0aGlzLCBrZXkpIDogc3RhdGUuZnJvemVuLmdldChrZXkpO1xuICAgICAgfSByZXR1cm4gbmF0aXZlR2V0KHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIG5hdGl2ZUhhcyh0aGlzLCBrZXkpID8gbmF0aXZlU2V0KHRoaXMsIGtleSwgdmFsdWUpIDogc3RhdGUuZnJvemVuLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBuYXRpdmVTZXQodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0pO1xuLy8gQ2hha3JhIEVkZ2UgZnJvemVuIGtleXMgZml4XG59IGVsc2UgaWYgKGhhc01TRWRnZUZyZWV6aW5nQnVnKCkpIHtcbiAgZGVmaW5lQnVpbHRJbnMoV2Vha01hcFByb3RvdHlwZSwge1xuICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBhcnJheUludGVncml0eUxldmVsO1xuICAgICAgaWYgKGlzQXJyYXkoa2V5KSkge1xuICAgICAgICBpZiAoaXNGcm96ZW4oa2V5KSkgYXJyYXlJbnRlZ3JpdHlMZXZlbCA9IGZyZWV6ZTtcbiAgICAgICAgZWxzZSBpZiAoaXNTZWFsZWQoa2V5KSkgYXJyYXlJbnRlZ3JpdHlMZXZlbCA9IHNlYWw7XG4gICAgICB9XG4gICAgICBuYXRpdmVTZXQodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoYXJyYXlJbnRlZ3JpdHlMZXZlbCkgYXJyYXlJbnRlZ3JpdHlMZXZlbChrZXkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLndlYWstbWFwLmNvbnN0cnVjdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG5cbnZhciBNRVRBREFUQSA9IHdlbGxLbm93blN5bWJvbCgnbWV0YWRhdGEnKTtcbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLy8gRnVuY3Rpb24ucHJvdG90eXBlW0BAbWV0YWRhdGFdXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1kZWNvcmF0b3ItbWV0YWRhdGFcbmlmIChGdW5jdGlvblByb3RvdHlwZVtNRVRBREFUQV0gPT09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eShGdW5jdGlvblByb3RvdHlwZSwgTUVUQURBVEEsIHtcbiAgICB2YWx1ZTogbnVsbFxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuYXN5bmNEaXNwb3NlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXN5bmMtZXhwbGljaXQtcmVzb3VyY2UtbWFuYWdlbWVudFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdhc3luY0Rpc3Bvc2UnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuY3VzdG9tTWF0Y2hlcmAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXBhdHRlcm4tbWF0Y2hpbmdcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnY3VzdG9tTWF0Y2hlcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5kaXNwb3NlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZXhwbGljaXQtcmVzb3VyY2UtbWFuYWdlbWVudFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdkaXNwb3NlJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc1JlZ2lzdGVyZWRTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWlzLXJlZ2lzdGVyZWQnKTtcblxuLy8gYFN5bWJvbC5pc1JlZ2lzdGVyZWRTeW1ib2xgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLXN5bWJvbC1wcmVkaWNhdGVzLyNzZWMtc3ltYm9sLWlzcmVnaXN0ZXJlZHN5bWJvbFxuJCh7IHRhcmdldDogJ1N5bWJvbCcsIHN0YXQ6IHRydWUgfSwge1xuICBpc1JlZ2lzdGVyZWRTeW1ib2w6IGlzUmVnaXN0ZXJlZFN5bWJvbFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc1JlZ2lzdGVyZWRTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWlzLXJlZ2lzdGVyZWQnKTtcblxuLy8gYFN5bWJvbC5pc1JlZ2lzdGVyZWRgIG1ldGhvZFxuLy8gb2Jzb2xldGUgdmVyc2lvbiBvZiBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtc3ltYm9sLXByZWRpY2F0ZXMvI3NlYy1zeW1ib2wtaXNyZWdpc3RlcmVkc3ltYm9sXG4kKHsgdGFyZ2V0OiAnU3ltYm9sJywgc3RhdDogdHJ1ZSwgbmFtZTogJ2lzUmVnaXN0ZXJlZFN5bWJvbCcgfSwge1xuICBpc1JlZ2lzdGVyZWQ6IGlzUmVnaXN0ZXJlZFN5bWJvbFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc1dlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtaXMtd2VsbC1rbm93bicpO1xuXG4vLyBgU3ltYm9sLmlzV2VsbEtub3duU3ltYm9sYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1zeW1ib2wtcHJlZGljYXRlcy8jc2VjLXN5bWJvbC1pc3dlbGxrbm93bnN5bWJvbFxuLy8gV2Ugc2hvdWxkIHBhdGNoIGl0IGZvciBuZXdseSBhZGRlZCB3ZWxsLWtub3duIHN5bWJvbHMuIElmIGl0J3Mgbm90IHJlcXVpcmVkLCB0aGlzIG1vZHVsZSBqdXN0IHdpbGwgbm90IGJlIGluamVjdGVkXG4kKHsgdGFyZ2V0OiAnU3ltYm9sJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHtcbiAgaXNXZWxsS25vd25TeW1ib2w6IGlzV2VsbEtub3duU3ltYm9sXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1pcy13ZWxsLWtub3duJyk7XG5cbi8vIGBTeW1ib2wuaXNXZWxsS25vd25gIG1ldGhvZFxuLy8gb2Jzb2xldGUgdmVyc2lvbiBvZiBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtc3ltYm9sLXByZWRpY2F0ZXMvI3NlYy1zeW1ib2wtaXN3ZWxsa25vd25zeW1ib2xcbi8vIFdlIHNob3VsZCBwYXRjaCBpdCBmb3IgbmV3bHkgYWRkZWQgd2VsbC1rbm93biBzeW1ib2xzLiBJZiBpdCdzIG5vdCByZXF1aXJlZCwgdGhpcyBtb2R1bGUganVzdCB3aWxsIG5vdCBiZSBpbmplY3RlZFxuJCh7IHRhcmdldDogJ1N5bWJvbCcsIHN0YXQ6IHRydWUsIG5hbWU6ICdpc1dlbGxLbm93blN5bWJvbCcsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gIGlzV2VsbEtub3duOiBpc1dlbGxLbm93blN5bWJvbFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLm1hdGNoZXJgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wYXR0ZXJuLW1hdGNoaW5nXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoZXInKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLm1ldGFkYXRhS2V5YCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZGVjb3JhdG9yLW1ldGFkYXRhXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ21ldGFkYXRhS2V5Jyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLm1ldGFkYXRhYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZGVjb3JhdG9yc1xuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtZXRhZGF0YScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5vYnNlcnZhYmxlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdvYnNlcnZhYmxlJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiByZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5wYXR0ZXJuTWF0Y2hgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wYXR0ZXJuLW1hdGNoaW5nXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3BhdHRlcm5NYXRjaCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogcmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbmRlZmluZVdlbGxLbm93blN5bWJvbCgncmVwbGFjZUFsbCcpO1xuIiwiLy8gZW1wdHlcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBET01JdGVyYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcycpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxuZm9yICh2YXIgQ09MTEVDVElPTl9OQU1FIGluIERPTUl0ZXJhYmxlcykge1xuICBzZXRUb1N0cmluZ1RhZyhnbG9iYWxbQ09MTEVDVElPTl9OQU1FXSwgQ09MTEVDVElPTl9OQU1FKTtcbiAgSXRlcmF0b3JzW0NPTExFQ1RJT05fTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2NoZWR1bGVyc0ZpeCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zY2hlZHVsZXJzLWZpeCcpO1xuXG52YXIgc2V0SW50ZXJ2YWwgPSBzY2hlZHVsZXJzRml4KGdsb2JhbC5zZXRJbnRlcnZhbCwgdHJ1ZSk7XG5cbi8vIEJ1biAvIElFOS0gc2V0SW50ZXJ2YWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZpeFxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGltZXJzLWFuZC11c2VyLXByb21wdHMuaHRtbCNkb20tc2V0aW50ZXJ2YWxcbiQoeyBnbG9iYWw6IHRydWUsIGJpbmQ6IHRydWUsIGZvcmNlZDogZ2xvYmFsLnNldEludGVydmFsICE9PSBzZXRJbnRlcnZhbCB9LCB7XG4gIHNldEludGVydmFsOiBzZXRJbnRlcnZhbFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2NoZWR1bGVyc0ZpeCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zY2hlZHVsZXJzLWZpeCcpO1xuXG52YXIgc2V0VGltZW91dCA9IHNjaGVkdWxlcnNGaXgoZ2xvYmFsLnNldFRpbWVvdXQsIHRydWUpO1xuXG4vLyBCdW4gLyBJRTktIHNldFRpbWVvdXQgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZpeFxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGltZXJzLWFuZC11c2VyLXByb21wdHMuaHRtbCNkb20tc2V0dGltZW91dFxuJCh7IGdsb2JhbDogdHJ1ZSwgYmluZDogdHJ1ZSwgZm9yY2VkOiBnbG9iYWwuc2V0VGltZW91dCAhPT0gc2V0VGltZW91dCB9LCB7XG4gIHNldFRpbWVvdXQ6IHNldFRpbWVvdXRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbW9kdWxlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyBzcGxpdCB0byBtb2R1bGVzIGxpc3RlZCBiZWxvd1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuc2V0LWludGVydmFsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5zZXQtdGltZW91dCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2FycmF5L2Zyb20nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvYXJyYXkvaXMtYXJyYXknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vLi4vZXMvYXJyYXkvdmlydHVhbC9lbnRyaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uLy4uL2VzL2FycmF5L3ZpcnR1YWwvZm9yLWVhY2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vLi4vZXMvYXJyYXkvdmlydHVhbC9rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uLy4uL2VzL2FycmF5L3ZpcnR1YWwvdmFsdWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2JpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2UvY29uY2F0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2VudHJpZXMnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIE5vZGVMaXN0OiB0cnVlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuZW50cmllcztcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuZW50cmllcylcbiAgICB8fCBoYXNPd24oRE9NSXRlcmFibGVzLCBjbGFzc29mKGl0KSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2V2ZXJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2ZpbHRlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9maW5kLWluZGV4Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2ZpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2Zvci1lYWNoJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2gnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIE5vZGVMaXN0OiB0cnVlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuZm9yRWFjaDtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuZm9yRWFjaClcbiAgICB8fCBoYXNPd24oRE9NSXRlcmFibGVzLCBjbGFzc29mKGl0KSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2luY2x1ZGVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2luZGV4LW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2tleXMnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIE5vZGVMaXN0OiB0cnVlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQua2V5cztcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUua2V5cylcbiAgICB8fCBoYXNPd24oRE9NSXRlcmFibGVzLCBjbGFzc29mKGl0KSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL21hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9yZWR1Y2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2Uvc2xpY2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2Uvc29ydCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9zcGxpY2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2Uvc3RhcnRzLXdpdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvdmFsdWVzJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgRE9NVG9rZW5MaXN0OiB0cnVlLFxuICBOb2RlTGlzdDogdHJ1ZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LnZhbHVlcztcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUudmFsdWVzKVxuICAgIHx8IGhhc093bihET01JdGVyYWJsZXMsIGNsYXNzb2YoaXQpKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvanNvbi9zdHJpbmdpZnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvbWFwJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvbnVtYmVyL2lzLWludGVnZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvb2JqZWN0L2Fzc2lnbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9vYmplY3QvY3JlYXRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvb2JqZWN0L2VudHJpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvb2JqZWN0L2ZyZWV6ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uL2VzL3BhcnNlLWludCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9wcm9taXNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi50aW1lcnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLnNldEludGVydmFsO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIudGltZXJzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5zZXRUaW1lb3V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL3NldCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL3N5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL3N5bWJvbC9pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL3N5bWJvbC90by1wcmltaXRpdmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvd2Vhay1tYXAnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7XG4gIHJldHVybiAociA9IHRvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwge1xuICAgIHZhbHVlOiB0LFxuICAgIGVudW1lcmFibGU6ICEwLFxuICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgd3JpdGFibGU6ICEwXG4gIH0pIDogZVtyXSA9IHQsIGU7XG59XG5leHBvcnQgeyBfZGVmaW5lUHJvcGVydHkgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikge1xuICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7XG4gICAgICB2YXIgdCA9IGFyZ3VtZW50c1tlXTtcbiAgICAgIGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IHsgX2V4dGVuZHMgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UodCwgbykge1xuICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLCB0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHQsIHNldFByb3RvdHlwZU9mKHQsIG8pO1xufVxuZXhwb3J0IHsgX2luaGVyaXRzTG9vc2UgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tIFwiLi9kZWZpbmVQcm9wZXJ0eS5qc1wiO1xuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7XG4gIHZhciB0ID0gT2JqZWN0LmtleXMoZSk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTtcbiAgICB9KSksIHQucHVzaC5hcHBseSh0LCBvKTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKGUpIHtcbiAgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307XG4gICAgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuZXhwb3J0IHsgX29iamVjdFNwcmVhZDIgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHIsIGUpIHtcbiAgaWYgKG51bGwgPT0gcikgcmV0dXJuIHt9O1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBuIGluIHIpIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG4pKSB7XG4gICAgaWYgKGUuaW5jbHVkZXMobikpIGNvbnRpbnVlO1xuICAgIHRbbl0gPSByW25dO1xuICB9XG4gIHJldHVybiB0O1xufVxuZXhwb3J0IHsgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LCBlKSB7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0O1xuICB9LCBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5leHBvcnQgeyBfc2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDtcbiAgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbmV4cG9ydCB7IHRvUHJpbWl0aXZlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5leHBvcnQgeyB0b1Byb3BlcnR5S2V5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG87XG4gIH0gOiBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvO1xuICB9LCBfdHlwZW9mKG8pO1xufVxuZXhwb3J0IHsgX3R5cGVvZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHsgZ2V0U2lkZUF4aXMsIGdldEFsaWdubWVudEF4aXMsIGdldEF4aXNMZW5ndGgsIGdldFNpZGUsIGdldEFsaWdubWVudCwgZXZhbHVhdGUsIGdldFBhZGRpbmdPYmplY3QsIHJlY3RUb0NsaWVudFJlY3QsIG1pbiwgY2xhbXAsIHBsYWNlbWVudHMsIGdldEFsaWdubWVudFNpZGVzLCBnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQsIGdldEV4cGFuZGVkUGxhY2VtZW50cywgZ2V0T3Bwb3NpdGVBeGlzUGxhY2VtZW50cywgc2lkZXMsIG1heCwgZ2V0T3Bwb3NpdGVBeGlzIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzJztcbmV4cG9ydCB7IHJlY3RUb0NsaWVudFJlY3QgfSBmcm9tICdAZmxvYXRpbmctdWkvdXRpbHMnO1xuXG5mdW5jdGlvbiBjb21wdXRlQ29vcmRzRnJvbVBsYWNlbWVudChfcmVmLCBwbGFjZW1lbnQsIHJ0bCkge1xuICBsZXQge1xuICAgIHJlZmVyZW5jZSxcbiAgICBmbG9hdGluZ1xuICB9ID0gX3JlZjtcbiAgY29uc3Qgc2lkZUF4aXMgPSBnZXRTaWRlQXhpcyhwbGFjZW1lbnQpO1xuICBjb25zdCBhbGlnbm1lbnRBeGlzID0gZ2V0QWxpZ25tZW50QXhpcyhwbGFjZW1lbnQpO1xuICBjb25zdCBhbGlnbkxlbmd0aCA9IGdldEF4aXNMZW5ndGgoYWxpZ25tZW50QXhpcyk7XG4gIGNvbnN0IHNpZGUgPSBnZXRTaWRlKHBsYWNlbWVudCk7XG4gIGNvbnN0IGlzVmVydGljYWwgPSBzaWRlQXhpcyA9PT0gJ3knO1xuICBjb25zdCBjb21tb25YID0gcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGggLyAyIC0gZmxvYXRpbmcud2lkdGggLyAyO1xuICBjb25zdCBjb21tb25ZID0gcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0IC8gMiAtIGZsb2F0aW5nLmhlaWdodCAvIDI7XG4gIGNvbnN0IGNvbW1vbkFsaWduID0gcmVmZXJlbmNlW2FsaWduTGVuZ3RoXSAvIDIgLSBmbG9hdGluZ1thbGlnbkxlbmd0aF0gLyAyO1xuICBsZXQgY29vcmRzO1xuICBzd2l0Y2ggKHNpZGUpIHtcbiAgICBjYXNlICd0b3AnOlxuICAgICAgY29vcmRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSAtIGZsb2F0aW5nLmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBjb29yZHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBmbG9hdGluZy53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb29yZHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuICBzd2l0Y2ggKGdldEFsaWdubWVudChwbGFjZW1lbnQpKSB7XG4gICAgY2FzZSAnc3RhcnQnOlxuICAgICAgY29vcmRzW2FsaWdubWVudEF4aXNdIC09IGNvbW1vbkFsaWduICogKHJ0bCAmJiBpc1ZlcnRpY2FsID8gLTEgOiAxKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZCc6XG4gICAgICBjb29yZHNbYWxpZ25tZW50QXhpc10gKz0gY29tbW9uQWxpZ24gKiAocnRsICYmIGlzVmVydGljYWwgPyAtMSA6IDEpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIGNvb3Jkcztcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMgdGhhdCB3aWxsIHBsYWNlIHRoZSBmbG9hdGluZyBlbGVtZW50XG4gKiBuZXh0IHRvIGEgZ2l2ZW4gcmVmZXJlbmNlIGVsZW1lbnQuXG4gKlxuICogVGhpcyBleHBvcnQgZG9lcyBub3QgaGF2ZSBhbnkgYHBsYXRmb3JtYCBpbnRlcmZhY2UgbG9naWMuIFlvdSB3aWxsIG5lZWQgdG9cbiAqIHdyaXRlIG9uZSBmb3IgdGhlIHBsYXRmb3JtIHlvdSBhcmUgdXNpbmcgRmxvYXRpbmcgVUkgd2l0aC5cbiAqL1xuY29uc3QgY29tcHV0ZVBvc2l0aW9uID0gYXN5bmMgKHJlZmVyZW5jZSwgZmxvYXRpbmcsIGNvbmZpZykgPT4ge1xuICBjb25zdCB7XG4gICAgcGxhY2VtZW50ID0gJ2JvdHRvbScsXG4gICAgc3RyYXRlZ3kgPSAnYWJzb2x1dGUnLFxuICAgIG1pZGRsZXdhcmUgPSBbXSxcbiAgICBwbGF0Zm9ybVxuICB9ID0gY29uZmlnO1xuICBjb25zdCB2YWxpZE1pZGRsZXdhcmUgPSBtaWRkbGV3YXJlLmZpbHRlcihCb29sZWFuKTtcbiAgY29uc3QgcnRsID0gYXdhaXQgKHBsYXRmb3JtLmlzUlRMID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc1JUTChmbG9hdGluZykpO1xuICBsZXQgcmVjdHMgPSBhd2FpdCBwbGF0Zm9ybS5nZXRFbGVtZW50UmVjdHMoe1xuICAgIHJlZmVyZW5jZSxcbiAgICBmbG9hdGluZyxcbiAgICBzdHJhdGVneVxuICB9KTtcbiAgbGV0IHtcbiAgICB4LFxuICAgIHlcbiAgfSA9IGNvbXB1dGVDb29yZHNGcm9tUGxhY2VtZW50KHJlY3RzLCBwbGFjZW1lbnQsIHJ0bCk7XG4gIGxldCBzdGF0ZWZ1bFBsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgbGV0IG1pZGRsZXdhcmVEYXRhID0ge307XG4gIGxldCByZXNldENvdW50ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZE1pZGRsZXdhcmUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgZm5cbiAgICB9ID0gdmFsaWRNaWRkbGV3YXJlW2ldO1xuICAgIGNvbnN0IHtcbiAgICAgIHg6IG5leHRYLFxuICAgICAgeTogbmV4dFksXG4gICAgICBkYXRhLFxuICAgICAgcmVzZXRcbiAgICB9ID0gYXdhaXQgZm4oe1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBpbml0aWFsUGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQ6IHN0YXRlZnVsUGxhY2VtZW50LFxuICAgICAgc3RyYXRlZ3ksXG4gICAgICBtaWRkbGV3YXJlRGF0YSxcbiAgICAgIHJlY3RzLFxuICAgICAgcGxhdGZvcm0sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2UsXG4gICAgICAgIGZsb2F0aW5nXG4gICAgICB9XG4gICAgfSk7XG4gICAgeCA9IG5leHRYICE9IG51bGwgPyBuZXh0WCA6IHg7XG4gICAgeSA9IG5leHRZICE9IG51bGwgPyBuZXh0WSA6IHk7XG4gICAgbWlkZGxld2FyZURhdGEgPSB7XG4gICAgICAuLi5taWRkbGV3YXJlRGF0YSxcbiAgICAgIFtuYW1lXToge1xuICAgICAgICAuLi5taWRkbGV3YXJlRGF0YVtuYW1lXSxcbiAgICAgICAgLi4uZGF0YVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHJlc2V0ICYmIHJlc2V0Q291bnQgPD0gNTApIHtcbiAgICAgIHJlc2V0Q291bnQrKztcbiAgICAgIGlmICh0eXBlb2YgcmVzZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChyZXNldC5wbGFjZW1lbnQpIHtcbiAgICAgICAgICBzdGF0ZWZ1bFBsYWNlbWVudCA9IHJlc2V0LnBsYWNlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzZXQucmVjdHMpIHtcbiAgICAgICAgICByZWN0cyA9IHJlc2V0LnJlY3RzID09PSB0cnVlID8gYXdhaXQgcGxhdGZvcm0uZ2V0RWxlbWVudFJlY3RzKHtcbiAgICAgICAgICAgIHJlZmVyZW5jZSxcbiAgICAgICAgICAgIGZsb2F0aW5nLFxuICAgICAgICAgICAgc3RyYXRlZ3lcbiAgICAgICAgICB9KSA6IHJlc2V0LnJlY3RzO1xuICAgICAgICB9XG4gICAgICAgICh7XG4gICAgICAgICAgeCxcbiAgICAgICAgICB5XG4gICAgICAgIH0gPSBjb21wdXRlQ29vcmRzRnJvbVBsYWNlbWVudChyZWN0cywgc3RhdGVmdWxQbGFjZW1lbnQsIHJ0bCkpO1xuICAgICAgfVxuICAgICAgaSA9IC0xO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeSxcbiAgICBwbGFjZW1lbnQ6IHN0YXRlZnVsUGxhY2VtZW50LFxuICAgIHN0cmF0ZWd5LFxuICAgIG1pZGRsZXdhcmVEYXRhXG4gIH07XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggYW4gb2JqZWN0IG9mIG92ZXJmbG93IHNpZGUgb2Zmc2V0cyB0aGF0IGRldGVybWluZSBob3cgbXVjaCB0aGVcbiAqIGVsZW1lbnQgaXMgb3ZlcmZsb3dpbmcgYSBnaXZlbiBjbGlwcGluZyBib3VuZGFyeSBvbiBlYWNoIHNpZGUuXG4gKiAtIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGJvdW5kYXJ5IGJ5IHRoYXQgbnVtYmVyIG9mIHBpeGVsc1xuICogLSBuZWdhdGl2ZSA9IGhvdyBtYW55IHBpeGVscyBsZWZ0IGJlZm9yZSBpdCB3aWxsIG92ZXJmbG93XG4gKiAtIDAgPSBsaWVzIGZsdXNoIHdpdGggdGhlIGJvdW5kYXJ5XG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvZGV0ZWN0T3ZlcmZsb3dcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIG9wdGlvbnMpIHtcbiAgdmFyIF9hd2FpdCRwbGF0Zm9ybSRpc0VsZTtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgeCxcbiAgICB5LFxuICAgIHBsYXRmb3JtLFxuICAgIHJlY3RzLFxuICAgIGVsZW1lbnRzLFxuICAgIHN0cmF0ZWd5XG4gIH0gPSBzdGF0ZTtcbiAgY29uc3Qge1xuICAgIGJvdW5kYXJ5ID0gJ2NsaXBwaW5nQW5jZXN0b3JzJyxcbiAgICByb290Qm91bmRhcnkgPSAndmlld3BvcnQnLFxuICAgIGVsZW1lbnRDb250ZXh0ID0gJ2Zsb2F0aW5nJyxcbiAgICBhbHRCb3VuZGFyeSA9IGZhbHNlLFxuICAgIHBhZGRpbmcgPSAwXG4gIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gIGNvbnN0IHBhZGRpbmdPYmplY3QgPSBnZXRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpO1xuICBjb25zdCBhbHRDb250ZXh0ID0gZWxlbWVudENvbnRleHQgPT09ICdmbG9hdGluZycgPyAncmVmZXJlbmNlJyA6ICdmbG9hdGluZyc7XG4gIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1thbHRCb3VuZGFyeSA/IGFsdENvbnRleHQgOiBlbGVtZW50Q29udGV4dF07XG4gIGNvbnN0IGNsaXBwaW5nQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoYXdhaXQgcGxhdGZvcm0uZ2V0Q2xpcHBpbmdSZWN0KHtcbiAgICBlbGVtZW50OiAoKF9hd2FpdCRwbGF0Zm9ybSRpc0VsZSA9IGF3YWl0IChwbGF0Zm9ybS5pc0VsZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzRWxlbWVudChlbGVtZW50KSkpICE9IG51bGwgPyBfYXdhaXQkcGxhdGZvcm0kaXNFbGUgOiB0cnVlKSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IChhd2FpdCAocGxhdGZvcm0uZ2V0RG9jdW1lbnRFbGVtZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5nZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpKSksXG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5LFxuICAgIHN0cmF0ZWd5XG4gIH0pKTtcbiAgY29uc3QgcmVjdCA9IGVsZW1lbnRDb250ZXh0ID09PSAnZmxvYXRpbmcnID8ge1xuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aDogcmVjdHMuZmxvYXRpbmcud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0cy5mbG9hdGluZy5oZWlnaHRcbiAgfSA6IHJlY3RzLnJlZmVyZW5jZTtcbiAgY29uc3Qgb2Zmc2V0UGFyZW50ID0gYXdhaXQgKHBsYXRmb3JtLmdldE9mZnNldFBhcmVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnRzLmZsb2F0aW5nKSk7XG4gIGNvbnN0IG9mZnNldFNjYWxlID0gKGF3YWl0IChwbGF0Zm9ybS5pc0VsZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzRWxlbWVudChvZmZzZXRQYXJlbnQpKSkgPyAoYXdhaXQgKHBsYXRmb3JtLmdldFNjYWxlID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5nZXRTY2FsZShvZmZzZXRQYXJlbnQpKSkgfHwge1xuICAgIHg6IDEsXG4gICAgeTogMVxuICB9IDoge1xuICAgIHg6IDEsXG4gICAgeTogMVxuICB9O1xuICBjb25zdCBlbGVtZW50Q2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QocGxhdGZvcm0uY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3QgPyBhd2FpdCBwbGF0Zm9ybS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCh7XG4gICAgZWxlbWVudHMsXG4gICAgcmVjdCxcbiAgICBvZmZzZXRQYXJlbnQsXG4gICAgc3RyYXRlZ3lcbiAgfSkgOiByZWN0KTtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IChjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3ApIC8gb2Zmc2V0U2NhbGUueSxcbiAgICBib3R0b206IChlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20pIC8gb2Zmc2V0U2NhbGUueSxcbiAgICBsZWZ0OiAoY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0KSAvIG9mZnNldFNjYWxlLngsXG4gICAgcmlnaHQ6IChlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHQpIC8gb2Zmc2V0U2NhbGUueFxuICB9O1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gcG9zaXRpb24gYW4gaW5uZXIgZWxlbWVudCBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBzbyB0aGF0IGl0XG4gKiBhcHBlYXJzIGNlbnRlcmVkIHRvIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hcnJvd1xuICovXG5jb25zdCBhcnJvdyA9IG9wdGlvbnMgPT4gKHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgb3B0aW9ucyxcbiAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIHJlY3RzLFxuICAgICAgcGxhdGZvcm0sXG4gICAgICBlbGVtZW50cyxcbiAgICAgIG1pZGRsZXdhcmVEYXRhXG4gICAgfSA9IHN0YXRlO1xuICAgIC8vIFNpbmNlIGBlbGVtZW50YCBpcyByZXF1aXJlZCwgd2UgZG9uJ3QgUGFydGlhbDw+IHRoZSB0eXBlLlxuICAgIGNvbnN0IHtcbiAgICAgIGVsZW1lbnQsXG4gICAgICBwYWRkaW5nID0gMFxuICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSkgfHwge307XG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBwYWRkaW5nT2JqZWN0ID0gZ2V0UGFkZGluZ09iamVjdChwYWRkaW5nKTtcbiAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH07XG4gICAgY29uc3QgYXhpcyA9IGdldEFsaWdubWVudEF4aXMocGxhY2VtZW50KTtcbiAgICBjb25zdCBsZW5ndGggPSBnZXRBeGlzTGVuZ3RoKGF4aXMpO1xuICAgIGNvbnN0IGFycm93RGltZW5zaW9ucyA9IGF3YWl0IHBsYXRmb3JtLmdldERpbWVuc2lvbnMoZWxlbWVudCk7XG4gICAgY29uc3QgaXNZQXhpcyA9IGF4aXMgPT09ICd5JztcbiAgICBjb25zdCBtaW5Qcm9wID0gaXNZQXhpcyA/ICd0b3AnIDogJ2xlZnQnO1xuICAgIGNvbnN0IG1heFByb3AgPSBpc1lBeGlzID8gJ2JvdHRvbScgOiAncmlnaHQnO1xuICAgIGNvbnN0IGNsaWVudFByb3AgPSBpc1lBeGlzID8gJ2NsaWVudEhlaWdodCcgOiAnY2xpZW50V2lkdGgnO1xuICAgIGNvbnN0IGVuZERpZmYgPSByZWN0cy5yZWZlcmVuY2VbbGVuZ3RoXSArIHJlY3RzLnJlZmVyZW5jZVtheGlzXSAtIGNvb3Jkc1theGlzXSAtIHJlY3RzLmZsb2F0aW5nW2xlbmd0aF07XG4gICAgY29uc3Qgc3RhcnREaWZmID0gY29vcmRzW2F4aXNdIC0gcmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICAgIGNvbnN0IGFycm93T2Zmc2V0UGFyZW50ID0gYXdhaXQgKHBsYXRmb3JtLmdldE9mZnNldFBhcmVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpKTtcbiAgICBsZXQgY2xpZW50U2l6ZSA9IGFycm93T2Zmc2V0UGFyZW50ID8gYXJyb3dPZmZzZXRQYXJlbnRbY2xpZW50UHJvcF0gOiAwO1xuXG4gICAgLy8gRE9NIHBsYXRmb3JtIGNhbiByZXR1cm4gYHdpbmRvd2AgYXMgdGhlIGBvZmZzZXRQYXJlbnRgLlxuICAgIGlmICghY2xpZW50U2l6ZSB8fCAhKGF3YWl0IChwbGF0Zm9ybS5pc0VsZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzRWxlbWVudChhcnJvd09mZnNldFBhcmVudCkpKSkge1xuICAgICAgY2xpZW50U2l6ZSA9IGVsZW1lbnRzLmZsb2F0aW5nW2NsaWVudFByb3BdIHx8IHJlY3RzLmZsb2F0aW5nW2xlbmd0aF07XG4gICAgfVxuICAgIGNvbnN0IGNlbnRlclRvUmVmZXJlbmNlID0gZW5kRGlmZiAvIDIgLSBzdGFydERpZmYgLyAyO1xuXG4gICAgLy8gSWYgdGhlIHBhZGRpbmcgaXMgbGFyZ2UgZW5vdWdoIHRoYXQgaXQgY2F1c2VzIHRoZSBhcnJvdyB0byBubyBsb25nZXIgYmVcbiAgICAvLyBjZW50ZXJlZCwgbW9kaWZ5IHRoZSBwYWRkaW5nIHNvIHRoYXQgaXQgaXMgY2VudGVyZWQuXG4gICAgY29uc3QgbGFyZ2VzdFBvc3NpYmxlUGFkZGluZyA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dEaW1lbnNpb25zW2xlbmd0aF0gLyAyIC0gMTtcbiAgICBjb25zdCBtaW5QYWRkaW5nID0gbWluKHBhZGRpbmdPYmplY3RbbWluUHJvcF0sIGxhcmdlc3RQb3NzaWJsZVBhZGRpbmcpO1xuICAgIGNvbnN0IG1heFBhZGRpbmcgPSBtaW4ocGFkZGluZ09iamVjdFttYXhQcm9wXSwgbGFyZ2VzdFBvc3NpYmxlUGFkZGluZyk7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGFycm93IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaWYgdGhlIGNlbnRlclxuICAgIC8vIHBvaW50IGlzIG91dHNpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQncyBib3VuZHMuXG4gICAgY29uc3QgbWluJDEgPSBtaW5QYWRkaW5nO1xuICAgIGNvbnN0IG1heCA9IGNsaWVudFNpemUgLSBhcnJvd0RpbWVuc2lvbnNbbGVuZ3RoXSAtIG1heFBhZGRpbmc7XG4gICAgY29uc3QgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd0RpbWVuc2lvbnNbbGVuZ3RoXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgICBjb25zdCBvZmZzZXQgPSBjbGFtcChtaW4kMSwgY2VudGVyLCBtYXgpO1xuXG4gICAgLy8gSWYgdGhlIHJlZmVyZW5jZSBpcyBzbWFsbCBlbm91Z2ggdGhhdCB0aGUgYXJyb3cncyBwYWRkaW5nIGNhdXNlcyBpdCB0b1xuICAgIC8vIHRvIHBvaW50IHRvIG5vdGhpbmcgZm9yIGFuIGFsaWduZWQgcGxhY2VtZW50LCBhZGp1c3QgdGhlIG9mZnNldCBvZiB0aGVcbiAgICAvLyBmbG9hdGluZyBlbGVtZW50IGl0c2VsZi4gVG8gZW5zdXJlIGBzaGlmdCgpYCBjb250aW51ZXMgdG8gdGFrZSBhY3Rpb24sXG4gICAgLy8gYSBzaW5nbGUgcmVzZXQgaXMgcGVyZm9ybWVkIHdoZW4gdGhpcyBpcyB0cnVlLlxuICAgIGNvbnN0IHNob3VsZEFkZE9mZnNldCA9ICFtaWRkbGV3YXJlRGF0YS5hcnJvdyAmJiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSAhPSBudWxsICYmIGNlbnRlciAhPT0gb2Zmc2V0ICYmIHJlY3RzLnJlZmVyZW5jZVtsZW5ndGhdIC8gMiAtIChjZW50ZXIgPCBtaW4kMSA/IG1pblBhZGRpbmcgOiBtYXhQYWRkaW5nKSAtIGFycm93RGltZW5zaW9uc1tsZW5ndGhdIC8gMiA8IDA7XG4gICAgY29uc3QgYWxpZ25tZW50T2Zmc2V0ID0gc2hvdWxkQWRkT2Zmc2V0ID8gY2VudGVyIDwgbWluJDEgPyBjZW50ZXIgLSBtaW4kMSA6IGNlbnRlciAtIG1heCA6IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtheGlzXTogY29vcmRzW2F4aXNdICsgYWxpZ25tZW50T2Zmc2V0LFxuICAgICAgZGF0YToge1xuICAgICAgICBbYXhpc106IG9mZnNldCxcbiAgICAgICAgY2VudGVyT2Zmc2V0OiBjZW50ZXIgLSBvZmZzZXQgLSBhbGlnbm1lbnRPZmZzZXQsXG4gICAgICAgIC4uLihzaG91bGRBZGRPZmZzZXQgJiYge1xuICAgICAgICAgIGFsaWdubWVudE9mZnNldFxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHJlc2V0OiBzaG91bGRBZGRPZmZzZXRcbiAgICB9O1xuICB9XG59KTtcblxuZnVuY3Rpb24gZ2V0UGxhY2VtZW50TGlzdChhbGlnbm1lbnQsIGF1dG9BbGlnbm1lbnQsIGFsbG93ZWRQbGFjZW1lbnRzKSB7XG4gIGNvbnN0IGFsbG93ZWRQbGFjZW1lbnRzU29ydGVkQnlBbGlnbm1lbnQgPSBhbGlnbm1lbnQgPyBbLi4uYWxsb3dlZFBsYWNlbWVudHMuZmlsdGVyKHBsYWNlbWVudCA9PiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSA9PT0gYWxpZ25tZW50KSwgLi4uYWxsb3dlZFBsYWNlbWVudHMuZmlsdGVyKHBsYWNlbWVudCA9PiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSAhPT0gYWxpZ25tZW50KV0gOiBhbGxvd2VkUGxhY2VtZW50cy5maWx0ZXIocGxhY2VtZW50ID0+IGdldFNpZGUocGxhY2VtZW50KSA9PT0gcGxhY2VtZW50KTtcbiAgcmV0dXJuIGFsbG93ZWRQbGFjZW1lbnRzU29ydGVkQnlBbGlnbm1lbnQuZmlsdGVyKHBsYWNlbWVudCA9PiB7XG4gICAgaWYgKGFsaWdubWVudCkge1xuICAgICAgcmV0dXJuIGdldEFsaWdubWVudChwbGFjZW1lbnQpID09PSBhbGlnbm1lbnQgfHwgKGF1dG9BbGlnbm1lbnQgPyBnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudChwbGFjZW1lbnQpICE9PSBwbGFjZW1lbnQgOiBmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IGNob29zaW5nIHRoZSBwbGFjZW1lbnRcbiAqIHRoYXQgaGFzIHRoZSBtb3N0IHNwYWNlIGF2YWlsYWJsZSBhdXRvbWF0aWNhbGx5LCB3aXRob3V0IG5lZWRpbmcgdG8gc3BlY2lmeSBhXG4gKiBwcmVmZXJyZWQgcGxhY2VtZW50LiBBbHRlcm5hdGl2ZSB0byBgZmxpcGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXV0b1BsYWNlbWVudFxuICovXG5jb25zdCBhdXRvUGxhY2VtZW50ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdhdXRvUGxhY2VtZW50JyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICB2YXIgX21pZGRsZXdhcmVEYXRhJGF1dG9QLCBfbWlkZGxld2FyZURhdGEkYXV0b1AyLCBfcGxhY2VtZW50c1RoYXRGaXRPbkU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJlY3RzLFxuICAgICAgICBtaWRkbGV3YXJlRGF0YSxcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgZWxlbWVudHNcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY3Jvc3NBeGlzID0gZmFsc2UsXG4gICAgICAgIGFsaWdubWVudCxcbiAgICAgICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLFxuICAgICAgICBhdXRvQWxpZ25tZW50ID0gdHJ1ZSxcbiAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuICAgICAgY29uc3QgcGxhY2VtZW50cyQxID0gYWxpZ25tZW50ICE9PSB1bmRlZmluZWQgfHwgYWxsb3dlZFBsYWNlbWVudHMgPT09IHBsYWNlbWVudHMgPyBnZXRQbGFjZW1lbnRMaXN0KGFsaWdubWVudCB8fCBudWxsLCBhdXRvQWxpZ25tZW50LCBhbGxvd2VkUGxhY2VtZW50cykgOiBhbGxvd2VkUGxhY2VtZW50cztcbiAgICAgIGNvbnN0IG92ZXJmbG93ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIGRldGVjdE92ZXJmbG93T3B0aW9ucyk7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXggPSAoKF9taWRkbGV3YXJlRGF0YSRhdXRvUCA9IG1pZGRsZXdhcmVEYXRhLmF1dG9QbGFjZW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkYXV0b1AuaW5kZXgpIHx8IDA7XG4gICAgICBjb25zdCBjdXJyZW50UGxhY2VtZW50ID0gcGxhY2VtZW50cyQxW2N1cnJlbnRJbmRleF07XG4gICAgICBpZiAoY3VycmVudFBsYWNlbWVudCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFsaWdubWVudFNpZGVzID0gZ2V0QWxpZ25tZW50U2lkZXMoY3VycmVudFBsYWNlbWVudCwgcmVjdHMsIGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKSk7XG5cbiAgICAgIC8vIE1ha2UgYGNvbXB1dGVDb29yZHNgIHN0YXJ0IGZyb20gdGhlIHJpZ2h0IHBsYWNlLlxuICAgICAgaWYgKHBsYWNlbWVudCAhPT0gY3VycmVudFBsYWNlbWVudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudHMkMVswXVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRPdmVyZmxvd3MgPSBbb3ZlcmZsb3dbZ2V0U2lkZShjdXJyZW50UGxhY2VtZW50KV0sIG92ZXJmbG93W2FsaWdubWVudFNpZGVzWzBdXSwgb3ZlcmZsb3dbYWxpZ25tZW50U2lkZXNbMV1dXTtcbiAgICAgIGNvbnN0IGFsbE92ZXJmbG93cyA9IFsuLi4oKChfbWlkZGxld2FyZURhdGEkYXV0b1AyID0gbWlkZGxld2FyZURhdGEuYXV0b1BsYWNlbWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRhdXRvUDIub3ZlcmZsb3dzKSB8fCBbXSksIHtcbiAgICAgICAgcGxhY2VtZW50OiBjdXJyZW50UGxhY2VtZW50LFxuICAgICAgICBvdmVyZmxvd3M6IGN1cnJlbnRPdmVyZmxvd3NcbiAgICAgIH1dO1xuICAgICAgY29uc3QgbmV4dFBsYWNlbWVudCA9IHBsYWNlbWVudHMkMVtjdXJyZW50SW5kZXggKyAxXTtcblxuICAgICAgLy8gVGhlcmUgYXJlIG1vcmUgcGxhY2VtZW50cyB0byBjaGVjay5cbiAgICAgIGlmIChuZXh0UGxhY2VtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5kZXg6IGN1cnJlbnRJbmRleCArIDEsXG4gICAgICAgICAgICBvdmVyZmxvd3M6IGFsbE92ZXJmbG93c1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHBsYWNlbWVudDogbmV4dFBsYWNlbWVudFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBsYWNlbWVudHNTb3J0ZWRCeU1vc3RTcGFjZSA9IGFsbE92ZXJmbG93cy5tYXAoZCA9PiB7XG4gICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChkLnBsYWNlbWVudCk7XG4gICAgICAgIHJldHVybiBbZC5wbGFjZW1lbnQsIGFsaWdubWVudCAmJiBjcm9zc0F4aXMgP1xuICAgICAgICAvLyBDaGVjayBhbG9uZyB0aGUgbWFpbkF4aXMgYW5kIG1haW4gY3Jvc3NBeGlzIHNpZGUuXG4gICAgICAgIGQub3ZlcmZsb3dzLnNsaWNlKDAsIDIpLnJlZHVjZSgoYWNjLCB2KSA9PiBhY2MgKyB2LCAwKSA6XG4gICAgICAgIC8vIENoZWNrIG9ubHkgdGhlIG1haW5BeGlzLlxuICAgICAgICBkLm92ZXJmbG93c1swXSwgZC5vdmVyZmxvd3NdO1xuICAgICAgfSkuc29ydCgoYSwgYikgPT4gYVsxXSAtIGJbMV0pO1xuICAgICAgY29uc3QgcGxhY2VtZW50c1RoYXRGaXRPbkVhY2hTaWRlID0gcGxhY2VtZW50c1NvcnRlZEJ5TW9zdFNwYWNlLmZpbHRlcihkID0+IGRbMl0uc2xpY2UoMCxcbiAgICAgIC8vIEFsaWduZWQgcGxhY2VtZW50cyBzaG91bGQgbm90IGNoZWNrIHRoZWlyIG9wcG9zaXRlIGNyb3NzQXhpc1xuICAgICAgLy8gc2lkZS5cbiAgICAgIGdldEFsaWdubWVudChkWzBdKSA/IDIgOiAzKS5ldmVyeSh2ID0+IHYgPD0gMCkpO1xuICAgICAgY29uc3QgcmVzZXRQbGFjZW1lbnQgPSAoKF9wbGFjZW1lbnRzVGhhdEZpdE9uRSA9IHBsYWNlbWVudHNUaGF0Rml0T25FYWNoU2lkZVswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9wbGFjZW1lbnRzVGhhdEZpdE9uRVswXSkgfHwgcGxhY2VtZW50c1NvcnRlZEJ5TW9zdFNwYWNlWzBdWzBdO1xuICAgICAgaWYgKHJlc2V0UGxhY2VtZW50ICE9PSBwbGFjZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4ICsgMSxcbiAgICAgICAgICAgIG92ZXJmbG93czogYWxsT3ZlcmZsb3dzXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcGxhY2VtZW50OiByZXNldFBsYWNlbWVudFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBmbGlwcGluZyB0aGUgYHBsYWNlbWVudGBcbiAqIGluIG9yZGVyIHRvIGtlZXAgaXQgaW4gdmlldyB3aGVuIHRoZSBwcmVmZXJyZWQgcGxhY2VtZW50KHMpIHdpbGwgb3ZlcmZsb3cgdGhlXG4gKiBjbGlwcGluZyBib3VuZGFyeS4gQWx0ZXJuYXRpdmUgdG8gYGF1dG9QbGFjZW1lbnRgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2ZsaXBcbiAqL1xuY29uc3QgZmxpcCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnZmxpcCcsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRhcnJvdywgX21pZGRsZXdhcmVEYXRhJGZsaXA7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgbWlkZGxld2FyZURhdGEsXG4gICAgICAgIHJlY3RzLFxuICAgICAgICBpbml0aWFsUGxhY2VtZW50LFxuICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgZWxlbWVudHNcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgICAgICBjcm9zc0F4aXM6IGNoZWNrQ3Jvc3NBeGlzID0gdHJ1ZSxcbiAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICAgIGZhbGxiYWNrU3RyYXRlZ3kgPSAnYmVzdEZpdCcsXG4gICAgICAgIGZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb24gPSAnbm9uZScsXG4gICAgICAgIGZsaXBBbGlnbm1lbnQgPSB0cnVlLFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG5cbiAgICAgIC8vIElmIGEgcmVzZXQgYnkgdGhlIGFycm93IHdhcyBjYXVzZWQgZHVlIHRvIGFuIGFsaWdubWVudCBvZmZzZXQgYmVpbmdcbiAgICAgIC8vIGFkZGVkLCB3ZSBzaG91bGQgc2tpcCBhbnkgbG9naWMgbm93IHNpbmNlIGBmbGlwKClgIGhhcyBhbHJlYWR5IGRvbmUgaXRzXG4gICAgICAvLyB3b3JrLlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yNTQ5I2lzc3VlY29tbWVudC0xNzE5NjAxNjQzXG4gICAgICBpZiAoKF9taWRkbGV3YXJlRGF0YSRhcnJvdyA9IG1pZGRsZXdhcmVEYXRhLmFycm93KSAhPSBudWxsICYmIF9taWRkbGV3YXJlRGF0YSRhcnJvdy5hbGlnbm1lbnRPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IGluaXRpYWxTaWRlQXhpcyA9IGdldFNpZGVBeGlzKGluaXRpYWxQbGFjZW1lbnQpO1xuICAgICAgY29uc3QgaXNCYXNlUGxhY2VtZW50ID0gZ2V0U2lkZShpbml0aWFsUGxhY2VtZW50KSA9PT0gaW5pdGlhbFBsYWNlbWVudDtcbiAgICAgIGNvbnN0IHJ0bCA9IGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKTtcbiAgICAgIGNvbnN0IGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwQWxpZ25tZW50ID8gW2dldE9wcG9zaXRlUGxhY2VtZW50KGluaXRpYWxQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkUGxhY2VtZW50cyhpbml0aWFsUGxhY2VtZW50KSk7XG4gICAgICBjb25zdCBoYXNGYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uID0gZmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbiAhPT0gJ25vbmUnO1xuICAgICAgaWYgKCFzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgJiYgaGFzRmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbikge1xuICAgICAgICBmYWxsYmFja1BsYWNlbWVudHMucHVzaCguLi5nZXRPcHBvc2l0ZUF4aXNQbGFjZW1lbnRzKGluaXRpYWxQbGFjZW1lbnQsIGZsaXBBbGlnbm1lbnQsIGZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb24sIHJ0bCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGxhY2VtZW50cyA9IFtpbml0aWFsUGxhY2VtZW50LCAuLi5mYWxsYmFja1BsYWNlbWVudHNdO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93cyA9IFtdO1xuICAgICAgbGV0IG92ZXJmbG93c0RhdGEgPSAoKF9taWRkbGV3YXJlRGF0YSRmbGlwID0gbWlkZGxld2FyZURhdGEuZmxpcCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRmbGlwLm92ZXJmbG93cykgfHwgW107XG4gICAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgICBvdmVyZmxvd3MucHVzaChvdmVyZmxvd1tzaWRlXSk7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tDcm9zc0F4aXMpIHtcbiAgICAgICAgY29uc3Qgc2lkZXMgPSBnZXRBbGlnbm1lbnRTaWRlcyhwbGFjZW1lbnQsIHJlY3RzLCBydGwpO1xuICAgICAgICBvdmVyZmxvd3MucHVzaChvdmVyZmxvd1tzaWRlc1swXV0sIG92ZXJmbG93W3NpZGVzWzFdXSk7XG4gICAgICB9XG4gICAgICBvdmVyZmxvd3NEYXRhID0gWy4uLm92ZXJmbG93c0RhdGEsIHtcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBvdmVyZmxvd3NcbiAgICAgIH1dO1xuXG4gICAgICAvLyBPbmUgb3IgbW9yZSBzaWRlcyBpcyBvdmVyZmxvd2luZy5cbiAgICAgIGlmICghb3ZlcmZsb3dzLmV2ZXJ5KHNpZGUgPT4gc2lkZSA8PSAwKSkge1xuICAgICAgICB2YXIgX21pZGRsZXdhcmVEYXRhJGZsaXAyLCBfb3ZlcmZsb3dzRGF0YSRmaWx0ZXI7XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9ICgoKF9taWRkbGV3YXJlRGF0YSRmbGlwMiA9IG1pZGRsZXdhcmVEYXRhLmZsaXApID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkZmxpcDIuaW5kZXgpIHx8IDApICsgMTtcbiAgICAgICAgY29uc3QgbmV4dFBsYWNlbWVudCA9IHBsYWNlbWVudHNbbmV4dEluZGV4XTtcbiAgICAgICAgaWYgKG5leHRQbGFjZW1lbnQpIHtcbiAgICAgICAgICAvLyBUcnkgbmV4dCBwbGFjZW1lbnQgYW5kIHJlLXJ1biB0aGUgbGlmZWN5Y2xlLlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGluZGV4OiBuZXh0SW5kZXgsXG4gICAgICAgICAgICAgIG92ZXJmbG93czogb3ZlcmZsb3dzRGF0YVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICAgIHBsYWNlbWVudDogbmV4dFBsYWNlbWVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJzdCwgZmluZCB0aGUgY2FuZGlkYXRlcyB0aGF0IGZpdCBvbiB0aGUgbWFpbkF4aXMgc2lkZSBvZiBvdmVyZmxvdyxcbiAgICAgICAgLy8gdGhlbiBmaW5kIHRoZSBwbGFjZW1lbnQgdGhhdCBmaXRzIHRoZSBiZXN0IG9uIHRoZSBtYWluIGNyb3NzQXhpcyBzaWRlLlxuICAgICAgICBsZXQgcmVzZXRQbGFjZW1lbnQgPSAoX292ZXJmbG93c0RhdGEkZmlsdGVyID0gb3ZlcmZsb3dzRGF0YS5maWx0ZXIoZCA9PiBkLm92ZXJmbG93c1swXSA8PSAwKS5zb3J0KChhLCBiKSA9PiBhLm92ZXJmbG93c1sxXSAtIGIub3ZlcmZsb3dzWzFdKVswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9vdmVyZmxvd3NEYXRhJGZpbHRlci5wbGFjZW1lbnQ7XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGZhbGxiYWNrLlxuICAgICAgICBpZiAoIXJlc2V0UGxhY2VtZW50KSB7XG4gICAgICAgICAgc3dpdGNoIChmYWxsYmFja1N0cmF0ZWd5KSB7XG4gICAgICAgICAgICBjYXNlICdiZXN0Rml0JzpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfb3ZlcmZsb3dzRGF0YSRmaWx0ZXIyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IChfb3ZlcmZsb3dzRGF0YSRmaWx0ZXIyID0gb3ZlcmZsb3dzRGF0YS5maWx0ZXIoZCA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoaGFzRmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2lkZUF4aXMgPSBnZXRTaWRlQXhpcyhkLnBsYWNlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2lkZUF4aXMgPT09IGluaXRpYWxTaWRlQXhpcyB8fFxuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBiaWFzIHRvIHRoZSBgeWAgc2lkZSBheGlzIGR1ZSB0byBob3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWRpbmcgZGlyZWN0aW9ucyBmYXZvcmluZyBncmVhdGVyIHdpZHRoLlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2lkZUF4aXMgPT09ICd5JztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0pLm1hcChkID0+IFtkLnBsYWNlbWVudCwgZC5vdmVyZmxvd3MuZmlsdGVyKG92ZXJmbG93ID0+IG92ZXJmbG93ID4gMCkucmVkdWNlKChhY2MsIG92ZXJmbG93KSA9PiBhY2MgKyBvdmVyZmxvdywgMCldKS5zb3J0KChhLCBiKSA9PiBhWzFdIC0gYlsxXSlbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfb3ZlcmZsb3dzRGF0YSRmaWx0ZXIyWzBdO1xuICAgICAgICAgICAgICAgIGlmIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgIHJlc2V0UGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnaW5pdGlhbFBsYWNlbWVudCc6XG4gICAgICAgICAgICAgIHJlc2V0UGxhY2VtZW50ID0gaW5pdGlhbFBsYWNlbWVudDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwbGFjZW1lbnQgIT09IHJlc2V0UGxhY2VtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICAgIHBsYWNlbWVudDogcmVzZXRQbGFjZW1lbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9O1xufTtcblxuZnVuY3Rpb24gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3QpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aFxuICB9O1xufVxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBzaWRlcy5zb21lKHNpZGUgPT4gb3ZlcmZsb3dbc2lkZV0gPj0gMCk7XG59XG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gaGlkZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBpbiBhcHBsaWNhYmxlIHNpdHVhdGlvbnMsIHN1Y2ggYXNcbiAqIHdoZW4gaXQgaXMgbm90IGluIHRoZSBzYW1lIGNsaXBwaW5nIGNvbnRleHQgYXMgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2hpZGVcbiAqL1xuY29uc3QgaGlkZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnaGlkZScsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByZWN0c1xuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdHJhdGVneSA9ICdyZWZlcmVuY2VIaWRkZW4nLFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7XG4gICAgICAgIGNhc2UgJ3JlZmVyZW5jZUhpZGRlbic6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnMsXG4gICAgICAgICAgICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3RzLnJlZmVyZW5jZSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlSGlkZGVuT2Zmc2V0czogb2Zmc2V0cyxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VIaWRkZW46IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvZmZzZXRzKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnZXNjYXBlZCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnMsXG4gICAgICAgICAgICAgIGFsdEJvdW5kYXJ5OiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdHMuZmxvYXRpbmcpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGVzY2FwZWRPZmZzZXRzOiBvZmZzZXRzLFxuICAgICAgICAgICAgICAgIGVzY2FwZWQ6IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvZmZzZXRzKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGdldEJvdW5kaW5nUmVjdChyZWN0cykge1xuICBjb25zdCBtaW5YID0gbWluKC4uLnJlY3RzLm1hcChyZWN0ID0+IHJlY3QubGVmdCkpO1xuICBjb25zdCBtaW5ZID0gbWluKC4uLnJlY3RzLm1hcChyZWN0ID0+IHJlY3QudG9wKSk7XG4gIGNvbnN0IG1heFggPSBtYXgoLi4ucmVjdHMubWFwKHJlY3QgPT4gcmVjdC5yaWdodCkpO1xuICBjb25zdCBtYXhZID0gbWF4KC4uLnJlY3RzLm1hcChyZWN0ID0+IHJlY3QuYm90dG9tKSk7XG4gIHJldHVybiB7XG4gICAgeDogbWluWCxcbiAgICB5OiBtaW5ZLFxuICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcbiAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZXG4gIH07XG59XG5mdW5jdGlvbiBnZXRSZWN0c0J5TGluZShyZWN0cykge1xuICBjb25zdCBzb3J0ZWRSZWN0cyA9IHJlY3RzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS55IC0gYi55KTtcbiAgY29uc3QgZ3JvdXBzID0gW107XG4gIGxldCBwcmV2UmVjdCA9IG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkUmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCByZWN0ID0gc29ydGVkUmVjdHNbaV07XG4gICAgaWYgKCFwcmV2UmVjdCB8fCByZWN0LnkgLSBwcmV2UmVjdC55ID4gcHJldlJlY3QuaGVpZ2h0IC8gMikge1xuICAgICAgZ3JvdXBzLnB1c2goW3JlY3RdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXS5wdXNoKHJlY3QpO1xuICAgIH1cbiAgICBwcmV2UmVjdCA9IHJlY3Q7XG4gIH1cbiAgcmV0dXJuIGdyb3Vwcy5tYXAocmVjdCA9PiByZWN0VG9DbGllbnRSZWN0KGdldEJvdW5kaW5nUmVjdChyZWN0KSkpO1xufVxuLyoqXG4gKiBQcm92aWRlcyBpbXByb3ZlZCBwb3NpdGlvbmluZyBmb3IgaW5saW5lIHJlZmVyZW5jZSBlbGVtZW50cyB0aGF0IGNhbiBzcGFuXG4gKiBvdmVyIG11bHRpcGxlIGxpbmVzLCBzdWNoIGFzIGh5cGVybGlua3Mgb3IgcmFuZ2Ugc2VsZWN0aW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9pbmxpbmVcbiAqL1xuY29uc3QgaW5saW5lID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdpbmxpbmUnLFxuICAgIG9wdGlvbnMsXG4gICAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBzdHJhdGVneVxuICAgICAgfSA9IHN0YXRlO1xuICAgICAgLy8gQSBNb3VzZUV2ZW50J3MgY2xpZW50e1gsWX0gY29vcmRzIGNhbiBiZSB1cCB0byAyIHBpeGVscyBvZmYgYVxuICAgICAgLy8gQ2xpZW50UmVjdCdzIGJvdW5kcywgZGVzcGl0ZSB0aGUgZXZlbnQgbGlzdGVuZXIgYmVpbmcgdHJpZ2dlcmVkLiBBXG4gICAgICAvLyBwYWRkaW5nIG9mIDIgc2VlbXMgdG8gaGFuZGxlIHRoaXMgaXNzdWUuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHBhZGRpbmcgPSAyLFxuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuICAgICAgY29uc3QgbmF0aXZlQ2xpZW50UmVjdHMgPSBBcnJheS5mcm9tKChhd2FpdCAocGxhdGZvcm0uZ2V0Q2xpZW50UmVjdHMgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldENsaWVudFJlY3RzKGVsZW1lbnRzLnJlZmVyZW5jZSkpKSB8fCBbXSk7XG4gICAgICBjb25zdCBjbGllbnRSZWN0cyA9IGdldFJlY3RzQnlMaW5lKG5hdGl2ZUNsaWVudFJlY3RzKTtcbiAgICAgIGNvbnN0IGZhbGxiYWNrID0gcmVjdFRvQ2xpZW50UmVjdChnZXRCb3VuZGluZ1JlY3QobmF0aXZlQ2xpZW50UmVjdHMpKTtcbiAgICAgIGNvbnN0IHBhZGRpbmdPYmplY3QgPSBnZXRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpO1xuICAgICAgZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkge1xuICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIHJlY3RzIGFuZCB0aGV5IGFyZSBkaXNqb2luZWQuXG4gICAgICAgIGlmIChjbGllbnRSZWN0cy5sZW5ndGggPT09IDIgJiYgY2xpZW50UmVjdHNbMF0ubGVmdCA+IGNsaWVudFJlY3RzWzFdLnJpZ2h0ICYmIHggIT0gbnVsbCAmJiB5ICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCByZWN0IGluIHdoaWNoIHRoZSBwb2ludCBpcyBmdWxseSBpbnNpZGUuXG4gICAgICAgICAgcmV0dXJuIGNsaWVudFJlY3RzLmZpbmQocmVjdCA9PiB4ID4gcmVjdC5sZWZ0IC0gcGFkZGluZ09iamVjdC5sZWZ0ICYmIHggPCByZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodCAmJiB5ID4gcmVjdC50b3AgLSBwYWRkaW5nT2JqZWN0LnRvcCAmJiB5IDwgcmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSkgfHwgZmFsbGJhY2s7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVyZSBhcmUgMiBvciBtb3JlIGNvbm5lY3RlZCByZWN0cy5cbiAgICAgICAgaWYgKGNsaWVudFJlY3RzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgaWYgKGdldFNpZGVBeGlzKHBsYWNlbWVudCkgPT09ICd5Jykge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RSZWN0ID0gY2xpZW50UmVjdHNbMF07XG4gICAgICAgICAgICBjb25zdCBsYXN0UmVjdCA9IGNsaWVudFJlY3RzW2NsaWVudFJlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgaXNUb3AgPSBnZXRTaWRlKHBsYWNlbWVudCkgPT09ICd0b3AnO1xuICAgICAgICAgICAgY29uc3QgdG9wID0gZmlyc3RSZWN0LnRvcDtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGxhc3RSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBpc1RvcCA/IGZpcnN0UmVjdC5sZWZ0IDogbGFzdFJlY3QubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gaXNUb3AgPyBmaXJzdFJlY3QucmlnaHQgOiBsYXN0UmVjdC5yaWdodDtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgICBib3R0b20sXG4gICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICB4OiBsZWZ0LFxuICAgICAgICAgICAgICB5OiB0b3BcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGlzTGVmdFNpZGUgPSBnZXRTaWRlKHBsYWNlbWVudCkgPT09ICdsZWZ0JztcbiAgICAgICAgICBjb25zdCBtYXhSaWdodCA9IG1heCguLi5jbGllbnRSZWN0cy5tYXAocmVjdCA9PiByZWN0LnJpZ2h0KSk7XG4gICAgICAgICAgY29uc3QgbWluTGVmdCA9IG1pbiguLi5jbGllbnRSZWN0cy5tYXAocmVjdCA9PiByZWN0LmxlZnQpKTtcbiAgICAgICAgICBjb25zdCBtZWFzdXJlUmVjdHMgPSBjbGllbnRSZWN0cy5maWx0ZXIocmVjdCA9PiBpc0xlZnRTaWRlID8gcmVjdC5sZWZ0ID09PSBtaW5MZWZ0IDogcmVjdC5yaWdodCA9PT0gbWF4UmlnaHQpO1xuICAgICAgICAgIGNvbnN0IHRvcCA9IG1lYXN1cmVSZWN0c1swXS50b3A7XG4gICAgICAgICAgY29uc3QgYm90dG9tID0gbWVhc3VyZVJlY3RzW21lYXN1cmVSZWN0cy5sZW5ndGggLSAxXS5ib3R0b207XG4gICAgICAgICAgY29uc3QgbGVmdCA9IG1pbkxlZnQ7XG4gICAgICAgICAgY29uc3QgcmlnaHQgPSBtYXhSaWdodDtcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgICAgICAgICBjb25zdCBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgIGJvdHRvbSxcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICByaWdodCxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgeDogbGVmdCxcbiAgICAgICAgICAgIHk6IHRvcFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzZXRSZWN0cyA9IGF3YWl0IHBsYXRmb3JtLmdldEVsZW1lbnRSZWN0cyh7XG4gICAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuICAgICAgICB9LFxuICAgICAgICBmbG9hdGluZzogZWxlbWVudHMuZmxvYXRpbmcsXG4gICAgICAgIHN0cmF0ZWd5XG4gICAgICB9KTtcbiAgICAgIGlmIChyZWN0cy5yZWZlcmVuY2UueCAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2UueCB8fCByZWN0cy5yZWZlcmVuY2UueSAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2UueSB8fCByZWN0cy5yZWZlcmVuY2Uud2lkdGggIT09IHJlc2V0UmVjdHMucmVmZXJlbmNlLndpZHRoIHx8IHJlY3RzLnJlZmVyZW5jZS5oZWlnaHQgIT09IHJlc2V0UmVjdHMucmVmZXJlbmNlLmhlaWdodCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICByZWN0czogcmVzZXRSZWN0c1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG59O1xuXG4vLyBGb3IgdHlwZSBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSwgdGhlIGBPZmZzZXRPcHRpb25zYCB0eXBlIHdhcyBhbHNvXG4vLyBEZXJpdmFibGUuXG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZVRvQ29vcmRzKHN0YXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBwbGFjZW1lbnQsXG4gICAgcGxhdGZvcm0sXG4gICAgZWxlbWVudHNcbiAgfSA9IHN0YXRlO1xuICBjb25zdCBydGwgPSBhd2FpdCAocGxhdGZvcm0uaXNSVEwgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzUlRMKGVsZW1lbnRzLmZsb2F0aW5nKSk7XG4gIGNvbnN0IHNpZGUgPSBnZXRTaWRlKHBsYWNlbWVudCk7XG4gIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICBjb25zdCBpc1ZlcnRpY2FsID0gZ2V0U2lkZUF4aXMocGxhY2VtZW50KSA9PT0gJ3knO1xuICBjb25zdCBtYWluQXhpc011bHRpID0gWydsZWZ0JywgJ3RvcCddLmluY2x1ZGVzKHNpZGUpID8gLTEgOiAxO1xuICBjb25zdCBjcm9zc0F4aXNNdWx0aSA9IHJ0bCAmJiBpc1ZlcnRpY2FsID8gLTEgOiAxO1xuICBjb25zdCByYXdWYWx1ZSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gIGxldCB7XG4gICAgbWFpbkF4aXMsXG4gICAgY3Jvc3NBeGlzLFxuICAgIGFsaWdubWVudEF4aXNcbiAgfSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgbWFpbkF4aXM6IHJhd1ZhbHVlLFxuICAgIGNyb3NzQXhpczogMCxcbiAgICBhbGlnbm1lbnRBeGlzOiBudWxsXG4gIH0gOiB7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgY3Jvc3NBeGlzOiAwLFxuICAgIGFsaWdubWVudEF4aXM6IG51bGwsXG4gICAgLi4ucmF3VmFsdWVcbiAgfTtcbiAgaWYgKGFsaWdubWVudCAmJiB0eXBlb2YgYWxpZ25tZW50QXhpcyA9PT0gJ251bWJlcicpIHtcbiAgICBjcm9zc0F4aXMgPSBhbGlnbm1lbnQgPT09ICdlbmQnID8gYWxpZ25tZW50QXhpcyAqIC0xIDogYWxpZ25tZW50QXhpcztcbiAgfVxuICByZXR1cm4gaXNWZXJ0aWNhbCA/IHtcbiAgICB4OiBjcm9zc0F4aXMgKiBjcm9zc0F4aXNNdWx0aSxcbiAgICB5OiBtYWluQXhpcyAqIG1haW5BeGlzTXVsdGlcbiAgfSA6IHtcbiAgICB4OiBtYWluQXhpcyAqIG1haW5BeGlzTXVsdGksXG4gICAgeTogY3Jvc3NBeGlzICogY3Jvc3NBeGlzTXVsdGlcbiAgfTtcbn1cblxuLyoqXG4gKiBNb2RpZmllcyB0aGUgcGxhY2VtZW50IGJ5IHRyYW5zbGF0aW5nIHRoZSBmbG9hdGluZyBlbGVtZW50IGFsb25nIHRoZVxuICogc3BlY2lmaWVkIGF4ZXMuXG4gKiBBIG51bWJlciAoc2hvcnRoYW5kIGZvciBgbWFpbkF4aXNgIG9yIGRpc3RhbmNlKSwgb3IgYW4gYXhlcyBjb25maWd1cmF0aW9uXG4gKiBvYmplY3QgbWF5IGJlIHBhc3NlZC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9vZmZzZXRcbiAqL1xuY29uc3Qgb2Zmc2V0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSAwO1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ29mZnNldCcsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRvZmZzZSwgX21pZGRsZXdhcmVEYXRhJGFycm93O1xuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG1pZGRsZXdhcmVEYXRhXG4gICAgICB9ID0gc3RhdGU7XG4gICAgICBjb25zdCBkaWZmQ29vcmRzID0gYXdhaXQgY29udmVydFZhbHVlVG9Db29yZHMoc3RhdGUsIG9wdGlvbnMpO1xuXG4gICAgICAvLyBJZiB0aGUgcGxhY2VtZW50IGlzIHRoZSBzYW1lIGFuZCB0aGUgYXJyb3cgY2F1c2VkIGFuIGFsaWdubWVudCBvZmZzZXRcbiAgICAgIC8vIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlIHBvc2l0aW9uaW5nIGNvb3JkaW5hdGVzLlxuICAgICAgaWYgKHBsYWNlbWVudCA9PT0gKChfbWlkZGxld2FyZURhdGEkb2Zmc2UgPSBtaWRkbGV3YXJlRGF0YS5vZmZzZXQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkb2Zmc2UucGxhY2VtZW50KSAmJiAoX21pZGRsZXdhcmVEYXRhJGFycm93ID0gbWlkZGxld2FyZURhdGEuYXJyb3cpICE9IG51bGwgJiYgX21pZGRsZXdhcmVEYXRhJGFycm93LmFsaWdubWVudE9mZnNldCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB4ICsgZGlmZkNvb3Jkcy54LFxuICAgICAgICB5OiB5ICsgZGlmZkNvb3Jkcy55LFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgLi4uZGlmZkNvb3JkcyxcbiAgICAgICAgICBwbGFjZW1lbnRcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBzaGlmdGluZyBpdCBpbiBvcmRlciB0b1xuICoga2VlcCBpdCBpbiB2aWV3IHdoZW4gaXQgd2lsbCBvdmVyZmxvdyB0aGUgY2xpcHBpbmcgYm91bmRhcnkuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2hpZnRcbiAqL1xuY29uc3Qgc2hpZnQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3NoaWZ0JyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHBsYWNlbWVudFxuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBtYWluQXhpczogY2hlY2tNYWluQXhpcyA9IHRydWUsXG4gICAgICAgIGNyb3NzQXhpczogY2hlY2tDcm9zc0F4aXMgPSBmYWxzZSxcbiAgICAgICAgbGltaXRlciA9IHtcbiAgICAgICAgICBmbjogX3JlZiA9PiB7XG4gICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICB5XG4gICAgICAgICAgICB9ID0gX3JlZjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgIHlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH07XG4gICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3QgY3Jvc3NBeGlzID0gZ2V0U2lkZUF4aXMoZ2V0U2lkZShwbGFjZW1lbnQpKTtcbiAgICAgIGNvbnN0IG1haW5BeGlzID0gZ2V0T3Bwb3NpdGVBeGlzKGNyb3NzQXhpcyk7XG4gICAgICBsZXQgbWFpbkF4aXNDb29yZCA9IGNvb3Jkc1ttYWluQXhpc107XG4gICAgICBsZXQgY3Jvc3NBeGlzQ29vcmQgPSBjb29yZHNbY3Jvc3NBeGlzXTtcbiAgICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICAgIGNvbnN0IG1pblNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgICAgIGNvbnN0IG1heFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gJ2JvdHRvbScgOiAncmlnaHQnO1xuICAgICAgICBjb25zdCBtaW4gPSBtYWluQXhpc0Nvb3JkICsgb3ZlcmZsb3dbbWluU2lkZV07XG4gICAgICAgIGNvbnN0IG1heCA9IG1haW5BeGlzQ29vcmQgLSBvdmVyZmxvd1ttYXhTaWRlXTtcbiAgICAgICAgbWFpbkF4aXNDb29yZCA9IGNsYW1wKG1pbiwgbWFpbkF4aXNDb29yZCwgbWF4KTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVja0Nyb3NzQXhpcykge1xuICAgICAgICBjb25zdCBtaW5TaWRlID0gY3Jvc3NBeGlzID09PSAneScgPyAndG9wJyA6ICdsZWZ0JztcbiAgICAgICAgY29uc3QgbWF4U2lkZSA9IGNyb3NzQXhpcyA9PT0gJ3knID8gJ2JvdHRvbScgOiAncmlnaHQnO1xuICAgICAgICBjb25zdCBtaW4gPSBjcm9zc0F4aXNDb29yZCArIG92ZXJmbG93W21pblNpZGVdO1xuICAgICAgICBjb25zdCBtYXggPSBjcm9zc0F4aXNDb29yZCAtIG92ZXJmbG93W21heFNpZGVdO1xuICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGNsYW1wKG1pbiwgY3Jvc3NBeGlzQ29vcmQsIG1heCk7XG4gICAgICB9XG4gICAgICBjb25zdCBsaW1pdGVkQ29vcmRzID0gbGltaXRlci5mbih7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBbbWFpbkF4aXNdOiBtYWluQXhpc0Nvb3JkLFxuICAgICAgICBbY3Jvc3NBeGlzXTogY3Jvc3NBeGlzQ29vcmRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ubGltaXRlZENvb3JkcyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHg6IGxpbWl0ZWRDb29yZHMueCAtIHgsXG4gICAgICAgICAgeTogbGltaXRlZENvb3Jkcy55IC0geVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn07XG4vKipcbiAqIEJ1aWx0LWluIGBsaW1pdGVyYCB0aGF0IHdpbGwgc3RvcCBgc2hpZnQoKWAgYXQgYSBjZXJ0YWluIHBvaW50LlxuICovXG5jb25zdCBsaW1pdFNoaWZ0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG9wdGlvbnMsXG4gICAgZm4oc3RhdGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICByZWN0cyxcbiAgICAgICAgbWlkZGxld2FyZURhdGFcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb2Zmc2V0ID0gMCxcbiAgICAgICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgICAgICBjcm9zc0F4aXM6IGNoZWNrQ3Jvc3NBeGlzID0gdHJ1ZVxuICAgICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNyb3NzQXhpcyA9IGdldFNpZGVBeGlzKHBsYWNlbWVudCk7XG4gICAgICBjb25zdCBtYWluQXhpcyA9IGdldE9wcG9zaXRlQXhpcyhjcm9zc0F4aXMpO1xuICAgICAgbGV0IG1haW5BeGlzQ29vcmQgPSBjb29yZHNbbWFpbkF4aXNdO1xuICAgICAgbGV0IGNyb3NzQXhpc0Nvb3JkID0gY29vcmRzW2Nyb3NzQXhpc107XG4gICAgICBjb25zdCByYXdPZmZzZXQgPSBldmFsdWF0ZShvZmZzZXQsIHN0YXRlKTtcbiAgICAgIGNvbnN0IGNvbXB1dGVkT2Zmc2V0ID0gdHlwZW9mIHJhd09mZnNldCA9PT0gJ251bWJlcicgPyB7XG4gICAgICAgIG1haW5BeGlzOiByYXdPZmZzZXQsXG4gICAgICAgIGNyb3NzQXhpczogMFxuICAgICAgfSA6IHtcbiAgICAgICAgbWFpbkF4aXM6IDAsXG4gICAgICAgIGNyb3NzQXhpczogMCxcbiAgICAgICAgLi4ucmF3T2Zmc2V0XG4gICAgICB9O1xuICAgICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgICAgY29uc3QgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICAgICAgY29uc3QgbGltaXRNaW4gPSByZWN0cy5yZWZlcmVuY2VbbWFpbkF4aXNdIC0gcmVjdHMuZmxvYXRpbmdbbGVuXSArIGNvbXB1dGVkT2Zmc2V0Lm1haW5BeGlzO1xuICAgICAgICBjb25zdCBsaW1pdE1heCA9IHJlY3RzLnJlZmVyZW5jZVttYWluQXhpc10gKyByZWN0cy5yZWZlcmVuY2VbbGVuXSAtIGNvbXB1dGVkT2Zmc2V0Lm1haW5BeGlzO1xuICAgICAgICBpZiAobWFpbkF4aXNDb29yZCA8IGxpbWl0TWluKSB7XG4gICAgICAgICAgbWFpbkF4aXNDb29yZCA9IGxpbWl0TWluO1xuICAgICAgICB9IGVsc2UgaWYgKG1haW5BeGlzQ29vcmQgPiBsaW1pdE1heCkge1xuICAgICAgICAgIG1haW5BeGlzQ29vcmQgPSBsaW1pdE1heDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNoZWNrQ3Jvc3NBeGlzKSB7XG4gICAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkb2Zmc2UsIF9taWRkbGV3YXJlRGF0YSRvZmZzZTI7XG4gICAgICAgIGNvbnN0IGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gICAgICAgIGNvbnN0IGlzT3JpZ2luU2lkZSA9IFsndG9wJywgJ2xlZnQnXS5pbmNsdWRlcyhnZXRTaWRlKHBsYWNlbWVudCkpO1xuICAgICAgICBjb25zdCBsaW1pdE1pbiA9IHJlY3RzLnJlZmVyZW5jZVtjcm9zc0F4aXNdIC0gcmVjdHMuZmxvYXRpbmdbbGVuXSArIChpc09yaWdpblNpZGUgPyAoKF9taWRkbGV3YXJlRGF0YSRvZmZzZSA9IG1pZGRsZXdhcmVEYXRhLm9mZnNldCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRvZmZzZVtjcm9zc0F4aXNdKSB8fCAwIDogMCkgKyAoaXNPcmlnaW5TaWRlID8gMCA6IGNvbXB1dGVkT2Zmc2V0LmNyb3NzQXhpcyk7XG4gICAgICAgIGNvbnN0IGxpbWl0TWF4ID0gcmVjdHMucmVmZXJlbmNlW2Nyb3NzQXhpc10gKyByZWN0cy5yZWZlcmVuY2VbbGVuXSArIChpc09yaWdpblNpZGUgPyAwIDogKChfbWlkZGxld2FyZURhdGEkb2Zmc2UyID0gbWlkZGxld2FyZURhdGEub2Zmc2V0KSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJG9mZnNlMltjcm9zc0F4aXNdKSB8fCAwKSAtIChpc09yaWdpblNpZGUgPyBjb21wdXRlZE9mZnNldC5jcm9zc0F4aXMgOiAwKTtcbiAgICAgICAgaWYgKGNyb3NzQXhpc0Nvb3JkIDwgbGltaXRNaW4pIHtcbiAgICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGxpbWl0TWluO1xuICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQXhpc0Nvb3JkID4gbGltaXRNYXgpIHtcbiAgICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGxpbWl0TWF4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbbWFpbkF4aXNdOiBtYWluQXhpc0Nvb3JkLFxuICAgICAgICBbY3Jvc3NBeGlzXTogY3Jvc3NBeGlzQ29vcmRcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRoYXQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQg4oCUXG4gKiBmb3IgaW5zdGFuY2UsIHByZXZlbnQgaXQgZnJvbSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgYm91bmRhcnkgb3IgbWF0Y2ggdGhlXG4gKiB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2l6ZVxuICovXG5jb25zdCBzaXplID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdzaXplJyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBlbGVtZW50c1xuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBhcHBseSA9ICgpID0+IHt9LFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICAgICAgY29uc3QgaXNZQXhpcyA9IGdldFNpZGVBeGlzKHBsYWNlbWVudCkgPT09ICd5JztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgfSA9IHJlY3RzLmZsb2F0aW5nO1xuICAgICAgbGV0IGhlaWdodFNpZGU7XG4gICAgICBsZXQgd2lkdGhTaWRlO1xuICAgICAgaWYgKHNpZGUgPT09ICd0b3AnIHx8IHNpZGUgPT09ICdib3R0b20nKSB7XG4gICAgICAgIGhlaWdodFNpZGUgPSBzaWRlO1xuICAgICAgICB3aWR0aFNpZGUgPSBhbGlnbm1lbnQgPT09ICgoYXdhaXQgKHBsYXRmb3JtLmlzUlRMID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc1JUTChlbGVtZW50cy5mbG9hdGluZykpKSA/ICdzdGFydCcgOiAnZW5kJykgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2lkdGhTaWRlID0gc2lkZTtcbiAgICAgICAgaGVpZ2h0U2lkZSA9IGFsaWdubWVudCA9PT0gJ2VuZCcgPyAndG9wJyA6ICdib3R0b20nO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4aW11bUNsaXBwaW5nSGVpZ2h0ID0gaGVpZ2h0IC0gb3ZlcmZsb3cudG9wIC0gb3ZlcmZsb3cuYm90dG9tO1xuICAgICAgY29uc3QgbWF4aW11bUNsaXBwaW5nV2lkdGggPSB3aWR0aCAtIG92ZXJmbG93LmxlZnQgLSBvdmVyZmxvdy5yaWdodDtcbiAgICAgIGNvbnN0IG92ZXJmbG93QXZhaWxhYmxlSGVpZ2h0ID0gbWluKGhlaWdodCAtIG92ZXJmbG93W2hlaWdodFNpZGVdLCBtYXhpbXVtQ2xpcHBpbmdIZWlnaHQpO1xuICAgICAgY29uc3Qgb3ZlcmZsb3dBdmFpbGFibGVXaWR0aCA9IG1pbih3aWR0aCAtIG92ZXJmbG93W3dpZHRoU2lkZV0sIG1heGltdW1DbGlwcGluZ1dpZHRoKTtcbiAgICAgIGNvbnN0IG5vU2hpZnQgPSAhc3RhdGUubWlkZGxld2FyZURhdGEuc2hpZnQ7XG4gICAgICBsZXQgYXZhaWxhYmxlSGVpZ2h0ID0gb3ZlcmZsb3dBdmFpbGFibGVIZWlnaHQ7XG4gICAgICBsZXQgYXZhaWxhYmxlV2lkdGggPSBvdmVyZmxvd0F2YWlsYWJsZVdpZHRoO1xuICAgICAgaWYgKGlzWUF4aXMpIHtcbiAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBhbGlnbm1lbnQgfHwgbm9TaGlmdCA/IG1pbihvdmVyZmxvd0F2YWlsYWJsZVdpZHRoLCBtYXhpbXVtQ2xpcHBpbmdXaWR0aCkgOiBtYXhpbXVtQ2xpcHBpbmdXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF2YWlsYWJsZUhlaWdodCA9IGFsaWdubWVudCB8fCBub1NoaWZ0ID8gbWluKG92ZXJmbG93QXZhaWxhYmxlSGVpZ2h0LCBtYXhpbXVtQ2xpcHBpbmdIZWlnaHQpIDogbWF4aW11bUNsaXBwaW5nSGVpZ2h0O1xuICAgICAgfVxuICAgICAgaWYgKG5vU2hpZnQgJiYgIWFsaWdubWVudCkge1xuICAgICAgICBjb25zdCB4TWluID0gbWF4KG92ZXJmbG93LmxlZnQsIDApO1xuICAgICAgICBjb25zdCB4TWF4ID0gbWF4KG92ZXJmbG93LnJpZ2h0LCAwKTtcbiAgICAgICAgY29uc3QgeU1pbiA9IG1heChvdmVyZmxvdy50b3AsIDApO1xuICAgICAgICBjb25zdCB5TWF4ID0gbWF4KG92ZXJmbG93LmJvdHRvbSwgMCk7XG4gICAgICAgIGlmIChpc1lBeGlzKSB7XG4gICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB3aWR0aCAtIDIgKiAoeE1pbiAhPT0gMCB8fCB4TWF4ICE9PSAwID8geE1pbiArIHhNYXggOiBtYXgob3ZlcmZsb3cubGVmdCwgb3ZlcmZsb3cucmlnaHQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdmFpbGFibGVIZWlnaHQgPSBoZWlnaHQgLSAyICogKHlNaW4gIT09IDAgfHwgeU1heCAhPT0gMCA/IHlNaW4gKyB5TWF4IDogbWF4KG92ZXJmbG93LnRvcCwgb3ZlcmZsb3cuYm90dG9tKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IGFwcGx5KHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGF2YWlsYWJsZVdpZHRoLFxuICAgICAgICBhdmFpbGFibGVIZWlnaHRcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV4dERpbWVuc2lvbnMgPSBhd2FpdCBwbGF0Zm9ybS5nZXREaW1lbnNpb25zKGVsZW1lbnRzLmZsb2F0aW5nKTtcbiAgICAgIGlmICh3aWR0aCAhPT0gbmV4dERpbWVuc2lvbnMud2lkdGggfHwgaGVpZ2h0ICE9PSBuZXh0RGltZW5zaW9ucy5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcmVjdHM6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9O1xufTtcblxuZXhwb3J0IHsgYXJyb3csIGF1dG9QbGFjZW1lbnQsIGNvbXB1dGVQb3NpdGlvbiwgZGV0ZWN0T3ZlcmZsb3csIGZsaXAsIGhpZGUsIGlubGluZSwgbGltaXRTaGlmdCwgb2Zmc2V0LCBzaGlmdCwgc2l6ZSB9O1xuIiwiaW1wb3J0IHsgcmVjdFRvQ2xpZW50UmVjdCwgZGV0ZWN0T3ZlcmZsb3cgYXMgZGV0ZWN0T3ZlcmZsb3ckMSwgb2Zmc2V0IGFzIG9mZnNldCQxLCBhdXRvUGxhY2VtZW50IGFzIGF1dG9QbGFjZW1lbnQkMSwgc2hpZnQgYXMgc2hpZnQkMSwgZmxpcCBhcyBmbGlwJDEsIHNpemUgYXMgc2l6ZSQxLCBoaWRlIGFzIGhpZGUkMSwgYXJyb3cgYXMgYXJyb3ckMSwgaW5saW5lIGFzIGlubGluZSQxLCBsaW1pdFNoaWZ0IGFzIGxpbWl0U2hpZnQkMSwgY29tcHV0ZVBvc2l0aW9uIGFzIGNvbXB1dGVQb3NpdGlvbiQxIH0gZnJvbSAnQGZsb2F0aW5nLXVpL2NvcmUnO1xuaW1wb3J0IHsgcm91bmQsIGNyZWF0ZUNvb3JkcywgbWF4LCBtaW4sIGZsb29yIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzJztcbmltcG9ydCB7IGdldENvbXB1dGVkU3R5bGUsIGlzSFRNTEVsZW1lbnQsIGlzRWxlbWVudCwgZ2V0V2luZG93LCBpc1dlYktpdCwgZ2V0RG9jdW1lbnRFbGVtZW50LCBpc1RvcExheWVyLCBnZXROb2RlTmFtZSwgaXNPdmVyZmxvd0VsZW1lbnQsIGdldE5vZGVTY3JvbGwsIGdldE92ZXJmbG93QW5jZXN0b3JzLCBnZXRQYXJlbnROb2RlLCBpc0xhc3RUcmF2ZXJzYWJsZU5vZGUsIGlzQ29udGFpbmluZ0Jsb2NrLCBpc1RhYmxlRWxlbWVudCwgZ2V0Q29udGFpbmluZ0Jsb2NrIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzL2RvbSc7XG5leHBvcnQgeyBnZXRPdmVyZmxvd0FuY2VzdG9ycyB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscy9kb20nO1xuXG5mdW5jdGlvbiBnZXRDc3NEaW1lbnNpb25zKGVsZW1lbnQpIHtcbiAgY29uc3QgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgLy8gSW4gdGVzdGluZyBlbnZpcm9ubWVudHMsIHRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBwcm9wZXJ0aWVzIGFyZSBlbXB0eVxuICAvLyBzdHJpbmdzIGZvciBTVkcgZWxlbWVudHMsIHJldHVybmluZyBOYU4uIEZhbGxiYWNrIHRvIGAwYCBpbiB0aGlzIGNhc2UuXG4gIGxldCB3aWR0aCA9IHBhcnNlRmxvYXQoY3NzLndpZHRoKSB8fCAwO1xuICBsZXQgaGVpZ2h0ID0gcGFyc2VGbG9hdChjc3MuaGVpZ2h0KSB8fCAwO1xuICBjb25zdCBoYXNPZmZzZXQgPSBpc0hUTUxFbGVtZW50KGVsZW1lbnQpO1xuICBjb25zdCBvZmZzZXRXaWR0aCA9IGhhc09mZnNldCA/IGVsZW1lbnQub2Zmc2V0V2lkdGggOiB3aWR0aDtcbiAgY29uc3Qgb2Zmc2V0SGVpZ2h0ID0gaGFzT2Zmc2V0ID8gZWxlbWVudC5vZmZzZXRIZWlnaHQgOiBoZWlnaHQ7XG4gIGNvbnN0IHNob3VsZEZhbGxiYWNrID0gcm91bmQod2lkdGgpICE9PSBvZmZzZXRXaWR0aCB8fCByb3VuZChoZWlnaHQpICE9PSBvZmZzZXRIZWlnaHQ7XG4gIGlmIChzaG91bGRGYWxsYmFjaykge1xuICAgIHdpZHRoID0gb2Zmc2V0V2lkdGg7XG4gICAgaGVpZ2h0ID0gb2Zmc2V0SGVpZ2h0O1xuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgICQ6IHNob3VsZEZhbGxiYWNrXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVud3JhcEVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gIWlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgOiBlbGVtZW50O1xufVxuXG5mdW5jdGlvbiBnZXRTY2FsZShlbGVtZW50KSB7XG4gIGNvbnN0IGRvbUVsZW1lbnQgPSB1bndyYXBFbGVtZW50KGVsZW1lbnQpO1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZG9tRWxlbWVudCkpIHtcbiAgICByZXR1cm4gY3JlYXRlQ29vcmRzKDEpO1xuICB9XG4gIGNvbnN0IHJlY3QgPSBkb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgICRcbiAgfSA9IGdldENzc0RpbWVuc2lvbnMoZG9tRWxlbWVudCk7XG4gIGxldCB4ID0gKCQgPyByb3VuZChyZWN0LndpZHRoKSA6IHJlY3Qud2lkdGgpIC8gd2lkdGg7XG4gIGxldCB5ID0gKCQgPyByb3VuZChyZWN0LmhlaWdodCkgOiByZWN0LmhlaWdodCkgLyBoZWlnaHQ7XG5cbiAgLy8gMCwgTmFOLCBvciBJbmZpbml0eSBzaG91bGQgYWx3YXlzIGZhbGxiYWNrIHRvIDEuXG5cbiAgaWYgKCF4IHx8ICFOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICB4ID0gMTtcbiAgfVxuICBpZiAoIXkgfHwgIU51bWJlci5pc0Zpbml0ZSh5KSkge1xuICAgIHkgPSAxO1xuICB9XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5cbmNvbnN0IG5vT2Zmc2V0cyA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb29yZHMoMCk7XG5mdW5jdGlvbiBnZXRWaXN1YWxPZmZzZXRzKGVsZW1lbnQpIHtcbiAgY29uc3Qgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICBpZiAoIWlzV2ViS2l0KCkgfHwgIXdpbi52aXN1YWxWaWV3cG9ydCkge1xuICAgIHJldHVybiBub09mZnNldHM7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB4OiB3aW4udmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCxcbiAgICB5OiB3aW4udmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wXG4gIH07XG59XG5mdW5jdGlvbiBzaG91bGRBZGRWaXN1YWxPZmZzZXRzKGVsZW1lbnQsIGlzRml4ZWQsIGZsb2F0aW5nT2Zmc2V0UGFyZW50KSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cbiAgaWYgKCFmbG9hdGluZ09mZnNldFBhcmVudCB8fCBpc0ZpeGVkICYmIGZsb2F0aW5nT2Zmc2V0UGFyZW50ICE9PSBnZXRXaW5kb3coZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGlzRml4ZWQ7XG59XG5cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUsIGlzRml4ZWRTdHJhdGVneSwgb2Zmc2V0UGFyZW50KSB7XG4gIGlmIChpbmNsdWRlU2NhbGUgPT09IHZvaWQgMCkge1xuICAgIGluY2x1ZGVTY2FsZSA9IGZhbHNlO1xuICB9XG4gIGlmIChpc0ZpeGVkU3RyYXRlZ3kgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWRTdHJhdGVneSA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IGNsaWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBkb21FbGVtZW50ID0gdW53cmFwRWxlbWVudChlbGVtZW50KTtcbiAgbGV0IHNjYWxlID0gY3JlYXRlQ29vcmRzKDEpO1xuICBpZiAoaW5jbHVkZVNjYWxlKSB7XG4gICAgaWYgKG9mZnNldFBhcmVudCkge1xuICAgICAgaWYgKGlzRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICAgIHNjYWxlID0gZ2V0U2NhbGUob2Zmc2V0UGFyZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2NhbGUgPSBnZXRTY2FsZShlbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdmlzdWFsT2Zmc2V0cyA9IHNob3VsZEFkZFZpc3VhbE9mZnNldHMoZG9tRWxlbWVudCwgaXNGaXhlZFN0cmF0ZWd5LCBvZmZzZXRQYXJlbnQpID8gZ2V0VmlzdWFsT2Zmc2V0cyhkb21FbGVtZW50KSA6IGNyZWF0ZUNvb3JkcygwKTtcbiAgbGV0IHggPSAoY2xpZW50UmVjdC5sZWZ0ICsgdmlzdWFsT2Zmc2V0cy54KSAvIHNjYWxlLng7XG4gIGxldCB5ID0gKGNsaWVudFJlY3QudG9wICsgdmlzdWFsT2Zmc2V0cy55KSAvIHNjYWxlLnk7XG4gIGxldCB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZS54O1xuICBsZXQgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQgLyBzY2FsZS55O1xuICBpZiAoZG9tRWxlbWVudCkge1xuICAgIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhkb21FbGVtZW50KTtcbiAgICBjb25zdCBvZmZzZXRXaW4gPSBvZmZzZXRQYXJlbnQgJiYgaXNFbGVtZW50KG9mZnNldFBhcmVudCkgPyBnZXRXaW5kb3cob2Zmc2V0UGFyZW50KSA6IG9mZnNldFBhcmVudDtcbiAgICBsZXQgY3VycmVudFdpbiA9IHdpbjtcbiAgICBsZXQgY3VycmVudElGcmFtZSA9IGN1cnJlbnRXaW4uZnJhbWVFbGVtZW50O1xuICAgIHdoaWxlIChjdXJyZW50SUZyYW1lICYmIG9mZnNldFBhcmVudCAmJiBvZmZzZXRXaW4gIT09IGN1cnJlbnRXaW4pIHtcbiAgICAgIGNvbnN0IGlmcmFtZVNjYWxlID0gZ2V0U2NhbGUoY3VycmVudElGcmFtZSk7XG4gICAgICBjb25zdCBpZnJhbWVSZWN0ID0gY3VycmVudElGcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudElGcmFtZSk7XG4gICAgICBjb25zdCBsZWZ0ID0gaWZyYW1lUmVjdC5sZWZ0ICsgKGN1cnJlbnRJRnJhbWUuY2xpZW50TGVmdCArIHBhcnNlRmxvYXQoY3NzLnBhZGRpbmdMZWZ0KSkgKiBpZnJhbWVTY2FsZS54O1xuICAgICAgY29uc3QgdG9wID0gaWZyYW1lUmVjdC50b3AgKyAoY3VycmVudElGcmFtZS5jbGllbnRUb3AgKyBwYXJzZUZsb2F0KGNzcy5wYWRkaW5nVG9wKSkgKiBpZnJhbWVTY2FsZS55O1xuICAgICAgeCAqPSBpZnJhbWVTY2FsZS54O1xuICAgICAgeSAqPSBpZnJhbWVTY2FsZS55O1xuICAgICAgd2lkdGggKj0gaWZyYW1lU2NhbGUueDtcbiAgICAgIGhlaWdodCAqPSBpZnJhbWVTY2FsZS55O1xuICAgICAgeCArPSBsZWZ0O1xuICAgICAgeSArPSB0b3A7XG4gICAgICBjdXJyZW50V2luID0gZ2V0V2luZG93KGN1cnJlbnRJRnJhbWUpO1xuICAgICAgY3VycmVudElGcmFtZSA9IGN1cnJlbnRXaW4uZnJhbWVFbGVtZW50O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVjdFRvQ2xpZW50UmVjdCh7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9KTtcbn1cblxuZnVuY3Rpb24gY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3QoX3JlZikge1xuICBsZXQge1xuICAgIGVsZW1lbnRzLFxuICAgIHJlY3QsXG4gICAgb2Zmc2V0UGFyZW50LFxuICAgIHN0cmF0ZWd5XG4gIH0gPSBfcmVmO1xuICBjb25zdCBpc0ZpeGVkID0gc3RyYXRlZ3kgPT09ICdmaXhlZCc7XG4gIGNvbnN0IGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICBjb25zdCB0b3BMYXllciA9IGVsZW1lbnRzID8gaXNUb3BMYXllcihlbGVtZW50cy5mbG9hdGluZykgOiBmYWxzZTtcbiAgaWYgKG9mZnNldFBhcmVudCA9PT0gZG9jdW1lbnRFbGVtZW50IHx8IHRvcExheWVyICYmIGlzRml4ZWQpIHtcbiAgICByZXR1cm4gcmVjdDtcbiAgfVxuICBsZXQgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIGxldCBzY2FsZSA9IGNyZWF0ZUNvb3JkcygxKTtcbiAgY29uc3Qgb2Zmc2V0cyA9IGNyZWF0ZUNvb3JkcygwKTtcbiAgY29uc3QgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IGlzT3ZlcmZsb3dFbGVtZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgY29uc3Qgb2Zmc2V0UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQpO1xuICAgICAgc2NhbGUgPSBnZXRTY2FsZShvZmZzZXRQYXJlbnQpO1xuICAgICAgb2Zmc2V0cy54ID0gb2Zmc2V0UmVjdC54ICsgb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgPSBvZmZzZXRSZWN0LnkgKyBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoOiByZWN0LndpZHRoICogc2NhbGUueCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0ICogc2NhbGUueSxcbiAgICB4OiByZWN0LnggKiBzY2FsZS54IC0gc2Nyb2xsLnNjcm9sbExlZnQgKiBzY2FsZS54ICsgb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QueSAqIHNjYWxlLnkgLSBzY3JvbGwuc2Nyb2xsVG9wICogc2NhbGUueSArIG9mZnNldHMueVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0cyhlbGVtZW50KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKSk7XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCkge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGdldE5vZGVTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdDtcbn1cblxuLy8gR2V0cyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgZG9jdW1lbnQgYXJlYSwgZXZlbiBleHRlbmRpbmcgb3V0c2lkZVxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZS5cbmZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIGNvbnN0IGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIGNvbnN0IHNjcm9sbCA9IGdldE5vZGVTY3JvbGwoZWxlbWVudCk7XG4gIGNvbnN0IGJvZHkgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuYm9keTtcbiAgY29uc3Qgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keS5zY3JvbGxXaWR0aCwgYm9keS5jbGllbnRXaWR0aCk7XG4gIGNvbnN0IGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkuc2Nyb2xsSGVpZ2h0LCBib2R5LmNsaWVudEhlaWdodCk7XG4gIGxldCB4ID0gLXNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgY29uc3QgeSA9IC1zY3JvbGwuc2Nyb2xsVG9wO1xuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5KS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keS5jbGllbnRXaWR0aCkgLSB3aWR0aDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4LFxuICAgIHlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgY29uc3QgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgY29uc3QgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIGxldCB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIGxldCBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgbGV0IHggPSAwO1xuICBsZXQgeSA9IDA7XG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0O1xuICAgIGNvbnN0IHZpc3VhbFZpZXdwb3J0QmFzZWQgPSBpc1dlYktpdCgpO1xuICAgIGlmICghdmlzdWFsVmlld3BvcnRCYXNlZCB8fCB2aXN1YWxWaWV3cG9ydEJhc2VkICYmIHN0cmF0ZWd5ID09PSAnZml4ZWQnKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9O1xufVxuXG4vLyBSZXR1cm5zIHRoZSBpbm5lciBjbGllbnQgcmVjdCwgc3VidHJhY3Rpbmcgc2Nyb2xsYmFycyBpZiBwcmVzZW50LlxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgY29uc3QgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCB0cnVlLCBzdHJhdGVneSA9PT0gJ2ZpeGVkJyk7XG4gIGNvbnN0IHRvcCA9IGNsaWVudFJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIGNvbnN0IGxlZnQgPSBjbGllbnRSZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIGNvbnN0IHNjYWxlID0gaXNIVE1MRWxlbWVudChlbGVtZW50KSA/IGdldFNjYWxlKGVsZW1lbnQpIDogY3JlYXRlQ29vcmRzKDEpO1xuICBjb25zdCB3aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGggKiBzY2FsZS54O1xuICBjb25zdCBoZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodCAqIHNjYWxlLnk7XG4gIGNvbnN0IHggPSBsZWZ0ICogc2NhbGUueDtcbiAgY29uc3QgeSA9IHRvcCAqIHNjYWxlLnk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21DbGlwcGluZ0FuY2VzdG9yKGVsZW1lbnQsIGNsaXBwaW5nQW5jZXN0b3IsIHN0cmF0ZWd5KSB7XG4gIGxldCByZWN0O1xuICBpZiAoY2xpcHBpbmdBbmNlc3RvciA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgIHJlY3QgPSBnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpO1xuICB9IGVsc2UgaWYgKGNsaXBwaW5nQW5jZXN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICByZWN0ID0gZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSk7XG4gIH0gZWxzZSBpZiAoaXNFbGVtZW50KGNsaXBwaW5nQW5jZXN0b3IpKSB7XG4gICAgcmVjdCA9IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nQW5jZXN0b3IsIHN0cmF0ZWd5KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB2aXN1YWxPZmZzZXRzID0gZ2V0VmlzdWFsT2Zmc2V0cyhlbGVtZW50KTtcbiAgICByZWN0ID0ge1xuICAgICAgLi4uY2xpcHBpbmdBbmNlc3RvcixcbiAgICAgIHg6IGNsaXBwaW5nQW5jZXN0b3IueCAtIHZpc3VhbE9mZnNldHMueCxcbiAgICAgIHk6IGNsaXBwaW5nQW5jZXN0b3IueSAtIHZpc3VhbE9mZnNldHMueVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlY3RUb0NsaWVudFJlY3QocmVjdCk7XG59XG5mdW5jdGlvbiBoYXNGaXhlZFBvc2l0aW9uQW5jZXN0b3IoZWxlbWVudCwgc3RvcE5vZGUpIHtcbiAgY29uc3QgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG4gIGlmIChwYXJlbnROb2RlID09PSBzdG9wTm9kZSB8fCAhaXNFbGVtZW50KHBhcmVudE5vZGUpIHx8IGlzTGFzdFRyYXZlcnNhYmxlTm9kZShwYXJlbnROb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnROb2RlKS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJyB8fCBoYXNGaXhlZFBvc2l0aW9uQW5jZXN0b3IocGFyZW50Tm9kZSwgc3RvcE5vZGUpO1xufVxuXG4vLyBBIFwiY2xpcHBpbmcgYW5jZXN0b3JcIiBpcyBhbiBgb3ZlcmZsb3dgIGVsZW1lbnQgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIGNoaWxkIGVsZW1lbnRzLiBUaGlzIHJldHVybnMgYWxsIGNsaXBwaW5nIGFuY2VzdG9yc1xuLy8gb2YgdGhlIGdpdmVuIGVsZW1lbnQgdXAgdGhlIHRyZWUuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ0VsZW1lbnRBbmNlc3RvcnMoZWxlbWVudCwgY2FjaGUpIHtcbiAgY29uc3QgY2FjaGVkUmVzdWx0ID0gY2FjaGUuZ2V0KGVsZW1lbnQpO1xuICBpZiAoY2FjaGVkUmVzdWx0KSB7XG4gICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgfVxuICBsZXQgcmVzdWx0ID0gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZWxlbWVudCwgW10sIGZhbHNlKS5maWx0ZXIoZWwgPT4gaXNFbGVtZW50KGVsKSAmJiBnZXROb2RlTmFtZShlbCkgIT09ICdib2R5Jyk7XG4gIGxldCBjdXJyZW50Q29udGFpbmluZ0Jsb2NrQ29tcHV0ZWRTdHlsZSA9IG51bGw7XG4gIGNvbnN0IGVsZW1lbnRJc0ZpeGVkID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJztcbiAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudElzRml4ZWQgPyBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIDogZWxlbWVudDtcblxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ29udGFpbmluZ19ibG9jayNpZGVudGlmeWluZ190aGVfY29udGFpbmluZ19ibG9ja1xuICB3aGlsZSAoaXNFbGVtZW50KGN1cnJlbnROb2RlKSAmJiAhaXNMYXN0VHJhdmVyc2FibGVOb2RlKGN1cnJlbnROb2RlKSkge1xuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGN1cnJlbnROb2RlKTtcbiAgICBjb25zdCBjdXJyZW50Tm9kZUlzQ29udGFpbmluZyA9IGlzQ29udGFpbmluZ0Jsb2NrKGN1cnJlbnROb2RlKTtcbiAgICBpZiAoIWN1cnJlbnROb2RlSXNDb250YWluaW5nICYmIGNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIGN1cnJlbnRDb250YWluaW5nQmxvY2tDb21wdXRlZFN0eWxlID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkRHJvcEN1cnJlbnROb2RlID0gZWxlbWVudElzRml4ZWQgPyAhY3VycmVudE5vZGVJc0NvbnRhaW5pbmcgJiYgIWN1cnJlbnRDb250YWluaW5nQmxvY2tDb21wdXRlZFN0eWxlIDogIWN1cnJlbnROb2RlSXNDb250YWluaW5nICYmIGNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICdzdGF0aWMnICYmICEhY3VycmVudENvbnRhaW5pbmdCbG9ja0NvbXB1dGVkU3R5bGUgJiYgWydhYnNvbHV0ZScsICdmaXhlZCddLmluY2x1ZGVzKGN1cnJlbnRDb250YWluaW5nQmxvY2tDb21wdXRlZFN0eWxlLnBvc2l0aW9uKSB8fCBpc092ZXJmbG93RWxlbWVudChjdXJyZW50Tm9kZSkgJiYgIWN1cnJlbnROb2RlSXNDb250YWluaW5nICYmIGhhc0ZpeGVkUG9zaXRpb25BbmNlc3RvcihlbGVtZW50LCBjdXJyZW50Tm9kZSk7XG4gICAgaWYgKHNob3VsZERyb3BDdXJyZW50Tm9kZSkge1xuICAgICAgLy8gRHJvcCBub24tY29udGFpbmluZyBibG9ja3MuXG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKGFuY2VzdG9yID0+IGFuY2VzdG9yICE9PSBjdXJyZW50Tm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlY29yZCBsYXN0IGNvbnRhaW5pbmcgYmxvY2sgZm9yIG5leHQgaXRlcmF0aW9uLlxuICAgICAgY3VycmVudENvbnRhaW5pbmdCbG9ja0NvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlO1xuICAgIH1cbiAgICBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoY3VycmVudE5vZGUpO1xuICB9XG4gIGNhY2hlLnNldChlbGVtZW50LCByZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBhbmNlc3RvcnMuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoX3JlZikge1xuICBsZXQge1xuICAgIGVsZW1lbnQsXG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5LFxuICAgIHN0cmF0ZWd5XG4gIH0gPSBfcmVmO1xuICBjb25zdCBlbGVtZW50Q2xpcHBpbmdBbmNlc3RvcnMgPSBib3VuZGFyeSA9PT0gJ2NsaXBwaW5nQW5jZXN0b3JzJyA/IGlzVG9wTGF5ZXIoZWxlbWVudCkgPyBbXSA6IGdldENsaXBwaW5nRWxlbWVudEFuY2VzdG9ycyhlbGVtZW50LCB0aGlzLl9jKSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIGNvbnN0IGNsaXBwaW5nQW5jZXN0b3JzID0gWy4uLmVsZW1lbnRDbGlwcGluZ0FuY2VzdG9ycywgcm9vdEJvdW5kYXJ5XTtcbiAgY29uc3QgZmlyc3RDbGlwcGluZ0FuY2VzdG9yID0gY2xpcHBpbmdBbmNlc3RvcnNbMF07XG4gIGNvbnN0IGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nQW5jZXN0b3JzLnJlZHVjZSgoYWNjUmVjdCwgY2xpcHBpbmdBbmNlc3RvcikgPT4ge1xuICAgIGNvbnN0IHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbUNsaXBwaW5nQW5jZXN0b3IoZWxlbWVudCwgY2xpcHBpbmdBbmNlc3Rvciwgc3RyYXRlZ3kpO1xuICAgIGFjY1JlY3QudG9wID0gbWF4KHJlY3QudG9wLCBhY2NSZWN0LnRvcCk7XG4gICAgYWNjUmVjdC5yaWdodCA9IG1pbihyZWN0LnJpZ2h0LCBhY2NSZWN0LnJpZ2h0KTtcbiAgICBhY2NSZWN0LmJvdHRvbSA9IG1pbihyZWN0LmJvdHRvbSwgYWNjUmVjdC5ib3R0b20pO1xuICAgIGFjY1JlY3QubGVmdCA9IG1heChyZWN0LmxlZnQsIGFjY1JlY3QubGVmdCk7XG4gICAgcmV0dXJuIGFjY1JlY3Q7XG4gIH0sIGdldENsaWVudFJlY3RGcm9tQ2xpcHBpbmdBbmNlc3RvcihlbGVtZW50LCBmaXJzdENsaXBwaW5nQW5jZXN0b3IsIHN0cmF0ZWd5KSk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IGNsaXBwaW5nUmVjdC5yaWdodCAtIGNsaXBwaW5nUmVjdC5sZWZ0LFxuICAgIGhlaWdodDogY2xpcHBpbmdSZWN0LmJvdHRvbSAtIGNsaXBwaW5nUmVjdC50b3AsXG4gICAgeDogY2xpcHBpbmdSZWN0LmxlZnQsXG4gICAgeTogY2xpcHBpbmdSZWN0LnRvcFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXREaW1lbnNpb25zKGVsZW1lbnQpIHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodFxuICB9ID0gZ2V0Q3NzRGltZW5zaW9ucyhlbGVtZW50KTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVjdFJlbGF0aXZlVG9PZmZzZXRQYXJlbnQoZWxlbWVudCwgb2Zmc2V0UGFyZW50LCBzdHJhdGVneSkge1xuICBjb25zdCBpc09mZnNldFBhcmVudEFuRWxlbWVudCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgY29uc3QgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIGNvbnN0IGlzRml4ZWQgPSBzdHJhdGVneSA9PT0gJ2ZpeGVkJztcbiAgY29uc3QgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCB0cnVlLCBpc0ZpeGVkLCBvZmZzZXRQYXJlbnQpO1xuICBsZXQgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIGNvbnN0IG9mZnNldHMgPSBjcmVhdGVDb29yZHMoMCk7XG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IGlzT3ZlcmZsb3dFbGVtZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG4gICAgaWYgKGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50KSB7XG4gICAgICBjb25zdCBvZmZzZXRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCwgdHJ1ZSwgaXNGaXhlZCwgb2Zmc2V0UGFyZW50KTtcbiAgICAgIG9mZnNldHMueCA9IG9mZnNldFJlY3QueCArIG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ID0gb2Zmc2V0UmVjdC55ICsgb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBjb25zdCB4ID0gcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLng7XG4gIGNvbnN0IHkgPSByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnk7XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNTdGF0aWNQb3NpdGlvbmVkKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnO1xufVxuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQsIHBvbHlmaWxsKSB7XG4gIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHBvbHlmaWxsKSB7XG4gICAgcmV0dXJuIHBvbHlmaWxsKGVsZW1lbnQpO1xuICB9XG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn1cblxuLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cbmZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50LCBwb2x5ZmlsbCkge1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIGlmIChpc1RvcExheWVyKGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIHdpbjtcbiAgfVxuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBsZXQgc3ZnT2Zmc2V0UGFyZW50ID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICB3aGlsZSAoc3ZnT2Zmc2V0UGFyZW50ICYmICFpc0xhc3RUcmF2ZXJzYWJsZU5vZGUoc3ZnT2Zmc2V0UGFyZW50KSkge1xuICAgICAgaWYgKGlzRWxlbWVudChzdmdPZmZzZXRQYXJlbnQpICYmICFpc1N0YXRpY1Bvc2l0aW9uZWQoc3ZnT2Zmc2V0UGFyZW50KSkge1xuICAgICAgICByZXR1cm4gc3ZnT2Zmc2V0UGFyZW50O1xuICAgICAgfVxuICAgICAgc3ZnT2Zmc2V0UGFyZW50ID0gZ2V0UGFyZW50Tm9kZShzdmdPZmZzZXRQYXJlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gd2luO1xuICB9XG4gIGxldCBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQsIHBvbHlmaWxsKTtcbiAgd2hpbGUgKG9mZnNldFBhcmVudCAmJiBpc1RhYmxlRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGlzU3RhdGljUG9zaXRpb25lZChvZmZzZXRQYXJlbnQpKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQsIHBvbHlmaWxsKTtcbiAgfVxuICBpZiAob2Zmc2V0UGFyZW50ICYmIGlzTGFzdFRyYXZlcnNhYmxlTm9kZShvZmZzZXRQYXJlbnQpICYmIGlzU3RhdGljUG9zaXRpb25lZChvZmZzZXRQYXJlbnQpICYmICFpc0NvbnRhaW5pbmdCbG9jayhvZmZzZXRQYXJlbnQpKSB7XG4gICAgcmV0dXJuIHdpbjtcbiAgfVxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW47XG59XG5cbmNvbnN0IGdldEVsZW1lbnRSZWN0cyA9IGFzeW5jIGZ1bmN0aW9uIChkYXRhKSB7XG4gIGNvbnN0IGdldE9mZnNldFBhcmVudEZuID0gdGhpcy5nZXRPZmZzZXRQYXJlbnQgfHwgZ2V0T2Zmc2V0UGFyZW50O1xuICBjb25zdCBnZXREaW1lbnNpb25zRm4gPSB0aGlzLmdldERpbWVuc2lvbnM7XG4gIGNvbnN0IGZsb2F0aW5nRGltZW5zaW9ucyA9IGF3YWl0IGdldERpbWVuc2lvbnNGbihkYXRhLmZsb2F0aW5nKTtcbiAgcmV0dXJuIHtcbiAgICByZWZlcmVuY2U6IGdldFJlY3RSZWxhdGl2ZVRvT2Zmc2V0UGFyZW50KGRhdGEucmVmZXJlbmNlLCBhd2FpdCBnZXRPZmZzZXRQYXJlbnRGbihkYXRhLmZsb2F0aW5nKSwgZGF0YS5zdHJhdGVneSksXG4gICAgZmxvYXRpbmc6IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgd2lkdGg6IGZsb2F0aW5nRGltZW5zaW9ucy53aWR0aCxcbiAgICAgIGhlaWdodDogZmxvYXRpbmdEaW1lbnNpb25zLmhlaWdodFxuICAgIH1cbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGlzUlRMKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZGlyZWN0aW9uID09PSAncnRsJztcbn1cblxuY29uc3QgcGxhdGZvcm0gPSB7XG4gIGNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0LFxuICBnZXREb2N1bWVudEVsZW1lbnQsXG4gIGdldENsaXBwaW5nUmVjdCxcbiAgZ2V0T2Zmc2V0UGFyZW50LFxuICBnZXRFbGVtZW50UmVjdHMsXG4gIGdldENsaWVudFJlY3RzLFxuICBnZXREaW1lbnNpb25zLFxuICBnZXRTY2FsZSxcbiAgaXNFbGVtZW50LFxuICBpc1JUTFxufTtcblxuLy8gaHR0cHM6Ly9zYW10aG9yLmF1LzIwMjEvb2JzZXJ2aW5nLWRvbS9cbmZ1bmN0aW9uIG9ic2VydmVNb3ZlKGVsZW1lbnQsIG9uTW92ZSkge1xuICBsZXQgaW8gPSBudWxsO1xuICBsZXQgdGltZW91dElkO1xuICBjb25zdCByb290ID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHZhciBfaW87XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgKF9pbyA9IGlvKSA9PSBudWxsIHx8IF9pby5kaXNjb25uZWN0KCk7XG4gICAgaW8gPSBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIHJlZnJlc2goc2tpcCwgdGhyZXNob2xkKSB7XG4gICAgaWYgKHNraXAgPT09IHZvaWQgMCkge1xuICAgICAgc2tpcCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhyZXNob2xkID09PSB2b2lkIDApIHtcbiAgICAgIHRocmVzaG9sZCA9IDE7XG4gICAgfVxuICAgIGNsZWFudXAoKTtcbiAgICBjb25zdCB7XG4gICAgICBsZWZ0LFxuICAgICAgdG9wLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoIXNraXApIHtcbiAgICAgIG9uTW92ZSgpO1xuICAgIH1cbiAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5zZXRUb3AgPSBmbG9vcih0b3ApO1xuICAgIGNvbnN0IGluc2V0UmlnaHQgPSBmbG9vcihyb290LmNsaWVudFdpZHRoIC0gKGxlZnQgKyB3aWR0aCkpO1xuICAgIGNvbnN0IGluc2V0Qm90dG9tID0gZmxvb3Iocm9vdC5jbGllbnRIZWlnaHQgLSAodG9wICsgaGVpZ2h0KSk7XG4gICAgY29uc3QgaW5zZXRMZWZ0ID0gZmxvb3IobGVmdCk7XG4gICAgY29uc3Qgcm9vdE1hcmdpbiA9IC1pbnNldFRvcCArIFwicHggXCIgKyAtaW5zZXRSaWdodCArIFwicHggXCIgKyAtaW5zZXRCb3R0b20gKyBcInB4IFwiICsgLWluc2V0TGVmdCArIFwicHhcIjtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcm9vdE1hcmdpbixcbiAgICAgIHRocmVzaG9sZDogbWF4KDAsIG1pbigxLCB0aHJlc2hvbGQpKSB8fCAxXG4gICAgfTtcbiAgICBsZXQgaXNGaXJzdFVwZGF0ZSA9IHRydWU7XG4gICAgZnVuY3Rpb24gaGFuZGxlT2JzZXJ2ZShlbnRyaWVzKSB7XG4gICAgICBjb25zdCByYXRpbyA9IGVudHJpZXNbMF0uaW50ZXJzZWN0aW9uUmF0aW87XG4gICAgICBpZiAocmF0aW8gIT09IHRocmVzaG9sZCkge1xuICAgICAgICBpZiAoIWlzRmlyc3RVcGRhdGUpIHtcbiAgICAgICAgICByZXR1cm4gcmVmcmVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmF0aW8pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgcmVmZXJlbmNlIGlzIGNsaXBwZWQsIHRoZSByYXRpbyBpcyAwLiBUaHJvdHRsZSB0aGUgcmVmcmVzaFxuICAgICAgICAgIC8vIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiB1cGRhdGVzLlxuICAgICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaChmYWxzZSwgMWUtNyk7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmcmVzaChmYWxzZSwgcmF0aW8pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpc0ZpcnN0VXBkYXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT2xkZXIgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCBhIGBkb2N1bWVudGAgYXMgdGhlIHJvb3QgYW5kIHdpbGwgdGhyb3cgYW5cbiAgICAvLyBlcnJvci5cbiAgICB0cnkge1xuICAgICAgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoaGFuZGxlT2JzZXJ2ZSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAvLyBIYW5kbGUgPGlmcmFtZT5zXG4gICAgICAgIHJvb3Q6IHJvb3Qub3duZXJEb2N1bWVudFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoaGFuZGxlT2JzZXJ2ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlvLm9ic2VydmUoZWxlbWVudCk7XG4gIH1cbiAgcmVmcmVzaCh0cnVlKTtcbiAgcmV0dXJuIGNsZWFudXA7XG59XG5cbi8qKlxuICogQXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGVuIG5lY2Vzc2FyeS5cbiAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzIG1vdW50ZWQgb24gdGhlIERPTSBvclxuICogdmlzaWJsZSBvbiB0aGUgc2NyZWVuLlxuICogQHJldHVybnMgY2xlYW51cCBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBpbnZva2VkIHdoZW4gdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXNcbiAqIHJlbW92ZWQgZnJvbSB0aGUgRE9NIG9yIGhpZGRlbiBmcm9tIHRoZSBzY3JlZW4uXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXV0b1VwZGF0ZVxuICovXG5mdW5jdGlvbiBhdXRvVXBkYXRlKHJlZmVyZW5jZSwgZmxvYXRpbmcsIHVwZGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBhbmNlc3RvclNjcm9sbCA9IHRydWUsXG4gICAgYW5jZXN0b3JSZXNpemUgPSB0cnVlLFxuICAgIGVsZW1lbnRSZXNpemUgPSB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicsXG4gICAgbGF5b3V0U2hpZnQgPSB0eXBlb2YgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicsXG4gICAgYW5pbWF0aW9uRnJhbWUgPSBmYWxzZVxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcmVmZXJlbmNlRWwgPSB1bndyYXBFbGVtZW50KHJlZmVyZW5jZSk7XG4gIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yU2Nyb2xsIHx8IGFuY2VzdG9yUmVzaXplID8gWy4uLihyZWZlcmVuY2VFbCA/IGdldE92ZXJmbG93QW5jZXN0b3JzKHJlZmVyZW5jZUVsKSA6IFtdKSwgLi4uZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZmxvYXRpbmcpXSA6IFtdO1xuICBhbmNlc3RvcnMuZm9yRWFjaChhbmNlc3RvciA9PiB7XG4gICAgYW5jZXN0b3JTY3JvbGwgJiYgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgYW5jZXN0b3JSZXNpemUgJiYgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlKTtcbiAgfSk7XG4gIGNvbnN0IGNsZWFudXBJbyA9IHJlZmVyZW5jZUVsICYmIGxheW91dFNoaWZ0ID8gb2JzZXJ2ZU1vdmUocmVmZXJlbmNlRWwsIHVwZGF0ZSkgOiBudWxsO1xuICBsZXQgcmVvYnNlcnZlRnJhbWUgPSAtMTtcbiAgbGV0IHJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgaWYgKGVsZW1lbnRSZXNpemUpIHtcbiAgICByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihfcmVmID0+IHtcbiAgICAgIGxldCBbZmlyc3RFbnRyeV0gPSBfcmVmO1xuICAgICAgaWYgKGZpcnN0RW50cnkgJiYgZmlyc3RFbnRyeS50YXJnZXQgPT09IHJlZmVyZW5jZUVsICYmIHJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICAgIC8vIFByZXZlbnQgdXBkYXRlIGxvb3BzIHdoZW4gdXNpbmcgdGhlIGBzaXplYCBtaWRkbGV3YXJlLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzE3NDBcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKGZsb2F0aW5nKTtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmVvYnNlcnZlRnJhbWUpO1xuICAgICAgICByZW9ic2VydmVGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgdmFyIF9yZXNpemVPYnNlcnZlcjtcbiAgICAgICAgICAoX3Jlc2l6ZU9ic2VydmVyID0gcmVzaXplT2JzZXJ2ZXIpID09IG51bGwgfHwgX3Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoZmxvYXRpbmcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZSgpO1xuICAgIH0pO1xuICAgIGlmIChyZWZlcmVuY2VFbCAmJiAhYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUocmVmZXJlbmNlRWwpO1xuICAgIH1cbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGZsb2F0aW5nKTtcbiAgfVxuICBsZXQgZnJhbWVJZDtcbiAgbGV0IHByZXZSZWZSZWN0ID0gYW5pbWF0aW9uRnJhbWUgPyBnZXRCb3VuZGluZ0NsaWVudFJlY3QocmVmZXJlbmNlKSA6IG51bGw7XG4gIGlmIChhbmltYXRpb25GcmFtZSkge1xuICAgIGZyYW1lTG9vcCgpO1xuICB9XG4gIGZ1bmN0aW9uIGZyYW1lTG9vcCgpIHtcbiAgICBjb25zdCBuZXh0UmVmUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChyZWZlcmVuY2UpO1xuICAgIGlmIChwcmV2UmVmUmVjdCAmJiAobmV4dFJlZlJlY3QueCAhPT0gcHJldlJlZlJlY3QueCB8fCBuZXh0UmVmUmVjdC55ICE9PSBwcmV2UmVmUmVjdC55IHx8IG5leHRSZWZSZWN0LndpZHRoICE9PSBwcmV2UmVmUmVjdC53aWR0aCB8fCBuZXh0UmVmUmVjdC5oZWlnaHQgIT09IHByZXZSZWZSZWN0LmhlaWdodCkpIHtcbiAgICAgIHVwZGF0ZSgpO1xuICAgIH1cbiAgICBwcmV2UmVmUmVjdCA9IG5leHRSZWZSZWN0O1xuICAgIGZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWVMb29wKTtcbiAgfVxuICB1cGRhdGUoKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICB2YXIgX3Jlc2l6ZU9ic2VydmVyMjtcbiAgICBhbmNlc3RvcnMuZm9yRWFjaChhbmNlc3RvciA9PiB7XG4gICAgICBhbmNlc3RvclNjcm9sbCAmJiBhbmNlc3Rvci5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGUpO1xuICAgICAgYW5jZXN0b3JSZXNpemUgJiYgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlKTtcbiAgICB9KTtcbiAgICBjbGVhbnVwSW8gPT0gbnVsbCB8fCBjbGVhbnVwSW8oKTtcbiAgICAoX3Jlc2l6ZU9ic2VydmVyMiA9IHJlc2l6ZU9ic2VydmVyKSA9PSBudWxsIHx8IF9yZXNpemVPYnNlcnZlcjIuZGlzY29ubmVjdCgpO1xuICAgIHJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgICBpZiAoYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGZyYW1lSWQpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBvZiBvdmVyZmxvdyBzaWRlIG9mZnNldHMgdGhhdCBkZXRlcm1pbmUgaG93IG11Y2ggdGhlXG4gKiBlbGVtZW50IGlzIG92ZXJmbG93aW5nIGEgZ2l2ZW4gY2xpcHBpbmcgYm91bmRhcnkgb24gZWFjaCBzaWRlLlxuICogLSBwb3NpdGl2ZSA9IG92ZXJmbG93aW5nIHRoZSBib3VuZGFyeSBieSB0aGF0IG51bWJlciBvZiBwaXhlbHNcbiAqIC0gbmVnYXRpdmUgPSBob3cgbWFueSBwaXhlbHMgbGVmdCBiZWZvcmUgaXQgd2lsbCBvdmVyZmxvd1xuICogLSAwID0gbGllcyBmbHVzaCB3aXRoIHRoZSBib3VuZGFyeVxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2RldGVjdE92ZXJmbG93XG4gKi9cbmNvbnN0IGRldGVjdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3ckMTtcblxuLyoqXG4gKiBNb2RpZmllcyB0aGUgcGxhY2VtZW50IGJ5IHRyYW5zbGF0aW5nIHRoZSBmbG9hdGluZyBlbGVtZW50IGFsb25nIHRoZVxuICogc3BlY2lmaWVkIGF4ZXMuXG4gKiBBIG51bWJlciAoc2hvcnRoYW5kIGZvciBgbWFpbkF4aXNgIG9yIGRpc3RhbmNlKSwgb3IgYW4gYXhlcyBjb25maWd1cmF0aW9uXG4gKiBvYmplY3QgbWF5IGJlIHBhc3NlZC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9vZmZzZXRcbiAqL1xuY29uc3Qgb2Zmc2V0ID0gb2Zmc2V0JDE7XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IGNob29zaW5nIHRoZSBwbGFjZW1lbnRcbiAqIHRoYXQgaGFzIHRoZSBtb3N0IHNwYWNlIGF2YWlsYWJsZSBhdXRvbWF0aWNhbGx5LCB3aXRob3V0IG5lZWRpbmcgdG8gc3BlY2lmeSBhXG4gKiBwcmVmZXJyZWQgcGxhY2VtZW50LiBBbHRlcm5hdGl2ZSB0byBgZmxpcGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXV0b1BsYWNlbWVudFxuICovXG5jb25zdCBhdXRvUGxhY2VtZW50ID0gYXV0b1BsYWNlbWVudCQxO1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBzaGlmdGluZyBpdCBpbiBvcmRlciB0b1xuICoga2VlcCBpdCBpbiB2aWV3IHdoZW4gaXQgd2lsbCBvdmVyZmxvdyB0aGUgY2xpcHBpbmcgYm91bmRhcnkuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2hpZnRcbiAqL1xuY29uc3Qgc2hpZnQgPSBzaGlmdCQxO1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBmbGlwcGluZyB0aGUgYHBsYWNlbWVudGBcbiAqIGluIG9yZGVyIHRvIGtlZXAgaXQgaW4gdmlldyB3aGVuIHRoZSBwcmVmZXJyZWQgcGxhY2VtZW50KHMpIHdpbGwgb3ZlcmZsb3cgdGhlXG4gKiBjbGlwcGluZyBib3VuZGFyeS4gQWx0ZXJuYXRpdmUgdG8gYGF1dG9QbGFjZW1lbnRgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2ZsaXBcbiAqL1xuY29uc3QgZmxpcCA9IGZsaXAkMTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRoYXQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQg4oCUXG4gKiBmb3IgaW5zdGFuY2UsIHByZXZlbnQgaXQgZnJvbSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgYm91bmRhcnkgb3IgbWF0Y2ggdGhlXG4gKiB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2l6ZVxuICovXG5jb25zdCBzaXplID0gc2l6ZSQxO1xuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gaGlkZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBpbiBhcHBsaWNhYmxlIHNpdHVhdGlvbnMsIHN1Y2ggYXNcbiAqIHdoZW4gaXQgaXMgbm90IGluIHRoZSBzYW1lIGNsaXBwaW5nIGNvbnRleHQgYXMgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2hpZGVcbiAqL1xuY29uc3QgaGlkZSA9IGhpZGUkMTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIHBvc2l0aW9uIGFuIGlubmVyIGVsZW1lbnQgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgc28gdGhhdCBpdFxuICogYXBwZWFycyBjZW50ZXJlZCB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXJyb3dcbiAqL1xuY29uc3QgYXJyb3cgPSBhcnJvdyQxO1xuXG4vKipcbiAqIFByb3ZpZGVzIGltcHJvdmVkIHBvc2l0aW9uaW5nIGZvciBpbmxpbmUgcmVmZXJlbmNlIGVsZW1lbnRzIHRoYXQgY2FuIHNwYW5cbiAqIG92ZXIgbXVsdGlwbGUgbGluZXMsIHN1Y2ggYXMgaHlwZXJsaW5rcyBvciByYW5nZSBzZWxlY3Rpb25zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2lubGluZVxuICovXG5jb25zdCBpbmxpbmUgPSBpbmxpbmUkMTtcblxuLyoqXG4gKiBCdWlsdC1pbiBgbGltaXRlcmAgdGhhdCB3aWxsIHN0b3AgYHNoaWZ0KClgIGF0IGEgY2VydGFpbiBwb2ludC5cbiAqL1xuY29uc3QgbGltaXRTaGlmdCA9IGxpbWl0U2hpZnQkMTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMgdGhhdCB3aWxsIHBsYWNlIHRoZSBmbG9hdGluZyBlbGVtZW50XG4gKiBuZXh0IHRvIGEgZ2l2ZW4gcmVmZXJlbmNlIGVsZW1lbnQuXG4gKi9cbmNvbnN0IGNvbXB1dGVQb3NpdGlvbiA9IChyZWZlcmVuY2UsIGZsb2F0aW5nLCBvcHRpb25zKSA9PiB7XG4gIC8vIFRoaXMgY2FjaGVzIHRoZSBleHBlbnNpdmUgYGdldENsaXBwaW5nRWxlbWVudEFuY2VzdG9yc2AgZnVuY3Rpb24gc28gdGhhdFxuICAvLyBtdWx0aXBsZSBsaWZlY3ljbGUgcmVzZXRzIHJlLXVzZSB0aGUgc2FtZSByZXN1bHQuIEl0IG9ubHkgbGl2ZXMgZm9yIGFcbiAgLy8gc2luZ2xlIGNhbGwuIElmIG90aGVyIGZ1bmN0aW9ucyBiZWNvbWUgZXhwZW5zaXZlLCB3ZSBjYW4gYWRkIHRoZW0gYXMgd2VsbC5cbiAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7XG4gICAgcGxhdGZvcm0sXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICBjb25zdCBwbGF0Zm9ybVdpdGhDYWNoZSA9IHtcbiAgICAuLi5tZXJnZWRPcHRpb25zLnBsYXRmb3JtLFxuICAgIF9jOiBjYWNoZVxuICB9O1xuICByZXR1cm4gY29tcHV0ZVBvc2l0aW9uJDEocmVmZXJlbmNlLCBmbG9hdGluZywge1xuICAgIC4uLm1lcmdlZE9wdGlvbnMsXG4gICAgcGxhdGZvcm06IHBsYXRmb3JtV2l0aENhY2hlXG4gIH0pO1xufTtcblxuZXhwb3J0IHsgYXJyb3csIGF1dG9QbGFjZW1lbnQsIGF1dG9VcGRhdGUsIGNvbXB1dGVQb3NpdGlvbiwgZGV0ZWN0T3ZlcmZsb3csIGZsaXAsIGhpZGUsIGlubGluZSwgbGltaXRTaGlmdCwgb2Zmc2V0LCBwbGF0Zm9ybSwgc2hpZnQsIHNpemUgfTtcbiIsImltcG9ydCB7IGNvbXB1dGVQb3NpdGlvbiwgYXJyb3cgYXMgYXJyb3ckMiwgb2Zmc2V0IGFzIG9mZnNldCQxLCBzaGlmdCBhcyBzaGlmdCQxLCBsaW1pdFNoaWZ0IGFzIGxpbWl0U2hpZnQkMSwgZmxpcCBhcyBmbGlwJDEsIHNpemUgYXMgc2l6ZSQxLCBhdXRvUGxhY2VtZW50IGFzIGF1dG9QbGFjZW1lbnQkMSwgaGlkZSBhcyBoaWRlJDEsIGlubGluZSBhcyBpbmxpbmUkMSB9IGZyb20gJ0BmbG9hdGluZy11aS9kb20nO1xuZXhwb3J0IHsgYXV0b1VwZGF0ZSwgY29tcHV0ZVBvc2l0aW9uLCBkZXRlY3RPdmVyZmxvdywgZ2V0T3ZlcmZsb3dBbmNlc3RvcnMsIHBsYXRmb3JtIH0gZnJvbSAnQGZsb2F0aW5nLXVpL2RvbSc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbnZhciBpbmRleCA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyB1c2VMYXlvdXRFZmZlY3QgOiB1c2VFZmZlY3Q7XG5cbi8vIEZvcmsgb2YgYGZhc3QtZGVlcC1lcXVhbGAgdGhhdCBvbmx5IGRvZXMgdGhlIGNvbXBhcmlzb25zIHdlIG5lZWQgYW5kIGNvbXBhcmVzXG4vLyBmdW5jdGlvbnNcbmZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIGEgPT09ICdmdW5jdGlvbicgJiYgYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBsZXQgbGVuZ3RoO1xuICBsZXQgaTtcbiAgbGV0IGtleXM7XG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiW2ldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICBpZiAoIXt9Lmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5c1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoa2V5ID09PSAnX293bmVyJyAmJiBhLiQkdHlwZW9mKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFkZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbn1cblxuZnVuY3Rpb24gZ2V0RFBSKGVsZW1lbnQpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgY29uc3Qgd2luID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgcmV0dXJuIHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG59XG5cbmZ1bmN0aW9uIHJvdW5kQnlEUFIoZWxlbWVudCwgdmFsdWUpIHtcbiAgY29uc3QgZHByID0gZ2V0RFBSKGVsZW1lbnQpO1xuICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIGRwcikgLyBkcHI7XG59XG5cbmZ1bmN0aW9uIHVzZUxhdGVzdFJlZih2YWx1ZSkge1xuICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYodmFsdWUpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZWY7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhIGZsb2F0aW5nIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlRmxvYXRpbmdcbiAqL1xuZnVuY3Rpb24gdXNlRmxvYXRpbmcob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBwbGFjZW1lbnQgPSAnYm90dG9tJyxcbiAgICBzdHJhdGVneSA9ICdhYnNvbHV0ZScsXG4gICAgbWlkZGxld2FyZSA9IFtdLFxuICAgIHBsYXRmb3JtLFxuICAgIGVsZW1lbnRzOiB7XG4gICAgICByZWZlcmVuY2U6IGV4dGVybmFsUmVmZXJlbmNlLFxuICAgICAgZmxvYXRpbmc6IGV4dGVybmFsRmxvYXRpbmdcbiAgICB9ID0ge30sXG4gICAgdHJhbnNmb3JtID0gdHJ1ZSxcbiAgICB3aGlsZUVsZW1lbnRzTW91bnRlZCxcbiAgICBvcGVuXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBbZGF0YSwgc2V0RGF0YV0gPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHN0cmF0ZWd5LFxuICAgIHBsYWNlbWVudCxcbiAgICBtaWRkbGV3YXJlRGF0YToge30sXG4gICAgaXNQb3NpdGlvbmVkOiBmYWxzZVxuICB9KTtcbiAgY29uc3QgW2xhdGVzdE1pZGRsZXdhcmUsIHNldExhdGVzdE1pZGRsZXdhcmVdID0gUmVhY3QudXNlU3RhdGUobWlkZGxld2FyZSk7XG4gIGlmICghZGVlcEVxdWFsKGxhdGVzdE1pZGRsZXdhcmUsIG1pZGRsZXdhcmUpKSB7XG4gICAgc2V0TGF0ZXN0TWlkZGxld2FyZShtaWRkbGV3YXJlKTtcbiAgfVxuICBjb25zdCBbX3JlZmVyZW5jZSwgX3NldFJlZmVyZW5jZV0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW19mbG9hdGluZywgX3NldEZsb2F0aW5nXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBzZXRSZWZlcmVuY2UgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBpZiAobm9kZSAhPT0gcmVmZXJlbmNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJlZmVyZW5jZVJlZi5jdXJyZW50ID0gbm9kZTtcbiAgICAgIF9zZXRSZWZlcmVuY2Uobm9kZSk7XG4gICAgfVxuICB9LCBbXSk7XG4gIGNvbnN0IHNldEZsb2F0aW5nID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgaWYgKG5vZGUgIT09IGZsb2F0aW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgIGZsb2F0aW5nUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgX3NldEZsb2F0aW5nKG5vZGUpO1xuICAgIH1cbiAgfSwgW10pO1xuICBjb25zdCByZWZlcmVuY2VFbCA9IGV4dGVybmFsUmVmZXJlbmNlIHx8IF9yZWZlcmVuY2U7XG4gIGNvbnN0IGZsb2F0aW5nRWwgPSBleHRlcm5hbEZsb2F0aW5nIHx8IF9mbG9hdGluZztcbiAgY29uc3QgcmVmZXJlbmNlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBmbG9hdGluZ1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgZGF0YVJlZiA9IFJlYWN0LnVzZVJlZihkYXRhKTtcbiAgY29uc3QgaGFzV2hpbGVFbGVtZW50c01vdW50ZWQgPSB3aGlsZUVsZW1lbnRzTW91bnRlZCAhPSBudWxsO1xuICBjb25zdCB3aGlsZUVsZW1lbnRzTW91bnRlZFJlZiA9IHVzZUxhdGVzdFJlZih3aGlsZUVsZW1lbnRzTW91bnRlZCk7XG4gIGNvbnN0IHBsYXRmb3JtUmVmID0gdXNlTGF0ZXN0UmVmKHBsYXRmb3JtKTtcbiAgY29uc3QgdXBkYXRlID0gUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghcmVmZXJlbmNlUmVmLmN1cnJlbnQgfHwgIWZsb2F0aW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgcGxhY2VtZW50LFxuICAgICAgc3RyYXRlZ3ksXG4gICAgICBtaWRkbGV3YXJlOiBsYXRlc3RNaWRkbGV3YXJlXG4gICAgfTtcbiAgICBpZiAocGxhdGZvcm1SZWYuY3VycmVudCkge1xuICAgICAgY29uZmlnLnBsYXRmb3JtID0gcGxhdGZvcm1SZWYuY3VycmVudDtcbiAgICB9XG4gICAgY29tcHV0ZVBvc2l0aW9uKHJlZmVyZW5jZVJlZi5jdXJyZW50LCBmbG9hdGluZ1JlZi5jdXJyZW50LCBjb25maWcpLnRoZW4oZGF0YSA9PiB7XG4gICAgICBjb25zdCBmdWxsRGF0YSA9IHtcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgaXNQb3NpdGlvbmVkOiB0cnVlXG4gICAgICB9O1xuICAgICAgaWYgKGlzTW91bnRlZFJlZi5jdXJyZW50ICYmICFkZWVwRXF1YWwoZGF0YVJlZi5jdXJyZW50LCBmdWxsRGF0YSkpIHtcbiAgICAgICAgZGF0YVJlZi5jdXJyZW50ID0gZnVsbERhdGE7XG4gICAgICAgIFJlYWN0RE9NLmZsdXNoU3luYygoKSA9PiB7XG4gICAgICAgICAgc2V0RGF0YShmdWxsRGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbbGF0ZXN0TWlkZGxld2FyZSwgcGxhY2VtZW50LCBzdHJhdGVneSwgcGxhdGZvcm1SZWZdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChvcGVuID09PSBmYWxzZSAmJiBkYXRhUmVmLmN1cnJlbnQuaXNQb3NpdGlvbmVkKSB7XG4gICAgICBkYXRhUmVmLmN1cnJlbnQuaXNQb3NpdGlvbmVkID0gZmFsc2U7XG4gICAgICBzZXREYXRhKGRhdGEgPT4gKHtcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgaXNQb3NpdGlvbmVkOiBmYWxzZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfSwgW29wZW5dKTtcbiAgY29uc3QgaXNNb3VudGVkUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlzTW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaXNNb3VudGVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAocmVmZXJlbmNlRWwpIHJlZmVyZW5jZVJlZi5jdXJyZW50ID0gcmVmZXJlbmNlRWw7XG4gICAgaWYgKGZsb2F0aW5nRWwpIGZsb2F0aW5nUmVmLmN1cnJlbnQgPSBmbG9hdGluZ0VsO1xuICAgIGlmIChyZWZlcmVuY2VFbCAmJiBmbG9hdGluZ0VsKSB7XG4gICAgICBpZiAod2hpbGVFbGVtZW50c01vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm4gd2hpbGVFbGVtZW50c01vdW50ZWRSZWYuY3VycmVudChyZWZlcmVuY2VFbCwgZmxvYXRpbmdFbCwgdXBkYXRlKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZSgpO1xuICAgIH1cbiAgfSwgW3JlZmVyZW5jZUVsLCBmbG9hdGluZ0VsLCB1cGRhdGUsIHdoaWxlRWxlbWVudHNNb3VudGVkUmVmLCBoYXNXaGlsZUVsZW1lbnRzTW91bnRlZF0pO1xuICBjb25zdCByZWZzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlUmVmLFxuICAgIGZsb2F0aW5nOiBmbG9hdGluZ1JlZixcbiAgICBzZXRSZWZlcmVuY2UsXG4gICAgc2V0RmxvYXRpbmdcbiAgfSksIFtzZXRSZWZlcmVuY2UsIHNldEZsb2F0aW5nXSk7XG4gIGNvbnN0IGVsZW1lbnRzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlRWwsXG4gICAgZmxvYXRpbmc6IGZsb2F0aW5nRWxcbiAgfSksIFtyZWZlcmVuY2VFbCwgZmxvYXRpbmdFbF0pO1xuICBjb25zdCBmbG9hdGluZ1N0eWxlcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGluaXRpYWxTdHlsZXMgPSB7XG4gICAgICBwb3NpdGlvbjogc3RyYXRlZ3ksXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwXG4gICAgfTtcbiAgICBpZiAoIWVsZW1lbnRzLmZsb2F0aW5nKSB7XG4gICAgICByZXR1cm4gaW5pdGlhbFN0eWxlcztcbiAgICB9XG4gICAgY29uc3QgeCA9IHJvdW5kQnlEUFIoZWxlbWVudHMuZmxvYXRpbmcsIGRhdGEueCk7XG4gICAgY29uc3QgeSA9IHJvdW5kQnlEUFIoZWxlbWVudHMuZmxvYXRpbmcsIGRhdGEueSk7XG4gICAgaWYgKHRyYW5zZm9ybSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5pdGlhbFN0eWxlcyxcbiAgICAgICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZShcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4KVwiLFxuICAgICAgICAuLi4oZ2V0RFBSKGVsZW1lbnRzLmZsb2F0aW5nKSA+PSAxLjUgJiYge1xuICAgICAgICAgIHdpbGxDaGFuZ2U6ICd0cmFuc2Zvcm0nXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IHN0cmF0ZWd5LFxuICAgICAgbGVmdDogeCxcbiAgICAgIHRvcDogeVxuICAgIH07XG4gIH0sIFtzdHJhdGVneSwgdHJhbnNmb3JtLCBlbGVtZW50cy5mbG9hdGluZywgZGF0YS54LCBkYXRhLnldKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5kYXRhLFxuICAgIHVwZGF0ZSxcbiAgICByZWZzLFxuICAgIGVsZW1lbnRzLFxuICAgIGZsb2F0aW5nU3R5bGVzXG4gIH0pLCBbZGF0YSwgdXBkYXRlLCByZWZzLCBlbGVtZW50cywgZmxvYXRpbmdTdHlsZXNdKTtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIHBvc2l0aW9uIGFuIGlubmVyIGVsZW1lbnQgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgc28gdGhhdCBpdFxuICogYXBwZWFycyBjZW50ZXJlZCB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBUaGlzIHdyYXBzIHRoZSBjb3JlIGBhcnJvd2AgbWlkZGxld2FyZSB0byBhbGxvdyBSZWFjdCByZWZzIGFzIHRoZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2Fycm93XG4gKi9cbmNvbnN0IGFycm93JDEgPSBvcHRpb25zID0+IHtcbiAgZnVuY3Rpb24gaXNSZWYodmFsdWUpIHtcbiAgICByZXR1cm4ge30uaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2N1cnJlbnQnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdhcnJvdycsXG4gICAgb3B0aW9ucyxcbiAgICBmbihzdGF0ZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBlbGVtZW50LFxuICAgICAgICBwYWRkaW5nXG4gICAgICB9ID0gdHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zKHN0YXRlKSA6IG9wdGlvbnM7XG4gICAgICBpZiAoZWxlbWVudCAmJiBpc1JlZihlbGVtZW50KSkge1xuICAgICAgICBpZiAoZWxlbWVudC5jdXJyZW50ICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gYXJyb3ckMih7XG4gICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LmN1cnJlbnQsXG4gICAgICAgICAgICBwYWRkaW5nXG4gICAgICAgICAgfSkuZm4oc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBhcnJvdyQyKHtcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIHBhZGRpbmdcbiAgICAgICAgfSkuZm4oc3RhdGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogTW9kaWZpZXMgdGhlIHBsYWNlbWVudCBieSB0cmFuc2xhdGluZyB0aGUgZmxvYXRpbmcgZWxlbWVudCBhbG9uZyB0aGVcbiAqIHNwZWNpZmllZCBheGVzLlxuICogQSBudW1iZXIgKHNob3J0aGFuZCBmb3IgYG1haW5BeGlzYCBvciBkaXN0YW5jZSksIG9yIGFuIGF4ZXMgY29uZmlndXJhdGlvblxuICogb2JqZWN0IG1heSBiZSBwYXNzZWQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvb2Zmc2V0XG4gKi9cbmNvbnN0IG9mZnNldCA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5vZmZzZXQkMShvcHRpb25zKSxcbiAgb3B0aW9uczogW29wdGlvbnMsIGRlcHNdXG59KTtcblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgc2hpZnRpbmcgaXQgaW4gb3JkZXIgdG9cbiAqIGtlZXAgaXQgaW4gdmlldyB3aGVuIGl0IHdpbGwgb3ZlcmZsb3cgdGhlIGNsaXBwaW5nIGJvdW5kYXJ5LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3NoaWZ0XG4gKi9cbmNvbnN0IHNoaWZ0ID0gKG9wdGlvbnMsIGRlcHMpID0+ICh7XG4gIC4uLnNoaWZ0JDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogQnVpbHQtaW4gYGxpbWl0ZXJgIHRoYXQgd2lsbCBzdG9wIGBzaGlmdCgpYCBhdCBhIGNlcnRhaW4gcG9pbnQuXG4gKi9cbmNvbnN0IGxpbWl0U2hpZnQgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4ubGltaXRTaGlmdCQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBmbGlwcGluZyB0aGUgYHBsYWNlbWVudGBcbiAqIGluIG9yZGVyIHRvIGtlZXAgaXQgaW4gdmlldyB3aGVuIHRoZSBwcmVmZXJyZWQgcGxhY2VtZW50KHMpIHdpbGwgb3ZlcmZsb3cgdGhlXG4gKiBjbGlwcGluZyBib3VuZGFyeS4gQWx0ZXJuYXRpdmUgdG8gYGF1dG9QbGFjZW1lbnRgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2ZsaXBcbiAqL1xuY29uc3QgZmxpcCA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5mbGlwJDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0aGF0IGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IOKAlFxuICogZm9yIGluc3RhbmNlLCBwcmV2ZW50IGl0IGZyb20gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIGJvdW5kYXJ5IG9yIG1hdGNoIHRoZVxuICogd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3NpemVcbiAqL1xuY29uc3Qgc2l6ZSA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5zaXplJDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IGNob29zaW5nIHRoZSBwbGFjZW1lbnRcbiAqIHRoYXQgaGFzIHRoZSBtb3N0IHNwYWNlIGF2YWlsYWJsZSBhdXRvbWF0aWNhbGx5LCB3aXRob3V0IG5lZWRpbmcgdG8gc3BlY2lmeSBhXG4gKiBwcmVmZXJyZWQgcGxhY2VtZW50LiBBbHRlcm5hdGl2ZSB0byBgZmxpcGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXV0b1BsYWNlbWVudFxuICovXG5jb25zdCBhdXRvUGxhY2VtZW50ID0gKG9wdGlvbnMsIGRlcHMpID0+ICh7XG4gIC4uLmF1dG9QbGFjZW1lbnQkMShvcHRpb25zKSxcbiAgb3B0aW9uczogW29wdGlvbnMsIGRlcHNdXG59KTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIGhpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaW4gYXBwbGljYWJsZSBzaXR1YXRpb25zLCBzdWNoIGFzXG4gKiB3aGVuIGl0IGlzIG5vdCBpbiB0aGUgc2FtZSBjbGlwcGluZyBjb250ZXh0IGFzIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9oaWRlXG4gKi9cbmNvbnN0IGhpZGUgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4uaGlkZSQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG4vKipcbiAqIFByb3ZpZGVzIGltcHJvdmVkIHBvc2l0aW9uaW5nIGZvciBpbmxpbmUgcmVmZXJlbmNlIGVsZW1lbnRzIHRoYXQgY2FuIHNwYW5cbiAqIG92ZXIgbXVsdGlwbGUgbGluZXMsIHN1Y2ggYXMgaHlwZXJsaW5rcyBvciByYW5nZSBzZWxlY3Rpb25zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2lubGluZVxuICovXG5jb25zdCBpbmxpbmUgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4uaW5saW5lJDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhbiBpbm5lciBlbGVtZW50IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHNvIHRoYXQgaXRcbiAqIGFwcGVhcnMgY2VudGVyZWQgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogVGhpcyB3cmFwcyB0aGUgY29yZSBgYXJyb3dgIG1pZGRsZXdhcmUgdG8gYWxsb3cgUmVhY3QgcmVmcyBhcyB0aGUgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hcnJvd1xuICovXG5jb25zdCBhcnJvdyA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5hcnJvdyQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG5leHBvcnQgeyBhcnJvdywgYXV0b1BsYWNlbWVudCwgZmxpcCwgaGlkZSwgaW5saW5lLCBsaW1pdFNoaWZ0LCBvZmZzZXQsIHNoaWZ0LCBzaXplLCB1c2VGbG9hdGluZyB9O1xuIiwiaW1wb3J0IHsgaXNTaGFkb3dSb290LCBpc0hUTUxFbGVtZW50IH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzL2RvbSc7XG5cbmZ1bmN0aW9uIGFjdGl2ZUVsZW1lbnQoZG9jKSB7XG4gIGxldCBhY3RpdmVFbGVtZW50ID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gIHdoaWxlICgoKF9hY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudCkgPT0gbnVsbCB8fCAoX2FjdGl2ZUVsZW1lbnQgPSBfYWN0aXZlRWxlbWVudC5zaGFkb3dSb290KSA9PSBudWxsID8gdm9pZCAwIDogX2FjdGl2ZUVsZW1lbnQuYWN0aXZlRWxlbWVudCkgIT0gbnVsbCkge1xuICAgIHZhciBfYWN0aXZlRWxlbWVudDtcbiAgICBhY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudC5zaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIGlmICghcGFyZW50IHx8ICFjaGlsZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlID09IG51bGwgPyB2b2lkIDAgOiBjaGlsZC5nZXRSb290Tm9kZSgpO1xuXG4gIC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcbiAgaWYgKHBhcmVudC5jb250YWlucyhjaGlsZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGlmIChyb290Tm9kZSAmJiBpc1NoYWRvd1Jvb3Qocm9vdE5vZGUpKSB7XG4gICAgbGV0IG5leHQgPSBjaGlsZDtcbiAgICB3aGlsZSAobmV4dCkge1xuICAgICAgaWYgKHBhcmVudCA9PT0gbmV4dCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgIH1cbiAgfVxuXG4gIC8vIEdpdmUgdXAsIHRoZSByZXN1bHQgaXMgZmFsc2VcbiAgcmV0dXJuIGZhbHNlO1xufVxuLy8gQXZvaWQgQ2hyb21lIERldlRvb2xzIGJsdWUgd2FybmluZy5cbmZ1bmN0aW9uIGdldFBsYXRmb3JtKCkge1xuICBjb25zdCB1YURhdGEgPSBuYXZpZ2F0b3IudXNlckFnZW50RGF0YTtcbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5wbGF0Zm9ybSkge1xuICAgIHJldHVybiB1YURhdGEucGxhdGZvcm07XG4gIH1cbiAgcmV0dXJuIG5hdmlnYXRvci5wbGF0Zm9ybTtcbn1cbmZ1bmN0aW9uIGdldFVzZXJBZ2VudCgpIHtcbiAgY29uc3QgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG4gIGlmICh1YURhdGEgJiYgQXJyYXkuaXNBcnJheSh1YURhdGEuYnJhbmRzKSkge1xuICAgIHJldHVybiB1YURhdGEuYnJhbmRzLm1hcChfcmVmID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGJyYW5kLFxuICAgICAgICB2ZXJzaW9uXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIHJldHVybiBicmFuZCArIFwiL1wiICsgdmVyc2lvbjtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cbiAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7XG59XG5cbi8vIExpY2Vuc2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9hZG9iZS9yZWFjdC1zcGVjdHJ1bS9ibG9iL2IzNWQ1YzAyZmU5MDBiYWRjY2QwY2YxYThmMjNiYjU5MzQxOWYyMzgvcGFja2FnZXMvQHJlYWN0LWFyaWEvdXRpbHMvc3JjL2lzVmlydHVhbEV2ZW50LnRzXG5mdW5jdGlvbiBpc1ZpcnR1YWxDbGljayhldmVudCkge1xuICAvLyBGSVhNRTogRmlyZWZveCBpcyBub3cgZW1pdHRpbmcgYSBkZXByZWNhdGlvbiB3YXJuaW5nIGZvciBgbW96SW5wdXRTb3VyY2VgLlxuICAvLyBUcnkgdG8gZmluZCBhIHdvcmthcm91bmQgZm9yIHRoaXMuIGByZWFjdC1hcmlhYCBzb3VyY2Ugc3RpbGwgaGFzIHRoZSBjaGVjay5cbiAgaWYgKGV2ZW50Lm1veklucHV0U291cmNlID09PSAwICYmIGV2ZW50LmlzVHJ1c3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc0FuZHJvaWQoKSAmJiBldmVudC5wb2ludGVyVHlwZSkge1xuICAgIHJldHVybiBldmVudC50eXBlID09PSAnY2xpY2snICYmIGV2ZW50LmJ1dHRvbnMgPT09IDE7XG4gIH1cbiAgcmV0dXJuIGV2ZW50LmRldGFpbCA9PT0gMCAmJiAhZXZlbnQucG9pbnRlclR5cGU7XG59XG5mdW5jdGlvbiBpc1ZpcnR1YWxQb2ludGVyRXZlbnQoZXZlbnQpIHtcbiAgaWYgKGlzSlNET00oKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gIWlzQW5kcm9pZCgpICYmIGV2ZW50LndpZHRoID09PSAwICYmIGV2ZW50LmhlaWdodCA9PT0gMCB8fCBpc0FuZHJvaWQoKSAmJiBldmVudC53aWR0aCA9PT0gMSAmJiBldmVudC5oZWlnaHQgPT09IDEgJiYgZXZlbnQucHJlc3N1cmUgPT09IDAgJiYgZXZlbnQuZGV0YWlsID09PSAwICYmIGV2ZW50LnBvaW50ZXJUeXBlID09PSAnbW91c2UnIHx8XG4gIC8vIGlPUyBWb2ljZU92ZXIgcmV0dXJucyAwLjMzM+KAoiBmb3Igd2lkdGgvaGVpZ2h0LlxuICBldmVudC53aWR0aCA8IDEgJiYgZXZlbnQuaGVpZ2h0IDwgMSAmJiBldmVudC5wcmVzc3VyZSA9PT0gMCAmJiBldmVudC5kZXRhaWwgPT09IDAgJiYgZXZlbnQucG9pbnRlclR5cGUgPT09ICd0b3VjaCc7XG59XG5mdW5jdGlvbiBpc1NhZmFyaSgpIHtcbiAgLy8gQ2hyb21lIERldlRvb2xzIGRvZXMgbm90IGNvbXBsYWluIGFib3V0IG5hdmlnYXRvci52ZW5kb3JcbiAgcmV0dXJuIC9hcHBsZS9pLnRlc3QobmF2aWdhdG9yLnZlbmRvcik7XG59XG5mdW5jdGlvbiBpc0FuZHJvaWQoKSB7XG4gIGNvbnN0IHJlID0gL2FuZHJvaWQvaTtcbiAgcmV0dXJuIHJlLnRlc3QoZ2V0UGxhdGZvcm0oKSkgfHwgcmUudGVzdChnZXRVc2VyQWdlbnQoKSk7XG59XG5mdW5jdGlvbiBpc01hYygpIHtcbiAgcmV0dXJuIGdldFBsYXRmb3JtKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdtYWMnKSAmJiAhbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzO1xufVxuZnVuY3Rpb24gaXNKU0RPTSgpIHtcbiAgcmV0dXJuIGdldFVzZXJBZ2VudCgpLmluY2x1ZGVzKCdqc2RvbS8nKTtcbn1cbmZ1bmN0aW9uIGlzTW91c2VMaWtlUG9pbnRlclR5cGUocG9pbnRlclR5cGUsIHN0cmljdCkge1xuICAvLyBPbiBzb21lIExpbnV4IG1hY2hpbmVzIHdpdGggQ2hyb21pdW0sIG1vdXNlIGlucHV0cyByZXR1cm4gYSBgcG9pbnRlclR5cGVgXG4gIC8vIG9mIFwicGVuXCI6IGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMjAxNVxuICBjb25zdCB2YWx1ZXMgPSBbJ21vdXNlJywgJ3BlbiddO1xuICBpZiAoIXN0cmljdCkge1xuICAgIHZhbHVlcy5wdXNoKCcnLCB1bmRlZmluZWQpO1xuICB9XG4gIHJldHVybiB2YWx1ZXMuaW5jbHVkZXMocG9pbnRlclR5cGUpO1xufVxuZnVuY3Rpb24gaXNSZWFjdEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiAnbmF0aXZlRXZlbnQnIGluIGV2ZW50O1xufVxuZnVuY3Rpb24gaXNSb290RWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50Lm1hdGNoZXMoJ2h0bWwsYm9keScpO1xufVxuZnVuY3Rpb24gZ2V0RG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gKG5vZGUgPT0gbnVsbCA/IHZvaWQgMCA6IG5vZGUub3duZXJEb2N1bWVudCkgfHwgZG9jdW1lbnQ7XG59XG5mdW5jdGlvbiBpc0V2ZW50VGFyZ2V0V2l0aGluKGV2ZW50LCBub2RlKSB7XG4gIGlmIChub2RlID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCdjb21wb3NlZFBhdGgnIGluIGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKG5vZGUpO1xuICB9XG5cbiAgLy8gVFMgdGhpbmtzIGBldmVudGAgaXMgb2YgdHlwZSBuZXZlciBhcyBpdCBhc3N1bWVzIGFsbCBicm93c2VycyBzdXBwb3J0IGNvbXBvc2VkUGF0aCwgYnV0IGJyb3dzZXJzIHdpdGhvdXQgc2hhZG93IGRvbSBkb24ndFxuICBjb25zdCBlID0gZXZlbnQ7XG4gIHJldHVybiBlLnRhcmdldCAhPSBudWxsICYmIG5vZGUuY29udGFpbnMoZS50YXJnZXQpO1xufVxuZnVuY3Rpb24gZ2V0VGFyZ2V0KGV2ZW50KSB7XG4gIGlmICgnY29tcG9zZWRQYXRoJyBpbiBldmVudCkge1xuICAgIHJldHVybiBldmVudC5jb21wb3NlZFBhdGgoKVswXTtcbiAgfVxuXG4gIC8vIFRTIHRoaW5rcyBgZXZlbnRgIGlzIG9mIHR5cGUgbmV2ZXIgYXMgaXQgYXNzdW1lcyBhbGwgYnJvd3NlcnMgc3VwcG9ydFxuICAvLyBgY29tcG9zZWRQYXRoKClgLCBidXQgYnJvd3NlcnMgd2l0aG91dCBzaGFkb3cgRE9NIGRvbid0LlxuICByZXR1cm4gZXZlbnQudGFyZ2V0O1xufVxuY29uc3QgVFlQRUFCTEVfU0VMRUNUT1IgPSBcImlucHV0Om5vdChbdHlwZT0naGlkZGVuJ10pOm5vdChbZGlzYWJsZWRdKSxcIiArIFwiW2NvbnRlbnRlZGl0YWJsZV06bm90KFtjb250ZW50ZWRpdGFibGU9J2ZhbHNlJ10pLHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKVwiO1xuZnVuY3Rpb24gaXNUeXBlYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gaXNIVE1MRWxlbWVudChlbGVtZW50KSAmJiBlbGVtZW50Lm1hdGNoZXMoVFlQRUFCTEVfU0VMRUNUT1IpO1xufVxuZnVuY3Rpb24gc3RvcEV2ZW50KGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufVxuZnVuY3Rpb24gaXNUeXBlYWJsZUNvbWJvYm94KGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnY29tYm9ib3gnICYmIGlzVHlwZWFibGVFbGVtZW50KGVsZW1lbnQpO1xufVxuXG5leHBvcnQgeyBUWVBFQUJMRV9TRUxFQ1RPUiwgYWN0aXZlRWxlbWVudCwgY29udGFpbnMsIGdldERvY3VtZW50LCBnZXRQbGF0Zm9ybSwgZ2V0VGFyZ2V0LCBnZXRVc2VyQWdlbnQsIGlzQW5kcm9pZCwgaXNFdmVudFRhcmdldFdpdGhpbiwgaXNKU0RPTSwgaXNNYWMsIGlzTW91c2VMaWtlUG9pbnRlclR5cGUsIGlzUmVhY3RFdmVudCwgaXNSb290RWxlbWVudCwgaXNTYWZhcmksIGlzVHlwZWFibGVDb21ib2JveCwgaXNUeXBlYWJsZUVsZW1lbnQsIGlzVmlydHVhbENsaWNrLCBpc1ZpcnR1YWxQb2ludGVyRXZlbnQsIHN0b3BFdmVudCB9O1xuIiwiZnVuY3Rpb24gZ2V0Tm9kZU5hbWUobm9kZSkge1xuICBpZiAoaXNOb2RlKG5vZGUpKSB7XG4gICAgcmV0dXJuIChub2RlLm5vZGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIC8vIE1vY2tlZCBub2RlcyBpbiB0ZXN0aW5nIGVudmlyb25tZW50cyBtYXkgbm90IGJlIGluc3RhbmNlcyBvZiBOb2RlLiBCeVxuICAvLyByZXR1cm5pbmcgYCNkb2N1bWVudGAgYW4gaW5maW5pdGUgbG9vcCB3b24ndCBvY2N1ci5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yMzE3XG4gIHJldHVybiAnI2RvY3VtZW50Jztcbn1cbmZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIHZhciBfbm9kZSRvd25lckRvY3VtZW50O1xuICByZXR1cm4gKG5vZGUgPT0gbnVsbCB8fCAoX25vZGUkb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIHx8IHdpbmRvdztcbn1cbmZ1bmN0aW9uIGdldERvY3VtZW50RWxlbWVudChub2RlKSB7XG4gIHZhciBfcmVmO1xuICByZXR1cm4gKF9yZWYgPSAoaXNOb2RlKG5vZGUpID8gbm9kZS5vd25lckRvY3VtZW50IDogbm9kZS5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX3JlZi5kb2N1bWVudEVsZW1lbnQ7XG59XG5mdW5jdGlvbiBpc05vZGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgTm9kZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuTm9kZTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHZhbHVlIGluc3RhbmNlb2YgZ2V0V2luZG93KHZhbHVlKS5FbGVtZW50O1xufVxuZnVuY3Rpb24gaXNIVE1MRWxlbWVudCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuSFRNTEVsZW1lbnQ7XG59XG5mdW5jdGlvbiBpc1NoYWRvd1Jvb3QodmFsdWUpIHtcbiAgLy8gQnJvd3NlcnMgd2l0aG91dCBgU2hhZG93Um9vdGAgc3VwcG9ydC5cbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBTaGFkb3dSb290IHx8IHZhbHVlIGluc3RhbmNlb2YgZ2V0V2luZG93KHZhbHVlKS5TaGFkb3dSb290O1xufVxuZnVuY3Rpb24gaXNPdmVyZmxvd0VsZW1lbnQoZWxlbWVudCkge1xuICBjb25zdCB7XG4gICAgb3ZlcmZsb3csXG4gICAgb3ZlcmZsb3dYLFxuICAgIG92ZXJmbG93WSxcbiAgICBkaXNwbGF5XG4gIH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICByZXR1cm4gL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVufGNsaXAvLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpICYmICFbJ2lubGluZScsICdjb250ZW50cyddLmluY2x1ZGVzKGRpc3BsYXkpO1xufVxuZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluY2x1ZGVzKGdldE5vZGVOYW1lKGVsZW1lbnQpKTtcbn1cbmZ1bmN0aW9uIGlzVG9wTGF5ZXIoZWxlbWVudCkge1xuICByZXR1cm4gWyc6cG9wb3Zlci1vcGVuJywgJzptb2RhbCddLnNvbWUoc2VsZWN0b3IgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGlzQ29udGFpbmluZ0Jsb2NrKGVsZW1lbnRPckNzcykge1xuICBjb25zdCB3ZWJraXQgPSBpc1dlYktpdCgpO1xuICBjb25zdCBjc3MgPSBpc0VsZW1lbnQoZWxlbWVudE9yQ3NzKSA/IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudE9yQ3NzKSA6IGVsZW1lbnRPckNzcztcblxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ29udGFpbmluZ19ibG9jayNpZGVudGlmeWluZ190aGVfY29udGFpbmluZ19ibG9ja1xuICByZXR1cm4gY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IChjc3MuY29udGFpbmVyVHlwZSA/IGNzcy5jb250YWluZXJUeXBlICE9PSAnbm9ybWFsJyA6IGZhbHNlKSB8fCAhd2Via2l0ICYmIChjc3MuYmFja2Ryb3BGaWx0ZXIgPyBjc3MuYmFja2Ryb3BGaWx0ZXIgIT09ICdub25lJyA6IGZhbHNlKSB8fCAhd2Via2l0ICYmIChjc3MuZmlsdGVyID8gY3NzLmZpbHRlciAhPT0gJ25vbmUnIDogZmFsc2UpIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJywgJ2ZpbHRlciddLnNvbWUodmFsdWUgPT4gKGNzcy53aWxsQ2hhbmdlIHx8ICcnKS5pbmNsdWRlcyh2YWx1ZSkpIHx8IFsncGFpbnQnLCAnbGF5b3V0JywgJ3N0cmljdCcsICdjb250ZW50J10uc29tZSh2YWx1ZSA9PiAoY3NzLmNvbnRhaW4gfHwgJycpLmluY2x1ZGVzKHZhbHVlKSk7XG59XG5mdW5jdGlvbiBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkge1xuICBsZXQgY3VycmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgIWlzTGFzdFRyYXZlcnNhYmxlTm9kZShjdXJyZW50Tm9kZSkpIHtcbiAgICBpZiAoaXNDb250YWluaW5nQmxvY2soY3VycmVudE5vZGUpKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIGlmIChpc1RvcExheWVyKGN1cnJlbnROb2RlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShjdXJyZW50Tm9kZSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBpc1dlYktpdCgpIHtcbiAgaWYgKHR5cGVvZiBDU1MgPT09ICd1bmRlZmluZWQnIHx8ICFDU1Muc3VwcG9ydHMpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIENTUy5zdXBwb3J0cygnLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXInLCAnbm9uZScpO1xufVxuZnVuY3Rpb24gaXNMYXN0VHJhdmVyc2FibGVOb2RlKG5vZGUpIHtcbiAgcmV0dXJuIFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluY2x1ZGVzKGdldE5vZGVOYW1lKG5vZGUpKTtcbn1cbmZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59XG5mdW5jdGlvbiBnZXROb2RlU2Nyb2xsKGVsZW1lbnQpIHtcbiAgaWYgKGlzRWxlbWVudChlbGVtZW50KSkge1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnNjcm9sbExlZnQsXG4gICAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsWCxcbiAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsWVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShub2RlKSB7XG4gIGlmIChnZXROb2RlTmFtZShub2RlKSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID1cbiAgLy8gU3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGUuXG4gIG5vZGUuYXNzaWduZWRTbG90IHx8XG4gIC8vIERPTSBFbGVtZW50IGRldGVjdGVkLlxuICBub2RlLnBhcmVudE5vZGUgfHxcbiAgLy8gU2hhZG93Um9vdCBkZXRlY3RlZC5cbiAgaXNTaGFkb3dSb290KG5vZGUpICYmIG5vZGUuaG9zdCB8fFxuICAvLyBGYWxsYmFjay5cbiAgZ2V0RG9jdW1lbnRFbGVtZW50KG5vZGUpO1xuICByZXR1cm4gaXNTaGFkb3dSb290KHJlc3VsdCkgPyByZXN1bHQuaG9zdCA6IHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldE5lYXJlc3RPdmVyZmxvd0FuY2VzdG9yKG5vZGUpIHtcbiAgY29uc3QgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUobm9kZSk7XG4gIGlmIChpc0xhc3RUcmF2ZXJzYWJsZU5vZGUocGFyZW50Tm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50ID8gbm9kZS5vd25lckRvY3VtZW50LmJvZHkgOiBub2RlLmJvZHk7XG4gIH1cbiAgaWYgKGlzSFRNTEVsZW1lbnQocGFyZW50Tm9kZSkgJiYgaXNPdmVyZmxvd0VsZW1lbnQocGFyZW50Tm9kZSkpIHtcbiAgICByZXR1cm4gcGFyZW50Tm9kZTtcbiAgfVxuICByZXR1cm4gZ2V0TmVhcmVzdE92ZXJmbG93QW5jZXN0b3IocGFyZW50Tm9kZSk7XG59XG5mdW5jdGlvbiBnZXRPdmVyZmxvd0FuY2VzdG9ycyhub2RlLCBsaXN0LCB0cmF2ZXJzZUlmcmFtZXMpIHtcbiAgdmFyIF9ub2RlJG93bmVyRG9jdW1lbnQyO1xuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG4gIGlmICh0cmF2ZXJzZUlmcmFtZXMgPT09IHZvaWQgMCkge1xuICAgIHRyYXZlcnNlSWZyYW1lcyA9IHRydWU7XG4gIH1cbiAgY29uc3Qgc2Nyb2xsYWJsZUFuY2VzdG9yID0gZ2V0TmVhcmVzdE92ZXJmbG93QW5jZXN0b3Iobm9kZSk7XG4gIGNvbnN0IGlzQm9keSA9IHNjcm9sbGFibGVBbmNlc3RvciA9PT0gKChfbm9kZSRvd25lckRvY3VtZW50MiA9IG5vZGUub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJG93bmVyRG9jdW1lbnQyLmJvZHkpO1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsYWJsZUFuY2VzdG9yKTtcbiAgaWYgKGlzQm9keSkge1xuICAgIHJldHVybiBsaXN0LmNvbmNhdCh3aW4sIHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSwgaXNPdmVyZmxvd0VsZW1lbnQoc2Nyb2xsYWJsZUFuY2VzdG9yKSA/IHNjcm9sbGFibGVBbmNlc3RvciA6IFtdLCB3aW4uZnJhbWVFbGVtZW50ICYmIHRyYXZlcnNlSWZyYW1lcyA/IGdldE92ZXJmbG93QW5jZXN0b3JzKHdpbi5mcmFtZUVsZW1lbnQpIDogW10pO1xuICB9XG4gIHJldHVybiBsaXN0LmNvbmNhdChzY3JvbGxhYmxlQW5jZXN0b3IsIGdldE92ZXJmbG93QW5jZXN0b3JzKHNjcm9sbGFibGVBbmNlc3RvciwgW10sIHRyYXZlcnNlSWZyYW1lcykpO1xufVxuXG5leHBvcnQgeyBnZXRDb21wdXRlZFN0eWxlLCBnZXRDb250YWluaW5nQmxvY2ssIGdldERvY3VtZW50RWxlbWVudCwgZ2V0TmVhcmVzdE92ZXJmbG93QW5jZXN0b3IsIGdldE5vZGVOYW1lLCBnZXROb2RlU2Nyb2xsLCBnZXRPdmVyZmxvd0FuY2VzdG9ycywgZ2V0UGFyZW50Tm9kZSwgZ2V0V2luZG93LCBpc0NvbnRhaW5pbmdCbG9jaywgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc0xhc3RUcmF2ZXJzYWJsZU5vZGUsIGlzTm9kZSwgaXNPdmVyZmxvd0VsZW1lbnQsIGlzU2hhZG93Um9vdCwgaXNUYWJsZUVsZW1lbnQsIGlzVG9wTGF5ZXIsIGlzV2ViS2l0IH07XG4iLCIvKipcbiAqIEN1c3RvbSBwb3NpdGlvbmluZyByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy92aXJ0dWFsLWVsZW1lbnRzXG4gKi9cblxuY29uc3Qgc2lkZXMgPSBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddO1xuY29uc3QgYWxpZ25tZW50cyA9IFsnc3RhcnQnLCAnZW5kJ107XG5jb25zdCBwbGFjZW1lbnRzID0gLyojX19QVVJFX18qL3NpZGVzLnJlZHVjZSgoYWNjLCBzaWRlKSA9PiBhY2MuY29uY2F0KHNpZGUsIHNpZGUgKyBcIi1cIiArIGFsaWdubWVudHNbMF0sIHNpZGUgKyBcIi1cIiArIGFsaWdubWVudHNbMV0pLCBbXSk7XG5jb25zdCBtaW4gPSBNYXRoLm1pbjtcbmNvbnN0IG1heCA9IE1hdGgubWF4O1xuY29uc3Qgcm91bmQgPSBNYXRoLnJvdW5kO1xuY29uc3QgZmxvb3IgPSBNYXRoLmZsb29yO1xuY29uc3QgY3JlYXRlQ29vcmRzID0gdiA9PiAoe1xuICB4OiB2LFxuICB5OiB2XG59KTtcbmNvbnN0IG9wcG9zaXRlU2lkZU1hcCA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmNvbnN0IG9wcG9zaXRlQWxpZ25tZW50TWFwID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmZ1bmN0aW9uIGNsYW1wKHN0YXJ0LCB2YWx1ZSwgZW5kKSB7XG4gIHJldHVybiBtYXgoc3RhcnQsIG1pbih2YWx1ZSwgZW5kKSk7XG59XG5mdW5jdGlvbiBldmFsdWF0ZSh2YWx1ZSwgcGFyYW0pIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlKHBhcmFtKSA6IHZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0U2lkZShwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xufVxuZnVuY3Rpb24gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG59XG5mdW5jdGlvbiBnZXRPcHBvc2l0ZUF4aXMoYXhpcykge1xuICByZXR1cm4gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xufVxuZnVuY3Rpb24gZ2V0QXhpc0xlbmd0aChheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG59XG5mdW5jdGlvbiBnZXRTaWRlQXhpcyhwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluY2x1ZGVzKGdldFNpZGUocGxhY2VtZW50KSkgPyAneScgOiAneCc7XG59XG5mdW5jdGlvbiBnZXRBbGlnbm1lbnRBeGlzKHBsYWNlbWVudCkge1xuICByZXR1cm4gZ2V0T3Bwb3NpdGVBeGlzKGdldFNpZGVBeGlzKHBsYWNlbWVudCkpO1xufVxuZnVuY3Rpb24gZ2V0QWxpZ25tZW50U2lkZXMocGxhY2VtZW50LCByZWN0cywgcnRsKSB7XG4gIGlmIChydGwgPT09IHZvaWQgMCkge1xuICAgIHJ0bCA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICBjb25zdCBhbGlnbm1lbnRBeGlzID0gZ2V0QWxpZ25tZW50QXhpcyhwbGFjZW1lbnQpO1xuICBjb25zdCBsZW5ndGggPSBnZXRBeGlzTGVuZ3RoKGFsaWdubWVudEF4aXMpO1xuICBsZXQgbWFpbkFsaWdubWVudFNpZGUgPSBhbGlnbm1lbnRBeGlzID09PSAneCcgPyBhbGlnbm1lbnQgPT09IChydGwgPyAnZW5kJyA6ICdzdGFydCcpID8gJ3JpZ2h0JyA6ICdsZWZ0JyA6IGFsaWdubWVudCA9PT0gJ3N0YXJ0JyA/ICdib3R0b20nIDogJ3RvcCc7XG4gIGlmIChyZWN0cy5yZWZlcmVuY2VbbGVuZ3RoXSA+IHJlY3RzLmZsb2F0aW5nW2xlbmd0aF0pIHtcbiAgICBtYWluQWxpZ25tZW50U2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5BbGlnbm1lbnRTaWRlKTtcbiAgfVxuICByZXR1cm4gW21haW5BbGlnbm1lbnRTaWRlLCBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluQWxpZ25tZW50U2lkZSldO1xufVxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBjb25zdCBvcHBvc2l0ZVBsYWNlbWVudCA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHJldHVybiBbZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQocGxhY2VtZW50KSwgb3Bwb3NpdGVQbGFjZW1lbnQsIGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50KG9wcG9zaXRlUGxhY2VtZW50KV07XG59XG5mdW5jdGlvbiBnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9zdGFydHxlbmQvZywgYWxpZ25tZW50ID0+IG9wcG9zaXRlQWxpZ25tZW50TWFwW2FsaWdubWVudF0pO1xufVxuZnVuY3Rpb24gZ2V0U2lkZUxpc3Qoc2lkZSwgaXNTdGFydCwgcnRsKSB7XG4gIGNvbnN0IGxyID0gWydsZWZ0JywgJ3JpZ2h0J107XG4gIGNvbnN0IHJsID0gWydyaWdodCcsICdsZWZ0J107XG4gIGNvbnN0IHRiID0gWyd0b3AnLCAnYm90dG9tJ107XG4gIGNvbnN0IGJ0ID0gWydib3R0b20nLCAndG9wJ107XG4gIHN3aXRjaCAoc2lkZSkge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGlmIChydGwpIHJldHVybiBpc1N0YXJ0ID8gcmwgOiBscjtcbiAgICAgIHJldHVybiBpc1N0YXJ0ID8gbHIgOiBybDtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4gaXNTdGFydCA/IHRiIDogYnQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBbXTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVBeGlzUGxhY2VtZW50cyhwbGFjZW1lbnQsIGZsaXBBbGlnbm1lbnQsIGRpcmVjdGlvbiwgcnRsKSB7XG4gIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICBsZXQgbGlzdCA9IGdldFNpZGVMaXN0KGdldFNpZGUocGxhY2VtZW50KSwgZGlyZWN0aW9uID09PSAnc3RhcnQnLCBydGwpO1xuICBpZiAoYWxpZ25tZW50KSB7XG4gICAgbGlzdCA9IGxpc3QubWFwKHNpZGUgPT4gc2lkZSArIFwiLVwiICsgYWxpZ25tZW50KTtcbiAgICBpZiAoZmxpcEFsaWdubWVudCkge1xuICAgICAgbGlzdCA9IGxpc3QuY29uY2F0KGxpc3QubWFwKGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50KSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsaXN0O1xufVxuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIHNpZGUgPT4gb3Bwb3NpdGVTaWRlTWFwW3NpZGVdKTtcbn1cbmZ1bmN0aW9uIGV4cGFuZFBhZGRpbmdPYmplY3QocGFkZGluZykge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMCxcbiAgICAuLi5wYWRkaW5nXG4gIH07XG59XG5mdW5jdGlvbiBnZXRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IGV4cGFuZFBhZGRpbmdPYmplY3QocGFkZGluZykgOiB7XG4gICAgdG9wOiBwYWRkaW5nLFxuICAgIHJpZ2h0OiBwYWRkaW5nLFxuICAgIGJvdHRvbTogcGFkZGluZyxcbiAgICBsZWZ0OiBwYWRkaW5nXG4gIH07XG59XG5mdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgY29uc3Qge1xuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfSA9IHJlY3Q7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHRvcDogeSxcbiAgICBsZWZ0OiB4LFxuICAgIHJpZ2h0OiB4ICsgd2lkdGgsXG4gICAgYm90dG9tOiB5ICsgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9O1xufVxuXG5leHBvcnQgeyBhbGlnbm1lbnRzLCBjbGFtcCwgY3JlYXRlQ29vcmRzLCBldmFsdWF0ZSwgZXhwYW5kUGFkZGluZ09iamVjdCwgZmxvb3IsIGdldEFsaWdubWVudCwgZ2V0QWxpZ25tZW50QXhpcywgZ2V0QWxpZ25tZW50U2lkZXMsIGdldEF4aXNMZW5ndGgsIGdldEV4cGFuZGVkUGxhY2VtZW50cywgZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQsIGdldE9wcG9zaXRlQXhpcywgZ2V0T3Bwb3NpdGVBeGlzUGxhY2VtZW50cywgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQsIGdldFBhZGRpbmdPYmplY3QsIGdldFNpZGUsIGdldFNpZGVBeGlzLCBtYXgsIG1pbiwgcGxhY2VtZW50cywgcmVjdFRvQ2xpZW50UmVjdCwgcm91bmQsIHNpZGVzIH07XG4iLCIvLyBwYWNrYWdlcy9jb3JlL3ByaW1pdGl2ZS9zcmMvcHJpbWl0aXZlLnRzeFxuZnVuY3Rpb24gY29tcG9zZUV2ZW50SGFuZGxlcnMob3JpZ2luYWxFdmVudEhhbmRsZXIsIG91ckV2ZW50SGFuZGxlciwgeyBjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlIH0gPSB7fSkge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICBvcmlnaW5hbEV2ZW50SGFuZGxlcj8uKGV2ZW50KTtcbiAgICBpZiAoY2hlY2tGb3JEZWZhdWx0UHJldmVudGVkID09PSBmYWxzZSB8fCAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuIG91ckV2ZW50SGFuZGxlcj8uKGV2ZW50KTtcbiAgICB9XG4gIH07XG59XG5leHBvcnQge1xuICBjb21wb3NlRXZlbnRIYW5kbGVyc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L2Fycm93L3NyYy9BcnJvdy50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wcmltaXRpdmVcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIE5BTUUgPSBcIkFycm93XCI7XG52YXIgQXJyb3cgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgY2hpbGRyZW4sIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIC4uLmFycm93UHJvcHMgfSA9IHByb3BzO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICBQcmltaXRpdmUuc3ZnLFxuICAgIHtcbiAgICAgIC4uLmFycm93UHJvcHMsXG4gICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdmlld0JveDogXCIwIDAgMzAgMTBcIixcbiAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW86IFwibm9uZVwiLFxuICAgICAgY2hpbGRyZW46IHByb3BzLmFzQ2hpbGQgPyBjaGlsZHJlbiA6IC8qIEBfX1BVUkVfXyAqLyBqc3goXCJwb2x5Z29uXCIsIHsgcG9pbnRzOiBcIjAsMCAzMCwwIDE1LDEwXCIgfSlcbiAgICB9XG4gICk7XG59KTtcbkFycm93LmRpc3BsYXlOYW1lID0gTkFNRTtcbnZhciBSb290ID0gQXJyb3c7XG5leHBvcnQge1xuICBBcnJvdyxcbiAgUm9vdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9jb2xsZWN0aW9uL3NyYy9Db2xsZWN0aW9uLnRzeFxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dFNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3Qtc2xvdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5mdW5jdGlvbiBjcmVhdGVDb2xsZWN0aW9uKG5hbWUpIHtcbiAgY29uc3QgUFJPVklERVJfTkFNRSA9IG5hbWUgKyBcIkNvbGxlY3Rpb25Qcm92aWRlclwiO1xuICBjb25zdCBbY3JlYXRlQ29sbGVjdGlvbkNvbnRleHQsIGNyZWF0ZUNvbGxlY3Rpb25TY29wZV0gPSBjcmVhdGVDb250ZXh0U2NvcGUoUFJPVklERVJfTkFNRSk7XG4gIGNvbnN0IFtDb2xsZWN0aW9uUHJvdmlkZXJJbXBsLCB1c2VDb2xsZWN0aW9uQ29udGV4dF0gPSBjcmVhdGVDb2xsZWN0aW9uQ29udGV4dChcbiAgICBQUk9WSURFUl9OQU1FLFxuICAgIHsgY29sbGVjdGlvblJlZjogeyBjdXJyZW50OiBudWxsIH0sIGl0ZW1NYXA6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkgfVxuICApO1xuICBjb25zdCBDb2xsZWN0aW9uUHJvdmlkZXIgPSAocHJvcHMpID0+IHtcbiAgICBjb25zdCB7IHNjb3BlLCBjaGlsZHJlbiB9ID0gcHJvcHM7XG4gICAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGl0ZW1NYXAgPSBSZWFjdC51c2VSZWYoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSkuY3VycmVudDtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb2xsZWN0aW9uUHJvdmlkZXJJbXBsLCB7IHNjb3BlLCBpdGVtTWFwLCBjb2xsZWN0aW9uUmVmOiByZWYsIGNoaWxkcmVuIH0pO1xuICB9O1xuICBDb2xsZWN0aW9uUHJvdmlkZXIuZGlzcGxheU5hbWUgPSBQUk9WSURFUl9OQU1FO1xuICBjb25zdCBDT0xMRUNUSU9OX1NMT1RfTkFNRSA9IG5hbWUgKyBcIkNvbGxlY3Rpb25TbG90XCI7XG4gIGNvbnN0IENvbGxlY3Rpb25TbG90ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgICAgY29uc3QgeyBzY29wZSwgY2hpbGRyZW4gfSA9IHByb3BzO1xuICAgICAgY29uc3QgY29udGV4dCA9IHVzZUNvbGxlY3Rpb25Db250ZXh0KENPTExFQ1RJT05fU0xPVF9OQU1FLCBzY29wZSk7XG4gICAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCBjb250ZXh0LmNvbGxlY3Rpb25SZWYpO1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goU2xvdCwgeyByZWY6IGNvbXBvc2VkUmVmcywgY2hpbGRyZW4gfSk7XG4gICAgfVxuICApO1xuICBDb2xsZWN0aW9uU2xvdC5kaXNwbGF5TmFtZSA9IENPTExFQ1RJT05fU0xPVF9OQU1FO1xuICBjb25zdCBJVEVNX1NMT1RfTkFNRSA9IG5hbWUgKyBcIkNvbGxlY3Rpb25JdGVtU2xvdFwiO1xuICBjb25zdCBJVEVNX0RBVEFfQVRUUiA9IFwiZGF0YS1yYWRpeC1jb2xsZWN0aW9uLWl0ZW1cIjtcbiAgY29uc3QgQ29sbGVjdGlvbkl0ZW1TbG90ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgICAgY29uc3QgeyBzY29wZSwgY2hpbGRyZW4sIC4uLml0ZW1EYXRhIH0gPSBwcm9wcztcbiAgICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIHJlZik7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdXNlQ29sbGVjdGlvbkNvbnRleHQoSVRFTV9TTE9UX05BTUUsIHNjb3BlKTtcbiAgICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnRleHQuaXRlbU1hcC5zZXQocmVmLCB7IHJlZiwgLi4uaXRlbURhdGEgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB2b2lkIGNvbnRleHQuaXRlbU1hcC5kZWxldGUocmVmKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goU2xvdCwgeyAuLi57IFtJVEVNX0RBVEFfQVRUUl06IFwiXCIgfSwgcmVmOiBjb21wb3NlZFJlZnMsIGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgKTtcbiAgQ29sbGVjdGlvbkl0ZW1TbG90LmRpc3BsYXlOYW1lID0gSVRFTV9TTE9UX05BTUU7XG4gIGZ1bmN0aW9uIHVzZUNvbGxlY3Rpb24oc2NvcGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlQ29sbGVjdGlvbkNvbnRleHQobmFtZSArIFwiQ29sbGVjdGlvbkNvbnN1bWVyXCIsIHNjb3BlKTtcbiAgICBjb25zdCBnZXRJdGVtcyA9IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25Ob2RlID0gY29udGV4dC5jb2xsZWN0aW9uUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIWNvbGxlY3Rpb25Ob2RlKSByZXR1cm4gW107XG4gICAgICBjb25zdCBvcmRlcmVkTm9kZXMgPSBBcnJheS5mcm9tKGNvbGxlY3Rpb25Ob2RlLnF1ZXJ5U2VsZWN0b3JBbGwoYFske0lURU1fREFUQV9BVFRSfV1gKSk7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oY29udGV4dC5pdGVtTWFwLnZhbHVlcygpKTtcbiAgICAgIGNvbnN0IG9yZGVyZWRJdGVtcyA9IGl0ZW1zLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBvcmRlcmVkTm9kZXMuaW5kZXhPZihhLnJlZi5jdXJyZW50KSAtIG9yZGVyZWROb2Rlcy5pbmRleE9mKGIucmVmLmN1cnJlbnQpXG4gICAgICApO1xuICAgICAgcmV0dXJuIG9yZGVyZWRJdGVtcztcbiAgICB9LCBbY29udGV4dC5jb2xsZWN0aW9uUmVmLCBjb250ZXh0Lml0ZW1NYXBdKTtcbiAgICByZXR1cm4gZ2V0SXRlbXM7XG4gIH1cbiAgcmV0dXJuIFtcbiAgICB7IFByb3ZpZGVyOiBDb2xsZWN0aW9uUHJvdmlkZXIsIFNsb3Q6IENvbGxlY3Rpb25TbG90LCBJdGVtU2xvdDogQ29sbGVjdGlvbkl0ZW1TbG90IH0sXG4gICAgdXNlQ29sbGVjdGlvbixcbiAgICBjcmVhdGVDb2xsZWN0aW9uU2NvcGVcbiAgXTtcbn1cbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbGxlY3Rpb25cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC9jb21wb3NlLXJlZnMvc3JjL2NvbXBvc2VSZWZzLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5mdW5jdGlvbiBzZXRSZWYocmVmLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmVmKHZhbHVlKTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB2b2lkIDApIHtcbiAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBjb21wb3NlUmVmcyguLi5yZWZzKSB7XG4gIHJldHVybiAobm9kZSkgPT4gcmVmcy5mb3JFYWNoKChyZWYpID0+IHNldFJlZihyZWYsIG5vZGUpKTtcbn1cbmZ1bmN0aW9uIHVzZUNvbXBvc2VkUmVmcyguLi5yZWZzKSB7XG4gIHJldHVybiBSZWFjdC51c2VDYWxsYmFjayhjb21wb3NlUmVmcyguLi5yZWZzKSwgcmVmcyk7XG59XG5leHBvcnQge1xuICBjb21wb3NlUmVmcyxcbiAgdXNlQ29tcG9zZWRSZWZzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvY29udGV4dC9zcmMvY3JlYXRlQ29udGV4dC50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0Mihyb290Q29tcG9uZW50TmFtZSwgZGVmYXVsdENvbnRleHQpIHtcbiAgY29uc3QgQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoZGVmYXVsdENvbnRleHQpO1xuICBmdW5jdGlvbiBQcm92aWRlcihwcm9wcykge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIC4uLmNvbnRleHQgfSA9IHByb3BzO1xuICAgIGNvbnN0IHZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiBjb250ZXh0LCBPYmplY3QudmFsdWVzKGNvbnRleHQpKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlLCBjaGlsZHJlbiB9KTtcbiAgfVxuICBmdW5jdGlvbiB1c2VDb250ZXh0Mihjb25zdW1lck5hbWUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0KTtcbiAgICBpZiAoY29udGV4dCkgcmV0dXJuIGNvbnRleHQ7XG4gICAgaWYgKGRlZmF1bHRDb250ZXh0ICE9PSB2b2lkIDApIHJldHVybiBkZWZhdWx0Q29udGV4dDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYCR7Y29uc3VtZXJOYW1lfVxcYCBtdXN0IGJlIHVzZWQgd2l0aGluIFxcYCR7cm9vdENvbXBvbmVudE5hbWV9XFxgYCk7XG4gIH1cbiAgUHJvdmlkZXIuZGlzcGxheU5hbWUgPSByb290Q29tcG9uZW50TmFtZSArIFwiUHJvdmlkZXJcIjtcbiAgcmV0dXJuIFtQcm92aWRlciwgdXNlQ29udGV4dDJdO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dFNjb3BlKHNjb3BlTmFtZSwgY3JlYXRlQ29udGV4dFNjb3BlRGVwcyA9IFtdKSB7XG4gIGxldCBkZWZhdWx0Q29udGV4dHMgPSBbXTtcbiAgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDMocm9vdENvbXBvbmVudE5hbWUsIGRlZmF1bHRDb250ZXh0KSB7XG4gICAgY29uc3QgQmFzZUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KGRlZmF1bHRDb250ZXh0KTtcbiAgICBjb25zdCBpbmRleCA9IGRlZmF1bHRDb250ZXh0cy5sZW5ndGg7XG4gICAgZGVmYXVsdENvbnRleHRzID0gWy4uLmRlZmF1bHRDb250ZXh0cywgZGVmYXVsdENvbnRleHRdO1xuICAgIGZ1bmN0aW9uIFByb3ZpZGVyKHByb3BzKSB7XG4gICAgICBjb25zdCB7IHNjb3BlLCBjaGlsZHJlbiwgLi4uY29udGV4dCB9ID0gcHJvcHM7XG4gICAgICBjb25zdCBDb250ZXh0ID0gc2NvcGU/LltzY29wZU5hbWVdW2luZGV4XSB8fCBCYXNlQ29udGV4dDtcbiAgICAgIGNvbnN0IHZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiBjb250ZXh0LCBPYmplY3QudmFsdWVzKGNvbnRleHQpKTtcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWUsIGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1c2VDb250ZXh0Mihjb25zdW1lck5hbWUsIHNjb3BlKSB7XG4gICAgICBjb25zdCBDb250ZXh0ID0gc2NvcGU/LltzY29wZU5hbWVdW2luZGV4XSB8fCBCYXNlQ29udGV4dDtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbnRleHQpO1xuICAgICAgaWYgKGNvbnRleHQpIHJldHVybiBjb250ZXh0O1xuICAgICAgaWYgKGRlZmF1bHRDb250ZXh0ICE9PSB2b2lkIDApIHJldHVybiBkZWZhdWx0Q29udGV4dDtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXFxgJHtjb25zdW1lck5hbWV9XFxgIG11c3QgYmUgdXNlZCB3aXRoaW4gXFxgJHtyb290Q29tcG9uZW50TmFtZX1cXGBgKTtcbiAgICB9XG4gICAgUHJvdmlkZXIuZGlzcGxheU5hbWUgPSByb290Q29tcG9uZW50TmFtZSArIFwiUHJvdmlkZXJcIjtcbiAgICByZXR1cm4gW1Byb3ZpZGVyLCB1c2VDb250ZXh0Ml07XG4gIH1cbiAgY29uc3QgY3JlYXRlU2NvcGUgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2NvcGVDb250ZXh0cyA9IGRlZmF1bHRDb250ZXh0cy5tYXAoKGRlZmF1bHRDb250ZXh0KSA9PiB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlQ29udGV4dChkZWZhdWx0Q29udGV4dCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVzZVNjb3BlKHNjb3BlKSB7XG4gICAgICBjb25zdCBjb250ZXh0cyA9IHNjb3BlPy5bc2NvcGVOYW1lXSB8fCBzY29wZUNvbnRleHRzO1xuICAgICAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oXG4gICAgICAgICgpID0+ICh7IFtgX19zY29wZSR7c2NvcGVOYW1lfWBdOiB7IC4uLnNjb3BlLCBbc2NvcGVOYW1lXTogY29udGV4dHMgfSB9KSxcbiAgICAgICAgW3Njb3BlLCBjb250ZXh0c11cbiAgICAgICk7XG4gICAgfTtcbiAgfTtcbiAgY3JlYXRlU2NvcGUuc2NvcGVOYW1lID0gc2NvcGVOYW1lO1xuICByZXR1cm4gW2NyZWF0ZUNvbnRleHQzLCBjb21wb3NlQ29udGV4dFNjb3BlcyhjcmVhdGVTY29wZSwgLi4uY3JlYXRlQ29udGV4dFNjb3BlRGVwcyldO1xufVxuZnVuY3Rpb24gY29tcG9zZUNvbnRleHRTY29wZXMoLi4uc2NvcGVzKSB7XG4gIGNvbnN0IGJhc2VTY29wZSA9IHNjb3Blc1swXTtcbiAgaWYgKHNjb3Blcy5sZW5ndGggPT09IDEpIHJldHVybiBiYXNlU2NvcGU7XG4gIGNvbnN0IGNyZWF0ZVNjb3BlID0gKCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlSG9va3MgPSBzY29wZXMubWFwKChjcmVhdGVTY29wZTIpID0+ICh7XG4gICAgICB1c2VTY29wZTogY3JlYXRlU2NvcGUyKCksXG4gICAgICBzY29wZU5hbWU6IGNyZWF0ZVNjb3BlMi5zY29wZU5hbWVcbiAgICB9KSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVzZUNvbXBvc2VkU2NvcGVzKG92ZXJyaWRlU2NvcGVzKSB7XG4gICAgICBjb25zdCBuZXh0U2NvcGVzID0gc2NvcGVIb29rcy5yZWR1Y2UoKG5leHRTY29wZXMyLCB7IHVzZVNjb3BlLCBzY29wZU5hbWUgfSkgPT4ge1xuICAgICAgICBjb25zdCBzY29wZVByb3BzID0gdXNlU2NvcGUob3ZlcnJpZGVTY29wZXMpO1xuICAgICAgICBjb25zdCBjdXJyZW50U2NvcGUgPSBzY29wZVByb3BzW2BfX3Njb3BlJHtzY29wZU5hbWV9YF07XG4gICAgICAgIHJldHVybiB7IC4uLm5leHRTY29wZXMyLCAuLi5jdXJyZW50U2NvcGUgfTtcbiAgICAgIH0sIHt9KTtcbiAgICAgIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7IFtgX19zY29wZSR7YmFzZVNjb3BlLnNjb3BlTmFtZX1gXTogbmV4dFNjb3BlcyB9KSwgW25leHRTY29wZXNdKTtcbiAgICB9O1xuICB9O1xuICBjcmVhdGVTY29wZS5zY29wZU5hbWUgPSBiYXNlU2NvcGUuc2NvcGVOYW1lO1xuICByZXR1cm4gY3JlYXRlU2NvcGU7XG59XG5leHBvcnQge1xuICBjcmVhdGVDb250ZXh0MiBhcyBjcmVhdGVDb250ZXh0LFxuICBjcmVhdGVDb250ZXh0U2NvcGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC9kaXJlY3Rpb24vc3JjL0RpcmVjdGlvbi50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgRGlyZWN0aW9uQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQodm9pZCAwKTtcbnZhciBEaXJlY3Rpb25Qcm92aWRlciA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IGRpciwgY2hpbGRyZW4gfSA9IHByb3BzO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChEaXJlY3Rpb25Db250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBkaXIsIGNoaWxkcmVuIH0pO1xufTtcbmZ1bmN0aW9uIHVzZURpcmVjdGlvbihsb2NhbERpcikge1xuICBjb25zdCBnbG9iYWxEaXIgPSBSZWFjdC51c2VDb250ZXh0KERpcmVjdGlvbkNvbnRleHQpO1xuICByZXR1cm4gbG9jYWxEaXIgfHwgZ2xvYmFsRGlyIHx8IFwibHRyXCI7XG59XG52YXIgUHJvdmlkZXIgPSBEaXJlY3Rpb25Qcm92aWRlcjtcbmV4cG9ydCB7XG4gIERpcmVjdGlvblByb3ZpZGVyLFxuICBQcm92aWRlcixcbiAgdXNlRGlyZWN0aW9uXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L2Rpc21pc3NhYmxlLWxheWVyL3NyYy9EaXNtaXNzYWJsZUxheWVyLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjb21wb3NlRXZlbnRIYW5kbGVycyB9IGZyb20gXCJAcmFkaXgtdWkvcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUsIGRpc3BhdGNoRGlzY3JldGVDdXN0b21FdmVudCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWZcIjtcbmltcG9ydCB7IHVzZUVzY2FwZUtleWRvd24gfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1lc2NhcGUta2V5ZG93blwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgRElTTUlTU0FCTEVfTEFZRVJfTkFNRSA9IFwiRGlzbWlzc2FibGVMYXllclwiO1xudmFyIENPTlRFWFRfVVBEQVRFID0gXCJkaXNtaXNzYWJsZUxheWVyLnVwZGF0ZVwiO1xudmFyIFBPSU5URVJfRE9XTl9PVVRTSURFID0gXCJkaXNtaXNzYWJsZUxheWVyLnBvaW50ZXJEb3duT3V0c2lkZVwiO1xudmFyIEZPQ1VTX09VVFNJREUgPSBcImRpc21pc3NhYmxlTGF5ZXIuZm9jdXNPdXRzaWRlXCI7XG52YXIgb3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cztcbnZhciBEaXNtaXNzYWJsZUxheWVyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBsYXllcnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksXG4gIGxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLFxuICBicmFuY2hlczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKVxufSk7XG52YXIgRGlzbWlzc2FibGVMYXllciA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzID0gZmFsc2UsXG4gICAgICBvbkVzY2FwZUtleURvd24sXG4gICAgICBvblBvaW50ZXJEb3duT3V0c2lkZSxcbiAgICAgIG9uRm9jdXNPdXRzaWRlLFxuICAgICAgb25JbnRlcmFjdE91dHNpZGUsXG4gICAgICBvbkRpc21pc3MsXG4gICAgICAuLi5sYXllclByb3BzXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KERpc21pc3NhYmxlTGF5ZXJDb250ZXh0KTtcbiAgICBjb25zdCBbbm9kZSwgc2V0Tm9kZV0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBvd25lckRvY3VtZW50ID0gbm9kZT8ub3duZXJEb2N1bWVudCA/PyBnbG9iYWxUaGlzPy5kb2N1bWVudDtcbiAgICBjb25zdCBbLCBmb3JjZV0gPSBSZWFjdC51c2VTdGF0ZSh7fSk7XG4gICAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgKG5vZGUyKSA9PiBzZXROb2RlKG5vZGUyKSk7XG4gICAgY29uc3QgbGF5ZXJzID0gQXJyYXkuZnJvbShjb250ZXh0LmxheWVycyk7XG4gICAgY29uc3QgW2hpZ2hlc3RMYXllcldpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkXSA9IFsuLi5jb250ZXh0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkXS5zbGljZSgtMSk7XG4gICAgY29uc3QgaGlnaGVzdExheWVyV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRJbmRleCA9IGxheWVycy5pbmRleE9mKGhpZ2hlc3RMYXllcldpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkKTtcbiAgICBjb25zdCBpbmRleCA9IG5vZGUgPyBsYXllcnMuaW5kZXhPZihub2RlKSA6IC0xO1xuICAgIGNvbnN0IGlzQm9keVBvaW50ZXJFdmVudHNEaXNhYmxlZCA9IGNvbnRleHQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZSA+IDA7XG4gICAgY29uc3QgaXNQb2ludGVyRXZlbnRzRW5hYmxlZCA9IGluZGV4ID49IGhpZ2hlc3RMYXllcldpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkSW5kZXg7XG4gICAgY29uc3QgcG9pbnRlckRvd25PdXRzaWRlID0gdXNlUG9pbnRlckRvd25PdXRzaWRlKChldmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgY29uc3QgaXNQb2ludGVyRG93bk9uQnJhbmNoID0gWy4uLmNvbnRleHQuYnJhbmNoZXNdLnNvbWUoKGJyYW5jaCkgPT4gYnJhbmNoLmNvbnRhaW5zKHRhcmdldCkpO1xuICAgICAgaWYgKCFpc1BvaW50ZXJFdmVudHNFbmFibGVkIHx8IGlzUG9pbnRlckRvd25PbkJyYW5jaCkgcmV0dXJuO1xuICAgICAgb25Qb2ludGVyRG93bk91dHNpZGU/LihldmVudCk7XG4gICAgICBvbkludGVyYWN0T3V0c2lkZT8uKGV2ZW50KTtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgb25EaXNtaXNzPy4oKTtcbiAgICB9LCBvd25lckRvY3VtZW50KTtcbiAgICBjb25zdCBmb2N1c091dHNpZGUgPSB1c2VGb2N1c091dHNpZGUoKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBjb25zdCBpc0ZvY3VzSW5CcmFuY2ggPSBbLi4uY29udGV4dC5icmFuY2hlc10uc29tZSgoYnJhbmNoKSA9PiBicmFuY2guY29udGFpbnModGFyZ2V0KSk7XG4gICAgICBpZiAoaXNGb2N1c0luQnJhbmNoKSByZXR1cm47XG4gICAgICBvbkZvY3VzT3V0c2lkZT8uKGV2ZW50KTtcbiAgICAgIG9uSW50ZXJhY3RPdXRzaWRlPy4oZXZlbnQpO1xuICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSBvbkRpc21pc3M/LigpO1xuICAgIH0sIG93bmVyRG9jdW1lbnQpO1xuICAgIHVzZUVzY2FwZUtleWRvd24oKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBpc0hpZ2hlc3RMYXllciA9IGluZGV4ID09PSBjb250ZXh0LmxheWVycy5zaXplIC0gMTtcbiAgICAgIGlmICghaXNIaWdoZXN0TGF5ZXIpIHJldHVybjtcbiAgICAgIG9uRXNjYXBlS2V5RG93bj8uKGV2ZW50KTtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBvbkRpc21pc3MpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb25EaXNtaXNzKCk7XG4gICAgICB9XG4gICAgfSwgb3duZXJEb2N1bWVudCk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghbm9kZSkgcmV0dXJuO1xuICAgICAgaWYgKGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cykge1xuICAgICAgICBpZiAoY29udGV4dC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplID09PSAwKSB7XG4gICAgICAgICAgb3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cyA9IG93bmVyRG9jdW1lbnQuYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzO1xuICAgICAgICAgIG93bmVyRG9jdW1lbnQuYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5hZGQobm9kZSk7XG4gICAgICB9XG4gICAgICBjb250ZXh0LmxheWVycy5hZGQobm9kZSk7XG4gICAgICBkaXNwYXRjaFVwZGF0ZSgpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cyAmJiBjb250ZXh0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemUgPT09IDEpIHtcbiAgICAgICAgICBvd25lckRvY3VtZW50LmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9IG9yaWdpbmFsQm9keVBvaW50ZXJFdmVudHM7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgW25vZGUsIG93bmVyRG9jdW1lbnQsIGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cywgY29udGV4dF0pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybjtcbiAgICAgICAgY29udGV4dC5sYXllcnMuZGVsZXRlKG5vZGUpO1xuICAgICAgICBjb250ZXh0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLmRlbGV0ZShub2RlKTtcbiAgICAgICAgZGlzcGF0Y2hVcGRhdGUoKTtcbiAgICAgIH07XG4gICAgfSwgW25vZGUsIGNvbnRleHRdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlVXBkYXRlID0gKCkgPT4gZm9yY2Uoe30pO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDT05URVhUX1VQREFURSwgaGFuZGxlVXBkYXRlKTtcbiAgICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKENPTlRFWFRfVVBEQVRFLCBoYW5kbGVVcGRhdGUpO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIFByaW1pdGl2ZS5kaXYsXG4gICAgICB7XG4gICAgICAgIC4uLmxheWVyUHJvcHMsXG4gICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHBvaW50ZXJFdmVudHM6IGlzQm9keVBvaW50ZXJFdmVudHNEaXNhYmxlZCA/IGlzUG9pbnRlckV2ZW50c0VuYWJsZWQgPyBcImF1dG9cIiA6IFwibm9uZVwiIDogdm9pZCAwLFxuICAgICAgICAgIC4uLnByb3BzLnN0eWxlXG4gICAgICAgIH0sXG4gICAgICAgIG9uRm9jdXNDYXB0dXJlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkZvY3VzQ2FwdHVyZSwgZm9jdXNPdXRzaWRlLm9uRm9jdXNDYXB0dXJlKSxcbiAgICAgICAgb25CbHVyQ2FwdHVyZTogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25CbHVyQ2FwdHVyZSwgZm9jdXNPdXRzaWRlLm9uQmx1ckNhcHR1cmUpLFxuICAgICAgICBvblBvaW50ZXJEb3duQ2FwdHVyZTogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgcHJvcHMub25Qb2ludGVyRG93bkNhcHR1cmUsXG4gICAgICAgICAgcG9pbnRlckRvd25PdXRzaWRlLm9uUG9pbnRlckRvd25DYXB0dXJlXG4gICAgICAgIClcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xuRGlzbWlzc2FibGVMYXllci5kaXNwbGF5TmFtZSA9IERJU01JU1NBQkxFX0xBWUVSX05BTUU7XG52YXIgQlJBTkNIX05BTUUgPSBcIkRpc21pc3NhYmxlTGF5ZXJCcmFuY2hcIjtcbnZhciBEaXNtaXNzYWJsZUxheWVyQnJhbmNoID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChEaXNtaXNzYWJsZUxheWVyQ29udGV4dCk7XG4gIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgcmVmKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBub2RlID0gcmVmLmN1cnJlbnQ7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIGNvbnRleHQuYnJhbmNoZXMuYWRkKG5vZGUpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29udGV4dC5icmFuY2hlcy5kZWxldGUobm9kZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2NvbnRleHQuYnJhbmNoZXNdKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUHJpbWl0aXZlLmRpdiwgeyAuLi5wcm9wcywgcmVmOiBjb21wb3NlZFJlZnMgfSk7XG59KTtcbkRpc21pc3NhYmxlTGF5ZXJCcmFuY2guZGlzcGxheU5hbWUgPSBCUkFOQ0hfTkFNRTtcbmZ1bmN0aW9uIHVzZVBvaW50ZXJEb3duT3V0c2lkZShvblBvaW50ZXJEb3duT3V0c2lkZSwgb3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXM/LmRvY3VtZW50KSB7XG4gIGNvbnN0IGhhbmRsZVBvaW50ZXJEb3duT3V0c2lkZSA9IHVzZUNhbGxiYWNrUmVmKG9uUG9pbnRlckRvd25PdXRzaWRlKTtcbiAgY29uc3QgaXNQb2ludGVySW5zaWRlUmVhY3RUcmVlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgaGFuZGxlQ2xpY2tSZWYgPSBSZWFjdC51c2VSZWYoKCkgPT4ge1xuICB9KTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVQb2ludGVyRG93biA9IChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCAmJiAhaXNQb2ludGVySW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgbGV0IGhhbmRsZUFuZERpc3BhdGNoUG9pbnRlckRvd25PdXRzaWRlRXZlbnQyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaGFuZGxlQW5kRGlzcGF0Y2hDdXN0b21FdmVudChcbiAgICAgICAgICAgIFBPSU5URVJfRE9XTl9PVVRTSURFLFxuICAgICAgICAgICAgaGFuZGxlUG9pbnRlckRvd25PdXRzaWRlLFxuICAgICAgICAgICAgZXZlbnREZXRhaWwsXG4gICAgICAgICAgICB7IGRpc2NyZXRlOiB0cnVlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaGFuZGxlQW5kRGlzcGF0Y2hQb2ludGVyRG93bk91dHNpZGVFdmVudCA9IGhhbmRsZUFuZERpc3BhdGNoUG9pbnRlckRvd25PdXRzaWRlRXZlbnQyO1xuICAgICAgICBjb25zdCBldmVudERldGFpbCA9IHsgb3JpZ2luYWxFdmVudDogZXZlbnQgfTtcbiAgICAgICAgaWYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSBcInRvdWNoXCIpIHtcbiAgICAgICAgICBvd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGlja1JlZi5jdXJyZW50KTtcbiAgICAgICAgICBoYW5kbGVDbGlja1JlZi5jdXJyZW50ID0gaGFuZGxlQW5kRGlzcGF0Y2hQb2ludGVyRG93bk91dHNpZGVFdmVudDI7XG4gICAgICAgICAgb3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2tSZWYuY3VycmVudCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhbmRsZUFuZERpc3BhdGNoUG9pbnRlckRvd25PdXRzaWRlRXZlbnQyKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrUmVmLmN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgaXNQb2ludGVySW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICAgIGNvbnN0IHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBvd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBoYW5kbGVQb2ludGVyRG93bik7XG4gICAgfSwgMCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICBvd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBoYW5kbGVQb2ludGVyRG93bik7XG4gICAgICBvd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGlja1JlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbb3duZXJEb2N1bWVudCwgaGFuZGxlUG9pbnRlckRvd25PdXRzaWRlXSk7XG4gIHJldHVybiB7XG4gICAgLy8gZW5zdXJlcyB3ZSBjaGVjayBSZWFjdCBjb21wb25lbnQgdHJlZSAobm90IGp1c3QgRE9NIHRyZWUpXG4gICAgb25Qb2ludGVyRG93bkNhcHR1cmU6ICgpID0+IGlzUG9pbnRlckluc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50ID0gdHJ1ZVxuICB9O1xufVxuZnVuY3Rpb24gdXNlRm9jdXNPdXRzaWRlKG9uRm9jdXNPdXRzaWRlLCBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcz8uZG9jdW1lbnQpIHtcbiAgY29uc3QgaGFuZGxlRm9jdXNPdXRzaWRlID0gdXNlQ2FsbGJhY2tSZWYob25Gb2N1c091dHNpZGUpO1xuICBjb25zdCBpc0ZvY3VzSW5zaWRlUmVhY3RUcmVlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVGb2N1cyA9IChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCAmJiAhaXNGb2N1c0luc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50RGV0YWlsID0geyBvcmlnaW5hbEV2ZW50OiBldmVudCB9O1xuICAgICAgICBoYW5kbGVBbmREaXNwYXRjaEN1c3RvbUV2ZW50KEZPQ1VTX09VVFNJREUsIGhhbmRsZUZvY3VzT3V0c2lkZSwgZXZlbnREZXRhaWwsIHtcbiAgICAgICAgICBkaXNjcmV0ZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBvd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIGhhbmRsZUZvY3VzKTtcbiAgICByZXR1cm4gKCkgPT4gb3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCBoYW5kbGVGb2N1cyk7XG4gIH0sIFtvd25lckRvY3VtZW50LCBoYW5kbGVGb2N1c091dHNpZGVdKTtcbiAgcmV0dXJuIHtcbiAgICBvbkZvY3VzQ2FwdHVyZTogKCkgPT4gaXNGb2N1c0luc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50ID0gdHJ1ZSxcbiAgICBvbkJsdXJDYXB0dXJlOiAoKSA9PiBpc0ZvY3VzSW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSBmYWxzZVxuICB9O1xufVxuZnVuY3Rpb24gZGlzcGF0Y2hVcGRhdGUoKSB7XG4gIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KENPTlRFWFRfVVBEQVRFKTtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5mdW5jdGlvbiBoYW5kbGVBbmREaXNwYXRjaEN1c3RvbUV2ZW50KG5hbWUsIGhhbmRsZXIsIGRldGFpbCwgeyBkaXNjcmV0ZSB9KSB7XG4gIGNvbnN0IHRhcmdldCA9IGRldGFpbC5vcmlnaW5hbEV2ZW50LnRhcmdldDtcbiAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQobmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsIH0pO1xuICBpZiAoaGFuZGxlcikgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlciwgeyBvbmNlOiB0cnVlIH0pO1xuICBpZiAoZGlzY3JldGUpIHtcbiAgICBkaXNwYXRjaERpc2NyZXRlQ3VzdG9tRXZlbnQodGFyZ2V0LCBldmVudCk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG59XG52YXIgUm9vdCA9IERpc21pc3NhYmxlTGF5ZXI7XG52YXIgQnJhbmNoID0gRGlzbWlzc2FibGVMYXllckJyYW5jaDtcbmV4cG9ydCB7XG4gIEJyYW5jaCxcbiAgRGlzbWlzc2FibGVMYXllcixcbiAgRGlzbWlzc2FibGVMYXllckJyYW5jaCxcbiAgUm9vdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9kcm9wZG93bi1tZW51L3NyYy9Ecm9wZG93bk1lbnUudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNvbXBvc2VFdmVudEhhbmRsZXJzIH0gZnJvbSBcIkByYWRpeC11aS9wcmltaXRpdmVcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWZzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHRTY29wZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29udGV4dFwiO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxhYmxlU3RhdGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jb250cm9sbGFibGUtc3RhdGVcIjtcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgKiBhcyBNZW51UHJpbWl0aXZlIGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtbWVudVwiO1xuaW1wb3J0IHsgY3JlYXRlTWVudVNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1tZW51XCI7XG5pbXBvcnQgeyB1c2VJZCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtaWRcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIERST1BET1dOX01FTlVfTkFNRSA9IFwiRHJvcGRvd25NZW51XCI7XG52YXIgW2NyZWF0ZURyb3Bkb3duTWVudUNvbnRleHQsIGNyZWF0ZURyb3Bkb3duTWVudVNjb3BlXSA9IGNyZWF0ZUNvbnRleHRTY29wZShcbiAgRFJPUERPV05fTUVOVV9OQU1FLFxuICBbY3JlYXRlTWVudVNjb3BlXVxuKTtcbnZhciB1c2VNZW51U2NvcGUgPSBjcmVhdGVNZW51U2NvcGUoKTtcbnZhciBbRHJvcGRvd25NZW51UHJvdmlkZXIsIHVzZURyb3Bkb3duTWVudUNvbnRleHRdID0gY3JlYXRlRHJvcGRvd25NZW51Q29udGV4dChEUk9QRE9XTl9NRU5VX05BTUUpO1xudmFyIERyb3Bkb3duTWVudSA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgX19zY29wZURyb3Bkb3duTWVudSxcbiAgICBjaGlsZHJlbixcbiAgICBkaXIsXG4gICAgb3Blbjogb3BlblByb3AsXG4gICAgZGVmYXVsdE9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIG1vZGFsID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgY29uc3QgdHJpZ2dlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgW29wZW4gPSBmYWxzZSwgc2V0T3Blbl0gPSB1c2VDb250cm9sbGFibGVTdGF0ZSh7XG4gICAgcHJvcDogb3BlblByb3AsXG4gICAgZGVmYXVsdFByb3A6IGRlZmF1bHRPcGVuLFxuICAgIG9uQ2hhbmdlOiBvbk9wZW5DaGFuZ2VcbiAgfSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgIERyb3Bkb3duTWVudVByb3ZpZGVyLFxuICAgIHtcbiAgICAgIHNjb3BlOiBfX3Njb3BlRHJvcGRvd25NZW51LFxuICAgICAgdHJpZ2dlcklkOiB1c2VJZCgpLFxuICAgICAgdHJpZ2dlclJlZixcbiAgICAgIGNvbnRlbnRJZDogdXNlSWQoKSxcbiAgICAgIG9wZW4sXG4gICAgICBvbk9wZW5DaGFuZ2U6IHNldE9wZW4sXG4gICAgICBvbk9wZW5Ub2dnbGU6IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHNldE9wZW4oKHByZXZPcGVuKSA9PiAhcHJldk9wZW4pLCBbc2V0T3Blbl0pLFxuICAgICAgbW9kYWwsXG4gICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLlJvb3QsIHsgLi4ubWVudVNjb3BlLCBvcGVuLCBvbk9wZW5DaGFuZ2U6IHNldE9wZW4sIGRpciwgbW9kYWwsIGNoaWxkcmVuIH0pXG4gICAgfVxuICApO1xufTtcbkRyb3Bkb3duTWVudS5kaXNwbGF5TmFtZSA9IERST1BET1dOX01FTlVfTkFNRTtcbnZhciBUUklHR0VSX05BTUUgPSBcIkRyb3Bkb3duTWVudVRyaWdnZXJcIjtcbnZhciBEcm9wZG93bk1lbnVUcmlnZ2VyID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIGRpc2FibGVkID0gZmFsc2UsIC4uLnRyaWdnZXJQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZURyb3Bkb3duTWVudUNvbnRleHQoVFJJR0dFUl9OQU1FLCBfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5BbmNob3IsIHsgYXNDaGlsZDogdHJ1ZSwgLi4ubWVudVNjb3BlLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIFByaW1pdGl2ZS5idXR0b24sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIGlkOiBjb250ZXh0LnRyaWdnZXJJZCxcbiAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibWVudVwiLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogY29udGV4dC5vcGVuLFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjogY29udGV4dC5vcGVuID8gY29udGV4dC5jb250ZW50SWQgOiB2b2lkIDAsXG4gICAgICAgIFwiZGF0YS1zdGF0ZVwiOiBjb250ZXh0Lm9wZW4gPyBcIm9wZW5cIiA6IFwiY2xvc2VkXCIsXG4gICAgICAgIFwiZGF0YS1kaXNhYmxlZFwiOiBkaXNhYmxlZCA/IFwiXCIgOiB2b2lkIDAsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICAuLi50cmlnZ2VyUHJvcHMsXG4gICAgICAgIHJlZjogY29tcG9zZVJlZnMoZm9yd2FyZGVkUmVmLCBjb250ZXh0LnRyaWdnZXJSZWYpLFxuICAgICAgICBvblBvaW50ZXJEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vblBvaW50ZXJEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoIWRpc2FibGVkICYmIGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBldmVudC5jdHJsS2V5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29udGV4dC5vbk9wZW5Ub2dnbGUoKTtcbiAgICAgICAgICAgIGlmICghY29udGV4dC5vcGVuKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIG9uS2V5RG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25LZXlEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICAgICAgICBpZiAoW1wiRW50ZXJcIiwgXCIgXCJdLmluY2x1ZGVzKGV2ZW50LmtleSkpIGNvbnRleHQub25PcGVuVG9nZ2xlKCk7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd0Rvd25cIikgY29udGV4dC5vbk9wZW5DaGFuZ2UodHJ1ZSk7XG4gICAgICAgICAgaWYgKFtcIkVudGVyXCIsIFwiIFwiLCBcIkFycm93RG93blwiXS5pbmNsdWRlcyhldmVudC5rZXkpKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICkgfSk7XG4gIH1cbik7XG5Ecm9wZG93bk1lbnVUcmlnZ2VyLmRpc3BsYXlOYW1lID0gVFJJR0dFUl9OQU1FO1xudmFyIFBPUlRBTF9OQU1FID0gXCJEcm9wZG93bk1lbnVQb3J0YWxcIjtcbnZhciBEcm9wZG93bk1lbnVQb3J0YWwgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5wb3J0YWxQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5Qb3J0YWwsIHsgLi4ubWVudVNjb3BlLCAuLi5wb3J0YWxQcm9wcyB9KTtcbn07XG5Ecm9wZG93bk1lbnVQb3J0YWwuZGlzcGxheU5hbWUgPSBQT1JUQUxfTkFNRTtcbnZhciBDT05URU5UX05BTUUgPSBcIkRyb3Bkb3duTWVudUNvbnRlbnRcIjtcbnZhciBEcm9wZG93bk1lbnVDb250ZW50ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLmNvbnRlbnRQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZURyb3Bkb3duTWVudUNvbnRleHQoQ09OVEVOVF9OQU1FLCBfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gICAgY29uc3QgaGFzSW50ZXJhY3RlZE91dHNpZGVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudVByaW1pdGl2ZS5Db250ZW50LFxuICAgICAge1xuICAgICAgICBpZDogY29udGV4dC5jb250ZW50SWQsXG4gICAgICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IGNvbnRleHQudHJpZ2dlcklkLFxuICAgICAgICAuLi5tZW51U2NvcGUsXG4gICAgICAgIC4uLmNvbnRlbnRQcm9wcyxcbiAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICAgIG9uQ2xvc2VBdXRvRm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uQ2xvc2VBdXRvRm9jdXMsIChldmVudCkgPT4ge1xuICAgICAgICAgIGlmICghaGFzSW50ZXJhY3RlZE91dHNpZGVSZWYuY3VycmVudCkgY29udGV4dC50cmlnZ2VyUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgICAgaGFzSW50ZXJhY3RlZE91dHNpZGVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pLFxuICAgICAgICBvbkludGVyYWN0T3V0c2lkZTogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25JbnRlcmFjdE91dHNpZGUsIChldmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRXZlbnQgPSBldmVudC5kZXRhaWwub3JpZ2luYWxFdmVudDtcbiAgICAgICAgICBjb25zdCBjdHJsTGVmdENsaWNrID0gb3JpZ2luYWxFdmVudC5idXR0b24gPT09IDAgJiYgb3JpZ2luYWxFdmVudC5jdHJsS2V5ID09PSB0cnVlO1xuICAgICAgICAgIGNvbnN0IGlzUmlnaHRDbGljayA9IG9yaWdpbmFsRXZlbnQuYnV0dG9uID09PSAyIHx8IGN0cmxMZWZ0Q2xpY2s7XG4gICAgICAgICAgaWYgKCFjb250ZXh0Lm1vZGFsIHx8IGlzUmlnaHRDbGljaykgaGFzSW50ZXJhY3RlZE91dHNpZGVSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgIH0pLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIC4uLnByb3BzLnN0eWxlLFxuICAgICAgICAgIC8vIHJlLW5hbWVzcGFjZSBleHBvc2VkIGNvbnRlbnQgY3VzdG9tIHByb3BlcnRpZXNcbiAgICAgICAgICAuLi57XG4gICAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW5cIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbilcIixcbiAgICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtYXZhaWxhYmxlLXdpZHRoXCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS13aWR0aClcIixcbiAgICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0KVwiLFxuICAgICAgICAgICAgXCItLXJhZGl4LWRyb3Bkb3duLW1lbnUtdHJpZ2dlci13aWR0aFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgpXCIsXG4gICAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS10cmlnZ2VyLWhlaWdodFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hbmNob3ItaGVpZ2h0KVwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcbkRyb3Bkb3duTWVudUNvbnRlbnQuZGlzcGxheU5hbWUgPSBDT05URU5UX05BTUU7XG52YXIgR1JPVVBfTkFNRSA9IFwiRHJvcGRvd25NZW51R3JvdXBcIjtcbnZhciBEcm9wZG93bk1lbnVHcm91cCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5ncm91cFByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5Hcm91cCwgeyAuLi5tZW51U2NvcGUsIC4uLmdyb3VwUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9XG4pO1xuRHJvcGRvd25NZW51R3JvdXAuZGlzcGxheU5hbWUgPSBHUk9VUF9OQU1FO1xudmFyIExBQkVMX05BTUUgPSBcIkRyb3Bkb3duTWVudUxhYmVsXCI7XG52YXIgRHJvcGRvd25NZW51TGFiZWwgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4ubGFiZWxQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuTGFiZWwsIHsgLi4ubWVudVNjb3BlLCAuLi5sYWJlbFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfVxuKTtcbkRyb3Bkb3duTWVudUxhYmVsLmRpc3BsYXlOYW1lID0gTEFCRUxfTkFNRTtcbnZhciBJVEVNX05BTUUgPSBcIkRyb3Bkb3duTWVudUl0ZW1cIjtcbnZhciBEcm9wZG93bk1lbnVJdGVtID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLml0ZW1Qcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuSXRlbSwgeyAuLi5tZW51U2NvcGUsIC4uLml0ZW1Qcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH1cbik7XG5Ecm9wZG93bk1lbnVJdGVtLmRpc3BsYXlOYW1lID0gSVRFTV9OQU1FO1xudmFyIENIRUNLQk9YX0lURU1fTkFNRSA9IFwiRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtXCI7XG52YXIgRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLmNoZWNrYm94SXRlbVByb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLkNoZWNrYm94SXRlbSwgeyAuLi5tZW51U2NvcGUsIC4uLmNoZWNrYm94SXRlbVByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbn0pO1xuRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtLmRpc3BsYXlOYW1lID0gQ0hFQ0tCT1hfSVRFTV9OQU1FO1xudmFyIFJBRElPX0dST1VQX05BTUUgPSBcIkRyb3Bkb3duTWVudVJhZGlvR3JvdXBcIjtcbnZhciBEcm9wZG93bk1lbnVSYWRpb0dyb3VwID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLnJhZGlvR3JvdXBQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5SYWRpb0dyb3VwLCB7IC4uLm1lbnVTY29wZSwgLi4ucmFkaW9Hcm91cFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbn0pO1xuRHJvcGRvd25NZW51UmFkaW9Hcm91cC5kaXNwbGF5TmFtZSA9IFJBRElPX0dST1VQX05BTUU7XG52YXIgUkFESU9fSVRFTV9OQU1FID0gXCJEcm9wZG93bk1lbnVSYWRpb0l0ZW1cIjtcbnZhciBEcm9wZG93bk1lbnVSYWRpb0l0ZW0gPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4ucmFkaW9JdGVtUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuUmFkaW9JdGVtLCB7IC4uLm1lbnVTY29wZSwgLi4ucmFkaW9JdGVtUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xufSk7XG5Ecm9wZG93bk1lbnVSYWRpb0l0ZW0uZGlzcGxheU5hbWUgPSBSQURJT19JVEVNX05BTUU7XG52YXIgSU5ESUNBVE9SX05BTUUgPSBcIkRyb3Bkb3duTWVudUl0ZW1JbmRpY2F0b3JcIjtcbnZhciBEcm9wZG93bk1lbnVJdGVtSW5kaWNhdG9yID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLml0ZW1JbmRpY2F0b3JQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5JdGVtSW5kaWNhdG9yLCB7IC4uLm1lbnVTY29wZSwgLi4uaXRlbUluZGljYXRvclByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbn0pO1xuRHJvcGRvd25NZW51SXRlbUluZGljYXRvci5kaXNwbGF5TmFtZSA9IElORElDQVRPUl9OQU1FO1xudmFyIFNFUEFSQVRPUl9OQU1FID0gXCJEcm9wZG93bk1lbnVTZXBhcmF0b3JcIjtcbnZhciBEcm9wZG93bk1lbnVTZXBhcmF0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4uc2VwYXJhdG9yUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuU2VwYXJhdG9yLCB7IC4uLm1lbnVTY29wZSwgLi4uc2VwYXJhdG9yUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xufSk7XG5Ecm9wZG93bk1lbnVTZXBhcmF0b3IuZGlzcGxheU5hbWUgPSBTRVBBUkFUT1JfTkFNRTtcbnZhciBBUlJPV19OQU1FID0gXCJEcm9wZG93bk1lbnVBcnJvd1wiO1xudmFyIERyb3Bkb3duTWVudUFycm93ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLmFycm93UHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLkFycm93LCB7IC4uLm1lbnVTY29wZSwgLi4uYXJyb3dQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH1cbik7XG5Ecm9wZG93bk1lbnVBcnJvdy5kaXNwbGF5TmFtZSA9IEFSUk9XX05BTUU7XG52YXIgRHJvcGRvd25NZW51U3ViID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgY2hpbGRyZW4sIG9wZW46IG9wZW5Qcm9wLCBvbk9wZW5DaGFuZ2UsIGRlZmF1bHRPcGVuIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICBjb25zdCBbb3BlbiA9IGZhbHNlLCBzZXRPcGVuXSA9IHVzZUNvbnRyb2xsYWJsZVN0YXRlKHtcbiAgICBwcm9wOiBvcGVuUHJvcCxcbiAgICBkZWZhdWx0UHJvcDogZGVmYXVsdE9wZW4sXG4gICAgb25DaGFuZ2U6IG9uT3BlbkNoYW5nZVxuICB9KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5TdWIsIHsgLi4ubWVudVNjb3BlLCBvcGVuLCBvbk9wZW5DaGFuZ2U6IHNldE9wZW4sIGNoaWxkcmVuIH0pO1xufTtcbnZhciBTVUJfVFJJR0dFUl9OQU1FID0gXCJEcm9wZG93bk1lbnVTdWJUcmlnZ2VyXCI7XG52YXIgRHJvcGRvd25NZW51U3ViVHJpZ2dlciA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5zdWJUcmlnZ2VyUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuU3ViVHJpZ2dlciwgeyAuLi5tZW51U2NvcGUsIC4uLnN1YlRyaWdnZXJQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG59KTtcbkRyb3Bkb3duTWVudVN1YlRyaWdnZXIuZGlzcGxheU5hbWUgPSBTVUJfVFJJR0dFUl9OQU1FO1xudmFyIFNVQl9DT05URU5UX05BTUUgPSBcIkRyb3Bkb3duTWVudVN1YkNvbnRlbnRcIjtcbnZhciBEcm9wZG93bk1lbnVTdWJDb250ZW50ID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLnN1YkNvbnRlbnRQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgTWVudVByaW1pdGl2ZS5TdWJDb250ZW50LFxuICAgIHtcbiAgICAgIC4uLm1lbnVTY29wZSxcbiAgICAgIC4uLnN1YkNvbnRlbnRQcm9wcyxcbiAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgLi4ucHJvcHMuc3R5bGUsXG4gICAgICAgIC8vIHJlLW5hbWVzcGFjZSBleHBvc2VkIGNvbnRlbnQgY3VzdG9tIHByb3BlcnRpZXNcbiAgICAgICAgLi4ue1xuICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtdHJhbnNmb3JtLW9yaWdpblwiOiBcInZhcigtLXJhZGl4LXBvcHBlci10cmFuc2Zvcm0tb3JpZ2luKVwiLFxuICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtYXZhaWxhYmxlLXdpZHRoXCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS13aWR0aClcIixcbiAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHRcIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLWhlaWdodClcIixcbiAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS10cmlnZ2VyLXdpZHRoXCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLWFuY2hvci13aWR0aClcIixcbiAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS10cmlnZ2VyLWhlaWdodFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hbmNob3ItaGVpZ2h0KVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICk7XG59KTtcbkRyb3Bkb3duTWVudVN1YkNvbnRlbnQuZGlzcGxheU5hbWUgPSBTVUJfQ09OVEVOVF9OQU1FO1xudmFyIFJvb3QyID0gRHJvcGRvd25NZW51O1xudmFyIFRyaWdnZXIgPSBEcm9wZG93bk1lbnVUcmlnZ2VyO1xudmFyIFBvcnRhbDIgPSBEcm9wZG93bk1lbnVQb3J0YWw7XG52YXIgQ29udGVudDIgPSBEcm9wZG93bk1lbnVDb250ZW50O1xudmFyIEdyb3VwMiA9IERyb3Bkb3duTWVudUdyb3VwO1xudmFyIExhYmVsMiA9IERyb3Bkb3duTWVudUxhYmVsO1xudmFyIEl0ZW0yID0gRHJvcGRvd25NZW51SXRlbTtcbnZhciBDaGVja2JveEl0ZW0yID0gRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtO1xudmFyIFJhZGlvR3JvdXAyID0gRHJvcGRvd25NZW51UmFkaW9Hcm91cDtcbnZhciBSYWRpb0l0ZW0yID0gRHJvcGRvd25NZW51UmFkaW9JdGVtO1xudmFyIEl0ZW1JbmRpY2F0b3IyID0gRHJvcGRvd25NZW51SXRlbUluZGljYXRvcjtcbnZhciBTZXBhcmF0b3IyID0gRHJvcGRvd25NZW51U2VwYXJhdG9yO1xudmFyIEFycm93MiA9IERyb3Bkb3duTWVudUFycm93O1xudmFyIFN1YjIgPSBEcm9wZG93bk1lbnVTdWI7XG52YXIgU3ViVHJpZ2dlcjIgPSBEcm9wZG93bk1lbnVTdWJUcmlnZ2VyO1xudmFyIFN1YkNvbnRlbnQyID0gRHJvcGRvd25NZW51U3ViQ29udGVudDtcbmV4cG9ydCB7XG4gIEFycm93MiBhcyBBcnJvdyxcbiAgQ2hlY2tib3hJdGVtMiBhcyBDaGVja2JveEl0ZW0sXG4gIENvbnRlbnQyIGFzIENvbnRlbnQsXG4gIERyb3Bkb3duTWVudSxcbiAgRHJvcGRvd25NZW51QXJyb3csXG4gIERyb3Bkb3duTWVudUNoZWNrYm94SXRlbSxcbiAgRHJvcGRvd25NZW51Q29udGVudCxcbiAgRHJvcGRvd25NZW51R3JvdXAsXG4gIERyb3Bkb3duTWVudUl0ZW0sXG4gIERyb3Bkb3duTWVudUl0ZW1JbmRpY2F0b3IsXG4gIERyb3Bkb3duTWVudUxhYmVsLFxuICBEcm9wZG93bk1lbnVQb3J0YWwsXG4gIERyb3Bkb3duTWVudVJhZGlvR3JvdXAsXG4gIERyb3Bkb3duTWVudVJhZGlvSXRlbSxcbiAgRHJvcGRvd25NZW51U2VwYXJhdG9yLFxuICBEcm9wZG93bk1lbnVTdWIsXG4gIERyb3Bkb3duTWVudVN1YkNvbnRlbnQsXG4gIERyb3Bkb3duTWVudVN1YlRyaWdnZXIsXG4gIERyb3Bkb3duTWVudVRyaWdnZXIsXG4gIEdyb3VwMiBhcyBHcm91cCxcbiAgSXRlbTIgYXMgSXRlbSxcbiAgSXRlbUluZGljYXRvcjIgYXMgSXRlbUluZGljYXRvcixcbiAgTGFiZWwyIGFzIExhYmVsLFxuICBQb3J0YWwyIGFzIFBvcnRhbCxcbiAgUmFkaW9Hcm91cDIgYXMgUmFkaW9Hcm91cCxcbiAgUmFkaW9JdGVtMiBhcyBSYWRpb0l0ZW0sXG4gIFJvb3QyIGFzIFJvb3QsXG4gIFNlcGFyYXRvcjIgYXMgU2VwYXJhdG9yLFxuICBTdWIyIGFzIFN1YixcbiAgU3ViQ29udGVudDIgYXMgU3ViQ29udGVudCxcbiAgU3ViVHJpZ2dlcjIgYXMgU3ViVHJpZ2dlcixcbiAgVHJpZ2dlcixcbiAgY3JlYXRlRHJvcGRvd25NZW51U2NvcGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvZm9jdXMtZ3VhcmRzL3NyYy9Gb2N1c0d1YXJkcy50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIGNvdW50ID0gMDtcbmZ1bmN0aW9uIEZvY3VzR3VhcmRzKHByb3BzKSB7XG4gIHVzZUZvY3VzR3VhcmRzKCk7XG4gIHJldHVybiBwcm9wcy5jaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIHVzZUZvY3VzR3VhcmRzKCkge1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVkZ2VHdWFyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtcmFkaXgtZm9jdXMtZ3VhcmRdXCIpO1xuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBlZGdlR3VhcmRzWzBdID8/IGNyZWF0ZUZvY3VzR3VhcmQoKSk7XG4gICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJiZWZvcmVlbmRcIiwgZWRnZUd1YXJkc1sxXSA/PyBjcmVhdGVGb2N1c0d1YXJkKCkpO1xuICAgIGNvdW50Kys7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtcmFkaXgtZm9jdXMtZ3VhcmRdXCIpLmZvckVhY2goKG5vZGUpID0+IG5vZGUucmVtb3ZlKCkpO1xuICAgICAgfVxuICAgICAgY291bnQtLTtcbiAgICB9O1xuICB9LCBbXSk7XG59XG5mdW5jdGlvbiBjcmVhdGVGb2N1c0d1YXJkKCkge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1yYWRpeC1mb2N1cy1ndWFyZFwiLCBcIlwiKTtcbiAgZWxlbWVudC50YWJJbmRleCA9IDA7XG4gIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IFwib3V0bGluZTogbm9uZTsgb3BhY2l0eTogMDsgcG9zaXRpb246IGZpeGVkOyBwb2ludGVyLWV2ZW50czogbm9uZVwiO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbnZhciBSb290ID0gRm9jdXNHdWFyZHM7XG5leHBvcnQge1xuICBGb2N1c0d1YXJkcyxcbiAgUm9vdCxcbiAgdXNlRm9jdXNHdWFyZHNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvZm9jdXMtc2NvcGUvc3JjL0ZvY3VzU2NvcGUudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNvbXBvc2VkUmVmcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZVwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWZcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIEFVVE9GT0NVU19PTl9NT1VOVCA9IFwiZm9jdXNTY29wZS5hdXRvRm9jdXNPbk1vdW50XCI7XG52YXIgQVVUT0ZPQ1VTX09OX1VOTU9VTlQgPSBcImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Vbm1vdW50XCI7XG52YXIgRVZFTlRfT1BUSU9OUyA9IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IHRydWUgfTtcbnZhciBGT0NVU19TQ09QRV9OQU1FID0gXCJGb2N1c1Njb3BlXCI7XG52YXIgRm9jdXNTY29wZSA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIGxvb3AgPSBmYWxzZSxcbiAgICB0cmFwcGVkID0gZmFsc2UsXG4gICAgb25Nb3VudEF1dG9Gb2N1czogb25Nb3VudEF1dG9Gb2N1c1Byb3AsXG4gICAgb25Vbm1vdW50QXV0b0ZvY3VzOiBvblVubW91bnRBdXRvRm9jdXNQcm9wLFxuICAgIC4uLnNjb3BlUHJvcHNcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbY29udGFpbmVyLCBzZXRDb250YWluZXJdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IG9uTW91bnRBdXRvRm9jdXMgPSB1c2VDYWxsYmFja1JlZihvbk1vdW50QXV0b0ZvY3VzUHJvcCk7XG4gIGNvbnN0IG9uVW5tb3VudEF1dG9Gb2N1cyA9IHVzZUNhbGxiYWNrUmVmKG9uVW5tb3VudEF1dG9Gb2N1c1Byb3ApO1xuICBjb25zdCBsYXN0Rm9jdXNlZEVsZW1lbnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIChub2RlKSA9PiBzZXRDb250YWluZXIobm9kZSkpO1xuICBjb25zdCBmb2N1c1Njb3BlID0gUmVhY3QudXNlUmVmKHtcbiAgICBwYXVzZWQ6IGZhbHNlLFxuICAgIHBhdXNlKCkge1xuICAgICAgdGhpcy5wYXVzZWQgPSB0cnVlO1xuICAgIH0sXG4gICAgcmVzdW1lKCkge1xuICAgICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pLmN1cnJlbnQ7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRyYXBwZWQpIHtcbiAgICAgIGxldCBoYW5kbGVGb2N1c0luMiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGlmIChmb2N1c1Njb3BlLnBhdXNlZCB8fCAhY29udGFpbmVyKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgaWYgKGNvbnRhaW5lci5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgbGFzdEZvY3VzZWRFbGVtZW50UmVmLmN1cnJlbnQgPSB0YXJnZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9jdXMobGFzdEZvY3VzZWRFbGVtZW50UmVmLmN1cnJlbnQsIHsgc2VsZWN0OiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBoYW5kbGVGb2N1c091dDIgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBpZiAoZm9jdXNTY29wZS5wYXVzZWQgfHwgIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgICAgICAgaWYgKHJlbGF0ZWRUYXJnZXQgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKCFjb250YWluZXIuY29udGFpbnMocmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgICBmb2N1cyhsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCwgeyBzZWxlY3Q6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGhhbmRsZU11dGF0aW9uczIgPSBmdW5jdGlvbihtdXRhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZm9jdXNlZEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBpZiAoZm9jdXNlZEVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMpIHtcbiAgICAgICAgICBpZiAobXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApIGZvY3VzKGNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgaGFuZGxlRm9jdXNJbiA9IGhhbmRsZUZvY3VzSW4yLCBoYW5kbGVGb2N1c091dCA9IGhhbmRsZUZvY3VzT3V0MiwgaGFuZGxlTXV0YXRpb25zID0gaGFuZGxlTXV0YXRpb25zMjtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIGhhbmRsZUZvY3VzSW4yKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBoYW5kbGVGb2N1c091dDIpO1xuICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGhhbmRsZU11dGF0aW9uczIpO1xuICAgICAgaWYgKGNvbnRhaW5lcikgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lciwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCBoYW5kbGVGb2N1c0luMik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBoYW5kbGVGb2N1c091dDIpO1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbdHJhcHBlZCwgY29udGFpbmVyLCBmb2N1c1Njb3BlLnBhdXNlZF0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGZvY3VzU2NvcGVzU3RhY2suYWRkKGZvY3VzU2NvcGUpO1xuICAgICAgY29uc3QgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGhhc0ZvY3VzZWRDYW5kaWRhdGUgPSBjb250YWluZXIuY29udGFpbnMocHJldmlvdXNseUZvY3VzZWRFbGVtZW50KTtcbiAgICAgIGlmICghaGFzRm9jdXNlZENhbmRpZGF0ZSkge1xuICAgICAgICBjb25zdCBtb3VudEV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEFVVE9GT0NVU19PTl9NT1VOVCwgRVZFTlRfT1BUSU9OUyk7XG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKEFVVE9GT0NVU19PTl9NT1VOVCwgb25Nb3VudEF1dG9Gb2N1cyk7XG4gICAgICAgIGNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KG1vdW50RXZlbnQpO1xuICAgICAgICBpZiAoIW1vdW50RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgIGZvY3VzRmlyc3QocmVtb3ZlTGlua3MoZ2V0VGFiYmFibGVDYW5kaWRhdGVzKGNvbnRhaW5lcikpLCB7IHNlbGVjdDogdHJ1ZSB9KTtcbiAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gcHJldmlvdXNseUZvY3VzZWRFbGVtZW50KSB7XG4gICAgICAgICAgICBmb2N1cyhjb250YWluZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoQVVUT0ZPQ1VTX09OX01PVU5ULCBvbk1vdW50QXV0b0ZvY3VzKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdW5tb3VudEV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEFVVE9GT0NVU19PTl9VTk1PVU5ULCBFVkVOVF9PUFRJT05TKTtcbiAgICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihBVVRPRk9DVVNfT05fVU5NT1VOVCwgb25Vbm1vdW50QXV0b0ZvY3VzKTtcbiAgICAgICAgICBjb250YWluZXIuZGlzcGF0Y2hFdmVudCh1bm1vdW50RXZlbnQpO1xuICAgICAgICAgIGlmICghdW5tb3VudEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIGZvY3VzKHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA/PyBkb2N1bWVudC5ib2R5LCB7IHNlbGVjdDogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoQVVUT0ZPQ1VTX09OX1VOTU9VTlQsIG9uVW5tb3VudEF1dG9Gb2N1cyk7XG4gICAgICAgICAgZm9jdXNTY29wZXNTdGFjay5yZW1vdmUoZm9jdXNTY29wZSk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtjb250YWluZXIsIG9uTW91bnRBdXRvRm9jdXMsIG9uVW5tb3VudEF1dG9Gb2N1cywgZm9jdXNTY29wZV0pO1xuICBjb25zdCBoYW5kbGVLZXlEb3duID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWxvb3AgJiYgIXRyYXBwZWQpIHJldHVybjtcbiAgICAgIGlmIChmb2N1c1Njb3BlLnBhdXNlZCkgcmV0dXJuO1xuICAgICAgY29uc3QgaXNUYWJLZXkgPSBldmVudC5rZXkgPT09IFwiVGFiXCIgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleTtcbiAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChpc1RhYktleSAmJiBmb2N1c2VkRWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIyID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBsYXN0XSA9IGdldFRhYmJhYmxlRWRnZXMoY29udGFpbmVyMik7XG4gICAgICAgIGNvbnN0IGhhc1RhYmJhYmxlRWxlbWVudHNJbnNpZGUgPSBmaXJzdCAmJiBsYXN0O1xuICAgICAgICBpZiAoIWhhc1RhYmJhYmxlRWxlbWVudHNJbnNpZGUpIHtcbiAgICAgICAgICBpZiAoZm9jdXNlZEVsZW1lbnQgPT09IGNvbnRhaW5lcjIpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiBmb2N1c2VkRWxlbWVudCA9PT0gbGFzdCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmIChsb29wKSBmb2N1cyhmaXJzdCwgeyBzZWxlY3Q6IHRydWUgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChldmVudC5zaGlmdEtleSAmJiBmb2N1c2VkRWxlbWVudCA9PT0gZmlyc3QpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAobG9vcCkgZm9jdXMobGFzdCwgeyBzZWxlY3Q6IHRydWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbbG9vcCwgdHJhcHBlZCwgZm9jdXNTY29wZS5wYXVzZWRdXG4gICk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFByaW1pdGl2ZS5kaXYsIHsgdGFiSW5kZXg6IC0xLCAuLi5zY29wZVByb3BzLCByZWY6IGNvbXBvc2VkUmVmcywgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duIH0pO1xufSk7XG5Gb2N1c1Njb3BlLmRpc3BsYXlOYW1lID0gRk9DVVNfU0NPUEVfTkFNRTtcbmZ1bmN0aW9uIGZvY3VzRmlyc3QoY2FuZGlkYXRlcywgeyBzZWxlY3QgPSBmYWxzZSB9ID0ge30pIHtcbiAgY29uc3QgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGZvY3VzKGNhbmRpZGF0ZSwgeyBzZWxlY3QgfSk7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCkgcmV0dXJuO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUYWJiYWJsZUVkZ2VzKGNvbnRhaW5lcikge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0VGFiYmFibGVDYW5kaWRhdGVzKGNvbnRhaW5lcik7XG4gIGNvbnN0IGZpcnN0ID0gZmluZFZpc2libGUoY2FuZGlkYXRlcywgY29udGFpbmVyKTtcbiAgY29uc3QgbGFzdCA9IGZpbmRWaXNpYmxlKGNhbmRpZGF0ZXMucmV2ZXJzZSgpLCBjb250YWluZXIpO1xuICByZXR1cm4gW2ZpcnN0LCBsYXN0XTtcbn1cbmZ1bmN0aW9uIGdldFRhYmJhYmxlQ2FuZGlkYXRlcyhjb250YWluZXIpIHtcbiAgY29uc3Qgbm9kZXMgPSBbXTtcbiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihjb250YWluZXIsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCB7XG4gICAgYWNjZXB0Tm9kZTogKG5vZGUpID0+IHtcbiAgICAgIGNvbnN0IGlzSGlkZGVuSW5wdXQgPSBub2RlLnRhZ05hbWUgPT09IFwiSU5QVVRcIiAmJiBub2RlLnR5cGUgPT09IFwiaGlkZGVuXCI7XG4gICAgICBpZiAobm9kZS5kaXNhYmxlZCB8fCBub2RlLmhpZGRlbiB8fCBpc0hpZGRlbklucHV0KSByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfU0tJUDtcbiAgICAgIHJldHVybiBub2RlLnRhYkluZGV4ID49IDAgPyBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQgOiBOb2RlRmlsdGVyLkZJTFRFUl9TS0lQO1xuICAgIH1cbiAgfSk7XG4gIHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSkgbm9kZXMucHVzaCh3YWxrZXIuY3VycmVudE5vZGUpO1xuICByZXR1cm4gbm9kZXM7XG59XG5mdW5jdGlvbiBmaW5kVmlzaWJsZShlbGVtZW50cywgY29udGFpbmVyKSB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGlmICghaXNIaWRkZW4oZWxlbWVudCwgeyB1cFRvOiBjb250YWluZXIgfSkpIHJldHVybiBlbGVtZW50O1xuICB9XG59XG5mdW5jdGlvbiBpc0hpZGRlbihub2RlLCB7IHVwVG8gfSkge1xuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS52aXNpYmlsaXR5ID09PSBcImhpZGRlblwiKSByZXR1cm4gdHJ1ZTtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAodXBUbyAhPT0gdm9pZCAwICYmIG5vZGUgPT09IHVwVG8pIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5kaXNwbGF5ID09PSBcIm5vbmVcIikgcmV0dXJuIHRydWU7XG4gICAgbm9kZSA9IG5vZGUucGFyZW50RWxlbWVudDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1NlbGVjdGFibGVJbnB1dChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBcInNlbGVjdFwiIGluIGVsZW1lbnQ7XG59XG5mdW5jdGlvbiBmb2N1cyhlbGVtZW50LCB7IHNlbGVjdCA9IGZhbHNlIH0gPSB7fSkge1xuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LmZvY3VzKSB7XG4gICAgY29uc3QgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBlbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICBpZiAoZWxlbWVudCAhPT0gcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ICYmIGlzU2VsZWN0YWJsZUlucHV0KGVsZW1lbnQpICYmIHNlbGVjdClcbiAgICAgIGVsZW1lbnQuc2VsZWN0KCk7XG4gIH1cbn1cbnZhciBmb2N1c1Njb3Blc1N0YWNrID0gY3JlYXRlRm9jdXNTY29wZXNTdGFjaygpO1xuZnVuY3Rpb24gY3JlYXRlRm9jdXNTY29wZXNTdGFjaygpIHtcbiAgbGV0IHN0YWNrID0gW107XG4gIHJldHVybiB7XG4gICAgYWRkKGZvY3VzU2NvcGUpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZUZvY3VzU2NvcGUgPSBzdGFja1swXTtcbiAgICAgIGlmIChmb2N1c1Njb3BlICE9PSBhY3RpdmVGb2N1c1Njb3BlKSB7XG4gICAgICAgIGFjdGl2ZUZvY3VzU2NvcGU/LnBhdXNlKCk7XG4gICAgICB9XG4gICAgICBzdGFjayA9IGFycmF5UmVtb3ZlKHN0YWNrLCBmb2N1c1Njb3BlKTtcbiAgICAgIHN0YWNrLnVuc2hpZnQoZm9jdXNTY29wZSk7XG4gICAgfSxcbiAgICByZW1vdmUoZm9jdXNTY29wZSkge1xuICAgICAgc3RhY2sgPSBhcnJheVJlbW92ZShzdGFjaywgZm9jdXNTY29wZSk7XG4gICAgICBzdGFja1swXT8ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gYXJyYXlSZW1vdmUoYXJyYXksIGl0ZW0pIHtcbiAgY29uc3QgdXBkYXRlZEFycmF5ID0gWy4uLmFycmF5XTtcbiAgY29uc3QgaW5kZXggPSB1cGRhdGVkQXJyYXkuaW5kZXhPZihpdGVtKTtcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIHVwZGF0ZWRBcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHJldHVybiB1cGRhdGVkQXJyYXk7XG59XG5mdW5jdGlvbiByZW1vdmVMaW5rcyhpdGVtcykge1xuICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnRhZ05hbWUgIT09IFwiQVwiKTtcbn1cbnZhciBSb290ID0gRm9jdXNTY29wZTtcbmV4cG9ydCB7XG4gIEZvY3VzU2NvcGUsXG4gIFJvb3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC9pZC9zcmMvaWQudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3RcIjtcbnZhciB1c2VSZWFjdElkID0gUmVhY3RbXCJ1c2VJZFwiLnRvU3RyaW5nKCldIHx8ICgoKSA9PiB2b2lkIDApO1xudmFyIGNvdW50ID0gMDtcbmZ1bmN0aW9uIHVzZUlkKGRldGVybWluaXN0aWNJZCkge1xuICBjb25zdCBbaWQsIHNldElkXSA9IFJlYWN0LnVzZVN0YXRlKHVzZVJlYWN0SWQoKSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFkZXRlcm1pbmlzdGljSWQpIHNldElkKChyZWFjdElkKSA9PiByZWFjdElkID8/IFN0cmluZyhjb3VudCsrKSk7XG4gIH0sIFtkZXRlcm1pbmlzdGljSWRdKTtcbiAgcmV0dXJuIGRldGVybWluaXN0aWNJZCB8fCAoaWQgPyBgcmFkaXgtJHtpZH1gIDogXCJcIik7XG59XG5leHBvcnQge1xuICB1c2VJZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9tZW51L3NyYy9NZW51LnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjb21wb3NlRXZlbnRIYW5kbGVycyB9IGZyb20gXCJAcmFkaXgtdWkvcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyBjcmVhdGVDb2xsZWN0aW9uIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb2xsZWN0aW9uXCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMsIGNvbXBvc2VSZWZzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHRTY29wZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29udGV4dFwiO1xuaW1wb3J0IHsgdXNlRGlyZWN0aW9uIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1kaXJlY3Rpb25cIjtcbmltcG9ydCB7IERpc21pc3NhYmxlTGF5ZXIgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWRpc21pc3NhYmxlLWxheWVyXCI7XG5pbXBvcnQgeyB1c2VGb2N1c0d1YXJkcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtZm9jdXMtZ3VhcmRzXCI7XG5pbXBvcnQgeyBGb2N1c1Njb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1mb2N1cy1zY29wZVwiO1xuaW1wb3J0IHsgdXNlSWQgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWlkXCI7XG5pbXBvcnQgKiBhcyBQb3BwZXJQcmltaXRpdmUgZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wb3BwZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVBvcHBlclNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wb3BwZXJcIjtcbmltcG9ydCB7IFBvcnRhbCBhcyBQb3J0YWxQcmltaXRpdmUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXBvcnRhbFwiO1xuaW1wb3J0IHsgUHJlc2VuY2UgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXByZXNlbmNlXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUsIGRpc3BhdGNoRGlzY3JldGVDdXN0b21FdmVudCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgKiBhcyBSb3ZpbmdGb2N1c0dyb3VwIGZyb20gXCJAcmFkaXgtdWkvcmVhY3Qtcm92aW5nLWZvY3VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSb3ZpbmdGb2N1c0dyb3VwU2NvcGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXJvdmluZy1mb2N1c1wiO1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3Qtc2xvdFwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWZcIjtcbmltcG9ydCB7IGhpZGVPdGhlcnMgfSBmcm9tIFwiYXJpYS1oaWRkZW5cIjtcbmltcG9ydCB7IFJlbW92ZVNjcm9sbCB9IGZyb20gXCJyZWFjdC1yZW1vdmUtc2Nyb2xsXCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBTRUxFQ1RJT05fS0VZUyA9IFtcIkVudGVyXCIsIFwiIFwiXTtcbnZhciBGSVJTVF9LRVlTID0gW1wiQXJyb3dEb3duXCIsIFwiUGFnZVVwXCIsIFwiSG9tZVwiXTtcbnZhciBMQVNUX0tFWVMgPSBbXCJBcnJvd1VwXCIsIFwiUGFnZURvd25cIiwgXCJFbmRcIl07XG52YXIgRklSU1RfTEFTVF9LRVlTID0gWy4uLkZJUlNUX0tFWVMsIC4uLkxBU1RfS0VZU107XG52YXIgU1VCX09QRU5fS0VZUyA9IHtcbiAgbHRyOiBbLi4uU0VMRUNUSU9OX0tFWVMsIFwiQXJyb3dSaWdodFwiXSxcbiAgcnRsOiBbLi4uU0VMRUNUSU9OX0tFWVMsIFwiQXJyb3dMZWZ0XCJdXG59O1xudmFyIFNVQl9DTE9TRV9LRVlTID0ge1xuICBsdHI6IFtcIkFycm93TGVmdFwiXSxcbiAgcnRsOiBbXCJBcnJvd1JpZ2h0XCJdXG59O1xudmFyIE1FTlVfTkFNRSA9IFwiTWVudVwiO1xudmFyIFtDb2xsZWN0aW9uLCB1c2VDb2xsZWN0aW9uLCBjcmVhdGVDb2xsZWN0aW9uU2NvcGVdID0gY3JlYXRlQ29sbGVjdGlvbihNRU5VX05BTUUpO1xudmFyIFtjcmVhdGVNZW51Q29udGV4dCwgY3JlYXRlTWVudVNjb3BlXSA9IGNyZWF0ZUNvbnRleHRTY29wZShNRU5VX05BTUUsIFtcbiAgY3JlYXRlQ29sbGVjdGlvblNjb3BlLFxuICBjcmVhdGVQb3BwZXJTY29wZSxcbiAgY3JlYXRlUm92aW5nRm9jdXNHcm91cFNjb3BlXG5dKTtcbnZhciB1c2VQb3BwZXJTY29wZSA9IGNyZWF0ZVBvcHBlclNjb3BlKCk7XG52YXIgdXNlUm92aW5nRm9jdXNHcm91cFNjb3BlID0gY3JlYXRlUm92aW5nRm9jdXNHcm91cFNjb3BlKCk7XG52YXIgW01lbnVQcm92aWRlciwgdXNlTWVudUNvbnRleHRdID0gY3JlYXRlTWVudUNvbnRleHQoTUVOVV9OQU1FKTtcbnZhciBbTWVudVJvb3RQcm92aWRlciwgdXNlTWVudVJvb3RDb250ZXh0XSA9IGNyZWF0ZU1lbnVDb250ZXh0KE1FTlVfTkFNRSk7XG52YXIgTWVudSA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVNZW51LCBvcGVuID0gZmFsc2UsIGNoaWxkcmVuLCBkaXIsIG9uT3BlbkNoYW5nZSwgbW9kYWwgPSB0cnVlIH0gPSBwcm9wcztcbiAgY29uc3QgcG9wcGVyU2NvcGUgPSB1c2VQb3BwZXJTY29wZShfX3Njb3BlTWVudSk7XG4gIGNvbnN0IFtjb250ZW50LCBzZXRDb250ZW50XSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBpc1VzaW5nS2V5Ym9hcmRSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBoYW5kbGVPcGVuQ2hhbmdlID0gdXNlQ2FsbGJhY2tSZWYob25PcGVuQ2hhbmdlKTtcbiAgY29uc3QgZGlyZWN0aW9uID0gdXNlRGlyZWN0aW9uKGRpcik7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9ICgpID0+IHtcbiAgICAgIGlzVXNpbmdLZXlib2FyZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBoYW5kbGVQb2ludGVyLCB7IGNhcHR1cmU6IHRydWUsIG9uY2U6IHRydWUgfSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgaGFuZGxlUG9pbnRlciwgeyBjYXB0dXJlOiB0cnVlLCBvbmNlOiB0cnVlIH0pO1xuICAgIH07XG4gICAgY29uc3QgaGFuZGxlUG9pbnRlciA9ICgpID0+IGlzVXNpbmdLZXlib2FyZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93biwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgaGFuZGxlUG9pbnRlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIGhhbmRsZVBvaW50ZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFBvcHBlclByaW1pdGl2ZS5Sb290LCB7IC4uLnBvcHBlclNjb3BlLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICBNZW51UHJvdmlkZXIsXG4gICAge1xuICAgICAgc2NvcGU6IF9fc2NvcGVNZW51LFxuICAgICAgb3BlbixcbiAgICAgIG9uT3BlbkNoYW5nZTogaGFuZGxlT3BlbkNoYW5nZSxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBvbkNvbnRlbnRDaGFuZ2U6IHNldENvbnRlbnQsXG4gICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgTWVudVJvb3RQcm92aWRlcixcbiAgICAgICAge1xuICAgICAgICAgIHNjb3BlOiBfX3Njb3BlTWVudSxcbiAgICAgICAgICBvbkNsb3NlOiBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiBoYW5kbGVPcGVuQ2hhbmdlKGZhbHNlKSwgW2hhbmRsZU9wZW5DaGFuZ2VdKSxcbiAgICAgICAgICBpc1VzaW5nS2V5Ym9hcmRSZWYsXG4gICAgICAgICAgZGlyOiBkaXJlY3Rpb24sXG4gICAgICAgICAgbW9kYWwsXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgKSB9KTtcbn07XG5NZW51LmRpc3BsYXlOYW1lID0gTUVOVV9OQU1FO1xudmFyIEFOQ0hPUl9OQU1FID0gXCJNZW51QW5jaG9yXCI7XG52YXIgTWVudUFuY2hvciA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlTWVudSwgLi4uYW5jaG9yUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IHBvcHBlclNjb3BlID0gdXNlUG9wcGVyU2NvcGUoX19zY29wZU1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFBvcHBlclByaW1pdGl2ZS5BbmNob3IsIHsgLi4ucG9wcGVyU2NvcGUsIC4uLmFuY2hvclByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfVxuKTtcbk1lbnVBbmNob3IuZGlzcGxheU5hbWUgPSBBTkNIT1JfTkFNRTtcbnZhciBQT1JUQUxfTkFNRSA9IFwiTWVudVBvcnRhbFwiO1xudmFyIFtQb3J0YWxQcm92aWRlciwgdXNlUG9ydGFsQ29udGV4dF0gPSBjcmVhdGVNZW51Q29udGV4dChQT1JUQUxfTkFNRSwge1xuICBmb3JjZU1vdW50OiB2b2lkIDBcbn0pO1xudmFyIE1lbnVQb3J0YWwgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlTWVudSwgZm9yY2VNb3VudCwgY2hpbGRyZW4sIGNvbnRhaW5lciB9ID0gcHJvcHM7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VNZW51Q29udGV4dChQT1JUQUxfTkFNRSwgX19zY29wZU1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQb3J0YWxQcm92aWRlciwgeyBzY29wZTogX19zY29wZU1lbnUsIGZvcmNlTW91bnQsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFByZXNlbmNlLCB7IHByZXNlbnQ6IGZvcmNlTW91bnQgfHwgY29udGV4dC5vcGVuLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChQb3J0YWxQcmltaXRpdmUsIHsgYXNDaGlsZDogdHJ1ZSwgY29udGFpbmVyLCBjaGlsZHJlbiB9KSB9KSB9KTtcbn07XG5NZW51UG9ydGFsLmRpc3BsYXlOYW1lID0gUE9SVEFMX05BTUU7XG52YXIgQ09OVEVOVF9OQU1FID0gXCJNZW51Q29udGVudFwiO1xudmFyIFtNZW51Q29udGVudFByb3ZpZGVyLCB1c2VNZW51Q29udGVudENvbnRleHRdID0gY3JlYXRlTWVudUNvbnRleHQoQ09OVEVOVF9OQU1FKTtcbnZhciBNZW51Q29udGVudCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgcG9ydGFsQ29udGV4dCA9IHVzZVBvcnRhbENvbnRleHQoQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3QgeyBmb3JjZU1vdW50ID0gcG9ydGFsQ29udGV4dC5mb3JjZU1vdW50LCAuLi5jb250ZW50UHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VNZW51Q29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByb290Q29udGV4dCA9IHVzZU1lbnVSb290Q29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb2xsZWN0aW9uLlByb3ZpZGVyLCB7IHNjb3BlOiBwcm9wcy5fX3Njb3BlTWVudSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goUHJlc2VuY2UsIHsgcHJlc2VudDogZm9yY2VNb3VudCB8fCBjb250ZXh0Lm9wZW4sIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KENvbGxlY3Rpb24uU2xvdCwgeyBzY29wZTogcHJvcHMuX19zY29wZU1lbnUsIGNoaWxkcmVuOiByb290Q29udGV4dC5tb2RhbCA/IC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVJvb3RDb250ZW50TW9kYWwsIHsgLi4uY29udGVudFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KSA6IC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVJvb3RDb250ZW50Tm9uTW9kYWwsIHsgLi4uY29udGVudFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KSB9KSB9KSB9KTtcbiAgfVxuKTtcbnZhciBNZW51Um9vdENvbnRlbnRNb2RhbCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZU1lbnVDb250ZXh0KENPTlRFTlRfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZW50ID0gcmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoY29udGVudCkgcmV0dXJuIGhpZGVPdGhlcnMoY29udGVudCk7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudUNvbnRlbnRJbXBsLFxuICAgICAge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgIHRyYXBGb2N1czogY29udGV4dC5vcGVuLFxuICAgICAgICBkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6IGNvbnRleHQub3BlbixcbiAgICAgICAgZGlzYWJsZU91dHNpZGVTY3JvbGw6IHRydWUsXG4gICAgICAgIG9uRm9jdXNPdXRzaWRlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICBwcm9wcy5vbkZvY3VzT3V0c2lkZSxcbiAgICAgICAgICAoZXZlbnQpID0+IGV2ZW50LnByZXZlbnREZWZhdWx0KCksXG4gICAgICAgICAgeyBjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25EaXNtaXNzOiAoKSA9PiBjb250ZXh0Lm9uT3BlbkNoYW5nZShmYWxzZSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xudmFyIE1lbnVSb290Q29udGVudE5vbk1vZGFsID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlTWVudUNvbnRleHQoQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgIE1lbnVDb250ZW50SW1wbCxcbiAgICB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgdHJhcEZvY3VzOiBmYWxzZSxcbiAgICAgIGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czogZmFsc2UsXG4gICAgICBkaXNhYmxlT3V0c2lkZVNjcm9sbDogZmFsc2UsXG4gICAgICBvbkRpc21pc3M6ICgpID0+IGNvbnRleHQub25PcGVuQ2hhbmdlKGZhbHNlKVxuICAgIH1cbiAgKTtcbn0pO1xudmFyIE1lbnVDb250ZW50SW1wbCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgX19zY29wZU1lbnUsXG4gICAgICBsb29wID0gZmFsc2UsXG4gICAgICB0cmFwRm9jdXMsXG4gICAgICBvbk9wZW5BdXRvRm9jdXMsXG4gICAgICBvbkNsb3NlQXV0b0ZvY3VzLFxuICAgICAgZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzLFxuICAgICAgb25FbnRyeUZvY3VzLFxuICAgICAgb25Fc2NhcGVLZXlEb3duLFxuICAgICAgb25Qb2ludGVyRG93bk91dHNpZGUsXG4gICAgICBvbkZvY3VzT3V0c2lkZSxcbiAgICAgIG9uSW50ZXJhY3RPdXRzaWRlLFxuICAgICAgb25EaXNtaXNzLFxuICAgICAgZGlzYWJsZU91dHNpZGVTY3JvbGwsXG4gICAgICAuLi5jb250ZW50UHJvcHNcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZU1lbnVDb250ZXh0KENPTlRFTlRfTkFNRSwgX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gdXNlTWVudVJvb3RDb250ZXh0KENPTlRFTlRfTkFNRSwgX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHBvcHBlclNjb3BlID0gdXNlUG9wcGVyU2NvcGUoX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJvdmluZ0ZvY3VzR3JvdXBTY29wZSA9IHVzZVJvdmluZ0ZvY3VzR3JvdXBTY29wZShfX3Njb3BlTWVudSk7XG4gICAgY29uc3QgZ2V0SXRlbXMgPSB1c2VDb2xsZWN0aW9uKF9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBbY3VycmVudEl0ZW1JZCwgc2V0Q3VycmVudEl0ZW1JZF0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBjb250ZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIGNvbnRlbnRSZWYsIGNvbnRleHQub25Db250ZW50Q2hhbmdlKTtcbiAgICBjb25zdCB0aW1lclJlZiA9IFJlYWN0LnVzZVJlZigwKTtcbiAgICBjb25zdCBzZWFyY2hSZWYgPSBSZWFjdC51c2VSZWYoXCJcIik7XG4gICAgY29uc3QgcG9pbnRlckdyYWNlVGltZXJSZWYgPSBSZWFjdC51c2VSZWYoMCk7XG4gICAgY29uc3QgcG9pbnRlckdyYWNlSW50ZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHBvaW50ZXJEaXJSZWYgPSBSZWFjdC51c2VSZWYoXCJyaWdodFwiKTtcbiAgICBjb25zdCBsYXN0UG9pbnRlclhSZWYgPSBSZWFjdC51c2VSZWYoMCk7XG4gICAgY29uc3QgU2Nyb2xsTG9ja1dyYXBwZXIgPSBkaXNhYmxlT3V0c2lkZVNjcm9sbCA/IFJlbW92ZVNjcm9sbCA6IFJlYWN0LkZyYWdtZW50O1xuICAgIGNvbnN0IHNjcm9sbExvY2tXcmFwcGVyUHJvcHMgPSBkaXNhYmxlT3V0c2lkZVNjcm9sbCA/IHsgYXM6IFNsb3QsIGFsbG93UGluY2hab29tOiB0cnVlIH0gOiB2b2lkIDA7XG4gICAgY29uc3QgaGFuZGxlVHlwZWFoZWFkU2VhcmNoID0gKGtleSkgPT4ge1xuICAgICAgY29uc3Qgc2VhcmNoID0gc2VhcmNoUmVmLmN1cnJlbnQgKyBrZXk7XG4gICAgICBjb25zdCBpdGVtcyA9IGdldEl0ZW1zKCkuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5kaXNhYmxlZCk7XG4gICAgICBjb25zdCBjdXJyZW50SXRlbSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBjdXJyZW50TWF0Y2ggPSBpdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLnJlZi5jdXJyZW50ID09PSBjdXJyZW50SXRlbSk/LnRleHRWYWx1ZTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS50ZXh0VmFsdWUpO1xuICAgICAgY29uc3QgbmV4dE1hdGNoID0gZ2V0TmV4dE1hdGNoKHZhbHVlcywgc2VhcmNoLCBjdXJyZW50TWF0Y2gpO1xuICAgICAgY29uc3QgbmV3SXRlbSA9IGl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0udGV4dFZhbHVlID09PSBuZXh0TWF0Y2gpPy5yZWYuY3VycmVudDtcbiAgICAgIChmdW5jdGlvbiB1cGRhdGVTZWFyY2godmFsdWUpIHtcbiAgICAgICAgc2VhcmNoUmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lclJlZi5jdXJyZW50KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBcIlwiKSB0aW1lclJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdXBkYXRlU2VhcmNoKFwiXCIpLCAxZTMpO1xuICAgICAgfSkoc2VhcmNoKTtcbiAgICAgIGlmIChuZXdJdGVtKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gbmV3SXRlbS5mb2N1cygpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICByZXR1cm4gKCkgPT4gd2luZG93LmNsZWFyVGltZW91dCh0aW1lclJlZi5jdXJyZW50KTtcbiAgICB9LCBbXSk7XG4gICAgdXNlRm9jdXNHdWFyZHMoKTtcbiAgICBjb25zdCBpc1BvaW50ZXJNb3ZpbmdUb1N1Ym1lbnUgPSBSZWFjdC51c2VDYWxsYmFjaygoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGlzTW92aW5nVG93YXJkcyA9IHBvaW50ZXJEaXJSZWYuY3VycmVudCA9PT0gcG9pbnRlckdyYWNlSW50ZW50UmVmLmN1cnJlbnQ/LnNpZGU7XG4gICAgICByZXR1cm4gaXNNb3ZpbmdUb3dhcmRzICYmIGlzUG9pbnRlckluR3JhY2VBcmVhKGV2ZW50LCBwb2ludGVyR3JhY2VJbnRlbnRSZWYuY3VycmVudD8uYXJlYSk7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudUNvbnRlbnRQcm92aWRlcixcbiAgICAgIHtcbiAgICAgICAgc2NvcGU6IF9fc2NvcGVNZW51LFxuICAgICAgICBzZWFyY2hSZWYsXG4gICAgICAgIG9uSXRlbUVudGVyOiBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1BvaW50ZXJNb3ZpbmdUb1N1Ym1lbnUoZXZlbnQpKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW2lzUG9pbnRlck1vdmluZ1RvU3VibWVudV1cbiAgICAgICAgKSxcbiAgICAgICAgb25JdGVtTGVhdmU6IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgICAgICAgIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzUG9pbnRlck1vdmluZ1RvU3VibWVudShldmVudCkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnRlbnRSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICAgICAgICAgIHNldEN1cnJlbnRJdGVtSWQobnVsbCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbaXNQb2ludGVyTW92aW5nVG9TdWJtZW51XVxuICAgICAgICApLFxuICAgICAgICBvblRyaWdnZXJMZWF2ZTogUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNQb2ludGVyTW92aW5nVG9TdWJtZW51KGV2ZW50KSkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtpc1BvaW50ZXJNb3ZpbmdUb1N1Ym1lbnVdXG4gICAgICAgICksXG4gICAgICAgIHBvaW50ZXJHcmFjZVRpbWVyUmVmLFxuICAgICAgICBvblBvaW50ZXJHcmFjZUludGVudENoYW5nZTogUmVhY3QudXNlQ2FsbGJhY2soKGludGVudCkgPT4ge1xuICAgICAgICAgIHBvaW50ZXJHcmFjZUludGVudFJlZi5jdXJyZW50ID0gaW50ZW50O1xuICAgICAgICB9LCBbXSksXG4gICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFNjcm9sbExvY2tXcmFwcGVyLCB7IC4uLnNjcm9sbExvY2tXcmFwcGVyUHJvcHMsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgIEZvY3VzU2NvcGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXNDaGlsZDogdHJ1ZSxcbiAgICAgICAgICAgIHRyYXBwZWQ6IHRyYXBGb2N1cyxcbiAgICAgICAgICAgIG9uTW91bnRBdXRvRm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uT3BlbkF1dG9Gb2N1cywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGNvbnRlbnRSZWYuY3VycmVudD8uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBvblVubW91bnRBdXRvRm9jdXM6IG9uQ2xvc2VBdXRvRm9jdXMsXG4gICAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICAgICAgRGlzbWlzc2FibGVMYXllcixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFzQ2hpbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzLFxuICAgICAgICAgICAgICAgIG9uRXNjYXBlS2V5RG93bixcbiAgICAgICAgICAgICAgICBvblBvaW50ZXJEb3duT3V0c2lkZSxcbiAgICAgICAgICAgICAgICBvbkZvY3VzT3V0c2lkZSxcbiAgICAgICAgICAgICAgICBvbkludGVyYWN0T3V0c2lkZSxcbiAgICAgICAgICAgICAgICBvbkRpc21pc3MsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgICAgICAgICBSb3ZpbmdGb2N1c0dyb3VwLlJvb3QsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFzQ2hpbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIC4uLnJvdmluZ0ZvY3VzR3JvdXBTY29wZSxcbiAgICAgICAgICAgICAgICAgICAgZGlyOiByb290Q29udGV4dC5kaXIsXG4gICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiBcInZlcnRpY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIGxvb3AsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWJTdG9wSWQ6IGN1cnJlbnRJdGVtSWQsXG4gICAgICAgICAgICAgICAgICAgIG9uQ3VycmVudFRhYlN0b3BJZENoYW5nZTogc2V0Q3VycmVudEl0ZW1JZCxcbiAgICAgICAgICAgICAgICAgICAgb25FbnRyeUZvY3VzOiBjb21wb3NlRXZlbnRIYW5kbGVycyhvbkVudHJ5Rm9jdXMsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghcm9vdENvbnRleHQuaXNVc2luZ0tleWJvYXJkUmVmLmN1cnJlbnQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsT25FbnRyeUZvY3VzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICAgICAgICAgICAgICBQb3BwZXJQcmltaXRpdmUuQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlOiBcIm1lbnVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRhdGEtc3RhdGVcIjogZ2V0T3BlblN0YXRlKGNvbnRleHQub3BlbiksXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRhdGEtcmFkaXgtbWVudS1jb250ZW50XCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXI6IHJvb3RDb250ZXh0LmRpcixcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBvcHBlclNjb3BlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29udGVudFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeyBvdXRsaW5lOiBcIm5vbmVcIiwgLi4uY29udGVudFByb3BzLnN0eWxlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBvbktleURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKGNvbnRlbnRQcm9wcy5vbktleURvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzS2V5RG93bkluc2lkZSA9IHRhcmdldC5jbG9zZXN0KFwiW2RhdGEtcmFkaXgtbWVudS1jb250ZW50XVwiKSA9PT0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNNb2RpZmllcktleSA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50Lm1ldGFLZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ2hhcmFjdGVyS2V5ID0gZXZlbnQua2V5Lmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzS2V5RG93bkluc2lkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IFwiVGFiXCIpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc01vZGlmaWVyS2V5ICYmIGlzQ2hhcmFjdGVyS2V5KSBoYW5kbGVUeXBlYWhlYWRTZWFyY2goZXZlbnQua2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gY29udGVudFJlZi5jdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBjb250ZW50KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRklSU1RfTEFTVF9LRVlTLmluY2x1ZGVzKGV2ZW50LmtleSkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRJdGVtcygpLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uZGlzYWJsZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVOb2RlcyA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5yZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMQVNUX0tFWVMuaW5jbHVkZXMoZXZlbnQua2V5KSkgY2FuZGlkYXRlTm9kZXMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c0ZpcnN0KGNhbmRpZGF0ZU5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25CbHVyOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkJsdXIsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LmN1cnJlbnRUYXJnZXQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVmLmN1cnJlbnQgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uUG9pbnRlck1vdmU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5vblBvaW50ZXJNb3ZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuTW91c2UoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50ZXJYSGFzQ2hhbmdlZCA9IGxhc3RQb2ludGVyWFJlZi5jdXJyZW50ICE9PSBldmVudC5jbGllbnRYO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0LmNvbnRhaW5zKHRhcmdldCkgJiYgcG9pbnRlclhIYXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdEaXIgPSBldmVudC5jbGllbnRYID4gbGFzdFBvaW50ZXJYUmVmLmN1cnJlbnQgPyBcInJpZ2h0XCIgOiBcImxlZnRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJEaXJSZWYuY3VycmVudCA9IG5ld0RpcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQb2ludGVyWFJlZi5jdXJyZW50ID0gZXZlbnQuY2xpZW50WDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICApIH0pXG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcbk1lbnVDb250ZW50LmRpc3BsYXlOYW1lID0gQ09OVEVOVF9OQU1FO1xudmFyIEdST1VQX05BTUUgPSBcIk1lbnVHcm91cFwiO1xudmFyIE1lbnVHcm91cCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlTWVudSwgLi4uZ3JvdXBQcm9wcyB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUHJpbWl0aXZlLmRpdiwgeyByb2xlOiBcImdyb3VwXCIsIC4uLmdyb3VwUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9XG4pO1xuTWVudUdyb3VwLmRpc3BsYXlOYW1lID0gR1JPVVBfTkFNRTtcbnZhciBMQUJFTF9OQU1FID0gXCJNZW51TGFiZWxcIjtcbnZhciBNZW51TGFiZWwgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZU1lbnUsIC4uLmxhYmVsUHJvcHMgfSA9IHByb3BzO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFByaW1pdGl2ZS5kaXYsIHsgLi4ubGFiZWxQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH1cbik7XG5NZW51TGFiZWwuZGlzcGxheU5hbWUgPSBMQUJFTF9OQU1FO1xudmFyIElURU1fTkFNRSA9IFwiTWVudUl0ZW1cIjtcbnZhciBJVEVNX1NFTEVDVCA9IFwibWVudS5pdGVtU2VsZWN0XCI7XG52YXIgTWVudUl0ZW0gPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgZGlzYWJsZWQgPSBmYWxzZSwgb25TZWxlY3QsIC4uLml0ZW1Qcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gdXNlTWVudVJvb3RDb250ZXh0KElURU1fTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IGNvbnRlbnRDb250ZXh0ID0gdXNlTWVudUNvbnRlbnRDb250ZXh0KElURU1fTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIHJlZik7XG4gICAgY29uc3QgaXNQb2ludGVyRG93blJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gICAgY29uc3QgaGFuZGxlU2VsZWN0ID0gKCkgPT4ge1xuICAgICAgY29uc3QgbWVudUl0ZW0gPSByZWYuY3VycmVudDtcbiAgICAgIGlmICghZGlzYWJsZWQgJiYgbWVudUl0ZW0pIHtcbiAgICAgICAgY29uc3QgaXRlbVNlbGVjdEV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KElURU1fU0VMRUNULCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgIG1lbnVJdGVtLmFkZEV2ZW50TGlzdGVuZXIoSVRFTV9TRUxFQ1QsIChldmVudCkgPT4gb25TZWxlY3Q/LihldmVudCksIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgZGlzcGF0Y2hEaXNjcmV0ZUN1c3RvbUV2ZW50KG1lbnVJdGVtLCBpdGVtU2VsZWN0RXZlbnQpO1xuICAgICAgICBpZiAoaXRlbVNlbGVjdEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICBpc1BvaW50ZXJEb3duUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByb290Q29udGV4dC5vbkNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudUl0ZW1JbXBsLFxuICAgICAge1xuICAgICAgICAuLi5pdGVtUHJvcHMsXG4gICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgb25DbGljazogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25DbGljaywgaGFuZGxlU2VsZWN0KSxcbiAgICAgICAgb25Qb2ludGVyRG93bjogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgcHJvcHMub25Qb2ludGVyRG93bj8uKGV2ZW50KTtcbiAgICAgICAgICBpc1BvaW50ZXJEb3duUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvblBvaW50ZXJVcDogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Qb2ludGVyVXAsIChldmVudCkgPT4ge1xuICAgICAgICAgIGlmICghaXNQb2ludGVyRG93blJlZi5jdXJyZW50KSBldmVudC5jdXJyZW50VGFyZ2V0Py5jbGljaygpO1xuICAgICAgICB9KSxcbiAgICAgICAgb25LZXlEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbktleURvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzVHlwaW5nQWhlYWQgPSBjb250ZW50Q29udGV4dC5zZWFyY2hSZWYuY3VycmVudCAhPT0gXCJcIjtcbiAgICAgICAgICBpZiAoZGlzYWJsZWQgfHwgaXNUeXBpbmdBaGVhZCAmJiBldmVudC5rZXkgPT09IFwiIFwiKSByZXR1cm47XG4gICAgICAgICAgaWYgKFNFTEVDVElPTl9LRVlTLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgICAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xpY2soKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5NZW51SXRlbS5kaXNwbGF5TmFtZSA9IElURU1fTkFNRTtcbnZhciBNZW51SXRlbUltcGwgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZU1lbnUsIGRpc2FibGVkID0gZmFsc2UsIHRleHRWYWx1ZSwgLi4uaXRlbVByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IHVzZU1lbnVDb250ZW50Q29udGV4dChJVEVNX05BTUUsIF9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByb3ZpbmdGb2N1c0dyb3VwU2NvcGUgPSB1c2VSb3ZpbmdGb2N1c0dyb3VwU2NvcGUoX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICAgIGNvbnN0IFtpc0ZvY3VzZWQsIHNldElzRm9jdXNlZF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW3RleHRDb250ZW50LCBzZXRUZXh0Q29udGVudF0gPSBSZWFjdC51c2VTdGF0ZShcIlwiKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgbWVudUl0ZW0gPSByZWYuY3VycmVudDtcbiAgICAgIGlmIChtZW51SXRlbSkge1xuICAgICAgICBzZXRUZXh0Q29udGVudCgobWVudUl0ZW0udGV4dENvbnRlbnQgPz8gXCJcIikudHJpbSgpKTtcbiAgICAgIH1cbiAgICB9LCBbaXRlbVByb3BzLmNoaWxkcmVuXSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBDb2xsZWN0aW9uLkl0ZW1TbG90LFxuICAgICAge1xuICAgICAgICBzY29wZTogX19zY29wZU1lbnUsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICB0ZXh0VmFsdWU6IHRleHRWYWx1ZSA/PyB0ZXh0Q29udGVudCxcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goUm92aW5nRm9jdXNHcm91cC5JdGVtLCB7IGFzQ2hpbGQ6IHRydWUsIC4uLnJvdmluZ0ZvY3VzR3JvdXBTY29wZSwgZm9jdXNhYmxlOiAhZGlzYWJsZWQsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgIFByaW1pdGl2ZS5kaXYsXG4gICAgICAgICAge1xuICAgICAgICAgICAgcm9sZTogXCJtZW51aXRlbVwiLFxuICAgICAgICAgICAgXCJkYXRhLWhpZ2hsaWdodGVkXCI6IGlzRm9jdXNlZCA/IFwiXCIgOiB2b2lkIDAsXG4gICAgICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogZGlzYWJsZWQgfHwgdm9pZCAwLFxuICAgICAgICAgICAgXCJkYXRhLWRpc2FibGVkXCI6IGRpc2FibGVkID8gXCJcIiA6IHZvaWQgMCxcbiAgICAgICAgICAgIC4uLml0ZW1Qcm9wcyxcbiAgICAgICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICAgICAgb25Qb2ludGVyTW92ZTogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgICAgIHByb3BzLm9uUG9pbnRlck1vdmUsXG4gICAgICAgICAgICAgIHdoZW5Nb3VzZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnRDb250ZXh0Lm9uSXRlbUxlYXZlKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29udGVudENvbnRleHQub25JdGVtRW50ZXIoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgb25Qb2ludGVyTGVhdmU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKFxuICAgICAgICAgICAgICBwcm9wcy5vblBvaW50ZXJMZWF2ZSxcbiAgICAgICAgICAgICAgd2hlbk1vdXNlKChldmVudCkgPT4gY29udGVudENvbnRleHQub25JdGVtTGVhdmUoZXZlbnQpKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG9uRm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uRm9jdXMsICgpID0+IHNldElzRm9jdXNlZCh0cnVlKSksXG4gICAgICAgICAgICBvbkJsdXI6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uQmx1ciwgKCkgPT4gc2V0SXNGb2N1c2VkKGZhbHNlKSlcbiAgICAgICAgICB9XG4gICAgICAgICkgfSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xudmFyIENIRUNLQk9YX0lURU1fTkFNRSA9IFwiTWVudUNoZWNrYm94SXRlbVwiO1xudmFyIE1lbnVDaGVja2JveEl0ZW0gPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgY2hlY2tlZCA9IGZhbHNlLCBvbkNoZWNrZWRDaGFuZ2UsIC4uLmNoZWNrYm94SXRlbVByb3BzIH0gPSBwcm9wcztcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChJdGVtSW5kaWNhdG9yUHJvdmlkZXIsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVNZW51LCBjaGVja2VkLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIE1lbnVJdGVtLFxuICAgICAge1xuICAgICAgICByb2xlOiBcIm1lbnVpdGVtY2hlY2tib3hcIixcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjogaXNJbmRldGVybWluYXRlKGNoZWNrZWQpID8gXCJtaXhlZFwiIDogY2hlY2tlZCxcbiAgICAgICAgLi4uY2hlY2tib3hJdGVtUHJvcHMsXG4gICAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgICBcImRhdGEtc3RhdGVcIjogZ2V0Q2hlY2tlZFN0YXRlKGNoZWNrZWQpLFxuICAgICAgICBvblNlbGVjdDogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgY2hlY2tib3hJdGVtUHJvcHMub25TZWxlY3QsXG4gICAgICAgICAgKCkgPT4gb25DaGVja2VkQ2hhbmdlPy4oaXNJbmRldGVybWluYXRlKGNoZWNrZWQpID8gdHJ1ZSA6ICFjaGVja2VkKSxcbiAgICAgICAgICB7IGNoZWNrRm9yRGVmYXVsdFByZXZlbnRlZDogZmFsc2UgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgKSB9KTtcbiAgfVxuKTtcbk1lbnVDaGVja2JveEl0ZW0uZGlzcGxheU5hbWUgPSBDSEVDS0JPWF9JVEVNX05BTUU7XG52YXIgUkFESU9fR1JPVVBfTkFNRSA9IFwiTWVudVJhZGlvR3JvdXBcIjtcbnZhciBbUmFkaW9Hcm91cFByb3ZpZGVyLCB1c2VSYWRpb0dyb3VwQ29udGV4dF0gPSBjcmVhdGVNZW51Q29udGV4dChcbiAgUkFESU9fR1JPVVBfTkFNRSxcbiAgeyB2YWx1ZTogdm9pZCAwLCBvblZhbHVlQ2hhbmdlOiAoKSA9PiB7XG4gIH0gfVxuKTtcbnZhciBNZW51UmFkaW9Hcm91cCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZSwgb25WYWx1ZUNoYW5nZSwgLi4uZ3JvdXBQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgaGFuZGxlVmFsdWVDaGFuZ2UgPSB1c2VDYWxsYmFja1JlZihvblZhbHVlQ2hhbmdlKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChSYWRpb0dyb3VwUHJvdmlkZXIsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVNZW51LCB2YWx1ZSwgb25WYWx1ZUNoYW5nZTogaGFuZGxlVmFsdWVDaGFuZ2UsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVHcm91cCwgeyAuLi5ncm91cFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KSB9KTtcbiAgfVxuKTtcbk1lbnVSYWRpb0dyb3VwLmRpc3BsYXlOYW1lID0gUkFESU9fR1JPVVBfTkFNRTtcbnZhciBSQURJT19JVEVNX05BTUUgPSBcIk1lbnVSYWRpb0l0ZW1cIjtcbnZhciBNZW51UmFkaW9JdGVtID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IHZhbHVlLCAuLi5yYWRpb0l0ZW1Qcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZVJhZGlvR3JvdXBDb250ZXh0KFJBRElPX0lURU1fTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IGNoZWNrZWQgPSB2YWx1ZSA9PT0gY29udGV4dC52YWx1ZTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChJdGVtSW5kaWNhdG9yUHJvdmlkZXIsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVNZW51LCBjaGVja2VkLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIE1lbnVJdGVtLFxuICAgICAge1xuICAgICAgICByb2xlOiBcIm1lbnVpdGVtcmFkaW9cIixcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjogY2hlY2tlZCxcbiAgICAgICAgLi4ucmFkaW9JdGVtUHJvcHMsXG4gICAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgICBcImRhdGEtc3RhdGVcIjogZ2V0Q2hlY2tlZFN0YXRlKGNoZWNrZWQpLFxuICAgICAgICBvblNlbGVjdDogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgcmFkaW9JdGVtUHJvcHMub25TZWxlY3QsXG4gICAgICAgICAgKCkgPT4gY29udGV4dC5vblZhbHVlQ2hhbmdlPy4odmFsdWUpLFxuICAgICAgICAgIHsgY2hlY2tGb3JEZWZhdWx0UHJldmVudGVkOiBmYWxzZSB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICApIH0pO1xuICB9XG4pO1xuTWVudVJhZGlvSXRlbS5kaXNwbGF5TmFtZSA9IFJBRElPX0lURU1fTkFNRTtcbnZhciBJVEVNX0lORElDQVRPUl9OQU1FID0gXCJNZW51SXRlbUluZGljYXRvclwiO1xudmFyIFtJdGVtSW5kaWNhdG9yUHJvdmlkZXIsIHVzZUl0ZW1JbmRpY2F0b3JDb250ZXh0XSA9IGNyZWF0ZU1lbnVDb250ZXh0KFxuICBJVEVNX0lORElDQVRPUl9OQU1FLFxuICB7IGNoZWNrZWQ6IGZhbHNlIH1cbik7XG52YXIgTWVudUl0ZW1JbmRpY2F0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZU1lbnUsIGZvcmNlTW91bnQsIC4uLml0ZW1JbmRpY2F0b3JQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgaW5kaWNhdG9yQ29udGV4dCA9IHVzZUl0ZW1JbmRpY2F0b3JDb250ZXh0KElURU1fSU5ESUNBVE9SX05BTUUsIF9fc2NvcGVNZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIFByZXNlbmNlLFxuICAgICAge1xuICAgICAgICBwcmVzZW50OiBmb3JjZU1vdW50IHx8IGlzSW5kZXRlcm1pbmF0ZShpbmRpY2F0b3JDb250ZXh0LmNoZWNrZWQpIHx8IGluZGljYXRvckNvbnRleHQuY2hlY2tlZCA9PT0gdHJ1ZSxcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgUHJpbWl0aXZlLnNwYW4sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uaXRlbUluZGljYXRvclByb3BzLFxuICAgICAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICAgICAgICBcImRhdGEtc3RhdGVcIjogZ2V0Q2hlY2tlZFN0YXRlKGluZGljYXRvckNvbnRleHQuY2hlY2tlZClcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xuTWVudUl0ZW1JbmRpY2F0b3IuZGlzcGxheU5hbWUgPSBJVEVNX0lORElDQVRPUl9OQU1FO1xudmFyIFNFUEFSQVRPUl9OQU1FID0gXCJNZW51U2VwYXJhdG9yXCI7XG52YXIgTWVudVNlcGFyYXRvciA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlTWVudSwgLi4uc2VwYXJhdG9yUHJvcHMgfSA9IHByb3BzO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgUHJpbWl0aXZlLmRpdixcbiAgICAgIHtcbiAgICAgICAgcm9sZTogXCJzZXBhcmF0b3JcIixcbiAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAuLi5zZXBhcmF0b3JQcm9wcyxcbiAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWZcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xuTWVudVNlcGFyYXRvci5kaXNwbGF5TmFtZSA9IFNFUEFSQVRPUl9OQU1FO1xudmFyIEFSUk9XX05BTUUgPSBcIk1lbnVBcnJvd1wiO1xudmFyIE1lbnVBcnJvdyA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlTWVudSwgLi4uYXJyb3dQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgcG9wcGVyU2NvcGUgPSB1c2VQb3BwZXJTY29wZShfX3Njb3BlTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUG9wcGVyUHJpbWl0aXZlLkFycm93LCB7IC4uLnBvcHBlclNjb3BlLCAuLi5hcnJvd1Byb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfVxuKTtcbk1lbnVBcnJvdy5kaXNwbGF5TmFtZSA9IEFSUk9XX05BTUU7XG52YXIgU1VCX05BTUUgPSBcIk1lbnVTdWJcIjtcbnZhciBbTWVudVN1YlByb3ZpZGVyLCB1c2VNZW51U3ViQ29udGV4dF0gPSBjcmVhdGVNZW51Q29udGV4dChTVUJfTkFNRSk7XG52YXIgTWVudVN1YiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVNZW51LCBjaGlsZHJlbiwgb3BlbiA9IGZhbHNlLCBvbk9wZW5DaGFuZ2UgfSA9IHByb3BzO1xuICBjb25zdCBwYXJlbnRNZW51Q29udGV4dCA9IHVzZU1lbnVDb250ZXh0KFNVQl9OQU1FLCBfX3Njb3BlTWVudSk7XG4gIGNvbnN0IHBvcHBlclNjb3BlID0gdXNlUG9wcGVyU2NvcGUoX19zY29wZU1lbnUpO1xuICBjb25zdCBbdHJpZ2dlciwgc2V0VHJpZ2dlcl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2NvbnRlbnQsIHNldENvbnRlbnRdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IGhhbmRsZU9wZW5DaGFuZ2UgPSB1c2VDYWxsYmFja1JlZihvbk9wZW5DaGFuZ2UpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwYXJlbnRNZW51Q29udGV4dC5vcGVuID09PSBmYWxzZSkgaGFuZGxlT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgcmV0dXJuICgpID0+IGhhbmRsZU9wZW5DaGFuZ2UoZmFsc2UpO1xuICB9LCBbcGFyZW50TWVudUNvbnRleHQub3BlbiwgaGFuZGxlT3BlbkNoYW5nZV0pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQb3BwZXJQcmltaXRpdmUuUm9vdCwgeyAuLi5wb3BwZXJTY29wZSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgTWVudVByb3ZpZGVyLFxuICAgIHtcbiAgICAgIHNjb3BlOiBfX3Njb3BlTWVudSxcbiAgICAgIG9wZW4sXG4gICAgICBvbk9wZW5DaGFuZ2U6IGhhbmRsZU9wZW5DaGFuZ2UsXG4gICAgICBjb250ZW50LFxuICAgICAgb25Db250ZW50Q2hhbmdlOiBzZXRDb250ZW50LFxuICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgIE1lbnVTdWJQcm92aWRlcixcbiAgICAgICAge1xuICAgICAgICAgIHNjb3BlOiBfX3Njb3BlTWVudSxcbiAgICAgICAgICBjb250ZW50SWQ6IHVzZUlkKCksXG4gICAgICAgICAgdHJpZ2dlcklkOiB1c2VJZCgpLFxuICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgb25UcmlnZ2VyQ2hhbmdlOiBzZXRUcmlnZ2VyLFxuICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gICkgfSk7XG59O1xuTWVudVN1Yi5kaXNwbGF5TmFtZSA9IFNVQl9OQU1FO1xudmFyIFNVQl9UUklHR0VSX05BTUUgPSBcIk1lbnVTdWJUcmlnZ2VyXCI7XG52YXIgTWVudVN1YlRyaWdnZXIgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VNZW51Q29udGV4dChTVUJfVFJJR0dFUl9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3Qgcm9vdENvbnRleHQgPSB1c2VNZW51Um9vdENvbnRleHQoU1VCX1RSSUdHRVJfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHN1YkNvbnRleHQgPSB1c2VNZW51U3ViQ29udGV4dChTVUJfVFJJR0dFUl9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3QgY29udGVudENvbnRleHQgPSB1c2VNZW51Q29udGVudENvbnRleHQoU1VCX1RSSUdHRVJfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IG9wZW5UaW1lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCB7IHBvaW50ZXJHcmFjZVRpbWVyUmVmLCBvblBvaW50ZXJHcmFjZUludGVudENoYW5nZSB9ID0gY29udGVudENvbnRleHQ7XG4gICAgY29uc3Qgc2NvcGUgPSB7IF9fc2NvcGVNZW51OiBwcm9wcy5fX3Njb3BlTWVudSB9O1xuICAgIGNvbnN0IGNsZWFyT3BlblRpbWVyID0gUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgaWYgKG9wZW5UaW1lclJlZi5jdXJyZW50KSB3aW5kb3cuY2xlYXJUaW1lb3V0KG9wZW5UaW1lclJlZi5jdXJyZW50KTtcbiAgICAgIG9wZW5UaW1lclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9LCBbXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IGNsZWFyT3BlblRpbWVyLCBbY2xlYXJPcGVuVGltZXJdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnRlckdyYWNlVGltZXIgPSBwb2ludGVyR3JhY2VUaW1lclJlZi5jdXJyZW50O1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChwb2ludGVyR3JhY2VUaW1lcik7XG4gICAgICAgIG9uUG9pbnRlckdyYWNlSW50ZW50Q2hhbmdlKG51bGwpO1xuICAgICAgfTtcbiAgICB9LCBbcG9pbnRlckdyYWNlVGltZXJSZWYsIG9uUG9pbnRlckdyYWNlSW50ZW50Q2hhbmdlXSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudUFuY2hvciwgeyBhc0NoaWxkOiB0cnVlLCAuLi5zY29wZSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBNZW51SXRlbUltcGwsXG4gICAgICB7XG4gICAgICAgIGlkOiBzdWJDb250ZXh0LnRyaWdnZXJJZCxcbiAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibWVudVwiLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogY29udGV4dC5vcGVuLFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjogc3ViQ29udGV4dC5jb250ZW50SWQsXG4gICAgICAgIFwiZGF0YS1zdGF0ZVwiOiBnZXRPcGVuU3RhdGUoY29udGV4dC5vcGVuKSxcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIHJlZjogY29tcG9zZVJlZnMoZm9yd2FyZGVkUmVmLCBzdWJDb250ZXh0Lm9uVHJpZ2dlckNoYW5nZSksXG4gICAgICAgIG9uQ2xpY2s6IChldmVudCkgPT4ge1xuICAgICAgICAgIHByb3BzLm9uQ2xpY2s/LihldmVudCk7XG4gICAgICAgICAgaWYgKHByb3BzLmRpc2FibGVkIHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0LmZvY3VzKCk7XG4gICAgICAgICAgaWYgKCFjb250ZXh0Lm9wZW4pIGNvbnRleHQub25PcGVuQ2hhbmdlKHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblBvaW50ZXJNb3ZlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICBwcm9wcy5vblBvaW50ZXJNb3ZlLFxuICAgICAgICAgIHdoZW5Nb3VzZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnRlbnRDb250ZXh0Lm9uSXRlbUVudGVyKGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIXByb3BzLmRpc2FibGVkICYmICFjb250ZXh0Lm9wZW4gJiYgIW9wZW5UaW1lclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnRlbnRDb250ZXh0Lm9uUG9pbnRlckdyYWNlSW50ZW50Q2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgICBvcGVuVGltZXJSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lm9uT3BlbkNoYW5nZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBjbGVhck9wZW5UaW1lcigpO1xuICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIG9uUG9pbnRlckxlYXZlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICBwcm9wcy5vblBvaW50ZXJMZWF2ZSxcbiAgICAgICAgICB3aGVuTW91c2UoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjbGVhck9wZW5UaW1lcigpO1xuICAgICAgICAgICAgY29uc3QgY29udGVudFJlY3QgPSBjb250ZXh0LmNvbnRlbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRSZWN0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNpZGUgPSBjb250ZXh0LmNvbnRlbnQ/LmRhdGFzZXQuc2lkZTtcbiAgICAgICAgICAgICAgY29uc3QgcmlnaHRTaWRlID0gc2lkZSA9PT0gXCJyaWdodFwiO1xuICAgICAgICAgICAgICBjb25zdCBibGVlZCA9IHJpZ2h0U2lkZSA/IC01IDogNTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGVudE5lYXJFZGdlID0gY29udGVudFJlY3RbcmlnaHRTaWRlID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCJdO1xuICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmFyRWRnZSA9IGNvbnRlbnRSZWN0W3JpZ2h0U2lkZSA/IFwicmlnaHRcIiA6IFwibGVmdFwiXTtcbiAgICAgICAgICAgICAgY29udGVudENvbnRleHQub25Qb2ludGVyR3JhY2VJbnRlbnRDaGFuZ2Uoe1xuICAgICAgICAgICAgICAgIGFyZWE6IFtcbiAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IGEgYmxlZWQgb24gY2xpZW50WCB0byBlbnN1cmUgdGhhdCBvdXIgZXhpdCBwb2ludCBpc1xuICAgICAgICAgICAgICAgICAgLy8gY29uc2lzdGVudGx5IHdpdGhpbiBwb2x5Z29uIGJvdW5kc1xuICAgICAgICAgICAgICAgICAgeyB4OiBldmVudC5jbGllbnRYICsgYmxlZWQsIHk6IGV2ZW50LmNsaWVudFkgfSxcbiAgICAgICAgICAgICAgICAgIHsgeDogY29udGVudE5lYXJFZGdlLCB5OiBjb250ZW50UmVjdC50b3AgfSxcbiAgICAgICAgICAgICAgICAgIHsgeDogY29udGVudEZhckVkZ2UsIHk6IGNvbnRlbnRSZWN0LnRvcCB9LFxuICAgICAgICAgICAgICAgICAgeyB4OiBjb250ZW50RmFyRWRnZSwgeTogY29udGVudFJlY3QuYm90dG9tIH0sXG4gICAgICAgICAgICAgICAgICB7IHg6IGNvbnRlbnROZWFyRWRnZSwgeTogY29udGVudFJlY3QuYm90dG9tIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNpZGVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocG9pbnRlckdyYWNlVGltZXJSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgIHBvaW50ZXJHcmFjZVRpbWVyUmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAoKSA9PiBjb250ZW50Q29udGV4dC5vblBvaW50ZXJHcmFjZUludGVudENoYW5nZShudWxsKSxcbiAgICAgICAgICAgICAgICAzMDBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnRlbnRDb250ZXh0Lm9uVHJpZ2dlckxlYXZlKGV2ZW50KTtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgY29udGVudENvbnRleHQub25Qb2ludGVyR3JhY2VJbnRlbnRDaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgb25LZXlEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbktleURvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzVHlwaW5nQWhlYWQgPSBjb250ZW50Q29udGV4dC5zZWFyY2hSZWYuY3VycmVudCAhPT0gXCJcIjtcbiAgICAgICAgICBpZiAocHJvcHMuZGlzYWJsZWQgfHwgaXNUeXBpbmdBaGVhZCAmJiBldmVudC5rZXkgPT09IFwiIFwiKSByZXR1cm47XG4gICAgICAgICAgaWYgKFNVQl9PUEVOX0tFWVNbcm9vdENvbnRleHQuZGlyXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgICAgICBjb250ZXh0Lm9uT3BlbkNoYW5nZSh0cnVlKTtcbiAgICAgICAgICAgIGNvbnRleHQuY29udGVudD8uZm9jdXMoKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICkgfSk7XG4gIH1cbik7XG5NZW51U3ViVHJpZ2dlci5kaXNwbGF5TmFtZSA9IFNVQl9UUklHR0VSX05BTUU7XG52YXIgU1VCX0NPTlRFTlRfTkFNRSA9IFwiTWVudVN1YkNvbnRlbnRcIjtcbnZhciBNZW51U3ViQ29udGVudCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgcG9ydGFsQ29udGV4dCA9IHVzZVBvcnRhbENvbnRleHQoQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3QgeyBmb3JjZU1vdW50ID0gcG9ydGFsQ29udGV4dC5mb3JjZU1vdW50LCAuLi5zdWJDb250ZW50UHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VNZW51Q29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByb290Q29udGV4dCA9IHVzZU1lbnVSb290Q29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBzdWJDb250ZXh0ID0gdXNlTWVudVN1YkNvbnRleHQoU1VCX0NPTlRFTlRfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbGxlY3Rpb24uUHJvdmlkZXIsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVNZW51LCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChQcmVzZW5jZSwgeyBwcmVzZW50OiBmb3JjZU1vdW50IHx8IGNvbnRleHQub3BlbiwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goQ29sbGVjdGlvbi5TbG90LCB7IHNjb3BlOiBwcm9wcy5fX3Njb3BlTWVudSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBNZW51Q29udGVudEltcGwsXG4gICAgICB7XG4gICAgICAgIGlkOiBzdWJDb250ZXh0LmNvbnRlbnRJZCxcbiAgICAgICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogc3ViQ29udGV4dC50cmlnZ2VySWQsXG4gICAgICAgIC4uLnN1YkNvbnRlbnRQcm9wcyxcbiAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgIGFsaWduOiBcInN0YXJ0XCIsXG4gICAgICAgIHNpZGU6IHJvb3RDb250ZXh0LmRpciA9PT0gXCJydGxcIiA/IFwibGVmdFwiIDogXCJyaWdodFwiLFxuICAgICAgICBkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlT3V0c2lkZVNjcm9sbDogZmFsc2UsXG4gICAgICAgIHRyYXBGb2N1czogZmFsc2UsXG4gICAgICAgIG9uT3BlbkF1dG9Gb2N1czogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKHJvb3RDb250ZXh0LmlzVXNpbmdLZXlib2FyZFJlZi5jdXJyZW50KSByZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9LFxuICAgICAgICBvbkNsb3NlQXV0b0ZvY3VzOiAoZXZlbnQpID0+IGV2ZW50LnByZXZlbnREZWZhdWx0KCksXG4gICAgICAgIG9uRm9jdXNPdXRzaWRlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkZvY3VzT3V0c2lkZSwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gc3ViQ29udGV4dC50cmlnZ2VyKSBjb250ZXh0Lm9uT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgICAgIH0pLFxuICAgICAgICBvbkVzY2FwZUtleURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uRXNjYXBlS2V5RG93biwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgcm9vdENvbnRleHQub25DbG9zZSgpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pLFxuICAgICAgICBvbktleURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uS2V5RG93biwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNLZXlEb3duSW5zaWRlID0gZXZlbnQuY3VycmVudFRhcmdldC5jb250YWlucyhldmVudC50YXJnZXQpO1xuICAgICAgICAgIGNvbnN0IGlzQ2xvc2VLZXkgPSBTVUJfQ0xPU0VfS0VZU1tyb290Q29udGV4dC5kaXJdLmluY2x1ZGVzKGV2ZW50LmtleSk7XG4gICAgICAgICAgaWYgKGlzS2V5RG93bkluc2lkZSAmJiBpc0Nsb3NlS2V5KSB7XG4gICAgICAgICAgICBjb250ZXh0Lm9uT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgICAgICAgICBzdWJDb250ZXh0LnRyaWdnZXI/LmZvY3VzKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICApIH0pIH0pIH0pO1xuICB9XG4pO1xuTWVudVN1YkNvbnRlbnQuZGlzcGxheU5hbWUgPSBTVUJfQ09OVEVOVF9OQU1FO1xuZnVuY3Rpb24gZ2V0T3BlblN0YXRlKG9wZW4pIHtcbiAgcmV0dXJuIG9wZW4gPyBcIm9wZW5cIiA6IFwiY2xvc2VkXCI7XG59XG5mdW5jdGlvbiBpc0luZGV0ZXJtaW5hdGUoY2hlY2tlZCkge1xuICByZXR1cm4gY2hlY2tlZCA9PT0gXCJpbmRldGVybWluYXRlXCI7XG59XG5mdW5jdGlvbiBnZXRDaGVja2VkU3RhdGUoY2hlY2tlZCkge1xuICByZXR1cm4gaXNJbmRldGVybWluYXRlKGNoZWNrZWQpID8gXCJpbmRldGVybWluYXRlXCIgOiBjaGVja2VkID8gXCJjaGVja2VkXCIgOiBcInVuY2hlY2tlZFwiO1xufVxuZnVuY3Rpb24gZm9jdXNGaXJzdChjYW5kaWRhdGVzKSB7XG4gIGNvbnN0IFBSRVZJT1VTTFlfRk9DVVNFRF9FTEVNRU5UID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChjYW5kaWRhdGUgPT09IFBSRVZJT1VTTFlfRk9DVVNFRF9FTEVNRU5UKSByZXR1cm47XG4gICAgY2FuZGlkYXRlLmZvY3VzKCk7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IFBSRVZJT1VTTFlfRk9DVVNFRF9FTEVNRU5UKSByZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHdyYXBBcnJheShhcnJheSwgc3RhcnRJbmRleCkge1xuICByZXR1cm4gYXJyYXkubWFwKChfLCBpbmRleCkgPT4gYXJyYXlbKHN0YXJ0SW5kZXggKyBpbmRleCkgJSBhcnJheS5sZW5ndGhdKTtcbn1cbmZ1bmN0aW9uIGdldE5leHRNYXRjaCh2YWx1ZXMsIHNlYXJjaCwgY3VycmVudE1hdGNoKSB7XG4gIGNvbnN0IGlzUmVwZWF0ZWQgPSBzZWFyY2gubGVuZ3RoID4gMSAmJiBBcnJheS5mcm9tKHNlYXJjaCkuZXZlcnkoKGNoYXIpID0+IGNoYXIgPT09IHNlYXJjaFswXSk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBpc1JlcGVhdGVkID8gc2VhcmNoWzBdIDogc2VhcmNoO1xuICBjb25zdCBjdXJyZW50TWF0Y2hJbmRleCA9IGN1cnJlbnRNYXRjaCA/IHZhbHVlcy5pbmRleE9mKGN1cnJlbnRNYXRjaCkgOiAtMTtcbiAgbGV0IHdyYXBwZWRWYWx1ZXMgPSB3cmFwQXJyYXkodmFsdWVzLCBNYXRoLm1heChjdXJyZW50TWF0Y2hJbmRleCwgMCkpO1xuICBjb25zdCBleGNsdWRlQ3VycmVudE1hdGNoID0gbm9ybWFsaXplZFNlYXJjaC5sZW5ndGggPT09IDE7XG4gIGlmIChleGNsdWRlQ3VycmVudE1hdGNoKSB3cmFwcGVkVmFsdWVzID0gd3JhcHBlZFZhbHVlcy5maWx0ZXIoKHYpID0+IHYgIT09IGN1cnJlbnRNYXRjaCk7XG4gIGNvbnN0IG5leHRNYXRjaCA9IHdyYXBwZWRWYWx1ZXMuZmluZChcbiAgICAodmFsdWUpID0+IHZhbHVlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChub3JtYWxpemVkU2VhcmNoLnRvTG93ZXJDYXNlKCkpXG4gICk7XG4gIHJldHVybiBuZXh0TWF0Y2ggIT09IGN1cnJlbnRNYXRjaCA/IG5leHRNYXRjaCA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzUG9pbnRJblBvbHlnb24ocG9pbnQsIHBvbHlnb24pIHtcbiAgY29uc3QgeyB4LCB5IH0gPSBwb2ludDtcbiAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMCwgaiA9IHBvbHlnb24ubGVuZ3RoIC0gMTsgaSA8IHBvbHlnb24ubGVuZ3RoOyBqID0gaSsrKSB7XG4gICAgY29uc3QgeGkgPSBwb2x5Z29uW2ldLng7XG4gICAgY29uc3QgeWkgPSBwb2x5Z29uW2ldLnk7XG4gICAgY29uc3QgeGogPSBwb2x5Z29uW2pdLng7XG4gICAgY29uc3QgeWogPSBwb2x5Z29uW2pdLnk7XG4gICAgY29uc3QgaW50ZXJzZWN0ID0geWkgPiB5ICE9PSB5aiA+IHkgJiYgeCA8ICh4aiAtIHhpKSAqICh5IC0geWkpIC8gKHlqIC0geWkpICsgeGk7XG4gICAgaWYgKGludGVyc2VjdCkgaW5zaWRlID0gIWluc2lkZTtcbiAgfVxuICByZXR1cm4gaW5zaWRlO1xufVxuZnVuY3Rpb24gaXNQb2ludGVySW5HcmFjZUFyZWEoZXZlbnQsIGFyZWEpIHtcbiAgaWYgKCFhcmVhKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGN1cnNvclBvcyA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9O1xuICByZXR1cm4gaXNQb2ludEluUG9seWdvbihjdXJzb3JQb3MsIGFyZWEpO1xufVxuZnVuY3Rpb24gd2hlbk1vdXNlKGhhbmRsZXIpIHtcbiAgcmV0dXJuIChldmVudCkgPT4gZXZlbnQucG9pbnRlclR5cGUgPT09IFwibW91c2VcIiA/IGhhbmRsZXIoZXZlbnQpIDogdm9pZCAwO1xufVxudmFyIFJvb3QzID0gTWVudTtcbnZhciBBbmNob3IyID0gTWVudUFuY2hvcjtcbnZhciBQb3J0YWwgPSBNZW51UG9ydGFsO1xudmFyIENvbnRlbnQyID0gTWVudUNvbnRlbnQ7XG52YXIgR3JvdXAgPSBNZW51R3JvdXA7XG52YXIgTGFiZWwgPSBNZW51TGFiZWw7XG52YXIgSXRlbTIgPSBNZW51SXRlbTtcbnZhciBDaGVja2JveEl0ZW0gPSBNZW51Q2hlY2tib3hJdGVtO1xudmFyIFJhZGlvR3JvdXAgPSBNZW51UmFkaW9Hcm91cDtcbnZhciBSYWRpb0l0ZW0gPSBNZW51UmFkaW9JdGVtO1xudmFyIEl0ZW1JbmRpY2F0b3IgPSBNZW51SXRlbUluZGljYXRvcjtcbnZhciBTZXBhcmF0b3IgPSBNZW51U2VwYXJhdG9yO1xudmFyIEFycm93MiA9IE1lbnVBcnJvdztcbnZhciBTdWIgPSBNZW51U3ViO1xudmFyIFN1YlRyaWdnZXIgPSBNZW51U3ViVHJpZ2dlcjtcbnZhciBTdWJDb250ZW50ID0gTWVudVN1YkNvbnRlbnQ7XG5leHBvcnQge1xuICBBbmNob3IyIGFzIEFuY2hvcixcbiAgQXJyb3cyIGFzIEFycm93LFxuICBDaGVja2JveEl0ZW0sXG4gIENvbnRlbnQyIGFzIENvbnRlbnQsXG4gIEdyb3VwLFxuICBJdGVtMiBhcyBJdGVtLFxuICBJdGVtSW5kaWNhdG9yLFxuICBMYWJlbCxcbiAgTWVudSxcbiAgTWVudUFuY2hvcixcbiAgTWVudUFycm93LFxuICBNZW51Q2hlY2tib3hJdGVtLFxuICBNZW51Q29udGVudCxcbiAgTWVudUdyb3VwLFxuICBNZW51SXRlbSxcbiAgTWVudUl0ZW1JbmRpY2F0b3IsXG4gIE1lbnVMYWJlbCxcbiAgTWVudVBvcnRhbCxcbiAgTWVudVJhZGlvR3JvdXAsXG4gIE1lbnVSYWRpb0l0ZW0sXG4gIE1lbnVTZXBhcmF0b3IsXG4gIE1lbnVTdWIsXG4gIE1lbnVTdWJDb250ZW50LFxuICBNZW51U3ViVHJpZ2dlcixcbiAgUG9ydGFsLFxuICBSYWRpb0dyb3VwLFxuICBSYWRpb0l0ZW0sXG4gIFJvb3QzIGFzIFJvb3QsXG4gIFNlcGFyYXRvcixcbiAgU3ViLFxuICBTdWJDb250ZW50LFxuICBTdWJUcmlnZ2VyLFxuICBjcmVhdGVNZW51U2NvcGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvcG9wcGVyL3NyYy9Qb3BwZXIudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIHVzZUZsb2F0aW5nLFxuICBhdXRvVXBkYXRlLFxuICBvZmZzZXQsXG4gIHNoaWZ0LFxuICBsaW1pdFNoaWZ0LFxuICBoaWRlLFxuICBhcnJvdyBhcyBmbG9hdGluZ1VJYXJyb3csXG4gIGZsaXAsXG4gIHNpemVcbn0gZnJvbSBcIkBmbG9hdGluZy11aS9yZWFjdC1kb21cIjtcbmltcG9ydCAqIGFzIEFycm93UHJpbWl0aXZlIGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtYXJyb3dcIjtcbmltcG9ydCB7IHVzZUNvbXBvc2VkUmVmcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzXCI7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0U2NvcGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbnRleHRcIjtcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZlwiO1xuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtbGF5b3V0LWVmZmVjdFwiO1xuaW1wb3J0IHsgdXNlU2l6ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLXNpemVcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIFNJREVfT1BUSU9OUyA9IFtcInRvcFwiLCBcInJpZ2h0XCIsIFwiYm90dG9tXCIsIFwibGVmdFwiXTtcbnZhciBBTElHTl9PUFRJT05TID0gW1wic3RhcnRcIiwgXCJjZW50ZXJcIiwgXCJlbmRcIl07XG52YXIgUE9QUEVSX05BTUUgPSBcIlBvcHBlclwiO1xudmFyIFtjcmVhdGVQb3BwZXJDb250ZXh0LCBjcmVhdGVQb3BwZXJTY29wZV0gPSBjcmVhdGVDb250ZXh0U2NvcGUoUE9QUEVSX05BTUUpO1xudmFyIFtQb3BwZXJQcm92aWRlciwgdXNlUG9wcGVyQ29udGV4dF0gPSBjcmVhdGVQb3BwZXJDb250ZXh0KFBPUFBFUl9OQU1FKTtcbnZhciBQb3BwZXIgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlUG9wcGVyLCBjaGlsZHJlbiB9ID0gcHJvcHM7XG4gIGNvbnN0IFthbmNob3IsIHNldEFuY2hvcl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUG9wcGVyUHJvdmlkZXIsIHsgc2NvcGU6IF9fc2NvcGVQb3BwZXIsIGFuY2hvciwgb25BbmNob3JDaGFuZ2U6IHNldEFuY2hvciwgY2hpbGRyZW4gfSk7XG59O1xuUG9wcGVyLmRpc3BsYXlOYW1lID0gUE9QUEVSX05BTUU7XG52YXIgQU5DSE9SX05BTUUgPSBcIlBvcHBlckFuY2hvclwiO1xudmFyIFBvcHBlckFuY2hvciA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlUG9wcGVyLCB2aXJ0dWFsUmVmLCAuLi5hbmNob3JQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZVBvcHBlckNvbnRleHQoQU5DSE9SX05BTUUsIF9fc2NvcGVQb3BwZXIpO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb250ZXh0Lm9uQW5jaG9yQ2hhbmdlKHZpcnR1YWxSZWY/LmN1cnJlbnQgfHwgcmVmLmN1cnJlbnQpO1xuICAgIH0pO1xuICAgIHJldHVybiB2aXJ0dWFsUmVmID8gbnVsbCA6IC8qIEBfX1BVUkVfXyAqLyBqc3goUHJpbWl0aXZlLmRpdiwgeyAuLi5hbmNob3JQcm9wcywgcmVmOiBjb21wb3NlZFJlZnMgfSk7XG4gIH1cbik7XG5Qb3BwZXJBbmNob3IuZGlzcGxheU5hbWUgPSBBTkNIT1JfTkFNRTtcbnZhciBDT05URU5UX05BTUUgPSBcIlBvcHBlckNvbnRlbnRcIjtcbnZhciBbUG9wcGVyQ29udGVudFByb3ZpZGVyLCB1c2VDb250ZW50Q29udGV4dF0gPSBjcmVhdGVQb3BwZXJDb250ZXh0KENPTlRFTlRfTkFNRSk7XG52YXIgUG9wcGVyQ29udGVudCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgX19zY29wZVBvcHBlcixcbiAgICAgIHNpZGUgPSBcImJvdHRvbVwiLFxuICAgICAgc2lkZU9mZnNldCA9IDAsXG4gICAgICBhbGlnbiA9IFwiY2VudGVyXCIsXG4gICAgICBhbGlnbk9mZnNldCA9IDAsXG4gICAgICBhcnJvd1BhZGRpbmcgPSAwLFxuICAgICAgYXZvaWRDb2xsaXNpb25zID0gdHJ1ZSxcbiAgICAgIGNvbGxpc2lvbkJvdW5kYXJ5ID0gW10sXG4gICAgICBjb2xsaXNpb25QYWRkaW5nOiBjb2xsaXNpb25QYWRkaW5nUHJvcCA9IDAsXG4gICAgICBzdGlja3kgPSBcInBhcnRpYWxcIixcbiAgICAgIGhpZGVXaGVuRGV0YWNoZWQgPSBmYWxzZSxcbiAgICAgIHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kgPSBcIm9wdGltaXplZFwiLFxuICAgICAgb25QbGFjZWQsXG4gICAgICAuLi5jb250ZW50UHJvcHNcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZVBvcHBlckNvbnRleHQoQ09OVEVOVF9OQU1FLCBfX3Njb3BlUG9wcGVyKTtcbiAgICBjb25zdCBbY29udGVudCwgc2V0Q29udGVudF0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCAobm9kZSkgPT4gc2V0Q29udGVudChub2RlKSk7XG4gICAgY29uc3QgW2Fycm93LCBzZXRBcnJvd10gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBhcnJvd1NpemUgPSB1c2VTaXplKGFycm93KTtcbiAgICBjb25zdCBhcnJvd1dpZHRoID0gYXJyb3dTaXplPy53aWR0aCA/PyAwO1xuICAgIGNvbnN0IGFycm93SGVpZ2h0ID0gYXJyb3dTaXplPy5oZWlnaHQgPz8gMDtcbiAgICBjb25zdCBkZXNpcmVkUGxhY2VtZW50ID0gc2lkZSArIChhbGlnbiAhPT0gXCJjZW50ZXJcIiA/IFwiLVwiICsgYWxpZ24gOiBcIlwiKTtcbiAgICBjb25zdCBjb2xsaXNpb25QYWRkaW5nID0gdHlwZW9mIGNvbGxpc2lvblBhZGRpbmdQcm9wID09PSBcIm51bWJlclwiID8gY29sbGlzaW9uUGFkZGluZ1Byb3AgOiB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMCwgLi4uY29sbGlzaW9uUGFkZGluZ1Byb3AgfTtcbiAgICBjb25zdCBib3VuZGFyeSA9IEFycmF5LmlzQXJyYXkoY29sbGlzaW9uQm91bmRhcnkpID8gY29sbGlzaW9uQm91bmRhcnkgOiBbY29sbGlzaW9uQm91bmRhcnldO1xuICAgIGNvbnN0IGhhc0V4cGxpY2l0Qm91bmRhcmllcyA9IGJvdW5kYXJ5Lmxlbmd0aCA+IDA7XG4gICAgY29uc3QgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zID0ge1xuICAgICAgcGFkZGluZzogY29sbGlzaW9uUGFkZGluZyxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeS5maWx0ZXIoaXNOb3ROdWxsKSxcbiAgICAgIC8vIHdpdGggYHN0cmF0ZWd5OiAnZml4ZWQnYCwgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZ2V0IGl0IHRvIHJlc3BlY3QgYm91bmRhcmllc1xuICAgICAgYWx0Qm91bmRhcnk6IGhhc0V4cGxpY2l0Qm91bmRhcmllc1xuICAgIH07XG4gICAgY29uc3QgeyByZWZzLCBmbG9hdGluZ1N0eWxlcywgcGxhY2VtZW50LCBpc1Bvc2l0aW9uZWQsIG1pZGRsZXdhcmVEYXRhIH0gPSB1c2VGbG9hdGluZyh7XG4gICAgICAvLyBkZWZhdWx0IHRvIGBmaXhlZGAgc3RyYXRlZ3kgc28gdXNlcnMgZG9uJ3QgaGF2ZSB0byBwaWNrIGFuZCB3ZSBhbHNvIGF2b2lkIGZvY3VzIHNjcm9sbCBpc3N1ZXNcbiAgICAgIHN0cmF0ZWd5OiBcImZpeGVkXCIsXG4gICAgICBwbGFjZW1lbnQ6IGRlc2lyZWRQbGFjZW1lbnQsXG4gICAgICB3aGlsZUVsZW1lbnRzTW91bnRlZDogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cCA9IGF1dG9VcGRhdGUoLi4uYXJncywge1xuICAgICAgICAgIGFuaW1hdGlvbkZyYW1lOiB1cGRhdGVQb3NpdGlvblN0cmF0ZWd5ID09PSBcImFsd2F5c1wiXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2xlYW51cDtcbiAgICAgIH0sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2U6IGNvbnRleHQuYW5jaG9yXG4gICAgICB9LFxuICAgICAgbWlkZGxld2FyZTogW1xuICAgICAgICBvZmZzZXQoeyBtYWluQXhpczogc2lkZU9mZnNldCArIGFycm93SGVpZ2h0LCBhbGlnbm1lbnRBeGlzOiBhbGlnbk9mZnNldCB9KSxcbiAgICAgICAgYXZvaWRDb2xsaXNpb25zICYmIHNoaWZ0KHtcbiAgICAgICAgICBtYWluQXhpczogdHJ1ZSxcbiAgICAgICAgICBjcm9zc0F4aXM6IGZhbHNlLFxuICAgICAgICAgIGxpbWl0ZXI6IHN0aWNreSA9PT0gXCJwYXJ0aWFsXCIgPyBsaW1pdFNoaWZ0KCkgOiB2b2lkIDAsXG4gICAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgICAgIH0pLFxuICAgICAgICBhdm9pZENvbGxpc2lvbnMgJiYgZmxpcCh7IC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyB9KSxcbiAgICAgICAgc2l6ZSh7XG4gICAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zLFxuICAgICAgICAgIGFwcGx5OiAoeyBlbGVtZW50cywgcmVjdHMsIGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB3aWR0aDogYW5jaG9yV2lkdGgsIGhlaWdodDogYW5jaG9ySGVpZ2h0IH0gPSByZWN0cy5yZWZlcmVuY2U7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50U3R5bGUgPSBlbGVtZW50cy5mbG9hdGluZy5zdHlsZTtcbiAgICAgICAgICAgIGNvbnRlbnRTdHlsZS5zZXRQcm9wZXJ0eShcIi0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS13aWR0aFwiLCBgJHthdmFpbGFibGVXaWR0aH1weGApO1xuICAgICAgICAgICAgY29udGVudFN0eWxlLnNldFByb3BlcnR5KFwiLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLWhlaWdodFwiLCBgJHthdmFpbGFibGVIZWlnaHR9cHhgKTtcbiAgICAgICAgICAgIGNvbnRlbnRTdHlsZS5zZXRQcm9wZXJ0eShcIi0tcmFkaXgtcG9wcGVyLWFuY2hvci13aWR0aFwiLCBgJHthbmNob3JXaWR0aH1weGApO1xuICAgICAgICAgICAgY29udGVudFN0eWxlLnNldFByb3BlcnR5KFwiLS1yYWRpeC1wb3BwZXItYW5jaG9yLWhlaWdodFwiLCBgJHthbmNob3JIZWlnaHR9cHhgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBhcnJvdyAmJiBmbG9hdGluZ1VJYXJyb3coeyBlbGVtZW50OiBhcnJvdywgcGFkZGluZzogYXJyb3dQYWRkaW5nIH0pLFxuICAgICAgICB0cmFuc2Zvcm1PcmlnaW4oeyBhcnJvd1dpZHRoLCBhcnJvd0hlaWdodCB9KSxcbiAgICAgICAgaGlkZVdoZW5EZXRhY2hlZCAmJiBoaWRlKHsgc3RyYXRlZ3k6IFwicmVmZXJlbmNlSGlkZGVuXCIsIC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyB9KVxuICAgICAgXVxuICAgIH0pO1xuICAgIGNvbnN0IFtwbGFjZWRTaWRlLCBwbGFjZWRBbGlnbl0gPSBnZXRTaWRlQW5kQWxpZ25Gcm9tUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gICAgY29uc3QgaGFuZGxlUGxhY2VkID0gdXNlQ2FsbGJhY2tSZWYob25QbGFjZWQpO1xuICAgIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoaXNQb3NpdGlvbmVkKSB7XG4gICAgICAgIGhhbmRsZVBsYWNlZD8uKCk7XG4gICAgICB9XG4gICAgfSwgW2lzUG9zaXRpb25lZCwgaGFuZGxlUGxhY2VkXSk7XG4gICAgY29uc3QgYXJyb3dYID0gbWlkZGxld2FyZURhdGEuYXJyb3c/Lng7XG4gICAgY29uc3QgYXJyb3dZID0gbWlkZGxld2FyZURhdGEuYXJyb3c/Lnk7XG4gICAgY29uc3QgY2Fubm90Q2VudGVyQXJyb3cgPSBtaWRkbGV3YXJlRGF0YS5hcnJvdz8uY2VudGVyT2Zmc2V0ICE9PSAwO1xuICAgIGNvbnN0IFtjb250ZW50WkluZGV4LCBzZXRDb250ZW50WkluZGV4XSA9IFJlYWN0LnVzZVN0YXRlKCk7XG4gICAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgIGlmIChjb250ZW50KSBzZXRDb250ZW50WkluZGV4KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNvbnRlbnQpLnpJbmRleCk7XG4gICAgfSwgW2NvbnRlbnRdKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7XG4gICAgICAgIHJlZjogcmVmcy5zZXRGbG9hdGluZyxcbiAgICAgICAgXCJkYXRhLXJhZGl4LXBvcHBlci1jb250ZW50LXdyYXBwZXJcIjogXCJcIixcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAuLi5mbG9hdGluZ1N0eWxlcyxcbiAgICAgICAgICB0cmFuc2Zvcm06IGlzUG9zaXRpb25lZCA/IGZsb2F0aW5nU3R5bGVzLnRyYW5zZm9ybSA6IFwidHJhbnNsYXRlKDAsIC0yMDAlKVwiLFxuICAgICAgICAgIC8vIGtlZXAgb2ZmIHRoZSBwYWdlIHdoZW4gbWVhc3VyaW5nXG4gICAgICAgICAgbWluV2lkdGg6IFwibWF4LWNvbnRlbnRcIixcbiAgICAgICAgICB6SW5kZXg6IGNvbnRlbnRaSW5kZXgsXG4gICAgICAgICAgW1wiLS1yYWRpeC1wb3BwZXItdHJhbnNmb3JtLW9yaWdpblwiXTogW1xuICAgICAgICAgICAgbWlkZGxld2FyZURhdGEudHJhbnNmb3JtT3JpZ2luPy54LFxuICAgICAgICAgICAgbWlkZGxld2FyZURhdGEudHJhbnNmb3JtT3JpZ2luPy55XG4gICAgICAgICAgXS5qb2luKFwiIFwiKSxcbiAgICAgICAgICAvLyBoaWRlIHRoZSBjb250ZW50IGlmIHVzaW5nIHRoZSBoaWRlIG1pZGRsZXdhcmUgYW5kIHNob3VsZCBiZSBoaWRkZW5cbiAgICAgICAgICAvLyBzZXQgdmlzaWJpbGl0eSB0byBoaWRkZW4gYW5kIGRpc2FibGUgcG9pbnRlciBldmVudHMgc28gdGhlIFVJIGJlaGF2ZXNcbiAgICAgICAgICAvLyBhcyBpZiB0aGUgUG9wcGVyQ29udGVudCBpc24ndCB0aGVyZSBhdCBhbGxcbiAgICAgICAgICAuLi5taWRkbGV3YXJlRGF0YS5oaWRlPy5yZWZlcmVuY2VIaWRkZW4gJiYge1xuICAgICAgICAgICAgdmlzaWJpbGl0eTogXCJoaWRkZW5cIixcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkaXI6IHByb3BzLmRpcixcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgUG9wcGVyQ29udGVudFByb3ZpZGVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjb3BlOiBfX3Njb3BlUG9wcGVyLFxuICAgICAgICAgICAgcGxhY2VkU2lkZSxcbiAgICAgICAgICAgIG9uQXJyb3dDaGFuZ2U6IHNldEFycm93LFxuICAgICAgICAgICAgYXJyb3dYLFxuICAgICAgICAgICAgYXJyb3dZLFxuICAgICAgICAgICAgc2hvdWxkSGlkZUFycm93OiBjYW5ub3RDZW50ZXJBcnJvdyxcbiAgICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgICAgICBQcmltaXRpdmUuZGl2LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJkYXRhLXNpZGVcIjogcGxhY2VkU2lkZSxcbiAgICAgICAgICAgICAgICBcImRhdGEtYWxpZ25cIjogcGxhY2VkQWxpZ24sXG4gICAgICAgICAgICAgICAgLi4uY29udGVudFByb3BzLFxuICAgICAgICAgICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAuLi5jb250ZW50UHJvcHMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgUG9wcGVyQ29udGVudCBoYXNuJ3QgYmVlbiBwbGFjZWQgeWV0IChub3QgYWxsIG1lYXN1cmVtZW50cyBkb25lKVxuICAgICAgICAgICAgICAgICAgLy8gd2UgcHJldmVudCBhbmltYXRpb25zIHNvIHRoYXQgdXNlcnMncyBhbmltYXRpb24gZG9uJ3Qga2ljayBpbiB0b28gZWFybHkgcmVmZXJyaW5nIHdyb25nIHNpZGVzXG4gICAgICAgICAgICAgICAgICBhbmltYXRpb246ICFpc1Bvc2l0aW9uZWQgPyBcIm5vbmVcIiA6IHZvaWQgMFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5Qb3BwZXJDb250ZW50LmRpc3BsYXlOYW1lID0gQ09OVEVOVF9OQU1FO1xudmFyIEFSUk9XX05BTUUgPSBcIlBvcHBlckFycm93XCI7XG52YXIgT1BQT1NJVEVfU0lERSA9IHtcbiAgdG9wOiBcImJvdHRvbVwiLFxuICByaWdodDogXCJsZWZ0XCIsXG4gIGJvdHRvbTogXCJ0b3BcIixcbiAgbGVmdDogXCJyaWdodFwiXG59O1xudmFyIFBvcHBlckFycm93ID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBQb3BwZXJBcnJvdzIocHJvcHMsIGZvcndhcmRlZFJlZikge1xuICBjb25zdCB7IF9fc2NvcGVQb3BwZXIsIC4uLmFycm93UHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBjb250ZW50Q29udGV4dCA9IHVzZUNvbnRlbnRDb250ZXh0KEFSUk9XX05BTUUsIF9fc2NvcGVQb3BwZXIpO1xuICBjb25zdCBiYXNlU2lkZSA9IE9QUE9TSVRFX1NJREVbY29udGVudENvbnRleHQucGxhY2VkU2lkZV07XG4gIHJldHVybiAoXG4gICAgLy8gd2UgaGF2ZSB0byB1c2UgYW4gZXh0cmEgd3JhcHBlciBiZWNhdXNlIGBSZXNpemVPYnNlcnZlcmAgKHVzZWQgYnkgYHVzZVNpemVgKVxuICAgIC8vIGRvZXNuJ3QgcmVwb3J0IHNpemUgYXMgd2UnZCBleHBlY3Qgb24gU1ZHIGVsZW1lbnRzLlxuICAgIC8vIGl0IHJlcG9ydHMgdGhlaXIgYm91bmRpbmcgYm94IHdoaWNoIGlzIGVmZmVjdGl2ZWx5IHRoZSBsYXJnZXN0IHBhdGggaW5zaWRlIHRoZSBTVkcuXG4gICAgLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIFwic3BhblwiLFxuICAgICAge1xuICAgICAgICByZWY6IGNvbnRlbnRDb250ZXh0Lm9uQXJyb3dDaGFuZ2UsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICBsZWZ0OiBjb250ZW50Q29udGV4dC5hcnJvd1gsXG4gICAgICAgICAgdG9wOiBjb250ZW50Q29udGV4dC5hcnJvd1ksXG4gICAgICAgICAgW2Jhc2VTaWRlXTogMCxcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46IHtcbiAgICAgICAgICAgIHRvcDogXCJcIixcbiAgICAgICAgICAgIHJpZ2h0OiBcIjAgMFwiLFxuICAgICAgICAgICAgYm90dG9tOiBcImNlbnRlciAwXCIsXG4gICAgICAgICAgICBsZWZ0OiBcIjEwMCUgMFwiXG4gICAgICAgICAgfVtjb250ZW50Q29udGV4dC5wbGFjZWRTaWRlXSxcbiAgICAgICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgICAgIHRvcDogXCJ0cmFuc2xhdGVZKDEwMCUpXCIsXG4gICAgICAgICAgICByaWdodDogXCJ0cmFuc2xhdGVZKDUwJSkgcm90YXRlKDkwZGVnKSB0cmFuc2xhdGVYKC01MCUpXCIsXG4gICAgICAgICAgICBib3R0b206IGByb3RhdGUoMTgwZGVnKWAsXG4gICAgICAgICAgICBsZWZ0OiBcInRyYW5zbGF0ZVkoNTAlKSByb3RhdGUoLTkwZGVnKSB0cmFuc2xhdGVYKDUwJSlcIlxuICAgICAgICAgIH1bY29udGVudENvbnRleHQucGxhY2VkU2lkZV0sXG4gICAgICAgICAgdmlzaWJpbGl0eTogY29udGVudENvbnRleHQuc2hvdWxkSGlkZUFycm93ID8gXCJoaWRkZW5cIiA6IHZvaWQgMFxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICBBcnJvd1ByaW1pdGl2ZS5Sb290LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmFycm93UHJvcHMsXG4gICAgICAgICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIC4uLmFycm93UHJvcHMuc3R5bGUsXG4gICAgICAgICAgICAgIC8vIGVuc3VyZXMgdGhlIGVsZW1lbnQgY2FuIGJlIG1lYXN1cmVkIGNvcnJlY3RseSAobW9zdGx5IGZvciBpZiBTVkcpXG4gICAgICAgICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgIClcbiAgKTtcbn0pO1xuUG9wcGVyQXJyb3cuZGlzcGxheU5hbWUgPSBBUlJPV19OQU1FO1xuZnVuY3Rpb24gaXNOb3ROdWxsKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbDtcbn1cbnZhciB0cmFuc2Zvcm1PcmlnaW4gPSAob3B0aW9ucykgPT4gKHtcbiAgbmFtZTogXCJ0cmFuc2Zvcm1PcmlnaW5cIixcbiAgb3B0aW9ucyxcbiAgZm4oZGF0YSkge1xuICAgIGNvbnN0IHsgcGxhY2VtZW50LCByZWN0cywgbWlkZGxld2FyZURhdGEgfSA9IGRhdGE7XG4gICAgY29uc3QgY2Fubm90Q2VudGVyQXJyb3cgPSBtaWRkbGV3YXJlRGF0YS5hcnJvdz8uY2VudGVyT2Zmc2V0ICE9PSAwO1xuICAgIGNvbnN0IGlzQXJyb3dIaWRkZW4gPSBjYW5ub3RDZW50ZXJBcnJvdztcbiAgICBjb25zdCBhcnJvd1dpZHRoID0gaXNBcnJvd0hpZGRlbiA/IDAgOiBvcHRpb25zLmFycm93V2lkdGg7XG4gICAgY29uc3QgYXJyb3dIZWlnaHQgPSBpc0Fycm93SGlkZGVuID8gMCA6IG9wdGlvbnMuYXJyb3dIZWlnaHQ7XG4gICAgY29uc3QgW3BsYWNlZFNpZGUsIHBsYWNlZEFsaWduXSA9IGdldFNpZGVBbmRBbGlnbkZyb21QbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgICBjb25zdCBub0Fycm93QWxpZ24gPSB7IHN0YXJ0OiBcIjAlXCIsIGNlbnRlcjogXCI1MCVcIiwgZW5kOiBcIjEwMCVcIiB9W3BsYWNlZEFsaWduXTtcbiAgICBjb25zdCBhcnJvd1hDZW50ZXIgPSAobWlkZGxld2FyZURhdGEuYXJyb3c/LnggPz8gMCkgKyBhcnJvd1dpZHRoIC8gMjtcbiAgICBjb25zdCBhcnJvd1lDZW50ZXIgPSAobWlkZGxld2FyZURhdGEuYXJyb3c/LnkgPz8gMCkgKyBhcnJvd0hlaWdodCAvIDI7XG4gICAgbGV0IHggPSBcIlwiO1xuICAgIGxldCB5ID0gXCJcIjtcbiAgICBpZiAocGxhY2VkU2lkZSA9PT0gXCJib3R0b21cIikge1xuICAgICAgeCA9IGlzQXJyb3dIaWRkZW4gPyBub0Fycm93QWxpZ24gOiBgJHthcnJvd1hDZW50ZXJ9cHhgO1xuICAgICAgeSA9IGAkey1hcnJvd0hlaWdodH1weGA7XG4gICAgfSBlbHNlIGlmIChwbGFjZWRTaWRlID09PSBcInRvcFwiKSB7XG4gICAgICB4ID0gaXNBcnJvd0hpZGRlbiA/IG5vQXJyb3dBbGlnbiA6IGAke2Fycm93WENlbnRlcn1weGA7XG4gICAgICB5ID0gYCR7cmVjdHMuZmxvYXRpbmcuaGVpZ2h0ICsgYXJyb3dIZWlnaHR9cHhgO1xuICAgIH0gZWxzZSBpZiAocGxhY2VkU2lkZSA9PT0gXCJyaWdodFwiKSB7XG4gICAgICB4ID0gYCR7LWFycm93SGVpZ2h0fXB4YDtcbiAgICAgIHkgPSBpc0Fycm93SGlkZGVuID8gbm9BcnJvd0FsaWduIDogYCR7YXJyb3dZQ2VudGVyfXB4YDtcbiAgICB9IGVsc2UgaWYgKHBsYWNlZFNpZGUgPT09IFwibGVmdFwiKSB7XG4gICAgICB4ID0gYCR7cmVjdHMuZmxvYXRpbmcud2lkdGggKyBhcnJvd0hlaWdodH1weGA7XG4gICAgICB5ID0gaXNBcnJvd0hpZGRlbiA/IG5vQXJyb3dBbGlnbiA6IGAke2Fycm93WUNlbnRlcn1weGA7XG4gICAgfVxuICAgIHJldHVybiB7IGRhdGE6IHsgeCwgeSB9IH07XG4gIH1cbn0pO1xuZnVuY3Rpb24gZ2V0U2lkZUFuZEFsaWduRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgY29uc3QgW3NpZGUsIGFsaWduID0gXCJjZW50ZXJcIl0gPSBwbGFjZW1lbnQuc3BsaXQoXCItXCIpO1xuICByZXR1cm4gW3NpZGUsIGFsaWduXTtcbn1cbnZhciBSb290MiA9IFBvcHBlcjtcbnZhciBBbmNob3IgPSBQb3BwZXJBbmNob3I7XG52YXIgQ29udGVudCA9IFBvcHBlckNvbnRlbnQ7XG52YXIgQXJyb3cgPSBQb3BwZXJBcnJvdztcbmV4cG9ydCB7XG4gIEFMSUdOX09QVElPTlMsXG4gIEFuY2hvcixcbiAgQXJyb3csXG4gIENvbnRlbnQsXG4gIFBvcHBlcixcbiAgUG9wcGVyQW5jaG9yLFxuICBQb3BwZXJBcnJvdyxcbiAgUG9wcGVyQ29udGVudCxcbiAgUm9vdDIgYXMgUm9vdCxcbiAgU0lERV9PUFRJT05TLFxuICBjcmVhdGVQb3BwZXJTY29wZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9wb3J0YWwvc3JjL1BvcnRhbC50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1sYXlvdXQtZWZmZWN0XCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBQT1JUQUxfTkFNRSA9IFwiUG9ydGFsXCI7XG52YXIgUG9ydGFsID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IGNvbnRhaW5lcjogY29udGFpbmVyUHJvcCwgLi4ucG9ydGFsUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBbbW91bnRlZCwgc2V0TW91bnRlZF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiBzZXRNb3VudGVkKHRydWUpLCBbXSk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGNvbnRhaW5lclByb3AgfHwgbW91bnRlZCAmJiBnbG9iYWxUaGlzPy5kb2N1bWVudD8uYm9keTtcbiAgcmV0dXJuIGNvbnRhaW5lciA/IFJlYWN0RE9NLmNyZWF0ZVBvcnRhbCgvKiBAX19QVVJFX18gKi8ganN4KFByaW1pdGl2ZS5kaXYsIHsgLi4ucG9ydGFsUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pLCBjb250YWluZXIpIDogbnVsbDtcbn0pO1xuUG9ydGFsLmRpc3BsYXlOYW1lID0gUE9SVEFMX05BTUU7XG52YXIgUm9vdCA9IFBvcnRhbDtcbmV4cG9ydCB7XG4gIFBvcnRhbCxcbiAgUm9vdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9wcmVzZW5jZS9zcmMvUHJlc2VuY2UudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDIgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtbGF5b3V0LWVmZmVjdFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9wcmVzZW5jZS9zcmMvdXNlU3RhdGVNYWNoaW5lLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5mdW5jdGlvbiB1c2VTdGF0ZU1hY2hpbmUoaW5pdGlhbFN0YXRlLCBtYWNoaW5lKSB7XG4gIHJldHVybiBSZWFjdC51c2VSZWR1Y2VyKChzdGF0ZSwgZXZlbnQpID0+IHtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSBtYWNoaW5lW3N0YXRlXVtldmVudF07XG4gICAgcmV0dXJuIG5leHRTdGF0ZSA/PyBzdGF0ZTtcbiAgfSwgaW5pdGlhbFN0YXRlKTtcbn1cblxuLy8gcGFja2FnZXMvcmVhY3QvcHJlc2VuY2Uvc3JjL1ByZXNlbmNlLnRzeFxudmFyIFByZXNlbmNlID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcHJlc2VudCwgY2hpbGRyZW4gfSA9IHByb3BzO1xuICBjb25zdCBwcmVzZW5jZSA9IHVzZVByZXNlbmNlKHByZXNlbnQpO1xuICBjb25zdCBjaGlsZCA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiID8gY2hpbGRyZW4oeyBwcmVzZW50OiBwcmVzZW5jZS5pc1ByZXNlbnQgfSkgOiBSZWFjdDIuQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG4gIGNvbnN0IHJlZiA9IHVzZUNvbXBvc2VkUmVmcyhwcmVzZW5jZS5yZWYsIGdldEVsZW1lbnRSZWYoY2hpbGQpKTtcbiAgY29uc3QgZm9yY2VNb3VudCA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiO1xuICByZXR1cm4gZm9yY2VNb3VudCB8fCBwcmVzZW5jZS5pc1ByZXNlbnQgPyBSZWFjdDIuY2xvbmVFbGVtZW50KGNoaWxkLCB7IHJlZiB9KSA6IG51bGw7XG59O1xuUHJlc2VuY2UuZGlzcGxheU5hbWUgPSBcIlByZXNlbmNlXCI7XG5mdW5jdGlvbiB1c2VQcmVzZW5jZShwcmVzZW50KSB7XG4gIGNvbnN0IFtub2RlLCBzZXROb2RlXSA9IFJlYWN0Mi51c2VTdGF0ZSgpO1xuICBjb25zdCBzdHlsZXNSZWYgPSBSZWFjdDIudXNlUmVmKHt9KTtcbiAgY29uc3QgcHJldlByZXNlbnRSZWYgPSBSZWFjdDIudXNlUmVmKHByZXNlbnQpO1xuICBjb25zdCBwcmV2QW5pbWF0aW9uTmFtZVJlZiA9IFJlYWN0Mi51c2VSZWYoXCJub25lXCIpO1xuICBjb25zdCBpbml0aWFsU3RhdGUgPSBwcmVzZW50ID8gXCJtb3VudGVkXCIgOiBcInVubW91bnRlZFwiO1xuICBjb25zdCBbc3RhdGUsIHNlbmRdID0gdXNlU3RhdGVNYWNoaW5lKGluaXRpYWxTdGF0ZSwge1xuICAgIG1vdW50ZWQ6IHtcbiAgICAgIFVOTU9VTlQ6IFwidW5tb3VudGVkXCIsXG4gICAgICBBTklNQVRJT05fT1VUOiBcInVubW91bnRTdXNwZW5kZWRcIlxuICAgIH0sXG4gICAgdW5tb3VudFN1c3BlbmRlZDoge1xuICAgICAgTU9VTlQ6IFwibW91bnRlZFwiLFxuICAgICAgQU5JTUFUSU9OX0VORDogXCJ1bm1vdW50ZWRcIlxuICAgIH0sXG4gICAgdW5tb3VudGVkOiB7XG4gICAgICBNT1VOVDogXCJtb3VudGVkXCJcbiAgICB9XG4gIH0pO1xuICBSZWFjdDIudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50QW5pbWF0aW9uTmFtZSA9IGdldEFuaW1hdGlvbk5hbWUoc3R5bGVzUmVmLmN1cnJlbnQpO1xuICAgIHByZXZBbmltYXRpb25OYW1lUmVmLmN1cnJlbnQgPSBzdGF0ZSA9PT0gXCJtb3VudGVkXCIgPyBjdXJyZW50QW5pbWF0aW9uTmFtZSA6IFwibm9uZVwiO1xuICB9LCBbc3RhdGVdKTtcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzdHlsZXMgPSBzdHlsZXNSZWYuY3VycmVudDtcbiAgICBjb25zdCB3YXNQcmVzZW50ID0gcHJldlByZXNlbnRSZWYuY3VycmVudDtcbiAgICBjb25zdCBoYXNQcmVzZW50Q2hhbmdlZCA9IHdhc1ByZXNlbnQgIT09IHByZXNlbnQ7XG4gICAgaWYgKGhhc1ByZXNlbnRDaGFuZ2VkKSB7XG4gICAgICBjb25zdCBwcmV2QW5pbWF0aW9uTmFtZSA9IHByZXZBbmltYXRpb25OYW1lUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBjdXJyZW50QW5pbWF0aW9uTmFtZSA9IGdldEFuaW1hdGlvbk5hbWUoc3R5bGVzKTtcbiAgICAgIGlmIChwcmVzZW50KSB7XG4gICAgICAgIHNlbmQoXCJNT1VOVFwiKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudEFuaW1hdGlvbk5hbWUgPT09IFwibm9uZVwiIHx8IHN0eWxlcz8uZGlzcGxheSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgc2VuZChcIlVOTU9VTlRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpc0FuaW1hdGluZyA9IHByZXZBbmltYXRpb25OYW1lICE9PSBjdXJyZW50QW5pbWF0aW9uTmFtZTtcbiAgICAgICAgaWYgKHdhc1ByZXNlbnQgJiYgaXNBbmltYXRpbmcpIHtcbiAgICAgICAgICBzZW5kKFwiQU5JTUFUSU9OX09VVFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZW5kKFwiVU5NT1VOVFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJldlByZXNlbnRSZWYuY3VycmVudCA9IHByZXNlbnQ7XG4gICAgfVxuICB9LCBbcHJlc2VudCwgc2VuZF0pO1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChub2RlKSB7XG4gICAgICBjb25zdCBoYW5kbGVBbmltYXRpb25FbmQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudEFuaW1hdGlvbk5hbWUgPSBnZXRBbmltYXRpb25OYW1lKHN0eWxlc1JlZi5jdXJyZW50KTtcbiAgICAgICAgY29uc3QgaXNDdXJyZW50QW5pbWF0aW9uID0gY3VycmVudEFuaW1hdGlvbk5hbWUuaW5jbHVkZXMoZXZlbnQuYW5pbWF0aW9uTmFtZSk7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IG5vZGUgJiYgaXNDdXJyZW50QW5pbWF0aW9uKSB7XG4gICAgICAgICAgUmVhY3RET00uZmx1c2hTeW5jKCgpID0+IHNlbmQoXCJBTklNQVRJT05fRU5EXCIpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGhhbmRsZUFuaW1hdGlvblN0YXJ0ID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IG5vZGUpIHtcbiAgICAgICAgICBwcmV2QW5pbWF0aW9uTmFtZVJlZi5jdXJyZW50ID0gZ2V0QW5pbWF0aW9uTmFtZShzdHlsZXNSZWYuY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbmltYXRpb25zdGFydFwiLCBoYW5kbGVBbmltYXRpb25TdGFydCk7XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbmltYXRpb25jYW5jZWxcIiwgaGFuZGxlQW5pbWF0aW9uRW5kKTtcbiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcImFuaW1hdGlvbmVuZFwiLCBoYW5kbGVBbmltYXRpb25FbmQpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiYW5pbWF0aW9uc3RhcnRcIiwgaGFuZGxlQW5pbWF0aW9uU3RhcnQpO1xuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhbmltYXRpb25jYW5jZWxcIiwgaGFuZGxlQW5pbWF0aW9uRW5kKTtcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiYW5pbWF0aW9uZW5kXCIsIGhhbmRsZUFuaW1hdGlvbkVuZCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kKFwiQU5JTUFUSU9OX0VORFwiKTtcbiAgICB9XG4gIH0sIFtub2RlLCBzZW5kXSk7XG4gIHJldHVybiB7XG4gICAgaXNQcmVzZW50OiBbXCJtb3VudGVkXCIsIFwidW5tb3VudFN1c3BlbmRlZFwiXS5pbmNsdWRlcyhzdGF0ZSksXG4gICAgcmVmOiBSZWFjdDIudXNlQ2FsbGJhY2soKG5vZGUyKSA9PiB7XG4gICAgICBpZiAobm9kZTIpIHN0eWxlc1JlZi5jdXJyZW50ID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlMik7XG4gICAgICBzZXROb2RlKG5vZGUyKTtcbiAgICB9LCBbXSlcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldEFuaW1hdGlvbk5hbWUoc3R5bGVzKSB7XG4gIHJldHVybiBzdHlsZXM/LmFuaW1hdGlvbk5hbWUgfHwgXCJub25lXCI7XG59XG5mdW5jdGlvbiBnZXRFbGVtZW50UmVmKGVsZW1lbnQpIHtcbiAgbGV0IGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZWxlbWVudC5wcm9wcywgXCJyZWZcIik/LmdldDtcbiAgbGV0IG1heVdhcm4gPSBnZXR0ZXIgJiYgXCJpc1JlYWN0V2FybmluZ1wiIGluIGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmc7XG4gIGlmIChtYXlXYXJuKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQucmVmO1xuICB9XG4gIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZWxlbWVudCwgXCJyZWZcIik/LmdldDtcbiAgbWF5V2FybiA9IGdldHRlciAmJiBcImlzUmVhY3RXYXJuaW5nXCIgaW4gZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZztcbiAgaWYgKG1heVdhcm4pIHtcbiAgICByZXR1cm4gZWxlbWVudC5wcm9wcy5yZWY7XG4gIH1cbiAgcmV0dXJuIGVsZW1lbnQucHJvcHMucmVmIHx8IGVsZW1lbnQucmVmO1xufVxuZXhwb3J0IHtcbiAgUHJlc2VuY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC9wcmltaXRpdmUvc3JjL1ByaW1pdGl2ZS50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3Qtc2xvdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgTk9ERVMgPSBbXG4gIFwiYVwiLFxuICBcImJ1dHRvblwiLFxuICBcImRpdlwiLFxuICBcImZvcm1cIixcbiAgXCJoMlwiLFxuICBcImgzXCIsXG4gIFwiaW1nXCIsXG4gIFwiaW5wdXRcIixcbiAgXCJsYWJlbFwiLFxuICBcImxpXCIsXG4gIFwibmF2XCIsXG4gIFwib2xcIixcbiAgXCJwXCIsXG4gIFwic3BhblwiLFxuICBcInN2Z1wiLFxuICBcInVsXCJcbl07XG52YXIgUHJpbWl0aXZlID0gTk9ERVMucmVkdWNlKChwcmltaXRpdmUsIG5vZGUpID0+IHtcbiAgY29uc3QgTm9kZSA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IGFzQ2hpbGQsIC4uLnByaW1pdGl2ZVByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBDb21wID0gYXNDaGlsZCA/IFNsb3QgOiBub2RlO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3dbU3ltYm9sLmZvcihcInJhZGl4LXVpXCIpXSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbXAsIHsgLi4ucHJpbWl0aXZlUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9KTtcbiAgTm9kZS5kaXNwbGF5TmFtZSA9IGBQcmltaXRpdmUuJHtub2RlfWA7XG4gIHJldHVybiB7IC4uLnByaW1pdGl2ZSwgW25vZGVdOiBOb2RlIH07XG59LCB7fSk7XG5mdW5jdGlvbiBkaXNwYXRjaERpc2NyZXRlQ3VzdG9tRXZlbnQodGFyZ2V0LCBldmVudCkge1xuICBpZiAodGFyZ2V0KSBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4gdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpKTtcbn1cbnZhciBSb290ID0gUHJpbWl0aXZlO1xuZXhwb3J0IHtcbiAgUHJpbWl0aXZlLFxuICBSb290LFxuICBkaXNwYXRjaERpc2NyZXRlQ3VzdG9tRXZlbnRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3Qvcm92aW5nLWZvY3VzL3NyYy9Sb3ZpbmdGb2N1c0dyb3VwLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjb21wb3NlRXZlbnRIYW5kbGVycyB9IGZyb20gXCJAcmFkaXgtdWkvcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyBjcmVhdGVDb2xsZWN0aW9uIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb2xsZWN0aW9uXCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dFNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VJZCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtaWRcIjtcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZlwiO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxhYmxlU3RhdGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jb250cm9sbGFibGUtc3RhdGVcIjtcbmltcG9ydCB7IHVzZURpcmVjdGlvbiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtZGlyZWN0aW9uXCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBFTlRSWV9GT0NVUyA9IFwicm92aW5nRm9jdXNHcm91cC5vbkVudHJ5Rm9jdXNcIjtcbnZhciBFVkVOVF9PUFRJT05TID0geyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSB9O1xudmFyIEdST1VQX05BTUUgPSBcIlJvdmluZ0ZvY3VzR3JvdXBcIjtcbnZhciBbQ29sbGVjdGlvbiwgdXNlQ29sbGVjdGlvbiwgY3JlYXRlQ29sbGVjdGlvblNjb3BlXSA9IGNyZWF0ZUNvbGxlY3Rpb24oR1JPVVBfTkFNRSk7XG52YXIgW2NyZWF0ZVJvdmluZ0ZvY3VzR3JvdXBDb250ZXh0LCBjcmVhdGVSb3ZpbmdGb2N1c0dyb3VwU2NvcGVdID0gY3JlYXRlQ29udGV4dFNjb3BlKFxuICBHUk9VUF9OQU1FLFxuICBbY3JlYXRlQ29sbGVjdGlvblNjb3BlXVxuKTtcbnZhciBbUm92aW5nRm9jdXNQcm92aWRlciwgdXNlUm92aW5nRm9jdXNDb250ZXh0XSA9IGNyZWF0ZVJvdmluZ0ZvY3VzR3JvdXBDb250ZXh0KEdST1VQX05BTUUpO1xudmFyIFJvdmluZ0ZvY3VzR3JvdXAgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbGxlY3Rpb24uUHJvdmlkZXIsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChDb2xsZWN0aW9uLlNsb3QsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChSb3ZpbmdGb2N1c0dyb3VwSW1wbCwgeyAuLi5wcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSkgfSkgfSk7XG4gIH1cbik7XG5Sb3ZpbmdGb2N1c0dyb3VwLmRpc3BsYXlOYW1lID0gR1JPVVBfTkFNRTtcbnZhciBSb3ZpbmdGb2N1c0dyb3VwSW1wbCA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIF9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwLFxuICAgIG9yaWVudGF0aW9uLFxuICAgIGxvb3AgPSBmYWxzZSxcbiAgICBkaXIsXG4gICAgY3VycmVudFRhYlN0b3BJZDogY3VycmVudFRhYlN0b3BJZFByb3AsXG4gICAgZGVmYXVsdEN1cnJlbnRUYWJTdG9wSWQsXG4gICAgb25DdXJyZW50VGFiU3RvcElkQ2hhbmdlLFxuICAgIG9uRW50cnlGb2N1cyxcbiAgICBwcmV2ZW50U2Nyb2xsT25FbnRyeUZvY3VzID0gZmFsc2UsXG4gICAgLi4uZ3JvdXBQcm9wc1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgcmVmKTtcbiAgY29uc3QgZGlyZWN0aW9uID0gdXNlRGlyZWN0aW9uKGRpcik7XG4gIGNvbnN0IFtjdXJyZW50VGFiU3RvcElkID0gbnVsbCwgc2V0Q3VycmVudFRhYlN0b3BJZF0gPSB1c2VDb250cm9sbGFibGVTdGF0ZSh7XG4gICAgcHJvcDogY3VycmVudFRhYlN0b3BJZFByb3AsXG4gICAgZGVmYXVsdFByb3A6IGRlZmF1bHRDdXJyZW50VGFiU3RvcElkLFxuICAgIG9uQ2hhbmdlOiBvbkN1cnJlbnRUYWJTdG9wSWRDaGFuZ2VcbiAgfSk7XG4gIGNvbnN0IFtpc1RhYmJpbmdCYWNrT3V0LCBzZXRJc1RhYmJpbmdCYWNrT3V0XSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgaGFuZGxlRW50cnlGb2N1cyA9IHVzZUNhbGxiYWNrUmVmKG9uRW50cnlGb2N1cyk7XG4gIGNvbnN0IGdldEl0ZW1zID0gdXNlQ29sbGVjdGlvbihfX3Njb3BlUm92aW5nRm9jdXNHcm91cCk7XG4gIGNvbnN0IGlzQ2xpY2tGb2N1c1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IFtmb2N1c2FibGVJdGVtc0NvdW50LCBzZXRGb2N1c2FibGVJdGVtc0NvdW50XSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSByZWYuY3VycmVudDtcbiAgICBpZiAobm9kZSkge1xuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKEVOVFJZX0ZPQ1VTLCBoYW5kbGVFbnRyeUZvY3VzKTtcbiAgICAgIHJldHVybiAoKSA9PiBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoRU5UUllfRk9DVVMsIGhhbmRsZUVudHJ5Rm9jdXMpO1xuICAgIH1cbiAgfSwgW2hhbmRsZUVudHJ5Rm9jdXNdKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgUm92aW5nRm9jdXNQcm92aWRlcixcbiAgICB7XG4gICAgICBzY29wZTogX19zY29wZVJvdmluZ0ZvY3VzR3JvdXAsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIGRpcjogZGlyZWN0aW9uLFxuICAgICAgbG9vcCxcbiAgICAgIGN1cnJlbnRUYWJTdG9wSWQsXG4gICAgICBvbkl0ZW1Gb2N1czogUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgICAgICh0YWJTdG9wSWQpID0+IHNldEN1cnJlbnRUYWJTdG9wSWQodGFiU3RvcElkKSxcbiAgICAgICAgW3NldEN1cnJlbnRUYWJTdG9wSWRdXG4gICAgICApLFxuICAgICAgb25JdGVtU2hpZnRUYWI6IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHNldElzVGFiYmluZ0JhY2tPdXQodHJ1ZSksIFtdKSxcbiAgICAgIG9uRm9jdXNhYmxlSXRlbUFkZDogUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgICAgICgpID0+IHNldEZvY3VzYWJsZUl0ZW1zQ291bnQoKHByZXZDb3VudCkgPT4gcHJldkNvdW50ICsgMSksXG4gICAgICAgIFtdXG4gICAgICApLFxuICAgICAgb25Gb2N1c2FibGVJdGVtUmVtb3ZlOiBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgICAgKCkgPT4gc2V0Rm9jdXNhYmxlSXRlbXNDb3VudCgocHJldkNvdW50KSA9PiBwcmV2Q291bnQgLSAxKSxcbiAgICAgICAgW11cbiAgICAgICksXG4gICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgUHJpbWl0aXZlLmRpdixcbiAgICAgICAge1xuICAgICAgICAgIHRhYkluZGV4OiBpc1RhYmJpbmdCYWNrT3V0IHx8IGZvY3VzYWJsZUl0ZW1zQ291bnQgPT09IDAgPyAtMSA6IDAsXG4gICAgICAgICAgXCJkYXRhLW9yaWVudGF0aW9uXCI6IG9yaWVudGF0aW9uLFxuICAgICAgICAgIC4uLmdyb3VwUHJvcHMsXG4gICAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgICAgc3R5bGU6IHsgb3V0bGluZTogXCJub25lXCIsIC4uLnByb3BzLnN0eWxlIH0sXG4gICAgICAgICAgb25Nb3VzZURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uTW91c2VEb3duLCAoKSA9PiB7XG4gICAgICAgICAgICBpc0NsaWNrRm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgb25Gb2N1czogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Gb2N1cywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0tleWJvYXJkRm9jdXMgPSAhaXNDbGlja0ZvY3VzUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0ICYmIGlzS2V5Ym9hcmRGb2N1cyAmJiAhaXNUYWJiaW5nQmFja091dCkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRyeUZvY3VzRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoRU5UUllfRk9DVVMsIEVWRU5UX09QVElPTlMpO1xuICAgICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQoZW50cnlGb2N1c0V2ZW50KTtcbiAgICAgICAgICAgICAgaWYgKCFlbnRyeUZvY3VzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0SXRlbXMoKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZm9jdXNhYmxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJdGVtID0gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5hY3RpdmUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gY3VycmVudFRhYlN0b3BJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlSXRlbXMgPSBbYWN0aXZlSXRlbSwgY3VycmVudEl0ZW0sIC4uLml0ZW1zXS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICBCb29sZWFuXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVOb2RlcyA9IGNhbmRpZGF0ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5yZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgZm9jdXNGaXJzdChjYW5kaWRhdGVOb2RlcywgcHJldmVudFNjcm9sbE9uRW50cnlGb2N1cyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzQ2xpY2tGb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgb25CbHVyOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkJsdXIsICgpID0+IHNldElzVGFiYmluZ0JhY2tPdXQoZmFsc2UpKVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICApO1xufSk7XG52YXIgSVRFTV9OQU1FID0gXCJSb3ZpbmdGb2N1c0dyb3VwSXRlbVwiO1xudmFyIFJvdmluZ0ZvY3VzR3JvdXBJdGVtID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBfX3Njb3BlUm92aW5nRm9jdXNHcm91cCxcbiAgICAgIGZvY3VzYWJsZSA9IHRydWUsXG4gICAgICBhY3RpdmUgPSBmYWxzZSxcbiAgICAgIHRhYlN0b3BJZCxcbiAgICAgIC4uLml0ZW1Qcm9wc1xuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCBhdXRvSWQgPSB1c2VJZCgpO1xuICAgIGNvbnN0IGlkID0gdGFiU3RvcElkIHx8IGF1dG9JZDtcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlUm92aW5nRm9jdXNDb250ZXh0KElURU1fTkFNRSwgX19zY29wZVJvdmluZ0ZvY3VzR3JvdXApO1xuICAgIGNvbnN0IGlzQ3VycmVudFRhYlN0b3AgPSBjb250ZXh0LmN1cnJlbnRUYWJTdG9wSWQgPT09IGlkO1xuICAgIGNvbnN0IGdldEl0ZW1zID0gdXNlQ29sbGVjdGlvbihfX3Njb3BlUm92aW5nRm9jdXNHcm91cCk7XG4gICAgY29uc3QgeyBvbkZvY3VzYWJsZUl0ZW1BZGQsIG9uRm9jdXNhYmxlSXRlbVJlbW92ZSB9ID0gY29udGV4dDtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKGZvY3VzYWJsZSkge1xuICAgICAgICBvbkZvY3VzYWJsZUl0ZW1BZGQoKTtcbiAgICAgICAgcmV0dXJuICgpID0+IG9uRm9jdXNhYmxlSXRlbVJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0sIFtmb2N1c2FibGUsIG9uRm9jdXNhYmxlSXRlbUFkZCwgb25Gb2N1c2FibGVJdGVtUmVtb3ZlXSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBDb2xsZWN0aW9uLkl0ZW1TbG90LFxuICAgICAge1xuICAgICAgICBzY29wZTogX19zY29wZVJvdmluZ0ZvY3VzR3JvdXAsXG4gICAgICAgIGlkLFxuICAgICAgICBmb2N1c2FibGUsXG4gICAgICAgIGFjdGl2ZSxcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgUHJpbWl0aXZlLnNwYW4sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFiSW5kZXg6IGlzQ3VycmVudFRhYlN0b3AgPyAwIDogLTEsXG4gICAgICAgICAgICBcImRhdGEtb3JpZW50YXRpb25cIjogY29udGV4dC5vcmllbnRhdGlvbixcbiAgICAgICAgICAgIC4uLml0ZW1Qcm9wcyxcbiAgICAgICAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgICAgICAgb25Nb3VzZURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uTW91c2VEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFmb2N1c2FibGUpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGVsc2UgY29udGV4dC5vbkl0ZW1Gb2N1cyhpZCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG9uRm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uRm9jdXMsICgpID0+IGNvbnRleHQub25JdGVtRm9jdXMoaWQpKSxcbiAgICAgICAgICAgIG9uS2V5RG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25LZXlEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIiAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25JdGVtU2hpZnRUYWIoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gZXZlbnQuY3VycmVudFRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zdCBmb2N1c0ludGVudCA9IGdldEZvY3VzSW50ZW50KGV2ZW50LCBjb250ZXh0Lm9yaWVudGF0aW9uLCBjb250ZXh0LmRpcik7XG4gICAgICAgICAgICAgIGlmIChmb2N1c0ludGVudCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuc2hpZnRLZXkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0SXRlbXMoKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZm9jdXNhYmxlKTtcbiAgICAgICAgICAgICAgICBsZXQgY2FuZGlkYXRlTm9kZXMgPSBpdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0ucmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChmb2N1c0ludGVudCA9PT0gXCJsYXN0XCIpIGNhbmRpZGF0ZU5vZGVzLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmb2N1c0ludGVudCA9PT0gXCJwcmV2XCIgfHwgZm9jdXNJbnRlbnQgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZm9jdXNJbnRlbnQgPT09IFwicHJldlwiKSBjYW5kaWRhdGVOb2Rlcy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBjYW5kaWRhdGVOb2Rlcy5pbmRleE9mKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlTm9kZXMgPSBjb250ZXh0Lmxvb3AgPyB3cmFwQXJyYXkoY2FuZGlkYXRlTm9kZXMsIGN1cnJlbnRJbmRleCArIDEpIDogY2FuZGlkYXRlTm9kZXMuc2xpY2UoY3VycmVudEluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZm9jdXNGaXJzdChjYW5kaWRhdGVOb2RlcykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5Sb3ZpbmdGb2N1c0dyb3VwSXRlbS5kaXNwbGF5TmFtZSA9IElURU1fTkFNRTtcbnZhciBNQVBfS0VZX1RPX0ZPQ1VTX0lOVEVOVCA9IHtcbiAgQXJyb3dMZWZ0OiBcInByZXZcIixcbiAgQXJyb3dVcDogXCJwcmV2XCIsXG4gIEFycm93UmlnaHQ6IFwibmV4dFwiLFxuICBBcnJvd0Rvd246IFwibmV4dFwiLFxuICBQYWdlVXA6IFwiZmlyc3RcIixcbiAgSG9tZTogXCJmaXJzdFwiLFxuICBQYWdlRG93bjogXCJsYXN0XCIsXG4gIEVuZDogXCJsYXN0XCJcbn07XG5mdW5jdGlvbiBnZXREaXJlY3Rpb25Bd2FyZUtleShrZXksIGRpcikge1xuICBpZiAoZGlyICE9PSBcInJ0bFwiKSByZXR1cm4ga2V5O1xuICByZXR1cm4ga2V5ID09PSBcIkFycm93TGVmdFwiID8gXCJBcnJvd1JpZ2h0XCIgOiBrZXkgPT09IFwiQXJyb3dSaWdodFwiID8gXCJBcnJvd0xlZnRcIiA6IGtleTtcbn1cbmZ1bmN0aW9uIGdldEZvY3VzSW50ZW50KGV2ZW50LCBvcmllbnRhdGlvbiwgZGlyKSB7XG4gIGNvbnN0IGtleSA9IGdldERpcmVjdGlvbkF3YXJlS2V5KGV2ZW50LmtleSwgZGlyKTtcbiAgaWYgKG9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIgJiYgW1wiQXJyb3dMZWZ0XCIsIFwiQXJyb3dSaWdodFwiXS5pbmNsdWRlcyhrZXkpKSByZXR1cm4gdm9pZCAwO1xuICBpZiAob3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiICYmIFtcIkFycm93VXBcIiwgXCJBcnJvd0Rvd25cIl0uaW5jbHVkZXMoa2V5KSkgcmV0dXJuIHZvaWQgMDtcbiAgcmV0dXJuIE1BUF9LRVlfVE9fRk9DVVNfSU5URU5UW2tleV07XG59XG5mdW5jdGlvbiBmb2N1c0ZpcnN0KGNhbmRpZGF0ZXMsIHByZXZlbnRTY3JvbGwgPSBmYWxzZSkge1xuICBjb25zdCBQUkVWSU9VU0xZX0ZPQ1VTRURfRUxFTUVOVCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAoY2FuZGlkYXRlID09PSBQUkVWSU9VU0xZX0ZPQ1VTRURfRUxFTUVOVCkgcmV0dXJuO1xuICAgIGNhbmRpZGF0ZS5mb2N1cyh7IHByZXZlbnRTY3JvbGwgfSk7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IFBSRVZJT1VTTFlfRk9DVVNFRF9FTEVNRU5UKSByZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHdyYXBBcnJheShhcnJheSwgc3RhcnRJbmRleCkge1xuICByZXR1cm4gYXJyYXkubWFwKChfLCBpbmRleCkgPT4gYXJyYXlbKHN0YXJ0SW5kZXggKyBpbmRleCkgJSBhcnJheS5sZW5ndGhdKTtcbn1cbnZhciBSb290ID0gUm92aW5nRm9jdXNHcm91cDtcbnZhciBJdGVtID0gUm92aW5nRm9jdXNHcm91cEl0ZW07XG5leHBvcnQge1xuICBJdGVtLFxuICBSb290LFxuICBSb3ZpbmdGb2N1c0dyb3VwLFxuICBSb3ZpbmdGb2N1c0dyb3VwSXRlbSxcbiAgY3JlYXRlUm92aW5nRm9jdXNHcm91cFNjb3BlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3Qvc2xvdC9zcmMvU2xvdC50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY29tcG9zZVJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgRnJhZ21lbnQsIGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIFNsb3QgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgY2hpbGRyZW4sIC4uLnNsb3RQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IGNoaWxkcmVuQXJyYXkgPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKTtcbiAgY29uc3Qgc2xvdHRhYmxlID0gY2hpbGRyZW5BcnJheS5maW5kKGlzU2xvdHRhYmxlKTtcbiAgaWYgKHNsb3R0YWJsZSkge1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBzbG90dGFibGUucHJvcHMuY2hpbGRyZW47XG4gICAgY29uc3QgbmV3Q2hpbGRyZW4gPSBjaGlsZHJlbkFycmF5Lm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZCA9PT0gc2xvdHRhYmxlKSB7XG4gICAgICAgIGlmIChSZWFjdC5DaGlsZHJlbi5jb3VudChuZXdFbGVtZW50KSA+IDEpIHJldHVybiBSZWFjdC5DaGlsZHJlbi5vbmx5KG51bGwpO1xuICAgICAgICByZXR1cm4gUmVhY3QuaXNWYWxpZEVsZW1lbnQobmV3RWxlbWVudCkgPyBuZXdFbGVtZW50LnByb3BzLmNoaWxkcmVuIDogbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChTbG90Q2xvbmUsIHsgLi4uc2xvdFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiwgY2hpbGRyZW46IFJlYWN0LmlzVmFsaWRFbGVtZW50KG5ld0VsZW1lbnQpID8gUmVhY3QuY2xvbmVFbGVtZW50KG5ld0VsZW1lbnQsIHZvaWQgMCwgbmV3Q2hpbGRyZW4pIDogbnVsbCB9KTtcbiAgfVxuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChTbG90Q2xvbmUsIHsgLi4uc2xvdFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiwgY2hpbGRyZW4gfSk7XG59KTtcblNsb3QuZGlzcGxheU5hbWUgPSBcIlNsb3RcIjtcbnZhciBTbG90Q2xvbmUgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgY2hpbGRyZW4sIC4uLnNsb3RQcm9wcyB9ID0gcHJvcHM7XG4gIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICBjb25zdCBjaGlsZHJlblJlZiA9IGdldEVsZW1lbnRSZWYoY2hpbGRyZW4pO1xuICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICAgIC4uLm1lcmdlUHJvcHMoc2xvdFByb3BzLCBjaGlsZHJlbi5wcm9wcyksXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZWY6IGZvcndhcmRlZFJlZiA/IGNvbXBvc2VSZWZzKGZvcndhcmRlZFJlZiwgY2hpbGRyZW5SZWYpIDogY2hpbGRyZW5SZWZcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID4gMSA/IFJlYWN0LkNoaWxkcmVuLm9ubHkobnVsbCkgOiBudWxsO1xufSk7XG5TbG90Q2xvbmUuZGlzcGxheU5hbWUgPSBcIlNsb3RDbG9uZVwiO1xudmFyIFNsb3R0YWJsZSA9ICh7IGNoaWxkcmVuIH0pID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goRnJhZ21lbnQsIHsgY2hpbGRyZW4gfSk7XG59O1xuZnVuY3Rpb24gaXNTbG90dGFibGUoY2hpbGQpIHtcbiAgcmV0dXJuIFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkKSAmJiBjaGlsZC50eXBlID09PSBTbG90dGFibGU7XG59XG5mdW5jdGlvbiBtZXJnZVByb3BzKHNsb3RQcm9wcywgY2hpbGRQcm9wcykge1xuICBjb25zdCBvdmVycmlkZVByb3BzID0geyAuLi5jaGlsZFByb3BzIH07XG4gIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gY2hpbGRQcm9wcykge1xuICAgIGNvbnN0IHNsb3RQcm9wVmFsdWUgPSBzbG90UHJvcHNbcHJvcE5hbWVdO1xuICAgIGNvbnN0IGNoaWxkUHJvcFZhbHVlID0gY2hpbGRQcm9wc1twcm9wTmFtZV07XG4gICAgY29uc3QgaXNIYW5kbGVyID0gL15vbltBLVpdLy50ZXN0KHByb3BOYW1lKTtcbiAgICBpZiAoaXNIYW5kbGVyKSB7XG4gICAgICBpZiAoc2xvdFByb3BWYWx1ZSAmJiBjaGlsZFByb3BWYWx1ZSkge1xuICAgICAgICBvdmVycmlkZVByb3BzW3Byb3BOYW1lXSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgY2hpbGRQcm9wVmFsdWUoLi4uYXJncyk7XG4gICAgICAgICAgc2xvdFByb3BWYWx1ZSguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoc2xvdFByb3BWYWx1ZSkge1xuICAgICAgICBvdmVycmlkZVByb3BzW3Byb3BOYW1lXSA9IHNsb3RQcm9wVmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICBvdmVycmlkZVByb3BzW3Byb3BOYW1lXSA9IHsgLi4uc2xvdFByb3BWYWx1ZSwgLi4uY2hpbGRQcm9wVmFsdWUgfTtcbiAgICB9IGVsc2UgaWYgKHByb3BOYW1lID09PSBcImNsYXNzTmFtZVwiKSB7XG4gICAgICBvdmVycmlkZVByb3BzW3Byb3BOYW1lXSA9IFtzbG90UHJvcFZhbHVlLCBjaGlsZFByb3BWYWx1ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyAuLi5zbG90UHJvcHMsIC4uLm92ZXJyaWRlUHJvcHMgfTtcbn1cbmZ1bmN0aW9uIGdldEVsZW1lbnRSZWYoZWxlbWVudCkge1xuICBsZXQgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlbGVtZW50LnByb3BzLCBcInJlZlwiKT8uZ2V0O1xuICBsZXQgbWF5V2FybiA9IGdldHRlciAmJiBcImlzUmVhY3RXYXJuaW5nXCIgaW4gZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZztcbiAgaWYgKG1heVdhcm4pIHtcbiAgICByZXR1cm4gZWxlbWVudC5yZWY7XG4gIH1cbiAgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlbGVtZW50LCBcInJlZlwiKT8uZ2V0O1xuICBtYXlXYXJuID0gZ2V0dGVyICYmIFwiaXNSZWFjdFdhcm5pbmdcIiBpbiBnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nO1xuICBpZiAobWF5V2Fybikge1xuICAgIHJldHVybiBlbGVtZW50LnByb3BzLnJlZjtcbiAgfVxuICByZXR1cm4gZWxlbWVudC5wcm9wcy5yZWYgfHwgZWxlbWVudC5yZWY7XG59XG52YXIgUm9vdCA9IFNsb3Q7XG5leHBvcnQge1xuICBSb290LFxuICBTbG90LFxuICBTbG90dGFibGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC91c2UtY2FsbGJhY2stcmVmL3NyYy91c2VDYWxsYmFja1JlZi50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gdXNlQ2FsbGJhY2tSZWYoY2FsbGJhY2spIHtcbiAgY29uc3QgY2FsbGJhY2tSZWYgPSBSZWFjdC51c2VSZWYoY2FsbGJhY2spO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNhbGxiYWNrUmVmLmN1cnJlbnQgPSBjYWxsYmFjaztcbiAgfSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICguLi5hcmdzKSA9PiBjYWxsYmFja1JlZi5jdXJyZW50Py4oLi4uYXJncyksIFtdKTtcbn1cbmV4cG9ydCB7XG4gIHVzZUNhbGxiYWNrUmVmXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvdXNlLWNvbnRyb2xsYWJsZS1zdGF0ZS9zcmMvdXNlQ29udHJvbGxhYmxlU3RhdGUudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmXCI7XG5mdW5jdGlvbiB1c2VDb250cm9sbGFibGVTdGF0ZSh7XG4gIHByb3AsXG4gIGRlZmF1bHRQcm9wLFxuICBvbkNoYW5nZSA9ICgpID0+IHtcbiAgfVxufSkge1xuICBjb25zdCBbdW5jb250cm9sbGVkUHJvcCwgc2V0VW5jb250cm9sbGVkUHJvcF0gPSB1c2VVbmNvbnRyb2xsZWRTdGF0ZSh7IGRlZmF1bHRQcm9wLCBvbkNoYW5nZSB9KTtcbiAgY29uc3QgaXNDb250cm9sbGVkID0gcHJvcCAhPT0gdm9pZCAwO1xuICBjb25zdCB2YWx1ZSA9IGlzQ29udHJvbGxlZCA/IHByb3AgOiB1bmNvbnRyb2xsZWRQcm9wO1xuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFja1JlZihvbkNoYW5nZSk7XG4gIGNvbnN0IHNldFZhbHVlID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgKG5leHRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGlzQ29udHJvbGxlZCkge1xuICAgICAgICBjb25zdCBzZXR0ZXIgPSBuZXh0VmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlMiA9IHR5cGVvZiBuZXh0VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHNldHRlcihwcm9wKSA6IG5leHRWYWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlMiAhPT0gcHJvcCkgaGFuZGxlQ2hhbmdlKHZhbHVlMik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRVbmNvbnRyb2xsZWRQcm9wKG5leHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbaXNDb250cm9sbGVkLCBwcm9wLCBzZXRVbmNvbnRyb2xsZWRQcm9wLCBoYW5kbGVDaGFuZ2VdXG4gICk7XG4gIHJldHVybiBbdmFsdWUsIHNldFZhbHVlXTtcbn1cbmZ1bmN0aW9uIHVzZVVuY29udHJvbGxlZFN0YXRlKHtcbiAgZGVmYXVsdFByb3AsXG4gIG9uQ2hhbmdlXG59KSB7XG4gIGNvbnN0IHVuY29udHJvbGxlZFN0YXRlID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdFByb3ApO1xuICBjb25zdCBbdmFsdWVdID0gdW5jb250cm9sbGVkU3RhdGU7XG4gIGNvbnN0IHByZXZWYWx1ZVJlZiA9IFJlYWN0LnVzZVJlZih2YWx1ZSk7XG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrUmVmKG9uQ2hhbmdlKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocHJldlZhbHVlUmVmLmN1cnJlbnQgIT09IHZhbHVlKSB7XG4gICAgICBoYW5kbGVDaGFuZ2UodmFsdWUpO1xuICAgICAgcHJldlZhbHVlUmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICB9XG4gIH0sIFt2YWx1ZSwgcHJldlZhbHVlUmVmLCBoYW5kbGVDaGFuZ2VdKTtcbiAgcmV0dXJuIHVuY29udHJvbGxlZFN0YXRlO1xufVxuZXhwb3J0IHtcbiAgdXNlQ29udHJvbGxhYmxlU3RhdGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC91c2UtZXNjYXBlLWtleWRvd24vc3JjL3VzZUVzY2FwZUtleWRvd24udHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmXCI7XG5mdW5jdGlvbiB1c2VFc2NhcGVLZXlkb3duKG9uRXNjYXBlS2V5RG93blByb3AsIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzPy5kb2N1bWVudCkge1xuICBjb25zdCBvbkVzY2FwZUtleURvd24gPSB1c2VDYWxsYmFja1JlZihvbkVzY2FwZUtleURvd25Qcm9wKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIG9uRXNjYXBlS2V5RG93bihldmVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBvd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gKCkgPT4gb3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH0sIFtvbkVzY2FwZUtleURvd24sIG93bmVyRG9jdW1lbnRdKTtcbn1cbmV4cG9ydCB7XG4gIHVzZUVzY2FwZUtleWRvd25cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC91c2UtbGF5b3V0LWVmZmVjdC9zcmMvdXNlTGF5b3V0RWZmZWN0LnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgdXNlTGF5b3V0RWZmZWN0MiA9IEJvb2xlYW4oZ2xvYmFsVGhpcz8uZG9jdW1lbnQpID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogKCkgPT4ge1xufTtcbmV4cG9ydCB7XG4gIHVzZUxheW91dEVmZmVjdDIgYXMgdXNlTGF5b3V0RWZmZWN0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvdXNlLXNpemUvc3JjL3VzZVNpemUudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3RcIjtcbmZ1bmN0aW9uIHVzZVNpemUoZWxlbWVudCkge1xuICBjb25zdCBbc2l6ZSwgc2V0U2l6ZV0gPSBSZWFjdC51c2VTdGF0ZSh2b2lkIDApO1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBzZXRTaXplKHsgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQgfSk7XG4gICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cmllcykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbMF07XG4gICAgICAgIGxldCB3aWR0aDtcbiAgICAgICAgbGV0IGhlaWdodDtcbiAgICAgICAgaWYgKFwiYm9yZGVyQm94U2l6ZVwiIGluIGVudHJ5KSB7XG4gICAgICAgICAgY29uc3QgYm9yZGVyU2l6ZUVudHJ5ID0gZW50cnlbXCJib3JkZXJCb3hTaXplXCJdO1xuICAgICAgICAgIGNvbnN0IGJvcmRlclNpemUgPSBBcnJheS5pc0FycmF5KGJvcmRlclNpemVFbnRyeSkgPyBib3JkZXJTaXplRW50cnlbMF0gOiBib3JkZXJTaXplRW50cnk7XG4gICAgICAgICAgd2lkdGggPSBib3JkZXJTaXplW1wiaW5saW5lU2l6ZVwiXTtcbiAgICAgICAgICBoZWlnaHQgPSBib3JkZXJTaXplW1wiYmxvY2tTaXplXCJdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBzZXRTaXplKHsgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAgIH0pO1xuICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGJveDogXCJib3JkZXItYm94XCIgfSk7XG4gICAgICByZXR1cm4gKCkgPT4gcmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTaXplKHZvaWQgMCk7XG4gICAgfVxuICB9LCBbZWxlbWVudF0pO1xuICByZXR1cm4gc2l6ZTtcbn1cbmV4cG9ydCB7XG4gIHVzZVNpemVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMsIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovIGltcG9ydCB7IG1ha2VSZXF1ZXN0Q2FsbCwgbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyIH0gZnJvbSAnLi9tYWtlUmVxdWVzdENhbGwuanMnO1xuZXhwb3J0IGNsYXNzIEFzYXBRdWV1ZSB7XG4gICAgLy8gVXNlIHRoZSBmYXN0ZXN0IG1lYW5zIHBvc3NpYmxlIHRvIGV4ZWN1dGUgYSB0YXNrIGluIGl0cyBvd24gdHVybiwgd2l0aFxuICAgIC8vIHByaW9yaXR5IG92ZXIgb3RoZXIgZXZlbnRzIGluY2x1ZGluZyBJTywgYW5pbWF0aW9uLCByZWZsb3csIGFuZCByZWRyYXdcbiAgICAvLyBldmVudHMgaW4gYnJvd3NlcnMuXG4gICAgLy9cbiAgICAvLyBBbiBleGNlcHRpb24gdGhyb3duIGJ5IGEgdGFzayB3aWxsIHBlcm1hbmVudGx5IGludGVycnVwdCB0aGUgcHJvY2Vzc2luZyBvZlxuICAgIC8vIHN1YnNlcXVlbnQgdGFza3MuIFRoZSBoaWdoZXIgbGV2ZWwgYGFzYXBgIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCBpZiBhblxuICAgIC8vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgYSB0YXNrLCB0aGF0IHRoZSB0YXNrIHF1ZXVlIHdpbGwgY29udGludWUgZmx1c2hpbmcgYXNcbiAgICAvLyBzb29uIGFzIHBvc3NpYmxlLCBidXQgaWYgeW91IHVzZSBgcmF3QXNhcGAgZGlyZWN0bHksIHlvdSBhcmUgcmVzcG9uc2libGUgdG9cbiAgICAvLyBlaXRoZXIgZW5zdXJlIHRoYXQgbm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20geW91ciB0YXNrLCBvciB0byBtYW51YWxseVxuICAgIC8vIGNhbGwgYHJhd0FzYXAucmVxdWVzdEZsdXNoYCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLlxuICAgIGVucXVldWVUYXNrKHRhc2spIHtcbiAgICAgICAgY29uc3QgeyBxdWV1ZTogcSAsIHJlcXVlc3RGbHVzaCAgfSA9IHRoaXM7XG4gICAgICAgIGlmICghcS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlcXVlc3RGbHVzaCgpO1xuICAgICAgICAgICAgdGhpcy5mbHVzaGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXF1aXZhbGVudCB0byBwdXNoLCBidXQgYXZvaWRzIGEgZnVuY3Rpb24gY2FsbC5cbiAgICAgICAgcVtxLmxlbmd0aF0gPSB0YXNrO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgICAgIC8vIFdlIHF1ZXVlIGVycm9ycyB0byBlbnN1cmUgdGhleSBhcmUgdGhyb3duIGluIHJpZ2h0IG9yZGVyIChGSUZPKS5cbiAgICAgICAgLy8gQXJyYXktYXMtcXVldWUgaXMgZ29vZCBlbm91Z2ggaGVyZSwgc2luY2Ugd2UgYXJlIGp1c3QgZGVhbGluZyB3aXRoIGV4Y2VwdGlvbnMuXG4gICAgICAgIHRoaXMucGVuZGluZ0Vycm9ycyA9IFtdO1xuICAgICAgICAvLyBPbmNlIGEgZmx1c2ggaGFzIGJlZW4gcmVxdWVzdGVkLCBubyBmdXJ0aGVyIGNhbGxzIHRvIGByZXF1ZXN0Rmx1c2hgIGFyZVxuICAgICAgICAvLyBuZWNlc3NhcnkgdW50aWwgdGhlIG5leHQgYGZsdXNoYCBjb21wbGV0ZXMuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5mbHVzaGluZyA9IGZhbHNlO1xuICAgICAgICAvLyBUaGUgcG9zaXRpb24gb2YgdGhlIG5leHQgdGFzayB0byBleGVjdXRlIGluIHRoZSB0YXNrIHF1ZXVlLiBUaGlzIGlzXG4gICAgICAgIC8vIHByZXNlcnZlZCBiZXR3ZWVuIGNhbGxzIHRvIGBmbHVzaGAgc28gdGhhdCBpdCBjYW4gYmUgcmVzdW1lZCBpZlxuICAgICAgICAvLyBhIHRhc2sgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIC8vIElmIGEgdGFzayBzY2hlZHVsZXMgYWRkaXRpb25hbCB0YXNrcyByZWN1cnNpdmVseSwgdGhlIHRhc2sgcXVldWUgY2FuIGdyb3dcbiAgICAgICAgLy8gdW5ib3VuZGVkLiBUbyBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uLCB0aGUgdGFzayBxdWV1ZSB3aWxsIHBlcmlvZGljYWxseVxuICAgICAgICAvLyB0cnVuY2F0ZSBhbHJlYWR5LWNvbXBsZXRlZCB0YXNrcy5cbiAgICAgICAgdGhpcy5jYXBhY2l0eSA9IDEwMjQ7XG4gICAgICAgIC8vIFRoZSBmbHVzaCBmdW5jdGlvbiBwcm9jZXNzZXMgYWxsIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIHNjaGVkdWxlZCB3aXRoXG4gICAgICAgIC8vIGByYXdBc2FwYCB1bmxlc3MgYW5kIHVudGlsIG9uZSBvZiB0aG9zZSB0YXNrcyB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgICAgICAvLyBJZiBhIHRhc2sgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgYGZsdXNoYCBlbnN1cmVzIHRoYXQgaXRzIHN0YXRlIHdpbGwgcmVtYWluXG4gICAgICAgIC8vIGNvbnNpc3RlbnQgYW5kIHdpbGwgcmVzdW1lIHdoZXJlIGl0IGxlZnQgb2ZmIHdoZW4gY2FsbGVkIGFnYWluLlxuICAgICAgICAvLyBIb3dldmVyLCBgZmx1c2hgIGRvZXMgbm90IG1ha2UgYW55IGFycmFuZ2VtZW50cyB0byBiZSBjYWxsZWQgYWdhaW4gaWYgYW5cbiAgICAgICAgLy8gZXhjZXB0aW9uIGlzIHRocm93bi5cbiAgICAgICAgdGhpcy5mbHVzaCA9ICgpPT57XG4gICAgICAgICAgICBjb25zdCB7IHF1ZXVlOiBxICB9ID0gdGhpcztcbiAgICAgICAgICAgIHdoaWxlKHRoaXMuaW5kZXggPCBxLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIHRoZSBpbmRleCBiZWZvcmUgY2FsbGluZyB0aGUgdGFzay4gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbFxuICAgICAgICAgICAgICAgIC8vIGJlZ2luIGZsdXNoaW5nIG9uIHRoZSBuZXh0IHRhc2sgdGhlIHRhc2sgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgICAgICAgICBxW2N1cnJlbnRJbmRleF0uY2FsbCgpO1xuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgbGVha2luZyBtZW1vcnkgZm9yIGxvbmcgY2hhaW5zIG9mIHJlY3Vyc2l2ZSBjYWxscyB0byBgYXNhcGAuXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgY2FsbCBgYXNhcGAgd2l0aGluIHRhc2tzIHNjaGVkdWxlZCBieSBgYXNhcGAsIHRoZSBxdWV1ZSB3aWxsXG4gICAgICAgICAgICAgICAgLy8gZ3JvdywgYnV0IHRvIGF2b2lkIGFuIE8obikgd2FsayBmb3IgZXZlcnkgdGFzayB3ZSBleGVjdXRlLCB3ZSBkb24ndFxuICAgICAgICAgICAgICAgIC8vIHNoaWZ0IHRhc2tzIG9mZiB0aGUgcXVldWUgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZXhlY3V0ZWQuXG4gICAgICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2UgcGVyaW9kaWNhbGx5IHNoaWZ0IDEwMjQgdGFza3Mgb2ZmIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmRleCA+IHRoaXMuY2FwYWNpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFudWFsbHkgc2hpZnQgYWxsIHZhbHVlcyBzdGFydGluZyBhdCB0aGUgaW5kZXggYmFjayB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBzY2FuID0gMCwgbmV3TGVuZ3RoID0gcS5sZW5ndGggLSB0aGlzLmluZGV4OyBzY2FuIDwgbmV3TGVuZ3RoOyBzY2FuKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgcVtzY2FuXSA9IHFbc2NhbiArIHRoaXMuaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHEubGVuZ3RoIC09IHRoaXMuaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHEubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICAgICAgdGhpcy5mbHVzaGluZyA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICAvLyBJbiBhIHdlYiBicm93c2VyLCBleGNlcHRpb25zIGFyZSBub3QgZmF0YWwuIEhvd2V2ZXIsIHRvIGF2b2lkXG4gICAgICAgIC8vIHNsb3dpbmcgZG93biB0aGUgcXVldWUgb2YgcGVuZGluZyB0YXNrcywgd2UgcmV0aHJvdyB0aGUgZXJyb3IgaW4gYVxuICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB0dXJuLlxuICAgICAgICB0aGlzLnJlZ2lzdGVyUGVuZGluZ0Vycm9yID0gKGVycik9PntcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0Vycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RFcnJvclRocm93KCk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGByZXF1ZXN0Rmx1c2hgIHJlcXVlc3RzIHRoYXQgdGhlIGhpZ2ggcHJpb3JpdHkgZXZlbnQgcXVldWUgYmUgZmx1c2hlZCBhc1xuICAgICAgICAvLyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAvLyBUaGlzIGlzIHVzZWZ1bCB0byBwcmV2ZW50IGFuIGVycm9yIHRocm93biBpbiBhIHRhc2sgZnJvbSBzdGFsbGluZyB0aGUgZXZlbnRcbiAgICAgICAgLy8gcXVldWUgaWYgdGhlIGV4Y2VwdGlvbiBoYW5kbGVkIGJ5IE5vZGUuanPigJlzXG4gICAgICAgIC8vIGBwcm9jZXNzLm9uKFwidW5jYXVnaHRFeGNlcHRpb25cIilgIG9yIGJ5IGEgZG9tYWluLlxuICAgICAgICAvLyBgcmVxdWVzdEZsdXNoYCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHN0cmF0ZWd5IGJhc2VkIG9uIGRhdGEgY29sbGVjdGVkIGZyb21cbiAgICAgICAgLy8gZXZlcnkgYXZhaWxhYmxlIFNhdWNlTGFicyBTZWxlbml1bSB3ZWIgZHJpdmVyIHdvcmtlciBhdCB0aW1lIG9mIHdyaXRpbmcuXG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFtRy01VVlHdXA1cXhHZEVNV2toUDZCV0N6MDUzTlViMkUxUW9VVFUxNnVBL2VkaXQjZ2lkPTc4MzcyNDU5M1xuICAgICAgICB0aGlzLnJlcXVlc3RGbHVzaCA9IG1ha2VSZXF1ZXN0Q2FsbCh0aGlzLmZsdXNoKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RXJyb3JUaHJvdyA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcigoKT0+e1xuICAgICAgICAgICAgLy8gVGhyb3cgZmlyc3QgZXJyb3JcbiAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5wZW5kaW5nRXJyb3JzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn0gLy8gVGhlIG1lc3NhZ2UgY2hhbm5lbCB0ZWNobmlxdWUgd2FzIGRpc2NvdmVyZWQgYnkgTWFsdGUgVWJsIGFuZCB3YXMgdGhlXG4gLy8gb3JpZ2luYWwgZm91bmRhdGlvbiBmb3IgdGhpcyBsaWJyYXJ5LlxuIC8vIGh0dHA6Ly93d3cubm9uYmxvY2tpbmcuaW8vMjAxMS8wNi93aW5kb3duZXh0dGljay5odG1sXG4gLy8gU2FmYXJpIDYuMC41IChhdCBsZWFzdCkgaW50ZXJtaXR0ZW50bHkgZmFpbHMgdG8gY3JlYXRlIG1lc3NhZ2UgcG9ydHMgb24gYVxuIC8vIHBhZ2UncyBmaXJzdCBsb2FkLiBUaGFua2Z1bGx5LCB0aGlzIHZlcnNpb24gb2YgU2FmYXJpIHN1cHBvcnRzXG4gLy8gTXV0YXRpb25PYnNlcnZlcnMsIHNvIHdlIGRvbid0IG5lZWQgdG8gZmFsbCBiYWNrIGluIHRoYXQgY2FzZS5cbiAvLyBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tTWVzc2FnZUNoYW5uZWwoY2FsbGJhY2spIHtcbiAvLyAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAvLyAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbiAvLyAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuIC8vICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbiAvLyAgICAgfTtcbiAvLyB9XG4gLy8gRm9yIHJlYXNvbnMgZXhwbGFpbmVkIGFib3ZlLCB3ZSBhcmUgYWxzbyB1bmFibGUgdG8gdXNlIGBzZXRJbW1lZGlhdGVgXG4gLy8gdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMuXG4gLy8gRXZlbiBpZiB3ZSB3ZXJlLCB0aGVyZSBpcyBhbm90aGVyIGJ1ZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMC5cbiAvLyBJdCBpcyBub3Qgc3VmZmljaWVudCB0byBhc3NpZ24gYHNldEltbWVkaWF0ZWAgdG8gYHJlcXVlc3RGbHVzaGAgYmVjYXVzZVxuIC8vIGBzZXRJbW1lZGlhdGVgIG11c3QgYmUgY2FsbGVkICpieSBuYW1lKiBhbmQgdGhlcmVmb3JlIG11c3QgYmUgd3JhcHBlZCBpbiBhXG4gLy8gY2xvc3VyZS5cbiAvLyBOZXZlciBmb3JnZXQuXG4gLy8gZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuIC8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4gLy8gICAgICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuIC8vICAgICB9O1xuIC8vIH1cbiAvLyBTYWZhcmkgNi4wIGhhcyBhIHByb2JsZW0gd2hlcmUgdGltZXJzIHdpbGwgZ2V0IGxvc3Qgd2hpbGUgdGhlIHVzZXIgaXNcbiAvLyBzY3JvbGxpbmcuIFRoaXMgcHJvYmxlbSBkb2VzIG5vdCBpbXBhY3QgQVNBUCBiZWNhdXNlIFNhZmFyaSA2LjAgc3VwcG9ydHNcbiAvLyBtdXRhdGlvbiBvYnNlcnZlcnMsIHNvIHRoYXQgaW1wbGVtZW50YXRpb24gaXMgdXNlZCBpbnN0ZWFkLlxuIC8vIEhvd2V2ZXIsIGlmIHdlIGV2ZXIgZWxlY3QgdG8gdXNlIHRpbWVycyBpbiBTYWZhcmksIHRoZSBwcmV2YWxlbnQgd29yay1hcm91bmRcbiAvLyBpcyB0byBhZGQgYSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIgdGhhdCBjYWxscyBmb3IgYSBmbHVzaC5cbiAvLyBgc2V0VGltZW91dGAgZG9lcyBub3QgY2FsbCB0aGUgcGFzc2VkIGNhbGxiYWNrIGlmIHRoZSBkZWxheSBpcyBsZXNzIHRoYW5cbiAvLyBhcHByb3hpbWF0ZWx5IDcgaW4gd2ViIHdvcmtlcnMgaW4gRmlyZWZveCA4IHRocm91Z2ggMTgsIGFuZCBzb21ldGltZXMgbm90XG4gLy8gZXZlbiB0aGVuLlxuIC8vIFRoaXMgaXMgZm9yIGBhc2FwLmpzYCBvbmx5LlxuIC8vIEl0cyBuYW1lIHdpbGwgYmUgcGVyaW9kaWNhbGx5IHJhbmRvbWl6ZWQgdG8gYnJlYWsgYW55IGNvZGUgdGhhdCBkZXBlbmRzIG9uXG4gLy8gLy8gaXRzIGV4aXN0ZW5jZS5cbiAvLyByYXdBc2FwLm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lciA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lclxuIC8vIEFTQVAgd2FzIG9yaWdpbmFsbHkgYSBuZXh0VGljayBzaGltIGluY2x1ZGVkIGluIFEuIFRoaXMgd2FzIGZhY3RvcmVkIG91dFxuIC8vIGludG8gdGhpcyBBU0FQIHBhY2thZ2UuIEl0IHdhcyBsYXRlciBhZGFwdGVkIHRvIFJTVlAgd2hpY2ggbWFkZSBmdXJ0aGVyXG4gLy8gYW1lbmRtZW50cy4gVGhlc2UgZGVjaXNpb25zLCBwYXJ0aWN1bGFybHkgdG8gbWFyZ2luYWxpemUgTWVzc2FnZUNoYW5uZWwgYW5kXG4gLy8gdG8gY2FwdHVyZSB0aGUgTXV0YXRpb25PYnNlcnZlciBpbXBsZW1lbnRhdGlvbiBpbiBhIGNsb3N1cmUsIHdlcmUgaW50ZWdyYXRlZFxuIC8vIGJhY2sgaW50byBBU0FQIHByb3Blci5cbiAvLyBodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9yc3ZwLmpzL2Jsb2IvY2RkZjcyMzI1NDZhOWNmODU4NTI0Yjc1Y2RlNmY5ZWRmNzI2MjBhNy9saWIvcnN2cC9hc2FwLmpzXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzYXBRdWV1ZS5qcy5tYXAiLCIvLyBgY2FsbGAsIGp1c3QgbGlrZSBhIGZ1bmN0aW9uLlxuZXhwb3J0IGNsYXNzIFJhd1Rhc2sge1xuICAgIGNhbGwoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnRhc2sgJiYgdGhpcy50YXNrKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHl7XG4gICAgICAgICAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZWxlYXNlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG9uRXJyb3IsIHJlbGVhc2Upe1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuICAgICAgICB0aGlzLnJlbGVhc2UgPSByZWxlYXNlO1xuICAgICAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmF3VGFzay5qcy5tYXAiLCJpbXBvcnQgeyBSYXdUYXNrIH0gZnJvbSAnLi9SYXdUYXNrLmpzJztcbmV4cG9ydCBjbGFzcyBUYXNrRmFjdG9yeSB7XG4gICAgY3JlYXRlKHRhc2spIHtcbiAgICAgICAgY29uc3QgdGFza3MgPSB0aGlzLmZyZWVUYXNrcztcbiAgICAgICAgY29uc3QgdDEgPSB0YXNrcy5sZW5ndGggPyB0YXNrcy5wb3AoKSA6IG5ldyBSYXdUYXNrKHRoaXMub25FcnJvciwgKHQpPT50YXNrc1t0YXNrcy5sZW5ndGhdID0gdFxuICAgICAgICApO1xuICAgICAgICB0MS50YXNrID0gdGFzaztcbiAgICAgICAgcmV0dXJuIHQxO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihvbkVycm9yKXtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gb25FcnJvcjtcbiAgICAgICAgdGhpcy5mcmVlVGFza3MgPSBbXTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhc2tGYWN0b3J5LmpzLm1hcCIsImltcG9ydCB7IEFzYXBRdWV1ZSB9IGZyb20gJy4vQXNhcFF1ZXVlLmpzJztcbmltcG9ydCB7IFRhc2tGYWN0b3J5IH0gZnJvbSAnLi9UYXNrRmFjdG9yeS5qcyc7XG5jb25zdCBhc2FwUXVldWUgPSBuZXcgQXNhcFF1ZXVlKCk7XG5jb25zdCB0YXNrRmFjdG9yeSA9IG5ldyBUYXNrRmFjdG9yeShhc2FwUXVldWUucmVnaXN0ZXJQZW5kaW5nRXJyb3IpO1xuLyoqXG4gKiBDYWxscyBhIHRhc2sgYXMgc29vbiBhcyBwb3NzaWJsZSBhZnRlciByZXR1cm5pbmcsIGluIGl0cyBvd24gZXZlbnQsIHdpdGggcHJpb3JpdHlcbiAqIG92ZXIgb3RoZXIgZXZlbnRzIGxpa2UgYW5pbWF0aW9uLCByZWZsb3csIGFuZCByZXBhaW50LiBBbiBlcnJvciB0aHJvd24gZnJvbSBhblxuICogZXZlbnQgd2lsbCBub3QgaW50ZXJydXB0LCBub3IgZXZlbiBzdWJzdGFudGlhbGx5IHNsb3cgZG93biB0aGUgcHJvY2Vzc2luZyBvZlxuICogb3RoZXIgZXZlbnRzLCBidXQgd2lsbCBiZSByYXRoZXIgcG9zdHBvbmVkIHRvIGEgbG93ZXIgcHJpb3JpdHkgZXZlbnQuXG4gKiBAcGFyYW0ge3tjYWxsfX0gdGFzayBBIGNhbGxhYmxlIG9iamVjdCwgdHlwaWNhbGx5IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBub1xuICogYXJndW1lbnRzLlxuICovIGV4cG9ydCBmdW5jdGlvbiBhc2FwKHRhc2spIHtcbiAgICBhc2FwUXVldWUuZW5xdWV1ZVRhc2sodGFza0ZhY3RvcnkuY3JlYXRlKHRhc2spKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXNhcC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL2FzYXAuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Bc2FwUXVldWUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9UYXNrRmFjdG9yeS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8gU2FmYXJpIDYgYW5kIDYuMSBmb3IgZGVza3RvcCwgaVBhZCwgYW5kIGlQaG9uZSBhcmUgdGhlIG9ubHkgYnJvd3NlcnMgdGhhdFxuLy8gaGF2ZSBXZWJLaXRNdXRhdGlvbk9ic2VydmVyIGJ1dCBub3QgdW4tcHJlZml4ZWQgTXV0YXRpb25PYnNlcnZlci5cbi8vIE11c3QgdXNlIGBnbG9iYWxgIG9yIGBzZWxmYCBpbnN0ZWFkIG9mIGB3aW5kb3dgIHRvIHdvcmsgaW4gYm90aCBmcmFtZXMgYW5kIHdlYlxuLy8gd29ya2Vycy4gYGdsb2JhbGAgaXMgYSBwcm92aXNpb24gb2YgQnJvd3NlcmlmeSwgTXIsIE1ycywgb3IgTW9wLlxuLyogZ2xvYmFscyBzZWxmICovIGNvbnN0IHNjb3BlID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiBzZWxmO1xuY29uc3QgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPSBzY29wZS5NdXRhdGlvbk9ic2VydmVyIHx8IHNjb3BlLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5leHBvcnQgZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICAvLyBXZSBkaXNwYXRjaCBhIHRpbWVvdXQgd2l0aCBhIHNwZWNpZmllZCBkZWxheSBvZiAwIGZvciBlbmdpbmVzIHRoYXRcbiAgICAgICAgLy8gY2FuIHJlbGlhYmx5IGFjY29tbW9kYXRlIHRoYXQgcmVxdWVzdC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgc25hcHBlZFxuICAgICAgICAvLyB0byBhIDQgbWlsaXNlY29uZCBkZWxheSwgYnV0IG9uY2Ugd2UncmUgZmx1c2hpbmcsIHRoZXJlJ3Mgbm8gZGVsYXlcbiAgICAgICAgLy8gYmV0d2VlbiBldmVudHMuXG4gICAgICAgIGNvbnN0IHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGhhbmRsZVRpbWVyLCAwKTtcbiAgICAgICAgLy8gSG93ZXZlciwgc2luY2UgdGhpcyB0aW1lciBnZXRzIGZyZXF1ZW50bHkgZHJvcHBlZCBpbiBGaXJlZm94XG4gICAgICAgIC8vIHdvcmtlcnMsIHdlIGVubGlzdCBhbiBpbnRlcnZhbCBoYW5kbGUgdGhhdCB3aWxsIHRyeSB0byBmaXJlXG4gICAgICAgIC8vIGFuIGV2ZW50IDIwIHRpbWVzIHBlciBzZWNvbmQgdW50aWwgaXQgc3VjY2VlZHMuXG4gICAgICAgIGNvbnN0IGludGVydmFsSGFuZGxlID0gc2V0SW50ZXJ2YWwoaGFuZGxlVGltZXIsIDUwKTtcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlVGltZXIoKSB7XG4gICAgICAgICAgICAvLyBXaGljaGV2ZXIgdGltZXIgc3VjY2VlZHMgd2lsbCBjYW5jZWwgYm90aCB0aW1lcnMgYW5kXG4gICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBjYWxsYmFjay5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxIYW5kbGUpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vLyBUbyByZXF1ZXN0IGEgaGlnaCBwcmlvcml0eSBldmVudCwgd2UgaW5kdWNlIGEgbXV0YXRpb24gb2JzZXJ2ZXIgYnkgdG9nZ2xpbmdcbi8vIHRoZSB0ZXh0IG9mIGEgdGV4dCBub2RlIGJldHdlZW4gXCIxXCIgYW5kIFwiLTFcIi5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaykge1xuICAgIGxldCB0b2dnbGUgPSAxO1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwge1xuICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICB0b2dnbGUgPSAtdG9nZ2xlO1xuICAgICAgICBub2RlLmRhdGEgPSB0b2dnbGU7XG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBtYWtlUmVxdWVzdENhbGwgPSB0eXBlb2YgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicgPyAvLyByZWxpYWJseSBldmVyeXdoZXJlIHRoZXkgYXJlIGltcGxlbWVudGVkLlxuLy8gVGhleSBhcmUgaW1wbGVtZW50ZWQgaW4gYWxsIG1vZGVybiBicm93c2Vycy5cbi8vXG4vLyAtIEFuZHJvaWQgNC00LjNcbi8vIC0gQ2hyb21lIDI2LTM0XG4vLyAtIEZpcmVmb3ggMTQtMjlcbi8vIC0gSW50ZXJuZXQgRXhwbG9yZXIgMTFcbi8vIC0gaVBhZCBTYWZhcmkgNi03LjFcbi8vIC0gaVBob25lIFNhZmFyaSA3LTcuMVxuLy8gLSBTYWZhcmkgNi03XG5tYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlciA6IC8vIHRhc2sgcXVldWUsIGFyZSBpbXBsZW1lbnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCwgU2FmYXJpIDUuMC0xLCBhbmQgT3BlcmFcbi8vIDExLTEyLCBhbmQgaW4gd2ViIHdvcmtlcnMgaW4gbWFueSBlbmdpbmVzLlxuLy8gQWx0aG91Z2ggbWVzc2FnZSBjaGFubmVscyB5aWVsZCB0byBhbnkgcXVldWVkIHJlbmRlcmluZyBhbmQgSU8gdGFza3MsIHRoZXlcbi8vIHdvdWxkIGJlIGJldHRlciB0aGFuIGltcG9zaW5nIHRoZSA0bXMgZGVsYXkgb2YgdGltZXJzLlxuLy8gSG93ZXZlciwgdGhleSBkbyBub3Qgd29yayByZWxpYWJseSBpbiBJbnRlcm5ldCBFeHBsb3JlciBvciBTYWZhcmkuXG4vLyBJbnRlcm5ldCBFeHBsb3JlciAxMCBpcyB0aGUgb25seSBicm93c2VyIHRoYXQgaGFzIHNldEltbWVkaWF0ZSBidXQgZG9lc1xuLy8gbm90IGhhdmUgTXV0YXRpb25PYnNlcnZlcnMuXG4vLyBBbHRob3VnaCBzZXRJbW1lZGlhdGUgeWllbGRzIHRvIHRoZSBicm93c2VyJ3MgcmVuZGVyZXIsIGl0IHdvdWxkIGJlXG4vLyBwcmVmZXJyYWJsZSB0byBmYWxsaW5nIGJhY2sgdG8gc2V0VGltZW91dCBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlXG4vLyB0aGUgbWluaW11bSA0bXMgcGVuYWx0eS5cbi8vIFVuZm9ydHVuYXRlbHkgdGhlcmUgYXBwZWFycyB0byBiZSBhIGJ1ZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCBNb2JpbGUgKGFuZFxuLy8gRGVza3RvcCB0byBhIGxlc3NlciBleHRlbnQpIHRoYXQgcmVuZGVycyBib3RoIHNldEltbWVkaWF0ZSBhbmRcbi8vIE1lc3NhZ2VDaGFubmVsIHVzZWxlc3MgZm9yIHRoZSBwdXJwb3NlcyBvZiBBU0FQLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL2lzc3Vlcy8zOTZcbi8vIFRpbWVycyBhcmUgaW1wbGVtZW50ZWQgdW5pdmVyc2FsbHkuXG4vLyBXZSBmYWxsIGJhY2sgdG8gdGltZXJzIGluIHdvcmtlcnMgaW4gbW9zdCBlbmdpbmVzLCBhbmQgaW4gZm9yZWdyb3VuZFxuLy8gY29udGV4dHMgaW4gdGhlIGZvbGxvd2luZyBicm93c2Vycy5cbi8vIEhvd2V2ZXIsIG5vdGUgdGhhdCBldmVuIHRoaXMgc2ltcGxlIGNhc2UgcmVxdWlyZXMgbnVhbmNlcyB0byBvcGVyYXRlIGluIGFcbi8vIGJyb2FkIHNwZWN0cnVtIG9mIGJyb3dzZXJzLlxuLy9cbi8vIC0gRmlyZWZveCAzLTEzXG4vLyAtIEludGVybmV0IEV4cGxvcmVyIDYtOVxuLy8gLSBpUGFkIFNhZmFyaSA0LjNcbi8vIC0gTHlueCAyLjguN1xubWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYWtlUmVxdWVzdENhbGwuanMubWFwIiwiZXhwb3J0IHsgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncykge1xuICAgIGlmIChpc1Byb2R1Y3Rpb24oKSkge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgKyAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhcmdJbmRleCA9IDA7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMSAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgICAgICA7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUHJvZHVjdGlvbigpIHtcbiAgICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52WydOT0RFX0VOViddID09PSAncHJvZHVjdGlvbic7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIHNyYy9pbmRleC50c1xuZXhwb3J0ICogZnJvbSBcInJlZHV4XCI7XG5pbXBvcnQgeyBwcm9kdWNlLCBjdXJyZW50IGFzIGN1cnJlbnQzLCBmcmVlemUsIG9yaWdpbmFsIGFzIG9yaWdpbmFsMiwgaXNEcmFmdCBhcyBpc0RyYWZ0NSB9IGZyb20gXCJpbW1lclwiO1xuaW1wb3J0IHsgY3JlYXRlU2VsZWN0b3IsIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvciBhcyBjcmVhdGVTZWxlY3RvckNyZWF0b3IyLCBscnVNZW1vaXplLCB3ZWFrTWFwTWVtb2l6ZSBhcyB3ZWFrTWFwTWVtb2l6ZTIgfSBmcm9tIFwicmVzZWxlY3RcIjtcblxuLy8gc3JjL2NyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yLnRzXG5pbXBvcnQgeyBjdXJyZW50LCBpc0RyYWZ0IH0gZnJvbSBcImltbWVyXCI7XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RvckNyZWF0b3IsIHdlYWtNYXBNZW1vaXplIH0gZnJvbSBcInJlc2VsZWN0XCI7XG52YXIgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JDcmVhdG9yID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgY3JlYXRlU2VsZWN0b3IyID0gY3JlYXRlU2VsZWN0b3JDcmVhdG9yKC4uLmFyZ3MpO1xuICBjb25zdCBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjIgPSBPYmplY3QuYXNzaWduKCguLi5hcmdzMikgPT4ge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IyKC4uLmFyZ3MyKTtcbiAgICBjb25zdCB3cmFwcGVkU2VsZWN0b3IgPSAodmFsdWUsIC4uLnJlc3QpID0+IHNlbGVjdG9yKGlzRHJhZnQodmFsdWUpID8gY3VycmVudCh2YWx1ZSkgOiB2YWx1ZSwgLi4ucmVzdCk7XG4gICAgT2JqZWN0LmFzc2lnbih3cmFwcGVkU2VsZWN0b3IsIHNlbGVjdG9yKTtcbiAgICByZXR1cm4gd3JhcHBlZFNlbGVjdG9yO1xuICB9LCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjJcbiAgfSk7XG4gIHJldHVybiBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjI7XG59O1xudmFyIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yQ3JlYXRvcih3ZWFrTWFwTWVtb2l6ZSk7XG5cbi8vIHNyYy9jb25maWd1cmVTdG9yZS50c1xuaW1wb3J0IHsgYXBwbHlNaWRkbGV3YXJlLCBjcmVhdGVTdG9yZSwgY29tcG9zZSBhcyBjb21wb3NlMiwgY29tYmluZVJlZHVjZXJzLCBpc1BsYWluT2JqZWN0IGFzIGlzUGxhaW5PYmplY3QyIH0gZnJvbSBcInJlZHV4XCI7XG5cbi8vIHNyYy9kZXZ0b29sc0V4dGVuc2lvbi50c1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gXCJyZWR1eFwiO1xudmFyIGNvbXBvc2VXaXRoRGV2VG9vbHMgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18gPyB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fIDogZnVuY3Rpb24oKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdm9pZCAwO1xuICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gXCJvYmplY3RcIikgcmV0dXJuIGNvbXBvc2U7XG4gIHJldHVybiBjb21wb3NlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59O1xudmFyIGRldlRvb2xzRW5oYW5jZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fID8gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gOiBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vb3AzKSB7XG4gICAgcmV0dXJuIG5vb3AzO1xuICB9O1xufTtcblxuLy8gc3JjL2dldERlZmF1bHRNaWRkbGV3YXJlLnRzXG5pbXBvcnQgeyB0aHVuayBhcyB0aHVua01pZGRsZXdhcmUsIHdpdGhFeHRyYUFyZ3VtZW50IH0gZnJvbSBcInJlZHV4LXRodW5rXCI7XG5cbi8vIHNyYy9jcmVhdGVBY3Rpb24udHNcbmltcG9ydCB7IGlzQWN0aW9uIH0gZnJvbSBcInJlZHV4XCI7XG5cbi8vIHNyYy90c0hlbHBlcnMudHNcbnZhciBoYXNNYXRjaEZ1bmN0aW9uID0gKHYpID0+IHtcbiAgcmV0dXJuIHYgJiYgdHlwZW9mIHYubWF0Y2ggPT09IFwiZnVuY3Rpb25cIjtcbn07XG5cbi8vIHNyYy9jcmVhdGVBY3Rpb24udHNcbmZ1bmN0aW9uIGNyZWF0ZUFjdGlvbih0eXBlLCBwcmVwYXJlQWN0aW9uKSB7XG4gIGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoLi4uYXJncykge1xuICAgIGlmIChwcmVwYXJlQWN0aW9uKSB7XG4gICAgICBsZXQgcHJlcGFyZWQgPSBwcmVwYXJlQWN0aW9uKC4uLmFyZ3MpO1xuICAgICAgaWYgKCFwcmVwYXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgwKSA6IFwicHJlcGFyZUFjdGlvbiBkaWQgbm90IHJldHVybiBhbiBvYmplY3RcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBwYXlsb2FkOiBwcmVwYXJlZC5wYXlsb2FkLFxuICAgICAgICAuLi5cIm1ldGFcIiBpbiBwcmVwYXJlZCAmJiB7XG4gICAgICAgICAgbWV0YTogcHJlcGFyZWQubWV0YVxuICAgICAgICB9LFxuICAgICAgICAuLi5cImVycm9yXCIgaW4gcHJlcGFyZWQgJiYge1xuICAgICAgICAgIGVycm9yOiBwcmVwYXJlZC5lcnJvclxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZSxcbiAgICAgIHBheWxvYWQ6IGFyZ3NbMF1cbiAgICB9O1xuICB9XG4gIGFjdGlvbkNyZWF0b3IudG9TdHJpbmcgPSAoKSA9PiBgJHt0eXBlfWA7XG4gIGFjdGlvbkNyZWF0b3IudHlwZSA9IHR5cGU7XG4gIGFjdGlvbkNyZWF0b3IubWF0Y2ggPSAoYWN0aW9uKSA9PiBpc0FjdGlvbihhY3Rpb24pICYmIGFjdGlvbi50eXBlID09PSB0eXBlO1xuICByZXR1cm4gYWN0aW9uQ3JlYXRvcjtcbn1cbmZ1bmN0aW9uIGlzQWN0aW9uQ3JlYXRvcihhY3Rpb24pIHtcbiAgcmV0dXJuIHR5cGVvZiBhY3Rpb24gPT09IFwiZnVuY3Rpb25cIiAmJiBcInR5cGVcIiBpbiBhY3Rpb24gJiYgLy8gaGFzTWF0Y2hGdW5jdGlvbiBvbmx5IHdhbnRzIE1hdGNoZXJzIGJ1dCBJIGRvbid0IHNlZSB0aGUgcG9pbnQgaW4gcmV3cml0aW5nIGl0XG4gIGhhc01hdGNoRnVuY3Rpb24oYWN0aW9uKTtcbn1cbmZ1bmN0aW9uIGlzRlNBKGFjdGlvbikge1xuICByZXR1cm4gaXNBY3Rpb24oYWN0aW9uKSAmJiBPYmplY3Qua2V5cyhhY3Rpb24pLmV2ZXJ5KGlzVmFsaWRLZXkpO1xufVxuZnVuY3Rpb24gaXNWYWxpZEtleShrZXkpIHtcbiAgcmV0dXJuIFtcInR5cGVcIiwgXCJwYXlsb2FkXCIsIFwiZXJyb3JcIiwgXCJtZXRhXCJdLmluZGV4T2Yoa2V5KSA+IC0xO1xufVxuXG4vLyBzcmMvYWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGdldE1lc3NhZ2UodHlwZSkge1xuICBjb25zdCBzcGxpdFR5cGUgPSB0eXBlID8gYCR7dHlwZX1gLnNwbGl0KFwiL1wiKSA6IFtdO1xuICBjb25zdCBhY3Rpb25OYW1lID0gc3BsaXRUeXBlW3NwbGl0VHlwZS5sZW5ndGggLSAxXSB8fCBcImFjdGlvbkNyZWF0b3JcIjtcbiAgcmV0dXJuIGBEZXRlY3RlZCBhbiBhY3Rpb24gY3JlYXRvciB3aXRoIHR5cGUgXCIke3R5cGUgfHwgXCJ1bmtub3duXCJ9XCIgYmVpbmcgZGlzcGF0Y2hlZC4gXG5NYWtlIHN1cmUgeW91J3JlIGNhbGxpbmcgdGhlIGFjdGlvbiBjcmVhdG9yIGJlZm9yZSBkaXNwYXRjaGluZywgaS5lLiBcXGBkaXNwYXRjaCgke2FjdGlvbk5hbWV9KCkpXFxgIGluc3RlYWQgb2YgXFxgZGlzcGF0Y2goJHthY3Rpb25OYW1lfSlcXGAuIFRoaXMgaXMgbmVjZXNzYXJ5IGV2ZW4gaWYgdGhlIGFjdGlvbiBoYXMgbm8gcGF5bG9hZC5gO1xufVxuZnVuY3Rpb24gY3JlYXRlQWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUob3B0aW9ucyA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IG5leHQoYWN0aW9uKTtcbiAgfVxuICBjb25zdCB7XG4gICAgaXNBY3Rpb25DcmVhdG9yOiBpc0FjdGlvbkNyZWF0b3IyID0gaXNBY3Rpb25DcmVhdG9yXG4gIH0gPSBvcHRpb25zO1xuICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAoaXNBY3Rpb25DcmVhdG9yMihhY3Rpb24pKSB7XG4gICAgICBjb25zb2xlLndhcm4oZ2V0TWVzc2FnZShhY3Rpb24udHlwZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICB9O1xufVxuXG4vLyBzcmMvdXRpbHMudHNcbmltcG9ydCB7IHByb2R1Y2UgYXMgY3JlYXRlTmV4dFN0YXRlLCBpc0RyYWZ0YWJsZSB9IGZyb20gXCJpbW1lclwiO1xuZnVuY3Rpb24gZ2V0VGltZU1lYXN1cmVVdGlscyhtYXhEZWxheSwgZm5OYW1lKSB7XG4gIGxldCBlbGFwc2VkID0gMDtcbiAgcmV0dXJuIHtcbiAgICBtZWFzdXJlVGltZShmbikge1xuICAgICAgY29uc3Qgc3RhcnRlZCA9IERhdGUubm93KCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkID0gRGF0ZS5ub3coKTtcbiAgICAgICAgZWxhcHNlZCArPSBmaW5pc2hlZCAtIHN0YXJ0ZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgICB3YXJuSWZFeGNlZWRlZCgpIHtcbiAgICAgIGlmIChlbGFwc2VkID4gbWF4RGVsYXkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAke2ZuTmFtZX0gdG9vayAke2VsYXBzZWR9bXMsIHdoaWNoIGlzIG1vcmUgdGhhbiB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJHttYXhEZWxheX1tcy4gXG5JZiB5b3VyIHN0YXRlIG9yIGFjdGlvbnMgYXJlIHZlcnkgbGFyZ2UsIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIHRoZSBtaWRkbGV3YXJlIGFzIGl0IG1pZ2h0IGNhdXNlIHRvbyBtdWNoIG9mIGEgc2xvd2Rvd24gaW4gZGV2ZWxvcG1lbnQgbW9kZS4gU2VlIGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2dldERlZmF1bHRNaWRkbGV3YXJlIGZvciBpbnN0cnVjdGlvbnMuXG5JdCBpcyBkaXNhYmxlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcywgc28geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdC5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBmaW5kKGl0ZXJhYmxlLCBjb21wYXJhdG9yKSB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgaXRlcmFibGUpIHtcbiAgICBpZiAoY29tcGFyYXRvcihlbnRyeSkpIHtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbnZhciBUdXBsZSA9IGNsYXNzIF9UdXBsZSBleHRlbmRzIEFycmF5IHtcbiAgY29uc3RydWN0b3IoLi4uaXRlbXMpIHtcbiAgICBzdXBlciguLi5pdGVtcyk7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIF9UdXBsZS5wcm90b3R5cGUpO1xuICB9XG4gIHN0YXRpYyBnZXQgW1N5bWJvbC5zcGVjaWVzXSgpIHtcbiAgICByZXR1cm4gX1R1cGxlO1xuICB9XG4gIGNvbmNhdCguLi5hcnIpIHtcbiAgICByZXR1cm4gc3VwZXIuY29uY2F0LmFwcGx5KHRoaXMsIGFycik7XG4gIH1cbiAgcHJlcGVuZCguLi5hcnIpIHtcbiAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyclswXSkpIHtcbiAgICAgIHJldHVybiBuZXcgX1R1cGxlKC4uLmFyclswXS5jb25jYXQodGhpcykpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF9UdXBsZSguLi5hcnIuY29uY2F0KHRoaXMpKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGZyZWV6ZURyYWZ0YWJsZSh2YWwpIHtcbiAgcmV0dXJuIGlzRHJhZnRhYmxlKHZhbCkgPyBjcmVhdGVOZXh0U3RhdGUodmFsLCAoKSA9PiB7XG4gIH0pIDogdmFsO1xufVxuZnVuY3Rpb24gZW1wbGFjZShtYXAsIGtleSwgaGFuZGxlcikge1xuICBpZiAobWFwLmhhcyhrZXkpKSB7XG4gICAgbGV0IHZhbHVlID0gbWFwLmdldChrZXkpO1xuICAgIGlmIChoYW5kbGVyLnVwZGF0ZSkge1xuICAgICAgdmFsdWUgPSBoYW5kbGVyLnVwZGF0ZSh2YWx1ZSwga2V5LCBtYXApO1xuICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICghaGFuZGxlci5pbnNlcnQpIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEwKSA6IFwiTm8gaW5zZXJ0IHByb3ZpZGVkIGZvciBrZXkgbm90IGFscmVhZHkgaW4gbWFwXCIpO1xuICBjb25zdCBpbnNlcnRlZCA9IGhhbmRsZXIuaW5zZXJ0KGtleSwgbWFwKTtcbiAgbWFwLnNldChrZXksIGluc2VydGVkKTtcbiAgcmV0dXJuIGluc2VydGVkO1xufVxuXG4vLyBzcmMvaW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBpc0ltbXV0YWJsZURlZmF1bHQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PSBudWxsIHx8IE9iamVjdC5pc0Zyb3plbih2YWx1ZSk7XG59XG5mdW5jdGlvbiB0cmFja0Zvck11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9iaikge1xuICBjb25zdCB0cmFja2VkUHJvcGVydGllcyA9IHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9iaik7XG4gIHJldHVybiB7XG4gICAgZGV0ZWN0TXV0YXRpb25zKCkge1xuICAgICAgcmV0dXJuIGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIHRyYWNrZWRQcm9wZXJ0aWVzLCBvYmopO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMgPSBbXSwgb2JqLCBwYXRoID0gXCJcIiwgY2hlY2tlZE9iamVjdHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSB7XG4gIGNvbnN0IHRyYWNrZWQgPSB7XG4gICAgdmFsdWU6IG9ialxuICB9O1xuICBpZiAoIWlzSW1tdXRhYmxlKG9iaikgJiYgIWNoZWNrZWRPYmplY3RzLmhhcyhvYmopKSB7XG4gICAgY2hlY2tlZE9iamVjdHMuYWRkKG9iaik7XG4gICAgdHJhY2tlZC5jaGlsZHJlbiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aCA/IHBhdGggKyBcIi5cIiArIGtleSA6IGtleTtcbiAgICAgIGlmIChpZ25vcmVQYXRocy5sZW5ndGggJiYgaWdub3JlUGF0aHMuaW5kZXhPZihjaGlsZFBhdGgpICE9PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRyYWNrZWQuY2hpbGRyZW5ba2V5XSA9IHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9ialtrZXldLCBjaGlsZFBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJhY2tlZDtcbn1cbmZ1bmN0aW9uIGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlZFBhdGhzID0gW10sIHRyYWNrZWRQcm9wZXJ0eSwgb2JqLCBzYW1lUGFyZW50UmVmID0gZmFsc2UsIHBhdGggPSBcIlwiKSB7XG4gIGNvbnN0IHByZXZPYmogPSB0cmFja2VkUHJvcGVydHkgPyB0cmFja2VkUHJvcGVydHkudmFsdWUgOiB2b2lkIDA7XG4gIGNvbnN0IHNhbWVSZWYgPSBwcmV2T2JqID09PSBvYmo7XG4gIGlmIChzYW1lUGFyZW50UmVmICYmICFzYW1lUmVmICYmICFOdW1iZXIuaXNOYU4ob2JqKSkge1xuICAgIHJldHVybiB7XG4gICAgICB3YXNNdXRhdGVkOiB0cnVlLFxuICAgICAgcGF0aFxuICAgIH07XG4gIH1cbiAgaWYgKGlzSW1tdXRhYmxlKHByZXZPYmopIHx8IGlzSW1tdXRhYmxlKG9iaikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2FzTXV0YXRlZDogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNvbnN0IGtleXNUb0RldGVjdCA9IHt9O1xuICBmb3IgKGxldCBrZXkgaW4gdHJhY2tlZFByb3BlcnR5LmNoaWxkcmVuKSB7XG4gICAga2V5c1RvRGV0ZWN0W2tleV0gPSB0cnVlO1xuICB9XG4gIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICBrZXlzVG9EZXRlY3Rba2V5XSA9IHRydWU7XG4gIH1cbiAgY29uc3QgaGFzSWdub3JlZFBhdGhzID0gaWdub3JlZFBhdGhzLmxlbmd0aCA+IDA7XG4gIGZvciAobGV0IGtleSBpbiBrZXlzVG9EZXRlY3QpIHtcbiAgICBjb25zdCBuZXN0ZWRQYXRoID0gcGF0aCA/IHBhdGggKyBcIi5cIiArIGtleSA6IGtleTtcbiAgICBpZiAoaGFzSWdub3JlZFBhdGhzKSB7XG4gICAgICBjb25zdCBoYXNNYXRjaGVzID0gaWdub3JlZFBhdGhzLnNvbWUoKGlnbm9yZWQpID0+IHtcbiAgICAgICAgaWYgKGlnbm9yZWQgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICByZXR1cm4gaWdub3JlZC50ZXN0KG5lc3RlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXN0ZWRQYXRoID09PSBpZ25vcmVkO1xuICAgICAgfSk7XG4gICAgICBpZiAoaGFzTWF0Y2hlcykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZGV0ZWN0TXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVkUGF0aHMsIHRyYWNrZWRQcm9wZXJ0eS5jaGlsZHJlbltrZXldLCBvYmpba2V5XSwgc2FtZVJlZiwgbmVzdGVkUGF0aCk7XG4gICAgaWYgKHJlc3VsdC53YXNNdXRhdGVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHdhc011dGF0ZWQ6IGZhbHNlXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUob3B0aW9ucyA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IG5leHQoYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgc3RyaW5naWZ5MiA9IGZ1bmN0aW9uKG9iaiwgc2VyaWFsaXplciwgaW5kZW50LCBkZWN5Y2xlcikge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgZ2V0U2VyaWFsaXplMihzZXJpYWxpemVyLCBkZWN5Y2xlciksIGluZGVudCk7XG4gICAgfSwgZ2V0U2VyaWFsaXplMiA9IGZ1bmN0aW9uKHNlcmlhbGl6ZXIsIGRlY3ljbGVyKSB7XG4gICAgICBsZXQgc3RhY2sgPSBbXSwga2V5cyA9IFtdO1xuICAgICAgaWYgKCFkZWN5Y2xlcikgZGVjeWNsZXIgPSBmdW5jdGlvbihfLCB2YWx1ZSkge1xuICAgICAgICBpZiAoc3RhY2tbMF0gPT09IHZhbHVlKSByZXR1cm4gXCJbQ2lyY3VsYXIgfl1cIjtcbiAgICAgICAgcmV0dXJuIFwiW0NpcmN1bGFyIH4uXCIgKyBrZXlzLnNsaWNlKDAsIHN0YWNrLmluZGV4T2YodmFsdWUpKS5qb2luKFwiLlwiKSArIFwiXVwiO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIHRoaXNQb3MgPSBzdGFjay5pbmRleE9mKHRoaXMpO1xuICAgICAgICAgIH50aGlzUG9zID8gc3RhY2suc3BsaWNlKHRoaXNQb3MgKyAxKSA6IHN0YWNrLnB1c2godGhpcyk7XG4gICAgICAgICAgfnRoaXNQb3MgPyBrZXlzLnNwbGljZSh0aGlzUG9zLCBJbmZpbml0eSwga2V5KSA6IGtleXMucHVzaChrZXkpO1xuICAgICAgICAgIGlmICh+c3RhY2suaW5kZXhPZih2YWx1ZSkpIHZhbHVlID0gZGVjeWNsZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHN0YWNrLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplciA9PSBudWxsID8gdmFsdWUgOiBzZXJpYWxpemVyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIHN0cmluZ2lmeSA9IHN0cmluZ2lmeTIsIGdldFNlcmlhbGl6ZSA9IGdldFNlcmlhbGl6ZTI7XG4gICAgbGV0IHtcbiAgICAgIGlzSW1tdXRhYmxlID0gaXNJbW11dGFibGVEZWZhdWx0LFxuICAgICAgaWdub3JlZFBhdGhzLFxuICAgICAgd2FybkFmdGVyID0gMzJcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB0cmFjayA9IHRyYWNrRm9yTXV0YXRpb25zLmJpbmQobnVsbCwgaXNJbW11dGFibGUsIGlnbm9yZWRQYXRocyk7XG4gICAgcmV0dXJuICh7XG4gICAgICBnZXRTdGF0ZVxuICAgIH0pID0+IHtcbiAgICAgIGxldCBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICBsZXQgdHJhY2tlciA9IHRyYWNrKHN0YXRlKTtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICByZXR1cm4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgbWVhc3VyZVV0aWxzID0gZ2V0VGltZU1lYXN1cmVVdGlscyh3YXJuQWZ0ZXIsIFwiSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlXCIpO1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICByZXN1bHQgPSB0cmFja2VyLmRldGVjdE11dGF0aW9ucygpO1xuICAgICAgICAgIHRyYWNrZXIgPSB0cmFjayhzdGF0ZSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC53YXNNdXRhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxOSkgOiBgQSBzdGF0ZSBtdXRhdGlvbiB3YXMgZGV0ZWN0ZWQgYmV0d2VlbiBkaXNwYXRjaGVzLCBpbiB0aGUgcGF0aCAnJHtyZXN1bHQucGF0aCB8fCBcIlwifScuICBUaGlzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IuIChodHRwczovL3JlZHV4LmpzLm9yZy9zdHlsZS1ndWlkZS9zdHlsZS1ndWlkZSNkby1ub3QtbXV0YXRlLXN0YXRlKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZWRBY3Rpb24gPSBuZXh0KGFjdGlvbik7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgIHJlc3VsdCA9IHRyYWNrZXIuZGV0ZWN0TXV0YXRpb25zKCk7XG4gICAgICAgICAgdHJhY2tlciA9IHRyYWNrKHN0YXRlKTtcbiAgICAgICAgICBpZiAocmVzdWx0Lndhc011dGF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIwKSA6IGBBIHN0YXRlIG11dGF0aW9uIHdhcyBkZXRlY3RlZCBpbnNpZGUgYSBkaXNwYXRjaCwgaW4gdGhlIHBhdGg6ICR7cmVzdWx0LnBhdGggfHwgXCJcIn0uIFRha2UgYSBsb29rIGF0IHRoZSByZWR1Y2VyKHMpIGhhbmRsaW5nIHRoZSBhY3Rpb24gJHtzdHJpbmdpZnkyKGFjdGlvbil9LiAoaHR0cHM6Ly9yZWR1eC5qcy5vcmcvc3R5bGUtZ3VpZGUvc3R5bGUtZ3VpZGUjZG8tbm90LW11dGF0ZS1zdGF0ZSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtZWFzdXJlVXRpbHMud2FybklmRXhjZWVkZWQoKTtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoZWRBY3Rpb247XG4gICAgICB9O1xuICAgIH07XG4gIH1cbn1cblxuLy8gc3JjL3NlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZS50c1xuaW1wb3J0IHsgaXNBY3Rpb24gYXMgaXNBY3Rpb24yLCBpc1BsYWluT2JqZWN0IH0gZnJvbSBcInJlZHV4XCI7XG5mdW5jdGlvbiBpc1BsYWluKHZhbCkge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgcmV0dXJuIHZhbCA9PSBudWxsIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgfHwgdHlwZSA9PT0gXCJudW1iZXJcIiB8fCBBcnJheS5pc0FycmF5KHZhbCkgfHwgaXNQbGFpbk9iamVjdCh2YWwpO1xufVxuZnVuY3Rpb24gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKHZhbHVlLCBwYXRoID0gXCJcIiwgaXNTZXJpYWxpemFibGUgPSBpc1BsYWluLCBnZXRFbnRyaWVzLCBpZ25vcmVkUGF0aHMgPSBbXSwgY2FjaGUpIHtcbiAgbGV0IGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlO1xuICBpZiAoIWlzU2VyaWFsaXphYmxlKHZhbHVlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBrZXlQYXRoOiBwYXRoIHx8IFwiPHJvb3Q+XCIsXG4gICAgICB2YWx1ZVxuICAgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoY2FjaGU/Lmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZW50cmllcyA9IGdldEVudHJpZXMgIT0gbnVsbCA/IGdldEVudHJpZXModmFsdWUpIDogT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICBjb25zdCBoYXNJZ25vcmVkUGF0aHMgPSBpZ25vcmVkUGF0aHMubGVuZ3RoID4gMDtcbiAgZm9yIChjb25zdCBba2V5LCBuZXN0ZWRWYWx1ZV0gb2YgZW50cmllcykge1xuICAgIGNvbnN0IG5lc3RlZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xuICAgIGlmIChoYXNJZ25vcmVkUGF0aHMpIHtcbiAgICAgIGNvbnN0IGhhc01hdGNoZXMgPSBpZ25vcmVkUGF0aHMuc29tZSgoaWdub3JlZCkgPT4ge1xuICAgICAgICBpZiAoaWdub3JlZCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgIHJldHVybiBpZ25vcmVkLnRlc3QobmVzdGVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5lc3RlZFBhdGggPT09IGlnbm9yZWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChoYXNNYXRjaGVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzU2VyaWFsaXphYmxlKG5lc3RlZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5UGF0aDogbmVzdGVkUGF0aCxcbiAgICAgICAgdmFsdWU6IG5lc3RlZFZhbHVlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5lc3RlZFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShuZXN0ZWRWYWx1ZSwgbmVzdGVkUGF0aCwgaXNTZXJpYWxpemFibGUsIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocywgY2FjaGUpO1xuICAgICAgaWYgKGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGNhY2hlICYmIGlzTmVzdGVkRnJvemVuKHZhbHVlKSkgY2FjaGUuYWRkKHZhbHVlKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNOZXN0ZWRGcm96ZW4odmFsdWUpIHtcbiAgaWYgKCFPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgbmVzdGVkVmFsdWUgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICBpZiAodHlwZW9mIG5lc3RlZFZhbHVlICE9PSBcIm9iamVjdFwiIHx8IG5lc3RlZFZhbHVlID09PSBudWxsKSBjb250aW51ZTtcbiAgICBpZiAoIWlzTmVzdGVkRnJvemVuKG5lc3RlZFZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKG9wdGlvbnMgPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiBuZXh0KGFjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNTZXJpYWxpemFibGUgPSBpc1BsYWluLFxuICAgICAgZ2V0RW50cmllcyxcbiAgICAgIGlnbm9yZWRBY3Rpb25zID0gW10sXG4gICAgICBpZ25vcmVkQWN0aW9uUGF0aHMgPSBbXCJtZXRhLmFyZ1wiLCBcIm1ldGEuYmFzZVF1ZXJ5TWV0YVwiXSxcbiAgICAgIGlnbm9yZWRQYXRocyA9IFtdLFxuICAgICAgd2FybkFmdGVyID0gMzIsXG4gICAgICBpZ25vcmVTdGF0ZSA9IGZhbHNlLFxuICAgICAgaWdub3JlQWN0aW9ucyA9IGZhbHNlLFxuICAgICAgZGlzYWJsZUNhY2hlID0gZmFsc2VcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjYWNoZSA9ICFkaXNhYmxlQ2FjaGUgJiYgV2Vha1NldCA/IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpIDogdm9pZCAwO1xuICAgIHJldHVybiAoc3RvcmVBUEkpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIWlzQWN0aW9uMihhY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXh0KGFjdGlvbik7XG4gICAgICBjb25zdCBtZWFzdXJlVXRpbHMgPSBnZXRUaW1lTWVhc3VyZVV0aWxzKHdhcm5BZnRlciwgXCJTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmVcIik7XG4gICAgICBpZiAoIWlnbm9yZUFjdGlvbnMgJiYgIShpZ25vcmVkQWN0aW9ucy5sZW5ndGggJiYgaWdub3JlZEFjdGlvbnMuaW5kZXhPZihhY3Rpb24udHlwZSkgIT09IC0xKSkge1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvdW5kQWN0aW9uTm9uU2VyaWFsaXphYmxlVmFsdWUgPSBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUoYWN0aW9uLCBcIlwiLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZEFjdGlvblBhdGhzLCBjYWNoZSk7XG4gICAgICAgICAgaWYgKGZvdW5kQWN0aW9uTm9uU2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAga2V5UGF0aCxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0gPSBmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQSBub24tc2VyaWFsaXphYmxlIHZhbHVlIHdhcyBkZXRlY3RlZCBpbiBhbiBhY3Rpb24sIGluIHRoZSBwYXRoOiBcXGAke2tleVBhdGh9XFxgLiBWYWx1ZTpgLCB2YWx1ZSwgXCJcXG5UYWtlIGEgbG9vayBhdCB0aGUgbG9naWMgdGhhdCBkaXNwYXRjaGVkIHRoaXMgYWN0aW9uOiBcIiwgYWN0aW9uLCBcIlxcbihTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvZmFxL2FjdGlvbnMjd2h5LXNob3VsZC10eXBlLWJlLWEtc3RyaW5nLW9yLWF0LWxlYXN0LXNlcmlhbGl6YWJsZS13aHktc2hvdWxkLW15LWFjdGlvbi10eXBlcy1iZS1jb25zdGFudHMpXCIsIFwiXFxuKFRvIGFsbG93IG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIHNlZTogaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy91c2FnZS91c2FnZS1ndWlkZSN3b3JraW5nLXdpdGgtbm9uLXNlcmlhbGl6YWJsZS1kYXRhKVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFpZ25vcmVTdGF0ZSkge1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmVBUEkuZ2V0U3RhdGUoKTtcbiAgICAgICAgICBjb25zdCBmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWUgPSBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUoc3RhdGUsIFwiXCIsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkUGF0aHMsIGNhY2hlKTtcbiAgICAgICAgICBpZiAoZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGtleVBhdGgsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9ID0gZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQSBub24tc2VyaWFsaXphYmxlIHZhbHVlIHdhcyBkZXRlY3RlZCBpbiB0aGUgc3RhdGUsIGluIHRoZSBwYXRoOiBcXGAke2tleVBhdGh9XFxgLiBWYWx1ZTpgLCB2YWx1ZSwgYFxuVGFrZSBhIGxvb2sgYXQgdGhlIHJlZHVjZXIocykgaGFuZGxpbmcgdGhpcyBhY3Rpb24gdHlwZTogJHthY3Rpb24udHlwZX0uXG4oU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2ZhcS9vcmdhbml6aW5nLXN0YXRlI2Nhbi1pLXB1dC1mdW5jdGlvbnMtcHJvbWlzZXMtb3Itb3RoZXItbm9uLXNlcmlhbGl6YWJsZS1pdGVtcy1pbi1teS1zdG9yZS1zdGF0ZSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtZWFzdXJlVXRpbHMud2FybklmRXhjZWVkZWQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxufVxuXG4vLyBzcmMvZ2V0RGVmYXVsdE1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGlzQm9vbGVhbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJib29sZWFuXCI7XG59XG52YXIgYnVpbGRHZXREZWZhdWx0TWlkZGxld2FyZSA9ICgpID0+IGZ1bmN0aW9uIGdldERlZmF1bHRNaWRkbGV3YXJlKG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIHRodW5rID0gdHJ1ZSxcbiAgICBpbW11dGFibGVDaGVjayA9IHRydWUsXG4gICAgc2VyaWFsaXphYmxlQ2hlY2sgPSB0cnVlLFxuICAgIGFjdGlvbkNyZWF0b3JDaGVjayA9IHRydWVcbiAgfSA9IG9wdGlvbnMgPz8ge307XG4gIGxldCBtaWRkbGV3YXJlQXJyYXkgPSBuZXcgVHVwbGUoKTtcbiAgaWYgKHRodW5rKSB7XG4gICAgaWYgKGlzQm9vbGVhbih0aHVuaykpIHtcbiAgICAgIG1pZGRsZXdhcmVBcnJheS5wdXNoKHRodW5rTWlkZGxld2FyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pZGRsZXdhcmVBcnJheS5wdXNoKHdpdGhFeHRyYUFyZ3VtZW50KHRodW5rLmV4dHJhQXJndW1lbnQpKTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmIChpbW11dGFibGVDaGVjaykge1xuICAgICAgbGV0IGltbXV0YWJsZU9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghaXNCb29sZWFuKGltbXV0YWJsZUNoZWNrKSkge1xuICAgICAgICBpbW11dGFibGVPcHRpb25zID0gaW1tdXRhYmxlQ2hlY2s7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlQXJyYXkudW5zaGlmdChjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUoaW1tdXRhYmxlT3B0aW9ucykpO1xuICAgIH1cbiAgICBpZiAoc2VyaWFsaXphYmxlQ2hlY2spIHtcbiAgICAgIGxldCBzZXJpYWxpemFibGVPcHRpb25zID0ge307XG4gICAgICBpZiAoIWlzQm9vbGVhbihzZXJpYWxpemFibGVDaGVjaykpIHtcbiAgICAgICAgc2VyaWFsaXphYmxlT3B0aW9ucyA9IHNlcmlhbGl6YWJsZUNoZWNrO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2goY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKHNlcmlhbGl6YWJsZU9wdGlvbnMpKTtcbiAgICB9XG4gICAgaWYgKGFjdGlvbkNyZWF0b3JDaGVjaykge1xuICAgICAgbGV0IGFjdGlvbkNyZWF0b3JPcHRpb25zID0ge307XG4gICAgICBpZiAoIWlzQm9vbGVhbihhY3Rpb25DcmVhdG9yQ2hlY2spKSB7XG4gICAgICAgIGFjdGlvbkNyZWF0b3JPcHRpb25zID0gYWN0aW9uQ3JlYXRvckNoZWNrO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZUFycmF5LnVuc2hpZnQoY3JlYXRlQWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUoYWN0aW9uQ3JlYXRvck9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pZGRsZXdhcmVBcnJheTtcbn07XG5cbi8vIHNyYy9hdXRvQmF0Y2hFbmhhbmNlci50c1xudmFyIFNIT1VMRF9BVVRPQkFUQ0ggPSBcIlJUS19hdXRvQmF0Y2hcIjtcbnZhciBwcmVwYXJlQXV0b0JhdGNoZWQgPSAoKSA9PiAocGF5bG9hZCkgPT4gKHtcbiAgcGF5bG9hZCxcbiAgbWV0YToge1xuICAgIFtTSE9VTERfQVVUT0JBVENIXTogdHJ1ZVxuICB9XG59KTtcbnZhciBjcmVhdGVRdWV1ZVdpdGhUaW1lciA9ICh0aW1lb3V0KSA9PiB7XG4gIHJldHVybiAobm90aWZ5KSA9PiB7XG4gICAgc2V0VGltZW91dChub3RpZnksIHRpbWVvdXQpO1xuICB9O1xufTtcbnZhciByQUYgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIDogY3JlYXRlUXVldWVXaXRoVGltZXIoMTApO1xudmFyIGF1dG9CYXRjaEVuaGFuY2VyID0gKG9wdGlvbnMgPSB7XG4gIHR5cGU6IFwicmFmXCJcbn0pID0+IChuZXh0KSA9PiAoLi4uYXJncykgPT4ge1xuICBjb25zdCBzdG9yZSA9IG5leHQoLi4uYXJncyk7XG4gIGxldCBub3RpZnlpbmcgPSB0cnVlO1xuICBsZXQgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSBmYWxzZTtcbiAgbGV0IG5vdGlmaWNhdGlvblF1ZXVlZCA9IGZhbHNlO1xuICBjb25zdCBsaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBxdWV1ZUNhbGxiYWNrID0gb3B0aW9ucy50eXBlID09PSBcInRpY2tcIiA/IHF1ZXVlTWljcm90YXNrIDogb3B0aW9ucy50eXBlID09PSBcInJhZlwiID8gckFGIDogb3B0aW9ucy50eXBlID09PSBcImNhbGxiYWNrXCIgPyBvcHRpb25zLnF1ZXVlTm90aWZpY2F0aW9uIDogY3JlYXRlUXVldWVXaXRoVGltZXIob3B0aW9ucy50aW1lb3V0KTtcbiAgY29uc3Qgbm90aWZ5TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgIG5vdGlmaWNhdGlvblF1ZXVlZCA9IGZhbHNlO1xuICAgIGlmIChzaG91bGROb3RpZnlBdEVuZE9mVGljaykge1xuICAgICAgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSBmYWxzZTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChsKSA9PiBsKCkpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0b3JlLCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgYHN0b3JlLnN1YnNjcmliZWAgbWV0aG9kIHRvIGtlZXAgb3JpZ2luYWwgbGlzdGVuZXJzXG4gICAgLy8gZnJvbSBydW5uaW5nIGlmIHdlJ3JlIGRlbGF5aW5nIG5vdGlmaWNhdGlvbnNcbiAgICBzdWJzY3JpYmUobGlzdGVuZXIyKSB7XG4gICAgICBjb25zdCB3cmFwcGVkTGlzdGVuZXIgPSAoKSA9PiBub3RpZnlpbmcgJiYgbGlzdGVuZXIyKCk7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHN0b3JlLnN1YnNjcmliZSh3cmFwcGVkTGlzdGVuZXIpO1xuICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcjIpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcjIpO1xuICAgICAgfTtcbiAgICB9LFxuICAgIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGBzdG9yZS5kaXNwYXRjaGAgbWV0aG9kIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGFjdGlvbnNcbiAgICAvLyBmb3IgdGhlIGBzaG91bGRBdXRvQmF0Y2hgIGZsYWcgYW5kIGRldGVybWluZSBpZiBiYXRjaGluZyBpcyBhY3RpdmVcbiAgICBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5vdGlmeWluZyA9ICFhY3Rpb24/Lm1ldGE/LltTSE9VTERfQVVUT0JBVENIXTtcbiAgICAgICAgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSAhbm90aWZ5aW5nO1xuICAgICAgICBpZiAoc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2spIHtcbiAgICAgICAgICBpZiAoIW5vdGlmaWNhdGlvblF1ZXVlZCkge1xuICAgICAgICAgICAgbm90aWZpY2F0aW9uUXVldWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHF1ZXVlQ2FsbGJhY2sobm90aWZ5TGlzdGVuZXJzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoKGFjdGlvbik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBub3RpZnlpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vLyBzcmMvZ2V0RGVmYXVsdEVuaGFuY2Vycy50c1xudmFyIGJ1aWxkR2V0RGVmYXVsdEVuaGFuY2VycyA9IChtaWRkbGV3YXJlRW5oYW5jZXIpID0+IGZ1bmN0aW9uIGdldERlZmF1bHRFbmhhbmNlcnMob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgYXV0b0JhdGNoID0gdHJ1ZVxuICB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgbGV0IGVuaGFuY2VyQXJyYXkgPSBuZXcgVHVwbGUobWlkZGxld2FyZUVuaGFuY2VyKTtcbiAgaWYgKGF1dG9CYXRjaCkge1xuICAgIGVuaGFuY2VyQXJyYXkucHVzaChhdXRvQmF0Y2hFbmhhbmNlcih0eXBlb2YgYXV0b0JhdGNoID09PSBcIm9iamVjdFwiID8gYXV0b0JhdGNoIDogdm9pZCAwKSk7XG4gIH1cbiAgcmV0dXJuIGVuaGFuY2VyQXJyYXk7XG59O1xuXG4vLyBzcmMvY29uZmlndXJlU3RvcmUudHNcbmZ1bmN0aW9uIGNvbmZpZ3VyZVN0b3JlKG9wdGlvbnMpIHtcbiAgY29uc3QgZ2V0RGVmYXVsdE1pZGRsZXdhcmUgPSBidWlsZEdldERlZmF1bHRNaWRkbGV3YXJlKCk7XG4gIGNvbnN0IHtcbiAgICByZWR1Y2VyID0gdm9pZCAwLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgZGV2VG9vbHMgPSB0cnVlLFxuICAgIHByZWxvYWRlZFN0YXRlID0gdm9pZCAwLFxuICAgIGVuaGFuY2VycyA9IHZvaWQgMFxuICB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgbGV0IHJvb3RSZWR1Y2VyO1xuICBpZiAodHlwZW9mIHJlZHVjZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJvb3RSZWR1Y2VyID0gcmVkdWNlcjtcbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0MihyZWR1Y2VyKSkge1xuICAgIHJvb3RSZWR1Y2VyID0gY29tYmluZVJlZHVjZXJzKHJlZHVjZXIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEpIDogXCJgcmVkdWNlcmAgaXMgYSByZXF1aXJlZCBhcmd1bWVudCwgYW5kIG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBjb21iaW5lUmVkdWNlcnNcIik7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBtaWRkbGV3YXJlICYmIHR5cGVvZiBtaWRkbGV3YXJlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSA6IFwiYG1pZGRsZXdhcmVgIGZpZWxkIG11c3QgYmUgYSBjYWxsYmFja1wiKTtcbiAgfVxuICBsZXQgZmluYWxNaWRkbGV3YXJlO1xuICBpZiAodHlwZW9mIG1pZGRsZXdhcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZpbmFsTWlkZGxld2FyZSA9IG1pZGRsZXdhcmUoZ2V0RGVmYXVsdE1pZGRsZXdhcmUpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIUFycmF5LmlzQXJyYXkoZmluYWxNaWRkbGV3YXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiBcIndoZW4gdXNpbmcgYSBtaWRkbGV3YXJlIGJ1aWxkZXIgZnVuY3Rpb24sIGFuIGFycmF5IG9mIG1pZGRsZXdhcmUgbXVzdCBiZSByZXR1cm5lZFwiKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmluYWxNaWRkbGV3YXJlID0gZ2V0RGVmYXVsdE1pZGRsZXdhcmUoKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGZpbmFsTWlkZGxld2FyZS5zb21lKChpdGVtKSA9PiB0eXBlb2YgaXRlbSAhPT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQpIDogXCJlYWNoIG1pZGRsZXdhcmUgcHJvdmlkZWQgdG8gY29uZmlndXJlU3RvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG4gIGxldCBmaW5hbENvbXBvc2UgPSBjb21wb3NlMjtcbiAgaWYgKGRldlRvb2xzKSB7XG4gICAgZmluYWxDb21wb3NlID0gY29tcG9zZVdpdGhEZXZUb29scyh7XG4gICAgICAvLyBFbmFibGUgY2FwdHVyZSBvZiBzdGFjayB0cmFjZXMgZm9yIGRpc3BhdGNoZWQgUmVkdXggYWN0aW9uc1xuICAgICAgdHJhY2U6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIixcbiAgICAgIC4uLnR5cGVvZiBkZXZUb29scyA9PT0gXCJvYmplY3RcIiAmJiBkZXZUb29sc1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IG1pZGRsZXdhcmVFbmhhbmNlciA9IGFwcGx5TWlkZGxld2FyZSguLi5maW5hbE1pZGRsZXdhcmUpO1xuICBjb25zdCBnZXREZWZhdWx0RW5oYW5jZXJzID0gYnVpbGRHZXREZWZhdWx0RW5oYW5jZXJzKG1pZGRsZXdhcmVFbmhhbmNlcik7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZW5oYW5jZXJzICYmIHR5cGVvZiBlbmhhbmNlcnMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUpIDogXCJgZW5oYW5jZXJzYCBmaWVsZCBtdXN0IGJlIGEgY2FsbGJhY2tcIik7XG4gIH1cbiAgbGV0IHN0b3JlRW5oYW5jZXJzID0gdHlwZW9mIGVuaGFuY2VycyA9PT0gXCJmdW5jdGlvblwiID8gZW5oYW5jZXJzKGdldERlZmF1bHRFbmhhbmNlcnMpIDogZ2V0RGVmYXVsdEVuaGFuY2VycygpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFBcnJheS5pc0FycmF5KHN0b3JlRW5oYW5jZXJzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogXCJgZW5oYW5jZXJzYCBjYWxsYmFjayBtdXN0IHJldHVybiBhbiBhcnJheVwiKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIHN0b3JlRW5oYW5jZXJzLnNvbWUoKGl0ZW0pID0+IHR5cGVvZiBpdGVtICE9PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNykgOiBcImVhY2ggZW5oYW5jZXIgcHJvdmlkZWQgdG8gY29uZmlndXJlU3RvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZmluYWxNaWRkbGV3YXJlLmxlbmd0aCAmJiAhc3RvcmVFbmhhbmNlcnMuaW5jbHVkZXMobWlkZGxld2FyZUVuaGFuY2VyKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJtaWRkbGV3YXJlcyB3ZXJlIHByb3ZpZGVkLCBidXQgbWlkZGxld2FyZSBlbmhhbmNlciB3YXMgbm90IGluY2x1ZGVkIGluIGZpbmFsIGVuaGFuY2VycyAtIG1ha2Ugc3VyZSB0byBjYWxsIGBnZXREZWZhdWx0RW5oYW5jZXJzYFwiKTtcbiAgfVxuICBjb25zdCBjb21wb3NlZEVuaGFuY2VyID0gZmluYWxDb21wb3NlKC4uLnN0b3JlRW5oYW5jZXJzKTtcbiAgcmV0dXJuIGNyZWF0ZVN0b3JlKHJvb3RSZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgY29tcG9zZWRFbmhhbmNlcik7XG59XG5cbi8vIHNyYy9jcmVhdGVSZWR1Y2VyLnRzXG5pbXBvcnQgeyBwcm9kdWNlIGFzIGNyZWF0ZU5leHRTdGF0ZTIsIGlzRHJhZnQgYXMgaXNEcmFmdDIsIGlzRHJhZnRhYmxlIGFzIGlzRHJhZnRhYmxlMiB9IGZyb20gXCJpbW1lclwiO1xuXG4vLyBzcmMvbWFwQnVpbGRlcnMudHNcbmZ1bmN0aW9uIGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKGJ1aWxkZXJDYWxsYmFjaykge1xuICBjb25zdCBhY3Rpb25zTWFwID0ge307XG4gIGNvbnN0IGFjdGlvbk1hdGNoZXJzID0gW107XG4gIGxldCBkZWZhdWx0Q2FzZVJlZHVjZXI7XG4gIGNvbnN0IGJ1aWxkZXIgPSB7XG4gICAgYWRkQ2FzZSh0eXBlT3JBY3Rpb25DcmVhdG9yLCByZWR1Y2VyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChhY3Rpb25NYXRjaGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjYpIDogXCJgYnVpbGRlci5hZGRDYXNlYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYGJ1aWxkZXIuYWRkTWF0Y2hlcmBcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI3KSA6IFwiYGJ1aWxkZXIuYWRkQ2FzZWAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZERlZmF1bHRDYXNlYFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB0eXBlT3JBY3Rpb25DcmVhdG9yID09PSBcInN0cmluZ1wiID8gdHlwZU9yQWN0aW9uQ3JlYXRvciA6IHR5cGVPckFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyOCkgOiBcImBidWlsZGVyLmFkZENhc2VgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBhbiBlbXB0eSBhY3Rpb24gdHlwZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlIGluIGFjdGlvbnNNYXApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjkpIDogYFxcYGJ1aWxkZXIuYWRkQ2FzZVxcYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggdHdvIHJlZHVjZXJzIGZvciB0aGUgc2FtZSBhY3Rpb24gdHlwZSAnJHt0eXBlfSdgKTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbnNNYXBbdHlwZV0gPSByZWR1Y2VyO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfSxcbiAgICBhZGRNYXRjaGVyKG1hdGNoZXIsIHJlZHVjZXIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMwKSA6IFwiYGJ1aWxkZXIuYWRkTWF0Y2hlcmAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZERlZmF1bHRDYXNlYFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYWN0aW9uTWF0Y2hlcnMucHVzaCh7XG4gICAgICAgIG1hdGNoZXIsXG4gICAgICAgIHJlZHVjZXJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfSxcbiAgICBhZGREZWZhdWx0Q2FzZShyZWR1Y2VyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMSkgOiBcImBidWlsZGVyLmFkZERlZmF1bHRDYXNlYCBjYW4gb25seSBiZSBjYWxsZWQgb25jZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVmYXVsdENhc2VSZWR1Y2VyID0gcmVkdWNlcjtcbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH1cbiAgfTtcbiAgYnVpbGRlckNhbGxiYWNrKGJ1aWxkZXIpO1xuICByZXR1cm4gW2FjdGlvbnNNYXAsIGFjdGlvbk1hdGNoZXJzLCBkZWZhdWx0Q2FzZVJlZHVjZXJdO1xufVxuXG4vLyBzcmMvY3JlYXRlUmVkdWNlci50c1xuZnVuY3Rpb24gaXNTdGF0ZUZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWR1Y2VyKGluaXRpYWxTdGF0ZSwgbWFwT3JCdWlsZGVyQ2FsbGJhY2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICh0eXBlb2YgbWFwT3JCdWlsZGVyQ2FsbGJhY2sgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDgpIDogXCJUaGUgb2JqZWN0IG5vdGF0aW9uIGZvciBgY3JlYXRlUmVkdWNlcmAgaGFzIGJlZW4gcmVtb3ZlZC4gUGxlYXNlIHVzZSB0aGUgJ2J1aWxkZXIgY2FsbGJhY2snIG5vdGF0aW9uIGluc3RlYWQ6IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2NyZWF0ZVJlZHVjZXJcIik7XG4gICAgfVxuICB9XG4gIGxldCBbYWN0aW9uc01hcCwgZmluYWxBY3Rpb25NYXRjaGVycywgZmluYWxEZWZhdWx0Q2FzZVJlZHVjZXJdID0gZXhlY3V0ZVJlZHVjZXJCdWlsZGVyQ2FsbGJhY2sobWFwT3JCdWlsZGVyQ2FsbGJhY2spO1xuICBsZXQgZ2V0SW5pdGlhbFN0YXRlO1xuICBpZiAoaXNTdGF0ZUZ1bmN0aW9uKGluaXRpYWxTdGF0ZSkpIHtcbiAgICBnZXRJbml0aWFsU3RhdGUgPSAoKSA9PiBmcmVlemVEcmFmdGFibGUoaW5pdGlhbFN0YXRlKCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGZyb3plbkluaXRpYWxTdGF0ZSA9IGZyZWV6ZURyYWZ0YWJsZShpbml0aWFsU3RhdGUpO1xuICAgIGdldEluaXRpYWxTdGF0ZSA9ICgpID0+IGZyb3plbkluaXRpYWxTdGF0ZTtcbiAgfVxuICBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlKCksIGFjdGlvbikge1xuICAgIGxldCBjYXNlUmVkdWNlcnMgPSBbYWN0aW9uc01hcFthY3Rpb24udHlwZV0sIC4uLmZpbmFsQWN0aW9uTWF0Y2hlcnMuZmlsdGVyKCh7XG4gICAgICBtYXRjaGVyXG4gICAgfSkgPT4gbWF0Y2hlcihhY3Rpb24pKS5tYXAoKHtcbiAgICAgIHJlZHVjZXI6IHJlZHVjZXIyXG4gICAgfSkgPT4gcmVkdWNlcjIpXTtcbiAgICBpZiAoY2FzZVJlZHVjZXJzLmZpbHRlcigoY3IpID0+ICEhY3IpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FzZVJlZHVjZXJzID0gW2ZpbmFsRGVmYXVsdENhc2VSZWR1Y2VyXTtcbiAgICB9XG4gICAgcmV0dXJuIGNhc2VSZWR1Y2Vycy5yZWR1Y2UoKHByZXZpb3VzU3RhdGUsIGNhc2VSZWR1Y2VyKSA9PiB7XG4gICAgICBpZiAoY2FzZVJlZHVjZXIpIHtcbiAgICAgICAgaWYgKGlzRHJhZnQyKHByZXZpb3VzU3RhdGUpKSB7XG4gICAgICAgICAgY29uc3QgZHJhZnQgPSBwcmV2aW91c1N0YXRlO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhc2VSZWR1Y2VyKGRyYWZ0LCBhY3Rpb24pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzRHJhZnRhYmxlMihwcmV2aW91c1N0YXRlKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhc2VSZWR1Y2VyKHByZXZpb3VzU3RhdGUsIGFjdGlvbik7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNTdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogXCJBIGNhc2UgcmVkdWNlciBvbiBhIG5vbi1kcmFmdGFibGUgdmFsdWUgbXVzdCBub3QgcmV0dXJuIHVuZGVmaW5lZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlTmV4dFN0YXRlMihwcmV2aW91c1N0YXRlLCAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYXNlUmVkdWNlcihkcmFmdCwgYWN0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XG4gICAgfSwgc3RhdGUpO1xuICB9XG4gIHJlZHVjZXIuZ2V0SW5pdGlhbFN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlO1xuICByZXR1cm4gcmVkdWNlcjtcbn1cblxuLy8gc3JjL21hdGNoZXJzLnRzXG52YXIgbWF0Y2hlcyA9IChtYXRjaGVyLCBhY3Rpb24pID0+IHtcbiAgaWYgKGhhc01hdGNoRnVuY3Rpb24obWF0Y2hlcikpIHtcbiAgICByZXR1cm4gbWF0Y2hlci5tYXRjaChhY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBtYXRjaGVyKGFjdGlvbik7XG4gIH1cbn07XG5mdW5jdGlvbiBpc0FueU9mKC4uLm1hdGNoZXJzKSB7XG4gIHJldHVybiAoYWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuIG1hdGNoZXJzLnNvbWUoKG1hdGNoZXIpID0+IG1hdGNoZXMobWF0Y2hlciwgYWN0aW9uKSk7XG4gIH07XG59XG5mdW5jdGlvbiBpc0FsbE9mKC4uLm1hdGNoZXJzKSB7XG4gIHJldHVybiAoYWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuIG1hdGNoZXJzLmV2ZXJ5KChtYXRjaGVyKSA9PiBtYXRjaGVzKG1hdGNoZXIsIGFjdGlvbikpO1xuICB9O1xufVxuZnVuY3Rpb24gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCB2YWxpZFN0YXR1cykge1xuICBpZiAoIWFjdGlvbiB8fCAhYWN0aW9uLm1ldGEpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaGFzVmFsaWRSZXF1ZXN0SWQgPSB0eXBlb2YgYWN0aW9uLm1ldGEucmVxdWVzdElkID09PSBcInN0cmluZ1wiO1xuICBjb25zdCBoYXNWYWxpZFJlcXVlc3RTdGF0dXMgPSB2YWxpZFN0YXR1cy5pbmRleE9mKGFjdGlvbi5tZXRhLnJlcXVlc3RTdGF0dXMpID4gLTE7XG4gIHJldHVybiBoYXNWYWxpZFJlcXVlc3RJZCAmJiBoYXNWYWxpZFJlcXVlc3RTdGF0dXM7XG59XG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtBcnJheShhKSB7XG4gIHJldHVybiB0eXBlb2YgYVswXSA9PT0gXCJmdW5jdGlvblwiICYmIFwicGVuZGluZ1wiIGluIGFbMF0gJiYgXCJmdWxmaWxsZWRcIiBpbiBhWzBdICYmIFwicmVqZWN0ZWRcIiBpbiBhWzBdO1xufVxuZnVuY3Rpb24gaXNQZW5kaW5nKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJwZW5kaW5nXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc1BlbmRpbmcoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQW55T2YoLi4uYXN5bmNUaHVua3MubWFwKChhc3luY1RodW5rKSA9PiBhc3luY1RodW5rLnBlbmRpbmcpKTtcbn1cbmZ1bmN0aW9uIGlzUmVqZWN0ZWQoLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcInJlamVjdGVkXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc1JlamVjdGVkKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLm1hcCgoYXN5bmNUaHVuaykgPT4gYXN5bmNUaHVuay5yZWplY3RlZCkpO1xufVxuZnVuY3Rpb24gaXNSZWplY3RlZFdpdGhWYWx1ZSguLi5hc3luY1RodW5rcykge1xuICBjb25zdCBoYXNGbGFnID0gKGFjdGlvbikgPT4ge1xuICAgIHJldHVybiBhY3Rpb24gJiYgYWN0aW9uLm1ldGEgJiYgYWN0aW9uLm1ldGEucmVqZWN0ZWRXaXRoVmFsdWU7XG4gIH07XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaXNBbGxPZihpc1JlamVjdGVkKC4uLmFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNSZWplY3RlZFdpdGhWYWx1ZSgpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbGxPZihpc1JlamVjdGVkKC4uLmFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XG59XG5mdW5jdGlvbiBpc0Z1bGZpbGxlZCguLi5hc3luY1RodW5rcykge1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhY3Rpb24pID0+IGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wiZnVsZmlsbGVkXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc0Z1bGZpbGxlZCgpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5tYXAoKGFzeW5jVGh1bmspID0+IGFzeW5jVGh1bmsuZnVsZmlsbGVkKSk7XG59XG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtBY3Rpb24oLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcInBlbmRpbmdcIiwgXCJmdWxmaWxsZWRcIiwgXCJyZWplY3RlZFwiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNBc3luY1RodW5rQWN0aW9uKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLmZsYXRNYXAoKGFzeW5jVGh1bmspID0+IFthc3luY1RodW5rLnBlbmRpbmcsIGFzeW5jVGh1bmsucmVqZWN0ZWQsIGFzeW5jVGh1bmsuZnVsZmlsbGVkXSkpO1xufVxuXG4vLyBzcmMvbmFub2lkLnRzXG52YXIgdXJsQWxwaGFiZXQgPSBcIk1vZHVsZVN5bWJoYXNPd25Qci0wMTIzNDU2Nzg5QUJDREVGR0hOUlZmZ2N0aVV2el9LcVlUSmtMeHBaWElqUVdcIjtcbnZhciBuYW5vaWQgPSAoc2l6ZSA9IDIxKSA9PiB7XG4gIGxldCBpZCA9IFwiXCI7XG4gIGxldCBpID0gc2l6ZTtcbiAgd2hpbGUgKGktLSkge1xuICAgIGlkICs9IHVybEFscGhhYmV0W01hdGgucmFuZG9tKCkgKiA2NCB8IDBdO1xuICB9XG4gIHJldHVybiBpZDtcbn07XG5cbi8vIHNyYy9jcmVhdGVBc3luY1RodW5rLnRzXG52YXIgY29tbW9uUHJvcGVydGllcyA9IFtcIm5hbWVcIiwgXCJtZXNzYWdlXCIsIFwic3RhY2tcIiwgXCJjb2RlXCJdO1xudmFyIFJlamVjdFdpdGhWYWx1ZSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IocGF5bG9hZCwgbWV0YSkge1xuICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgdGhpcy5tZXRhID0gbWV0YTtcbiAgfVxuICAvKlxuICB0eXBlLW9ubHkgcHJvcGVydHkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBSZWplY3RXaXRoVmFsdWUgYW5kIEZ1bGZpbGxXaXRoTWV0YVxuICBkb2VzIG5vdCBleGlzdCBhdCBydW50aW1lXG4gICovXG4gIF90eXBlO1xufTtcbnZhciBGdWxmaWxsV2l0aE1ldGEgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHBheWxvYWQsIG1ldGEpIHtcbiAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgIHRoaXMubWV0YSA9IG1ldGE7XG4gIH1cbiAgLypcbiAgdHlwZS1vbmx5IHByb3BlcnR5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gUmVqZWN0V2l0aFZhbHVlIGFuZCBGdWxmaWxsV2l0aE1ldGFcbiAgZG9lcyBub3QgZXhpc3QgYXQgcnVudGltZVxuICAqL1xuICBfdHlwZTtcbn07XG52YXIgbWluaVNlcmlhbGl6ZUVycm9yID0gKHZhbHVlKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzaW1wbGVFcnJvciA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgY29tbW9uUHJvcGVydGllcykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZVtwcm9wZXJ0eV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgc2ltcGxlRXJyb3JbcHJvcGVydHldID0gdmFsdWVbcHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2ltcGxlRXJyb3I7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiBTdHJpbmcodmFsdWUpXG4gIH07XG59O1xudmFyIGNyZWF0ZUFzeW5jVGh1bmsgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcbiAgZnVuY3Rpb24gY3JlYXRlQXN5bmNUaHVuazIodHlwZVByZWZpeCwgcGF5bG9hZENyZWF0b3IsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmdWxmaWxsZWQgPSBjcmVhdGVBY3Rpb24odHlwZVByZWZpeCArIFwiL2Z1bGZpbGxlZFwiLCAocGF5bG9hZCwgcmVxdWVzdElkLCBhcmcsIG1ldGEpID0+ICh7XG4gICAgICBwYXlsb2FkLFxuICAgICAgbWV0YToge1xuICAgICAgICAuLi5tZXRhIHx8IHt9LFxuICAgICAgICBhcmcsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgcmVxdWVzdFN0YXR1czogXCJmdWxmaWxsZWRcIlxuICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBwZW5kaW5nID0gY3JlYXRlQWN0aW9uKHR5cGVQcmVmaXggKyBcIi9wZW5kaW5nXCIsIChyZXF1ZXN0SWQsIGFyZywgbWV0YSkgPT4gKHtcbiAgICAgIHBheWxvYWQ6IHZvaWQgMCxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgLi4ubWV0YSB8fCB7fSxcbiAgICAgICAgYXJnLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHJlcXVlc3RTdGF0dXM6IFwicGVuZGluZ1wiXG4gICAgICB9XG4gICAgfSkpO1xuICAgIGNvbnN0IHJlamVjdGVkID0gY3JlYXRlQWN0aW9uKHR5cGVQcmVmaXggKyBcIi9yZWplY3RlZFwiLCAoZXJyb3IsIHJlcXVlc3RJZCwgYXJnLCBwYXlsb2FkLCBtZXRhKSA9PiAoe1xuICAgICAgcGF5bG9hZCxcbiAgICAgIGVycm9yOiAob3B0aW9ucyAmJiBvcHRpb25zLnNlcmlhbGl6ZUVycm9yIHx8IG1pbmlTZXJpYWxpemVFcnJvcikoZXJyb3IgfHwgXCJSZWplY3RlZFwiKSxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgLi4ubWV0YSB8fCB7fSxcbiAgICAgICAgYXJnLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHJlamVjdGVkV2l0aFZhbHVlOiAhIXBheWxvYWQsXG4gICAgICAgIHJlcXVlc3RTdGF0dXM6IFwicmVqZWN0ZWRcIixcbiAgICAgICAgYWJvcnRlZDogZXJyb3I/Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiLFxuICAgICAgICBjb25kaXRpb246IGVycm9yPy5uYW1lID09PSBcIkNvbmRpdGlvbkVycm9yXCJcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgZnVuY3Rpb24gYWN0aW9uQ3JlYXRvcihhcmcpIHtcbiAgICAgIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYSkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBvcHRpb25zPy5pZEdlbmVyYXRvciA/IG9wdGlvbnMuaWRHZW5lcmF0b3IoYXJnKSA6IG5hbm9pZCgpO1xuICAgICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGxldCBhYm9ydEhhbmRsZXI7XG4gICAgICAgIGxldCBhYm9ydFJlYXNvbjtcbiAgICAgICAgZnVuY3Rpb24gYWJvcnQocmVhc29uKSB7XG4gICAgICAgICAgYWJvcnRSZWFzb24gPSByZWFzb247XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxldCBmaW5hbEFjdGlvbjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGNvbmRpdGlvblJlc3VsdCA9IG9wdGlvbnM/LmNvbmRpdGlvbj8uKGFyZywge1xuICAgICAgICAgICAgICBnZXRTdGF0ZSxcbiAgICAgICAgICAgICAgZXh0cmFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGlzVGhlbmFibGUoY29uZGl0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICBjb25kaXRpb25SZXN1bHQgPSBhd2FpdCBjb25kaXRpb25SZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uUmVzdWx0ID09PSBmYWxzZSB8fCBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29uZGl0aW9uRXJyb3JcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkFib3J0ZWQgZHVlIHRvIGNvbmRpdGlvbiBjYWxsYmFjayByZXR1cm5pbmcgZmFsc2UuXCJcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFib3J0ZWRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBhYm9ydEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQWJvcnRFcnJvclwiLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYWJvcnRSZWFzb24gfHwgXCJBYm9ydGVkXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRIYW5kbGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGlzcGF0Y2gocGVuZGluZyhyZXF1ZXN0SWQsIGFyZywgb3B0aW9ucz8uZ2V0UGVuZGluZ01ldGE/Lih7XG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGdldFN0YXRlLFxuICAgICAgICAgICAgICBleHRyYVxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gYXdhaXQgUHJvbWlzZS5yYWNlKFthYm9ydGVkUHJvbWlzZSwgUHJvbWlzZS5yZXNvbHZlKHBheWxvYWRDcmVhdG9yKGFyZywge1xuICAgICAgICAgICAgICBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgZ2V0U3RhdGUsXG4gICAgICAgICAgICAgIGV4dHJhLFxuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgYWJvcnQsXG4gICAgICAgICAgICAgIHJlamVjdFdpdGhWYWx1ZTogKHZhbHVlLCBtZXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWplY3RXaXRoVmFsdWUodmFsdWUsIG1ldGEpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdWxmaWxsV2l0aFZhbHVlOiAodmFsdWUsIG1ldGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bGZpbGxXaXRoTWV0YSh2YWx1ZSwgbWV0YSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlamVjdFdpdGhWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRnVsZmlsbFdpdGhNZXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bGZpbGxlZChyZXN1bHQucGF5bG9hZCwgcmVxdWVzdElkLCBhcmcsIHJlc3VsdC5tZXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZnVsZmlsbGVkKHJlc3VsdCwgcmVxdWVzdElkLCBhcmcpO1xuICAgICAgICAgICAgfSldKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gZXJyIGluc3RhbmNlb2YgUmVqZWN0V2l0aFZhbHVlID8gcmVqZWN0ZWQobnVsbCwgcmVxdWVzdElkLCBhcmcsIGVyci5wYXlsb2FkLCBlcnIubWV0YSkgOiByZWplY3RlZChlcnIsIHJlcXVlc3RJZCwgYXJnKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKGFib3J0SGFuZGxlcikge1xuICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBza2lwRGlzcGF0Y2ggPSBvcHRpb25zICYmICFvcHRpb25zLmRpc3BhdGNoQ29uZGl0aW9uUmVqZWN0aW9uICYmIHJlamVjdGVkLm1hdGNoKGZpbmFsQWN0aW9uKSAmJiBmaW5hbEFjdGlvbi5tZXRhLmNvbmRpdGlvbjtcbiAgICAgICAgICBpZiAoIXNraXBEaXNwYXRjaCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goZmluYWxBY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmluYWxBY3Rpb247XG4gICAgICAgIH0oKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocHJvbWlzZSwge1xuICAgICAgICAgIGFib3J0LFxuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICBhcmcsXG4gICAgICAgICAgdW53cmFwKCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbih1bndyYXBSZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY3Rpb25DcmVhdG9yLCB7XG4gICAgICBwZW5kaW5nLFxuICAgICAgcmVqZWN0ZWQsXG4gICAgICBmdWxmaWxsZWQsXG4gICAgICBzZXR0bGVkOiBpc0FueU9mKHJlamVjdGVkLCBmdWxmaWxsZWQpLFxuICAgICAgdHlwZVByZWZpeFxuICAgIH0pO1xuICB9XG4gIGNyZWF0ZUFzeW5jVGh1bmsyLndpdGhUeXBlcyA9ICgpID0+IGNyZWF0ZUFzeW5jVGh1bmsyO1xuICByZXR1cm4gY3JlYXRlQXN5bmNUaHVuazI7XG59KSgpO1xuZnVuY3Rpb24gdW53cmFwUmVzdWx0KGFjdGlvbikge1xuICBpZiAoYWN0aW9uLm1ldGEgJiYgYWN0aW9uLm1ldGEucmVqZWN0ZWRXaXRoVmFsdWUpIHtcbiAgICB0aHJvdyBhY3Rpb24ucGF5bG9hZDtcbiAgfVxuICBpZiAoYWN0aW9uLmVycm9yKSB7XG4gICAgdGhyb3cgYWN0aW9uLmVycm9yO1xuICB9XG4gIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGlzVGhlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vLyBzcmMvY3JlYXRlU2xpY2UudHNcbnZhciBhc3luY1RodW5rU3ltYm9sID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoXCJydGstc2xpY2UtY3JlYXRlYXN5bmN0aHVua1wiKTtcbnZhciBhc3luY1RodW5rQ3JlYXRvciA9IHtcbiAgW2FzeW5jVGh1bmtTeW1ib2xdOiBjcmVhdGVBc3luY1RodW5rXG59O1xudmFyIFJlZHVjZXJUeXBlID0gLyogQF9fUFVSRV9fICovICgoUmVkdWNlclR5cGUyKSA9PiB7XG4gIFJlZHVjZXJUeXBlMltcInJlZHVjZXJcIl0gPSBcInJlZHVjZXJcIjtcbiAgUmVkdWNlclR5cGUyW1wicmVkdWNlcldpdGhQcmVwYXJlXCJdID0gXCJyZWR1Y2VyV2l0aFByZXBhcmVcIjtcbiAgUmVkdWNlclR5cGUyW1wiYXN5bmNUaHVua1wiXSA9IFwiYXN5bmNUaHVua1wiO1xuICByZXR1cm4gUmVkdWNlclR5cGUyO1xufSkoUmVkdWNlclR5cGUgfHwge30pO1xuZnVuY3Rpb24gZ2V0VHlwZShzbGljZSwgYWN0aW9uS2V5KSB7XG4gIHJldHVybiBgJHtzbGljZX0vJHthY3Rpb25LZXl9YDtcbn1cbmZ1bmN0aW9uIGJ1aWxkQ3JlYXRlU2xpY2Uoe1xuICBjcmVhdG9yc1xufSA9IHt9KSB7XG4gIGNvbnN0IGNBVCA9IGNyZWF0b3JzPy5hc3luY1RodW5rPy5bYXN5bmNUaHVua1N5bWJvbF07XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVTbGljZTIob3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICByZWR1Y2VyUGF0aCA9IG5hbWVcbiAgICB9ID0gb3B0aW9ucztcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiYG5hbWVgIGlzIGEgcmVxdWlyZWQgb3B0aW9uIGZvciBjcmVhdGVTbGljZVwiKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgIGlmIChvcHRpb25zLmluaXRpYWxTdGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJZb3UgbXVzdCBwcm92aWRlIGFuIGBpbml0aWFsU3RhdGVgIHZhbHVlIHRoYXQgaXMgbm90IGB1bmRlZmluZWRgLiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBgaW5pdGlhbFN0YXRlYFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVkdWNlcnMgPSAodHlwZW9mIG9wdGlvbnMucmVkdWNlcnMgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMucmVkdWNlcnMoYnVpbGRSZWR1Y2VyQ3JlYXRvcnMoKSkgOiBvcHRpb25zLnJlZHVjZXJzKSB8fCB7fTtcbiAgICBjb25zdCByZWR1Y2VyTmFtZXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lOiB7fSxcbiAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlOiB7fSxcbiAgICAgIGFjdGlvbkNyZWF0b3JzOiB7fSxcbiAgICAgIHNsaWNlTWF0Y2hlcnM6IFtdXG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0TWV0aG9kcyA9IHtcbiAgICAgIGFkZENhc2UodHlwZU9yQWN0aW9uQ3JlYXRvciwgcmVkdWNlcjIpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB0eXBlT3JBY3Rpb25DcmVhdG9yID09PSBcInN0cmluZ1wiID8gdHlwZU9yQWN0aW9uQ3JlYXRvciA6IHR5cGVPckFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJgY29udGV4dC5hZGRDYXNlYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYW4gZW1wdHkgYWN0aW9uIHR5cGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgaW4gY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IFwiYGNvbnRleHQuYWRkQ2FzZWAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIHR3byByZWR1Y2VycyBmb3IgdGhlIHNhbWUgYWN0aW9uIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZVt0eXBlXSA9IHJlZHVjZXIyO1xuICAgICAgICByZXR1cm4gY29udGV4dE1ldGhvZHM7XG4gICAgICB9LFxuICAgICAgYWRkTWF0Y2hlcihtYXRjaGVyLCByZWR1Y2VyMikge1xuICAgICAgICBjb250ZXh0LnNsaWNlTWF0Y2hlcnMucHVzaCh7XG4gICAgICAgICAgbWF0Y2hlcixcbiAgICAgICAgICByZWR1Y2VyOiByZWR1Y2VyMlxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfSxcbiAgICAgIGV4cG9zZUFjdGlvbihuYW1lMiwgYWN0aW9uQ3JlYXRvcikge1xuICAgICAgICBjb250ZXh0LmFjdGlvbkNyZWF0b3JzW25hbWUyXSA9IGFjdGlvbkNyZWF0b3I7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH0sXG4gICAgICBleHBvc2VDYXNlUmVkdWNlcihuYW1lMiwgcmVkdWNlcjIpIHtcbiAgICAgICAgY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5TmFtZVtuYW1lMl0gPSByZWR1Y2VyMjtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVkdWNlck5hbWVzLmZvckVhY2goKHJlZHVjZXJOYW1lKSA9PiB7XG4gICAgICBjb25zdCByZWR1Y2VyRGVmaW5pdGlvbiA9IHJlZHVjZXJzW3JlZHVjZXJOYW1lXTtcbiAgICAgIGNvbnN0IHJlZHVjZXJEZXRhaWxzID0ge1xuICAgICAgICByZWR1Y2VyTmFtZSxcbiAgICAgICAgdHlwZTogZ2V0VHlwZShuYW1lLCByZWR1Y2VyTmFtZSksXG4gICAgICAgIGNyZWF0ZU5vdGF0aW9uOiB0eXBlb2Ygb3B0aW9ucy5yZWR1Y2VycyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICB9O1xuICAgICAgaWYgKGlzQXN5bmNUaHVua1NsaWNlUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRlZmluaXRpb24pKSB7XG4gICAgICAgIGhhbmRsZVRodW5rQ2FzZVJlZHVjZXJEZWZpbml0aW9uKHJlZHVjZXJEZXRhaWxzLCByZWR1Y2VyRGVmaW5pdGlvbiwgY29udGV4dE1ldGhvZHMsIGNBVCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYW5kbGVOb3JtYWxSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGV0YWlscywgcmVkdWNlckRlZmluaXRpb24sIGNvbnRleHRNZXRob2RzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmdW5jdGlvbiBidWlsZFJlZHVjZXIoKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5leHRyYVJlZHVjZXJzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogXCJUaGUgb2JqZWN0IG5vdGF0aW9uIGZvciBgY3JlYXRlU2xpY2UuZXh0cmFSZWR1Y2Vyc2AgaGFzIGJlZW4gcmVtb3ZlZC4gUGxlYXNlIHVzZSB0aGUgJ2J1aWxkZXIgY2FsbGJhY2snIG5vdGF0aW9uIGluc3RlYWQ6IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2NyZWF0ZVNsaWNlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBbZXh0cmFSZWR1Y2VycyA9IHt9LCBhY3Rpb25NYXRjaGVycyA9IFtdLCBkZWZhdWx0Q2FzZVJlZHVjZXIgPSB2b2lkIDBdID0gdHlwZW9mIG9wdGlvbnMuZXh0cmFSZWR1Y2VycyA9PT0gXCJmdW5jdGlvblwiID8gZXhlY3V0ZVJlZHVjZXJCdWlsZGVyQ2FsbGJhY2sob3B0aW9ucy5leHRyYVJlZHVjZXJzKSA6IFtvcHRpb25zLmV4dHJhUmVkdWNlcnNdO1xuICAgICAgY29uc3QgZmluYWxDYXNlUmVkdWNlcnMgPSB7XG4gICAgICAgIC4uLmV4dHJhUmVkdWNlcnMsXG4gICAgICAgIC4uLmNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGVcbiAgICAgIH07XG4gICAgICByZXR1cm4gY3JlYXRlUmVkdWNlcihvcHRpb25zLmluaXRpYWxTdGF0ZSwgKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGZpbmFsQ2FzZVJlZHVjZXJzKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGRDYXNlKGtleSwgZmluYWxDYXNlUmVkdWNlcnNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgc00gb2YgY29udGV4dC5zbGljZU1hdGNoZXJzKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGRNYXRjaGVyKHNNLm1hdGNoZXIsIHNNLnJlZHVjZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG0gb2YgYWN0aW9uTWF0Y2hlcnMpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZE1hdGNoZXIobS5tYXRjaGVyLCBtLnJlZHVjZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZERlZmF1bHRDYXNlKGRlZmF1bHRDYXNlUmVkdWNlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RTZWxmID0gKHN0YXRlKSA9PiBzdGF0ZTtcbiAgICBjb25zdCBpbmplY3RlZFNlbGVjdG9yQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGxldCBfcmVkdWNlcjtcbiAgICBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgIGlmICghX3JlZHVjZXIpIF9yZWR1Y2VyID0gYnVpbGRSZWR1Y2VyKCk7XG4gICAgICByZXR1cm4gX3JlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgIGlmICghX3JlZHVjZXIpIF9yZWR1Y2VyID0gYnVpbGRSZWR1Y2VyKCk7XG4gICAgICByZXR1cm4gX3JlZHVjZXIuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VTZWxlY3RvclByb3BzKHJlZHVjZXJQYXRoMiwgaW5qZWN0ZWQgPSBmYWxzZSkge1xuICAgICAgZnVuY3Rpb24gc2VsZWN0U2xpY2Uoc3RhdGUpIHtcbiAgICAgICAgbGV0IHNsaWNlU3RhdGUgPSBzdGF0ZVtyZWR1Y2VyUGF0aDJdO1xuICAgICAgICBpZiAodHlwZW9mIHNsaWNlU3RhdGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgICAgIHNsaWNlU3RhdGUgPSBnZXRJbml0aWFsU3RhdGUoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTUpIDogXCJzZWxlY3RTbGljZSByZXR1cm5lZCB1bmRlZmluZWQgZm9yIGFuIHVuaW5qZWN0ZWQgc2xpY2UgcmVkdWNlclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNsaWNlU3RhdGU7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBnZXRTZWxlY3RvcnMoc2VsZWN0U3RhdGUgPSBzZWxlY3RTZWxmKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yQ2FjaGUgPSBlbXBsYWNlKGluamVjdGVkU2VsZWN0b3JDYWNoZSwgaW5qZWN0ZWQsIHtcbiAgICAgICAgICBpbnNlcnQ6ICgpID0+IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZW1wbGFjZShzZWxlY3RvckNhY2hlLCBzZWxlY3RTdGF0ZSwge1xuICAgICAgICAgIGluc2VydDogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWFwID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtuYW1lMiwgc2VsZWN0b3JdIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuc2VsZWN0b3JzID8/IHt9KSkge1xuICAgICAgICAgICAgICBtYXBbbmFtZTJdID0gd3JhcFNlbGVjdG9yKHNlbGVjdG9yLCBzZWxlY3RTdGF0ZSwgZ2V0SW5pdGlhbFN0YXRlLCBpbmplY3RlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWR1Y2VyUGF0aDogcmVkdWNlclBhdGgyLFxuICAgICAgICBnZXRTZWxlY3RvcnMsXG4gICAgICAgIGdldCBzZWxlY3RvcnMoKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9ycyhzZWxlY3RTbGljZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdFNsaWNlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzbGljZSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICByZWR1Y2VyLFxuICAgICAgYWN0aW9uczogY29udGV4dC5hY3Rpb25DcmVhdG9ycyxcbiAgICAgIGNhc2VSZWR1Y2VyczogY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5TmFtZSxcbiAgICAgIGdldEluaXRpYWxTdGF0ZSxcbiAgICAgIC4uLm1ha2VTZWxlY3RvclByb3BzKHJlZHVjZXJQYXRoKSxcbiAgICAgIGluamVjdEludG8oaW5qZWN0YWJsZSwge1xuICAgICAgICByZWR1Y2VyUGF0aDogcGF0aE9wdCxcbiAgICAgICAgLi4uY29uZmlnXG4gICAgICB9ID0ge30pIHtcbiAgICAgICAgY29uc3QgbmV3UmVkdWNlclBhdGggPSBwYXRoT3B0ID8/IHJlZHVjZXJQYXRoO1xuICAgICAgICBpbmplY3RhYmxlLmluamVjdCh7XG4gICAgICAgICAgcmVkdWNlclBhdGg6IG5ld1JlZHVjZXJQYXRoLFxuICAgICAgICAgIHJlZHVjZXJcbiAgICAgICAgfSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zbGljZSxcbiAgICAgICAgICAuLi5tYWtlU2VsZWN0b3JQcm9wcyhuZXdSZWR1Y2VyUGF0aCwgdHJ1ZSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBzbGljZTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHdyYXBTZWxlY3RvcihzZWxlY3Rvciwgc2VsZWN0U3RhdGUsIGdldEluaXRpYWxTdGF0ZSwgaW5qZWN0ZWQpIHtcbiAgZnVuY3Rpb24gd3JhcHBlcihyb290U3RhdGUsIC4uLmFyZ3MpIHtcbiAgICBsZXQgc2xpY2VTdGF0ZSA9IHNlbGVjdFN0YXRlKHJvb3RTdGF0ZSk7XG4gICAgaWYgKHR5cGVvZiBzbGljZVN0YXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgc2xpY2VTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJzZWxlY3RTdGF0ZSByZXR1cm5lZCB1bmRlZmluZWQgZm9yIGFuIHVuaW5qZWN0ZWQgc2xpY2UgcmVkdWNlclwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdG9yKHNsaWNlU3RhdGUsIC4uLmFyZ3MpO1xuICB9XG4gIHdyYXBwZXIudW53cmFwcGVkID0gc2VsZWN0b3I7XG4gIHJldHVybiB3cmFwcGVyO1xufVxudmFyIGNyZWF0ZVNsaWNlID0gLyogQF9fUFVSRV9fICovIGJ1aWxkQ3JlYXRlU2xpY2UoKTtcbmZ1bmN0aW9uIGJ1aWxkUmVkdWNlckNyZWF0b3JzKCkge1xuICBmdW5jdGlvbiBhc3luY1RodW5rKHBheWxvYWRDcmVhdG9yLCBjb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX3JlZHVjZXJEZWZpbml0aW9uVHlwZTogXCJhc3luY1RodW5rXCIgLyogYXN5bmNUaHVuayAqLyxcbiAgICAgIHBheWxvYWRDcmVhdG9yLFxuICAgICAgLi4uY29uZmlnXG4gICAgfTtcbiAgfVxuICBhc3luY1RodW5rLndpdGhUeXBlcyA9ICgpID0+IGFzeW5jVGh1bms7XG4gIHJldHVybiB7XG4gICAgcmVkdWNlcihjYXNlUmVkdWNlcikge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAvLyBoYWNrIHNvIHRoZSB3cmFwcGluZyBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNvIHRoZSBgcmVkdWNlckRlZmluaXRpb25UeXBlYCBpcyBub3QgYXNzaWduZWQgdG8gdGhlIG9yaWdpbmFsXG4gICAgICAgIFtjYXNlUmVkdWNlci5uYW1lXSguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGNhc2VSZWR1Y2VyKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9W2Nhc2VSZWR1Y2VyLm5hbWVdLCB7XG4gICAgICAgIF9yZWR1Y2VyRGVmaW5pdGlvblR5cGU6IFwicmVkdWNlclwiIC8qIHJlZHVjZXIgKi9cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlcGFyZWRSZWR1Y2VyKHByZXBhcmUsIHJlZHVjZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9yZWR1Y2VyRGVmaW5pdGlvblR5cGU6IFwicmVkdWNlcldpdGhQcmVwYXJlXCIgLyogcmVkdWNlcldpdGhQcmVwYXJlICovLFxuICAgICAgICBwcmVwYXJlLFxuICAgICAgICByZWR1Y2VyXG4gICAgICB9O1xuICAgIH0sXG4gICAgYXN5bmNUaHVua1xuICB9O1xufVxuZnVuY3Rpb24gaGFuZGxlTm9ybWFsUmVkdWNlckRlZmluaXRpb24oe1xuICB0eXBlLFxuICByZWR1Y2VyTmFtZSxcbiAgY3JlYXRlTm90YXRpb25cbn0sIG1heWJlUmVkdWNlcldpdGhQcmVwYXJlLCBjb250ZXh0KSB7XG4gIGxldCBjYXNlUmVkdWNlcjtcbiAgbGV0IHByZXBhcmVDYWxsYmFjaztcbiAgaWYgKFwicmVkdWNlclwiIGluIG1heWJlUmVkdWNlcldpdGhQcmVwYXJlKSB7XG4gICAgaWYgKGNyZWF0ZU5vdGF0aW9uICYmICFpc0Nhc2VSZWR1Y2VyV2l0aFByZXBhcmVEZWZpbml0aW9uKG1heWJlUmVkdWNlcldpdGhQcmVwYXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTcpIDogXCJQbGVhc2UgdXNlIHRoZSBgY3JlYXRlLnByZXBhcmVkUmVkdWNlcmAgbm90YXRpb24gZm9yIHByZXBhcmVkIGFjdGlvbiBjcmVhdG9ycyB3aXRoIHRoZSBgY3JlYXRlYCBub3RhdGlvbi5cIik7XG4gICAgfVxuICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUucmVkdWNlcjtcbiAgICBwcmVwYXJlQ2FsbGJhY2sgPSBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZS5wcmVwYXJlO1xuICB9IGVsc2Uge1xuICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmU7XG4gIH1cbiAgY29udGV4dC5hZGRDYXNlKHR5cGUsIGNhc2VSZWR1Y2VyKS5leHBvc2VDYXNlUmVkdWNlcihyZWR1Y2VyTmFtZSwgY2FzZVJlZHVjZXIpLmV4cG9zZUFjdGlvbihyZWR1Y2VyTmFtZSwgcHJlcGFyZUNhbGxiYWNrID8gY3JlYXRlQWN0aW9uKHR5cGUsIHByZXBhcmVDYWxsYmFjaykgOiBjcmVhdGVBY3Rpb24odHlwZSkpO1xufVxuZnVuY3Rpb24gaXNBc3luY1RodW5rU2xpY2VSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGVmaW5pdGlvbikge1xuICByZXR1cm4gcmVkdWNlckRlZmluaXRpb24uX3JlZHVjZXJEZWZpbml0aW9uVHlwZSA9PT0gXCJhc3luY1RodW5rXCIgLyogYXN5bmNUaHVuayAqLztcbn1cbmZ1bmN0aW9uIGlzQ2FzZVJlZHVjZXJXaXRoUHJlcGFyZURlZmluaXRpb24ocmVkdWNlckRlZmluaXRpb24pIHtcbiAgcmV0dXJuIHJlZHVjZXJEZWZpbml0aW9uLl9yZWR1Y2VyRGVmaW5pdGlvblR5cGUgPT09IFwicmVkdWNlcldpdGhQcmVwYXJlXCIgLyogcmVkdWNlcldpdGhQcmVwYXJlICovO1xufVxuZnVuY3Rpb24gaGFuZGxlVGh1bmtDYXNlUmVkdWNlckRlZmluaXRpb24oe1xuICB0eXBlLFxuICByZWR1Y2VyTmFtZVxufSwgcmVkdWNlckRlZmluaXRpb24sIGNvbnRleHQsIGNBVCkge1xuICBpZiAoIWNBVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE4KSA6IFwiQ2Fubm90IHVzZSBgY3JlYXRlLmFzeW5jVGh1bmtgIGluIHRoZSBidWlsdC1pbiBgY3JlYXRlU2xpY2VgLiBVc2UgYGJ1aWxkQ3JlYXRlU2xpY2UoeyBjcmVhdG9yczogeyBhc3luY1RodW5rOiBhc3luY1RodW5rQ3JlYXRvciB9IH0pYCB0byBjcmVhdGUgYSBjdXN0b21pc2VkIHZlcnNpb24gb2YgYGNyZWF0ZVNsaWNlYC5cIik7XG4gIH1cbiAgY29uc3Qge1xuICAgIHBheWxvYWRDcmVhdG9yLFxuICAgIGZ1bGZpbGxlZCxcbiAgICBwZW5kaW5nLFxuICAgIHJlamVjdGVkLFxuICAgIHNldHRsZWQsXG4gICAgb3B0aW9uc1xuICB9ID0gcmVkdWNlckRlZmluaXRpb247XG4gIGNvbnN0IHRodW5rID0gY0FUKHR5cGUsIHBheWxvYWRDcmVhdG9yLCBvcHRpb25zKTtcbiAgY29udGV4dC5leHBvc2VBY3Rpb24ocmVkdWNlck5hbWUsIHRodW5rKTtcbiAgaWYgKGZ1bGZpbGxlZCkge1xuICAgIGNvbnRleHQuYWRkQ2FzZSh0aHVuay5mdWxmaWxsZWQsIGZ1bGZpbGxlZCk7XG4gIH1cbiAgaWYgKHBlbmRpbmcpIHtcbiAgICBjb250ZXh0LmFkZENhc2UodGh1bmsucGVuZGluZywgcGVuZGluZyk7XG4gIH1cbiAgaWYgKHJlamVjdGVkKSB7XG4gICAgY29udGV4dC5hZGRDYXNlKHRodW5rLnJlamVjdGVkLCByZWplY3RlZCk7XG4gIH1cbiAgaWYgKHNldHRsZWQpIHtcbiAgICBjb250ZXh0LmFkZE1hdGNoZXIodGh1bmsuc2V0dGxlZCwgc2V0dGxlZCk7XG4gIH1cbiAgY29udGV4dC5leHBvc2VDYXNlUmVkdWNlcihyZWR1Y2VyTmFtZSwge1xuICAgIGZ1bGZpbGxlZDogZnVsZmlsbGVkIHx8IG5vb3AsXG4gICAgcGVuZGluZzogcGVuZGluZyB8fCBub29wLFxuICAgIHJlamVjdGVkOiByZWplY3RlZCB8fCBub29wLFxuICAgIHNldHRsZWQ6IHNldHRsZWQgfHwgbm9vcFxuICB9KTtcbn1cbmZ1bmN0aW9uIG5vb3AoKSB7XG59XG5cbi8vIHNyYy9lbnRpdGllcy9lbnRpdHlfc3RhdGUudHNcbmZ1bmN0aW9uIGdldEluaXRpYWxFbnRpdHlTdGF0ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBpZHM6IFtdLFxuICAgIGVudGl0aWVzOiB7fVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW5pdGlhbFN0YXRlRmFjdG9yeShzdGF0ZUFkYXB0ZXIpIHtcbiAgZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKGFkZGl0aW9uYWxTdGF0ZSA9IHt9LCBlbnRpdGllcykge1xuICAgIGNvbnN0IHN0YXRlID0gT2JqZWN0LmFzc2lnbihnZXRJbml0aWFsRW50aXR5U3RhdGUoKSwgYWRkaXRpb25hbFN0YXRlKTtcbiAgICByZXR1cm4gZW50aXRpZXMgPyBzdGF0ZUFkYXB0ZXIuc2V0QWxsKHN0YXRlLCBlbnRpdGllcykgOiBzdGF0ZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldEluaXRpYWxTdGF0ZVxuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvc3RhdGVfc2VsZWN0b3JzLnRzXG5mdW5jdGlvbiBjcmVhdGVTZWxlY3RvcnNGYWN0b3J5KCkge1xuICBmdW5jdGlvbiBnZXRTZWxlY3RvcnMoc2VsZWN0U3RhdGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNyZWF0ZVNlbGVjdG9yOiBjcmVhdGVTZWxlY3RvcjIgPSBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvclxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHNlbGVjdElkcyA9IChzdGF0ZSkgPT4gc3RhdGUuaWRzO1xuICAgIGNvbnN0IHNlbGVjdEVudGl0aWVzID0gKHN0YXRlKSA9PiBzdGF0ZS5lbnRpdGllcztcbiAgICBjb25zdCBzZWxlY3RBbGwgPSBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0SWRzLCBzZWxlY3RFbnRpdGllcywgKGlkcywgZW50aXRpZXMpID0+IGlkcy5tYXAoKGlkKSA9PiBlbnRpdGllc1tpZF0pKTtcbiAgICBjb25zdCBzZWxlY3RJZCA9IChfLCBpZCkgPT4gaWQ7XG4gICAgY29uc3Qgc2VsZWN0QnlJZCA9IChlbnRpdGllcywgaWQpID0+IGVudGl0aWVzW2lkXTtcbiAgICBjb25zdCBzZWxlY3RUb3RhbCA9IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RJZHMsIChpZHMpID0+IGlkcy5sZW5ndGgpO1xuICAgIGlmICghc2VsZWN0U3RhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdElkcyxcbiAgICAgICAgc2VsZWN0RW50aXRpZXMsXG4gICAgICAgIHNlbGVjdEFsbCxcbiAgICAgICAgc2VsZWN0VG90YWwsXG4gICAgICAgIHNlbGVjdEJ5SWQ6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RFbnRpdGllcywgc2VsZWN0SWQsIHNlbGVjdEJ5SWQpXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RHbG9iYWxpemVkRW50aXRpZXMgPSBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdEVudGl0aWVzKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0SWRzOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdElkcyksXG4gICAgICBzZWxlY3RFbnRpdGllczogc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLFxuICAgICAgc2VsZWN0QWxsOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdEFsbCksXG4gICAgICBzZWxlY3RUb3RhbDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RUb3RhbCksXG4gICAgICBzZWxlY3RCeUlkOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLCBzZWxlY3RJZCwgc2VsZWN0QnlJZClcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2V0U2VsZWN0b3JzXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9zdGF0ZV9hZGFwdGVyLnRzXG5pbXBvcnQgeyBwcm9kdWNlIGFzIGNyZWF0ZU5leHRTdGF0ZTMsIGlzRHJhZnQgYXMgaXNEcmFmdDMgfSBmcm9tIFwiaW1tZXJcIjtcbnZhciBpc0RyYWZ0VHlwZWQgPSBpc0RyYWZ0MztcbmZ1bmN0aW9uIGNyZWF0ZVNpbmdsZUFyZ3VtZW50U3RhdGVPcGVyYXRvcihtdXRhdG9yKSB7XG4gIGNvbnN0IG9wZXJhdG9yID0gY3JlYXRlU3RhdGVPcGVyYXRvcigoXywgc3RhdGUpID0+IG11dGF0b3Ioc3RhdGUpKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9wZXJhdGlvbihzdGF0ZSkge1xuICAgIHJldHVybiBvcGVyYXRvcihzdGF0ZSwgdm9pZCAwKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRlT3BlcmF0b3IobXV0YXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gb3BlcmF0aW9uKHN0YXRlLCBhcmcpIHtcbiAgICBmdW5jdGlvbiBpc1BheWxvYWRBY3Rpb25Bcmd1bWVudChhcmcyKSB7XG4gICAgICByZXR1cm4gaXNGU0EoYXJnMik7XG4gICAgfVxuICAgIGNvbnN0IHJ1bk11dGF0b3IgPSAoZHJhZnQpID0+IHtcbiAgICAgIGlmIChpc1BheWxvYWRBY3Rpb25Bcmd1bWVudChhcmcpKSB7XG4gICAgICAgIG11dGF0b3IoYXJnLnBheWxvYWQsIGRyYWZ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11dGF0b3IoYXJnLCBkcmFmdCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoaXNEcmFmdFR5cGVkKHN0YXRlKSkge1xuICAgICAgcnVuTXV0YXRvcihzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVOZXh0U3RhdGUzKHN0YXRlLCBydW5NdXRhdG9yKTtcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3V0aWxzLnRzXG5pbXBvcnQgeyBjdXJyZW50IGFzIGN1cnJlbnQyLCBpc0RyYWZ0IGFzIGlzRHJhZnQ0IH0gZnJvbSBcImltbWVyXCI7XG5mdW5jdGlvbiBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpIHtcbiAgY29uc3Qga2V5ID0gc2VsZWN0SWQoZW50aXR5KTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBrZXkgPT09IHZvaWQgMCkge1xuICAgIGNvbnNvbGUud2FybihcIlRoZSBlbnRpdHkgcGFzc2VkIHRvIHRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uIHJldHVybmVkIHVuZGVmaW5lZC5cIiwgXCJZb3Ugc2hvdWxkIHByb2JhYmx5IHByb3ZpZGUgeW91ciBvd24gYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbi5cIiwgXCJUaGUgZW50aXR5IHRoYXQgd2FzIHBhc3NlZDpcIiwgZW50aXR5LCBcIlRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uOlwiLCBzZWxlY3RJZC50b1N0cmluZygpKTtcbiAgfVxuICByZXR1cm4ga2V5O1xufVxuZnVuY3Rpb24gZW5zdXJlRW50aXRpZXNBcnJheShlbnRpdGllcykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZW50aXRpZXMpKSB7XG4gICAgZW50aXRpZXMgPSBPYmplY3QudmFsdWVzKGVudGl0aWVzKTtcbiAgfVxuICByZXR1cm4gZW50aXRpZXM7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50KHZhbHVlKSB7XG4gIHJldHVybiBpc0RyYWZ0NCh2YWx1ZSkgPyBjdXJyZW50Mih2YWx1ZSkgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNwbGl0QWRkZWRVcGRhdGVkRW50aXRpZXMobmV3RW50aXRpZXMsIHNlbGVjdElkLCBzdGF0ZSkge1xuICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICBjb25zdCBleGlzdGluZ0lkc0FycmF5ID0gZ2V0Q3VycmVudChzdGF0ZS5pZHMpO1xuICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQoZXhpc3RpbmdJZHNBcnJheSk7XG4gIGNvbnN0IGFkZGVkID0gW107XG4gIGNvbnN0IHVwZGF0ZWQgPSBbXTtcbiAgZm9yIChjb25zdCBlbnRpdHkgb2YgbmV3RW50aXRpZXMpIHtcbiAgICBjb25zdCBpZCA9IHNlbGVjdElkVmFsdWUoZW50aXR5LCBzZWxlY3RJZCk7XG4gICAgaWYgKGV4aXN0aW5nSWRzLmhhcyhpZCkpIHtcbiAgICAgIHVwZGF0ZWQucHVzaCh7XG4gICAgICAgIGlkLFxuICAgICAgICBjaGFuZ2VzOiBlbnRpdHlcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRlZC5wdXNoKGVudGl0eSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbYWRkZWQsIHVwZGF0ZWQsIGV4aXN0aW5nSWRzQXJyYXldO1xufVxuXG4vLyBzcmMvZW50aXRpZXMvdW5zb3J0ZWRfc3RhdGVfYWRhcHRlci50c1xuZnVuY3Rpb24gY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpIHtcbiAgZnVuY3Rpb24gYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgY29uc3Qga2V5ID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcbiAgICBpZiAoa2V5IGluIHN0YXRlLmVudGl0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlLmlkcy5wdXNoKGtleSk7XG4gICAgc3RhdGUuZW50aXRpZXNba2V5XSA9IGVudGl0eTtcbiAgfVxuICBmdW5jdGlvbiBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIG5ld0VudGl0aWVzKSB7XG4gICAgICBhZGRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICBjb25zdCBrZXkgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xuICAgIGlmICghKGtleSBpbiBzdGF0ZS5lbnRpdGllcykpIHtcbiAgICAgIHN0YXRlLmlkcy5wdXNoKGtleSk7XG4gICAgfVxuICAgIDtcbiAgICBzdGF0ZS5lbnRpdGllc1trZXldID0gZW50aXR5O1xuICB9XG4gIGZ1bmN0aW9uIHNldE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgbmV3RW50aXRpZXMpIHtcbiAgICAgIHNldE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldEFsbE11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBzdGF0ZS5pZHMgPSBbXTtcbiAgICBzdGF0ZS5lbnRpdGllcyA9IHt9O1xuICAgIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlT25lTXV0YWJseShrZXksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHJlbW92ZU1hbnlNdXRhYmx5KFtrZXldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlTWFueU11dGFibHkoa2V5cywgc3RhdGUpIHtcbiAgICBsZXQgZGlkTXV0YXRlID0gZmFsc2U7XG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkgaW4gc3RhdGUuZW50aXRpZXMpIHtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW2tleV07XG4gICAgICAgIGRpZE11dGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGRpZE11dGF0ZSkge1xuICAgICAgc3RhdGUuaWRzID0gc3RhdGUuaWRzLmZpbHRlcigoaWQpID0+IGlkIGluIHN0YXRlLmVudGl0aWVzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlQWxsTXV0YWJseShzdGF0ZSkge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHtcbiAgICAgIGlkczogW10sXG4gICAgICBlbnRpdGllczoge31cbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiB0YWtlTmV3S2V5KGtleXMsIHVwZGF0ZSwgc3RhdGUpIHtcbiAgICBjb25zdCBvcmlnaW5hbDMgPSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xuICAgIGlmIChvcmlnaW5hbDMgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkID0gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWwzLCB1cGRhdGUuY2hhbmdlcyk7XG4gICAgY29uc3QgbmV3S2V5ID0gc2VsZWN0SWRWYWx1ZSh1cGRhdGVkLCBzZWxlY3RJZCk7XG4gICAgY29uc3QgaGFzTmV3S2V5ID0gbmV3S2V5ICE9PSB1cGRhdGUuaWQ7XG4gICAgaWYgKGhhc05ld0tleSkge1xuICAgICAga2V5c1t1cGRhdGUuaWRdID0gbmV3S2V5O1xuICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgfVxuICAgIDtcbiAgICBzdGF0ZS5lbnRpdGllc1tuZXdLZXldID0gdXBkYXRlZDtcbiAgICByZXR1cm4gaGFzTmV3S2V5O1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZU9uZU11dGFibHkodXBkYXRlLCBzdGF0ZSkge1xuICAgIHJldHVybiB1cGRhdGVNYW55TXV0YWJseShbdXBkYXRlXSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgbmV3S2V5cyA9IHt9O1xuICAgIGNvbnN0IHVwZGF0ZXNQZXJFbnRpdHkgPSB7fTtcbiAgICB1cGRhdGVzLmZvckVhY2goKHVwZGF0ZSkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZS5pZCBpbiBzdGF0ZS5lbnRpdGllcykge1xuICAgICAgICB1cGRhdGVzUGVyRW50aXR5W3VwZGF0ZS5pZF0gPSB7XG4gICAgICAgICAgaWQ6IHVwZGF0ZS5pZCxcbiAgICAgICAgICAvLyBTcHJlYWRzIGlnbm9yZSBmYWxzeSB2YWx1ZXMsIHNvIHRoaXMgd29ya3MgZXZlbiBpZiB0aGVyZSBpc24ndFxuICAgICAgICAgIC8vIGFuIGV4aXN0aW5nIHVwZGF0ZSBhbHJlYWR5IGF0IHRoaXMga2V5XG4gICAgICAgICAgY2hhbmdlczoge1xuICAgICAgICAgICAgLi4udXBkYXRlc1BlckVudGl0eVt1cGRhdGUuaWRdPy5jaGFuZ2VzLFxuICAgICAgICAgICAgLi4udXBkYXRlLmNoYW5nZXNcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgdXBkYXRlcyA9IE9iamVjdC52YWx1ZXModXBkYXRlc1BlckVudGl0eSk7XG4gICAgY29uc3QgZGlkTXV0YXRlRW50aXRpZXMgPSB1cGRhdGVzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGRpZE11dGF0ZUVudGl0aWVzKSB7XG4gICAgICBjb25zdCBkaWRNdXRhdGVJZHMgPSB1cGRhdGVzLmZpbHRlcigodXBkYXRlKSA9PiB0YWtlTmV3S2V5KG5ld0tleXMsIHVwZGF0ZSwgc3RhdGUpKS5sZW5ndGggPiAwO1xuICAgICAgaWYgKGRpZE11dGF0ZUlkcykge1xuICAgICAgICBzdGF0ZS5pZHMgPSBPYmplY3QudmFsdWVzKHN0YXRlLmVudGl0aWVzKS5tYXAoKGUpID0+IHNlbGVjdElkVmFsdWUoZSwgc2VsZWN0SWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwc2VydE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgW2FkZGVkLCB1cGRhdGVkXSA9IHNwbGl0QWRkZWRVcGRhdGVkRW50aXRpZXMobmV3RW50aXRpZXMsIHNlbGVjdElkLCBzdGF0ZSk7XG4gICAgdXBkYXRlTWFueU11dGFibHkodXBkYXRlZCwgc3RhdGUpO1xuICAgIGFkZE1hbnlNdXRhYmx5KGFkZGVkLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW1vdmVBbGw6IGNyZWF0ZVNpbmdsZUFyZ3VtZW50U3RhdGVPcGVyYXRvcihyZW1vdmVBbGxNdXRhYmx5KSxcbiAgICBhZGRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkT25lTXV0YWJseSksXG4gICAgYWRkTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRNYW55TXV0YWJseSksXG4gICAgc2V0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE9uZU11dGFibHkpLFxuICAgIHNldE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0TWFueU11dGFibHkpLFxuICAgIHNldEFsbDogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRBbGxNdXRhYmx5KSxcbiAgICB1cGRhdGVPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlT25lTXV0YWJseSksXG4gICAgdXBkYXRlTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVNYW55TXV0YWJseSksXG4gICAgdXBzZXJ0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE9uZU11dGFibHkpLFxuICAgIHVwc2VydE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0TWFueU11dGFibHkpLFxuICAgIHJlbW92ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihyZW1vdmVPbmVNdXRhYmx5KSxcbiAgICByZW1vdmVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHJlbW92ZU1hbnlNdXRhYmx5KVxuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvc29ydGVkX3N0YXRlX2FkYXB0ZXIudHNcbmZ1bmN0aW9uIGZpbmRJbnNlcnRJbmRleChzb3J0ZWRJdGVtcywgaXRlbSwgY29tcGFyaXNvbkZ1bmN0aW9uKSB7XG4gIGxldCBsb3dJbmRleCA9IDA7XG4gIGxldCBoaWdoSW5kZXggPSBzb3J0ZWRJdGVtcy5sZW5ndGg7XG4gIHdoaWxlIChsb3dJbmRleCA8IGhpZ2hJbmRleCkge1xuICAgIGxldCBtaWRkbGVJbmRleCA9IGxvd0luZGV4ICsgaGlnaEluZGV4ID4+PiAxO1xuICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gc29ydGVkSXRlbXNbbWlkZGxlSW5kZXhdO1xuICAgIGNvbnN0IHJlcyA9IGNvbXBhcmlzb25GdW5jdGlvbihpdGVtLCBjdXJyZW50SXRlbSk7XG4gICAgaWYgKHJlcyA+PSAwKSB7XG4gICAgICBsb3dJbmRleCA9IG1pZGRsZUluZGV4ICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGlnaEluZGV4ID0gbWlkZGxlSW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiBsb3dJbmRleDtcbn1cbmZ1bmN0aW9uIGluc2VydChzb3J0ZWRJdGVtcywgaXRlbSwgY29tcGFyaXNvbkZ1bmN0aW9uKSB7XG4gIGNvbnN0IGluc2VydEF0SW5kZXggPSBmaW5kSW5zZXJ0SW5kZXgoc29ydGVkSXRlbXMsIGl0ZW0sIGNvbXBhcmlzb25GdW5jdGlvbik7XG4gIHNvcnRlZEl0ZW1zLnNwbGljZShpbnNlcnRBdEluZGV4LCAwLCBpdGVtKTtcbiAgcmV0dXJuIHNvcnRlZEl0ZW1zO1xufVxuZnVuY3Rpb24gY3JlYXRlU29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkLCBjb21wYXJlcikge1xuICBjb25zdCB7XG4gICAgcmVtb3ZlT25lLFxuICAgIHJlbW92ZU1hbnksXG4gICAgcmVtb3ZlQWxsXG4gIH0gPSBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCk7XG4gIGZ1bmN0aW9uIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIHJldHVybiBhZGRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSwgZXhpc3RpbmdJZHMpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQoZXhpc3RpbmdJZHMgPz8gZ2V0Q3VycmVudChzdGF0ZS5pZHMpKTtcbiAgICBjb25zdCBtb2RlbHMgPSBuZXdFbnRpdGllcy5maWx0ZXIoKG1vZGVsKSA9PiAhZXhpc3RpbmdLZXlzLmhhcyhzZWxlY3RJZFZhbHVlKG1vZGVsLCBzZWxlY3RJZCkpKTtcbiAgICBpZiAobW9kZWxzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgbWVyZ2VGdW5jdGlvbihzdGF0ZSwgbW9kZWxzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHNldE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBpZiAobmV3RW50aXRpZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3RW50aXRpZXMpIHtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW3NlbGVjdElkKGl0ZW0pXTtcbiAgICAgIH1cbiAgICAgIG1lcmdlRnVuY3Rpb24oc3RhdGUsIG5ld0VudGl0aWVzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0QWxsTXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIHN0YXRlLmVudGl0aWVzID0ge307XG4gICAgc3RhdGUuaWRzID0gW107XG4gICAgYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlLCBbXSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlT25lTXV0YWJseSh1cGRhdGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU1hbnlNdXRhYmx5KFt1cGRhdGVdLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlTWFueU11dGFibHkodXBkYXRlcywgc3RhdGUpIHtcbiAgICBsZXQgYXBwbGllZFVwZGF0ZXMgPSBmYWxzZTtcbiAgICBsZXQgcmVwbGFjZWRJZHMgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB1cGRhdGUgb2YgdXBkYXRlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICAgIGlmICghZW50aXR5KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXBwbGllZFVwZGF0ZXMgPSB0cnVlO1xuICAgICAgT2JqZWN0LmFzc2lnbihlbnRpdHksIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgIGNvbnN0IG5ld0lkID0gc2VsZWN0SWQoZW50aXR5KTtcbiAgICAgIGlmICh1cGRhdGUuaWQgIT09IG5ld0lkKSB7XG4gICAgICAgIHJlcGxhY2VkSWRzID0gdHJ1ZTtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gc3RhdGUuaWRzLmluZGV4T2YodXBkYXRlLmlkKTtcbiAgICAgICAgc3RhdGUuaWRzW29sZEluZGV4XSA9IG5ld0lkO1xuICAgICAgICBzdGF0ZS5lbnRpdGllc1tuZXdJZF0gPSBlbnRpdHk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcHBsaWVkVXBkYXRlcykge1xuICAgICAgbWVyZ2VGdW5jdGlvbihzdGF0ZSwgW10sIGFwcGxpZWRVcGRhdGVzLCByZXBsYWNlZElkcyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHVwc2VydE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIHJldHVybiB1cHNlcnRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHVwc2VydE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIGNvbnN0IFthZGRlZCwgdXBkYXRlZCwgZXhpc3RpbmdJZHNBcnJheV0gPSBzcGxpdEFkZGVkVXBkYXRlZEVudGl0aWVzKG5ld0VudGl0aWVzLCBzZWxlY3RJZCwgc3RhdGUpO1xuICAgIGlmICh1cGRhdGVkLmxlbmd0aCkge1xuICAgICAgdXBkYXRlTWFueU11dGFibHkodXBkYXRlZCwgc3RhdGUpO1xuICAgIH1cbiAgICBpZiAoYWRkZWQubGVuZ3RoKSB7XG4gICAgICBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUsIGV4aXN0aW5nSWRzQXJyYXkpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhcmVBcnJheXNFcXVhbChhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldID09PSBiW2ldKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBtZXJnZUZ1bmN0aW9uID0gKHN0YXRlLCBhZGRlZEl0ZW1zLCBhcHBsaWVkVXBkYXRlcywgcmVwbGFjZWRJZHMpID0+IHtcbiAgICBjb25zdCBjdXJyZW50RW50aXRpZXMgPSBnZXRDdXJyZW50KHN0YXRlLmVudGl0aWVzKTtcbiAgICBjb25zdCBjdXJyZW50SWRzID0gZ2V0Q3VycmVudChzdGF0ZS5pZHMpO1xuICAgIGNvbnN0IHN0YXRlRW50aXRpZXMgPSBzdGF0ZS5lbnRpdGllcztcbiAgICBsZXQgaWRzID0gY3VycmVudElkcztcbiAgICBpZiAocmVwbGFjZWRJZHMpIHtcbiAgICAgIGlkcyA9IG5ldyBTZXQoY3VycmVudElkcyk7XG4gICAgfVxuICAgIGxldCBzb3J0ZWRFbnRpdGllcyA9IFtdO1xuICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBjdXJyZW50RW50aXRpZXNbaWRdO1xuICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICBzb3J0ZWRFbnRpdGllcy5wdXNoKGVudGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHdhc1ByZXZpb3VzbHlFbXB0eSA9IHNvcnRlZEVudGl0aWVzLmxlbmd0aCA9PT0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYWRkZWRJdGVtcykge1xuICAgICAgc3RhdGVFbnRpdGllc1tzZWxlY3RJZChpdGVtKV0gPSBpdGVtO1xuICAgICAgaWYgKCF3YXNQcmV2aW91c2x5RW1wdHkpIHtcbiAgICAgICAgaW5zZXJ0KHNvcnRlZEVudGl0aWVzLCBpdGVtLCBjb21wYXJlcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3YXNQcmV2aW91c2x5RW1wdHkpIHtcbiAgICAgIHNvcnRlZEVudGl0aWVzID0gYWRkZWRJdGVtcy5zbGljZSgpLnNvcnQoY29tcGFyZXIpO1xuICAgIH0gZWxzZSBpZiAoYXBwbGllZFVwZGF0ZXMpIHtcbiAgICAgIHNvcnRlZEVudGl0aWVzLnNvcnQoY29tcGFyZXIpO1xuICAgIH1cbiAgICBjb25zdCBuZXdTb3J0ZWRJZHMgPSBzb3J0ZWRFbnRpdGllcy5tYXAoc2VsZWN0SWQpO1xuICAgIGlmICghYXJlQXJyYXlzRXF1YWwoY3VycmVudElkcywgbmV3U29ydGVkSWRzKSkge1xuICAgICAgc3RhdGUuaWRzID0gbmV3U29ydGVkSWRzO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICByZW1vdmVPbmUsXG4gICAgcmVtb3ZlTWFueSxcbiAgICByZW1vdmVBbGwsXG4gICAgYWRkT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE9uZU11dGFibHkpLFxuICAgIHVwZGF0ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVPbmVNdXRhYmx5KSxcbiAgICB1cHNlcnRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0T25lTXV0YWJseSksXG4gICAgc2V0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE9uZU11dGFibHkpLFxuICAgIHNldE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0TWFueU11dGFibHkpLFxuICAgIHNldEFsbDogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRBbGxNdXRhYmx5KSxcbiAgICBhZGRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE1hbnlNdXRhYmx5KSxcbiAgICB1cGRhdGVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU1hbnlNdXRhYmx5KSxcbiAgICB1cHNlcnRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE1hbnlNdXRhYmx5KVxuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvY3JlYXRlX2FkYXB0ZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZUVudGl0eUFkYXB0ZXIob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBzZWxlY3RJZCxcbiAgICBzb3J0Q29tcGFyZXJcbiAgfSA9IHtcbiAgICBzb3J0Q29tcGFyZXI6IGZhbHNlLFxuICAgIHNlbGVjdElkOiAoaW5zdGFuY2UpID0+IGluc3RhbmNlLmlkLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgY29uc3Qgc3RhdGVBZGFwdGVyID0gc29ydENvbXBhcmVyID8gY3JlYXRlU29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkLCBzb3J0Q29tcGFyZXIpIDogY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpO1xuICBjb25zdCBzdGF0ZUZhY3RvcnkgPSBjcmVhdGVJbml0aWFsU3RhdGVGYWN0b3J5KHN0YXRlQWRhcHRlcik7XG4gIGNvbnN0IHNlbGVjdG9yc0ZhY3RvcnkgPSBjcmVhdGVTZWxlY3RvcnNGYWN0b3J5KCk7XG4gIHJldHVybiB7XG4gICAgc2VsZWN0SWQsXG4gICAgc29ydENvbXBhcmVyLFxuICAgIC4uLnN0YXRlRmFjdG9yeSxcbiAgICAuLi5zZWxlY3RvcnNGYWN0b3J5LFxuICAgIC4uLnN0YXRlQWRhcHRlclxuICB9O1xufVxuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL2luZGV4LnRzXG5pbXBvcnQgeyBpc0FjdGlvbiBhcyBpc0FjdGlvbjMgfSBmcm9tIFwicmVkdXhcIjtcblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS9leGNlcHRpb25zLnRzXG52YXIgdGFzayA9IFwidGFza1wiO1xudmFyIGxpc3RlbmVyID0gXCJsaXN0ZW5lclwiO1xudmFyIGNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG52YXIgY2FuY2VsbGVkID0gXCJjYW5jZWxsZWRcIjtcbnZhciB0YXNrQ2FuY2VsbGVkID0gYHRhc2stJHtjYW5jZWxsZWR9YDtcbnZhciB0YXNrQ29tcGxldGVkID0gYHRhc2stJHtjb21wbGV0ZWR9YDtcbnZhciBsaXN0ZW5lckNhbmNlbGxlZCA9IGAke2xpc3RlbmVyfS0ke2NhbmNlbGxlZH1gO1xudmFyIGxpc3RlbmVyQ29tcGxldGVkID0gYCR7bGlzdGVuZXJ9LSR7Y29tcGxldGVkfWA7XG52YXIgVGFza0Fib3J0RXJyb3IgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvZGUpIHtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIHRoaXMubWVzc2FnZSA9IGAke3Rhc2t9ICR7Y2FuY2VsbGVkfSAocmVhc29uOiAke2NvZGV9KWA7XG4gIH1cbiAgbmFtZSA9IFwiVGFza0Fib3J0RXJyb3JcIjtcbiAgbWVzc2FnZTtcbn07XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvdXRpbHMudHNcbnZhciBhc3NlcnRGdW5jdGlvbiA9IChmdW5jLCBleHBlY3RlZCkgPT4ge1xuICBpZiAodHlwZW9mIGZ1bmMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMyKSA6IGAke2V4cGVjdGVkfSBpcyBub3QgYSBmdW5jdGlvbmApO1xuICB9XG59O1xudmFyIG5vb3AyID0gKCkgPT4ge1xufTtcbnZhciBjYXRjaFJlamVjdGlvbiA9IChwcm9taXNlLCBvbkVycm9yID0gbm9vcDIpID0+IHtcbiAgcHJvbWlzZS5jYXRjaChvbkVycm9yKTtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xudmFyIGFkZEFib3J0U2lnbmFsTGlzdGVuZXIgPSAoYWJvcnRTaWduYWwsIGNhbGxiYWNrKSA9PiB7XG4gIGFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBjYWxsYmFjaywge1xuICAgIG9uY2U6IHRydWVcbiAgfSk7XG4gIHJldHVybiAoKSA9PiBhYm9ydFNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgY2FsbGJhY2spO1xufTtcbnZhciBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uID0gKGFib3J0Q29udHJvbGxlciwgcmVhc29uKSA9PiB7XG4gIGNvbnN0IHNpZ25hbCA9IGFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIShcInJlYXNvblwiIGluIHNpZ25hbCkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2lnbmFsLCBcInJlYXNvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHJlYXNvbixcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgO1xuICBhYm9ydENvbnRyb2xsZXIuYWJvcnQocmVhc29uKTtcbn07XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvdGFzay50c1xudmFyIHZhbGlkYXRlQWN0aXZlID0gKHNpZ25hbCkgPT4ge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICBjb25zdCB7XG4gICAgICByZWFzb25cbiAgICB9ID0gc2lnbmFsO1xuICAgIHRocm93IG5ldyBUYXNrQWJvcnRFcnJvcihyZWFzb24pO1xuICB9XG59O1xuZnVuY3Rpb24gcmFjZVdpdGhTaWduYWwoc2lnbmFsLCBwcm9taXNlKSB7XG4gIGxldCBjbGVhbnVwID0gbm9vcDI7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgbm90aWZ5UmVqZWN0aW9uID0gKCkgPT4gcmVqZWN0KG5ldyBUYXNrQWJvcnRFcnJvcihzaWduYWwucmVhc29uKSk7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBub3RpZnlSZWplY3Rpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2xlYW51cCA9IGFkZEFib3J0U2lnbmFsTGlzdGVuZXIoc2lnbmFsLCBub3RpZnlSZWplY3Rpb24pO1xuICAgIHByb21pc2UuZmluYWxseSgoKSA9PiBjbGVhbnVwKCkpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgY2xlYW51cCA9IG5vb3AyO1xuICB9KTtcbn1cbnZhciBydW5UYXNrID0gYXN5bmMgKHRhc2syLCBjbGVhblVwKSA9PiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0YXNrMigpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIHZhbHVlXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBlcnJvciBpbnN0YW5jZW9mIFRhc2tBYm9ydEVycm9yID8gXCJjYW5jZWxsZWRcIiA6IFwicmVqZWN0ZWRcIixcbiAgICAgIGVycm9yXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhblVwPy4oKTtcbiAgfVxufTtcbnZhciBjcmVhdGVQYXVzZSA9IChzaWduYWwpID0+IHtcbiAgcmV0dXJuIChwcm9taXNlKSA9PiB7XG4gICAgcmV0dXJuIGNhdGNoUmVqZWN0aW9uKHJhY2VXaXRoU2lnbmFsKHNpZ25hbCwgcHJvbWlzZSkudGhlbigob3V0cHV0KSA9PiB7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShzaWduYWwpO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KSk7XG4gIH07XG59O1xudmFyIGNyZWF0ZURlbGF5ID0gKHNpZ25hbCkgPT4ge1xuICBjb25zdCBwYXVzZSA9IGNyZWF0ZVBhdXNlKHNpZ25hbCk7XG4gIHJldHVybiAodGltZW91dE1zKSA9PiB7XG4gICAgcmV0dXJuIHBhdXNlKG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcykpKTtcbiAgfTtcbn07XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvaW5kZXgudHNcbnZhciB7XG4gIGFzc2lnblxufSA9IE9iamVjdDtcbnZhciBJTlRFUk5BTF9OSUxfVE9LRU4gPSB7fTtcbnZhciBhbG0gPSBcImxpc3RlbmVyTWlkZGxld2FyZVwiO1xudmFyIGNyZWF0ZUZvcmsgPSAocGFyZW50QWJvcnRTaWduYWwsIHBhcmVudEJsb2NraW5nUHJvbWlzZXMpID0+IHtcbiAgY29uc3QgbGlua0NvbnRyb2xsZXJzID0gKGNvbnRyb2xsZXIpID0+IGFkZEFib3J0U2lnbmFsTGlzdGVuZXIocGFyZW50QWJvcnRTaWduYWwsICgpID0+IGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY29udHJvbGxlciwgcGFyZW50QWJvcnRTaWduYWwucmVhc29uKSk7XG4gIHJldHVybiAodGFza0V4ZWN1dG9yLCBvcHRzKSA9PiB7XG4gICAgYXNzZXJ0RnVuY3Rpb24odGFza0V4ZWN1dG9yLCBcInRhc2tFeGVjdXRvclwiKTtcbiAgICBjb25zdCBjaGlsZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBsaW5rQ29udHJvbGxlcnMoY2hpbGRBYm9ydENvbnRyb2xsZXIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJ1blRhc2soYXN5bmMgKCkgPT4ge1xuICAgICAgdmFsaWRhdGVBY3RpdmUocGFyZW50QWJvcnRTaWduYWwpO1xuICAgICAgdmFsaWRhdGVBY3RpdmUoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIGNvbnN0IHJlc3VsdDIgPSBhd2FpdCB0YXNrRXhlY3V0b3Ioe1xuICAgICAgICBwYXVzZTogY3JlYXRlUGF1c2UoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgZGVsYXk6IGNyZWF0ZURlbGF5KGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgIHNpZ25hbDogY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICByZXR1cm4gcmVzdWx0MjtcbiAgICB9LCAoKSA9PiBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNoaWxkQWJvcnRDb250cm9sbGVyLCB0YXNrQ29tcGxldGVkKSk7XG4gICAgaWYgKG9wdHM/LmF1dG9Kb2luKSB7XG4gICAgICBwYXJlbnRCbG9ja2luZ1Byb21pc2VzLnB1c2gocmVzdWx0LmNhdGNoKG5vb3AyKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZXN1bHQ6IGNyZWF0ZVBhdXNlKHBhcmVudEFib3J0U2lnbmFsKShyZXN1bHQpLFxuICAgICAgY2FuY2VsKCkge1xuICAgICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNoaWxkQWJvcnRDb250cm9sbGVyLCB0YXNrQ2FuY2VsbGVkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xufTtcbnZhciBjcmVhdGVUYWtlUGF0dGVybiA9IChzdGFydExpc3RlbmluZywgc2lnbmFsKSA9PiB7XG4gIGNvbnN0IHRha2UgPSBhc3luYyAocHJlZGljYXRlLCB0aW1lb3V0KSA9PiB7XG4gICAgdmFsaWRhdGVBY3RpdmUoc2lnbmFsKTtcbiAgICBsZXQgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgfTtcbiAgICBjb25zdCB0dXBsZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc3RvcExpc3RlbmluZyA9IHN0YXJ0TGlzdGVuaW5nKHtcbiAgICAgICAgcHJlZGljYXRlLFxuICAgICAgICBlZmZlY3Q6IChhY3Rpb24sIGxpc3RlbmVyQXBpKSA9PiB7XG4gICAgICAgICAgbGlzdGVuZXJBcGkudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICByZXNvbHZlKFthY3Rpb24sIGxpc3RlbmVyQXBpLmdldFN0YXRlKCksIGxpc3RlbmVyQXBpLmdldE9yaWdpbmFsU3RhdGUoKV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICBzdG9wTGlzdGVuaW5nKCk7XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFt0dXBsZVByb21pc2VdO1xuICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dCwgbnVsbCkpKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHJhY2VXaXRoU2lnbmFsKHNpZ25hbCwgUHJvbWlzZS5yYWNlKHByb21pc2VzKSk7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShzaWduYWwpO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAocHJlZGljYXRlLCB0aW1lb3V0KSA9PiBjYXRjaFJlamVjdGlvbih0YWtlKHByZWRpY2F0ZSwgdGltZW91dCkpO1xufTtcbnZhciBnZXRMaXN0ZW5lckVudHJ5UHJvcHNGcm9tID0gKG9wdGlvbnMpID0+IHtcbiAgbGV0IHtcbiAgICB0eXBlLFxuICAgIGFjdGlvbkNyZWF0b3IsXG4gICAgbWF0Y2hlcixcbiAgICBwcmVkaWNhdGUsXG4gICAgZWZmZWN0XG4gIH0gPSBvcHRpb25zO1xuICBpZiAodHlwZSkge1xuICAgIHByZWRpY2F0ZSA9IGNyZWF0ZUFjdGlvbih0eXBlKS5tYXRjaDtcbiAgfSBlbHNlIGlmIChhY3Rpb25DcmVhdG9yKSB7XG4gICAgdHlwZSA9IGFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICBwcmVkaWNhdGUgPSBhY3Rpb25DcmVhdG9yLm1hdGNoO1xuICB9IGVsc2UgaWYgKG1hdGNoZXIpIHtcbiAgICBwcmVkaWNhdGUgPSBtYXRjaGVyO1xuICB9IGVsc2UgaWYgKHByZWRpY2F0ZSkge1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIxKSA6IFwiQ3JlYXRpbmcgb3IgcmVtb3ZpbmcgYSBsaXN0ZW5lciByZXF1aXJlcyBvbmUgb2YgdGhlIGtub3duIGZpZWxkcyBmb3IgbWF0Y2hpbmcgYW4gYWN0aW9uXCIpO1xuICB9XG4gIGFzc2VydEZ1bmN0aW9uKGVmZmVjdCwgXCJvcHRpb25zLmxpc3RlbmVyXCIpO1xuICByZXR1cm4ge1xuICAgIHByZWRpY2F0ZSxcbiAgICB0eXBlLFxuICAgIGVmZmVjdFxuICB9O1xufTtcbnZhciBjcmVhdGVMaXN0ZW5lckVudHJ5ID0gLyogQF9fUFVSRV9fICovIGFzc2lnbigob3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICBwcmVkaWNhdGUsXG4gICAgZWZmZWN0XG4gIH0gPSBnZXRMaXN0ZW5lckVudHJ5UHJvcHNGcm9tKG9wdGlvbnMpO1xuICBjb25zdCBpZCA9IG5hbm9pZCgpO1xuICBjb25zdCBlbnRyeSA9IHtcbiAgICBpZCxcbiAgICBlZmZlY3QsXG4gICAgdHlwZSxcbiAgICBwcmVkaWNhdGUsXG4gICAgcGVuZGluZzogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjIpIDogXCJVbnN1YnNjcmliZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICB9O1xuICByZXR1cm4gZW50cnk7XG59LCB7XG4gIHdpdGhUeXBlczogKCkgPT4gY3JlYXRlTGlzdGVuZXJFbnRyeVxufSk7XG52YXIgY2FuY2VsQWN0aXZlTGlzdGVuZXJzID0gKGVudHJ5KSA9PiB7XG4gIGVudHJ5LnBlbmRpbmcuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY29udHJvbGxlciwgbGlzdGVuZXJDYW5jZWxsZWQpO1xuICB9KTtcbn07XG52YXIgY3JlYXRlQ2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUgPSAobGlzdGVuZXJNYXApID0+IHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBsaXN0ZW5lck1hcC5mb3JFYWNoKGNhbmNlbEFjdGl2ZUxpc3RlbmVycyk7XG4gICAgbGlzdGVuZXJNYXAuY2xlYXIoKTtcbiAgfTtcbn07XG52YXIgc2FmZWx5Tm90aWZ5RXJyb3IgPSAoZXJyb3JIYW5kbGVyLCBlcnJvclRvTm90aWZ5LCBlcnJvckluZm8pID0+IHtcbiAgdHJ5IHtcbiAgICBlcnJvckhhbmRsZXIoZXJyb3JUb05vdGlmeSwgZXJyb3JJbmZvKTtcbiAgfSBjYXRjaCAoZXJyb3JIYW5kbGVyRXJyb3IpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRocm93IGVycm9ySGFuZGxlckVycm9yO1xuICAgIH0sIDApO1xuICB9XG59O1xudmFyIGFkZExpc3RlbmVyID0gLyogQF9fUFVSRV9fICovIGFzc2lnbigvKiBAX19QVVJFX18gKi8gY3JlYXRlQWN0aW9uKGAke2FsbX0vYWRkYCksIHtcbiAgd2l0aFR5cGVzOiAoKSA9PiBhZGRMaXN0ZW5lclxufSk7XG52YXIgY2xlYXJBbGxMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlQWN0aW9uKGAke2FsbX0vcmVtb3ZlQWxsYCk7XG52YXIgcmVtb3ZlTGlzdGVuZXIgPSAvKiBAX19QVVJFX18gKi8gYXNzaWduKC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBY3Rpb24oYCR7YWxtfS9yZW1vdmVgKSwge1xuICB3aXRoVHlwZXM6ICgpID0+IHJlbW92ZUxpc3RlbmVyXG59KTtcbnZhciBkZWZhdWx0RXJyb3JIYW5kbGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc29sZS5lcnJvcihgJHthbG19L2Vycm9yYCwgLi4uYXJncyk7XG59O1xudmFyIGNyZWF0ZUxpc3RlbmVyTWlkZGxld2FyZSA9IChtaWRkbGV3YXJlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IGxpc3RlbmVyTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3Qge1xuICAgIGV4dHJhLFxuICAgIG9uRXJyb3IgPSBkZWZhdWx0RXJyb3JIYW5kbGVyXG4gIH0gPSBtaWRkbGV3YXJlT3B0aW9ucztcbiAgYXNzZXJ0RnVuY3Rpb24ob25FcnJvciwgXCJvbkVycm9yXCIpO1xuICBjb25zdCBpbnNlcnRFbnRyeSA9IChlbnRyeSkgPT4ge1xuICAgIGVudHJ5LnVuc3Vic2NyaWJlID0gKCkgPT4gbGlzdGVuZXJNYXAuZGVsZXRlKGVudHJ5LmlkKTtcbiAgICBsaXN0ZW5lck1hcC5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICByZXR1cm4gKGNhbmNlbE9wdGlvbnMpID0+IHtcbiAgICAgIGVudHJ5LnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAoY2FuY2VsT3B0aW9ucz8uY2FuY2VsQWN0aXZlKSB7XG4gICAgICAgIGNhbmNlbEFjdGl2ZUxpc3RlbmVycyhlbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgY29uc3Qgc3RhcnRMaXN0ZW5pbmcgPSAob3B0aW9ucykgPT4ge1xuICAgIGxldCBlbnRyeSA9IGZpbmQoQXJyYXkuZnJvbShsaXN0ZW5lck1hcC52YWx1ZXMoKSksIChleGlzdGluZ0VudHJ5KSA9PiBleGlzdGluZ0VudHJ5LmVmZmVjdCA9PT0gb3B0aW9ucy5lZmZlY3QpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIGVudHJ5ID0gY3JlYXRlTGlzdGVuZXJFbnRyeShvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc2VydEVudHJ5KGVudHJ5KTtcbiAgfTtcbiAgYXNzaWduKHN0YXJ0TGlzdGVuaW5nLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBzdGFydExpc3RlbmluZ1xuICB9KTtcbiAgY29uc3Qgc3RvcExpc3RlbmluZyA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZSxcbiAgICAgIGVmZmVjdCxcbiAgICAgIHByZWRpY2F0ZVxuICAgIH0gPSBnZXRMaXN0ZW5lckVudHJ5UHJvcHNGcm9tKG9wdGlvbnMpO1xuICAgIGNvbnN0IGVudHJ5ID0gZmluZChBcnJheS5mcm9tKGxpc3RlbmVyTWFwLnZhbHVlcygpKSwgKGVudHJ5MikgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hQcmVkaWNhdGVPclR5cGUgPSB0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIiA/IGVudHJ5Mi50eXBlID09PSB0eXBlIDogZW50cnkyLnByZWRpY2F0ZSA9PT0gcHJlZGljYXRlO1xuICAgICAgcmV0dXJuIG1hdGNoUHJlZGljYXRlT3JUeXBlICYmIGVudHJ5Mi5lZmZlY3QgPT09IGVmZmVjdDtcbiAgICB9KTtcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGVudHJ5LnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAob3B0aW9ucy5jYW5jZWxBY3RpdmUpIHtcbiAgICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICEhZW50cnk7XG4gIH07XG4gIGFzc2lnbihzdG9wTGlzdGVuaW5nLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBzdG9wTGlzdGVuaW5nXG4gIH0pO1xuICBjb25zdCBub3RpZnlMaXN0ZW5lciA9IGFzeW5jIChlbnRyeSwgYWN0aW9uLCBhcGksIGdldE9yaWdpbmFsU3RhdGUpID0+IHtcbiAgICBjb25zdCBpbnRlcm5hbFRhc2tDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHRha2UgPSBjcmVhdGVUYWtlUGF0dGVybihzdGFydExpc3RlbmluZywgaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpO1xuICAgIGNvbnN0IGF1dG9Kb2luUHJvbWlzZXMgPSBbXTtcbiAgICB0cnkge1xuICAgICAgZW50cnkucGVuZGluZy5hZGQoaW50ZXJuYWxUYXNrQ29udHJvbGxlcik7XG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoZW50cnkuZWZmZWN0KFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIC8vIFVzZSBhc3NpZ24oKSByYXRoZXIgdGhhbiAuLi4gdG8gYXZvaWQgZXh0cmEgaGVscGVyIGZ1bmN0aW9ucyBhZGRlZCB0byBidW5kbGVcbiAgICAgICAgYXNzaWduKHt9LCBhcGksIHtcbiAgICAgICAgICBnZXRPcmlnaW5hbFN0YXRlLFxuICAgICAgICAgIGNvbmRpdGlvbjogKHByZWRpY2F0ZSwgdGltZW91dCkgPT4gdGFrZShwcmVkaWNhdGUsIHRpbWVvdXQpLnRoZW4oQm9vbGVhbiksXG4gICAgICAgICAgdGFrZSxcbiAgICAgICAgICBkZWxheTogY3JlYXRlRGVsYXkoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpLFxuICAgICAgICAgIHBhdXNlOiBjcmVhdGVQYXVzZShpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgICAgZXh0cmEsXG4gICAgICAgICAgc2lnbmFsOiBpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICBmb3JrOiBjcmVhdGVGb3JrKGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsLCBhdXRvSm9pblByb21pc2VzKSxcbiAgICAgICAgICB1bnN1YnNjcmliZTogZW50cnkudW5zdWJzY3JpYmUsXG4gICAgICAgICAgc3Vic2NyaWJlOiAoKSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lck1hcC5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNhbmNlbEFjdGl2ZUxpc3RlbmVyczogKCkgPT4ge1xuICAgICAgICAgICAgZW50cnkucGVuZGluZy5mb3JFYWNoKChjb250cm9sbGVyLCBfLCBzZXQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT09IGludGVybmFsVGFza0NvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNvbnRyb2xsZXIsIGxpc3RlbmVyQ2FuY2VsbGVkKTtcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNhbmNlbDogKCkgPT4ge1xuICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihpbnRlcm5hbFRhc2tDb250cm9sbGVyLCBsaXN0ZW5lckNhbmNlbGxlZCk7XG4gICAgICAgICAgICBlbnRyeS5wZW5kaW5nLmRlbGV0ZShpbnRlcm5hbFRhc2tDb250cm9sbGVyKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRocm93SWZDYW5jZWxsZWQ6ICgpID0+IHtcbiAgICAgICAgICAgIHZhbGlkYXRlQWN0aXZlKGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9IGNhdGNoIChsaXN0ZW5lckVycm9yKSB7XG4gICAgICBpZiAoIShsaXN0ZW5lckVycm9yIGluc3RhbmNlb2YgVGFza0Fib3J0RXJyb3IpKSB7XG4gICAgICAgIHNhZmVseU5vdGlmeUVycm9yKG9uRXJyb3IsIGxpc3RlbmVyRXJyb3IsIHtcbiAgICAgICAgICByYWlzZWRCeTogXCJlZmZlY3RcIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYXV0b0pvaW5Qcm9taXNlcyk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGludGVybmFsVGFza0NvbnRyb2xsZXIsIGxpc3RlbmVyQ29tcGxldGVkKTtcbiAgICAgIGVudHJ5LnBlbmRpbmcuZGVsZXRlKGludGVybmFsVGFza0NvbnRyb2xsZXIpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgY2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUgPSBjcmVhdGVDbGVhckxpc3RlbmVyTWlkZGxld2FyZShsaXN0ZW5lck1hcCk7XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAoYXBpKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmICghaXNBY3Rpb24zKGFjdGlvbikpIHtcbiAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgfVxuICAgIGlmIChhZGRMaXN0ZW5lci5tYXRjaChhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gc3RhcnRMaXN0ZW5pbmcoYWN0aW9uLnBheWxvYWQpO1xuICAgIH1cbiAgICBpZiAoY2xlYXJBbGxMaXN0ZW5lcnMubWF0Y2goYWN0aW9uKSkge1xuICAgICAgY2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlbW92ZUxpc3RlbmVyLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIHJldHVybiBzdG9wTGlzdGVuaW5nKGFjdGlvbi5wYXlsb2FkKTtcbiAgICB9XG4gICAgbGV0IG9yaWdpbmFsU3RhdGUgPSBhcGkuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBnZXRPcmlnaW5hbFN0YXRlID0gKCkgPT4ge1xuICAgICAgaWYgKG9yaWdpbmFsU3RhdGUgPT09IElOVEVSTkFMX05JTF9UT0tFTikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyMykgOiBgJHthbG19OiBnZXRPcmlnaW5hbFN0YXRlIGNhbiBvbmx5IGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luYWxTdGF0ZTtcbiAgICB9O1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IG5leHQoYWN0aW9uKTtcbiAgICAgIGlmIChsaXN0ZW5lck1hcC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBhcGkuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJFbnRyaWVzID0gQXJyYXkuZnJvbShsaXN0ZW5lck1hcC52YWx1ZXMoKSk7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgbGlzdGVuZXJFbnRyaWVzKSB7XG4gICAgICAgICAgbGV0IHJ1bkxpc3RlbmVyID0gZmFsc2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJ1bkxpc3RlbmVyID0gZW50cnkucHJlZGljYXRlKGFjdGlvbiwgY3VycmVudFN0YXRlLCBvcmlnaW5hbFN0YXRlKTtcbiAgICAgICAgICB9IGNhdGNoIChwcmVkaWNhdGVFcnJvcikge1xuICAgICAgICAgICAgcnVuTGlzdGVuZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIHNhZmVseU5vdGlmeUVycm9yKG9uRXJyb3IsIHByZWRpY2F0ZUVycm9yLCB7XG4gICAgICAgICAgICAgIHJhaXNlZEJ5OiBcInByZWRpY2F0ZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFydW5MaXN0ZW5lcikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKGVudHJ5LCBhY3Rpb24sIGFwaSwgZ2V0T3JpZ2luYWxTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgb3JpZ2luYWxTdGF0ZSA9IElOVEVSTkFMX05JTF9UT0tFTjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtaWRkbGV3YXJlLFxuICAgIHN0YXJ0TGlzdGVuaW5nLFxuICAgIHN0b3BMaXN0ZW5pbmcsXG4gICAgY2xlYXJMaXN0ZW5lcnM6IGNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlXG4gIH07XG59O1xuXG4vLyBzcmMvZHluYW1pY01pZGRsZXdhcmUvaW5kZXgudHNcbmltcG9ydCB7IGNvbXBvc2UgYXMgY29tcG9zZTMgfSBmcm9tIFwicmVkdXhcIjtcbnZhciBjcmVhdGVNaWRkbGV3YXJlRW50cnkgPSAobWlkZGxld2FyZSkgPT4gKHtcbiAgaWQ6IG5hbm9pZCgpLFxuICBtaWRkbGV3YXJlLFxuICBhcHBsaWVkOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpXG59KTtcbnZhciBtYXRjaEluc3RhbmNlID0gKGluc3RhbmNlSWQpID0+IChhY3Rpb24pID0+IGFjdGlvbj8ubWV0YT8uaW5zdGFuY2VJZCA9PT0gaW5zdGFuY2VJZDtcbnZhciBjcmVhdGVEeW5hbWljTWlkZGxld2FyZSA9ICgpID0+IHtcbiAgY29uc3QgaW5zdGFuY2VJZCA9IG5hbm9pZCgpO1xuICBjb25zdCBtaWRkbGV3YXJlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3Qgd2l0aE1pZGRsZXdhcmUgPSBPYmplY3QuYXNzaWduKGNyZWF0ZUFjdGlvbihcImR5bmFtaWNNaWRkbGV3YXJlL2FkZFwiLCAoLi4ubWlkZGxld2FyZXMpID0+ICh7XG4gICAgcGF5bG9hZDogbWlkZGxld2FyZXMsXG4gICAgbWV0YToge1xuICAgICAgaW5zdGFuY2VJZFxuICAgIH1cbiAgfSkpLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiB3aXRoTWlkZGxld2FyZVxuICB9KTtcbiAgY29uc3QgYWRkTWlkZGxld2FyZSA9IE9iamVjdC5hc3NpZ24oZnVuY3Rpb24gYWRkTWlkZGxld2FyZTIoLi4ubWlkZGxld2FyZXMpIHtcbiAgICBtaWRkbGV3YXJlcy5mb3JFYWNoKChtaWRkbGV3YXJlMikgPT4ge1xuICAgICAgbGV0IGVudHJ5ID0gZmluZChBcnJheS5mcm9tKG1pZGRsZXdhcmVNYXAudmFsdWVzKCkpLCAoZW50cnkyKSA9PiBlbnRyeTIubWlkZGxld2FyZSA9PT0gbWlkZGxld2FyZTIpO1xuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICBlbnRyeSA9IGNyZWF0ZU1pZGRsZXdhcmVFbnRyeShtaWRkbGV3YXJlMik7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlTWFwLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgIH0pO1xuICB9LCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBhZGRNaWRkbGV3YXJlXG4gIH0pO1xuICBjb25zdCBnZXRGaW5hbE1pZGRsZXdhcmUgPSAoYXBpKSA9PiB7XG4gICAgY29uc3QgYXBwbGllZE1pZGRsZXdhcmUgPSBBcnJheS5mcm9tKG1pZGRsZXdhcmVNYXAudmFsdWVzKCkpLm1hcCgoZW50cnkpID0+IGVtcGxhY2UoZW50cnkuYXBwbGllZCwgYXBpLCB7XG4gICAgICBpbnNlcnQ6ICgpID0+IGVudHJ5Lm1pZGRsZXdhcmUoYXBpKVxuICAgIH0pKTtcbiAgICByZXR1cm4gY29tcG9zZTMoLi4uYXBwbGllZE1pZGRsZXdhcmUpO1xuICB9O1xuICBjb25zdCBpc1dpdGhNaWRkbGV3YXJlID0gaXNBbGxPZih3aXRoTWlkZGxld2FyZSwgbWF0Y2hJbnN0YW5jZShpbnN0YW5jZUlkKSk7XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAoYXBpKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmIChpc1dpdGhNaWRkbGV3YXJlKGFjdGlvbikpIHtcbiAgICAgIGFkZE1pZGRsZXdhcmUoLi4uYWN0aW9uLnBheWxvYWQpO1xuICAgICAgcmV0dXJuIGFwaS5kaXNwYXRjaDtcbiAgICB9XG4gICAgcmV0dXJuIGdldEZpbmFsTWlkZGxld2FyZShhcGkpKG5leHQpKGFjdGlvbik7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWlkZGxld2FyZSxcbiAgICBhZGRNaWRkbGV3YXJlLFxuICAgIHdpdGhNaWRkbGV3YXJlLFxuICAgIGluc3RhbmNlSWRcbiAgfTtcbn07XG5cbi8vIHNyYy9jb21iaW5lU2xpY2VzLnRzXG5pbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMgYXMgY29tYmluZVJlZHVjZXJzMiB9IGZyb20gXCJyZWR1eFwiO1xudmFyIGlzU2xpY2VMaWtlID0gKG1heWJlU2xpY2VMaWtlKSA9PiBcInJlZHVjZXJQYXRoXCIgaW4gbWF5YmVTbGljZUxpa2UgJiYgdHlwZW9mIG1heWJlU2xpY2VMaWtlLnJlZHVjZXJQYXRoID09PSBcInN0cmluZ1wiO1xudmFyIGdldFJlZHVjZXJzID0gKHNsaWNlcykgPT4gc2xpY2VzLmZsYXRNYXAoKHNsaWNlT3JNYXApID0+IGlzU2xpY2VMaWtlKHNsaWNlT3JNYXApID8gW1tzbGljZU9yTWFwLnJlZHVjZXJQYXRoLCBzbGljZU9yTWFwLnJlZHVjZXJdXSA6IE9iamVjdC5lbnRyaWVzKHNsaWNlT3JNYXApKTtcbnZhciBPUklHSU5BTF9TVEFURSA9IFN5bWJvbC5mb3IoXCJydGstc3RhdGUtcHJveHktb3JpZ2luYWxcIik7XG52YXIgaXNTdGF0ZVByb3h5ID0gKHZhbHVlKSA9PiAhIXZhbHVlICYmICEhdmFsdWVbT1JJR0lOQUxfU1RBVEVdO1xudmFyIHN0YXRlUHJveHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBjcmVhdGVTdGF0ZVByb3h5ID0gKHN0YXRlLCByZWR1Y2VyTWFwKSA9PiBlbXBsYWNlKHN0YXRlUHJveHlNYXAsIHN0YXRlLCB7XG4gIGluc2VydDogKCkgPT4gbmV3IFByb3h5KHN0YXRlLCB7XG4gICAgZ2V0OiAodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgPT4ge1xuICAgICAgaWYgKHByb3AgPT09IE9SSUdJTkFMX1NUQVRFKSByZXR1cm4gdGFyZ2V0O1xuICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gcmVkdWNlck1hcFtwcm9wLnRvU3RyaW5nKCldO1xuICAgICAgICBpZiAocmVkdWNlcikge1xuICAgICAgICAgIGNvbnN0IHJlZHVjZXJSZXN1bHQgPSByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgICAgICAgdHlwZTogbmFub2lkKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlZHVjZXJSZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI0KSA6IGBUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtwcm9wLnRvU3RyaW5nKCl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gY2FsbGVkIGZvciBzZWxlY3RvcigpLiBJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCB5b3UgY2FuIHVzZSBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVkdWNlclJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0pXG59KTtcbnZhciBvcmlnaW5hbCA9IChzdGF0ZSkgPT4ge1xuICBpZiAoIWlzU3RhdGVQcm94eShzdGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyNSkgOiBcIm9yaWdpbmFsIG11c3QgYmUgdXNlZCBvbiBzdGF0ZSBQcm94eVwiKTtcbiAgfVxuICByZXR1cm4gc3RhdGVbT1JJR0lOQUxfU1RBVEVdO1xufTtcbnZhciBub29wUmVkdWNlciA9IChzdGF0ZSA9IHt9KSA9PiBzdGF0ZTtcbmZ1bmN0aW9uIGNvbWJpbmVTbGljZXMoLi4uc2xpY2VzKSB7XG4gIGNvbnN0IHJlZHVjZXJNYXAgPSBPYmplY3QuZnJvbUVudHJpZXMoZ2V0UmVkdWNlcnMoc2xpY2VzKSk7XG4gIGNvbnN0IGdldFJlZHVjZXIgPSAoKSA9PiBPYmplY3Qua2V5cyhyZWR1Y2VyTWFwKS5sZW5ndGggPyBjb21iaW5lUmVkdWNlcnMyKHJlZHVjZXJNYXApIDogbm9vcFJlZHVjZXI7XG4gIGxldCByZWR1Y2VyID0gZ2V0UmVkdWNlcigpO1xuICBmdW5jdGlvbiBjb21iaW5lZFJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAgIHJldHVybiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICB9XG4gIGNvbWJpbmVkUmVkdWNlci53aXRoTGF6eUxvYWRlZFNsaWNlcyA9ICgpID0+IGNvbWJpbmVkUmVkdWNlcjtcbiAgY29uc3QgaW5qZWN0ID0gKHNsaWNlLCBjb25maWcgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlZHVjZXJQYXRoLFxuICAgICAgcmVkdWNlcjogcmVkdWNlclRvSW5qZWN0XG4gICAgfSA9IHNsaWNlO1xuICAgIGNvbnN0IGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlck1hcFtyZWR1Y2VyUGF0aF07XG4gICAgaWYgKCFjb25maWcub3ZlcnJpZGVFeGlzdGluZyAmJiBjdXJyZW50UmVkdWNlciAmJiBjdXJyZW50UmVkdWNlciAhPT0gcmVkdWNlclRvSW5qZWN0KSB7XG4gICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBjYWxsZWQgXFxgaW5qZWN0XFxgIHRvIG92ZXJyaWRlIGFscmVhZHktZXhpc3RpbmcgcmVkdWNlciAke3JlZHVjZXJQYXRofSB3aXRob3V0IHNwZWNpZnlpbmcgXFxgb3ZlcnJpZGVFeGlzdGluZzogdHJ1ZVxcYGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWJpbmVkUmVkdWNlcjtcbiAgICB9XG4gICAgcmVkdWNlck1hcFtyZWR1Y2VyUGF0aF0gPSByZWR1Y2VyVG9JbmplY3Q7XG4gICAgcmVkdWNlciA9IGdldFJlZHVjZXIoKTtcbiAgICByZXR1cm4gY29tYmluZWRSZWR1Y2VyO1xuICB9O1xuICBjb25zdCBzZWxlY3RvciA9IE9iamVjdC5hc3NpZ24oZnVuY3Rpb24gbWFrZVNlbGVjdG9yKHNlbGVjdG9yRm4sIHNlbGVjdFN0YXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHNlbGVjdG9yMihzdGF0ZSwgLi4uYXJncykge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yRm4oY3JlYXRlU3RhdGVQcm94eShzZWxlY3RTdGF0ZSA/IHNlbGVjdFN0YXRlKHN0YXRlLCAuLi5hcmdzKSA6IHN0YXRlLCByZWR1Y2VyTWFwKSwgLi4uYXJncyk7XG4gICAgfTtcbiAgfSwge1xuICAgIG9yaWdpbmFsXG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihjb21iaW5lZFJlZHVjZXIsIHtcbiAgICBpbmplY3QsXG4gICAgc2VsZWN0b3JcbiAgfSk7XG59XG5cbi8vIHNyYy9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlLnRzXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIGBNaW5pZmllZCBSZWR1eCBUb29sa2l0IGVycm9yICMke2NvZGV9OyB2aXNpdCBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL0Vycm9ycz9jb2RlPSR7Y29kZX0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycy4gYDtcbn1cbmV4cG9ydCB7XG4gIFJlZHVjZXJUeXBlLFxuICBTSE9VTERfQVVUT0JBVENILFxuICBUYXNrQWJvcnRFcnJvcixcbiAgVHVwbGUsXG4gIGFkZExpc3RlbmVyLFxuICBhc3luY1RodW5rQ3JlYXRvcixcbiAgYXV0b0JhdGNoRW5oYW5jZXIsXG4gIGJ1aWxkQ3JlYXRlU2xpY2UsXG4gIGNsZWFyQWxsTGlzdGVuZXJzLFxuICBjb21iaW5lU2xpY2VzLFxuICBjb25maWd1cmVTdG9yZSxcbiAgY3JlYXRlQWN0aW9uLFxuICBjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZSxcbiAgY3JlYXRlQXN5bmNUaHVuayxcbiAgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IsXG4gIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yQ3JlYXRvcixcbiAgY3JlYXRlRHluYW1pY01pZGRsZXdhcmUsXG4gIGNyZWF0ZUVudGl0eUFkYXB0ZXIsXG4gIGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSxcbiAgY3JlYXRlTGlzdGVuZXJNaWRkbGV3YXJlLFxuICBwcm9kdWNlIGFzIGNyZWF0ZU5leHRTdGF0ZSxcbiAgY3JlYXRlUmVkdWNlcixcbiAgY3JlYXRlU2VsZWN0b3IsXG4gIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcjIgYXMgY3JlYXRlU2VsZWN0b3JDcmVhdG9yLFxuICBjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUsXG4gIGNyZWF0ZVNsaWNlLFxuICBjdXJyZW50MyBhcyBjdXJyZW50LFxuICBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUsXG4gIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UsXG4gIGZyZWV6ZSxcbiAgaXNBY3Rpb25DcmVhdG9yLFxuICBpc0FsbE9mLFxuICBpc0FueU9mLFxuICBpc0FzeW5jVGh1bmtBY3Rpb24sXG4gIGlzRHJhZnQ1IGFzIGlzRHJhZnQsXG4gIGlzRlNBIGFzIGlzRmx1eFN0YW5kYXJkQWN0aW9uLFxuICBpc0Z1bGZpbGxlZCxcbiAgaXNJbW11dGFibGVEZWZhdWx0LFxuICBpc1BlbmRpbmcsXG4gIGlzUGxhaW4sXG4gIGlzUmVqZWN0ZWQsXG4gIGlzUmVqZWN0ZWRXaXRoVmFsdWUsXG4gIGxydU1lbW9pemUsXG4gIG1pbmlTZXJpYWxpemVFcnJvcixcbiAgbmFub2lkLFxuICBvcmlnaW5hbDIgYXMgb3JpZ2luYWwsXG4gIHByZXBhcmVBdXRvQmF0Y2hlZCxcbiAgcmVtb3ZlTGlzdGVuZXIsXG4gIHVud3JhcFJlc3VsdCxcbiAgd2Vha01hcE1lbW9pemUyIGFzIHdlYWtNYXBNZW1vaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVkdXgtdG9vbGtpdC5tb2Rlcm4ubWpzLm1hcCIsImltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgaHR0cEFkYXB0ZXIgZnJvbSAnLi9odHRwLmpzJztcbmltcG9ydCB4aHJBZGFwdGVyIGZyb20gJy4veGhyLmpzJztcbmltcG9ydCBmZXRjaEFkYXB0ZXIgZnJvbSAnLi9mZXRjaC5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5cbmNvbnN0IGtub3duQWRhcHRlcnMgPSB7XG4gIGh0dHA6IGh0dHBBZGFwdGVyLFxuICB4aHI6IHhockFkYXB0ZXIsXG4gIGZldGNoOiBmZXRjaEFkYXB0ZXJcbn1cblxudXRpbHMuZm9yRWFjaChrbm93bkFkYXB0ZXJzLCAoZm4sIHZhbHVlKSA9PiB7XG4gIGlmIChmbikge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge3ZhbHVlfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2FkYXB0ZXJOYW1lJywge3ZhbHVlfSk7XG4gIH1cbn0pO1xuXG5jb25zdCByZW5kZXJSZWFzb24gPSAocmVhc29uKSA9PiBgLSAke3JlYXNvbn1gO1xuXG5jb25zdCBpc1Jlc29sdmVkSGFuZGxlID0gKGFkYXB0ZXIpID0+IHV0aWxzLmlzRnVuY3Rpb24oYWRhcHRlcikgfHwgYWRhcHRlciA9PT0gbnVsbCB8fCBhZGFwdGVyID09PSBmYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBnZXRBZGFwdGVyOiAoYWRhcHRlcnMpID0+IHtcbiAgICBhZGFwdGVycyA9IHV0aWxzLmlzQXJyYXkoYWRhcHRlcnMpID8gYWRhcHRlcnMgOiBbYWRhcHRlcnNdO1xuXG4gICAgY29uc3Qge2xlbmd0aH0gPSBhZGFwdGVycztcbiAgICBsZXQgbmFtZU9yQWRhcHRlcjtcbiAgICBsZXQgYWRhcHRlcjtcblxuICAgIGNvbnN0IHJlamVjdGVkUmVhc29ucyA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbmFtZU9yQWRhcHRlciA9IGFkYXB0ZXJzW2ldO1xuICAgICAgbGV0IGlkO1xuXG4gICAgICBhZGFwdGVyID0gbmFtZU9yQWRhcHRlcjtcblxuICAgICAgaWYgKCFpc1Jlc29sdmVkSGFuZGxlKG5hbWVPckFkYXB0ZXIpKSB7XG4gICAgICAgIGFkYXB0ZXIgPSBrbm93bkFkYXB0ZXJzWyhpZCA9IFN0cmluZyhuYW1lT3JBZGFwdGVyKSkudG9Mb3dlckNhc2UoKV07XG5cbiAgICAgICAgaWYgKGFkYXB0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKGBVbmtub3duIGFkYXB0ZXIgJyR7aWR9J2ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZWplY3RlZFJlYXNvbnNbaWQgfHwgJyMnICsgaV0gPSBhZGFwdGVyO1xuICAgIH1cblxuICAgIGlmICghYWRhcHRlcikge1xuXG4gICAgICBjb25zdCByZWFzb25zID0gT2JqZWN0LmVudHJpZXMocmVqZWN0ZWRSZWFzb25zKVxuICAgICAgICAubWFwKChbaWQsIHN0YXRlXSkgPT4gYGFkYXB0ZXIgJHtpZH0gYCArXG4gICAgICAgICAgKHN0YXRlID09PSBmYWxzZSA/ICdpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCcgOiAnaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnVpbGQnKVxuICAgICAgICApO1xuXG4gICAgICBsZXQgcyA9IGxlbmd0aCA/XG4gICAgICAgIChyZWFzb25zLmxlbmd0aCA+IDEgPyAnc2luY2UgOlxcbicgKyByZWFzb25zLm1hcChyZW5kZXJSZWFzb24pLmpvaW4oJ1xcbicpIDogJyAnICsgcmVuZGVyUmVhc29uKHJlYXNvbnNbMF0pKSA6XG4gICAgICAgICdhcyBubyBhZGFwdGVyIHNwZWNpZmllZCc7XG5cbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBgVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCBgICsgcyxcbiAgICAgICAgJ0VSUl9OT1RfU1VQUE9SVCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkYXB0ZXI7XG4gIH0sXG4gIGFkYXB0ZXJzOiBrbm93bkFkYXB0ZXJzXG59XG4iLCJpbXBvcnQgcGxhdGZvcm0gZnJvbSBcIi4uL3BsYXRmb3JtL2luZGV4LmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5pbXBvcnQgY29tcG9zZVNpZ25hbHMgZnJvbSBcIi4uL2hlbHBlcnMvY29tcG9zZVNpZ25hbHMuanNcIjtcbmltcG9ydCB7dHJhY2tTdHJlYW19IGZyb20gXCIuLi9oZWxwZXJzL3RyYWNrU3RyZWFtLmpzXCI7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuLi9jb3JlL0F4aW9zSGVhZGVycy5qc1wiO1xuaW1wb3J0IHByb2dyZXNzRXZlbnRSZWR1Y2VyIGZyb20gXCIuLi9oZWxwZXJzL3Byb2dyZXNzRXZlbnRSZWR1Y2VyLmpzXCI7XG5pbXBvcnQgcmVzb2x2ZUNvbmZpZyBmcm9tIFwiLi4vaGVscGVycy9yZXNvbHZlQ29uZmlnLmpzXCI7XG5pbXBvcnQgc2V0dGxlIGZyb20gXCIuLi9jb3JlL3NldHRsZS5qc1wiO1xuXG5jb25zdCBmZXRjaFByb2dyZXNzRGVjb3JhdG9yID0gKHRvdGFsLCBmbikgPT4ge1xuICBjb25zdCBsZW5ndGhDb21wdXRhYmxlID0gdG90YWwgIT0gbnVsbDtcbiAgcmV0dXJuIChsb2FkZWQpID0+IHNldFRpbWVvdXQoKCkgPT4gZm4oe1xuICAgIGxlbmd0aENvbXB1dGFibGUsXG4gICAgdG90YWwsXG4gICAgbG9hZGVkXG4gIH0pKTtcbn1cblxuY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IHR5cGVvZiBmZXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbic7XG5jb25zdCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZCAmJiB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICdmdW5jdGlvbic7XG5cbi8vIHVzZWQgb25seSBpbnNpZGUgdGhlIGZldGNoIGFkYXB0ZXJcbmNvbnN0IGVuY29kZVRleHQgPSBpc0ZldGNoU3VwcG9ydGVkICYmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicgP1xuICAgICgoZW5jb2RlcikgPT4gKHN0cikgPT4gZW5jb2Rlci5lbmNvZGUoc3RyKSkobmV3IFRleHRFbmNvZGVyKCkpIDpcbiAgICBhc3luYyAoc3RyKSA9PiBuZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVzcG9uc2Uoc3RyKS5hcnJheUJ1ZmZlcigpKVxuKTtcblxuY29uc3Qgc3VwcG9ydHNSZXF1ZXN0U3RyZWFtID0gaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJiAoKCkgPT4ge1xuICBsZXQgZHVwbGV4QWNjZXNzZWQgPSBmYWxzZTtcblxuICBjb25zdCBoYXNDb250ZW50VHlwZSA9IG5ldyBSZXF1ZXN0KHBsYXRmb3JtLm9yaWdpbiwge1xuICAgIGJvZHk6IG5ldyBSZWFkYWJsZVN0cmVhbSgpLFxuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGdldCBkdXBsZXgoKSB7XG4gICAgICBkdXBsZXhBY2Nlc3NlZCA9IHRydWU7XG4gICAgICByZXR1cm4gJ2hhbGYnO1xuICAgIH0sXG4gIH0pLmhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKTtcblxuICByZXR1cm4gZHVwbGV4QWNjZXNzZWQgJiYgIWhhc0NvbnRlbnRUeXBlO1xufSkoKTtcblxuY29uc3QgREVGQVVMVF9DSFVOS19TSVpFID0gNjQgKiAxMDI0O1xuXG5jb25zdCBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtID0gaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJiAhISgoKT0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdXRpbHMuaXNSZWFkYWJsZVN0cmVhbShuZXcgUmVzcG9uc2UoJycpLmJvZHkpO1xuICB9IGNhdGNoKGVycikge1xuICAgIC8vIHJldHVybiB1bmRlZmluZWRcbiAgfVxufSkoKTtcblxuY29uc3QgcmVzb2x2ZXJzID0ge1xuICBzdHJlYW06IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gJiYgKChyZXMpID0+IHJlcy5ib2R5KVxufTtcblxuaXNGZXRjaFN1cHBvcnRlZCAmJiAoKChyZXMpID0+IHtcbiAgWyd0ZXh0JywgJ2FycmF5QnVmZmVyJywgJ2Jsb2InLCAnZm9ybURhdGEnLCAnc3RyZWFtJ10uZm9yRWFjaCh0eXBlID0+IHtcbiAgICAhcmVzb2x2ZXJzW3R5cGVdICYmIChyZXNvbHZlcnNbdHlwZV0gPSB1dGlscy5pc0Z1bmN0aW9uKHJlc1t0eXBlXSkgPyAocmVzKSA9PiByZXNbdHlwZV0oKSA6XG4gICAgICAoXywgY29uZmlnKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKGBSZXNwb25zZSB0eXBlICcke3R5cGV9JyBpcyBub3Qgc3VwcG9ydGVkYCwgQXhpb3NFcnJvci5FUlJfTk9UX1NVUFBPUlQsIGNvbmZpZyk7XG4gICAgICB9KVxuICB9KTtcbn0pKG5ldyBSZXNwb25zZSkpO1xuXG5jb25zdCBnZXRCb2R5TGVuZ3RoID0gYXN5bmMgKGJvZHkpID0+IHtcbiAgaWYgKGJvZHkgPT0gbnVsbCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYodXRpbHMuaXNCbG9iKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHkuc2l6ZTtcbiAgfVxuXG4gIGlmKHV0aWxzLmlzU3BlY0NvbXBsaWFudEZvcm0oYm9keSkpIHtcbiAgICByZXR1cm4gKGF3YWl0IG5ldyBSZXF1ZXN0KGJvZHkpLmFycmF5QnVmZmVyKCkpLmJ5dGVMZW5ndGg7XG4gIH1cblxuICBpZih1dGlscy5pc0FycmF5QnVmZmVyVmlldyhib2R5KSkge1xuICAgIHJldHVybiBib2R5LmJ5dGVMZW5ndGg7XG4gIH1cblxuICBpZih1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhib2R5KSkge1xuICAgIGJvZHkgPSBib2R5ICsgJyc7XG4gIH1cblxuICBpZih1dGlscy5pc1N0cmluZyhib2R5KSkge1xuICAgIHJldHVybiAoYXdhaXQgZW5jb2RlVGV4dChib2R5KSkuYnl0ZUxlbmd0aDtcbiAgfVxufVxuXG5jb25zdCByZXNvbHZlQm9keUxlbmd0aCA9IGFzeW5jIChoZWFkZXJzLCBib2R5KSA9PiB7XG4gIGNvbnN0IGxlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICByZXR1cm4gbGVuZ3RoID09IG51bGwgPyBnZXRCb2R5TGVuZ3RoKGJvZHkpIDogbGVuZ3RoO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0ZldGNoU3VwcG9ydGVkICYmIChhc3luYyAoY29uZmlnKSA9PiB7XG4gIGxldCB7XG4gICAgdXJsLFxuICAgIG1ldGhvZCxcbiAgICBkYXRhLFxuICAgIHNpZ25hbCxcbiAgICBjYW5jZWxUb2tlbixcbiAgICB0aW1lb3V0LFxuICAgIG9uRG93bmxvYWRQcm9ncmVzcyxcbiAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgIHJlc3BvbnNlVHlwZSxcbiAgICBoZWFkZXJzLFxuICAgIHdpdGhDcmVkZW50aWFscyA9ICdzYW1lLW9yaWdpbicsXG4gICAgZmV0Y2hPcHRpb25zXG4gIH0gPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG5cbiAgcmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlID8gKHJlc3BvbnNlVHlwZSArICcnKS50b0xvd2VyQ2FzZSgpIDogJ3RleHQnO1xuXG4gIGxldCBbY29tcG9zZWRTaWduYWwsIHN0b3BUaW1lb3V0XSA9IChzaWduYWwgfHwgY2FuY2VsVG9rZW4gfHwgdGltZW91dCkgP1xuICAgIGNvbXBvc2VTaWduYWxzKFtzaWduYWwsIGNhbmNlbFRva2VuXSwgdGltZW91dCkgOiBbXTtcblxuICBsZXQgZmluaXNoZWQsIHJlcXVlc3Q7XG5cbiAgY29uc3Qgb25GaW5pc2ggPSAoKSA9PiB7XG4gICAgIWZpbmlzaGVkICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29tcG9zZWRTaWduYWwgJiYgY29tcG9zZWRTaWduYWwudW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcblxuICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGxldCByZXF1ZXN0Q29udGVudExlbmd0aDtcblxuICB0cnkge1xuICAgIGlmIChcbiAgICAgIG9uVXBsb2FkUHJvZ3Jlc3MgJiYgc3VwcG9ydHNSZXF1ZXN0U3RyZWFtICYmIG1ldGhvZCAhPT0gJ2dldCcgJiYgbWV0aG9kICE9PSAnaGVhZCcgJiZcbiAgICAgIChyZXF1ZXN0Q29udGVudExlbmd0aCA9IGF3YWl0IHJlc29sdmVCb2R5TGVuZ3RoKGhlYWRlcnMsIGRhdGEpKSAhPT0gMFxuICAgICkge1xuICAgICAgbGV0IF9yZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICBkdXBsZXg6IFwiaGFsZlwiXG4gICAgICB9KTtcblxuICAgICAgbGV0IGNvbnRlbnRUeXBlSGVhZGVyO1xuXG4gICAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSAmJiAoY29udGVudFR5cGVIZWFkZXIgPSBfcmVxdWVzdC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVIZWFkZXIpXG4gICAgICB9XG5cbiAgICAgIGlmIChfcmVxdWVzdC5ib2R5KSB7XG4gICAgICAgIGRhdGEgPSB0cmFja1N0cmVhbShfcmVxdWVzdC5ib2R5LCBERUZBVUxUX0NIVU5LX1NJWkUsIGZldGNoUHJvZ3Jlc3NEZWNvcmF0b3IoXG4gICAgICAgICAgcmVxdWVzdENvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIob25VcGxvYWRQcm9ncmVzcylcbiAgICAgICAgKSwgbnVsbCwgZW5jb2RlVGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF1dGlscy5pc1N0cmluZyh3aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICB3aXRoQ3JlZGVudGlhbHMgPSB3aXRoQ3JlZGVudGlhbHMgPyAnY29ycycgOiAnb21pdCc7XG4gICAgfVxuXG4gICAgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgLi4uZmV0Y2hPcHRpb25zLFxuICAgICAgc2lnbmFsOiBjb21wb3NlZFNpZ25hbCxcbiAgICAgIG1ldGhvZDogbWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLm5vcm1hbGl6ZSgpLnRvSlNPTigpLFxuICAgICAgYm9keTogZGF0YSxcbiAgICAgIGR1cGxleDogXCJoYWxmXCIsXG4gICAgICB3aXRoQ3JlZGVudGlhbHNcbiAgICB9KTtcblxuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuXG4gICAgY29uc3QgaXNTdHJlYW1SZXNwb25zZSA9IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gJiYgKHJlc3BvbnNlVHlwZSA9PT0gJ3N0cmVhbScgfHwgcmVzcG9uc2VUeXBlID09PSAncmVzcG9uc2UnKTtcblxuICAgIGlmIChzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChvbkRvd25sb2FkUHJvZ3Jlc3MgfHwgaXNTdHJlYW1SZXNwb25zZSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcblxuICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IHJlc3BvbnNlW3Byb3BdO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKTtcblxuICAgICAgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoXG4gICAgICAgIHRyYWNrU3RyZWFtKHJlc3BvbnNlLmJvZHksIERFRkFVTFRfQ0hVTktfU0laRSwgb25Eb3dubG9hZFByb2dyZXNzICYmIGZldGNoUHJvZ3Jlc3NEZWNvcmF0b3IoXG4gICAgICAgICAgcmVzcG9uc2VDb250ZW50TGVuZ3RoLFxuICAgICAgICAgIHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uRG93bmxvYWRQcm9ncmVzcywgdHJ1ZSlcbiAgICAgICAgKSwgaXNTdHJlYW1SZXNwb25zZSAmJiBvbkZpbmlzaCwgZW5jb2RlVGV4dCksXG4gICAgICAgIG9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlIHx8ICd0ZXh0JztcblxuICAgIGxldCByZXNwb25zZURhdGEgPSBhd2FpdCByZXNvbHZlcnNbdXRpbHMuZmluZEtleShyZXNvbHZlcnMsIHJlc3BvbnNlVHlwZSkgfHwgJ3RleHQnXShyZXNwb25zZSwgY29uZmlnKTtcblxuICAgICFpc1N0cmVhbVJlc3BvbnNlICYmIG9uRmluaXNoKCk7XG5cbiAgICBzdG9wVGltZW91dCAmJiBzdG9wVGltZW91dCgpO1xuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBoZWFkZXJzOiBBeGlvc0hlYWRlcnMuZnJvbShyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfSlcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBvbkZpbmlzaCgpO1xuXG4gICAgaWYgKGVyciAmJiBlcnIubmFtZSA9PT0gJ1R5cGVFcnJvcicgJiYgL2ZldGNoL2kudGVzdChlcnIubWVzc2FnZSkpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24oXG4gICAgICAgIG5ldyBBeGlvc0Vycm9yKCdOZXR3b3JrIEVycm9yJywgQXhpb3NFcnJvci5FUlJfTkVUV09SSywgY29uZmlnLCByZXF1ZXN0KSxcbiAgICAgICAge1xuICAgICAgICAgIGNhdXNlOiBlcnIuY2F1c2UgfHwgZXJyXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG5cbiAgICB0aHJvdyBBeGlvc0Vycm9yLmZyb20oZXJyLCBlcnIgJiYgZXJyLmNvZGUsIGNvbmZpZywgcmVxdWVzdCk7XG4gIH1cbn0pO1xuXG5cbiIsImltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBzZXR0bGUgZnJvbSAnLi8uLi9jb3JlL3NldHRsZS5qcyc7XG5pbXBvcnQgdHJhbnNpdGlvbmFsRGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMvdHJhbnNpdGlvbmFsLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tICcuLi9jYW5jZWwvQ2FuY2VsZWRFcnJvci5qcyc7XG5pbXBvcnQgcGFyc2VQcm90b2NvbCBmcm9tICcuLi9oZWxwZXJzL3BhcnNlUHJvdG9jb2wuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSAnLi4vY29yZS9BeGlvc0hlYWRlcnMuanMnO1xuaW1wb3J0IHByb2dyZXNzRXZlbnRSZWR1Y2VyIGZyb20gJy4uL2hlbHBlcnMvcHJvZ3Jlc3NFdmVudFJlZHVjZXIuanMnO1xuaW1wb3J0IHJlc29sdmVDb25maWcgZnJvbSBcIi4uL2hlbHBlcnMvcmVzb2x2ZUNvbmZpZy5qc1wiO1xuXG5jb25zdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgZGVmYXVsdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgJiYgZnVuY3Rpb24gKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNvbnN0IF9jb25maWcgPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG4gICAgbGV0IHJlcXVlc3REYXRhID0gX2NvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oX2NvbmZpZy5oZWFkZXJzKS5ub3JtYWxpemUoKTtcbiAgICBsZXQge3Jlc3BvbnNlVHlwZX0gPSBfY29uZmlnO1xuICAgIGxldCBvbkNhbmNlbGVkO1xuICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICBpZiAoX2NvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgICAgICBfY29uZmlnLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgX2NvbmZpZy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vcGVuKF9jb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIF9jb25maWcudXJsLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gX2NvbmZpZy50aW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gb25sb2FkZW5kKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShcbiAgICAgICAgJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCAmJiByZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gIXJlc3BvbnNlVHlwZSB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyB8fCByZXNwb25zZVR5cGUgPT09ICdqc29uJyA/XG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH07XG5cbiAgICAgIHNldHRsZShmdW5jdGlvbiBfcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgZnVuY3Rpb24gX3JlamVjdChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIHJlc3BvbnNlKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCdvbmxvYWRlbmQnIGluIHJlcXVlc3QpIHtcbiAgICAgIC8vIFVzZSBvbmxvYWRlbmQgaWYgYXZhaWxhYmxlXG4gICAgICByZXF1ZXN0Lm9ubG9hZGVuZCA9IG9ubG9hZGVuZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGlzdGVuIGZvciByZWFkeSBzdGF0ZSB0byBlbXVsYXRlIG9ubG9hZGVuZFxuICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVMb2FkKCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QgfHwgcmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHJlcXVlc3QgZXJyb3JlZCBvdXQgYW5kIHdlIGRpZG4ndCBnZXQgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlXG4gICAgICAgIC8vIGhhbmRsZWQgYnkgb25lcnJvciBpbnN0ZWFkXG4gICAgICAgIC8vIFdpdGggb25lIGV4Y2VwdGlvbjogcmVxdWVzdCB0aGF0IHVzaW5nIGZpbGU6IHByb3RvY29sLCBtb3N0IGJyb3dzZXJzXG4gICAgICAgIC8vIHdpbGwgcmV0dXJuIHN0YXR1cyBhcyAwIGV2ZW4gdGhvdWdoIGl0J3MgYSBzdWNjZXNzZnVsIHJlcXVlc3RcbiAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAwICYmICEocmVxdWVzdC5yZXNwb25zZVVSTCAmJiByZXF1ZXN0LnJlc3BvbnNlVVJMLmluZGV4T2YoJ2ZpbGU6JykgPT09IDApKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlYWR5c3RhdGUgaGFuZGxlciBpcyBjYWxsaW5nIGJlZm9yZSBvbmVycm9yIG9yIG9udGltZW91dCBoYW5kbGVycyxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGNhbGwgb25sb2FkZW5kIG9uIHRoZSBuZXh0ICd0aWNrJ1xuICAgICAgICBzZXRUaW1lb3V0KG9ubG9hZGVuZCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBicm93c2VyIHJlcXVlc3QgY2FuY2VsbGF0aW9uIChhcyBvcHBvc2VkIHRvIGEgbWFudWFsIGNhbmNlbGxhdGlvbilcbiAgICByZXF1ZXN0Lm9uYWJvcnQgPSBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignUmVxdWVzdCBhYm9ydGVkJywgQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsIF9jb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcbiAgICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgICAgLy8gb25lcnJvciBzaG91bGQgb25seSBmaXJlIGlmIGl0J3MgYSBuZXR3b3JrIGVycm9yXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBfY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIGxldCB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0ID8gJ3RpbWVvdXQgb2YgJyArIF9jb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcgOiAndGltZW91dCBleGNlZWRlZCc7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBfY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgIGlmIChfY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdHJhbnNpdGlvbmFsLmNsYXJpZnlUaW1lb3V0RXJyb3IgPyBBeGlvc0Vycm9yLkVUSU1FRE9VVCA6IEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELFxuICAgICAgICBfY29uZmlnLFxuICAgICAgICByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgcmVxdWVzdERhdGEgPT09IHVuZGVmaW5lZCAmJiByZXF1ZXN0SGVhZGVycy5zZXRDb250ZW50VHlwZShudWxsKTtcblxuICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG4gICAgaWYgKCdzZXRSZXF1ZXN0SGVhZGVyJyBpbiByZXF1ZXN0KSB7XG4gICAgICB1dGlscy5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLnRvSlNPTigpLCBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHZhbCwga2V5KSB7XG4gICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChfY29uZmlnLndpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFfY29uZmlnLndpdGhDcmVkZW50aWFscztcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKHJlc3BvbnNlVHlwZSAmJiByZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBfY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBfY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHByb2dyZXNzRXZlbnRSZWR1Y2VyKF9jb25maWcub25Eb3dubG9hZFByb2dyZXNzLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAodHlwZW9mIF9jb25maWcub25VcGxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBwcm9ncmVzc0V2ZW50UmVkdWNlcihfY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MpKTtcbiAgICB9XG5cbiAgICBpZiAoX2NvbmZpZy5jYW5jZWxUb2tlbiB8fCBfY29uZmlnLnNpZ25hbCkge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIG9uQ2FuY2VsZWQgPSBjYW5jZWwgPT4ge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCFjYW5jZWwgfHwgY2FuY2VsLnR5cGUgPyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcsIHJlcXVlc3QpIDogY2FuY2VsKTtcbiAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIF9jb25maWcuY2FuY2VsVG9rZW4gJiYgX2NvbmZpZy5jYW5jZWxUb2tlbi5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG4gICAgICBpZiAoX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgX2NvbmZpZy5zaWduYWwuYWJvcnRlZCA/IG9uQ2FuY2VsZWQoKSA6IF9jb25maWcuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG9jb2wgPSBwYXJzZVByb3RvY29sKF9jb25maWcudXJsKTtcblxuICAgIGlmIChwcm90b2NvbCAmJiBwbGF0Zm9ybS5wcm90b2NvbHMuaW5kZXhPZihwcm90b2NvbCkgPT09IC0xKSB7XG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1Vuc3VwcG9ydGVkIHByb3RvY29sICcgKyBwcm90b2NvbCArICc6JywgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIGNvbmZpZykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCBiaW5kIGZyb20gJy4vaGVscGVycy9iaW5kLmpzJztcbmltcG9ydCBBeGlvcyBmcm9tICcuL2NvcmUvQXhpb3MuanMnO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gJy4vY29yZS9tZXJnZUNvbmZpZy5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgZm9ybURhdGFUb0pTT04gZnJvbSAnLi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbFRva2VuIGZyb20gJy4vY2FuY2VsL0NhbmNlbFRva2VuLmpzJztcbmltcG9ydCBpc0NhbmNlbCBmcm9tICcuL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQge1ZFUlNJT059IGZyb20gJy4vZW52L2RhdGEuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi9oZWxwZXJzL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHNwcmVhZCBmcm9tICcuL2hlbHBlcnMvc3ByZWFkLmpzJztcbmltcG9ydCBpc0F4aW9zRXJyb3IgZnJvbSAnLi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuL2NvcmUvQXhpb3NIZWFkZXJzLmpzXCI7XG5pbXBvcnQgYWRhcHRlcnMgZnJvbSAnLi9hZGFwdGVycy9hZGFwdGVycy5qcyc7XG5pbXBvcnQgSHR0cFN0YXR1c0NvZGUgZnJvbSAnLi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm5zIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICBjb25zdCBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MucHJvdG90eXBlLCBjb250ZXh0LCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIGNvbnRleHQsIG51bGwsIHthbGxPd25LZXlzOiB0cnVlfSk7XG5cbiAgLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuICBpbnN0YW5jZS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UobWVyZ2VDb25maWcoZGVmYXVsdENvbmZpZywgaW5zdGFuY2VDb25maWcpKTtcbiAgfTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxuY29uc3QgYXhpb3MgPSBjcmVhdGVJbnN0YW5jZShkZWZhdWx0cyk7XG5cbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxuYXhpb3MuQXhpb3MgPSBBeGlvcztcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWxlZEVycm9yID0gQ2FuY2VsZWRFcnJvcjtcbmF4aW9zLkNhbmNlbFRva2VuID0gQ2FuY2VsVG9rZW47XG5heGlvcy5pc0NhbmNlbCA9IGlzQ2FuY2VsO1xuYXhpb3MuVkVSU0lPTiA9IFZFUlNJT047XG5heGlvcy50b0Zvcm1EYXRhID0gdG9Gb3JtRGF0YTtcblxuLy8gRXhwb3NlIEF4aW9zRXJyb3IgY2xhc3NcbmF4aW9zLkF4aW9zRXJyb3IgPSBBeGlvc0Vycm9yO1xuXG4vLyBhbGlhcyBmb3IgQ2FuY2VsZWRFcnJvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuYXhpb3MuQ2FuY2VsID0gYXhpb3MuQ2FuY2VsZWRFcnJvcjtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcblxuYXhpb3Muc3ByZWFkID0gc3ByZWFkO1xuXG4vLyBFeHBvc2UgaXNBeGlvc0Vycm9yXG5heGlvcy5pc0F4aW9zRXJyb3IgPSBpc0F4aW9zRXJyb3I7XG5cbi8vIEV4cG9zZSBtZXJnZUNvbmZpZ1xuYXhpb3MubWVyZ2VDb25maWcgPSBtZXJnZUNvbmZpZztcblxuYXhpb3MuQXhpb3NIZWFkZXJzID0gQXhpb3NIZWFkZXJzO1xuXG5heGlvcy5mb3JtVG9KU09OID0gdGhpbmcgPT4gZm9ybURhdGFUb0pTT04odXRpbHMuaXNIVE1MRm9ybSh0aGluZykgPyBuZXcgRm9ybURhdGEodGhpbmcpIDogdGhpbmcpO1xuXG5heGlvcy5nZXRBZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcjtcblxuYXhpb3MuSHR0cFN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzQ29kZTtcblxuYXhpb3MuZGVmYXVsdCA9IGF4aW9zO1xuXG4vLyB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBoYXZlIGEgZGVmYXVsdCBleHBvcnRcbmV4cG9ydCBkZWZhdWx0IGF4aW9zXG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vQ2FuY2VsZWRFcnJvci5qcyc7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge0NhbmNlbFRva2VufVxuICovXG5jbGFzcyBDYW5jZWxUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlUHJvbWlzZTtcblxuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXM7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuKGNhbmNlbCA9PiB7XG4gICAgICBpZiAoIXRva2VuLl9saXN0ZW5lcnMpIHJldHVybjtcblxuICAgICAgbGV0IGkgPSB0b2tlbi5fbGlzdGVuZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgdG9rZW4uX2xpc3RlbmVyc1tpXShjYW5jZWwpO1xuICAgICAgfVxuICAgICAgdG9rZW4uX2xpc3RlbmVycyA9IG51bGw7XG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuID0gb25mdWxmaWxsZWQgPT4ge1xuICAgICAgbGV0IF9yZXNvbHZlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdG9rZW4uc3Vic2NyaWJlKHJlc29sdmUpO1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB9KS50aGVuKG9uZnVsZmlsbGVkKTtcblxuICAgICAgcHJvbWlzZS5jYW5jZWwgPSBmdW5jdGlvbiByZWplY3QoKSB7XG4gICAgICAgIHRva2VuLnVuc3Vic2NyaWJlKF9yZXNvbHZlKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gICAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCk7XG4gICAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICAgKi9cbiAgdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIHRocm93IHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBuZXcgYENhbmNlbFRva2VuYCBhbmQgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCxcbiAgICogY2FuY2VscyB0aGUgYENhbmNlbFRva2VuYC5cbiAgICovXG4gIHN0YXRpYyBzb3VyY2UoKSB7XG4gICAgbGV0IGNhbmNlbDtcbiAgICBjb25zdCB0b2tlbiA9IG5ldyBDYW5jZWxUb2tlbihmdW5jdGlvbiBleGVjdXRvcihjKSB7XG4gICAgICBjYW5jZWwgPSBjO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbixcbiAgICAgIGNhbmNlbFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FuY2VsVG9rZW47XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIEEgYENhbmNlbGVkRXJyb3JgIGlzIGFuIG9iamVjdCB0aGF0IGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBjYW5jZWxlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3Q9fSByZXF1ZXN0IFRoZSByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm5zIHtDYW5jZWxlZEVycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsZWRFcnJvcihtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gIEF4aW9zRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlID09IG51bGwgPyAnY2FuY2VsZWQnIDogbWVzc2FnZSwgQXhpb3NFcnJvci5FUlJfQ0FOQ0VMRUQsIGNvbmZpZywgcmVxdWVzdCk7XG4gIHRoaXMubmFtZSA9ICdDYW5jZWxlZEVycm9yJztcbn1cblxudXRpbHMuaW5oZXJpdHMoQ2FuY2VsZWRFcnJvciwgQXhpb3NFcnJvciwge1xuICBfX0NBTkNFTF9fOiB0cnVlXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FuY2VsZWRFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNDYW5jZWwodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9fQ0FOQ0VMX18pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgYnVpbGRVUkwgZnJvbSAnLi4vaGVscGVycy9idWlsZFVSTC5qcyc7XG5pbXBvcnQgSW50ZXJjZXB0b3JNYW5hZ2VyIGZyb20gJy4vSW50ZXJjZXB0b3JNYW5hZ2VyLmpzJztcbmltcG9ydCBkaXNwYXRjaFJlcXVlc3QgZnJvbSAnLi9kaXNwYXRjaFJlcXVlc3QuanMnO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gJy4vbWVyZ2VDb25maWcuanMnO1xuaW1wb3J0IGJ1aWxkRnVsbFBhdGggZnJvbSAnLi9idWlsZEZ1bGxQYXRoLmpzJztcbmltcG9ydCB2YWxpZGF0b3IgZnJvbSAnLi4vaGVscGVycy92YWxpZGF0b3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuL0F4aW9zSGVhZGVycy5qcyc7XG5cbmNvbnN0IHZhbGlkYXRvcnMgPSB2YWxpZGF0b3IudmFsaWRhdG9ycztcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuY2xhc3MgQXhpb3Mge1xuICBjb25zdHJ1Y3RvcihpbnN0YW5jZUNvbmZpZykge1xuICAgIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZztcbiAgICB0aGlzLmludGVyY2VwdG9ycyA9IHtcbiAgICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGEgcmVxdWVzdFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGNvbmZpZ09yVXJsIFRoZSBjb25maWcgc3BlY2lmaWMgZm9yIHRoaXMgcmVxdWVzdCAobWVyZ2VkIHdpdGggdGhpcy5kZWZhdWx0cylcbiAgICogQHBhcmFtIHs/T2JqZWN0fSBjb25maWdcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGxldCBkdW1teTtcblxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA/IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGR1bW15ID0ge30pIDogKGR1bW15ID0gbmV3IEVycm9yKCkpO1xuXG4gICAgICAgIC8vIHNsaWNlIG9mZiB0aGUgRXJyb3I6IC4uLiBsaW5lXG4gICAgICAgIGNvbnN0IHN0YWNrID0gZHVtbXkuc3RhY2sgPyBkdW1teS5zdGFjay5yZXBsYWNlKC9eLitcXG4vLCAnJykgOiAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIWVyci5zdGFjaykge1xuICAgICAgICAgICAgZXJyLnN0YWNrID0gc3RhY2s7XG4gICAgICAgICAgICAvLyBtYXRjaCB3aXRob3V0IHRoZSAyIHRvcCBzdGFjayBsaW5lc1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2sgJiYgIVN0cmluZyhlcnIuc3RhY2spLmVuZHNXaXRoKHN0YWNrLnJlcGxhY2UoL14uK1xcbi4rXFxuLywgJycpKSkge1xuICAgICAgICAgICAgZXJyLnN0YWNrICs9ICdcXG4nICsgc3RhY2tcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBpZ25vcmUgdGhlIGNhc2Ugd2hlcmUgXCJzdGFja1wiIGlzIGFuIHVuLXdyaXRhYmxlIHByb3BlcnR5XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIF9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICAvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXG4gICAgaWYgKHR5cGVvZiBjb25maWdPclVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgIGNvbmZpZy51cmwgPSBjb25maWdPclVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnID0gY29uZmlnT3JVcmwgfHwge307XG4gICAgfVxuXG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAgIGNvbnN0IHt0cmFuc2l0aW9uYWwsIHBhcmFtc1NlcmlhbGl6ZXIsIGhlYWRlcnN9ID0gY29uZmlnO1xuXG4gICAgaWYgKHRyYW5zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyh0cmFuc2l0aW9uYWwsIHtcbiAgICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGZvcmNlZEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICBjbGFyaWZ5VGltZW91dEVycm9yOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pXG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtc1NlcmlhbGl6ZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zU2VyaWFsaXplcikpIHtcbiAgICAgICAgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIgPSB7XG4gICAgICAgICAgc2VyaWFsaXplOiBwYXJhbXNTZXJpYWxpemVyXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHBhcmFtc1NlcmlhbGl6ZXIsIHtcbiAgICAgICAgICBlbmNvZGU6IHZhbGlkYXRvcnMuZnVuY3Rpb24sXG4gICAgICAgICAgc2VyaWFsaXplOiB2YWxpZGF0b3JzLmZ1bmN0aW9uXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBjb25maWcubWV0aG9kXG4gICAgY29uZmlnLm1ldGhvZCA9IChjb25maWcubWV0aG9kIHx8IHRoaXMuZGVmYXVsdHMubWV0aG9kIHx8ICdnZXQnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gICAgbGV0IGNvbnRleHRIZWFkZXJzID0gaGVhZGVycyAmJiB1dGlscy5tZXJnZShcbiAgICAgIGhlYWRlcnMuY29tbW9uLFxuICAgICAgaGVhZGVyc1tjb25maWcubWV0aG9kXVxuICAgICk7XG5cbiAgICBoZWFkZXJzICYmIHV0aWxzLmZvckVhY2goXG4gICAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICAgIChtZXRob2QpID0+IHtcbiAgICAgICAgZGVsZXRlIGhlYWRlcnNbbWV0aG9kXTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuY29uY2F0KGNvbnRleHRIZWFkZXJzLCBoZWFkZXJzKTtcblxuICAgIC8vIGZpbHRlciBvdXQgc2tpcHBlZCBpbnRlcmNlcHRvcnNcbiAgICBjb25zdCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIGxldCBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSB0cnVlO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiB1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcmNlcHRvci5ydW5XaGVuID09PSAnZnVuY3Rpb24nICYmIGludGVyY2VwdG9yLnJ1bldoZW4oY29uZmlnKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3Iuc3luY2hyb25vdXM7XG5cbiAgICAgIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uIHB1c2hSZXNwb25zZUludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgICAgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnB1c2goaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gICAgfSk7XG5cbiAgICBsZXQgcHJvbWlzZTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IGxlbjtcblxuICAgIGlmICghc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzKSB7XG4gICAgICBjb25zdCBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QuYmluZCh0aGlzKSwgdW5kZWZpbmVkXTtcbiAgICAgIGNoYWluLnVuc2hpZnQuYXBwbHkoY2hhaW4sIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGNoYWluLnB1c2guYXBwbHkoY2hhaW4sIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBsZW4gPSBjaGFpbi5sZW5ndGg7XG5cbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcblxuICAgICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbltpKytdLCBjaGFpbltpKytdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgbGVuID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgbGV0IG5ld0NvbmZpZyA9IGNvbmZpZztcblxuICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIGNvbnN0IG9uRnVsZmlsbGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIGNvbnN0IG9uUmVqZWN0ZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbltpKytdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3Q29uZmlnID0gb25GdWxmaWxsZWQobmV3Q29uZmlnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG9uUmVqZWN0ZWQuY2FsbCh0aGlzLCBlcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBwcm9taXNlID0gZGlzcGF0Y2hSZXF1ZXN0LmNhbGwodGhpcywgbmV3Q29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG5cbiAgICBpID0gMDtcbiAgICBsZW4gPSByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4ocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluW2krK10sIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGdldFVyaShjb25maWcpIHtcbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYnVpbGRGdWxsUGF0aChjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gICAgcmV0dXJuIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG4gIH1cbn1cblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBkYXRhOiAoY29uZmlnIHx8IHt9KS5kYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVIVFRQTWV0aG9kKGlzRm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBodHRwTWV0aG9kKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGlzRm9ybSA/IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gICAgICAgIH0gOiB7fSxcbiAgICAgICAgdXJsLFxuICAgICAgICBkYXRhXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfVxuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZ2VuZXJhdGVIVFRQTWV0aG9kKCk7XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZCArICdGb3JtJ10gPSBnZW5lcmF0ZUhUVFBNZXRob2QodHJ1ZSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3M7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29uZmlnXSBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5mdW5jdGlvbiBBeGlvc0Vycm9yKG1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgRXJyb3IuY2FsbCh0aGlzKTtcblxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgfVxuXG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMubmFtZSA9ICdBeGlvc0Vycm9yJztcbiAgY29kZSAmJiAodGhpcy5jb2RlID0gY29kZSk7XG4gIGNvbmZpZyAmJiAodGhpcy5jb25maWcgPSBjb25maWcpO1xuICByZXF1ZXN0ICYmICh0aGlzLnJlcXVlc3QgPSByZXF1ZXN0KTtcbiAgcmVzcG9uc2UgJiYgKHRoaXMucmVzcG9uc2UgPSByZXNwb25zZSk7XG59XG5cbnV0aWxzLmluaGVyaXRzKEF4aW9zRXJyb3IsIEVycm9yLCB7XG4gIHRvSlNPTjogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBTdGFuZGFyZFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgLy8gTWljcm9zb2Z0XG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIG51bWJlcjogdGhpcy5udW1iZXIsXG4gICAgICAvLyBNb3ppbGxhXG4gICAgICBmaWxlTmFtZTogdGhpcy5maWxlTmFtZSxcbiAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcbiAgICAgIGNvbHVtbk51bWJlcjogdGhpcy5jb2x1bW5OdW1iZXIsXG4gICAgICBzdGFjazogdGhpcy5zdGFjayxcbiAgICAgIC8vIEF4aW9zXG4gICAgICBjb25maWc6IHV0aWxzLnRvSlNPTk9iamVjdCh0aGlzLmNvbmZpZyksXG4gICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICBzdGF0dXM6IHRoaXMucmVzcG9uc2UgJiYgdGhpcy5yZXNwb25zZS5zdGF0dXMgPyB0aGlzLnJlc3BvbnNlLnN0YXR1cyA6IG51bGxcbiAgICB9O1xuICB9XG59KTtcblxuY29uc3QgcHJvdG90eXBlID0gQXhpb3NFcnJvci5wcm90b3R5cGU7XG5jb25zdCBkZXNjcmlwdG9ycyA9IHt9O1xuXG5bXG4gICdFUlJfQkFEX09QVElPTl9WQUxVRScsXG4gICdFUlJfQkFEX09QVElPTicsXG4gICdFQ09OTkFCT1JURUQnLFxuICAnRVRJTUVET1VUJyxcbiAgJ0VSUl9ORVRXT1JLJyxcbiAgJ0VSUl9GUl9UT09fTUFOWV9SRURJUkVDVFMnLFxuICAnRVJSX0RFUFJFQ0FURUQnLFxuICAnRVJSX0JBRF9SRVNQT05TRScsXG4gICdFUlJfQkFEX1JFUVVFU1QnLFxuICAnRVJSX0NBTkNFTEVEJyxcbiAgJ0VSUl9OT1RfU1VQUE9SVCcsXG4gICdFUlJfSU5WQUxJRF9VUkwnXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuXS5mb3JFYWNoKGNvZGUgPT4ge1xuICBkZXNjcmlwdG9yc1tjb2RlXSA9IHt2YWx1ZTogY29kZX07XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXhpb3NFcnJvciwgZGVzY3JpcHRvcnMpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgJ2lzQXhpb3NFcnJvcicsIHt2YWx1ZTogdHJ1ZX0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuQXhpb3NFcnJvci5mcm9tID0gKGVycm9yLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlLCBjdXN0b21Qcm9wcykgPT4ge1xuICBjb25zdCBheGlvc0Vycm9yID0gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpO1xuXG4gIHV0aWxzLnRvRmxhdE9iamVjdChlcnJvciwgYXhpb3NFcnJvciwgZnVuY3Rpb24gZmlsdGVyKG9iaikge1xuICAgIHJldHVybiBvYmogIT09IEVycm9yLnByb3RvdHlwZTtcbiAgfSwgcHJvcCA9PiB7XG4gICAgcmV0dXJuIHByb3AgIT09ICdpc0F4aW9zRXJyb3InO1xuICB9KTtcblxuICBBeGlvc0Vycm9yLmNhbGwoYXhpb3NFcnJvciwgZXJyb3IubWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSk7XG5cbiAgYXhpb3NFcnJvci5jYXVzZSA9IGVycm9yO1xuXG4gIGF4aW9zRXJyb3IubmFtZSA9IGVycm9yLm5hbWU7XG5cbiAgY3VzdG9tUHJvcHMgJiYgT2JqZWN0LmFzc2lnbihheGlvc0Vycm9yLCBjdXN0b21Qcm9wcyk7XG5cbiAgcmV0dXJuIGF4aW9zRXJyb3I7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc0Vycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IHBhcnNlSGVhZGVycyBmcm9tICcuLi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyc7XG5cbmNvbnN0ICRpbnRlcm5hbHMgPSBTeW1ib2woJ2ludGVybmFscycpO1xuXG5mdW5jdGlvbiBub3JtYWxpemVIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIgJiYgU3RyaW5nKGhlYWRlcikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1dGlscy5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWYWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRva2VucyhzdHIpIHtcbiAgY29uc3QgdG9rZW5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3QgdG9rZW5zUkUgPSAvKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nO1xuICBsZXQgbWF0Y2g7XG5cbiAgd2hpbGUgKChtYXRjaCA9IHRva2Vuc1JFLmV4ZWMoc3RyKSkpIHtcbiAgICB0b2tlbnNbbWF0Y2hbMV1dID0gbWF0Y2hbMl07XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5jb25zdCBpc1ZhbGlkSGVhZGVyTmFtZSA9IChzdHIpID0+IC9eWy1fYS16QS1aMC05XmB8fiwhIyQlJicqKy5dKyQvLnRlc3Qoc3RyLnRyaW0oKSk7XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVyVmFsdWUoY29udGV4dCwgdmFsdWUsIGhlYWRlciwgZmlsdGVyLCBpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgaWYgKHV0aWxzLmlzRnVuY3Rpb24oZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLCB2YWx1ZSwgaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgICB2YWx1ZSA9IGhlYWRlcjtcbiAgfVxuXG4gIGlmICghdXRpbHMuaXNTdHJpbmcodmFsdWUpKSByZXR1cm47XG5cbiAgaWYgKHV0aWxzLmlzU3RyaW5nKGZpbHRlcikpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihmaWx0ZXIpICE9PSAtMTtcbiAgfVxuXG4gIGlmICh1dGlscy5pc1JlZ0V4cChmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci50ZXN0KHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCAodywgY2hhciwgc3RyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhci50b1VwcGVyQ2FzZSgpICsgc3RyO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEFjY2Vzc29ycyhvYmosIGhlYWRlcikge1xuICBjb25zdCBhY2Nlc3Nvck5hbWUgPSB1dGlscy50b0NhbWVsQ2FzZSgnICcgKyBoZWFkZXIpO1xuXG4gIFsnZ2V0JywgJ3NldCcsICdoYXMnXS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZE5hbWUgKyBhY2Nlc3Nvck5hbWUsIHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICAgIHJldHVybiB0aGlzW21ldGhvZE5hbWVdLmNhbGwodGhpcywgaGVhZGVyLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNsYXNzIEF4aW9zSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yKGhlYWRlcnMpIHtcbiAgICBoZWFkZXJzICYmIHRoaXMuc2V0KGhlYWRlcnMpO1xuICB9XG5cbiAgc2V0KGhlYWRlciwgdmFsdWVPclJld3JpdGUsIHJld3JpdGUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWxIZWFkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZWFkZXIgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHNlbGYsIGxIZWFkZXIpO1xuXG4gICAgICBpZigha2V5IHx8IHNlbGZba2V5XSA9PT0gdW5kZWZpbmVkIHx8IF9yZXdyaXRlID09PSB0cnVlIHx8IChfcmV3cml0ZSA9PT0gdW5kZWZpbmVkICYmIHNlbGZba2V5XSAhPT0gZmFsc2UpKSB7XG4gICAgICAgIHNlbGZba2V5IHx8IF9oZWFkZXJdID0gbm9ybWFsaXplVmFsdWUoX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZXRIZWFkZXJzID0gKGhlYWRlcnMsIF9yZXdyaXRlKSA9PlxuICAgICAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCAoX3ZhbHVlLCBfaGVhZGVyKSA9PiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkpO1xuXG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QoaGVhZGVyKSB8fCBoZWFkZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzZXRIZWFkZXJzKGhlYWRlciwgdmFsdWVPclJld3JpdGUpXG4gICAgfSBlbHNlIGlmKHV0aWxzLmlzU3RyaW5nKGhlYWRlcikgJiYgKGhlYWRlciA9IGhlYWRlci50cmltKCkpICYmICFpc1ZhbGlkSGVhZGVyTmFtZShoZWFkZXIpKSB7XG4gICAgICBzZXRIZWFkZXJzKHBhcnNlSGVhZGVycyhoZWFkZXIpLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0hlYWRlcnMoaGVhZGVyKSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaGVhZGVyLmVudHJpZXMoKSkge1xuICAgICAgICBzZXRIZWFkZXIodmFsdWUsIGtleSwgcmV3cml0ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlciAhPSBudWxsICYmIHNldEhlYWRlcih2YWx1ZU9yUmV3cml0ZSwgaGVhZGVyLCByZXdyaXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldChoZWFkZXIsIHBhcnNlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgIGlmICghcGFyc2VyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZVRva2Vucyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5jYWxsKHRoaXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzUmVnRXhwKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmV4ZWModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYXMoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIHJldHVybiAhIShrZXkgJiYgdGhpc1trZXldICE9PSB1bmRlZmluZWQgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGVsZXRlKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBkZWxldGVIZWFkZXIoX2hlYWRlcikge1xuICAgICAgX2hlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKF9oZWFkZXIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleShzZWxmLCBfaGVhZGVyKTtcblxuICAgICAgICBpZiAoa2V5ICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHNlbGYsIHNlbGZba2V5XSwga2V5LCBtYXRjaGVyKSkpIHtcbiAgICAgICAgICBkZWxldGUgc2VsZltrZXldO1xuXG4gICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheShoZWFkZXIpKSB7XG4gICAgICBoZWFkZXIuZm9yRWFjaChkZWxldGVIZWFkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGVIZWFkZXIoaGVhZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGNsZWFyKG1hdGNoZXIpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gICAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIsIHRydWUpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgbm9ybWFsaXplKGZvcm1hdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcblxuICAgIHV0aWxzLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkoaGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBzZWxmW2tleV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZvcm1hdCA/IGZvcm1hdEhlYWRlcihoZWFkZXIpIDogU3RyaW5nKGhlYWRlcikudHJpbSgpO1xuXG4gICAgICBpZiAobm9ybWFsaXplZCAhPT0gaGVhZGVyKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICB9XG5cbiAgICAgIHNlbGZbbm9ybWFsaXplZF0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZF0gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb25jYXQoLi4udGFyZ2V0cykge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLCAuLi50YXJnZXRzKTtcbiAgfVxuXG4gIHRvSlNPTihhc1N0cmluZ3MpIHtcbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgKG9ialtoZWFkZXJdID0gYXNTdHJpbmdzICYmIHV0aWxzLmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbignLCAnKSA6IHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpLm1hcCgoW2hlYWRlciwgdmFsdWVdKSA9PiBoZWFkZXIgKyAnOiAnICsgdmFsdWUpLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQXhpb3NIZWFkZXJzJztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nIGluc3RhbmNlb2YgdGhpcyA/IHRoaW5nIDogbmV3IHRoaXModGhpbmcpO1xuICB9XG5cbiAgc3RhdGljIGNvbmNhdChmaXJzdCwgLi4udGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbXB1dGVkID0gbmV3IHRoaXMoZmlyc3QpO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IGNvbXB1dGVkLnNldCh0YXJnZXQpKTtcblxuICAgIHJldHVybiBjb21wdXRlZDtcbiAgfVxuXG4gIHN0YXRpYyBhY2Nlc3NvcihoZWFkZXIpIHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSB0aGlzWyRpbnRlcm5hbHNdID0gKHRoaXNbJGludGVybmFsc10gPSB7XG4gICAgICBhY2Nlc3NvcnM6IHt9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2Nlc3NvcnMgPSBpbnRlcm5hbHMuYWNjZXNzb3JzO1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuXG4gICAgZnVuY3Rpb24gZGVmaW5lQWNjZXNzb3IoX2hlYWRlcikge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFhY2Nlc3NvcnNbbEhlYWRlcl0pIHtcbiAgICAgICAgYnVpbGRBY2Nlc3NvcnMocHJvdG90eXBlLCBfaGVhZGVyKTtcbiAgICAgICAgYWNjZXNzb3JzW2xIZWFkZXJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1dGlscy5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXIuZm9yRWFjaChkZWZpbmVBY2Nlc3NvcikgOiBkZWZpbmVBY2Nlc3NvcihoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuQXhpb3NIZWFkZXJzLmFjY2Vzc29yKFsnQ29udGVudC1UeXBlJywgJ0NvbnRlbnQtTGVuZ3RoJywgJ0FjY2VwdCcsICdBY2NlcHQtRW5jb2RpbmcnLCAnVXNlci1BZ2VudCcsICdBdXRob3JpemF0aW9uJ10pO1xuXG4vLyByZXNlcnZlZCBuYW1lcyBob3RmaXhcbnV0aWxzLnJlZHVjZURlc2NyaXB0b3JzKEF4aW9zSGVhZGVycy5wcm90b3R5cGUsICh7dmFsdWV9LCBrZXkpID0+IHtcbiAgbGV0IG1hcHBlZCA9IGtleVswXS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpOyAvLyBtYXAgYHNldGAgPT4gYFNldGBcbiAgcmV0dXJuIHtcbiAgICBnZXQ6ICgpID0+IHZhbHVlLFxuICAgIHNldChoZWFkZXJWYWx1ZSkge1xuICAgICAgdGhpc1ttYXBwZWRdID0gaGVhZGVyVmFsdWU7XG4gICAgfVxuICB9XG59KTtcblxudXRpbHMuZnJlZXplTWV0aG9kcyhBeGlvc0hlYWRlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc0hlYWRlcnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuY2xhc3MgSW50ZXJjZXB0b3JNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBpbnRlcmNlcHRvciB0byB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGByZWplY3RgIGZvciBhIGBQcm9taXNlYFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gICAqL1xuICB1c2UoZnVsZmlsbGVkLCByZWplY3RlZCwgb3B0aW9ucykge1xuICAgIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgICBmdWxmaWxsZWQsXG4gICAgICByZWplY3RlZCxcbiAgICAgIHN5bmNocm9ub3VzOiBvcHRpb25zID8gb3B0aW9ucy5zeW5jaHJvbm91cyA6IGZhbHNlLFxuICAgICAgcnVuV2hlbjogb3B0aW9ucyA/IG9wdGlvbnMucnVuV2hlbiA6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gICAqXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGludGVyY2VwdG9yIHdhcyByZW1vdmVkLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgZWplY3QoaWQpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGludGVyY2VwdG9ycyBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gICAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZvckVhY2goZm4pIHtcbiAgICB1dGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcbiAgICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICAgIGZuKGgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVyY2VwdG9yTWFuYWdlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGlzQWJzb2x1dGVVUkwgZnJvbSAnLi4vaGVscGVycy9pc0Fic29sdXRlVVJMLmpzJztcbmltcG9ydCBjb21iaW5lVVJMcyBmcm9tICcuLi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIGJhc2VVUkwgd2l0aCB0aGUgcmVxdWVzdGVkVVJMLFxuICogb25seSB3aGVuIHRoZSByZXF1ZXN0ZWRVUkwgaXMgbm90IGFscmVhZHkgYW4gYWJzb2x1dGUgVVJMLlxuICogSWYgdGhlIHJlcXVlc3RVUkwgaXMgYWJzb2x1dGUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWVzdGVkVVJMIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXF1ZXN0ZWRVUkwgQWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGNvbWJpbmVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgZnVsbCBwYXRoXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkRnVsbFBhdGgoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKSB7XG4gIGlmIChiYXNlVVJMICYmICFpc0Fic29sdXRlVVJMKHJlcXVlc3RlZFVSTCkpIHtcbiAgICByZXR1cm4gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdHJhbnNmb3JtRGF0YSBmcm9tICcuL3RyYW5zZm9ybURhdGEuanMnO1xuaW1wb3J0IGlzQ2FuY2VsIGZyb20gJy4uL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5pbXBvcnQgYWRhcHRlcnMgZnJvbSBcIi4uL2FkYXB0ZXJzL2FkYXB0ZXJzLmpzXCI7XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpIHtcbiAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgIGNvbmZpZy5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCk7XG4gIH1cblxuICBpZiAoY29uZmlnLnNpZ25hbCAmJiBjb25maWcuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWRhcHRlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShjb25maWcuaGVhZGVycyk7XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICBjb25maWcsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICBpZiAoWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLmluZGV4T2YoY29uZmlnLm1ldGhvZCkgIT09IC0xKSB7XG4gICAgY29uZmlnLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyKGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXIpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZVxuICAgICAgICApO1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuL0F4aW9zSGVhZGVycy5qc1wiO1xuXG5jb25zdCBoZWFkZXJzVG9PYmplY3QgPSAodGhpbmcpID0+IHRoaW5nIGluc3RhbmNlb2YgQXhpb3NIZWFkZXJzID8geyAuLi50aGluZyB9IDogdGhpbmc7XG5cbi8qKlxuICogQ29uZmlnLXNwZWNpZmljIG1lcmdlLWZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYSBuZXcgY29uZmlnLW9iamVjdFxuICogYnkgbWVyZ2luZyB0d28gY29uZmlndXJhdGlvbiBvYmplY3RzIHRvZ2V0aGVyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcxXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBvYmplY3QgcmVzdWx0aW5nIGZyb20gbWVyZ2luZyBjb25maWcyIHRvIGNvbmZpZzFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VDb25maWcoY29uZmlnMSwgY29uZmlnMikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgY29uZmlnMiA9IGNvbmZpZzIgfHwge307XG4gIGNvbnN0IGNvbmZpZyA9IHt9O1xuXG4gIGZ1bmN0aW9uIGdldE1lcmdlZFZhbHVlKHRhcmdldCwgc291cmNlLCBjYXNlbGVzcykge1xuICAgIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgdXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2UuY2FsbCh7Y2FzZWxlc3N9LCB0YXJnZXQsIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZSh7fSwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZS5zbGljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGVlcFByb3BlcnRpZXMoYSwgYiwgY2FzZWxlc3MpIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYiwgY2FzZWxlc3MpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhLCBjYXNlbGVzcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBkZWZhdWx0VG9Db25maWcyKGEsIGIpIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChhKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGlyZWN0S2V5cyhhLCBiLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgaW4gY29uZmlnMikge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIpO1xuICAgIH0gZWxzZSBpZiAocHJvcCBpbiBjb25maWcxKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXJnZU1hcCA9IHtcbiAgICB1cmw6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgbWV0aG9kOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGRhdGE6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgYmFzZVVSTDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHBhcmFtc1NlcmlhbGl6ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0TWVzc2FnZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoQ3JlZGVudGlhbHM6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aFhTUkZUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBhZGFwdGVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlVHlwZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmQ29va2llTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmSGVhZGVyTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvblVwbG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBkZWNvbXByZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heENvbnRlbnRMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Qm9keUxlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBiZWZvcmVSZWRpcmVjdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc3BvcnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cEFnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBzQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgY2FuY2VsVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgc29ja2V0UGF0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZUVuY29kaW5nOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHZhbGlkYXRlU3RhdHVzOiBtZXJnZURpcmVjdEtleXMsXG4gICAgaGVhZGVyczogKGEsIGIpID0+IG1lcmdlRGVlcFByb3BlcnRpZXMoaGVhZGVyc1RvT2JqZWN0KGEpLCBoZWFkZXJzVG9PYmplY3QoYiksIHRydWUpXG4gIH07XG5cbiAgdXRpbHMuZm9yRWFjaChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCBjb25maWcxLCBjb25maWcyKSksIGZ1bmN0aW9uIGNvbXB1dGVDb25maWdWYWx1ZShwcm9wKSB7XG4gICAgY29uc3QgbWVyZ2UgPSBtZXJnZU1hcFtwcm9wXSB8fCBtZXJnZURlZXBQcm9wZXJ0aWVzO1xuICAgIGNvbnN0IGNvbmZpZ1ZhbHVlID0gbWVyZ2UoY29uZmlnMVtwcm9wXSwgY29uZmlnMltwcm9wXSwgcHJvcCk7XG4gICAgKHV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZ1ZhbHVlKSAmJiBtZXJnZSAhPT0gbWVyZ2VEaXJlY3RLZXlzKSB8fCAoY29uZmlnW3Byb3BdID0gY29uZmlnVmFsdWUpO1xuICB9KTtcblxuICByZXR1cm4gY29uZmlnO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuL0F4aW9zRXJyb3IuanMnO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpIHtcbiAgY29uc3QgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghcmVzcG9uc2Uuc3RhdHVzIHx8ICF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIFtBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFXVtNYXRoLmZsb29yKHJlc3BvbnNlLnN0YXR1cyAvIDEwMCkgLSA0XSxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIHJlc3BvbnNlLnJlcXVlc3QsXG4gICAgICByZXNwb25zZVxuICAgICkpO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHBhcmFtIHs/T2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0XG4gKlxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGZucywgcmVzcG9uc2UpIHtcbiAgY29uc3QgY29uZmlnID0gdGhpcyB8fCBkZWZhdWx0cztcbiAgY29uc3QgY29udGV4dCA9IHJlc3BvbnNlIHx8IGNvbmZpZztcbiAgY29uc3QgaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbnRleHQuaGVhZGVycyk7XG4gIGxldCBkYXRhID0gY29udGV4dC5kYXRhO1xuXG4gIHV0aWxzLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4uY2FsbChjb25maWcsIGRhdGEsIGhlYWRlcnMubm9ybWFsaXplKCksIHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaGVhZGVycy5ub3JtYWxpemUoKTtcblxuICByZXR1cm4gZGF0YTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgdHJhbnNpdGlvbmFsRGVmYXVsdHMgZnJvbSAnLi90cmFuc2l0aW9uYWwuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi4vaGVscGVycy90b0Zvcm1EYXRhLmpzJztcbmltcG9ydCB0b1VSTEVuY29kZWRGb3JtIGZyb20gJy4uL2hlbHBlcnMvdG9VUkxFbmNvZGVkRm9ybS5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuaW1wb3J0IGZvcm1EYXRhVG9KU09OIGZyb20gJy4uL2hlbHBlcnMvZm9ybURhdGFUb0pTT04uanMnO1xuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nLCB0cmllcyB0byBwYXJzZSBpdCwgYW5kIGlmIGl0IGZhaWxzLCBpdCByZXR1cm5zIHRoZSBzdHJpbmdpZmllZCB2ZXJzaW9uXG4gKiBvZiB0aGUgaW5wdXRcbiAqXG4gKiBAcGFyYW0ge2FueX0gcmF3VmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgc3RyaW5naWZpZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJzZXIgLSBBIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGEgc3RyaW5nIGludG8gYSBKYXZhU2NyaXB0IG9iamVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVuY29kZXIgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB2YWx1ZSBhbmQgcmV0dXJucyBhIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHN0cmluZ2lmaWVkIHZlcnNpb24gb2YgdGhlIHJhd1ZhbHVlLlxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlTYWZlbHkocmF3VmFsdWUsIHBhcnNlciwgZW5jb2Rlcikge1xuICBpZiAodXRpbHMuaXNTdHJpbmcocmF3VmFsdWUpKSB7XG4gICAgdHJ5IHtcbiAgICAgIChwYXJzZXIgfHwgSlNPTi5wYXJzZSkocmF3VmFsdWUpO1xuICAgICAgcmV0dXJuIHV0aWxzLnRyaW0ocmF3VmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLm5hbWUgIT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGVuY29kZXIgfHwgSlNPTi5zdHJpbmdpZnkpKHJhd1ZhbHVlKTtcbn1cblxuY29uc3QgZGVmYXVsdHMgPSB7XG5cbiAgdHJhbnNpdGlvbmFsOiB0cmFuc2l0aW9uYWxEZWZhdWx0cyxcblxuICBhZGFwdGVyOiBbJ3hocicsICdodHRwJywgJ2ZldGNoJ10sXG5cbiAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlcXVlc3QoZGF0YSwgaGVhZGVycykge1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpIHx8ICcnO1xuICAgIGNvbnN0IGhhc0pTT05Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSA+IC0xO1xuICAgIGNvbnN0IGlzT2JqZWN0UGF5bG9hZCA9IHV0aWxzLmlzT2JqZWN0KGRhdGEpO1xuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCAmJiB1dGlscy5pc0hUTUxGb3JtKGRhdGEpKSB7XG4gICAgICBkYXRhID0gbmV3IEZvcm1EYXRhKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRm9ybURhdGEgPSB1dGlscy5pc0Zvcm1EYXRhKGRhdGEpO1xuXG4gICAgaWYgKGlzRm9ybURhdGEpIHtcbiAgICAgIHJldHVybiBoYXNKU09OQ29udGVudFR5cGUgPyBKU09OLnN0cmluZ2lmeShmb3JtRGF0YVRvSlNPTihkYXRhKSkgOiBkYXRhO1xuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0J1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNTdHJlYW0oZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzRmlsZShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCbG9iKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhkYXRhKSkge1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnLCBmYWxzZSk7XG4gICAgICByZXR1cm4gZGF0YS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGxldCBpc0ZpbGVMaXN0O1xuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCkge1xuICAgICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRvVVJMRW5jb2RlZEZvcm0oZGF0YSwgdGhpcy5mb3JtU2VyaWFsaXplcikudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChpc0ZpbGVMaXN0ID0gdXRpbHMuaXNGaWxlTGlzdChkYXRhKSkgfHwgY29udGVudFR5cGUuaW5kZXhPZignbXVsdGlwYXJ0L2Zvcm0tZGF0YScpID4gLTEpIHtcbiAgICAgICAgY29uc3QgX0Zvcm1EYXRhID0gdGhpcy5lbnYgJiYgdGhpcy5lbnYuRm9ybURhdGE7XG5cbiAgICAgICAgcmV0dXJuIHRvRm9ybURhdGEoXG4gICAgICAgICAgaXNGaWxlTGlzdCA/IHsnZmlsZXNbXSc6IGRhdGF9IDogZGF0YSxcbiAgICAgICAgICBfRm9ybURhdGEgJiYgbmV3IF9Gb3JtRGF0YSgpLFxuICAgICAgICAgIHRoaXMuZm9ybVNlcmlhbGl6ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkIHx8IGhhc0pTT05Db250ZW50VHlwZSApIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nLCBmYWxzZSk7XG4gICAgICByZXR1cm4gc3RyaW5naWZ5U2FmZWx5KGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKGRhdGEpIHtcbiAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSB0aGlzLnRyYW5zaXRpb25hbCB8fCBkZWZhdWx0cy50cmFuc2l0aW9uYWw7XG4gICAgY29uc3QgZm9yY2VkSlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLmZvcmNlZEpTT05QYXJzaW5nO1xuICAgIGNvbnN0IEpTT05SZXF1ZXN0ZWQgPSB0aGlzLnJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nO1xuXG4gICAgaWYgKHV0aWxzLmlzUmVzcG9uc2UoZGF0YSkgfHwgdXRpbHMuaXNSZWFkYWJsZVN0cmVhbShkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgdXRpbHMuaXNTdHJpbmcoZGF0YSkgJiYgKChmb3JjZWRKU09OUGFyc2luZyAmJiAhdGhpcy5yZXNwb25zZVR5cGUpIHx8IEpTT05SZXF1ZXN0ZWQpKSB7XG4gICAgICBjb25zdCBzaWxlbnRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuc2lsZW50SlNPTlBhcnNpbmc7XG4gICAgICBjb25zdCBzdHJpY3RKU09OUGFyc2luZyA9ICFzaWxlbnRKU09OUGFyc2luZyAmJiBKU09OUmVxdWVzdGVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHN0cmljdEpTT05QYXJzaW5nKSB7XG4gICAgICAgICAgaWYgKGUubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGUsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRSwgdGhpcywgbnVsbCwgdGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgLyoqXG4gICAqIEEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYWJvcnQgYSByZXF1ZXN0LiBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYVxuICAgKiB0aW1lb3V0IGlzIG5vdCBjcmVhdGVkLlxuICAgKi9cbiAgdGltZW91dDogMCxcblxuICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTicsXG5cbiAgbWF4Q29udGVudExlbmd0aDogLTEsXG4gIG1heEJvZHlMZW5ndGg6IC0xLFxuXG4gIGVudjoge1xuICAgIEZvcm1EYXRhOiBwbGF0Zm9ybS5jbGFzc2VzLkZvcm1EYXRhLFxuICAgIEJsb2I6IHBsYXRmb3JtLmNsYXNzZXMuQmxvYlxuICB9LFxuXG4gIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gIH0sXG5cbiAgaGVhZGVyczoge1xuICAgIGNvbW1vbjoge1xuICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxufTtcblxudXRpbHMuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCddLCAobWV0aG9kKSA9PiB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNpbGVudEpTT05QYXJzaW5nOiB0cnVlLFxuICBmb3JjZWRKU09OUGFyc2luZzogdHJ1ZSxcbiAgY2xhcmlmeVRpbWVvdXRFcnJvcjogZmFsc2Vcbn07XG4iLCJleHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiMS43LjJcIjsiLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vdG9Gb3JtRGF0YS5qcyc7XG5cbi8qKlxuICogSXQgZW5jb2RlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGluIHRoZSB1bnJlc2VydmVkIHNldCB3aXRoXG4gKiB0aGVpciBwZXJjZW50LWVuY29kZWQgZXF1aXZhbGVudHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlbmNvZGUoc3RyKSB7XG4gIGNvbnN0IGNoYXJNYXAgPSB7XG4gICAgJyEnOiAnJTIxJyxcbiAgICBcIidcIjogJyUyNycsXG4gICAgJygnOiAnJTI4JyxcbiAgICAnKSc6ICclMjknLFxuICAgICd+JzogJyU3RScsXG4gICAgJyUyMCc6ICcrJyxcbiAgICAnJTAwJzogJ1xceDAwJ1xuICB9O1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvWyEnKCl+XXwlMjB8JTAwL2csIGZ1bmN0aW9uIHJlcGxhY2VyKG1hdGNoKSB7XG4gICAgcmV0dXJuIGNoYXJNYXBbbWF0Y2hdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhcmFtcyBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IHRvIGEgRm9ybURhdGEgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBGb3JtRGF0YSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBBeGlvcyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKSB7XG4gIHRoaXMuX3BhaXJzID0gW107XG5cbiAgcGFyYW1zICYmIHRvRm9ybURhdGEocGFyYW1zLCB0aGlzLCBvcHRpb25zKTtcbn1cblxuY29uc3QgcHJvdG90eXBlID0gQXhpb3NVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlO1xuXG5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMuX3BhaXJzLnB1c2goW25hbWUsIHZhbHVlXSk7XG59O1xuXG5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhlbmNvZGVyKSB7XG4gIGNvbnN0IF9lbmNvZGUgPSBlbmNvZGVyID8gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2Rlci5jYWxsKHRoaXMsIHZhbHVlLCBlbmNvZGUpO1xuICB9IDogZW5jb2RlO1xuXG4gIHJldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24gZWFjaChwYWlyKSB7XG4gICAgcmV0dXJuIF9lbmNvZGUocGFpclswXSkgKyAnPScgKyBfZW5jb2RlKHBhaXJbMV0pO1xuICB9LCAnJykuam9pbignJicpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG4iLCJjb25zdCBIdHRwU3RhdHVzQ29kZSA9IHtcbiAgQ29udGludWU6IDEwMCxcbiAgU3dpdGNoaW5nUHJvdG9jb2xzOiAxMDEsXG4gIFByb2Nlc3Npbmc6IDEwMixcbiAgRWFybHlIaW50czogMTAzLFxuICBPazogMjAwLFxuICBDcmVhdGVkOiAyMDEsXG4gIEFjY2VwdGVkOiAyMDIsXG4gIE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjogMjAzLFxuICBOb0NvbnRlbnQ6IDIwNCxcbiAgUmVzZXRDb250ZW50OiAyMDUsXG4gIFBhcnRpYWxDb250ZW50OiAyMDYsXG4gIE11bHRpU3RhdHVzOiAyMDcsXG4gIEFscmVhZHlSZXBvcnRlZDogMjA4LFxuICBJbVVzZWQ6IDIyNixcbiAgTXVsdGlwbGVDaG9pY2VzOiAzMDAsXG4gIE1vdmVkUGVybWFuZW50bHk6IDMwMSxcbiAgRm91bmQ6IDMwMixcbiAgU2VlT3RoZXI6IDMwMyxcbiAgTm90TW9kaWZpZWQ6IDMwNCxcbiAgVXNlUHJveHk6IDMwNSxcbiAgVW51c2VkOiAzMDYsXG4gIFRlbXBvcmFyeVJlZGlyZWN0OiAzMDcsXG4gIFBlcm1hbmVudFJlZGlyZWN0OiAzMDgsXG4gIEJhZFJlcXVlc3Q6IDQwMCxcbiAgVW5hdXRob3JpemVkOiA0MDEsXG4gIFBheW1lbnRSZXF1aXJlZDogNDAyLFxuICBGb3JiaWRkZW46IDQwMyxcbiAgTm90Rm91bmQ6IDQwNCxcbiAgTWV0aG9kTm90QWxsb3dlZDogNDA1LFxuICBOb3RBY2NlcHRhYmxlOiA0MDYsXG4gIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDogNDA3LFxuICBSZXF1ZXN0VGltZW91dDogNDA4LFxuICBDb25mbGljdDogNDA5LFxuICBHb25lOiA0MTAsXG4gIExlbmd0aFJlcXVpcmVkOiA0MTEsXG4gIFByZWNvbmRpdGlvbkZhaWxlZDogNDEyLFxuICBQYXlsb2FkVG9vTGFyZ2U6IDQxMyxcbiAgVXJpVG9vTG9uZzogNDE0LFxuICBVbnN1cHBvcnRlZE1lZGlhVHlwZTogNDE1LFxuICBSYW5nZU5vdFNhdGlzZmlhYmxlOiA0MTYsXG4gIEV4cGVjdGF0aW9uRmFpbGVkOiA0MTcsXG4gIEltQVRlYXBvdDogNDE4LFxuICBNaXNkaXJlY3RlZFJlcXVlc3Q6IDQyMSxcbiAgVW5wcm9jZXNzYWJsZUVudGl0eTogNDIyLFxuICBMb2NrZWQ6IDQyMyxcbiAgRmFpbGVkRGVwZW5kZW5jeTogNDI0LFxuICBUb29FYXJseTogNDI1LFxuICBVcGdyYWRlUmVxdWlyZWQ6IDQyNixcbiAgUHJlY29uZGl0aW9uUmVxdWlyZWQ6IDQyOCxcbiAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTogNDMxLFxuICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczogNDUxLFxuICBJbnRlcm5hbFNlcnZlckVycm9yOiA1MDAsXG4gIE5vdEltcGxlbWVudGVkOiA1MDEsXG4gIEJhZEdhdGV3YXk6IDUwMixcbiAgU2VydmljZVVuYXZhaWxhYmxlOiA1MDMsXG4gIEdhdGV3YXlUaW1lb3V0OiA1MDQsXG4gIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOiA1MDUsXG4gIFZhcmlhbnRBbHNvTmVnb3RpYXRlczogNTA2LFxuICBJbnN1ZmZpY2llbnRTdG9yYWdlOiA1MDcsXG4gIExvb3BEZXRlY3RlZDogNTA4LFxuICBOb3RFeHRlbmRlZDogNTEwLFxuICBOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDogNTExLFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgSHR0cFN0YXR1c0NvZGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NVUkxTZWFyY2hQYXJhbXMgZnJvbSAnLi4vaGVscGVycy9BeGlvc1VSTFNlYXJjaFBhcmFtcy5qcyc7XG5cbi8qKlxuICogSXQgcmVwbGFjZXMgYWxsIGluc3RhbmNlcyBvZiB0aGUgY2hhcmFjdGVycyBgOmAsIGAkYCwgYCxgLCBgK2AsIGBbYCwgYW5kIGBdYCB3aXRoIHRoZWlyXG4gKiBVUkkgZW5jb2RlZCBjb3VudGVycGFydHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIFRoZSB2YWx1ZSB0byBiZSBlbmNvZGVkLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlbmNvZGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHBhcmFtIHs/b2JqZWN0fSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBcbiAgY29uc3QgX2VuY29kZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGUgfHwgZW5jb2RlO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZUZuID0gb3B0aW9ucyAmJiBvcHRpb25zLnNlcmlhbGl6ZTtcblxuICBsZXQgc2VyaWFsaXplZFBhcmFtcztcblxuICBpZiAoc2VyaWFsaXplRm4pIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gc2VyaWFsaXplRm4ocGFyYW1zLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gdXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSA/XG4gICAgICBwYXJhbXMudG9TdHJpbmcoKSA6XG4gICAgICBuZXcgQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKS50b1N0cmluZyhfZW5jb2RlKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgY29uc3QgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKFwiI1wiKTtcblxuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIFVSTFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvP1xcLyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn1cbiIsImltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gXCIuLi9jYW5jZWwvQ2FuY2VsZWRFcnJvci5qc1wiO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuXG5jb25zdCBjb21wb3NlU2lnbmFscyA9IChzaWduYWxzLCB0aW1lb3V0KSA9PiB7XG4gIGxldCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGxldCBhYm9ydGVkO1xuXG4gIGNvbnN0IG9uYWJvcnQgPSBmdW5jdGlvbiAoY2FuY2VsKSB7XG4gICAgaWYgKCFhYm9ydGVkKSB7XG4gICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICBjb25zdCBlcnIgPSBjYW5jZWwgaW5zdGFuY2VvZiBFcnJvciA/IGNhbmNlbCA6IHRoaXMucmVhc29uO1xuICAgICAgY29udHJvbGxlci5hYm9ydChlcnIgaW5zdGFuY2VvZiBBeGlvc0Vycm9yID8gZXJyIDogbmV3IENhbmNlbGVkRXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycikpO1xuICAgIH1cbiAgfVxuXG4gIGxldCB0aW1lciA9IHRpbWVvdXQgJiYgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgb25hYm9ydChuZXcgQXhpb3NFcnJvcihgdGltZW91dCAke3RpbWVvdXR9IG9mIG1zIGV4Y2VlZGVkYCwgQXhpb3NFcnJvci5FVElNRURPVVQpKVxuICB9LCB0aW1lb3V0KVxuXG4gIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgIGlmIChzaWduYWxzKSB7XG4gICAgICB0aW1lciAmJiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgc2lnbmFscy5mb3JFYWNoKHNpZ25hbCA9PiB7XG4gICAgICAgIHNpZ25hbCAmJlxuICAgICAgICAoc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIgPyBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbmFib3J0KSA6IHNpZ25hbC51bnN1YnNjcmliZShvbmFib3J0KSk7XG4gICAgICB9KTtcbiAgICAgIHNpZ25hbHMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHNpZ25hbHMuZm9yRWFjaCgoc2lnbmFsKSA9PiBzaWduYWwgJiYgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCkpO1xuXG4gIGNvbnN0IHtzaWduYWx9ID0gY29udHJvbGxlcjtcblxuICBzaWduYWwudW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTtcblxuICByZXR1cm4gW3NpZ25hbCwgKCkgPT4ge1xuICAgIHRpbWVyICYmIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgdGltZXIgPSBudWxsO1xuICB9XTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29tcG9zZVNpZ25hbHM7XG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxuICB7XG4gICAgd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgICBjb25zdCBjb29raWUgPSBbbmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSldO1xuXG4gICAgICB1dGlscy5pc051bWJlcihleHBpcmVzKSAmJiBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG5cbiAgICAgIHV0aWxzLmlzU3RyaW5nKHBhdGgpICYmIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcblxuICAgICAgdXRpbHMuaXNTdHJpbmcoZG9tYWluKSAmJiBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuXG4gICAgICBzZWN1cmUgPT09IHRydWUgJiYgY29va2llLnB1c2goJ3NlY3VyZScpO1xuXG4gICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICB9LFxuXG4gICAgcmVhZChuYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgIH0sXG5cbiAgICByZW1vdmUobmFtZSkge1xuICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICB9XG4gIH1cblxuICA6XG5cbiAgLy8gTm9uLXN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICB7XG4gICAgd3JpdGUoKSB7fSxcbiAgICByZWFkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW1vdmUoKSB7fVxuICB9O1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcgbGlrZSBgZm9vW3hdW3ldW3pdYCBhbmQgcmV0dXJucyBhbiBhcnJheSBsaWtlIGBbJ2ZvbycsICd4JywgJ3knLCAneiddXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICpcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUHJvcFBhdGgobmFtZSkge1xuICAvLyBmb29beF1beV1bel1cbiAgLy8gZm9vLngueS56XG4gIC8vIGZvby14LXktelxuICAvLyBmb28geCB5IHpcbiAgcmV0dXJuIHV0aWxzLm1hdGNoQWxsKC9cXHcrfFxcWyhcXHcqKV0vZywgbmFtZSkubWFwKG1hdGNoID0+IHtcbiAgICByZXR1cm4gbWF0Y2hbMF0gPT09ICdbXScgPyAnJyA6IG1hdGNoWzFdIHx8IG1hdGNoWzBdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFycmF5IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjb252ZXJ0IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgYXMgdGhlIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheVRvT2JqZWN0KGFycikge1xuICBjb25zdCBvYmogPSB7fTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycik7XG4gIGxldCBpO1xuICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgbGV0IGtleTtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICBvYmpba2V5XSA9IGFycltrZXldO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBGb3JtRGF0YSBvYmplY3QgYW5kIHJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGNvbnZlcnQgdG8gSlNPTi5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0PHN0cmluZywgYW55PiB8IG51bGx9IFRoZSBjb252ZXJ0ZWQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBmb3JtRGF0YVRvSlNPTihmb3JtRGF0YSkge1xuICBmdW5jdGlvbiBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldCwgaW5kZXgpIHtcbiAgICBsZXQgbmFtZSA9IHBhdGhbaW5kZXgrK107XG5cbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgaXNOdW1lcmljS2V5ID0gTnVtYmVyLmlzRmluaXRlKCtuYW1lKTtcbiAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA+PSBwYXRoLmxlbmd0aDtcbiAgICBuYW1lID0gIW5hbWUgJiYgdXRpbHMuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0Lmxlbmd0aCA6IG5hbWU7XG5cbiAgICBpZiAoaXNMYXN0KSB7XG4gICAgICBpZiAodXRpbHMuaGFzT3duUHJvcCh0YXJnZXQsIG5hbWUpKSB7XG4gICAgICAgIHRhcmdldFtuYW1lXSA9IFt0YXJnZXRbbmFtZV0sIHZhbHVlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFtuYW1lXSB8fCAhdXRpbHMuaXNPYmplY3QodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXRbbmFtZV0sIGluZGV4KTtcblxuICAgIGlmIChyZXN1bHQgJiYgdXRpbHMuaXNBcnJheSh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBhcnJheVRvT2JqZWN0KHRhcmdldFtuYW1lXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gIH1cblxuICBpZiAodXRpbHMuaXNGb3JtRGF0YShmb3JtRGF0YSkgJiYgdXRpbHMuaXNGdW5jdGlvbihmb3JtRGF0YS5lbnRyaWVzKSkge1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuXG4gICAgdXRpbHMuZm9yRWFjaEVudHJ5KGZvcm1EYXRhLCAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgIGJ1aWxkUGF0aChwYXJzZVByb3BQYXRoKG5hbWUpLCB2YWx1ZSwgb2JqLCAwKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZm9ybURhdGFUb0pTT047XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggXCI8c2NoZW1lPjovL1wiIG9yIFwiLy9cIiAocHJvdG9jb2wtcmVsYXRpdmUgVVJMKS5cbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXG4gIC8vIGJ5IGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBkaWdpdHMsIHBsdXMsIHBlcmlvZCwgb3IgaHlwaGVuLlxuICByZXR1cm4gL14oW2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pLnRlc3QodXJsKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3NcbiAqXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3MsIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0F4aW9zRXJyb3IocGF5bG9hZCkge1xuICByZXR1cm4gdXRpbHMuaXNPYmplY3QocGF5bG9hZCkgJiYgKHBheWxvYWQuaXNBeGlvc0Vycm9yID09PSB0cnVlKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52ID9cblxuLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIGhhdmUgZnVsbCBzdXBwb3J0IG9mIHRoZSBBUElzIG5lZWRlZCB0byB0ZXN0XG4vLyB3aGV0aGVyIHRoZSByZXF1ZXN0IFVSTCBpcyBvZiB0aGUgc2FtZSBvcmlnaW4gYXMgY3VycmVudCBsb2NhdGlvbi5cbiAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICBjb25zdCBtc2llID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICBjb25zdCB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsZXQgb3JpZ2luVVJMO1xuXG4gICAgLyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdHMgY29tcG9uZW50c1xuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSBwYXJzZWRcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgKi9cbiAgICBmdW5jdGlvbiByZXNvbHZlVVJMKHVybCkge1xuICAgICAgbGV0IGhyZWYgPSB1cmw7XG5cbiAgICAgIGlmIChtc2llKSB7XG4gICAgICAgIC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcbiAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG4gICAgICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmO1xuICAgICAgfVxuXG4gICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuICAgICAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlsc1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcbiAgICAgICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdDogdXJsUGFyc2luZ05vZGUuaG9zdCxcbiAgICAgICAgc2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuICAgICAgICBoYXNoOiB1cmxQYXJzaW5nTm9kZS5oYXNoID8gdXJsUGFyc2luZ05vZGUuaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLFxuICAgICAgICBob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG4gICAgICAgIHBhdGhuYW1lOiAodXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpID9cbiAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgb3JpZ2luVVJMID0gcmVzb2x2ZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbiAgICAvKipcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVUkwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9ICh1dGlscy5pc1N0cmluZyhyZXF1ZXN0VVJMKSkgPyByZXNvbHZlVVJMKHJlcXVlc3RVUkwpIDogcmVxdWVzdFVSTDtcbiAgICAgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiZcbiAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVVJMLmhvc3QpO1xuICAgIH07XG4gIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudnMgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH0pKCk7XG4iLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3RyaWN0XG5leHBvcnQgZGVmYXVsdCBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbi8vIFJhd0F4aW9zSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbmNvbnN0IGlnbm9yZUR1cGxpY2F0ZU9mID0gdXRpbHMudG9PYmplY3RTZXQoW1xuICAnYWdlJywgJ2F1dGhvcml6YXRpb24nLCAnY29udGVudC1sZW5ndGgnLCAnY29udGVudC10eXBlJywgJ2V0YWcnLFxuICAnZXhwaXJlcycsICdmcm9tJywgJ2hvc3QnLCAnaWYtbW9kaWZpZWQtc2luY2UnLCAnaWYtdW5tb2RpZmllZC1zaW5jZScsXG4gICdsYXN0LW1vZGlmaWVkJywgJ2xvY2F0aW9uJywgJ21heC1mb3J3YXJkcycsICdwcm94eS1hdXRob3JpemF0aW9uJyxcbiAgJ3JlZmVyZXInLCAncmV0cnktYWZ0ZXInLCAndXNlci1hZ2VudCdcbl0pO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcmF3SGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKlxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xuZXhwb3J0IGRlZmF1bHQgcmF3SGVhZGVycyA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHt9O1xuICBsZXQga2V5O1xuICBsZXQgdmFsO1xuICBsZXQgaTtcblxuICByYXdIZWFkZXJzICYmIHJhd0hlYWRlcnMuc3BsaXQoJ1xcbicpLmZvckVhY2goZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gbGluZS5zdWJzdHJpbmcoMCwgaSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gbGluZS5zdWJzdHJpbmcoaSArIDEpLnRyaW0oKTtcblxuICAgIGlmICgha2V5IHx8IChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZltrZXldKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgaWYgKHBhcnNlZFtrZXldKSB7XG4gICAgICAgIHBhcnNlZFtrZXldLnB1c2godmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gW3ZhbF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VQcm90b2NvbCh1cmwpIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbLStcXHddezEsMjV9KSg6P1xcL1xcL3w6KS8uZXhlYyh1cmwpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG59XG4iLCJpbXBvcnQgc3BlZWRvbWV0ZXIgZnJvbSBcIi4vc3BlZWRvbWV0ZXIuanNcIjtcbmltcG9ydCB0aHJvdHRsZSBmcm9tIFwiLi90aHJvdHRsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAobGlzdGVuZXIsIGlzRG93bmxvYWRTdHJlYW0sIGZyZXEgPSAzKSA9PiB7XG4gIGxldCBieXRlc05vdGlmaWVkID0gMDtcbiAgY29uc3QgX3NwZWVkb21ldGVyID0gc3BlZWRvbWV0ZXIoNTAsIDI1MCk7XG5cbiAgcmV0dXJuIHRocm90dGxlKGUgPT4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGUubG9hZGVkO1xuICAgIGNvbnN0IHRvdGFsID0gZS5sZW5ndGhDb21wdXRhYmxlID8gZS50b3RhbCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9ncmVzc0J5dGVzID0gbG9hZGVkIC0gYnl0ZXNOb3RpZmllZDtcbiAgICBjb25zdCByYXRlID0gX3NwZWVkb21ldGVyKHByb2dyZXNzQnl0ZXMpO1xuICAgIGNvbnN0IGluUmFuZ2UgPSBsb2FkZWQgPD0gdG90YWw7XG5cbiAgICBieXRlc05vdGlmaWVkID0gbG9hZGVkO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGxvYWRlZCxcbiAgICAgIHRvdGFsLFxuICAgICAgcHJvZ3Jlc3M6IHRvdGFsID8gKGxvYWRlZCAvIHRvdGFsKSA6IHVuZGVmaW5lZCxcbiAgICAgIGJ5dGVzOiBwcm9ncmVzc0J5dGVzLFxuICAgICAgcmF0ZTogcmF0ZSA/IHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBlc3RpbWF0ZWQ6IHJhdGUgJiYgdG90YWwgJiYgaW5SYW5nZSA/ICh0b3RhbCAtIGxvYWRlZCkgLyByYXRlIDogdW5kZWZpbmVkLFxuICAgICAgZXZlbnQ6IGUsXG4gICAgICBsZW5ndGhDb21wdXRhYmxlOiB0b3RhbCAhPSBudWxsXG4gICAgfTtcblxuICAgIGRhdGFbaXNEb3dubG9hZFN0cmVhbSA/ICdkb3dubG9hZCcgOiAndXBsb2FkJ10gPSB0cnVlO1xuXG4gICAgbGlzdGVuZXIoZGF0YSk7XG4gIH0sIGZyZXEpO1xufVxuIiwiaW1wb3J0IHBsYXRmb3JtIGZyb20gXCIuLi9wbGF0Zm9ybS9pbmRleC5qc1wiO1xuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IGlzVVJMU2FtZU9yaWdpbiBmcm9tIFwiLi9pc1VSTFNhbWVPcmlnaW4uanNcIjtcbmltcG9ydCBjb29raWVzIGZyb20gXCIuL2Nvb2tpZXMuanNcIjtcbmltcG9ydCBidWlsZEZ1bGxQYXRoIGZyb20gXCIuLi9jb3JlL2J1aWxkRnVsbFBhdGguanNcIjtcbmltcG9ydCBtZXJnZUNvbmZpZyBmcm9tIFwiLi4vY29yZS9tZXJnZUNvbmZpZy5qc1wiO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi4vY29yZS9BeGlvc0hlYWRlcnMuanNcIjtcbmltcG9ydCBidWlsZFVSTCBmcm9tIFwiLi9idWlsZFVSTC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoY29uZmlnKSA9PiB7XG4gIGNvbnN0IG5ld0NvbmZpZyA9IG1lcmdlQ29uZmlnKHt9LCBjb25maWcpO1xuXG4gIGxldCB7ZGF0YSwgd2l0aFhTUkZUb2tlbiwgeHNyZkhlYWRlck5hbWUsIHhzcmZDb29raWVOYW1lLCBoZWFkZXJzLCBhdXRofSA9IG5ld0NvbmZpZztcblxuICBuZXdDb25maWcuaGVhZGVycyA9IGhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShoZWFkZXJzKTtcblxuICBuZXdDb25maWcudXJsID0gYnVpbGRVUkwoYnVpbGRGdWxsUGF0aChuZXdDb25maWcuYmFzZVVSTCwgbmV3Q29uZmlnLnVybCksIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcblxuICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gIGlmIChhdXRoKSB7XG4gICAgaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArXG4gICAgICBidG9hKChhdXRoLnVzZXJuYW1lIHx8ICcnKSArICc6JyArIChhdXRoLnBhc3N3b3JkID8gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgucGFzc3dvcmQpKSA6ICcnKSlcbiAgICApO1xuICB9XG5cbiAgbGV0IGNvbnRlbnRUeXBlO1xuXG4gIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpKSB7XG4gICAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiB8fCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUodW5kZWZpbmVkKTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH0gZWxzZSBpZiAoKGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpKSAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIGZpeCBzZW1pY29sb24gZHVwbGljYXRpb24gaXNzdWUgZm9yIFJlYWN0TmF0aXZlIEZvcm1EYXRhIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBbdHlwZSwgLi4udG9rZW5zXSA9IGNvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKS5tYXAodG9rZW4gPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoW3R5cGUgfHwgJ211bHRpcGFydC9mb3JtLWRhdGEnLCAuLi50b2tlbnNdLmpvaW4oJzsgJykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB4c3JmIGhlYWRlclxuICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cblxuICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52KSB7XG4gICAgd2l0aFhTUkZUb2tlbiAmJiB1dGlscy5pc0Z1bmN0aW9uKHdpdGhYU1JGVG9rZW4pICYmICh3aXRoWFNSRlRva2VuID0gd2l0aFhTUkZUb2tlbihuZXdDb25maWcpKTtcblxuICAgIGlmICh3aXRoWFNSRlRva2VuIHx8ICh3aXRoWFNSRlRva2VuICE9PSBmYWxzZSAmJiBpc1VSTFNhbWVPcmlnaW4obmV3Q29uZmlnLnVybCkpKSB7XG4gICAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAgIGNvbnN0IHhzcmZWYWx1ZSA9IHhzcmZIZWFkZXJOYW1lICYmIHhzcmZDb29raWVOYW1lICYmIGNvb2tpZXMucmVhZCh4c3JmQ29va2llTmFtZSk7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgaGVhZGVycy5zZXQoeHNyZkhlYWRlck5hbWUsIHhzcmZWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0NvbmZpZztcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENhbGN1bGF0ZSBkYXRhIG1heFJhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2FtcGxlc0NvdW50PSAxMF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbbWluPSAxMDAwXVxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBzcGVlZG9tZXRlcihzYW1wbGVzQ291bnQsIG1pbikge1xuICBzYW1wbGVzQ291bnQgPSBzYW1wbGVzQ291bnQgfHwgMTA7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGNvbnN0IHRpbWVzdGFtcHMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgbGV0IGhlYWQgPSAwO1xuICBsZXQgdGFpbCA9IDA7XG4gIGxldCBmaXJzdFNhbXBsZVRTO1xuXG4gIG1pbiA9IG1pbiAhPT0gdW5kZWZpbmVkID8gbWluIDogMTAwMDtcblxuICByZXR1cm4gZnVuY3Rpb24gcHVzaChjaHVua0xlbmd0aCkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICBjb25zdCBzdGFydGVkQXQgPSB0aW1lc3RhbXBzW3RhaWxdO1xuXG4gICAgaWYgKCFmaXJzdFNhbXBsZVRTKSB7XG4gICAgICBmaXJzdFNhbXBsZVRTID0gbm93O1xuICAgIH1cblxuICAgIGJ5dGVzW2hlYWRdID0gY2h1bmtMZW5ndGg7XG4gICAgdGltZXN0YW1wc1toZWFkXSA9IG5vdztcblxuICAgIGxldCBpID0gdGFpbDtcbiAgICBsZXQgYnl0ZXNDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAoaSAhPT0gaGVhZCkge1xuICAgICAgYnl0ZXNDb3VudCArPSBieXRlc1tpKytdO1xuICAgICAgaSA9IGkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaGVhZCA9IChoZWFkICsgMSkgJSBzYW1wbGVzQ291bnQ7XG5cbiAgICBpZiAoaGVhZCA9PT0gdGFpbCkge1xuICAgICAgdGFpbCA9ICh0YWlsICsgMSkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaWYgKG5vdyAtIGZpcnN0U2FtcGxlVFMgPCBtaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXNzZWQgPSBzdGFydGVkQXQgJiYgbm93IC0gc3RhcnRlZEF0O1xuXG4gICAgcmV0dXJuIHBhc3NlZCA/IE1hdGgucm91bmQoYnl0ZXNDb3VudCAqIDEwMDAgLyBwYXNzZWQpIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBzcGVlZG9tZXRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIHZhciBhcmdzID0gWzEsIDIsIDNdO1xuICogIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gKiAgYGBgXG4gKlxuICogV2l0aCBgc3ByZWFkYCB0aGlzIGV4YW1wbGUgY2FuIGJlIHJlLXdyaXR0ZW4uXG4gKlxuICogIGBgYGpzXG4gKiAgc3ByZWFkKGZ1bmN0aW9uKHgsIHksIHopIHt9KShbMSwgMiwgM10pO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVGhyb3R0bGUgZGVjb3JhdG9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtOdW1iZXJ9IGZyZXFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmbiwgZnJlcSkge1xuICBsZXQgdGltZXN0YW1wID0gMDtcbiAgY29uc3QgdGhyZXNob2xkID0gMTAwMCAvIGZyZXE7XG4gIGxldCB0aW1lciA9IG51bGw7XG4gIHJldHVybiBmdW5jdGlvbiB0aHJvdHRsZWQoKSB7XG4gICAgY29uc3QgZm9yY2UgPSB0aGlzID09PSB0cnVlO1xuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAoZm9yY2UgfHwgbm93IC0gdGltZXN0YW1wID4gdGhyZXNob2xkKSB7XG4gICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGltZXN0YW1wID0gbm93O1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIGlmICghdGltZXIpIHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICB9LCB0aHJlc2hvbGQgLSAobm93IC0gdGltZXN0YW1wKSk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB0aHJvdHRsZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG4vLyB0ZW1wb3JhcnkgaG90Zml4IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMgdW50aWwgQXhpb3NVUkxTZWFyY2hQYXJhbXMgaXMgcmVmYWN0b3JlZFxuaW1wb3J0IFBsYXRmb3JtRm9ybURhdGEgZnJvbSAnLi4vcGxhdGZvcm0vbm9kZS9jbGFzc2VzL0Zvcm1EYXRhLmpzJztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0aGluZyBpcyBhIGFycmF5IG9yIGpzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGhpbmcgLSBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIGJlIHZpc2l0ZWQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmlzaXRhYmxlKHRoaW5nKSB7XG4gIHJldHVybiB1dGlscy5pc1BsYWluT2JqZWN0KHRoaW5nKSB8fCB1dGlscy5pc0FycmF5KHRoaW5nKTtcbn1cblxuLyoqXG4gKiBJdCByZW1vdmVzIHRoZSBicmFja2V0cyBmcm9tIHRoZSBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgcGFyYW1ldGVyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBrZXkgd2l0aG91dCB0aGUgYnJhY2tldHMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUJyYWNrZXRzKGtleSkge1xuICByZXR1cm4gdXRpbHMuZW5kc1dpdGgoa2V5LCAnW10nKSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXRoLCBhIGtleSwgYW5kIGEgYm9vbGVhbiwgYW5kIHJldHVybnMgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBjdXJyZW50IG9iamVjdCBiZWluZyBpdGVyYXRlZCBvdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRvdHMgLSBJZiB0cnVlLCB0aGUga2V5IHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBkb3RzIGluc3RlYWQgb2YgYnJhY2tldHMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICovXG5mdW5jdGlvbiByZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuIGtleTtcbiAgcmV0dXJuIHBhdGguY29uY2F0KGtleSkubWFwKGZ1bmN0aW9uIGVhY2godG9rZW4sIGkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICB0b2tlbiA9IHJlbW92ZUJyYWNrZXRzKHRva2VuKTtcbiAgICByZXR1cm4gIWRvdHMgJiYgaSA/ICdbJyArIHRva2VuICsgJ10nIDogdG9rZW47XG4gIH0pLmpvaW4oZG90cyA/ICcuJyA6ICcnKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgYXJyYXkgaXMgYW4gYXJyYXkgYW5kIG5vbmUgb2YgaXRzIGVsZW1lbnRzIGFyZSB2aXNpdGFibGUsIHRoZW4gaXQncyBhIGZsYXQgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGbGF0QXJyYXkoYXJyKSB7XG4gIHJldHVybiB1dGlscy5pc0FycmF5KGFycikgJiYgIWFyci5zb21lKGlzVmlzaXRhYmxlKTtcbn1cblxuY29uc3QgcHJlZGljYXRlcyA9IHV0aWxzLnRvRmxhdE9iamVjdCh1dGlscywge30sIG51bGwsIGZ1bmN0aW9uIGZpbHRlcihwcm9wKSB7XG4gIHJldHVybiAvXmlzW0EtWl0vLnRlc3QocHJvcCk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgZGF0YSBvYmplY3QgdG8gRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0gez9PYmplY3R9IFtmb3JtRGF0YV1cbiAqIEBwYXJhbSB7P09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy52aXNpdG9yXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tZXRhVG9rZW5zID0gdHJ1ZV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZG90cyA9IGZhbHNlXVxuICogQHBhcmFtIHs/Qm9vbGVhbn0gW29wdGlvbnMuaW5kZXhlcyA9IGZhbHNlXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKiovXG5cbi8qKlxuICogSXQgY29udmVydHMgYW4gb2JqZWN0IGludG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gY29udmVydCB0byBmb3JtIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgLSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHRvRm9ybURhdGEob2JqLCBmb3JtRGF0YSwgb3B0aW9ucykge1xuICBpZiAoIXV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBmb3JtRGF0YSA9IGZvcm1EYXRhIHx8IG5ldyAoUGxhdGZvcm1Gb3JtRGF0YSB8fCBGb3JtRGF0YSkoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgb3B0aW9ucyA9IHV0aWxzLnRvRmxhdE9iamVjdChvcHRpb25zLCB7XG4gICAgbWV0YVRva2VuczogdHJ1ZSxcbiAgICBkb3RzOiBmYWxzZSxcbiAgICBpbmRleGVzOiBmYWxzZVxuICB9LCBmYWxzZSwgZnVuY3Rpb24gZGVmaW5lZChvcHRpb24sIHNvdXJjZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICAgIHJldHVybiAhdXRpbHMuaXNVbmRlZmluZWQoc291cmNlW29wdGlvbl0pO1xuICB9KTtcblxuICBjb25zdCBtZXRhVG9rZW5zID0gb3B0aW9ucy5tZXRhVG9rZW5zO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgY29uc3QgdmlzaXRvciA9IG9wdGlvbnMudmlzaXRvciB8fCBkZWZhdWx0VmlzaXRvcjtcbiAgY29uc3QgZG90cyA9IG9wdGlvbnMuZG90cztcbiAgY29uc3QgaW5kZXhlcyA9IG9wdGlvbnMuaW5kZXhlcztcbiAgY29uc3QgX0Jsb2IgPSBvcHRpb25zLkJsb2IgfHwgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIEJsb2I7XG4gIGNvbnN0IHVzZUJsb2IgPSBfQmxvYiAmJiB1dGlscy5pc1NwZWNDb21wbGlhbnRGb3JtKGZvcm1EYXRhKTtcblxuICBpZiAoIXV0aWxzLmlzRnVuY3Rpb24odmlzaXRvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2aXNpdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJyc7XG5cbiAgICBpZiAodXRpbHMuaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VCbG9iICYmIHV0aWxzLmlzQmxvYih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdCbG9iIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhIEJ1ZmZlciBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyKHZhbHVlKSB8fCB1dGlscy5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdXNlQmxvYiAmJiB0eXBlb2YgQmxvYiA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBCbG9iKFt2YWx1ZV0pIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZpc2l0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBrZXlcbiAgICogQHBhcmFtIHtBcnJheTxTdHJpbmd8TnVtYmVyPn0gcGF0aFxuICAgKiBAdGhpcyB7Rm9ybURhdGF9XG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgZWFjaCBwcm9wIG9mIHRoZSB2YWx1ZSByZWN1cnNpdmVseVxuICAgKi9cbiAgZnVuY3Rpb24gZGVmYXVsdFZpc2l0b3IodmFsdWUsIGtleSwgcGF0aCkge1xuICAgIGxldCBhcnIgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhcGF0aCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodXRpbHMuZW5kc1dpdGgoa2V5LCAne30nKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gbWV0YVRva2VucyA/IGtleSA6IGtleS5zbGljZSgwLCAtMik7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICh1dGlscy5pc0FycmF5KHZhbHVlKSAmJiBpc0ZsYXRBcnJheSh2YWx1ZSkpIHx8XG4gICAgICAgICgodXRpbHMuaXNGaWxlTGlzdCh2YWx1ZSkgfHwgdXRpbHMuZW5kc1dpdGgoa2V5LCAnW10nKSkgJiYgKGFyciA9IHV0aWxzLnRvQXJyYXkodmFsdWUpKVxuICAgICAgICApKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSByZW1vdmVCcmFja2V0cyhrZXkpO1xuXG4gICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uIGVhY2goZWwsIGluZGV4KSB7XG4gICAgICAgICAgISh1dGlscy5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgaW5kZXhlcyA9PT0gdHJ1ZSA/IHJlbmRlcktleShba2V5XSwgaW5kZXgsIGRvdHMpIDogKGluZGV4ZXMgPT09IG51bGwgPyBrZXkgOiBrZXkgKyAnW10nKSxcbiAgICAgICAgICAgIGNvbnZlcnRWYWx1ZShlbClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1Zpc2l0YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvcm1EYXRhLmFwcGVuZChyZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSwgY29udmVydFZhbHVlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzdGFjayA9IFtdO1xuXG4gIGNvbnN0IGV4cG9zZWRIZWxwZXJzID0gT2JqZWN0LmFzc2lnbihwcmVkaWNhdGVzLCB7XG4gICAgZGVmYXVsdFZpc2l0b3IsXG4gICAgY29udmVydFZhbHVlLFxuICAgIGlzVmlzaXRhYmxlXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGJ1aWxkKHZhbHVlLCBwYXRoKSB7XG4gICAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgaWYgKHN0YWNrLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAnICsgcGF0aC5qb2luKCcuJykpO1xuICAgIH1cblxuICAgIHN0YWNrLnB1c2godmFsdWUpO1xuXG4gICAgdXRpbHMuZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24gZWFjaChlbCwga2V5KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSAhKHV0aWxzLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgdmlzaXRvci5jYWxsKFxuICAgICAgICBmb3JtRGF0YSwgZWwsIHV0aWxzLmlzU3RyaW5nKGtleSkgPyBrZXkudHJpbSgpIDoga2V5LCBwYXRoLCBleHBvc2VkSGVscGVyc1xuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICBidWlsZChlbCwgcGF0aCA/IHBhdGguY29uY2F0KGtleSkgOiBba2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgfVxuXG4gIGlmICghdXRpbHMuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RhdGEgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuXG4gIGJ1aWxkKG9iaik7XG5cbiAgcmV0dXJuIGZvcm1EYXRhO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b0Zvcm1EYXRhO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi90b0Zvcm1EYXRhLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvVVJMRW5jb2RlZEZvcm0oZGF0YSwgb3B0aW9ucykge1xuICByZXR1cm4gdG9Gb3JtRGF0YShkYXRhLCBuZXcgcGxhdGZvcm0uY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMoKSwgT2JqZWN0LmFzc2lnbih7XG4gICAgdmlzaXRvcjogZnVuY3Rpb24odmFsdWUsIGtleSwgcGF0aCwgaGVscGVycykge1xuICAgICAgaWYgKHBsYXRmb3JtLmlzTm9kZSAmJiB1dGlscy5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoa2V5LCB2YWx1ZS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoZWxwZXJzLmRlZmF1bHRWaXNpdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9LCBvcHRpb25zKSk7XG59XG4iLCJcblxuZXhwb3J0IGNvbnN0IHN0cmVhbUNodW5rID0gZnVuY3Rpb24qIChjaHVuaywgY2h1bmtTaXplKSB7XG4gIGxldCBsZW4gPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gIGlmICghY2h1bmtTaXplIHx8IGxlbiA8IGNodW5rU2l6ZSkge1xuICAgIHlpZWxkIGNodW5rO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwb3MgPSAwO1xuICBsZXQgZW5kO1xuXG4gIHdoaWxlIChwb3MgPCBsZW4pIHtcbiAgICBlbmQgPSBwb3MgKyBjaHVua1NpemU7XG4gICAgeWllbGQgY2h1bmsuc2xpY2UocG9zLCBlbmQpO1xuICAgIHBvcyA9IGVuZDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVhZEJ5dGVzID0gYXN5bmMgZnVuY3Rpb24qIChpdGVyYWJsZSwgY2h1bmtTaXplLCBlbmNvZGUpIHtcbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBpdGVyYWJsZSkge1xuICAgIHlpZWxkKiBzdHJlYW1DaHVuayhBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspID8gY2h1bmsgOiAoYXdhaXQgZW5jb2RlKFN0cmluZyhjaHVuaykpKSwgY2h1bmtTaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdHJhY2tTdHJlYW0gPSAoc3RyZWFtLCBjaHVua1NpemUsIG9uUHJvZ3Jlc3MsIG9uRmluaXNoLCBlbmNvZGUpID0+IHtcbiAgY29uc3QgaXRlcmF0b3IgPSByZWFkQnl0ZXMoc3RyZWFtLCBjaHVua1NpemUsIGVuY29kZSk7XG5cbiAgbGV0IGJ5dGVzID0gMDtcblxuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICB0eXBlOiAnYnl0ZXMnLFxuXG4gICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICBjb25zdCB7ZG9uZSwgdmFsdWV9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIG9uRmluaXNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGxlbiA9IHZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgICBvblByb2dyZXNzICYmIG9uUHJvZ3Jlc3MoYnl0ZXMgKz0gbGVuKTtcbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSkpO1xuICAgIH0sXG4gICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgb25GaW5pc2gocmVhc29uKTtcbiAgICAgIHJldHVybiBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBoaWdoV2F0ZXJNYXJrOiAyXG4gIH0pXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7VkVSU0lPTn0gZnJvbSAnLi4vZW52L2RhdGEuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcblxuY29uc3QgdmFsaWRhdG9ycyA9IHt9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuWydvYmplY3QnLCAnYm9vbGVhbicsICdudW1iZXInLCAnZnVuY3Rpb24nLCAnc3RyaW5nJywgJ3N5bWJvbCddLmZvckVhY2goKHR5cGUsIGkpID0+IHtcbiAgdmFsaWRhdG9yc1t0eXBlXSA9IGZ1bmN0aW9uIHZhbGlkYXRvcih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IHR5cGUgfHwgJ2EnICsgKGkgPCAxID8gJ24gJyA6ICcgJykgKyB0eXBlO1xuICB9O1xufSk7XG5cbmNvbnN0IGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yIC0gc2V0IHRvIGZhbHNlIGlmIHRoZSB0cmFuc2l0aW9uYWwgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWRcbiAqIEBwYXJhbSB7c3RyaW5nP30gdmVyc2lvbiAtIGRlcHJlY2F0ZWQgdmVyc2lvbiAvIHJlbW92ZWQgc2luY2UgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG52YWxpZGF0b3JzLnRyYW5zaXRpb25hbCA9IGZ1bmN0aW9uIHRyYW5zaXRpb25hbCh2YWxpZGF0b3IsIHZlcnNpb24sIG1lc3NhZ2UpIHtcbiAgZnVuY3Rpb24gZm9ybWF0TWVzc2FnZShvcHQsIGRlc2MpIHtcbiAgICByZXR1cm4gJ1tBeGlvcyB2JyArIFZFUlNJT04gKyAnXSBUcmFuc2l0aW9uYWwgb3B0aW9uIFxcJycgKyBvcHQgKyAnXFwnJyArIGRlc2MgKyAobWVzc2FnZSA/ICcuICcgKyBtZXNzYWdlIDogJycpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuICh2YWx1ZSwgb3B0LCBvcHRzKSA9PiB7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKG9wdCwgJyBoYXMgYmVlbiByZW1vdmVkJyArICh2ZXJzaW9uID8gJyBpbiAnICsgdmVyc2lvbiA6ICcnKSksXG4gICAgICAgIEF4aW9zRXJyb3IuRVJSX0RFUFJFQ0FURURcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24gJiYgIWRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdKSB7XG4gICAgICBkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIG9wdCxcbiAgICAgICAgICAnIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdicgKyB2ZXJzaW9uICsgJyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSdcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yID8gdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdHMpIDogdHJ1ZTtcbiAgfTtcbn07XG5cbi8qKlxuICogQXNzZXJ0IG9iamVjdCdzIHByb3BlcnRpZXMgdHlwZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gc2NoZW1hXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBhbGxvd1Vua25vd25cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGFzc2VydE9wdGlvbnMob3B0aW9ucywgc2NoZW1hLCBhbGxvd1Vua25vd24pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JywgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIGNvbnN0IG9wdCA9IGtleXNbaV07XG4gICAgY29uc3QgdmFsaWRhdG9yID0gc2NoZW1hW29wdF07XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW29wdF07XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRpb25zKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbiAnICsgb3B0ICsgJyBtdXN0IGJlICcgKyByZXN1bHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhbGxvd1Vua25vd24gIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdVbmtub3duIG9wdGlvbiAnICsgb3B0LCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBhc3NlcnRPcHRpb25zLFxuICB2YWxpZGF0b3JzXG59O1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyA/IEJsb2IgOiBudWxsXG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcgPyBGb3JtRGF0YSA6IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc1VSTFNlYXJjaFBhcmFtcyBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL0F4aW9zVVJMU2VhcmNoUGFyYW1zLmpzJztcbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnID8gVVJMU2VhcmNoUGFyYW1zIDogQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG4iLCJpbXBvcnQgVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4vY2xhc3Nlcy9VUkxTZWFyY2hQYXJhbXMuanMnXG5pbXBvcnQgRm9ybURhdGEgZnJvbSAnLi9jbGFzc2VzL0Zvcm1EYXRhLmpzJ1xuaW1wb3J0IEJsb2IgZnJvbSAnLi9jbGFzc2VzL0Jsb2IuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaXNCcm93c2VyOiB0cnVlLFxuICBjbGFzc2VzOiB7XG4gICAgVVJMU2VhcmNoUGFyYW1zLFxuICAgIEZvcm1EYXRhLFxuICAgIEJsb2JcbiAgfSxcbiAgcHJvdG9jb2xzOiBbJ2h0dHAnLCAnaHR0cHMnLCAnZmlsZScsICdibG9iJywgJ3VybCcsICdkYXRhJ11cbn07XG4iLCJjb25zdCBoYXNCcm93c2VyRW52ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlckVudiA9IChcbiAgKHByb2R1Y3QpID0+IHtcbiAgICByZXR1cm4gaGFzQnJvd3NlckVudiAmJiBbJ1JlYWN0TmF0aXZlJywgJ05hdGl2ZVNjcmlwdCcsICdOUyddLmluZGV4T2YocHJvZHVjdCkgPCAwXG4gIH0pKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5wcm9kdWN0KTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgd2ViV29ya2VyIGVudmlyb25tZW50XG4gKlxuICogQWx0aG91Z2ggdGhlIGBpc1N0YW5kYXJkQnJvd3NlckVudmAgbWV0aG9kIGluZGljYXRlcyB0aGF0XG4gKiBgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXJgLCB0aGUgV2ViV29ya2VyIHdpbGwgc3RpbGwgYmVcbiAqIGZpbHRlcmVkIG91dCBkdWUgdG8gaXRzIGp1ZGdtZW50IHN0YW5kYXJkXG4gKiBgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ2AuXG4gKiBUaGlzIGxlYWRzIHRvIGEgcHJvYmxlbSB3aGVuIGF4aW9zIHBvc3QgYEZvcm1EYXRhYCBpbiB3ZWJXb3JrZXJcbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52ID0gKCgpID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmXG4gICAgdHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cyA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufSkoKTtcblxuY29uc3Qgb3JpZ2luID0gaGFzQnJvd3NlckVudiAmJiB3aW5kb3cubG9jYXRpb24uaHJlZiB8fCAnaHR0cDovL2xvY2FsaG9zdCc7XG5cbmV4cG9ydCB7XG4gIGhhc0Jyb3dzZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyRW52LFxuICBvcmlnaW5cbn1cbiIsImltcG9ydCBwbGF0Zm9ybSBmcm9tICcuL25vZGUvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9jb21tb24vdXRpbHMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC4uLnV0aWxzLFxuICAuLi5wbGF0Zm9ybVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgYmluZCBmcm9tICcuL2hlbHBlcnMvYmluZC5qcyc7XG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbmNvbnN0IHt0b1N0cmluZ30gPSBPYmplY3QucHJvdG90eXBlO1xuY29uc3Qge2dldFByb3RvdHlwZU9mfSA9IE9iamVjdDtcblxuY29uc3Qga2luZE9mID0gKGNhY2hlID0+IHRoaW5nID0+IHtcbiAgICBjb25zdCBzdHIgPSB0b1N0cmluZy5jYWxsKHRoaW5nKTtcbiAgICByZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IHN0ci5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKSk7XG59KShPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuY29uc3Qga2luZE9mVGVzdCA9ICh0eXBlKSA9PiB7XG4gIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAodGhpbmcpID0+IGtpbmRPZih0aGluZykgPT09IHR5cGVcbn1cblxuY29uc3QgdHlwZU9mVGVzdCA9IHR5cGUgPT4gdGhpbmcgPT4gdHlwZW9mIHRoaW5nID09PSB0eXBlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3Qge2lzQXJyYXl9ID0gQXJyYXk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNVbmRlZmluZWQgPSB0eXBlT2ZUZXN0KCd1bmRlZmluZWQnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0J1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsKSAmJiB2YWwuY29uc3RydWN0b3IgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbC5jb25zdHJ1Y3RvcilcbiAgICAmJiBpc0Z1bmN0aW9uKHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcikgJiYgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNBcnJheUJ1ZmZlciA9IGtpbmRPZlRlc3QoJ0FycmF5QnVmZmVyJyk7XG5cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICBsZXQgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmIChpc0FycmF5QnVmZmVyKHZhbC5idWZmZXIpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyaW5nXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyaW5nID0gdHlwZU9mVGVzdCgnc3RyaW5nJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGdW5jdGlvbiA9IHR5cGVPZlRlc3QoJ2Z1bmN0aW9uJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNOdW1iZXIgPSB0eXBlT2ZUZXN0KCdudW1iZXInKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNPYmplY3QgPSAodGhpbmcpID0+IHRoaW5nICE9PSBudWxsICYmIHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCb29sZWFuXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCb29sZWFuLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCb29sZWFuID0gdGhpbmcgPT4gdGhpbmcgPT09IHRydWUgfHwgdGhpbmcgPT09IGZhbHNlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsKSA9PiB7XG4gIGlmIChraW5kT2YodmFsKSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZih2YWwpO1xuICByZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbCkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIERhdGVcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRGF0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRGF0ZSA9IGtpbmRPZlRlc3QoJ0RhdGUnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZSA9IGtpbmRPZlRlc3QoJ0ZpbGUnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJsb2JcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQmxvYiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQmxvYiA9IGtpbmRPZlRlc3QoJ0Jsb2InKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVMaXN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0ZpbGVMaXN0ID0ga2luZE9mVGVzdCgnRmlsZUxpc3QnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJlYW0sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1N0cmVhbSA9ICh2YWwpID0+IGlzT2JqZWN0KHZhbCkgJiYgaXNGdW5jdGlvbih2YWwucGlwZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBGb3JtRGF0YSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRm9ybURhdGEgPSAodGhpbmcpID0+IHtcbiAgbGV0IGtpbmQ7XG4gIHJldHVybiB0aGluZyAmJiAoXG4gICAgKHR5cGVvZiBGb3JtRGF0YSA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGluZyBpbnN0YW5jZW9mIEZvcm1EYXRhKSB8fCAoXG4gICAgICBpc0Z1bmN0aW9uKHRoaW5nLmFwcGVuZCkgJiYgKFxuICAgICAgICAoa2luZCA9IGtpbmRPZih0aGluZykpID09PSAnZm9ybWRhdGEnIHx8XG4gICAgICAgIC8vIGRldGVjdCBmb3JtLWRhdGEgaW5zdGFuY2VcbiAgICAgICAgKGtpbmQgPT09ICdvYmplY3QnICYmIGlzRnVuY3Rpb24odGhpbmcudG9TdHJpbmcpICYmIHRoaW5nLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IEZvcm1EYXRhXScpXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IGtpbmRPZlRlc3QoJ1VSTFNlYXJjaFBhcmFtcycpO1xuXG5jb25zdCBbaXNSZWFkYWJsZVN0cmVhbSwgaXNSZXF1ZXN0LCBpc1Jlc3BvbnNlLCBpc0hlYWRlcnNdID0gWydSZWFkYWJsZVN0cmVhbScsICdSZXF1ZXN0JywgJ1Jlc3BvbnNlJywgJ0hlYWRlcnMnXS5tYXAoa2luZE9mVGVzdCk7XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmNvbnN0IHRyaW0gPSAoc3RyKSA9PiBzdHIudHJpbSA/XG4gIHN0ci50cmltKCkgOiBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csICcnKTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXMgPSBmYWxzZV1cbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbiwge2FsbE93bktleXMgPSBmYWxzZX0gPSB7fSkge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpO1xuICBsZXQgbDtcblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAoaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgY29uc3Qga2V5cyA9IGFsbE93bktleXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iaiwga2V5KSB7XG4gIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgbGV0IF9rZXk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgX2tleSA9IGtleXNbaV07XG4gICAgaWYgKGtleSA9PT0gX2tleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gX2tleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IF9nbG9iYWwgPSAoKCkgPT4ge1xuICAvKmVzbGludCBuby11bmRlZjowKi9cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZ2xvYmFsVGhpcztcbiAgcmV0dXJuIHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbClcbn0pKCk7XG5cbmNvbnN0IGlzQ29udGV4dERlZmluZWQgPSAoY29udGV4dCkgPT4gIWlzVW5kZWZpbmVkKGNvbnRleHQpICYmIGNvbnRleHQgIT09IF9nbG9iYWw7XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgY29uc3Qge2Nhc2VsZXNzfSA9IGlzQ29udGV4dERlZmluZWQodGhpcykgJiYgdGhpcyB8fCB7fTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGNvbnN0IGFzc2lnblZhbHVlID0gKHZhbCwga2V5KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gY2FzZWxlc3MgJiYgZmluZEtleShyZXN1bHQsIGtleSkgfHwga2V5O1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHJlc3VsdFt0YXJnZXRLZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2UocmVzdWx0W3RhcmdldEtleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGFyZ3VtZW50c1tpXSAmJiBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFthbGxPd25LZXlzXVxuICogQHJldHVybnMge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5jb25zdCBleHRlbmQgPSAoYSwgYiwgdGhpc0FyZywge2FsbE93bktleXN9PSB7fSkgPT4ge1xuICBmb3JFYWNoKGIsICh2YWwsIGtleSkgPT4ge1xuICAgIGlmICh0aGlzQXJnICYmIGlzRnVuY3Rpb24odmFsKSkge1xuICAgICAgYVtrZXldID0gYmluZCh2YWwsIHRoaXNBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhW2tleV0gPSB2YWw7XG4gICAgfVxuICB9LCB7YWxsT3duS2V5c30pO1xuICByZXR1cm4gYTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYnl0ZSBvcmRlciBtYXJrZXIuIFRoaXMgY2F0Y2hlcyBFRiBCQiBCRiAodGhlIFVURi04IEJPTSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCB3aXRoIEJPTVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGNvbnRlbnQgdmFsdWUgd2l0aG91dCBCT01cbiAqL1xuY29uc3Qgc3RyaXBCT00gPSAoY29udGVudCkgPT4ge1xuICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtvYmplY3R9IFtkZXNjcmlwdG9yc11cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgaW5oZXJpdHMgPSAoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IsIHByb3BzLCBkZXNjcmlwdG9ycykgPT4ge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RydWN0b3IsICdzdXBlcicsIHtcbiAgICB2YWx1ZTogc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGVcbiAgfSk7XG4gIHByb3BzICYmIE9iamVjdC5hc3NpZ24oY29uc3RydWN0b3IucHJvdG90eXBlLCBwcm9wcyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvYmplY3Qgd2l0aCBkZWVwIHByb3RvdHlwZSBjaGFpbiB0byBhIGZsYXQgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlT2JqIHNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGVzdE9ial1cbiAqIEBwYXJhbSB7RnVuY3Rpb258Qm9vbGVhbn0gW2ZpbHRlcl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wRmlsdGVyXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IHRvRmxhdE9iamVjdCA9IChzb3VyY2VPYmosIGRlc3RPYmosIGZpbHRlciwgcHJvcEZpbHRlcikgPT4ge1xuICBsZXQgcHJvcHM7XG4gIGxldCBpO1xuICBsZXQgcHJvcDtcbiAgY29uc3QgbWVyZ2VkID0ge307XG5cbiAgZGVzdE9iaiA9IGRlc3RPYmogfHwge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBpZiAoc291cmNlT2JqID09IG51bGwpIHJldHVybiBkZXN0T2JqO1xuXG4gIGRvIHtcbiAgICBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZU9iaik7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgaWYgKCghcHJvcEZpbHRlciB8fCBwcm9wRmlsdGVyKHByb3AsIHNvdXJjZU9iaiwgZGVzdE9iaikpICYmICFtZXJnZWRbcHJvcF0pIHtcbiAgICAgICAgZGVzdE9ialtwcm9wXSA9IHNvdXJjZU9ialtwcm9wXTtcbiAgICAgICAgbWVyZ2VkW3Byb3BdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlT2JqID0gZmlsdGVyICE9PSBmYWxzZSAmJiBnZXRQcm90b3R5cGVPZihzb3VyY2VPYmopO1xuICB9IHdoaWxlIChzb3VyY2VPYmogJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKHNvdXJjZU9iaiwgZGVzdE9iaikpICYmIHNvdXJjZU9iaiAhPT0gT2JqZWN0LnByb3RvdHlwZSk7XG5cbiAgcmV0dXJuIGRlc3RPYmo7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3RyaW5nIGVuZHMgd2l0aCB0aGUgY2hhcmFjdGVycyBvZiBhIHNwZWNpZmllZCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VhcmNoU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gW3Bvc2l0aW9uPSAwXVxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBlbmRzV2l0aCA9IChzdHIsIHNlYXJjaFN0cmluZywgcG9zaXRpb24pID0+IHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHBvc2l0aW9uID4gc3RyLmxlbmd0aCkge1xuICAgIHBvc2l0aW9uID0gc3RyLmxlbmd0aDtcbiAgfVxuICBwb3NpdGlvbiAtPSBzZWFyY2hTdHJpbmcubGVuZ3RoO1xuICBjb25zdCBsYXN0SW5kZXggPSBzdHIuaW5kZXhPZihzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKTtcbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gLTEgJiYgbGFzdEluZGV4ID09PSBwb3NpdGlvbjtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGZyb20gYXJyYXkgbGlrZSBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqXG4gKiBAcGFyYW0geyp9IFt0aGluZ11cbiAqXG4gKiBAcmV0dXJucyB7P0FycmF5fVxuICovXG5jb25zdCB0b0FycmF5ID0gKHRoaW5nKSA9PiB7XG4gIGlmICghdGhpbmcpIHJldHVybiBudWxsO1xuICBpZiAoaXNBcnJheSh0aGluZykpIHJldHVybiB0aGluZztcbiAgbGV0IGkgPSB0aGluZy5sZW5ndGg7XG4gIGlmICghaXNOdW1iZXIoaSkpIHJldHVybiBudWxsO1xuICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgYXJyW2ldID0gdGhpbmdbaV07XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLyoqXG4gKiBDaGVja2luZyBpZiB0aGUgVWludDhBcnJheSBleGlzdHMgYW5kIGlmIGl0IGRvZXMsIGl0IHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGVcbiAqIHRoaW5nIHBhc3NlZCBpbiBpcyBhbiBpbnN0YW5jZSBvZiBVaW50OEFycmF5XG4gKlxuICogQHBhcmFtIHtUeXBlZEFycmF5fVxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbmNvbnN0IGlzVHlwZWRBcnJheSA9IChUeXBlZEFycmF5ID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuIHRoaW5nID0+IHtcbiAgICByZXR1cm4gVHlwZWRBcnJheSAmJiB0aGluZyBpbnN0YW5jZW9mIFR5cGVkQXJyYXk7XG4gIH07XG59KSh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheSkpO1xuXG4vKipcbiAqIEZvciBlYWNoIGVudHJ5IGluIHRoZSBvYmplY3QsIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGtleSBhbmQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8YW55LCBhbnk+fSBvYmogLSBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW50cnkuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGZvckVhY2hFbnRyeSA9IChvYmosIGZuKSA9PiB7XG4gIGNvbnN0IGdlbmVyYXRvciA9IG9iaiAmJiBvYmpbU3ltYm9sLml0ZXJhdG9yXTtcblxuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvci5jYWxsKG9iaik7XG5cbiAgbGV0IHJlc3VsdDtcblxuICB3aGlsZSAoKHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKSkgJiYgIXJlc3VsdC5kb25lKSB7XG4gICAgY29uc3QgcGFpciA9IHJlc3VsdC52YWx1ZTtcbiAgICBmbi5jYWxsKG9iaiwgcGFpclswXSwgcGFpclsxXSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgYSBzdHJpbmcsIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgbWF0Y2hlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdFeHAgLSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBzZWFyY2guXG4gKlxuICogQHJldHVybnMge0FycmF5PGJvb2xlYW4+fVxuICovXG5jb25zdCBtYXRjaEFsbCA9IChyZWdFeHAsIHN0cikgPT4ge1xuICBsZXQgbWF0Y2hlcztcbiAgY29uc3QgYXJyID0gW107XG5cbiAgd2hpbGUgKChtYXRjaGVzID0gcmVnRXhwLmV4ZWMoc3RyKSkgIT09IG51bGwpIHtcbiAgICBhcnIucHVzaChtYXRjaGVzKTtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59XG5cbi8qIENoZWNraW5nIGlmIHRoZSBraW5kT2ZUZXN0IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhbiBIVE1MRm9ybUVsZW1lbnQuICovXG5jb25zdCBpc0hUTUxGb3JtID0ga2luZE9mVGVzdCgnSFRNTEZvcm1FbGVtZW50Jyk7XG5cbmNvbnN0IHRvQ2FtZWxDYXNlID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX1xcc10oW2EtelxcZF0pKFxcdyopL2csXG4gICAgZnVuY3Rpb24gcmVwbGFjZXIobSwgcDEsIHAyKSB7XG4gICAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKSArIHAyO1xuICAgIH1cbiAgKTtcbn07XG5cbi8qIENyZWF0aW5nIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBwcm9wZXJ0eS4gKi9cbmNvbnN0IGhhc093blByb3BlcnR5ID0gKCh7aGFzT3duUHJvcGVydHl9KSA9PiAob2JqLCBwcm9wKSA9PiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpKE9iamVjdC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNSZWdFeHAgPSBraW5kT2ZUZXN0KCdSZWdFeHAnKTtcblxuY29uc3QgcmVkdWNlRGVzY3JpcHRvcnMgPSAob2JqLCByZWR1Y2VyKSA9PiB7XG4gIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKTtcbiAgY29uc3QgcmVkdWNlZERlc2NyaXB0b3JzID0ge307XG5cbiAgZm9yRWFjaChkZXNjcmlwdG9ycywgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICBsZXQgcmV0O1xuICAgIGlmICgocmV0ID0gcmVkdWNlcihkZXNjcmlwdG9yLCBuYW1lLCBvYmopKSAhPT0gZmFsc2UpIHtcbiAgICAgIHJlZHVjZWREZXNjcmlwdG9yc1tuYW1lXSA9IHJldCB8fCBkZXNjcmlwdG9yO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqLCByZWR1Y2VkRGVzY3JpcHRvcnMpO1xufVxuXG4vKipcbiAqIE1ha2VzIGFsbCBtZXRob2RzIHJlYWQtb25seVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICovXG5cbmNvbnN0IGZyZWV6ZU1ldGhvZHMgPSAob2JqKSA9PiB7XG4gIHJlZHVjZURlc2NyaXB0b3JzKG9iaiwgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICAvLyBza2lwIHJlc3RyaWN0ZWQgcHJvcHMgaW4gc3RyaWN0IG1vZGVcbiAgICBpZiAoaXNGdW5jdGlvbihvYmopICYmIFsnYXJndW1lbnRzJywgJ2NhbGxlcicsICdjYWxsZWUnXS5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gb2JqW25hbWVdO1xuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7XG5cbiAgICBpZiAoJ3dyaXRhYmxlJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkZXNjcmlwdG9yLnNldCkge1xuICAgICAgZGVzY3JpcHRvci5zZXQgPSAoKSA9PiB7XG4gICAgICAgIHRocm93IEVycm9yKCdDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCBcXCcnICsgbmFtZSArICdcXCcnKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgdG9PYmplY3RTZXQgPSAoYXJyYXlPclN0cmluZywgZGVsaW1pdGVyKSA9PiB7XG4gIGNvbnN0IG9iaiA9IHt9O1xuXG4gIGNvbnN0IGRlZmluZSA9IChhcnIpID0+IHtcbiAgICBhcnIuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICBvYmpbdmFsdWVdID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQXJyYXkoYXJyYXlPclN0cmluZykgPyBkZWZpbmUoYXJyYXlPclN0cmluZykgOiBkZWZpbmUoU3RyaW5nKGFycmF5T3JTdHJpbmcpLnNwbGl0KGRlbGltaXRlcikpO1xuXG4gIHJldHVybiBvYmo7XG59XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuXG5jb25zdCB0b0Zpbml0ZU51bWJlciA9ICh2YWx1ZSwgZGVmYXVsdFZhbHVlKSA9PiB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSA9ICt2YWx1ZSkgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbn1cblxuY29uc3QgQUxQSEEgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonXG5cbmNvbnN0IERJR0lUID0gJzAxMjM0NTY3ODknO1xuXG5jb25zdCBBTFBIQUJFVCA9IHtcbiAgRElHSVQsXG4gIEFMUEhBLFxuICBBTFBIQV9ESUdJVDogQUxQSEEgKyBBTFBIQS50b1VwcGVyQ2FzZSgpICsgRElHSVRcbn1cblxuY29uc3QgZ2VuZXJhdGVTdHJpbmcgPSAoc2l6ZSA9IDE2LCBhbHBoYWJldCA9IEFMUEhBQkVULkFMUEhBX0RJR0lUKSA9PiB7XG4gIGxldCBzdHIgPSAnJztcbiAgY29uc3Qge2xlbmd0aH0gPSBhbHBoYWJldDtcbiAgd2hpbGUgKHNpemUtLSkge1xuICAgIHN0ciArPSBhbHBoYWJldFtNYXRoLnJhbmRvbSgpICogbGVuZ3RofDBdXG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIElmIHRoZSB0aGluZyBpcyBhIEZvcm1EYXRhIG9iamVjdCwgcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB0aGluZyAtIFRoZSB0aGluZyB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTcGVjQ29tcGxpYW50Rm9ybSh0aGluZykge1xuICByZXR1cm4gISEodGhpbmcgJiYgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIHRoaW5nW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdGb3JtRGF0YScgJiYgdGhpbmdbU3ltYm9sLml0ZXJhdG9yXSk7XG59XG5cbmNvbnN0IHRvSlNPTk9iamVjdCA9IChvYmopID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgQXJyYXkoMTApO1xuXG4gIGNvbnN0IHZpc2l0ID0gKHNvdXJjZSwgaSkgPT4ge1xuXG4gICAgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIGlmIChzdGFjay5pbmRleE9mKHNvdXJjZSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmKCEoJ3RvSlNPTicgaW4gc291cmNlKSkge1xuICAgICAgICBzdGFja1tpXSA9IHNvdXJjZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcblxuICAgICAgICBmb3JFYWNoKHNvdXJjZSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCByZWR1Y2VkVmFsdWUgPSB2aXNpdCh2YWx1ZSwgaSArIDEpO1xuICAgICAgICAgICFpc1VuZGVmaW5lZChyZWR1Y2VkVmFsdWUpICYmICh0YXJnZXRba2V5XSA9IHJlZHVjZWRWYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YWNrW2ldID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHJldHVybiB2aXNpdChvYmosIDApO1xufVxuXG5jb25zdCBpc0FzeW5jRm4gPSBraW5kT2ZUZXN0KCdBc3luY0Z1bmN0aW9uJyk7XG5cbmNvbnN0IGlzVGhlbmFibGUgPSAodGhpbmcpID0+XG4gIHRoaW5nICYmIChpc09iamVjdCh0aGluZykgfHwgaXNGdW5jdGlvbih0aGluZykpICYmIGlzRnVuY3Rpb24odGhpbmcudGhlbikgJiYgaXNGdW5jdGlvbih0aGluZy5jYXRjaCk7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaXNBcnJheSxcbiAgaXNBcnJheUJ1ZmZlcixcbiAgaXNCdWZmZXIsXG4gIGlzRm9ybURhdGEsXG4gIGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZyxcbiAgaXNOdW1iZXIsXG4gIGlzQm9vbGVhbixcbiAgaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzUmVhZGFibGVTdHJlYW0sXG4gIGlzUmVxdWVzdCxcbiAgaXNSZXNwb25zZSxcbiAgaXNIZWFkZXJzLFxuICBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlLFxuICBpc0ZpbGUsXG4gIGlzQmxvYixcbiAgaXNSZWdFeHAsXG4gIGlzRnVuY3Rpb24sXG4gIGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNUeXBlZEFycmF5LFxuICBpc0ZpbGVMaXN0LFxuICBmb3JFYWNoLFxuICBtZXJnZSxcbiAgZXh0ZW5kLFxuICB0cmltLFxuICBzdHJpcEJPTSxcbiAgaW5oZXJpdHMsXG4gIHRvRmxhdE9iamVjdCxcbiAga2luZE9mLFxuICBraW5kT2ZUZXN0LFxuICBlbmRzV2l0aCxcbiAgdG9BcnJheSxcbiAgZm9yRWFjaEVudHJ5LFxuICBtYXRjaEFsbCxcbiAgaXNIVE1MRm9ybSxcbiAgaGFzT3duUHJvcGVydHksXG4gIGhhc093blByb3A6IGhhc093blByb3BlcnR5LCAvLyBhbiBhbGlhcyB0byBhdm9pZCBFU0xpbnQgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIGRldGVjdGlvblxuICByZWR1Y2VEZXNjcmlwdG9ycyxcbiAgZnJlZXplTWV0aG9kcyxcbiAgdG9PYmplY3RTZXQsXG4gIHRvQ2FtZWxDYXNlLFxuICBub29wLFxuICB0b0Zpbml0ZU51bWJlcixcbiAgZmluZEtleSxcbiAgZ2xvYmFsOiBfZ2xvYmFsLFxuICBpc0NvbnRleHREZWZpbmVkLFxuICBBTFBIQUJFVCxcbiAgZ2VuZXJhdGVTdHJpbmcsXG4gIGlzU3BlY0NvbXBsaWFudEZvcm0sXG4gIHRvSlNPTk9iamVjdCxcbiAgaXNBc3luY0ZuLFxuICBpc1RoZW5hYmxlXG59O1xuIiwiZnVuY3Rpb24gcihlKXt2YXIgdCxmLG49XCJcIjtpZihcInN0cmluZ1wiPT10eXBlb2YgZXx8XCJudW1iZXJcIj09dHlwZW9mIGUpbis9ZTtlbHNlIGlmKFwib2JqZWN0XCI9PXR5cGVvZiBlKWlmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciBvPWUubGVuZ3RoO2Zvcih0PTA7dDxvO3QrKyllW3RdJiYoZj1yKGVbdF0pKSYmKG4mJihuKz1cIiBcIiksbis9Zil9ZWxzZSBmb3IoZiBpbiBlKWVbZl0mJihuJiYobis9XCIgXCIpLG4rPWYpO3JldHVybiBufWV4cG9ydCBmdW5jdGlvbiBjbHN4KCl7Zm9yKHZhciBlLHQsZj0wLG49XCJcIixvPWFyZ3VtZW50cy5sZW5ndGg7ZjxvO2YrKykoZT1hcmd1bWVudHNbZl0pJiYodD1yKGUpKSYmKG4mJihuKz1cIiBcIiksbis9dCk7cmV0dXJuIG59ZXhwb3J0IGRlZmF1bHQgY2xzeDsiLCJ2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZmluZChpdGVyLCB0YXIsIGtleSkge1xuXHRmb3IgKGtleSBvZiBpdGVyLmtleXMoKSkge1xuXHRcdGlmIChkZXF1YWwoa2V5LCB0YXIpKSByZXR1cm4ga2V5O1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXF1YWwoZm9vLCBiYXIpIHtcblx0dmFyIGN0b3IsIGxlbiwgdG1wO1xuXHRpZiAoZm9vID09PSBiYXIpIHJldHVybiB0cnVlO1xuXG5cdGlmIChmb28gJiYgYmFyICYmIChjdG9yPWZvby5jb25zdHJ1Y3RvcikgPT09IGJhci5jb25zdHJ1Y3Rvcikge1xuXHRcdGlmIChjdG9yID09PSBEYXRlKSByZXR1cm4gZm9vLmdldFRpbWUoKSA9PT0gYmFyLmdldFRpbWUoKTtcblx0XHRpZiAoY3RvciA9PT0gUmVnRXhwKSByZXR1cm4gZm9vLnRvU3RyaW5nKCkgPT09IGJhci50b1N0cmluZygpO1xuXG5cdFx0aWYgKGN0b3IgPT09IEFycmF5KSB7XG5cdFx0XHRpZiAoKGxlbj1mb28ubGVuZ3RoKSA9PT0gYmFyLmxlbmd0aCkge1xuXHRcdFx0XHR3aGlsZSAobGVuLS0gJiYgZGVxdWFsKGZvb1tsZW5dLCBiYXJbbGVuXSkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGxlbiA9PT0gLTE7XG5cdFx0fVxuXG5cdFx0aWYgKGN0b3IgPT09IFNldCkge1xuXHRcdFx0aWYgKGZvby5zaXplICE9PSBiYXIuc2l6ZSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGxlbiBvZiBmb28pIHtcblx0XHRcdFx0dG1wID0gbGVuO1xuXHRcdFx0XHRpZiAodG1wICYmIHR5cGVvZiB0bXAgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdFx0dG1wID0gZmluZChiYXIsIHRtcCk7XG5cdFx0XHRcdFx0aWYgKCF0bXApIHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIWJhci5oYXModG1wKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGN0b3IgPT09IE1hcCkge1xuXHRcdFx0aWYgKGZvby5zaXplICE9PSBiYXIuc2l6ZSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGxlbiBvZiBmb28pIHtcblx0XHRcdFx0dG1wID0gbGVuWzBdO1xuXHRcdFx0XHRpZiAodG1wICYmIHR5cGVvZiB0bXAgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdFx0dG1wID0gZmluZChiYXIsIHRtcCk7XG5cdFx0XHRcdFx0aWYgKCF0bXApIHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIWRlcXVhbChsZW5bMV0sIGJhci5nZXQodG1wKSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChjdG9yID09PSBBcnJheUJ1ZmZlcikge1xuXHRcdFx0Zm9vID0gbmV3IFVpbnQ4QXJyYXkoZm9vKTtcblx0XHRcdGJhciA9IG5ldyBVaW50OEFycmF5KGJhcik7XG5cdFx0fSBlbHNlIGlmIChjdG9yID09PSBEYXRhVmlldykge1xuXHRcdFx0aWYgKChsZW49Zm9vLmJ5dGVMZW5ndGgpID09PSBiYXIuYnl0ZUxlbmd0aCkge1xuXHRcdFx0XHR3aGlsZSAobGVuLS0gJiYgZm9vLmdldEludDgobGVuKSA9PT0gYmFyLmdldEludDgobGVuKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbGVuID09PSAtMTtcblx0XHR9XG5cblx0XHRpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGZvbykpIHtcblx0XHRcdGlmICgobGVuPWZvby5ieXRlTGVuZ3RoKSA9PT0gYmFyLmJ5dGVMZW5ndGgpIHtcblx0XHRcdFx0d2hpbGUgKGxlbi0tICYmIGZvb1tsZW5dID09PSBiYXJbbGVuXSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbGVuID09PSAtMTtcblx0XHR9XG5cblx0XHRpZiAoIWN0b3IgfHwgdHlwZW9mIGZvbyA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGxlbiA9IDA7XG5cdFx0XHRmb3IgKGN0b3IgaW4gZm9vKSB7XG5cdFx0XHRcdGlmIChoYXMuY2FsbChmb28sIGN0b3IpICYmICsrbGVuICYmICFoYXMuY2FsbChiYXIsIGN0b3IpKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdGlmICghKGN0b3IgaW4gYmFyKSB8fCAhZGVxdWFsKGZvb1tjdG9yXSwgYmFyW2N0b3JdKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIE9iamVjdC5rZXlzKGJhcikubGVuZ3RoID09PSBsZW47XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZvbyAhPT0gZm9vICYmIGJhciAhPT0gYmFyO1xufVxuIiwiaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnQHJlYWN0LWRuZC9pbnZhcmlhbnQnO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuLi8uLi91dGlscy9qc191dGlscy5qcyc7XG5pbXBvcnQgeyBzZXRDbGllbnRPZmZzZXQgfSBmcm9tICcuL2xvY2FsL3NldENsaWVudE9mZnNldC5qcyc7XG5pbXBvcnQgeyBCRUdJTl9EUkFHLCBJTklUX0NPT1JEUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuY29uc3QgUmVzZXRDb29yZGluYXRlc0FjdGlvbiA9IHtcbiAgICB0eXBlOiBJTklUX0NPT1JEUyxcbiAgICBwYXlsb2FkOiB7XG4gICAgICAgIGNsaWVudE9mZnNldDogbnVsbCxcbiAgICAgICAgc291cmNlQ2xpZW50T2Zmc2V0OiBudWxsXG4gICAgfVxufTtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCZWdpbkRyYWcobWFuYWdlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiBiZWdpbkRyYWcoc291cmNlSWRzID0gW10sIG9wdGlvbnMgPSB7XG4gICAgICAgIHB1Ymxpc2hTb3VyY2U6IHRydWVcbiAgICB9KSB7XG4gICAgICAgIGNvbnN0IHsgcHVibGlzaFNvdXJjZSA9dHJ1ZSAsIGNsaWVudE9mZnNldCAsIGdldFNvdXJjZUNsaWVudE9mZnNldCAsICB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvcigpO1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IG1hbmFnZXIuZ2V0UmVnaXN0cnkoKTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29vcmRpbmF0ZXMgdXNpbmcgdGhlIGNsaWVudCBvZmZzZXRcbiAgICAgICAgbWFuYWdlci5kaXNwYXRjaChzZXRDbGllbnRPZmZzZXQoY2xpZW50T2Zmc2V0KSk7XG4gICAgICAgIHZlcmlmeUludmFyaWFudHMoc291cmNlSWRzLCBtb25pdG9yLCByZWdpc3RyeSk7XG4gICAgICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIHNvdXJjZVxuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IGdldERyYWdnYWJsZVNvdXJjZShzb3VyY2VJZHMsIG1vbml0b3IpO1xuICAgICAgICBpZiAoc291cmNlSWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgbWFuYWdlci5kaXNwYXRjaChSZXNldENvb3JkaW5hdGVzQWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBjbGllbnQgb2Zmc2V0XG4gICAgICAgIGxldCBzb3VyY2VDbGllbnRPZmZzZXQgPSBudWxsO1xuICAgICAgICBpZiAoY2xpZW50T2Zmc2V0KSB7XG4gICAgICAgICAgICBpZiAoIWdldFNvdXJjZUNsaWVudE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0U291cmNlQ2xpZW50T2Zmc2V0IG11c3QgYmUgZGVmaW5lZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmVyaWZ5R2V0U291cmNlQ2xpZW50T2Zmc2V0SXNGdW5jdGlvbihnZXRTb3VyY2VDbGllbnRPZmZzZXQpO1xuICAgICAgICAgICAgc291cmNlQ2xpZW50T2Zmc2V0ID0gZ2V0U291cmNlQ2xpZW50T2Zmc2V0KHNvdXJjZUlkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBmdWxsIGNvb3JkaW5hdGVzXG4gICAgICAgIG1hbmFnZXIuZGlzcGF0Y2goc2V0Q2xpZW50T2Zmc2V0KGNsaWVudE9mZnNldCwgc291cmNlQ2xpZW50T2Zmc2V0KSk7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHJlZ2lzdHJ5LmdldFNvdXJjZShzb3VyY2VJZCk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBzb3VyY2UuYmVnaW5EcmFnKG1vbml0b3IsIHNvdXJjZUlkKTtcbiAgICAgICAgLy8gSWYgc291cmNlLmJlZ2luRHJhZyByZXR1cm5zIG51bGwsIHRoaXMgaXMgYW4gaW5kaWNhdG9yIHRvIGNhbmNlbCB0aGUgZHJhZ1xuICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZlcmlmeUl0ZW1Jc09iamVjdChpdGVtKTtcbiAgICAgICAgcmVnaXN0cnkucGluU291cmNlKHNvdXJjZUlkKTtcbiAgICAgICAgY29uc3QgaXRlbVR5cGUgPSByZWdpc3RyeS5nZXRTb3VyY2VUeXBlKHNvdXJjZUlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IEJFR0lOX0RSQUcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUsXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXQ6IGNsaWVudE9mZnNldCB8fCBudWxsLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNsaWVudE9mZnNldDogc291cmNlQ2xpZW50T2Zmc2V0IHx8IG51bGwsXG4gICAgICAgICAgICAgICAgaXNTb3VyY2VQdWJsaWM6ICEhcHVibGlzaFNvdXJjZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG59XG5mdW5jdGlvbiB2ZXJpZnlJbnZhcmlhbnRzKHNvdXJjZUlkcywgbW9uaXRvciwgcmVnaXN0cnkpIHtcbiAgICBpbnZhcmlhbnQoIW1vbml0b3IuaXNEcmFnZ2luZygpLCAnQ2Fubm90IGNhbGwgYmVnaW5EcmFnIHdoaWxlIGRyYWdnaW5nLicpO1xuICAgIHNvdXJjZUlkcy5mb3JFYWNoKGZ1bmN0aW9uKHNvdXJjZUlkKSB7XG4gICAgICAgIGludmFyaWFudChyZWdpc3RyeS5nZXRTb3VyY2Uoc291cmNlSWQpLCAnRXhwZWN0ZWQgc291cmNlSWRzIHRvIGJlIHJlZ2lzdGVyZWQuJyk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiB2ZXJpZnlHZXRTb3VyY2VDbGllbnRPZmZzZXRJc0Z1bmN0aW9uKGdldFNvdXJjZUNsaWVudE9mZnNldCkge1xuICAgIGludmFyaWFudCh0eXBlb2YgZ2V0U291cmNlQ2xpZW50T2Zmc2V0ID09PSAnZnVuY3Rpb24nLCAnV2hlbiBjbGllbnRPZmZzZXQgaXMgcHJvdmlkZWQsIGdldFNvdXJjZUNsaWVudE9mZnNldCBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG59XG5mdW5jdGlvbiB2ZXJpZnlJdGVtSXNPYmplY3QoaXRlbSkge1xuICAgIGludmFyaWFudChpc09iamVjdChpdGVtKSwgJ0l0ZW0gbXVzdCBiZSBhbiBvYmplY3QuJyk7XG59XG5mdW5jdGlvbiBnZXREcmFnZ2FibGVTb3VyY2Uoc291cmNlSWRzLCBtb25pdG9yKSB7XG4gICAgbGV0IHNvdXJjZUlkID0gbnVsbDtcbiAgICBmb3IobGV0IGkgPSBzb3VyY2VJZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuICAgICAgICBpZiAobW9uaXRvci5jYW5EcmFnU291cmNlKHNvdXJjZUlkc1tpXSkpIHtcbiAgICAgICAgICAgIHNvdXJjZUlkID0gc291cmNlSWRzW2ldO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZUlkO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1iZWdpbkRyYWcuanMubWFwIiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICAgICAgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uKHN5bSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0ByZWFjdC1kbmQvaW52YXJpYW50JztcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvanNfdXRpbHMuanMnO1xuaW1wb3J0IHsgRFJPUCB9IGZyb20gJy4vdHlwZXMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURyb3AobWFuYWdlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiBkcm9wKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yKCk7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gbWFuYWdlci5nZXRSZWdpc3RyeSgpO1xuICAgICAgICB2ZXJpZnlJbnZhcmlhbnRzKG1vbml0b3IpO1xuICAgICAgICBjb25zdCB0YXJnZXRJZHMgPSBnZXREcm9wcGFibGVUYXJnZXRzKG1vbml0b3IpO1xuICAgICAgICAvLyBNdWx0aXBsZSBhY3Rpb25zIGFyZSBkaXNwYXRjaGVkIGhlcmUsIHdoaWNoIGlzIHdoeSB0aGlzIGRvZXNuJ3QgcmV0dXJuIGFuIGFjdGlvblxuICAgICAgICB0YXJnZXRJZHMuZm9yRWFjaCgodGFyZ2V0SWQsIGluZGV4KT0+e1xuICAgICAgICAgICAgY29uc3QgZHJvcFJlc3VsdCA9IGRldGVybWluZURyb3BSZXN1bHQodGFyZ2V0SWQsIGluZGV4LCByZWdpc3RyeSwgbW9uaXRvcik7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogRFJPUCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgIGRyb3BSZXN1bHQ6IF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbnMsIGRyb3BSZXN1bHQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1hbmFnZXIuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHZlcmlmeUludmFyaWFudHMobW9uaXRvcikge1xuICAgIGludmFyaWFudChtb25pdG9yLmlzRHJhZ2dpbmcoKSwgJ0Nhbm5vdCBjYWxsIGRyb3Agd2hpbGUgbm90IGRyYWdnaW5nLicpO1xuICAgIGludmFyaWFudCghbW9uaXRvci5kaWREcm9wKCksICdDYW5ub3QgY2FsbCBkcm9wIHR3aWNlIGR1cmluZyBvbmUgZHJhZyBvcGVyYXRpb24uJyk7XG59XG5mdW5jdGlvbiBkZXRlcm1pbmVEcm9wUmVzdWx0KHRhcmdldElkLCBpbmRleCwgcmVnaXN0cnksIG1vbml0b3IpIHtcbiAgICBjb25zdCB0YXJnZXQgPSByZWdpc3RyeS5nZXRUYXJnZXQodGFyZ2V0SWQpO1xuICAgIGxldCBkcm9wUmVzdWx0ID0gdGFyZ2V0ID8gdGFyZ2V0LmRyb3AobW9uaXRvciwgdGFyZ2V0SWQpIDogdW5kZWZpbmVkO1xuICAgIHZlcmlmeURyb3BSZXN1bHRUeXBlKGRyb3BSZXN1bHQpO1xuICAgIGlmICh0eXBlb2YgZHJvcFJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZHJvcFJlc3VsdCA9IGluZGV4ID09PSAwID8ge30gOiBtb25pdG9yLmdldERyb3BSZXN1bHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRyb3BSZXN1bHQ7XG59XG5mdW5jdGlvbiB2ZXJpZnlEcm9wUmVzdWx0VHlwZShkcm9wUmVzdWx0KSB7XG4gICAgaW52YXJpYW50KHR5cGVvZiBkcm9wUmVzdWx0ID09PSAndW5kZWZpbmVkJyB8fCBpc09iamVjdChkcm9wUmVzdWx0KSwgJ0Ryb3AgcmVzdWx0IG11c3QgZWl0aGVyIGJlIGFuIG9iamVjdCBvciB1bmRlZmluZWQuJyk7XG59XG5mdW5jdGlvbiBnZXREcm9wcGFibGVUYXJnZXRzKG1vbml0b3IpIHtcbiAgICBjb25zdCB0YXJnZXRJZHMgPSBtb25pdG9yLmdldFRhcmdldElkcygpLmZpbHRlcihtb25pdG9yLmNhbkRyb3BPblRhcmdldCwgbW9uaXRvcik7XG4gICAgdGFyZ2V0SWRzLnJldmVyc2UoKTtcbiAgICByZXR1cm4gdGFyZ2V0SWRzO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kcm9wLmpzLm1hcCIsImltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0ByZWFjdC1kbmQvaW52YXJpYW50JztcbmltcG9ydCB7IEVORF9EUkFHIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW5kRHJhZyhtYW5hZ2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGVuZERyYWcoKSB7XG4gICAgICAgIGNvbnN0IG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3IoKTtcbiAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBtYW5hZ2VyLmdldFJlZ2lzdHJ5KCk7XG4gICAgICAgIHZlcmlmeUlzRHJhZ2dpbmcobW9uaXRvcik7XG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gbW9uaXRvci5nZXRTb3VyY2VJZCgpO1xuICAgICAgICBpZiAoc291cmNlSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gcmVnaXN0cnkuZ2V0U291cmNlKHNvdXJjZUlkLCB0cnVlKTtcbiAgICAgICAgICAgIHNvdXJjZS5lbmREcmFnKG1vbml0b3IsIHNvdXJjZUlkKTtcbiAgICAgICAgICAgIHJlZ2lzdHJ5LnVucGluU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IEVORF9EUkFHXG4gICAgICAgIH07XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHZlcmlmeUlzRHJhZ2dpbmcobW9uaXRvcikge1xuICAgIGludmFyaWFudChtb25pdG9yLmlzRHJhZ2dpbmcoKSwgJ0Nhbm5vdCBjYWxsIGVuZERyYWcgd2hpbGUgbm90IGRyYWdnaW5nLicpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbmREcmFnLmpzLm1hcCIsImltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0ByZWFjdC1kbmQvaW52YXJpYW50JztcbmltcG9ydCB7IG1hdGNoZXNUeXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvbWF0Y2hlc1R5cGUuanMnO1xuaW1wb3J0IHsgSE9WRVIgfSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIb3ZlcihtYW5hZ2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGhvdmVyKHRhcmdldElkc0FyZywgeyBjbGllbnRPZmZzZXQgIH0gPSB7fSkge1xuICAgICAgICB2ZXJpZnlUYXJnZXRJZHNJc0FycmF5KHRhcmdldElkc0FyZyk7XG4gICAgICAgIGNvbnN0IHRhcmdldElkcyA9IHRhcmdldElkc0FyZy5zbGljZSgwKTtcbiAgICAgICAgY29uc3QgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvcigpO1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IG1hbmFnZXIuZ2V0UmVnaXN0cnkoKTtcbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW1UeXBlID0gbW9uaXRvci5nZXRJdGVtVHlwZSgpO1xuICAgICAgICByZW1vdmVOb25NYXRjaGluZ1RhcmdldElkcyh0YXJnZXRJZHMsIHJlZ2lzdHJ5LCBkcmFnZ2VkSXRlbVR5cGUpO1xuICAgICAgICBjaGVja0ludmFyaWFudHModGFyZ2V0SWRzLCBtb25pdG9yLCByZWdpc3RyeSk7XG4gICAgICAgIGhvdmVyQWxsVGFyZ2V0cyh0YXJnZXRJZHMsIG1vbml0b3IsIHJlZ2lzdHJ5KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IEhPVkVSLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIHRhcmdldElkcyxcbiAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXQ6IGNsaWVudE9mZnNldCB8fCBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHZlcmlmeVRhcmdldElkc0lzQXJyYXkodGFyZ2V0SWRzQXJnKSB7XG4gICAgaW52YXJpYW50KEFycmF5LmlzQXJyYXkodGFyZ2V0SWRzQXJnKSwgJ0V4cGVjdGVkIHRhcmdldElkcyB0byBiZSBhbiBhcnJheS4nKTtcbn1cbmZ1bmN0aW9uIGNoZWNrSW52YXJpYW50cyh0YXJnZXRJZHMsIG1vbml0b3IsIHJlZ2lzdHJ5KSB7XG4gICAgaW52YXJpYW50KG1vbml0b3IuaXNEcmFnZ2luZygpLCAnQ2Fubm90IGNhbGwgaG92ZXIgd2hpbGUgbm90IGRyYWdnaW5nLicpO1xuICAgIGludmFyaWFudCghbW9uaXRvci5kaWREcm9wKCksICdDYW5ub3QgY2FsbCBob3ZlciBhZnRlciBkcm9wLicpO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0YXJnZXRJZHMubGVuZ3RoOyBpKyspe1xuICAgICAgICBjb25zdCB0YXJnZXRJZCA9IHRhcmdldElkc1tpXTtcbiAgICAgICAgaW52YXJpYW50KHRhcmdldElkcy5sYXN0SW5kZXhPZih0YXJnZXRJZCkgPT09IGksICdFeHBlY3RlZCB0YXJnZXRJZHMgdG8gYmUgdW5pcXVlIGluIHRoZSBwYXNzZWQgYXJyYXkuJyk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHJlZ2lzdHJ5LmdldFRhcmdldCh0YXJnZXRJZCk7XG4gICAgICAgIGludmFyaWFudCh0YXJnZXQsICdFeHBlY3RlZCB0YXJnZXRJZHMgdG8gYmUgcmVnaXN0ZXJlZC4nKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW1vdmVOb25NYXRjaGluZ1RhcmdldElkcyh0YXJnZXRJZHMsIHJlZ2lzdHJ5LCBkcmFnZ2VkSXRlbVR5cGUpIHtcbiAgICAvLyBSZW1vdmUgdGhvc2UgdGFyZ2V0SWRzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIHRhcmdldFR5cGUuICBUaGlzXG4gICAgLy8gZml4ZXMgc2hhbGxvdyBpc092ZXIgd2hpY2ggd291bGQgb25seSBiZSBub24tc2hhbGxvdyBiZWNhdXNlIG9mXG4gICAgLy8gbm9uLW1hdGNoaW5nIHRhcmdldHMuXG4gICAgZm9yKGxldCBpID0gdGFyZ2V0SWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcbiAgICAgICAgY29uc3QgdGFyZ2V0SWQgPSB0YXJnZXRJZHNbaV07XG4gICAgICAgIGNvbnN0IHRhcmdldFR5cGUgPSByZWdpc3RyeS5nZXRUYXJnZXRUeXBlKHRhcmdldElkKTtcbiAgICAgICAgaWYgKCFtYXRjaGVzVHlwZSh0YXJnZXRUeXBlLCBkcmFnZ2VkSXRlbVR5cGUpKSB7XG4gICAgICAgICAgICB0YXJnZXRJZHMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaG92ZXJBbGxUYXJnZXRzKHRhcmdldElkcywgbW9uaXRvciwgcmVnaXN0cnkpIHtcbiAgICAvLyBGaW5hbGx5IGNhbGwgaG92ZXIgb24gYWxsIG1hdGNoaW5nIHRhcmdldHMuXG4gICAgdGFyZ2V0SWRzLmZvckVhY2goZnVuY3Rpb24odGFyZ2V0SWQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcmVnaXN0cnkuZ2V0VGFyZ2V0KHRhcmdldElkKTtcbiAgICAgICAgdGFyZ2V0LmhvdmVyKG1vbml0b3IsIHRhcmdldElkKTtcbiAgICB9KTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aG92ZXIuanMubWFwIiwiaW1wb3J0IHsgY3JlYXRlQmVnaW5EcmFnIH0gZnJvbSAnLi9iZWdpbkRyYWcuanMnO1xuaW1wb3J0IHsgY3JlYXRlRHJvcCB9IGZyb20gJy4vZHJvcC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVFbmREcmFnIH0gZnJvbSAnLi9lbmREcmFnLmpzJztcbmltcG9ydCB7IGNyZWF0ZUhvdmVyIH0gZnJvbSAnLi9ob3Zlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQdWJsaXNoRHJhZ1NvdXJjZSB9IGZyb20gJy4vcHVibGlzaERyYWdTb3VyY2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRHJhZ0Ryb3BBY3Rpb25zKG1hbmFnZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBiZWdpbkRyYWc6IGNyZWF0ZUJlZ2luRHJhZyhtYW5hZ2VyKSxcbiAgICAgICAgcHVibGlzaERyYWdTb3VyY2U6IGNyZWF0ZVB1Ymxpc2hEcmFnU291cmNlKG1hbmFnZXIpLFxuICAgICAgICBob3ZlcjogY3JlYXRlSG92ZXIobWFuYWdlciksXG4gICAgICAgIGRyb3A6IGNyZWF0ZURyb3AobWFuYWdlciksXG4gICAgICAgIGVuZERyYWc6IGNyZWF0ZUVuZERyYWcobWFuYWdlcilcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBJTklUX0NPT1JEUyB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBzZXRDbGllbnRPZmZzZXQoY2xpZW50T2Zmc2V0LCBzb3VyY2VDbGllbnRPZmZzZXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBJTklUX0NPT1JEUyxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgc291cmNlQ2xpZW50T2Zmc2V0OiBzb3VyY2VDbGllbnRPZmZzZXQgfHwgbnVsbCxcbiAgICAgICAgICAgIGNsaWVudE9mZnNldDogY2xpZW50T2Zmc2V0IHx8IG51bGxcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNldENsaWVudE9mZnNldC5qcy5tYXAiLCJpbXBvcnQgeyBQVUJMSVNIX0RSQUdfU09VUkNFIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHVibGlzaERyYWdTb3VyY2UobWFuYWdlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiBwdWJsaXNoRHJhZ1NvdXJjZSgpIHtcbiAgICAgICAgY29uc3QgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvcigpO1xuICAgICAgICBpZiAobW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogUFVCTElTSF9EUkFHX1NPVVJDRVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVibGlzaERyYWdTb3VyY2UuanMubWFwIiwiZXhwb3J0IGNvbnN0IElOSVRfQ09PUkRTID0gJ2RuZC1jb3JlL0lOSVRfQ09PUkRTJztcbmV4cG9ydCBjb25zdCBCRUdJTl9EUkFHID0gJ2RuZC1jb3JlL0JFR0lOX0RSQUcnO1xuZXhwb3J0IGNvbnN0IFBVQkxJU0hfRFJBR19TT1VSQ0UgPSAnZG5kLWNvcmUvUFVCTElTSF9EUkFHX1NPVVJDRSc7XG5leHBvcnQgY29uc3QgSE9WRVIgPSAnZG5kLWNvcmUvSE9WRVInO1xuZXhwb3J0IGNvbnN0IERST1AgPSAnZG5kLWNvcmUvRFJPUCc7XG5leHBvcnQgY29uc3QgRU5EX0RSQUcgPSAnZG5kLWNvcmUvRU5EX0RSQUcnO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCJleHBvcnQgY29uc3QgQUREX1NPVVJDRSA9ICdkbmQtY29yZS9BRERfU09VUkNFJztcbmV4cG9ydCBjb25zdCBBRERfVEFSR0VUID0gJ2RuZC1jb3JlL0FERF9UQVJHRVQnO1xuZXhwb3J0IGNvbnN0IFJFTU9WRV9TT1VSQ0UgPSAnZG5kLWNvcmUvUkVNT1ZFX1NPVVJDRSc7XG5leHBvcnQgY29uc3QgUkVNT1ZFX1RBUkdFVCA9ICdkbmQtY29yZS9SRU1PVkVfVEFSR0VUJztcbmV4cG9ydCBmdW5jdGlvbiBhZGRTb3VyY2Uoc291cmNlSWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBBRERfU09VUkNFLFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBzb3VyY2VJZFxuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhZGRUYXJnZXQodGFyZ2V0SWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBBRERfVEFSR0VULFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICB0YXJnZXRJZFxuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTb3VyY2Uoc291cmNlSWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBSRU1PVkVfU09VUkNFLFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBzb3VyY2VJZFxuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVUYXJnZXQodGFyZ2V0SWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBSRU1PVkVfVEFSR0VULFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICB0YXJnZXRJZFxuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVnaXN0cnkuanMubWFwIiwiaW1wb3J0IHsgY3JlYXRlRHJhZ0Ryb3BBY3Rpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9kcmFnRHJvcC9pbmRleC5qcyc7XG5leHBvcnQgY2xhc3MgRHJhZ0Ryb3BNYW5hZ2VySW1wbCB7XG4gICAgcmVjZWl2ZUJhY2tlbmQoYmFja2VuZCkge1xuICAgICAgICB0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xuICAgIH1cbiAgICBnZXRNb25pdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb25pdG9yO1xuICAgIH1cbiAgICBnZXRCYWNrZW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYWNrZW5kO1xuICAgIH1cbiAgICBnZXRSZWdpc3RyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9uaXRvci5yZWdpc3RyeTtcbiAgICB9XG4gICAgZ2V0QWN0aW9ucygpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzICovIGNvbnN0IG1hbmFnZXIgPSB0aGlzO1xuICAgICAgICBjb25zdCB7IGRpc3BhdGNoICB9ID0gdGhpcy5zdG9yZTtcbiAgICAgICAgZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvbkNyZWF0b3IuYXBwbHkobWFuYWdlciwgYXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3Rpb25zID0gY3JlYXRlRHJhZ0Ryb3BBY3Rpb25zKHRoaXMpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYWN0aW9ucykucmVkdWNlKChib3VuZEFjdGlvbnMsIGtleSk9PntcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvbnNba2V5XTtcbiAgICAgICAgICAgIGJvdW5kQWN0aW9uc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBib3VuZEFjdGlvbnM7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG4gICAgZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc3RvcmUsIG1vbml0b3Ipe1xuICAgICAgICB0aGlzLmlzU2V0VXAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYW5kbGVSZWZDb3VudENoYW5nZSA9ICgpPT57XG4gICAgICAgICAgICBjb25zdCBzaG91bGRTZXRVcCA9IHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5yZWZDb3VudCA+IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5iYWNrZW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFNldFVwICYmICF0aGlzLmlzU2V0VXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kLnNldHVwKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZXRVcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc2hvdWxkU2V0VXAgJiYgdGhpcy5pc1NldFVwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja2VuZC50ZWFyZG93bigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2V0VXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTtcbiAgICAgICAgdGhpcy5tb25pdG9yID0gbW9uaXRvcjtcbiAgICAgICAgc3RvcmUuc3Vic2NyaWJlKHRoaXMuaGFuZGxlUmVmQ291bnRDaGFuZ2UpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RHJhZ0Ryb3BNYW5hZ2VySW1wbC5qcy5tYXAiLCJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAcmVhY3QtZG5kL2ludmFyaWFudCc7XG5pbXBvcnQgeyBnZXREaWZmZXJlbmNlRnJvbUluaXRpYWxPZmZzZXQsIGdldFNvdXJjZUNsaWVudE9mZnNldCB9IGZyb20gJy4uL3V0aWxzL2Nvb3Jkcy5qcyc7XG5pbXBvcnQgeyBhcmVEaXJ0eSB9IGZyb20gJy4uL3V0aWxzL2RpcnRpbmVzcy5qcyc7XG5pbXBvcnQgeyBtYXRjaGVzVHlwZSB9IGZyb20gJy4uL3V0aWxzL21hdGNoZXNUeXBlLmpzJztcbmV4cG9ydCBjbGFzcyBEcmFnRHJvcE1vbml0b3JJbXBsIHtcbiAgICBzdWJzY3JpYmVUb1N0YXRlQ2hhbmdlKGxpc3RlbmVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBoYW5kbGVySWRzICB9ID0gb3B0aW9ucztcbiAgICAgICAgaW52YXJpYW50KHR5cGVvZiBsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJywgJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICAgICAgaW52YXJpYW50KHR5cGVvZiBoYW5kbGVySWRzID09PSAndW5kZWZpbmVkJyB8fCBBcnJheS5pc0FycmF5KGhhbmRsZXJJZHMpLCAnaGFuZGxlcklkcywgd2hlbiBzcGVjaWZpZWQsIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncy4nKTtcbiAgICAgICAgbGV0IHByZXZTdGF0ZUlkID0gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLnN0YXRlSWQ7XG4gICAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICgpPT57XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZUlkID0gc3RhdGUuc3RhdGVJZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FuU2tpcExpc3RlbmVyID0gY3VycmVudFN0YXRlSWQgPT09IHByZXZTdGF0ZUlkIHx8IGN1cnJlbnRTdGF0ZUlkID09PSBwcmV2U3RhdGVJZCArIDEgJiYgIWFyZURpcnR5KHN0YXRlLmRpcnR5SGFuZGxlcklkcywgaGFuZGxlcklkcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5Ta2lwTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHl7XG4gICAgICAgICAgICAgICAgcHJldlN0YXRlSWQgPSBjdXJyZW50U3RhdGVJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICAgIHN1YnNjcmliZVRvT2Zmc2V0Q2hhbmdlKGxpc3RlbmVyKSB7XG4gICAgICAgIGludmFyaWFudCh0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicsICdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgICAgIGxldCBwcmV2aW91c1N0YXRlID0gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPZmZzZXQ7XG4gICAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICgpPT57XG4gICAgICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldDtcbiAgICAgICAgICAgIGlmIChuZXh0U3RhdGUgPT09IHByZXZpb3VzU3RhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2aW91c1N0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgICAgICAgbGlzdGVuZXIoKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICAgIGNhbkRyYWdTb3VyY2Uoc291cmNlSWQpIHtcbiAgICAgICAgaWYgKCFzb3VyY2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMucmVnaXN0cnkuZ2V0U291cmNlKHNvdXJjZUlkKTtcbiAgICAgICAgaW52YXJpYW50KHNvdXJjZSwgYEV4cGVjdGVkIHRvIGZpbmQgYSB2YWxpZCBzb3VyY2UuIHNvdXJjZUlkPSR7c291cmNlSWR9YCk7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2UuY2FuRHJhZyh0aGlzLCBzb3VyY2VJZCk7XG4gICAgfVxuICAgIGNhbkRyb3BPblRhcmdldCh0YXJnZXRJZCkge1xuICAgICAgICAvLyB1bmRlZmluZWQgb24gaW5pdGlhbCByZW5kZXJcbiAgICAgICAgaWYgKCF0YXJnZXRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVnaXN0cnkuZ2V0VGFyZ2V0KHRhcmdldElkKTtcbiAgICAgICAgaW52YXJpYW50KHRhcmdldCwgYEV4cGVjdGVkIHRvIGZpbmQgYSB2YWxpZCB0YXJnZXQuIHRhcmdldElkPSR7dGFyZ2V0SWR9YCk7XG4gICAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKCkgfHwgdGhpcy5kaWREcm9wKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXRUeXBlID0gdGhpcy5yZWdpc3RyeS5nZXRUYXJnZXRUeXBlKHRhcmdldElkKTtcbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW1UeXBlID0gdGhpcy5nZXRJdGVtVHlwZSgpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1R5cGUodGFyZ2V0VHlwZSwgZHJhZ2dlZEl0ZW1UeXBlKSAmJiB0YXJnZXQuY2FuRHJvcCh0aGlzLCB0YXJnZXRJZCk7XG4gICAgfVxuICAgIGlzRHJhZ2dpbmcoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZ2V0SXRlbVR5cGUoKSk7XG4gICAgfVxuICAgIGlzRHJhZ2dpbmdTb3VyY2Uoc291cmNlSWQpIHtcbiAgICAgICAgLy8gdW5kZWZpbmVkIG9uIGluaXRpYWwgcmVuZGVyXG4gICAgICAgIGlmICghc291cmNlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlZ2lzdHJ5LmdldFNvdXJjZShzb3VyY2VJZCwgdHJ1ZSk7XG4gICAgICAgIGludmFyaWFudChzb3VyY2UsIGBFeHBlY3RlZCB0byBmaW5kIGEgdmFsaWQgc291cmNlLiBzb3VyY2VJZD0ke3NvdXJjZUlkfWApO1xuICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpIHx8ICF0aGlzLmlzU291cmNlUHVibGljKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gdGhpcy5yZWdpc3RyeS5nZXRTb3VyY2VUeXBlKHNvdXJjZUlkKTtcbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW1UeXBlID0gdGhpcy5nZXRJdGVtVHlwZSgpO1xuICAgICAgICBpZiAoc291cmNlVHlwZSAhPT0gZHJhZ2dlZEl0ZW1UeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZS5pc0RyYWdnaW5nKHRoaXMsIHNvdXJjZUlkKTtcbiAgICB9XG4gICAgaXNPdmVyVGFyZ2V0KHRhcmdldElkLCBvcHRpb25zID0ge1xuICAgICAgICBzaGFsbG93OiBmYWxzZVxuICAgIH0pIHtcbiAgICAgICAgLy8gdW5kZWZpbmVkIG9uIGluaXRpYWwgcmVuZGVyXG4gICAgICAgIGlmICghdGFyZ2V0SWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNoYWxsb3cgIH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFyZ2V0VHlwZSA9IHRoaXMucmVnaXN0cnkuZ2V0VGFyZ2V0VHlwZSh0YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IGRyYWdnZWRJdGVtVHlwZSA9IHRoaXMuZ2V0SXRlbVR5cGUoKTtcbiAgICAgICAgaWYgKGRyYWdnZWRJdGVtVHlwZSAmJiAhbWF0Y2hlc1R5cGUodGFyZ2V0VHlwZSwgZHJhZ2dlZEl0ZW1UeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldElkcyA9IHRoaXMuZ2V0VGFyZ2V0SWRzKCk7XG4gICAgICAgIGlmICghdGFyZ2V0SWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGFyZ2V0SWRzLmluZGV4T2YodGFyZ2V0SWQpO1xuICAgICAgICBpZiAoc2hhbGxvdykge1xuICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09PSB0YXJnZXRJZHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRleCA+IC0xO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldEl0ZW1UeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPcGVyYXRpb24uaXRlbVR5cGU7XG4gICAgfVxuICAgIGdldEl0ZW0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09wZXJhdGlvbi5pdGVtO1xuICAgIH1cbiAgICBnZXRTb3VyY2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT3BlcmF0aW9uLnNvdXJjZUlkO1xuICAgIH1cbiAgICBnZXRUYXJnZXRJZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09wZXJhdGlvbi50YXJnZXRJZHM7XG4gICAgfVxuICAgIGdldERyb3BSZXN1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09wZXJhdGlvbi5kcm9wUmVzdWx0O1xuICAgIH1cbiAgICBkaWREcm9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPcGVyYXRpb24uZGlkRHJvcDtcbiAgICB9XG4gICAgaXNTb3VyY2VQdWJsaWMoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT3BlcmF0aW9uLmlzU291cmNlUHVibGljKTtcbiAgICB9XG4gICAgZ2V0SW5pdGlhbENsaWVudE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT2Zmc2V0LmluaXRpYWxDbGllbnRPZmZzZXQ7XG4gICAgfVxuICAgIGdldEluaXRpYWxTb3VyY2VDbGllbnRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldC5pbml0aWFsU291cmNlQ2xpZW50T2Zmc2V0O1xuICAgIH1cbiAgICBnZXRDbGllbnRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldC5jbGllbnRPZmZzZXQ7XG4gICAgfVxuICAgIGdldFNvdXJjZUNsaWVudE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNvdXJjZUNsaWVudE9mZnNldCh0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldCk7XG4gICAgfVxuICAgIGdldERpZmZlcmVuY2VGcm9tSW5pdGlhbE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIGdldERpZmZlcmVuY2VGcm9tSW5pdGlhbE9mZnNldCh0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHN0b3JlLCByZWdpc3RyeSl7XG4gICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RHJhZ0Ryb3BNb25pdG9ySW1wbC5qcy5tYXAiLCJpbXBvcnQgeyBhc2FwIH0gZnJvbSAnQHJlYWN0LWRuZC9hc2FwJztcbmltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0ByZWFjdC1kbmQvaW52YXJpYW50JztcbmltcG9ydCB7IGFkZFNvdXJjZSwgYWRkVGFyZ2V0LCByZW1vdmVTb3VyY2UsIHJlbW92ZVRhcmdldCB9IGZyb20gJy4uL2FjdGlvbnMvcmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVTb3VyY2VDb250cmFjdCwgdmFsaWRhdGVUYXJnZXRDb250cmFjdCwgdmFsaWRhdGVUeXBlIH0gZnJvbSAnLi4vY29udHJhY3RzLmpzJztcbmltcG9ydCB7IEhhbmRsZXJSb2xlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy5qcyc7XG5pbXBvcnQgeyBnZXROZXh0VW5pcXVlSWQgfSBmcm9tICcuLi91dGlscy9nZXROZXh0VW5pcXVlSWQuanMnO1xuZnVuY3Rpb24gZ2V0TmV4dEhhbmRsZXJJZChyb2xlKSB7XG4gICAgY29uc3QgaWQgPSBnZXROZXh0VW5pcXVlSWQoKS50b1N0cmluZygpO1xuICAgIHN3aXRjaChyb2xlKXtcbiAgICAgICAgY2FzZSBIYW5kbGVyUm9sZS5TT1VSQ0U6XG4gICAgICAgICAgICByZXR1cm4gYFMke2lkfWA7XG4gICAgICAgIGNhc2UgSGFuZGxlclJvbGUuVEFSR0VUOlxuICAgICAgICAgICAgcmV0dXJuIGBUJHtpZH1gO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEhhbmRsZXIgUm9sZTogJHtyb2xlfWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlUm9sZUZyb21IYW5kbGVySWQoaGFuZGxlcklkKSB7XG4gICAgc3dpdGNoKGhhbmRsZXJJZFswXSl7XG4gICAgICAgIGNhc2UgJ1MnOlxuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZXJSb2xlLlNPVVJDRTtcbiAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICByZXR1cm4gSGFuZGxlclJvbGUuVEFSR0VUO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgaGFuZGxlciBJRDogJHtoYW5kbGVySWR9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWFwQ29udGFpbnNWYWx1ZShtYXAsIHNlYXJjaFZhbHVlKSB7XG4gICAgY29uc3QgZW50cmllcyA9IG1hcC5lbnRyaWVzKCk7XG4gICAgbGV0IGlzRG9uZSA9IGZhbHNlO1xuICAgIGRvIHtcbiAgICAgICAgY29uc3QgeyBkb25lICwgdmFsdWU6IFssIHZhbHVlXSAsICB9ID0gZW50cmllcy5uZXh0KCk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlzRG9uZSA9ICEhZG9uZTtcbiAgICB9d2hpbGUgKCFpc0RvbmUpXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGNsYXNzIEhhbmRsZXJSZWdpc3RyeUltcGwge1xuICAgIGFkZFNvdXJjZSh0eXBlLCBzb3VyY2UpIHtcbiAgICAgICAgdmFsaWRhdGVUeXBlKHR5cGUpO1xuICAgICAgICB2YWxpZGF0ZVNvdXJjZUNvbnRyYWN0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gdGhpcy5hZGRIYW5kbGVyKEhhbmRsZXJSb2xlLlNPVVJDRSwgdHlwZSwgc291cmNlKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChhZGRTb3VyY2Uoc291cmNlSWQpKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUlkO1xuICAgIH1cbiAgICBhZGRUYXJnZXQodHlwZSwgdGFyZ2V0KSB7XG4gICAgICAgIHZhbGlkYXRlVHlwZSh0eXBlLCB0cnVlKTtcbiAgICAgICAgdmFsaWRhdGVUYXJnZXRDb250cmFjdCh0YXJnZXQpO1xuICAgICAgICBjb25zdCB0YXJnZXRJZCA9IHRoaXMuYWRkSGFuZGxlcihIYW5kbGVyUm9sZS5UQVJHRVQsIHR5cGUsIHRhcmdldCk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goYWRkVGFyZ2V0KHRhcmdldElkKSk7XG4gICAgICAgIHJldHVybiB0YXJnZXRJZDtcbiAgICB9XG4gICAgY29udGFpbnNIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIG1hcENvbnRhaW5zVmFsdWUodGhpcy5kcmFnU291cmNlcywgaGFuZGxlcikgfHwgbWFwQ29udGFpbnNWYWx1ZSh0aGlzLmRyb3BUYXJnZXRzLCBoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0U291cmNlKHNvdXJjZUlkLCBpbmNsdWRlUGlubmVkID0gZmFsc2UpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNTb3VyY2VJZChzb3VyY2VJZCksICdFeHBlY3RlZCBhIHZhbGlkIHNvdXJjZSBJRC4nKTtcbiAgICAgICAgY29uc3QgaXNQaW5uZWQgPSBpbmNsdWRlUGlubmVkICYmIHNvdXJjZUlkID09PSB0aGlzLnBpbm5lZFNvdXJjZUlkO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBpc1Bpbm5lZCA/IHRoaXMucGlubmVkU291cmNlIDogdGhpcy5kcmFnU291cmNlcy5nZXQoc291cmNlSWQpO1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgICBnZXRUYXJnZXQodGFyZ2V0SWQpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNUYXJnZXRJZCh0YXJnZXRJZCksICdFeHBlY3RlZCBhIHZhbGlkIHRhcmdldCBJRC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcFRhcmdldHMuZ2V0KHRhcmdldElkKTtcbiAgICB9XG4gICAgZ2V0U291cmNlVHlwZShzb3VyY2VJZCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1NvdXJjZUlkKHNvdXJjZUlkKSwgJ0V4cGVjdGVkIGEgdmFsaWQgc291cmNlIElELicpO1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlcy5nZXQoc291cmNlSWQpO1xuICAgIH1cbiAgICBnZXRUYXJnZXRUeXBlKHRhcmdldElkKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzVGFyZ2V0SWQodGFyZ2V0SWQpLCAnRXhwZWN0ZWQgYSB2YWxpZCB0YXJnZXQgSUQuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVzLmdldCh0YXJnZXRJZCk7XG4gICAgfVxuICAgIGlzU291cmNlSWQoaGFuZGxlcklkKSB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBwYXJzZVJvbGVGcm9tSGFuZGxlcklkKGhhbmRsZXJJZCk7XG4gICAgICAgIHJldHVybiByb2xlID09PSBIYW5kbGVyUm9sZS5TT1VSQ0U7XG4gICAgfVxuICAgIGlzVGFyZ2V0SWQoaGFuZGxlcklkKSB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBwYXJzZVJvbGVGcm9tSGFuZGxlcklkKGhhbmRsZXJJZCk7XG4gICAgICAgIHJldHVybiByb2xlID09PSBIYW5kbGVyUm9sZS5UQVJHRVQ7XG4gICAgfVxuICAgIHJlbW92ZVNvdXJjZShzb3VyY2VJZCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5nZXRTb3VyY2Uoc291cmNlSWQpLCAnRXhwZWN0ZWQgYW4gZXhpc3Rpbmcgc291cmNlLicpO1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJlbW92ZVNvdXJjZShzb3VyY2VJZCkpO1xuICAgICAgICBhc2FwKCgpPT57XG4gICAgICAgICAgICB0aGlzLmRyYWdTb3VyY2VzLmRlbGV0ZShzb3VyY2VJZCk7XG4gICAgICAgICAgICB0aGlzLnR5cGVzLmRlbGV0ZShzb3VyY2VJZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXQodGFyZ2V0SWQpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuZ2V0VGFyZ2V0KHRhcmdldElkKSwgJ0V4cGVjdGVkIGFuIGV4aXN0aW5nIHRhcmdldC4nKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChyZW1vdmVUYXJnZXQodGFyZ2V0SWQpKTtcbiAgICAgICAgdGhpcy5kcm9wVGFyZ2V0cy5kZWxldGUodGFyZ2V0SWQpO1xuICAgICAgICB0aGlzLnR5cGVzLmRlbGV0ZSh0YXJnZXRJZCk7XG4gICAgfVxuICAgIHBpblNvdXJjZShzb3VyY2VJZCkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmdldFNvdXJjZShzb3VyY2VJZCk7XG4gICAgICAgIGludmFyaWFudChzb3VyY2UsICdFeHBlY3RlZCBhbiBleGlzdGluZyBzb3VyY2UuJyk7XG4gICAgICAgIHRoaXMucGlubmVkU291cmNlSWQgPSBzb3VyY2VJZDtcbiAgICAgICAgdGhpcy5waW5uZWRTb3VyY2UgPSBzb3VyY2U7XG4gICAgfVxuICAgIHVucGluU291cmNlKCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5waW5uZWRTb3VyY2UsICdObyBzb3VyY2UgaXMgcGlubmVkIGF0IHRoZSB0aW1lLicpO1xuICAgICAgICB0aGlzLnBpbm5lZFNvdXJjZUlkID0gbnVsbDtcbiAgICAgICAgdGhpcy5waW5uZWRTb3VyY2UgPSBudWxsO1xuICAgIH1cbiAgICBhZGRIYW5kbGVyKHJvbGUsIHR5cGUsIGhhbmRsZXIpIHtcbiAgICAgICAgY29uc3QgaWQgPSBnZXROZXh0SGFuZGxlcklkKHJvbGUpO1xuICAgICAgICB0aGlzLnR5cGVzLnNldChpZCwgdHlwZSk7XG4gICAgICAgIGlmIChyb2xlID09PSBIYW5kbGVyUm9sZS5TT1VSQ0UpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1NvdXJjZXMuc2V0KGlkLCBoYW5kbGVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBIYW5kbGVyUm9sZS5UQVJHRVQpIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcFRhcmdldHMuc2V0KGlkLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHN0b3JlKXtcbiAgICAgICAgdGhpcy50eXBlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5kcm9wVGFyZ2V0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5waW5uZWRTb3VyY2VJZCA9IG51bGw7XG4gICAgICAgIHRoaXMucGlubmVkU291cmNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SGFuZGxlclJlZ2lzdHJ5SW1wbC5qcy5tYXAiLCJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAcmVhY3QtZG5kL2ludmFyaWFudCc7XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTb3VyY2VDb250cmFjdChzb3VyY2UpIHtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHNvdXJjZS5jYW5EcmFnID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgY2FuRHJhZyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIGludmFyaWFudCh0eXBlb2Ygc291cmNlLmJlZ2luRHJhZyA9PT0gJ2Z1bmN0aW9uJywgJ0V4cGVjdGVkIGJlZ2luRHJhZyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIGludmFyaWFudCh0eXBlb2Ygc291cmNlLmVuZERyYWcgPT09ICdmdW5jdGlvbicsICdFeHBlY3RlZCBlbmREcmFnIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUYXJnZXRDb250cmFjdCh0YXJnZXQpIHtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHRhcmdldC5jYW5Ecm9wID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgY2FuRHJvcCB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIGludmFyaWFudCh0eXBlb2YgdGFyZ2V0LmhvdmVyID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgaG92ZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHRhcmdldC5kcm9wID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgYmVnaW5EcmFnIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUeXBlKHR5cGUsIGFsbG93QXJyYXkpIHtcbiAgICBpZiAoYWxsb3dBcnJheSAmJiBBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICAgIHR5cGUuZm9yRWFjaCgodCk9PnZhbGlkYXRlVHlwZSh0LCBmYWxzZSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnZhcmlhbnQodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnc3ltYm9sJywgYWxsb3dBcnJheSA/ICdUeXBlIGNhbiBvbmx5IGJlIGEgc3RyaW5nLCBhIHN5bWJvbCwgb3IgYW4gYXJyYXkgb2YgZWl0aGVyLicgOiAnVHlwZSBjYW4gb25seSBiZSBhIHN0cmluZyBvciBhIHN5bWJvbC4nKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udHJhY3RzLmpzLm1hcCIsImltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BNYW5hZ2VySW1wbCB9IGZyb20gJy4vY2xhc3Nlcy9EcmFnRHJvcE1hbmFnZXJJbXBsLmpzJztcbmltcG9ydCB7IERyYWdEcm9wTW9uaXRvckltcGwgfSBmcm9tICcuL2NsYXNzZXMvRHJhZ0Ryb3BNb25pdG9ySW1wbC5qcyc7XG5pbXBvcnQgeyBIYW5kbGVyUmVnaXN0cnlJbXBsIH0gZnJvbSAnLi9jbGFzc2VzL0hhbmRsZXJSZWdpc3RyeUltcGwuanMnO1xuaW1wb3J0IHsgcmVkdWNlIH0gZnJvbSAnLi9yZWR1Y2Vycy9pbmRleC5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRHJhZ0Ryb3BNYW5hZ2VyKGJhY2tlbmRGYWN0b3J5LCBnbG9iYWxDb250ZXh0ID0gdW5kZWZpbmVkLCBiYWNrZW5kT3B0aW9ucyA9IHt9LCBkZWJ1Z01vZGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IHN0b3JlID0gbWFrZVN0b3JlSW5zdGFuY2UoZGVidWdNb2RlKTtcbiAgICBjb25zdCBtb25pdG9yID0gbmV3IERyYWdEcm9wTW9uaXRvckltcGwoc3RvcmUsIG5ldyBIYW5kbGVyUmVnaXN0cnlJbXBsKHN0b3JlKSk7XG4gICAgY29uc3QgbWFuYWdlciA9IG5ldyBEcmFnRHJvcE1hbmFnZXJJbXBsKHN0b3JlLCBtb25pdG9yKTtcbiAgICBjb25zdCBiYWNrZW5kID0gYmFja2VuZEZhY3RvcnkobWFuYWdlciwgZ2xvYmFsQ29udGV4dCwgYmFja2VuZE9wdGlvbnMpO1xuICAgIG1hbmFnZXIucmVjZWl2ZUJhY2tlbmQoYmFja2VuZCk7XG4gICAgcmV0dXJuIG1hbmFnZXI7XG59XG5mdW5jdGlvbiBtYWtlU3RvcmVJbnN0YW5jZShkZWJ1Z01vZGUpIHtcbiAgICAvLyBUT0RPOiBpZiB3ZSBldmVyIG1ha2UgYSByZWFjdC1uYXRpdmUgdmVyc2lvbiBvZiB0aGlzLFxuICAgIC8vIHdlJ2xsIG5lZWQgdG8gY29uc2lkZXIgaG93IHRvIHB1bGwgb2ZmIGRldi10b29saW5nXG4gICAgY29uc3QgcmVkdXhEZXZUb29scyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fO1xuICAgIHJldHVybiBjcmVhdGVTdG9yZShyZWR1Y2UsIGRlYnVnTW9kZSAmJiByZWR1eERldlRvb2xzICYmIHJlZHV4RGV2VG9vbHMoe1xuICAgICAgICBuYW1lOiAnZG5kLWNvcmUnLFxuICAgICAgICBpbnN0YW5jZUlkOiAnZG5kLWNvcmUnXG4gICAgfSkpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jcmVhdGVEcmFnRHJvcE1hbmFnZXIuanMubWFwIiwiZXhwb3J0IHZhciBIYW5kbGVyUm9sZTtcbihmdW5jdGlvbihIYW5kbGVyUm9sZSkge1xuICAgIEhhbmRsZXJSb2xlW1wiU09VUkNFXCJdID0gXCJTT1VSQ0VcIjtcbiAgICBIYW5kbGVyUm9sZVtcIlRBUkdFVFwiXSA9IFwiVEFSR0VUXCI7XG59KShIYW5kbGVyUm9sZSB8fCAoSGFuZGxlclJvbGUgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcmZhY2VzLmpzLm1hcCIsImltcG9ydCB7IEJFR0lOX0RSQUcsIERST1AsIEVORF9EUkFHLCBIT1ZFUiwgUFVCTElTSF9EUkFHX1NPVVJDRSB9IGZyb20gJy4uL2FjdGlvbnMvZHJhZ0Ryb3AvaW5kZXguanMnO1xuaW1wb3J0IHsgQUREX1NPVVJDRSwgQUREX1RBUkdFVCwgUkVNT1ZFX1NPVVJDRSwgUkVNT1ZFX1RBUkdFVCB9IGZyb20gJy4uL2FjdGlvbnMvcmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgQUxMLCBOT05FIH0gZnJvbSAnLi4vdXRpbHMvZGlydGluZXNzLmpzJztcbmltcG9ydCB7IGFyZUFycmF5c0VxdWFsIH0gZnJvbSAnLi4vdXRpbHMvZXF1YWxpdHkuanMnO1xuaW1wb3J0IHsgeG9yIH0gZnJvbSAnLi4vdXRpbHMvanNfdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZSgvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5fc3RhdGUgPSBOT05FLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2goYWN0aW9uLnR5cGUpe1xuICAgICAgICBjYXNlIEhPVkVSOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQUREX1NPVVJDRTpcbiAgICAgICAgY2FzZSBBRERfVEFSR0VUOlxuICAgICAgICBjYXNlIFJFTU9WRV9UQVJHRVQ6XG4gICAgICAgIGNhc2UgUkVNT1ZFX1NPVVJDRTpcbiAgICAgICAgICAgIHJldHVybiBOT05FO1xuICAgICAgICBjYXNlIEJFR0lOX0RSQUc6XG4gICAgICAgIGNhc2UgUFVCTElTSF9EUkFHX1NPVVJDRTpcbiAgICAgICAgY2FzZSBFTkRfRFJBRzpcbiAgICAgICAgY2FzZSBEUk9QOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIEFMTDtcbiAgICB9XG4gICAgY29uc3QgeyB0YXJnZXRJZHMgPVtdICwgcHJldlRhcmdldElkcyA9W10gIH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICBjb25zdCByZXN1bHQgPSB4b3IodGFyZ2V0SWRzLCBwcmV2VGFyZ2V0SWRzKTtcbiAgICBjb25zdCBkaWRDaGFuZ2UgPSByZXN1bHQubGVuZ3RoID4gMCB8fCAhYXJlQXJyYXlzRXF1YWwodGFyZ2V0SWRzLCBwcmV2VGFyZ2V0SWRzKTtcbiAgICBpZiAoIWRpZENoYW5nZSkge1xuICAgICAgICByZXR1cm4gTk9ORTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgdGhlIHRhcmdldCBpZHMgYXQgdGhlIGlubmVybW9zdCBwb3NpdGlvbi4gSWYgdGhleSBhcmUgdmFsaWQsIGFkZCB0aGVtXG4gICAgLy8gdG8gdGhlIHJlc3VsdFxuICAgIGNvbnN0IHByZXZJbm5lcm1vc3RUYXJnZXRJZCA9IHByZXZUYXJnZXRJZHNbcHJldlRhcmdldElkcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBpbm5lcm1vc3RUYXJnZXRJZCA9IHRhcmdldElkc1t0YXJnZXRJZHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKHByZXZJbm5lcm1vc3RUYXJnZXRJZCAhPT0gaW5uZXJtb3N0VGFyZ2V0SWQpIHtcbiAgICAgICAgaWYgKHByZXZJbm5lcm1vc3RUYXJnZXRJZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocHJldklubmVybW9zdFRhcmdldElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5uZXJtb3N0VGFyZ2V0SWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGlubmVybW9zdFRhcmdldElkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXJ0eUhhbmRsZXJJZHMuanMubWFwIiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICAgICAgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uKHN5bSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmltcG9ydCB7IEJFR0lOX0RSQUcsIERST1AsIEVORF9EUkFHLCBIT1ZFUiwgSU5JVF9DT09SRFMgfSBmcm9tICcuLi9hY3Rpb25zL2RyYWdEcm9wL2luZGV4LmpzJztcbmltcG9ydCB7IGFyZUNvb3Jkc0VxdWFsIH0gZnJvbSAnLi4vdXRpbHMvZXF1YWxpdHkuanMnO1xuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICAgIGluaXRpYWxTb3VyY2VDbGllbnRPZmZzZXQ6IG51bGwsXG4gICAgaW5pdGlhbENsaWVudE9mZnNldDogbnVsbCxcbiAgICBjbGllbnRPZmZzZXQ6IG51bGxcbn07XG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgICBjb25zdCB7IHBheWxvYWQgIH0gPSBhY3Rpb247XG4gICAgc3dpdGNoKGFjdGlvbi50eXBlKXtcbiAgICAgICAgY2FzZSBJTklUX0NPT1JEUzpcbiAgICAgICAgY2FzZSBCRUdJTl9EUkFHOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpbml0aWFsU291cmNlQ2xpZW50T2Zmc2V0OiBwYXlsb2FkLnNvdXJjZUNsaWVudE9mZnNldCxcbiAgICAgICAgICAgICAgICBpbml0aWFsQ2xpZW50T2Zmc2V0OiBwYXlsb2FkLmNsaWVudE9mZnNldCxcbiAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXQ6IHBheWxvYWQuY2xpZW50T2Zmc2V0XG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEhPVkVSOlxuICAgICAgICAgICAgaWYgKGFyZUNvb3Jkc0VxdWFsKHN0YXRlLmNsaWVudE9mZnNldCwgcGF5bG9hZC5jbGllbnRPZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7XG4gICAgICAgICAgICAgICAgY2xpZW50T2Zmc2V0OiBwYXlsb2FkLmNsaWVudE9mZnNldFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgRU5EX0RSQUc6XG4gICAgICAgIGNhc2UgRFJPUDpcbiAgICAgICAgICAgIHJldHVybiBpbml0aWFsU3RhdGU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kcmFnT2Zmc2V0LmpzLm1hcCIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgICBmb3IodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbihzeW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5pbXBvcnQgeyBCRUdJTl9EUkFHLCBEUk9QLCBFTkRfRFJBRywgSE9WRVIsIFBVQkxJU0hfRFJBR19TT1VSQ0UgfSBmcm9tICcuLi9hY3Rpb25zL2RyYWdEcm9wL2luZGV4LmpzJztcbmltcG9ydCB7IFJFTU9WRV9UQVJHRVQgfSBmcm9tICcuLi9hY3Rpb25zL3JlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IHdpdGhvdXQgfSBmcm9tICcuLi91dGlscy9qc191dGlscy5qcyc7XG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgaXRlbVR5cGU6IG51bGwsXG4gICAgaXRlbTogbnVsbCxcbiAgICBzb3VyY2VJZDogbnVsbCxcbiAgICB0YXJnZXRJZHM6IFtdLFxuICAgIGRyb3BSZXN1bHQ6IG51bGwsXG4gICAgZGlkRHJvcDogZmFsc2UsXG4gICAgaXNTb3VyY2VQdWJsaWM6IG51bGxcbn07XG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgICBjb25zdCB7IHBheWxvYWQgIH0gPSBhY3Rpb247XG4gICAgc3dpdGNoKGFjdGlvbi50eXBlKXtcbiAgICAgICAgY2FzZSBCRUdJTl9EUkFHOlxuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGU6IHBheWxvYWQuaXRlbVR5cGUsXG4gICAgICAgICAgICAgICAgaXRlbTogcGF5bG9hZC5pdGVtLFxuICAgICAgICAgICAgICAgIHNvdXJjZUlkOiBwYXlsb2FkLnNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIGlzU291cmNlUHVibGljOiBwYXlsb2FkLmlzU291cmNlUHVibGljLFxuICAgICAgICAgICAgICAgIGRyb3BSZXN1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgZGlkRHJvcDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFBVQkxJU0hfRFJBR19TT1VSQ0U6XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHtcbiAgICAgICAgICAgICAgICBpc1NvdXJjZVB1YmxpYzogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgSE9WRVI6XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRJZHM6IHBheWxvYWQudGFyZ2V0SWRzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBSRU1PVkVfVEFSR0VUOlxuICAgICAgICAgICAgaWYgKHN0YXRlLnRhcmdldElkcy5pbmRleE9mKHBheWxvYWQudGFyZ2V0SWQpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICAgICAgICAgIHRhcmdldElkczogd2l0aG91dChzdGF0ZS50YXJnZXRJZHMsIHBheWxvYWQudGFyZ2V0SWQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBEUk9QOlxuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7XG4gICAgICAgICAgICAgICAgZHJvcFJlc3VsdDogcGF5bG9hZC5kcm9wUmVzdWx0LFxuICAgICAgICAgICAgICAgIGRpZERyb3A6IHRydWUsXG4gICAgICAgICAgICAgICAgdGFyZ2V0SWRzOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgRU5EX0RSQUc6XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZTogbnVsbCxcbiAgICAgICAgICAgICAgICBpdGVtOiBudWxsLFxuICAgICAgICAgICAgICAgIHNvdXJjZUlkOiBudWxsLFxuICAgICAgICAgICAgICAgIGRyb3BSZXN1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgZGlkRHJvcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNTb3VyY2VQdWJsaWM6IG51bGwsXG4gICAgICAgICAgICAgICAgdGFyZ2V0SWRzOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kcmFnT3BlcmF0aW9uLmpzLm1hcCIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgICBmb3IodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbihzeW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5pbXBvcnQgeyBnZXQgfSBmcm9tICcuLi91dGlscy9qc191dGlscy5qcyc7XG5pbXBvcnQgeyByZWR1Y2UgYXMgZGlydHlIYW5kbGVySWRzIH0gZnJvbSAnLi9kaXJ0eUhhbmRsZXJJZHMuanMnO1xuaW1wb3J0IHsgcmVkdWNlIGFzIGRyYWdPZmZzZXQgfSBmcm9tICcuL2RyYWdPZmZzZXQuanMnO1xuaW1wb3J0IHsgcmVkdWNlIGFzIGRyYWdPcGVyYXRpb24gfSBmcm9tICcuL2RyYWdPcGVyYXRpb24uanMnO1xuaW1wb3J0IHsgcmVkdWNlIGFzIHJlZkNvdW50IH0gZnJvbSAnLi9yZWZDb3VudC5qcyc7XG5pbXBvcnQgeyByZWR1Y2UgYXMgc3RhdGVJZCB9IGZyb20gJy4vc3RhdGVJZC5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKHN0YXRlID0ge30sIGFjdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRpcnR5SGFuZGxlcklkczogZGlydHlIYW5kbGVySWRzKHN0YXRlLmRpcnR5SGFuZGxlcklkcywge1xuICAgICAgICAgICAgdHlwZTogYWN0aW9uLnR5cGUsXG4gICAgICAgICAgICBwYXlsb2FkOiBfb2JqZWN0U3ByZWFkKHt9LCBhY3Rpb24ucGF5bG9hZCwge1xuICAgICAgICAgICAgICAgIHByZXZUYXJnZXRJZHM6IGdldChzdGF0ZSwgJ2RyYWdPcGVyYXRpb24udGFyZ2V0SWRzJywgW10pXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KSxcbiAgICAgICAgZHJhZ09mZnNldDogZHJhZ09mZnNldChzdGF0ZS5kcmFnT2Zmc2V0LCBhY3Rpb24pLFxuICAgICAgICByZWZDb3VudDogcmVmQ291bnQoc3RhdGUucmVmQ291bnQsIGFjdGlvbiksXG4gICAgICAgIGRyYWdPcGVyYXRpb246IGRyYWdPcGVyYXRpb24oc3RhdGUuZHJhZ09wZXJhdGlvbiwgYWN0aW9uKSxcbiAgICAgICAgc3RhdGVJZDogc3RhdGVJZChzdGF0ZS5zdGF0ZUlkKVxuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IEFERF9TT1VSQ0UsIEFERF9UQVJHRVQsIFJFTU9WRV9TT1VSQ0UsIFJFTU9WRV9UQVJHRVQgfSBmcm9tICcuLi9hY3Rpb25zL3JlZ2lzdHJ5LmpzJztcbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2Uoc3RhdGUgPSAwLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2goYWN0aW9uLnR5cGUpe1xuICAgICAgICBjYXNlIEFERF9TT1VSQ0U6XG4gICAgICAgIGNhc2UgQUREX1RBUkdFVDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZSArIDE7XG4gICAgICAgIGNhc2UgUkVNT1ZFX1NPVVJDRTpcbiAgICAgICAgY2FzZSBSRU1PVkVfVEFSR0VUOlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIC0gMTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZkNvdW50LmpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiByZWR1Y2Uoc3RhdGUgPSAwKSB7XG4gICAgcmV0dXJuIHN0YXRlICsgMTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RhdGVJZC5qcy5tYXAiLCIvKipcbiAqIENvb3JkaW5hdGUgYWRkaXRpb25cbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBjb29yZGluYXRlXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGNvb3JkaW5hdGVcbiAqLyBleHBvcnQgZnVuY3Rpb24gYWRkKGEsIGIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBhLnggKyBiLngsXG4gICAgICAgIHk6IGEueSArIGIueVxuICAgIH07XG59XG4vKipcbiAqIENvb3JkaW5hdGUgc3VidHJhY3Rpb25cbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBjb29yZGluYXRlXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGNvb3JkaW5hdGVcbiAqLyBleHBvcnQgZnVuY3Rpb24gc3VidHJhY3QoYSwgYikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGEueCAtIGIueCxcbiAgICAgICAgeTogYS55IC0gYi55XG4gICAgfTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY2FydGVzaWFuIGRpc3RhbmNlIG9mIHRoZSBkcmFnIHNvdXJjZSBjb21wb25lbnQncyBwb3NpdGlvbiwgYmFzZWQgb24gaXRzIHBvc2l0aW9uXG4gKiBhdCB0aGUgdGltZSB3aGVuIHRoZSBjdXJyZW50IGRyYWcgb3BlcmF0aW9uIGhhcyBzdGFydGVkLCBhbmQgdGhlIG1vdmVtZW50IGRpZmZlcmVuY2UuXG4gKlxuICogUmV0dXJucyBudWxsIGlmIG5vIGl0ZW0gaXMgYmVpbmcgZHJhZ2dlZC5cbiAqXG4gKiBAcGFyYW0gc3RhdGUgVGhlIG9mZnNldCBzdGF0ZSB0byBjb21wdXRlIGZyb21cbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlQ2xpZW50T2Zmc2V0KHN0YXRlKSB7XG4gICAgY29uc3QgeyBjbGllbnRPZmZzZXQgLCBpbml0aWFsQ2xpZW50T2Zmc2V0ICwgaW5pdGlhbFNvdXJjZUNsaWVudE9mZnNldCAgfSA9IHN0YXRlO1xuICAgIGlmICghY2xpZW50T2Zmc2V0IHx8ICFpbml0aWFsQ2xpZW50T2Zmc2V0IHx8ICFpbml0aWFsU291cmNlQ2xpZW50T2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gc3VidHJhY3QoYWRkKGNsaWVudE9mZnNldCwgaW5pdGlhbFNvdXJjZUNsaWVudE9mZnNldCksIGluaXRpYWxDbGllbnRPZmZzZXQpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSB4LHkgb2Zmc2V0IGJldHdlZW4gdGhlIGNsaWVudCBvZmZzZXQgYW5kIHRoZSBpbml0aWFsIGNsaWVudCBvZmZzZXRcbiAqXG4gKiBAcGFyYW0gc3RhdGUgVGhlIG9mZnNldCBzdGF0ZSB0byBjb21wdXRlIGZyb21cbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RGlmZmVyZW5jZUZyb21Jbml0aWFsT2Zmc2V0KHN0YXRlKSB7XG4gICAgY29uc3QgeyBjbGllbnRPZmZzZXQgLCBpbml0aWFsQ2xpZW50T2Zmc2V0ICB9ID0gc3RhdGU7XG4gICAgaWYgKCFjbGllbnRPZmZzZXQgfHwgIWluaXRpYWxDbGllbnRPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBzdWJ0cmFjdChjbGllbnRPZmZzZXQsIGluaXRpYWxDbGllbnRPZmZzZXQpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb29yZHMuanMubWFwIiwiaW1wb3J0IHsgaW50ZXJzZWN0aW9uIH0gZnJvbSAnLi9qc191dGlscy5qcyc7XG5leHBvcnQgY29uc3QgTk9ORSA9IFtdO1xuZXhwb3J0IGNvbnN0IEFMTCA9IFtdO1xuTk9ORS5fX0lTX05PTkVfXyA9IHRydWU7XG5BTEwuX19JU19BTExfXyA9IHRydWU7XG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGhhbmRsZXIgSURzIGFyZSBkaXJ0eSBvciBub3QuXG4gKlxuICogQHBhcmFtIGRpcnR5SWRzIFRoZSBzZXQgb2YgZGlydHkgaGFuZGxlciBpZHNcbiAqIEBwYXJhbSBoYW5kbGVySWRzIFRoZSBzZXQgb2YgaGFuZGxlciBpZHMgdG8gY2hlY2tcbiAqLyBleHBvcnQgZnVuY3Rpb24gYXJlRGlydHkoZGlydHlJZHMsIGhhbmRsZXJJZHMpIHtcbiAgICBpZiAoZGlydHlJZHMgPT09IE5PTkUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGlydHlJZHMgPT09IEFMTCB8fCB0eXBlb2YgaGFuZGxlcklkcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGNvbW1vbklkcyA9IGludGVyc2VjdGlvbihoYW5kbGVySWRzLCBkaXJ0eUlkcyk7XG4gICAgcmV0dXJuIGNvbW1vbklkcy5sZW5ndGggPiAwO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXJ0aW5lc3MuanMubWFwIiwiZXhwb3J0IGNvbnN0IHN0cmljdEVxdWFsaXR5ID0gKGEsIGIpPT5hID09PSBiXG47XG4vKipcbiAqIERldGVybWluZSBpZiB0d28gY2FydGVzaWFuIGNvb3JkaW5hdGUgb2Zmc2V0cyBhcmUgZXF1YWxcbiAqIEBwYXJhbSBvZmZzZXRBXG4gKiBAcGFyYW0gb2Zmc2V0QlxuICovIGV4cG9ydCBmdW5jdGlvbiBhcmVDb29yZHNFcXVhbChvZmZzZXRBLCBvZmZzZXRCKSB7XG4gICAgaWYgKCFvZmZzZXRBICYmICFvZmZzZXRCKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIW9mZnNldEEgfHwgIW9mZnNldEIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBvZmZzZXRBLnggPT09IG9mZnNldEIueCAmJiBvZmZzZXRBLnkgPT09IG9mZnNldEIueTtcbiAgICB9XG59XG4vKipcbiAqIERldGVybWluZXMgaWYgdHdvIGFycmF5cyBvZiBpdGVtcyBhcmUgZXF1YWxcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBhcnJheSBvZiBpdGVtc1xuICogQHBhcmFtIGIgVGhlIHNlY29uZCBhcnJheSBvZiBpdGVtc1xuICovIGV4cG9ydCBmdW5jdGlvbiBhcmVBcnJheXNFcXVhbChhLCBiLCBpc0VxdWFsID0gc3RyaWN0RXF1YWxpdHkpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpe1xuICAgICAgICBpZiAoIWlzRXF1YWwoYVtpXSwgYltpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXF1YWxpdHkuanMubWFwIiwibGV0IG5leHRVbmlxdWVJZCA9IDA7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dFVuaXF1ZUlkKCkge1xuICAgIHJldHVybiBuZXh0VW5pcXVlSWQrKztcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0TmV4dFVuaXF1ZUlkLmpzLm1hcCIsIi8vIGNoZWFwIGxvZGFzaCByZXBsYWNlbWVudHNcbi8qKlxuICogZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgXy5nZXRcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSBwYXRoXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldChvYmosIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChhLCBjKT0+YSAmJiBhW2NdID8gYVtjXSA6IGRlZmF1bHRWYWx1ZSB8fCBudWxsXG4gICAgLCBvYmopO1xufVxuLyoqXG4gKiBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBfLndpdGhvdXRcbiAqLyBleHBvcnQgZnVuY3Rpb24gd2l0aG91dChpdGVtcywgaXRlbSkge1xuICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGkpPT5pICE9PSBpdGVtXG4gICAgKTtcbn1cbi8qKlxuICogZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgXy5pc1N0cmluZ1xuICogQHBhcmFtIGlucHV0XG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKGlucHV0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7XG59XG4vKipcbiAqIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIF8uaXNTdHJpbmdcbiAqIEBwYXJhbSBpbnB1dFxuICovIGV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChpbnB1dCkge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnO1xufVxuLyoqXG4gKiByZXBsYWNlbWVudCBmb3IgXy54b3JcbiAqIEBwYXJhbSBpdGVtc0FcbiAqIEBwYXJhbSBpdGVtc0JcbiAqLyBleHBvcnQgZnVuY3Rpb24geG9yKGl0ZW1zQSwgaXRlbXNCKSB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGluc2VydEl0ZW0gPSAoaXRlbSk9PntcbiAgICAgICAgbWFwLnNldChpdGVtLCBtYXAuaGFzKGl0ZW0pID8gbWFwLmdldChpdGVtKSArIDEgOiAxKTtcbiAgICB9O1xuICAgIGl0ZW1zQS5mb3JFYWNoKGluc2VydEl0ZW0pO1xuICAgIGl0ZW1zQi5mb3JFYWNoKGluc2VydEl0ZW0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIG1hcC5mb3JFYWNoKChjb3VudCwga2V5KT0+e1xuICAgICAgICBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiByZXBsYWNlbWVudCBmb3IgXy5pbnRlcnNlY3Rpb25cbiAqIEBwYXJhbSBpdGVtc0FcbiAqIEBwYXJhbSBpdGVtc0JcbiAqLyBleHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0aW9uKGl0ZW1zQSwgaXRlbXNCKSB7XG4gICAgcmV0dXJuIGl0ZW1zQS5maWx0ZXIoKHQpPT5pdGVtc0IuaW5kZXhPZih0KSA+IC0xXG4gICAgKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9anNfdXRpbHMuanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNUeXBlKHRhcmdldFR5cGUsIGRyYWdnZWRJdGVtVHlwZSkge1xuICAgIGlmIChkcmFnZ2VkSXRlbVR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFR5cGUgPT09IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldFR5cGUpID8gdGFyZ2V0VHlwZS5zb21lKCh0KT0+dCA9PT0gZHJhZ2dlZEl0ZW1UeXBlXG4gICAgKSA6IHRhcmdldFR5cGUgPT09IGRyYWdnZWRJdGVtVHlwZTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0Y2hlc1R5cGUuanMubWFwIiwiZnVuY3Rpb24gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSAtIGZpbGUgc2l6ZSBoYWNrc1xuICAgICAgICByZXF1ZXN0Lm9uY29tcGxldGUgPSByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxdWVzdC5yZXN1bHQpO1xuICAgICAgICAvLyBAdHMtaWdub3JlIC0gZmlsZSBzaXplIGhhY2tzXG4gICAgICAgIHJlcXVlc3Qub25hYm9ydCA9IHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKGRiTmFtZSwgc3RvcmVOYW1lKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKGRiTmFtZSk7XG4gICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiByZXF1ZXN0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgIGNvbnN0IGRicCA9IHByb21pc2lmeVJlcXVlc3QocmVxdWVzdCk7XG4gICAgcmV0dXJuICh0eE1vZGUsIGNhbGxiYWNrKSA9PiBkYnAudGhlbigoZGIpID0+IGNhbGxiYWNrKGRiLnRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgdHhNb2RlKS5vYmplY3RTdG9yZShzdG9yZU5hbWUpKSk7XG59XG5sZXQgZGVmYXVsdEdldFN0b3JlRnVuYztcbmZ1bmN0aW9uIGRlZmF1bHRHZXRTdG9yZSgpIHtcbiAgICBpZiAoIWRlZmF1bHRHZXRTdG9yZUZ1bmMpIHtcbiAgICAgICAgZGVmYXVsdEdldFN0b3JlRnVuYyA9IGNyZWF0ZVN0b3JlKCdrZXl2YWwtc3RvcmUnLCAna2V5dmFsJyk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0R2V0U3RvcmVGdW5jO1xufVxuLyoqXG4gKiBHZXQgYSB2YWx1ZSBieSBpdHMga2V5LlxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBnZXQoa2V5LCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkb25seScsIChzdG9yZSkgPT4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS5nZXQoa2V5KSkpO1xufVxuLyoqXG4gKiBTZXQgYSB2YWx1ZSB3aXRoIGEga2V5LlxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlLCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgICAgc3RvcmUucHV0KHZhbHVlLCBrZXkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS50cmFuc2FjdGlvbik7XG4gICAgfSk7XG59XG4vKipcbiAqIFNldCBtdWx0aXBsZSB2YWx1ZXMgYXQgb25jZS4gVGhpcyBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIHNldCgpIG11bHRpcGxlIHRpbWVzLlxuICogSXQncyBhbHNvIGF0b21pYyDigJMgaWYgb25lIG9mIHRoZSBwYWlycyBjYW4ndCBiZSBhZGRlZCwgbm9uZSB3aWxsIGJlIGFkZGVkLlxuICpcbiAqIEBwYXJhbSBlbnRyaWVzIEFycmF5IG9mIGVudHJpZXMsIHdoZXJlIGVhY2ggZW50cnkgaXMgYW4gYXJyYXkgb2YgYFtrZXksIHZhbHVlXWAuXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gc2V0TWFueShlbnRyaWVzLCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gc3RvcmUucHV0KGVudHJ5WzFdLCBlbnRyeVswXSkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS50cmFuc2FjdGlvbik7XG4gICAgfSk7XG59XG4vKipcbiAqIEdldCBtdWx0aXBsZSB2YWx1ZXMgYnkgdGhlaXIga2V5c1xuICpcbiAqIEBwYXJhbSBrZXlzXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWFueShrZXlzLCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkb25seScsIChzdG9yZSkgPT4gUHJvbWlzZS5hbGwoa2V5cy5tYXAoKGtleSkgPT4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS5nZXQoa2V5KSkpKSk7XG59XG4vKipcbiAqIFVwZGF0ZSBhIHZhbHVlLiBUaGlzIGxldHMgeW91IHNlZSB0aGUgb2xkIHZhbHVlIGFuZCB1cGRhdGUgaXQgYXMgYW4gYXRvbWljIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdXBkYXRlciBBIGNhbGxiYWNrIHRoYXQgdGFrZXMgdGhlIG9sZCB2YWx1ZSBhbmQgcmV0dXJucyBhIG5ldyB2YWx1ZS5cbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiB1cGRhdGUoa2V5LCB1cGRhdGVyLCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IFxuICAgIC8vIE5lZWQgdG8gY3JlYXRlIHRoZSBwcm9taXNlIG1hbnVhbGx5LlxuICAgIC8vIElmIEkgdHJ5IHRvIGNoYWluIHByb21pc2VzLCB0aGUgdHJhbnNhY3Rpb24gY2xvc2VzIGluIGJyb3dzZXJzXG4gICAgLy8gdGhhdCB1c2UgYSBwcm9taXNlIHBvbHlmaWxsIChJRTEwLzExKS5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHN0b3JlLmdldChrZXkpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHV0KHVwZGF0ZXIodGhpcy5yZXN1bHQpLCBrZXkpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocHJvbWlzaWZ5UmVxdWVzdChzdG9yZS50cmFuc2FjdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pKTtcbn1cbi8qKlxuICogRGVsZXRlIGEgcGFydGljdWxhciBrZXkgZnJvbSB0aGUgc3RvcmUuXG4gKlxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIGRlbChrZXksIGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4ge1xuICAgICAgICBzdG9yZS5kZWxldGUoa2V5KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUudHJhbnNhY3Rpb24pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBEZWxldGUgbXVsdGlwbGUga2V5cyBhdCBvbmNlLlxuICpcbiAqIEBwYXJhbSBrZXlzIExpc3Qgb2Yga2V5cyB0byBkZWxldGUuXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gZGVsTWFueShrZXlzLCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHN0b3JlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUudHJhbnNhY3Rpb24pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDbGVhciBhbGwgdmFsdWVzIGluIHRoZSBzdG9yZS5cbiAqXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gY2xlYXIoY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICAgIHN0b3JlLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLnRyYW5zYWN0aW9uKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGVhY2hDdXJzb3Ioc3RvcmUsIGNhbGxiYWNrKSB7XG4gICAgc3RvcmUub3BlbkN1cnNvcigpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc3VsdClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FsbGJhY2sodGhpcy5yZXN1bHQpO1xuICAgICAgICB0aGlzLnJlc3VsdC5jb250aW51ZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUudHJhbnNhY3Rpb24pO1xufVxuLyoqXG4gKiBHZXQgYWxsIGtleXMgaW4gdGhlIHN0b3JlLlxuICpcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBrZXlzKGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWRvbmx5JywgKHN0b3JlKSA9PiB7XG4gICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGlmIChzdG9yZS5nZXRBbGxLZXlzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS5nZXRBbGxLZXlzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICAgIHJldHVybiBlYWNoQ3Vyc29yKHN0b3JlLCAoY3Vyc29yKSA9PiBpdGVtcy5wdXNoKGN1cnNvci5rZXkpKS50aGVuKCgpID0+IGl0ZW1zKTtcbiAgICB9KTtcbn1cbi8qKlxuICogR2V0IGFsbCB2YWx1ZXMgaW4gdGhlIHN0b3JlLlxuICpcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiB2YWx1ZXMoY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZG9ubHknLCAoc3RvcmUpID0+IHtcbiAgICAgICAgLy8gRmFzdCBwYXRoIGZvciBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgaWYgKHN0b3JlLmdldEFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUuZ2V0QWxsKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICAgIHJldHVybiBlYWNoQ3Vyc29yKHN0b3JlLCAoY3Vyc29yKSA9PiBpdGVtcy5wdXNoKGN1cnNvci52YWx1ZSkpLnRoZW4oKCkgPT4gaXRlbXMpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBHZXQgYWxsIGVudHJpZXMgaW4gdGhlIHN0b3JlLiBFYWNoIGVudHJ5IGlzIGFuIGFycmF5IG9mIGBba2V5LCB2YWx1ZV1gLlxuICpcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBlbnRyaWVzKGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWRvbmx5JywgKHN0b3JlKSA9PiB7XG4gICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIC8vIChhbHRob3VnaCwgaG9wZWZ1bGx5IHdlJ2xsIGdldCBhIHNpbXBsZXIgcGF0aCBzb21lIGRheSlcbiAgICAgICAgaWYgKHN0b3JlLmdldEFsbCAmJiBzdG9yZS5nZXRBbGxLZXlzKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUuZ2V0QWxsS2V5cygpKSxcbiAgICAgICAgICAgICAgICBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLmdldEFsbCgpKSxcbiAgICAgICAgICAgIF0pLnRoZW4oKFtrZXlzLCB2YWx1ZXNdKSA9PiBrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCB2YWx1ZXNbaV1dKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkb25seScsIChzdG9yZSkgPT4gZWFjaEN1cnNvcihzdG9yZSwgKGN1cnNvcikgPT4gaXRlbXMucHVzaChbY3Vyc29yLmtleSwgY3Vyc29yLnZhbHVlXSkpLnRoZW4oKCkgPT4gaXRlbXMpKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IHsgY2xlYXIsIGNyZWF0ZVN0b3JlLCBkZWwsIGRlbE1hbnksIGVudHJpZXMsIGdldCwgZ2V0TWFueSwga2V5cywgcHJvbWlzaWZ5UmVxdWVzdCwgc2V0LCBzZXRNYW55LCB1cGRhdGUsIHZhbHVlcyB9O1xuIiwiLy8gc3JjL3V0aWxzL2Vudi50c1xudmFyIE5PVEhJTkcgPSBTeW1ib2wuZm9yKFwiaW1tZXItbm90aGluZ1wiKTtcbnZhciBEUkFGVEFCTEUgPSBTeW1ib2wuZm9yKFwiaW1tZXItZHJhZnRhYmxlXCIpO1xudmFyIERSQUZUX1NUQVRFID0gU3ltYm9sLmZvcihcImltbWVyLXN0YXRlXCIpO1xuXG4vLyBzcmMvdXRpbHMvZXJyb3JzLnRzXG52YXIgZXJyb3JzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gW1xuICAvLyBBbGwgZXJyb3IgY29kZXMsIHN0YXJ0aW5nIGJ5IDA6XG4gIGZ1bmN0aW9uKHBsdWdpbikge1xuICAgIHJldHVybiBgVGhlIHBsdWdpbiBmb3IgJyR7cGx1Z2lufScgaGFzIG5vdCBiZWVuIGxvYWRlZCBpbnRvIEltbWVyLiBUbyBlbmFibGUgdGhlIHBsdWdpbiwgaW1wb3J0IGFuZCBjYWxsIFxcYGVuYWJsZSR7cGx1Z2lufSgpXFxgIHdoZW4gaW5pdGlhbGl6aW5nIHlvdXIgYXBwbGljYXRpb24uYDtcbiAgfSxcbiAgZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gYHByb2R1Y2UgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHRoaW5ncyB0aGF0IGFyZSBkcmFmdGFibGU6IHBsYWluIG9iamVjdHMsIGFycmF5cywgTWFwLCBTZXQgb3IgY2xhc3NlcyB0aGF0IGFyZSBtYXJrZWQgd2l0aCAnW2ltbWVyYWJsZV06IHRydWUnLiBHb3QgJyR7dGhpbmd9J2A7XG4gIH0sXG4gIFwiVGhpcyBvYmplY3QgaGFzIGJlZW4gZnJvemVuIGFuZCBzaG91bGQgbm90IGJlIG11dGF0ZWRcIixcbiAgZnVuY3Rpb24oZGF0YSkge1xuICAgIHJldHVybiBcIkNhbm5vdCB1c2UgYSBwcm94eSB0aGF0IGhhcyBiZWVuIHJldm9rZWQuIERpZCB5b3UgcGFzcyBhbiBvYmplY3QgZnJvbSBpbnNpZGUgYW4gaW1tZXIgZnVuY3Rpb24gdG8gYW4gYXN5bmMgcHJvY2Vzcz8gXCIgKyBkYXRhO1xuICB9LFxuICBcIkFuIGltbWVyIHByb2R1Y2VyIHJldHVybmVkIGEgbmV3IHZhbHVlICphbmQqIG1vZGlmaWVkIGl0cyBkcmFmdC4gRWl0aGVyIHJldHVybiBhIG5ldyB2YWx1ZSAqb3IqIG1vZGlmeSB0aGUgZHJhZnQuXCIsXG4gIFwiSW1tZXIgZm9yYmlkcyBjaXJjdWxhciByZWZlcmVuY2VzXCIsXG4gIFwiVGhlIGZpcnN0IG9yIHNlY29uZCBhcmd1bWVudCB0byBgcHJvZHVjZWAgbXVzdCBiZSBhIGZ1bmN0aW9uXCIsXG4gIFwiVGhlIHRoaXJkIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdW5kZWZpbmVkXCIsXG4gIFwiRmlyc3QgYXJndW1lbnQgdG8gYGNyZWF0ZURyYWZ0YCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LCBhbiBhcnJheSwgb3IgYW4gaW1tZXJhYmxlIG9iamVjdFwiLFxuICBcIkZpcnN0IGFyZ3VtZW50IHRvIGBmaW5pc2hEcmFmdGAgbXVzdCBiZSBhIGRyYWZ0IHJldHVybmVkIGJ5IGBjcmVhdGVEcmFmdGBcIixcbiAgZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gYCdjdXJyZW50JyBleHBlY3RzIGEgZHJhZnQsIGdvdDogJHt0aGluZ31gO1xuICB9LFxuICBcIk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpIGNhbm5vdCBiZSB1c2VkIG9uIGFuIEltbWVyIGRyYWZ0XCIsXG4gIFwiT2JqZWN0LnNldFByb3RvdHlwZU9mKCkgY2Fubm90IGJlIHVzZWQgb24gYW4gSW1tZXIgZHJhZnRcIixcbiAgXCJJbW1lciBvbmx5IHN1cHBvcnRzIGRlbGV0aW5nIGFycmF5IGluZGljZXNcIixcbiAgXCJJbW1lciBvbmx5IHN1cHBvcnRzIHNldHRpbmcgYXJyYXkgaW5kaWNlcyBhbmQgdGhlICdsZW5ndGgnIHByb3BlcnR5XCIsXG4gIGZ1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIGAnb3JpZ2luYWwnIGV4cGVjdHMgYSBkcmFmdCwgZ290OiAke3RoaW5nfWA7XG4gIH1cbiAgLy8gTm90ZTogaWYgbW9yZSBlcnJvcnMgYXJlIGFkZGVkLCB0aGUgZXJyb3JPZmZzZXQgaW4gUGF0Y2hlcy50cyBzaG91bGQgYmUgaW5jcmVhc2VkXG4gIC8vIFNlZSBQYXRjaGVzLnRzIGZvciBhZGRpdGlvbmFsIGVycm9yc1xuXSA6IFtdO1xuZnVuY3Rpb24gZGllKGVycm9yLCAuLi5hcmdzKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBjb25zdCBlID0gZXJyb3JzW2Vycm9yXTtcbiAgICBjb25zdCBtc2cgPSB0eXBlb2YgZSA9PT0gXCJmdW5jdGlvblwiID8gZS5hcHBseShudWxsLCBhcmdzKSA6IGU7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbSW1tZXJdICR7bXNnfWApO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgW0ltbWVyXSBtaW5pZmllZCBlcnJvciBucjogJHtlcnJvcn0uIEZ1bGwgZXJyb3IgYXQ6IGh0dHBzOi8vYml0Lmx5LzNjWEVLV2ZgXG4gICk7XG59XG5cbi8vIHNyYy91dGlscy9jb21tb24udHNcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbmZ1bmN0aW9uIGlzRHJhZnQodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgISF2YWx1ZVtEUkFGVF9TVEFURV07XG59XG5mdW5jdGlvbiBpc0RyYWZ0YWJsZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKVxuICAgIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpIHx8ICEhdmFsdWVbRFJBRlRBQkxFXSB8fCAhIXZhbHVlLmNvbnN0cnVjdG9yPy5bRFJBRlRBQkxFXSB8fCBpc01hcCh2YWx1ZSkgfHwgaXNTZXQodmFsdWUpO1xufVxudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCk7XG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IEN0b3IgPSBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgXCJjb25zdHJ1Y3RvclwiKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgaWYgKEN0b3IgPT09IE9iamVjdClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09IFwiZnVuY3Rpb25cIiAmJiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKEN0b3IpID09PSBvYmplY3RDdG9yU3RyaW5nO1xufVxuZnVuY3Rpb24gb3JpZ2luYWwodmFsdWUpIHtcbiAgaWYgKCFpc0RyYWZ0KHZhbHVlKSlcbiAgICBkaWUoMTUsIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlW0RSQUZUX1NUQVRFXS5iYXNlXztcbn1cbmZ1bmN0aW9uIGVhY2gob2JqLCBpdGVyKSB7XG4gIGlmIChnZXRBcmNodHlwZShvYmopID09PSAwIC8qIE9iamVjdCAqLykge1xuICAgIFJlZmxlY3Qub3duS2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaXRlcihrZXksIG9ialtrZXldLCBvYmopO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iai5mb3JFYWNoKChlbnRyeSwgaW5kZXgpID0+IGl0ZXIoaW5kZXgsIGVudHJ5LCBvYmopKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0QXJjaHR5cGUodGhpbmcpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGluZ1tEUkFGVF9TVEFURV07XG4gIHJldHVybiBzdGF0ZSA/IHN0YXRlLnR5cGVfIDogQXJyYXkuaXNBcnJheSh0aGluZykgPyAxIC8qIEFycmF5ICovIDogaXNNYXAodGhpbmcpID8gMiAvKiBNYXAgKi8gOiBpc1NldCh0aGluZykgPyAzIC8qIFNldCAqLyA6IDAgLyogT2JqZWN0ICovO1xufVxuZnVuY3Rpb24gaGFzKHRoaW5nLCBwcm9wKSB7XG4gIHJldHVybiBnZXRBcmNodHlwZSh0aGluZykgPT09IDIgLyogTWFwICovID8gdGhpbmcuaGFzKHByb3ApIDogT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaW5nLCBwcm9wKTtcbn1cbmZ1bmN0aW9uIGdldCh0aGluZywgcHJvcCkge1xuICByZXR1cm4gZ2V0QXJjaHR5cGUodGhpbmcpID09PSAyIC8qIE1hcCAqLyA/IHRoaW5nLmdldChwcm9wKSA6IHRoaW5nW3Byb3BdO1xufVxuZnVuY3Rpb24gc2V0KHRoaW5nLCBwcm9wT3JPbGRWYWx1ZSwgdmFsdWUpIHtcbiAgY29uc3QgdCA9IGdldEFyY2h0eXBlKHRoaW5nKTtcbiAgaWYgKHQgPT09IDIgLyogTWFwICovKVxuICAgIHRoaW5nLnNldChwcm9wT3JPbGRWYWx1ZSwgdmFsdWUpO1xuICBlbHNlIGlmICh0ID09PSAzIC8qIFNldCAqLykge1xuICAgIHRoaW5nLmFkZCh2YWx1ZSk7XG4gIH0gZWxzZVxuICAgIHRoaW5nW3Byb3BPck9sZFZhbHVlXSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gaXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG5mdW5jdGlvbiBpc01hcCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIE1hcDtcbn1cbmZ1bmN0aW9uIGlzU2V0KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgU2V0O1xufVxuZnVuY3Rpb24gbGF0ZXN0KHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5jb3B5XyB8fCBzdGF0ZS5iYXNlXztcbn1cbmZ1bmN0aW9uIHNoYWxsb3dDb3B5KGJhc2UsIHN0cmljdCkge1xuICBpZiAoaXNNYXAoYmFzZSkpIHtcbiAgICByZXR1cm4gbmV3IE1hcChiYXNlKTtcbiAgfVxuICBpZiAoaXNTZXQoYmFzZSkpIHtcbiAgICByZXR1cm4gbmV3IFNldChiYXNlKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShiYXNlKSlcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYmFzZSk7XG4gIGNvbnN0IGlzUGxhaW4gPSBpc1BsYWluT2JqZWN0KGJhc2UpO1xuICBpZiAoc3RyaWN0ID09PSB0cnVlIHx8IHN0cmljdCA9PT0gXCJjbGFzc19vbmx5XCIgJiYgIWlzUGxhaW4pIHtcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGJhc2UpO1xuICAgIGRlbGV0ZSBkZXNjcmlwdG9yc1tEUkFGVF9TVEFURV07XG4gICAgbGV0IGtleXMgPSBSZWZsZWN0Lm93bktleXMoZGVzY3JpcHRvcnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGNvbnN0IGRlc2MgPSBkZXNjcmlwdG9yc1trZXldO1xuICAgICAgaWYgKGRlc2Mud3JpdGFibGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGRlc2Mud3JpdGFibGUgPSB0cnVlO1xuICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpXG4gICAgICAgIGRlc2NyaXB0b3JzW2tleV0gPSB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIC8vIGNvdWxkIGxpdmUgd2l0aCAhIWRlc2Muc2V0IGFzIHdlbGwgaGVyZS4uLlxuICAgICAgICAgIGVudW1lcmFibGU6IGRlc2MuZW51bWVyYWJsZSxcbiAgICAgICAgICB2YWx1ZTogYmFzZVtrZXldXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKGdldFByb3RvdHlwZU9mKGJhc2UpLCBkZXNjcmlwdG9ycyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihiYXNlKTtcbiAgICBpZiAocHJvdG8gIT09IG51bGwgJiYgaXNQbGFpbikge1xuICAgICAgcmV0dXJuIHsgLi4uYmFzZSB9O1xuICAgIH1cbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihvYmosIGJhc2UpO1xuICB9XG59XG5mdW5jdGlvbiBmcmVlemUob2JqLCBkZWVwID0gZmFsc2UpIHtcbiAgaWYgKGlzRnJvemVuKG9iaikgfHwgaXNEcmFmdChvYmopIHx8ICFpc0RyYWZ0YWJsZShvYmopKVxuICAgIHJldHVybiBvYmo7XG4gIGlmIChnZXRBcmNodHlwZShvYmopID4gMSkge1xuICAgIG9iai5zZXQgPSBvYmouYWRkID0gb2JqLmNsZWFyID0gb2JqLmRlbGV0ZSA9IGRvbnRNdXRhdGVGcm96ZW5Db2xsZWN0aW9ucztcbiAgfVxuICBPYmplY3QuZnJlZXplKG9iaik7XG4gIGlmIChkZWVwKVxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiBmcmVlemUodmFsdWUsIHRydWUpKTtcbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIGRvbnRNdXRhdGVGcm96ZW5Db2xsZWN0aW9ucygpIHtcbiAgZGllKDIpO1xufVxuZnVuY3Rpb24gaXNGcm96ZW4ob2JqKSB7XG4gIHJldHVybiBPYmplY3QuaXNGcm96ZW4ob2JqKTtcbn1cblxuLy8gc3JjL3V0aWxzL3BsdWdpbnMudHNcbnZhciBwbHVnaW5zID0ge307XG5mdW5jdGlvbiBnZXRQbHVnaW4ocGx1Z2luS2V5KSB7XG4gIGNvbnN0IHBsdWdpbiA9IHBsdWdpbnNbcGx1Z2luS2V5XTtcbiAgaWYgKCFwbHVnaW4pIHtcbiAgICBkaWUoMCwgcGx1Z2luS2V5KTtcbiAgfVxuICByZXR1cm4gcGx1Z2luO1xufVxuZnVuY3Rpb24gbG9hZFBsdWdpbihwbHVnaW5LZXksIGltcGxlbWVudGF0aW9uKSB7XG4gIGlmICghcGx1Z2luc1twbHVnaW5LZXldKVxuICAgIHBsdWdpbnNbcGx1Z2luS2V5XSA9IGltcGxlbWVudGF0aW9uO1xufVxuXG4vLyBzcmMvY29yZS9zY29wZS50c1xudmFyIGN1cnJlbnRTY29wZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRTY29wZSgpIHtcbiAgcmV0dXJuIGN1cnJlbnRTY29wZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNjb3BlKHBhcmVudF8sIGltbWVyXykge1xuICByZXR1cm4ge1xuICAgIGRyYWZ0c186IFtdLFxuICAgIHBhcmVudF8sXG4gICAgaW1tZXJfLFxuICAgIC8vIFdoZW5ldmVyIHRoZSBtb2RpZmllZCBkcmFmdCBjb250YWlucyBhIGRyYWZ0IGZyb20gYW5vdGhlciBzY29wZSwgd2VcbiAgICAvLyBuZWVkIHRvIHByZXZlbnQgYXV0by1mcmVlemluZyBzbyB0aGUgdW5vd25lZCBkcmFmdCBjYW4gYmUgZmluYWxpemVkLlxuICAgIGNhbkF1dG9GcmVlemVfOiB0cnVlLFxuICAgIHVuZmluYWxpemVkRHJhZnRzXzogMFxuICB9O1xufVxuZnVuY3Rpb24gdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpIHtcbiAgaWYgKHBhdGNoTGlzdGVuZXIpIHtcbiAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpO1xuICAgIHNjb3BlLnBhdGNoZXNfID0gW107XG4gICAgc2NvcGUuaW52ZXJzZVBhdGNoZXNfID0gW107XG4gICAgc2NvcGUucGF0Y2hMaXN0ZW5lcl8gPSBwYXRjaExpc3RlbmVyO1xuICB9XG59XG5mdW5jdGlvbiByZXZva2VTY29wZShzY29wZSkge1xuICBsZWF2ZVNjb3BlKHNjb3BlKTtcbiAgc2NvcGUuZHJhZnRzXy5mb3JFYWNoKHJldm9rZURyYWZ0KTtcbiAgc2NvcGUuZHJhZnRzXyA9IG51bGw7XG59XG5mdW5jdGlvbiBsZWF2ZVNjb3BlKHNjb3BlKSB7XG4gIGlmIChzY29wZSA9PT0gY3VycmVudFNjb3BlKSB7XG4gICAgY3VycmVudFNjb3BlID0gc2NvcGUucGFyZW50XztcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJTY29wZShpbW1lcjIpIHtcbiAgcmV0dXJuIGN1cnJlbnRTY29wZSA9IGNyZWF0ZVNjb3BlKGN1cnJlbnRTY29wZSwgaW1tZXIyKTtcbn1cbmZ1bmN0aW9uIHJldm9rZURyYWZ0KGRyYWZ0KSB7XG4gIGNvbnN0IHN0YXRlID0gZHJhZnRbRFJBRlRfU1RBVEVdO1xuICBpZiAoc3RhdGUudHlwZV8gPT09IDAgLyogT2JqZWN0ICovIHx8IHN0YXRlLnR5cGVfID09PSAxIC8qIEFycmF5ICovKVxuICAgIHN0YXRlLnJldm9rZV8oKTtcbiAgZWxzZVxuICAgIHN0YXRlLnJldm9rZWRfID0gdHJ1ZTtcbn1cblxuLy8gc3JjL2NvcmUvZmluYWxpemUudHNcbmZ1bmN0aW9uIHByb2Nlc3NSZXN1bHQocmVzdWx0LCBzY29wZSkge1xuICBzY29wZS51bmZpbmFsaXplZERyYWZ0c18gPSBzY29wZS5kcmFmdHNfLmxlbmd0aDtcbiAgY29uc3QgYmFzZURyYWZ0ID0gc2NvcGUuZHJhZnRzX1swXTtcbiAgY29uc3QgaXNSZXBsYWNlZCA9IHJlc3VsdCAhPT0gdm9pZCAwICYmIHJlc3VsdCAhPT0gYmFzZURyYWZ0O1xuICBpZiAoaXNSZXBsYWNlZCkge1xuICAgIGlmIChiYXNlRHJhZnRbRFJBRlRfU1RBVEVdLm1vZGlmaWVkXykge1xuICAgICAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICAgICAgZGllKDQpO1xuICAgIH1cbiAgICBpZiAoaXNEcmFmdGFibGUocmVzdWx0KSkge1xuICAgICAgcmVzdWx0ID0gZmluYWxpemUoc2NvcGUsIHJlc3VsdCk7XG4gICAgICBpZiAoIXNjb3BlLnBhcmVudF8pXG4gICAgICAgIG1heWJlRnJlZXplKHNjb3BlLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAoc2NvcGUucGF0Y2hlc18pIHtcbiAgICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKFxuICAgICAgICBiYXNlRHJhZnRbRFJBRlRfU1RBVEVdLmJhc2VfLFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHNjb3BlLnBhdGNoZXNfLFxuICAgICAgICBzY29wZS5pbnZlcnNlUGF0Y2hlc19cbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IGZpbmFsaXplKHNjb3BlLCBiYXNlRHJhZnQsIFtdKTtcbiAgfVxuICByZXZva2VTY29wZShzY29wZSk7XG4gIGlmIChzY29wZS5wYXRjaGVzXykge1xuICAgIHNjb3BlLnBhdGNoTGlzdGVuZXJfKHNjb3BlLnBhdGNoZXNfLCBzY29wZS5pbnZlcnNlUGF0Y2hlc18pO1xuICB9XG4gIHJldHVybiByZXN1bHQgIT09IE5PVEhJTkcgPyByZXN1bHQgOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBmaW5hbGl6ZShyb290U2NvcGUsIHZhbHVlLCBwYXRoKSB7XG4gIGlmIChpc0Zyb3plbih2YWx1ZSkpXG4gICAgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBzdGF0ZSA9IHZhbHVlW0RSQUZUX1NUQVRFXTtcbiAgaWYgKCFzdGF0ZSkge1xuICAgIGVhY2goXG4gICAgICB2YWx1ZSxcbiAgICAgIChrZXksIGNoaWxkVmFsdWUpID0+IGZpbmFsaXplUHJvcGVydHkocm9vdFNjb3BlLCBzdGF0ZSwgdmFsdWUsIGtleSwgY2hpbGRWYWx1ZSwgcGF0aClcbiAgICApO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoc3RhdGUuc2NvcGVfICE9PSByb290U2NvcGUpXG4gICAgcmV0dXJuIHZhbHVlO1xuICBpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuICAgIG1heWJlRnJlZXplKHJvb3RTY29wZSwgc3RhdGUuYmFzZV8sIHRydWUpO1xuICAgIHJldHVybiBzdGF0ZS5iYXNlXztcbiAgfVxuICBpZiAoIXN0YXRlLmZpbmFsaXplZF8pIHtcbiAgICBzdGF0ZS5maW5hbGl6ZWRfID0gdHJ1ZTtcbiAgICBzdGF0ZS5zY29wZV8udW5maW5hbGl6ZWREcmFmdHNfLS07XG4gICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuY29weV87XG4gICAgbGV0IHJlc3VsdEVhY2ggPSByZXN1bHQ7XG4gICAgbGV0IGlzU2V0MiA9IGZhbHNlO1xuICAgIGlmIChzdGF0ZS50eXBlXyA9PT0gMyAvKiBTZXQgKi8pIHtcbiAgICAgIHJlc3VsdEVhY2ggPSBuZXcgU2V0KHJlc3VsdCk7XG4gICAgICByZXN1bHQuY2xlYXIoKTtcbiAgICAgIGlzU2V0MiA9IHRydWU7XG4gICAgfVxuICAgIGVhY2goXG4gICAgICByZXN1bHRFYWNoLFxuICAgICAgKGtleSwgY2hpbGRWYWx1ZSkgPT4gZmluYWxpemVQcm9wZXJ0eShyb290U2NvcGUsIHN0YXRlLCByZXN1bHQsIGtleSwgY2hpbGRWYWx1ZSwgcGF0aCwgaXNTZXQyKVxuICAgICk7XG4gICAgbWF5YmVGcmVlemUocm9vdFNjb3BlLCByZXN1bHQsIGZhbHNlKTtcbiAgICBpZiAocGF0aCAmJiByb290U2NvcGUucGF0Y2hlc18pIHtcbiAgICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVQYXRjaGVzXyhcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHJvb3RTY29wZS5wYXRjaGVzXyxcbiAgICAgICAgcm9vdFNjb3BlLmludmVyc2VQYXRjaGVzX1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmNvcHlfO1xufVxuZnVuY3Rpb24gZmluYWxpemVQcm9wZXJ0eShyb290U2NvcGUsIHBhcmVudFN0YXRlLCB0YXJnZXRPYmplY3QsIHByb3AsIGNoaWxkVmFsdWUsIHJvb3RQYXRoLCB0YXJnZXRJc1NldCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGNoaWxkVmFsdWUgPT09IHRhcmdldE9iamVjdClcbiAgICBkaWUoNSk7XG4gIGlmIChpc0RyYWZ0KGNoaWxkVmFsdWUpKSB7XG4gICAgY29uc3QgcGF0aCA9IHJvb3RQYXRoICYmIHBhcmVudFN0YXRlICYmIHBhcmVudFN0YXRlLnR5cGVfICE9PSAzIC8qIFNldCAqLyAmJiAvLyBTZXQgb2JqZWN0cyBhcmUgYXRvbWljIHNpbmNlIHRoZXkgaGF2ZSBubyBrZXlzLlxuICAgICFoYXMocGFyZW50U3RhdGUuYXNzaWduZWRfLCBwcm9wKSA/IHJvb3RQYXRoLmNvbmNhdChwcm9wKSA6IHZvaWQgMDtcbiAgICBjb25zdCByZXMgPSBmaW5hbGl6ZShyb290U2NvcGUsIGNoaWxkVmFsdWUsIHBhdGgpO1xuICAgIHNldCh0YXJnZXRPYmplY3QsIHByb3AsIHJlcyk7XG4gICAgaWYgKGlzRHJhZnQocmVzKSkge1xuICAgICAgcm9vdFNjb3BlLmNhbkF1dG9GcmVlemVfID0gZmFsc2U7XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAodGFyZ2V0SXNTZXQpIHtcbiAgICB0YXJnZXRPYmplY3QuYWRkKGNoaWxkVmFsdWUpO1xuICB9XG4gIGlmIChpc0RyYWZ0YWJsZShjaGlsZFZhbHVlKSAmJiAhaXNGcm96ZW4oY2hpbGRWYWx1ZSkpIHtcbiAgICBpZiAoIXJvb3RTY29wZS5pbW1lcl8uYXV0b0ZyZWV6ZV8gJiYgcm9vdFNjb3BlLnVuZmluYWxpemVkRHJhZnRzXyA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZmluYWxpemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlKTtcbiAgICBpZiAoKCFwYXJlbnRTdGF0ZSB8fCAhcGFyZW50U3RhdGUuc2NvcGVfLnBhcmVudF8pICYmIHR5cGVvZiBwcm9wICE9PSBcInN5bWJvbFwiICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0YXJnZXRPYmplY3QsIHByb3ApKVxuICAgICAgbWF5YmVGcmVlemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gbWF5YmVGcmVlemUoc2NvcGUsIHZhbHVlLCBkZWVwID0gZmFsc2UpIHtcbiAgaWYgKCFzY29wZS5wYXJlbnRfICYmIHNjb3BlLmltbWVyXy5hdXRvRnJlZXplXyAmJiBzY29wZS5jYW5BdXRvRnJlZXplXykge1xuICAgIGZyZWV6ZSh2YWx1ZSwgZGVlcCk7XG4gIH1cbn1cblxuLy8gc3JjL2NvcmUvcHJveHkudHNcbmZ1bmN0aW9uIGNyZWF0ZVByb3h5UHJveHkoYmFzZSwgcGFyZW50KSB7XG4gIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGJhc2UpO1xuICBjb25zdCBzdGF0ZSA9IHtcbiAgICB0eXBlXzogaXNBcnJheSA/IDEgLyogQXJyYXkgKi8gOiAwIC8qIE9iamVjdCAqLyxcbiAgICAvLyBUcmFjayB3aGljaCBwcm9kdWNlIGNhbGwgdGhpcyBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAgc2NvcGVfOiBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCksXG4gICAgLy8gVHJ1ZSBmb3IgYm90aCBzaGFsbG93IGFuZCBkZWVwIGNoYW5nZXMuXG4gICAgbW9kaWZpZWRfOiBmYWxzZSxcbiAgICAvLyBVc2VkIGR1cmluZyBmaW5hbGl6YXRpb24uXG4gICAgZmluYWxpemVkXzogZmFsc2UsXG4gICAgLy8gVHJhY2sgd2hpY2ggcHJvcGVydGllcyBoYXZlIGJlZW4gYXNzaWduZWQgKHRydWUpIG9yIGRlbGV0ZWQgKGZhbHNlKS5cbiAgICBhc3NpZ25lZF86IHt9LFxuICAgIC8vIFRoZSBwYXJlbnQgZHJhZnQgc3RhdGUuXG4gICAgcGFyZW50XzogcGFyZW50LFxuICAgIC8vIFRoZSBiYXNlIHN0YXRlLlxuICAgIGJhc2VfOiBiYXNlLFxuICAgIC8vIFRoZSBiYXNlIHByb3h5LlxuICAgIGRyYWZ0XzogbnVsbCxcbiAgICAvLyBzZXQgYmVsb3dcbiAgICAvLyBUaGUgYmFzZSBjb3B5IHdpdGggYW55IHVwZGF0ZWQgdmFsdWVzLlxuICAgIGNvcHlfOiBudWxsLFxuICAgIC8vIENhbGxlZCBieSB0aGUgYHByb2R1Y2VgIGZ1bmN0aW9uLlxuICAgIHJldm9rZV86IG51bGwsXG4gICAgaXNNYW51YWxfOiBmYWxzZVxuICB9O1xuICBsZXQgdGFyZ2V0ID0gc3RhdGU7XG4gIGxldCB0cmFwcyA9IG9iamVjdFRyYXBzO1xuICBpZiAoaXNBcnJheSkge1xuICAgIHRhcmdldCA9IFtzdGF0ZV07XG4gICAgdHJhcHMgPSBhcnJheVRyYXBzO1xuICB9XG4gIGNvbnN0IHsgcmV2b2tlLCBwcm94eSB9ID0gUHJveHkucmV2b2NhYmxlKHRhcmdldCwgdHJhcHMpO1xuICBzdGF0ZS5kcmFmdF8gPSBwcm94eTtcbiAgc3RhdGUucmV2b2tlXyA9IHJldm9rZTtcbiAgcmV0dXJuIHByb3h5O1xufVxudmFyIG9iamVjdFRyYXBzID0ge1xuICBnZXQoc3RhdGUsIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gRFJBRlRfU1RBVEUpXG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgY29uc3Qgc291cmNlID0gbGF0ZXN0KHN0YXRlKTtcbiAgICBpZiAoIWhhcyhzb3VyY2UsIHByb3ApKSB7XG4gICAgICByZXR1cm4gcmVhZFByb3BGcm9tUHJvdG8oc3RhdGUsIHNvdXJjZSwgcHJvcCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gc291cmNlW3Byb3BdO1xuICAgIGlmIChzdGF0ZS5maW5hbGl6ZWRfIHx8ICFpc0RyYWZ0YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBwZWVrKHN0YXRlLmJhc2VfLCBwcm9wKSkge1xuICAgICAgcHJlcGFyZUNvcHkoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfW3Byb3BdID0gY3JlYXRlUHJveHkodmFsdWUsIHN0YXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICBoYXMoc3RhdGUsIHByb3ApIHtcbiAgICByZXR1cm4gcHJvcCBpbiBsYXRlc3Qoc3RhdGUpO1xuICB9LFxuICBvd25LZXlzKHN0YXRlKSB7XG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhsYXRlc3Qoc3RhdGUpKTtcbiAgfSxcbiAgc2V0KHN0YXRlLCBwcm9wLCB2YWx1ZSkge1xuICAgIGNvbnN0IGRlc2MgPSBnZXREZXNjcmlwdG9yRnJvbVByb3RvKGxhdGVzdChzdGF0ZSksIHByb3ApO1xuICAgIGlmIChkZXNjPy5zZXQpIHtcbiAgICAgIGRlc2Muc2V0LmNhbGwoc3RhdGUuZHJhZnRfLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQyID0gcGVlayhsYXRlc3Qoc3RhdGUpLCBwcm9wKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnQyPy5bRFJBRlRfU1RBVEVdO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAmJiBjdXJyZW50U3RhdGUuYmFzZV8gPT09IHZhbHVlKSB7XG4gICAgICAgIHN0YXRlLmNvcHlfW3Byb3BdID0gdmFsdWU7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkX1twcm9wXSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyh2YWx1ZSwgY3VycmVudDIpICYmICh2YWx1ZSAhPT0gdm9pZCAwIHx8IGhhcyhzdGF0ZS5iYXNlXywgcHJvcCkpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIHByZXBhcmVDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcHlfW3Byb3BdID09PSB2YWx1ZSAmJiAvLyBzcGVjaWFsIGNhc2U6IGhhbmRsZSBuZXcgcHJvcHMgd2l0aCB2YWx1ZSAndW5kZWZpbmVkJ1xuICAgICh2YWx1ZSAhPT0gdm9pZCAwIHx8IHByb3AgaW4gc3RhdGUuY29weV8pIHx8IC8vIHNwZWNpYWwgY2FzZTogTmFOXG4gICAgTnVtYmVyLmlzTmFOKHZhbHVlKSAmJiBOdW1iZXIuaXNOYU4oc3RhdGUuY29weV9bcHJvcF0pKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgc3RhdGUuY29weV9bcHJvcF0gPSB2YWx1ZTtcbiAgICBzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eShzdGF0ZSwgcHJvcCkge1xuICAgIGlmIChwZWVrKHN0YXRlLmJhc2VfLCBwcm9wKSAhPT0gdm9pZCAwIHx8IHByb3AgaW4gc3RhdGUuYmFzZV8pIHtcbiAgICAgIHN0YXRlLmFzc2lnbmVkX1twcm9wXSA9IGZhbHNlO1xuICAgICAgcHJlcGFyZUNvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgc3RhdGUuYXNzaWduZWRfW3Byb3BdO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY29weV8pIHtcbiAgICAgIGRlbGV0ZSBzdGF0ZS5jb3B5X1twcm9wXTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIE5vdGU6IFdlIG5ldmVyIGNvZXJjZSBgZGVzYy52YWx1ZWAgaW50byBhbiBJbW1lciBkcmFmdCwgYmVjYXVzZSB3ZSBjYW4ndCBtYWtlXG4gIC8vIHRoZSBzYW1lIGd1YXJhbnRlZSBpbiBFUzUgbW9kZS5cbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHN0YXRlLCBwcm9wKSB7XG4gICAgY29uc3Qgb3duZXIgPSBsYXRlc3Qoc3RhdGUpO1xuICAgIGNvbnN0IGRlc2MgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvd25lciwgcHJvcCk7XG4gICAgaWYgKCFkZXNjKVxuICAgICAgcmV0dXJuIGRlc2M7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBzdGF0ZS50eXBlXyAhPT0gMSAvKiBBcnJheSAqLyB8fCBwcm9wICE9PSBcImxlbmd0aFwiLFxuICAgICAgZW51bWVyYWJsZTogZGVzYy5lbnVtZXJhYmxlLFxuICAgICAgdmFsdWU6IG93bmVyW3Byb3BdXG4gICAgfTtcbiAgfSxcbiAgZGVmaW5lUHJvcGVydHkoKSB7XG4gICAgZGllKDExKTtcbiAgfSxcbiAgZ2V0UHJvdG90eXBlT2Yoc3RhdGUpIHtcbiAgICByZXR1cm4gZ2V0UHJvdG90eXBlT2Yoc3RhdGUuYmFzZV8pO1xuICB9LFxuICBzZXRQcm90b3R5cGVPZigpIHtcbiAgICBkaWUoMTIpO1xuICB9XG59O1xudmFyIGFycmF5VHJhcHMgPSB7fTtcbmVhY2gob2JqZWN0VHJhcHMsIChrZXksIGZuKSA9PiB7XG4gIGFycmF5VHJhcHNba2V5XSA9IGZ1bmN0aW9uKCkge1xuICAgIGFyZ3VtZW50c1swXSA9IGFyZ3VtZW50c1swXVswXTtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0pO1xuYXJyYXlUcmFwcy5kZWxldGVQcm9wZXJ0eSA9IGZ1bmN0aW9uKHN0YXRlLCBwcm9wKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgaXNOYU4ocGFyc2VJbnQocHJvcCkpKVxuICAgIGRpZSgxMyk7XG4gIHJldHVybiBhcnJheVRyYXBzLnNldC5jYWxsKHRoaXMsIHN0YXRlLCBwcm9wLCB2b2lkIDApO1xufTtcbmFycmF5VHJhcHMuc2V0ID0gZnVuY3Rpb24oc3RhdGUsIHByb3AsIHZhbHVlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgcHJvcCAhPT0gXCJsZW5ndGhcIiAmJiBpc05hTihwYXJzZUludChwcm9wKSkpXG4gICAgZGllKDE0KTtcbiAgcmV0dXJuIG9iamVjdFRyYXBzLnNldC5jYWxsKHRoaXMsIHN0YXRlWzBdLCBwcm9wLCB2YWx1ZSwgc3RhdGVbMF0pO1xufTtcbmZ1bmN0aW9uIHBlZWsoZHJhZnQsIHByb3ApIHtcbiAgY29uc3Qgc3RhdGUgPSBkcmFmdFtEUkFGVF9TVEFURV07XG4gIGNvbnN0IHNvdXJjZSA9IHN0YXRlID8gbGF0ZXN0KHN0YXRlKSA6IGRyYWZ0O1xuICByZXR1cm4gc291cmNlW3Byb3BdO1xufVxuZnVuY3Rpb24gcmVhZFByb3BGcm9tUHJvdG8oc3RhdGUsIHNvdXJjZSwgcHJvcCkge1xuICBjb25zdCBkZXNjID0gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhzb3VyY2UsIHByb3ApO1xuICByZXR1cm4gZGVzYyA/IGB2YWx1ZWAgaW4gZGVzYyA/IGRlc2MudmFsdWUgOiAoXG4gICAgLy8gVGhpcyBpcyBhIHZlcnkgc3BlY2lhbCBjYXNlLCBpZiB0aGUgcHJvcCBpcyBhIGdldHRlciBkZWZpbmVkIGJ5IHRoZVxuICAgIC8vIHByb3RvdHlwZSwgd2Ugc2hvdWxkIGludm9rZSBpdCB3aXRoIHRoZSBkcmFmdCBhcyBjb250ZXh0IVxuICAgIGRlc2MuZ2V0Py5jYWxsKHN0YXRlLmRyYWZ0XylcbiAgKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGdldERlc2NyaXB0b3JGcm9tUHJvdG8oc291cmNlLCBwcm9wKSB7XG4gIGlmICghKHByb3AgaW4gc291cmNlKSlcbiAgICByZXR1cm4gdm9pZCAwO1xuICBsZXQgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihzb3VyY2UpO1xuICB3aGlsZSAocHJvdG8pIHtcbiAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgcHJvcCk7XG4gICAgaWYgKGRlc2MpXG4gICAgICByZXR1cm4gZGVzYztcbiAgICBwcm90byA9IGdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuZnVuY3Rpb24gbWFya0NoYW5nZWQoc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pIHtcbiAgICBzdGF0ZS5tb2RpZmllZF8gPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5wYXJlbnRfKSB7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZS5wYXJlbnRfKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVDb3B5KHN0YXRlKSB7XG4gIGlmICghc3RhdGUuY29weV8pIHtcbiAgICBzdGF0ZS5jb3B5XyA9IHNoYWxsb3dDb3B5KFxuICAgICAgc3RhdGUuYmFzZV8sXG4gICAgICBzdGF0ZS5zY29wZV8uaW1tZXJfLnVzZVN0cmljdFNoYWxsb3dDb3B5X1xuICAgICk7XG4gIH1cbn1cblxuLy8gc3JjL2NvcmUvaW1tZXJDbGFzcy50c1xudmFyIEltbWVyMiA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5hdXRvRnJlZXplXyA9IHRydWU7XG4gICAgdGhpcy51c2VTdHJpY3RTaGFsbG93Q29weV8gPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYHByb2R1Y2VgIGZ1bmN0aW9uIHRha2VzIGEgdmFsdWUgYW5kIGEgXCJyZWNpcGUgZnVuY3Rpb25cIiAod2hvc2VcbiAgICAgKiByZXR1cm4gdmFsdWUgb2Z0ZW4gZGVwZW5kcyBvbiB0aGUgYmFzZSBzdGF0ZSkuIFRoZSByZWNpcGUgZnVuY3Rpb24gaXNcbiAgICAgKiBmcmVlIHRvIG11dGF0ZSBpdHMgZmlyc3QgYXJndW1lbnQgaG93ZXZlciBpdCB3YW50cy4gQWxsIG11dGF0aW9ucyBhcmVcbiAgICAgKiBvbmx5IGV2ZXIgYXBwbGllZCB0byBhIF9fY29weV9fIG9mIHRoZSBiYXNlIHN0YXRlLlxuICAgICAqXG4gICAgICogUGFzcyBvbmx5IGEgZnVuY3Rpb24gdG8gY3JlYXRlIGEgXCJjdXJyaWVkIHByb2R1Y2VyXCIgd2hpY2ggcmVsaWV2ZXMgeW91XG4gICAgICogZnJvbSBwYXNzaW5nIHRoZSByZWNpcGUgZnVuY3Rpb24gZXZlcnkgdGltZS5cbiAgICAgKlxuICAgICAqIE9ubHkgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzIGFyZSBtYWRlIG11dGFibGUuIEFsbCBvdGhlciBvYmplY3RzIGFyZVxuICAgICAqIGNvbnNpZGVyZWQgdW5jb3B5YWJsZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgX19ib3VuZF9fIHRvIGl0cyBgSW1tZXJgIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHthbnl9IGJhc2UgLSB0aGUgaW5pdGlhbCBzdGF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlY2lwZSAtIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBwcm94eSBvZiB0aGUgYmFzZSBzdGF0ZSBhcyBmaXJzdCBhcmd1bWVudCBhbmQgd2hpY2ggY2FuIGJlIGZyZWVseSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhdGNoTGlzdGVuZXIgLSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHRoZSBwYXRjaGVzIHByb2R1Y2VkIGhlcmVcbiAgICAgKiBAcmV0dXJucyB7YW55fSBhIG5ldyBzdGF0ZSwgb3IgdGhlIGluaXRpYWwgc3RhdGUgaWYgbm90aGluZyB3YXMgbW9kaWZpZWRcbiAgICAgKi9cbiAgICB0aGlzLnByb2R1Y2UgPSAoYmFzZSwgcmVjaXBlLCBwYXRjaExpc3RlbmVyKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGJhc2UgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgcmVjaXBlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdEJhc2UgPSByZWNpcGU7XG4gICAgICAgIHJlY2lwZSA9IGJhc2U7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gY3VycmllZFByb2R1Y2UoYmFzZTIgPSBkZWZhdWx0QmFzZSwgLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiBzZWxmLnByb2R1Y2UoYmFzZTIsIChkcmFmdCkgPT4gcmVjaXBlLmNhbGwodGhpcywgZHJhZnQsIC4uLmFyZ3MpKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcmVjaXBlICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGRpZSg2KTtcbiAgICAgIGlmIChwYXRjaExpc3RlbmVyICE9PSB2b2lkIDAgJiYgdHlwZW9mIHBhdGNoTGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZGllKDcpO1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIGlmIChpc0RyYWZ0YWJsZShiYXNlKSkge1xuICAgICAgICBjb25zdCBzY29wZSA9IGVudGVyU2NvcGUodGhpcyk7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gY3JlYXRlUHJveHkoYmFzZSwgdm9pZCAwKTtcbiAgICAgICAgbGV0IGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSByZWNpcGUocHJveHkpO1xuICAgICAgICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKGhhc0Vycm9yKVxuICAgICAgICAgICAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxlYXZlU2NvcGUoc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXN1bHQocmVzdWx0LCBzY29wZSk7XG4gICAgICB9IGVsc2UgaWYgKCFiYXNlIHx8IHR5cGVvZiBiYXNlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlY2lwZShiYXNlKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKVxuICAgICAgICAgIHJlc3VsdCA9IGJhc2U7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IE5PVEhJTkcpXG4gICAgICAgICAgcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICBpZiAodGhpcy5hdXRvRnJlZXplXylcbiAgICAgICAgICBmcmVlemUocmVzdWx0LCB0cnVlKTtcbiAgICAgICAgaWYgKHBhdGNoTGlzdGVuZXIpIHtcbiAgICAgICAgICBjb25zdCBwID0gW107XG4gICAgICAgICAgY29uc3QgaXAgPSBbXTtcbiAgICAgICAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyhiYXNlLCByZXN1bHQsIHAsIGlwKTtcbiAgICAgICAgICBwYXRjaExpc3RlbmVyKHAsIGlwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlXG4gICAgICAgIGRpZSgxLCBiYXNlKTtcbiAgICB9O1xuICAgIHRoaXMucHJvZHVjZVdpdGhQYXRjaGVzID0gKGJhc2UsIHJlY2lwZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBiYXNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIChzdGF0ZSwgLi4uYXJncykgPT4gdGhpcy5wcm9kdWNlV2l0aFBhdGNoZXMoc3RhdGUsIChkcmFmdCkgPT4gYmFzZShkcmFmdCwgLi4uYXJncykpO1xuICAgICAgfVxuICAgICAgbGV0IHBhdGNoZXMsIGludmVyc2VQYXRjaGVzO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9kdWNlKGJhc2UsIHJlY2lwZSwgKHAsIGlwKSA9PiB7XG4gICAgICAgIHBhdGNoZXMgPSBwO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcyA9IGlwO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gW3Jlc3VsdCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXNdO1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiBjb25maWc/LmF1dG9GcmVlemUgPT09IFwiYm9vbGVhblwiKVxuICAgICAgdGhpcy5zZXRBdXRvRnJlZXplKGNvbmZpZy5hdXRvRnJlZXplKTtcbiAgICBpZiAodHlwZW9mIGNvbmZpZz8udXNlU3RyaWN0U2hhbGxvd0NvcHkgPT09IFwiYm9vbGVhblwiKVxuICAgICAgdGhpcy5zZXRVc2VTdHJpY3RTaGFsbG93Q29weShjb25maWcudXNlU3RyaWN0U2hhbGxvd0NvcHkpO1xuICB9XG4gIGNyZWF0ZURyYWZ0KGJhc2UpIHtcbiAgICBpZiAoIWlzRHJhZnRhYmxlKGJhc2UpKVxuICAgICAgZGllKDgpO1xuICAgIGlmIChpc0RyYWZ0KGJhc2UpKVxuICAgICAgYmFzZSA9IGN1cnJlbnQoYmFzZSk7XG4gICAgY29uc3Qgc2NvcGUgPSBlbnRlclNjb3BlKHRoaXMpO1xuICAgIGNvbnN0IHByb3h5ID0gY3JlYXRlUHJveHkoYmFzZSwgdm9pZCAwKTtcbiAgICBwcm94eVtEUkFGVF9TVEFURV0uaXNNYW51YWxfID0gdHJ1ZTtcbiAgICBsZWF2ZVNjb3BlKHNjb3BlKTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cbiAgZmluaXNoRHJhZnQoZHJhZnQsIHBhdGNoTGlzdGVuZXIpIHtcbiAgICBjb25zdCBzdGF0ZSA9IGRyYWZ0ICYmIGRyYWZ0W0RSQUZUX1NUQVRFXTtcbiAgICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5pc01hbnVhbF8pXG4gICAgICBkaWUoOSk7XG4gICAgY29uc3QgeyBzY29wZV86IHNjb3BlIH0gPSBzdGF0ZTtcbiAgICB1c2VQYXRjaGVzSW5TY29wZShzY29wZSwgcGF0Y2hMaXN0ZW5lcik7XG4gICAgcmV0dXJuIHByb2Nlc3NSZXN1bHQodm9pZCAwLCBzY29wZSk7XG4gIH1cbiAgLyoqXG4gICAqIFBhc3MgdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IGZyZWV6ZSBhbGwgY29waWVzIGNyZWF0ZWQgYnkgSW1tZXIuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGF1dG8tZnJlZXppbmcgaXMgZW5hYmxlZC5cbiAgICovXG4gIHNldEF1dG9GcmVlemUodmFsdWUpIHtcbiAgICB0aGlzLmF1dG9GcmVlemVfID0gdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFBhc3MgdHJ1ZSB0byBlbmFibGUgc3RyaWN0IHNoYWxsb3cgY29weS5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgaW1tZXIgZG9lcyBub3QgY29weSB0aGUgb2JqZWN0IGRlc2NyaXB0b3JzIHN1Y2ggYXMgZ2V0dGVyLCBzZXR0ZXIgYW5kIG5vbi1lbnVtcmFibGUgcHJvcGVydGllcy5cbiAgICovXG4gIHNldFVzZVN0cmljdFNoYWxsb3dDb3B5KHZhbHVlKSB7XG4gICAgdGhpcy51c2VTdHJpY3RTaGFsbG93Q29weV8gPSB2YWx1ZTtcbiAgfVxuICBhcHBseVBhdGNoZXMoYmFzZSwgcGF0Y2hlcykge1xuICAgIGxldCBpO1xuICAgIGZvciAoaSA9IHBhdGNoZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHBhdGNoID0gcGF0Y2hlc1tpXTtcbiAgICAgIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA9PT0gMCAmJiBwYXRjaC5vcCA9PT0gXCJyZXBsYWNlXCIpIHtcbiAgICAgICAgYmFzZSA9IHBhdGNoLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPiAtMSkge1xuICAgICAgcGF0Y2hlcyA9IHBhdGNoZXMuc2xpY2UoaSArIDEpO1xuICAgIH1cbiAgICBjb25zdCBhcHBseVBhdGNoZXNJbXBsID0gZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5hcHBseVBhdGNoZXNfO1xuICAgIGlmIChpc0RyYWZ0KGJhc2UpKSB7XG4gICAgICByZXR1cm4gYXBwbHlQYXRjaGVzSW1wbChiYXNlLCBwYXRjaGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJvZHVjZShcbiAgICAgIGJhc2UsXG4gICAgICAoZHJhZnQpID0+IGFwcGx5UGF0Y2hlc0ltcGwoZHJhZnQsIHBhdGNoZXMpXG4gICAgKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZVByb3h5KHZhbHVlLCBwYXJlbnQpIHtcbiAgY29uc3QgZHJhZnQgPSBpc01hcCh2YWx1ZSkgPyBnZXRQbHVnaW4oXCJNYXBTZXRcIikucHJveHlNYXBfKHZhbHVlLCBwYXJlbnQpIDogaXNTZXQodmFsdWUpID8gZ2V0UGx1Z2luKFwiTWFwU2V0XCIpLnByb3h5U2V0Xyh2YWx1ZSwgcGFyZW50KSA6IGNyZWF0ZVByb3h5UHJveHkodmFsdWUsIHBhcmVudCk7XG4gIGNvbnN0IHNjb3BlID0gcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpO1xuICBzY29wZS5kcmFmdHNfLnB1c2goZHJhZnQpO1xuICByZXR1cm4gZHJhZnQ7XG59XG5cbi8vIHNyYy9jb3JlL2N1cnJlbnQudHNcbmZ1bmN0aW9uIGN1cnJlbnQodmFsdWUpIHtcbiAgaWYgKCFpc0RyYWZ0KHZhbHVlKSlcbiAgICBkaWUoMTAsIHZhbHVlKTtcbiAgcmV0dXJuIGN1cnJlbnRJbXBsKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGN1cnJlbnRJbXBsKHZhbHVlKSB7XG4gIGlmICghaXNEcmFmdGFibGUodmFsdWUpIHx8IGlzRnJvemVuKHZhbHVlKSlcbiAgICByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IHN0YXRlID0gdmFsdWVbRFJBRlRfU1RBVEVdO1xuICBsZXQgY29weTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pXG4gICAgICByZXR1cm4gc3RhdGUuYmFzZV87XG4gICAgc3RhdGUuZmluYWxpemVkXyA9IHRydWU7XG4gICAgY29weSA9IHNoYWxsb3dDb3B5KHZhbHVlLCBzdGF0ZS5zY29wZV8uaW1tZXJfLnVzZVN0cmljdFNoYWxsb3dDb3B5Xyk7XG4gIH0gZWxzZSB7XG4gICAgY29weSA9IHNoYWxsb3dDb3B5KHZhbHVlLCB0cnVlKTtcbiAgfVxuICBlYWNoKGNvcHksIChrZXksIGNoaWxkVmFsdWUpID0+IHtcbiAgICBzZXQoY29weSwga2V5LCBjdXJyZW50SW1wbChjaGlsZFZhbHVlKSk7XG4gIH0pO1xuICBpZiAoc3RhdGUpIHtcbiAgICBzdGF0ZS5maW5hbGl6ZWRfID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG5cbi8vIHNyYy9wbHVnaW5zL3BhdGNoZXMudHNcbmZ1bmN0aW9uIGVuYWJsZVBhdGNoZXMoKSB7XG4gIGNvbnN0IGVycm9yT2Zmc2V0ID0gMTY7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBlcnJvcnMucHVzaChcbiAgICAgICdTZXRzIGNhbm5vdCBoYXZlIFwicmVwbGFjZVwiIHBhdGNoZXMuJyxcbiAgICAgIGZ1bmN0aW9uKG9wKSB7XG4gICAgICAgIHJldHVybiBcIlVuc3VwcG9ydGVkIHBhdGNoIG9wZXJhdGlvbjogXCIgKyBvcDtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBcIkNhbm5vdCBhcHBseSBwYXRjaCwgcGF0aCBkb2Vzbid0IHJlc29sdmU6IFwiICsgcGF0aDtcbiAgICAgIH0sXG4gICAgICBcIlBhdGNoaW5nIHJlc2VydmVkIGF0dHJpYnV0ZXMgbGlrZSBfX3Byb3RvX18sIHByb3RvdHlwZSBhbmQgY29uc3RydWN0b3IgaXMgbm90IGFsbG93ZWRcIlxuICAgICk7XG4gIH1cbiAgY29uc3QgUkVQTEFDRSA9IFwicmVwbGFjZVwiO1xuICBjb25zdCBBREQgPSBcImFkZFwiO1xuICBjb25zdCBSRU1PVkUgPSBcInJlbW92ZVwiO1xuICBmdW5jdGlvbiBnZW5lcmF0ZVBhdGNoZXNfKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBzd2l0Y2ggKHN0YXRlLnR5cGVfKSB7XG4gICAgICBjYXNlIDAgLyogT2JqZWN0ICovOlxuICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlUGF0Y2hlc0Zyb21Bc3NpZ25lZChcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICBwYXRjaGVzLFxuICAgICAgICAgIGludmVyc2VQYXRjaGVzXG4gICAgICAgICk7XG4gICAgICBjYXNlIDEgLyogQXJyYXkgKi86XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZUFycmF5UGF0Y2hlcyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKTtcbiAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZVNldFBhdGNoZXMoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgYmFzZVBhdGgsXG4gICAgICAgICAgcGF0Y2hlcyxcbiAgICAgICAgICBpbnZlcnNlUGF0Y2hlc1xuICAgICAgICApO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZUFycmF5UGF0Y2hlcyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgbGV0IHsgYmFzZV8sIGFzc2lnbmVkXyB9ID0gc3RhdGU7XG4gICAgbGV0IGNvcHlfID0gc3RhdGUuY29weV87XG4gICAgaWYgKGNvcHlfLmxlbmd0aCA8IGJhc2VfLmxlbmd0aCkge1xuICAgICAgO1xuICAgICAgW2Jhc2VfLCBjb3B5X10gPSBbY29weV8sIGJhc2VfXTtcbiAgICAgIFtwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlc10gPSBbaW52ZXJzZVBhdGNoZXMsIHBhdGNoZXNdO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhc2VfLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXNzaWduZWRfW2ldICYmIGNvcHlfW2ldICE9PSBiYXNlX1tpXSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICAvLyBOZWVkIHRvIG1heWJlIGNsb25lIGl0LCBhcyBpdCBjYW4gaW4gZmFjdCBiZSB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICAgICAgICAvLyBkdWUgdG8gdGhlIGJhc2UvY29weSBpbnZlcnNpb24gYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgICB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoY29weV9baV0pXG4gICAgICAgIH0pO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogUkVQTEFDRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChiYXNlX1tpXSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBiYXNlXy5sZW5ndGg7IGkgPCBjb3B5Xy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgb3A6IEFERCxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgLy8gTmVlZCB0byBtYXliZSBjbG9uZSBpdCwgYXMgaXQgY2FuIGluIGZhY3QgYmUgdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgICAgIC8vIGR1ZSB0byB0aGUgYmFzZS9jb3B5IGludmVyc2lvbiBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvblxuICAgICAgICB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoY29weV9baV0pXG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IGNvcHlfLmxlbmd0aCAtIDE7IGJhc2VfLmxlbmd0aCA8PSBpOyAtLWkpIHtcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goe1xuICAgICAgICBvcDogUkVNT1ZFLFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVQYXRjaGVzRnJvbUFzc2lnbmVkKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBjb25zdCB7IGJhc2VfLCBjb3B5XyB9ID0gc3RhdGU7XG4gICAgZWFjaChzdGF0ZS5hc3NpZ25lZF8sIChrZXksIGFzc2lnbmVkVmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdWYWx1ZSA9IGdldChiYXNlXywga2V5KTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0KGNvcHlfLCBrZXkpO1xuICAgICAgY29uc3Qgb3AgPSAhYXNzaWduZWRWYWx1ZSA/IFJFTU9WRSA6IGhhcyhiYXNlXywga2V5KSA/IFJFUExBQ0UgOiBBREQ7XG4gICAgICBpZiAob3JpZ1ZhbHVlID09PSB2YWx1ZSAmJiBvcCA9PT0gUkVQTEFDRSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChrZXkpO1xuICAgICAgcGF0Y2hlcy5wdXNoKG9wID09PSBSRU1PVkUgPyB7IG9wLCBwYXRoIH0gOiB7IG9wLCBwYXRoLCB2YWx1ZSB9KTtcbiAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goXG4gICAgICAgIG9wID09PSBBREQgPyB7IG9wOiBSRU1PVkUsIHBhdGggfSA6IG9wID09PSBSRU1PVkUgPyB7IG9wOiBBREQsIHBhdGgsIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChvcmlnVmFsdWUpIH0gOiB7IG9wOiBSRVBMQUNFLCBwYXRoLCB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob3JpZ1ZhbHVlKSB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlU2V0UGF0Y2hlcyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgbGV0IHsgYmFzZV8sIGNvcHlfIH0gPSBzdGF0ZTtcbiAgICBsZXQgaSA9IDA7XG4gICAgYmFzZV8uZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgIGlmICghY29weV8uaGFzKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFJFTU9WRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcy51bnNoaWZ0KHtcbiAgICAgICAgICBvcDogQURELFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfSk7XG4gICAgaSA9IDA7XG4gICAgY29weV8uZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgIGlmICghYmFzZV8uaGFzKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IEFERCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcy51bnNoaWZ0KHtcbiAgICAgICAgICBvcDogUkVNT1ZFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKGJhc2VWYWx1ZSwgcmVwbGFjZW1lbnQsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgcGF0aDogW10sXG4gICAgICB2YWx1ZTogcmVwbGFjZW1lbnQgPT09IE5PVEhJTkcgPyB2b2lkIDAgOiByZXBsYWNlbWVudFxuICAgIH0pO1xuICAgIGludmVyc2VQYXRjaGVzLnB1c2goe1xuICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICBwYXRoOiBbXSxcbiAgICAgIHZhbHVlOiBiYXNlVmFsdWVcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBhcHBseVBhdGNoZXNfKGRyYWZ0LCBwYXRjaGVzKSB7XG4gICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgY29uc3QgeyBwYXRoLCBvcCB9ID0gcGF0Y2g7XG4gICAgICBsZXQgYmFzZSA9IGRyYWZ0O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJlbnRUeXBlID0gZ2V0QXJjaHR5cGUoYmFzZSk7XG4gICAgICAgIGxldCBwID0gcGF0aFtpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBwICE9PSBcInN0cmluZ1wiICYmIHR5cGVvZiBwICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcCA9IFwiXCIgKyBwO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocGFyZW50VHlwZSA9PT0gMCAvKiBPYmplY3QgKi8gfHwgcGFyZW50VHlwZSA9PT0gMSAvKiBBcnJheSAqLykgJiYgKHAgPT09IFwiX19wcm90b19fXCIgfHwgcCA9PT0gXCJjb25zdHJ1Y3RvclwiKSlcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlID09PSBcImZ1bmN0aW9uXCIgJiYgcCA9PT0gXCJwcm90b3R5cGVcIilcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAzKTtcbiAgICAgICAgYmFzZSA9IGdldChiYXNlLCBwKTtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlICE9PSBcIm9iamVjdFwiKVxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDIsIHBhdGguam9pbihcIi9cIikpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHlwZSA9IGdldEFyY2h0eXBlKGJhc2UpO1xuICAgICAgY29uc3QgdmFsdWUgPSBkZWVwQ2xvbmVQYXRjaFZhbHVlKHBhdGNoLnZhbHVlKTtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgY2FzZSBSRVBMQUNFOlxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Uuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgICAgICAgZGllKGVycm9yT2Zmc2V0KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQUREOlxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAxIC8qIEFycmF5ICovOlxuICAgICAgICAgICAgICByZXR1cm4ga2V5ID09PSBcIi1cIiA/IGJhc2UucHVzaCh2YWx1ZSkgOiBiYXNlLnNwbGljZShrZXksIDAsIHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIFJFTU9WRTpcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMSAvKiBBcnJheSAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Uuc3BsaWNlKGtleSwgMSk7XG4gICAgICAgICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLmRlbGV0ZShwYXRjaC52YWx1ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gZGVsZXRlIGJhc2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMSwgb3ApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkcmFmdDtcbiAgfVxuICBmdW5jdGlvbiBkZWVwQ2xvbmVQYXRjaFZhbHVlKG9iaikge1xuICAgIGlmICghaXNEcmFmdGFibGUob2JqKSlcbiAgICAgIHJldHVybiBvYmo7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSlcbiAgICAgIHJldHVybiBvYmoubWFwKGRlZXBDbG9uZVBhdGNoVmFsdWUpO1xuICAgIGlmIChpc01hcChvYmopKVxuICAgICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICAgIEFycmF5LmZyb20ob2JqLmVudHJpZXMoKSkubWFwKChbaywgdl0pID0+IFtrLCBkZWVwQ2xvbmVQYXRjaFZhbHVlKHYpXSlcbiAgICAgICk7XG4gICAgaWYgKGlzU2V0KG9iaikpXG4gICAgICByZXR1cm4gbmV3IFNldChBcnJheS5mcm9tKG9iaikubWFwKGRlZXBDbG9uZVBhdGNoVmFsdWUpKTtcbiAgICBjb25zdCBjbG9uZWQgPSBPYmplY3QuY3JlYXRlKGdldFByb3RvdHlwZU9mKG9iaikpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iailcbiAgICAgIGNsb25lZFtrZXldID0gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmpba2V5XSk7XG4gICAgaWYgKGhhcyhvYmosIERSQUZUQUJMRSkpXG4gICAgICBjbG9uZWRbRFJBRlRBQkxFXSA9IG9ialtEUkFGVEFCTEVdO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbiAgZnVuY3Rpb24gY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob2JqKSB7XG4gICAgaWYgKGlzRHJhZnQob2JqKSkge1xuICAgICAgcmV0dXJuIGRlZXBDbG9uZVBhdGNoVmFsdWUob2JqKTtcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybiBvYmo7XG4gIH1cbiAgbG9hZFBsdWdpbihcIlBhdGNoZXNcIiwge1xuICAgIGFwcGx5UGF0Y2hlc18sXG4gICAgZ2VuZXJhdGVQYXRjaGVzXyxcbiAgICBnZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc19cbiAgfSk7XG59XG5cbi8vIHNyYy9wbHVnaW5zL21hcHNldC50c1xuZnVuY3Rpb24gZW5hYmxlTWFwU2V0KCkge1xuICBjbGFzcyBEcmFmdE1hcCBleHRlbmRzIE1hcCB7XG4gICAgY29uc3RydWN0b3IodGFyZ2V0LCBwYXJlbnQpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzW0RSQUZUX1NUQVRFXSA9IHtcbiAgICAgICAgdHlwZV86IDIgLyogTWFwICovLFxuICAgICAgICBwYXJlbnRfOiBwYXJlbnQsXG4gICAgICAgIHNjb3BlXzogcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpLFxuICAgICAgICBtb2RpZmllZF86IGZhbHNlLFxuICAgICAgICBmaW5hbGl6ZWRfOiBmYWxzZSxcbiAgICAgICAgY29weV86IHZvaWQgMCxcbiAgICAgICAgYXNzaWduZWRfOiB2b2lkIDAsXG4gICAgICAgIGJhc2VfOiB0YXJnZXQsXG4gICAgICAgIGRyYWZ0XzogdGhpcyxcbiAgICAgICAgaXNNYW51YWxfOiBmYWxzZSxcbiAgICAgICAgcmV2b2tlZF86IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLnNpemU7XG4gICAgfVxuICAgIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLmhhcyhrZXkpO1xuICAgIH1cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAoIWxhdGVzdChzdGF0ZSkuaGFzKGtleSkgfHwgbGF0ZXN0KHN0YXRlKS5nZXQoa2V5KSAhPT0gdmFsdWUpIHtcbiAgICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgc3RhdGUuY29weV8uc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgaWYgKCF0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgaWYgKHN0YXRlLmJhc2VfLmhhcyhrZXkpKSB7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICBzdGF0ZS5jb3B5Xy5kZWxldGUoa2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKGxhdGVzdChzdGF0ZSkuc2l6ZSkge1xuICAgICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgICAgZWFjaChzdGF0ZS5iYXNlXywgKGtleSkgPT4ge1xuICAgICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3JFYWNoKGNiLCB0aGlzQXJnKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgbGF0ZXN0KHN0YXRlKS5mb3JFYWNoKChfdmFsdWUsIGtleSwgX21hcCkgPT4ge1xuICAgICAgICBjYi5jYWxsKHRoaXNBcmcsIHRoaXMuZ2V0KGtleSksIGtleSwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZ2V0KGtleSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGxhdGVzdChzdGF0ZSkuZ2V0KGtleSk7XG4gICAgICBpZiAoc3RhdGUuZmluYWxpemVkXyB8fCAhaXNEcmFmdGFibGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSAhPT0gc3RhdGUuYmFzZV8uZ2V0KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZHJhZnQgPSBjcmVhdGVQcm94eSh2YWx1ZSwgc3RhdGUpO1xuICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgc3RhdGUuY29weV8uc2V0KGtleSwgZHJhZnQpO1xuICAgICAgcmV0dXJuIGRyYWZ0O1xuICAgIH1cbiAgICBrZXlzKCkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkua2V5cygpO1xuICAgIH1cbiAgICB2YWx1ZXMoKSB7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMua2V5cygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHRoaXMudmFsdWVzKCksXG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCByID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChyLmRvbmUpXG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KHIudmFsdWUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgZW50cmllcygpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5rZXlzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gdGhpcy5lbnRyaWVzKCksXG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCByID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChyLmRvbmUpXG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KHIudmFsdWUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBbci52YWx1ZSwgdmFsdWVdXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgWyhEUkFGVF9TVEFURSwgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHByb3h5TWFwXyh0YXJnZXQsIHBhcmVudCkge1xuICAgIHJldHVybiBuZXcgRHJhZnRNYXAodGFyZ2V0LCBwYXJlbnQpO1xuICB9XG4gIGZ1bmN0aW9uIHByZXBhcmVNYXBDb3B5KHN0YXRlKSB7XG4gICAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgICAgc3RhdGUuYXNzaWduZWRfID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIHN0YXRlLmNvcHlfID0gbmV3IE1hcChzdGF0ZS5iYXNlXyk7XG4gICAgfVxuICB9XG4gIGNsYXNzIERyYWZ0U2V0IGV4dGVuZHMgU2V0IHtcbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIHBhcmVudCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXNbRFJBRlRfU1RBVEVdID0ge1xuICAgICAgICB0eXBlXzogMyAvKiBTZXQgKi8sXG4gICAgICAgIHBhcmVudF86IHBhcmVudCxcbiAgICAgICAgc2NvcGVfOiBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCksXG4gICAgICAgIG1vZGlmaWVkXzogZmFsc2UsXG4gICAgICAgIGZpbmFsaXplZF86IGZhbHNlLFxuICAgICAgICBjb3B5Xzogdm9pZCAwLFxuICAgICAgICBiYXNlXzogdGFyZ2V0LFxuICAgICAgICBkcmFmdF86IHRoaXMsXG4gICAgICAgIGRyYWZ0c186IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgICAgIHJldm9rZWRfOiBmYWxzZSxcbiAgICAgICAgaXNNYW51YWxfOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5zaXplO1xuICAgIH1cbiAgICBoYXModmFsdWUpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgICAgICByZXR1cm4gc3RhdGUuYmFzZV8uaGFzKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5jb3B5Xy5oYXModmFsdWUpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChzdGF0ZS5kcmFmdHNfLmhhcyh2YWx1ZSkgJiYgc3RhdGUuY29weV8uaGFzKHN0YXRlLmRyYWZ0c18uZ2V0KHZhbHVlKSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhZGQodmFsdWUpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKCF0aGlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLmFkZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5Xy5kZWxldGUodmFsdWUpIHx8IChzdGF0ZS5kcmFmdHNfLmhhcyh2YWx1ZSkgPyBzdGF0ZS5jb3B5Xy5kZWxldGUoc3RhdGUuZHJhZnRzXy5nZXQodmFsdWUpKSA6IChcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZmFsc2VcbiAgICAgICkpO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKGxhdGVzdChzdGF0ZSkuc2l6ZSkge1xuICAgICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuY29weV8uY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGUuY29weV8udmFsdWVzKCk7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5Xy5lbnRyaWVzKCk7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXMoKTtcbiAgICB9XG4gICAgWyhEUkFGVF9TVEFURSwgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXMoKTtcbiAgICB9XG4gICAgZm9yRWFjaChjYiwgdGhpc0FyZykge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLnZhbHVlcygpO1xuICAgICAgbGV0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgY2IuY2FsbCh0aGlzQXJnLCByZXN1bHQudmFsdWUsIHJlc3VsdC52YWx1ZSwgdGhpcyk7XG4gICAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJveHlTZXRfKHRhcmdldCwgcGFyZW50KSB7XG4gICAgcmV0dXJuIG5ldyBEcmFmdFNldCh0YXJnZXQsIHBhcmVudCk7XG4gIH1cbiAgZnVuY3Rpb24gcHJlcGFyZVNldENvcHkoc3RhdGUpIHtcbiAgICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgICBzdGF0ZS5jb3B5XyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgICBzdGF0ZS5iYXNlXy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXNEcmFmdGFibGUodmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgZHJhZnQgPSBjcmVhdGVQcm94eSh2YWx1ZSwgc3RhdGUpO1xuICAgICAgICAgIHN0YXRlLmRyYWZ0c18uc2V0KHZhbHVlLCBkcmFmdCk7XG4gICAgICAgICAgc3RhdGUuY29weV8uYWRkKGRyYWZ0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS5jb3B5Xy5hZGQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYXNzZXJ0VW5yZXZva2VkKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLnJldm9rZWRfKVxuICAgICAgZGllKDMsIEpTT04uc3RyaW5naWZ5KGxhdGVzdChzdGF0ZSkpKTtcbiAgfVxuICBsb2FkUGx1Z2luKFwiTWFwU2V0XCIsIHsgcHJveHlNYXBfLCBwcm94eVNldF8gfSk7XG59XG5cbi8vIHNyYy9pbW1lci50c1xudmFyIGltbWVyID0gbmV3IEltbWVyMigpO1xudmFyIHByb2R1Y2UgPSBpbW1lci5wcm9kdWNlO1xudmFyIHByb2R1Y2VXaXRoUGF0Y2hlcyA9IGltbWVyLnByb2R1Y2VXaXRoUGF0Y2hlcy5iaW5kKFxuICBpbW1lclxuKTtcbnZhciBzZXRBdXRvRnJlZXplID0gaW1tZXIuc2V0QXV0b0ZyZWV6ZS5iaW5kKGltbWVyKTtcbnZhciBzZXRVc2VTdHJpY3RTaGFsbG93Q29weSA9IGltbWVyLnNldFVzZVN0cmljdFNoYWxsb3dDb3B5LmJpbmQoaW1tZXIpO1xudmFyIGFwcGx5UGF0Y2hlcyA9IGltbWVyLmFwcGx5UGF0Y2hlcy5iaW5kKGltbWVyKTtcbnZhciBjcmVhdGVEcmFmdCA9IGltbWVyLmNyZWF0ZURyYWZ0LmJpbmQoaW1tZXIpO1xudmFyIGZpbmlzaERyYWZ0ID0gaW1tZXIuZmluaXNoRHJhZnQuYmluZChpbW1lcik7XG5mdW5jdGlvbiBjYXN0RHJhZnQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY2FzdEltbXV0YWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQge1xuICBJbW1lcjIgYXMgSW1tZXIsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgY2FzdERyYWZ0LFxuICBjYXN0SW1tdXRhYmxlLFxuICBjcmVhdGVEcmFmdCxcbiAgY3VycmVudCxcbiAgZW5hYmxlTWFwU2V0LFxuICBlbmFibGVQYXRjaGVzLFxuICBmaW5pc2hEcmFmdCxcbiAgZnJlZXplLFxuICBEUkFGVEFCTEUgYXMgaW1tZXJhYmxlLFxuICBpc0RyYWZ0LFxuICBpc0RyYWZ0YWJsZSxcbiAgTk9USElORyBhcyBub3RoaW5nLFxuICBvcmlnaW5hbCxcbiAgcHJvZHVjZSxcbiAgcHJvZHVjZVdpdGhQYXRjaGVzLFxuICBzZXRBdXRvRnJlZXplLFxuICBzZXRVc2VTdHJpY3RTaGFsbG93Q29weVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWltbWVyLm1qcy5tYXAiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlQ2FuY2VsbGFibGVQcm9taXNlKHByb21pc2UpIHtcbiAgICB2YXIgaXNDYW5jZWxsZWQgPSBmYWxzZTtcbiAgICB2YXIgd3JhcHBlZFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHByb21pc2VcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gIWlzQ2FuY2VsbGVkICYmIHJlc29sdmUodmFsdWUpOyB9KVxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikgeyByZXR1cm4gIWlzQ2FuY2VsbGVkICYmIHJlamVjdChlcnJvcik7IH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2U6IHdyYXBwZWRQcm9taXNlLFxuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIiwidmFyIF9fc3ByZWFkQXJyYXkgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuLy8gQXMgZGVmaW5lZCBvbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZXZlbnRzOiBodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXZlbnRzLmh0bWxcbmV4cG9ydCB2YXIgY2xpcGJvYXJkRXZlbnRzID0gWydvbkNvcHknLCAnb25DdXQnLCAnb25QYXN0ZSddO1xuZXhwb3J0IHZhciBjb21wb3NpdGlvbkV2ZW50cyA9IFtcbiAgICAnb25Db21wb3NpdGlvbkVuZCcsXG4gICAgJ29uQ29tcG9zaXRpb25TdGFydCcsXG4gICAgJ29uQ29tcG9zaXRpb25VcGRhdGUnLFxuXTtcbmV4cG9ydCB2YXIgZm9jdXNFdmVudHMgPSBbJ29uRm9jdXMnLCAnb25CbHVyJ107XG5leHBvcnQgdmFyIGZvcm1FdmVudHMgPSBbJ29uSW5wdXQnLCAnb25JbnZhbGlkJywgJ29uUmVzZXQnLCAnb25TdWJtaXQnXTtcbmV4cG9ydCB2YXIgaW1hZ2VFdmVudHMgPSBbJ29uTG9hZCcsICdvbkVycm9yJ107XG5leHBvcnQgdmFyIGtleWJvYXJkRXZlbnRzID0gWydvbktleURvd24nLCAnb25LZXlQcmVzcycsICdvbktleVVwJ107XG5leHBvcnQgdmFyIG1lZGlhRXZlbnRzID0gW1xuICAgICdvbkFib3J0JyxcbiAgICAnb25DYW5QbGF5JyxcbiAgICAnb25DYW5QbGF5VGhyb3VnaCcsXG4gICAgJ29uRHVyYXRpb25DaGFuZ2UnLFxuICAgICdvbkVtcHRpZWQnLFxuICAgICdvbkVuY3J5cHRlZCcsXG4gICAgJ29uRW5kZWQnLFxuICAgICdvbkVycm9yJyxcbiAgICAnb25Mb2FkZWREYXRhJyxcbiAgICAnb25Mb2FkZWRNZXRhZGF0YScsXG4gICAgJ29uTG9hZFN0YXJ0JyxcbiAgICAnb25QYXVzZScsXG4gICAgJ29uUGxheScsXG4gICAgJ29uUGxheWluZycsXG4gICAgJ29uUHJvZ3Jlc3MnLFxuICAgICdvblJhdGVDaGFuZ2UnLFxuICAgICdvblNlZWtlZCcsXG4gICAgJ29uU2Vla2luZycsXG4gICAgJ29uU3RhbGxlZCcsXG4gICAgJ29uU3VzcGVuZCcsXG4gICAgJ29uVGltZVVwZGF0ZScsXG4gICAgJ29uVm9sdW1lQ2hhbmdlJyxcbiAgICAnb25XYWl0aW5nJyxcbl07XG5leHBvcnQgdmFyIG1vdXNlRXZlbnRzID0gW1xuICAgICdvbkNsaWNrJyxcbiAgICAnb25Db250ZXh0TWVudScsXG4gICAgJ29uRG91YmxlQ2xpY2snLFxuICAgICdvbk1vdXNlRG93bicsXG4gICAgJ29uTW91c2VFbnRlcicsXG4gICAgJ29uTW91c2VMZWF2ZScsXG4gICAgJ29uTW91c2VNb3ZlJyxcbiAgICAnb25Nb3VzZU91dCcsXG4gICAgJ29uTW91c2VPdmVyJyxcbiAgICAnb25Nb3VzZVVwJyxcbl07XG5leHBvcnQgdmFyIGRyYWdFdmVudHMgPSBbXG4gICAgJ29uRHJhZycsXG4gICAgJ29uRHJhZ0VuZCcsXG4gICAgJ29uRHJhZ0VudGVyJyxcbiAgICAnb25EcmFnRXhpdCcsXG4gICAgJ29uRHJhZ0xlYXZlJyxcbiAgICAnb25EcmFnT3ZlcicsXG4gICAgJ29uRHJhZ1N0YXJ0JyxcbiAgICAnb25Ecm9wJyxcbl07XG5leHBvcnQgdmFyIHNlbGVjdGlvbkV2ZW50cyA9IFsnb25TZWxlY3QnXTtcbmV4cG9ydCB2YXIgdG91Y2hFdmVudHMgPSBbJ29uVG91Y2hDYW5jZWwnLCAnb25Ub3VjaEVuZCcsICdvblRvdWNoTW92ZScsICdvblRvdWNoU3RhcnQnXTtcbmV4cG9ydCB2YXIgcG9pbnRlckV2ZW50cyA9IFtcbiAgICAnb25Qb2ludGVyRG93bicsXG4gICAgJ29uUG9pbnRlck1vdmUnLFxuICAgICdvblBvaW50ZXJVcCcsXG4gICAgJ29uUG9pbnRlckNhbmNlbCcsXG4gICAgJ29uR290UG9pbnRlckNhcHR1cmUnLFxuICAgICdvbkxvc3RQb2ludGVyQ2FwdHVyZScsXG4gICAgJ29uUG9pbnRlckVudGVyJyxcbiAgICAnb25Qb2ludGVyTGVhdmUnLFxuICAgICdvblBvaW50ZXJPdmVyJyxcbiAgICAnb25Qb2ludGVyT3V0Jyxcbl07XG5leHBvcnQgdmFyIHVpRXZlbnRzID0gWydvblNjcm9sbCddO1xuZXhwb3J0IHZhciB3aGVlbEV2ZW50cyA9IFsnb25XaGVlbCddO1xuZXhwb3J0IHZhciBhbmltYXRpb25FdmVudHMgPSBbXG4gICAgJ29uQW5pbWF0aW9uU3RhcnQnLFxuICAgICdvbkFuaW1hdGlvbkVuZCcsXG4gICAgJ29uQW5pbWF0aW9uSXRlcmF0aW9uJyxcbl07XG5leHBvcnQgdmFyIHRyYW5zaXRpb25FdmVudHMgPSBbJ29uVHJhbnNpdGlvbkVuZCddO1xuZXhwb3J0IHZhciBvdGhlckV2ZW50cyA9IFsnb25Ub2dnbGUnXTtcbmV4cG9ydCB2YXIgY2hhbmdlRXZlbnRzID0gWydvbkNoYW5nZSddO1xuZXhwb3J0IHZhciBhbGxFdmVudHMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgY2xpcGJvYXJkRXZlbnRzLCB0cnVlKSwgY29tcG9zaXRpb25FdmVudHMsIHRydWUpLCBmb2N1c0V2ZW50cywgdHJ1ZSksIGZvcm1FdmVudHMsIHRydWUpLCBpbWFnZUV2ZW50cywgdHJ1ZSksIGtleWJvYXJkRXZlbnRzLCB0cnVlKSwgbWVkaWFFdmVudHMsIHRydWUpLCBtb3VzZUV2ZW50cywgdHJ1ZSksIGRyYWdFdmVudHMsIHRydWUpLCBzZWxlY3Rpb25FdmVudHMsIHRydWUpLCB0b3VjaEV2ZW50cywgdHJ1ZSksIHBvaW50ZXJFdmVudHMsIHRydWUpLCB1aUV2ZW50cywgdHJ1ZSksIHdoZWVsRXZlbnRzLCB0cnVlKSwgYW5pbWF0aW9uRXZlbnRzLCB0cnVlKSwgdHJhbnNpdGlvbkV2ZW50cywgdHJ1ZSksIGNoYW5nZUV2ZW50cywgdHJ1ZSksIG90aGVyRXZlbnRzLCB0cnVlKTtcbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBvbi1ldmVudCBjYWxsYmFjayBwcm9wcyBjdXJyaWVkIHdpdGggcHJvdmlkZWQgYXJncy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wcyBwYXNzZWQgdG8gYSBjb21wb25lbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gZ2V0QXJncyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhcmd1bWVudChzKSBvbi1ldmVudCBjYWxsYmFja3NcbiAqICAgc2hhbGwgYmUgY3VycmllZCB3aXRoLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlRXZlbnRQcm9wcyhwcm9wcywgZ2V0QXJncykge1xuICAgIHZhciBldmVudFByb3BzID0ge307XG4gICAgYWxsRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICB2YXIgZXZlbnRIYW5kbGVyID0gcHJvcHNbZXZlbnROYW1lXTtcbiAgICAgICAgaWYgKCFldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0QXJncykge1xuICAgICAgICAgICAgZXZlbnRQcm9wc1tldmVudE5hbWVdID0gKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmVudEhhbmRsZXIoZXZlbnQsIGdldEFyZ3MoZXZlbnROYW1lKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGV2ZW50UHJvcHNbZXZlbnROYW1lXSA9IGV2ZW50SGFuZGxlcjtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBldmVudFByb3BzO1xufVxuIiwiLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgbWVyZ2VzIFJlYWN0IHJlZnMgaW50byBvbmUuXG4gKiBTdXBwb3J0cyBib3RoIGZ1bmN0aW9ucyBhbmQgcmVmIG9iamVjdHMgY3JlYXRlZCB1c2luZyBjcmVhdGVSZWYoKSBhbmQgdXNlUmVmKCkuXG4gKlxuICogVXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxkaXYgcmVmPXttZXJnZVJlZnMocmVmMSwgcmVmMiwgcmVmMyl9IC8+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyhSZWFjdC5SZWY8VD4gfCB1bmRlZmluZWQpW119IGlucHV0UmVmcyBBcnJheSBvZiByZWZzXG4gKiBAcmV0dXJucyB7UmVhY3QuUmVmPFQ+IHwgUmVhY3QuUmVmQ2FsbGJhY2s8VD59IE1lcmdlZCByZWZzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlUmVmcygpIHtcbiAgICB2YXIgaW5wdXRSZWZzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgaW5wdXRSZWZzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBmaWx0ZXJlZElucHV0UmVmcyA9IGlucHV0UmVmcy5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKGZpbHRlcmVkSW5wdXRSZWZzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIHZhciBmaXJzdFJlZiA9IGZpbHRlcmVkSW5wdXRSZWZzWzBdO1xuICAgICAgICByZXR1cm4gZmlyc3RSZWYgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZFJlZnMocmVmKSB7XG4gICAgICAgIGZpbHRlcmVkSW5wdXRSZWZzLmZvckVhY2goZnVuY3Rpb24gKGlucHV0UmVmKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0UmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRSZWYocmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlucHV0UmVmKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRSZWYuY3VycmVudCA9IHJlZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbiIsIi8qKlxuICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlXG4gKiBKYXZhU2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlXG4gKlxuICogQ29weXJpZ2h0IDIwMjMgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZVxuICogSmF2YVNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZVxuICovXG5cbi8qKioqKiovIC8vIFRoZSByZXF1aXJlIHNjb3BlXG4vKioqKioqLyB2YXIgX193ZWJwYWNrX3JlcXVpcmVfXyA9IHt9O1xuLyoqKioqKi8gXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzICovXG4vKioqKioqLyAoKCkgPT4ge1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG4vKioqKioqLyBcdFx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuLyoqKioqKi8gXHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG4vKioqKioqLyBcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi8gfSkoKTtcbi8qKioqKiovIFxuLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCAqL1xuLyoqKioqKi8gKCgpID0+IHtcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKVxuLyoqKioqKi8gfSkoKTtcbi8qKioqKiovIFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gZ2xvYmFsVGhpcy5wZGZqc0xpYiA9IHt9O1xuXG4vLyBFWFBPUlRTXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuICBBYm9ydEV4Y2VwdGlvbjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIEFib3J0RXhjZXB0aW9uKSxcbiAgQW5ub3RhdGlvbkVkaXRvckxheWVyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQW5ub3RhdGlvbkVkaXRvckxheWVyKSxcbiAgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGU6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSksXG4gIEFubm90YXRpb25FZGl0b3JUeXBlOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQW5ub3RhdGlvbkVkaXRvclR5cGUpLFxuICBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciksXG4gIEFubm90YXRpb25MYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIEFubm90YXRpb25MYXllciksXG4gIEFubm90YXRpb25Nb2RlOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQW5ub3RhdGlvbk1vZGUpLFxuICBDTWFwQ29tcHJlc3Npb25UeXBlOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQ01hcENvbXByZXNzaW9uVHlwZSksXG4gIENvbG9yUGlja2VyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQ29sb3JQaWNrZXIpLFxuICBET01TVkdGYWN0b3J5OiAoKSA9PiAoLyogcmVleHBvcnQgKi8gRE9NU1ZHRmFjdG9yeSksXG4gIERyYXdMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIERyYXdMYXllciksXG4gIEZlYXR1cmVUZXN0OiAoKSA9PiAoLyogcmVleHBvcnQgKi8gdXRpbF9GZWF0dXJlVGVzdCksXG4gIEdsb2JhbFdvcmtlck9wdGlvbnM6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBHbG9iYWxXb3JrZXJPcHRpb25zKSxcbiAgSW1hZ2VLaW5kOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gdXRpbF9JbWFnZUtpbmQpLFxuICBJbnZhbGlkUERGRXhjZXB0aW9uOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gSW52YWxpZFBERkV4Y2VwdGlvbiksXG4gIE1pc3NpbmdQREZFeGNlcHRpb246ICgpID0+ICgvKiByZWV4cG9ydCAqLyBNaXNzaW5nUERGRXhjZXB0aW9uKSxcbiAgT1BTOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gT1BTKSxcbiAgT3V0bGluZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBPdXRsaW5lciksXG4gIFBERkRhdGFSYW5nZVRyYW5zcG9ydDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFBERkRhdGFSYW5nZVRyYW5zcG9ydCksXG4gIFBERkRhdGVTdHJpbmc6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBQREZEYXRlU3RyaW5nKSxcbiAgUERGV29ya2VyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gUERGV29ya2VyKSxcbiAgUGFzc3dvcmRSZXNwb25zZXM6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBQYXNzd29yZFJlc3BvbnNlcyksXG4gIFBlcm1pc3Npb25GbGFnOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gUGVybWlzc2lvbkZsYWcpLFxuICBQaXhlbHNQZXJJbmNoOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gUGl4ZWxzUGVySW5jaCksXG4gIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiksXG4gIFRleHRMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFRleHRMYXllciksXG4gIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiksXG4gIFV0aWw6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBVdGlsKSxcbiAgVmVyYm9zaXR5TGV2ZWw6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBWZXJib3NpdHlMZXZlbCksXG4gIFhmYUxheWVyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gWGZhTGF5ZXIpLFxuICBidWlsZDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGJ1aWxkKSxcbiAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpLFxuICBmZXRjaERhdGE6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBmZXRjaERhdGEpLFxuICBnZXREb2N1bWVudDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGdldERvY3VtZW50KSxcbiAgZ2V0RmlsZW5hbWVGcm9tVXJsOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gZ2V0RmlsZW5hbWVGcm9tVXJsKSxcbiAgZ2V0UGRmRmlsZW5hbWVGcm9tVXJsOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gZ2V0UGRmRmlsZW5hbWVGcm9tVXJsKSxcbiAgZ2V0WGZhUGFnZVZpZXdwb3J0OiAoKSA9PiAoLyogcmVleHBvcnQgKi8gZ2V0WGZhUGFnZVZpZXdwb3J0KSxcbiAgaXNEYXRhU2NoZW1lOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gaXNEYXRhU2NoZW1lKSxcbiAgaXNQZGZGaWxlOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gaXNQZGZGaWxlKSxcbiAgbm9Db250ZXh0TWVudTogKCkgPT4gKC8qIHJlZXhwb3J0ICovIG5vQ29udGV4dE1lbnUpLFxuICBub3JtYWxpemVVbmljb2RlOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gbm9ybWFsaXplVW5pY29kZSksXG4gIHJlbmRlclRleHRMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIHJlbmRlclRleHRMYXllciksXG4gIHNldExheWVyRGltZW5zaW9uczogKCkgPT4gKC8qIHJlZXhwb3J0ICovIHNldExheWVyRGltZW5zaW9ucyksXG4gIHNoYWRvdzogKCkgPT4gKC8qIHJlZXhwb3J0ICovIHNoYWRvdyksXG4gIHVwZGF0ZVRleHRMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIHVwZGF0ZVRleHRMYXllciksXG4gIHZlcnNpb246ICgpID0+ICgvKiByZWV4cG9ydCAqLyB2ZXJzaW9uKVxufSk7XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9zaGFyZWQvdXRpbC5qc1xuY29uc3QgaXNOb2RlSlMgPSB0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiBwcm9jZXNzICsgXCJcIiA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIgJiYgIXByb2Nlc3MudmVyc2lvbnMubncgJiYgIShwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uICYmIHByb2Nlc3MudHlwZSAmJiBwcm9jZXNzLnR5cGUgIT09IFwiYnJvd3NlclwiKTtcbmNvbnN0IElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTtcbmNvbnN0IEZPTlRfSURFTlRJVFlfTUFUUklYID0gWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF07XG5jb25zdCBNQVhfSU1BR0VfU0laRV9UT19DQUNIRSA9IDEwZTY7XG5jb25zdCBMSU5FX0ZBQ1RPUiA9IDEuMzU7XG5jb25zdCBMSU5FX0RFU0NFTlRfRkFDVE9SID0gMC4zNTtcbmNvbnN0IEJBU0VMSU5FX0ZBQ1RPUiA9IExJTkVfREVTQ0VOVF9GQUNUT1IgLyBMSU5FX0ZBQ1RPUjtcbmNvbnN0IFJlbmRlcmluZ0ludGVudEZsYWcgPSB7XG4gIEFOWTogMHgwMSxcbiAgRElTUExBWTogMHgwMixcbiAgUFJJTlQ6IDB4MDQsXG4gIFNBVkU6IDB4MDgsXG4gIEFOTk9UQVRJT05TX0ZPUk1TOiAweDEwLFxuICBBTk5PVEFUSU9OU19TVE9SQUdFOiAweDIwLFxuICBBTk5PVEFUSU9OU19ESVNBQkxFOiAweDQwLFxuICBPUExJU1Q6IDB4MTAwXG59O1xuY29uc3QgQW5ub3RhdGlvbk1vZGUgPSB7XG4gIERJU0FCTEU6IDAsXG4gIEVOQUJMRTogMSxcbiAgRU5BQkxFX0ZPUk1TOiAyLFxuICBFTkFCTEVfU1RPUkFHRTogM1xufTtcbmNvbnN0IEFubm90YXRpb25FZGl0b3JQcmVmaXggPSBcInBkZmpzX2ludGVybmFsX2VkaXRvcl9cIjtcbmNvbnN0IEFubm90YXRpb25FZGl0b3JUeXBlID0ge1xuICBESVNBQkxFOiAtMSxcbiAgTk9ORTogMCxcbiAgRlJFRVRFWFQ6IDMsXG4gIEhJR0hMSUdIVDogOSxcbiAgU1RBTVA6IDEzLFxuICBJTks6IDE1XG59O1xuY29uc3QgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSB7XG4gIFJFU0laRTogMSxcbiAgQ1JFQVRFOiAyLFxuICBGUkVFVEVYVF9TSVpFOiAxMSxcbiAgRlJFRVRFWFRfQ09MT1I6IDEyLFxuICBGUkVFVEVYVF9PUEFDSVRZOiAxMyxcbiAgSU5LX0NPTE9SOiAyMSxcbiAgSU5LX1RISUNLTkVTUzogMjIsXG4gIElOS19PUEFDSVRZOiAyMyxcbiAgSElHSExJR0hUX0NPTE9SOiAzMSxcbiAgSElHSExJR0hUX0RFRkFVTFRfQ09MT1I6IDMyLFxuICBISUdITElHSFRfVEhJQ0tORVNTOiAzMyxcbiAgSElHSExJR0hUX0ZSRUU6IDM0LFxuICBISUdITElHSFRfU0hPV19BTEw6IDM1XG59O1xuY29uc3QgUGVybWlzc2lvbkZsYWcgPSB7XG4gIFBSSU5UOiAweDA0LFxuICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsXG4gIENPUFk6IDB4MTAsXG4gIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCxcbiAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsXG4gIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLFxuICBBU1NFTUJMRTogMHg0MDAsXG4gIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDBcbn07XG5jb25zdCBUZXh0UmVuZGVyaW5nTW9kZSA9IHtcbiAgRklMTDogMCxcbiAgU1RST0tFOiAxLFxuICBGSUxMX1NUUk9LRTogMixcbiAgSU5WSVNJQkxFOiAzLFxuICBGSUxMX0FERF9UT19QQVRIOiA0LFxuICBTVFJPS0VfQUREX1RPX1BBVEg6IDUsXG4gIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LFxuICBBRERfVE9fUEFUSDogNyxcbiAgRklMTF9TVFJPS0VfTUFTSzogMyxcbiAgQUREX1RPX1BBVEhfRkxBRzogNFxufTtcbmNvbnN0IHV0aWxfSW1hZ2VLaW5kID0ge1xuICBHUkFZU0NBTEVfMUJQUDogMSxcbiAgUkdCXzI0QlBQOiAyLFxuICBSR0JBXzMyQlBQOiAzXG59O1xuY29uc3QgQW5ub3RhdGlvblR5cGUgPSB7XG4gIFRFWFQ6IDEsXG4gIExJTks6IDIsXG4gIEZSRUVURVhUOiAzLFxuICBMSU5FOiA0LFxuICBTUVVBUkU6IDUsXG4gIENJUkNMRTogNixcbiAgUE9MWUdPTjogNyxcbiAgUE9MWUxJTkU6IDgsXG4gIEhJR0hMSUdIVDogOSxcbiAgVU5ERVJMSU5FOiAxMCxcbiAgU1FVSUdHTFk6IDExLFxuICBTVFJJS0VPVVQ6IDEyLFxuICBTVEFNUDogMTMsXG4gIENBUkVUOiAxNCxcbiAgSU5LOiAxNSxcbiAgUE9QVVA6IDE2LFxuICBGSUxFQVRUQUNITUVOVDogMTcsXG4gIFNPVU5EOiAxOCxcbiAgTU9WSUU6IDE5LFxuICBXSURHRVQ6IDIwLFxuICBTQ1JFRU46IDIxLFxuICBQUklOVEVSTUFSSzogMjIsXG4gIFRSQVBORVQ6IDIzLFxuICBXQVRFUk1BUks6IDI0LFxuICBUSFJFRUQ6IDI1LFxuICBSRURBQ1Q6IDI2XG59O1xuY29uc3QgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHtcbiAgR1JPVVA6IFwiR3JvdXBcIixcbiAgUkVQTFk6IFwiUlwiXG59O1xuY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7XG4gIElOVklTSUJMRTogMHgwMSxcbiAgSElEREVOOiAweDAyLFxuICBQUklOVDogMHgwNCxcbiAgTk9aT09NOiAweDA4LFxuICBOT1JPVEFURTogMHgxMCxcbiAgTk9WSUVXOiAweDIwLFxuICBSRUFET05MWTogMHg0MCxcbiAgTE9DS0VEOiAweDgwLFxuICBUT0dHTEVOT1ZJRVc6IDB4MTAwLFxuICBMT0NLRURDT05URU5UUzogMHgyMDBcbn07XG5jb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0ge1xuICBSRUFET05MWTogMHgwMDAwMDAxLFxuICBSRVFVSVJFRDogMHgwMDAwMDAyLFxuICBOT0VYUE9SVDogMHgwMDAwMDA0LFxuICBNVUxUSUxJTkU6IDB4MDAwMTAwMCxcbiAgUEFTU1dPUkQ6IDB4MDAwMjAwMCxcbiAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLFxuICBSQURJTzogMHgwMDA4MDAwLFxuICBQVVNIQlVUVE9OOiAweDAwMTAwMDAsXG4gIENPTUJPOiAweDAwMjAwMDAsXG4gIEVESVQ6IDB4MDA0MDAwMCxcbiAgU09SVDogMHgwMDgwMDAwLFxuICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsXG4gIE1VTFRJU0VMRUNUOiAweDAyMDAwMDAsXG4gIERPTk9UU1BFTExDSEVDSzogMHgwNDAwMDAwLFxuICBET05PVFNDUk9MTDogMHgwODAwMDAwLFxuICBDT01COiAweDEwMDAwMDAsXG4gIFJJQ0hURVhUOiAweDIwMDAwMDAsXG4gIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsXG4gIENPTU1JVE9OU0VMQ0hBTkdFOiAweDQwMDAwMDBcbn07XG5jb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0ge1xuICBTT0xJRDogMSxcbiAgREFTSEVEOiAyLFxuICBCRVZFTEVEOiAzLFxuICBJTlNFVDogNCxcbiAgVU5ERVJMSU5FOiA1XG59O1xuY29uc3QgQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZSA9IHtcbiAgRTogXCJNb3VzZSBFbnRlclwiLFxuICBYOiBcIk1vdXNlIEV4aXRcIixcbiAgRDogXCJNb3VzZSBEb3duXCIsXG4gIFU6IFwiTW91c2UgVXBcIixcbiAgRm86IFwiRm9jdXNcIixcbiAgQmw6IFwiQmx1clwiLFxuICBQTzogXCJQYWdlT3BlblwiLFxuICBQQzogXCJQYWdlQ2xvc2VcIixcbiAgUFY6IFwiUGFnZVZpc2libGVcIixcbiAgUEk6IFwiUGFnZUludmlzaWJsZVwiLFxuICBLOiBcIktleXN0cm9rZVwiLFxuICBGOiBcIkZvcm1hdFwiLFxuICBWOiBcIlZhbGlkYXRlXCIsXG4gIEM6IFwiQ2FsY3VsYXRlXCJcbn07XG5jb25zdCBEb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IHtcbiAgV0M6IFwiV2lsbENsb3NlXCIsXG4gIFdTOiBcIldpbGxTYXZlXCIsXG4gIERTOiBcIkRpZFNhdmVcIixcbiAgV1A6IFwiV2lsbFByaW50XCIsXG4gIERQOiBcIkRpZFByaW50XCJcbn07XG5jb25zdCBQYWdlQWN0aW9uRXZlbnRUeXBlID0ge1xuICBPOiBcIlBhZ2VPcGVuXCIsXG4gIEM6IFwiUGFnZUNsb3NlXCJcbn07XG5jb25zdCBWZXJib3NpdHlMZXZlbCA9IHtcbiAgRVJST1JTOiAwLFxuICBXQVJOSU5HUzogMSxcbiAgSU5GT1M6IDVcbn07XG5jb25zdCBDTWFwQ29tcHJlc3Npb25UeXBlID0ge1xuICBOT05FOiAwLFxuICBCSU5BUlk6IDFcbn07XG5jb25zdCBPUFMgPSB7XG4gIGRlcGVuZGVuY3k6IDEsXG4gIHNldExpbmVXaWR0aDogMixcbiAgc2V0TGluZUNhcDogMyxcbiAgc2V0TGluZUpvaW46IDQsXG4gIHNldE1pdGVyTGltaXQ6IDUsXG4gIHNldERhc2g6IDYsXG4gIHNldFJlbmRlcmluZ0ludGVudDogNyxcbiAgc2V0RmxhdG5lc3M6IDgsXG4gIHNldEdTdGF0ZTogOSxcbiAgc2F2ZTogMTAsXG4gIHJlc3RvcmU6IDExLFxuICB0cmFuc2Zvcm06IDEyLFxuICBtb3ZlVG86IDEzLFxuICBsaW5lVG86IDE0LFxuICBjdXJ2ZVRvOiAxNSxcbiAgY3VydmVUbzI6IDE2LFxuICBjdXJ2ZVRvMzogMTcsXG4gIGNsb3NlUGF0aDogMTgsXG4gIHJlY3RhbmdsZTogMTksXG4gIHN0cm9rZTogMjAsXG4gIGNsb3NlU3Ryb2tlOiAyMSxcbiAgZmlsbDogMjIsXG4gIGVvRmlsbDogMjMsXG4gIGZpbGxTdHJva2U6IDI0LFxuICBlb0ZpbGxTdHJva2U6IDI1LFxuICBjbG9zZUZpbGxTdHJva2U6IDI2LFxuICBjbG9zZUVPRmlsbFN0cm9rZTogMjcsXG4gIGVuZFBhdGg6IDI4LFxuICBjbGlwOiAyOSxcbiAgZW9DbGlwOiAzMCxcbiAgYmVnaW5UZXh0OiAzMSxcbiAgZW5kVGV4dDogMzIsXG4gIHNldENoYXJTcGFjaW5nOiAzMyxcbiAgc2V0V29yZFNwYWNpbmc6IDM0LFxuICBzZXRIU2NhbGU6IDM1LFxuICBzZXRMZWFkaW5nOiAzNixcbiAgc2V0Rm9udDogMzcsXG4gIHNldFRleHRSZW5kZXJpbmdNb2RlOiAzOCxcbiAgc2V0VGV4dFJpc2U6IDM5LFxuICBtb3ZlVGV4dDogNDAsXG4gIHNldExlYWRpbmdNb3ZlVGV4dDogNDEsXG4gIHNldFRleHRNYXRyaXg6IDQyLFxuICBuZXh0TGluZTogNDMsXG4gIHNob3dUZXh0OiA0NCxcbiAgc2hvd1NwYWNlZFRleHQ6IDQ1LFxuICBuZXh0TGluZVNob3dUZXh0OiA0NixcbiAgbmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6IDQ3LFxuICBzZXRDaGFyV2lkdGg6IDQ4LFxuICBzZXRDaGFyV2lkdGhBbmRCb3VuZHM6IDQ5LFxuICBzZXRTdHJva2VDb2xvclNwYWNlOiA1MCxcbiAgc2V0RmlsbENvbG9yU3BhY2U6IDUxLFxuICBzZXRTdHJva2VDb2xvcjogNTIsXG4gIHNldFN0cm9rZUNvbG9yTjogNTMsXG4gIHNldEZpbGxDb2xvcjogNTQsXG4gIHNldEZpbGxDb2xvck46IDU1LFxuICBzZXRTdHJva2VHcmF5OiA1NixcbiAgc2V0RmlsbEdyYXk6IDU3LFxuICBzZXRTdHJva2VSR0JDb2xvcjogNTgsXG4gIHNldEZpbGxSR0JDb2xvcjogNTksXG4gIHNldFN0cm9rZUNNWUtDb2xvcjogNjAsXG4gIHNldEZpbGxDTVlLQ29sb3I6IDYxLFxuICBzaGFkaW5nRmlsbDogNjIsXG4gIGJlZ2luSW5saW5lSW1hZ2U6IDYzLFxuICBiZWdpbkltYWdlRGF0YTogNjQsXG4gIGVuZElubGluZUltYWdlOiA2NSxcbiAgcGFpbnRYT2JqZWN0OiA2NixcbiAgbWFya1BvaW50OiA2NyxcbiAgbWFya1BvaW50UHJvcHM6IDY4LFxuICBiZWdpbk1hcmtlZENvbnRlbnQ6IDY5LFxuICBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogNzAsXG4gIGVuZE1hcmtlZENvbnRlbnQ6IDcxLFxuICBiZWdpbkNvbXBhdDogNzIsXG4gIGVuZENvbXBhdDogNzMsXG4gIHBhaW50Rm9ybVhPYmplY3RCZWdpbjogNzQsXG4gIHBhaW50Rm9ybVhPYmplY3RFbmQ6IDc1LFxuICBiZWdpbkdyb3VwOiA3NixcbiAgZW5kR3JvdXA6IDc3LFxuICBiZWdpbkFubm90YXRpb246IDgwLFxuICBlbmRBbm5vdGF0aW9uOiA4MSxcbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0OiA4MyxcbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IDg0LFxuICBwYWludEltYWdlWE9iamVjdDogODUsXG4gIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OiA4NixcbiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogODcsXG4gIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0OiA4OCxcbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0OiA4OSxcbiAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiA5MCxcbiAgY29uc3RydWN0UGF0aDogOTFcbn07XG5jb25zdCBQYXNzd29yZFJlc3BvbnNlcyA9IHtcbiAgTkVFRF9QQVNTV09SRDogMSxcbiAgSU5DT1JSRUNUX1BBU1NXT1JEOiAyXG59O1xubGV0IHZlcmJvc2l0eSA9IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTO1xuZnVuY3Rpb24gc2V0VmVyYm9zaXR5TGV2ZWwobGV2ZWwpIHtcbiAgaWYgKE51bWJlci5pc0ludGVnZXIobGV2ZWwpKSB7XG4gICAgdmVyYm9zaXR5ID0gbGV2ZWw7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkge1xuICByZXR1cm4gdmVyYm9zaXR5O1xufVxuZnVuY3Rpb24gaW5mbyhtc2cpIHtcbiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUykge1xuICAgIGNvbnNvbGUubG9nKGBJbmZvOiAke21zZ31gKTtcbiAgfVxufVxuZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUykge1xuICAgIGNvbnNvbGUubG9nKGBXYXJuaW5nOiAke21zZ31gKTtcbiAgfVxufVxuZnVuY3Rpb24gdW5yZWFjaGFibGUobXNnKSB7XG4gIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuZnVuY3Rpb24gYXNzZXJ0KGNvbmQsIG1zZykge1xuICBpZiAoIWNvbmQpIHtcbiAgICB1bnJlYWNoYWJsZShtc2cpO1xuICB9XG59XG5mdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKHVybCkge1xuICBzd2l0Y2ggKHVybD8ucHJvdG9jb2wpIHtcbiAgICBjYXNlIFwiaHR0cDpcIjpcbiAgICBjYXNlIFwiaHR0cHM6XCI6XG4gICAgY2FzZSBcImZ0cDpcIjpcbiAgICBjYXNlIFwibWFpbHRvOlwiOlxuICAgIGNhc2UgXCJ0ZWw6XCI6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgYmFzZVVybCA9IG51bGwsIG9wdGlvbnMgPSBudWxsKSB7XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2YgdXJsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAob3B0aW9ucy5hZGREZWZhdWx0UHJvdG9jb2wgJiYgdXJsLnN0YXJ0c1dpdGgoXCJ3d3cuXCIpKSB7XG4gICAgICAgIGNvbnN0IGRvdHMgPSB1cmwubWF0Y2goL1xcLi9nKTtcbiAgICAgICAgaWYgKGRvdHM/Lmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgdXJsID0gYGh0dHA6Ly8ke3VybH1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy50cnlDb252ZXJ0RW5jb2RpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB1cmwgPSBzdHJpbmdUb1VURjhTdHJpbmcodXJsKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhYnNvbHV0ZVVybCA9IGJhc2VVcmwgPyBuZXcgVVJMKHVybCwgYmFzZVVybCkgOiBuZXcgVVJMKHVybCk7XG4gICAgaWYgKF9pc1ZhbGlkUHJvdG9jb2woYWJzb2x1dGVVcmwpKSB7XG4gICAgICByZXR1cm4gYWJzb2x1dGVVcmw7XG4gICAgfVxuICB9IGNhdGNoIHt9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gc2hhZG93KG9iaiwgcHJvcCwgdmFsdWUsIG5vblNlcmlhbGl6YWJsZSA9IGZhbHNlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHtcbiAgICB2YWx1ZSxcbiAgICBlbnVtZXJhYmxlOiAhbm9uU2VyaWFsaXphYmxlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmNvbnN0IEJhc2VFeGNlcHRpb24gPSBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VFeGNlcHRpb24pIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUV4Y2VwdGlvbi5cIik7XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICBCYXNlRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjtcbiAgcmV0dXJuIEJhc2VFeGNlcHRpb247XG59KCk7XG5jbGFzcyBQYXNzd29yZEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIGNvZGUpIHtcbiAgICBzdXBlcihtc2csIFwiUGFzc3dvcmRFeGNlcHRpb25cIik7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuY2xhc3MgVW5rbm93bkVycm9yRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgZGV0YWlscykge1xuICAgIHN1cGVyKG1zZywgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIik7XG4gICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgfVxufVxuY2xhc3MgSW52YWxpZFBERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICBzdXBlcihtc2csIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiKTtcbiAgfVxufVxuY2xhc3MgTWlzc2luZ1BERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICBzdXBlcihtc2csIFwiTWlzc2luZ1BERkV4Y2VwdGlvblwiKTtcbiAgfVxufVxuY2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgc3RhdHVzKSB7XG4gICAgc3VwZXIobXNnLCBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiKTtcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgfVxufVxuY2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIobXNnLCBcIkZvcm1hdEVycm9yXCIpO1xuICB9XG59XG5jbGFzcyBBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICBzdXBlcihtc2csIFwiQWJvcnRFeGNlcHRpb25cIik7XG4gIH1cbn1cbmZ1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoYnl0ZXMpIHtcbiAgaWYgKHR5cGVvZiBieXRlcyAhPT0gXCJvYmplY3RcIiB8fCBieXRlcz8ubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICB1bnJlYWNoYWJsZShcIkludmFsaWQgYXJndW1lbnQgZm9yIGJ5dGVzVG9TdHJpbmdcIik7XG4gIH1cbiAgY29uc3QgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuICBjb25zdCBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyO1xuICBpZiAobGVuZ3RoIDwgTUFYX0FSR1VNRU5UX0NPVU5UKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpO1xuICB9XG4gIGNvbnN0IHN0ckJ1ZiA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSBNQVhfQVJHVU1FTlRfQ09VTlQpIHtcbiAgICBjb25zdCBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7XG4gICAgY29uc3QgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7XG4gICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpO1xuICB9XG4gIHJldHVybiBzdHJCdWYuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdW5yZWFjaGFibGUoXCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmdUb0J5dGVzXCIpO1xuICB9XG4gIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzW2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICB9XG4gIHJldHVybiBieXRlcztcbn1cbmZ1bmN0aW9uIHN0cmluZzMyKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDI0ICYgMHhmZiwgdmFsdWUgPj4gMTYgJiAweGZmLCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTtcbn1cbmZ1bmN0aW9uIG9iamVjdFNpemUob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIG9iamVjdEZyb21NYXAobWFwKSB7XG4gIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG1hcCkge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCkge1xuICBjb25zdCBidWZmZXI4ID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gIGJ1ZmZlcjhbMF0gPSAxO1xuICBjb25zdCB2aWV3MzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyOC5idWZmZXIsIDAsIDEpO1xuICByZXR1cm4gdmlldzMyWzBdID09PSAxO1xufVxuZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCkge1xuICB0cnkge1xuICAgIG5ldyBGdW5jdGlvbihcIlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5jbGFzcyB1dGlsX0ZlYXR1cmVUZXN0IHtcbiAgc3RhdGljIGdldCBpc0xpdHRsZUVuZGlhbigpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNMaXR0bGVFbmRpYW5cIiwgaXNMaXR0bGVFbmRpYW4oKSk7XG4gIH1cbiAgc3RhdGljIGdldCBpc0V2YWxTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzRXZhbFN1cHBvcnRlZFwiLCBpc0V2YWxTdXBwb3J0ZWQoKSk7XG4gIH1cbiAgc3RhdGljIGdldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWRcIiwgdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gXCJ1bmRlZmluZWRcIik7XG4gIH1cbiAgc3RhdGljIGdldCBwbGF0Zm9ybSgpIHtcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgbmF2aWdhdG9yPy5wbGF0Zm9ybSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInBsYXRmb3JtXCIsIHtcbiAgICAgICAgaXNNYWM6IG5hdmlnYXRvci5wbGF0Zm9ybS5pbmNsdWRlcyhcIk1hY1wiKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJwbGF0Zm9ybVwiLCB7XG4gICAgICBpc01hYzogZmFsc2VcbiAgICB9KTtcbiAgfVxuICBzdGF0aWMgZ2V0IGlzQ1NTUm91bmRTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzQ1NTUm91bmRTdXBwb3J0ZWRcIiwgZ2xvYmFsVGhpcy5DU1M/LnN1cHBvcnRzPy4oXCJ3aWR0aDogcm91bmQoMS41cHgsIDFweClcIikpO1xuICB9XG59XG5jb25zdCBoZXhOdW1iZXJzID0gQXJyYXkuZnJvbShBcnJheSgyNTYpLmtleXMoKSwgbiA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpO1xuY2xhc3MgVXRpbCB7XG4gIHN0YXRpYyBtYWtlSGV4Q29sb3IociwgZywgYikge1xuICAgIHJldHVybiBgIyR7aGV4TnVtYmVyc1tyXX0ke2hleE51bWJlcnNbZ119JHtoZXhOdW1iZXJzW2JdfWA7XG4gIH1cbiAgc3RhdGljIHNjYWxlTWluTWF4KHRyYW5zZm9ybSwgbWluTWF4KSB7XG4gICAgbGV0IHRlbXA7XG4gICAgaWYgKHRyYW5zZm9ybVswXSkge1xuICAgICAgaWYgKHRyYW5zZm9ybVswXSA8IDApIHtcbiAgICAgICAgdGVtcCA9IG1pbk1heFswXTtcbiAgICAgICAgbWluTWF4WzBdID0gbWluTWF4WzJdO1xuICAgICAgICBtaW5NYXhbMl0gPSB0ZW1wO1xuICAgICAgfVxuICAgICAgbWluTWF4WzBdICo9IHRyYW5zZm9ybVswXTtcbiAgICAgIG1pbk1heFsyXSAqPSB0cmFuc2Zvcm1bMF07XG4gICAgICBpZiAodHJhbnNmb3JtWzNdIDwgMCkge1xuICAgICAgICB0ZW1wID0gbWluTWF4WzFdO1xuICAgICAgICBtaW5NYXhbMV0gPSBtaW5NYXhbM107XG4gICAgICAgIG1pbk1heFszXSA9IHRlbXA7XG4gICAgICB9XG4gICAgICBtaW5NYXhbMV0gKj0gdHJhbnNmb3JtWzNdO1xuICAgICAgbWluTWF4WzNdICo9IHRyYW5zZm9ybVszXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVtcCA9IG1pbk1heFswXTtcbiAgICAgIG1pbk1heFswXSA9IG1pbk1heFsxXTtcbiAgICAgIG1pbk1heFsxXSA9IHRlbXA7XG4gICAgICB0ZW1wID0gbWluTWF4WzJdO1xuICAgICAgbWluTWF4WzJdID0gbWluTWF4WzNdO1xuICAgICAgbWluTWF4WzNdID0gdGVtcDtcbiAgICAgIGlmICh0cmFuc2Zvcm1bMV0gPCAwKSB7XG4gICAgICAgIHRlbXAgPSBtaW5NYXhbMV07XG4gICAgICAgIG1pbk1heFsxXSA9IG1pbk1heFszXTtcbiAgICAgICAgbWluTWF4WzNdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIG1pbk1heFsxXSAqPSB0cmFuc2Zvcm1bMV07XG4gICAgICBtaW5NYXhbM10gKj0gdHJhbnNmb3JtWzFdO1xuICAgICAgaWYgKHRyYW5zZm9ybVsyXSA8IDApIHtcbiAgICAgICAgdGVtcCA9IG1pbk1heFswXTtcbiAgICAgICAgbWluTWF4WzBdID0gbWluTWF4WzJdO1xuICAgICAgICBtaW5NYXhbMl0gPSB0ZW1wO1xuICAgICAgfVxuICAgICAgbWluTWF4WzBdICo9IHRyYW5zZm9ybVsyXTtcbiAgICAgIG1pbk1heFsyXSAqPSB0cmFuc2Zvcm1bMl07XG4gICAgfVxuICAgIG1pbk1heFswXSArPSB0cmFuc2Zvcm1bNF07XG4gICAgbWluTWF4WzFdICs9IHRyYW5zZm9ybVs1XTtcbiAgICBtaW5NYXhbMl0gKz0gdHJhbnNmb3JtWzRdO1xuICAgIG1pbk1heFszXSArPSB0cmFuc2Zvcm1bNV07XG4gIH1cbiAgc3RhdGljIHRyYW5zZm9ybShtMSwgbTIpIHtcbiAgICByZXR1cm4gW20xWzBdICogbTJbMF0gKyBtMVsyXSAqIG0yWzFdLCBtMVsxXSAqIG0yWzBdICsgbTFbM10gKiBtMlsxXSwgbTFbMF0gKiBtMlsyXSArIG0xWzJdICogbTJbM10sIG0xWzFdICogbTJbMl0gKyBtMVszXSAqIG0yWzNdLCBtMVswXSAqIG0yWzRdICsgbTFbMl0gKiBtMls1XSArIG0xWzRdLCBtMVsxXSAqIG0yWzRdICsgbTFbM10gKiBtMls1XSArIG0xWzVdXTtcbiAgfVxuICBzdGF0aWMgYXBwbHlUcmFuc2Zvcm0ocCwgbSkge1xuICAgIGNvbnN0IHh0ID0gcFswXSAqIG1bMF0gKyBwWzFdICogbVsyXSArIG1bNF07XG4gICAgY29uc3QgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTtcbiAgICByZXR1cm4gW3h0LCB5dF07XG4gIH1cbiAgc3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShwLCBtKSB7XG4gICAgY29uc3QgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07XG4gICAgY29uc3QgeHQgPSAocFswXSAqIG1bM10gLSBwWzFdICogbVsyXSArIG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZDtcbiAgICBjb25zdCB5dCA9ICgtcFswXSAqIG1bMV0gKyBwWzFdICogbVswXSArIG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZDtcbiAgICByZXR1cm4gW3h0LCB5dF07XG4gIH1cbiAgc3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHIsIG0pIHtcbiAgICBjb25zdCBwMSA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0ociwgbSk7XG4gICAgY29uc3QgcDIgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKHIuc2xpY2UoMiwgNCksIG0pO1xuICAgIGNvbnN0IHAzID0gdGhpcy5hcHBseVRyYW5zZm9ybShbclswXSwgclszXV0sIG0pO1xuICAgIGNvbnN0IHA0ID0gdGhpcy5hcHBseVRyYW5zZm9ybShbclsyXSwgclsxXV0sIG0pO1xuICAgIHJldHVybiBbTWF0aC5taW4ocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1pbihwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSksIE1hdGgubWF4KHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5tYXgocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pXTtcbiAgfVxuICBzdGF0aWMgaW52ZXJzZVRyYW5zZm9ybShtKSB7XG4gICAgY29uc3QgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07XG4gICAgcmV0dXJuIFttWzNdIC8gZCwgLW1bMV0gLyBkLCAtbVsyXSAvIGQsIG1bMF0gLyBkLCAobVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkLCAobVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkXTtcbiAgfVxuICBzdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobSkge1xuICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTtcbiAgICBjb25zdCBhID0gbVswXSAqIHRyYW5zcG9zZVswXSArIG1bMV0gKiB0cmFuc3Bvc2VbMl07XG4gICAgY29uc3QgYiA9IG1bMF0gKiB0cmFuc3Bvc2VbMV0gKyBtWzFdICogdHJhbnNwb3NlWzNdO1xuICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTtcbiAgICBjb25zdCBkID0gbVsyXSAqIHRyYW5zcG9zZVsxXSArIG1bM10gKiB0cmFuc3Bvc2VbM107XG4gICAgY29uc3QgZmlyc3QgPSAoYSArIGQpIC8gMjtcbiAgICBjb25zdCBzZWNvbmQgPSBNYXRoLnNxcnQoKGEgKyBkKSAqKiAyIC0gNCAqIChhICogZCAtIGMgKiBiKSkgLyAyO1xuICAgIGNvbnN0IHN4ID0gZmlyc3QgKyBzZWNvbmQgfHwgMTtcbiAgICBjb25zdCBzeSA9IGZpcnN0IC0gc2Vjb25kIHx8IDE7XG4gICAgcmV0dXJuIFtNYXRoLnNxcnQoc3gpLCBNYXRoLnNxcnQoc3kpXTtcbiAgfVxuICBzdGF0aWMgbm9ybWFsaXplUmVjdChyZWN0KSB7XG4gICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7XG4gICAgaWYgKHJlY3RbMF0gPiByZWN0WzJdKSB7XG4gICAgICByWzBdID0gcmVjdFsyXTtcbiAgICAgIHJbMl0gPSByZWN0WzBdO1xuICAgIH1cbiAgICBpZiAocmVjdFsxXSA+IHJlY3RbM10pIHtcbiAgICAgIHJbMV0gPSByZWN0WzNdO1xuICAgICAgclszXSA9IHJlY3RbMV07XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIHN0YXRpYyBpbnRlcnNlY3QocmVjdDEsIHJlY3QyKSB7XG4gICAgY29uc3QgeExvdyA9IE1hdGgubWF4KE1hdGgubWluKHJlY3QxWzBdLCByZWN0MVsyXSksIE1hdGgubWluKHJlY3QyWzBdLCByZWN0MlsyXSkpO1xuICAgIGNvbnN0IHhIaWdoID0gTWF0aC5taW4oTWF0aC5tYXgocmVjdDFbMF0sIHJlY3QxWzJdKSwgTWF0aC5tYXgocmVjdDJbMF0sIHJlY3QyWzJdKSk7XG4gICAgaWYgKHhMb3cgPiB4SGlnaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHlMb3cgPSBNYXRoLm1heChNYXRoLm1pbihyZWN0MVsxXSwgcmVjdDFbM10pLCBNYXRoLm1pbihyZWN0MlsxXSwgcmVjdDJbM10pKTtcbiAgICBjb25zdCB5SGlnaCA9IE1hdGgubWluKE1hdGgubWF4KHJlY3QxWzFdLCByZWN0MVszXSksIE1hdGgubWF4KHJlY3QyWzFdLCByZWN0MlszXSkpO1xuICAgIGlmICh5TG93ID4geUhpZ2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gW3hMb3csIHlMb3csIHhIaWdoLCB5SGlnaF07XG4gIH1cbiAgc3RhdGljICNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCB0LCBtaW5NYXgpIHtcbiAgICBpZiAodCA8PSAwIHx8IHQgPj0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtdCA9IDEgLSB0O1xuICAgIGNvbnN0IHR0ID0gdCAqIHQ7XG4gICAgY29uc3QgdHR0ID0gdHQgKiB0O1xuICAgIGNvbnN0IHggPSBtdCAqIChtdCAqIChtdCAqIHgwICsgMyAqIHQgKiB4MSkgKyAzICogdHQgKiB4MikgKyB0dHQgKiB4MztcbiAgICBjb25zdCB5ID0gbXQgKiAobXQgKiAobXQgKiB5MCArIDMgKiB0ICogeTEpICsgMyAqIHR0ICogeTIpICsgdHR0ICogeTM7XG4gICAgbWluTWF4WzBdID0gTWF0aC5taW4obWluTWF4WzBdLCB4KTtcbiAgICBtaW5NYXhbMV0gPSBNYXRoLm1pbihtaW5NYXhbMV0sIHkpO1xuICAgIG1pbk1heFsyXSA9IE1hdGgubWF4KG1pbk1heFsyXSwgeCk7XG4gICAgbWluTWF4WzNdID0gTWF0aC5tYXgobWluTWF4WzNdLCB5KTtcbiAgfVxuICBzdGF0aWMgI2dldEV4dHJlbXVtKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgYSwgYiwgYywgbWluTWF4KSB7XG4gICAgaWYgKE1hdGguYWJzKGEpIDwgMWUtMTIpIHtcbiAgICAgIGlmIChNYXRoLmFicyhiKSA+PSAxZS0xMikge1xuICAgICAgICB0aGlzLiNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCAtYyAvIGIsIG1pbk1heCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRlbHRhID0gYiAqKiAyIC0gNCAqIGMgKiBhO1xuICAgIGlmIChkZWx0YSA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3FydERlbHRhID0gTWF0aC5zcXJ0KGRlbHRhKTtcbiAgICBjb25zdCBhMiA9IDIgKiBhO1xuICAgIHRoaXMuI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsICgtYiArIHNxcnREZWx0YSkgLyBhMiwgbWluTWF4KTtcbiAgICB0aGlzLiNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCAoLWIgLSBzcXJ0RGVsdGEpIC8gYTIsIG1pbk1heCk7XG4gIH1cbiAgc3RhdGljIGJlemllckJvdW5kaW5nQm94KHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgbWluTWF4KSB7XG4gICAgaWYgKG1pbk1heCkge1xuICAgICAgbWluTWF4WzBdID0gTWF0aC5taW4obWluTWF4WzBdLCB4MCwgeDMpO1xuICAgICAgbWluTWF4WzFdID0gTWF0aC5taW4obWluTWF4WzFdLCB5MCwgeTMpO1xuICAgICAgbWluTWF4WzJdID0gTWF0aC5tYXgobWluTWF4WzJdLCB4MCwgeDMpO1xuICAgICAgbWluTWF4WzNdID0gTWF0aC5tYXgobWluTWF4WzNdLCB5MCwgeTMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaW5NYXggPSBbTWF0aC5taW4oeDAsIHgzKSwgTWF0aC5taW4oeTAsIHkzKSwgTWF0aC5tYXgoeDAsIHgzKSwgTWF0aC5tYXgoeTAsIHkzKV07XG4gICAgfVxuICAgIHRoaXMuI2dldEV4dHJlbXVtKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgMyAqICgteDAgKyAzICogKHgxIC0geDIpICsgeDMpLCA2ICogKHgwIC0gMiAqIHgxICsgeDIpLCAzICogKHgxIC0geDApLCBtaW5NYXgpO1xuICAgIHRoaXMuI2dldEV4dHJlbXVtKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgMyAqICgteTAgKyAzICogKHkxIC0geTIpICsgeTMpLCA2ICogKHkwIC0gMiAqIHkxICsgeTIpLCAzICogKHkxIC0geTApLCBtaW5NYXgpO1xuICAgIHJldHVybiBtaW5NYXg7XG4gIH1cbn1cbmNvbnN0IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlID0gKC8qIHVudXNlZCBwdXJlIGV4cHJlc3Npb24gb3Igc3VwZXIgKi8gbnVsbCAmJiAoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MmQ4LCAweDJjNywgMHgyYzYsIDB4MmQ5LCAweDJkZCwgMHgyZGIsIDB4MmRhLCAweDJkYywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgyMDIyLCAweDIwMjAsIDB4MjAyMSwgMHgyMDI2LCAweDIwMTQsIDB4MjAxMywgMHgxOTIsIDB4MjA0NCwgMHgyMDM5LCAweDIwM2EsIDB4MjIxMiwgMHgyMDMwLCAweDIwMWUsIDB4MjAxYywgMHgyMDFkLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFhLCAweDIxMjIsIDB4ZmIwMSwgMHhmYjAyLCAweDE0MSwgMHgxNTIsIDB4MTYwLCAweDE3OCwgMHgxN2QsIDB4MTMxLCAweDE0MiwgMHgxNTMsIDB4MTYxLCAweDE3ZSwgMCwgMHgyMGFjXSkpO1xuZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcoc3RyKSB7XG4gIGlmIChzdHJbMF0gPj0gXCJcXHhFRlwiKSB7XG4gICAgbGV0IGVuY29kaW5nO1xuICAgIGlmIChzdHJbMF0gPT09IFwiXFx4RkVcIiAmJiBzdHJbMV0gPT09IFwiXFx4RkZcIikge1xuICAgICAgZW5jb2RpbmcgPSBcInV0Zi0xNmJlXCI7XG4gICAgICBpZiAoc3RyLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0clswXSA9PT0gXCJcXHhGRlwiICYmIHN0clsxXSA9PT0gXCJcXHhGRVwiKSB7XG4gICAgICBlbmNvZGluZyA9IFwidXRmLTE2bGVcIjtcbiAgICAgIGlmIChzdHIubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RyWzBdID09PSBcIlxceEVGXCIgJiYgc3RyWzFdID09PSBcIlxceEJCXCIgJiYgc3RyWzJdID09PSBcIlxceEJGXCIpIHtcbiAgICAgIGVuY29kaW5nID0gXCJ1dGYtOFwiO1xuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcsIHtcbiAgICAgICAgICBmYXRhbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyaW5nVG9CeXRlcyhzdHIpO1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKTtcbiAgICAgICAgaWYgKCFkZWNvZGVkLmluY2x1ZGVzKFwiXFx4MWJcIikpIHtcbiAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjb2RlZC5yZXBsYWNlQWxsKC9cXHgxYlteXFx4MWJdKig/OlxceDFifCQpL2csIFwiXCIpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgd2Fybihgc3RyaW5nVG9QREZTdHJpbmc6IFwiJHtleH1cIi5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3Qgc3RyQnVmID0gW107XG4gIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgY29uc3QgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoY2hhckNvZGUgPT09IDB4MWIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBpaSAmJiBzdHIuY2hhckNvZGVBdChpKSAhPT0gMHgxYikge31cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjb2RlID0gUERGU3RyaW5nVHJhbnNsYXRlVGFibGVbY2hhckNvZGVdO1xuICAgIHN0ckJ1Zi5wdXNoKGNvZGUgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpIDogc3RyLmNoYXJBdChpKSk7XG4gIH1cbiAgcmV0dXJuIHN0ckJ1Zi5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cikge1xuICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzdHIpKTtcbn1cbmZ1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyhzdHIpIHtcbiAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcbn1cbmZ1bmN0aW9uIGlzQXJyYXlFcXVhbChhcnIxLCBhcnIyKSB7XG4gIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDAsIGlpID0gYXJyMS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgaWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGRhdGUgPSBuZXcgRGF0ZSgpKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IFtkYXRlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwgKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIildO1xuICByZXR1cm4gYnVmZmVyLmpvaW4oXCJcIik7XG59XG5sZXQgTm9ybWFsaXplUmVnZXggPSBudWxsO1xubGV0IE5vcm1hbGl6YXRpb25NYXAgPSBudWxsO1xuZnVuY3Rpb24gbm9ybWFsaXplVW5pY29kZShzdHIpIHtcbiAgaWYgKCFOb3JtYWxpemVSZWdleCkge1xuICAgIE5vcm1hbGl6ZVJlZ2V4ID0gLyhbXFx1MDBhMFxcdTAwYjVcXHUwMzdlXFx1MGViM1xcdTIwMDAtXFx1MjAwYVxcdTIwMmZcXHUyMTI2XFx1ZmIwMC1cXHVmYjA0XFx1ZmIwNlxcdWZiMjAtXFx1ZmIzNlxcdWZiMzgtXFx1ZmIzY1xcdWZiM2VcXHVmYjQwLVxcdWZiNDFcXHVmYjQzLVxcdWZiNDRcXHVmYjQ2LVxcdWZiYTFcXHVmYmE0LVxcdWZiYTlcXHVmYmFlLVxcdWZiYjFcXHVmYmQzLVxcdWZiZGNcXHVmYmRlLVxcdWZiZTdcXHVmYmVhLVxcdWZiZjhcXHVmYmZjLVxcdWZiZmRcXHVmYzAwLVxcdWZjNWRcXHVmYzY0LVxcdWZjZjFcXHVmY2Y1LVxcdWZkM2RcXHVmZDg4XFx1ZmRmNFxcdWZkZmEtXFx1ZmRmYlxcdWZlNzFcXHVmZTc3XFx1ZmU3OVxcdWZlN2JcXHVmZTdkXSspfChcXHVmYjA1KykvZ3U7XG4gICAgTm9ybWFsaXphdGlvbk1hcCA9IG5ldyBNYXAoW1tcIu+shVwiLCBcIsW/dFwiXV0pO1xuICB9XG4gIHJldHVybiBzdHIucmVwbGFjZUFsbChOb3JtYWxpemVSZWdleCwgKF8sIHAxLCBwMikgPT4gcDEgPyBwMS5ub3JtYWxpemUoXCJORktDXCIpIDogTm9ybWFsaXphdGlvbk1hcC5nZXQocDIpKTtcbn1cbmZ1bmN0aW9uIGdldFV1aWQoKSB7XG4gIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjcnlwdG8/LnJhbmRvbVVVSUQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICB9XG4gIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgaWYgKHR5cGVvZiBjcnlwdG8gIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGNyeXB0bz8uZ2V0UmFuZG9tVmFsdWVzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ1Zik7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7XG4gICAgICBidWZbaV0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYnl0ZXNUb1N0cmluZyhidWYpO1xufVxuY29uc3QgQW5ub3RhdGlvblByZWZpeCA9IFwicGRmanNfaW50ZXJuYWxfaWRfXCI7XG5jb25zdCBGb250UmVuZGVyT3BzID0ge1xuICBCRVpJRVJfQ1VSVkVfVE86IDAsXG4gIE1PVkVfVE86IDEsXG4gIExJTkVfVE86IDIsXG4gIFFVQURSQVRJQ19DVVJWRV9UTzogMyxcbiAgUkVTVE9SRTogNCxcbiAgU0FWRTogNSxcbiAgU0NBTEU6IDYsXG4gIFRSQU5TRk9STTogNyxcbiAgVFJBTlNMQVRFOiA4XG59O1xuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9iYXNlX2ZhY3RvcnkuanNcblxuY2xhc3MgQmFzZUZpbHRlckZhY3Rvcnkge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUZpbHRlckZhY3RvcnkpIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUZpbHRlckZhY3RvcnkuXCIpO1xuICAgIH1cbiAgfVxuICBhZGRGaWx0ZXIobWFwcykge1xuICAgIHJldHVybiBcIm5vbmVcIjtcbiAgfVxuICBhZGRIQ01GaWx0ZXIoZmdDb2xvciwgYmdDb2xvcikge1xuICAgIHJldHVybiBcIm5vbmVcIjtcbiAgfVxuICBhZGRBbHBoYUZpbHRlcihtYXApIHtcbiAgICByZXR1cm4gXCJub25lXCI7XG4gIH1cbiAgYWRkTHVtaW5vc2l0eUZpbHRlcihtYXApIHtcbiAgICByZXR1cm4gXCJub25lXCI7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0SENNRmlsdGVyKGZpbHRlck5hbWUsIGZnQ29sb3IsIGJnQ29sb3IsIG5ld0ZnQ29sb3IsIG5ld0JnQ29sb3IpIHtcbiAgICByZXR1cm4gXCJub25lXCI7XG4gIH1cbiAgZGVzdHJveShrZWVwSENNID0gZmFsc2UpIHt9XG59XG5jbGFzcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gICNlbmFibGVIV0EgPSBmYWxzZTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGVuYWJsZUhXQSA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ2FudmFzRmFjdG9yeSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlQ2FudmFzRmFjdG9yeS5cIik7XG4gICAgfVxuICAgIHRoaXMuI2VuYWJsZUhXQSA9IGVuYWJsZUhXQTtcbiAgfVxuICBjcmVhdGUod2lkdGgsIGhlaWdodCkge1xuICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNhbnZhcyBzaXplXCIpO1xuICAgIH1cbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbnZhcyxcbiAgICAgIGNvbnRleHQ6IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiwge1xuICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6ICF0aGlzLiNlbmFibGVIV0FcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuICByZXNldChjYW52YXNBbmRDb250ZXh0LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgaWYgKCFjYW52YXNBbmRDb250ZXh0LmNhbnZhcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWRcIik7XG4gICAgfVxuICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNhbnZhcyBzaXplXCIpO1xuICAgIH1cbiAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuICBkZXN0cm95KGNhbnZhc0FuZENvbnRleHQpIHtcbiAgICBpZiAoIWNhbnZhc0FuZENvbnRleHQuY2FudmFzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW52YXMgaXMgbm90IHNwZWNpZmllZFwiKTtcbiAgICB9XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMud2lkdGggPSAwO1xuICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMgPSBudWxsO1xuICAgIGNhbnZhc0FuZENvbnRleHQuY29udGV4dCA9IG51bGw7XG4gIH1cbiAgX2NyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYF9jcmVhdGVDYW52YXNgIGNhbGxlZC5cIik7XG4gIH1cbn1cbmNsYXNzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBiYXNlVXJsID0gbnVsbCxcbiAgICBpc0NvbXByZXNzZWQgPSB0cnVlXG4gIH0pIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUNNYXBSZWFkZXJGYWN0b3J5KSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDTWFwUmVhZGVyRmFjdG9yeS5cIik7XG4gICAgfVxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gICAgdGhpcy5pc0NvbXByZXNzZWQgPSBpc0NvbXByZXNzZWQ7XG4gIH1cbiAgYXN5bmMgZmV0Y2goe1xuICAgIG5hbWVcbiAgfSkge1xuICAgIGlmICghdGhpcy5iYXNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBDTWFwIFwiYmFzZVVybFwiIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCwgZW5zdXJlIHRoYXQgJyArICd0aGUgXCJjTWFwVXJsXCIgYW5kIFwiY01hcFBhY2tlZFwiIEFQSSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4nKTtcbiAgICB9XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDTWFwIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLmJhc2VVcmwgKyBuYW1lICsgKHRoaXMuaXNDb21wcmVzc2VkID8gXCIuYmNtYXBcIiA6IFwiXCIpO1xuICAgIGNvbnN0IGNvbXByZXNzaW9uVHlwZSA9IHRoaXMuaXNDb21wcmVzc2VkID8gQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkgOiBDTWFwQ29tcHJlc3Npb25UeXBlLk5PTkU7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgJHt0aGlzLmlzQ29tcHJlc3NlZCA/IFwiYmluYXJ5IFwiIDogXCJcIn1DTWFwIGF0OiAke3VybH1gKTtcbiAgICB9KTtcbiAgfVxuICBfZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYF9mZXRjaERhdGFgIGNhbGxlZC5cIik7XG4gIH1cbn1cbmNsYXNzIEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBiYXNlVXJsID0gbnVsbFxuICB9KSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkuXCIpO1xuICAgIH1cbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuICB9XG4gIGFzeW5jIGZldGNoKHtcbiAgICBmaWxlbmFtZVxuICB9KSB7XG4gICAgaWYgKCF0aGlzLmJhc2VVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHN0YW5kYXJkIGZvbnQgXCJiYXNlVXJsXCIgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkLCBlbnN1cmUgdGhhdCAnICsgJ3RoZSBcInN0YW5kYXJkRm9udERhdGFVcmxcIiBBUEkgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLicpO1xuICAgIH1cbiAgICBpZiAoIWZpbGVuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGb250IGZpbGVuYW1lIG11c3QgYmUgc3BlY2lmaWVkLlwiKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfSR7ZmlsZW5hbWV9YDtcbiAgICByZXR1cm4gdGhpcy5fZmV0Y2hEYXRhKHVybCkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZm9udCBkYXRhIGF0OiAke3VybH1gKTtcbiAgICB9KTtcbiAgfVxuICBfZmV0Y2hEYXRhKHVybCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBfZmV0Y2hEYXRhYCBjYWxsZWQuXCIpO1xuICB9XG59XG5jbGFzcyBCYXNlU1ZHRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlU1ZHRmFjdG9yeSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU1ZHRmFjdG9yeS5cIik7XG4gICAgfVxuICB9XG4gIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBza2lwRGltZW5zaW9ucyA9IGZhbHNlKSB7XG4gICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgU1ZHIGRpbWVuc2lvbnNcIik7XG4gICAgfVxuICAgIGNvbnN0IHN2ZyA9IHRoaXMuX2NyZWF0ZVNWRyhcInN2ZzpzdmdcIik7XG4gICAgc3ZnLnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gICAgaWYgKCFza2lwRGltZW5zaW9ucykge1xuICAgICAgc3ZnLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofXB4YCk7XG4gICAgICBzdmcuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1weGApO1xuICAgIH1cbiAgICBzdmcuc2V0QXR0cmlidXRlKFwicHJlc2VydmVBc3BlY3RSYXRpb1wiLCBcIm5vbmVcIik7XG4gICAgc3ZnLnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgYDAgMCAke3dpZHRofSAke2hlaWdodH1gKTtcbiAgICByZXR1cm4gc3ZnO1xuICB9XG4gIGNyZWF0ZUVsZW1lbnQodHlwZSkge1xuICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBTVkcgZWxlbWVudCB0eXBlXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlU1ZHKHR5cGUpO1xuICB9XG4gIF9jcmVhdGVTVkcodHlwZSkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBfY3JlYXRlU1ZHYCBjYWxsZWQuXCIpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2Rpc3BsYXlfdXRpbHMuanNcblxuXG5jb25zdCBTVkdfTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG5jbGFzcyBQaXhlbHNQZXJJbmNoIHtcbiAgc3RhdGljIENTUyA9IDk2LjA7XG4gIHN0YXRpYyBQREYgPSA3Mi4wO1xuICBzdGF0aWMgUERGX1RPX0NTU19VTklUUyA9IHRoaXMuQ1NTIC8gdGhpcy5QREY7XG59XG5jbGFzcyBET01GaWx0ZXJGYWN0b3J5IGV4dGVuZHMgQmFzZUZpbHRlckZhY3Rvcnkge1xuICAjX2NhY2hlO1xuICAjX2RlZnM7XG4gICNkb2NJZDtcbiAgI2RvY3VtZW50O1xuICAjX2hjbUNhY2hlO1xuICAjaWQgPSAwO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgZG9jSWQsXG4gICAgb3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnRcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLiNkb2NJZCA9IGRvY0lkO1xuICAgIHRoaXMuI2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDtcbiAgfVxuICBnZXQgI2NhY2hlKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2FjaGUgfHw9IG5ldyBNYXAoKTtcbiAgfVxuICBnZXQgI2hjbUNhY2hlKCkge1xuICAgIHJldHVybiB0aGlzLiNfaGNtQ2FjaGUgfHw9IG5ldyBNYXAoKTtcbiAgfVxuICBnZXQgI2RlZnMoKSB7XG4gICAgaWYgKCF0aGlzLiNfZGVmcykge1xuICAgICAgY29uc3QgZGl2ID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3R5bGVcbiAgICAgIH0gPSBkaXY7XG4gICAgICBzdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgIHN0eWxlLmNvbnRhaW4gPSBcInN0cmljdFwiO1xuICAgICAgc3R5bGUud2lkdGggPSBzdHlsZS5oZWlnaHQgPSAwO1xuICAgICAgc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICBzdHlsZS50b3AgPSBzdHlsZS5sZWZ0ID0gMDtcbiAgICAgIHN0eWxlLnpJbmRleCA9IC0xO1xuICAgICAgY29uc3Qgc3ZnID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJzdmdcIik7XG4gICAgICBzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgMCk7XG4gICAgICBzdmcuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIDApO1xuICAgICAgdGhpcy4jX2RlZnMgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImRlZnNcIik7XG4gICAgICBkaXYuYXBwZW5kKHN2Zyk7XG4gICAgICBzdmcuYXBwZW5kKHRoaXMuI19kZWZzKTtcbiAgICAgIHRoaXMuI2RvY3VtZW50LmJvZHkuYXBwZW5kKGRpdik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNfZGVmcztcbiAgfVxuICAjY3JlYXRlVGFibGVzKG1hcHMpIHtcbiAgICBpZiAobWFwcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG1hcFIgPSBtYXBzWzBdO1xuICAgICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlcltpXSA9IG1hcFJbaV0gLyAyNTU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YWJsZSA9IGJ1ZmZlci5qb2luKFwiLFwiKTtcbiAgICAgIHJldHVybiBbdGFibGUsIHRhYmxlLCB0YWJsZV07XG4gICAgfVxuICAgIGNvbnN0IFttYXBSLCBtYXBHLCBtYXBCXSA9IG1hcHM7XG4gICAgY29uc3QgYnVmZmVyUiA9IG5ldyBBcnJheSgyNTYpO1xuICAgIGNvbnN0IGJ1ZmZlckcgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICBjb25zdCBidWZmZXJCID0gbmV3IEFycmF5KDI1Nik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICAgICAgYnVmZmVyUltpXSA9IG1hcFJbaV0gLyAyNTU7XG4gICAgICBidWZmZXJHW2ldID0gbWFwR1tpXSAvIDI1NTtcbiAgICAgIGJ1ZmZlckJbaV0gPSBtYXBCW2ldIC8gMjU1O1xuICAgIH1cbiAgICByZXR1cm4gW2J1ZmZlclIuam9pbihcIixcIiksIGJ1ZmZlckcuam9pbihcIixcIiksIGJ1ZmZlckIuam9pbihcIixcIildO1xuICB9XG4gIGFkZEZpbHRlcihtYXBzKSB7XG4gICAgaWYgKCFtYXBzKSB7XG4gICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgfVxuICAgIGxldCB2YWx1ZSA9IHRoaXMuI2NhY2hlLmdldChtYXBzKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgW3RhYmxlUiwgdGFibGVHLCB0YWJsZUJdID0gdGhpcy4jY3JlYXRlVGFibGVzKG1hcHMpO1xuICAgIGNvbnN0IGtleSA9IG1hcHMubGVuZ3RoID09PSAxID8gdGFibGVSIDogYCR7dGFibGVSfSR7dGFibGVHfSR7dGFibGVCfWA7XG4gICAgdmFsdWUgPSB0aGlzLiNjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuI2NhY2hlLnNldChtYXBzLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1fdHJhbnNmZXJfbWFwXyR7dGhpcy4jaWQrK31gO1xuICAgIGNvbnN0IHVybCA9IGB1cmwoIyR7aWR9KWA7XG4gICAgdGhpcy4jY2FjaGUuc2V0KG1hcHMsIHVybCk7XG4gICAgdGhpcy4jY2FjaGUuc2V0KGtleSwgdXJsKTtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLiNjcmVhdGVGaWx0ZXIoaWQpO1xuICAgIHRoaXMuI2FkZFRyYW5zZmVyTWFwQ29udmVyc2lvbih0YWJsZVIsIHRhYmxlRywgdGFibGVCLCBmaWx0ZXIpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgYWRkSENNRmlsdGVyKGZnQ29sb3IsIGJnQ29sb3IpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtmZ0NvbG9yfS0ke2JnQ29sb3J9YDtcbiAgICBjb25zdCBmaWx0ZXJOYW1lID0gXCJiYXNlXCI7XG4gICAgbGV0IGluZm8gPSB0aGlzLiNoY21DYWNoZS5nZXQoZmlsdGVyTmFtZSk7XG4gICAgaWYgKGluZm8/LmtleSA9PT0ga2V5KSB7XG4gICAgICByZXR1cm4gaW5mby51cmw7XG4gICAgfVxuICAgIGlmIChpbmZvKSB7XG4gICAgICBpbmZvLmZpbHRlcj8ucmVtb3ZlKCk7XG4gICAgICBpbmZvLmtleSA9IGtleTtcbiAgICAgIGluZm8udXJsID0gXCJub25lXCI7XG4gICAgICBpbmZvLmZpbHRlciA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZm8gPSB7XG4gICAgICAgIGtleSxcbiAgICAgICAgdXJsOiBcIm5vbmVcIixcbiAgICAgICAgZmlsdGVyOiBudWxsXG4gICAgICB9O1xuICAgICAgdGhpcy4jaGNtQ2FjaGUuc2V0KGZpbHRlck5hbWUsIGluZm8pO1xuICAgIH1cbiAgICBpZiAoIWZnQ29sb3IgfHwgIWJnQ29sb3IpIHtcbiAgICAgIHJldHVybiBpbmZvLnVybDtcbiAgICB9XG4gICAgY29uc3QgZmdSR0IgPSB0aGlzLiNnZXRSR0IoZmdDb2xvcik7XG4gICAgZmdDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKC4uLmZnUkdCKTtcbiAgICBjb25zdCBiZ1JHQiA9IHRoaXMuI2dldFJHQihiZ0NvbG9yKTtcbiAgICBiZ0NvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoLi4uYmdSR0IpO1xuICAgIHRoaXMuI2RlZnMuc3R5bGUuY29sb3IgPSBcIlwiO1xuICAgIGlmIChmZ0NvbG9yID09PSBcIiMwMDAwMDBcIiAmJiBiZ0NvbG9yID09PSBcIiNmZmZmZmZcIiB8fCBmZ0NvbG9yID09PSBiZ0NvbG9yKSB7XG4gICAgICByZXR1cm4gaW5mby51cmw7XG4gICAgfVxuICAgIGNvbnN0IG1hcCA9IG5ldyBBcnJheSgyNTYpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDI1NTsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gaSAvIDI1NTtcbiAgICAgIG1hcFtpXSA9IHggPD0gMC4wMzkyOCA/IHggLyAxMi45MiA6ICgoeCArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQ7XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gbWFwLmpvaW4oXCIsXCIpO1xuICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1faGNtX2ZpbHRlcmA7XG4gICAgY29uc3QgZmlsdGVyID0gaW5mby5maWx0ZXIgPSB0aGlzLiNjcmVhdGVGaWx0ZXIoaWQpO1xuICAgIHRoaXMuI2FkZFRyYW5zZmVyTWFwQ29udmVyc2lvbih0YWJsZSwgdGFibGUsIHRhYmxlLCBmaWx0ZXIpO1xuICAgIHRoaXMuI2FkZEdyYXlDb252ZXJzaW9uKGZpbHRlcik7XG4gICAgY29uc3QgZ2V0U3RlcHMgPSAoYywgbikgPT4ge1xuICAgICAgY29uc3Qgc3RhcnQgPSBmZ1JHQltjXSAvIDI1NTtcbiAgICAgIGNvbnN0IGVuZCA9IGJnUkdCW2NdIC8gMjU1O1xuICAgICAgY29uc3QgYXJyID0gbmV3IEFycmF5KG4gKyAxKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG47IGkrKykge1xuICAgICAgICBhcnJbaV0gPSBzdGFydCArIGkgLyBuICogKGVuZCAtIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnIuam9pbihcIixcIik7XG4gICAgfTtcbiAgICB0aGlzLiNhZGRUcmFuc2Zlck1hcENvbnZlcnNpb24oZ2V0U3RlcHMoMCwgNSksIGdldFN0ZXBzKDEsIDUpLCBnZXRTdGVwcygyLCA1KSwgZmlsdGVyKTtcbiAgICBpbmZvLnVybCA9IGB1cmwoIyR7aWR9KWA7XG4gICAgcmV0dXJuIGluZm8udXJsO1xuICB9XG4gIGFkZEFscGhhRmlsdGVyKG1hcCkge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuI2NhY2hlLmdldChtYXApO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBbdGFibGVBXSA9IHRoaXMuI2NyZWF0ZVRhYmxlcyhbbWFwXSk7XG4gICAgY29uc3Qga2V5ID0gYGFscGhhXyR7dGFibGVBfWA7XG4gICAgdmFsdWUgPSB0aGlzLiNjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuI2NhY2hlLnNldChtYXAsIHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBgZ18ke3RoaXMuI2RvY0lkfV9hbHBoYV9tYXBfJHt0aGlzLiNpZCsrfWA7XG4gICAgY29uc3QgdXJsID0gYHVybCgjJHtpZH0pYDtcbiAgICB0aGlzLiNjYWNoZS5zZXQobWFwLCB1cmwpO1xuICAgIHRoaXMuI2NhY2hlLnNldChrZXksIHVybCk7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy4jY3JlYXRlRmlsdGVyKGlkKTtcbiAgICB0aGlzLiNhZGRUcmFuc2Zlck1hcEFscGhhQ29udmVyc2lvbih0YWJsZUEsIGZpbHRlcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBhZGRMdW1pbm9zaXR5RmlsdGVyKG1hcCkge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuI2NhY2hlLmdldChtYXAgfHwgXCJsdW1pbm9zaXR5XCIpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBsZXQgdGFibGVBLCBrZXk7XG4gICAgaWYgKG1hcCkge1xuICAgICAgW3RhYmxlQV0gPSB0aGlzLiNjcmVhdGVUYWJsZXMoW21hcF0pO1xuICAgICAga2V5ID0gYGx1bWlub3NpdHlfJHt0YWJsZUF9YDtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gXCJsdW1pbm9zaXR5XCI7XG4gICAgfVxuICAgIHZhbHVlID0gdGhpcy4jY2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLiNjYWNoZS5zZXQobWFwLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1fbHVtaW5vc2l0eV9tYXBfJHt0aGlzLiNpZCsrfWA7XG4gICAgY29uc3QgdXJsID0gYHVybCgjJHtpZH0pYDtcbiAgICB0aGlzLiNjYWNoZS5zZXQobWFwLCB1cmwpO1xuICAgIHRoaXMuI2NhY2hlLnNldChrZXksIHVybCk7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy4jY3JlYXRlRmlsdGVyKGlkKTtcbiAgICB0aGlzLiNhZGRMdW1pbm9zaXR5Q29udmVyc2lvbihmaWx0ZXIpO1xuICAgIGlmIChtYXApIHtcbiAgICAgIHRoaXMuI2FkZFRyYW5zZmVyTWFwQWxwaGFDb252ZXJzaW9uKHRhYmxlQSwgZmlsdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBhZGRIaWdobGlnaHRIQ01GaWx0ZXIoZmlsdGVyTmFtZSwgZmdDb2xvciwgYmdDb2xvciwgbmV3RmdDb2xvciwgbmV3QmdDb2xvcikge1xuICAgIGNvbnN0IGtleSA9IGAke2ZnQ29sb3J9LSR7YmdDb2xvcn0tJHtuZXdGZ0NvbG9yfS0ke25ld0JnQ29sb3J9YDtcbiAgICBsZXQgaW5mbyA9IHRoaXMuI2hjbUNhY2hlLmdldChmaWx0ZXJOYW1lKTtcbiAgICBpZiAoaW5mbz8ua2V5ID09PSBrZXkpIHtcbiAgICAgIHJldHVybiBpbmZvLnVybDtcbiAgICB9XG4gICAgaWYgKGluZm8pIHtcbiAgICAgIGluZm8uZmlsdGVyPy5yZW1vdmUoKTtcbiAgICAgIGluZm8ua2V5ID0ga2V5O1xuICAgICAgaW5mby51cmwgPSBcIm5vbmVcIjtcbiAgICAgIGluZm8uZmlsdGVyID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyA9IHtcbiAgICAgICAga2V5LFxuICAgICAgICB1cmw6IFwibm9uZVwiLFxuICAgICAgICBmaWx0ZXI6IG51bGxcbiAgICAgIH07XG4gICAgICB0aGlzLiNoY21DYWNoZS5zZXQoZmlsdGVyTmFtZSwgaW5mbyk7XG4gICAgfVxuICAgIGlmICghZmdDb2xvciB8fCAhYmdDb2xvcikge1xuICAgICAgcmV0dXJuIGluZm8udXJsO1xuICAgIH1cbiAgICBjb25zdCBbZmdSR0IsIGJnUkdCXSA9IFtmZ0NvbG9yLCBiZ0NvbG9yXS5tYXAodGhpcy4jZ2V0UkdCLmJpbmQodGhpcykpO1xuICAgIGxldCBmZ0dyYXkgPSBNYXRoLnJvdW5kKDAuMjEyNiAqIGZnUkdCWzBdICsgMC43MTUyICogZmdSR0JbMV0gKyAwLjA3MjIgKiBmZ1JHQlsyXSk7XG4gICAgbGV0IGJnR3JheSA9IE1hdGgucm91bmQoMC4yMTI2ICogYmdSR0JbMF0gKyAwLjcxNTIgKiBiZ1JHQlsxXSArIDAuMDcyMiAqIGJnUkdCWzJdKTtcbiAgICBsZXQgW25ld0ZnUkdCLCBuZXdCZ1JHQl0gPSBbbmV3RmdDb2xvciwgbmV3QmdDb2xvcl0ubWFwKHRoaXMuI2dldFJHQi5iaW5kKHRoaXMpKTtcbiAgICBpZiAoYmdHcmF5IDwgZmdHcmF5KSB7XG4gICAgICBbZmdHcmF5LCBiZ0dyYXksIG5ld0ZnUkdCLCBuZXdCZ1JHQl0gPSBbYmdHcmF5LCBmZ0dyYXksIG5ld0JnUkdCLCBuZXdGZ1JHQl07XG4gICAgfVxuICAgIHRoaXMuI2RlZnMuc3R5bGUuY29sb3IgPSBcIlwiO1xuICAgIGNvbnN0IGdldFN0ZXBzID0gKGZnLCBiZywgbikgPT4ge1xuICAgICAgY29uc3QgYXJyID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICBjb25zdCBzdGVwID0gKGJnR3JheSAtIGZnR3JheSkgLyBuO1xuICAgICAgY29uc3QgbmV3U3RhcnQgPSBmZyAvIDI1NTtcbiAgICAgIGNvbnN0IG5ld1N0ZXAgPSAoYmcgLSBmZykgLyAoMjU1ICogbik7XG4gICAgICBsZXQgcHJldiA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgayA9IE1hdGgucm91bmQoZmdHcmF5ICsgaSAqIHN0ZXApO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG5ld1N0YXJ0ICsgaSAqIG5ld1N0ZXA7XG4gICAgICAgIGZvciAobGV0IGogPSBwcmV2OyBqIDw9IGs7IGorKykge1xuICAgICAgICAgIGFycltqXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHByZXYgPSBrICsgMTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSBwcmV2OyBpIDwgMjU2OyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gYXJyW3ByZXYgLSAxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnIuam9pbihcIixcIik7XG4gICAgfTtcbiAgICBjb25zdCBpZCA9IGBnXyR7dGhpcy4jZG9jSWR9X2hjbV8ke2ZpbHRlck5hbWV9X2ZpbHRlcmA7XG4gICAgY29uc3QgZmlsdGVyID0gaW5mby5maWx0ZXIgPSB0aGlzLiNjcmVhdGVGaWx0ZXIoaWQpO1xuICAgIHRoaXMuI2FkZEdyYXlDb252ZXJzaW9uKGZpbHRlcik7XG4gICAgdGhpcy4jYWRkVHJhbnNmZXJNYXBDb252ZXJzaW9uKGdldFN0ZXBzKG5ld0ZnUkdCWzBdLCBuZXdCZ1JHQlswXSwgNSksIGdldFN0ZXBzKG5ld0ZnUkdCWzFdLCBuZXdCZ1JHQlsxXSwgNSksIGdldFN0ZXBzKG5ld0ZnUkdCWzJdLCBuZXdCZ1JHQlsyXSwgNSksIGZpbHRlcik7XG4gICAgaW5mby51cmwgPSBgdXJsKCMke2lkfSlgO1xuICAgIHJldHVybiBpbmZvLnVybDtcbiAgfVxuICBkZXN0cm95KGtlZXBIQ00gPSBmYWxzZSkge1xuICAgIGlmIChrZWVwSENNICYmIHRoaXMuI2hjbUNhY2hlLnNpemUgIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI19kZWZzKSB7XG4gICAgICB0aGlzLiNfZGVmcy5wYXJlbnROb2RlLnBhcmVudE5vZGUucmVtb3ZlKCk7XG4gICAgICB0aGlzLiNfZGVmcyA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLiNfY2FjaGUpIHtcbiAgICAgIHRoaXMuI19jYWNoZS5jbGVhcigpO1xuICAgICAgdGhpcy4jX2NhY2hlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy4jaWQgPSAwO1xuICB9XG4gICNhZGRMdW1pbm9zaXR5Q29udmVyc2lvbihmaWx0ZXIpIHtcbiAgICBjb25zdCBmZUNvbG9yTWF0cml4ID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJmZUNvbG9yTWF0cml4XCIpO1xuICAgIGZlQ29sb3JNYXRyaXguc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcIm1hdHJpeFwiKTtcbiAgICBmZUNvbG9yTWF0cml4LnNldEF0dHJpYnV0ZShcInZhbHVlc1wiLCBcIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMyAwLjU5IDAuMTEgMCAwXCIpO1xuICAgIGZpbHRlci5hcHBlbmQoZmVDb2xvck1hdHJpeCk7XG4gIH1cbiAgI2FkZEdyYXlDb252ZXJzaW9uKGZpbHRlcikge1xuICAgIGNvbnN0IGZlQ29sb3JNYXRyaXggPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZlQ29sb3JNYXRyaXhcIik7XG4gICAgZmVDb2xvck1hdHJpeC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwibWF0cml4XCIpO1xuICAgIGZlQ29sb3JNYXRyaXguc2V0QXR0cmlidXRlKFwidmFsdWVzXCIsIFwiMC4yMTI2IDAuNzE1MiAwLjA3MjIgMCAwIDAuMjEyNiAwLjcxNTIgMC4wNzIyIDAgMCAwLjIxMjYgMC43MTUyIDAuMDcyMiAwIDAgMCAwIDAgMSAwXCIpO1xuICAgIGZpbHRlci5hcHBlbmQoZmVDb2xvck1hdHJpeCk7XG4gIH1cbiAgI2NyZWF0ZUZpbHRlcihpZCkge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmlsdGVyXCIpO1xuICAgIGZpbHRlci5zZXRBdHRyaWJ1dGUoXCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnNcIiwgXCJzUkdCXCIpO1xuICAgIGZpbHRlci5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBpZCk7XG4gICAgdGhpcy4jZGVmcy5hcHBlbmQoZmlsdGVyKTtcbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG4gICNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgZnVuYywgdGFibGUpIHtcbiAgICBjb25zdCBmZUZ1bmMgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBmdW5jKTtcbiAgICBmZUZ1bmMuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcImRpc2NyZXRlXCIpO1xuICAgIGZlRnVuYy5zZXRBdHRyaWJ1dGUoXCJ0YWJsZVZhbHVlc1wiLCB0YWJsZSk7XG4gICAgZmVDb21wb25lbnRUcmFuc2Zlci5hcHBlbmQoZmVGdW5jKTtcbiAgfVxuICAjYWRkVHJhbnNmZXJNYXBDb252ZXJzaW9uKHJUYWJsZSwgZ1RhYmxlLCBiVGFibGUsIGZpbHRlcikge1xuICAgIGNvbnN0IGZlQ29tcG9uZW50VHJhbnNmZXIgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZlQ29tcG9uZW50VHJhbnNmZXJcIik7XG4gICAgZmlsdGVyLmFwcGVuZChmZUNvbXBvbmVudFRyYW5zZmVyKTtcbiAgICB0aGlzLiNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgXCJmZUZ1bmNSXCIsIHJUYWJsZSk7XG4gICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jR1wiLCBnVGFibGUpO1xuICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY0JcIiwgYlRhYmxlKTtcbiAgfVxuICAjYWRkVHJhbnNmZXJNYXBBbHBoYUNvbnZlcnNpb24oYVRhYmxlLCBmaWx0ZXIpIHtcbiAgICBjb25zdCBmZUNvbXBvbmVudFRyYW5zZmVyID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJmZUNvbXBvbmVudFRyYW5zZmVyXCIpO1xuICAgIGZpbHRlci5hcHBlbmQoZmVDb21wb25lbnRUcmFuc2Zlcik7XG4gICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jQVwiLCBhVGFibGUpO1xuICB9XG4gICNnZXRSR0IoY29sb3IpIHtcbiAgICB0aGlzLiNkZWZzLnN0eWxlLmNvbG9yID0gY29sb3I7XG4gICAgcmV0dXJuIGdldFJHQihnZXRDb21wdXRlZFN0eWxlKHRoaXMuI2RlZnMpLmdldFByb3BlcnR5VmFsdWUoXCJjb2xvclwiKSk7XG4gIH1cbn1cbmNsYXNzIERPTUNhbnZhc0ZhY3RvcnkgZXh0ZW5kcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudCxcbiAgICBlbmFibGVIV0EgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICBlbmFibGVIV0FcbiAgICB9KTtcbiAgICB0aGlzLl9kb2N1bWVudCA9IG93bmVyRG9jdW1lbnQ7XG4gIH1cbiAgX2NyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHJldHVybiBjYW52YXM7XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSh1cmwsIHR5cGUgPSBcInRleHRcIikge1xuICBpZiAoaXNWYWxpZEZldGNoVXJsKHVybCwgZG9jdW1lbnQuYmFzZVVSSSkpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJhcnJheWJ1ZmZlclwiOlxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICAgIGNhc2UgXCJibG9iXCI6XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCB1cmwsIHRydWUpO1xuICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gdHlwZTtcbiAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgIT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDAgfHwgcmVxdWVzdC5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFycmF5YnVmZmVyXCI6XG4gICAgICAgICAgY2FzZSBcImJsb2JcIjpcbiAgICAgICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXF1ZXN0LnN0YXR1c1RleHQpKTtcbiAgICB9O1xuICAgIHJlcXVlc3Quc2VuZChudWxsKTtcbiAgfSk7XG59XG5jbGFzcyBET01DTWFwUmVhZGVyRmFjdG9yeSBleHRlbmRzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHtcbiAgICByZXR1cm4gZmV0Y2hEYXRhKHVybCwgdGhpcy5pc0NvbXByZXNzZWQgPyBcImFycmF5YnVmZmVyXCIgOiBcInRleHRcIikudGhlbihkYXRhID0+ICh7XG4gICAgICBjTWFwRGF0YTogZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gbmV3IFVpbnQ4QXJyYXkoZGF0YSkgOiBzdHJpbmdUb0J5dGVzKGRhdGEpLFxuICAgICAgY29tcHJlc3Npb25UeXBlXG4gICAgfSkpO1xuICB9XG59XG5jbGFzcyBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBleHRlbmRzIEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG4gIF9mZXRjaERhdGEodXJsKSB7XG4gICAgcmV0dXJuIGZldGNoRGF0YSh1cmwsIFwiYXJyYXlidWZmZXJcIikudGhlbihkYXRhID0+IG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbiAgfVxufVxuY2xhc3MgRE9NU1ZHRmFjdG9yeSBleHRlbmRzIEJhc2VTVkdGYWN0b3J5IHtcbiAgX2NyZWF0ZVNWRyh0eXBlKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIHR5cGUpO1xuICB9XG59XG5jbGFzcyBQYWdlVmlld3BvcnQge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgdmlld0JveCxcbiAgICBzY2FsZSxcbiAgICByb3RhdGlvbixcbiAgICBvZmZzZXRYID0gMCxcbiAgICBvZmZzZXRZID0gMCxcbiAgICBkb250RmxpcCA9IGZhbHNlXG4gIH0pIHtcbiAgICB0aGlzLnZpZXdCb3ggPSB2aWV3Qm94O1xuICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG4gICAgdGhpcy5vZmZzZXRYID0gb2Zmc2V0WDtcbiAgICB0aGlzLm9mZnNldFkgPSBvZmZzZXRZO1xuICAgIGNvbnN0IGNlbnRlclggPSAodmlld0JveFsyXSArIHZpZXdCb3hbMF0pIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0gKHZpZXdCb3hbM10gKyB2aWV3Qm94WzFdKSAvIDI7XG4gICAgbGV0IHJvdGF0ZUEsIHJvdGF0ZUIsIHJvdGF0ZUMsIHJvdGF0ZUQ7XG4gICAgcm90YXRpb24gJT0gMzYwO1xuICAgIGlmIChyb3RhdGlvbiA8IDApIHtcbiAgICAgIHJvdGF0aW9uICs9IDM2MDtcbiAgICB9XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJvdGF0ZUEgPSAtMTtcbiAgICAgICAgcm90YXRlQiA9IDA7XG4gICAgICAgIHJvdGF0ZUMgPSAwO1xuICAgICAgICByb3RhdGVEID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICByb3RhdGVBID0gMDtcbiAgICAgICAgcm90YXRlQiA9IDE7XG4gICAgICAgIHJvdGF0ZUMgPSAxO1xuICAgICAgICByb3RhdGVEID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgcm90YXRlQSA9IDA7XG4gICAgICAgIHJvdGF0ZUIgPSAtMTtcbiAgICAgICAgcm90YXRlQyA9IC0xO1xuICAgICAgICByb3RhdGVEID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJvdGF0ZUEgPSAxO1xuICAgICAgICByb3RhdGVCID0gMDtcbiAgICAgICAgcm90YXRlQyA9IDA7XG4gICAgICAgIHJvdGF0ZUQgPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYWdlVmlld3BvcnQ6IEludmFsaWQgcm90YXRpb24sIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA5MCBkZWdyZWVzLlwiKTtcbiAgICB9XG4gICAgaWYgKGRvbnRGbGlwKSB7XG4gICAgICByb3RhdGVDID0gLXJvdGF0ZUM7XG4gICAgICByb3RhdGVEID0gLXJvdGF0ZUQ7XG4gICAgfVxuICAgIGxldCBvZmZzZXRDYW52YXNYLCBvZmZzZXRDYW52YXNZO1xuICAgIGxldCB3aWR0aCwgaGVpZ2h0O1xuICAgIGlmIChyb3RhdGVBID09PSAwKSB7XG4gICAgICBvZmZzZXRDYW52YXNYID0gTWF0aC5hYnMoY2VudGVyWSAtIHZpZXdCb3hbMV0pICogc2NhbGUgKyBvZmZzZXRYO1xuICAgICAgb2Zmc2V0Q2FudmFzWSA9IE1hdGguYWJzKGNlbnRlclggLSB2aWV3Qm94WzBdKSAqIHNjYWxlICsgb2Zmc2V0WTtcbiAgICAgIHdpZHRoID0gKHZpZXdCb3hbM10gLSB2aWV3Qm94WzFdKSAqIHNjYWxlO1xuICAgICAgaGVpZ2h0ID0gKHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdKSAqIHNjYWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmZzZXRDYW52YXNYID0gTWF0aC5hYnMoY2VudGVyWCAtIHZpZXdCb3hbMF0pICogc2NhbGUgKyBvZmZzZXRYO1xuICAgICAgb2Zmc2V0Q2FudmFzWSA9IE1hdGguYWJzKGNlbnRlclkgLSB2aWV3Qm94WzFdKSAqIHNjYWxlICsgb2Zmc2V0WTtcbiAgICAgIHdpZHRoID0gKHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdKSAqIHNjYWxlO1xuICAgICAgaGVpZ2h0ID0gKHZpZXdCb3hbM10gLSB2aWV3Qm94WzFdKSAqIHNjYWxlO1xuICAgIH1cbiAgICB0aGlzLnRyYW5zZm9ybSA9IFtyb3RhdGVBICogc2NhbGUsIHJvdGF0ZUIgKiBzY2FsZSwgcm90YXRlQyAqIHNjYWxlLCByb3RhdGVEICogc2NhbGUsIG9mZnNldENhbnZhc1ggLSByb3RhdGVBICogc2NhbGUgKiBjZW50ZXJYIC0gcm90YXRlQyAqIHNjYWxlICogY2VudGVyWSwgb2Zmc2V0Q2FudmFzWSAtIHJvdGF0ZUIgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVEICogc2NhbGUgKiBjZW50ZXJZXTtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbiAgZ2V0IHJhd0RpbXMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgdmlld0JveFxuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJyYXdEaW1zXCIsIHtcbiAgICAgIHBhZ2VXaWR0aDogdmlld0JveFsyXSAtIHZpZXdCb3hbMF0sXG4gICAgICBwYWdlSGVpZ2h0OiB2aWV3Qm94WzNdIC0gdmlld0JveFsxXSxcbiAgICAgIHBhZ2VYOiB2aWV3Qm94WzBdLFxuICAgICAgcGFnZVk6IHZpZXdCb3hbMV1cbiAgICB9KTtcbiAgfVxuICBjbG9uZSh7XG4gICAgc2NhbGUgPSB0aGlzLnNjYWxlLFxuICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbixcbiAgICBvZmZzZXRYID0gdGhpcy5vZmZzZXRYLFxuICAgIG9mZnNldFkgPSB0aGlzLm9mZnNldFksXG4gICAgZG9udEZsaXAgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgICB2aWV3Qm94OiB0aGlzLnZpZXdCb3guc2xpY2UoKSxcbiAgICAgIHNjYWxlLFxuICAgICAgcm90YXRpb24sXG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WSxcbiAgICAgIGRvbnRGbGlwXG4gICAgfSk7XG4gIH1cbiAgY29udmVydFRvVmlld3BvcnRQb2ludCh4LCB5KSB7XG4gICAgcmV0dXJuIFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3gsIHldLCB0aGlzLnRyYW5zZm9ybSk7XG4gIH1cbiAgY29udmVydFRvVmlld3BvcnRSZWN0YW5nbGUocmVjdCkge1xuICAgIGNvbnN0IHRvcExlZnQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyZWN0WzBdLCByZWN0WzFdXSwgdGhpcy50cmFuc2Zvcm0pO1xuICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0gVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFsyXSwgcmVjdFszXV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgICByZXR1cm4gW3RvcExlZnRbMF0sIHRvcExlZnRbMV0sIGJvdHRvbVJpZ2h0WzBdLCBib3R0b21SaWdodFsxXV07XG4gIH1cbiAgY29udmVydFRvUGRmUG9pbnQoeCwgeSkge1xuICAgIHJldHVybiBVdGlsLmFwcGx5SW52ZXJzZVRyYW5zZm9ybShbeCwgeV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgfVxufVxuY2xhc3MgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgZXh0cmFEZWxheSA9IDApIHtcbiAgICBzdXBlcihtc2csIFwiUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uXCIpO1xuICAgIHRoaXMuZXh0cmFEZWxheSA9IGV4dHJhRGVsYXk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRGF0YVNjaGVtZSh1cmwpIHtcbiAgY29uc3QgaWkgPSB1cmwubGVuZ3RoO1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlIChpIDwgaWkgJiYgdXJsW2ldLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIGkrKztcbiAgfVxuICByZXR1cm4gdXJsLnN1YnN0cmluZyhpLCBpICsgNSkudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhOlwiO1xufVxuZnVuY3Rpb24gaXNQZGZGaWxlKGZpbGVuYW1lKSB7XG4gIHJldHVybiB0eXBlb2YgZmlsZW5hbWUgPT09IFwic3RyaW5nXCIgJiYgL1xcLnBkZiQvaS50ZXN0KGZpbGVuYW1lKTtcbn1cbmZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbVVybCh1cmwpIHtcbiAgW3VybF0gPSB1cmwuc3BsaXQoL1sjP10vLCAxKTtcbiAgcmV0dXJuIHVybC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xufVxuZnVuY3Rpb24gZ2V0UGRmRmlsZW5hbWVGcm9tVXJsKHVybCwgZGVmYXVsdEZpbGVuYW1lID0gXCJkb2N1bWVudC5wZGZcIikge1xuICBpZiAodHlwZW9mIHVybCAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBkZWZhdWx0RmlsZW5hbWU7XG4gIH1cbiAgaWYgKGlzRGF0YVNjaGVtZSh1cmwpKSB7XG4gICAgd2FybignZ2V0UGRmRmlsZW5hbWVGcm9tVXJsOiBpZ25vcmUgXCJkYXRhOlwiLVVSTCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4nKTtcbiAgICByZXR1cm4gZGVmYXVsdEZpbGVuYW1lO1xuICB9XG4gIGNvbnN0IHJlVVJJID0gL14oPzooPzpbXjpdKzopP1xcL1xcL1teL10rKT8oW14/I10qKShcXD9bXiNdKik/KCMuKik/JC87XG4gIGNvbnN0IHJlRmlsZW5hbWUgPSAvW14vPyM9XStcXC5wZGZcXGIoPyEuKlxcLnBkZlxcYikvaTtcbiAgY29uc3Qgc3BsaXRVUkkgPSByZVVSSS5leGVjKHVybCk7XG4gIGxldCBzdWdnZXN0ZWRGaWxlbmFtZSA9IHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVsxXSkgfHwgcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzJdKSB8fCByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbM10pO1xuICBpZiAoc3VnZ2VzdGVkRmlsZW5hbWUpIHtcbiAgICBzdWdnZXN0ZWRGaWxlbmFtZSA9IHN1Z2dlc3RlZEZpbGVuYW1lWzBdO1xuICAgIGlmIChzdWdnZXN0ZWRGaWxlbmFtZS5pbmNsdWRlcyhcIiVcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gcmVGaWxlbmFtZS5leGVjKGRlY29kZVVSSUNvbXBvbmVudChzdWdnZXN0ZWRGaWxlbmFtZSkpWzBdO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3VnZ2VzdGVkRmlsZW5hbWUgfHwgZGVmYXVsdEZpbGVuYW1lO1xufVxuY2xhc3MgU3RhdFRpbWVyIHtcbiAgc3RhcnRlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRpbWVzID0gW107XG4gIHRpbWUobmFtZSkge1xuICAgIGlmIChuYW1lIGluIHRoaXMuc3RhcnRlZCkge1xuICAgICAgd2FybihgVGltZXIgaXMgYWxyZWFkeSBydW5uaW5nIGZvciAke25hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMuc3RhcnRlZFtuYW1lXSA9IERhdGUubm93KCk7XG4gIH1cbiAgdGltZUVuZChuYW1lKSB7XG4gICAgaWYgKCEobmFtZSBpbiB0aGlzLnN0YXJ0ZWQpKSB7XG4gICAgICB3YXJuKGBUaW1lciBoYXMgbm90IGJlZW4gc3RhcnRlZCBmb3IgJHtuYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnRpbWVzLnB1c2goe1xuICAgICAgbmFtZSxcbiAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0ZWRbbmFtZV0sXG4gICAgICBlbmQ6IERhdGUubm93KClcbiAgICB9KTtcbiAgICBkZWxldGUgdGhpcy5zdGFydGVkW25hbWVdO1xuICB9XG4gIHRvU3RyaW5nKCkge1xuICAgIGNvbnN0IG91dEJ1ZiA9IFtdO1xuICAgIGxldCBsb25nZXN0ID0gMDtcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIG5hbWVcbiAgICB9IG9mIHRoaXMudGltZXMpIHtcbiAgICAgIGxvbmdlc3QgPSBNYXRoLm1heChuYW1lLmxlbmd0aCwgbG9uZ2VzdCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kXG4gICAgfSBvZiB0aGlzLnRpbWVzKSB7XG4gICAgICBvdXRCdWYucHVzaChgJHtuYW1lLnBhZEVuZChsb25nZXN0KX0gJHtlbmQgLSBzdGFydH1tc1xcbmApO1xuICAgIH1cbiAgICByZXR1cm4gb3V0QnVmLmpvaW4oXCJcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzVmFsaWRGZXRjaFVybCh1cmwsIGJhc2VVcmwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7XG4gICAgICBwcm90b2NvbFxuICAgIH0gPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpO1xuICAgIHJldHVybiBwcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHByb3RvY29sID09PSBcImh0dHBzOlwiO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG5vQ29udGV4dE1lbnUoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG59XG5mdW5jdGlvbiBkZXByZWNhdGVkKGRldGFpbHMpIHtcbiAgY29uc29sZS5sb2coXCJEZXByZWNhdGVkIEFQSSB1c2FnZTogXCIgKyBkZXRhaWxzKTtcbn1cbmxldCBwZGZEYXRlU3RyaW5nUmVnZXg7XG5jbGFzcyBQREZEYXRlU3RyaW5nIHtcbiAgc3RhdGljIHRvRGF0ZU9iamVjdChpbnB1dCkge1xuICAgIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcGRmRGF0ZVN0cmluZ1JlZ2V4IHx8PSBuZXcgUmVnRXhwKFwiXkQ6XCIgKyBcIihcXFxcZHs0fSlcIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFtafCt8LV0pP1wiICsgXCIoXFxcXGR7Mn0pP1wiICsgXCInP1wiICsgXCIoXFxcXGR7Mn0pP1wiICsgXCInP1wiKTtcbiAgICBjb25zdCBtYXRjaGVzID0gcGRmRGF0ZVN0cmluZ1JlZ2V4LmV4ZWMoaW5wdXQpO1xuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxMCk7XG4gICAgbGV0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hlc1syXSwgMTApO1xuICAgIG1vbnRoID0gbW9udGggPj0gMSAmJiBtb250aCA8PSAxMiA/IG1vbnRoIC0gMSA6IDA7XG4gICAgbGV0IGRheSA9IHBhcnNlSW50KG1hdGNoZXNbM10sIDEwKTtcbiAgICBkYXkgPSBkYXkgPj0gMSAmJiBkYXkgPD0gMzEgPyBkYXkgOiAxO1xuICAgIGxldCBob3VyID0gcGFyc2VJbnQobWF0Y2hlc1s0XSwgMTApO1xuICAgIGhvdXIgPSBob3VyID49IDAgJiYgaG91ciA8PSAyMyA/IGhvdXIgOiAwO1xuICAgIGxldCBtaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzVdLCAxMCk7XG4gICAgbWludXRlID0gbWludXRlID49IDAgJiYgbWludXRlIDw9IDU5ID8gbWludXRlIDogMDtcbiAgICBsZXQgc2Vjb25kID0gcGFyc2VJbnQobWF0Y2hlc1s2XSwgMTApO1xuICAgIHNlY29uZCA9IHNlY29uZCA+PSAwICYmIHNlY29uZCA8PSA1OSA/IHNlY29uZCA6IDA7XG4gICAgY29uc3QgdW5pdmVyc2FsVGltZVJlbGF0aW9uID0gbWF0Y2hlc1s3XSB8fCBcIlpcIjtcbiAgICBsZXQgb2Zmc2V0SG91ciA9IHBhcnNlSW50KG1hdGNoZXNbOF0sIDEwKTtcbiAgICBvZmZzZXRIb3VyID0gb2Zmc2V0SG91ciA+PSAwICYmIG9mZnNldEhvdXIgPD0gMjMgPyBvZmZzZXRIb3VyIDogMDtcbiAgICBsZXQgb2Zmc2V0TWludXRlID0gcGFyc2VJbnQobWF0Y2hlc1s5XSwgMTApIHx8IDA7XG4gICAgb2Zmc2V0TWludXRlID0gb2Zmc2V0TWludXRlID49IDAgJiYgb2Zmc2V0TWludXRlIDw9IDU5ID8gb2Zmc2V0TWludXRlIDogMDtcbiAgICBpZiAodW5pdmVyc2FsVGltZVJlbGF0aW9uID09PSBcIi1cIikge1xuICAgICAgaG91ciArPSBvZmZzZXRIb3VyO1xuICAgICAgbWludXRlICs9IG9mZnNldE1pbnV0ZTtcbiAgICB9IGVsc2UgaWYgKHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9PT0gXCIrXCIpIHtcbiAgICAgIGhvdXIgLT0gb2Zmc2V0SG91cjtcbiAgICAgIG1pbnV0ZSAtPSBvZmZzZXRNaW51dGU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCkpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRYZmFQYWdlVmlld3BvcnQoeGZhUGFnZSwge1xuICBzY2FsZSA9IDEsXG4gIHJvdGF0aW9uID0gMFxufSkge1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0gPSB4ZmFQYWdlLmF0dHJpYnV0ZXMuc3R5bGU7XG4gIGNvbnN0IHZpZXdCb3ggPSBbMCwgMCwgcGFyc2VJbnQod2lkdGgpLCBwYXJzZUludChoZWlnaHQpXTtcbiAgcmV0dXJuIG5ldyBQYWdlVmlld3BvcnQoe1xuICAgIHZpZXdCb3gsXG4gICAgc2NhbGUsXG4gICAgcm90YXRpb25cbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRSR0IoY29sb3IpIHtcbiAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgY29uc3QgY29sb3JSR0IgPSBwYXJzZUludChjb2xvci5zbGljZSgxKSwgMTYpO1xuICAgIHJldHVybiBbKGNvbG9yUkdCICYgMHhmZjAwMDApID4+IDE2LCAoY29sb3JSR0IgJiAweDAwZmYwMCkgPj4gOCwgY29sb3JSR0IgJiAweDAwMDBmZl07XG4gIH1cbiAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2IoXCIpKSB7XG4gICAgcmV0dXJuIGNvbG9yLnNsaWNlKDQsIC0xKS5zcGxpdChcIixcIikubWFwKHggPT4gcGFyc2VJbnQoeCkpO1xuICB9XG4gIGlmIChjb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcbiAgICByZXR1cm4gY29sb3Iuc2xpY2UoNSwgLTEpLnNwbGl0KFwiLFwiKS5tYXAoeCA9PiBwYXJzZUludCh4KSkuc2xpY2UoMCwgMyk7XG4gIH1cbiAgd2FybihgTm90IGEgdmFsaWQgY29sb3IgZm9ybWF0OiBcIiR7Y29sb3J9XCJgKTtcbiAgcmV0dXJuIFswLCAwLCAwXTtcbn1cbmZ1bmN0aW9uIGdldENvbG9yVmFsdWVzKGNvbG9ycykge1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kKHNwYW4pO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgY29sb3JzLmtleXMoKSkge1xuICAgIHNwYW4uc3R5bGUuY29sb3IgPSBuYW1lO1xuICAgIGNvbnN0IGNvbXB1dGVkQ29sb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzcGFuKS5jb2xvcjtcbiAgICBjb2xvcnMuc2V0KG5hbWUsIGdldFJHQihjb21wdXRlZENvbG9yKSk7XG4gIH1cbiAgc3Bhbi5yZW1vdmUoKTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KSB7XG4gIGNvbnN0IHtcbiAgICBhLFxuICAgIGIsXG4gICAgYyxcbiAgICBkLFxuICAgIGUsXG4gICAgZlxuICB9ID0gY3R4LmdldFRyYW5zZm9ybSgpO1xuICByZXR1cm4gW2EsIGIsIGMsIGQsIGUsIGZdO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoY3R4KSB7XG4gIGNvbnN0IHtcbiAgICBhLFxuICAgIGIsXG4gICAgYyxcbiAgICBkLFxuICAgIGUsXG4gICAgZlxuICB9ID0gY3R4LmdldFRyYW5zZm9ybSgpLmludmVydFNlbGYoKTtcbiAgcmV0dXJuIFthLCBiLCBjLCBkLCBlLCBmXTtcbn1cbmZ1bmN0aW9uIHNldExheWVyRGltZW5zaW9ucyhkaXYsIHZpZXdwb3J0LCBtdXN0RmxpcCA9IGZhbHNlLCBtdXN0Um90YXRlID0gdHJ1ZSkge1xuICBpZiAodmlld3BvcnQgaW5zdGFuY2VvZiBQYWdlVmlld3BvcnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0XG4gICAgfSA9IHZpZXdwb3J0LnJhd0RpbXM7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gZGl2O1xuICAgIGNvbnN0IHVzZVJvdW5kID0gdXRpbF9GZWF0dXJlVGVzdC5pc0NTU1JvdW5kU3VwcG9ydGVkO1xuICAgIGNvbnN0IHcgPSBgdmFyKC0tc2NhbGUtZmFjdG9yKSAqICR7cGFnZVdpZHRofXB4YCxcbiAgICAgIGggPSBgdmFyKC0tc2NhbGUtZmFjdG9yKSAqICR7cGFnZUhlaWdodH1weGA7XG4gICAgY29uc3Qgd2lkdGhTdHIgPSB1c2VSb3VuZCA/IGByb3VuZCgke3d9LCAxcHgpYCA6IGBjYWxjKCR7d30pYCxcbiAgICAgIGhlaWdodFN0ciA9IHVzZVJvdW5kID8gYHJvdW5kKCR7aH0sIDFweClgIDogYGNhbGMoJHtofSlgO1xuICAgIGlmICghbXVzdEZsaXAgfHwgdmlld3BvcnQucm90YXRpb24gJSAxODAgPT09IDApIHtcbiAgICAgIHN0eWxlLndpZHRoID0gd2lkdGhTdHI7XG4gICAgICBzdHlsZS5oZWlnaHQgPSBoZWlnaHRTdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlLndpZHRoID0gaGVpZ2h0U3RyO1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gd2lkdGhTdHI7XG4gICAgfVxuICB9XG4gIGlmIChtdXN0Um90YXRlKSB7XG4gICAgZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtbWFpbi1yb3RhdGlvblwiLCB2aWV3cG9ydC5yb3RhdGlvbik7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL3Rvb2xiYXIuanNcblxuY2xhc3MgRWRpdG9yVG9vbGJhciB7XG4gICN0b29sYmFyID0gbnVsbDtcbiAgI2NvbG9yUGlja2VyID0gbnVsbDtcbiAgI2VkaXRvcjtcbiAgI2J1dHRvbnMgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3IgPSBlZGl0b3I7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGVkaXRUb29sYmFyID0gdGhpcy4jdG9vbGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZWRpdFRvb2xiYXIuY2xhc3NOYW1lID0gXCJlZGl0VG9vbGJhclwiO1xuICAgIGVkaXRUb29sYmFyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0b29sYmFyXCIpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgZWRpdFRvb2xiYXIuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGVkaXRUb29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBFZGl0b3JUb29sYmFyLiNwb2ludGVyRG93biwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuI2J1dHRvbnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGJ1dHRvbnMuY2xhc3NOYW1lID0gXCJidXR0b25zXCI7XG4gICAgZWRpdFRvb2xiYXIuYXBwZW5kKGJ1dHRvbnMpO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy4jZWRpdG9yLnRvb2xiYXJQb3NpdGlvbjtcbiAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3R5bGVcbiAgICAgIH0gPSBlZGl0VG9vbGJhcjtcbiAgICAgIGNvbnN0IHggPSB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5kaXJlY3Rpb24gPT09IFwibHRyXCIgPyAxIC0gcG9zaXRpb25bMF0gOiBwb3NpdGlvblswXTtcbiAgICAgIHN0eWxlLmluc2V0SW5saW5lRW5kID0gYCR7MTAwICogeH0lYDtcbiAgICAgIHN0eWxlLnRvcCA9IGBjYWxjKCR7MTAwICogcG9zaXRpb25bMV19JSArIHZhcigtLWVkaXRvci10b29sYmFyLXZlcnQtb2Zmc2V0KSlgO1xuICAgIH1cbiAgICB0aGlzLiNhZGREZWxldGVCdXR0b24oKTtcbiAgICByZXR1cm4gZWRpdFRvb2xiYXI7XG4gIH1cbiAgc3RhdGljICNwb2ludGVyRG93bihlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICAjZm9jdXNJbihlKSB7XG4gICAgdGhpcy4jZWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSBmYWxzZTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICAjZm9jdXNPdXQoZSkge1xuICAgIHRoaXMuI2VkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gdHJ1ZTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICAjYWRkTGlzdGVuZXJzVG9FbGVtZW50KGVsZW1lbnQpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgdGhpcy4jZm9jdXNJbi5iaW5kKHRoaXMpLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgdGhpcy4jZm9jdXNPdXQuYmluZCh0aGlzKSwge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgdGhpcy4jdG9vbGJhci5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIHRoaXMuI2NvbG9yUGlja2VyPy5oaWRlRHJvcGRvd24oKTtcbiAgfVxuICBzaG93KCkge1xuICAgIHRoaXMuI3Rvb2xiYXIuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgfVxuICAjYWRkRGVsZXRlQnV0dG9uKCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uLmNsYXNzTmFtZSA9IFwiZGVsZXRlXCI7XG4gICAgYnV0dG9uLnRhYkluZGV4ID0gMDtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIGBwZGZqcy1lZGl0b3ItcmVtb3ZlLSR7dGhpcy4jZWRpdG9yLmVkaXRvclR5cGV9LWJ1dHRvbmApO1xuICAgIHRoaXMuI2FkZExpc3RlbmVyc1RvRWxlbWVudChidXR0b24pO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZSA9PiB7XG4gICAgICB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5kZWxldGUoKTtcbiAgICB9LCB7XG4gICAgICBzaWduYWw6IHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLl9zaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLiNidXR0b25zLmFwcGVuZChidXR0b24pO1xuICB9XG4gIGdldCAjZGl2aWRlcigpIHtcbiAgICBjb25zdCBkaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXZpZGVyLmNsYXNzTmFtZSA9IFwiZGl2aWRlclwiO1xuICAgIHJldHVybiBkaXZpZGVyO1xuICB9XG4gIGFkZEFsdFRleHRCdXR0b24oYnV0dG9uKSB7XG4gICAgdGhpcy4jYWRkTGlzdGVuZXJzVG9FbGVtZW50KGJ1dHRvbik7XG4gICAgdGhpcy4jYnV0dG9ucy5wcmVwZW5kKGJ1dHRvbiwgdGhpcy4jZGl2aWRlcik7XG4gIH1cbiAgYWRkQ29sb3JQaWNrZXIoY29sb3JQaWNrZXIpIHtcbiAgICB0aGlzLiNjb2xvclBpY2tlciA9IGNvbG9yUGlja2VyO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGNvbG9yUGlja2VyLnJlbmRlckJ1dHRvbigpO1xuICAgIHRoaXMuI2FkZExpc3RlbmVyc1RvRWxlbWVudChidXR0b24pO1xuICAgIHRoaXMuI2J1dHRvbnMucHJlcGVuZChidXR0b24sIHRoaXMuI2RpdmlkZXIpO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLiN0b29sYmFyLnJlbW92ZSgpO1xuICAgIHRoaXMuI2NvbG9yUGlja2VyPy5kZXN0cm95KCk7XG4gICAgdGhpcy4jY29sb3JQaWNrZXIgPSBudWxsO1xuICB9XG59XG5jbGFzcyBIaWdobGlnaHRUb29sYmFyIHtcbiAgI2J1dHRvbnMgPSBudWxsO1xuICAjdG9vbGJhciA9IG51bGw7XG4gICN1aU1hbmFnZXI7XG4gIGNvbnN0cnVjdG9yKHVpTWFuYWdlcikge1xuICAgIHRoaXMuI3VpTWFuYWdlciA9IHVpTWFuYWdlcjtcbiAgfVxuICAjcmVuZGVyKCkge1xuICAgIGNvbnN0IGVkaXRUb29sYmFyID0gdGhpcy4jdG9vbGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZWRpdFRvb2xiYXIuY2xhc3NOYW1lID0gXCJlZGl0VG9vbGJhclwiO1xuICAgIGVkaXRUb29sYmFyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0b29sYmFyXCIpO1xuICAgIGVkaXRUb29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICBzaWduYWw6IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsXG4gICAgfSk7XG4gICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuI2J1dHRvbnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGJ1dHRvbnMuY2xhc3NOYW1lID0gXCJidXR0b25zXCI7XG4gICAgZWRpdFRvb2xiYXIuYXBwZW5kKGJ1dHRvbnMpO1xuICAgIHRoaXMuI2FkZEhpZ2hsaWdodEJ1dHRvbigpO1xuICAgIHJldHVybiBlZGl0VG9vbGJhcjtcbiAgfVxuICAjZ2V0TGFzdFBvaW50KGJveGVzLCBpc0xUUikge1xuICAgIGxldCBsYXN0WSA9IDA7XG4gICAgbGV0IGxhc3RYID0gMDtcbiAgICBmb3IgKGNvbnN0IGJveCBvZiBib3hlcykge1xuICAgICAgY29uc3QgeSA9IGJveC55ICsgYm94LmhlaWdodDtcbiAgICAgIGlmICh5IDwgbGFzdFkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB4ID0gYm94LnggKyAoaXNMVFIgPyBib3gud2lkdGggOiAwKTtcbiAgICAgIGlmICh5ID4gbGFzdFkpIHtcbiAgICAgICAgbGFzdFggPSB4O1xuICAgICAgICBsYXN0WSA9IHk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzTFRSKSB7XG4gICAgICAgIGlmICh4ID4gbGFzdFgpIHtcbiAgICAgICAgICBsYXN0WCA9IHg7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoeCA8IGxhc3RYKSB7XG4gICAgICAgIGxhc3RYID0geDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtpc0xUUiA/IDEgLSBsYXN0WCA6IGxhc3RYLCBsYXN0WV07XG4gIH1cbiAgc2hvdyhwYXJlbnQsIGJveGVzLCBpc0xUUikge1xuICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMuI2dldExhc3RQb2ludChib3hlcywgaXNMVFIpO1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuI3Rvb2xiYXIgfHw9IHRoaXMuI3JlbmRlcigpO1xuICAgIHBhcmVudC5hcHBlbmQodGhpcy4jdG9vbGJhcik7XG4gICAgc3R5bGUuaW5zZXRJbmxpbmVFbmQgPSBgJHsxMDAgKiB4fSVgO1xuICAgIHN0eWxlLnRvcCA9IGBjYWxjKCR7MTAwICogeX0lICsgdmFyKC0tZWRpdG9yLXRvb2xiYXItdmVydC1vZmZzZXQpKWA7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICB0aGlzLiN0b29sYmFyLnJlbW92ZSgpO1xuICB9XG4gICNhZGRIaWdobGlnaHRCdXR0b24oKSB7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICBidXR0b24uY2xhc3NOYW1lID0gXCJoaWdobGlnaHRCdXR0b25cIjtcbiAgICBidXR0b24udGFiSW5kZXggPSAwO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgYHBkZmpzLWhpZ2hsaWdodC1mbG9hdGluZy1idXR0b24xYCk7XG4gICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIGJ1dHRvbi5hcHBlbmQoc3Bhbik7XG4gICAgc3Bhbi5jbGFzc05hbWUgPSBcInZpc3VhbGx5SGlkZGVuXCI7XG4gICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1oaWdobGlnaHQtZmxvYXRpbmctYnV0dG9uLWxhYmVsXCIpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLiN1aU1hbmFnZXIuaGlnaGxpZ2h0U2VsZWN0aW9uKFwiZmxvYXRpbmdfYnV0dG9uXCIpO1xuICAgIH0sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuI2J1dHRvbnMuYXBwZW5kKGJ1dHRvbik7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL3Rvb2xzLmpzXG5cblxuXG5mdW5jdGlvbiBiaW5kRXZlbnRzKG9iaiwgZWxlbWVudCwgbmFtZXMpIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIG9ialtuYW1lXS5iaW5kKG9iaikpO1xuICB9XG59XG5mdW5jdGlvbiBvcGFjaXR5VG9IZXgob3BhY2l0eSkge1xuICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1pbigyNTUsIE1hdGgubWF4KDEsIDI1NSAqIG9wYWNpdHkpKSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbn1cbmNsYXNzIElkTWFuYWdlciB7XG4gICNpZCA9IDA7XG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gYCR7QW5ub3RhdGlvbkVkaXRvclByZWZpeH0ke3RoaXMuI2lkKyt9YDtcbiAgfVxufVxuY2xhc3MgSW1hZ2VNYW5hZ2VyIHtcbiAgI2Jhc2VJZCA9IGdldFV1aWQoKTtcbiAgI2lkID0gMDtcbiAgI2NhY2hlID0gbnVsbDtcbiAgc3RhdGljIGdldCBfaXNTVkdGaXR0aW5nQ2FudmFzKCkge1xuICAgIGNvbnN0IHN2ZyA9IGBkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD1VVEYtOCw8c3ZnIHZpZXdCb3g9XCIwIDAgMSAxXCIgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cmVjdCB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIxXCIgc3R5bGU9XCJmaWxsOnJlZDtcIi8+PC9zdmc+YDtcbiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDMpO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiwge1xuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWFnZS5zcmMgPSBzdmc7XG4gICAgY29uc3QgcHJvbWlzZSA9IGltYWdlLmRlY29kZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgY3R4LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMyk7XG4gICAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSkuZGF0YS5idWZmZXIpWzBdID09PSAwO1xuICAgIH0pO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfaXNTVkdGaXR0aW5nQ2FudmFzXCIsIHByb21pc2UpO1xuICB9XG4gIGFzeW5jICNnZXQoa2V5LCByYXdEYXRhKSB7XG4gICAgdGhpcy4jY2FjaGUgfHw9IG5ldyBNYXAoKTtcbiAgICBsZXQgZGF0YSA9IHRoaXMuI2NhY2hlLmdldChrZXkpO1xuICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGRhdGE/LmJpdG1hcCkge1xuICAgICAgZGF0YS5yZWZDb3VudGVyICs9IDE7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgfHw9IHtcbiAgICAgICAgYml0bWFwOiBudWxsLFxuICAgICAgICBpZDogYGltYWdlXyR7dGhpcy4jYmFzZUlkfV8ke3RoaXMuI2lkKyt9YCxcbiAgICAgICAgcmVmQ291bnRlcjogMCxcbiAgICAgICAgaXNTdmc6IGZhbHNlXG4gICAgICB9O1xuICAgICAgbGV0IGltYWdlO1xuICAgICAgaWYgKHR5cGVvZiByYXdEYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGRhdGEudXJsID0gcmF3RGF0YTtcbiAgICAgICAgaW1hZ2UgPSBhd2FpdCBmZXRjaERhdGEocmF3RGF0YSwgXCJibG9iXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW1hZ2UgPSBkYXRhLmZpbGUgPSByYXdEYXRhO1xuICAgICAgfVxuICAgICAgaWYgKGltYWdlLnR5cGUgPT09IFwiaW1hZ2Uvc3ZnK3htbFwiKSB7XG4gICAgICAgIGNvbnN0IG11c3RSZW1vdmVBc3BlY3RSYXRpb1Byb21pc2UgPSBJbWFnZU1hbmFnZXIuX2lzU1ZHRml0dGluZ0NhbnZhcztcbiAgICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBjb25zdCBpbWFnZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgaW1hZ2VFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGRhdGEuYml0bWFwID0gaW1hZ2VFbGVtZW50O1xuICAgICAgICAgICAgZGF0YS5pc1N2ZyA9IHRydWU7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGRhdGEuc3ZnVXJsID0gZmlsZVJlYWRlci5yZXN1bHQ7XG4gICAgICAgICAgICBpbWFnZUVsZW1lbnQuc3JjID0gKGF3YWl0IG11c3RSZW1vdmVBc3BlY3RSYXRpb1Byb21pc2UpID8gYCR7dXJsfSNzdmdWaWV3KHByZXNlcnZlQXNwZWN0UmF0aW8obm9uZSkpYCA6IHVybDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGltYWdlRWxlbWVudC5vbmVycm9yID0gZmlsZVJlYWRlci5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGltYWdlKTtcbiAgICAgICAgYXdhaXQgaW1hZ2VQcm9taXNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5iaXRtYXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChpbWFnZSk7XG4gICAgICB9XG4gICAgICBkYXRhLnJlZkNvdW50ZXIgPSAxO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICBkYXRhID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy4jY2FjaGUuc2V0KGtleSwgZGF0YSk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMuI2NhY2hlLnNldChkYXRhLmlkLCBkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgYXN5bmMgZ2V0RnJvbUZpbGUoZmlsZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxhc3RNb2RpZmllZCxcbiAgICAgIG5hbWUsXG4gICAgICBzaXplLFxuICAgICAgdHlwZVxuICAgIH0gPSBmaWxlO1xuICAgIHJldHVybiB0aGlzLiNnZXQoYCR7bGFzdE1vZGlmaWVkfV8ke25hbWV9XyR7c2l6ZX1fJHt0eXBlfWAsIGZpbGUpO1xuICB9XG4gIGFzeW5jIGdldEZyb21VcmwodXJsKSB7XG4gICAgcmV0dXJuIHRoaXMuI2dldCh1cmwsIHVybCk7XG4gIH1cbiAgYXN5bmMgZ2V0RnJvbUlkKGlkKSB7XG4gICAgdGhpcy4jY2FjaGUgfHw9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy4jY2FjaGUuZ2V0KGlkKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZGF0YS5iaXRtYXApIHtcbiAgICAgIGRhdGEucmVmQ291bnRlciArPSAxO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmIChkYXRhLmZpbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEZyb21GaWxlKGRhdGEuZmlsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldEZyb21VcmwoZGF0YS51cmwpO1xuICB9XG4gIGdldFN2Z1VybChpZCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLiNjYWNoZS5nZXQoaWQpO1xuICAgIGlmICghZGF0YT8uaXNTdmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YS5zdmdVcmw7XG4gIH1cbiAgZGVsZXRlSWQoaWQpIHtcbiAgICB0aGlzLiNjYWNoZSB8fD0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLiNjYWNoZS5nZXQoaWQpO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYXRhLnJlZkNvdW50ZXIgLT0gMTtcbiAgICBpZiAoZGF0YS5yZWZDb3VudGVyICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRhdGEuYml0bWFwID0gbnVsbDtcbiAgfVxuICBpc1ZhbGlkSWQoaWQpIHtcbiAgICByZXR1cm4gaWQuc3RhcnRzV2l0aChgaW1hZ2VfJHt0aGlzLiNiYXNlSWR9X2ApO1xuICB9XG59XG5jbGFzcyBDb21tYW5kTWFuYWdlciB7XG4gICNjb21tYW5kcyA9IFtdO1xuICAjbG9ja2VkID0gZmFsc2U7XG4gICNtYXhTaXplO1xuICAjcG9zaXRpb24gPSAtMTtcbiAgY29uc3RydWN0b3IobWF4U2l6ZSA9IDEyOCkge1xuICAgIHRoaXMuI21heFNpemUgPSBtYXhTaXplO1xuICB9XG4gIGFkZCh7XG4gICAgY21kLFxuICAgIHVuZG8sXG4gICAgcG9zdCxcbiAgICBtdXN0RXhlYyxcbiAgICB0eXBlID0gTmFOLFxuICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGUgPSBmYWxzZSxcbiAgICBrZWVwVW5kbyA9IGZhbHNlXG4gIH0pIHtcbiAgICBpZiAobXVzdEV4ZWMpIHtcbiAgICAgIGNtZCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNhdmUgPSB7XG4gICAgICBjbWQsXG4gICAgICB1bmRvLFxuICAgICAgcG9zdCxcbiAgICAgIHR5cGVcbiAgICB9O1xuICAgIGlmICh0aGlzLiNwb3NpdGlvbiA9PT0gLTEpIHtcbiAgICAgIGlmICh0aGlzLiNjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuI2NvbW1hbmRzLmxlbmd0aCA9IDA7XG4gICAgICB9XG4gICAgICB0aGlzLiNwb3NpdGlvbiA9IDA7XG4gICAgICB0aGlzLiNjb21tYW5kcy5wdXNoKHNhdmUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3ZlcndyaXRlSWZTYW1lVHlwZSAmJiB0aGlzLiNjb21tYW5kc1t0aGlzLiNwb3NpdGlvbl0udHlwZSA9PT0gdHlwZSkge1xuICAgICAgaWYgKGtlZXBVbmRvKSB7XG4gICAgICAgIHNhdmUudW5kbyA9IHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXS51bmRvO1xuICAgICAgfVxuICAgICAgdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dID0gc2F2ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuI3Bvc2l0aW9uICsgMTtcbiAgICBpZiAobmV4dCA9PT0gdGhpcy4jbWF4U2l6ZSkge1xuICAgICAgdGhpcy4jY29tbWFuZHMuc3BsaWNlKDAsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNwb3NpdGlvbiA9IG5leHQ7XG4gICAgICBpZiAobmV4dCA8IHRoaXMuI2NvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLiNjb21tYW5kcy5zcGxpY2UobmV4dCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI2NvbW1hbmRzLnB1c2goc2F2ZSk7XG4gIH1cbiAgdW5kbygpIHtcbiAgICBpZiAodGhpcy4jcG9zaXRpb24gPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2xvY2tlZCA9IHRydWU7XG4gICAgY29uc3Qge1xuICAgICAgdW5kbyxcbiAgICAgIHBvc3RcbiAgICB9ID0gdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dO1xuICAgIHVuZG8oKTtcbiAgICBwb3N0Py4oKTtcbiAgICB0aGlzLiNsb2NrZWQgPSBmYWxzZTtcbiAgICB0aGlzLiNwb3NpdGlvbiAtPSAxO1xuICB9XG4gIHJlZG8oKSB7XG4gICAgaWYgKHRoaXMuI3Bvc2l0aW9uIDwgdGhpcy4jY29tbWFuZHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy4jcG9zaXRpb24gKz0gMTtcbiAgICAgIHRoaXMuI2xvY2tlZCA9IHRydWU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNtZCxcbiAgICAgICAgcG9zdFxuICAgICAgfSA9IHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXTtcbiAgICAgIGNtZCgpO1xuICAgICAgcG9zdD8uKCk7XG4gICAgICB0aGlzLiNsb2NrZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaGFzU29tZXRoaW5nVG9VbmRvKCkge1xuICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbiAhPT0gLTE7XG4gIH1cbiAgaGFzU29tZXRoaW5nVG9SZWRvKCkge1xuICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbiA8IHRoaXMuI2NvbW1hbmRzLmxlbmd0aCAtIDE7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLiNjb21tYW5kcyA9IG51bGw7XG4gIH1cbn1cbmNsYXNzIEtleWJvYXJkTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKGNhbGxiYWNrcykge1xuICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5hbGxLZXlzID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTWFjXG4gICAgfSA9IHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgZm9yIChjb25zdCBba2V5cywgY2FsbGJhY2ssIG9wdGlvbnMgPSB7fV0gb2YgY2FsbGJhY2tzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGlzTWFjS2V5ID0ga2V5LnN0YXJ0c1dpdGgoXCJtYWMrXCIpO1xuICAgICAgICBpZiAoaXNNYWMgJiYgaXNNYWNLZXkpIHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5zZXQoa2V5LnNsaWNlKDQpLCB7XG4gICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmFsbEtleXMuYWRkKGtleS5zcGxpdChcIitcIikuYXQoLTEpKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNNYWMgJiYgIWlzTWFjS2V5KSB7XG4gICAgICAgICAgdGhpcy5jYWxsYmFja3Muc2V0KGtleSwge1xuICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5hbGxLZXlzLmFkZChrZXkuc3BsaXQoXCIrXCIpLmF0KC0xKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI3NlcmlhbGl6ZShldmVudCkge1xuICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2goXCJhbHRcIik7XG4gICAgfVxuICAgIGlmIChldmVudC5jdHJsS2V5KSB7XG4gICAgICB0aGlzLmJ1ZmZlci5wdXNoKFwiY3RybFwiKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2goXCJtZXRhXCIpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2goXCJzaGlmdFwiKTtcbiAgICB9XG4gICAgdGhpcy5idWZmZXIucHVzaChldmVudC5rZXkpO1xuICAgIGNvbnN0IHN0ciA9IHRoaXMuYnVmZmVyLmpvaW4oXCIrXCIpO1xuICAgIHRoaXMuYnVmZmVyLmxlbmd0aCA9IDA7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBleGVjKHNlbGYsIGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmFsbEtleXMuaGFzKGV2ZW50LmtleSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuY2FsbGJhY2tzLmdldCh0aGlzLiNzZXJpYWxpemUoZXZlbnQpKTtcbiAgICBpZiAoIWluZm8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgY2FsbGJhY2ssXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGJ1YmJsZXMgPSBmYWxzZSxcbiAgICAgICAgYXJncyA9IFtdLFxuICAgICAgICBjaGVja2VyID0gbnVsbFxuICAgICAgfVxuICAgIH0gPSBpbmZvO1xuICAgIGlmIChjaGVja2VyICYmICFjaGVja2VyKHNlbGYsIGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsYmFjay5iaW5kKHNlbGYsIC4uLmFyZ3MsIGV2ZW50KSgpO1xuICAgIGlmICghYnViYmxlcykge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgQ29sb3JNYW5hZ2VyIHtcbiAgc3RhdGljIF9jb2xvcnNNYXBwaW5nID0gbmV3IE1hcChbW1wiQ2FudmFzVGV4dFwiLCBbMCwgMCwgMF1dLCBbXCJDYW52YXNcIiwgWzI1NSwgMjU1LCAyNTVdXV0pO1xuICBnZXQgX2NvbG9ycygpIHtcbiAgICBjb25zdCBjb2xvcnMgPSBuZXcgTWFwKFtbXCJDYW52YXNUZXh0XCIsIG51bGxdLCBbXCJDYW52YXNcIiwgbnVsbF1dKTtcbiAgICBnZXRDb2xvclZhbHVlcyhjb2xvcnMpO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfY29sb3JzXCIsIGNvbG9ycyk7XG4gIH1cbiAgY29udmVydChjb2xvcikge1xuICAgIGNvbnN0IHJnYiA9IGdldFJHQihjb2xvcik7XG4gICAgaWYgKCF3aW5kb3cubWF0Y2hNZWRpYShcIihmb3JjZWQtY29sb3JzOiBhY3RpdmUpXCIpLm1hdGNoZXMpIHtcbiAgICAgIHJldHVybiByZ2I7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW25hbWUsIFJHQl0gb2YgdGhpcy5fY29sb3JzKSB7XG4gICAgICBpZiAoUkdCLmV2ZXJ5KCh4LCBpKSA9PiB4ID09PSByZ2JbaV0pKSB7XG4gICAgICAgIHJldHVybiBDb2xvck1hbmFnZXIuX2NvbG9yc01hcHBpbmcuZ2V0KG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmdiO1xuICB9XG4gIGdldEhleENvZGUobmFtZSkge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuX2NvbG9ycy5nZXQobmFtZSk7XG4gICAgaWYgKCFyZ2IpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gVXRpbC5tYWtlSGV4Q29sb3IoLi4ucmdiKTtcbiAgfVxufVxuY2xhc3MgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciB7XG4gICNhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICNhY3RpdmVFZGl0b3IgPSBudWxsO1xuICAjYWxsRWRpdG9ycyA9IG5ldyBNYXAoKTtcbiAgI2FsbExheWVycyA9IG5ldyBNYXAoKTtcbiAgI2FsdFRleHRNYW5hZ2VyID0gbnVsbDtcbiAgI2Fubm90YXRpb25TdG9yYWdlID0gbnVsbDtcbiAgI2NoYW5nZWRFeGlzdGluZ0Fubm90YXRpb25zID0gbnVsbDtcbiAgI2NvbW1hbmRNYW5hZ2VyID0gbmV3IENvbW1hbmRNYW5hZ2VyKCk7XG4gICNjdXJyZW50UGFnZUluZGV4ID0gMDtcbiAgI2RlbGV0ZWRBbm5vdGF0aW9uc0VsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gICNkcmFnZ2luZ0VkaXRvcnMgPSBudWxsO1xuICAjZWRpdG9yVHlwZXMgPSBudWxsO1xuICAjZWRpdG9yc1RvUmVzY2FsZSA9IG5ldyBTZXQoKTtcbiAgI2VuYWJsZUhpZ2hsaWdodEZsb2F0aW5nQnV0dG9uID0gZmFsc2U7XG4gICNmaWx0ZXJGYWN0b3J5ID0gbnVsbDtcbiAgI2ZvY3VzTWFpbkNvbnRhaW5lclRpbWVvdXRJZCA9IG51bGw7XG4gICNoaWdobGlnaHRDb2xvcnMgPSBudWxsO1xuICAjaGlnaGxpZ2h0V2hlblNoaWZ0VXAgPSBmYWxzZTtcbiAgI2hpZ2hsaWdodFRvb2xiYXIgPSBudWxsO1xuICAjaWRNYW5hZ2VyID0gbmV3IElkTWFuYWdlcigpO1xuICAjaXNFbmFibGVkID0gZmFsc2U7XG4gICNpc1dhaXRpbmcgPSBmYWxzZTtcbiAgI2xhc3RBY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgI21haW5IaWdobGlnaHRDb2xvclBpY2tlciA9IG51bGw7XG4gICNtbE1hbmFnZXIgPSBudWxsO1xuICAjbW9kZSA9IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkU7XG4gICNzZWxlY3RlZEVkaXRvcnMgPSBuZXcgU2V0KCk7XG4gICNzZWxlY3RlZFRleHROb2RlID0gbnVsbDtcbiAgI3BhZ2VDb2xvcnMgPSBudWxsO1xuICAjc2hvd0FsbFN0YXRlcyA9IG51bGw7XG4gICNib3VuZEJsdXIgPSB0aGlzLmJsdXIuYmluZCh0aGlzKTtcbiAgI2JvdW5kRm9jdXMgPSB0aGlzLmZvY3VzLmJpbmQodGhpcyk7XG4gICNib3VuZENvcHkgPSB0aGlzLmNvcHkuYmluZCh0aGlzKTtcbiAgI2JvdW5kQ3V0ID0gdGhpcy5jdXQuYmluZCh0aGlzKTtcbiAgI2JvdW5kUGFzdGUgPSB0aGlzLnBhc3RlLmJpbmQodGhpcyk7XG4gICNib3VuZEtleWRvd24gPSB0aGlzLmtleWRvd24uYmluZCh0aGlzKTtcbiAgI2JvdW5kS2V5dXAgPSB0aGlzLmtleXVwLmJpbmQodGhpcyk7XG4gICNib3VuZE9uRWRpdGluZ0FjdGlvbiA9IHRoaXMub25FZGl0aW5nQWN0aW9uLmJpbmQodGhpcyk7XG4gICNib3VuZE9uUGFnZUNoYW5naW5nID0gdGhpcy5vblBhZ2VDaGFuZ2luZy5iaW5kKHRoaXMpO1xuICAjYm91bmRPblNjYWxlQ2hhbmdpbmcgPSB0aGlzLm9uU2NhbGVDaGFuZ2luZy5iaW5kKHRoaXMpO1xuICAjYm91bmRPblJvdGF0aW9uQ2hhbmdpbmcgPSB0aGlzLm9uUm90YXRpb25DaGFuZ2luZy5iaW5kKHRoaXMpO1xuICAjcHJldmlvdXNTdGF0ZXMgPSB7XG4gICAgaXNFZGl0aW5nOiBmYWxzZSxcbiAgICBpc0VtcHR5OiB0cnVlLFxuICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogZmFsc2UsXG4gICAgaGFzU29tZXRoaW5nVG9SZWRvOiBmYWxzZSxcbiAgICBoYXNTZWxlY3RlZEVkaXRvcjogZmFsc2UsXG4gICAgaGFzU2VsZWN0ZWRUZXh0OiBmYWxzZVxuICB9O1xuICAjdHJhbnNsYXRpb24gPSBbMCwgMF07XG4gICN0cmFuc2xhdGlvblRpbWVvdXRJZCA9IG51bGw7XG4gICNjb250YWluZXIgPSBudWxsO1xuICAjdmlld2VyID0gbnVsbDtcbiAgc3RhdGljIFRSQU5TTEFURV9TTUFMTCA9IDE7XG4gIHN0YXRpYyBUUkFOU0xBVEVfQklHID0gMTA7XG4gIHN0YXRpYyBnZXQgX2tleWJvYXJkTWFuYWdlcigpIHtcbiAgICBjb25zdCBwcm90byA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIucHJvdG90eXBlO1xuICAgIGNvbnN0IGFycm93Q2hlY2tlciA9IHNlbGYgPT4gc2VsZi4jY29udGFpbmVyLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQudGFnTmFtZSAhPT0gXCJCVVRUT05cIiAmJiBzZWxmLmhhc1NvbWV0aGluZ1RvQ29udHJvbCgpO1xuICAgIGNvbnN0IHRleHRJbnB1dENoZWNrZXIgPSAoX3NlbGYsIHtcbiAgICAgIHRhcmdldDogZWxcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB0eXBlXG4gICAgICAgIH0gPSBlbDtcbiAgICAgICAgcmV0dXJuIHR5cGUgIT09IFwidGV4dFwiICYmIHR5cGUgIT09IFwibnVtYmVyXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIGNvbnN0IHNtYWxsID0gdGhpcy5UUkFOU0xBVEVfU01BTEw7XG4gICAgY29uc3QgYmlnID0gdGhpcy5UUkFOU0xBVEVfQklHO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfa2V5Ym9hcmRNYW5hZ2VyXCIsIG5ldyBLZXlib2FyZE1hbmFnZXIoW1tbXCJjdHJsK2FcIiwgXCJtYWMrbWV0YSthXCJdLCBwcm90by5zZWxlY3RBbGwsIHtcbiAgICAgIGNoZWNrZXI6IHRleHRJbnB1dENoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrelwiLCBcIm1hYyttZXRhK3pcIl0sIHByb3RvLnVuZG8sIHtcbiAgICAgIGNoZWNrZXI6IHRleHRJbnB1dENoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwreVwiLCBcImN0cmwrc2hpZnQrelwiLCBcIm1hYyttZXRhK3NoaWZ0K3pcIiwgXCJjdHJsK3NoaWZ0K1pcIiwgXCJtYWMrbWV0YStzaGlmdCtaXCJdLCBwcm90by5yZWRvLCB7XG4gICAgICBjaGVja2VyOiB0ZXh0SW5wdXRDaGVja2VyXG4gICAgfV0sIFtbXCJCYWNrc3BhY2VcIiwgXCJhbHQrQmFja3NwYWNlXCIsIFwiY3RybCtCYWNrc3BhY2VcIiwgXCJzaGlmdCtCYWNrc3BhY2VcIiwgXCJtYWMrQmFja3NwYWNlXCIsIFwibWFjK2FsdCtCYWNrc3BhY2VcIiwgXCJtYWMrY3RybCtCYWNrc3BhY2VcIiwgXCJEZWxldGVcIiwgXCJjdHJsK0RlbGV0ZVwiLCBcInNoaWZ0K0RlbGV0ZVwiLCBcIm1hYytEZWxldGVcIl0sIHByb3RvLmRlbGV0ZSwge1xuICAgICAgY2hlY2tlcjogdGV4dElucHV0Q2hlY2tlclxuICAgIH1dLCBbW1wiRW50ZXJcIiwgXCJtYWMrRW50ZXJcIl0sIHByb3RvLmFkZE5ld0VkaXRvckZyb21LZXlib2FyZCwge1xuICAgICAgY2hlY2tlcjogKHNlbGYsIHtcbiAgICAgICAgdGFyZ2V0OiBlbFxuICAgICAgfSkgPT4gIShlbCBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50KSAmJiBzZWxmLiNjb250YWluZXIuY29udGFpbnMoZWwpICYmICFzZWxmLmlzRW50ZXJIYW5kbGVkXG4gICAgfV0sIFtbXCIgXCIsIFwibWFjKyBcIl0sIHByb3RvLmFkZE5ld0VkaXRvckZyb21LZXlib2FyZCwge1xuICAgICAgY2hlY2tlcjogKHNlbGYsIHtcbiAgICAgICAgdGFyZ2V0OiBlbFxuICAgICAgfSkgPT4gIShlbCBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50KSAmJiBzZWxmLiNjb250YWluZXIuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcbiAgICB9XSwgW1tcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIHByb3RvLnVuc2VsZWN0QWxsXSwgW1tcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogWy1zbWFsbCwgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dMZWZ0XCIsIFwibWFjK3NoaWZ0K0Fycm93TGVmdFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbLWJpZywgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbc21hbGwsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93UmlnaHRcIiwgXCJtYWMrc2hpZnQrQXJyb3dSaWdodFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbYmlnLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiQXJyb3dVcFwiLCBcIm1hYytBcnJvd1VwXCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFswLCAtc21hbGxdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93VXBcIiwgXCJtYWMrc2hpZnQrQXJyb3dVcFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbMCwgLWJpZ10sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogWzAsIHNtYWxsXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd0Rvd25cIiwgXCJtYWMrc2hpZnQrQXJyb3dEb3duXCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFswLCBiaWddLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV1dKSk7XG4gIH1cbiAgY29uc3RydWN0b3IoY29udGFpbmVyLCB2aWV3ZXIsIGFsdFRleHRNYW5hZ2VyLCBldmVudEJ1cywgcGRmRG9jdW1lbnQsIHBhZ2VDb2xvcnMsIGhpZ2hsaWdodENvbG9ycywgZW5hYmxlSGlnaGxpZ2h0RmxvYXRpbmdCdXR0b24sIG1sTWFuYWdlcikge1xuICAgIHRoaXMuX3NpZ25hbCA9IHRoaXMuI2Fib3J0Q29udHJvbGxlci5zaWduYWw7XG4gICAgdGhpcy4jY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuI3ZpZXdlciA9IHZpZXdlcjtcbiAgICB0aGlzLiNhbHRUZXh0TWFuYWdlciA9IGFsdFRleHRNYW5hZ2VyO1xuICAgIHRoaXMuX2V2ZW50QnVzID0gZXZlbnRCdXM7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29uKFwiZWRpdGluZ2FjdGlvblwiLCB0aGlzLiNib3VuZE9uRWRpdGluZ0FjdGlvbik7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29uKFwicGFnZWNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25QYWdlQ2hhbmdpbmcpO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vbihcInNjYWxlY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblNjYWxlQ2hhbmdpbmcpO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vbihcInJvdGF0aW9uY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblJvdGF0aW9uQ2hhbmdpbmcpO1xuICAgIHRoaXMuI2FkZFNlbGVjdGlvbkxpc3RlbmVyKCk7XG4gICAgdGhpcy4jYWRkRHJhZ0FuZERyb3BMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLiNhZGRLZXlib2FyZE1hbmFnZXIoKTtcbiAgICB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZSA9IHBkZkRvY3VtZW50LmFubm90YXRpb25TdG9yYWdlO1xuICAgIHRoaXMuI2ZpbHRlckZhY3RvcnkgPSBwZGZEb2N1bWVudC5maWx0ZXJGYWN0b3J5O1xuICAgIHRoaXMuI3BhZ2VDb2xvcnMgPSBwYWdlQ29sb3JzO1xuICAgIHRoaXMuI2hpZ2hsaWdodENvbG9ycyA9IGhpZ2hsaWdodENvbG9ycyB8fCBudWxsO1xuICAgIHRoaXMuI2VuYWJsZUhpZ2hsaWdodEZsb2F0aW5nQnV0dG9uID0gZW5hYmxlSGlnaGxpZ2h0RmxvYXRpbmdCdXR0b247XG4gICAgdGhpcy4jbWxNYW5hZ2VyID0gbWxNYW5hZ2VyIHx8IG51bGw7XG4gICAgdGhpcy52aWV3UGFyYW1ldGVycyA9IHtcbiAgICAgIHJlYWxTY2FsZTogUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTLFxuICAgICAgcm90YXRpb246IDBcbiAgICB9O1xuICAgIHRoaXMuaXNTaGlmdEtleURvd24gPSBmYWxzZTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuI2Fib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLiNhYm9ydENvbnRyb2xsZXIgPSBudWxsO1xuICAgIHRoaXMuX3NpZ25hbCA9IG51bGw7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29mZihcImVkaXRpbmdhY3Rpb25cIiwgdGhpcy4jYm91bmRPbkVkaXRpbmdBY3Rpb24pO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vZmYoXCJwYWdlY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblBhZ2VDaGFuZ2luZyk7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29mZihcInNjYWxlY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblNjYWxlQ2hhbmdpbmcpO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vZmYoXCJyb3RhdGlvbmNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25Sb3RhdGlvbkNoYW5naW5nKTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuICAgICAgbGF5ZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLiNhbGxMYXllcnMuY2xlYXIoKTtcbiAgICB0aGlzLiNhbGxFZGl0b3JzLmNsZWFyKCk7XG4gICAgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZS5jbGVhcigpO1xuICAgIHRoaXMuI2FjdGl2ZUVkaXRvciA9IG51bGw7XG4gICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmNsZWFyKCk7XG4gICAgdGhpcy4jY29tbWFuZE1hbmFnZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuI2FsdFRleHRNYW5hZ2VyPy5kZXN0cm95KCk7XG4gICAgdGhpcy4jaGlnaGxpZ2h0VG9vbGJhcj8uaGlkZSgpO1xuICAgIHRoaXMuI2hpZ2hsaWdodFRvb2xiYXIgPSBudWxsO1xuICAgIGlmICh0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQpO1xuICAgICAgdGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQpO1xuICAgICAgdGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBhc3luYyBtbEd1ZXNzKGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy4jbWxNYW5hZ2VyPy5ndWVzcyhkYXRhKSB8fCBudWxsO1xuICB9XG4gIGdldCBoYXNNTE1hbmFnZXIoKSB7XG4gICAgcmV0dXJuICEhdGhpcy4jbWxNYW5hZ2VyO1xuICB9XG4gIGdldCBoY21GaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImhjbUZpbHRlclwiLCB0aGlzLiNwYWdlQ29sb3JzID8gdGhpcy4jZmlsdGVyRmFjdG9yeS5hZGRIQ01GaWx0ZXIodGhpcy4jcGFnZUNvbG9ycy5mb3JlZ3JvdW5kLCB0aGlzLiNwYWdlQ29sb3JzLmJhY2tncm91bmQpIDogXCJub25lXCIpO1xuICB9XG4gIGdldCBkaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImRpcmVjdGlvblwiLCBnZXRDb21wdXRlZFN0eWxlKHRoaXMuI2NvbnRhaW5lcikuZGlyZWN0aW9uKTtcbiAgfVxuICBnZXQgaGlnaGxpZ2h0Q29sb3JzKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJoaWdobGlnaHRDb2xvcnNcIiwgdGhpcy4jaGlnaGxpZ2h0Q29sb3JzID8gbmV3IE1hcCh0aGlzLiNoaWdobGlnaHRDb2xvcnMuc3BsaXQoXCIsXCIpLm1hcChwYWlyID0+IHBhaXIuc3BsaXQoXCI9XCIpLm1hcCh4ID0+IHgudHJpbSgpKSkpIDogbnVsbCk7XG4gIH1cbiAgZ2V0IGhpZ2hsaWdodENvbG9yTmFtZXMoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImhpZ2hsaWdodENvbG9yTmFtZXNcIiwgdGhpcy5oaWdobGlnaHRDb2xvcnMgPyBuZXcgTWFwKEFycmF5LmZyb20odGhpcy5oaWdobGlnaHRDb2xvcnMsIGUgPT4gZS5yZXZlcnNlKCkpKSA6IG51bGwpO1xuICB9XG4gIHNldE1haW5IaWdobGlnaHRDb2xvclBpY2tlcihjb2xvclBpY2tlcikge1xuICAgIHRoaXMuI21haW5IaWdobGlnaHRDb2xvclBpY2tlciA9IGNvbG9yUGlja2VyO1xuICB9XG4gIGVkaXRBbHRUZXh0KGVkaXRvcikge1xuICAgIHRoaXMuI2FsdFRleHRNYW5hZ2VyPy5lZGl0QWx0VGV4dCh0aGlzLCBlZGl0b3IpO1xuICB9XG4gIG9uUGFnZUNoYW5naW5nKHtcbiAgICBwYWdlTnVtYmVyXG4gIH0pIHtcbiAgICB0aGlzLiNjdXJyZW50UGFnZUluZGV4ID0gcGFnZU51bWJlciAtIDE7XG4gIH1cbiAgZm9jdXNNYWluQ29udGFpbmVyKCkge1xuICAgIHRoaXMuI2NvbnRhaW5lci5mb2N1cygpO1xuICB9XG4gIGZpbmRQYXJlbnQoeCwgeSkge1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IGxheWVyWCxcbiAgICAgICAgeTogbGF5ZXJZLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9ID0gbGF5ZXIuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHggPj0gbGF5ZXJYICYmIHggPD0gbGF5ZXJYICsgd2lkdGggJiYgeSA+PSBsYXllclkgJiYgeSA8PSBsYXllclkgKyBoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIGxheWVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBkaXNhYmxlVXNlclNlbGVjdCh2YWx1ZSA9IGZhbHNlKSB7XG4gICAgdGhpcy4jdmlld2VyLmNsYXNzTGlzdC50b2dnbGUoXCJub1VzZXJTZWxlY3RcIiwgdmFsdWUpO1xuICB9XG4gIGFkZFNob3VsZFJlc2NhbGUoZWRpdG9yKSB7XG4gICAgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZS5hZGQoZWRpdG9yKTtcbiAgfVxuICByZW1vdmVTaG91bGRSZXNjYWxlKGVkaXRvcikge1xuICAgIHRoaXMuI2VkaXRvcnNUb1Jlc2NhbGUuZGVsZXRlKGVkaXRvcik7XG4gIH1cbiAgb25TY2FsZUNoYW5naW5nKHtcbiAgICBzY2FsZVxuICB9KSB7XG4gICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuICAgIHRoaXMudmlld1BhcmFtZXRlcnMucmVhbFNjYWxlID0gc2NhbGUgKiBQaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFM7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZSkge1xuICAgICAgZWRpdG9yLm9uU2NhbGVDaGFuZ2luZygpO1xuICAgIH1cbiAgfVxuICBvblJvdGF0aW9uQ2hhbmdpbmcoe1xuICAgIHBhZ2VzUm90YXRpb25cbiAgfSkge1xuICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICB0aGlzLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uID0gcGFnZXNSb3RhdGlvbjtcbiAgfVxuICAjZ2V0QW5jaG9yRWxlbWVudEZvclNlbGVjdGlvbih7XG4gICAgYW5jaG9yTm9kZVxuICB9KSB7XG4gICAgcmV0dXJuIGFuY2hvck5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFID8gYW5jaG9yTm9kZS5wYXJlbnRFbGVtZW50IDogYW5jaG9yTm9kZTtcbiAgfVxuICBoaWdobGlnaHRTZWxlY3Rpb24obWV0aG9kT2ZDcmVhdGlvbiA9IFwiXCIpIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24uaXNDb2xsYXBzZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0XG4gICAgfSA9IHNlbGVjdGlvbjtcbiAgICBjb25zdCB0ZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgYW5jaG9yRWxlbWVudCA9IHRoaXMuI2dldEFuY2hvckVsZW1lbnRGb3JTZWxlY3Rpb24oc2VsZWN0aW9uKTtcbiAgICBjb25zdCB0ZXh0TGF5ZXIgPSBhbmNob3JFbGVtZW50LmNsb3Nlc3QoXCIudGV4dExheWVyXCIpO1xuICAgIGNvbnN0IGJveGVzID0gdGhpcy5nZXRTZWxlY3Rpb25Cb3hlcyh0ZXh0TGF5ZXIpO1xuICAgIGlmICghYm94ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2VsZWN0aW9uLmVtcHR5KCk7XG4gICAgaWYgKHRoaXMuI21vZGUgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUpIHtcbiAgICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKFwic2hvd2Fubm90YXRpb25lZGl0b3J1aVwiLCB7XG4gICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgbW9kZTogQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2hvd0FsbEVkaXRvcnMoXCJoaWdobGlnaHRcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG4gICAgICBpZiAobGF5ZXIuaGFzVGV4dExheWVyKHRleHRMYXllcikpIHtcbiAgICAgICAgbGF5ZXIuY3JlYXRlQW5kQWRkTmV3RWRpdG9yKHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfSwgZmFsc2UsIHtcbiAgICAgICAgICBtZXRob2RPZkNyZWF0aW9uLFxuICAgICAgICAgIGJveGVzLFxuICAgICAgICAgIGFuY2hvck5vZGUsXG4gICAgICAgICAgYW5jaG9yT2Zmc2V0LFxuICAgICAgICAgIGZvY3VzTm9kZSxcbiAgICAgICAgICBmb2N1c09mZnNldCxcbiAgICAgICAgICB0ZXh0XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI2Rpc3BsYXlIaWdobGlnaHRUb29sYmFyKCkge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbmNob3JFbGVtZW50ID0gdGhpcy4jZ2V0QW5jaG9yRWxlbWVudEZvclNlbGVjdGlvbihzZWxlY3Rpb24pO1xuICAgIGNvbnN0IHRleHRMYXllciA9IGFuY2hvckVsZW1lbnQuY2xvc2VzdChcIi50ZXh0TGF5ZXJcIik7XG4gICAgY29uc3QgYm94ZXMgPSB0aGlzLmdldFNlbGVjdGlvbkJveGVzKHRleHRMYXllcik7XG4gICAgaWYgKCFib3hlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNoaWdobGlnaHRUb29sYmFyIHx8PSBuZXcgSGlnaGxpZ2h0VG9vbGJhcih0aGlzKTtcbiAgICB0aGlzLiNoaWdobGlnaHRUb29sYmFyLnNob3codGV4dExheWVyLCBib3hlcywgdGhpcy5kaXJlY3Rpb24gPT09IFwibHRyXCIpO1xuICB9XG4gIGFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoZWRpdG9yKSB7XG4gICAgaWYgKCFlZGl0b3IuaXNFbXB0eSgpICYmIHRoaXMuI2Fubm90YXRpb25TdG9yYWdlICYmICF0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZS5oYXMoZWRpdG9yLmlkKSkge1xuICAgICAgdGhpcy4jYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUoZWRpdG9yLmlkLCBlZGl0b3IpO1xuICAgIH1cbiAgfVxuICAjc2VsZWN0aW9uQ2hhbmdlKCkge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkge1xuICAgICAgaWYgKHRoaXMuI3NlbGVjdGVkVGV4dE5vZGUpIHtcbiAgICAgICAgdGhpcy4jaGlnaGxpZ2h0VG9vbGJhcj8uaGlkZSgpO1xuICAgICAgICB0aGlzLiNzZWxlY3RlZFRleHROb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgICAgIGhhc1NlbGVjdGVkVGV4dDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFuY2hvck5vZGVcbiAgICB9ID0gc2VsZWN0aW9uO1xuICAgIGlmIChhbmNob3JOb2RlID09PSB0aGlzLiNzZWxlY3RlZFRleHROb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFuY2hvckVsZW1lbnQgPSB0aGlzLiNnZXRBbmNob3JFbGVtZW50Rm9yU2VsZWN0aW9uKHNlbGVjdGlvbik7XG4gICAgY29uc3QgdGV4dExheWVyID0gYW5jaG9yRWxlbWVudC5jbG9zZXN0KFwiLnRleHRMYXllclwiKTtcbiAgICBpZiAoIXRleHRMYXllcikge1xuICAgICAgaWYgKHRoaXMuI3NlbGVjdGVkVGV4dE5vZGUpIHtcbiAgICAgICAgdGhpcy4jaGlnaGxpZ2h0VG9vbGJhcj8uaGlkZSgpO1xuICAgICAgICB0aGlzLiNzZWxlY3RlZFRleHROb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgICAgIGhhc1NlbGVjdGVkVGV4dDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2hpZ2hsaWdodFRvb2xiYXI/LmhpZGUoKTtcbiAgICB0aGlzLiNzZWxlY3RlZFRleHROb2RlID0gYW5jaG9yTm9kZTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTZWxlY3RlZFRleHQ6IHRydWVcbiAgICB9KTtcbiAgICBpZiAodGhpcy4jbW9kZSAhPT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUICYmIHRoaXMuI21vZGUgIT09IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI21vZGUgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVCkge1xuICAgICAgdGhpcy5zaG93QWxsRWRpdG9ycyhcImhpZ2hsaWdodFwiLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gICAgdGhpcy4jaGlnaGxpZ2h0V2hlblNoaWZ0VXAgPSB0aGlzLmlzU2hpZnRLZXlEb3duO1xuICAgIGlmICghdGhpcy5pc1NoaWZ0S2V5RG93bikge1xuICAgICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fc2lnbmFsO1xuICAgICAgY29uc3QgcG9pbnRlcnVwID0gZSA9PiB7XG4gICAgICAgIGlmIChlLnR5cGUgPT09IFwicG9pbnRlcnVwXCIgJiYgZS5idXR0b24gIT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlcnVwKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJ1cCk7XG4gICAgICAgIGlmIChlLnR5cGUgPT09IFwicG9pbnRlcnVwXCIpIHtcbiAgICAgICAgICB0aGlzLiNvblNlbGVjdEVuZChcIm1haW5fdG9vbGJhclwiKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJ1cCwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJ1cCwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAjb25TZWxlY3RFbmQobWV0aG9kT2ZDcmVhdGlvbiA9IFwiXCIpIHtcbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodFNlbGVjdGlvbihtZXRob2RPZkNyZWF0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2VuYWJsZUhpZ2hsaWdodEZsb2F0aW5nQnV0dG9uKSB7XG4gICAgICB0aGlzLiNkaXNwbGF5SGlnaGxpZ2h0VG9vbGJhcigpO1xuICAgIH1cbiAgfVxuICAjYWRkU2VsZWN0aW9uTGlzdGVuZXIoKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLiNzZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKSwge1xuICAgICAgc2lnbmFsOiB0aGlzLl9zaWduYWxcbiAgICB9KTtcbiAgfVxuICAjYWRkRm9jdXNNYW5hZ2VyKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3NpZ25hbDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI2JvdW5kRm9jdXMsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNib3VuZEJsdXIsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gICNyZW1vdmVGb2N1c01hbmFnZXIoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNib3VuZEZvY3VzKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy4jYm91bmRCbHVyKTtcbiAgfVxuICBibHVyKCkge1xuICAgIHRoaXMuaXNTaGlmdEtleURvd24gPSBmYWxzZTtcbiAgICBpZiAodGhpcy4jaGlnaGxpZ2h0V2hlblNoaWZ0VXApIHtcbiAgICAgIHRoaXMuI2hpZ2hsaWdodFdoZW5TaGlmdFVwID0gZmFsc2U7XG4gICAgICB0aGlzLiNvblNlbGVjdEVuZChcIm1haW5fdG9vbGJhclwiKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBhY3RpdmVFbGVtZW50XG4gICAgfSA9IGRvY3VtZW50O1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgaWYgKGVkaXRvci5kaXYuY29udGFpbnMoYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy4jbGFzdEFjdGl2ZUVsZW1lbnQgPSBbZWRpdG9yLCBhY3RpdmVFbGVtZW50XTtcbiAgICAgICAgZWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvY3VzKCkge1xuICAgIGlmICghdGhpcy4jbGFzdEFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW2xhc3RFZGl0b3IsIGxhc3RBY3RpdmVFbGVtZW50XSA9IHRoaXMuI2xhc3RBY3RpdmVFbGVtZW50O1xuICAgIHRoaXMuI2xhc3RBY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICBsYXN0QWN0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCAoKSA9PiB7XG4gICAgICBsYXN0RWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSB0cnVlO1xuICAgIH0sIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBzaWduYWw6IHRoaXMuX3NpZ25hbFxuICAgIH0pO1xuICAgIGxhc3RBY3RpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cbiAgI2FkZEtleWJvYXJkTWFuYWdlcigpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl9zaWduYWw7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5ZG93biwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCB0aGlzLiNib3VuZEtleXVwLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICAjcmVtb3ZlS2V5Ym9hcmRNYW5hZ2VyKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleWRvd24pO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgdGhpcy4jYm91bmRLZXl1cCk7XG4gIH1cbiAgI2FkZENvcHlQYXN0ZUxpc3RlbmVycygpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl9zaWduYWw7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgdGhpcy4jYm91bmRDb3B5LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY3V0XCIsIHRoaXMuI2JvdW5kQ3V0LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgdGhpcy4jYm91bmRQYXN0ZSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgI3JlbW92ZUNvcHlQYXN0ZUxpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29weVwiLCB0aGlzLiNib3VuZENvcHkpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjdXRcIiwgdGhpcy4jYm91bmRDdXQpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCB0aGlzLiNib3VuZFBhc3RlKTtcbiAgfVxuICAjYWRkRHJhZ0FuZERyb3BMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fc2lnbmFsO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnb3ZlclwiLCB0aGlzLmRyYWdPdmVyLmJpbmQodGhpcyksIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJkcm9wXCIsIHRoaXMuZHJvcC5iaW5kKHRoaXMpLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICBhZGRFZGl0TGlzdGVuZXJzKCkge1xuICAgIHRoaXMuI2FkZEtleWJvYXJkTWFuYWdlcigpO1xuICAgIHRoaXMuI2FkZENvcHlQYXN0ZUxpc3RlbmVycygpO1xuICB9XG4gIHJlbW92ZUVkaXRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy4jcmVtb3ZlS2V5Ym9hcmRNYW5hZ2VyKCk7XG4gICAgdGhpcy4jcmVtb3ZlQ29weVBhc3RlTGlzdGVuZXJzKCk7XG4gIH1cbiAgZHJhZ092ZXIoZXZlbnQpIHtcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIHR5cGVcbiAgICB9IG9mIGV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIHRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICAgIGlmIChlZGl0b3JUeXBlLmlzSGFuZGxpbmdNaW1lRm9yUGFzdGluZyh0eXBlKSkge1xuICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJjb3B5XCI7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZHJvcChldmVudCkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXMpIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yVHlwZSBvZiB0aGlzLiNlZGl0b3JUeXBlcykge1xuICAgICAgICBpZiAoZWRpdG9yVHlwZS5pc0hhbmRsaW5nTWltZUZvclBhc3RpbmcoaXRlbS50eXBlKSkge1xuICAgICAgICAgIGVkaXRvclR5cGUucGFzdGUoaXRlbSwgdGhpcy5jdXJyZW50TGF5ZXIpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvcHkoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuI2FjdGl2ZUVkaXRvcj8uY29tbWl0T3JSZW1vdmUoKTtcbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBlZGl0b3Iuc2VyaWFsaXplKHRydWUpO1xuICAgICAgaWYgKHNlcmlhbGl6ZWQpIHtcbiAgICAgICAgZWRpdG9ycy5wdXNoKHNlcmlhbGl6ZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWRpdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQuY2xpcGJvYXJkRGF0YS5zZXREYXRhKFwiYXBwbGljYXRpb24vcGRmanNcIiwgSlNPTi5zdHJpbmdpZnkoZWRpdG9ycykpO1xuICB9XG4gIGN1dChldmVudCkge1xuICAgIHRoaXMuY29weShldmVudCk7XG4gICAgdGhpcy5kZWxldGUoKTtcbiAgfVxuICBwYXN0ZShldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3Qge1xuICAgICAgY2xpcGJvYXJkRGF0YVxuICAgIH0gPSBldmVudDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY2xpcGJvYXJkRGF0YS5pdGVtcykge1xuICAgICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIHRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICAgIGlmIChlZGl0b3JUeXBlLmlzSGFuZGxpbmdNaW1lRm9yUGFzdGluZyhpdGVtLnR5cGUpKSB7XG4gICAgICAgICAgZWRpdG9yVHlwZS5wYXN0ZShpdGVtLCB0aGlzLmN1cnJlbnRMYXllcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBkYXRhID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiYXBwbGljYXRpb24vcGRmanNcIik7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgd2FybihgcGFzdGU6IFwiJHtleC5tZXNzYWdlfVwiLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5jdXJyZW50TGF5ZXI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5ld0VkaXRvcnMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGRhdGEpIHtcbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkRWRpdG9yID0gbGF5ZXIuZGVzZXJpYWxpemUoZWRpdG9yKTtcbiAgICAgICAgaWYgKCFkZXNlcmlhbGl6ZWRFZGl0b3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbmV3RWRpdG9ycy5wdXNoKGRlc2VyaWFsaXplZEVkaXRvcik7XG4gICAgICB9XG4gICAgICBjb25zdCBjbWQgPSAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIG5ld0VkaXRvcnMpIHtcbiAgICAgICAgICB0aGlzLiNhZGRFZGl0b3JUb0xheWVyKGVkaXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc2VsZWN0RWRpdG9ycyhuZXdFZGl0b3JzKTtcbiAgICAgIH07XG4gICAgICBjb25zdCB1bmRvID0gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBuZXdFZGl0b3JzKSB7XG4gICAgICAgICAgZWRpdG9yLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgIGNtZCxcbiAgICAgICAgdW5kbyxcbiAgICAgICAgbXVzdEV4ZWM6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB3YXJuKGBwYXN0ZTogXCIke2V4Lm1lc3NhZ2V9XCIuYCk7XG4gICAgfVxuICB9XG4gIGtleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNTaGlmdEtleURvd24gJiYgZXZlbnQua2V5ID09PSBcIlNoaWZ0XCIpIHtcbiAgICAgIHRoaXMuaXNTaGlmdEtleURvd24gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbW9kZSAhPT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSAmJiAhdGhpcy5pc0VkaXRvckhhbmRsaW5nS2V5Ym9hcmQpIHtcbiAgICAgIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuX2tleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIGV2ZW50KTtcbiAgICB9XG4gIH1cbiAga2V5dXAoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5pc1NoaWZ0S2V5RG93biAmJiBldmVudC5rZXkgPT09IFwiU2hpZnRcIikge1xuICAgICAgdGhpcy5pc1NoaWZ0S2V5RG93biA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuI2hpZ2hsaWdodFdoZW5TaGlmdFVwKSB7XG4gICAgICAgIHRoaXMuI2hpZ2hsaWdodFdoZW5TaGlmdFVwID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI29uU2VsZWN0RW5kKFwibWFpbl90b29sYmFyXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBvbkVkaXRpbmdBY3Rpb24oe1xuICAgIG5hbWVcbiAgfSkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSBcInVuZG9cIjpcbiAgICAgIGNhc2UgXCJyZWRvXCI6XG4gICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICBjYXNlIFwic2VsZWN0QWxsXCI6XG4gICAgICAgIHRoaXNbbmFtZV0oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiaGlnaGxpZ2h0U2VsZWN0aW9uXCI6XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0U2VsZWN0aW9uKFwiY29udGV4dF9tZW51XCIpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKGRldGFpbHMpIHtcbiAgICBjb25zdCBoYXNDaGFuZ2VkID0gT2JqZWN0LmVudHJpZXMoZGV0YWlscykuc29tZSgoW2tleSwgdmFsdWVdKSA9PiB0aGlzLiNwcmV2aW91c1N0YXRlc1trZXldICE9PSB2YWx1ZSk7XG4gICAgaWYgKGhhc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKFwiYW5ub3RhdGlvbmVkaXRvcnN0YXRlc2NoYW5nZWRcIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIGRldGFpbHM6IE9iamVjdC5hc3NpZ24odGhpcy4jcHJldmlvdXNTdGF0ZXMsIGRldGFpbHMpXG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLiNtb2RlID09PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5ISUdITElHSFQgJiYgZGV0YWlscy5oYXNTZWxlY3RlZEVkaXRvciA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9GUkVFLCB0cnVlXV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAjZGlzcGF0Y2hVcGRhdGVVSShkZXRhaWxzKSB7XG4gICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9ycGFyYW1zY2hhbmdlZFwiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBkZXRhaWxzXG4gICAgfSk7XG4gIH1cbiAgc2V0RWRpdGluZ1N0YXRlKGlzRWRpdGluZykge1xuICAgIGlmIChpc0VkaXRpbmcpIHtcbiAgICAgIHRoaXMuI2FkZEZvY3VzTWFuYWdlcigpO1xuICAgICAgdGhpcy4jYWRkQ29weVBhc3RlTGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICAgIGlzRWRpdGluZzogdGhpcy4jbW9kZSAhPT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSxcbiAgICAgICAgaXNFbXB0eTogdGhpcy4jaXNFbXB0eSgpLFxuICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvVW5kbygpLFxuICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvUmVkbygpLFxuICAgICAgICBoYXNTZWxlY3RlZEVkaXRvcjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNyZW1vdmVGb2N1c01hbmFnZXIoKTtcbiAgICAgIHRoaXMuI3JlbW92ZUNvcHlQYXN0ZUxpc3RlbmVycygpO1xuICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgICBpc0VkaXRpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGlzYWJsZVVzZXJTZWxlY3QoZmFsc2UpO1xuICAgIH1cbiAgfVxuICByZWdpc3RlckVkaXRvclR5cGVzKHR5cGVzKSB7XG4gICAgaWYgKHRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2VkaXRvclR5cGVzID0gdHlwZXM7XG4gICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIHRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKGVkaXRvclR5cGUuZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgfVxuICB9XG4gIGdldElkKCkge1xuICAgIHJldHVybiB0aGlzLiNpZE1hbmFnZXIuaWQ7XG4gIH1cbiAgZ2V0IGN1cnJlbnRMYXllcigpIHtcbiAgICByZXR1cm4gdGhpcy4jYWxsTGF5ZXJzLmdldCh0aGlzLiNjdXJyZW50UGFnZUluZGV4KTtcbiAgfVxuICBnZXRMYXllcihwYWdlSW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy4jYWxsTGF5ZXJzLmdldChwYWdlSW5kZXgpO1xuICB9XG4gIGdldCBjdXJyZW50UGFnZUluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLiNjdXJyZW50UGFnZUluZGV4O1xuICB9XG4gIGFkZExheWVyKGxheWVyKSB7XG4gICAgdGhpcy4jYWxsTGF5ZXJzLnNldChsYXllci5wYWdlSW5kZXgsIGxheWVyKTtcbiAgICBpZiAodGhpcy4jaXNFbmFibGVkKSB7XG4gICAgICBsYXllci5lbmFibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5ZXIuZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuICByZW1vdmVMYXllcihsYXllcikge1xuICAgIHRoaXMuI2FsbExheWVycy5kZWxldGUobGF5ZXIucGFnZUluZGV4KTtcbiAgfVxuICB1cGRhdGVNb2RlKG1vZGUsIGVkaXRJZCA9IG51bGwsIGlzRnJvbUtleWJvYXJkID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gbW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNtb2RlID0gbW9kZTtcbiAgICBpZiAobW9kZSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgdGhpcy5zZXRFZGl0aW5nU3RhdGUoZmFsc2UpO1xuICAgICAgdGhpcy4jZGlzYWJsZUFsbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEVkaXRpbmdTdGF0ZSh0cnVlKTtcbiAgICB0aGlzLiNlbmFibGVBbGwoKTtcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgIGxheWVyLnVwZGF0ZU1vZGUobW9kZSk7XG4gICAgfVxuICAgIGlmICghZWRpdElkICYmIGlzRnJvbUtleWJvYXJkKSB7XG4gICAgICB0aGlzLmFkZE5ld0VkaXRvckZyb21LZXlib2FyZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWVkaXRJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQgPT09IGVkaXRJZCkge1xuICAgICAgICB0aGlzLnNldFNlbGVjdGVkKGVkaXRvcik7XG4gICAgICAgIGVkaXRvci5lbnRlckluRWRpdE1vZGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFkZE5ld0VkaXRvckZyb21LZXlib2FyZCgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5ZXIuY2FuQ3JlYXRlTmV3RW1wdHlFZGl0b3IoKSkge1xuICAgICAgdGhpcy5jdXJyZW50TGF5ZXIuYWRkTmV3RWRpdG9yKCk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVRvb2xiYXIobW9kZSkge1xuICAgIGlmIChtb2RlID09PSB0aGlzLiNtb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKFwic3dpdGNoYW5ub3RhdGlvbmVkaXRvcm1vZGVcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgbW9kZVxuICAgIH0pO1xuICB9XG4gIHVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkNSRUFURTpcbiAgICAgICAgdGhpcy5jdXJyZW50TGF5ZXIuYWRkTmV3RWRpdG9yKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0RFRkFVTFRfQ09MT1I6XG4gICAgICAgIHRoaXMuI21haW5IaWdobGlnaHRDb2xvclBpY2tlcj8udXBkYXRlQ29sb3IodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX1NIT1dfQUxMOlxuICAgICAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaChcInJlcG9ydHRlbGVtZXRyeVwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZWRpdGluZ1wiLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICB0eXBlOiBcImhpZ2hsaWdodFwiLFxuICAgICAgICAgICAgICBhY3Rpb246IFwidG9nZ2xlX3Zpc2liaWxpdHlcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICh0aGlzLiNzaG93QWxsU3RhdGVzIHx8PSBuZXcgTWFwKCkpLnNldCh0eXBlLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuc2hvd0FsbEVkaXRvcnMoXCJoaWdobGlnaHRcIiwgdmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICBlZGl0b3IudXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIHRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICBlZGl0b3JUeXBlLnVwZGF0ZURlZmF1bHRQYXJhbXModHlwZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBzaG93QWxsRWRpdG9ycyh0eXBlLCB2aXNpYmxlLCB1cGRhdGVCdXR0b24gPSBmYWxzZSkge1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChlZGl0b3IuZWRpdG9yVHlwZSA9PT0gdHlwZSkge1xuICAgICAgICBlZGl0b3Iuc2hvdyh2aXNpYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLiNzaG93QWxsU3RhdGVzPy5nZXQoQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX1NIT1dfQUxMKSA/PyB0cnVlO1xuICAgIGlmIChzdGF0ZSAhPT0gdmlzaWJsZSkge1xuICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9TSE9XX0FMTCwgdmlzaWJsZV1dKTtcbiAgICB9XG4gIH1cbiAgZW5hYmxlV2FpdGluZyhtdXN0V2FpdCA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuI2lzV2FpdGluZyA9PT0gbXVzdFdhaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaXNXYWl0aW5nID0gbXVzdFdhaXQ7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChtdXN0V2FpdCkge1xuICAgICAgICBsYXllci5kaXNhYmxlQ2xpY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxheWVyLmVuYWJsZUNsaWNrKCk7XG4gICAgICB9XG4gICAgICBsYXllci5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcIndhaXRpbmdcIiwgbXVzdFdhaXQpO1xuICAgIH1cbiAgfVxuICAjZW5hYmxlQWxsKCkge1xuICAgIGlmICghdGhpcy4jaXNFbmFibGVkKSB7XG4gICAgICB0aGlzLiNpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgICAgbGF5ZXIuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICAgIGVkaXRvci5lbmFibGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI2Rpc2FibGVBbGwoKSB7XG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xuICAgIGlmICh0aGlzLiNpc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuI2lzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgICAgbGF5ZXIuZGlzYWJsZSgpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jYWxsRWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgICBlZGl0b3IuZGlzYWJsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXRFZGl0b3JzKHBhZ2VJbmRleCkge1xuICAgIGNvbnN0IGVkaXRvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZWRpdG9yLnBhZ2VJbmRleCA9PT0gcGFnZUluZGV4KSB7XG4gICAgICAgIGVkaXRvcnMucHVzaChlZGl0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWRpdG9ycztcbiAgfVxuICBnZXRFZGl0b3IoaWQpIHtcbiAgICByZXR1cm4gdGhpcy4jYWxsRWRpdG9ycy5nZXQoaWQpO1xuICB9XG4gIGFkZEVkaXRvcihlZGl0b3IpIHtcbiAgICB0aGlzLiNhbGxFZGl0b3JzLnNldChlZGl0b3IuaWQsIGVkaXRvcik7XG4gIH1cbiAgcmVtb3ZlRWRpdG9yKGVkaXRvcikge1xuICAgIGlmIChlZGl0b3IuZGl2LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICBpZiAodGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQpO1xuICAgICAgfVxuICAgICAgdGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZm9jdXNNYWluQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuI2ZvY3VzTWFpbkNvbnRhaW5lclRpbWVvdXRJZCA9IG51bGw7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gICAgdGhpcy4jYWxsRWRpdG9ycy5kZWxldGUoZWRpdG9yLmlkKTtcbiAgICB0aGlzLnVuc2VsZWN0KGVkaXRvcik7XG4gICAgaWYgKCFlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCB8fCAhdGhpcy4jZGVsZXRlZEFubm90YXRpb25zRWxlbWVudElkcy5oYXMoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpKSB7XG4gICAgICB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZT8ucmVtb3ZlKGVkaXRvci5pZCk7XG4gICAgfVxuICB9XG4gIGFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IpIHtcbiAgICB0aGlzLiNkZWxldGVkQW5ub3RhdGlvbnNFbGVtZW50SWRzLmFkZChlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCk7XG4gICAgdGhpcy5hZGRDaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9uKGVkaXRvcik7XG4gICAgZWRpdG9yLmRlbGV0ZWQgPSB0cnVlO1xuICB9XG4gIGlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlZEFubm90YXRpb25zRWxlbWVudElkcy5oYXMoYW5ub3RhdGlvbkVsZW1lbnRJZCk7XG4gIH1cbiAgcmVtb3ZlRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRvcikge1xuICAgIHRoaXMuI2RlbGV0ZWRBbm5vdGF0aW9uc0VsZW1lbnRJZHMuZGVsZXRlKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICB0aGlzLnJlbW92ZUNoYW5nZWRFeGlzdGluZ0Fubm90YXRpb24oZWRpdG9yKTtcbiAgICBlZGl0b3IuZGVsZXRlZCA9IGZhbHNlO1xuICB9XG4gICNhZGRFZGl0b3JUb0xheWVyKGVkaXRvcikge1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy4jYWxsTGF5ZXJzLmdldChlZGl0b3IucGFnZUluZGV4KTtcbiAgICBpZiAobGF5ZXIpIHtcbiAgICAgIGxheWVyLmFkZE9yUmVidWlsZChlZGl0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZEVkaXRvcihlZGl0b3IpO1xuICAgICAgdGhpcy5hZGRUb0Fubm90YXRpb25TdG9yYWdlKGVkaXRvcik7XG4gICAgfVxuICB9XG4gIHNldEFjdGl2ZUVkaXRvcihlZGl0b3IpIHtcbiAgICBpZiAodGhpcy4jYWN0aXZlRWRpdG9yID09PSBlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYWN0aXZlRWRpdG9yID0gZWRpdG9yO1xuICAgIGlmIChlZGl0b3IpIHtcbiAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoZWRpdG9yLnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgfVxuICB9XG4gIGdldCAjbGFzdFNlbGVjdGVkRWRpdG9yKCkge1xuICAgIGxldCBlZCA9IG51bGw7XG4gICAgZm9yIChlZCBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHt9XG4gICAgcmV0dXJuIGVkO1xuICB9XG4gIHVwZGF0ZVVJKGVkaXRvcikge1xuICAgIGlmICh0aGlzLiNsYXN0U2VsZWN0ZWRFZGl0b3IgPT09IGVkaXRvcikge1xuICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3IucHJvcGVydGllc1RvVXBkYXRlKTtcbiAgICB9XG4gIH1cbiAgdG9nZ2xlU2VsZWN0ZWQoZWRpdG9yKSB7XG4gICAgaWYgKHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5oYXMoZWRpdG9yKSkge1xuICAgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmRlbGV0ZShlZGl0b3IpO1xuICAgICAgZWRpdG9yLnVuc2VsZWN0KCk7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0aGlzLmhhc1NlbGVjdGlvblxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5hZGQoZWRpdG9yKTtcbiAgICBlZGl0b3Iuc2VsZWN0KCk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3IucHJvcGVydGllc1RvVXBkYXRlKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTZWxlY3RlZEVkaXRvcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHNldFNlbGVjdGVkKGVkaXRvcikge1xuICAgIGZvciAoY29uc3QgZWQgb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICBpZiAoZWQgIT09IGVkaXRvcikge1xuICAgICAgICBlZC51bnNlbGVjdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuY2xlYXIoKTtcbiAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuYWRkKGVkaXRvcik7XG4gICAgZWRpdG9yLnNlbGVjdCgpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoZWRpdG9yLnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRydWVcbiAgICB9KTtcbiAgfVxuICBpc1NlbGVjdGVkKGVkaXRvcikge1xuICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuaGFzKGVkaXRvcik7XG4gIH1cbiAgZ2V0IGZpcnN0U2VsZWN0ZWRFZGl0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gIH1cbiAgdW5zZWxlY3QoZWRpdG9yKSB7XG4gICAgZWRpdG9yLnVuc2VsZWN0KCk7XG4gICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmRlbGV0ZShlZGl0b3IpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0aGlzLmhhc1NlbGVjdGlvblxuICAgIH0pO1xuICB9XG4gIGdldCBoYXNTZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5zaXplICE9PSAwO1xuICB9XG4gIGdldCBpc0VudGVySGFuZGxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLnNpemUgPT09IDEgJiYgdGhpcy5maXJzdFNlbGVjdGVkRWRpdG9yLmlzRW50ZXJIYW5kbGVkO1xuICB9XG4gIHVuZG8oKSB7XG4gICAgdGhpcy4jY29tbWFuZE1hbmFnZXIudW5kbygpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogdGhpcy4jY29tbWFuZE1hbmFnZXIuaGFzU29tZXRoaW5nVG9VbmRvKCksXG4gICAgICBoYXNTb21ldGhpbmdUb1JlZG86IHRydWUsXG4gICAgICBpc0VtcHR5OiB0aGlzLiNpc0VtcHR5KClcbiAgICB9KTtcbiAgfVxuICByZWRvKCkge1xuICAgIHRoaXMuI2NvbW1hbmRNYW5hZ2VyLnJlZG8oKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTb21ldGhpbmdUb1VuZG86IHRydWUsXG4gICAgICBoYXNTb21ldGhpbmdUb1JlZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvUmVkbygpLFxuICAgICAgaXNFbXB0eTogdGhpcy4jaXNFbXB0eSgpXG4gICAgfSk7XG4gIH1cbiAgYWRkQ29tbWFuZHMocGFyYW1zKSB7XG4gICAgdGhpcy4jY29tbWFuZE1hbmFnZXIuYWRkKHBhcmFtcyk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiB0cnVlLFxuICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiBmYWxzZSxcbiAgICAgIGlzRW1wdHk6IHRoaXMuI2lzRW1wdHkoKVxuICAgIH0pO1xuICB9XG4gICNpc0VtcHR5KCkge1xuICAgIGlmICh0aGlzLiNhbGxFZGl0b3JzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy4jYWxsRWRpdG9ycy5zaXplID09PSAxKSB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICAgIHJldHVybiBlZGl0b3IuaXNFbXB0eSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZGVsZXRlKCkge1xuICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvcnMgPSBbLi4udGhpcy4jc2VsZWN0ZWRFZGl0b3JzXTtcbiAgICBjb25zdCBjbWQgPSAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG4gICAgICAgIGVkaXRvci5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHVuZG8gPSAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG4gICAgICAgIHRoaXMuI2FkZEVkaXRvclRvTGF5ZXIoZWRpdG9yKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kLFxuICAgICAgdW5kbyxcbiAgICAgIG11c3RFeGVjOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgY29tbWl0T3JSZW1vdmUoKSB7XG4gICAgdGhpcy4jYWN0aXZlRWRpdG9yPy5jb21taXRPclJlbW92ZSgpO1xuICB9XG4gIGhhc1NvbWV0aGluZ1RvQ29udHJvbCgpIHtcbiAgICByZXR1cm4gdGhpcy4jYWN0aXZlRWRpdG9yIHx8IHRoaXMuaGFzU2VsZWN0aW9uO1xuICB9XG4gICNzZWxlY3RFZGl0b3JzKGVkaXRvcnMpIHtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGVkaXRvci51bnNlbGVjdCgpO1xuICAgIH1cbiAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG4gICAgICBpZiAoZWRpdG9yLmlzRW1wdHkoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5hZGQoZWRpdG9yKTtcbiAgICAgIGVkaXRvci5zZWxlY3QoKTtcbiAgICB9XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRoaXMuaGFzU2VsZWN0aW9uXG4gICAgfSk7XG4gIH1cbiAgc2VsZWN0QWxsKCkge1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgZWRpdG9yLmNvbW1pdCgpO1xuICAgIH1cbiAgICB0aGlzLiNzZWxlY3RFZGl0b3JzKHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpO1xuICB9XG4gIHVuc2VsZWN0QWxsKCkge1xuICAgIGlmICh0aGlzLiNhY3RpdmVFZGl0b3IpIHtcbiAgICAgIHRoaXMuI2FjdGl2ZUVkaXRvci5jb21taXRPclJlbW92ZSgpO1xuICAgICAgaWYgKHRoaXMuI21vZGUgIT09IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgZWRpdG9yLnVuc2VsZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5jbGVhcigpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiBmYWxzZVxuICAgIH0pO1xuICB9XG4gIHRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycyh4LCB5LCBub0NvbW1pdCA9IGZhbHNlKSB7XG4gICAgaWYgKCFub0NvbW1pdCkge1xuICAgICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3RyYW5zbGF0aW9uWzBdICs9IHg7XG4gICAgdGhpcy4jdHJhbnNsYXRpb25bMV0gKz0geTtcbiAgICBjb25zdCBbdG90YWxYLCB0b3RhbFldID0gdGhpcy4jdHJhbnNsYXRpb247XG4gICAgY29uc3QgZWRpdG9ycyA9IFsuLi50aGlzLiNzZWxlY3RlZEVkaXRvcnNdO1xuICAgIGNvbnN0IFRJTUVfVE9fV0FJVCA9IDEwMDA7XG4gICAgaWYgKHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQpO1xuICAgIH1cbiAgICB0aGlzLiN0cmFuc2xhdGlvblRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQgPSBudWxsO1xuICAgICAgdGhpcy4jdHJhbnNsYXRpb25bMF0gPSB0aGlzLiN0cmFuc2xhdGlvblsxXSA9IDA7XG4gICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgY21kOiAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZWRpdG9ycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2FsbEVkaXRvcnMuaGFzKGVkaXRvci5pZCkpIHtcbiAgICAgICAgICAgICAgZWRpdG9yLnRyYW5zbGF0ZUluUGFnZSh0b3RhbFgsIHRvdGFsWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZWRpdG9ycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2FsbEVkaXRvcnMuaGFzKGVkaXRvci5pZCkpIHtcbiAgICAgICAgICAgICAgZWRpdG9yLnRyYW5zbGF0ZUluUGFnZSgtdG90YWxYLCAtdG90YWxZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG11c3RFeGVjOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSwgVElNRV9UT19XQUlUKTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG4gICAgICBlZGl0b3IudHJhbnNsYXRlSW5QYWdlKHgsIHkpO1xuICAgIH1cbiAgfVxuICBzZXRVcERyYWdTZXNzaW9uKCkge1xuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlVXNlclNlbGVjdCh0cnVlKTtcbiAgICB0aGlzLiNkcmFnZ2luZ0VkaXRvcnMgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICB0aGlzLiNkcmFnZ2luZ0VkaXRvcnMuc2V0KGVkaXRvciwge1xuICAgICAgICBzYXZlZFg6IGVkaXRvci54LFxuICAgICAgICBzYXZlZFk6IGVkaXRvci55LFxuICAgICAgICBzYXZlZFBhZ2VJbmRleDogZWRpdG9yLnBhZ2VJbmRleCxcbiAgICAgICAgbmV3WDogMCxcbiAgICAgICAgbmV3WTogMCxcbiAgICAgICAgbmV3UGFnZUluZGV4OiAtMVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGVuZERyYWdTZXNzaW9uKCkge1xuICAgIGlmICghdGhpcy4jZHJhZ2dpbmdFZGl0b3JzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZVVzZXJTZWxlY3QoZmFsc2UpO1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuI2RyYWdnaW5nRWRpdG9ycztcbiAgICB0aGlzLiNkcmFnZ2luZ0VkaXRvcnMgPSBudWxsO1xuICAgIGxldCBtdXN0QmVBZGRlZEluVW5kb1N0YWNrID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBbe1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBwYWdlSW5kZXhcbiAgICB9LCB2YWx1ZV0gb2YgbWFwKSB7XG4gICAgICB2YWx1ZS5uZXdYID0geDtcbiAgICAgIHZhbHVlLm5ld1kgPSB5O1xuICAgICAgdmFsdWUubmV3UGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgICAgbXVzdEJlQWRkZWRJblVuZG9TdGFjayB8fD0geCAhPT0gdmFsdWUuc2F2ZWRYIHx8IHkgIT09IHZhbHVlLnNhdmVkWSB8fCBwYWdlSW5kZXggIT09IHZhbHVlLnNhdmVkUGFnZUluZGV4O1xuICAgIH1cbiAgICBpZiAoIW11c3RCZUFkZGVkSW5VbmRvU3RhY2spIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbW92ZSA9IChlZGl0b3IsIHgsIHksIHBhZ2VJbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI2FsbEVkaXRvcnMuaGFzKGVkaXRvci5pZCkpIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy4jYWxsTGF5ZXJzLmdldChwYWdlSW5kZXgpO1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgZWRpdG9yLl9zZXRQYXJlbnRBbmRQb3NpdGlvbihwYXJlbnQsIHgsIHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkaXRvci5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgICAgICAgZWRpdG9yLnggPSB4O1xuICAgICAgICAgIGVkaXRvci55ID0geTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBbZWRpdG9yLCB7XG4gICAgICAgICAgbmV3WCxcbiAgICAgICAgICBuZXdZLFxuICAgICAgICAgIG5ld1BhZ2VJbmRleFxuICAgICAgICB9XSBvZiBtYXApIHtcbiAgICAgICAgICBtb3ZlKGVkaXRvciwgbmV3WCwgbmV3WSwgbmV3UGFnZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBbZWRpdG9yLCB7XG4gICAgICAgICAgc2F2ZWRYLFxuICAgICAgICAgIHNhdmVkWSxcbiAgICAgICAgICBzYXZlZFBhZ2VJbmRleFxuICAgICAgICB9XSBvZiBtYXApIHtcbiAgICAgICAgICBtb3ZlKGVkaXRvciwgc2F2ZWRYLCBzYXZlZFksIHNhdmVkUGFnZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG11c3RFeGVjOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZHJhZ1NlbGVjdGVkRWRpdG9ycyh0eCwgdHkpIHtcbiAgICBpZiAoIXRoaXMuI2RyYWdnaW5nRWRpdG9ycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNkcmFnZ2luZ0VkaXRvcnMua2V5cygpKSB7XG4gICAgICBlZGl0b3IuZHJhZyh0eCwgdHkpO1xuICAgIH1cbiAgfVxuICByZWJ1aWxkKGVkaXRvcikge1xuICAgIGlmIChlZGl0b3IucGFyZW50ID09PSBudWxsKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmdldExheWVyKGVkaXRvci5wYWdlSW5kZXgpO1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwYXJlbnQuY2hhbmdlUGFyZW50KGVkaXRvcik7XG4gICAgICAgIHBhcmVudC5hZGRPclJlYnVpbGQoZWRpdG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRkRWRpdG9yKGVkaXRvcik7XG4gICAgICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZShlZGl0b3IpO1xuICAgICAgICBlZGl0b3IucmVidWlsZCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlZGl0b3IucGFyZW50LmFkZE9yUmVidWlsZChlZGl0b3IpO1xuICAgIH1cbiAgfVxuICBnZXQgaXNFZGl0b3JIYW5kbGluZ0tleWJvYXJkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZSgpPy5zaG91bGRHZXRLZXlib2FyZEV2ZW50cygpIHx8IHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5zaXplID09PSAxICYmIHRoaXMuZmlyc3RTZWxlY3RlZEVkaXRvci5zaG91bGRHZXRLZXlib2FyZEV2ZW50cygpO1xuICB9XG4gIGlzQWN0aXZlKGVkaXRvcikge1xuICAgIHJldHVybiB0aGlzLiNhY3RpdmVFZGl0b3IgPT09IGVkaXRvcjtcbiAgfVxuICBnZXRBY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2FjdGl2ZUVkaXRvcjtcbiAgfVxuICBnZXRNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLiNtb2RlO1xuICB9XG4gIGdldCBpbWFnZU1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImltYWdlTWFuYWdlclwiLCBuZXcgSW1hZ2VNYW5hZ2VyKCkpO1xuICB9XG4gIGdldFNlbGVjdGlvbkJveGVzKHRleHRMYXllcikge1xuICAgIGlmICghdGV4dExheWVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc2VsZWN0aW9uLnJhbmdlQ291bnQ7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBpZiAoIXRleHRMYXllci5jb250YWlucyhzZWxlY3Rpb24uZ2V0UmFuZ2VBdChpKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHg6IGxheWVyWCxcbiAgICAgIHk6IGxheWVyWSxcbiAgICAgIHdpZHRoOiBwYXJlbnRXaWR0aCxcbiAgICAgIGhlaWdodDogcGFyZW50SGVpZ2h0XG4gICAgfSA9IHRleHRMYXllci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgcm90YXRvcjtcbiAgICBzd2l0Y2ggKHRleHRMYXllci5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1haW4tcm90YXRpb25cIikpIHtcbiAgICAgIGNhc2UgXCI5MFwiOlxuICAgICAgICByb3RhdG9yID0gKHgsIHksIHcsIGgpID0+ICh7XG4gICAgICAgICAgeDogKHkgLSBsYXllclkpIC8gcGFyZW50SGVpZ2h0LFxuICAgICAgICAgIHk6IDEgLSAoeCArIHcgLSBsYXllclgpIC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgd2lkdGg6IGggLyBwYXJlbnRIZWlnaHQsXG4gICAgICAgICAgaGVpZ2h0OiB3IC8gcGFyZW50V2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIjE4MFwiOlxuICAgICAgICByb3RhdG9yID0gKHgsIHksIHcsIGgpID0+ICh7XG4gICAgICAgICAgeDogMSAtICh4ICsgdyAtIGxheWVyWCkgLyBwYXJlbnRXaWR0aCxcbiAgICAgICAgICB5OiAxIC0gKHkgKyBoIC0gbGF5ZXJZKSAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICB3aWR0aDogdyAvIHBhcmVudFdpZHRoLFxuICAgICAgICAgIGhlaWdodDogaCAvIHBhcmVudEhlaWdodFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiMjcwXCI6XG4gICAgICAgIHJvdGF0b3IgPSAoeCwgeSwgdywgaCkgPT4gKHtcbiAgICAgICAgICB4OiAxIC0gKHkgKyBoIC0gbGF5ZXJZKSAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICB5OiAoeCAtIGxheWVyWCkgLyBwYXJlbnRXaWR0aCxcbiAgICAgICAgICB3aWR0aDogaCAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICBoZWlnaHQ6IHcgLyBwYXJlbnRXaWR0aFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByb3RhdG9yID0gKHgsIHksIHcsIGgpID0+ICh7XG4gICAgICAgICAgeDogKHggLSBsYXllclgpIC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgeTogKHkgLSBsYXllclkpIC8gcGFyZW50SGVpZ2h0LFxuICAgICAgICAgIHdpZHRoOiB3IC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBoIC8gcGFyZW50SGVpZ2h0XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgYm94ZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSk7XG4gICAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0gb2YgcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKSkge1xuICAgICAgICBpZiAod2lkdGggPT09IDAgfHwgaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYm94ZXMucHVzaChyb3RhdG9yKHgsIHksIHdpZHRoLCBoZWlnaHQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJveGVzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBib3hlcztcbiAgfVxuICBhZGRDaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9uKHtcbiAgICBhbm5vdGF0aW9uRWxlbWVudElkLFxuICAgIGlkXG4gIH0pIHtcbiAgICAodGhpcy4jY2hhbmdlZEV4aXN0aW5nQW5ub3RhdGlvbnMgfHw9IG5ldyBNYXAoKSkuc2V0KGFubm90YXRpb25FbGVtZW50SWQsIGlkKTtcbiAgfVxuICByZW1vdmVDaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9uKHtcbiAgICBhbm5vdGF0aW9uRWxlbWVudElkXG4gIH0pIHtcbiAgICB0aGlzLiNjaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9ucz8uZGVsZXRlKGFubm90YXRpb25FbGVtZW50SWQpO1xuICB9XG4gIHJlbmRlckFubm90YXRpb25FbGVtZW50KGFubm90YXRpb24pIHtcbiAgICBjb25zdCBlZGl0b3JJZCA9IHRoaXMuI2NoYW5nZWRFeGlzdGluZ0Fubm90YXRpb25zPy5nZXQoYW5ub3RhdGlvbi5kYXRhLmlkKTtcbiAgICBpZiAoIWVkaXRvcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuI2Fubm90YXRpb25TdG9yYWdlLmdldFJhd1ZhbHVlKGVkaXRvcklkKTtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSAmJiAhZWRpdG9yLmhhc0JlZW5Nb2RpZmllZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IucmVuZGVyQW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbik7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2FsdF90ZXh0LmpzXG5cbmNsYXNzIEFsdFRleHQge1xuICAjYWx0VGV4dCA9IFwiXCI7XG4gICNhbHRUZXh0RGVjb3JhdGl2ZSA9IGZhbHNlO1xuICAjYWx0VGV4dEJ1dHRvbiA9IG51bGw7XG4gICNhbHRUZXh0VG9vbHRpcCA9IG51bGw7XG4gICNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAjYWx0VGV4dFdhc0Zyb21LZXlCb2FyZCA9IGZhbHNlO1xuICAjZWRpdG9yID0gbnVsbDtcbiAgc3RhdGljIF9sMTBuUHJvbWlzZSA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKGVkaXRvcikge1xuICAgIHRoaXMuI2VkaXRvciA9IGVkaXRvcjtcbiAgfVxuICBzdGF0aWMgaW5pdGlhbGl6ZShsMTBuUHJvbWlzZSkge1xuICAgIEFsdFRleHQuX2wxMG5Qcm9taXNlIHx8PSBsMTBuUHJvbWlzZTtcbiAgfVxuICBhc3luYyByZW5kZXIoKSB7XG4gICAgY29uc3QgYWx0VGV4dCA9IHRoaXMuI2FsdFRleHRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgIGFsdFRleHQuY2xhc3NOYW1lID0gXCJhbHRUZXh0XCI7XG4gICAgY29uc3QgbXNnID0gYXdhaXQgQWx0VGV4dC5fbDEwblByb21pc2UuZ2V0KFwicGRmanMtZWRpdG9yLWFsdC10ZXh0LWJ1dHRvbi1sYWJlbFwiKTtcbiAgICBhbHRUZXh0LnRleHRDb250ZW50ID0gbXNnO1xuICAgIGFsdFRleHQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBtc2cpO1xuICAgIGFsdFRleHQudGFiSW5kZXggPSBcIjBcIjtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGFsdFRleHQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGFsdFRleHQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGV2ZW50ID0+IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBjb25zdCBvbkNsaWNrID0gZXZlbnQgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLmVkaXRBbHRUZXh0KHRoaXMuI2VkaXRvcik7XG4gICAgfTtcbiAgICBhbHRUZXh0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBvbkNsaWNrLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgYWx0VGV4dC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBhbHRUZXh0ICYmIGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgIHRoaXMuI2FsdFRleHRXYXNGcm9tS2V5Qm9hcmQgPSB0cnVlO1xuICAgICAgICBvbkNsaWNrKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLiNzZXRTdGF0ZSgpO1xuICAgIHJldHVybiBhbHRUZXh0O1xuICB9XG4gIGZpbmlzaCgpIHtcbiAgICBpZiAoIXRoaXMuI2FsdFRleHRCdXR0b24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYWx0VGV4dEJ1dHRvbi5mb2N1cyh7XG4gICAgICBmb2N1c1Zpc2libGU6IHRoaXMuI2FsdFRleHRXYXNGcm9tS2V5Qm9hcmRcbiAgICB9KTtcbiAgICB0aGlzLiNhbHRUZXh0V2FzRnJvbUtleUJvYXJkID0gZmFsc2U7XG4gIH1cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gIXRoaXMuI2FsdFRleHQgJiYgIXRoaXMuI2FsdFRleHREZWNvcmF0aXZlO1xuICB9XG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhbHRUZXh0OiB0aGlzLiNhbHRUZXh0LFxuICAgICAgZGVjb3JhdGl2ZTogdGhpcy4jYWx0VGV4dERlY29yYXRpdmVcbiAgICB9O1xuICB9XG4gIHNldCBkYXRhKHtcbiAgICBhbHRUZXh0LFxuICAgIGRlY29yYXRpdmVcbiAgfSkge1xuICAgIGlmICh0aGlzLiNhbHRUZXh0ID09PSBhbHRUZXh0ICYmIHRoaXMuI2FsdFRleHREZWNvcmF0aXZlID09PSBkZWNvcmF0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FsdFRleHQgPSBhbHRUZXh0O1xuICAgIHRoaXMuI2FsdFRleHREZWNvcmF0aXZlID0gZGVjb3JhdGl2ZTtcbiAgICB0aGlzLiNzZXRTdGF0ZSgpO1xuICB9XG4gIHRvZ2dsZShlbmFibGVkID0gZmFsc2UpIHtcbiAgICBpZiAoIXRoaXMuI2FsdFRleHRCdXR0b24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFlbmFibGVkICYmIHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCk7XG4gICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLiNhbHRUZXh0QnV0dG9uLmRpc2FibGVkID0gIWVuYWJsZWQ7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLiNhbHRUZXh0QnV0dG9uPy5yZW1vdmUoKTtcbiAgICB0aGlzLiNhbHRUZXh0QnV0dG9uID0gbnVsbDtcbiAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcCA9IG51bGw7XG4gIH1cbiAgYXN5bmMgI3NldFN0YXRlKCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuI2FsdFRleHRCdXR0b247XG4gICAgaWYgKCFidXR0b24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNhbHRUZXh0ICYmICF0aGlzLiNhbHRUZXh0RGVjb3JhdGl2ZSkge1xuICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJkb25lXCIpO1xuICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXA/LnJlbW92ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBidXR0b24uY2xhc3NMaXN0LmFkZChcImRvbmVcIik7XG4gICAgQWx0VGV4dC5fbDEwblByb21pc2UuZ2V0KFwicGRmanMtZWRpdG9yLWFsdC10ZXh0LWVkaXQtYnV0dG9uLWxhYmVsXCIpLnRoZW4obXNnID0+IHtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG1zZyk7XG4gICAgfSk7XG4gICAgbGV0IHRvb2x0aXAgPSB0aGlzLiNhbHRUZXh0VG9vbHRpcDtcbiAgICBpZiAoIXRvb2x0aXApIHtcbiAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwID0gdG9vbHRpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgdG9vbHRpcC5jbGFzc05hbWUgPSBcInRvb2x0aXBcIjtcbiAgICAgIHRvb2x0aXAuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInRvb2x0aXBcIik7XG4gICAgICBjb25zdCBpZCA9IHRvb2x0aXAuaWQgPSBgYWx0LXRleHQtdG9vbHRpcC0ke3RoaXMuI2VkaXRvci5pZH1gO1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIiwgaWQpO1xuICAgICAgY29uc3QgREVMQVlfVE9fU0hPV19UT09MVElQID0gMTAwO1xuICAgICAgY29uc3Qgc2lnbmFsID0gdGhpcy4jZWRpdG9yLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0KTtcbiAgICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH0sIHtcbiAgICAgICAgb25jZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwLmNsYXNzTGlzdC5hZGQoXCJzaG93XCIpO1xuICAgICAgICAgIHRoaXMuI2VkaXRvci5fcmVwb3J0VGVsZW1ldHJ5KHtcbiAgICAgICAgICAgIGFjdGlvbjogXCJhbHRfdGV4dF90b29sdGlwXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgREVMQVlfVE9fU0hPV19UT09MVElQKTtcbiAgICAgIH0sIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0KTtcbiAgICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwPy5jbGFzc0xpc3QucmVtb3ZlKFwic2hvd1wiKTtcbiAgICAgIH0sIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdG9vbHRpcC5pbm5lclRleHQgPSB0aGlzLiNhbHRUZXh0RGVjb3JhdGl2ZSA/IGF3YWl0IEFsdFRleHQuX2wxMG5Qcm9taXNlLmdldChcInBkZmpzLWVkaXRvci1hbHQtdGV4dC1kZWNvcmF0aXZlLXRvb2x0aXBcIikgOiB0aGlzLiNhbHRUZXh0O1xuICAgIGlmICghdG9vbHRpcC5wYXJlbnROb2RlKSB7XG4gICAgICBidXR0b24uYXBwZW5kKHRvb2x0aXApO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy4jZWRpdG9yLmdldEltYWdlRm9yQWx0VGV4dCgpO1xuICAgIGVsZW1lbnQ/LnNldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIiwgdG9vbHRpcC5pZCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2VkaXRvci5qc1xuXG5cblxuXG5cbmNsYXNzIEFubm90YXRpb25FZGl0b3Ige1xuICAjYWNjZXNzaWJpbGl0eURhdGEgPSBudWxsO1xuICAjYWxsUmVzaXplckRpdnMgPSBudWxsO1xuICAjYWx0VGV4dCA9IG51bGw7XG4gICNkaXNhYmxlZCA9IGZhbHNlO1xuICAja2VlcEFzcGVjdFJhdGlvID0gZmFsc2U7XG4gICNyZXNpemVyc0RpdiA9IG51bGw7XG4gICNzYXZlZERpbWVuc2lvbnMgPSBudWxsO1xuICAjYm91bmRGb2N1c2luID0gdGhpcy5mb2N1c2luLmJpbmQodGhpcyk7XG4gICNib3VuZEZvY3Vzb3V0ID0gdGhpcy5mb2N1c291dC5iaW5kKHRoaXMpO1xuICAjZWRpdFRvb2xiYXIgPSBudWxsO1xuICAjZm9jdXNlZFJlc2l6ZXJOYW1lID0gXCJcIjtcbiAgI2hhc0JlZW5DbGlja2VkID0gZmFsc2U7XG4gICNpbml0aWFsUG9zaXRpb24gPSBudWxsO1xuICAjaXNFZGl0aW5nID0gZmFsc2U7XG4gICNpc0luRWRpdE1vZGUgPSBmYWxzZTtcbiAgI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZCA9IGZhbHNlO1xuICAjbW92ZUluRE9NVGltZW91dCA9IG51bGw7XG4gICNwcmV2RHJhZ1ggPSAwO1xuICAjcHJldkRyYWdZID0gMDtcbiAgI3RlbGVtZXRyeVRpbWVvdXRzID0gbnVsbDtcbiAgX2luaXRpYWxPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgX2lzVmlzaWJsZSA9IHRydWU7XG4gIF91aU1hbmFnZXIgPSBudWxsO1xuICBfZm9jdXNFdmVudHNBbGxvd2VkID0gdHJ1ZTtcbiAgX2wxMG5Qcm9taXNlID0gbnVsbDtcbiAgI2lzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICN6SW5kZXggPSBBbm5vdGF0aW9uRWRpdG9yLl96SW5kZXgrKztcbiAgc3RhdGljIF9ib3JkZXJMaW5lV2lkdGggPSAtMTtcbiAgc3RhdGljIF9jb2xvck1hbmFnZXIgPSBuZXcgQ29sb3JNYW5hZ2VyKCk7XG4gIHN0YXRpYyBfekluZGV4ID0gMTtcbiAgc3RhdGljIF90ZWxlbWV0cnlUaW1lb3V0ID0gMTAwMDtcbiAgc3RhdGljIGdldCBfcmVzaXplcktleWJvYXJkTWFuYWdlcigpIHtcbiAgICBjb25zdCByZXNpemUgPSBBbm5vdGF0aW9uRWRpdG9yLnByb3RvdHlwZS5fcmVzaXplV2l0aEtleWJvYXJkO1xuICAgIGNvbnN0IHNtYWxsID0gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfU01BTEw7XG4gICAgY29uc3QgYmlnID0gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfQklHO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfcmVzaXplcktleWJvYXJkTWFuYWdlclwiLCBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiQXJyb3dMZWZ0XCIsIFwibWFjK0Fycm93TGVmdFwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbLXNtYWxsLCAwXVxuICAgIH1dLCBbW1wiY3RybCtBcnJvd0xlZnRcIiwgXCJtYWMrc2hpZnQrQXJyb3dMZWZ0XCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFstYmlnLCAwXVxuICAgIH1dLCBbW1wiQXJyb3dSaWdodFwiLCBcIm1hYytBcnJvd1JpZ2h0XCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFtzbWFsbCwgMF1cbiAgICB9XSwgW1tcImN0cmwrQXJyb3dSaWdodFwiLCBcIm1hYytzaGlmdCtBcnJvd1JpZ2h0XCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFtiaWcsIDBdXG4gICAgfV0sIFtbXCJBcnJvd1VwXCIsIFwibWFjK0Fycm93VXBcIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogWzAsIC1zbWFsbF1cbiAgICB9XSwgW1tcImN0cmwrQXJyb3dVcFwiLCBcIm1hYytzaGlmdCtBcnJvd1VwXCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFswLCAtYmlnXVxuICAgIH1dLCBbW1wiQXJyb3dEb3duXCIsIFwibWFjK0Fycm93RG93blwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbMCwgc21hbGxdXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93RG93blwiLCBcIm1hYytzaGlmdCtBcnJvd0Rvd25cIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogWzAsIGJpZ11cbiAgICB9XSwgW1tcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIEFubm90YXRpb25FZGl0b3IucHJvdG90eXBlLl9zdG9wUmVzaXppbmdXaXRoS2V5Ym9hcmRdXSkpO1xuICB9XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQW5ub3RhdGlvbkVkaXRvcikge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBBbm5vdGF0aW9uRWRpdG9yLlwiKTtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJhbWV0ZXJzLnBhcmVudDtcbiAgICB0aGlzLmlkID0gcGFyYW1ldGVycy5pZDtcbiAgICB0aGlzLndpZHRoID0gdGhpcy5oZWlnaHQgPSBudWxsO1xuICAgIHRoaXMucGFnZUluZGV4ID0gcGFyYW1ldGVycy5wYXJlbnQucGFnZUluZGV4O1xuICAgIHRoaXMubmFtZSA9IHBhcmFtZXRlcnMubmFtZTtcbiAgICB0aGlzLmRpdiA9IG51bGw7XG4gICAgdGhpcy5fdWlNYW5hZ2VyID0gcGFyYW1ldGVycy51aU1hbmFnZXI7XG4gICAgdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkID0gbnVsbDtcbiAgICB0aGlzLl93aWxsS2VlcEFzcGVjdFJhdGlvID0gZmFsc2U7XG4gICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNDZW50ZXJlZCA9IHBhcmFtZXRlcnMuaXNDZW50ZXJlZDtcbiAgICB0aGlzLl9zdHJ1Y3RUcmVlUGFyZW50SWQgPSBudWxsO1xuICAgIGNvbnN0IHtcbiAgICAgIHJvdGF0aW9uLFxuICAgICAgcmF3RGltczoge1xuICAgICAgICBwYWdlV2lkdGgsXG4gICAgICAgIHBhZ2VIZWlnaHQsXG4gICAgICAgIHBhZ2VYLFxuICAgICAgICBwYWdlWVxuICAgICAgfVxuICAgIH0gPSB0aGlzLnBhcmVudC52aWV3cG9ydDtcbiAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG4gICAgdGhpcy5wYWdlUm90YXRpb24gPSAoMzYwICsgcm90YXRpb24gLSB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucm90YXRpb24pICUgMzYwO1xuICAgIHRoaXMucGFnZURpbWVuc2lvbnMgPSBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XTtcbiAgICB0aGlzLnBhZ2VUcmFuc2xhdGlvbiA9IFtwYWdlWCwgcGFnZVldO1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLnggPSBwYXJhbWV0ZXJzLnggLyB3aWR0aDtcbiAgICB0aGlzLnkgPSBwYXJhbWV0ZXJzLnkgLyBoZWlnaHQ7XG4gICAgdGhpcy5pc0F0dGFjaGVkVG9ET00gPSBmYWxzZTtcbiAgICB0aGlzLmRlbGV0ZWQgPSBmYWxzZTtcbiAgfVxuICBnZXQgZWRpdG9yVHlwZSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yLl90eXBlO1xuICB9XG4gIHN0YXRpYyBnZXQgX2RlZmF1bHRMaW5lQ29sb3IoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9kZWZhdWx0TGluZUNvbG9yXCIsIHRoaXMuX2NvbG9yTWFuYWdlci5nZXRIZXhDb2RlKFwiQ2FudmFzVGV4dFwiKSk7XG4gIH1cbiAgc3RhdGljIGRlbGV0ZUFubm90YXRpb25FbGVtZW50KGVkaXRvcikge1xuICAgIGNvbnN0IGZha2VFZGl0b3IgPSBuZXcgRmFrZUVkaXRvcih7XG4gICAgICBpZDogZWRpdG9yLnBhcmVudC5nZXROZXh0SWQoKSxcbiAgICAgIHBhcmVudDogZWRpdG9yLnBhcmVudCxcbiAgICAgIHVpTWFuYWdlcjogZWRpdG9yLl91aU1hbmFnZXJcbiAgICB9KTtcbiAgICBmYWtlRWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQgPSBlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZDtcbiAgICBmYWtlRWRpdG9yLmRlbGV0ZWQgPSB0cnVlO1xuICAgIGZha2VFZGl0b3IuX3VpTWFuYWdlci5hZGRUb0Fubm90YXRpb25TdG9yYWdlKGZha2VFZGl0b3IpO1xuICB9XG4gIHN0YXRpYyBpbml0aWFsaXplKGwxMG4sIF91aU1hbmFnZXIsIG9wdGlvbnMpIHtcbiAgICBBbm5vdGF0aW9uRWRpdG9yLl9sMTBuUHJvbWlzZSB8fD0gbmV3IE1hcChbXCJwZGZqcy1lZGl0b3ItYWx0LXRleHQtYnV0dG9uLWxhYmVsXCIsIFwicGRmanMtZWRpdG9yLWFsdC10ZXh0LWVkaXQtYnV0dG9uLWxhYmVsXCIsIFwicGRmanMtZWRpdG9yLWFsdC10ZXh0LWRlY29yYXRpdmUtdG9vbHRpcFwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLXRvcExlZnRcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC10b3BNaWRkbGVcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC10b3BSaWdodFwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLW1pZGRsZVJpZ2h0XCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtYm90dG9tUmlnaHRcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC1ib3R0b21NaWRkbGVcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC1ib3R0b21MZWZ0XCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtbWlkZGxlTGVmdFwiXS5tYXAoc3RyID0+IFtzdHIsIGwxMG4uZ2V0KHN0ci5yZXBsYWNlQWxsKC8oW0EtWl0pL2csIGMgPT4gYC0ke2MudG9Mb3dlckNhc2UoKX1gKSldKSk7XG4gICAgaWYgKG9wdGlvbnM/LnN0cmluZ3MpIHtcbiAgICAgIGZvciAoY29uc3Qgc3RyIG9mIG9wdGlvbnMuc3RyaW5ncykge1xuICAgICAgICBBbm5vdGF0aW9uRWRpdG9yLl9sMTBuUHJvbWlzZS5zZXQoc3RyLCBsMTBuLmdldChzdHIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFubm90YXRpb25FZGl0b3IuX2JvcmRlckxpbmVXaWR0aCAhPT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5fYm9yZGVyTGluZVdpZHRoID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1vdXRsaW5lLXdpZHRoXCIpKSB8fCAwO1xuICB9XG4gIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKF90eXBlLCBfdmFsdWUpIHt9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgc3RhdGljIGlzSGFuZGxpbmdNaW1lRm9yUGFzdGluZyhtaW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0YXRpYyBwYXN0ZShpdGVtLCBwYXJlbnQpIHtcbiAgICB1bnJlYWNoYWJsZShcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBnZXQgX2lzRHJhZ2dhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLiNpc0RyYWdnYWJsZTtcbiAgfVxuICBzZXQgX2lzRHJhZ2dhYmxlKHZhbHVlKSB7XG4gICAgdGhpcy4jaXNEcmFnZ2FibGUgPSB2YWx1ZTtcbiAgICB0aGlzLmRpdj8uY2xhc3NMaXN0LnRvZ2dsZShcImRyYWdnYWJsZVwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGlzRW50ZXJIYW5kbGVkKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNlbnRlcigpIHtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgc3dpdGNoICh0aGlzLnBhcmVudFJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB0aGlzLnggLT0gdGhpcy5oZWlnaHQgKiBwYWdlSGVpZ2h0IC8gKHBhZ2VXaWR0aCAqIDIpO1xuICAgICAgICB0aGlzLnkgKz0gdGhpcy53aWR0aCAqIHBhZ2VXaWR0aCAvIChwYWdlSGVpZ2h0ICogMik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHRoaXMueCArPSB0aGlzLndpZHRoIC8gMjtcbiAgICAgICAgdGhpcy55ICs9IHRoaXMuaGVpZ2h0IC8gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgdGhpcy54ICs9IHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodCAvIChwYWdlV2lkdGggKiAyKTtcbiAgICAgICAgdGhpcy55IC09IHRoaXMud2lkdGggKiBwYWdlV2lkdGggLyAocGFnZUhlaWdodCAqIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMueCAtPSB0aGlzLndpZHRoIC8gMjtcbiAgICAgICAgdGhpcy55IC09IHRoaXMuaGVpZ2h0IC8gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICBhZGRDb21tYW5kcyhwYXJhbXMpIHtcbiAgICB0aGlzLl91aU1hbmFnZXIuYWRkQ29tbWFuZHMocGFyYW1zKTtcbiAgfVxuICBnZXQgY3VycmVudExheWVyKCkge1xuICAgIHJldHVybiB0aGlzLl91aU1hbmFnZXIuY3VycmVudExheWVyO1xuICB9XG4gIHNldEluQmFja2dyb3VuZCgpIHtcbiAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSAwO1xuICB9XG4gIHNldEluRm9yZWdyb3VuZCgpIHtcbiAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSB0aGlzLiN6SW5kZXg7XG4gIH1cbiAgc2V0UGFyZW50KHBhcmVudCkge1xuICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gcGFyZW50LnBhZ2VJbmRleDtcbiAgICAgIHRoaXMucGFnZURpbWVuc2lvbnMgPSBwYXJlbnQucGFnZURpbWVuc2lvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI3N0b3BSZXNpemluZygpO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgfVxuICBmb2N1c2luKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9mb2N1c0V2ZW50c0FsbG93ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNoYXNCZWVuQ2xpY2tlZCkge1xuICAgICAgdGhpcy5wYXJlbnQuc2V0U2VsZWN0ZWQodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2hhc0JlZW5DbGlja2VkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGZvY3Vzb3V0KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9mb2N1c0V2ZW50c0FsbG93ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAgIGlmICh0YXJnZXQ/LmNsb3Nlc3QoYCMke3RoaXMuaWR9YCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMucGFyZW50Py5pc011bHRpcGxlU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgfVxuICB9XG4gIGNvbW1pdE9yUmVtb3ZlKCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21taXQoKTtcbiAgICB9XG4gIH1cbiAgY29tbWl0KCkge1xuICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuICB9XG4gIGFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoKSB7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UodGhpcyk7XG4gIH1cbiAgc2V0QXQoeCwgeSwgdHgsIHR5KSB7XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIFt0eCwgdHldID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih0eCwgdHkpO1xuICAgIHRoaXMueCA9ICh4ICsgdHgpIC8gd2lkdGg7XG4gICAgdGhpcy55ID0gKHkgKyB0eSkgLyBoZWlnaHQ7XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICB9XG4gICN0cmFuc2xhdGUoW3dpZHRoLCBoZWlnaHRdLCB4LCB5KSB7XG4gICAgW3gsIHldID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih4LCB5KTtcbiAgICB0aGlzLnggKz0geCAvIHdpZHRoO1xuICAgIHRoaXMueSArPSB5IC8gaGVpZ2h0O1xuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICB0cmFuc2xhdGUoeCwgeSkge1xuICAgIHRoaXMuI3RyYW5zbGF0ZSh0aGlzLnBhcmVudERpbWVuc2lvbnMsIHgsIHkpO1xuICB9XG4gIHRyYW5zbGF0ZUluUGFnZSh4LCB5KSB7XG4gICAgdGhpcy4jaW5pdGlhbFBvc2l0aW9uIHx8PSBbdGhpcy54LCB0aGlzLnldO1xuICAgIHRoaXMuI3RyYW5zbGF0ZSh0aGlzLnBhZ2VEaW1lbnNpb25zLCB4LCB5KTtcbiAgICB0aGlzLmRpdi5zY3JvbGxJbnRvVmlldyh7XG4gICAgICBibG9jazogXCJuZWFyZXN0XCJcbiAgICB9KTtcbiAgfVxuICBkcmFnKHR4LCB0eSkge1xuICAgIHRoaXMuI2luaXRpYWxQb3NpdGlvbiB8fD0gW3RoaXMueCwgdGhpcy55XTtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy54ICs9IHR4IC8gcGFyZW50V2lkdGg7XG4gICAgdGhpcy55ICs9IHR5IC8gcGFyZW50SGVpZ2h0O1xuICAgIGlmICh0aGlzLnBhcmVudCAmJiAodGhpcy54IDwgMCB8fCB0aGlzLnggPiAxIHx8IHRoaXMueSA8IDAgfHwgdGhpcy55ID4gMSkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHRoaXMuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHRoaXMucGFyZW50LmZpbmROZXdQYXJlbnQodGhpcywgeCwgeSkpIHtcbiAgICAgICAgdGhpcy54IC09IE1hdGguZmxvb3IodGhpcy54KTtcbiAgICAgICAgdGhpcy55IC09IE1hdGguZmxvb3IodGhpcy55KTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3QgW2J4LCBieV0gPSB0aGlzLmdldEJhc2VUcmFuc2xhdGlvbigpO1xuICAgIHggKz0gYng7XG4gICAgeSArPSBieTtcbiAgICB0aGlzLmRpdi5zdHlsZS5sZWZ0ID0gYCR7KDEwMCAqIHgpLnRvRml4ZWQoMil9JWA7XG4gICAgdGhpcy5kaXYuc3R5bGUudG9wID0gYCR7KDEwMCAqIHkpLnRvRml4ZWQoMil9JWA7XG4gICAgdGhpcy5kaXYuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgYmxvY2s6IFwibmVhcmVzdFwiXG4gICAgfSk7XG4gIH1cbiAgZ2V0IF9oYXNCZWVuTW92ZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy4jaW5pdGlhbFBvc2l0aW9uICYmICh0aGlzLiNpbml0aWFsUG9zaXRpb25bMF0gIT09IHRoaXMueCB8fCB0aGlzLiNpbml0aWFsUG9zaXRpb25bMV0gIT09IHRoaXMueSk7XG4gIH1cbiAgZ2V0QmFzZVRyYW5zbGF0aW9uKCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBjb25zdCB7XG4gICAgICBfYm9yZGVyTGluZVdpZHRoXG4gICAgfSA9IEFubm90YXRpb25FZGl0b3I7XG4gICAgY29uc3QgeCA9IF9ib3JkZXJMaW5lV2lkdGggLyBwYXJlbnRXaWR0aDtcbiAgICBjb25zdCB5ID0gX2JvcmRlckxpbmVXaWR0aCAvIHBhcmVudEhlaWdodDtcbiAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJldHVybiBbLXgsIHldO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiBbeCwgeV07XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgcmV0dXJuIFt4LCAteV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gWy14LCAteV07XG4gICAgfVxuICB9XG4gIGdldCBfbXVzdEZpeFBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZpeEFuZFNldFBvc2l0aW9uKHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbikge1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICBsZXQge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSB0aGlzO1xuICAgIHdpZHRoICo9IHBhZ2VXaWR0aDtcbiAgICBoZWlnaHQgKj0gcGFnZUhlaWdodDtcbiAgICB4ICo9IHBhZ2VXaWR0aDtcbiAgICB5ICo9IHBhZ2VIZWlnaHQ7XG4gICAgaWYgKHRoaXMuX211c3RGaXhQb3NpdGlvbikge1xuICAgICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VXaWR0aCAtIHdpZHRoLCB4KSk7XG4gICAgICAgICAgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VIZWlnaHQgLSBoZWlnaHQsIHkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZVdpZHRoIC0gaGVpZ2h0LCB4KSk7XG4gICAgICAgICAgeSA9IE1hdGgubWluKHBhZ2VIZWlnaHQsIE1hdGgubWF4KHdpZHRoLCB5KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTgwOlxuICAgICAgICAgIHggPSBNYXRoLm1pbihwYWdlV2lkdGgsIE1hdGgubWF4KHdpZHRoLCB4KSk7XG4gICAgICAgICAgeSA9IE1hdGgubWluKHBhZ2VIZWlnaHQsIE1hdGgubWF4KGhlaWdodCwgeSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICB4ID0gTWF0aC5taW4ocGFnZVdpZHRoLCBNYXRoLm1heChoZWlnaHQsIHgpKTtcbiAgICAgICAgICB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZUhlaWdodCAtIHdpZHRoLCB5KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMueCA9IHggLz0gcGFnZVdpZHRoO1xuICAgIHRoaXMueSA9IHkgLz0gcGFnZUhlaWdodDtcbiAgICBjb25zdCBbYngsIGJ5XSA9IHRoaXMuZ2V0QmFzZVRyYW5zbGF0aW9uKCk7XG4gICAgeCArPSBieDtcbiAgICB5ICs9IGJ5O1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuZGl2O1xuICAgIHN0eWxlLmxlZnQgPSBgJHsoMTAwICogeCkudG9GaXhlZCgyKX0lYDtcbiAgICBzdHlsZS50b3AgPSBgJHsoMTAwICogeSkudG9GaXhlZCgyKX0lYDtcbiAgICB0aGlzLm1vdmVJbkRPTSgpO1xuICB9XG4gIHN0YXRpYyAjcm90YXRlUG9pbnQoeCwgeSwgYW5nbGUpIHtcbiAgICBzd2l0Y2ggKGFuZ2xlKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICByZXR1cm4gW3ksIC14XTtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByZXR1cm4gWy14LCAteV07XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgcmV0dXJuIFsteSwgeF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW3gsIHldO1xuICAgIH1cbiAgfVxuICBzY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIEFubm90YXRpb25FZGl0b3IuI3JvdGF0ZVBvaW50KHgsIHksIHRoaXMucGFyZW50Um90YXRpb24pO1xuICB9XG4gIHBhZ2VUcmFuc2xhdGlvblRvU2NyZWVuKHgsIHkpIHtcbiAgICByZXR1cm4gQW5ub3RhdGlvbkVkaXRvci4jcm90YXRlUG9pbnQoeCwgeSwgMzYwIC0gdGhpcy5wYXJlbnRSb3RhdGlvbik7XG4gIH1cbiAgI2dldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uKSB7XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICByZXR1cm4gWzAsIC1wYWdlV2lkdGggLyBwYWdlSGVpZ2h0LCBwYWdlSGVpZ2h0IC8gcGFnZVdpZHRoLCAwXTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiBbLTEsIDAsIDAsIC0xXTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgICAgICAgIHJldHVybiBbMCwgcGFnZVdpZHRoIC8gcGFnZUhlaWdodCwgLXBhZ2VIZWlnaHQgLyBwYWdlV2lkdGgsIDBdO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gWzEsIDAsIDAsIDFdO1xuICAgIH1cbiAgfVxuICBnZXQgcGFyZW50U2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycy5yZWFsU2NhbGU7XG4gIH1cbiAgZ2V0IHBhcmVudFJvdGF0aW9uKCkge1xuICAgIHJldHVybiAodGhpcy5fdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uICsgdGhpcy5wYWdlUm90YXRpb24pICUgMzYwO1xuICB9XG4gIGdldCBwYXJlbnREaW1lbnNpb25zKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHBhcmVudFNjYWxlLFxuICAgICAgcGFnZURpbWVuc2lvbnM6IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdXG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qgc2NhbGVkV2lkdGggPSBwYWdlV2lkdGggKiBwYXJlbnRTY2FsZTtcbiAgICBjb25zdCBzY2FsZWRIZWlnaHQgPSBwYWdlSGVpZ2h0ICogcGFyZW50U2NhbGU7XG4gICAgcmV0dXJuIHV0aWxfRmVhdHVyZVRlc3QuaXNDU1NSb3VuZFN1cHBvcnRlZCA/IFtNYXRoLnJvdW5kKHNjYWxlZFdpZHRoKSwgTWF0aC5yb3VuZChzY2FsZWRIZWlnaHQpXSA6IFtzY2FsZWRXaWR0aCwgc2NhbGVkSGVpZ2h0XTtcbiAgfVxuICBzZXREaW1zKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy5kaXYuc3R5bGUud2lkdGggPSBgJHsoMTAwICogd2lkdGggLyBwYXJlbnRXaWR0aCkudG9GaXhlZCgyKX0lYDtcbiAgICBpZiAoIXRoaXMuI2tlZXBBc3BlY3RSYXRpbykge1xuICAgICAgdGhpcy5kaXYuc3R5bGUuaGVpZ2h0ID0gYCR7KDEwMCAqIGhlaWdodCAvIHBhcmVudEhlaWdodCkudG9GaXhlZCgyKX0lYDtcbiAgICB9XG4gIH1cbiAgZml4RGltcygpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLmRpdjtcbiAgICBjb25zdCB7XG4gICAgICBoZWlnaHQsXG4gICAgICB3aWR0aFxuICAgIH0gPSBzdHlsZTtcbiAgICBjb25zdCB3aWR0aFBlcmNlbnQgPSB3aWR0aC5lbmRzV2l0aChcIiVcIik7XG4gICAgY29uc3QgaGVpZ2h0UGVyY2VudCA9ICF0aGlzLiNrZWVwQXNwZWN0UmF0aW8gJiYgaGVpZ2h0LmVuZHNXaXRoKFwiJVwiKTtcbiAgICBpZiAod2lkdGhQZXJjZW50ICYmIGhlaWdodFBlcmNlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIGlmICghd2lkdGhQZXJjZW50KSB7XG4gICAgICBzdHlsZS53aWR0aCA9IGAkeygxMDAgKiBwYXJzZUZsb2F0KHdpZHRoKSAvIHBhcmVudFdpZHRoKS50b0ZpeGVkKDIpfSVgO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2tlZXBBc3BlY3RSYXRpbyAmJiAhaGVpZ2h0UGVyY2VudCkge1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gYCR7KDEwMCAqIHBhcnNlRmxvYXQoaGVpZ2h0KSAvIHBhcmVudEhlaWdodCkudG9GaXhlZCgyKX0lYDtcbiAgICB9XG4gIH1cbiAgZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCkge1xuICAgIHJldHVybiBbMCwgMF07XG4gIH1cbiAgI2NyZWF0ZVJlc2l6ZXJzKCkge1xuICAgIGlmICh0aGlzLiNyZXNpemVyc0Rpdikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNyZXNpemVyc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy4jcmVzaXplcnNEaXYuY2xhc3NMaXN0LmFkZChcInJlc2l6ZXJzXCIpO1xuICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLl93aWxsS2VlcEFzcGVjdFJhdGlvID8gW1widG9wTGVmdFwiLCBcInRvcFJpZ2h0XCIsIFwiYm90dG9tUmlnaHRcIiwgXCJib3R0b21MZWZ0XCJdIDogW1widG9wTGVmdFwiLCBcInRvcE1pZGRsZVwiLCBcInRvcFJpZ2h0XCIsIFwibWlkZGxlUmlnaHRcIiwgXCJib3R0b21SaWdodFwiLCBcImJvdHRvbU1pZGRsZVwiLCBcImJvdHRvbUxlZnRcIiwgXCJtaWRkbGVMZWZ0XCJdO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBjbGFzc2VzKSB7XG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdGhpcy4jcmVzaXplcnNEaXYuYXBwZW5kKGRpdik7XG4gICAgICBkaXYuY2xhc3NMaXN0LmFkZChcInJlc2l6ZXJcIiwgbmFtZSk7XG4gICAgICBkaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1yZXNpemVyLW5hbWVcIiwgbmFtZSk7XG4gICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI3Jlc2l6ZXJQb2ludGVyZG93bi5iaW5kKHRoaXMsIG5hbWUpLCB7XG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG4gICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIGRpdi50YWJJbmRleCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLmRpdi5wcmVwZW5kKHRoaXMuI3Jlc2l6ZXJzRGl2KTtcbiAgfVxuICAjcmVzaXplclBvaW50ZXJkb3duKG5hbWUsIGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgZXZlbnQuY3RybEtleSAmJiBpc01hYykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhbHRUZXh0Py50b2dnbGUoZmFsc2UpO1xuICAgIGNvbnN0IGJvdW5kUmVzaXplclBvaW50ZXJtb3ZlID0gdGhpcy4jcmVzaXplclBvaW50ZXJtb3ZlLmJpbmQodGhpcywgbmFtZSk7XG4gICAgY29uc3Qgc2F2ZWREcmFnZ2FibGUgPSB0aGlzLl9pc0RyYWdnYWJsZTtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGNvbnN0IHBvaW50ZXJNb3ZlT3B0aW9ucyA9IHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgc2lnbmFsXG4gICAgfTtcbiAgICB0aGlzLnBhcmVudC50b2dnbGVQb2ludGVyRXZlbnRzKGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIGJvdW5kUmVzaXplclBvaW50ZXJtb3ZlLCBwb2ludGVyTW92ZU9wdGlvbnMpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgY29uc3Qgc2F2ZWRYID0gdGhpcy54O1xuICAgIGNvbnN0IHNhdmVkWSA9IHRoaXMueTtcbiAgICBjb25zdCBzYXZlZFdpZHRoID0gdGhpcy53aWR0aDtcbiAgICBjb25zdCBzYXZlZEhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgIGNvbnN0IHNhdmVkUGFyZW50Q3Vyc29yID0gdGhpcy5wYXJlbnQuZGl2LnN0eWxlLmN1cnNvcjtcbiAgICBjb25zdCBzYXZlZEN1cnNvciA9IHRoaXMuZGl2LnN0eWxlLmN1cnNvcjtcbiAgICB0aGlzLmRpdi5zdHlsZS5jdXJzb3IgPSB0aGlzLnBhcmVudC5kaXYuc3R5bGUuY3Vyc29yID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZXZlbnQudGFyZ2V0KS5jdXJzb3I7XG4gICAgY29uc3QgcG9pbnRlclVwQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLnBhcmVudC50b2dnbGVQb2ludGVyRXZlbnRzKHRydWUpO1xuICAgICAgdGhpcy4jYWx0VGV4dD8udG9nZ2xlKHRydWUpO1xuICAgICAgdGhpcy5faXNEcmFnZ2FibGUgPSBzYXZlZERyYWdnYWJsZTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJVcENhbGxiYWNrKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVyVXBDYWxsYmFjayk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIGJvdW5kUmVzaXplclBvaW50ZXJtb3ZlLCBwb2ludGVyTW92ZU9wdGlvbnMpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51KTtcbiAgICAgIHRoaXMucGFyZW50LmRpdi5zdHlsZS5jdXJzb3IgPSBzYXZlZFBhcmVudEN1cnNvcjtcbiAgICAgIHRoaXMuZGl2LnN0eWxlLmN1cnNvciA9IHNhdmVkQ3Vyc29yO1xuICAgICAgdGhpcy4jYWRkUmVzaXplVG9VbmRvU3RhY2soc2F2ZWRYLCBzYXZlZFksIHNhdmVkV2lkdGgsIHNhdmVkSGVpZ2h0KTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJVcENhbGxiYWNrLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgcG9pbnRlclVwQ2FsbGJhY2ssIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gICNhZGRSZXNpemVUb1VuZG9TdGFjayhzYXZlZFgsIHNhdmVkWSwgc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpIHtcbiAgICBjb25zdCBuZXdYID0gdGhpcy54O1xuICAgIGNvbnN0IG5ld1kgPSB0aGlzLnk7XG4gICAgY29uc3QgbmV3V2lkdGggPSB0aGlzLndpZHRoO1xuICAgIGNvbnN0IG5ld0hlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgIGlmIChuZXdYID09PSBzYXZlZFggJiYgbmV3WSA9PT0gc2F2ZWRZICYmIG5ld1dpZHRoID09PSBzYXZlZFdpZHRoICYmIG5ld0hlaWdodCA9PT0gc2F2ZWRIZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy53aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgICAgdGhpcy54ID0gbmV3WDtcbiAgICAgICAgdGhpcy55ID0gbmV3WTtcbiAgICAgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICB0aGlzLnNldERpbXMocGFyZW50V2lkdGggKiBuZXdXaWR0aCwgcGFyZW50SGVpZ2h0ICogbmV3SGVpZ2h0KTtcbiAgICAgICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgdGhpcy53aWR0aCA9IHNhdmVkV2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gc2F2ZWRIZWlnaHQ7XG4gICAgICAgIHRoaXMueCA9IHNhdmVkWDtcbiAgICAgICAgdGhpcy55ID0gc2F2ZWRZO1xuICAgICAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgIHRoaXMuc2V0RGltcyhwYXJlbnRXaWR0aCAqIHNhdmVkV2lkdGgsIHBhcmVudEhlaWdodCAqIHNhdmVkSGVpZ2h0KTtcbiAgICAgICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIG11c3RFeGVjOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgI3Jlc2l6ZXJQb2ludGVybW92ZShuYW1lLCBldmVudCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBjb25zdCBzYXZlZFggPSB0aGlzLng7XG4gICAgY29uc3Qgc2F2ZWRZID0gdGhpcy55O1xuICAgIGNvbnN0IHNhdmVkV2lkdGggPSB0aGlzLndpZHRoO1xuICAgIGNvbnN0IHNhdmVkSGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgY29uc3QgbWluV2lkdGggPSBBbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFIC8gcGFyZW50V2lkdGg7XG4gICAgY29uc3QgbWluSGVpZ2h0ID0gQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSAvIHBhcmVudEhlaWdodDtcbiAgICBjb25zdCByb3VuZCA9IHggPT4gTWF0aC5yb3VuZCh4ICogMTAwMDApIC8gMTAwMDA7XG4gICAgY29uc3Qgcm90YXRpb25NYXRyaXggPSB0aGlzLiNnZXRSb3RhdGlvbk1hdHJpeCh0aGlzLnJvdGF0aW9uKTtcbiAgICBjb25zdCB0cmFuc2YgPSAoeCwgeSkgPT4gW3JvdGF0aW9uTWF0cml4WzBdICogeCArIHJvdGF0aW9uTWF0cml4WzJdICogeSwgcm90YXRpb25NYXRyaXhbMV0gKiB4ICsgcm90YXRpb25NYXRyaXhbM10gKiB5XTtcbiAgICBjb25zdCBpbnZSb3RhdGlvbk1hdHJpeCA9IHRoaXMuI2dldFJvdGF0aW9uTWF0cml4KDM2MCAtIHRoaXMucm90YXRpb24pO1xuICAgIGNvbnN0IGludlRyYW5zZiA9ICh4LCB5KSA9PiBbaW52Um90YXRpb25NYXRyaXhbMF0gKiB4ICsgaW52Um90YXRpb25NYXRyaXhbMl0gKiB5LCBpbnZSb3RhdGlvbk1hdHJpeFsxXSAqIHggKyBpbnZSb3RhdGlvbk1hdHJpeFszXSAqIHldO1xuICAgIGxldCBnZXRQb2ludDtcbiAgICBsZXQgZ2V0T3Bwb3NpdGU7XG4gICAgbGV0IGlzRGlhZ29uYWwgPSBmYWxzZTtcbiAgICBsZXQgaXNIb3Jpem9udGFsID0gZmFsc2U7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlIFwidG9wTGVmdFwiOlxuICAgICAgICBpc0RpYWdvbmFsID0gdHJ1ZTtcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gWzAsIDBdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbdywgaF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvcE1pZGRsZVwiOlxuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbdyAvIDIsIDBdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbdyAvIDIsIGhdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b3BSaWdodFwiOlxuICAgICAgICBpc0RpYWdvbmFsID0gdHJ1ZTtcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gW3csIDBdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbMCwgaF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1pZGRsZVJpZ2h0XCI6XG4gICAgICAgIGlzSG9yaXpvbnRhbCA9IHRydWU7XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFt3LCBoIC8gMl07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFswLCBoIC8gMl07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJvdHRvbVJpZ2h0XCI6XG4gICAgICAgIGlzRGlhZ29uYWwgPSB0cnVlO1xuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbdywgaF07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFswLCAwXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYm90dG9tTWlkZGxlXCI6XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFt3IC8gMiwgaF07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFt3IC8gMiwgMF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJvdHRvbUxlZnRcIjpcbiAgICAgICAgaXNEaWFnb25hbCA9IHRydWU7XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFswLCBoXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gW3csIDBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJtaWRkbGVMZWZ0XCI6XG4gICAgICAgIGlzSG9yaXpvbnRhbCA9IHRydWU7XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFswLCBoIC8gMl07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFt3LCBoIC8gMl07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBwb2ludCA9IGdldFBvaW50KHNhdmVkV2lkdGgsIHNhdmVkSGVpZ2h0KTtcbiAgICBjb25zdCBvcHBvc2l0ZVBvaW50ID0gZ2V0T3Bwb3NpdGUoc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpO1xuICAgIGxldCB0cmFuc2ZPcHBvc2l0ZVBvaW50ID0gdHJhbnNmKC4uLm9wcG9zaXRlUG9pbnQpO1xuICAgIGNvbnN0IG9wcG9zaXRlWCA9IHJvdW5kKHNhdmVkWCArIHRyYW5zZk9wcG9zaXRlUG9pbnRbMF0pO1xuICAgIGNvbnN0IG9wcG9zaXRlWSA9IHJvdW5kKHNhdmVkWSArIHRyYW5zZk9wcG9zaXRlUG9pbnRbMV0pO1xuICAgIGxldCByYXRpb1ggPSAxO1xuICAgIGxldCByYXRpb1kgPSAxO1xuICAgIGxldCBbZGVsdGFYLCBkZWx0YVldID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbihldmVudC5tb3ZlbWVudFgsIGV2ZW50Lm1vdmVtZW50WSk7XG4gICAgW2RlbHRhWCwgZGVsdGFZXSA9IGludlRyYW5zZihkZWx0YVggLyBwYXJlbnRXaWR0aCwgZGVsdGFZIC8gcGFyZW50SGVpZ2h0KTtcbiAgICBpZiAoaXNEaWFnb25hbCkge1xuICAgICAgY29uc3Qgb2xkRGlhZyA9IE1hdGguaHlwb3Qoc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpO1xuICAgICAgcmF0aW9YID0gcmF0aW9ZID0gTWF0aC5tYXgoTWF0aC5taW4oTWF0aC5oeXBvdChvcHBvc2l0ZVBvaW50WzBdIC0gcG9pbnRbMF0gLSBkZWx0YVgsIG9wcG9zaXRlUG9pbnRbMV0gLSBwb2ludFsxXSAtIGRlbHRhWSkgLyBvbGREaWFnLCAxIC8gc2F2ZWRXaWR0aCwgMSAvIHNhdmVkSGVpZ2h0KSwgbWluV2lkdGggLyBzYXZlZFdpZHRoLCBtaW5IZWlnaHQgLyBzYXZlZEhlaWdodCk7XG4gICAgfSBlbHNlIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgIHJhdGlvWCA9IE1hdGgubWF4KG1pbldpZHRoLCBNYXRoLm1pbigxLCBNYXRoLmFicyhvcHBvc2l0ZVBvaW50WzBdIC0gcG9pbnRbMF0gLSBkZWx0YVgpKSkgLyBzYXZlZFdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICByYXRpb1kgPSBNYXRoLm1heChtaW5IZWlnaHQsIE1hdGgubWluKDEsIE1hdGguYWJzKG9wcG9zaXRlUG9pbnRbMV0gLSBwb2ludFsxXSAtIGRlbHRhWSkpKSAvIHNhdmVkSGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBuZXdXaWR0aCA9IHJvdW5kKHNhdmVkV2lkdGggKiByYXRpb1gpO1xuICAgIGNvbnN0IG5ld0hlaWdodCA9IHJvdW5kKHNhdmVkSGVpZ2h0ICogcmF0aW9ZKTtcbiAgICB0cmFuc2ZPcHBvc2l0ZVBvaW50ID0gdHJhbnNmKC4uLmdldE9wcG9zaXRlKG5ld1dpZHRoLCBuZXdIZWlnaHQpKTtcbiAgICBjb25zdCBuZXdYID0gb3Bwb3NpdGVYIC0gdHJhbnNmT3Bwb3NpdGVQb2ludFswXTtcbiAgICBjb25zdCBuZXdZID0gb3Bwb3NpdGVZIC0gdHJhbnNmT3Bwb3NpdGVQb2ludFsxXTtcbiAgICB0aGlzLndpZHRoID0gbmV3V2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgdGhpcy54ID0gbmV3WDtcbiAgICB0aGlzLnkgPSBuZXdZO1xuICAgIHRoaXMuc2V0RGltcyhwYXJlbnRXaWR0aCAqIG5ld1dpZHRoLCBwYXJlbnRIZWlnaHQgKiBuZXdIZWlnaHQpO1xuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICBhbHRUZXh0RmluaXNoKCkge1xuICAgIHRoaXMuI2FsdFRleHQ/LmZpbmlzaCgpO1xuICB9XG4gIGFzeW5jIGFkZEVkaXRUb29sYmFyKCkge1xuICAgIGlmICh0aGlzLiNlZGl0VG9vbGJhciB8fCB0aGlzLiNpc0luRWRpdE1vZGUpIHtcbiAgICAgIHJldHVybiB0aGlzLiNlZGl0VG9vbGJhcjtcbiAgICB9XG4gICAgdGhpcy4jZWRpdFRvb2xiYXIgPSBuZXcgRWRpdG9yVG9vbGJhcih0aGlzKTtcbiAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy4jZWRpdFRvb2xiYXIucmVuZGVyKCkpO1xuICAgIGlmICh0aGlzLiNhbHRUZXh0KSB7XG4gICAgICB0aGlzLiNlZGl0VG9vbGJhci5hZGRBbHRUZXh0QnV0dG9uKGF3YWl0IHRoaXMuI2FsdFRleHQucmVuZGVyKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jZWRpdFRvb2xiYXI7XG4gIH1cbiAgcmVtb3ZlRWRpdFRvb2xiYXIoKSB7XG4gICAgaWYgKCF0aGlzLiNlZGl0VG9vbGJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNlZGl0VG9vbGJhci5yZW1vdmUoKTtcbiAgICB0aGlzLiNlZGl0VG9vbGJhciA9IG51bGw7XG4gICAgdGhpcy4jYWx0VGV4dD8uZGVzdHJveSgpO1xuICB9XG4gIGdldENsaWVudERpbWVuc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB9XG4gIGFzeW5jIGFkZEFsdFRleHRCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMuI2FsdFRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgQWx0VGV4dC5pbml0aWFsaXplKEFubm90YXRpb25FZGl0b3IuX2wxMG5Qcm9taXNlKTtcbiAgICB0aGlzLiNhbHRUZXh0ID0gbmV3IEFsdFRleHQodGhpcyk7XG4gICAgaWYgKHRoaXMuI2FjY2Vzc2liaWxpdHlEYXRhKSB7XG4gICAgICB0aGlzLiNhbHRUZXh0LmRhdGEgPSB0aGlzLiNhY2Nlc3NpYmlsaXR5RGF0YTtcbiAgICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlEYXRhID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5hZGRFZGl0VG9vbGJhcigpO1xuICB9XG4gIGdldCBhbHRUZXh0RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy4jYWx0VGV4dD8uZGF0YTtcbiAgfVxuICBzZXQgYWx0VGV4dERhdGEoZGF0YSkge1xuICAgIGlmICghdGhpcy4jYWx0VGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhbHRUZXh0LmRhdGEgPSBkYXRhO1xuICB9XG4gIGhhc0FsdFRleHQoKSB7XG4gICAgcmV0dXJuICF0aGlzLiNhbHRUZXh0Py5pc0VtcHR5KCk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXRvci1yb3RhdGlvblwiLCAoMzYwIC0gdGhpcy5yb3RhdGlvbikgJSAzNjApO1xuICAgIHRoaXMuZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZTtcbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLmlkKTtcbiAgICB0aGlzLmRpdi50YWJJbmRleCA9IHRoaXMuI2Rpc2FibGVkID8gLTEgOiAwO1xuICAgIGlmICghdGhpcy5faXNWaXNpYmxlKSB7XG4gICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIH1cbiAgICB0aGlzLnNldEluRm9yZWdyb3VuZCgpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIHRoaXMuI2JvdW5kRm9jdXNpbiwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2JvdW5kRm9jdXNvdXQsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBpZiAodGhpcy5wYXJlbnRSb3RhdGlvbiAlIDE4MCAhPT0gMCkge1xuICAgICAgdGhpcy5kaXYuc3R5bGUubWF4V2lkdGggPSBgJHsoMTAwICogcGFyZW50SGVpZ2h0IC8gcGFyZW50V2lkdGgpLnRvRml4ZWQoMil9JWA7XG4gICAgICB0aGlzLmRpdi5zdHlsZS5tYXhIZWlnaHQgPSBgJHsoMTAwICogcGFyZW50V2lkdGggLyBwYXJlbnRIZWlnaHQpLnRvRml4ZWQoMil9JWA7XG4gICAgfVxuICAgIGNvbnN0IFt0eCwgdHldID0gdGhpcy5nZXRJbml0aWFsVHJhbnNsYXRpb24oKTtcbiAgICB0aGlzLnRyYW5zbGF0ZSh0eCwgdHkpO1xuICAgIGJpbmRFdmVudHModGhpcywgdGhpcy5kaXYsIFtcInBvaW50ZXJkb3duXCJdKTtcbiAgICByZXR1cm4gdGhpcy5kaXY7XG4gIH1cbiAgcG9pbnRlcmRvd24oZXZlbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgZXZlbnQuY3RybEtleSAmJiBpc01hYykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaGFzQmVlbkNsaWNrZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9pc0RyYWdnYWJsZSkge1xuICAgICAgdGhpcy4jc2V0VXBEcmFnU2Vzc2lvbihldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3NlbGVjdE9uUG9pbnRlckV2ZW50KGV2ZW50KTtcbiAgfVxuICAjc2VsZWN0T25Qb2ludGVyRXZlbnQoZXZlbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGlmIChldmVudC5jdHJsS2V5ICYmICFpc01hYyB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5tZXRhS2V5ICYmIGlzTWFjKSB7XG4gICAgICB0aGlzLnBhcmVudC50b2dnbGVTZWxlY3RlZCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJlbnQuc2V0U2VsZWN0ZWQodGhpcyk7XG4gICAgfVxuICB9XG4gICNzZXRVcERyYWdTZXNzaW9uKGV2ZW50KSB7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IHRoaXMuX3VpTWFuYWdlci5pc1NlbGVjdGVkKHRoaXMpO1xuICAgIHRoaXMuX3VpTWFuYWdlci5zZXRVcERyYWdTZXNzaW9uKCk7XG4gICAgbGV0IHBvaW50ZXJNb3ZlT3B0aW9ucywgcG9pbnRlck1vdmVDYWxsYmFjaztcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcIm1vdmluZ1wiKTtcbiAgICAgIHBvaW50ZXJNb3ZlT3B0aW9ucyA9IHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgc2lnbmFsXG4gICAgICB9O1xuICAgICAgdGhpcy4jcHJldkRyYWdYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIHRoaXMuI3ByZXZEcmFnWSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBwb2ludGVyTW92ZUNhbGxiYWNrID0gZSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBjbGllbnRYOiB4LFxuICAgICAgICAgIGNsaWVudFk6IHlcbiAgICAgICAgfSA9IGU7XG4gICAgICAgIGNvbnN0IFt0eCwgdHldID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih4IC0gdGhpcy4jcHJldkRyYWdYLCB5IC0gdGhpcy4jcHJldkRyYWdZKTtcbiAgICAgICAgdGhpcy4jcHJldkRyYWdYID0geDtcbiAgICAgICAgdGhpcy4jcHJldkRyYWdZID0geTtcbiAgICAgICAgdGhpcy5fdWlNYW5hZ2VyLmRyYWdTZWxlY3RlZEVkaXRvcnModHgsIHR5KTtcbiAgICAgIH07XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHBvaW50ZXJNb3ZlQ2FsbGJhY2ssIHBvaW50ZXJNb3ZlT3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbnN0IHBvaW50ZXJVcENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlclVwQ2FsbGJhY2spO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJVcENhbGxiYWNrKTtcbiAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJtb3ZpbmdcIik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgcG9pbnRlck1vdmVDYWxsYmFjaywgcG9pbnRlck1vdmVPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI2hhc0JlZW5DbGlja2VkID0gZmFsc2U7XG4gICAgICBpZiAoIXRoaXMuX3VpTWFuYWdlci5lbmREcmFnU2Vzc2lvbigpKSB7XG4gICAgICAgIHRoaXMuI3NlbGVjdE9uUG9pbnRlckV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJVcENhbGxiYWNrLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgcG9pbnRlclVwQ2FsbGJhY2ssIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gIG1vdmVJbkRPTSgpIHtcbiAgICBpZiAodGhpcy4jbW92ZUluRE9NVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI21vdmVJbkRPTVRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLiNtb3ZlSW5ET01UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiNtb3ZlSW5ET01UaW1lb3V0ID0gbnVsbDtcbiAgICAgIHRoaXMucGFyZW50Py5tb3ZlRWRpdG9ySW5ET00odGhpcyk7XG4gICAgfSwgMCk7XG4gIH1cbiAgX3NldFBhcmVudEFuZFBvc2l0aW9uKHBhcmVudCwgeCwgeSkge1xuICAgIHBhcmVudC5jaGFuZ2VQYXJlbnQodGhpcyk7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICBnZXRSZWN0KHR4LCB0eSwgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uKSB7XG4gICAgY29uc3Qgc2NhbGUgPSB0aGlzLnBhcmVudFNjYWxlO1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICBjb25zdCBbcGFnZVgsIHBhZ2VZXSA9IHRoaXMucGFnZVRyYW5zbGF0aW9uO1xuICAgIGNvbnN0IHNoaWZ0WCA9IHR4IC8gc2NhbGU7XG4gICAgY29uc3Qgc2hpZnRZID0gdHkgLyBzY2FsZTtcbiAgICBjb25zdCB4ID0gdGhpcy54ICogcGFnZVdpZHRoO1xuICAgIGNvbnN0IHkgPSB0aGlzLnkgKiBwYWdlSGVpZ2h0O1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aCAqIHBhZ2VXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodCAqIHBhZ2VIZWlnaHQ7XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gW3ggKyBzaGlmdFggKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgLSBzaGlmdFkgLSBoZWlnaHQgKyBwYWdlWSwgeCArIHNoaWZ0WCArIHdpZHRoICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5IC0gc2hpZnRZICsgcGFnZVldO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIFt4ICsgc2hpZnRZICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5ICsgc2hpZnRYICsgcGFnZVksIHggKyBzaGlmdFkgKyBoZWlnaHQgKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgKyBzaGlmdFggKyB3aWR0aCArIHBhZ2VZXTtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByZXR1cm4gW3ggLSBzaGlmdFggLSB3aWR0aCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSArIHNoaWZ0WSArIHBhZ2VZLCB4IC0gc2hpZnRYICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5ICsgc2hpZnRZICsgaGVpZ2h0ICsgcGFnZVldO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJldHVybiBbeCAtIHNoaWZ0WSAtIGhlaWdodCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSAtIHNoaWZ0WCAtIHdpZHRoICsgcGFnZVksIHggLSBzaGlmdFkgKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgLSBzaGlmdFggKyBwYWdlWV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uXCIpO1xuICAgIH1cbiAgfVxuICBnZXRSZWN0SW5DdXJyZW50Q29vcmRzKHJlY3QsIHBhZ2VIZWlnaHQpIHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gcmVjdDtcbiAgICBjb25zdCB3aWR0aCA9IHgyIC0geDE7XG4gICAgY29uc3QgaGVpZ2h0ID0geTIgLSB5MTtcbiAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIFt4MSwgcGFnZUhlaWdodCAtIHkyLCB3aWR0aCwgaGVpZ2h0XTtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJldHVybiBbeDEsIHBhZ2VIZWlnaHQgLSB5MSwgaGVpZ2h0LCB3aWR0aF07XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIFt4MiwgcGFnZUhlaWdodCAtIHkxLCB3aWR0aCwgaGVpZ2h0XTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4gW3gyLCBwYWdlSGVpZ2h0IC0geTIsIGhlaWdodCwgd2lkdGhdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcbiAgICB9XG4gIH1cbiAgb25jZUFkZGVkKCkge31cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZW5hYmxlRWRpdE1vZGUoKSB7XG4gICAgdGhpcy4jaXNJbkVkaXRNb2RlID0gdHJ1ZTtcbiAgfVxuICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgdGhpcy4jaXNJbkVkaXRNb2RlID0gZmFsc2U7XG4gIH1cbiAgaXNJbkVkaXRNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLiNpc0luRWRpdE1vZGU7XG4gIH1cbiAgc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZDtcbiAgfVxuICBuZWVkc1RvQmVSZWJ1aWx0KCkge1xuICAgIHJldHVybiB0aGlzLmRpdiAmJiAhdGhpcy5pc0F0dGFjaGVkVG9ET007XG4gIH1cbiAgcmVidWlsZCgpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICB0aGlzLmRpdj8uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgdGhpcy4jYm91bmRGb2N1c2luLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmRpdj8uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2JvdW5kRm9jdXNvdXQsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gIHJvdGF0ZShfYW5nbGUpIHt9XG4gIHNlcmlhbGl6ZShpc0ZvckNvcHlpbmcgPSBmYWxzZSwgY29udGV4dCA9IG51bGwpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFuIGVkaXRvciBtdXN0IGJlIHNlcmlhbGl6YWJsZVwiKTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBjb25zdCBlZGl0b3IgPSBuZXcgdGhpcy5wcm90b3R5cGUuY29uc3RydWN0b3Ioe1xuICAgICAgcGFyZW50LFxuICAgICAgaWQ6IHBhcmVudC5nZXROZXh0SWQoKSxcbiAgICAgIHVpTWFuYWdlclxuICAgIH0pO1xuICAgIGVkaXRvci5yb3RhdGlvbiA9IGRhdGEucm90YXRpb247XG4gICAgZWRpdG9yLiNhY2Nlc3NpYmlsaXR5RGF0YSA9IGRhdGEuYWNjZXNzaWJpbGl0eURhdGE7XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSBlZGl0b3IucGFnZURpbWVuc2lvbnM7XG4gICAgY29uc3QgW3gsIHksIHdpZHRoLCBoZWlnaHRdID0gZWRpdG9yLmdldFJlY3RJbkN1cnJlbnRDb29yZHMoZGF0YS5yZWN0LCBwYWdlSGVpZ2h0KTtcbiAgICBlZGl0b3IueCA9IHggLyBwYWdlV2lkdGg7XG4gICAgZWRpdG9yLnkgPSB5IC8gcGFnZUhlaWdodDtcbiAgICBlZGl0b3Iud2lkdGggPSB3aWR0aCAvIHBhZ2VXaWR0aDtcbiAgICBlZGl0b3IuaGVpZ2h0ID0gaGVpZ2h0IC8gcGFnZUhlaWdodDtcbiAgICByZXR1cm4gZWRpdG9yO1xuICB9XG4gIGdldCBoYXNCZWVuTW9kaWZpZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkICYmICh0aGlzLmRlbGV0ZWQgfHwgdGhpcy5zZXJpYWxpemUoKSAhPT0gbnVsbCk7XG4gIH1cbiAgcmVtb3ZlKCkge1xuICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIHRoaXMuI2JvdW5kRm9jdXNpbik7XG4gICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2JvdW5kRm9jdXNvdXQpO1xuICAgIGlmICghdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMuY29tbWl0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91aU1hbmFnZXIucmVtb3ZlRWRpdG9yKHRoaXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbW92ZUluRE9NVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI21vdmVJbkRPTVRpbWVvdXQpO1xuICAgICAgdGhpcy4jbW92ZUluRE9NVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuI3N0b3BSZXNpemluZygpO1xuICAgIHRoaXMucmVtb3ZlRWRpdFRvb2xiYXIoKTtcbiAgICBpZiAodGhpcy4jdGVsZW1ldHJ5VGltZW91dHMpIHtcbiAgICAgIGZvciAoY29uc3QgdGltZW91dCBvZiB0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cy52YWx1ZXMoKSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB9XG4gICAgICB0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgfVxuICBnZXQgaXNSZXNpemFibGUoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1ha2VSZXNpemFibGUoKSB7XG4gICAgaWYgKHRoaXMuaXNSZXNpemFibGUpIHtcbiAgICAgIHRoaXMuI2NyZWF0ZVJlc2l6ZXJzKCk7XG4gICAgICB0aGlzLiNyZXNpemVyc0Rpdi5jbGFzc0xpc3QucmVtb3ZlKFwiaGlkZGVuXCIpO1xuICAgICAgYmluZEV2ZW50cyh0aGlzLCB0aGlzLmRpdiwgW1wia2V5ZG93blwiXSk7XG4gICAgfVxuICB9XG4gIGdldCB0b29sYmFyUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAga2V5ZG93bihldmVudCkge1xuICAgIGlmICghdGhpcy5pc1Jlc2l6YWJsZSB8fCBldmVudC50YXJnZXQgIT09IHRoaXMuZGl2IHx8IGV2ZW50LmtleSAhPT0gXCJFbnRlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3VpTWFuYWdlci5zZXRTZWxlY3RlZCh0aGlzKTtcbiAgICB0aGlzLiNzYXZlZERpbWVuc2lvbnMgPSB7XG4gICAgICBzYXZlZFg6IHRoaXMueCxcbiAgICAgIHNhdmVkWTogdGhpcy55LFxuICAgICAgc2F2ZWRXaWR0aDogdGhpcy53aWR0aCxcbiAgICAgIHNhdmVkSGVpZ2h0OiB0aGlzLmhlaWdodFxuICAgIH07XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLiNyZXNpemVyc0Rpdi5jaGlsZHJlbjtcbiAgICBpZiAoIXRoaXMuI2FsbFJlc2l6ZXJEaXZzKSB7XG4gICAgICB0aGlzLiNhbGxSZXNpemVyRGl2cyA9IEFycmF5LmZyb20oY2hpbGRyZW4pO1xuICAgICAgY29uc3QgYm91bmRSZXNpemVyS2V5ZG93biA9IHRoaXMuI3Jlc2l6ZXJLZXlkb3duLmJpbmQodGhpcyk7XG4gICAgICBjb25zdCBib3VuZFJlc2l6ZXJCbHVyID0gdGhpcy4jcmVzaXplckJsdXIuYmluZCh0aGlzKTtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgICAgZm9yIChjb25zdCBkaXYgb2YgdGhpcy4jYWxsUmVzaXplckRpdnMpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGRpdi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXJlc2l6ZXItbmFtZVwiKTtcbiAgICAgICAgZGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJzcGluYnV0dG9uXCIpO1xuICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgYm91bmRSZXNpemVyS2V5ZG93biwge1xuICAgICAgICAgIHNpZ25hbFxuICAgICAgICB9KTtcbiAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGJvdW5kUmVzaXplckJsdXIsIHtcbiAgICAgICAgICBzaWduYWxcbiAgICAgICAgfSk7XG4gICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy4jcmVzaXplckZvY3VzLmJpbmQodGhpcywgbmFtZSksIHtcbiAgICAgICAgICBzaWduYWxcbiAgICAgICAgfSk7XG4gICAgICAgIEFubm90YXRpb25FZGl0b3IuX2wxMG5Qcm9taXNlLmdldChgcGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtJHtuYW1lfWApLnRoZW4obXNnID0+IGRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG1zZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuI2FsbFJlc2l6ZXJEaXZzWzBdO1xuICAgIGxldCBmaXJzdFBvc2l0aW9uID0gMDtcbiAgICBmb3IgKGNvbnN0IGRpdiBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKGRpdiA9PT0gZmlyc3QpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBmaXJzdFBvc2l0aW9uKys7XG4gICAgfVxuICAgIGNvbnN0IG5leHRGaXJzdFBvc2l0aW9uID0gKDM2MCAtIHRoaXMucm90YXRpb24gKyB0aGlzLnBhcmVudFJvdGF0aW9uKSAlIDM2MCAvIDkwICogKHRoaXMuI2FsbFJlc2l6ZXJEaXZzLmxlbmd0aCAvIDQpO1xuICAgIGlmIChuZXh0Rmlyc3RQb3NpdGlvbiAhPT0gZmlyc3RQb3NpdGlvbikge1xuICAgICAgaWYgKG5leHRGaXJzdFBvc2l0aW9uIDwgZmlyc3RQb3NpdGlvbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpcnN0UG9zaXRpb24gLSBuZXh0Rmlyc3RQb3NpdGlvbjsgaSsrKSB7XG4gICAgICAgICAgdGhpcy4jcmVzaXplcnNEaXYuYXBwZW5kKHRoaXMuI3Jlc2l6ZXJzRGl2LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5leHRGaXJzdFBvc2l0aW9uID4gZmlyc3RQb3NpdGlvbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5leHRGaXJzdFBvc2l0aW9uIC0gZmlyc3RQb3NpdGlvbjsgaSsrKSB7XG4gICAgICAgICAgdGhpcy4jcmVzaXplcnNEaXYuZmlyc3RDaGlsZC5iZWZvcmUodGhpcy4jcmVzaXplcnNEaXYubGFzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICBjb25zdCBkaXYgPSB0aGlzLiNhbGxSZXNpemVyRGl2c1tpKytdO1xuICAgICAgICBjb25zdCBuYW1lID0gZGl2LmdldEF0dHJpYnV0ZShcImRhdGEtcmVzaXplci1uYW1lXCIpO1xuICAgICAgICBBbm5vdGF0aW9uRWRpdG9yLl9sMTBuUHJvbWlzZS5nZXQoYHBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLSR7bmFtZX1gKS50aGVuKG1zZyA9PiBjaGlsZC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG1zZykpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNzZXRSZXNpemVyVGFiSW5kZXgoMCk7XG4gICAgdGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkID0gdHJ1ZTtcbiAgICB0aGlzLiNyZXNpemVyc0Rpdi5maXJzdENoaWxkLmZvY3VzKHtcbiAgICAgIGZvY3VzVmlzaWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgI3Jlc2l6ZXJLZXlkb3duKGV2ZW50KSB7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5fcmVzaXplcktleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIGV2ZW50KTtcbiAgfVxuICAjcmVzaXplckJsdXIoZXZlbnQpIHtcbiAgICBpZiAodGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQ/LnBhcmVudE5vZGUgIT09IHRoaXMuI3Jlc2l6ZXJzRGl2KSB7XG4gICAgICB0aGlzLiNzdG9wUmVzaXppbmcoKTtcbiAgICB9XG4gIH1cbiAgI3Jlc2l6ZXJGb2N1cyhuYW1lKSB7XG4gICAgdGhpcy4jZm9jdXNlZFJlc2l6ZXJOYW1lID0gdGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkID8gbmFtZSA6IFwiXCI7XG4gIH1cbiAgI3NldFJlc2l6ZXJUYWJJbmRleCh2YWx1ZSkge1xuICAgIGlmICghdGhpcy4jYWxsUmVzaXplckRpdnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXYgb2YgdGhpcy4jYWxsUmVzaXplckRpdnMpIHtcbiAgICAgIGRpdi50YWJJbmRleCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBfcmVzaXplV2l0aEtleWJvYXJkKHgsIHkpIHtcbiAgICBpZiAoIXRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNyZXNpemVyUG9pbnRlcm1vdmUodGhpcy4jZm9jdXNlZFJlc2l6ZXJOYW1lLCB7XG4gICAgICBtb3ZlbWVudFg6IHgsXG4gICAgICBtb3ZlbWVudFk6IHlcbiAgICB9KTtcbiAgfVxuICAjc3RvcFJlc2l6aW5nKCkge1xuICAgIHRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZCA9IGZhbHNlO1xuICAgIHRoaXMuI3NldFJlc2l6ZXJUYWJJbmRleCgtMSk7XG4gICAgaWYgKHRoaXMuI3NhdmVkRGltZW5zaW9ucykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzYXZlZFgsXG4gICAgICAgIHNhdmVkWSxcbiAgICAgICAgc2F2ZWRXaWR0aCxcbiAgICAgICAgc2F2ZWRIZWlnaHRcbiAgICAgIH0gPSB0aGlzLiNzYXZlZERpbWVuc2lvbnM7XG4gICAgICB0aGlzLiNhZGRSZXNpemVUb1VuZG9TdGFjayhzYXZlZFgsIHNhdmVkWSwgc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpO1xuICAgICAgdGhpcy4jc2F2ZWREaW1lbnNpb25zID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgX3N0b3BSZXNpemluZ1dpdGhLZXlib2FyZCgpIHtcbiAgICB0aGlzLiNzdG9wUmVzaXppbmcoKTtcbiAgICB0aGlzLmRpdi5mb2N1cygpO1xuICB9XG4gIHNlbGVjdCgpIHtcbiAgICB0aGlzLm1ha2VSZXNpemFibGUoKTtcbiAgICB0aGlzLmRpdj8uY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgIGlmICghdGhpcy4jZWRpdFRvb2xiYXIpIHtcbiAgICAgIHRoaXMuYWRkRWRpdFRvb2xiYXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGl2Py5jbGFzc0xpc3QuY29udGFpbnMoXCJzZWxlY3RlZEVkaXRvclwiKSkge1xuICAgICAgICAgIHRoaXMuI2VkaXRUb29sYmFyPy5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNlZGl0VG9vbGJhcj8uc2hvdygpO1xuICB9XG4gIHVuc2VsZWN0KCkge1xuICAgIHRoaXMuI3Jlc2l6ZXJzRGl2Py5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIHRoaXMuZGl2Py5jbGFzc0xpc3QucmVtb3ZlKFwic2VsZWN0ZWRFZGl0b3JcIik7XG4gICAgaWYgKHRoaXMuZGl2Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmN1cnJlbnRMYXllci5kaXYuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy4jZWRpdFRvb2xiYXI/LmhpZGUoKTtcbiAgfVxuICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHt9XG4gIGRpc2FibGVFZGl0aW5nKCkge31cbiAgZW5hYmxlRWRpdGluZygpIHt9XG4gIGVudGVySW5FZGl0TW9kZSgpIHt9XG4gIGdldEltYWdlRm9yQWx0VGV4dCgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgY29udGVudERpdigpIHtcbiAgICByZXR1cm4gdGhpcy5kaXY7XG4gIH1cbiAgZ2V0IGlzRWRpdGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jaXNFZGl0aW5nO1xuICB9XG4gIHNldCBpc0VkaXRpbmcodmFsdWUpIHtcbiAgICB0aGlzLiNpc0VkaXRpbmcgPSB2YWx1ZTtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5wYXJlbnQuc2V0U2VsZWN0ZWQodGhpcyk7XG4gICAgICB0aGlzLnBhcmVudC5zZXRBY3RpdmVFZGl0b3IodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyZW50LnNldEFjdGl2ZUVkaXRvcihudWxsKTtcbiAgICB9XG4gIH1cbiAgc2V0QXNwZWN0UmF0aW8od2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMuI2tlZXBBc3BlY3RSYXRpbyA9IHRydWU7XG4gICAgY29uc3QgYXNwZWN0UmF0aW8gPSB3aWR0aCAvIGhlaWdodDtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLmRpdjtcbiAgICBzdHlsZS5hc3BlY3RSYXRpbyA9IGFzcGVjdFJhdGlvO1xuICAgIHN0eWxlLmhlaWdodCA9IFwiYXV0b1wiO1xuICB9XG4gIHN0YXRpYyBnZXQgTUlOX1NJWkUoKSB7XG4gICAgcmV0dXJuIDE2O1xuICB9XG4gIHN0YXRpYyBjYW5DcmVhdGVOZXdFbXB0eUVkaXRvcigpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBnZXQgdGVsZW1ldHJ5SW5pdGlhbERhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJhZGRlZFwiXG4gICAgfTtcbiAgfVxuICBnZXQgdGVsZW1ldHJ5RmluYWxEYXRhKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIF9yZXBvcnRUZWxlbWV0cnkoZGF0YSwgbXVzdFdhaXQgPSBmYWxzZSkge1xuICAgIGlmIChtdXN0V2FpdCkge1xuICAgICAgdGhpcy4jdGVsZW1ldHJ5VGltZW91dHMgfHw9IG5ldyBNYXAoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWN0aW9uXG4gICAgICB9ID0gZGF0YTtcbiAgICAgIGxldCB0aW1lb3V0ID0gdGhpcy4jdGVsZW1ldHJ5VGltZW91dHMuZ2V0KGFjdGlvbik7XG4gICAgICBpZiAodGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB9XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlcG9ydFRlbGVtZXRyeShkYXRhKTtcbiAgICAgICAgdGhpcy4jdGVsZW1ldHJ5VGltZW91dHMuZGVsZXRlKGFjdGlvbik7XG4gICAgICAgIGlmICh0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cy5zaXplID09PSAwKSB7XG4gICAgICAgICAgdGhpcy4jdGVsZW1ldHJ5VGltZW91dHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9LCBBbm5vdGF0aW9uRWRpdG9yLl90ZWxlbWV0cnlUaW1lb3V0KTtcbiAgICAgIHRoaXMuI3RlbGVtZXRyeVRpbWVvdXRzLnNldChhY3Rpb24sIHRpbWVvdXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYXRhLnR5cGUgfHw9IHRoaXMuZWRpdG9yVHlwZTtcbiAgICB0aGlzLl91aU1hbmFnZXIuX2V2ZW50QnVzLmRpc3BhdGNoKFwicmVwb3J0dGVsZW1ldHJ5XCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgdHlwZTogXCJlZGl0aW5nXCIsXG4gICAgICAgIGRhdGFcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBzaG93KHZpc2libGUgPSB0aGlzLl9pc1Zpc2libGUpIHtcbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiaGlkZGVuXCIsICF2aXNpYmxlKTtcbiAgICB0aGlzLl9pc1Zpc2libGUgPSB2aXNpYmxlO1xuICB9XG4gIGVuYWJsZSgpIHtcbiAgICBpZiAodGhpcy5kaXYpIHtcbiAgICAgIHRoaXMuZGl2LnRhYkluZGV4ID0gMDtcbiAgICB9XG4gICAgdGhpcy4jZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxuICBkaXNhYmxlKCkge1xuICAgIGlmICh0aGlzLmRpdikge1xuICAgICAgdGhpcy5kaXYudGFiSW5kZXggPSAtMTtcbiAgICB9XG4gICAgdGhpcy4jZGlzYWJsZWQgPSB0cnVlO1xuICB9XG4gIHJlbmRlckFubm90YXRpb25FbGVtZW50KGFubm90YXRpb24pIHtcbiAgICBsZXQgY29udGVudCA9IGFubm90YXRpb24uY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCIuYW5ub3RhdGlvbkNvbnRlbnRcIik7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcImFubm90YXRpb25Db250ZW50XCIsIHRoaXMuZWRpdG9yVHlwZSk7XG4gICAgICBhbm5vdGF0aW9uLmNvbnRhaW5lci5wcmVwZW5kKGNvbnRlbnQpO1xuICAgIH0gZWxzZSBpZiAoY29udGVudC5ub2RlTmFtZSA9PT0gXCJDQU5WQVNcIikge1xuICAgICAgY29uc3QgY2FudmFzID0gY29udGVudDtcbiAgICAgIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKFwiYW5ub3RhdGlvbkNvbnRlbnRcIiwgdGhpcy5lZGl0b3JUeXBlKTtcbiAgICAgIGNhbnZhcy5iZWZvcmUoY29udGVudCk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIHJlc2V0QW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbikge1xuICAgIGNvbnN0IHtcbiAgICAgIGZpcnN0Q2hpbGRcbiAgICB9ID0gYW5ub3RhdGlvbi5jb250YWluZXI7XG4gICAgaWYgKGZpcnN0Q2hpbGQubm9kZU5hbWUgPT09IFwiRElWXCIgJiYgZmlyc3RDaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoXCJhbm5vdGF0aW9uQ29udGVudFwiKSkge1xuICAgICAgZmlyc3RDaGlsZC5yZW1vdmUoKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIEZha2VFZGl0b3IgZXh0ZW5kcyBBbm5vdGF0aW9uRWRpdG9yIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcbiAgICB0aGlzLmFubm90YXRpb25FbGVtZW50SWQgPSBwYXJhbXMuYW5ub3RhdGlvbkVsZW1lbnRJZDtcbiAgICB0aGlzLmRlbGV0ZWQgPSB0cnVlO1xuICB9XG4gIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCxcbiAgICAgIGRlbGV0ZWQ6IHRydWUsXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4XG4gICAgfTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvc2hhcmVkL211cm11cmhhc2gzLmpzXG5jb25zdCBTRUVEID0gMHhjM2QyZTFmMDtcbmNvbnN0IE1BU0tfSElHSCA9IDB4ZmZmZjAwMDA7XG5jb25zdCBNQVNLX0xPVyA9IDB4ZmZmZjtcbmNsYXNzIE11cm11ckhhc2gzXzY0IHtcbiAgY29uc3RydWN0b3Ioc2VlZCkge1xuICAgIHRoaXMuaDEgPSBzZWVkID8gc2VlZCAmIDB4ZmZmZmZmZmYgOiBTRUVEO1xuICAgIHRoaXMuaDIgPSBzZWVkID8gc2VlZCAmIDB4ZmZmZmZmZmYgOiBTRUVEO1xuICB9XG4gIHVwZGF0ZShpbnB1dCkge1xuICAgIGxldCBkYXRhLCBsZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGlucHV0Lmxlbmd0aCAqIDIpO1xuICAgICAgbGVuZ3RoID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGlucHV0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjb2RlIDw9IDB4ZmYpIHtcbiAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlID4+PiA4O1xuICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSAmIDB4ZmY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhpbnB1dCkpIHtcbiAgICAgIGRhdGEgPSBpbnB1dC5zbGljZSgpO1xuICAgICAgbGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRhdGEgZm9ybWF0LCBtdXN0IGJlIGEgc3RyaW5nIG9yIFR5cGVkQXJyYXkuXCIpO1xuICAgIH1cbiAgICBjb25zdCBibG9ja0NvdW50cyA9IGxlbmd0aCA+PiAyO1xuICAgIGNvbnN0IHRhaWxMZW5ndGggPSBsZW5ndGggLSBibG9ja0NvdW50cyAqIDQ7XG4gICAgY29uc3QgZGF0YVVpbnQzMiA9IG5ldyBVaW50MzJBcnJheShkYXRhLmJ1ZmZlciwgMCwgYmxvY2tDb3VudHMpO1xuICAgIGxldCBrMSA9IDAsXG4gICAgICBrMiA9IDA7XG4gICAgbGV0IGgxID0gdGhpcy5oMSxcbiAgICAgIGgyID0gdGhpcy5oMjtcbiAgICBjb25zdCBDMSA9IDB4Y2M5ZTJkNTEsXG4gICAgICBDMiA9IDB4MWI4NzM1OTM7XG4gICAgY29uc3QgQzFfTE9XID0gQzEgJiBNQVNLX0xPVyxcbiAgICAgIEMyX0xPVyA9IEMyICYgTUFTS19MT1c7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja0NvdW50czsgaSsrKSB7XG4gICAgICBpZiAoaSAmIDEpIHtcbiAgICAgICAgazEgPSBkYXRhVWludDMyW2ldO1xuICAgICAgICBrMSA9IGsxICogQzEgJiBNQVNLX0hJR0ggfCBrMSAqIEMxX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3O1xuICAgICAgICBrMSA9IGsxICogQzIgJiBNQVNLX0hJR0ggfCBrMSAqIEMyX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBoMSBePSBrMTtcbiAgICAgICAgaDEgPSBoMSA8PCAxMyB8IGgxID4+PiAxOTtcbiAgICAgICAgaDEgPSBoMSAqIDUgKyAweGU2NTQ2YjY0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgazIgPSBkYXRhVWludDMyW2ldO1xuICAgICAgICBrMiA9IGsyICogQzEgJiBNQVNLX0hJR0ggfCBrMiAqIEMxX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBrMiA9IGsyIDw8IDE1IHwgazIgPj4+IDE3O1xuICAgICAgICBrMiA9IGsyICogQzIgJiBNQVNLX0hJR0ggfCBrMiAqIEMyX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBoMiBePSBrMjtcbiAgICAgICAgaDIgPSBoMiA8PCAxMyB8IGgyID4+PiAxOTtcbiAgICAgICAgaDIgPSBoMiAqIDUgKyAweGU2NTQ2YjY0O1xuICAgICAgfVxuICAgIH1cbiAgICBrMSA9IDA7XG4gICAgc3dpdGNoICh0YWlsTGVuZ3RoKSB7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0ICsgMl0gPDwgMTY7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0ICsgMV0gPDwgODtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDRdO1xuICAgICAgICBrMSA9IGsxICogQzEgJiBNQVNLX0hJR0ggfCBrMSAqIEMxX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3O1xuICAgICAgICBrMSA9IGsxICogQzIgJiBNQVNLX0hJR0ggfCBrMSAqIEMyX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBpZiAoYmxvY2tDb3VudHMgJiAxKSB7XG4gICAgICAgICAgaDEgXj0gazE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaDIgXj0gazE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5oMSA9IGgxO1xuICAgIHRoaXMuaDIgPSBoMjtcbiAgfVxuICBoZXhkaWdlc3QoKSB7XG4gICAgbGV0IGgxID0gdGhpcy5oMSxcbiAgICAgIGgyID0gdGhpcy5oMjtcbiAgICBoMSBePSBoMiA+Pj4gMTtcbiAgICBoMSA9IGgxICogMHhlZDU1OGNjZCAmIE1BU0tfSElHSCB8IGgxICogMHg4Y2NkICYgTUFTS19MT1c7XG4gICAgaDIgPSBoMiAqIDB4ZmY1MWFmZDcgJiBNQVNLX0hJR0ggfCAoKGgyIDw8IDE2IHwgaDEgPj4+IDE2KSAqIDB4YWZkN2VkNTUgJiBNQVNLX0hJR0gpID4+PiAxNjtcbiAgICBoMSBePSBoMiA+Pj4gMTtcbiAgICBoMSA9IGgxICogMHgxYTg1ZWM1MyAmIE1BU0tfSElHSCB8IGgxICogMHhlYzUzICYgTUFTS19MT1c7XG4gICAgaDIgPSBoMiAqIDB4YzRjZWI5ZmUgJiBNQVNLX0hJR0ggfCAoKGgyIDw8IDE2IHwgaDEgPj4+IDE2KSAqIDB4YjlmZTFhODUgJiBNQVNLX0hJR0gpID4+PiAxNjtcbiAgICBoMSBePSBoMiA+Pj4gMTtcbiAgICByZXR1cm4gKGgxID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgXCIwXCIpICsgKGgyID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgXCIwXCIpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2Fubm90YXRpb25fc3RvcmFnZS5qc1xuXG5cblxuY29uc3QgU2VyaWFsaXphYmxlRW1wdHkgPSBPYmplY3QuZnJlZXplKHtcbiAgbWFwOiBudWxsLFxuICBoYXNoOiBcIlwiLFxuICB0cmFuc2ZlcjogdW5kZWZpbmVkXG59KTtcbmNsYXNzIEFubm90YXRpb25TdG9yYWdlIHtcbiAgI21vZGlmaWVkID0gZmFsc2U7XG4gICNzdG9yYWdlID0gbmV3IE1hcCgpO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm9uU2V0TW9kaWZpZWQgPSBudWxsO1xuICAgIHRoaXMub25SZXNldE1vZGlmaWVkID0gbnVsbDtcbiAgICB0aGlzLm9uQW5ub3RhdGlvbkVkaXRvciA9IG51bGw7XG4gIH1cbiAgZ2V0VmFsdWUoa2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI3N0b3JhZ2UuZ2V0KGtleSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGRlZmF1bHRWYWx1ZSwgdmFsdWUpO1xuICB9XG4gIGdldFJhd1ZhbHVlKGtleSkge1xuICAgIHJldHVybiB0aGlzLiNzdG9yYWdlLmdldChrZXkpO1xuICB9XG4gIHJlbW92ZShrZXkpIHtcbiAgICB0aGlzLiNzdG9yYWdlLmRlbGV0ZShrZXkpO1xuICAgIGlmICh0aGlzLiNzdG9yYWdlLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMucmVzZXRNb2RpZmllZCgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy4jc3RvcmFnZS52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uRWRpdG9yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm9uQW5ub3RhdGlvbkVkaXRvcihudWxsKTtcbiAgICB9XG4gIH1cbiAgc2V0VmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuI3N0b3JhZ2UuZ2V0KGtleSk7XG4gICAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XG4gICAgaWYgKG9iaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IFtlbnRyeSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKG9ialtlbnRyeV0gIT09IHZhbCkge1xuICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICBvYmpbZW50cnldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuI3N0b3JhZ2Uuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgIHRoaXMuI3NldE1vZGlmaWVkKCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFubm90YXRpb25FZGl0b3IgJiYgdHlwZW9mIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKHZhbHVlLmNvbnN0cnVjdG9yLl90eXBlKTtcbiAgICB9XG4gIH1cbiAgaGFzKGtleSkge1xuICAgIHJldHVybiB0aGlzLiNzdG9yYWdlLmhhcyhrZXkpO1xuICB9XG4gIGdldEFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RvcmFnZS5zaXplID4gMCA/IG9iamVjdEZyb21NYXAodGhpcy4jc3RvcmFnZSkgOiBudWxsO1xuICB9XG4gIHNldEFsbChvYmopIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgdGhpcy5zZXRWYWx1ZShrZXksIHZhbCk7XG4gICAgfVxuICB9XG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLiNzdG9yYWdlLnNpemU7XG4gIH1cbiAgI3NldE1vZGlmaWVkKCkge1xuICAgIGlmICghdGhpcy4jbW9kaWZpZWQpIHtcbiAgICAgIHRoaXMuI21vZGlmaWVkID0gdHJ1ZTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vblNldE1vZGlmaWVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhpcy5vblNldE1vZGlmaWVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlc2V0TW9kaWZpZWQoKSB7XG4gICAgaWYgKHRoaXMuI21vZGlmaWVkKSB7XG4gICAgICB0aGlzLiNtb2RpZmllZCA9IGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uUmVzZXRNb2RpZmllZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRoaXMub25SZXNldE1vZGlmaWVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBwcmludCgpIHtcbiAgICByZXR1cm4gbmV3IFByaW50QW5ub3RhdGlvblN0b3JhZ2UodGhpcyk7XG4gIH1cbiAgZ2V0IHNlcmlhbGl6YWJsZSgpIHtcbiAgICBpZiAodGhpcy4jc3RvcmFnZS5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gU2VyaWFsaXphYmxlRW1wdHk7XG4gICAgfVxuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKSxcbiAgICAgIGhhc2ggPSBuZXcgTXVybXVySGFzaDNfNjQoKSxcbiAgICAgIHRyYW5zZmVyID0gW107XG4gICAgY29uc3QgY29udGV4dCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGhhc0JpdG1hcCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzLiNzdG9yYWdlKSB7XG4gICAgICBjb25zdCBzZXJpYWxpemVkID0gdmFsIGluc3RhbmNlb2YgQW5ub3RhdGlvbkVkaXRvciA/IHZhbC5zZXJpYWxpemUoZmFsc2UsIGNvbnRleHQpIDogdmFsO1xuICAgICAgaWYgKHNlcmlhbGl6ZWQpIHtcbiAgICAgICAgbWFwLnNldChrZXksIHNlcmlhbGl6ZWQpO1xuICAgICAgICBoYXNoLnVwZGF0ZShgJHtrZXl9OiR7SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCl9YCk7XG4gICAgICAgIGhhc0JpdG1hcCB8fD0gISFzZXJpYWxpemVkLmJpdG1hcDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0JpdG1hcCkge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBtYXAudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKHZhbHVlLmJpdG1hcCkge1xuICAgICAgICAgIHRyYW5zZmVyLnB1c2godmFsdWUuYml0bWFwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwLnNpemUgPiAwID8ge1xuICAgICAgbWFwLFxuICAgICAgaGFzaDogaGFzaC5oZXhkaWdlc3QoKSxcbiAgICAgIHRyYW5zZmVyXG4gICAgfSA6IFNlcmlhbGl6YWJsZUVtcHR5O1xuICB9XG4gIGdldCBlZGl0b3JTdGF0cygpIHtcbiAgICBsZXQgc3RhdHMgPSBudWxsO1xuICAgIGNvbnN0IHR5cGVUb0VkaXRvciA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMuI3N0b3JhZ2UudmFsdWVzKCkpIHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgQW5ub3RhdGlvbkVkaXRvcikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBlZGl0b3JTdGF0cyA9IHZhbHVlLnRlbGVtZXRyeUZpbmFsRGF0YTtcbiAgICAgIGlmICghZWRpdG9yU3RhdHMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIHR5cGVcbiAgICAgIH0gPSBlZGl0b3JTdGF0cztcbiAgICAgIGlmICghdHlwZVRvRWRpdG9yLmhhcyh0eXBlKSkge1xuICAgICAgICB0eXBlVG9FZGl0b3Iuc2V0KHR5cGUsIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkuY29uc3RydWN0b3IpO1xuICAgICAgfVxuICAgICAgc3RhdHMgfHw9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBjb25zdCBtYXAgPSBzdGF0c1t0eXBlXSB8fD0gbmV3IE1hcCgpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKGVkaXRvclN0YXRzKSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcInR5cGVcIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb3VudGVycyA9IG1hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFjb3VudGVycykge1xuICAgICAgICAgIGNvdW50ZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIG1hcC5zZXQoa2V5LCBjb3VudGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY291bnQgPSBjb3VudGVycy5nZXQodmFsKSA/PyAwO1xuICAgICAgICBjb3VudGVycy5zZXQodmFsLCBjb3VudCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBlZGl0b3JdIG9mIHR5cGVUb0VkaXRvcikge1xuICAgICAgc3RhdHNbdHlwZV0gPSBlZGl0b3IuY29tcHV0ZVRlbGVtZXRyeUZpbmFsRGF0YShzdGF0c1t0eXBlXSk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0cztcbiAgfVxufVxuY2xhc3MgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSBleHRlbmRzIEFubm90YXRpb25TdG9yYWdlIHtcbiAgI3NlcmlhbGl6YWJsZTtcbiAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgc3VwZXIoKTtcbiAgICBjb25zdCB7XG4gICAgICBtYXAsXG4gICAgICBoYXNoLFxuICAgICAgdHJhbnNmZXJcbiAgICB9ID0gcGFyZW50LnNlcmlhbGl6YWJsZTtcbiAgICBjb25zdCBjbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShtYXAsIHRyYW5zZmVyID8ge1xuICAgICAgdHJhbnNmZXJcbiAgICB9IDogbnVsbCk7XG4gICAgdGhpcy4jc2VyaWFsaXphYmxlID0ge1xuICAgICAgbWFwOiBjbG9uZSxcbiAgICAgIGhhc2gsXG4gICAgICB0cmFuc2ZlclxuICAgIH07XG4gIH1cbiAgZ2V0IHByaW50KCkge1xuICAgIHVucmVhY2hhYmxlKFwiU2hvdWxkIG5vdCBjYWxsIFByaW50QW5ub3RhdGlvblN0b3JhZ2UucHJpbnRcIik7XG4gIH1cbiAgZ2V0IHNlcmlhbGl6YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc2VyaWFsaXphYmxlO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2ZvbnRfbG9hZGVyLmpzXG5cbmNsYXNzIEZvbnRMb2FkZXIge1xuICAjc3lzdGVtRm9udHMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudCxcbiAgICBzdHlsZUVsZW1lbnQgPSBudWxsXG4gIH0pIHtcbiAgICB0aGlzLl9kb2N1bWVudCA9IG93bmVyRG9jdW1lbnQ7XG4gICAgdGhpcy5uYXRpdmVGb250RmFjZXMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5zdHlsZUVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMubG9hZGluZ1JlcXVlc3RzID0gW107XG4gICAgdGhpcy5sb2FkVGVzdEZvbnRJZCA9IDA7XG4gIH1cbiAgYWRkTmF0aXZlRm9udEZhY2UobmF0aXZlRm9udEZhY2UpIHtcbiAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5hZGQobmF0aXZlRm9udEZhY2UpO1xuICAgIHRoaXMuX2RvY3VtZW50LmZvbnRzLmFkZChuYXRpdmVGb250RmFjZSk7XG4gIH1cbiAgcmVtb3ZlTmF0aXZlRm9udEZhY2UobmF0aXZlRm9udEZhY2UpIHtcbiAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5kZWxldGUobmF0aXZlRm9udEZhY2UpO1xuICAgIHRoaXMuX2RvY3VtZW50LmZvbnRzLmRlbGV0ZShuYXRpdmVGb250RmFjZSk7XG4gIH1cbiAgaW5zZXJ0UnVsZShydWxlKSB7XG4gICAgaWYgKCF0aGlzLnN0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgICB0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdLmFwcGVuZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlU2hlZXQgPSB0aGlzLnN0eWxlRWxlbWVudC5zaGVldDtcbiAgICBzdHlsZVNoZWV0Lmluc2VydFJ1bGUocnVsZSwgc3R5bGVTaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIGZvciAoY29uc3QgbmF0aXZlRm9udEZhY2Ugb2YgdGhpcy5uYXRpdmVGb250RmFjZXMpIHtcbiAgICAgIHRoaXMuX2RvY3VtZW50LmZvbnRzLmRlbGV0ZShuYXRpdmVGb250RmFjZSk7XG4gICAgfVxuICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLmNsZWFyKCk7XG4gICAgdGhpcy4jc3lzdGVtRm9udHMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5zdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBhc3luYyBsb2FkU3lzdGVtRm9udCh7XG4gICAgc3lzdGVtRm9udEluZm86IGluZm8sXG4gICAgX2luc3BlY3RGb250XG4gIH0pIHtcbiAgICBpZiAoIWluZm8gfHwgdGhpcy4jc3lzdGVtRm9udHMuaGFzKGluZm8ubG9hZGVkTmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXNzZXJ0KCF0aGlzLmRpc2FibGVGb250RmFjZSwgXCJsb2FkU3lzdGVtRm9udCBzaG91bGRuJ3QgYmUgY2FsbGVkIHdoZW4gYGRpc2FibGVGb250RmFjZWAgaXMgc2V0LlwiKTtcbiAgICBpZiAodGhpcy5pc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxvYWRlZE5hbWUsXG4gICAgICAgIHNyYyxcbiAgICAgICAgc3R5bGVcbiAgICAgIH0gPSBpbmZvO1xuICAgICAgY29uc3QgZm9udEZhY2UgPSBuZXcgRm9udEZhY2UobG9hZGVkTmFtZSwgc3JjLCBzdHlsZSk7XG4gICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKGZvbnRGYWNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZvbnRGYWNlLmxvYWQoKTtcbiAgICAgICAgdGhpcy4jc3lzdGVtRm9udHMuYWRkKGxvYWRlZE5hbWUpO1xuICAgICAgICBfaW5zcGVjdEZvbnQ/LihpbmZvKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB3YXJuKGBDYW5ub3QgbG9hZCBzeXN0ZW0gZm9udDogJHtpbmZvLmJhc2VGb250TmFtZX0sIGluc3RhbGxpbmcgaXQgY291bGQgaGVscCB0byBpbXByb3ZlIFBERiByZW5kZXJpbmcuYCk7XG4gICAgICAgIHRoaXMucmVtb3ZlTmF0aXZlRm9udEZhY2UoZm9udEZhY2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1bnJlYWNoYWJsZShcIk5vdCBpbXBsZW1lbnRlZDogbG9hZFN5c3RlbUZvbnQgd2l0aG91dCB0aGUgRm9udCBMb2FkaW5nIEFQSS5cIik7XG4gIH1cbiAgYXN5bmMgYmluZChmb250KSB7XG4gICAgaWYgKGZvbnQuYXR0YWNoZWQgfHwgZm9udC5taXNzaW5nRmlsZSAmJiAhZm9udC5zeXN0ZW1Gb250SW5mbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb250LmF0dGFjaGVkID0gdHJ1ZTtcbiAgICBpZiAoZm9udC5zeXN0ZW1Gb250SW5mbykge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkU3lzdGVtRm9udChmb250KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCkge1xuICAgICAgY29uc3QgbmF0aXZlRm9udEZhY2UgPSBmb250LmNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCk7XG4gICAgICBpZiAobmF0aXZlRm9udEZhY2UpIHtcbiAgICAgICAgdGhpcy5hZGROYXRpdmVGb250RmFjZShuYXRpdmVGb250RmFjZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgbmF0aXZlRm9udEZhY2UubG9hZGVkO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIHdhcm4oYEZhaWxlZCB0byBsb2FkIGZvbnQgJyR7bmF0aXZlRm9udEZhY2UuZmFtaWx5fSc6ICcke2V4fScuYCk7XG4gICAgICAgICAgZm9udC5kaXNhYmxlRm9udEZhY2UgPSB0cnVlO1xuICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJ1bGUgPSBmb250LmNyZWF0ZUZvbnRGYWNlUnVsZSgpO1xuICAgIGlmIChydWxlKSB7XG4gICAgICB0aGlzLmluc2VydFJ1bGUocnVsZSk7XG4gICAgICBpZiAodGhpcy5pc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKHJlc29sdmUpO1xuICAgICAgICB0aGlzLl9wcmVwYXJlRm9udExvYWRFdmVudChmb250LCByZXF1ZXN0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBnZXQgaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCgpIHtcbiAgICBjb25zdCBoYXNGb250cyA9ICEhdGhpcy5fZG9jdW1lbnQ/LmZvbnRzO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkXCIsIGhhc0ZvbnRzKTtcbiAgfVxuICBnZXQgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQoKSB7XG4gICAgbGV0IHN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIGlmIChpc05vZGVKUykge1xuICAgICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIG5hdmlnYXRvcj8udXNlckFnZW50ID09PSBcInN0cmluZ1wiICYmIC9Nb3ppbGxhXFwvNS4wLio/cnY6XFxkKy4qPyBHZWNrby8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkXCIsIHN1cHBvcnRlZCk7XG4gIH1cbiAgX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgZnVuY3Rpb24gY29tcGxldGVSZXF1ZXN0KCkge1xuICAgICAgYXNzZXJ0KCFyZXF1ZXN0LmRvbmUsIFwiY29tcGxldGVSZXF1ZXN0KCkgY2Fubm90IGJlIGNhbGxlZCB0d2ljZS5cIik7XG4gICAgICByZXF1ZXN0LmRvbmUgPSB0cnVlO1xuICAgICAgd2hpbGUgKGxvYWRpbmdSZXF1ZXN0cy5sZW5ndGggPiAwICYmIGxvYWRpbmdSZXF1ZXN0c1swXS5kb25lKSB7XG4gICAgICAgIGNvbnN0IG90aGVyUmVxdWVzdCA9IGxvYWRpbmdSZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgICBzZXRUaW1lb3V0KG90aGVyUmVxdWVzdC5jYWxsYmFjaywgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGxvYWRpbmdSZXF1ZXN0c1xuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZVJlcXVlc3QsXG4gICAgICBjYWxsYmFja1xuICAgIH07XG4gICAgbG9hZGluZ1JlcXVlc3RzLnB1c2gocmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH1cbiAgZ2V0IF9sb2FkVGVzdEZvbnQoKSB7XG4gICAgY29uc3QgdGVzdEZvbnQgPSBhdG9iKFwiVDFSVVR3QUxBSUFBQXdBd1EwWkdJREh0Wmc0QUFBT1lBQUFBZ1VaR1ZFMWxrelp3QUFBRUhBQUFBQnhIUkVWR0FCUUFcIiArIFwiRlFBQUJEZ0FBQUFlVDFNdk1sWU5Zd2tBQUFFZ0FBQUFZR050WVhBQkRRTFVBQUFDTkFBQUFVSm9aV0ZrL3hWRkRRQUFcIiArIFwiQUx3QUFBQTJhR2hsWVFka0Erb0FBQUQwQUFBQUpHaHRkSGdENkFBQUFBQUVXQUFBQUFadFlYaHdBQUpRQUFBQUFSZ0FcIiArIFwiQUFBR2JtRnRaVmptZEg0QUFBR0FBQUFBc1hCdmMzVC9oZ0F6QUFBRGVBQUFBQ0FBQVFBQUFBRUFBTFpSRnNSZkR6ejFcIiArIFwiQUFzRDZBQUFBQURPQk9UTEFBQUFBTTRLSER3QUFBQUFBK2dESVFBQUFBZ0FBZ0FBQUFBQUFBQUJBQUFESVFBQUFGb0RcIiArIFwiNkFBQUFBQUQ2QUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBVUFBQUFnQUFBQVFENkFIMEFBVUFBQUtLQXJ3QUFBQ01cIiArIFwiQW9vQ3ZBQUFBZUFBTVFFQ0FBQUNBQVlKQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFGQm1SV1FBd0FBdUFDNERcIiArIFwiSVA4NEFGb0RJUUFBQUFBQUFRQUFBQUFBQUFBQUFDQUFJQUFCQUFBQURnQ3VBQUVBQUFBQUFBQUFBUUFBQUFFQUFBQUFcIiArIFwiQUFFQUFRQUFBQUVBQUFBQUFBSUFBUUFBQUFFQUFBQUFBQU1BQVFBQUFBRUFBQUFBQUFRQUFRQUFBQUVBQUFBQUFBVUFcIiArIFwiQVFBQUFBRUFBQUFBQUFZQUFRQUFBQU1BQVFRSkFBQUFBZ0FCQUFNQUFRUUpBQUVBQWdBQkFBTUFBUVFKQUFJQUFnQUJcIiArIFwiQUFNQUFRUUpBQU1BQWdBQkFBTUFBUVFKQUFRQUFnQUJBQU1BQVFRSkFBVUFBZ0FCQUFNQUFRUUpBQVlBQWdBQldBQllcIiArIFwiQUFBQUFBQUFBd0FBQUFNQUFBQWNBQUVBQUFBQUFEd0FBd0FCQUFBQUhBQUVBQ0FBQUFBRUFBUUFBUUFBQUM3Ly93QUFcIiArIFwiQUM3Ly8vL1RBQUVBQUFBQUFBQUJCZ0FBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUFBQUFBQUFEL2d3QXlBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQkFBUUVBQUVCQVFKWUFBRUJBU0g0RHdENEd3SEVBdmdjQS9nWEJJd01BWXVMK256NXRRWGtENWozQ0JMbkVRQUNcIiArIFwiQVFFQklWaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZQUFBQkFRQUFEd0FDQVFFRUUvdDNcIiArIFwiRG92NmZBSDZmQVQrZlBwOCtud0hEb3NNQ3ZtMUN2bTFEQXo2ZkJRQUFBQUFBQUFCQUFBQUFNbUpiekVBQUFBQXpnVGpcIiArIFwiRlFBQUFBRE9CT1FwQUFFQUFBQUFBQUFBREFBVUFBUUFBQUFCQUFBQUFnQUJBQUFBQUFBQUFBQUQ2QUFBQUFBQUFBPT1cIik7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9sb2FkVGVzdEZvbnRcIiwgdGVzdEZvbnQpO1xuICB9XG4gIF9wcmVwYXJlRm9udExvYWRFdmVudChmb250LCByZXF1ZXN0KSB7XG4gICAgZnVuY3Rpb24gaW50MzIoZGF0YSwgb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZGF0YS5jaGFyQ29kZUF0KG9mZnNldCkgPDwgMjQgfCBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSkgPDwgMTYgfCBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0ICsgMikgPDwgOCB8IGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAzKSAmIDB4ZmY7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNwbGljZVN0cmluZyhzLCBvZmZzZXQsIHJlbW92ZSwgaW5zZXJ0KSB7XG4gICAgICBjb25zdCBjaHVuazEgPSBzLnN1YnN0cmluZygwLCBvZmZzZXQpO1xuICAgICAgY29uc3QgY2h1bmsyID0gcy5zdWJzdHJpbmcob2Zmc2V0ICsgcmVtb3ZlKTtcbiAgICAgIHJldHVybiBjaHVuazEgKyBpbnNlcnQgKyBjaHVuazI7XG4gICAgfVxuICAgIGxldCBpLCBpaTtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBsZXQgY2FsbGVkID0gMDtcbiAgICBmdW5jdGlvbiBpc0ZvbnRSZWFkeShuYW1lLCBjYWxsYmFjaykge1xuICAgICAgaWYgKCsrY2FsbGVkID4gMzApIHtcbiAgICAgICAgd2FybihcIkxvYWQgdGVzdCBmb250IG5ldmVyIGxvYWRlZC5cIik7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGN0eC5mb250ID0gXCIzMHB4IFwiICsgbmFtZTtcbiAgICAgIGN0eC5maWxsVGV4dChcIi5cIiwgMCwgMjApO1xuICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKTtcbiAgICAgIGlmIChpbWFnZURhdGEuZGF0YVszXSA+IDApIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2V0VGltZW91dChpc0ZvbnRSZWFkeS5iaW5kKG51bGwsIG5hbWUsIGNhbGxiYWNrKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvYWRUZXN0Rm9udElkID0gYGx0JHtEYXRlLm5vdygpfSR7dGhpcy5sb2FkVGVzdEZvbnRJZCsrfWA7XG4gICAgbGV0IGRhdGEgPSB0aGlzLl9sb2FkVGVzdEZvbnQ7XG4gICAgY29uc3QgQ09NTUVOVF9PRkZTRVQgPSA5NzY7XG4gICAgZGF0YSA9IHNwbGljZVN0cmluZyhkYXRhLCBDT01NRU5UX09GRlNFVCwgbG9hZFRlc3RGb250SWQubGVuZ3RoLCBsb2FkVGVzdEZvbnRJZCk7XG4gICAgY29uc3QgQ0ZGX0NIRUNLU1VNX09GRlNFVCA9IDE2O1xuICAgIGNvbnN0IFhYWFhfVkFMVUUgPSAweDU4NTg1ODU4O1xuICAgIGxldCBjaGVja3N1bSA9IGludDMyKGRhdGEsIENGRl9DSEVDS1NVTV9PRkZTRVQpO1xuICAgIGZvciAoaSA9IDAsIGlpID0gbG9hZFRlc3RGb250SWQubGVuZ3RoIC0gMzsgaSA8IGlpOyBpICs9IDQpIHtcbiAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gLSBYWFhYX1ZBTFVFICsgaW50MzIobG9hZFRlc3RGb250SWQsIGkpIHwgMDtcbiAgICB9XG4gICAgaWYgKGkgPCBsb2FkVGVzdEZvbnRJZC5sZW5ndGgpIHtcbiAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gLSBYWFhYX1ZBTFVFICsgaW50MzIobG9hZFRlc3RGb250SWQgKyBcIlhYWFwiLCBpKSB8IDA7XG4gICAgfVxuICAgIGRhdGEgPSBzcGxpY2VTdHJpbmcoZGF0YSwgQ0ZGX0NIRUNLU1VNX09GRlNFVCwgNCwgc3RyaW5nMzIoY2hlY2tzdW0pKTtcbiAgICBjb25zdCB1cmwgPSBgdXJsKGRhdGE6Zm9udC9vcGVudHlwZTtiYXNlNjQsJHtidG9hKGRhdGEpfSk7YDtcbiAgICBjb25zdCBydWxlID0gYEBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OlwiJHtsb2FkVGVzdEZvbnRJZH1cIjtzcmM6JHt1cmx9fWA7XG4gICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpO1xuICAgIGNvbnN0IGRpdiA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgIGRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5oZWlnaHQgPSBcIjEwcHhcIjtcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgZGl2LnN0eWxlLnRvcCA9IGRpdi5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgW2ZvbnQubG9hZGVkTmFtZSwgbG9hZFRlc3RGb250SWRdKSB7XG4gICAgICBjb25zdCBzcGFuID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICBzcGFuLnRleHRDb250ZW50ID0gXCJIaVwiO1xuICAgICAgc3Bhbi5zdHlsZS5mb250RmFtaWx5ID0gbmFtZTtcbiAgICAgIGRpdi5hcHBlbmQoc3Bhbik7XG4gICAgfVxuICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kKGRpdik7XG4gICAgaXNGb250UmVhZHkobG9hZFRlc3RGb250SWQsICgpID0+IHtcbiAgICAgIGRpdi5yZW1vdmUoKTtcbiAgICAgIHJlcXVlc3QuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgRm9udEZhY2VPYmplY3Qge1xuICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVkRGF0YSwge1xuICAgIGRpc2FibGVGb250RmFjZSA9IGZhbHNlLFxuICAgIGluc3BlY3RGb250ID0gbnVsbFxuICB9KSB7XG4gICAgdGhpcy5jb21waWxlZEdseXBocyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBpIGluIHRyYW5zbGF0ZWREYXRhKSB7XG4gICAgICB0aGlzW2ldID0gdHJhbnNsYXRlZERhdGFbaV07XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZUZvbnRGYWNlID0gZGlzYWJsZUZvbnRGYWNlID09PSB0cnVlO1xuICAgIHRoaXMuX2luc3BlY3RGb250ID0gaW5zcGVjdEZvbnQ7XG4gIH1cbiAgY3JlYXRlTmF0aXZlRm9udEZhY2UoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kaXNhYmxlRm9udEZhY2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgbmF0aXZlRm9udEZhY2U7XG4gICAgaWYgKCF0aGlzLmNzc0ZvbnRJbmZvKSB7XG4gICAgICBuYXRpdmVGb250RmFjZSA9IG5ldyBGb250RmFjZSh0aGlzLmxvYWRlZE5hbWUsIHRoaXMuZGF0YSwge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjc3MgPSB7XG4gICAgICAgIHdlaWdodDogdGhpcy5jc3NGb250SW5mby5mb250V2VpZ2h0XG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGUpIHtcbiAgICAgICAgY3NzLnN0eWxlID0gYG9ibGlxdWUgJHt0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlfWRlZ2A7XG4gICAgICB9XG4gICAgICBuYXRpdmVGb250RmFjZSA9IG5ldyBGb250RmFjZSh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHksIHRoaXMuZGF0YSwgY3NzKTtcbiAgICB9XG4gICAgdGhpcy5faW5zcGVjdEZvbnQ/Lih0aGlzKTtcbiAgICByZXR1cm4gbmF0aXZlRm9udEZhY2U7XG4gIH1cbiAgY3JlYXRlRm9udEZhY2VSdWxlKCkge1xuICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGlzYWJsZUZvbnRGYWNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGJ5dGVzVG9TdHJpbmcodGhpcy5kYXRhKTtcbiAgICBjb25zdCB1cmwgPSBgdXJsKGRhdGE6JHt0aGlzLm1pbWV0eXBlfTtiYXNlNjQsJHtidG9hKGRhdGEpfSk7YDtcbiAgICBsZXQgcnVsZTtcbiAgICBpZiAoIXRoaXMuY3NzRm9udEluZm8pIHtcbiAgICAgIHJ1bGUgPSBgQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XCIke3RoaXMubG9hZGVkTmFtZX1cIjtzcmM6JHt1cmx9fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBjc3MgPSBgZm9udC13ZWlnaHQ6ICR7dGhpcy5jc3NGb250SW5mby5mb250V2VpZ2h0fTtgO1xuICAgICAgaWYgKHRoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGUpIHtcbiAgICAgICAgY3NzICs9IGBmb250LXN0eWxlOiBvYmxpcXVlICR7dGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZX1kZWc7YDtcbiAgICAgIH1cbiAgICAgIHJ1bGUgPSBgQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XCIke3RoaXMuY3NzRm9udEluZm8uZm9udEZhbWlseX1cIjske2Nzc31zcmM6JHt1cmx9fWA7XG4gICAgfVxuICAgIHRoaXMuX2luc3BlY3RGb250Py4odGhpcywgdXJsKTtcbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuICBnZXRQYXRoR2VuZXJhdG9yKG9ianMsIGNoYXJhY3Rlcikge1xuICAgIGlmICh0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXTtcbiAgICB9XG4gICAgbGV0IGNtZHM7XG4gICAgdHJ5IHtcbiAgICAgIGNtZHMgPSBvYmpzLmdldCh0aGlzLmxvYWRlZE5hbWUgKyBcIl9wYXRoX1wiICsgY2hhcmFjdGVyKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgd2FybihgZ2V0UGF0aEdlbmVyYXRvciAtIGlnbm9yaW5nIGNoYXJhY3RlcjogXCIke2V4fVwiLmApO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY21kcykgfHwgY21kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBmdW5jdGlvbiAoYywgc2l6ZSkge307XG4gICAgfVxuICAgIGNvbnN0IGNvbW1hbmRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY21kcy5sZW5ndGg7IGkgPCBpaTspIHtcbiAgICAgIHN3aXRjaCAoY21kc1tpKytdKSB7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5CRVpJRVJfQ1VSVkVfVE86XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgW2EsIGIsIGMsIGQsIGUsIGZdID0gY21kcy5zbGljZShpLCBpICsgNik7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHguYmV6aWVyQ3VydmVUbyhhLCBiLCBjLCBkLCBlLCBmKSk7XG4gICAgICAgICAgICBpICs9IDY7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuTU9WRV9UTzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBbYSwgYl0gPSBjbWRzLnNsaWNlKGksIGkgKyAyKTtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goY3R4ID0+IGN0eC5tb3ZlVG8oYSwgYikpO1xuICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGb250UmVuZGVyT3BzLkxJTkVfVE86XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgW2EsIGJdID0gY21kcy5zbGljZShpLCBpICsgMik7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHgubGluZVRvKGEsIGIpKTtcbiAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5RVUFEUkFUSUNfQ1VSVkVfVE86XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgW2EsIGIsIGMsIGRdID0gY21kcy5zbGljZShpLCBpICsgNCk7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHgucXVhZHJhdGljQ3VydmVUbyhhLCBiLCBjLCBkKSk7XG4gICAgICAgICAgICBpICs9IDQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuUkVTVE9SRTpcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHgucmVzdG9yZSgpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGb250UmVuZGVyT3BzLlNBVkU6XG4gICAgICAgICAgY29tbWFuZHMucHVzaChjdHggPT4gY3R4LnNhdmUoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5TQ0FMRTpcbiAgICAgICAgICBhc3NlcnQoY29tbWFuZHMubGVuZ3RoID09PSAyLCBcIlNjYWxlIGNvbW1hbmQgaXMgb25seSB2YWxpZCBhdCB0aGUgdGhpcmQgcG9zaXRpb24uXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuVFJBTlNGT1JNOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IFthLCBiLCBjLCBkLCBlLCBmXSA9IGNtZHMuc2xpY2UoaSwgaSArIDYpO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChjdHggPT4gY3R4LnRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSk7XG4gICAgICAgICAgICBpICs9IDY7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuVFJBTlNMQVRFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IFthLCBiXSA9IGNtZHMuc2xpY2UoaSwgaSArIDIpO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChjdHggPT4gY3R4LnRyYW5zbGF0ZShhLCBiKSk7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdID0gZnVuY3Rpb24gZ2x5cGhEcmF3ZXIoY3R4LCBzaXplKSB7XG4gICAgICBjb21tYW5kc1swXShjdHgpO1xuICAgICAgY29tbWFuZHNbMV0oY3R4KTtcbiAgICAgIGN0eC5zY2FsZShzaXplLCAtc2l6ZSk7XG4gICAgICBmb3IgKGxldCBpID0gMiwgaWkgPSBjb21tYW5kcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbW1hbmRzW2ldKGN0eCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9ub2RlX3V0aWxzLmpzXG5cblxuaWYgKGlzTm9kZUpTKSB7XG4gIHZhciBwYWNrYWdlQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICB2YXIgcGFja2FnZU1hcCA9IG51bGw7XG4gIGNvbnN0IGxvYWRQYWNrYWdlcyA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydCggLyp3ZWJwYWNrSWdub3JlOiB0cnVlKi9cImZzXCIpLFxuICAgICAgaHR0cCA9IGF3YWl0IGltcG9ydCggLyp3ZWJwYWNrSWdub3JlOiB0cnVlKi9cImh0dHBcIiksXG4gICAgICBodHRwcyA9IGF3YWl0IGltcG9ydCggLyp3ZWJwYWNrSWdub3JlOiB0cnVlKi9cImh0dHBzXCIpLFxuICAgICAgdXJsID0gYXdhaXQgaW1wb3J0KCAvKndlYnBhY2tJZ25vcmU6IHRydWUqL1widXJsXCIpO1xuICAgIGxldCBjYW52YXMsIHBhdGgyZDtcbiAgICByZXR1cm4gbmV3IE1hcChPYmplY3QuZW50cmllcyh7XG4gICAgICBmcyxcbiAgICAgIGh0dHAsXG4gICAgICBodHRwcyxcbiAgICAgIHVybCxcbiAgICAgIGNhbnZhcyxcbiAgICAgIHBhdGgyZFxuICAgIH0pKTtcbiAgfTtcbiAgbG9hZFBhY2thZ2VzKCkudGhlbihtYXAgPT4ge1xuICAgIHBhY2thZ2VNYXAgPSBtYXA7XG4gICAgcGFja2FnZUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9LCByZWFzb24gPT4ge1xuICAgIHdhcm4oYGxvYWRQYWNrYWdlczogJHtyZWFzb259YCk7XG4gICAgcGFja2FnZU1hcCA9IG5ldyBNYXAoKTtcbiAgICBwYWNrYWdlQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH0pO1xufVxuY2xhc3MgTm9kZVBhY2thZ2VzIHtcbiAgc3RhdGljIGdldCBwcm9taXNlKCkge1xuICAgIHJldHVybiBwYWNrYWdlQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIHN0YXRpYyBnZXQobmFtZSkge1xuICAgIHJldHVybiBwYWNrYWdlTWFwPy5nZXQobmFtZSk7XG4gIH1cbn1cbmNvbnN0IG5vZGVfdXRpbHNfZmV0Y2hEYXRhID0gZnVuY3Rpb24gKHVybCkge1xuICBjb25zdCBmcyA9IE5vZGVQYWNrYWdlcy5nZXQoXCJmc1wiKTtcbiAgcmV0dXJuIGZzLnByb21pc2VzLnJlYWRGaWxlKHVybCkudGhlbihkYXRhID0+IG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbn07XG5jbGFzcyBOb2RlRmlsdGVyRmFjdG9yeSBleHRlbmRzIEJhc2VGaWx0ZXJGYWN0b3J5IHt9XG5jbGFzcyBOb2RlQ2FudmFzRmFjdG9yeSBleHRlbmRzIEJhc2VDYW52YXNGYWN0b3J5IHtcbiAgX2NyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgY2FudmFzID0gTm9kZVBhY2thZ2VzLmdldChcImNhbnZhc1wiKTtcbiAgICByZXR1cm4gY2FudmFzLmNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgfVxufVxuY2xhc3MgTm9kZUNNYXBSZWFkZXJGYWN0b3J5IGV4dGVuZHMgQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHtcbiAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuICAgIHJldHVybiBub2RlX3V0aWxzX2ZldGNoRGF0YSh1cmwpLnRoZW4oZGF0YSA9PiAoe1xuICAgICAgY01hcERhdGE6IGRhdGEsXG4gICAgICBjb21wcmVzc2lvblR5cGVcbiAgICB9KSk7XG4gIH1cbn1cbmNsYXNzIE5vZGVTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBleHRlbmRzIEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG4gIF9mZXRjaERhdGEodXJsKSB7XG4gICAgcmV0dXJuIG5vZGVfdXRpbHNfZmV0Y2hEYXRhKHVybCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvcGF0dGVybl9oZWxwZXIuanNcblxuXG5jb25zdCBQYXRoVHlwZSA9IHtcbiAgRklMTDogXCJGaWxsXCIsXG4gIFNUUk9LRTogXCJTdHJva2VcIixcbiAgU0hBRElORzogXCJTaGFkaW5nXCJcbn07XG5mdW5jdGlvbiBhcHBseUJvdW5kaW5nQm94KGN0eCwgYmJveCkge1xuICBpZiAoIWJib3gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgd2lkdGggPSBiYm94WzJdIC0gYmJveFswXTtcbiAgY29uc3QgaGVpZ2h0ID0gYmJveFszXSAtIGJib3hbMV07XG4gIGNvbnN0IHJlZ2lvbiA9IG5ldyBQYXRoMkQoKTtcbiAgcmVnaW9uLnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7XG4gIGN0eC5jbGlwKHJlZ2lvbik7XG59XG5jbGFzcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVNoYWRpbmdQYXR0ZXJuKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTaGFkaW5nUGF0dGVybi5cIik7XG4gICAgfVxuICB9XG4gIGdldFBhdHRlcm4oKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYGdldFBhdHRlcm5gIGNhbGxlZC5cIik7XG4gIH1cbn1cbmNsYXNzIFJhZGlhbEF4aWFsU2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICBjb25zdHJ1Y3RvcihJUikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdHlwZSA9IElSWzFdO1xuICAgIHRoaXMuX2Jib3ggPSBJUlsyXTtcbiAgICB0aGlzLl9jb2xvclN0b3BzID0gSVJbM107XG4gICAgdGhpcy5fcDAgPSBJUls0XTtcbiAgICB0aGlzLl9wMSA9IElSWzVdO1xuICAgIHRoaXMuX3IwID0gSVJbNl07XG4gICAgdGhpcy5fcjEgPSBJUls3XTtcbiAgICB0aGlzLm1hdHJpeCA9IG51bGw7XG4gIH1cbiAgX2NyZWF0ZUdyYWRpZW50KGN0eCkge1xuICAgIGxldCBncmFkO1xuICAgIGlmICh0aGlzLl90eXBlID09PSBcImF4aWFsXCIpIHtcbiAgICAgIGdyYWQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQodGhpcy5fcDBbMF0sIHRoaXMuX3AwWzFdLCB0aGlzLl9wMVswXSwgdGhpcy5fcDFbMV0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gXCJyYWRpYWxcIikge1xuICAgICAgZ3JhZCA9IGN0eC5jcmVhdGVSYWRpYWxHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3IwLCB0aGlzLl9wMVswXSwgdGhpcy5fcDFbMV0sIHRoaXMuX3IxKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjb2xvclN0b3Agb2YgdGhpcy5fY29sb3JTdG9wcykge1xuICAgICAgZ3JhZC5hZGRDb2xvclN0b3AoY29sb3JTdG9wWzBdLCBjb2xvclN0b3BbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZ3JhZDtcbiAgfVxuICBnZXRQYXR0ZXJuKGN0eCwgb3duZXIsIGludmVyc2UsIHBhdGhUeXBlKSB7XG4gICAgbGV0IHBhdHRlcm47XG4gICAgaWYgKHBhdGhUeXBlID09PSBQYXRoVHlwZS5TVFJPS0UgfHwgcGF0aFR5cGUgPT09IFBhdGhUeXBlLkZJTEwpIHtcbiAgICAgIGNvbnN0IG93bmVyQkJveCA9IG93bmVyLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveChwYXRoVHlwZSwgZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpKSB8fCBbMCwgMCwgMCwgMF07XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChvd25lckJCb3hbMl0gLSBvd25lckJCb3hbMF0pIHx8IDE7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmNlaWwob3duZXJCQm94WzNdIC0gb3duZXJCQm94WzFdKSB8fCAxO1xuICAgICAgY29uc3QgdG1wQ2FudmFzID0gb3duZXIuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwicGF0dGVyblwiLCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcbiAgICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgdG1wQ3R4LmNsZWFyUmVjdCgwLCAwLCB0bXBDdHguY2FudmFzLndpZHRoLCB0bXBDdHguY2FudmFzLmhlaWdodCk7XG4gICAgICB0bXBDdHguYmVnaW5QYXRoKCk7XG4gICAgICB0bXBDdHgucmVjdCgwLCAwLCB0bXBDdHguY2FudmFzLndpZHRoLCB0bXBDdHguY2FudmFzLmhlaWdodCk7XG4gICAgICB0bXBDdHgudHJhbnNsYXRlKC1vd25lckJCb3hbMF0sIC1vd25lckJCb3hbMV0pO1xuICAgICAgaW52ZXJzZSA9IFV0aWwudHJhbnNmb3JtKGludmVyc2UsIFsxLCAwLCAwLCAxLCBvd25lckJCb3hbMF0sIG93bmVyQkJveFsxXV0pO1xuICAgICAgdG1wQ3R4LnRyYW5zZm9ybSguLi5vd25lci5iYXNlVHJhbnNmb3JtKTtcbiAgICAgIGlmICh0aGlzLm1hdHJpeCkge1xuICAgICAgICB0bXBDdHgudHJhbnNmb3JtKC4uLnRoaXMubWF0cml4KTtcbiAgICAgIH1cbiAgICAgIGFwcGx5Qm91bmRpbmdCb3godG1wQ3R4LCB0aGlzLl9iYm94KTtcbiAgICAgIHRtcEN0eC5maWxsU3R5bGUgPSB0aGlzLl9jcmVhdGVHcmFkaWVudCh0bXBDdHgpO1xuICAgICAgdG1wQ3R4LmZpbGwoKTtcbiAgICAgIHBhdHRlcm4gPSBjdHguY3JlYXRlUGF0dGVybih0bXBDYW52YXMuY2FudmFzLCBcIm5vLXJlcGVhdFwiKTtcbiAgICAgIGNvbnN0IGRvbU1hdHJpeCA9IG5ldyBET01NYXRyaXgoaW52ZXJzZSk7XG4gICAgICBwYXR0ZXJuLnNldFRyYW5zZm9ybShkb21NYXRyaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBseUJvdW5kaW5nQm94KGN0eCwgdGhpcy5fYmJveCk7XG4gICAgICBwYXR0ZXJuID0gdGhpcy5fY3JlYXRlR3JhZGllbnQoY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm47XG4gIH1cbn1cbmZ1bmN0aW9uIGRyYXdUcmlhbmdsZShkYXRhLCBjb250ZXh0LCBwMSwgcDIsIHAzLCBjMSwgYzIsIGMzKSB7XG4gIGNvbnN0IGNvb3JkcyA9IGNvbnRleHQuY29vcmRzLFxuICAgIGNvbG9ycyA9IGNvbnRleHQuY29sb3JzO1xuICBjb25zdCBieXRlcyA9IGRhdGEuZGF0YSxcbiAgICByb3dTaXplID0gZGF0YS53aWR0aCAqIDQ7XG4gIGxldCB0bXA7XG4gIGlmIChjb29yZHNbcDEgKyAxXSA+IGNvb3Jkc1twMiArIDFdKSB7XG4gICAgdG1wID0gcDE7XG4gICAgcDEgPSBwMjtcbiAgICBwMiA9IHRtcDtcbiAgICB0bXAgPSBjMTtcbiAgICBjMSA9IGMyO1xuICAgIGMyID0gdG1wO1xuICB9XG4gIGlmIChjb29yZHNbcDIgKyAxXSA+IGNvb3Jkc1twMyArIDFdKSB7XG4gICAgdG1wID0gcDI7XG4gICAgcDIgPSBwMztcbiAgICBwMyA9IHRtcDtcbiAgICB0bXAgPSBjMjtcbiAgICBjMiA9IGMzO1xuICAgIGMzID0gdG1wO1xuICB9XG4gIGlmIChjb29yZHNbcDEgKyAxXSA+IGNvb3Jkc1twMiArIDFdKSB7XG4gICAgdG1wID0gcDE7XG4gICAgcDEgPSBwMjtcbiAgICBwMiA9IHRtcDtcbiAgICB0bXAgPSBjMTtcbiAgICBjMSA9IGMyO1xuICAgIGMyID0gdG1wO1xuICB9XG4gIGNvbnN0IHgxID0gKGNvb3Jkc1twMV0gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7XG4gIGNvbnN0IHkxID0gKGNvb3Jkc1twMSArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZO1xuICBjb25zdCB4MiA9IChjb29yZHNbcDJdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYO1xuICBjb25zdCB5MiA9IChjb29yZHNbcDIgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTtcbiAgY29uc3QgeDMgPSAoY29vcmRzW3AzXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDtcbiAgY29uc3QgeTMgPSAoY29vcmRzW3AzICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7XG4gIGlmICh5MSA+PSB5Mykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjMXIgPSBjb2xvcnNbYzFdLFxuICAgIGMxZyA9IGNvbG9yc1tjMSArIDFdLFxuICAgIGMxYiA9IGNvbG9yc1tjMSArIDJdO1xuICBjb25zdCBjMnIgPSBjb2xvcnNbYzJdLFxuICAgIGMyZyA9IGNvbG9yc1tjMiArIDFdLFxuICAgIGMyYiA9IGNvbG9yc1tjMiArIDJdO1xuICBjb25zdCBjM3IgPSBjb2xvcnNbYzNdLFxuICAgIGMzZyA9IGNvbG9yc1tjMyArIDFdLFxuICAgIGMzYiA9IGNvbG9yc1tjMyArIDJdO1xuICBjb25zdCBtaW5ZID0gTWF0aC5yb3VuZCh5MSksXG4gICAgbWF4WSA9IE1hdGgucm91bmQoeTMpO1xuICBsZXQgeGEsIGNhciwgY2FnLCBjYWI7XG4gIGxldCB4YiwgY2JyLCBjYmcsIGNiYjtcbiAgZm9yIChsZXQgeSA9IG1pblk7IHkgPD0gbWF4WTsgeSsrKSB7XG4gICAgaWYgKHkgPCB5Mikge1xuICAgICAgY29uc3QgayA9IHkgPCB5MSA/IDAgOiAoeTEgLSB5KSAvICh5MSAtIHkyKTtcbiAgICAgIHhhID0geDEgLSAoeDEgLSB4MikgKiBrO1xuICAgICAgY2FyID0gYzFyIC0gKGMxciAtIGMycikgKiBrO1xuICAgICAgY2FnID0gYzFnIC0gKGMxZyAtIGMyZykgKiBrO1xuICAgICAgY2FiID0gYzFiIC0gKGMxYiAtIGMyYikgKiBrO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaztcbiAgICAgIGlmICh5ID4geTMpIHtcbiAgICAgICAgayA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHkyID09PSB5Mykge1xuICAgICAgICBrID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGsgPSAoeTIgLSB5KSAvICh5MiAtIHkzKTtcbiAgICAgIH1cbiAgICAgIHhhID0geDIgLSAoeDIgLSB4MykgKiBrO1xuICAgICAgY2FyID0gYzJyIC0gKGMyciAtIGMzcikgKiBrO1xuICAgICAgY2FnID0gYzJnIC0gKGMyZyAtIGMzZykgKiBrO1xuICAgICAgY2FiID0gYzJiIC0gKGMyYiAtIGMzYikgKiBrO1xuICAgIH1cbiAgICBsZXQgaztcbiAgICBpZiAoeSA8IHkxKSB7XG4gICAgICBrID0gMDtcbiAgICB9IGVsc2UgaWYgKHkgPiB5Mykge1xuICAgICAgayA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGsgPSAoeTEgLSB5KSAvICh5MSAtIHkzKTtcbiAgICB9XG4gICAgeGIgPSB4MSAtICh4MSAtIHgzKSAqIGs7XG4gICAgY2JyID0gYzFyIC0gKGMxciAtIGMzcikgKiBrO1xuICAgIGNiZyA9IGMxZyAtIChjMWcgLSBjM2cpICogaztcbiAgICBjYmIgPSBjMWIgLSAoYzFiIC0gYzNiKSAqIGs7XG4gICAgY29uc3QgeDFfID0gTWF0aC5yb3VuZChNYXRoLm1pbih4YSwgeGIpKTtcbiAgICBjb25zdCB4Ml8gPSBNYXRoLnJvdW5kKE1hdGgubWF4KHhhLCB4YikpO1xuICAgIGxldCBqID0gcm93U2l6ZSAqIHkgKyB4MV8gKiA0O1xuICAgIGZvciAobGV0IHggPSB4MV87IHggPD0geDJfOyB4KyspIHtcbiAgICAgIGsgPSAoeGEgLSB4KSAvICh4YSAtIHhiKTtcbiAgICAgIGlmIChrIDwgMCkge1xuICAgICAgICBrID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoayA+IDEpIHtcbiAgICAgICAgayA9IDE7XG4gICAgICB9XG4gICAgICBieXRlc1tqKytdID0gY2FyIC0gKGNhciAtIGNicikgKiBrIHwgMDtcbiAgICAgIGJ5dGVzW2orK10gPSBjYWcgLSAoY2FnIC0gY2JnKSAqIGsgfCAwO1xuICAgICAgYnl0ZXNbaisrXSA9IGNhYiAtIChjYWIgLSBjYmIpICogayB8IDA7XG4gICAgICBieXRlc1tqKytdID0gMjU1O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZHJhd0ZpZ3VyZShkYXRhLCBmaWd1cmUsIGNvbnRleHQpIHtcbiAgY29uc3QgcHMgPSBmaWd1cmUuY29vcmRzO1xuICBjb25zdCBjcyA9IGZpZ3VyZS5jb2xvcnM7XG4gIGxldCBpLCBpaTtcbiAgc3dpdGNoIChmaWd1cmUudHlwZSkge1xuICAgIGNhc2UgXCJsYXR0aWNlXCI6XG4gICAgICBjb25zdCB2ZXJ0aWNlc1BlclJvdyA9IGZpZ3VyZS52ZXJ0aWNlc1BlclJvdztcbiAgICAgIGNvbnN0IHJvd3MgPSBNYXRoLmZsb29yKHBzLmxlbmd0aCAvIHZlcnRpY2VzUGVyUm93KSAtIDE7XG4gICAgICBjb25zdCBjb2xzID0gdmVydGljZXNQZXJSb3cgLSAxO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgICBsZXQgcSA9IGkgKiB2ZXJ0aWNlc1BlclJvdztcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzOyBqKyssIHErKykge1xuICAgICAgICAgIGRyYXdUcmlhbmdsZShkYXRhLCBjb250ZXh0LCBwc1txXSwgcHNbcSArIDFdLCBwc1txICsgdmVydGljZXNQZXJSb3ddLCBjc1txXSwgY3NbcSArIDFdLCBjc1txICsgdmVydGljZXNQZXJSb3ddKTtcbiAgICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbcSArIHZlcnRpY2VzUGVyUm93ICsgMV0sIHBzW3EgKyAxXSwgcHNbcSArIHZlcnRpY2VzUGVyUm93XSwgY3NbcSArIHZlcnRpY2VzUGVyUm93ICsgMV0sIGNzW3EgKyAxXSwgY3NbcSArIHZlcnRpY2VzUGVyUm93XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ0cmlhbmdsZXNcIjpcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gcHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMykge1xuICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbaV0sIHBzW2kgKyAxXSwgcHNbaSArIDJdLCBjc1tpXSwgY3NbaSArIDFdLCBjc1tpICsgMl0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgZmlndXJlXCIpO1xuICB9XG59XG5jbGFzcyBNZXNoU2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICBjb25zdHJ1Y3RvcihJUikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29vcmRzID0gSVJbMl07XG4gICAgdGhpcy5fY29sb3JzID0gSVJbM107XG4gICAgdGhpcy5fZmlndXJlcyA9IElSWzRdO1xuICAgIHRoaXMuX2JvdW5kcyA9IElSWzVdO1xuICAgIHRoaXMuX2Jib3ggPSBJUls3XTtcbiAgICB0aGlzLl9iYWNrZ3JvdW5kID0gSVJbOF07XG4gICAgdGhpcy5tYXRyaXggPSBudWxsO1xuICB9XG4gIF9jcmVhdGVNZXNoQ2FudmFzKGNvbWJpbmVkU2NhbGUsIGJhY2tncm91bmRDb2xvciwgY2FjaGVkQ2FudmFzZXMpIHtcbiAgICBjb25zdCBFWFBFQ1RFRF9TQ0FMRSA9IDEuMTtcbiAgICBjb25zdCBNQVhfUEFUVEVSTl9TSVpFID0gMzAwMDtcbiAgICBjb25zdCBCT1JERVJfU0laRSA9IDI7XG4gICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGguZmxvb3IodGhpcy5fYm91bmRzWzBdKTtcbiAgICBjb25zdCBvZmZzZXRZID0gTWF0aC5mbG9vcih0aGlzLl9ib3VuZHNbMV0pO1xuICAgIGNvbnN0IGJvdW5kc1dpZHRoID0gTWF0aC5jZWlsKHRoaXMuX2JvdW5kc1syXSkgLSBvZmZzZXRYO1xuICAgIGNvbnN0IGJvdW5kc0hlaWdodCA9IE1hdGguY2VpbCh0aGlzLl9ib3VuZHNbM10pIC0gb2Zmc2V0WTtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWluKE1hdGguY2VpbChNYXRoLmFicyhib3VuZHNXaWR0aCAqIGNvbWJpbmVkU2NhbGVbMF0gKiBFWFBFQ1RFRF9TQ0FMRSkpLCBNQVhfUEFUVEVSTl9TSVpFKTtcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihNYXRoLmNlaWwoTWF0aC5hYnMoYm91bmRzSGVpZ2h0ICogY29tYmluZWRTY2FsZVsxXSAqIEVYUEVDVEVEX1NDQUxFKSksIE1BWF9QQVRURVJOX1NJWkUpO1xuICAgIGNvbnN0IHNjYWxlWCA9IGJvdW5kc1dpZHRoIC8gd2lkdGg7XG4gICAgY29uc3Qgc2NhbGVZID0gYm91bmRzSGVpZ2h0IC8gaGVpZ2h0O1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBjb29yZHM6IHRoaXMuX2Nvb3JkcyxcbiAgICAgIGNvbG9yczogdGhpcy5fY29sb3JzLFxuICAgICAgb2Zmc2V0WDogLW9mZnNldFgsXG4gICAgICBvZmZzZXRZOiAtb2Zmc2V0WSxcbiAgICAgIHNjYWxlWDogMSAvIHNjYWxlWCxcbiAgICAgIHNjYWxlWTogMSAvIHNjYWxlWVxuICAgIH07XG4gICAgY29uc3QgcGFkZGVkV2lkdGggPSB3aWR0aCArIEJPUkRFUl9TSVpFICogMjtcbiAgICBjb25zdCBwYWRkZWRIZWlnaHQgPSBoZWlnaHQgKyBCT1JERVJfU0laRSAqIDI7XG4gICAgY29uc3QgdG1wQ2FudmFzID0gY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwibWVzaFwiLCBwYWRkZWRXaWR0aCwgcGFkZGVkSGVpZ2h0LCBmYWxzZSk7XG4gICAgY29uc3QgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgY29uc3QgZGF0YSA9IHRtcEN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG4gICAgaWYgKGJhY2tncm91bmRDb2xvcikge1xuICAgICAgY29uc3QgYnl0ZXMgPSBkYXRhLmRhdGE7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSA0KSB7XG4gICAgICAgIGJ5dGVzW2ldID0gYmFja2dyb3VuZENvbG9yWzBdO1xuICAgICAgICBieXRlc1tpICsgMV0gPSBiYWNrZ3JvdW5kQ29sb3JbMV07XG4gICAgICAgIGJ5dGVzW2kgKyAyXSA9IGJhY2tncm91bmRDb2xvclsyXTtcbiAgICAgICAgYnl0ZXNbaSArIDNdID0gMjU1O1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpZ3VyZSBvZiB0aGlzLl9maWd1cmVzKSB7XG4gICAgICBkcmF3RmlndXJlKGRhdGEsIGZpZ3VyZSwgY29udGV4dCk7XG4gICAgfVxuICAgIHRtcEN0eC5wdXRJbWFnZURhdGEoZGF0YSwgQk9SREVSX1NJWkUsIEJPUkRFUl9TSVpFKTtcbiAgICBjb25zdCBjYW52YXMgPSB0bXBDYW52YXMuY2FudmFzO1xuICAgIHJldHVybiB7XG4gICAgICBjYW52YXMsXG4gICAgICBvZmZzZXRYOiBvZmZzZXRYIC0gQk9SREVSX1NJWkUgKiBzY2FsZVgsXG4gICAgICBvZmZzZXRZOiBvZmZzZXRZIC0gQk9SREVSX1NJWkUgKiBzY2FsZVksXG4gICAgICBzY2FsZVgsXG4gICAgICBzY2FsZVlcbiAgICB9O1xuICB9XG4gIGdldFBhdHRlcm4oY3R4LCBvd25lciwgaW52ZXJzZSwgcGF0aFR5cGUpIHtcbiAgICBhcHBseUJvdW5kaW5nQm94KGN0eCwgdGhpcy5fYmJveCk7XG4gICAgbGV0IHNjYWxlO1xuICAgIGlmIChwYXRoVHlwZSA9PT0gUGF0aFR5cGUuU0hBRElORykge1xuICAgICAgc2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShvd25lci5iYXNlVHJhbnNmb3JtKTtcbiAgICAgIGlmICh0aGlzLm1hdHJpeCkge1xuICAgICAgICBjb25zdCBtYXRyaXhTY2FsZSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5tYXRyaXgpO1xuICAgICAgICBzY2FsZSA9IFtzY2FsZVswXSAqIG1hdHJpeFNjYWxlWzBdLCBzY2FsZVsxXSAqIG1hdHJpeFNjYWxlWzFdXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcyA9IHRoaXMuX2NyZWF0ZU1lc2hDYW52YXMoc2NhbGUsIHBhdGhUeXBlID09PSBQYXRoVHlwZS5TSEFESU5HID8gbnVsbCA6IHRoaXMuX2JhY2tncm91bmQsIG93bmVyLmNhY2hlZENhbnZhc2VzKTtcbiAgICBpZiAocGF0aFR5cGUgIT09IFBhdGhUeXBlLlNIQURJTkcpIHtcbiAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oLi4ub3duZXIuYmFzZVRyYW5zZm9ybSk7XG4gICAgICBpZiAodGhpcy5tYXRyaXgpIHtcbiAgICAgICAgY3R4LnRyYW5zZm9ybSguLi50aGlzLm1hdHJpeCk7XG4gICAgICB9XG4gICAgfVxuICAgIGN0eC50cmFuc2xhdGUodGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLm9mZnNldFkpO1xuICAgIGN0eC5zY2FsZSh0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWCwgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5zY2FsZVkpO1xuICAgIHJldHVybiBjdHguY3JlYXRlUGF0dGVybih0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLmNhbnZhcywgXCJuby1yZXBlYXRcIik7XG4gIH1cbn1cbmNsYXNzIER1bW15U2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICBnZXRQYXR0ZXJuKCkge1xuICAgIHJldHVybiBcImhvdHBpbmtcIjtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm4oSVIpIHtcbiAgc3dpdGNoIChJUlswXSkge1xuICAgIGNhc2UgXCJSYWRpYWxBeGlhbFwiOlxuICAgICAgcmV0dXJuIG5ldyBSYWRpYWxBeGlhbFNoYWRpbmdQYXR0ZXJuKElSKTtcbiAgICBjYXNlIFwiTWVzaFwiOlxuICAgICAgcmV0dXJuIG5ldyBNZXNoU2hhZGluZ1BhdHRlcm4oSVIpO1xuICAgIGNhc2UgXCJEdW1teVwiOlxuICAgICAgcmV0dXJuIG5ldyBEdW1teVNoYWRpbmdQYXR0ZXJuKCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIElSIHR5cGU6ICR7SVJbMF19YCk7XG59XG5jb25zdCBQYWludFR5cGUgPSB7XG4gIENPTE9SRUQ6IDEsXG4gIFVOQ09MT1JFRDogMlxufTtcbmNsYXNzIFRpbGluZ1BhdHRlcm4ge1xuICBzdGF0aWMgTUFYX1BBVFRFUk5fU0laRSA9IDMwMDA7XG4gIGNvbnN0cnVjdG9yKElSLCBjb2xvciwgY3R4LCBjYW52YXNHcmFwaGljc0ZhY3RvcnksIGJhc2VUcmFuc2Zvcm0pIHtcbiAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IElSWzJdO1xuICAgIHRoaXMubWF0cml4ID0gSVJbM107XG4gICAgdGhpcy5iYm94ID0gSVJbNF07XG4gICAgdGhpcy54c3RlcCA9IElSWzVdO1xuICAgIHRoaXMueXN0ZXAgPSBJUls2XTtcbiAgICB0aGlzLnBhaW50VHlwZSA9IElSWzddO1xuICAgIHRoaXMudGlsaW5nVHlwZSA9IElSWzhdO1xuICAgIHRoaXMuY29sb3IgPSBjb2xvcjtcbiAgICB0aGlzLmN0eCA9IGN0eDtcbiAgICB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IGNhbnZhc0dyYXBoaWNzRmFjdG9yeTtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSBiYXNlVHJhbnNmb3JtO1xuICB9XG4gIGNyZWF0ZVBhdHRlcm5DYW52YXMob3duZXIpIHtcbiAgICBjb25zdCBvcGVyYXRvckxpc3QgPSB0aGlzLm9wZXJhdG9yTGlzdDtcbiAgICBjb25zdCBiYm94ID0gdGhpcy5iYm94O1xuICAgIGNvbnN0IHhzdGVwID0gdGhpcy54c3RlcDtcbiAgICBjb25zdCB5c3RlcCA9IHRoaXMueXN0ZXA7XG4gICAgY29uc3QgcGFpbnRUeXBlID0gdGhpcy5wYWludFR5cGU7XG4gICAgY29uc3QgdGlsaW5nVHlwZSA9IHRoaXMudGlsaW5nVHlwZTtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3I7XG4gICAgY29uc3QgY2FudmFzR3JhcGhpY3NGYWN0b3J5ID0gdGhpcy5jYW52YXNHcmFwaGljc0ZhY3Rvcnk7XG4gICAgaW5mbyhcIlRpbGluZ1R5cGU6IFwiICsgdGlsaW5nVHlwZSk7XG4gICAgY29uc3QgeDAgPSBiYm94WzBdLFxuICAgICAgeTAgPSBiYm94WzFdLFxuICAgICAgeDEgPSBiYm94WzJdLFxuICAgICAgeTEgPSBiYm94WzNdO1xuICAgIGNvbnN0IG1hdHJpeFNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7XG4gICAgY29uc3QgY3VyTWF0cml4U2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMuYmFzZVRyYW5zZm9ybSk7XG4gICAgY29uc3QgY29tYmluZWRTY2FsZSA9IFttYXRyaXhTY2FsZVswXSAqIGN1ck1hdHJpeFNjYWxlWzBdLCBtYXRyaXhTY2FsZVsxXSAqIGN1ck1hdHJpeFNjYWxlWzFdXTtcbiAgICBjb25zdCBkaW14ID0gdGhpcy5nZXRTaXplQW5kU2NhbGUoeHN0ZXAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgY29tYmluZWRTY2FsZVswXSk7XG4gICAgY29uc3QgZGlteSA9IHRoaXMuZ2V0U2l6ZUFuZFNjYWxlKHlzdGVwLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0LCBjb21iaW5lZFNjYWxlWzFdKTtcbiAgICBjb25zdCB0bXBDYW52YXMgPSBvd25lci5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJwYXR0ZXJuXCIsIGRpbXguc2l6ZSwgZGlteS5zaXplLCB0cnVlKTtcbiAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICBjb25zdCBncmFwaGljcyA9IGNhbnZhc0dyYXBoaWNzRmFjdG9yeS5jcmVhdGVDYW52YXNHcmFwaGljcyh0bXBDdHgpO1xuICAgIGdyYXBoaWNzLmdyb3VwTGV2ZWwgPSBvd25lci5ncm91cExldmVsO1xuICAgIHRoaXMuc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0KGdyYXBoaWNzLCBwYWludFR5cGUsIGNvbG9yKTtcbiAgICBsZXQgYWRqdXN0ZWRYMCA9IHgwO1xuICAgIGxldCBhZGp1c3RlZFkwID0geTA7XG4gICAgbGV0IGFkanVzdGVkWDEgPSB4MTtcbiAgICBsZXQgYWRqdXN0ZWRZMSA9IHkxO1xuICAgIGlmICh4MCA8IDApIHtcbiAgICAgIGFkanVzdGVkWDAgPSAwO1xuICAgICAgYWRqdXN0ZWRYMSArPSBNYXRoLmFicyh4MCk7XG4gICAgfVxuICAgIGlmICh5MCA8IDApIHtcbiAgICAgIGFkanVzdGVkWTAgPSAwO1xuICAgICAgYWRqdXN0ZWRZMSArPSBNYXRoLmFicyh5MCk7XG4gICAgfVxuICAgIHRtcEN0eC50cmFuc2xhdGUoLShkaW14LnNjYWxlICogYWRqdXN0ZWRYMCksIC0oZGlteS5zY2FsZSAqIGFkanVzdGVkWTApKTtcbiAgICBncmFwaGljcy50cmFuc2Zvcm0oZGlteC5zY2FsZSwgMCwgMCwgZGlteS5zY2FsZSwgMCwgMCk7XG4gICAgdG1wQ3R4LnNhdmUoKTtcbiAgICB0aGlzLmNsaXBCYm94KGdyYXBoaWNzLCBhZGp1c3RlZFgwLCBhZGp1c3RlZFkwLCBhZGp1c3RlZFgxLCBhZGp1c3RlZFkxKTtcbiAgICBncmFwaGljcy5iYXNlVHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybShncmFwaGljcy5jdHgpO1xuICAgIGdyYXBoaWNzLmV4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0KTtcbiAgICBncmFwaGljcy5lbmREcmF3aW5nKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbnZhczogdG1wQ2FudmFzLmNhbnZhcyxcbiAgICAgIHNjYWxlWDogZGlteC5zY2FsZSxcbiAgICAgIHNjYWxlWTogZGlteS5zY2FsZSxcbiAgICAgIG9mZnNldFg6IGFkanVzdGVkWDAsXG4gICAgICBvZmZzZXRZOiBhZGp1c3RlZFkwXG4gICAgfTtcbiAgfVxuICBnZXRTaXplQW5kU2NhbGUoc3RlcCwgcmVhbE91dHB1dFNpemUsIHNjYWxlKSB7XG4gICAgc3RlcCA9IE1hdGguYWJzKHN0ZXApO1xuICAgIGNvbnN0IG1heFNpemUgPSBNYXRoLm1heChUaWxpbmdQYXR0ZXJuLk1BWF9QQVRURVJOX1NJWkUsIHJlYWxPdXRwdXRTaXplKTtcbiAgICBsZXQgc2l6ZSA9IE1hdGguY2VpbChzdGVwICogc2NhbGUpO1xuICAgIGlmIChzaXplID49IG1heFNpemUpIHtcbiAgICAgIHNpemUgPSBtYXhTaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2FsZSA9IHNpemUgLyBzdGVwO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGUsXG4gICAgICBzaXplXG4gICAgfTtcbiAgfVxuICBjbGlwQmJveChncmFwaGljcywgeDAsIHkwLCB4MSwgeTEpIHtcbiAgICBjb25zdCBiYm94V2lkdGggPSB4MSAtIHgwO1xuICAgIGNvbnN0IGJib3hIZWlnaHQgPSB5MSAtIHkwO1xuICAgIGdyYXBoaWNzLmN0eC5yZWN0KHgwLCB5MCwgYmJveFdpZHRoLCBiYm94SGVpZ2h0KTtcbiAgICBncmFwaGljcy5jdXJyZW50LnVwZGF0ZVJlY3RNaW5NYXgoZ2V0Q3VycmVudFRyYW5zZm9ybShncmFwaGljcy5jdHgpLCBbeDAsIHkwLCB4MSwgeTFdKTtcbiAgICBncmFwaGljcy5jbGlwKCk7XG4gICAgZ3JhcGhpY3MuZW5kUGF0aCgpO1xuICB9XG4gIHNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChncmFwaGljcywgcGFpbnRUeXBlLCBjb2xvcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBncmFwaGljcy5jdHgsXG4gICAgICBjdXJyZW50ID0gZ3JhcGhpY3MuY3VycmVudDtcbiAgICBzd2l0Y2ggKHBhaW50VHlwZSkge1xuICAgICAgY2FzZSBQYWludFR5cGUuQ09MT1JFRDpcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGN0eC5zdHJva2VTdHlsZTtcbiAgICAgICAgY3VycmVudC5maWxsQ29sb3IgPSBjdHguZmlsbFN0eWxlO1xuICAgICAgICBjdXJyZW50LnN0cm9rZUNvbG9yID0gY3R4LnN0cm9rZVN0eWxlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUGFpbnRUeXBlLlVOQ09MT1JFRDpcbiAgICAgICAgY29uc3QgY3NzQ29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvcihjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBjc3NDb2xvcjtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGNzc0NvbG9yO1xuICAgICAgICBjdXJyZW50LmZpbGxDb2xvciA9IGNzc0NvbG9yO1xuICAgICAgICBjdXJyZW50LnN0cm9rZUNvbG9yID0gY3NzQ29sb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbnN1cHBvcnRlZCBwYWludCB0eXBlOiAke3BhaW50VHlwZX1gKTtcbiAgICB9XG4gIH1cbiAgZ2V0UGF0dGVybihjdHgsIG93bmVyLCBpbnZlcnNlLCBwYXRoVHlwZSkge1xuICAgIGxldCBtYXRyaXggPSBpbnZlcnNlO1xuICAgIGlmIChwYXRoVHlwZSAhPT0gUGF0aFR5cGUuU0hBRElORykge1xuICAgICAgbWF0cml4ID0gVXRpbC50cmFuc2Zvcm0obWF0cml4LCBvd25lci5iYXNlVHJhbnNmb3JtKTtcbiAgICAgIGlmICh0aGlzLm1hdHJpeCkge1xuICAgICAgICBtYXRyaXggPSBVdGlsLnRyYW5zZm9ybShtYXRyaXgsIHRoaXMubWF0cml4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcyA9IHRoaXMuY3JlYXRlUGF0dGVybkNhbnZhcyhvd25lcik7XG4gICAgbGV0IGRvbU1hdHJpeCA9IG5ldyBET01NYXRyaXgobWF0cml4KTtcbiAgICBkb21NYXRyaXggPSBkb21NYXRyaXgudHJhbnNsYXRlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WCwgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRZKTtcbiAgICBkb21NYXRyaXggPSBkb21NYXRyaXguc2NhbGUoMSAvIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVYLCAxIC8gdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5zY2FsZVkpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSBjdHguY3JlYXRlUGF0dGVybih0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLmNhbnZhcywgXCJyZXBlYXRcIik7XG4gICAgcGF0dGVybi5zZXRUcmFuc2Zvcm0oZG9tTWF0cml4KTtcbiAgICByZXR1cm4gcGF0dGVybjtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvc2hhcmVkL2ltYWdlX3V0aWxzLmpzXG5cbmZ1bmN0aW9uIGNvbnZlcnRUb1JHQkEocGFyYW1zKSB7XG4gIHN3aXRjaCAocGFyYW1zLmtpbmQpIHtcbiAgICBjYXNlIEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDpcbiAgICAgIHJldHVybiBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQShwYXJhbXMpO1xuICAgIGNhc2UgSW1hZ2VLaW5kLlJHQl8yNEJQUDpcbiAgICAgIHJldHVybiBjb252ZXJ0UkdCVG9SR0JBKHBhcmFtcyk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQSh7XG4gIHNyYyxcbiAgc3JjUG9zID0gMCxcbiAgZGVzdCxcbiAgd2lkdGgsXG4gIGhlaWdodCxcbiAgbm9uQmxhY2tDb2xvciA9IDB4ZmZmZmZmZmYsXG4gIGludmVyc2VEZWNvZGUgPSBmYWxzZVxufSkge1xuICBjb25zdCBibGFjayA9IHV0aWxfRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweGZmMDAwMDAwIDogMHgwMDAwMDBmZjtcbiAgY29uc3QgW3plcm9NYXBwaW5nLCBvbmVNYXBwaW5nXSA9IGludmVyc2VEZWNvZGUgPyBbbm9uQmxhY2tDb2xvciwgYmxhY2tdIDogW2JsYWNrLCBub25CbGFja0NvbG9yXTtcbiAgY29uc3Qgd2lkdGhJblNvdXJjZSA9IHdpZHRoID4+IDM7XG4gIGNvbnN0IHdpZHRoUmVtYWluZGVyID0gd2lkdGggJiA3O1xuICBjb25zdCBzcmNMZW5ndGggPSBzcmMubGVuZ3RoO1xuICBkZXN0ID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyKTtcbiAgbGV0IGRlc3RQb3MgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgZm9yIChjb25zdCBtYXggPSBzcmNQb3MgKyB3aWR0aEluU291cmNlOyBzcmNQb3MgPCBtYXg7IHNyY1BvcysrKSB7XG4gICAgICBjb25zdCBlbGVtID0gc3JjUG9zIDwgc3JjTGVuZ3RoID8gc3JjW3NyY1Bvc10gOiAyNTU7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgfVxuICAgIGlmICh3aWR0aFJlbWFpbmRlciA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGVsZW0gPSBzcmNQb3MgPCBzcmNMZW5ndGggPyBzcmNbc3JjUG9zKytdIDogMjU1O1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgd2lkdGhSZW1haW5kZXI7IGorKykge1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDEgPDwgNyAtIGogPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgc3JjUG9zLFxuICAgIGRlc3RQb3NcbiAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRSR0JUb1JHQkEoe1xuICBzcmMsXG4gIHNyY1BvcyA9IDAsXG4gIGRlc3QsXG4gIGRlc3RQb3MgPSAwLFxuICB3aWR0aCxcbiAgaGVpZ2h0XG59KSB7XG4gIGxldCBpID0gMDtcbiAgY29uc3QgbGVuMzIgPSBzcmMubGVuZ3RoID4+IDI7XG4gIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIsIHNyY1BvcywgbGVuMzIpO1xuICBpZiAoRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pIHtcbiAgICBmb3IgKDsgaSA8IGxlbjMyIC0gMjsgaSArPSAzLCBkZXN0UG9zICs9IDQpIHtcbiAgICAgIGNvbnN0IHMxID0gc3JjMzJbaV07XG4gICAgICBjb25zdCBzMiA9IHNyYzMyW2kgKyAxXTtcbiAgICAgIGNvbnN0IHMzID0gc3JjMzJbaSArIDJdO1xuICAgICAgZGVzdFtkZXN0UG9zXSA9IHMxIHwgMHhmZjAwMDAwMDtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDFdID0gczEgPj4+IDI0IHwgczIgPDwgOCB8IDB4ZmYwMDAwMDA7XG4gICAgICBkZXN0W2Rlc3RQb3MgKyAyXSA9IHMyID4+PiAxNiB8IHMzIDw8IDE2IHwgMHhmZjAwMDAwMDtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDNdID0gczMgPj4+IDggfCAweGZmMDAwMDAwO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gaSAqIDQsIGpqID0gc3JjLmxlbmd0aDsgaiA8IGpqOyBqICs9IDMpIHtcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tqXSB8IHNyY1tqICsgMV0gPDwgOCB8IHNyY1tqICsgMl0gPDwgMTYgfCAweGZmMDAwMDAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKDsgaSA8IGxlbjMyIC0gMjsgaSArPSAzLCBkZXN0UG9zICs9IDQpIHtcbiAgICAgIGNvbnN0IHMxID0gc3JjMzJbaV07XG4gICAgICBjb25zdCBzMiA9IHNyYzMyW2kgKyAxXTtcbiAgICAgIGNvbnN0IHMzID0gc3JjMzJbaSArIDJdO1xuICAgICAgZGVzdFtkZXN0UG9zXSA9IHMxIHwgMHhmZjtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDFdID0gczEgPDwgMjQgfCBzMiA+Pj4gOCB8IDB4ZmY7XG4gICAgICBkZXN0W2Rlc3RQb3MgKyAyXSA9IHMyIDw8IDE2IHwgczMgPj4+IDE2IHwgMHhmZjtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDNdID0gczMgPDwgOCB8IDB4ZmY7XG4gICAgfVxuICAgIGZvciAobGV0IGogPSBpICogNCwgamogPSBzcmMubGVuZ3RoOyBqIDwgamo7IGogKz0gMykge1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW2pdIDw8IDI0IHwgc3JjW2ogKyAxXSA8PCAxNiB8IHNyY1tqICsgMl0gPDwgOCB8IDB4ZmY7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgc3JjUG9zLFxuICAgIGRlc3RQb3NcbiAgfTtcbn1cbmZ1bmN0aW9uIGdyYXlUb1JHQkEoc3JjLCBkZXN0KSB7XG4gIGlmIChGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikge1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBkZXN0W2ldID0gc3JjW2ldICogMHgxMDEwMSB8IDB4ZmYwMDAwMDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBkZXN0W2ldID0gc3JjW2ldICogMHgxMDEwMTAwIHwgMHgwMDAwMDBmZjtcbiAgICB9XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvY2FudmFzLmpzXG5cblxuXG5cbmNvbnN0IE1JTl9GT05UX1NJWkUgPSAxNjtcbmNvbnN0IE1BWF9GT05UX1NJWkUgPSAxMDA7XG5jb25zdCBFWEVDVVRJT05fVElNRSA9IDE1O1xuY29uc3QgRVhFQ1VUSU9OX1NURVBTID0gMTA7XG5jb25zdCBNQVhfU0laRV9UT19DT01QSUxFID0gMTAwMDtcbmNvbnN0IEZVTExfQ0hVTktfSEVJR0hUID0gMTY7XG5mdW5jdGlvbiBtaXJyb3JDb250ZXh0T3BlcmF0aW9ucyhjdHgsIGRlc3RDdHgpIHtcbiAgaWYgKGN0eC5fcmVtb3ZlTWlycm9yaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBpcyBhbHJlYWR5IGZvcndhcmRpbmcgb3BlcmF0aW9ucy5cIik7XG4gIH1cbiAgY3R4Ll9fb3JpZ2luYWxTYXZlID0gY3R4LnNhdmU7XG4gIGN0eC5fX29yaWdpbmFsUmVzdG9yZSA9IGN0eC5yZXN0b3JlO1xuICBjdHguX19vcmlnaW5hbFJvdGF0ZSA9IGN0eC5yb3RhdGU7XG4gIGN0eC5fX29yaWdpbmFsU2NhbGUgPSBjdHguc2NhbGU7XG4gIGN0eC5fX29yaWdpbmFsVHJhbnNsYXRlID0gY3R4LnRyYW5zbGF0ZTtcbiAgY3R4Ll9fb3JpZ2luYWxUcmFuc2Zvcm0gPSBjdHgudHJhbnNmb3JtO1xuICBjdHguX19vcmlnaW5hbFNldFRyYW5zZm9ybSA9IGN0eC5zZXRUcmFuc2Zvcm07XG4gIGN0eC5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm0gPSBjdHgucmVzZXRUcmFuc2Zvcm07XG4gIGN0eC5fX29yaWdpbmFsQ2xpcCA9IGN0eC5jbGlwO1xuICBjdHguX19vcmlnaW5hbE1vdmVUbyA9IGN0eC5tb3ZlVG87XG4gIGN0eC5fX29yaWdpbmFsTGluZVRvID0gY3R4LmxpbmVUbztcbiAgY3R4Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvID0gY3R4LmJlemllckN1cnZlVG87XG4gIGN0eC5fX29yaWdpbmFsUmVjdCA9IGN0eC5yZWN0O1xuICBjdHguX19vcmlnaW5hbENsb3NlUGF0aCA9IGN0eC5jbG9zZVBhdGg7XG4gIGN0eC5fX29yaWdpbmFsQmVnaW5QYXRoID0gY3R4LmJlZ2luUGF0aDtcbiAgY3R4Ll9yZW1vdmVNaXJyb3JpbmcgPSAoKSA9PiB7XG4gICAgY3R4LnNhdmUgPSBjdHguX19vcmlnaW5hbFNhdmU7XG4gICAgY3R4LnJlc3RvcmUgPSBjdHguX19vcmlnaW5hbFJlc3RvcmU7XG4gICAgY3R4LnJvdGF0ZSA9IGN0eC5fX29yaWdpbmFsUm90YXRlO1xuICAgIGN0eC5zY2FsZSA9IGN0eC5fX29yaWdpbmFsU2NhbGU7XG4gICAgY3R4LnRyYW5zbGF0ZSA9IGN0eC5fX29yaWdpbmFsVHJhbnNsYXRlO1xuICAgIGN0eC50cmFuc2Zvcm0gPSBjdHguX19vcmlnaW5hbFRyYW5zZm9ybTtcbiAgICBjdHguc2V0VHJhbnNmb3JtID0gY3R4Ll9fb3JpZ2luYWxTZXRUcmFuc2Zvcm07XG4gICAgY3R4LnJlc2V0VHJhbnNmb3JtID0gY3R4Ll9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybTtcbiAgICBjdHguY2xpcCA9IGN0eC5fX29yaWdpbmFsQ2xpcDtcbiAgICBjdHgubW92ZVRvID0gY3R4Ll9fb3JpZ2luYWxNb3ZlVG87XG4gICAgY3R4LmxpbmVUbyA9IGN0eC5fX29yaWdpbmFsTGluZVRvO1xuICAgIGN0eC5iZXppZXJDdXJ2ZVRvID0gY3R4Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvO1xuICAgIGN0eC5yZWN0ID0gY3R4Ll9fb3JpZ2luYWxSZWN0O1xuICAgIGN0eC5jbG9zZVBhdGggPSBjdHguX19vcmlnaW5hbENsb3NlUGF0aDtcbiAgICBjdHguYmVnaW5QYXRoID0gY3R4Ll9fb3JpZ2luYWxCZWdpblBhdGg7XG4gICAgZGVsZXRlIGN0eC5fcmVtb3ZlTWlycm9yaW5nO1xuICB9O1xuICBjdHguc2F2ZSA9IGZ1bmN0aW9uIGN0eFNhdmUoKSB7XG4gICAgZGVzdEN0eC5zYXZlKCk7XG4gICAgdGhpcy5fX29yaWdpbmFsU2F2ZSgpO1xuICB9O1xuICBjdHgucmVzdG9yZSA9IGZ1bmN0aW9uIGN0eFJlc3RvcmUoKSB7XG4gICAgZGVzdEN0eC5yZXN0b3JlKCk7XG4gICAgdGhpcy5fX29yaWdpbmFsUmVzdG9yZSgpO1xuICB9O1xuICBjdHgudHJhbnNsYXRlID0gZnVuY3Rpb24gY3R4VHJhbnNsYXRlKHgsIHkpIHtcbiAgICBkZXN0Q3R4LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxUcmFuc2xhdGUoeCwgeSk7XG4gIH07XG4gIGN0eC5zY2FsZSA9IGZ1bmN0aW9uIGN0eFNjYWxlKHgsIHkpIHtcbiAgICBkZXN0Q3R4LnNjYWxlKHgsIHkpO1xuICAgIHRoaXMuX19vcmlnaW5hbFNjYWxlKHgsIHkpO1xuICB9O1xuICBjdHgudHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICBkZXN0Q3R4LnRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG4gIH07XG4gIGN0eC5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhTZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikge1xuICAgIGRlc3RDdHguc2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuICAgIHRoaXMuX19vcmlnaW5hbFNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcbiAgfTtcbiAgY3R4LnJlc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4UmVzZXRUcmFuc2Zvcm0oKSB7XG4gICAgZGVzdEN0eC5yZXNldFRyYW5zZm9ybSgpO1xuICAgIHRoaXMuX19vcmlnaW5hbFJlc2V0VHJhbnNmb3JtKCk7XG4gIH07XG4gIGN0eC5yb3RhdGUgPSBmdW5jdGlvbiBjdHhSb3RhdGUoYW5nbGUpIHtcbiAgICBkZXN0Q3R4LnJvdGF0ZShhbmdsZSk7XG4gICAgdGhpcy5fX29yaWdpbmFsUm90YXRlKGFuZ2xlKTtcbiAgfTtcbiAgY3R4LmNsaXAgPSBmdW5jdGlvbiBjdHhSb3RhdGUocnVsZSkge1xuICAgIGRlc3RDdHguY2xpcChydWxlKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxDbGlwKHJ1bGUpO1xuICB9O1xuICBjdHgubW92ZVRvID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICBkZXN0Q3R4Lm1vdmVUbyh4LCB5KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNb3ZlVG8oeCwgeSk7XG4gIH07XG4gIGN0eC5saW5lVG8gPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIGRlc3RDdHgubGluZVRvKHgsIHkpO1xuICAgIHRoaXMuX19vcmlnaW5hbExpbmVUbyh4LCB5KTtcbiAgfTtcbiAgY3R4LmJlemllckN1cnZlVG8gPSBmdW5jdGlvbiAoY3AxeCwgY3AxeSwgY3AyeCwgY3AyeSwgeCwgeSkge1xuICAgIGRlc3RDdHguYmV6aWVyQ3VydmVUbyhjcDF4LCBjcDF5LCBjcDJ4LCBjcDJ5LCB4LCB5KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvKGNwMXgsIGNwMXksIGNwMngsIGNwMnksIHgsIHkpO1xuICB9O1xuICBjdHgucmVjdCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgZGVzdEN0eC5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIHRoaXMuX19vcmlnaW5hbFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gIH07XG4gIGN0eC5jbG9zZVBhdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgZGVzdEN0eC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxDbG9zZVBhdGgoKTtcbiAgfTtcbiAgY3R4LmJlZ2luUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICBkZXN0Q3R4LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuX19vcmlnaW5hbEJlZ2luUGF0aCgpO1xuICB9O1xufVxuY2xhc3MgQ2FjaGVkQ2FudmFzZXMge1xuICBjb25zdHJ1Y3RvcihjYW52YXNGYWN0b3J5KSB7XG4gICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTtcbiAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICBnZXRDYW52YXMoaWQsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBsZXQgY2FudmFzRW50cnk7XG4gICAgaWYgKHRoaXMuY2FjaGVbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhbnZhc0VudHJ5ID0gdGhpcy5jYWNoZVtpZF07XG4gICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkucmVzZXQoY2FudmFzRW50cnksIHdpZHRoLCBoZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXNFbnRyeSA9IHRoaXMuY2FudmFzRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmNhY2hlW2lkXSA9IGNhbnZhc0VudHJ5O1xuICAgIH1cbiAgICByZXR1cm4gY2FudmFzRW50cnk7XG4gIH1cbiAgZGVsZXRlKGlkKSB7XG4gICAgZGVsZXRlIHRoaXMuY2FjaGVbaWRdO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5jYWNoZSkge1xuICAgICAgY29uc3QgY2FudmFzRW50cnkgPSB0aGlzLmNhY2hlW2lkXTtcbiAgICAgIHRoaXMuY2FudmFzRmFjdG9yeS5kZXN0cm95KGNhbnZhc0VudHJ5KTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhjdHgsIHNyY0ltZywgc3JjWCwgc3JjWSwgc3JjVywgc3JjSCwgZGVzdFgsIGRlc3RZLCBkZXN0VywgZGVzdEgpIHtcbiAgY29uc3QgW2EsIGIsIGMsIGQsIHR4LCB0eV0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCk7XG4gIGlmIChiID09PSAwICYmIGMgPT09IDApIHtcbiAgICBjb25zdCB0bFggPSBkZXN0WCAqIGEgKyB0eDtcbiAgICBjb25zdCByVGxYID0gTWF0aC5yb3VuZCh0bFgpO1xuICAgIGNvbnN0IHRsWSA9IGRlc3RZICogZCArIHR5O1xuICAgIGNvbnN0IHJUbFkgPSBNYXRoLnJvdW5kKHRsWSk7XG4gICAgY29uc3QgYnJYID0gKGRlc3RYICsgZGVzdFcpICogYSArIHR4O1xuICAgIGNvbnN0IHJXaWR0aCA9IE1hdGguYWJzKE1hdGgucm91bmQoYnJYKSAtIHJUbFgpIHx8IDE7XG4gICAgY29uc3QgYnJZID0gKGRlc3RZICsgZGVzdEgpICogZCArIHR5O1xuICAgIGNvbnN0IHJIZWlnaHQgPSBNYXRoLmFicyhNYXRoLnJvdW5kKGJyWSkgLSByVGxZKSB8fCAxO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oTWF0aC5zaWduKGEpLCAwLCAwLCBNYXRoLnNpZ24oZCksIHJUbFgsIHJUbFkpO1xuICAgIGN0eC5kcmF3SW1hZ2Uoc3JjSW1nLCBzcmNYLCBzcmNZLCBzcmNXLCBzcmNILCAwLCAwLCByV2lkdGgsIHJIZWlnaHQpO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgdHgsIHR5KTtcbiAgICByZXR1cm4gW3JXaWR0aCwgckhlaWdodF07XG4gIH1cbiAgaWYgKGEgPT09IDAgJiYgZCA9PT0gMCkge1xuICAgIGNvbnN0IHRsWCA9IGRlc3RZICogYyArIHR4O1xuICAgIGNvbnN0IHJUbFggPSBNYXRoLnJvdW5kKHRsWCk7XG4gICAgY29uc3QgdGxZID0gZGVzdFggKiBiICsgdHk7XG4gICAgY29uc3QgclRsWSA9IE1hdGgucm91bmQodGxZKTtcbiAgICBjb25zdCBiclggPSAoZGVzdFkgKyBkZXN0SCkgKiBjICsgdHg7XG4gICAgY29uc3QgcldpZHRoID0gTWF0aC5hYnMoTWF0aC5yb3VuZChiclgpIC0gclRsWCkgfHwgMTtcbiAgICBjb25zdCBiclkgPSAoZGVzdFggKyBkZXN0VykgKiBiICsgdHk7XG4gICAgY29uc3QgckhlaWdodCA9IE1hdGguYWJzKE1hdGgucm91bmQoYnJZKSAtIHJUbFkpIHx8IDE7XG4gICAgY3R4LnNldFRyYW5zZm9ybSgwLCBNYXRoLnNpZ24oYiksIE1hdGguc2lnbihjKSwgMCwgclRsWCwgclRsWSk7XG4gICAgY3R4LmRyYXdJbWFnZShzcmNJbWcsIHNyY1gsIHNyY1ksIHNyY1csIHNyY0gsIDAsIDAsIHJIZWlnaHQsIHJXaWR0aCk7XG4gICAgY3R4LnNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCB0eCwgdHkpO1xuICAgIHJldHVybiBbckhlaWdodCwgcldpZHRoXTtcbiAgfVxuICBjdHguZHJhd0ltYWdlKHNyY0ltZywgc3JjWCwgc3JjWSwgc3JjVywgc3JjSCwgZGVzdFgsIGRlc3RZLCBkZXN0VywgZGVzdEgpO1xuICBjb25zdCBzY2FsZVggPSBNYXRoLmh5cG90KGEsIGIpO1xuICBjb25zdCBzY2FsZVkgPSBNYXRoLmh5cG90KGMsIGQpO1xuICByZXR1cm4gW3NjYWxlWCAqIGRlc3RXLCBzY2FsZVkgKiBkZXN0SF07XG59XG5mdW5jdGlvbiBjb21waWxlVHlwZTNHbHlwaChpbWdEYXRhKSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfSA9IGltZ0RhdGE7XG4gIGlmICh3aWR0aCA+IE1BWF9TSVpFX1RPX0NPTVBJTEUgfHwgaGVpZ2h0ID4gTUFYX1NJWkVfVE9fQ09NUElMRSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IFBPSU5UX1RPX1BST0NFU1NfTElNSVQgPSAxMDAwO1xuICBjb25zdCBQT0lOVF9UWVBFUyA9IG5ldyBVaW50OEFycmF5KFswLCAyLCA0LCAwLCAxLCAwLCA1LCA0LCA4LCAxMCwgMCwgOCwgMCwgMiwgMSwgMF0pO1xuICBjb25zdCB3aWR0aDEgPSB3aWR0aCArIDE7XG4gIGxldCBwb2ludHMgPSBuZXcgVWludDhBcnJheSh3aWR0aDEgKiAoaGVpZ2h0ICsgMSkpO1xuICBsZXQgaSwgaiwgajA7XG4gIGNvbnN0IGxpbmVTaXplID0gd2lkdGggKyA3ICYgfjc7XG4gIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkobGluZVNpemUgKiBoZWlnaHQpLFxuICAgIHBvcyA9IDA7XG4gIGZvciAoY29uc3QgZWxlbSBvZiBpbWdEYXRhLmRhdGEpIHtcbiAgICBsZXQgbWFzayA9IDEyODtcbiAgICB3aGlsZSAobWFzayA+IDApIHtcbiAgICAgIGRhdGFbcG9zKytdID0gZWxlbSAmIG1hc2sgPyAwIDogMjU1O1xuICAgICAgbWFzayA+Pj0gMTtcbiAgICB9XG4gIH1cbiAgbGV0IGNvdW50ID0gMDtcbiAgcG9zID0gMDtcbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1swXSA9IDE7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgIGlmIChkYXRhW3Bvc10gIT09IGRhdGFbcG9zICsgMV0pIHtcbiAgICAgIHBvaW50c1tqXSA9IGRhdGFbcG9zXSA/IDIgOiAxO1xuICAgICAgKytjb3VudDtcbiAgICB9XG4gICAgcG9zKys7XG4gIH1cbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1tqXSA9IDI7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGkgPSAxOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICBwb3MgPSBpICogbGluZVNpemU7XG4gICAgajAgPSBpICogd2lkdGgxO1xuICAgIGlmIChkYXRhW3BvcyAtIGxpbmVTaXplXSAhPT0gZGF0YVtwb3NdKSB7XG4gICAgICBwb2ludHNbajBdID0gZGF0YVtwb3NdID8gMSA6IDg7XG4gICAgICArK2NvdW50O1xuICAgIH1cbiAgICBsZXQgc3VtID0gKGRhdGFbcG9zXSA/IDQgOiAwKSArIChkYXRhW3BvcyAtIGxpbmVTaXplXSA/IDggOiAwKTtcbiAgICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgc3VtID0gKHN1bSA+PiAyKSArIChkYXRhW3BvcyArIDFdID8gNCA6IDApICsgKGRhdGFbcG9zIC0gbGluZVNpemUgKyAxXSA/IDggOiAwKTtcbiAgICAgIGlmIChQT0lOVF9UWVBFU1tzdW1dKSB7XG4gICAgICAgIHBvaW50c1tqMCArIGpdID0gUE9JTlRfVFlQRVNbc3VtXTtcbiAgICAgICAgKytjb3VudDtcbiAgICAgIH1cbiAgICAgIHBvcysrO1xuICAgIH1cbiAgICBpZiAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gIT09IGRhdGFbcG9zXSkge1xuICAgICAgcG9pbnRzW2owICsgal0gPSBkYXRhW3Bvc10gPyAyIDogNDtcbiAgICAgICsrY291bnQ7XG4gICAgfVxuICAgIGlmIChjb3VudCA+IFBPSU5UX1RPX1BST0NFU1NfTElNSVQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBwb3MgPSBsaW5lU2l6ZSAqIChoZWlnaHQgLSAxKTtcbiAgajAgPSBpICogd2lkdGgxO1xuICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG4gICAgcG9pbnRzW2owXSA9IDg7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgIGlmIChkYXRhW3Bvc10gIT09IGRhdGFbcG9zICsgMV0pIHtcbiAgICAgIHBvaW50c1tqMCArIGpdID0gZGF0YVtwb3NdID8gNCA6IDg7XG4gICAgICArK2NvdW50O1xuICAgIH1cbiAgICBwb3MrKztcbiAgfVxuICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG4gICAgcG9pbnRzW2owICsgal0gPSA0O1xuICAgICsrY291bnQ7XG4gIH1cbiAgaWYgKGNvdW50ID4gUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHN0ZXBzID0gbmV3IEludDMyQXJyYXkoWzAsIHdpZHRoMSwgLTEsIDAsIC13aWR0aDEsIDAsIDAsIDAsIDFdKTtcbiAgY29uc3QgcGF0aCA9IG5ldyBQYXRoMkQoKTtcbiAgZm9yIChpID0gMDsgY291bnQgJiYgaSA8PSBoZWlnaHQ7IGkrKykge1xuICAgIGxldCBwID0gaSAqIHdpZHRoMTtcbiAgICBjb25zdCBlbmQgPSBwICsgd2lkdGg7XG4gICAgd2hpbGUgKHAgPCBlbmQgJiYgIXBvaW50c1twXSkge1xuICAgICAgcCsrO1xuICAgIH1cbiAgICBpZiAocCA9PT0gZW5kKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcGF0aC5tb3ZlVG8ocCAlIHdpZHRoMSwgaSk7XG4gICAgY29uc3QgcDAgPSBwO1xuICAgIGxldCB0eXBlID0gcG9pbnRzW3BdO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwc1t0eXBlXTtcbiAgICAgIGRvIHtcbiAgICAgICAgcCArPSBzdGVwO1xuICAgICAgfSB3aGlsZSAoIXBvaW50c1twXSk7XG4gICAgICBjb25zdCBwcCA9IHBvaW50c1twXTtcbiAgICAgIGlmIChwcCAhPT0gNSAmJiBwcCAhPT0gMTApIHtcbiAgICAgICAgdHlwZSA9IHBwO1xuICAgICAgICBwb2ludHNbcF0gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9IHBwICYgMHgzMyAqIHR5cGUgPj4gNDtcbiAgICAgICAgcG9pbnRzW3BdICY9IHR5cGUgPj4gMiB8IHR5cGUgPDwgMjtcbiAgICAgIH1cbiAgICAgIHBhdGgubGluZVRvKHAgJSB3aWR0aDEsIHAgLyB3aWR0aDEgfCAwKTtcbiAgICAgIGlmICghcG9pbnRzW3BdKSB7XG4gICAgICAgIC0tY291bnQ7XG4gICAgICB9XG4gICAgfSB3aGlsZSAocDAgIT09IHApO1xuICAgIC0taTtcbiAgfVxuICBkYXRhID0gbnVsbDtcbiAgcG9pbnRzID0gbnVsbDtcbiAgY29uc3QgZHJhd091dGxpbmUgPSBmdW5jdGlvbiAoYykge1xuICAgIGMuc2F2ZSgpO1xuICAgIGMuc2NhbGUoMSAvIHdpZHRoLCAtMSAvIGhlaWdodCk7XG4gICAgYy50cmFuc2xhdGUoMCwgLWhlaWdodCk7XG4gICAgYy5maWxsKHBhdGgpO1xuICAgIGMuYmVnaW5QYXRoKCk7XG4gICAgYy5yZXN0b3JlKCk7XG4gIH07XG4gIHJldHVybiBkcmF3T3V0bGluZTtcbn1cbmNsYXNzIENhbnZhc0V4dHJhU3RhdGUge1xuICBjb25zdHJ1Y3Rvcih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy5hbHBoYUlzU2hhcGUgPSBmYWxzZTtcbiAgICB0aGlzLmZvbnRTaXplID0gMDtcbiAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxO1xuICAgIHRoaXMudGV4dE1hdHJpeCA9IElERU5USVRZX01BVFJJWDtcbiAgICB0aGlzLnRleHRNYXRyaXhTY2FsZSA9IDE7XG4gICAgdGhpcy5mb250TWF0cml4ID0gRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgdGhpcy5sZWFkaW5nID0gMDtcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gICAgdGhpcy5saW5lWCA9IDA7XG4gICAgdGhpcy5saW5lWSA9IDA7XG4gICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7XG4gICAgdGhpcy53b3JkU3BhY2luZyA9IDA7XG4gICAgdGhpcy50ZXh0SFNjYWxlID0gMTtcbiAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGUuRklMTDtcbiAgICB0aGlzLnRleHRSaXNlID0gMDtcbiAgICB0aGlzLmZpbGxDb2xvciA9IFwiIzAwMDAwMFwiO1xuICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBcIiMwMDAwMDBcIjtcbiAgICB0aGlzLnBhdHRlcm5GaWxsID0gZmFsc2U7XG4gICAgdGhpcy5maWxsQWxwaGEgPSAxO1xuICAgIHRoaXMuc3Ryb2tlQWxwaGEgPSAxO1xuICAgIHRoaXMubGluZVdpZHRoID0gMTtcbiAgICB0aGlzLmFjdGl2ZVNNYXNrID0gbnVsbDtcbiAgICB0aGlzLnRyYW5zZmVyTWFwcyA9IFwibm9uZVwiO1xuICAgIHRoaXMuc3RhcnROZXdQYXRoQW5kQ2xpcEJveChbMCwgMCwgd2lkdGgsIGhlaWdodF0pO1xuICB9XG4gIGNsb25lKCkge1xuICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICBjbG9uZS5jbGlwQm94ID0gdGhpcy5jbGlwQm94LnNsaWNlKCk7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG4gIHNldEN1cnJlbnRQb2ludCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9XG4gIHVwZGF0ZVBhdGhNaW5NYXgodHJhbnNmb3JtLCB4LCB5KSB7XG4gICAgW3gsIHldID0gVXRpbC5hcHBseVRyYW5zZm9ybShbeCwgeV0sIHRyYW5zZm9ybSk7XG4gICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCB4KTtcbiAgICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLm1pblksIHkpO1xuICAgIHRoaXMubWF4WCA9IE1hdGgubWF4KHRoaXMubWF4WCwgeCk7XG4gICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCB5KTtcbiAgfVxuICB1cGRhdGVSZWN0TWluTWF4KHRyYW5zZm9ybSwgcmVjdCkge1xuICAgIGNvbnN0IHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShyZWN0LCB0cmFuc2Zvcm0pO1xuICAgIGNvbnN0IHAyID0gVXRpbC5hcHBseVRyYW5zZm9ybShyZWN0LnNsaWNlKDIpLCB0cmFuc2Zvcm0pO1xuICAgIGNvbnN0IHAzID0gVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFswXSwgcmVjdFszXV0sIHRyYW5zZm9ybSk7XG4gICAgY29uc3QgcDQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyZWN0WzJdLCByZWN0WzFdXSwgdHJhbnNmb3JtKTtcbiAgICB0aGlzLm1pblggPSBNYXRoLm1pbih0aGlzLm1pblgsIHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKTtcbiAgICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLm1pblksIHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKTtcbiAgICB0aGlzLm1heFggPSBNYXRoLm1heCh0aGlzLm1heFgsIHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKTtcbiAgICB0aGlzLm1heFkgPSBNYXRoLm1heCh0aGlzLm1heFksIHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKTtcbiAgfVxuICB1cGRhdGVTY2FsaW5nUGF0aE1pbk1heCh0cmFuc2Zvcm0sIG1pbk1heCkge1xuICAgIFV0aWwuc2NhbGVNaW5NYXgodHJhbnNmb3JtLCBtaW5NYXgpO1xuICAgIHRoaXMubWluWCA9IE1hdGgubWluKHRoaXMubWluWCwgbWluTWF4WzBdKTtcbiAgICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLm1pblksIG1pbk1heFsxXSk7XG4gICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCBtaW5NYXhbMl0pO1xuICAgIHRoaXMubWF4WSA9IE1hdGgubWF4KHRoaXMubWF4WSwgbWluTWF4WzNdKTtcbiAgfVxuICB1cGRhdGVDdXJ2ZVBhdGhNaW5NYXgodHJhbnNmb3JtLCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIG1pbk1heCkge1xuICAgIGNvbnN0IGJveCA9IFV0aWwuYmV6aWVyQm91bmRpbmdCb3goeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCBtaW5NYXgpO1xuICAgIGlmIChtaW5NYXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVSZWN0TWluTWF4KHRyYW5zZm9ybSwgYm94KTtcbiAgfVxuICBnZXRQYXRoQm91bmRpbmdCb3gocGF0aFR5cGUgPSBQYXRoVHlwZS5GSUxMLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgY29uc3QgYm94ID0gW3RoaXMubWluWCwgdGhpcy5taW5ZLCB0aGlzLm1heFgsIHRoaXMubWF4WV07XG4gICAgaWYgKHBhdGhUeXBlID09PSBQYXRoVHlwZS5TVFJPS0UpIHtcbiAgICAgIGlmICghdHJhbnNmb3JtKSB7XG4gICAgICAgIHVucmVhY2hhYmxlKFwiU3Ryb2tlIGJvdW5kaW5nIGJveCBtdXN0IGluY2x1ZGUgdHJhbnNmb3JtLlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0cmFuc2Zvcm0pO1xuICAgICAgY29uc3QgeFN0cm9rZVBhZCA9IHNjYWxlWzBdICogdGhpcy5saW5lV2lkdGggLyAyO1xuICAgICAgY29uc3QgeVN0cm9rZVBhZCA9IHNjYWxlWzFdICogdGhpcy5saW5lV2lkdGggLyAyO1xuICAgICAgYm94WzBdIC09IHhTdHJva2VQYWQ7XG4gICAgICBib3hbMV0gLT0geVN0cm9rZVBhZDtcbiAgICAgIGJveFsyXSArPSB4U3Ryb2tlUGFkO1xuICAgICAgYm94WzNdICs9IHlTdHJva2VQYWQ7XG4gICAgfVxuICAgIHJldHVybiBib3g7XG4gIH1cbiAgdXBkYXRlQ2xpcEZyb21QYXRoKCkge1xuICAgIGNvbnN0IGludGVyc2VjdCA9IFV0aWwuaW50ZXJzZWN0KHRoaXMuY2xpcEJveCwgdGhpcy5nZXRQYXRoQm91bmRpbmdCb3goKSk7XG4gICAgdGhpcy5zdGFydE5ld1BhdGhBbmRDbGlwQm94KGludGVyc2VjdCB8fCBbMCwgMCwgMCwgMF0pO1xuICB9XG4gIGlzRW1wdHlDbGlwKCkge1xuICAgIHJldHVybiB0aGlzLm1pblggPT09IEluZmluaXR5O1xuICB9XG4gIHN0YXJ0TmV3UGF0aEFuZENsaXBCb3goYm94KSB7XG4gICAgdGhpcy5jbGlwQm94ID0gYm94O1xuICAgIHRoaXMubWluWCA9IEluZmluaXR5O1xuICAgIHRoaXMubWluWSA9IEluZmluaXR5O1xuICAgIHRoaXMubWF4WCA9IDA7XG4gICAgdGhpcy5tYXhZID0gMDtcbiAgfVxuICBnZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KHBhdGhUeXBlID0gUGF0aFR5cGUuRklMTCwgdHJhbnNmb3JtID0gbnVsbCkge1xuICAgIHJldHVybiBVdGlsLmludGVyc2VjdCh0aGlzLmNsaXBCb3gsIHRoaXMuZ2V0UGF0aEJvdW5kaW5nQm94KHBhdGhUeXBlLCB0cmFuc2Zvcm0pKTtcbiAgfVxufVxuZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VEYXRhKGN0eCwgaW1nRGF0YSkge1xuICBpZiAodHlwZW9mIEltYWdlRGF0YSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpbWdEYXRhIGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7XG4gICAgY3R4LnB1dEltYWdlRGF0YShpbWdEYXRhLCAwLCAwKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQsXG4gICAgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICBjb25zdCBwYXJ0aWFsQ2h1bmtIZWlnaHQgPSBoZWlnaHQgJSBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgY29uc3QgZnVsbENodW5rcyA9IChoZWlnaHQgLSBwYXJ0aWFsQ2h1bmtIZWlnaHQpIC8gRlVMTF9DSFVOS19IRUlHSFQ7XG4gIGNvbnN0IHRvdGFsQ2h1bmtzID0gcGFydGlhbENodW5rSGVpZ2h0ID09PSAwID8gZnVsbENodW5rcyA6IGZ1bGxDaHVua3MgKyAxO1xuICBjb25zdCBjaHVua0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBGVUxMX0NIVU5LX0hFSUdIVCk7XG4gIGxldCBzcmNQb3MgPSAwLFxuICAgIGRlc3RQb3M7XG4gIGNvbnN0IHNyYyA9IGltZ0RhdGEuZGF0YTtcbiAgY29uc3QgZGVzdCA9IGNodW5rSW1nRGF0YS5kYXRhO1xuICBsZXQgaSwgaiwgdGhpc0NodW5rSGVpZ2h0LCBlbGVtc0luVGhpc0NodW5rO1xuICBpZiAoaW1nRGF0YS5raW5kID09PSB1dGlsX0ltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCkge1xuICAgIGNvbnN0IHNyY0xlbmd0aCA9IHNyYy5ieXRlTGVuZ3RoO1xuICAgIGNvbnN0IGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlciwgMCwgZGVzdC5ieXRlTGVuZ3RoID4+IDIpO1xuICAgIGNvbnN0IGRlc3QzMkRhdGFMZW5ndGggPSBkZXN0MzIubGVuZ3RoO1xuICAgIGNvbnN0IGZ1bGxTcmNEaWZmID0gd2lkdGggKyA3ID4+IDM7XG4gICAgY29uc3Qgd2hpdGUgPSAweGZmZmZmZmZmO1xuICAgIGNvbnN0IGJsYWNrID0gdXRpbF9GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4ZmYwMDAwMDAgOiAweDAwMDAwMGZmO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7XG4gICAgICB0aGlzQ2h1bmtIZWlnaHQgPSBpIDwgZnVsbENodW5rcyA/IEZVTExfQ0hVTktfSEVJR0hUIDogcGFydGlhbENodW5rSGVpZ2h0O1xuICAgICAgZGVzdFBvcyA9IDA7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgdGhpc0NodW5rSGVpZ2h0OyBqKyspIHtcbiAgICAgICAgY29uc3Qgc3JjRGlmZiA9IHNyY0xlbmd0aCAtIHNyY1BvcztcbiAgICAgICAgbGV0IGsgPSAwO1xuICAgICAgICBjb25zdCBrRW5kID0gc3JjRGlmZiA+IGZ1bGxTcmNEaWZmID8gd2lkdGggOiBzcmNEaWZmICogOCAtIDc7XG4gICAgICAgIGNvbnN0IGtFbmRVbnJvbGxlZCA9IGtFbmQgJiB+NztcbiAgICAgICAgbGV0IG1hc2sgPSAwO1xuICAgICAgICBsZXQgc3JjQnl0ZSA9IDA7XG4gICAgICAgIGZvciAoOyBrIDwga0VuZFVucm9sbGVkOyBrICs9IDgpIHtcbiAgICAgICAgICBzcmNCeXRlID0gc3JjW3NyY1BvcysrXTtcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxMjggPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDY0ID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAzMiA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMTYgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDggPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDQgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDIgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDEgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBrIDwga0VuZDsgaysrKSB7XG4gICAgICAgICAgaWYgKG1hc2sgPT09IDApIHtcbiAgICAgICAgICAgIHNyY0J5dGUgPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICAgICAgbWFzayA9IDEyODtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgbWFzayA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgbWFzayA+Pj0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGRlc3RQb3MgPCBkZXN0MzJEYXRhTGVuZ3RoKSB7XG4gICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gMDtcbiAgICAgIH1cbiAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpbWdEYXRhLmtpbmQgPT09IHV0aWxfSW1hZ2VLaW5kLlJHQkFfMzJCUFApIHtcbiAgICBqID0gMDtcbiAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiBGVUxMX0NIVU5LX0hFSUdIVCAqIDQ7XG4gICAgZm9yIChpID0gMDsgaSA8IGZ1bGxDaHVua3M7IGkrKykge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY1Bvcywgc3JjUG9zICsgZWxlbXNJblRoaXNDaHVuaykpO1xuICAgICAgc3JjUG9zICs9IGVsZW1zSW5UaGlzQ2h1bms7XG4gICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaik7XG4gICAgICBqICs9IEZVTExfQ0hVTktfSEVJR0hUO1xuICAgIH1cbiAgICBpZiAoaSA8IHRvdGFsQ2h1bmtzKSB7XG4gICAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiBwYXJ0aWFsQ2h1bmtIZWlnaHQgKiA0O1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY1Bvcywgc3JjUG9zICsgZWxlbXNJblRoaXNDaHVuaykpO1xuICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGopO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpbWdEYXRhLmtpbmQgPT09IHV0aWxfSW1hZ2VLaW5kLlJHQl8yNEJQUCkge1xuICAgIHRoaXNDaHVua0hlaWdodCA9IEZVTExfQ0hVTktfSEVJR0hUO1xuICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHRoaXNDaHVua0hlaWdodDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykge1xuICAgICAgaWYgKGkgPj0gZnVsbENodW5rcykge1xuICAgICAgICB0aGlzQ2h1bmtIZWlnaHQgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQ7XG4gICAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHRoaXNDaHVua0hlaWdodDtcbiAgICAgIH1cbiAgICAgIGRlc3RQb3MgPSAwO1xuICAgICAgZm9yIChqID0gZWxlbXNJblRoaXNDaHVuazsgai0tOykge1xuICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSAyNTU7XG4gICAgICB9XG4gICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBiYWQgaW1hZ2Uga2luZDogJHtpbWdEYXRhLmtpbmR9YCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1dEJpbmFyeUltYWdlTWFzayhjdHgsIGltZ0RhdGEpIHtcbiAgaWYgKGltZ0RhdGEuYml0bWFwKSB7XG4gICAgY3R4LmRyYXdJbWFnZShpbWdEYXRhLmJpdG1hcCwgMCwgMCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0LFxuICAgIHdpZHRoID0gaW1nRGF0YS53aWR0aDtcbiAgY29uc3QgcGFydGlhbENodW5rSGVpZ2h0ID0gaGVpZ2h0ICUgRlVMTF9DSFVOS19IRUlHSFQ7XG4gIGNvbnN0IGZ1bGxDaHVua3MgPSAoaGVpZ2h0IC0gcGFydGlhbENodW5rSGVpZ2h0KSAvIEZVTExfQ0hVTktfSEVJR0hUO1xuICBjb25zdCB0b3RhbENodW5rcyA9IHBhcnRpYWxDaHVua0hlaWdodCA9PT0gMCA/IGZ1bGxDaHVua3MgOiBmdWxsQ2h1bmtzICsgMTtcbiAgY29uc3QgY2h1bmtJbWdEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgRlVMTF9DSFVOS19IRUlHSFQpO1xuICBsZXQgc3JjUG9zID0gMDtcbiAgY29uc3Qgc3JjID0gaW1nRGF0YS5kYXRhO1xuICBjb25zdCBkZXN0ID0gY2h1bmtJbWdEYXRhLmRhdGE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykge1xuICAgIGNvbnN0IHRoaXNDaHVua0hlaWdodCA9IGkgPCBmdWxsQ2h1bmtzID8gRlVMTF9DSFVOS19IRUlHSFQgOiBwYXJ0aWFsQ2h1bmtIZWlnaHQ7XG4gICAgKHtcbiAgICAgIHNyY1Bvc1xuICAgIH0gPSBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQSh7XG4gICAgICBzcmMsXG4gICAgICBzcmNQb3MsXG4gICAgICBkZXN0LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXNDaHVua0hlaWdodCxcbiAgICAgIG5vbkJsYWNrQ29sb3I6IDBcbiAgICB9KSk7XG4gICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGkgKiBGVUxMX0NIVU5LX0hFSUdIVCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNvcHlDdHhTdGF0ZShzb3VyY2VDdHgsIGRlc3RDdHgpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IFtcInN0cm9rZVN0eWxlXCIsIFwiZmlsbFN0eWxlXCIsIFwiZmlsbFJ1bGVcIiwgXCJnbG9iYWxBbHBoYVwiLCBcImxpbmVXaWR0aFwiLCBcImxpbmVDYXBcIiwgXCJsaW5lSm9pblwiLCBcIm1pdGVyTGltaXRcIiwgXCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb25cIiwgXCJmb250XCIsIFwiZmlsdGVyXCJdO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBpZiAoc291cmNlQ3R4W3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0Q3R4W3Byb3BlcnR5XSA9IHNvdXJjZUN0eFtwcm9wZXJ0eV07XG4gICAgfVxuICB9XG4gIGlmIChzb3VyY2VDdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgIGRlc3RDdHguc2V0TGluZURhc2goc291cmNlQ3R4LmdldExpbmVEYXNoKCkpO1xuICAgIGRlc3RDdHgubGluZURhc2hPZmZzZXQgPSBzb3VyY2VDdHgubGluZURhc2hPZmZzZXQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc2V0Q3R4VG9EZWZhdWx0KGN0eCkge1xuICBjdHguc3Ryb2tlU3R5bGUgPSBjdHguZmlsbFN0eWxlID0gXCIjMDAwMDAwXCI7XG4gIGN0eC5maWxsUnVsZSA9IFwibm9uemVyb1wiO1xuICBjdHguZ2xvYmFsQWxwaGEgPSAxO1xuICBjdHgubGluZVdpZHRoID0gMTtcbiAgY3R4LmxpbmVDYXAgPSBcImJ1dHRcIjtcbiAgY3R4LmxpbmVKb2luID0gXCJtaXRlclwiO1xuICBjdHgubWl0ZXJMaW1pdCA9IDEwO1xuICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2Utb3ZlclwiO1xuICBjdHguZm9udCA9IFwiMTBweCBzYW5zLXNlcmlmXCI7XG4gIGlmIChjdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgIGN0eC5zZXRMaW5lRGFzaChbXSk7XG4gICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gMDtcbiAgfVxuICBpZiAoIWlzTm9kZUpTKSB7XG4gICAgY29uc3Qge1xuICAgICAgZmlsdGVyXG4gICAgfSA9IGN0eDtcbiAgICBpZiAoZmlsdGVyICE9PSBcIm5vbmVcIiAmJiBmaWx0ZXIgIT09IFwiXCIpIHtcbiAgICAgIGN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEltYWdlU21vb3RoaW5nRW5hYmxlZCh0cmFuc2Zvcm0sIGludGVycG9sYXRlKSB7XG4gIGlmIChpbnRlcnBvbGF0ZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0cmFuc2Zvcm0pO1xuICBzY2FsZVswXSA9IE1hdGguZnJvdW5kKHNjYWxlWzBdKTtcbiAgc2NhbGVbMV0gPSBNYXRoLmZyb3VuZChzY2FsZVsxXSk7XG4gIGNvbnN0IGFjdHVhbFNjYWxlID0gTWF0aC5mcm91bmQoKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAqIFBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyk7XG4gIHJldHVybiBzY2FsZVswXSA8PSBhY3R1YWxTY2FsZSAmJiBzY2FsZVsxXSA8PSBhY3R1YWxTY2FsZTtcbn1cbmNvbnN0IExJTkVfQ0FQX1NUWUxFUyA9IFtcImJ1dHRcIiwgXCJyb3VuZFwiLCBcInNxdWFyZVwiXTtcbmNvbnN0IExJTkVfSk9JTl9TVFlMRVMgPSBbXCJtaXRlclwiLCBcInJvdW5kXCIsIFwiYmV2ZWxcIl07XG5jb25zdCBOT1JNQUxfQ0xJUCA9IHt9O1xuY29uc3QgRU9fQ0xJUCA9IHt9O1xuY2xhc3MgQ2FudmFzR3JhcGhpY3Mge1xuICBjb25zdHJ1Y3RvcihjYW52YXNDdHgsIGNvbW1vbk9ianMsIG9ianMsIGNhbnZhc0ZhY3RvcnksIGZpbHRlckZhY3RvcnksIHtcbiAgICBvcHRpb25hbENvbnRlbnRDb25maWcsXG4gICAgbWFya2VkQ29udGVudFN0YWNrID0gbnVsbFxuICB9LCBhbm5vdGF0aW9uQ2FudmFzTWFwLCBwYWdlQ29sb3JzKSB7XG4gICAgdGhpcy5jdHggPSBjYW52YXNDdHg7XG4gICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSBmYWxzZTtcbiAgICB0aGlzLnJlcyA9IG51bGw7XG4gICAgdGhpcy54b2JqcyA9IG51bGw7XG4gICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2JqcztcbiAgICB0aGlzLm9ianMgPSBvYmpzO1xuICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7XG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gZmlsdGVyRmFjdG9yeTtcbiAgICB0aGlzLmdyb3VwU3RhY2sgPSBbXTtcbiAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gbnVsbDtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjayA9IFtdO1xuICAgIHRoaXMuZ3JvdXBMZXZlbCA9IDA7XG4gICAgdGhpcy5zbWFza1N0YWNrID0gW107XG4gICAgdGhpcy5zbWFza0NvdW50ZXIgPSAwO1xuICAgIHRoaXMudGVtcFNNYXNrID0gbnVsbDtcbiAgICB0aGlzLnN1c3BlbmRlZEN0eCA9IG51bGw7XG4gICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sgPSBtYXJrZWRDb250ZW50U3RhY2sgfHwgW107XG4gICAgdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcgPSBvcHRpb25hbENvbnRlbnRDb25maWc7XG4gICAgdGhpcy5jYWNoZWRDYW52YXNlcyA9IG5ldyBDYWNoZWRDYW52YXNlcyh0aGlzLmNhbnZhc0ZhY3RvcnkpO1xuICAgIHRoaXMuY2FjaGVkUGF0dGVybnMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzTWFwID0gYW5ub3RhdGlvbkNhbnZhc01hcDtcbiAgICB0aGlzLnZpZXdwb3J0U2NhbGUgPSAxO1xuICAgIHRoaXMub3V0cHV0U2NhbGVYID0gMTtcbiAgICB0aGlzLm91dHB1dFNjYWxlWSA9IDE7XG4gICAgdGhpcy5wYWdlQ29sb3JzID0gcGFnZUNvbG9ycztcbiAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nID0gWy0xLCAwXTtcbiAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgICB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwID0gbmV3IE1hcCgpO1xuICB9XG4gIGdldE9iamVjdChkYXRhLCBmYWxsYmFjayA9IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBkYXRhLnN0YXJ0c1dpdGgoXCJnX1wiKSA/IHRoaXMuY29tbW9uT2Jqcy5nZXQoZGF0YSkgOiB0aGlzLm9ianMuZ2V0KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH1cbiAgYmVnaW5EcmF3aW5nKHtcbiAgICB0cmFuc2Zvcm0sXG4gICAgdmlld3BvcnQsXG4gICAgdHJhbnNwYXJlbmN5ID0gZmFsc2UsXG4gICAgYmFja2dyb3VuZCA9IG51bGxcbiAgfSkge1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jdHguY2FudmFzLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQ7XG4gICAgY29uc3Qgc2F2ZWRGaWxsU3R5bGUgPSB0aGlzLmN0eC5maWxsU3R5bGU7XG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gYmFja2dyb3VuZCB8fCBcIiNmZmZmZmZcIjtcbiAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBzYXZlZEZpbGxTdHlsZTtcbiAgICBpZiAodHJhbnNwYXJlbmN5KSB7XG4gICAgICBjb25zdCB0cmFuc3BhcmVudENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwidHJhbnNwYXJlbnRcIiwgd2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmNvbXBvc2l0ZUN0eCA9IHRoaXMuY3R4O1xuICAgICAgdGhpcy50cmFuc3BhcmVudENhbnZhcyA9IHRyYW5zcGFyZW50Q2FudmFzLmNhbnZhcztcbiAgICAgIHRoaXMuY3R4ID0gdHJhbnNwYXJlbnRDYW52YXMuY29udGV4dDtcbiAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi5nZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY29tcG9zaXRlQ3R4KSk7XG4gICAgfVxuICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG4gICAgaWYgKHRyYW5zZm9ybSkge1xuICAgICAgdGhpcy5jdHgudHJhbnNmb3JtKC4uLnRyYW5zZm9ybSk7XG4gICAgICB0aGlzLm91dHB1dFNjYWxlWCA9IHRyYW5zZm9ybVswXTtcbiAgICAgIHRoaXMub3V0cHV0U2NhbGVZID0gdHJhbnNmb3JtWzBdO1xuICAgIH1cbiAgICB0aGlzLmN0eC50cmFuc2Zvcm0oLi4udmlld3BvcnQudHJhbnNmb3JtKTtcbiAgICB0aGlzLnZpZXdwb3J0U2NhbGUgPSB2aWV3cG9ydC5zY2FsZTtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY3R4KTtcbiAgfVxuICBleGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCwgZXhlY3V0aW9uU3RhcnRJZHgsIGNvbnRpbnVlQ2FsbGJhY2ssIHN0ZXBwZXIpIHtcbiAgICBjb25zdCBhcmdzQXJyYXkgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5O1xuICAgIGNvbnN0IGZuQXJyYXkgPSBvcGVyYXRvckxpc3QuZm5BcnJheTtcbiAgICBsZXQgaSA9IGV4ZWN1dGlvblN0YXJ0SWR4IHx8IDA7XG4gICAgY29uc3QgYXJnc0FycmF5TGVuID0gYXJnc0FycmF5Lmxlbmd0aDtcbiAgICBpZiAoYXJnc0FycmF5TGVuID09PSBpKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtPcGVyYXRpb25zID0gYXJnc0FycmF5TGVuIC0gaSA+IEVYRUNVVElPTl9TVEVQUyAmJiB0eXBlb2YgY29udGludWVDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiO1xuICAgIGNvbnN0IGVuZFRpbWUgPSBjaHVua09wZXJhdGlvbnMgPyBEYXRlLm5vdygpICsgRVhFQ1VUSU9OX1RJTUUgOiAwO1xuICAgIGxldCBzdGVwcyA9IDA7XG4gICAgY29uc3QgY29tbW9uT2JqcyA9IHRoaXMuY29tbW9uT2JqcztcbiAgICBjb25zdCBvYmpzID0gdGhpcy5vYmpzO1xuICAgIGxldCBmbklkO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoc3RlcHBlciAhPT0gdW5kZWZpbmVkICYmIGkgPT09IHN0ZXBwZXIubmV4dEJyZWFrUG9pbnQpIHtcbiAgICAgICAgc3RlcHBlci5icmVha0l0KGksIGNvbnRpbnVlQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICAgIGZuSWQgPSBmbkFycmF5W2ldO1xuICAgICAgaWYgKGZuSWQgIT09IE9QUy5kZXBlbmRlbmN5KSB7XG4gICAgICAgIHRoaXNbZm5JZF0uYXBwbHkodGhpcywgYXJnc0FycmF5W2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwT2JqSWQgb2YgYXJnc0FycmF5W2ldKSB7XG4gICAgICAgICAgY29uc3Qgb2Jqc1Bvb2wgPSBkZXBPYmpJZC5zdGFydHNXaXRoKFwiZ19cIikgPyBjb21tb25PYmpzIDogb2JqcztcbiAgICAgICAgICBpZiAoIW9ianNQb29sLmhhcyhkZXBPYmpJZCkpIHtcbiAgICAgICAgICAgIG9ianNQb29sLmdldChkZXBPYmpJZCwgY29udGludWVDYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICAgIGlmIChpID09PSBhcmdzQXJyYXlMZW4pIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgICBpZiAoY2h1bmtPcGVyYXRpb25zICYmICsrc3RlcHMgPiBFWEVDVVRJT05fU1RFUFMpIHtcbiAgICAgICAgaWYgKERhdGUubm93KCkgPiBlbmRUaW1lKSB7XG4gICAgICAgICAgY29udGludWVDYWxsYmFjaygpO1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIHN0ZXBzID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI3Jlc3RvcmVJbml0aWFsU3RhdGUoKSB7XG4gICAgd2hpbGUgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggfHwgdGhpcy5pblNNYXNrTW9kZSkge1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfVxuICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICBpZiAodGhpcy50cmFuc3BhcmVudENhbnZhcykge1xuICAgICAgdGhpcy5jdHggPSB0aGlzLmNvbXBvc2l0ZUN0eDtcbiAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLnRyYW5zcGFyZW50Q2FudmFzLCAwLCAwKTtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIHRoaXMudHJhbnNwYXJlbnRDYW52YXMgPSBudWxsO1xuICAgIH1cbiAgfVxuICBlbmREcmF3aW5nKCkge1xuICAgIHRoaXMuI3Jlc3RvcmVJbml0aWFsU3RhdGUoKTtcbiAgICB0aGlzLmNhY2hlZENhbnZhc2VzLmNsZWFyKCk7XG4gICAgdGhpcy5jYWNoZWRQYXR0ZXJucy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgY2FjaGUgb2YgdGhpcy5fY2FjaGVkQml0bWFwc01hcC52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCBjYW52YXMgb2YgY2FjaGUudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjYW52YXMgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkge1xuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy5oZWlnaHQgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLmNsZWFyKCk7XG4gICAgdGhpcy4jZHJhd0ZpbHRlcigpO1xuICB9XG4gICNkcmF3RmlsdGVyKCkge1xuICAgIGlmICh0aGlzLnBhZ2VDb2xvcnMpIHtcbiAgICAgIGNvbnN0IGhjbUZpbHRlcklkID0gdGhpcy5maWx0ZXJGYWN0b3J5LmFkZEhDTUZpbHRlcih0aGlzLnBhZ2VDb2xvcnMuZm9yZWdyb3VuZCwgdGhpcy5wYWdlQ29sb3JzLmJhY2tncm91bmQpO1xuICAgICAgaWYgKGhjbUZpbHRlcklkICE9PSBcIm5vbmVcIikge1xuICAgICAgICBjb25zdCBzYXZlZEZpbHRlciA9IHRoaXMuY3R4LmZpbHRlcjtcbiAgICAgICAgdGhpcy5jdHguZmlsdGVyID0gaGNtRmlsdGVySWQ7XG4gICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLmN0eC5jYW52YXMsIDAsIDApO1xuICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSBzYXZlZEZpbHRlcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX3NjYWxlSW1hZ2UoaW1nLCBpbnZlcnNlVHJhbnNmb3JtKSB7XG4gICAgY29uc3Qgd2lkdGggPSBpbWcud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW1nLmhlaWdodDtcbiAgICBsZXQgd2lkdGhTY2FsZSA9IE1hdGgubWF4KE1hdGguaHlwb3QoaW52ZXJzZVRyYW5zZm9ybVswXSwgaW52ZXJzZVRyYW5zZm9ybVsxXSksIDEpO1xuICAgIGxldCBoZWlnaHRTY2FsZSA9IE1hdGgubWF4KE1hdGguaHlwb3QoaW52ZXJzZVRyYW5zZm9ybVsyXSwgaW52ZXJzZVRyYW5zZm9ybVszXSksIDEpO1xuICAgIGxldCBwYWludFdpZHRoID0gd2lkdGgsXG4gICAgICBwYWludEhlaWdodCA9IGhlaWdodDtcbiAgICBsZXQgdG1wQ2FudmFzSWQgPSBcInByZXNjYWxlMVwiO1xuICAgIGxldCB0bXBDYW52YXMsIHRtcEN0eDtcbiAgICB3aGlsZSAod2lkdGhTY2FsZSA+IDIgJiYgcGFpbnRXaWR0aCA+IDEgfHwgaGVpZ2h0U2NhbGUgPiAyICYmIHBhaW50SGVpZ2h0ID4gMSkge1xuICAgICAgbGV0IG5ld1dpZHRoID0gcGFpbnRXaWR0aCxcbiAgICAgICAgbmV3SGVpZ2h0ID0gcGFpbnRIZWlnaHQ7XG4gICAgICBpZiAod2lkdGhTY2FsZSA+IDIgJiYgcGFpbnRXaWR0aCA+IDEpIHtcbiAgICAgICAgbmV3V2lkdGggPSBwYWludFdpZHRoID49IDE2Mzg0ID8gTWF0aC5mbG9vcihwYWludFdpZHRoIC8gMikgLSAxIHx8IDEgOiBNYXRoLmNlaWwocGFpbnRXaWR0aCAvIDIpO1xuICAgICAgICB3aWR0aFNjYWxlIC89IHBhaW50V2lkdGggLyBuZXdXaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChoZWlnaHRTY2FsZSA+IDIgJiYgcGFpbnRIZWlnaHQgPiAxKSB7XG4gICAgICAgIG5ld0hlaWdodCA9IHBhaW50SGVpZ2h0ID49IDE2Mzg0ID8gTWF0aC5mbG9vcihwYWludEhlaWdodCAvIDIpIC0gMSB8fCAxIDogTWF0aC5jZWlsKHBhaW50SGVpZ2h0KSAvIDI7XG4gICAgICAgIGhlaWdodFNjYWxlIC89IHBhaW50SGVpZ2h0IC8gbmV3SGVpZ2h0O1xuICAgICAgfVxuICAgICAgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXModG1wQ2FudmFzSWQsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgICB0bXBDdHguY2xlYXJSZWN0KDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgdG1wQ3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIHBhaW50V2lkdGgsIHBhaW50SGVpZ2h0LCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgIGltZyA9IHRtcENhbnZhcy5jYW52YXM7XG4gICAgICBwYWludFdpZHRoID0gbmV3V2lkdGg7XG4gICAgICBwYWludEhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgIHRtcENhbnZhc0lkID0gdG1wQ2FudmFzSWQgPT09IFwicHJlc2NhbGUxXCIgPyBcInByZXNjYWxlMlwiIDogXCJwcmVzY2FsZTFcIjtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGltZyxcbiAgICAgIHBhaW50V2lkdGgsXG4gICAgICBwYWludEhlaWdodFxuICAgIH07XG4gIH1cbiAgX2NyZWF0ZU1hc2tDYW52YXMoaW1nKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gaW1nO1xuICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG4gICAgY29uc3QgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDtcbiAgICBjb25zdCBjdXJyZW50VHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpO1xuICAgIGxldCBjYWNoZSwgY2FjaGVLZXksIHNjYWxlZCwgbWFza0NhbnZhcztcbiAgICBpZiAoKGltZy5iaXRtYXAgfHwgaW1nLmRhdGEpICYmIGltZy5jb3VudCA+IDEpIHtcbiAgICAgIGNvbnN0IG1haW5LZXkgPSBpbWcuYml0bWFwIHx8IGltZy5kYXRhLmJ1ZmZlcjtcbiAgICAgIGNhY2hlS2V5ID0gSlNPTi5zdHJpbmdpZnkoaXNQYXR0ZXJuRmlsbCA/IGN1cnJlbnRUcmFuc2Zvcm0gOiBbY3VycmVudFRyYW5zZm9ybS5zbGljZSgwLCA0KSwgZmlsbENvbG9yXSk7XG4gICAgICBjYWNoZSA9IHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAuZ2V0KG1haW5LZXkpO1xuICAgICAgaWYgKCFjYWNoZSkge1xuICAgICAgICBjYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fY2FjaGVkQml0bWFwc01hcC5zZXQobWFpbktleSwgY2FjaGUpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2FjaGVkSW1hZ2UgPSBjYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgaWYgKGNhY2hlZEltYWdlICYmICFpc1BhdHRlcm5GaWxsKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFggPSBNYXRoLnJvdW5kKE1hdGgubWluKGN1cnJlbnRUcmFuc2Zvcm1bMF0sIGN1cnJlbnRUcmFuc2Zvcm1bMl0pICsgY3VycmVudFRyYW5zZm9ybVs0XSk7XG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBNYXRoLnJvdW5kKE1hdGgubWluKGN1cnJlbnRUcmFuc2Zvcm1bMV0sIGN1cnJlbnRUcmFuc2Zvcm1bM10pICsgY3VycmVudFRyYW5zZm9ybVs1XSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2FudmFzOiBjYWNoZWRJbWFnZSxcbiAgICAgICAgICBvZmZzZXRYLFxuICAgICAgICAgIG9mZnNldFlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHNjYWxlZCA9IGNhY2hlZEltYWdlO1xuICAgIH1cbiAgICBpZiAoIXNjYWxlZCkge1xuICAgICAgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwibWFza0NhbnZhc1wiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHB1dEJpbmFyeUltYWdlTWFzayhtYXNrQ2FudmFzLmNvbnRleHQsIGltZyk7XG4gICAgfVxuICAgIGxldCBtYXNrVG9DYW52YXMgPSBVdGlsLnRyYW5zZm9ybShjdXJyZW50VHJhbnNmb3JtLCBbMSAvIHdpZHRoLCAwLCAwLCAtMSAvIGhlaWdodCwgMCwgMF0pO1xuICAgIG1hc2tUb0NhbnZhcyA9IFV0aWwudHJhbnNmb3JtKG1hc2tUb0NhbnZhcywgWzEsIDAsIDAsIDEsIDAsIC1oZWlnaHRdKTtcbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBVdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCB3aWR0aCwgaGVpZ2h0XSwgbWFza1RvQ2FudmFzKTtcbiAgICBjb25zdCBkcmF3bldpZHRoID0gTWF0aC5yb3VuZChtYXhYIC0gbWluWCkgfHwgMTtcbiAgICBjb25zdCBkcmF3bkhlaWdodCA9IE1hdGgucm91bmQobWF4WSAtIG1pblkpIHx8IDE7XG4gICAgY29uc3QgZmlsbENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiZmlsbENhbnZhc1wiLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodCk7XG4gICAgY29uc3QgZmlsbEN0eCA9IGZpbGxDYW52YXMuY29udGV4dDtcbiAgICBjb25zdCBvZmZzZXRYID0gbWluWDtcbiAgICBjb25zdCBvZmZzZXRZID0gbWluWTtcbiAgICBmaWxsQ3R4LnRyYW5zbGF0ZSgtb2Zmc2V0WCwgLW9mZnNldFkpO1xuICAgIGZpbGxDdHgudHJhbnNmb3JtKC4uLm1hc2tUb0NhbnZhcyk7XG4gICAgaWYgKCFzY2FsZWQpIHtcbiAgICAgIHNjYWxlZCA9IHRoaXMuX3NjYWxlSW1hZ2UobWFza0NhbnZhcy5jYW52YXMsIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGZpbGxDdHgpKTtcbiAgICAgIHNjYWxlZCA9IHNjYWxlZC5pbWc7XG4gICAgICBpZiAoY2FjaGUgJiYgaXNQYXR0ZXJuRmlsbCkge1xuICAgICAgICBjYWNoZS5zZXQoY2FjaGVLZXksIHNjYWxlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZpbGxDdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZ2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGdldEN1cnJlbnRUcmFuc2Zvcm0oZmlsbEN0eCksIGltZy5pbnRlcnBvbGF0ZSk7XG4gICAgZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKGZpbGxDdHgsIHNjYWxlZCwgMCwgMCwgc2NhbGVkLndpZHRoLCBzY2FsZWQuaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBmaWxsQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLWluXCI7XG4gICAgY29uc3QgaW52ZXJzZSA9IFV0aWwudHJhbnNmb3JtKGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGZpbGxDdHgpLCBbMSwgMCwgMCwgMSwgLW9mZnNldFgsIC1vZmZzZXRZXSk7XG4gICAgZmlsbEN0eC5maWxsU3R5bGUgPSBpc1BhdHRlcm5GaWxsID8gZmlsbENvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzLCBpbnZlcnNlLCBQYXRoVHlwZS5GSUxMKSA6IGZpbGxDb2xvcjtcbiAgICBmaWxsQ3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmIChjYWNoZSAmJiAhaXNQYXR0ZXJuRmlsbCkge1xuICAgICAgdGhpcy5jYWNoZWRDYW52YXNlcy5kZWxldGUoXCJmaWxsQ2FudmFzXCIpO1xuICAgICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBmaWxsQ2FudmFzLmNhbnZhcyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjYW52YXM6IGZpbGxDYW52YXMuY2FudmFzLFxuICAgICAgb2Zmc2V0WDogTWF0aC5yb3VuZChvZmZzZXRYKSxcbiAgICAgIG9mZnNldFk6IE1hdGgucm91bmQob2Zmc2V0WSlcbiAgICB9O1xuICB9XG4gIHNldExpbmVXaWR0aCh3aWR0aCkge1xuICAgIGlmICh3aWR0aCAhPT0gdGhpcy5jdXJyZW50LmxpbmVXaWR0aCkge1xuICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5jdHgubGluZVdpZHRoID0gd2lkdGg7XG4gIH1cbiAgc2V0TGluZUNhcChzdHlsZSkge1xuICAgIHRoaXMuY3R4LmxpbmVDYXAgPSBMSU5FX0NBUF9TVFlMRVNbc3R5bGVdO1xuICB9XG4gIHNldExpbmVKb2luKHN0eWxlKSB7XG4gICAgdGhpcy5jdHgubGluZUpvaW4gPSBMSU5FX0pPSU5fU1RZTEVTW3N0eWxlXTtcbiAgfVxuICBzZXRNaXRlckxpbWl0KGxpbWl0KSB7XG4gICAgdGhpcy5jdHgubWl0ZXJMaW1pdCA9IGxpbWl0O1xuICB9XG4gIHNldERhc2goZGFzaEFycmF5LCBkYXNoUGhhc2UpIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBpZiAoY3R4LnNldExpbmVEYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGN0eC5zZXRMaW5lRGFzaChkYXNoQXJyYXkpO1xuICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gZGFzaFBoYXNlO1xuICAgIH1cbiAgfVxuICBzZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KSB7fVxuICBzZXRGbGF0bmVzcyhmbGF0bmVzcykge31cbiAgc2V0R1N0YXRlKHN0YXRlcykge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHN0YXRlcykge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcIkxXXCI6XG4gICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgodmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTENcIjpcbiAgICAgICAgICB0aGlzLnNldExpbmVDYXAodmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgICB0aGlzLnNldExpbmVKb2luKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk1MXCI6XG4gICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkRcIjpcbiAgICAgICAgICB0aGlzLnNldERhc2godmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlJJXCI6XG4gICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQodmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRkxcIjpcbiAgICAgICAgICB0aGlzLnNldEZsYXRuZXNzKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICB0aGlzLnNldEZvbnQodmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkNBXCI6XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhID0gdmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQWxwaGEgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxBbHBoYSA9IHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQk1cIjpcbiAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSB2YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlNNYXNrXCI6XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gdmFsdWUgPyB0aGlzLnRlbXBTTWFzayA6IG51bGw7XG4gICAgICAgICAgdGhpcy50ZW1wU01hc2sgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY2hlY2tTTWFza1N0YXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJUUlwiOlxuICAgICAgICAgIHRoaXMuY3R4LmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPSB0aGlzLmZpbHRlckZhY3RvcnkuYWRkRmlsdGVyKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0IGluU01hc2tNb2RlKCkge1xuICAgIHJldHVybiAhIXRoaXMuc3VzcGVuZGVkQ3R4O1xuICB9XG4gIGNoZWNrU01hc2tTdGF0ZSgpIHtcbiAgICBjb25zdCBpblNNYXNrTW9kZSA9IHRoaXMuaW5TTWFza01vZGU7XG4gICAgaWYgKHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayAmJiAhaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMuYmVnaW5TTWFza01vZGUoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgJiYgaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMuZW5kU01hc2tNb2RlKCk7XG4gICAgfVxuICB9XG4gIGJlZ2luU01hc2tNb2RlKCkge1xuICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiZWdpblNNYXNrTW9kZSBjYWxsZWQgd2hpbGUgYWxyZWFkeSBpbiBzbWFzayBtb2RlXCIpO1xuICAgIH1cbiAgICBjb25zdCBkcmF3bldpZHRoID0gdGhpcy5jdHguY2FudmFzLndpZHRoO1xuICAgIGNvbnN0IGRyYXduSGVpZ2h0ID0gdGhpcy5jdHguY2FudmFzLmhlaWdodDtcbiAgICBjb25zdCBjYWNoZUlkID0gXCJzbWFza0dyb3VwQXRcIiArIHRoaXMuZ3JvdXBMZXZlbDtcbiAgICBjb25zdCBzY3JhdGNoQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoY2FjaGVJZCwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHQpO1xuICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gdGhpcy5jdHg7XG4gICAgdGhpcy5jdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY3R4LnNldFRyYW5zZm9ybSguLi5nZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuc3VzcGVuZGVkQ3R4KSk7XG4gICAgY29weUN0eFN0YXRlKHRoaXMuc3VzcGVuZGVkQ3R4LCBjdHgpO1xuICAgIG1pcnJvckNvbnRleHRPcGVyYXRpb25zKGN0eCwgdGhpcy5zdXNwZW5kZWRDdHgpO1xuICAgIHRoaXMuc2V0R1N0YXRlKFtbXCJCTVwiLCBcInNvdXJjZS1vdmVyXCJdLCBbXCJjYVwiLCAxXSwgW1wiQ0FcIiwgMV1dKTtcbiAgfVxuICBlbmRTTWFza01vZGUoKSB7XG4gICAgaWYgKCF0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbmRTTWFza01vZGUgY2FsbGVkIHdoaWxlIG5vdCBpbiBzbWFzayBtb2RlXCIpO1xuICAgIH1cbiAgICB0aGlzLmN0eC5fcmVtb3ZlTWlycm9yaW5nKCk7XG4gICAgY29weUN0eFN0YXRlKHRoaXMuY3R4LCB0aGlzLnN1c3BlbmRlZEN0eCk7XG4gICAgdGhpcy5jdHggPSB0aGlzLnN1c3BlbmRlZEN0eDtcbiAgICB0aGlzLnN1c3BlbmRlZEN0eCA9IG51bGw7XG4gIH1cbiAgY29tcG9zZShkaXJ0eUJveCkge1xuICAgIGlmICghdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZGlydHlCb3gpIHtcbiAgICAgIGRpcnR5Qm94ID0gWzAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcnR5Qm94WzBdID0gTWF0aC5mbG9vcihkaXJ0eUJveFswXSk7XG4gICAgICBkaXJ0eUJveFsxXSA9IE1hdGguZmxvb3IoZGlydHlCb3hbMV0pO1xuICAgICAgZGlydHlCb3hbMl0gPSBNYXRoLmNlaWwoZGlydHlCb3hbMl0pO1xuICAgICAgZGlydHlCb3hbM10gPSBNYXRoLmNlaWwoZGlydHlCb3hbM10pO1xuICAgIH1cbiAgICBjb25zdCBzbWFzayA9IHRoaXMuY3VycmVudC5hY3RpdmVTTWFzaztcbiAgICBjb25zdCBzdXNwZW5kZWRDdHggPSB0aGlzLnN1c3BlbmRlZEN0eDtcbiAgICB0aGlzLmNvbXBvc2VTTWFzayhzdXNwZW5kZWRDdHgsIHNtYXNrLCB0aGlzLmN0eCwgZGlydHlCb3gpO1xuICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICB9XG4gIGNvbXBvc2VTTWFzayhjdHgsIHNtYXNrLCBsYXllckN0eCwgbGF5ZXJCb3gpIHtcbiAgICBjb25zdCBsYXllck9mZnNldFggPSBsYXllckJveFswXTtcbiAgICBjb25zdCBsYXllck9mZnNldFkgPSBsYXllckJveFsxXTtcbiAgICBjb25zdCBsYXllcldpZHRoID0gbGF5ZXJCb3hbMl0gLSBsYXllck9mZnNldFg7XG4gICAgY29uc3QgbGF5ZXJIZWlnaHQgPSBsYXllckJveFszXSAtIGxheWVyT2Zmc2V0WTtcbiAgICBpZiAobGF5ZXJXaWR0aCA9PT0gMCB8fCBsYXllckhlaWdodCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmdlbmVyaWNDb21wb3NlU01hc2soc21hc2suY29udGV4dCwgbGF5ZXJDdHgsIGxheWVyV2lkdGgsIGxheWVySGVpZ2h0LCBzbWFzay5zdWJ0eXBlLCBzbWFzay5iYWNrZHJvcCwgc21hc2sudHJhbnNmZXJNYXAsIGxheWVyT2Zmc2V0WCwgbGF5ZXJPZmZzZXRZLCBzbWFzay5vZmZzZXRYLCBzbWFzay5vZmZzZXRZKTtcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcbiAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIGN0eC5kcmF3SW1hZ2UobGF5ZXJDdHguY2FudmFzLCAwLCAwKTtcbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG4gIGdlbmVyaWNDb21wb3NlU01hc2sobWFza0N0eCwgbGF5ZXJDdHgsIHdpZHRoLCBoZWlnaHQsIHN1YnR5cGUsIGJhY2tkcm9wLCB0cmFuc2Zlck1hcCwgbGF5ZXJPZmZzZXRYLCBsYXllck9mZnNldFksIG1hc2tPZmZzZXRYLCBtYXNrT2Zmc2V0WSkge1xuICAgIGxldCBtYXNrQ2FudmFzID0gbWFza0N0eC5jYW52YXM7XG4gICAgbGV0IG1hc2tYID0gbGF5ZXJPZmZzZXRYIC0gbWFza09mZnNldFg7XG4gICAgbGV0IG1hc2tZID0gbGF5ZXJPZmZzZXRZIC0gbWFza09mZnNldFk7XG4gICAgaWYgKGJhY2tkcm9wKSB7XG4gICAgICBpZiAobWFza1ggPCAwIHx8IG1hc2tZIDwgMCB8fCBtYXNrWCArIHdpZHRoID4gbWFza0NhbnZhcy53aWR0aCB8fCBtYXNrWSArIGhlaWdodCA+IG1hc2tDYW52YXMuaGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwibWFza0V4dGVuc2lvblwiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmNvbnRleHQ7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UobWFza0NhbnZhcywgLW1hc2tYLCAtbWFza1kpO1xuICAgICAgICBpZiAoYmFja2Ryb3Auc29tZShjID0+IGMgIT09IDApKSB7XG4gICAgICAgICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwiZGVzdGluYXRpb24tYXRvcFwiO1xuICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5iYWNrZHJvcCk7XG4gICAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1vdmVyXCI7XG4gICAgICAgIH1cbiAgICAgICAgbWFza0NhbnZhcyA9IGNhbnZhcy5jYW52YXM7XG4gICAgICAgIG1hc2tYID0gbWFza1kgPSAwO1xuICAgICAgfSBlbHNlIGlmIChiYWNrZHJvcC5zb21lKGMgPT4gYyAhPT0gMCkpIHtcbiAgICAgICAgbWFza0N0eC5zYXZlKCk7XG4gICAgICAgIG1hc2tDdHguZ2xvYmFsQWxwaGEgPSAxO1xuICAgICAgICBtYXNrQ3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgICAgY29uc3QgY2xpcCA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgY2xpcC5yZWN0KG1hc2tYLCBtYXNrWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIG1hc2tDdHguY2xpcChjbGlwKTtcbiAgICAgICAgbWFza0N0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcImRlc3RpbmF0aW9uLWF0b3BcIjtcbiAgICAgICAgbWFza0N0eC5maWxsU3R5bGUgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5iYWNrZHJvcCk7XG4gICAgICAgIG1hc2tDdHguZmlsbFJlY3QobWFza1gsIG1hc2tZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgbWFza0N0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxheWVyQ3R4LnNhdmUoKTtcbiAgICBsYXllckN0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgbGF5ZXJDdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIGlmIChzdWJ0eXBlID09PSBcIkFscGhhXCIgJiYgdHJhbnNmZXJNYXApIHtcbiAgICAgIGxheWVyQ3R4LmZpbHRlciA9IHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRBbHBoYUZpbHRlcih0cmFuc2Zlck1hcCk7XG4gICAgfSBlbHNlIGlmIChzdWJ0eXBlID09PSBcIkx1bWlub3NpdHlcIikge1xuICAgICAgbGF5ZXJDdHguZmlsdGVyID0gdGhpcy5maWx0ZXJGYWN0b3J5LmFkZEx1bWlub3NpdHlGaWx0ZXIodHJhbnNmZXJNYXApO1xuICAgIH1cbiAgICBjb25zdCBjbGlwID0gbmV3IFBhdGgyRCgpO1xuICAgIGNsaXAucmVjdChsYXllck9mZnNldFgsIGxheWVyT2Zmc2V0WSwgd2lkdGgsIGhlaWdodCk7XG4gICAgbGF5ZXJDdHguY2xpcChjbGlwKTtcbiAgICBsYXllckN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcImRlc3RpbmF0aW9uLWluXCI7XG4gICAgbGF5ZXJDdHguZHJhd0ltYWdlKG1hc2tDYW52YXMsIG1hc2tYLCBtYXNrWSwgd2lkdGgsIGhlaWdodCwgbGF5ZXJPZmZzZXRYLCBsYXllck9mZnNldFksIHdpZHRoLCBoZWlnaHQpO1xuICAgIGxheWVyQ3R4LnJlc3RvcmUoKTtcbiAgfVxuICBzYXZlKCkge1xuICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICBjb3B5Q3R4U3RhdGUodGhpcy5jdHgsIHRoaXMuc3VzcGVuZGVkQ3R4KTtcbiAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4LnNhdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgIH1cbiAgICBjb25zdCBvbGQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgdGhpcy5zdGF0ZVN0YWNrLnB1c2gob2xkKTtcbiAgICB0aGlzLmN1cnJlbnQgPSBvbGQuY2xvbmUoKTtcbiAgfVxuICByZXN0b3JlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoID09PSAwICYmIHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMuZW5kU01hc2tNb2RlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnN0YXRlU3RhY2sucG9wKCk7XG4gICAgICBpZiAodGhpcy5pblNNYXNrTW9kZSkge1xuICAgICAgICB0aGlzLnN1c3BlbmRlZEN0eC5yZXN0b3JlKCk7XG4gICAgICAgIGNvcHlDdHhTdGF0ZSh0aGlzLnN1c3BlbmRlZEN0eCwgdGhpcy5jdHgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGVja1NNYXNrU3RhdGUoKTtcbiAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7XG4gICAgfVxuICB9XG4gIHRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgdGhpcy5jdHgudHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPSAtMTtcbiAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgfVxuICBjb25zdHJ1Y3RQYXRoKG9wcywgYXJncywgbWluTWF4KSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICBsZXQgeCA9IGN1cnJlbnQueCxcbiAgICAgIHkgPSBjdXJyZW50Lnk7XG4gICAgbGV0IHN0YXJ0WCwgc3RhcnRZO1xuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCk7XG4gICAgY29uc3QgaXNTY2FsaW5nTWF0cml4ID0gY3VycmVudFRyYW5zZm9ybVswXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzNdID09PSAwIHx8IGN1cnJlbnRUcmFuc2Zvcm1bMV0gPT09IDAgJiYgY3VycmVudFRyYW5zZm9ybVsyXSA9PT0gMDtcbiAgICBjb25zdCBtaW5NYXhGb3JCZXppZXIgPSBpc1NjYWxpbmdNYXRyaXggPyBtaW5NYXguc2xpY2UoMCkgOiBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSBvcHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgc3dpdGNoIChvcHNbaV0gfCAwKSB7XG4gICAgICAgIGNhc2UgT1BTLnJlY3RhbmdsZTpcbiAgICAgICAgICB4ID0gYXJnc1tqKytdO1xuICAgICAgICAgIHkgPSBhcmdzW2orK107XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSBhcmdzW2orK107XG4gICAgICAgICAgY29uc3QgaGVpZ2h0ID0gYXJnc1tqKytdO1xuICAgICAgICAgIGNvbnN0IHh3ID0geCArIHdpZHRoO1xuICAgICAgICAgIGNvbnN0IHloID0geSArIGhlaWdodDtcbiAgICAgICAgICBjdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHloKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4dywgeSk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHh3LCB5aCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHgsIHloKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFpc1NjYWxpbmdNYXRyaXgpIHtcbiAgICAgICAgICAgIGN1cnJlbnQudXBkYXRlUmVjdE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBbeCwgeSwgeHcsIHloXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPUFMubW92ZVRvOlxuICAgICAgICAgIHggPSBhcmdzW2orK107XG4gICAgICAgICAgeSA9IGFyZ3NbaisrXTtcbiAgICAgICAgICBjdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICAgIGlmICghaXNTY2FsaW5nTWF0cml4KSB7XG4gICAgICAgICAgICBjdXJyZW50LnVwZGF0ZVBhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9QUy5saW5lVG86XG4gICAgICAgICAgeCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuICAgICAgICAgIGN0eC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgaWYgKCFpc1NjYWxpbmdNYXRyaXgpIHtcbiAgICAgICAgICAgIGN1cnJlbnQudXBkYXRlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCB4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT1BTLmN1cnZlVG86XG4gICAgICAgICAgc3RhcnRYID0geDtcbiAgICAgICAgICBzdGFydFkgPSB5O1xuICAgICAgICAgIHggPSBhcmdzW2ogKyA0XTtcbiAgICAgICAgICB5ID0gYXJnc1tqICsgNV07XG4gICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSwgeCwgeSk7XG4gICAgICAgICAgY3VycmVudC51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgc3RhcnRYLCBzdGFydFksIGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCBhcmdzW2ogKyAyXSwgYXJnc1tqICsgM10sIHgsIHksIG1pbk1heEZvckJlemllcik7XG4gICAgICAgICAgaiArPSA2O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9QUy5jdXJ2ZVRvMjpcbiAgICAgICAgICBzdGFydFggPSB4O1xuICAgICAgICAgIHN0YXJ0WSA9IHk7XG4gICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oeCwgeSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSk7XG4gICAgICAgICAgY3VycmVudC51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgc3RhcnRYLCBzdGFydFksIHgsIHksIGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCBhcmdzW2ogKyAyXSwgYXJnc1tqICsgM10sIG1pbk1heEZvckJlemllcik7XG4gICAgICAgICAgeCA9IGFyZ3NbaiArIDJdO1xuICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTtcbiAgICAgICAgICBqICs9IDQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT1BTLmN1cnZlVG8zOlxuICAgICAgICAgIHN0YXJ0WCA9IHg7XG4gICAgICAgICAgc3RhcnRZID0geTtcbiAgICAgICAgICB4ID0gYXJnc1tqICsgMl07XG4gICAgICAgICAgeSA9IGFyZ3NbaiArIDNdO1xuICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCB4LCB5LCB4LCB5KTtcbiAgICAgICAgICBjdXJyZW50LnVwZGF0ZUN1cnZlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBzdGFydFgsIHN0YXJ0WSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIHgsIHksIHgsIHksIG1pbk1heEZvckJlemllcik7XG4gICAgICAgICAgaiArPSA0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9QUy5jbG9zZVBhdGg6XG4gICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNTY2FsaW5nTWF0cml4KSB7XG4gICAgICBjdXJyZW50LnVwZGF0ZVNjYWxpbmdQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIG1pbk1heEZvckJlemllcik7XG4gICAgfVxuICAgIGN1cnJlbnQuc2V0Q3VycmVudFBvaW50KHgsIHkpO1xuICB9XG4gIGNsb3NlUGF0aCgpIHtcbiAgICB0aGlzLmN0eC5jbG9zZVBhdGgoKTtcbiAgfVxuICBzdHJva2UoY29uc3VtZVBhdGggPSB0cnVlKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7XG4gICAgY3R4Lmdsb2JhbEFscGhhID0gdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhO1xuICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICBpZiAodHlwZW9mIHN0cm9rZUNvbG9yID09PSBcIm9iamVjdFwiICYmIHN0cm9rZUNvbG9yPy5nZXRQYXR0ZXJuKSB7XG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZUNvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzLCBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShjdHgpLCBQYXRoVHlwZS5TVFJPS0UpO1xuICAgICAgICB0aGlzLnJlc2NhbGVBbmRTdHJva2UoZmFsc2UpO1xuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXNjYWxlQW5kU3Ryb2tlKHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uc3VtZVBhdGgpIHtcbiAgICAgIHRoaXMuY29uc3VtZVBhdGgodGhpcy5jdXJyZW50LmdldENsaXBwZWRQYXRoQm91bmRpbmdCb3goKSk7XG4gICAgfVxuICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5maWxsQWxwaGE7XG4gIH1cbiAgY2xvc2VTdHJva2UoKSB7XG4gICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLnN0cm9rZSgpO1xuICB9XG4gIGZpbGwoY29uc3VtZVBhdGggPSB0cnVlKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjtcbiAgICBjb25zdCBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsO1xuICAgIGxldCBuZWVkUmVzdG9yZSA9IGZhbHNlO1xuICAgIGlmIChpc1BhdHRlcm5GaWxsKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IGZpbGxDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoY3R4KSwgUGF0aFR5cGUuRklMTCk7XG4gICAgICBuZWVkUmVzdG9yZSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGludGVyc2VjdCA9IHRoaXMuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KCk7XG4gICAgaWYgKHRoaXMuY29udGVudFZpc2libGUgJiYgaW50ZXJzZWN0ICE9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nRU9GaWxsKSB7XG4gICAgICAgIGN0eC5maWxsKFwiZXZlbm9kZFwiKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobmVlZFJlc3RvcmUpIHtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICAgIGlmIChjb25zdW1lUGF0aCkge1xuICAgICAgdGhpcy5jb25zdW1lUGF0aChpbnRlcnNlY3QpO1xuICAgIH1cbiAgfVxuICBlb0ZpbGwoKSB7XG4gICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcbiAgICB0aGlzLmZpbGwoKTtcbiAgfVxuICBmaWxsU3Ryb2tlKCkge1xuICAgIHRoaXMuZmlsbChmYWxzZSk7XG4gICAgdGhpcy5zdHJva2UoZmFsc2UpO1xuICAgIHRoaXMuY29uc3VtZVBhdGgoKTtcbiAgfVxuICBlb0ZpbGxTdHJva2UoKSB7XG4gICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcbiAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgfVxuICBjbG9zZUZpbGxTdHJva2UoKSB7XG4gICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgfVxuICBjbG9zZUVPRmlsbFN0cm9rZSgpIHtcbiAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSB0cnVlO1xuICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gIH1cbiAgZW5kUGF0aCgpIHtcbiAgICB0aGlzLmNvbnN1bWVQYXRoKCk7XG4gIH1cbiAgY2xpcCgpIHtcbiAgICB0aGlzLnBlbmRpbmdDbGlwID0gTk9STUFMX0NMSVA7XG4gIH1cbiAgZW9DbGlwKCkge1xuICAgIHRoaXMucGVuZGluZ0NsaXAgPSBFT19DTElQO1xuICB9XG4gIGJlZ2luVGV4dCgpIHtcbiAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeCA9IElERU5USVRZX01BVFJJWDtcbiAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gMTtcbiAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCA9IDA7XG4gICAgdGhpcy5jdXJyZW50LnkgPSB0aGlzLmN1cnJlbnQubGluZVkgPSAwO1xuICB9XG4gIGVuZFRleHQoKSB7XG4gICAgY29uc3QgcGF0aHMgPSB0aGlzLnBlbmRpbmdUZXh0UGF0aHM7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgaWYgKHBhdGhzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBjdHguc2V0VHJhbnNmb3JtKC4uLnBhdGgudHJhbnNmb3JtKTtcbiAgICAgIGN0eC50cmFuc2xhdGUocGF0aC54LCBwYXRoLnkpO1xuICAgICAgcGF0aC5hZGRUb1BhdGgoY3R4LCBwYXRoLmZvbnRTaXplKTtcbiAgICB9XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgICBjdHguY2xpcCgpO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBkZWxldGUgdGhpcy5wZW5kaW5nVGV4dFBhdGhzO1xuICB9XG4gIHNldENoYXJTcGFjaW5nKHNwYWNpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQuY2hhclNwYWNpbmcgPSBzcGFjaW5nO1xuICB9XG4gIHNldFdvcmRTcGFjaW5nKHNwYWNpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQud29yZFNwYWNpbmcgPSBzcGFjaW5nO1xuICB9XG4gIHNldEhTY2FsZShzY2FsZSkge1xuICAgIHRoaXMuY3VycmVudC50ZXh0SFNjYWxlID0gc2NhbGUgLyAxMDA7XG4gIH1cbiAgc2V0TGVhZGluZyhsZWFkaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50LmxlYWRpbmcgPSAtbGVhZGluZztcbiAgfVxuICBzZXRGb250KGZvbnRSZWZOYW1lLCBzaXplKSB7XG4gICAgY29uc3QgZm9udE9iaiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQoZm9udFJlZk5hbWUpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgaWYgKCFmb250T2JqKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGZpbmQgZm9udCBmb3IgJHtmb250UmVmTmFtZX1gKTtcbiAgICB9XG4gICAgY3VycmVudC5mb250TWF0cml4ID0gZm9udE9iai5mb250TWF0cml4IHx8IEZPTlRfSURFTlRJVFlfTUFUUklYO1xuICAgIGlmIChjdXJyZW50LmZvbnRNYXRyaXhbMF0gPT09IDAgfHwgY3VycmVudC5mb250TWF0cml4WzNdID09PSAwKSB7XG4gICAgICB3YXJuKFwiSW52YWxpZCBmb250IG1hdHJpeCBmb3IgZm9udCBcIiArIGZvbnRSZWZOYW1lKTtcbiAgICB9XG4gICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICBzaXplID0gLXNpemU7XG4gICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudC5mb250RGlyZWN0aW9uID0gMTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50LmZvbnQgPSBmb250T2JqO1xuICAgIHRoaXMuY3VycmVudC5mb250U2l6ZSA9IHNpemU7XG4gICAgaWYgKGZvbnRPYmouaXNUeXBlM0ZvbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGZvbnRPYmoubG9hZGVkTmFtZSB8fCBcInNhbnMtc2VyaWZcIjtcbiAgICBjb25zdCB0eXBlZmFjZSA9IGZvbnRPYmouc3lzdGVtRm9udEluZm8/LmNzcyB8fCBgXCIke25hbWV9XCIsICR7Zm9udE9iai5mYWxsYmFja05hbWV9YDtcbiAgICBsZXQgYm9sZCA9IFwibm9ybWFsXCI7XG4gICAgaWYgKGZvbnRPYmouYmxhY2spIHtcbiAgICAgIGJvbGQgPSBcIjkwMFwiO1xuICAgIH0gZWxzZSBpZiAoZm9udE9iai5ib2xkKSB7XG4gICAgICBib2xkID0gXCJib2xkXCI7XG4gICAgfVxuICAgIGNvbnN0IGl0YWxpYyA9IGZvbnRPYmouaXRhbGljID8gXCJpdGFsaWNcIiA6IFwibm9ybWFsXCI7XG4gICAgbGV0IGJyb3dzZXJGb250U2l6ZSA9IHNpemU7XG4gICAgaWYgKHNpemUgPCBNSU5fRk9OVF9TSVpFKSB7XG4gICAgICBicm93c2VyRm9udFNpemUgPSBNSU5fRk9OVF9TSVpFO1xuICAgIH0gZWxzZSBpZiAoc2l6ZSA+IE1BWF9GT05UX1NJWkUpIHtcbiAgICAgIGJyb3dzZXJGb250U2l6ZSA9IE1BWF9GT05UX1NJWkU7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudC5mb250U2l6ZVNjYWxlID0gc2l6ZSAvIGJyb3dzZXJGb250U2l6ZTtcbiAgICB0aGlzLmN0eC5mb250ID0gYCR7aXRhbGljfSAke2JvbGR9ICR7YnJvd3NlckZvbnRTaXplfXB4ICR7dHlwZWZhY2V9YDtcbiAgfVxuICBzZXRUZXh0UmVuZGVyaW5nTW9kZShtb2RlKSB7XG4gICAgdGhpcy5jdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID0gbW9kZTtcbiAgfVxuICBzZXRUZXh0UmlzZShyaXNlKSB7XG4gICAgdGhpcy5jdXJyZW50LnRleHRSaXNlID0gcmlzZTtcbiAgfVxuICBtb3ZlVGV4dCh4LCB5KSB7XG4gICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggKz0geDtcbiAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSArPSB5O1xuICB9XG4gIHNldExlYWRpbmdNb3ZlVGV4dCh4LCB5KSB7XG4gICAgdGhpcy5zZXRMZWFkaW5nKC15KTtcbiAgICB0aGlzLm1vdmVUZXh0KHgsIHkpO1xuICB9XG4gIHNldFRleHRNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikge1xuICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLmh5cG90KGEsIGIpO1xuICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcbiAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG4gIH1cbiAgbmV4dExpbmUoKSB7XG4gICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG4gIH1cbiAgcGFpbnRDaGFyKGNoYXJhY3RlciwgeCwgeSwgcGF0dGVyblRyYW5zZm9ybSkge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgY29uc3QgZm9udCA9IGN1cnJlbnQuZm9udDtcbiAgICBjb25zdCB0ZXh0UmVuZGVyaW5nTW9kZSA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGU7XG4gICAgY29uc3QgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplIC8gY3VycmVudC5mb250U2l6ZVNjYWxlO1xuICAgIGNvbnN0IGZpbGxTdHJva2VNb2RlID0gdGV4dFJlbmRlcmluZ01vZGUgJiBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLO1xuICAgIGNvbnN0IGlzQWRkVG9QYXRoU2V0ID0gISEodGV4dFJlbmRlcmluZ01vZGUgJiBUZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKTtcbiAgICBjb25zdCBwYXR0ZXJuRmlsbCA9IGN1cnJlbnQucGF0dGVybkZpbGwgJiYgIWZvbnQubWlzc2luZ0ZpbGU7XG4gICAgbGV0IGFkZFRvUGF0aDtcbiAgICBpZiAoZm9udC5kaXNhYmxlRm9udEZhY2UgfHwgaXNBZGRUb1BhdGhTZXQgfHwgcGF0dGVybkZpbGwpIHtcbiAgICAgIGFkZFRvUGF0aCA9IGZvbnQuZ2V0UGF0aEdlbmVyYXRvcih0aGlzLmNvbW1vbk9ianMsIGNoYXJhY3Rlcik7XG4gICAgfVxuICAgIGlmIChmb250LmRpc2FibGVGb250RmFjZSB8fCBwYXR0ZXJuRmlsbCkge1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC50cmFuc2xhdGUoeCwgeSk7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBhZGRUb1BhdGgoY3R4LCBmb250U2l6ZSk7XG4gICAgICBpZiAocGF0dGVyblRyYW5zZm9ybSkge1xuICAgICAgICBjdHguc2V0VHJhbnNmb3JtKC4uLnBhdHRlcm5UcmFuc2Zvcm0pO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8IGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgIH1cbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgY3R4LmZpbGxUZXh0KGNoYXJhY3RlciwgeCwgeSk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgY3R4LnN0cm9rZVRleHQoY2hhcmFjdGVyLCB4LCB5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQWRkVG9QYXRoU2V0KSB7XG4gICAgICBjb25zdCBwYXRocyA9IHRoaXMucGVuZGluZ1RleHRQYXRocyB8fD0gW107XG4gICAgICBwYXRocy5wdXNoKHtcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCksXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIGZvbnRTaXplLFxuICAgICAgICBhZGRUb1BhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBnZXQgaXNGb250U3VicGl4ZWxBQUVuYWJsZWQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGV4dDogY3R4XG4gICAgfSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaXNGb250U3VicGl4ZWxBQUVuYWJsZWRcIiwgMTAsIDEwKTtcbiAgICBjdHguc2NhbGUoMS41LCAxKTtcbiAgICBjdHguZmlsbFRleHQoXCJJXCIsIDAsIDEwKTtcbiAgICBjb25zdCBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxMCwgMTApLmRhdGE7XG4gICAgbGV0IGVuYWJsZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMzsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIGlmIChkYXRhW2ldID4gMCAmJiBkYXRhW2ldIDwgMjU1KSB7XG4gICAgICAgIGVuYWJsZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzRm9udFN1YnBpeGVsQUFFbmFibGVkXCIsIGVuYWJsZWQpO1xuICB9XG4gIHNob3dUZXh0KGdseXBocykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgY29uc3QgZm9udCA9IGN1cnJlbnQuZm9udDtcbiAgICBpZiAoZm9udC5pc1R5cGUzRm9udCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvd1R5cGUzVGV4dChnbHlwaHMpO1xuICAgIH1cbiAgICBjb25zdCBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemU7XG4gICAgaWYgKGZvbnRTaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBmb250U2l6ZVNjYWxlID0gY3VycmVudC5mb250U2l6ZVNjYWxlO1xuICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZztcbiAgICBjb25zdCB3b3JkU3BhY2luZyA9IGN1cnJlbnQud29yZFNwYWNpbmc7XG4gICAgY29uc3QgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjtcbiAgICBjb25zdCB0ZXh0SFNjYWxlID0gY3VycmVudC50ZXh0SFNjYWxlICogZm9udERpcmVjdGlvbjtcbiAgICBjb25zdCBnbHlwaHNMZW5ndGggPSBnbHlwaHMubGVuZ3RoO1xuICAgIGNvbnN0IHZlcnRpY2FsID0gZm9udC52ZXJ0aWNhbDtcbiAgICBjb25zdCBzcGFjaW5nRGlyID0gdmVydGljYWwgPyAxIDogLTE7XG4gICAgY29uc3QgZGVmYXVsdFZNZXRyaWNzID0gZm9udC5kZWZhdWx0Vk1ldHJpY3M7XG4gICAgY29uc3Qgd2lkdGhBZHZhbmNlU2NhbGUgPSBmb250U2l6ZSAqIGN1cnJlbnQuZm9udE1hdHJpeFswXTtcbiAgICBjb25zdCBzaW1wbGVGaWxsVGV4dCA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTEwgJiYgIWZvbnQuZGlzYWJsZUZvbnRGYWNlICYmICFjdXJyZW50LnBhdHRlcm5GaWxsO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnRyYW5zZm9ybSguLi5jdXJyZW50LnRleHRNYXRyaXgpO1xuICAgIGN0eC50cmFuc2xhdGUoY3VycmVudC54LCBjdXJyZW50LnkgKyBjdXJyZW50LnRleHRSaXNlKTtcbiAgICBpZiAoZm9udERpcmVjdGlvbiA+IDApIHtcbiAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCAtMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCAxKTtcbiAgICB9XG4gICAgbGV0IHBhdHRlcm5UcmFuc2Zvcm07XG4gICAgaWYgKGN1cnJlbnQucGF0dGVybkZpbGwpIHtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjb25zdCBwYXR0ZXJuID0gY3VycmVudC5maWxsQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMsIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCksIFBhdGhUeXBlLkZJTEwpO1xuICAgICAgcGF0dGVyblRyYW5zZm9ybSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICBjdHguZmlsbFN0eWxlID0gcGF0dGVybjtcbiAgICB9XG4gICAgbGV0IGxpbmVXaWR0aCA9IGN1cnJlbnQubGluZVdpZHRoO1xuICAgIGNvbnN0IHNjYWxlID0gY3VycmVudC50ZXh0TWF0cml4U2NhbGU7XG4gICAgaWYgKHNjYWxlID09PSAwIHx8IGxpbmVXaWR0aCA9PT0gMCkge1xuICAgICAgY29uc3QgZmlsbFN0cm9rZU1vZGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlICYgVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcbiAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuICAgICAgICBsaW5lV2lkdGggPSB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGluZVdpZHRoIC89IHNjYWxlO1xuICAgIH1cbiAgICBpZiAoZm9udFNpemVTY2FsZSAhPT0gMS4wKSB7XG4gICAgICBjdHguc2NhbGUoZm9udFNpemVTY2FsZSwgZm9udFNpemVTY2FsZSk7XG4gICAgICBsaW5lV2lkdGggLz0gZm9udFNpemVTY2FsZTtcbiAgICB9XG4gICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICBpZiAoZm9udC5pc0ludmFsaWRQREZqc0ZvbnQpIHtcbiAgICAgIGNvbnN0IGNoYXJzID0gW107XG4gICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHtcbiAgICAgICAgY2hhcnMucHVzaChnbHlwaC51bmljb2RlKTtcbiAgICAgICAgd2lkdGggKz0gZ2x5cGgud2lkdGg7XG4gICAgICB9XG4gICAgICBjdHguZmlsbFRleHQoY2hhcnMuam9pbihcIlwiKSwgMCwgMCk7XG4gICAgICBjdXJyZW50LnggKz0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSAqIHRleHRIU2NhbGU7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgdGhpcy5jb21wb3NlKCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgeCA9IDAsXG4gICAgICBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBnbHlwaHNMZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICBpZiAodHlwZW9mIGdseXBoID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHggKz0gc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUgLyAxMDAwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCByZXN0b3JlTmVlZGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzcGFjaW5nID0gKGdseXBoLmlzU3BhY2UgPyB3b3JkU3BhY2luZyA6IDApICsgY2hhclNwYWNpbmc7XG4gICAgICBjb25zdCBjaGFyYWN0ZXIgPSBnbHlwaC5mb250Q2hhcjtcbiAgICAgIGNvbnN0IGFjY2VudCA9IGdseXBoLmFjY2VudDtcbiAgICAgIGxldCBzY2FsZWRYLCBzY2FsZWRZO1xuICAgICAgbGV0IHdpZHRoID0gZ2x5cGgud2lkdGg7XG4gICAgICBpZiAodmVydGljYWwpIHtcbiAgICAgICAgY29uc3Qgdm1ldHJpYyA9IGdseXBoLnZtZXRyaWMgfHwgZGVmYXVsdFZNZXRyaWNzO1xuICAgICAgICBjb25zdCB2eCA9IC0oZ2x5cGgudm1ldHJpYyA/IHZtZXRyaWNbMV0gOiB3aWR0aCAqIDAuNSkgKiB3aWR0aEFkdmFuY2VTY2FsZTtcbiAgICAgICAgY29uc3QgdnkgPSB2bWV0cmljWzJdICogd2lkdGhBZHZhbmNlU2NhbGU7XG4gICAgICAgIHdpZHRoID0gdm1ldHJpYyA/IC12bWV0cmljWzBdIDogd2lkdGg7XG4gICAgICAgIHNjYWxlZFggPSB2eCAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIHNjYWxlZFkgPSAoeCArIHZ5KSAvIGZvbnRTaXplU2NhbGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2FsZWRYID0geCAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIHNjYWxlZFkgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKGZvbnQucmVtZWFzdXJlICYmIHdpZHRoID4gMCkge1xuICAgICAgICBjb25zdCBtZWFzdXJlZFdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGNoYXJhY3Rlcikud2lkdGggKiAxMDAwIC8gZm9udFNpemUgKiBmb250U2l6ZVNjYWxlO1xuICAgICAgICBpZiAod2lkdGggPCBtZWFzdXJlZFdpZHRoICYmIHRoaXMuaXNGb250U3VicGl4ZWxBQUVuYWJsZWQpIHtcbiAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJTY2FsZVggPSB3aWR0aCAvIG1lYXN1cmVkV2lkdGg7XG4gICAgICAgICAgcmVzdG9yZU5lZWRlZCA9IHRydWU7XG4gICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICBjdHguc2NhbGUoY2hhcmFjdGVyU2NhbGVYLCAxKTtcbiAgICAgICAgICBzY2FsZWRYIC89IGNoYXJhY3RlclNjYWxlWDtcbiAgICAgICAgfSBlbHNlIGlmICh3aWR0aCAhPT0gbWVhc3VyZWRXaWR0aCkge1xuICAgICAgICAgIHNjYWxlZFggKz0gKHdpZHRoIC0gbWVhc3VyZWRXaWR0aCkgLyAyMDAwICogZm9udFNpemUgLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSAmJiAoZ2x5cGguaXNJbkZvbnQgfHwgZm9udC5taXNzaW5nRmlsZSkpIHtcbiAgICAgICAgaWYgKHNpbXBsZUZpbGxUZXh0ICYmICFhY2NlbnQpIHtcbiAgICAgICAgICBjdHguZmlsbFRleHQoY2hhcmFjdGVyLCBzY2FsZWRYLCBzY2FsZWRZKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBhaW50Q2hhcihjaGFyYWN0ZXIsIHNjYWxlZFgsIHNjYWxlZFksIHBhdHRlcm5UcmFuc2Zvcm0pO1xuICAgICAgICAgIGlmIChhY2NlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlZEFjY2VudFggPSBzY2FsZWRYICsgZm9udFNpemUgKiBhY2NlbnQub2Zmc2V0LnggLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICAgICAgY29uc3Qgc2NhbGVkQWNjZW50WSA9IHNjYWxlZFkgLSBmb250U2l6ZSAqIGFjY2VudC5vZmZzZXQueSAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgICAgICB0aGlzLnBhaW50Q2hhcihhY2NlbnQuZm9udENoYXIsIHNjYWxlZEFjY2VudFgsIHNjYWxlZEFjY2VudFksIHBhdHRlcm5UcmFuc2Zvcm0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgY2hhcldpZHRoID0gdmVydGljYWwgPyB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlIC0gc3BhY2luZyAqIGZvbnREaXJlY3Rpb24gOiB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlICsgc3BhY2luZyAqIGZvbnREaXJlY3Rpb247XG4gICAgICB4ICs9IGNoYXJXaWR0aDtcbiAgICAgIGlmIChyZXN0b3JlTmVlZGVkKSB7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgY3VycmVudC55IC09IHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnQueCArPSB4ICogdGV4dEhTY2FsZTtcbiAgICB9XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHNob3dUeXBlM1RleHQoZ2x5cGhzKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICBjb25zdCBmb250ID0gY3VycmVudC5mb250O1xuICAgIGNvbnN0IGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZTtcbiAgICBjb25zdCBmb250RGlyZWN0aW9uID0gY3VycmVudC5mb250RGlyZWN0aW9uO1xuICAgIGNvbnN0IHNwYWNpbmdEaXIgPSBmb250LnZlcnRpY2FsID8gMSA6IC0xO1xuICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZztcbiAgICBjb25zdCB3b3JkU3BhY2luZyA9IGN1cnJlbnQud29yZFNwYWNpbmc7XG4gICAgY29uc3QgdGV4dEhTY2FsZSA9IGN1cnJlbnQudGV4dEhTY2FsZSAqIGZvbnREaXJlY3Rpb247XG4gICAgY29uc3QgZm9udE1hdHJpeCA9IGN1cnJlbnQuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDtcbiAgICBjb25zdCBnbHlwaHNMZW5ndGggPSBnbHlwaHMubGVuZ3RoO1xuICAgIGNvbnN0IGlzVGV4dEludmlzaWJsZSA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLklOVklTSUJMRTtcbiAgICBsZXQgaSwgZ2x5cGgsIHdpZHRoLCBzcGFjaW5nTGVuZ3RoO1xuICAgIGlmIChpc1RleHRJbnZpc2libGUgfHwgZm9udFNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnRyYW5zZm9ybSguLi5jdXJyZW50LnRleHRNYXRyaXgpO1xuICAgIGN0eC50cmFuc2xhdGUoY3VycmVudC54LCBjdXJyZW50LnkpO1xuICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCBmb250RGlyZWN0aW9uKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZ2x5cGhzTGVuZ3RoOyArK2kpIHtcbiAgICAgIGdseXBoID0gZ2x5cGhzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBnbHlwaCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBzcGFjaW5nTGVuZ3RoID0gc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUgLyAxMDAwO1xuICAgICAgICB0aGlzLmN0eC50cmFuc2xhdGUoc3BhY2luZ0xlbmd0aCwgMCk7XG4gICAgICAgIGN1cnJlbnQueCArPSBzcGFjaW5nTGVuZ3RoICogdGV4dEhTY2FsZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBzcGFjaW5nID0gKGdseXBoLmlzU3BhY2UgPyB3b3JkU3BhY2luZyA6IDApICsgY2hhclNwYWNpbmc7XG4gICAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBmb250LmNoYXJQcm9jT3BlcmF0b3JMaXN0W2dseXBoLm9wZXJhdG9yTGlzdElkXTtcbiAgICAgIGlmICghb3BlcmF0b3JMaXN0KSB7XG4gICAgICAgIHdhcm4oYFR5cGUzIGNoYXJhY3RlciBcIiR7Z2x5cGgub3BlcmF0b3JMaXN0SWR9XCIgaXMgbm90IGF2YWlsYWJsZS5gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IGdseXBoO1xuICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgY3R4LnNjYWxlKGZvbnRTaXplLCBmb250U2l6ZSk7XG4gICAgICAgIGN0eC50cmFuc2Zvcm0oLi4uZm9udE1hdHJpeCk7XG4gICAgICAgIHRoaXMuZXhlY3V0ZU9wZXJhdG9yTGlzdChvcGVyYXRvckxpc3QpO1xuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gVXRpbC5hcHBseVRyYW5zZm9ybShbZ2x5cGgud2lkdGgsIDBdLCBmb250TWF0cml4KTtcbiAgICAgIHdpZHRoID0gdHJhbnNmb3JtZWRbMF0gKiBmb250U2l6ZSArIHNwYWNpbmc7XG4gICAgICBjdHgudHJhbnNsYXRlKHdpZHRoLCAwKTtcbiAgICAgIGN1cnJlbnQueCArPSB3aWR0aCAqIHRleHRIU2NhbGU7XG4gICAgfVxuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBudWxsO1xuICB9XG4gIHNldENoYXJXaWR0aCh4V2lkdGgsIHlXaWR0aCkge31cbiAgc2V0Q2hhcldpZHRoQW5kQm91bmRzKHhXaWR0aCwgeVdpZHRoLCBsbHgsIGxseSwgdXJ4LCB1cnkpIHtcbiAgICB0aGlzLmN0eC5yZWN0KGxseCwgbGx5LCB1cnggLSBsbHgsIHVyeSAtIGxseSk7XG4gICAgdGhpcy5jdHguY2xpcCgpO1xuICAgIHRoaXMuZW5kUGF0aCgpO1xuICB9XG4gIGdldENvbG9yTl9QYXR0ZXJuKElSKSB7XG4gICAgbGV0IHBhdHRlcm47XG4gICAgaWYgKElSWzBdID09PSBcIlRpbGluZ1BhdHRlcm5cIikge1xuICAgICAgY29uc3QgY29sb3IgPSBJUlsxXTtcbiAgICAgIGNvbnN0IGJhc2VUcmFuc2Zvcm0gPSB0aGlzLmJhc2VUcmFuc2Zvcm0gfHwgZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLmN0eCk7XG4gICAgICBjb25zdCBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB7XG4gICAgICAgIGNyZWF0ZUNhbnZhc0dyYXBoaWNzOiBjdHggPT4gbmV3IENhbnZhc0dyYXBoaWNzKGN0eCwgdGhpcy5jb21tb25PYmpzLCB0aGlzLm9ianMsIHRoaXMuY2FudmFzRmFjdG9yeSwgdGhpcy5maWx0ZXJGYWN0b3J5LCB7XG4gICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnOiB0aGlzLm9wdGlvbmFsQ29udGVudENvbmZpZyxcbiAgICAgICAgICBtYXJrZWRDb250ZW50U3RhY2s6IHRoaXMubWFya2VkQ29udGVudFN0YWNrXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgICAgcGF0dGVybiA9IG5ldyBUaWxpbmdQYXR0ZXJuKElSLCBjb2xvciwgdGhpcy5jdHgsIGNhbnZhc0dyYXBoaWNzRmFjdG9yeSwgYmFzZVRyYW5zZm9ybSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdHRlcm4gPSB0aGlzLl9nZXRQYXR0ZXJuKElSWzFdLCBJUlsyXSk7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG4gIHNldFN0cm9rZUNvbG9yTigpIHtcbiAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7XG4gIH1cbiAgc2V0RmlsbENvbG9yTigpIHtcbiAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdGhpcy5nZXRDb2xvck5fUGF0dGVybihhcmd1bWVudHMpO1xuICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IHRydWU7XG4gIH1cbiAgc2V0U3Ryb2tlUkdCQ29sb3IociwgZywgYikge1xuICAgIGNvbnN0IGNvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IociwgZywgYik7XG4gICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcbiAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBjb2xvcjtcbiAgfVxuICBzZXRGaWxsUkdCQ29sb3IociwgZywgYikge1xuICAgIGNvbnN0IGNvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IociwgZywgYik7XG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gY29sb3I7XG4gICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IGNvbG9yO1xuICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IGZhbHNlO1xuICB9XG4gIF9nZXRQYXR0ZXJuKG9iaklkLCBtYXRyaXggPSBudWxsKSB7XG4gICAgbGV0IHBhdHRlcm47XG4gICAgaWYgKHRoaXMuY2FjaGVkUGF0dGVybnMuaGFzKG9iaklkKSkge1xuICAgICAgcGF0dGVybiA9IHRoaXMuY2FjaGVkUGF0dGVybnMuZ2V0KG9iaklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0dGVybiA9IGdldFNoYWRpbmdQYXR0ZXJuKHRoaXMuZ2V0T2JqZWN0KG9iaklkKSk7XG4gICAgICB0aGlzLmNhY2hlZFBhdHRlcm5zLnNldChvYmpJZCwgcGF0dGVybik7XG4gICAgfVxuICAgIGlmIChtYXRyaXgpIHtcbiAgICAgIHBhdHRlcm4ubWF0cml4ID0gbWF0cml4O1xuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybjtcbiAgfVxuICBzaGFkaW5nRmlsbChvYmpJZCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICB0aGlzLnNhdmUoKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5fZ2V0UGF0dGVybihvYmpJZCk7XG4gICAgY3R4LmZpbGxTdHlsZSA9IHBhdHRlcm4uZ2V0UGF0dGVybihjdHgsIHRoaXMsIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCksIFBhdGhUeXBlLlNIQURJTkcpO1xuICAgIGNvbnN0IGludiA9IGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCk7XG4gICAgaWYgKGludikge1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9ID0gY3R4LmNhbnZhcztcbiAgICAgIGNvbnN0IFt4MCwgeTAsIHgxLCB5MV0gPSBVdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCB3aWR0aCwgaGVpZ2h0XSwgaW52KTtcbiAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KC0xZTEwLCAtMWUxMCwgMmUxMCwgMmUxMCk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9zZSh0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpKTtcbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgfVxuICBiZWdpbklubGluZUltYWdlKCkge1xuICAgIHVucmVhY2hhYmxlKFwiU2hvdWxkIG5vdCBjYWxsIGJlZ2luSW5saW5lSW1hZ2VcIik7XG4gIH1cbiAgYmVnaW5JbWFnZURhdGEoKSB7XG4gICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgYmVnaW5JbWFnZURhdGFcIik7XG4gIH1cbiAgcGFpbnRGb3JtWE9iamVjdEJlZ2luKG1hdHJpeCwgYmJveCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNhdmUoKTtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wdXNoKHRoaXMuYmFzZVRyYW5zZm9ybSk7XG4gICAgaWYgKG1hdHJpeCkge1xuICAgICAgdGhpcy50cmFuc2Zvcm0oLi4ubWF0cml4KTtcbiAgICB9XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLmN0eCk7XG4gICAgaWYgKGJib3gpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gYmJveFsyXSAtIGJib3hbMF07XG4gICAgICBjb25zdCBoZWlnaHQgPSBiYm94WzNdIC0gYmJveFsxXTtcbiAgICAgIHRoaXMuY3R4LnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmN1cnJlbnQudXBkYXRlUmVjdE1pbk1heChnZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY3R4KSwgYmJveCk7XG4gICAgICB0aGlzLmNsaXAoKTtcbiAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgIH1cbiAgfVxuICBwYWludEZvcm1YT2JqZWN0RW5kKCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wb3AoKTtcbiAgfVxuICBiZWdpbkdyb3VwKGdyb3VwKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudEN0eCA9IHRoaXMuY3R4O1xuICAgIGlmICghZ3JvdXAuaXNvbGF0ZWQpIHtcbiAgICAgIGluZm8oXCJUT0RPOiBTdXBwb3J0IG5vbi1pc29sYXRlZCBncm91cHMuXCIpO1xuICAgIH1cbiAgICBpZiAoZ3JvdXAua25vY2tvdXQpIHtcbiAgICAgIHdhcm4oXCJLbm9ja291dCBncm91cHMgbm90IHN1cHBvcnRlZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKGN1cnJlbnRDdHgpO1xuICAgIGlmIChncm91cC5tYXRyaXgpIHtcbiAgICAgIGN1cnJlbnRDdHgudHJhbnNmb3JtKC4uLmdyb3VwLm1hdHJpeCk7XG4gICAgfVxuICAgIGlmICghZ3JvdXAuYmJveCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQm91bmRpbmcgYm94IGlzIHJlcXVpcmVkLlwiKTtcbiAgICB9XG4gICAgbGV0IGJvdW5kcyA9IFV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goZ3JvdXAuYmJveCwgZ2V0Q3VycmVudFRyYW5zZm9ybShjdXJyZW50Q3R4KSk7XG4gICAgY29uc3QgY2FudmFzQm91bmRzID0gWzAsIDAsIGN1cnJlbnRDdHguY2FudmFzLndpZHRoLCBjdXJyZW50Q3R4LmNhbnZhcy5oZWlnaHRdO1xuICAgIGJvdW5kcyA9IFV0aWwuaW50ZXJzZWN0KGJvdW5kcywgY2FudmFzQm91bmRzKSB8fCBbMCwgMCwgMCwgMF07XG4gICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGguZmxvb3IoYm91bmRzWzBdKTtcbiAgICBjb25zdCBvZmZzZXRZID0gTWF0aC5mbG9vcihib3VuZHNbMV0pO1xuICAgIGNvbnN0IGRyYXduV2lkdGggPSBNYXRoLm1heChNYXRoLmNlaWwoYm91bmRzWzJdKSAtIG9mZnNldFgsIDEpO1xuICAgIGNvbnN0IGRyYXduSGVpZ2h0ID0gTWF0aC5tYXgoTWF0aC5jZWlsKGJvdW5kc1szXSkgLSBvZmZzZXRZLCAxKTtcbiAgICB0aGlzLmN1cnJlbnQuc3RhcnROZXdQYXRoQW5kQ2xpcEJveChbMCwgMCwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHRdKTtcbiAgICBsZXQgY2FjaGVJZCA9IFwiZ3JvdXBBdFwiICsgdGhpcy5ncm91cExldmVsO1xuICAgIGlmIChncm91cC5zbWFzaykge1xuICAgICAgY2FjaGVJZCArPSBcIl9zbWFza19cIiArIHRoaXMuc21hc2tDb3VudGVyKysgJSAyO1xuICAgIH1cbiAgICBjb25zdCBzY3JhdGNoQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoY2FjaGVJZCwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHQpO1xuICAgIGNvbnN0IGdyb3VwQ3R4ID0gc2NyYXRjaENhbnZhcy5jb250ZXh0O1xuICAgIGdyb3VwQ3R4LnRyYW5zbGF0ZSgtb2Zmc2V0WCwgLW9mZnNldFkpO1xuICAgIGdyb3VwQ3R4LnRyYW5zZm9ybSguLi5jdXJyZW50VHJhbnNmb3JtKTtcbiAgICBpZiAoZ3JvdXAuc21hc2spIHtcbiAgICAgIHRoaXMuc21hc2tTdGFjay5wdXNoKHtcbiAgICAgICAgY2FudmFzOiBzY3JhdGNoQ2FudmFzLmNhbnZhcyxcbiAgICAgICAgY29udGV4dDogZ3JvdXBDdHgsXG4gICAgICAgIG9mZnNldFgsXG4gICAgICAgIG9mZnNldFksXG4gICAgICAgIHN1YnR5cGU6IGdyb3VwLnNtYXNrLnN1YnR5cGUsXG4gICAgICAgIGJhY2tkcm9wOiBncm91cC5zbWFzay5iYWNrZHJvcCxcbiAgICAgICAgdHJhbnNmZXJNYXA6IGdyb3VwLnNtYXNrLnRyYW5zZmVyTWFwIHx8IG51bGwsXG4gICAgICAgIHN0YXJ0VHJhbnNmb3JtSW52ZXJzZTogbnVsbFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRDdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY3VycmVudEN0eC50cmFuc2xhdGUob2Zmc2V0WCwgb2Zmc2V0WSk7XG4gICAgICBjdXJyZW50Q3R4LnNhdmUoKTtcbiAgICB9XG4gICAgY29weUN0eFN0YXRlKGN1cnJlbnRDdHgsIGdyb3VwQ3R4KTtcbiAgICB0aGlzLmN0eCA9IGdyb3VwQ3R4O1xuICAgIHRoaXMuc2V0R1N0YXRlKFtbXCJCTVwiLCBcInNvdXJjZS1vdmVyXCJdLCBbXCJjYVwiLCAxXSwgW1wiQ0FcIiwgMV1dKTtcbiAgICB0aGlzLmdyb3VwU3RhY2sucHVzaChjdXJyZW50Q3R4KTtcbiAgICB0aGlzLmdyb3VwTGV2ZWwrKztcbiAgfVxuICBlbmRHcm91cChncm91cCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmdyb3VwTGV2ZWwtLTtcbiAgICBjb25zdCBncm91cEN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuZ3JvdXBTdGFjay5wb3AoKTtcbiAgICB0aGlzLmN0eCA9IGN0eDtcbiAgICB0aGlzLmN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoZ3JvdXAuc21hc2spIHtcbiAgICAgIHRoaXMudGVtcFNNYXNrID0gdGhpcy5zbWFza1N0YWNrLnBvcCgpO1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNdHggPSBnZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY3R4KTtcbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKC4uLmN1cnJlbnRNdHgpO1xuICAgICAgY29uc3QgZGlydHlCb3ggPSBVdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCBncm91cEN0eC5jYW52YXMud2lkdGgsIGdyb3VwQ3R4LmNhbnZhcy5oZWlnaHRdLCBjdXJyZW50TXR4KTtcbiAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShncm91cEN0eC5jYW52YXMsIDAsIDApO1xuICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgdGhpcy5jb21wb3NlKGRpcnR5Qm94KTtcbiAgICB9XG4gIH1cbiAgYmVnaW5Bbm5vdGF0aW9uKGlkLCByZWN0LCB0cmFuc2Zvcm0sIG1hdHJpeCwgaGFzT3duQ2FudmFzKSB7XG4gICAgdGhpcy4jcmVzdG9yZUluaXRpYWxTdGF0ZSgpO1xuICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgaWYgKHRoaXMuYmFzZVRyYW5zZm9ybSkge1xuICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKC4uLnRoaXMuYmFzZVRyYW5zZm9ybSk7XG4gICAgfVxuICAgIGlmIChyZWN0KSB7XG4gICAgICBjb25zdCB3aWR0aCA9IHJlY3RbMl0gLSByZWN0WzBdO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gcmVjdFszXSAtIHJlY3RbMV07XG4gICAgICBpZiAoaGFzT3duQ2FudmFzICYmIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCkge1xuICAgICAgICB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm0uc2xpY2UoKTtcbiAgICAgICAgdHJhbnNmb3JtWzRdIC09IHJlY3RbMF07XG4gICAgICAgIHRyYW5zZm9ybVs1XSAtPSByZWN0WzFdO1xuICAgICAgICByZWN0ID0gcmVjdC5zbGljZSgpO1xuICAgICAgICByZWN0WzBdID0gcmVjdFsxXSA9IDA7XG4gICAgICAgIHJlY3RbMl0gPSB3aWR0aDtcbiAgICAgICAgcmVjdFszXSA9IGhlaWdodDtcbiAgICAgICAgY29uc3QgW3NjYWxlWCwgc2NhbGVZXSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLmN0eCkpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdmlld3BvcnRTY2FsZVxuICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgY2FudmFzV2lkdGggPSBNYXRoLmNlaWwod2lkdGggKiB0aGlzLm91dHB1dFNjYWxlWCAqIHZpZXdwb3J0U2NhbGUpO1xuICAgICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0ICogdGhpcy5vdXRwdXRTY2FsZVkgKiB2aWV3cG9ydFNjYWxlKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZShjYW52YXNXaWR0aCwgY2FudmFzSGVpZ2h0KTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGNhbnZhcyxcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgIH0gPSB0aGlzLmFubm90YXRpb25DYW52YXM7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcC5zZXQoaWQsIGNhbnZhcyk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eCA9IHRoaXMuY3R4O1xuICAgICAgICB0aGlzLmN0eCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKHNjYWxlWCwgMCwgMCwgLXNjYWxlWSwgMCwgaGVpZ2h0ICogc2NhbGVZKTtcbiAgICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuICAgICAgICB0aGlzLmN0eC5yZWN0KHJlY3RbMF0sIHJlY3RbMV0sIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmN0eC5jbGlwKCk7XG4gICAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQgPSBuZXcgQ2FudmFzRXh0cmFTdGF0ZSh0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMudHJhbnNmb3JtKC4uLnRyYW5zZm9ybSk7XG4gICAgdGhpcy50cmFuc2Zvcm0oLi4ubWF0cml4KTtcbiAgfVxuICBlbmRBbm5vdGF0aW9uKCkge1xuICAgIGlmICh0aGlzLmFubm90YXRpb25DYW52YXMpIHtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIHRoaXMuI2RyYXdGaWx0ZXIoKTtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5hbm5vdGF0aW9uQ2FudmFzLnNhdmVkQ3R4O1xuICAgICAgZGVsZXRlIHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eDtcbiAgICAgIGRlbGV0ZSB0aGlzLmFubm90YXRpb25DYW52YXM7XG4gICAgfVxuICB9XG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdChpbWcpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY291bnQgPSBpbWcuY291bnQ7XG4gICAgaW1nID0gdGhpcy5nZXRPYmplY3QoaW1nLmRhdGEsIGltZyk7XG4gICAgaW1nLmNvdW50ID0gY291bnQ7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZ2x5cGggPSB0aGlzLnByb2Nlc3NpbmdUeXBlMztcbiAgICBpZiAoZ2x5cGgpIHtcbiAgICAgIGlmIChnbHlwaC5jb21waWxlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGdseXBoLmNvbXBpbGVkID0gY29tcGlsZVR5cGUzR2x5cGgoaW1nKTtcbiAgICAgIH1cbiAgICAgIGlmIChnbHlwaC5jb21waWxlZCkge1xuICAgICAgICBnbHlwaC5jb21waWxlZChjdHgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1hc2sgPSB0aGlzLl9jcmVhdGVNYXNrQ2FudmFzKGltZyk7XG4gICAgY29uc3QgbWFza0NhbnZhcyA9IG1hc2suY2FudmFzO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBjdHguZHJhd0ltYWdlKG1hc2tDYW52YXMsIG1hc2sub2Zmc2V0WCwgbWFzay5vZmZzZXRZKTtcbiAgICBjdHgucmVzdG9yZSgpO1xuICAgIHRoaXMuY29tcG9zZSgpO1xuICB9XG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdChpbWcsIHNjYWxlWCwgc2tld1ggPSAwLCBza2V3WSA9IDAsIHNjYWxlWSwgcG9zaXRpb25zKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGltZyA9IHRoaXMuZ2V0T2JqZWN0KGltZy5kYXRhLCBpbWcpO1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KTtcbiAgICBjdHgudHJhbnNmb3JtKHNjYWxlWCwgc2tld1gsIHNrZXdZLCBzY2FsZVksIDAsIDApO1xuICAgIGNvbnN0IG1hc2sgPSB0aGlzLl9jcmVhdGVNYXNrQ2FudmFzKGltZyk7XG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCBtYXNrLm9mZnNldFggLSBjdXJyZW50VHJhbnNmb3JtWzRdLCBtYXNrLm9mZnNldFkgLSBjdXJyZW50VHJhbnNmb3JtWzVdKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgY29uc3QgdHJhbnMgPSBVdGlsLnRyYW5zZm9ybShjdXJyZW50VHJhbnNmb3JtLCBbc2NhbGVYLCBza2V3WCwgc2tld1ksIHNjYWxlWSwgcG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdXSk7XG4gICAgICBjb25zdCBbeCwgeV0gPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFswLCAwXSwgdHJhbnMpO1xuICAgICAgY3R4LmRyYXdJbWFnZShtYXNrLmNhbnZhcywgeCwgeSk7XG4gICAgfVxuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gIH1cbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXAoaW1hZ2VzKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG4gICAgY29uc3QgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDtcbiAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGltYWdlcykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB0cmFuc2Zvcm1cbiAgICAgIH0gPSBpbWFnZTtcbiAgICAgIGNvbnN0IG1hc2tDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcIm1hc2tDYW52YXNcIiwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBtYXNrQ3R4ID0gbWFza0NhbnZhcy5jb250ZXh0O1xuICAgICAgbWFza0N0eC5zYXZlKCk7XG4gICAgICBjb25zdCBpbWcgPSB0aGlzLmdldE9iamVjdChkYXRhLCBpbWFnZSk7XG4gICAgICBwdXRCaW5hcnlJbWFnZU1hc2sobWFza0N0eCwgaW1nKTtcbiAgICAgIG1hc2tDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2UtaW5cIjtcbiAgICAgIG1hc2tDdHguZmlsbFN0eWxlID0gaXNQYXR0ZXJuRmlsbCA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKG1hc2tDdHgsIHRoaXMsIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCksIFBhdGhUeXBlLkZJTEwpIDogZmlsbENvbG9yO1xuICAgICAgbWFza0N0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIG1hc2tDdHgucmVzdG9yZSgpO1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC50cmFuc2Zvcm0oLi4udHJhbnNmb3JtKTtcbiAgICAgIGN0eC5zY2FsZSgxLCAtMSk7XG4gICAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoY3R4LCBtYXNrQ2FudmFzLmNhbnZhcywgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEsIDEpO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gIH1cbiAgcGFpbnRJbWFnZVhPYmplY3Qob2JqSWQpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW1nRGF0YSA9IHRoaXMuZ2V0T2JqZWN0KG9iaklkKTtcbiAgICBpZiAoIWltZ0RhdGEpIHtcbiAgICAgIHdhcm4oXCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpO1xuICB9XG4gIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KG9iaklkLCBzY2FsZVgsIHNjYWxlWSwgcG9zaXRpb25zKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGltZ0RhdGEgPSB0aGlzLmdldE9iamVjdChvYmpJZCk7XG4gICAgaWYgKCFpbWdEYXRhKSB7XG4gICAgICB3YXJuKFwiRGVwZW5kZW50IGltYWdlIGlzbid0IHJlYWR5IHlldFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuICAgIGNvbnN0IG1hcCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBtYXAucHVzaCh7XG4gICAgICAgIHRyYW5zZm9ybTogW3NjYWxlWCwgMCwgMCwgc2NhbGVZLCBwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV1dLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICB3OiB3aWR0aCxcbiAgICAgICAgaDogaGVpZ2h0XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKGltZ0RhdGEsIG1hcCk7XG4gIH1cbiAgYXBwbHlUcmFuc2Zlck1hcHNUb0NhbnZhcyhjdHgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcyAhPT0gXCJub25lXCIpIHtcbiAgICAgIGN0eC5maWx0ZXIgPSB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzO1xuICAgICAgY3R4LmRyYXdJbWFnZShjdHguY2FudmFzLCAwLCAwKTtcbiAgICAgIGN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICB9XG4gICAgcmV0dXJuIGN0eC5jYW52YXM7XG4gIH1cbiAgYXBwbHlUcmFuc2Zlck1hcHNUb0JpdG1hcChpbWdEYXRhKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPT09IFwibm9uZVwiKSB7XG4gICAgICByZXR1cm4gaW1nRGF0YS5iaXRtYXA7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGJpdG1hcCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGltZ0RhdGE7XG4gICAgY29uc3QgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJpbmxpbmVJbWFnZVwiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICB0bXBDdHguZmlsdGVyID0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcztcbiAgICB0bXBDdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCk7XG4gICAgdG1wQ3R4LmZpbHRlciA9IFwibm9uZVwiO1xuICAgIHJldHVybiB0bXBDYW52YXMuY2FudmFzO1xuICB9XG4gIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGlmICghaXNOb2RlSlMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZmlsdGVyXG4gICAgICB9ID0gY3R4O1xuICAgICAgaWYgKGZpbHRlciAhPT0gXCJub25lXCIgJiYgZmlsdGVyICE9PSBcIlwiKSB7XG4gICAgICAgIGN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgY3R4LnNjYWxlKDEgLyB3aWR0aCwgLTEgLyBoZWlnaHQpO1xuICAgIGxldCBpbWdUb1BhaW50O1xuICAgIGlmIChpbWdEYXRhLmJpdG1hcCkge1xuICAgICAgaW1nVG9QYWludCA9IHRoaXMuYXBwbHlUcmFuc2Zlck1hcHNUb0JpdG1hcChpbWdEYXRhKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIGltZ0RhdGEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAhaW1nRGF0YS5kYXRhKSB7XG4gICAgICBpbWdUb1BhaW50ID0gaW1nRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJpbmxpbmVJbWFnZVwiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgcHV0QmluYXJ5SW1hZ2VEYXRhKHRtcEN0eCwgaW1nRGF0YSk7XG4gICAgICBpbWdUb1BhaW50ID0gdGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQ2FudmFzKHRtcEN0eCk7XG4gICAgfVxuICAgIGNvbnN0IHNjYWxlZCA9IHRoaXMuX3NjYWxlSW1hZ2UoaW1nVG9QYWludCwgZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoY3R4KSk7XG4gICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGdldEltYWdlU21vb3RoaW5nRW5hYmxlZChnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCksIGltZ0RhdGEuaW50ZXJwb2xhdGUpO1xuICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhjdHgsIHNjYWxlZC5pbWcsIDAsIDAsIHNjYWxlZC5wYWludFdpZHRoLCBzY2FsZWQucGFpbnRIZWlnaHQsIDAsIC1oZWlnaHQsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHRoaXMuY29tcG9zZSgpO1xuICAgIHRoaXMucmVzdG9yZSgpO1xuICB9XG4gIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAoaW1nRGF0YSwgbWFwKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGxldCBpbWdUb1BhaW50O1xuICAgIGlmIChpbWdEYXRhLmJpdG1hcCkge1xuICAgICAgaW1nVG9QYWludCA9IGltZ0RhdGEuYml0bWFwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB3ID0gaW1nRGF0YS53aWR0aDtcbiAgICAgIGNvbnN0IGggPSBpbWdEYXRhLmhlaWdodDtcbiAgICAgIGNvbnN0IHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgdywgaCk7XG4gICAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICAgIHB1dEJpbmFyeUltYWdlRGF0YSh0bXBDdHgsIGltZ0RhdGEpO1xuICAgICAgaW1nVG9QYWludCA9IHRoaXMuYXBwbHlUcmFuc2Zlck1hcHNUb0NhbnZhcyh0bXBDdHgpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG1hcCkge1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC50cmFuc2Zvcm0oLi4uZW50cnkudHJhbnNmb3JtKTtcbiAgICAgIGN0eC5zY2FsZSgxLCAtMSk7XG4gICAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoY3R4LCBpbWdUb1BhaW50LCBlbnRyeS54LCBlbnRyeS55LCBlbnRyeS53LCBlbnRyeS5oLCAwLCAtMSwgMSwgMSk7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvc2UoKTtcbiAgfVxuICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuICAgIHRoaXMuY29tcG9zZSgpO1xuICB9XG4gIG1hcmtQb2ludCh0YWcpIHt9XG4gIG1hcmtQb2ludFByb3BzKHRhZywgcHJvcGVydGllcykge31cbiAgYmVnaW5NYXJrZWRDb250ZW50KHRhZykge1xuICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe1xuICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIGJlZ2luTWFya2VkQ29udGVudFByb3BzKHRhZywgcHJvcGVydGllcykge1xuICAgIGlmICh0YWcgPT09IFwiT0NcIikge1xuICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICAgIHZpc2libGU6IHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLmlzVmlzaWJsZShwcm9wZXJ0aWVzKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe1xuICAgICAgICB2aXNpYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRoaXMuaXNDb250ZW50VmlzaWJsZSgpO1xuICB9XG4gIGVuZE1hcmtlZENvbnRlbnQoKSB7XG4gICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucG9wKCk7XG4gICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRoaXMuaXNDb250ZW50VmlzaWJsZSgpO1xuICB9XG4gIGJlZ2luQ29tcGF0KCkge31cbiAgZW5kQ29tcGF0KCkge31cbiAgY29uc3VtZVBhdGgoY2xpcEJveCkge1xuICAgIGNvbnN0IGlzRW1wdHkgPSB0aGlzLmN1cnJlbnQuaXNFbXB0eUNsaXAoKTtcbiAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgdGhpcy5jdXJyZW50LnVwZGF0ZUNsaXBGcm9tUGF0aCgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgIHRoaXMuY29tcG9zZShjbGlwQm94KTtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgIGlmICghaXNFbXB0eSkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCA9PT0gRU9fQ0xJUCkge1xuICAgICAgICAgIGN0eC5jbGlwKFwiZXZlbm9kZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdHguY2xpcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50LnN0YXJ0TmV3UGF0aEFuZENsaXBCb3godGhpcy5jdXJyZW50LmNsaXBCb3gpO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgfVxuICBnZXRTaW5nbGVQaXhlbFdpZHRoKCkge1xuICAgIGlmICghdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCkge1xuICAgICAgY29uc3QgbSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0odGhpcy5jdHgpO1xuICAgICAgaWYgKG1bMV0gPT09IDAgJiYgbVsyXSA9PT0gMCkge1xuICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gMSAvIE1hdGgubWluKE1hdGguYWJzKG1bMF0pLCBNYXRoLmFicyhtWzNdKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhYnNEZXQgPSBNYXRoLmFicyhtWzBdICogbVszXSAtIG1bMl0gKiBtWzFdKTtcbiAgICAgICAgY29uc3Qgbm9ybVggPSBNYXRoLmh5cG90KG1bMF0sIG1bMl0pO1xuICAgICAgICBjb25zdCBub3JtWSA9IE1hdGguaHlwb3QobVsxXSwgbVszXSk7XG4gICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBNYXRoLm1heChub3JtWCwgbm9ybVkpIC8gYWJzRGV0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aDtcbiAgfVxuICBnZXRTY2FsZUZvclN0cm9raW5nKCkge1xuICAgIGlmICh0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdID09PSAtMSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBsaW5lV2lkdGhcbiAgICAgIH0gPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGEsXG4gICAgICAgIGIsXG4gICAgICAgIGMsXG4gICAgICAgIGRcbiAgICAgIH0gPSB0aGlzLmN0eC5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgIGxldCBzY2FsZVgsIHNjYWxlWTtcbiAgICAgIGlmIChiID09PSAwICYmIGMgPT09IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybVggPSBNYXRoLmFicyhhKTtcbiAgICAgICAgY29uc3Qgbm9ybVkgPSBNYXRoLmFicyhkKTtcbiAgICAgICAgaWYgKG5vcm1YID09PSBub3JtWSkge1xuICAgICAgICAgIGlmIChsaW5lV2lkdGggPT09IDApIHtcbiAgICAgICAgICAgIHNjYWxlWCA9IHNjYWxlWSA9IDEgLyBub3JtWDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2NhbGVkTGluZVdpZHRoID0gbm9ybVggKiBsaW5lV2lkdGg7XG4gICAgICAgICAgICBzY2FsZVggPSBzY2FsZVkgPSBzY2FsZWRMaW5lV2lkdGggPCAxID8gMSAvIHNjYWxlZExpbmVXaWR0aCA6IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGxpbmVXaWR0aCA9PT0gMCkge1xuICAgICAgICAgIHNjYWxlWCA9IDEgLyBub3JtWDtcbiAgICAgICAgICBzY2FsZVkgPSAxIC8gbm9ybVk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2NhbGVkWExpbmVXaWR0aCA9IG5vcm1YICogbGluZVdpZHRoO1xuICAgICAgICAgIGNvbnN0IHNjYWxlZFlMaW5lV2lkdGggPSBub3JtWSAqIGxpbmVXaWR0aDtcbiAgICAgICAgICBzY2FsZVggPSBzY2FsZWRYTGluZVdpZHRoIDwgMSA/IDEgLyBzY2FsZWRYTGluZVdpZHRoIDogMTtcbiAgICAgICAgICBzY2FsZVkgPSBzY2FsZWRZTGluZVdpZHRoIDwgMSA/IDEgLyBzY2FsZWRZTGluZVdpZHRoIDogMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYWJzRGV0ID0gTWF0aC5hYnMoYSAqIGQgLSBiICogYyk7XG4gICAgICAgIGNvbnN0IG5vcm1YID0gTWF0aC5oeXBvdChhLCBiKTtcbiAgICAgICAgY29uc3Qgbm9ybVkgPSBNYXRoLmh5cG90KGMsIGQpO1xuICAgICAgICBpZiAobGluZVdpZHRoID09PSAwKSB7XG4gICAgICAgICAgc2NhbGVYID0gbm9ybVkgLyBhYnNEZXQ7XG4gICAgICAgICAgc2NhbGVZID0gbm9ybVggLyBhYnNEZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYmFzZUFyZWEgPSBsaW5lV2lkdGggKiBhYnNEZXQ7XG4gICAgICAgICAgc2NhbGVYID0gbm9ybVkgPiBiYXNlQXJlYSA/IG5vcm1ZIC8gYmFzZUFyZWEgOiAxO1xuICAgICAgICAgIHNjYWxlWSA9IG5vcm1YID4gYmFzZUFyZWEgPyBub3JtWCAvIGJhc2VBcmVhIDogMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IHNjYWxlWDtcbiAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMV0gPSBzY2FsZVk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nO1xuICB9XG4gIHJlc2NhbGVBbmRTdHJva2Uoc2F2ZVJlc3RvcmUpIHtcbiAgICBjb25zdCB7XG4gICAgICBjdHhcbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCB7XG4gICAgICBsaW5lV2lkdGhcbiAgICB9ID0gdGhpcy5jdXJyZW50O1xuICAgIGNvbnN0IFtzY2FsZVgsIHNjYWxlWV0gPSB0aGlzLmdldFNjYWxlRm9yU3Ryb2tpbmcoKTtcbiAgICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoIHx8IDE7XG4gICAgaWYgKHNjYWxlWCA9PT0gMSAmJiBzY2FsZVkgPT09IDEpIHtcbiAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGFzaGVzID0gY3R4LmdldExpbmVEYXNoKCk7XG4gICAgaWYgKHNhdmVSZXN0b3JlKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgIH1cbiAgICBjdHguc2NhbGUoc2NhbGVYLCBzY2FsZVkpO1xuICAgIGlmIChkYXNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1heChzY2FsZVgsIHNjYWxlWSk7XG4gICAgICBjdHguc2V0TGluZURhc2goZGFzaGVzLm1hcCh4ID0+IHggLyBzY2FsZSkpO1xuICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0IC89IHNjYWxlO1xuICAgIH1cbiAgICBjdHguc3Ryb2tlKCk7XG4gICAgaWYgKHNhdmVSZXN0b3JlKSB7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbiAgfVxuICBpc0NvbnRlbnRWaXNpYmxlKCkge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKCF0aGlzLm1hcmtlZENvbnRlbnRTdGFja1tpXS52aXNpYmxlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbmZvciAoY29uc3Qgb3AgaW4gT1BTKSB7XG4gIGlmIChDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbb3BdICE9PSB1bmRlZmluZWQpIHtcbiAgICBDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbT1BTW29wXV0gPSBDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbb3BdO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L3dvcmtlcl9vcHRpb25zLmpzXG5jbGFzcyBHbG9iYWxXb3JrZXJPcHRpb25zIHtcbiAgc3RhdGljICNwb3J0ID0gbnVsbDtcbiAgc3RhdGljICNzcmMgPSBcIlwiO1xuICBzdGF0aWMgZ2V0IHdvcmtlclBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3BvcnQ7XG4gIH1cbiAgc3RhdGljIHNldCB3b3JrZXJQb3J0KHZhbCkge1xuICAgIGlmICghKHR5cGVvZiBXb3JrZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsIGluc3RhbmNlb2YgV29ya2VyKSAmJiB2YWwgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYHdvcmtlclBvcnRgIHR5cGUuXCIpO1xuICAgIH1cbiAgICB0aGlzLiNwb3J0ID0gdmFsO1xuICB9XG4gIHN0YXRpYyBnZXQgd29ya2VyU3JjKCkge1xuICAgIHJldHVybiB0aGlzLiNzcmM7XG4gIH1cbiAgc3RhdGljIHNldCB3b3JrZXJTcmModmFsKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYHdvcmtlclNyY2AgdHlwZS5cIik7XG4gICAgfVxuICAgIHRoaXMuI3NyYyA9IHZhbDtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5qc1xuXG5jb25zdCBDYWxsYmFja0tpbmQgPSB7XG4gIFVOS05PV046IDAsXG4gIERBVEE6IDEsXG4gIEVSUk9SOiAyXG59O1xuY29uc3QgU3RyZWFtS2luZCA9IHtcbiAgVU5LTk9XTjogMCxcbiAgQ0FOQ0VMOiAxLFxuICBDQU5DRUxfQ09NUExFVEU6IDIsXG4gIENMT1NFOiAzLFxuICBFTlFVRVVFOiA0LFxuICBFUlJPUjogNSxcbiAgUFVMTDogNixcbiAgUFVMTF9DT01QTEVURTogNyxcbiAgU1RBUlRfQ09NUExFVEU6IDhcbn07XG5mdW5jdGlvbiB3cmFwUmVhc29uKHJlYXNvbikge1xuICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgcmVhc29uID09PSBcIm9iamVjdFwiICYmIHJlYXNvbiAhPT0gbnVsbCkpIHtcbiAgICB1bnJlYWNoYWJsZSgnd3JhcFJlYXNvbjogRXhwZWN0ZWQgXCJyZWFzb25cIiB0byBiZSBhIChwb3NzaWJseSBjbG9uZWQpIEVycm9yLicpO1xuICB9XG4gIHN3aXRjaCAocmVhc29uLm5hbWUpIHtcbiAgICBjYXNlIFwiQWJvcnRFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgQWJvcnRFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpO1xuICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpO1xuICAgIGNhc2UgXCJQYXNzd29yZEV4Y2VwdGlvblwiOlxuICAgICAgcmV0dXJuIG5ldyBQYXNzd29yZEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmNvZGUpO1xuICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uc3RhdHVzKTtcbiAgICBjYXNlIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmRldGFpbHMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLnRvU3RyaW5nKCkpO1xuICB9XG59XG5jbGFzcyBNZXNzYWdlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZU5hbWUsIHRhcmdldE5hbWUsIGNvbU9iaikge1xuICAgIHRoaXMuc291cmNlTmFtZSA9IHNvdXJjZU5hbWU7XG4gICAgdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTtcbiAgICB0aGlzLmNvbU9iaiA9IGNvbU9iajtcbiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxO1xuICAgIHRoaXMuc3RyZWFtSWQgPSAxO1xuICAgIHRoaXMuc3RyZWFtU2lua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuYWN0aW9uSGFuZGxlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSBldmVudCA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgIGlmIChkYXRhLnRhcmdldE5hbWUgIT09IHRoaXMuc291cmNlTmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5zdHJlYW0pIHtcbiAgICAgICAgdGhpcy4jcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrSWQgPSBkYXRhLmNhbGxiYWNrSWQ7XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdO1xuICAgICAgICBpZiAoIWNhcGFiaWxpdHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGNhbGxiYWNrICR7Y2FsbGJhY2tJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTtcbiAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5EQVRBKSB7XG4gICAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEuZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkVSUk9SKSB7XG4gICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgY2FsbGJhY2sgY2FzZVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dO1xuICAgICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogJHtkYXRhLmFjdGlvbn1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmNhbGxiYWNrSWQpIHtcbiAgICAgICAgY29uc3QgY2JTb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lO1xuICAgICAgICBjb25zdCBjYlRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7XG4gICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhKSk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiBjYlNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsXG4gICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkRBVEEsXG4gICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsXG4gICAgICAgICAgICBkYXRhOiByZXN1bHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiBjYlNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsXG4gICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkVSUk9SLFxuICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLFxuICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnN0cmVhbUlkKSB7XG4gICAgICAgIHRoaXMuI2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFjdGlvbihkYXRhLmRhdGEpO1xuICAgIH07XG4gICAgY29tT2JqLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTtcbiAgfVxuICBvbihhY3Rpb25OYW1lLCBoYW5kbGVyKSB7XG4gICAgY29uc3QgYWggPSB0aGlzLmFjdGlvbkhhbmRsZXI7XG4gICAgaWYgKGFoW2FjdGlvbk5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgXCIke2FjdGlvbk5hbWV9XCJgKTtcbiAgICB9XG4gICAgYWhbYWN0aW9uTmFtZV0gPSBoYW5kbGVyO1xuICB9XG4gIHNlbmQoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7XG4gICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLFxuICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuICAgICAgZGF0YVxuICAgIH0sIHRyYW5zZmVycyk7XG4gIH1cbiAgc2VuZFdpdGhQcm9taXNlKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykge1xuICAgIGNvbnN0IGNhbGxiYWNrSWQgPSB0aGlzLmNhbGxiYWNrSWQrKztcbiAgICBjb25zdCBjYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXSA9IGNhcGFiaWxpdHk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG4gICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSxcbiAgICAgICAgY2FsbGJhY2tJZCxcbiAgICAgICAgZGF0YVxuICAgICAgfSwgdHJhbnNmZXJzKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY2FwYWJpbGl0eS5yZWplY3QoZXgpO1xuICAgIH1cbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIHNlbmRXaXRoU3RyZWFtKGFjdGlvbk5hbWUsIGRhdGEsIHF1ZXVlaW5nU3RyYXRlZ3ksIHRyYW5zZmVycykge1xuICAgIGNvbnN0IHN0cmVhbUlkID0gdGhpcy5zdHJlYW1JZCsrLFxuICAgICAgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSxcbiAgICAgIHRhcmdldE5hbWUgPSB0aGlzLnRhcmdldE5hbWUsXG4gICAgICBjb21PYmogPSB0aGlzLmNvbU9iajtcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgIHN0YXJ0OiBjb250cm9sbGVyID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdID0ge1xuICAgICAgICAgIGNvbnRyb2xsZXIsXG4gICAgICAgICAgc3RhcnRDYWxsOiBzdGFydENhcGFiaWxpdHksXG4gICAgICAgICAgcHVsbENhbGw6IG51bGwsXG4gICAgICAgICAgY2FuY2VsQ2FsbDogbnVsbCxcbiAgICAgICAgICBpc0Nsb3NlZDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemVcbiAgICAgICAgfSwgdHJhbnNmZXJzKTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0Q2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgfSxcbiAgICAgIHB1bGw6IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICBjb25zdCBwdWxsQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCA9IHB1bGxDYXBhYmlsaXR5O1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTCxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHB1bGxDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICB9LFxuICAgICAgY2FuY2VsOiByZWFzb24gPT4ge1xuICAgICAgICBhc3NlcnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsIFwiY2FuY2VsIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvblwiKTtcbiAgICAgICAgY29uc3QgY2FuY2VsQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsID0gY2FuY2VsQ2FwYWJpbGl0eTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2FuY2VsQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgfVxuICAgIH0sIHF1ZXVlaW5nU3RyYXRlZ3kpO1xuICB9XG4gICNjcmVhdGVTdHJlYW1TaW5rKGRhdGEpIHtcbiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsXG4gICAgICBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZSxcbiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzLFxuICAgICAgYWN0aW9uID0gdGhpcy5hY3Rpb25IYW5kbGVyW2RhdGEuYWN0aW9uXTtcbiAgICBjb25zdCBzdHJlYW1TaW5rID0ge1xuICAgICAgZW5xdWV1ZShjaHVuaywgc2l6ZSA9IDEsIHRyYW5zZmVycykge1xuICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXN0RGVzaXJlZFNpemUgPSB0aGlzLmRlc2lyZWRTaXplO1xuICAgICAgICB0aGlzLmRlc2lyZWRTaXplIC09IHNpemU7XG4gICAgICAgIGlmIChsYXN0RGVzaXJlZFNpemUgPiAwICYmIHRoaXMuZGVzaXJlZFNpemUgPD0gMCkge1xuICAgICAgICAgIHRoaXMuc2lua0NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5FTlFVRVVFLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIGNodW5rXG4gICAgICAgIH0sIHRyYW5zZmVycyk7XG4gICAgICB9LFxuICAgICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0xPU0UsXG4gICAgICAgICAgc3RyZWFtSWRcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTtcbiAgICAgIH0sXG4gICAgICBlcnJvcihyZWFzb24pIHtcbiAgICAgICAgYXNzZXJ0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCBcImVycm9yIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvblwiKTtcbiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5FUlJPUixcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBzaW5rQ2FwYWJpbGl0eTogUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCksXG4gICAgICBvblB1bGw6IG51bGwsXG4gICAgICBvbkNhbmNlbDogbnVsbCxcbiAgICAgIGlzQ2FuY2VsbGVkOiBmYWxzZSxcbiAgICAgIGRlc2lyZWRTaXplOiBkYXRhLmRlc2lyZWRTaXplLFxuICAgICAgcmVhZHk6IG51bGxcbiAgICB9O1xuICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIHN0cmVhbVNpbmsucmVhZHkgPSBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0gPSBzdHJlYW1TaW5rO1xuICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKGFjdGlvbihkYXRhLmRhdGEsIHN0cmVhbVNpbmspKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSxcbiAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSxcbiAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAjcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSkge1xuICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZCxcbiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lLFxuICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7XG4gICAgY29uc3Qgc3RyZWFtQ29udHJvbGxlciA9IHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLFxuICAgICAgc3RyZWFtU2luayA9IHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdO1xuICAgIHN3aXRjaCAoZGF0YS5zdHJlYW0pIHtcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURTpcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnN0YXJ0Q2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEU6XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTDpcbiAgICAgICAgaWYgKCFzdHJlYW1TaW5rKSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyZWFtU2luay5kZXNpcmVkU2l6ZSA8PSAwICYmIGRhdGEuZGVzaXJlZFNpemUgPiAwKSB7XG4gICAgICAgICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtU2luay5kZXNpcmVkU2l6ZSA9IGRhdGEuZGVzaXJlZFNpemU7XG4gICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShzdHJlYW1TaW5rLm9uUHVsbD8uKCkpO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5FTlFVRVVFOlxuICAgICAgICBhc3NlcnQoc3RyZWFtQ29udHJvbGxlciwgXCJlbnF1ZXVlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyXCIpO1xuICAgICAgICBpZiAoc3RyZWFtQ29udHJvbGxlci5pc0Nsb3NlZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5lbnF1ZXVlKGRhdGEuY2h1bmspO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5DTE9TRTpcbiAgICAgICAgYXNzZXJ0KHN0cmVhbUNvbnRyb2xsZXIsIFwiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG4gICAgICAgIGlmIChzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtQ29udHJvbGxlci5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuRVJST1I6XG4gICAgICAgIGFzc2VydChzdHJlYW1Db250cm9sbGVyLCBcImVycm9yIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyXCIpO1xuICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFOlxuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jYW5jZWxDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNhbmNlbENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMOlxuICAgICAgICBpZiAoIXN0cmVhbVNpbmspIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlc29sdmUoc3RyZWFtU2luay5vbkNhbmNlbD8uKHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKSk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG4gICAgICAgIHN0cmVhbVNpbmsuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICBkZWxldGUgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBzdHJlYW0gY2FzZVwiKTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3N0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsPy5wcm9taXNlLCBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsPy5wcm9taXNlLCBzdHJlYW1Db250cm9sbGVyLmNhbmNlbENhbGw/LnByb21pc2VdKTtcbiAgICBkZWxldGUgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF07XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbU9iai5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvbWV0YWRhdGEuanNcblxuY2xhc3MgTWV0YWRhdGEge1xuICAjbWV0YWRhdGFNYXA7XG4gICNkYXRhO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgcGFyc2VkRGF0YSxcbiAgICByYXdEYXRhXG4gIH0pIHtcbiAgICB0aGlzLiNtZXRhZGF0YU1hcCA9IHBhcnNlZERhdGE7XG4gICAgdGhpcy4jZGF0YSA9IHJhd0RhdGE7XG4gIH1cbiAgZ2V0UmF3KCkge1xuICAgIHJldHVybiB0aGlzLiNkYXRhO1xuICB9XG4gIGdldChuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuI21ldGFkYXRhTWFwLmdldChuYW1lKSA/PyBudWxsO1xuICB9XG4gIGdldEFsbCgpIHtcbiAgICByZXR1cm4gb2JqZWN0RnJvbU1hcCh0aGlzLiNtZXRhZGF0YU1hcCk7XG4gIH1cbiAgaGFzKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy4jbWV0YWRhdGFNYXAuaGFzKG5hbWUpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L29wdGlvbmFsX2NvbnRlbnRfY29uZmlnLmpzXG5cblxuY29uc3QgSU5URVJOQUwgPSBTeW1ib2woXCJJTlRFUk5BTFwiKTtcbmNsYXNzIE9wdGlvbmFsQ29udGVudEdyb3VwIHtcbiAgI2lzRGlzcGxheSA9IGZhbHNlO1xuICAjaXNQcmludCA9IGZhbHNlO1xuICAjdXNlclNldCA9IGZhbHNlO1xuICAjdmlzaWJsZSA9IHRydWU7XG4gIGNvbnN0cnVjdG9yKHJlbmRlcmluZ0ludGVudCwge1xuICAgIG5hbWUsXG4gICAgaW50ZW50LFxuICAgIHVzYWdlXG4gIH0pIHtcbiAgICB0aGlzLiNpc0Rpc3BsYXkgPSAhIShyZW5kZXJpbmdJbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVkpO1xuICAgIHRoaXMuI2lzUHJpbnQgPSAhIShyZW5kZXJpbmdJbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuaW50ZW50ID0gaW50ZW50O1xuICAgIHRoaXMudXNhZ2UgPSB1c2FnZTtcbiAgfVxuICBnZXQgdmlzaWJsZSgpIHtcbiAgICBpZiAodGhpcy4jdXNlclNldCkge1xuICAgICAgcmV0dXJuIHRoaXMuI3Zpc2libGU7XG4gICAgfVxuICAgIGlmICghdGhpcy4jdmlzaWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBwcmludCxcbiAgICAgIHZpZXdcbiAgICB9ID0gdGhpcy51c2FnZTtcbiAgICBpZiAodGhpcy4jaXNEaXNwbGF5KSB7XG4gICAgICByZXR1cm4gdmlldz8udmlld1N0YXRlICE9PSBcIk9GRlwiO1xuICAgIH0gZWxzZSBpZiAodGhpcy4jaXNQcmludCkge1xuICAgICAgcmV0dXJuIHByaW50Py5wcmludFN0YXRlICE9PSBcIk9GRlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBfc2V0VmlzaWJsZShpbnRlcm5hbCwgdmlzaWJsZSwgdXNlclNldCA9IGZhbHNlKSB7XG4gICAgaWYgKGludGVybmFsICE9PSBJTlRFUk5BTCkge1xuICAgICAgdW5yZWFjaGFibGUoXCJJbnRlcm5hbCBtZXRob2QgYF9zZXRWaXNpYmxlYCBjYWxsZWQuXCIpO1xuICAgIH1cbiAgICB0aGlzLiN1c2VyU2V0ID0gdXNlclNldDtcbiAgICB0aGlzLiN2aXNpYmxlID0gdmlzaWJsZTtcbiAgfVxufVxuY2xhc3MgT3B0aW9uYWxDb250ZW50Q29uZmlnIHtcbiAgI2NhY2hlZEdldEhhc2ggPSBudWxsO1xuICAjZ3JvdXBzID0gbmV3IE1hcCgpO1xuICAjaW5pdGlhbEhhc2ggPSBudWxsO1xuICAjb3JkZXIgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihkYXRhLCByZW5kZXJpbmdJbnRlbnQgPSBSZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVkpIHtcbiAgICB0aGlzLnJlbmRlcmluZ0ludGVudCA9IHJlbmRlcmluZ0ludGVudDtcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgIHRoaXMuY3JlYXRvciA9IG51bGw7XG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMuY3JlYXRvciA9IGRhdGEuY3JlYXRvcjtcbiAgICB0aGlzLiNvcmRlciA9IGRhdGEub3JkZXI7XG4gICAgZm9yIChjb25zdCBncm91cCBvZiBkYXRhLmdyb3Vwcykge1xuICAgICAgdGhpcy4jZ3JvdXBzLnNldChncm91cC5pZCwgbmV3IE9wdGlvbmFsQ29udGVudEdyb3VwKHJlbmRlcmluZ0ludGVudCwgZ3JvdXApKTtcbiAgICB9XG4gICAgaWYgKGRhdGEuYmFzZVN0YXRlID09PSBcIk9GRlwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuI2dyb3Vwcy52YWx1ZXMoKSkge1xuICAgICAgICBncm91cC5fc2V0VmlzaWJsZShJTlRFUk5BTCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9uIG9mIGRhdGEub24pIHtcbiAgICAgIHRoaXMuI2dyb3Vwcy5nZXQob24pLl9zZXRWaXNpYmxlKElOVEVSTkFMLCB0cnVlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvZmYgb2YgZGF0YS5vZmYpIHtcbiAgICAgIHRoaXMuI2dyb3Vwcy5nZXQob2ZmKS5fc2V0VmlzaWJsZShJTlRFUk5BTCwgZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLiNpbml0aWFsSGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuICB9XG4gICNldmFsdWF0ZVZpc2liaWxpdHlFeHByZXNzaW9uKGFycmF5KSB7XG4gICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBhcnJheVswXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaV07XG4gICAgICBsZXQgc3RhdGU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50KSkge1xuICAgICAgICBzdGF0ZSA9IHRoaXMuI2V2YWx1YXRlVmlzaWJpbGl0eUV4cHJlc3Npb24oZWxlbWVudCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI2dyb3Vwcy5oYXMoZWxlbWVudCkpIHtcbiAgICAgICAgc3RhdGUgPSB0aGlzLiNncm91cHMuZ2V0KGVsZW1lbnQpLnZpc2libGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtlbGVtZW50fWApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSBcIkFuZFwiOlxuICAgICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJPclwiOlxuICAgICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTm90XCI6XG4gICAgICAgICAgcmV0dXJuICFzdGF0ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9wZXJhdG9yID09PSBcIkFuZFwiO1xuICB9XG4gIGlzVmlzaWJsZShncm91cCkge1xuICAgIGlmICh0aGlzLiNncm91cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghZ3JvdXApIHtcbiAgICAgIGluZm8oXCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZ3JvdXAudHlwZSA9PT0gXCJPQ0dcIikge1xuICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtncm91cC5pZH1gKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy4jZ3JvdXBzLmdldChncm91cC5pZCkudmlzaWJsZTtcbiAgICB9IGVsc2UgaWYgKGdyb3VwLnR5cGUgPT09IFwiT0NNRFwiKSB7XG4gICAgICBpZiAoZ3JvdXAuZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXZhbHVhdGVWaXNpYmlsaXR5RXhwcmVzc2lvbihncm91cC5leHByZXNzaW9uKTtcbiAgICAgIH1cbiAgICAgIGlmICghZ3JvdXAucG9saWN5IHx8IGdyb3VwLnBvbGljeSA9PT0gXCJBbnlPblwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuI2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGdyb3VwLnBvbGljeSA9PT0gXCJBbGxPblwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09IFwiQW55T2ZmXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGdyb3VwLnBvbGljeSA9PT0gXCJBbGxPZmZcIikge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdyb3VwLmlkcykge1xuICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLiNncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgd2FybihgVW5rbm93biBvcHRpb25hbCBjb250ZW50IHBvbGljeSAke2dyb3VwLnBvbGljeX0uYCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgd2FybihgVW5rbm93biBncm91cCB0eXBlICR7Z3JvdXAudHlwZX0uYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc2V0VmlzaWJpbGl0eShpZCwgdmlzaWJsZSA9IHRydWUpIHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuI2dyb3Vwcy5nZXQoaWQpO1xuICAgIGlmICghZ3JvdXApIHtcbiAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBncm91cC5fc2V0VmlzaWJsZShJTlRFUk5BTCwgISF2aXNpYmxlLCB0cnVlKTtcbiAgICB0aGlzLiNjYWNoZWRHZXRIYXNoID0gbnVsbDtcbiAgfVxuICBzZXRPQ0dTdGF0ZSh7XG4gICAgc3RhdGUsXG4gICAgcHJlc2VydmVSQlxuICB9KSB7XG4gICAgbGV0IG9wZXJhdG9yO1xuICAgIGZvciAoY29uc3QgZWxlbSBvZiBzdGF0ZSkge1xuICAgICAgc3dpdGNoIChlbGVtKSB7XG4gICAgICAgIGNhc2UgXCJPTlwiOlxuICAgICAgICBjYXNlIFwiT0ZGXCI6XG4gICAgICAgIGNhc2UgXCJUb2dnbGVcIjpcbiAgICAgICAgICBvcGVyYXRvciA9IGVsZW07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuI2dyb3Vwcy5nZXQoZWxlbSk7XG4gICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICBjYXNlIFwiT05cIjpcbiAgICAgICAgICBncm91cC5fc2V0VmlzaWJsZShJTlRFUk5BTCwgdHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJPRkZcIjpcbiAgICAgICAgICBncm91cC5fc2V0VmlzaWJsZShJTlRFUk5BTCwgZmFsc2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiVG9nZ2xlXCI6XG4gICAgICAgICAgZ3JvdXAuX3NldFZpc2libGUoSU5URVJOQUwsICFncm91cC52aXNpYmxlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jY2FjaGVkR2V0SGFzaCA9IG51bGw7XG4gIH1cbiAgZ2V0IGhhc0luaXRpYWxWaXNpYmlsaXR5KCkge1xuICAgIHJldHVybiB0aGlzLiNpbml0aWFsSGFzaCA9PT0gbnVsbCB8fCB0aGlzLmdldEhhc2goKSA9PT0gdGhpcy4jaW5pdGlhbEhhc2g7XG4gIH1cbiAgZ2V0T3JkZXIoKSB7XG4gICAgaWYgKCF0aGlzLiNncm91cHMuc2l6ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLiNvcmRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuI29yZGVyLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBbLi4udGhpcy4jZ3JvdXBzLmtleXMoKV07XG4gIH1cbiAgZ2V0R3JvdXBzKCkge1xuICAgIHJldHVybiB0aGlzLiNncm91cHMuc2l6ZSA+IDAgPyBvYmplY3RGcm9tTWFwKHRoaXMuI2dyb3VwcykgOiBudWxsO1xuICB9XG4gIGdldEdyb3VwKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuI2dyb3Vwcy5nZXQoaWQpIHx8IG51bGw7XG4gIH1cbiAgZ2V0SGFzaCgpIHtcbiAgICBpZiAodGhpcy4jY2FjaGVkR2V0SGFzaCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuI2NhY2hlZEdldEhhc2g7XG4gICAgfVxuICAgIGNvbnN0IGhhc2ggPSBuZXcgTXVybXVySGFzaDNfNjQoKTtcbiAgICBmb3IgKGNvbnN0IFtpZCwgZ3JvdXBdIG9mIHRoaXMuI2dyb3Vwcykge1xuICAgICAgaGFzaC51cGRhdGUoYCR7aWR9OiR7Z3JvdXAudmlzaWJsZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlZEdldEhhc2ggPSBoYXNoLmhleGRpZ2VzdCgpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L3RyYW5zcG9ydF9zdHJlYW0uanNcblxuXG5jbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtIHtcbiAgY29uc3RydWN0b3IocGRmRGF0YVJhbmdlVHJhbnNwb3J0LCB7XG4gICAgZGlzYWJsZVJhbmdlID0gZmFsc2UsXG4gICAgZGlzYWJsZVN0cmVhbSA9IGZhbHNlXG4gIH0pIHtcbiAgICBhc3NlcnQocGRmRGF0YVJhbmdlVHJhbnNwb3J0LCAnUERGRGF0YVRyYW5zcG9ydFN0cmVhbSAtIG1pc3NpbmcgcmVxdWlyZWQgXCJwZGZEYXRhUmFuZ2VUcmFuc3BvcnRcIiBhcmd1bWVudC4nKTtcbiAgICBjb25zdCB7XG4gICAgICBsZW5ndGgsXG4gICAgICBpbml0aWFsRGF0YSxcbiAgICAgIHByb2dyZXNzaXZlRG9uZSxcbiAgICAgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lXG4gICAgfSA9IHBkZkRhdGFSYW5nZVRyYW5zcG9ydDtcbiAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBbXTtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmUgPSBwcm9ncmVzc2l2ZURvbmU7XG4gICAgdGhpcy5fY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTtcbiAgICBpZiAoaW5pdGlhbERhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGluaXRpYWxEYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBpbml0aWFsRGF0YS5ieXRlTGVuZ3RoID09PSBpbml0aWFsRGF0YS5idWZmZXIuYnl0ZUxlbmd0aCA/IGluaXRpYWxEYXRhLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KGluaXRpYWxEYXRhKS5idWZmZXI7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChidWZmZXIpO1xuICAgIH1cbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQ7XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhZGlzYWJsZVN0cmVhbTtcbiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIWRpc2FibGVSYW5nZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gbGVuZ3RoO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9yYW5nZVJlYWRlcnMgPSBbXTtcbiAgICBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUmFuZ2VMaXN0ZW5lcigoYmVnaW4sIGNodW5rKSA9PiB7XG4gICAgICB0aGlzLl9vblJlY2VpdmVEYXRhKHtcbiAgICAgICAgYmVnaW4sXG4gICAgICAgIGNodW5rXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NMaXN0ZW5lcigobG9hZGVkLCB0b3RhbCkgPT4ge1xuICAgICAgdGhpcy5fb25Qcm9ncmVzcyh7XG4gICAgICAgIGxvYWRlZCxcbiAgICAgICAgdG90YWxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcihjaHVuayA9PiB7XG4gICAgICB0aGlzLl9vblJlY2VpdmVEYXRhKHtcbiAgICAgICAgY2h1bmtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcigoKSA9PiB7XG4gICAgICB0aGlzLl9vblByb2dyZXNzaXZlRG9uZSgpO1xuICAgIH0pO1xuICAgIHBkZkRhdGFSYW5nZVRyYW5zcG9ydC50cmFuc3BvcnRSZWFkeSgpO1xuICB9XG4gIF9vblJlY2VpdmVEYXRhKHtcbiAgICBiZWdpbixcbiAgICBjaHVua1xuICB9KSB7XG4gICAgY29uc3QgYnVmZmVyID0gY2h1bmsgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGNodW5rLmJ5dGVMZW5ndGggPT09IGNodW5rLmJ1ZmZlci5ieXRlTGVuZ3RoID8gY2h1bmsuYnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjtcbiAgICBpZiAoYmVnaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7XG4gICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9lbnF1ZXVlKGJ1ZmZlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChidWZmZXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmb3VuZCA9IHRoaXMuX3JhbmdlUmVhZGVycy5zb21lKGZ1bmN0aW9uIChyYW5nZVJlYWRlcikge1xuICAgICAgICBpZiAocmFuZ2VSZWFkZXIuX2JlZ2luICE9PSBiZWdpbikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByYW5nZVJlYWRlci5fZW5xdWV1ZShidWZmZXIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0KGZvdW5kLCBcIl9vblJlY2VpdmVEYXRhIC0gbm8gYFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcmAgaW5zdGFuY2UgZm91bmQuXCIpO1xuICAgIH1cbiAgfVxuICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/Ll9sb2FkZWQgPz8gMDtcbiAgfVxuICBfb25Qcm9ncmVzcyhldnQpIHtcbiAgICBpZiAoZXZ0LnRvdGFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3JhbmdlUmVhZGVyc1swXT8ub25Qcm9ncmVzcz8uKHtcbiAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/Lm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcbiAgICAgICAgdG90YWw6IGV2dC50b3RhbFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIF9vblByb2dyZXNzaXZlRG9uZSgpIHtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8ucHJvZ3Jlc3NpdmVEb25lKCk7XG4gICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gdHJ1ZTtcbiAgfVxuICBfcmVtb3ZlUmFuZ2VSZWFkZXIocmVhZGVyKSB7XG4gICAgY29uc3QgaSA9IHRoaXMuX3JhbmdlUmVhZGVycy5pbmRleE9mKHJlYWRlcik7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fcmFuZ2VSZWFkZXJzLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cbiAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICBhc3NlcnQoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERkRhdGFUcmFuc3BvcnRTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG4gICAgY29uc3QgcXVldWVkQ2h1bmtzID0gdGhpcy5fcXVldWVkQ2h1bmtzO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IG51bGw7XG4gICAgcmV0dXJuIG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyKHRoaXMsIHF1ZXVlZENodW5rcywgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lLCB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSk7XG4gIH1cbiAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkge1xuICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZShiZWdpbiwgZW5kKTtcbiAgICB0aGlzLl9yYW5nZVJlYWRlcnMucHVzaChyZWFkZXIpO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH1cbiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMuX3JhbmdlUmVhZGVycy5zbGljZSgwKSkge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWJvcnQoKTtcbiAgfVxufVxuY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgcXVldWVkQ2h1bmtzLCBwcm9ncmVzc2l2ZURvbmUgPSBmYWxzZSwgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBudWxsKSB7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuX2RvbmUgPSBwcm9ncmVzc2l2ZURvbmUgfHwgZmFsc2U7XG4gICAgdGhpcy5fZmlsZW5hbWUgPSBpc1BkZkZpbGUoY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUpID8gY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgOiBudWxsO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IHF1ZXVlZENodW5rcyB8fCBbXTtcbiAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgdGhpcy5fcXVldWVkQ2h1bmtzKSB7XG4gICAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9oZWFkZXJzUmVhZHkgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBzdHJlYW0uX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcztcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIF9lbnF1ZXVlKGNodW5rKSB7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2goY2h1bmspO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgfVxuICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVhZHk7XG4gIH1cbiAgZ2V0IGZpbGVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgfVxuICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1JhbmdlU3VwcG9ydGVkO1xuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9jb250ZW50TGVuZ3RoO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3F1ZXVlZENodW5rcy5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG4gICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgfVxuICBwcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gIH1cbn1cbmNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgYmVnaW4sIGVuZCkge1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9iZWdpbiA9IGJlZ2luO1xuICAgIHRoaXMuX2VuZCA9IGVuZDtcbiAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuICBfZW5xdWV1ZShjaHVuaykge1xuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gY2h1bms7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RzQ2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICByZXF1ZXN0c0NhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmspIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcbiAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX3N0cmVhbS5fcmVtb3ZlUmFuZ2VSZWFkZXIodGhpcyk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvY29udGVudF9kaXNwb3NpdGlvbi5qc1xuXG5mdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIoY29udGVudERpc3Bvc2l0aW9uKSB7XG4gIGxldCBuZWVkc0VuY29kaW5nRml4dXAgPSB0cnVlO1xuICBsZXQgdG1wID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXFxcXCpcIiwgXCJpXCIpLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTtcbiAgaWYgKHRtcCkge1xuICAgIHRtcCA9IHRtcFsxXTtcbiAgICBsZXQgZmlsZW5hbWUgPSByZmMyNjE2dW5xdW90ZSh0bXApO1xuICAgIGZpbGVuYW1lID0gdW5lc2NhcGUoZmlsZW5hbWUpO1xuICAgIGZpbGVuYW1lID0gcmZjNTk4N2RlY29kZShmaWxlbmFtZSk7XG4gICAgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKGZpbGVuYW1lKTtcbiAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7XG4gIH1cbiAgdG1wID0gcmZjMjIzMWdldHBhcmFtKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gIGlmICh0bXApIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUodG1wKTtcbiAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7XG4gIH1cbiAgdG1wID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXCIsIFwiaVwiKS5leGVjKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gIGlmICh0bXApIHtcbiAgICB0bXAgPSB0bXBbMV07XG4gICAgbGV0IGZpbGVuYW1lID0gcmZjMjYxNnVucXVvdGUodG1wKTtcbiAgICBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUoZmlsZW5hbWUpO1xuICAgIHJldHVybiBmaXh1cEVuY29kaW5nKGZpbGVuYW1lKTtcbiAgfVxuICBmdW5jdGlvbiB0b1BhcmFtUmVnRXhwKGF0dHJpYnV0ZVBhdHRlcm4sIGZsYWdzKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXCIoPzpefDspXFxcXHMqXCIgKyBhdHRyaWJ1dGVQYXR0ZXJuICsgXCJcXFxccyo9XFxcXHMqXCIgKyBcIihcIiArICdbXlwiO1xcXFxzXVteO1xcXFxzXSonICsgXCJ8XCIgKyAnXCIoPzpbXlwiXFxcXFxcXFxdfFxcXFxcXFxcXCI/KStcIj8nICsgXCIpXCIsIGZsYWdzKTtcbiAgfVxuICBmdW5jdGlvbiB0ZXh0ZGVjb2RlKGVuY29kaW5nLCB2YWx1ZSkge1xuICAgIGlmIChlbmNvZGluZykge1xuICAgICAgaWYgKCEvXltcXHgwMC1cXHhGRl0rJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZywge1xuICAgICAgICAgIGZhdGFsOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICAgICAgdmFsdWUgPSBkZWNvZGVyLmRlY29kZShidWZmZXIpO1xuICAgICAgICBuZWVkc0VuY29kaW5nRml4dXAgPSBmYWxzZTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIGZpeHVwRW5jb2RpbmcodmFsdWUpIHtcbiAgICBpZiAobmVlZHNFbmNvZGluZ0ZpeHVwICYmIC9bXFx4ODAtXFx4ZmZdLy50ZXN0KHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSB0ZXh0ZGVjb2RlKFwidXRmLThcIiwgdmFsdWUpO1xuICAgICAgaWYgKG5lZWRzRW5jb2RpbmdGaXh1cCkge1xuICAgICAgICB2YWx1ZSA9IHRleHRkZWNvZGUoXCJpc28tODg1OS0xXCIsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzIyMzFnZXRwYXJhbShjb250ZW50RGlzcG9zaXRpb25TdHIpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgbGV0IG1hdGNoO1xuICAgIGNvbnN0IGl0ZXIgPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcXFxcKigoPyEwXFxcXGQpXFxcXGQrKShcXFxcKj8pXCIsIFwiaWdcIik7XG4gICAgd2hpbGUgKChtYXRjaCA9IGl0ZXIuZXhlYyhjb250ZW50RGlzcG9zaXRpb25TdHIpKSAhPT0gbnVsbCkge1xuICAgICAgbGV0IFssIG4sIHF1b3QsIHBhcnRdID0gbWF0Y2g7XG4gICAgICBuID0gcGFyc2VJbnQobiwgMTApO1xuICAgICAgaWYgKG4gaW4gbWF0Y2hlcykge1xuICAgICAgICBpZiAobiA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbWF0Y2hlc1tuXSA9IFtxdW90LCBwYXJ0XTtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IG1hdGNoZXMubGVuZ3RoOyArK24pIHtcbiAgICAgIGlmICghKG4gaW4gbWF0Y2hlcykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsZXQgW3F1b3QsIHBhcnRdID0gbWF0Y2hlc1tuXTtcbiAgICAgIHBhcnQgPSByZmMyNjE2dW5xdW90ZShwYXJ0KTtcbiAgICAgIGlmIChxdW90KSB7XG4gICAgICAgIHBhcnQgPSB1bmVzY2FwZShwYXJ0KTtcbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBwYXJ0ID0gcmZjNTk4N2RlY29kZShwYXJ0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFydHMucHVzaChwYXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcIik7XG4gIH1cbiAgZnVuY3Rpb24gcmZjMjYxNnVucXVvdGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zbGljZSgxKS5zcGxpdCgnXFxcXFwiJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHF1b3RpbmRleCA9IHBhcnRzW2ldLmluZGV4T2YoJ1wiJyk7XG4gICAgICAgIGlmIChxdW90aW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5zbGljZSgwLCBxdW90aW5kZXgpO1xuICAgICAgICAgIHBhcnRzLmxlbmd0aCA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzW2ldID0gcGFydHNbaV0ucmVwbGFjZUFsbCgvXFxcXCguKS9nLCBcIiQxXCIpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBwYXJ0cy5qb2luKCdcIicpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgZnVuY3Rpb24gcmZjNTk4N2RlY29kZShleHR2YWx1ZSkge1xuICAgIGNvbnN0IGVuY29kaW5nZW5kID0gZXh0dmFsdWUuaW5kZXhPZihcIidcIik7XG4gICAgaWYgKGVuY29kaW5nZW5kID09PSAtMSkge1xuICAgICAgcmV0dXJuIGV4dHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBlbmNvZGluZyA9IGV4dHZhbHVlLnNsaWNlKDAsIGVuY29kaW5nZW5kKTtcbiAgICBjb25zdCBsYW5ndmFsdWUgPSBleHR2YWx1ZS5zbGljZShlbmNvZGluZ2VuZCArIDEpO1xuICAgIGNvbnN0IHZhbHVlID0gbGFuZ3ZhbHVlLnJlcGxhY2UoL15bXiddKicvLCBcIlwiKTtcbiAgICByZXR1cm4gdGV4dGRlY29kZShlbmNvZGluZywgdmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzIwNDdkZWNvZGUodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoXCI9P1wiKSB8fCAvW1xceDAwLVxceDE5XFx4ODAtXFx4ZmZdLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvPVxcPyhbXFx3LV0qKVxcPyhbUXFCYl0pXFw/KCg/OlteP118XFw/KD8hPSkpKilcXD89L2csIGZ1bmN0aW9uIChtYXRjaGVzLCBjaGFyc2V0LCBlbmNvZGluZywgdGV4dCkge1xuICAgICAgaWYgKGVuY29kaW5nID09PSBcInFcIiB8fCBlbmNvZGluZyA9PT0gXCJRXCIpIHtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZUFsbChcIl9cIiwgXCIgXCIpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKC89KFswLTlhLWZBLUZdezJ9KS9nLCBmdW5jdGlvbiAobWF0Y2gsIGhleCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleCwgMTYpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0ZXh0ZGVjb2RlKGNoYXJzZXQsIHRleHQpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGV4dCA9IGF0b2IodGV4dCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgICByZXR1cm4gdGV4dGRlY29kZShjaGFyc2V0LCB0ZXh0KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvbmV0d29ya191dGlscy5qc1xuXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoe1xuICBnZXRSZXNwb25zZUhlYWRlcixcbiAgaXNIdHRwLFxuICByYW5nZUNodW5rU2l6ZSxcbiAgZGlzYWJsZVJhbmdlXG59KSB7XG4gIGNvbnN0IHJldHVyblZhbHVlcyA9IHtcbiAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IGZhbHNlLFxuICAgIHN1Z2dlc3RlZExlbmd0aDogdW5kZWZpbmVkXG4gIH07XG4gIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KGdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1MZW5ndGhcIiksIDEwKTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGxlbmd0aCkpIHtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuICB9XG4gIHJldHVyblZhbHVlcy5zdWdnZXN0ZWRMZW5ndGggPSBsZW5ndGg7XG4gIGlmIChsZW5ndGggPD0gMiAqIHJhbmdlQ2h1bmtTaXplKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuICBpZiAoZGlzYWJsZVJhbmdlIHx8ICFpc0h0dHApIHtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuICB9XG4gIGlmIChnZXRSZXNwb25zZUhlYWRlcihcIkFjY2VwdC1SYW5nZXNcIikgIT09IFwiYnl0ZXNcIikge1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH1cbiAgY29uc3QgY29udGVudEVuY29kaW5nID0gZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LUVuY29kaW5nXCIpIHx8IFwiaWRlbnRpdHlcIjtcbiAgaWYgKGNvbnRlbnRFbmNvZGluZyAhPT0gXCJpZGVudGl0eVwiKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuICByZXR1cm5WYWx1ZXMuYWxsb3dSYW5nZVJlcXVlc3RzID0gdHJ1ZTtcbiAgcmV0dXJuIHJldHVyblZhbHVlcztcbn1cbmZ1bmN0aW9uIGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIoZ2V0UmVzcG9uc2VIZWFkZXIpIHtcbiAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIpO1xuICBpZiAoY29udGVudERpc3Bvc2l0aW9uKSB7XG4gICAgbGV0IGZpbGVuYW1lID0gZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gICAgaWYgKGZpbGVuYW1lLmluY2x1ZGVzKFwiJVwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmlsZW5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICBpZiAoaXNQZGZGaWxlKGZpbGVuYW1lKSkge1xuICAgICAgcmV0dXJuIGZpbGVuYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3Ioc3RhdHVzLCB1cmwpIHtcbiAgaWYgKHN0YXR1cyA9PT0gNDA0IHx8IHN0YXR1cyA9PT0gMCAmJiB1cmwuc3RhcnRzV2l0aChcImZpbGU6XCIpKSB7XG4gICAgcmV0dXJuIG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKCdNaXNzaW5nIFBERiBcIicgKyB1cmwgKyAnXCIuJyk7XG4gIH1cbiAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oYFVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlICgke3N0YXR1c30pIHdoaWxlIHJldHJpZXZpbmcgUERGIFwiJHt1cmx9XCIuYCwgc3RhdHVzKTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUmVzcG9uc2VTdGF0dXMoc3RhdHVzKSB7XG4gIHJldHVybiBzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNjtcbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZmV0Y2hfc3RyZWFtLmpzXG5cblxuZnVuY3Rpb24gY3JlYXRlRmV0Y2hPcHRpb25zKGhlYWRlcnMsIHdpdGhDcmVkZW50aWFscywgYWJvcnRDb250cm9sbGVyKSB7XG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIGhlYWRlcnMsXG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIG1vZGU6IFwiY29yc1wiLFxuICAgIGNyZWRlbnRpYWxzOiB3aXRoQ3JlZGVudGlhbHMgPyBcImluY2x1ZGVcIiA6IFwic2FtZS1vcmlnaW5cIixcbiAgICByZWRpcmVjdDogXCJmb2xsb3dcIlxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSGVhZGVycyhodHRwSGVhZGVycykge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBodHRwSGVhZGVycykge1xuICAgIGNvbnN0IHZhbHVlID0gaHR0cEhlYWRlcnNbcHJvcGVydHldO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaGVhZGVycy5hcHBlbmQocHJvcGVydHksIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cbmZ1bmN0aW9uIGdldEFycmF5QnVmZmVyKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiB2YWwuYnVmZmVyO1xuICB9XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgd2FybihgZ2V0QXJyYXlCdWZmZXIgLSB1bmV4cGVjdGVkIGRhdGEgZm9ybWF0OiAke3ZhbH1gKTtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbCkuYnVmZmVyO1xufVxuY2xhc3MgUERGRmV0Y2hTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3Qoc291cmNlLnVybCk7XG4gICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHNvdXJjZS5odHRwSGVhZGVycyB8fCB7fTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdO1xuICB9XG4gIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uX2xvYWRlZCA/PyAwO1xuICB9XG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZGZXRjaFN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZGZXRjaFN0cmVhbVJlYWRlcih0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG4gIH1cbiAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkge1xuICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFBERkZldGNoU3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgYmVnaW4sIGVuZCk7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfVxuICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG4gICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgUERGRmV0Y2hTdHJlYW1SZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlO1xuICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtO1xuICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVSYW5nZTtcbiAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpO1xuICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7XG4gICAgZmV0Y2godXJsLCBjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycywgdGhpcy5fd2l0aENyZWRlbnRpYWxzLCB0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmICghdmFsaWRhdGVSZXNwb25zZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgIHRocm93IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCB1cmwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gbmFtZSA9PiByZXNwb25zZS5oZWFkZXJzLmdldChuYW1lKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLFxuICAgICAgICBzdWdnZXN0ZWRMZW5ndGhcbiAgICAgIH0gPSB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyh7XG4gICAgICAgIGdldFJlc3BvbnNlSGVhZGVyLFxuICAgICAgICBpc0h0dHA6IHRoaXMuX3N0cmVhbS5pc0h0dHAsXG4gICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcbiAgICAgICAgZGlzYWJsZVJhbmdlOiB0aGlzLl9kaXNhYmxlUmFuZ2VcbiAgICAgIH0pO1xuICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGFsbG93UmFuZ2VSZXF1ZXN0cztcbiAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzdWdnZXN0ZWRMZW5ndGggfHwgdGhpcy5fY29udGVudExlbmd0aDtcbiAgICAgIHRoaXMuX2ZpbGVuYW1lID0gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcihnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgICBpZiAoIXRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkICYmIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhpcy5jYW5jZWwobmV3IEFib3J0RXhjZXB0aW9uKFwiU3RyZWFtaW5nIGlzIGRpc2FibGVkLlwiKSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2godGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgZ2V0IGZpbGVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgfVxuICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDtcbiAgfVxuICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgICBjb25zdCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGRvbmVcbiAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGRvbmVcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcbiAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkLFxuICAgICAgdG90YWw6IHRoaXMuX2NvbnRlbnRMZW5ndGhcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGdldEFycmF5QnVmZmVyKHZhbHVlKSxcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fcmVhZGVyPy5jYW5jZWwocmVhc29uKTtcbiAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxufVxuY2xhc3MgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgYmVnaW4sIGVuZCkge1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcbiAgICB0aGlzLl93aXRoQ3JlZGVudGlhbHMgPSBzb3VyY2Uud2l0aENyZWRlbnRpYWxzIHx8IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG4gICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMuX2hlYWRlcnMgPSBjcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7XG4gICAgdGhpcy5faGVhZGVycy5hcHBlbmQoXCJSYW5nZVwiLCBgYnl0ZXM9JHtiZWdpbn0tJHtlbmQgLSAxfWApO1xuICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7XG4gICAgZmV0Y2godXJsLCBjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycywgdGhpcy5fd2l0aENyZWRlbnRpYWxzLCB0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmICghdmFsaWRhdGVSZXNwb25zZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgIHRocm93IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCB1cmwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgdGhpcy5fcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICB9KS5jYXRjaCh0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZWplY3QpO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgY29uc3Qge1xuICAgICAgdmFsdWUsXG4gICAgICBkb25lXG4gICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBkb25lXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogZ2V0QXJyYXlCdWZmZXIodmFsdWUpLFxuICAgICAgZG9uZTogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9yZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L25ldHdvcmsuanNcblxuXG5jb25zdCBPS19SRVNQT05TRSA9IDIwMDtcbmNvbnN0IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRSA9IDIwNjtcbmZ1bmN0aW9uIG5ldHdvcmtfZ2V0QXJyYXlCdWZmZXIoeGhyKSB7XG4gIGNvbnN0IGRhdGEgPSB4aHIucmVzcG9uc2U7XG4gIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIHJldHVybiBzdHJpbmdUb0J5dGVzKGRhdGEpLmJ1ZmZlcjtcbn1cbmNsYXNzIE5ldHdvcmtNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IodXJsLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3QodXJsKTtcbiAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgYXJncy5odHRwSGVhZGVycyB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gYXJncy53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG4gICAgdGhpcy5jdXJyWGhySWQgPSAwO1xuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCwgbGlzdGVuZXJzKSB7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIGJlZ2luLFxuICAgICAgZW5kXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gbGlzdGVuZXJzKSB7XG4gICAgICBhcmdzW3Byb3BdID0gbGlzdGVuZXJzW3Byb3BdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGFyZ3MpO1xuICB9XG4gIHJlcXVlc3RGdWxsKGxpc3RlbmVycykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobGlzdGVuZXJzKTtcbiAgfVxuICByZXF1ZXN0KGFyZ3MpIHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBjb25zdCB4aHJJZCA9IHRoaXMuY3VyclhocklkKys7XG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF0gPSB7XG4gICAgICB4aHJcbiAgICB9O1xuICAgIHhoci5vcGVuKFwiR0VUXCIsIHRoaXMudXJsKTtcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmh0dHBIZWFkZXJzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaHR0cEhlYWRlcnNbcHJvcGVydHldO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihwcm9wZXJ0eSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0h0dHAgJiYgXCJiZWdpblwiIGluIGFyZ3MgJiYgXCJlbmRcIiBpbiBhcmdzKSB7XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlJhbmdlXCIsIGBieXRlcz0ke2FyZ3MuYmVnaW59LSR7YXJncy5lbmQgLSAxfWApO1xuICAgICAgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzID0gT0tfUkVTUE9OU0U7XG4gICAgfVxuICAgIHhoci5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XG4gICAgaWYgKGFyZ3Mub25FcnJvcikge1xuICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIGFyZ3Mub25FcnJvcih4aHIuc3RhdHVzKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzLCB4aHJJZCk7XG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3MuYmluZCh0aGlzLCB4aHJJZCk7XG4gICAgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQgPSBhcmdzLm9uSGVhZGVyc1JlY2VpdmVkO1xuICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRG9uZSA9IGFyZ3Mub25Eb25lO1xuICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IgPSBhcmdzLm9uRXJyb3I7XG4gICAgcGVuZGluZ1JlcXVlc3Qub25Qcm9ncmVzcyA9IGFyZ3Mub25Qcm9ncmVzcztcbiAgICB4aHIuc2VuZChudWxsKTtcbiAgICByZXR1cm4geGhySWQ7XG4gIH1cbiAgb25Qcm9ncmVzcyh4aHJJZCwgZXZ0KSB7XG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG4gICAgaWYgKCFwZW5kaW5nUmVxdWVzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzPy4oZXZ0KTtcbiAgfVxuICBvblN0YXRlQ2hhbmdlKHhocklkLCBldnQpIHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTtcbiAgICBpZiAoIXBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHhociA9IHBlbmRpbmdSZXF1ZXN0LnhocjtcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPj0gMiAmJiBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCkge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQoKTtcbiAgICAgIGRlbGV0ZSBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZDtcbiAgICB9XG4gICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghKHhocklkIGluIHRoaXMucGVuZGluZ1JlcXVlc3RzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuICAgIGlmICh4aHIuc3RhdHVzID09PSAwICYmIHRoaXMuaXNIdHRwKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yPy4oeGhyLnN0YXR1cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHhoclN0YXR1cyA9IHhoci5zdGF0dXMgfHwgT0tfUkVTUE9OU0U7XG4gICAgY29uc3Qgb2tfcmVzcG9uc2Vfb25fcmFuZ2VfcmVxdWVzdCA9IHhoclN0YXR1cyA9PT0gT0tfUkVTUE9OU0UgJiYgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPT09IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRTtcbiAgICBpZiAoIW9rX3Jlc3BvbnNlX29uX3JhbmdlX3JlcXVlc3QgJiYgeGhyU3RhdHVzICE9PSBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cykge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcj8uKHhoci5zdGF0dXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaHVuayA9IG5ldHdvcmtfZ2V0QXJyYXlCdWZmZXIoeGhyKTtcbiAgICBpZiAoeGhyU3RhdHVzID09PSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0UpIHtcbiAgICAgIGNvbnN0IHJhbmdlSGVhZGVyID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1SYW5nZVwiKTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSAvYnl0ZXMgKFxcZCspLShcXGQrKVxcLyhcXGQrKS8uZXhlYyhyYW5nZUhlYWRlcik7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUoe1xuICAgICAgICBiZWdpbjogcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApLFxuICAgICAgICBjaHVua1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjaHVuaykge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lKHtcbiAgICAgICAgYmVnaW46IDAsXG4gICAgICAgIGNodW5rXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcj8uKHhoci5zdGF0dXMpO1xuICAgIH1cbiAgfVxuICBnZXRSZXF1ZXN0WGhyKHhocklkKSB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXS54aHI7XG4gIH1cbiAgaXNQZW5kaW5nUmVxdWVzdCh4aHJJZCkge1xuICAgIHJldHVybiB4aHJJZCBpbiB0aGlzLnBlbmRpbmdSZXF1ZXN0cztcbiAgfVxuICBhYm9ydFJlcXVlc3QoeGhySWQpIHtcbiAgICBjb25zdCB4aHIgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF0ueGhyO1xuICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG4gICAgeGhyLmFib3J0KCk7XG4gIH1cbn1cbmNsYXNzIFBERk5ldHdvcmtTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5fbWFuYWdlciA9IG5ldyBOZXR3b3JrTWFuYWdlcihzb3VyY2UudXJsLCB7XG4gICAgICBodHRwSGVhZGVyczogc291cmNlLmh0dHBIZWFkZXJzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBzb3VyY2Uud2l0aENyZWRlbnRpYWxzXG4gICAgfSk7XG4gICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgfVxuICBfb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQocmVhZGVyKSB7XG4gICAgY29uc3QgaSA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuaW5kZXhPZihyZWFkZXIpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxuICBnZXRGdWxsUmVhZGVyKCkge1xuICAgIGFzc2VydCghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGTmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlciwgdGhpcy5fc291cmNlKTtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG4gIH1cbiAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyKHRoaXMuX21hbmFnZXIsIGJlZ2luLCBlbmQpO1xuICAgIHJlYWRlci5vbkNsb3NlZCA9IHRoaXMuX29uUmFuZ2VSZXF1ZXN0UmVhZGVyQ2xvc2VkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfVxuICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG4gICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVyIHtcbiAgY29uc3RydWN0b3IobWFuYWdlciwgc291cmNlKSB7XG4gICAgdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIG9uSGVhZGVyc1JlY2VpdmVkOiB0aGlzLl9vbkhlYWRlcnNSZWNlaXZlZC5iaW5kKHRoaXMpLFxuICAgICAgb25Eb25lOiB0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxcbiAgICAgIG9uRXJyb3I6IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIG9uUHJvZ3Jlc3M6IHRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKVxuICAgIH07XG4gICAgdGhpcy5fdXJsID0gc291cmNlLnVybDtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdElkID0gbWFuYWdlci5yZXF1ZXN0RnVsbChhcmdzKTtcbiAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTtcbiAgICBpZiAoIXRoaXMuX3JhbmdlQ2h1bmtTaXplICYmICF0aGlzLl9kaXNhYmxlUmFuZ2UpIHtcbiAgICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NhY2hlZENodW5rcyA9IFtdO1xuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIF9vbkhlYWRlcnNSZWNlaXZlZCgpIHtcbiAgICBjb25zdCBmdWxsUmVxdWVzdFhocklkID0gdGhpcy5fZnVsbFJlcXVlc3RJZDtcbiAgICBjb25zdCBmdWxsUmVxdWVzdFhociA9IHRoaXMuX21hbmFnZXIuZ2V0UmVxdWVzdFhocihmdWxsUmVxdWVzdFhocklkKTtcbiAgICBjb25zdCBnZXRSZXNwb25zZUhlYWRlciA9IG5hbWUgPT4gZnVsbFJlcXVlc3RYaHIuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7XG4gICAgY29uc3Qge1xuICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLFxuICAgICAgc3VnZ2VzdGVkTGVuZ3RoXG4gICAgfSA9IHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHtcbiAgICAgIGdldFJlc3BvbnNlSGVhZGVyLFxuICAgICAgaXNIdHRwOiB0aGlzLl9tYW5hZ2VyLmlzSHR0cCxcbiAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcbiAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgfSk7XG4gICAgaWYgKGFsbG93UmFuZ2VSZXF1ZXN0cykge1xuICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzdWdnZXN0ZWRMZW5ndGggfHwgdGhpcy5fY29udGVudExlbmd0aDtcbiAgICB0aGlzLl9maWxlbmFtZSA9IGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIoZ2V0UmVzcG9uc2VIZWFkZXIpO1xuICAgIGlmICh0aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdChmdWxsUmVxdWVzdFhocklkKTtcbiAgICB9XG4gICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cbiAgX29uRG9uZShkYXRhKSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTtcbiAgICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgICAgdmFsdWU6IGRhdGEuY2h1bmssXG4gICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jYWNoZWRDaHVua3MucHVzaChkYXRhLmNodW5rKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgfVxuICBfb25FcnJvcihzdGF0dXMpIHtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3Ioc3RhdHVzLCB0aGlzLl91cmwpO1xuICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KHRoaXMuX3N0b3JlZEVycm9yKTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZWplY3QodGhpcy5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGggPSAwO1xuICB9XG4gIF9vblByb2dyZXNzKGV2dCkge1xuICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcbiAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcbiAgICAgIHRvdGFsOiBldnQubGVuZ3RoQ29tcHV0YWJsZSA/IGV2dC50b3RhbCA6IHRoaXMuX2NvbnRlbnRMZW5ndGhcbiAgICB9KTtcbiAgfVxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuICB9XG4gIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkO1xuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gIH1cbiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gIH1cbiAgZ2V0IGhlYWRlcnNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NhY2hlZENodW5rcy5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG4gICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIGlmICh0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fZnVsbFJlcXVlc3RJZCkpIHtcbiAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX2Z1bGxSZXF1ZXN0SWQpO1xuICAgIH1cbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gIH1cbn1cbmNsYXNzIFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihtYW5hZ2VyLCBiZWdpbiwgZW5kKSB7XG4gICAgdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksXG4gICAgICBvbkVycm9yOiB0aGlzLl9vbkVycm9yLmJpbmQodGhpcyksXG4gICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcylcbiAgICB9O1xuICAgIHRoaXMuX3VybCA9IG1hbmFnZXIudXJsO1xuICAgIHRoaXMuX3JlcXVlc3RJZCA9IG1hbmFnZXIucmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQsIGFyZ3MpO1xuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHRoaXMub25DbG9zZWQgPSBudWxsO1xuICB9XG4gIF9jbG9zZSgpIHtcbiAgICB0aGlzLm9uQ2xvc2VkPy4odGhpcyk7XG4gIH1cbiAgX29uRG9uZShkYXRhKSB7XG4gICAgY29uc3QgY2h1bmsgPSBkYXRhLmNodW5rO1xuICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gY2h1bms7XG4gICAgfVxuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9jbG9zZSgpO1xuICB9XG4gIF9vbkVycm9yKHN0YXR1cykge1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcihzdGF0dXMsIHRoaXMuX3VybCk7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVqZWN0KHRoaXMuX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gIH1cbiAgX29uUHJvZ3Jlc3MoZXZ0KSB7XG4gICAgaWYgKCF0aGlzLmlzU3RyZWFtaW5nU3VwcG9ydGVkKSB7XG4gICAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmsgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcbiAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIGlmICh0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fcmVxdWVzdElkKSkge1xuICAgICAgdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QodGhpcy5fcmVxdWVzdElkKTtcbiAgICB9XG4gICAgdGhpcy5fY2xvc2UoKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9ub2RlX3N0cmVhbS5qc1xuXG5cblxuY29uc3QgZmlsZVVyaVJlZ2V4ID0gL15maWxlOlxcL1xcL1xcL1thLXpBLVpdOlxcLy87XG5mdW5jdGlvbiBwYXJzZVVybChzb3VyY2VVcmwpIHtcbiAgY29uc3QgdXJsID0gTm9kZVBhY2thZ2VzLmdldChcInVybFwiKTtcbiAgY29uc3QgcGFyc2VkVXJsID0gdXJsLnBhcnNlKHNvdXJjZVVybCk7XG4gIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09IFwiZmlsZTpcIiB8fCBwYXJzZWRVcmwuaG9zdCkge1xuICAgIHJldHVybiBwYXJzZWRVcmw7XG4gIH1cbiAgaWYgKC9eW2Etel06Wy9cXFxcXS9pLnRlc3Qoc291cmNlVXJsKSkge1xuICAgIHJldHVybiB1cmwucGFyc2UoYGZpbGU6Ly8vJHtzb3VyY2VVcmx9YCk7XG4gIH1cbiAgaWYgKCFwYXJzZWRVcmwuaG9zdCkge1xuICAgIHBhcnNlZFVybC5wcm90b2NvbCA9IFwiZmlsZTpcIjtcbiAgfVxuICByZXR1cm4gcGFyc2VkVXJsO1xufVxuY2xhc3MgUERGTm9kZVN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMudXJsID0gcGFyc2VVcmwoc291cmNlLnVybCk7XG4gICAgdGhpcy5pc0h0dHAgPSB0aGlzLnVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHRoaXMudXJsLnByb3RvY29sID09PSBcImh0dHBzOlwiO1xuICAgIHRoaXMuaXNGc1VybCA9IHRoaXMudXJsLnByb3RvY29sID09PSBcImZpbGU6XCI7XG4gICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHNvdXJjZS5odHRwSGVhZGVycyB8fCB7fTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdO1xuICB9XG4gIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uX2xvYWRlZCA/PyAwO1xuICB9XG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZOb2RlU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcy5pc0ZzVXJsID8gbmV3IFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIodGhpcykgOiBuZXcgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICB9XG4gIGdldFJhbmdlUmVhZGVyKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoZW5kIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJhbmdlUmVhZGVyID0gdGhpcy5pc0ZzVXJsID8gbmV3IFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyKHRoaXMsIHN0YXJ0LCBlbmQpIDogbmV3IFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBzdGFydCwgZW5kKTtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmFuZ2VSZWFkZXIpO1xuICAgIHJldHVybiByYW5nZVJlYWRlcjtcbiAgfVxuICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG4gICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgQmFzZUZ1bGxSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICB0aGlzLl91cmwgPSBzdHJlYW0udXJsO1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IG51bGw7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHNvdXJjZS5kaXNhYmxlUmFuZ2UgfHwgZmFsc2U7XG4gICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG4gICAgaWYgKCF0aGlzLl9yYW5nZUNodW5rU2l6ZSAmJiAhdGhpcy5fZGlzYWJsZVJhbmdlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcbiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlUmFuZ2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSBudWxsO1xuICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgfVxuICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGdldCBmaWxlbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gIH1cbiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gIH1cbiAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcmVhZGFibGVTdHJlYW0ucmVhZCgpO1xuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoKTtcbiAgICB9XG4gICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmxlbmd0aDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCxcbiAgICAgIHRvdGFsOiB0aGlzLl9jb250ZW50TGVuZ3RoXG4gICAgfSk7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGJ1ZmZlcixcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0cmVhbSkge1xuICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveShyZWFzb24pO1xuICB9XG4gIF9lcnJvcihyZWFzb24pIHtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cbiAgX3NldFJlYWRhYmxlU3RyZWFtKHJlYWRhYmxlU3RyZWFtKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSByZWFkYWJsZVN0cmVhbTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcInJlYWRhYmxlXCIsICgpID0+IHtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICByZWFkYWJsZVN0cmVhbS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9lcnJvcihyZWFzb24pO1xuICAgIH0pO1xuICAgIGlmICghdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCkge1xuICAgICAgdGhpcy5fZXJyb3IobmV3IEFib3J0RXhjZXB0aW9uKFwic3RyZWFtaW5nIGlzIGRpc2FibGVkXCIpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHRoaXMuX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIEJhc2VSYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHRoaXMuX3VybCA9IHN0cmVhbS51cmw7XG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gbnVsbDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSBudWxsO1xuICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtcbiAgICB9XG4gICAgY29uc3QgY2h1bmsgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG4gICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZCgpO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsubGVuZ3RoO1xuICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcbiAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkXG4gICAgfSk7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGJ1ZmZlcixcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0cmVhbSkge1xuICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveShyZWFzb24pO1xuICB9XG4gIF9lcnJvcihyZWFzb24pIHtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cbiAgX3NldFJlYWRhYmxlU3RyZWFtKHJlYWRhYmxlU3RyZWFtKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSByZWFkYWJsZVN0cmVhbTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcInJlYWRhYmxlXCIsICgpID0+IHtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICByZWFkYWJsZVN0cmVhbS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9lcnJvcihyZWFzb24pO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVSZXF1ZXN0T3B0aW9ucyhwYXJzZWRVcmwsIGhlYWRlcnMpIHtcbiAgcmV0dXJuIHtcbiAgICBwcm90b2NvbDogcGFyc2VkVXJsLnByb3RvY29sLFxuICAgIGF1dGg6IHBhcnNlZFVybC5hdXRoLFxuICAgIGhvc3Q6IHBhcnNlZFVybC5ob3N0bmFtZSxcbiAgICBwb3J0OiBwYXJzZWRVcmwucG9ydCxcbiAgICBwYXRoOiBwYXJzZWRVcmwucGF0aCxcbiAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgaGVhZGVyc1xuICB9O1xufVxuY2xhc3MgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHN1cGVyKHN0cmVhbSk7XG4gICAgY29uc3QgaGFuZGxlUmVzcG9uc2UgPSByZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGIFwiJHt0aGlzLl91cmx9XCIuYCk7XG4gICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7XG4gICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gbmFtZSA9PiB0aGlzLl9yZWFkYWJsZVN0cmVhbS5oZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cyxcbiAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoXG4gICAgICB9ID0gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoe1xuICAgICAgICBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgaXNIdHRwOiBzdHJlYW0uaXNIdHRwLFxuICAgICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsXG4gICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBhbGxvd1JhbmdlUmVxdWVzdHM7XG4gICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICB0aGlzLl9maWxlbmFtZSA9IGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIoZ2V0UmVzcG9uc2VIZWFkZXIpO1xuICAgIH07XG4gICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKHRoaXMuX3VybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiKSB7XG4gICAgICBjb25zdCBodHRwID0gTm9kZVBhY2thZ2VzLmdldChcImh0dHBcIik7XG4gICAgICB0aGlzLl9yZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgc3RyZWFtLmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBodHRwcyA9IE5vZGVQYWNrYWdlcy5nZXQoXCJodHRwc1wiKTtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgc3RyZWFtLmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0Lm9uKFwiZXJyb3JcIiwgcmVhc29uID0+IHtcbiAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uO1xuICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgfSk7XG4gICAgdGhpcy5fcmVxdWVzdC5lbmQoKTtcbiAgfVxufVxuY2xhc3MgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyIGV4dGVuZHMgQmFzZVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtLCBzdGFydCwgZW5kKSB7XG4gICAgc3VwZXIoc3RyZWFtKTtcbiAgICB0aGlzLl9odHRwSGVhZGVycyA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gc3RyZWFtLmh0dHBIZWFkZXJzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHN0cmVhbS5odHRwSGVhZGVyc1twcm9wZXJ0eV07XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2h0dHBIZWFkZXJzW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9odHRwSGVhZGVycy5SYW5nZSA9IGBieXRlcz0ke3N0YXJ0fS0ke2VuZCAtIDF9YDtcbiAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9IHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgXCIke3RoaXMuX3VybH1cIi5gKTtcbiAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0ocmVzcG9uc2UpO1xuICAgIH07XG4gICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKHRoaXMuX3VybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiKSB7XG4gICAgICBjb25zdCBodHRwID0gTm9kZVBhY2thZ2VzLmdldChcImh0dHBcIik7XG4gICAgICB0aGlzLl9yZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgdGhpcy5faHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGh0dHBzID0gTm9kZVBhY2thZ2VzLmdldChcImh0dHBzXCIpO1xuICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHBzLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICB9KTtcbiAgICB0aGlzLl9yZXF1ZXN0LmVuZCgpO1xuICB9XG59XG5jbGFzcyBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICBzdXBlcihzdHJlYW0pO1xuICAgIGxldCBwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMuX3VybC5wYXRoKTtcbiAgICBpZiAoZmlsZVVyaVJlZ2V4LnRlc3QodGhpcy5fdXJsLmhyZWYpKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIik7XG4gICAgfVxuICAgIGNvbnN0IGZzID0gTm9kZVBhY2thZ2VzLmdldChcImZzXCIpO1xuICAgIGZzLnByb21pc2VzLmxzdGF0KHBhdGgpLnRoZW4oc3RhdCA9PiB7XG4gICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3RhdC5zaXplO1xuICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0oZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoKSk7XG4gICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgXCIke3BhdGh9XCIuYCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yO1xuICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KGVycm9yKTtcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0sIHN0YXJ0LCBlbmQpIHtcbiAgICBzdXBlcihzdHJlYW0pO1xuICAgIGxldCBwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMuX3VybC5wYXRoKTtcbiAgICBpZiAoZmlsZVVyaVJlZ2V4LnRlc3QodGhpcy5fdXJsLmhyZWYpKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIik7XG4gICAgfVxuICAgIGNvbnN0IGZzID0gTm9kZVBhY2thZ2VzLmdldChcImZzXCIpO1xuICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKGZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aCwge1xuICAgICAgc3RhcnQsXG4gICAgICBlbmQ6IGVuZCAtIDFcbiAgICB9KSk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvdGV4dF9sYXllci5qc1xuXG5cbmNvbnN0IE1BWF9URVhUX0RJVlNfVE9fUkVOREVSID0gMTAwMDAwO1xuY29uc3QgREVGQVVMVF9GT05UX1NJWkUgPSAzMDtcbmNvbnN0IERFRkFVTFRfRk9OVF9BU0NFTlQgPSAwLjg7XG5jbGFzcyBUZXh0TGF5ZXIge1xuICAjY2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAjY29udGFpbmVyID0gbnVsbDtcbiAgI2Rpc2FibGVQcm9jZXNzSXRlbXMgPSBmYWxzZTtcbiAgI2ZvbnRJbnNwZWN0b3JFbmFibGVkID0gISFnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3I/LmVuYWJsZWQ7XG4gICNsYW5nID0gbnVsbDtcbiAgI2xheW91dFRleHRQYXJhbXMgPSBudWxsO1xuICAjcGFnZUhlaWdodCA9IDA7XG4gICNwYWdlV2lkdGggPSAwO1xuICAjcmVhZGVyID0gbnVsbDtcbiAgI3Jvb3RDb250YWluZXIgPSBudWxsO1xuICAjcm90YXRpb24gPSAwO1xuICAjc2NhbGUgPSAwO1xuICAjc3R5bGVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICN0ZXh0Q29udGVudEl0ZW1zU3RyID0gW107XG4gICN0ZXh0Q29udGVudFNvdXJjZSA9IG51bGw7XG4gICN0ZXh0RGl2cyA9IFtdO1xuICAjdGV4dERpdlByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpO1xuICAjdHJhbnNmb3JtID0gbnVsbDtcbiAgc3RhdGljICNhc2NlbnRDYWNoZSA9IG5ldyBNYXAoKTtcbiAgc3RhdGljICNjYW52YXNDb250ZXh0cyA9IG5ldyBNYXAoKTtcbiAgc3RhdGljICNtaW5Gb250U2l6ZSA9IG51bGw7XG4gIHN0YXRpYyAjcGVuZGluZ1RleHRMYXllcnMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICB0ZXh0Q29udGVudFNvdXJjZSxcbiAgICBjb250YWluZXIsXG4gICAgdmlld3BvcnRcbiAgfSkge1xuICAgIGlmICh0ZXh0Q29udGVudFNvdXJjZSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtKSB7XG4gICAgICB0aGlzLiN0ZXh0Q29udGVudFNvdXJjZSA9IHRleHRDb250ZW50U291cmNlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRleHRDb250ZW50U291cmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLiN0ZXh0Q29udGVudFNvdXJjZSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUodGV4dENvbnRlbnRTb3VyY2UpO1xuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gXCJ0ZXh0Q29udGVudFNvdXJjZVwiIHBhcmFtZXRlciBzcGVjaWZpZWQuJyk7XG4gICAgfVxuICAgIHRoaXMuI2NvbnRhaW5lciA9IHRoaXMuI3Jvb3RDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy4jc2NhbGUgPSB2aWV3cG9ydC5zY2FsZSAqIChnbG9iYWxUaGlzLmRldmljZVBpeGVsUmF0aW8gfHwgMSk7XG4gICAgdGhpcy4jcm90YXRpb24gPSB2aWV3cG9ydC5yb3RhdGlvbjtcbiAgICB0aGlzLiNsYXlvdXRUZXh0UGFyYW1zID0ge1xuICAgICAgcHJldkZvbnRTaXplOiBudWxsLFxuICAgICAgcHJldkZvbnRGYW1pbHk6IG51bGwsXG4gICAgICBkaXY6IG51bGwsXG4gICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgY3R4OiBudWxsXG4gICAgfTtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0LFxuICAgICAgcGFnZVgsXG4gICAgICBwYWdlWVxuICAgIH0gPSB2aWV3cG9ydC5yYXdEaW1zO1xuICAgIHRoaXMuI3RyYW5zZm9ybSA9IFsxLCAwLCAwLCAtMSwgLXBhZ2VYLCBwYWdlWSArIHBhZ2VIZWlnaHRdO1xuICAgIHRoaXMuI3BhZ2VXaWR0aCA9IHBhZ2VXaWR0aDtcbiAgICB0aGlzLiNwYWdlSGVpZ2h0ID0gcGFnZUhlaWdodDtcbiAgICBUZXh0TGF5ZXIuI2Vuc3VyZU1pbkZvbnRTaXplQ29tcHV0ZWQoKTtcbiAgICBzZXRMYXllckRpbWVuc2lvbnMoY29udGFpbmVyLCB2aWV3cG9ydCk7XG4gICAgdGhpcy4jY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKCgpID0+IHt9KS50aGVuKCgpID0+IHtcbiAgICAgIFRleHRMYXllci4jcGVuZGluZ1RleHRMYXllcnMuZGVsZXRlKHRoaXMpO1xuICAgICAgdGhpcy4jbGF5b3V0VGV4dFBhcmFtcyA9IG51bGw7XG4gICAgICB0aGlzLiNzdHlsZUNhY2hlID0gbnVsbDtcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgcHVtcCA9ICgpID0+IHtcbiAgICAgIHRoaXMuI3JlYWRlci5yZWFkKCkudGhlbigoe1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZG9uZVxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIHRoaXMuI2NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNsYW5nID8/PSB2YWx1ZS5sYW5nO1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuI3N0eWxlQ2FjaGUsIHZhbHVlLnN0eWxlcyk7XG4gICAgICAgIHRoaXMuI3Byb2Nlc3NJdGVtcyh2YWx1ZS5pdGVtcyk7XG4gICAgICAgIHB1bXAoKTtcbiAgICAgIH0sIHRoaXMuI2NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICB9O1xuICAgIHRoaXMuI3JlYWRlciA9IHRoaXMuI3RleHRDb250ZW50U291cmNlLmdldFJlYWRlcigpO1xuICAgIFRleHRMYXllci4jcGVuZGluZ1RleHRMYXllcnMuYWRkKHRoaXMpO1xuICAgIHB1bXAoKTtcbiAgICByZXR1cm4gdGhpcy4jY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIHVwZGF0ZSh7XG4gICAgdmlld3BvcnQsXG4gICAgb25CZWZvcmUgPSBudWxsXG4gIH0pIHtcbiAgICBjb25zdCBzY2FsZSA9IHZpZXdwb3J0LnNjYWxlICogKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKTtcbiAgICBjb25zdCByb3RhdGlvbiA9IHZpZXdwb3J0LnJvdGF0aW9uO1xuICAgIGlmIChyb3RhdGlvbiAhPT0gdGhpcy4jcm90YXRpb24pIHtcbiAgICAgIG9uQmVmb3JlPy4oKTtcbiAgICAgIHRoaXMuI3JvdGF0aW9uID0gcm90YXRpb247XG4gICAgICBzZXRMYXllckRpbWVuc2lvbnModGhpcy4jcm9vdENvbnRhaW5lciwge1xuICAgICAgICByb3RhdGlvblxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzY2FsZSAhPT0gdGhpcy4jc2NhbGUpIHtcbiAgICAgIG9uQmVmb3JlPy4oKTtcbiAgICAgIHRoaXMuI3NjYWxlID0gc2NhbGU7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHByZXZGb250U2l6ZTogbnVsbCxcbiAgICAgICAgcHJldkZvbnRGYW1pbHk6IG51bGwsXG4gICAgICAgIGRpdjogbnVsbCxcbiAgICAgICAgcHJvcGVydGllczogbnVsbCxcbiAgICAgICAgY3R4OiBUZXh0TGF5ZXIuI2dldEN0eCh0aGlzLiNsYW5nKVxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgZGl2IG9mIHRoaXMuI3RleHREaXZzKSB7XG4gICAgICAgIHBhcmFtcy5wcm9wZXJ0aWVzID0gdGhpcy4jdGV4dERpdlByb3BlcnRpZXMuZ2V0KGRpdik7XG4gICAgICAgIHBhcmFtcy5kaXYgPSBkaXY7XG4gICAgICAgIHRoaXMuI2xheW91dChwYXJhbXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYW5jZWwoKSB7XG4gICAgY29uc3QgYWJvcnRFeCA9IG5ldyBBYm9ydEV4Y2VwdGlvbihcIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC5cIik7XG4gICAgdGhpcy4jcmVhZGVyPy5jYW5jZWwoYWJvcnRFeCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIHRoaXMuI3JlYWRlciA9IG51bGw7XG4gICAgdGhpcy4jY2FwYWJpbGl0eS5yZWplY3QoYWJvcnRFeCk7XG4gIH1cbiAgZ2V0IHRleHREaXZzKCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0RGl2cztcbiAgfVxuICBnZXQgdGV4dENvbnRlbnRJdGVtc1N0cigpIHtcbiAgICByZXR1cm4gdGhpcy4jdGV4dENvbnRlbnRJdGVtc1N0cjtcbiAgfVxuICAjcHJvY2Vzc0l0ZW1zKGl0ZW1zKSB7XG4gICAgaWYgKHRoaXMuI2Rpc2FibGVQcm9jZXNzSXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jbGF5b3V0VGV4dFBhcmFtcy5jdHggPz89IFRleHRMYXllci4jZ2V0Q3R4KHRoaXMuI2xhbmcpO1xuICAgIGNvbnN0IHRleHREaXZzID0gdGhpcy4jdGV4dERpdnMsXG4gICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyID0gdGhpcy4jdGV4dENvbnRlbnRJdGVtc1N0cjtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGlmICh0ZXh0RGl2cy5sZW5ndGggPiBNQVhfVEVYVF9ESVZTX1RPX1JFTkRFUikge1xuICAgICAgICB3YXJuKFwiSWdub3JpbmcgYWRkaXRpb25hbCB0ZXh0RGl2cyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cIik7XG4gICAgICAgIHRoaXMuI2Rpc2FibGVQcm9jZXNzSXRlbXMgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5zdHIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaXRlbS50eXBlID09PSBcImJlZ2luTWFya2VkQ29udGVudFByb3BzXCIgfHwgaXRlbS50eXBlID09PSBcImJlZ2luTWFya2VkQ29udGVudFwiKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy4jY29udGFpbmVyO1xuICAgICAgICAgIHRoaXMuI2NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgIHRoaXMuI2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFya2VkQ29udGVudFwiKTtcbiAgICAgICAgICBpZiAoaXRlbS5pZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy4jY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImlkXCIsIGAke2l0ZW0uaWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcmVudC5hcHBlbmQodGhpcy4jY29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwiZW5kTWFya2VkQ29udGVudFwiKSB7XG4gICAgICAgICAgdGhpcy4jY29udGFpbmVyID0gdGhpcy4jY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyLnB1c2goaXRlbS5zdHIpO1xuICAgICAgdGhpcy4jYXBwZW5kVGV4dChpdGVtKTtcbiAgICB9XG4gIH1cbiAgI2FwcGVuZFRleHQoZ2VvbSkge1xuICAgIGNvbnN0IHRleHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBjb25zdCB0ZXh0RGl2UHJvcGVydGllcyA9IHtcbiAgICAgIGFuZ2xlOiAwLFxuICAgICAgY2FudmFzV2lkdGg6IDAsXG4gICAgICBoYXNUZXh0OiBnZW9tLnN0ciAhPT0gXCJcIixcbiAgICAgIGhhc0VPTDogZ2VvbS5oYXNFT0wsXG4gICAgICBmb250U2l6ZTogMFxuICAgIH07XG4gICAgdGhpcy4jdGV4dERpdnMucHVzaCh0ZXh0RGl2KTtcbiAgICBjb25zdCB0eCA9IFV0aWwudHJhbnNmb3JtKHRoaXMuI3RyYW5zZm9ybSwgZ2VvbS50cmFuc2Zvcm0pO1xuICAgIGxldCBhbmdsZSA9IE1hdGguYXRhbjIodHhbMV0sIHR4WzBdKTtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuI3N0eWxlQ2FjaGVbZ2VvbS5mb250TmFtZV07XG4gICAgaWYgKHN0eWxlLnZlcnRpY2FsKSB7XG4gICAgICBhbmdsZSArPSBNYXRoLlBJIC8gMjtcbiAgICB9XG4gICAgY29uc3QgZm9udEZhbWlseSA9IHRoaXMuI2ZvbnRJbnNwZWN0b3JFbmFibGVkICYmIHN0eWxlLmZvbnRTdWJzdGl0dXRpb24gfHwgc3R5bGUuZm9udEZhbWlseTtcbiAgICBjb25zdCBmb250SGVpZ2h0ID0gTWF0aC5oeXBvdCh0eFsyXSwgdHhbM10pO1xuICAgIGNvbnN0IGZvbnRBc2NlbnQgPSBmb250SGVpZ2h0ICogVGV4dExheWVyLiNnZXRBc2NlbnQoZm9udEZhbWlseSwgdGhpcy4jbGFuZyk7XG4gICAgbGV0IGxlZnQsIHRvcDtcbiAgICBpZiAoYW5nbGUgPT09IDApIHtcbiAgICAgIGxlZnQgPSB0eFs0XTtcbiAgICAgIHRvcCA9IHR4WzVdIC0gZm9udEFzY2VudDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVmdCA9IHR4WzRdICsgZm9udEFzY2VudCAqIE1hdGguc2luKGFuZ2xlKTtcbiAgICAgIHRvcCA9IHR4WzVdIC0gZm9udEFzY2VudCAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGVGYWN0b3JTdHIgPSBcImNhbGModmFyKC0tc2NhbGUtZmFjdG9yKSpcIjtcbiAgICBjb25zdCBkaXZTdHlsZSA9IHRleHREaXYuc3R5bGU7XG4gICAgaWYgKHRoaXMuI2NvbnRhaW5lciA9PT0gdGhpcy4jcm9vdENvbnRhaW5lcikge1xuICAgICAgZGl2U3R5bGUubGVmdCA9IGAkeygxMDAgKiBsZWZ0IC8gdGhpcy4jcGFnZVdpZHRoKS50b0ZpeGVkKDIpfSVgO1xuICAgICAgZGl2U3R5bGUudG9wID0gYCR7KDEwMCAqIHRvcCAvIHRoaXMuI3BhZ2VIZWlnaHQpLnRvRml4ZWQoMil9JWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpdlN0eWxlLmxlZnQgPSBgJHtzY2FsZUZhY3RvclN0cn0ke2xlZnQudG9GaXhlZCgyKX1weClgO1xuICAgICAgZGl2U3R5bGUudG9wID0gYCR7c2NhbGVGYWN0b3JTdHJ9JHt0b3AudG9GaXhlZCgyKX1weClgO1xuICAgIH1cbiAgICBkaXZTdHlsZS5mb250U2l6ZSA9IGAke3NjYWxlRmFjdG9yU3RyfSR7KFRleHRMYXllci4jbWluRm9udFNpemUgKiBmb250SGVpZ2h0KS50b0ZpeGVkKDIpfXB4KWA7XG4gICAgZGl2U3R5bGUuZm9udEZhbWlseSA9IGZvbnRGYW1pbHk7XG4gICAgdGV4dERpdlByb3BlcnRpZXMuZm9udFNpemUgPSBmb250SGVpZ2h0O1xuICAgIHRleHREaXYuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInByZXNlbnRhdGlvblwiKTtcbiAgICB0ZXh0RGl2LnRleHRDb250ZW50ID0gZ2VvbS5zdHI7XG4gICAgdGV4dERpdi5kaXIgPSBnZW9tLmRpcjtcbiAgICBpZiAodGhpcy4jZm9udEluc3BlY3RvckVuYWJsZWQpIHtcbiAgICAgIHRleHREaXYuZGF0YXNldC5mb250TmFtZSA9IHN0eWxlLmZvbnRTdWJzdGl0dXRpb25Mb2FkZWROYW1lIHx8IGdlb20uZm9udE5hbWU7XG4gICAgfVxuICAgIGlmIChhbmdsZSAhPT0gMCkge1xuICAgICAgdGV4dERpdlByb3BlcnRpZXMuYW5nbGUgPSBhbmdsZSAqICgxODAgLyBNYXRoLlBJKTtcbiAgICB9XG4gICAgbGV0IHNob3VsZFNjYWxlVGV4dCA9IGZhbHNlO1xuICAgIGlmIChnZW9tLnN0ci5sZW5ndGggPiAxKSB7XG4gICAgICBzaG91bGRTY2FsZVRleHQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZ2VvbS5zdHIgIT09IFwiIFwiICYmIGdlb20udHJhbnNmb3JtWzBdICE9PSBnZW9tLnRyYW5zZm9ybVszXSkge1xuICAgICAgY29uc3QgYWJzU2NhbGVYID0gTWF0aC5hYnMoZ2VvbS50cmFuc2Zvcm1bMF0pLFxuICAgICAgICBhYnNTY2FsZVkgPSBNYXRoLmFicyhnZW9tLnRyYW5zZm9ybVszXSk7XG4gICAgICBpZiAoYWJzU2NhbGVYICE9PSBhYnNTY2FsZVkgJiYgTWF0aC5tYXgoYWJzU2NhbGVYLCBhYnNTY2FsZVkpIC8gTWF0aC5taW4oYWJzU2NhbGVYLCBhYnNTY2FsZVkpID4gMS41KSB7XG4gICAgICAgIHNob3VsZFNjYWxlVGV4dCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRTY2FsZVRleHQpIHtcbiAgICAgIHRleHREaXZQcm9wZXJ0aWVzLmNhbnZhc1dpZHRoID0gc3R5bGUudmVydGljYWwgPyBnZW9tLmhlaWdodCA6IGdlb20ud2lkdGg7XG4gICAgfVxuICAgIHRoaXMuI3RleHREaXZQcm9wZXJ0aWVzLnNldCh0ZXh0RGl2LCB0ZXh0RGl2UHJvcGVydGllcyk7XG4gICAgdGhpcy4jbGF5b3V0VGV4dFBhcmFtcy5kaXYgPSB0ZXh0RGl2O1xuICAgIHRoaXMuI2xheW91dFRleHRQYXJhbXMucHJvcGVydGllcyA9IHRleHREaXZQcm9wZXJ0aWVzO1xuICAgIHRoaXMuI2xheW91dCh0aGlzLiNsYXlvdXRUZXh0UGFyYW1zKTtcbiAgICBpZiAodGV4dERpdlByb3BlcnRpZXMuaGFzVGV4dCkge1xuICAgICAgdGhpcy4jY29udGFpbmVyLmFwcGVuZCh0ZXh0RGl2KTtcbiAgICB9XG4gICAgaWYgKHRleHREaXZQcm9wZXJ0aWVzLmhhc0VPTCkge1xuICAgICAgY29uc3QgYnIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIik7XG4gICAgICBici5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwicHJlc2VudGF0aW9uXCIpO1xuICAgICAgdGhpcy4jY29udGFpbmVyLmFwcGVuZChicik7XG4gICAgfVxuICB9XG4gICNsYXlvdXQocGFyYW1zKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGl2LFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIGN0eCxcbiAgICAgIHByZXZGb250U2l6ZSxcbiAgICAgIHByZXZGb250RmFtaWx5XG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSBkaXY7XG4gICAgbGV0IHRyYW5zZm9ybSA9IFwiXCI7XG4gICAgaWYgKFRleHRMYXllci4jbWluRm9udFNpemUgPiAxKSB7XG4gICAgICB0cmFuc2Zvcm0gPSBgc2NhbGUoJHsxIC8gVGV4dExheWVyLiNtaW5Gb250U2l6ZX0pYDtcbiAgICB9XG4gICAgaWYgKHByb3BlcnRpZXMuY2FudmFzV2lkdGggIT09IDAgJiYgcHJvcGVydGllcy5oYXNUZXh0KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZvbnRGYW1pbHlcbiAgICAgIH0gPSBzdHlsZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2FudmFzV2lkdGgsXG4gICAgICAgIGZvbnRTaXplXG4gICAgICB9ID0gcHJvcGVydGllcztcbiAgICAgIGlmIChwcmV2Rm9udFNpemUgIT09IGZvbnRTaXplIHx8IHByZXZGb250RmFtaWx5ICE9PSBmb250RmFtaWx5KSB7XG4gICAgICAgIGN0eC5mb250ID0gYCR7Zm9udFNpemUgKiB0aGlzLiNzY2FsZX1weCAke2ZvbnRGYW1pbHl9YDtcbiAgICAgICAgcGFyYW1zLnByZXZGb250U2l6ZSA9IGZvbnRTaXplO1xuICAgICAgICBwYXJhbXMucHJldkZvbnRGYW1pbHkgPSBmb250RmFtaWx5O1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aFxuICAgICAgfSA9IGN0eC5tZWFzdXJlVGV4dChkaXYudGV4dENvbnRlbnQpO1xuICAgICAgaWYgKHdpZHRoID4gMCkge1xuICAgICAgICB0cmFuc2Zvcm0gPSBgc2NhbGVYKCR7Y2FudmFzV2lkdGggKiB0aGlzLiNzY2FsZSAvIHdpZHRofSkgJHt0cmFuc2Zvcm19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BlcnRpZXMuYW5nbGUgIT09IDApIHtcbiAgICAgIHRyYW5zZm9ybSA9IGByb3RhdGUoJHtwcm9wZXJ0aWVzLmFuZ2xlfWRlZykgJHt0cmFuc2Zvcm19YDtcbiAgICB9XG4gICAgaWYgKHRyYW5zZm9ybS5sZW5ndGggPiAwKSB7XG4gICAgICBzdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgfVxuICB9XG4gIHN0YXRpYyBjbGVhbnVwKCkge1xuICAgIGlmICh0aGlzLiNwZW5kaW5nVGV4dExheWVycy5zaXplID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhc2NlbnRDYWNoZS5jbGVhcigpO1xuICAgIGZvciAoY29uc3Qge1xuICAgICAgY2FudmFzXG4gICAgfSBvZiB0aGlzLiNjYW52YXNDb250ZXh0cy52YWx1ZXMoKSkge1xuICAgICAgY2FudmFzLnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLiNjYW52YXNDb250ZXh0cy5jbGVhcigpO1xuICB9XG4gIHN0YXRpYyAjZ2V0Q3R4KGxhbmcgPSBudWxsKSB7XG4gICAgbGV0IGNhbnZhc0NvbnRleHQgPSB0aGlzLiNjYW52YXNDb250ZXh0cy5nZXQobGFuZyB8fD0gXCJcIik7XG4gICAgaWYgKCFjYW52YXNDb250ZXh0KSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgY2FudmFzLmNsYXNzTmFtZSA9IFwiaGlkZGVuQ2FudmFzRWxlbWVudFwiO1xuICAgICAgY2FudmFzLmxhbmcgPSBsYW5nO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoY2FudmFzKTtcbiAgICAgIGNhbnZhc0NvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIsIHtcbiAgICAgICAgYWxwaGE6IGZhbHNlLFxuICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWVcbiAgICAgIH0pO1xuICAgICAgdGhpcy4jY2FudmFzQ29udGV4dHMuc2V0KGxhbmcsIGNhbnZhc0NvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gY2FudmFzQ29udGV4dDtcbiAgfVxuICBzdGF0aWMgI2Vuc3VyZU1pbkZvbnRTaXplQ29tcHV0ZWQoKSB7XG4gICAgaWYgKHRoaXMuI21pbkZvbnRTaXplICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgIGRpdi5zdHlsZS5saW5lSGVpZ2h0ID0gMTtcbiAgICBkaXYuc3R5bGUuZm9udFNpemUgPSBcIjFweFwiO1xuICAgIGRpdi50ZXh0Q29udGVudCA9IFwiWFwiO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGRpdik7XG4gICAgdGhpcy4jbWluRm9udFNpemUgPSBkaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIGRpdi5yZW1vdmUoKTtcbiAgfVxuICBzdGF0aWMgI2dldEFzY2VudChmb250RmFtaWx5LCBsYW5nKSB7XG4gICAgY29uc3QgY2FjaGVkQXNjZW50ID0gdGhpcy4jYXNjZW50Q2FjaGUuZ2V0KGZvbnRGYW1pbHkpO1xuICAgIGlmIChjYWNoZWRBc2NlbnQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRBc2NlbnQ7XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IHRoaXMuI2dldEN0eChsYW5nKTtcbiAgICBjb25zdCBzYXZlZEZvbnQgPSBjdHguZm9udDtcbiAgICBjdHguY2FudmFzLndpZHRoID0gY3R4LmNhbnZhcy5oZWlnaHQgPSBERUZBVUxUX0ZPTlRfU0laRTtcbiAgICBjdHguZm9udCA9IGAke0RFRkFVTFRfRk9OVF9TSVpFfXB4ICR7Zm9udEZhbWlseX1gO1xuICAgIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQoXCJcIik7XG4gICAgbGV0IGFzY2VudCA9IG1ldHJpY3MuZm9udEJvdW5kaW5nQm94QXNjZW50O1xuICAgIGxldCBkZXNjZW50ID0gTWF0aC5hYnMobWV0cmljcy5mb250Qm91bmRpbmdCb3hEZXNjZW50KTtcbiAgICBpZiAoYXNjZW50KSB7XG4gICAgICBjb25zdCByYXRpbyA9IGFzY2VudCAvIChhc2NlbnQgKyBkZXNjZW50KTtcbiAgICAgIHRoaXMuI2FzY2VudENhY2hlLnNldChmb250RmFtaWx5LCByYXRpbyk7XG4gICAgICBjdHguY2FudmFzLndpZHRoID0gY3R4LmNhbnZhcy5oZWlnaHQgPSAwO1xuICAgICAgY3R4LmZvbnQgPSBzYXZlZEZvbnQ7XG4gICAgICByZXR1cm4gcmF0aW87XG4gICAgfVxuICAgIGN0eC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9GT05UX1NJWkUpO1xuICAgIGN0eC5zdHJva2VUZXh0KFwiZ1wiLCAwLCAwKTtcbiAgICBsZXQgcGl4ZWxzID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9GT05UX1NJWkUpLmRhdGE7XG4gICAgZGVzY2VudCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IHBpeGVscy5sZW5ndGggLSAxIC0gMzsgaSA+PSAwOyBpIC09IDQpIHtcbiAgICAgIGlmIChwaXhlbHNbaV0gPiAwKSB7XG4gICAgICAgIGRlc2NlbnQgPSBNYXRoLmNlaWwoaSAvIDQgLyBERUZBVUxUX0ZPTlRfU0laRSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIERFRkFVTFRfRk9OVF9TSVpFLCBERUZBVUxUX0ZPTlRfU0laRSk7XG4gICAgY3R4LnN0cm9rZVRleHQoXCJBXCIsIDAsIERFRkFVTFRfRk9OVF9TSVpFKTtcbiAgICBwaXhlbHMgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIERFRkFVTFRfRk9OVF9TSVpFLCBERUZBVUxUX0ZPTlRfU0laRSkuZGF0YTtcbiAgICBhc2NlbnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBpeGVscy5sZW5ndGg7IGkgPCBpaTsgaSArPSA0KSB7XG4gICAgICBpZiAocGl4ZWxzW2ldID4gMCkge1xuICAgICAgICBhc2NlbnQgPSBERUZBVUxUX0ZPTlRfU0laRSAtIE1hdGguZmxvb3IoaSAvIDQgLyBERUZBVUxUX0ZPTlRfU0laRSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjdHguY2FudmFzLndpZHRoID0gY3R4LmNhbnZhcy5oZWlnaHQgPSAwO1xuICAgIGN0eC5mb250ID0gc2F2ZWRGb250O1xuICAgIGNvbnN0IHJhdGlvID0gYXNjZW50ID8gYXNjZW50IC8gKGFzY2VudCArIGRlc2NlbnQpIDogREVGQVVMVF9GT05UX0FTQ0VOVDtcbiAgICB0aGlzLiNhc2NlbnRDYWNoZS5zZXQoZm9udEZhbWlseSwgcmF0aW8pO1xuICAgIHJldHVybiByYXRpbztcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyKCkge1xuICBkZXByZWNhdGVkKFwiYHJlbmRlclRleHRMYXllcmAsIHBsZWFzZSB1c2UgYFRleHRMYXllcmAgaW5zdGVhZC5cIik7XG4gIGNvbnN0IHtcbiAgICB0ZXh0Q29udGVudFNvdXJjZSxcbiAgICBjb250YWluZXIsXG4gICAgdmlld3BvcnQsXG4gICAgLi4ucmVzdFxuICB9ID0gYXJndW1lbnRzWzBdO1xuICBjb25zdCByZXN0S2V5cyA9IE9iamVjdC5rZXlzKHJlc3QpO1xuICBpZiAocmVzdEtleXMubGVuZ3RoID4gMCkge1xuICAgIHdhcm4oXCJJZ25vcmluZyBgcmVuZGVyVGV4dExheWVyYCBwYXJhbWV0ZXJzOiBcIiArIHJlc3RLZXlzLmpvaW4oXCIsIFwiKSk7XG4gIH1cbiAgY29uc3QgdGV4dExheWVyID0gbmV3IFRleHRMYXllcih7XG4gICAgdGV4dENvbnRlbnRTb3VyY2UsXG4gICAgY29udGFpbmVyLFxuICAgIHZpZXdwb3J0XG4gIH0pO1xuICBjb25zdCB7XG4gICAgdGV4dERpdnMsXG4gICAgdGV4dENvbnRlbnRJdGVtc1N0clxuICB9ID0gdGV4dExheWVyO1xuICBjb25zdCBwcm9taXNlID0gdGV4dExheWVyLnJlbmRlcigpO1xuICByZXR1cm4ge1xuICAgIHByb21pc2UsXG4gICAgdGV4dERpdnMsXG4gICAgdGV4dENvbnRlbnRJdGVtc1N0clxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlVGV4dExheWVyKCkge1xuICBkZXByZWNhdGVkKFwiYHVwZGF0ZVRleHRMYXllcmAsIHBsZWFzZSB1c2UgYFRleHRMYXllcmAgaW5zdGVhZC5cIik7XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L3hmYV90ZXh0LmpzXG5jbGFzcyBYZmFUZXh0IHtcbiAgc3RhdGljIHRleHRDb250ZW50KHhmYSkge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgaXRlbXMsXG4gICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHdhbGsobm9kZSkge1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBzdHIgPSBudWxsO1xuICAgICAgY29uc3QgbmFtZSA9IG5vZGUubmFtZTtcbiAgICAgIGlmIChuYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgc3RyID0gbm9kZS52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIVhmYVRleHQuc2hvdWxkQnVpbGRUZXh0KG5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAobm9kZT8uYXR0cmlidXRlcz8udGV4dENvbnRlbnQpIHtcbiAgICAgICAgc3RyID0gbm9kZS5hdHRyaWJ1dGVzLnRleHRDb250ZW50O1xuICAgICAgfSBlbHNlIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgIHN0ciA9IG5vZGUudmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoc3RyICE9PSBudWxsKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgIHN0clxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghbm9kZS5jaGlsZHJlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgd2FsayhjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHdhbGsoeGZhKTtcbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG4gIHN0YXRpYyBzaG91bGRCdWlsZFRleHQobmFtZSkge1xuICAgIHJldHVybiAhKG5hbWUgPT09IFwidGV4dGFyZWFcIiB8fCBuYW1lID09PSBcImlucHV0XCIgfHwgbmFtZSA9PT0gXCJvcHRpb25cIiB8fCBuYW1lID09PSBcInNlbGVjdFwiKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9hcGkuanNcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFID0gNjU1MzY7XG5jb25zdCBSRU5ERVJJTkdfQ0FOQ0VMTEVEX1RJTUVPVVQgPSAxMDA7XG5jb25zdCBERUxBWUVEX0NMRUFOVVBfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBEZWZhdWx0Q2FudmFzRmFjdG9yeSA9IGlzTm9kZUpTID8gTm9kZUNhbnZhc0ZhY3RvcnkgOiBET01DYW52YXNGYWN0b3J5O1xuY29uc3QgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gaXNOb2RlSlMgPyBOb2RlQ01hcFJlYWRlckZhY3RvcnkgOiBET01DTWFwUmVhZGVyRmFjdG9yeTtcbmNvbnN0IERlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gaXNOb2RlSlMgPyBOb2RlRmlsdGVyRmFjdG9yeSA6IERPTUZpbHRlckZhY3Rvcnk7XG5jb25zdCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBpc05vZGVKUyA/IE5vZGVTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA6IERPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnQoc3JjID0ge30pIHtcbiAgaWYgKHR5cGVvZiBzcmMgPT09IFwic3RyaW5nXCIgfHwgc3JjIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgc3JjID0ge1xuICAgICAgdXJsOiBzcmNcbiAgICB9O1xuICB9IGVsc2UgaWYgKHNyYyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyhzcmMpKSB7XG4gICAgc3JjID0ge1xuICAgICAgZGF0YTogc3JjXG4gICAgfTtcbiAgfVxuICBjb25zdCB0YXNrID0gbmV3IFBERkRvY3VtZW50TG9hZGluZ1Rhc2soKTtcbiAgY29uc3Qge1xuICAgIGRvY0lkXG4gIH0gPSB0YXNrO1xuICBjb25zdCB1cmwgPSBzcmMudXJsID8gZ2V0VXJsUHJvcChzcmMudXJsKSA6IG51bGw7XG4gIGNvbnN0IGRhdGEgPSBzcmMuZGF0YSA/IGdldERhdGFQcm9wKHNyYy5kYXRhKSA6IG51bGw7XG4gIGNvbnN0IGh0dHBIZWFkZXJzID0gc3JjLmh0dHBIZWFkZXJzIHx8IG51bGw7XG4gIGNvbnN0IHdpdGhDcmVkZW50aWFscyA9IHNyYy53aXRoQ3JlZGVudGlhbHMgPT09IHRydWU7XG4gIGNvbnN0IHBhc3N3b3JkID0gc3JjLnBhc3N3b3JkID8/IG51bGw7XG4gIGNvbnN0IHJhbmdlVHJhbnNwb3J0ID0gc3JjLnJhbmdlIGluc3RhbmNlb2YgUERGRGF0YVJhbmdlVHJhbnNwb3J0ID8gc3JjLnJhbmdlIDogbnVsbDtcbiAgY29uc3QgcmFuZ2VDaHVua1NpemUgPSBOdW1iZXIuaXNJbnRlZ2VyKHNyYy5yYW5nZUNodW5rU2l6ZSkgJiYgc3JjLnJhbmdlQ2h1bmtTaXplID4gMCA/IHNyYy5yYW5nZUNodW5rU2l6ZSA6IERFRkFVTFRfUkFOR0VfQ0hVTktfU0laRTtcbiAgbGV0IHdvcmtlciA9IHNyYy53b3JrZXIgaW5zdGFuY2VvZiBQREZXb3JrZXIgPyBzcmMud29ya2VyIDogbnVsbDtcbiAgY29uc3QgdmVyYm9zaXR5ID0gc3JjLnZlcmJvc2l0eTtcbiAgY29uc3QgZG9jQmFzZVVybCA9IHR5cGVvZiBzcmMuZG9jQmFzZVVybCA9PT0gXCJzdHJpbmdcIiAmJiAhaXNEYXRhU2NoZW1lKHNyYy5kb2NCYXNlVXJsKSA/IHNyYy5kb2NCYXNlVXJsIDogbnVsbDtcbiAgY29uc3QgY01hcFVybCA9IHR5cGVvZiBzcmMuY01hcFVybCA9PT0gXCJzdHJpbmdcIiA/IHNyYy5jTWFwVXJsIDogbnVsbDtcbiAgY29uc3QgY01hcFBhY2tlZCA9IHNyYy5jTWFwUGFja2VkICE9PSBmYWxzZTtcbiAgY29uc3QgQ01hcFJlYWRlckZhY3RvcnkgPSBzcmMuQ01hcFJlYWRlckZhY3RvcnkgfHwgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5O1xuICBjb25zdCBzdGFuZGFyZEZvbnREYXRhVXJsID0gdHlwZW9mIHNyYy5zdGFuZGFyZEZvbnREYXRhVXJsID09PSBcInN0cmluZ1wiID8gc3JjLnN0YW5kYXJkRm9udERhdGFVcmwgOiBudWxsO1xuICBjb25zdCBTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IHNyYy5TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB8fCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG4gIGNvbnN0IGlnbm9yZUVycm9ycyA9IHNyYy5zdG9wQXRFcnJvcnMgIT09IHRydWU7XG4gIGNvbnN0IG1heEltYWdlU2l6ZSA9IE51bWJlci5pc0ludGVnZXIoc3JjLm1heEltYWdlU2l6ZSkgJiYgc3JjLm1heEltYWdlU2l6ZSA+IC0xID8gc3JjLm1heEltYWdlU2l6ZSA6IC0xO1xuICBjb25zdCBpc0V2YWxTdXBwb3J0ZWQgPSBzcmMuaXNFdmFsU3VwcG9ydGVkICE9PSBmYWxzZTtcbiAgY29uc3QgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSB0eXBlb2Ygc3JjLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID09PSBcImJvb2xlYW5cIiA/IHNyYy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA6ICFpc05vZGVKUztcbiAgY29uc3QgY2FudmFzTWF4QXJlYUluQnl0ZXMgPSBOdW1iZXIuaXNJbnRlZ2VyKHNyYy5jYW52YXNNYXhBcmVhSW5CeXRlcykgPyBzcmMuY2FudmFzTWF4QXJlYUluQnl0ZXMgOiAtMTtcbiAgY29uc3QgZGlzYWJsZUZvbnRGYWNlID0gdHlwZW9mIHNyYy5kaXNhYmxlRm9udEZhY2UgPT09IFwiYm9vbGVhblwiID8gc3JjLmRpc2FibGVGb250RmFjZSA6IGlzTm9kZUpTO1xuICBjb25zdCBmb250RXh0cmFQcm9wZXJ0aWVzID0gc3JjLmZvbnRFeHRyYVByb3BlcnRpZXMgPT09IHRydWU7XG4gIGNvbnN0IGVuYWJsZVhmYSA9IHNyYy5lbmFibGVYZmEgPT09IHRydWU7XG4gIGNvbnN0IG93bmVyRG9jdW1lbnQgPSBzcmMub3duZXJEb2N1bWVudCB8fCBnbG9iYWxUaGlzLmRvY3VtZW50O1xuICBjb25zdCBkaXNhYmxlUmFuZ2UgPSBzcmMuZGlzYWJsZVJhbmdlID09PSB0cnVlO1xuICBjb25zdCBkaXNhYmxlU3RyZWFtID0gc3JjLmRpc2FibGVTdHJlYW0gPT09IHRydWU7XG4gIGNvbnN0IGRpc2FibGVBdXRvRmV0Y2ggPSBzcmMuZGlzYWJsZUF1dG9GZXRjaCA9PT0gdHJ1ZTtcbiAgY29uc3QgcGRmQnVnID0gc3JjLnBkZkJ1ZyA9PT0gdHJ1ZTtcbiAgY29uc3QgZW5hYmxlSFdBID0gc3JjLmVuYWJsZUhXQSA9PT0gdHJ1ZTtcbiAgY29uc3QgbGVuZ3RoID0gcmFuZ2VUcmFuc3BvcnQgPyByYW5nZVRyYW5zcG9ydC5sZW5ndGggOiBzcmMubGVuZ3RoID8/IE5hTjtcbiAgY29uc3QgdXNlU3lzdGVtRm9udHMgPSB0eXBlb2Ygc3JjLnVzZVN5c3RlbUZvbnRzID09PSBcImJvb2xlYW5cIiA/IHNyYy51c2VTeXN0ZW1Gb250cyA6ICFpc05vZGVKUyAmJiAhZGlzYWJsZUZvbnRGYWNlO1xuICBjb25zdCB1c2VXb3JrZXJGZXRjaCA9IHR5cGVvZiBzcmMudXNlV29ya2VyRmV0Y2ggPT09IFwiYm9vbGVhblwiID8gc3JjLnVzZVdvcmtlckZldGNoIDogQ01hcFJlYWRlckZhY3RvcnkgPT09IERPTUNNYXBSZWFkZXJGYWN0b3J5ICYmIFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID09PSBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSAmJiBjTWFwVXJsICYmIHN0YW5kYXJkRm9udERhdGFVcmwgJiYgaXNWYWxpZEZldGNoVXJsKGNNYXBVcmwsIGRvY3VtZW50LmJhc2VVUkkpICYmIGlzVmFsaWRGZXRjaFVybChzdGFuZGFyZEZvbnREYXRhVXJsLCBkb2N1bWVudC5iYXNlVVJJKTtcbiAgY29uc3QgY2FudmFzRmFjdG9yeSA9IHNyYy5jYW52YXNGYWN0b3J5IHx8IG5ldyBEZWZhdWx0Q2FudmFzRmFjdG9yeSh7XG4gICAgb3duZXJEb2N1bWVudCxcbiAgICBlbmFibGVIV0FcbiAgfSk7XG4gIGNvbnN0IGZpbHRlckZhY3RvcnkgPSBzcmMuZmlsdGVyRmFjdG9yeSB8fCBuZXcgRGVmYXVsdEZpbHRlckZhY3Rvcnkoe1xuICAgIGRvY0lkLFxuICAgIG93bmVyRG9jdW1lbnRcbiAgfSk7XG4gIGNvbnN0IHN0eWxlRWxlbWVudCA9IG51bGw7XG4gIHNldFZlcmJvc2l0eUxldmVsKHZlcmJvc2l0eSk7XG4gIGNvbnN0IHRyYW5zcG9ydEZhY3RvcnkgPSB7XG4gICAgY2FudmFzRmFjdG9yeSxcbiAgICBmaWx0ZXJGYWN0b3J5XG4gIH07XG4gIGlmICghdXNlV29ya2VyRmV0Y2gpIHtcbiAgICB0cmFuc3BvcnRGYWN0b3J5LmNNYXBSZWFkZXJGYWN0b3J5ID0gbmV3IENNYXBSZWFkZXJGYWN0b3J5KHtcbiAgICAgIGJhc2VVcmw6IGNNYXBVcmwsXG4gICAgICBpc0NvbXByZXNzZWQ6IGNNYXBQYWNrZWRcbiAgICB9KTtcbiAgICB0cmFuc3BvcnRGYWN0b3J5LnN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gbmV3IFN0YW5kYXJkRm9udERhdGFGYWN0b3J5KHtcbiAgICAgIGJhc2VVcmw6IHN0YW5kYXJkRm9udERhdGFVcmxcbiAgICB9KTtcbiAgfVxuICBpZiAoIXdvcmtlcikge1xuICAgIGNvbnN0IHdvcmtlclBhcmFtcyA9IHtcbiAgICAgIHZlcmJvc2l0eSxcbiAgICAgIHBvcnQ6IEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyUG9ydFxuICAgIH07XG4gICAgd29ya2VyID0gd29ya2VyUGFyYW1zLnBvcnQgPyBQREZXb3JrZXIuZnJvbVBvcnQod29ya2VyUGFyYW1zKSA6IG5ldyBQREZXb3JrZXIod29ya2VyUGFyYW1zKTtcbiAgICB0YXNrLl93b3JrZXIgPSB3b3JrZXI7XG4gIH1cbiAgY29uc3QgZG9jUGFyYW1zID0ge1xuICAgIGRvY0lkLFxuICAgIGFwaVZlcnNpb246IFwiNC40LjE2OFwiLFxuICAgIGRhdGEsXG4gICAgcGFzc3dvcmQsXG4gICAgZGlzYWJsZUF1dG9GZXRjaCxcbiAgICByYW5nZUNodW5rU2l6ZSxcbiAgICBsZW5ndGgsXG4gICAgZG9jQmFzZVVybCxcbiAgICBlbmFibGVYZmEsXG4gICAgZXZhbHVhdG9yT3B0aW9uczoge1xuICAgICAgbWF4SW1hZ2VTaXplLFxuICAgICAgZGlzYWJsZUZvbnRGYWNlLFxuICAgICAgaWdub3JlRXJyb3JzLFxuICAgICAgaXNFdmFsU3VwcG9ydGVkLFxuICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQsXG4gICAgICBjYW52YXNNYXhBcmVhSW5CeXRlcyxcbiAgICAgIGZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgICB1c2VTeXN0ZW1Gb250cyxcbiAgICAgIGNNYXBVcmw6IHVzZVdvcmtlckZldGNoID8gY01hcFVybCA6IG51bGwsXG4gICAgICBzdGFuZGFyZEZvbnREYXRhVXJsOiB1c2VXb3JrZXJGZXRjaCA/IHN0YW5kYXJkRm9udERhdGFVcmwgOiBudWxsXG4gICAgfVxuICB9O1xuICBjb25zdCB0cmFuc3BvcnRQYXJhbXMgPSB7XG4gICAgZGlzYWJsZUZvbnRGYWNlLFxuICAgIGZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgb3duZXJEb2N1bWVudCxcbiAgICBwZGZCdWcsXG4gICAgc3R5bGVFbGVtZW50LFxuICAgIGxvYWRpbmdQYXJhbXM6IHtcbiAgICAgIGRpc2FibGVBdXRvRmV0Y2gsXG4gICAgICBlbmFibGVYZmFcbiAgICB9XG4gIH07XG4gIHdvcmtlci5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIGlmICh0YXNrLmRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgIH1cbiAgICBpZiAod29ya2VyLmRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IHdvcmtlcklkUHJvbWlzZSA9IHdvcmtlci5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREb2NSZXF1ZXN0XCIsIGRvY1BhcmFtcywgZGF0YSA/IFtkYXRhLmJ1ZmZlcl0gOiBudWxsKTtcbiAgICBsZXQgbmV0d29ya1N0cmVhbTtcbiAgICBpZiAocmFuZ2VUcmFuc3BvcnQpIHtcbiAgICAgIG5ldHdvcmtTdHJlYW0gPSBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbShyYW5nZVRyYW5zcG9ydCwge1xuICAgICAgICBkaXNhYmxlUmFuZ2UsXG4gICAgICAgIGRpc2FibGVTdHJlYW1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIWRhdGEpIHtcbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImdldERvY3VtZW50IC0gbm8gYHVybGAgcGFyYW1ldGVyIHByb3ZpZGVkLlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNyZWF0ZVBERk5ldHdvcmtTdHJlYW0gPSBwYXJhbXMgPT4ge1xuICAgICAgICBpZiAoaXNOb2RlSlMpIHtcbiAgICAgICAgICBjb25zdCBpc0ZldGNoU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBmZXRjaCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgUmVzcG9uc2UgIT09IFwidW5kZWZpbmVkXCIgJiYgXCJib2R5XCIgaW4gUmVzcG9uc2UucHJvdG90eXBlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGlzRmV0Y2hTdXBwb3J0ZWQoKSAmJiBpc1ZhbGlkRmV0Y2hVcmwocGFyYW1zLnVybCkgPyBuZXcgUERGRmV0Y2hTdHJlYW0ocGFyYW1zKSA6IG5ldyBQREZOb2RlU3RyZWFtKHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmFsaWRGZXRjaFVybChwYXJhbXMudXJsKSA/IG5ldyBQREZGZXRjaFN0cmVhbShwYXJhbXMpIDogbmV3IFBERk5ldHdvcmtTdHJlYW0ocGFyYW1zKTtcbiAgICAgIH07XG4gICAgICBuZXR3b3JrU3RyZWFtID0gY3JlYXRlUERGTmV0d29ya1N0cmVhbSh7XG4gICAgICAgIHVybCxcbiAgICAgICAgbGVuZ3RoLFxuICAgICAgICBodHRwSGVhZGVycyxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzLFxuICAgICAgICByYW5nZUNodW5rU2l6ZSxcbiAgICAgICAgZGlzYWJsZVJhbmdlLFxuICAgICAgICBkaXNhYmxlU3RyZWFtXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtlcklkUHJvbWlzZS50aGVuKHdvcmtlcklkID0+IHtcbiAgICAgIGlmICh0YXNrLmRlc3Ryb3llZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkaW5nIGFib3J0ZWRcIik7XG4gICAgICB9XG4gICAgICBpZiAod29ya2VyLmRlc3Ryb3llZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKGRvY0lkLCB3b3JrZXJJZCwgd29ya2VyLnBvcnQpO1xuICAgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFdvcmtlclRyYW5zcG9ydChtZXNzYWdlSGFuZGxlciwgdGFzaywgbmV0d29ya1N0cmVhbSwgdHJhbnNwb3J0UGFyYW1zLCB0cmFuc3BvcnRGYWN0b3J5KTtcbiAgICAgIHRhc2suX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgICAgIG1lc3NhZ2VIYW5kbGVyLnNlbmQoXCJSZWFkeVwiLCBudWxsKTtcbiAgICB9KTtcbiAgfSkuY2F0Y2godGFzay5fY2FwYWJpbGl0eS5yZWplY3QpO1xuICByZXR1cm4gdGFzaztcbn1cbmZ1bmN0aW9uIGdldFVybFByb3AodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBVUkwpIHtcbiAgICByZXR1cm4gdmFsLmhyZWY7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh2YWwsIHdpbmRvdy5sb2NhdGlvbikuaHJlZjtcbiAgfSBjYXRjaCB7XG4gICAgaWYgKGlzTm9kZUpTICYmIHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgUERGIHVybCBkYXRhOiBcIiArIFwiZWl0aGVyIHN0cmluZyBvciBVUkwtb2JqZWN0IGlzIGV4cGVjdGVkIGluIHRoZSB1cmwgcHJvcGVydHkuXCIpO1xufVxuZnVuY3Rpb24gZ2V0RGF0YVByb3AodmFsKSB7XG4gIGlmIChpc05vZGVKUyAmJiB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbCBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlBsZWFzZSBwcm92aWRlIGJpbmFyeSBkYXRhIGFzIGBVaW50OEFycmF5YCwgcmF0aGVyIHRoYW4gYEJ1ZmZlcmAuXCIpO1xuICB9XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIHZhbC5ieXRlTGVuZ3RoID09PSB2YWwuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RvQnl0ZXModmFsKTtcbiAgfVxuICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCkgfHwgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJiAhaXNOYU4odmFsPy5sZW5ndGgpKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBQREYgYmluYXJ5IGRhdGE6IGVpdGhlciBUeXBlZEFycmF5LCBcIiArIFwic3RyaW5nLCBvciBhcnJheS1saWtlIG9iamVjdCBpcyBleHBlY3RlZCBpbiB0aGUgZGF0YSBwcm9wZXJ0eS5cIik7XG59XG5mdW5jdGlvbiBpc1JlZlByb3h5KHJlZikge1xuICByZXR1cm4gdHlwZW9mIHJlZiA9PT0gXCJvYmplY3RcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKHJlZj8ubnVtKSAmJiByZWYubnVtID49IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihyZWY/LmdlbikgJiYgcmVmLmdlbiA+PSAwO1xufVxuY2xhc3MgUERGRG9jdW1lbnRMb2FkaW5nVGFzayB7XG4gIHN0YXRpYyAjZG9jSWQgPSAwO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9jYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fdHJhbnNwb3J0ID0gbnVsbDtcbiAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgIHRoaXMuZG9jSWQgPSBgZCR7UERGRG9jdW1lbnRMb2FkaW5nVGFzay4jZG9jSWQrK31gO1xuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5vblBhc3N3b3JkID0gbnVsbDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIGdldCBwcm9taXNlKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLl93b3JrZXI/LnBvcnQpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyLl9wZW5kaW5nRGVzdHJveSA9IHRydWU7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLl90cmFuc3BvcnQ/LmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKHRoaXMuX3dvcmtlcj8ucG9ydCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fd29ya2VyLl9wZW5kaW5nRGVzdHJveTtcbiAgICAgIH1cbiAgICAgIHRocm93IGV4O1xuICAgIH1cbiAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuICAgIGlmICh0aGlzLl93b3JrZXIpIHtcbiAgICAgIHRoaXMuX3dvcmtlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgUERGRGF0YVJhbmdlVHJhbnNwb3J0IHtcbiAgY29uc3RydWN0b3IobGVuZ3RoLCBpbml0aWFsRGF0YSwgcHJvZ3Jlc3NpdmVEb25lID0gZmFsc2UsIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gbnVsbCkge1xuICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIHRoaXMuaW5pdGlhbERhdGEgPSBpbml0aWFsRGF0YTtcbiAgICB0aGlzLnByb2dyZXNzaXZlRG9uZSA9IHByb2dyZXNzaXZlRG9uZTtcbiAgICB0aGlzLmNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU7XG4gICAgdGhpcy5fcmFuZ2VMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycyA9IFtdO1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycyA9IFtdO1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycyA9IFtdO1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICB9XG4gIGFkZFJhbmdlTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICB0aGlzLl9yYW5nZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfVxuICBhZGRQcm9ncmVzc0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cbiAgYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cbiAgYWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cbiAgb25EYXRhUmFuZ2UoYmVnaW4sIGNodW5rKSB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9yYW5nZUxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoYmVnaW4sIGNodW5rKTtcbiAgICB9XG4gIH1cbiAgb25EYXRhUHJvZ3Jlc3MobG9hZGVkLCB0b3RhbCkge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycykge1xuICAgICAgICBsaXN0ZW5lcihsb2FkZWQsIHRvdGFsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBvbkRhdGFQcm9ncmVzc2l2ZVJlYWQoY2h1bmspIHtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyKGNodW5rKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBvbkRhdGFQcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycykge1xuICAgICAgICBsaXN0ZW5lcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHRyYW5zcG9ydFJlYWR5KCkge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cbiAgcmVxdWVzdERhdGFSYW5nZShiZWdpbiwgZW5kKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgUERGRGF0YVJhbmdlVHJhbnNwb3J0LnJlcXVlc3REYXRhUmFuZ2VcIik7XG4gIH1cbiAgYWJvcnQoKSB7fVxufVxuY2xhc3MgUERGRG9jdW1lbnRQcm94eSB7XG4gIGNvbnN0cnVjdG9yKHBkZkluZm8sIHRyYW5zcG9ydCkge1xuICAgIHRoaXMuX3BkZkluZm8gPSBwZGZJbmZvO1xuICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgfVxuICBnZXQgYW5ub3RhdGlvblN0b3JhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgfVxuICBnZXQgZmlsdGVyRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmZpbHRlckZhY3Rvcnk7XG4gIH1cbiAgZ2V0IG51bVBhZ2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9wZGZJbmZvLm51bVBhZ2VzO1xuICB9XG4gIGdldCBmaW5nZXJwcmludHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BkZkluZm8uZmluZ2VycHJpbnRzO1xuICB9XG4gIGdldCBpc1B1cmVYZmEoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzUHVyZVhmYVwiLCAhIXRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSk7XG4gIH1cbiAgZ2V0IGFsbFhmYUh0bWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYTtcbiAgfVxuICBnZXRQYWdlKHBhZ2VOdW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2UocGFnZU51bWJlcik7XG4gIH1cbiAgZ2V0UGFnZUluZGV4KHJlZikge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUluZGV4KHJlZik7XG4gIH1cbiAgZ2V0RGVzdGluYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb25zKCk7XG4gIH1cbiAgZ2V0RGVzdGluYXRpb24oaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERlc3RpbmF0aW9uKGlkKTtcbiAgfVxuICBnZXRQYWdlTGFiZWxzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxhYmVscygpO1xuICB9XG4gIGdldFBhZ2VMYXlvdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTGF5b3V0KCk7XG4gIH1cbiAgZ2V0UGFnZU1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTW9kZSgpO1xuICB9XG4gIGdldFZpZXdlclByZWZlcmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKTtcbiAgfVxuICBnZXRPcGVuQWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3BlbkFjdGlvbigpO1xuICB9XG4gIGdldEF0dGFjaG1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0QXR0YWNobWVudHMoKTtcbiAgfVxuICBnZXRKU0FjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREb2NKU0FjdGlvbnMoKTtcbiAgfVxuICBnZXRPdXRsaW5lKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3V0bGluZSgpO1xuICB9XG4gIGdldE9wdGlvbmFsQ29udGVudENvbmZpZyh7XG4gICAgaW50ZW50ID0gXCJkaXNwbGF5XCJcbiAgfSA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgcmVuZGVyaW5nSW50ZW50XG4gICAgfSA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KTtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZyhyZW5kZXJpbmdJbnRlbnQpO1xuICB9XG4gIGdldFBlcm1pc3Npb25zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGVybWlzc2lvbnMoKTtcbiAgfVxuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE1ldGFkYXRhKCk7XG4gIH1cbiAgZ2V0TWFya0luZm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNYXJrSW5mbygpO1xuICB9XG4gIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREYXRhKCk7XG4gIH1cbiAgc2F2ZURvY3VtZW50KCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc2F2ZURvY3VtZW50KCk7XG4gIH1cbiAgZ2V0RG93bmxvYWRJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGNsZWFudXAoa2VlcExvYWRlZEZvbnRzID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LnN0YXJ0Q2xlYW51cChrZWVwTG9hZGVkRm9udHMgfHwgdGhpcy5pc1B1cmVYZmEpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1Rhc2suZGVzdHJveSgpO1xuICB9XG4gIGNhY2hlZFBhZ2VOdW1iZXIocmVmKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5jYWNoZWRQYWdlTnVtYmVyKHJlZik7XG4gIH1cbiAgZ2V0IGxvYWRpbmdQYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nUGFyYW1zO1xuICB9XG4gIGdldCBsb2FkaW5nVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdUYXNrO1xuICB9XG4gIGdldEZpZWxkT2JqZWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEZpZWxkT2JqZWN0cygpO1xuICB9XG4gIGhhc0pTQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Lmhhc0pTQWN0aW9ucygpO1xuICB9XG4gIGdldENhbGN1bGF0aW9uT3JkZXJJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRDYWxjdWxhdGlvbk9yZGVySWRzKCk7XG4gIH1cbn1cbmNsYXNzIFBERlBhZ2VQcm94eSB7XG4gICNkZWxheWVkQ2xlYW51cFRpbWVvdXQgPSBudWxsO1xuICAjcGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocGFnZUluZGV4LCBwYWdlSW5mbywgdHJhbnNwb3J0LCBwZGZCdWcgPSBmYWxzZSkge1xuICAgIHRoaXMuX3BhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICB0aGlzLl9wYWdlSW5mbyA9IHBhZ2VJbmZvO1xuICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgICB0aGlzLl9zdGF0cyA9IHBkZkJ1ZyA/IG5ldyBTdGF0VGltZXIoKSA6IG51bGw7XG4gICAgdGhpcy5fcGRmQnVnID0gcGRmQnVnO1xuICAgIHRoaXMuY29tbW9uT2JqcyA9IHRyYW5zcG9ydC5jb21tb25PYmpzO1xuICAgIHRoaXMub2JqcyA9IG5ldyBQREZPYmplY3RzKCk7XG4gICAgdGhpcy5fbWF5YmVDbGVhbnVwQWZ0ZXJSZW5kZXIgPSBmYWxzZTtcbiAgICB0aGlzLl9pbnRlbnRTdGF0ZXMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgfVxuICBnZXQgcGFnZU51bWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUluZGV4ICsgMTtcbiAgfVxuICBnZXQgcm90YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby5yb3RhdGU7XG4gIH1cbiAgZ2V0IHJlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucmVmO1xuICB9XG4gIGdldCB1c2VyVW5pdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8udXNlclVuaXQ7XG4gIH1cbiAgZ2V0IHZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnZpZXc7XG4gIH1cbiAgZ2V0Vmlld3BvcnQoe1xuICAgIHNjYWxlLFxuICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGUsXG4gICAgb2Zmc2V0WCA9IDAsXG4gICAgb2Zmc2V0WSA9IDAsXG4gICAgZG9udEZsaXAgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgICB2aWV3Qm94OiB0aGlzLnZpZXcsXG4gICAgICBzY2FsZSxcbiAgICAgIHJvdGF0aW9uLFxuICAgICAgb2Zmc2V0WCxcbiAgICAgIG9mZnNldFksXG4gICAgICBkb250RmxpcFxuICAgIH0pO1xuICB9XG4gIGdldEFubm90YXRpb25zKHtcbiAgICBpbnRlbnQgPSBcImRpc3BsYXlcIlxuICB9ID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICByZW5kZXJpbmdJbnRlbnRcbiAgICB9ID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudChpbnRlbnQpO1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0QW5ub3RhdGlvbnModGhpcy5fcGFnZUluZGV4LCByZW5kZXJpbmdJbnRlbnQpO1xuICB9XG4gIGdldEpTQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VKU0FjdGlvbnModGhpcy5fcGFnZUluZGV4KTtcbiAgfVxuICBnZXQgZmlsdGVyRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmZpbHRlckZhY3Rvcnk7XG4gIH1cbiAgZ2V0IGlzUHVyZVhmYSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNQdXJlWGZhXCIsICEhdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhKTtcbiAgfVxuICBhc3luYyBnZXRYZmEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYT8uY2hpbGRyZW5bdGhpcy5fcGFnZUluZGV4XSB8fCBudWxsO1xuICB9XG4gIHJlbmRlcih7XG4gICAgY2FudmFzQ29udGV4dCxcbiAgICB2aWV3cG9ydCxcbiAgICBpbnRlbnQgPSBcImRpc3BsYXlcIixcbiAgICBhbm5vdGF0aW9uTW9kZSA9IEFubm90YXRpb25Nb2RlLkVOQUJMRSxcbiAgICB0cmFuc2Zvcm0gPSBudWxsLFxuICAgIGJhY2tncm91bmQgPSBudWxsLFxuICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBudWxsLFxuICAgIGFubm90YXRpb25DYW52YXNNYXAgPSBudWxsLFxuICAgIHBhZ2VDb2xvcnMgPSBudWxsLFxuICAgIHByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsXG4gIH0pIHtcbiAgICB0aGlzLl9zdGF0cz8udGltZShcIk92ZXJhbGxcIik7XG4gICAgY29uc3QgaW50ZW50QXJncyA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50LCBhbm5vdGF0aW9uTW9kZSwgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSk7XG4gICAgY29uc3Qge1xuICAgICAgcmVuZGVyaW5nSW50ZW50LFxuICAgICAgY2FjaGVLZXlcbiAgICB9ID0gaW50ZW50QXJncztcbiAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuICAgIHRoaXMuI2Fib3J0RGVsYXllZENsZWFudXAoKTtcbiAgICBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlIHx8PSB0aGlzLl90cmFuc3BvcnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKHJlbmRlcmluZ0ludGVudCk7XG4gICAgbGV0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChjYWNoZUtleSk7XG4gICAgaWYgKCFpbnRlbnRTdGF0ZSkge1xuICAgICAgaW50ZW50U3RhdGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdGhpcy5faW50ZW50U3RhdGVzLnNldChjYWNoZUtleSwgaW50ZW50U3RhdGUpO1xuICAgIH1cbiAgICBpZiAoaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpO1xuICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGludGVudFByaW50ID0gISEocmVuZGVyaW5nSW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCk7XG4gICAgaWYgKCFpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7XG4gICAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QgPSB7XG4gICAgICAgIGZuQXJyYXk6IFtdLFxuICAgICAgICBhcmdzQXJyYXk6IFtdLFxuICAgICAgICBsYXN0Q2h1bms6IGZhbHNlLFxuICAgICAgICBzZXBhcmF0ZUFubm90czogbnVsbFxuICAgICAgfTtcbiAgICAgIHRoaXMuX3N0YXRzPy50aW1lKFwiUGFnZSBSZXF1ZXN0XCIpO1xuICAgICAgdGhpcy5fcHVtcE9wZXJhdG9yTGlzdChpbnRlbnRBcmdzKTtcbiAgICB9XG4gICAgY29uc3QgY29tcGxldGUgPSBlcnJvciA9PiB7XG4gICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5kZWxldGUoaW50ZXJuYWxSZW5kZXJUYXNrKTtcbiAgICAgIGlmICh0aGlzLl9tYXliZUNsZWFudXBBZnRlclJlbmRlciB8fCBpbnRlbnRQcmludCkge1xuICAgICAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLiN0cnlDbGVhbnVwKCFpbnRlbnRQcmludCk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucmVqZWN0KGVycm9yKTtcbiAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgIGludGVudFN0YXRlLFxuICAgICAgICAgIHJlYXNvbjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKGVycm9yKVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9zdGF0cykge1xuICAgICAgICB0aGlzLl9zdGF0cy50aW1lRW5kKFwiUmVuZGVyaW5nXCIpO1xuICAgICAgICB0aGlzLl9zdGF0cy50aW1lRW5kKFwiT3ZlcmFsbFwiKTtcbiAgICAgICAgaWYgKGdsb2JhbFRoaXMuU3RhdHM/LmVuYWJsZWQpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLlN0YXRzLmFkZCh0aGlzLnBhZ2VOdW1iZXIsIHRoaXMuX3N0YXRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrID0gbmV3IEludGVybmFsUmVuZGVyVGFzayh7XG4gICAgICBjYWxsYmFjazogY29tcGxldGUsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgY2FudmFzQ29udGV4dCxcbiAgICAgICAgdmlld3BvcnQsXG4gICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgYmFja2dyb3VuZFxuICAgICAgfSxcbiAgICAgIG9ianM6IHRoaXMub2JqcyxcbiAgICAgIGNvbW1vbk9ianM6IHRoaXMuY29tbW9uT2JqcyxcbiAgICAgIGFubm90YXRpb25DYW52YXNNYXAsXG4gICAgICBvcGVyYXRvckxpc3Q6IGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCxcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuICAgICAgY2FudmFzRmFjdG9yeTogdGhpcy5fdHJhbnNwb3J0LmNhbnZhc0ZhY3RvcnksXG4gICAgICBmaWx0ZXJGYWN0b3J5OiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeSxcbiAgICAgIHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZTogIWludGVudFByaW50LFxuICAgICAgcGRmQnVnOiB0aGlzLl9wZGZCdWcsXG4gICAgICBwYWdlQ29sb3JzXG4gICAgfSk7XG4gICAgKGludGVudFN0YXRlLnJlbmRlclRhc2tzIHx8PSBuZXcgU2V0KCkpLmFkZChpbnRlcm5hbFJlbmRlclRhc2spO1xuICAgIGNvbnN0IHJlbmRlclRhc2sgPSBpbnRlcm5hbFJlbmRlclRhc2sudGFzaztcbiAgICBQcm9taXNlLmFsbChbaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlXSkudGhlbigoW3RyYW5zcGFyZW5jeSwgb3B0aW9uYWxDb250ZW50Q29uZmlnXSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YXRzPy50aW1lKFwiUmVuZGVyaW5nXCIpO1xuICAgICAgaWYgKCEob3B0aW9uYWxDb250ZW50Q29uZmlnLnJlbmRlcmluZ0ludGVudCAmIHJlbmRlcmluZ0ludGVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCB1c2UgdGhlIHNhbWUgYGludGVudGAtYXJndW1lbnQgd2hlbiBjYWxsaW5nIHRoZSBgUERGUGFnZVByb3h5LnJlbmRlcmAgXCIgKyBcImFuZCBgUERGRG9jdW1lbnRQcm94eS5nZXRPcHRpb25hbENvbnRlbnRDb25maWdgIG1ldGhvZHMuXCIpO1xuICAgICAgfVxuICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmluaXRpYWxpemVHcmFwaGljcyh7XG4gICAgICAgIHRyYW5zcGFyZW5jeSxcbiAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnXG4gICAgICB9KTtcbiAgICAgIGludGVybmFsUmVuZGVyVGFzay5vcGVyYXRvckxpc3RDaGFuZ2VkKCk7XG4gICAgfSkuY2F0Y2goY29tcGxldGUpO1xuICAgIHJldHVybiByZW5kZXJUYXNrO1xuICB9XG4gIGdldE9wZXJhdG9yTGlzdCh7XG4gICAgaW50ZW50ID0gXCJkaXNwbGF5XCIsXG4gICAgYW5ub3RhdGlvbk1vZGUgPSBBbm5vdGF0aW9uTW9kZS5FTkFCTEUsXG4gICAgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IG51bGxcbiAgfSA9IHt9KSB7XG4gICAgZnVuY3Rpb24gb3BlcmF0b3JMaXN0Q2hhbmdlZCgpIHtcbiAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG4gICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlc29sdmUoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0KTtcbiAgICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MuZGVsZXRlKG9wTGlzdFRhc2spO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbnRlbnRBcmdzID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudChpbnRlbnQsIGFubm90YXRpb25Nb2RlLCBwcmludEFubm90YXRpb25TdG9yYWdlLCB0cnVlKTtcbiAgICBsZXQgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGludGVudEFyZ3MuY2FjaGVLZXkpO1xuICAgIGlmICghaW50ZW50U3RhdGUpIHtcbiAgICAgIGludGVudFN0YXRlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5zZXQoaW50ZW50QXJncy5jYWNoZUtleSwgaW50ZW50U3RhdGUpO1xuICAgIH1cbiAgICBsZXQgb3BMaXN0VGFzaztcbiAgICBpZiAoIWludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG4gICAgICBvcExpc3RUYXNrID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIG9wTGlzdFRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCA9IG9wZXJhdG9yTGlzdENoYW5nZWQ7XG4gICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgKGludGVudFN0YXRlLnJlbmRlclRhc2tzIHx8PSBuZXcgU2V0KCkpLmFkZChvcExpc3RUYXNrKTtcbiAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCA9IHtcbiAgICAgICAgZm5BcnJheTogW10sXG4gICAgICAgIGFyZ3NBcnJheTogW10sXG4gICAgICAgIGxhc3RDaHVuazogZmFsc2UsXG4gICAgICAgIHNlcGFyYXRlQW5ub3RzOiBudWxsXG4gICAgICB9O1xuICAgICAgdGhpcy5fc3RhdHM/LnRpbWUoXCJQYWdlIFJlcXVlc3RcIik7XG4gICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KGludGVudEFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBzdHJlYW1UZXh0Q29udGVudCh7XG4gICAgaW5jbHVkZU1hcmtlZENvbnRlbnQgPSBmYWxzZSxcbiAgICBkaXNhYmxlTm9ybWFsaXphdGlvbiA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IFRFWFRfQ09OVEVOVF9DSFVOS19TSVpFID0gMTAwO1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXCJHZXRUZXh0Q29udGVudFwiLCB7XG4gICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCxcbiAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50OiBpbmNsdWRlTWFya2VkQ29udGVudCA9PT0gdHJ1ZSxcbiAgICAgIGRpc2FibGVOb3JtYWxpemF0aW9uOiBkaXNhYmxlTm9ybWFsaXphdGlvbiA9PT0gdHJ1ZVxuICAgIH0sIHtcbiAgICAgIGhpZ2hXYXRlck1hcms6IFRFWFRfQ09OVEVOVF9DSFVOS19TSVpFLFxuICAgICAgc2l6ZSh0ZXh0Q29udGVudCkge1xuICAgICAgICByZXR1cm4gdGV4dENvbnRlbnQuaXRlbXMubGVuZ3RoO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGdldFRleHRDb250ZW50KHBhcmFtcyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0WGZhKCkudGhlbih4ZmEgPT4gWGZhVGV4dC50ZXh0Q29udGVudCh4ZmEpKTtcbiAgICB9XG4gICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLnN0cmVhbVRleHRDb250ZW50KHBhcmFtcyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIHB1bXAoKSB7XG4gICAgICAgIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoe1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGRvbmVcbiAgICAgICAgfSkge1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICByZXNvbHZlKHRleHRDb250ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGV4dENvbnRlbnQubGFuZyA/Pz0gdmFsdWUubGFuZztcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRleHRDb250ZW50LnN0eWxlcywgdmFsdWUuc3R5bGVzKTtcbiAgICAgICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKC4uLnZhbHVlLml0ZW1zKTtcbiAgICAgICAgICBwdW1wKCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgIGNvbnN0IHRleHRDb250ZW50ID0ge1xuICAgICAgICBpdGVtczogW10sXG4gICAgICAgIHN0eWxlczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgbGFuZzogbnVsbFxuICAgICAgfTtcbiAgICAgIHB1bXAoKTtcbiAgICB9KTtcbiAgfVxuICBnZXRTdHJ1Y3RUcmVlKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0U3RydWN0VHJlZSh0aGlzLl9wYWdlSW5kZXgpO1xuICB9XG4gIF9kZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICBjb25zdCB3YWl0T24gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGludGVudFN0YXRlIG9mIHRoaXMuX2ludGVudFN0YXRlcy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICBpbnRlbnRTdGF0ZSxcbiAgICAgICAgcmVhc29uOiBuZXcgRXJyb3IoXCJQYWdlIHdhcyBkZXN0cm95ZWQuXCIpLFxuICAgICAgICBmb3JjZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBpZiAoaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGludGVybmFsUmVuZGVyVGFzayBvZiBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykge1xuICAgICAgICB3YWl0T24ucHVzaChpbnRlcm5hbFJlbmRlclRhc2suY29tcGxldGVkKTtcbiAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhbmNlbCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9ianMuY2xlYXIoKTtcbiAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuICAgIHRoaXMuI2Fib3J0RGVsYXllZENsZWFudXAoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdE9uKTtcbiAgfVxuICBjbGVhbnVwKHJlc2V0U3RhdHMgPSBmYWxzZSkge1xuICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gdHJ1ZTtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy4jdHJ5Q2xlYW51cChmYWxzZSk7XG4gICAgaWYgKHJlc2V0U3RhdHMgJiYgc3VjY2Vzcykge1xuICAgICAgdGhpcy5fc3RhdHMgJiY9IG5ldyBTdGF0VGltZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cbiAgI3RyeUNsZWFudXAoZGVsYXllZCA9IGZhbHNlKSB7XG4gICAgdGhpcy4jYWJvcnREZWxheWVkQ2xlYW51cCgpO1xuICAgIGlmICghdGhpcy4jcGVuZGluZ0NsZWFudXAgfHwgdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRlbGF5ZWQpIHtcbiAgICAgIHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQgPSBudWxsO1xuICAgICAgICB0aGlzLiN0cnlDbGVhbnVwKGZhbHNlKTtcbiAgICAgIH0sIERFTEFZRURfQ0xFQU5VUF9USU1FT1VUKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7XG4gICAgICByZW5kZXJUYXNrcyxcbiAgICAgIG9wZXJhdG9yTGlzdFxuICAgIH0gb2YgdGhpcy5faW50ZW50U3RhdGVzLnZhbHVlcygpKSB7XG4gICAgICBpZiAocmVuZGVyVGFza3Muc2l6ZSA+IDAgfHwgIW9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuY2xlYXIoKTtcbiAgICB0aGlzLm9ianMuY2xlYXIoKTtcbiAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gICNhYm9ydERlbGF5ZWRDbGVhbnVwKCkge1xuICAgIGlmICh0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQpO1xuICAgICAgdGhpcy4jZGVsYXllZENsZWFudXBUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgX3N0YXJ0UmVuZGVyUGFnZSh0cmFuc3BhcmVuY3ksIGNhY2hlS2V5KSB7XG4gICAgY29uc3QgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoIWludGVudFN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3N0YXRzPy50aW1lRW5kKFwiUGFnZSBSZXF1ZXN0XCIpO1xuICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHk/LnJlc29sdmUodHJhbnNwYXJlbmN5KTtcbiAgfVxuICBfcmVuZGVyUGFnZUNodW5rKG9wZXJhdG9yTGlzdENodW5rLCBpbnRlbnRTdGF0ZSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wZXJhdG9yTGlzdENodW5rLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5mbkFycmF5LnB1c2gob3BlcmF0b3JMaXN0Q2h1bmsuZm5BcnJheVtpXSk7XG4gICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QuYXJnc0FycmF5LnB1c2gob3BlcmF0b3JMaXN0Q2h1bmsuYXJnc0FycmF5W2ldKTtcbiAgICB9XG4gICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuayA9IG9wZXJhdG9yTGlzdENodW5rLmxhc3RDaHVuaztcbiAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3Quc2VwYXJhdGVBbm5vdHMgPSBvcGVyYXRvckxpc3RDaHVuay5zZXBhcmF0ZUFubm90cztcbiAgICBmb3IgKGNvbnN0IGludGVybmFsUmVuZGVyVGFzayBvZiBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykge1xuICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICB9XG4gICAgaWYgKG9wZXJhdG9yTGlzdENodW5rLmxhc3RDaHVuaykge1xuICAgICAgdGhpcy4jdHJ5Q2xlYW51cCh0cnVlKTtcbiAgICB9XG4gIH1cbiAgX3B1bXBPcGVyYXRvckxpc3Qoe1xuICAgIHJlbmRlcmluZ0ludGVudCxcbiAgICBjYWNoZUtleSxcbiAgICBhbm5vdGF0aW9uU3RvcmFnZVNlcmlhbGl6YWJsZVxuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbWFwLFxuICAgICAgdHJhbnNmZXJcbiAgICB9ID0gYW5ub3RhdGlvblN0b3JhZ2VTZXJpYWxpemFibGU7XG4gICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXCJHZXRPcGVyYXRvckxpc3RcIiwge1xuICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICBpbnRlbnQ6IHJlbmRlcmluZ0ludGVudCxcbiAgICAgIGNhY2hlS2V5LFxuICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IG1hcFxuICAgIH0sIHRyYW5zZmVyKTtcbiAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICBjb25zdCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoY2FjaGVLZXkpO1xuICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IHJlYWRlcjtcbiAgICBjb25zdCBwdW1wID0gKCkgPT4ge1xuICAgICAgcmVhZGVyLnJlYWQoKS50aGVuKCh7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBkb25lXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVuZGVyUGFnZUNodW5rKHZhbHVlLCBpbnRlbnRTdGF0ZSk7XG4gICAgICAgIHB1bXAoKTtcbiAgICAgIH0sIHJlYXNvbiA9PiB7XG4gICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QpIHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rID0gdHJ1ZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGludGVybmFsUmVuZGVyVGFzayBvZiBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykge1xuICAgICAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy4jdHJ5Q2xlYW51cCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSkge1xuICAgICAgICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgcHVtcCgpO1xuICB9XG4gIF9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgaW50ZW50U3RhdGUsXG4gICAgcmVhc29uLFxuICAgIGZvcmNlID0gZmFsc2VcbiAgfSkge1xuICAgIGlmICghaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCk7XG4gICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFmb3JjZSkge1xuICAgICAgaWYgKGludGVudFN0YXRlLnJlbmRlclRhc2tzLnNpemUgPiAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pIHtcbiAgICAgICAgbGV0IGRlbGF5ID0gUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUO1xuICAgICAgICBpZiAocmVhc29uLmV4dHJhRGVsYXkgPiAwICYmIHJlYXNvbi5leHRyYURlbGF5IDwgMTAwMCkge1xuICAgICAgICAgIGRlbGF5ICs9IHJlYXNvbi5leHRyYURlbGF5O1xuICAgICAgICB9XG4gICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgICBpbnRlbnRTdGF0ZSxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgIGZvcmNlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIuY2FuY2VsKG5ldyBBYm9ydEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSkpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsO1xuICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2N1ckNhY2hlS2V5LCBjdXJJbnRlbnRTdGF0ZV0gb2YgdGhpcy5faW50ZW50U3RhdGVzKSB7XG4gICAgICBpZiAoY3VySW50ZW50U3RhdGUgPT09IGludGVudFN0YXRlKSB7XG4gICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5kZWxldGUoY3VyQ2FjaGVLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cbiAgZ2V0IHN0YXRzKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0cztcbiAgfVxufVxuY2xhc3MgTG9vcGJhY2tQb3J0IHtcbiAgI2xpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgI2RlZmVycmVkID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHBvc3RNZXNzYWdlKG9iaiwgdHJhbnNmZXIpIHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGRhdGE6IHN0cnVjdHVyZWRDbG9uZShvYmosIHRyYW5zZmVyID8ge1xuICAgICAgICB0cmFuc2ZlclxuICAgICAgfSA6IG51bGwpXG4gICAgfTtcbiAgICB0aGlzLiNkZWZlcnJlZC50aGVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy4jbGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLiNsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgfVxuICByZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy4jbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH1cbiAgdGVybWluYXRlKCkge1xuICAgIHRoaXMuI2xpc3RlbmVycy5jbGVhcigpO1xuICB9XG59XG5jb25zdCBQREZXb3JrZXJVdGlsID0ge1xuICBpc1dvcmtlckRpc2FibGVkOiBmYWxzZSxcbiAgZmFrZVdvcmtlcklkOiAwXG59O1xue1xuICBpZiAoaXNOb2RlSlMpIHtcbiAgICBQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgPSB0cnVlO1xuICAgIEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjIHx8PSBcIi4vcGRmLndvcmtlci5tanNcIjtcbiAgfVxuICBQREZXb3JrZXJVdGlsLmlzU2FtZU9yaWdpbiA9IGZ1bmN0aW9uIChiYXNlVXJsLCBvdGhlclVybCkge1xuICAgIGxldCBiYXNlO1xuICAgIHRyeSB7XG4gICAgICBiYXNlID0gbmV3IFVSTChiYXNlVXJsKTtcbiAgICAgIGlmICghYmFzZS5vcmlnaW4gfHwgYmFzZS5vcmlnaW4gPT09IFwibnVsbFwiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgb3RoZXIgPSBuZXcgVVJMKG90aGVyVXJsLCBiYXNlKTtcbiAgICByZXR1cm4gYmFzZS5vcmlnaW4gPT09IG90aGVyLm9yaWdpbjtcbiAgfTtcbiAgUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyID0gZnVuY3Rpb24gKHVybCkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBgYXdhaXQgaW1wb3J0KFwiJHt1cmx9XCIpO2A7XG4gICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3dyYXBwZXJdLCB7XG4gICAgICB0eXBlOiBcInRleHQvamF2YXNjcmlwdFwiXG4gICAgfSkpO1xuICB9O1xufVxuY2xhc3MgUERGV29ya2VyIHtcbiAgc3RhdGljICN3b3JrZXJQb3J0cztcbiAgY29uc3RydWN0b3Ioe1xuICAgIG5hbWUgPSBudWxsLFxuICAgIHBvcnQgPSBudWxsLFxuICAgIHZlcmJvc2l0eSA9IGdldFZlcmJvc2l0eUxldmVsKClcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMudmVyYm9zaXR5ID0gdmVyYm9zaXR5O1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuX3BvcnQgPSBudWxsO1xuICAgIHRoaXMuX3dlYldvcmtlciA9IG51bGw7XG4gICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuICAgIGlmIChwb3J0KSB7XG4gICAgICBpZiAoUERGV29ya2VyLiN3b3JrZXJQb3J0cz8uaGFzKHBvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgbW9yZSB0aGFuIG9uZSBQREZXb3JrZXIgcGVyIHBvcnQuXCIpO1xuICAgICAgfVxuICAgICAgKFBERldvcmtlci4jd29ya2VyUG9ydHMgfHw9IG5ldyBXZWFrTWFwKCkpLnNldChwb3J0LCB0aGlzKTtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVGcm9tUG9ydChwb3J0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZSgpO1xuICB9XG4gIGdldCBwcm9taXNlKCkge1xuICAgIGlmIChpc05vZGVKUykge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtOb2RlUGFja2FnZXMucHJvbWlzZSwgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2VdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gICNyZXNvbHZlKCkge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIuc2VuZChcImNvbmZpZ3VyZVwiLCB7XG4gICAgICB2ZXJib3NpdHk6IHRoaXMudmVyYm9zaXR5XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcnQ7XG4gIH1cbiAgZ2V0IG1lc3NhZ2VIYW5kbGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlSGFuZGxlcjtcbiAgfVxuICBfaW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpIHtcbiAgICB0aGlzLl9wb3J0ID0gcG9ydDtcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihcIm1haW5cIiwgXCJ3b3JrZXJcIiwgcG9ydCk7XG4gICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIub24oXCJyZWFkeVwiLCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgdGhpcy4jcmVzb2x2ZSgpO1xuICB9XG4gIF9pbml0aWFsaXplKCkge1xuICAgIGlmIChQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgfHwgUERGV29ya2VyLiNtYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQge1xuICAgICAgd29ya2VyU3JjXG4gICAgfSA9IFBERldvcmtlcjtcbiAgICB0cnkge1xuICAgICAgaWYgKCFQREZXb3JrZXJVdGlsLmlzU2FtZU9yaWdpbih3aW5kb3cubG9jYXRpb24uaHJlZiwgd29ya2VyU3JjKSkge1xuICAgICAgICB3b3JrZXJTcmMgPSBQREZXb3JrZXJVdGlsLmNyZWF0ZUNETldyYXBwZXIobmV3IFVSTCh3b3JrZXJTcmMsIHdpbmRvdy5sb2NhdGlvbikuaHJlZik7XG4gICAgICB9XG4gICAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclNyYywge1xuICAgICAgICB0eXBlOiBcIm1vZHVsZVwiXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKFwibWFpblwiLCBcIndvcmtlclwiLCB3b3JrZXIpO1xuICAgICAgY29uc3QgdGVybWluYXRlRWFybHkgPSAoKSA9PiB7XG4gICAgICAgIGFjLmFib3J0KCk7XG4gICAgICAgIG1lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGFjID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fd2ViV29ya2VyKSB7XG4gICAgICAgICAgdGVybWluYXRlRWFybHkoKTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBzaWduYWw6IGFjLnNpZ25hbFxuICAgICAgfSk7XG4gICAgICBtZXNzYWdlSGFuZGxlci5vbihcInRlc3RcIiwgZGF0YSA9PiB7XG4gICAgICAgIGFjLmFib3J0KCk7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCB8fCAhZGF0YSkge1xuICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7XG4gICAgICAgIHRoaXMuX3BvcnQgPSB3b3JrZXI7XG4gICAgICAgIHRoaXMuX3dlYldvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICBtZXNzYWdlSGFuZGxlci5vbihcInJlYWR5XCIsIGRhdGEgPT4ge1xuICAgICAgICBhYy5hYm9ydCgpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHNlbmRUZXN0KCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNlbmRUZXN0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXN0T2JqID0gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcInRlc3RcIiwgdGVzdE9iaiwgW3Rlc3RPYmouYnVmZmVyXSk7XG4gICAgICB9O1xuICAgICAgc2VuZFRlc3QoKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGluZm8oXCJUaGUgd29ya2VyIGhhcyBiZWVuIGRpc2FibGVkLlwiKTtcbiAgICB9XG4gICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gIH1cbiAgX3NldHVwRmFrZVdvcmtlcigpIHtcbiAgICBpZiAoIVBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCkge1xuICAgICAgd2FybihcIlNldHRpbmcgdXAgZmFrZSB3b3JrZXIuXCIpO1xuICAgICAgUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgUERGV29ya2VyLl9zZXR1cEZha2VXb3JrZXJHbG9iYWwudGhlbihXb3JrZXJNZXNzYWdlSGFuZGxlciA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBvcnQgPSBuZXcgTG9vcGJhY2tQb3J0KCk7XG4gICAgICB0aGlzLl9wb3J0ID0gcG9ydDtcbiAgICAgIGNvbnN0IGlkID0gYGZha2Uke1BERldvcmtlclV0aWwuZmFrZVdvcmtlcklkKyt9YDtcbiAgICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoaWQgKyBcIl93b3JrZXJcIiwgaWQsIHBvcnQpO1xuICAgICAgV29ya2VyTWVzc2FnZUhhbmRsZXIuc2V0dXAod29ya2VySGFuZGxlciwgcG9ydCk7XG4gICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihpZCwgaWQgKyBcIl93b3JrZXJcIiwgcG9ydCk7XG4gICAgICB0aGlzLiNyZXNvbHZlKCk7XG4gICAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKGBTZXR0aW5nIHVwIGZha2Ugd29ya2VyIGZhaWxlZDogXCIke3JlYXNvbi5tZXNzYWdlfVwiLmApKTtcbiAgICB9KTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fd2ViV29ya2VyKSB7XG4gICAgICB0aGlzLl93ZWJXb3JrZXIudGVybWluYXRlKCk7XG4gICAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsO1xuICAgIH1cbiAgICBQREZXb3JrZXIuI3dvcmtlclBvcnRzPy5kZWxldGUodGhpcy5fcG9ydCk7XG4gICAgdGhpcy5fcG9ydCA9IG51bGw7XG4gICAgaWYgKHRoaXMuX21lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBmcm9tUG9ydChwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcz8ucG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUERGV29ya2VyLmZyb21Qb3J0IC0gaW52YWxpZCBtZXRob2Qgc2lnbmF0dXJlLlwiKTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGVkUG9ydCA9IHRoaXMuI3dvcmtlclBvcnRzPy5nZXQocGFyYW1zLnBvcnQpO1xuICAgIGlmIChjYWNoZWRQb3J0KSB7XG4gICAgICBpZiAoY2FjaGVkUG9ydC5fcGVuZGluZ0Rlc3Ryb3kpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUERGV29ya2VyLmZyb21Qb3J0IC0gdGhlIHdvcmtlciBpcyBiZWluZyBkZXN0cm95ZWQuXFxuXCIgKyBcIlBsZWFzZSByZW1lbWJlciB0byBhd2FpdCBgUERGRG9jdW1lbnRMb2FkaW5nVGFzay5kZXN0cm95KClgLWNhbGxzLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYWNoZWRQb3J0O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFBERldvcmtlcihwYXJhbXMpO1xuICB9XG4gIHN0YXRpYyBnZXQgd29ya2VyU3JjKCkge1xuICAgIGlmIChHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYykge1xuICAgICAgcmV0dXJuIEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFwiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmNcIiBzcGVjaWZpZWQuJyk7XG4gIH1cbiAgc3RhdGljIGdldCAjbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZ2xvYmFsVGhpcy5wZGZqc1dvcmtlcj8uV29ya2VyTWVzc2FnZUhhbmRsZXIgfHwgbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IF9zZXR1cEZha2VXb3JrZXJHbG9iYWwoKSB7XG4gICAgY29uc3QgbG9hZGVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyO1xuICAgICAgfVxuICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgaW1wb3J0KCAvKndlYnBhY2tJZ25vcmU6IHRydWUqL3RoaXMud29ya2VyU3JjKTtcbiAgICAgIHJldHVybiB3b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgfTtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX3NldHVwRmFrZVdvcmtlckdsb2JhbFwiLCBsb2FkZXIoKSk7XG4gIH1cbn1cbmNsYXNzIFdvcmtlclRyYW5zcG9ydCB7XG4gICNtZXRob2RQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgI3BhZ2VDYWNoZSA9IG5ldyBNYXAoKTtcbiAgI3BhZ2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgI3BhZ2VSZWZDYWNoZSA9IG5ldyBNYXAoKTtcbiAgI3Bhc3N3b3JkQ2FwYWJpbGl0eSA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2VIYW5kbGVyLCBsb2FkaW5nVGFzaywgbmV0d29ya1N0cmVhbSwgcGFyYW1zLCBmYWN0b3J5KSB7XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyO1xuICAgIHRoaXMubG9hZGluZ1Rhc2sgPSBsb2FkaW5nVGFzaztcbiAgICB0aGlzLmNvbW1vbk9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuICAgIHRoaXMuZm9udExvYWRlciA9IG5ldyBGb250TG9hZGVyKHtcbiAgICAgIG93bmVyRG9jdW1lbnQ6IHBhcmFtcy5vd25lckRvY3VtZW50LFxuICAgICAgc3R5bGVFbGVtZW50OiBwYXJhbXMuc3R5bGVFbGVtZW50XG4gICAgfSk7XG4gICAgdGhpcy5sb2FkaW5nUGFyYW1zID0gcGFyYW1zLmxvYWRpbmdQYXJhbXM7XG4gICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGZhY3RvcnkuY2FudmFzRmFjdG9yeTtcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSBmYWN0b3J5LmZpbHRlckZhY3Rvcnk7XG4gICAgdGhpcy5jTWFwUmVhZGVyRmFjdG9yeSA9IGZhY3RvcnkuY01hcFJlYWRlckZhY3Rvcnk7XG4gICAgdGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IGZhY3Rvcnkuc3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5ID0gbnVsbDtcbiAgICB0aGlzLl9uZXR3b3JrU3RyZWFtID0gbmV0d29ya1N0cmVhbTtcbiAgICB0aGlzLl9mdWxsUmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSBudWxsO1xuICAgIHRoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcigpO1xuICB9XG4gICNjYWNoZVNpbXBsZU1ldGhvZChuYW1lLCBkYXRhID0gbnVsbCkge1xuICAgIGNvbnN0IGNhY2hlZFByb21pc2UgPSB0aGlzLiNtZXRob2RQcm9taXNlcy5nZXQobmFtZSk7XG4gICAgaWYgKGNhY2hlZFByb21pc2UpIHtcbiAgICAgIHJldHVybiBjYWNoZWRQcm9taXNlO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UobmFtZSwgZGF0YSk7XG4gICAgdGhpcy4jbWV0aG9kUHJvbWlzZXMuc2V0KG5hbWUsIHByb21pc2UpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG4gIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiYW5ub3RhdGlvblN0b3JhZ2VcIiwgbmV3IEFubm90YXRpb25TdG9yYWdlKCkpO1xuICB9XG4gIGdldFJlbmRlcmluZ0ludGVudChpbnRlbnQsIGFubm90YXRpb25Nb2RlID0gQW5ub3RhdGlvbk1vZGUuRU5BQkxFLCBwcmludEFubm90YXRpb25TdG9yYWdlID0gbnVsbCwgaXNPcExpc3QgPSBmYWxzZSkge1xuICAgIGxldCByZW5kZXJpbmdJbnRlbnQgPSBSZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVk7XG4gICAgbGV0IGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlID0gU2VyaWFsaXphYmxlRW1wdHk7XG4gICAgc3dpdGNoIChpbnRlbnQpIHtcbiAgICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ID0gUmVuZGVyaW5nSW50ZW50RmxhZy5BTlk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRpc3BsYXlcIjpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicHJpbnRcIjpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ID0gUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB3YXJuKGBnZXRSZW5kZXJpbmdJbnRlbnQgLSBpbnZhbGlkIGludGVudDogJHtpbnRlbnR9YCk7XG4gICAgfVxuICAgIHN3aXRjaCAoYW5ub3RhdGlvbk1vZGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbk1vZGUuRElTQUJMRTpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRElTQUJMRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25Nb2RlLkVOQUJMRTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25Nb2RlLkVOQUJMRV9GT1JNUzpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRk9STVM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uTW9kZS5FTkFCTEVfU1RPUkFHRTpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfU1RPUkFHRTtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSByZW5kZXJpbmdJbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UICYmIHByaW50QW5ub3RhdGlvblN0b3JhZ2UgaW5zdGFuY2VvZiBQcmludEFubm90YXRpb25TdG9yYWdlID8gcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA6IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlID0gYW5ub3RhdGlvblN0b3JhZ2Uuc2VyaWFsaXphYmxlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHdhcm4oYGdldFJlbmRlcmluZ0ludGVudCAtIGludmFsaWQgYW5ub3RhdGlvbk1vZGU6ICR7YW5ub3RhdGlvbk1vZGV9YCk7XG4gICAgfVxuICAgIGlmIChpc09wTGlzdCkge1xuICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IFJlbmRlcmluZ0ludGVudEZsYWcuT1BMSVNUO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVuZGVyaW5nSW50ZW50LFxuICAgICAgY2FjaGVLZXk6IGAke3JlbmRlcmluZ0ludGVudH1fJHthbm5vdGF0aW9uU3RvcmFnZVNlcmlhbGl6YWJsZS5oYXNofWAsXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZVNlcmlhbGl6YWJsZVxuICAgIH07XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5kZXN0cm95Q2FwYWJpbGl0eSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHk/LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZCBkdXJpbmcgb25QYXNzd29yZCBjYWxsYmFja1wiKSk7XG4gICAgY29uc3Qgd2FpdE9uID0gW107XG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMuI3BhZ2VDYWNoZS52YWx1ZXMoKSkge1xuICAgICAgd2FpdE9uLnB1c2gocGFnZS5fZGVzdHJveSgpKTtcbiAgICB9XG4gICAgdGhpcy4jcGFnZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy4jcGFnZVByb21pc2VzLmNsZWFyKCk7XG4gICAgdGhpcy4jcGFnZVJlZkNhY2hlLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoXCJhbm5vdGF0aW9uU3RvcmFnZVwiKSkge1xuICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5yZXNldE1vZGlmaWVkKCk7XG4gICAgfVxuICAgIGNvbnN0IHRlcm1pbmF0ZWQgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIlRlcm1pbmF0ZVwiLCBudWxsKTtcbiAgICB3YWl0T24ucHVzaCh0ZXJtaW5hdGVkKTtcbiAgICBQcm9taXNlLmFsbCh3YWl0T24pLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5jb21tb25PYmpzLmNsZWFyKCk7XG4gICAgICB0aGlzLmZvbnRMb2FkZXIuY2xlYXIoKTtcbiAgICAgIHRoaXMuI21ldGhvZFByb21pc2VzLmNsZWFyKCk7XG4gICAgICB0aGlzLmZpbHRlckZhY3RvcnkuZGVzdHJveSgpO1xuICAgICAgVGV4dExheWVyLmNsZWFudXAoKTtcbiAgICAgIHRoaXMuX25ldHdvcmtTdHJlYW0/LmNhbmNlbEFsbFJlcXVlc3RzKG5ldyBBYm9ydEV4Y2VwdGlvbihcIldvcmtlciB3YXMgdGVybWluYXRlZC5cIikpO1xuICAgICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSwgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5yZWplY3QpO1xuICAgIHJldHVybiB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgc2V0dXBNZXNzYWdlSGFuZGxlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBtZXNzYWdlSGFuZGxlcixcbiAgICAgIGxvYWRpbmdUYXNrXG4gICAgfSA9IHRoaXM7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJHZXRSZWFkZXJcIiwgKGRhdGEsIHNpbmspID0+IHtcbiAgICAgIGFzc2VydCh0aGlzLl9uZXR3b3JrU3RyZWFtLCBcIkdldFJlYWRlciAtIG5vIGBJUERGU3RyZWFtYCBpbnN0YW5jZSBhdmFpbGFibGUuXCIpO1xuICAgICAgdGhpcy5fZnVsbFJlYWRlciA9IHRoaXMuX25ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlcigpO1xuICAgICAgdGhpcy5fZnVsbFJlYWRlci5vblByb2dyZXNzID0gZXZ0ID0+IHtcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzID0ge1xuICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcbiAgICAgICAgICB0b3RhbDogZXZ0LnRvdGFsXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgc2luay5vblB1bGwgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Z1bGxSZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBkb25lXG4gICAgICAgIH0pIHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgc2luay5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NlcnQodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciwgXCJHZXRSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci5cIik7XG4gICAgICAgICAgc2luay5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHZhbHVlKSwgMSwgW3ZhbHVlXSk7XG4gICAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgICAgc2luay5lcnJvcihyZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBzaW5rLm9uQ2FuY2VsID0gcmVhc29uID0+IHtcbiAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICAgICAgc2luay5yZWFkeS5jYXRjaChyZWFkeVJlYXNvbiA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHJlYWR5UmVhc29uO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJSZWFkZXJIZWFkZXJzUmVhZHlcIiwgZGF0YSA9PiB7XG4gICAgICBjb25zdCBoZWFkZXJzQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgY29uc3QgZnVsbFJlYWRlciA9IHRoaXMuX2Z1bGxSZWFkZXI7XG4gICAgICBmdWxsUmVhZGVyLmhlYWRlcnNSZWFkeS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKCFmdWxsUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkIHx8ICFmdWxsUmVhZGVyLmlzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgICAgICBpZiAodGhpcy5fbGFzdFByb2dyZXNzKSB7XG4gICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzPy4odGhpcy5fbGFzdFByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVsbFJlYWRlci5vblByb2dyZXNzID0gZXZ0ID0+IHtcbiAgICAgICAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcbiAgICAgICAgICAgICAgdG90YWw6IGV2dC50b3RhbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBoZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1N1cHBvcnRlZDogZnVsbFJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCxcbiAgICAgICAgICBpc1JhbmdlU3VwcG9ydGVkOiBmdWxsUmVhZGVyLmlzUmFuZ2VTdXBwb3J0ZWQsXG4gICAgICAgICAgY29udGVudExlbmd0aDogZnVsbFJlYWRlci5jb250ZW50TGVuZ3RoXG4gICAgICAgIH0pO1xuICAgICAgfSwgaGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgIHJldHVybiBoZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiR2V0UmFuZ2VSZWFkZXJcIiwgKGRhdGEsIHNpbmspID0+IHtcbiAgICAgIGFzc2VydCh0aGlzLl9uZXR3b3JrU3RyZWFtLCBcIkdldFJhbmdlUmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIik7XG4gICAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMuX25ldHdvcmtTdHJlYW0uZ2V0UmFuZ2VSZWFkZXIoZGF0YS5iZWdpbiwgZGF0YS5lbmQpO1xuICAgICAgaWYgKCFyYW5nZVJlYWRlcikge1xuICAgICAgICBzaW5rLmNsb3NlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNpbmsub25QdWxsID0gKCkgPT4ge1xuICAgICAgICByYW5nZVJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoe1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGRvbmVcbiAgICAgICAgfSkge1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBzaW5rLmNsb3NlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2VydCh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyLCBcIkdldFJhbmdlUmVhZGVyIC0gZXhwZWN0ZWQgYW4gQXJyYXlCdWZmZXIuXCIpO1xuICAgICAgICAgIHNpbmsuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSksIDEsIFt2YWx1ZV0pO1xuICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgc2luay5vbkNhbmNlbCA9IHJlYXNvbiA9PiB7XG4gICAgICAgIHJhbmdlUmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgICAgICBzaW5rLnJlYWR5LmNhdGNoKHJlYWR5UmVhc29uID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVhZHlSZWFzb247XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkdldERvY1wiLCAoe1xuICAgICAgcGRmSW5mb1xuICAgIH0pID0+IHtcbiAgICAgIHRoaXMuX251bVBhZ2VzID0gcGRmSW5mby5udW1QYWdlcztcbiAgICAgIHRoaXMuX2h0bWxGb3JYZmEgPSBwZGZJbmZvLmh0bWxGb3JYZmE7XG4gICAgICBkZWxldGUgcGRmSW5mby5odG1sRm9yWGZhO1xuICAgICAgbG9hZGluZ1Rhc2suX2NhcGFiaWxpdHkucmVzb2x2ZShuZXcgUERGRG9jdW1lbnRQcm94eShwZGZJbmZvLCB0aGlzKSk7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJEb2NFeGNlcHRpb25cIiwgZnVuY3Rpb24gKGV4KSB7XG4gICAgICBsZXQgcmVhc29uO1xuICAgICAgc3dpdGNoIChleC5uYW1lKSB7XG4gICAgICAgIGNhc2UgXCJQYXNzd29yZEV4Y2VwdGlvblwiOlxuICAgICAgICAgIHJlYXNvbiA9IG5ldyBQYXNzd29yZEV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5jb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkludmFsaWRQREZFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgSW52YWxpZFBERkV4Y2VwdGlvbihleC5tZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk1pc3NpbmdQREZFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgTWlzc2luZ1BERkV4Y2VwdGlvbihleC5tZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiOlxuICAgICAgICAgIHJlYXNvbiA9IG5ldyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguc3RhdHVzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlVua25vd25FcnJvckV4Y2VwdGlvblwiOlxuICAgICAgICAgIHJlYXNvbiA9IG5ldyBVbmtub3duRXJyb3JFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguZGV0YWlscyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdW5yZWFjaGFibGUoXCJEb2NFeGNlcHRpb24gLSBleHBlY3RlZCBhIHZhbGlkIEVycm9yLlwiKTtcbiAgICAgIH1cbiAgICAgIGxvYWRpbmdUYXNrLl9jYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiUGFzc3dvcmRSZXF1ZXN0XCIsIGV4Y2VwdGlvbiA9PiB7XG4gICAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgIGlmIChsb2FkaW5nVGFzay5vblBhc3N3b3JkKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVBhc3N3b3JkID0gcGFzc3dvcmQgPT4ge1xuICAgICAgICAgIGlmIChwYXNzd29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KHBhc3N3b3JkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICAgICAgICBwYXNzd29yZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvYWRpbmdUYXNrLm9uUGFzc3dvcmQodXBkYXRlUGFzc3dvcmQsIGV4Y2VwdGlvbi5jb2RlKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KGV4KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChuZXcgUGFzc3dvcmRFeGNlcHRpb24oZXhjZXB0aW9uLm1lc3NhZ2UsIGV4Y2VwdGlvbi5jb2RlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJEYXRhTG9hZGVkXCIsIGRhdGEgPT4ge1xuICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcz8uKHtcbiAgICAgICAgbG9hZGVkOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgdG90YWw6IGRhdGEubGVuZ3RoXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEpO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiU3RhcnRSZW5kZXJQYWdlXCIsIGRhdGEgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLiNwYWdlQ2FjaGUuZ2V0KGRhdGEucGFnZUluZGV4KTtcbiAgICAgIHBhZ2UuX3N0YXJ0UmVuZGVyUGFnZShkYXRhLnRyYW5zcGFyZW5jeSwgZGF0YS5jYWNoZUtleSk7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJjb21tb25vYmpcIiwgKFtpZCwgdHlwZSwgZXhwb3J0ZWREYXRhXSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29tbW9uT2Jqcy5oYXMoaWQpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJGb250XCI6XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZGlzYWJsZUZvbnRGYWNlLFxuICAgICAgICAgICAgZm9udEV4dHJhUHJvcGVydGllcyxcbiAgICAgICAgICAgIHBkZkJ1Z1xuICAgICAgICAgIH0gPSB0aGlzLl9wYXJhbXM7XG4gICAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiBleHBvcnRlZERhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cG9ydGVkRXJyb3IgPSBleHBvcnRlZERhdGEuZXJyb3I7XG4gICAgICAgICAgICB3YXJuKGBFcnJvciBkdXJpbmcgZm9udCBsb2FkaW5nOiAke2V4cG9ydGVkRXJyb3J9YCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZXhwb3J0ZWRFcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW5zcGVjdEZvbnQgPSBwZGZCdWcgJiYgZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yPy5lbmFibGVkID8gKGZvbnQsIHVybCkgPT4gZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmZvbnRBZGRlZChmb250LCB1cmwpIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBmb250ID0gbmV3IEZvbnRGYWNlT2JqZWN0KGV4cG9ydGVkRGF0YSwge1xuICAgICAgICAgICAgZGlzYWJsZUZvbnRGYWNlLFxuICAgICAgICAgICAgaW5zcGVjdEZvbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmZvbnRMb2FkZXIuYmluZChmb250KS5jYXRjaCgoKSA9PiBtZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJGb250RmFsbGJhY2tcIiwge1xuICAgICAgICAgICAgaWRcbiAgICAgICAgICB9KSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZvbnRFeHRyYVByb3BlcnRpZXMgJiYgZm9udC5kYXRhKSB7XG4gICAgICAgICAgICAgIGZvbnQuZGF0YSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZm9udCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJDb3B5TG9jYWxJbWFnZVwiOlxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGltYWdlUmVmXG4gICAgICAgICAgfSA9IGV4cG9ydGVkRGF0YTtcbiAgICAgICAgICBhc3NlcnQoaW1hZ2VSZWYsIFwiVGhlIGltYWdlUmVmIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgICAgZm9yIChjb25zdCBwYWdlUHJveHkgb2YgdGhpcy4jcGFnZUNhY2hlLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFssIGRhdGFdIG9mIHBhZ2VQcm94eS5vYmpzKSB7XG4gICAgICAgICAgICAgIGlmIChkYXRhPy5yZWYgIT09IGltYWdlUmVmKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFkYXRhLmRhdGFMZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgc3RydWN0dXJlZENsb25lKGRhdGEpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YUxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJGb250UGF0aFwiOlxuICAgICAgICBjYXNlIFwiSW1hZ2VcIjpcbiAgICAgICAgY2FzZSBcIlBhdHRlcm5cIjpcbiAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZXhwb3J0ZWREYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCB1bmtub3duIGNvbW1vbiBvYmplY3QgdHlwZSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIm9ialwiLCAoW2lkLCBwYWdlSW5kZXgsIHR5cGUsIGltYWdlRGF0YV0pID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwYWdlUHJveHkgPSB0aGlzLiNwYWdlQ2FjaGUuZ2V0KHBhZ2VJbmRleCk7XG4gICAgICBpZiAocGFnZVByb3h5Lm9ianMuaGFzKGlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocGFnZVByb3h5Ll9pbnRlbnRTdGF0ZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICBpbWFnZURhdGE/LmJpdG1hcD8uY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJJbWFnZVwiOlxuICAgICAgICAgIHBhZ2VQcm94eS5vYmpzLnJlc29sdmUoaWQsIGltYWdlRGF0YSk7XG4gICAgICAgICAgaWYgKGltYWdlRGF0YT8uZGF0YUxlbiA+IE1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFKSB7XG4gICAgICAgICAgICBwYWdlUHJveHkuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG4gICAgICAgICAgcGFnZVByb3h5Lm9ianMucmVzb2x2ZShpZCwgaW1hZ2VEYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCB1bmtub3duIG9iamVjdCB0eXBlICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkRvY1Byb2dyZXNzXCIsIGRhdGEgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIGxvYWRlZDogZGF0YS5sb2FkZWQsXG4gICAgICAgIHRvdGFsOiBkYXRhLnRvdGFsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkZldGNoQnVpbHRJbkNNYXBcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkLlwiKSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY01hcFJlYWRlckZhY3RvcnkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNNYXBSZWFkZXJGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci5cIikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY01hcFJlYWRlckZhY3RvcnkuZmV0Y2goZGF0YSk7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJGZXRjaFN0YW5kYXJkRm9udERhdGFcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkLlwiKSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlN0YW5kYXJkRm9udERhdGFGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci5cIikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkuZmV0Y2goZGF0YSk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREYXRhXCIsIG51bGwpO1xuICB9XG4gIHNhdmVEb2N1bWVudCgpIHtcbiAgICBpZiAodGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zaXplIDw9IDApIHtcbiAgICAgIHdhcm4oXCJzYXZlRG9jdW1lbnQgY2FsbGVkIHdoaWxlIGBhbm5vdGF0aW9uU3RvcmFnZWAgaXMgZW1wdHksIFwiICsgXCJwbGVhc2UgdXNlIHRoZSBnZXREYXRhLW1ldGhvZCBpbnN0ZWFkLlwiKTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgbWFwLFxuICAgICAgdHJhbnNmZXJcbiAgICB9ID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXJpYWxpemFibGU7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiU2F2ZURvY3VtZW50XCIsIHtcbiAgICAgIGlzUHVyZVhmYTogISF0aGlzLl9odG1sRm9yWGZhLFxuICAgICAgbnVtUGFnZXM6IHRoaXMuX251bVBhZ2VzLFxuICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IG1hcCxcbiAgICAgIGZpbGVuYW1lOiB0aGlzLl9mdWxsUmVhZGVyPy5maWxlbmFtZSA/PyBudWxsXG4gICAgfSwgdHJhbnNmZXIpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5yZXNldE1vZGlmaWVkKCk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0UGFnZShwYWdlTnVtYmVyKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhZ2VOdW1iZXIpIHx8IHBhZ2VOdW1iZXIgPD0gMCB8fCBwYWdlTnVtYmVyID4gdGhpcy5fbnVtUGFnZXMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZ2UgcmVxdWVzdC5cIikpO1xuICAgIH1cbiAgICBjb25zdCBwYWdlSW5kZXggPSBwYWdlTnVtYmVyIC0gMSxcbiAgICAgIGNhY2hlZFByb21pc2UgPSB0aGlzLiNwYWdlUHJvbWlzZXMuZ2V0KHBhZ2VJbmRleCk7XG4gICAgaWYgKGNhY2hlZFByb21pc2UpIHtcbiAgICAgIHJldHVybiBjYWNoZWRQcm9taXNlO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlXCIsIHtcbiAgICAgIHBhZ2VJbmRleFxuICAgIH0pLnRoZW4ocGFnZUluZm8gPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyYW5zcG9ydCBkZXN0cm95ZWRcIik7XG4gICAgICB9XG4gICAgICBpZiAocGFnZUluZm8ucmVmU3RyKSB7XG4gICAgICAgIHRoaXMuI3BhZ2VSZWZDYWNoZS5zZXQocGFnZUluZm8ucmVmU3RyLCBwYWdlTnVtYmVyKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2UgPSBuZXcgUERGUGFnZVByb3h5KHBhZ2VJbmRleCwgcGFnZUluZm8sIHRoaXMsIHRoaXMuX3BhcmFtcy5wZGZCdWcpO1xuICAgICAgdGhpcy4jcGFnZUNhY2hlLnNldChwYWdlSW5kZXgsIHBhZ2UpO1xuICAgICAgcmV0dXJuIHBhZ2U7XG4gICAgfSk7XG4gICAgdGhpcy4jcGFnZVByb21pc2VzLnNldChwYWdlSW5kZXgsIHByb21pc2UpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG4gIGdldFBhZ2VJbmRleChyZWYpIHtcbiAgICBpZiAoIWlzUmVmUHJveHkocmVmKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgcGFnZUluZGV4IHJlcXVlc3QuXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUluZGV4XCIsIHtcbiAgICAgIG51bTogcmVmLm51bSxcbiAgICAgIGdlbjogcmVmLmdlblxuICAgIH0pO1xuICB9XG4gIGdldEFubm90YXRpb25zKHBhZ2VJbmRleCwgaW50ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QW5ub3RhdGlvbnNcIiwge1xuICAgICAgcGFnZUluZGV4LFxuICAgICAgaW50ZW50XG4gICAgfSk7XG4gIH1cbiAgZ2V0RmllbGRPYmplY3RzKCkge1xuICAgIHJldHVybiB0aGlzLiNjYWNoZVNpbXBsZU1ldGhvZChcIkdldEZpZWxkT2JqZWN0c1wiKTtcbiAgfVxuICBoYXNKU0FjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlU2ltcGxlTWV0aG9kKFwiSGFzSlNBY3Rpb25zXCIpO1xuICB9XG4gIGdldENhbGN1bGF0aW9uT3JkZXJJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0Q2FsY3VsYXRpb25PcmRlcklkc1wiLCBudWxsKTtcbiAgfVxuICBnZXREZXN0aW5hdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RGVzdGluYXRpb25zXCIsIG51bGwpO1xuICB9XG4gIGdldERlc3RpbmF0aW9uKGlkKSB7XG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgZGVzdGluYXRpb24gcmVxdWVzdC5cIikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREZXN0aW5hdGlvblwiLCB7XG4gICAgICBpZFxuICAgIH0pO1xuICB9XG4gIGdldFBhZ2VMYWJlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUxhYmVsc1wiLCBudWxsKTtcbiAgfVxuICBnZXRQYWdlTGF5b3V0KCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VMYXlvdXRcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0UGFnZU1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZU1vZGVcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0Vmlld2VyUHJlZmVyZW5jZXNcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0T3BlbkFjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRPcGVuQWN0aW9uXCIsIG51bGwpO1xuICB9XG4gIGdldEF0dGFjaG1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldEF0dGFjaG1lbnRzXCIsIG51bGwpO1xuICB9XG4gIGdldERvY0pTQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy4jY2FjaGVTaW1wbGVNZXRob2QoXCJHZXREb2NKU0FjdGlvbnNcIik7XG4gIH1cbiAgZ2V0UGFnZUpTQWN0aW9ucyhwYWdlSW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlSlNBY3Rpb25zXCIsIHtcbiAgICAgIHBhZ2VJbmRleFxuICAgIH0pO1xuICB9XG4gIGdldFN0cnVjdFRyZWUocGFnZUluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0U3RydWN0VHJlZVwiLCB7XG4gICAgICBwYWdlSW5kZXhcbiAgICB9KTtcbiAgfVxuICBnZXRPdXRsaW5lKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE91dGxpbmVcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKHJlbmRlcmluZ0ludGVudCkge1xuICAgIHJldHVybiB0aGlzLiNjYWNoZVNpbXBsZU1ldGhvZChcIkdldE9wdGlvbmFsQ29udGVudENvbmZpZ1wiKS50aGVuKGRhdGEgPT4gbmV3IE9wdGlvbmFsQ29udGVudENvbmZpZyhkYXRhLCByZW5kZXJpbmdJbnRlbnQpKTtcbiAgfVxuICBnZXRQZXJtaXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQZXJtaXNzaW9uc1wiLCBudWxsKTtcbiAgfVxuICBnZXRNZXRhZGF0YSgpIHtcbiAgICBjb25zdCBuYW1lID0gXCJHZXRNZXRhZGF0YVwiLFxuICAgICAgY2FjaGVkUHJvbWlzZSA9IHRoaXMuI21ldGhvZFByb21pc2VzLmdldChuYW1lKTtcbiAgICBpZiAoY2FjaGVkUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGNhY2hlZFByb21pc2U7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShuYW1lLCBudWxsKS50aGVuKHJlc3VsdHMgPT4gKHtcbiAgICAgIGluZm86IHJlc3VsdHNbMF0sXG4gICAgICBtZXRhZGF0YTogcmVzdWx0c1sxXSA/IG5ldyBNZXRhZGF0YShyZXN1bHRzWzFdKSA6IG51bGwsXG4gICAgICBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTogdGhpcy5fZnVsbFJlYWRlcj8uZmlsZW5hbWUgPz8gbnVsbCxcbiAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2Z1bGxSZWFkZXI/LmNvbnRlbnRMZW5ndGggPz8gbnVsbFxuICAgIH0pKTtcbiAgICB0aGlzLiNtZXRob2RQcm9taXNlcy5zZXQobmFtZSwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cbiAgZ2V0TWFya0luZm8oKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0TWFya0luZm9cIiwgbnVsbCk7XG4gIH1cbiAgYXN5bmMgc3RhcnRDbGVhbnVwKGtlZXBMb2FkZWRGb250cyA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiQ2xlYW51cFwiLCBudWxsKTtcbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgdGhpcy4jcGFnZUNhY2hlLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBjbGVhbnVwU3VjY2Vzc2Z1bCA9IHBhZ2UuY2xlYW51cCgpO1xuICAgICAgaWYgKCFjbGVhbnVwU3VjY2Vzc2Z1bCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0YXJ0Q2xlYW51cDogUGFnZSAke3BhZ2UucGFnZU51bWJlcn0gaXMgY3VycmVudGx5IHJlbmRlcmluZy5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jb21tb25PYmpzLmNsZWFyKCk7XG4gICAgaWYgKCFrZWVwTG9hZGVkRm9udHMpIHtcbiAgICAgIHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuICAgIH1cbiAgICB0aGlzLiNtZXRob2RQcm9taXNlcy5jbGVhcigpO1xuICAgIHRoaXMuZmlsdGVyRmFjdG9yeS5kZXN0cm95KHRydWUpO1xuICAgIFRleHRMYXllci5jbGVhbnVwKCk7XG4gIH1cbiAgY2FjaGVkUGFnZU51bWJlcihyZWYpIHtcbiAgICBpZiAoIWlzUmVmUHJveHkocmVmKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlZlN0ciA9IHJlZi5nZW4gPT09IDAgPyBgJHtyZWYubnVtfVJgIDogYCR7cmVmLm51bX1SJHtyZWYuZ2VufWA7XG4gICAgcmV0dXJuIHRoaXMuI3BhZ2VSZWZDYWNoZS5nZXQocmVmU3RyKSA/PyBudWxsO1xuICB9XG59XG5jb25zdCBJTklUSUFMX0RBVEEgPSBTeW1ib2woXCJJTklUSUFMX0RBVEFcIik7XG5jbGFzcyBQREZPYmplY3RzIHtcbiAgI29ianMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAjZW5zdXJlT2JqKG9iaklkKSB7XG4gICAgcmV0dXJuIHRoaXMuI29ianNbb2JqSWRdIHx8PSB7XG4gICAgICAuLi5Qcm9taXNlLndpdGhSZXNvbHZlcnMoKSxcbiAgICAgIGRhdGE6IElOSVRJQUxfREFUQVxuICAgIH07XG4gIH1cbiAgZ2V0KG9iaklkLCBjYWxsYmFjayA9IG51bGwpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuI2Vuc3VyZU9iaihvYmpJZCk7XG4gICAgICBvYmoucHJvbWlzZS50aGVuKCgpID0+IGNhbGxiYWNrKG9iai5kYXRhKSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgb2JqID0gdGhpcy4jb2Jqc1tvYmpJZF07XG4gICAgaWYgKCFvYmogfHwgb2JqLmRhdGEgPT09IElOSVRJQUxfREFUQSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0aW5nIG9iamVjdCB0aGF0IGlzbid0IHJlc29sdmVkIHlldCAke29iaklkfS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iai5kYXRhO1xuICB9XG4gIGhhcyhvYmpJZCkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuI29ianNbb2JqSWRdO1xuICAgIHJldHVybiAhIW9iaiAmJiBvYmouZGF0YSAhPT0gSU5JVElBTF9EQVRBO1xuICB9XG4gIHJlc29sdmUob2JqSWQsIGRhdGEgPSBudWxsKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy4jZW5zdXJlT2JqKG9iaklkKTtcbiAgICBvYmouZGF0YSA9IGRhdGE7XG4gICAgb2JqLnJlc29sdmUoKTtcbiAgfVxuICBjbGVhcigpIHtcbiAgICBmb3IgKGNvbnN0IG9iaklkIGluIHRoaXMuI29ianMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YVxuICAgICAgfSA9IHRoaXMuI29ianNbb2JqSWRdO1xuICAgICAgZGF0YT8uYml0bWFwPy5jbG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLiNvYmpzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgZm9yIChjb25zdCBvYmpJZCBpbiB0aGlzLiNvYmpzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRhdGFcbiAgICAgIH0gPSB0aGlzLiNvYmpzW29iaklkXTtcbiAgICAgIGlmIChkYXRhID09PSBJTklUSUFMX0RBVEEpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB5aWVsZCBbb2JqSWQsIGRhdGFdO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgUmVuZGVyVGFzayB7XG4gICNpbnRlcm5hbFJlbmRlclRhc2sgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihpbnRlcm5hbFJlbmRlclRhc2spIHtcbiAgICB0aGlzLiNpbnRlcm5hbFJlbmRlclRhc2sgPSBpbnRlcm5hbFJlbmRlclRhc2s7XG4gICAgdGhpcy5vbkNvbnRpbnVlID0gbnVsbDtcbiAgfVxuICBnZXQgcHJvbWlzZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBjYW5jZWwoZXh0cmFEZWxheSA9IDApIHtcbiAgICB0aGlzLiNpbnRlcm5hbFJlbmRlclRhc2suY2FuY2VsKG51bGwsIGV4dHJhRGVsYXkpO1xuICB9XG4gIGdldCBzZXBhcmF0ZUFubm90cygpIHtcbiAgICBjb25zdCB7XG4gICAgICBzZXBhcmF0ZUFubm90c1xuICAgIH0gPSB0aGlzLiNpbnRlcm5hbFJlbmRlclRhc2sub3BlcmF0b3JMaXN0O1xuICAgIGlmICghc2VwYXJhdGVBbm5vdHMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcFxuICAgIH0gPSB0aGlzLiNpbnRlcm5hbFJlbmRlclRhc2s7XG4gICAgcmV0dXJuIHNlcGFyYXRlQW5ub3RzLmZvcm0gfHwgc2VwYXJhdGVBbm5vdHMuY2FudmFzICYmIGFubm90YXRpb25DYW52YXNNYXA/LnNpemUgPiAwO1xuICB9XG59XG5jbGFzcyBJbnRlcm5hbFJlbmRlclRhc2sge1xuICAjckFGID0gbnVsbDtcbiAgc3RhdGljICNjYW52YXNJblVzZSA9IG5ldyBXZWFrU2V0KCk7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjYWxsYmFjayxcbiAgICBwYXJhbXMsXG4gICAgb2JqcyxcbiAgICBjb21tb25PYmpzLFxuICAgIGFubm90YXRpb25DYW52YXNNYXAsXG4gICAgb3BlcmF0b3JMaXN0LFxuICAgIHBhZ2VJbmRleCxcbiAgICBjYW52YXNGYWN0b3J5LFxuICAgIGZpbHRlckZhY3RvcnksXG4gICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZmFsc2UsXG4gICAgcGRmQnVnID0gZmFsc2UsXG4gICAgcGFnZUNvbG9ycyA9IG51bGxcbiAgfSkge1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLm9ianMgPSBvYmpzO1xuICAgIHRoaXMuY29tbW9uT2JqcyA9IGNvbW1vbk9ianM7XG4gICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzTWFwID0gYW5ub3RhdGlvbkNhbnZhc01hcDtcbiAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IG51bGw7XG4gICAgdGhpcy5vcGVyYXRvckxpc3QgPSBvcGVyYXRvckxpc3Q7XG4gICAgdGhpcy5fcGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7XG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gZmlsdGVyRmFjdG9yeTtcbiAgICB0aGlzLl9wZGZCdWcgPSBwZGZCdWc7XG4gICAgdGhpcy5wYWdlQ29sb3JzID0gcGFnZUNvbG9ycztcbiAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5ncmFwaGljc1JlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSB0cnVlICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCI7XG4gICAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLnRhc2sgPSBuZXcgUmVuZGVyVGFzayh0aGlzKTtcbiAgICB0aGlzLl9jYW5jZWxCb3VuZCA9IHRoaXMuY2FuY2VsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fY29udGludWVCb3VuZCA9IHRoaXMuX2NvbnRpbnVlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQgPSB0aGlzLl9zY2hlZHVsZU5leHQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9uZXh0Qm91bmQgPSB0aGlzLl9uZXh0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fY2FudmFzID0gcGFyYW1zLmNhbnZhc0NvbnRleHQuY2FudmFzO1xuICB9XG4gIGdldCBjb21wbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgfVxuICBpbml0aWFsaXplR3JhcGhpY3Moe1xuICAgIHRyYW5zcGFyZW5jeSA9IGZhbHNlLFxuICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1xuICB9KSB7XG4gICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9jYW52YXMpIHtcbiAgICAgIGlmIChJbnRlcm5hbFJlbmRlclRhc2suI2NhbnZhc0luVXNlLmhhcyh0aGlzLl9jYW52YXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgdGhlIHNhbWUgY2FudmFzIGR1cmluZyBtdWx0aXBsZSByZW5kZXIoKSBvcGVyYXRpb25zLiBcIiArIFwiVXNlIGRpZmZlcmVudCBjYW52YXMgb3IgZW5zdXJlIHByZXZpb3VzIG9wZXJhdGlvbnMgd2VyZSBcIiArIFwiY2FuY2VsbGVkIG9yIGNvbXBsZXRlZC5cIik7XG4gICAgICB9XG4gICAgICBJbnRlcm5hbFJlbmRlclRhc2suI2NhbnZhc0luVXNlLmFkZCh0aGlzLl9jYW52YXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGRmQnVnICYmIGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXI/LmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc3RlcHBlciA9IGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXIuY3JlYXRlKHRoaXMuX3BhZ2VJbmRleCk7XG4gICAgICB0aGlzLnN0ZXBwZXIuaW5pdCh0aGlzLm9wZXJhdG9yTGlzdCk7XG4gICAgICB0aGlzLnN0ZXBwZXIubmV4dEJyZWFrUG9pbnQgPSB0aGlzLnN0ZXBwZXIuZ2V0TmV4dEJyZWFrUG9pbnQoKTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgY2FudmFzQ29udGV4dCxcbiAgICAgIHZpZXdwb3J0LFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgYmFja2dyb3VuZFxuICAgIH0gPSB0aGlzLnBhcmFtcztcbiAgICB0aGlzLmdmeCA9IG5ldyBDYW52YXNHcmFwaGljcyhjYW52YXNDb250ZXh0LCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLmZpbHRlckZhY3RvcnksIHtcbiAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1xuICAgIH0sIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCwgdGhpcy5wYWdlQ29sb3JzKTtcbiAgICB0aGlzLmdmeC5iZWdpbkRyYXdpbmcoe1xuICAgICAgdHJhbnNmb3JtLFxuICAgICAgdmlld3BvcnQsXG4gICAgICB0cmFuc3BhcmVuY3ksXG4gICAgICBiYWNrZ3JvdW5kXG4gICAgfSk7XG4gICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSAwO1xuICAgIHRoaXMuZ3JhcGhpY3NSZWFkeSA9IHRydWU7XG4gICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2s/LigpO1xuICB9XG4gIGNhbmNlbChlcnJvciA9IG51bGwsIGV4dHJhRGVsYXkgPSAwKSB7XG4gICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIHRoaXMuZ2Z4Py5lbmREcmF3aW5nKCk7XG4gICAgaWYgKHRoaXMuI3JBRikge1xuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuI3JBRik7XG4gICAgICB0aGlzLiNyQUYgPSBudWxsO1xuICAgIH1cbiAgICBJbnRlcm5hbFJlbmRlclRhc2suI2NhbnZhc0luVXNlLmRlbGV0ZSh0aGlzLl9jYW52YXMpO1xuICAgIHRoaXMuY2FsbGJhY2soZXJyb3IgfHwgbmV3IFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbihgUmVuZGVyaW5nIGNhbmNlbGxlZCwgcGFnZSAke3RoaXMuX3BhZ2VJbmRleCArIDF9YCwgZXh0cmFEZWxheSkpO1xuICB9XG4gIG9wZXJhdG9yTGlzdENoYW5nZWQoKSB7XG4gICAgaWYgKCF0aGlzLmdyYXBoaWNzUmVhZHkpIHtcbiAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrIHx8PSB0aGlzLl9jb250aW51ZUJvdW5kO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0ZXBwZXI/LnVwZGF0ZU9wZXJhdG9yTGlzdCh0aGlzLm9wZXJhdG9yTGlzdCk7XG4gICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jb250aW51ZSgpO1xuICB9XG4gIF9jb250aW51ZSgpIHtcbiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgIGlmICh0aGlzLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50YXNrLm9uQ29udGludWUpIHtcbiAgICAgIHRoaXMudGFzay5vbkNvbnRpbnVlKHRoaXMuX3NjaGVkdWxlTmV4dEJvdW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2NoZWR1bGVOZXh0KCk7XG4gICAgfVxuICB9XG4gIF9zY2hlZHVsZU5leHQoKSB7XG4gICAgaWYgKHRoaXMuX3VzZVJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy4jckFGID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuI3JBRiA9IG51bGw7XG4gICAgICAgIHRoaXMuX25leHRCb3VuZCgpLmNhdGNoKHRoaXMuX2NhbmNlbEJvdW5kKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKHRoaXMuX25leHRCb3VuZCkuY2F0Y2godGhpcy5fY2FuY2VsQm91bmQpO1xuICAgIH1cbiAgfVxuICBhc3luYyBfbmV4dCgpIHtcbiAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSB0aGlzLmdmeC5leGVjdXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0LCB0aGlzLm9wZXJhdG9yTGlzdElkeCwgdGhpcy5fY29udGludWVCb3VuZCwgdGhpcy5zdGVwcGVyKTtcbiAgICBpZiAodGhpcy5vcGVyYXRvckxpc3RJZHggPT09IHRoaXMub3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5sZW5ndGgpIHtcbiAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMub3BlcmF0b3JMaXN0Lmxhc3RDaHVuaykge1xuICAgICAgICB0aGlzLmdmeC5lbmREcmF3aW5nKCk7XG4gICAgICAgIEludGVybmFsUmVuZGVyVGFzay4jY2FudmFzSW5Vc2UuZGVsZXRlKHRoaXMuX2NhbnZhcyk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmNvbnN0IHZlcnNpb24gPSBcIjQuNC4xNjhcIjtcbmNvbnN0IGJ1aWxkID0gXCIxOWZiYzg5OThcIjtcblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3NoYXJlZC9zY3JpcHRpbmdfdXRpbHMuanNcbmZ1bmN0aW9uIG1ha2VDb2xvckNvbXAobikge1xuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBuKSkgKiAyNTUpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIik7XG59XG5mdW5jdGlvbiBzY2FsZUFuZENsYW1wKHgpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgMjU1ICogeCkpO1xufVxuY2xhc3MgQ29sb3JDb252ZXJ0ZXJzIHtcbiAgc3RhdGljIENNWUtfRyhbYywgeSwgbSwga10pIHtcbiAgICByZXR1cm4gW1wiR1wiLCAxIC0gTWF0aC5taW4oMSwgMC4zICogYyArIDAuNTkgKiBtICsgMC4xMSAqIHkgKyBrKV07XG4gIH1cbiAgc3RhdGljIEdfQ01ZSyhbZ10pIHtcbiAgICByZXR1cm4gW1wiQ01ZS1wiLCAwLCAwLCAwLCAxIC0gZ107XG4gIH1cbiAgc3RhdGljIEdfUkdCKFtnXSkge1xuICAgIHJldHVybiBbXCJSR0JcIiwgZywgZywgZ107XG4gIH1cbiAgc3RhdGljIEdfcmdiKFtnXSkge1xuICAgIGcgPSBzY2FsZUFuZENsYW1wKGcpO1xuICAgIHJldHVybiBbZywgZywgZ107XG4gIH1cbiAgc3RhdGljIEdfSFRNTChbZ10pIHtcbiAgICBjb25zdCBHID0gbWFrZUNvbG9yQ29tcChnKTtcbiAgICByZXR1cm4gYCMke0d9JHtHfSR7R31gO1xuICB9XG4gIHN0YXRpYyBSR0JfRyhbciwgZywgYl0pIHtcbiAgICByZXR1cm4gW1wiR1wiLCAwLjMgKiByICsgMC41OSAqIGcgKyAwLjExICogYl07XG4gIH1cbiAgc3RhdGljIFJHQl9yZ2IoY29sb3IpIHtcbiAgICByZXR1cm4gY29sb3IubWFwKHNjYWxlQW5kQ2xhbXApO1xuICB9XG4gIHN0YXRpYyBSR0JfSFRNTChjb2xvcikge1xuICAgIHJldHVybiBgIyR7Y29sb3IubWFwKG1ha2VDb2xvckNvbXApLmpvaW4oXCJcIil9YDtcbiAgfVxuICBzdGF0aWMgVF9IVE1MKCkge1xuICAgIHJldHVybiBcIiMwMDAwMDAwMFwiO1xuICB9XG4gIHN0YXRpYyBUX3JnYigpIHtcbiAgICByZXR1cm4gW251bGxdO1xuICB9XG4gIHN0YXRpYyBDTVlLX1JHQihbYywgeSwgbSwga10pIHtcbiAgICByZXR1cm4gW1wiUkdCXCIsIDEgLSBNYXRoLm1pbigxLCBjICsgayksIDEgLSBNYXRoLm1pbigxLCBtICsgayksIDEgLSBNYXRoLm1pbigxLCB5ICsgayldO1xuICB9XG4gIHN0YXRpYyBDTVlLX3JnYihbYywgeSwgbSwga10pIHtcbiAgICByZXR1cm4gW3NjYWxlQW5kQ2xhbXAoMSAtIE1hdGgubWluKDEsIGMgKyBrKSksIHNjYWxlQW5kQ2xhbXAoMSAtIE1hdGgubWluKDEsIG0gKyBrKSksIHNjYWxlQW5kQ2xhbXAoMSAtIE1hdGgubWluKDEsIHkgKyBrKSldO1xuICB9XG4gIHN0YXRpYyBDTVlLX0hUTUwoY29tcG9uZW50cykge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuQ01ZS19SR0IoY29tcG9uZW50cykuc2xpY2UoMSk7XG4gICAgcmV0dXJuIHRoaXMuUkdCX0hUTUwocmdiKTtcbiAgfVxuICBzdGF0aWMgUkdCX0NNWUsoW3IsIGcsIGJdKSB7XG4gICAgY29uc3QgYyA9IDEgLSByO1xuICAgIGNvbnN0IG0gPSAxIC0gZztcbiAgICBjb25zdCB5ID0gMSAtIGI7XG4gICAgY29uc3QgayA9IE1hdGgubWluKGMsIG0sIHkpO1xuICAgIHJldHVybiBbXCJDTVlLXCIsIGMsIG0sIHksIGtdO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L3hmYV9sYXllci5qc1xuXG5jbGFzcyBYZmFMYXllciB7XG4gIHN0YXRpYyBzZXR1cFN0b3JhZ2UoaHRtbCwgaWQsIGVsZW1lbnQsIHN0b3JhZ2UsIGludGVudCkge1xuICAgIGNvbnN0IHN0b3JlZERhdGEgPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG4gICAgICB2YWx1ZTogbnVsbFxuICAgIH0pO1xuICAgIHN3aXRjaCAoZWxlbWVudC5uYW1lKSB7XG4gICAgICBjYXNlIFwidGV4dGFyZWFcIjpcbiAgICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBodG1sLnRleHRDb250ZW50ID0gc3RvcmVkRGF0YS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZW50ID09PSBcInByaW50XCIpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG4gICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgdmFsdWU6IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgaWYgKGVsZW1lbnQuYXR0cmlidXRlcy50eXBlID09PSBcInJhZGlvXCIgfHwgZWxlbWVudC5hdHRyaWJ1dGVzLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgICAgIGlmIChzdG9yZWREYXRhLnZhbHVlID09PSBlbGVtZW50LmF0dHJpYnV0ZXMueGZhT24pIHtcbiAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB0cnVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0b3JlZERhdGEudmFsdWUgPT09IGVsZW1lbnQuYXR0cmlidXRlcy54ZmFPZmYpIHtcbiAgICAgICAgICAgIGh0bWwucmVtb3ZlQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGludGVudCA9PT0gXCJwcmludFwiKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50LnRhcmdldC5jaGVja2VkID8gZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInhmYU9uXCIpIDogZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInhmYU9mZlwiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgc3RvcmVkRGF0YS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbnRlbnQgPT09IFwicHJpbnRcIikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGh0bWwuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgIGlmIChzdG9yZWREYXRhLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBzdG9yZWREYXRhLnZhbHVlKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBlbGVtZW50LmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmF0dHJpYnV0ZXMudmFsdWUgPT09IHN0b3JlZERhdGEudmFsdWUpIHtcbiAgICAgICAgICAgICAgb3B0aW9uLmF0dHJpYnV0ZXMuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShcInNlbGVjdGVkXCIpKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb24uYXR0cmlidXRlcy5zZWxlY3RlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBldmVudC50YXJnZXQub3B0aW9ucztcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMuc2VsZWN0ZWRJbmRleCA9PT0gLTEgPyBcIlwiIDogb3B0aW9uc1tvcHRpb25zLnNlbGVjdGVkSW5kZXhdLnZhbHVlO1xuICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgc3RhdGljIHNldEF0dHJpYnV0ZXMoe1xuICAgIGh0bWwsXG4gICAgZWxlbWVudCxcbiAgICBzdG9yYWdlID0gbnVsbCxcbiAgICBpbnRlbnQsXG4gICAgbGlua1NlcnZpY2VcbiAgfSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGF0dHJpYnV0ZXNcbiAgICB9ID0gZWxlbWVudDtcbiAgICBjb25zdCBpc0hUTUxBbmNob3JFbGVtZW50ID0gaHRtbCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50O1xuICAgIGlmIChhdHRyaWJ1dGVzLnR5cGUgPT09IFwicmFkaW9cIikge1xuICAgICAgYXR0cmlidXRlcy5uYW1lID0gYCR7YXR0cmlidXRlcy5uYW1lfS0ke2ludGVudH1gO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwiY2xhc3NcIjpcbiAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlLmpvaW4oXCIgXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJkYXRhSWRcIjpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImlkXCI6XG4gICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGh0bWwuc3R5bGUsIHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRleHRDb250ZW50XCI6XG4gICAgICAgICAgaHRtbC50ZXh0Q29udGVudCA9IHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICghaXNIVE1MQW5jaG9yRWxlbWVudCB8fCBrZXkgIT09IFwiaHJlZlwiICYmIGtleSAhPT0gXCJuZXdXaW5kb3dcIikge1xuICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgICAgbGlua1NlcnZpY2UuYWRkTGlua0F0dHJpYnV0ZXMoaHRtbCwgYXR0cmlidXRlcy5ocmVmLCBhdHRyaWJ1dGVzLm5ld1dpbmRvdyk7XG4gICAgfVxuICAgIGlmIChzdG9yYWdlICYmIGF0dHJpYnV0ZXMuZGF0YUlkKSB7XG4gICAgICB0aGlzLnNldHVwU3RvcmFnZShodG1sLCBhdHRyaWJ1dGVzLmRhdGFJZCwgZWxlbWVudCwgc3RvcmFnZSk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyByZW5kZXIocGFyYW1ldGVycykge1xuICAgIGNvbnN0IHN0b3JhZ2UgPSBwYXJhbWV0ZXJzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGxpbmtTZXJ2aWNlID0gcGFyYW1ldGVycy5saW5rU2VydmljZTtcbiAgICBjb25zdCByb290ID0gcGFyYW1ldGVycy54ZmFIdG1sO1xuICAgIGNvbnN0IGludGVudCA9IHBhcmFtZXRlcnMuaW50ZW50IHx8IFwiZGlzcGxheVwiO1xuICAgIGNvbnN0IHJvb3RIdG1sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyb290Lm5hbWUpO1xuICAgIGlmIChyb290LmF0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIGh0bWw6IHJvb3RIdG1sLFxuICAgICAgICBlbGVtZW50OiByb290LFxuICAgICAgICBpbnRlbnQsXG4gICAgICAgIGxpbmtTZXJ2aWNlXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaXNOb3RGb3JSaWNoVGV4dCA9IGludGVudCAhPT0gXCJyaWNoVGV4dFwiO1xuICAgIGNvbnN0IHJvb3REaXYgPSBwYXJhbWV0ZXJzLmRpdjtcbiAgICByb290RGl2LmFwcGVuZChyb290SHRtbCk7XG4gICAgaWYgKHBhcmFtZXRlcnMudmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGBtYXRyaXgoJHtwYXJhbWV0ZXJzLnZpZXdwb3J0LnRyYW5zZm9ybS5qb2luKFwiLFwiKX0pYDtcbiAgICAgIHJvb3REaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIH1cbiAgICBpZiAoaXNOb3RGb3JSaWNoVGV4dCkge1xuICAgICAgcm9vdERpdi5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcInhmYUxheWVyIHhmYUZvbnRcIik7XG4gICAgfVxuICAgIGNvbnN0IHRleHREaXZzID0gW107XG4gICAgaWYgKHJvb3QuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAocm9vdC52YWx1ZSkge1xuICAgICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocm9vdC52YWx1ZSk7XG4gICAgICAgIHJvb3RIdG1sLmFwcGVuZChub2RlKTtcbiAgICAgICAgaWYgKGlzTm90Rm9yUmljaFRleHQgJiYgWGZhVGV4dC5zaG91bGRCdWlsZFRleHQocm9vdC5uYW1lKSkge1xuICAgICAgICAgIHRleHREaXZzLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHREaXZzXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IFtbcm9vdCwgLTEsIHJvb3RIdG1sXV07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IFtwYXJlbnQsIGksIGh0bWxdID0gc3RhY2suYXQoLTEpO1xuICAgICAgaWYgKGkgKyAxID09PSBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoaWxkID0gcGFyZW50LmNoaWxkcmVuWysrc3RhY2suYXQoLTEpWzFdXTtcbiAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbmFtZVxuICAgICAgfSA9IGNoaWxkO1xuICAgICAgaWYgKG5hbWUgPT09IFwiI3RleHRcIikge1xuICAgICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQudmFsdWUpO1xuICAgICAgICB0ZXh0RGl2cy5wdXNoKG5vZGUpO1xuICAgICAgICBodG1sLmFwcGVuZChub2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGlsZEh0bWwgPSBjaGlsZD8uYXR0cmlidXRlcz8ueG1sbnMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoY2hpbGQuYXR0cmlidXRlcy54bWxucywgbmFtZSkgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpO1xuICAgICAgaHRtbC5hcHBlbmQoY2hpbGRIdG1sKTtcbiAgICAgIGlmIChjaGlsZC5hdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgaHRtbDogY2hpbGRIdG1sLFxuICAgICAgICAgIGVsZW1lbnQ6IGNoaWxkLFxuICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgaW50ZW50LFxuICAgICAgICAgIGxpbmtTZXJ2aWNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YWNrLnB1c2goW2NoaWxkLCAtMSwgY2hpbGRIdG1sXSk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZC52YWx1ZSk7XG4gICAgICAgIGlmIChpc05vdEZvclJpY2hUZXh0ICYmIFhmYVRleHQuc2hvdWxkQnVpbGRUZXh0KG5hbWUpKSB7XG4gICAgICAgICAgdGV4dERpdnMucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZEh0bWwuYXBwZW5kKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVsIG9mIHJvb3REaXYucXVlcnlTZWxlY3RvckFsbChcIi54ZmFOb25JbnRlcmFjdGl2ZSBpbnB1dCwgLnhmYU5vbkludGVyYWN0aXZlIHRleHRhcmVhXCIpKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJyZWFkT25seVwiLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHREaXZzXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgdXBkYXRlKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBgbWF0cml4KCR7cGFyYW1ldGVycy52aWV3cG9ydC50cmFuc2Zvcm0uam9pbihcIixcIil9KWA7XG4gICAgcGFyYW1ldGVycy5kaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIHBhcmFtZXRlcnMuZGl2LmhpZGRlbiA9IGZhbHNlO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2Fubm90YXRpb25fbGF5ZXIuanNcblxuXG5cblxuXG5jb25zdCBERUZBVUxUX1RBQl9JTkRFWCA9IDEwMDA7XG5jb25zdCBhbm5vdGF0aW9uX2xheWVyX0RFRkFVTFRfRk9OVF9TSVpFID0gOTtcbmNvbnN0IEdldEVsZW1lbnRzQnlOYW1lU2V0ID0gbmV3IFdlYWtTZXQoKTtcbmZ1bmN0aW9uIGdldFJlY3REaW1zKHJlY3QpIHtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcmVjdFsyXSAtIHJlY3RbMF0sXG4gICAgaGVpZ2h0OiByZWN0WzNdIC0gcmVjdFsxXVxuICB9O1xufVxuY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5IHtcbiAgc3RhdGljIGNyZWF0ZShwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3Qgc3VidHlwZSA9IHBhcmFtZXRlcnMuZGF0YS5hbm5vdGF0aW9uVHlwZTtcbiAgICBzd2l0Y2ggKHN1YnR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuTElOSzpcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlRFWFQ6XG4gICAgICAgIHJldHVybiBuZXcgVGV4dEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5XSURHRVQ6XG4gICAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHBhcmFtZXRlcnMuZGF0YS5maWVsZFR5cGU7XG4gICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgICAgICAgY2FzZSBcIlR4XCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICBjYXNlIFwiQnRuXCI6XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycy5kYXRhLnJhZGlvQnV0dG9uKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVycy5kYXRhLmNoZWNrQm94KSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICAgIGNhc2UgXCJDaFwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICBjYXNlIFwiU2lnXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZVdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlBPUFVQOlxuICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkZSRUVURVhUOlxuICAgICAgICByZXR1cm4gbmV3IEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkxJTkU6XG4gICAgICAgIHJldHVybiBuZXcgTGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5TUVVBUkU6XG4gICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkNJUkNMRTpcbiAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU6XG4gICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuQ0FSRVQ6XG4gICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuSU5LOlxuICAgICAgICByZXR1cm4gbmV3IElua0Fubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5QT0xZR09OOlxuICAgICAgICByZXR1cm4gbmV3IFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuSElHSExJR0hUOlxuICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5VTkRFUkxJTkU6XG4gICAgICAgIHJldHVybiBuZXcgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNRVUlHR0xZOlxuICAgICAgICByZXR1cm4gbmV3IFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNUUklLRU9VVDpcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuU1RBTVA6XG4gICAgICAgIHJldHVybiBuZXcgU3RhbXBBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ6XG4gICAgICAgIHJldHVybiBuZXcgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgfVxuICB9XG59XG5jbGFzcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICN1cGRhdGVzID0gbnVsbDtcbiAgI2hhc0JvcmRlciA9IGZhbHNlO1xuICAjcG9wdXBFbGVtZW50ID0gbnVsbDtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycywge1xuICAgIGlzUmVuZGVyYWJsZSA9IGZhbHNlLFxuICAgIGlnbm9yZUJvcmRlciA9IGZhbHNlLFxuICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pc1JlbmRlcmFibGUgPSBpc1JlbmRlcmFibGU7XG4gICAgdGhpcy5kYXRhID0gcGFyYW1ldGVycy5kYXRhO1xuICAgIHRoaXMubGF5ZXIgPSBwYXJhbWV0ZXJzLmxheWVyO1xuICAgIHRoaXMubGlua1NlcnZpY2UgPSBwYXJhbWV0ZXJzLmxpbmtTZXJ2aWNlO1xuICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyID0gcGFyYW1ldGVycy5kb3dubG9hZE1hbmFnZXI7XG4gICAgdGhpcy5pbWFnZVJlc291cmNlc1BhdGggPSBwYXJhbWV0ZXJzLmltYWdlUmVzb3VyY2VzUGF0aDtcbiAgICB0aGlzLnJlbmRlckZvcm1zID0gcGFyYW1ldGVycy5yZW5kZXJGb3JtcztcbiAgICB0aGlzLnN2Z0ZhY3RvcnkgPSBwYXJhbWV0ZXJzLnN2Z0ZhY3Rvcnk7XG4gICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZSA9IHBhcmFtZXRlcnMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgdGhpcy5lbmFibGVTY3JpcHRpbmcgPSBwYXJhbWV0ZXJzLmVuYWJsZVNjcmlwdGluZztcbiAgICB0aGlzLmhhc0pTQWN0aW9ucyA9IHBhcmFtZXRlcnMuaGFzSlNBY3Rpb25zO1xuICAgIHRoaXMuX2ZpZWxkT2JqZWN0cyA9IHBhcmFtZXRlcnMuZmllbGRPYmplY3RzO1xuICAgIHRoaXMucGFyZW50ID0gcGFyYW1ldGVycy5wYXJlbnQ7XG4gICAgaWYgKGlzUmVuZGVyYWJsZSkge1xuICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLl9jcmVhdGVDb250YWluZXIoaWdub3JlQm9yZGVyKTtcbiAgICB9XG4gICAgaWYgKGNyZWF0ZVF1YWRyaWxhdGVyYWxzKSB7XG4gICAgICB0aGlzLl9jcmVhdGVRdWFkcmlsYXRlcmFscygpO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgX2hhc1BvcHVwRGF0YSh7XG4gICAgdGl0bGVPYmosXG4gICAgY29udGVudHNPYmosXG4gICAgcmljaFRleHRcbiAgfSkge1xuICAgIHJldHVybiAhISh0aXRsZU9iaj8uc3RyIHx8IGNvbnRlbnRzT2JqPy5zdHIgfHwgcmljaFRleHQ/LnN0cik7XG4gIH1cbiAgZ2V0IGhhc1BvcHVwRGF0YSgpIHtcbiAgICByZXR1cm4gQW5ub3RhdGlvbkVsZW1lbnQuX2hhc1BvcHVwRGF0YSh0aGlzLmRhdGEpO1xuICB9XG4gIHVwZGF0ZUVkaXRlZChwYXJhbXMpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3VwZGF0ZXMgfHw9IHtcbiAgICAgIHJlY3Q6IHRoaXMuZGF0YS5yZWN0LnNsaWNlKDApXG4gICAgfTtcbiAgICBjb25zdCB7XG4gICAgICByZWN0XG4gICAgfSA9IHBhcmFtcztcbiAgICBpZiAocmVjdCkge1xuICAgICAgdGhpcy4jc2V0UmVjdEVkaXRlZChyZWN0KTtcbiAgICB9XG4gICAgdGhpcy4jcG9wdXBFbGVtZW50Py5wb3B1cC51cGRhdGVFZGl0ZWQocGFyYW1zKTtcbiAgfVxuICByZXNldEVkaXRlZCgpIHtcbiAgICBpZiAoIXRoaXMuI3VwZGF0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jc2V0UmVjdEVkaXRlZCh0aGlzLiN1cGRhdGVzLnJlY3QpO1xuICAgIHRoaXMuI3BvcHVwRWxlbWVudD8ucG9wdXAucmVzZXRFZGl0ZWQoKTtcbiAgICB0aGlzLiN1cGRhdGVzID0gbnVsbDtcbiAgfVxuICAjc2V0UmVjdEVkaXRlZChyZWN0KSB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGFpbmVyOiB7XG4gICAgICAgIHN0eWxlXG4gICAgICB9LFxuICAgICAgZGF0YToge1xuICAgICAgICByZWN0OiBjdXJyZW50UmVjdCxcbiAgICAgICAgcm90YXRpb25cbiAgICAgIH0sXG4gICAgICBwYXJlbnQ6IHtcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICByYXdEaW1zOiB7XG4gICAgICAgICAgICBwYWdlV2lkdGgsXG4gICAgICAgICAgICBwYWdlSGVpZ2h0LFxuICAgICAgICAgICAgcGFnZVgsXG4gICAgICAgICAgICBwYWdlWVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIGN1cnJlbnRSZWN0Py5zcGxpY2UoMCwgNCwgLi4ucmVjdCk7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXMocmVjdCk7XG4gICAgc3R5bGUubGVmdCA9IGAkezEwMCAqIChyZWN0WzBdIC0gcGFnZVgpIC8gcGFnZVdpZHRofSVgO1xuICAgIHN0eWxlLnRvcCA9IGAkezEwMCAqIChwYWdlSGVpZ2h0IC0gcmVjdFszXSArIHBhZ2VZKSAvIHBhZ2VIZWlnaHR9JWA7XG4gICAgaWYgKHJvdGF0aW9uID09PSAwKSB7XG4gICAgICBzdHlsZS53aWR0aCA9IGAkezEwMCAqIHdpZHRoIC8gcGFnZVdpZHRofSVgO1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gYCR7MTAwICogaGVpZ2h0IC8gcGFnZUhlaWdodH0lYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRSb3RhdGlvbihyb3RhdGlvbik7XG4gICAgfVxuICB9XG4gIF9jcmVhdGVDb250YWluZXIoaWdub3JlQm9yZGVyKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGF0YSxcbiAgICAgIHBhcmVudDoge1xuICAgICAgICBwYWdlLFxuICAgICAgICB2aWV3cG9ydFxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIpO1xuICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFubm90YXRpb24taWRcIiwgZGF0YS5pZCk7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdpZGdldEFubm90YXRpb25FbGVtZW50KSkge1xuICAgICAgY29udGFpbmVyLnRhYkluZGV4ID0gREVGQVVMVF9UQUJfSU5ERVg7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IGNvbnRhaW5lcjtcbiAgICBzdHlsZS56SW5kZXggPSB0aGlzLnBhcmVudC56SW5kZXgrKztcbiAgICBpZiAoZGF0YS5wb3B1cFJlZikge1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIiwgXCJkaWFsb2dcIik7XG4gICAgfVxuICAgIGlmIChkYXRhLmFsdGVybmF0aXZlVGV4dCkge1xuICAgICAgY29udGFpbmVyLnRpdGxlID0gZGF0YS5hbHRlcm5hdGl2ZVRleHQ7XG4gICAgfVxuICAgIGlmIChkYXRhLm5vUm90YXRlKSB7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm5vcm90YXRlXCIpO1xuICAgIH1cbiAgICBpZiAoIWRhdGEucmVjdCB8fCB0aGlzIGluc3RhbmNlb2YgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByb3RhdGlvblxuICAgICAgfSA9IGRhdGE7XG4gICAgICBpZiAoIWRhdGEuaGFzT3duQ2FudmFzICYmIHJvdGF0aW9uICE9PSAwKSB7XG4gICAgICAgIHRoaXMuc2V0Um90YXRpb24ocm90YXRpb24sIGNvbnRhaW5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgIGlmICghaWdub3JlQm9yZGVyICYmIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggPiAwKSB7XG4gICAgICBzdHlsZS5ib3JkZXJXaWR0aCA9IGAke2RhdGEuYm9yZGVyU3R5bGUud2lkdGh9cHhgO1xuICAgICAgY29uc3QgaG9yaXpvbnRhbFJhZGl1cyA9IGRhdGEuYm9yZGVyU3R5bGUuaG9yaXpvbnRhbENvcm5lclJhZGl1cztcbiAgICAgIGNvbnN0IHZlcnRpY2FsUmFkaXVzID0gZGF0YS5ib3JkZXJTdHlsZS52ZXJ0aWNhbENvcm5lclJhZGl1cztcbiAgICAgIGlmIChob3Jpem9udGFsUmFkaXVzID4gMCB8fCB2ZXJ0aWNhbFJhZGl1cyA+IDApIHtcbiAgICAgICAgY29uc3QgcmFkaXVzID0gYGNhbGMoJHtob3Jpem9udGFsUmFkaXVzfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSkgLyBjYWxjKCR7dmVydGljYWxSYWRpdXN9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG4gICAgICAgIHN0eWxlLmJvcmRlclJhZGl1cyA9IHJhZGl1cztcbiAgICAgIH0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgcmFkaXVzID0gYGNhbGMoJHt3aWR0aH1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpIC8gY2FsYygke2hlaWdodH1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcbiAgICAgICAgc3R5bGUuYm9yZGVyUmFkaXVzID0gcmFkaXVzO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChkYXRhLmJvcmRlclN0eWxlLnN0eWxlKSB7XG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDpcbiAgICAgICAgICBzdHlsZS5ib3JkZXJTdHlsZSA9IFwic29saWRcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkRBU0hFRDpcbiAgICAgICAgICBzdHlsZS5ib3JkZXJTdHlsZSA9IFwiZGFzaGVkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5CRVZFTEVEOlxuICAgICAgICAgIHdhcm4oXCJVbmltcGxlbWVudGVkIGJvcmRlciBzdHlsZTogYmV2ZWxlZFwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLklOU0VUOlxuICAgICAgICAgIHdhcm4oXCJVbmltcGxlbWVudGVkIGJvcmRlciBzdHlsZTogaW5zZXRcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU6XG4gICAgICAgICAgc3R5bGUuYm9yZGVyQm90dG9tU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBib3JkZXJDb2xvciA9IGRhdGEuYm9yZGVyQ29sb3IgfHwgbnVsbDtcbiAgICAgIGlmIChib3JkZXJDb2xvcikge1xuICAgICAgICB0aGlzLiNoYXNCb3JkZXIgPSB0cnVlO1xuICAgICAgICBzdHlsZS5ib3JkZXJDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKGJvcmRlckNvbG9yWzBdIHwgMCwgYm9yZGVyQ29sb3JbMV0gfCAwLCBib3JkZXJDb2xvclsyXSB8IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGUuYm9yZGVyV2lkdGggPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZWN0ID0gVXRpbC5ub3JtYWxpemVSZWN0KFtkYXRhLnJlY3RbMF0sIHBhZ2Uudmlld1szXSAtIGRhdGEucmVjdFsxXSArIHBhZ2Uudmlld1sxXSwgZGF0YS5yZWN0WzJdLCBwYWdlLnZpZXdbM10gLSBkYXRhLnJlY3RbM10gKyBwYWdlLnZpZXdbMV1dKTtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0LFxuICAgICAgcGFnZVgsXG4gICAgICBwYWdlWVxuICAgIH0gPSB2aWV3cG9ydC5yYXdEaW1zO1xuICAgIHN0eWxlLmxlZnQgPSBgJHsxMDAgKiAocmVjdFswXSAtIHBhZ2VYKSAvIHBhZ2VXaWR0aH0lYDtcbiAgICBzdHlsZS50b3AgPSBgJHsxMDAgKiAocmVjdFsxXSAtIHBhZ2VZKSAvIHBhZ2VIZWlnaHR9JWA7XG4gICAgY29uc3Qge1xuICAgICAgcm90YXRpb25cbiAgICB9ID0gZGF0YTtcbiAgICBpZiAoZGF0YS5oYXNPd25DYW52YXMgfHwgcm90YXRpb24gPT09IDApIHtcbiAgICAgIHN0eWxlLndpZHRoID0gYCR7MTAwICogd2lkdGggLyBwYWdlV2lkdGh9JWA7XG4gICAgICBzdHlsZS5oZWlnaHQgPSBgJHsxMDAgKiBoZWlnaHQgLyBwYWdlSGVpZ2h0fSVgO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFJvdGF0aW9uKHJvdGF0aW9uLCBjb250YWluZXIpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG4gIHNldFJvdGF0aW9uKGFuZ2xlLCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcikge1xuICAgIGlmICghdGhpcy5kYXRhLnJlY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVdpZHRoLFxuICAgICAgcGFnZUhlaWdodFxuICAgIH0gPSB0aGlzLnBhcmVudC52aWV3cG9ydC5yYXdEaW1zO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKHRoaXMuZGF0YS5yZWN0KTtcbiAgICBsZXQgZWxlbWVudFdpZHRoLCBlbGVtZW50SGVpZ2h0O1xuICAgIGlmIChhbmdsZSAlIDE4MCA9PT0gMCkge1xuICAgICAgZWxlbWVudFdpZHRoID0gMTAwICogd2lkdGggLyBwYWdlV2lkdGg7XG4gICAgICBlbGVtZW50SGVpZ2h0ID0gMTAwICogaGVpZ2h0IC8gcGFnZUhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudFdpZHRoID0gMTAwICogaGVpZ2h0IC8gcGFnZVdpZHRoO1xuICAgICAgZWxlbWVudEhlaWdodCA9IDEwMCAqIHdpZHRoIC8gcGFnZUhlaWdodDtcbiAgICB9XG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7ZWxlbWVudFdpZHRofSVgO1xuICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHtlbGVtZW50SGVpZ2h0fSVgO1xuICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLW1haW4tcm90YXRpb25cIiwgKDM2MCAtIGFuZ2xlKSAlIDM2MCk7XG4gIH1cbiAgZ2V0IF9jb21tb25BY3Rpb25zKCkge1xuICAgIGNvbnN0IHNldENvbG9yID0gKGpzTmFtZSwgc3R5bGVOYW1lLCBldmVudCkgPT4ge1xuICAgICAgY29uc3QgY29sb3IgPSBldmVudC5kZXRhaWxbanNOYW1lXTtcbiAgICAgIGNvbnN0IGNvbG9yVHlwZSA9IGNvbG9yWzBdO1xuICAgICAgY29uc3QgY29sb3JBcnJheSA9IGNvbG9yLnNsaWNlKDEpO1xuICAgICAgZXZlbnQudGFyZ2V0LnN0eWxlW3N0eWxlTmFtZV0gPSBDb2xvckNvbnZlcnRlcnNbYCR7Y29sb3JUeXBlfV9IVE1MYF0oY29sb3JBcnJheSk7XG4gICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICBbc3R5bGVOYW1lXTogQ29sb3JDb252ZXJ0ZXJzW2Ake2NvbG9yVHlwZX1fcmdiYF0oY29sb3JBcnJheSlcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9jb21tb25BY3Rpb25zXCIsIHtcbiAgICAgIGRpc3BsYXk6IGV2ZW50ID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGRpc3BsYXlcbiAgICAgICAgfSA9IGV2ZW50LmRldGFpbDtcbiAgICAgICAgY29uc3QgaGlkZGVuID0gZGlzcGxheSAlIDIgPT09IDE7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSBoaWRkZW4gPyBcImhpZGRlblwiIDogXCJ2aXNpYmxlXCI7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgICAgbm9WaWV3OiBoaWRkZW4sXG4gICAgICAgICAgbm9QcmludDogZGlzcGxheSA9PT0gMSB8fCBkaXNwbGF5ID09PSAyXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHByaW50OiBldmVudCA9PiB7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgICAgbm9QcmludDogIWV2ZW50LmRldGFpbC5wcmludFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBoaWRkZW46IGV2ZW50ID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGhpZGRlblxuICAgICAgICB9ID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gaGlkZGVuID8gXCJoaWRkZW5cIiA6IFwidmlzaWJsZVwiO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgIG5vUHJpbnQ6IGhpZGRlbixcbiAgICAgICAgICBub1ZpZXc6IGhpZGRlblxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmb2N1czogZXZlbnQgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGV2ZW50LnRhcmdldC5mb2N1cyh7XG4gICAgICAgICAgcHJldmVudFNjcm9sbDogZmFsc2VcbiAgICAgICAgfSksIDApO1xuICAgICAgfSxcbiAgICAgIHVzZXJOYW1lOiBldmVudCA9PiB7XG4gICAgICAgIGV2ZW50LnRhcmdldC50aXRsZSA9IGV2ZW50LmRldGFpbC51c2VyTmFtZTtcbiAgICAgIH0sXG4gICAgICByZWFkb25seTogZXZlbnQgPT4ge1xuICAgICAgICBldmVudC50YXJnZXQuZGlzYWJsZWQgPSBldmVudC5kZXRhaWwucmVhZG9ubHk7XG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQoZXZlbnQudGFyZ2V0LCBldmVudC5kZXRhaWwucmVxdWlyZWQpO1xuICAgICAgfSxcbiAgICAgIGJnQ29sb3I6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0Q29sb3IoXCJiZ0NvbG9yXCIsIFwiYmFja2dyb3VuZENvbG9yXCIsIGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICBmaWxsQ29sb3I6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0Q29sb3IoXCJmaWxsQ29sb3JcIiwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIGZnQ29sb3I6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0Q29sb3IoXCJmZ0NvbG9yXCIsIFwiY29sb3JcIiwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIHRleHRDb2xvcjogZXZlbnQgPT4ge1xuICAgICAgICBzZXRDb2xvcihcInRleHRDb2xvclwiLCBcImNvbG9yXCIsIGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICBib3JkZXJDb2xvcjogZXZlbnQgPT4ge1xuICAgICAgICBzZXRDb2xvcihcImJvcmRlckNvbG9yXCIsIFwiYm9yZGVyQ29sb3JcIiwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIHN0cm9rZUNvbG9yOiBldmVudCA9PiB7XG4gICAgICAgIHNldENvbG9yKFwic3Ryb2tlQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgcm90YXRpb246IGV2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgYW5nbGUgPSBldmVudC5kZXRhaWwucm90YXRpb247XG4gICAgICAgIHRoaXMuc2V0Um90YXRpb24oYW5nbGUpO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgIHJvdGF0aW9uOiBhbmdsZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBfZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGFjdGlvbnMsIGpzRXZlbnQpIHtcbiAgICBjb25zdCBjb21tb25BY3Rpb25zID0gdGhpcy5fY29tbW9uQWN0aW9ucztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoanNFdmVudC5kZXRhaWwpKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBhY3Rpb25zW25hbWVdIHx8IGNvbW1vbkFjdGlvbnNbbmFtZV07XG4gICAgICBhY3Rpb24/Lihqc0V2ZW50KTtcbiAgICB9XG4gIH1cbiAgX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGVsZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlU2NyaXB0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0b3JlZERhdGEgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLmdldFJhd1ZhbHVlKHRoaXMuZGF0YS5pZCk7XG4gICAgaWYgKCFzdG9yZWREYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbW1vbkFjdGlvbnMgPSB0aGlzLl9jb21tb25BY3Rpb25zO1xuICAgIGZvciAoY29uc3QgW2FjdGlvbk5hbWUsIGRldGFpbF0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVkRGF0YSkpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNvbW1vbkFjdGlvbnNbYWN0aW9uTmFtZV07XG4gICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50UHJveHkgPSB7XG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBbYWN0aW9uTmFtZV06IGRldGFpbFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGFyZ2V0OiBlbGVtZW50XG4gICAgICAgIH07XG4gICAgICAgIGFjdGlvbihldmVudFByb3h5KTtcbiAgICAgICAgZGVsZXRlIHN0b3JlZERhdGFbYWN0aW9uTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9jcmVhdGVRdWFkcmlsYXRlcmFscygpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHF1YWRQb2ludHNcbiAgICB9ID0gdGhpcy5kYXRhO1xuICAgIGlmICghcXVhZFBvaW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbcmVjdEJsWCwgcmVjdEJsWSwgcmVjdFRyWCwgcmVjdFRyWV0gPSB0aGlzLmRhdGEucmVjdC5tYXAoeCA9PiBNYXRoLmZyb3VuZCh4KSk7XG4gICAgaWYgKHF1YWRQb2ludHMubGVuZ3RoID09PSA4KSB7XG4gICAgICBjb25zdCBbdHJYLCB0clksIGJsWCwgYmxZXSA9IHF1YWRQb2ludHMuc3ViYXJyYXkoMiwgNik7XG4gICAgICBpZiAocmVjdFRyWCA9PT0gdHJYICYmIHJlY3RUclkgPT09IHRyWSAmJiByZWN0QmxYID09PSBibFggJiYgcmVjdEJsWSA9PT0gYmxZKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy5jb250YWluZXI7XG4gICAgbGV0IHN2Z0J1ZmZlcjtcbiAgICBpZiAodGhpcy4jaGFzQm9yZGVyKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGJvcmRlckNvbG9yLFxuICAgICAgICBib3JkZXJXaWR0aFxuICAgICAgfSA9IHN0eWxlO1xuICAgICAgc3R5bGUuYm9yZGVyV2lkdGggPSAwO1xuICAgICAgc3ZnQnVmZmVyID0gW1widXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCxcIiwgYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiYCwgYCBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMSAxXCI+YCwgYDxnIGZpbGw9XCJ0cmFuc3BhcmVudFwiIHN0cm9rZT1cIiR7Ym9yZGVyQ29sb3J9XCIgc3Ryb2tlLXdpZHRoPVwiJHtib3JkZXJXaWR0aH1cIj5gXTtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoYXNCb3JkZXJcIik7XG4gICAgfVxuICAgIGNvbnN0IHdpZHRoID0gcmVjdFRyWCAtIHJlY3RCbFg7XG4gICAgY29uc3QgaGVpZ2h0ID0gcmVjdFRyWSAtIHJlY3RCbFk7XG4gICAgY29uc3Qge1xuICAgICAgc3ZnRmFjdG9yeVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IHN2ZyA9IHN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Z1wiKTtcbiAgICBzdmcuY2xhc3NMaXN0LmFkZChcInF1YWRyaWxhdGVyYWxzQ29udGFpbmVyXCIpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCAwKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIDApO1xuICAgIGNvbnN0IGRlZnMgPSBzdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIpO1xuICAgIHN2Zy5hcHBlbmQoZGVmcyk7XG4gICAgY29uc3QgY2xpcFBhdGggPSBzdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJjbGlwUGF0aFwiKTtcbiAgICBjb25zdCBpZCA9IGBjbGlwcGF0aF8ke3RoaXMuZGF0YS5pZH1gO1xuICAgIGNsaXBQYXRoLnNldEF0dHJpYnV0ZShcImlkXCIsIGlkKTtcbiAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGUoXCJjbGlwUGF0aFVuaXRzXCIsIFwib2JqZWN0Qm91bmRpbmdCb3hcIik7XG4gICAgZGVmcy5hcHBlbmQoY2xpcFBhdGgpO1xuICAgIGZvciAobGV0IGkgPSAyLCBpaSA9IHF1YWRQb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gOCkge1xuICAgICAgY29uc3QgdHJYID0gcXVhZFBvaW50c1tpXTtcbiAgICAgIGNvbnN0IHRyWSA9IHF1YWRQb2ludHNbaSArIDFdO1xuICAgICAgY29uc3QgYmxYID0gcXVhZFBvaW50c1tpICsgMl07XG4gICAgICBjb25zdCBibFkgPSBxdWFkUG9pbnRzW2kgKyAzXTtcbiAgICAgIGNvbnN0IHJlY3QgPSBzdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIpO1xuICAgICAgY29uc3QgeCA9IChibFggLSByZWN0QmxYKSAvIHdpZHRoO1xuICAgICAgY29uc3QgeSA9IChyZWN0VHJZIC0gdHJZKSAvIGhlaWdodDtcbiAgICAgIGNvbnN0IHJlY3RXaWR0aCA9ICh0clggLSBibFgpIC8gd2lkdGg7XG4gICAgICBjb25zdCByZWN0SGVpZ2h0ID0gKHRyWSAtIGJsWSkgLyBoZWlnaHQ7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgeCk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcInlcIiwgeSk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHJlY3RXaWR0aCk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCByZWN0SGVpZ2h0KTtcbiAgICAgIGNsaXBQYXRoLmFwcGVuZChyZWN0KTtcbiAgICAgIHN2Z0J1ZmZlcj8ucHVzaChgPHJlY3QgdmVjdG9yLWVmZmVjdD1cIm5vbi1zY2FsaW5nLXN0cm9rZVwiIHg9XCIke3h9XCIgeT1cIiR7eX1cIiB3aWR0aD1cIiR7cmVjdFdpZHRofVwiIGhlaWdodD1cIiR7cmVjdEhlaWdodH1cIi8+YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNoYXNCb3JkZXIpIHtcbiAgICAgIHN2Z0J1ZmZlci5wdXNoKGA8L2c+PC9zdmc+JylgKTtcbiAgICAgIHN0eWxlLmJhY2tncm91bmRJbWFnZSA9IHN2Z0J1ZmZlci5qb2luKFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5jbGlwUGF0aCA9IGB1cmwoIyR7aWR9KWA7XG4gIH1cbiAgX2NyZWF0ZVBvcHVwKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGRhdGFcbiAgICB9ID0gdGhpcztcbiAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiLCBcImRpYWxvZ1wiKTtcbiAgICBjb25zdCBwb3B1cCA9IHRoaXMuI3BvcHVwRWxlbWVudCA9IG5ldyBQb3B1cEFubm90YXRpb25FbGVtZW50KHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29sb3I6IGRhdGEuY29sb3IsXG4gICAgICAgIHRpdGxlT2JqOiBkYXRhLnRpdGxlT2JqLFxuICAgICAgICBtb2RpZmljYXRpb25EYXRlOiBkYXRhLm1vZGlmaWNhdGlvbkRhdGUsXG4gICAgICAgIGNvbnRlbnRzT2JqOiBkYXRhLmNvbnRlbnRzT2JqLFxuICAgICAgICByaWNoVGV4dDogZGF0YS5yaWNoVGV4dCxcbiAgICAgICAgcGFyZW50UmVjdDogZGF0YS5yZWN0LFxuICAgICAgICBib3JkZXJTdHlsZTogMCxcbiAgICAgICAgaWQ6IGBwb3B1cF8ke2RhdGEuaWR9YCxcbiAgICAgICAgcm90YXRpb246IGRhdGEucm90YXRpb25cbiAgICAgIH0sXG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgZWxlbWVudHM6IFt0aGlzXVxuICAgIH0pO1xuICAgIHRoaXMucGFyZW50LmRpdi5hcHBlbmQocG9wdXAucmVuZGVyKCkpO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgQW5ub3RhdGlvbkVsZW1lbnQucmVuZGVyYCBjYWxsZWRcIik7XG4gIH1cbiAgX2dldEVsZW1lbnRzQnlOYW1lKG5hbWUsIHNraXBJZCA9IG51bGwpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBbXTtcbiAgICBpZiAodGhpcy5fZmllbGRPYmplY3RzKSB7XG4gICAgICBjb25zdCBmaWVsZE9iaiA9IHRoaXMuX2ZpZWxkT2JqZWN0c1tuYW1lXTtcbiAgICAgIGlmIChmaWVsZE9iaikge1xuICAgICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgICBwYWdlLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIGV4cG9ydFZhbHVlc1xuICAgICAgICB9IG9mIGZpZWxkT2JqKSB7XG4gICAgICAgICAgaWYgKHBhZ2UgPT09IC0xKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlkID09PSBza2lwSWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleHBvcnRWYWx1ZSA9IHR5cGVvZiBleHBvcnRWYWx1ZXMgPT09IFwic3RyaW5nXCIgPyBleHBvcnRWYWx1ZXMgOiBudWxsO1xuICAgICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1lbGVtZW50LWlkPVwiJHtpZH1cIl1gKTtcbiAgICAgICAgICBpZiAoZG9tRWxlbWVudCAmJiAhR2V0RWxlbWVudHNCeU5hbWVTZXQuaGFzKGRvbUVsZW1lbnQpKSB7XG4gICAgICAgICAgICB3YXJuKGBfZ2V0RWxlbWVudHNCeU5hbWUgLSBlbGVtZW50IG5vdCBhbGxvd2VkOiAke2lkfWApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXhwb3J0VmFsdWUsXG4gICAgICAgICAgICBkb21FbGVtZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZG9tRWxlbWVudCBvZiBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShuYW1lKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBleHBvcnRWYWx1ZVxuICAgICAgfSA9IGRvbUVsZW1lbnQ7XG4gICAgICBjb25zdCBpZCA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIpO1xuICAgICAgaWYgKGlkID09PSBza2lwSWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIUdldEVsZW1lbnRzQnlOYW1lU2V0Lmhhcyhkb21FbGVtZW50KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZpZWxkcy5wdXNoKHtcbiAgICAgICAgaWQsXG4gICAgICAgIGV4cG9ydFZhbHVlLFxuICAgICAgICBkb21FbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkcztcbiAgfVxuICBzaG93KCkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgdGhpcy5jb250YWluZXIuaGlkZGVuID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucG9wdXA/Lm1heWJlU2hvdygpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5oaWRkZW4gPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnBvcHVwPy5mb3JjZUhpZGUoKTtcbiAgfVxuICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gdGhpcy5nZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHJpZ2dlcnMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdHJpZ2dlcnMpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlcnMuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgfVxuICB9XG4gIGdldCBfaXNFZGl0YWJsZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgX2VkaXRPbkRvdWJsZUNsaWNrKCkge1xuICAgIGlmICghdGhpcy5faXNFZGl0YWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBhbm5vdGF0aW9uRWRpdG9yVHlwZTogbW9kZSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgaWQ6IGVkaXRJZFxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcInN3aXRjaGFubm90YXRpb25lZGl0b3Jtb2RlXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBtb2RlLFxuICAgICAgICBlZGl0SWRcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5jbGFzcyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMsIG9wdGlvbnMgPSBudWxsKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiAhIW9wdGlvbnM/Lmlnbm9yZUJvcmRlcixcbiAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5pc1Rvb2x0aXBPbmx5ID0gcGFyYW1ldGVycy5kYXRhLmlzVG9vbHRpcE9ubHk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGEsXG4gICAgICBsaW5rU2VydmljZVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICBsaW5rLnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBkYXRhLmlkKTtcbiAgICBsZXQgaXNCb3VuZCA9IGZhbHNlO1xuICAgIGlmIChkYXRhLnVybCkge1xuICAgICAgbGlua1NlcnZpY2UuYWRkTGlua0F0dHJpYnV0ZXMobGluaywgZGF0YS51cmwsIGRhdGEubmV3V2luZG93KTtcbiAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5hY3Rpb24pIHtcbiAgICAgIHRoaXMuX2JpbmROYW1lZEFjdGlvbihsaW5rLCBkYXRhLmFjdGlvbik7XG4gICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEuYXR0YWNobWVudCkge1xuICAgICAgdGhpcy4jYmluZEF0dGFjaG1lbnQobGluaywgZGF0YS5hdHRhY2htZW50LCBkYXRhLmF0dGFjaG1lbnREZXN0KTtcbiAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5zZXRPQ0dTdGF0ZSkge1xuICAgICAgdGhpcy4jYmluZFNldE9DR1N0YXRlKGxpbmssIGRhdGEuc2V0T0NHU3RhdGUpO1xuICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkYXRhLmRlc3QpIHtcbiAgICAgIHRoaXMuX2JpbmRMaW5rKGxpbmssIGRhdGEuZGVzdCk7XG4gICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGEuYWN0aW9ucyAmJiAoZGF0YS5hY3Rpb25zLkFjdGlvbiB8fCBkYXRhLmFjdGlvbnNbXCJNb3VzZSBVcFwiXSB8fCBkYXRhLmFjdGlvbnNbXCJNb3VzZSBEb3duXCJdKSAmJiB0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICB0aGlzLl9iaW5kSlNBY3Rpb24obGluaywgZGF0YSk7XG4gICAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEucmVzZXRGb3JtKSB7XG4gICAgICAgIHRoaXMuX2JpbmRSZXNldEZvcm1BY3Rpb24obGluaywgZGF0YS5yZXNldEZvcm0pO1xuICAgICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Rvb2x0aXBPbmx5ICYmICFpc0JvdW5kKSB7XG4gICAgICAgIHRoaXMuX2JpbmRMaW5rKGxpbmssIFwiXCIpO1xuICAgICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImxpbmtBbm5vdGF0aW9uXCIpO1xuICAgIGlmIChpc0JvdW5kKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQobGluayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICAjc2V0SW50ZXJuYWxMaW5rKCkge1xuICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtaW50ZXJuYWwtbGlua1wiLCBcIlwiKTtcbiAgfVxuICBfYmluZExpbmsobGluaywgZGVzdGluYXRpb24pIHtcbiAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldERlc3RpbmF0aW9uSGFzaChkZXN0aW5hdGlvbik7XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKGRlc3RpbmF0aW9uKSB7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UuZ29Ub0Rlc3RpbmF0aW9uKGRlc3RpbmF0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIGlmIChkZXN0aW5hdGlvbiB8fCBkZXN0aW5hdGlvbiA9PT0gXCJcIikge1xuICAgICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG4gICAgfVxuICB9XG4gIF9iaW5kTmFtZWRBY3Rpb24obGluaywgYWN0aW9uKSB7XG4gICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5saW5rU2VydmljZS5leGVjdXRlTmFtZWRBY3Rpb24oYWN0aW9uKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuICB9XG4gICNiaW5kQXR0YWNobWVudChsaW5rLCBhdHRhY2htZW50LCBkZXN0ID0gbnVsbCkge1xuICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgIGlmIChhdHRhY2htZW50LmRlc2NyaXB0aW9uKSB7XG4gICAgICBsaW5rLnRpdGxlID0gYXR0YWNobWVudC5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5kb3dubG9hZE1hbmFnZXI/Lm9wZW5PckRvd25sb2FkRGF0YShhdHRhY2htZW50LmNvbnRlbnQsIGF0dGFjaG1lbnQuZmlsZW5hbWUsIGRlc3QpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG4gIH1cbiAgI2JpbmRTZXRPQ0dTdGF0ZShsaW5rLCBhY3Rpb24pIHtcbiAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcbiAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV4ZWN1dGVTZXRPQ0dTdGF0ZShhY3Rpb24pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG4gIH1cbiAgX2JpbmRKU0FjdGlvbihsaW5rLCBkYXRhKSB7XG4gICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcChbW1wiQWN0aW9uXCIsIFwib25jbGlja1wiXSwgW1wiTW91c2UgVXBcIiwgXCJvbm1vdXNldXBcIl0sIFtcIk1vdXNlIERvd25cIiwgXCJvbm1vdXNlZG93blwiXV0pO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkYXRhLmFjdGlvbnMpKSB7XG4gICAgICBjb25zdCBqc05hbWUgPSBtYXAuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCFqc05hbWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsaW5rW2pzTmFtZV0gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICAgICAgICBuYW1lXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFsaW5rLm9uY2xpY2spIHtcbiAgICAgIGxpbmsub25jbGljayA9ICgpID0+IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcbiAgfVxuICBfYmluZFJlc2V0Rm9ybUFjdGlvbihsaW5rLCByZXNldEZvcm0pIHtcbiAgICBjb25zdCBvdGhlckNsaWNrQWN0aW9uID0gbGluay5vbmNsaWNrO1xuICAgIGlmICghb3RoZXJDbGlja0FjdGlvbikge1xuICAgICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgfVxuICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuICAgIGlmICghdGhpcy5fZmllbGRPYmplY3RzKSB7XG4gICAgICB3YXJuKGBfYmluZFJlc2V0Rm9ybUFjdGlvbiAtIFwicmVzZXRGb3JtXCIgYWN0aW9uIG5vdCBzdXBwb3J0ZWQsIGAgKyBcImVuc3VyZSB0aGF0IHRoZSBgZmllbGRPYmplY3RzYCBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQuXCIpO1xuICAgICAgaWYgKCFvdGhlckNsaWNrQWN0aW9uKSB7XG4gICAgICAgIGxpbmsub25jbGljayA9ICgpID0+IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICBvdGhlckNsaWNrQWN0aW9uPy4oKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZmllbGRzOiByZXNldEZvcm1GaWVsZHMsXG4gICAgICAgIHJlZnM6IHJlc2V0Rm9ybVJlZnMsXG4gICAgICAgIGluY2x1ZGVcbiAgICAgIH0gPSByZXNldEZvcm07XG4gICAgICBjb25zdCBhbGxGaWVsZHMgPSBbXTtcbiAgICAgIGlmIChyZXNldEZvcm1GaWVsZHMubGVuZ3RoICE9PSAwIHx8IHJlc2V0Rm9ybVJlZnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkSWRzID0gbmV3IFNldChyZXNldEZvcm1SZWZzKTtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZE5hbWUgb2YgcmVzZXRGb3JtRmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5fZmllbGRPYmplY3RzW2ZpZWxkTmFtZV0gfHwgW107XG4gICAgICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgICAgICBpZFxuICAgICAgICAgIH0gb2YgZmllbGRzKSB7XG4gICAgICAgICAgICBmaWVsZElkcy5hZGQoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkcyBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2ZpZWxkT2JqZWN0cykpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkSWRzLmhhcyhmaWVsZC5pZCkgPT09IGluY2x1ZGUpIHtcbiAgICAgICAgICAgICAgYWxsRmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZHMgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9maWVsZE9iamVjdHMpKSB7XG4gICAgICAgICAgYWxsRmllbGRzLnB1c2goLi4uZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgICBjb25zdCBhbGxJZHMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgYWxsRmllbGRzKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBpZFxuICAgICAgICB9ID0gZmllbGQ7XG4gICAgICAgIGFsbElkcy5wdXNoKGlkKTtcbiAgICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICBjYXNlIFwicmFkaW9idXR0b25cIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWUgPT09IGZpZWxkLmV4cG9ydFZhbHVlcztcbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiY29tYm9ib3hcIjpcbiAgICAgICAgICBjYXNlIFwibGlzdGJveFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtZWxlbWVudC1pZD1cIiR7aWR9XCJdYCk7XG4gICAgICAgIGlmICghZG9tRWxlbWVudCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCFHZXRFbGVtZW50c0J5TmFtZVNldC5oYXMoZG9tRWxlbWVudCkpIHtcbiAgICAgICAgICB3YXJuKGBfYmluZFJlc2V0Rm9ybUFjdGlvbiAtIGVsZW1lbnQgbm90IGFsbG93ZWQ6ICR7aWR9YCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInJlc2V0Zm9ybVwiKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcpIHtcbiAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBpZDogXCJhcHBcIixcbiAgICAgICAgICAgIGlkczogYWxsSWRzLFxuICAgICAgICAgICAgbmFtZTogXCJSZXNldEZvcm1cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfVxufVxuY2xhc3MgVGV4dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ0ZXh0QW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgaW1hZ2Uuc3JjID0gdGhpcy5pbWFnZVJlc291cmNlc1BhdGggKyBcImFubm90YXRpb24tXCIgKyB0aGlzLmRhdGEubmFtZS50b0xvd2VyQ2FzZSgpICsgXCIuc3ZnXCI7XG4gICAgaW1hZ2Uuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtdGV4dC1hbm5vdGF0aW9uLXR5cGVcIik7XG4gICAgaW1hZ2Uuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWFyZ3NcIiwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdHlwZTogdGhpcy5kYXRhLm5hbWVcbiAgICB9KSk7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpbWFnZSk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBzaG93RWxlbWVudEFuZEhpZGVDYW52YXMoZWxlbWVudCkge1xuICAgIGlmICh0aGlzLmRhdGEuaGFzT3duQ2FudmFzKSB7XG4gICAgICBpZiAoZWxlbWVudC5wcmV2aW91c1NpYmxpbmc/Lm5vZGVOYW1lID09PSBcIkNBTlZBU1wiKSB7XG4gICAgICAgIGVsZW1lbnQucHJldmlvdXNTaWJsaW5nLmhpZGRlbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBlbGVtZW50LmhpZGRlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBfZ2V0S2V5TW9kaWZpZXIoZXZlbnQpIHtcbiAgICByZXR1cm4gdXRpbF9GZWF0dXJlVGVzdC5wbGF0Zm9ybS5pc01hYyA/IGV2ZW50Lm1ldGFLZXkgOiBldmVudC5jdHJsS2V5O1xuICB9XG4gIF9zZXRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGVsZW1lbnREYXRhLCBiYXNlTmFtZSwgZXZlbnROYW1lLCB2YWx1ZUdldHRlcikge1xuICAgIGlmIChiYXNlTmFtZS5pbmNsdWRlcyhcIm1vdXNlXCIpKSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYmFzZU5hbWUsIGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBpZDogdGhpcy5kYXRhLmlkLFxuICAgICAgICAgICAgbmFtZTogZXZlbnROYW1lLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlR2V0dGVyKGV2ZW50KSxcbiAgICAgICAgICAgIHNoaWZ0OiBldmVudC5zaGlmdEtleSxcbiAgICAgICAgICAgIG1vZGlmaWVyOiB0aGlzLl9nZXRLZXlNb2RpZmllcihldmVudClcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihiYXNlTmFtZSwgZXZlbnQgPT4ge1xuICAgICAgICBpZiAoYmFzZU5hbWUgPT09IFwiYmx1clwiKSB7XG4gICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS5mb2N1c2VkIHx8ICFldmVudC5yZWxhdGVkVGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnREYXRhLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChiYXNlTmFtZSA9PT0gXCJmb2N1c1wiKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmZvY3VzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudERhdGEuZm9jdXNlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF2YWx1ZUdldHRlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICBuYW1lOiBldmVudE5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVHZXR0ZXIoZXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBfc2V0RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgZWxlbWVudERhdGEsIG5hbWVzLCBnZXR0ZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtiYXNlTmFtZSwgZXZlbnROYW1lXSBvZiBuYW1lcykge1xuICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gXCJBY3Rpb25cIiB8fCB0aGlzLmRhdGEuYWN0aW9ucz8uW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gXCJGb2N1c1wiIHx8IGV2ZW50TmFtZSA9PT0gXCJCbHVyXCIpIHtcbiAgICAgICAgICBlbGVtZW50RGF0YSB8fD0ge1xuICAgICAgICAgICAgZm9jdXNlZDogZmFsc2VcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZWxlbWVudERhdGEsIGJhc2VOYW1lLCBldmVudE5hbWUsIGdldHRlcik7XG4gICAgICAgIGlmIChldmVudE5hbWUgPT09IFwiRm9jdXNcIiAmJiAhdGhpcy5kYXRhLmFjdGlvbnM/LkJsdXIpIHtcbiAgICAgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGVsZW1lbnREYXRhLCBcImJsdXJcIiwgXCJCbHVyXCIsIG51bGwpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJCbHVyXCIgJiYgIXRoaXMuZGF0YS5hY3Rpb25zPy5Gb2N1cykge1xuICAgICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZWxlbWVudERhdGEsIFwiZm9jdXNcIiwgXCJGb2N1c1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBfc2V0QmFja2dyb3VuZENvbG9yKGVsZW1lbnQpIHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZGF0YS5iYWNrZ3JvdW5kQ29sb3IgfHwgbnVsbDtcbiAgICBlbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yID09PSBudWxsID8gXCJ0cmFuc3BhcmVudFwiIDogVXRpbC5tYWtlSGV4Q29sb3IoY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSk7XG4gIH1cbiAgX3NldFRleHRTdHlsZShlbGVtZW50KSB7XG4gICAgY29uc3QgVEVYVF9BTElHTk1FTlQgPSBbXCJsZWZ0XCIsIFwiY2VudGVyXCIsIFwicmlnaHRcIl07XG4gICAgY29uc3Qge1xuICAgICAgZm9udENvbG9yXG4gICAgfSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE7XG4gICAgY29uc3QgZm9udFNpemUgPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnRTaXplIHx8IGFubm90YXRpb25fbGF5ZXJfREVGQVVMVF9GT05UX1NJWkU7XG4gICAgY29uc3Qgc3R5bGUgPSBlbGVtZW50LnN0eWxlO1xuICAgIGxldCBjb21wdXRlZEZvbnRTaXplO1xuICAgIGNvbnN0IEJPUkRFUl9TSVpFID0gMjtcbiAgICBjb25zdCByb3VuZFRvT25lRGVjaW1hbCA9IHggPT4gTWF0aC5yb3VuZCgxMCAqIHgpIC8gMTA7XG4gICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0gLSBCT1JERVJfU0laRSk7XG4gICAgICBjb25zdCBudW1iZXJPZkxpbmVzID0gTWF0aC5yb3VuZChoZWlnaHQgLyAoTElORV9GQUNUT1IgKiBmb250U2l6ZSkpIHx8IDE7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gaGVpZ2h0IC8gbnVtYmVyT2ZMaW5lcztcbiAgICAgIGNvbXB1dGVkRm9udFNpemUgPSBNYXRoLm1pbihmb250U2l6ZSwgcm91bmRUb09uZURlY2ltYWwobGluZUhlaWdodCAvIExJTkVfRkFDVE9SKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0gLSBCT1JERVJfU0laRSk7XG4gICAgICBjb21wdXRlZEZvbnRTaXplID0gTWF0aC5taW4oZm9udFNpemUsIHJvdW5kVG9PbmVEZWNpbWFsKGhlaWdodCAvIExJTkVfRkFDVE9SKSk7XG4gICAgfVxuICAgIHN0eWxlLmZvbnRTaXplID0gYGNhbGMoJHtjb21wdXRlZEZvbnRTaXplfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO1xuICAgIHN0eWxlLmNvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoZm9udENvbG9yWzBdLCBmb250Q29sb3JbMV0sIGZvbnRDb2xvclsyXSk7XG4gICAgaWYgKHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50ICE9PSBudWxsKSB7XG4gICAgICBzdHlsZS50ZXh0QWxpZ24gPSBURVhUX0FMSUdOTUVOVFt0aGlzLmRhdGEudGV4dEFsaWdubWVudF07XG4gICAgfVxuICB9XG4gIF9zZXRSZXF1aXJlZChlbGVtZW50LCBpc1JlcXVpcmVkKSB7XG4gICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIiwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwicmVxdWlyZWRcIik7XG4gICAgfVxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1yZXF1aXJlZFwiLCBpc1JlcXVpcmVkKTtcbiAgfVxufVxuY2xhc3MgVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gcGFyYW1ldGVycy5yZW5kZXJGb3JtcyB8fCBwYXJhbWV0ZXJzLmRhdGEuaGFzT3duQ2FudmFzIHx8ICFwYXJhbWV0ZXJzLmRhdGEuaGFzQXBwZWFyYW5jZSAmJiAhIXBhcmFtZXRlcnMuZGF0YS5maWVsZFZhbHVlO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZVxuICAgIH0pO1xuICB9XG4gIHNldFByb3BlcnR5T25TaWJsaW5ncyhiYXNlLCBrZXksIHZhbHVlLCBrZXlJblN0b3JhZ2UpIHtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoYmFzZS5uYW1lLCBiYXNlLmlkKSkge1xuICAgICAgaWYgKGVsZW1lbnQuZG9tRWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmRvbUVsZW1lbnRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShlbGVtZW50LmlkLCB7XG4gICAgICAgIFtrZXlJblN0b3JhZ2VdOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBjb25zdCBpZCA9IHRoaXMuZGF0YS5pZDtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dFdpZGdldEFubm90YXRpb25cIik7XG4gICAgbGV0IGVsZW1lbnQgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlbmRlckZvcm1zKSB7XG4gICAgICBjb25zdCBzdG9yZWREYXRhID0gc3RvcmFnZS5nZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWVcbiAgICAgIH0pO1xuICAgICAgbGV0IHRleHRDb250ZW50ID0gc3RvcmVkRGF0YS52YWx1ZSB8fCBcIlwiO1xuICAgICAgY29uc3QgbWF4TGVuID0gc3RvcmFnZS5nZXRWYWx1ZShpZCwge1xuICAgICAgICBjaGFyTGltaXQ6IHRoaXMuZGF0YS5tYXhMZW5cbiAgICAgIH0pLmNoYXJMaW1pdDtcbiAgICAgIGlmIChtYXhMZW4gJiYgdGV4dENvbnRlbnQubGVuZ3RoID4gbWF4TGVuKSB7XG4gICAgICAgIHRleHRDb250ZW50ID0gdGV4dENvbnRlbnQuc2xpY2UoMCwgbWF4TGVuKTtcbiAgICAgIH1cbiAgICAgIGxldCBmaWVsZEZvcm1hdHRlZFZhbHVlcyA9IHN0b3JlZERhdGEuZm9ybWF0dGVkVmFsdWUgfHwgdGhpcy5kYXRhLnRleHRDb250ZW50Py5qb2luKFwiXFxuXCIpIHx8IG51bGw7XG4gICAgICBpZiAoZmllbGRGb3JtYXR0ZWRWYWx1ZXMgJiYgdGhpcy5kYXRhLmNvbWIpIHtcbiAgICAgICAgZmllbGRGb3JtYXR0ZWRWYWx1ZXMgPSBmaWVsZEZvcm1hdHRlZFZhbHVlcy5yZXBsYWNlQWxsKC9cXHMrL2csIFwiXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudERhdGEgPSB7XG4gICAgICAgIHVzZXJWYWx1ZTogdGV4dENvbnRlbnQsXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiBmaWVsZEZvcm1hdHRlZFZhbHVlcyxcbiAgICAgICAgbGFzdENvbW1pdHRlZFZhbHVlOiBudWxsLFxuICAgICAgICBjb21taXRLZXk6IDEsXG4gICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHtcbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcbiAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IGZpZWxkRm9ybWF0dGVkVmFsdWVzID8/IHRleHRDb250ZW50O1xuICAgICAgICBpZiAodGhpcy5kYXRhLmRvTm90U2Nyb2xsKSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBcImhpZGRlblwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBlbGVtZW50LnR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBmaWVsZEZvcm1hdHRlZFZhbHVlcyA/PyB0ZXh0Q29udGVudCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZG9Ob3RTY3JvbGwpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93WCA9IFwiaGlkZGVuXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRhdGEuaGFzT3duQ2FudmFzKSB7XG4gICAgICAgIGVsZW1lbnQuaGlkZGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIEdldEVsZW1lbnRzQnlOYW1lU2V0LmFkZChlbGVtZW50KTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGlkKTtcbiAgICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgICBlbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgICAgZWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuICAgICAgdGhpcy5fc2V0UmVxdWlyZWQoZWxlbWVudCwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgIGlmIChtYXhMZW4pIHtcbiAgICAgICAgZWxlbWVudC5tYXhMZW5ndGggPSBtYXhMZW47XG4gICAgICB9XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG4gICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5T25TaWJsaW5ncyhlbGVtZW50LCBcInZhbHVlXCIsIGV2ZW50LnRhcmdldC52YWx1ZSwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgZWxlbWVudERhdGEuZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgfSk7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgPz8gXCJcIjtcbiAgICAgICAgZWxlbWVudC52YWx1ZSA9IGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgZWxlbWVudERhdGEuZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgfSk7XG4gICAgICBsZXQgYmx1ckxpc3RlbmVyID0gZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZm9ybWF0dGVkVmFsdWVcbiAgICAgICAgfSA9IGVsZW1lbnREYXRhO1xuICAgICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgIT09IG51bGwgJiYgZm9ybWF0dGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5mb2N1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgIH0gPSBldmVudDtcbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudXNlclZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSA9IHRhcmdldC52YWx1ZTtcbiAgICAgICAgICBlbGVtZW50RGF0YS5jb21taXRLZXkgPSAxO1xuICAgICAgICAgIGlmICghdGhpcy5kYXRhLmFjdGlvbnM/LkZvY3VzKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dFbGVtZW50QW5kSGlkZUNhbnZhcyhqc0V2ZW50LnRhcmdldCk7XG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICAgIHZhbHVlKGV2ZW50KSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IGV2ZW50LmRldGFpbC52YWx1ZSA/PyBcIlwiO1xuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnREYXRhLnVzZXJWYWx1ZS50b1N0cmluZygpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUoZXZlbnQpIHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlXG4gICAgICAgICAgICAgIH0gPSBldmVudC5kZXRhaWw7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLmZvcm1hdHRlZFZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgICAgICAgIGlmIChmb3JtYXR0ZWRWYWx1ZSAhPT0gbnVsbCAmJiBmb3JtYXR0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LnRhcmdldCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWxSYW5nZShldmVudCkge1xuICAgICAgICAgICAgICBldmVudC50YXJnZXQuc2V0U2VsZWN0aW9uUmFuZ2UoLi4uZXZlbnQuZGV0YWlsLnNlbFJhbmdlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGFyTGltaXQ6IGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGNoYXJMaW1pdFxuICAgICAgICAgICAgICB9ID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgICAgIH0gPSBldmVudDtcbiAgICAgICAgICAgICAgaWYgKGNoYXJMaW1pdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIiwgY2hhckxpbWl0KTtcbiAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZWxlbWVudERhdGEudXNlclZhbHVlO1xuICAgICAgICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA8PSBjaGFyTGltaXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBjaGFyTGltaXQpO1xuICAgICAgICAgICAgICB0YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgd2lsbENvbW1pdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGNvbW1pdEtleTogMSxcbiAgICAgICAgICAgICAgICAgIHNlbFN0YXJ0OiB0YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgICBzZWxFbmQ6IHRhcmdldC5zZWxlY3Rpb25FbmRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGFjdGlvbnMsIGpzRXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBldmVudCA9PiB7XG4gICAgICAgICAgZWxlbWVudERhdGEuY29tbWl0S2V5ID0gMTtcbiAgICAgICAgICBsZXQgY29tbWl0S2V5ID0gLTE7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgY29tbWl0S2V5ID0gMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiICYmICF0aGlzLmRhdGEubXVsdGlMaW5lKSB7XG4gICAgICAgICAgICBjb21taXRLZXkgPSAyO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIlRhYlwiKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5jb21taXRLZXkgPSAzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29tbWl0S2V5ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgZWxlbWVudERhdGEudXNlclZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIHdpbGxDb21taXQ6IHRydWUsXG4gICAgICAgICAgICAgIGNvbW1pdEtleSxcbiAgICAgICAgICAgICAgc2VsU3RhcnQ6IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgc2VsRW5kOiBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBfYmx1ckxpc3RlbmVyID0gYmx1ckxpc3RlbmVyO1xuICAgICAgICBibHVyTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLmZvY3VzZWQgfHwgIWV2ZW50LnJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuYWN0aW9ucz8uQmx1cikge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgZWxlbWVudERhdGEudXNlclZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbW1pdEtleTogZWxlbWVudERhdGEuY29tbWl0S2V5LFxuICAgICAgICAgICAgICAgIHNlbFN0YXJ0OiBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgc2VsRW5kOiBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfYmx1ckxpc3RlbmVyKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuYWN0aW9ucz8uS2V5c3Ryb2tlKSB7XG4gICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgICAgZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgICB9ID0gZXZlbnQ7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgc2VsZWN0aW9uRW5kXG4gICAgICAgICAgICB9ID0gdGFyZ2V0O1xuICAgICAgICAgICAgbGV0IHNlbFN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgIHNlbEVuZCA9IHNlbGVjdGlvbkVuZDtcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVXb3JkQmFja3dhcmRcIjpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHZhbHVlLnN1YnN0cmluZygwLCBzZWxlY3Rpb25TdGFydCkubWF0Y2goL1xcdypbXlxcd10qJC8pO1xuICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbFN0YXJ0IC09IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5zdWJzdHJpbmcoc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9eW15cXHddKlxcdyovKTtcbiAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxFbmQgKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCI6XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID09PSBzZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgICAgICAgICAgIHNlbFN0YXJ0IC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlQ29udGVudEZvcndhcmRcIjpcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPT09IHNlbGVjdGlvbkVuZCkge1xuICAgICAgICAgICAgICAgICAgc2VsRW5kICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICBjaGFuZ2U6IGRhdGEgfHwgXCJcIixcbiAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWxTdGFydCxcbiAgICAgICAgICAgICAgICBzZWxFbmRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgZWxlbWVudERhdGEsIFtbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChibHVyTGlzdGVuZXIpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBibHVyTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGF0YS5jb21iKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkV2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdO1xuICAgICAgICBjb25zdCBjb21iV2lkdGggPSBmaWVsZFdpZHRoIC8gbWF4TGVuO1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJjb21iXCIpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmxldHRlclNwYWNpbmcgPSBgY2FsYygke2NvbWJXaWR0aH1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikgLSAxY2gpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5kYXRhLmZpZWxkVmFsdWU7XG4gICAgICBlbGVtZW50LnN0eWxlLnZlcnRpY2FsQWxpZ24gPSBcIm1pZGRsZVwiO1xuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJ0YWJsZS1jZWxsXCI7XG4gICAgICBpZiAodGhpcy5kYXRhLmhhc093bkNhbnZhcykge1xuICAgICAgICBlbGVtZW50LmhpZGRlbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3NldFRleHRTdHlsZShlbGVtZW50KTtcbiAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgU2lnbmF0dXJlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6ICEhcGFyYW1ldGVycy5kYXRhLmhhc093bkNhbnZhc1xuICAgIH0pO1xuICB9XG59XG5jbGFzcyBDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3QgaWQgPSBkYXRhLmlkO1xuICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgIHZhbHVlOiBkYXRhLmV4cG9ydFZhbHVlID09PSBkYXRhLmZpZWxkVmFsdWVcbiAgICB9KS52YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlICE9PSBcIk9mZlwiO1xuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uXCIsIFwiY2hlY2tCb3hcIik7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBHZXRFbGVtZW50c0J5TmFtZVNldC5hZGQoZWxlbWVudCk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgaWQpO1xuICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBkYXRhLnJlYWRPbmx5O1xuICAgIHRoaXMuX3NldFJlcXVpcmVkKGVsZW1lbnQsIHRoaXMuZGF0YS5yZXF1aXJlZCk7XG4gICAgZWxlbWVudC50eXBlID0gXCJjaGVja2JveFwiO1xuICAgIGVsZW1lbnQubmFtZSA9IGRhdGEuZmllbGROYW1lO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHRydWUpO1xuICAgIH1cbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImV4cG9ydFZhbHVlXCIsIGRhdGEuZXhwb3J0VmFsdWUpO1xuICAgIGVsZW1lbnQudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZXZlbnQgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lLFxuICAgICAgICBjaGVja2VkXG4gICAgICB9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgZm9yIChjb25zdCBjaGVja2JveCBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShuYW1lLCBpZCkpIHtcbiAgICAgICAgY29uc3QgY3VyQ2hlY2tlZCA9IGNoZWNrZWQgJiYgY2hlY2tib3guZXhwb3J0VmFsdWUgPT09IGRhdGEuZXhwb3J0VmFsdWU7XG4gICAgICAgIGlmIChjaGVja2JveC5kb21FbGVtZW50KSB7XG4gICAgICAgICAgY2hlY2tib3guZG9tRWxlbWVudC5jaGVja2VkID0gY3VyQ2hlY2tlZDtcbiAgICAgICAgfVxuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGNoZWNrYm94LmlkLCB7XG4gICAgICAgICAgdmFsdWU6IGN1ckNoZWNrZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgIHZhbHVlOiBjaGVja2VkXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSB8fCBcIk9mZlwiO1xuICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWQgPSBkZWZhdWx0VmFsdWUgPT09IGRhdGEuZXhwb3J0VmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICB2YWx1ZShldmVudCkge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWQgPSBldmVudC5kZXRhaWwudmFsdWUgIT09IFwiT2ZmXCI7XG4gICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBldmVudC50YXJnZXQuY2hlY2tlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIG51bGwsIFtbXCJjaGFuZ2VcIiwgXCJWYWxpZGF0ZVwiXSwgW1wiY2hhbmdlXCIsIFwiQWN0aW9uXCJdLCBbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogcGFyYW1ldGVycy5yZW5kZXJGb3Jtc1xuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvblwiLCBcInJhZGlvQnV0dG9uXCIpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3QgaWQgPSBkYXRhLmlkO1xuICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgIHZhbHVlOiBkYXRhLmZpZWxkVmFsdWUgPT09IGRhdGEuYnV0dG9uVmFsdWVcbiAgICB9KS52YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlICE9PSBkYXRhLmJ1dHRvblZhbHVlO1xuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZm9yIChjb25zdCByYWRpbyBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShkYXRhLmZpZWxkTmFtZSwgaWQpKSB7XG4gICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUocmFkaW8uaWQsIHtcbiAgICAgICAgICB2YWx1ZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgR2V0RWxlbWVudHNCeU5hbWVTZXQuYWRkKGVsZW1lbnQpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGlkKTtcbiAgICBlbGVtZW50LmRpc2FibGVkID0gZGF0YS5yZWFkT25seTtcbiAgICB0aGlzLl9zZXRSZXF1aXJlZChlbGVtZW50LCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuICAgIGVsZW1lbnQudHlwZSA9IFwicmFkaW9cIjtcbiAgICBlbGVtZW50Lm5hbWUgPSBkYXRhLmZpZWxkTmFtZTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB0cnVlKTtcbiAgICB9XG4gICAgZWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBldmVudCA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNoZWNrZWRcbiAgICAgIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICBmb3IgKGNvbnN0IHJhZGlvIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKG5hbWUsIGlkKSkge1xuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKHJhZGlvLmlkLCB7XG4gICAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZTogY2hlY2tlZFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwicmVzZXRmb3JtXCIsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRhdGEuZGVmYXVsdEZpZWxkVmFsdWU7XG4gICAgICBldmVudC50YXJnZXQuY2hlY2tlZCA9IGRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0VmFsdWUgPT09IGRhdGEuYnV0dG9uVmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG4gICAgICBjb25zdCBwZGZCdXR0b25WYWx1ZSA9IGRhdGEuYnV0dG9uVmFsdWU7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICB2YWx1ZTogZXZlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHBkZkJ1dHRvblZhbHVlID09PSBldmVudC5kZXRhaWwudmFsdWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJhZGlvIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKGV2ZW50LnRhcmdldC5uYW1lKSkge1xuICAgICAgICAgICAgICBjb25zdCBjdXJDaGVja2VkID0gY2hlY2tlZCAmJiByYWRpby5pZCA9PT0gaWQ7XG4gICAgICAgICAgICAgIGlmIChyYWRpby5kb21FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmFkaW8uZG9tRWxlbWVudC5jaGVja2VkID0gY3VyQ2hlY2tlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKHJhZGlvLmlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGN1ckNoZWNrZWRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIG51bGwsIFtbXCJjaGFuZ2VcIiwgXCJWYWxpZGF0ZVwiXSwgW1wiY2hhbmdlXCIsIFwiQWN0aW9uXCJdLCBbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgTGlua0Fubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlnbm9yZUJvcmRlcjogcGFyYW1ldGVycy5kYXRhLmhhc0FwcGVhcmFuY2VcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gc3VwZXIucmVuZGVyKCk7XG4gICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uXCIsIFwicHVzaEJ1dHRvblwiKTtcbiAgICBjb25zdCBsaW5rRWxlbWVudCA9IGNvbnRhaW5lci5sYXN0Q2hpbGQ7XG4gICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zICYmIGxpbmtFbGVtZW50KSB7XG4gICAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhsaW5rRWxlbWVudCk7XG4gICAgICBsaW5rRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwganNFdmVudCA9PiB7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveCh7fSwganNFdmVudCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHBhcmFtZXRlcnMucmVuZGVyRm9ybXNcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImNob2ljZVdpZGdldEFubm90YXRpb25cIik7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgY29uc3QgaWQgPSB0aGlzLmRhdGEuaWQ7XG4gICAgY29uc3Qgc3RvcmVkRGF0YSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmRhdGEuZmllbGRWYWx1ZVxuICAgIH0pO1xuICAgIGNvbnN0IHNlbGVjdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xuICAgIEdldEVsZW1lbnRzQnlOYW1lU2V0LmFkZChzZWxlY3RFbGVtZW50KTtcbiAgICBzZWxlY3RFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBpZCk7XG4gICAgc2VsZWN0RWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGF0YS5yZWFkT25seTtcbiAgICB0aGlzLl9zZXRSZXF1aXJlZChzZWxlY3RFbGVtZW50LCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuICAgIHNlbGVjdEVsZW1lbnQubmFtZSA9IHRoaXMuZGF0YS5maWVsZE5hbWU7XG4gICAgc2VsZWN0RWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuICAgIGxldCBhZGRBbkVtcHR5RW50cnkgPSB0aGlzLmRhdGEuY29tYm8gJiYgdGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoID4gMDtcbiAgICBpZiAoIXRoaXMuZGF0YS5jb21ibykge1xuICAgICAgc2VsZWN0RWxlbWVudC5zaXplID0gdGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoO1xuICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aVNlbGVjdCkge1xuICAgICAgICBzZWxlY3RFbGVtZW50Lm11bHRpcGxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwicmVzZXRmb3JtXCIsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZTtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHNlbGVjdEVsZW1lbnQub3B0aW9ucykge1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBvcHRpb24udmFsdWUgPT09IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLmRhdGEub3B0aW9ucykge1xuICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9uLmRpc3BsYXlWYWx1ZTtcbiAgICAgIG9wdGlvbkVsZW1lbnQudmFsdWUgPSBvcHRpb24uZXhwb3J0VmFsdWU7XG4gICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZS5pbmNsdWRlcyhvcHRpb24uZXhwb3J0VmFsdWUpKSB7XG4gICAgICAgIG9wdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgdHJ1ZSk7XG4gICAgICAgIGFkZEFuRW1wdHlFbnRyeSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgc2VsZWN0RWxlbWVudC5hcHBlbmQob3B0aW9uRWxlbWVudCk7XG4gICAgfVxuICAgIGxldCByZW1vdmVFbXB0eUVudHJ5ID0gbnVsbDtcbiAgICBpZiAoYWRkQW5FbXB0eUVudHJ5KSB7XG4gICAgICBjb25zdCBub25lT3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICBub25lT3B0aW9uRWxlbWVudC52YWx1ZSA9IFwiIFwiO1xuICAgICAgbm9uZU9wdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIHRydWUpO1xuICAgICAgbm9uZU9wdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgdHJ1ZSk7XG4gICAgICBzZWxlY3RFbGVtZW50LnByZXBlbmQobm9uZU9wdGlvbkVsZW1lbnQpO1xuICAgICAgcmVtb3ZlRW1wdHlFbnRyeSA9ICgpID0+IHtcbiAgICAgICAgbm9uZU9wdGlvbkVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIHNlbGVjdEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHJlbW92ZUVtcHR5RW50cnkpO1xuICAgICAgICByZW1vdmVFbXB0eUVudHJ5ID0gbnVsbDtcbiAgICAgIH07XG4gICAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCByZW1vdmVFbXB0eUVudHJ5KTtcbiAgICB9XG4gICAgY29uc3QgZ2V0VmFsdWUgPSBpc0V4cG9ydCA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gaXNFeHBvcnQgPyBcInZhbHVlXCIgOiBcInRleHRDb250ZW50XCI7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIG11bHRpcGxlXG4gICAgICB9ID0gc2VsZWN0RWxlbWVudDtcbiAgICAgIGlmICghbXVsdGlwbGUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuc2VsZWN0ZWRJbmRleCA9PT0gLTEgPyBudWxsIDogb3B0aW9uc1tvcHRpb25zLnNlbGVjdGVkSW5kZXhdW25hbWVdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChvcHRpb25zLCBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKS5tYXAob3B0aW9uID0+IG9wdGlvbltuYW1lXSk7XG4gICAgfTtcbiAgICBsZXQgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgY29uc3QgZ2V0SXRlbXMgPSBldmVudCA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZXZlbnQudGFyZ2V0Lm9wdGlvbnM7XG4gICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG9wdGlvbnMsIG9wdGlvbiA9PiAoe1xuICAgICAgICBkaXNwbGF5VmFsdWU6IG9wdGlvbi50ZXh0Q29udGVudCxcbiAgICAgICAgZXhwb3J0VmFsdWU6IG9wdGlvbi52YWx1ZVxuICAgICAgfSkpO1xuICAgIH07XG4gICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG4gICAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICB2YWx1ZShldmVudCkge1xuICAgICAgICAgICAgcmVtb3ZlRW1wdHlFbnRyeT8uKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LmRldGFpbC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygc2VsZWN0RWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHZhbHVlcy5oYXMob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVsdGlwbGVTZWxlY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVtb3ZlKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gc2VsZWN0RWxlbWVudC5vcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBldmVudC5kZXRhaWwucmVtb3ZlO1xuICAgICAgICAgICAgb3B0aW9uc1tpbmRleF0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQucmVtb3ZlKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXguY2FsbChvcHRpb25zLCBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICAgICAgICAgICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1swXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpLFxuICAgICAgICAgICAgICBpdGVtczogZ2V0SXRlbXMoZXZlbnQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xlYXIoZXZlbnQpIHtcbiAgICAgICAgICAgIHdoaWxlIChzZWxlY3RFbGVtZW50Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnJlbW92ZSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluc2VydChldmVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICBleHBvcnRWYWx1ZVxuICAgICAgICAgICAgfSA9IGV2ZW50LmRldGFpbC5pbnNlcnQ7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RDaGlsZCA9IHNlbGVjdEVsZW1lbnQuY2hpbGRyZW5baW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgICAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gZGlzcGxheVZhbHVlO1xuICAgICAgICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IGV4cG9ydFZhbHVlO1xuICAgICAgICAgICAgaWYgKHNlbGVjdENoaWxkKSB7XG4gICAgICAgICAgICAgIHNlbGVjdENoaWxkLmJlZm9yZShvcHRpb25FbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kKG9wdGlvbkVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSksXG4gICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhldmVudClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpdGVtcyhldmVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBpdGVtc1xuICAgICAgICAgICAgfSA9IGV2ZW50LmRldGFpbDtcbiAgICAgICAgICAgIHdoaWxlIChzZWxlY3RFbGVtZW50Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnJlbW92ZSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgIGV4cG9ydFZhbHVlXG4gICAgICAgICAgICAgIH0gPSBpdGVtO1xuICAgICAgICAgICAgICBjb25zdCBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgICAgICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IGRpc3BsYXlWYWx1ZTtcbiAgICAgICAgICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IGV4cG9ydFZhbHVlO1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LmFwcGVuZChvcHRpb25FbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWxlY3RFbGVtZW50Lm9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50Lm9wdGlvbnNbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSksXG4gICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhldmVudClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbmRpY2VzKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRpY2VzID0gbmV3IFNldChldmVudC5kZXRhaWwuaW5kaWNlcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBldmVudC50YXJnZXQub3B0aW9ucykge1xuICAgICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBpbmRpY2VzLmhhcyhvcHRpb24uaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlZGl0YWJsZShldmVudCkge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmRpc2FibGVkID0gIWV2ZW50LmRldGFpbC5lZGl0YWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChhY3Rpb25zLCBqc0V2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBleHBvcnRWYWx1ZSA9IGdldFZhbHVlKHRydWUpO1xuICAgICAgICBjb25zdCBjaGFuZ2UgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICB2YWx1ZTogZXhwb3J0VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkVmFsdWVzLFxuICAgICAgICAgICAgY2hhbmdlLFxuICAgICAgICAgICAgY2hhbmdlRXg6IGV4cG9ydFZhbHVlLFxuICAgICAgICAgICAgd2lsbENvbW1pdDogZmFsc2UsXG4gICAgICAgICAgICBjb21taXRLZXk6IDEsXG4gICAgICAgICAgICBrZXlEb3duOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKHNlbGVjdEVsZW1lbnQsIG51bGwsIFtbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdLCBbXCJpbnB1dFwiLCBcIkFjdGlvblwiXSwgW1wiaW5wdXRcIiwgXCJWYWxpZGF0ZVwiXV0sIGV2ZW50ID0+IGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEuY29tYm8pIHtcbiAgICAgIHRoaXMuX3NldFRleHRTdHlsZShzZWxlY3RFbGVtZW50KTtcbiAgICB9IGVsc2Uge31cbiAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3Ioc2VsZWN0RWxlbWVudCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoc2VsZWN0RWxlbWVudCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHNlbGVjdEVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGEsXG4gICAgICBlbGVtZW50c1xuICAgIH0gPSBwYXJhbWV0ZXJzO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogQW5ub3RhdGlvbkVsZW1lbnQuX2hhc1BvcHVwRGF0YShkYXRhKVxuICAgIH0pO1xuICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50cztcbiAgICB0aGlzLnBvcHVwID0gbnVsbDtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInBvcHVwQW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCBwb3B1cCA9IHRoaXMucG9wdXAgPSBuZXcgUG9wdXBFbGVtZW50KHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIsXG4gICAgICBjb2xvcjogdGhpcy5kYXRhLmNvbG9yLFxuICAgICAgdGl0bGVPYmo6IHRoaXMuZGF0YS50aXRsZU9iaixcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlLFxuICAgICAgY29udGVudHNPYmo6IHRoaXMuZGF0YS5jb250ZW50c09iaixcbiAgICAgIHJpY2hUZXh0OiB0aGlzLmRhdGEucmljaFRleHQsXG4gICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCxcbiAgICAgIHBhcmVudFJlY3Q6IHRoaXMuZGF0YS5wYXJlbnRSZWN0IHx8IG51bGwsXG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgZWxlbWVudHM6IHRoaXMuZWxlbWVudHMsXG4gICAgICBvcGVuOiB0aGlzLmRhdGEub3BlblxuICAgIH0pO1xuICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5lbGVtZW50cykge1xuICAgICAgZWxlbWVudC5wb3B1cCA9IHBvcHVwO1xuICAgICAgZWxlbWVudElkcy5wdXNoKGVsZW1lbnQuZGF0YS5pZCk7XG4gICAgICBlbGVtZW50LmFkZEhpZ2hsaWdodEFyZWEoKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiLCBlbGVtZW50SWRzLm1hcChpZCA9PiBgJHtBbm5vdGF0aW9uUHJlZml4fSR7aWR9YCkuam9pbihcIixcIikpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgUG9wdXBFbGVtZW50IHtcbiAgI2JvdW5kS2V5RG93biA9IHRoaXMuI2tleURvd24uYmluZCh0aGlzKTtcbiAgI2JvdW5kSGlkZSA9IHRoaXMuI2hpZGUuYmluZCh0aGlzKTtcbiAgI2JvdW5kU2hvdyA9IHRoaXMuI3Nob3cuYmluZCh0aGlzKTtcbiAgI2JvdW5kVG9nZ2xlID0gdGhpcy4jdG9nZ2xlLmJpbmQodGhpcyk7XG4gICNjb2xvciA9IG51bGw7XG4gICNjb250YWluZXIgPSBudWxsO1xuICAjY29udGVudHNPYmogPSBudWxsO1xuICAjZGF0ZU9iaiA9IG51bGw7XG4gICNlbGVtZW50cyA9IG51bGw7XG4gICNwYXJlbnQgPSBudWxsO1xuICAjcGFyZW50UmVjdCA9IG51bGw7XG4gICNwaW5uZWQgPSBmYWxzZTtcbiAgI3BvcHVwID0gbnVsbDtcbiAgI3Bvc2l0aW9uID0gbnVsbDtcbiAgI3JlY3QgPSBudWxsO1xuICAjcmljaFRleHQgPSBudWxsO1xuICAjdGl0bGVPYmogPSBudWxsO1xuICAjdXBkYXRlcyA9IG51bGw7XG4gICN3YXNWaXNpYmxlID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjb250YWluZXIsXG4gICAgY29sb3IsXG4gICAgZWxlbWVudHMsXG4gICAgdGl0bGVPYmosXG4gICAgbW9kaWZpY2F0aW9uRGF0ZSxcbiAgICBjb250ZW50c09iaixcbiAgICByaWNoVGV4dCxcbiAgICBwYXJlbnQsXG4gICAgcmVjdCxcbiAgICBwYXJlbnRSZWN0LFxuICAgIG9wZW5cbiAgfSkge1xuICAgIHRoaXMuI2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLiN0aXRsZU9iaiA9IHRpdGxlT2JqO1xuICAgIHRoaXMuI2NvbnRlbnRzT2JqID0gY29udGVudHNPYmo7XG4gICAgdGhpcy4jcmljaFRleHQgPSByaWNoVGV4dDtcbiAgICB0aGlzLiNwYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy4jY29sb3IgPSBjb2xvcjtcbiAgICB0aGlzLiNyZWN0ID0gcmVjdDtcbiAgICB0aGlzLiNwYXJlbnRSZWN0ID0gcGFyZW50UmVjdDtcbiAgICB0aGlzLiNlbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgIHRoaXMuI2RhdGVPYmogPSBQREZEYXRlU3RyaW5nLnRvRGF0ZU9iamVjdChtb2RpZmljYXRpb25EYXRlKTtcbiAgICB0aGlzLnRyaWdnZXIgPSBlbGVtZW50cy5mbGF0TWFwKGUgPT4gZS5nZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkpO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLnRyaWdnZXIpIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuI2JvdW5kVG9nZ2xlKTtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgdGhpcy4jYm91bmRTaG93KTtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgdGhpcy4jYm91bmRIaWRlKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInBvcHVwVHJpZ2dlckFyZWFcIik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgZWxlbWVudC5jb250YWluZXI/LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5RG93bik7XG4gICAgfVxuICAgIHRoaXMuI2NvbnRhaW5lci5oaWRkZW4gPSB0cnVlO1xuICAgIGlmIChvcGVuKSB7XG4gICAgICB0aGlzLiN0b2dnbGUoKTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLiNwb3B1cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwb3B1cCA9IHRoaXMuI3BvcHVwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBwb3B1cC5jbGFzc05hbWUgPSBcInBvcHVwXCI7XG4gICAgaWYgKHRoaXMuI2NvbG9yKSB7XG4gICAgICBjb25zdCBiYXNlQ29sb3IgPSBwb3B1cC5zdHlsZS5vdXRsaW5lQ29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi50aGlzLiNjb2xvcik7XG4gICAgICBpZiAoQ1NTLnN1cHBvcnRzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBcImNvbG9yLW1peChpbiBzcmdiLCByZWQgMzAlLCB3aGl0ZSlcIikpIHtcbiAgICAgICAgcG9wdXAuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0gMzAlLCB3aGl0ZSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgQkFDS0dST1VORF9FTkxJR0hUID0gMC43O1xuICAgICAgICBwb3B1cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi50aGlzLiNjb2xvci5tYXAoYyA9PiBNYXRoLmZsb29yKEJBQ0tHUk9VTkRfRU5MSUdIVCAqICgyNTUgLSBjKSArIGMpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIGhlYWRlci5jbGFzc05hbWUgPSBcImhlYWRlclwiO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImgxXCIpO1xuICAgIGhlYWRlci5hcHBlbmQodGl0bGUpO1xuICAgICh7XG4gICAgICBkaXI6IHRpdGxlLmRpcixcbiAgICAgIHN0cjogdGl0bGUudGV4dENvbnRlbnRcbiAgICB9ID0gdGhpcy4jdGl0bGVPYmopO1xuICAgIHBvcHVwLmFwcGVuZChoZWFkZXIpO1xuICAgIGlmICh0aGlzLiNkYXRlT2JqKSB7XG4gICAgICBjb25zdCBtb2RpZmljYXRpb25EYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICBtb2RpZmljYXRpb25EYXRlLmNsYXNzTGlzdC5hZGQoXCJwb3B1cERhdGVcIik7XG4gICAgICBtb2RpZmljYXRpb25EYXRlLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLWFubm90YXRpb24tZGF0ZS1zdHJpbmdcIik7XG4gICAgICBtb2RpZmljYXRpb25EYXRlLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1hcmdzXCIsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZGF0ZTogdGhpcy4jZGF0ZU9iai50b0xvY2FsZURhdGVTdHJpbmcoKSxcbiAgICAgICAgdGltZTogdGhpcy4jZGF0ZU9iai50b0xvY2FsZVRpbWVTdHJpbmcoKVxuICAgICAgfSkpO1xuICAgICAgaGVhZGVyLmFwcGVuZChtb2RpZmljYXRpb25EYXRlKTtcbiAgICB9XG4gICAgY29uc3QgaHRtbCA9IHRoaXMuI2h0bWw7XG4gICAgaWYgKGh0bWwpIHtcbiAgICAgIFhmYUxheWVyLnJlbmRlcih7XG4gICAgICAgIHhmYUh0bWw6IGh0bWwsXG4gICAgICAgIGludGVudDogXCJyaWNoVGV4dFwiLFxuICAgICAgICBkaXY6IHBvcHVwXG4gICAgICB9KTtcbiAgICAgIHBvcHVwLmxhc3RDaGlsZC5jbGFzc0xpc3QuYWRkKFwicmljaFRleHRcIiwgXCJwb3B1cENvbnRlbnRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnRlbnRzID0gdGhpcy5fZm9ybWF0Q29udGVudHModGhpcy4jY29udGVudHNPYmopO1xuICAgICAgcG9wdXAuYXBwZW5kKGNvbnRlbnRzKTtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLmFwcGVuZChwb3B1cCk7XG4gIH1cbiAgZ2V0ICNodG1sKCkge1xuICAgIGNvbnN0IHJpY2hUZXh0ID0gdGhpcy4jcmljaFRleHQ7XG4gICAgY29uc3QgY29udGVudHNPYmogPSB0aGlzLiNjb250ZW50c09iajtcbiAgICBpZiAocmljaFRleHQ/LnN0ciAmJiAoIWNvbnRlbnRzT2JqPy5zdHIgfHwgY29udGVudHNPYmouc3RyID09PSByaWNoVGV4dC5zdHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy4jcmljaFRleHQuaHRtbCB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgI2ZvbnRTaXplKCkge1xuICAgIHJldHVybiB0aGlzLiNodG1sPy5hdHRyaWJ1dGVzPy5zdHlsZT8uZm9udFNpemUgfHwgMDtcbiAgfVxuICBnZXQgI2ZvbnRDb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy4jaHRtbD8uYXR0cmlidXRlcz8uc3R5bGU/LmNvbG9yIHx8IG51bGw7XG4gIH1cbiAgI21ha2VQb3B1cENvbnRlbnQodGV4dCkge1xuICAgIGNvbnN0IHBvcHVwTGluZXMgPSBbXTtcbiAgICBjb25zdCBwb3B1cENvbnRlbnQgPSB7XG4gICAgICBzdHI6IHRleHQsXG4gICAgICBodG1sOiB7XG4gICAgICAgIG5hbWU6IFwiZGl2XCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBkaXI6IFwiYXV0b1wiXG4gICAgICAgIH0sXG4gICAgICAgIGNoaWxkcmVuOiBbe1xuICAgICAgICAgIG5hbWU6IFwicFwiLFxuICAgICAgICAgIGNoaWxkcmVuOiBwb3B1cExpbmVzXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBsaW5lQXR0cmlidXRlcyA9IHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGNvbG9yOiB0aGlzLiNmb250Q29sb3IsXG4gICAgICAgIGZvbnRTaXplOiB0aGlzLiNmb250U2l6ZSA/IGBjYWxjKCR7dGhpcy4jZm9udFNpemV9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWAgOiBcIlwiXG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGV4dC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgcG9wdXBMaW5lcy5wdXNoKHtcbiAgICAgICAgbmFtZTogXCJzcGFuXCIsXG4gICAgICAgIHZhbHVlOiBsaW5lLFxuICAgICAgICBhdHRyaWJ1dGVzOiBsaW5lQXR0cmlidXRlc1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBwb3B1cENvbnRlbnQ7XG4gIH1cbiAgX2Zvcm1hdENvbnRlbnRzKHtcbiAgICBzdHIsXG4gICAgZGlyXG4gIH0pIHtcbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgcC5jbGFzc0xpc3QuYWRkKFwicG9wdXBDb250ZW50XCIpO1xuICAgIHAuZGlyID0gZGlyO1xuICAgIGNvbnN0IGxpbmVzID0gc3RyLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG4gICAgICBwLmFwcGVuZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lKSk7XG4gICAgICBpZiAoaSA8IGlpIC0gMSkge1xuICAgICAgICBwLmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfVxuICAja2V5RG93bihldmVudCkge1xuICAgIGlmIChldmVudC5hbHRLZXkgfHwgZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09IFwiRW50ZXJcIiB8fCBldmVudC5rZXkgPT09IFwiRXNjYXBlXCIgJiYgdGhpcy4jcGlubmVkKSB7XG4gICAgICB0aGlzLiN0b2dnbGUoKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlRWRpdGVkKHtcbiAgICByZWN0LFxuICAgIHBvcHVwQ29udGVudFxuICB9KSB7XG4gICAgdGhpcy4jdXBkYXRlcyB8fD0ge1xuICAgICAgY29udGVudHNPYmo6IHRoaXMuI2NvbnRlbnRzT2JqLFxuICAgICAgcmljaFRleHQ6IHRoaXMuI3JpY2hUZXh0XG4gICAgfTtcbiAgICBpZiAocmVjdCkge1xuICAgICAgdGhpcy4jcG9zaXRpb24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAocG9wdXBDb250ZW50KSB7XG4gICAgICB0aGlzLiNyaWNoVGV4dCA9IHRoaXMuI21ha2VQb3B1cENvbnRlbnQocG9wdXBDb250ZW50KTtcbiAgICAgIHRoaXMuI2NvbnRlbnRzT2JqID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy4jcG9wdXA/LnJlbW92ZSgpO1xuICAgIHRoaXMuI3BvcHVwID0gbnVsbDtcbiAgfVxuICByZXNldEVkaXRlZCgpIHtcbiAgICBpZiAoIXRoaXMuI3VwZGF0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKHtcbiAgICAgIGNvbnRlbnRzT2JqOiB0aGlzLiNjb250ZW50c09iaixcbiAgICAgIHJpY2hUZXh0OiB0aGlzLiNyaWNoVGV4dFxuICAgIH0gPSB0aGlzLiN1cGRhdGVzKTtcbiAgICB0aGlzLiN1cGRhdGVzID0gbnVsbDtcbiAgICB0aGlzLiNwb3B1cD8ucmVtb3ZlKCk7XG4gICAgdGhpcy4jcG9wdXAgPSBudWxsO1xuICAgIHRoaXMuI3Bvc2l0aW9uID0gbnVsbDtcbiAgfVxuICAjc2V0UG9zaXRpb24oKSB7XG4gICAgaWYgKHRoaXMuI3Bvc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHBhZ2U6IHtcbiAgICAgICAgdmlld1xuICAgICAgfSxcbiAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgIHJhd0RpbXM6IHtcbiAgICAgICAgICBwYWdlV2lkdGgsXG4gICAgICAgICAgcGFnZUhlaWdodCxcbiAgICAgICAgICBwYWdlWCxcbiAgICAgICAgICBwYWdlWVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSA9IHRoaXMuI3BhcmVudDtcbiAgICBsZXQgdXNlUGFyZW50UmVjdCA9ICEhdGhpcy4jcGFyZW50UmVjdDtcbiAgICBsZXQgcmVjdCA9IHVzZVBhcmVudFJlY3QgPyB0aGlzLiNwYXJlbnRSZWN0IDogdGhpcy4jcmVjdDtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy4jZWxlbWVudHMpIHtcbiAgICAgIGlmICghcmVjdCB8fCBVdGlsLmludGVyc2VjdChlbGVtZW50LmRhdGEucmVjdCwgcmVjdCkgIT09IG51bGwpIHtcbiAgICAgICAgcmVjdCA9IGVsZW1lbnQuZGF0YS5yZWN0O1xuICAgICAgICB1c2VQYXJlbnRSZWN0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWN0ID0gVXRpbC5ub3JtYWxpemVSZWN0KFtyZWN0WzBdLCB2aWV3WzNdIC0gcmVjdFsxXSArIHZpZXdbMV0sIHJlY3RbMl0sIHZpZXdbM10gLSByZWN0WzNdICsgdmlld1sxXV0pO1xuICAgIGNvbnN0IEhPUklaT05UQUxfU1BBQ0VfQUZURVJfQU5OT1RBVElPTiA9IDU7XG4gICAgY29uc3QgcGFyZW50V2lkdGggPSB1c2VQYXJlbnRSZWN0ID8gcmVjdFsyXSAtIHJlY3RbMF0gKyBIT1JJWk9OVEFMX1NQQUNFX0FGVEVSX0FOTk9UQVRJT04gOiAwO1xuICAgIGNvbnN0IHBvcHVwTGVmdCA9IG5vcm1hbGl6ZWRSZWN0WzBdICsgcGFyZW50V2lkdGg7XG4gICAgY29uc3QgcG9wdXBUb3AgPSBub3JtYWxpemVkUmVjdFsxXTtcbiAgICB0aGlzLiNwb3NpdGlvbiA9IFsxMDAgKiAocG9wdXBMZWZ0IC0gcGFnZVgpIC8gcGFnZVdpZHRoLCAxMDAgKiAocG9wdXBUb3AgLSBwYWdlWSkgLyBwYWdlSGVpZ2h0XTtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLiNjb250YWluZXI7XG4gICAgc3R5bGUubGVmdCA9IGAke3RoaXMuI3Bvc2l0aW9uWzBdfSVgO1xuICAgIHN0eWxlLnRvcCA9IGAke3RoaXMuI3Bvc2l0aW9uWzFdfSVgO1xuICB9XG4gICN0b2dnbGUoKSB7XG4gICAgdGhpcy4jcGlubmVkID0gIXRoaXMuI3Bpbm5lZDtcbiAgICBpZiAodGhpcy4jcGlubmVkKSB7XG4gICAgICB0aGlzLiNzaG93KCk7XG4gICAgICB0aGlzLiNjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuI2JvdW5kVG9nZ2xlKTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleURvd24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNoaWRlKCk7XG4gICAgICB0aGlzLiNjb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuI2JvdW5kVG9nZ2xlKTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleURvd24pO1xuICAgIH1cbiAgfVxuICAjc2hvdygpIHtcbiAgICBpZiAoIXRoaXMuI3BvcHVwKSB7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICB0aGlzLiNzZXRQb3NpdGlvbigpO1xuICAgICAgdGhpcy4jY29udGFpbmVyLmhpZGRlbiA9IGZhbHNlO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IHBhcnNlSW50KHRoaXMuI2NvbnRhaW5lci5zdHlsZS56SW5kZXgpICsgMTAwMDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI3Bpbm5lZCkge1xuICAgICAgdGhpcy4jY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJmb2N1c2VkXCIpO1xuICAgIH1cbiAgfVxuICAjaGlkZSgpIHtcbiAgICB0aGlzLiNjb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcImZvY3VzZWRcIik7XG4gICAgaWYgKHRoaXMuI3Bpbm5lZCB8fCAhdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLmhpZGRlbiA9IHRydWU7XG4gICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IHBhcnNlSW50KHRoaXMuI2NvbnRhaW5lci5zdHlsZS56SW5kZXgpIC0gMTAwMDtcbiAgfVxuICBmb3JjZUhpZGUoKSB7XG4gICAgdGhpcy4jd2FzVmlzaWJsZSA9IHRoaXMuaXNWaXNpYmxlO1xuICAgIGlmICghdGhpcy4jd2FzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNjb250YWluZXIuaGlkZGVuID0gdHJ1ZTtcbiAgfVxuICBtYXliZVNob3coKSB7XG4gICAgaWYgKCF0aGlzLiN3YXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jcG9wdXApIHtcbiAgICAgIHRoaXMuI3Nob3coKTtcbiAgICB9XG4gICAgdGhpcy4jd2FzVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuI2NvbnRhaW5lci5oaWRkZW4gPSBmYWxzZTtcbiAgfVxuICBnZXQgaXNWaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLiNjb250YWluZXIuaGlkZGVuID09PSBmYWxzZTtcbiAgfVxufVxuY2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBwYXJhbWV0ZXJzLmRhdGEudGV4dENvbnRlbnQ7XG4gICAgdGhpcy50ZXh0UG9zaXRpb24gPSBwYXJhbWV0ZXJzLmRhdGEudGV4dFBvc2l0aW9uO1xuICAgIHRoaXMuYW5ub3RhdGlvbkVkaXRvclR5cGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImZyZWVUZXh0QW5ub3RhdGlvblwiKTtcbiAgICBpZiAodGhpcy50ZXh0Q29udGVudCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoXCJhbm5vdGF0aW9uVGV4dENvbnRlbnRcIik7XG4gICAgICBjb250ZW50LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJjb21tZW50XCIpO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMudGV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgbGluZVNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgbGluZVNwYW4udGV4dENvbnRlbnQgPSBsaW5lO1xuICAgICAgICBjb250ZW50LmFwcGVuZChsaW5lU3Bhbik7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoY29udGVudCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICB0aGlzLl9lZGl0T25Eb3VibGVDbGljaygpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBnZXQgX2lzRWRpdGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5oYXNPd25DYW52YXM7XG4gIH1cbn1cbmNsYXNzIExpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgI2xpbmUgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJsaW5lQW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcbiAgICBjb25zdCBsaW5lID0gdGhpcy4jbGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmxpbmVcIik7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ4MVwiLCBkYXRhLnJlY3RbMl0gLSBkYXRhLmxpbmVDb29yZGluYXRlc1swXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ5MVwiLCBkYXRhLnJlY3RbM10gLSBkYXRhLmxpbmVDb29yZGluYXRlc1sxXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ4MlwiLCBkYXRhLnJlY3RbMl0gLSBkYXRhLmxpbmVDb29yZGluYXRlc1syXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ5MlwiLCBkYXRhLnJlY3RbM10gLSBkYXRhLmxpbmVDb29yZGluYXRlc1szXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIHN2Zy5hcHBlbmQobGluZSk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG4gICAgaWYgKCFkYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGluZTtcbiAgfVxuICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICB9XG59XG5jbGFzcyBTcXVhcmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgI3NxdWFyZSA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInNxdWFyZUFubm90YXRpb25cIik7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG4gICAgY29uc3QgYm9yZGVyV2lkdGggPSBkYXRhLmJvcmRlclN0eWxlLndpZHRoO1xuICAgIGNvbnN0IHNxdWFyZSA9IHRoaXMuI3NxdWFyZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInhcIiwgYm9yZGVyV2lkdGggLyAyKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwieVwiLCBib3JkZXJXaWR0aCAvIDIpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB3aWR0aCAtIGJvcmRlcldpZHRoKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGhlaWdodCAtIGJvcmRlcldpZHRoKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGJvcmRlcldpZHRoIHx8IDEpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIHN2Zy5hcHBlbmQoc3F1YXJlKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcbiAgICBpZiAoIWRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgIHJldHVybiB0aGlzLiNzcXVhcmU7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgfVxufVxuY2xhc3MgQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICNjaXJjbGUgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjaXJjbGVBbm5vdGF0aW9uXCIpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXMoZGF0YS5yZWN0KTtcbiAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuICAgIGNvbnN0IGJvcmRlcldpZHRoID0gZGF0YS5ib3JkZXJTdHlsZS53aWR0aDtcbiAgICBjb25zdCBjaXJjbGUgPSB0aGlzLiNjaXJjbGUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzplbGxpcHNlXCIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJjeFwiLCB3aWR0aCAvIDIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJjeVwiLCBoZWlnaHQgLyAyKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwicnhcIiwgd2lkdGggLyAyIC0gYm9yZGVyV2lkdGggLyAyKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwicnlcIiwgaGVpZ2h0IC8gMiAtIGJvcmRlcldpZHRoIC8gMik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBib3JkZXJXaWR0aCB8fCAxKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBzdmcuYXBwZW5kKGNpcmNsZSk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG4gICAgaWYgKCFkYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY2lyY2xlO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbn1cbmNsYXNzIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICNwb2x5bGluZSA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwicG9seWxpbmVBbm5vdGF0aW9uXCI7XG4gICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlsaW5lXCI7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5jb250YWluZXJDbGFzc05hbWUpO1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcmVjdCxcbiAgICAgICAgdmVydGljZXMsXG4gICAgICAgIGJvcmRlclN0eWxlLFxuICAgICAgICBwb3B1cFJlZlxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghdmVydGljZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXMocmVjdCk7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcbiAgICBsZXQgcG9pbnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgY29uc3QgeCA9IHZlcnRpY2VzW2ldIC0gcmVjdFswXTtcbiAgICAgIGNvbnN0IHkgPSByZWN0WzNdIC0gdmVydGljZXNbaSArIDFdO1xuICAgICAgcG9pbnRzLnB1c2goYCR7eH0sJHt5fWApO1xuICAgIH1cbiAgICBwb2ludHMgPSBwb2ludHMuam9pbihcIiBcIik7XG4gICAgY29uc3QgcG9seWxpbmUgPSB0aGlzLiNwb2x5bGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMuc3ZnRWxlbWVudE5hbWUpO1xuICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInBvaW50c1wiLCBwb2ludHMpO1xuICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgc3ZnLmFwcGVuZChwb2x5bGluZSk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG4gICAgaWYgKCFwb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3BvbHlsaW5lO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbn1cbmNsYXNzIFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcInBvbHlnb25Bbm5vdGF0aW9uXCI7XG4gICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlnb25cIjtcbiAgfVxufVxuY2xhc3MgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY2FyZXRBbm5vdGF0aW9uXCIpO1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIElua0Fubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjcG9seWxpbmVzID0gW107XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwiaW5rQW5ub3RhdGlvblwiO1xuICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5bGluZVwiO1xuICAgIHRoaXMuYW5ub3RhdGlvbkVkaXRvclR5cGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5jb250YWluZXJDbGFzc05hbWUpO1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcmVjdCxcbiAgICAgICAgaW5rTGlzdHMsXG4gICAgICAgIGJvcmRlclN0eWxlLFxuICAgICAgICBwb3B1cFJlZlxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKHJlY3QpO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG4gICAgZm9yIChjb25zdCBpbmtMaXN0IG9mIGlua0xpc3RzKSB7XG4gICAgICBsZXQgcG9pbnRzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbmtMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgY29uc3QgeCA9IGlua0xpc3RbaV0gLSByZWN0WzBdO1xuICAgICAgICBjb25zdCB5ID0gcmVjdFszXSAtIGlua0xpc3RbaSArIDFdO1xuICAgICAgICBwb2ludHMucHVzaChgJHt4fSwke3l9YCk7XG4gICAgICB9XG4gICAgICBwb2ludHMgPSBwb2ludHMuam9pbihcIiBcIik7XG4gICAgICBjb25zdCBwb2x5bGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMuc3ZnRWxlbWVudE5hbWUpO1xuICAgICAgdGhpcy4jcG9seWxpbmVzLnB1c2gocG9seWxpbmUpO1xuICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwicG9pbnRzXCIsIHBvaW50cyk7XG4gICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7XG4gICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICAgIGlmICghcG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgIH1cbiAgICAgIHN2Zy5hcHBlbmQocG9seWxpbmUpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jcG9seWxpbmVzO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbn1cbmNsYXNzIEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBbm5vdGF0aW9uXCIpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWUsXG4gICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInVuZGVybGluZUFubm90YXRpb25cIik7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzcXVpZ2dseUFubm90YXRpb25cIik7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZSxcbiAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3RyaWtlb3V0QW5ub3RhdGlvblwiKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInN0YW1wQW5ub3RhdGlvblwiKTtcbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjdHJpZ2dlciA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBmaWxlXG4gICAgfSA9IHRoaXMuZGF0YTtcbiAgICB0aGlzLmZpbGVuYW1lID0gZmlsZS5maWxlbmFtZTtcbiAgICB0aGlzLmNvbnRlbnQgPSBmaWxlLmNvbnRlbnQ7XG4gICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJmaWxlYXR0YWNobWVudGFubm90YXRpb25cIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgLi4uZmlsZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uXCIpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGRhdGFcbiAgICB9ID0gdGhpcztcbiAgICBsZXQgdHJpZ2dlcjtcbiAgICBpZiAoZGF0YS5oYXNBcHBlYXJhbmNlIHx8IGRhdGEuZmlsbEFscGhhID09PSAwKSB7XG4gICAgICB0cmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICB0cmlnZ2VyLnNyYyA9IGAke3RoaXMuaW1hZ2VSZXNvdXJjZXNQYXRofWFubm90YXRpb24tJHsvcGFwZXJjbGlwL2kudGVzdChkYXRhLm5hbWUpID8gXCJwYXBlcmNsaXBcIiA6IFwicHVzaHBpblwifS5zdmdgO1xuICAgICAgaWYgKGRhdGEuZmlsbEFscGhhICYmIGRhdGEuZmlsbEFscGhhIDwgMSkge1xuICAgICAgICB0cmlnZ2VyLnN0eWxlID0gYGZpbHRlcjogb3BhY2l0eSgke01hdGgucm91bmQoZGF0YS5maWxsQWxwaGEgKiAxMDApfSUpO2A7XG4gICAgICB9XG4gICAgfVxuICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsIHRoaXMuI2Rvd25sb2FkLmJpbmQodGhpcykpO1xuICAgIHRoaXMuI3RyaWdnZXIgPSB0cmlnZ2VyO1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTWFjXG4gICAgfSA9IHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGV2dCA9PiB7XG4gICAgICBpZiAoZXZ0LmtleSA9PT0gXCJFbnRlclwiICYmIChpc01hYyA/IGV2dC5tZXRhS2V5IDogZXZ0LmN0cmxLZXkpKSB7XG4gICAgICAgIHRoaXMuI2Rvd25sb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFkYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyLmNsYXNzTGlzdC5hZGQoXCJwb3B1cFRyaWdnZXJBcmVhXCIpO1xuICAgIH1cbiAgICBjb250YWluZXIuYXBwZW5kKHRyaWdnZXIpO1xuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdHJpZ2dlcjtcbiAgfVxuICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICB9XG4gICNkb3dubG9hZCgpIHtcbiAgICB0aGlzLmRvd25sb2FkTWFuYWdlcj8ub3Blbk9yRG93bmxvYWREYXRhKHRoaXMuY29udGVudCwgdGhpcy5maWxlbmFtZSk7XG4gIH1cbn1cbmNsYXNzIEFubm90YXRpb25MYXllciB7XG4gICNhY2Nlc3NpYmlsaXR5TWFuYWdlciA9IG51bGw7XG4gICNhbm5vdGF0aW9uQ2FudmFzTWFwID0gbnVsbDtcbiAgI2VkaXRhYmxlQW5ub3RhdGlvbnMgPSBuZXcgTWFwKCk7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBkaXYsXG4gICAgYWNjZXNzaWJpbGl0eU1hbmFnZXIsXG4gICAgYW5ub3RhdGlvbkNhbnZhc01hcCxcbiAgICBhbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLFxuICAgIHBhZ2UsXG4gICAgdmlld3BvcnRcbiAgfSkge1xuICAgIHRoaXMuZGl2ID0gZGl2O1xuICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlNYW5hZ2VyID0gYWNjZXNzaWJpbGl0eU1hbmFnZXI7XG4gICAgdGhpcy4jYW5ub3RhdGlvbkNhbnZhc01hcCA9IGFubm90YXRpb25DYW52YXNNYXA7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgdGhpcy56SW5kZXggPSAwO1xuICAgIHRoaXMuX2Fubm90YXRpb25FZGl0b3JVSU1hbmFnZXIgPSBhbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyO1xuICB9XG4gICNhcHBlbmRFbGVtZW50KGVsZW1lbnQsIGlkKSB7XG4gICAgY29uc3QgY29udGVudEVsZW1lbnQgPSBlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudDtcbiAgICBjb250ZW50RWxlbWVudC5pZCA9IGAke0Fubm90YXRpb25QcmVmaXh9JHtpZH1gO1xuICAgIHRoaXMuZGl2LmFwcGVuZChlbGVtZW50KTtcbiAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlcj8ubW92ZUVsZW1lbnRJbkRPTSh0aGlzLmRpdiwgZWxlbWVudCwgY29udGVudEVsZW1lbnQsIGZhbHNlKTtcbiAgfVxuICBhc3luYyByZW5kZXIocGFyYW1zKSB7XG4gICAgY29uc3Qge1xuICAgICAgYW5ub3RhdGlvbnNcbiAgICB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5kaXY7XG4gICAgc2V0TGF5ZXJEaW1lbnNpb25zKGxheWVyLCB0aGlzLnZpZXdwb3J0KTtcbiAgICBjb25zdCBwb3B1cFRvRWxlbWVudHMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZWxlbWVudFBhcmFtcyA9IHtcbiAgICAgIGRhdGE6IG51bGwsXG4gICAgICBsYXllcixcbiAgICAgIGxpbmtTZXJ2aWNlOiBwYXJhbXMubGlua1NlcnZpY2UsXG4gICAgICBkb3dubG9hZE1hbmFnZXI6IHBhcmFtcy5kb3dubG9hZE1hbmFnZXIsXG4gICAgICBpbWFnZVJlc291cmNlc1BhdGg6IHBhcmFtcy5pbWFnZVJlc291cmNlc1BhdGggfHwgXCJcIixcbiAgICAgIHJlbmRlckZvcm1zOiBwYXJhbXMucmVuZGVyRm9ybXMgIT09IGZhbHNlLFxuICAgICAgc3ZnRmFjdG9yeTogbmV3IERPTVNWR0ZhY3RvcnkoKSxcbiAgICAgIGFubm90YXRpb25TdG9yYWdlOiBwYXJhbXMuYW5ub3RhdGlvblN0b3JhZ2UgfHwgbmV3IEFubm90YXRpb25TdG9yYWdlKCksXG4gICAgICBlbmFibGVTY3JpcHRpbmc6IHBhcmFtcy5lbmFibGVTY3JpcHRpbmcgPT09IHRydWUsXG4gICAgICBoYXNKU0FjdGlvbnM6IHBhcmFtcy5oYXNKU0FjdGlvbnMsXG4gICAgICBmaWVsZE9iamVjdHM6IHBhcmFtcy5maWVsZE9iamVjdHMsXG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICBlbGVtZW50czogbnVsbFxuICAgIH07XG4gICAgZm9yIChjb25zdCBkYXRhIG9mIGFubm90YXRpb25zKSB7XG4gICAgICBpZiAoZGF0YS5ub0hUTUwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpc1BvcHVwQW5ub3RhdGlvbiA9IGRhdGEuYW5ub3RhdGlvblR5cGUgPT09IEFubm90YXRpb25UeXBlLlBPUFVQO1xuICAgICAgaWYgKCFpc1BvcHVwQW5ub3RhdGlvbikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0XG4gICAgICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHBvcHVwVG9FbGVtZW50cy5nZXQoZGF0YS5pZCk7XG4gICAgICAgIGlmICghZWxlbWVudHMpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50UGFyYW1zLmVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgICB9XG4gICAgICBlbGVtZW50UGFyYW1zLmRhdGEgPSBkYXRhO1xuICAgICAgY29uc3QgZWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50RmFjdG9yeS5jcmVhdGUoZWxlbWVudFBhcmFtcyk7XG4gICAgICBpZiAoIWVsZW1lbnQuaXNSZW5kZXJhYmxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1BvcHVwQW5ub3RhdGlvbiAmJiBkYXRhLnBvcHVwUmVmKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gcG9wdXBUb0VsZW1lbnRzLmdldChkYXRhLnBvcHVwUmVmKTtcbiAgICAgICAgaWYgKCFlbGVtZW50cykge1xuICAgICAgICAgIHBvcHVwVG9FbGVtZW50cy5zZXQoZGF0YS5wb3B1cFJlZiwgW2VsZW1lbnRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZW5kZXJlZCA9IGVsZW1lbnQucmVuZGVyKCk7XG4gICAgICBpZiAoZGF0YS5oaWRkZW4pIHtcbiAgICAgICAgcmVuZGVyZWQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICB9XG4gICAgICB0aGlzLiNhcHBlbmRFbGVtZW50KHJlbmRlcmVkLCBkYXRhLmlkKTtcbiAgICAgIGlmIChlbGVtZW50LmFubm90YXRpb25FZGl0b3JUeXBlID4gMCkge1xuICAgICAgICB0aGlzLiNlZGl0YWJsZUFubm90YXRpb25zLnNldChlbGVtZW50LmRhdGEuaWQsIGVsZW1lbnQpO1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyPy5yZW5kZXJBbm5vdGF0aW9uRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jc2V0QW5ub3RhdGlvbkNhbnZhc01hcCgpO1xuICB9XG4gIHVwZGF0ZSh7XG4gICAgdmlld3BvcnRcbiAgfSkge1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5kaXY7XG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIHNldExheWVyRGltZW5zaW9ucyhsYXllciwge1xuICAgICAgcm90YXRpb246IHZpZXdwb3J0LnJvdGF0aW9uXG4gICAgfSk7XG4gICAgdGhpcy4jc2V0QW5ub3RhdGlvbkNhbnZhc01hcCgpO1xuICAgIGxheWVyLmhpZGRlbiA9IGZhbHNlO1xuICB9XG4gICNzZXRBbm5vdGF0aW9uQ2FudmFzTWFwKCkge1xuICAgIGlmICghdGhpcy4jYW5ub3RhdGlvbkNhbnZhc01hcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXllciA9IHRoaXMuZGl2O1xuICAgIGZvciAoY29uc3QgW2lkLCBjYW52YXNdIG9mIHRoaXMuI2Fubm90YXRpb25DYW52YXNNYXApIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBsYXllci5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hbm5vdGF0aW9uLWlkPVwiJHtpZH1cIl1gKTtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhbnZhcy5jbGFzc05hbWUgPSBcImFubm90YXRpb25Db250ZW50XCI7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZpcnN0Q2hpbGRcbiAgICAgIH0gPSBlbGVtZW50O1xuICAgICAgaWYgKCFmaXJzdENoaWxkKSB7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kKGNhbnZhcyk7XG4gICAgICB9IGVsc2UgaWYgKGZpcnN0Q2hpbGQubm9kZU5hbWUgPT09IFwiQ0FOVkFTXCIpIHtcbiAgICAgICAgZmlyc3RDaGlsZC5yZXBsYWNlV2l0aChjYW52YXMpO1xuICAgICAgfSBlbHNlIGlmICghZmlyc3RDaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoXCJhbm5vdGF0aW9uQ29udGVudFwiKSkge1xuICAgICAgICBmaXJzdENoaWxkLmJlZm9yZShjYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlyc3RDaGlsZC5hZnRlcihjYW52YXMpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNhbm5vdGF0aW9uQ2FudmFzTWFwLmNsZWFyKCk7XG4gIH1cbiAgZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiNlZGl0YWJsZUFubm90YXRpb25zLnZhbHVlcygpKTtcbiAgfVxuICBnZXRFZGl0YWJsZUFubm90YXRpb24oaWQpIHtcbiAgICByZXR1cm4gdGhpcy4jZWRpdGFibGVBbm5vdGF0aW9ucy5nZXQoaWQpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9mcmVldGV4dC5qc1xuXG5cblxuXG5jb25zdCBFT0xfUEFUVEVSTiA9IC9cXHJcXG4/fFxcbi9nO1xuY2xhc3MgRnJlZVRleHRFZGl0b3IgZXh0ZW5kcyBBbm5vdGF0aW9uRWRpdG9yIHtcbiAgI2JvdW5kRWRpdG9yRGl2Qmx1ciA9IHRoaXMuZWRpdG9yRGl2Qmx1ci5iaW5kKHRoaXMpO1xuICAjYm91bmRFZGl0b3JEaXZGb2N1cyA9IHRoaXMuZWRpdG9yRGl2Rm9jdXMuYmluZCh0aGlzKTtcbiAgI2JvdW5kRWRpdG9yRGl2SW5wdXQgPSB0aGlzLmVkaXRvckRpdklucHV0LmJpbmQodGhpcyk7XG4gICNib3VuZEVkaXRvckRpdktleWRvd24gPSB0aGlzLmVkaXRvckRpdktleWRvd24uYmluZCh0aGlzKTtcbiAgI2JvdW5kRWRpdG9yRGl2UGFzdGUgPSB0aGlzLmVkaXRvckRpdlBhc3RlLmJpbmQodGhpcyk7XG4gICNjb2xvcjtcbiAgI2NvbnRlbnQgPSBcIlwiO1xuICAjZWRpdG9yRGl2SWQgPSBgJHt0aGlzLmlkfS1lZGl0b3JgO1xuICAjZm9udFNpemU7XG4gICNpbml0aWFsRGF0YSA9IG51bGw7XG4gIHN0YXRpYyBfZnJlZVRleHREZWZhdWx0Q29udGVudCA9IFwiXCI7XG4gIHN0YXRpYyBfaW50ZXJuYWxQYWRkaW5nID0gMDtcbiAgc3RhdGljIF9kZWZhdWx0Q29sb3IgPSBudWxsO1xuICBzdGF0aWMgX2RlZmF1bHRGb250U2l6ZSA9IDEwO1xuICBzdGF0aWMgZ2V0IF9rZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgY29uc3QgcHJvdG8gPSBGcmVlVGV4dEVkaXRvci5wcm90b3R5cGU7XG4gICAgY29uc3QgYXJyb3dDaGVja2VyID0gc2VsZiA9PiBzZWxmLmlzRW1wdHkoKTtcbiAgICBjb25zdCBzbWFsbCA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuVFJBTlNMQVRFX1NNQUxMO1xuICAgIGNvbnN0IGJpZyA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuVFJBTlNMQVRFX0JJRztcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiY3RybCtzXCIsIFwibWFjK21ldGErc1wiLCBcImN0cmwrcFwiLCBcIm1hYyttZXRhK3BcIl0sIHByb3RvLmNvbW1pdE9yUmVtb3ZlLCB7XG4gICAgICBidWJibGVzOiB0cnVlXG4gICAgfV0sIFtbXCJjdHJsK0VudGVyXCIsIFwibWFjK21ldGErRW50ZXJcIiwgXCJFc2NhcGVcIiwgXCJtYWMrRXNjYXBlXCJdLCBwcm90by5jb21taXRPclJlbW92ZV0sIFtbXCJBcnJvd0xlZnRcIiwgXCJtYWMrQXJyb3dMZWZ0XCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFstc21hbGwsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93TGVmdFwiLCBcIm1hYytzaGlmdCtBcnJvd0xlZnRcIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogWy1iaWcsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJBcnJvd1JpZ2h0XCIsIFwibWFjK0Fycm93UmlnaHRcIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogW3NtYWxsLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd1JpZ2h0XCIsIFwibWFjK3NoaWZ0K0Fycm93UmlnaHRcIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogW2JpZywgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93VXBcIiwgXCJtYWMrQXJyb3dVcFwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbMCwgLXNtYWxsXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd1VwXCIsIFwibWFjK3NoaWZ0K0Fycm93VXBcIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogWzAsIC1iaWddLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJBcnJvd0Rvd25cIiwgXCJtYWMrQXJyb3dEb3duXCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFswLCBzbWFsbF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dEb3duXCIsIFwibWFjK3NoaWZ0K0Fycm93RG93blwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbMCwgYmlnXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dXSkpO1xuICB9XG4gIHN0YXRpYyBfdHlwZSA9IFwiZnJlZXRleHRcIjtcbiAgc3RhdGljIF9lZGl0b3JUeXBlID0gQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIG5hbWU6IFwiZnJlZVRleHRFZGl0b3JcIlxuICAgIH0pO1xuICAgIHRoaXMuI2NvbG9yID0gcGFyYW1zLmNvbG9yIHx8IEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcjtcbiAgICB0aGlzLiNmb250U2l6ZSA9IHBhcmFtcy5mb250U2l6ZSB8fCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplO1xuICB9XG4gIHN0YXRpYyBpbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcikge1xuICAgIEFubm90YXRpb25FZGl0b3IuaW5pdGlhbGl6ZShsMTBuLCB1aU1hbmFnZXIsIHtcbiAgICAgIHN0cmluZ3M6IFtcInBkZmpzLWZyZWUtdGV4dC1kZWZhdWx0LWNvbnRlbnRcIl1cbiAgICB9KTtcbiAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICB0aGlzLl9pbnRlcm5hbFBhZGRpbmcgPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLWZyZWV0ZXh0LXBhZGRpbmdcIikpO1xuICB9XG4gIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkU6XG4gICAgICAgIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Rm9udFNpemUgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX0NPTE9SOlxuICAgICAgICBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdENvbG9yID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRTpcbiAgICAgICAgdGhpcy4jdXBkYXRlRm9udFNpemUodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1I6XG4gICAgICAgIHRoaXMuI3VwZGF0ZUNvbG9yKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW1tBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX0NPTE9SLCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdENvbG9yIHx8IEFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdXTtcbiAgfVxuICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsIHRoaXMuI2ZvbnRTaXplXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX0NPTE9SLCB0aGlzLiNjb2xvcl1dO1xuICB9XG4gICN1cGRhdGVGb250U2l6ZShmb250U2l6ZSkge1xuICAgIGNvbnN0IHNldEZvbnRzaXplID0gc2l6ZSA9PiB7XG4gICAgICB0aGlzLmVkaXRvckRpdi5zdHlsZS5mb250U2l6ZSA9IGBjYWxjKCR7c2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcbiAgICAgIHRoaXMudHJhbnNsYXRlKDAsIC0oc2l6ZSAtIHRoaXMuI2ZvbnRTaXplKSAqIHRoaXMucGFyZW50U2NhbGUpO1xuICAgICAgdGhpcy4jZm9udFNpemUgPSBzaXplO1xuICAgICAgdGhpcy4jc2V0RWRpdG9yRGltZW5zaW9ucygpO1xuICAgIH07XG4gICAgY29uc3Qgc2F2ZWRGb250c2l6ZSA9IHRoaXMuI2ZvbnRTaXplO1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiBzZXRGb250c2l6ZS5iaW5kKHRoaXMsIGZvbnRTaXplKSxcbiAgICAgIHVuZG86IHNldEZvbnRzaXplLmJpbmQodGhpcywgc2F2ZWRGb250c2l6ZSksXG4gICAgICBwb3N0OiB0aGlzLl91aU1hbmFnZXIudXBkYXRlVUkuYmluZCh0aGlzLl91aU1hbmFnZXIsIHRoaXMpLFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLFxuICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogdHJ1ZSxcbiAgICAgIGtlZXBVbmRvOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgI3VwZGF0ZUNvbG9yKGNvbG9yKSB7XG4gICAgY29uc3Qgc2V0Q29sb3IgPSBjb2wgPT4ge1xuICAgICAgdGhpcy4jY29sb3IgPSB0aGlzLmVkaXRvckRpdi5zdHlsZS5jb2xvciA9IGNvbDtcbiAgICB9O1xuICAgIGNvbnN0IHNhdmVkQ29sb3IgPSB0aGlzLiNjb2xvcjtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogc2V0Q29sb3IuYmluZCh0aGlzLCBjb2xvciksXG4gICAgICB1bmRvOiBzZXRDb2xvci5iaW5kKHRoaXMsIHNhdmVkQ29sb3IpLFxuICAgICAgcG9zdDogdGhpcy5fdWlNYW5hZ2VyLnVwZGF0ZVVJLmJpbmQodGhpcy5fdWlNYW5hZ2VyLCB0aGlzKSxcbiAgICAgIG11c3RFeGVjOiB0cnVlLFxuICAgICAgdHlwZTogQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1IsXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgfVxuICBfdHJhbnNsYXRlRW1wdHkoeCwgeSkge1xuICAgIHRoaXMuX3VpTWFuYWdlci50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMoeCwgeSwgdHJ1ZSk7XG4gIH1cbiAgZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCkge1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5wYXJlbnRTY2FsZTtcbiAgICByZXR1cm4gWy1GcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogc2NhbGUsIC0oRnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyArIHRoaXMuI2ZvbnRTaXplKSAqIHNjYWxlXTtcbiAgfVxuICByZWJ1aWxkKCkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIucmVidWlsZCgpO1xuICAgIGlmICh0aGlzLmRpdiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG4gICAgfVxuICB9XG4gIGVuYWJsZUVkaXRNb2RlKCkge1xuICAgIGlmICh0aGlzLmlzSW5FZGl0TW9kZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZShmYWxzZSk7XG4gICAgdGhpcy5wYXJlbnQudXBkYXRlVG9vbGJhcihBbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVCk7XG4gICAgc3VwZXIuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LnJlbW92ZShcImVuYWJsZWRcIik7XG4gICAgdGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZGl2LnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEVkaXRvckRpdktleWRvd24sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNib3VuZEVkaXRvckRpdkZvY3VzLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNib3VuZEVkaXRvckRpdkJsdXIsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB0aGlzLiNib3VuZEVkaXRvckRpdklucHV0LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZQYXN0ZSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgZGlzYWJsZUVkaXRNb2RlKCkge1xuICAgIGlmICghdGhpcy5pc0luRWRpdE1vZGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUodHJ1ZSk7XG4gICAgc3VwZXIuZGlzYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5hZGQoXCJlbmFibGVkXCIpO1xuICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZGl2LnNldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCB0aGlzLiNlZGl0b3JEaXZJZCk7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2S2V5ZG93bik7XG4gICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2Rm9jdXMpO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2Qmx1cik7XG4gICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2SW5wdXQpO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCB0aGlzLiNib3VuZEVkaXRvckRpdlBhc3RlKTtcbiAgICB0aGlzLmRpdi5mb2N1cyh7XG4gICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBhcmVudC5kaXYuY2xhc3NMaXN0LmFkZChcImZyZWV0ZXh0RWRpdGluZ1wiKTtcbiAgfVxuICBmb2N1c2luKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9mb2N1c0V2ZW50c0FsbG93ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuZm9jdXNpbihldmVudCk7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5lZGl0b3JEaXYpIHtcbiAgICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIG9uY2VBZGRlZCgpIHtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5lZGl0b3JEaXYuZm9jdXMoKTtcbiAgICBpZiAodGhpcy5faW5pdGlhbE9wdGlvbnM/LmlzQ2VudGVyZWQpIHtcbiAgICAgIHRoaXMuY2VudGVyKCk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxPcHRpb25zID0gbnVsbDtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5lZGl0b3JEaXYgfHwgdGhpcy5lZGl0b3JEaXYuaW5uZXJUZXh0LnRyaW0oKSA9PT0gXCJcIjtcbiAgfVxuICByZW1vdmUoKSB7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZSh0cnVlKTtcbiAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKFwiZnJlZXRleHRFZGl0aW5nXCIpO1xuICAgIH1cbiAgICBzdXBlci5yZW1vdmUoKTtcbiAgfVxuICAjZXh0cmFjdFRleHQoKSB7XG4gICAgY29uc3QgYnVmZmVyID0gW107XG4gICAgdGhpcy5lZGl0b3JEaXYubm9ybWFsaXplKCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmVkaXRvckRpdi5jaGlsZE5vZGVzKSB7XG4gICAgICBidWZmZXIucHVzaChGcmVlVGV4dEVkaXRvci4jZ2V0Tm9kZUNvbnRlbnQoY2hpbGQpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlci5qb2luKFwiXFxuXCIpO1xuICB9XG4gICNzZXRFZGl0b3JEaW1lbnNpb25zKCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBsZXQgcmVjdDtcbiAgICBpZiAodGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHJlY3QgPSB0aGlzLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjdXJyZW50TGF5ZXIsXG4gICAgICAgIGRpdlxuICAgICAgfSA9IHRoaXM7XG4gICAgICBjb25zdCBzYXZlZERpc3BsYXkgPSBkaXYuc3R5bGUuZGlzcGxheTtcbiAgICAgIGNvbnN0IHNhdmVkVmlzaWJpbGl0eSA9IGRpdi5jbGFzc0xpc3QuY29udGFpbnMoXCJoaWRkZW5cIik7XG4gICAgICBkaXYuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gXCJoaWRkZW5cIjtcbiAgICAgIGN1cnJlbnRMYXllci5kaXYuYXBwZW5kKHRoaXMuZGl2KTtcbiAgICAgIHJlY3QgPSBkaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBkaXYucmVtb3ZlKCk7XG4gICAgICBkaXYuc3R5bGUuZGlzcGxheSA9IHNhdmVkRGlzcGxheTtcbiAgICAgIGRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiaGlkZGVuXCIsIHNhdmVkVmlzaWJpbGl0eSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJvdGF0aW9uICUgMTgwID09PSB0aGlzLnBhcmVudFJvdGF0aW9uICUgMTgwKSB7XG4gICAgICB0aGlzLndpZHRoID0gcmVjdC53aWR0aCAvIHBhcmVudFdpZHRoO1xuICAgICAgdGhpcy5oZWlnaHQgPSByZWN0LmhlaWdodCAvIHBhcmVudEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53aWR0aCA9IHJlY3QuaGVpZ2h0IC8gcGFyZW50V2lkdGg7XG4gICAgICB0aGlzLmhlaWdodCA9IHJlY3Qud2lkdGggLyBwYXJlbnRIZWlnaHQ7XG4gICAgfVxuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICBjb21taXQoKSB7XG4gICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmNvbW1pdCgpO1xuICAgIHRoaXMuZGlzYWJsZUVkaXRNb2RlKCk7XG4gICAgY29uc3Qgc2F2ZWRUZXh0ID0gdGhpcy4jY29udGVudDtcbiAgICBjb25zdCBuZXdUZXh0ID0gdGhpcy4jY29udGVudCA9IHRoaXMuI2V4dHJhY3RUZXh0KCkudHJpbUVuZCgpO1xuICAgIGlmIChzYXZlZFRleHQgPT09IG5ld1RleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2V0VGV4dCA9IHRleHQgPT4ge1xuICAgICAgdGhpcy4jY29udGVudCA9IHRleHQ7XG4gICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy4jc2V0Q29udGVudCgpO1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLnJlYnVpbGQodGhpcyk7XG4gICAgICB0aGlzLiNzZXRFZGl0b3JEaW1lbnNpb25zKCk7XG4gICAgfTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICBzZXRUZXh0KG5ld1RleHQpO1xuICAgICAgfSxcbiAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgc2V0VGV4dChzYXZlZFRleHQpO1xuICAgICAgfSxcbiAgICAgIG11c3RFeGVjOiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuI3NldEVkaXRvckRpbWVuc2lvbnMoKTtcbiAgfVxuICBzaG91bGRHZXRLZXlib2FyZEV2ZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0luRWRpdE1vZGUoKTtcbiAgfVxuICBlbnRlckluRWRpdE1vZGUoKSB7XG4gICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gIH1cbiAgZGJsY2xpY2soZXZlbnQpIHtcbiAgICB0aGlzLmVudGVySW5FZGl0TW9kZSgpO1xuICB9XG4gIGtleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLmRpdiAmJiBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xuICAgICAgdGhpcy5lbnRlckluRWRpdE1vZGUoKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG4gIGVkaXRvckRpdktleWRvd24oZXZlbnQpIHtcbiAgICBGcmVlVGV4dEVkaXRvci5fa2V5Ym9hcmRNYW5hZ2VyLmV4ZWModGhpcywgZXZlbnQpO1xuICB9XG4gIGVkaXRvckRpdkZvY3VzKGV2ZW50KSB7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuICB9XG4gIGVkaXRvckRpdkJsdXIoZXZlbnQpIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG4gIGVkaXRvckRpdklucHV0KGV2ZW50KSB7XG4gICAgdGhpcy5wYXJlbnQuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJmcmVldGV4dEVkaXRpbmdcIiwgdGhpcy5pc0VtcHR5KCkpO1xuICB9XG4gIGRpc2FibGVFZGl0aW5nKCkge1xuICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJjb21tZW50XCIpO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtbXVsdGlsaW5lXCIpO1xuICB9XG4gIGVuYWJsZUVkaXRpbmcoKSB7XG4gICAgdGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInRleHRib3hcIik7XG4gICAgdGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1tdWx0aWxpbmVcIiwgdHJ1ZSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLmRpdikge1xuICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgIH1cbiAgICBsZXQgYmFzZVgsIGJhc2VZO1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICBiYXNlWCA9IHRoaXMueDtcbiAgICAgIGJhc2VZID0gdGhpcy55O1xuICAgIH1cbiAgICBzdXBlci5yZW5kZXIoKTtcbiAgICB0aGlzLmVkaXRvckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5lZGl0b3JEaXYuY2xhc3NOYW1lID0gXCJpbnRlcm5hbFwiO1xuICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImlkXCIsIHRoaXMuI2VkaXRvckRpdklkKTtcbiAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1mcmVlLXRleHRcIik7XG4gICAgdGhpcy5lbmFibGVFZGl0aW5nKCk7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5fbDEwblByb21pc2UuZ2V0KFwicGRmanMtZnJlZS10ZXh0LWRlZmF1bHQtY29udGVudFwiKS50aGVuKG1zZyA9PiB0aGlzLmVkaXRvckRpdj8uc2V0QXR0cmlidXRlKFwiZGVmYXVsdC1jb250ZW50XCIsIG1zZykpO1xuICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy5lZGl0b3JEaXY7XG4gICAgc3R5bGUuZm9udFNpemUgPSBgY2FsYygke3RoaXMuI2ZvbnRTaXplfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO1xuICAgIHN0eWxlLmNvbG9yID0gdGhpcy4jY29sb3I7XG4gICAgdGhpcy5kaXYuYXBwZW5kKHRoaXMuZWRpdG9yRGl2KTtcbiAgICB0aGlzLm92ZXJsYXlEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKFwib3ZlcmxheVwiLCBcImVuYWJsZWRcIik7XG4gICAgdGhpcy5kaXYuYXBwZW5kKHRoaXMub3ZlcmxheURpdik7XG4gICAgYmluZEV2ZW50cyh0aGlzLCB0aGlzLmRpdiwgW1wiZGJsY2xpY2tcIiwgXCJrZXlkb3duXCJdKTtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcG9zaXRpb25cbiAgICAgICAgfSA9IHRoaXMuI2luaXRpYWxEYXRhO1xuICAgICAgICBsZXQgW3R4LCB0eV0gPSB0aGlzLmdldEluaXRpYWxUcmFuc2xhdGlvbigpO1xuICAgICAgICBbdHgsIHR5XSA9IHRoaXMucGFnZVRyYW5zbGF0aW9uVG9TY3JlZW4odHgsIHR5KTtcbiAgICAgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgICAgICBjb25zdCBbcGFnZVgsIHBhZ2VZXSA9IHRoaXMucGFnZVRyYW5zbGF0aW9uO1xuICAgICAgICBsZXQgcG9zWCwgcG9zWTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcG9zWCA9IGJhc2VYICsgKHBvc2l0aW9uWzBdIC0gcGFnZVgpIC8gcGFnZVdpZHRoO1xuICAgICAgICAgICAgcG9zWSA9IGJhc2VZICsgdGhpcy5oZWlnaHQgLSAocG9zaXRpb25bMV0gLSBwYWdlWSkgLyBwYWdlSGVpZ2h0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgIHBvc1ggPSBiYXNlWCArIChwb3NpdGlvblswXSAtIHBhZ2VYKSAvIHBhZ2VXaWR0aDtcbiAgICAgICAgICAgIHBvc1kgPSBiYXNlWSAtIChwb3NpdGlvblsxXSAtIHBhZ2VZKSAvIHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgICBbdHgsIHR5XSA9IFt0eSwgLXR4XTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTgwOlxuICAgICAgICAgICAgcG9zWCA9IGJhc2VYIC0gdGhpcy53aWR0aCArIChwb3NpdGlvblswXSAtIHBhZ2VYKSAvIHBhZ2VXaWR0aDtcbiAgICAgICAgICAgIHBvc1kgPSBiYXNlWSAtIChwb3NpdGlvblsxXSAtIHBhZ2VZKSAvIHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgICBbdHgsIHR5XSA9IFstdHgsIC10eV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgIHBvc1ggPSBiYXNlWCArIChwb3NpdGlvblswXSAtIHBhZ2VYIC0gdGhpcy5oZWlnaHQgKiBwYWdlSGVpZ2h0KSAvIHBhZ2VXaWR0aDtcbiAgICAgICAgICAgIHBvc1kgPSBiYXNlWSArIChwb3NpdGlvblsxXSAtIHBhZ2VZIC0gdGhpcy53aWR0aCAqIHBhZ2VXaWR0aCkgLyBwYWdlSGVpZ2h0O1xuICAgICAgICAgICAgW3R4LCB0eV0gPSBbLXR5LCB0eF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEF0KHBvc1ggKiBwYXJlbnRXaWR0aCwgcG9zWSAqIHBhcmVudEhlaWdodCwgdHgsIHR5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0QXQoYmFzZVggKiBwYXJlbnRXaWR0aCwgYmFzZVkgKiBwYXJlbnRIZWlnaHQsIHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgICAgfVxuICAgICAgdGhpcy4jc2V0Q29udGVudCgpO1xuICAgICAgdGhpcy5faXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaXY7XG4gIH1cbiAgc3RhdGljICNnZXROb2RlQ29udGVudChub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSA/IG5vZGUubm9kZVZhbHVlIDogbm9kZS5pbm5lclRleHQpLnJlcGxhY2VBbGwoRU9MX1BBVFRFUk4sIFwiXCIpO1xuICB9XG4gIGVkaXRvckRpdlBhc3RlKGV2ZW50KSB7XG4gICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGEgfHwgd2luZG93LmNsaXBib2FyZERhdGE7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZXNcbiAgICB9ID0gY2xpcGJvYXJkRGF0YTtcbiAgICBpZiAodHlwZXMubGVuZ3RoID09PSAxICYmIHR5cGVzWzBdID09PSBcInRleHQvcGxhaW5cIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHBhc3RlID0gRnJlZVRleHRFZGl0b3IuI2Rlc2VyaWFsaXplQ29udGVudChjbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0XCIpIHx8IFwiXCIpLnJlcGxhY2VBbGwoRU9MX1BBVFRFUk4sIFwiXFxuXCIpO1xuICAgIGlmICghcGFzdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lZGl0b3JEaXYubm9ybWFsaXplKCk7XG4gICAgc2VsZWN0aW9uLmRlbGV0ZUZyb21Eb2N1bWVudCgpO1xuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgaWYgKCFwYXN0ZS5pbmNsdWRlcyhcIlxcblwiKSkge1xuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXN0ZSkpO1xuICAgICAgdGhpcy5lZGl0b3JEaXYubm9ybWFsaXplKCk7XG4gICAgICBzZWxlY3Rpb24uY29sbGFwc2VUb1N0YXJ0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHN0YXJ0Q29udGFpbmVyLFxuICAgICAgc3RhcnRPZmZzZXRcbiAgICB9ID0gcmFuZ2U7XG4gICAgY29uc3QgYnVmZmVyQmVmb3JlID0gW107XG4gICAgY29uc3QgYnVmZmVyQWZ0ZXIgPSBbXTtcbiAgICBpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBzdGFydENvbnRhaW5lci5wYXJlbnRFbGVtZW50O1xuICAgICAgYnVmZmVyQWZ0ZXIucHVzaChzdGFydENvbnRhaW5lci5ub2RlVmFsdWUuc2xpY2Uoc3RhcnRPZmZzZXQpLnJlcGxhY2VBbGwoRU9MX1BBVFRFUk4sIFwiXCIpKTtcbiAgICAgIGlmIChwYXJlbnQgIT09IHRoaXMuZWRpdG9yRGl2KSB7XG4gICAgICAgIGxldCBidWZmZXIgPSBidWZmZXJCZWZvcmU7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5lZGl0b3JEaXYuY2hpbGROb2Rlcykge1xuICAgICAgICAgIGlmIChjaGlsZCA9PT0gcGFyZW50KSB7XG4gICAgICAgICAgICBidWZmZXIgPSBidWZmZXJBZnRlcjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBidWZmZXIucHVzaChGcmVlVGV4dEVkaXRvci4jZ2V0Tm9kZUNvbnRlbnQoY2hpbGQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnVmZmVyQmVmb3JlLnB1c2goc3RhcnRDb250YWluZXIubm9kZVZhbHVlLnNsaWNlKDAsIHN0YXJ0T2Zmc2V0KS5yZXBsYWNlQWxsKEVPTF9QQVRURVJOLCBcIlwiKSk7XG4gICAgfSBlbHNlIGlmIChzdGFydENvbnRhaW5lciA9PT0gdGhpcy5lZGl0b3JEaXYpIHtcbiAgICAgIGxldCBidWZmZXIgPSBidWZmZXJCZWZvcmU7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuZWRpdG9yRGl2LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgaWYgKGkrKyA9PT0gc3RhcnRPZmZzZXQpIHtcbiAgICAgICAgICBidWZmZXIgPSBidWZmZXJBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIucHVzaChGcmVlVGV4dEVkaXRvci4jZ2V0Tm9kZUNvbnRlbnQoY2hpbGQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jY29udGVudCA9IGAke2J1ZmZlckJlZm9yZS5qb2luKFwiXFxuXCIpfSR7cGFzdGV9JHtidWZmZXJBZnRlci5qb2luKFwiXFxuXCIpfWA7XG4gICAgdGhpcy4jc2V0Q29udGVudCgpO1xuICAgIGNvbnN0IG5ld1JhbmdlID0gbmV3IFJhbmdlKCk7XG4gICAgbGV0IGJlZm9yZUxlbmd0aCA9IGJ1ZmZlckJlZm9yZS5yZWR1Y2UoKGFjYywgbGluZSkgPT4gYWNjICsgbGluZS5sZW5ndGgsIDApO1xuICAgIGZvciAoY29uc3Qge1xuICAgICAgZmlyc3RDaGlsZFxuICAgIH0gb2YgdGhpcy5lZGl0b3JEaXYuY2hpbGROb2Rlcykge1xuICAgICAgaWYgKGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGZpcnN0Q2hpbGQubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgICAgaWYgKGJlZm9yZUxlbmd0aCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICBuZXdSYW5nZS5zZXRTdGFydChmaXJzdENoaWxkLCBiZWZvcmVMZW5ndGgpO1xuICAgICAgICAgIG5ld1JhbmdlLnNldEVuZChmaXJzdENoaWxkLCBiZWZvcmVMZW5ndGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJlZm9yZUxlbmd0aCAtPSBsZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UobmV3UmFuZ2UpO1xuICB9XG4gICNzZXRDb250ZW50KCkge1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIGlmICghdGhpcy4jY29udGVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy4jY29udGVudC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGRpdi5hcHBlbmQobGluZSA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgIHRoaXMuZWRpdG9yRGl2LmFwcGVuZChkaXYpO1xuICAgIH1cbiAgfVxuICAjc2VyaWFsaXplQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY29udGVudC5yZXBsYWNlQWxsKFwiXFx4YTBcIiwgXCIgXCIpO1xuICB9XG4gIHN0YXRpYyAjZGVzZXJpYWxpemVDb250ZW50KGNvbnRlbnQpIHtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKFwiIFwiLCBcIlxceGEwXCIpO1xuICB9XG4gIGdldCBjb250ZW50RGl2KCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvckRpdjtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBsZXQgaW5pdGlhbERhdGEgPSBudWxsO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgZGVmYXVsdEFwcGVhcmFuY2VEYXRhOiB7XG4gICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnRDb2xvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVjdCxcbiAgICAgICAgICByb3RhdGlvbixcbiAgICAgICAgICBpZFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0Q29udGVudCxcbiAgICAgICAgdGV4dFBvc2l0aW9uLFxuICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgICBwYWdlTnVtYmVyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9ID0gZGF0YTtcbiAgICAgIGlmICghdGV4dENvbnRlbnQgfHwgdGV4dENvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaW5pdGlhbERhdGEgPSBkYXRhID0ge1xuICAgICAgICBhbm5vdGF0aW9uVHlwZTogQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsXG4gICAgICAgIGNvbG9yOiBBcnJheS5mcm9tKGZvbnRDb2xvciksXG4gICAgICAgIGZvbnRTaXplLFxuICAgICAgICB2YWx1ZTogdGV4dENvbnRlbnQuam9pbihcIlxcblwiKSxcbiAgICAgICAgcG9zaXRpb246IHRleHRQb3NpdGlvbixcbiAgICAgICAgcGFnZUluZGV4OiBwYWdlTnVtYmVyIC0gMSxcbiAgICAgICAgcmVjdDogcmVjdC5zbGljZSgwKSxcbiAgICAgICAgcm90YXRpb24sXG4gICAgICAgIGlkLFxuICAgICAgICBkZWxldGVkOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgZWRpdG9yID0gc3VwZXIuZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpO1xuICAgIGVkaXRvci4jZm9udFNpemUgPSBkYXRhLmZvbnRTaXplO1xuICAgIGVkaXRvci4jY29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5kYXRhLmNvbG9yKTtcbiAgICBlZGl0b3IuI2NvbnRlbnQgPSBGcmVlVGV4dEVkaXRvci4jZGVzZXJpYWxpemVDb250ZW50KGRhdGEudmFsdWUpO1xuICAgIGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkID0gZGF0YS5pZCB8fCBudWxsO1xuICAgIGVkaXRvci4jaW5pdGlhbERhdGEgPSBpbml0aWFsRGF0YTtcbiAgICByZXR1cm4gZWRpdG9yO1xuICB9XG4gIHNlcmlhbGl6ZShpc0ZvckNvcHlpbmcgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlbGV0ZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICAgIGlkOiB0aGlzLmFubm90YXRpb25FbGVtZW50SWQsXG4gICAgICAgIGRlbGV0ZWQ6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHBhZGRpbmcgPSBGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogdGhpcy5wYXJlbnRTY2FsZTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRSZWN0KHBhZGRpbmcsIHBhZGRpbmcpO1xuICAgIGNvbnN0IGNvbG9yID0gQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5pc0F0dGFjaGVkVG9ET00gPyBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWRpdG9yRGl2KS5jb2xvciA6IHRoaXMuI2NvbG9yKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0ge1xuICAgICAgYW5ub3RhdGlvblR5cGU6IEFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhULFxuICAgICAgY29sb3IsXG4gICAgICBmb250U2l6ZTogdGhpcy4jZm9udFNpemUsXG4gICAgICB2YWx1ZTogdGhpcy4jc2VyaWFsaXplQ29udGVudCgpLFxuICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgIHJlY3QsXG4gICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbixcbiAgICAgIHN0cnVjdFRyZWVQYXJlbnRJZDogdGhpcy5fc3RydWN0VHJlZVBhcmVudElkXG4gICAgfTtcbiAgICBpZiAoaXNGb3JDb3B5aW5nKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCAmJiAhdGhpcy4jaGFzRWxlbWVudENoYW5nZWQoc2VyaWFsaXplZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXJpYWxpemVkLmlkID0gdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkO1xuICAgIHJldHVybiBzZXJpYWxpemVkO1xuICB9XG4gICNoYXNFbGVtZW50Q2hhbmdlZChzZXJpYWxpemVkKSB7XG4gICAgY29uc3Qge1xuICAgICAgdmFsdWUsXG4gICAgICBmb250U2l6ZSxcbiAgICAgIGNvbG9yLFxuICAgICAgcGFnZUluZGV4XG4gICAgfSA9IHRoaXMuI2luaXRpYWxEYXRhO1xuICAgIHJldHVybiB0aGlzLl9oYXNCZWVuTW92ZWQgfHwgc2VyaWFsaXplZC52YWx1ZSAhPT0gdmFsdWUgfHwgc2VyaWFsaXplZC5mb250U2l6ZSAhPT0gZm9udFNpemUgfHwgc2VyaWFsaXplZC5jb2xvci5zb21lKChjLCBpKSA9PiBjICE9PSBjb2xvcltpXSkgfHwgc2VyaWFsaXplZC5wYWdlSW5kZXggIT09IHBhZ2VJbmRleDtcbiAgfVxuICByZW5kZXJBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uKSB7XG4gICAgY29uc3QgY29udGVudCA9IHN1cGVyLnJlbmRlckFubm90YXRpb25FbGVtZW50KGFubm90YXRpb24pO1xuICAgIGlmICh0aGlzLmRlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSBjb250ZW50O1xuICAgIHN0eWxlLmZvbnRTaXplID0gYGNhbGMoJHt0aGlzLiNmb250U2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcbiAgICBzdHlsZS5jb2xvciA9IHRoaXMuI2NvbG9yO1xuICAgIGNvbnRlbnQucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMuI2NvbnRlbnQuc3BsaXQoXCJcXG5cIikpIHtcbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBkaXYuYXBwZW5kKGxpbmUgPyBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XG4gICAgICBjb250ZW50LmFwcGVuZChkaXYpO1xuICAgIH1cbiAgICBjb25zdCBwYWRkaW5nID0gRnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyAqIHRoaXMucGFyZW50U2NhbGU7XG4gICAgYW5ub3RhdGlvbi51cGRhdGVFZGl0ZWQoe1xuICAgICAgcmVjdDogdGhpcy5nZXRSZWN0KHBhZGRpbmcsIHBhZGRpbmcpLFxuICAgICAgcG9wdXBDb250ZW50OiB0aGlzLiNjb250ZW50XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgcmVzZXRBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uKSB7XG4gICAgc3VwZXIucmVzZXRBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uKTtcbiAgICBhbm5vdGF0aW9uLnJlc2V0RWRpdGVkKCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL291dGxpbmVyLmpzXG5cbmNsYXNzIE91dGxpbmVyIHtcbiAgI2JveDtcbiAgI3ZlcnRpY2FsRWRnZXMgPSBbXTtcbiAgI2ludGVydmFscyA9IFtdO1xuICBjb25zdHJ1Y3Rvcihib3hlcywgYm9yZGVyV2lkdGggPSAwLCBpbm5lck1hcmdpbiA9IDAsIGlzTFRSID0gdHJ1ZSkge1xuICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBjb25zdCBOVU1CRVJfT0ZfRElHSVRTID0gNDtcbiAgICBjb25zdCBFUFNJTE9OID0gMTAgKiogLU5VTUJFUl9PRl9ESUdJVFM7XG4gICAgZm9yIChjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSBvZiBib3hlcykge1xuICAgICAgY29uc3QgeDEgPSBNYXRoLmZsb29yKCh4IC0gYm9yZGVyV2lkdGgpIC8gRVBTSUxPTikgKiBFUFNJTE9OO1xuICAgICAgY29uc3QgeDIgPSBNYXRoLmNlaWwoKHggKyB3aWR0aCArIGJvcmRlcldpZHRoKSAvIEVQU0lMT04pICogRVBTSUxPTjtcbiAgICAgIGNvbnN0IHkxID0gTWF0aC5mbG9vcigoeSAtIGJvcmRlcldpZHRoKSAvIEVQU0lMT04pICogRVBTSUxPTjtcbiAgICAgIGNvbnN0IHkyID0gTWF0aC5jZWlsKCh5ICsgaGVpZ2h0ICsgYm9yZGVyV2lkdGgpIC8gRVBTSUxPTikgKiBFUFNJTE9OO1xuICAgICAgY29uc3QgbGVmdCA9IFt4MSwgeTEsIHkyLCB0cnVlXTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gW3gyLCB5MSwgeTIsIGZhbHNlXTtcbiAgICAgIHRoaXMuI3ZlcnRpY2FsRWRnZXMucHVzaChsZWZ0LCByaWdodCk7XG4gICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeDEpO1xuICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgyKTtcbiAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5MSk7XG4gICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeTIpO1xuICAgIH1cbiAgICBjb25zdCBiYm94V2lkdGggPSBtYXhYIC0gbWluWCArIDIgKiBpbm5lck1hcmdpbjtcbiAgICBjb25zdCBiYm94SGVpZ2h0ID0gbWF4WSAtIG1pblkgKyAyICogaW5uZXJNYXJnaW47XG4gICAgY29uc3Qgc2hpZnRlZE1pblggPSBtaW5YIC0gaW5uZXJNYXJnaW47XG4gICAgY29uc3Qgc2hpZnRlZE1pblkgPSBtaW5ZIC0gaW5uZXJNYXJnaW47XG4gICAgY29uc3QgbGFzdEVkZ2UgPSB0aGlzLiN2ZXJ0aWNhbEVkZ2VzLmF0KGlzTFRSID8gLTEgOiAtMik7XG4gICAgY29uc3QgbGFzdFBvaW50ID0gW2xhc3RFZGdlWzBdLCBsYXN0RWRnZVsyXV07XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIHRoaXMuI3ZlcnRpY2FsRWRnZXMpIHtcbiAgICAgIGNvbnN0IFt4LCB5MSwgeTJdID0gZWRnZTtcbiAgICAgIGVkZ2VbMF0gPSAoeCAtIHNoaWZ0ZWRNaW5YKSAvIGJib3hXaWR0aDtcbiAgICAgIGVkZ2VbMV0gPSAoeTEgLSBzaGlmdGVkTWluWSkgLyBiYm94SGVpZ2h0O1xuICAgICAgZWRnZVsyXSA9ICh5MiAtIHNoaWZ0ZWRNaW5ZKSAvIGJib3hIZWlnaHQ7XG4gICAgfVxuICAgIHRoaXMuI2JveCA9IHtcbiAgICAgIHg6IHNoaWZ0ZWRNaW5YLFxuICAgICAgeTogc2hpZnRlZE1pblksXG4gICAgICB3aWR0aDogYmJveFdpZHRoLFxuICAgICAgaGVpZ2h0OiBiYm94SGVpZ2h0LFxuICAgICAgbGFzdFBvaW50XG4gICAgfTtcbiAgfVxuICBnZXRPdXRsaW5lcygpIHtcbiAgICB0aGlzLiN2ZXJ0aWNhbEVkZ2VzLnNvcnQoKGEsIGIpID0+IGFbMF0gLSBiWzBdIHx8IGFbMV0gLSBiWzFdIHx8IGFbMl0gLSBiWzJdKTtcbiAgICBjb25zdCBvdXRsaW5lVmVydGljYWxFZGdlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZWRnZSBvZiB0aGlzLiN2ZXJ0aWNhbEVkZ2VzKSB7XG4gICAgICBpZiAoZWRnZVszXSkge1xuICAgICAgICBvdXRsaW5lVmVydGljYWxFZGdlcy5wdXNoKC4uLnRoaXMuI2JyZWFrRWRnZShlZGdlKSk7XG4gICAgICAgIHRoaXMuI2luc2VydChlZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI3JlbW92ZShlZGdlKTtcbiAgICAgICAgb3V0bGluZVZlcnRpY2FsRWRnZXMucHVzaCguLi50aGlzLiNicmVha0VkZ2UoZWRnZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jZ2V0T3V0bGluZXMob3V0bGluZVZlcnRpY2FsRWRnZXMpO1xuICB9XG4gICNnZXRPdXRsaW5lcyhvdXRsaW5lVmVydGljYWxFZGdlcykge1xuICAgIGNvbnN0IGVkZ2VzID0gW107XG4gICAgY29uc3QgYWxsRWRnZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIG91dGxpbmVWZXJ0aWNhbEVkZ2VzKSB7XG4gICAgICBjb25zdCBbeCwgeTEsIHkyXSA9IGVkZ2U7XG4gICAgICBlZGdlcy5wdXNoKFt4LCB5MSwgZWRnZV0sIFt4LCB5MiwgZWRnZV0pO1xuICAgIH1cbiAgICBlZGdlcy5zb3J0KChhLCBiKSA9PiBhWzFdIC0gYlsxXSB8fCBhWzBdIC0gYlswXSk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZWRnZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgY29uc3QgZWRnZTEgPSBlZGdlc1tpXVsyXTtcbiAgICAgIGNvbnN0IGVkZ2UyID0gZWRnZXNbaSArIDFdWzJdO1xuICAgICAgZWRnZTEucHVzaChlZGdlMik7XG4gICAgICBlZGdlMi5wdXNoKGVkZ2UxKTtcbiAgICAgIGFsbEVkZ2VzLmFkZChlZGdlMSk7XG4gICAgICBhbGxFZGdlcy5hZGQoZWRnZTIpO1xuICAgIH1cbiAgICBjb25zdCBvdXRsaW5lcyA9IFtdO1xuICAgIGxldCBvdXRsaW5lO1xuICAgIHdoaWxlIChhbGxFZGdlcy5zaXplID4gMCkge1xuICAgICAgY29uc3QgZWRnZSA9IGFsbEVkZ2VzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGxldCBbeCwgeTEsIHkyLCBlZGdlMSwgZWRnZTJdID0gZWRnZTtcbiAgICAgIGFsbEVkZ2VzLmRlbGV0ZShlZGdlKTtcbiAgICAgIGxldCBsYXN0UG9pbnRYID0geDtcbiAgICAgIGxldCBsYXN0UG9pbnRZID0geTE7XG4gICAgICBvdXRsaW5lID0gW3gsIHkyXTtcbiAgICAgIG91dGxpbmVzLnB1c2gob3V0bGluZSk7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgZTtcbiAgICAgICAgaWYgKGFsbEVkZ2VzLmhhcyhlZGdlMSkpIHtcbiAgICAgICAgICBlID0gZWRnZTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYWxsRWRnZXMuaGFzKGVkZ2UyKSkge1xuICAgICAgICAgIGUgPSBlZGdlMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBhbGxFZGdlcy5kZWxldGUoZSk7XG4gICAgICAgIFt4LCB5MSwgeTIsIGVkZ2UxLCBlZGdlMl0gPSBlO1xuICAgICAgICBpZiAobGFzdFBvaW50WCAhPT0geCkge1xuICAgICAgICAgIG91dGxpbmUucHVzaChsYXN0UG9pbnRYLCBsYXN0UG9pbnRZLCB4LCBsYXN0UG9pbnRZID09PSB5MSA/IHkxIDogeTIpO1xuICAgICAgICAgIGxhc3RQb2ludFggPSB4O1xuICAgICAgICB9XG4gICAgICAgIGxhc3RQb2ludFkgPSBsYXN0UG9pbnRZID09PSB5MSA/IHkyIDogeTE7XG4gICAgICB9XG4gICAgICBvdXRsaW5lLnB1c2gobGFzdFBvaW50WCwgbGFzdFBvaW50WSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0T3V0bGluZShvdXRsaW5lcywgdGhpcy4jYm94KTtcbiAgfVxuICAjYmluYXJ5U2VhcmNoKHkpIHtcbiAgICBjb25zdCBhcnJheSA9IHRoaXMuI2ludGVydmFscztcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBlbmQgPSBhcnJheS5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzdGFydCA8PSBlbmQpIHtcbiAgICAgIGNvbnN0IG1pZGRsZSA9IHN0YXJ0ICsgZW5kID4+IDE7XG4gICAgICBjb25zdCB5MSA9IGFycmF5W21pZGRsZV1bMF07XG4gICAgICBpZiAoeTEgPT09IHkpIHtcbiAgICAgICAgcmV0dXJuIG1pZGRsZTtcbiAgICAgIH1cbiAgICAgIGlmICh5MSA8IHkpIHtcbiAgICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gbWlkZGxlIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuZCArIDE7XG4gIH1cbiAgI2luc2VydChbLCB5MSwgeTJdKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNiaW5hcnlTZWFyY2goeTEpO1xuICAgIHRoaXMuI2ludGVydmFscy5zcGxpY2UoaW5kZXgsIDAsIFt5MSwgeTJdKTtcbiAgfVxuICAjcmVtb3ZlKFssIHkxLCB5Ml0pIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuI2JpbmFyeVNlYXJjaCh5MSk7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgdGhpcy4jaW50ZXJ2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLiNpbnRlcnZhbHNbaV07XG4gICAgICBpZiAoc3RhcnQgIT09IHkxKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ID09PSB5MSAmJiBlbmQgPT09IHkyKSB7XG4gICAgICAgIHRoaXMuI2ludGVydmFscy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IGluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuI2ludGVydmFsc1tpXTtcbiAgICAgIGlmIChzdGFydCAhPT0geTEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgPT09IHkxICYmIGVuZCA9PT0geTIpIHtcbiAgICAgICAgdGhpcy4jaW50ZXJ2YWxzLnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAjYnJlYWtFZGdlKGVkZ2UpIHtcbiAgICBjb25zdCBbeCwgeTEsIHkyXSA9IGVkZ2U7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtbeCwgeTEsIHkyXV07XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNiaW5hcnlTZWFyY2goeTIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykge1xuICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy4jaW50ZXJ2YWxzW2ldO1xuICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gcmVzdWx0cy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIGNvbnN0IFssIHkzLCB5NF0gPSByZXN1bHRzW2pdO1xuICAgICAgICBpZiAoZW5kIDw9IHkzIHx8IHk0IDw9IHN0YXJ0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHkzID49IHN0YXJ0KSB7XG4gICAgICAgICAgaWYgKHk0ID4gZW5kKSB7XG4gICAgICAgICAgICByZXN1bHRzW2pdWzFdID0gZW5kO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoamogPT09IDEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0cy5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgICBqLS07XG4gICAgICAgICAgICBqai0tO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRzW2pdWzJdID0gc3RhcnQ7XG4gICAgICAgIGlmICh5NCA+IGVuZCkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChbeCwgZW5kLCB5NF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG5jbGFzcyBPdXRsaW5lIHtcbiAgdG9TVkdQYXRoKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0IG1ldGhvZCBgdG9TVkdQYXRoYCBtdXN0IGJlIGltcGxlbWVudGVkLlwiKTtcbiAgfVxuICBnZXQgYm94KCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0IGdldHRlciBgYm94YCBtdXN0IGJlIGltcGxlbWVudGVkLlwiKTtcbiAgfVxuICBzZXJpYWxpemUoX2Jib3gsIF9yb3RhdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0IG1ldGhvZCBgc2VyaWFsaXplYCBtdXN0IGJlIGltcGxlbWVudGVkLlwiKTtcbiAgfVxuICBnZXQgZnJlZSgpIHtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIEZyZWVIaWdobGlnaHRPdXRsaW5lO1xuICB9XG59XG5jbGFzcyBIaWdobGlnaHRPdXRsaW5lIGV4dGVuZHMgT3V0bGluZSB7XG4gICNib3g7XG4gICNvdXRsaW5lcztcbiAgY29uc3RydWN0b3Iob3V0bGluZXMsIGJveCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jb3V0bGluZXMgPSBvdXRsaW5lcztcbiAgICB0aGlzLiNib3ggPSBib3g7XG4gIH1cbiAgdG9TVkdQYXRoKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IFtdO1xuICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiB0aGlzLiNvdXRsaW5lcykge1xuICAgICAgbGV0IFtwcmV2WCwgcHJldlldID0gcG9seWdvbjtcbiAgICAgIGJ1ZmZlci5wdXNoKGBNJHtwcmV2WH0gJHtwcmV2WX1gKTtcbiAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBjb25zdCB4ID0gcG9seWdvbltpXTtcbiAgICAgICAgY29uc3QgeSA9IHBvbHlnb25baSArIDFdO1xuICAgICAgICBpZiAoeCA9PT0gcHJldlgpIHtcbiAgICAgICAgICBidWZmZXIucHVzaChgViR7eX1gKTtcbiAgICAgICAgICBwcmV2WSA9IHk7XG4gICAgICAgIH0gZWxzZSBpZiAoeSA9PT0gcHJldlkpIHtcbiAgICAgICAgICBidWZmZXIucHVzaChgSCR7eH1gKTtcbiAgICAgICAgICBwcmV2WCA9IHg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJ1ZmZlci5wdXNoKFwiWlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlci5qb2luKFwiIFwiKTtcbiAgfVxuICBzZXJpYWxpemUoW2JsWCwgYmxZLCB0clgsIHRyWV0sIF9yb3RhdGlvbikge1xuICAgIGNvbnN0IG91dGxpbmVzID0gW107XG4gICAgY29uc3Qgd2lkdGggPSB0clggLSBibFg7XG4gICAgY29uc3QgaGVpZ2h0ID0gdHJZIC0gYmxZO1xuICAgIGZvciAoY29uc3Qgb3V0bGluZSBvZiB0aGlzLiNvdXRsaW5lcykge1xuICAgICAgY29uc3QgcG9pbnRzID0gbmV3IEFycmF5KG91dGxpbmUubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0bGluZS5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBwb2ludHNbaV0gPSBibFggKyBvdXRsaW5lW2ldICogd2lkdGg7XG4gICAgICAgIHBvaW50c1tpICsgMV0gPSB0clkgLSBvdXRsaW5lW2kgKyAxXSAqIGhlaWdodDtcbiAgICAgIH1cbiAgICAgIG91dGxpbmVzLnB1c2gocG9pbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dGxpbmVzO1xuICB9XG4gIGdldCBib3goKSB7XG4gICAgcmV0dXJuIHRoaXMuI2JveDtcbiAgfVxufVxuY2xhc3MgRnJlZU91dGxpbmVyIHtcbiAgI2JveDtcbiAgI2JvdHRvbSA9IFtdO1xuICAjaW5uZXJNYXJnaW47XG4gICNpc0xUUjtcbiAgI3RvcCA9IFtdO1xuICAjbGFzdCA9IG5ldyBGbG9hdDY0QXJyYXkoMTgpO1xuICAjbGFzdFg7XG4gICNsYXN0WTtcbiAgI21pbjtcbiAgI21pbl9kaXN0O1xuICAjc2NhbGVGYWN0b3I7XG4gICN0aGlja25lc3M7XG4gICNwb2ludHMgPSBbXTtcbiAgc3RhdGljICNNSU5fRElTVCA9IDg7XG4gIHN0YXRpYyAjTUlOX0RJRkYgPSAyO1xuICBzdGF0aWMgI01JTiA9IEZyZWVPdXRsaW5lci4jTUlOX0RJU1QgKyBGcmVlT3V0bGluZXIuI01JTl9ESUZGO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgeCxcbiAgICB5XG4gIH0sIGJveCwgc2NhbGVGYWN0b3IsIHRoaWNrbmVzcywgaXNMVFIsIGlubmVyTWFyZ2luID0gMCkge1xuICAgIHRoaXMuI2JveCA9IGJveDtcbiAgICB0aGlzLiN0aGlja25lc3MgPSB0aGlja25lc3MgKiBzY2FsZUZhY3RvcjtcbiAgICB0aGlzLiNpc0xUUiA9IGlzTFRSO1xuICAgIHRoaXMuI2xhc3Quc2V0KFtOYU4sIE5hTiwgTmFOLCBOYU4sIHgsIHldLCA2KTtcbiAgICB0aGlzLiNpbm5lck1hcmdpbiA9IGlubmVyTWFyZ2luO1xuICAgIHRoaXMuI21pbl9kaXN0ID0gRnJlZU91dGxpbmVyLiNNSU5fRElTVCAqIHNjYWxlRmFjdG9yO1xuICAgIHRoaXMuI21pbiA9IEZyZWVPdXRsaW5lci4jTUlOICogc2NhbGVGYWN0b3I7XG4gICAgdGhpcy4jc2NhbGVGYWN0b3IgPSBzY2FsZUZhY3RvcjtcbiAgICB0aGlzLiNwb2ludHMucHVzaCh4LCB5KTtcbiAgfVxuICBnZXQgZnJlZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiBpc05hTih0aGlzLiNsYXN0WzhdKTtcbiAgfVxuICAjZ2V0TGFzdENvb3JkcygpIHtcbiAgICBjb25zdCBsYXN0VG9wID0gdGhpcy4jbGFzdC5zdWJhcnJheSg0LCA2KTtcbiAgICBjb25zdCBsYXN0Qm90dG9tID0gdGhpcy4jbGFzdC5zdWJhcnJheSgxNiwgMTgpO1xuICAgIGNvbnN0IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSA9IHRoaXMuI2JveDtcbiAgICByZXR1cm4gWyh0aGlzLiNsYXN0WCArIChsYXN0VG9wWzBdIC0gbGFzdEJvdHRvbVswXSkgLyAyIC0geCkgLyB3aWR0aCwgKHRoaXMuI2xhc3RZICsgKGxhc3RUb3BbMV0gLSBsYXN0Qm90dG9tWzFdKSAvIDIgLSB5KSAvIGhlaWdodCwgKHRoaXMuI2xhc3RYICsgKGxhc3RCb3R0b21bMF0gLSBsYXN0VG9wWzBdKSAvIDIgLSB4KSAvIHdpZHRoLCAodGhpcy4jbGFzdFkgKyAobGFzdEJvdHRvbVsxXSAtIGxhc3RUb3BbMV0pIC8gMiAtIHkpIC8gaGVpZ2h0XTtcbiAgfVxuICBhZGQoe1xuICAgIHgsXG4gICAgeVxuICB9KSB7XG4gICAgdGhpcy4jbGFzdFggPSB4O1xuICAgIHRoaXMuI2xhc3RZID0geTtcbiAgICBjb25zdCBbbGF5ZXJYLCBsYXllclksIGxheWVyV2lkdGgsIGxheWVySGVpZ2h0XSA9IHRoaXMuI2JveDtcbiAgICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoOCwgMTIpO1xuICAgIGNvbnN0IGRpZmZYID0geCAtIHgyO1xuICAgIGNvbnN0IGRpZmZZID0geSAtIHkyO1xuICAgIGNvbnN0IGQgPSBNYXRoLmh5cG90KGRpZmZYLCBkaWZmWSk7XG4gICAgaWYgKGQgPCB0aGlzLiNtaW4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZGlmZkQgPSBkIC0gdGhpcy4jbWluX2Rpc3Q7XG4gICAgY29uc3QgSyA9IGRpZmZEIC8gZDtcbiAgICBjb25zdCBzaGlmdFggPSBLICogZGlmZlg7XG4gICAgY29uc3Qgc2hpZnRZID0gSyAqIGRpZmZZO1xuICAgIGxldCB4MCA9IHgxO1xuICAgIGxldCB5MCA9IHkxO1xuICAgIHgxID0geDI7XG4gICAgeTEgPSB5MjtcbiAgICB4MiArPSBzaGlmdFg7XG4gICAgeTIgKz0gc2hpZnRZO1xuICAgIHRoaXMuI3BvaW50cz8ucHVzaCh4LCB5KTtcbiAgICBjb25zdCBuWCA9IC1zaGlmdFkgLyBkaWZmRDtcbiAgICBjb25zdCBuWSA9IHNoaWZ0WCAvIGRpZmZEO1xuICAgIGNvbnN0IHRoWCA9IG5YICogdGhpcy4jdGhpY2tuZXNzO1xuICAgIGNvbnN0IHRoWSA9IG5ZICogdGhpcy4jdGhpY2tuZXNzO1xuICAgIHRoaXMuI2xhc3Quc2V0KHRoaXMuI2xhc3Quc3ViYXJyYXkoMiwgOCksIDApO1xuICAgIHRoaXMuI2xhc3Quc2V0KFt4MiArIHRoWCwgeTIgKyB0aFldLCA0KTtcbiAgICB0aGlzLiNsYXN0LnNldCh0aGlzLiNsYXN0LnN1YmFycmF5KDE0LCAxOCksIDEyKTtcbiAgICB0aGlzLiNsYXN0LnNldChbeDIgLSB0aFgsIHkyIC0gdGhZXSwgMTYpO1xuICAgIGlmIChpc05hTih0aGlzLiNsYXN0WzZdKSkge1xuICAgICAgaWYgKHRoaXMuI3RvcC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy4jbGFzdC5zZXQoW3gxICsgdGhYLCB5MSArIHRoWV0sIDIpO1xuICAgICAgICB0aGlzLiN0b3AucHVzaChOYU4sIE5hTiwgTmFOLCBOYU4sICh4MSArIHRoWCAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoeTEgKyB0aFkgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQpO1xuICAgICAgICB0aGlzLiNsYXN0LnNldChbeDEgLSB0aFgsIHkxIC0gdGhZXSwgMTQpO1xuICAgICAgICB0aGlzLiNib3R0b20ucHVzaChOYU4sIE5hTiwgTmFOLCBOYU4sICh4MSAtIHRoWCAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoeTEgLSB0aFkgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQpO1xuICAgICAgfVxuICAgICAgdGhpcy4jbGFzdC5zZXQoW3gwLCB5MCwgeDEsIHkxLCB4MiwgeTJdLCA2KTtcbiAgICAgIHJldHVybiAhdGhpcy5pc0VtcHR5KCk7XG4gICAgfVxuICAgIHRoaXMuI2xhc3Quc2V0KFt4MCwgeTAsIHgxLCB5MSwgeDIsIHkyXSwgNik7XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLmFicyhNYXRoLmF0YW4yKHkwIC0geTEsIHgwIC0geDEpIC0gTWF0aC5hdGFuMihzaGlmdFksIHNoaWZ0WCkpO1xuICAgIGlmIChhbmdsZSA8IE1hdGguUEkgLyAyKSB7XG4gICAgICBbeDEsIHkxLCB4MiwgeTJdID0gdGhpcy4jbGFzdC5zdWJhcnJheSgyLCA2KTtcbiAgICAgIHRoaXMuI3RvcC5wdXNoKE5hTiwgTmFOLCBOYU4sIE5hTiwgKCh4MSArIHgyKSAvIDIgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCh5MSArIHkyKSAvIDIgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQpO1xuICAgICAgW3gxLCB5MSwgeDAsIHkwXSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoMTQsIDE4KTtcbiAgICAgIHRoaXMuI2JvdHRvbS5wdXNoKE5hTiwgTmFOLCBOYU4sIE5hTiwgKCh4MCArIHgxKSAvIDIgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCh5MCArIHkxKSAvIDIgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFt4MCwgeTAsIHgxLCB5MSwgeDIsIHkyXSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoMCwgNik7XG4gICAgdGhpcy4jdG9wLnB1c2goKCh4MCArIDUgKiB4MSkgLyA2IC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICgoeTAgKyA1ICogeTEpIC8gNiAtIGxheWVyWSkgLyBsYXllckhlaWdodCwgKCg1ICogeDEgKyB4MikgLyA2IC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICgoNSAqIHkxICsgeTIpIC8gNiAtIGxheWVyWSkgLyBsYXllckhlaWdodCwgKCh4MSArIHgyKSAvIDIgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCh5MSArIHkyKSAvIDIgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQpO1xuICAgIFt4MiwgeTIsIHgxLCB5MSwgeDAsIHkwXSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoMTIsIDE4KTtcbiAgICB0aGlzLiNib3R0b20ucHVzaCgoKHgwICsgNSAqIHgxKSAvIDYgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCh5MCArIDUgKiB5MSkgLyA2IC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCAoKDUgKiB4MSArIHgyKSAvIDYgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCg1ICogeTEgKyB5MikgLyA2IC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCAoKHgxICsgeDIpIC8gMiAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoKHkxICsgeTIpIC8gMiAtIGxheWVyWSkgLyBsYXllckhlaWdodCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdG9TVkdQYXRoKCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IHRvcCA9IHRoaXMuI3RvcDtcbiAgICBjb25zdCBib3R0b20gPSB0aGlzLiNib3R0b207XG4gICAgY29uc3QgbGFzdFRvcCA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoNCwgNik7XG4gICAgY29uc3QgbGFzdEJvdHRvbSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoMTYsIDE4KTtcbiAgICBjb25zdCBbeCwgeSwgd2lkdGgsIGhlaWdodF0gPSB0aGlzLiNib3g7XG4gICAgY29uc3QgW2xhc3RUb3BYLCBsYXN0VG9wWSwgbGFzdEJvdHRvbVgsIGxhc3RCb3R0b21ZXSA9IHRoaXMuI2dldExhc3RDb29yZHMoKTtcbiAgICBpZiAoaXNOYU4odGhpcy4jbGFzdFs2XSkgJiYgIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gYE0keyh0aGlzLiNsYXN0WzJdIC0geCkgLyB3aWR0aH0gJHsodGhpcy4jbGFzdFszXSAtIHkpIC8gaGVpZ2h0fSBMJHsodGhpcy4jbGFzdFs0XSAtIHgpIC8gd2lkdGh9ICR7KHRoaXMuI2xhc3RbNV0gLSB5KSAvIGhlaWdodH0gTCR7bGFzdFRvcFh9ICR7bGFzdFRvcFl9IEwke2xhc3RCb3R0b21YfSAke2xhc3RCb3R0b21ZfSBMJHsodGhpcy4jbGFzdFsxNl0gLSB4KSAvIHdpZHRofSAkeyh0aGlzLiNsYXN0WzE3XSAtIHkpIC8gaGVpZ2h0fSBMJHsodGhpcy4jbGFzdFsxNF0gLSB4KSAvIHdpZHRofSAkeyh0aGlzLiNsYXN0WzE1XSAtIHkpIC8gaGVpZ2h0fSBaYDtcbiAgICB9XG4gICAgY29uc3QgYnVmZmVyID0gW107XG4gICAgYnVmZmVyLnB1c2goYE0ke3RvcFs0XX0gJHt0b3BbNV19YCk7XG4gICAgZm9yIChsZXQgaSA9IDY7IGkgPCB0b3AubGVuZ3RoOyBpICs9IDYpIHtcbiAgICAgIGlmIChpc05hTih0b3BbaV0pKSB7XG4gICAgICAgIGJ1ZmZlci5wdXNoKGBMJHt0b3BbaSArIDRdfSAke3RvcFtpICsgNV19YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBidWZmZXIucHVzaChgQyR7dG9wW2ldfSAke3RvcFtpICsgMV19ICR7dG9wW2kgKyAyXX0gJHt0b3BbaSArIDNdfSAke3RvcFtpICsgNF19ICR7dG9wW2kgKyA1XX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYnVmZmVyLnB1c2goYEwkeyhsYXN0VG9wWzBdIC0geCkgLyB3aWR0aH0gJHsobGFzdFRvcFsxXSAtIHkpIC8gaGVpZ2h0fSBMJHtsYXN0VG9wWH0gJHtsYXN0VG9wWX0gTCR7bGFzdEJvdHRvbVh9ICR7bGFzdEJvdHRvbVl9IEwkeyhsYXN0Qm90dG9tWzBdIC0geCkgLyB3aWR0aH0gJHsobGFzdEJvdHRvbVsxXSAtIHkpIC8gaGVpZ2h0fWApO1xuICAgIGZvciAobGV0IGkgPSBib3R0b20ubGVuZ3RoIC0gNjsgaSA+PSA2OyBpIC09IDYpIHtcbiAgICAgIGlmIChpc05hTihib3R0b21baV0pKSB7XG4gICAgICAgIGJ1ZmZlci5wdXNoKGBMJHtib3R0b21baSArIDRdfSAke2JvdHRvbVtpICsgNV19YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBidWZmZXIucHVzaChgQyR7Ym90dG9tW2ldfSAke2JvdHRvbVtpICsgMV19ICR7Ym90dG9tW2kgKyAyXX0gJHtib3R0b21baSArIDNdfSAke2JvdHRvbVtpICsgNF19ICR7Ym90dG9tW2kgKyA1XX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYnVmZmVyLnB1c2goYEwke2JvdHRvbVs0XX0gJHtib3R0b21bNV19IFpgKTtcbiAgICByZXR1cm4gYnVmZmVyLmpvaW4oXCIgXCIpO1xuICB9XG4gIGdldE91dGxpbmVzKCkge1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuI3RvcDtcbiAgICBjb25zdCBib3R0b20gPSB0aGlzLiNib3R0b207XG4gICAgY29uc3QgbGFzdCA9IHRoaXMuI2xhc3Q7XG4gICAgY29uc3QgbGFzdFRvcCA9IGxhc3Quc3ViYXJyYXkoNCwgNik7XG4gICAgY29uc3QgbGFzdEJvdHRvbSA9IGxhc3Quc3ViYXJyYXkoMTYsIDE4KTtcbiAgICBjb25zdCBbbGF5ZXJYLCBsYXllclksIGxheWVyV2lkdGgsIGxheWVySGVpZ2h0XSA9IHRoaXMuI2JveDtcbiAgICBjb25zdCBwb2ludHMgPSBuZXcgRmxvYXQ2NEFycmF5KCh0aGlzLiNwb2ludHM/Lmxlbmd0aCA/PyAwKSArIDIpO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGggLSAyOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgcG9pbnRzW2ldID0gKHRoaXMuI3BvaW50c1tpXSAtIGxheWVyWCkgLyBsYXllcldpZHRoO1xuICAgICAgcG9pbnRzW2kgKyAxXSA9ICh0aGlzLiNwb2ludHNbaSArIDFdIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0O1xuICAgIH1cbiAgICBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDJdID0gKHRoaXMuI2xhc3RYIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGg7XG4gICAgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSA9ICh0aGlzLiNsYXN0WSAtIGxheWVyWSkgLyBsYXllckhlaWdodDtcbiAgICBjb25zdCBbbGFzdFRvcFgsIGxhc3RUb3BZLCBsYXN0Qm90dG9tWCwgbGFzdEJvdHRvbVldID0gdGhpcy4jZ2V0TGFzdENvb3JkcygpO1xuICAgIGlmIChpc05hTihsYXN0WzZdKSAmJiAhdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIGNvbnN0IG91dGxpbmUgPSBuZXcgRmxvYXQ2NEFycmF5KDM2KTtcbiAgICAgIG91dGxpbmUuc2V0KFtOYU4sIE5hTiwgTmFOLCBOYU4sIChsYXN0WzJdIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsIChsYXN0WzNdIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCBOYU4sIE5hTiwgTmFOLCBOYU4sIChsYXN0WzRdIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsIChsYXN0WzVdIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCBOYU4sIE5hTiwgTmFOLCBOYU4sIGxhc3RUb3BYLCBsYXN0VG9wWSwgTmFOLCBOYU4sIE5hTiwgTmFOLCBsYXN0Qm90dG9tWCwgbGFzdEJvdHRvbVksIE5hTiwgTmFOLCBOYU4sIE5hTiwgKGxhc3RbMTZdIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsIChsYXN0WzE3XSAtIGxheWVyWSkgLyBsYXllckhlaWdodCwgTmFOLCBOYU4sIE5hTiwgTmFOLCAobGFzdFsxNF0gLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKGxhc3RbMTVdIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0XSwgMCk7XG4gICAgICByZXR1cm4gbmV3IEZyZWVIaWdobGlnaHRPdXRsaW5lKG91dGxpbmUsIHBvaW50cywgdGhpcy4jYm94LCB0aGlzLiNzY2FsZUZhY3RvciwgdGhpcy4jaW5uZXJNYXJnaW4sIHRoaXMuI2lzTFRSKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0bGluZSA9IG5ldyBGbG9hdDY0QXJyYXkodGhpcy4jdG9wLmxlbmd0aCArIDI0ICsgdGhpcy4jYm90dG9tLmxlbmd0aCk7XG4gICAgbGV0IE4gPSB0b3AubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSArPSAyKSB7XG4gICAgICBpZiAoaXNOYU4odG9wW2ldKSkge1xuICAgICAgICBvdXRsaW5lW2ldID0gb3V0bGluZVtpICsgMV0gPSBOYU47XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgb3V0bGluZVtpXSA9IHRvcFtpXTtcbiAgICAgIG91dGxpbmVbaSArIDFdID0gdG9wW2kgKyAxXTtcbiAgICB9XG4gICAgb3V0bGluZS5zZXQoW05hTiwgTmFOLCBOYU4sIE5hTiwgKGxhc3RUb3BbMF0gLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKGxhc3RUb3BbMV0gLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQsIE5hTiwgTmFOLCBOYU4sIE5hTiwgbGFzdFRvcFgsIGxhc3RUb3BZLCBOYU4sIE5hTiwgTmFOLCBOYU4sIGxhc3RCb3R0b21YLCBsYXN0Qm90dG9tWSwgTmFOLCBOYU4sIE5hTiwgTmFOLCAobGFzdEJvdHRvbVswXSAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAobGFzdEJvdHRvbVsxXSAtIGxheWVyWSkgLyBsYXllckhlaWdodF0sIE4pO1xuICAgIE4gKz0gMjQ7XG4gICAgZm9yIChsZXQgaSA9IGJvdHRvbS5sZW5ndGggLSA2OyBpID49IDY7IGkgLT0gNikge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA2OyBqICs9IDIpIHtcbiAgICAgICAgaWYgKGlzTmFOKGJvdHRvbVtpICsgal0pKSB7XG4gICAgICAgICAgb3V0bGluZVtOXSA9IG91dGxpbmVbTiArIDFdID0gTmFOO1xuICAgICAgICAgIE4gKz0gMjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBvdXRsaW5lW05dID0gYm90dG9tW2kgKyBqXTtcbiAgICAgICAgb3V0bGluZVtOICsgMV0gPSBib3R0b21baSArIGogKyAxXTtcbiAgICAgICAgTiArPSAyO1xuICAgICAgfVxuICAgIH1cbiAgICBvdXRsaW5lLnNldChbTmFOLCBOYU4sIE5hTiwgTmFOLCBib3R0b21bNF0sIGJvdHRvbVs1XV0sIE4pO1xuICAgIHJldHVybiBuZXcgRnJlZUhpZ2hsaWdodE91dGxpbmUob3V0bGluZSwgcG9pbnRzLCB0aGlzLiNib3gsIHRoaXMuI3NjYWxlRmFjdG9yLCB0aGlzLiNpbm5lck1hcmdpbiwgdGhpcy4jaXNMVFIpO1xuICB9XG59XG5jbGFzcyBGcmVlSGlnaGxpZ2h0T3V0bGluZSBleHRlbmRzIE91dGxpbmUge1xuICAjYm94O1xuICAjYmJveCA9IG51bGw7XG4gICNpbm5lck1hcmdpbjtcbiAgI2lzTFRSO1xuICAjcG9pbnRzO1xuICAjc2NhbGVGYWN0b3I7XG4gICNvdXRsaW5lO1xuICBjb25zdHJ1Y3RvcihvdXRsaW5lLCBwb2ludHMsIGJveCwgc2NhbGVGYWN0b3IsIGlubmVyTWFyZ2luLCBpc0xUUikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jb3V0bGluZSA9IG91dGxpbmU7XG4gICAgdGhpcy4jcG9pbnRzID0gcG9pbnRzO1xuICAgIHRoaXMuI2JveCA9IGJveDtcbiAgICB0aGlzLiNzY2FsZUZhY3RvciA9IHNjYWxlRmFjdG9yO1xuICAgIHRoaXMuI2lubmVyTWFyZ2luID0gaW5uZXJNYXJnaW47XG4gICAgdGhpcy4jaXNMVFIgPSBpc0xUUjtcbiAgICB0aGlzLiNjb21wdXRlTWluTWF4KGlzTFRSKTtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IHRoaXMuI2Jib3g7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gb3V0bGluZS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBvdXRsaW5lW2ldID0gKG91dGxpbmVbaV0gLSB4KSAvIHdpZHRoO1xuICAgICAgb3V0bGluZVtpICsgMV0gPSAob3V0bGluZVtpICsgMV0gLSB5KSAvIGhlaWdodDtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIHBvaW50c1tpXSA9IChwb2ludHNbaV0gLSB4KSAvIHdpZHRoO1xuICAgICAgcG9pbnRzW2kgKyAxXSA9IChwb2ludHNbaSArIDFdIC0geSkgLyBoZWlnaHQ7XG4gICAgfVxuICB9XG4gIHRvU1ZHUGF0aCgpIHtcbiAgICBjb25zdCBidWZmZXIgPSBbYE0ke3RoaXMuI291dGxpbmVbNF19ICR7dGhpcy4jb3V0bGluZVs1XX1gXTtcbiAgICBmb3IgKGxldCBpID0gNiwgaWkgPSB0aGlzLiNvdXRsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHtcbiAgICAgIGlmIChpc05hTih0aGlzLiNvdXRsaW5lW2ldKSkge1xuICAgICAgICBidWZmZXIucHVzaChgTCR7dGhpcy4jb3V0bGluZVtpICsgNF19ICR7dGhpcy4jb3V0bGluZVtpICsgNV19YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnVmZmVyLnB1c2goYEMke3RoaXMuI291dGxpbmVbaV19ICR7dGhpcy4jb3V0bGluZVtpICsgMV19ICR7dGhpcy4jb3V0bGluZVtpICsgMl19ICR7dGhpcy4jb3V0bGluZVtpICsgM119ICR7dGhpcy4jb3V0bGluZVtpICsgNF19ICR7dGhpcy4jb3V0bGluZVtpICsgNV19YCk7XG4gICAgfVxuICAgIGJ1ZmZlci5wdXNoKFwiWlwiKTtcbiAgICByZXR1cm4gYnVmZmVyLmpvaW4oXCIgXCIpO1xuICB9XG4gIHNlcmlhbGl6ZShbYmxYLCBibFksIHRyWCwgdHJZXSwgcm90YXRpb24pIHtcbiAgICBjb25zdCB3aWR0aCA9IHRyWCAtIGJsWDtcbiAgICBjb25zdCBoZWlnaHQgPSB0clkgLSBibFk7XG4gICAgbGV0IG91dGxpbmU7XG4gICAgbGV0IHBvaW50cztcbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIG91dGxpbmUgPSB0aGlzLiNyZXNjYWxlKHRoaXMuI291dGxpbmUsIGJsWCwgdHJZLCB3aWR0aCwgLWhlaWdodCk7XG4gICAgICAgIHBvaW50cyA9IHRoaXMuI3Jlc2NhbGUodGhpcy4jcG9pbnRzLCBibFgsIHRyWSwgd2lkdGgsIC1oZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIG91dGxpbmUgPSB0aGlzLiNyZXNjYWxlQW5kU3dhcCh0aGlzLiNvdXRsaW5lLCBibFgsIGJsWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHBvaW50cyA9IHRoaXMuI3Jlc2NhbGVBbmRTd2FwKHRoaXMuI3BvaW50cywgYmxYLCBibFksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICBvdXRsaW5lID0gdGhpcy4jcmVzY2FsZSh0aGlzLiNvdXRsaW5lLCB0clgsIGJsWSwgLXdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBwb2ludHMgPSB0aGlzLiNyZXNjYWxlKHRoaXMuI3BvaW50cywgdHJYLCBibFksIC13aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgb3V0bGluZSA9IHRoaXMuI3Jlc2NhbGVBbmRTd2FwKHRoaXMuI291dGxpbmUsIHRyWCwgdHJZLCAtd2lkdGgsIC1oZWlnaHQpO1xuICAgICAgICBwb2ludHMgPSB0aGlzLiNyZXNjYWxlQW5kU3dhcCh0aGlzLiNwb2ludHMsIHRyWCwgdHJZLCAtd2lkdGgsIC1oZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG91dGxpbmU6IEFycmF5LmZyb20ob3V0bGluZSksXG4gICAgICBwb2ludHM6IFtBcnJheS5mcm9tKHBvaW50cyldXG4gICAgfTtcbiAgfVxuICAjcmVzY2FsZShzcmMsIHR4LCB0eSwgc3gsIHN5KSB7XG4gICAgY29uc3QgZGVzdCA9IG5ldyBGbG9hdDY0QXJyYXkoc3JjLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIGRlc3RbaV0gPSB0eCArIHNyY1tpXSAqIHN4O1xuICAgICAgZGVzdFtpICsgMV0gPSB0eSArIHNyY1tpICsgMV0gKiBzeTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG4gIH1cbiAgI3Jlc2NhbGVBbmRTd2FwKHNyYywgdHgsIHR5LCBzeCwgc3kpIHtcbiAgICBjb25zdCBkZXN0ID0gbmV3IEZsb2F0NjRBcnJheShzcmMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgZGVzdFtpXSA9IHR4ICsgc3JjW2kgKyAxXSAqIHN4O1xuICAgICAgZGVzdFtpICsgMV0gPSB0eSArIHNyY1tpXSAqIHN5O1xuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbiAgfVxuICAjY29tcHV0ZU1pbk1heChpc0xUUikge1xuICAgIGNvbnN0IG91dGxpbmUgPSB0aGlzLiNvdXRsaW5lO1xuICAgIGxldCBsYXN0WCA9IG91dGxpbmVbNF07XG4gICAgbGV0IGxhc3RZID0gb3V0bGluZVs1XTtcbiAgICBsZXQgbWluWCA9IGxhc3RYO1xuICAgIGxldCBtaW5ZID0gbGFzdFk7XG4gICAgbGV0IG1heFggPSBsYXN0WDtcbiAgICBsZXQgbWF4WSA9IGxhc3RZO1xuICAgIGxldCBsYXN0UG9pbnRYID0gbGFzdFg7XG4gICAgbGV0IGxhc3RQb2ludFkgPSBsYXN0WTtcbiAgICBjb25zdCBsdHJDYWxsYmFjayA9IGlzTFRSID8gTWF0aC5tYXggOiBNYXRoLm1pbjtcbiAgICBmb3IgKGxldCBpID0gNiwgaWkgPSBvdXRsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHtcbiAgICAgIGlmIChpc05hTihvdXRsaW5lW2ldKSkge1xuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgb3V0bGluZVtpICsgNF0pO1xuICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgb3V0bGluZVtpICsgNV0pO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgb3V0bGluZVtpICsgNF0pO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgb3V0bGluZVtpICsgNV0pO1xuICAgICAgICBpZiAobGFzdFBvaW50WSA8IG91dGxpbmVbaSArIDVdKSB7XG4gICAgICAgICAgbGFzdFBvaW50WCA9IG91dGxpbmVbaSArIDRdO1xuICAgICAgICAgIGxhc3RQb2ludFkgPSBvdXRsaW5lW2kgKyA1XTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0UG9pbnRZID09PSBvdXRsaW5lW2kgKyA1XSkge1xuICAgICAgICAgIGxhc3RQb2ludFggPSBsdHJDYWxsYmFjayhsYXN0UG9pbnRYLCBvdXRsaW5lW2kgKyA0XSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGJib3ggPSBVdGlsLmJlemllckJvdW5kaW5nQm94KGxhc3RYLCBsYXN0WSwgLi4ub3V0bGluZS5zbGljZShpLCBpICsgNikpO1xuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgYmJveFswXSk7XG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBiYm94WzFdKTtcbiAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGJib3hbMl0pO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgYmJveFszXSk7XG4gICAgICAgIGlmIChsYXN0UG9pbnRZIDwgYmJveFszXSkge1xuICAgICAgICAgIGxhc3RQb2ludFggPSBiYm94WzJdO1xuICAgICAgICAgIGxhc3RQb2ludFkgPSBiYm94WzNdO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3RQb2ludFkgPT09IGJib3hbM10pIHtcbiAgICAgICAgICBsYXN0UG9pbnRYID0gbHRyQ2FsbGJhY2sobGFzdFBvaW50WCwgYmJveFsyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxhc3RYID0gb3V0bGluZVtpICsgNF07XG4gICAgICBsYXN0WSA9IG91dGxpbmVbaSArIDVdO1xuICAgIH1cbiAgICBjb25zdCB4ID0gbWluWCAtIHRoaXMuI2lubmVyTWFyZ2luLFxuICAgICAgeSA9IG1pblkgLSB0aGlzLiNpbm5lck1hcmdpbixcbiAgICAgIHdpZHRoID0gbWF4WCAtIG1pblggKyAyICogdGhpcy4jaW5uZXJNYXJnaW4sXG4gICAgICBoZWlnaHQgPSBtYXhZIC0gbWluWSArIDIgKiB0aGlzLiNpbm5lck1hcmdpbjtcbiAgICB0aGlzLiNiYm94ID0ge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGxhc3RQb2ludDogW2xhc3RQb2ludFgsIGxhc3RQb2ludFldXG4gICAgfTtcbiAgfVxuICBnZXQgYm94KCkge1xuICAgIHJldHVybiB0aGlzLiNiYm94O1xuICB9XG4gIGdldE5ld091dGxpbmUodGhpY2tuZXNzLCBpbm5lck1hcmdpbikge1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gdGhpcy4jYmJveDtcbiAgICBjb25zdCBbbGF5ZXJYLCBsYXllclksIGxheWVyV2lkdGgsIGxheWVySGVpZ2h0XSA9IHRoaXMuI2JveDtcbiAgICBjb25zdCBzeCA9IHdpZHRoICogbGF5ZXJXaWR0aDtcbiAgICBjb25zdCBzeSA9IGhlaWdodCAqIGxheWVySGVpZ2h0O1xuICAgIGNvbnN0IHR4ID0geCAqIGxheWVyV2lkdGggKyBsYXllclg7XG4gICAgY29uc3QgdHkgPSB5ICogbGF5ZXJIZWlnaHQgKyBsYXllclk7XG4gICAgY29uc3Qgb3V0bGluZXIgPSBuZXcgRnJlZU91dGxpbmVyKHtcbiAgICAgIHg6IHRoaXMuI3BvaW50c1swXSAqIHN4ICsgdHgsXG4gICAgICB5OiB0aGlzLiNwb2ludHNbMV0gKiBzeSArIHR5XG4gICAgfSwgdGhpcy4jYm94LCB0aGlzLiNzY2FsZUZhY3RvciwgdGhpY2tuZXNzLCB0aGlzLiNpc0xUUiwgaW5uZXJNYXJnaW4gPz8gdGhpcy4jaW5uZXJNYXJnaW4pO1xuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgdGhpcy4jcG9pbnRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBvdXRsaW5lci5hZGQoe1xuICAgICAgICB4OiB0aGlzLiNwb2ludHNbaV0gKiBzeCArIHR4LFxuICAgICAgICB5OiB0aGlzLiNwb2ludHNbaSArIDFdICogc3kgKyB0eVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRsaW5lci5nZXRPdXRsaW5lcygpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9jb2xvcl9waWNrZXIuanNcblxuXG5cbmNsYXNzIENvbG9yUGlja2VyIHtcbiAgI2JvdW5kS2V5RG93biA9IHRoaXMuI2tleURvd24uYmluZCh0aGlzKTtcbiAgI2JvdW5kUG9pbnRlckRvd24gPSB0aGlzLiNwb2ludGVyRG93bi5iaW5kKHRoaXMpO1xuICAjYnV0dG9uID0gbnVsbDtcbiAgI2J1dHRvblN3YXRjaCA9IG51bGw7XG4gICNkZWZhdWx0Q29sb3I7XG4gICNkcm9wZG93biA9IG51bGw7XG4gICNkcm9wZG93bldhc0Zyb21LZXlib2FyZCA9IGZhbHNlO1xuICAjaXNNYWluQ29sb3JQaWNrZXIgPSBmYWxzZTtcbiAgI2VkaXRvciA9IG51bGw7XG4gICNldmVudEJ1cztcbiAgI3VpTWFuYWdlciA9IG51bGw7XG4gICN0eXBlO1xuICBzdGF0aWMgZ2V0IF9rZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9rZXlib2FyZE1hbmFnZXJcIiwgbmV3IEtleWJvYXJkTWFuYWdlcihbW1tcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIENvbG9yUGlja2VyLnByb3RvdHlwZS5faGlkZURyb3Bkb3duRnJvbUtleWJvYXJkXSwgW1tcIiBcIiwgXCJtYWMrIFwiXSwgQ29sb3JQaWNrZXIucHJvdG90eXBlLl9jb2xvclNlbGVjdEZyb21LZXlib2FyZF0sIFtbXCJBcnJvd0Rvd25cIiwgXCJBcnJvd1JpZ2h0XCIsIFwibWFjK0Fycm93RG93blwiLCBcIm1hYytBcnJvd1JpZ2h0XCJdLCBDb2xvclBpY2tlci5wcm90b3R5cGUuX21vdmVUb05leHRdLCBbW1wiQXJyb3dVcFwiLCBcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd1VwXCIsIFwibWFjK0Fycm93TGVmdFwiXSwgQ29sb3JQaWNrZXIucHJvdG90eXBlLl9tb3ZlVG9QcmV2aW91c10sIFtbXCJIb21lXCIsIFwibWFjK0hvbWVcIl0sIENvbG9yUGlja2VyLnByb3RvdHlwZS5fbW92ZVRvQmVnaW5uaW5nXSwgW1tcIkVuZFwiLCBcIm1hYytFbmRcIl0sIENvbG9yUGlja2VyLnByb3RvdHlwZS5fbW92ZVRvRW5kXV0pKTtcbiAgfVxuICBjb25zdHJ1Y3Rvcih7XG4gICAgZWRpdG9yID0gbnVsbCxcbiAgICB1aU1hbmFnZXIgPSBudWxsXG4gIH0pIHtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICB0aGlzLiNpc01haW5Db2xvclBpY2tlciA9IGZhbHNlO1xuICAgICAgdGhpcy4jdHlwZSA9IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9DT0xPUjtcbiAgICAgIHRoaXMuI2VkaXRvciA9IGVkaXRvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jaXNNYWluQ29sb3JQaWNrZXIgPSB0cnVlO1xuICAgICAgdGhpcy4jdHlwZSA9IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9ERUZBVUxUX0NPTE9SO1xuICAgIH1cbiAgICB0aGlzLiN1aU1hbmFnZXIgPSBlZGl0b3I/Ll91aU1hbmFnZXIgfHwgdWlNYW5hZ2VyO1xuICAgIHRoaXMuI2V2ZW50QnVzID0gdGhpcy4jdWlNYW5hZ2VyLl9ldmVudEJ1cztcbiAgICB0aGlzLiNkZWZhdWx0Q29sb3IgPSBlZGl0b3I/LmNvbG9yIHx8IHRoaXMuI3VpTWFuYWdlcj8uaGlnaGxpZ2h0Q29sb3JzLnZhbHVlcygpLm5leHQoKS52YWx1ZSB8fCBcIiNGRkZGOThcIjtcbiAgfVxuICByZW5kZXJCdXR0b24oKSB7XG4gICAgY29uc3QgYnV0dG9uID0gdGhpcy4jYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICBidXR0b24uY2xhc3NOYW1lID0gXCJjb2xvclBpY2tlclwiO1xuICAgIGJ1dHRvbi50YWJJbmRleCA9IFwiMFwiO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1lZGl0b3ItY29sb3JwaWNrZXItYnV0dG9uXCIpO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIsIHRydWUpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy4jb3BlbkRyb3Bkb3duLmJpbmQodGhpcyksIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleURvd24sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGNvbnN0IHN3YXRjaCA9IHRoaXMuI2J1dHRvblN3YXRjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIHN3YXRjaC5jbGFzc05hbWUgPSBcInN3YXRjaFwiO1xuICAgIHN3YXRjaC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCB0cnVlKTtcbiAgICBzd2F0Y2guc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy4jZGVmYXVsdENvbG9yO1xuICAgIGJ1dHRvbi5hcHBlbmQoc3dhdGNoKTtcbiAgICByZXR1cm4gYnV0dG9uO1xuICB9XG4gIHJlbmRlck1haW5Ecm9wZG93bigpIHtcbiAgICBjb25zdCBkcm9wZG93biA9IHRoaXMuI2Ryb3Bkb3duID0gdGhpcy4jZ2V0RHJvcGRvd25Sb290KCk7XG4gICAgZHJvcGRvd24uc2V0QXR0cmlidXRlKFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImhvcml6b250YWxcIik7XG4gICAgZHJvcGRvd24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiaGlnaGxpZ2h0Q29sb3JQaWNrZXJMYWJlbFwiKTtcbiAgICByZXR1cm4gZHJvcGRvd247XG4gIH1cbiAgI2dldERyb3Bkb3duUm9vdCgpIHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgZGl2LmNsYXNzTmFtZSA9IFwiZHJvcGRvd25cIjtcbiAgICBkaXYucm9sZSA9IFwibGlzdGJveFwiO1xuICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBmYWxzZSk7XG4gICAgZGl2LnNldEF0dHJpYnV0ZShcImFyaWEtb3JpZW50YXRpb25cIiwgXCJ2ZXJ0aWNhbFwiKTtcbiAgICBkaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtZWRpdG9yLWNvbG9ycGlja2VyLWRyb3Bkb3duXCIpO1xuICAgIGZvciAoY29uc3QgW25hbWUsIGNvbG9yXSBvZiB0aGlzLiN1aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JzKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgYnV0dG9uLnRhYkluZGV4ID0gXCIwXCI7XG4gICAgICBidXR0b24ucm9sZSA9IFwib3B0aW9uXCI7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiZGF0YS1jb2xvclwiLCBjb2xvcik7XG4gICAgICBidXR0b24udGl0bGUgPSBuYW1lO1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBgcGRmanMtZWRpdG9yLWNvbG9ycGlja2VyLSR7bmFtZX1gKTtcbiAgICAgIGNvbnN0IHN3YXRjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgYnV0dG9uLmFwcGVuZChzd2F0Y2gpO1xuICAgICAgc3dhdGNoLmNsYXNzTmFtZSA9IFwic3dhdGNoXCI7XG4gICAgICBzd2F0Y2guc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiLCBjb2xvciA9PT0gdGhpcy4jZGVmYXVsdENvbG9yKTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy4jY29sb3JTZWxlY3QuYmluZCh0aGlzLCBjb2xvciksIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIGRpdi5hcHBlbmQoYnV0dG9uKTtcbiAgICB9XG4gICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5RG93biwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuICAjY29sb3JTZWxlY3QoY29sb3IsIGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy4jZXZlbnRCdXMuZGlzcGF0Y2goXCJzd2l0Y2hhbm5vdGF0aW9uZWRpdG9ycGFyYW1zXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIHR5cGU6IHRoaXMuI3R5cGUsXG4gICAgICB2YWx1ZTogY29sb3JcbiAgICB9KTtcbiAgfVxuICBfY29sb3JTZWxlY3RGcm9tS2V5Ym9hcmQoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLiNidXR0b24pIHtcbiAgICAgIHRoaXMuI29wZW5Ecm9wZG93bihldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbG9yID0gZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtY29sb3JcIik7XG4gICAgaWYgKCFjb2xvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNjb2xvclNlbGVjdChjb2xvciwgZXZlbnQpO1xuICB9XG4gIF9tb3ZlVG9OZXh0KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgdGhpcy4jb3BlbkRyb3Bkb3duKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy4jYnV0dG9uKSB7XG4gICAgICB0aGlzLiNkcm9wZG93bi5maXJzdENoaWxkPy5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC50YXJnZXQubmV4dFNpYmxpbmc/LmZvY3VzKCk7XG4gIH1cbiAgX21vdmVUb1ByZXZpb3VzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy4jZHJvcGRvd24/LmZpcnN0Q2hpbGQgfHwgZXZlbnQudGFyZ2V0ID09PSB0aGlzLiNidXR0b24pIHtcbiAgICAgIGlmICh0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgICB0aGlzLl9oaWRlRHJvcGRvd25Gcm9tS2V5Ym9hcmQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgdGhpcy4jb3BlbkRyb3Bkb3duKGV2ZW50KTtcbiAgICB9XG4gICAgZXZlbnQudGFyZ2V0LnByZXZpb3VzU2libGluZz8uZm9jdXMoKTtcbiAgfVxuICBfbW92ZVRvQmVnaW5uaW5nKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgdGhpcy4jb3BlbkRyb3Bkb3duKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jZHJvcGRvd24uZmlyc3RDaGlsZD8uZm9jdXMoKTtcbiAgfVxuICBfbW92ZVRvRW5kKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgdGhpcy4jb3BlbkRyb3Bkb3duKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jZHJvcGRvd24ubGFzdENoaWxkPy5mb2N1cygpO1xuICB9XG4gICNrZXlEb3duKGV2ZW50KSB7XG4gICAgQ29sb3JQaWNrZXIuX2tleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIGV2ZW50KTtcbiAgfVxuICAjb3BlbkRyb3Bkb3duKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuI2lzRHJvcGRvd25WaXNpYmxlKSB7XG4gICAgICB0aGlzLmhpZGVEcm9wZG93bigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNkcm9wZG93bldhc0Zyb21LZXlib2FyZCA9IGV2ZW50LmRldGFpbCA9PT0gMDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kUG9pbnRlckRvd24sIHtcbiAgICAgIHNpZ25hbDogdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWxcbiAgICB9KTtcbiAgICBpZiAodGhpcy4jZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuI2Ryb3Bkb3duLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLiNkcm9wZG93biA9IHRoaXMuI2dldERyb3Bkb3duUm9vdCgpO1xuICAgIHRoaXMuI2J1dHRvbi5hcHBlbmQocm9vdCk7XG4gIH1cbiAgI3BvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuI2Ryb3Bkb3duPy5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XG4gIH1cbiAgaGlkZURyb3Bkb3duKCkge1xuICAgIHRoaXMuI2Ryb3Bkb3duPy5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRQb2ludGVyRG93bik7XG4gIH1cbiAgZ2V0ICNpc0Ryb3Bkb3duVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZHJvcGRvd24gJiYgIXRoaXMuI2Ryb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhcImhpZGRlblwiKTtcbiAgfVxuICBfaGlkZURyb3Bkb3duRnJvbUtleWJvYXJkKCkge1xuICAgIGlmICh0aGlzLiNpc01haW5Db2xvclBpY2tlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2lzRHJvcGRvd25WaXNpYmxlKSB7XG4gICAgICB0aGlzLiNlZGl0b3I/LnVuc2VsZWN0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XG4gICAgdGhpcy4jYnV0dG9uLmZvY3VzKHtcbiAgICAgIHByZXZlbnRTY3JvbGw6IHRydWUsXG4gICAgICBmb2N1c1Zpc2libGU6IHRoaXMuI2Ryb3Bkb3duV2FzRnJvbUtleWJvYXJkXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlQ29sb3IoY29sb3IpIHtcbiAgICBpZiAodGhpcy4jYnV0dG9uU3dhdGNoKSB7XG4gICAgICB0aGlzLiNidXR0b25Td2F0Y2guc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgfVxuICAgIGlmICghdGhpcy4jZHJvcGRvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaSA9IHRoaXMuI3VpTWFuYWdlci5oaWdobGlnaHRDb2xvcnMudmFsdWVzKCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLiNkcm9wZG93bi5jaGlsZHJlbikge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiLCBpLm5leHQoKS52YWx1ZSA9PT0gY29sb3IpO1xuICAgIH1cbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuI2J1dHRvbj8ucmVtb3ZlKCk7XG4gICAgdGhpcy4jYnV0dG9uID0gbnVsbDtcbiAgICB0aGlzLiNidXR0b25Td2F0Y2ggPSBudWxsO1xuICAgIHRoaXMuI2Ryb3Bkb3duPy5yZW1vdmUoKTtcbiAgICB0aGlzLiNkcm9wZG93biA9IG51bGw7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2hpZ2hsaWdodC5qc1xuXG5cblxuXG5cblxuY2xhc3MgSGlnaGxpZ2h0RWRpdG9yIGV4dGVuZHMgQW5ub3RhdGlvbkVkaXRvciB7XG4gICNhbmNob3JOb2RlID0gbnVsbDtcbiAgI2FuY2hvck9mZnNldCA9IDA7XG4gICNib3hlcztcbiAgI2NsaXBQYXRoSWQgPSBudWxsO1xuICAjY29sb3JQaWNrZXIgPSBudWxsO1xuICAjZm9jdXNPdXRsaW5lcyA9IG51bGw7XG4gICNmb2N1c05vZGUgPSBudWxsO1xuICAjZm9jdXNPZmZzZXQgPSAwO1xuICAjaGlnaGxpZ2h0RGl2ID0gbnVsbDtcbiAgI2hpZ2hsaWdodE91dGxpbmVzID0gbnVsbDtcbiAgI2lkID0gbnVsbDtcbiAgI2lzRnJlZUhpZ2hsaWdodCA9IGZhbHNlO1xuICAjYm91bmRLZXlkb3duID0gdGhpcy4ja2V5ZG93bi5iaW5kKHRoaXMpO1xuICAjbGFzdFBvaW50ID0gbnVsbDtcbiAgI29wYWNpdHk7XG4gICNvdXRsaW5lSWQgPSBudWxsO1xuICAjdGV4dCA9IFwiXCI7XG4gICN0aGlja25lc3M7XG4gICNtZXRob2RPZkNyZWF0aW9uID0gXCJcIjtcbiAgc3RhdGljIF9kZWZhdWx0Q29sb3IgPSBudWxsO1xuICBzdGF0aWMgX2RlZmF1bHRPcGFjaXR5ID0gMTtcbiAgc3RhdGljIF9kZWZhdWx0VGhpY2tuZXNzID0gMTI7XG4gIHN0YXRpYyBfbDEwblByb21pc2U7XG4gIHN0YXRpYyBfdHlwZSA9IFwiaGlnaGxpZ2h0XCI7XG4gIHN0YXRpYyBfZWRpdG9yVHlwZSA9IEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVDtcbiAgc3RhdGljIF9mcmVlSGlnaGxpZ2h0SWQgPSAtMTtcbiAgc3RhdGljIF9mcmVlSGlnaGxpZ2h0ID0gbnVsbDtcbiAgc3RhdGljIF9mcmVlSGlnaGxpZ2h0Q2xpcElkID0gXCJcIjtcbiAgc3RhdGljIGdldCBfa2V5Ym9hcmRNYW5hZ2VyKCkge1xuICAgIGNvbnN0IHByb3RvID0gSGlnaGxpZ2h0RWRpdG9yLnByb3RvdHlwZTtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiQXJyb3dMZWZ0XCIsIFwibWFjK0Fycm93TGVmdFwiXSwgcHJvdG8uX21vdmVDYXJldCwge1xuICAgICAgYXJnczogWzBdXG4gICAgfV0sIFtbXCJBcnJvd1JpZ2h0XCIsIFwibWFjK0Fycm93UmlnaHRcIl0sIHByb3RvLl9tb3ZlQ2FyZXQsIHtcbiAgICAgIGFyZ3M6IFsxXVxuICAgIH1dLCBbW1wiQXJyb3dVcFwiLCBcIm1hYytBcnJvd1VwXCJdLCBwcm90by5fbW92ZUNhcmV0LCB7XG4gICAgICBhcmdzOiBbMl1cbiAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHByb3RvLl9tb3ZlQ2FyZXQsIHtcbiAgICAgIGFyZ3M6IFszXVxuICAgIH1dXSkpO1xuICB9XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIG5hbWU6IFwiaGlnaGxpZ2h0RWRpdG9yXCJcbiAgICB9KTtcbiAgICB0aGlzLmNvbG9yID0gcGFyYW1zLmNvbG9yIHx8IEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdENvbG9yO1xuICAgIHRoaXMuI3RoaWNrbmVzcyA9IHBhcmFtcy50aGlja25lc3MgfHwgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzO1xuICAgIHRoaXMuI29wYWNpdHkgPSBwYXJhbXMub3BhY2l0eSB8fCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRPcGFjaXR5O1xuICAgIHRoaXMuI2JveGVzID0gcGFyYW1zLmJveGVzIHx8IG51bGw7XG4gICAgdGhpcy4jbWV0aG9kT2ZDcmVhdGlvbiA9IHBhcmFtcy5tZXRob2RPZkNyZWF0aW9uIHx8IFwiXCI7XG4gICAgdGhpcy4jdGV4dCA9IHBhcmFtcy50ZXh0IHx8IFwiXCI7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICBpZiAocGFyYW1zLmhpZ2hsaWdodElkID4gLTEpIHtcbiAgICAgIHRoaXMuI2lzRnJlZUhpZ2hsaWdodCA9IHRydWU7XG4gICAgICB0aGlzLiNjcmVhdGVGcmVlT3V0bGluZXMocGFyYW1zKTtcbiAgICAgIHRoaXMuI2FkZFRvRHJhd0xheWVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2FuY2hvck5vZGUgPSBwYXJhbXMuYW5jaG9yTm9kZTtcbiAgICAgIHRoaXMuI2FuY2hvck9mZnNldCA9IHBhcmFtcy5hbmNob3JPZmZzZXQ7XG4gICAgICB0aGlzLiNmb2N1c05vZGUgPSBwYXJhbXMuZm9jdXNOb2RlO1xuICAgICAgdGhpcy4jZm9jdXNPZmZzZXQgPSBwYXJhbXMuZm9jdXNPZmZzZXQ7XG4gICAgICB0aGlzLiNjcmVhdGVPdXRsaW5lcygpO1xuICAgICAgdGhpcy4jYWRkVG9EcmF3TGF5ZXIoKTtcbiAgICAgIHRoaXMucm90YXRlKHRoaXMucm90YXRpb24pO1xuICAgIH1cbiAgfVxuICBnZXQgdGVsZW1ldHJ5SW5pdGlhbERhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJhZGRlZFwiLFxuICAgICAgdHlwZTogdGhpcy4jaXNGcmVlSGlnaGxpZ2h0ID8gXCJmcmVlX2hpZ2hsaWdodFwiIDogXCJoaWdobGlnaHRcIixcbiAgICAgIGNvbG9yOiB0aGlzLl91aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JOYW1lcy5nZXQodGhpcy5jb2xvciksXG4gICAgICB0aGlja25lc3M6IHRoaXMuI3RoaWNrbmVzcyxcbiAgICAgIG1ldGhvZE9mQ3JlYXRpb246IHRoaXMuI21ldGhvZE9mQ3JlYXRpb25cbiAgICB9O1xuICB9XG4gIGdldCB0ZWxlbWV0cnlGaW5hbERhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiaGlnaGxpZ2h0XCIsXG4gICAgICBjb2xvcjogdGhpcy5fdWlNYW5hZ2VyLmhpZ2hsaWdodENvbG9yTmFtZXMuZ2V0KHRoaXMuY29sb3IpXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29tcHV0ZVRlbGVtZXRyeUZpbmFsRGF0YShkYXRhKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG51bWJlck9mQ29sb3JzOiBkYXRhLmdldChcImNvbG9yXCIpLnNpemVcbiAgICB9O1xuICB9XG4gICNjcmVhdGVPdXRsaW5lcygpIHtcbiAgICBjb25zdCBvdXRsaW5lciA9IG5ldyBPdXRsaW5lcih0aGlzLiNib3hlcywgMC4wMDEpO1xuICAgIHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzID0gb3V0bGluZXIuZ2V0T3V0bGluZXMoKTtcbiAgICAoe1xuICAgICAgeDogdGhpcy54LFxuICAgICAgeTogdGhpcy55LFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgfSA9IHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzLmJveCk7XG4gICAgY29uc3Qgb3V0bGluZXJGb3JPdXRsaW5lID0gbmV3IE91dGxpbmVyKHRoaXMuI2JveGVzLCAwLjAwMjUsIDAuMDAxLCB0aGlzLl91aU1hbmFnZXIuZGlyZWN0aW9uID09PSBcImx0clwiKTtcbiAgICB0aGlzLiNmb2N1c091dGxpbmVzID0gb3V0bGluZXJGb3JPdXRsaW5lLmdldE91dGxpbmVzKCk7XG4gICAgY29uc3Qge1xuICAgICAgbGFzdFBvaW50XG4gICAgfSA9IHRoaXMuI2ZvY3VzT3V0bGluZXMuYm94O1xuICAgIHRoaXMuI2xhc3RQb2ludCA9IFsobGFzdFBvaW50WzBdIC0gdGhpcy54KSAvIHRoaXMud2lkdGgsIChsYXN0UG9pbnRbMV0gLSB0aGlzLnkpIC8gdGhpcy5oZWlnaHRdO1xuICB9XG4gICNjcmVhdGVGcmVlT3V0bGluZXMoe1xuICAgIGhpZ2hsaWdodE91dGxpbmVzLFxuICAgIGhpZ2hsaWdodElkLFxuICAgIGNsaXBQYXRoSWRcbiAgfSkge1xuICAgIHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzID0gaGlnaGxpZ2h0T3V0bGluZXM7XG4gICAgY29uc3QgZXh0cmFUaGlja25lc3MgPSAxLjU7XG4gICAgdGhpcy4jZm9jdXNPdXRsaW5lcyA9IGhpZ2hsaWdodE91dGxpbmVzLmdldE5ld091dGxpbmUodGhpcy4jdGhpY2tuZXNzIC8gMiArIGV4dHJhVGhpY2tuZXNzLCAwLjAwMjUpO1xuICAgIGlmIChoaWdobGlnaHRJZCA+PSAwKSB7XG4gICAgICB0aGlzLiNpZCA9IGhpZ2hsaWdodElkO1xuICAgICAgdGhpcy4jY2xpcFBhdGhJZCA9IGNsaXBQYXRoSWQ7XG4gICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuZmluYWxpemVMaW5lKGhpZ2hsaWdodElkLCBoaWdobGlnaHRPdXRsaW5lcyk7XG4gICAgICB0aGlzLiNvdXRsaW5lSWQgPSB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuaGlnaGxpZ2h0T3V0bGluZSh0aGlzLiNmb2N1c091dGxpbmVzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICBjb25zdCBhbmdsZSA9IHRoaXMucGFyZW50LnZpZXdwb3J0LnJvdGF0aW9uO1xuICAgICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnVwZGF0ZUxpbmUodGhpcy4jaWQsIGhpZ2hsaWdodE91dGxpbmVzKTtcbiAgICAgIHRoaXMucGFyZW50LmRyYXdMYXllci51cGRhdGVCb3godGhpcy4jaWQsIEhpZ2hsaWdodEVkaXRvci4jcm90YXRlQmJveCh0aGlzLiNoaWdobGlnaHRPdXRsaW5lcy5ib3gsIChhbmdsZSAtIHRoaXMucm90YXRpb24gKyAzNjApICUgMzYwKSk7XG4gICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIudXBkYXRlTGluZSh0aGlzLiNvdXRsaW5lSWQsIHRoaXMuI2ZvY3VzT3V0bGluZXMpO1xuICAgICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnVwZGF0ZUJveCh0aGlzLiNvdXRsaW5lSWQsIEhpZ2hsaWdodEVkaXRvci4jcm90YXRlQmJveCh0aGlzLiNmb2N1c091dGxpbmVzLmJveCwgYW5nbGUpKTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBoaWdobGlnaHRPdXRsaW5lcy5ib3g7XG4gICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIHRoaXMueCA9IHk7XG4gICAgICAgICAgdGhpcy55ID0gMSAtIHg7XG4gICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoICogcGFnZUhlaWdodCAvIHBhZ2VXaWR0aDtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAqIHBhZ2VXaWR0aCAvIHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICB0aGlzLnggPSAxIC0geDtcbiAgICAgICAgdGhpcy55ID0gMSAtIHk7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICB0aGlzLnggPSAxIC0geTtcbiAgICAgICAgICB0aGlzLnkgPSB4O1xuICAgICAgICAgIHRoaXMud2lkdGggPSB3aWR0aCAqIHBhZ2VIZWlnaHQgLyBwYWdlV2lkdGg7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgKiBwYWdlV2lkdGggLyBwYWdlSGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGxhc3RQb2ludFxuICAgIH0gPSB0aGlzLiNmb2N1c091dGxpbmVzLmJveDtcbiAgICB0aGlzLiNsYXN0UG9pbnQgPSBbKGxhc3RQb2ludFswXSAtIHgpIC8gd2lkdGgsIChsYXN0UG9pbnRbMV0gLSB5KSAvIGhlaWdodF07XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyKSB7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5pbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcik7XG4gICAgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0Q29sb3IgfHw9IHVpTWFuYWdlci5oaWdobGlnaHRDb2xvcnM/LnZhbHVlcygpLm5leHQoKS52YWx1ZSB8fCBcIiNmZmYwNjZcIjtcbiAgfVxuICBzdGF0aWMgdXBkYXRlRGVmYXVsdFBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfREVGQVVMVF9DT0xPUjpcbiAgICAgICAgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0Q29sb3IgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9USElDS05FU1M6XG4gICAgICAgIEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdFRoaWNrbmVzcyA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdHJhbnNsYXRlSW5QYWdlKHgsIHkpIHt9XG4gIGdldCB0b29sYmFyUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xhc3RQb2ludDtcbiAgfVxuICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0NPTE9SOlxuICAgICAgICB0aGlzLiN1cGRhdGVDb2xvcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfVEhJQ0tORVNTOlxuICAgICAgICB0aGlzLiN1cGRhdGVUaGlja25lc3ModmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgc3RhdGljIGdldCBkZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9ERUZBVUxUX0NPTE9SLCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRDb2xvcl0sIFtBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfVEhJQ0tORVNTLCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdXTtcbiAgfVxuICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9DT0xPUiwgdGhpcy5jb2xvciB8fCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRDb2xvcl0sIFtBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfVEhJQ0tORVNTLCB0aGlzLiN0aGlja25lc3MgfHwgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9GUkVFLCB0aGlzLiNpc0ZyZWVIaWdobGlnaHRdXTtcbiAgfVxuICAjdXBkYXRlQ29sb3IoY29sb3IpIHtcbiAgICBjb25zdCBzZXRDb2xvciA9IGNvbCA9PiB7XG4gICAgICB0aGlzLmNvbG9yID0gY29sO1xuICAgICAgdGhpcy5wYXJlbnQ/LmRyYXdMYXllci5jaGFuZ2VDb2xvcih0aGlzLiNpZCwgY29sKTtcbiAgICAgIHRoaXMuI2NvbG9yUGlja2VyPy51cGRhdGVDb2xvcihjb2wpO1xuICAgIH07XG4gICAgY29uc3Qgc2F2ZWRDb2xvciA9IHRoaXMuY29sb3I7XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6IHNldENvbG9yLmJpbmQodGhpcywgY29sb3IpLFxuICAgICAgdW5kbzogc2V0Q29sb3IuYmluZCh0aGlzLCBzYXZlZENvbG9yKSxcbiAgICAgIHBvc3Q6IHRoaXMuX3VpTWFuYWdlci51cGRhdGVVSS5iaW5kKHRoaXMuX3VpTWFuYWdlciwgdGhpcyksXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9DT0xPUixcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuX3JlcG9ydFRlbGVtZXRyeSh7XG4gICAgICBhY3Rpb246IFwiY29sb3JfY2hhbmdlZFwiLFxuICAgICAgY29sb3I6IHRoaXMuX3VpTWFuYWdlci5oaWdobGlnaHRDb2xvck5hbWVzLmdldChjb2xvcilcbiAgICB9LCB0cnVlKTtcbiAgfVxuICAjdXBkYXRlVGhpY2tuZXNzKHRoaWNrbmVzcykge1xuICAgIGNvbnN0IHNhdmVkVGhpY2tuZXNzID0gdGhpcy4jdGhpY2tuZXNzO1xuICAgIGNvbnN0IHNldFRoaWNrbmVzcyA9IHRoID0+IHtcbiAgICAgIHRoaXMuI3RoaWNrbmVzcyA9IHRoO1xuICAgICAgdGhpcy4jY2hhbmdlVGhpY2tuZXNzKHRoKTtcbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiBzZXRUaGlja25lc3MuYmluZCh0aGlzLCB0aGlja25lc3MpLFxuICAgICAgdW5kbzogc2V0VGhpY2tuZXNzLmJpbmQodGhpcywgc2F2ZWRUaGlja25lc3MpLFxuICAgICAgcG9zdDogdGhpcy5fdWlNYW5hZ2VyLnVwZGF0ZVVJLmJpbmQodGhpcy5fdWlNYW5hZ2VyLCB0aGlzKSxcbiAgICAgIG11c3RFeGVjOiB0cnVlLFxuICAgICAgdHlwZTogQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX1RISUNLTkVTUyxcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuX3JlcG9ydFRlbGVtZXRyeSh7XG4gICAgICBhY3Rpb246IFwidGhpY2tuZXNzX2NoYW5nZWRcIixcbiAgICAgIHRoaWNrbmVzc1xuICAgIH0sIHRydWUpO1xuICB9XG4gIGFzeW5jIGFkZEVkaXRUb29sYmFyKCkge1xuICAgIGNvbnN0IHRvb2xiYXIgPSBhd2FpdCBzdXBlci5hZGRFZGl0VG9vbGJhcigpO1xuICAgIGlmICghdG9vbGJhcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl91aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JzKSB7XG4gICAgICB0aGlzLiNjb2xvclBpY2tlciA9IG5ldyBDb2xvclBpY2tlcih7XG4gICAgICAgIGVkaXRvcjogdGhpc1xuICAgICAgfSk7XG4gICAgICB0b29sYmFyLmFkZENvbG9yUGlja2VyKHRoaXMuI2NvbG9yUGlja2VyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRvb2xiYXI7XG4gIH1cbiAgZGlzYWJsZUVkaXRpbmcoKSB7XG4gICAgc3VwZXIuZGlzYWJsZUVkaXRpbmcoKTtcbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG4gIH1cbiAgZW5hYmxlRWRpdGluZygpIHtcbiAgICBzdXBlci5lbmFibGVFZGl0aW5nKCk7XG4gICAgdGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImRpc2FibGVkXCIsIGZhbHNlKTtcbiAgfVxuICBmaXhBbmRTZXRQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gc3VwZXIuZml4QW5kU2V0UG9zaXRpb24odGhpcy4jZ2V0Um90YXRpb24oKSk7XG4gIH1cbiAgZ2V0QmFzZVRyYW5zbGF0aW9uKCkge1xuICAgIHJldHVybiBbMCwgMF07XG4gIH1cbiAgZ2V0UmVjdCh0eCwgdHkpIHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0UmVjdCh0eCwgdHksIHRoaXMuI2dldFJvdGF0aW9uKCkpO1xuICB9XG4gIG9uY2VBZGRlZCgpIHtcbiAgICB0aGlzLnBhcmVudC5hZGRVbmRvYWJsZUVkaXRvcih0aGlzKTtcbiAgICB0aGlzLmRpdi5mb2N1cygpO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLiNjbGVhbkRyYXdMYXllcigpO1xuICAgIHRoaXMuX3JlcG9ydFRlbGVtZXRyeSh7XG4gICAgICBhY3Rpb246IFwiZGVsZXRlZFwiXG4gICAgfSk7XG4gICAgc3VwZXIucmVtb3ZlKCk7XG4gIH1cbiAgcmVidWlsZCgpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLnJlYnVpbGQoKTtcbiAgICBpZiAodGhpcy5kaXYgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYWRkVG9EcmF3TGF5ZXIoKTtcbiAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG4gICAgfVxuICB9XG4gIHNldFBhcmVudChwYXJlbnQpIHtcbiAgICBsZXQgbXVzdEJlU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5wYXJlbnQgJiYgIXBhcmVudCkge1xuICAgICAgdGhpcy4jY2xlYW5EcmF3TGF5ZXIoKTtcbiAgICB9IGVsc2UgaWYgKHBhcmVudCkge1xuICAgICAgdGhpcy4jYWRkVG9EcmF3TGF5ZXIocGFyZW50KTtcbiAgICAgIG11c3RCZVNlbGVjdGVkID0gIXRoaXMucGFyZW50ICYmIHRoaXMuZGl2Py5jbGFzc0xpc3QuY29udGFpbnMoXCJzZWxlY3RlZEVkaXRvclwiKTtcbiAgICB9XG4gICAgc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7XG4gICAgdGhpcy5zaG93KHRoaXMuX2lzVmlzaWJsZSk7XG4gICAgaWYgKG11c3RCZVNlbGVjdGVkKSB7XG4gICAgICB0aGlzLnNlbGVjdCgpO1xuICAgIH1cbiAgfVxuICAjY2hhbmdlVGhpY2tuZXNzKHRoaWNrbmVzcykge1xuICAgIGlmICghdGhpcy4jaXNGcmVlSGlnaGxpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2NyZWF0ZUZyZWVPdXRsaW5lcyh7XG4gICAgICBoaWdobGlnaHRPdXRsaW5lczogdGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMuZ2V0TmV3T3V0bGluZSh0aGlja25lc3MgLyAyKVxuICAgIH0pO1xuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy5zZXREaW1zKHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICB9XG4gICNjbGVhbkRyYXdMYXllcigpIHtcbiAgICBpZiAodGhpcy4jaWQgPT09IG51bGwgfHwgIXRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50LmRyYXdMYXllci5yZW1vdmUodGhpcy4jaWQpO1xuICAgIHRoaXMuI2lkID0gbnVsbDtcbiAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIucmVtb3ZlKHRoaXMuI291dGxpbmVJZCk7XG4gICAgdGhpcy4jb3V0bGluZUlkID0gbnVsbDtcbiAgfVxuICAjYWRkVG9EcmF3TGF5ZXIocGFyZW50ID0gdGhpcy5wYXJlbnQpIHtcbiAgICBpZiAodGhpcy4jaWQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKHtcbiAgICAgIGlkOiB0aGlzLiNpZCxcbiAgICAgIGNsaXBQYXRoSWQ6IHRoaXMuI2NsaXBQYXRoSWRcbiAgICB9ID0gcGFyZW50LmRyYXdMYXllci5oaWdobGlnaHQodGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMsIHRoaXMuY29sb3IsIHRoaXMuI29wYWNpdHkpKTtcbiAgICB0aGlzLiNvdXRsaW5lSWQgPSBwYXJlbnQuZHJhd0xheWVyLmhpZ2hsaWdodE91dGxpbmUodGhpcy4jZm9jdXNPdXRsaW5lcyk7XG4gICAgaWYgKHRoaXMuI2hpZ2hsaWdodERpdikge1xuICAgICAgdGhpcy4jaGlnaGxpZ2h0RGl2LnN0eWxlLmNsaXBQYXRoID0gdGhpcy4jY2xpcFBhdGhJZDtcbiAgICB9XG4gIH1cbiAgc3RhdGljICNyb3RhdGVCYm94KHtcbiAgICB4LFxuICAgIHksXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0sIGFuZ2xlKSB7XG4gICAgc3dpdGNoIChhbmdsZSkge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiAxIC0geSAtIGhlaWdodCxcbiAgICAgICAgICB5OiB4LFxuICAgICAgICAgIHdpZHRoOiBoZWlnaHQsXG4gICAgICAgICAgaGVpZ2h0OiB3aWR0aFxuICAgICAgICB9O1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogMSAtIHggLSB3aWR0aCxcbiAgICAgICAgICB5OiAxIC0geSAtIGhlaWdodCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHksXG4gICAgICAgICAgeTogMSAtIHggLSB3aWR0aCxcbiAgICAgICAgICB3aWR0aDogaGVpZ2h0LFxuICAgICAgICAgIGhlaWdodDogd2lkdGhcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9O1xuICB9XG4gIHJvdGF0ZShhbmdsZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRyYXdMYXllclxuICAgIH0gPSB0aGlzLnBhcmVudDtcbiAgICBsZXQgYm94O1xuICAgIGlmICh0aGlzLiNpc0ZyZWVIaWdobGlnaHQpIHtcbiAgICAgIGFuZ2xlID0gKGFuZ2xlIC0gdGhpcy5yb3RhdGlvbiArIDM2MCkgJSAzNjA7XG4gICAgICBib3ggPSBIaWdobGlnaHRFZGl0b3IuI3JvdGF0ZUJib3godGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMuYm94LCBhbmdsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJveCA9IEhpZ2hsaWdodEVkaXRvci4jcm90YXRlQmJveCh0aGlzLCBhbmdsZSk7XG4gICAgfVxuICAgIGRyYXdMYXllci5yb3RhdGUodGhpcy4jaWQsIGFuZ2xlKTtcbiAgICBkcmF3TGF5ZXIucm90YXRlKHRoaXMuI291dGxpbmVJZCwgYW5nbGUpO1xuICAgIGRyYXdMYXllci51cGRhdGVCb3godGhpcy4jaWQsIGJveCk7XG4gICAgZHJhd0xheWVyLnVwZGF0ZUJveCh0aGlzLiNvdXRsaW5lSWQsIEhpZ2hsaWdodEVkaXRvci4jcm90YXRlQmJveCh0aGlzLiNmb2N1c091dGxpbmVzLmJveCwgYW5nbGUpKTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuZGl2KSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXY7XG4gICAgfVxuICAgIGNvbnN0IGRpdiA9IHN1cGVyLnJlbmRlcigpO1xuICAgIGlmICh0aGlzLiN0ZXh0KSB7XG4gICAgICBkaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0aGlzLiN0ZXh0KTtcbiAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwibWFya1wiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2lzRnJlZUhpZ2hsaWdodCkge1xuICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoXCJmcmVlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleWRvd24sIHtcbiAgICAgICAgc2lnbmFsOiB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGhpZ2hsaWdodERpdiA9IHRoaXMuI2hpZ2hsaWdodERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LmFwcGVuZChoaWdobGlnaHREaXYpO1xuICAgIGhpZ2hsaWdodERpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgaGlnaGxpZ2h0RGl2LmNsYXNzTmFtZSA9IFwiaW50ZXJuYWxcIjtcbiAgICBoaWdobGlnaHREaXYuc3R5bGUuY2xpcFBhdGggPSB0aGlzLiNjbGlwUGF0aElkO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLnNldERpbXModGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgYmluZEV2ZW50cyh0aGlzLCB0aGlzLiNoaWdobGlnaHREaXYsIFtcInBvaW50ZXJvdmVyXCIsIFwicG9pbnRlcmxlYXZlXCJdKTtcbiAgICB0aGlzLmVuYWJsZUVkaXRpbmcoKTtcbiAgICByZXR1cm4gZGl2O1xuICB9XG4gIHBvaW50ZXJvdmVyKCkge1xuICAgIHRoaXMucGFyZW50LmRyYXdMYXllci5hZGRDbGFzcyh0aGlzLiNvdXRsaW5lSWQsIFwiaG92ZXJlZFwiKTtcbiAgfVxuICBwb2ludGVybGVhdmUoKSB7XG4gICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnJlbW92ZUNsYXNzKHRoaXMuI291dGxpbmVJZCwgXCJob3ZlcmVkXCIpO1xuICB9XG4gICNrZXlkb3duKGV2ZW50KSB7XG4gICAgSGlnaGxpZ2h0RWRpdG9yLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCBldmVudCk7XG4gIH1cbiAgX21vdmVDYXJldChkaXJlY3Rpb24pIHtcbiAgICB0aGlzLnBhcmVudC51bnNlbGVjdCh0aGlzKTtcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAyOlxuICAgICAgICB0aGlzLiNzZXRDYXJldCh0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRoaXMuI3NldENhcmV0KGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gICNzZXRDYXJldChzdGFydCkge1xuICAgIGlmICghdGhpcy4jYW5jaG9yTm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBzZWxlY3Rpb24uc2V0UG9zaXRpb24odGhpcy4jYW5jaG9yTm9kZSwgdGhpcy4jYW5jaG9yT2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0aW9uLnNldFBvc2l0aW9uKHRoaXMuI2ZvY3VzTm9kZSwgdGhpcy4jZm9jdXNPZmZzZXQpO1xuICAgIH1cbiAgfVxuICBzZWxlY3QoKSB7XG4gICAgc3VwZXIuc2VsZWN0KCk7XG4gICAgaWYgKCF0aGlzLiNvdXRsaW5lSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQ/LmRyYXdMYXllci5yZW1vdmVDbGFzcyh0aGlzLiNvdXRsaW5lSWQsIFwiaG92ZXJlZFwiKTtcbiAgICB0aGlzLnBhcmVudD8uZHJhd0xheWVyLmFkZENsYXNzKHRoaXMuI291dGxpbmVJZCwgXCJzZWxlY3RlZFwiKTtcbiAgfVxuICB1bnNlbGVjdCgpIHtcbiAgICBzdXBlci51bnNlbGVjdCgpO1xuICAgIGlmICghdGhpcy4jb3V0bGluZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50Py5kcmF3TGF5ZXIucmVtb3ZlQ2xhc3ModGhpcy4jb3V0bGluZUlkLCBcInNlbGVjdGVkXCIpO1xuICAgIGlmICghdGhpcy4jaXNGcmVlSGlnaGxpZ2h0KSB7XG4gICAgICB0aGlzLiNzZXRDYXJldChmYWxzZSk7XG4gICAgfVxuICB9XG4gIGdldCBfbXVzdEZpeFBvc2l0aW9uKCkge1xuICAgIHJldHVybiAhdGhpcy4jaXNGcmVlSGlnaGxpZ2h0O1xuICB9XG4gIHNob3codmlzaWJsZSA9IHRoaXMuX2lzVmlzaWJsZSkge1xuICAgIHN1cGVyLnNob3codmlzaWJsZSk7XG4gICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuc2hvdyh0aGlzLiNpZCwgdmlzaWJsZSk7XG4gICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuc2hvdyh0aGlzLiNvdXRsaW5lSWQsIHZpc2libGUpO1xuICAgIH1cbiAgfVxuICAjZ2V0Um90YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lzRnJlZUhpZ2hsaWdodCA/IHRoaXMucm90YXRpb24gOiAwO1xuICB9XG4gICNzZXJpYWxpemVCb3hlcygpIHtcbiAgICBpZiAodGhpcy4jaXNGcmVlSGlnaGxpZ2h0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgIGNvbnN0IGJveGVzID0gdGhpcy4jYm94ZXM7XG4gICAgY29uc3QgcXVhZFBvaW50cyA9IG5ldyBGbG9hdDMyQXJyYXkoYm94ZXMubGVuZ3RoICogOCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGZvciAoY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gb2YgYm94ZXMpIHtcbiAgICAgIGNvbnN0IHN4ID0geCAqIHBhZ2VXaWR0aDtcbiAgICAgIGNvbnN0IHN5ID0gKDEgLSB5IC0gaGVpZ2h0KSAqIHBhZ2VIZWlnaHQ7XG4gICAgICBxdWFkUG9pbnRzW2ldID0gcXVhZFBvaW50c1tpICsgNF0gPSBzeDtcbiAgICAgIHF1YWRQb2ludHNbaSArIDFdID0gcXVhZFBvaW50c1tpICsgM10gPSBzeTtcbiAgICAgIHF1YWRQb2ludHNbaSArIDJdID0gcXVhZFBvaW50c1tpICsgNl0gPSBzeCArIHdpZHRoICogcGFnZVdpZHRoO1xuICAgICAgcXVhZFBvaW50c1tpICsgNV0gPSBxdWFkUG9pbnRzW2kgKyA3XSA9IHN5ICsgaGVpZ2h0ICogcGFnZUhlaWdodDtcbiAgICAgIGkgKz0gODtcbiAgICB9XG4gICAgcmV0dXJuIHF1YWRQb2ludHM7XG4gIH1cbiAgI3NlcmlhbGl6ZU91dGxpbmVzKHJlY3QpIHtcbiAgICByZXR1cm4gdGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMuc2VyaWFsaXplKHJlY3QsIHRoaXMuI2dldFJvdGF0aW9uKCkpO1xuICB9XG4gIHN0YXRpYyBzdGFydEhpZ2hsaWdodGluZyhwYXJlbnQsIGlzTFRSLCB7XG4gICAgdGFyZ2V0OiB0ZXh0TGF5ZXIsXG4gICAgeCxcbiAgICB5XG4gIH0pIHtcbiAgICBjb25zdCB7XG4gICAgICB4OiBsYXllclgsXG4gICAgICB5OiBsYXllclksXG4gICAgICB3aWR0aDogcGFyZW50V2lkdGgsXG4gICAgICBoZWlnaHQ6IHBhcmVudEhlaWdodFxuICAgIH0gPSB0ZXh0TGF5ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcG9pbnRlck1vdmUgPSBlID0+IHtcbiAgICAgIHRoaXMuI2hpZ2hsaWdodE1vdmUocGFyZW50LCBlKTtcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25hbCA9IHBhcmVudC5fc2lnbmFsO1xuICAgIGNvbnN0IHBvaW50ZXJEb3duT3B0aW9ucyA9IHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgIHNpZ25hbFxuICAgIH07XG4gICAgY29uc3QgcG9pbnRlckRvd24gPSBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICBjb25zdCBwb2ludGVyVXBDYWxsYmFjayA9IGUgPT4ge1xuICAgICAgdGV4dExheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBwb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgcG9pbnRlclVwQ2FsbGJhY2spO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlclVwQ2FsbGJhY2spO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBwb2ludGVyRG93biwgcG9pbnRlckRvd25PcHRpb25zKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSk7XG4gICAgICB0aGlzLiNlbmRIaWdobGlnaHQocGFyZW50LCBlKTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVyVXBDYWxsYmFjaywge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlclVwQ2FsbGJhY2ssIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgcG9pbnRlckRvd24sIHBvaW50ZXJEb3duT3B0aW9ucyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0ZXh0TGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHBvaW50ZXJNb3ZlLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLl9mcmVlSGlnaGxpZ2h0ID0gbmV3IEZyZWVPdXRsaW5lcih7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0sIFtsYXllclgsIGxheWVyWSwgcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0sIHBhcmVudC5zY2FsZSwgdGhpcy5fZGVmYXVsdFRoaWNrbmVzcyAvIDIsIGlzTFRSLCAwLjAwMSk7XG4gICAgKHtcbiAgICAgIGlkOiB0aGlzLl9mcmVlSGlnaGxpZ2h0SWQsXG4gICAgICBjbGlwUGF0aElkOiB0aGlzLl9mcmVlSGlnaGxpZ2h0Q2xpcElkXG4gICAgfSA9IHBhcmVudC5kcmF3TGF5ZXIuaGlnaGxpZ2h0KHRoaXMuX2ZyZWVIaWdobGlnaHQsIHRoaXMuX2RlZmF1bHRDb2xvciwgdGhpcy5fZGVmYXVsdE9wYWNpdHksIHRydWUpKTtcbiAgfVxuICBzdGF0aWMgI2hpZ2hsaWdodE1vdmUocGFyZW50LCBldmVudCkge1xuICAgIGlmICh0aGlzLl9mcmVlSGlnaGxpZ2h0LmFkZChldmVudCkpIHtcbiAgICAgIHBhcmVudC5kcmF3TGF5ZXIudXBkYXRlUGF0aCh0aGlzLl9mcmVlSGlnaGxpZ2h0SWQsIHRoaXMuX2ZyZWVIaWdobGlnaHQpO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgI2VuZEhpZ2hsaWdodChwYXJlbnQsIGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9mcmVlSGlnaGxpZ2h0LmlzRW1wdHkoKSkge1xuICAgICAgcGFyZW50LmNyZWF0ZUFuZEFkZE5ld0VkaXRvcihldmVudCwgZmFsc2UsIHtcbiAgICAgICAgaGlnaGxpZ2h0SWQ6IHRoaXMuX2ZyZWVIaWdobGlnaHRJZCxcbiAgICAgICAgaGlnaGxpZ2h0T3V0bGluZXM6IHRoaXMuX2ZyZWVIaWdobGlnaHQuZ2V0T3V0bGluZXMoKSxcbiAgICAgICAgY2xpcFBhdGhJZDogdGhpcy5fZnJlZUhpZ2hsaWdodENsaXBJZCxcbiAgICAgICAgbWV0aG9kT2ZDcmVhdGlvbjogXCJtYWluX3Rvb2xiYXJcIlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudC5kcmF3TGF5ZXIucmVtb3ZlRnJlZUhpZ2hsaWdodCh0aGlzLl9mcmVlSGlnaGxpZ2h0SWQpO1xuICAgIH1cbiAgICB0aGlzLl9mcmVlSGlnaGxpZ2h0SWQgPSAtMTtcbiAgICB0aGlzLl9mcmVlSGlnaGxpZ2h0ID0gbnVsbDtcbiAgICB0aGlzLl9mcmVlSGlnaGxpZ2h0Q2xpcElkID0gXCJcIjtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBjb25zdCBlZGl0b3IgPSBzdXBlci5kZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcik7XG4gICAgY29uc3Qge1xuICAgICAgcmVjdDogW2JsWCwgYmxZLCB0clgsIHRyWV0sXG4gICAgICBjb2xvcixcbiAgICAgIHF1YWRQb2ludHNcbiAgICB9ID0gZGF0YTtcbiAgICBlZGl0b3IuY29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5jb2xvcik7XG4gICAgZWRpdG9yLiNvcGFjaXR5ID0gZGF0YS5vcGFjaXR5O1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gZWRpdG9yLnBhZ2VEaW1lbnNpb25zO1xuICAgIGVkaXRvci53aWR0aCA9ICh0clggLSBibFgpIC8gcGFnZVdpZHRoO1xuICAgIGVkaXRvci5oZWlnaHQgPSAodHJZIC0gYmxZKSAvIHBhZ2VIZWlnaHQ7XG4gICAgY29uc3QgYm94ZXMgPSBlZGl0b3IuI2JveGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFkUG9pbnRzLmxlbmd0aDsgaSArPSA4KSB7XG4gICAgICBib3hlcy5wdXNoKHtcbiAgICAgICAgeDogKHF1YWRQb2ludHNbNF0gLSB0clgpIC8gcGFnZVdpZHRoLFxuICAgICAgICB5OiAodHJZIC0gKDEgLSBxdWFkUG9pbnRzW2kgKyA1XSkpIC8gcGFnZUhlaWdodCxcbiAgICAgICAgd2lkdGg6IChxdWFkUG9pbnRzW2kgKyAyXSAtIHF1YWRQb2ludHNbaV0pIC8gcGFnZVdpZHRoLFxuICAgICAgICBoZWlnaHQ6IChxdWFkUG9pbnRzW2kgKyA1XSAtIHF1YWRQb2ludHNbaSArIDFdKSAvIHBhZ2VIZWlnaHRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlZGl0b3IuI2NyZWF0ZU91dGxpbmVzKCk7XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICBzZXJpYWxpemUoaXNGb3JDb3B5aW5nID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkgfHwgaXNGb3JDb3B5aW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0UmVjdCgwLCAwKTtcbiAgICBjb25zdCBjb2xvciA9IEFubm90YXRpb25FZGl0b3IuX2NvbG9yTWFuYWdlci5jb252ZXJ0KHRoaXMuY29sb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uVHlwZTogQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hULFxuICAgICAgY29sb3IsXG4gICAgICBvcGFjaXR5OiB0aGlzLiNvcGFjaXR5LFxuICAgICAgdGhpY2tuZXNzOiB0aGlzLiN0aGlja25lc3MsXG4gICAgICBxdWFkUG9pbnRzOiB0aGlzLiNzZXJpYWxpemVCb3hlcygpLFxuICAgICAgb3V0bGluZXM6IHRoaXMuI3NlcmlhbGl6ZU91dGxpbmVzKHJlY3QpLFxuICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgIHJlY3QsXG4gICAgICByb3RhdGlvbjogdGhpcy4jZ2V0Um90YXRpb24oKSxcbiAgICAgIHN0cnVjdFRyZWVQYXJlbnRJZDogdGhpcy5fc3RydWN0VHJlZVBhcmVudElkXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY2FuQ3JlYXRlTmV3RW1wdHlFZGl0b3IoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9pbmsuanNcblxuXG5cblxuXG5jbGFzcyBJbmtFZGl0b3IgZXh0ZW5kcyBBbm5vdGF0aW9uRWRpdG9yIHtcbiAgI2Jhc2VIZWlnaHQgPSAwO1xuICAjYmFzZVdpZHRoID0gMDtcbiAgI2JvdW5kQ2FudmFzUG9pbnRlcm1vdmUgPSB0aGlzLmNhbnZhc1BvaW50ZXJtb3ZlLmJpbmQodGhpcyk7XG4gICNib3VuZENhbnZhc1BvaW50ZXJsZWF2ZSA9IHRoaXMuY2FudmFzUG9pbnRlcmxlYXZlLmJpbmQodGhpcyk7XG4gICNib3VuZENhbnZhc1BvaW50ZXJ1cCA9IHRoaXMuY2FudmFzUG9pbnRlcnVwLmJpbmQodGhpcyk7XG4gICNib3VuZENhbnZhc1BvaW50ZXJkb3duID0gdGhpcy5jYW52YXNQb2ludGVyZG93bi5iaW5kKHRoaXMpO1xuICAjY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQgPSBudWxsO1xuICAjY3VycmVudFBhdGgyRCA9IG5ldyBQYXRoMkQoKTtcbiAgI2Rpc2FibGVFZGl0aW5nID0gZmFsc2U7XG4gICNoYXNTb21ldGhpbmdUb0RyYXcgPSBmYWxzZTtcbiAgI2lzQ2FudmFzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgI29ic2VydmVyID0gbnVsbDtcbiAgI3JlYWxXaWR0aCA9IDA7XG4gICNyZWFsSGVpZ2h0ID0gMDtcbiAgI3JlcXVlc3RGcmFtZUNhbGxiYWNrID0gbnVsbDtcbiAgc3RhdGljIF9kZWZhdWx0Q29sb3IgPSBudWxsO1xuICBzdGF0aWMgX2RlZmF1bHRPcGFjaXR5ID0gMTtcbiAgc3RhdGljIF9kZWZhdWx0VGhpY2tuZXNzID0gMTtcbiAgc3RhdGljIF90eXBlID0gXCJpbmtcIjtcbiAgc3RhdGljIF9lZGl0b3JUeXBlID0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LO1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBuYW1lOiBcImlua0VkaXRvclwiXG4gICAgfSk7XG4gICAgdGhpcy5jb2xvciA9IHBhcmFtcy5jb2xvciB8fCBudWxsO1xuICAgIHRoaXMudGhpY2tuZXNzID0gcGFyYW1zLnRoaWNrbmVzcyB8fCBudWxsO1xuICAgIHRoaXMub3BhY2l0eSA9IHBhcmFtcy5vcGFjaXR5IHx8IG51bGw7XG4gICAgdGhpcy5wYXRocyA9IFtdO1xuICAgIHRoaXMuYmV6aWVyUGF0aDJEID0gW107XG4gICAgdGhpcy5hbGxSYXdQYXRocyA9IFtdO1xuICAgIHRoaXMuY3VycmVudFBhdGggPSBbXTtcbiAgICB0aGlzLnNjYWxlRmFjdG9yID0gMTtcbiAgICB0aGlzLnRyYW5zbGF0aW9uWCA9IHRoaXMudHJhbnNsYXRpb25ZID0gMDtcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gICAgdGhpcy5fd2lsbEtlZXBBc3BlY3RSYXRpbyA9IHRydWU7XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyKSB7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5pbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcik7XG4gIH1cbiAgc3RhdGljIHVwZGF0ZURlZmF1bHRQYXJhbXModHlwZSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX1RISUNLTkVTUzpcbiAgICAgICAgSW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgIElua0VkaXRvci5fZGVmYXVsdENvbG9yID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWTpcbiAgICAgICAgSW5rRWRpdG9yLl9kZWZhdWx0T3BhY2l0eSA9IHZhbHVlIC8gMTAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1M6XG4gICAgICAgIHRoaXMuI3VwZGF0ZVRoaWNrbmVzcyh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgIHRoaXMuI3VwZGF0ZUNvbG9yKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZOlxuICAgICAgICB0aGlzLiN1cGRhdGVPcGFjaXR5KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW1tBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLCBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SLCBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBBbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZLCBNYXRoLnJvdW5kKElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkgKiAxMDApXV07XG4gIH1cbiAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW1tBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLCB0aGlzLnRoaWNrbmVzcyB8fCBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SLCB0aGlzLmNvbG9yIHx8IElua0VkaXRvci5fZGVmYXVsdENvbG9yIHx8IEFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFksIE1hdGgucm91bmQoMTAwICogKHRoaXMub3BhY2l0eSA/PyBJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5KSldXTtcbiAgfVxuICAjdXBkYXRlVGhpY2tuZXNzKHRoaWNrbmVzcykge1xuICAgIGNvbnN0IHNldFRoaWNrbmVzcyA9IHRoID0+IHtcbiAgICAgIHRoaXMudGhpY2tuZXNzID0gdGg7XG4gICAgICB0aGlzLiNmaXRUb0NvbnRlbnQoKTtcbiAgICB9O1xuICAgIGNvbnN0IHNhdmVkVGhpY2tuZXNzID0gdGhpcy50aGlja25lc3M7XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6IHNldFRoaWNrbmVzcy5iaW5kKHRoaXMsIHRoaWNrbmVzcyksXG4gICAgICB1bmRvOiBzZXRUaGlja25lc3MuYmluZCh0aGlzLCBzYXZlZFRoaWNrbmVzcyksXG4gICAgICBwb3N0OiB0aGlzLl91aU1hbmFnZXIudXBkYXRlVUkuYmluZCh0aGlzLl91aU1hbmFnZXIsIHRoaXMpLFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLFxuICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogdHJ1ZSxcbiAgICAgIGtlZXBVbmRvOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgI3VwZGF0ZUNvbG9yKGNvbG9yKSB7XG4gICAgY29uc3Qgc2V0Q29sb3IgPSBjb2wgPT4ge1xuICAgICAgdGhpcy5jb2xvciA9IGNvbDtcbiAgICAgIHRoaXMuI3JlZHJhdygpO1xuICAgIH07XG4gICAgY29uc3Qgc2F2ZWRDb2xvciA9IHRoaXMuY29sb3I7XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6IHNldENvbG9yLmJpbmQodGhpcywgY29sb3IpLFxuICAgICAgdW5kbzogc2V0Q29sb3IuYmluZCh0aGlzLCBzYXZlZENvbG9yKSxcbiAgICAgIHBvc3Q6IHRoaXMuX3VpTWFuYWdlci51cGRhdGVVSS5iaW5kKHRoaXMuX3VpTWFuYWdlciwgdGhpcyksXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUixcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gICN1cGRhdGVPcGFjaXR5KG9wYWNpdHkpIHtcbiAgICBjb25zdCBzZXRPcGFjaXR5ID0gb3AgPT4ge1xuICAgICAgdGhpcy5vcGFjaXR5ID0gb3A7XG4gICAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICB9O1xuICAgIG9wYWNpdHkgLz0gMTAwO1xuICAgIGNvbnN0IHNhdmVkT3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogc2V0T3BhY2l0eS5iaW5kKHRoaXMsIG9wYWNpdHkpLFxuICAgICAgdW5kbzogc2V0T3BhY2l0eS5iaW5kKHRoaXMsIHNhdmVkT3BhY2l0eSksXG4gICAgICBwb3N0OiB0aGlzLl91aU1hbmFnZXIudXBkYXRlVUkuYmluZCh0aGlzLl91aU1hbmFnZXIsIHRoaXMpLFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWSxcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlYnVpbGQoKSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgaWYgKHRoaXMuZGl2ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5jYW52YXMpIHtcbiAgICAgIHRoaXMuI2NyZWF0ZUNhbnZhcygpO1xuICAgICAgdGhpcy4jY3JlYXRlT2JzZXJ2ZXIoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgdGhpcy5wYXJlbnQuYWRkKHRoaXMpO1xuICAgICAgdGhpcy4jc2V0Q2FudmFzRGltcygpO1xuICAgIH1cbiAgICB0aGlzLiNmaXRUb0NvbnRlbnQoKTtcbiAgfVxuICByZW1vdmUoKSB7XG4gICAgaWYgKHRoaXMuY2FudmFzID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMuY29tbWl0KCk7XG4gICAgfVxuICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmUoKTtcbiAgICB0aGlzLmNhbnZhcyA9IG51bGw7XG4gICAgaWYgKHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQpO1xuICAgICAgdGhpcy4jY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLiNvYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuI29ic2VydmVyID0gbnVsbDtcbiAgICBzdXBlci5yZW1vdmUoKTtcbiAgfVxuICBzZXRQYXJlbnQocGFyZW50KSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCAmJiBwYXJlbnQpIHtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5yZW1vdmVTaG91bGRSZXNjYWxlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wYXJlbnQgJiYgcGFyZW50ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuYWRkU2hvdWxkUmVzY2FsZSh0aGlzKTtcbiAgICB9XG4gICAgc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7XG4gIH1cbiAgb25TY2FsZUNoYW5naW5nKCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodDtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7XG4gIH1cbiAgZW5hYmxlRWRpdE1vZGUoKSB7XG4gICAgaWYgKHRoaXMuI2Rpc2FibGVFZGl0aW5nIHx8IHRoaXMuY2FudmFzID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVyZG93biwge1xuICAgICAgc2lnbmFsOiB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbFxuICAgIH0pO1xuICB9XG4gIGRpc2FibGVFZGl0TW9kZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNJbkVkaXRNb2RlKCkgfHwgdGhpcy5jYW52YXMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuZGlzYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSAhdGhpcy5pc0VtcHR5KCk7XG4gICAgdGhpcy5kaXYuY2xhc3NMaXN0LnJlbW92ZShcImVkaXRpbmdcIik7XG4gICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmRvd24pO1xuICB9XG4gIG9uY2VBZGRlZCgpIHtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9ICF0aGlzLmlzRW1wdHkoKTtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnBhdGhzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLnBhdGhzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnBhdGhzWzBdLmxlbmd0aCA9PT0gMDtcbiAgfVxuICAjZ2V0SW5pdGlhbEJCb3goKSB7XG4gICAgY29uc3Qge1xuICAgICAgcGFyZW50Um90YXRpb24sXG4gICAgICBwYXJlbnREaW1lbnNpb25zOiBbd2lkdGgsIGhlaWdodF1cbiAgICB9ID0gdGhpcztcbiAgICBzd2l0Y2ggKHBhcmVudFJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICByZXR1cm4gWzAsIGhlaWdodCwgaGVpZ2h0LCB3aWR0aF07XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0XTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4gW3dpZHRoLCAwLCBoZWlnaHQsIHdpZHRoXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbMCwgMCwgd2lkdGgsIGhlaWdodF07XG4gICAgfVxuICB9XG4gICNzZXRTdHJva2UoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY3R4LFxuICAgICAgY29sb3IsXG4gICAgICBvcGFjaXR5LFxuICAgICAgdGhpY2tuZXNzLFxuICAgICAgcGFyZW50U2NhbGUsXG4gICAgICBzY2FsZUZhY3RvclxuICAgIH0gPSB0aGlzO1xuICAgIGN0eC5saW5lV2lkdGggPSB0aGlja25lc3MgKiBwYXJlbnRTY2FsZSAvIHNjYWxlRmFjdG9yO1xuICAgIGN0eC5saW5lQ2FwID0gXCJyb3VuZFwiO1xuICAgIGN0eC5saW5lSm9pbiA9IFwicm91bmRcIjtcbiAgICBjdHgubWl0ZXJMaW1pdCA9IDEwO1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IGAke2NvbG9yfSR7b3BhY2l0eVRvSGV4KG9wYWNpdHkpfWA7XG4gIH1cbiAgI3N0YXJ0RHJhd2luZyh4LCB5KSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybGVhdmVcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVybGVhdmUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJtb3ZlLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcnVwLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVyZG93bik7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuICAgIGlmICghdGhpcy4jaXNDYW52YXNJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy4jaXNDYW52YXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB0aGlzLiNzZXRDYW52YXNEaW1zKCk7XG4gICAgICB0aGlzLnRoaWNrbmVzcyB8fD0gSW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzO1xuICAgICAgdGhpcy5jb2xvciB8fD0gSW5rRWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcjtcbiAgICAgIHRoaXMub3BhY2l0eSA/Pz0gSW5rRWRpdG9yLl9kZWZhdWx0T3BhY2l0eTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGF0aC5wdXNoKFt4LCB5XSk7XG4gICAgdGhpcy4jaGFzU29tZXRoaW5nVG9EcmF3ID0gZmFsc2U7XG4gICAgdGhpcy4jc2V0U3Ryb2tlKCk7XG4gICAgdGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLiNkcmF3UG9pbnRzKCk7XG4gICAgICBpZiAodGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2spIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLiNyZXF1ZXN0RnJhbWVDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuI3JlcXVlc3RGcmFtZUNhbGxiYWNrKTtcbiAgfVxuICAjZHJhdyh4LCB5KSB7XG4gICAgY29uc3QgW2xhc3RYLCBsYXN0WV0gPSB0aGlzLmN1cnJlbnRQYXRoLmF0KC0xKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UGF0aC5sZW5ndGggPiAxICYmIHggPT09IGxhc3RYICYmIHkgPT09IGxhc3RZKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gdGhpcy5jdXJyZW50UGF0aDtcbiAgICBsZXQgcGF0aDJEID0gdGhpcy4jY3VycmVudFBhdGgyRDtcbiAgICBjdXJyZW50UGF0aC5wdXNoKFt4LCB5XSk7XG4gICAgdGhpcy4jaGFzU29tZXRoaW5nVG9EcmF3ID0gdHJ1ZTtcbiAgICBpZiAoY3VycmVudFBhdGgubGVuZ3RoIDw9IDIpIHtcbiAgICAgIHBhdGgyRC5tb3ZlVG8oLi4uY3VycmVudFBhdGhbMF0pO1xuICAgICAgcGF0aDJELmxpbmVUbyh4LCB5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRQYXRoLmxlbmd0aCA9PT0gMykge1xuICAgICAgdGhpcy4jY3VycmVudFBhdGgyRCA9IHBhdGgyRCA9IG5ldyBQYXRoMkQoKTtcbiAgICAgIHBhdGgyRC5tb3ZlVG8oLi4uY3VycmVudFBhdGhbMF0pO1xuICAgIH1cbiAgICB0aGlzLiNtYWtlQmV6aWVyQ3VydmUocGF0aDJELCAuLi5jdXJyZW50UGF0aC5hdCgtMyksIC4uLmN1cnJlbnRQYXRoLmF0KC0yKSwgeCwgeSk7XG4gIH1cbiAgI2VuZFBhdGgoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhc3RQb2ludCA9IHRoaXMuY3VycmVudFBhdGguYXQoLTEpO1xuICAgIHRoaXMuI2N1cnJlbnRQYXRoMkQubGluZVRvKC4uLmxhc3RQb2ludCk7XG4gIH1cbiAgI3N0b3BEcmF3aW5nKHgsIHkpIHtcbiAgICB0aGlzLiNyZXF1ZXN0RnJhbWVDYWxsYmFjayA9IG51bGw7XG4gICAgeCA9IE1hdGgubWluKE1hdGgubWF4KHgsIDApLCB0aGlzLmNhbnZhcy53aWR0aCk7XG4gICAgeSA9IE1hdGgubWluKE1hdGgubWF4KHksIDApLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuI2RyYXcoeCwgeSk7XG4gICAgdGhpcy4jZW5kUGF0aCgpO1xuICAgIGxldCBiZXppZXI7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhdGgubGVuZ3RoICE9PSAxKSB7XG4gICAgICBiZXppZXIgPSB0aGlzLiNnZW5lcmF0ZUJlemllclBvaW50cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB4eSA9IFt4LCB5XTtcbiAgICAgIGJlemllciA9IFtbeHksIHh5LnNsaWNlKCksIHh5LnNsaWNlKCksIHh5XV07XG4gICAgfVxuICAgIGNvbnN0IHBhdGgyRCA9IHRoaXMuI2N1cnJlbnRQYXRoMkQ7XG4gICAgY29uc3QgY3VycmVudFBhdGggPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgIHRoaXMuY3VycmVudFBhdGggPSBbXTtcbiAgICB0aGlzLiNjdXJyZW50UGF0aDJEID0gbmV3IFBhdGgyRCgpO1xuICAgIGNvbnN0IGNtZCA9ICgpID0+IHtcbiAgICAgIHRoaXMuYWxsUmF3UGF0aHMucHVzaChjdXJyZW50UGF0aCk7XG4gICAgICB0aGlzLnBhdGhzLnB1c2goYmV6aWVyKTtcbiAgICAgIHRoaXMuYmV6aWVyUGF0aDJELnB1c2gocGF0aDJEKTtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5yZWJ1aWxkKHRoaXMpO1xuICAgIH07XG4gICAgY29uc3QgdW5kbyA9ICgpID0+IHtcbiAgICAgIHRoaXMuYWxsUmF3UGF0aHMucG9wKCk7XG4gICAgICB0aGlzLnBhdGhzLnBvcCgpO1xuICAgICAgdGhpcy5iZXppZXJQYXRoMkQucG9wKCk7XG4gICAgICBpZiAodGhpcy5wYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICB0aGlzLiNjcmVhdGVDYW52YXMoKTtcbiAgICAgICAgICB0aGlzLiNjcmVhdGVPYnNlcnZlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2ZpdFRvQ29udGVudCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQsXG4gICAgICB1bmRvLFxuICAgICAgbXVzdEV4ZWM6IHRydWVcbiAgICB9KTtcbiAgfVxuICAjZHJhd1BvaW50cygpIHtcbiAgICBpZiAoIXRoaXMuI2hhc1NvbWV0aGluZ1RvRHJhdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNoYXNTb21ldGhpbmdUb0RyYXcgPSBmYWxzZTtcbiAgICBjb25zdCB0aGlja25lc3MgPSBNYXRoLmNlaWwodGhpcy50aGlja25lc3MgKiB0aGlzLnBhcmVudFNjYWxlKTtcbiAgICBjb25zdCBsYXN0UG9pbnRzID0gdGhpcy5jdXJyZW50UGF0aC5zbGljZSgtMyk7XG4gICAgY29uc3QgeCA9IGxhc3RQb2ludHMubWFwKHh5ID0+IHh5WzBdKTtcbiAgICBjb25zdCB5ID0gbGFzdFBvaW50cy5tYXAoeHkgPT4geHlbMV0pO1xuICAgIGNvbnN0IHhNaW4gPSBNYXRoLm1pbiguLi54KSAtIHRoaWNrbmVzcztcbiAgICBjb25zdCB4TWF4ID0gTWF0aC5tYXgoLi4ueCkgKyB0aGlja25lc3M7XG4gICAgY29uc3QgeU1pbiA9IE1hdGgubWluKC4uLnkpIC0gdGhpY2tuZXNzO1xuICAgIGNvbnN0IHlNYXggPSBNYXRoLm1heCguLi55KSArIHRoaWNrbmVzcztcbiAgICBjb25zdCB7XG4gICAgICBjdHhcbiAgICB9ID0gdGhpcztcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHRoaXMuYmV6aWVyUGF0aDJEKSB7XG4gICAgICBjdHguc3Ryb2tlKHBhdGgpO1xuICAgIH1cbiAgICBjdHguc3Ryb2tlKHRoaXMuI2N1cnJlbnRQYXRoMkQpO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gIH1cbiAgI21ha2VCZXppZXJDdXJ2ZShwYXRoMkQsIHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgICBjb25zdCBwcmV2WCA9ICh4MCArIHgxKSAvIDI7XG4gICAgY29uc3QgcHJldlkgPSAoeTAgKyB5MSkgLyAyO1xuICAgIGNvbnN0IHgzID0gKHgxICsgeDIpIC8gMjtcbiAgICBjb25zdCB5MyA9ICh5MSArIHkyKSAvIDI7XG4gICAgcGF0aDJELmJlemllckN1cnZlVG8ocHJldlggKyAyICogKHgxIC0gcHJldlgpIC8gMywgcHJldlkgKyAyICogKHkxIC0gcHJldlkpIC8gMywgeDMgKyAyICogKHgxIC0geDMpIC8gMywgeTMgKyAyICogKHkxIC0geTMpIC8gMywgeDMsIHkzKTtcbiAgfVxuICAjZ2VuZXJhdGVCZXppZXJQb2ludHMoKSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuY3VycmVudFBhdGg7XG4gICAgaWYgKHBhdGgubGVuZ3RoIDw9IDIpIHtcbiAgICAgIHJldHVybiBbW3BhdGhbMF0sIHBhdGhbMF0sIHBhdGguYXQoLTEpLCBwYXRoLmF0KC0xKV1dO1xuICAgIH1cbiAgICBjb25zdCBiZXppZXJQb2ludHMgPSBbXTtcbiAgICBsZXQgaTtcbiAgICBsZXQgW3gwLCB5MF0gPSBwYXRoWzBdO1xuICAgIGZvciAoaSA9IDE7IGkgPCBwYXRoLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgY29uc3QgW3gxLCB5MV0gPSBwYXRoW2ldO1xuICAgICAgY29uc3QgW3gyLCB5Ml0gPSBwYXRoW2kgKyAxXTtcbiAgICAgIGNvbnN0IHgzID0gKHgxICsgeDIpIC8gMjtcbiAgICAgIGNvbnN0IHkzID0gKHkxICsgeTIpIC8gMjtcbiAgICAgIGNvbnN0IGNvbnRyb2wxID0gW3gwICsgMiAqICh4MSAtIHgwKSAvIDMsIHkwICsgMiAqICh5MSAtIHkwKSAvIDNdO1xuICAgICAgY29uc3QgY29udHJvbDIgPSBbeDMgKyAyICogKHgxIC0geDMpIC8gMywgeTMgKyAyICogKHkxIC0geTMpIC8gM107XG4gICAgICBiZXppZXJQb2ludHMucHVzaChbW3gwLCB5MF0sIGNvbnRyb2wxLCBjb250cm9sMiwgW3gzLCB5M11dKTtcbiAgICAgIFt4MCwgeTBdID0gW3gzLCB5M107XG4gICAgfVxuICAgIGNvbnN0IFt4MSwgeTFdID0gcGF0aFtpXTtcbiAgICBjb25zdCBbeDIsIHkyXSA9IHBhdGhbaSArIDFdO1xuICAgIGNvbnN0IGNvbnRyb2wxID0gW3gwICsgMiAqICh4MSAtIHgwKSAvIDMsIHkwICsgMiAqICh5MSAtIHkwKSAvIDNdO1xuICAgIGNvbnN0IGNvbnRyb2wyID0gW3gyICsgMiAqICh4MSAtIHgyKSAvIDMsIHkyICsgMiAqICh5MSAtIHkyKSAvIDNdO1xuICAgIGJlemllclBvaW50cy5wdXNoKFtbeDAsIHkwXSwgY29udHJvbDEsIGNvbnRyb2wyLCBbeDIsIHkyXV0pO1xuICAgIHJldHVybiBiZXppZXJQb2ludHM7XG4gIH1cbiAgI3JlZHJhdygpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMuI3VwZGF0ZVRyYW5zZm9ybSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNzZXRTdHJva2UoKTtcbiAgICBjb25zdCB7XG4gICAgICBjYW52YXMsXG4gICAgICBjdHhcbiAgICB9ID0gdGhpcztcbiAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLiN1cGRhdGVUcmFuc2Zvcm0oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5iZXppZXJQYXRoMkQpIHtcbiAgICAgIGN0eC5zdHJva2UocGF0aCk7XG4gICAgfVxuICB9XG4gIGNvbW1pdCgpIHtcbiAgICBpZiAodGhpcy4jZGlzYWJsZUVkaXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuY29tbWl0KCk7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgIHRoaXMuc2V0SW5Gb3JlZ3JvdW5kKCk7XG4gICAgdGhpcy4jZGlzYWJsZUVkaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKTtcbiAgICB0aGlzLiNmaXRUb0NvbnRlbnQodHJ1ZSk7XG4gICAgdGhpcy5zZWxlY3QoKTtcbiAgICB0aGlzLnBhcmVudC5hZGRJbmtFZGl0b3JJZk5lZWRlZCh0cnVlKTtcbiAgICB0aGlzLm1vdmVJbkRPTSgpO1xuICAgIHRoaXMuZGl2LmZvY3VzKHtcbiAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICB9KTtcbiAgfVxuICBmb2N1c2luKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9mb2N1c0V2ZW50c0FsbG93ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuZm9jdXNpbihldmVudCk7XG4gICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuICB9XG4gIGNhbnZhc1BvaW50ZXJkb3duKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCAhdGhpcy5pc0luRWRpdE1vZGUoKSB8fCB0aGlzLiNkaXNhYmxlRWRpdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEluRm9yZWdyb3VuZCgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0aGlzLmRpdi5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgdGhpcy5kaXYuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy4jc3RhcnREcmF3aW5nKGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuICB9XG4gIGNhbnZhc1BvaW50ZXJtb3ZlKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLiNkcmF3KGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuICB9XG4gIGNhbnZhc1BvaW50ZXJ1cChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy4jZW5kRHJhd2luZyhldmVudCk7XG4gIH1cbiAgY2FudmFzUG9pbnRlcmxlYXZlKGV2ZW50KSB7XG4gICAgdGhpcy4jZW5kRHJhd2luZyhldmVudCk7XG4gIH1cbiAgI2VuZERyYXdpbmcoZXZlbnQpIHtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmxlYXZlXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmxlYXZlKTtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVybW92ZSk7XG4gICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJ1cCk7XG4gICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmRvd24sIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWxcbiAgICB9KTtcbiAgICBpZiAodGhpcy4jY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCk7XG4gICAgfVxuICAgIHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCA9IG51bGw7XG4gICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSk7XG4gICAgfSwgMTApO1xuICAgIHRoaXMuI3N0b3BEcmF3aW5nKGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuICAgIHRoaXMuc2V0SW5CYWNrZ3JvdW5kKCk7XG4gIH1cbiAgI2NyZWF0ZUNhbnZhcygpIHtcbiAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5oZWlnaHQgPSAwO1xuICAgIHRoaXMuY2FudmFzLmNsYXNzTmFtZSA9IFwiaW5rRWRpdG9yQ2FudmFzXCI7XG4gICAgdGhpcy5jYW52YXMuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtaW5rLWNhbnZhc1wiKTtcbiAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5jYW52YXMpO1xuICAgIHRoaXMuY3R4ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICB9XG4gICNjcmVhdGVPYnNlcnZlcigpIHtcbiAgICB0aGlzLiNvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBlbnRyaWVzWzBdLmNvbnRlbnRSZWN0O1xuICAgICAgaWYgKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpIHtcbiAgICAgICAgdGhpcy5zZXREaW1lbnNpb25zKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLiNvYnNlcnZlci5vYnNlcnZlKHRoaXMuZGl2KTtcbiAgICB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4ge1xuICAgICAgdGhpcy4jb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuI29ic2VydmVyID0gbnVsbDtcbiAgICB9LCB7XG4gICAgICBvbmNlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgZ2V0IGlzUmVzaXphYmxlKCkge1xuICAgIHJldHVybiAhdGhpcy5pc0VtcHR5KCkgJiYgdGhpcy4jZGlzYWJsZUVkaXRpbmc7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLmRpdikge1xuICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgIH1cbiAgICBsZXQgYmFzZVgsIGJhc2VZO1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICBiYXNlWCA9IHRoaXMueDtcbiAgICAgIGJhc2VZID0gdGhpcy55O1xuICAgIH1cbiAgICBzdXBlci5yZW5kZXIoKTtcbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1pbmtcIik7XG4gICAgY29uc3QgW3gsIHksIHcsIGhdID0gdGhpcy4jZ2V0SW5pdGlhbEJCb3goKTtcbiAgICB0aGlzLnNldEF0KHgsIHksIDAsIDApO1xuICAgIHRoaXMuc2V0RGltcyh3LCBoKTtcbiAgICB0aGlzLiNjcmVhdGVDYW52YXMoKTtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgdGhpcy5zZXRBc3BlY3RSYXRpbyh0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcbiAgICAgIHRoaXMuc2V0QXQoYmFzZVggKiBwYXJlbnRXaWR0aCwgYmFzZVkgKiBwYXJlbnRIZWlnaHQsIHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgICAgdGhpcy4jaXNDYW52YXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB0aGlzLiNzZXRDYW52YXNEaW1zKCk7XG4gICAgICB0aGlzLnNldERpbXModGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImVkaXRpbmdcIik7XG4gICAgICB0aGlzLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgfVxuICAgIHRoaXMuI2NyZWF0ZU9ic2VydmVyKCk7XG4gICAgcmV0dXJuIHRoaXMuZGl2O1xuICB9XG4gICNzZXRDYW52YXNEaW1zKCkge1xuICAgIGlmICghdGhpcy4jaXNDYW52YXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy5jYW52YXMud2lkdGggPSBNYXRoLmNlaWwodGhpcy53aWR0aCAqIHBhcmVudFdpZHRoKTtcbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBNYXRoLmNlaWwodGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgIHRoaXMuI3VwZGF0ZVRyYW5zZm9ybSgpO1xuICB9XG4gIHNldERpbWVuc2lvbnMod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IHJvdW5kZWRXaWR0aCA9IE1hdGgucm91bmQod2lkdGgpO1xuICAgIGNvbnN0IHJvdW5kZWRIZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCk7XG4gICAgaWYgKHRoaXMuI3JlYWxXaWR0aCA9PT0gcm91bmRlZFdpZHRoICYmIHRoaXMuI3JlYWxIZWlnaHQgPT09IHJvdW5kZWRIZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jcmVhbFdpZHRoID0gcm91bmRlZFdpZHRoO1xuICAgIHRoaXMuI3JlYWxIZWlnaHQgPSByb3VuZGVkSGVpZ2h0O1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLndpZHRoID0gd2lkdGggLyBwYXJlbnRXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAvIHBhcmVudEhlaWdodDtcbiAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgaWYgKHRoaXMuI2Rpc2FibGVFZGl0aW5nKSB7XG4gICAgICB0aGlzLiNzZXRTY2FsZUZhY3Rvcih3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy4jc2V0Q2FudmFzRGltcygpO1xuICAgIHRoaXMuI3JlZHJhdygpO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcbiAgICB0aGlzLmZpeERpbXMoKTtcbiAgfVxuICAjc2V0U2NhbGVGYWN0b3Iod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLiNnZXRQYWRkaW5nKCk7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3JXID0gKHdpZHRoIC0gcGFkZGluZykgLyB0aGlzLiNiYXNlV2lkdGg7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3JIID0gKGhlaWdodCAtIHBhZGRpbmcpIC8gdGhpcy4jYmFzZUhlaWdodDtcbiAgICB0aGlzLnNjYWxlRmFjdG9yID0gTWF0aC5taW4oc2NhbGVGYWN0b3JXLCBzY2FsZUZhY3RvckgpO1xuICB9XG4gICN1cGRhdGVUcmFuc2Zvcm0oKSB7XG4gICAgY29uc3QgcGFkZGluZyA9IHRoaXMuI2dldFBhZGRpbmcoKSAvIDI7XG4gICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKHRoaXMuc2NhbGVGYWN0b3IsIDAsIDAsIHRoaXMuc2NhbGVGYWN0b3IsIHRoaXMudHJhbnNsYXRpb25YICogdGhpcy5zY2FsZUZhY3RvciArIHBhZGRpbmcsIHRoaXMudHJhbnNsYXRpb25ZICogdGhpcy5zY2FsZUZhY3RvciArIHBhZGRpbmcpO1xuICB9XG4gIHN0YXRpYyAjYnVpbGRQYXRoMkQoYmV6aWVyKSB7XG4gICAgY29uc3QgcGF0aDJEID0gbmV3IFBhdGgyRCgpO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJlemllci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBjb25zdCBbZmlyc3QsIGNvbnRyb2wxLCBjb250cm9sMiwgc2Vjb25kXSA9IGJlemllcltpXTtcbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIHBhdGgyRC5tb3ZlVG8oLi4uZmlyc3QpO1xuICAgICAgfVxuICAgICAgcGF0aDJELmJlemllckN1cnZlVG8oY29udHJvbDFbMF0sIGNvbnRyb2wxWzFdLCBjb250cm9sMlswXSwgY29udHJvbDJbMV0sIHNlY29uZFswXSwgc2Vjb25kWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGgyRDtcbiAgfVxuICBzdGF0aWMgI3RvUERGQ29vcmRpbmF0ZXMocG9pbnRzLCByZWN0LCByb3RhdGlvbikge1xuICAgIGNvbnN0IFtibFgsIGJsWSwgdHJYLCB0clldID0gcmVjdDtcbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgcG9pbnRzW2ldICs9IGJsWDtcbiAgICAgICAgICBwb2ludHNbaSArIDFdID0gdHJZIC0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgY29uc3QgeCA9IHBvaW50c1tpXTtcbiAgICAgICAgICBwb2ludHNbaV0gPSBwb2ludHNbaSArIDFdICsgYmxYO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gPSB4ICsgYmxZO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgcG9pbnRzW2ldID0gdHJYIC0gcG9pbnRzW2ldO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gKz0gYmxZO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgY29uc3QgeCA9IHBvaW50c1tpXTtcbiAgICAgICAgICBwb2ludHNbaV0gPSB0clggLSBwb2ludHNbaSArIDFdO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gPSB0clkgLSB4O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuICBzdGF0aWMgI2Zyb21QREZDb29yZGluYXRlcyhwb2ludHMsIHJlY3QsIHJvdGF0aW9uKSB7XG4gICAgY29uc3QgW2JsWCwgYmxZLCB0clgsIHRyWV0gPSByZWN0O1xuICAgIHN3aXRjaCAocm90YXRpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBwb2ludHNbaV0gLT0gYmxYO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gPSB0clkgLSBwb2ludHNbaSArIDFdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBjb25zdCB4ID0gcG9pbnRzW2ldO1xuICAgICAgICAgIHBvaW50c1tpXSA9IHBvaW50c1tpICsgMV0gLSBibFk7XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSA9IHggLSBibFg7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBwb2ludHNbaV0gPSB0clggLSBwb2ludHNbaV07XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSAtPSBibFk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBjb25zdCB4ID0gcG9pbnRzW2ldO1xuICAgICAgICAgIHBvaW50c1tpXSA9IHRyWSAtIHBvaW50c1tpICsgMV07XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSA9IHRyWCAtIHg7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG4gICNzZXJpYWxpemVQYXRocyhzLCB0eCwgdHksIHJlY3QpIHtcbiAgICBjb25zdCBwYXRocyA9IFtdO1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLnRoaWNrbmVzcyAvIDI7XG4gICAgY29uc3Qgc2hpZnRYID0gcyAqIHR4ICsgcGFkZGluZztcbiAgICBjb25zdCBzaGlmdFkgPSBzICogdHkgKyBwYWRkaW5nO1xuICAgIGZvciAoY29uc3QgYmV6aWVyIG9mIHRoaXMucGF0aHMpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IFtdO1xuICAgICAgY29uc3QgcG9pbnRzID0gW107XG4gICAgICBmb3IgKGxldCBqID0gMCwgamogPSBiZXppZXIubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIGNvbnRyb2wxLCBjb250cm9sMiwgc2Vjb25kXSA9IGJlemllcltqXTtcbiAgICAgICAgaWYgKGZpcnN0WzBdID09PSBzZWNvbmRbMF0gJiYgZmlyc3RbMV0gPT09IHNlY29uZFsxXSAmJiBqaiA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IHAwID0gcyAqIGZpcnN0WzBdICsgc2hpZnRYO1xuICAgICAgICAgIGNvbnN0IHAxID0gcyAqIGZpcnN0WzFdICsgc2hpZnRZO1xuICAgICAgICAgIGJ1ZmZlci5wdXNoKHAwLCBwMSk7XG4gICAgICAgICAgcG9pbnRzLnB1c2gocDAsIHAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwMTAgPSBzICogZmlyc3RbMF0gKyBzaGlmdFg7XG4gICAgICAgIGNvbnN0IHAxMSA9IHMgKiBmaXJzdFsxXSArIHNoaWZ0WTtcbiAgICAgICAgY29uc3QgcDIwID0gcyAqIGNvbnRyb2wxWzBdICsgc2hpZnRYO1xuICAgICAgICBjb25zdCBwMjEgPSBzICogY29udHJvbDFbMV0gKyBzaGlmdFk7XG4gICAgICAgIGNvbnN0IHAzMCA9IHMgKiBjb250cm9sMlswXSArIHNoaWZ0WDtcbiAgICAgICAgY29uc3QgcDMxID0gcyAqIGNvbnRyb2wyWzFdICsgc2hpZnRZO1xuICAgICAgICBjb25zdCBwNDAgPSBzICogc2Vjb25kWzBdICsgc2hpZnRYO1xuICAgICAgICBjb25zdCBwNDEgPSBzICogc2Vjb25kWzFdICsgc2hpZnRZO1xuICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgIGJ1ZmZlci5wdXNoKHAxMCwgcDExKTtcbiAgICAgICAgICBwb2ludHMucHVzaChwMTAsIHAxMSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLnB1c2gocDIwLCBwMjEsIHAzMCwgcDMxLCBwNDAsIHA0MSk7XG4gICAgICAgIHBvaW50cy5wdXNoKHAyMCwgcDIxKTtcbiAgICAgICAgaWYgKGogPT09IGpqIC0gMSkge1xuICAgICAgICAgIHBvaW50cy5wdXNoKHA0MCwgcDQxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGF0aHMucHVzaCh7XG4gICAgICAgIGJlemllcjogSW5rRWRpdG9yLiN0b1BERkNvb3JkaW5hdGVzKGJ1ZmZlciwgcmVjdCwgdGhpcy5yb3RhdGlvbiksXG4gICAgICAgIHBvaW50czogSW5rRWRpdG9yLiN0b1BERkNvb3JkaW5hdGVzKHBvaW50cywgcmVjdCwgdGhpcy5yb3RhdGlvbilcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cbiAgI2dldEJib3goKSB7XG4gICAgbGV0IHhNaW4gPSBJbmZpbml0eTtcbiAgICBsZXQgeE1heCA9IC1JbmZpbml0eTtcbiAgICBsZXQgeU1pbiA9IEluZmluaXR5O1xuICAgIGxldCB5TWF4ID0gLUluZmluaXR5O1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLnBhdGhzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtmaXJzdCwgY29udHJvbDEsIGNvbnRyb2wyLCBzZWNvbmRdIG9mIHBhdGgpIHtcbiAgICAgICAgY29uc3QgYmJveCA9IFV0aWwuYmV6aWVyQm91bmRpbmdCb3goLi4uZmlyc3QsIC4uLmNvbnRyb2wxLCAuLi5jb250cm9sMiwgLi4uc2Vjb25kKTtcbiAgICAgICAgeE1pbiA9IE1hdGgubWluKHhNaW4sIGJib3hbMF0pO1xuICAgICAgICB5TWluID0gTWF0aC5taW4oeU1pbiwgYmJveFsxXSk7XG4gICAgICAgIHhNYXggPSBNYXRoLm1heCh4TWF4LCBiYm94WzJdKTtcbiAgICAgICAgeU1heCA9IE1hdGgubWF4KHlNYXgsIGJib3hbM10pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3hNaW4sIHlNaW4sIHhNYXgsIHlNYXhdO1xuICB9XG4gICNnZXRQYWRkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNkaXNhYmxlRWRpdGluZyA/IE1hdGguY2VpbCh0aGlzLnRoaWNrbmVzcyAqIHRoaXMucGFyZW50U2NhbGUpIDogMDtcbiAgfVxuICAjZml0VG9Db250ZW50KGZpcnN0VGltZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jZGlzYWJsZUVkaXRpbmcpIHtcbiAgICAgIHRoaXMuI3JlZHJhdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBiYm94ID0gdGhpcy4jZ2V0QmJveCgpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLiNnZXRQYWRkaW5nKCk7XG4gICAgdGhpcy4jYmFzZVdpZHRoID0gTWF0aC5tYXgoQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgYmJveFsyXSAtIGJib3hbMF0pO1xuICAgIHRoaXMuI2Jhc2VIZWlnaHQgPSBNYXRoLm1heChBbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFLCBiYm94WzNdIC0gYmJveFsxXSk7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLmNlaWwocGFkZGluZyArIHRoaXMuI2Jhc2VXaWR0aCAqIHRoaXMuc2NhbGVGYWN0b3IpO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGguY2VpbChwYWRkaW5nICsgdGhpcy4jYmFzZUhlaWdodCAqIHRoaXMuc2NhbGVGYWN0b3IpO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLndpZHRoID0gd2lkdGggLyBwYXJlbnRXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAvIHBhcmVudEhlaWdodDtcbiAgICB0aGlzLnNldEFzcGVjdFJhdGlvKHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnN0IHByZXZUcmFuc2xhdGlvblggPSB0aGlzLnRyYW5zbGF0aW9uWDtcbiAgICBjb25zdCBwcmV2VHJhbnNsYXRpb25ZID0gdGhpcy50cmFuc2xhdGlvblk7XG4gICAgdGhpcy50cmFuc2xhdGlvblggPSAtYmJveFswXTtcbiAgICB0aGlzLnRyYW5zbGF0aW9uWSA9IC1iYm94WzFdO1xuICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcbiAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICB0aGlzLiNyZWFsV2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLiNyZWFsSGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuc2V0RGltcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCB1bnNjYWxlZFBhZGRpbmcgPSBmaXJzdFRpbWUgPyBwYWRkaW5nIC8gdGhpcy5zY2FsZUZhY3RvciAvIDIgOiAwO1xuICAgIHRoaXMudHJhbnNsYXRlKHByZXZUcmFuc2xhdGlvblggLSB0aGlzLnRyYW5zbGF0aW9uWCAtIHVuc2NhbGVkUGFkZGluZywgcHJldlRyYW5zbGF0aW9uWSAtIHRoaXMudHJhbnNsYXRpb25ZIC0gdW5zY2FsZWRQYWRkaW5nKTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIElua0Fubm90YXRpb25FbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZWRpdG9yID0gc3VwZXIuZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpO1xuICAgIGVkaXRvci50aGlja25lc3MgPSBkYXRhLnRoaWNrbmVzcztcbiAgICBlZGl0b3IuY29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5kYXRhLmNvbG9yKTtcbiAgICBlZGl0b3Iub3BhY2l0eSA9IGRhdGEub3BhY2l0eTtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IGVkaXRvci5wYWdlRGltZW5zaW9ucztcbiAgICBjb25zdCB3aWR0aCA9IGVkaXRvci53aWR0aCAqIHBhZ2VXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBlZGl0b3IuaGVpZ2h0ICogcGFnZUhlaWdodDtcbiAgICBjb25zdCBzY2FsZUZhY3RvciA9IGVkaXRvci5wYXJlbnRTY2FsZTtcbiAgICBjb25zdCBwYWRkaW5nID0gZGF0YS50aGlja25lc3MgLyAyO1xuICAgIGVkaXRvci4jZGlzYWJsZUVkaXRpbmcgPSB0cnVlO1xuICAgIGVkaXRvci4jcmVhbFdpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCk7XG4gICAgZWRpdG9yLiNyZWFsSGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuICAgIGNvbnN0IHtcbiAgICAgIHBhdGhzLFxuICAgICAgcmVjdCxcbiAgICAgIHJvdGF0aW9uXG4gICAgfSA9IGRhdGE7XG4gICAgZm9yIChsZXQge1xuICAgICAgYmV6aWVyXG4gICAgfSBvZiBwYXRocykge1xuICAgICAgYmV6aWVyID0gSW5rRWRpdG9yLiNmcm9tUERGQ29vcmRpbmF0ZXMoYmV6aWVyLCByZWN0LCByb3RhdGlvbik7XG4gICAgICBjb25zdCBwYXRoID0gW107XG4gICAgICBlZGl0b3IucGF0aHMucHVzaChwYXRoKTtcbiAgICAgIGxldCBwMCA9IHNjYWxlRmFjdG9yICogKGJlemllclswXSAtIHBhZGRpbmcpO1xuICAgICAgbGV0IHAxID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyWzFdIC0gcGFkZGluZyk7XG4gICAgICBmb3IgKGxldCBpID0gMiwgaWkgPSBiZXppZXIubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNikge1xuICAgICAgICBjb25zdCBwMTAgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaV0gLSBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgcDExID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2kgKyAxXSAtIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCBwMjAgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaSArIDJdIC0gcGFkZGluZyk7XG4gICAgICAgIGNvbnN0IHAyMSA9IHNjYWxlRmFjdG9yICogKGJlemllcltpICsgM10gLSBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgcDMwID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2kgKyA0XSAtIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCBwMzEgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaSArIDVdIC0gcGFkZGluZyk7XG4gICAgICAgIHBhdGgucHVzaChbW3AwLCBwMV0sIFtwMTAsIHAxMV0sIFtwMjAsIHAyMV0sIFtwMzAsIHAzMV1dKTtcbiAgICAgICAgcDAgPSBwMzA7XG4gICAgICAgIHAxID0gcDMxO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF0aDJEID0gdGhpcy4jYnVpbGRQYXRoMkQocGF0aCk7XG4gICAgICBlZGl0b3IuYmV6aWVyUGF0aDJELnB1c2gocGF0aDJEKTtcbiAgICB9XG4gICAgY29uc3QgYmJveCA9IGVkaXRvci4jZ2V0QmJveCgpO1xuICAgIGVkaXRvci4jYmFzZVdpZHRoID0gTWF0aC5tYXgoQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgYmJveFsyXSAtIGJib3hbMF0pO1xuICAgIGVkaXRvci4jYmFzZUhlaWdodCA9IE1hdGgubWF4KEFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUsIGJib3hbM10gLSBiYm94WzFdKTtcbiAgICBlZGl0b3IuI3NldFNjYWxlRmFjdG9yKHdpZHRoLCBoZWlnaHQpO1xuICAgIHJldHVybiBlZGl0b3I7XG4gIH1cbiAgc2VyaWFsaXplKCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdldFJlY3QoMCwgMCk7XG4gICAgY29uc3QgY29sb3IgPSBBbm5vdGF0aW9uRWRpdG9yLl9jb2xvck1hbmFnZXIuY29udmVydCh0aGlzLmN0eC5zdHJva2VTdHlsZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFubm90YXRpb25UeXBlOiBBbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkssXG4gICAgICBjb2xvcixcbiAgICAgIHRoaWNrbmVzczogdGhpcy50aGlja25lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLm9wYWNpdHksXG4gICAgICBwYXRoczogdGhpcy4jc2VyaWFsaXplUGF0aHModGhpcy5zY2FsZUZhY3RvciAvIHRoaXMucGFyZW50U2NhbGUsIHRoaXMudHJhbnNsYXRpb25YLCB0aGlzLnRyYW5zbGF0aW9uWSwgcmVjdCksXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcmVjdCxcbiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuICAgICAgc3RydWN0VHJlZVBhcmVudElkOiB0aGlzLl9zdHJ1Y3RUcmVlUGFyZW50SWRcbiAgICB9O1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9zdGFtcC5qc1xuXG5cblxuXG5jbGFzcyBTdGFtcEVkaXRvciBleHRlbmRzIEFubm90YXRpb25FZGl0b3Ige1xuICAjYml0bWFwID0gbnVsbDtcbiAgI2JpdG1hcElkID0gbnVsbDtcbiAgI2JpdG1hcFByb21pc2UgPSBudWxsO1xuICAjYml0bWFwVXJsID0gbnVsbDtcbiAgI2JpdG1hcEZpbGUgPSBudWxsO1xuICAjYml0bWFwRmlsZU5hbWUgPSBcIlwiO1xuICAjY2FudmFzID0gbnVsbDtcbiAgI29ic2VydmVyID0gbnVsbDtcbiAgI3Jlc2l6ZVRpbWVvdXRJZCA9IG51bGw7XG4gICNpc1N2ZyA9IGZhbHNlO1xuICAjaGFzQmVlbkFkZGVkSW5VbmRvU3RhY2sgPSBmYWxzZTtcbiAgc3RhdGljIF90eXBlID0gXCJzdGFtcFwiO1xuICBzdGF0aWMgX2VkaXRvclR5cGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUDtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgbmFtZTogXCJzdGFtcEVkaXRvclwiXG4gICAgfSk7XG4gICAgdGhpcy4jYml0bWFwVXJsID0gcGFyYW1zLmJpdG1hcFVybDtcbiAgICB0aGlzLiNiaXRtYXBGaWxlID0gcGFyYW1zLmJpdG1hcEZpbGU7XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyKSB7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5pbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcik7XG4gIH1cbiAgc3RhdGljIGdldCBzdXBwb3J0ZWRUeXBlcygpIHtcbiAgICBjb25zdCB0eXBlcyA9IFtcImFwbmdcIiwgXCJhdmlmXCIsIFwiYm1wXCIsIFwiZ2lmXCIsIFwianBlZ1wiLCBcInBuZ1wiLCBcInN2Zyt4bWxcIiwgXCJ3ZWJwXCIsIFwieC1pY29uXCJdO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJzdXBwb3J0ZWRUeXBlc1wiLCB0eXBlcy5tYXAodHlwZSA9PiBgaW1hZ2UvJHt0eXBlfWApKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHN1cHBvcnRlZFR5cGVzU3RyKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJzdXBwb3J0ZWRUeXBlc1N0clwiLCB0aGlzLnN1cHBvcnRlZFR5cGVzLmpvaW4oXCIsXCIpKTtcbiAgfVxuICBzdGF0aWMgaXNIYW5kbGluZ01pbWVGb3JQYXN0aW5nKG1pbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zdXBwb3J0ZWRUeXBlcy5pbmNsdWRlcyhtaW1lKTtcbiAgfVxuICBzdGF0aWMgcGFzdGUoaXRlbSwgcGFyZW50KSB7XG4gICAgcGFyZW50LnBhc3RlRWRpdG9yKEFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QLCB7XG4gICAgICBiaXRtYXBGaWxlOiBpdGVtLmdldEFzRmlsZSgpXG4gICAgfSk7XG4gIH1cbiAgI2dldEJpdG1hcEZldGNoZWQoZGF0YSwgZnJvbUlkID0gZmFsc2UpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2JpdG1hcCA9IGRhdGEuYml0bWFwO1xuICAgIGlmICghZnJvbUlkKSB7XG4gICAgICB0aGlzLiNiaXRtYXBJZCA9IGRhdGEuaWQ7XG4gICAgICB0aGlzLiNpc1N2ZyA9IGRhdGEuaXNTdmc7XG4gICAgfVxuICAgIGlmIChkYXRhLmZpbGUpIHtcbiAgICAgIHRoaXMuI2JpdG1hcEZpbGVOYW1lID0gZGF0YS5maWxlLm5hbWU7XG4gICAgfVxuICAgIHRoaXMuI2NyZWF0ZUNhbnZhcygpO1xuICB9XG4gICNnZXRCaXRtYXBEb25lKCkge1xuICAgIHRoaXMuI2JpdG1hcFByb21pc2UgPSBudWxsO1xuICAgIHRoaXMuX3VpTWFuYWdlci5lbmFibGVXYWl0aW5nKGZhbHNlKTtcbiAgICBpZiAodGhpcy4jY2FudmFzKSB7XG4gICAgICB0aGlzLmRpdi5mb2N1cygpO1xuICAgIH1cbiAgfVxuICAjZ2V0Qml0bWFwKCkge1xuICAgIGlmICh0aGlzLiNiaXRtYXBJZCkge1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmVuYWJsZVdhaXRpbmcodHJ1ZSk7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmdldEZyb21JZCh0aGlzLiNiaXRtYXBJZCkudGhlbihkYXRhID0+IHRoaXMuI2dldEJpdG1hcEZldGNoZWQoZGF0YSwgdHJ1ZSkpLmZpbmFsbHkoKCkgPT4gdGhpcy4jZ2V0Qml0bWFwRG9uZSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2JpdG1hcFVybCkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy4jYml0bWFwVXJsO1xuICAgICAgdGhpcy4jYml0bWFwVXJsID0gbnVsbDtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5lbmFibGVXYWl0aW5nKHRydWUpO1xuICAgICAgdGhpcy4jYml0bWFwUHJvbWlzZSA9IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0RnJvbVVybCh1cmwpLnRoZW4oZGF0YSA9PiB0aGlzLiNnZXRCaXRtYXBGZXRjaGVkKGRhdGEpKS5maW5hbGx5KCgpID0+IHRoaXMuI2dldEJpdG1hcERvbmUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiNiaXRtYXBGaWxlKSB7XG4gICAgICBjb25zdCBmaWxlID0gdGhpcy4jYml0bWFwRmlsZTtcbiAgICAgIHRoaXMuI2JpdG1hcEZpbGUgPSBudWxsO1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmVuYWJsZVdhaXRpbmcodHJ1ZSk7XG4gICAgICB0aGlzLiNiaXRtYXBQcm9taXNlID0gdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tRmlsZShmaWxlKS50aGVuKGRhdGEgPT4gdGhpcy4jZ2V0Qml0bWFwRmV0Y2hlZChkYXRhKSkuZmluYWxseSgoKSA9PiB0aGlzLiNnZXRCaXRtYXBEb25lKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC50eXBlID0gXCJmaWxlXCI7XG4gICAgaW5wdXQuYWNjZXB0ID0gU3RhbXBFZGl0b3Iuc3VwcG9ydGVkVHlwZXNTdHI7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgdGhpcy4jYml0bWFwUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghaW5wdXQuZmlsZXMgfHwgaW5wdXQuZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl91aU1hbmFnZXIuZW5hYmxlV2FpdGluZyh0cnVlKTtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tRmlsZShpbnB1dC5maWxlc1swXSk7XG4gICAgICAgICAgdGhpcy4jZ2V0Qml0bWFwRmV0Y2hlZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCB7XG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiY2FuY2VsXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4gdGhpcy4jZ2V0Qml0bWFwRG9uZSgpKTtcbiAgICBpbnB1dC5jbGljaygpO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICBpZiAodGhpcy4jYml0bWFwSWQpIHtcbiAgICAgIHRoaXMuI2JpdG1hcCA9IG51bGw7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmRlbGV0ZUlkKHRoaXMuI2JpdG1hcElkKTtcbiAgICAgIHRoaXMuI2NhbnZhcz8ucmVtb3ZlKCk7XG4gICAgICB0aGlzLiNjYW52YXMgPSBudWxsO1xuICAgICAgdGhpcy4jb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuI29ic2VydmVyID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLiNyZXNpemVUaW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCk7XG4gICAgICAgIHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLnJlbW92ZSgpO1xuICB9XG4gIHJlYnVpbGQoKSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgaWYgKHRoaXMuI2JpdG1hcElkKSB7XG4gICAgICAgIHRoaXMuI2dldEJpdG1hcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgaWYgKHRoaXMuZGl2ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiNiaXRtYXBJZCAmJiB0aGlzLiNjYW52YXMgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuI2dldEJpdG1hcCgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG4gICAgfVxuICB9XG4gIG9uY2VBZGRlZCgpIHtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IHRydWU7XG4gICAgdGhpcy5kaXYuZm9jdXMoKTtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhKHRoaXMuI2JpdG1hcFByb21pc2UgfHwgdGhpcy4jYml0bWFwIHx8IHRoaXMuI2JpdG1hcFVybCB8fCB0aGlzLiNiaXRtYXBGaWxlIHx8IHRoaXMuI2JpdG1hcElkKTtcbiAgfVxuICBnZXQgaXNSZXNpemFibGUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLmRpdikge1xuICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgIH1cbiAgICBsZXQgYmFzZVgsIGJhc2VZO1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICBiYXNlWCA9IHRoaXMueDtcbiAgICAgIGJhc2VZID0gdGhpcy55O1xuICAgIH1cbiAgICBzdXBlci5yZW5kZXIoKTtcbiAgICB0aGlzLmRpdi5oaWRkZW4gPSB0cnVlO1xuICAgIHRoaXMuYWRkQWx0VGV4dEJ1dHRvbigpO1xuICAgIGlmICh0aGlzLiNiaXRtYXApIHtcbiAgICAgIHRoaXMuI2NyZWF0ZUNhbnZhcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNnZXRCaXRtYXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgIHRoaXMuc2V0QXQoYmFzZVggKiBwYXJlbnRXaWR0aCwgYmFzZVkgKiBwYXJlbnRIZWlnaHQsIHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaXY7XG4gIH1cbiAgI2NyZWF0ZUNhbnZhcygpIHtcbiAgICBjb25zdCB7XG4gICAgICBkaXZcbiAgICB9ID0gdGhpcztcbiAgICBsZXQge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gdGhpcy4jYml0bWFwO1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICBjb25zdCBNQVhfUkFUSU8gPSAwLjc1O1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICB3aWR0aCA9IHRoaXMud2lkdGggKiBwYWdlV2lkdGg7XG4gICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodCAqIHBhZ2VIZWlnaHQ7XG4gICAgfSBlbHNlIGlmICh3aWR0aCA+IE1BWF9SQVRJTyAqIHBhZ2VXaWR0aCB8fCBoZWlnaHQgPiBNQVhfUkFUSU8gKiBwYWdlSGVpZ2h0KSB7XG4gICAgICBjb25zdCBmYWN0b3IgPSBNYXRoLm1pbihNQVhfUkFUSU8gKiBwYWdlV2lkdGggLyB3aWR0aCwgTUFYX1JBVElPICogcGFnZUhlaWdodCAvIGhlaWdodCk7XG4gICAgICB3aWR0aCAqPSBmYWN0b3I7XG4gICAgICBoZWlnaHQgKj0gZmFjdG9yO1xuICAgIH1cbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy5zZXREaW1zKHdpZHRoICogcGFyZW50V2lkdGggLyBwYWdlV2lkdGgsIGhlaWdodCAqIHBhcmVudEhlaWdodCAvIHBhZ2VIZWlnaHQpO1xuICAgIHRoaXMuX3VpTWFuYWdlci5lbmFibGVXYWl0aW5nKGZhbHNlKTtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLiNjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGRpdi5hcHBlbmQoY2FudmFzKTtcbiAgICBkaXYuaGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy4jZHJhd0JpdG1hcCh3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLiNjcmVhdGVPYnNlcnZlcigpO1xuICAgIGlmICghdGhpcy4jaGFzQmVlbkFkZGVkSW5VbmRvU3RhY2spIHtcbiAgICAgIHRoaXMucGFyZW50LmFkZFVuZG9hYmxlRWRpdG9yKHRoaXMpO1xuICAgICAgdGhpcy4jaGFzQmVlbkFkZGVkSW5VbmRvU3RhY2sgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9yZXBvcnRUZWxlbWV0cnkoe1xuICAgICAgYWN0aW9uOiBcImluc2VydGVkX2ltYWdlXCJcbiAgICB9KTtcbiAgICBpZiAodGhpcy4jYml0bWFwRmlsZU5hbWUpIHtcbiAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHRoaXMuI2JpdG1hcEZpbGVOYW1lKTtcbiAgICB9XG4gIH1cbiAgI3NldERpbWVuc2lvbnMod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLndpZHRoID0gd2lkdGggLyBwYXJlbnRXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAvIHBhcmVudEhlaWdodDtcbiAgICB0aGlzLnNldERpbXMod2lkdGgsIGhlaWdodCk7XG4gICAgaWYgKHRoaXMuX2luaXRpYWxPcHRpb25zPy5pc0NlbnRlcmVkKSB7XG4gICAgICB0aGlzLmNlbnRlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxPcHRpb25zID0gbnVsbDtcbiAgICBpZiAodGhpcy4jcmVzaXplVGltZW91dElkICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jcmVzaXplVGltZW91dElkKTtcbiAgICB9XG4gICAgY29uc3QgVElNRV9UT19XQUlUID0gMjAwO1xuICAgIHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy4jcmVzaXplVGltZW91dElkID0gbnVsbDtcbiAgICAgIHRoaXMuI2RyYXdCaXRtYXAod2lkdGgsIGhlaWdodCk7XG4gICAgfSwgVElNRV9UT19XQUlUKTtcbiAgfVxuICAjc2NhbGVCaXRtYXAod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoOiBiaXRtYXBXaWR0aCxcbiAgICAgIGhlaWdodDogYml0bWFwSGVpZ2h0XG4gICAgfSA9IHRoaXMuI2JpdG1hcDtcbiAgICBsZXQgbmV3V2lkdGggPSBiaXRtYXBXaWR0aDtcbiAgICBsZXQgbmV3SGVpZ2h0ID0gYml0bWFwSGVpZ2h0O1xuICAgIGxldCBiaXRtYXAgPSB0aGlzLiNiaXRtYXA7XG4gICAgd2hpbGUgKG5ld1dpZHRoID4gMiAqIHdpZHRoIHx8IG5ld0hlaWdodCA+IDIgKiBoZWlnaHQpIHtcbiAgICAgIGNvbnN0IHByZXZXaWR0aCA9IG5ld1dpZHRoO1xuICAgICAgY29uc3QgcHJldkhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgIGlmIChuZXdXaWR0aCA+IDIgKiB3aWR0aCkge1xuICAgICAgICBuZXdXaWR0aCA9IG5ld1dpZHRoID49IDE2Mzg0ID8gTWF0aC5mbG9vcihuZXdXaWR0aCAvIDIpIC0gMSA6IE1hdGguY2VpbChuZXdXaWR0aCAvIDIpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld0hlaWdodCA+IDIgKiBoZWlnaHQpIHtcbiAgICAgICAgbmV3SGVpZ2h0ID0gbmV3SGVpZ2h0ID49IDE2Mzg0ID8gTWF0aC5mbG9vcihuZXdIZWlnaHQgLyAyKSAtIDEgOiBNYXRoLmNlaWwobmV3SGVpZ2h0IC8gMik7XG4gICAgICB9XG4gICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgY29uc3QgY3R4ID0gb2Zmc2NyZWVuLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwLCBwcmV2V2lkdGgsIHByZXZIZWlnaHQsIDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgYml0bWFwID0gb2Zmc2NyZWVuLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO1xuICAgIH1cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG4gICNkcmF3Qml0bWFwKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB3aWR0aCA9IE1hdGguY2VpbCh3aWR0aCk7XG4gICAgaGVpZ2h0ID0gTWF0aC5jZWlsKGhlaWdodCk7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy4jY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8IGNhbnZhcy53aWR0aCA9PT0gd2lkdGggJiYgY2FudmFzLmhlaWdodCA9PT0gaGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgYml0bWFwID0gdGhpcy4jaXNTdmcgPyB0aGlzLiNiaXRtYXAgOiB0aGlzLiNzY2FsZUJpdG1hcCh3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAodGhpcy5fdWlNYW5hZ2VyLmhhc01MTWFuYWdlciAmJiAhdGhpcy5oYXNBbHRUZXh0KCkpIHtcbiAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBjdHggPSBvZmZzY3JlZW4uZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIGJpdG1hcC53aWR0aCwgYml0bWFwLmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLl91aU1hbmFnZXIubWxHdWVzcyh7XG4gICAgICAgIHNlcnZpY2U6IFwiaW1hZ2UtdG8tdGV4dFwiLFxuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgZGF0YTogY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhLFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBjaGFubmVsczogNFxuICAgICAgICB9XG4gICAgICB9KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgY29uc3QgYWx0VGV4dCA9IHJlc3BvbnNlPy5vdXRwdXQgfHwgXCJcIjtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIGFsdFRleHQgJiYgIXRoaXMuaGFzQWx0VGV4dCgpKSB7XG4gICAgICAgICAgdGhpcy5hbHRUZXh0RGF0YSA9IHtcbiAgICAgICAgICAgIGFsdFRleHQsXG4gICAgICAgICAgICBkZWNvcmF0aXZlOiBmYWxzZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGN0eC5maWx0ZXIgPSB0aGlzLl91aU1hbmFnZXIuaGNtRmlsdGVyO1xuICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwLCBiaXRtYXAud2lkdGgsIGJpdG1hcC5oZWlnaHQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICB9XG4gIGdldEltYWdlRm9yQWx0VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY2FudmFzO1xuICB9XG4gICNzZXJpYWxpemVCaXRtYXAodG9VcmwpIHtcbiAgICBpZiAodG9VcmwpIHtcbiAgICAgIGlmICh0aGlzLiNpc1N2Zykge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmdldFN2Z1VybCh0aGlzLiNiaXRtYXBJZCk7XG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgKHtcbiAgICAgICAgd2lkdGg6IGNhbnZhcy53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjYW52YXMuaGVpZ2h0XG4gICAgICB9ID0gdGhpcy4jYml0bWFwKTtcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjdHguZHJhd0ltYWdlKHRoaXMuI2JpdG1hcCwgMCwgMCk7XG4gICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jaXNTdmcpIHtcbiAgICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLndpZHRoICogcGFnZVdpZHRoICogUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgucm91bmQodGhpcy5oZWlnaHQgKiBwYWdlSGVpZ2h0ICogUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTKTtcbiAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBjdHggPSBvZmZzY3JlZW4uZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY3R4LmRyYXdJbWFnZSh0aGlzLiNiaXRtYXAsIDAsIDAsIHRoaXMuI2JpdG1hcC53aWR0aCwgdGhpcy4jYml0bWFwLmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICByZXR1cm4gb2Zmc2NyZWVuLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHRoaXMuI2JpdG1hcCk7XG4gIH1cbiAgI2NyZWF0ZU9ic2VydmVyKCkge1xuICAgIGlmICghdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gZW50cmllc1swXS5jb250ZW50UmVjdDtcbiAgICAgIGlmIChyZWN0LndpZHRoICYmIHJlY3QuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuI3NldERpbWVuc2lvbnMocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuI29ic2VydmVyLm9ic2VydmUodGhpcy5kaXYpO1xuICAgIHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiB7XG4gICAgICB0aGlzLiNvYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy4jb2JzZXJ2ZXIgPSBudWxsO1xuICAgIH0sIHtcbiAgICAgIG9uY2U6IHRydWVcbiAgICB9KTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBlZGl0b3IgPSBzdXBlci5kZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcik7XG4gICAgY29uc3Qge1xuICAgICAgcmVjdCxcbiAgICAgIGJpdG1hcFVybCxcbiAgICAgIGJpdG1hcElkLFxuICAgICAgaXNTdmcsXG4gICAgICBhY2Nlc3NpYmlsaXR5RGF0YVxuICAgIH0gPSBkYXRhO1xuICAgIGlmIChiaXRtYXBJZCAmJiB1aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmlzVmFsaWRJZChiaXRtYXBJZCkpIHtcbiAgICAgIGVkaXRvci4jYml0bWFwSWQgPSBiaXRtYXBJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdG9yLiNiaXRtYXBVcmwgPSBiaXRtYXBVcmw7XG4gICAgfVxuICAgIGVkaXRvci4jaXNTdmcgPSBpc1N2ZztcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSBlZGl0b3IucGFnZURpbWVuc2lvbnM7XG4gICAgZWRpdG9yLndpZHRoID0gKHJlY3RbMl0gLSByZWN0WzBdKSAvIHBhcmVudFdpZHRoO1xuICAgIGVkaXRvci5oZWlnaHQgPSAocmVjdFszXSAtIHJlY3RbMV0pIC8gcGFyZW50SGVpZ2h0O1xuICAgIGlmIChhY2Nlc3NpYmlsaXR5RGF0YSkge1xuICAgICAgZWRpdG9yLmFsdFRleHREYXRhID0gYWNjZXNzaWJpbGl0eURhdGE7XG4gICAgfVxuICAgIHJldHVybiBlZGl0b3I7XG4gIH1cbiAgc2VyaWFsaXplKGlzRm9yQ29weWluZyA9IGZhbHNlLCBjb250ZXh0ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB7XG4gICAgICBhbm5vdGF0aW9uVHlwZTogQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVAsXG4gICAgICBiaXRtYXBJZDogdGhpcy4jYml0bWFwSWQsXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcmVjdDogdGhpcy5nZXRSZWN0KDAsIDApLFxuICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sXG4gICAgICBpc1N2ZzogdGhpcy4jaXNTdmcsXG4gICAgICBzdHJ1Y3RUcmVlUGFyZW50SWQ6IHRoaXMuX3N0cnVjdFRyZWVQYXJlbnRJZFxuICAgIH07XG4gICAgaWYgKGlzRm9yQ29weWluZykge1xuICAgICAgc2VyaWFsaXplZC5iaXRtYXBVcmwgPSB0aGlzLiNzZXJpYWxpemVCaXRtYXAodHJ1ZSk7XG4gICAgICBzZXJpYWxpemVkLmFjY2Vzc2liaWxpdHlEYXRhID0gdGhpcy5hbHRUZXh0RGF0YTtcbiAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBkZWNvcmF0aXZlLFxuICAgICAgYWx0VGV4dFxuICAgIH0gPSB0aGlzLmFsdFRleHREYXRhO1xuICAgIGlmICghZGVjb3JhdGl2ZSAmJiBhbHRUZXh0KSB7XG4gICAgICBzZXJpYWxpemVkLmFjY2Vzc2liaWxpdHlEYXRhID0ge1xuICAgICAgICB0eXBlOiBcIkZpZ3VyZVwiLFxuICAgICAgICBhbHQ6IGFsdFRleHRcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChjb250ZXh0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG4gICAgY29udGV4dC5zdGFtcHMgfHw9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBhcmVhID0gdGhpcy4jaXNTdmcgPyAoc2VyaWFsaXplZC5yZWN0WzJdIC0gc2VyaWFsaXplZC5yZWN0WzBdKSAqIChzZXJpYWxpemVkLnJlY3RbM10gLSBzZXJpYWxpemVkLnJlY3RbMV0pIDogbnVsbDtcbiAgICBpZiAoIWNvbnRleHQuc3RhbXBzLmhhcyh0aGlzLiNiaXRtYXBJZCkpIHtcbiAgICAgIGNvbnRleHQuc3RhbXBzLnNldCh0aGlzLiNiaXRtYXBJZCwge1xuICAgICAgICBhcmVhLFxuICAgICAgICBzZXJpYWxpemVkXG4gICAgICB9KTtcbiAgICAgIHNlcmlhbGl6ZWQuYml0bWFwID0gdGhpcy4jc2VyaWFsaXplQml0bWFwKGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2lzU3ZnKSB7XG4gICAgICBjb25zdCBwcmV2RGF0YSA9IGNvbnRleHQuc3RhbXBzLmdldCh0aGlzLiNiaXRtYXBJZCk7XG4gICAgICBpZiAoYXJlYSA+IHByZXZEYXRhLmFyZWEpIHtcbiAgICAgICAgcHJldkRhdGEuYXJlYSA9IGFyZWE7XG4gICAgICAgIHByZXZEYXRhLnNlcmlhbGl6ZWQuYml0bWFwLmNsb3NlKCk7XG4gICAgICAgIHByZXZEYXRhLnNlcmlhbGl6ZWQuYml0bWFwID0gdGhpcy4jc2VyaWFsaXplQml0bWFwKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2Fubm90YXRpb25fZWRpdG9yX2xheWVyLmpzXG5cblxuXG5cblxuXG5cbmNsYXNzIEFubm90YXRpb25FZGl0b3JMYXllciB7XG4gICNhY2Nlc3NpYmlsaXR5TWFuYWdlcjtcbiAgI2FsbG93Q2xpY2sgPSBmYWxzZTtcbiAgI2Fubm90YXRpb25MYXllciA9IG51bGw7XG4gICNib3VuZFBvaW50ZXJ1cCA9IG51bGw7XG4gICNib3VuZFBvaW50ZXJkb3duID0gbnVsbDtcbiAgI2JvdW5kVGV4dExheWVyUG9pbnRlckRvd24gPSBudWxsO1xuICAjZWRpdG9yRm9jdXNUaW1lb3V0SWQgPSBudWxsO1xuICAjZWRpdG9ycyA9IG5ldyBNYXAoKTtcbiAgI2hhZFBvaW50ZXJEb3duID0gZmFsc2U7XG4gICNpc0NsZWFuaW5nVXAgPSBmYWxzZTtcbiAgI2lzRGlzYWJsaW5nID0gZmFsc2U7XG4gICN0ZXh0TGF5ZXIgPSBudWxsO1xuICAjdWlNYW5hZ2VyO1xuICBzdGF0aWMgX2luaXRpYWxpemVkID0gZmFsc2U7XG4gIHN0YXRpYyAjZWRpdG9yVHlwZXMgPSBuZXcgTWFwKFtGcmVlVGV4dEVkaXRvciwgSW5rRWRpdG9yLCBTdGFtcEVkaXRvciwgSGlnaGxpZ2h0RWRpdG9yXS5tYXAodHlwZSA9PiBbdHlwZS5fZWRpdG9yVHlwZSwgdHlwZV0pKTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHVpTWFuYWdlcixcbiAgICBwYWdlSW5kZXgsXG4gICAgZGl2LFxuICAgIGFjY2Vzc2liaWxpdHlNYW5hZ2VyLFxuICAgIGFubm90YXRpb25MYXllcixcbiAgICBkcmF3TGF5ZXIsXG4gICAgdGV4dExheWVyLFxuICAgIHZpZXdwb3J0LFxuICAgIGwxMG5cbiAgfSkge1xuICAgIGNvbnN0IGVkaXRvclR5cGVzID0gWy4uLkFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMudmFsdWVzKCldO1xuICAgIGlmICghQW5ub3RhdGlvbkVkaXRvckxheWVyLl9pbml0aWFsaXplZCkge1xuICAgICAgQW5ub3RhdGlvbkVkaXRvckxheWVyLl9pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgZWRpdG9yVHlwZXMpIHtcbiAgICAgICAgZWRpdG9yVHlwZS5pbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcik7XG4gICAgICB9XG4gICAgfVxuICAgIHVpTWFuYWdlci5yZWdpc3RlckVkaXRvclR5cGVzKGVkaXRvclR5cGVzKTtcbiAgICB0aGlzLiN1aU1hbmFnZXIgPSB1aU1hbmFnZXI7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgdGhpcy5kaXYgPSBkaXY7XG4gICAgdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBhY2Nlc3NpYmlsaXR5TWFuYWdlcjtcbiAgICB0aGlzLiNhbm5vdGF0aW9uTGF5ZXIgPSBhbm5vdGF0aW9uTGF5ZXI7XG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIHRoaXMuI3RleHRMYXllciA9IHRleHRMYXllcjtcbiAgICB0aGlzLmRyYXdMYXllciA9IGRyYXdMYXllcjtcbiAgICB0aGlzLiN1aU1hbmFnZXIuYWRkTGF5ZXIodGhpcyk7XG4gIH1cbiAgZ2V0IGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2VkaXRvcnMuc2l6ZSA9PT0gMDtcbiAgfVxuICBnZXQgaXNJbnZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNFbXB0eSAmJiB0aGlzLiN1aU1hbmFnZXIuZ2V0TW9kZSgpID09PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FO1xuICB9XG4gIHVwZGF0ZVRvb2xiYXIobW9kZSkge1xuICAgIHRoaXMuI3VpTWFuYWdlci51cGRhdGVUb29sYmFyKG1vZGUpO1xuICB9XG4gIHVwZGF0ZU1vZGUobW9kZSA9IHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkpIHtcbiAgICB0aGlzLiNjbGVhbnVwKCk7XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkU6XG4gICAgICAgIHRoaXMuZGlzYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy50b2dnbGVQb2ludGVyRXZlbnRzKGZhbHNlKTtcbiAgICAgICAgdGhpcy50b2dnbGVBbm5vdGF0aW9uTGF5ZXJQb2ludGVyRXZlbnRzKHRydWUpO1xuICAgICAgICB0aGlzLmRpc2FibGVDbGljaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLklOSzpcbiAgICAgICAgdGhpcy5hZGRJbmtFZGl0b3JJZk5lZWRlZChmYWxzZSk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy50b2dnbGVQb2ludGVyRXZlbnRzKHRydWUpO1xuICAgICAgICB0aGlzLmRpc2FibGVDbGljaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUOlxuICAgICAgICB0aGlzLmVuYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy50b2dnbGVQb2ludGVyRXZlbnRzKGZhbHNlKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlQ2xpY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmRpc2FibGVUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlUG9pbnRlckV2ZW50cyh0cnVlKTtcbiAgICAgICAgdGhpcy5lbmFibGVDbGljaygpO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZUFubm90YXRpb25MYXllclBvaW50ZXJFdmVudHMoZmFsc2UpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzTGlzdFxuICAgIH0gPSB0aGlzLmRpdjtcbiAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgQW5ub3RhdGlvbkVkaXRvckxheWVyLiNlZGl0b3JUeXBlcy52YWx1ZXMoKSkge1xuICAgICAgY2xhc3NMaXN0LnRvZ2dsZShgJHtlZGl0b3JUeXBlLl90eXBlfUVkaXRpbmdgLCBtb2RlID09PSBlZGl0b3JUeXBlLl9lZGl0b3JUeXBlKTtcbiAgICB9XG4gICAgdGhpcy5kaXYuaGlkZGVuID0gZmFsc2U7XG4gIH1cbiAgaGFzVGV4dExheWVyKHRleHRMYXllcikge1xuICAgIHJldHVybiB0ZXh0TGF5ZXIgPT09IHRoaXMuI3RleHRMYXllcj8uZGl2O1xuICB9XG4gIGFkZElua0VkaXRvcklmTmVlZGVkKGlzQ29tbWl0dGluZykge1xuICAgIGlmICh0aGlzLiN1aU1hbmFnZXIuZ2V0TW9kZSgpICE9PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc0NvbW1pdHRpbmcpIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKGVkaXRvci5pc0VtcHR5KCkpIHtcbiAgICAgICAgICBlZGl0b3Iuc2V0SW5CYWNrZ3JvdW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuY3JlYXRlQW5kQWRkTmV3RWRpdG9yKHtcbiAgICAgIG9mZnNldFg6IDAsXG4gICAgICBvZmZzZXRZOiAwXG4gICAgfSwgZmFsc2UpO1xuICAgIGVkaXRvci5zZXRJbkJhY2tncm91bmQoKTtcbiAgfVxuICBzZXRFZGl0aW5nU3RhdGUoaXNFZGl0aW5nKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnNldEVkaXRpbmdTdGF0ZShpc0VkaXRpbmcpO1xuICB9XG4gIGFkZENvbW1hbmRzKHBhcmFtcykge1xuICAgIHRoaXMuI3VpTWFuYWdlci5hZGRDb21tYW5kcyhwYXJhbXMpO1xuICB9XG4gIHRvZ2dsZVBvaW50ZXJFdmVudHMoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImRpc2FibGVkXCIsICFlbmFibGVkKTtcbiAgfVxuICB0b2dnbGVBbm5vdGF0aW9uTGF5ZXJQb2ludGVyRXZlbnRzKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHRoaXMuI2Fubm90YXRpb25MYXllcj8uZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJkaXNhYmxlZFwiLCAhZW5hYmxlZCk7XG4gIH1cbiAgZW5hYmxlKCkge1xuICAgIHRoaXMuZGl2LnRhYkluZGV4ID0gMDtcbiAgICB0aGlzLnRvZ2dsZVBvaW50ZXJFdmVudHModHJ1ZSk7XG4gICAgY29uc3QgYW5ub3RhdGlvbkVsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgZWRpdG9yLmVuYWJsZUVkaXRpbmcoKTtcbiAgICAgIGVkaXRvci5zaG93KHRydWUpO1xuICAgICAgaWYgKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgICAgIHRoaXMuI3VpTWFuYWdlci5yZW1vdmVDaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9uKGVkaXRvcik7XG4gICAgICAgIGFubm90YXRpb25FbGVtZW50SWRzLmFkZChlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy4jYW5ub3RhdGlvbkxheWVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVkaXRhYmxlcyA9IHRoaXMuI2Fubm90YXRpb25MYXllci5nZXRFZGl0YWJsZUFubm90YXRpb25zKCk7XG4gICAgZm9yIChjb25zdCBlZGl0YWJsZSBvZiBlZGl0YWJsZXMpIHtcbiAgICAgIGVkaXRhYmxlLmhpZGUoKTtcbiAgICAgIGlmICh0aGlzLiN1aU1hbmFnZXIuaXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZWRpdGFibGUuZGF0YS5pZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYW5ub3RhdGlvbkVsZW1lbnRJZHMuaGFzKGVkaXRhYmxlLmRhdGEuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5kZXNlcmlhbGl6ZShlZGl0YWJsZSk7XG4gICAgICBpZiAoIWVkaXRvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkT3JSZWJ1aWxkKGVkaXRvcik7XG4gICAgICBlZGl0b3IuZW5hYmxlRWRpdGluZygpO1xuICAgIH1cbiAgfVxuICBkaXNhYmxlKCkge1xuICAgIHRoaXMuI2lzRGlzYWJsaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRpdi50YWJJbmRleCA9IC0xO1xuICAgIHRoaXMudG9nZ2xlUG9pbnRlckV2ZW50cyhmYWxzZSk7XG4gICAgY29uc3QgY2hhbmdlZEFubm90YXRpb25zID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IHJlc2V0QW5ub3RhdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgZWRpdG9yLmRpc2FibGVFZGl0aW5nKCk7XG4gICAgICBpZiAoIWVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVkaXRvci5zZXJpYWxpemUoKSAhPT0gbnVsbCkge1xuICAgICAgICBjaGFuZ2VkQW5ub3RhdGlvbnMuc2V0KGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkLCBlZGl0b3IpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0QW5ub3RhdGlvbnMuc2V0KGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkLCBlZGl0b3IpO1xuICAgICAgfVxuICAgICAgdGhpcy5nZXRFZGl0YWJsZUFubm90YXRpb24oZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpPy5zaG93KCk7XG4gICAgICBlZGl0b3IucmVtb3ZlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNhbm5vdGF0aW9uTGF5ZXIpIHtcbiAgICAgIGNvbnN0IGVkaXRhYmxlcyA9IHRoaXMuI2Fubm90YXRpb25MYXllci5nZXRFZGl0YWJsZUFubm90YXRpb25zKCk7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRhYmxlIG9mIGVkaXRhYmxlcykge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSA9IGVkaXRhYmxlLmRhdGE7XG4gICAgICAgIGlmICh0aGlzLiN1aU1hbmFnZXIuaXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoaWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVkaXRvciA9IHJlc2V0QW5ub3RhdGlvbnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGVkaXRvcikge1xuICAgICAgICAgIGVkaXRvci5yZXNldEFubm90YXRpb25FbGVtZW50KGVkaXRhYmxlKTtcbiAgICAgICAgICBlZGl0b3Iuc2hvdyhmYWxzZSk7XG4gICAgICAgICAgZWRpdGFibGUuc2hvdygpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvciA9IGNoYW5nZWRBbm5vdGF0aW9ucy5nZXQoaWQpO1xuICAgICAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgICAgdGhpcy4jdWlNYW5hZ2VyLmFkZENoYW5nZWRFeGlzdGluZ0Fubm90YXRpb24oZWRpdG9yKTtcbiAgICAgICAgICBlZGl0b3IucmVuZGVyQW5ub3RhdGlvbkVsZW1lbnQoZWRpdGFibGUpO1xuICAgICAgICAgIGVkaXRvci5zaG93KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlZGl0YWJsZS5zaG93KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI2NsZWFudXAoKTtcbiAgICBpZiAodGhpcy5pc0VtcHR5KSB7XG4gICAgICB0aGlzLmRpdi5oaWRkZW4gPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjbGFzc0xpc3RcbiAgICB9ID0gdGhpcy5kaXY7XG4gICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIEFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMudmFsdWVzKCkpIHtcbiAgICAgIGNsYXNzTGlzdC5yZW1vdmUoYCR7ZWRpdG9yVHlwZS5fdHlwZX1FZGl0aW5nYCk7XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnRvZ2dsZUFubm90YXRpb25MYXllclBvaW50ZXJFdmVudHModHJ1ZSk7XG4gICAgdGhpcy4jaXNEaXNhYmxpbmcgPSBmYWxzZTtcbiAgfVxuICBnZXRFZGl0YWJsZUFubm90YXRpb24oaWQpIHtcbiAgICByZXR1cm4gdGhpcy4jYW5ub3RhdGlvbkxheWVyPy5nZXRFZGl0YWJsZUFubm90YXRpb24oaWQpIHx8IG51bGw7XG4gIH1cbiAgc2V0QWN0aXZlRWRpdG9yKGVkaXRvcikge1xuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmUgPSB0aGlzLiN1aU1hbmFnZXIuZ2V0QWN0aXZlKCk7XG4gICAgaWYgKGN1cnJlbnRBY3RpdmUgPT09IGVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiN1aU1hbmFnZXIuc2V0QWN0aXZlRWRpdG9yKGVkaXRvcik7XG4gIH1cbiAgZW5hYmxlVGV4dFNlbGVjdGlvbigpIHtcbiAgICB0aGlzLmRpdi50YWJJbmRleCA9IC0xO1xuICAgIGlmICh0aGlzLiN0ZXh0TGF5ZXI/LmRpdiAmJiAhdGhpcy4jYm91bmRUZXh0TGF5ZXJQb2ludGVyRG93bikge1xuICAgICAgdGhpcy4jYm91bmRUZXh0TGF5ZXJQb2ludGVyRG93biA9IHRoaXMuI3RleHRMYXllclBvaW50ZXJEb3duLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLiN0ZXh0TGF5ZXIuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZFRleHRMYXllclBvaW50ZXJEb3duLCB7XG4gICAgICAgIHNpZ25hbDogdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWxcbiAgICAgIH0pO1xuICAgICAgdGhpcy4jdGV4dExheWVyLmRpdi5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0aW5nXCIpO1xuICAgIH1cbiAgfVxuICBkaXNhYmxlVGV4dFNlbGVjdGlvbigpIHtcbiAgICB0aGlzLmRpdi50YWJJbmRleCA9IDA7XG4gICAgaWYgKHRoaXMuI3RleHRMYXllcj8uZGl2ICYmIHRoaXMuI2JvdW5kVGV4dExheWVyUG9pbnRlckRvd24pIHtcbiAgICAgIHRoaXMuI3RleHRMYXllci5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kVGV4dExheWVyUG9pbnRlckRvd24pO1xuICAgICAgdGhpcy4jYm91bmRUZXh0TGF5ZXJQb2ludGVyRG93biA9IG51bGw7XG4gICAgICB0aGlzLiN0ZXh0TGF5ZXIuZGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJoaWdobGlnaHRpbmdcIik7XG4gICAgfVxuICB9XG4gICN0ZXh0TGF5ZXJQb2ludGVyRG93bihldmVudCkge1xuICAgIHRoaXMuI3VpTWFuYWdlci51bnNlbGVjdEFsbCgpO1xuICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuI3RleHRMYXllci5kaXYpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaXNNYWNcbiAgICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5jdHJsS2V5ICYmIGlzTWFjKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3VpTWFuYWdlci5zaG93QWxsRWRpdG9ycyhcImhpZ2hsaWdodFwiLCB0cnVlLCB0cnVlKTtcbiAgICAgIHRoaXMuI3RleHRMYXllci5kaXYuY2xhc3NMaXN0LmFkZChcImZyZWVcIik7XG4gICAgICBIaWdobGlnaHRFZGl0b3Iuc3RhcnRIaWdobGlnaHRpbmcodGhpcywgdGhpcy4jdWlNYW5hZ2VyLmRpcmVjdGlvbiA9PT0gXCJsdHJcIiwgZXZlbnQpO1xuICAgICAgdGhpcy4jdGV4dExheWVyLmRpdi5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy4jdGV4dExheWVyLmRpdi5jbGFzc0xpc3QucmVtb3ZlKFwiZnJlZVwiKTtcbiAgICAgIH0sIHtcbiAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgc2lnbmFsOiB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbFxuICAgICAgfSk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuICBlbmFibGVDbGljaygpIHtcbiAgICBpZiAodGhpcy4jYm91bmRQb2ludGVyZG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbDtcbiAgICB0aGlzLiNib3VuZFBvaW50ZXJkb3duID0gdGhpcy5wb2ludGVyZG93bi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuI2JvdW5kUG9pbnRlcnVwID0gdGhpcy5wb2ludGVydXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRQb2ludGVyZG93biwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZFBvaW50ZXJ1cCwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgZGlzYWJsZUNsaWNrKCkge1xuICAgIGlmICghdGhpcy4jYm91bmRQb2ludGVyZG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRQb2ludGVyZG93bik7XG4gICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZFBvaW50ZXJ1cCk7XG4gICAgdGhpcy4jYm91bmRQb2ludGVyZG93biA9IG51bGw7XG4gICAgdGhpcy4jYm91bmRQb2ludGVydXAgPSBudWxsO1xuICB9XG4gIGF0dGFjaChlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3JzLnNldChlZGl0b3IuaWQsIGVkaXRvcik7XG4gICAgY29uc3Qge1xuICAgICAgYW5ub3RhdGlvbkVsZW1lbnRJZFxuICAgIH0gPSBlZGl0b3I7XG4gICAgaWYgKGFubm90YXRpb25FbGVtZW50SWQgJiYgdGhpcy4jdWlNYW5hZ2VyLmlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGFubm90YXRpb25FbGVtZW50SWQpKSB7XG4gICAgICB0aGlzLiN1aU1hbmFnZXIucmVtb3ZlRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRvcik7XG4gICAgfVxuICB9XG4gIGRldGFjaChlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3JzLmRlbGV0ZShlZGl0b3IuaWQpO1xuICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlNYW5hZ2VyPy5yZW1vdmVQb2ludGVySW5UZXh0TGF5ZXIoZWRpdG9yLmNvbnRlbnREaXYpO1xuICAgIGlmICghdGhpcy4jaXNEaXNhYmxpbmcgJiYgZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci5hZGREZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlKGVkaXRvcikge1xuICAgIHRoaXMuZGV0YWNoKGVkaXRvcik7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnJlbW92ZUVkaXRvcihlZGl0b3IpO1xuICAgIGVkaXRvci5kaXYucmVtb3ZlKCk7XG4gICAgZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSA9IGZhbHNlO1xuICAgIGlmICghdGhpcy4jaXNDbGVhbmluZ1VwKSB7XG4gICAgICB0aGlzLmFkZElua0VkaXRvcklmTmVlZGVkKGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgY2hhbmdlUGFyZW50KGVkaXRvcikge1xuICAgIGlmIChlZGl0b3IucGFyZW50ID09PSB0aGlzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlZGl0b3IucGFyZW50ICYmIGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgICB0aGlzLiN1aU1hbmFnZXIuYWRkRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgIEFubm90YXRpb25FZGl0b3IuZGVsZXRlQW5ub3RhdGlvbkVsZW1lbnQoZWRpdG9yKTtcbiAgICAgIGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5hdHRhY2goZWRpdG9yKTtcbiAgICBlZGl0b3IucGFyZW50Py5kZXRhY2goZWRpdG9yKTtcbiAgICBlZGl0b3Iuc2V0UGFyZW50KHRoaXMpO1xuICAgIGlmIChlZGl0b3IuZGl2ICYmIGVkaXRvci5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIGVkaXRvci5kaXYucmVtb3ZlKCk7XG4gICAgICB0aGlzLmRpdi5hcHBlbmQoZWRpdG9yLmRpdik7XG4gICAgfVxuICB9XG4gIGFkZChlZGl0b3IpIHtcbiAgICBpZiAoZWRpdG9yLnBhcmVudCA9PT0gdGhpcyAmJiBlZGl0b3IuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlUGFyZW50KGVkaXRvcik7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLmFkZEVkaXRvcihlZGl0b3IpO1xuICAgIHRoaXMuYXR0YWNoKGVkaXRvcik7XG4gICAgaWYgKCFlZGl0b3IuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICBjb25zdCBkaXYgPSBlZGl0b3IucmVuZGVyKCk7XG4gICAgICB0aGlzLmRpdi5hcHBlbmQoZGl2KTtcbiAgICAgIGVkaXRvci5pc0F0dGFjaGVkVG9ET00gPSB0cnVlO1xuICAgIH1cbiAgICBlZGl0b3IuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICBlZGl0b3Iub25jZUFkZGVkKCk7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoZWRpdG9yKTtcbiAgICBlZGl0b3IuX3JlcG9ydFRlbGVtZXRyeShlZGl0b3IudGVsZW1ldHJ5SW5pdGlhbERhdGEpO1xuICB9XG4gIG1vdmVFZGl0b3JJbkRPTShlZGl0b3IpIHtcbiAgICBpZiAoIWVkaXRvci5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYWN0aXZlRWxlbWVudFxuICAgIH0gPSBkb2N1bWVudDtcbiAgICBpZiAoZWRpdG9yLmRpdi5jb250YWlucyhhY3RpdmVFbGVtZW50KSAmJiAhdGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQpIHtcbiAgICAgIGVkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gZmFsc2U7XG4gICAgICB0aGlzLiNlZGl0b3JGb2N1c1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLiNlZGl0b3JGb2N1c1RpbWVvdXRJZCA9IG51bGw7XG4gICAgICAgIGlmICghZWRpdG9yLmRpdi5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgIGVkaXRvci5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgKCkgPT4ge1xuICAgICAgICAgICAgZWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSB0cnVlO1xuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgICAgICBzaWduYWw6IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfVxuICAgIGVkaXRvci5fc3RydWN0VHJlZVBhcmVudElkID0gdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXI/Lm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsIGVkaXRvci5kaXYsIGVkaXRvci5jb250ZW50RGl2LCB0cnVlKTtcbiAgfVxuICBhZGRPclJlYnVpbGQoZWRpdG9yKSB7XG4gICAgaWYgKGVkaXRvci5uZWVkc1RvQmVSZWJ1aWx0KCkpIHtcbiAgICAgIGVkaXRvci5wYXJlbnQgfHw9IHRoaXM7XG4gICAgICBlZGl0b3IucmVidWlsZCgpO1xuICAgICAgZWRpdG9yLnNob3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGQoZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgYWRkVW5kb2FibGVFZGl0b3IoZWRpdG9yKSB7XG4gICAgY29uc3QgY21kID0gKCkgPT4gZWRpdG9yLl91aU1hbmFnZXIucmVidWlsZChlZGl0b3IpO1xuICAgIGNvbnN0IHVuZG8gPSAoKSA9PiB7XG4gICAgICBlZGl0b3IucmVtb3ZlKCk7XG4gICAgfTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZCxcbiAgICAgIHVuZG8sXG4gICAgICBtdXN0RXhlYzogZmFsc2VcbiAgICB9KTtcbiAgfVxuICBnZXROZXh0SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3VpTWFuYWdlci5nZXRJZCgpO1xuICB9XG4gIGdldCAjY3VycmVudEVkaXRvclR5cGUoKSB7XG4gICAgcmV0dXJuIEFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMuZ2V0KHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkpO1xuICB9XG4gIGdldCBfc2lnbmFsKCkge1xuICAgIHJldHVybiB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbDtcbiAgfVxuICAjY3JlYXRlTmV3RWRpdG9yKHBhcmFtcykge1xuICAgIGNvbnN0IGVkaXRvclR5cGUgPSB0aGlzLiNjdXJyZW50RWRpdG9yVHlwZTtcbiAgICByZXR1cm4gZWRpdG9yVHlwZSA/IG5ldyBlZGl0b3JUeXBlLnByb3RvdHlwZS5jb25zdHJ1Y3RvcihwYXJhbXMpIDogbnVsbDtcbiAgfVxuICBjYW5DcmVhdGVOZXdFbXB0eUVkaXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudEVkaXRvclR5cGU/LmNhbkNyZWF0ZU5ld0VtcHR5RWRpdG9yKCk7XG4gIH1cbiAgcGFzdGVFZGl0b3IobW9kZSwgcGFyYW1zKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnVwZGF0ZVRvb2xiYXIobW9kZSk7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnVwZGF0ZU1vZGUobW9kZSk7XG4gICAgY29uc3Qge1xuICAgICAgb2Zmc2V0WCxcbiAgICAgIG9mZnNldFlcbiAgICB9ID0gdGhpcy4jZ2V0Q2VudGVyUG9pbnQoKTtcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0TmV4dElkKCk7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy4jY3JlYXRlTmV3RWRpdG9yKHtcbiAgICAgIHBhcmVudDogdGhpcyxcbiAgICAgIGlkLFxuICAgICAgeDogb2Zmc2V0WCxcbiAgICAgIHk6IG9mZnNldFksXG4gICAgICB1aU1hbmFnZXI6IHRoaXMuI3VpTWFuYWdlcixcbiAgICAgIGlzQ2VudGVyZWQ6IHRydWUsXG4gICAgICAuLi5wYXJhbXNcbiAgICB9KTtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICB0aGlzLmFkZChlZGl0b3IpO1xuICAgIH1cbiAgfVxuICBkZXNlcmlhbGl6ZShkYXRhKSB7XG4gICAgcmV0dXJuIEFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMuZ2V0KGRhdGEuYW5ub3RhdGlvblR5cGUgPz8gZGF0YS5hbm5vdGF0aW9uRWRpdG9yVHlwZSk/LmRlc2VyaWFsaXplKGRhdGEsIHRoaXMsIHRoaXMuI3VpTWFuYWdlcikgfHwgbnVsbDtcbiAgfVxuICBjcmVhdGVBbmRBZGROZXdFZGl0b3IoZXZlbnQsIGlzQ2VudGVyZWQsIGRhdGEgPSB7fSkge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXROZXh0SWQoKTtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLiNjcmVhdGVOZXdFZGl0b3Ioe1xuICAgICAgcGFyZW50OiB0aGlzLFxuICAgICAgaWQsXG4gICAgICB4OiBldmVudC5vZmZzZXRYLFxuICAgICAgeTogZXZlbnQub2Zmc2V0WSxcbiAgICAgIHVpTWFuYWdlcjogdGhpcy4jdWlNYW5hZ2VyLFxuICAgICAgaXNDZW50ZXJlZCxcbiAgICAgIC4uLmRhdGFcbiAgICB9KTtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICB0aGlzLmFkZChlZGl0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gZWRpdG9yO1xuICB9XG4gICNnZXRDZW50ZXJQb2ludCgpIHtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IHRoaXMuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRsWCA9IE1hdGgubWF4KDAsIHgpO1xuICAgIGNvbnN0IHRsWSA9IE1hdGgubWF4KDAsIHkpO1xuICAgIGNvbnN0IGJyWCA9IE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoLCB4ICsgd2lkdGgpO1xuICAgIGNvbnN0IGJyWSA9IE1hdGgubWluKHdpbmRvdy5pbm5lckhlaWdodCwgeSArIGhlaWdodCk7XG4gICAgY29uc3QgY2VudGVyWCA9ICh0bFggKyBiclgpIC8gMiAtIHg7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0bFkgKyBiclkpIC8gMiAtIHk7XG4gICAgY29uc3QgW29mZnNldFgsIG9mZnNldFldID0gdGhpcy52aWV3cG9ydC5yb3RhdGlvbiAlIDE4MCA9PT0gMCA/IFtjZW50ZXJYLCBjZW50ZXJZXSA6IFtjZW50ZXJZLCBjZW50ZXJYXTtcbiAgICByZXR1cm4ge1xuICAgICAgb2Zmc2V0WCxcbiAgICAgIG9mZnNldFlcbiAgICB9O1xuICB9XG4gIGFkZE5ld0VkaXRvcigpIHtcbiAgICB0aGlzLmNyZWF0ZUFuZEFkZE5ld0VkaXRvcih0aGlzLiNnZXRDZW50ZXJQb2ludCgpLCB0cnVlKTtcbiAgfVxuICBzZXRTZWxlY3RlZChlZGl0b3IpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIuc2V0U2VsZWN0ZWQoZWRpdG9yKTtcbiAgfVxuICB0b2dnbGVTZWxlY3RlZChlZGl0b3IpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIudG9nZ2xlU2VsZWN0ZWQoZWRpdG9yKTtcbiAgfVxuICBpc1NlbGVjdGVkKGVkaXRvcikge1xuICAgIHJldHVybiB0aGlzLiN1aU1hbmFnZXIuaXNTZWxlY3RlZChlZGl0b3IpO1xuICB9XG4gIHVuc2VsZWN0KGVkaXRvcikge1xuICAgIHRoaXMuI3VpTWFuYWdlci51bnNlbGVjdChlZGl0b3IpO1xuICB9XG4gIHBvaW50ZXJ1cChldmVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTWFjXG4gICAgfSA9IHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5jdHJsS2V5ICYmIGlzTWFjKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuZGl2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jaGFkUG9pbnRlckRvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaGFkUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuI2FsbG93Q2xpY2spIHtcbiAgICAgIHRoaXMuI2FsbG93Q2xpY2sgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmdldE1vZGUoKSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVApIHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci51bnNlbGVjdEFsbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZUFuZEFkZE5ld0VkaXRvcihldmVudCwgZmFsc2UpO1xuICB9XG4gIHBvaW50ZXJkb3duKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVCkge1xuICAgICAgdGhpcy5lbmFibGVUZXh0U2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNoYWRQb2ludGVyRG93bikge1xuICAgICAgdGhpcy4jaGFkUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gdXRpbF9GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8IGV2ZW50LmN0cmxLZXkgJiYgaXNNYWMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kaXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaGFkUG9pbnRlckRvd24gPSB0cnVlO1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuI3VpTWFuYWdlci5nZXRBY3RpdmUoKTtcbiAgICB0aGlzLiNhbGxvd0NsaWNrID0gIWVkaXRvciB8fCBlZGl0b3IuaXNFbXB0eSgpO1xuICB9XG4gIGZpbmROZXdQYXJlbnQoZWRpdG9yLCB4LCB5KSB7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLiN1aU1hbmFnZXIuZmluZFBhcmVudCh4LCB5KTtcbiAgICBpZiAobGF5ZXIgPT09IG51bGwgfHwgbGF5ZXIgPT09IHRoaXMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGF5ZXIuY2hhbmdlUGFyZW50KGVkaXRvcik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmdldEFjdGl2ZSgpPy5wYXJlbnQgPT09IHRoaXMpIHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci5jb21taXRPclJlbW92ZSgpO1xuICAgICAgdGhpcy4jdWlNYW5hZ2VyLnNldEFjdGl2ZUVkaXRvcihudWxsKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2VkaXRvckZvY3VzVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQpO1xuICAgICAgdGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQgPSBudWxsO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlcj8ucmVtb3ZlUG9pbnRlckluVGV4dExheWVyKGVkaXRvci5jb250ZW50RGl2KTtcbiAgICAgIGVkaXRvci5zZXRQYXJlbnQobnVsbCk7XG4gICAgICBlZGl0b3IuaXNBdHRhY2hlZFRvRE9NID0gZmFsc2U7XG4gICAgICBlZGl0b3IuZGl2LnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLmRpdiA9IG51bGw7XG4gICAgdGhpcy4jZWRpdG9ycy5jbGVhcigpO1xuICAgIHRoaXMuI3VpTWFuYWdlci5yZW1vdmVMYXllcih0aGlzKTtcbiAgfVxuICAjY2xlYW51cCgpIHtcbiAgICB0aGlzLiNpc0NsZWFuaW5nVXAgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChlZGl0b3IuaXNFbXB0eSgpKSB7XG4gICAgICAgIGVkaXRvci5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jaXNDbGVhbmluZ1VwID0gZmFsc2U7XG4gIH1cbiAgcmVuZGVyKHtcbiAgICB2aWV3cG9ydFxuICB9KSB7XG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIHNldExheWVyRGltZW5zaW9ucyh0aGlzLmRpdiwgdmlld3BvcnQpO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3VpTWFuYWdlci5nZXRFZGl0b3JzKHRoaXMucGFnZUluZGV4KSkge1xuICAgICAgdGhpcy5hZGQoZWRpdG9yKTtcbiAgICAgIGVkaXRvci5yZWJ1aWxkKCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlTW9kZSgpO1xuICB9XG4gIHVwZGF0ZSh7XG4gICAgdmlld3BvcnRcbiAgfSkge1xuICAgIHRoaXMuI3VpTWFuYWdlci5jb21taXRPclJlbW92ZSgpO1xuICAgIHRoaXMuI2NsZWFudXAoKTtcbiAgICBjb25zdCBvbGRSb3RhdGlvbiA9IHRoaXMudmlld3BvcnQucm90YXRpb247XG4gICAgY29uc3Qgcm90YXRpb24gPSB2aWV3cG9ydC5yb3RhdGlvbjtcbiAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgc2V0TGF5ZXJEaW1lbnNpb25zKHRoaXMuZGl2LCB7XG4gICAgICByb3RhdGlvblxuICAgIH0pO1xuICAgIGlmIChvbGRSb3RhdGlvbiAhPT0gcm90YXRpb24pIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgICAgZWRpdG9yLnJvdGF0ZShyb3RhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkSW5rRWRpdG9ySWZOZWVkZWQoZmFsc2UpO1xuICB9XG4gIGdldCBwYWdlRGltZW5zaW9ucygpIHtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0XG4gICAgfSA9IHRoaXMudmlld3BvcnQucmF3RGltcztcbiAgICByZXR1cm4gW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF07XG4gIH1cbiAgZ2V0IHNjYWxlKCkge1xuICAgIHJldHVybiB0aGlzLiN1aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucmVhbFNjYWxlO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2RyYXdfbGF5ZXIuanNcblxuXG5jbGFzcyBEcmF3TGF5ZXIge1xuICAjcGFyZW50ID0gbnVsbDtcbiAgI2lkID0gMDtcbiAgI21hcHBpbmcgPSBuZXcgTWFwKCk7XG4gICN0b1VwZGF0ZSA9IG5ldyBNYXAoKTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHBhZ2VJbmRleFxuICB9KSB7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gIH1cbiAgc2V0UGFyZW50KHBhcmVudCkge1xuICAgIGlmICghdGhpcy4jcGFyZW50KSB7XG4gICAgICB0aGlzLiNwYXJlbnQgPSBwYXJlbnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiNwYXJlbnQgIT09IHBhcmVudCkge1xuICAgICAgaWYgKHRoaXMuI21hcHBpbmcuc2l6ZSA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCByb290IG9mIHRoaXMuI21hcHBpbmcudmFsdWVzKCkpIHtcbiAgICAgICAgICByb290LnJlbW92ZSgpO1xuICAgICAgICAgIHBhcmVudC5hcHBlbmQocm9vdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuI3BhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGdldCBfc3ZnRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX3N2Z0ZhY3RvcnlcIiwgbmV3IERPTVNWR0ZhY3RvcnkoKSk7XG4gIH1cbiAgc3RhdGljICNzZXRCb3goZWxlbWVudCwge1xuICAgIHggPSAwLFxuICAgIHkgPSAwLFxuICAgIHdpZHRoID0gMSxcbiAgICBoZWlnaHQgPSAxXG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IGVsZW1lbnQ7XG4gICAgc3R5bGUudG9wID0gYCR7MTAwICogeX0lYDtcbiAgICBzdHlsZS5sZWZ0ID0gYCR7MTAwICogeH0lYDtcbiAgICBzdHlsZS53aWR0aCA9IGAkezEwMCAqIHdpZHRofSVgO1xuICAgIHN0eWxlLmhlaWdodCA9IGAkezEwMCAqIGhlaWdodH0lYDtcbiAgfVxuICAjY3JlYXRlU1ZHKGJveCkge1xuICAgIGNvbnN0IHN2ZyA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGUoMSwgMSwgdHJ1ZSk7XG4gICAgdGhpcy4jcGFyZW50LmFwcGVuZChzdmcpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCB0cnVlKTtcbiAgICBEcmF3TGF5ZXIuI3NldEJveChzdmcsIGJveCk7XG4gICAgcmV0dXJuIHN2ZztcbiAgfVxuICAjY3JlYXRlQ2xpcFBhdGgoZGVmcywgcGF0aElkKSB7XG4gICAgY29uc3QgY2xpcFBhdGggPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIpO1xuICAgIGRlZnMuYXBwZW5kKGNsaXBQYXRoKTtcbiAgICBjb25zdCBjbGlwUGF0aElkID0gYGNsaXBfJHtwYXRoSWR9YDtcbiAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBjbGlwUGF0aElkKTtcbiAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGUoXCJjbGlwUGF0aFVuaXRzXCIsIFwib2JqZWN0Qm91bmRpbmdCb3hcIik7XG4gICAgY29uc3QgY2xpcFBhdGhVc2UgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInVzZVwiKTtcbiAgICBjbGlwUGF0aC5hcHBlbmQoY2xpcFBhdGhVc2UpO1xuICAgIGNsaXBQYXRoVXNlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgYCMke3BhdGhJZH1gKTtcbiAgICBjbGlwUGF0aFVzZS5jbGFzc0xpc3QuYWRkKFwiY2xpcFwiKTtcbiAgICByZXR1cm4gY2xpcFBhdGhJZDtcbiAgfVxuICBoaWdobGlnaHQob3V0bGluZXMsIGNvbG9yLCBvcGFjaXR5LCBpc1BhdGhVcGRhdGFibGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGlkID0gdGhpcy4jaWQrKztcbiAgICBjb25zdCByb290ID0gdGhpcy4jY3JlYXRlU1ZHKG91dGxpbmVzLmJveCk7XG4gICAgcm9vdC5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0XCIpO1xuICAgIGlmIChvdXRsaW5lcy5mcmVlKSB7XG4gICAgICByb290LmNsYXNzTGlzdC5hZGQoXCJmcmVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBkZWZzID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIpO1xuICAgIHJvb3QuYXBwZW5kKGRlZnMpO1xuICAgIGNvbnN0IHBhdGggPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInBhdGhcIik7XG4gICAgZGVmcy5hcHBlbmQocGF0aCk7XG4gICAgY29uc3QgcGF0aElkID0gYHBhdGhfcCR7dGhpcy5wYWdlSW5kZXh9XyR7aWR9YDtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcImlkXCIsIHBhdGhJZCk7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIG91dGxpbmVzLnRvU1ZHUGF0aCgpKTtcbiAgICBpZiAoaXNQYXRoVXBkYXRhYmxlKSB7XG4gICAgICB0aGlzLiN0b1VwZGF0ZS5zZXQoaWQsIHBhdGgpO1xuICAgIH1cbiAgICBjb25zdCBjbGlwUGF0aElkID0gdGhpcy4jY3JlYXRlQ2xpcFBhdGgoZGVmcywgcGF0aElkKTtcbiAgICBjb25zdCB1c2UgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInVzZVwiKTtcbiAgICByb290LmFwcGVuZCh1c2UpO1xuICAgIHJvb3Quc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBjb2xvcik7XG4gICAgcm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgb3BhY2l0eSk7XG4gICAgdXNlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgYCMke3BhdGhJZH1gKTtcbiAgICB0aGlzLiNtYXBwaW5nLnNldChpZCwgcm9vdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkLFxuICAgICAgY2xpcFBhdGhJZDogYHVybCgjJHtjbGlwUGF0aElkfSlgXG4gICAgfTtcbiAgfVxuICBoaWdobGlnaHRPdXRsaW5lKG91dGxpbmVzKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLiNpZCsrO1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLiNjcmVhdGVTVkcob3V0bGluZXMuYm94KTtcbiAgICByb290LmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRPdXRsaW5lXCIpO1xuICAgIGNvbnN0IGRlZnMgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcImRlZnNcIik7XG4gICAgcm9vdC5hcHBlbmQoZGVmcyk7XG4gICAgY29uc3QgcGF0aCA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwicGF0aFwiKTtcbiAgICBkZWZzLmFwcGVuZChwYXRoKTtcbiAgICBjb25zdCBwYXRoSWQgPSBgcGF0aF9wJHt0aGlzLnBhZ2VJbmRleH1fJHtpZH1gO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKFwiaWRcIiwgcGF0aElkKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcImRcIiwgb3V0bGluZXMudG9TVkdQYXRoKCkpO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKFwidmVjdG9yLWVmZmVjdFwiLCBcIm5vbi1zY2FsaW5nLXN0cm9rZVwiKTtcbiAgICBsZXQgbWFza0lkO1xuICAgIGlmIChvdXRsaW5lcy5mcmVlKSB7XG4gICAgICByb290LmNsYXNzTGlzdC5hZGQoXCJmcmVlXCIpO1xuICAgICAgY29uc3QgbWFzayA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwibWFza1wiKTtcbiAgICAgIGRlZnMuYXBwZW5kKG1hc2spO1xuICAgICAgbWFza0lkID0gYG1hc2tfcCR7dGhpcy5wYWdlSW5kZXh9XyR7aWR9YDtcbiAgICAgIG1hc2suc2V0QXR0cmlidXRlKFwiaWRcIiwgbWFza0lkKTtcbiAgICAgIG1hc2suc2V0QXR0cmlidXRlKFwibWFza1VuaXRzXCIsIFwib2JqZWN0Qm91bmRpbmdCb3hcIik7XG4gICAgICBjb25zdCByZWN0ID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIpO1xuICAgICAgbWFzay5hcHBlbmQocmVjdCk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiMVwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIFwiMVwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIndoaXRlXCIpO1xuICAgICAgY29uc3QgdXNlID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJ1c2VcIik7XG4gICAgICBtYXNrLmFwcGVuZCh1c2UpO1xuICAgICAgdXNlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgYCMke3BhdGhJZH1gKTtcbiAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJub25lXCIpO1xuICAgICAgdXNlLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJibGFja1wiKTtcbiAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLXJ1bGVcIiwgXCJub256ZXJvXCIpO1xuICAgICAgdXNlLmNsYXNzTGlzdC5hZGQoXCJtYXNrXCIpO1xuICAgIH1cbiAgICBjb25zdCB1c2UxID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJ1c2VcIik7XG4gICAgcm9vdC5hcHBlbmQodXNlMSk7XG4gICAgdXNlMS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGAjJHtwYXRoSWR9YCk7XG4gICAgaWYgKG1hc2tJZCkge1xuICAgICAgdXNlMS5zZXRBdHRyaWJ1dGUoXCJtYXNrXCIsIGB1cmwoIyR7bWFza0lkfSlgKTtcbiAgICB9XG4gICAgY29uc3QgdXNlMiA9IHVzZTEuY2xvbmVOb2RlKCk7XG4gICAgcm9vdC5hcHBlbmQodXNlMik7XG4gICAgdXNlMS5jbGFzc0xpc3QuYWRkKFwibWFpbk91dGxpbmVcIik7XG4gICAgdXNlMi5jbGFzc0xpc3QuYWRkKFwic2Vjb25kYXJ5T3V0bGluZVwiKTtcbiAgICB0aGlzLiNtYXBwaW5nLnNldChpZCwgcm9vdCk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG4gIGZpbmFsaXplTGluZShpZCwgbGluZSkge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLiN0b1VwZGF0ZS5nZXQoaWQpO1xuICAgIHRoaXMuI3RvVXBkYXRlLmRlbGV0ZShpZCk7XG4gICAgdGhpcy51cGRhdGVCb3goaWQsIGxpbmUuYm94KTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcImRcIiwgbGluZS50b1NWR1BhdGgoKSk7XG4gIH1cbiAgdXBkYXRlTGluZShpZCwgbGluZSkge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLiNtYXBwaW5nLmdldChpZCk7XG4gICAgY29uc3QgZGVmcyA9IHJvb3QuZmlyc3RDaGlsZDtcbiAgICBjb25zdCBwYXRoID0gZGVmcy5maXJzdENoaWxkO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKFwiZFwiLCBsaW5lLnRvU1ZHUGF0aCgpKTtcbiAgfVxuICByZW1vdmVGcmVlSGlnaGxpZ2h0KGlkKSB7XG4gICAgdGhpcy5yZW1vdmUoaWQpO1xuICAgIHRoaXMuI3RvVXBkYXRlLmRlbGV0ZShpZCk7XG4gIH1cbiAgdXBkYXRlUGF0aChpZCwgbGluZSkge1xuICAgIHRoaXMuI3RvVXBkYXRlLmdldChpZCkuc2V0QXR0cmlidXRlKFwiZFwiLCBsaW5lLnRvU1ZHUGF0aCgpKTtcbiAgfVxuICB1cGRhdGVCb3goaWQsIGJveCkge1xuICAgIERyYXdMYXllci4jc2V0Qm94KHRoaXMuI21hcHBpbmcuZ2V0KGlkKSwgYm94KTtcbiAgfVxuICBzaG93KGlkLCB2aXNpYmxlKSB7XG4gICAgdGhpcy4jbWFwcGluZy5nZXQoaWQpLmNsYXNzTGlzdC50b2dnbGUoXCJoaWRkZW5cIiwgIXZpc2libGUpO1xuICB9XG4gIHJvdGF0ZShpZCwgYW5nbGUpIHtcbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsIGFuZ2xlKTtcbiAgfVxuICBjaGFuZ2VDb2xvcihpZCwgY29sb3IpIHtcbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBjb2xvcik7XG4gIH1cbiAgY2hhbmdlT3BhY2l0eShpZCwgb3BhY2l0eSkge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgb3BhY2l0eSk7XG4gIH1cbiAgYWRkQ2xhc3MoaWQsIGNsYXNzTmFtZSkge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH1cbiAgcmVtb3ZlQ2xhc3MoaWQsIGNsYXNzTmFtZSkge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gIH1cbiAgcmVtb3ZlKGlkKSB7XG4gICAgaWYgKHRoaXMuI3BhcmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkucmVtb3ZlKCk7XG4gICAgdGhpcy4jbWFwcGluZy5kZWxldGUoaWQpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4jcGFyZW50ID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy4jbWFwcGluZy52YWx1ZXMoKSkge1xuICAgICAgcm9vdC5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy4jbWFwcGluZy5jbGVhcigpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9wZGYuanNcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHBkZmpzVmVyc2lvbiA9IFwiNC40LjE2OFwiO1xuY29uc3QgcGRmanNCdWlsZCA9IFwiMTlmYmM4OTk4XCI7XG5cbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fQWJvcnRFeGNlcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFib3J0RXhjZXB0aW9uO1xudmFyIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25FZGl0b3JMYXllcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlO1xudmFyIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yVHlwZSA9IF9fd2VicGFja19leHBvcnRzX18uQW5ub3RhdGlvbkVkaXRvclR5cGU7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JVSU1hbmFnZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25MYXllciA9IF9fd2VicGFja19leHBvcnRzX18uQW5ub3RhdGlvbkxheWVyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uTW9kZSA9IF9fd2VicGFja19leHBvcnRzX18uQW5ub3RhdGlvbk1vZGU7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0NNYXBDb21wcmVzc2lvblR5cGUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkNNYXBDb21wcmVzc2lvblR5cGU7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0NvbG9yUGlja2VyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5Db2xvclBpY2tlcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fRE9NU1ZHRmFjdG9yeSA9IF9fd2VicGFja19leHBvcnRzX18uRE9NU1ZHRmFjdG9yeTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fRHJhd0xheWVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5EcmF3TGF5ZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0ZlYXR1cmVUZXN0ID0gX193ZWJwYWNrX2V4cG9ydHNfXy5GZWF0dXJlVGVzdDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fR2xvYmFsV29ya2VyT3B0aW9ucyA9IF9fd2VicGFja19leHBvcnRzX18uR2xvYmFsV29ya2VyT3B0aW9ucztcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fSW1hZ2VLaW5kID0gX193ZWJwYWNrX2V4cG9ydHNfXy5JbWFnZUtpbmQ7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0ludmFsaWRQREZFeGNlcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fLkludmFsaWRQREZFeGNlcHRpb247XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX01pc3NpbmdQREZFeGNlcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fLk1pc3NpbmdQREZFeGNlcHRpb247XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX09QUyA9IF9fd2VicGFja19leHBvcnRzX18uT1BTO1xudmFyIF9fd2VicGFja19leHBvcnRzX19PdXRsaW5lciA9IF9fd2VicGFja19leHBvcnRzX18uT3V0bGluZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1BERkRhdGFSYW5nZVRyYW5zcG9ydCA9IF9fd2VicGFja19leHBvcnRzX18uUERGRGF0YVJhbmdlVHJhbnNwb3J0O1xudmFyIF9fd2VicGFja19leHBvcnRzX19QREZEYXRlU3RyaW5nID0gX193ZWJwYWNrX2V4cG9ydHNfXy5QREZEYXRlU3RyaW5nO1xudmFyIF9fd2VicGFja19leHBvcnRzX19QREZXb3JrZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlBERldvcmtlcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fUGFzc3dvcmRSZXNwb25zZXMgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlBhc3N3b3JkUmVzcG9uc2VzO1xudmFyIF9fd2VicGFja19leHBvcnRzX19QZXJtaXNzaW9uRmxhZyA9IF9fd2VicGFja19leHBvcnRzX18uUGVybWlzc2lvbkZsYWc7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1BpeGVsc1BlckluY2ggPSBfX3dlYnBhY2tfZXhwb3J0c19fLlBpeGVsc1BlckluY2g7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1JlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiA9IF9fd2VicGFja19leHBvcnRzX18uUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uO1xudmFyIF9fd2VicGFja19leHBvcnRzX19UZXh0TGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlRleHRMYXllcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gX193ZWJwYWNrX2V4cG9ydHNfXy5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb247XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1V0aWwgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlV0aWw7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1ZlcmJvc2l0eUxldmVsID0gX193ZWJwYWNrX2V4cG9ydHNfXy5WZXJib3NpdHlMZXZlbDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fWGZhTGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlhmYUxheWVyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19idWlsZCA9IF9fd2VicGFja19leHBvcnRzX18uYnVpbGQ7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2NyZWF0ZVZhbGlkQWJzb2x1dGVVcmwgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmw7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2ZldGNoRGF0YSA9IF9fd2VicGFja19leHBvcnRzX18uZmV0Y2hEYXRhO1xudmFyIF9fd2VicGFja19leHBvcnRzX19nZXREb2N1bWVudCA9IF9fd2VicGFja19leHBvcnRzX18uZ2V0RG9jdW1lbnQ7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2dldEZpbGVuYW1lRnJvbVVybCA9IF9fd2VicGFja19leHBvcnRzX18uZ2V0RmlsZW5hbWVGcm9tVXJsO1xudmFyIF9fd2VicGFja19leHBvcnRzX19nZXRQZGZGaWxlbmFtZUZyb21VcmwgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmdldFBkZkZpbGVuYW1lRnJvbVVybDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0WGZhUGFnZVZpZXdwb3J0ID0gX193ZWJwYWNrX2V4cG9ydHNfXy5nZXRYZmFQYWdlVmlld3BvcnQ7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2lzRGF0YVNjaGVtZSA9IF9fd2VicGFja19leHBvcnRzX18uaXNEYXRhU2NoZW1lO1xudmFyIF9fd2VicGFja19leHBvcnRzX19pc1BkZkZpbGUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmlzUGRmRmlsZTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fbm9Db250ZXh0TWVudSA9IF9fd2VicGFja19leHBvcnRzX18ubm9Db250ZXh0TWVudTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fbm9ybWFsaXplVW5pY29kZSA9IF9fd2VicGFja19leHBvcnRzX18ubm9ybWFsaXplVW5pY29kZTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fcmVuZGVyVGV4dExheWVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5yZW5kZXJUZXh0TGF5ZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX3NldExheWVyRGltZW5zaW9ucyA9IF9fd2VicGFja19leHBvcnRzX18uc2V0TGF5ZXJEaW1lbnNpb25zO1xudmFyIF9fd2VicGFja19leHBvcnRzX19zaGFkb3cgPSBfX3dlYnBhY2tfZXhwb3J0c19fLnNoYWRvdztcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fdXBkYXRlVGV4dExheWVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy51cGRhdGVUZXh0TGF5ZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX3ZlcnNpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fLnZlcnNpb247XG5leHBvcnQgeyBfX3dlYnBhY2tfZXhwb3J0c19fQWJvcnRFeGNlcHRpb24gYXMgQWJvcnRFeGNlcHRpb24sIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIgYXMgQW5ub3RhdGlvbkVkaXRvckxheWVyLCBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgYXMgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUsIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yVHlwZSBhcyBBbm5vdGF0aW9uRWRpdG9yVHlwZSwgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JVSU1hbmFnZXIgYXMgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciwgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25MYXllciBhcyBBbm5vdGF0aW9uTGF5ZXIsIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uTW9kZSBhcyBBbm5vdGF0aW9uTW9kZSwgX193ZWJwYWNrX2V4cG9ydHNfX0NNYXBDb21wcmVzc2lvblR5cGUgYXMgQ01hcENvbXByZXNzaW9uVHlwZSwgX193ZWJwYWNrX2V4cG9ydHNfX0NvbG9yUGlja2VyIGFzIENvbG9yUGlja2VyLCBfX3dlYnBhY2tfZXhwb3J0c19fRE9NU1ZHRmFjdG9yeSBhcyBET01TVkdGYWN0b3J5LCBfX3dlYnBhY2tfZXhwb3J0c19fRHJhd0xheWVyIGFzIERyYXdMYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX0ZlYXR1cmVUZXN0IGFzIEZlYXR1cmVUZXN0LCBfX3dlYnBhY2tfZXhwb3J0c19fR2xvYmFsV29ya2VyT3B0aW9ucyBhcyBHbG9iYWxXb3JrZXJPcHRpb25zLCBfX3dlYnBhY2tfZXhwb3J0c19fSW1hZ2VLaW5kIGFzIEltYWdlS2luZCwgX193ZWJwYWNrX2V4cG9ydHNfX0ludmFsaWRQREZFeGNlcHRpb24gYXMgSW52YWxpZFBERkV4Y2VwdGlvbiwgX193ZWJwYWNrX2V4cG9ydHNfX01pc3NpbmdQREZFeGNlcHRpb24gYXMgTWlzc2luZ1BERkV4Y2VwdGlvbiwgX193ZWJwYWNrX2V4cG9ydHNfX09QUyBhcyBPUFMsIF9fd2VicGFja19leHBvcnRzX19PdXRsaW5lciBhcyBPdXRsaW5lciwgX193ZWJwYWNrX2V4cG9ydHNfX1BERkRhdGFSYW5nZVRyYW5zcG9ydCBhcyBQREZEYXRhUmFuZ2VUcmFuc3BvcnQsIF9fd2VicGFja19leHBvcnRzX19QREZEYXRlU3RyaW5nIGFzIFBERkRhdGVTdHJpbmcsIF9fd2VicGFja19leHBvcnRzX19QREZXb3JrZXIgYXMgUERGV29ya2VyLCBfX3dlYnBhY2tfZXhwb3J0c19fUGFzc3dvcmRSZXNwb25zZXMgYXMgUGFzc3dvcmRSZXNwb25zZXMsIF9fd2VicGFja19leHBvcnRzX19QZXJtaXNzaW9uRmxhZyBhcyBQZXJtaXNzaW9uRmxhZywgX193ZWJwYWNrX2V4cG9ydHNfX1BpeGVsc1BlckluY2ggYXMgUGl4ZWxzUGVySW5jaCwgX193ZWJwYWNrX2V4cG9ydHNfX1JlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiBhcyBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24sIF9fd2VicGFja19leHBvcnRzX19UZXh0TGF5ZXIgYXMgVGV4dExheWVyLCBfX3dlYnBhY2tfZXhwb3J0c19fVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGFzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiwgX193ZWJwYWNrX2V4cG9ydHNfX1V0aWwgYXMgVXRpbCwgX193ZWJwYWNrX2V4cG9ydHNfX1ZlcmJvc2l0eUxldmVsIGFzIFZlcmJvc2l0eUxldmVsLCBfX3dlYnBhY2tfZXhwb3J0c19fWGZhTGF5ZXIgYXMgWGZhTGF5ZXIsIF9fd2VicGFja19leHBvcnRzX19idWlsZCBhcyBidWlsZCwgX193ZWJwYWNrX2V4cG9ydHNfX2NyZWF0ZVZhbGlkQWJzb2x1dGVVcmwgYXMgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCwgX193ZWJwYWNrX2V4cG9ydHNfX2ZldGNoRGF0YSBhcyBmZXRjaERhdGEsIF9fd2VicGFja19leHBvcnRzX19nZXREb2N1bWVudCBhcyBnZXREb2N1bWVudCwgX193ZWJwYWNrX2V4cG9ydHNfX2dldEZpbGVuYW1lRnJvbVVybCBhcyBnZXRGaWxlbmFtZUZyb21VcmwsIF9fd2VicGFja19leHBvcnRzX19nZXRQZGZGaWxlbmFtZUZyb21VcmwgYXMgZ2V0UGRmRmlsZW5hbWVGcm9tVXJsLCBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0WGZhUGFnZVZpZXdwb3J0IGFzIGdldFhmYVBhZ2VWaWV3cG9ydCwgX193ZWJwYWNrX2V4cG9ydHNfX2lzRGF0YVNjaGVtZSBhcyBpc0RhdGFTY2hlbWUsIF9fd2VicGFja19leHBvcnRzX19pc1BkZkZpbGUgYXMgaXNQZGZGaWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fbm9Db250ZXh0TWVudSBhcyBub0NvbnRleHRNZW51LCBfX3dlYnBhY2tfZXhwb3J0c19fbm9ybWFsaXplVW5pY29kZSBhcyBub3JtYWxpemVVbmljb2RlLCBfX3dlYnBhY2tfZXhwb3J0c19fcmVuZGVyVGV4dExheWVyIGFzIHJlbmRlclRleHRMYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX3NldExheWVyRGltZW5zaW9ucyBhcyBzZXRMYXllckRpbWVuc2lvbnMsIF9fd2VicGFja19leHBvcnRzX19zaGFkb3cgYXMgc2hhZG93LCBfX3dlYnBhY2tfZXhwb3J0c19fdXBkYXRlVGV4dExheWVyIGFzIHVwZGF0ZVRleHRMYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX3ZlcnNpb24gYXMgdmVyc2lvbiB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1wZGYubWpzLm1hcCIsImltcG9ydCB7IG1lbW9pemUgfSBmcm9tICcuL3V0aWxzL2pzX3V0aWxzLmpzJztcbmV4cG9ydCBjb25zdCBpc0ZpcmVmb3ggPSBtZW1vaXplKCgpPT4vZmlyZWZveC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudClcbik7XG5leHBvcnQgY29uc3QgaXNTYWZhcmkgPSBtZW1vaXplKCgpPT5Cb29sZWFuKHdpbmRvdy5zYWZhcmkpXG4pO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyRGV0ZWN0b3IuanMubWFwIiwiaW1wb3J0IHsgdW5pb24sIHdpdGhvdXQgfSBmcm9tICcuL3V0aWxzL2pzX3V0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBFbnRlckxlYXZlQ291bnRlciB7XG4gICAgZW50ZXIoZW50ZXJpbmdOb2RlKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTGVuZ3RoID0gdGhpcy5lbnRlcmVkLmxlbmd0aDtcbiAgICAgICAgY29uc3QgaXNOb2RlRW50ZXJlZCA9IChub2RlKT0+dGhpcy5pc05vZGVJbkRvY3VtZW50KG5vZGUpICYmICghbm9kZS5jb250YWlucyB8fCBub2RlLmNvbnRhaW5zKGVudGVyaW5nTm9kZSkpXG4gICAgICAgIDtcbiAgICAgICAgdGhpcy5lbnRlcmVkID0gdW5pb24odGhpcy5lbnRlcmVkLmZpbHRlcihpc05vZGVFbnRlcmVkKSwgW1xuICAgICAgICAgICAgZW50ZXJpbmdOb2RlXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gcHJldmlvdXNMZW5ndGggPT09IDAgJiYgdGhpcy5lbnRlcmVkLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGxlYXZlKGxlYXZpbmdOb2RlKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTGVuZ3RoID0gdGhpcy5lbnRlcmVkLmxlbmd0aDtcbiAgICAgICAgdGhpcy5lbnRlcmVkID0gd2l0aG91dCh0aGlzLmVudGVyZWQuZmlsdGVyKHRoaXMuaXNOb2RlSW5Eb2N1bWVudCksIGxlYXZpbmdOb2RlKTtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzTGVuZ3RoID4gMCAmJiB0aGlzLmVudGVyZWQubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5lbnRlcmVkID0gW107XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGlzTm9kZUluRG9jdW1lbnQpe1xuICAgICAgICB0aGlzLmVudGVyZWQgPSBbXTtcbiAgICAgICAgdGhpcy5pc05vZGVJbkRvY3VtZW50ID0gaXNOb2RlSW5Eb2N1bWVudDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGVyTGVhdmVDb3VudGVyLmpzLm1hcCIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgICBmb3IodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbihzeW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5pbXBvcnQgeyBFbnRlckxlYXZlQ291bnRlciB9IGZyb20gJy4vRW50ZXJMZWF2ZUNvdW50ZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlTmF0aXZlRHJhZ1NvdXJjZSwgbWF0Y2hOYXRpdmVJdGVtVHlwZSB9IGZyb20gJy4vTmF0aXZlRHJhZ1NvdXJjZXMvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgTmF0aXZlVHlwZXMgZnJvbSAnLi9OYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgeyBnZXREcmFnUHJldmlld09mZnNldCwgZ2V0RXZlbnRDbGllbnRPZmZzZXQsIGdldE5vZGVDbGllbnRPZmZzZXQgfSBmcm9tICcuL09mZnNldFV0aWxzLmpzJztcbmltcG9ydCB7IE9wdGlvbnNSZWFkZXIgfSBmcm9tICcuL09wdGlvbnNSZWFkZXIuanMnO1xuZXhwb3J0IGNsYXNzIEhUTUw1QmFja2VuZEltcGwge1xuICAgIC8qKlxuXHQgKiBHZW5lcmF0ZSBwcm9maWxpbmcgc3RhdGlzdGljcyBmb3IgdGhlIEhUTUw1QmFja2VuZC5cblx0ICovIHByb2ZpbGUoKSB7XG4gICAgICAgIHZhciByZWYsIHJlZjE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzb3VyY2VQcmV2aWV3Tm9kZXM6IHRoaXMuc291cmNlUHJldmlld05vZGVzLnNpemUsXG4gICAgICAgICAgICBzb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnM6IHRoaXMuc291cmNlUHJldmlld05vZGVPcHRpb25zLnNpemUsXG4gICAgICAgICAgICBzb3VyY2VOb2RlT3B0aW9uczogdGhpcy5zb3VyY2VOb2RlT3B0aW9ucy5zaXplLFxuICAgICAgICAgICAgc291cmNlTm9kZXM6IHRoaXMuc291cmNlTm9kZXMuc2l6ZSxcbiAgICAgICAgICAgIGRyYWdTdGFydFNvdXJjZUlkczogKChyZWYgPSB0aGlzLmRyYWdTdGFydFNvdXJjZUlkcykgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYubGVuZ3RoKSB8fCAwLFxuICAgICAgICAgICAgZHJvcFRhcmdldElkczogdGhpcy5kcm9wVGFyZ2V0SWRzLmxlbmd0aCxcbiAgICAgICAgICAgIGRyYWdFbnRlclRhcmdldElkczogdGhpcy5kcmFnRW50ZXJUYXJnZXRJZHMubGVuZ3RoLFxuICAgICAgICAgICAgZHJhZ092ZXJUYXJnZXRJZHM6ICgocmVmMSA9IHRoaXMuZHJhZ092ZXJUYXJnZXRJZHMpID09PSBudWxsIHx8IHJlZjEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZjEubGVuZ3RoKSB8fCAwXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIHB1YmxpYyBmb3IgdGVzdFxuICAgIGdldCB3aW5kb3coKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud2luZG93O1xuICAgIH1cbiAgICBnZXQgZG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZG9jdW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuXHQgKiBHZXQgdGhlIHJvb3QgZWxlbWVudCB0byB1c2UgZm9yIGV2ZW50IHN1YnNjcmlwdGlvbnNcblx0ICovIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yb290RWxlbWVudDtcbiAgICB9XG4gICAgc2V0dXAoKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3RFbGVtZW50O1xuICAgICAgICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvb3QuX19pc1JlYWN0RG5kQmFja2VuZFNldFVwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBoYXZlIHR3byBIVE1MNSBiYWNrZW5kcyBhdCB0aGUgc2FtZSB0aW1lLicpO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QuX19pc1JlYWN0RG5kQmFja2VuZFNldFVwID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycyhyb290KTtcbiAgICB9XG4gICAgdGVhcmRvd24oKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3RFbGVtZW50O1xuICAgICAgICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5fX2lzUmVhY3REbmRCYWNrZW5kU2V0VXAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLnJvb3RFbGVtZW50KTtcbiAgICAgICAgdGhpcy5jbGVhckN1cnJlbnREcmFnU291cmNlTm9kZSgpO1xuICAgICAgICBpZiAodGhpcy5hc3luY0VuZERyYWdGcmFtZUlkKSB7XG4gICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgKHJlZiA9IHRoaXMud2luZG93KSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFzeW5jRW5kRHJhZ0ZyYW1lSWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbm5lY3REcmFnUHJldmlldyhzb3VyY2VJZCwgbm9kZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucy5zZXQoc291cmNlSWQsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNvdXJjZVByZXZpZXdOb2Rlcy5zZXQoc291cmNlSWQsIG5vZGUpO1xuICAgICAgICByZXR1cm4gKCk9PntcbiAgICAgICAgICAgIHRoaXMuc291cmNlUHJldmlld05vZGVzLmRlbGV0ZShzb3VyY2VJZCk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucy5kZWxldGUoc291cmNlSWQpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25uZWN0RHJhZ1NvdXJjZShzb3VyY2VJZCwgbm9kZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnNvdXJjZU5vZGVzLnNldChzb3VyY2VJZCwgbm9kZSk7XG4gICAgICAgIHRoaXMuc291cmNlTm9kZU9wdGlvbnMuc2V0KHNvdXJjZUlkLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaGFuZGxlRHJhZ1N0YXJ0ID0gKGUpPT50aGlzLmhhbmRsZURyYWdTdGFydChlLCBzb3VyY2VJZClcbiAgICAgICAgO1xuICAgICAgICBjb25zdCBoYW5kbGVTZWxlY3RTdGFydCA9IChlKT0+dGhpcy5oYW5kbGVTZWxlY3RTdGFydChlKVxuICAgICAgICA7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAndHJ1ZScpO1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIGhhbmRsZURyYWdTdGFydCk7XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBoYW5kbGVTZWxlY3RTdGFydCk7XG4gICAgICAgIHJldHVybiAoKT0+e1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VOb2Rlcy5kZWxldGUoc291cmNlSWQpO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VOb2RlT3B0aW9ucy5kZWxldGUoc291cmNlSWQpO1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBoYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIGhhbmRsZVNlbGVjdFN0YXJ0KTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAnZmFsc2UnKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29ubmVjdERyb3BUYXJnZXQodGFyZ2V0SWQsIG5vZGUpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlRHJhZ0VudGVyID0gKGUpPT50aGlzLmhhbmRsZURyYWdFbnRlcihlLCB0YXJnZXRJZClcbiAgICAgICAgO1xuICAgICAgICBjb25zdCBoYW5kbGVEcmFnT3ZlciA9IChlKT0+dGhpcy5oYW5kbGVEcmFnT3ZlcihlLCB0YXJnZXRJZClcbiAgICAgICAgO1xuICAgICAgICBjb25zdCBoYW5kbGVEcm9wID0gKGUpPT50aGlzLmhhbmRsZURyb3AoZSwgdGFyZ2V0SWQpXG4gICAgICAgIDtcbiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCBoYW5kbGVEcmFnRW50ZXIpO1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgaGFuZGxlRHJhZ092ZXIpO1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBoYW5kbGVEcm9wKTtcbiAgICAgICAgcmV0dXJuICgpPT57XG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIGhhbmRsZURyYWdFbnRlcik7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgaGFuZGxlRHJhZ092ZXIpO1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgaGFuZGxlRHJvcCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGFkZEV2ZW50TGlzdGVuZXJzKHRhcmdldCkge1xuICAgICAgICAvLyBTU1IgRml4IChodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZG5kL3JlYWN0LWRuZC9wdWxsLzgxM1xuICAgICAgICBpZiAoIXRhcmdldC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlVG9wRHJhZ1N0YXJ0KTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlVG9wRHJhZ1N0YXJ0Q2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVUb3BEcmFnRW5kQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmhhbmRsZVRvcERyYWdFbnRlcik7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmhhbmRsZVRvcERyYWdFbnRlckNhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5oYW5kbGVUb3BEcmFnTGVhdmVDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5oYW5kbGVUb3BEcmFnT3Zlcik7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlVG9wRHJhZ092ZXJDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmhhbmRsZVRvcERyb3ApO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuaGFuZGxlVG9wRHJvcENhcHR1cmUsIHRydWUpO1xuICAgIH1cbiAgICByZW1vdmVFdmVudExpc3RlbmVycyh0YXJnZXQpIHtcbiAgICAgICAgLy8gU1NSIEZpeCAoaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRuZC9yZWFjdC1kbmQvcHVsbC84MTNcbiAgICAgICAgaWYgKCF0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZVRvcERyYWdTdGFydCk7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZVRvcERyYWdTdGFydENhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlVG9wRHJhZ0VuZENhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5oYW5kbGVUb3BEcmFnRW50ZXIpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5oYW5kbGVUb3BEcmFnRW50ZXJDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMuaGFuZGxlVG9wRHJhZ0xlYXZlQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlVG9wRHJhZ092ZXIpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZVRvcERyYWdPdmVyQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5oYW5kbGVUb3BEcm9wKTtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmhhbmRsZVRvcERyb3BDYXB0dXJlLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0Q3VycmVudFNvdXJjZU5vZGVPcHRpb25zKCkge1xuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IHRoaXMubW9uaXRvci5nZXRTb3VyY2VJZCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VOb2RlT3B0aW9ucyA9IHRoaXMuc291cmNlTm9kZU9wdGlvbnMuZ2V0KHNvdXJjZUlkKTtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgZHJvcEVmZmVjdDogdGhpcy5hbHRLZXlQcmVzc2VkID8gJ2NvcHknIDogJ21vdmUnXG4gICAgICAgIH0sIHNvdXJjZU5vZGVPcHRpb25zIHx8IHt9KTtcbiAgICB9XG4gICAgZ2V0Q3VycmVudERyb3BFZmZlY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgIC8vIEl0IG1ha2VzIG1vcmUgc2Vuc2UgdG8gZGVmYXVsdCB0byAnY29weScgZm9yIG5hdGl2ZSByZXNvdXJjZXNcbiAgICAgICAgICAgIHJldHVybiAnY29weSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFNvdXJjZU5vZGVPcHRpb25zKCkuZHJvcEVmZmVjdDtcbiAgICB9XG4gICAgZ2V0Q3VycmVudFNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucygpIHtcbiAgICAgICAgY29uc3Qgc291cmNlSWQgPSB0aGlzLm1vbml0b3IuZ2V0U291cmNlSWQoKTtcbiAgICAgICAgY29uc3Qgc291cmNlUHJldmlld05vZGVPcHRpb25zID0gdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMuZ2V0KHNvdXJjZUlkKTtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgYW5jaG9yWDogMC41LFxuICAgICAgICAgICAgYW5jaG9yWTogMC41LFxuICAgICAgICAgICAgY2FwdHVyZURyYWdnaW5nU3RhdGU6IGZhbHNlXG4gICAgICAgIH0sIHNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucyB8fCB7fSk7XG4gICAgfVxuICAgIGlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkge1xuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHRoaXMubW9uaXRvci5nZXRJdGVtVHlwZSgpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoTmF0aXZlVHlwZXMpLnNvbWUoKGtleSk9Pk5hdGl2ZVR5cGVzW2tleV0gPT09IGl0ZW1UeXBlXG4gICAgICAgICk7XG4gICAgfVxuICAgIGJlZ2luRHJhZ05hdGl2ZUl0ZW0odHlwZSwgZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIHRoaXMuY2xlYXJDdXJyZW50RHJhZ1NvdXJjZU5vZGUoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50TmF0aXZlU291cmNlID0gY3JlYXRlTmF0aXZlRHJhZ1NvdXJjZSh0eXBlLCBkYXRhVHJhbnNmZXIpO1xuICAgICAgICB0aGlzLmN1cnJlbnROYXRpdmVIYW5kbGUgPSB0aGlzLnJlZ2lzdHJ5LmFkZFNvdXJjZSh0eXBlLCB0aGlzLmN1cnJlbnROYXRpdmVTb3VyY2UpO1xuICAgICAgICB0aGlzLmFjdGlvbnMuYmVnaW5EcmFnKFtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE5hdGl2ZUhhbmRsZVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgc2V0Q3VycmVudERyYWdTb3VyY2VOb2RlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jbGVhckN1cnJlbnREcmFnU291cmNlTm9kZSgpO1xuICAgICAgICB0aGlzLmN1cnJlbnREcmFnU291cmNlTm9kZSA9IG5vZGU7XG4gICAgICAgIC8vIEEgdGltZW91dCBvZiA+IDAgaXMgbmVjZXNzYXJ5IHRvIHJlc29sdmUgRmlyZWZveCBpc3N1ZSByZWZlcmVuY2VkXG4gICAgICAgIC8vIFNlZTpcbiAgICAgICAgLy8gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kbmQvcmVhY3QtZG5kL3B1bGwvOTI4XG4gICAgICAgIC8vICAgKiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZG5kL3JlYWN0LWRuZC9pc3N1ZXMvODY5XG4gICAgICAgIGNvbnN0IE1PVVNFX01PVkVfVElNRU9VVCA9IDEwMDA7XG4gICAgICAgIC8vIFJlY2VpdmluZyBhIG1vdXNlIGV2ZW50IGluIHRoZSBtaWRkbGUgb2YgYSBkcmFnZ2luZyBvcGVyYXRpb25cbiAgICAgICAgLy8gbWVhbnMgaXQgaGFzIGVuZGVkIGFuZCB0aGUgZHJhZyBzb3VyY2Ugbm9kZSBkaXNhcHBlYXJlZCBmcm9tIERPTSxcbiAgICAgICAgLy8gc28gdGhlIGJyb3dzZXIgZGlkbid0IGRpc3BhdGNoIHRoZSBkcmFnZW5kIGV2ZW50LlxuICAgICAgICAvL1xuICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgYmVmb3JlIHdlIHN0YXJ0IGxpc3RlbmluZyBmb3IgbW91c2Vtb3ZlIGV2ZW50cy5cbiAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgZHJhZyBwcmV2aWV3IG5lZWRzIHRvIGJlIGRyYXduIG9yIGVsc2UgaXQgZmlyZXMgYW4gJ21vdXNlbW92ZScgZXZlbnRcbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgaW4gc29tZSBicm93c2Vycy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2VlOlxuICAgICAgICAvLyAgICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRuZC9yZWFjdC1kbmQvcHVsbC85MjhcbiAgICAgICAgLy8gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kbmQvcmVhY3QtZG5kL2lzc3Vlcy84NjlcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5tb3VzZU1vdmVUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgcmV0dXJuIChyZWYgPSB0aGlzLnJvb3RFbGVtZW50KSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmVuZERyYWdJZlNvdXJjZVdhc1JlbW92ZWRGcm9tRE9NLCB0cnVlKTtcbiAgICAgICAgfSwgTU9VU0VfTU9WRV9USU1FT1VUKTtcbiAgICB9XG4gICAgY2xlYXJDdXJyZW50RHJhZ1NvdXJjZU5vZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnREcmFnU291cmNlTm9kZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50RHJhZ1NvdXJjZU5vZGUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMucm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgICAgIChyZWYgPSB0aGlzLndpbmRvdykgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYuY2xlYXJUaW1lb3V0KHRoaXMubW91c2VNb3ZlVGltZW91dFRpbWVyIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmVuZERyYWdJZlNvdXJjZVdhc1JlbW92ZWRGcm9tRE9NLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubW91c2VNb3ZlVGltZW91dFRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlRHJhZ1N0YXJ0KGUsIHNvdXJjZUlkKSB7XG4gICAgICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZHJhZ1N0YXJ0U291cmNlSWRzKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdTdGFydFNvdXJjZUlkcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHJhZ1N0YXJ0U291cmNlSWRzLnVuc2hpZnQoc291cmNlSWQpO1xuICAgIH1cbiAgICBoYW5kbGVEcmFnRW50ZXIoX2UsIHRhcmdldElkKSB7XG4gICAgICAgIHRoaXMuZHJhZ0VudGVyVGFyZ2V0SWRzLnVuc2hpZnQodGFyZ2V0SWQpO1xuICAgIH1cbiAgICBoYW5kbGVEcmFnT3ZlcihfZSwgdGFyZ2V0SWQpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ092ZXJUYXJnZXRJZHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ092ZXJUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyYWdPdmVyVGFyZ2V0SWRzLnVuc2hpZnQodGFyZ2V0SWQpO1xuICAgIH1cbiAgICBoYW5kbGVEcm9wKF9lLCB0YXJnZXRJZCkge1xuICAgICAgICB0aGlzLmRyb3BUYXJnZXRJZHMudW5zaGlmdCh0YXJnZXRJZCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG1hbmFnZXIsIGdsb2JhbENvbnRleHQsIG9wdGlvbnMpe1xuICAgICAgICB0aGlzLnNvdXJjZVByZXZpZXdOb2RlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc291cmNlTm9kZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc291cmNlTm9kZU9wdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZHJhZ1N0YXJ0U291cmNlSWRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5kcm9wVGFyZ2V0SWRzID0gW107XG4gICAgICAgIHRoaXMuZHJhZ0VudGVyVGFyZ2V0SWRzID0gW107XG4gICAgICAgIHRoaXMuY3VycmVudE5hdGl2ZVNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudE5hdGl2ZUhhbmRsZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudERyYWdTb3VyY2VOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbHRLZXlQcmVzc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW91c2VNb3ZlVGltZW91dFRpbWVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5hc3luY0VuZERyYWdGcmFtZUlkID0gbnVsbDtcbiAgICAgICAgdGhpcy5kcmFnT3ZlclRhcmdldElkcyA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdENsaWVudE9mZnNldCA9IG51bGw7XG4gICAgICAgIHRoaXMuaG92ZXJSYWZJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuZ2V0U291cmNlQ2xpZW50T2Zmc2V0ID0gKHNvdXJjZUlkKT0+e1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5zb3VyY2VOb2Rlcy5nZXQoc291cmNlSWQpO1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZSAmJiBnZXROb2RlQ2xpZW50T2Zmc2V0KHNvdXJjZSkgfHwgbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbmREcmFnTmF0aXZlSXRlbSA9ICgpPT57XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ05hdGl2ZUl0ZW0oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5lbmREcmFnKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TmF0aXZlSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RyeS5yZW1vdmVTb3VyY2UodGhpcy5jdXJyZW50TmF0aXZlSGFuZGxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudE5hdGl2ZUhhbmRsZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnROYXRpdmVTb3VyY2UgPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmlzTm9kZUluRG9jdW1lbnQgPSAobm9kZSk9PntcbiAgICAgICAgICAgIC8vIENoZWNrIHRoZSBub2RlIGVpdGhlciBpbiB0aGUgbWFpbiBkb2N1bWVudCBvciBpbiB0aGUgY3VycmVudCBjb250ZXh0XG4gICAgICAgICAgICByZXR1cm4gQm9vbGVhbihub2RlICYmIHRoaXMuZG9jdW1lbnQgJiYgdGhpcy5kb2N1bWVudC5ib2R5ICYmIHRoaXMuZG9jdW1lbnQuYm9keS5jb250YWlucyhub2RlKSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZW5kRHJhZ0lmU291cmNlV2FzUmVtb3ZlZEZyb21ET00gPSAoKT0+e1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudERyYWdTb3VyY2VOb2RlO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCB8fCB0aGlzLmlzTm9kZUluRG9jdW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhckN1cnJlbnREcmFnU291cmNlTm9kZSgpICYmIHRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuZW5kRHJhZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYW5jZWxIb3ZlcigpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNjaGVkdWxlSG92ZXIgPSAoZHJhZ092ZXJUYXJnZXRJZHMpPT57XG4gICAgICAgICAgICBpZiAodGhpcy5ob3ZlclJhZklkID09PSBudWxsICYmIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3ZlclJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vbml0b3IuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuaG92ZXIoZHJhZ092ZXJUYXJnZXRJZHMgfHwgW10sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXQ6IHRoaXMubGFzdENsaWVudE9mZnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ob3ZlclJhZklkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jYW5jZWxIb3ZlciA9ICgpPT57XG4gICAgICAgICAgICBpZiAodGhpcy5ob3ZlclJhZklkICE9PSBudWxsICYmIHR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmhvdmVyUmFmSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJSYWZJZCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJhZ1N0YXJ0Q2FwdHVyZSA9ICgpPT57XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ3VycmVudERyYWdTb3VyY2VOb2RlKCk7XG4gICAgICAgICAgICB0aGlzLmRyYWdTdGFydFNvdXJjZUlkcyA9IFtdO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdTdGFydCA9IChlKT0+e1xuICAgICAgICAgICAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZHJhZ1N0YXJ0U291cmNlSWRzICB9ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXJ0U291cmNlSWRzID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudE9mZnNldCA9IGdldEV2ZW50Q2xpZW50T2Zmc2V0KGUpO1xuICAgICAgICAgICAgLy8gQXZvaWQgY3Jhc2hpbmcgaWYgd2UgbWlzc2VkIGEgZHJvcCBldmVudCBvciBvdXIgcHJldmlvdXMgZHJhZyBkaWVkXG4gICAgICAgICAgICBpZiAodGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5lbmREcmFnKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxIb3ZlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRG9uJ3QgcHVibGlzaCB0aGUgc291cmNlIGp1c3QgeWV0IChzZWUgd2h5IGJlbG93KVxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmJlZ2luRHJhZyhkcmFnU3RhcnRTb3VyY2VJZHMgfHwgW10sIHtcbiAgICAgICAgICAgICAgICBwdWJsaXNoU291cmNlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBnZXRTb3VyY2VDbGllbnRPZmZzZXQ6IHRoaXMuZ2V0U291cmNlQ2xpZW50T2Zmc2V0LFxuICAgICAgICAgICAgICAgIGNsaWVudE9mZnNldFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGFUcmFuc2ZlciAgfSA9IGU7XG4gICAgICAgICAgICBjb25zdCBuYXRpdmVUeXBlID0gbWF0Y2hOYXRpdmVJdGVtVHlwZShkYXRhVHJhbnNmZXIpO1xuICAgICAgICAgICAgaWYgKHRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIHR5cGVvZiBkYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBjdXN0b20gZHJhZyBpbWFnZSBpZiB1c2VyIHNwZWNpZmllcyBpdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgY2hpbGQgZHJhZyBzb3VyY2UgcmVmdXNlcyBkcmFnIGJ1dCBwYXJlbnQgYWdyZWVzLFxuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgcGFyZW50J3Mgbm9kZSBhcyBkcmFnIGltYWdlLiBOZWl0aGVyIHdvcmtzIGluIElFIHRob3VnaC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlSWQgPSB0aGlzLm1vbml0b3IuZ2V0U291cmNlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlTm9kZSA9IHRoaXMuc291cmNlTm9kZXMuZ2V0KHNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJhZ1ByZXZpZXcgPSB0aGlzLnNvdXJjZVByZXZpZXdOb2Rlcy5nZXQoc291cmNlSWQpIHx8IHNvdXJjZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkcmFnUHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhbmNob3JYICwgYW5jaG9yWSAsIG9mZnNldFggLCBvZmZzZXRZICB9ID0gdGhpcy5nZXRDdXJyZW50U291cmNlUHJldmlld05vZGVPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNob3JQb2ludCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JYLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcllcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRQb2ludCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRYLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkcmFnUHJldmlld09mZnNldCA9IGdldERyYWdQcmV2aWV3T2Zmc2V0KHNvdXJjZU5vZGUsIGRyYWdQcmV2aWV3LCBjbGllbnRPZmZzZXQsIGFuY2hvclBvaW50LCBvZmZzZXRQb2ludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKGRyYWdQcmV2aWV3LCBkcmFnUHJldmlld09mZnNldC54LCBkcmFnUHJldmlld09mZnNldC55KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaXJlZm94IHdvbid0IGRyYWcgd2l0aG91dCBzZXR0aW5nIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyID09PSBudWxsIHx8IGRhdGFUcmFuc2ZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YVRyYW5zZmVyLnNldERhdGEoJ2FwcGxpY2F0aW9uL2pzb24nLCB7fSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IE1JTUUgdHlwZXMgaW4gc2V0RGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTdG9yZSBkcmFnIHNvdXJjZSBub2RlIHNvIHdlIGNhbiBjaGVjayB3aGV0aGVyXG4gICAgICAgICAgICAgICAgLy8gaXQgaXMgcmVtb3ZlZCBmcm9tIERPTSBhbmQgdHJpZ2dlciBlbmREcmFnIG1hbnVhbGx5LlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudERyYWdTb3VyY2VOb2RlKGUudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAvLyBOb3cgd2UgYXJlIHJlYWR5IHRvIHB1Ymxpc2ggdGhlIGRyYWcgc291cmNlLi4gb3IgYXJlIHdlIG5vdD9cbiAgICAgICAgICAgICAgICBjb25zdCB7IGNhcHR1cmVEcmFnZ2luZ1N0YXRlICB9ID0gdGhpcy5nZXRDdXJyZW50U291cmNlUHJldmlld05vZGVPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjYXB0dXJlRHJhZ2dpbmdTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBVc3VhbGx5IHdlIHdhbnQgdG8gcHVibGlzaCBpdCBpbiB0aGUgbmV4dCB0aWNrIHNvIHRoYXQgYnJvd3NlclxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBhYmxlIHRvIHNjcmVlbnNob3QgdGhlIGN1cnJlbnQgKG5vdCB5ZXQgZHJhZ2dpbmcpIHN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBJdCBhbHNvIG5lYXRseSBhdm9pZHMgYSBzaXR1YXRpb24gd2hlcmUgcmVuZGVyKCkgcmV0dXJucyBudWxsXG4gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBzYW1lIHRpY2sgZm9yIHRoZSBzb3VyY2UgZWxlbWVudCwgYW5kIGJyb3dzZXIgZnJlYWtzIG91dC5cbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKT0+dGhpcy5hY3Rpb25zLnB1Ymxpc2hEcmFnU291cmNlKClcbiAgICAgICAgICAgICAgICAgICAgLCAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSB1c2VyIG1heSB3YW50IHRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IsIGUuZy5cbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gd29yayBhcm91bmQgSUUgbm90IHN1cHBvcnRpbmcgY3VzdG9tIGRyYWcgcHJldmlld3MuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBjdXN0b20gZHJhZyBsYXllciwgdGhlIG9ubHkgd2F5IHRvIHByZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgZHJhZyBwcmV2aWV3IGZyb20gZHJhd2luZyBpbiBJRSBpcyB0byBzY3JlZW5zaG90XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkcmFnZ2luZyBzdGF0ZSBpbiB3aGljaCB0aGUgbm9kZSBpdHNlbGYgaGFzIHplcm8gb3BhY2l0eVxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaGVpZ2h0LiBJbiB0aGlzIGNhc2UsIHRob3VnaCwgcmV0dXJuaW5nIG51bGwgZnJvbSByZW5kZXIoKVxuICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGFicnVwdGx5IGVuZCB0aGUgZHJhZ2dpbmcsIHdoaWNoIGlzIG5vdCBvYnZpb3VzLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByZWFzb24gc3VjaCBiZWhhdmlvciBpcyBzdHJpY3RseSBvcHQtaW4uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5wdWJsaXNoRHJhZ1NvdXJjZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmF0aXZlVHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIEEgbmF0aXZlIGl0ZW0gKHN1Y2ggYXMgVVJMKSBkcmFnZ2VkIGZyb20gaW5zaWRlIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgICAgIHRoaXMuYmVnaW5EcmFnTmF0aXZlSXRlbShuYXRpdmVUeXBlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVRyYW5zZmVyICYmICFkYXRhVHJhbnNmZXIudHlwZXMgJiYgKGUudGFyZ2V0ICYmICFlLnRhcmdldC5oYXNBdHRyaWJ1dGUgfHwgIWUudGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZHJhZ2dhYmxlJykpKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9va3MgbGlrZSBhIFNhZmFyaSBidWc6IGRhdGFUcmFuc2Zlci50eXBlcyBpcyBudWxsLCBidXQgdGhlcmUgd2FzIG5vIGRyYWdnYWJsZS5cbiAgICAgICAgICAgICAgICAvLyBKdXN0IGxldCBpdCBkcmFnLiBJdCdzIGEgbmF0aXZlIHR5cGUgKFVSTCBvciB0ZXh0KSBhbmQgd2lsbCBiZSBwaWNrZWQgdXAgaW5cbiAgICAgICAgICAgICAgICAvLyBkcmFnZW50ZXIgaGFuZGxlci5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElmIGJ5IHRoaXMgdGltZSBubyBkcmFnIHNvdXJjZSByZWFjdGVkLCB0ZWxsIGJyb3dzZXIgbm90IHRvIGRyYWcuXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdFbmRDYXB0dXJlID0gKCk9PntcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyQ3VycmVudERyYWdTb3VyY2VOb2RlKCkgJiYgdGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggY2FuIGRpc3BhdGNoIHRoaXMgZXZlbnQgaW4gYW4gaW5maW5pdGUgbG9vcFxuICAgICAgICAgICAgICAgIC8vIGlmIGRyYWdlbmQgaGFuZGxlciBkb2VzIHNvbWV0aGluZyBsaWtlIHNob3dpbmcgYW4gYWxlcnQuXG4gICAgICAgICAgICAgICAgLy8gT25seSBwcm9jZWVkIGlmIHdlIGhhdmUgbm90IGhhbmRsZWQgaXQgYWxyZWFkeS5cbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuZW5kRHJhZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYW5jZWxIb3ZlcigpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdFbnRlckNhcHR1cmUgPSAoZSk9PntcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VudGVyVGFyZ2V0SWRzID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgICAgICAgICAocmVmID0gdGhpcy5jdXJyZW50TmF0aXZlU291cmNlKSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5sb2FkRGF0YVRyYW5zZmVyKGUuZGF0YVRyYW5zZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlzRmlyc3RFbnRlciA9IHRoaXMuZW50ZXJMZWF2ZUNvdW50ZXIuZW50ZXIoZS50YXJnZXQpO1xuICAgICAgICAgICAgaWYgKCFpc0ZpcnN0RW50ZXIgfHwgdGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YVRyYW5zZmVyICB9ID0gZTtcbiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZVR5cGUgPSBtYXRjaE5hdGl2ZUl0ZW1UeXBlKGRhdGFUcmFuc2Zlcik7XG4gICAgICAgICAgICBpZiAobmF0aXZlVHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIEEgbmF0aXZlIGl0ZW0gKHN1Y2ggYXMgZmlsZSBvciBVUkwpIGRyYWdnZWQgZnJvbSBvdXRzaWRlIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgICAgIHRoaXMuYmVnaW5EcmFnTmF0aXZlSXRlbShuYXRpdmVUeXBlLCBkYXRhVHJhbnNmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdFbnRlciA9IChlKT0+e1xuICAgICAgICAgICAgY29uc3QgeyBkcmFnRW50ZXJUYXJnZXRJZHMgIH0gPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5kcmFnRW50ZXJUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYSBuYXRpdmUgaXRlbSB0eXBlIHdlIGRvbid0IHVuZGVyc3RhbmQuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hbHRLZXlQcmVzc2VkID0gZS5hbHRLZXk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGNoYW5nZXMgcG9zaXRpb24gYXMgdGhlIHJlc3VsdCBvZiBgZHJhZ2VudGVyYCwgYGRyYWdvdmVyYCBtaWdodCBzdGlsbFxuICAgICAgICAgICAgLy8gZ2V0IGRpc3BhdGNoZWQgZGVzcGl0ZSB0YXJnZXQgYmVpbmcgbm8gbG9uZ2VyIHRoZXJlLiBUaGUgZWFzeSBzb2x1dGlvbiBpcyB0byBjaGVja1xuICAgICAgICAgICAgLy8gd2hldGhlciB0aGVyZSBhY3R1YWxseSBpcyBhIHRhcmdldCBiZWZvcmUgZmlyaW5nIGBob3ZlcmAuXG4gICAgICAgICAgICBpZiAoZHJhZ0VudGVyVGFyZ2V0SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuaG92ZXIoZHJhZ0VudGVyVGFyZ2V0SWRzLCB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWVudE9mZnNldDogZ2V0RXZlbnRDbGllbnRPZmZzZXQoZSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNhbkRyb3AgPSBkcmFnRW50ZXJUYXJnZXRJZHMuc29tZSgodGFyZ2V0SWQpPT50aGlzLm1vbml0b3IuY2FuRHJvcE9uVGFyZ2V0KHRhcmdldElkKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjYW5Ecm9wKSB7XG4gICAgICAgICAgICAgICAgLy8gSUUgcmVxdWlyZXMgdGhpcyB0byBmaXJlIGRyYWdvdmVyIGV2ZW50c1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IHRoaXMuZ2V0Q3VycmVudERyb3BFZmZlY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJhZ092ZXJDYXB0dXJlID0gKGUpPT57XG4gICAgICAgICAgICB0aGlzLmRyYWdPdmVyVGFyZ2V0SWRzID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgICAgICAgICAocmVmID0gdGhpcy5jdXJyZW50TmF0aXZlU291cmNlKSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5sb2FkRGF0YVRyYW5zZmVyKGUuZGF0YVRyYW5zZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3BEcmFnT3ZlciA9IChlKT0+e1xuICAgICAgICAgICAgY29uc3QgeyBkcmFnT3ZlclRhcmdldElkcyAgfSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmRyYWdPdmVyVGFyZ2V0SWRzID0gW107XG4gICAgICAgICAgICBpZiAoIXRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGEgbmF0aXZlIGl0ZW0gdHlwZSB3ZSBkb24ndCB1bmRlcnN0YW5kLlxuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgZGVmYXVsdCBcImRyb3AgYW5kIGJsb3cgYXdheSB0aGUgd2hvbGUgZG9jdW1lbnRcIiBhY3Rpb24uXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlcikge1xuICAgICAgICAgICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFsdEtleVByZXNzZWQgPSBlLmFsdEtleTtcbiAgICAgICAgICAgIHRoaXMubGFzdENsaWVudE9mZnNldCA9IGdldEV2ZW50Q2xpZW50T2Zmc2V0KGUpO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUhvdmVyKGRyYWdPdmVyVGFyZ2V0SWRzKTtcbiAgICAgICAgICAgIGNvbnN0IGNhbkRyb3AgPSAoZHJhZ092ZXJUYXJnZXRJZHMgfHwgW10pLnNvbWUoKHRhcmdldElkKT0+dGhpcy5tb25pdG9yLmNhbkRyb3BPblRhcmdldCh0YXJnZXRJZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY2FuRHJvcCkge1xuICAgICAgICAgICAgICAgIC8vIFNob3cgdXNlci1zcGVjaWZpZWQgZHJvcCBlZmZlY3QuXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlcikge1xuICAgICAgICAgICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gdGhpcy5nZXRDdXJyZW50RHJvcEVmZmVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2hvdyBhIG5pY2UgY3Vyc29yIGJ1dCBzdGlsbCBwcmV2ZW50IGRlZmF1bHRcbiAgICAgICAgICAgICAgICAvLyBcImRyb3AgYW5kIGJsb3cgYXdheSB0aGUgd2hvbGUgZG9jdW1lbnRcIiBhY3Rpb24uXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGUuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdMZWF2ZUNhcHR1cmUgPSAoZSk9PntcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc0xhc3RMZWF2ZSA9IHRoaXMuZW50ZXJMZWF2ZUNvdW50ZXIubGVhdmUoZS50YXJnZXQpO1xuICAgICAgICAgICAgaWYgKCFpc0xhc3RMZWF2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT50aGlzLmVuZERyYWdOYXRpdmVJdGVtKClcbiAgICAgICAgICAgICAgICAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYW5jZWxIb3ZlcigpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyb3BDYXB0dXJlID0gKGUpPT57XG4gICAgICAgICAgICB0aGlzLmRyb3BUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAocmVmID0gdGhpcy5jdXJyZW50TmF0aXZlU291cmNlKSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5sb2FkRGF0YVRyYW5zZmVyKGUuZGF0YVRyYW5zZmVyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hOYXRpdmVJdGVtVHlwZShlLmRhdGFUcmFuc2ZlcikpIHtcbiAgICAgICAgICAgICAgICAvLyBEcmFnZ2luZyBzb21lIGVsZW1lbnRzLCBsaWtlIDxhPiBhbmQgPGltZz4gbWF5IHN0aWxsIGJlaGF2ZSBsaWtlIGEgbmF0aXZlIGRyYWcgZXZlbnQsXG4gICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGUgY3VycmVudCBkcmFnIGV2ZW50IG1hdGNoZXMgYSB1c2VyLWRlZmluZWQgdHlwZS5cbiAgICAgICAgICAgICAgICAvLyBTdG9wIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gd2UncmUgbm90IGV4cGVjdGluZyBhIG5hdGl2ZSBpdGVtIHRvIGJlIGRyb3BwZWQuXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbnRlckxlYXZlQ291bnRlci5yZXNldCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyb3AgPSAoZSk9PntcbiAgICAgICAgICAgIGNvbnN0IHsgZHJvcFRhcmdldElkcyAgfSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmRyb3BUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5ob3Zlcihkcm9wVGFyZ2V0SWRzLCB7XG4gICAgICAgICAgICAgICAgY2xpZW50T2Zmc2V0OiBnZXRFdmVudENsaWVudE9mZnNldChlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbnMuZHJvcCh7XG4gICAgICAgICAgICAgICAgZHJvcEVmZmVjdDogdGhpcy5nZXRDdXJyZW50RHJvcEVmZmVjdCgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZERyYWdOYXRpdmVJdGVtKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuZW5kRHJhZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYW5jZWxIb3ZlcigpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdFN0YXJ0ID0gKGUpPT57XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgIC8vIE9ubHkgSUUgcmVxdWlyZXMgdXMgdG8gZXhwbGljaXRseSBzYXlcbiAgICAgICAgICAgIC8vIHdlIHdhbnQgZHJhZyBkcm9wIG9wZXJhdGlvbiB0byBzdGFydFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQuZHJhZ0Ryb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbnB1dHMgYW5kIHRleHRhcmVhcyBzaG91bGQgYmUgc2VsZWN0YWJsZVxuICAgICAgICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnU0VMRUNUJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0YXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb3Igb3RoZXIgdGFyZ2V0cywgYXNrIElFXG4gICAgICAgICAgICAvLyB0byBlbmFibGUgZHJhZyBhbmQgZHJvcFxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGFyZ2V0LmRyYWdEcm9wKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG5ldyBPcHRpb25zUmVhZGVyKGdsb2JhbENvbnRleHQsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSBtYW5hZ2VyLmdldEFjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5tb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yKCk7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSBtYW5hZ2VyLmdldFJlZ2lzdHJ5KCk7XG4gICAgICAgIHRoaXMuZW50ZXJMZWF2ZUNvdW50ZXIgPSBuZXcgRW50ZXJMZWF2ZUNvdW50ZXIodGhpcy5pc05vZGVJbkRvY3VtZW50KTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhUTUw1QmFja2VuZEltcGwuanMubWFwIiwiZXhwb3J0IGNsYXNzIE1vbm90b25pY0ludGVycG9sYW50IHtcbiAgICBpbnRlcnBvbGF0ZSh4KSB7XG4gICAgICAgIGNvbnN0IHsgeHMgLCB5cyAsIGMxcyAsIGMycyAsIGMzcyAgfSA9IHRoaXM7XG4gICAgICAgIC8vIFRoZSByaWdodG1vc3QgcG9pbnQgaW4gdGhlIGRhdGFzZXQgc2hvdWxkIGdpdmUgYW4gZXhhY3QgcmVzdWx0XG4gICAgICAgIGxldCBpID0geHMubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKHggPT09IHhzW2ldKSB7XG4gICAgICAgICAgICByZXR1cm4geXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgaW50ZXJ2YWwgeCBpcyBpbiwgcmV0dXJuaW5nIHRoZSBjb3JyZXNwb25kaW5nIHkgaWYgeCBpcyBvbmUgb2YgdGhlIG9yaWdpbmFsIHhzXG4gICAgICAgIGxldCBsb3cgPSAwO1xuICAgICAgICBsZXQgaGlnaCA9IGMzcy5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgbWlkO1xuICAgICAgICB3aGlsZShsb3cgPD0gaGlnaCl7XG4gICAgICAgICAgICBtaWQgPSBNYXRoLmZsb29yKDAuNSAqIChsb3cgKyBoaWdoKSk7XG4gICAgICAgICAgICBjb25zdCB4SGVyZSA9IHhzW21pZF07XG4gICAgICAgICAgICBpZiAoeEhlcmUgPCB4KSB7XG4gICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeEhlcmUgPiB4KSB7XG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB5c1ttaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGkgPSBNYXRoLm1heCgwLCBoaWdoKTtcbiAgICAgICAgLy8gSW50ZXJwb2xhdGVcbiAgICAgICAgY29uc3QgZGlmZiA9IHggLSB4c1tpXTtcbiAgICAgICAgY29uc3QgZGlmZlNxID0gZGlmZiAqIGRpZmY7XG4gICAgICAgIHJldHVybiB5c1tpXSArIGMxc1tpXSAqIGRpZmYgKyBjMnNbaV0gKiBkaWZmU3EgKyBjM3NbaV0gKiBkaWZmICogZGlmZlNxO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih4cywgeXMpe1xuICAgICAgICBjb25zdCB7IGxlbmd0aCAgfSA9IHhzO1xuICAgICAgICAvLyBSZWFycmFuZ2UgeHMgYW5kIHlzIHNvIHRoYXQgeHMgaXMgc29ydGVkXG4gICAgICAgIGNvbnN0IGluZGV4ZXMgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleGVzLnNvcnQoKGEsIGIpPT54c1thXSA8IHhzW2JdID8gLTEgOiAxXG4gICAgICAgICk7XG4gICAgICAgIC8vIEdldCBjb25zZWN1dGl2ZSBkaWZmZXJlbmNlcyBhbmQgc2xvcGVzXG4gICAgICAgIGNvbnN0IGR5cyA9IFtdO1xuICAgICAgICBjb25zdCBkeHMgPSBbXTtcbiAgICAgICAgY29uc3QgbXMgPSBbXTtcbiAgICAgICAgbGV0IGR4O1xuICAgICAgICBsZXQgZHk7XG4gICAgICAgIGZvcihsZXQgaTEgPSAwOyBpMSA8IGxlbmd0aCAtIDE7IGkxKyspe1xuICAgICAgICAgICAgZHggPSB4c1tpMSArIDFdIC0geHNbaTFdO1xuICAgICAgICAgICAgZHkgPSB5c1tpMSArIDFdIC0geXNbaTFdO1xuICAgICAgICAgICAgZHhzLnB1c2goZHgpO1xuICAgICAgICAgICAgZHlzLnB1c2goZHkpO1xuICAgICAgICAgICAgbXMucHVzaChkeSAvIGR4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBHZXQgZGVncmVlLTEgY29lZmZpY2llbnRzXG4gICAgICAgIGNvbnN0IGMxcyA9IFtcbiAgICAgICAgICAgIG1zWzBdXG4gICAgICAgIF07XG4gICAgICAgIGZvcihsZXQgaTIgPSAwOyBpMiA8IGR4cy5sZW5ndGggLSAxOyBpMisrKXtcbiAgICAgICAgICAgIGNvbnN0IG0yID0gbXNbaTJdO1xuICAgICAgICAgICAgY29uc3QgbU5leHQgPSBtc1tpMiArIDFdO1xuICAgICAgICAgICAgaWYgKG0yICogbU5leHQgPD0gMCkge1xuICAgICAgICAgICAgICAgIGMxcy5wdXNoKDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkeCA9IGR4c1tpMl07XG4gICAgICAgICAgICAgICAgY29uc3QgZHhOZXh0ID0gZHhzW2kyICsgMV07XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbW9uID0gZHggKyBkeE5leHQ7XG4gICAgICAgICAgICAgICAgYzFzLnB1c2goMyAqIGNvbW1vbiAvICgoY29tbW9uICsgZHhOZXh0KSAvIG0yICsgKGNvbW1vbiArIGR4KSAvIG1OZXh0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYzFzLnB1c2gobXNbbXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAvLyBHZXQgZGVncmVlLTIgYW5kIGRlZ3JlZS0zIGNvZWZmaWNpZW50c1xuICAgICAgICBjb25zdCBjMnMgPSBbXTtcbiAgICAgICAgY29uc3QgYzNzID0gW107XG4gICAgICAgIGxldCBtO1xuICAgICAgICBmb3IobGV0IGkzID0gMDsgaTMgPCBjMXMubGVuZ3RoIC0gMTsgaTMrKyl7XG4gICAgICAgICAgICBtID0gbXNbaTNdO1xuICAgICAgICAgICAgY29uc3QgYzEgPSBjMXNbaTNdO1xuICAgICAgICAgICAgY29uc3QgaW52RHggPSAxIC8gZHhzW2kzXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbiA9IGMxICsgYzFzW2kzICsgMV0gLSBtIC0gbTtcbiAgICAgICAgICAgIGMycy5wdXNoKChtIC0gYzEgLSBjb21tb24pICogaW52RHgpO1xuICAgICAgICAgICAgYzNzLnB1c2goY29tbW9uICogaW52RHggKiBpbnZEeCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54cyA9IHhzO1xuICAgICAgICB0aGlzLnlzID0geXM7XG4gICAgICAgIHRoaXMuYzFzID0gYzFzO1xuICAgICAgICB0aGlzLmMycyA9IGMycztcbiAgICAgICAgdGhpcy5jM3MgPSBjM3M7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb25vdG9uaWNJbnRlcnBvbGFudC5qcy5tYXAiLCJleHBvcnQgY2xhc3MgTmF0aXZlRHJhZ1NvdXJjZSB7XG4gICAgaW5pdGlhbGl6ZUV4cG9zZWRQcm9wZXJ0aWVzKCkge1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5leHBvc2VQcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eSk9PntcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLml0ZW0sIHByb3BlcnR5LCB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBCcm93c2VyIGRvZXNuJ3QgYWxsb3cgcmVhZGluZyBcIiR7cHJvcGVydHl9XCIgdW50aWwgdGhlIGRyb3AgZXZlbnQuYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbG9hZERhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgaWYgKGRhdGFUcmFuc2Zlcikge1xuICAgICAgICAgICAgY29uc3QgbmV3UHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5jb25maWcuZXhwb3NlUHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHkpPT57XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlGbiA9IHRoaXMuY29uZmlnLmV4cG9zZVByb3BlcnRpZXNbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUZuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllc1twcm9wZXJ0eV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlGbihkYXRhVHJhbnNmZXIsIHRoaXMuY29uZmlnLm1hdGNoZXNUeXBlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLml0ZW0sIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbkRyYWcoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBiZWdpbkRyYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW07XG4gICAgfVxuICAgIGlzRHJhZ2dpbmcobW9uaXRvciwgaGFuZGxlKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGUgPT09IG1vbml0b3IuZ2V0U291cmNlSWQoKTtcbiAgICB9XG4gICAgZW5kRHJhZygpIHtcbiAgICAvLyBlbXB0eVxuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpe1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5pdGVtID0ge307XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUV4cG9zZWRQcm9wZXJ0aWVzKCk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYXRpdmVEcmFnU291cmNlLmpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiBnZXREYXRhRnJvbURhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXIsIHR5cGVzVG9UcnksIGRlZmF1bHRWYWx1ZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHR5cGVzVG9UcnkucmVkdWNlKChyZXN1bHRTb0ZhciwgdHlwZVRvVHJ5KT0+cmVzdWx0U29GYXIgfHwgZGF0YVRyYW5zZmVyLmdldERhdGEodHlwZVRvVHJ5KVxuICAgICwgJycpO1xuICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IGRlZmF1bHRWYWx1ZTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0RGF0YUZyb21EYXRhVHJhbnNmZXIuanMubWFwIiwiaW1wb3J0IHsgTmF0aXZlRHJhZ1NvdXJjZSB9IGZyb20gJy4vTmF0aXZlRHJhZ1NvdXJjZS5qcyc7XG5pbXBvcnQgeyBuYXRpdmVUeXBlc0NvbmZpZyB9IGZyb20gJy4vbmF0aXZlVHlwZXNDb25maWcuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5hdGl2ZURyYWdTb3VyY2UodHlwZSwgZGF0YVRyYW5zZmVyKSB7XG4gICAgY29uc3QgY29uZmlnID0gbmF0aXZlVHlwZXNDb25maWdbdHlwZV07XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBuYXRpdmUgdHlwZSAke3R5cGV9IGhhcyBubyBjb25maWd1cmF0aW9uYCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBOYXRpdmVEcmFnU291cmNlKGNvbmZpZyk7XG4gICAgcmVzdWx0LmxvYWREYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoTmF0aXZlSXRlbVR5cGUoZGF0YVRyYW5zZmVyKSB7XG4gICAgaWYgKCFkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGRhdGFUcmFuc2ZlclR5cGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YVRyYW5zZmVyLnR5cGVzIHx8IFtdKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobmF0aXZlVHlwZXNDb25maWcpLmZpbHRlcigobmF0aXZlSXRlbVR5cGUpPT57XG4gICAgICAgIGNvbnN0IHR5cGVDb25maWcgPSBuYXRpdmVUeXBlc0NvbmZpZ1tuYXRpdmVJdGVtVHlwZV07XG4gICAgICAgIGlmICghKHR5cGVDb25maWcgPT09IG51bGwgfHwgdHlwZUNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdHlwZUNvbmZpZy5tYXRjaGVzVHlwZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGVDb25maWcubWF0Y2hlc1R5cGVzLnNvbWUoKHQpPT5kYXRhVHJhbnNmZXJUeXBlcy5pbmRleE9mKHQpID4gLTFcbiAgICAgICAgKTtcbiAgICB9KVswXSB8fCBudWxsO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgKiBhcyBOYXRpdmVUeXBlcyBmcm9tICcuLi9OYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgeyBnZXREYXRhRnJvbURhdGFUcmFuc2ZlciB9IGZyb20gJy4vZ2V0RGF0YUZyb21EYXRhVHJhbnNmZXIuanMnO1xuZXhwb3J0IGNvbnN0IG5hdGl2ZVR5cGVzQ29uZmlnID0ge1xuICAgIFtOYXRpdmVUeXBlcy5GSUxFXToge1xuICAgICAgICBleHBvc2VQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBmaWxlczogKGRhdGFUcmFuc2Zlcik9PkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRhdGFUcmFuc2Zlci5maWxlcylcbiAgICAgICAgICAgICxcbiAgICAgICAgICAgIGl0ZW1zOiAoZGF0YVRyYW5zZmVyKT0+ZGF0YVRyYW5zZmVyLml0ZW1zXG4gICAgICAgICAgICAsXG4gICAgICAgICAgICBkYXRhVHJhbnNmZXI6IChkYXRhVHJhbnNmZXIpPT5kYXRhVHJhbnNmZXJcbiAgICAgICAgfSxcbiAgICAgICAgbWF0Y2hlc1R5cGVzOiBbXG4gICAgICAgICAgICAnRmlsZXMnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIFtOYXRpdmVUeXBlcy5IVE1MXToge1xuICAgICAgICBleHBvc2VQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBodG1sOiAoZGF0YVRyYW5zZmVyLCBtYXRjaGVzVHlwZXMpPT5nZXREYXRhRnJvbURhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXIsIG1hdGNoZXNUeXBlcywgJycpXG4gICAgICAgICAgICAsXG4gICAgICAgICAgICBkYXRhVHJhbnNmZXI6IChkYXRhVHJhbnNmZXIpPT5kYXRhVHJhbnNmZXJcbiAgICAgICAgfSxcbiAgICAgICAgbWF0Y2hlc1R5cGVzOiBbXG4gICAgICAgICAgICAnSHRtbCcsXG4gICAgICAgICAgICAndGV4dC9odG1sJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBbTmF0aXZlVHlwZXMuVVJMXToge1xuICAgICAgICBleHBvc2VQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB1cmxzOiAoZGF0YVRyYW5zZmVyLCBtYXRjaGVzVHlwZXMpPT5nZXREYXRhRnJvbURhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXIsIG1hdGNoZXNUeXBlcywgJycpLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLFxuICAgICAgICAgICAgZGF0YVRyYW5zZmVyOiAoZGF0YVRyYW5zZmVyKT0+ZGF0YVRyYW5zZmVyXG4gICAgICAgIH0sXG4gICAgICAgIG1hdGNoZXNUeXBlczogW1xuICAgICAgICAgICAgJ1VybCcsXG4gICAgICAgICAgICAndGV4dC91cmktbGlzdCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgW05hdGl2ZVR5cGVzLlRFWFRdOiB7XG4gICAgICAgIGV4cG9zZVByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRleHQ6IChkYXRhVHJhbnNmZXIsIG1hdGNoZXNUeXBlcyk9PmdldERhdGFGcm9tRGF0YVRyYW5zZmVyKGRhdGFUcmFuc2ZlciwgbWF0Y2hlc1R5cGVzLCAnJylcbiAgICAgICAgICAgICxcbiAgICAgICAgICAgIGRhdGFUcmFuc2ZlcjogKGRhdGFUcmFuc2Zlcik9PmRhdGFUcmFuc2ZlclxuICAgICAgICB9LFxuICAgICAgICBtYXRjaGVzVHlwZXM6IFtcbiAgICAgICAgICAgICdUZXh0JyxcbiAgICAgICAgICAgICd0ZXh0L3BsYWluJ1xuICAgICAgICBdXG4gICAgfVxufTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmF0aXZlVHlwZXNDb25maWcuanMubWFwIiwiZXhwb3J0IGNvbnN0IEZJTEUgPSAnX19OQVRJVkVfRklMRV9fJztcbmV4cG9ydCBjb25zdCBVUkwgPSAnX19OQVRJVkVfVVJMX18nO1xuZXhwb3J0IGNvbnN0IFRFWFQgPSAnX19OQVRJVkVfVEVYVF9fJztcbmV4cG9ydCBjb25zdCBIVE1MID0gJ19fTkFUSVZFX0hUTUxfXyc7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5hdGl2ZVR5cGVzLmpzLm1hcCIsImltcG9ydCB7IGlzRmlyZWZveCwgaXNTYWZhcmkgfSBmcm9tICcuL0Jyb3dzZXJEZXRlY3Rvci5qcyc7XG5pbXBvcnQgeyBNb25vdG9uaWNJbnRlcnBvbGFudCB9IGZyb20gJy4vTW9ub3RvbmljSW50ZXJwb2xhbnQuanMnO1xuY29uc3QgRUxFTUVOVF9OT0RFID0gMTtcbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlQ2xpZW50T2Zmc2V0KG5vZGUpIHtcbiAgICBjb25zdCBlbCA9IG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSA/IG5vZGUgOiBub2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyB0b3AgLCBsZWZ0ICB9ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogbGVmdCxcbiAgICAgICAgeTogdG9wXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRFdmVudENsaWVudE9mZnNldChlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogZS5jbGllbnRYLFxuICAgICAgICB5OiBlLmNsaWVudFlcbiAgICB9O1xufVxuZnVuY3Rpb24gaXNJbWFnZU5vZGUobm9kZSkge1xuICAgIHZhciByZWY7XG4gICAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09ICdJTUcnICYmIChpc0ZpcmVmb3goKSB8fCAhKChyZWYgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpID09PSBudWxsIHx8IHJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmLmNvbnRhaW5zKG5vZGUpKSk7XG59XG5mdW5jdGlvbiBnZXREcmFnUHJldmlld1NpemUoaXNJbWFnZSwgZHJhZ1ByZXZpZXcsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQpIHtcbiAgICBsZXQgZHJhZ1ByZXZpZXdXaWR0aCA9IGlzSW1hZ2UgPyBkcmFnUHJldmlldy53aWR0aCA6IHNvdXJjZVdpZHRoO1xuICAgIGxldCBkcmFnUHJldmlld0hlaWdodCA9IGlzSW1hZ2UgPyBkcmFnUHJldmlldy5oZWlnaHQgOiBzb3VyY2VIZWlnaHQ7XG4gICAgLy8gV29yayBhcm91bmQgQDJ4IGNvb3JkaW5hdGUgZGlzY3JlcGFuY2llcyBpbiBicm93c2Vyc1xuICAgIGlmIChpc1NhZmFyaSgpICYmIGlzSW1hZ2UpIHtcbiAgICAgICAgZHJhZ1ByZXZpZXdIZWlnaHQgLz0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIGRyYWdQcmV2aWV3V2lkdGggLz0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGRyYWdQcmV2aWV3V2lkdGgsXG4gICAgICAgIGRyYWdQcmV2aWV3SGVpZ2h0XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREcmFnUHJldmlld09mZnNldChzb3VyY2VOb2RlLCBkcmFnUHJldmlldywgY2xpZW50T2Zmc2V0LCBhbmNob3JQb2ludCwgb2Zmc2V0UG9pbnQpIHtcbiAgICAvLyBUaGUgYnJvd3NlcnMgd2lsbCB1c2UgdGhlIGltYWdlIGludHJpbnNpYyBzaXplIHVuZGVyIGRpZmZlcmVudCBjb25kaXRpb25zLlxuICAgIC8vIEZpcmVmb3ggb25seSBjYXJlcyBpZiBpdCdzIGFuIGltYWdlLCBidXQgV2ViS2l0IGFsc28gd2FudHMgaXQgdG8gYmUgZGV0YWNoZWQuXG4gICAgY29uc3QgaXNJbWFnZSA9IGlzSW1hZ2VOb2RlKGRyYWdQcmV2aWV3KTtcbiAgICBjb25zdCBkcmFnUHJldmlld05vZGUgPSBpc0ltYWdlID8gc291cmNlTm9kZSA6IGRyYWdQcmV2aWV3O1xuICAgIGNvbnN0IGRyYWdQcmV2aWV3Tm9kZU9mZnNldEZyb21DbGllbnQgPSBnZXROb2RlQ2xpZW50T2Zmc2V0KGRyYWdQcmV2aWV3Tm9kZSk7XG4gICAgY29uc3Qgb2Zmc2V0RnJvbURyYWdQcmV2aWV3ID0ge1xuICAgICAgICB4OiBjbGllbnRPZmZzZXQueCAtIGRyYWdQcmV2aWV3Tm9kZU9mZnNldEZyb21DbGllbnQueCxcbiAgICAgICAgeTogY2xpZW50T2Zmc2V0LnkgLSBkcmFnUHJldmlld05vZGVPZmZzZXRGcm9tQ2xpZW50LnlcbiAgICB9O1xuICAgIGNvbnN0IHsgb2Zmc2V0V2lkdGg6IHNvdXJjZVdpZHRoICwgb2Zmc2V0SGVpZ2h0OiBzb3VyY2VIZWlnaHQgIH0gPSBzb3VyY2VOb2RlO1xuICAgIGNvbnN0IHsgYW5jaG9yWCAsIGFuY2hvclkgIH0gPSBhbmNob3JQb2ludDtcbiAgICBjb25zdCB7IGRyYWdQcmV2aWV3V2lkdGggLCBkcmFnUHJldmlld0hlaWdodCAgfSA9IGdldERyYWdQcmV2aWV3U2l6ZShpc0ltYWdlLCBkcmFnUHJldmlldywgc291cmNlV2lkdGgsIHNvdXJjZUhlaWdodCk7XG4gICAgY29uc3QgY2FsY3VsYXRlWU9mZnNldCA9ICgpPT57XG4gICAgICAgIGNvbnN0IGludGVycG9sYW50WSA9IG5ldyBNb25vdG9uaWNJbnRlcnBvbGFudChbXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMC41LFxuICAgICAgICAgICAgMVxuICAgICAgICBdLCBbXG4gICAgICAgICAgICAvLyBEb2NrIHRvIHRoZSB0b3BcbiAgICAgICAgICAgIG9mZnNldEZyb21EcmFnUHJldmlldy55LFxuICAgICAgICAgICAgLy8gQWxpZ24gYXQgdGhlIGNlbnRlclxuICAgICAgICAgICAgKG9mZnNldEZyb21EcmFnUHJldmlldy55IC8gc291cmNlSGVpZ2h0KSAqIGRyYWdQcmV2aWV3SGVpZ2h0LFxuICAgICAgICAgICAgLy8gRG9jayB0byB0aGUgYm90dG9tXG4gICAgICAgICAgICBvZmZzZXRGcm9tRHJhZ1ByZXZpZXcueSArIGRyYWdQcmV2aWV3SGVpZ2h0IC0gc291cmNlSGVpZ2h0LCBcbiAgICAgICAgXSk7XG4gICAgICAgIGxldCB5ID0gaW50ZXJwb2xhbnRZLmludGVycG9sYXRlKGFuY2hvclkpO1xuICAgICAgICAvLyBXb3JrIGFyb3VuZCBTYWZhcmkgOCBwb3NpdGlvbmluZyBidWdcbiAgICAgICAgaWYgKGlzU2FmYXJpKCkgJiYgaXNJbWFnZSkge1xuICAgICAgICAgICAgLy8gV2UnbGwgaGF2ZSB0byB3YWl0IGZvciBAM3ggdG8gc2VlIGlmIHRoaXMgaXMgZW50aXJlbHkgY29ycmVjdFxuICAgICAgICAgICAgeSArPSAod2luZG93LmRldmljZVBpeGVsUmF0aW8gLSAxKSAqIGRyYWdQcmV2aWV3SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5O1xuICAgIH07XG4gICAgY29uc3QgY2FsY3VsYXRlWE9mZnNldCA9ICgpPT57XG4gICAgICAgIC8vIEludGVycG9sYXRlIGNvb3JkaW5hdGVzIGRlcGVuZGluZyBvbiBhbmNob3IgcG9pbnRcbiAgICAgICAgLy8gSWYgeW91IGtub3cgYSBzaW1wbGVyIHdheSB0byBkbyB0aGlzLCBsZXQgbWUga25vd1xuICAgICAgICBjb25zdCBpbnRlcnBvbGFudFggPSBuZXcgTW9ub3RvbmljSW50ZXJwb2xhbnQoW1xuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAuNSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgXSwgW1xuICAgICAgICAgICAgLy8gRG9jayB0byB0aGUgbGVmdFxuICAgICAgICAgICAgb2Zmc2V0RnJvbURyYWdQcmV2aWV3LngsXG4gICAgICAgICAgICAvLyBBbGlnbiBhdCB0aGUgY2VudGVyXG4gICAgICAgICAgICAob2Zmc2V0RnJvbURyYWdQcmV2aWV3LnggLyBzb3VyY2VXaWR0aCkgKiBkcmFnUHJldmlld1dpZHRoLFxuICAgICAgICAgICAgLy8gRG9jayB0byB0aGUgcmlnaHRcbiAgICAgICAgICAgIG9mZnNldEZyb21EcmFnUHJldmlldy54ICsgZHJhZ1ByZXZpZXdXaWR0aCAtIHNvdXJjZVdpZHRoLCBcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBpbnRlcnBvbGFudFguaW50ZXJwb2xhdGUoYW5jaG9yWCk7XG4gICAgfTtcbiAgICAvLyBGb3JjZSBvZmZzZXRzIGlmIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy5cbiAgICBjb25zdCB7IG9mZnNldFggLCBvZmZzZXRZICB9ID0gb2Zmc2V0UG9pbnQ7XG4gICAgY29uc3QgaXNNYW51YWxPZmZzZXRYID0gb2Zmc2V0WCA9PT0gMCB8fCBvZmZzZXRYO1xuICAgIGNvbnN0IGlzTWFudWFsT2Zmc2V0WSA9IG9mZnNldFkgPT09IDAgfHwgb2Zmc2V0WTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBpc01hbnVhbE9mZnNldFggPyBvZmZzZXRYIDogY2FsY3VsYXRlWE9mZnNldCgpLFxuICAgICAgICB5OiBpc01hbnVhbE9mZnNldFkgPyBvZmZzZXRZIDogY2FsY3VsYXRlWU9mZnNldCgpXG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2Zmc2V0VXRpbHMuanMubWFwIiwiZXhwb3J0IGNsYXNzIE9wdGlvbnNSZWFkZXIge1xuICAgIGdldCB3aW5kb3coKSB7XG4gICAgICAgIGlmICh0aGlzLmdsb2JhbENvbnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdsb2JhbENvbnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IGRvY3VtZW50KCkge1xuICAgICAgICB2YXIgcmVmO1xuICAgICAgICBpZiAoKHJlZiA9IHRoaXMuZ2xvYmFsQ29udGV4dCkgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdsb2JhbENvbnRleHQuZG9jdW1lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICB2YXIgcmVmO1xuICAgICAgICByZXR1cm4gKChyZWYgPSB0aGlzLm9wdGlvbnNBcmdzKSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5yb290RWxlbWVudCkgfHwgdGhpcy53aW5kb3c7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGdsb2JhbENvbnRleHQsIG9wdGlvbnMpe1xuICAgICAgICB0aGlzLm93bmVyRG9jdW1lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmdsb2JhbENvbnRleHQgPSBnbG9iYWxDb250ZXh0O1xuICAgICAgICB0aGlzLm9wdGlvbnNBcmdzID0gb3B0aW9ucztcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9wdGlvbnNSZWFkZXIuanMubWFwIiwibGV0IGVtcHR5SW1hZ2U7XG5leHBvcnQgZnVuY3Rpb24gZ2V0RW1wdHlJbWFnZSgpIHtcbiAgICBpZiAoIWVtcHR5SW1hZ2UpIHtcbiAgICAgICAgZW1wdHlJbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBlbXB0eUltYWdlLnNyYyA9ICdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFBQUFDSDVCQUVLQUFFQUxBQUFBQUFCQUFFQUFBSUNUQUVBT3c9PSc7XG4gICAgfVxuICAgIHJldHVybiBlbXB0eUltYWdlO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRFbXB0eUltYWdlLmpzLm1hcCIsImltcG9ydCB7IEhUTUw1QmFja2VuZEltcGwgfSBmcm9tICcuL0hUTUw1QmFja2VuZEltcGwuanMnO1xuaW1wb3J0ICogYXMgX05hdGl2ZVR5cGVzIGZyb20gJy4vTmF0aXZlVHlwZXMuanMnO1xuZXhwb3J0IHsgZ2V0RW1wdHlJbWFnZSB9IGZyb20gJy4vZ2V0RW1wdHlJbWFnZS5qcyc7XG5leHBvcnQgeyBfTmF0aXZlVHlwZXMgYXMgTmF0aXZlVHlwZXMgfTtcbmV4cG9ydCBjb25zdCBIVE1MNUJhY2tlbmQgPSBmdW5jdGlvbiBjcmVhdGVCYWNrZW5kKG1hbmFnZXIsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEhUTUw1QmFja2VuZEltcGwobWFuYWdlciwgY29udGV4dCwgb3B0aW9ucyk7XG59O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyBjaGVhcCBsb2Rhc2ggcmVwbGFjZW1lbnRzXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZShmbikge1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGNvbnN0IG1lbW9pemVkID0gKCk9PntcbiAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmbigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICByZXR1cm4gbWVtb2l6ZWQ7XG59XG4vKipcbiAqIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIF8ud2l0aG91dFxuICovIGV4cG9ydCBmdW5jdGlvbiB3aXRob3V0KGl0ZW1zLCBpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaSk9PmkgIT09IGl0ZW1cbiAgICApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uKGl0ZW1zQSwgaXRlbXNCKSB7XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGluc2VydEl0ZW0gPSAoaXRlbSk9PnNldC5hZGQoaXRlbSlcbiAgICA7XG4gICAgaXRlbXNBLmZvckVhY2goaW5zZXJ0SXRlbSk7XG4gICAgaXRlbXNCLmZvckVhY2goaW5zZXJ0SXRlbSk7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgc2V0LmZvckVhY2goKGtleSk9PnJlc3VsdC5wdXNoKGtleSlcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWpzX3V0aWxzLmpzLm1hcCIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIENyZWF0ZSB0aGUgUmVhY3QgQ29udGV4dFxuICovIGV4cG9ydCBjb25zdCBEbmRDb250ZXh0ID0gY3JlYXRlQ29udGV4dCh7XG4gICAgZHJhZ0Ryb3BNYW5hZ2VyOiB1bmRlZmluZWRcbn0pO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EbmRDb250ZXh0LmpzLm1hcCIsImZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gICAgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpO1xuICAgIHZhciBrZXksIGk7XG4gICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTtcbiAgICAgICAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICAgIHZhciB0YXJnZXQgPSB7fTtcbiAgICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgdmFyIGtleSwgaTtcbiAgICBmb3IoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBjcmVhdGVEcmFnRHJvcE1hbmFnZXIgfSBmcm9tICdkbmQtY29yZSc7XG5pbXBvcnQgeyBtZW1vLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBEbmRDb250ZXh0IH0gZnJvbSAnLi9EbmRDb250ZXh0LmpzJztcbmxldCByZWZDb3VudCA9IDA7XG5jb25zdCBJTlNUQU5DRV9TWU0gPSBTeW1ib2wuZm9yKCdfX1JFQUNUX0RORF9DT05URVhUX0lOU1RBTkNFX18nKTtcbnZhciBEbmRQcm92aWRlciA9IC8qI19fUFVSRV9fKi8gbWVtbyhmdW5jdGlvbiBEbmRQcm92aWRlcihfcGFyYW0pIHtcbiAgICB2YXIgeyBjaGlsZHJlbiAgfSA9IF9wYXJhbSwgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3BhcmFtLCBbXG4gICAgICAgIFwiY2hpbGRyZW5cIlxuICAgIF0pO1xuICAgIGNvbnN0IFttYW5hZ2VyLCBpc0dsb2JhbEluc3RhbmNlXSA9IGdldERuZENvbnRleHRWYWx1ZShwcm9wcykgLy8gbWVtb2l6ZWQgZnJvbSBwcm9wc1xuICAgIDtcbiAgICAvKipcblx0XHQgKiBJZiB0aGUgZ2xvYmFsIGNvbnRleHQgd2FzIHVzZWQgdG8gc3RvcmUgdGhlIERORCBjb250ZXh0XG5cdFx0ICogdGhlbiB3aGVyZSB0aGVyZXMgbm8gbW9yZSByZWZlcmVuY2VzIHRvIGl0IHdlIHNob3VsZFxuXHRcdCAqIGNsZWFuIGl0IHVwIHRvIGF2b2lkIG1lbW9yeSBsZWFrc1xuXHRcdCAqLyB1c2VFZmZlY3QoKCk9PntcbiAgICAgICAgaWYgKGlzR2xvYmFsSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRHbG9iYWxDb250ZXh0KCk7XG4gICAgICAgICAgICArK3JlZkNvdW50O1xuICAgICAgICAgICAgcmV0dXJuICgpPT57XG4gICAgICAgICAgICAgICAgaWYgKC0tcmVmQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFtJTlNUQU5DRV9TWU1dID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi8gX2pzeChEbmRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiBtYW5hZ2VyLFxuICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICB9KTtcbn0pO1xuLyoqXG4gKiBBIFJlYWN0IGNvbXBvbmVudCB0aGF0IHByb3ZpZGVzIHRoZSBSZWFjdC1EbkQgY29udGV4dFxuICovIGV4cG9ydCB7IERuZFByb3ZpZGVyLCAgfTtcbmZ1bmN0aW9uIGdldERuZENvbnRleHRWYWx1ZShwcm9wcykge1xuICAgIGlmICgnbWFuYWdlcicgaW4gcHJvcHMpIHtcbiAgICAgICAgY29uc3QgbWFuYWdlciA9IHtcbiAgICAgICAgICAgIGRyYWdEcm9wTWFuYWdlcjogcHJvcHMubWFuYWdlclxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbWFuYWdlcixcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IG1hbmFnZXIgPSBjcmVhdGVTaW5nbGV0b25EbmRDb250ZXh0KHByb3BzLmJhY2tlbmQsIHByb3BzLmNvbnRleHQsIHByb3BzLm9wdGlvbnMsIHByb3BzLmRlYnVnTW9kZSk7XG4gICAgY29uc3QgaXNHbG9iYWxJbnN0YW5jZSA9ICFwcm9wcy5jb250ZXh0O1xuICAgIHJldHVybiBbXG4gICAgICAgIG1hbmFnZXIsXG4gICAgICAgIGlzR2xvYmFsSW5zdGFuY2VcbiAgICBdO1xufVxuZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uRG5kQ29udGV4dChiYWNrZW5kLCBjb250ZXh0ID0gZ2V0R2xvYmFsQ29udGV4dCgpLCBvcHRpb25zLCBkZWJ1Z01vZGUpIHtcbiAgICBjb25zdCBjdHggPSBjb250ZXh0O1xuICAgIGlmICghY3R4W0lOU1RBTkNFX1NZTV0pIHtcbiAgICAgICAgY3R4W0lOU1RBTkNFX1NZTV0gPSB7XG4gICAgICAgICAgICBkcmFnRHJvcE1hbmFnZXI6IGNyZWF0ZURyYWdEcm9wTWFuYWdlcihiYWNrZW5kLCBjb250ZXh0LCBvcHRpb25zLCBkZWJ1Z01vZGUpXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjdHhbSU5TVEFOQ0VfU1lNXTtcbn1cbmZ1bmN0aW9uIGdldEdsb2JhbENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EbmRQcm92aWRlci5qcy5tYXAiLCIndXNlIGNsaWVudCc7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBmb3J3YXJkUmVmLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFrZUV2ZW50UHJvcHMgZnJvbSAnbWFrZS1ldmVudC1wcm9wcyc7XG5pbXBvcnQgbWFrZUNhbmNlbGxhYmxlIGZyb20gJ21ha2UtY2FuY2VsbGFibGUtcHJvbWlzZSc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgeyBkZXF1YWwgfSBmcm9tICdkZXF1YWwnO1xuaW1wb3J0ICogYXMgcGRmanMgZnJvbSAncGRmanMtZGlzdCc7XG5pbXBvcnQgRG9jdW1lbnRDb250ZXh0IGZyb20gJy4vRG9jdW1lbnRDb250ZXh0LmpzJztcbmltcG9ydCBNZXNzYWdlIGZyb20gJy4vTWVzc2FnZS5qcyc7XG5pbXBvcnQgTGlua1NlcnZpY2UgZnJvbSAnLi9MaW5rU2VydmljZS5qcyc7XG5pbXBvcnQgUGFzc3dvcmRSZXNwb25zZXMgZnJvbSAnLi9QYXNzd29yZFJlc3BvbnNlcy5qcyc7XG5pbXBvcnQgeyBjYW5jZWxSdW5uaW5nVGFzaywgZGF0YVVSSXRvQnl0ZVN0cmluZywgZGlzcGxheUNPUlNXYXJuaW5nLCBpc0FycmF5QnVmZmVyLCBpc0Jsb2IsIGlzQnJvd3NlciwgaXNEYXRhVVJJLCBsb2FkRnJvbUZpbGUsIH0gZnJvbSAnLi9zaGFyZWQvdXRpbHMuanMnO1xuaW1wb3J0IHVzZVJlc29sdmVyIGZyb20gJy4vc2hhcmVkL2hvb2tzL3VzZVJlc29sdmVyLmpzJztcbmNvbnN0IHsgUERGRGF0YVJhbmdlVHJhbnNwb3J0IH0gPSBwZGZqcztcbmNvbnN0IGRlZmF1bHRPblBhc3N3b3JkID0gKGNhbGxiYWNrLCByZWFzb24pID0+IHtcbiAgICBzd2l0Y2ggKHJlYXNvbikge1xuICAgICAgICBjYXNlIFBhc3N3b3JkUmVzcG9uc2VzLk5FRURfUEFTU1dPUkQ6IHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkID0gcHJvbXB0KCdFbnRlciB0aGUgcGFzc3dvcmQgdG8gb3BlbiB0aGlzIFBERiBmaWxlLicpO1xuICAgICAgICAgICAgY2FsbGJhY2socGFzc3dvcmQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQYXNzd29yZFJlc3BvbnNlcy5JTkNPUlJFQ1RfUEFTU1dPUkQ6IHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkID0gcHJvbXB0KCdJbnZhbGlkIHBhc3N3b3JkLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgICAgICAgICAgY2FsbGJhY2socGFzc3dvcmQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICB9XG59O1xuZnVuY3Rpb24gaXNQYXJhbWV0ZXJPYmplY3QoZmlsZSkge1xuICAgIHJldHVybiAodHlwZW9mIGZpbGUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIGZpbGUgIT09IG51bGwgJiZcbiAgICAgICAgKCdkYXRhJyBpbiBmaWxlIHx8ICdyYW5nZScgaW4gZmlsZSB8fCAndXJsJyBpbiBmaWxlKSk7XG59XG4vKipcbiAqIExvYWRzIGEgZG9jdW1lbnQgcGFzc2VkIHVzaW5nIGBmaWxlYCBwcm9wLlxuICovXG5jb25zdCBEb2N1bWVudCA9IGZvcndhcmRSZWYoZnVuY3Rpb24gRG9jdW1lbnQoX2EsIHJlZikge1xuICAgIHZhciB7IGNoaWxkcmVuLCBjbGFzc05hbWUsIGVycm9yID0gJ0ZhaWxlZCB0byBsb2FkIFBERiBmaWxlLicsIGV4dGVybmFsTGlua1JlbCwgZXh0ZXJuYWxMaW5rVGFyZ2V0LCBmaWxlLCBpbnB1dFJlZiwgaW1hZ2VSZXNvdXJjZXNQYXRoLCBsb2FkaW5nID0gJ0xvYWRpbmcgUERG4oCmJywgbm9EYXRhID0gJ05vIFBERiBmaWxlIHNwZWNpZmllZC4nLCBvbkl0ZW1DbGljaywgb25Mb2FkRXJyb3I6IG9uTG9hZEVycm9yUHJvcHMsIG9uTG9hZFByb2dyZXNzLCBvbkxvYWRTdWNjZXNzOiBvbkxvYWRTdWNjZXNzUHJvcHMsIG9uUGFzc3dvcmQgPSBkZWZhdWx0T25QYXNzd29yZCwgb25Tb3VyY2VFcnJvcjogb25Tb3VyY2VFcnJvclByb3BzLCBvblNvdXJjZVN1Y2Nlc3M6IG9uU291cmNlU3VjY2Vzc1Byb3BzLCBvcHRpb25zLCByZW5kZXJNb2RlLCByb3RhdGUgfSA9IF9hLCBvdGhlclByb3BzID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImVycm9yXCIsIFwiZXh0ZXJuYWxMaW5rUmVsXCIsIFwiZXh0ZXJuYWxMaW5rVGFyZ2V0XCIsIFwiZmlsZVwiLCBcImlucHV0UmVmXCIsIFwiaW1hZ2VSZXNvdXJjZXNQYXRoXCIsIFwibG9hZGluZ1wiLCBcIm5vRGF0YVwiLCBcIm9uSXRlbUNsaWNrXCIsIFwib25Mb2FkRXJyb3JcIiwgXCJvbkxvYWRQcm9ncmVzc1wiLCBcIm9uTG9hZFN1Y2Nlc3NcIiwgXCJvblBhc3N3b3JkXCIsIFwib25Tb3VyY2VFcnJvclwiLCBcIm9uU291cmNlU3VjY2Vzc1wiLCBcIm9wdGlvbnNcIiwgXCJyZW5kZXJNb2RlXCIsIFwicm90YXRlXCJdKTtcbiAgICBjb25zdCBbc291cmNlU3RhdGUsIHNvdXJjZURpc3BhdGNoXSA9IHVzZVJlc29sdmVyKCk7XG4gICAgY29uc3QgeyB2YWx1ZTogc291cmNlLCBlcnJvcjogc291cmNlRXJyb3IgfSA9IHNvdXJjZVN0YXRlO1xuICAgIGNvbnN0IFtwZGZTdGF0ZSwgcGRmRGlzcGF0Y2hdID0gdXNlUmVzb2x2ZXIoKTtcbiAgICBjb25zdCB7IHZhbHVlOiBwZGYsIGVycm9yOiBwZGZFcnJvciB9ID0gcGRmU3RhdGU7XG4gICAgY29uc3QgbGlua1NlcnZpY2UgPSB1c2VSZWYobmV3IExpbmtTZXJ2aWNlKCkpO1xuICAgIGNvbnN0IHBhZ2VzID0gdXNlUmVmKFtdKTtcbiAgICBjb25zdCBwcmV2RmlsZSA9IHVzZVJlZih1bmRlZmluZWQpO1xuICAgIGNvbnN0IHByZXZPcHRpb25zID0gdXNlUmVmKHVuZGVmaW5lZCk7XG4gICAgaWYgKGZpbGUgJiYgZmlsZSAhPT0gcHJldkZpbGUuY3VycmVudCAmJiBpc1BhcmFtZXRlck9iamVjdChmaWxlKSkge1xuICAgICAgICB3YXJuaW5nKCFkZXF1YWwoZmlsZSwgcHJldkZpbGUuY3VycmVudCksIGBGaWxlIHByb3AgcGFzc2VkIHRvIDxEb2N1bWVudCAvPiBjaGFuZ2VkLCBidXQgaXQncyBlcXVhbCB0byBwcmV2aW91cyBvbmUuIFRoaXMgbWlnaHQgcmVzdWx0IGluIHVubmVjZXNzYXJ5IHJlbG9hZHMuIENvbnNpZGVyIG1lbW9pemluZyB0aGUgdmFsdWUgcGFzc2VkIHRvIFwiZmlsZVwiIHByb3AuYCk7XG4gICAgICAgIHByZXZGaWxlLmN1cnJlbnQgPSBmaWxlO1xuICAgIH1cbiAgICAvLyBEZXRlY3Qgbm9uLW1lbW9pemVkIGNoYW5nZXMgaW4gb3B0aW9ucyBwcm9wXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucyAhPT0gcHJldk9wdGlvbnMuY3VycmVudCkge1xuICAgICAgICB3YXJuaW5nKCFkZXF1YWwob3B0aW9ucywgcHJldk9wdGlvbnMuY3VycmVudCksIGBPcHRpb25zIHByb3AgcGFzc2VkIHRvIDxEb2N1bWVudCAvPiBjaGFuZ2VkLCBidXQgaXQncyBlcXVhbCB0byBwcmV2aW91cyBvbmUuIFRoaXMgbWlnaHQgcmVzdWx0IGluIHVubmVjZXNzYXJ5IHJlbG9hZHMuIENvbnNpZGVyIG1lbW9pemluZyB0aGUgdmFsdWUgcGFzc2VkIHRvIFwib3B0aW9uc1wiIHByb3AuYCk7XG4gICAgICAgIHByZXZPcHRpb25zLmN1cnJlbnQgPSBvcHRpb25zO1xuICAgIH1cbiAgICBjb25zdCB2aWV3ZXIgPSB1c2VSZWYoe1xuICAgICAgICAvLyBIYW5kbGluZyBqdW1waW5nIHRvIGludGVybmFsIGxpbmtzIHRhcmdldFxuICAgICAgICBzY3JvbGxQYWdlSW50b1ZpZXc6IChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGRlc3QsIHBhZ2VOdW1iZXIsIHBhZ2VJbmRleCA9IHBhZ2VOdW1iZXIgLSAxIH0gPSBhcmdzO1xuICAgICAgICAgICAgLy8gRmlyc3QsIGNoZWNrIGlmIGN1c3RvbSBoYW5kbGluZyBvZiBvbkl0ZW1DbGljayB3YXMgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChvbkl0ZW1DbGljaykge1xuICAgICAgICAgICAgICAgIG9uSXRlbUNsaWNrKHsgZGVzdCwgcGFnZUluZGV4LCBwYWdlTnVtYmVyIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIG5vdCwgdHJ5IHRvIGxvb2sgZm9yIHRhcmdldCBwYWdlIHdpdGhpbiB0aGUgPERvY3VtZW50Pi5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBwYWdlcy5jdXJyZW50W3BhZ2VJbmRleF07XG4gICAgICAgICAgICBpZiAocGFnZSkge1xuICAgICAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgcGFnZSBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgICAgICAgcGFnZS5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhcm5pbmcoZmFsc2UsIGBBbiBpbnRlcm5hbCBsaW5rIGxlYWRpbmcgdG8gcGFnZSAke3BhZ2VOdW1iZXJ9IHdhcyBjbGlja2VkLCBidXQgbmVpdGhlciA8RG9jdW1lbnQ+IHdhcyBwcm92aWRlZCB3aXRoIG9uSXRlbUNsaWNrIG5vciBpdCB3YXMgYWJsZSB0byBmaW5kIHRoZSBwYWdlIHdpdGhpbiBpdHNlbGYuIEVpdGhlciBwcm92aWRlIG9uSXRlbUNsaWNrIHRvIDxEb2N1bWVudD4gYW5kIGhhbmRsZSBuYXZpZ2F0aW5nIGJ5IHlvdXJzZWxmIG9yIGVuc3VyZSB0aGF0IGFsbCBwYWdlcyBhcmUgcmVuZGVyZWQgd2l0aGluIDxEb2N1bWVudD4uYCk7XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgICAgIGxpbmtTZXJ2aWNlLFxuICAgICAgICBwYWdlcyxcbiAgICAgICAgdmlld2VyLFxuICAgIH0pLCBbXSk7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBkb2N1bWVudCBzb3VyY2UgaXMgcmVzb2x2ZWQgY29ycmVjdGx5XG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Tb3VyY2VTdWNjZXNzKCkge1xuICAgICAgICBpZiAob25Tb3VyY2VTdWNjZXNzUHJvcHMpIHtcbiAgICAgICAgICAgIG9uU291cmNlU3VjY2Vzc1Byb3BzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBkb2N1bWVudCBzb3VyY2UgZmFpbGVkIHRvIGJlIHJlc29sdmVkIGNvcnJlY3RseVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uU291cmNlRXJyb3IoKSB7XG4gICAgICAgIGlmICghc291cmNlRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyhmYWxzZSwgc291cmNlRXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvblNvdXJjZUVycm9yUHJvcHMpIHtcbiAgICAgICAgICAgIG9uU291cmNlRXJyb3JQcm9wcyhzb3VyY2VFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzZXRTb3VyY2UoKSB7XG4gICAgICAgIHNvdXJjZURpc3BhdGNoKHsgdHlwZTogJ1JFU0VUJyB9KTtcbiAgICB9XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaW9tZWpzL2Jpb21lL2lzc3Vlcy8zMDgwXG4gICAgdXNlRWZmZWN0KHJlc2V0U291cmNlLCBbZmlsZSwgc291cmNlRGlzcGF0Y2hdKTtcbiAgICBjb25zdCBmaW5kRG9jdW1lbnRTb3VyY2UgPSB1c2VDYWxsYmFjaygoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlsZSBpcyBhIHN0cmluZ1xuICAgICAgICBpZiAodHlwZW9mIGZpbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoaXNEYXRhVVJJKGZpbGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZUJ5dGVTdHJpbmcgPSBkYXRhVVJJdG9CeXRlU3RyaW5nKGZpbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGZpbGVCeXRlU3RyaW5nIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwbGF5Q09SU1dhcm5pbmcoKTtcbiAgICAgICAgICAgIHJldHVybiB7IHVybDogZmlsZSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbGUgaXMgUERGRGF0YVJhbmdlVHJhbnNwb3J0XG4gICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgUERGRGF0YVJhbmdlVHJhbnNwb3J0KSB7XG4gICAgICAgICAgICByZXR1cm4geyByYW5nZTogZmlsZSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbGUgaXMgYW4gQXJyYXlCdWZmZXJcbiAgICAgICAgaWYgKGlzQXJyYXlCdWZmZXIoZmlsZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGZpbGUgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhc2VzIGJlbG93IGFyZSBicm93c2VyLW9ubHkuXG4gICAgICAgICAqIElmIHlvdSdyZSBydW5uaW5nIG9uIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQsIHRoZXNlIGNhc2VzIHdpbGwgYmUgb2Ygbm8gdXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgICAgICAgLy8gRmlsZSBpcyBhIEJsb2JcbiAgICAgICAgICAgIGlmIChpc0Jsb2IoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0geWllbGQgbG9hZEZyb21GaWxlKGZpbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGEgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBmaWxlIG11c3QgYmUgYW4gb2JqZWN0XG4gICAgICAgIGludmFyaWFudCh0eXBlb2YgZmlsZSA9PT0gJ29iamVjdCcsICdJbnZhbGlkIHBhcmFtZXRlciBpbiBmaWxlLCBuZWVkIGVpdGhlciBVaW50OEFycmF5LCBzdHJpbmcgb3IgYSBwYXJhbWV0ZXIgb2JqZWN0Jyk7XG4gICAgICAgIGludmFyaWFudChpc1BhcmFtZXRlck9iamVjdChmaWxlKSwgJ0ludmFsaWQgcGFyYW1ldGVyIG9iamVjdDogbmVlZCBlaXRoZXIgLmRhdGEsIC5yYW5nZSBvciAudXJsJyk7XG4gICAgICAgIC8vIEZpbGUgLnVybCBpcyBhIHN0cmluZ1xuICAgICAgICBpZiAoJ3VybCcgaW4gZmlsZSAmJiB0eXBlb2YgZmlsZS51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoaXNEYXRhVVJJKGZpbGUudXJsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdXJsIH0gPSBmaWxlLCBvdGhlclBhcmFtcyA9IF9fcmVzdChmaWxlLCBbXCJ1cmxcIl0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVCeXRlU3RyaW5nID0gZGF0YVVSSXRvQnl0ZVN0cmluZyh1cmwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgZGF0YTogZmlsZUJ5dGVTdHJpbmcgfSwgb3RoZXJQYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzcGxheUNPUlNXYXJuaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfSksIFtmaWxlXSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgY2FuY2VsbGFibGUgPSBtYWtlQ2FuY2VsbGFibGUoZmluZERvY3VtZW50U291cmNlKCkpO1xuICAgICAgICBjYW5jZWxsYWJsZS5wcm9taXNlXG4gICAgICAgICAgICAudGhlbigobmV4dFNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgc291cmNlRGlzcGF0Y2goeyB0eXBlOiAnUkVTT0xWRScsIHZhbHVlOiBuZXh0U291cmNlIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgc291cmNlRGlzcGF0Y2goeyB0eXBlOiAnUkVKRUNUJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2FuY2VsUnVubmluZ1Rhc2soY2FuY2VsbGFibGUpO1xuICAgICAgICB9O1xuICAgIH0sIFtmaW5kRG9jdW1lbnRTb3VyY2UsIHNvdXJjZURpc3BhdGNoXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvblNvdXJjZUVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb25Tb3VyY2VTdWNjZXNzKCk7XG4gICAgfSwgW3NvdXJjZV0pO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgZG9jdW1lbnQgaXMgcmVhZCBzdWNjZXNzZnVsbHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbkxvYWRTdWNjZXNzKCkge1xuICAgICAgICBpZiAoIXBkZikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25Mb2FkU3VjY2Vzc1Byb3BzKSB7XG4gICAgICAgICAgICBvbkxvYWRTdWNjZXNzUHJvcHMocGRmKTtcbiAgICAgICAgfVxuICAgICAgICBwYWdlcy5jdXJyZW50ID0gbmV3IEFycmF5KHBkZi5udW1QYWdlcyk7XG4gICAgICAgIGxpbmtTZXJ2aWNlLmN1cnJlbnQuc2V0RG9jdW1lbnQocGRmKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBkb2N1bWVudCBmYWlsZWQgdG8gcmVhZCBzdWNjZXNzZnVsbHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbkxvYWRFcnJvcigpIHtcbiAgICAgICAgaWYgKCFwZGZFcnJvcikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKGZhbHNlLCBwZGZFcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKG9uTG9hZEVycm9yUHJvcHMpIHtcbiAgICAgICAgICAgIG9uTG9hZEVycm9yUHJvcHMocGRmRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IHVzZUVmZmVjdCBpbnRlbnRpb25hbGx5IHRyaWdnZXJlZCBvbiBzb3VyY2UgY2hhbmdlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIHJlc2V0RG9jdW1lbnQoKSB7XG4gICAgICAgIHBkZkRpc3BhdGNoKHsgdHlwZTogJ1JFU0VUJyB9KTtcbiAgICB9LCBbcGRmRGlzcGF0Y2gsIHNvdXJjZV0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gbG9hZERvY3VtZW50KCkge1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvY3VtZW50SW5pdFBhcmFtcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc291cmNlKSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGRlc3Ryb3lhYmxlID0gcGRmanMuZ2V0RG9jdW1lbnQoZG9jdW1lbnRJbml0UGFyYW1zKTtcbiAgICAgICAgaWYgKG9uTG9hZFByb2dyZXNzKSB7XG4gICAgICAgICAgICBkZXN0cm95YWJsZS5vblByb2dyZXNzID0gb25Mb2FkUHJvZ3Jlc3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uUGFzc3dvcmQpIHtcbiAgICAgICAgICAgIGRlc3Ryb3lhYmxlLm9uUGFzc3dvcmQgPSBvblBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvYWRpbmdUYXNrID0gZGVzdHJveWFibGU7XG4gICAgICAgIGxvYWRpbmdUYXNrLnByb21pc2VcbiAgICAgICAgICAgIC50aGVuKChuZXh0UGRmKSA9PiB7XG4gICAgICAgICAgICBwZGZEaXNwYXRjaCh7IHR5cGU6ICdSRVNPTFZFJywgdmFsdWU6IG5leHRQZGYgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAobG9hZGluZ1Rhc2suZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGRmRGlzcGF0Y2goeyB0eXBlOiAnUkVKRUNUJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgIH0sIFtvcHRpb25zLCBwZGZEaXNwYXRjaCwgc291cmNlXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcGRmID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZGYgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvbkxvYWRFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uTG9hZFN1Y2Nlc3MoKTtcbiAgICB9LCBbcGRmXSk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIHNldHVwTGlua1NlcnZpY2UoKSB7XG4gICAgICAgIGxpbmtTZXJ2aWNlLmN1cnJlbnQuc2V0Vmlld2VyKHZpZXdlci5jdXJyZW50KTtcbiAgICAgICAgbGlua1NlcnZpY2UuY3VycmVudC5zZXRFeHRlcm5hbExpbmtSZWwoZXh0ZXJuYWxMaW5rUmVsKTtcbiAgICAgICAgbGlua1NlcnZpY2UuY3VycmVudC5zZXRFeHRlcm5hbExpbmtUYXJnZXQoZXh0ZXJuYWxMaW5rVGFyZ2V0KTtcbiAgICB9LCBbZXh0ZXJuYWxMaW5rUmVsLCBleHRlcm5hbExpbmtUYXJnZXRdKTtcbiAgICBjb25zdCByZWdpc3RlclBhZ2UgPSB1c2VDYWxsYmFjaygocGFnZUluZGV4LCByZWYpID0+IHtcbiAgICAgICAgcGFnZXMuY3VycmVudFtwYWdlSW5kZXhdID0gcmVmO1xuICAgIH0sIFtdKTtcbiAgICBjb25zdCB1bnJlZ2lzdGVyUGFnZSA9IHVzZUNhbGxiYWNrKChwYWdlSW5kZXgpID0+IHtcbiAgICAgICAgZGVsZXRlIHBhZ2VzLmN1cnJlbnRbcGFnZUluZGV4XTtcbiAgICB9LCBbXSk7XG4gICAgY29uc3QgY2hpbGRDb250ZXh0ID0gdXNlTWVtbygoKSA9PiAoe1xuICAgICAgICBpbWFnZVJlc291cmNlc1BhdGgsXG4gICAgICAgIGxpbmtTZXJ2aWNlOiBsaW5rU2VydmljZS5jdXJyZW50LFxuICAgICAgICBvbkl0ZW1DbGljayxcbiAgICAgICAgcGRmLFxuICAgICAgICByZWdpc3RlclBhZ2UsXG4gICAgICAgIHJlbmRlck1vZGUsXG4gICAgICAgIHJvdGF0ZSxcbiAgICAgICAgdW5yZWdpc3RlclBhZ2UsXG4gICAgfSksIFtpbWFnZVJlc291cmNlc1BhdGgsIG9uSXRlbUNsaWNrLCBwZGYsIHJlZ2lzdGVyUGFnZSwgcmVuZGVyTW9kZSwgcm90YXRlLCB1bnJlZ2lzdGVyUGFnZV0pO1xuICAgIGNvbnN0IGV2ZW50UHJvcHMgPSB1c2VNZW1vKCgpID0+IG1ha2VFdmVudFByb3BzKG90aGVyUHJvcHMsICgpID0+IHBkZiksIFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IEZJWE1FXG4gICAgW290aGVyUHJvcHMsIHBkZl0pO1xuICAgIGZ1bmN0aW9uIHJlbmRlckNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gX2pzeChEb2N1bWVudENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNoaWxkQ29udGV4dCwgY2hpbGRyZW46IGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJDb250ZW50KCkge1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfanN4KE1lc3NhZ2UsIHsgdHlwZTogXCJuby1kYXRhXCIsIGNoaWxkcmVuOiB0eXBlb2Ygbm9EYXRhID09PSAnZnVuY3Rpb24nID8gbm9EYXRhKCkgOiBub0RhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBkZiA9PT0gdW5kZWZpbmVkIHx8IHBkZiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIChfanN4KE1lc3NhZ2UsIHsgdHlwZTogXCJsb2FkaW5nXCIsIGNoaWxkcmVuOiB0eXBlb2YgbG9hZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IGxvYWRpbmcoKSA6IGxvYWRpbmcgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZGYgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gX2pzeChNZXNzYWdlLCB7IHR5cGU6IFwiZXJyb3JcIiwgY2hpbGRyZW46IHR5cGVvZiBlcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IGVycm9yKCkgOiBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVuZGVyQ2hpbGRyZW4oKTtcbiAgICB9XG4gICAgcmV0dXJuIChfanN4KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oeyBjbGFzc05hbWU6IGNsc3goJ3JlYWN0LXBkZl9fRG9jdW1lbnQnLCBjbGFzc05hbWUpLCBcbiAgICAgICAgLy8gQXNzZXJ0aW9uIGlzIG5lZWRlZCBmb3IgUmVhY3QgMTggY29tcGF0aWJpbGl0eVxuICAgICAgICByZWY6IGlucHV0UmVmLCBzdHlsZToge1xuICAgICAgICAgICAgWyctLXNjYWxlLWZhY3RvciddOiAnMScsXG4gICAgICAgIH0gfSwgZXZlbnRQcm9wcywgeyBjaGlsZHJlbjogcmVuZGVyQ29udGVudCgpIH0pKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IERvY3VtZW50O1xuIiwiJ3VzZSBjbGllbnQnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmNvbnN0IGRvY3VtZW50Q29udGV4dCA9IGNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBkb2N1bWVudENvbnRleHQ7XG4iLCIvKiBDb3B5cmlnaHQgMjAxNSBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuY29uc3QgREVGQVVMVF9MSU5LX1JFTCA9ICdub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93JztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpbmtTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5leHRlcm5hbExpbmtFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5leHRlcm5hbExpbmtSZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxMaW5rVGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGRmRG9jdW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucGRmVmlld2VyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBzZXREb2N1bWVudChwZGZEb2N1bWVudCkge1xuICAgICAgICB0aGlzLnBkZkRvY3VtZW50ID0gcGRmRG9jdW1lbnQ7XG4gICAgfVxuICAgIHNldFZpZXdlcihwZGZWaWV3ZXIpIHtcbiAgICAgICAgdGhpcy5wZGZWaWV3ZXIgPSBwZGZWaWV3ZXI7XG4gICAgfVxuICAgIHNldEV4dGVybmFsTGlua1JlbChleHRlcm5hbExpbmtSZWwpIHtcbiAgICAgICAgdGhpcy5leHRlcm5hbExpbmtSZWwgPSBleHRlcm5hbExpbmtSZWw7XG4gICAgfVxuICAgIHNldEV4dGVybmFsTGlua1RhcmdldChleHRlcm5hbExpbmtUYXJnZXQpIHtcbiAgICAgICAgdGhpcy5leHRlcm5hbExpbmtUYXJnZXQgPSBleHRlcm5hbExpbmtUYXJnZXQ7XG4gICAgfVxuICAgIHNldEhpc3RvcnkoKSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgZW1wdHlcbiAgICB9XG4gICAgZ2V0IHBhZ2VzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50ID8gdGhpcy5wZGZEb2N1bWVudC5udW1QYWdlcyA6IDA7XG4gICAgfVxuICAgIGdldCBwYWdlKCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5wZGZWaWV3ZXIsICdQREYgdmlld2VyIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyIHx8IDA7XG4gICAgfVxuICAgIHNldCBwYWdlKHZhbHVlKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLnBkZlZpZXdlciwgJ1BERiB2aWV3ZXIgaXMgbm90IGluaXRpYWxpemVkLicpO1xuICAgICAgICB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlciA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgcm90YXRpb24oKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBzZXQgcm90YXRpb24odmFsdWUpIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIH1cbiAgICBnb1RvRGVzdGluYXRpb24oZGVzdCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGludmFyaWFudCh0aGlzLnBkZkRvY3VtZW50LCAnUERGIGRvY3VtZW50IG5vdCBsb2FkZWQuJyk7XG4gICAgICAgICAgICBpbnZhcmlhbnQoZGVzdCwgJ0Rlc3RpbmF0aW9uIGlzIG5vdCBzcGVjaWZpZWQuJyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGRlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZGZEb2N1bWVudC5nZXREZXN0aW5hdGlvbihkZXN0KS50aGVuKHJlc29sdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkZXN0KSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXN0LnRoZW4ocmVzb2x2ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLnRoZW4oKGV4cGxpY2l0RGVzdCkgPT4ge1xuICAgICAgICAgICAgaW52YXJpYW50KEFycmF5LmlzQXJyYXkoZXhwbGljaXREZXN0KSwgYFwiJHtleHBsaWNpdERlc3R9XCIgaXMgbm90IGEgdmFsaWQgZGVzdGluYXRpb24gYXJyYXkuYCk7XG4gICAgICAgICAgICBjb25zdCBkZXN0UmVmID0gZXhwbGljaXREZXN0WzBdO1xuICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQodGhpcy5wZGZEb2N1bWVudCwgJ1BERiBkb2N1bWVudCBub3QgbG9hZGVkLicpO1xuICAgICAgICAgICAgICAgIGlmIChkZXN0UmVmIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGRmRG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYWdlSW5kZXgoZGVzdFJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChwYWdlSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGFnZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZhcmlhbnQoZmFsc2UsIGBcIiR7ZGVzdFJlZn1cIiBpcyBub3QgYSB2YWxpZCBwYWdlIHJlZmVyZW5jZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZXN0UmVmID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRlc3RSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50KGZhbHNlLCBgXCIke2Rlc3RSZWZ9XCIgaXMgbm90IGEgdmFsaWQgZGVzdGluYXRpb24gcmVmZXJlbmNlLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnRoZW4oKHBhZ2VJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSBwYWdlSW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIGludmFyaWFudCh0aGlzLnBkZlZpZXdlciwgJ1BERiB2aWV3ZXIgaXMgbm90IGluaXRpYWxpemVkLicpO1xuICAgICAgICAgICAgICAgIGludmFyaWFudChwYWdlTnVtYmVyID49IDEgJiYgcGFnZU51bWJlciA8PSB0aGlzLnBhZ2VzQ291bnQsIGBcIiR7cGFnZU51bWJlcn1cIiBpcyBub3QgYSB2YWxpZCBwYWdlIG51bWJlci5gKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBkZlZpZXdlci5zY3JvbGxQYWdlSW50b1ZpZXcoe1xuICAgICAgICAgICAgICAgICAgICBkZXN0OiBleHBsaWNpdERlc3QsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmF2aWdhdGVUbyhkZXN0KSB7XG4gICAgICAgIHRoaXMuZ29Ub0Rlc3RpbmF0aW9uKGRlc3QpO1xuICAgIH1cbiAgICBnb1RvUGFnZShwYWdlTnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHBhZ2VJbmRleCA9IHBhZ2VOdW1iZXIgLSAxO1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5wZGZWaWV3ZXIsICdQREYgdmlld2VyIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgaW52YXJpYW50KHBhZ2VOdW1iZXIgPj0gMSAmJiBwYWdlTnVtYmVyIDw9IHRoaXMucGFnZXNDb3VudCwgYFwiJHtwYWdlTnVtYmVyfVwiIGlzIG5vdCBhIHZhbGlkIHBhZ2UgbnVtYmVyLmApO1xuICAgICAgICB0aGlzLnBkZlZpZXdlci5zY3JvbGxQYWdlSW50b1ZpZXcoe1xuICAgICAgICAgICAgcGFnZUluZGV4LFxuICAgICAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZExpbmtBdHRyaWJ1dGVzKGxpbmssIHVybCwgbmV3V2luZG93KSB7XG4gICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgbGluay5yZWwgPSB0aGlzLmV4dGVybmFsTGlua1JlbCB8fCBERUZBVUxUX0xJTktfUkVMO1xuICAgICAgICBsaW5rLnRhcmdldCA9IG5ld1dpbmRvdyA/ICdfYmxhbmsnIDogdGhpcy5leHRlcm5hbExpbmtUYXJnZXQgfHwgJyc7XG4gICAgfVxuICAgIGdldERlc3RpbmF0aW9uSGFzaCgpIHtcbiAgICAgICAgcmV0dXJuICcjJztcbiAgICB9XG4gICAgZ2V0QW5jaG9yVXJsKCkge1xuICAgICAgICByZXR1cm4gJyMnO1xuICAgIH1cbiAgICBzZXRIYXNoKCkge1xuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGVtcHR5XG4gICAgfVxuICAgIGV4ZWN1dGVOYW1lZEFjdGlvbigpIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIH1cbiAgICBjYWNoZVBhZ2VSZWYoKSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgZW1wdHlcbiAgICB9XG4gICAgaXNQYWdlVmlzaWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlzUGFnZUNhY2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGV4ZWN1dGVTZXRPQ0dTdGF0ZSgpIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNZXNzYWdlKHsgY2hpbGRyZW4sIHR5cGUgfSkge1xuICAgIHJldHVybiBfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBgcmVhY3QtcGRmX19tZXNzYWdlIHJlYWN0LXBkZl9fbWVzc2FnZS0tJHt0eXBlfWAsIGNoaWxkcmVuOiBjaGlsZHJlbiB9KTtcbn1cbiIsIid1c2UgY2xpZW50JztcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtYWtlQ2FuY2VsbGFibGUgZnJvbSAnbWFrZS1jYW5jZWxsYWJsZS1wcm9taXNlJztcbmltcG9ydCBtYWtlRXZlbnRQcm9wcyBmcm9tICdtYWtlLWV2ZW50LXByb3BzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IG1lcmdlUmVmcyBmcm9tICdtZXJnZS1yZWZzJztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgUGFnZUNvbnRleHQgZnJvbSAnLi9QYWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgTWVzc2FnZSBmcm9tICcuL01lc3NhZ2UuanMnO1xuaW1wb3J0IENhbnZhcyBmcm9tICcuL1BhZ2UvQ2FudmFzLmpzJztcbmltcG9ydCBUZXh0TGF5ZXIgZnJvbSAnLi9QYWdlL1RleHRMYXllci5qcyc7XG5pbXBvcnQgQW5ub3RhdGlvbkxheWVyIGZyb20gJy4vUGFnZS9Bbm5vdGF0aW9uTGF5ZXIuanMnO1xuaW1wb3J0IHsgY2FuY2VsUnVubmluZ1Rhc2ssIGlzUHJvdmlkZWQsIG1ha2VQYWdlQ2FsbGJhY2sgfSBmcm9tICcuL3NoYXJlZC91dGlscy5qcyc7XG5pbXBvcnQgdXNlRG9jdW1lbnRDb250ZXh0IGZyb20gJy4vc2hhcmVkL2hvb2tzL3VzZURvY3VtZW50Q29udGV4dC5qcyc7XG5pbXBvcnQgdXNlUmVzb2x2ZXIgZnJvbSAnLi9zaGFyZWQvaG9va3MvdXNlUmVzb2x2ZXIuanMnO1xuY29uc3QgZGVmYXVsdFNjYWxlID0gMTtcbi8qKlxuICogRGlzcGxheXMgYSBwYWdlLlxuICpcbiAqIFNob3VsZCBiZSBwbGFjZWQgaW5zaWRlIGA8RG9jdW1lbnQgLz5gLiBBbHRlcm5hdGl2ZWx5LCBpdCBjYW4gaGF2ZSBgcGRmYCBwcm9wIHBhc3NlZCwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gYDxEb2N1bWVudCAvPmAncyBgb25Mb2FkU3VjY2Vzc2AgY2FsbGJhY2sgZnVuY3Rpb24sIGhvd2V2ZXIgc29tZSBhZHZhbmNlZCBmdW5jdGlvbnMgbGlrZSBsaW5raW5nIGJldHdlZW4gcGFnZXMgaW5zaWRlIGEgZG9jdW1lbnQgbWF5IG5vdCBiZSB3b3JraW5nIGNvcnJlY3RseS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUGFnZShwcm9wcykge1xuICAgIGNvbnN0IGRvY3VtZW50Q29udGV4dCA9IHVzZURvY3VtZW50Q29udGV4dCgpO1xuICAgIGNvbnN0IG1lcmdlZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkb2N1bWVudENvbnRleHQpLCBwcm9wcyk7XG4gICAgY29uc3QgeyBfY2xhc3NOYW1lID0gJ3JlYWN0LXBkZl9fUGFnZScsIF9lbmFibGVSZWdpc3RlclVucmVnaXN0ZXJQYWdlID0gdHJ1ZSwgY2FudmFzQmFja2dyb3VuZCwgY2FudmFzUmVmLCBjaGlsZHJlbiwgY2xhc3NOYW1lLCBjdXN0b21SZW5kZXJlcjogQ3VzdG9tUmVuZGVyZXIsIGN1c3RvbVRleHRSZW5kZXJlciwgZGV2aWNlUGl4ZWxSYXRpbywgZXJyb3IgPSAnRmFpbGVkIHRvIGxvYWQgdGhlIHBhZ2UuJywgaGVpZ2h0LCBpbnB1dFJlZiwgbG9hZGluZyA9ICdMb2FkaW5nIHBhZ2XigKYnLCBub0RhdGEgPSAnTm8gcGFnZSBzcGVjaWZpZWQuJywgb25HZXRBbm5vdGF0aW9uc0Vycm9yOiBvbkdldEFubm90YXRpb25zRXJyb3JQcm9wcywgb25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3M6IG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzUHJvcHMsIG9uR2V0U3RydWN0VHJlZUVycm9yOiBvbkdldFN0cnVjdFRyZWVFcnJvclByb3BzLCBvbkdldFN0cnVjdFRyZWVTdWNjZXNzOiBvbkdldFN0cnVjdFRyZWVTdWNjZXNzUHJvcHMsIG9uR2V0VGV4dEVycm9yOiBvbkdldFRleHRFcnJvclByb3BzLCBvbkdldFRleHRTdWNjZXNzOiBvbkdldFRleHRTdWNjZXNzUHJvcHMsIG9uTG9hZEVycm9yOiBvbkxvYWRFcnJvclByb3BzLCBvbkxvYWRTdWNjZXNzOiBvbkxvYWRTdWNjZXNzUHJvcHMsIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3I6IG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3JQcm9wcywgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzOiBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NQcm9wcywgb25SZW5kZXJFcnJvcjogb25SZW5kZXJFcnJvclByb3BzLCBvblJlbmRlclN1Y2Nlc3M6IG9uUmVuZGVyU3VjY2Vzc1Byb3BzLCBvblJlbmRlclRleHRMYXllckVycm9yOiBvblJlbmRlclRleHRMYXllckVycm9yUHJvcHMsIG9uUmVuZGVyVGV4dExheWVyU3VjY2Vzczogb25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzUHJvcHMsIHBhZ2VJbmRleDogcGFnZUluZGV4UHJvcHMsIHBhZ2VOdW1iZXI6IHBhZ2VOdW1iZXJQcm9wcywgcGRmLCByZWdpc3RlclBhZ2UsIHJlbmRlckFubm90YXRpb25MYXllcjogcmVuZGVyQW5ub3RhdGlvbkxheWVyUHJvcHMgPSB0cnVlLCByZW5kZXJGb3JtcyA9IGZhbHNlLCByZW5kZXJNb2RlID0gJ2NhbnZhcycsIHJlbmRlclRleHRMYXllcjogcmVuZGVyVGV4dExheWVyUHJvcHMgPSB0cnVlLCByb3RhdGU6IHJvdGF0ZVByb3BzLCBzY2FsZTogc2NhbGVQcm9wcyA9IGRlZmF1bHRTY2FsZSwgdW5yZWdpc3RlclBhZ2UsIHdpZHRoIH0gPSBtZXJnZWRQcm9wcywgb3RoZXJQcm9wcyA9IF9fcmVzdChtZXJnZWRQcm9wcywgW1wiX2NsYXNzTmFtZVwiLCBcIl9lbmFibGVSZWdpc3RlclVucmVnaXN0ZXJQYWdlXCIsIFwiY2FudmFzQmFja2dyb3VuZFwiLCBcImNhbnZhc1JlZlwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY3VzdG9tUmVuZGVyZXJcIiwgXCJjdXN0b21UZXh0UmVuZGVyZXJcIiwgXCJkZXZpY2VQaXhlbFJhdGlvXCIsIFwiZXJyb3JcIiwgXCJoZWlnaHRcIiwgXCJpbnB1dFJlZlwiLCBcImxvYWRpbmdcIiwgXCJub0RhdGFcIiwgXCJvbkdldEFubm90YXRpb25zRXJyb3JcIiwgXCJvbkdldEFubm90YXRpb25zU3VjY2Vzc1wiLCBcIm9uR2V0U3RydWN0VHJlZUVycm9yXCIsIFwib25HZXRTdHJ1Y3RUcmVlU3VjY2Vzc1wiLCBcIm9uR2V0VGV4dEVycm9yXCIsIFwib25HZXRUZXh0U3VjY2Vzc1wiLCBcIm9uTG9hZEVycm9yXCIsIFwib25Mb2FkU3VjY2Vzc1wiLCBcIm9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3JcIiwgXCJvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NcIiwgXCJvblJlbmRlckVycm9yXCIsIFwib25SZW5kZXJTdWNjZXNzXCIsIFwib25SZW5kZXJUZXh0TGF5ZXJFcnJvclwiLCBcIm9uUmVuZGVyVGV4dExheWVyU3VjY2Vzc1wiLCBcInBhZ2VJbmRleFwiLCBcInBhZ2VOdW1iZXJcIiwgXCJwZGZcIiwgXCJyZWdpc3RlclBhZ2VcIiwgXCJyZW5kZXJBbm5vdGF0aW9uTGF5ZXJcIiwgXCJyZW5kZXJGb3Jtc1wiLCBcInJlbmRlck1vZGVcIiwgXCJyZW5kZXJUZXh0TGF5ZXJcIiwgXCJyb3RhdGVcIiwgXCJzY2FsZVwiLCBcInVucmVnaXN0ZXJQYWdlXCIsIFwid2lkdGhcIl0pO1xuICAgIGNvbnN0IFtwYWdlU3RhdGUsIHBhZ2VEaXNwYXRjaF0gPSB1c2VSZXNvbHZlcigpO1xuICAgIGNvbnN0IHsgdmFsdWU6IHBhZ2UsIGVycm9yOiBwYWdlRXJyb3IgfSA9IHBhZ2VTdGF0ZTtcbiAgICBjb25zdCBwYWdlRWxlbWVudCA9IHVzZVJlZihudWxsKTtcbiAgICBpbnZhcmlhbnQocGRmLCAnQXR0ZW1wdGVkIHRvIGxvYWQgYSBwYWdlLCBidXQgbm8gZG9jdW1lbnQgd2FzIHNwZWNpZmllZC4gV3JhcCA8UGFnZSAvPiBpbiBhIDxEb2N1bWVudCAvPiBvciBwYXNzIGV4cGxpY2l0IGBwZGZgIHByb3AuJyk7XG4gICAgY29uc3QgcGFnZUluZGV4ID0gaXNQcm92aWRlZChwYWdlTnVtYmVyUHJvcHMpID8gcGFnZU51bWJlclByb3BzIC0gMSA6IHBhZ2VJbmRleFByb3BzICE9PSBudWxsICYmIHBhZ2VJbmRleFByb3BzICE9PSB2b2lkIDAgPyBwYWdlSW5kZXhQcm9wcyA6IG51bGw7XG4gICAgY29uc3QgcGFnZU51bWJlciA9IHBhZ2VOdW1iZXJQcm9wcyAhPT0gbnVsbCAmJiBwYWdlTnVtYmVyUHJvcHMgIT09IHZvaWQgMCA/IHBhZ2VOdW1iZXJQcm9wcyA6IChpc1Byb3ZpZGVkKHBhZ2VJbmRleFByb3BzKSA/IHBhZ2VJbmRleFByb3BzICsgMSA6IG51bGwpO1xuICAgIGNvbnN0IHJvdGF0ZSA9IHJvdGF0ZVByb3BzICE9PSBudWxsICYmIHJvdGF0ZVByb3BzICE9PSB2b2lkIDAgPyByb3RhdGVQcm9wcyA6IChwYWdlID8gcGFnZS5yb3RhdGUgOiBudWxsKTtcbiAgICBjb25zdCBzY2FsZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJlIGRlZmF1bHQsIHdlJ2xsIHJlbmRlciBwYWdlIGF0IDEwMCUgKiBzY2FsZSB3aWR0aC5cbiAgICAgICAgbGV0IHBhZ2VTY2FsZSA9IDE7XG4gICAgICAgIC8vIFBhc3Npbmcgc2NhbGUgZXhwbGljaXRseSBudWxsIHdvdWxkIGNhdXNlIHRoZSBwYWdlIG5vdCB0byByZW5kZXJcbiAgICAgICAgY29uc3Qgc2NhbGVXaXRoRGVmYXVsdCA9IHNjYWxlUHJvcHMgIT09IG51bGwgJiYgc2NhbGVQcm9wcyAhPT0gdm9pZCAwID8gc2NhbGVQcm9wcyA6IGRlZmF1bHRTY2FsZTtcbiAgICAgICAgLy8gSWYgd2lkdGgvaGVpZ2h0IGlzIGRlZmluZWQsIGNhbGN1bGF0ZSB0aGUgc2NhbGUgb2YgdGhlIHBhZ2Ugc28gaXQgY291bGQgYmUgb2YgZGVzaXJlZCB3aWR0aC5cbiAgICAgICAgaWYgKHdpZHRoIHx8IGhlaWdodCkge1xuICAgICAgICAgICAgY29uc3Qgdmlld3BvcnQgPSBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IDEsIHJvdGF0aW9uOiByb3RhdGUgfSk7XG4gICAgICAgICAgICBpZiAod2lkdGgpIHtcbiAgICAgICAgICAgICAgICBwYWdlU2NhbGUgPSB3aWR0aCAvIHZpZXdwb3J0LndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgcGFnZVNjYWxlID0gaGVpZ2h0IC8gdmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2FsZVdpdGhEZWZhdWx0ICogcGFnZVNjYWxlO1xuICAgIH0sIFtoZWlnaHQsIHBhZ2UsIHJvdGF0ZSwgc2NhbGVQcm9wcywgd2lkdGhdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiB1c2VFZmZlY3QgaW50ZW50aW9uYWxseSB0cmlnZ2VyZWQgb24gcGRmIGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiBob29rKCkge1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc1Byb3ZpZGVkKHBhZ2VJbmRleCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfZW5hYmxlUmVnaXN0ZXJVbnJlZ2lzdGVyUGFnZSAmJiB1bnJlZ2lzdGVyUGFnZSkge1xuICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJQYWdlKHBhZ2VJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSwgW19lbmFibGVSZWdpc3RlclVucmVnaXN0ZXJQYWdlLCBwZGYsIHBhZ2VJbmRleCwgdW5yZWdpc3RlclBhZ2VdKTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHBhZ2UgaXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTG9hZFN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmIChvbkxvYWRTdWNjZXNzUHJvcHMpIHtcbiAgICAgICAgICAgIGlmICghcGFnZSB8fCAhc2NhbGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9uTG9hZFN1Y2Nlc3NQcm9wcyhtYWtlUGFnZUNhbGxiYWNrKHBhZ2UsIHNjYWxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9lbmFibGVSZWdpc3RlclVucmVnaXN0ZXJQYWdlICYmIHJlZ2lzdGVyUGFnZSkge1xuICAgICAgICAgICAgaWYgKCFpc1Byb3ZpZGVkKHBhZ2VJbmRleCkgfHwgIXBhZ2VFbGVtZW50LmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZ2lzdGVyUGFnZShwYWdlSW5kZXgsIHBhZ2VFbGVtZW50LmN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgcGFnZSBmYWlsZWQgdG8gbG9hZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTG9hZEVycm9yKCkge1xuICAgICAgICBpZiAoIXBhZ2VFcnJvcikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKGZhbHNlLCBwYWdlRXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvbkxvYWRFcnJvclByb3BzKSB7XG4gICAgICAgICAgICBvbkxvYWRFcnJvclByb3BzKHBhZ2VFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdXNlRWZmZWN0IGludGVudGlvbmFsbHkgdHJpZ2dlcmVkIG9uIHBkZiBhbmQgcGFnZUluZGV4IGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiByZXNldFBhZ2UoKSB7XG4gICAgICAgIHBhZ2VEaXNwYXRjaCh7IHR5cGU6ICdSRVNFVCcgfSk7XG4gICAgfSwgW3BhZ2VEaXNwYXRjaCwgcGRmLCBwYWdlSW5kZXhdKTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gbG9hZFBhZ2UoKSB7XG4gICAgICAgIGlmICghcGRmIHx8ICFwYWdlTnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FuY2VsbGFibGUgPSBtYWtlQ2FuY2VsbGFibGUocGRmLmdldFBhZ2UocGFnZU51bWJlcikpO1xuICAgICAgICBjb25zdCBydW5uaW5nVGFzayA9IGNhbmNlbGxhYmxlO1xuICAgICAgICBjYW5jZWxsYWJsZS5wcm9taXNlXG4gICAgICAgICAgICAudGhlbigobmV4dFBhZ2UpID0+IHtcbiAgICAgICAgICAgIHBhZ2VEaXNwYXRjaCh7IHR5cGU6ICdSRVNPTFZFJywgdmFsdWU6IG5leHRQYWdlIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcGFnZURpc3BhdGNoKHsgdHlwZTogJ1JFSkVDVCcsIGVycm9yIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICgpID0+IGNhbmNlbFJ1bm5pbmdUYXNrKHJ1bm5pbmdUYXNrKTtcbiAgICB9LCBbcGFnZURpc3BhdGNoLCBwZGYsIHBhZ2VOdW1iZXJdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBPbW1pdHRlZCBjYWxsYmFja3Mgc28gdGhleSBhcmUgbm90IGNhbGxlZCBldmVyeSB0aW1lIHRoZXkgY2hhbmdlXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHBhZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgb25Mb2FkRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvbkxvYWRTdWNjZXNzKCk7XG4gICAgfSwgW3BhZ2UsIHNjYWxlXSk7XG4gICAgY29uc3QgY2hpbGRDb250ZXh0ID0gdXNlTWVtbygoKSA9PiBcbiAgICAvLyBUZWNobmljYWxseSB0aGVyZSBjYW5ub3QgYmUgcGFnZSB3aXRob3V0IHBhZ2VJbmRleCwgcGFnZU51bWJlciwgcm90YXRlIGFuZCBzY2FsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICBwYWdlICYmIGlzUHJvdmlkZWQocGFnZUluZGV4KSAmJiBwYWdlTnVtYmVyICYmIGlzUHJvdmlkZWQocm90YXRlKSAmJiBpc1Byb3ZpZGVkKHNjYWxlKVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIF9jbGFzc05hbWUsXG4gICAgICAgICAgICBjYW52YXNCYWNrZ3JvdW5kLFxuICAgICAgICAgICAgY3VzdG9tVGV4dFJlbmRlcmVyLFxuICAgICAgICAgICAgZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIG9uR2V0QW5ub3RhdGlvbnNFcnJvcjogb25HZXRBbm5vdGF0aW9uc0Vycm9yUHJvcHMsXG4gICAgICAgICAgICBvbkdldEFubm90YXRpb25zU3VjY2Vzczogb25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3NQcm9wcyxcbiAgICAgICAgICAgIG9uR2V0U3RydWN0VHJlZUVycm9yOiBvbkdldFN0cnVjdFRyZWVFcnJvclByb3BzLFxuICAgICAgICAgICAgb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzczogb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzc1Byb3BzLFxuICAgICAgICAgICAgb25HZXRUZXh0RXJyb3I6IG9uR2V0VGV4dEVycm9yUHJvcHMsXG4gICAgICAgICAgICBvbkdldFRleHRTdWNjZXNzOiBvbkdldFRleHRTdWNjZXNzUHJvcHMsXG4gICAgICAgICAgICBvblJlbmRlckFubm90YXRpb25MYXllckVycm9yOiBvblJlbmRlckFubm90YXRpb25MYXllckVycm9yUHJvcHMsXG4gICAgICAgICAgICBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3M6IG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyU3VjY2Vzc1Byb3BzLFxuICAgICAgICAgICAgb25SZW5kZXJFcnJvcjogb25SZW5kZXJFcnJvclByb3BzLFxuICAgICAgICAgICAgb25SZW5kZXJTdWNjZXNzOiBvblJlbmRlclN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgICAgIG9uUmVuZGVyVGV4dExheWVyRXJyb3I6IG9uUmVuZGVyVGV4dExheWVyRXJyb3JQcm9wcyxcbiAgICAgICAgICAgIG9uUmVuZGVyVGV4dExheWVyU3VjY2Vzczogb25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzUHJvcHMsXG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgcGFnZUluZGV4LFxuICAgICAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgICAgIHJlbmRlckZvcm1zLFxuICAgICAgICAgICAgcmVuZGVyVGV4dExheWVyOiByZW5kZXJUZXh0TGF5ZXJQcm9wcyxcbiAgICAgICAgICAgIHJvdGF0ZSxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICB9XG4gICAgICAgIDogbnVsbCwgW1xuICAgICAgICBfY2xhc3NOYW1lLFxuICAgICAgICBjYW52YXNCYWNrZ3JvdW5kLFxuICAgICAgICBjdXN0b21UZXh0UmVuZGVyZXIsXG4gICAgICAgIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgIG9uR2V0QW5ub3RhdGlvbnNFcnJvclByb3BzLFxuICAgICAgICBvbkdldEFubm90YXRpb25zU3VjY2Vzc1Byb3BzLFxuICAgICAgICBvbkdldFN0cnVjdFRyZWVFcnJvclByb3BzLFxuICAgICAgICBvbkdldFN0cnVjdFRyZWVTdWNjZXNzUHJvcHMsXG4gICAgICAgIG9uR2V0VGV4dEVycm9yUHJvcHMsXG4gICAgICAgIG9uR2V0VGV4dFN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvclByb3BzLFxuICAgICAgICBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgb25SZW5kZXJFcnJvclByb3BzLFxuICAgICAgICBvblJlbmRlclN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgb25SZW5kZXJUZXh0TGF5ZXJFcnJvclByb3BzLFxuICAgICAgICBvblJlbmRlclRleHRMYXllclN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgcGFnZSxcbiAgICAgICAgcGFnZUluZGV4LFxuICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICByZW5kZXJGb3JtcyxcbiAgICAgICAgcmVuZGVyVGV4dExheWVyUHJvcHMsXG4gICAgICAgIHJvdGF0ZSxcbiAgICAgICAgc2NhbGUsXG4gICAgXSk7XG4gICAgY29uc3QgZXZlbnRQcm9wcyA9IHVzZU1lbW8oKCkgPT4gbWFrZUV2ZW50UHJvcHMob3RoZXJQcm9wcywgKCkgPT4gcGFnZSA/IChzY2FsZSA/IG1ha2VQYWdlQ2FsbGJhY2socGFnZSwgc2NhbGUpIDogdW5kZWZpbmVkKSA6IHBhZ2UpLCBcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBGSVhNRVxuICAgIFtvdGhlclByb3BzLCBwYWdlLCBzY2FsZV0pO1xuICAgIGNvbnN0IHBhZ2VLZXkgPSBgJHtwYWdlSW5kZXh9QCR7c2NhbGV9LyR7cm90YXRlfWA7XG4gICAgZnVuY3Rpb24gcmVuZGVyTWFpbkxheWVyKCkge1xuICAgICAgICBzd2l0Y2ggKHJlbmRlck1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2N1c3RvbSc6IHtcbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQoQ3VzdG9tUmVuZGVyZXIsIGByZW5kZXJNb2RlIHdhcyBzZXQgdG8gXCJjdXN0b21cIiwgYnV0IG5vIGN1c3RvbVJlbmRlcmVyIHdhcyBwYXNzZWQuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9qc3goQ3VzdG9tUmVuZGVyZXIsIHt9LCBgJHtwYWdlS2V5fV9jdXN0b21gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY2FzZSAnY2FudmFzJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9qc3goQ2FudmFzLCB7IGNhbnZhc1JlZjogY2FudmFzUmVmIH0sIGAke3BhZ2VLZXl9X2NhbnZhc2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbmRlclRleHRMYXllcigpIHtcbiAgICAgICAgaWYgKCFyZW5kZXJUZXh0TGF5ZXJQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9qc3goVGV4dExheWVyLCB7fSwgYCR7cGFnZUtleX1fdGV4dGApO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJBbm5vdGF0aW9uTGF5ZXIoKSB7XG4gICAgICAgIGlmICghcmVuZGVyQW5ub3RhdGlvbkxheWVyUHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBvZiBub3csIFBERi5qcyAyLjAuOTQzIHJldHVybnMgd2FybmluZ3Mgb24gdW5pbXBsZW1lbnRlZCBhbm5vdGF0aW9ucyBpbiBTVkcgbW9kZS5cbiAgICAgICAgICogVGhlcmVmb3JlLCBhcyBhIGZhbGxiYWNrLCB3ZSByZW5kZXIgXCJ0cmFkaXRpb25hbFwiIEFubm90YXRpb25MYXllciBjb21wb25lbnQuXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gX2pzeChBbm5vdGF0aW9uTGF5ZXIsIHt9LCBgJHtwYWdlS2V5fV9hbm5vdGF0aW9uc2ApO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJDaGlsZHJlbigpIHtcbiAgICAgICAgcmV0dXJuIChfanN4cyhQYWdlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogY2hpbGRDb250ZXh0LCBjaGlsZHJlbjogW3JlbmRlck1haW5MYXllcigpLCByZW5kZXJUZXh0TGF5ZXIoKSwgcmVuZGVyQW5ub3RhdGlvbkxheWVyKCksIGNoaWxkcmVuXSB9KSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoKSB7XG4gICAgICAgIGlmICghcGFnZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIF9qc3goTWVzc2FnZSwgeyB0eXBlOiBcIm5vLWRhdGFcIiwgY2hpbGRyZW46IHR5cGVvZiBub0RhdGEgPT09ICdmdW5jdGlvbicgPyBub0RhdGEoKSA6IG5vRGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGRmID09PSBudWxsIHx8IHBhZ2UgPT09IHVuZGVmaW5lZCB8fCBwYWdlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gKF9qc3goTWVzc2FnZSwgeyB0eXBlOiBcImxvYWRpbmdcIiwgY2hpbGRyZW46IHR5cGVvZiBsb2FkaW5nID09PSAnZnVuY3Rpb24nID8gbG9hZGluZygpIDogbG9hZGluZyB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBkZiA9PT0gZmFsc2UgfHwgcGFnZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBfanN4KE1lc3NhZ2UsIHsgdHlwZTogXCJlcnJvclwiLCBjaGlsZHJlbjogdHlwZW9mIGVycm9yID09PSAnZnVuY3Rpb24nID8gZXJyb3IoKSA6IGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZW5kZXJDaGlsZHJlbigpO1xuICAgIH1cbiAgICByZXR1cm4gKF9qc3goXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7IGNsYXNzTmFtZTogY2xzeChfY2xhc3NOYW1lLCBjbGFzc05hbWUpLCBcImRhdGEtcGFnZS1udW1iZXJcIjogcGFnZU51bWJlciwgXG4gICAgICAgIC8vIEFzc2VydGlvbiBpcyBuZWVkZWQgZm9yIFJlYWN0IDE4IGNvbXBhdGliaWxpdHlcbiAgICAgICAgcmVmOiBtZXJnZVJlZnMoaW5wdXRSZWYsIHBhZ2VFbGVtZW50KSwgc3R5bGU6IHtcbiAgICAgICAgICAgIFsnLS1zY2FsZS1mYWN0b3InXTogYCR7c2NhbGV9YCxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogY2FudmFzQmFja2dyb3VuZCB8fCAnd2hpdGUnLFxuICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgICBtaW5XaWR0aDogJ21pbi1jb250ZW50JyxcbiAgICAgICAgICAgIG1pbkhlaWdodDogJ21pbi1jb250ZW50JyxcbiAgICAgICAgfSB9LCBldmVudFByb3BzLCB7IGNoaWxkcmVuOiByZW5kZXJDb250ZW50KCkgfSkpKTtcbn1cbiIsIid1c2UgY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5jb25zdCBwYWdlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBwYWdlQ29udGV4dDtcbiIsIid1c2UgY2xpZW50JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtYWtlQ2FuY2VsbGFibGUgZnJvbSAnbWFrZS1jYW5jZWxsYWJsZS1wcm9taXNlJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCAqIGFzIHBkZmpzIGZyb20gJ3BkZmpzLWRpc3QnO1xuaW1wb3J0IHVzZURvY3VtZW50Q29udGV4dCBmcm9tICcuLi9zaGFyZWQvaG9va3MvdXNlRG9jdW1lbnRDb250ZXh0LmpzJztcbmltcG9ydCB1c2VQYWdlQ29udGV4dCBmcm9tICcuLi9zaGFyZWQvaG9va3MvdXNlUGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHVzZVJlc29sdmVyIGZyb20gJy4uL3NoYXJlZC9ob29rcy91c2VSZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBjYW5jZWxSdW5uaW5nVGFzayB9IGZyb20gJy4uL3NoYXJlZC91dGlscy5qcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBbm5vdGF0aW9uTGF5ZXIoKSB7XG4gICAgY29uc3QgZG9jdW1lbnRDb250ZXh0ID0gdXNlRG9jdW1lbnRDb250ZXh0KCk7XG4gICAgY29uc3QgcGFnZUNvbnRleHQgPSB1c2VQYWdlQ29udGV4dCgpO1xuICAgIGludmFyaWFudChwYWdlQ29udGV4dCwgJ1VuYWJsZSB0byBmaW5kIFBhZ2UgY29udGV4dC4nKTtcbiAgICBjb25zdCBtZXJnZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZG9jdW1lbnRDb250ZXh0KSwgcGFnZUNvbnRleHQpO1xuICAgIGNvbnN0IHsgaW1hZ2VSZXNvdXJjZXNQYXRoLCBsaW5rU2VydmljZSwgb25HZXRBbm5vdGF0aW9uc0Vycm9yOiBvbkdldEFubm90YXRpb25zRXJyb3JQcm9wcywgb25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3M6IG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzUHJvcHMsIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3I6IG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3JQcm9wcywgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzOiBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NQcm9wcywgcGFnZSwgcGRmLCByZW5kZXJGb3Jtcywgcm90YXRlLCBzY2FsZSA9IDEsIH0gPSBtZXJnZWRQcm9wcztcbiAgICBpbnZhcmlhbnQocGRmLCAnQXR0ZW1wdGVkIHRvIGxvYWQgcGFnZSBhbm5vdGF0aW9ucywgYnV0IG5vIGRvY3VtZW50IHdhcyBzcGVjaWZpZWQuIFdyYXAgPFBhZ2UgLz4gaW4gYSA8RG9jdW1lbnQgLz4gb3IgcGFzcyBleHBsaWNpdCBgcGRmYCBwcm9wLicpO1xuICAgIGludmFyaWFudChwYWdlLCAnQXR0ZW1wdGVkIHRvIGxvYWQgcGFnZSBhbm5vdGF0aW9ucywgYnV0IG5vIHBhZ2Ugd2FzIHNwZWNpZmllZC4nKTtcbiAgICBpbnZhcmlhbnQobGlua1NlcnZpY2UsICdBdHRlbXB0ZWQgdG8gbG9hZCBwYWdlIGFubm90YXRpb25zLCBidXQgbm8gbGlua1NlcnZpY2Ugd2FzIHNwZWNpZmllZC4nKTtcbiAgICBjb25zdCBbYW5ub3RhdGlvbnNTdGF0ZSwgYW5ub3RhdGlvbnNEaXNwYXRjaF0gPSB1c2VSZXNvbHZlcigpO1xuICAgIGNvbnN0IHsgdmFsdWU6IGFubm90YXRpb25zLCBlcnJvcjogYW5ub3RhdGlvbnNFcnJvciB9ID0gYW5ub3RhdGlvbnNTdGF0ZTtcbiAgICBjb25zdCBsYXllckVsZW1lbnQgPSB1c2VSZWYobnVsbCk7XG4gICAgd2FybmluZyhOdW1iZXIucGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1yZWFjdC1wZGYtYW5ub3RhdGlvbi1sYXllcicpLCAxMCkgPT09IDEsICdBbm5vdGF0aW9uTGF5ZXIgc3R5bGVzIG5vdCBmb3VuZC4gUmVhZCBtb3JlOiBodHRwczovL2dpdGh1Yi5jb20vd29qdGVrbWFqL3JlYWN0LXBkZiNzdXBwb3J0LWZvci1hbm5vdGF0aW9ucycpO1xuICAgIGZ1bmN0aW9uIG9uTG9hZFN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmICghYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzUHJvcHMpIHtcbiAgICAgICAgICAgIG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzUHJvcHMoYW5ub3RhdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uTG9hZEVycm9yKCkge1xuICAgICAgICBpZiAoIWFubm90YXRpb25zRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyhmYWxzZSwgYW5ub3RhdGlvbnNFcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKG9uR2V0QW5ub3RhdGlvbnNFcnJvclByb3BzKSB7XG4gICAgICAgICAgICBvbkdldEFubm90YXRpb25zRXJyb3JQcm9wcyhhbm5vdGF0aW9uc0Vycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiB1c2VFZmZlY3QgaW50ZW50aW9uYWxseSB0cmlnZ2VyZWQgb24gcGFnZSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gcmVzZXRBbm5vdGF0aW9ucygpIHtcbiAgICAgICAgYW5ub3RhdGlvbnNEaXNwYXRjaCh7IHR5cGU6ICdSRVNFVCcgfSk7XG4gICAgfSwgW2Fubm90YXRpb25zRGlzcGF0Y2gsIHBhZ2VdKTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gbG9hZEFubm90YXRpb25zKCkge1xuICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5jZWxsYWJsZSA9IG1ha2VDYW5jZWxsYWJsZShwYWdlLmdldEFubm90YXRpb25zKCkpO1xuICAgICAgICBjb25zdCBydW5uaW5nVGFzayA9IGNhbmNlbGxhYmxlO1xuICAgICAgICBjYW5jZWxsYWJsZS5wcm9taXNlXG4gICAgICAgICAgICAudGhlbigobmV4dEFubm90YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uc0Rpc3BhdGNoKHsgdHlwZTogJ1JFU09MVkUnLCB2YWx1ZTogbmV4dEFubm90YXRpb25zIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnNEaXNwYXRjaCh7IHR5cGU6ICdSRUpFQ1QnLCBlcnJvciB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjYW5jZWxSdW5uaW5nVGFzayhydW5uaW5nVGFzayk7XG4gICAgICAgIH07XG4gICAgfSwgW2Fubm90YXRpb25zRGlzcGF0Y2gsIHBhZ2VdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBPbW1pdHRlZCBjYWxsYmFja3Mgc28gdGhleSBhcmUgbm90IGNhbGxlZCBldmVyeSB0aW1lIHRoZXkgY2hhbmdlXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGFubm90YXRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvbkxvYWRFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uTG9hZFN1Y2Nlc3MoKTtcbiAgICB9LCBbYW5ub3RhdGlvbnNdKTtcbiAgICBmdW5jdGlvbiBvblJlbmRlclN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmIChvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NQcm9wcykge1xuICAgICAgICAgICAgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzUHJvcHMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvblJlbmRlckVycm9yKGVycm9yKSB7XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsIGAke2Vycm9yfWApO1xuICAgICAgICBpZiAob25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvclByb3BzKSB7XG4gICAgICAgICAgICBvblJlbmRlckFubm90YXRpb25MYXllckVycm9yUHJvcHMoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHZpZXdwb3J0ID0gdXNlTWVtbygoKSA9PiBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGUsIHJvdGF0aW9uOiByb3RhdGUgfSksIFtwYWdlLCByb3RhdGUsIHNjYWxlXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiByZW5kZXJBbm5vdGF0aW9uTGF5ZXIoKSB7XG4gICAgICAgIGlmICghcGRmIHx8ICFwYWdlIHx8ICFsaW5rU2VydmljZSB8fCAhYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGN1cnJlbnQ6IGxheWVyIH0gPSBsYXllckVsZW1lbnQ7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZWRWaWV3cG9ydCA9IHZpZXdwb3J0LmNsb25lKHsgZG9udEZsaXA6IHRydWUgfSk7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25MYXllclBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5TWFuYWdlcjogbnVsbCwgLy8gVE9ETzogSW1wbGVtZW50IHRoaXNcbiAgICAgICAgICAgIGFubm90YXRpb25DYW52YXNNYXA6IG51bGwsIC8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgICAgICAgICBhbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyOiBudWxsLCAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpc1xuICAgICAgICAgICAgZGl2OiBsYXllcixcbiAgICAgICAgICAgIGwxMG46IG51bGwsIC8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgdmlld3BvcnQ6IGNsb25lZFZpZXdwb3J0LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZW5kZXJQYXJhbWV0ZXJzID0ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnMsXG4gICAgICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogcGRmLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgZGl2OiBsYXllcixcbiAgICAgICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aCxcbiAgICAgICAgICAgIGxpbmtTZXJ2aWNlLFxuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIHJlbmRlckZvcm1zLFxuICAgICAgICAgICAgdmlld3BvcnQ6IGNsb25lZFZpZXdwb3J0LFxuICAgICAgICB9O1xuICAgICAgICBsYXllci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBwZGZqcy5Bbm5vdGF0aW9uTGF5ZXIoYW5ub3RhdGlvbkxheWVyUGFyYW1ldGVycykucmVuZGVyKHJlbmRlclBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgLy8gSW50ZW50aW9uYWwgaW1tZWRpYXRlIGNhbGxiYWNrXG4gICAgICAgICAgICBvblJlbmRlclN1Y2Nlc3MoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBUT0RPOiBDYW5jZWwgcnVubmluZyB0YXNrP1xuICAgICAgICB9O1xuICAgIH0sIFthbm5vdGF0aW9ucywgaW1hZ2VSZXNvdXJjZXNQYXRoLCBsaW5rU2VydmljZSwgcGFnZSwgcGRmLCByZW5kZXJGb3Jtcywgdmlld3BvcnRdKTtcbiAgICByZXR1cm4gKF9qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsc3goJ3JlYWN0LXBkZl9fUGFnZV9fYW5ub3RhdGlvbnMnLCAnYW5ub3RhdGlvbkxheWVyJyksIHJlZjogbGF5ZXJFbGVtZW50IH0pKTtcbn1cbiIsIid1c2UgY2xpZW50JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWVyZ2VSZWZzIGZyb20gJ21lcmdlLXJlZnMnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCAqIGFzIHBkZmpzIGZyb20gJ3BkZmpzLWRpc3QnO1xuaW1wb3J0IFN0cnVjdFRyZWUgZnJvbSAnLi4vU3RydWN0VHJlZS5qcyc7XG5pbXBvcnQgdXNlUGFnZUNvbnRleHQgZnJvbSAnLi4vc2hhcmVkL2hvb2tzL3VzZVBhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGNhbmNlbFJ1bm5pbmdUYXNrLCBnZXREZXZpY2VQaXhlbFJhdGlvLCBpc0NhbmNlbEV4Y2VwdGlvbiwgbWFrZVBhZ2VDYWxsYmFjaywgfSBmcm9tICcuLi9zaGFyZWQvdXRpbHMuanMnO1xuY29uc3QgQU5OT1RBVElPTl9NT0RFID0gcGRmanMuQW5ub3RhdGlvbk1vZGU7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYW52YXMocHJvcHMpIHtcbiAgICBjb25zdCBwYWdlQ29udGV4dCA9IHVzZVBhZ2VDb250ZXh0KCk7XG4gICAgaW52YXJpYW50KHBhZ2VDb250ZXh0LCAnVW5hYmxlIHRvIGZpbmQgUGFnZSBjb250ZXh0LicpO1xuICAgIGNvbnN0IG1lcmdlZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwYWdlQ29udGV4dCksIHByb3BzKTtcbiAgICBjb25zdCB7IF9jbGFzc05hbWUsIGNhbnZhc0JhY2tncm91bmQsIGRldmljZVBpeGVsUmF0aW8gPSBnZXREZXZpY2VQaXhlbFJhdGlvKCksIG9uUmVuZGVyRXJyb3I6IG9uUmVuZGVyRXJyb3JQcm9wcywgb25SZW5kZXJTdWNjZXNzOiBvblJlbmRlclN1Y2Nlc3NQcm9wcywgcGFnZSwgcmVuZGVyRm9ybXMsIHJlbmRlclRleHRMYXllciwgcm90YXRlLCBzY2FsZSwgfSA9IG1lcmdlZFByb3BzO1xuICAgIGNvbnN0IHsgY2FudmFzUmVmIH0gPSBwcm9wcztcbiAgICBpbnZhcmlhbnQocGFnZSwgJ0F0dGVtcHRlZCB0byByZW5kZXIgcGFnZSBjYW52YXMsIGJ1dCBubyBwYWdlIHdhcyBzcGVjaWZpZWQuJyk7XG4gICAgY29uc3QgY2FudmFzRWxlbWVudCA9IHVzZVJlZihudWxsKTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHBhZ2UgaXMgcmVuZGVyZWQgc3VjY2Vzc2Z1bGx5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uUmVuZGVyU3VjY2VzcygpIHtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvblJlbmRlclN1Y2Nlc3NQcm9wcykge1xuICAgICAgICAgICAgb25SZW5kZXJTdWNjZXNzUHJvcHMobWFrZVBhZ2VDYWxsYmFjayhwYWdlLCBzY2FsZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgcGFnZSBmYWlscyB0byByZW5kZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25SZW5kZXJFcnJvcihlcnJvcikge1xuICAgICAgICBpZiAoaXNDYW5jZWxFeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyhmYWxzZSwgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvblJlbmRlckVycm9yUHJvcHMpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyRXJyb3JQcm9wcyhlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVuZGVyVmlld3BvcnQgPSB1c2VNZW1vKCgpID0+IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZTogc2NhbGUgKiBkZXZpY2VQaXhlbFJhdGlvLCByb3RhdGlvbjogcm90YXRlIH0pLCBbZGV2aWNlUGl4ZWxSYXRpbywgcGFnZSwgcm90YXRlLCBzY2FsZV0pO1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gdXNlTWVtbygoKSA9PiBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGUsIHJvdGF0aW9uOiByb3RhdGUgfSksIFtwYWdlLCByb3RhdGUsIHNjYWxlXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiBkcmF3UGFnZU9uQ2FudmFzKCkge1xuICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmVzIHRoZSBjYW52YXMgd2lsbCBiZSByZS1yZW5kZXJlZCBmcm9tIHNjcmF0Y2guIE90aGVyd2lzZSBhbGwgZm9ybSBkYXRhIHdpbGwgc3RheS5cbiAgICAgICAgcGFnZS5jbGVhbnVwKCk7XG4gICAgICAgIGNvbnN0IHsgY3VycmVudDogY2FudmFzIH0gPSBjYW52YXNFbGVtZW50O1xuICAgICAgICBpZiAoIWNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHJlbmRlclZpZXdwb3J0LndpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gcmVuZGVyVmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHtNYXRoLmZsb29yKHZpZXdwb3J0LndpZHRoKX1weGA7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtNYXRoLmZsb29yKHZpZXdwb3J0LmhlaWdodCl9cHhgO1xuICAgICAgICBjYW52YXMuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBjb25zdCByZW5kZXJDb250ZXh0ID0ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbk1vZGU6IHJlbmRlckZvcm1zID8gQU5OT1RBVElPTl9NT0RFLkVOQUJMRV9GT1JNUyA6IEFOTk9UQVRJT05fTU9ERS5FTkFCTEUsXG4gICAgICAgICAgICBjYW52YXNDb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IGFscGhhOiBmYWxzZSB9KSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiByZW5kZXJWaWV3cG9ydCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNhbnZhc0JhY2tncm91bmQpIHtcbiAgICAgICAgICAgIHJlbmRlckNvbnRleHQuYmFja2dyb3VuZCA9IGNhbnZhc0JhY2tncm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FuY2VsbGFibGUgPSBwYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcnVubmluZ1Rhc2sgPSBjYW5jZWxsYWJsZTtcbiAgICAgICAgY2FuY2VsbGFibGUucHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY2FudmFzLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgICAgICAgIG9uUmVuZGVyU3VjY2VzcygpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKG9uUmVuZGVyRXJyb3IpO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2FuY2VsUnVubmluZ1Rhc2socnVubmluZ1Rhc2spO1xuICAgIH0sIFtjYW52YXNCYWNrZ3JvdW5kLCBwYWdlLCByZW5kZXJGb3JtcywgcmVuZGVyVmlld3BvcnQsIHZpZXdwb3J0XSk7XG4gICAgY29uc3QgY2xlYW51cCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgY29uc3QgeyBjdXJyZW50OiBjYW52YXMgfSA9IGNhbnZhc0VsZW1lbnQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBaZXJvaW5nIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGNhdXNlIG1vc3QgYnJvd3NlcnMgdG8gcmVsZWFzZSBncmFwaGljc1xuICAgICAgICAgKiByZXNvdXJjZXMgaW1tZWRpYXRlbHksIHdoaWNoIGNhbiBncmVhdGx5IHJlZHVjZSBtZW1vcnkgY29uc3VtcHRpb24uXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoY2FudmFzKSB7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSAwO1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IGNsZWFudXAsIFtjbGVhbnVwXSk7XG4gICAgcmV0dXJuIChfanN4KFwiY2FudmFzXCIsIHsgY2xhc3NOYW1lOiBgJHtfY2xhc3NOYW1lfV9fY2FudmFzYCwgZGlyOiBcImx0clwiLCByZWY6IG1lcmdlUmVmcyhjYW52YXNSZWYsIGNhbnZhc0VsZW1lbnQpLCBzdHlsZToge1xuICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgICAgfSwgY2hpbGRyZW46IHJlbmRlclRleHRMYXllciA/IF9qc3goU3RydWN0VHJlZSwge30pIDogbnVsbCB9KSk7XG59XG4iLCIndXNlIGNsaWVudCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFrZUNhbmNlbGxhYmxlIGZyb20gJ21ha2UtY2FuY2VsbGFibGUtcHJvbWlzZSc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgKiBhcyBwZGZqcyBmcm9tICdwZGZqcy1kaXN0JztcbmltcG9ydCB1c2VQYWdlQ29udGV4dCBmcm9tICcuLi9zaGFyZWQvaG9va3MvdXNlUGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHVzZVJlc29sdmVyIGZyb20gJy4uL3NoYXJlZC9ob29rcy91c2VSZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBjYW5jZWxSdW5uaW5nVGFzayB9IGZyb20gJy4uL3NoYXJlZC91dGlscy5qcyc7XG5mdW5jdGlvbiBpc1RleHRJdGVtKGl0ZW0pIHtcbiAgICByZXR1cm4gJ3N0cicgaW4gaXRlbTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRleHRMYXllcigpIHtcbiAgICBjb25zdCBwYWdlQ29udGV4dCA9IHVzZVBhZ2VDb250ZXh0KCk7XG4gICAgaW52YXJpYW50KHBhZ2VDb250ZXh0LCAnVW5hYmxlIHRvIGZpbmQgUGFnZSBjb250ZXh0LicpO1xuICAgIGNvbnN0IHsgY3VzdG9tVGV4dFJlbmRlcmVyLCBvbkdldFRleHRFcnJvciwgb25HZXRUZXh0U3VjY2Vzcywgb25SZW5kZXJUZXh0TGF5ZXJFcnJvciwgb25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzLCBwYWdlLCBwYWdlSW5kZXgsIHBhZ2VOdW1iZXIsIHJvdGF0ZSwgc2NhbGUsIH0gPSBwYWdlQ29udGV4dDtcbiAgICBpbnZhcmlhbnQocGFnZSwgJ0F0dGVtcHRlZCB0byBsb2FkIHBhZ2UgdGV4dCBjb250ZW50LCBidXQgbm8gcGFnZSB3YXMgc3BlY2lmaWVkLicpO1xuICAgIGNvbnN0IFt0ZXh0Q29udGVudFN0YXRlLCB0ZXh0Q29udGVudERpc3BhdGNoXSA9IHVzZVJlc29sdmVyKCk7XG4gICAgY29uc3QgeyB2YWx1ZTogdGV4dENvbnRlbnQsIGVycm9yOiB0ZXh0Q29udGVudEVycm9yIH0gPSB0ZXh0Q29udGVudFN0YXRlO1xuICAgIGNvbnN0IGxheWVyRWxlbWVudCA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBlbmRFbGVtZW50ID0gdXNlUmVmKHVuZGVmaW5lZCk7XG4gICAgd2FybmluZyhOdW1iZXIucGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1yZWFjdC1wZGYtdGV4dC1sYXllcicpLCAxMCkgPT09IDEsICdUZXh0TGF5ZXIgc3R5bGVzIG5vdCBmb3VuZC4gUmVhZCBtb3JlOiBodHRwczovL2dpdGh1Yi5jb20vd29qdGVrbWFqL3JlYWN0LXBkZiNzdXBwb3J0LWZvci10ZXh0LWxheWVyJyk7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBwYWdlIHRleHQgY29udGVudCBpcyByZWFkIHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTG9hZFN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmICghdGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uR2V0VGV4dFN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIG9uR2V0VGV4dFN1Y2Nlc3ModGV4dENvbnRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgcGFnZSB0ZXh0IGNvbnRlbnQgZmFpbGVkIHRvIHJlYWQgc3VjY2Vzc2Z1bGx5XG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Mb2FkRXJyb3IoKSB7XG4gICAgICAgIGlmICghdGV4dENvbnRlbnRFcnJvcikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKGZhbHNlLCB0ZXh0Q29udGVudEVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAob25HZXRUZXh0RXJyb3IpIHtcbiAgICAgICAgICAgIG9uR2V0VGV4dEVycm9yKHRleHRDb250ZW50RXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IHVzZUVmZmVjdCBpbnRlbnRpb25hbGx5IHRyaWdnZXJlZCBvbiBwYWdlIGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiByZXNldFRleHRDb250ZW50KCkge1xuICAgICAgICB0ZXh0Q29udGVudERpc3BhdGNoKHsgdHlwZTogJ1JFU0VUJyB9KTtcbiAgICB9LCBbcGFnZSwgdGV4dENvbnRlbnREaXNwYXRjaF0pO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiBsb2FkVGV4dENvbnRlbnQoKSB7XG4gICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbmNlbGxhYmxlID0gbWFrZUNhbmNlbGxhYmxlKHBhZ2UuZ2V0VGV4dENvbnRlbnQoKSk7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmdUYXNrID0gY2FuY2VsbGFibGU7XG4gICAgICAgIGNhbmNlbGxhYmxlLnByb21pc2VcbiAgICAgICAgICAgIC50aGVuKChuZXh0VGV4dENvbnRlbnQpID0+IHtcbiAgICAgICAgICAgIHRleHRDb250ZW50RGlzcGF0Y2goeyB0eXBlOiAnUkVTT0xWRScsIHZhbHVlOiBuZXh0VGV4dENvbnRlbnQgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudERpc3BhdGNoKHsgdHlwZTogJ1JFSkVDVCcsIGVycm9yIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICgpID0+IGNhbmNlbFJ1bm5pbmdUYXNrKHJ1bm5pbmdUYXNrKTtcbiAgICB9LCBbcGFnZSwgdGV4dENvbnRlbnREaXNwYXRjaF0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAodGV4dENvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0Q29udGVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG9uTG9hZEVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb25Mb2FkU3VjY2VzcygpO1xuICAgIH0sIFt0ZXh0Q29udGVudF0pO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgdGV4dCBsYXllciBpcyByZW5kZXJlZCBzdWNjZXNzZnVsbHlcbiAgICAgKi9cbiAgICBjb25zdCBvblJlbmRlclN1Y2Nlc3MgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIGlmIChvblJlbmRlclRleHRMYXllclN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyVGV4dExheWVyU3VjY2VzcygpO1xuICAgICAgICB9XG4gICAgfSwgW29uUmVuZGVyVGV4dExheWVyU3VjY2Vzc10pO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgdGV4dCBsYXllciBmYWlsZWQgdG8gcmVuZGVyIHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIGNvbnN0IG9uUmVuZGVyRXJyb3IgPSB1c2VDYWxsYmFjaygoZXJyb3IpID0+IHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvblJlbmRlclRleHRMYXllckVycm9yKSB7XG4gICAgICAgICAgICBvblJlbmRlclRleHRMYXllckVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sIFtvblJlbmRlclRleHRMYXllckVycm9yXSk7XG4gICAgZnVuY3Rpb24gb25Nb3VzZURvd24oKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVuZEVsZW1lbnQuY3VycmVudDtcbiAgICAgICAgaWYgKCFlbmQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbmQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uTW91c2VVcCgpIHtcbiAgICAgICAgY29uc3QgZW5kID0gZW5kRWxlbWVudC5jdXJyZW50O1xuICAgICAgICBpZiAoIWVuZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVuZC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICB9XG4gICAgY29uc3Qgdmlld3BvcnQgPSB1c2VNZW1vKCgpID0+IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZSwgcm90YXRpb246IHJvdGF0ZSB9KSwgW3BhZ2UsIHJvdGF0ZSwgc2NhbGVdKTtcbiAgICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyKCkge1xuICAgICAgICBpZiAoIXBhZ2UgfHwgIXRleHRDb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBjdXJyZW50OiBsYXllciB9ID0gbGF5ZXJFbGVtZW50O1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGF5ZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGNvbnN0IHRleHRDb250ZW50U291cmNlID0gcGFnZS5zdHJlYW1UZXh0Q29udGVudCh7IGluY2x1ZGVNYXJrZWRDb250ZW50OiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgICAgICAgY29udGFpbmVyOiBsYXllcixcbiAgICAgICAgICAgIHRleHRDb250ZW50U291cmNlLFxuICAgICAgICAgICAgdmlld3BvcnQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNhbmNlbGxhYmxlID0gbmV3IHBkZmpzLlRleHRMYXllcihwYXJhbWV0ZXJzKTtcbiAgICAgICAgY29uc3QgcnVubmluZ1Rhc2sgPSBjYW5jZWxsYWJsZTtcbiAgICAgICAgY2FuY2VsbGFibGVcbiAgICAgICAgICAgIC5yZW5kZXIoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW5kID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBlbmQuY2xhc3NOYW1lID0gJ2VuZE9mQ29udGVudCc7XG4gICAgICAgICAgICBsYXllci5hcHBlbmQoZW5kKTtcbiAgICAgICAgICAgIGVuZEVsZW1lbnQuY3VycmVudCA9IGVuZDtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyQ2hpbGRyZW4gPSBsYXllci5xdWVyeVNlbGVjdG9yQWxsKCdbcm9sZT1cInByZXNlbnRhdGlvblwiXScpO1xuICAgICAgICAgICAgaWYgKGN1c3RvbVRleHRSZW5kZXJlcikge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMuZm9yRWFjaCgoaXRlbSwgaXRlbUluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNUZXh0SXRlbShpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbGF5ZXJDaGlsZHJlbltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gY3VzdG9tVGV4dFJlbmRlcmVyKE9iamVjdC5hc3NpZ24oeyBwYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUluZGV4IH0sIGl0ZW0pKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuaW5uZXJIVE1MID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gaXRlbS5zdHIgJiYgaXRlbS5oYXNFT0wgPyAyIDogMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEludGVudGlvbmFsIGltbWVkaWF0ZSBjYWxsYmFja1xuICAgICAgICAgICAgb25SZW5kZXJTdWNjZXNzKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2gob25SZW5kZXJFcnJvcik7XG4gICAgICAgIHJldHVybiAoKSA9PiBjYW5jZWxSdW5uaW5nVGFzayhydW5uaW5nVGFzayk7XG4gICAgfSwgW1xuICAgICAgICBjdXN0b21UZXh0UmVuZGVyZXIsXG4gICAgICAgIG9uUmVuZGVyRXJyb3IsXG4gICAgICAgIG9uUmVuZGVyU3VjY2VzcyxcbiAgICAgICAgcGFnZSxcbiAgICAgICAgcGFnZUluZGV4LFxuICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICB0ZXh0Q29udGVudCxcbiAgICAgICAgdmlld3BvcnQsXG4gICAgXSk7XG4gICAgcmV0dXJuIChfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjbHN4KCdyZWFjdC1wZGZfX1BhZ2VfX3RleHRDb250ZW50JywgJ3RleHRMYXllcicpLCBvbk1vdXNlVXA6IG9uTW91c2VVcCwgb25Nb3VzZURvd246IG9uTW91c2VEb3duLCByZWY6IGxheWVyRWxlbWVudCB9KSk7XG59XG4iLCIvLyBBcyBkZWZpbmVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3BkZi5qcy9ibG9iL2Q5ZmFjMzQ1OTYwOWE4MDdiZTY1MDZmYjM0NDFiNWRhNGIxNTRkMTQvc3JjL3NoYXJlZC91dGlsLmpzI0wzNzEtTDM3NFxuY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7XG4gICAgTkVFRF9QQVNTV09SRDogMSxcbiAgICBJTkNPUlJFQ1RfUEFTU1dPUkQ6IDIsXG59O1xuZXhwb3J0IGRlZmF1bHQgUGFzc3dvcmRSZXNwb25zZXM7XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1ha2VDYW5jZWxsYWJsZSBmcm9tICdtYWtlLWNhbmNlbGxhYmxlLXByb21pc2UnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCBTdHJ1Y3RUcmVlSXRlbSBmcm9tICcuL1N0cnVjdFRyZWVJdGVtLmpzJztcbmltcG9ydCB1c2VQYWdlQ29udGV4dCBmcm9tICcuL3NoYXJlZC9ob29rcy91c2VQYWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdXNlUmVzb2x2ZXIgZnJvbSAnLi9zaGFyZWQvaG9va3MvdXNlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgY2FuY2VsUnVubmluZ1Rhc2sgfSBmcm9tICcuL3NoYXJlZC91dGlscy5qcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTdHJ1Y3RUcmVlKCkge1xuICAgIGNvbnN0IHBhZ2VDb250ZXh0ID0gdXNlUGFnZUNvbnRleHQoKTtcbiAgICBpbnZhcmlhbnQocGFnZUNvbnRleHQsICdVbmFibGUgdG8gZmluZCBQYWdlIGNvbnRleHQuJyk7XG4gICAgY29uc3QgeyBvbkdldFN0cnVjdFRyZWVFcnJvcjogb25HZXRTdHJ1Y3RUcmVlRXJyb3JQcm9wcywgb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzczogb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzc1Byb3BzLCB9ID0gcGFnZUNvbnRleHQ7XG4gICAgY29uc3QgW3N0cnVjdFRyZWVTdGF0ZSwgc3RydWN0VHJlZURpc3BhdGNoXSA9IHVzZVJlc29sdmVyKCk7XG4gICAgY29uc3QgeyB2YWx1ZTogc3RydWN0VHJlZSwgZXJyb3I6IHN0cnVjdFRyZWVFcnJvciB9ID0gc3RydWN0VHJlZVN0YXRlO1xuICAgIGNvbnN0IHsgY3VzdG9tVGV4dFJlbmRlcmVyLCBwYWdlIH0gPSBwYWdlQ29udGV4dDtcbiAgICBmdW5jdGlvbiBvbkxvYWRTdWNjZXNzKCkge1xuICAgICAgICBpZiAoIXN0cnVjdFRyZWUpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uR2V0U3RydWN0VHJlZVN1Y2Nlc3NQcm9wcykge1xuICAgICAgICAgICAgb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzc1Byb3BzKHN0cnVjdFRyZWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uTG9hZEVycm9yKCkge1xuICAgICAgICBpZiAoIXN0cnVjdFRyZWVFcnJvcikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKGZhbHNlLCBzdHJ1Y3RUcmVlRXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvbkdldFN0cnVjdFRyZWVFcnJvclByb3BzKSB7XG4gICAgICAgICAgICBvbkdldFN0cnVjdFRyZWVFcnJvclByb3BzKHN0cnVjdFRyZWVFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdXNlRWZmZWN0IGludGVudGlvbmFsbHkgdHJpZ2dlcmVkIG9uIHBhZ2UgY2hhbmdlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIHJlc2V0U3RydWN0VHJlZSgpIHtcbiAgICAgICAgc3RydWN0VHJlZURpc3BhdGNoKHsgdHlwZTogJ1JFU0VUJyB9KTtcbiAgICB9LCBbc3RydWN0VHJlZURpc3BhdGNoLCBwYWdlXSk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIGxvYWRTdHJ1Y3RUcmVlKCkge1xuICAgICAgICBpZiAoY3VzdG9tVGV4dFJlbmRlcmVyKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBEb2N1bWVudCB3aHkgdGhpcyBpcyBuZWNlc3NhcnlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5jZWxsYWJsZSA9IG1ha2VDYW5jZWxsYWJsZShwYWdlLmdldFN0cnVjdFRyZWUoKSk7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmdUYXNrID0gY2FuY2VsbGFibGU7XG4gICAgICAgIGNhbmNlbGxhYmxlLnByb21pc2VcbiAgICAgICAgICAgIC50aGVuKChuZXh0U3RydWN0VHJlZSkgPT4ge1xuICAgICAgICAgICAgc3RydWN0VHJlZURpc3BhdGNoKHsgdHlwZTogJ1JFU09MVkUnLCB2YWx1ZTogbmV4dFN0cnVjdFRyZWUgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBzdHJ1Y3RUcmVlRGlzcGF0Y2goeyB0eXBlOiAnUkVKRUNUJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2FuY2VsUnVubmluZ1Rhc2socnVubmluZ1Rhc2spO1xuICAgIH0sIFtjdXN0b21UZXh0UmVuZGVyZXIsIHBhZ2UsIHN0cnVjdFRyZWVEaXNwYXRjaF0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoc3RydWN0VHJlZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cnVjdFRyZWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvbkxvYWRFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uTG9hZFN1Y2Nlc3MoKTtcbiAgICB9LCBbc3RydWN0VHJlZV0pO1xuICAgIGlmICghc3RydWN0VHJlZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIF9qc3goU3RydWN0VHJlZUl0ZW0sIHsgY2xhc3NOYW1lOiBcInJlYWN0LXBkZl9fUGFnZV9fc3RydWN0VHJlZSBzdHJ1Y3RUcmVlXCIsIG5vZGU6IHN0cnVjdFRyZWUgfSk7XG59XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEF0dHJpYnV0ZXMsIGlzU3RydWN0VHJlZU5vZGUsIGlzU3RydWN0VHJlZU5vZGVXaXRoT25seUNvbnRlbnRDaGlsZCwgfSBmcm9tICcuL3NoYXJlZC9zdHJ1Y3RUcmVlVXRpbHMuanMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU3RydWN0VHJlZUl0ZW0oeyBjbGFzc05hbWUsIG5vZGUsIH0pIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdXNlTWVtbygoKSA9PiBnZXRBdHRyaWJ1dGVzKG5vZGUpLCBbbm9kZV0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IExvb2tzIGxpa2UgYSBCaW9tZSBlcnJvclxuICAgIGNvbnN0IGNoaWxkcmVuID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmICghaXNTdHJ1Y3RUcmVlTm9kZShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU3RydWN0VHJlZU5vZGVXaXRoT25seUNvbnRlbnRDaGlsZChub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXJyYXlJbmRleEtleTogaW5kZXggaXMgc3RhYmxlIGhlcmVcbiAgICAgICAgICAgIF9qc3goU3RydWN0VHJlZUl0ZW0sIHsgbm9kZTogY2hpbGQgfSwgaW5kZXgpKTtcbiAgICAgICAgfSk7XG4gICAgfSwgW25vZGVdKTtcbiAgICByZXR1cm4gKF9qc3goXCJzcGFuXCIsIE9iamVjdC5hc3NpZ24oeyBjbGFzc05hbWU6IGNsYXNzTmFtZSB9LCBhdHRyaWJ1dGVzLCB7IGNoaWxkcmVuOiBjaGlsZHJlbiB9KSkpO1xufVxuIiwiLy8gRnJvbSBwZGZqcy1kaXN0L2xpYi93ZWIvc3RydWN0X3RyZWVfbGF5ZXJfYnVpbGRlci5qc1xuZXhwb3J0IGNvbnN0IFBERl9ST0xFX1RPX0hUTUxfUk9MRSA9IHtcbiAgICAvLyBEb2N1bWVudCBsZXZlbCBzdHJ1Y3R1cmUgdHlwZXNcbiAgICBEb2N1bWVudDogbnVsbCwgLy8gVGhlcmUncyBhIFwiZG9jdW1lbnRcIiByb2xlLCBidXQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIGhlcmUuXG4gICAgRG9jdW1lbnRGcmFnbWVudDogbnVsbCxcbiAgICAvLyBHcm91cGluZyBsZXZlbCBzdHJ1Y3R1cmUgdHlwZXNcbiAgICBQYXJ0OiAnZ3JvdXAnLFxuICAgIFNlY3Q6ICdncm91cCcsIC8vIFhYWDogVGhlcmUncyBhIFwic2VjdGlvblwiIHJvbGUsIGJ1dCBpdCdzIGFic3RyYWN0LlxuICAgIERpdjogJ2dyb3VwJyxcbiAgICBBc2lkZTogJ25vdGUnLFxuICAgIE5vblN0cnVjdDogJ25vbmUnLFxuICAgIC8vIEJsb2NrIGxldmVsIHN0cnVjdHVyZSB0eXBlc1xuICAgIFA6IG51bGwsXG4gICAgLy8gSDxuPixcbiAgICBIOiAnaGVhZGluZycsXG4gICAgVGl0bGU6IG51bGwsXG4gICAgRkVOb3RlOiAnbm90ZScsXG4gICAgLy8gU3ViLWJsb2NrIGxldmVsIHN0cnVjdHVyZSB0eXBlXG4gICAgU3ViOiAnZ3JvdXAnLFxuICAgIC8vIEdlbmVyYWwgaW5saW5lIGxldmVsIHN0cnVjdHVyZSB0eXBlc1xuICAgIExibDogbnVsbCxcbiAgICBTcGFuOiBudWxsLFxuICAgIEVtOiBudWxsLFxuICAgIFN0cm9uZzogbnVsbCxcbiAgICBMaW5rOiAnbGluaycsXG4gICAgQW5ub3Q6ICdub3RlJyxcbiAgICBGb3JtOiAnZm9ybScsXG4gICAgLy8gUnVieSBhbmQgV2FyaWNodSBzdHJ1Y3R1cmUgdHlwZXNcbiAgICBSdWJ5OiBudWxsLFxuICAgIFJCOiBudWxsLFxuICAgIFJUOiBudWxsLFxuICAgIFJQOiBudWxsLFxuICAgIFdhcmljaHU6IG51bGwsXG4gICAgV1Q6IG51bGwsXG4gICAgV1A6IG51bGwsXG4gICAgLy8gTGlzdCBzdGFuZGFyZCBzdHJ1Y3R1cmUgdHlwZXNcbiAgICBMOiAnbGlzdCcsXG4gICAgTEk6ICdsaXN0aXRlbScsXG4gICAgTEJvZHk6IG51bGwsXG4gICAgLy8gVGFibGUgc3RhbmRhcmQgc3RydWN0dXJlIHR5cGVzXG4gICAgVGFibGU6ICd0YWJsZScsXG4gICAgVFI6ICdyb3cnLFxuICAgIFRIOiAnY29sdW1uaGVhZGVyJyxcbiAgICBURDogJ2NlbGwnLFxuICAgIFRIZWFkOiAnY29sdW1uaGVhZGVyJyxcbiAgICBUQm9keTogbnVsbCxcbiAgICBURm9vdDogbnVsbCxcbiAgICAvLyBTdGFuZGFyZCBzdHJ1Y3R1cmUgdHlwZSBDYXB0aW9uXG4gICAgQ2FwdGlvbjogbnVsbCxcbiAgICAvLyBTdGFuZGFyZCBzdHJ1Y3R1cmUgdHlwZSBGaWd1cmVcbiAgICBGaWd1cmU6ICdmaWd1cmUnLFxuICAgIC8vIFN0YW5kYXJkIHN0cnVjdHVyZSB0eXBlIEZvcm11bGFcbiAgICBGb3JtdWxhOiBudWxsLFxuICAgIC8vIHN0YW5kYXJkIHN0cnVjdHVyZSB0eXBlIEFydGlmYWN0XG4gICAgQXJ0aWZhY3Q6IG51bGwsXG59O1xuZXhwb3J0IGNvbnN0IEhFQURJTkdfUEFUVEVSTiA9IC9eSChcXGQrKSQvO1xuIiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEb2N1bWVudENvbnRleHQgZnJvbSAnLi4vLi4vRG9jdW1lbnRDb250ZXh0LmpzJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZURvY3VtZW50Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdXNlQ29udGV4dChEb2N1bWVudENvbnRleHQpO1xufVxuIiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQYWdlQ29udGV4dCBmcm9tICcuLi8uLi9QYWdlQ29udGV4dC5qcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VQYWdlQ29udGV4dCgpIHtcbiAgICByZXR1cm4gdXNlQ29udGV4dChQYWdlQ29udGV4dCk7XG59XG4iLCJpbXBvcnQgeyB1c2VSZWR1Y2VyIH0gZnJvbSAncmVhY3QnO1xuZnVuY3Rpb24gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdSRVNPTFZFJzpcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBhY3Rpb24udmFsdWUsIGVycm9yOiB1bmRlZmluZWQgfTtcbiAgICAgICAgY2FzZSAnUkVKRUNUJzpcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBmYWxzZSwgZXJyb3I6IGFjdGlvbi5lcnJvciB9O1xuICAgICAgICBjYXNlICdSRVNFVCc6XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBlcnJvcjogdW5kZWZpbmVkIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUmVzb2x2ZXIoKSB7XG4gICAgcmV0dXJuIHVzZVJlZHVjZXIoKHJlZHVjZXIpLCB7IHZhbHVlOiB1bmRlZmluZWQsIGVycm9yOiB1bmRlZmluZWQgfSk7XG59XG4iLCJpbXBvcnQgeyBIRUFESU5HX1BBVFRFUk4sIFBERl9ST0xFX1RPX0hUTUxfUk9MRSB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc1BkZlJvbGUocm9sZSkge1xuICAgIHJldHVybiByb2xlIGluIFBERl9ST0xFX1RPX0hUTUxfUk9MRTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cnVjdFRyZWVOb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gJ2NoaWxkcmVuJyBpbiBub2RlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RydWN0VHJlZU5vZGVXaXRoT25seUNvbnRlbnRDaGlsZChub2RlKSB7XG4gICAgaWYgKCFpc1N0cnVjdFRyZWVOb2RlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIDAgaW4gbm9kZS5jaGlsZHJlbiAmJiAnaWQnIGluIG5vZGUuY2hpbGRyZW5bMF07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9sZUF0dHJpYnV0ZXMobm9kZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcbiAgICBpZiAoaXNTdHJ1Y3RUcmVlTm9kZShub2RlKSkge1xuICAgICAgICBjb25zdCB7IHJvbGUgfSA9IG5vZGU7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSByb2xlLm1hdGNoKEhFQURJTkdfUEFUVEVSTik7XG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLnJvbGUgPSAnaGVhZGluZyc7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzWydhcmlhLWxldmVsJ10gPSBOdW1iZXIobWF0Y2hlc1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQZGZSb2xlKHJvbGUpKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sUm9sZSA9IFBERl9ST0xFX1RPX0hUTUxfUk9MRVtyb2xlXTtcbiAgICAgICAgICAgIGlmIChodG1sUm9sZSkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucm9sZSA9IGh0bWxSb2xlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VBdHRyaWJ1dGVzKG5vZGUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgaWYgKGlzU3RydWN0VHJlZU5vZGUobm9kZSkpIHtcbiAgICAgICAgaWYgKG5vZGUuYWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNbJ2FyaWEtbGFiZWwnXSA9IG5vZGUuYWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmxhbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXR0cmlidXRlcy5sYW5nID0gbm9kZS5sYW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cnVjdFRyZWVOb2RlV2l0aE9ubHlDb250ZW50Q2hpbGQobm9kZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtjaGlsZF0gPSBub2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRBdHRyaWJ1dGVzID0gZ2V0QmFzZUF0dHJpYnV0ZXMoY2hpbGQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGF0dHJpYnV0ZXMpLCBjaGlsZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoJ2lkJyBpbiBub2RlKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzWydhcmlhLW93bnMnXSA9IG5vZGUuaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QXR0cmlidXRlcyhub2RlKSB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZXRSb2xlQXR0cmlidXRlcyhub2RlKSksIGdldEJhc2VBdHRyaWJ1dGVzKG5vZGUpKTtcbn1cbiIsImltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG4vKipcbiAqIENoZWNrcyBpZiB3ZSdyZSBydW5uaW5nIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQnJvd3NlciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHdlJ3JlIHJ1bm5pbmcgZnJvbSBhIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5leHBvcnQgY29uc3QgaXNMb2NhbEZpbGVTeXN0ZW0gPSBpc0Jyb3dzZXIgJiYgd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnZmlsZTonO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhcmlhYmxlIGlzIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIHsqfSB2YXJpYWJsZSBWYXJpYWJsZSB0byBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkKHZhcmlhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSAhPT0gJ3VuZGVmaW5lZCc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFyaWFibGUgaXMgZGVmaW5lZCBhbmQgbm90IG51bGwuXG4gKlxuICogQHBhcmFtIHsqfSB2YXJpYWJsZSBWYXJpYWJsZSB0byBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcm92aWRlZCh2YXJpYWJsZSkge1xuICAgIHJldHVybiBpc0RlZmluZWQodmFyaWFibGUpICYmIHZhcmlhYmxlICE9PSBudWxsO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhcmlhYmxlIHByb3ZpZGVkIGlzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFyaWFibGUgVmFyaWFibGUgdG8gY2hlY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhcmlhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PT0gJ3N0cmluZyc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFyaWFibGUgcHJvdmlkZWQgaXMgYW4gQXJyYXlCdWZmZXIuXG4gKlxuICogQHBhcmFtIHsqfSB2YXJpYWJsZSBWYXJpYWJsZSB0byBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YXJpYWJsZSkge1xuICAgIHJldHVybiB2YXJpYWJsZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhcmlhYmxlIHByb3ZpZGVkIGlzIGEgQmxvYi5cbiAqXG4gKiBAcGFyYW0geyp9IHZhcmlhYmxlIFZhcmlhYmxlIHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jsb2IodmFyaWFibGUpIHtcbiAgICBpbnZhcmlhbnQoaXNCcm93c2VyLCAnaXNCbG9iIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBicm93c2VyIGVudmlyb25tZW50Jyk7XG4gICAgcmV0dXJuIHZhcmlhYmxlIGluc3RhbmNlb2YgQmxvYjtcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YXJpYWJsZSBwcm92aWRlZCBpcyBhIGRhdGEgVVJJLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFyaWFibGUgU3RyaW5nIHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFVUkkodmFyaWFibGUpIHtcbiAgICByZXR1cm4gaXNTdHJpbmcodmFyaWFibGUpICYmIC9eZGF0YTovLnRlc3QodmFyaWFibGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFVUkl0b0J5dGVTdHJpbmcoZGF0YVVSSSkge1xuICAgIGludmFyaWFudChpc0RhdGFVUkkoZGF0YVVSSSksICdJbnZhbGlkIGRhdGEgVVJJLicpO1xuICAgIGNvbnN0IFtoZWFkZXJzU3RyaW5nID0gJycsIGRhdGFTdHJpbmcgPSAnJ10gPSBkYXRhVVJJLnNwbGl0KCcsJyk7XG4gICAgY29uc3QgaGVhZGVycyA9IGhlYWRlcnNTdHJpbmcuc3BsaXQoJzsnKTtcbiAgICBpZiAoaGVhZGVycy5pbmRleE9mKCdiYXNlNjQnKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGF0b2IoZGF0YVN0cmluZyk7XG4gICAgfVxuICAgIHJldHVybiB1bmVzY2FwZShkYXRhU3RyaW5nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXZpY2VQaXhlbFJhdGlvKCkge1xuICAgIHJldHVybiAoaXNCcm93c2VyICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSB8fCAxO1xufVxuY29uc3QgYWxsb3dGaWxlQWNjZXNzRnJvbUZpbGVzVGlwID0gJ09uIENocm9taXVtIGJhc2VkIGJyb3dzZXJzLCB5b3UgY2FuIHVzZSAtLWFsbG93LWZpbGUtYWNjZXNzLWZyb20tZmlsZXMgZmxhZyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLic7XG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheUNPUlNXYXJuaW5nKCkge1xuICAgIHdhcm5pbmcoIWlzTG9jYWxGaWxlU3lzdGVtLCBgTG9hZGluZyBQREYgYXMgYmFzZTY0IHN0cmluZ3MvVVJMcyBtYXkgbm90IHdvcmsgb24gcHJvdG9jb2xzIG90aGVyIHRoYW4gSFRUUC9IVFRQUy4gJHthbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZXNUaXB9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheVdvcmtlcldhcm5pbmcoKSB7XG4gICAgd2FybmluZyghaXNMb2NhbEZpbGVTeXN0ZW0sIGBMb2FkaW5nIFBERi5qcyB3b3JrZXIgbWF5IG5vdCB3b3JrIG9uIHByb3RvY29scyBvdGhlciB0aGFuIEhUVFAvSFRUUFMuICR7YWxsb3dGaWxlQWNjZXNzRnJvbUZpbGVzVGlwfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhbmNlbFJ1bm5pbmdUYXNrKHJ1bm5pbmdUYXNrKSB7XG4gICAgaWYgKHJ1bm5pbmdUYXNrID09PSBudWxsIHx8IHJ1bm5pbmdUYXNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBydW5uaW5nVGFzay5jYW5jZWwpXG4gICAgICAgIHJ1bm5pbmdUYXNrLmNhbmNlbCgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQYWdlQ2FsbGJhY2socGFnZSwgc2NhbGUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFnZSwgJ3dpZHRoJywge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3WzJdICogc2NhbGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFnZSwgJ2hlaWdodCcsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld1szXSAqIHNjYWxlO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhZ2UsICdvcmlnaW5hbFdpZHRoJywge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3WzJdO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhZ2UsICdvcmlnaW5hbEhlaWdodCcsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld1szXTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBwYWdlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FuY2VsRXhjZXB0aW9uKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yLm5hbWUgPT09ICdSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24nO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGcm9tRmlsZShmaWxlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghcmVhZGVyLnJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdFcnJvciB3aGlsZSByZWFkaW5nIGEgZmlsZS4nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpO1xuICAgICAgICB9O1xuICAgICAgICByZWFkZXIub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignRXJyb3Igd2hpbGUgcmVhZGluZyBhIGZpbGUuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdFcnJvciB3aGlsZSByZWFkaW5nIGEgZmlsZS4nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2ggKGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIGVycm9yLk5PVF9GT1VORF9FUlI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdFcnJvciB3aGlsZSByZWFkaW5nIGEgZmlsZTogRmlsZSBub3QgZm91bmQuJykpO1xuICAgICAgICAgICAgICAgIGNhc2UgZXJyb3IuU0VDVVJJVFlfRVJSOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignRXJyb3Igd2hpbGUgcmVhZGluZyBhIGZpbGU6IFNlY3VyaXR5IGVycm9yLicpKTtcbiAgICAgICAgICAgICAgICBjYXNlIGVycm9yLkFCT1JUX0VSUjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIHdoaWxlIHJlYWRpbmcgYSBmaWxlOiBBYm9ydGVkLicpKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignRXJyb3Igd2hpbGUgcmVhZGluZyBhIGZpbGUuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XG4gICAgfSk7XG59XG4iLCIvLyBzcmMvaW5kZXgudHNcbmltcG9ydCAqIGFzIFJlYWN0MiBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yIGFzIHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yMiB9IGZyb20gXCJ1c2Utc3luYy1leHRlcm5hbC1zdG9yZS93aXRoLXNlbGVjdG9yLmpzXCI7XG5cbi8vIHNyYy91dGlscy9yZWFjdC50c1xuaW1wb3J0ICogYXMgUmVhY3RPcmlnaW5hbCBmcm9tIFwicmVhY3RcIjtcbnZhciBSZWFjdCA9IChcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIC8vIEB0cy1pZ25vcmVcbiAgXCJkZWZhdWx0XCIgaW4gUmVhY3RPcmlnaW5hbCA/IFJlYWN0T3JpZ2luYWxbXCJkZWZhdWx0XCJdIDogUmVhY3RPcmlnaW5hbFxuKTtcblxuLy8gc3JjL2NvbXBvbmVudHMvQ29udGV4dC50c1xudmFyIENvbnRleHRLZXkgPSBTeW1ib2wuZm9yKGByZWFjdC1yZWR1eC1jb250ZXh0YCk7XG52YXIgZ1QgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbFRoaXMgOiAoXG4gIC8qIGZhbGwgYmFjayB0byBhIHBlci1tb2R1bGUgc2NvcGUgKHByZS04LjEgYmVoYXZpb3VyKSBpZiBgZ2xvYmFsVGhpc2AgaXMgbm90IGF2YWlsYWJsZSAqL1xuICB7fVxuKTtcbmZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gIGlmICghUmVhY3QuY3JlYXRlQ29udGV4dClcbiAgICByZXR1cm4ge307XG4gIGNvbnN0IGNvbnRleHRNYXAgPSBnVFtDb250ZXh0S2V5XSA/PyAoZ1RbQ29udGV4dEtleV0gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgbGV0IHJlYWxDb250ZXh0ID0gY29udGV4dE1hcC5nZXQoUmVhY3QuY3JlYXRlQ29udGV4dCk7XG4gIGlmICghcmVhbENvbnRleHQpIHtcbiAgICByZWFsQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoXG4gICAgICBudWxsXG4gICAgKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICByZWFsQ29udGV4dC5kaXNwbGF5TmFtZSA9IFwiUmVhY3RSZWR1eFwiO1xuICAgIH1cbiAgICBjb250ZXh0TWFwLnNldChSZWFjdC5jcmVhdGVDb250ZXh0LCByZWFsQ29udGV4dCk7XG4gIH1cbiAgcmV0dXJuIHJlYWxDb250ZXh0O1xufVxudmFyIFJlYWN0UmVkdXhDb250ZXh0ID0gLyogQF9fUFVSRV9fICovIGdldENvbnRleHQoKTtcblxuLy8gc3JjL3V0aWxzL3VzZVN5bmNFeHRlcm5hbFN0b3JlLnRzXG52YXIgbm90SW5pdGlhbGl6ZWQgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihcInVTRVMgbm90IGluaXRpYWxpemVkIVwiKTtcbn07XG5cbi8vIHNyYy9ob29rcy91c2VSZWR1eENvbnRleHQudHNcbmZ1bmN0aW9uIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VSZWR1eENvbnRleHQyKCkge1xuICAgIGNvbnN0IGNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZUNvbnRleHQoY29udGV4dCk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhY29udGV4dFZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiY291bGQgbm90IGZpbmQgcmVhY3QtcmVkdXggY29udGV4dCB2YWx1ZTsgcGxlYXNlIGVuc3VyZSB0aGUgY29tcG9uZW50IGlzIHdyYXBwZWQgaW4gYSA8UHJvdmlkZXI+XCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0VmFsdWU7XG4gIH07XG59XG52YXIgdXNlUmVkdXhDb250ZXh0ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soKTtcblxuLy8gc3JjL2hvb2tzL3VzZVNlbGVjdG9yLnRzXG52YXIgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgPSBub3RJbml0aWFsaXplZDtcbnZhciBpbml0aWFsaXplVXNlU2VsZWN0b3IgPSAoZm4pID0+IHtcbiAgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgPSBmbjtcbn07XG52YXIgcmVmRXF1YWxpdHkgPSAoYSwgYikgPT4gYSA9PT0gYjtcbmZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9ySG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgY29uc3QgdXNlUmVkdXhDb250ZXh0MiA9IGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlUmVkdXhDb250ZXh0IDogY3JlYXRlUmVkdXhDb250ZXh0SG9vayhjb250ZXh0KTtcbiAgY29uc3QgdXNlU2VsZWN0b3IyID0gKHNlbGVjdG9yLCBlcXVhbGl0eUZuT3JPcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7IGVxdWFsaXR5Rm4gPSByZWZFcXVhbGl0eSwgZGV2TW9kZUNoZWNrcyA9IHt9IH0gPSB0eXBlb2YgZXF1YWxpdHlGbk9yT3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiID8geyBlcXVhbGl0eUZuOiBlcXVhbGl0eUZuT3JPcHRpb25zIH0gOiBlcXVhbGl0eUZuT3JPcHRpb25zO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgbXVzdCBwYXNzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBmdW5jdGlvbiBhcyBhIHNlbGVjdG9yIHRvIHVzZVNlbGVjdG9yYCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGVxdWFsaXR5Rm4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFlvdSBtdXN0IHBhc3MgYSBmdW5jdGlvbiBhcyBhbiBlcXVhbGl0eSBmdW5jdGlvbiB0byB1c2VTZWxlY3RvcmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZSxcbiAgICAgIHN0YWJpbGl0eUNoZWNrLFxuICAgICAgaWRlbnRpdHlGdW5jdGlvbkNoZWNrXG4gICAgfSA9IHVzZVJlZHV4Q29udGV4dDIoKTtcbiAgICBjb25zdCBmaXJzdFJ1biA9IFJlYWN0LnVzZVJlZih0cnVlKTtcbiAgICBjb25zdCB3cmFwcGVkU2VsZWN0b3IgPSBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgIHtcbiAgICAgICAgW3NlbGVjdG9yLm5hbWVdKHN0YXRlKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBzZWxlY3RvcihzdGF0ZSk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBpZGVudGl0eUZ1bmN0aW9uQ2hlY2s6IGZpbmFsSWRlbnRpdHlGdW5jdGlvbkNoZWNrLFxuICAgICAgICAgICAgICBzdGFiaWxpdHlDaGVjazogZmluYWxTdGFiaWxpdHlDaGVja1xuICAgICAgICAgICAgfSA9IHtcbiAgICAgICAgICAgICAgc3RhYmlsaXR5Q2hlY2ssXG4gICAgICAgICAgICAgIGlkZW50aXR5RnVuY3Rpb25DaGVjayxcbiAgICAgICAgICAgICAgLi4uZGV2TW9kZUNoZWNrc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChmaW5hbFN0YWJpbGl0eUNoZWNrID09PSBcImFsd2F5c1wiIHx8IGZpbmFsU3RhYmlsaXR5Q2hlY2sgPT09IFwib25jZVwiICYmIGZpcnN0UnVuLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9Db21wYXJlID0gc2VsZWN0b3Ioc3RhdGUpO1xuICAgICAgICAgICAgICBpZiAoIWVxdWFsaXR5Rm4oc2VsZWN0ZWQsIHRvQ29tcGFyZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhY2sgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAgICh7IHN0YWNrIH0gPSBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgXCJTZWxlY3RvciBcIiArIChzZWxlY3Rvci5uYW1lIHx8IFwidW5rbm93blwiKSArIFwiIHJldHVybmVkIGEgZGlmZmVyZW50IHJlc3VsdCB3aGVuIGNhbGxlZCB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMuIFRoaXMgY2FuIGxlYWQgdG8gdW5uZWNlc3NhcnkgcmVyZW5kZXJzLlxcblNlbGVjdG9ycyB0aGF0IHJldHVybiBhIG5ldyByZWZlcmVuY2UgKHN1Y2ggYXMgYW4gb2JqZWN0IG9yIGFuIGFycmF5KSBzaG91bGQgYmUgbWVtb2l6ZWQ6IGh0dHBzOi8vcmVkdXguanMub3JnL3VzYWdlL2Rlcml2aW5nLWRhdGEtc2VsZWN0b3JzI29wdGltaXppbmctc2VsZWN0b3JzLXdpdGgtbWVtb2l6YXRpb25cIixcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDI6IHRvQ29tcGFyZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhY2tcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmluYWxJZGVudGl0eUZ1bmN0aW9uQ2hlY2sgPT09IFwiYWx3YXlzXCIgfHwgZmluYWxJZGVudGl0eUZ1bmN0aW9uQ2hlY2sgPT09IFwib25jZVwiICYmIGZpcnN0UnVuLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkID09PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdGFjayA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgICAgKHsgc3RhY2sgfSA9IGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBcIlNlbGVjdG9yIFwiICsgKHNlbGVjdG9yLm5hbWUgfHwgXCJ1bmtub3duXCIpICsgXCIgcmV0dXJuZWQgdGhlIHJvb3Qgc3RhdGUgd2hlbiBjYWxsZWQuIFRoaXMgY2FuIGxlYWQgdG8gdW5uZWNlc3NhcnkgcmVyZW5kZXJzLlxcblNlbGVjdG9ycyB0aGF0IHJldHVybiB0aGUgZW50aXJlIHN0YXRlIGFyZSBhbG1vc3QgY2VydGFpbmx5IGEgbWlzdGFrZSwgYXMgdGhleSB3aWxsIGNhdXNlIGEgcmVyZW5kZXIgd2hlbmV2ZXIgKmFueXRoaW5nKiBpbiBzdGF0ZSBjaGFuZ2VzLlwiLFxuICAgICAgICAgICAgICAgICAgeyBzdGFjayB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0UnVuLmN1cnJlbnQpXG4gICAgICAgICAgICAgIGZpcnN0UnVuLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xuICAgICAgICB9XG4gICAgICB9W3NlbGVjdG9yLm5hbWVdLFxuICAgICAgW3NlbGVjdG9yLCBzdGFiaWxpdHlDaGVjaywgZGV2TW9kZUNoZWNrcy5zdGFiaWxpdHlDaGVja11cbiAgICApO1xuICAgIGNvbnN0IHNlbGVjdGVkU3RhdGUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcihcbiAgICAgIHN1YnNjcmlwdGlvbi5hZGROZXN0ZWRTdWIsXG4gICAgICBzdG9yZS5nZXRTdGF0ZSxcbiAgICAgIGdldFNlcnZlclN0YXRlIHx8IHN0b3JlLmdldFN0YXRlLFxuICAgICAgd3JhcHBlZFNlbGVjdG9yLFxuICAgICAgZXF1YWxpdHlGblxuICAgICk7XG4gICAgUmVhY3QudXNlRGVidWdWYWx1ZShzZWxlY3RlZFN0YXRlKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRTdGF0ZTtcbiAgfTtcbiAgT2JqZWN0LmFzc2lnbih1c2VTZWxlY3RvcjIsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHVzZVNlbGVjdG9yMlxuICB9KTtcbiAgcmV0dXJuIHVzZVNlbGVjdG9yMjtcbn1cbnZhciB1c2VTZWxlY3RvciA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVTZWxlY3Rvckhvb2soKTtcblxuLy8gc3JjL3V0aWxzL3JlYWN0LWlzLnRzXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIik7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZnJhZ21lbnRcIik7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucHJvdmlkZXJcIik7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnRleHRcIik7XG52YXIgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zZXJ2ZXJfY29udGV4dFwiKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIik7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIik7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIik7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Qub2Zmc2NyZWVuXCIpO1xudmFyIFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKFwicmVhY3QuY2xpZW50LnJlZmVyZW5jZVwiKTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfT0ZGU0NSRUVOX1RZUEUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHR5cGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICBjb25zdCAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRToge1xuICAgICAgICBjb25zdCB0eXBlID0gb2JqZWN0LnR5cGU7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGNvbnN0ICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOiB7XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5cbi8vIHNyYy91dGlscy93YXJuaW5nLnRzXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIHRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cblxuLy8gc3JjL2Nvbm5lY3QvdmVyaWZ5U3Vic2VsZWN0b3JzLnRzXG5mdW5jdGlvbiB2ZXJpZnkoc2VsZWN0b3IsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKCFzZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2YWx1ZSBmb3IgJHttZXRob2ROYW1lfSBpbiBjb25uZWN0LmApO1xuICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09IFwibWFwU3RhdGVUb1Byb3BzXCIgfHwgbWV0aG9kTmFtZSA9PT0gXCJtYXBEaXNwYXRjaFRvUHJvcHNcIikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlbGVjdG9yLCBcImRlcGVuZHNPbk93blByb3BzXCIpKSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICBgVGhlIHNlbGVjdG9yIGZvciAke21ldGhvZE5hbWV9IG9mIGNvbm5lY3QgZGlkIG5vdCBzcGVjaWZ5IGEgdmFsdWUgZm9yIGRlcGVuZHNPbk93blByb3BzLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMpIHtcbiAgdmVyaWZ5KG1hcFN0YXRlVG9Qcm9wcywgXCJtYXBTdGF0ZVRvUHJvcHNcIik7XG4gIHZlcmlmeShtYXBEaXNwYXRjaFRvUHJvcHMsIFwibWFwRGlzcGF0Y2hUb1Byb3BzXCIpO1xuICB2ZXJpZnkobWVyZ2VQcm9wcywgXCJtZXJnZVByb3BzXCIpO1xufVxuXG4vLyBzcmMvY29ubmVjdC9zZWxlY3RvckZhY3RvcnkudHNcbmZ1bmN0aW9uIHB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCwge1xuICBhcmVTdGF0ZXNFcXVhbCxcbiAgYXJlT3duUHJvcHNFcXVhbCxcbiAgYXJlU3RhdGVQcm9wc0VxdWFsXG59KSB7XG4gIGxldCBoYXNSdW5BdExlYXN0T25jZSA9IGZhbHNlO1xuICBsZXQgc3RhdGU7XG4gIGxldCBvd25Qcm9wcztcbiAgbGV0IHN0YXRlUHJvcHM7XG4gIGxldCBkaXNwYXRjaFByb3BzO1xuICBsZXQgbWVyZ2VkUHJvcHM7XG4gIGZ1bmN0aW9uIGhhbmRsZUZpcnN0Q2FsbChmaXJzdFN0YXRlLCBmaXJzdE93blByb3BzKSB7XG4gICAgc3RhdGUgPSBmaXJzdFN0YXRlO1xuICAgIG93blByb3BzID0gZmlyc3RPd25Qcm9wcztcbiAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgaGFzUnVuQXRMZWFzdE9uY2UgPSB0cnVlO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCkge1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKVxuICAgICAgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1Byb3BzKCkge1xuICAgIGlmIChtYXBTdGF0ZVRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpXG4gICAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcylcbiAgICAgIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVOZXdTdGF0ZSgpIHtcbiAgICBjb25zdCBuZXh0U3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGNvbnN0IHN0YXRlUHJvcHNDaGFuZ2VkID0gIWFyZVN0YXRlUHJvcHNFcXVhbChuZXh0U3RhdGVQcm9wcywgc3RhdGVQcm9wcyk7XG4gICAgc3RhdGVQcm9wcyA9IG5leHRTdGF0ZVByb3BzO1xuICAgIGlmIChzdGF0ZVByb3BzQ2hhbmdlZClcbiAgICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZVN1YnNlcXVlbnRDYWxscyhuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykge1xuICAgIGNvbnN0IHByb3BzQ2hhbmdlZCA9ICFhcmVPd25Qcm9wc0VxdWFsKG5leHRPd25Qcm9wcywgb3duUHJvcHMpO1xuICAgIGNvbnN0IHN0YXRlQ2hhbmdlZCA9ICFhcmVTdGF0ZXNFcXVhbChcbiAgICAgIG5leHRTdGF0ZSxcbiAgICAgIHN0YXRlLFxuICAgICAgbmV4dE93blByb3BzLFxuICAgICAgb3duUHJvcHNcbiAgICApO1xuICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuICAgIG93blByb3BzID0gbmV4dE93blByb3BzO1xuICAgIGlmIChwcm9wc0NoYW5nZWQgJiYgc3RhdGVDaGFuZ2VkKVxuICAgICAgcmV0dXJuIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKTtcbiAgICBpZiAocHJvcHNDaGFuZ2VkKVxuICAgICAgcmV0dXJuIGhhbmRsZU5ld1Byb3BzKCk7XG4gICAgaWYgKHN0YXRlQ2hhbmdlZClcbiAgICAgIHJldHVybiBoYW5kbGVOZXdTdGF0ZSgpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvcihuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykge1xuICAgIHJldHVybiBoYXNSdW5BdExlYXN0T25jZSA/IGhhbmRsZVN1YnNlcXVlbnRDYWxscyhuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykgOiBoYW5kbGVGaXJzdENhbGwobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpO1xuICB9O1xufVxuZnVuY3Rpb24gZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShkaXNwYXRjaCwge1xuICBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzLFxuICBpbml0TWVyZ2VQcm9wcyxcbiAgLi4ub3B0aW9uc1xufSkge1xuICBjb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSBpbml0TWFwU3RhdGVUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIGNvbnN0IG1lcmdlUHJvcHMgPSBpbml0TWVyZ2VQcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMpO1xuICB9XG4gIHJldHVybiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIG9wdGlvbnMpO1xufVxuXG4vLyBzcmMvdXRpbHMvYmluZEFjdGlvbkNyZWF0b3JzLnRzXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGNvbnN0IGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYWN0aW9uQ3JlYXRvcnMpIHtcbiAgICBjb25zdCBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gKC4uLmFyZ3MpID0+IGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IoLi4uYXJncykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm91bmRBY3Rpb25DcmVhdG9ycztcbn1cblxuLy8gc3JjL3V0aWxzL2lzUGxhaW5PYmplY3QudHNcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8IG9iaiA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIGlmIChwcm90byA9PT0gbnVsbClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgbGV0IGJhc2VQcm90byA9IHByb3RvO1xuICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKGJhc2VQcm90bykgIT09IG51bGwpIHtcbiAgICBiYXNlUHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZVByb3RvKTtcbiAgfVxuICByZXR1cm4gcHJvdG8gPT09IGJhc2VQcm90bztcbn1cblxuLy8gc3JjL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0LnRzXG5mdW5jdGlvbiB2ZXJpZnlQbGFpbk9iamVjdCh2YWx1ZSwgZGlzcGxheU5hbWUsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIHdhcm5pbmcoXG4gICAgICBgJHttZXRob2ROYW1lfSgpIGluICR7ZGlzcGxheU5hbWV9IG11c3QgcmV0dXJuIGEgcGxhaW4gb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkICR7dmFsdWV9LmBcbiAgICApO1xuICB9XG59XG5cbi8vIHNyYy9jb25uZWN0L3dyYXBNYXBUb1Byb3BzLnRzXG5mdW5jdGlvbiB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGdldENvbnN0YW50KSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0Q29uc3RhbnRTZWxlY3RvcihkaXNwYXRjaCkge1xuICAgIGNvbnN0IGNvbnN0YW50ID0gZ2V0Q29uc3RhbnQoZGlzcGF0Y2gpO1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50U2VsZWN0b3IoKSB7XG4gICAgICByZXR1cm4gY29uc3RhbnQ7XG4gICAgfVxuICAgIGNvbnN0YW50U2VsZWN0b3IuZGVwZW5kc09uT3duUHJvcHMgPSBmYWxzZTtcbiAgICByZXR1cm4gY29uc3RhbnRTZWxlY3RvcjtcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldERlcGVuZHNPbk93blByb3BzKG1hcFRvUHJvcHMpIHtcbiAgcmV0dXJuIG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMgPyBCb29sZWFuKG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIDogbWFwVG9Qcm9wcy5sZW5ndGggIT09IDE7XG59XG5mdW5jdGlvbiB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwVG9Qcm9wcywgbWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdFByb3h5U2VsZWN0b3IoZGlzcGF0Y2gsIHsgZGlzcGxheU5hbWUgfSkge1xuICAgIGNvbnN0IHByb3h5ID0gZnVuY3Rpb24gbWFwVG9Qcm9wc1Byb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHJldHVybiBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA/IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykgOiBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgdm9pZCAwKTtcbiAgICB9O1xuICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gdHJ1ZTtcbiAgICBwcm94eS5tYXBUb1Byb3BzID0gZnVuY3Rpb24gZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICBwcm94eS5tYXBUb1Byb3BzID0gbWFwVG9Qcm9wcztcbiAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcyk7XG4gICAgICBsZXQgcHJvcHMgPSBwcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBwcm94eS5tYXBUb1Byb3BzID0gcHJvcHM7XG4gICAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMocHJvcHMpO1xuICAgICAgICBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgICAgfVxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIilcbiAgICAgICAgdmVyaWZ5UGxhaW5PYmplY3QocHJvcHMsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKTtcbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuICAgIHJldHVybiBwcm94eTtcbiAgfTtcbn1cblxuLy8gc3JjL2Nvbm5lY3QvaW52YWxpZEFyZ0ZhY3RvcnkudHNcbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KGFyZywgbmFtZSkge1xuICByZXR1cm4gKGRpc3BhdGNoLCBvcHRpb25zKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgdmFsdWUgb2YgdHlwZSAke3R5cGVvZiBhcmd9IGZvciAke25hbWV9IGFyZ3VtZW50IHdoZW4gY29ubmVjdGluZyBjb21wb25lbnQgJHtvcHRpb25zLndyYXBwZWRDb21wb25lbnROYW1lfS5gXG4gICAgKTtcbiAgfTtcbn1cblxuLy8gc3JjL2Nvbm5lY3QvbWFwRGlzcGF0Y2hUb1Byb3BzLnRzXG5mdW5jdGlvbiBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcykge1xuICByZXR1cm4gbWFwRGlzcGF0Y2hUb1Byb3BzICYmIHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09IFwib2JqZWN0XCIgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KFxuICAgIChkaXNwYXRjaCkgPT4gKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgYmluZEFjdGlvbkNyZWF0b3JzKG1hcERpc3BhdGNoVG9Qcm9wcywgZGlzcGF0Y2gpXG4gICAgKVxuICApIDogIW1hcERpc3BhdGNoVG9Qcm9wcyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoKGRpc3BhdGNoKSA9PiAoe1xuICAgIGRpc3BhdGNoXG4gIH0pKSA6IHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09IFwiZnVuY3Rpb25cIiA/IChcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3JhcE1hcFRvUHJvcHNGdW5jKG1hcERpc3BhdGNoVG9Qcm9wcywgXCJtYXBEaXNwYXRjaFRvUHJvcHNcIilcbiAgKSA6IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcywgXCJtYXBEaXNwYXRjaFRvUHJvcHNcIik7XG59XG5cbi8vIHNyYy9jb25uZWN0L21hcFN0YXRlVG9Qcm9wcy50c1xuZnVuY3Rpb24gbWFwU3RhdGVUb1Byb3BzRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuICFtYXBTdGF0ZVRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KCgpID0+ICh7fSkpIDogdHlwZW9mIG1hcFN0YXRlVG9Qcm9wcyA9PT0gXCJmdW5jdGlvblwiID8gKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwU3RhdGVUb1Byb3BzLCBcIm1hcFN0YXRlVG9Qcm9wc1wiKVxuICApIDogY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBcIm1hcFN0YXRlVG9Qcm9wc1wiKTtcbn1cblxuLy8gc3JjL2Nvbm5lY3QvbWVyZ2VQcm9wcy50c1xuZnVuY3Rpb24gZGVmYXVsdE1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgcmV0dXJuIHsgLi4ub3duUHJvcHMsIC4uLnN0YXRlUHJvcHMsIC4uLmRpc3BhdGNoUHJvcHMgfTtcbn1cbmZ1bmN0aW9uIHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0TWVyZ2VQcm9wc1Byb3h5KGRpc3BhdGNoLCB7IGRpc3BsYXlOYW1lLCBhcmVNZXJnZWRQcm9wc0VxdWFsIH0pIHtcbiAgICBsZXQgaGFzUnVuT25jZSA9IGZhbHNlO1xuICAgIGxldCBtZXJnZWRQcm9wcztcbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VQcm9wc1Byb3h5KHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKSB7XG4gICAgICBjb25zdCBuZXh0TWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICAgIGlmIChoYXNSdW5PbmNlKSB7XG4gICAgICAgIGlmICghYXJlTWVyZ2VkUHJvcHNFcXVhbChuZXh0TWVyZ2VkUHJvcHMsIG1lcmdlZFByb3BzKSlcbiAgICAgICAgICBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhc1J1bk9uY2UgPSB0cnVlO1xuICAgICAgICBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIilcbiAgICAgICAgICB2ZXJpZnlQbGFpbk9iamVjdChtZXJnZWRQcm9wcywgZGlzcGxheU5hbWUsIFwibWVyZ2VQcm9wc1wiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gbWVyZ2VQcm9wc0ZhY3RvcnkobWVyZ2VQcm9wcykge1xuICByZXR1cm4gIW1lcmdlUHJvcHMgPyAoKSA9PiBkZWZhdWx0TWVyZ2VQcm9wcyA6IHR5cGVvZiBtZXJnZVByb3BzID09PSBcImZ1bmN0aW9uXCIgPyB3cmFwTWVyZ2VQcm9wc0Z1bmMobWVyZ2VQcm9wcykgOiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShtZXJnZVByb3BzLCBcIm1lcmdlUHJvcHNcIik7XG59XG5cbi8vIHNyYy91dGlscy9iYXRjaC50c1xuZnVuY3Rpb24gZGVmYXVsdE5vb3BCYXRjaChjYWxsYmFjaykge1xuICBjYWxsYmFjaygpO1xufVxuXG4vLyBzcmMvdXRpbHMvU3Vic2NyaXB0aW9uLnRzXG5mdW5jdGlvbiBjcmVhdGVMaXN0ZW5lckNvbGxlY3Rpb24oKSB7XG4gIGxldCBmaXJzdCA9IG51bGw7XG4gIGxldCBsYXN0ID0gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBjbGVhcigpIHtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIGxhc3QgPSBudWxsO1xuICAgIH0sXG4gICAgbm90aWZ5KCkge1xuICAgICAgZGVmYXVsdE5vb3BCYXRjaCgoKSA9PiB7XG4gICAgICAgIGxldCBsaXN0ZW5lciA9IGZpcnN0O1xuICAgICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgICBsaXN0ZW5lci5jYWxsYmFjaygpO1xuICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IGZpcnN0O1xuICAgICAgd2hpbGUgKGxpc3RlbmVyKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RlbmVycztcbiAgICB9LFxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgbGV0IGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICBjb25zdCBsaXN0ZW5lciA9IGxhc3QgPSB7XG4gICAgICAgIGNhbGxiYWNrLFxuICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICBwcmV2OiBsYXN0XG4gICAgICB9O1xuICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdCA9IGxpc3RlbmVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgICBpZiAoIWlzU3Vic2NyaWJlZCB8fCBmaXJzdCA9PT0gbnVsbClcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgICBpZiAobGlzdGVuZXIubmV4dCkge1xuICAgICAgICAgIGxpc3RlbmVyLm5leHQucHJldiA9IGxpc3RlbmVyLnByZXY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGFzdCA9IGxpc3RlbmVyLnByZXY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgICBsaXN0ZW5lci5wcmV2Lm5leHQgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpcnN0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG52YXIgbnVsbExpc3RlbmVycyA9IHtcbiAgbm90aWZ5KCkge1xuICB9LFxuICBnZXQ6ICgpID0+IFtdXG59O1xuZnVuY3Rpb24gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlLCBwYXJlbnRTdWIpIHtcbiAgbGV0IHVuc3Vic2NyaWJlO1xuICBsZXQgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcbiAgbGV0IHN1YnNjcmlwdGlvbnNBbW91bnQgPSAwO1xuICBsZXQgc2VsZlN1YnNjcmliZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gYWRkTmVzdGVkU3ViKGxpc3RlbmVyKSB7XG4gICAgdHJ5U3Vic2NyaWJlKCk7XG4gICAgY29uc3QgY2xlYW51cExpc3RlbmVyID0gbGlzdGVuZXJzLnN1YnNjcmliZShsaXN0ZW5lcik7XG4gICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKCFyZW1vdmVkKSB7XG4gICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwTGlzdGVuZXIoKTtcbiAgICAgICAgdHJ5VW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIG5vdGlmeU5lc3RlZFN1YnMoKSB7XG4gICAgbGlzdGVuZXJzLm5vdGlmeSgpO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZUNoYW5nZVdyYXBwZXIoKSB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlKSB7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSgpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpc1N1YnNjcmliZWQoKSB7XG4gICAgcmV0dXJuIHNlbGZTdWJzY3JpYmVkO1xuICB9XG4gIGZ1bmN0aW9uIHRyeVN1YnNjcmliZSgpIHtcbiAgICBzdWJzY3JpcHRpb25zQW1vdW50Kys7XG4gICAgaWYgKCF1bnN1YnNjcmliZSkge1xuICAgICAgdW5zdWJzY3JpYmUgPSBwYXJlbnRTdWIgPyBwYXJlbnRTdWIuYWRkTmVzdGVkU3ViKGhhbmRsZUNoYW5nZVdyYXBwZXIpIDogc3RvcmUuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZVdyYXBwZXIpO1xuICAgICAgbGlzdGVuZXJzID0gY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHRyeVVuc3Vic2NyaWJlKCkge1xuICAgIHN1YnNjcmlwdGlvbnNBbW91bnQtLTtcbiAgICBpZiAodW5zdWJzY3JpYmUgJiYgc3Vic2NyaXB0aW9uc0Ftb3VudCA9PT0gMCkge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgIHVuc3Vic2NyaWJlID0gdm9pZCAwO1xuICAgICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICBsaXN0ZW5lcnMgPSBudWxsTGlzdGVuZXJzO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB0cnlTdWJzY3JpYmVTZWxmKCkge1xuICAgIGlmICghc2VsZlN1YnNjcmliZWQpIHtcbiAgICAgIHNlbGZTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIHRyeVN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB0cnlVbnN1YnNjcmliZVNlbGYoKSB7XG4gICAgaWYgKHNlbGZTdWJzY3JpYmVkKSB7XG4gICAgICBzZWxmU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgdHJ5VW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0ge1xuICAgIGFkZE5lc3RlZFN1YixcbiAgICBub3RpZnlOZXN0ZWRTdWJzLFxuICAgIGhhbmRsZUNoYW5nZVdyYXBwZXIsXG4gICAgaXNTdWJzY3JpYmVkLFxuICAgIHRyeVN1YnNjcmliZTogdHJ5U3Vic2NyaWJlU2VsZixcbiAgICB0cnlVbnN1YnNjcmliZTogdHJ5VW5zdWJzY3JpYmVTZWxmLFxuICAgIGdldExpc3RlbmVyczogKCkgPT4gbGlzdGVuZXJzXG4gIH07XG4gIHJldHVybiBzdWJzY3JpcHRpb247XG59XG5cbi8vIHNyYy91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LnRzXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIik7XG52YXIgaXNSZWFjdE5hdGl2ZSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLnByb2R1Y3QgPT09IFwiUmVhY3ROYXRpdmVcIjtcbnZhciB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gY2FuVXNlRE9NIHx8IGlzUmVhY3ROYXRpdmUgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG5cbi8vIHNyYy91dGlscy9zaGFsbG93RXF1YWwudHNcbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgaWYgKHggPT09IHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCB8fCB5ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAoaXMob2JqQSwgb2JqQikpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gXCJvYmplY3RcIiB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSBcIm9iamVjdFwiIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgY29uc3Qga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhaXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gc3JjL3V0aWxzL2hvaXN0U3RhdGljcy50c1xudmFyIFJFQUNUX1NUQVRJQ1MgPSB7XG4gIGNoaWxkQ29udGV4dFR5cGVzOiB0cnVlLFxuICBjb250ZXh0VHlwZTogdHJ1ZSxcbiAgY29udGV4dFR5cGVzOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBnZXREZWZhdWx0UHJvcHM6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiB0cnVlLFxuICBtaXhpbnM6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBLTk9XTl9TVEFUSUNTID0ge1xuICBuYW1lOiB0cnVlLFxuICBsZW5ndGg6IHRydWUsXG4gIHByb3RvdHlwZTogdHJ1ZSxcbiAgY2FsbGVyOiB0cnVlLFxuICBjYWxsZWU6IHRydWUsXG4gIGFyZ3VtZW50czogdHJ1ZSxcbiAgYXJpdHk6IHRydWVcbn07XG52YXIgRk9SV0FSRF9SRUZfU1RBVElDUyA9IHtcbiAgJCR0eXBlb2Y6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlXG59O1xudmFyIE1FTU9fU1RBVElDUyA9IHtcbiAgJCR0eXBlb2Y6IHRydWUsXG4gIGNvbXBhcmU6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBUWVBFX1NUQVRJQ1MgPSB7XG4gIFtGb3J3YXJkUmVmXTogRk9SV0FSRF9SRUZfU1RBVElDUyxcbiAgW01lbW9dOiBNRU1PX1NUQVRJQ1Ncbn07XG5mdW5jdGlvbiBnZXRTdGF0aWNzKGNvbXBvbmVudCkge1xuICBpZiAoaXNNZW1vKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gTUVNT19TVEFUSUNTO1xuICB9XG4gIHJldHVybiBUWVBFX1NUQVRJQ1NbY29tcG9uZW50W1wiJCR0eXBlb2ZcIl1dIHx8IFJFQUNUX1NUQVRJQ1M7XG59XG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQpIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2VDb21wb25lbnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAob2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICBjb25zdCBpbmhlcml0ZWRDb21wb25lbnQgPSBnZXRQcm90b3R5cGVPZihzb3VyY2VDb21wb25lbnQpO1xuICAgICAgaWYgKGluaGVyaXRlZENvbXBvbmVudCAmJiBpbmhlcml0ZWRDb21wb25lbnQgIT09IG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgICBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIGluaGVyaXRlZENvbXBvbmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuICAgIGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlQ29tcG9uZW50KSk7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldFN0YXRpY3MgPSBnZXRTdGF0aWNzKHRhcmdldENvbXBvbmVudCk7XG4gICAgY29uc3Qgc291cmNlU3RhdGljcyA9IGdldFN0YXRpY3Moc291cmNlQ29tcG9uZW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoIUtOT1dOX1NUQVRJQ1Nba2V5XSAmJiAhKHNvdXJjZVN0YXRpY3MgJiYgc291cmNlU3RhdGljc1trZXldKSAmJiAhKHRhcmdldFN0YXRpY3MgJiYgdGFyZ2V0U3RhdGljc1trZXldKSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZUNvbXBvbmVudCwga2V5KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXRDb21wb25lbnQsIGtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xufVxuXG4vLyBzcmMvY29tcG9uZW50cy9jb25uZWN0LnRzeFxudmFyIHVzZVN5bmNFeHRlcm5hbFN0b3JlID0gbm90SW5pdGlhbGl6ZWQ7XG52YXIgaW5pdGlhbGl6ZUNvbm5lY3QgPSAoZm4pID0+IHtcbiAgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBmbjtcbn07XG52YXIgTk9fU1VCU0NSSVBUSU9OX0FSUkFZID0gW251bGwsIG51bGxdO1xudmFyIHN0cmluZ2lmeUNvbXBvbmVudCA9IChDb21wKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KENvbXApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gU3RyaW5nKENvbXApO1xuICB9XG59O1xuZnVuY3Rpb24gdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKGVmZmVjdEZ1bmMsIGVmZmVjdEFyZ3MsIGRlcGVuZGVuY2llcykge1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IGVmZmVjdEZ1bmMoLi4uZWZmZWN0QXJncyksIGRlcGVuZGVuY2llcyk7XG59XG5mdW5jdGlvbiBjYXB0dXJlV3JhcHBlclByb3BzKGxhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgd3JhcHBlclByb3BzLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzKSB7XG4gIGxhc3RXcmFwcGVyUHJvcHMuY3VycmVudCA9IHdyYXBwZXJQcm9wcztcbiAgcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCA9IGZhbHNlO1xuICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50KSB7XG4gICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gbnVsbDtcbiAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHN1YnNjcmliZVVwZGF0ZXMoc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLCBzdG9yZSwgc3Vic2NyaXB0aW9uLCBjaGlsZFByb3BzU2VsZWN0b3IsIGxhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgaXNNb3VudGVkLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzLCBhZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIpIHtcbiAgaWYgKCFzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICB9O1xuICBsZXQgZGlkVW5zdWJzY3JpYmUgPSBmYWxzZTtcbiAgbGV0IGxhc3RUaHJvd25FcnJvciA9IG51bGw7XG4gIGNvbnN0IGNoZWNrRm9yVXBkYXRlcyA9ICgpID0+IHtcbiAgICBpZiAoZGlkVW5zdWJzY3JpYmUgfHwgIWlzTW91bnRlZC5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhdGVzdFN0b3JlU3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGxldCBuZXdDaGlsZFByb3BzLCBlcnJvcjtcbiAgICB0cnkge1xuICAgICAgbmV3Q2hpbGRQcm9wcyA9IGNoaWxkUHJvcHNTZWxlY3RvcihcbiAgICAgICAgbGF0ZXN0U3RvcmVTdGF0ZSxcbiAgICAgICAgbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IGU7XG4gICAgfVxuICAgIGlmICghZXJyb3IpIHtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IG51bGw7XG4gICAgfVxuICAgIGlmIChuZXdDaGlsZFByb3BzID09PSBsYXN0Q2hpbGRQcm9wcy5jdXJyZW50KSB7XG4gICAgICBpZiAoIXJlbmRlcklzU2NoZWR1bGVkLmN1cnJlbnQpIHtcbiAgICAgICAgbm90aWZ5TmVzdGVkU3VicygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0Q2hpbGRQcm9wcy5jdXJyZW50ID0gbmV3Q2hpbGRQcm9wcztcbiAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIGFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfTtcbiAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBjaGVja0ZvclVwZGF0ZXM7XG4gIHN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcbiAgY2hlY2tGb3JVcGRhdGVzKCk7XG4gIGNvbnN0IHVuc3Vic2NyaWJlV3JhcHBlciA9ICgpID0+IHtcbiAgICBkaWRVbnN1YnNjcmliZSA9IHRydWU7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBudWxsO1xuICAgIGlmIChsYXN0VGhyb3duRXJyb3IpIHtcbiAgICAgIHRocm93IGxhc3RUaHJvd25FcnJvcjtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1bnN1YnNjcmliZVdyYXBwZXI7XG59XG5mdW5jdGlvbiBzdHJpY3RFcXVhbChhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufVxudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZFB1cmVPcHRpb24gPSBmYWxzZTtcbmZ1bmN0aW9uIGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIHtcbiAgLy8gVGhlIGBwdXJlYCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZCwgc28gVFMgZG9lc24ndCBsaWtlIHVzIGRlc3RydWN0dXJpbmcgdGhpcyB0byBjaGVjayBpdHMgZXhpc3RlbmNlLlxuICAvLyBAdHMtaWdub3JlXG4gIHB1cmUsXG4gIGFyZVN0YXRlc0VxdWFsID0gc3RyaWN0RXF1YWwsXG4gIGFyZU93blByb3BzRXF1YWwgPSBzaGFsbG93RXF1YWwsXG4gIGFyZVN0YXRlUHJvcHNFcXVhbCA9IHNoYWxsb3dFcXVhbCxcbiAgYXJlTWVyZ2VkUHJvcHNFcXVhbCA9IHNoYWxsb3dFcXVhbCxcbiAgLy8gdXNlIFJlYWN0J3MgZm9yd2FyZFJlZiB0byBleHBvc2UgYSByZWYgb2YgdGhlIHdyYXBwZWQgY29tcG9uZW50XG4gIGZvcndhcmRSZWYgPSBmYWxzZSxcbiAgLy8gdGhlIGNvbnRleHQgY29uc3VtZXIgdG8gdXNlXG4gIGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dFxufSA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAocHVyZSAhPT0gdm9pZCAwICYmICFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uID0gdHJ1ZTtcbiAgICAgIHdhcm5pbmcoXG4gICAgICAgICdUaGUgYHB1cmVgIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLiBgY29ubmVjdGAgaXMgbm93IGFsd2F5cyBhIFwicHVyZS9tZW1vaXplZFwiIGNvbXBvbmVudCdcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGNvbnN0IENvbnRleHQgPSBjb250ZXh0O1xuICBjb25zdCBpbml0TWFwU3RhdGVUb1Byb3BzID0gbWFwU3RhdGVUb1Byb3BzRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMpO1xuICBjb25zdCBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMpO1xuICBjb25zdCBpbml0TWVyZ2VQcm9wcyA9IG1lcmdlUHJvcHNGYWN0b3J5KG1lcmdlUHJvcHMpO1xuICBjb25zdCBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMgPSBCb29sZWFuKG1hcFN0YXRlVG9Qcm9wcyk7XG4gIGNvbnN0IHdyYXBXaXRoQ29ubmVjdCA9IChXcmFwcGVkQ29tcG9uZW50KSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IC8qIEBfX1BVUkVfXyAqLyBpc1ZhbGlkRWxlbWVudFR5cGUoV3JhcHBlZENvbXBvbmVudCk7XG4gICAgICBpZiAoIWlzVmFsaWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgWW91IG11c3QgcGFzcyBhIGNvbXBvbmVudCB0byB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgY29ubmVjdC4gSW5zdGVhZCByZWNlaXZlZCAke3N0cmluZ2lmeUNvbXBvbmVudChcbiAgICAgICAgICAgIFdyYXBwZWRDb21wb25lbnRcbiAgICAgICAgICApfWBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgd3JhcHBlZENvbXBvbmVudE5hbWUgPSBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCBcIkNvbXBvbmVudFwiO1xuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gYENvbm5lY3QoJHt3cmFwcGVkQ29tcG9uZW50TmFtZX0pYDtcbiAgICBjb25zdCBzZWxlY3RvckZhY3RvcnlPcHRpb25zID0ge1xuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgICB3cmFwcGVkQ29tcG9uZW50TmFtZSxcbiAgICAgIFdyYXBwZWRDb21wb25lbnQsXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyxcbiAgICAgIGluaXRNZXJnZVByb3BzLFxuICAgICAgYXJlU3RhdGVzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWwsXG4gICAgICBhcmVPd25Qcm9wc0VxdWFsLFxuICAgICAgYXJlTWVyZ2VkUHJvcHNFcXVhbFxuICAgIH07XG4gICAgZnVuY3Rpb24gQ29ubmVjdEZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICBjb25zdCBbcHJvcHNDb250ZXh0LCByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmLCB3cmFwcGVyUHJvcHNdID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmVhY3RSZWR1eEZvcndhcmRlZFJlZjogcmVhY3RSZWR1eEZvcndhcmRlZFJlZjIsIC4uLndyYXBwZXJQcm9wczIgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gW3Byb3BzLmNvbnRleHQsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYyLCB3cmFwcGVyUHJvcHMyXTtcbiAgICAgIH0sIFtwcm9wc10pO1xuICAgICAgY29uc3QgQ29udGV4dFRvVXNlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGxldCBSZXN1bHRDb250ZXh0ID0gQ29udGV4dDtcbiAgICAgICAgaWYgKHByb3BzQ29udGV4dD8uQ29uc3VtZXIpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gLyogQF9fUFVSRV9fICovIGlzQ29udGV4dENvbnN1bWVyKFxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KHByb3BzQ29udGV4dC5Db25zdW1lciwgbnVsbClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiWW91IG11c3QgcGFzcyBhIHZhbGlkIFJlYWN0IGNvbnRleHQgY29uc3VtZXIgYXMgYHByb3BzLmNvbnRleHRgXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlc3VsdENvbnRleHQgPSBwcm9wc0NvbnRleHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZXN1bHRDb250ZXh0O1xuICAgICAgfSwgW3Byb3BzQ29udGV4dCwgQ29udGV4dF0pO1xuICAgICAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0VG9Vc2UpO1xuICAgICAgY29uc3QgZGlkU3RvcmVDb21lRnJvbVByb3BzID0gQm9vbGVhbihwcm9wcy5zdG9yZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5nZXRTdGF0ZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5kaXNwYXRjaCk7XG4gICAgICBjb25zdCBkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCA9IEJvb2xlYW4oY29udGV4dFZhbHVlKSAmJiBCb29sZWFuKGNvbnRleHRWYWx1ZS5zdG9yZSk7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFkaWRTdG9yZUNvbWVGcm9tUHJvcHMgJiYgIWRpZFN0b3JlQ29tZUZyb21Db250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgXCJzdG9yZVwiIGluIHRoZSBjb250ZXh0IG9mIFwiJHtkaXNwbGF5TmFtZX1cIi4gRWl0aGVyIHdyYXAgdGhlIHJvb3QgY29tcG9uZW50IGluIGEgPFByb3ZpZGVyPiwgb3IgcGFzcyBhIGN1c3RvbSBSZWFjdCBjb250ZXh0IHByb3ZpZGVyIHRvIDxQcm92aWRlcj4gYW5kIHRoZSBjb3JyZXNwb25kaW5nIFJlYWN0IGNvbnRleHQgY29uc3VtZXIgdG8gJHtkaXNwbGF5TmFtZX0gaW4gY29ubmVjdCBvcHRpb25zLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0b3JlID0gZGlkU3RvcmVDb21lRnJvbVByb3BzID8gcHJvcHMuc3RvcmUgOiBjb250ZXh0VmFsdWUuc3RvcmU7XG4gICAgICBjb25zdCBnZXRTZXJ2ZXJTdGF0ZSA9IGRpZFN0b3JlQ29tZUZyb21Db250ZXh0ID8gY29udGV4dFZhbHVlLmdldFNlcnZlclN0YXRlIDogc3RvcmUuZ2V0U3RhdGU7XG4gICAgICBjb25zdCBjaGlsZFByb3BzU2VsZWN0b3IgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpbmFsUHJvcHNTZWxlY3RvckZhY3Rvcnkoc3RvcmUuZGlzcGF0Y2gsIHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMpO1xuICAgICAgfSwgW3N0b3JlXSk7XG4gICAgICBjb25zdCBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcylcbiAgICAgICAgICByZXR1cm4gTk9fU1VCU0NSSVBUSU9OX0FSUkFZO1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24yID0gY3JlYXRlU3Vic2NyaXB0aW9uKFxuICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgIGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA/IHZvaWQgMCA6IGNvbnRleHRWYWx1ZS5zdWJzY3JpcHRpb25cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgbm90aWZ5TmVzdGVkU3ViczIgPSBzdWJzY3JpcHRpb24yLm5vdGlmeU5lc3RlZFN1YnMuYmluZChzdWJzY3JpcHRpb24yKTtcbiAgICAgICAgcmV0dXJuIFtzdWJzY3JpcHRpb24yLCBub3RpZnlOZXN0ZWRTdWJzMl07XG4gICAgICB9LCBbc3RvcmUsIGRpZFN0b3JlQ29tZUZyb21Qcm9wcywgY29udGV4dFZhbHVlXSk7XG4gICAgICBjb25zdCBvdmVycmlkZGVuQ29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmIChkaWRTdG9yZUNvbWVGcm9tUHJvcHMpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY29udGV4dFZhbHVlLFxuICAgICAgICAgIHN1YnNjcmlwdGlvblxuICAgICAgICB9O1xuICAgICAgfSwgW2RpZFN0b3JlQ29tZUZyb21Qcm9wcywgY29udGV4dFZhbHVlLCBzdWJzY3JpcHRpb25dKTtcbiAgICAgIGNvbnN0IGxhc3RDaGlsZFByb3BzID0gUmVhY3QudXNlUmVmKHZvaWQgMCk7XG4gICAgICBjb25zdCBsYXN0V3JhcHBlclByb3BzID0gUmVhY3QudXNlUmVmKHdyYXBwZXJQcm9wcyk7XG4gICAgICBjb25zdCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlID0gUmVhY3QudXNlUmVmKHZvaWQgMCk7XG4gICAgICBjb25zdCByZW5kZXJJc1NjaGVkdWxlZCA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gICAgICBjb25zdCBpc01vdW50ZWQgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgbGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvciA9IFJlYWN0LnVzZVJlZihcbiAgICAgICAgdm9pZCAwXG4gICAgICApO1xuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlzTW91bnRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBpc01vdW50ZWQuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgfSwgW10pO1xuICAgICAgY29uc3QgYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgJiYgd3JhcHBlclByb3BzID09PSBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjaGlsZFByb3BzU2VsZWN0b3Ioc3RvcmUuZ2V0U3RhdGUoKSwgd3JhcHBlclByb3BzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgICAgfSwgW3N0b3JlLCB3cmFwcGVyUHJvcHNdKTtcbiAgICAgIGNvbnN0IHN1YnNjcmliZUZvclJlYWN0ID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YnNjcmliZSA9IChyZWFjdExpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlVXBkYXRlcyhcbiAgICAgICAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyxcbiAgICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2hpbGRQcm9wc1NlbGVjdG9yLFxuICAgICAgICAgICAgbGFzdFdyYXBwZXJQcm9wcyxcbiAgICAgICAgICAgIGxhc3RDaGlsZFByb3BzLFxuICAgICAgICAgICAgcmVuZGVySXNTY2hlZHVsZWQsXG4gICAgICAgICAgICBpc01vdW50ZWQsXG4gICAgICAgICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLFxuICAgICAgICAgICAgbm90aWZ5TmVzdGVkU3VicyxcbiAgICAgICAgICAgIHJlYWN0TGlzdGVuZXJcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlO1xuICAgICAgfSwgW3N1YnNjcmlwdGlvbl0pO1xuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKGNhcHR1cmVXcmFwcGVyUHJvcHMsIFtcbiAgICAgICAgbGFzdFdyYXBwZXJQcm9wcyxcbiAgICAgICAgbGFzdENoaWxkUHJvcHMsXG4gICAgICAgIHJlbmRlcklzU2NoZWR1bGVkLFxuICAgICAgICB3cmFwcGVyUHJvcHMsXG4gICAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsXG4gICAgICAgIG5vdGlmeU5lc3RlZFN1YnNcbiAgICAgIF0pO1xuICAgICAgbGV0IGFjdHVhbENoaWxkUHJvcHM7XG4gICAgICB0cnkge1xuICAgICAgICBhY3R1YWxDaGlsZFByb3BzID0gdXNlU3luY0V4dGVybmFsU3RvcmUoXG4gICAgICAgICAgLy8gVE9ETyBXZSdyZSBwYXNzaW5nIHRocm91Z2ggYSBiaWcgd3JhcHBlciB0aGF0IGRvZXMgYSBidW5jaCBvZiBleHRyYSBzaWRlIGVmZmVjdHMgYmVzaWRlcyBzdWJzY3JpYmluZ1xuICAgICAgICAgIHN1YnNjcmliZUZvclJlYWN0LFxuICAgICAgICAgIC8vIFRPRE8gVGhpcyBpcyBpbmNyZWRpYmx5IGhhY2t5LiBXZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGUgc3RvcmUgdXBkYXRlIGFuZCBjYWxjdWxhdGVkIG5ldyBjaGlsZCBwcm9wcyxcbiAgICAgICAgICAvLyBUT0RPIGFuZCB3ZSdyZSBqdXN0IHBhc3NpbmcgdGhhdCB0aHJvdWdoIHNvIGl0IHRyaWdnZXJzIGEgcmUtcmVuZGVyIGZvciB1cyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGB1U0VTYC5cbiAgICAgICAgICBhY3R1YWxDaGlsZFByb3BzU2VsZWN0b3IsXG4gICAgICAgICAgZ2V0U2VydmVyU3RhdGUgPyAoKSA9PiBjaGlsZFByb3BzU2VsZWN0b3IoZ2V0U2VydmVyU3RhdGUoKSwgd3JhcHBlclByb3BzKSA6IGFjdHVhbENoaWxkUHJvcHNTZWxlY3RvclxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQpIHtcbiAgICAgICAgICA7XG4gICAgICAgICAgZXJyLm1lc3NhZ2UgKz0gYFxuVGhlIGVycm9yIG1heSBiZSBjb3JyZWxhdGVkIHdpdGggdGhpcyBwcmV2aW91cyBlcnJvcjpcbiR7bGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50LnN0YWNrfVxuXG5gO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQgPSB2b2lkIDA7XG4gICAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IHZvaWQgMDtcbiAgICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IGFjdHVhbENoaWxkUHJvcHM7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFdyYXBwZWRDb21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLmFjdHVhbENoaWxkUHJvcHMsXG4gICAgICAgICAgICAgIHJlZjogcmVhY3RSZWR1eEZvcndhcmRlZFJlZlxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0sIFtyZWFjdFJlZHV4Rm9yd2FyZGVkUmVmLCBXcmFwcGVkQ29tcG9uZW50LCBhY3R1YWxDaGlsZFByb3BzXSk7XG4gICAgICBjb25zdCByZW5kZXJlZENoaWxkID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmIChzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHtcbiAgICAgICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dFRvVXNlLlByb3ZpZGVyLCB7IHZhbHVlOiBvdmVycmlkZGVuQ29udGV4dFZhbHVlIH0sIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudDtcbiAgICAgIH0sIFtDb250ZXh0VG9Vc2UsIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCwgb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZV0pO1xuICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGQ7XG4gICAgfVxuICAgIGNvbnN0IF9Db25uZWN0ID0gUmVhY3QubWVtbyhDb25uZWN0RnVuY3Rpb24pO1xuICAgIGNvbnN0IENvbm5lY3QgPSBfQ29ubmVjdDtcbiAgICBDb25uZWN0LldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgIENvbm5lY3QuZGlzcGxheU5hbWUgPSBDb25uZWN0RnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICBpZiAoZm9yd2FyZFJlZikge1xuICAgICAgY29uc3QgX2ZvcndhcmRlZCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gICAgICAgIGZ1bmN0aW9uIGZvcndhcmRDb25uZWN0UmVmKHByb3BzLCByZWYpIHtcbiAgICAgICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29ubmVjdCwgeyAuLi5wcm9wcywgcmVhY3RSZWR1eEZvcndhcmRlZFJlZjogcmVmIH0pO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgY29uc3QgZm9yd2FyZGVkID0gX2ZvcndhcmRlZDtcbiAgICAgIGZvcndhcmRlZC5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgICAgZm9yd2FyZGVkLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBob2lzdE5vblJlYWN0U3RhdGljcyhmb3J3YXJkZWQsIFdyYXBwZWRDb21wb25lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKENvbm5lY3QsIFdyYXBwZWRDb21wb25lbnQpO1xuICB9O1xuICByZXR1cm4gd3JhcFdpdGhDb25uZWN0O1xufVxudmFyIGNvbm5lY3RfZGVmYXVsdCA9IGNvbm5lY3Q7XG5cbi8vIHNyYy9jb21wb25lbnRzL1Byb3ZpZGVyLnRzeFxuZnVuY3Rpb24gUHJvdmlkZXIoe1xuICBzdG9yZSxcbiAgY29udGV4dCxcbiAgY2hpbGRyZW4sXG4gIHNlcnZlclN0YXRlLFxuICBzdGFiaWxpdHlDaGVjayA9IFwib25jZVwiLFxuICBpZGVudGl0eUZ1bmN0aW9uQ2hlY2sgPSBcIm9uY2VcIlxufSkge1xuICBjb25zdCBjb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUpO1xuICAgIHJldHVybiB7XG4gICAgICBzdG9yZSxcbiAgICAgIHN1YnNjcmlwdGlvbixcbiAgICAgIGdldFNlcnZlclN0YXRlOiBzZXJ2ZXJTdGF0ZSA/ICgpID0+IHNlcnZlclN0YXRlIDogdm9pZCAwLFxuICAgICAgc3RhYmlsaXR5Q2hlY2ssXG4gICAgICBpZGVudGl0eUZ1bmN0aW9uQ2hlY2tcbiAgICB9O1xuICB9LCBbc3RvcmUsIHNlcnZlclN0YXRlLCBzdGFiaWxpdHlDaGVjaywgaWRlbnRpdHlGdW5jdGlvbkNoZWNrXSk7XG4gIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBSZWFjdC51c2VNZW1vKCgpID0+IHN0b3JlLmdldFN0YXRlKCksIFtzdG9yZV0pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IHN1YnNjcmlwdGlvbiB9ID0gY29udGV4dFZhbHVlO1xuICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnM7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVN1YnNjcmliZSgpO1xuICAgIGlmIChwcmV2aW91c1N0YXRlICE9PSBzdG9yZS5nZXRTdGF0ZSgpKSB7XG4gICAgICBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3VicygpO1xuICAgIH1cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IHZvaWQgMDtcbiAgICB9O1xuICB9LCBbY29udGV4dFZhbHVlLCBwcmV2aW91c1N0YXRlXSk7XG4gIGNvbnN0IENvbnRleHQgPSBjb250ZXh0IHx8IFJlYWN0UmVkdXhDb250ZXh0O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogY29udGV4dFZhbHVlIH0sIGNoaWxkcmVuKTtcbn1cbnZhciBQcm92aWRlcl9kZWZhdWx0ID0gUHJvdmlkZXI7XG5cbi8vIHNyYy9ob29rcy91c2VTdG9yZS50c1xuZnVuY3Rpb24gY3JlYXRlU3RvcmVIb29rKGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dCkge1xuICBjb25zdCB1c2VSZWR1eENvbnRleHQyID0gY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VSZWR1eENvbnRleHQgOiAoXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soY29udGV4dClcbiAgKTtcbiAgY29uc3QgdXNlU3RvcmUyID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RvcmUgfSA9IHVzZVJlZHV4Q29udGV4dDIoKTtcbiAgICByZXR1cm4gc3RvcmU7XG4gIH07XG4gIE9iamVjdC5hc3NpZ24odXNlU3RvcmUyLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiB1c2VTdG9yZTJcbiAgfSk7XG4gIHJldHVybiB1c2VTdG9yZTI7XG59XG52YXIgdXNlU3RvcmUgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlU3RvcmVIb29rKCk7XG5cbi8vIHNyYy9ob29rcy91c2VEaXNwYXRjaC50c1xuZnVuY3Rpb24gY3JlYXRlRGlzcGF0Y2hIb29rKGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dCkge1xuICBjb25zdCB1c2VTdG9yZTIgPSBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZVN0b3JlIDogY3JlYXRlU3RvcmVIb29rKGNvbnRleHQpO1xuICBjb25zdCB1c2VEaXNwYXRjaDIgPSAoKSA9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZTIoKTtcbiAgICByZXR1cm4gc3RvcmUuZGlzcGF0Y2g7XG4gIH07XG4gIE9iamVjdC5hc3NpZ24odXNlRGlzcGF0Y2gyLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiB1c2VEaXNwYXRjaDJcbiAgfSk7XG4gIHJldHVybiB1c2VEaXNwYXRjaDI7XG59XG52YXIgdXNlRGlzcGF0Y2ggPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGlzcGF0Y2hIb29rKCk7XG5cbi8vIHNyYy9leHBvcnRzLnRzXG52YXIgYmF0Y2ggPSBkZWZhdWx0Tm9vcEJhdGNoO1xuXG4vLyBzcmMvaW5kZXgudHNcbmluaXRpYWxpemVVc2VTZWxlY3Rvcih1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcjIpO1xuaW5pdGlhbGl6ZUNvbm5lY3QoUmVhY3QyLnVzZVN5bmNFeHRlcm5hbFN0b3JlKTtcbmV4cG9ydCB7XG4gIFByb3ZpZGVyX2RlZmF1bHQgYXMgUHJvdmlkZXIsXG4gIFJlYWN0UmVkdXhDb250ZXh0LFxuICBiYXRjaCxcbiAgY29ubmVjdF9kZWZhdWx0IGFzIGNvbm5lY3QsXG4gIGNyZWF0ZURpc3BhdGNoSG9vayxcbiAgY3JlYXRlU2VsZWN0b3JIb29rLFxuICBjcmVhdGVTdG9yZUhvb2ssXG4gIHNoYWxsb3dFcXVhbCxcbiAgdXNlRGlzcGF0Y2gsXG4gIHVzZVNlbGVjdG9yLFxuICB1c2VTdG9yZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWN0LXJlZHV4Lm1qcy5tYXAiLCIvLyBzcmMvaW5kZXgudHNcbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYWN0aW9uKGRpc3BhdGNoLCBnZXRTdGF0ZSwgZXh0cmFBcmd1bWVudCk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gIH07XG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxudmFyIHRodW5rID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlKCk7XG52YXIgd2l0aEV4dHJhQXJndW1lbnQgPSBjcmVhdGVUaHVua01pZGRsZXdhcmU7XG5leHBvcnQge1xuICB0aHVuayxcbiAgd2l0aEV4dHJhQXJndW1lbnRcbn07XG4iLCIvLyBzcmMvdXRpbHMvZm9ybWF0UHJvZEVycm9yTWVzc2FnZS50c1xuZnVuY3Rpb24gZm9ybWF0UHJvZEVycm9yTWVzc2FnZShjb2RlKSB7XG4gIHJldHVybiBgTWluaWZpZWQgUmVkdXggZXJyb3IgIyR7Y29kZX07IHZpc2l0IGh0dHBzOi8vcmVkdXguanMub3JnL0Vycm9ycz9jb2RlPSR7Y29kZX0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycy4gYDtcbn1cblxuLy8gc3JjL3V0aWxzL3N5bWJvbC1vYnNlcnZhYmxlLnRzXG52YXIgJCRvYnNlcnZhYmxlID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgXCJAQG9ic2VydmFibGVcIikoKTtcbnZhciBzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0ID0gJCRvYnNlcnZhYmxlO1xuXG4vLyBzcmMvdXRpbHMvYWN0aW9uVHlwZXMudHNcbnZhciByYW5kb21TdHJpbmcgPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoXCJcIikuam9pbihcIi5cIik7XG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IGBAQHJlZHV4L0lOSVQkey8qIEBfX1BVUkVfXyAqLyByYW5kb21TdHJpbmcoKX1gLFxuICBSRVBMQUNFOiBgQEByZWR1eC9SRVBMQUNFJHsvKiBAX19QVVJFX18gKi8gcmFuZG9tU3RyaW5nKCl9YCxcbiAgUFJPQkVfVU5LTk9XTl9BQ1RJT046ICgpID0+IGBAQHJlZHV4L1BST0JFX1VOS05PV05fQUNUSU9OJHtyYW5kb21TdHJpbmcoKX1gXG59O1xudmFyIGFjdGlvblR5cGVzX2RlZmF1bHQgPSBBY3Rpb25UeXBlcztcblxuLy8gc3JjL3V0aWxzL2lzUGxhaW5PYmplY3QudHNcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8IG9iaiA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGxldCBwcm90byA9IG9iajtcbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90byB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gbnVsbDtcbn1cblxuLy8gc3JjL3V0aWxzL2tpbmRPZi50c1xuZnVuY3Rpb24gbWluaUtpbmRPZih2YWwpIHtcbiAgaWYgKHZhbCA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICBpZiAodmFsID09PSBudWxsKVxuICAgIHJldHVybiBcIm51bGxcIjtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6IHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKVxuICAgIHJldHVybiBcImFycmF5XCI7XG4gIGlmIChpc0RhdGUodmFsKSlcbiAgICByZXR1cm4gXCJkYXRlXCI7XG4gIGlmIChpc0Vycm9yKHZhbCkpXG4gICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gY3Rvck5hbWUodmFsKTtcbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlIFwiU3ltYm9sXCI6XG4gICAgY2FzZSBcIlByb21pc2VcIjpcbiAgICBjYXNlIFwiV2Vha01hcFwiOlxuICAgIGNhc2UgXCJXZWFrU2V0XCI6XG4gICAgY2FzZSBcIk1hcFwiOlxuICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCBcIlwiKTtcbn1cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gXCJmdW5jdGlvblwiID8gdmFsLmNvbnN0cnVjdG9yLm5hbWUgOiBudWxsO1xufVxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWwuY29uc3RydWN0b3IgJiYgdHlwZW9mIHZhbC5jb25zdHJ1Y3Rvci5zdGFja1RyYWNlTGltaXQgPT09IFwibnVtYmVyXCI7XG59XG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKVxuICAgIHJldHVybiB0cnVlO1xuICByZXR1cm4gdHlwZW9mIHZhbC50b0RhdGVTdHJpbmcgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgdmFsLnNldERhdGUgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgbGV0IHR5cGVPZlZhbCA9IHR5cGVvZiB2YWw7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB0eXBlT2ZWYWwgPSBtaW5pS2luZE9mKHZhbCk7XG4gIH1cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLy8gc3JjL2NyZWF0ZVN0b3JlLnRzXG5mdW5jdGlvbiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSA6IGBFeHBlY3RlZCB0aGUgcm9vdCByZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YocmVkdWNlcil9J2ApO1xuICB9XG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZW5oYW5jZXIgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgZW5oYW5jZXIgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgYXJndW1lbnRzWzNdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgwKSA6IFwiSXQgbG9va3MgbGlrZSB5b3UgYXJlIHBhc3Npbmcgc2V2ZXJhbCBzdG9yZSBlbmhhbmNlcnMgdG8gY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gdG9nZXRoZXIgdG8gYSBzaW5nbGUgZnVuY3Rpb24uIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNjcmVhdGluZy1hLXN0b3JlLXdpdGgtZW5oYW5jZXJzIGZvciBhbiBleGFtcGxlLlwiKTtcbiAgfVxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGVuaGFuY2VyID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZW5oYW5jZXIgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgICBwcmVsb2FkZWRTdGF0ZSA9IHZvaWQgMDtcbiAgfVxuICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IGBFeHBlY3RlZCB0aGUgZW5oYW5jZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihlbmhhbmNlcil9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gZW5oYW5jZXIoY3JlYXRlU3RvcmUpKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgfVxuICBsZXQgY3VycmVudFJlZHVjZXIgPSByZWR1Y2VyO1xuICBsZXQgY3VycmVudFN0YXRlID0gcHJlbG9hZGVkU3RhdGU7XG4gIGxldCBjdXJyZW50TGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICBsZXQgbGlzdGVuZXJJZENvdW50ZXIgPSAwO1xuICBsZXQgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIGN1cnJlbnRMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIsIGtleSkgPT4ge1xuICAgICAgICBuZXh0TGlzdGVuZXJzLnNldChrZXksIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiBcIllvdSBtYXkgbm90IGNhbGwgc3RvcmUuZ2V0U3RhdGUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuIFRoZSByZWR1Y2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIHRoZSBzdGF0ZSBhcyBhbiBhcmd1bWVudC4gUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS5cIik7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH1cbiAgZnVuY3Rpb24gc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IGBFeHBlY3RlZCB0aGUgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihsaXN0ZW5lcil9J2ApO1xuICAgIH1cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNSkgOiBcIllvdSBtYXkgbm90IGNhbGwgc3RvcmUuc3Vic2NyaWJlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiBJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSBjb21wb25lbnQgYW5kIGludm9rZSBzdG9yZS5nZXRTdGF0ZSgpIGluIHRoZSBjYWxsYmFjayB0byBhY2Nlc3MgdGhlIGxhdGVzdCBzdGF0ZS4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLlwiKTtcbiAgICB9XG4gICAgbGV0IGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgIGNvbnN0IGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkQ291bnRlcisrO1xuICAgIG5leHRMaXN0ZW5lcnMuc2V0KGxpc3RlbmVySWQsIGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg2KSA6IFwiWW91IG1heSBub3QgdW5zdWJzY3JpYmUgZnJvbSBhIHN0b3JlIGxpc3RlbmVyIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLlwiKTtcbiAgICAgIH1cbiAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgICAgbmV4dExpc3RlbmVycy5kZWxldGUobGlzdGVuZXJJZCk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg3KSA6IGBBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJyR7a2luZE9mKGFjdGlvbil9Jy4gWW91IG1heSBuZWVkIHRvIGFkZCBtaWRkbGV3YXJlIHRvIHlvdXIgc3RvcmUgc2V0dXAgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIG90aGVyIHZhbHVlcywgc3VjaCBhcyAncmVkdXgtdGh1bmsnIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBmdW5jdGlvbnMuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNtaWRkbGV3YXJlIGFuZCBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNi1hc3luYy1sb2dpYyN1c2luZy10aGUtcmVkdXgtdGh1bmstbWlkZGxld2FyZSBmb3IgZXhhbXBsZXMuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDgpIDogJ0FjdGlvbnMgbWF5IG5vdCBoYXZlIGFuIHVuZGVmaW5lZCBcInR5cGVcIiBwcm9wZXJ0eS4gWW91IG1heSBoYXZlIG1pc3NwZWxsZWQgYW4gYWN0aW9uIHR5cGUgc3RyaW5nIGNvbnN0YW50LicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNykgOiBgQWN0aW9uIFwidHlwZVwiIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmcuIEluc3RlYWQsIHRoZSBhY3R1YWwgdHlwZSB3YXM6ICcke2tpbmRPZihhY3Rpb24udHlwZSl9Jy4gVmFsdWUgd2FzOiAnJHthY3Rpb24udHlwZX0nIChzdHJpbmdpZmllZClgKTtcbiAgICB9XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogXCJSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG4gICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH0pO1xuICAgIHJldHVybiBhY3Rpb247XG4gIH1cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEwKSA6IGBFeHBlY3RlZCB0aGUgbmV4dFJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihuZXh0UmVkdWNlcil9YCk7XG4gICAgfVxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5SRVBMQUNFXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICBjb25zdCBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbWluaW1hbCBvYnNlcnZhYmxlIHN1YnNjcmlwdGlvbiBtZXRob2QuXG4gICAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgQW55IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIG9ic2VydmVyLlxuICAgICAgICogVGhlIG9ic2VydmVyIG9iamVjdCBzaG91bGQgaGF2ZSBhIGBuZXh0YCBtZXRob2QuXG4gICAgICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhbiBgdW5zdWJzY3JpYmVgIG1ldGhvZCB0aGF0IGNhblxuICAgICAgICogYmUgdXNlZCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSBmcm9tIHRoZSBzdG9yZSwgYW5kIHByZXZlbnQgZnVydGhlclxuICAgICAgICogZW1pc3Npb24gb2YgdmFsdWVzIGZyb20gdGhlIG9ic2VydmFibGUuXG4gICAgICAgKi9cbiAgICAgIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSBcIm9iamVjdFwiIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTEpIDogYEV4cGVjdGVkIHRoZSBvYnNlcnZlciB0byBiZSBhbiBvYmplY3QuIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2Yob2JzZXJ2ZXIpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBc09ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgICAgICAgaWYgKG9ic2VydmVyQXNPYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlckFzT2JzZXJ2ZXIubmV4dChnZXRTdGF0ZSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gb3V0ZXJTdWJzY3JpYmUob2JzZXJ2ZVN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bnN1YnNjcmliZVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIFtzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0XSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBkaXNwYXRjaCh7XG4gICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUXG4gIH0pO1xuICBjb25zdCBzdG9yZSA9IHtcbiAgICBkaXNwYXRjaCxcbiAgICBzdWJzY3JpYmUsXG4gICAgZ2V0U3RhdGUsXG4gICAgcmVwbGFjZVJlZHVjZXIsXG4gICAgW3N5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHRdOiBvYnNlcnZhYmxlXG4gIH07XG4gIHJldHVybiBzdG9yZTtcbn1cbmZ1bmN0aW9uIGxlZ2FjeV9jcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgcmV0dXJuIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcik7XG59XG5cbi8vIHNyYy91dGlscy93YXJuaW5nLnRzXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIHRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cblxuLy8gc3JjL2NvbWJpbmVSZWR1Y2Vycy50c1xuZnVuY3Rpb24gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShpbnB1dFN0YXRlLCByZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpIHtcbiAgY29uc3QgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIGNvbnN0IGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUID8gXCJwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmVcIiA6IFwicHJldmlvdXMgc3RhdGUgcmVjZWl2ZWQgYnkgdGhlIHJlZHVjZXJcIjtcbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIlN0b3JlIGRvZXMgbm90IGhhdmUgYSB2YWxpZCByZWR1Y2VyLiBNYWtlIHN1cmUgdGhlIGFyZ3VtZW50IHBhc3NlZCB0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuXCI7XG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGlucHV0U3RhdGUpKSB7XG4gICAgcmV0dXJuIGBUaGUgJHthcmd1bWVudE5hbWV9IGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXCIke2tpbmRPZihpbnB1dFN0YXRlKX1cIi4gRXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzOiBcIiR7cmVkdWNlcktleXMuam9pbignXCIsIFwiJyl9XCJgO1xuICB9XG4gIGNvbnN0IHVuZXhwZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRTdGF0ZSkuZmlsdGVyKChrZXkpID0+ICFyZWR1Y2Vycy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICF1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSk7XG4gIHVuZXhwZWN0ZWRLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldID0gdHJ1ZTtcbiAgfSk7XG4gIGlmIChhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IGFjdGlvblR5cGVzX2RlZmF1bHQuUkVQTEFDRSlcbiAgICByZXR1cm47XG4gIGlmICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGBVbmV4cGVjdGVkICR7dW5leHBlY3RlZEtleXMubGVuZ3RoID4gMSA/IFwia2V5c1wiIDogXCJrZXlcIn0gXCIke3VuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpfVwiIGZvdW5kIGluICR7YXJndW1lbnROYW1lfS4gRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiR7cmVkdWNlcktleXMuam9pbignXCIsIFwiJyl9XCIuIFVuZXhwZWN0ZWQga2V5cyB3aWxsIGJlIGlnbm9yZWQuYDtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0UmVkdWNlclNoYXBlKHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUXG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEyKSA6IGBUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtrZXl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgeW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5QUk9CRV9VTktOT1dOX0FDVElPTigpXG4gICAgfSkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IGBUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtrZXl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gcHJvYmVkIHdpdGggYSByYW5kb20gdHlwZS4gRG9uJ3QgdHJ5IHRvIGhhbmRsZSAnJHthY3Rpb25UeXBlc19kZWZhdWx0LklOSVR9JyBvciBvdGhlciBhY3Rpb25zIGluIFwicmVkdXgvKlwiIG5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHVubGVzcyBpdCBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSBhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5gKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSB7XG4gIGNvbnN0IHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICBjb25zdCBmaW5hbFJlZHVjZXJzID0ge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgd2FybmluZyhgTm8gcmVkdWNlciBwcm92aWRlZCBmb3Iga2V5IFwiJHtrZXl9XCJgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIGNvbnN0IGZpbmFsUmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhmaW5hbFJlZHVjZXJzKTtcbiAgbGV0IHVuZXhwZWN0ZWRLZXlDYWNoZTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHt9O1xuICB9XG4gIGxldCBzaGFwZUFzc2VydGlvbkVycm9yO1xuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBjb21iaW5hdGlvbihzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPSBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKHN0YXRlLCBmaW5hbFJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSk7XG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgbmV4dFN0YXRlID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaW5hbFJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBmaW5hbFJlZHVjZXJLZXlzW2ldO1xuICAgICAgY29uc3QgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNba2V5XTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtrZXldO1xuICAgICAgY29uc3QgbmV4dFN0YXRlRm9yS2V5ID0gcmVkdWNlcihwcmV2aW91c1N0YXRlRm9yS2V5LCBhY3Rpb24pO1xuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uVHlwZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogYFdoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgJHthY3Rpb25UeXBlID8gYFwiJHtTdHJpbmcoYWN0aW9uVHlwZSl9XCJgIDogXCIodW5rbm93biB0eXBlKVwifSwgdGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7a2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZC4gVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBJZiB5b3Ugd2FudCB0aGlzIHJlZHVjZXIgdG8gaG9sZCBubyB2YWx1ZSwgeW91IGNhbiByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5gKTtcbiAgICAgIH1cbiAgICAgIG5leHRTdGF0ZVtrZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cbiAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBmaW5hbFJlZHVjZXJLZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoc3RhdGUpLmxlbmd0aDtcbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlO1xuICB9O1xufVxuXG4vLyBzcmMvYmluZEFjdGlvbkNyZWF0b3JzLnRzXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIHJldHVybiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9ycyhhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyAhPT0gXCJvYmplY3RcIiB8fCBhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSA6IGBiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnJHtraW5kT2YoYWN0aW9uQ3JlYXRvcnMpfScuIERpZCB5b3Ugd3JpdGUgXCJpbXBvcnQgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiIGluc3RlYWQgb2YgXCJpbXBvcnQgKiBhcyBBY3Rpb25DcmVhdG9ycyBmcm9tXCI/YCk7XG4gIH1cbiAgY29uc3QgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIGNvbnN0IGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufVxuXG4vLyBzcmMvY29tcG9zZS50c1xuZnVuY3Rpb24gY29tcG9zZSguLi5mdW5jcykge1xuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhcmcpID0+IGFyZztcbiAgfVxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZ1bmNzWzBdO1xuICB9XG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoKGEsIGIpID0+ICguLi5hcmdzKSA9PiBhKGIoLi4uYXJncykpKTtcbn1cblxuLy8gc3JjL2FwcGx5TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKC4uLm1pZGRsZXdhcmVzKSB7XG4gIHJldHVybiAoY3JlYXRlU3RvcmUyKSA9PiAocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlMihyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gICAgbGV0IGRpc3BhdGNoID0gKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTUpIDogXCJEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiBPdGhlciBtaWRkbGV3YXJlIHdvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIHRoaXMgZGlzcGF0Y2guXCIpO1xuICAgIH07XG4gICAgY29uc3QgbWlkZGxld2FyZUFQSSA9IHtcbiAgICAgIGdldFN0YXRlOiBzdG9yZS5nZXRTdGF0ZSxcbiAgICAgIGRpc3BhdGNoOiAoYWN0aW9uLCAuLi5hcmdzKSA9PiBkaXNwYXRjaChhY3Rpb24sIC4uLmFyZ3MpXG4gICAgfTtcbiAgICBjb25zdCBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcCgobWlkZGxld2FyZSkgPT4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKSk7XG4gICAgZGlzcGF0Y2ggPSBjb21wb3NlKC4uLmNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0b3JlLFxuICAgICAgZGlzcGF0Y2hcbiAgICB9O1xuICB9O1xufVxuXG4vLyBzcmMvdXRpbHMvaXNBY3Rpb24udHNcbmZ1bmN0aW9uIGlzQWN0aW9uKGFjdGlvbikge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdChhY3Rpb24pICYmIFwidHlwZVwiIGluIGFjdGlvbiAmJiB0eXBlb2YgYWN0aW9uLnR5cGUgPT09IFwic3RyaW5nXCI7XG59XG5leHBvcnQge1xuICBhY3Rpb25UeXBlc19kZWZhdWx0IGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsXG4gIGFwcGx5TWlkZGxld2FyZSxcbiAgYmluZEFjdGlvbkNyZWF0b3JzLFxuICBjb21iaW5lUmVkdWNlcnMsXG4gIGNvbXBvc2UsXG4gIGNyZWF0ZVN0b3JlLFxuICBpc0FjdGlvbixcbiAgaXNQbGFpbk9iamVjdCxcbiAgbGVnYWN5X2NyZWF0ZVN0b3JlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVkdXgubWpzLm1hcCIsIi8vIHNyYy9kZXZNb2RlQ2hlY2tzL2lkZW50aXR5RnVuY3Rpb25DaGVjay50c1xudmFyIHJ1bklkZW50aXR5RnVuY3Rpb25DaGVjayA9IChyZXN1bHRGdW5jLCBpbnB1dFNlbGVjdG9yc1Jlc3VsdHMsIG91dHB1dFNlbGVjdG9yUmVzdWx0KSA9PiB7XG4gIGlmIChpbnB1dFNlbGVjdG9yc1Jlc3VsdHMubGVuZ3RoID09PSAxICYmIGlucHV0U2VsZWN0b3JzUmVzdWx0c1swXSA9PT0gb3V0cHV0U2VsZWN0b3JSZXN1bHQpIHtcbiAgICBsZXQgaXNJbnB1dFNhbWVBc091dHB1dCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbXB0eU9iamVjdCA9IHt9O1xuICAgICAgaWYgKHJlc3VsdEZ1bmMoZW1wdHlPYmplY3QpID09PSBlbXB0eU9iamVjdClcbiAgICAgICAgaXNJbnB1dFNhbWVBc091dHB1dCA9IHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICAgIGlmIChpc0lucHV0U2FtZUFzT3V0cHV0KSB7XG4gICAgICBsZXQgc3RhY2sgPSB2b2lkIDA7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgO1xuICAgICAgICAoeyBzdGFjayB9ID0gZSk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiVGhlIHJlc3VsdCBmdW5jdGlvbiByZXR1cm5lZCBpdHMgb3duIGlucHV0cyB3aXRob3V0IG1vZGlmaWNhdGlvbi4gZS5nXFxuYGNyZWF0ZVNlbGVjdG9yKFtzdGF0ZSA9PiBzdGF0ZS50b2Rvc10sIHRvZG9zID0+IHRvZG9zKWBcXG5UaGlzIGNvdWxkIGxlYWQgdG8gaW5lZmZpY2llbnQgbWVtb2l6YXRpb24gYW5kIHVubmVjZXNzYXJ5IHJlLXJlbmRlcnMuXFxuRW5zdXJlIHRyYW5zZm9ybWF0aW9uIGxvZ2ljIGlzIGluIHRoZSByZXN1bHQgZnVuY3Rpb24sIGFuZCBleHRyYWN0aW9uIGxvZ2ljIGlzIGluIHRoZSBpbnB1dCBzZWxlY3RvcnMuXCIsXG4gICAgICAgIHsgc3RhY2sgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIHNyYy9kZXZNb2RlQ2hlY2tzL2lucHV0U3RhYmlsaXR5Q2hlY2sudHNcbnZhciBydW5JbnB1dFN0YWJpbGl0eUNoZWNrID0gKGlucHV0U2VsZWN0b3JSZXN1bHRzT2JqZWN0LCBvcHRpb25zLCBpbnB1dFNlbGVjdG9yQXJncykgPT4ge1xuICBjb25zdCB7IG1lbW9pemUsIG1lbW9pemVPcHRpb25zIH0gPSBvcHRpb25zO1xuICBjb25zdCB7IGlucHV0U2VsZWN0b3JSZXN1bHRzLCBpbnB1dFNlbGVjdG9yUmVzdWx0c0NvcHkgfSA9IGlucHV0U2VsZWN0b3JSZXN1bHRzT2JqZWN0O1xuICBjb25zdCBjcmVhdGVBbkVtcHR5T2JqZWN0ID0gbWVtb2l6ZSgoKSA9PiAoe30pLCAuLi5tZW1vaXplT3B0aW9ucyk7XG4gIGNvbnN0IGFyZUlucHV0U2VsZWN0b3JSZXN1bHRzRXF1YWwgPSBjcmVhdGVBbkVtcHR5T2JqZWN0LmFwcGx5KG51bGwsIGlucHV0U2VsZWN0b3JSZXN1bHRzKSA9PT0gY3JlYXRlQW5FbXB0eU9iamVjdC5hcHBseShudWxsLCBpbnB1dFNlbGVjdG9yUmVzdWx0c0NvcHkpO1xuICBpZiAoIWFyZUlucHV0U2VsZWN0b3JSZXN1bHRzRXF1YWwpIHtcbiAgICBsZXQgc3RhY2sgPSB2b2lkIDA7XG4gICAgdHJ5IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIDtcbiAgICAgICh7IHN0YWNrIH0gPSBlKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJBbiBpbnB1dCBzZWxlY3RvciByZXR1cm5lZCBhIGRpZmZlcmVudCByZXN1bHQgd2hlbiBwYXNzZWQgc2FtZSBhcmd1bWVudHMuXFxuVGhpcyBtZWFucyB5b3VyIG91dHB1dCBzZWxlY3RvciB3aWxsIGxpa2VseSBydW4gbW9yZSBmcmVxdWVudGx5IHRoYW4gaW50ZW5kZWQuXFxuQXZvaWQgcmV0dXJuaW5nIGEgbmV3IHJlZmVyZW5jZSBpbnNpZGUgeW91ciBpbnB1dCBzZWxlY3RvciwgZS5nLlxcbmBjcmVhdGVTZWxlY3Rvcihbc3RhdGUgPT4gc3RhdGUudG9kb3MubWFwKHRvZG8gPT4gdG9kby5pZCldLCB0b2RvSWRzID0+IHRvZG9JZHMubGVuZ3RoKWBcIixcbiAgICAgIHtcbiAgICAgICAgYXJndW1lbnRzOiBpbnB1dFNlbGVjdG9yQXJncyxcbiAgICAgICAgZmlyc3RJbnB1dHM6IGlucHV0U2VsZWN0b3JSZXN1bHRzLFxuICAgICAgICBzZWNvbmRJbnB1dHM6IGlucHV0U2VsZWN0b3JSZXN1bHRzQ29weSxcbiAgICAgICAgc3RhY2tcbiAgICAgIH1cbiAgICApO1xuICB9XG59O1xuXG4vLyBzcmMvZGV2TW9kZUNoZWNrcy9zZXRHbG9iYWxEZXZNb2RlQ2hlY2tzLnRzXG52YXIgZ2xvYmFsRGV2TW9kZUNoZWNrcyA9IHtcbiAgaW5wdXRTdGFiaWxpdHlDaGVjazogXCJvbmNlXCIsXG4gIGlkZW50aXR5RnVuY3Rpb25DaGVjazogXCJvbmNlXCJcbn07XG52YXIgc2V0R2xvYmFsRGV2TW9kZUNoZWNrcyA9IChkZXZNb2RlQ2hlY2tzKSA9PiB7XG4gIE9iamVjdC5hc3NpZ24oZ2xvYmFsRGV2TW9kZUNoZWNrcywgZGV2TW9kZUNoZWNrcyk7XG59O1xuXG4vLyBzcmMvdXRpbHMudHNcbnZhciBOT1RfRk9VTkQgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKFwiTk9UX0ZPVU5EXCIpO1xuZnVuY3Rpb24gYXNzZXJ0SXNGdW5jdGlvbihmdW5jLCBlcnJvck1lc3NhZ2UgPSBgZXhwZWN0ZWQgYSBmdW5jdGlvbiwgaW5zdGVhZCByZWNlaXZlZCAke3R5cGVvZiBmdW5jfWApIHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVycm9yTWVzc2FnZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydElzT2JqZWN0KG9iamVjdCwgZXJyb3JNZXNzYWdlID0gYGV4cGVjdGVkIGFuIG9iamVjdCwgaW5zdGVhZCByZWNlaXZlZCAke3R5cGVvZiBvYmplY3R9YCkge1xuICBpZiAodHlwZW9mIG9iamVjdCAhPT0gXCJvYmplY3RcIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0SXNBcnJheU9mRnVuY3Rpb25zKGFycmF5LCBlcnJvck1lc3NhZ2UgPSBgZXhwZWN0ZWQgYWxsIGl0ZW1zIHRvIGJlIGZ1bmN0aW9ucywgaW5zdGVhZCByZWNlaXZlZCB0aGUgZm9sbG93aW5nIHR5cGVzOiBgKSB7XG4gIGlmICghYXJyYXkuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgY29uc3QgaXRlbVR5cGVzID0gYXJyYXkubWFwKFxuICAgICAgKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcImZ1bmN0aW9uXCIgPyBgZnVuY3Rpb24gJHtpdGVtLm5hbWUgfHwgXCJ1bm5hbWVkXCJ9KClgIDogdHlwZW9mIGl0ZW1cbiAgICApLmpvaW4oXCIsIFwiKTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2Vycm9yTWVzc2FnZX1bJHtpdGVtVHlwZXN9XWApO1xuICB9XG59XG52YXIgZW5zdXJlSXNBcnJheSA9IChpdGVtKSA9PiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGl0ZW0pID8gaXRlbSA6IFtpdGVtXTtcbn07XG5mdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMoY3JlYXRlU2VsZWN0b3JBcmdzKSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IEFycmF5LmlzQXJyYXkoY3JlYXRlU2VsZWN0b3JBcmdzWzBdKSA/IGNyZWF0ZVNlbGVjdG9yQXJnc1swXSA6IGNyZWF0ZVNlbGVjdG9yQXJncztcbiAgYXNzZXJ0SXNBcnJheU9mRnVuY3Rpb25zKFxuICAgIGRlcGVuZGVuY2llcyxcbiAgICBgY3JlYXRlU2VsZWN0b3IgZXhwZWN0cyBhbGwgaW5wdXQtc2VsZWN0b3JzIHRvIGJlIGZ1bmN0aW9ucywgYnV0IHJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgdHlwZXM6IGBcbiAgKTtcbiAgcmV0dXJuIGRlcGVuZGVuY2llcztcbn1cbmZ1bmN0aW9uIGNvbGxlY3RJbnB1dFNlbGVjdG9yUmVzdWx0cyhkZXBlbmRlbmNpZXMsIGlucHV0U2VsZWN0b3JBcmdzKSB7XG4gIGNvbnN0IGlucHV0U2VsZWN0b3JSZXN1bHRzID0gW107XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBkZXBlbmRlbmNpZXM7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpbnB1dFNlbGVjdG9yUmVzdWx0cy5wdXNoKGRlcGVuZGVuY2llc1tpXS5hcHBseShudWxsLCBpbnB1dFNlbGVjdG9yQXJncykpO1xuICB9XG4gIHJldHVybiBpbnB1dFNlbGVjdG9yUmVzdWx0cztcbn1cbnZhciBnZXREZXZNb2RlQ2hlY2tzRXhlY3V0aW9uSW5mbyA9IChmaXJzdFJ1biwgZGV2TW9kZUNoZWNrcykgPT4ge1xuICBjb25zdCB7IGlkZW50aXR5RnVuY3Rpb25DaGVjaywgaW5wdXRTdGFiaWxpdHlDaGVjayB9ID0ge1xuICAgIC4uLmdsb2JhbERldk1vZGVDaGVja3MsXG4gICAgLi4uZGV2TW9kZUNoZWNrc1xuICB9O1xuICByZXR1cm4ge1xuICAgIGlkZW50aXR5RnVuY3Rpb25DaGVjazoge1xuICAgICAgc2hvdWxkUnVuOiBpZGVudGl0eUZ1bmN0aW9uQ2hlY2sgPT09IFwiYWx3YXlzXCIgfHwgaWRlbnRpdHlGdW5jdGlvbkNoZWNrID09PSBcIm9uY2VcIiAmJiBmaXJzdFJ1bixcbiAgICAgIHJ1bjogcnVuSWRlbnRpdHlGdW5jdGlvbkNoZWNrXG4gICAgfSxcbiAgICBpbnB1dFN0YWJpbGl0eUNoZWNrOiB7XG4gICAgICBzaG91bGRSdW46IGlucHV0U3RhYmlsaXR5Q2hlY2sgPT09IFwiYWx3YXlzXCIgfHwgaW5wdXRTdGFiaWxpdHlDaGVjayA9PT0gXCJvbmNlXCIgJiYgZmlyc3RSdW4sXG4gICAgICBydW46IHJ1bklucHV0U3RhYmlsaXR5Q2hlY2tcbiAgICB9XG4gIH07XG59O1xuXG4vLyBzcmMvYXV0b3RyYWNrTWVtb2l6ZS9hdXRvdHJhY2tpbmcudHNcbnZhciAkUkVWSVNJT04gPSAwO1xudmFyIENVUlJFTlRfVFJBQ0tFUiA9IG51bGw7XG52YXIgQ2VsbCA9IGNsYXNzIHtcbiAgcmV2aXNpb24gPSAkUkVWSVNJT047XG4gIF92YWx1ZTtcbiAgX2xhc3RWYWx1ZTtcbiAgX2lzRXF1YWwgPSB0cmlwbGVFcTtcbiAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlLCBpc0VxdWFsID0gdHJpcGxlRXEpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2xhc3RWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB0aGlzLl9pc0VxdWFsID0gaXNFcXVhbDtcbiAgfVxuICAvLyBXaGVuZXZlciBhIHN0b3JhZ2UgdmFsdWUgaXMgcmVhZCwgaXQnbGwgYWRkIGl0c2VsZiB0byB0aGUgY3VycmVudCB0cmFja2VyIGlmXG4gIC8vIG9uZSBleGlzdHMsIGVudGFuZ2xpbmcgaXRzIHN0YXRlIHdpdGggdGhhdCBjYWNoZS5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIENVUlJFTlRfVFJBQ0tFUj8uYWRkKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICAvLyBXaGVuZXZlciBhIHN0b3JhZ2UgdmFsdWUgaXMgdXBkYXRlZCwgd2UgYnVtcCB0aGUgZ2xvYmFsIHJldmlzaW9uIGNsb2NrLFxuICAvLyBhc3NpZ24gdGhlIHJldmlzaW9uIGZvciB0aGlzIHN0b3JhZ2UgdG8gdGhlIG5ldyB2YWx1ZSwgX2FuZF8gd2Ugc2NoZWR1bGUgYVxuICAvLyByZXJlbmRlci4gVGhpcyBpcyBpbXBvcnRhbnQsIGFuZCBpdCdzIHdoYXQgbWFrZXMgYXV0b3RyYWNraW5nICBfcHVsbF9cbiAgLy8gYmFzZWQuIFdlIGRvbid0IGFjdGl2ZWx5IHRlbGwgdGhlIGNhY2hlcyB3aGljaCBkZXBlbmQgb24gdGhlIHN0b3JhZ2UgdGhhdFxuICAvLyBhbnl0aGluZyBoYXMgaGFwcGVuZWQuIEluc3RlYWQsIHdlIHJlY29tcHV0ZSB0aGUgY2FjaGVzIHdoZW4gbmVlZGVkLlxuICBzZXQgdmFsdWUobmV3VmFsdWUpIHtcbiAgICBpZiAodGhpcy52YWx1ZSA9PT0gbmV3VmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnJldmlzaW9uID0gKyskUkVWSVNJT047XG4gIH1cbn07XG5mdW5jdGlvbiB0cmlwbGVFcShhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufVxudmFyIFRyYWNraW5nQ2FjaGUgPSBjbGFzcyB7XG4gIF9jYWNoZWRWYWx1ZTtcbiAgX2NhY2hlZFJldmlzaW9uID0gLTE7XG4gIF9kZXBzID0gW107XG4gIGhpdHMgPSAwO1xuICBmbjtcbiAgY29uc3RydWN0b3IoZm4pIHtcbiAgICB0aGlzLmZuID0gZm47XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5fY2FjaGVkVmFsdWUgPSB2b2lkIDA7XG4gICAgdGhpcy5fY2FjaGVkUmV2aXNpb24gPSAtMTtcbiAgICB0aGlzLl9kZXBzID0gW107XG4gICAgdGhpcy5oaXRzID0gMDtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgaWYgKHRoaXMucmV2aXNpb24gPiB0aGlzLl9jYWNoZWRSZXZpc2lvbikge1xuICAgICAgY29uc3QgeyBmbiB9ID0gdGhpcztcbiAgICAgIGNvbnN0IGN1cnJlbnRUcmFja2VyID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IHByZXZUcmFja2VyID0gQ1VSUkVOVF9UUkFDS0VSO1xuICAgICAgQ1VSUkVOVF9UUkFDS0VSID0gY3VycmVudFRyYWNrZXI7XG4gICAgICB0aGlzLl9jYWNoZWRWYWx1ZSA9IGZuKCk7XG4gICAgICBDVVJSRU5UX1RSQUNLRVIgPSBwcmV2VHJhY2tlcjtcbiAgICAgIHRoaXMuaGl0cysrO1xuICAgICAgdGhpcy5fZGVwcyA9IEFycmF5LmZyb20oY3VycmVudFRyYWNrZXIpO1xuICAgICAgdGhpcy5fY2FjaGVkUmV2aXNpb24gPSB0aGlzLnJldmlzaW9uO1xuICAgIH1cbiAgICBDVVJSRU5UX1RSQUNLRVI/LmFkZCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkVmFsdWU7XG4gIH1cbiAgZ2V0IHJldmlzaW9uKCkge1xuICAgIHJldHVybiBNYXRoLm1heCguLi50aGlzLl9kZXBzLm1hcCgoZCkgPT4gZC5yZXZpc2lvbiksIDApO1xuICB9XG59O1xuZnVuY3Rpb24gZ2V0VmFsdWUoY2VsbCkge1xuICBpZiAoIShjZWxsIGluc3RhbmNlb2YgQ2VsbCkpIHtcbiAgICBjb25zb2xlLndhcm4oXCJOb3QgYSB2YWxpZCBjZWxsISBcIiwgY2VsbCk7XG4gIH1cbiAgcmV0dXJuIGNlbGwudmFsdWU7XG59XG5mdW5jdGlvbiBzZXRWYWx1ZShzdG9yYWdlLCB2YWx1ZSkge1xuICBpZiAoIShzdG9yYWdlIGluc3RhbmNlb2YgQ2VsbCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJzZXRWYWx1ZSBtdXN0IGJlIHBhc3NlZCBhIHRyYWNrZWQgc3RvcmUgY3JlYXRlZCB3aXRoIGBjcmVhdGVTdG9yYWdlYC5cIlxuICAgICk7XG4gIH1cbiAgc3RvcmFnZS52YWx1ZSA9IHN0b3JhZ2UuX2xhc3RWYWx1ZSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2VsbChpbml0aWFsVmFsdWUsIGlzRXF1YWwgPSB0cmlwbGVFcSkge1xuICByZXR1cm4gbmV3IENlbGwoaW5pdGlhbFZhbHVlLCBpc0VxdWFsKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKGZuKSB7XG4gIGFzc2VydElzRnVuY3Rpb24oXG4gICAgZm4sXG4gICAgXCJ0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIGBjcmVhdGVDYWNoZWAgbXVzdCBiZSBhIGZ1bmN0aW9uXCJcbiAgKTtcbiAgcmV0dXJuIG5ldyBUcmFja2luZ0NhY2hlKGZuKTtcbn1cblxuLy8gc3JjL2F1dG90cmFja01lbW9pemUvdHJhY2tpbmcudHNcbnZhciBuZXZlckVxID0gKGEsIGIpID0+IGZhbHNlO1xuZnVuY3Rpb24gY3JlYXRlVGFnKCkge1xuICByZXR1cm4gY3JlYXRlQ2VsbChudWxsLCBuZXZlckVxKTtcbn1cbmZ1bmN0aW9uIGRpcnR5VGFnKHRhZywgdmFsdWUpIHtcbiAgc2V0VmFsdWUodGFnLCB2YWx1ZSk7XG59XG52YXIgY29uc3VtZUNvbGxlY3Rpb24gPSAobm9kZSkgPT4ge1xuICBsZXQgdGFnID0gbm9kZS5jb2xsZWN0aW9uVGFnO1xuICBpZiAodGFnID09PSBudWxsKSB7XG4gICAgdGFnID0gbm9kZS5jb2xsZWN0aW9uVGFnID0gY3JlYXRlVGFnKCk7XG4gIH1cbiAgZ2V0VmFsdWUodGFnKTtcbn07XG52YXIgZGlydHlDb2xsZWN0aW9uID0gKG5vZGUpID0+IHtcbiAgY29uc3QgdGFnID0gbm9kZS5jb2xsZWN0aW9uVGFnO1xuICBpZiAodGFnICE9PSBudWxsKSB7XG4gICAgZGlydHlUYWcodGFnLCBudWxsKTtcbiAgfVxufTtcblxuLy8gc3JjL2F1dG90cmFja01lbW9pemUvcHJveHkudHNcbnZhciBSRURVWF9QUk9YWV9MQUJFTCA9IFN5bWJvbCgpO1xudmFyIG5leHRJZCA9IDA7XG52YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoe30pO1xudmFyIE9iamVjdFRyZWVOb2RlID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy50YWcudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwcm94eSA9IG5ldyBQcm94eSh0aGlzLCBvYmplY3RQcm94eUhhbmRsZXIpO1xuICB0YWcgPSBjcmVhdGVUYWcoKTtcbiAgdGFncyA9IHt9O1xuICBjaGlsZHJlbiA9IHt9O1xuICBjb2xsZWN0aW9uVGFnID0gbnVsbDtcbiAgaWQgPSBuZXh0SWQrKztcbn07XG52YXIgb2JqZWN0UHJveHlIYW5kbGVyID0ge1xuICBnZXQobm9kZSwga2V5KSB7XG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlUmVzdWx0KCkge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gbm9kZTtcbiAgICAgIGNvbnN0IGNoaWxkVmFsdWUgPSBSZWZsZWN0LmdldCh2YWx1ZSwga2V5KTtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgIHJldHVybiBjaGlsZFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGtleSBpbiBwcm90bykge1xuICAgICAgICByZXR1cm4gY2hpbGRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBjaGlsZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGxldCBjaGlsZE5vZGUgPSBub2RlLmNoaWxkcmVuW2tleV07XG4gICAgICAgIGlmIChjaGlsZE5vZGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGNoaWxkTm9kZSA9IG5vZGUuY2hpbGRyZW5ba2V5XSA9IGNyZWF0ZU5vZGUoY2hpbGRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkTm9kZS50YWcpIHtcbiAgICAgICAgICBnZXRWYWx1ZShjaGlsZE5vZGUudGFnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGROb2RlLnByb3h5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHRhZyA9IG5vZGUudGFnc1trZXldO1xuICAgICAgICBpZiAodGFnID09PSB2b2lkIDApIHtcbiAgICAgICAgICB0YWcgPSBub2RlLnRhZ3Nba2V5XSA9IGNyZWF0ZVRhZygpO1xuICAgICAgICAgIHRhZy52YWx1ZSA9IGNoaWxkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0VmFsdWUodGFnKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGNhbGN1bGF0ZVJlc3VsdCgpO1xuICAgIHJldHVybiByZXM7XG4gIH0sXG4gIG93bktleXMobm9kZSkge1xuICAgIGNvbnN1bWVDb2xsZWN0aW9uKG5vZGUpO1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMobm9kZS52YWx1ZSk7XG4gIH0sXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLCBwcm9wKSB7XG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUudmFsdWUsIHByb3ApO1xuICB9LFxuICBoYXMobm9kZSwgcHJvcCkge1xuICAgIHJldHVybiBSZWZsZWN0Lmhhcyhub2RlLnZhbHVlLCBwcm9wKTtcbiAgfVxufTtcbnZhciBBcnJheVRyZWVOb2RlID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy50YWcudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwcm94eSA9IG5ldyBQcm94eShbdGhpc10sIGFycmF5UHJveHlIYW5kbGVyKTtcbiAgdGFnID0gY3JlYXRlVGFnKCk7XG4gIHRhZ3MgPSB7fTtcbiAgY2hpbGRyZW4gPSB7fTtcbiAgY29sbGVjdGlvblRhZyA9IG51bGw7XG4gIGlkID0gbmV4dElkKys7XG59O1xudmFyIGFycmF5UHJveHlIYW5kbGVyID0ge1xuICBnZXQoW25vZGVdLCBrZXkpIHtcbiAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICBjb25zdW1lQ29sbGVjdGlvbihub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdFByb3h5SGFuZGxlci5nZXQobm9kZSwga2V5KTtcbiAgfSxcbiAgb3duS2V5cyhbbm9kZV0pIHtcbiAgICByZXR1cm4gb2JqZWN0UHJveHlIYW5kbGVyLm93bktleXMobm9kZSk7XG4gIH0sXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihbbm9kZV0sIHByb3ApIHtcbiAgICByZXR1cm4gb2JqZWN0UHJveHlIYW5kbGVyLmdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLCBwcm9wKTtcbiAgfSxcbiAgaGFzKFtub2RlXSwgcHJvcCkge1xuICAgIHJldHVybiBvYmplY3RQcm94eUhhbmRsZXIuaGFzKG5vZGUsIHByb3ApO1xuICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlTm9kZSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5VHJlZU5vZGUodmFsdWUpO1xuICB9XG4gIHJldHVybiBuZXcgT2JqZWN0VHJlZU5vZGUodmFsdWUpO1xufVxuZnVuY3Rpb24gdXBkYXRlTm9kZShub2RlLCBuZXdWYWx1ZSkge1xuICBjb25zdCB7IHZhbHVlLCB0YWdzLCBjaGlsZHJlbiB9ID0gbm9kZTtcbiAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkgJiYgdmFsdWUubGVuZ3RoICE9PSBuZXdWYWx1ZS5sZW5ndGgpIHtcbiAgICBkaXJ0eUNvbGxlY3Rpb24obm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgbGV0IG9sZEtleXNTaXplID0gMDtcbiAgICAgIGxldCBuZXdLZXlzU2l6ZSA9IDA7XG4gICAgICBsZXQgYW55S2V5c0FkZGVkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IF9rZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgb2xkS2V5c1NpemUrKztcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG5ld1ZhbHVlKSB7XG4gICAgICAgIG5ld0tleXNTaXplKys7XG4gICAgICAgIGlmICghKGtleSBpbiB2YWx1ZSkpIHtcbiAgICAgICAgICBhbnlLZXlzQWRkZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBpc0RpZmZlcmVudCA9IGFueUtleXNBZGRlZCB8fCBvbGRLZXlzU2l6ZSAhPT0gbmV3S2V5c1NpemU7XG4gICAgICBpZiAoaXNEaWZmZXJlbnQpIHtcbiAgICAgICAgZGlydHlDb2xsZWN0aW9uKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiB0YWdzKSB7XG4gICAgY29uc3QgY2hpbGRWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgY29uc3QgbmV3Q2hpbGRWYWx1ZSA9IG5ld1ZhbHVlW2tleV07XG4gICAgaWYgKGNoaWxkVmFsdWUgIT09IG5ld0NoaWxkVmFsdWUpIHtcbiAgICAgIGRpcnR5Q29sbGVjdGlvbihub2RlKTtcbiAgICAgIGRpcnR5VGFnKHRhZ3Nba2V5XSwgbmV3Q2hpbGRWYWx1ZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBuZXdDaGlsZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICBkZWxldGUgdGFnc1trZXldO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBjaGlsZHJlbikge1xuICAgIGNvbnN0IGNoaWxkTm9kZSA9IGNoaWxkcmVuW2tleV07XG4gICAgY29uc3QgbmV3Q2hpbGRWYWx1ZSA9IG5ld1ZhbHVlW2tleV07XG4gICAgY29uc3QgY2hpbGRWYWx1ZSA9IGNoaWxkTm9kZS52YWx1ZTtcbiAgICBpZiAoY2hpbGRWYWx1ZSA9PT0gbmV3Q2hpbGRWYWx1ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmV3Q2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBuZXdDaGlsZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICB1cGRhdGVOb2RlKGNoaWxkTm9kZSwgbmV3Q2hpbGRWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZU5vZGUoY2hpbGROb2RlKTtcbiAgICAgIGRlbGV0ZSBjaGlsZHJlbltrZXldO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGVsZXRlTm9kZShub2RlKSB7XG4gIGlmIChub2RlLnRhZykge1xuICAgIGRpcnR5VGFnKG5vZGUudGFnLCBudWxsKTtcbiAgfVxuICBkaXJ0eUNvbGxlY3Rpb24obm9kZSk7XG4gIGZvciAoY29uc3Qga2V5IGluIG5vZGUudGFncykge1xuICAgIGRpcnR5VGFnKG5vZGUudGFnc1trZXldLCBudWxsKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBub2RlLmNoaWxkcmVuKSB7XG4gICAgZGVsZXRlTm9kZShub2RlLmNoaWxkcmVuW2tleV0pO1xuICB9XG59XG5cbi8vIHNyYy9scnVNZW1vaXplLnRzXG5mdW5jdGlvbiBjcmVhdGVTaW5nbGV0b25DYWNoZShlcXVhbHMpIHtcbiAgbGV0IGVudHJ5O1xuICByZXR1cm4ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIGlmIChlbnRyeSAmJiBlcXVhbHMoZW50cnkua2V5LCBrZXkpKSB7XG4gICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBOT1RfRk9VTkQ7XG4gICAgfSxcbiAgICBwdXQoa2V5LCB2YWx1ZSkge1xuICAgICAgZW50cnkgPSB7IGtleSwgdmFsdWUgfTtcbiAgICB9LFxuICAgIGdldEVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gZW50cnkgPyBbZW50cnldIDogW107XG4gICAgfSxcbiAgICBjbGVhcigpIHtcbiAgICAgIGVudHJ5ID0gdm9pZCAwO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxydUNhY2hlKG1heFNpemUsIGVxdWFscykge1xuICBsZXQgZW50cmllcyA9IFtdO1xuICBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgY29uc3QgY2FjaGVJbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZXF1YWxzKGtleSwgZW50cnkua2V5KSk7XG4gICAgaWYgKGNhY2hlSW5kZXggPiAtMSkge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2NhY2hlSW5kZXhdO1xuICAgICAgaWYgKGNhY2hlSW5kZXggPiAwKSB7XG4gICAgICAgIGVudHJpZXMuc3BsaWNlKGNhY2hlSW5kZXgsIDEpO1xuICAgICAgICBlbnRyaWVzLnVuc2hpZnQoZW50cnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gTk9UX0ZPVU5EO1xuICB9XG4gIGZ1bmN0aW9uIHB1dChrZXksIHZhbHVlKSB7XG4gICAgaWYgKGdldChrZXkpID09PSBOT1RfRk9VTkQpIHtcbiAgICAgIGVudHJpZXMudW5zaGlmdCh7IGtleSwgdmFsdWUgfSk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiBtYXhTaXplKSB7XG4gICAgICAgIGVudHJpZXMucG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdldEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZW50cmllcyA9IFtdO1xuICB9XG4gIHJldHVybiB7IGdldCwgcHV0LCBnZXRFbnRyaWVzLCBjbGVhciB9O1xufVxudmFyIHJlZmVyZW5jZUVxdWFsaXR5Q2hlY2sgPSAoYSwgYikgPT4gYSA9PT0gYjtcbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlS2V5Q29tcGFyYXRvcihlcXVhbGl0eUNoZWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiBhcmVBcmd1bWVudHNTaGFsbG93bHlFcXVhbChwcmV2LCBuZXh0KSB7XG4gICAgaWYgKHByZXYgPT09IG51bGwgfHwgbmV4dCA9PT0gbnVsbCB8fCBwcmV2Lmxlbmd0aCAhPT0gbmV4dC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IHByZXY7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFlcXVhbGl0eUNoZWNrKHByZXZbaV0sIG5leHRbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5mdW5jdGlvbiBscnVNZW1vaXplKGZ1bmMsIGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMpIHtcbiAgY29uc3QgcHJvdmlkZWRPcHRpb25zID0gdHlwZW9mIGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMgPT09IFwib2JqZWN0XCIgPyBlcXVhbGl0eUNoZWNrT3JPcHRpb25zIDogeyBlcXVhbGl0eUNoZWNrOiBlcXVhbGl0eUNoZWNrT3JPcHRpb25zIH07XG4gIGNvbnN0IHtcbiAgICBlcXVhbGl0eUNoZWNrID0gcmVmZXJlbmNlRXF1YWxpdHlDaGVjayxcbiAgICBtYXhTaXplID0gMSxcbiAgICByZXN1bHRFcXVhbGl0eUNoZWNrXG4gIH0gPSBwcm92aWRlZE9wdGlvbnM7XG4gIGNvbnN0IGNvbXBhcmF0b3IgPSBjcmVhdGVDYWNoZUtleUNvbXBhcmF0b3IoZXF1YWxpdHlDaGVjayk7XG4gIGxldCByZXN1bHRzQ291bnQgPSAwO1xuICBjb25zdCBjYWNoZSA9IG1heFNpemUgPD0gMSA/IGNyZWF0ZVNpbmdsZXRvbkNhY2hlKGNvbXBhcmF0b3IpIDogY3JlYXRlTHJ1Q2FjaGUobWF4U2l6ZSwgY29tcGFyYXRvcik7XG4gIGZ1bmN0aW9uIG1lbW9pemVkKCkge1xuICAgIGxldCB2YWx1ZSA9IGNhY2hlLmdldChhcmd1bWVudHMpO1xuICAgIGlmICh2YWx1ZSA9PT0gTk9UX0ZPVU5EKSB7XG4gICAgICB2YWx1ZSA9IGZ1bmMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgIHJlc3VsdHNDb3VudCsrO1xuICAgICAgaWYgKHJlc3VsdEVxdWFsaXR5Q2hlY2spIHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGNhY2hlLmdldEVudHJpZXMoKTtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdFbnRyeSA9IGVudHJpZXMuZmluZChcbiAgICAgICAgICAoZW50cnkpID0+IHJlc3VsdEVxdWFsaXR5Q2hlY2soZW50cnkudmFsdWUsIHZhbHVlKVxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2hpbmdFbnRyeSkge1xuICAgICAgICAgIHZhbHVlID0gbWF0Y2hpbmdFbnRyeS52YWx1ZTtcbiAgICAgICAgICByZXN1bHRzQ291bnQgIT09IDAgJiYgcmVzdWx0c0NvdW50LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhY2hlLnB1dChhcmd1bWVudHMsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIG1lbW9pemVkLmNsZWFyQ2FjaGUgPSAoKSA9PiB7XG4gICAgY2FjaGUuY2xlYXIoKTtcbiAgICBtZW1vaXplZC5yZXNldFJlc3VsdHNDb3VudCgpO1xuICB9O1xuICBtZW1vaXplZC5yZXN1bHRzQ291bnQgPSAoKSA9PiByZXN1bHRzQ291bnQ7XG4gIG1lbW9pemVkLnJlc2V0UmVzdWx0c0NvdW50ID0gKCkgPT4ge1xuICAgIHJlc3VsdHNDb3VudCA9IDA7XG4gIH07XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gc3JjL2F1dG90cmFja01lbW9pemUvYXV0b3RyYWNrTWVtb2l6ZS50c1xuZnVuY3Rpb24gYXV0b3RyYWNrTWVtb2l6ZShmdW5jKSB7XG4gIGNvbnN0IG5vZGUgPSBjcmVhdGVOb2RlKFxuICAgIFtdXG4gICk7XG4gIGxldCBsYXN0QXJncyA9IG51bGw7XG4gIGNvbnN0IHNoYWxsb3dFcXVhbCA9IGNyZWF0ZUNhY2hlS2V5Q29tcGFyYXRvcihyZWZlcmVuY2VFcXVhbGl0eUNoZWNrKTtcbiAgY29uc3QgY2FjaGUgPSBjcmVhdGVDYWNoZSgoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gZnVuYy5hcHBseShudWxsLCBub2RlLnByb3h5KTtcbiAgICByZXR1cm4gcmVzO1xuICB9KTtcbiAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7XG4gICAgaWYgKCFzaGFsbG93RXF1YWwobGFzdEFyZ3MsIGFyZ3VtZW50cykpIHtcbiAgICAgIHVwZGF0ZU5vZGUobm9kZSwgYXJndW1lbnRzKTtcbiAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGUudmFsdWU7XG4gIH1cbiAgbWVtb2l6ZWQuY2xlYXJDYWNoZSA9ICgpID0+IHtcbiAgICByZXR1cm4gY2FjaGUuY2xlYXIoKTtcbiAgfTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBzcmMvd2Vha01hcE1lbW9pemUudHNcbnZhciBTdHJvbmdSZWYgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIGRlcmVmKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG59O1xudmFyIFJlZiA9IHR5cGVvZiBXZWFrUmVmICE9PSBcInVuZGVmaW5lZFwiID8gV2Vha1JlZiA6IFN0cm9uZ1JlZjtcbnZhciBVTlRFUk1JTkFURUQgPSAwO1xudmFyIFRFUk1JTkFURUQgPSAxO1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGVOb2RlKCkge1xuICByZXR1cm4ge1xuICAgIHM6IFVOVEVSTUlOQVRFRCxcbiAgICB2OiB2b2lkIDAsXG4gICAgbzogbnVsbCxcbiAgICBwOiBudWxsXG4gIH07XG59XG5mdW5jdGlvbiB3ZWFrTWFwTWVtb2l6ZShmdW5jLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGZuTm9kZSA9IGNyZWF0ZUNhY2hlTm9kZSgpO1xuICBjb25zdCB7IHJlc3VsdEVxdWFsaXR5Q2hlY2sgfSA9IG9wdGlvbnM7XG4gIGxldCBsYXN0UmVzdWx0O1xuICBsZXQgcmVzdWx0c0NvdW50ID0gMDtcbiAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7XG4gICAgbGV0IGNhY2hlTm9kZSA9IGZuTm9kZTtcbiAgICBjb25zdCB7IGxlbmd0aCB9ID0gYXJndW1lbnRzO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gbGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCBhcmcgPSBhcmd1bWVudHNbaV07XG4gICAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBhcmcgPT09IFwib2JqZWN0XCIgJiYgYXJnICE9PSBudWxsKSB7XG4gICAgICAgIGxldCBvYmplY3RDYWNoZSA9IGNhY2hlTm9kZS5vO1xuICAgICAgICBpZiAob2JqZWN0Q2FjaGUgPT09IG51bGwpIHtcbiAgICAgICAgICBjYWNoZU5vZGUubyA9IG9iamVjdENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JqZWN0Tm9kZSA9IG9iamVjdENhY2hlLmdldChhcmcpO1xuICAgICAgICBpZiAob2JqZWN0Tm9kZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY2FjaGVOb2RlID0gY3JlYXRlQ2FjaGVOb2RlKCk7XG4gICAgICAgICAgb2JqZWN0Q2FjaGUuc2V0KGFyZywgY2FjaGVOb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWNoZU5vZGUgPSBvYmplY3ROb2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpbWl0aXZlQ2FjaGUgPSBjYWNoZU5vZGUucDtcbiAgICAgICAgaWYgKHByaW1pdGl2ZUNhY2hlID09PSBudWxsKSB7XG4gICAgICAgICAgY2FjaGVOb2RlLnAgPSBwcmltaXRpdmVDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTm9kZSA9IHByaW1pdGl2ZUNhY2hlLmdldChhcmcpO1xuICAgICAgICBpZiAocHJpbWl0aXZlTm9kZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY2FjaGVOb2RlID0gY3JlYXRlQ2FjaGVOb2RlKCk7XG4gICAgICAgICAgcHJpbWl0aXZlQ2FjaGUuc2V0KGFyZywgY2FjaGVOb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWNoZU5vZGUgPSBwcmltaXRpdmVOb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRlcm1pbmF0ZWROb2RlID0gY2FjaGVOb2RlO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKGNhY2hlTm9kZS5zID09PSBURVJNSU5BVEVEKSB7XG4gICAgICByZXN1bHQgPSBjYWNoZU5vZGUudjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgcmVzdWx0c0NvdW50Kys7XG4gICAgICBpZiAocmVzdWx0RXF1YWxpdHlDaGVjaykge1xuICAgICAgICBjb25zdCBsYXN0UmVzdWx0VmFsdWUgPSBsYXN0UmVzdWx0Py5kZXJlZj8uKCkgPz8gbGFzdFJlc3VsdDtcbiAgICAgICAgaWYgKGxhc3RSZXN1bHRWYWx1ZSAhPSBudWxsICYmIHJlc3VsdEVxdWFsaXR5Q2hlY2sobGFzdFJlc3VsdFZhbHVlLCByZXN1bHQpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gbGFzdFJlc3VsdFZhbHVlO1xuICAgICAgICAgIHJlc3VsdHNDb3VudCAhPT0gMCAmJiByZXN1bHRzQ291bnQtLTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZWVkc1dlYWtSZWYgPSB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIHJlc3VsdCAhPT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIGxhc3RSZXN1bHQgPSBuZWVkc1dlYWtSZWYgPyBuZXcgUmVmKHJlc3VsdCkgOiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRlcm1pbmF0ZWROb2RlLnMgPSBURVJNSU5BVEVEO1xuICAgIHRlcm1pbmF0ZWROb2RlLnYgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBtZW1vaXplZC5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIGZuTm9kZSA9IGNyZWF0ZUNhY2hlTm9kZSgpO1xuICAgIG1lbW9pemVkLnJlc2V0UmVzdWx0c0NvdW50KCk7XG4gIH07XG4gIG1lbW9pemVkLnJlc3VsdHNDb3VudCA9ICgpID0+IHJlc3VsdHNDb3VudDtcbiAgbWVtb2l6ZWQucmVzZXRSZXN1bHRzQ291bnQgPSAoKSA9PiB7XG4gICAgcmVzdWx0c0NvdW50ID0gMDtcbiAgfTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBzcmMvY3JlYXRlU2VsZWN0b3JDcmVhdG9yLnRzXG5mdW5jdGlvbiBjcmVhdGVTZWxlY3RvckNyZWF0b3IobWVtb2l6ZU9yT3B0aW9ucywgLi4ubWVtb2l6ZU9wdGlvbnNGcm9tQXJncykge1xuICBjb25zdCBjcmVhdGVTZWxlY3RvckNyZWF0b3JPcHRpb25zID0gdHlwZW9mIG1lbW9pemVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIiA/IHtcbiAgICBtZW1vaXplOiBtZW1vaXplT3JPcHRpb25zLFxuICAgIG1lbW9pemVPcHRpb25zOiBtZW1vaXplT3B0aW9uc0Zyb21BcmdzXG4gIH0gOiBtZW1vaXplT3JPcHRpb25zO1xuICBjb25zdCBjcmVhdGVTZWxlY3RvcjIgPSAoLi4uY3JlYXRlU2VsZWN0b3JBcmdzKSA9PiB7XG4gICAgbGV0IHJlY29tcHV0YXRpb25zID0gMDtcbiAgICBsZXQgZGVwZW5kZW5jeVJlY29tcHV0YXRpb25zID0gMDtcbiAgICBsZXQgbGFzdFJlc3VsdDtcbiAgICBsZXQgZGlyZWN0bHlQYXNzZWRPcHRpb25zID0ge307XG4gICAgbGV0IHJlc3VsdEZ1bmMgPSBjcmVhdGVTZWxlY3RvckFyZ3MucG9wKCk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHRGdW5jID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBkaXJlY3RseVBhc3NlZE9wdGlvbnMgPSByZXN1bHRGdW5jO1xuICAgICAgcmVzdWx0RnVuYyA9IGNyZWF0ZVNlbGVjdG9yQXJncy5wb3AoKTtcbiAgICB9XG4gICAgYXNzZXJ0SXNGdW5jdGlvbihcbiAgICAgIHJlc3VsdEZ1bmMsXG4gICAgICBgY3JlYXRlU2VsZWN0b3IgZXhwZWN0cyBhbiBvdXRwdXQgZnVuY3Rpb24gYWZ0ZXIgdGhlIGlucHV0cywgYnV0IHJlY2VpdmVkOiBbJHt0eXBlb2YgcmVzdWx0RnVuY31dYFxuICAgICk7XG4gICAgY29uc3QgY29tYmluZWRPcHRpb25zID0ge1xuICAgICAgLi4uY3JlYXRlU2VsZWN0b3JDcmVhdG9yT3B0aW9ucyxcbiAgICAgIC4uLmRpcmVjdGx5UGFzc2VkT3B0aW9uc1xuICAgIH07XG4gICAgY29uc3Qge1xuICAgICAgbWVtb2l6ZSxcbiAgICAgIG1lbW9pemVPcHRpb25zID0gW10sXG4gICAgICBhcmdzTWVtb2l6ZSA9IHdlYWtNYXBNZW1vaXplLFxuICAgICAgYXJnc01lbW9pemVPcHRpb25zID0gW10sXG4gICAgICBkZXZNb2RlQ2hlY2tzID0ge31cbiAgICB9ID0gY29tYmluZWRPcHRpb25zO1xuICAgIGNvbnN0IGZpbmFsTWVtb2l6ZU9wdGlvbnMgPSBlbnN1cmVJc0FycmF5KG1lbW9pemVPcHRpb25zKTtcbiAgICBjb25zdCBmaW5hbEFyZ3NNZW1vaXplT3B0aW9ucyA9IGVuc3VyZUlzQXJyYXkoYXJnc01lbW9pemVPcHRpb25zKTtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBnZXREZXBlbmRlbmNpZXMoY3JlYXRlU2VsZWN0b3JBcmdzKTtcbiAgICBjb25zdCBtZW1vaXplZFJlc3VsdEZ1bmMgPSBtZW1vaXplKGZ1bmN0aW9uIHJlY29tcHV0YXRpb25XcmFwcGVyKCkge1xuICAgICAgcmVjb21wdXRhdGlvbnMrKztcbiAgICAgIHJldHVybiByZXN1bHRGdW5jLmFwcGx5KFxuICAgICAgICBudWxsLFxuICAgICAgICBhcmd1bWVudHNcbiAgICAgICk7XG4gICAgfSwgLi4uZmluYWxNZW1vaXplT3B0aW9ucyk7XG4gICAgbGV0IGZpcnN0UnVuID0gdHJ1ZTtcbiAgICBjb25zdCBzZWxlY3RvciA9IGFyZ3NNZW1vaXplKGZ1bmN0aW9uIGRlcGVuZGVuY2llc0NoZWNrZXIoKSB7XG4gICAgICBkZXBlbmRlbmN5UmVjb21wdXRhdGlvbnMrKztcbiAgICAgIGNvbnN0IGlucHV0U2VsZWN0b3JSZXN1bHRzID0gY29sbGVjdElucHV0U2VsZWN0b3JSZXN1bHRzKFxuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIGFyZ3VtZW50c1xuICAgICAgKTtcbiAgICAgIGxhc3RSZXN1bHQgPSBtZW1vaXplZFJlc3VsdEZ1bmMuYXBwbHkobnVsbCwgaW5wdXRTZWxlY3RvclJlc3VsdHMpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBjb25zdCB7IGlkZW50aXR5RnVuY3Rpb25DaGVjaywgaW5wdXRTdGFiaWxpdHlDaGVjayB9ID0gZ2V0RGV2TW9kZUNoZWNrc0V4ZWN1dGlvbkluZm8oZmlyc3RSdW4sIGRldk1vZGVDaGVja3MpO1xuICAgICAgICBpZiAoaWRlbnRpdHlGdW5jdGlvbkNoZWNrLnNob3VsZFJ1bikge1xuICAgICAgICAgIGlkZW50aXR5RnVuY3Rpb25DaGVjay5ydW4oXG4gICAgICAgICAgICByZXN1bHRGdW5jLFxuICAgICAgICAgICAgaW5wdXRTZWxlY3RvclJlc3VsdHMsXG4gICAgICAgICAgICBsYXN0UmVzdWx0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXRTdGFiaWxpdHlDaGVjay5zaG91bGRSdW4pIHtcbiAgICAgICAgICBjb25zdCBpbnB1dFNlbGVjdG9yUmVzdWx0c0NvcHkgPSBjb2xsZWN0SW5wdXRTZWxlY3RvclJlc3VsdHMoXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICBhcmd1bWVudHNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlucHV0U3RhYmlsaXR5Q2hlY2sucnVuKFxuICAgICAgICAgICAgeyBpbnB1dFNlbGVjdG9yUmVzdWx0cywgaW5wdXRTZWxlY3RvclJlc3VsdHNDb3B5IH0sXG4gICAgICAgICAgICB7IG1lbW9pemUsIG1lbW9pemVPcHRpb25zOiBmaW5hbE1lbW9pemVPcHRpb25zIH0sXG4gICAgICAgICAgICBhcmd1bWVudHNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaXJzdFJ1bilcbiAgICAgICAgICBmaXJzdFJ1biA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gICAgfSwgLi4uZmluYWxBcmdzTWVtb2l6ZU9wdGlvbnMpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHNlbGVjdG9yLCB7XG4gICAgICByZXN1bHRGdW5jLFxuICAgICAgbWVtb2l6ZWRSZXN1bHRGdW5jLFxuICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgZGVwZW5kZW5jeVJlY29tcHV0YXRpb25zOiAoKSA9PiBkZXBlbmRlbmN5UmVjb21wdXRhdGlvbnMsXG4gICAgICByZXNldERlcGVuZGVuY3lSZWNvbXB1dGF0aW9uczogKCkgPT4ge1xuICAgICAgICBkZXBlbmRlbmN5UmVjb21wdXRhdGlvbnMgPSAwO1xuICAgICAgfSxcbiAgICAgIGxhc3RSZXN1bHQ6ICgpID0+IGxhc3RSZXN1bHQsXG4gICAgICByZWNvbXB1dGF0aW9uczogKCkgPT4gcmVjb21wdXRhdGlvbnMsXG4gICAgICByZXNldFJlY29tcHV0YXRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJlY29tcHV0YXRpb25zID0gMDtcbiAgICAgIH0sXG4gICAgICBtZW1vaXplLFxuICAgICAgYXJnc01lbW9pemVcbiAgICB9KTtcbiAgfTtcbiAgT2JqZWN0LmFzc2lnbihjcmVhdGVTZWxlY3RvcjIsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZVNlbGVjdG9yMlxuICB9KTtcbiAgcmV0dXJuIGNyZWF0ZVNlbGVjdG9yMjtcbn1cbnZhciBjcmVhdGVTZWxlY3RvciA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVTZWxlY3RvckNyZWF0b3Iod2Vha01hcE1lbW9pemUpO1xuXG4vLyBzcmMvY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yLnRzXG52YXIgY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yID0gT2JqZWN0LmFzc2lnbihcbiAgKGlucHV0U2VsZWN0b3JzT2JqZWN0LCBzZWxlY3RvckNyZWF0b3IgPSBjcmVhdGVTZWxlY3RvcikgPT4ge1xuICAgIGFzc2VydElzT2JqZWN0KFxuICAgICAgaW5wdXRTZWxlY3RvcnNPYmplY3QsXG4gICAgICBgY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yIGV4cGVjdHMgZmlyc3QgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IHdoZXJlIGVhY2ggcHJvcGVydHkgaXMgYSBzZWxlY3RvciwgaW5zdGVhZCByZWNlaXZlZCBhICR7dHlwZW9mIGlucHV0U2VsZWN0b3JzT2JqZWN0fWBcbiAgICApO1xuICAgIGNvbnN0IGlucHV0U2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRTZWxlY3RvcnNPYmplY3QpO1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGlucHV0U2VsZWN0b3JLZXlzLm1hcChcbiAgICAgIChrZXkpID0+IGlucHV0U2VsZWN0b3JzT2JqZWN0W2tleV1cbiAgICApO1xuICAgIGNvbnN0IHN0cnVjdHVyZWRTZWxlY3RvciA9IHNlbGVjdG9yQ3JlYXRvcihcbiAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICguLi5pbnB1dFNlbGVjdG9yUmVzdWx0cykgPT4ge1xuICAgICAgICByZXR1cm4gaW5wdXRTZWxlY3RvclJlc3VsdHMucmVkdWNlKChjb21wb3NpdGlvbiwgdmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29tcG9zaXRpb25baW5wdXRTZWxlY3RvcktleXNbaW5kZXhdXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiBjb21wb3NpdGlvbjtcbiAgICAgICAgfSwge30pO1xuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRTZWxlY3RvcjtcbiAgfSxcbiAgeyB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZVN0cnVjdHVyZWRTZWxlY3RvciB9XG4pO1xuZXhwb3J0IHtcbiAgY3JlYXRlU2VsZWN0b3IsXG4gIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcixcbiAgY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yLFxuICBscnVNZW1vaXplLFxuICByZWZlcmVuY2VFcXVhbGl0eUNoZWNrLFxuICBzZXRHbG9iYWxEZXZNb2RlQ2hlY2tzLFxuICBhdXRvdHJhY2tNZW1vaXplIGFzIHVuc3RhYmxlX2F1dG90cmFja01lbW9pemUsXG4gIHdlYWtNYXBNZW1vaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVzZWxlY3QubWpzLm1hcCIsIi8qIVxuICogU2lnbmF0dXJlIFBhZCB2Mi4zLjJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvc2lnbmF0dXJlX3BhZFxuICpcbiAqIENvcHlyaWdodCAyMDE3IFN6eW1vbiBOb3dha1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKlxuICogVGhlIG1haW4gaWRlYSBhbmQgc29tZSBwYXJ0cyBvZiB0aGUgY29kZSAoZS5nLiBkcmF3aW5nIHZhcmlhYmxlIHdpZHRoIELDqXppZXIgY3VydmUpIGFyZSB0YWtlbiBmcm9tOlxuICogaHR0cDovL2Nvcm5lci5zcXVhcmV1cC5jb20vMjAxMi8wNy9zbW9vdGhlci1zaWduYXR1cmVzLmh0bWxcbiAqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBpbnRlcnBvbGF0aW9uIHVzaW5nIGN1YmljIELDqXppZXIgY3VydmVzIGlzIHRha2VuIGZyb206XG4gKiBodHRwOi8vYmVua25vd3Njb2RlLndvcmRwcmVzcy5jb20vMjAxMi8wOS8xNC9wYXRoLWludGVycG9sYXRpb24tdXNpbmctY3ViaWMtYmV6aWVyLWFuZC1jb250cm9sLXBvaW50LWVzdGltYXRpb24taW4tamF2YXNjcmlwdFxuICpcbiAqIEFsZ29yaXRobSBmb3IgYXBwcm94aW1hdGVkIGxlbmd0aCBvZiBhIELDqXppZXIgY3VydmUgaXMgdGFrZW4gZnJvbTpcbiAqIGh0dHA6Ly93d3cubGVtb2RhLm5ldC9tYXRocy9iZXppZXItbGVuZ3RoL2luZGV4Lmh0bWxcbiAqXG4gKi9cblxuZnVuY3Rpb24gUG9pbnQoeCwgeSwgdGltZSkge1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xuICB0aGlzLnRpbWUgPSB0aW1lIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xufVxuXG5Qb2ludC5wcm90b3R5cGUudmVsb2NpdHlGcm9tID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gIHJldHVybiB0aGlzLnRpbWUgIT09IHN0YXJ0LnRpbWUgPyB0aGlzLmRpc3RhbmNlVG8oc3RhcnQpIC8gKHRoaXMudGltZSAtIHN0YXJ0LnRpbWUpIDogMTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kaXN0YW5jZVRvID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codGhpcy54IC0gc3RhcnQueCwgMikgKyBNYXRoLnBvdyh0aGlzLnkgLSBzdGFydC55LCAyKSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLnggPT09IG90aGVyLnggJiYgdGhpcy55ID09PSBvdGhlci55ICYmIHRoaXMudGltZSA9PT0gb3RoZXIudGltZTtcbn07XG5cbmZ1bmN0aW9uIEJlemllcihzdGFydFBvaW50LCBjb250cm9sMSwgY29udHJvbDIsIGVuZFBvaW50KSB7XG4gIHRoaXMuc3RhcnRQb2ludCA9IHN0YXJ0UG9pbnQ7XG4gIHRoaXMuY29udHJvbDEgPSBjb250cm9sMTtcbiAgdGhpcy5jb250cm9sMiA9IGNvbnRyb2wyO1xuICB0aGlzLmVuZFBvaW50ID0gZW5kUG9pbnQ7XG59XG5cbi8vIFJldHVybnMgYXBwcm94aW1hdGVkIGxlbmd0aC5cbkJlemllci5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RlcHMgPSAxMDtcbiAgdmFyIGxlbmd0aCA9IDA7XG4gIHZhciBweCA9IHZvaWQgMDtcbiAgdmFyIHB5ID0gdm9pZCAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDw9IHN0ZXBzOyBpICs9IDEpIHtcbiAgICB2YXIgdCA9IGkgLyBzdGVwcztcbiAgICB2YXIgY3ggPSB0aGlzLl9wb2ludCh0LCB0aGlzLnN0YXJ0UG9pbnQueCwgdGhpcy5jb250cm9sMS54LCB0aGlzLmNvbnRyb2wyLngsIHRoaXMuZW5kUG9pbnQueCk7XG4gICAgdmFyIGN5ID0gdGhpcy5fcG9pbnQodCwgdGhpcy5zdGFydFBvaW50LnksIHRoaXMuY29udHJvbDEueSwgdGhpcy5jb250cm9sMi55LCB0aGlzLmVuZFBvaW50LnkpO1xuICAgIGlmIChpID4gMCkge1xuICAgICAgdmFyIHhkaWZmID0gY3ggLSBweDtcbiAgICAgIHZhciB5ZGlmZiA9IGN5IC0gcHk7XG4gICAgICBsZW5ndGggKz0gTWF0aC5zcXJ0KHhkaWZmICogeGRpZmYgKyB5ZGlmZiAqIHlkaWZmKTtcbiAgICB9XG4gICAgcHggPSBjeDtcbiAgICBweSA9IGN5O1xuICB9XG5cbiAgcmV0dXJuIGxlbmd0aDtcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLW11bHRpLXNwYWNlcywgc3BhY2UtaW4tcGFyZW5zICovXG5CZXppZXIucHJvdG90eXBlLl9wb2ludCA9IGZ1bmN0aW9uICh0LCBzdGFydCwgYzEsIGMyLCBlbmQpIHtcbiAgcmV0dXJuIHN0YXJ0ICogKDEuMCAtIHQpICogKDEuMCAtIHQpICogKDEuMCAtIHQpICsgMy4wICogYzEgKiAoMS4wIC0gdCkgKiAoMS4wIC0gdCkgKiB0ICsgMy4wICogYzIgKiAoMS4wIC0gdCkgKiB0ICogdCArIGVuZCAqIHQgKiB0ICogdDtcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI3MDc4NDAxLzgxNTUwN1xuZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgY29udGV4dCwgYXJncywgcmVzdWx0O1xuICB2YXIgdGltZW91dCA9IG51bGw7XG4gIHZhciBwcmV2aW91cyA9IDA7XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICB2YXIgbGF0ZXIgPSBmdW5jdGlvbiBsYXRlcigpIHtcbiAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogRGF0ZS5ub3coKTtcbiAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICB9O1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAobm93IC0gcHJldmlvdXMpO1xuICAgIGNvbnRleHQgPSB0aGlzO1xuICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgaWYgKHJlbWFpbmluZyA8PSAwIHx8IHJlbWFpbmluZyA+IHdhaXQpIHtcbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICBpZiAoIXRpbWVvdXQpIGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKCF0aW1lb3V0ICYmIG9wdGlvbnMudHJhaWxpbmcgIT09IGZhbHNlKSB7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gU2lnbmF0dXJlUGFkKGNhbnZhcywgb3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0ID0gb3B0cy52ZWxvY2l0eUZpbHRlcldlaWdodCB8fCAwLjc7XG4gIHRoaXMubWluV2lkdGggPSBvcHRzLm1pbldpZHRoIHx8IDAuNTtcbiAgdGhpcy5tYXhXaWR0aCA9IG9wdHMubWF4V2lkdGggfHwgMi41O1xuICB0aGlzLnRocm90dGxlID0gJ3Rocm90dGxlJyBpbiBvcHRzID8gb3B0cy50aHJvdHRsZSA6IDE2OyAvLyBpbiBtaWxpc2Vjb25kc1xuICB0aGlzLm1pbkRpc3RhbmNlID0gJ21pbkRpc3RhbmNlJyBpbiBvcHRzID8gb3B0cy5taW5EaXN0YW5jZSA6IDU7XG5cbiAgaWYgKHRoaXMudGhyb3R0bGUpIHtcbiAgICB0aGlzLl9zdHJva2VNb3ZlVXBkYXRlID0gdGhyb3R0bGUoU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlLCB0aGlzLnRocm90dGxlKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9zdHJva2VNb3ZlVXBkYXRlID0gU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlO1xuICB9XG5cbiAgdGhpcy5kb3RTaXplID0gb3B0cy5kb3RTaXplIHx8IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKHRoaXMubWluV2lkdGggKyB0aGlzLm1heFdpZHRoKSAvIDI7XG4gIH07XG4gIHRoaXMucGVuQ29sb3IgPSBvcHRzLnBlbkNvbG9yIHx8ICdibGFjayc7XG4gIHRoaXMuYmFja2dyb3VuZENvbG9yID0gb3B0cy5iYWNrZ3JvdW5kQ29sb3IgfHwgJ3JnYmEoMCwwLDAsMCknO1xuICB0aGlzLm9uQmVnaW4gPSBvcHRzLm9uQmVnaW47XG4gIHRoaXMub25FbmQgPSBvcHRzLm9uRW5kO1xuXG4gIHRoaXMuX2NhbnZhcyA9IGNhbnZhcztcbiAgdGhpcy5fY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIHRoaXMuY2xlYXIoKTtcblxuICAvLyBXZSBuZWVkIGFkZCB0aGVzZSBpbmxpbmUgc28gdGhleSBhcmUgYXZhaWxhYmxlIHRvIHVuYmluZCB3aGlsZSBzdGlsbCBoYXZpbmdcbiAgLy8gYWNjZXNzIHRvICdzZWxmJyB3ZSBjb3VsZCB1c2UgXy5iaW5kIGJ1dCBpdCdzIG5vdCB3b3J0aCBhZGRpbmcgYSBkZXBlbmRlbmN5LlxuICB0aGlzLl9oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDEpIHtcbiAgICAgIHNlbGYuX21vdXNlQnV0dG9uRG93biA9IHRydWU7XG4gICAgICBzZWxmLl9zdHJva2VCZWdpbihldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuX2hhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChzZWxmLl9tb3VzZUJ1dHRvbkRvd24pIHtcbiAgICAgIHNlbGYuX3N0cm9rZU1vdmVVcGRhdGUoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLl9oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LndoaWNoID09PSAxICYmIHNlbGYuX21vdXNlQnV0dG9uRG93bikge1xuICAgICAgc2VsZi5fbW91c2VCdXR0b25Eb3duID0gZmFsc2U7XG4gICAgICBzZWxmLl9zdHJva2VFbmQoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICAgIHNlbGYuX3N0cm9rZUJlZ2luKHRvdWNoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gUHJldmVudCBzY3JvbGxpbmcuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHZhciB0b3VjaCA9IGV2ZW50LnRhcmdldFRvdWNoZXNbMF07XG4gICAgc2VsZi5fc3Ryb2tlTW92ZVVwZGF0ZSh0b3VjaCk7XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlVG91Y2hFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgd2FzQ2FudmFzVG91Y2hlZCA9IGV2ZW50LnRhcmdldCA9PT0gc2VsZi5fY2FudmFzO1xuICAgIGlmICh3YXNDYW52YXNUb3VjaGVkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2VsZi5fc3Ryb2tlRW5kKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRW5hYmxlIG1vdXNlIGFuZCB0b3VjaCBldmVudCBoYW5kbGVyc1xuICB0aGlzLm9uKCk7XG59XG5cbi8vIFB1YmxpYyBtZXRob2RzXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuICB2YXIgY2FudmFzID0gdGhpcy5fY2FudmFzO1xuXG4gIGN0eC5maWxsU3R5bGUgPSB0aGlzLmJhY2tncm91bmRDb2xvcjtcbiAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICB0aGlzLl9kYXRhID0gW107XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuX2lzRW1wdHkgPSB0cnVlO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5mcm9tRGF0YVVSTCA9IGZ1bmN0aW9uIChkYXRhVXJsKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICB2YXIgcmF0aW8gPSBvcHRpb25zLnJhdGlvIHx8IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgdGhpcy5fY2FudmFzLndpZHRoIC8gcmF0aW87XG4gIHZhciBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCB8fCB0aGlzLl9jYW52YXMuaGVpZ2h0IC8gcmF0aW87XG5cbiAgdGhpcy5fcmVzZXQoKTtcbiAgaW1hZ2Uuc3JjID0gZGF0YVVybDtcbiAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLl9jdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgfTtcbiAgdGhpcy5faXNFbXB0eSA9IGZhbHNlO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS50b0RhdGFVUkwgPSBmdW5jdGlvbiAodHlwZSkge1xuICB2YXIgX2NhbnZhcztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdpbWFnZS9zdmcreG1sJzpcbiAgICAgIHJldHVybiB0aGlzLl90b1NWRygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgb3B0aW9ucyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgb3B0aW9uc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoX2NhbnZhcyA9IHRoaXMuX2NhbnZhcykudG9EYXRhVVJMLmFwcGx5KF9jYW52YXMsIFt0eXBlXS5jb25jYXQob3B0aW9ucykpO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9oYW5kbGVNb3VzZUV2ZW50cygpO1xuICB0aGlzLl9oYW5kbGVUb3VjaEV2ZW50cygpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9oYW5kbGVNb3VzZURvd24pO1xuICB0aGlzLl9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlTW91c2VNb3ZlKTtcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2hhbmRsZU1vdXNlVXApO1xuXG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5faGFuZGxlVG91Y2hTdGFydCk7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVUb3VjaE1vdmUpO1xuICB0aGlzLl9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9oYW5kbGVUb3VjaEVuZCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9pc0VtcHR5O1xufTtcblxuLy8gUHJpdmF0ZSBtZXRob2RzXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VCZWdpbiA9IGZ1bmN0aW9uIChldmVudCkge1xuICB0aGlzLl9kYXRhLnB1c2goW10pO1xuICB0aGlzLl9yZXNldCgpO1xuICB0aGlzLl9zdHJva2VVcGRhdGUoZXZlbnQpO1xuXG4gIGlmICh0eXBlb2YgdGhpcy5vbkJlZ2luID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5vbkJlZ2luKGV2ZW50KTtcbiAgfVxufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHZhciB4ID0gZXZlbnQuY2xpZW50WDtcbiAgdmFyIHkgPSBldmVudC5jbGllbnRZO1xuXG4gIHZhciBwb2ludCA9IHRoaXMuX2NyZWF0ZVBvaW50KHgsIHkpO1xuICB2YXIgbGFzdFBvaW50R3JvdXAgPSB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV07XG4gIHZhciBsYXN0UG9pbnQgPSBsYXN0UG9pbnRHcm91cCAmJiBsYXN0UG9pbnRHcm91cFtsYXN0UG9pbnRHcm91cC5sZW5ndGggLSAxXTtcbiAgdmFyIGlzTGFzdFBvaW50VG9vQ2xvc2UgPSBsYXN0UG9pbnQgJiYgcG9pbnQuZGlzdGFuY2VUbyhsYXN0UG9pbnQpIDwgdGhpcy5taW5EaXN0YW5jZTtcblxuICAvLyBTa2lwIHRoaXMgcG9pbnQgaWYgaXQncyB0b28gY2xvc2UgdG8gdGhlIHByZXZpb3VzIG9uZVxuICBpZiAoIShsYXN0UG9pbnQgJiYgaXNMYXN0UG9pbnRUb29DbG9zZSkpIHtcbiAgICB2YXIgX2FkZFBvaW50ID0gdGhpcy5fYWRkUG9pbnQocG9pbnQpLFxuICAgICAgICBjdXJ2ZSA9IF9hZGRQb2ludC5jdXJ2ZSxcbiAgICAgICAgd2lkdGhzID0gX2FkZFBvaW50LndpZHRocztcblxuICAgIGlmIChjdXJ2ZSAmJiB3aWR0aHMpIHtcbiAgICAgIHRoaXMuX2RyYXdDdXJ2ZShjdXJ2ZSwgd2lkdGhzLnN0YXJ0LCB3aWR0aHMuZW5kKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV0ucHVzaCh7XG4gICAgICB4OiBwb2ludC54LFxuICAgICAgeTogcG9pbnQueSxcbiAgICAgIHRpbWU6IHBvaW50LnRpbWUsXG4gICAgICBjb2xvcjogdGhpcy5wZW5Db2xvclxuICAgIH0pO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIGNhbkRyYXdDdXJ2ZSA9IHRoaXMucG9pbnRzLmxlbmd0aCA+IDI7XG4gIHZhciBwb2ludCA9IHRoaXMucG9pbnRzWzBdOyAvLyBQb2ludCBpbnN0YW5jZVxuXG4gIGlmICghY2FuRHJhd0N1cnZlICYmIHBvaW50KSB7XG4gICAgdGhpcy5fZHJhd0RvdChwb2ludCk7XG4gIH1cblxuICBpZiAocG9pbnQpIHtcbiAgICB2YXIgbGFzdFBvaW50R3JvdXAgPSB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV07XG4gICAgdmFyIGxhc3RQb2ludCA9IGxhc3RQb2ludEdyb3VwW2xhc3RQb2ludEdyb3VwLmxlbmd0aCAtIDFdOyAvLyBwbGFpbiBvYmplY3RcblxuICAgIC8vIFdoZW4gZHJhd2luZyBhIGRvdCwgdGhlcmUncyBvbmx5IG9uZSBwb2ludCBpbiBhIGdyb3VwLCBzbyB3aXRob3V0IHRoaXMgY2hlY2tcbiAgICAvLyBzdWNoIGdyb3VwIHdvdWxkIGVuZCB1cCB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgMiBwb2ludHMuXG4gICAgaWYgKCFwb2ludC5lcXVhbHMobGFzdFBvaW50KSkge1xuICAgICAgbGFzdFBvaW50R3JvdXAucHVzaCh7XG4gICAgICAgIHg6IHBvaW50LngsXG4gICAgICAgIHk6IHBvaW50LnksXG4gICAgICAgIHRpbWU6IHBvaW50LnRpbWUsXG4gICAgICAgIGNvbG9yOiB0aGlzLnBlbkNvbG9yXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHRoaXMub25FbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLm9uRW5kKGV2ZW50KTtcbiAgfVxufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5faGFuZGxlTW91c2VFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX21vdXNlQnV0dG9uRG93biA9IGZhbHNlO1xuXG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9oYW5kbGVNb3VzZURvd24pO1xuICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlTW91c2VNb3ZlKTtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2hhbmRsZU1vdXNlVXApO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5faGFuZGxlVG91Y2hFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFBhc3MgdG91Y2ggZXZlbnRzIHRvIGNhbnZhcyBlbGVtZW50IG9uIG1vYmlsZSBJRTExIGFuZCBFZGdlLlxuICB0aGlzLl9jYW52YXMuc3R5bGUubXNUb3VjaEFjdGlvbiA9ICdub25lJztcbiAgdGhpcy5fY2FudmFzLnN0eWxlLnRvdWNoQWN0aW9uID0gJ25vbmUnO1xuXG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5faGFuZGxlVG91Y2hTdGFydCk7XG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVUb3VjaE1vdmUpO1xuICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9oYW5kbGVUb3VjaEVuZCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5wb2ludHMgPSBbXTtcbiAgdGhpcy5fbGFzdFZlbG9jaXR5ID0gMDtcbiAgdGhpcy5fbGFzdFdpZHRoID0gKHRoaXMubWluV2lkdGggKyB0aGlzLm1heFdpZHRoKSAvIDI7XG4gIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLnBlbkNvbG9yO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fY3JlYXRlUG9pbnQgPSBmdW5jdGlvbiAoeCwgeSwgdGltZSkge1xuICB2YXIgcmVjdCA9IHRoaXMuX2NhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICByZXR1cm4gbmV3IFBvaW50KHggLSByZWN0LmxlZnQsIHkgLSByZWN0LnRvcCwgdGltZSB8fCBuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9hZGRQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuICB2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG4gIHZhciB0bXAgPSB2b2lkIDA7XG5cbiAgcG9pbnRzLnB1c2gocG9pbnQpO1xuXG4gIGlmIChwb2ludHMubGVuZ3RoID4gMikge1xuICAgIC8vIFRvIHJlZHVjZSB0aGUgaW5pdGlhbCBsYWcgbWFrZSBpdCB3b3JrIHdpdGggMyBwb2ludHNcbiAgICAvLyBieSBjb3B5aW5nIHRoZSBmaXJzdCBwb2ludCB0byB0aGUgYmVnaW5uaW5nLlxuICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAzKSBwb2ludHMudW5zaGlmdChwb2ludHNbMF0pO1xuXG4gICAgdG1wID0gdGhpcy5fY2FsY3VsYXRlQ3VydmVDb250cm9sUG9pbnRzKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0pO1xuICAgIHZhciBjMiA9IHRtcC5jMjtcbiAgICB0bXAgPSB0aGlzLl9jYWxjdWxhdGVDdXJ2ZUNvbnRyb2xQb2ludHMocG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7XG4gICAgdmFyIGMzID0gdG1wLmMxO1xuICAgIHZhciBjdXJ2ZSA9IG5ldyBCZXppZXIocG9pbnRzWzFdLCBjMiwgYzMsIHBvaW50c1syXSk7XG4gICAgdmFyIHdpZHRocyA9IHRoaXMuX2NhbGN1bGF0ZUN1cnZlV2lkdGhzKGN1cnZlKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBsaXN0LFxuICAgIC8vIHNvIHRoYXQgd2UgYWx3YXlzIGhhdmUgbm8gbW9yZSB0aGFuIDQgcG9pbnRzIGluIHBvaW50cyBhcnJheS5cbiAgICBwb2ludHMuc2hpZnQoKTtcblxuICAgIHJldHVybiB7IGN1cnZlOiBjdXJ2ZSwgd2lkdGhzOiB3aWR0aHMgfTtcbiAgfVxuXG4gIHJldHVybiB7fTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2NhbGN1bGF0ZUN1cnZlQ29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIChzMSwgczIsIHMzKSB7XG4gIHZhciBkeDEgPSBzMS54IC0gczIueDtcbiAgdmFyIGR5MSA9IHMxLnkgLSBzMi55O1xuICB2YXIgZHgyID0gczIueCAtIHMzLng7XG4gIHZhciBkeTIgPSBzMi55IC0gczMueTtcblxuICB2YXIgbTEgPSB7IHg6IChzMS54ICsgczIueCkgLyAyLjAsIHk6IChzMS55ICsgczIueSkgLyAyLjAgfTtcbiAgdmFyIG0yID0geyB4OiAoczIueCArIHMzLngpIC8gMi4wLCB5OiAoczIueSArIHMzLnkpIC8gMi4wIH07XG5cbiAgdmFyIGwxID0gTWF0aC5zcXJ0KGR4MSAqIGR4MSArIGR5MSAqIGR5MSk7XG4gIHZhciBsMiA9IE1hdGguc3FydChkeDIgKiBkeDIgKyBkeTIgKiBkeTIpO1xuXG4gIHZhciBkeG0gPSBtMS54IC0gbTIueDtcbiAgdmFyIGR5bSA9IG0xLnkgLSBtMi55O1xuXG4gIHZhciBrID0gbDIgLyAobDEgKyBsMik7XG4gIHZhciBjbSA9IHsgeDogbTIueCArIGR4bSAqIGssIHk6IG0yLnkgKyBkeW0gKiBrIH07XG5cbiAgdmFyIHR4ID0gczIueCAtIGNtLng7XG4gIHZhciB0eSA9IHMyLnkgLSBjbS55O1xuXG4gIHJldHVybiB7XG4gICAgYzE6IG5ldyBQb2ludChtMS54ICsgdHgsIG0xLnkgKyB0eSksXG4gICAgYzI6IG5ldyBQb2ludChtMi54ICsgdHgsIG0yLnkgKyB0eSlcbiAgfTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2NhbGN1bGF0ZUN1cnZlV2lkdGhzID0gZnVuY3Rpb24gKGN1cnZlKSB7XG4gIHZhciBzdGFydFBvaW50ID0gY3VydmUuc3RhcnRQb2ludDtcbiAgdmFyIGVuZFBvaW50ID0gY3VydmUuZW5kUG9pbnQ7XG4gIHZhciB3aWR0aHMgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcblxuICB2YXIgdmVsb2NpdHkgPSB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0ICogZW5kUG9pbnQudmVsb2NpdHlGcm9tKHN0YXJ0UG9pbnQpICsgKDEgLSB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0KSAqIHRoaXMuX2xhc3RWZWxvY2l0eTtcblxuICB2YXIgbmV3V2lkdGggPSB0aGlzLl9zdHJva2VXaWR0aCh2ZWxvY2l0eSk7XG5cbiAgd2lkdGhzLnN0YXJ0ID0gdGhpcy5fbGFzdFdpZHRoO1xuICB3aWR0aHMuZW5kID0gbmV3V2lkdGg7XG5cbiAgdGhpcy5fbGFzdFZlbG9jaXR5ID0gdmVsb2NpdHk7XG4gIHRoaXMuX2xhc3RXaWR0aCA9IG5ld1dpZHRoO1xuXG4gIHJldHVybiB3aWR0aHM7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VXaWR0aCA9IGZ1bmN0aW9uICh2ZWxvY2l0eSkge1xuICByZXR1cm4gTWF0aC5tYXgodGhpcy5tYXhXaWR0aCAvICh2ZWxvY2l0eSArIDEpLCB0aGlzLm1pbldpZHRoKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2RyYXdQb2ludCA9IGZ1bmN0aW9uICh4LCB5LCBzaXplKSB7XG4gIHZhciBjdHggPSB0aGlzLl9jdHg7XG5cbiAgY3R4Lm1vdmVUbyh4LCB5KTtcbiAgY3R4LmFyYyh4LCB5LCBzaXplLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICB0aGlzLl9pc0VtcHR5ID0gZmFsc2U7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9kcmF3Q3VydmUgPSBmdW5jdGlvbiAoY3VydmUsIHN0YXJ0V2lkdGgsIGVuZFdpZHRoKSB7XG4gIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gIHZhciB3aWR0aERlbHRhID0gZW5kV2lkdGggLSBzdGFydFdpZHRoO1xuICB2YXIgZHJhd1N0ZXBzID0gTWF0aC5mbG9vcihjdXJ2ZS5sZW5ndGgoKSk7XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZHJhd1N0ZXBzOyBpICs9IDEpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIEJlemllciAoeCwgeSkgY29vcmRpbmF0ZSBmb3IgdGhpcyBzdGVwLlxuICAgIHZhciB0ID0gaSAvIGRyYXdTdGVwcztcbiAgICB2YXIgdHQgPSB0ICogdDtcbiAgICB2YXIgdHR0ID0gdHQgKiB0O1xuICAgIHZhciB1ID0gMSAtIHQ7XG4gICAgdmFyIHV1ID0gdSAqIHU7XG4gICAgdmFyIHV1dSA9IHV1ICogdTtcblxuICAgIHZhciB4ID0gdXV1ICogY3VydmUuc3RhcnRQb2ludC54O1xuICAgIHggKz0gMyAqIHV1ICogdCAqIGN1cnZlLmNvbnRyb2wxLng7XG4gICAgeCArPSAzICogdSAqIHR0ICogY3VydmUuY29udHJvbDIueDtcbiAgICB4ICs9IHR0dCAqIGN1cnZlLmVuZFBvaW50Lng7XG5cbiAgICB2YXIgeSA9IHV1dSAqIGN1cnZlLnN0YXJ0UG9pbnQueTtcbiAgICB5ICs9IDMgKiB1dSAqIHQgKiBjdXJ2ZS5jb250cm9sMS55O1xuICAgIHkgKz0gMyAqIHUgKiB0dCAqIGN1cnZlLmNvbnRyb2wyLnk7XG4gICAgeSArPSB0dHQgKiBjdXJ2ZS5lbmRQb2ludC55O1xuXG4gICAgdmFyIHdpZHRoID0gc3RhcnRXaWR0aCArIHR0dCAqIHdpZHRoRGVsdGE7XG4gICAgdGhpcy5fZHJhd1BvaW50KHgsIHksIHdpZHRoKTtcbiAgfVxuXG4gIGN0eC5jbG9zZVBhdGgoKTtcbiAgY3R4LmZpbGwoKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2RyYXdEb3QgPSBmdW5jdGlvbiAocG9pbnQpIHtcbiAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcbiAgdmFyIHdpZHRoID0gdHlwZW9mIHRoaXMuZG90U2l6ZSA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuZG90U2l6ZSgpIDogdGhpcy5kb3RTaXplO1xuXG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgdGhpcy5fZHJhd1BvaW50KHBvaW50LngsIHBvaW50LnksIHdpZHRoKTtcbiAgY3R4LmNsb3NlUGF0aCgpO1xuICBjdHguZmlsbCgpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fZnJvbURhdGEgPSBmdW5jdGlvbiAocG9pbnRHcm91cHMsIGRyYXdDdXJ2ZSwgZHJhd0RvdCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50R3JvdXBzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGdyb3VwID0gcG9pbnRHcm91cHNbaV07XG5cbiAgICBpZiAoZ3JvdXAubGVuZ3RoID4gMSkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBncm91cC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICB2YXIgcmF3UG9pbnQgPSBncm91cFtqXTtcbiAgICAgICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KHJhd1BvaW50LngsIHJhd1BvaW50LnksIHJhd1BvaW50LnRpbWUpO1xuICAgICAgICB2YXIgY29sb3IgPSByYXdQb2ludC5jb2xvcjtcblxuICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgIC8vIEZpcnN0IHBvaW50IGluIGEgZ3JvdXAuIE5vdGhpbmcgdG8gZHJhdyB5ZXQuXG5cbiAgICAgICAgICAvLyBBbGwgcG9pbnRzIGluIHRoZSBncm91cCBoYXZlIHRoZSBzYW1lIGNvbG9yLCBzbyBpdCdzIGVub3VnaCB0byBzZXRcbiAgICAgICAgICAvLyBwZW5Db2xvciBqdXN0IGF0IHRoZSBiZWdpbm5pbmcuXG4gICAgICAgICAgdGhpcy5wZW5Db2xvciA9IGNvbG9yO1xuICAgICAgICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICAgICAgICB0aGlzLl9hZGRQb2ludChwb2ludCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaiAhPT0gZ3JvdXAubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIC8vIE1pZGRsZSBwb2ludCBpbiBhIGdyb3VwLlxuICAgICAgICAgIHZhciBfYWRkUG9pbnQyID0gdGhpcy5fYWRkUG9pbnQocG9pbnQpLFxuICAgICAgICAgICAgICBjdXJ2ZSA9IF9hZGRQb2ludDIuY3VydmUsXG4gICAgICAgICAgICAgIHdpZHRocyA9IF9hZGRQb2ludDIud2lkdGhzO1xuXG4gICAgICAgICAgaWYgKGN1cnZlICYmIHdpZHRocykge1xuICAgICAgICAgICAgZHJhd0N1cnZlKGN1cnZlLCB3aWR0aHMsIGNvbG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTGFzdCBwb2ludCBpbiBhIGdyb3VwLiBEbyBub3RoaW5nLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgICB2YXIgX3Jhd1BvaW50ID0gZ3JvdXBbMF07XG4gICAgICBkcmF3RG90KF9yYXdQb2ludCk7XG4gICAgfVxuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl90b1NWRyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgdmFyIHBvaW50R3JvdXBzID0gdGhpcy5fZGF0YTtcbiAgdmFyIGNhbnZhcyA9IHRoaXMuX2NhbnZhcztcbiAgdmFyIHJhdGlvID0gTWF0aC5tYXgod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSwgMSk7XG4gIHZhciBtaW5YID0gMDtcbiAgdmFyIG1pblkgPSAwO1xuICB2YXIgbWF4WCA9IGNhbnZhcy53aWR0aCAvIHJhdGlvO1xuICB2YXIgbWF4WSA9IGNhbnZhcy5oZWlnaHQgLyByYXRpbztcbiAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG5cbiAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICd3aWR0aCcsIGNhbnZhcy53aWR0aCk7XG4gIHN2Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaGVpZ2h0JywgY2FudmFzLmhlaWdodCk7XG5cbiAgdGhpcy5fZnJvbURhdGEocG9pbnRHcm91cHMsIGZ1bmN0aW9uIChjdXJ2ZSwgd2lkdGhzLCBjb2xvcikge1xuICAgIHZhciBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncGF0aCcpO1xuXG4gICAgLy8gTmVlZCB0byBjaGVjayBjdXJ2ZSBmb3IgTmFOIHZhbHVlcywgdGhlc2UgcG9wIHVwIHdoZW4gZHJhd2luZ1xuICAgIC8vIGxpbmVzIG9uIHRoZSBjYW52YXMgdGhhdCBhcmUgbm90IGNvbnRpbnVvdXMuIEUuZy4gU2hhcnAgY29ybmVyc1xuICAgIC8vIG9yIHN0b3BwaW5nIG1pZC1zdHJva2UgYW5kIHRoYW4gY29udGludWluZyB3aXRob3V0IGxpZnRpbmcgbW91c2UuXG4gICAgaWYgKCFpc05hTihjdXJ2ZS5jb250cm9sMS54KSAmJiAhaXNOYU4oY3VydmUuY29udHJvbDEueSkgJiYgIWlzTmFOKGN1cnZlLmNvbnRyb2wyLngpICYmICFpc05hTihjdXJ2ZS5jb250cm9sMi55KSkge1xuICAgICAgdmFyIGF0dHIgPSAnTSAnICsgY3VydmUuc3RhcnRQb2ludC54LnRvRml4ZWQoMykgKyAnLCcgKyBjdXJ2ZS5zdGFydFBvaW50LnkudG9GaXhlZCgzKSArICcgJyArICgnQyAnICsgY3VydmUuY29udHJvbDEueC50b0ZpeGVkKDMpICsgJywnICsgY3VydmUuY29udHJvbDEueS50b0ZpeGVkKDMpICsgJyAnKSArIChjdXJ2ZS5jb250cm9sMi54LnRvRml4ZWQoMykgKyAnLCcgKyBjdXJ2ZS5jb250cm9sMi55LnRvRml4ZWQoMykgKyAnICcpICsgKGN1cnZlLmVuZFBvaW50LngudG9GaXhlZCgzKSArICcsJyArIGN1cnZlLmVuZFBvaW50LnkudG9GaXhlZCgzKSk7XG5cbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdkJywgYXR0cik7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgKHdpZHRocy5lbmQgKiAyLjI1KS50b0ZpeGVkKDMpKTtcbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2UnLCBjb2xvcik7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVjYXAnLCAncm91bmQnKTtcblxuICAgICAgc3ZnLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgIH1cbiAgfSwgZnVuY3Rpb24gKHJhd1BvaW50KSB7XG4gICAgdmFyIGNpcmNsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NpcmNsZScpO1xuICAgIHZhciBkb3RTaXplID0gdHlwZW9mIF90aGlzMi5kb3RTaXplID09PSAnZnVuY3Rpb24nID8gX3RoaXMyLmRvdFNpemUoKSA6IF90aGlzMi5kb3RTaXplO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ3InLCBkb3RTaXplKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCdjeCcsIHJhd1BvaW50LngpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N5JywgcmF3UG9pbnQueSk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHJhd1BvaW50LmNvbG9yKTtcblxuICAgIHN2Zy5hcHBlbmRDaGlsZChjaXJjbGUpO1xuICB9KTtcblxuICB2YXIgcHJlZml4ID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJztcbiAgdmFyIGhlYWRlciA9ICc8c3ZnJyArICcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiJyArICcgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCInICsgKCcgdmlld0JveD1cIicgKyBtaW5YICsgJyAnICsgbWluWSArICcgJyArIG1heFggKyAnICcgKyBtYXhZICsgJ1wiJykgKyAoJyB3aWR0aD1cIicgKyBtYXhYICsgJ1wiJykgKyAoJyBoZWlnaHQ9XCInICsgbWF4WSArICdcIicpICsgJz4nO1xuICB2YXIgYm9keSA9IHN2Zy5pbm5lckhUTUw7XG5cbiAgLy8gSUUgaGFjayBmb3IgbWlzc2luZyBpbm5lckhUTUwgcHJvcGVydHkgb24gU1ZHRWxlbWVudFxuICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGR1bW15ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZHVtbXknKTtcbiAgICB2YXIgbm9kZXMgPSBzdmcuY2hpbGROb2RlcztcbiAgICBkdW1teS5pbm5lckhUTUwgPSAnJztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGR1bW15LmFwcGVuZENoaWxkKG5vZGVzW2ldLmNsb25lTm9kZSh0cnVlKSk7XG4gICAgfVxuXG4gICAgYm9keSA9IGR1bW15LmlubmVySFRNTDtcbiAgfVxuXG4gIHZhciBmb290ZXIgPSAnPC9zdmc+JztcbiAgdmFyIGRhdGEgPSBoZWFkZXIgKyBib2R5ICsgZm9vdGVyO1xuXG4gIHJldHVybiBwcmVmaXggKyBidG9hKGRhdGEpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5mcm9tRGF0YSA9IGZ1bmN0aW9uIChwb2ludEdyb3Vwcykge1xuICB2YXIgX3RoaXMzID0gdGhpcztcblxuICB0aGlzLmNsZWFyKCk7XG5cbiAgdGhpcy5fZnJvbURhdGEocG9pbnRHcm91cHMsIGZ1bmN0aW9uIChjdXJ2ZSwgd2lkdGhzKSB7XG4gICAgcmV0dXJuIF90aGlzMy5fZHJhd0N1cnZlKGN1cnZlLCB3aWR0aHMuc3RhcnQsIHdpZHRocy5lbmQpO1xuICB9LCBmdW5jdGlvbiAocmF3UG9pbnQpIHtcbiAgICByZXR1cm4gX3RoaXMzLl9kcmF3RG90KHJhd1BvaW50KTtcbiAgfSk7XG5cbiAgdGhpcy5fZGF0YSA9IHBvaW50R3JvdXBzO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS50b0RhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9kYXRhO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2lnbmF0dXJlUGFkO1xuIiwidmFyIGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG52YXIgcHJlZml4ID0gJ0ludmFyaWFudCBmYWlsZWQnO1xuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNQcm9kdWN0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcmVmaXgpO1xuICAgIH1cbiAgICB2YXIgcHJvdmlkZWQgPSB0eXBlb2YgbWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyA/IG1lc3NhZ2UoKSA6IG1lc3NhZ2U7XG4gICAgdmFyIHZhbHVlID0gcHJvdmlkZWQgPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiOiBcIikuY29uY2F0KHByb3ZpZGVkKSA6IHByZWZpeDtcbiAgICB0aHJvdyBuZXcgRXJyb3IodmFsdWUpO1xufVxuXG5leHBvcnQgeyBpbnZhcmlhbnQgYXMgZGVmYXVsdCB9O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cbiAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcbiAgdmFyIGksIHA7XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gIHJldHVybiBjb29rZWQ7XG59O1xuXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xuICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcbiAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xuICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xuICAgIGlmIChhc3luYykge1xuICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgfVxuICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcbiAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICB9XG4gIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcbiAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0bG9hZGVkOiBmYWxzZSxcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG5cdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwidmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mID8gKG9iaikgPT4gKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSA6IChvYmopID0+IChvYmouX19wcm90b19fKTtcbnZhciBsZWFmUHJvdG90eXBlcztcbi8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLy8gbW9kZSAmIDE2OiByZXR1cm4gdmFsdWUgd2hlbiBpdCdzIFByb21pc2UtbGlrZVxuLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuX193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcblx0aWYobW9kZSAmIDEpIHZhbHVlID0gdGhpcyh2YWx1ZSk7XG5cdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG5cdGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUpIHtcblx0XHRpZigobW9kZSAmIDQpICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcblx0XHRpZigobW9kZSAmIDE2KSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbHVlO1xuXHR9XG5cdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG5cdHZhciBkZWYgPSB7fTtcblx0bGVhZlByb3RvdHlwZXMgPSBsZWFmUHJvdG90eXBlcyB8fCBbbnVsbCwgZ2V0UHJvdG8oe30pLCBnZXRQcm90byhbXSksIGdldFByb3RvKGdldFByb3RvKV07XG5cdGZvcih2YXIgY3VycmVudCA9IG1vZGUgJiAyICYmIHZhbHVlOyB0eXBlb2YgY3VycmVudCA9PSAnb2JqZWN0JyAmJiAhfmxlYWZQcm90b3R5cGVzLmluZGV4T2YoY3VycmVudCk7IGN1cnJlbnQgPSBnZXRQcm90byhjdXJyZW50KSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGN1cnJlbnQpLmZvckVhY2goKGtleSkgPT4gKGRlZltrZXldID0gKCkgPT4gKHZhbHVlW2tleV0pKSk7XG5cdH1cblx0ZGVmWydkZWZhdWx0J10gPSAoKSA9PiAodmFsdWUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGRlZik7XG5cdHJldHVybiBucztcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsInZhciBzY3JpcHRVcmw7XG5pZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMpIHNjcmlwdFVybCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbiArIFwiXCI7XG52YXIgZG9jdW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7XG5pZiAoIXNjcmlwdFVybCAmJiBkb2N1bWVudCkge1xuXHRpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdClcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYztcblx0aWYgKCFzY3JpcHRVcmwpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGlmKHNjcmlwdHMubGVuZ3RoKSB7XG5cdFx0XHR2YXIgaSA9IHNjcmlwdHMubGVuZ3RoIC0gMTtcblx0XHRcdHdoaWxlIChpID4gLTEgJiYgKCFzY3JpcHRVcmwgfHwgIS9eaHR0cChzPyk6Ly50ZXN0KHNjcmlwdFVybCkpKSBzY3JpcHRVcmwgPSBzY3JpcHRzW2ktLV0uc3JjO1xuXHRcdH1cblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5iID0gZG9jdW1lbnQuYmFzZVVSSSB8fCBzZWxmLmxvY2F0aW9uLmhyZWY7XG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJtYWluXCI6IDBcbn07XG5cbi8vIG5vIGNodW5rIG9uIGRlbWFuZCBsb2FkaW5nXG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbi8vIG5vIG9uIGNodW5rcyBsb2FkZWRcblxuLy8gbm8ganNvbnAgZnVuY3Rpb24iLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XHJcbmltcG9ydCBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiO1xyXG5pbXBvcnQgUGRmUmVxdWVzdEZpbGVzIGZyb20gXCIuLi9wYWdlcy9QZGZSZXF1ZXN0RmlsZXNcIjtcclxuaW1wb3J0IHsgcGRmanMgfSBmcm9tIFwicmVhY3QtcGRmXCI7XHJcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSBcInJlYWN0LXJlZHV4XCI7XHJcbmltcG9ydCB7IHN0b3JlIH0gZnJvbSBcIi4uL3JlZHV4L3N0b3JlXCI7XHJcbmltcG9ydCBcIi4uL2luZGV4LmNzc1wiO1xyXG5wZGZqcy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyA9IGAvL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9wZGYuanMvJHtwZGZqcy52ZXJzaW9ufS9wZGYud29ya2VyLm1pbi5tanNgO1xyXG5cclxuLy8gV3JhcHBlciBjb21wb25lbnQgdG8gbWFuYWdlIHByb3BzXHJcbmNvbnN0IFB1YmxpY1NjcmlwdEZpbGVXcmFwcGVyID0gKHsgaW5pdGlhbFByb3BzIH0pID0+IHtcclxuICBjb25zdCBbcHJvcHMsIHNldFByb3BzXSA9IHVzZVN0YXRlKGluaXRpYWxQcm9wcyk7XHJcblxyXG4gIC8vIE1ha2UgdGhlIHNldFByb3BzIGZ1bmN0aW9uIGdsb2JhbGx5IGFjY2Vzc2libGVcclxuICB3aW5kb3cudXBkYXRlUHVibGljVGVtcGxhdGVQcm9wcyA9IHNldFByb3BzO1xyXG5cclxuICByZXR1cm4gPFBkZlJlcXVlc3RGaWxlcyB7Li4ucHJvcHN9IC8+O1xyXG59O1xyXG5cclxuY29uc3QgYXBwSWQgPSBcImxlZ2FkcmFuYXhuXCI7XHJcbi8vIFwib3BlbnNpZ25cIjtcclxuY29uc3Qgc2VydmVyVXJsID0gXCJodHRwczovL2FwcC5vcGVuc2lnbmxhYnMuY29tL2FwaS9hcHBcIjtcclxuLy8gXCJodHRwczovL3N0YWdpbmctYXBwLm9wZW5zaWdubGFicy5jb20vYXBpL2FwcFwiO1xyXG5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImJhc2VVcmxcIiwgYCR7c2VydmVyVXJsfS9gKTtcclxubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJwYXJzZUFwcElkXCIsIGFwcElkKTtcclxuUGFyc2UuaW5pdGlhbGl6ZShhcHBJZCk7XHJcblBhcnNlLnNlcnZlclVSTCA9IHNlcnZlclVybDtcclxuLy8gQ3JlYXRlIGEgbmV3IGRpdiBlbGVtZW50IGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJvZHlcclxuY29uc3Qgc2NyaXB0Q29tcG9uZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuc2NyaXB0Q29tcG9uZW50LmlkID0gXCJzY3JpcHQtY29tcG9uZW50XCI7XHJcbmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0Q29tcG9uZW50KTtcclxuY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xyXG5saW5rLmhyZWYgPSBcImh0dHBzOi8vY2RuLm9wZW5zaWdubGFicy5jb20vZm9udHMuY3NzXCI7XHJcbmxpbmsucmVsID0gXCJzdHlsZXNoZWV0XCI7XHJcbmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XHJcblxyXG4vL2FkZCB0aGUgVGFpbHdpbmQgQ1NTIGZpbGVcclxuY29uc3QgdGFpbHdpbmRDc3NMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XHJcbnRhaWx3aW5kQ3NzTGluay5ocmVmID1cclxuICBcImh0dHBzOi8vYXBwLm9wZW5zaWdubGFicy5jb20vc3RhdGljL2pzL3B1YmxpYy10ZW1wbGF0ZS5idW5kbGUuY3NzXCI7IC8vIGNzcyBidW5kbGUgZmlsZVxyXG4vLyBcImh0dHBzOi8vc3RhZ2luZy1hcHAub3BlbnNpZ25sYWJzLmNvbS9zdGF0aWMvanMvcHVibGljLXRlbXBsYXRlLmJ1bmRsZS5jc3NcIjsgLy8gY3NzIGJ1bmRsZSBmaWxlXHJcbnRhaWx3aW5kQ3NzTGluay5yZWwgPSBcInN0eWxlc2hlZXRcIjtcclxuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0YWlsd2luZENzc0xpbmspO1xyXG4vLyBDcmVhdGUgYSByb290IGFuZCByZW5kZXIgdGhlIHdyYXBwZXIgY29tcG9uZW50IHdpdGggaW5pdGlhbCBwcm9wc1xyXG5jb25zdCByb290ID0gUmVhY3RET00uY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNjcmlwdC1jb21wb25lbnRcIikpO1xyXG5yb290LnJlbmRlcihcclxuICA8ZGl2PlxyXG4gICAgPFByb3ZpZGVyIHN0b3JlPXtzdG9yZX0+XHJcbiAgICAgIDxQdWJsaWNTY3JpcHRGaWxlV3JhcHBlciBpbml0aWFsUHJvcHM9e3sgdGV4dDogXCJ0ZW1wbGF0ZUlkXCIgfX0gLz5cclxuICAgIDwvUHJvdmlkZXI+XHJcbiAgPC9kaXY+XHJcbik7XHJcbiJdLCJuYW1lcyI6WyJSZWFjdCIsIkhlbG1ldCIsIlRpdGxlIiwiX3JlZiIsInRpdGxlIiwiZHJpdmUiLCJjcmVhdGVFbGVtZW50IiwiY29uY2F0IiwibmFtZSIsImNvbnRlbnQiLCJyZWwiLCJ0eXBlIiwiaHJlZiIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJzaXplcyIsIkJvcmRlclJlc2l6ZSIsInJpZ2h0IiwidG9wIiwiY2xhc3NOYW1lIiwiRGVmYXVsdFNpZ25hdHVyZSIsImRlZmF1bHRTaWduSW1nIiwieHlQb3N0aW9uIiwic2V0RGVmYXVsdFNpZ25BbGVydCIsImNvbmZpcm1Ub2FkZERlZmF1bHRTaWduIiwibGVuZ3RoIiwiaXNTaG93IiwiYWxlcnRNZXNzYWdlIiwiYWx0Iiwic3JjIiwib25DbGljayIsInVzZVN0YXRlIiwiUHJldk5leHQiLCJoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlIiwiaGFuZGxlRG93bmxvYWRQZGYiLCJoYW5kbGVUb1ByaW50IiwiRHJvcGRvd25NZW51IiwiTW9kYWxVaSIsIkxvYWRlciIsIkhlYWRlciIsImlzUGRmUmVxdWVzdEZpbGVzIiwiaXNQbGFjZWhvbGRlciIsInNldElzRGVjbGluZSIsInBhZ2VOdW1iZXIiLCJhbGxQYWdlcyIsImNoYW5nZVBhZ2UiLCJwZGZVcmwiLCJlbWJlZFdpZGdldHNEYXRhIiwicGRmRGV0YWlscyIsInNpZ25lclBvcyIsInNpZ25lcnNkYXRhIiwiaXNNYWlsU2VuZCIsImFsZXJ0U2VuZEVtYWlsIiwiaXNDb21wbGV0ZWQiLCJpc1Nob3dIZWFkZXIiLCJkZWNsaW5lIiwiY3VycmVudFNpZ25lciIsImFscmVhZHlTaWduIiwiaXNTaWduWW91cnNlbGYiLCJzZXRJc0VtYWlsIiwiY29tcGxldGVCdG5UaXRsZSIsInNldElzRWRpdFRlbXBsYXRlIiwiaXNQdWJsaWNUZW1wbGF0ZSIsImZpbHRlclByZWZpbGwiLCJmaWx0ZXIiLCJkYXRhIiwiUm9sZSIsImlzTW9iaWxlIiwid2luZG93IiwiaW5uZXJXaWR0aCIsImlzRG93bmxvYWRpbmciLCJzZXRJc0Rvd25sb2FkaW5nIiwiaXNHdWVzdFNpZ25lciIsImhhbmRsZURlY2xpbmVQZGZBbGVydCIsImN1cnJlbnREZWNsaW5lIiwiY3Vycm50IiwiaXNEZWNsaW5lZCIsImlkIiwic3R5bGUiLCJ3aWR0aCIsImhpc3RvcnkiLCJnbyIsIlJvb3QiLCJUcmlnZ2VyIiwiYXNDaGlsZCIsIlBvcnRhbCIsIkNvbnRlbnQiLCJzaWRlT2Zmc2V0IiwiSXRlbSIsImUiLCJGcmFnbWVudCIsImRpc2FibGVkIiwiaXNPcGVuIiwiaGFuZGxlQ2xvc2UiLCJQZGZab29tIiwicHJvcHMiLCJvbkNsaWNrWm9vbUluIiwic2V0U2NhbGUiLCJzY2FsZSIsInNldFpvb21QZXJjZW50Iiwiem9vbVBlcmNlbnQiLCJvbkNsaWNrWm9vbU91dCIsImhhbmRsZVJlc2V0IiwiY3Vyc29yIiwidXNlRWZmZWN0IiwiUGxhY2Vob2xkZXJCb3JkZXIiLCJSbmQiLCJkZWZhdWx0V2lkdGhIZWlnaHQiLCJnZXRDb250YWluZXJTY2FsZSIsImhhbmRsZUNvcHlOZXh0VG9XaWRnZXQiLCJpc1RhYkFuZE1vYmlsZSIsIm9uQ2hhbmdlSW5wdXQiLCJyYWRpb0J1dHRvbldpZGdldCIsInRleHRJbnB1dFdpZGdldCIsInRleHRXaWRnZXQiLCJQbGFjZWhvbGRlclR5cGUiLCJtb21lbnQiLCJzZWxlY3RGb3JtYXQiLCJjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQiLCJmb3JtYXQiLCJnZXREZWZhdWx0ZGF0ZSIsInNlbGVjdGVkRGF0ZSIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsImRhdGUiLCJuZXdkYXRlIiwiRGF0ZSIsImRheSIsIm1vbnRoIiwieWVhciIsInNwbGl0IiwidmFsdWUiLCJnZXREZWZhdWx0Rm9ybWF0IiwiZGF0ZUZvcm1hdCIsIlBsYWNlaG9sZGVyIiwiX3Byb3BzJHBvcyIsIl9wcm9wcyRwb3MyIiwiX3Byb3BzJHBvczMiLCJfcHJvcHMkcG9zNCIsIl9wcm9wcyRwb3M1IiwiX3Byb3BzJHBvczYiLCJfcHJvcHMkZGF0YTE0IiwiX3Byb3BzJHBvczEzIiwiX3Byb3BzJGRhdGExNiIsInBsYWNlaG9sZGVyQm9yZGVyIiwic2V0UGxhY2Vob2xkZXJCb3JkZXIiLCJ3IiwiaCIsImlzRHJhZ2dpbmdFbmFibGVkIiwic2V0RHJhZ2dpbmdFbmFibGVkIiwiaXNTaG93RGF0ZUZvcm1hdCIsInNldElzU2hvd0RhdGVGb3JtYXQiLCJjb250YWluZXJTY2FsZSIsInNldENvbnRhaW5lclNjYWxlIiwic2VsZWN0RGF0ZSIsInNldFNlbGVjdERhdGUiLCJwb3MiLCJvcHRpb25zIiwicmVzcG9uc2UiLCJ2YWxpZGF0aW9uIiwiZ2V0VGltZSIsInNldERhdGVGb3JtYXQiLCJzdGFydERhdGUiLCJzZXRTdGFydERhdGUiLCJnZXRDaGVja2JveFJlbmRlcldpZHRoIiwic2V0R2V0Q2hlY2tib3hSZW5kZXJXaWR0aCIsImhlaWdodCIsImdldFBkZlBhZ2VXaWR0aCIsInBkZk9yaWdpbmFsV0giLCJmaW5kIiwiY29udGFpbmVyV0giLCJkYXRlRm9ybWF0QXJyIiwidXBkYXRlV2lkdGgiLCJybmRFbGVtZW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImtleSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInRpbWVyIiwic2V0VGltZW91dCIsImNsZWFyVGltZW91dCIsImNsb3NlTWVudU9uT3V0c2lkZUNsaWNrIiwidGFyZ2V0IiwiY2xvc2VzdCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY2hhbmdlRGF0ZUZvcm1hdCIsInVwZGF0ZURhdGUiLCJtYXAiLCJtaWxsaXNlY29uZHMiLCJuZXdEYXRlIiwiZGF0ZU9iaiIsInB1c2giLCJoYW5kbGVXaWRnZXRJZGFuZFBvcHVwIiwic2V0U2VsZWN0V2lkZ2V0SWQiLCJ3aWRnZXRUeXBlRXhpc3QiLCJpbmNsdWRlcyIsImlzTmVlZFNpZ24iLCJpc0RyYWdnaW5nIiwiaXNwdWJsaWNUZW1wbGF0ZSIsImhhbmRsZVVzZXJEZXRhaWxzIiwic2V0SXNTaWduUGFkIiwic2V0U2lnbktleSIsInNldElzU3RhbXAiLCJpc1N0YW1wIiwic2V0SXNJbml0aWFsIiwiX3Byb3BzJHBvczciLCJzZWxlY3RXaWRnZXRJZCIsImhhbmRsZUxpbmtVc2VyIiwiSWQiLCJzZXRVbmlxdWVJZCIsImNoZWNrSW5kZXgiLCJmaW5kSW5kZXgiLCJzZXRJc1NlbGVjdElkIiwic2lnbmVyT2JqSWQiLCJoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIiLCJfcHJvcHMkZGF0YSIsIl9wcm9wcyRkYXRhMiIsInNldEN1cnJXaWRnZXRzRGV0YWlscyIsInNldFdpZGdldFR5cGUiLCJ1bmlxdWVJZCIsImhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbiIsIl9wcm9wcyRwb3M4Iiwic2V0SXNSYWRpbyIsInNldFNob3dEcm9wZG93biIsInNldElzQ2hlY2tib3giLCJoYW5kbGVUZXh0U2V0dGluZ01vZGFsIiwiaGFuZGxlTmFtZU1vZGFsIiwiX3Byb3BzJGRhdGEzIiwiX3Byb3BzJGRhdGE0Iiwic2V0U2lnbmVyT2JqSWQiLCJfcHJvcHMkZGF0YTUiLCJzZXRUZW1wU2lnbmVySWQiLCJoYW5kbGVDb3B5UGxhY2Vob2xkZXIiLCJfcHJvcHMkcG9zOSIsInN0b3BQcm9wYWdhdGlvbiIsIl9wcm9wcyRkYXRhNiIsIl9wcm9wcyRkYXRhNyIsIl9wcm9wcyRkYXRhOCIsIl9wcm9wcyRkYXRhOSIsInNldElzUGFnZUNvcHkiLCJfcHJvcHMkZGF0YTEwIiwiaW5kZXgiLCJzZXRYeVBvc3Rpb24iLCJoYW5kbGVTYXZlRGF0ZSIsImlzRGF0ZUNoYW5nZSIsIlBsYWNlaG9sZGVySWNvbiIsIl9wcm9wcyRwb3MxMCIsIl9wcm9wcyRwb3MxMSIsIl9wcm9wcyRwb3MxMiIsImlzU2hvd0JvcmRlciIsIm9uVG91Y2hFbmQiLCJjb2xvciIsInpJbmRleCIsImZvbnRTaXplIiwiaW5kIiwiaGFuZGxlRGVsZXRlU2lnbiIsIl9wcm9wcyRkYXRhMTEiLCJ4UG9zIiwic2lnbllvdXJzZWxmIiwicmVzaXplUG9zIiwieFBvc2l0aW9uIiwieVBvcyIsInlQb3NpdGlvbiIsImdldEN1cnNvciIsIl9wcm9wcyRkYXRhMTIiLCJfcHJvcHMkZGF0YTEzIiwidW5TaWduZWRXaWRnZXRJZCIsImxvY2tBc3BlY3RSYXRpbyIsIldpZHRoIiwiSGVpZ2h0IiwiZW5hYmxlUmVzaXppbmciLCJib3R0b20iLCJsZWZ0IiwidG9wUmlnaHQiLCJib3R0b21SaWdodCIsImJvdHRvbUxlZnQiLCJ0b3BMZWZ0IiwiYm91bmRzIiwiYm9yZGVyIiwiYm9yZGVyUmFkaXVzIiwidGV4dEFsaWduIiwiYmFja2dyb3VuZCIsImJsb2NrQ29sb3IiLCJvbkRyYWciLCJoYW5kbGVUYWJEcmFnIiwic2l6ZSIsInBvc1dpZHRoIiwicG9zSGVpZ2h0Iiwib25SZXNpemVTdGFydCIsInNldElzUmVzaXplIiwib25SZXNpemVTdG9wIiwiZGlyZWN0aW9uIiwicmVmIiwiaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemUiLCJpc1Jlc2l6ZSIsImRpc2FibGVEcmFnZ2luZyIsIm9uRHJhZ1N0b3AiLCJldmVudCIsImRyYWdFbGVtZW50IiwiX3Byb3BzJGRhdGExNSIsIl9wcm9wcyRwb3MxNCIsImhhbmRsZVN0b3AiLCJwb3NpdGlvbiIsIngiLCJ5Iiwib25SZXNpemUiLCJvZmZzZXRXaWR0aCIsIm9mZnNldEhlaWdodCIsImlzU2hvd0Ryb3Bkb3duIiwiaGFuZGxlVXNlck5hbWUiLCJzZXRWYWxpZGF0ZUFsZXJ0IiwidGhlbWVDb2xvciIsInJlc2l6ZUJvcmRlckV4dHJhV2lkdGgiLCJnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoIiwiZGVmYXVsdFdpZHRoIiwiZGVmYXVsdEhlaWdodCIsImdldFdpZHRoIiwiZ2V0SGVpZ2h0IiwiaGFuZGxlTWluV2lkdGgiLCJoYW5kbGVNaW5IZWlnaHQiLCJvbk1vdXNlRW50ZXIiLCJib3JkZXJDb2xvciIsIm1pbldpZHRoIiwibWluSGVpZ2h0IiwiZm9yd2FyZFJlZiIsInVzZVJlZiIsImdldE1vbnRoIiwiZ2V0WWVhciIsIm9uQ2hhbmdlSGVpZ2h0T2ZUZXh0QXJlYSIsInJhbmdlIiwiRGF0ZVBpY2tlciIsIlJlZ2V4UGFyc2VyIiwiZW1haWxSZWdleCIsInRleHRXaWRnZXRDbHMiLCJzZWxlY3RXaWRnZXRDbHMiLCJfcHJvcHMkcG9zMTkiLCJfcHJvcHMkcG9zMjAiLCJfcHJvcHMkcG9zMjEiLCJfcHJvcHMkcG9zJG9wdGlvbnM3IiwiX3Byb3BzJHBvcyRvcHRpb25zMTEiLCJfcHJvcHMkcG9zJG9wdGlvbnMxMiIsIl9wcm9wcyRwb3Mkb3B0aW9uczEzIiwiX3Byb3BzJHBvcyRvcHRpb25zMTQiLCJfcHJvcHMkcG9zJG9wdGlvbnMxNSIsIl9wcm9wcyRwb3Mkb3B0aW9uczE2IiwiX3Byb3BzJHBvczIyIiwiX3Byb3BzJHBvczIzIiwiX3Byb3BzJHBvczI0IiwiX3Byb3BzJHBvczI1IiwiX3Byb3BzJHBvcyRvcHRpb25zMTciLCJfcHJvcHMkcG9zJG9wdGlvbnMxOCIsIl9wcm9wcyRwb3Mkb3B0aW9uczE5IiwiX3Byb3BzJHBvcyRvcHRpb25zMjAiLCJfcHJvcHMkcG9zJG9wdGlvbnMyMSIsIl9wcm9wcyRwb3Mkb3B0aW9uczIyIiwiX3Byb3BzJGRhdGExNyIsIl9wcm9wcyRwb3Mkb3B0aW9uczIzIiwiX3Byb3BzJHBvcyRvcHRpb25zMjQiLCJfcHJvcHMkcG9zJG9wdGlvbnMyNSIsIl9wcm9wcyRwb3Mkb3B0aW9uczI2IiwiX3Byb3BzJHBvcyRvcHRpb25zMjciLCJfcHJvcHMkcG9zJG9wdGlvbnMyOCIsIl9wcm9wcyRkYXRhMTkiLCJfcHJvcHMkcG9zJG9wdGlvbnMyOSIsIl9wcm9wcyRwb3Mkb3B0aW9uczMwIiwiX3Byb3BzJHBvcyRvcHRpb25zMzEiLCJfcHJvcHMkcG9zJG9wdGlvbnMzMiIsIl9wcm9wcyRwb3Mkb3B0aW9uczMzIiwiX3Byb3BzJHBvcyRvcHRpb25zMzQiLCJfcHJvcHMkZGF0YTIxIiwiX3Byb3BzJGRhdGEyMiIsIl9wcm9wcyRwb3Mkb3B0aW9uczM1IiwiX3Byb3BzJHNlbGVjdERhdGUiLCJfcHJvcHMkcG9zMjYiLCJfcHJvcHMkcG9zMjciLCJfcHJvcHMkc2VsZWN0RGF0ZTIiLCJfcHJvcHMkcG9zMjgiLCJfcHJvcHMkcG9zMjkiLCJfcHJvcHMkZGF0YTIzIiwiX3Byb3BzJGRhdGEyNCIsIl9wcm9wcyRwb3MzMCIsIl9wcm9wcyRkYXRhMjUiLCJfcHJvcHMkcG9zJG9wdGlvbnMzNiIsIl9wcm9wcyRwb3Mkb3B0aW9uczM3IiwiX3Byb3BzJHBvcyRvcHRpb25zMzgiLCJfcHJvcHMkcG9zJG9wdGlvbnMzOSIsIl9wcm9wcyRwb3Mkb3B0aW9uczQwIiwiX3Byb3BzJHBvcyRvcHRpb25zNDEiLCJfcHJvcHMkcG9zJG9wdGlvbnM0MiIsIl9wcm9wcyRwb3Mkb3B0aW9uczQ1IiwiX3Byb3BzJHBvcyRvcHRpb25zNDYiLCJfcHJvcHMkcG9zJG9wdGlvbnM0NyIsIl9wcm9wcyRkYXRhMjkiLCJfcHJvcHMkZGF0YTMwIiwic2VsZWN0T3B0aW9uIiwic2V0U2VsZWN0T3B0aW9uIiwidmFsaWRhdGVQbGFjZWhvbGRlciIsInNldFZhbGlkYXRlUGxhY2Vob2xkZXIiLCJpbnB1dFJlZiIsInRleHRWYWx1ZSIsInNldFRleHRWYWx1ZSIsInNlbGVjdGVkQ2hlY2tib3giLCJzZXRTZWxlY3RlZENoZWNrYm94IiwieWVhcnMiLCJtb250aHMiLCJ2YWxpZGF0ZUV4cHJlc3Npb24iLCJyZWdleFZhbGlkYXRpb24iLCJyZWdleE9iamVjdCIsImlzVmFsaWRhdGUiLCJ0ZXN0IiwiY3VycmVudCIsImZvY3VzIiwiaGFuZGxlSW5wdXRCbHVyIiwidmFsaWRhdGVUeXBlIiwicGF0dGVybiIsImhhbmRsZVRleHRWYWxpZCIsInRleHRJbnB1dCIsImNoZWNrUmVndWxhckV4cHJlc3MiLCJfcHJvcHMkcG9zMTUiLCJfcHJvcHMkcG9zMTYiLCJfcHJvcHMkcG9zJG9wdGlvbnMiLCJpc0RlZmF1bHRWYWx1ZSIsImRlZmF1bHRWYWx1ZSIsImhpbnQiLCJfcHJvcHMkcG9zMTciLCJfcHJvcHMkcG9zMTgiLCJkZWZhdWx0RGF0YSIsIkV4YW1wbGVDdXN0b21JbnB1dCIsImRpc3BsYXlOYW1lIiwiaXNEZWZhdWx0Iiwic2VuZGVyVXNlciIsImpzb25TZW5kZXIiLCJKU09OIiwicGFyc2UiLCJzZWxlY3RDaGVja2JveCIsIl9wcm9wcyRwb3Mkb3B0aW9uczIiLCJfcHJvcHMkcG9zJG9wdGlvbnMzIiwicmVzIiwiZGVmYXVsdENoZWNrIiwiaXNTZWxlY3RJbmRleCIsImluZGV4T2YiLCJoYW5kbGVSYWRpb0NoZWNrIiwiX3Byb3BzJHBvcyRvcHRpb25zNCIsImhhbmRsZUNoZWNrYm94VmFsdWUiLCJpc0NoZWNrZWQiLCJ1cGRhdGVTZWxlY3RlZENoZWNrYm94IiwiY2hlY2tlZExpc3QiLCJpc0RlZmF1bHRFbXB0eSIsIl9wcm9wcyRwb3Mkb3B0aW9uczUiLCJoYW5kbGVDaGVja1JhZGlvIiwiaXNSYWRpbyIsIl9wcm9wcyRwb3Mkb3B0aW9uczYiLCJoYW5kbGVPbkRhdGVDaGFuZ2UiLCJoYW5kbGVFbnRlclByZXNzIiwiU2lnblVybCIsImRyYWdnYWJsZSIsInZhbHVlcyIsIl9wcm9wcyRwb3Mkb3B0aW9uczgiLCJfcHJvcHMkcG9zJG9wdGlvbnMxMCIsIm9uQmx1ciIsImlzUmVhZE9ubHkiLCJjaGVja2VkIiwib25DaGFuZ2UiLCJfcHJvcHMkcG9zJG9wdGlvbnM5IiwibWF4UmVxdWlyZWQiLCJtYXhSZXF1aXJlZENvdW50IiwibWF4Q291bnRJbnQiLCJwYXJzZUludCIsImlzSGlkZUxhYmVsIiwicGxhY2Vob2xkZXIiLCJyb3dzIiwib25LZXlEb3duIiwiZm9udENvbG9yIiwiY29scyIsIm92ZXJmbG93IiwiaGlkZGVuIiwiZm9udEZhbWlseSIsIl9wcm9wcyRkYXRhMTgiLCJfcHJvcHMkZGF0YTIwIiwicmVuZGVyQ3VzdG9tSGVhZGVyIiwiX3JlZjIiLCJjaGFuZ2VZZWFyIiwiY2hhbmdlTW9udGgiLCJfcmVmMyIsIm9wdGlvbiIsIl9yZWY0IiwiY2xvc2VPblNjcm9sbCIsInNlbGVjdGVkIiwicG9wcGVyUGxhY2VtZW50IiwiY3VzdG9tSW5wdXQiLCJfcHJvcHMkZGF0YTI2IiwiX3Byb3BzJHBvcyRvcHRpb25zNDMiLCJfcHJvcHMkZGF0YTI3IiwiX3Byb3BzJHBvcyRvcHRpb25zNDQiLCJfcHJvcHMkZGF0YTI4IiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJEb2N1bWVudCIsIlBhZ2UiLCJ1c2VTZWxlY3RvciIsIlJlbmRlckFsbFBkZlBhZ2UiLCJzaWduUGRmVXJsIiwic2V0QWxsUGFnZXMiLCJzZXRQYWdlTnVtYmVyIiwic2V0U2lnbkJ0blBvc2l0aW9uIiwic2lnbmVyT2JqZWN0SWQiLCJzaWduUGFnZU51bWJlciIsInNldFNpZ25QYWdlTnVtYmVyIiwiYm9va21hcmtDb2xvciIsInNldEJvb2ttYXJrQ29sb3IiLCJvbkRvY3VtZW50TG9hZCIsIm51bVBhZ2VzIiwiX2NoZWNrVXNlciQiLCJjaGVja1VzZXIiLCJwYWdlTnVtYmVyQXJyIiwiX2NoZWNrVXNlciQyIiwicGxhY2VIb2xkZXIiLCJwYWdlQ29udGFpbmVyIiwiaXNIZWFkZXIiLCJzdGF0ZSIsInNob3dIZWFkZXIiLCJwYWdlV2lkdGgiLCJzZXRQYWdlV2lkdGgiLCJ1cGRhdGVTaXplIiwiYWRkU2lnbmF0dXJlQm9va21hcmsiLCJpc3BhZ2VOdW1iZXIiLCJsb2FkaW5nIiwib25Mb2FkU3VjY2VzcyIsImZpbGUiLCJBcnJheSIsImZyb20iLCJlbCIsInJlbmRlckFubm90YXRpb25MYXllciIsInJlbmRlclRleHRMYXllciIsIlJTQyIsImhhbmRsZUltYWdlUmVzaXplIiwiQWxlcnQiLCJSZW5kZXJQZGYiLCJkcm9wIiwic3VjY2Vzc0VtYWlsIiwicGFnZURldGFpbHMiLCJwZGZSZXF1ZXN0Iiwic2lnbmVkU2lnbmVycyIsInBkZkxvYWQiLCJzZXRQZGZMb2FkIiwic2V0U2lnbmVyUG9zIiwic2V0SXNWYWxpZGF0ZSIsIklzUmVzaXplIiwiY2hlY2tTaWduZWRTaWduZXJzIiwiY2hlY2tTaWduIiwic2lnbiIsIm9iamVjdElkIiwiaGFuZGxlQWxsVXNlck5hbWUiLCJfcGRmRGV0YWlscyQwJFNpZ25lcnMiLCJTaWduZXJzIiwic2lnbmVyIiwiTmFtZSIsInBsYWNlRGF0YSIsIm9uTG9hZEVycm9yIiwiU2lnbmVkVXJsIiwiVVJMIiwib25HZXRBbm5vdGF0aW9uc0Vycm9yIiwiZXJyb3IiLCJjb25zb2xlIiwibG9nIiwiYm94U2hhZG93IiwiaW5uZXJIZWlnaHQiLCJub1Njcm9sbFkiLCJub1Njcm9sbFgiLCJTaWduYXR1cmVDYW52YXMiLCJTaWduUGFkIiwiaXNTaWduUGFkIiwic2V0SXNJbWFnZVNlbGVjdCIsIm9uU2F2ZVNpZ24iLCJzZXRJbWFnZSIsImlzSW1hZ2VTZWxlY3QiLCJpbWFnZVJlZiIsIm9uSW1hZ2VDaGFuZ2UiLCJvblNhdmVJbWFnZSIsImltYWdlIiwiZGVmYXVsdFNpZ24iLCJzZXRTaWduYXR1cmUiLCJteUluaXRpYWwiLCJpc0luaXRpYWwiLCJ3aWRnZXRUeXBlIiwiY3VycldpZGdldHNEZXRhaWxzIiwicGVuQ29sb3IiLCJzZXRQZW5Db2xvciIsImFsbENvbG9yIiwiY2FudmFzUmVmIiwiaXNEZWZhdWx0U2lnbiIsInNldElzRGVmYXVsdFNpZ24iLCJpc1RhYiIsInNldElzVGFiIiwiaXNTaWduSW1nIiwic2V0SXNTaWduSW1nIiwic2lnblZhbHVlIiwic2V0U2lnblZhbHVlIiwidGV4dFdpZHRoIiwic2V0VGV4dFdpZHRoIiwidGV4dEhlaWdodCIsInNldFRleHRIZWlnaHQiLCJzaWduYXR1cmVUeXBlIiwic2V0U2lnbmF0dXJlVHlwZSIsImZvbnRPcHRpb25zIiwiZm9udFNlbGVjdCIsInNldEZvbnRTZWxlY3QiLCJjdXJyZW50VXNlck5hbWUiLCJoYW5kbGVDbGVhciIsImNsZWFyIiwiaGFuZGxlU2lnbmF0dXJlQ2hhbmdlIiwiU2F2ZUJ0biIsImlzV2lkZ2V0VHlwZSIsInVybCIsImZyb21EYXRhVVJMIiwidHJpbW1lZE5hbWUiLCJ0cmltIiwiZmlyc3RDaGFyYWN0ZXIiLCJjaGFyQXQiLCJ1c2VyTmFtZSIsImxvYWRGb250IiwiZm9udHMiLCJsb2FkIiwic2VsZWN0Rm9udFNUeWxlIiwiZm9udCIsImNvbnZlcnRUb0ltZyIsImZvbnRTdHlsZSIsInRleHQiLCJ0ZXh0Q29udGVudCIsImZvbnRmYW1pbHkiLCJmb250U2l6ZVZhbHVlIiwic3BhbiIsImRpc3BsYXkiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjYW52YXNFbGVtZW50IiwiY3R4IiwiZ2V0Q29udGV4dCIsInBpeGVsUmF0aW8iLCJkZXZpY2VQaXhlbFJhdGlvIiwiYWRkRXh0cmFXaWR0aCIsImZpbGxTdHlsZSIsInRleHRCYXNlbGluZSIsImZpbGxUZXh0IiwicmVtb3ZlQ2hpbGQiLCJkYXRhVXJsIiwidG9EYXRhVVJMIiwiUGVuQ29sb3JDb21wb25lbnQiLCJtYXJnaW4iLCJib3JkZXJCb3R0b20iLCJmbGV4RGlyZWN0aW9uIiwianVzdGlmeUNvbnRlbnQiLCJhbGlnbkl0ZW1zIiwibWFyZ2luQm90dG9tIiwiY2xpY2siLCJhY2NlcHQiLCJtYXhMZW5ndGgiLCJiYWNrZ3JvdW5kQ29sb3IiLCJwYWRkaW5nIiwiY2FudmFzUHJvcHMiLCJvbkVuZCIsIl9jYW52YXNSZWYkY3VycmVudCIsImRvdFNpemUiLCJkYXJrZW5Db2xvciIsImdldEZpcnN0TGV0dGVyIiwiU2lnbmVyTGlzdENvbXBvbmVudCIsIl9wcm9wcyRvYmoiLCJfcHJvcHMkb2JqMiIsIl9wcm9wcyRvYmozIiwiX3Byb3BzJG9iajQiLCJfcHJvcHMkb2JqNSIsIl9wcm9wcyRvYmo2IiwiX3Byb3BzJG9iajciLCJjaGVja1NpZ25lckJhY2tDb2xvciIsIm9iaiIsImNoZWNrVXNlck5hbWVDb2xvciIsImdldEJhY2tDb2xvciIsImVtYWlsIiwiRW1haWwiLCJWZXJpZnlFbWFpbCIsImlzVmVyaWZ5TW9kYWwiLCJvblN1Ym1pdCIsInNldElzVmVyaWZ5TW9kYWwiLCJoYW5kbGVWZXJpZnlFbWFpbCIsInJlcXVpcmVkIiwib3RwIiwic2V0T3RwIiwiaGFuZGxlUmVzZW5kIiwib3RwTG9hZGVyIiwiaGFuZGxlVmVyaWZ5QnRuIiwiYXhpb3MiLCJyZ2IiLCJQYXJzZSIsImFwcEluZm8iLCJzYXZlQXMiLCJwcmludE1vZHVsZSIsInZhbGlkcGxhbiIsImZvbnRzaXplQXJyIiwiZm9udENvbG9yQXJyIiwib3BlbkluTmV3VGFiIiwib3BlbiIsImZldGNoU3Vic2NyaXB0aW9uIiwiZXh0VXNlcklkIiwiY29udGFjdE9iaklkIiwiaXNHdWVzdFNpZ24iLCJFeHRhbmRfQ2xhc3MiLCJleHRDbGFzcyIsImV4dFVzZXIiLCJiYXNlVVJMIiwiaGVhZGVycyIsInNlc3Npb25Ub2tlbiIsInBhcmFtcyIsImNvbnRhY3RJZCIsInRlbmF0UmVzIiwicG9zdCIsInBsYW4iLCJzdGF0dXMiLCJiaWxsaW5nRGF0ZSIsIl90ZW5hdFJlcyRkYXRhIiwiX3RlbmF0UmVzJGRhdGEyIiwicmVzdWx0IiwiaXNTdWJzY3JpYmVkIiwiX3RlbmF0UmVzJGRhdGEzIiwiX3RlbmF0UmVzJGRhdGE0IiwiUGxhbkNvZGUiLCJOZXh0X2JpbGxpbmdfZGF0ZSIsImlzbyIsImVyciIsImZldGNoU3Vic2NyaXB0aW9uSW5mbyIsIl90ZW5hdFJlcyRkYXRhNSIsIl90ZW5hdFJlcyRkYXRhNiIsIl90ZW5hdFJlcyRkYXRhNyIsIl90ZW5hdFJlcyRkYXRhOCIsInByaWNlIiwiU3Vic2NyaXB0aW9uRGV0YWlscyIsInN1YnNjcmlwdGlvbiIsInRvdGFsUHJpY2UiLCJhbW91bnQiLCJwbGFuSWQiLCJzdWJzY3JpcHRpb25faWQiLCJwbGFuX2NvZGUiLCJjaGVja0lzU3Vic2NyaWJlZCIsImNoZWNrSXNTdWJzY3JpYmVkVGVhbSIsIm5hbWVDb2xvciIsInRvRGF0YVVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVhZGVyIiwiRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJvbmxvYWRlbmQiLCJnZXREcml2ZSIsImRvY3VtZW50SWQiLCJza2lwIiwibGltaXQiLCJkb2NJZCIsImRyaXZlRGVhdGlscyIsInNlc3Npb250b2tlbiIsInRoZW4iLCJMaXN0ZGF0YSIsImpzb24iLCJjYXRjaCIsInBkZk5ld1dpZHRoRnVuIiwiZGl2UmVmIiwicGRmV2lkdGgiLCJjb250cmFjdFVzZXJzIiwidXNlckRldGFpbHMiLCJDbG91ZCIsInJ1biIsInN0cmluZ2lmeSIsInNpZ25lcklkIiwic2hvd1Jlc2l6ZSIsImZpbHRlclNpZ25lclBvcyIsImdldFBsYWNlSG9sZGVyIiwiZ2V0UGFnZU51bWVyIiwiZ2V0WFlkYXRhIiwiZ2V0UG9zRGF0YSIsImFkZFNpZ25Qb3MiLCJuZXdVcGRhdGVTaWduUG9zIiwibmV3VXBkYXRlU2lnbmVyIiwid2lkZ2V0cyIsImljb24iLCJpY29uU2l6ZSIsImdldERhdGUiLCJhZGRXaWRnZXRPcHRpb25zIiwiZGVmYXVsdE9wdCIsImdldFdpZGdldFR5cGUiLCJpdGVtIiwiZ2V0QmFzZTY0RnJvbVVybCIsImZldGNoIiwiYmxvYiIsInBkZkJhc2UiLCJzdWZmaXhiYXNlNjQiLCJwb3AiLCJnZXRCYXNlNjRGcm9tSU1HIiwiY29udmVydFBOR3RvSlBFRyIsImJhc2U2NERhdGEiLCJyZWplY3QiLCJjYW52YXMiLCJpbWciLCJJbWFnZSIsIm9ubG9hZCIsImZpbGxSZWN0IiwiZHJhd0ltYWdlIiwianBlZ0Jhc2U2NERhdGEiLCJvbmVycm9yIiwiYWRkU2lnbiIsIm5ld1VwZGF0ZVVybCIsInNpZ25QZGZGdW4iLCJiYXNlNjRVcmwiLCJhY3RpdmVNYWlsQWRhcHRlciIsImlzQ3VzdG9tQ29tcGxldGlvbk1haWwiLCJ0ZW5hbnREZXRhaWxzIiwiZ2V0VGVuYW50RGV0YWlscyIsIm1lc3NhZ2UiLCJDb21wbGV0aW9uQm9keSIsIkNvbXBsZXRpb25TdWJqZWN0IiwiZ2V0U2lnbmF0dXJlIiwidHlwZUV4aXN0Iiwic29tZSIsImJhc2U2NFNpZ24iLCJpc1VybCIsImZldGNoSW1hZ2VCYXNlNjQiLCJnZXROZXdzZTY0IiwiY2hhbmdlSW1hZ2VXSCIsIm1haWxQcm92aWRlciIsInBkZkZpbGUiLCJ1c2VySWQiLCJzaWduYXR1cmUiLCJyZXNTaWduUGRmIiwic2lnbmVkUGRmIiwiX2UkbWVzc2FnZSIsInJhbmRvbUlkIiwicmFuZG9tQnl0ZXMiLCJjcnlwdG8iLCJnZXRSYW5kb21WYWx1ZXMiLCJVaW50MTZBcnJheSIsInJhbmRvbVZhbHVlIiwicmFuZG9tRGlnaXQiLCJjcmVhdGVEb2N1bWVudCIsInRlbXBsYXRlIiwicGxhY2Vob2xkZXJzIiwic2lnbmVyRGF0YSIsIkRvYyIsInBsYWNlaG9sZGVyc0FyciIsInNpZ25lcnMiLCJmb3JFYWNoIiwiX190eXBlIiwiU2VudFRvT3RoZXJzIiwiRGVzY3JpcHRpb24iLCJOb3RlIiwiUGxhY2Vob2xkZXJzIiwiRXh0VXNlclB0ciIsIkNyZWF0ZWRCeSIsIlNlbmRpbk9yZGVyIiwiQXV0b21hdGljUmVtaW5kZXJzIiwiUmVtaW5kT25jZUluRXZlcnkiLCJmaXJzdExldHRlciIsImZhY3RvciIsImhleCIsInJlcGxhY2UiLCJyIiwic3Vic3RyaW5nIiwiZyIsImIiLCJkYXJrZXJSIiwiTWF0aCIsImZsb29yIiwiZGFya2VyRyIsImRhcmtlckIiLCJ0b1N0cmluZyIsInBhZFN0YXJ0IiwiYWRkWkluZGV4Iiwic2V0WkluZGV4Iiwic2lnbktleSIsImluaXRpYWwiLCJpc1NpZ25lcnMiLCJzaWduZXJQdHIiLCJfZmlsdGVyU2lnbmVyUG9zJCIsInh5RGF0YSIsImFkZEluaXRpYWxEYXRhIiwidXBkYXRlUG9zaXRpb24iLCJwb3NpdGlvbkRhdGEiLCJ1cGRhdGVQbGFjZWhvbGRlciIsIl9maWx0ZXJTaWduZXJQb3MkMiIsImNhbGN1bGF0ZUluaXRpYWxXaWR0aEhlaWdodCIsIndpZGdldERhdGEiLCJpbnRpYWxUZXh0Iiwid2lkZ2V0RGF0YVZhbHVlIiwiQ29tcGFueSIsIkpvYlRpdGxlIiwiZW1iZWREb2NJZCIsInBkZkRvYyIsImkiLCJlbWJlZEZvbnQiLCJwYWdlcyIsImdldFBhZ2VzIiwicGFnZSIsImRyYXdUZXh0Iiwic2lnbmF0dXJlSW1nIiwiaW1nV0giLCJpc1R5cGVUZXh0IiwiZ2V0SU1HV0giLCJ1cGRhdGVYWURhdGEiLCJjYWxjdWxhdGVJbWdBc3BlY3RSYXRpbyIsIm5ld1dpZHRoIiwibmV3SGVpZ2h0IiwidXBkYXRlWFlwb3NpdGlvbiIsInBsYWNlaG9sZGVySGVpZ2h0IiwiYXNwZWN0UmF0aW8iLCJnZXRYWURhdGEiLCJJbWFnZVR5cGUiLCJpbWdUeXBlIiwib25JbWFnZVNlbGVjdCIsInNldEltZ1dIIiwiaW1hZ2VUeXBlIiwiZmlsZXMiLCJpbWdSIiwiaW1hZ2VVcmwiLCJiYXNlNjRkYXRhIiwiRXJyb3IiLCJiYXNlNjRJbWFnZSIsInJlc2l6ZWRCYXNlNjQiLCJjYWxjdWxhdGVGb250U2l6ZSIsInNpZ255b3Vyc2VsZiIsIl9wb3NpdGlvbiRvcHRpb25zIiwibXVsdGlTaWduRW1iZWQiLCJ1cGRhdGVJdGVtIiwiX2RhdGEkb3B0aW9ucyIsInBhZ2VObyIsIndpZGdldHNQb3NpdGlvbkFyciIsImZvcm0iLCJnZXRGb3JtIiwiaW1hZ2VzIiwiYWxsIiwic2lnblVybCIsIm5ld1VybCIsImFycmF5QnVmZmVyIiwiZW1iZWRKcGciLCJlbWJlZFBuZyIsIndpZGdldFdpZHRoIiwid2lkZ2V0SGVpZ2h0IiwicGxhY2Vob2xkZXJXaWR0aCIsIl9wb3NpdGlvbiRvcHRpb25zMiIsImNoZWNrYm94T3B0aW9uR2FwRnJvbVRvcCIsImlzQ2hlY2siLCJvcHRpb25zRm9udFNpemUiLCJjaGVja2JveFNpemUiLCJjaGVja2JveFRleHRHYXBGcm9tTGVmdCIsIl9wb3NpdGlvbiRvcHRpb25zMyIsIl9wb3NpdGlvbiRvcHRpb25zNCIsIl9wb3NpdGlvbiRvcHRpb25zNSIsIl9wb3NpdGlvbiRvcHRpb25zNyIsIl9wb3NpdGlvbiRvcHRpb25zOSIsImNoZWNrYm94UmFuZG9tSWQiLCJfcG9zaXRpb24kb3B0aW9uczYiLCJfcG9zaXRpb24kb3B0aW9uczgiLCJjaGVja2JveCIsImNyZWF0ZUNoZWNrQm94Iiwib3B0aW9uc1Bvc2l0aW9uIiwiY29tcGVuc2F0ZVJvdGF0aW9uIiwiZ2V0Um90YXRpb24iLCJhbmdsZSIsImdldFNpemUiLCJjaGVja2JveE9iaiIsImdldEltYWdlUG9zaXRpb24iLCJhZGRUb1BhZ2UiLCJjaGVjayIsInVuY2hlY2siLCJlbmFibGVSZWFkT25seSIsIl9wb3NpdGlvbiRvcHRpb25zMTAiLCJfcG9zaXRpb24kb3B0aW9uczExIiwiX3Bvc2l0aW9uJG9wdGlvbnMxMyIsInVwZGF0ZUNvbG9ySW5SZ2IiLCJfcG9zaXRpb24kb3B0aW9uczEyIiwiX3Bvc2l0aW9uJG9wdGlvbnMxNCIsImZpeGVkV2lkdGgiLCJpc05ld09uRW50ZXJMaW5lRXhpc3QiLCJOZXdicmVha1RleHRJbnRvTGluZXMiLCJsaW5lcyIsImN1cnJlbnRMaW5lIiwid29yZCIsImxpbmVXaWR0aCIsIndpZHRoT2ZUZXh0QXRTaXplIiwiYnJlYWtUZXh0SW50b0xpbmVzIiwibmV3TGluZSIsImxpbmUiLCJ0ZXh0UG9zaXRpb24iLCJfcG9zaXRpb24kb3B0aW9uczE1IiwiX3Bvc2l0aW9uJG9wdGlvbnMxNiIsIl9wb3NpdGlvbiRvcHRpb25zMTgiLCJkcm9wZG93blJhbmRvbUlkIiwiZHJvcGRvd24iLCJjcmVhdGVEcm9wZG93biIsImFkZE9wdGlvbnMiLCJfcG9zaXRpb24kb3B0aW9uczE3Iiwic2VsZWN0IiwiX3Bvc2l0aW9uJG9wdGlvbnMxOSIsImRyb3Bkb3duT2JqIiwiZHJvcGRvd25PcHRpb24iLCJfcG9zaXRpb24kb3B0aW9uczIwIiwiX3Bvc2l0aW9uJG9wdGlvbnMyMyIsIl9wb3NpdGlvbiRvcHRpb25zMjUiLCJyYWRpb1JhbmRvbUlkIiwicmFkaW9Hcm91cCIsImNyZWF0ZVJhZGlvR3JvdXAiLCJyYWRpb09wdGlvbkdhcEZyb21Ub3AiLCJyYWRpb1RleHRHYXBGcm9tTGVmdCIsInJhZGlvU2l6ZSIsIl9wb3NpdGlvbiRvcHRpb25zMjEiLCJfcG9zaXRpb24kb3B0aW9uczIyIiwicmFkaW9PYmoiLCJhZGRPcHRpb25Ub1BhZ2UiLCJfcG9zaXRpb24kb3B0aW9uczI0IiwiX3Bvc2l0aW9uJG9wdGlvbnMyNiIsImltYWdlT3B0aW9ucyIsInBkZkJ5dGVzIiwic2F2ZUFzQmFzZTY0IiwidXNlT2JqZWN0U3RyZWFtcyIsInVybFZhbGlkYXRvciIsInByb3RvY29sIiwicG9zVXBkYXRlSGVpZ2h0IiwiY29udGFjdEJvb2siLCJnZXQiLCJyZXN1bHRzIiwiY29udHJhY3REb2N1bWVudCIsImRvY3VtZW50RGVhdGlscyIsImFkZERlZmF1bHRTaWduYXR1cmVJbWciLCJjb21wbGV0ZSIsInh5RGVmYXVsdFBvcyIsImdldFBhZ2VObyIsIm5ld1h5cG9zIiwic3RhcnQiLCJlbmQiLCJzdGVwIiwibmV3TW9udGgiLCJuZXdZZWFyIiwiZ2V0RnVsbFllYXIiLCJuZXdwb3MiLCJjYWxjdWxhdGVYUG9zaXRpb24iLCJuZXdJZCIsIl9maWx0ZXJTaWduZXJQb3MkMyIsImdldEZpbGVOYW1lIiwiZmlsZVVybCIsImZpbGVuYW1lIiwicGF0aG5hbWUiLCJnZXRBcHBMb2dvIiwibG9jYXRpb24iLCJob3N0IiwibG9nbyIsImFwcGxvZ28iLCJ1c2VyIiwiZG9tYWluIiwidGVuYW50IiwidGVuYW50Q3JlZGl0c1F1ZXJ5IiwiUXVlcnkiLCJlcXVhbFRvIiwiZmlyc3QiLCJ1cGRhdGVSZXMiLCJyZXBsYWNlTWFpbFZhcmlibGVzIiwic3ViamVjdCIsInZhcmlhYmxlcyIsInJlcGxhY2VkU3ViamVjdCIsInJlcGxhY2VkQm9keSIsInZhcmlhYmxlIiwicmVnZXgiLCJSZWdFeHAiLCJjb3B5dG9EYXRhIiwibmF2aWdhdG9yIiwiY2xpcGJvYXJkIiwid3JpdGVUZXh0IiwidGV4dEFyZWEiLCJleGVjQ29tbWFuZCIsImNvbnZlcnRQZGZBcnJheUJ1ZmZlciIsIm9rIiwiaGFuZGxlU2VuZE9UUCIsImFsZXJ0IiwiZmV0Y2hVcmwiLCJwZGZOYW1lIiwic2FuaXRpemVGaWxlTmFtZSIsImF4aW9zUmVzIiwicHJldmVudERlZmF1bHQiLCJwZGYiLCJpc0FuZHJvaWREZXZpY2UiLCJ1c2VyQWdlbnQiLCJtYXRjaCIsImlzQXBwbGVEZXZpY2UiLCJwbGF0Zm9ybSIsIm1heFRvdWNoUG9pbnRzIiwiTVNTdHJlYW0iLCJieXRlQXJyYXkiLCJVaW50OEFycmF5IiwiYXRvYiIsImNoYXIiLCJjaGFyQ29kZUF0IiwiQmxvYiIsImJsb2JVcmwiLCJjcmVhdGVPYmplY3RVUkwiLCJwcmludGFibGUiLCJiYXNlNjQiLCJfcGRmRGV0YWlscyQiLCJDZXJ0aWZpY2F0ZVVybCIsIl9wZGZEZXRhaWxzJDIiLCJfcGRmRGV0YWlscyQzIiwiY2VydGlmaWNhdGVVcmwiLCJfcGRmRGV0YWlscyQ0IiwiZG9jRGV0YWlscyIsImRvYyIsImZpbmRDb250YWN0IiwiY3VycmVudFVzZXIiLCJVc2VyIiwiY29udGFjdGJvb2siLCJjcmVhdGVXaXRob3V0RGF0YSIsIm5vdEVxdWFsVG8iLCJtYXRjaGVzIiwiY29udGFjdFJlcyIsInBhZ2VSb3RhdGlvbiIsImRpbWVuc2lvbnMiLCJyb3RhdGlvblJhZHMiLCJQSSIsImNvb3Jkc0Zyb21Cb3R0b21MZWZ0IiwiZHJhd1giLCJkcmF3WSIsImNvcyIsInNpbiIsInJvdGF0ZSIsInNpemVSYXRpbyIsImhhc093blByb3BlcnR5IiwicGFnZVJhdGlvIiwidnBXaWR0aCIsImltYWdlV2lkdGgiLCJpbWFnZUhlaWdodCIsImltYWdlWCIsImltYWdlWUZyb21Ub3AiLCJjb3JyZWN0aW9uIiwiYXBwSWQiLCJwcm9jZXNzIiwiZW52IiwiUkVBQ1RfQVBQX0FQUElEIiwiYmFzZVVybCIsIlJFQUNUX0FQUF9TRVJWRVJVUkwiLCJvcmlnaW4iLCJkZWZhdWx0Um9sZSIsImZiQXBwSWQiLCJSRUFDVF9BUFBfRkJBUFBJRCIsImZldl9JY29uIiwiZ29vZ2xlQ2xpZXRJZCIsIlJFQUNUX0FQUF9HT09HTEVDTElFTlRJRCIsIm1ldGFEZXNjcmlwdGlvbiIsInNldHRpbmdzIiwicm9sZSIsIm1lbnVJZCIsInBhZ2VUeXBlIiwicGFnZUlkIiwiZXh0ZW5kZWRfY2xhc3MiLCJjb250YWN0Q2xzIiwidGVtcGxhdGVDbHMiLCJkb2N1bWVudENscyIsImljb25Db2xvciIsImlzRW5hYmxlU3Vic2NyaXB0aW9uIiwiUkVBQ1RfQVBQX0VOQUJMRV9TVUJTQ1JJUFRJT04iLCJfcHJvY2VzcyRlbnYkUkVBQ1RfQVAiLCJ0b0xvd2VyQ2FzZSIsImlzU3RhZ2luZyIsInBsYW5zIiwicGxhbk5hbWUiLCJjdXJyZW5jeSIsIm1vbnRobHlQcmljZSIsInllYXJseVByaWNlIiwic3VidGl0bGUiLCJidG4iLCJiZW5lZml0cyIsInllYXJseUJlbmVmaXRzIiwieWVhcmx5VXJsIiwiUERGRG9jdW1lbnQiLCJEbmRQcm92aWRlciIsIkhUTUw1QmFja2VuZCIsIlRvdXIiLCJDb25mZXR0aSIsIkxvYWRlcldpdGhNc2ciLCJIYW5kbGVFcnJvciIsIlBkZkRlY2xpbmVNb2RhbCIsIlRvdXJDb250ZW50V2l0aEJ0biIsIlBkZlJlcXVlc3RGaWxlcyIsIl93aW5kb3ckbG9jYXRpb24iLCJfd2luZG93JGxvY2F0aW9uMiIsIl9wZGZEZXRhaWxzJDEyIiwiX3BkZkRldGFpbHMkMTMiLCJzZXRQZGZEZXRhaWxzIiwic2V0U2lnbmVkU2lnbmVycyIsInVuc2lnbmVkU2lnbmVycyIsInNldFVuU2lnbmVkU2lnbmVycyIsInNldFBkZlVybCIsImhhbmRsZUVycm9yIiwic2V0SGFuZGxlRXJyb3IiLCJzZXRPdHBMb2FkZXIiLCJpc0NlbGVicmF0aW9uIiwic2V0SXNDZWxlYnJhdGlvbiIsInJlcXVlc3RTaWduVG91ciIsInNldFJlcXVlc3RTaWduVG91ciIsInRvdXJTdGF0dXMiLCJzZXRUb3VyU3RhdHVzIiwiaXNMb2FkaW5nIiwic2V0SXNMb2FkaW5nIiwiaXNMb2FkIiwic2V0RGVmYXVsdFNpZ25JbWciLCJpc0RvY0lkIiwic2V0SXNEb2NJZCIsInBkZk5ld1dpZHRoIiwic2V0UGRmTmV3V2lkdGgiLCJzZXRQZGZPcmlnaW5hbFdIIiwic2V0U2lnbmVyT2JqZWN0SWQiLCJpc1VpTG9hZGluZyIsInNldElzVWlMb2FkaW5nIiwiaXNEZWNsaW5lIiwic2V0Q3VycmVudFNpZ25lciIsImlzQWxlcnQiLCJzZXRJc0FsZXJ0Iiwic2V0VW5TaWduZWRXaWRnZXRJZCIsImV4cGlyZWREYXRlIiwic2V0RXhwaXJlZERhdGUiLCJzaWduZXJVc2VySWQiLCJzZXRTaWduZXJVc2VySWQiLCJpc0RvbnRTaG93Iiwic2V0SXNEb250U2hvdyIsImRlZmF1bHRTaWduQWxlcnQiLCJzZXRJc1N1YnNjcmliZWQiLCJzZXRJc0NvbXBsZXRlZCIsImlzQ2VydGlmaWNhdGUiLCJpc01vZGFsIiwic2V0TXlJbml0aWFsIiwiaXNTaWduZWQiLCJzZXRJc1NpZ25lZCIsImlzRXhwaXJlZCIsInNldElzRXhwaXJlZCIsInNldEFscmVhZHlTaWduIiwic2V0Q29udGFpbmVyV0giLCJ2YWxpZGF0ZUFsZXJ0Iiwid2lkZ2V0c1RvdXIiLCJzZXRXaWRnZXRzVG91ciIsIm1pblJlcXVpcmVkQ291bnQiLCJzZXRtaW5SZXF1aXJlZENvdW50Iiwic2VuZEluT3JkZXIiLCJzZXRTZW5kSW5PcmRlciIsImlzU3Vic2NyaXB0aW9uRXhwaXJlZCIsInNldElzU3Vic2NyaXB0aW9uRXhwaXJlZCIsInNldEV4dFVzZXJJZCIsImlzRW1haWxWZXJpZmllZCIsInNldElzRW1haWxWZXJpZmllZCIsImNvbnRyYWN0TmFtZSIsInNldENvbnRyYWN0TmFtZSIsInRvdGFsWm9vbVBlcmNlbnQiLCJzZXRUb3RhbFpvb21QZXJjZW50Iiwic2V0SXNQdWJsaWNUZW1wbGF0ZSIsImNvbnRhY3QiLCJzZXRDb250YWN0IiwicGhvbmUiLCJpc090cCIsInNldElzT3RwIiwic2V0TG9hZGluZyIsInNldFJlcyIsInNldERvY3VtZW50SWQiLCJpc1B1YmxpY0NvbnRhY3QiLCJzZXRJc1B1YmxpY0NvbnRhY3QiLCJpc0d1ZXN0U2lnbkZsb3ciLCJzZW5kbWFpbCIsImdldERvY0lkIiwicm91dGUiLCJ0ZW1wbGF0ZUlkIiwiZ2V0UXVlcnkiLCJzZWFyY2giLCJjaGVja1NwbGl0IiwiZ2V0RG9jdW1lbnRJZCIsImdldERvY3VtZW50RGV0YWlscyIsImdldFRlbXBsYXRlRGV0YWlscyIsImxvY2FsdXNlciIsInJlc0VtYWlsIiwiaXNwdWJsaWMiLCJ0ZW1wbGF0ZURlYXRpbHMiLCJkb2N1bWVudERhdGEiLCJfZG9jdW1lbnREYXRhJCIsIl9kb2N1bWVudERhdGEkMiIsIl9kb2N1bWVudERhdGEkMyIsImdldFB1YmxpY1JvbGUiLCJQdWJsaWNSb2xlIiwiZ2V0VW5pcXVlSWREZXRhaWxzIiwicGxhY2Vob2xkZXJzT3JTaWduZXJzIiwic2lnbmVySWRFeGlzdCIsImdldFNpZ25lckRhdGEiLCJfZXJyJHJlc3BvbnNlIiwiY29kZSIsImlzTmV4dFVzZXIiLCJjdXJyVXNlcklkIiwiX2RvY3VtZW50RGF0YSQ0IiwiSXNDb21wbGV0ZWQiLCJleHBpcmVEYXRlIiwiRXhwaXJ5RGF0ZSIsImRlY2xpbmVkIiwiSXNEZWNsaW5lZCIsImV4cGlyZVVwZGF0ZURhdGUiLCJjdXJyRGF0ZSIsImdldFNpZ25lcnMiLCJnZXRDdXJyZW50U2lnbmVyIiwiVXNlcklkIiwiX2RvY3VtZW50RGF0YSQ1IiwiZXhwaXJlRGF0ZUZvcm1hdCIsImNoZWNrQ3VycmVudFVzZXIiLCJhdWRpdHRyYWlsRGF0YSIsIkF1ZGl0VHJhaWwiLCJBY3Rpdml0eSIsImNoZWNrQWxyZWFkeVNpZ24iLCJVc2VyUHRyIiwiX2RvY3VtZW50RGF0YSQ2IiwiX2RvY3VtZW50RGF0YSQ3IiwiX2RvY3VtZW50RGF0YSQwJFNpZ25lIiwibm90ZSIsImRlc2NyaXB0aW9uIiwiUGhvbmUiLCJ2aWV3ZWRCeSIsInZpZXdlZEF0IiwiY3JlYXRlZEF0IiwidW5TaWduZWRTaWduZXIiLCJjaGVja0VtYWlsIiwiZW1haWxPcklkIiwiaXNTaWduZWRTaWduYXR1cmUiLCJzaWduZWRFeGlzdCIsInRvdXJEYXRhIiwiVG91clN0YXR1cyIsIl9jaGVja1RvdXJSZXF1ZXN0JCIsImNoZWNrVG91clJlcXVlc3QiLCJyZXF1ZXN0U2lnbiIsIl9jaGVja1RvdXJSZXF1ZXN0JDIiLCJfcmVzJCIsIkltYWdlVVJMIiwiSW5pdGlhbHMiLCJsb2FkT2JqIiwiX2N1cnJlbnRVc2VyIiwiX2N1cnJlbnRVc2VyNCIsImVtYWlsVmVyaWZpZWQiLCJfY3VycmVudFVzZXIyIiwiX2N1cnJlbnRVc2VyMyIsInVzZXJRdWVyeSIsImdldFVzZXIiLCJjaGVja2JveEV4aXN0IiwicmVxdWlyZWRSYWRpbyIsInNob3dBbGVydCIsIndpZGdldEtleSIsInJhZGlvRXhpc3QiLCJyZXF1aXJlZENoZWNrYm94IiwiVG91clBhZ2VOdW1iZXIiLCJqIiwiX2NoZWNrVXNlciQwJHBsYWNlSG9sIiwidXBkYXRlUGFnZSIsIl9yZXF1aXJlZENoZWNrYm94JGkkbyIsIl9yZXF1aXJlZENoZWNrYm94JGkkbzIiLCJfcmVxdWlyZWRDaGVja2JveCRpJG8zIiwiX3JlcXVpcmVkQ2hlY2tib3gkaSRvNCIsIm1pbkNvdW50IiwicGFyc2VNaW4iLCJtYXhDb3VudCIsInBhcnNlTWF4IiwiX3JlcXVpcmVkUmFkaW8iLCJjaGVja1NpZ25lZCIsIl9yZXF1aXJlZFJhZGlvMiIsIl9yZXF1aXJlZFJhZGlvJGkiLCJfcmVxdWlyZWRSYWRpbyRpMiIsImNoZWNrRGVmYXVsdFNpZ25lZCIsInJlcXVpcmVkV2lkZ2V0cyIsIl9yZXF1aXJlZFdpZGdldHMkaSIsIl9yZXF1aXJlZFdpZGdldHMkaTIiLCJjaGVja1NpZ25VcmwiLCJfcmVxdWlyZWRXaWRnZXRzJGkzIiwicGRmQXJyQnVmZmVyIiwiX2RvY3VtZW50RGF0YSQ4IiwiX2RvY3VtZW50RGF0YSQ5IiwiZXhpc3RpbmdQZGZCeXRlcyIsImlzU2lnbllvdXJTZWxmRmxvdyIsImV4dFVzZXJQdHIiLCJIZWFkZXJEb2NJZCIsIl9yZXMkMiIsImFjdGl2ZV9tYWlsX2FkYXB0ZXIiLCJyZXNTaWduIiwiX2N1cnJlbnRVc2VyNSIsIm5ld0luZGV4IiwidXNlcm1haWwiLCJfcGRmRGV0YWlscyQ1IiwicmVxdWVzdEJvZHkiLCJSZXF1ZXN0Qm9keSIsInJlcXVlc3RTdWJqZWN0IiwiUmVxdWVzdFN1YmplY3QiLCJfcGRmRGV0YWlscyQ2IiwibG9jYWxFeHBpcmVEYXRlIiwidG9Mb2NhbGVEYXRlU3RyaW5nIiwic2VuZGVyRW1haWwiLCJzZW5kZXJQaG9uZSIsInNlbmRlck5hbWUiLCJfcGRmRGV0YWlscyQ3IiwiX3JlcGxhY2VWYXIiLCJfcmVwbGFjZVZhcjIiLCJpbWdQbmciLCJob3N0VXJsIiwiZW5jb2RlQmFzZTY0IiwiYnRvYSIsImhvc3RQdWJsaWNVcmwiLCJzaWduUGRmIiwib3BlblNpZ25VcmwiLCJvcmdOYW1lIiwidGhlbWVCR2NvbG9yIiwicmVwbGFjZVZhciIsInJlcGxhY2VkUmVxdWVzdEJvZHkiLCJodG1sUmVxQm9keSIsImRvY3VtZW50X3RpdGxlIiwic2VuZGVyX25hbWUiLCJzZW5kZXJfbWFpbCIsInNlbmRlcl9waG9uZSIsInJlY2VpdmVyX25hbWUiLCJyZWNlaXZlcl9lbWFpbCIsInJlY2VpdmVyX3Bob25lIiwiZXhwaXJ5X2RhdGUiLCJjb21wYW55X25hbWUiLCJzaWduaW5nX3VybCIsInJlY2lwaWVudCIsImh0bWwiLCJfY3VycmVudFVzZXI2IiwiY2xvc2VUb3VyIiwidG91ckNvbmZpZyIsInNlbGVjdG9yIiwicGRmV0hPYmoiLCJ0b3RhbFBhZ2VzIiwiZ2V0UGFnZSIsImdldFZpZXdwb3J0Iiwib2Zmc2V0IiwicHJldlBhZ2VOdW1iZXIiLCJzYXZlSW1hZ2UiLCJnZXRJbmRleCIsIm9iamVjdCIsInBsYWNlaG9sZGVyUG9zaXRpb24iLCJnZXRVcGRhdGVQb3NpdGlvbiIsInNwbGljZSIsImluZGV4b2ZTaWduZXIiLCJwcmV2U3RhdGUiLCJuZXdTdGF0ZSIsInNhdmVTaWduIiwidXBkYXRlU2lnbmVyRGF0YSIsImRlY2xpbmVEb2MiLCJyZWFzb24iLCJEZWNsaW5lUmVhc29uIiwicHV0IiwiX3BkZkRldGFpbHMkOCIsIl9wZGZEZXRhaWxzJDkiLCJkZWNsaW5lZEJ5IiwiZGVjbGluZWRBdCIsImFkZERlZmF1bHRTaWduYXR1cmUiLCJjdXJyZW50U2lnbmVyUG9zaXRpb24iLCJ1cGRhdGVQbGFjZSIsInVwZGF0ZXNpZ25lclBvcyIsImhhbmRsZURvbnRTaG93IiwiY2xvc2VSZXF1ZXN0U2lnblRvdXIiLCJ1cGRhdGVkVG91clN0YXR1cyIsInJlcXVlc3RTaWduSW5kZXgiLCJyZXF1ZXN0U2lnblRvdXJGdW5jdGlvbiIsInNpZ25lZEJ5U3RlcCIsInNpZ25lZEJ5Iiwic2xpY2UiLCJkZWZhdWx0U2lnblN0ZXAiLCJkZWZhdWx0U2lnblRvdXIiLCJzaGlmdCIsIm9uUmVxdWVzdENsb3NlIiwic3RlcHMiLCJjbG9zZVdpdGhNYXNrIiwicm91bmRlZCIsImhhbmRsZVB1YmxpY1VzZXIiLCJfcGRmRGV0YWlscyQxMCIsIl9wZGZEZXRhaWxzJDExIiwiX3VzZXJSZXMkZGF0YSIsInRlbXBsYXRlaWQiLCJ1c2VyUmVzIiwiU2VuZE90cCIsImhhbmRsZUlucHV0Q2hhbmdlIiwicHJldiIsIk90cCIsIlZlcmlmeU9UUCIsInNlcnZlclVybCIsInBhcnNlSWQiLCJfdXNlciIsImJlY29tZSIsImNvbnRyYWN0VXNlckRldGFpbHMiLCJzZXRJdGVtIiwiaGFuZGxlQ2xvc2VPdHAiLCJiYWNrZW5kIiwic2hvd0Nsb3NlIiwicG9pbnRlckV2ZW50cyIsInNob3dOdW1iZXIiLCJzaG93TmF2aWdhdGlvbiIsInNob3dOYXZpZ2F0aW9uTnVtYmVyIiwic2hvdyIsImhlYWRNc2ciLCJib2R5TXNzZyIsImZvb3Rlck1lc3NhZ2UiLCJ4bWxucyIsInZpZXdCb3giLCJmaWxsIiwiZCIsInJlZHVjZVdpZHRoIiwiaXNNZW51IiwidXNlck9iamVjdElkIiwiY2hpbGRyZW4iLCJ0ZXh0Y29sb3IiLCJ0aGVtZSIsIkN1c3RvbU1vZGFsIiwic2V0UmVhc29uIiwic2V0SXNDaGVjayIsImhhbmRsZUNoZWNrIiwiY3JlYXRlU2xpY2UiLCJzaG93VGVuYW50U2xpY2UiLCJpbml0aWFsU3RhdGUiLCJyZWR1Y2VycyIsInNob3dUZW5hbnQiLCJhY3Rpb24iLCJwYXlsb2FkIiwiYWN0aW9ucyIsInJlZHVjZXIiLCJ0b3VyU3RlcFNsaWNlIiwic2F2ZVRvdXJTdGVwcyIsInJlbW92ZVRvdXJTdGVwcyIsImluZm9TbGljZSIsImZldGNoQXBwSW5mbyIsInJlbW92ZUl0ZW0iLCJzaG93SGVhZGVyU2xpY2UiLCJjb25maWd1cmVTdG9yZSIsImluZm9SZWR1Y2VyIiwiU2hvd1RlbmFudCIsIlRvdXJTdGVwc1JlZHVjZXIiLCJzdG9yZSIsIlRvdXJTdGVwcyIsIlJlYWN0RE9NIiwicGRmanMiLCJQcm92aWRlciIsIkdsb2JhbFdvcmtlck9wdGlvbnMiLCJ3b3JrZXJTcmMiLCJ2ZXJzaW9uIiwiUHVibGljU2NyaXB0RmlsZVdyYXBwZXIiLCJpbml0aWFsUHJvcHMiLCJzZXRQcm9wcyIsInVwZGF0ZVB1YmxpY1RlbXBsYXRlUHJvcHMiLCJpbml0aWFsaXplIiwic2VydmVyVVJMIiwic2NyaXB0Q29tcG9uZW50IiwibGluayIsImhlYWQiLCJ0YWlsd2luZENzc0xpbmsiLCJyb290IiwiY3JlYXRlUm9vdCIsInJlbmRlciJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLXRlbXBsYXRlLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7O0FDVnVDOztBQUV2QztBQUNBLGlnSUFBaWdJOztBQUVqZ0ksaUNBQWlDLDREQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWtDOzs7Ozs7Ozs7Ozs7Ozs7O0FDZmxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU4Qjs7Ozs7Ozs7Ozs7Ozs7OztBQ1I5QjtBQUNBO0FBQ0EsMEtBQTBLLE1BQU07QUFDaEw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIsTUFBTTtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxPQUFPO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5QixpQ0FBaUM7QUFDMUQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsVUFBVTtBQUN4Qzs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLFVBQVU7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsVUFBVTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7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QTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxtRUFBVztBQUNyQjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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VUFBVTtBQUNyRDtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTs7QUFFQSxTQUFTLFVBQVU7O0FBRW5CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwwQkFBMEI7O0FBRTFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHdFQUF3RTtBQUN4RTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsU0FBUztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGdCQUFnQixpQkFBaUI7QUFDakM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELEVBQUU7QUFDckQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjs7QUFFQTtBQUNBLHlCQUF5QjtBQUN6QixNQUFNO0FBQ04sOEJBQThCO0FBQzlCLE1BQU07OztBQUdOO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLDJCQUEyQixlQUFlO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQSwyQkFBMkIsUUFBUTtBQUNuQzs7QUFFQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixNQUFNO0FBQ047QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNERBQTREO0FBQzVELE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLFNBQVM7QUFDakM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLFNBQVM7QUFDakM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCx3QkFBd0IsU0FBUztBQUNqQztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25COztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsS0FBSyxJQUFJOztBQUUzQjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1FQUFtRTs7QUFFbkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQ0FBb0MsT0FBTztBQUMzQztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtR0FBbUc7O0FBRW5HO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBLHFDQUFxQzs7QUFFckMsMkJBQTJCOztBQUUzQjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBLGtJQUFrSTs7QUFFbEk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUix1REFBdUQ7O0FBRXZELG1GQUFtRjs7QUFFbkY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDs7QUFFQSxXQUFXLE9BQU87QUFDbEIseUNBQXlDO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFLG1GQUFtRjtBQUM5SjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjs7QUFFQTtBQUNBLG1HQUFtRztBQUNuRzs7QUFFQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RCw2Q0FBNkM7QUFDN0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBOztBQUVBLDREQUE0RDtBQUM1RDs7QUFFQSx1QkFBdUI7O0FBRXZCLHVCQUF1Qjs7QUFFdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEVBQTRFO0FBQzVFLElBQUk7OztBQUdKO0FBQ0EsbUNBQW1DOztBQUVuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdEO0FBQ0E7O0FBRUEsK0JBQStCOztBQUUvQjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLHVCQUF1Qjs7QUFFdkIsdURBQXVEOztBQUV2RDs7QUFFQSx3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaURBQWlEOztBQUVqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQjs7QUFFdEI7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSiwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0osMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DOztBQUVuQywyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixVQUFVO0FBQy9CO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSwyREFBMkQ7O0FBRTNELDRFQUE0RTtBQUM1RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsR0FBRztBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBLEdBQUcsR0FBRztBQUNOOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdILCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQSxtREFBbUQsaUVBQWlFO0FBQ3BIO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUNBQXFDO0FBQ3JDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQyxPQUFPO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQyxPQUFPO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQSxtR0FBbUc7QUFDbkc7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RDtBQUNBLDBCQUEwQjs7QUFFMUIsdUJBQXVCOztBQUV2QixzQkFBc0I7O0FBRXRCLHlCQUF5QjtBQUN6QjtBQUNBOztBQUVBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7O0FBRUEsNERBQTREO0FBQzVEO0FBQ0E7O0FBRUEsbUJBQW1COztBQUVuQix3QkFBd0I7O0FBRXhCLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CO0FBQ3BCO0FBQ0E7O0FBRUEsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0EsS0FBSzs7O0FBR0wsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DOztBQUVBLHNCQUFzQjtBQUN0Qjs7QUFFQSw0QkFBNEI7O0FBRTVCLDZCQUE2Qjs7QUFFN0IsaUNBQWlDO0FBQ2pDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDs7QUFFMUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9EQUFvRDtBQUNwRDtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEOztBQUVoRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkVBQTJFO0FBQzNFOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLDBFQUEwRTs7QUFFMUU7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQscUJBQXFCOztBQUVyQiwyQ0FBMkM7QUFDM0M7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7QUFDUCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvS0FBb0ssaUVBQWlFLEVBQUU7QUFDdk8sR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUxBQW1MLGlFQUFpRSxFQUFFO0FBQ3RQLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNI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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxzR0FBc0c7O0FBRXRHLGtCQUFrQixv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QUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsb0RBQW9ELFdBQVc7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLDJCQUEyQixhQUFhO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsV0FBVztBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsV0FBVztBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSw2Q0FBNkMsV0FBVztBQUN4RDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkNBQTZDLFdBQVc7QUFDeEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDZDQUE2QyxXQUFXO0FBQ3hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLG9CQUFvQixvQkFBb0I7QUFDeEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4RUFBOEUsYUFBYTtBQUMzRjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7O0FBRXhFLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5R0FBeUc7QUFDekc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osSUFBSTtBQUNKLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0osaUNBQWlDO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNEJBQTRCOztBQUU1QjtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0JBQWdCLGNBQWM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFD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QUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxrREFBa0QsMERBQTBELDJDQUEyQztBQUN2Sjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQyxJQUFJO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELDRDQUE0QyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVEOztBQUUvUCw4REFBOEQsc0VBQXNFLDhEQUE4RDs7QUFFbE07QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0IsMkJBQTJCO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsR0FBRztBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRCxrRkFBa0Y7O0FBRWxGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0gsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGtEQUFrRCwwREFBMEQsMkNBQTJDOztBQUV2SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0Q7O0FBRS9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVELDhDQUE4QyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVEOztBQUVqUSxnRUFBZ0Usd0VBQXdFLGdFQUFnRTs7QUFFeE07QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQsZ0RBQWdELFdBQVcsbUVBQW1FLHFGQUFxRiw0QkFBNEIsY0FBYyxTQUFTLGlDQUFpQyxnS0FBZ0ssMEJBQTBCOztBQUVqZSxvREFBb0QsZ0JBQWdCLGtFQUFrRSx3REFBd0QsNkRBQTZELHNEQUFzRDs7QUFFalQseUNBQXlDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjtBQUMzSztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3RUFBd0UsNEJBQTRCO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5Q0FBeUM7O0FBRXpDO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsZ0RBQWdELFdBQVcsbUVBQW1FLHFGQUFxRiw0QkFBNEIsY0FBYyxTQUFTLGlDQUFpQyxnS0FBZ0ssMEJBQTBCOztBQUVqZSxvREFBb0QsZ0JBQWdCLGtFQUFrRSx3REFBd0QsNkRBQTZELHNEQUFzRDs7QUFFalQseUNBQXlDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjs7QUFFM0ssOENBQThDLGdCQUFnQixrQkFBa0IsT0FBTywyQkFBMkIsd0RBQXdELGdDQUFnQyx1REFBdUQ7O0FBRWpRLGdFQUFnRSx3RUFBd0UsZ0VBQWdFO0FBQ3hNO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSx3QkFBd0I7O0FBRXhCO0FBQ0EsK0VBQStFLDRCQUE0QjtBQUMzRztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUZBQXVGLDhCQUE4QjtBQUNySDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSx1RkFBdUYsOEJBQThCO0FBQ3JIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIsNEJBQTRCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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NkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osd0NBQXdDLGFBQWE7OztBQUdyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxRkFBcUYsNEJBQTRCO0FBQ2pIO0FBQ0Esc0NBQXNDOztBQUV0Qyx1RkFBdUYsOEJBQThCO0FBQ3JIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3RkFBd0YsOEJBQThCO0FBQ3RIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7O0FBRXZEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNGQUFzRixnQ0FBZ0M7QUFDdEg7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFOztBQUVoRTtBQUNBLHdFQUF3RTs7QUFFeEUsMkZBQTJGLGdDQUFnQztBQUMzSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrR0FBa0csZ0NBQWdDO0FBQ2xJOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxzR0FBc0csZ0NBQWdDO0FBQ3RJOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdGQUFnRixnQ0FBZ0M7QUFDaEg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdGQUFnRixnQ0FBZ0M7QUFDaEg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FB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SjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0MsZUFBZTtBQUMvQzs7QUFFQSxrQ0FBa0Msd0JBQXdCO0FBQzFEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkMsU0FBUztBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBOztBQUVBLHdDQUF3QyxVQUFVO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9DQUFvQyxVQUFVO0FBQzlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsMEJBQTBCO0FBQzlDOztBQUVBLHNCQUFzQixtQkFBbUI7QUFDekM7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQsZ0RBQWdELFdBQVcsbUVBQW1FLHFGQUFxRiw0QkFBNEIsY0FBYyxTQUFTLGlDQUFpQyxnS0FBZ0ssMEJBQTBCOztBQUVqZSxvREFBb0QsZ0JBQWdCLGtFQUFrRSx3REFBd0QsNkRBQTZELHNEQUFzRDs7QUFFalQseUNBQXlDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjs7QUFFM0ssa0RBQWtELDBEQUEwRCwyQ0FBMkM7O0FBRXZKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLGdDQUFnQzs7O0FBR2hDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw0REFBNEQ7O0FBRTVEO0FBQ0E7O0FBRUEsc0ZBQXNGLDRCQUE0QjtBQUNsSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLENBQUM7O0FBRUQsZ0RBQWdELFdBQVcsbUVBQW1FLHFGQUFxRiw0QkFBNEIsY0FBYyxTQUFTLGlDQUFpQyxnS0FBZ0ssMEJBQTBCOztBQUVqZSxvREFBb0QsZ0JBQWdCLGtFQUFrRSx3REFBd0QsNkRBQTZELHNEQUFzRDs7QUFFalQseUNBQXlDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjs7QUFFM0ssa0RBQWtELDBEQUEwRCwyQ0FBMkM7O0FBRXZKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnRkFBZ0YsNEJBQTRCO0FBQzVHO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9CQUFvQixrQkFBa0I7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLHNDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrRkFBa0YsOEJBQThCO0FBQ2hIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDO0FBQzdDLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGtGQUFrRiw4QkFBOEI7QUFDaEg7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOElBQThJLGtCQUFrQjtBQUNoSztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQSxnREFBZ0QsV0FBVyxtRUFBbUUscUZBQXFGLDRCQUE0QixjQUFjLFNBQVMsaUNBQWlDLGdLQUFnSywwQkFBMEI7O0FBRWplLG9EQUFvRCxnQkFBZ0Isa0VBQWtFLHdEQUF3RCw2REFBNkQsc0RBQXNEOztBQUVqVCx5Q0FBeUMsdURBQXVELHVDQUF1QyxTQUFTLE9BQU8sb0JBQW9COztBQUUzSyw4Q0FBOEMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RDs7QUFFalEsZ0VBQWdFLHdFQUF3RSxnRUFBZ0U7O0FBRXhNLDBGQUEwRixlQUFlLGlEQUFpRCw4QkFBOEIsR0FBRyxxQ0FBcUMseUNBQXlDLDJDQUEyQyx3QkFBd0Isd0VBQXdFLG1EQUFtRCxTQUFTLDhDQUE4Qyx5RUFBeUUsZ0NBQWdDLG1DQUFtQywrQ0FBK0MsZUFBZTtBQUN4c0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUE2Qjs7O0FBRzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFVBQVU7QUFDdkIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QixjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFF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QUNBOztBQUVBLDBCQUEwQixrQkFBa0I7QUFDNUMsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBLHNDQUFzQyxtQkFBbUI7QUFDekQsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7O0FBRUEsa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGNBQWMsU0FBUztBQUN2QjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8saUlBQWlJLFFBQVEsWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLFVBQVUsWUFBWSxXQUFXLFVBQVUsS0FBSyxLQUFLLFlBQVksV0FBVyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxNQUFNLE1BQU0sWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksT0FBTyxVQUFVLFlBQVksV0FBVyxPQUFPLE9BQU8sVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsWUFBWSxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsTUFBTSxLQUFLLFVBQVUsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxLQUFLLEtBQUssVUFBVSxLQUFLLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsVUFBVSxLQUFLLEtBQUssVUFBVSxLQUFLLEtBQUssWUFBWSxXQUFXLEtBQUssS0FBSyxVQUFVLEtBQUssS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsWUFBWSxNQUFNLEtBQUssVUFBVSxVQUFVLFlBQVksTUFBTSxLQUFLLFlBQVksV0FBVyxVQUFVLE1BQU0sS0FBSyxVQUFVLFlBQVksTUFBTSxNQUFNLFlBQVksV0FBVyxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxLQUFLLE1BQU0sWUFBWSxXQUFXLEtBQUssS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLEtBQUssS0FBSyxVQUFVLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxLQUFLLEtBQUssWUFBWSxhQUFhLGFBQWEsTUFBTSxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxNQUFNLEtBQUssWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxZQUFZLE1BQU0sS0FBSyxVQUFVLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxZQUFZLE1BQU0sS0FBSyxZQUFZLFdBQVcsWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssVUFBVSxLQUFLLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxNQUFNLEtBQUssVUFBVSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sS0FBSyxZQUFZLGFBQWEsV0FBVyxLQUFLLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxhQUFhLFdBQVcsS0FBSyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLE9BQU8sVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsT0FBTyxRQUFRLFVBQVUsTUFBTSxRQUFRLFlBQVksYUFBYSxNQUFNLFFBQVEsWUFBWSxNQUFNLFFBQVEsWUFBWSxhQUFhLFdBQVcsS0FBSyxRQUFRLFlBQVksTUFBTSxRQUFRLFVBQVUsTUFBTSxRQUFRLFVBQVUsS0FBSyxRQUFRLFlBQVksYUFBYSxhQUFhLFdBQVcsS0FBSyxRQUFRLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLE1BQU0sUUFBUSxZQUFZLE1BQU0sUUFBUSxZQUFZLFdBQVcsS0FBSyxjQUFjLFlBQVksYUFBYSxXQUFXLEtBQUssY0FBYyxZQUFZLE1BQU0sUUFBUSxZQUFZLGFBQWEsYUFBYSxNQUFNLFFBQVEsWUFBWSxNQUFNLG9CQUFvQixhQUFhLE1BQU0sbUNBQW1DLGFBQWEsV0FBVyxLQUFLLFFBQVEsVUFBVSxVQUFVLEtBQUssUUFBUSxZQUFZLE1BQU0sUUFBUSxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsS0FBSyxLQUFLLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sT0FBTyxZQUFZLGFBQWEsYUFBYSxNQUFNLE9BQU8sVUFBVSxNQUFNLFVBQVUsWUFBWSxNQUFNLE9BQU8sWUFBWSxXQUFXLFVBQVUsTUFBTSxPQUFPLFlBQVksYUFBYSxXQUFXLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLE1BQU0sT0FBTyxVQUFVLE1BQU0sT0FBTyxVQUFVLFlBQVksT0FBTyxPQUFPLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxNQUFNLE9BQU8sWUFBWSxhQUFhLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxZQUFZLE1BQU0sT0FBTyxZQUFZLE1BQU0sT0FBTyxZQUFZLE1BQU0sT0FBTyxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLFdBQVcsVUFBVSxVQUFVLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxZQUFZLFdBQVcsWUFBWSxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxLQUFLLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsVUFBVSxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsV0FBVyxZQUFZLE1BQU0sT0FBTyxVQUFVLFlBQVksTUFBTSxLQUFLLE9BQU8sVUFBVSxZQUFZLE1BQU0sS0FBSyxNQUFNLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsV0FBVyxNQUFNLEtBQUssWUFBWSxhQUFhLFdBQVcsVUFBVSxVQUFVLFlBQVksV0FBVyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLDZDQUE2QyxvTUFBb00sdUJBQXVCLHdCQUF3Qiw4QkFBOEIsa0JBQWtCLG1CQUFtQixnQkFBZ0IsdUJBQXVCLGFBQWEsZUFBZSxHQUFHLDZCQUE2QiwwQkFBMEIsZUFBZSxjQUFjLEdBQUcsdUJBQXVCLGtFQUFrRSxzQkFBc0IsMkJBQTJCLGdCQUFnQiw4QkFBOEIsMEJBQTBCLDBCQUEwQix1QkFBdUIseUJBQXlCLEdBQUcsb0VBQW9FLG1CQUFtQixHQUFHLG1IQUFtSCxzQ0FBc0MsdUNBQXVDLEdBQUcsOEJBQThCLGVBQWUsbUJBQW1CLEdBQUcsd0RBQXdELG9CQUFvQixHQUFHLGdGQUFnRixrQkFBa0IsbUJBQW1CLEdBQUcsNkVBQTZFLGVBQWUsZ0JBQWdCLEdBQUcsK0JBQStCLHVCQUF1Qiw4QkFBOEIscUNBQXFDLG1DQUFtQyxtQkFBbUIsdUJBQXVCLEdBQUcsbUNBQW1DLHdCQUF3QixzQkFBc0IsdUJBQXVCLEdBQUcsOEVBQThFLDhCQUE4QixHQUFHLDZFQUE2RSxvQ0FBb0MsR0FBRywrVUFBK1UsMEJBQTBCLG1CQUFtQixHQUFHLHVHQUF1RyxrQkFBa0IsZ0JBQWdCLHNCQUFzQix3QkFBd0IsR0FBRyx3Q0FBd0MsZUFBZSxjQUFjLEdBQUcsb0NBQW9DLDRCQUE0Qix3QkFBd0IscUJBQXFCLEdBQUcsbUNBQW1DLHdCQUF3QixxQkFBcUIsa0JBQWtCLDRCQUE0Qix1QkFBdUIsb0JBQW9CLHVCQUF1QixhQUFhLGVBQWUsaUJBQWlCLGVBQWUsaUJBQWlCLGdCQUFnQix3QkFBd0IscUJBQXFCLEdBQUcsMkNBQTJDLGNBQWMsR0FBRyx1Q0FBdUMsZUFBZSxHQUFHLDhHQUE4RyxnQkFBZ0IsR0FBRyx3Q0FBd0MsdUJBQXVCLFdBQVcsbUJBQW1CLHNCQUFzQix1QkFBdUIsR0FBRyxpREFBaUQsYUFBYSxHQUFHLGlEQUFpRCxjQUFjLEdBQUcsaURBQWlELDBCQUEwQixHQUFHLHdDQUF3Qyx1QkFBdUIsY0FBYyxvQkFBb0IsYUFBYSxHQUFHLDRDQUE0QyxlQUFlLEdBQUcsb0RBQW9ELDZCQUE2QixlQUFlLEdBQUcsZ0RBQWdELGdCQUFnQixHQUFHLHdEQUF3RCw4QkFBOEIsZ0JBQWdCLEdBQUcsd0NBQXdDLGdCQUFnQixHQUFHLDZCQUE2QixtQkFBbUIsdUJBQXVCLEdBQUcsbUNBQW1DLGtCQUFrQixvQkFBb0IscUJBQXFCLEdBQUcsd0RBQXdELDBCQUEwQixnQkFBZ0IsZ0JBQWdCLEdBQUcsOEJBQThCLG1CQUFtQix1QkFBdUIsR0FBRyxxSEFBcUgsMEJBQTBCLGdCQUFnQixnQkFBZ0IsR0FBRyw2Q0FBNkMsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsNEJBQTRCLHFCQUFxQixHQUFHLDJFQUEyRSwwQkFBMEIsR0FBRyxtRkFBbUYsMEJBQTBCLEdBQUcsaUhBQWlILDBCQUEwQixzQkFBc0IsR0FBRyx1SEFBdUgsZ0JBQWdCLEdBQUcseVRBQXlULDZCQUE2QixjQUFjLEdBQUcsa0lBQWtJLCtCQUErQixHQUFHLHFIQUFxSCxxQkFBcUIsMEJBQTBCLEdBQUcsdUNBQXVDLGlCQUFpQixtQ0FBbUMsZ0JBQWdCLEdBQUcsd0RBQXdELG9CQUFvQiw4QkFBOEIsMEJBQTBCLHVCQUF1QixpQkFBaUIsV0FBVyxHQUFHLDZEQUE2RCx1QkFBdUIsc0JBQXNCLHVDQUF1QyxHQUFHLHlGQUF5RixnQkFBZ0IsdUJBQXVCLG1CQUFtQix1QkFBdUIsdUNBQXVDLEdBQUcsd0hBQXdILHFCQUFxQixjQUFjLHFDQUFxQyx1QkFBdUIscUJBQXFCLG9CQUFvQixnQkFBZ0IsNEJBQTRCLEdBQUcsNEpBQTRKLGlCQUFpQixzQkFBc0Isd0JBQXdCLEdBQUcsa0tBQWtLLG9CQUFvQiw4QkFBOEIsR0FBRyxzS0FBc0ssOEJBQThCLGlCQUFpQixzQkFBc0IsR0FBRyw0S0FBNEssOEJBQThCLEdBQUcsc0tBQXNLLGdCQUFnQixHQUFHLDRLQUE0SyxvQkFBb0Isa0NBQWtDLEdBQUcsb0NBQW9DLGdCQUFnQiwwQkFBMEIsa0JBQWtCLHdCQUF3Qix1QkFBdUIscUJBQXFCLEdBQUcsMkVBQTJFLG9CQUFvQixHQUFHLG1MQUFtTCwwQkFBMEIsOEJBQThCLEdBQUcsNENBQTRDLDBCQUEwQiw4QkFBOEIsZ0JBQWdCLEdBQUcsa0RBQWtELDhCQUE4QixHQUFHLHFEQUFxRCwwQkFBMEIsOEJBQThCLGdCQUFnQixHQUFHLDJEQUEyRCw4QkFBOEIsR0FBRyxrQ0FBa0Msd0JBQXdCLHdCQUF3QixHQUFHLDZCQUE2Qix3QkFBd0IsR0FBRyx5RkFBeUYsZ0JBQWdCLDBCQUEwQixrQkFBa0Isd0JBQXdCLHVCQUF1QixxQkFBcUIsR0FBRyw2SEFBNkgsb0JBQW9CLEdBQUcsbUpBQW1KLDBCQUEwQiw4QkFBOEIsR0FBRyx1SkFBdUosc0JBQXNCLEdBQUcsK0tBQStLLDBCQUEwQiw4QkFBOEIsZ0JBQWdCLEdBQUcsdU1BQXVNLDhCQUE4QixHQUFHLG1OQUFtTixtQkFBbUIsR0FBRyxtTkFBbU4saUJBQWlCLEdBQUcsbUtBQW1LLHVCQUF1QiwwQkFBMEIsOEJBQThCLGdCQUFnQixHQUFHLHVNQUF1TSx1QkFBdUIsaUJBQWlCLGNBQWMsZ0NBQWdDLDJCQUEyQixnQkFBZ0IsaUJBQWlCLHVCQUF1Qix3QkFBd0IsdUJBQXVCLGVBQWUsd0RBQXdELEdBQUcsMkxBQTJMLDhCQUE4QixHQUFHLCtOQUErTix3QkFBd0IsZUFBZSxHQUFHLDZnQkFBNmdCLDBCQUEwQiw4QkFBOEIsZ0JBQWdCLEdBQUcscWxCQUFxbEIsOEJBQThCLEdBQUcsdU1BQXVNLDBCQUEwQiw4QkFBOEIsd0JBQXdCLEdBQUcsK05BQStOLDhCQUE4QixHQUFHLCsxQkFBKzFCLDhDQUE4QyxHQUFHLHd2RUFBd3ZFLDhCQUE4QixnQkFBZ0IsR0FBRyxtS0FBbUssb0JBQW9CLGdCQUFnQixHQUFHLDJMQUEyTCxrQ0FBa0MsR0FBRyx1TUFBdU0sdUJBQXVCLGdCQUFnQixjQUFjLGdDQUFnQywyQkFBMkIsZ0JBQWdCLGlCQUFpQix1QkFBdUIsd0JBQXdCLHVCQUF1QixlQUFlLHdEQUF3RCxHQUFHLHdDQUF3Qyx1QkFBdUIsMEJBQTBCLGdCQUFnQixHQUFHLHVFQUF1RSx1QkFBdUIsb0JBQW9CLDRCQUE0QixHQUFHLGlEQUFpRCwrQkFBK0IsR0FBRyxzSEFBc0gsa0NBQWtDLDBCQUEwQix1QkFBdUIsR0FBRyxzSUFBc0ksb0JBQW9CLEdBQUcsa2lCQUFraUIsOEJBQThCLEdBQUcsd0pBQXdKLDhCQUE4QixpQkFBaUIsV0FBVyxHQUFHLG1IQUFtSCw4QkFBOEIsdUJBQXVCLGVBQWUsY0FBYyxjQUFjLGVBQWUsdUJBQXVCLDBCQUEwQiw4QkFBOEIsR0FBRyxtSUFBbUksb0JBQW9CLEdBQUcscUpBQXFKLGtCQUFrQix1QkFBdUIsR0FBRyw2R0FBNkcsc0JBQXNCLGdCQUFnQixtQkFBbUIsc0JBQXNCLHVCQUF1QixHQUFHLHFKQUFxSixtQ0FBbUMsb0NBQW9DLEdBQUcsa0pBQWtKLDhCQUE4QiwyQkFBMkIsMEJBQTBCLHNCQUFzQixzQ0FBc0MsdUNBQXVDLEdBQUcsNkhBQTZILDJCQUEyQixHQUFHLHVRQUF1USxpQ0FBaUMsR0FBRyx1UUFBdVEsOEJBQThCLEdBQUcseUlBQXlJLHVCQUF1QixlQUFlLEdBQUcsbUNBQW1DLG9CQUFvQixrQ0FBa0MsY0FBYyxlQUFlLHVCQUF1Qix1QkFBdUIsV0FBVyxhQUFhLGlCQUFpQix3QkFBd0IsMkJBQTJCLEdBQUcsd0NBQXdDLG9CQUFvQiw4QkFBOEIsZ0JBQWdCLHVCQUF1QixpQkFBaUIsZ0JBQWdCLGlCQUFpQixvQkFBb0IsbUJBQW1CLHVCQUF1Qix3QkFBd0IsMkJBQTJCLG1CQUFtQixHQUFHLDJDQUEyQyxvQkFBb0IsR0FBRyxrREFBa0Qsb0JBQW9CLDJCQUEyQixHQUFHLHFDQUFxQyx3QkFBd0Isa0NBQWtDLG9CQUFvQix1QkFBdUIsc0JBQXNCLG1CQUFtQixnQkFBZ0IsR0FBRywrQkFBK0Isb0JBQW9CLGlCQUFpQixrQkFBa0IseUNBQXlDLFlBQVksV0FBVyw0QkFBNEIsd0JBQXdCLGtCQUFrQix3QkFBd0IsR0FBRyxxS0FBcUssZ0JBQWdCLHNCQUFzQixHQUFHLGtEQUFrRCwyS0FBMkssa0JBQWtCLHdCQUF3QixLQUFLLEdBQUcseUhBQXlILHVCQUF1QixHQUFHLDJDQUEyQyxtQkFBbUIsbUJBQW1CLDBCQUEwQix5QkFBeUIsaUJBQWlCLEdBQUcsa0NBQWtDLHVCQUF1Qix5QkFBeUIsY0FBYyxnQkFBZ0IsaUJBQWlCLHFCQUFxQixlQUFlLGVBQWUsd0JBQXdCLEdBQUcsc0NBQXNDLGVBQWUsZ0JBQWdCLDZCQUE2QixHQUFHLHFCQUFxQjtBQUMxdDZCO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4d0J2QztBQUMwRztBQUNqQjtBQUNPO0FBQ2hHLDRDQUE0QyxxbERBQXl4QjtBQUNyMEIsNENBQTRDLGluREFBdXlCO0FBQ24xQiw0Q0FBNEMscWdCQUFpUDtBQUM3Uiw4QkFBOEIsbUZBQTJCLENBQUMsNEZBQXFDO0FBQy9GLHlDQUF5QyxzRkFBK0I7QUFDeEUseUNBQXlDLHNGQUErQjtBQUN4RSx5Q0FBeUMsc0ZBQStCO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQixtQkFBbUI7QUFDbkIsdUJBQXVCO0FBQ3ZCLHlCQUF5QjtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixrQ0FBa0M7QUFDbEMsZUFBZTtBQUNmLG1JQUFtSTtBQUNuSSxpQ0FBaUM7QUFDakMsbUNBQW1DO0FBQ25DLDRDQUE0QztBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYix3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYixrQkFBa0I7QUFDbEIseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUhBQW1IO0FBQ25ILGlDQUFpQztBQUNqQyxtQ0FBbUM7QUFDbkMsa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQix5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QixrQ0FBa0M7QUFDbEMsb0NBQW9DO0FBQ3BDLG1CQUFtQjtBQUNuQix3QkFBd0I7QUFDeEIsd0JBQXdCO0FBQ3hCLDJCQUEyQjtBQUMzQixrQkFBa0I7QUFDbEIsYUFBYTtBQUNiLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsaUNBQWlDO0FBQ2pDLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakMsd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7QUFDOUIsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZCxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLG1DQUFtQztBQUMvRCw0QkFBNEIsbUNBQW1DO0FBQy9EO0FBQ0E7QUFDQSw0QkFBNEIsbUNBQW1DO0FBQy9ELDRCQUE0QixtQ0FBbUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekMsZ0JBQWdCLG1DQUFtQztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUIseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxpRkFBaUYsWUFBWSxNQUFNLE9BQU8scUJBQXFCLG9CQUFvQixxQkFBcUIscUJBQXFCLE1BQU0sTUFBTSxXQUFXLE1BQU0sWUFBWSxNQUFNLE1BQU0scUJBQXFCLCtCQUErQixvQkFBb0IscUJBQXFCLHFCQUFxQixxQkFBcUIscUJBQXFCLE1BQU0sT0FBTyxNQUFNLEtBQUssb0JBQW9CLHFCQUFxQixNQUFNLFFBQVEsTUFBTSxLQUFLLG9CQUFvQixvQkFBb0IscUJBQXFCLE1BQU0sTUFBTSxNQUFNLEtBQUssV0FBVyxXQUFXLE1BQU0sTUFBTSxNQUFNLFVBQVUsV0FBVyxXQUFXLE1BQU0sTUFBTSxNQUFNLEtBQUssVUFBVSxXQUFXLE1BQU0sTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLFNBQVMsTUFBTSxRQUFRLHFCQUFxQixxQkFBcUIscUJBQXFCLG9CQUFvQixNQUFNLE1BQU0sTUFBTSxLQUFLLFVBQVUsTUFBTSxNQUFNLE1BQU0sTUFBTSxVQUFVLFVBQVUsV0FBVyxXQUFXLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sUUFBUSxNQUFNLEtBQUssb0JBQW9CLHFCQUFxQixxQkFBcUIsTUFBTSxRQUFRLE1BQU0sU0FBUyxxQkFBcUIscUJBQXFCLHFCQUFxQixvQkFBb0IscUJBQXFCLHFCQUFxQixxQkFBcUIsb0JBQW9CLG9CQUFvQixvQkFBb0IsTUFBTSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sT0FBTyxNQUFNLFFBQVEscUJBQXFCLHFCQUFxQixxQkFBcUIsTUFBTSxNQUFNLE1BQU0sS0FBSyxVQUFVLE1BQU0sTUFBTSxNQUFNLEtBQUssV0FBVyxNQUFNLE1BQU0sTUFBTSxLQUFLLFdBQVcsTUFBTSxNQUFNLE1BQU0sTUFBTSxVQUFVLE1BQU0sT0FBTyxNQUFNLEtBQUsscUJBQXFCLHFCQUFxQixNQUFNLE1BQU0sTUFBTSxLQUFLLFdBQVcsTUFBTSxPQUFPLE1BQU0sS0FBSyxxQkFBcUIsb0JBQW9CLE1BQU0sTUFBTSxNQUFNLEtBQUssV0FBVyxNQUFNLE1BQU0sTUFBTSxpQkFBaUIsVUFBVSxNQUFNLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sT0FBTyxXQUFXLFVBQVUsVUFBVSxNQUFNLE1BQU0sS0FBSyxLQUFLLFVBQVUsTUFBTSxNQUFNLE1BQU0sS0FBSyxXQUFXLE1BQU0sT0FBTyxNQUFNLE1BQU0sb0JBQW9CLG9CQUFvQixNQUFNLE1BQU0sTUFBTSxNQUFNLFVBQVUsTUFBTSxNQUFNLEtBQUssS0FBSyxVQUFVLE1BQU0sUUFBUSxNQUFNLFlBQVksb0JBQW9CLHFCQUFxQixNQUFNLE1BQU0sTUFBTSxNQUFNLFVBQVUsVUFBVSxNQUFNLFdBQVcsS0FBSyxVQUFVLE1BQU0sTUFBTSxXQUFXLEtBQUssTUFBTSxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssTUFBTSxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssS0FBSyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU0sS0FBSyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsS0FBSyxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsS0FBSyxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLEtBQUssS0FBSyxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxNQUFNLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxLQUFLLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxPQUFPLFlBQVksYUFBYSxhQUFhLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sWUFBWSxNQUFNLE1BQU0sS0FBSyxNQUFNLFlBQVksWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxRQUFRLEtBQUssTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxNQUFNLE1BQU0sT0FBTyxXQUFXLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxZQUFZLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxNQUFNLE1BQU0sT0FBTyxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sUUFBUSxZQUFZLE1BQU0sTUFBTSxPQUFPLEtBQUssWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE9BQU8sT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLE1BQU0sTUFBTSxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE9BQU8sS0FBSyxLQUFLLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxRQUFRLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sT0FBTyxNQUFNLFdBQVcsYUFBYSxNQUFNLE9BQU8sT0FBTyxLQUFLLEtBQUssTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLE1BQU0sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sV0FBVyxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLFlBQVksWUFBWSxhQUFhLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxZQUFZLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFNBQVMsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxNQUFNLE9BQU8sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLFFBQVEsS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU8sS0FBSyxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLFlBQVksWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLFFBQVEsTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE1BQU0sS0FBSyxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLFFBQVEsWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGdCQUFnQixNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxRQUFRLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFFBQVEsV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxTQUFTLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sU0FBUyxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxPQUFPLE1BQU0sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxZQUFZLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxZQUFZLFlBQVksYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sU0FBUyxZQUFZLFlBQVksWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU8sTUFBTSxNQUFNLE9BQU8sTUFBTSxNQUFNLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxRQUFRLFlBQVksTUFBTSxNQUFNLFFBQVEsWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsTUFBTSxPQUFPLGFBQWEsYUFBYSxXQUFXLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLFNBQVMsWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxRQUFRLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsWUFBWSxNQUFNLE1BQU0sT0FBTyxLQUFLLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxRQUFRLE1BQU0sTUFBTSxPQUFPLE1BQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxZQUFZLE9BQU8sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLE9BQU8sWUFBWSxNQUFNLFVBQVUsTUFBTSxLQUFLLHdCQUF3Qix1QkFBdUIsT0FBTyxZQUFZLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsS0FBSyxLQUFLLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxhQUFhLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sYUFBYSxNQUFNLHdCQUF3Qix5QkFBeUIsT0FBTyxZQUFZLE1BQU0sVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sT0FBTyxLQUFLLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxNQUFNLE9BQU8sTUFBTSxXQUFXLFlBQVksTUFBTSxPQUFPLE1BQU0sV0FBVyxZQUFZLE1BQU0sT0FBTyxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxXQUFXLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0s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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLGdHQUFnRyxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsTUFBTSxPQUFPLFdBQVcsTUFBTSxRQUFRLFVBQVUsVUFBVSxZQUFZLGFBQWEsV0FBVyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsTUFBTSxLQUFLLFlBQVksYUFBYSxPQUFPLFFBQVEsWUFBWSxhQUFhLE9BQU8sUUFBUSxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksV0FBVyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksTUFBTSxLQUFLLFVBQVUsWUFBWSxRQUFRLEtBQUssWUFBWSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxXQUFXLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLE9BQU8sWUFBWSxNQUFNLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxXQUFXLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsV0FBVyxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxXQUFXLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLFdBQVcsWUFBWSxPQUFPLE9BQU8sYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxLQUFLLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLE1BQU0sTUFBTSxLQUFL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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sMkZBQTJGLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxXQUFXLFVBQVUsVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxXQUFXLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxXQUFXLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksV0FBVyxVQUFVLFVBQVUsWUFBWSxPQUFPLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssTUFBTSxPQUFPLGFBQWEsV0FBVyxZQUFZLGFBQWEsV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxNQUFNLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxPQUFPLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxNQUFNLFlBQVksT0FBTyxNQUFNLFlBQVksT0FBTyxNQUFNLFlBQVksT0FBTyxNQUFNLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxVQUFVLFlBQVksV0FBVyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFlBQVksV0FBVyxVQUFVLE1BQU0sS0FBSyxZQUFZLFdBQVcsVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxPQUFPLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksYUFBYSxXQUFXLFlB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YSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsK0NBQStDLGlCQUFpQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Qs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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdEtEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDakVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNyTEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ2pFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0SUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzlHRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQy9ERDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3pGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7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QUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0SUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNwRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RJRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDcElEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN4R0Q7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ2xMRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3JGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzVIRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztB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ckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3BIRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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RCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ2pMRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM1RkQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDaEVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzdERDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7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QUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDN0dEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxJQUFJLEtBQTREO0FBQ2hFLElBQUksQ0FDeUI7QUFDN0IsQ0FBQyxzQkFBc0I7O0FBRXZCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFlBQVk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLFNBQVM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3Qix5QkFBeUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixZQUFZO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQsc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsSUFBSTtBQUN4QjtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdHQUF3RyxJQUFJLHdCQUF3QixJQUFJLHVEQUF1RCxJQUFJO0FBQ25NLHFFQUFxRSxJQUFJO0FBQ3pFLDRCQUE0QjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkMsWUFBWTtBQUN2RDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsWUFBWTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEMsSUFBSTs7QUFFaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGtDQUFrQztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsRUFBRTtBQUN2QixxQkFBcUIsRUFBRTtBQUN2QiwwQkFBMEIsRUFBRTtBQUM1QjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsSUFBSTtBQUM1Qix3QkFBd0IsSUFBSTtBQUM1Qiw2QkFBNkIsSUFBSTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxJQUFJO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixNQUFNLHdFQUF3RSxNQUFNLG1CQUFtQixNQUFNLHFCQUFxQixNQUFNLEVBQUUsSUFBSTtBQUNqSztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSx3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0JBQW9CO0FBQzVDO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLE9BQU87QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixPQUFPO0FBQzNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0I7QUFDcEIsMkJBQTJCO0FBQzNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixVQUFVO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsU0FBTztBQUN4QyxnQkFBZ0IsOEVBQWUsSUFBVyxPQUFPLENBQUM7QUFDbEQ7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsRUFBRSxJQUFJLEVBQUU7QUFDcEM7QUFDQSw0QkFBNEIsRUFBRSxJQUFJLEVBQUU7QUFDcEM7QUFDQTtBQUNBLHFDQUFxQyxFQUFFO0FBQ3ZDLCtCQUErQixFQUFFO0FBQ2pDLGlDQUFpQyxFQUFFO0FBQ25DLCtCQUErQixFQUFFO0FBQ2pDLDZCQUE2QixFQUFFLElBQUksRUFBRTtBQUNyQyw0QkFBNEIsRUFBRTtBQUM5QixtQ0FBbUMsR0FBRztBQUN0Qyw2QkFBNkIsRUFBRTtBQUMvQiwrQkFBK0IsRUFBRSxJQUFJLEVBQUU7QUFDdkMsOEJBQThCLEVBQUUsSUFBSSxFQUFFO0FBQ3RDLDRCQUE0QixFQUFFO0FBQzlCLDJCQUEyQixFQUFFO0FBQzdCLHlCQUF5QixFQUFFO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELElBQUksMERBQTBELElBQUkscUVBQXFFLEVBQUU7QUFDak07QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDLE9BQU87QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxPQUFPO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsK0JBQStCO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLG1DQUFtQyxpQkFBaUI7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNEdBQTRHO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLHNCQUFzQjtBQUMxRDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxzQkFBc0I7QUFDMUQ7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxPQUFPO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDLE9BQU87QUFDNUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxPQUFPO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLE9BQU87QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLE9BQU87QUFDNUM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQyxPQUFPO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUIsbUJBQW1CO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixtQkFBbUI7QUFDekM7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9COztBQUVwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EOztBQUVuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxzQkFBc0I7O0FBRXRC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O0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEIsd0JBQXdCOztBQUV4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QUFDQTs7QUFFQSx3QkFBd0I7QUFDeEIsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjs7QUFFL0IsNEJBQTRCO0FBQzVCLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FB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QSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkZBQTZGLGFBQWE7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsUUFBUTtBQUNyQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHFCQUFxQixZQUFZO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxlQUFlLGtCQUFlOzs7Ozs7Ozs7OztBQzFmakI7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2YsOENBQThDLG1CQUFPLENBQUMsc0hBQStDO0FBQ3JHLDBDQUEwQyxtQkFBTyxDQUFDLHNFQUFlO0FBQ2pFLG9CQUFvQixtQkFBTyxDQUFDLHdFQUFnQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEVBQUU7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksRUFBRTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEVBQUU7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksRUFBRTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksRUFBRTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEVBQUU7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxFQUFFO0FBQ047QUFDQTtBQUNBO0FBQ0EsYUFBYSxpQkFBaUI7QUFDOUIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZGQUE2RixhQUFhO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsZUFBZSxrQkFBZTs7Ozs7Ozs7Ozs7QUM5SWpCOztBQUViLDZCQUE2QixtQkFBTyxDQUFDLG9KQUE4RDtBQUNuRyw2QkFBNkIsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDM0Y7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBZTtBQUNmLHNDQUFzQyxtQkFBTyxDQUFDLHNIQUErQztBQUM3RixrQ0FBa0MsbUJBQU8sQ0FBQyw4R0FBMkM7QUFDckYsbUNBQW1DLG1CQUFPLENBQUMsOEhBQW1EO0FBQzlGLHFDQUFxQyxtQkFBTyxDQUFDLHNJQUF1RDtBQUNwRyx1Q0FBdUMsbUJBQU8sQ0FBQywwSUFBeUQ7QUFDeEcseUNBQXlDLG1CQUFPLENBQUMsZ0pBQTREO0FBQzdHLHNDQUFzQyxtQkFBTyxDQUFDLG9JQUFzRDtBQUNwRyxrQ0FBa0MsbUJBQU8sQ0FBQyxnSUFBb0Q7QUFDOUYscUNBQXFDLG1CQUFPLENBQUMsc0lBQXVEO0FBQ3BHLG1DQUFtQyxtQkFBTyxDQUFDLDRIQUFrRDtBQUM3RixtQ0FBbUMsbUJBQU8sQ0FBQyxrSUFBcUQ7QUFDaEcsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakUsdURBQXVELG1CQUFPLENBQUMsZ0dBQTRCO0FBQzNGLHlDQUF5QyxtQkFBTyxDQUFDLG9FQUFjO0FBQy9ELDJCQUEyQixtQkFBTyxDQUFDLHNGQUF1QjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0IsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQyx3QkFBd0I7QUFDeEIsZ0NBQWdDO0FBQ2hDO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixtQ0FBbUMsRUFBRSxpQkFBaUIsR0FBRyxRQUFRO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBLGFBQWEsMEJBQTBCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsZ0JBQWdCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdB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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLEtBQUs7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTiw2QkFBNkIsVUFBVTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QixjQUFjLFdBQVc7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCLGNBQWMsV0FBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsV0FBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsV0FBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkIsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFlOzs7Ozs7Ozs7OztBQy9qQmpCOztBQUViLDZCQUE2QixtQkFBTyxDQUFDLG9KQUE4RDtBQUNuRyw2QkFBNkIsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDM0Y7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBZTtBQUNmLHNDQUFzQyxtQkFBTyxDQUFDLHNIQUErQztBQUM3Rix3Q0FBd0MsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDdEcsOENBQThDLG1CQUFPLENBQUMsc0hBQStDO0FBQ3JHLDBDQUEwQyxtQkFBTyxDQUFDLHNFQUFlO0FBQ2pFLHFDQUFxQyxtQkFBTyxDQUFDLDREQUFVO0FBQ3ZELHFDQUFxQyxtQkFBTyxDQUFDLDREQUFVO0FBQ3ZELHFDQUFxQyxtQkFBTyxDQUFDLDREQUFVO0FBQ3ZELHlDQUF5QyxtQkFBTyxDQUFDLG9FQUFjO0FBQy9ELHNDQUFzQyxtQkFBTyxDQUFDLDhEQUFXO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDak5qQjs7QUFFYiw4QkFBOEIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDcEcsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0Qsa0JBQWU7QUFDZixzQ0FBc0MsbUJBQU8sQ0FBQywwSUFBeUQ7QUFDdkcsOENBQThDLG1CQUFPLENBQUMsb0pBQThEO0FBQ3BILDhDQUE4QyxtQkFBTyxDQUFDLHNIQUErQztBQUNyRywwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsZUFBZTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7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Q2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQSx3RUFBd0UsYUFBYTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG9CQUFvQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSx3Q0FBd0M7QUFDckQsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsd0NBQXdDO0FBQ3JELGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQix5QkFBeUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVUsRUFBRTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVLEVBQUU7QUFDWjtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHdCQUF3QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsb0JBQW9CO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHdCQUF3QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxXQUFXO0FBQ3hCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxXQUFXO0FBQ3hCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGdCQUFnQjtBQUM3QixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsaUJBQWlCO0FBQzlCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsR0FBRztBQUNoQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLEdBQUc7QUFDaEIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLE9BQU87QUFDcEIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsT0FBTztBQUNwQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxlQUFlO0FBQzVCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGlCQUFpQjtBQUM5QixhQUFhLFFBQVE7QUFDckIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLGFBQWE7QUFDMUIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsYUFBYTtBQUMxQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLGFBQWE7QUFDMUIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLDBDQUEwQztBQUNuRjtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QixhQUFhLFNBQVM7QUFDdEIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxPQUFPO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGdCQUFnQjtBQUM3QixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGdCQUFnQjtBQUM3QixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGdCQUFnQjtBQUM3QixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGdCQUFnQjtBQUM3QixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGdCQUFnQjtBQUM3QjtBQUNBLGFBQWEsZ0JBQWdCO0FBQzdCO0FBQ0EsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGdCQUFnQjtBQUM3QixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxtQkFBbUI7QUFDaEM7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLGFBQWE7QUFDckY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLG1CQUFtQjtBQUNoQztBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFLGVBQWU7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUJBQW1CO0FBQ2hDO0FBQ0EsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRSxlQUFlO0FBQzFGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxtQkFBbUI7QUFDaEM7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRSxlQUFlO0FBQzFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixhQUFhO0FBQ3RDO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQSxhQUFhLHlCQUF5QjtBQUN0QyxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBLDJFQUEyRSxlQUFlO0FBQzFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx5QkFBeUI7QUFDdEMsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsZUFBZTtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEseUJBQXlCO0FBQ3RDLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0EsMkVBQTJFLGVBQWU7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx5QkFBeUI7QUFDdEMsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQSwyRUFBMkUsZUFBZTtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxnQ0FBZ0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGdCQUFnQjtBQUM3QjtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0EsOEVBQThFLGVBQWU7QUFDN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxnQkFBZ0I7QUFDN0I7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBLGlGQUFpRixpQkFBaUI7QUFDbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxnQkFBZ0I7QUFDN0I7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBLGlGQUFpRixpQkFBaUI7QUFDbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFlOzs7Ozs7Ozs7OztBQ25pRWpCOztBQUViLDZCQUE2QixtQkFBTyxDQUFDLG9KQUE4RDtBQUNuRyw2QkFBNkIsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDM0Y7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBZTtBQUNmLHNDQUFzQyxtQkFBTyxDQUFDLG9JQUFzRDtBQUNwRyw4Q0FBOEMsbUJBQU8sQ0FBQyxzSEFBK0M7QUFDckcsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxzQkFBc0I7QUFDbkMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHNCQUFzQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFlOzs7Ozs7Ozs7OztBQ3ZKakI7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2YsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakUsdUNBQXVDLG1CQUFPLENBQUMsZ0VBQVk7QUFDM0QseUNBQXlDLG1CQUFPLENBQUMsb0VBQWM7QUFDL0QsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsV0FBVztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSx1QkFBdUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDeElqQjs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkcsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0Qsa0JBQWU7QUFDZixzQ0FBc0MsbUJBQU8sQ0FBQywwSUFBeUQ7QUFDdkcsOENBQThDLG1CQUFPLENBQUMsc0hBQStDO0FBQ3JHLDBDQUEwQyxtQkFBTyxDQUFDLHNFQUFlO0FBQ2pFLDBDQUEwQyxtQkFBTyxDQUFDLHNFQUFlO0FBQ2pFLHVDQUF1QyxtQkFBTyxDQUFDLGdFQUFZO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLG1DQUFtQyxZQUFZO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0JBQW9CO0FBQ2pDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsTUFBTTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsUUFBUTtBQUM3QixlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBLHFDQUFxQyxZQUFZO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtDQUFrQywyRkFBMkY7QUFDN0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixZQUFZO0FBQ1o7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzREFBYztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0Msa0RBQWU7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGtEQUFlO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGtEQUFlO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxnREFBYTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxnREFBYTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxnREFBYTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDakM7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ3FDO0FBQ3RDO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNnQztBQUNqQztBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDOEI7QUFDL0I7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ2lDO0FBQ2xDO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQzZCO0FBQzlCO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQzBCO0FBQzNCO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNpQztBQUNsQztBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDZ0M7QUFDakM7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ3VDO0FBQ3hDO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNnQztBQUNqQztBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDcUM7QUFDdEM7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQzZCO0FBQzlCO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNnQztBQUNqQztBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0Esc0RBQXNELHFEQUFhO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUM4QjtBQUMvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvVHlCO0FBQ2lDO0FBQ0w7QUFDVTtBQUNKO0FBQ1k7QUFDWDtBQUNFO0FBQ1E7QUFDUTtBQUNLO0FBQ0o7QUFDWTtBQUNQO0FBQ2pCO0FBQ0Y7QUFDUztBQUNxRTtBQUNwRjtBQUNKO0FBQ0k7QUFDQTtBQUNNO0FBQ1Y7QUFDQTtBQUNFO0FBQ0Y7QUFDRjtBQUNvQjtBQUNkO0FBQ007QUFDRDtBQUNZO0FBQ0U7QUFDSjtBQUNSO0FBQ0E7QUFDTTtBQUNQO0FBQ1U7QUFDTDtBQUNZO0FBQ3hCO0FBQ29CO0FBQ3hCO0FBQ3pCO0FBQ0Y7QUFDM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9DMkM7QUFDRjtBQUNBO0FBQ0k7QUFDMEM7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxzREFBc0Q7QUFDaEQ7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw0Q0FBNEM7QUFDdEM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxvQ0FBb0M7QUFDOUI7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsd0JBQXdCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyx3REFBTztBQUNoRCxpQ0FBaUMsd0RBQU87QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsd0RBQU87QUFDaEQsaUNBQWlDLHdEQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLHdEQUFPO0FBQ3JELHNDQUFzQyx5REFBUTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLHdEQUFPO0FBQ2hELGlDQUFpQywwREFBUztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQywwREFBUztBQUMvQyx3Q0FBd0MsMERBQVM7QUFDakQsOEJBQThCLHdCQUF3QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix3REFBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHdEQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix3REFBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHdEQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isd0RBQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHdEQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsOENBQThDO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEscURBQWE7QUFDckIsbUJBQW1CLHdEQUFPO0FBQzFCLHNCQUFzQix3REFBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixnQ0FBZ0M7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxxREFBYTtBQUNyQix3QkFBd0Isd0RBQU87QUFDL0Isc0JBQXNCLHdEQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDRCQUE0QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHFEQUFhO0FBQ3JCLHNCQUFzQix3REFBTztBQUM3QixzQkFBc0Isd0RBQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isc0JBQXNCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEscURBQWE7QUFDckIsa0JBQWtCLHdEQUFPO0FBQ3pCLHNCQUFzQix3REFBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix3REFBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixjQUFjO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsa0JBQWtCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsa0JBQWtCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsV0FBVztBQUNsRTtBQUNBO0FBQ0E7QUFDQSxRQUFRLG9EQUFZO0FBQ3BCO0FBQ0Esc0JBQXNCLHdEQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxtREFBVztBQUNuQixRQUFRLHFEQUFhO0FBQ3JCO0FBQ0Esc0JBQXNCLHdEQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxpRUFBZSxpQkFBaUIsRUFBQztBQUNqQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxZmtEO0FBQ2Q7QUFDQTtBQUNRO0FBQ1k7QUFDeEQ7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQSx5REFBeUQscURBQWM7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQSxvREFBb0QscURBQWM7QUFDbEU7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdFQUEyQjtBQUNqRCx3Q0FBd0Msa0RBQVM7QUFDakQsd0NBQXdDLGtEQUFTO0FBQ2pELHlDQUF5QyxrREFBUztBQUNsRCx5Q0FBeUMsa0RBQVM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFdBQVc7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFdBQVc7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxXQUFXO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix5REFBUztBQUNwQywyQkFBMkIseURBQVM7QUFDcEMsNkNBQTZDLFdBQVc7QUFDeEQ7QUFDQSwrQkFBK0IseURBQVM7QUFDeEM7QUFDQSwyQkFBMkIseURBQVM7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFdBQVc7QUFDeEQ7QUFDQSw4QkFBOEIsa0RBQVM7QUFDdkM7QUFDQSw4QkFBOEIsa0RBQVM7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0EsQ0FBQyxDQUFDLGtEQUFTO0FBQ1gsaUVBQWUsUUFBUSxFQUFDO0FBQ3hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEhrQztBQUNrQjtBQUNoQjtBQUNRO0FBQzVDO0FBQ0E7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDREQUF1QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IseURBQVM7QUFDeEMsK0JBQStCLHlEQUFTO0FBQ3hDLCtCQUErQix5REFBUztBQUN4QywrQkFBK0IseURBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHlEQUFTO0FBQ3hDLCtCQUErQix5REFBUztBQUN4QywrQkFBK0IseURBQVM7QUFDeEMsK0JBQStCLHlEQUFTO0FBQ3hDLCtCQUErQix5REFBUztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsa0RBQVM7QUFDWCxpRUFBZSxPQUFPLEVBQUM7QUFDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakRrRDtBQUNsQjtBQUNBO0FBQ0k7QUFDUTtBQUM1QztBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBLHNCQUFzQixnREFBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELGdEQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHVCQUF1QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxnREFBTztBQUNwRCw4REFBOEQscURBQWM7QUFDNUUsc0JBQXNCLGdEQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix1QkFBdUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsZ0RBQU87QUFDcEQseURBQXlELHFEQUFjO0FBQ3ZFLHNCQUFzQixnREFBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0Esa0JBQWtCLGdEQUFPO0FBQ3pCO0FBQ0Esa0JBQWtCLGdEQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxXQUFXO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsV0FBVztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsV0FBVztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix5REFBUztBQUNwQywyQkFBMkIseURBQVM7QUFDcEMsMkJBQTJCLHlEQUFTO0FBQ3BDO0FBQ0EsZ0RBQWdELFdBQVc7QUFDM0Q7QUFDQTtBQUNBLCtCQUErQix5REFBUztBQUN4QztBQUNBLCtCQUErQix5REFBUztBQUN4QztBQUNBLDJCQUEyQix5REFBUztBQUNwQywyQkFBMkIseURBQVM7QUFDcEM7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxrREFBUztBQUNYLGlFQUFlLE9BQU8sRUFBQztBQUN2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2SWtDO0FBQ0U7QUFDUTtBQUN3RztBQUM5RjtBQUN0RDtBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxtREFBVztBQUN2QixtQkFBbUIsbURBQVc7QUFDOUIsZUFBZSw0REFBb0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlEQUFTO0FBQzVCO0FBQ0Esc0JBQXNCLDhEQUF5QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIseURBQVM7QUFDcEMsa0JBQWtCLDREQUFvQjtBQUN0QywyQkFBMkIseURBQVM7QUFDcEM7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBLHNCQUFzQixtREFBVztBQUNqQztBQUNBLGdEQUFnRCxXQUFXO0FBQzNELG1CQUFtQiw4REFBc0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsa0RBQVM7QUFDWCxpRUFBZSxZQUFZLEVBQUM7QUFDNUI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkVrQztBQUNFO0FBQ3BDO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQSxDQUFDLENBQUMsa0RBQVM7QUFDWCxpRUFBZSxnQkFBZ0IsRUFBQztBQUNoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0JrQztBQUNrQjtBQUNoQjtBQUNRO0FBQ007QUFDNEM7QUFDOUY7QUFDQSxzQ0FBc0MsRUFBRSx5QkFBeUIsT0FBTyx1REFBZSxRQUFRO0FBQy9GO0FBQ0E7QUFDQSx1QkFBdUIseURBQVM7QUFDaEMsb0JBQW9CLHlEQUFTO0FBQzdCLFNBQVMsMERBQVc7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDREQUF1QjtBQUM3QztBQUNBO0FBQ0EsNkNBQTZDLFdBQVc7QUFDeEQ7QUFDQSx1QkFBdUIsa0RBQVU7QUFDakMsbUVBQW1FLG1EQUFXO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELFdBQVc7QUFDcEU7QUFDQSx1QkFBdUIsa0RBQVU7QUFDakM7QUFDQTtBQUNBLDZCQUE2Qix5REFBUztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHlEQUFTLGlCQUFpQix5REFBUztBQUNoRSw2QkFBNkIseURBQVMsY0FBYyx5REFBUztBQUM3RCw2QkFBNkIseURBQVMsY0FBYyx5REFBUztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNERBQW9CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsa0RBQVM7QUFDWCxpRUFBZSxPQUFPLEVBQUM7QUFDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZJa0M7QUFDRTtBQUNRO0FBQzVDO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLHlEQUFTO0FBQ3BDLDJCQUEyQix5REFBUztBQUNwQywyQkFBMkIseURBQVM7QUFDcEMsMkJBQTJCLHlEQUFTO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxrREFBUztBQUNYLGlFQUFlLGFBQWEsRUFBQztBQUM3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUJrQztBQUN1QztBQUNyQztBQUNwQztBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsNERBQWM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0VBQW9CO0FBQ3RDO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQSxDQUFDLENBQUMsa0RBQVM7QUFDWCxpRUFBZSxTQUFTLEVBQUM7QUFDekI7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQ3NEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDhEQUF5QjtBQUMzQztBQUNBO0FBQ0Esa0JBQWtCLDhEQUF5QjtBQUMzQztBQUNBO0FBQ0Esa0JBQWtCLDhEQUF5QjtBQUMzQztBQUNBO0FBQ0Esa0JBQWtCLDhEQUF5QjtBQUMzQztBQUNBO0FBQ0EsQ0FBQztBQUNELGlFQUFlLFNBQVMsRUFBQztBQUN6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJrQztBQUNFO0FBQ1E7QUFDNUM7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxxREFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDLGtEQUFTO0FBQ1gsaUVBQWUsWUFBWSxFQUFDO0FBQzVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0JrQztBQUNrQjtBQUNoQjtBQUNlO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsNERBQXVCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDREQUFvQjtBQUN0QztBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDLGtEQUFTO0FBQ1gsaUVBQWUsTUFBTSxFQUFDO0FBQ3RCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1Q2tDO0FBQ29CO0FBQ3RCO0FBQ0k7QUFDQTtBQUNRO0FBQzVDO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw4REFBeUI7QUFDM0M7QUFDQTtBQUNBLGtCQUFrQiw4REFBeUI7QUFDM0M7QUFDQTtBQUNBLGtCQUFrQiw4REFBeUI7QUFDM0M7QUFDQTtBQUNBLGtCQUFrQiw4REFBeUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdEQUFPLFNBQVMsa0RBQVM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix5REFBUztBQUNwQywyQkFBMkIseURBQVM7QUFDcEMsMkJBQTJCLHlEQUFTO0FBQ3BDLDJCQUEyQix5REFBUztBQUNwQywyQkFBMkIseURBQVM7QUFDcEMsMkJBQTJCLHlEQUFTO0FBQ3BDLDJCQUEyQix5REFBUztBQUNwQywyQkFBMkIseURBQVM7QUFDcEM7QUFDQSxpREFBaUQsV0FBVztBQUM1RDtBQUNBO0FBQ0EsMkJBQTJCLHlEQUFTO0FBQ3BDLDJCQUEyQix5REFBUztBQUNwQywyQkFBMkIseURBQVM7QUFDcEMsMkJBQTJCLHlEQUFTO0FBQ3BDLDJCQUEyQix5REFBUztBQUNwQywyQkFBMkIseURBQVM7QUFDcEMsMkJBQTJCLHlEQUFTO0FBQ3BDLDJCQUEyQix5REFBUztBQUNwQywyQkFBMkIseURBQVM7QUFDcEMsMkJBQTJCLHlEQUFTO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxrREFBUztBQUNYLGlFQUFlLFNBQVMsRUFBQztBQUN6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4RWtDO0FBQ0U7QUFDUTtBQUN5RjtBQUMvRTtBQUN0RDtBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFdBQVc7QUFDOUQ7QUFDQSx1QkFBdUIsa0RBQVU7QUFDakM7QUFDQTtBQUNBLDZCQUE2Qix5REFBUztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHlEQUFTO0FBQ3RDO0FBQ0Esa0NBQWtDLHlEQUFTO0FBQzNDO0FBQ0Esa0NBQWtDLHlEQUFTO0FBQzNDLDZCQUE2Qix5REFBUztBQUN0QyxrQ0FBa0MseURBQVM7QUFDM0MsNkJBQTZCLHlEQUFTO0FBQ3RDLGtDQUFrQyx5REFBUztBQUMzQyw2QkFBNkIseURBQVM7QUFDdEMsa0NBQWtDLHlEQUFTO0FBQzNDLDZCQUE2Qix5REFBUztBQUN0QyxrQ0FBa0MseURBQVM7QUFDM0MsNkJBQTZCLHlEQUFTO0FBQ3RDLGtDQUFrQyx5REFBUztBQUMzQyw2QkFBNkIseURBQVM7QUFDdEMsa0NBQWtDLHlEQUFTO0FBQzNDLDZCQUE2Qix5REFBUztBQUN0QyxrQ0FBa0MseURBQVM7QUFDM0MsNkJBQTZCLHlEQUFTO0FBQ3RDLGlDQUFpQyx5REFBUyxpQkFBaUIseURBQVM7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxtREFBVztBQUN2QixtQkFBbUIsbURBQVc7QUFDOUIsZUFBZSw0REFBb0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlEQUFTO0FBQzVCO0FBQ0Esc0JBQXNCLDhEQUF5QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIseURBQVM7QUFDcEMsa0JBQWtCLDREQUFvQjtBQUN0QywyQkFBMkIseURBQVM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBLG1CQUFtQixnREFBUTtBQUMzQixvQkFBb0IsZ0RBQVE7QUFDNUIsa0JBQWtCLGdEQUFRO0FBQzFCLG9CQUFvQixnREFBUTtBQUM1QixtQkFBbUIsZ0RBQVE7QUFDM0IsbUJBQW1CLGdEQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxrREFBUztBQUNYLGlFQUFlLFNBQVMsRUFBQztBQUN6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakg2QztBQUNEO0FBQ087QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsV0FBVztBQUN4RDtBQUNBLHVDQUF1QywwREFBUztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFdBQVc7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsV0FBVztBQUM3RDtBQUNBLG9DQUFvQywwREFBUztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsV0FBVztBQUM3RDtBQUNBLCtCQUErQiwwREFBUztBQUN4QztBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsNERBQW9CO0FBQzlDO0FBQ0EsK0JBQStCLHlEQUFTO0FBQ3hDO0FBQ0Esa0JBQWtCLDREQUFvQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUVBQWUsV0FBVyxFQUFDO0FBQzNCOzs7Ozs7Ozs7Ozs7Ozs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNENBQTRDO0FBQzdDLGlFQUFlLGdCQUFnQixFQUFDO0FBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JGK0M7QUFDSDtBQUNXO0FBQ0g7QUFDVDtBQUMzQyxjQUFjLHlEQUFTLDJCQUEyQix5REFBUztBQUMzRDtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsb0RBQU87QUFDeEI7QUFDQSxxQkFBcUIsb0RBQVk7QUFDakM7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHVEQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixzREFBUztBQUMxQjtBQUNBLHFCQUFxQixvREFBWTtBQUNqQyx5QkFBeUIseURBQVM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixvREFBTztBQUN4QjtBQUNBLHFCQUFxQixvREFBWTtBQUNqQztBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsdURBQWtCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyw0REFBWTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MseURBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsV0FBVztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGlFQUFlLFVBQVUsRUFBQztBQUMxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUdtRDtBQUNJO0FBQ1g7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQix5REFBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwyREFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQSw2QkFBNkIsbUVBQWtCO0FBQy9DO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUVBQWUsVUFBVSxFQUFDO0FBQzFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVEa0M7QUFDb0U7QUFDM0Q7QUFDRjtBQUNBO0FBQ1U7QUFDVjtBQUNBO0FBQ0k7QUFDTTtBQUNaO0FBQ007QUFDUDtBQUNBO0FBQ1k7QUFDRTtBQUNBO0FBQ1I7QUFDTztBQUNMO0FBQ1M7QUFDSDtBQUNUO0FBQzNDO0FBQ0E7QUFDQSxJQUFJLGlEQUFTO0FBQ2I7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsdURBQVE7QUFDdEMsbUJBQW1CLHdEQUFPO0FBQzFCLDhCQUE4Qix1REFBUTtBQUN0QyxtQkFBbUIsd0RBQU87QUFDMUIsOEJBQThCLHVEQUFRO0FBQ3RDLG1CQUFtQix3REFBTztBQUMxQjtBQUNBLHFCQUFxQiwwREFBUztBQUM5Qix3Q0FBd0MsMERBQVM7QUFDakQ7QUFDQTtBQUNBLHFCQUFxQiwwREFBUztBQUM5QjtBQUNBLHFCQUFxQiwwREFBUztBQUM5QjtBQUNBLHFCQUFxQiwwREFBUztBQUM5QjtBQUNBLHFCQUFxQiwwREFBUztBQUM5QjtBQUNBLFlBQVksdURBQVM7QUFDckI7QUFDQSxrQkFBa0IsMERBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFEQUFPO0FBQ25CO0FBQ0E7QUFDQSxzQ0FBc0MsMERBQVM7QUFDL0Msc0NBQXNDLDBEQUFTO0FBQy9DLHVCQUF1Qix1REFBTTtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxlQUFlLDBEQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDBEQUFTO0FBQ3ZDLDJEQUEyRCwwREFBUztBQUNwRSxxQkFBcUIscURBQVk7QUFDakM7QUFDQSw4QkFBOEIsMERBQVM7QUFDdkMsZUFBZSw2REFBWTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixxREFBWTtBQUNqQztBQUNBO0FBQ0EsNkJBQTZCLDBEQUFTO0FBQ3RDO0FBQ0EsNkJBQTZCLDBEQUFTO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QiwwREFBUztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDJEQUFTO0FBQ2hDO0FBQ0E7QUFDQSxrQkFBa0IsK0RBQTBCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDBEQUFTO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw2REFBWSxVQUFVLDREQUFXO0FBQ2pEO0FBQ0Esb0JBQW9CLHFEQUFZO0FBQ2hDO0FBQ0E7QUFDQSxlQUFlLHdEQUFPO0FBQ3RCO0FBQ0E7QUFDQSw4QkFBOEIsMERBQVM7QUFDdkM7QUFDQSx1QkFBdUIseURBQVE7QUFDL0IscUNBQXFDLDBEQUFTO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDBEQUFTO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QiwwREFBUztBQUN2Qyw4QkFBOEIsMERBQVM7QUFDdkM7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLDBEQUFTO0FBQzNDLHdDQUF3QywwREFBUztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsMERBQVM7QUFDdkMsOEJBQThCLDBEQUFTO0FBQ3ZDLDRCQUE0Qix3REFBTztBQUNuQyxxQkFBcUIsd0RBQU87QUFDNUIsbUJBQW1CLCtEQUFVO0FBQzdCO0FBQ0EsMEJBQTBCLHdEQUFPO0FBQ2pDLG1CQUFtQixnRUFBVztBQUM5QjtBQUNBLDBCQUEwQix3REFBTztBQUNqQyxtQkFBbUIsZ0VBQVc7QUFDOUI7QUFDQTtBQUNBLG1CQUFtQix3REFBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsdURBQVE7QUFDdkMsK0JBQStCLHVEQUFRO0FBQ3ZDLCtCQUErQix1REFBUTtBQUN2QywrQkFBK0IsdURBQVE7QUFDdkMsK0JBQStCLHVEQUFRO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLHdEQUFPO0FBQ3JDLDhCQUE4QiwwREFBUztBQUN2QztBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsdURBQVE7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsNkRBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsdURBQVE7QUFDMUM7QUFDQTtBQUNBLHVDQUF1Qyx1REFBUTtBQUMvQyxrQ0FBa0MsdURBQVE7QUFDMUMsa0NBQWtDLHVEQUFRO0FBQzFDLGtDQUFrQyx1REFBUTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMERBQXFCO0FBQzNDO0FBQ0E7QUFDQSx1RUFBdUUsMkJBQTJCLG9EQUFVO0FBQzVHO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxvREFBVTtBQUNaLGlFQUFlLGVBQWUsRUFBQztBQUMvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0TzBEO0FBQ2pCO0FBQ0E7QUFDSTtBQUNOO0FBQ0Q7QUFDVTtBQUNOO0FBQzFDO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0Esc0NBQXNDLG1EQUFVO0FBQ2hEO0FBQ0E7QUFDQSxzRUFBc0UsZUFBZTtBQUNyRix3Q0FBd0Msd0RBQU8sY0FBYywwREFBUztBQUN0RSx3Q0FBd0Msd0RBQU8sVUFBVSwwREFBUztBQUNsRTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdEQUFTO0FBQ3hCO0FBQ0EsbUJBQW1CLGtEQUFXO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxpREFBWTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qix1REFBTTtBQUNwQztBQUNBO0FBQ0EsNkNBQTZDLG1EQUFXO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxXQUFXO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLDRDQUE0QztBQUN2RjtBQUNBO0FBQ0E7QUFDQSxnRkFBZ0Y7QUFDaEY7QUFDQSxDQUFDLENBQUMsd0RBQWU7QUFDakIsaUVBQWUscUJBQXFCLEVBQUM7QUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRTBEO0FBQ007QUFDbEI7QUFDRTtBQUN3RjtBQUMvRjtBQUNrQjtBQUNsQjtBQUNVO0FBQ1o7QUFDRDtBQUNVO0FBQ1k7QUFDSjtBQUNqQjtBQUNLO0FBQ0U7QUFDRjtBQUNGO0FBQzFDO0FBQ0EsSUFBSSxpREFBUztBQUNiO0FBQ0EseUNBQXlDO0FBQ3pDLCtDQUErQztBQUMvQyxxQ0FBcUM7QUFDckMsc0NBQXNDLG1EQUFVLGVBQWUsb0RBQVU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaURBQVM7QUFDeEI7QUFDQSxtQkFBbUIsbURBQVc7QUFDOUI7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGlEQUFZO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsdURBQWtCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsdURBQU07QUFDdEQ7QUFDQSxnREFBZ0QsdURBQU07QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0Msd0RBQU87QUFDekMsMkJBQTJCLHdEQUFPLGlCQUFpQix3REFBTztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxXQUFXO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyx1REFBUTtBQUMxQztBQUNBLHNDQUFzQywwREFBUztBQUMvQztBQUNBLDZCQUE2QiwyREFBUztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDBEQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQix1REFBUTtBQUN2QyxzQkFBc0Isd0RBQW1CLHdCQUF3Qix1REFBUTtBQUN6RTtBQUNBLGVBQWUsdURBQU07QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlEQUFTO0FBQ3hCO0FBQ0EsbUJBQW1CLG1EQUFXO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLHVEQUFRO0FBQ2xELGdEQUFnRCw2REFBWTtBQUM1RCwrQ0FBK0Msd0RBQU8saUJBQWlCLHdEQUFPO0FBQzlFLDZDQUE2QywrREFBcUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsNkRBQVk7QUFDMUQsK0NBQStDLHdEQUFPLGlCQUFpQix3REFBTztBQUM5RSw0QkFBNEIsNkRBQW1CO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHVEQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGlFQUE0QjtBQUNsRCx3Q0FBd0MsdURBQVE7QUFDaEQscUJBQXFCLGlFQUFnQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaURBQVM7QUFDeEI7QUFDQSxtQkFBbUIsbURBQVc7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxxREFBTztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxvREFBVztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLCtCQUErQix1REFBUTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsb0VBQWtCO0FBQ3JDLHFDQUFxQyxxREFBTztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDBEQUFTLGVBQWUsMERBQVM7QUFDMUQsMEJBQTBCLHVEQUFNO0FBQ2hDLDBDQUEwQywwREFBUztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHVEQUFRO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsd0RBQU87QUFDbEMsOEJBQThCLHdEQUFPO0FBQ3JDLDJCQUEyQix3REFBTztBQUNsQyx5QkFBeUIsd0RBQU87QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsdURBQVE7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdURBQVE7QUFDbEM7QUFDQSwwQkFBMEIsdURBQVE7QUFDbEM7QUFDQSxlQUFlLDREQUFVO0FBQ3pCO0FBQ0E7QUFDQSxlQUFlLGlEQUFTO0FBQ3hCLG1CQUFtQixtREFBVztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsMERBQVMsa0JBQWtCLDBEQUFTO0FBQzdFO0FBQ0Esc0NBQXNDLHVEQUFRO0FBQzlDLHNDQUFzQyx1REFBUTtBQUM5QyxzQ0FBc0MsdURBQVE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMseURBQWU7QUFDakIsaUVBQWUsU0FBUyxFQUFDO0FBQ3pCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqV3lDO0FBQ0U7QUFDRjtBQUNJO0FBQ047QUFDRDtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixtREFBVTtBQUMvQjtBQUNBLG9DQUFvQyx3REFBTyxhQUFhLDBEQUFTO0FBQ2pFLHFDQUFxQyx3REFBTztBQUM1Qyw2QkFBNkIseURBQVE7QUFDckM7QUFDQSxrREFBa0QsV0FBVztBQUM3RCw4REFBOEQsMERBQVM7QUFDdkUscURBQXFELDBEQUFTO0FBQzlELHdDQUF3Qyx3REFBd0Q7QUFDaEc7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLCtDQUErQztBQUNqRjtBQUNBLGlDQUFpQyx3REFBTyxVQUFVLHlEQUFRO0FBQzFEO0FBQ0EsMENBQTBDLFdBQVc7QUFDckQsaURBQWlELDBEQUFTO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGlEQUFZO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx3REFBTztBQUN2QyxtQ0FBbUMsd0RBQU87QUFDMUMsZ0NBQWdDLHdEQUFPO0FBQ3ZDLDhCQUE4Qix3REFBTztBQUNyQztBQUNBO0FBQ0EsbURBQW1ELFdBQVc7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSwrQkFBK0I7QUFDNUc7QUFDQSxpQ0FBaUMsbUJBQW1CO0FBQ3BEO0FBQ0Esd0RBQXdELFdBQVc7QUFDbkU7QUFDQTtBQUNBO0FBQ0EsMERBQTBELFdBQVc7QUFDckU7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFdBQVc7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdURBQU07QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUVBQWUsbUJBQW1CLEVBQUM7QUFDbkM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2tDO0FBQ1E7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixPQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE9BQU87QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsT0FBTztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE9BQU87QUFDL0I7QUFDQTtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxxREFBWTtBQUNkLGlFQUFlLGFBQWEsRUFBQztBQUM3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDa0M7QUFDUTtBQUMxQztBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDLHFEQUFZO0FBQ2QsaUVBQWUsY0FBYyxFQUFDO0FBQzlCOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hFc0Q7QUFDeEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsK0NBQU07QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsOERBQXlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxpRUFBZSxZQUFZLEVBQUM7QUFDNUI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2tDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxTQUFTO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixxQkFBcUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFNBQVM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RCxnQ0FBZ0Msb0RBQVUsWUFBWTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsMENBQTBDLFdBQVc7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxVQUFVO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxxREFBVztBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxVQUFVO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELHFEQUFXO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDhCQUE4QjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5V0E7QUFDbUQ7QUFDNUMsZ0NBQWdDO0FBQ2hDLG1DQUFtQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSwyQ0FBMkMsV0FBVztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSx3QkFBd0IsZ0RBQVk7QUFDcEM7QUFDQSxrREFBa0QsV0FBVztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLHdCQUF3QixnREFBWTtBQUNwQztBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0Esd0JBQXdCLGdEQUFZO0FBQ3BDO0FBQ0EsMkNBQTJDLFdBQVc7QUFDdEQ7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsMENBQTBDLFdBQVc7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLDBDQUEwQyxXQUFXO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQLDJDQUEyQyxXQUFXO0FBQ3REO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsU0FBUyxLQUFxQztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHNCQUFzQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsSUFBcUM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0IsMkJBQTJCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QkFBaUI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLGVBQWU7QUFDbEQ7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLGNBQWM7QUFDMUQ7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELGNBQWM7QUFDOUQ7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGlCQUFpQjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQkFBaUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsZUFBZTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLHNDQUFzQztBQUM3RTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELGVBQWU7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxzQ0FBc0M7QUFDN0U7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRDQUE0QyxjQUFjO0FBQzFEOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0MsY0FBYztBQUM3RDs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELGNBQWM7QUFDcEU7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRCxtQkFBbUI7QUFDcEU7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsYUFBYTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxhQUFhO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELGFBQWE7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxjQUFjO0FBQzNEOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsY0FBYztBQUNyRTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDLGNBQWM7QUFDM0Q7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDLGNBQWM7QUFDM0Q7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxnQkFBZ0I7QUFDekU7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxnQkFBZ0I7QUFDekU7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNXdCYTtBQUNiLHVCQUF1QjtBQUN2QixhQUFhLG1CQUFPLENBQUMsNEdBQXVCOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUJBQXlCLHVCQUF1QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxjQUFjO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRTtBQUMxRDtBQUNBLFFBQVEsRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRTtBQUM1RCxrQ0FBa0MsRUFBRSxVQUFVLEVBQUU7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLEVBQUUsU0FBUztBQUN6QjtBQUNBLFFBQVEsT0FBTyxFQUFFLFNBQVM7QUFDMUI7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZOzs7QUFHWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBLDhEQUE4RDtBQUM5RCxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0EsU0FBUztBQUNULHVCQUF1QjtBQUN2QjtBQUNBLFNBQVM7QUFDVCx1QkFBdUI7QUFDdkI7QUFDQSxTQUFTO0FBQ1Qsd0JBQXdCO0FBQ3hCO0FBQ0EsU0FBUztBQUNULHdCQUF3QjtBQUN4QjtBQUNBLFNBQVM7QUFDVCxpQ0FBaUM7QUFDakM7QUFDQSxTQUFTO0FBQ1QsMkJBQTJCO0FBQzNCO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkRBQTJEOztBQUUzRDtBQUNBOztBQUVBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLGtCQUFrQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQSxnRkFBZ0Y7QUFDaEY7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCOzs7QUFHbEI7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRyxHQUFHO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0M7QUFDbEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNO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O0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0RBQWtEOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCLFdBQVcsUUFBUTtBQUNuQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QixXQUFXLFFBQVE7QUFDbkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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OztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkVBQTZFLFlBQVk7QUFDekY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUlBQWlJLDhCQUE4QjtBQUMvSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1GQUFtRjtBQUNuRjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRLDBDQUEwQzs7O0FBR2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdHQUFnRztBQUNoRzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLDBDQUEwQzs7O0FBR2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4RUFBOEU7O0FBRTlFO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0pBQXNKLGlCQUFpQjtBQUN2SyxRQUFRO0FBQ1Isc0pBQXNKLGlCQUFpQix3REFBd0QsbUJBQW1CLGdCQUFnQiwrQkFBK0I7QUFDalM7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0Esb0dBQW9HLEdBQUc7O0FBRXZHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxnQkFBZ0I7QUFDNUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFOztBQUV2RTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsOENBQThDOztBQUU5QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsMEJBQTBCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsWUFBWSxXQUFXO0FBQ3ZCOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRTtBQUNwRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsaUJBQWlCOztBQUVqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGVBQWU7QUFDN0I7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1Isd0VBQXdFOztBQUV4RTtBQUNBLCtEQUErRDtBQUMvRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7OztBQUdSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxXQUFXLE1BQU07QUFDakI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsR0FBRztBQUNkLFdBQVcsTUFBTTtBQUNqQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkZBQTJGOztBQUUzRjtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEOztBQUV2RCwyQ0FBMkM7QUFDM0M7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTixJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUEseUNBQXlDOztBQUV6QztBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUNBQXVDO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7O0FBRTlDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUEsdUNBQXVDOztBQUV2QywrQkFBK0I7QUFDL0I7O0FBRUE7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBLDBFQUEwRTtBQUMxRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLDJDQUEyQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTs7QUFFQSxvQkFBb0IsaUNBQWlDO0FBQ3JEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1CLDRDQUE0QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0RUFBNEU7O0FBRTVFLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOzs7QUFHQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLFFBQVE7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQSxrREFBa0Q7QUFDbEQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0EsZ0ZBQWdGO0FBQ2hGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckI7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhHQUE4RztBQUM5RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtB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QUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLG9DQUFvQztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTSwyRUFBMkUsb0dBQW9HLGtDQUFrQztBQUN2TjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNLG9HQUFvRztBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUVBQW1FOztBQUVuRSwrRkFBK0Y7QUFDL0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDRCQUE0QjtBQUNsRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDO0FBQzlDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsd0JBQXdCO0FBQzdDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyREFBMkQ7QUFDM0Q7QUFDQSxnRkFBZ0Y7QUFDaEY7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0EsY0FBYzs7O0FBR2Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsMnZCQUEydkI7O0FBRTN2QjtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDLHdEQUF3RDs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQzs7QUFFaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBLEVBQUUsbUJBQW1COztBQUVyQjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlFQUF5RTtBQUN6RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRDs7QUFFaEQ7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUksY0FBYztBQUNsQjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0JBQWdCO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLGNBQWM7QUFDdkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLCtDQUErQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsK0NBQStDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSwrQ0FBK0M7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7OztBQUdBLDBFQUEwRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJIQUEySDtBQUMzSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9FQUFvRTs7QUFFcEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0YsMkRBQTJEOztBQUUzRCxxREFBcUQ7QUFDckQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQjtBQUNwQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTs7QUFFQSwySEFBMkg7QUFDM0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRTtBQUMxRTs7QUFFQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qjs7QUFFQTs7QUFFQSxhQUFhLGtCQUFrQjtBQUMvQjs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBO0FBQ0E7QUFDQSx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDs7QUFFNUQsMkRBQTJEOztBQUUzRCwrREFBK0Q7O0FBRS9EO0FBQ0EsOERBQThEO0FBQzlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7O0FBRUEsa0NBQWtDOztBQUVsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esc0pBQXNKOztBQUV0SixxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBOEQ7QUFDOUQscURBQXFEO0FBQ3JELDJEQUEyRDtBQUMzRCwyQ0FBMkM7QUFDM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEOztBQUV0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLCtDQUErQzs7QUFFL0M7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7OztBQUdSOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEhBQThILHlDQUF5QztBQUN2Szs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLHdCQUF3QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsV0FBVyxrREFBa0Q7QUFDN0Q7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsNkJBQTZCO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR04sd0VBQXdFOztBQUV4RSxXQUFXLDZCQUE2QjtBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSOzs7QUFHQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLGlDQUFpQztBQUM1QztBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR04sd0VBQXdFOztBQUV4RSxXQUFXLFlBQVk7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsTUFBTTtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7O0FBRTVCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNGQUFzRjs7QUFFdEYsNERBQTREO0FBQzVEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsNkJBQTZCO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sSUFBSTtBQUNKOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2QkFBNkI7O0FBRTdCLHFDQUFxQzs7QUFFckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVDQUF1QztBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sMkNBQTJDO0FBQ2pEOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckIsaUZBQWlGO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtGQUFrRjtBQUNsRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnSUFBZ0k7QUFDaEk7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBLHlLQUF5SywwQ0FBMEM7QUFDbk47QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7O0FBRUEsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR047QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7OztBQUduQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDhCQUE4Qjs7QUFFOUIsZ0RBQWdEO0FBQ2hEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNFQUFzRTtBQUN0RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGVBQWU7QUFDekIsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0VBQWdFOztBQUVoRTtBQUNBLGlDQUFpQztBQUNqQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7O0FBR0osaUdBQWlHO0FBQ2pHLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUNBQXVDOztBQUV2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDhJQUE4STs7QUFFOUk7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVixrRUFBa0UsNENBQTRDO0FBQzlHOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZDQUE2QztBQUM3QyxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQSxzREFBc0Q7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtSUFBbUk7QUFDbkk7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1JQUFtSTtBQUNuSTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsUUFBUSxJQUFJO0FBQ1o7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7OztBQUdBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBLGlIQUFpSDtBQUNqSDtBQUNBO0FBQ0E7O0FBRUEseUNBQXlDO0FBQ3pDLE1BQU0sS0FBSyxFQUtOO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsZ0RBQWdEOztBQUVoRCw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLDJDQUEyQztBQUMzQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0EsNEdBQTRHO0FBQzVHOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7OztBQUdBLGlRQUFpUTtBQUNqUTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQSxnRkFBZ0Y7QUFDaEY7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0dBQStHO0FBQy9HOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLDBFQUEwRTs7QUFFMUU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUdBQWlHO0FBQ2pHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9DQUFvQzs7QUFFcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEOztBQUVoRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTs7O0FBR1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTixtQ0FBbUM7QUFDbkM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEOztBQUVsRDs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBLHlFQUF5RTs7QUFFekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVFQUF1RTs7QUFFdkU7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjs7O0FBR0EsaURBQWlEOztBQUVqRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBLHNFQUFzRTs7QUFFdEUsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOLHlDQUF5Qzs7QUFFekM7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEOztBQUV0RDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQSxJQUFJO0FBQ0osK0dBQStHO0FBQy9HO0FBQ0EseUJBQXlCOztBQUV6QjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osZ0dBQWdHO0FBQ2hHOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSiwwRUFBMEU7O0FBRTFFO0FBQ0E7QUFDQSw0RkFBNEY7QUFDNUY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1R0FBdUc7QUFDdkc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7O0FBRTVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7O0FBRTFDLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLGdHQUFnRztBQUNoRztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHlOQUF5TixHQUFHOztBQUU1TjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixxQkFBcUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLFlBQVk7QUFDL0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7OztBQUdaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdEQUFnRDs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0EsbURBQW1EOztBQUVuRDtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnSEFBZ0g7QUFDaEg7QUFDQTs7QUFFQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxnSEFBZ0g7QUFDaEg7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOzs7QUFHQTtBQUNBLFVBQVU7QUFDVjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDs7QUFFN0Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSxvQ0FBb0M7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNERBQTREO0FBQzVEOztBQUVBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBLGdFQUFnRTtBQUNoRTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esd0VBQXdFOztBQUV4RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsUUFBUSw0SUFBNEk7QUFDcEo7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7O0FBR0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBLHNEQUFzRDs7QUFFdEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTs7QUFFQSxtREFBbUQ7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUksK0JBQStCO0FBQ25DOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJLCtCQUErQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOztBQUVWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsZ0RBQWdEO0FBQ2hEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFOztBQUV2RTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCOztBQUU1Qjs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0Isc0JBQXNCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RkFBNEY7O0FBRTVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7O0FBRTVCLGtDQUFrQzs7QUFFbEMsK0JBQStCOztBQUUvQiwyQkFBMkI7O0FBRTNCLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNEQUFzRDs7QUFFdEQsbURBQW1EOztBQUVuRCx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBOztBQUVBLCtDQUErQztBQUMvQzs7QUFFQSw4Q0FBOEM7O0FBRTlDLHlEQUF5RDs7QUFFekQsNkNBQTZDOztBQUU3QywrQ0FBK0M7QUFDL0M7O0FBRUEsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0EsZ0NBQWdDO0FBQ2hDOztBQUVBLG1EQUFtRDtBQUNuRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QyxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnREFBZ0Q7QUFDaEQ7O0FBRUEsZ0RBQWdEOztBQUVoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKLCtEQUErRDs7QUFFL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRTtBQUNsRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0Rjs7QUFFNUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9FQUFvRTs7O0FBR3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEIsbUJBQW1CO0FBQzdDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0Esb0ZBQW9GO0FBQ3BGOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSiw2Q0FBNkM7QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOzs7QUFHTjtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0EsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7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QUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7O0FBRTFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLDRDQUE0QztBQUNwRDs7O0FBR0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTs7QUFFQSxrREFBa0Q7O0FBRWxEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtSEFBbUg7O0FBRW5IOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxHQUFHO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOExBQThMLG9EQUFvRCxFQUFFO0FBQ3BQLFFBQVE7QUFDUjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtT0FBbU8sb0RBQW9ELEVBQUU7QUFDelI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7O0FBRXpDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsaUJBQWlCO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdMQUF3TDs7QUFFeEwsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDBFQUEwRTtBQUMxRTtBQUNBOztBQUVBLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEdBQUc7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3REFBd0Q7O0FBRXhEO0FBQ0EsbUNBQW1DOztBQUVuQzs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ04sc0JBQXNCLHdCQUF3QjtBQUM5QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3REFBd0QsUUFBUTs7QUFFaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQztBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQztBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQztBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsZ0xBQWdMLDhCQUE4QjtBQUM5TTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnREFBZ0Q7O0FBRWhEOztBQUVBO0FBQ0Esb0JBQW9CLDJCQUEyQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLHVEQUF1RDs7QUFFdkQ7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFF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O0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdC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Q0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLGdCQUFnQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxlQUFlO0FBQ3pCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQSxpREFBaUQsVUFBVTtBQUMzRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxxQkFBcUIsdUJBQXVCO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLHFEQUFxRCxVQUFVO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLDBCQUEwQjtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUMsd0NBQXdDOztBQUV6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLG9EQUFvRDs7QUFFckQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNENBQWU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLDhDQUFHOztBQUV6QjtBQUNBO0FBQ0E7O0FBRUEsV0FBVyxnREFBbUIsQ0FBQywwREFBYTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLENBQUMsNENBQWU7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLDhDQUFHOztBQUV6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUMsQ0FBQyw0Q0FBZTs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUFnQyxxREFBUzs7QUFFekM7QUFDQTtBQUNBLG9CQUFvQixxREFBUztBQUM3QixHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsdUJBQXVCLGdEQUFtQjtBQUMxQztBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBOztBQUVBLHVDQUF1Qzs7QUFFdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRjs7QUFFckY7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1EQUFtRDs7QUFFbkQsNkZBQTZGO0FBQzdGO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7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R0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJIQUEySDtBQUMzSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9FQUFvRTs7QUFFcEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2QsV0FBVyxlQUFlO0FBQzFCLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssR0FBRzs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxHQUFHO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7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QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvREFBb0Q7O0FBRXBEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLGVBQWU7QUFDMUIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxHQUFHOztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEdBQUc7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHFFQUFxRTs7QUFFckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0I7O0FBRWhCLHVCQUF1QixrQkFBa0I7O0FBRXpDO0FBQ0EseUJBQXlCOztBQUV6Qiw0QkFBNEI7QUFDNUI7QUFDQTs7QUFFQSxnQ0FBZ0M7O0FBRWhDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxRQUFRO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCOztBQUV4Qjs7QUFFQTtBQUNBLG9CQUFvQixxQkFBcUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxxSUFBcUkseUNBQXlDO0FBQzlLO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxJQUFJO0FBQ2YsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxHQUFHO0FBQ2QsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsSUFBSTtBQUNmLFlBQVksUUFBUTtBQUNwQjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLElBQUk7QUFDZixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLEdBQUc7QUFDZDtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixZQUFZLGNBQWM7QUFDMUI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEdBQUc7O0FBRVI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUEsb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxJQUFJO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxJQUFJO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLFNBQVM7QUFDVCx1QkFBdUI7QUFDdkI7QUFDQSxTQUFTO0FBQ1QsdUJBQXVCO0FBQ3ZCO0FBQ0EsU0FBUztBQUNULHdCQUF3QjtBQUN4QjtBQUNBLFNBQVM7QUFDVCx3QkFBd0I7QUFDeEI7QUFDQSxTQUFTO0FBQ1QsaUNBQWlDO0FBQ2pDO0FBQ0EsU0FBUztBQUNULDJCQUEyQjtBQUMzQjtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJEQUEyRDs7QUFFM0Q7QUFDQTs7QUFFQTtBQUNBLDJEQUEyRDtBQUMzRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYSxrQkFBa0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0EsZ0ZBQWdGO0FBQ2hGO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7O0FBR2xCO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUFzQixnQ0FBZ0M7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxzREFBTTtBQUNYO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLHdEQUFRO0FBQ2I7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRWlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxVzdCOztBQUVyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixvRUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHFFQUFhO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFaVQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUlqVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZ1Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdJaFY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIs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O0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixnRkFBZ0YsRUFBRTtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRkFBK0YsYUFBYTtBQUM1RztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtR0FBbUcsZUFBZTtBQUNsSDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRCQUE0QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtR0FBbUcsZUFBZTtBQUNsSDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsRUFBRTtBQUN6RSxRQUFRO0FBQ1IsMkNBQTJDLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxJQUFJO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLEVBQUUsR0FBRyxFQUFFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUdBQWlHLGVBQWU7QUFDaEg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTZNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcjBFN007QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUV5SDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZMekg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLEtBQXFDO0FBQ2xEO0FBQ0E7QUFDQSw4QkFBOEIsT0FBTyxrRkFBa0YsT0FBTztBQUM5SCxHQUFHO0FBQ0g7QUFDQSxpS0FBaUssTUFBTTtBQUN2SyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLE1BQU07QUFDcEQsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsTUFBTTtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxJQUFJLENBQUU7QUFDTjtBQUNBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBLCtCQUErQixJQUFJO0FBQ25DO0FBQ0E7QUFDQSxrQ0FBa0MsTUFBTTtBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGNBQWMsV0FBVztBQUN6QjtBQUNBLHNCQUFzQixxQkFBcUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixJQUFJO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLElBQUk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsSUFBSTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0ZBQWdGLENBQXdwQjtBQUN4dUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLG9DQUFvQyxHQUFHO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFFBQVE7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxRQUFRO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSw4QkFBOEIsUUFBUTtBQUN0Qyx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7O0FBSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsdUJBQXVCLEVBQUUsV0FBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyx3SUFBd0k7QUFDNUs7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGFBQWEsR0FBRyxXQUFXO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUUsSUFBSTtBQUM3RTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTix3QkFBd0IsYUFBYSxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsYUFBYTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixzQkFBc0IsV0FBVztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ04sc0JBQXNCLFdBQVc7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxnQkFBZ0I7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7O0FBTUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnakJBQWdqQixnQkFBZ0I7QUFDaGtCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHFCQUFxQjtBQUNsRCw0QkFBNEIscUJBQXFCO0FBQ2pEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLG9CQUFvQixxQkFBcUI7QUFDekMsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLHVDQUF1QztBQUNyRTtBQUNBLGlDQUFpQyx5Q0FBeUM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsbURBQW1EO0FBQzFFO0FBQ0E7QUFDQSx3QkFBd0IscURBQXFEO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsbUNBQW1DLDhDQUE4QztBQUNqRixvQ0FBb0MsOENBQThDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVCx3RUFBd0UsS0FBSztBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1Q0FBdUM7QUFDL0Q7QUFDQTtBQUNBLFFBQVE7QUFDUix3QkFBd0IsdUNBQXVDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLEtBQUs7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsUUFBUTtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7O0FBSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsSUFBSSxHQUFHLDJCQUEyQjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUix5Q0FBeUMsa0JBQWtCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVix1Q0FBdUMsc0JBQXNCLE1BQU0sR0FBRztBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxXQUFXLEVBQUUsc0JBQXNCO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxRQUFRO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxTQUFTLFdBQVcsRUFBRTtBQUM5RCw4QkFBOEIsZUFBZSxlQUFlLEVBQUUsTUFBTSxLQUFLO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRTtBQUNsRSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsNkJBQTZCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZUFBZSxTQUFTLFdBQVcsRUFBRTtBQUNqRTtBQUNBO0FBQ0EsMEJBQTBCLGVBQWUsZ0JBQWdCLEVBQUUsTUFBTSxLQUFLO0FBQ3RFLE1BQU07QUFDTixnQ0FBZ0MsNkJBQTZCO0FBQzdEO0FBQ0Esc0NBQXNDLDZCQUE2QixJQUFJO0FBQ3ZFO0FBQ0EsMEJBQTBCLGVBQWUsNEJBQTRCLEVBQUUsRUFBRSxJQUFJLE1BQU0sS0FBSztBQUN4RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLHNEQUFzRCxHQUFHO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsT0FBTztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsMEJBQTBCLE9BQU87QUFDakM7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixXQUFXO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFVBQVU7QUFDaEM7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixVQUFVO0FBQzVCO0FBQ0Esd0JBQXdCLFVBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVE7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFFBQVE7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsTUFBTTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELFVBQVU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUIsNkNBQTZDLGNBQWM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsUUFBUTtBQUNqRDtBQUNBO0FBQ0EsSUFBSTtBQUNKLFdBQVcsZUFBZTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFFBQVE7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0EsSUFBSTtBQUNKLHFDQUFxQyxRQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7O0FBS0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsV0FBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsWUFBWTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsV0FBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHNCQUFzQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsaUJBQWlCO0FBQ2pDO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxnQkFBZ0IsZ0JBQWdCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxnQkFBZ0IsaUJBQWlCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsSUFBSTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSix1Q0FBdUMsYUFBYTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxZQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxLQUFLLEtBQUsscUJBQXFCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFFBQVEsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEtBQUssU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixrQkFBa0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxRQUFRO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFdBQVc7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFlBQVk7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxXQUFXO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIscURBQXFELE9BQU87QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxFQUFFO0FBQ2hEO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7O0FBSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0UsT0FBTywwQkFBMEIsSUFBSTtBQUM3RztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxJQUFJO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLE1BQU0sR0FBRyxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsV0FBVyxHQUFHLGFBQWE7QUFDeEU7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7QUFJRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFVBQVU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELFVBQVU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxNQUFNLEdBQUcsUUFBUTtBQUN4RDtBQUNBO0FBQ0EsOERBQThELFVBQVU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0Esd0RBQXdELEtBQUs7QUFDN0Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxRQUFRO0FBQzFEO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDBDQUEwQztBQUNuRSx3QkFBd0IsMENBQTBDO0FBQ2xFLE1BQU07QUFDTix5QkFBeUIsZUFBZSxFQUFFLGdCQUFnQjtBQUMxRCx3QkFBd0IsZUFBZSxFQUFFLGVBQWU7QUFDeEQ7QUFDQSwyQkFBMkIsZUFBZSxFQUFFLGlEQUFpRDtBQUM3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsMkJBQTJCLDJCQUEyQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxzQkFBc0IsdUJBQXVCLEtBQUssV0FBVztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsOEJBQThCLGtDQUFrQyxJQUFJLFVBQVU7QUFDOUU7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGlCQUFpQixPQUFPLFVBQVU7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCLEtBQUssV0FBVztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsUUFBUTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsUUFBUTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGdDQUFnQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFFBQVE7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHNGQUFzRjtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxJQUFJLEdBQUc7QUFDNUM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDZCQUE2QjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxnRkFBZ0YsZUFBZTtBQUMvRixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsT0FBTztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxlQUFlO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0IsR0FBRyxtQ0FBbUM7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLCtDQUErQyxjQUFjO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxLQUFLO0FBQ2pFO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxLQUFLO0FBQzFEO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxpQkFBaUI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxRQUFRLFFBQVEsUUFBUSxHQUFHLFFBQVE7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxNQUFNO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdGQUF3RixvQkFBb0I7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQ0FBa0M7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFj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QUFDbEQsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsNENBQTRDLHNJQUFzSSxZQUFZLGtCQUFrQixZQUFZO0FBQzVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixhQUFhO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxVQUFVLFlBQVksV0FBVztBQUM1SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsR0FBRztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFFBQVE7QUFDN0I7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFLEdBQUc7QUFDNUU7QUFDQSw4REFBOEQsR0FBRztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUUsR0FBRztBQUMxRTtBQUNBO0FBQ0EsVUFBVTtBQUNWLDhEQUE4RCxHQUFHO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixpQkFBaUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsVUFBVTtBQUN4RDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsV0FBVztBQUN2RSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGVBQWU7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sb0JBQW9CLGtCQUFrQjtBQUN0QyxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0EsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsdUJBQXVCLHdCQUF3QixhQUFhLHVEQUF1RDtBQUNuSDtBQUNBLDJDQUEyQyxpQ0FBaUMsR0FBRztBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGlCQUFpQixFQUFFLEdBQUc7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLEdBQUc7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7O0FBS0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxLQUFLO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw2QkFBNkIsZUFBZTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHdCQUF3QixFQUFFLE1BQU0sRUFBRSx1QkFBdUI7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDZCQUE2QixlQUFlO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxRQUFRO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsNEJBQTRCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFB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Q0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7Ozs7QUFPRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7QUFNRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixNQUFNLEVBQUUsc0JBQXNCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IscUJBQXFCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsUUFBUTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsUUFBUTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7O0FBS0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUUsS0FBSztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7Ozs7QUFRRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsMEJBQTBCLGlCQUFpQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsMEJBQTBCLGlCQUFpQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsMkRBQU87QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDMkQ7QUFDZ0M7QUFDM0M7QUFDbUQ7QUFDaEQ7QUFDNUM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsWUFBWTtBQUN4RCxJQUFJO0FBQ0o7QUFDQTtBQUNBLDRCQUE0QixZQUFZO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxXQUFXLFFBQVEsYUFBYSwrQ0FBK0MsTUFBTTtBQUM5RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLElBQXFDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixZQUFZLE1BQU0sTUFBTSxxQ0FBcUMsNkJBQTZCO0FBQ3pIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxrREFBa0Qsa0NBQWtDO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxZQUFZLElBQXFDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLElBQUk7QUFDTixNQUFNLElBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQSw2RkFBNkY7QUFDN0Y7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHFCQUFxQjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9FQUFvRTtBQUNwRjtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxjQUFjLElBQXFDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBcUM7QUFDL0M7QUFDQSx1REFBdUQsWUFBWSwySkFBMkosYUFBYTtBQUMzTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsOEVBQThFLCtCQUErQjtBQUM3RztBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSx1Q0FBdUM7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxZQUFZLGVBQWU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsaUVBQWlFLHFCQUFxQjtBQUN0RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0Isc0dBQWlDO0FBQ3ZELGtCQUFrQix1REFBMkI7QUFhM0M7QUFDRjs7Ozs7Ozs7Ozs7Ozs7OztBQ2htQ0E7QUFDQTtBQUNBLHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2ZGO0FBQ0E7QUFDQSxrQ0FBa0MsT0FBTyx5Q0FBeUMsTUFBTTtBQUN4Rjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLCtCQUErQjtBQUN0RCw2QkFBNkIsK0JBQStCO0FBQzVELDZEQUE2RCxlQUFlO0FBQzVFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE1BQXFDLEdBQUcsQ0FBeUIsc0VBQXNFLGdCQUFnQjtBQUMzSztBQUNBO0FBQ0Esb0JBQW9CLE1BQXFDLEdBQUcsQ0FBeUI7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsTUFBcUMsR0FBRyxDQUF5QixrRUFBa0UsaUJBQWlCO0FBQzFLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsTUFBcUMsR0FBRyxDQUF5QjtBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLE1BQXFDLEdBQUcsQ0FBeUIsa0VBQWtFLGlCQUFpQjtBQUMxSztBQUNBO0FBQ0Esc0JBQXNCLE1BQXFDLEdBQUcsQ0FBeUI7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsTUFBcUMsR0FBRyxDQUF5QjtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsTUFBcUMsR0FBRyxDQUF5QixvRUFBb0UsZUFBZTtBQUMxSztBQUNBO0FBQ0Esc0JBQXNCLE1BQXFDLEdBQUcsQ0FBeUI7QUFDdkY7QUFDQTtBQUNBLHNCQUFzQixNQUFxQyxHQUFHLENBQTBCLDhFQUE4RSxvQkFBb0IsaUJBQWlCLFlBQVk7QUFDdk47QUFDQTtBQUNBLHNCQUFzQixNQUFxQyxHQUFHLENBQXlCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsTUFBcUMsR0FBRyxDQUEwQixxRUFBcUUsb0JBQW9CO0FBQ2pMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsTUFBcUMsR0FBRyxDQUEwQixpRUFBaUUsaUJBQWlCO0FBQzlLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWMsMEJBQTBCLG1CQUFtQixpRUFBaUUseUJBQXlCO0FBQ3ZLO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qiw0Q0FBNEMsR0FBRyw0QkFBNEIsYUFBYSxhQUFhLDZEQUE2RCx5QkFBeUI7QUFDcE47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxzQkFBc0IsTUFBcUMsR0FBRyxDQUEwQixpQ0FBaUMsSUFBSTtBQUM3SDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsc0JBQXNCLE1BQXFDLEdBQUcsQ0FBMEIsaUNBQWlDLElBQUksNEVBQTRFLHlCQUF5QjtBQUNsTztBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix3QkFBd0I7QUFDMUM7QUFDQSxRQUFRLElBQXFDO0FBQzdDO0FBQ0EsZ0RBQWdELElBQUk7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsNkJBQTZCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixNQUFxQyxHQUFHLENBQTBCLHlDQUF5QyxpQkFBaUIsbUJBQW1CLHNCQUFzQiwrQkFBK0IsSUFBSTtBQUNoTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsTUFBcUMsR0FBRyxDQUEwQixrRkFBa0YsdUJBQXVCO0FBQy9MO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsTUFBcUMsR0FBRyxDQUEwQjtBQUN4RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQVdFO0FBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1WUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSwwQkFBMEI7QUFDcEMsVUFBVSxpREFBaUQ7QUFDM0QsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxTQUFTLFFBQVE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdGQUF3RixZQUFZO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUZBQXVGLGNBQWM7QUFDckc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsdUJBQXVCO0FBQ2hGO0FBQ0EsMkJBQTJCLGFBQWEsR0FBRyxVQUFVO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsU0FBUztBQUNuQixrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSw2Q0FBNkM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEtBQUs7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHdCQUF3QjtBQUNsQztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxnQkFBZ0I7QUFDaEIsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Ozs7Ozs7Ozs7Ozs7O0FDdHVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGLGFBQWE7QUFDekc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWE7QUFDYixhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGFBQWE7O0FBRWI7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O0FBQzdFeXZDLElBQUksQ0FBQ0UsTUFBTSxlQUNUbjZDLDBEQUFBO0VBQUssY0FBVztBQUFhLGdCQUMzQkEsMERBQUEsQ0FBQ201QyxpREFBUTtFQUFDbkIsS0FBSyxFQUFFQSwrQ0FBS0E7QUFBQyxnQkFDckJoNEMsMERBQUEsQ0FBQ3U1Qyx1QkFBdUI7RUFBQ0MsWUFBWSxFQUFFO0lBQUUxNEIsSUFBSSxFQUFFO0VBQWE7QUFBRSxDQUFFLENBQ3hELENBQ1AsQ0FDUCxDQUFDLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGVtb3Rpb24vaXMtcHJvcC12YWxpZC9kaXN0L2Vtb3Rpb24taXMtcHJvcC12YWxpZC5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGVtb3Rpb24vbWVtb2l6ZS9kaXN0L2Vtb3Rpb24tbWVtb2l6ZS5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGVtb3Rpb24vc3R5bGlzL2Rpc3Qvc3R5bGlzLmJyb3dzZXIuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9yZWFjdC9kaXN0L2Zsb2F0aW5nLXVpLnJlYWN0LmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcGRmLWxpYi9mb250a2l0L2Rpc3QvZm9udGtpdC5lcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcGRmLWxpYi9zdGFuZGFyZC1mb250cy9lcy9FbmNvZGluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcGRmLWxpYi9zdGFuZGFyZC1mb250cy9lcy9Gb250LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BwZGYtbGliL3N0YW5kYXJkLWZvbnRzL2VzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BwZGYtbGliL3N0YW5kYXJkLWZvbnRzL2VzL3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BwZGYtbGliL3VwbmcvVVBORy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9hcmlhLWhpZGRlbi9kaXN0L2VzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL1RpdGxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL0JvcmRlclJlc2l6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9EZWZhdWx0U2lnbmF0dXJlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1BkZkhlYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QZGZab29tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1BsYWNlaG9sZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1BsYWNlaG9sZGVyQm9yZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1BsYWNlaG9sZGVyVHlwZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QcmV2TmV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9SZW5kZXJBbGxQZGZQYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1JlbmRlclBkZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9TaWduUGFkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1NpZ25lckxpc3RDb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvVmVyaWZ5RW1haWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29uc3RhbnQvVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29uc3RhbnQvYXBwaW5mby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb25zdGFudC9jb25zdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9qc29uL3BsYW5zQXJyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3BhZ2VzL1BkZlJlcXVlc3RGaWxlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL0FsZXJ0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3ByaW1pdGl2ZXMvSGFuZGxlRXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcHJpbWl0aXZlcy9Mb2FkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcHJpbWl0aXZlcy9Mb2FkZXJXaXRoTXNnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3ByaW1pdGl2ZXMvTW9kYWxVaS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL1BkZkRlY2xpbmVNb2RhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL1RvdXJDb250ZW50V2l0aEJ0bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9yZWR1eC9yZWR1Y2Vycy9TaG93VGVuYW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3JlZHV4L3JlZHVjZXJzL1RvdXJTdGVwc1JlZHVjZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcmVkdXgvcmVkdWNlcnMvaW5mb1JlZHVjZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcmVkdXgvcmVkdWNlcnMvc2hvd0hlYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9yZWR1eC9zdG9yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9zY3JpcHQvaTE4bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jbHN4L2Rpc3QvY2xzeC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jbmJ1aWxkZXIvZXNtL2NuYi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvYWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9jaXBoZXItY29yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvY29yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvZW5jLWJhc2U2NC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvZW5jLXV0ZjguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2V2cGtkZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvaG1hYy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvbWQ1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9zaGExLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvYmxhY2stYWxwaGEuY3NzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvbWF1dmUuY3NzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvdmlvbGV0LmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL2Rpc3QvcmVhY3QtZGF0ZXBpY2tlci5jc3MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvaW5kZXguY3NzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3N0eWxlcy9vcGVuc2lnbmRyaXZlLmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9zdHlsZXMvc2lnbmF0dXJlLmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvbm9kZV9tb2R1bGVzL3JlZHV4L2VzL3JlZHV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvYXNzZXRzL2ltYWdlcy9sb2dvLnBuZyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9maWxlLXNhdmVyL2Rpc3QvRmlsZVNhdmVyLm1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2NvbW1hbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvY29uc3RhbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvZm9jdXNJbnNpZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9mb2N1c0lzSGlkZGVuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvZm9jdXNTb2x2ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9mb2N1c2FibGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvbW92ZUZvY3VzSW5zaWRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvcmV0dXJuLWZvY3VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvc2libGluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3NvbHZlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL0RPTXV0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvYWxsLWFmZmVjdGVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvYXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9hdXRvLWZvY3VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvY29ycmVjdEZvY3VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvZmlyc3RGb2N1cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2dldEFjdGl2ZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9pcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL3BhcmVudGluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL3NhZmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy90YWJPcmRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL3RhYlV0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvdGFiYmFibGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLW91dGxpbmUtbWFuYWdlci9mb2N1cy1vdXRsaW5lLW1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZ2V0LW5vbmNlL2Rpc3QvZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzL2Rpc3QvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MuY2pzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3Mvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2h0bWwtcGFyc2Utc3RyaW5naWZ5L2Rpc3QvaHRtbC1wYXJzZS1zdHJpbmdpZnkubW9kdWxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC5kZWJvdW5jZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItZHouanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1rdy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWx5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItbWEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1wcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXNhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItdG4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2F6LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4tYmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYnIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9icy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2NhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jdi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2N5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS1hdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kdi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tYXUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1jYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWdiLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tbnouanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1zZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtZG8uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy1teC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLXVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2V1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9maS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZpbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci1jaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nb20tZGV2YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dvbS1sYXRuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ3UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hpLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9odS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2h5LWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9qYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2p2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ray5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ttLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t1LWttci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3kuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sYi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2xvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sdi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21zLW15LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL215LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9uZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25sLWJlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL29jLWxuYy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3BhLWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wdC1ici5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3B0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcm8uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ydS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zaS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zcS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NyLWN5cmwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zdy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90Zy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bC1waC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHpsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHptLWxhdG4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90em0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91Zy1jbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ei1sYXRuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXouanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS92aS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3gtcHNldWRvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUveW8uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1jbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLWhrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtbW8uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC10dy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlLyBzeW5jIF5cXC5cXC8uKiQiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L21vbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvZGVmbGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi9pbmZsYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9zdHJpbmdzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvYWRsZXIzMi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2NyYzMyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2d6aGVhZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mZmFzdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmxhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZ0cmVlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL21lc3NhZ2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvdHJlZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi96c3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0FuYWx5dGljcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Bbm9ueW1vdXNVdGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9DbG91ZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Db3JlTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9DcnlwdG9Db250cm9sbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0V2ZW50RW1pdHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9FdmVudHVhbGx5UXVldWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvRmFjZWJvb2tVdGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9JbmRleGVkREJTdG9yYWdlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9JbnN0YWxsYXRpb25Db250cm9sbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xpdmVRdWVyeUNsaWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9MaXZlUXVlcnlTdWJzY3JpcHRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvTG9jYWxEYXRhc3RvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyLmRlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5yZWFjdC1uYXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvTG9jYWxEYXRhc3RvcmVVdGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9PYmplY3RTdGF0ZU11dGF0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9PZmZsaW5lUXVlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VBQ0wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VDTFAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VDb25maWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VFcnJvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUZpbGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VHZW9Qb2ludC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUhvb2tzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlSW5zdGFsbGF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlTGl2ZVF1ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlT2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlT3AuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VQb2x5Z29uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlUXVlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VSZWxhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZVJvbGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VTY2hlbWEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VTZXNzaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlVXNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QdXNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1JFU1RDb250cm9sbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1NpbmdsZUluc3RhbmNlU3RhdGVDb250cm9sbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1NvY2tldC53ZWFwcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9TdG9yYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1N0b3JhZ2VDb250cm9sbGVyLmJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9TdG9yYWdlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9TdG9yYWdlQ29udHJvbGxlci5yZWFjdC1uYXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZUNvbnRyb2xsZXIud2VhcHAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvVGFza1F1ZXVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1VuaXF1ZUluc3RhbmNlU3RhdGVDb250cm9sbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1dlYlNvY2tldENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvWGhyLndlYXBwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL2FycmF5Q29udGFpbnNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvY2FuQmVTZXJpYWxpemVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL2RlY29kZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9lbmNvZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvZXF1YWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL2VzY2FwZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9pc1Jldm9jYWJsZVNlc3Npb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvcGFyc2VEYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL3Byb21pc2VVdGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci91bmlxdWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvdW5zYXZlZENoaWxkcmVuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL3V1aWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGRG9jdW1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGRG9jdW1lbnRPcHRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkVtYmVkZGVkRmlsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZFbWJlZGRlZFBhZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGRm9udC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZJbWFnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZKYXZhU2NyaXB0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERlBhZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGUGFnZU9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvU3RhbmRhcmRGb250cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9jb2xvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZXJyb3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGQnV0dG9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGQ2hlY2tCb3guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZEcm9wZG93bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERkZpZWxkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGRm9ybS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERk9wdGlvbkxpc3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZSYWRpb0dyb3VwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGU2lnbmF0dXJlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGVGV4dEZpZWxkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vYXBwZWFyYW5jZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9pbWFnZS9hbGlnbm1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvaW1hZ2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvb2JqZWN0cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9vcGVyYXRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL29wZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9yb3RhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvc2l6ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvc3ZnUGF0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS90ZXh0L2FsaWdubWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS90ZXh0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL3RleHQvbGF5b3V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9QREZDb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9QREZPYmplY3RDb3BpZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9CdXR0b24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9DaGVja0JveC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb0Nob2ljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb0NvbWJvQm94LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvRmllbGQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9Gb3JtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvTGlzdEJveC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb05vblRlcm1pbmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvUHVzaEJ1dHRvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb1JhZGlvQnV0dG9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvU2lnbmF0dXJlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvVGVybWluYWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9UZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9mbGFncy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hbm5vdGF0aW9uL0FwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fubm90YXRpb24vQm9yZGVyU3R5bGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fubm90YXRpb24vUERGQW5ub3RhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9QREZXaWRnZXRBbm5vdGF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hbm5vdGF0aW9uL2ZsYWdzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hbm5vdGF0aW9uL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9kb2N1bWVudC9QREZDcm9zc1JlZlNlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2RvY3VtZW50L1BERkhlYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZG9jdW1lbnQvUERGVHJhaWxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZG9jdW1lbnQvUERGVHJhaWxlckRpY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2VtYmVkZGVycy9DTWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvQ3VzdG9tRm9udEVtYmVkZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvRmlsZUVtYmVkZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvRm9udEZsYWdzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvSmF2YVNjcmlwdEVtYmVkZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvSnBlZ0VtYmVkZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvUERGUGFnZUVtYmVkZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvUG5nRW1iZWRkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2VtYmVkZGVycy9TdGFuZGFyZEZvbnRFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZXJyb3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvaW50ZXJhY3RpdmUvVmlld2VyUHJlZmVyZW5jZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGQm9vbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZEaWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERkhleFN0cmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZJbnZhbGlkT2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERk5hbWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGTnVsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZOdW1iZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGT2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERlJhd1N0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZSZWYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERlN0cmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb3BlcmF0b3JzL1BERk9wZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vcGVyYXRvcnMvUERGT3BlcmF0b3JOYW1lcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL0Jhc2VQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3BhcnNlci9CeXRlU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9wYXJzZXIvUERGT2JqZWN0UGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9wYXJzZXIvUERGT2JqZWN0U3RyZWFtUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9wYXJzZXIvUERGUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9wYXJzZXIvUERGWFJlZlN0cmVhbVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9Bc2NpaTg1U3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJlYW1zL0FzY2lpSGV4U3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJlYW1zL0RlY29kZVN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9GbGF0ZVN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9MWldTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvUnVuTGVuZ3RoU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJlYW1zL1N0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9kZWNvZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGQ2F0YWxvZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZDb250ZW50U3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJ1Y3R1cmVzL1BERkNyb3NzUmVmU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJ1Y3R1cmVzL1BERkZsYXRlU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJ1Y3R1cmVzL1BERk9iamVjdFN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZQYWdlTGVhZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZQYWdlVHJlZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3ludGF4L0NoYXJDb2Rlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3ludGF4L0RlbGltaXRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9JcnJlZ3VsYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9LZXl3b3Jkcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3ludGF4L051bWVyaWMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9XaGl0ZXNwYWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS93cml0ZXJzL1BERlN0cmVhbVdyaXRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvd3JpdGVycy9QREZXcml0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3R5cGVzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9hcnJheXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9hc3luYy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL2Jhc2U2NC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL2Vycm9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvbnVtYmVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL29iamVjdHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9wZGZEb2NFbmNvZGluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL3BuZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL3JuZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL3N0cmluZ3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy91bmljb2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvdmFsaWRhdG9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJpbnQtanMvZGlzdC9wcmludC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2NoZWNrUHJvcFR5cGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9oYXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlLXJlc2l6YWJsZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmUtcmVzaXphYmxlL2xpYi9yZXNpemVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWNsaWVudHNpZGUtZWZmZWN0L2xpYi9pbmRleC5lcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1jb25mZXR0aS9kaXN0L3JlYWN0LWNvbmZldHRpLm1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL2Rpc3QvcmVhY3QtZGF0ZXBpY2tlci5taW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9hZGRMZWFkaW5nWmVyb3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9kZWZhdWx0TG9jYWxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZGVmYXVsdE9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvZm9ybWF0dGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2Zvcm1hdC9saWdodEZvcm1hdHRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvbG9uZ0Zvcm1hdHRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvcHJvdGVjdGVkVG9rZW5zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZERheXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkSG91cnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWlsbGlzZWNvbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZE1pbnV0ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTW9udGhzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFF1YXJ0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFNlY29uZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkV2Vla3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkWWVhcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2NvbnN0cnVjdEZyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZkRheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZk1vbnRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mV2Vlay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlllYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheU9mWWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXlzSW5Nb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREZWZhdWx0T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRIb3Vycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRJU09EYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vlay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRJU09XZWVrWWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRNaW51dGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldE1vbnRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFF1YXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0U2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRUaW1lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0V2Vla1llYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0WWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0FmdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzQmVmb3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0VxdWFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZURheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVNb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVRdWFydGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZVllYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNWYWxpZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1dpdGhpbkludGVydmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkTG9jYWxpemVGbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoRm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0RGlzdGFuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0TG9uZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9sb2NhbGl6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9tYXRjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tYXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlSVNPLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvU2V0dGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvY29uc3RhbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvQU1QTU1pZG5pZ2h0UGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9BTVBNUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXRlUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXlPZlllYXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RheVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5UGVyaW9kUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9FcmFQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0V4dGVuZGVkWWVhclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRnJhY3Rpb25PZlNlY29uZFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjBUbzExUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMHRvMjNQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIxVG8yNFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjF0bzEyUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09EYXlQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1RpbWV6b25lUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09UaW1lem9uZVdpdGhaUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09XZWVrUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09XZWVrWWVhclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTG9jYWxEYXlQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsV2Vla1BhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTG9jYWxXZWVrWWVhclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTWludXRlUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Nb250aFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvUXVhcnRlclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU2Vjb25kUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1N0YW5kQWxvbmVNb250aFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvVGltZXN0YW1wU2Vjb25kc1BhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvWWVhclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXREYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0SG91cnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0SVNPRGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT1dlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0TWludXRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRNb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRRdWFydGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFNlY29uZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0V2Vlay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZEYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZklTT1dlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZklTT1dlZWtZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZNb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mUXVhcnRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vlay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vla1llYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlllYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViRGF5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNb250aHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViUXVhcnRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViV2Vla3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViWWVhcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvdG9EYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3RyYW5zcG9zZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2xpZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvRHJhZ2dhYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvRHJhZ2dhYmxlQ29yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvYnVpbGQvY2pzL2Nqcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvYnVpbGQvY2pzL3V0aWxzL2RvbUZucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvYnVpbGQvY2pzL3V0aWxzL2dldFByZWZpeC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvYnVpbGQvY2pzL3V0aWxzL2xvZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvYnVpbGQvY2pzL3V0aWxzL3Bvc2l0aW9uRm5zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvdXRpbHMvc2hpbXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL25vZGVfbW9kdWxlcy9jbHN4L2Rpc3QvY2xzeC5tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZhc3QtY29tcGFyZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L0F1dG9Gb2N1c0luc2lkZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L0NvbWJpbmF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvRm9jdXNHdWFyZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L0ZyZWVGb2N1c0luc2lkZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L0xvY2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9Nb3ZlRm9jdXNJbnNpZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9UcmFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvVUkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L21lZGl1bS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L25hbm8tZXZlbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvc2NvcGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91c2UtZm9jdXMtc2NvcGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91c2UtZm9jdXMtc3RhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWhlbG1ldC9lcy9IZWxtZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW9uY2xpY2tvdXRzaWRlL2Rpc3QvcmVhY3Qtb25jbGlja291dHNpZGUuZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC1iYXIvZGlzdC9lczIwMTUvY29tcG9uZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwtYmFyL2Rpc3QvZXMyMDE1L2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsLWJhci9kaXN0L2VzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsLWJhci9kaXN0L2VzMjAxNS91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsL2Rpc3QvZXMyMDE1L0NvbWJpbmF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwvZGlzdC9lczIwMTUvU2lkZUVmZmVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsL2Rpc3QvZXMyMDE1L1VJLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwvZGlzdC9lczIwMTUvYWdncmVzaXZlQ2FwdHVyZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsL2Rpc3QvZXMyMDE1L2hhbmRsZVNjcm9sbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsL2Rpc3QvZXMyMDE1L21lZGl1bS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsL2Rpc3QvZXMyMDE1L3NpZGVjYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm5kL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1zY3JvbGxiYXJzLWN1c3RvbS9kaXN0L3JzYy5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc2lkZS1lZmZlY3QvbGliL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXNpZ25hdHVyZS1jYW52YXMvYnVpbGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc3R5bGUtc2luZ2xldG9uL2Rpc3QvZXMyMDE1L2NvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1zdHlsZS1zaW5nbGV0b24vZGlzdC9lczIwMTUvaG9vay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1zdHlsZS1zaW5nbGV0b24vZGlzdC9lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc3R5bGUtc2luZ2xldG9uL2Rpc3QvZXMyMDE1L3NpbmdsZXRvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2pzeC1ydW50aW1lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0b3VyL2Rpc3QvcmVhY3RvdXIuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0b3VyL25vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0b3VyL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2NoZWNrUHJvcFR5cGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0b3VyL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0b3VyL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0b3VyL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0b3VyL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWdleC1wYXJzZXIvbGliL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Njcm9sbC1zbW9vdGgvZGlzdC9hbmNob3JTY3JvbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc2Nyb2xsLXNtb290aC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Njcm9sbC1zbW9vdGgvZGlzdC9vYnNlcnZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Njcm9sbC1zbW9vdGgvZGlzdC9zY3JvbGxTbW9vdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc2Nyb2xsLXNtb290aC9kaXN0L3Rvb2xzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Njcm9sbHBhcmVudC9zY3JvbGxwYXJlbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc2hhbGxvd2VxdWFsL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvZGlzdC9yZWFjdC1kYXRlcGlja2VyLmNzcz8zZjQzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2luZGV4LmNzcz8wNTM4Iiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3N0eWxlcy9vcGVuc2lnbmRyaXZlLmNzcz82M2QwIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3N0eWxlcy9zaWduYXR1cmUuY3NzP2M2M2MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZWQtY29tcG9uZW50cy9kaXN0L3N0eWxlZC1jb21wb25lbnRzLmJyb3dzZXIuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlZC1jb21wb25lbnRzL25vZGVfbW9kdWxlcy9AZW1vdGlvbi91bml0bGVzcy9kaXN0L3VuaXRsZXNzLmJyb3dzZXIuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3RhYmJhYmxlL2Rpc3QvaW5kZXguZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3RyaW0tY2FudmFzL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1jYWxsYmFjay1yZWYvZGlzdC9lczIwMTUvYXNzaWduUmVmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1jYWxsYmFjay1yZWYvZGlzdC9lczIwMTUvdXNlTWVyZ2VSZWYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLWNhbGxiYWNrLXJlZi9kaXN0L2VzMjAxNS91c2VSZWYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLXNpZGVjYXIvZGlzdC9lczIwMTUvZXhwb3J0cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91c2Utc2lkZWNhci9kaXN0L2VzMjAxNS9tZWRpdW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXdpdGgtc2VsZWN0b3IuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvd2l0aC1zZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9tYXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL25hdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9uaWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvcGFyc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvcm5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3NoYTEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3YxLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3YxVG9WNi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92My5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92MzUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjZUb1YxLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3Y3LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdm9pZC1lbGVtZW50cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy93YXJuaW5nL3dhcm5pbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvd3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy96b29tLWxldmVsL2Rpc3Qvem9vbS1sZXZlbC5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvaWdub3JlZHxDOlxcdml0ZVxcYXBwc1xcT3BlblNpZ25cXG5vZGVfbW9kdWxlc1xcY3J5cHRvLWpzfGNyeXB0byIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2JpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZXZlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maW5kLWluZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2tleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zcGxpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvbWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvbnVtYmVyL2lzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2NyZWF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9mcmVlemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3BhcnNlLWludC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXQtaW50ZXJ2YWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXQtdGltZW91dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3dlYWstbWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy90b1ByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvdG9Qcm9wZXJ0eUtleS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvdHlwZW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9hY3R1YWwvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvYWN0dWFsL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvYWN0dWFsL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvYWN0dWFsL3N5bWJvbC90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L2lzLWFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2V2ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9maW5kLWluZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvcmVkdWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL3NsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL3NvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvc3BsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvZnVuY3Rpb24vdmlydHVhbC9iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2V2ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2ZpbmQtaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2luY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvbWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL3NsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9zb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9zcGxpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL3N0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9qc29uL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvbWFwL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9udW1iZXIvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2NyZWF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9mcmVlemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvcGFyc2UtaW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9zZXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3N0cmluZy92aXJ0dWFsL2luY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9zdHJpbmcvdmlydHVhbC9zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvc3ltYm9sL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9zeW1ib2wvaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3N5bWJvbC90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3dlYWstbWFwL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mZWF0dXJlcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mZWF0dXJlcy9zeW1ib2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZmVhdHVyZXMvc3ltYm9sL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZnVsbC9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mdWxsL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZnVsbC9zeW1ib2wvaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2Z1bGwvc3ltYm9sL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2EtY2FsbGFibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hLXNldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLW5vbi1leHRlbnNpYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1zb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jYWxsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NsYXNzb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvbGxlY3Rpb24td2Vhay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RhdGUtdG8taXNvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kb20taXRlcmFibGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vudmlyb25tZW50LWZmLXZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1pZS1vci1lZGdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtaW9zLXBlYmJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLWlvcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLW5vZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy13ZWJvcy13ZWJraXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdjgtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vudmlyb25tZW50LXdlYmtpdC12ZXJzaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW52aXJvbm1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2V4cG9ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2ZhaWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnJlZXppbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi1hcHBseS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWFjY2Vzc29yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLWRpcmVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtanNvbi1yZXBsYWNlci1mdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtc2V0LXJlY29yZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dsb2JhbC10aGlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2hpZGRlbi1rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaHRtbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2luc3RhbGwtZXJyb3ItY2F1c2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1wb3NzaWJsZS1wcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1wdXJlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtc3ltYm9sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0ZS1zaW1wbGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRvci1jcmVhdGUtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbWFwLWhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9tYXRoLXRydW5jLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbWljcm90YXNrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9ub3QtYS1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtaXMtZXh0ZW5zaWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC10by1hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vd24ta2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3BhdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9wZXJmb3JtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcXVldWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zYWZlLWdldC1idWlsdC1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NjaGVkdWxlcnMtZml4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWNsb25lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWRpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaGVscGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1pbnRlcnNlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaXMtZGlzam9pbnQtZnJvbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1pcy1zdWJzZXQtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaXMtc3VwZXJzZXQtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaXRlcmF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LXNpemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1zeW1tZXRyaWMtZGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LXVuaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3RyaW5nLXBhZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zeW1ib2wtZGVmaW5lLXRvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N5bWJvbC1pcy1yZWdpc3RlcmVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3ltYm9sLWlzLXdlbGwta25vd24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zeW1ib2wtcmVnaXN0cnktZGV0ZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdGFzay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3VpZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdjgtcHJvdG90eXBlLWRlZmluZS1idWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvd2Vhay1tYXAtYmFzaWMtZGV0ZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYWdncmVnYXRlLWVycm9yLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuZXZlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmlzLWFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5Lm1hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuc2xpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuc29ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuZGF0ZS50by1qc29uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmRhdGUudG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmZ1bmN0aW9uLmJpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm1hcC5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5tYXAuZ3JvdXAtYnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMubWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5udW1iZXIuaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuZnJlZXplLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuYWxsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuYW55LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuY2F0Y2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLnJhY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5yZWplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5yZXNvbHZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2Uud2l0aC1yZXNvbHZlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucmVmbGVjdC50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuZGlmZmVyZW5jZS52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuaW50ZXJzZWN0aW9uLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5pcy1kaXNqb2ludC1mcm9tLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5pcy1zdWJzZXQtb2YudjIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LmlzLXN1cGVyc2V0LW9mLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuc3ltbWV0cmljLWRpZmZlcmVuY2UudjIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LnVuaW9uLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5mb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmhhcy1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wua2V5LWZvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gtYWxsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wucmVwbGFjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuc2VhcmNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5zcGVjaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5zcGxpdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wudG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC51bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuZnVuY3Rpb24ubWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5hc3luYy1kaXNwb3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuY3VzdG9tLW1hdGNoZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5kaXNwb3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtcmVnaXN0ZXJlZC1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5pcy1yZWdpc3RlcmVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5pcy13ZWxsLWtub3duLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wubWF0Y2hlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLm1ldGFkYXRhLWtleS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLm1ldGFkYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wub2JzZXJ2YWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLnBhdHRlcm4tbWF0Y2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5yZXBsYWNlLWFsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvd2ViLnNldC1pbnRlcnZhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy93ZWIuc2V0LXRpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvd2ViLnRpbWVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2FycmF5L3ZpcnR1YWwvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2FycmF5L3ZpcnR1YWwvZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS92aXJ0dWFsL2tleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS92aXJ0dWFsL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2JpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZXZlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9maW5kLWluZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2tleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3NvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zcGxpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2pzb24vc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvbWFwL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvbnVtYmVyL2lzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2NyZWF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9mcmVlemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3BhcnNlLWludC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3Byb21pc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zZXQtaW50ZXJ2YWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zZXQtdGltZW91dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3NldC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3N5bWJvbC90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS93ZWFrLW1hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJvcGVydHlLZXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9jb3JlL2Rpc3QvZmxvYXRpbmctdWkuY29yZS5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL2RvbS9kaXN0L2Zsb2F0aW5nLXVpLmRvbS5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL3JlYWN0LWRvbS9kaXN0L2Zsb2F0aW5nLXVpLnJlYWN0LWRvbS5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL3JlYWN0L2Rpc3QvZmxvYXRpbmctdWkucmVhY3QudXRpbHMubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS91dGlscy9kaXN0L2Zsb2F0aW5nLXVpLnV0aWxzLmRvbS5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL3V0aWxzL2Rpc3QvZmxvYXRpbmctdWkudXRpbHMubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9wcmltaXRpdmUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWFycm93L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1jb2xsZWN0aW9uL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnMvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWNvbnRleHQvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWRpcmVjdGlvbi9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtZGlzbWlzc2FibGUtbGF5ZXIvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWRyb3Bkb3duLW1lbnUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWZvY3VzLWd1YXJkcy9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtZm9jdXMtc2NvcGUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWlkL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1tZW51L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wb3BwZXIvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXBvcnRhbC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtcHJlc2VuY2UvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3Qtcm92aW5nLWZvY3VzL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1zbG90L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtY29udHJvbGxhYmxlLXN0YXRlL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtZXNjYXBlLWtleWRvd24vZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1sYXlvdXQtZWZmZWN0L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2Utc2l6ZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC9Bc2FwUXVldWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvUmF3VGFzay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC9UYXNrRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC9hc2FwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1kbmQvYXNhcC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1kbmQvYXNhcC9kaXN0L21ha2VSZXF1ZXN0Q2FsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC90eXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2ludmFyaWFudC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWR1eGpzL3Rvb2xraXQvZGlzdC9yZWR1eC10b29sa2l0Lm1vZGVybi5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL2FkYXB0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy9mZXRjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMveGhyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9heGlvcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbFRva2VuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsZWRFcnJvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL2lzQ2FuY2VsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zRXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3NIZWFkZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0ludGVyY2VwdG9yTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9idWlsZEZ1bGxQYXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9tZXJnZUNvbmZpZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9zZXR0bGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZGVmYXVsdHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzL3RyYW5zaXRpb25hbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZW52L2RhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvSHR0cFN0YXR1c0NvZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb21iaW5lVVJMcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb21wb3NlU2lnbmFscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBeGlvc0Vycm9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9udWxsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZVByb3RvY29sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Byb2dyZXNzRXZlbnRSZWR1Y2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Jlc29sdmVDb25maWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3BlZWRvbWV0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Rocm90dGxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3RvRm9ybURhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdG9VUkxFbmNvZGVkRm9ybS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90cmFja1N0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy92YWxpZGF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9CbG9iLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2NsYXNzZXMvRm9ybURhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9VUkxTZWFyY2hQYXJhbXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2NvbW1vbi91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2Nsc3gvZGlzdC9jbHN4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kZXF1YWwvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL2JlZ2luRHJhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvZHJvcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvZW5kRHJhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvaG92ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC9sb2NhbC9zZXRDbGllbnRPZmZzZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL3B1Ymxpc2hEcmFnU291cmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC90eXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvcmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9jbGFzc2VzL0RyYWdEcm9wTWFuYWdlckltcGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9jbGFzc2VzL0RyYWdEcm9wTW9uaXRvckltcGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9jbGFzc2VzL0hhbmRsZXJSZWdpc3RyeUltcGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9jb250cmFjdHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9jcmVhdGVEcmFnRHJvcE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9pbnRlcmZhY2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvcmVkdWNlcnMvZGlydHlIYW5kbGVySWRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvcmVkdWNlcnMvZHJhZ09mZnNldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3JlZHVjZXJzL2RyYWdPcGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9yZWR1Y2Vycy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3JlZHVjZXJzL3JlZkNvdW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvcmVkdWNlcnMvc3RhdGVJZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3V0aWxzL2Nvb3Jkcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3V0aWxzL2RpcnRpbmVzcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3V0aWxzL2VxdWFsaXR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvdXRpbHMvZ2V0TmV4dFVuaXF1ZUlkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvdXRpbHMvanNfdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC91dGlscy9tYXRjaGVzVHlwZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9pMThuZXh0LWJyb3dzZXItbGFuZ3VhZ2VkZXRlY3Rvci9kaXN0L2VzbS9pMThuZXh0QnJvd3Nlckxhbmd1YWdlRGV0ZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaTE4bmV4dC9kaXN0L2VzbS9pMThuZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2lkYi1rZXl2YWwvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9pbW1lci9kaXN0L2ltbWVyLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tYWtlLWNhbmNlbGxhYmxlLXByb21pc2UvZGlzdC9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbWFrZS1ldmVudC1wcm9wcy9kaXN0L2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tZXJnZS1yZWZzL2Rpc3QvZXNtL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZmpzLWRpc3QvYnVpbGQvcGRmLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L0Jyb3dzZXJEZXRlY3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L0VudGVyTGVhdmVDb3VudGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvSFRNTDVCYWNrZW5kSW1wbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L01vbm90b25pY0ludGVycG9sYW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvTmF0aXZlRHJhZ1NvdXJjZXMvTmF0aXZlRHJhZ1NvdXJjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L05hdGl2ZURyYWdTb3VyY2VzL2dldERhdGFGcm9tRGF0YVRyYW5zZmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvTmF0aXZlRHJhZ1NvdXJjZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9OYXRpdmVEcmFnU291cmNlcy9uYXRpdmVUeXBlc0NvbmZpZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L05hdGl2ZVR5cGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvT2Zmc2V0VXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9PcHRpb25zUmVhZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvZ2V0RW1wdHlJbWFnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvdXRpbHMvanNfdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kL2Rpc3QvY29yZS9EbmRDb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC9kaXN0L2NvcmUvRG5kUHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL0kxOG5leHRQcm92aWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvVHJhbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL1RyYW5zV2l0aG91dENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL1RyYW5zbGF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9jb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9kZWZhdWx0cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvaTE4bkluc3RhbmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvaW5pdFJlYWN0STE4bmV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvdW5lc2NhcGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL3VzZVNTUi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvdXNlVHJhbnNsYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy93aXRoU1NSLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy93aXRoVHJhbnNsYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL0RvY3VtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9Eb2N1bWVudENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL0xpbmtTZXJ2aWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9NZXNzYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9QYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9QYWdlQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vUGFnZS9Bbm5vdGF0aW9uTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1BhZ2UvQ2FudmFzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9QYWdlL1RleHRMYXllci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vUGFzc3dvcmRSZXNwb25zZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1N0cnVjdFRyZWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1N0cnVjdFRyZWVJdGVtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9zaGFyZWQvY29uc3RhbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9zaGFyZWQvaG9va3MvdXNlRG9jdW1lbnRDb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9zaGFyZWQvaG9va3MvdXNlUGFnZUNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL3NoYXJlZC9ob29rcy91c2VSZXNvbHZlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vc2hhcmVkL3N0cnVjdFRyZWVVdGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vc2hhcmVkL3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2Rpc3QvcmVhY3QtcmVkdXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2Rpc3QvcmVkdXgtdGh1bmsubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlZHV4L2Rpc3QvcmVkdXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Jlc2VsZWN0L2Rpc3QvcmVzZWxlY3QubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3NpZ25hdHVyZV9wYWQvZGlzdC9zaWduYXR1cmVfcGFkLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy90aW55LWludmFyaWFudC9kaXN0L2VzbS90aW55LWludmFyaWFudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9jcmVhdGUgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9wdWJsaWNQYXRoIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9qc29ucCBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9ub25jZSIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9zY3JpcHQvUHVibGljVGVtcGxhdGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJQdWJsaWNUZW1wbGF0ZVwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJQdWJsaWNUZW1wbGF0ZVwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJQdWJsaWNUZW1wbGF0ZVwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsICgpID0+IHtcbnJldHVybiAiLCJpbXBvcnQgbWVtb2l6ZSBmcm9tICdAZW1vdGlvbi9tZW1vaXplJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG52YXIgcmVhY3RQcm9wc1JlZ2V4ID0gL14oKGNoaWxkcmVufGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MfGtleXxyZWZ8YXV0b0ZvY3VzfGRlZmF1bHRWYWx1ZXxkZWZhdWx0Q2hlY2tlZHxpbm5lckhUTUx8c3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nfHN1cHByZXNzSHlkcmF0aW9uV2FybmluZ3x2YWx1ZUxpbmt8YWJicnxhY2NlcHR8YWNjZXB0Q2hhcnNldHxhY2Nlc3NLZXl8YWN0aW9ufGFsbG93fGFsbG93VXNlck1lZGlhfGFsbG93UGF5bWVudFJlcXVlc3R8YWxsb3dGdWxsU2NyZWVufGFsbG93VHJhbnNwYXJlbmN5fGFsdHxhc3luY3xhdXRvQ29tcGxldGV8YXV0b1BsYXl8Y2FwdHVyZXxjZWxsUGFkZGluZ3xjZWxsU3BhY2luZ3xjaGFsbGVuZ2V8Y2hhclNldHxjaGVja2VkfGNpdGV8Y2xhc3NJRHxjbGFzc05hbWV8Y29sc3xjb2xTcGFufGNvbnRlbnR8Y29udGVudEVkaXRhYmxlfGNvbnRleHRNZW51fGNvbnRyb2xzfGNvbnRyb2xzTGlzdHxjb29yZHN8Y3Jvc3NPcmlnaW58ZGF0YXxkYXRlVGltZXxkZWNvZGluZ3xkZWZhdWx0fGRlZmVyfGRpcnxkaXNhYmxlZHxkaXNhYmxlUGljdHVyZUluUGljdHVyZXxkaXNhYmxlUmVtb3RlUGxheWJhY2t8ZG93bmxvYWR8ZHJhZ2dhYmxlfGVuY1R5cGV8ZW50ZXJLZXlIaW50fGZvcm18Zm9ybUFjdGlvbnxmb3JtRW5jVHlwZXxmb3JtTWV0aG9kfGZvcm1Ob1ZhbGlkYXRlfGZvcm1UYXJnZXR8ZnJhbWVCb3JkZXJ8aGVhZGVyc3xoZWlnaHR8aGlkZGVufGhpZ2h8aHJlZnxocmVmTGFuZ3xodG1sRm9yfGh0dHBFcXVpdnxpZHxpbnB1dE1vZGV8aW50ZWdyaXR5fGlzfGtleVBhcmFtc3xrZXlUeXBlfGtpbmR8bGFiZWx8bGFuZ3xsaXN0fGxvYWRpbmd8bG9vcHxsb3d8bWFyZ2luSGVpZ2h0fG1hcmdpbldpZHRofG1heHxtYXhMZW5ndGh8bWVkaWF8bWVkaWFHcm91cHxtZXRob2R8bWlufG1pbkxlbmd0aHxtdWx0aXBsZXxtdXRlZHxuYW1lfG5vbmNlfG5vVmFsaWRhdGV8b3BlbnxvcHRpbXVtfHBhdHRlcm58cGxhY2Vob2xkZXJ8cGxheXNJbmxpbmV8cG9zdGVyfHByZWxvYWR8cHJvZmlsZXxyYWRpb0dyb3VwfHJlYWRPbmx5fHJlZmVycmVyUG9saWN5fHJlbHxyZXF1aXJlZHxyZXZlcnNlZHxyb2xlfHJvd3N8cm93U3BhbnxzYW5kYm94fHNjb3BlfHNjb3BlZHxzY3JvbGxpbmd8c2VhbWxlc3N8c2VsZWN0ZWR8c2hhcGV8c2l6ZXxzaXplc3xzbG90fHNwYW58c3BlbGxDaGVja3xzcmN8c3JjRG9jfHNyY0xhbmd8c3JjU2V0fHN0YXJ0fHN0ZXB8c3R5bGV8c3VtbWFyeXx0YWJJbmRleHx0YXJnZXR8dGl0bGV8dHJhbnNsYXRlfHR5cGV8dXNlTWFwfHZhbHVlfHdpZHRofHdtb2RlfHdyYXB8YWJvdXR8ZGF0YXR5cGV8aW5saXN0fHByZWZpeHxwcm9wZXJ0eXxyZXNvdXJjZXx0eXBlb2Z8dm9jYWJ8YXV0b0NhcGl0YWxpemV8YXV0b0NvcnJlY3R8YXV0b1NhdmV8Y29sb3J8aW5jcmVtZW50YWx8ZmFsbGJhY2t8aW5lcnR8aXRlbVByb3B8aXRlbVNjb3BlfGl0ZW1UeXBlfGl0ZW1JRHxpdGVtUmVmfG9ufG9wdGlvbnxyZXN1bHRzfHNlY3VyaXR5fHVuc2VsZWN0YWJsZXxhY2NlbnRIZWlnaHR8YWNjdW11bGF0ZXxhZGRpdGl2ZXxhbGlnbm1lbnRCYXNlbGluZXxhbGxvd1Jlb3JkZXJ8YWxwaGFiZXRpY3xhbXBsaXR1ZGV8YXJhYmljRm9ybXxhc2NlbnR8YXR0cmlidXRlTmFtZXxhdHRyaWJ1dGVUeXBlfGF1dG9SZXZlcnNlfGF6aW11dGh8YmFzZUZyZXF1ZW5jeXxiYXNlbGluZVNoaWZ0fGJhc2VQcm9maWxlfGJib3h8YmVnaW58Ymlhc3xieXxjYWxjTW9kZXxjYXBIZWlnaHR8Y2xpcHxjbGlwUGF0aFVuaXRzfGNsaXBQYXRofGNsaXBSdWxlfGNvbG9ySW50ZXJwb2xhdGlvbnxjb2xvckludGVycG9sYXRpb25GaWx0ZXJzfGNvbG9yUHJvZmlsZXxjb2xvclJlbmRlcmluZ3xjb250ZW50U2NyaXB0VHlwZXxjb250ZW50U3R5bGVUeXBlfGN1cnNvcnxjeHxjeXxkfGRlY2VsZXJhdGV8ZGVzY2VudHxkaWZmdXNlQ29uc3RhbnR8ZGlyZWN0aW9ufGRpc3BsYXl8ZGl2aXNvcnxkb21pbmFudEJhc2VsaW5lfGR1cnxkeHxkeXxlZGdlTW9kZXxlbGV2YXRpb258ZW5hYmxlQmFja2dyb3VuZHxlbmR8ZXhwb25lbnR8ZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZHxmaWxsfGZpbGxPcGFjaXR5fGZpbGxSdWxlfGZpbHRlcnxmaWx0ZXJSZXN8ZmlsdGVyVW5pdHN8Zmxvb2RDb2xvcnxmbG9vZE9wYWNpdHl8Zm9jdXNhYmxlfGZvbnRGYW1pbHl8Zm9udFNpemV8Zm9udFNpemVBZGp1c3R8Zm9udFN0cmV0Y2h8Zm9udFN0eWxlfGZvbnRWYXJpYW50fGZvbnRXZWlnaHR8Zm9ybWF0fGZyb218ZnJ8Znh8Znl8ZzF8ZzJ8Z2x5cGhOYW1lfGdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsfGdseXBoT3JpZW50YXRpb25WZXJ0aWNhbHxnbHlwaFJlZnxncmFkaWVudFRyYW5zZm9ybXxncmFkaWVudFVuaXRzfGhhbmdpbmd8aG9yaXpBZHZYfGhvcml6T3JpZ2luWHxpZGVvZ3JhcGhpY3xpbWFnZVJlbmRlcmluZ3xpbnxpbjJ8aW50ZXJjZXB0fGt8azF8azJ8azN8azR8a2VybmVsTWF0cml4fGtlcm5lbFVuaXRMZW5ndGh8a2VybmluZ3xrZXlQb2ludHN8a2V5U3BsaW5lc3xrZXlUaW1lc3xsZW5ndGhBZGp1c3R8bGV0dGVyU3BhY2luZ3xsaWdodGluZ0NvbG9yfGxpbWl0aW5nQ29uZUFuZ2xlfGxvY2FsfG1hcmtlckVuZHxtYXJrZXJNaWR8bWFya2VyU3RhcnR8bWFya2VySGVpZ2h0fG1hcmtlclVuaXRzfG1hcmtlcldpZHRofG1hc2t8bWFza0NvbnRlbnRVbml0c3xtYXNrVW5pdHN8bWF0aGVtYXRpY2FsfG1vZGV8bnVtT2N0YXZlc3xvZmZzZXR8b3BhY2l0eXxvcGVyYXRvcnxvcmRlcnxvcmllbnR8b3JpZW50YXRpb258b3JpZ2lufG92ZXJmbG93fG92ZXJsaW5lUG9zaXRpb258b3ZlcmxpbmVUaGlja25lc3N8cGFub3NlMXxwYWludE9yZGVyfHBhdGhMZW5ndGh8cGF0dGVybkNvbnRlbnRVbml0c3xwYXR0ZXJuVHJhbnNmb3JtfHBhdHRlcm5Vbml0c3xwb2ludGVyRXZlbnRzfHBvaW50c3xwb2ludHNBdFh8cG9pbnRzQXRZfHBvaW50c0F0WnxwcmVzZXJ2ZUFscGhhfHByZXNlcnZlQXNwZWN0UmF0aW98cHJpbWl0aXZlVW5pdHN8cnxyYWRpdXN8cmVmWHxyZWZZfHJlbmRlcmluZ0ludGVudHxyZXBlYXRDb3VudHxyZXBlYXREdXJ8cmVxdWlyZWRFeHRlbnNpb25zfHJlcXVpcmVkRmVhdHVyZXN8cmVzdGFydHxyZXN1bHR8cm90YXRlfHJ4fHJ5fHNjYWxlfHNlZWR8c2hhcGVSZW5kZXJpbmd8c2xvcGV8c3BhY2luZ3xzcGVjdWxhckNvbnN0YW50fHNwZWN1bGFyRXhwb25lbnR8c3BlZWR8c3ByZWFkTWV0aG9kfHN0YXJ0T2Zmc2V0fHN0ZERldmlhdGlvbnxzdGVtaHxzdGVtdnxzdGl0Y2hUaWxlc3xzdG9wQ29sb3J8c3RvcE9wYWNpdHl8c3RyaWtldGhyb3VnaFBvc2l0aW9ufHN0cmlrZXRocm91Z2hUaGlja25lc3N8c3RyaW5nfHN0cm9rZXxzdHJva2VEYXNoYXJyYXl8c3Ryb2tlRGFzaG9mZnNldHxzdHJva2VMaW5lY2FwfHN0cm9rZUxpbmVqb2lufHN0cm9rZU1pdGVybGltaXR8c3Ryb2tlT3BhY2l0eXxzdHJva2VXaWR0aHxzdXJmYWNlU2NhbGV8c3lzdGVtTGFuZ3VhZ2V8dGFibGVWYWx1ZXN8dGFyZ2V0WHx0YXJnZXRZfHRleHRBbmNob3J8dGV4dERlY29yYXRpb258dGV4dFJlbmRlcmluZ3x0ZXh0TGVuZ3RofHRvfHRyYW5zZm9ybXx1MXx1Mnx1bmRlcmxpbmVQb3NpdGlvbnx1bmRlcmxpbmVUaGlja25lc3N8dW5pY29kZXx1bmljb2RlQmlkaXx1bmljb2RlUmFuZ2V8dW5pdHNQZXJFbXx2QWxwaGFiZXRpY3x2SGFuZ2luZ3x2SWRlb2dyYXBoaWN8dk1hdGhlbWF0aWNhbHx2YWx1ZXN8dmVjdG9yRWZmZWN0fHZlcnNpb258dmVydEFkdll8dmVydE9yaWdpblh8dmVydE9yaWdpbll8dmlld0JveHx2aWV3VGFyZ2V0fHZpc2liaWxpdHl8d2lkdGhzfHdvcmRTcGFjaW5nfHdyaXRpbmdNb2RlfHh8eEhlaWdodHx4MXx4Mnx4Q2hhbm5lbFNlbGVjdG9yfHhsaW5rQWN0dWF0ZXx4bGlua0FyY3JvbGV8eGxpbmtIcmVmfHhsaW5rUm9sZXx4bGlua1Nob3d8eGxpbmtUaXRsZXx4bGlua1R5cGV8eG1sQmFzZXx4bWxuc3x4bWxuc1hsaW5rfHhtbExhbmd8eG1sU3BhY2V8eXx5MXx5Mnx5Q2hhbm5lbFNlbGVjdG9yfHp8em9vbUFuZFBhbnxmb3J8Y2xhc3N8YXV0b2ZvY3VzKXwoKFtEZF1bQWFdW1R0XVtBYV18W0FhXVtScl1bSWldW0FhXXx4KS0uKikpJC87IC8vIGh0dHBzOi8vZXNiZW5jaC5jb20vYmVuY2gvNWJmZWU2OGE0Y2Q3ZTYwMDllZjYxZDIzXG5cbnZhciBpc1Byb3BWYWxpZCA9IC8qICNfX1BVUkVfXyAqL21lbW9pemUoZnVuY3Rpb24gKHByb3ApIHtcbiAgcmV0dXJuIHJlYWN0UHJvcHNSZWdleC50ZXN0KHByb3ApIHx8IHByb3AuY2hhckNvZGVBdCgwKSA9PT0gMTExXG4gIC8qIG8gKi9cbiAgJiYgcHJvcC5jaGFyQ29kZUF0KDEpID09PSAxMTBcbiAgLyogbiAqL1xuICAmJiBwcm9wLmNoYXJDb2RlQXQoMikgPCA5MTtcbn1cbi8qIForMSAqL1xuKTtcblxuZXhwb3J0IHsgaXNQcm9wVmFsaWQgYXMgZGVmYXVsdCB9O1xuIiwiZnVuY3Rpb24gbWVtb2l6ZShmbikge1xuICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgIGlmIChjYWNoZVthcmddID09PSB1bmRlZmluZWQpIGNhY2hlW2FyZ10gPSBmbihhcmcpO1xuICAgIHJldHVybiBjYWNoZVthcmddO1xuICB9O1xufVxuXG5leHBvcnQgeyBtZW1vaXplIGFzIGRlZmF1bHQgfTtcbiIsImZ1bmN0aW9uIHN0eWxpc19taW4gKFcpIHtcbiAgZnVuY3Rpb24gTShkLCBjLCBlLCBoLCBhKSB7XG4gICAgZm9yICh2YXIgbSA9IDAsIGIgPSAwLCB2ID0gMCwgbiA9IDAsIHEsIGcsIHggPSAwLCBLID0gMCwgaywgdSA9IGsgPSBxID0gMCwgbCA9IDAsIHIgPSAwLCBJID0gMCwgdCA9IDAsIEIgPSBlLmxlbmd0aCwgSiA9IEIgLSAxLCB5LCBmID0gJycsIHAgPSAnJywgRiA9ICcnLCBHID0gJycsIEM7IGwgPCBCOykge1xuICAgICAgZyA9IGUuY2hhckNvZGVBdChsKTtcbiAgICAgIGwgPT09IEogJiYgMCAhPT0gYiArIG4gKyB2ICsgbSAmJiAoMCAhPT0gYiAmJiAoZyA9IDQ3ID09PSBiID8gMTAgOiA0NyksIG4gPSB2ID0gbSA9IDAsIEIrKywgSisrKTtcblxuICAgICAgaWYgKDAgPT09IGIgKyBuICsgdiArIG0pIHtcbiAgICAgICAgaWYgKGwgPT09IEogJiYgKDAgPCByICYmIChmID0gZi5yZXBsYWNlKE4sICcnKSksIDAgPCBmLnRyaW0oKS5sZW5ndGgpKSB7XG4gICAgICAgICAgc3dpdGNoIChnKSB7XG4gICAgICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgY2FzZSA1OTpcbiAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgZiArPSBlLmNoYXJBdChsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBnID0gNTk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGcpIHtcbiAgICAgICAgICBjYXNlIDEyMzpcbiAgICAgICAgICAgIGYgPSBmLnRyaW0oKTtcbiAgICAgICAgICAgIHEgPSBmLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICBrID0gMTtcblxuICAgICAgICAgICAgZm9yICh0ID0gKytsOyBsIDwgQjspIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChnID0gZS5jaGFyQ29kZUF0KGwpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjM6XG4gICAgICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMTI1OlxuICAgICAgICAgICAgICAgICAgay0tO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDQ3OlxuICAgICAgICAgICAgICAgICAgc3dpdGNoIChnID0gZS5jaGFyQ29kZUF0KGwgKyAxKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ3OlxuICAgICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodSA9IGwgKyAxOyB1IDwgSjsgKyt1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5jaGFyQ29kZUF0KHUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg0MiA9PT0gZyAmJiA0MiA9PT0gZS5jaGFyQ29kZUF0KHUgLSAxKSAmJiBsICsgMiAhPT0gdSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID0gdSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg0NyA9PT0gZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID0gdSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsID0gdTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDkxOlxuICAgICAgICAgICAgICAgICAgZysrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgICAgICAgIGcrKztcblxuICAgICAgICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICAgICAgICAgIGZvciAoOyBsKysgPCBKICYmIGUuY2hhckNvZGVBdChsKSAhPT0gZzspIHtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKDAgPT09IGspIGJyZWFrO1xuICAgICAgICAgICAgICBsKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGsgPSBlLnN1YnN0cmluZyh0LCBsKTtcbiAgICAgICAgICAgIDAgPT09IHEgJiYgKHEgPSAoZiA9IGYucmVwbGFjZShjYSwgJycpLnRyaW0oKSkuY2hhckNvZGVBdCgwKSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAocSkge1xuICAgICAgICAgICAgICBjYXNlIDY0OlxuICAgICAgICAgICAgICAgIDAgPCByICYmIChmID0gZi5yZXBsYWNlKE4sICcnKSk7XG4gICAgICAgICAgICAgICAgZyA9IGYuY2hhckNvZGVBdCgxKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxMDA6XG4gICAgICAgICAgICAgICAgICBjYXNlIDEwOTpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTE1OlxuICAgICAgICAgICAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICAgICAgICAgICAgciA9IGM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByID0gTztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBrID0gTShjLCByLCBrLCBnLCBhICsgMSk7XG4gICAgICAgICAgICAgICAgdCA9IGsubGVuZ3RoO1xuICAgICAgICAgICAgICAgIDAgPCBBICYmIChyID0gWChPLCBmLCBJKSwgQyA9IEgoMywgaywgciwgYywgRCwgeiwgdCwgZywgYSwgaCksIGYgPSByLmpvaW4oJycpLCB2b2lkIDAgIT09IEMgJiYgMCA9PT0gKHQgPSAoayA9IEMudHJpbSgpKS5sZW5ndGgpICYmIChnID0gMCwgayA9ICcnKSk7XG4gICAgICAgICAgICAgICAgaWYgKDAgPCB0KSBzd2l0Y2ggKGcpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTE1OlxuICAgICAgICAgICAgICAgICAgICBmID0gZi5yZXBsYWNlKGRhLCBlYSk7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOlxuICAgICAgICAgICAgICAgICAgY2FzZSAxMDk6XG4gICAgICAgICAgICAgICAgICBjYXNlIDQ1OlxuICAgICAgICAgICAgICAgICAgICBrID0gZiArICd7JyArIGsgKyAnfSc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDEwNzpcbiAgICAgICAgICAgICAgICAgICAgZiA9IGYucmVwbGFjZShmYSwgJyQxICQyJyk7XG4gICAgICAgICAgICAgICAgICAgIGsgPSBmICsgJ3snICsgayArICd9JztcbiAgICAgICAgICAgICAgICAgICAgayA9IDEgPT09IHcgfHwgMiA9PT0gdyAmJiBMKCdAJyArIGssIDMpID8gJ0Atd2Via2l0LScgKyBrICsgJ0AnICsgayA6ICdAJyArIGs7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBrID0gZiArIGssIDExMiA9PT0gaCAmJiAoayA9IChwICs9IGssICcnKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGsgPSAnJztcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGsgPSBNKGMsIFgoYywgZiwgSSksIGssIGgsIGEgKyAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgRiArPSBrO1xuICAgICAgICAgICAgayA9IEkgPSByID0gdSA9IHEgPSAwO1xuICAgICAgICAgICAgZiA9ICcnO1xuICAgICAgICAgICAgZyA9IGUuY2hhckNvZGVBdCgrK2wpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDEyNTpcbiAgICAgICAgICBjYXNlIDU5OlxuICAgICAgICAgICAgZiA9ICgwIDwgciA/IGYucmVwbGFjZShOLCAnJykgOiBmKS50cmltKCk7XG4gICAgICAgICAgICBpZiAoMSA8ICh0ID0gZi5sZW5ndGgpKSBzd2l0Y2ggKDAgPT09IHUgJiYgKHEgPSBmLmNoYXJDb2RlQXQoMCksIDQ1ID09PSBxIHx8IDk2IDwgcSAmJiAxMjMgPiBxKSAmJiAodCA9IChmID0gZi5yZXBsYWNlKCcgJywgJzonKSkubGVuZ3RoKSwgMCA8IEEgJiYgdm9pZCAwICE9PSAoQyA9IEgoMSwgZiwgYywgZCwgRCwgeiwgcC5sZW5ndGgsIGgsIGEsIGgpKSAmJiAwID09PSAodCA9IChmID0gQy50cmltKCkpLmxlbmd0aCkgJiYgKGYgPSAnXFx4MDBcXHgwMCcpLCBxID0gZi5jaGFyQ29kZUF0KDApLCBnID0gZi5jaGFyQ29kZUF0KDEpLCBxKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDY0OlxuICAgICAgICAgICAgICAgIGlmICgxMDUgPT09IGcgfHwgOTkgPT09IGcpIHtcbiAgICAgICAgICAgICAgICAgIEcgKz0gZiArIGUuY2hhckF0KGwpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgNTggIT09IGYuY2hhckNvZGVBdCh0IC0gMSkgJiYgKHAgKz0gUChmLCBxLCBnLCBmLmNoYXJDb2RlQXQoMikpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEkgPSByID0gdSA9IHEgPSAwO1xuICAgICAgICAgICAgZiA9ICcnO1xuICAgICAgICAgICAgZyA9IGUuY2hhckNvZGVBdCgrK2wpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZykge1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIDQ3ID09PSBiID8gYiA9IDAgOiAwID09PSAxICsgcSAmJiAxMDcgIT09IGggJiYgMCA8IGYubGVuZ3RoICYmIChyID0gMSwgZiArPSAnXFx4MDAnKTtcbiAgICAgICAgICAwIDwgQSAqIFkgJiYgSCgwLCBmLCBjLCBkLCBELCB6LCBwLmxlbmd0aCwgaCwgYSwgaCk7XG4gICAgICAgICAgeiA9IDE7XG4gICAgICAgICAgRCsrO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNTk6XG4gICAgICAgIGNhc2UgMTI1OlxuICAgICAgICAgIGlmICgwID09PSBiICsgbiArIHYgKyBtKSB7XG4gICAgICAgICAgICB6Kys7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB6Kys7XG4gICAgICAgICAgeSA9IGUuY2hhckF0KGwpO1xuXG4gICAgICAgICAgc3dpdGNoIChnKSB7XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgICBpZiAoMCA9PT0gbiArIG0gKyBiKSBzd2l0Y2ggKHgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDQ0OlxuICAgICAgICAgICAgICAgIGNhc2UgNTg6XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICAgICAgICB5ID0gJyc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAzMiAhPT0gZyAmJiAoeSA9ICcgJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgeSA9ICdcXFxcMCc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICB5ID0gJ1xcXFxmJztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgIHkgPSAnXFxcXHYnO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgICAgMCA9PT0gbiArIGIgKyBtICYmIChyID0gSSA9IDEsIHkgPSAnXFxmJyArIHkpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAxMDg6XG4gICAgICAgICAgICAgIGlmICgwID09PSBuICsgYiArIG0gKyBFICYmIDAgPCB1KSBzd2l0Y2ggKGwgLSB1KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgMTEyID09PSB4ICYmIDU4ID09PSBlLmNoYXJDb2RlQXQobCAtIDMpICYmIChFID0geCk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAxMTEgPT09IEsgJiYgKEUgPSBLKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA1ODpcbiAgICAgICAgICAgICAgMCA9PT0gbiArIGIgKyBtICYmICh1ID0gbCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDQ0OlxuICAgICAgICAgICAgICAwID09PSBiICsgdiArIG4gKyBtICYmIChyID0gMSwgeSArPSAnXFxyJyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICAgICAgMCA9PT0gYiAmJiAobiA9IG4gPT09IGcgPyAwIDogMCA9PT0gbiA/IGcgOiBuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgOTE6XG4gICAgICAgICAgICAgIDAgPT09IG4gKyBiICsgdiAmJiBtKys7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDkzOlxuICAgICAgICAgICAgICAwID09PSBuICsgYiArIHYgJiYgbS0tO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA0MTpcbiAgICAgICAgICAgICAgMCA9PT0gbiArIGIgKyBtICYmIHYtLTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNDA6XG4gICAgICAgICAgICAgIGlmICgwID09PSBuICsgYiArIG0pIHtcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gcSkgc3dpdGNoICgyICogeCArIDMgKiBLKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDUzMzpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHEgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2Kys7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA2NDpcbiAgICAgICAgICAgICAgMCA9PT0gYiArIHYgKyBuICsgbSArIHUgKyBrICYmIChrID0gMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDQyOlxuICAgICAgICAgICAgY2FzZSA0NzpcbiAgICAgICAgICAgICAgaWYgKCEoMCA8IG4gKyBtICsgdikpIHN3aXRjaCAoYikge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoMiAqIGcgKyAzICogZS5jaGFyQ29kZUF0KGwgKyAxKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNTpcbiAgICAgICAgICAgICAgICAgICAgICBiID0gNDc7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjA6XG4gICAgICAgICAgICAgICAgICAgICAgdCA9IGwsIGIgPSA0MjtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDQyOlxuICAgICAgICAgICAgICAgICAgNDcgPT09IGcgJiYgNDIgPT09IHggJiYgdCArIDIgIT09IGwgJiYgKDMzID09PSBlLmNoYXJDb2RlQXQodCArIDIpICYmIChwICs9IGUuc3Vic3RyaW5nKHQsIGwgKyAxKSksIHkgPSAnJywgYiA9IDApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgMCA9PT0gYiAmJiAoZiArPSB5KTtcbiAgICAgIH1cblxuICAgICAgSyA9IHg7XG4gICAgICB4ID0gZztcbiAgICAgIGwrKztcbiAgICB9XG5cbiAgICB0ID0gcC5sZW5ndGg7XG5cbiAgICBpZiAoMCA8IHQpIHtcbiAgICAgIHIgPSBjO1xuICAgICAgaWYgKDAgPCBBICYmIChDID0gSCgyLCBwLCByLCBkLCBELCB6LCB0LCBoLCBhLCBoKSwgdm9pZCAwICE9PSBDICYmIDAgPT09IChwID0gQykubGVuZ3RoKSkgcmV0dXJuIEcgKyBwICsgRjtcbiAgICAgIHAgPSByLmpvaW4oJywnKSArICd7JyArIHAgKyAnfSc7XG5cbiAgICAgIGlmICgwICE9PSB3ICogRSkge1xuICAgICAgICAyICE9PSB3IHx8IEwocCwgMikgfHwgKEUgPSAwKTtcblxuICAgICAgICBzd2l0Y2ggKEUpIHtcbiAgICAgICAgICBjYXNlIDExMTpcbiAgICAgICAgICAgIHAgPSBwLnJlcGxhY2UoaGEsICc6LW1vei0kMScpICsgcDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxMTI6XG4gICAgICAgICAgICBwID0gcC5yZXBsYWNlKFEsICc6Oi13ZWJraXQtaW5wdXQtJDEnKSArIHAucmVwbGFjZShRLCAnOjotbW96LSQxJykgKyBwLnJlcGxhY2UoUSwgJzotbXMtaW5wdXQtJDEnKSArIHA7XG4gICAgICAgIH1cblxuICAgICAgICBFID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gRyArIHAgKyBGO1xuICB9XG5cbiAgZnVuY3Rpb24gWChkLCBjLCBlKSB7XG4gICAgdmFyIGggPSBjLnRyaW0oKS5zcGxpdChpYSk7XG4gICAgYyA9IGg7XG4gICAgdmFyIGEgPSBoLmxlbmd0aCxcbiAgICAgICAgbSA9IGQubGVuZ3RoO1xuXG4gICAgc3dpdGNoIChtKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHZhciBiID0gMDtcblxuICAgICAgICBmb3IgKGQgPSAwID09PSBtID8gJycgOiBkWzBdICsgJyAnOyBiIDwgYTsgKytiKSB7XG4gICAgICAgICAgY1tiXSA9IFooZCwgY1tiXSwgZSkudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciB2ID0gYiA9IDA7XG5cbiAgICAgICAgZm9yIChjID0gW107IGIgPCBhOyArK2IpIHtcbiAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IG07ICsrbikge1xuICAgICAgICAgICAgY1t2KytdID0gWihkW25dICsgJyAnLCBoW2JdLCBlKS50cmltKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gYztcbiAgfVxuXG4gIGZ1bmN0aW9uIFooZCwgYywgZSkge1xuICAgIHZhciBoID0gYy5jaGFyQ29kZUF0KDApO1xuICAgIDMzID4gaCAmJiAoaCA9IChjID0gYy50cmltKCkpLmNoYXJDb2RlQXQoMCkpO1xuXG4gICAgc3dpdGNoIChoKSB7XG4gICAgICBjYXNlIDM4OlxuICAgICAgICByZXR1cm4gYy5yZXBsYWNlKEYsICckMScgKyBkLnRyaW0oKSk7XG5cbiAgICAgIGNhc2UgNTg6XG4gICAgICAgIHJldHVybiBkLnRyaW0oKSArIGMucmVwbGFjZShGLCAnJDEnICsgZC50cmltKCkpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoMCA8IDEgKiBlICYmIDAgPCBjLmluZGV4T2YoJ1xcZicpKSByZXR1cm4gYy5yZXBsYWNlKEYsICg1OCA9PT0gZC5jaGFyQ29kZUF0KDApID8gJycgOiAnJDEnKSArIGQudHJpbSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZCArIGM7XG4gIH1cblxuICBmdW5jdGlvbiBQKGQsIGMsIGUsIGgpIHtcbiAgICB2YXIgYSA9IGQgKyAnOycsXG4gICAgICAgIG0gPSAyICogYyArIDMgKiBlICsgNCAqIGg7XG5cbiAgICBpZiAoOTQ0ID09PSBtKSB7XG4gICAgICBkID0gYS5pbmRleE9mKCc6JywgOSkgKyAxO1xuICAgICAgdmFyIGIgPSBhLnN1YnN0cmluZyhkLCBhLmxlbmd0aCAtIDEpLnRyaW0oKTtcbiAgICAgIGIgPSBhLnN1YnN0cmluZygwLCBkKS50cmltKCkgKyBiICsgJzsnO1xuICAgICAgcmV0dXJuIDEgPT09IHcgfHwgMiA9PT0gdyAmJiBMKGIsIDEpID8gJy13ZWJraXQtJyArIGIgKyBiIDogYjtcbiAgICB9XG5cbiAgICBpZiAoMCA9PT0gdyB8fCAyID09PSB3ICYmICFMKGEsIDEpKSByZXR1cm4gYTtcblxuICAgIHN3aXRjaCAobSkge1xuICAgICAgY2FzZSAxMDE1OlxuICAgICAgICByZXR1cm4gOTcgPT09IGEuY2hhckNvZGVBdCgxMCkgPyAnLXdlYmtpdC0nICsgYSArIGEgOiBhO1xuXG4gICAgICBjYXNlIDk1MTpcbiAgICAgICAgcmV0dXJuIDExNiA9PT0gYS5jaGFyQ29kZUF0KDMpID8gJy13ZWJraXQtJyArIGEgKyBhIDogYTtcblxuICAgICAgY2FzZSA5NjM6XG4gICAgICAgIHJldHVybiAxMTAgPT09IGEuY2hhckNvZGVBdCg1KSA/ICctd2Via2l0LScgKyBhICsgYSA6IGE7XG5cbiAgICAgIGNhc2UgMTAwOTpcbiAgICAgICAgaWYgKDEwMCAhPT0gYS5jaGFyQ29kZUF0KDQpKSBicmVhaztcblxuICAgICAgY2FzZSA5Njk6XG4gICAgICBjYXNlIDk0MjpcbiAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgYTtcblxuICAgICAgY2FzZSA5Nzg6XG4gICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbW96LScgKyBhICsgYTtcblxuICAgICAgY2FzZSAxMDE5OlxuICAgICAgY2FzZSA5ODM6XG4gICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbW96LScgKyBhICsgJy1tcy0nICsgYSArIGE7XG5cbiAgICAgIGNhc2UgODgzOlxuICAgICAgICBpZiAoNDUgPT09IGEuY2hhckNvZGVBdCg4KSkgcmV0dXJuICctd2Via2l0LScgKyBhICsgYTtcbiAgICAgICAgaWYgKDAgPCBhLmluZGV4T2YoJ2ltYWdlLXNldCgnLCAxMSkpIHJldHVybiBhLnJlcGxhY2UoamEsICckMS13ZWJraXQtJDInKSArIGE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDkzMjpcbiAgICAgICAgaWYgKDQ1ID09PSBhLmNoYXJDb2RlQXQoNCkpIHN3aXRjaCAoYS5jaGFyQ29kZUF0KDUpKSB7XG4gICAgICAgICAgY2FzZSAxMDM6XG4gICAgICAgICAgICByZXR1cm4gJy13ZWJraXQtYm94LScgKyBhLnJlcGxhY2UoJy1ncm93JywgJycpICsgJy13ZWJraXQtJyArIGEgKyAnLW1zLScgKyBhLnJlcGxhY2UoJ2dyb3cnLCAncG9zaXRpdmUnKSArIGE7XG5cbiAgICAgICAgICBjYXNlIDExNTpcbiAgICAgICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbXMtJyArIGEucmVwbGFjZSgnc2hyaW5rJywgJ25lZ2F0aXZlJykgKyBhO1xuXG4gICAgICAgICAgY2FzZSA5ODpcbiAgICAgICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbXMtJyArIGEucmVwbGFjZSgnYmFzaXMnLCAncHJlZmVycmVkLXNpemUnKSArIGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgJy1tcy0nICsgYSArIGE7XG5cbiAgICAgIGNhc2UgOTY0OlxuICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1zLWZsZXgtJyArIGEgKyBhO1xuXG4gICAgICBjYXNlIDEwMjM6XG4gICAgICAgIGlmICg5OSAhPT0gYS5jaGFyQ29kZUF0KDgpKSBicmVhaztcbiAgICAgICAgYiA9IGEuc3Vic3RyaW5nKGEuaW5kZXhPZignOicsIDE1KSkucmVwbGFjZSgnZmxleC0nLCAnJykucmVwbGFjZSgnc3BhY2UtYmV0d2VlbicsICdqdXN0aWZ5Jyk7XG4gICAgICAgIHJldHVybiAnLXdlYmtpdC1ib3gtcGFjaycgKyBiICsgJy13ZWJraXQtJyArIGEgKyAnLW1zLWZsZXgtcGFjaycgKyBiICsgYTtcblxuICAgICAgY2FzZSAxMDA1OlxuICAgICAgICByZXR1cm4ga2EudGVzdChhKSA/IGEucmVwbGFjZShhYSwgJzotd2Via2l0LScpICsgYS5yZXBsYWNlKGFhLCAnOi1tb3otJykgKyBhIDogYTtcblxuICAgICAgY2FzZSAxZTM6XG4gICAgICAgIGIgPSBhLnN1YnN0cmluZygxMykudHJpbSgpO1xuICAgICAgICBjID0gYi5pbmRleE9mKCctJykgKyAxO1xuXG4gICAgICAgIHN3aXRjaCAoYi5jaGFyQ29kZUF0KDApICsgYi5jaGFyQ29kZUF0KGMpKSB7XG4gICAgICAgICAgY2FzZSAyMjY6XG4gICAgICAgICAgICBiID0gYS5yZXBsYWNlKEcsICd0YicpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIzMjpcbiAgICAgICAgICAgIGIgPSBhLnJlcGxhY2UoRywgJ3RiLXJsJyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjIwOlxuICAgICAgICAgICAgYiA9IGEucmVwbGFjZShHLCAnbHInKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgJy1tcy0nICsgYiArIGE7XG5cbiAgICAgIGNhc2UgMTAxNzpcbiAgICAgICAgaWYgKC0xID09PSBhLmluZGV4T2YoJ3N0aWNreScsIDkpKSBicmVhaztcblxuICAgICAgY2FzZSA5NzU6XG4gICAgICAgIGMgPSAoYSA9IGQpLmxlbmd0aCAtIDEwO1xuICAgICAgICBiID0gKDMzID09PSBhLmNoYXJDb2RlQXQoYykgPyBhLnN1YnN0cmluZygwLCBjKSA6IGEpLnN1YnN0cmluZyhkLmluZGV4T2YoJzonLCA3KSArIDEpLnRyaW0oKTtcblxuICAgICAgICBzd2l0Y2ggKG0gPSBiLmNoYXJDb2RlQXQoMCkgKyAoYi5jaGFyQ29kZUF0KDcpIHwgMCkpIHtcbiAgICAgICAgICBjYXNlIDIwMzpcbiAgICAgICAgICAgIGlmICgxMTEgPiBiLmNoYXJDb2RlQXQoOCkpIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxMTU6XG4gICAgICAgICAgICBhID0gYS5yZXBsYWNlKGIsICctd2Via2l0LScgKyBiKSArICc7JyArIGE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjA3OlxuICAgICAgICAgIGNhc2UgMTAyOlxuICAgICAgICAgICAgYSA9IGEucmVwbGFjZShiLCAnLXdlYmtpdC0nICsgKDEwMiA8IG0gPyAnaW5saW5lLScgOiAnJykgKyAnYm94JykgKyAnOycgKyBhLnJlcGxhY2UoYiwgJy13ZWJraXQtJyArIGIpICsgJzsnICsgYS5yZXBsYWNlKGIsICctbXMtJyArIGIgKyAnYm94JykgKyAnOycgKyBhO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGEgKyAnOyc7XG5cbiAgICAgIGNhc2UgOTM4OlxuICAgICAgICBpZiAoNDUgPT09IGEuY2hhckNvZGVBdCg1KSkgc3dpdGNoIChhLmNoYXJDb2RlQXQoNikpIHtcbiAgICAgICAgICBjYXNlIDEwNTpcbiAgICAgICAgICAgIHJldHVybiBiID0gYS5yZXBsYWNlKCctaXRlbXMnLCAnJyksICctd2Via2l0LScgKyBhICsgJy13ZWJraXQtYm94LScgKyBiICsgJy1tcy1mbGV4LScgKyBiICsgYTtcblxuICAgICAgICAgIGNhc2UgMTE1OlxuICAgICAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgJy1tcy1mbGV4LWl0ZW0tJyArIGEucmVwbGFjZShiYSwgJycpICsgYTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1zLWZsZXgtbGluZS1wYWNrJyArIGEucmVwbGFjZSgnYWxpZ24tY29udGVudCcsICcnKS5yZXBsYWNlKGJhLCAnJykgKyBhO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDk3MzpcbiAgICAgIGNhc2UgOTg5OlxuICAgICAgICBpZiAoNDUgIT09IGEuY2hhckNvZGVBdCgzKSB8fCAxMjIgPT09IGEuY2hhckNvZGVBdCg0KSkgYnJlYWs7XG5cbiAgICAgIGNhc2UgOTMxOlxuICAgICAgY2FzZSA5NTM6XG4gICAgICAgIGlmICghMCA9PT0gbGEudGVzdChkKSkgcmV0dXJuIDExNSA9PT0gKGIgPSBkLnN1YnN0cmluZyhkLmluZGV4T2YoJzonKSArIDEpKS5jaGFyQ29kZUF0KDApID8gUChkLnJlcGxhY2UoJ3N0cmV0Y2gnLCAnZmlsbC1hdmFpbGFibGUnKSwgYywgZSwgaCkucmVwbGFjZSgnOmZpbGwtYXZhaWxhYmxlJywgJzpzdHJldGNoJykgOiBhLnJlcGxhY2UoYiwgJy13ZWJraXQtJyArIGIpICsgYS5yZXBsYWNlKGIsICctbW96LScgKyBiLnJlcGxhY2UoJ2ZpbGwtJywgJycpKSArIGE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDk2MjpcbiAgICAgICAgaWYgKGEgPSAnLXdlYmtpdC0nICsgYSArICgxMDIgPT09IGEuY2hhckNvZGVBdCg1KSA/ICctbXMtJyArIGEgOiAnJykgKyBhLCAyMTEgPT09IGUgKyBoICYmIDEwNSA9PT0gYS5jaGFyQ29kZUF0KDEzKSAmJiAwIDwgYS5pbmRleE9mKCd0cmFuc2Zvcm0nLCAxMCkpIHJldHVybiBhLnN1YnN0cmluZygwLCBhLmluZGV4T2YoJzsnLCAyNykgKyAxKS5yZXBsYWNlKG1hLCAnJDEtd2Via2l0LSQyJykgKyBhO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9XG5cbiAgZnVuY3Rpb24gTChkLCBjKSB7XG4gICAgdmFyIGUgPSBkLmluZGV4T2YoMSA9PT0gYyA/ICc6JyA6ICd7JyksXG4gICAgICAgIGggPSBkLnN1YnN0cmluZygwLCAzICE9PSBjID8gZSA6IDEwKTtcbiAgICBlID0gZC5zdWJzdHJpbmcoZSArIDEsIGQubGVuZ3RoIC0gMSk7XG4gICAgcmV0dXJuIFIoMiAhPT0gYyA/IGggOiBoLnJlcGxhY2UobmEsICckMScpLCBlLCBjKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVhKGQsIGMpIHtcbiAgICB2YXIgZSA9IFAoYywgYy5jaGFyQ29kZUF0KDApLCBjLmNoYXJDb2RlQXQoMSksIGMuY2hhckNvZGVBdCgyKSk7XG4gICAgcmV0dXJuIGUgIT09IGMgKyAnOycgPyBlLnJlcGxhY2Uob2EsICcgb3IgKCQxKScpLnN1YnN0cmluZyg0KSA6ICcoJyArIGMgKyAnKSc7XG4gIH1cblxuICBmdW5jdGlvbiBIKGQsIGMsIGUsIGgsIGEsIG0sIGIsIHYsIG4sIHEpIHtcbiAgICBmb3IgKHZhciBnID0gMCwgeCA9IGMsIHc7IGcgPCBBOyArK2cpIHtcbiAgICAgIHN3aXRjaCAodyA9IFNbZ10uY2FsbChCLCBkLCB4LCBlLCBoLCBhLCBtLCBiLCB2LCBuLCBxKSkge1xuICAgICAgICBjYXNlIHZvaWQgMDpcbiAgICAgICAgY2FzZSAhMTpcbiAgICAgICAgY2FzZSAhMDpcbiAgICAgICAgY2FzZSBudWxsOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgeCA9IHc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHggIT09IGMpIHJldHVybiB4O1xuICB9XG5cbiAgZnVuY3Rpb24gVChkKSB7XG4gICAgc3dpdGNoIChkKSB7XG4gICAgICBjYXNlIHZvaWQgMDpcbiAgICAgIGNhc2UgbnVsbDpcbiAgICAgICAgQSA9IFMubGVuZ3RoID0gMDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZCkgU1tBKytdID0gZDtlbHNlIGlmICgnb2JqZWN0JyA9PT0gdHlwZW9mIGQpIGZvciAodmFyIGMgPSAwLCBlID0gZC5sZW5ndGg7IGMgPCBlOyArK2MpIHtcbiAgICAgICAgICBUKGRbY10pO1xuICAgICAgICB9IGVsc2UgWSA9ICEhZCB8IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIFQ7XG4gIH1cblxuICBmdW5jdGlvbiBVKGQpIHtcbiAgICBkID0gZC5wcmVmaXg7XG4gICAgdm9pZCAwICE9PSBkICYmIChSID0gbnVsbCwgZCA/ICdmdW5jdGlvbicgIT09IHR5cGVvZiBkID8gdyA9IDEgOiAodyA9IDIsIFIgPSBkKSA6IHcgPSAwKTtcbiAgICByZXR1cm4gVTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEIoZCwgYykge1xuICAgIHZhciBlID0gZDtcbiAgICAzMyA+IGUuY2hhckNvZGVBdCgwKSAmJiAoZSA9IGUudHJpbSgpKTtcbiAgICBWID0gZTtcbiAgICBlID0gW1ZdO1xuXG4gICAgaWYgKDAgPCBBKSB7XG4gICAgICB2YXIgaCA9IEgoLTEsIGMsIGUsIGUsIEQsIHosIDAsIDAsIDAsIDApO1xuICAgICAgdm9pZCAwICE9PSBoICYmICdzdHJpbmcnID09PSB0eXBlb2YgaCAmJiAoYyA9IGgpO1xuICAgIH1cblxuICAgIHZhciBhID0gTShPLCBlLCBjLCAwLCAwKTtcbiAgICAwIDwgQSAmJiAoaCA9IEgoLTIsIGEsIGUsIGUsIEQsIHosIGEubGVuZ3RoLCAwLCAwLCAwKSwgdm9pZCAwICE9PSBoICYmIChhID0gaCkpO1xuICAgIFYgPSAnJztcbiAgICBFID0gMDtcbiAgICB6ID0gRCA9IDE7XG4gICAgcmV0dXJuIGE7XG4gIH1cblxuICB2YXIgY2EgPSAvXlxcMCsvZyxcbiAgICAgIE4gPSAvW1xcMFxcclxcZl0vZyxcbiAgICAgIGFhID0gLzogKi9nLFxuICAgICAga2EgPSAvem9vfGdyYS8sXG4gICAgICBtYSA9IC8oWyw6IF0pKHRyYW5zZm9ybSkvZyxcbiAgICAgIGlhID0gLyxcXHIrPy9nLFxuICAgICAgRiA9IC8oW1xcdFxcclxcbiBdKSpcXGY/Ji9nLFxuICAgICAgZmEgPSAvQChrXFx3KylcXHMqKFxcUyopXFxzKi8sXG4gICAgICBRID0gLzo6KHBsYWNlKS9nLFxuICAgICAgaGEgPSAvOihyZWFkLW9ubHkpL2csXG4gICAgICBHID0gL1tzdmhdXFx3Ky1bdGJscl17Mn0vLFxuICAgICAgZGEgPSAvXFwoXFxzKiguKilcXHMqXFwpL2csXG4gICAgICBvYSA9IC8oW1xcc1xcU10qPyk7L2csXG4gICAgICBiYSA9IC8tc2VsZnxmbGV4LS9nLFxuICAgICAgbmEgPSAvW15dKj8oOltycF1bZWxdYVtcXHctXSspW15dKi8sXG4gICAgICBsYSA9IC9zdHJldGNofDpcXHMqXFx3K1xcLSg/OmNvbnRlfGF2YWlsKS8sXG4gICAgICBqYSA9IC8oW14tXSkoaW1hZ2Utc2V0XFwoKS8sXG4gICAgICB6ID0gMSxcbiAgICAgIEQgPSAxLFxuICAgICAgRSA9IDAsXG4gICAgICB3ID0gMSxcbiAgICAgIE8gPSBbXSxcbiAgICAgIFMgPSBbXSxcbiAgICAgIEEgPSAwLFxuICAgICAgUiA9IG51bGwsXG4gICAgICBZID0gMCxcbiAgICAgIFYgPSAnJztcbiAgQi51c2UgPSBUO1xuICBCLnNldCA9IFU7XG4gIHZvaWQgMCAhPT0gVyAmJiBVKFcpO1xuICByZXR1cm4gQjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3R5bGlzX21pbjtcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCwgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzdG9wRXZlbnQsIGdldERvY3VtZW50LCBpc01vdXNlTGlrZVBvaW50ZXJUeXBlLCBjb250YWlucywgYWN0aXZlRWxlbWVudCwgaXNTYWZhcmksIGlzVHlwZWFibGVDb21ib2JveCwgaXNWaXJ0dWFsQ2xpY2ssIGlzVmlydHVhbFBvaW50ZXJFdmVudCwgZ2V0VGFyZ2V0LCBnZXRQbGF0Zm9ybSwgaXNUeXBlYWJsZUVsZW1lbnQsIGlzUmVhY3RFdmVudCwgaXNSb290RWxlbWVudCwgaXNFdmVudFRhcmdldFdpdGhpbiwgaXNNYWMsIGdldFVzZXJBZ2VudCB9IGZyb20gJ0BmbG9hdGluZy11aS9yZWFjdC91dGlscyc7XG5pbXBvcnQgeyBmbG9vciwgZXZhbHVhdGUgfSBmcm9tICdAZmxvYXRpbmctdWkvdXRpbHMnO1xuaW1wb3J0IHsgZ2V0Q29tcHV0ZWRTdHlsZSwgaXNFbGVtZW50LCBnZXROb2RlTmFtZSwgaXNIVE1MRWxlbWVudCwgZ2V0V2luZG93LCBpc0xhc3RUcmF2ZXJzYWJsZU5vZGUsIGdldFBhcmVudE5vZGUgfSBmcm9tICdAZmxvYXRpbmctdWkvdXRpbHMvZG9tJztcbmltcG9ydCB7IHRhYmJhYmxlLCBpc1RhYmJhYmxlIH0gZnJvbSAndGFiYmFibGUnO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IGdldE92ZXJmbG93QW5jZXN0b3JzLCB1c2VGbG9hdGluZyBhcyB1c2VGbG9hdGluZyQxLCBvZmZzZXQsIGRldGVjdE92ZXJmbG93IH0gZnJvbSAnQGZsb2F0aW5nLXVpL3JlYWN0LWRvbSc7XG5leHBvcnQgeyBhcnJvdywgYXV0b1BsYWNlbWVudCwgYXV0b1VwZGF0ZSwgY29tcHV0ZVBvc2l0aW9uLCBkZXRlY3RPdmVyZmxvdywgZmxpcCwgZ2V0T3ZlcmZsb3dBbmNlc3RvcnMsIGhpZGUsIGlubGluZSwgbGltaXRTaGlmdCwgb2Zmc2V0LCBwbGF0Zm9ybSwgc2hpZnQsIHNpemUgfSBmcm9tICdAZmxvYXRpbmctdWkvcmVhY3QtZG9tJztcblxuLyoqXG4gKiBNZXJnZXMgYW4gYXJyYXkgb2YgcmVmcyBpbnRvIGEgc2luZ2xlIG1lbW9pemVkIGNhbGxiYWNrIHJlZiBvciBgbnVsbGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvcmVhY3QtdXRpbHMjdXNlbWVyZ2VyZWZzXG4gKi9cbmZ1bmN0aW9uIHVzZU1lcmdlUmVmcyhyZWZzKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAocmVmcy5ldmVyeShyZWYgPT4gcmVmID09IG51bGwpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlID0+IHtcbiAgICAgIHJlZnMuZm9yRWFjaChyZWYgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlZih2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVmICE9IG51bGwpIHtcbiAgICAgICAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgcmVmcyk7XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tdWkvbWF0ZXJpYWwtdWkvaXNzdWVzLzQxMTkwI2lzc3VlY29tbWVudC0yMDQwODczMzc5XG5jb25zdCBTYWZlUmVhY3QgPSB7XG4gIC4uLlJlYWN0XG59O1xuXG5jb25zdCB1c2VJbnNlcnRpb25FZmZlY3QgPSBTYWZlUmVhY3QudXNlSW5zZXJ0aW9uRWZmZWN0O1xuY29uc3QgdXNlU2FmZUluc2VydGlvbkVmZmVjdCA9IHVzZUluc2VydGlvbkVmZmVjdCB8fCAoZm4gPT4gZm4oKSk7XG5mdW5jdGlvbiB1c2VFZmZlY3RFdmVudChjYWxsYmFjaykge1xuICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYoKCkgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNhbGwgYW4gZXZlbnQgaGFuZGxlciB3aGlsZSByZW5kZXJpbmcuJyk7XG4gICAgfVxuICB9KTtcbiAgdXNlU2FmZUluc2VydGlvbkVmZmVjdCgoKSA9PiB7XG4gICAgcmVmLmN1cnJlbnQgPSBjYWxsYmFjaztcbiAgfSk7XG4gIHJldHVybiBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICByZXR1cm4gcmVmLmN1cnJlbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHJlZi5jdXJyZW50KC4uLmFyZ3MpO1xuICB9LCBbXSk7XG59XG5cbmNvbnN0IEFSUk9XX1VQID0gJ0Fycm93VXAnO1xuY29uc3QgQVJST1dfRE9XTiA9ICdBcnJvd0Rvd24nO1xuY29uc3QgQVJST1dfTEVGVCA9ICdBcnJvd0xlZnQnO1xuY29uc3QgQVJST1dfUklHSFQgPSAnQXJyb3dSaWdodCc7XG5mdW5jdGlvbiBpc0RpZmZlcmVudFJvdyhpbmRleCwgY29scywgcHJldlJvdykge1xuICByZXR1cm4gTWF0aC5mbG9vcihpbmRleCAvIGNvbHMpICE9PSBwcmV2Um93O1xufVxuZnVuY3Rpb24gaXNJbmRleE91dE9mQm91bmRzKGxpc3RSZWYsIGluZGV4KSB7XG4gIHJldHVybiBpbmRleCA8IDAgfHwgaW5kZXggPj0gbGlzdFJlZi5jdXJyZW50Lmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGdldE1pbkluZGV4KGxpc3RSZWYsIGRpc2FibGVkSW5kaWNlcykge1xuICByZXR1cm4gZmluZE5vbkRpc2FibGVkSW5kZXgobGlzdFJlZiwge1xuICAgIGRpc2FibGVkSW5kaWNlc1xuICB9KTtcbn1cbmZ1bmN0aW9uIGdldE1heEluZGV4KGxpc3RSZWYsIGRpc2FibGVkSW5kaWNlcykge1xuICByZXR1cm4gZmluZE5vbkRpc2FibGVkSW5kZXgobGlzdFJlZiwge1xuICAgIGRlY3JlbWVudDogdHJ1ZSxcbiAgICBzdGFydGluZ0luZGV4OiBsaXN0UmVmLmN1cnJlbnQubGVuZ3RoLFxuICAgIGRpc2FibGVkSW5kaWNlc1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIF90ZW1wKSB7XG4gIGxldCB7XG4gICAgc3RhcnRpbmdJbmRleCA9IC0xLFxuICAgIGRlY3JlbWVudCA9IGZhbHNlLFxuICAgIGRpc2FibGVkSW5kaWNlcyxcbiAgICBhbW91bnQgPSAxXG4gIH0gPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDtcbiAgY29uc3QgbGlzdCA9IGxpc3RSZWYuY3VycmVudDtcbiAgbGV0IGluZGV4ID0gc3RhcnRpbmdJbmRleDtcbiAgZG8ge1xuICAgIGluZGV4ICs9IGRlY3JlbWVudCA/IC1hbW91bnQgOiBhbW91bnQ7XG4gIH0gd2hpbGUgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gbGlzdC5sZW5ndGggLSAxICYmIGlzRGlzYWJsZWQobGlzdCwgaW5kZXgsIGRpc2FibGVkSW5kaWNlcykpO1xuICByZXR1cm4gaW5kZXg7XG59XG5mdW5jdGlvbiBnZXRHcmlkTmF2aWdhdGVkSW5kZXgoZWxlbWVudHNSZWYsIF9yZWYpIHtcbiAgbGV0IHtcbiAgICBldmVudCxcbiAgICBvcmllbnRhdGlvbixcbiAgICBsb29wLFxuICAgIGNvbHMsXG4gICAgZGlzYWJsZWRJbmRpY2VzLFxuICAgIG1pbkluZGV4LFxuICAgIG1heEluZGV4LFxuICAgIHByZXZJbmRleCxcbiAgICBzdG9wRXZlbnQ6IHN0b3AgPSBmYWxzZVxuICB9ID0gX3JlZjtcbiAgbGV0IG5leHRJbmRleCA9IHByZXZJbmRleDtcbiAgaWYgKGV2ZW50LmtleSA9PT0gQVJST1dfVVApIHtcbiAgICBzdG9wICYmIHN0b3BFdmVudChldmVudCk7XG4gICAgaWYgKHByZXZJbmRleCA9PT0gLTEpIHtcbiAgICAgIG5leHRJbmRleCA9IG1heEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICBzdGFydGluZ0luZGV4OiBuZXh0SW5kZXgsXG4gICAgICAgIGFtb3VudDogY29scyxcbiAgICAgICAgZGVjcmVtZW50OiB0cnVlLFxuICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgIH0pO1xuICAgICAgaWYgKGxvb3AgJiYgKHByZXZJbmRleCAtIGNvbHMgPCBtaW5JbmRleCB8fCBuZXh0SW5kZXggPCAwKSkge1xuICAgICAgICBjb25zdCBjb2wgPSBwcmV2SW5kZXggJSBjb2xzO1xuICAgICAgICBjb25zdCBtYXhDb2wgPSBtYXhJbmRleCAlIGNvbHM7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IG1heEluZGV4IC0gKG1heENvbCAtIGNvbCk7XG4gICAgICAgIGlmIChtYXhDb2wgPT09IGNvbCkge1xuICAgICAgICAgIG5leHRJbmRleCA9IG1heEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHRJbmRleCA9IG1heENvbCA+IGNvbCA/IG9mZnNldCA6IG9mZnNldCAtIGNvbHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSW5kZXhPdXRPZkJvdW5kcyhlbGVtZW50c1JlZiwgbmV4dEluZGV4KSkge1xuICAgICAgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICAgIH1cbiAgfVxuICBpZiAoZXZlbnQua2V5ID09PSBBUlJPV19ET1dOKSB7XG4gICAgc3RvcCAmJiBzdG9wRXZlbnQoZXZlbnQpO1xuICAgIGlmIChwcmV2SW5kZXggPT09IC0xKSB7XG4gICAgICBuZXh0SW5kZXggPSBtaW5JbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4LFxuICAgICAgICBhbW91bnQ6IGNvbHMsXG4gICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgfSk7XG4gICAgICBpZiAobG9vcCAmJiBwcmV2SW5kZXggKyBjb2xzID4gbWF4SW5kZXgpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICBzdGFydGluZ0luZGV4OiBwcmV2SW5kZXggJSBjb2xzIC0gY29scyxcbiAgICAgICAgICBhbW91bnQ6IGNvbHMsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNJbmRleE91dE9mQm91bmRzKGVsZW1lbnRzUmVmLCBuZXh0SW5kZXgpKSB7XG4gICAgICBuZXh0SW5kZXggPSBwcmV2SW5kZXg7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtYWlucyBvbiB0aGUgc2FtZSByb3cvY29sdW1uLlxuICBpZiAob3JpZW50YXRpb24gPT09ICdib3RoJykge1xuICAgIGNvbnN0IHByZXZSb3cgPSBmbG9vcihwcmV2SW5kZXggLyBjb2xzKTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBBUlJPV19SSUdIVCkge1xuICAgICAgc3RvcCAmJiBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgaWYgKHByZXZJbmRleCAlIGNvbHMgIT09IGNvbHMgLSAxKSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4LFxuICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGxvb3AgJiYgaXNEaWZmZXJlbnRSb3cobmV4dEluZGV4LCBjb2xzLCBwcmV2Um93KSkge1xuICAgICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgICBzdGFydGluZ0luZGV4OiBwcmV2SW5kZXggLSBwcmV2SW5kZXggJSBjb2xzIC0gMSxcbiAgICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGxvb3ApIHtcbiAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICBzdGFydGluZ0luZGV4OiBwcmV2SW5kZXggLSBwcmV2SW5kZXggJSBjb2xzIC0gMSxcbiAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNEaWZmZXJlbnRSb3cobmV4dEluZGV4LCBjb2xzLCBwcmV2Um93KSkge1xuICAgICAgICBuZXh0SW5kZXggPSBwcmV2SW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09IEFSUk9XX0xFRlQpIHtcbiAgICAgIHN0b3AgJiYgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIGlmIChwcmV2SW5kZXggJSBjb2xzICE9PSAwKSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4LFxuICAgICAgICAgIGRlY3JlbWVudDogdHJ1ZSxcbiAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChsb29wICYmIGlzRGlmZmVyZW50Um93KG5leHRJbmRleCwgY29scywgcHJldlJvdykpIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4ICsgKGNvbHMgLSBwcmV2SW5kZXggJSBjb2xzKSxcbiAgICAgICAgICAgIGRlY3JlbWVudDogdHJ1ZSxcbiAgICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGxvb3ApIHtcbiAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICBzdGFydGluZ0luZGV4OiBwcmV2SW5kZXggKyAoY29scyAtIHByZXZJbmRleCAlIGNvbHMpLFxuICAgICAgICAgIGRlY3JlbWVudDogdHJ1ZSxcbiAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNEaWZmZXJlbnRSb3cobmV4dEluZGV4LCBjb2xzLCBwcmV2Um93KSkge1xuICAgICAgICBuZXh0SW5kZXggPSBwcmV2SW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGxhc3RSb3cgPSBmbG9vcihtYXhJbmRleCAvIGNvbHMpID09PSBwcmV2Um93O1xuICAgIGlmIChpc0luZGV4T3V0T2ZCb3VuZHMoZWxlbWVudHNSZWYsIG5leHRJbmRleCkpIHtcbiAgICAgIGlmIChsb29wICYmIGxhc3RSb3cpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gZXZlbnQua2V5ID09PSBBUlJPV19MRUZUID8gbWF4SW5kZXggOiBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCAtIHByZXZJbmRleCAlIGNvbHMgLSAxLFxuICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRJbmRleCA9IHByZXZJbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5leHRJbmRleDtcbn1cblxuLyoqIEZvciBlYWNoIGNlbGwgaW5kZXgsIGdldHMgdGhlIGl0ZW0gaW5kZXggdGhhdCBvY2N1cGllcyB0aGF0IGNlbGwgKi9cbmZ1bmN0aW9uIGJ1aWxkQ2VsbE1hcChzaXplcywgY29scywgZGVuc2UpIHtcbiAgY29uc3QgY2VsbE1hcCA9IFtdO1xuICBsZXQgc3RhcnRJbmRleCA9IDA7XG4gIHNpemVzLmZvckVhY2goKF9yZWYyLCBpbmRleCkgPT4ge1xuICAgIGxldCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBfcmVmMjtcbiAgICBpZiAod2lkdGggPiBjb2xzKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIltGbG9hdGluZyBVSV06IEludmFsaWQgZ3JpZCAtIGl0ZW0gd2lkdGggYXQgaW5kZXggXCIgKyBpbmRleCArIFwiIGlzIGdyZWF0ZXIgdGhhbiBncmlkIGNvbHVtbnNcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBpdGVtUGxhY2VkID0gZmFsc2U7XG4gICAgaWYgKGRlbnNlKSB7XG4gICAgICBzdGFydEluZGV4ID0gMDtcbiAgICB9XG4gICAgd2hpbGUgKCFpdGVtUGxhY2VkKSB7XG4gICAgICBjb25zdCB0YXJnZXRDZWxscyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHtcbiAgICAgICAgICB0YXJnZXRDZWxscy5wdXNoKHN0YXJ0SW5kZXggKyBpICsgaiAqIGNvbHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnRJbmRleCAlIGNvbHMgKyB3aWR0aCA8PSBjb2xzICYmIHRhcmdldENlbGxzLmV2ZXJ5KGNlbGwgPT4gY2VsbE1hcFtjZWxsXSA9PSBudWxsKSkge1xuICAgICAgICB0YXJnZXRDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgICAgIGNlbGxNYXBbY2VsbF0gPSBpbmRleDtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0ZW1QbGFjZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRJbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gY29udmVydCBpbnRvIGEgbm9uLXNwYXJzZSBhcnJheVxuICByZXR1cm4gWy4uLmNlbGxNYXBdO1xufVxuXG4vKiogR2V0cyBjZWxsIGluZGV4IG9mIGFuIGl0ZW0ncyBjb3JuZXIgb3IgLTEgd2hlbiBpbmRleCBpcyAtMS4gKi9cbmZ1bmN0aW9uIGdldENlbGxJbmRleE9mQ29ybmVyKGluZGV4LCBzaXplcywgY2VsbE1hcCwgY29scywgY29ybmVyKSB7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAtMTtcbiAgY29uc3QgZmlyc3RDZWxsSW5kZXggPSBjZWxsTWFwLmluZGV4T2YoaW5kZXgpO1xuICBjb25zdCBzaXplSXRlbSA9IHNpemVzW2luZGV4XTtcbiAgc3dpdGNoIChjb3JuZXIpIHtcbiAgICBjYXNlICd0bCc6XG4gICAgICByZXR1cm4gZmlyc3RDZWxsSW5kZXg7XG4gICAgY2FzZSAndHInOlxuICAgICAgaWYgKCFzaXplSXRlbSkge1xuICAgICAgICByZXR1cm4gZmlyc3RDZWxsSW5kZXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlyc3RDZWxsSW5kZXggKyBzaXplSXRlbS53aWR0aCAtIDE7XG4gICAgY2FzZSAnYmwnOlxuICAgICAgaWYgKCFzaXplSXRlbSkge1xuICAgICAgICByZXR1cm4gZmlyc3RDZWxsSW5kZXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlyc3RDZWxsSW5kZXggKyAoc2l6ZUl0ZW0uaGVpZ2h0IC0gMSkgKiBjb2xzO1xuICAgIGNhc2UgJ2JyJzpcbiAgICAgIHJldHVybiBjZWxsTWFwLmxhc3RJbmRleE9mKGluZGV4KTtcbiAgfVxufVxuXG4vKiogR2V0cyBhbGwgY2VsbCBpbmRpY2VzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgc3BlY2lmaWVkIGluZGljZXMgKi9cbmZ1bmN0aW9uIGdldENlbGxJbmRpY2VzKGluZGljZXMsIGNlbGxNYXApIHtcbiAgcmV0dXJuIGNlbGxNYXAuZmxhdE1hcCgoaW5kZXgsIGNlbGxJbmRleCkgPT4gaW5kaWNlcy5pbmNsdWRlcyhpbmRleCkgPyBbY2VsbEluZGV4XSA6IFtdKTtcbn1cbmZ1bmN0aW9uIGlzRGlzYWJsZWQobGlzdCwgaW5kZXgsIGRpc2FibGVkSW5kaWNlcykge1xuICBpZiAoZGlzYWJsZWRJbmRpY2VzKSB7XG4gICAgcmV0dXJuIGRpc2FibGVkSW5kaWNlcy5pbmNsdWRlcyhpbmRleCk7XG4gIH1cbiAgY29uc3QgZWxlbWVudCA9IGxpc3RbaW5kZXhdO1xuICByZXR1cm4gZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJykgPT09ICd0cnVlJztcbn1cblxubGV0IHJhZklkID0gMDtcbmZ1bmN0aW9uIGVucXVldWVGb2N1cyhlbCwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBwcmV2ZW50U2Nyb2xsID0gZmFsc2UsXG4gICAgY2FuY2VsUHJldmlvdXMgPSB0cnVlLFxuICAgIHN5bmMgPSBmYWxzZVxuICB9ID0gb3B0aW9ucztcbiAgY2FuY2VsUHJldmlvdXMgJiYgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuICBjb25zdCBleGVjID0gKCkgPT4gZWwgPT0gbnVsbCA/IHZvaWQgMCA6IGVsLmZvY3VzKHtcbiAgICBwcmV2ZW50U2Nyb2xsXG4gIH0pO1xuICBpZiAoc3luYykge1xuICAgIGV4ZWMoKTtcbiAgfSBlbHNlIHtcbiAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShleGVjKTtcbiAgfVxufVxuXG52YXIgaW5kZXggPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gdXNlTGF5b3V0RWZmZWN0IDogdXNlRWZmZWN0O1xuXG5mdW5jdGlvbiBzb3J0QnlEb2N1bWVudFBvc2l0aW9uKGEsIGIpIHtcbiAgY29uc3QgcG9zaXRpb24gPSBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpO1xuICBpZiAocG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORyB8fCBwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmIChwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HIHx8IHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuZnVuY3Rpb24gYXJlTWFwc0VxdWFsKG1hcDEsIG1hcDIpIHtcbiAgaWYgKG1hcDEuc2l6ZSAhPT0gbWFwMi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG1hcDEuZW50cmllcygpKSB7XG4gICAgaWYgKHZhbHVlICE9PSBtYXAyLmdldChrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuY29uc3QgRmxvYXRpbmdMaXN0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgcmVnaXN0ZXI6ICgpID0+IHt9LFxuICB1bnJlZ2lzdGVyOiAoKSA9PiB7fSxcbiAgbWFwOiAvKiNfX1BVUkVfXyovbmV3IE1hcCgpLFxuICBlbGVtZW50c1JlZjoge1xuICAgIGN1cnJlbnQ6IFtdXG4gIH1cbn0pO1xuLyoqXG4gKiBQcm92aWRlcyBjb250ZXh0IGZvciBhIGxpc3Qgb2YgaXRlbXMgd2l0aGluIHRoZSBmbG9hdGluZyBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nTGlzdFxuICovXG5mdW5jdGlvbiBGbG9hdGluZ0xpc3QocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGVsZW1lbnRzUmVmLFxuICAgIGxhYmVsc1JlZlxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IFttYXAsIHNldE1hcF0gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBuZXcgTWFwKCkpO1xuICBjb25zdCByZWdpc3RlciA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIHNldE1hcChwcmV2TWFwID0+IG5ldyBNYXAocHJldk1hcCkuc2V0KG5vZGUsIG51bGwpKTtcbiAgfSwgW10pO1xuICBjb25zdCB1bnJlZ2lzdGVyID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgc2V0TWFwKHByZXZNYXAgPT4ge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChwcmV2TWFwKTtcbiAgICAgIG1hcC5kZWxldGUobm9kZSk7XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH0pO1xuICB9LCBbXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG5ld01hcC5rZXlzKCkpLnNvcnQoc29ydEJ5RG9jdW1lbnRQb3NpdGlvbik7XG4gICAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IHtcbiAgICAgIG5ld01hcC5zZXQobm9kZSwgaW5kZXgpO1xuICAgIH0pO1xuICAgIGlmICghYXJlTWFwc0VxdWFsKG1hcCwgbmV3TWFwKSkge1xuICAgICAgc2V0TWFwKG5ld01hcCk7XG4gICAgfVxuICB9LCBbbWFwXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGbG9hdGluZ0xpc3RDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgIHJlZ2lzdGVyLFxuICAgICAgdW5yZWdpc3RlcixcbiAgICAgIG1hcCxcbiAgICAgIGVsZW1lbnRzUmVmLFxuICAgICAgbGFiZWxzUmVmXG4gICAgfSksIFtyZWdpc3RlciwgdW5yZWdpc3RlciwgbWFwLCBlbGVtZW50c1JlZiwgbGFiZWxzUmVmXSlcbiAgfSwgY2hpbGRyZW4pO1xufVxuLyoqXG4gKiBVc2VkIHRvIHJlZ2lzdGVyIGEgbGlzdCBpdGVtIGFuZCBpdHMgaW5kZXggKERPTSBwb3NpdGlvbikgaW4gdGhlXG4gKiBgRmxvYXRpbmdMaXN0YC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ0xpc3QjdXNlbGlzdGl0ZW1cbiAqL1xuZnVuY3Rpb24gdXNlTGlzdEl0ZW0ocHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBsYWJlbFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHtcbiAgICByZWdpc3RlcixcbiAgICB1bnJlZ2lzdGVyLFxuICAgIG1hcCxcbiAgICBlbGVtZW50c1JlZixcbiAgICBsYWJlbHNSZWZcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoRmxvYXRpbmdMaXN0Q29udGV4dCk7XG4gIGNvbnN0IFtpbmRleCQxLCBzZXRJbmRleF0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgY29tcG9uZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCByZWYgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBjb21wb25lbnRSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgaWYgKGluZGV4JDEgIT09IG51bGwpIHtcbiAgICAgIGVsZW1lbnRzUmVmLmN1cnJlbnRbaW5kZXgkMV0gPSBub2RlO1xuICAgICAgaWYgKGxhYmVsc1JlZikge1xuICAgICAgICB2YXIgX25vZGUkdGV4dENvbnRlbnQ7XG4gICAgICAgIGNvbnN0IGlzTGFiZWxEZWZpbmVkID0gbGFiZWwgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgbGFiZWxzUmVmLmN1cnJlbnRbaW5kZXgkMV0gPSBpc0xhYmVsRGVmaW5lZCA/IGxhYmVsIDogKF9ub2RlJHRleHRDb250ZW50ID0gbm9kZSA9PSBudWxsID8gdm9pZCAwIDogbm9kZS50ZXh0Q29udGVudCkgIT0gbnVsbCA/IF9ub2RlJHRleHRDb250ZW50IDogbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtpbmRleCQxLCBlbGVtZW50c1JlZiwgbGFiZWxzUmVmLCBsYWJlbF0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IGNvbXBvbmVudFJlZi5jdXJyZW50O1xuICAgIGlmIChub2RlKSB7XG4gICAgICByZWdpc3Rlcihub2RlKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHVucmVnaXN0ZXIobm9kZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW3JlZ2lzdGVyLCB1bnJlZ2lzdGVyXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IGNvbXBvbmVudFJlZi5jdXJyZW50ID8gbWFwLmdldChjb21wb25lbnRSZWYuY3VycmVudCkgOiBudWxsO1xuICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICBzZXRJbmRleChpbmRleCk7XG4gICAgfVxuICB9LCBbbWFwXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgcmVmLFxuICAgIGluZGV4OiBpbmRleCQxID09IG51bGwgPyAtMSA6IGluZGV4JDFcbiAgfSksIFtpbmRleCQxLCByZWZdKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVySnN4KHJlbmRlciwgY29tcHV0ZWRQcm9wcykge1xuICBpZiAodHlwZW9mIHJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiByZW5kZXIoY29tcHV0ZWRQcm9wcyk7XG4gIH1cbiAgaWYgKHJlbmRlcikge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KHJlbmRlciwgY29tcHV0ZWRQcm9wcyk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIGNvbXB1dGVkUHJvcHMpO1xufVxuY29uc3QgQ29tcG9zaXRlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgYWN0aXZlSW5kZXg6IDAsXG4gIG9uTmF2aWdhdGU6ICgpID0+IHt9XG59KTtcbmNvbnN0IGhvcml6b250YWxLZXlzID0gW0FSUk9XX0xFRlQsIEFSUk9XX1JJR0hUXTtcbmNvbnN0IHZlcnRpY2FsS2V5cyA9IFtBUlJPV19VUCwgQVJST1dfRE9XTl07XG5jb25zdCBhbGxLZXlzID0gWy4uLmhvcml6b250YWxLZXlzLCAuLi52ZXJ0aWNhbEtleXNdO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW5nbGUgdGFiIHN0b3Agd2hvc2UgaXRlbXMgYXJlIG5hdmlnYXRlZCBieSBhcnJvdyBrZXlzLCB3aGljaFxuICogcHJvdmlkZXMgbGlzdCBuYXZpZ2F0aW9uIG91dHNpZGUgb2YgZmxvYXRpbmcgZWxlbWVudCBjb250ZXh0cy5cbiAqXG4gKiBUaGlzIGlzIHVzZWZ1bCB0byBlbmFibGUgbmF2aWdhdGlvbiBvZiBhIGxpc3Qgb2YgaXRlbXMgdGhhdCBhcmVu4oCZdCBwYXJ0IG9mIGFcbiAqIGZsb2F0aW5nIGVsZW1lbnQuIEEgbWVudWJhciBpcyBhbiBleGFtcGxlIG9mIGEgY29tcG9zaXRlLCB3aXRoIGVhY2ggcmVmZXJlbmNlXG4gKiBlbGVtZW50IGJlaW5nIGFuIGl0ZW0uXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvQ29tcG9zaXRlXG4gKi9cbmNvbnN0IENvbXBvc2l0ZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIENvbXBvc2l0ZShwcm9wcywgZm9yd2FyZGVkUmVmKSB7XG4gIGNvbnN0IHtcbiAgICByZW5kZXIsXG4gICAgb3JpZW50YXRpb24gPSAnYm90aCcsXG4gICAgbG9vcCA9IHRydWUsXG4gICAgY29scyA9IDEsXG4gICAgZGlzYWJsZWRJbmRpY2VzLFxuICAgIGFjdGl2ZUluZGV4OiBleHRlcm5hbEFjdGl2ZUluZGV4LFxuICAgIG9uTmF2aWdhdGU6IGV4dGVybmFsU2V0QWN0aXZlSW5kZXgsXG4gICAgaXRlbVNpemVzLFxuICAgIGRlbnNlID0gZmFsc2UsXG4gICAgLi4uZG9tUHJvcHNcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbaW50ZXJuYWxBY3RpdmVJbmRleCwgaW50ZXJuYWxTZXRBY3RpdmVJbmRleF0gPSBSZWFjdC51c2VTdGF0ZSgwKTtcbiAgY29uc3QgYWN0aXZlSW5kZXggPSBleHRlcm5hbEFjdGl2ZUluZGV4ICE9IG51bGwgPyBleHRlcm5hbEFjdGl2ZUluZGV4IDogaW50ZXJuYWxBY3RpdmVJbmRleDtcbiAgY29uc3Qgb25OYXZpZ2F0ZSA9IHVzZUVmZmVjdEV2ZW50KGV4dGVybmFsU2V0QWN0aXZlSW5kZXggIT0gbnVsbCA/IGV4dGVybmFsU2V0QWN0aXZlSW5kZXggOiBpbnRlcm5hbFNldEFjdGl2ZUluZGV4KTtcbiAgY29uc3QgZWxlbWVudHNSZWYgPSBSZWFjdC51c2VSZWYoW10pO1xuICBjb25zdCByZW5kZXJFbGVtZW50UHJvcHMgPSByZW5kZXIgJiYgdHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJyA/IHJlbmRlci5wcm9wcyA6IHt9O1xuICBjb25zdCBjb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgYWN0aXZlSW5kZXgsXG4gICAgb25OYXZpZ2F0ZVxuICB9KSwgW2FjdGl2ZUluZGV4LCBvbk5hdmlnYXRlXSk7XG4gIGNvbnN0IGlzR3JpZCA9IGNvbHMgPiAxO1xuICBmdW5jdGlvbiBoYW5kbGVLZXlEb3duKGV2ZW50KSB7XG4gICAgaWYgKCFhbGxLZXlzLmluY2x1ZGVzKGV2ZW50LmtleSkpIHJldHVybjtcbiAgICBsZXQgbmV4dEluZGV4ID0gYWN0aXZlSW5kZXg7XG4gICAgY29uc3QgbWluSW5kZXggPSBnZXRNaW5JbmRleChlbGVtZW50c1JlZiwgZGlzYWJsZWRJbmRpY2VzKTtcbiAgICBjb25zdCBtYXhJbmRleCA9IGdldE1heEluZGV4KGVsZW1lbnRzUmVmLCBkaXNhYmxlZEluZGljZXMpO1xuICAgIGlmIChpc0dyaWQpIHtcbiAgICAgIGNvbnN0IHNpemVzID0gaXRlbVNpemVzIHx8IEFycmF5LmZyb20oe1xuICAgICAgICBsZW5ndGg6IGVsZW1lbnRzUmVmLmN1cnJlbnQubGVuZ3RoXG4gICAgICB9LCAoKSA9PiAoe1xuICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgaGVpZ2h0OiAxXG4gICAgICB9KSk7XG4gICAgICAvLyBUbyBjYWxjdWxhdGUgbW92ZW1lbnRzIG9uIHRoZSBncmlkLCB3ZSB1c2UgaHlwb3RoZXRpY2FsIGNlbGwgaW5kaWNlc1xuICAgICAgLy8gYXMgaWYgZXZlcnkgaXRlbSB3YXMgMXgxLCB0aGVuIGNvbnZlcnQgYmFjayB0byByZWFsIGluZGljZXMuXG4gICAgICBjb25zdCBjZWxsTWFwID0gYnVpbGRDZWxsTWFwKHNpemVzLCBjb2xzLCBkZW5zZSk7XG4gICAgICBjb25zdCBtaW5HcmlkSW5kZXggPSBjZWxsTWFwLmZpbmRJbmRleChpbmRleCA9PiBpbmRleCAhPSBudWxsICYmICFpc0Rpc2FibGVkKGVsZW1lbnRzUmVmLmN1cnJlbnQsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpKTtcbiAgICAgIC8vIGxhc3QgZW5hYmxlZCBpbmRleFxuICAgICAgY29uc3QgbWF4R3JpZEluZGV4ID0gY2VsbE1hcC5yZWR1Y2UoKGZvdW5kSW5kZXgsIGluZGV4LCBjZWxsSW5kZXgpID0+IGluZGV4ICE9IG51bGwgJiYgIWlzRGlzYWJsZWQoZWxlbWVudHNSZWYuY3VycmVudCwgaW5kZXgsIGRpc2FibGVkSW5kaWNlcykgPyBjZWxsSW5kZXggOiBmb3VuZEluZGV4LCAtMSk7XG4gICAgICBuZXh0SW5kZXggPSBjZWxsTWFwW2dldEdyaWROYXZpZ2F0ZWRJbmRleCh7XG4gICAgICAgIGN1cnJlbnQ6IGNlbGxNYXAubWFwKGl0ZW1JbmRleCA9PiBpdGVtSW5kZXggPyBlbGVtZW50c1JlZi5jdXJyZW50W2l0ZW1JbmRleF0gOiBudWxsKVxuICAgICAgfSwge1xuICAgICAgICBldmVudCxcbiAgICAgICAgb3JpZW50YXRpb24sXG4gICAgICAgIGxvb3AsXG4gICAgICAgIGNvbHMsXG4gICAgICAgIC8vIHRyZWF0IHVuZGVmaW5lZCAoZW1wdHkgZ3JpZCBzcGFjZXMpIGFzIGRpc2FibGVkIGluZGljZXMgc28gd2VcbiAgICAgICAgLy8gZG9uJ3QgZW5kIHVwIGluIHRoZW1cbiAgICAgICAgZGlzYWJsZWRJbmRpY2VzOiBnZXRDZWxsSW5kaWNlcyhbLi4uKGRpc2FibGVkSW5kaWNlcyB8fCBlbGVtZW50c1JlZi5jdXJyZW50Lm1hcCgoXywgaW5kZXgpID0+IGlzRGlzYWJsZWQoZWxlbWVudHNSZWYuY3VycmVudCwgaW5kZXgpID8gaW5kZXggOiB1bmRlZmluZWQpKSwgdW5kZWZpbmVkXSwgY2VsbE1hcCksXG4gICAgICAgIG1pbkluZGV4OiBtaW5HcmlkSW5kZXgsXG4gICAgICAgIG1heEluZGV4OiBtYXhHcmlkSW5kZXgsXG4gICAgICAgIHByZXZJbmRleDogZ2V0Q2VsbEluZGV4T2ZDb3JuZXIoYWN0aXZlSW5kZXggPiBtYXhJbmRleCA/IG1pbkluZGV4IDogYWN0aXZlSW5kZXgsIHNpemVzLCBjZWxsTWFwLCBjb2xzLFxuICAgICAgICAvLyB1c2UgYSBjb3JuZXIgbWF0Y2hpbmcgdGhlIGVkZ2UgY2xvc2VzdCB0byB0aGUgZGlyZWN0aW9uIHdlJ3JlXG4gICAgICAgIC8vIG1vdmluZyBpbiBzbyB3ZSBkb24ndCBlbmQgdXAgaW4gdGhlIHNhbWUgaXRlbS4gUHJlZmVyXG4gICAgICAgIC8vIHRvcC9sZWZ0IG92ZXIgYm90dG9tL3JpZ2h0LlxuICAgICAgICBldmVudC5rZXkgPT09IEFSUk9XX0RPV04gPyAnYmwnIDogZXZlbnQua2V5ID09PSBBUlJPV19SSUdIVCA/ICd0cicgOiAndGwnKVxuICAgICAgfSldOyAvLyBuYXZpZ2F0ZWQgY2VsbCB3aWxsIG5ldmVyIGJlIG51bGxpc2hcbiAgICB9XG4gICAgY29uc3QgdG9FbmRLZXlzID0ge1xuICAgICAgaG9yaXpvbnRhbDogW0FSUk9XX1JJR0hUXSxcbiAgICAgIHZlcnRpY2FsOiBbQVJST1dfRE9XTl0sXG4gICAgICBib3RoOiBbQVJST1dfUklHSFQsIEFSUk9XX0RPV05dXG4gICAgfVtvcmllbnRhdGlvbl07XG4gICAgY29uc3QgdG9TdGFydEtleXMgPSB7XG4gICAgICBob3Jpem9udGFsOiBbQVJST1dfTEVGVF0sXG4gICAgICB2ZXJ0aWNhbDogW0FSUk9XX1VQXSxcbiAgICAgIGJvdGg6IFtBUlJPV19MRUZULCBBUlJPV19VUF1cbiAgICB9W29yaWVudGF0aW9uXTtcbiAgICBjb25zdCBwcmV2ZW50ZWRLZXlzID0gaXNHcmlkID8gYWxsS2V5cyA6IHtcbiAgICAgIGhvcml6b250YWw6IGhvcml6b250YWxLZXlzLFxuICAgICAgdmVydGljYWw6IHZlcnRpY2FsS2V5cyxcbiAgICAgIGJvdGg6IGFsbEtleXNcbiAgICB9W29yaWVudGF0aW9uXTtcbiAgICBpZiAobmV4dEluZGV4ID09PSBhY3RpdmVJbmRleCAmJiBbLi4udG9FbmRLZXlzLCAuLi50b1N0YXJ0S2V5c10uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgaWYgKGxvb3AgJiYgbmV4dEluZGV4ID09PSBtYXhJbmRleCAmJiB0b0VuZEtleXMuaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgICBuZXh0SW5kZXggPSBtaW5JbmRleDtcbiAgICAgIH0gZWxzZSBpZiAobG9vcCAmJiBuZXh0SW5kZXggPT09IG1pbkluZGV4ICYmIHRvU3RhcnRLZXlzLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gbWF4SW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IG5leHRJbmRleCxcbiAgICAgICAgICBkZWNyZW1lbnQ6IHRvU3RhcnRLZXlzLmluY2x1ZGVzKGV2ZW50LmtleSksXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobmV4dEluZGV4ICE9PSBhY3RpdmVJbmRleCAmJiAhaXNJbmRleE91dE9mQm91bmRzKGVsZW1lbnRzUmVmLCBuZXh0SW5kZXgpKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmIChwcmV2ZW50ZWRLZXlzLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIG9uTmF2aWdhdGUobmV4dEluZGV4KTtcblxuICAgICAgLy8gV2FpdCBmb3IgRm9jdXNNYW5hZ2VyIGByZXR1cm5Gb2N1c2AgdG8gZXhlY3V0ZS5cbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgZW5xdWV1ZUZvY3VzKGVsZW1lbnRzUmVmLmN1cnJlbnRbbmV4dEluZGV4XSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY29tcHV0ZWRQcm9wcyA9IHtcbiAgICAuLi5kb21Qcm9wcyxcbiAgICAuLi5yZW5kZXJFbGVtZW50UHJvcHMsXG4gICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgJ2FyaWEtb3JpZW50YXRpb24nOiBvcmllbnRhdGlvbiA9PT0gJ2JvdGgnID8gdW5kZWZpbmVkIDogb3JpZW50YXRpb24sXG4gICAgb25LZXlEb3duKGUpIHtcbiAgICAgIGRvbVByb3BzLm9uS2V5RG93biA9PSBudWxsIHx8IGRvbVByb3BzLm9uS2V5RG93bihlKTtcbiAgICAgIHJlbmRlckVsZW1lbnRQcm9wcy5vbktleURvd24gPT0gbnVsbCB8fCByZW5kZXJFbGVtZW50UHJvcHMub25LZXlEb3duKGUpO1xuICAgICAgaGFuZGxlS2V5RG93bihlKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb3NpdGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGbG9hdGluZ0xpc3QsIHtcbiAgICBlbGVtZW50c1JlZjogZWxlbWVudHNSZWZcbiAgfSwgcmVuZGVySnN4KHJlbmRlciwgY29tcHV0ZWRQcm9wcykpKTtcbn0pO1xuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvQ29tcG9zaXRlXG4gKi9cbmNvbnN0IENvbXBvc2l0ZUl0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBDb21wb3NpdGVJdGVtKHByb3BzLCBmb3J3YXJkZWRSZWYpIHtcbiAgY29uc3Qge1xuICAgIHJlbmRlcixcbiAgICAuLi5kb21Qcm9wc1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHJlbmRlckVsZW1lbnRQcm9wcyA9IHJlbmRlciAmJiB0eXBlb2YgcmVuZGVyICE9PSAnZnVuY3Rpb24nID8gcmVuZGVyLnByb3BzIDoge307XG4gIGNvbnN0IHtcbiAgICBhY3RpdmVJbmRleCxcbiAgICBvbk5hdmlnYXRlXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KENvbXBvc2l0ZUNvbnRleHQpO1xuICBjb25zdCB7XG4gICAgcmVmLFxuICAgIGluZGV4XG4gIH0gPSB1c2VMaXN0SXRlbSgpO1xuICBjb25zdCBtZXJnZWRSZWYgPSB1c2VNZXJnZVJlZnMoW3JlZiwgZm9yd2FyZGVkUmVmLCByZW5kZXJFbGVtZW50UHJvcHMucmVmXSk7XG4gIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlSW5kZXggPT09IGluZGV4O1xuICBjb25zdCBjb21wdXRlZFByb3BzID0ge1xuICAgIC4uLmRvbVByb3BzLFxuICAgIC4uLnJlbmRlckVsZW1lbnRQcm9wcyxcbiAgICByZWY6IG1lcmdlZFJlZixcbiAgICB0YWJJbmRleDogaXNBY3RpdmUgPyAwIDogLTEsXG4gICAgJ2RhdGEtYWN0aXZlJzogaXNBY3RpdmUgPyAnJyA6IHVuZGVmaW5lZCxcbiAgICBvbkZvY3VzKGUpIHtcbiAgICAgIGRvbVByb3BzLm9uRm9jdXMgPT0gbnVsbCB8fCBkb21Qcm9wcy5vbkZvY3VzKGUpO1xuICAgICAgcmVuZGVyRWxlbWVudFByb3BzLm9uRm9jdXMgPT0gbnVsbCB8fCByZW5kZXJFbGVtZW50UHJvcHMub25Gb2N1cyhlKTtcbiAgICAgIG9uTmF2aWdhdGUoaW5kZXgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJlbmRlckpzeChyZW5kZXIsIGNvbXB1dGVkUHJvcHMpO1xufSk7XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5sZXQgc2VydmVySGFuZG9mZkNvbXBsZXRlID0gZmFsc2U7XG5sZXQgY291bnQgPSAwO1xuY29uc3QgZ2VuSWQgPSAoKSA9PiAvLyBFbnN1cmUgdGhlIGlkIGlzIHVuaXF1ZSB3aXRoIG11bHRpcGxlIGluZGVwZW5kZW50IHZlcnNpb25zIG9mIEZsb2F0aW5nIFVJXG4vLyBvbiA8UmVhY3QgMThcblwiZmxvYXRpbmctdWktXCIgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA2KSArIGNvdW50Kys7XG5mdW5jdGlvbiB1c2VGbG9hdGluZ0lkKCkge1xuICBjb25zdCBbaWQsIHNldElkXSA9IFJlYWN0LnVzZVN0YXRlKCgpID0+IHNlcnZlckhhbmRvZmZDb21wbGV0ZSA/IGdlbklkKCkgOiB1bmRlZmluZWQpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGlkID09IG51bGwpIHtcbiAgICAgIHNldElkKGdlbklkKCkpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXJ2ZXJIYW5kb2ZmQ29tcGxldGUgPSB0cnVlO1xuICB9LCBbXSk7XG4gIHJldHVybiBpZDtcbn1cbmNvbnN0IHVzZVJlYWN0SWQgPSBTYWZlUmVhY3QudXNlSWQ7XG5cbi8qKlxuICogVXNlcyBSZWFjdCAxOCdzIGJ1aWx0LWluIGB1c2VJZCgpYCB3aGVuIGF2YWlsYWJsZSwgb3IgZmFsbHMgYmFjayB0byBhXG4gKiBzbGlnaHRseSBsZXNzIHBlcmZvcm1hbnQgKHJlcXVpcmluZyBhIGRvdWJsZSByZW5kZXIpIGltcGxlbWVudGF0aW9uIGZvclxuICogZWFybGllciBSZWFjdCB2ZXJzaW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9yZWFjdC11dGlscyN1c2VpZFxuICovXG5jb25zdCB1c2VJZCA9IHVzZVJlYWN0SWQgfHwgdXNlRmxvYXRpbmdJZDtcblxubGV0IGRldk1lc3NhZ2VTZXQ7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIGRldk1lc3NhZ2VTZXQgPSAvKiNfX1BVUkVfXyovbmV3IFNldCgpO1xufVxuZnVuY3Rpb24gd2FybigpIHtcbiAgdmFyIF9kZXZNZXNzYWdlU2V0O1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWVzc2FnZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbWVzc2FnZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgY29uc3QgbWVzc2FnZSA9IFwiRmxvYXRpbmcgVUk6IFwiICsgbWVzc2FnZXMuam9pbignICcpO1xuICBpZiAoISgoX2Rldk1lc3NhZ2VTZXQgPSBkZXZNZXNzYWdlU2V0KSAhPSBudWxsICYmIF9kZXZNZXNzYWdlU2V0LmhhcyhtZXNzYWdlKSkpIHtcbiAgICB2YXIgX2Rldk1lc3NhZ2VTZXQyO1xuICAgIChfZGV2TWVzc2FnZVNldDIgPSBkZXZNZXNzYWdlU2V0KSA9PSBudWxsIHx8IF9kZXZNZXNzYWdlU2V0Mi5hZGQobWVzc2FnZSk7XG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICB9XG59XG5mdW5jdGlvbiBlcnJvcigpIHtcbiAgdmFyIF9kZXZNZXNzYWdlU2V0MztcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBtZXNzYWdlcyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgIG1lc3NhZ2VzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cbiAgY29uc3QgbWVzc2FnZSA9IFwiRmxvYXRpbmcgVUk6IFwiICsgbWVzc2FnZXMuam9pbignICcpO1xuICBpZiAoISgoX2Rldk1lc3NhZ2VTZXQzID0gZGV2TWVzc2FnZVNldCkgIT0gbnVsbCAmJiBfZGV2TWVzc2FnZVNldDMuaGFzKG1lc3NhZ2UpKSkge1xuICAgIHZhciBfZGV2TWVzc2FnZVNldDQ7XG4gICAgKF9kZXZNZXNzYWdlU2V0NCA9IGRldk1lc3NhZ2VTZXQpID09IG51bGwgfHwgX2Rldk1lc3NhZ2VTZXQ0LmFkZChtZXNzYWdlKTtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHBvaW50aW5nIGFycm93IHRyaWFuZ2xlLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nQXJyb3dcbiAqL1xuY29uc3QgRmxvYXRpbmdBcnJvdyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZsb2F0aW5nQXJyb3cocHJvcHMsIHJlZikge1xuICBjb25zdCB7XG4gICAgY29udGV4dDoge1xuICAgICAgcGxhY2VtZW50LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgZmxvYXRpbmdcbiAgICAgIH0sXG4gICAgICBtaWRkbGV3YXJlRGF0YToge1xuICAgICAgICBhcnJvd1xuICAgICAgfVxuICAgIH0sXG4gICAgd2lkdGggPSAxNCxcbiAgICBoZWlnaHQgPSA3LFxuICAgIHRpcFJhZGl1cyA9IDAsXG4gICAgc3Ryb2tlV2lkdGggPSAwLFxuICAgIHN0YXRpY09mZnNldCxcbiAgICBzdHJva2UsXG4gICAgZCxcbiAgICBzdHlsZToge1xuICAgICAgdHJhbnNmb3JtLFxuICAgICAgLi4ucmVzdFN0eWxlXG4gICAgfSA9IHt9LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIHdhcm4oJ1RoZSBgcmVmYCBwcm9wIGlzIHJlcXVpcmVkIGZvciBgRmxvYXRpbmdBcnJvd2AuJyk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNsaXBQYXRoSWQgPSB1c2VJZCgpO1xuICBjb25zdCBbaXNSVEwsIHNldElzUlRMXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzI5MzJcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghZmxvYXRpbmcpIHJldHVybjtcbiAgICBjb25zdCBpc1JUTCA9IGdldENvbXB1dGVkU3R5bGUoZmxvYXRpbmcpLmRpcmVjdGlvbiA9PT0gJ3J0bCc7XG4gICAgaWYgKGlzUlRMKSB7XG4gICAgICBzZXRJc1JUTCh0cnVlKTtcbiAgICB9XG4gIH0sIFtmbG9hdGluZ10pO1xuICBpZiAoIWZsb2F0aW5nKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBTdHJva2VzIG11c3QgYmUgZG91YmxlIHRoZSBib3JkZXIgd2lkdGgsIHRoaXMgZW5zdXJlcyB0aGUgc3Ryb2tlJ3Mgd2lkdGhcbiAgLy8gd29ya3MgYXMgeW91J2QgZXhwZWN0LlxuICBjb25zdCBjb21wdXRlZFN0cm9rZVdpZHRoID0gc3Ryb2tlV2lkdGggKiAyO1xuICBjb25zdCBoYWxmU3Ryb2tlV2lkdGggPSBjb21wdXRlZFN0cm9rZVdpZHRoIC8gMjtcbiAgY29uc3Qgc3ZnWCA9IHdpZHRoIC8gMiAqICh0aXBSYWRpdXMgLyAtOCArIDEpO1xuICBjb25zdCBzdmdZID0gaGVpZ2h0IC8gMiAqIHRpcFJhZGl1cyAvIDQ7XG4gIGNvbnN0IFtzaWRlLCBhbGlnbm1lbnRdID0gcGxhY2VtZW50LnNwbGl0KCctJyk7XG4gIGNvbnN0IGlzQ3VzdG9tU2hhcGUgPSAhIWQ7XG4gIGNvbnN0IGlzVmVydGljYWxTaWRlID0gc2lkZSA9PT0gJ3RvcCcgfHwgc2lkZSA9PT0gJ2JvdHRvbSc7XG4gIGNvbnN0IHlPZmZzZXRQcm9wID0gc3RhdGljT2Zmc2V0ICYmIGFsaWdubWVudCA9PT0gJ2VuZCcgPyAnYm90dG9tJyA6ICd0b3AnO1xuICBsZXQgeE9mZnNldFByb3AgPSBzdGF0aWNPZmZzZXQgJiYgYWxpZ25tZW50ID09PSAnZW5kJyA/ICdyaWdodCcgOiAnbGVmdCc7XG4gIGlmIChzdGF0aWNPZmZzZXQgJiYgaXNSVEwpIHtcbiAgICB4T2Zmc2V0UHJvcCA9IGFsaWdubWVudCA9PT0gJ2VuZCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuICB9XG4gIGNvbnN0IGFycm93WCA9IChhcnJvdyA9PSBudWxsID8gdm9pZCAwIDogYXJyb3cueCkgIT0gbnVsbCA/IHN0YXRpY09mZnNldCB8fCBhcnJvdy54IDogJyc7XG4gIGNvbnN0IGFycm93WSA9IChhcnJvdyA9PSBudWxsID8gdm9pZCAwIDogYXJyb3cueSkgIT0gbnVsbCA/IHN0YXRpY09mZnNldCB8fCBhcnJvdy55IDogJyc7XG4gIGNvbnN0IGRWYWx1ZSA9IGQgfHwgJ00wLDAnICsgKFwiIEhcIiArIHdpZHRoKSArIChcIiBMXCIgKyAod2lkdGggLSBzdmdYKSArIFwiLFwiICsgKGhlaWdodCAtIHN2Z1kpKSArIChcIiBRXCIgKyB3aWR0aCAvIDIgKyBcIixcIiArIGhlaWdodCArIFwiIFwiICsgc3ZnWCArIFwiLFwiICsgKGhlaWdodCAtIHN2Z1kpKSArICcgWic7XG4gIGNvbnN0IHJvdGF0aW9uID0ge1xuICAgIHRvcDogaXNDdXN0b21TaGFwZSA/ICdyb3RhdGUoMTgwZGVnKScgOiAnJyxcbiAgICBsZWZ0OiBpc0N1c3RvbVNoYXBlID8gJ3JvdGF0ZSg5MGRlZyknIDogJ3JvdGF0ZSgtOTBkZWcpJyxcbiAgICBib3R0b206IGlzQ3VzdG9tU2hhcGUgPyAnJyA6ICdyb3RhdGUoMTgwZGVnKScsXG4gICAgcmlnaHQ6IGlzQ3VzdG9tU2hhcGUgPyAncm90YXRlKC05MGRlZyknIDogJ3JvdGF0ZSg5MGRlZyknXG4gIH1bc2lkZV07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSxcbiAgICByZWY6IHJlZixcbiAgICB3aWR0aDogaXNDdXN0b21TaGFwZSA/IHdpZHRoIDogd2lkdGggKyBjb21wdXRlZFN0cm9rZVdpZHRoLFxuICAgIGhlaWdodDogd2lkdGgsXG4gICAgdmlld0JveDogXCIwIDAgXCIgKyB3aWR0aCArIFwiIFwiICsgKGhlaWdodCA+IHdpZHRoID8gaGVpZ2h0IDogd2lkdGgpLFxuICAgIHN0eWxlOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIFt4T2Zmc2V0UHJvcF06IGFycm93WCxcbiAgICAgIFt5T2Zmc2V0UHJvcF06IGFycm93WSxcbiAgICAgIFtzaWRlXTogaXNWZXJ0aWNhbFNpZGUgfHwgaXNDdXN0b21TaGFwZSA/ICcxMDAlJyA6IFwiY2FsYygxMDAlIC0gXCIgKyBjb21wdXRlZFN0cm9rZVdpZHRoIC8gMiArIFwicHgpXCIsXG4gICAgICB0cmFuc2Zvcm06IFwiXCIgKyByb3RhdGlvbiArICh0cmFuc2Zvcm0gIT0gbnVsbCA/IHRyYW5zZm9ybSA6ICcnKSxcbiAgICAgIC4uLnJlc3RTdHlsZVxuICAgIH1cbiAgfSksIGNvbXB1dGVkU3Ryb2tlV2lkdGggPiAwICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xpcFBhdGg6IFwidXJsKCNcIiArIGNsaXBQYXRoSWQgKyBcIilcIixcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBzdHJva2U6IHN0cm9rZVxuICAgIC8vIEFjY291bnQgZm9yIHRoZSBzdHJva2Ugb24gdGhlIGZpbGwgcGF0aCByZW5kZXJlZCBiZWxvdy5cbiAgICAsXG4gICAgc3Ryb2tlV2lkdGg6IGNvbXB1dGVkU3Ryb2tlV2lkdGggKyAoZCA/IDAgOiAxKSxcbiAgICBkOiBkVmFsdWVcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgc3Ryb2tlOiBjb21wdXRlZFN0cm9rZVdpZHRoICYmICFkID8gcmVzdC5maWxsIDogJ25vbmUnLFxuICAgIGQ6IGRWYWx1ZVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjbGlwUGF0aFwiLCB7XG4gICAgaWQ6IGNsaXBQYXRoSWRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiAtaGFsZlN0cm9rZVdpZHRoLFxuICAgIHk6IGhhbGZTdHJva2VXaWR0aCAqIChpc0N1c3RvbVNoYXBlID8gLTEgOiAxKSxcbiAgICB3aWR0aDogd2lkdGggKyBjb21wdXRlZFN0cm9rZVdpZHRoLFxuICAgIGhlaWdodDogd2lkdGhcbiAgfSkpKTtcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVQdWJTdWIoKSB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgcmV0dXJuIHtcbiAgICBlbWl0KGV2ZW50LCBkYXRhKSB7XG4gICAgICB2YXIgX21hcCRnZXQ7XG4gICAgICAoX21hcCRnZXQgPSBtYXAuZ2V0KGV2ZW50KSkgPT0gbnVsbCB8fCBfbWFwJGdldC5mb3JFYWNoKGhhbmRsZXIgPT4gaGFuZGxlcihkYXRhKSk7XG4gICAgfSxcbiAgICBvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgIG1hcC5zZXQoZXZlbnQsIFsuLi4obWFwLmdldChldmVudCkgfHwgW10pLCBsaXN0ZW5lcl0pO1xuICAgIH0sXG4gICAgb2ZmKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgdmFyIF9tYXAkZ2V0MjtcbiAgICAgIG1hcC5zZXQoZXZlbnQsICgoX21hcCRnZXQyID0gbWFwLmdldChldmVudCkpID09IG51bGwgPyB2b2lkIDAgOiBfbWFwJGdldDIuZmlsdGVyKGwgPT4gbCAhPT0gbGlzdGVuZXIpKSB8fCBbXSk7XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBGbG9hdGluZ05vZGVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5jb25zdCBGbG9hdGluZ1RyZWVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFyZW50IG5vZGUgaWQgZm9yIG5lc3RlZCBmbG9hdGluZyBlbGVtZW50cywgaWYgYXZhaWxhYmxlLlxuICogUmV0dXJucyBgbnVsbGAgZm9yIHRvcC1sZXZlbCBmbG9hdGluZyBlbGVtZW50cy5cbiAqL1xuY29uc3QgdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQgPSAoKSA9PiB7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dDtcbiAgcmV0dXJuICgoX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZsb2F0aW5nTm9kZUNvbnRleHQpKSA9PSBudWxsID8gdm9pZCAwIDogX1JlYWN0JHVzZUNvbnRleHQuaWQpIHx8IG51bGw7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG5lYXJlc3QgZmxvYXRpbmcgdHJlZSBjb250ZXh0LCBpZiBhdmFpbGFibGUuXG4gKi9cbmNvbnN0IHVzZUZsb2F0aW5nVHJlZSA9ICgpID0+IFJlYWN0LnVzZUNvbnRleHQoRmxvYXRpbmdUcmVlQ29udGV4dCk7XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgbm9kZSBpbnRvIHRoZSBgRmxvYXRpbmdUcmVlYCwgcmV0dXJuaW5nIGl0cyBpZC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ1RyZWVcbiAqL1xuZnVuY3Rpb24gdXNlRmxvYXRpbmdOb2RlSWQoY3VzdG9tUGFyZW50SWQpIHtcbiAgY29uc3QgaWQgPSB1c2VJZCgpO1xuICBjb25zdCB0cmVlID0gdXNlRmxvYXRpbmdUcmVlKCk7XG4gIGNvbnN0IHJlYWN0UGFyZW50SWQgPSB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCgpO1xuICBjb25zdCBwYXJlbnRJZCA9IGN1c3RvbVBhcmVudElkIHx8IHJlYWN0UGFyZW50SWQ7XG4gIGluZGV4KCgpID0+IHtcbiAgICBjb25zdCBub2RlID0ge1xuICAgICAgaWQsXG4gICAgICBwYXJlbnRJZFxuICAgIH07XG4gICAgdHJlZSA9PSBudWxsIHx8IHRyZWUuYWRkTm9kZShub2RlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdHJlZSA9PSBudWxsIHx8IHRyZWUucmVtb3ZlTm9kZShub2RlKTtcbiAgICB9O1xuICB9LCBbdHJlZSwgaWQsIHBhcmVudElkXSk7XG4gIHJldHVybiBpZDtcbn1cbi8qKlxuICogUHJvdmlkZXMgcGFyZW50IG5vZGUgY29udGV4dCBmb3IgbmVzdGVkIGZsb2F0aW5nIGVsZW1lbnRzLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nVHJlZVxuICovXG5mdW5jdGlvbiBGbG9hdGluZ05vZGUocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGlkXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgcGFyZW50SWQgPSB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCgpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmxvYXRpbmdOb2RlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgICBpZCxcbiAgICAgIHBhcmVudElkXG4gICAgfSksIFtpZCwgcGFyZW50SWRdKVxuICB9LCBjaGlsZHJlbik7XG59XG4vKipcbiAqIFByb3ZpZGVzIGNvbnRleHQgZm9yIG5lc3RlZCBmbG9hdGluZyBlbGVtZW50cyB3aGVuIHRoZXkgYXJlIG5vdCBjaGlsZHJlbiBvZlxuICogZWFjaCBvdGhlciBvbiB0aGUgRE9NLlxuICogVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGluIGFsbCBjYXNlcywgZXhjZXB0IHdoZW4gdGhlcmUgbXVzdCBiZSBleHBsaWNpdCBjb21tdW5pY2F0aW9uIGJldHdlZW4gcGFyZW50IGFuZCBjaGlsZCBmbG9hdGluZyBlbGVtZW50cy4gSXQgaXMgbmVjZXNzYXJ5IGZvcjpcbiAqIC0gVGhlIGBidWJibGVzYCBvcHRpb24gaW4gdGhlIGB1c2VEaXNtaXNzKClgIEhvb2tcbiAqIC0gTmVzdGVkIHZpcnR1YWwgbGlzdCBuYXZpZ2F0aW9uXG4gKiAtIE5lc3RlZCBmbG9hdGluZyBlbGVtZW50cyB0aGF0IGVhY2ggb3BlbiBvbiBob3ZlclxuICogLSBDdXN0b20gY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHBhcmVudCBhbmQgY2hpbGQgZmxvYXRpbmcgZWxlbWVudHNcbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ1RyZWVcbiAqL1xuZnVuY3Rpb24gRmxvYXRpbmdUcmVlKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlblxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IG5vZGVzUmVmID0gUmVhY3QudXNlUmVmKFtdKTtcbiAgY29uc3QgYWRkTm9kZSA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIG5vZGVzUmVmLmN1cnJlbnQgPSBbLi4ubm9kZXNSZWYuY3VycmVudCwgbm9kZV07XG4gIH0sIFtdKTtcbiAgY29uc3QgcmVtb3ZlTm9kZSA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIG5vZGVzUmVmLmN1cnJlbnQgPSBub2Rlc1JlZi5jdXJyZW50LmZpbHRlcihuID0+IG4gIT09IG5vZGUpO1xuICB9LCBbXSk7XG4gIGNvbnN0IGV2ZW50cyA9IFJlYWN0LnVzZVN0YXRlKCgpID0+IGNyZWF0ZVB1YlN1YigpKVswXTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZsb2F0aW5nVHJlZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgICAgbm9kZXNSZWYsXG4gICAgICBhZGROb2RlLFxuICAgICAgcmVtb3ZlTm9kZSxcbiAgICAgIGV2ZW50c1xuICAgIH0pLCBbYWRkTm9kZSwgcmVtb3ZlTm9kZSwgZXZlbnRzXSlcbiAgfSwgY2hpbGRyZW4pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBdHRyaWJ1dGUobmFtZSkge1xuICByZXR1cm4gXCJkYXRhLWZsb2F0aW5nLXVpLVwiICsgbmFtZTtcbn1cblxuZnVuY3Rpb24gdXNlTGF0ZXN0UmVmKHZhbHVlKSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZih2YWx1ZSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlZjtcbn1cblxuY29uc3Qgc2FmZVBvbHlnb25JZGVudGlmaWVyID0gLyojX19QVVJFX18qL2NyZWF0ZUF0dHJpYnV0ZSgnc2FmZS1wb2x5Z29uJyk7XG5mdW5jdGlvbiBnZXREZWxheSh2YWx1ZSwgcHJvcCwgcG9pbnRlclR5cGUpIHtcbiAgaWYgKHBvaW50ZXJUeXBlICYmICFpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlKSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdm9pZCAwIDogdmFsdWVbcHJvcF07XG59XG4vKipcbiAqIE9wZW5zIHRoZSBmbG9hdGluZyBlbGVtZW50IHdoaWxlIGhvdmVyaW5nIG92ZXIgdGhlIHJlZmVyZW5jZSBlbGVtZW50LCBsaWtlXG4gKiBDU1MgYDpob3ZlcmAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlSG92ZXJcbiAqL1xuZnVuY3Rpb24gdXNlSG92ZXIoY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBkYXRhUmVmLFxuICAgIGV2ZW50cyxcbiAgICBlbGVtZW50c1xuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIGRlbGF5ID0gMCxcbiAgICBoYW5kbGVDbG9zZSA9IG51bGwsXG4gICAgbW91c2VPbmx5ID0gZmFsc2UsXG4gICAgcmVzdE1zID0gMCxcbiAgICBtb3ZlID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHRyZWUgPSB1c2VGbG9hdGluZ1RyZWUoKTtcbiAgY29uc3QgcGFyZW50SWQgPSB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCgpO1xuICBjb25zdCBoYW5kbGVDbG9zZVJlZiA9IHVzZUxhdGVzdFJlZihoYW5kbGVDbG9zZSk7XG4gIGNvbnN0IGRlbGF5UmVmID0gdXNlTGF0ZXN0UmVmKGRlbGF5KTtcbiAgY29uc3Qgb3BlblJlZiA9IHVzZUxhdGVzdFJlZihvcGVuKTtcbiAgY29uc3QgcG9pbnRlclR5cGVSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgY29uc3QgdGltZW91dFJlZiA9IFJlYWN0LnVzZVJlZigtMSk7XG4gIGNvbnN0IGhhbmRsZXJSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgY29uc3QgcmVzdFRpbWVvdXRSZWYgPSBSZWFjdC51c2VSZWYoLTEpO1xuICBjb25zdCBibG9ja01vdXNlTW92ZVJlZiA9IFJlYWN0LnVzZVJlZih0cnVlKTtcbiAgY29uc3QgcGVyZm9ybWVkUG9pbnRlckV2ZW50c011dGF0aW9uUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgdW5iaW5kTW91c2VNb3ZlUmVmID0gUmVhY3QudXNlUmVmKCgpID0+IHt9KTtcbiAgY29uc3QgaXNIb3Zlck9wZW4gPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgdmFyIF9kYXRhUmVmJGN1cnJlbnQkb3BlbjtcbiAgICBjb25zdCB0eXBlID0gKF9kYXRhUmVmJGN1cnJlbnQkb3BlbiA9IGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZGF0YVJlZiRjdXJyZW50JG9wZW4udHlwZTtcbiAgICByZXR1cm4gKHR5cGUgPT0gbnVsbCA/IHZvaWQgMCA6IHR5cGUuaW5jbHVkZXMoJ21vdXNlJykpICYmIHR5cGUgIT09ICdtb3VzZWRvd24nO1xuICB9LCBbZGF0YVJlZl0pO1xuXG4gIC8vIFdoZW4gY2xvc2luZyBiZWZvcmUgb3BlbmluZywgY2xlYXIgdGhlIGRlbGF5IHRpbWVvdXRzIHRvIGNhbmNlbCBpdFxuICAvLyBmcm9tIHNob3dpbmcuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgZnVuY3Rpb24gb25PcGVuQ2hhbmdlKF9yZWYpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIG9wZW5cbiAgICAgIH0gPSBfcmVmO1xuICAgICAgaWYgKCFvcGVuKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICBjbGVhclRpbWVvdXQocmVzdFRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICAgIGJsb2NrTW91c2VNb3ZlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBldmVudHMub24oJ29wZW5jaGFuZ2UnLCBvbk9wZW5DaGFuZ2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBldmVudHMub2ZmKCdvcGVuY2hhbmdlJywgb25PcGVuQ2hhbmdlKTtcbiAgICB9O1xuICB9LCBbZW5hYmxlZCwgZXZlbnRzXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgaWYgKCFoYW5kbGVDbG9zZVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgaWYgKCFvcGVuKSByZXR1cm47XG4gICAgZnVuY3Rpb24gb25MZWF2ZShldmVudCkge1xuICAgICAgaWYgKGlzSG92ZXJPcGVuKCkpIHtcbiAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudCwgJ2hvdmVyJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGh0bWwgPSBnZXREb2N1bWVudChlbGVtZW50cy5mbG9hdGluZykuZG9jdW1lbnRFbGVtZW50O1xuICAgIGh0bWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uTGVhdmUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBodG1sLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvbkxlYXZlKTtcbiAgICB9O1xuICB9LCBbZWxlbWVudHMuZmxvYXRpbmcsIG9wZW4sIG9uT3BlbkNoYW5nZSwgZW5hYmxlZCwgaGFuZGxlQ2xvc2VSZWYsIGlzSG92ZXJPcGVuXSk7XG4gIGNvbnN0IGNsb3NlV2l0aERlbGF5ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50LCBydW5FbHNlQnJhbmNoLCByZWFzb24pIHtcbiAgICBpZiAocnVuRWxzZUJyYW5jaCA9PT0gdm9pZCAwKSB7XG4gICAgICBydW5FbHNlQnJhbmNoID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHJlYXNvbiA9PT0gdm9pZCAwKSB7XG4gICAgICByZWFzb24gPSAnaG92ZXInO1xuICAgIH1cbiAgICBjb25zdCBjbG9zZURlbGF5ID0gZ2V0RGVsYXkoZGVsYXlSZWYuY3VycmVudCwgJ2Nsb3NlJywgcG9pbnRlclR5cGVSZWYuY3VycmVudCk7XG4gICAgaWYgKGNsb3NlRGVsYXkgJiYgIWhhbmRsZXJSZWYuY3VycmVudCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICB0aW1lb3V0UmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50LCByZWFzb24pLCBjbG9zZURlbGF5KTtcbiAgICB9IGVsc2UgaWYgKHJ1bkVsc2VCcmFuY2gpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudCwgcmVhc29uKTtcbiAgICB9XG4gIH0sIFtkZWxheVJlZiwgb25PcGVuQ2hhbmdlXSk7XG4gIGNvbnN0IGNsZWFudXBNb3VzZU1vdmVIYW5kbGVyID0gdXNlRWZmZWN0RXZlbnQoKCkgPT4ge1xuICAgIHVuYmluZE1vdXNlTW92ZVJlZi5jdXJyZW50KCk7XG4gICAgaGFuZGxlclJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICB9KTtcbiAgY29uc3QgY2xlYXJQb2ludGVyRXZlbnRzID0gdXNlRWZmZWN0RXZlbnQoKCkgPT4ge1xuICAgIGlmIChwZXJmb3JtZWRQb2ludGVyRXZlbnRzTXV0YXRpb25SZWYuY3VycmVudCkge1xuICAgICAgY29uc3QgYm9keSA9IGdldERvY3VtZW50KGVsZW1lbnRzLmZsb2F0aW5nKS5ib2R5O1xuICAgICAgYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICBib2R5LnJlbW92ZUF0dHJpYnV0ZShzYWZlUG9seWdvbklkZW50aWZpZXIpO1xuICAgICAgcGVyZm9ybWVkUG9pbnRlckV2ZW50c011dGF0aW9uUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFJlZ2lzdGVyaW5nIHRoZSBtb3VzZSBldmVudHMgb24gdGhlIHJlZmVyZW5jZSBkaXJlY3RseSB0byBieXBhc3MgUmVhY3Qnc1xuICAvLyBkZWxlZ2F0aW9uIHN5c3RlbS4gSWYgdGhlIGN1cnNvciB3YXMgb24gYSBkaXNhYmxlZCBlbGVtZW50IGFuZCB0aGVuIGVudGVyZWRcbiAgLy8gdGhlIHJlZmVyZW5jZSAobm8gZ2FwKSwgYG1vdXNlZW50ZXJgIGRvZXNuJ3QgZmlyZSBpbiB0aGUgZGVsZWdhdGlvbiBzeXN0ZW0uXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgZnVuY3Rpb24gaXNDbGlja0xpa2VPcGVuRXZlbnQoKSB7XG4gICAgICByZXR1cm4gZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCA/IFsnY2xpY2snLCAnbW91c2Vkb3duJ10uaW5jbHVkZXMoZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudC50eXBlKSA6IGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoZXZlbnQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgYmxvY2tNb3VzZU1vdmVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgaWYgKG1vdXNlT25seSAmJiAhaXNNb3VzZUxpa2VQb2ludGVyVHlwZShwb2ludGVyVHlwZVJlZi5jdXJyZW50KSB8fCByZXN0TXMgPiAwICYmICFnZXREZWxheShkZWxheVJlZi5jdXJyZW50LCAnb3BlbicpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9wZW5EZWxheSA9IGdldERlbGF5KGRlbGF5UmVmLmN1cnJlbnQsICdvcGVuJywgcG9pbnRlclR5cGVSZWYuY3VycmVudCk7XG4gICAgICBpZiAob3BlbkRlbGF5KSB7XG4gICAgICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoIW9wZW5SZWYuY3VycmVudCkge1xuICAgICAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50LCAnaG92ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIG9wZW5EZWxheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQsICdob3ZlcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoZXZlbnQpIHtcbiAgICAgIGlmIChpc0NsaWNrTGlrZU9wZW5FdmVudCgpKSByZXR1cm47XG4gICAgICB1bmJpbmRNb3VzZU1vdmVSZWYuY3VycmVudCgpO1xuICAgICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpO1xuICAgICAgY2xlYXJUaW1lb3V0KHJlc3RUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgaWYgKGhhbmRsZUNsb3NlUmVmLmN1cnJlbnQgJiYgZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCkge1xuICAgICAgICAvLyBQcmV2ZW50IGNsZWFyaW5nIGBvblNjcm9sbE1vdXNlTGVhdmVgIHRpbWVvdXQuXG4gICAgICAgIGlmICghb3Blbikge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZXJSZWYuY3VycmVudCA9IGhhbmRsZUNsb3NlUmVmLmN1cnJlbnQoe1xuICAgICAgICAgIC4uLmRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQsXG4gICAgICAgICAgdHJlZSxcbiAgICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICAgIHk6IGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgb25DbG9zZSgpIHtcbiAgICAgICAgICAgIGNsZWFyUG9pbnRlckV2ZW50cygpO1xuICAgICAgICAgICAgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIoKTtcbiAgICAgICAgICAgIGNsb3NlV2l0aERlbGF5KGV2ZW50LCB0cnVlLCAnc2FmZS1wb2x5Z29uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJSZWYuY3VycmVudDtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZXIpO1xuICAgICAgICB1bmJpbmRNb3VzZU1vdmVSZWYuY3VycmVudCA9ICgpID0+IHtcbiAgICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlcik7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQWxsb3cgaW50ZXJhY3Rpdml0eSB3aXRob3V0IGBzYWZlUG9seWdvbmAgb24gdG91Y2ggZGV2aWNlcy4gV2l0aCBhXG4gICAgICAvLyBwb2ludGVyLCBhIHNob3J0IGNsb3NlIGRlbGF5IGlzIGFuIGFsdGVybmF0aXZlLCBzbyBpdCBzaG91bGQgd29ya1xuICAgICAgLy8gY29uc2lzdGVudGx5LlxuICAgICAgY29uc3Qgc2hvdWxkQ2xvc2UgPSBwb2ludGVyVHlwZVJlZi5jdXJyZW50ID09PSAndG91Y2gnID8gIWNvbnRhaW5zKGVsZW1lbnRzLmZsb2F0aW5nLCBldmVudC5yZWxhdGVkVGFyZ2V0KSA6IHRydWU7XG4gICAgICBpZiAoc2hvdWxkQ2xvc2UpIHtcbiAgICAgICAgY2xvc2VXaXRoRGVsYXkoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBjbG9zZXMgYWZ0ZXIgc2Nyb2xsaW5nIGV2ZW4gaWYgdGhlIHBvaW50ZXJcbiAgICAvLyBkaWQgbm90IG1vdmUuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2Rpc2N1c3Npb25zLzE2OTJcbiAgICBmdW5jdGlvbiBvblNjcm9sbE1vdXNlTGVhdmUoZXZlbnQpIHtcbiAgICAgIGlmIChpc0NsaWNrTGlrZU9wZW5FdmVudCgpKSByZXR1cm47XG4gICAgICBpZiAoIWRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQpIHJldHVybjtcbiAgICAgIGhhbmRsZUNsb3NlUmVmLmN1cnJlbnQgPT0gbnVsbCB8fCBoYW5kbGVDbG9zZVJlZi5jdXJyZW50KHtcbiAgICAgICAgLi4uZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCxcbiAgICAgICAgdHJlZSxcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSxcbiAgICAgICAgb25DbG9zZSgpIHtcbiAgICAgICAgICBjbGVhclBvaW50ZXJFdmVudHMoKTtcbiAgICAgICAgICBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlcigpO1xuICAgICAgICAgIGNsb3NlV2l0aERlbGF5KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSkoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNFbGVtZW50KGVsZW1lbnRzLmRvbVJlZmVyZW5jZSkpIHtcbiAgICAgIHZhciBfZWxlbWVudHMkZmxvYXRpbmc7XG4gICAgICBjb25zdCByZWYgPSBlbGVtZW50cy5kb21SZWZlcmVuY2U7XG4gICAgICBvcGVuICYmIHJlZi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25TY3JvbGxNb3VzZUxlYXZlKTtcbiAgICAgIChfZWxlbWVudHMkZmxvYXRpbmcgPSBlbGVtZW50cy5mbG9hdGluZykgPT0gbnVsbCB8fCBfZWxlbWVudHMkZmxvYXRpbmcuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uU2Nyb2xsTW91c2VMZWF2ZSk7XG4gICAgICBtb3ZlICYmIHJlZi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlRW50ZXIsIHtcbiAgICAgICAgb25jZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZWYuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIG9uTW91c2VFbnRlcik7XG4gICAgICByZWYuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uTW91c2VMZWF2ZSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB2YXIgX2VsZW1lbnRzJGZsb2F0aW5nMjtcbiAgICAgICAgb3BlbiAmJiByZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uU2Nyb2xsTW91c2VMZWF2ZSk7XG4gICAgICAgIChfZWxlbWVudHMkZmxvYXRpbmcyID0gZWxlbWVudHMuZmxvYXRpbmcpID09IG51bGwgfHwgX2VsZW1lbnRzJGZsb2F0aW5nMi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25TY3JvbGxNb3VzZUxlYXZlKTtcbiAgICAgICAgbW92ZSAmJiByZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZUVudGVyKTtcbiAgICAgICAgcmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBvbk1vdXNlRW50ZXIpO1xuICAgICAgICByZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uTW91c2VMZWF2ZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2VsZW1lbnRzLCBlbmFibGVkLCBjb250ZXh0LCBtb3VzZU9ubHksIHJlc3RNcywgbW92ZSwgY2xvc2VXaXRoRGVsYXksIGNsZWFudXBNb3VzZU1vdmVIYW5kbGVyLCBjbGVhclBvaW50ZXJFdmVudHMsIG9uT3BlbkNoYW5nZSwgb3Blbiwgb3BlblJlZiwgdHJlZSwgZGVsYXlSZWYsIGhhbmRsZUNsb3NlUmVmLCBkYXRhUmVmXSk7XG5cbiAgLy8gQmxvY2sgcG9pbnRlci1ldmVudHMgb2YgZXZlcnkgZWxlbWVudCBvdGhlciB0aGFuIHRoZSByZWZlcmVuY2UgYW5kIGZsb2F0aW5nXG4gIC8vIHdoaWxlIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzIG9wZW4gYW5kIGhhcyBhIGBoYW5kbGVDbG9zZWAgaGFuZGxlci4gQWxzb1xuICAvLyBoYW5kbGVzIG5lc3RlZCBmbG9hdGluZyBlbGVtZW50cy5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8xNzIyXG4gIGluZGV4KCgpID0+IHtcbiAgICB2YXIgX2hhbmRsZUNsb3NlUmVmJGN1cnJlO1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGlmIChvcGVuICYmIChfaGFuZGxlQ2xvc2VSZWYkY3VycmUgPSBoYW5kbGVDbG9zZVJlZi5jdXJyZW50KSAhPSBudWxsICYmIF9oYW5kbGVDbG9zZVJlZiRjdXJyZS5fX29wdGlvbnMuYmxvY2tQb2ludGVyRXZlbnRzICYmIGlzSG92ZXJPcGVuKCkpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBnZXREb2N1bWVudChlbGVtZW50cy5mbG9hdGluZykuYm9keTtcbiAgICAgIGJvZHkuc2V0QXR0cmlidXRlKHNhZmVQb2x5Z29uSWRlbnRpZmllciwgJycpO1xuICAgICAgYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgcGVyZm9ybWVkUG9pbnRlckV2ZW50c011dGF0aW9uUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgY29uc3QgZmxvYXRpbmdFbCA9IGVsZW1lbnRzLmZsb2F0aW5nO1xuICAgICAgaWYgKGlzRWxlbWVudChlbGVtZW50cy5kb21SZWZlcmVuY2UpICYmIGZsb2F0aW5nRWwpIHtcbiAgICAgICAgdmFyIF90cmVlJG5vZGVzUmVmJGN1cnJlbjtcbiAgICAgICAgY29uc3QgcmVmID0gZWxlbWVudHMuZG9tUmVmZXJlbmNlO1xuICAgICAgICBjb25zdCBwYXJlbnRGbG9hdGluZyA9IHRyZWUgPT0gbnVsbCB8fCAoX3RyZWUkbm9kZXNSZWYkY3VycmVuID0gdHJlZS5ub2Rlc1JlZi5jdXJyZW50LmZpbmQobm9kZSA9PiBub2RlLmlkID09PSBwYXJlbnRJZCkpID09IG51bGwgfHwgKF90cmVlJG5vZGVzUmVmJGN1cnJlbiA9IF90cmVlJG5vZGVzUmVmJGN1cnJlbi5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX3RyZWUkbm9kZXNSZWYkY3VycmVuLmVsZW1lbnRzLmZsb2F0aW5nO1xuICAgICAgICBpZiAocGFyZW50RmxvYXRpbmcpIHtcbiAgICAgICAgICBwYXJlbnRGbG9hdGluZy5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmVmLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIGZsb2F0aW5nRWwuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICByZWYuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICAgIGZsb2F0aW5nRWwuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2VuYWJsZWQsIG9wZW4sIHBhcmVudElkLCBlbGVtZW50cywgdHJlZSwgaGFuZGxlQ2xvc2VSZWYsIGlzSG92ZXJPcGVuXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIW9wZW4pIHtcbiAgICAgIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlcigpO1xuICAgICAgY2xlYXJQb2ludGVyRXZlbnRzKCk7XG4gICAgfVxuICB9LCBbb3BlbiwgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIsIGNsZWFyUG9pbnRlckV2ZW50c10pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlcigpO1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICBjbGVhclRpbWVvdXQocmVzdFRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICBjbGVhclBvaW50ZXJFdmVudHMoKTtcbiAgICB9O1xuICB9LCBbZW5hYmxlZCwgZWxlbWVudHMuZG9tUmVmZXJlbmNlLCBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlciwgY2xlYXJQb2ludGVyRXZlbnRzXSk7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHNldFBvaW50ZXJSZWYoZXZlbnQpIHtcbiAgICAgIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPSBldmVudC5wb2ludGVyVHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uUG9pbnRlckRvd246IHNldFBvaW50ZXJSZWYsXG4gICAgICBvblBvaW50ZXJFbnRlcjogc2V0UG9pbnRlclJlZixcbiAgICAgIG9uTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBuYXRpdmVFdmVudFxuICAgICAgICB9ID0gZXZlbnQ7XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZSgpIHtcbiAgICAgICAgICBpZiAoIWJsb2NrTW91c2VNb3ZlUmVmLmN1cnJlbnQgJiYgIW9wZW5SZWYuY3VycmVudCkge1xuICAgICAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIG5hdGl2ZUV2ZW50LCAnaG92ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vdXNlT25seSAmJiAhaXNNb3VzZUxpa2VQb2ludGVyVHlwZShwb2ludGVyVHlwZVJlZi5jdXJyZW50KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BlbiB8fCByZXN0TXMgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlc3RUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICBpZiAocG9pbnRlclR5cGVSZWYuY3VycmVudCA9PT0gJ3RvdWNoJykge1xuICAgICAgICAgIGhhbmRsZU1vdXNlTW92ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3RUaW1lb3V0UmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dChoYW5kbGVNb3VzZU1vdmUsIHJlc3RNcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LCBbbW91c2VPbmx5LCBvbk9wZW5DaGFuZ2UsIG9wZW4sIG9wZW5SZWYsIHJlc3RNc10pO1xuICBjb25zdCBmbG9hdGluZyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICB9LFxuICAgIG9uTW91c2VMZWF2ZShldmVudCkge1xuICAgICAgY2xvc2VXaXRoRGVsYXkoZXZlbnQubmF0aXZlRXZlbnQsIGZhbHNlKTtcbiAgICB9XG4gIH0pLCBbY2xvc2VXaXRoRGVsYXldKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmdcbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlLCBmbG9hdGluZ10pO1xufVxuXG5jb25zdCBOT09QID0gKCkgPT4ge307XG5jb25zdCBGbG9hdGluZ0RlbGF5R3JvdXBDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBkZWxheTogMCxcbiAgaW5pdGlhbERlbGF5OiAwLFxuICB0aW1lb3V0TXM6IDAsXG4gIGN1cnJlbnRJZDogbnVsbCxcbiAgc2V0Q3VycmVudElkOiBOT09QLFxuICBzZXRTdGF0ZTogTk9PUCxcbiAgaXNJbnN0YW50UGhhc2U6IGZhbHNlXG59KTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogVXNlIHRoZSByZXR1cm4gdmFsdWUgb2YgYHVzZURlbGF5R3JvdXAoKWAgaW5zdGVhZC5cbiAqL1xuY29uc3QgdXNlRGVsYXlHcm91cENvbnRleHQgPSAoKSA9PiBSZWFjdC51c2VDb250ZXh0KEZsb2F0aW5nRGVsYXlHcm91cENvbnRleHQpO1xuLyoqXG4gKiBQcm92aWRlcyBjb250ZXh0IGZvciBhIGdyb3VwIG9mIGZsb2F0aW5nIGVsZW1lbnRzIHRoYXQgc2hvdWxkIHNoYXJlIGFcbiAqIGBkZWxheWAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdEZWxheUdyb3VwXG4gKi9cbmZ1bmN0aW9uIEZsb2F0aW5nRGVsYXlHcm91cChwcm9wcykge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgZGVsYXksXG4gICAgdGltZW91dE1zID0gMFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gUmVhY3QudXNlUmVkdWNlcigocHJldiwgbmV4dCkgPT4gKHtcbiAgICAuLi5wcmV2LFxuICAgIC4uLm5leHRcbiAgfSksIHtcbiAgICBkZWxheSxcbiAgICB0aW1lb3V0TXMsXG4gICAgaW5pdGlhbERlbGF5OiBkZWxheSxcbiAgICBjdXJyZW50SWQ6IG51bGwsXG4gICAgaXNJbnN0YW50UGhhc2U6IGZhbHNlXG4gIH0pO1xuICBjb25zdCBpbml0aWFsQ3VycmVudElkUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBzZXRDdXJyZW50SWQgPSBSZWFjdC51c2VDYWxsYmFjayhjdXJyZW50SWQgPT4ge1xuICAgIHNldFN0YXRlKHtcbiAgICAgIGN1cnJlbnRJZFxuICAgIH0pO1xuICB9LCBbXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoc3RhdGUuY3VycmVudElkKSB7XG4gICAgICBpZiAoaW5pdGlhbEN1cnJlbnRJZFJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIGluaXRpYWxDdXJyZW50SWRSZWYuY3VycmVudCA9IHN0YXRlLmN1cnJlbnRJZDtcbiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLmlzSW5zdGFudFBoYXNlKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBpc0luc3RhbnRQaGFzZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLmlzSW5zdGFudFBoYXNlKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBpc0luc3RhbnRQaGFzZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpbml0aWFsQ3VycmVudElkUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfSwgW3N0YXRlLmN1cnJlbnRJZCwgc3RhdGUuaXNJbnN0YW50UGhhc2VdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZsb2F0aW5nRGVsYXlHcm91cENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBzZXRTdGF0ZSxcbiAgICAgIHNldEN1cnJlbnRJZFxuICAgIH0pLCBbc3RhdGUsIHNldEN1cnJlbnRJZF0pXG4gIH0sIGNoaWxkcmVuKTtcbn1cbi8qKlxuICogRW5hYmxlcyBncm91cGluZyB3aGVuIGNhbGxlZCBpbnNpZGUgYSBjb21wb25lbnQgdGhhdCdzIGEgY2hpbGQgb2YgYVxuICogYEZsb2F0aW5nRGVsYXlHcm91cGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdEZWxheUdyb3VwXG4gKi9cbmZ1bmN0aW9uIHVzZURlbGF5R3JvdXAoY29udGV4dCwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBmbG9hdGluZ0lkXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgaWQ6IG9wdGlvbklkXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBpZCA9IG9wdGlvbklkICE9IG51bGwgPyBvcHRpb25JZCA6IGZsb2F0aW5nSWQ7XG4gIGNvbnN0IGdyb3VwQ29udGV4dCA9IHVzZURlbGF5R3JvdXBDb250ZXh0KCk7XG4gIGNvbnN0IHtcbiAgICBjdXJyZW50SWQsXG4gICAgc2V0Q3VycmVudElkLFxuICAgIGluaXRpYWxEZWxheSxcbiAgICBzZXRTdGF0ZSxcbiAgICB0aW1lb3V0TXNcbiAgfSA9IGdyb3VwQ29udGV4dDtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghY3VycmVudElkKSByZXR1cm47XG4gICAgc2V0U3RhdGUoe1xuICAgICAgZGVsYXk6IHtcbiAgICAgICAgb3BlbjogMSxcbiAgICAgICAgY2xvc2U6IGdldERlbGF5KGluaXRpYWxEZWxheSwgJ2Nsb3NlJylcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoY3VycmVudElkICE9PSBpZCkge1xuICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtpZCwgb25PcGVuQ2hhbmdlLCBzZXRTdGF0ZSwgY3VycmVudElkLCBpbml0aWFsRGVsYXldKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHVuc2V0KCkge1xuICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlKTtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgZGVsYXk6IGluaXRpYWxEZWxheSxcbiAgICAgICAgY3VycmVudElkOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFjdXJyZW50SWQpIHJldHVybjtcbiAgICBpZiAoIW9wZW4gJiYgY3VycmVudElkID09PSBpZCkge1xuICAgICAgaWYgKHRpbWVvdXRNcykge1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQodW5zZXQsIHRpbWVvdXRNcyk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdW5zZXQoKTtcbiAgICB9XG4gIH0sIFtvcGVuLCBzZXRTdGF0ZSwgY3VycmVudElkLCBpZCwgb25PcGVuQ2hhbmdlLCBpbml0aWFsRGVsYXksIHRpbWVvdXRNc10pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKHNldEN1cnJlbnRJZCA9PT0gTk9PUCB8fCAhb3BlbikgcmV0dXJuO1xuICAgIHNldEN1cnJlbnRJZChpZCk7XG4gIH0sIFtvcGVuLCBzZXRDdXJyZW50SWQsIGlkXSk7XG4gIHJldHVybiBncm91cENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIGdldEFuY2VzdG9ycyhub2RlcywgaWQpIHtcbiAgdmFyIF9ub2RlcyRmaW5kO1xuICBsZXQgYWxsQW5jZXN0b3JzID0gW107XG4gIGxldCBjdXJyZW50UGFyZW50SWQgPSAoX25vZGVzJGZpbmQgPSBub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gaWQpKSA9PSBudWxsID8gdm9pZCAwIDogX25vZGVzJGZpbmQucGFyZW50SWQ7XG4gIHdoaWxlIChjdXJyZW50UGFyZW50SWQpIHtcbiAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzLmZpbmQobm9kZSA9PiBub2RlLmlkID09PSBjdXJyZW50UGFyZW50SWQpO1xuICAgIGN1cnJlbnRQYXJlbnRJZCA9IGN1cnJlbnROb2RlID09IG51bGwgPyB2b2lkIDAgOiBjdXJyZW50Tm9kZS5wYXJlbnRJZDtcbiAgICBpZiAoY3VycmVudE5vZGUpIHtcbiAgICAgIGFsbEFuY2VzdG9ycyA9IGFsbEFuY2VzdG9ycy5jb25jYXQoY3VycmVudE5vZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYWxsQW5jZXN0b3JzO1xufVxuXG5mdW5jdGlvbiBnZXRDaGlsZHJlbihub2RlcywgaWQpIHtcbiAgbGV0IGFsbENoaWxkcmVuID0gbm9kZXMuZmlsdGVyKG5vZGUgPT4ge1xuICAgIHZhciBfbm9kZSRjb250ZXh0O1xuICAgIHJldHVybiBub2RlLnBhcmVudElkID09PSBpZCAmJiAoKF9ub2RlJGNvbnRleHQgPSBub2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRjb250ZXh0Lm9wZW4pO1xuICB9KTtcbiAgbGV0IGN1cnJlbnRDaGlsZHJlbiA9IGFsbENoaWxkcmVuO1xuICB3aGlsZSAoY3VycmVudENoaWxkcmVuLmxlbmd0aCkge1xuICAgIGN1cnJlbnRDaGlsZHJlbiA9IG5vZGVzLmZpbHRlcihub2RlID0+IHtcbiAgICAgIHZhciBfY3VycmVudENoaWxkcmVuO1xuICAgICAgcmV0dXJuIChfY3VycmVudENoaWxkcmVuID0gY3VycmVudENoaWxkcmVuKSA9PSBudWxsID8gdm9pZCAwIDogX2N1cnJlbnRDaGlsZHJlbi5zb21lKG4gPT4ge1xuICAgICAgICB2YXIgX25vZGUkY29udGV4dDI7XG4gICAgICAgIHJldHVybiBub2RlLnBhcmVudElkID09PSBuLmlkICYmICgoX25vZGUkY29udGV4dDIgPSBub2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRjb250ZXh0Mi5vcGVuKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGFsbENoaWxkcmVuID0gYWxsQ2hpbGRyZW4uY29uY2F0KGN1cnJlbnRDaGlsZHJlbik7XG4gIH1cbiAgcmV0dXJuIGFsbENoaWxkcmVuO1xufVxuZnVuY3Rpb24gZ2V0RGVlcGVzdE5vZGUobm9kZXMsIGlkKSB7XG4gIGxldCBkZWVwZXN0Tm9kZUlkO1xuICBsZXQgbWF4RGVwdGggPSAtMTtcbiAgZnVuY3Rpb24gZmluZERlZXBlc3Qobm9kZUlkLCBkZXB0aCkge1xuICAgIGlmIChkZXB0aCA+IG1heERlcHRoKSB7XG4gICAgICBkZWVwZXN0Tm9kZUlkID0gbm9kZUlkO1xuICAgICAgbWF4RGVwdGggPSBkZXB0aDtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihub2Rlcywgbm9kZUlkKTtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGZpbmREZWVwZXN0KGNoaWxkLmlkLCBkZXB0aCArIDEpO1xuICAgIH0pO1xuICB9XG4gIGZpbmREZWVwZXN0KGlkLCAwKTtcbiAgcmV0dXJuIG5vZGVzLmZpbmQobm9kZSA9PiBub2RlLmlkID09PSBkZWVwZXN0Tm9kZUlkKTtcbn1cblxuLy8gTW9kaWZpZWQgdG8gYWRkIGNvbmRpdGlvbmFsIGBhcmlhLWhpZGRlbmAgc3VwcG9ydDpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVLYXNoZXkvYXJpYS1oaWRkZW4vYmxvYi85MjIwYzhmNGE0ZmQzNWY2M2JlZTU1MTBhOWY0MWEzNzI2NDM4MmQ0L3NyYy9pbmRleC50c1xubGV0IGNvdW50ZXJNYXAgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbmxldCB1bmNvbnRyb2xsZWRFbGVtZW50c1NldCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xubGV0IG1hcmtlck1hcCA9IHt9O1xubGV0IGxvY2tDb3VudCA9IDA7XG5jb25zdCBzdXBwb3J0c0luZXJ0ID0gKCkgPT4gdHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiAnaW5lcnQnIGluIEhUTUxFbGVtZW50LnByb3RvdHlwZTtcbmNvbnN0IHVud3JhcEhvc3QgPSBub2RlID0+IG5vZGUgJiYgKG5vZGUuaG9zdCB8fCB1bndyYXBIb3N0KG5vZGUucGFyZW50Tm9kZSkpO1xuY29uc3QgY29ycmVjdEVsZW1lbnRzID0gKHBhcmVudCwgdGFyZ2V0cykgPT4gdGFyZ2V0cy5tYXAodGFyZ2V0ID0+IHtcbiAgaWYgKHBhcmVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBjb25zdCBjb3JyZWN0ZWRUYXJnZXQgPSB1bndyYXBIb3N0KHRhcmdldCk7XG4gIGlmIChwYXJlbnQuY29udGFpbnMoY29ycmVjdGVkVGFyZ2V0KSkge1xuICAgIHJldHVybiBjb3JyZWN0ZWRUYXJnZXQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59KS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpO1xuZnVuY3Rpb24gYXBwbHlBdHRyaWJ1dGVUb090aGVycyh1bmNvcnJlY3RlZEF2b2lkRWxlbWVudHMsIGJvZHksIGFyaWFIaWRkZW4sIGluZXJ0KSB7XG4gIGNvbnN0IG1hcmtlck5hbWUgPSAnZGF0YS1mbG9hdGluZy11aS1pbmVydCc7XG4gIGNvbnN0IGNvbnRyb2xBdHRyaWJ1dGUgPSBpbmVydCA/ICdpbmVydCcgOiBhcmlhSGlkZGVuID8gJ2FyaWEtaGlkZGVuJyA6IG51bGw7XG4gIGNvbnN0IGF2b2lkRWxlbWVudHMgPSBjb3JyZWN0RWxlbWVudHMoYm9keSwgdW5jb3JyZWN0ZWRBdm9pZEVsZW1lbnRzKTtcbiAgY29uc3QgZWxlbWVudHNUb0tlZXAgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGVsZW1lbnRzVG9TdG9wID0gbmV3IFNldChhdm9pZEVsZW1lbnRzKTtcbiAgY29uc3QgaGlkZGVuRWxlbWVudHMgPSBbXTtcbiAgaWYgKCFtYXJrZXJNYXBbbWFya2VyTmFtZV0pIHtcbiAgICBtYXJrZXJNYXBbbWFya2VyTmFtZV0gPSBuZXcgV2Vha01hcCgpO1xuICB9XG4gIGNvbnN0IG1hcmtlckNvdW50ZXIgPSBtYXJrZXJNYXBbbWFya2VyTmFtZV07XG4gIGF2b2lkRWxlbWVudHMuZm9yRWFjaChrZWVwKTtcbiAgZGVlcChib2R5KTtcbiAgZWxlbWVudHNUb0tlZXAuY2xlYXIoKTtcbiAgZnVuY3Rpb24ga2VlcChlbCkge1xuICAgIGlmICghZWwgfHwgZWxlbWVudHNUb0tlZXAuaGFzKGVsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbGVtZW50c1RvS2VlcC5hZGQoZWwpO1xuICAgIGVsLnBhcmVudE5vZGUgJiYga2VlcChlbC5wYXJlbnROb2RlKTtcbiAgfVxuICBmdW5jdGlvbiBkZWVwKHBhcmVudCkge1xuICAgIGlmICghcGFyZW50IHx8IGVsZW1lbnRzVG9TdG9wLmhhcyhwYXJlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFtdLmZvckVhY2guY2FsbChwYXJlbnQuY2hpbGRyZW4sIG5vZGUgPT4ge1xuICAgICAgaWYgKGdldE5vZGVOYW1lKG5vZGUpID09PSAnc2NyaXB0JykgcmV0dXJuO1xuICAgICAgaWYgKGVsZW1lbnRzVG9LZWVwLmhhcyhub2RlKSkge1xuICAgICAgICBkZWVwKG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYXR0ciA9IGNvbnRyb2xBdHRyaWJ1dGUgPyBub2RlLmdldEF0dHJpYnV0ZShjb250cm9sQXR0cmlidXRlKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IGFscmVhZHlIaWRkZW4gPSBhdHRyICE9PSBudWxsICYmIGF0dHIgIT09ICdmYWxzZSc7XG4gICAgICAgIGNvbnN0IGNvdW50ZXJWYWx1ZSA9IChjb3VudGVyTWFwLmdldChub2RlKSB8fCAwKSArIDE7XG4gICAgICAgIGNvbnN0IG1hcmtlclZhbHVlID0gKG1hcmtlckNvdW50ZXIuZ2V0KG5vZGUpIHx8IDApICsgMTtcbiAgICAgICAgY291bnRlck1hcC5zZXQobm9kZSwgY291bnRlclZhbHVlKTtcbiAgICAgICAgbWFya2VyQ291bnRlci5zZXQobm9kZSwgbWFya2VyVmFsdWUpO1xuICAgICAgICBoaWRkZW5FbGVtZW50cy5wdXNoKG5vZGUpO1xuICAgICAgICBpZiAoY291bnRlclZhbHVlID09PSAxICYmIGFscmVhZHlIaWRkZW4pIHtcbiAgICAgICAgICB1bmNvbnRyb2xsZWRFbGVtZW50c1NldC5hZGQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcmtlclZhbHVlID09PSAxKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobWFya2VyTmFtZSwgJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWxyZWFkeUhpZGRlbiAmJiBjb250cm9sQXR0cmlidXRlKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSwgJ3RydWUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGxvY2tDb3VudCsrO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGhpZGRlbkVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBjb25zdCBjb3VudGVyVmFsdWUgPSAoY291bnRlck1hcC5nZXQoZWxlbWVudCkgfHwgMCkgLSAxO1xuICAgICAgY29uc3QgbWFya2VyVmFsdWUgPSAobWFya2VyQ291bnRlci5nZXQoZWxlbWVudCkgfHwgMCkgLSAxO1xuICAgICAgY291bnRlck1hcC5zZXQoZWxlbWVudCwgY291bnRlclZhbHVlKTtcbiAgICAgIG1hcmtlckNvdW50ZXIuc2V0KGVsZW1lbnQsIG1hcmtlclZhbHVlKTtcbiAgICAgIGlmICghY291bnRlclZhbHVlKSB7XG4gICAgICAgIGlmICghdW5jb250cm9sbGVkRWxlbWVudHNTZXQuaGFzKGVsZW1lbnQpICYmIGNvbnRyb2xBdHRyaWJ1dGUpIHtcbiAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShjb250cm9sQXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgICAgICB1bmNvbnRyb2xsZWRFbGVtZW50c1NldC5kZWxldGUoZWxlbWVudCk7XG4gICAgICB9XG4gICAgICBpZiAoIW1hcmtlclZhbHVlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG1hcmtlck5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxvY2tDb3VudC0tO1xuICAgIGlmICghbG9ja0NvdW50KSB7XG4gICAgICBjb3VudGVyTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNvdW50ZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgdW5jb250cm9sbGVkRWxlbWVudHNTZXQgPSBuZXcgV2Vha1NldCgpO1xuICAgICAgbWFya2VyTWFwID0ge307XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gbWFya090aGVycyhhdm9pZEVsZW1lbnRzLCBhcmlhSGlkZGVuLCBpbmVydCkge1xuICBpZiAoYXJpYUhpZGRlbiA9PT0gdm9pZCAwKSB7XG4gICAgYXJpYUhpZGRlbiA9IGZhbHNlO1xuICB9XG4gIGlmIChpbmVydCA9PT0gdm9pZCAwKSB7XG4gICAgaW5lcnQgPSBmYWxzZTtcbiAgfVxuICBjb25zdCBib2R5ID0gZ2V0RG9jdW1lbnQoYXZvaWRFbGVtZW50c1swXSkuYm9keTtcbiAgcmV0dXJuIGFwcGx5QXR0cmlidXRlVG9PdGhlcnMoYXZvaWRFbGVtZW50cy5jb25jYXQoQXJyYXkuZnJvbShib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ1thcmlhLWxpdmVdJykpKSwgYm9keSwgYXJpYUhpZGRlbiwgaW5lcnQpO1xufVxuXG5jb25zdCBnZXRUYWJiYWJsZU9wdGlvbnMgPSAoKSA9PiAoe1xuICBnZXRTaGFkb3dSb290OiB0cnVlLFxuICBkaXNwbGF5Q2hlY2s6XG4gIC8vIEpTRE9NIGRvZXMgbm90IHN1cHBvcnQgdGhlIGB0YWJiYWJsZWAgbGlicmFyeS4gVG8gc29sdmUgdGhpcyB3ZSBjYW5cbiAgLy8gY2hlY2sgaWYgYFJlc2l6ZU9ic2VydmVyYCBpcyBhIHJlYWwgZnVuY3Rpb24gKG5vdCBwb2x5ZmlsbGVkKSwgd2hpY2hcbiAgLy8gZGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBKU0RPTS1saWtlLlxuICB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicgJiYgUmVzaXplT2JzZXJ2ZXIudG9TdHJpbmcoKS5pbmNsdWRlcygnW25hdGl2ZSBjb2RlXScpID8gJ2Z1bGwnIDogJ25vbmUnXG59KTtcbmZ1bmN0aW9uIGdldFRhYmJhYmxlSW4oY29udGFpbmVyLCBkaXJlY3Rpb24pIHtcbiAgY29uc3QgYWxsVGFiYmFibGUgPSB0YWJiYWJsZShjb250YWluZXIsIGdldFRhYmJhYmxlT3B0aW9ucygpKTtcbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ3ByZXYnKSB7XG4gICAgYWxsVGFiYmFibGUucmV2ZXJzZSgpO1xuICB9XG4gIGNvbnN0IGFjdGl2ZUluZGV4ID0gYWxsVGFiYmFibGUuaW5kZXhPZihhY3RpdmVFbGVtZW50KGdldERvY3VtZW50KGNvbnRhaW5lcikpKTtcbiAgY29uc3QgbmV4dFRhYmJhYmxlRWxlbWVudHMgPSBhbGxUYWJiYWJsZS5zbGljZShhY3RpdmVJbmRleCArIDEpO1xuICByZXR1cm4gbmV4dFRhYmJhYmxlRWxlbWVudHNbMF07XG59XG5mdW5jdGlvbiBnZXROZXh0VGFiYmFibGUoKSB7XG4gIHJldHVybiBnZXRUYWJiYWJsZUluKGRvY3VtZW50LmJvZHksICduZXh0Jyk7XG59XG5mdW5jdGlvbiBnZXRQcmV2aW91c1RhYmJhYmxlKCkge1xuICByZXR1cm4gZ2V0VGFiYmFibGVJbihkb2N1bWVudC5ib2R5LCAncHJldicpO1xufVxuZnVuY3Rpb24gaXNPdXRzaWRlRXZlbnQoZXZlbnQsIGNvbnRhaW5lcikge1xuICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyIHx8IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICByZXR1cm4gIXJlbGF0ZWRUYXJnZXQgfHwgIWNvbnRhaW5zKGNvbnRhaW5lckVsZW1lbnQsIHJlbGF0ZWRUYXJnZXQpO1xufVxuZnVuY3Rpb24gZGlzYWJsZUZvY3VzSW5zaWRlKGNvbnRhaW5lcikge1xuICBjb25zdCB0YWJiYWJsZUVsZW1lbnRzID0gdGFiYmFibGUoY29udGFpbmVyLCBnZXRUYWJiYWJsZU9wdGlvbnMoKSk7XG4gIHRhYmJhYmxlRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBlbGVtZW50LmRhdGFzZXQudGFiaW5kZXggPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSB8fCAnJztcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBlbmFibGVGb2N1c0luc2lkZShjb250YWluZXIpIHtcbiAgY29uc3QgZWxlbWVudHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdGFiaW5kZXhdJyk7XG4gIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgdGFiaW5kZXggPSBlbGVtZW50LmRhdGFzZXQudGFiaW5kZXg7XG4gICAgZGVsZXRlIGVsZW1lbnQuZGF0YXNldC50YWJpbmRleDtcbiAgICBpZiAodGFiaW5kZXgpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIHRhYmluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldENsb3Nlc3RUYWJiYWJsZUVsZW1lbnQodGFiYmFibGVFbGVtZW50cywgZWxlbWVudCwgZmxvYXRpbmcpIHtcbiAgY29uc3QgZWxlbWVudEluZGV4ID0gdGFiYmFibGVFbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICBmdW5jdGlvbiB0cmF2ZXJzZVRhYmJhYmxlRWxlbWVudHMobmV4dCkge1xuICAgIGNvbnN0IGF0dHIgPSBjcmVhdGVBdHRyaWJ1dGUoJ2ZvY3VzLWd1YXJkJyk7XG4gICAgbGV0IGluZGV4ID0gZWxlbWVudEluZGV4ICsgKG5leHQgPyAxIDogMCk7XG4gICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gdGFiYmFibGVFbGVtZW50c1tpbmRleF07XG4gICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmICghY3VycmVudEVsZW1lbnQuaXNDb25uZWN0ZWQgfHwgY3VycmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHIpIHx8IGNvbnRhaW5zKGZsb2F0aW5nLCBjdXJyZW50RWxlbWVudCkpKSB7XG4gICAgICBpZiAobmV4dCkge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRFbGVtZW50ID0gdGFiYmFibGVFbGVtZW50c1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIEZpcnN0LCB0cnkgdG8gZmluZCB0aGUgbmV4dCB0YWJiYWJsZSBlbGVtZW50XG4gIGNvbnN0IG5leHQgPSB0cmF2ZXJzZVRhYmJhYmxlRWxlbWVudHModHJ1ZSk7XG4gIGlmIChuZXh0KSB7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICAvLyBJZiB3ZSBjYW4ndCBmaW5kIGEgbmV4dCB0YWJiYWJsZSBlbGVtZW50LCB0cnkgdG8gZmluZCB0aGUgcHJldmlvdXMgb25lXG4gIHJldHVybiB0cmF2ZXJzZVRhYmJhYmxlRWxlbWVudHMoZmFsc2UpO1xufVxuXG4vLyBTZWUgRGllZ28gSGF6J3MgU2FuZGJveCBmb3IgbWFraW5nIHRoaXMgbG9naWMgd29yayB3ZWxsIG9uIFNhZmFyaS9pT1M6XG4vLyBodHRwczovL2NvZGVzYW5kYm94LmlvL3MvdGFiYmFibGUtcG9ydGFsLWY0dG5nP2ZpbGU9L3NyYy9Gb2N1c1RyYXAudHN4XG5cbmNvbnN0IEhJRERFTl9TVFlMRVMgPSB7XG4gIGJvcmRlcjogMCxcbiAgY2xpcDogJ3JlY3QoMCAwIDAgMCknLFxuICBoZWlnaHQ6ICcxcHgnLFxuICBtYXJnaW46ICctMXB4JyxcbiAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICBwYWRkaW5nOiAwLFxuICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gIHdpZHRoOiAnMXB4JyxcbiAgdG9wOiAwLFxuICBsZWZ0OiAwXG59O1xubGV0IHRpbWVvdXRJZDtcbmZ1bmN0aW9uIHNldEFjdGl2ZUVsZW1lbnRPblRhYihldmVudCkge1xuICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgIGV2ZW50LnRhcmdldDtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgfVxufVxuY29uc3QgRm9jdXNHdWFyZCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZvY3VzR3VhcmQocHJvcHMsIHJlZikge1xuICBjb25zdCBbcm9sZSwgc2V0Um9sZV0gPSBSZWFjdC51c2VTdGF0ZSgpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGlzU2FmYXJpKCkpIHtcbiAgICAgIC8vIFVubGlrZSBvdGhlciBzY3JlZW4gcmVhZGVycyBzdWNoIGFzIE5WREEgYW5kIEpBV1MsIHRoZSB2aXJ0dWFsIGN1cnNvclxuICAgICAgLy8gb24gVm9pY2VPdmVyIGRvZXMgdHJpZ2dlciB0aGUgb25Gb2N1cyBldmVudCwgc28gd2UgY2FuIHVzZSB0aGUgZm9jdXNcbiAgICAgIC8vIHRyYXAgZWxlbWVudC4gT24gU2FmYXJpLCBvbmx5IGJ1dHRvbnMgdHJpZ2dlciB0aGUgb25Gb2N1cyBldmVudC5cbiAgICAgIC8vIE5COiBcImdyb3VwXCIgcm9sZSBpbiB0aGUgU2FuZGJveCBubyBsb25nZXIgYXBwZWFycyB0byB3b3JrLCBtdXN0IGJlIGFcbiAgICAgIC8vIGJ1dHRvbiByb2xlLlxuICAgICAgc2V0Um9sZSgnYnV0dG9uJyk7XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBzZXRBY3RpdmVFbGVtZW50T25UYWIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgc2V0QWN0aXZlRWxlbWVudE9uVGFiKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGNvbnN0IHJlc3RQcm9wcyA9IHtcbiAgICByZWYsXG4gICAgdGFiSW5kZXg6IDAsXG4gICAgLy8gUm9sZSBpcyBvbmx5IGZvciBWb2ljZU92ZXJcbiAgICByb2xlLFxuICAgICdhcmlhLWhpZGRlbic6IHJvbGUgPyB1bmRlZmluZWQgOiB0cnVlLFxuICAgIFtjcmVhdGVBdHRyaWJ1dGUoJ2ZvY3VzLWd1YXJkJyldOiAnJyxcbiAgICBzdHlsZTogSElEREVOX1NUWUxFU1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIF9leHRlbmRzKHt9LCBwcm9wcywgcmVzdFByb3BzKSk7XG59KTtcblxuY29uc3QgUG9ydGFsQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuY29uc3QgYXR0ciA9IC8qI19fUFVSRV9fKi9jcmVhdGVBdHRyaWJ1dGUoJ3BvcnRhbCcpO1xuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdQb3J0YWwjdXNlZmxvYXRpbmdwb3J0YWxub2RlXG4gKi9cbmZ1bmN0aW9uIHVzZUZsb2F0aW5nUG9ydGFsTm9kZShwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIGlkLFxuICAgIHJvb3RcbiAgfSA9IHByb3BzO1xuICBjb25zdCB1bmlxdWVJZCA9IHVzZUlkKCk7XG4gIGNvbnN0IHBvcnRhbENvbnRleHQgPSB1c2VQb3J0YWxDb250ZXh0KCk7XG4gIGNvbnN0IFtwb3J0YWxOb2RlLCBzZXRQb3J0YWxOb2RlXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBwb3J0YWxOb2RlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHBvcnRhbE5vZGUgPT0gbnVsbCB8fCBwb3J0YWxOb2RlLnJlbW92ZSgpO1xuICAgICAgLy8gQWxsb3cgdGhlIHN1YnNlcXVlbnQgbGF5b3V0IGVmZmVjdHMgdG8gY3JlYXRlIGEgbmV3IG5vZGUgb24gdXBkYXRlcy5cbiAgICAgIC8vIFRoZSBwb3J0YWwgbm9kZSB3aWxsIHN0aWxsIGJlIGNsZWFuZWQgdXAgb24gdW5tb3VudC5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMjQ1NFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBwb3J0YWxOb2RlUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSwgW3BvcnRhbE5vZGVdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIC8vIFdhaXQgZm9yIHRoZSB1bmlxdWVJZCB0byBiZSBnZW5lcmF0ZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBwb3J0YWwgbm9kZSBpblxuICAgIC8vIFJlYWN0IDwxOCAodXNpbmcgYHVzZUZsb2F0aW5nSWRgIGluc3RlYWQgb2YgdGhlIG5hdGl2ZSBgdXNlSWRgKS5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzI3NzhcbiAgICBpZiAoIXVuaXF1ZUlkKSByZXR1cm47XG4gICAgaWYgKHBvcnRhbE5vZGVSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGV4aXN0aW5nSWRSb290ID0gaWQgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkgOiBudWxsO1xuICAgIGlmICghZXhpc3RpbmdJZFJvb3QpIHJldHVybjtcbiAgICBjb25zdCBzdWJSb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgc3ViUm9vdC5pZCA9IHVuaXF1ZUlkO1xuICAgIHN1YlJvb3Quc2V0QXR0cmlidXRlKGF0dHIsICcnKTtcbiAgICBleGlzdGluZ0lkUm9vdC5hcHBlbmRDaGlsZChzdWJSb290KTtcbiAgICBwb3J0YWxOb2RlUmVmLmN1cnJlbnQgPSBzdWJSb290O1xuICAgIHNldFBvcnRhbE5vZGUoc3ViUm9vdCk7XG4gIH0sIFtpZCwgdW5pcXVlSWRdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghdW5pcXVlSWQpIHJldHVybjtcbiAgICBpZiAocG9ydGFsTm9kZVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgbGV0IGNvbnRhaW5lciA9IHJvb3QgfHwgKHBvcnRhbENvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IHBvcnRhbENvbnRleHQucG9ydGFsTm9kZSk7XG4gICAgaWYgKGNvbnRhaW5lciAmJiAhaXNFbGVtZW50KGNvbnRhaW5lcikpIGNvbnRhaW5lciA9IGNvbnRhaW5lci5jdXJyZW50O1xuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCBkb2N1bWVudC5ib2R5O1xuICAgIGxldCBpZFdyYXBwZXIgPSBudWxsO1xuICAgIGlmIChpZCkge1xuICAgICAgaWRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBpZFdyYXBwZXIuaWQgPSBpZDtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZFdyYXBwZXIpO1xuICAgIH1cbiAgICBjb25zdCBzdWJSb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgc3ViUm9vdC5pZCA9IHVuaXF1ZUlkO1xuICAgIHN1YlJvb3Quc2V0QXR0cmlidXRlKGF0dHIsICcnKTtcbiAgICBjb250YWluZXIgPSBpZFdyYXBwZXIgfHwgY29udGFpbmVyO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzdWJSb290KTtcbiAgICBwb3J0YWxOb2RlUmVmLmN1cnJlbnQgPSBzdWJSb290O1xuICAgIHNldFBvcnRhbE5vZGUoc3ViUm9vdCk7XG4gIH0sIFtpZCwgcm9vdCwgdW5pcXVlSWQsIHBvcnRhbENvbnRleHRdKTtcbiAgcmV0dXJuIHBvcnRhbE5vZGU7XG59XG4vKipcbiAqIFBvcnRhbHMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaW50byBhIGdpdmVuIGNvbnRhaW5lciBlbGVtZW50IOKAlCBieSBkZWZhdWx0LFxuICogb3V0c2lkZSBvZiB0aGUgYXBwIHJvb3QgYW5kIGludG8gdGhlIGJvZHkuXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgY2FuIGFwcGVhciBvdXRzaWRlIGFueVxuICogcG90ZW50aWFsIHBhcmVudCBjb250YWluZXJzIHRoYXQgY2F1c2UgY2xpcHBpbmcgKHN1Y2ggYXMgYG92ZXJmbG93OiBoaWRkZW5gKSxcbiAqIHdoaWxlIHJldGFpbmluZyBpdHMgbG9jYXRpb24gaW4gdGhlIFJlYWN0IHRyZWUuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdQb3J0YWxcbiAqL1xuZnVuY3Rpb24gRmxvYXRpbmdQb3J0YWwocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGlkLFxuICAgIHJvb3QgPSBudWxsLFxuICAgIHByZXNlcnZlVGFiT3JkZXIgPSB0cnVlXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgcG9ydGFsTm9kZSA9IHVzZUZsb2F0aW5nUG9ydGFsTm9kZSh7XG4gICAgaWQsXG4gICAgcm9vdFxuICB9KTtcbiAgY29uc3QgW2ZvY3VzTWFuYWdlclN0YXRlLCBzZXRGb2N1c01hbmFnZXJTdGF0ZV0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgYmVmb3JlT3V0c2lkZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgYWZ0ZXJPdXRzaWRlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBiZWZvcmVJbnNpZGVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGFmdGVySW5zaWRlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBzaG91bGRSZW5kZXJHdWFyZHMgPVxuICAvLyBUaGUgRm9jdXNNYW5hZ2VyIGFuZCB0aGVyZWZvcmUgZmxvYXRpbmcgZWxlbWVudCBhcmUgY3VycmVudGx5IG9wZW4vXG4gIC8vIHJlbmRlcmVkLlxuICAhIWZvY3VzTWFuYWdlclN0YXRlICYmXG4gIC8vIEd1YXJkcyBhcmUgb25seSBmb3Igbm9uLW1vZGFsIGZvY3VzIG1hbmFnZW1lbnQuXG4gICFmb2N1c01hbmFnZXJTdGF0ZS5tb2RhbCAmJlxuICAvLyBEb24ndCByZW5kZXIgaWYgdW5tb3VudCBpcyB0cmFuc2l0aW9uaW5nLlxuICBmb2N1c01hbmFnZXJTdGF0ZS5vcGVuICYmIHByZXNlcnZlVGFiT3JkZXIgJiYgISEocm9vdCB8fCBwb3J0YWxOb2RlKTtcblxuICAvLyBodHRwczovL2NvZGVzYW5kYm94LmlvL3MvdGFiYmFibGUtcG9ydGFsLWY0dG5nP2ZpbGU9L3NyYy9UYWJiYWJsZVBvcnRhbC50c3hcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXBvcnRhbE5vZGUgfHwgIXByZXNlcnZlVGFiT3JkZXIgfHwgZm9jdXNNYW5hZ2VyU3RhdGUgIT0gbnVsbCAmJiBmb2N1c01hbmFnZXJTdGF0ZS5tb2RhbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3VyZSBlbGVtZW50cyBpbnNpZGUgdGhlIHBvcnRhbCBlbGVtZW50IGFyZSB0YWJiYWJsZSBvbmx5IHdoZW4gdGhlXG4gICAgLy8gcG9ydGFsIGhhcyBhbHJlYWR5IGJlZW4gZm9jdXNlZCwgZWl0aGVyIGJ5IHRhYmJpbmcgaW50byBhIGZvY3VzIHRyYXBcbiAgICAvLyBlbGVtZW50IG91dHNpZGUgb3IgdXNpbmcgdGhlIG1vdXNlLlxuICAgIGZ1bmN0aW9uIG9uRm9jdXMoZXZlbnQpIHtcbiAgICAgIGlmIChwb3J0YWxOb2RlICYmIGlzT3V0c2lkZUV2ZW50KGV2ZW50KSkge1xuICAgICAgICBjb25zdCBmb2N1c2luZyA9IGV2ZW50LnR5cGUgPT09ICdmb2N1c2luJztcbiAgICAgICAgY29uc3QgbWFuYWdlRm9jdXMgPSBmb2N1c2luZyA/IGVuYWJsZUZvY3VzSW5zaWRlIDogZGlzYWJsZUZvY3VzSW5zaWRlO1xuICAgICAgICBtYW5hZ2VGb2N1cyhwb3J0YWxOb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTGlzdGVuIHRvIHRoZSBldmVudCBvbiB0aGUgY2FwdHVyZSBwaGFzZSBzbyB0aGV5IHJ1biBiZWZvcmUgdGhlIGZvY3VzXG4gICAgLy8gdHJhcCBlbGVtZW50cyBvbkZvY3VzIHByb3AgaXMgY2FsbGVkLlxuICAgIHBvcnRhbE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG9uRm9jdXMsIHRydWUpO1xuICAgIHBvcnRhbE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBvbkZvY3VzLCB0cnVlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcG9ydGFsTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c2luJywgb25Gb2N1cywgdHJ1ZSk7XG4gICAgICBwb3J0YWxOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25Gb2N1cywgdHJ1ZSk7XG4gICAgfTtcbiAgfSwgW3BvcnRhbE5vZGUsIHByZXNlcnZlVGFiT3JkZXIsIGZvY3VzTWFuYWdlclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBmb2N1c01hbmFnZXJTdGF0ZS5tb2RhbF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9ydGFsQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgICBwcmVzZXJ2ZVRhYk9yZGVyLFxuICAgICAgYmVmb3JlT3V0c2lkZVJlZixcbiAgICAgIGFmdGVyT3V0c2lkZVJlZixcbiAgICAgIGJlZm9yZUluc2lkZVJlZixcbiAgICAgIGFmdGVySW5zaWRlUmVmLFxuICAgICAgcG9ydGFsTm9kZSxcbiAgICAgIHNldEZvY3VzTWFuYWdlclN0YXRlXG4gICAgfSksIFtwcmVzZXJ2ZVRhYk9yZGVyLCBwb3J0YWxOb2RlXSlcbiAgfSwgc2hvdWxkUmVuZGVyR3VhcmRzICYmIHBvcnRhbE5vZGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9jdXNHdWFyZCwge1xuICAgIFwiZGF0YS10eXBlXCI6IFwib3V0c2lkZVwiLFxuICAgIHJlZjogYmVmb3JlT3V0c2lkZVJlZixcbiAgICBvbkZvY3VzOiBldmVudCA9PiB7XG4gICAgICBpZiAoaXNPdXRzaWRlRXZlbnQoZXZlbnQsIHBvcnRhbE5vZGUpKSB7XG4gICAgICAgIHZhciBfYmVmb3JlSW5zaWRlUmVmJGN1cnI7XG4gICAgICAgIChfYmVmb3JlSW5zaWRlUmVmJGN1cnIgPSBiZWZvcmVJbnNpZGVSZWYuY3VycmVudCkgPT0gbnVsbCB8fCBfYmVmb3JlSW5zaWRlUmVmJGN1cnIuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByZXZUYWJiYWJsZSA9IGdldFByZXZpb3VzVGFiYmFibGUoKSB8fCAoZm9jdXNNYW5hZ2VyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGZvY3VzTWFuYWdlclN0YXRlLnJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQpO1xuICAgICAgICBwcmV2VGFiYmFibGUgPT0gbnVsbCB8fCBwcmV2VGFiYmFibGUuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pLCBzaG91bGRSZW5kZXJHdWFyZHMgJiYgcG9ydGFsTm9kZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIFwiYXJpYS1vd25zXCI6IHBvcnRhbE5vZGUuaWQsXG4gICAgc3R5bGU6IEhJRERFTl9TVFlMRVNcbiAgfSksIHBvcnRhbE5vZGUgJiYgLyojX19QVVJFX18qL1JlYWN0RE9NLmNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgcG9ydGFsTm9kZSksIHNob3VsZFJlbmRlckd1YXJkcyAmJiBwb3J0YWxOb2RlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzR3VhcmQsIHtcbiAgICBcImRhdGEtdHlwZVwiOiBcIm91dHNpZGVcIixcbiAgICByZWY6IGFmdGVyT3V0c2lkZVJlZixcbiAgICBvbkZvY3VzOiBldmVudCA9PiB7XG4gICAgICBpZiAoaXNPdXRzaWRlRXZlbnQoZXZlbnQsIHBvcnRhbE5vZGUpKSB7XG4gICAgICAgIHZhciBfYWZ0ZXJJbnNpZGVSZWYkY3VycmU7XG4gICAgICAgIChfYWZ0ZXJJbnNpZGVSZWYkY3VycmUgPSBhZnRlckluc2lkZVJlZi5jdXJyZW50KSA9PSBudWxsIHx8IF9hZnRlckluc2lkZVJlZiRjdXJyZS5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dFRhYmJhYmxlID0gZ2V0TmV4dFRhYmJhYmxlKCkgfHwgKGZvY3VzTWFuYWdlclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBmb2N1c01hbmFnZXJTdGF0ZS5yZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KTtcbiAgICAgICAgbmV4dFRhYmJhYmxlID09IG51bGwgfHwgbmV4dFRhYmJhYmxlLmZvY3VzKCk7XG4gICAgICAgIChmb2N1c01hbmFnZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogZm9jdXNNYW5hZ2VyU3RhdGUuY2xvc2VPbkZvY3VzT3V0KSAmJiAoZm9jdXNNYW5hZ2VyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGZvY3VzTWFuYWdlclN0YXRlLm9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQubmF0aXZlRXZlbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pKTtcbn1cbmNvbnN0IHVzZVBvcnRhbENvbnRleHQgPSAoKSA9PiBSZWFjdC51c2VDb250ZXh0KFBvcnRhbENvbnRleHQpO1xuXG5jb25zdCBMSVNUX0xJTUlUID0gMjA7XG5sZXQgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50cyA9IFtdO1xuZnVuY3Rpb24gYWRkUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KGVsZW1lbnQpIHtcbiAgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50cyA9IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMuZmlsdGVyKGVsID0+IGVsLmlzQ29ubmVjdGVkKTtcbiAgbGV0IHRhYmJhYmxlRWwgPSBlbGVtZW50O1xuICBpZiAoIXRhYmJhYmxlRWwgfHwgZ2V0Tm9kZU5hbWUodGFiYmFibGVFbCkgPT09ICdib2R5JykgcmV0dXJuO1xuICBpZiAoIWlzVGFiYmFibGUodGFiYmFibGVFbCwgZ2V0VGFiYmFibGVPcHRpb25zKCkpKSB7XG4gICAgY29uc3QgdGFiYmFibGVDaGlsZCA9IHRhYmJhYmxlKHRhYmJhYmxlRWwsIGdldFRhYmJhYmxlT3B0aW9ucygpKVswXTtcbiAgICBpZiAodGFiYmFibGVDaGlsZCkge1xuICAgICAgdGFiYmFibGVFbCA9IHRhYmJhYmxlQ2hpbGQ7XG4gICAgfVxuICB9XG4gIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMucHVzaCh0YWJiYWJsZUVsKTtcbiAgaWYgKHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMubGVuZ3RoID4gTElTVF9MSU1JVCkge1xuICAgIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMgPSBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzLnNsaWNlKC1MSVNUX0xJTUlUKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0UHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCkge1xuICByZXR1cm4gcHJldmlvdXNseUZvY3VzZWRFbGVtZW50cy5zbGljZSgpLnJldmVyc2UoKS5maW5kKGVsID0+IGVsLmlzQ29ubmVjdGVkKTtcbn1cbmNvbnN0IFZpc3VhbGx5SGlkZGVuRGlzbWlzcyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIFZpc3VhbGx5SGlkZGVuRGlzbWlzcyhwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIHJlZjogcmVmLFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBzdHlsZTogSElEREVOX1NUWUxFU1xuICB9KSk7XG59KTtcbi8qKlxuICogUHJvdmlkZXMgZm9jdXMgbWFuYWdlbWVudCBmb3IgdGhlIGZsb2F0aW5nIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdGb2N1c01hbmFnZXJcbiAqL1xuZnVuY3Rpb24gRmxvYXRpbmdGb2N1c01hbmFnZXIocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGNvbnRleHQsXG4gICAgY2hpbGRyZW4sXG4gICAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgICBvcmRlciA9IFsnY29udGVudCddLFxuICAgIGd1YXJkczogX2d1YXJkcyA9IHRydWUsXG4gICAgaW5pdGlhbEZvY3VzID0gMCxcbiAgICByZXR1cm5Gb2N1cyA9IHRydWUsXG4gICAgcmVzdG9yZUZvY3VzID0gZmFsc2UsXG4gICAgbW9kYWwgPSB0cnVlLFxuICAgIHZpc3VhbGx5SGlkZGVuRGlzbWlzcyA9IGZhbHNlLFxuICAgIGNsb3NlT25Gb2N1c091dCA9IHRydWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICByZWZzLFxuICAgIG5vZGVJZCxcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZXZlbnRzLFxuICAgIGRhdGFSZWYsXG4gICAgZmxvYXRpbmdJZCxcbiAgICBlbGVtZW50czoge1xuICAgICAgZG9tUmVmZXJlbmNlLFxuICAgICAgZmxvYXRpbmdcbiAgICB9XG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCBpZ25vcmVJbml0aWFsRm9jdXMgPSB0eXBlb2YgaW5pdGlhbEZvY3VzID09PSAnbnVtYmVyJyAmJiBpbml0aWFsRm9jdXMgPCAwO1xuICAvLyBJZiB0aGUgcmVmZXJlbmNlIGlzIGEgY29tYm9ib3ggYW5kIGlzIHR5cGVhYmxlIChlLmcuIGlucHV0L3RleHRhcmVhKSxcbiAgLy8gdGhlcmUgYXJlIGRpZmZlcmVudCBmb2N1cyBzZW1hbnRpY3MuIFRoZSBndWFyZHMgc2hvdWxkIG5vdCBiZSByZW5kZXJlZCwgYnV0XG4gIC8vIGFyaWEtaGlkZGVuIHNob3VsZCBiZSBhcHBsaWVkIHRvIGFsbCBub2RlcyBzdGlsbC4gRnVydGhlciwgdGhlIHZpc3VhbGx5XG4gIC8vIGhpZGRlbiBkaXNtaXNzIGJ1dHRvbiBzaG91bGQgb25seSBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCwgbm90IHRoZVxuICAvLyBzdGFydC5cbiAgY29uc3QgaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94ID0gaXNUeXBlYWJsZUNvbWJvYm94KGRvbVJlZmVyZW5jZSkgJiYgaWdub3JlSW5pdGlhbEZvY3VzO1xuXG4gIC8vIEZvcmNlIHRoZSBndWFyZHMgdG8gYmUgcmVuZGVyZWQgaWYgdGhlIGBpbmVydGAgYXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQuXG4gIGNvbnN0IGd1YXJkcyA9IHN1cHBvcnRzSW5lcnQoKSA/IF9ndWFyZHMgOiB0cnVlO1xuICBjb25zdCBvcmRlclJlZiA9IHVzZUxhdGVzdFJlZihvcmRlcik7XG4gIGNvbnN0IGluaXRpYWxGb2N1c1JlZiA9IHVzZUxhdGVzdFJlZihpbml0aWFsRm9jdXMpO1xuICBjb25zdCByZXR1cm5Gb2N1c1JlZiA9IHVzZUxhdGVzdFJlZihyZXR1cm5Gb2N1cyk7XG4gIGNvbnN0IHRyZWUgPSB1c2VGbG9hdGluZ1RyZWUoKTtcbiAgY29uc3QgcG9ydGFsQ29udGV4dCA9IHVzZVBvcnRhbENvbnRleHQoKTtcbiAgY29uc3Qgc3RhcnREaXNtaXNzQnV0dG9uUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBlbmREaXNtaXNzQnV0dG9uUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBwcmV2ZW50UmV0dXJuRm9jdXNSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBpc1BvaW50ZXJEb3duUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgdGFiYmFibGVJbmRleFJlZiA9IFJlYWN0LnVzZVJlZigtMSk7XG4gIGNvbnN0IGlzSW5zaWRlUG9ydGFsID0gcG9ydGFsQ29udGV4dCAhPSBudWxsO1xuICBjb25zdCBmaXJzdEVsZW1lbnRDaGlsZCA9IGZsb2F0aW5nID09IG51bGwgPyB2b2lkIDAgOiBmbG9hdGluZy5maXJzdEVsZW1lbnRDaGlsZDtcbiAgLy8gSWYgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXMgYWN0aW5nIGFzIGEgcG9zaXRpb25pbmcgd3JhcHBlciByYXRoZXIgdGhhbiB0aGVcbiAgLy8gZWxlbWVudCB0aGF0IHJlY2VpdmVzIGFyaWEgcHJvcHMsIHVzZSBpdCBhcyB0aGUgZm9jdXMgcm9vdCBpbnN0ZWFkLlxuICBjb25zdCBmbG9hdGluZ0ZvY3VzTm9kZSA9IChmaXJzdEVsZW1lbnRDaGlsZCA9PSBudWxsID8gdm9pZCAwIDogZmlyc3RFbGVtZW50Q2hpbGQuaWQpID09PSBmbG9hdGluZ0lkID8gZmlyc3RFbGVtZW50Q2hpbGQgOiBmbG9hdGluZztcbiAgY29uc3QgZ2V0VGFiYmFibGVDb250ZW50ID0gdXNlRWZmZWN0RXZlbnQoZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIgPT09IHZvaWQgMCkge1xuICAgICAgY29udGFpbmVyID0gZmxvYXRpbmdGb2N1c05vZGU7XG4gICAgfVxuICAgIHJldHVybiBjb250YWluZXIgPyB0YWJiYWJsZShjb250YWluZXIsIGdldFRhYmJhYmxlT3B0aW9ucygpKSA6IFtdO1xuICB9KTtcbiAgY29uc3QgZ2V0VGFiYmFibGVFbGVtZW50cyA9IHVzZUVmZmVjdEV2ZW50KGNvbnRhaW5lciA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IGdldFRhYmJhYmxlQ29udGVudChjb250YWluZXIpO1xuICAgIHJldHVybiBvcmRlclJlZi5jdXJyZW50Lm1hcCh0eXBlID0+IHtcbiAgICAgIGlmIChkb21SZWZlcmVuY2UgJiYgdHlwZSA9PT0gJ3JlZmVyZW5jZScpIHtcbiAgICAgICAgcmV0dXJuIGRvbVJlZmVyZW5jZTtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZ0ZvY3VzTm9kZSAmJiB0eXBlID09PSAnZmxvYXRpbmcnKSB7XG4gICAgICAgIHJldHVybiBmbG9hdGluZ0ZvY3VzTm9kZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmZpbHRlcihCb29sZWFuKS5mbGF0KCk7XG4gIH0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgIGlmICghbW9kYWwpIHJldHVybjtcbiAgICBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XG4gICAgICAgIC8vIFRoZSBmb2N1cyBndWFyZHMgaGF2ZSBub3RoaW5nIHRvIGZvY3VzLCBzbyB3ZSBuZWVkIHRvIHN0b3AgdGhlIGV2ZW50LlxuICAgICAgICBpZiAoY29udGFpbnMoZmxvYXRpbmdGb2N1c05vZGUsIGFjdGl2ZUVsZW1lbnQoZ2V0RG9jdW1lbnQoZmxvYXRpbmdGb2N1c05vZGUpKSkgJiYgZ2V0VGFiYmFibGVDb250ZW50KCkubGVuZ3RoID09PSAwICYmICFpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3gpIHtcbiAgICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVscyA9IGdldFRhYmJhYmxlRWxlbWVudHMoKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgaWYgKG9yZGVyUmVmLmN1cnJlbnRbMF0gPT09ICdyZWZlcmVuY2UnICYmIHRhcmdldCA9PT0gZG9tUmVmZXJlbmNlKSB7XG4gICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgIGVucXVldWVGb2N1cyhlbHNbZWxzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW5xdWV1ZUZvY3VzKGVsc1sxXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcmRlclJlZi5jdXJyZW50WzFdID09PSAnZmxvYXRpbmcnICYmIHRhcmdldCA9PT0gZmxvYXRpbmdGb2N1c05vZGUgJiYgZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAgIGVucXVldWVGb2N1cyhlbHNbMF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRvYyA9IGdldERvY3VtZW50KGZsb2F0aW5nRm9jdXNOb2RlKTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93bik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duKTtcbiAgICB9O1xuICB9LCBbZGlzYWJsZWQsIGRvbVJlZmVyZW5jZSwgZmxvYXRpbmdGb2N1c05vZGUsIG1vZGFsLCBvcmRlclJlZiwgaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94LCBnZXRUYWJiYWJsZUNvbnRlbnQsIGdldFRhYmJhYmxlRWxlbWVudHNdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBpZiAoIWZsb2F0aW5nKSByZXR1cm47XG4gICAgZnVuY3Rpb24gaGFuZGxlRm9jdXNJbihldmVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2ZW50KTtcbiAgICAgIGNvbnN0IHRhYmJhYmxlQ29udGVudCA9IGdldFRhYmJhYmxlQ29udGVudCgpO1xuICAgICAgY29uc3QgdGFiYmFibGVJbmRleCA9IHRhYmJhYmxlQ29udGVudC5pbmRleE9mKHRhcmdldCk7XG4gICAgICBpZiAodGFiYmFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGFiYmFibGVJbmRleFJlZi5jdXJyZW50ID0gdGFiYmFibGVJbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgZmxvYXRpbmcuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGhhbmRsZUZvY3VzSW4pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBmbG9hdGluZy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c2luJywgaGFuZGxlRm9jdXNJbik7XG4gICAgfTtcbiAgfSwgW2Rpc2FibGVkLCBmbG9hdGluZywgZ2V0VGFiYmFibGVDb250ZW50XSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgaWYgKCFjbG9zZU9uRm9jdXNPdXQpIHJldHVybjtcblxuICAgIC8vIEluIFNhZmFyaSwgYnV0dG9ucyBsb3NlIGZvY3VzIHdoZW4gcHJlc3NpbmcgdGhlbS5cbiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyRG93bigpIHtcbiAgICAgIGlzUG9pbnRlckRvd25SZWYuY3VycmVudCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaXNQb2ludGVyRG93blJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlRm9jdXNPdXRzaWRlKGV2ZW50KSB7XG4gICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgY29uc3QgbW92ZWRUb1VucmVsYXRlZE5vZGUgPSAhKGNvbnRhaW5zKGRvbVJlZmVyZW5jZSwgcmVsYXRlZFRhcmdldCkgfHwgY29udGFpbnMoZmxvYXRpbmcsIHJlbGF0ZWRUYXJnZXQpIHx8IGNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQsIGZsb2F0aW5nKSB8fCBjb250YWlucyhwb3J0YWxDb250ZXh0ID09IG51bGwgPyB2b2lkIDAgOiBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUsIHJlbGF0ZWRUYXJnZXQpIHx8IHJlbGF0ZWRUYXJnZXQgIT0gbnVsbCAmJiByZWxhdGVkVGFyZ2V0Lmhhc0F0dHJpYnV0ZShjcmVhdGVBdHRyaWJ1dGUoJ2ZvY3VzLWd1YXJkJykpIHx8IHRyZWUgJiYgKGdldENoaWxkcmVuKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKS5maW5kKG5vZGUgPT4ge1xuICAgICAgICAgIHZhciBfbm9kZSRjb250ZXh0LCBfbm9kZSRjb250ZXh0MjtcbiAgICAgICAgICByZXR1cm4gY29udGFpbnMoKF9ub2RlJGNvbnRleHQgPSBub2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRjb250ZXh0LmVsZW1lbnRzLmZsb2F0aW5nLCByZWxhdGVkVGFyZ2V0KSB8fCBjb250YWlucygoX25vZGUkY29udGV4dDIgPSBub2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRjb250ZXh0Mi5lbGVtZW50cy5kb21SZWZlcmVuY2UsIHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgICB9KSB8fCBnZXRBbmNlc3RvcnModHJlZS5ub2Rlc1JlZi5jdXJyZW50LCBub2RlSWQpLmZpbmQobm9kZSA9PiB7XG4gICAgICAgICAgdmFyIF9ub2RlJGNvbnRleHQzLCBfbm9kZSRjb250ZXh0NDtcbiAgICAgICAgICByZXR1cm4gKChfbm9kZSRjb250ZXh0MyA9IG5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJGNvbnRleHQzLmVsZW1lbnRzLmZsb2F0aW5nKSA9PT0gcmVsYXRlZFRhcmdldCB8fCAoKF9ub2RlJGNvbnRleHQ0ID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dDQuZWxlbWVudHMuZG9tUmVmZXJlbmNlKSA9PT0gcmVsYXRlZFRhcmdldDtcbiAgICAgICAgfSkpKTtcblxuICAgICAgICAvLyBSZXN0b3JlIGZvY3VzIHRvIHRoZSBwcmV2aW91cyB0YWJiYWJsZSBlbGVtZW50IGluZGV4IHRvIHByZXZlbnRcbiAgICAgICAgLy8gZm9jdXMgZnJvbSBiZWluZyBsb3N0IG91dHNpZGUgdGhlIGZsb2F0aW5nIHRyZWUuXG4gICAgICAgIGlmIChyZXN0b3JlRm9jdXMgJiYgbW92ZWRUb1VucmVsYXRlZE5vZGUgJiYgYWN0aXZlRWxlbWVudChnZXREb2N1bWVudChmbG9hdGluZ0ZvY3VzTm9kZSkpID09PSBnZXREb2N1bWVudChmbG9hdGluZ0ZvY3VzTm9kZSkuYm9keSkge1xuICAgICAgICAgIC8vIExldCBgRmxvYXRpbmdQb3J0YWxgIGVmZmVjdCBrbm93cyB0aGF0IGZvY3VzIGlzIHN0aWxsIGluc2lkZSB0aGVcbiAgICAgICAgICAvLyBmbG9hdGluZyB0cmVlLlxuICAgICAgICAgIGlmIChpc0hUTUxFbGVtZW50KGZsb2F0aW5nRm9jdXNOb2RlKSkge1xuICAgICAgICAgICAgZmxvYXRpbmdGb2N1c05vZGUgPT0gbnVsbCB8fCBmbG9hdGluZ0ZvY3VzTm9kZS5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBwcmV2VGFiYmFibGVJbmRleCA9IHRhYmJhYmxlSW5kZXhSZWYuY3VycmVudDtcbiAgICAgICAgICBjb25zdCB0YWJiYWJsZUNvbnRlbnQgPSBnZXRUYWJiYWJsZUNvbnRlbnQoKTtcbiAgICAgICAgICBjb25zdCBub2RlVG9Gb2N1cyA9IHRhYmJhYmxlQ29udGVudFtwcmV2VGFiYmFibGVJbmRleF0gfHwgdGFiYmFibGVDb250ZW50W3RhYmJhYmxlQ29udGVudC5sZW5ndGggLSAxXSB8fCBmbG9hdGluZ0ZvY3VzTm9kZTtcbiAgICAgICAgICBpZiAoaXNIVE1MRWxlbWVudChub2RlVG9Gb2N1cykpIHtcbiAgICAgICAgICAgIG5vZGVUb0ZvY3VzLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9jdXMgZGlkIG5vdCBtb3ZlIGluc2lkZSB0aGUgZmxvYXRpbmcgdHJlZSwgYW5kIHRoZXJlIGFyZSBubyB0YWJiYWJsZVxuICAgICAgICAvLyBwb3J0YWwgZ3VhcmRzIHRvIGhhbmRsZSBjbG9zaW5nLlxuICAgICAgICBpZiAoKGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCA/IHRydWUgOiAhbW9kYWwpICYmIHJlbGF0ZWRUYXJnZXQgJiYgbW92ZWRUb1VucmVsYXRlZE5vZGUgJiYgIWlzUG9pbnRlckRvd25SZWYuY3VycmVudCAmJlxuICAgICAgICAvLyBGaXggUmVhY3QgMTggU3RyaWN0IE1vZGUgcmV0dXJuRm9jdXMgZHVlIHRvIGRvdWJsZSByZW5kZXJpbmcuXG4gICAgICAgIHJlbGF0ZWRUYXJnZXQgIT09IGdldFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpKSB7XG4gICAgICAgICAgcHJldmVudFJldHVybkZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGZsb2F0aW5nICYmIGlzSFRNTEVsZW1lbnQoZG9tUmVmZXJlbmNlKSkge1xuICAgICAgZG9tUmVmZXJlbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgaGFuZGxlRm9jdXNPdXRzaWRlKTtcbiAgICAgIGRvbVJlZmVyZW5jZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgIGZsb2F0aW5nLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgaGFuZGxlRm9jdXNPdXRzaWRlKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRvbVJlZmVyZW5jZS5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGhhbmRsZUZvY3VzT3V0c2lkZSk7XG4gICAgICAgIGRvbVJlZmVyZW5jZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgZmxvYXRpbmcucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBoYW5kbGVGb2N1c091dHNpZGUpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlZCwgZG9tUmVmZXJlbmNlLCBmbG9hdGluZywgZmxvYXRpbmdGb2N1c05vZGUsIG1vZGFsLCBub2RlSWQsIHRyZWUsIHBvcnRhbENvbnRleHQsIG9uT3BlbkNoYW5nZSwgY2xvc2VPbkZvY3VzT3V0LCByZXN0b3JlRm9jdXMsIGdldFRhYmJhYmxlQ29udGVudCwgaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94XSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdmFyIF9wb3J0YWxDb250ZXh0JHBvcnRhbDtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcblxuICAgIC8vIERvbid0IGhpZGUgcG9ydGFscyBuZXN0ZWQgd2l0aGluIHRoZSBwYXJlbnQgcG9ydGFsLlxuICAgIGNvbnN0IHBvcnRhbE5vZGVzID0gQXJyYXkuZnJvbSgocG9ydGFsQ29udGV4dCA9PSBudWxsIHx8IChfcG9ydGFsQ29udGV4dCRwb3J0YWwgPSBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpID09IG51bGwgPyB2b2lkIDAgOiBfcG9ydGFsQ29udGV4dCRwb3J0YWwucXVlcnlTZWxlY3RvckFsbChcIltcIiArIGNyZWF0ZUF0dHJpYnV0ZSgncG9ydGFsJykgKyBcIl1cIikpIHx8IFtdKTtcbiAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgIGNvbnN0IGluc2lkZUVsZW1lbnRzID0gW2Zsb2F0aW5nLCAuLi5wb3J0YWxOb2Rlcywgc3RhcnREaXNtaXNzQnV0dG9uUmVmLmN1cnJlbnQsIGVuZERpc21pc3NCdXR0b25SZWYuY3VycmVudCwgb3JkZXJSZWYuY3VycmVudC5pbmNsdWRlcygncmVmZXJlbmNlJykgfHwgaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94ID8gZG9tUmVmZXJlbmNlIDogbnVsbF0uZmlsdGVyKHggPT4geCAhPSBudWxsKTtcbiAgICAgIGNvbnN0IGNsZWFudXAgPSBtb2RhbCB8fCBpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3ggPyBtYXJrT3RoZXJzKGluc2lkZUVsZW1lbnRzLCBndWFyZHMsICFndWFyZHMpIDogbWFya090aGVycyhpbnNpZGVFbGVtZW50cyk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2Rpc2FibGVkLCBkb21SZWZlcmVuY2UsIGZsb2F0aW5nLCBtb2RhbCwgb3JkZXJSZWYsIHBvcnRhbENvbnRleHQsIGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCwgZ3VhcmRzXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQgfHwgIWlzSFRNTEVsZW1lbnQoZmxvYXRpbmdGb2N1c05vZGUpKSByZXR1cm47XG4gICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoZmxvYXRpbmdGb2N1c05vZGUpO1xuICAgIGNvbnN0IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGFjdGl2ZUVsZW1lbnQoZG9jKTtcblxuICAgIC8vIFdhaXQgZm9yIGFueSBsYXlvdXQgZWZmZWN0IHN0YXRlIHNldHRlcnMgdG8gZXhlY3V0ZSB0byBzZXQgYHRhYkluZGV4YC5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGdldFRhYmJhYmxlRWxlbWVudHMoZmxvYXRpbmdGb2N1c05vZGUpO1xuICAgICAgY29uc3QgaW5pdGlhbEZvY3VzVmFsdWUgPSBpbml0aWFsRm9jdXNSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IGVsVG9Gb2N1cyA9ICh0eXBlb2YgaW5pdGlhbEZvY3VzVmFsdWUgPT09ICdudW1iZXInID8gZm9jdXNhYmxlRWxlbWVudHNbaW5pdGlhbEZvY3VzVmFsdWVdIDogaW5pdGlhbEZvY3VzVmFsdWUuY3VycmVudCkgfHwgZmxvYXRpbmdGb2N1c05vZGU7XG4gICAgICBjb25zdCBmb2N1c0FscmVhZHlJbnNpZGVGbG9hdGluZ0VsID0gY29udGFpbnMoZmxvYXRpbmdGb2N1c05vZGUsIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCk7XG4gICAgICBpZiAoIWlnbm9yZUluaXRpYWxGb2N1cyAmJiAhZm9jdXNBbHJlYWR5SW5zaWRlRmxvYXRpbmdFbCAmJiBvcGVuKSB7XG4gICAgICAgIGVucXVldWVGb2N1cyhlbFRvRm9jdXMsIHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiBlbFRvRm9jdXMgPT09IGZsb2F0aW5nRm9jdXNOb2RlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbZGlzYWJsZWQsIG9wZW4sIGZsb2F0aW5nRm9jdXNOb2RlLCBpZ25vcmVJbml0aWFsRm9jdXMsIGdldFRhYmJhYmxlRWxlbWVudHMsIGluaXRpYWxGb2N1c1JlZl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkIHx8ICFmbG9hdGluZ0ZvY3VzTm9kZSkgcmV0dXJuO1xuICAgIGxldCBwcmV2ZW50UmV0dXJuRm9jdXNTY3JvbGwgPSBmYWxzZTtcbiAgICBjb25zdCBkb2MgPSBnZXREb2N1bWVudChmbG9hdGluZ0ZvY3VzTm9kZSk7XG4gICAgY29uc3QgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gYWN0aXZlRWxlbWVudChkb2MpO1xuICAgIGNvbnN0IGNvbnRleHREYXRhID0gZGF0YVJlZi5jdXJyZW50O1xuICAgIGxldCBvcGVuRXZlbnQgPSBjb250ZXh0RGF0YS5vcGVuRXZlbnQ7XG4gICAgY29uc3QgZG9tUmVmZXJlbmNlID0gcmVmcy5kb21SZWZlcmVuY2UuY3VycmVudDtcbiAgICBhZGRQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQocHJldmlvdXNseUZvY3VzZWRFbGVtZW50KTtcblxuICAgIC8vIERpc21pc3NpbmcgdmlhIG91dHNpZGUgcHJlc3Mgc2hvdWxkIGFsd2F5cyBpZ25vcmUgYHJldHVybkZvY3VzYCB0b1xuICAgIC8vIHByZXZlbnQgdW53YW50ZWQgc2Nyb2xsaW5nLlxuICAgIGZ1bmN0aW9uIG9uT3BlbkNoYW5nZShfcmVmKSB7XG4gICAgICBsZXQge1xuICAgICAgICBvcGVuLFxuICAgICAgICByZWFzb24sXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBuZXN0ZWRcbiAgICAgIH0gPSBfcmVmO1xuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgb3BlbkV2ZW50ID0gZXZlbnQ7XG4gICAgICB9XG4gICAgICBpZiAocmVhc29uID09PSAnZXNjYXBlLWtleScgJiYgcmVmcy5kb21SZWZlcmVuY2UuY3VycmVudCkge1xuICAgICAgICBhZGRQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQocmVmcy5kb21SZWZlcmVuY2UuY3VycmVudCk7XG4gICAgICB9XG4gICAgICBpZiAocmVhc29uID09PSAnaG92ZXInICYmIGV2ZW50LnR5cGUgPT09ICdtb3VzZWxlYXZlJykge1xuICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocmVhc29uICE9PSAnb3V0c2lkZS1wcmVzcycpIHJldHVybjtcbiAgICAgIGlmIChuZXN0ZWQpIHtcbiAgICAgICAgcHJldmVudFJldHVybkZvY3VzUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgcHJldmVudFJldHVybkZvY3VzU2Nyb2xsID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1JlZi5jdXJyZW50ID0gIShpc1ZpcnR1YWxDbGljayhldmVudCkgfHwgaXNWaXJ0dWFsUG9pbnRlckV2ZW50KGV2ZW50KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGV2ZW50cy5vbignb3BlbmNoYW5nZScsIG9uT3BlbkNoYW5nZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGV2ZW50cy5vZmYoJ29wZW5jaGFuZ2UnLCBvbk9wZW5DaGFuZ2UpO1xuICAgICAgY29uc3QgYWN0aXZlRWwgPSBhY3RpdmVFbGVtZW50KGRvYyk7XG4gICAgICBjb25zdCBpc0ZvY3VzSW5zaWRlRmxvYXRpbmdUcmVlID0gY29udGFpbnMoZmxvYXRpbmcsIGFjdGl2ZUVsKSB8fCB0cmVlICYmIGdldENoaWxkcmVuKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKS5zb21lKG5vZGUgPT4ge1xuICAgICAgICB2YXIgX25vZGUkY29udGV4dDU7XG4gICAgICAgIHJldHVybiBjb250YWlucygoX25vZGUkY29udGV4dDUgPSBub2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRjb250ZXh0NS5lbGVtZW50cy5mbG9hdGluZywgYWN0aXZlRWwpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBzaG91bGRGb2N1c1JlZmVyZW5jZSA9IGlzRm9jdXNJbnNpZGVGbG9hdGluZ1RyZWUgfHwgb3BlbkV2ZW50ICYmIFsnY2xpY2snLCAnbW91c2Vkb3duJ10uaW5jbHVkZXMob3BlbkV2ZW50LnR5cGUpO1xuICAgICAgaWYgKHNob3VsZEZvY3VzUmVmZXJlbmNlICYmIHJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQpIHtcbiAgICAgICAgYWRkUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KHJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmV0dXJuQ29udGV4dEVsZW1lbnQgPSBkb21SZWZlcmVuY2UgfHwgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50O1xuICAgICAgY29uc3QgdGFiYmFibGVFbGVtZW50cyA9IHRhYmJhYmxlKGdldERvY3VtZW50KHJldHVybkNvbnRleHRFbGVtZW50KS5ib2R5LCBnZXRUYWJiYWJsZU9wdGlvbnMoKSk7XG5cbiAgICAgIC8vIFdhaXQgZm9yIHRoZSByZXR1cm4gZWxlbWVudCB0byBnZXQgcG90ZW50aWFsbHkgZGlzY29ubmVjdGVkIGJlZm9yZVxuICAgICAgLy8gY2hlY2tpbmcuXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGxldCByZXR1cm5FbGVtZW50ID0gZ2V0UHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk7XG4gICAgICAgIGlmICghcmV0dXJuRWxlbWVudCAmJiBpc0hUTUxFbGVtZW50KHJldHVybkNvbnRleHRFbGVtZW50KSAmJiBmbG9hdGluZykge1xuICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBnZXRDbG9zZXN0VGFiYmFibGVFbGVtZW50KHRhYmJhYmxlRWxlbWVudHMsIHJldHVybkNvbnRleHRFbGVtZW50LCBmbG9hdGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgICAgIHJldHVybkZvY3VzUmVmLmN1cnJlbnQgJiYgIXByZXZlbnRSZXR1cm5Gb2N1c1JlZi5jdXJyZW50ICYmIGlzSFRNTEVsZW1lbnQocmV0dXJuRWxlbWVudCkgJiYgKFxuICAgICAgICAvLyBJZiB0aGUgZm9jdXMgbW92ZWQgc29tZXdoZXJlIGVsc2UgYWZ0ZXIgbW91bnQsIGF2b2lkIHJldHVybmluZyBmb2N1c1xuICAgICAgICAvLyBzaW5jZSBpdCBsaWtlbHkgZW50ZXJlZCBhIGRpZmZlcmVudCBlbGVtZW50IHdoaWNoIHNob3VsZCBiZVxuICAgICAgICAvLyByZXNwZWN0ZWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMjYwN1xuICAgICAgICByZXR1cm5FbGVtZW50ICE9PSBhY3RpdmVFbCAmJiBhY3RpdmVFbCAhPT0gZG9jLmJvZHkgPyBpc0ZvY3VzSW5zaWRlRmxvYXRpbmdUcmVlIDogdHJ1ZSkpIHtcbiAgICAgICAgICByZXR1cm5FbGVtZW50LmZvY3VzKHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHByZXZlbnRSZXR1cm5Gb2N1c1Njcm9sbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9LCBbZGlzYWJsZWQsIGZsb2F0aW5nLCBmbG9hdGluZ0ZvY3VzTm9kZSwgcmV0dXJuRm9jdXNSZWYsIGRhdGFSZWYsIHJlZnMsIGV2ZW50cywgdHJlZSwgbm9kZUlkXSk7XG5cbiAgLy8gU3luY2hyb25pemUgdGhlIGBjb250ZXh0YCAmIGBtb2RhbGAgdmFsdWUgdG8gdGhlIEZsb2F0aW5nUG9ydGFsIGNvbnRleHQuXG4gIC8vIEl0IHdpbGwgZGVjaWRlIHdoZXRoZXIgb3Igbm90IGl0IG5lZWRzIHRvIHJlbmRlciBpdHMgb3duIGd1YXJkcy5cbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgIGlmICghcG9ydGFsQ29udGV4dCkgcmV0dXJuO1xuICAgIHBvcnRhbENvbnRleHQuc2V0Rm9jdXNNYW5hZ2VyU3RhdGUoe1xuICAgICAgbW9kYWwsXG4gICAgICBjbG9zZU9uRm9jdXNPdXQsXG4gICAgICBvcGVuLFxuICAgICAgb25PcGVuQ2hhbmdlLFxuICAgICAgcmVmc1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBwb3J0YWxDb250ZXh0LnNldEZvY3VzTWFuYWdlclN0YXRlKG51bGwpO1xuICAgIH07XG4gIH0sIFtkaXNhYmxlZCwgcG9ydGFsQ29udGV4dCwgbW9kYWwsIG9wZW4sIG9uT3BlbkNoYW5nZSwgcmVmcywgY2xvc2VPbkZvY3VzT3V0XSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBpZiAoIWZsb2F0aW5nRm9jdXNOb2RlKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XG4gICAgaWYgKGlnbm9yZUluaXRpYWxGb2N1cykgcmV0dXJuO1xuICAgIGNvbnN0IGhhbmRsZU11dGF0aW9uID0gKCkgPT4ge1xuICAgICAgY29uc3QgdGFiSW5kZXggPSBmbG9hdGluZ0ZvY3VzTm9kZS5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgICBjb25zdCB0YWJiYWJsZUNvbnRlbnQgPSBnZXRUYWJiYWJsZUNvbnRlbnQoKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUVsID0gYWN0aXZlRWxlbWVudChnZXREb2N1bWVudChmbG9hdGluZykpO1xuICAgICAgY29uc3QgdGFiYmFibGVJbmRleCA9IHRhYmJhYmxlQ29udGVudC5pbmRleE9mKGFjdGl2ZUVsKTtcbiAgICAgIGlmICh0YWJiYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgICB0YWJiYWJsZUluZGV4UmVmLmN1cnJlbnQgPSB0YWJiYWJsZUluZGV4O1xuICAgICAgfVxuICAgICAgaWYgKG9yZGVyUmVmLmN1cnJlbnQuaW5jbHVkZXMoJ2Zsb2F0aW5nJykgfHwgYWN0aXZlRWwgIT09IHJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQgJiYgdGFiYmFibGVDb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAodGFiSW5kZXggIT09ICcwJykge1xuICAgICAgICAgIGZsb2F0aW5nRm9jdXNOb2RlLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRhYkluZGV4ICE9PSAnLTEnKSB7XG4gICAgICAgIGZsb2F0aW5nRm9jdXNOb2RlLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGhhbmRsZU11dGF0aW9uKCk7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihoYW5kbGVNdXRhdGlvbik7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShmbG9hdGluZ0ZvY3VzTm9kZSwge1xuICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH0sIFtkaXNhYmxlZCwgZmxvYXRpbmcsIGZsb2F0aW5nRm9jdXNOb2RlLCByZWZzLCBvcmRlclJlZiwgZ2V0VGFiYmFibGVDb250ZW50LCBpZ25vcmVJbml0aWFsRm9jdXNdKTtcbiAgZnVuY3Rpb24gcmVuZGVyRGlzbWlzc0J1dHRvbihsb2NhdGlvbikge1xuICAgIGlmIChkaXNhYmxlZCB8fCAhdmlzdWFsbHlIaWRkZW5EaXNtaXNzIHx8ICFtb2RhbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChWaXN1YWxseUhpZGRlbkRpc21pc3MsIHtcbiAgICAgIHJlZjogbG9jYXRpb24gPT09ICdzdGFydCcgPyBzdGFydERpc21pc3NCdXR0b25SZWYgOiBlbmREaXNtaXNzQnV0dG9uUmVmLFxuICAgICAgb25DbGljazogZXZlbnQgPT4gb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudClcbiAgICB9LCB0eXBlb2YgdmlzdWFsbHlIaWRkZW5EaXNtaXNzID09PSAnc3RyaW5nJyA/IHZpc3VhbGx5SGlkZGVuRGlzbWlzcyA6ICdEaXNtaXNzJyk7XG4gIH1cbiAgY29uc3Qgc2hvdWxkUmVuZGVyR3VhcmRzID0gIWRpc2FibGVkICYmIGd1YXJkcyAmJiAobW9kYWwgPyAhaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94IDogdHJ1ZSkgJiYgKGlzSW5zaWRlUG9ydGFsIHx8IG1vZGFsKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBzaG91bGRSZW5kZXJHdWFyZHMgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9jdXNHdWFyZCwge1xuICAgIFwiZGF0YS10eXBlXCI6IFwiaW5zaWRlXCIsXG4gICAgcmVmOiBwb3J0YWxDb250ZXh0ID09IG51bGwgPyB2b2lkIDAgOiBwb3J0YWxDb250ZXh0LmJlZm9yZUluc2lkZVJlZixcbiAgICBvbkZvY3VzOiBldmVudCA9PiB7XG4gICAgICBpZiAobW9kYWwpIHtcbiAgICAgICAgY29uc3QgZWxzID0gZ2V0VGFiYmFibGVFbGVtZW50cygpO1xuICAgICAgICBlbnF1ZXVlRm9jdXMob3JkZXJbMF0gPT09ICdyZWZlcmVuY2UnID8gZWxzWzBdIDogZWxzW2Vscy5sZW5ndGggLSAxXSk7XG4gICAgICB9IGVsc2UgaWYgKHBvcnRhbENvbnRleHQgIT0gbnVsbCAmJiBwb3J0YWxDb250ZXh0LnByZXNlcnZlVGFiT3JkZXIgJiYgcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlKSB7XG4gICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChpc091dHNpZGVFdmVudChldmVudCwgcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlKSkge1xuICAgICAgICAgIGNvbnN0IG5leHRUYWJiYWJsZSA9IGdldE5leHRUYWJiYWJsZSgpIHx8IGRvbVJlZmVyZW5jZTtcbiAgICAgICAgICBuZXh0VGFiYmFibGUgPT0gbnVsbCB8fCBuZXh0VGFiYmFibGUuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX3BvcnRhbENvbnRleHQkYmVmb3JlO1xuICAgICAgICAgIChfcG9ydGFsQ29udGV4dCRiZWZvcmUgPSBwb3J0YWxDb250ZXh0LmJlZm9yZU91dHNpZGVSZWYuY3VycmVudCkgPT0gbnVsbCB8fCBfcG9ydGFsQ29udGV4dCRiZWZvcmUuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSksICFpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3ggJiYgcmVuZGVyRGlzbWlzc0J1dHRvbignc3RhcnQnKSwgY2hpbGRyZW4sIHJlbmRlckRpc21pc3NCdXR0b24oJ2VuZCcpLCBzaG91bGRSZW5kZXJHdWFyZHMgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9jdXNHdWFyZCwge1xuICAgIFwiZGF0YS10eXBlXCI6IFwiaW5zaWRlXCIsXG4gICAgcmVmOiBwb3J0YWxDb250ZXh0ID09IG51bGwgPyB2b2lkIDAgOiBwb3J0YWxDb250ZXh0LmFmdGVySW5zaWRlUmVmLFxuICAgIG9uRm9jdXM6IGV2ZW50ID0+IHtcbiAgICAgIGlmIChtb2RhbCkge1xuICAgICAgICBlbnF1ZXVlRm9jdXMoZ2V0VGFiYmFibGVFbGVtZW50cygpWzBdKTtcbiAgICAgIH0gZWxzZSBpZiAocG9ydGFsQ29udGV4dCAhPSBudWxsICYmIHBvcnRhbENvbnRleHQucHJlc2VydmVUYWJPcmRlciAmJiBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpIHtcbiAgICAgICAgaWYgKGNsb3NlT25Gb2N1c091dCkge1xuICAgICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPdXRzaWRlRXZlbnQoZXZlbnQsIHBvcnRhbENvbnRleHQucG9ydGFsTm9kZSkpIHtcbiAgICAgICAgICBjb25zdCBwcmV2VGFiYmFibGUgPSBnZXRQcmV2aW91c1RhYmJhYmxlKCkgfHwgZG9tUmVmZXJlbmNlO1xuICAgICAgICAgIHByZXZUYWJiYWJsZSA9PSBudWxsIHx8IHByZXZUYWJiYWJsZS5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfcG9ydGFsQ29udGV4dCRhZnRlck87XG4gICAgICAgICAgKF9wb3J0YWxDb250ZXh0JGFmdGVyTyA9IHBvcnRhbENvbnRleHQuYWZ0ZXJPdXRzaWRlUmVmLmN1cnJlbnQpID09IG51bGwgfHwgX3BvcnRhbENvbnRleHQkYWZ0ZXJPLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pKTtcbn1cblxuY29uc3QgYWN0aXZlTG9ja3MgPSAvKiNfX1BVUkVfXyovbmV3IFNldCgpO1xuLyoqXG4gKiBQcm92aWRlcyBiYXNlIHN0eWxpbmcgZm9yIGEgZml4ZWQgb3ZlcmxheSBlbGVtZW50IHRvIGRpbSBjb250ZW50IG9yIGJsb2NrXG4gKiBwb2ludGVyIGV2ZW50cyBiZWhpbmQgYSBmbG9hdGluZyBlbGVtZW50LlxuICogSXQncyBhIHJlZ3VsYXIgYDxkaXY+YCwgc28gaXQgY2FuIGJlIHN0eWxlZCB2aWEgYW55IENTUyBzb2x1dGlvbiB5b3UgcHJlZmVyLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nT3ZlcmxheVxuICovXG5jb25zdCBGbG9hdGluZ092ZXJsYXkgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGbG9hdGluZ092ZXJsYXkocHJvcHMsIHJlZikge1xuICBjb25zdCB7XG4gICAgbG9ja1Njcm9sbCA9IGZhbHNlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuICBjb25zdCBsb2NrSWQgPSB1c2VJZCgpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFsb2NrU2Nyb2xsKSByZXR1cm47XG4gICAgYWN0aXZlTG9ja3MuYWRkKGxvY2tJZCk7XG4gICAgY29uc3QgaXNJT1MgPSAvaVAoaG9uZXxhZHxvZCl8aU9TLy50ZXN0KGdldFBsYXRmb3JtKCkpO1xuICAgIGNvbnN0IGJvZHlTdHlsZSA9IGRvY3VtZW50LmJvZHkuc3R5bGU7XG4gICAgLy8gUlRMIDxib2R5PiBzY3JvbGxiYXJcbiAgICBjb25zdCBzY3JvbGxiYXJYID0gTWF0aC5yb3VuZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCkgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBwYWRkaW5nUHJvcCA9IHNjcm9sbGJhclggPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCc7XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBzY3JvbGxYID0gYm9keVN0eWxlLmxlZnQgPyBwYXJzZUZsb2F0KGJvZHlTdHlsZS5sZWZ0KSA6IHdpbmRvdy5zY3JvbGxYO1xuICAgIGNvbnN0IHNjcm9sbFkgPSBib2R5U3R5bGUudG9wID8gcGFyc2VGbG9hdChib2R5U3R5bGUudG9wKSA6IHdpbmRvdy5zY3JvbGxZO1xuICAgIGJvZHlTdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIGlmIChzY3JvbGxiYXJXaWR0aCkge1xuICAgICAgYm9keVN0eWxlW3BhZGRpbmdQcm9wXSA9IHNjcm9sbGJhcldpZHRoICsgXCJweFwiO1xuICAgIH1cblxuICAgIC8vIE9ubHkgaU9TIGRvZXNuJ3QgcmVzcGVjdCBgb3ZlcmZsb3c6IGhpZGRlbmAgb24gZG9jdW1lbnQuYm9keSwgYW5kIHRoaXNcbiAgICAvLyB0ZWNobmlxdWUgaGFzIGZld2VyIHNpZGUgZWZmZWN0cy5cbiAgICBpZiAoaXNJT1MpIHtcbiAgICAgIHZhciBfd2luZG93JHZpc3VhbFZpZXdwb3IsIF93aW5kb3ckdmlzdWFsVmlld3BvcjI7XG4gICAgICAvLyBpT1MgMTIgZG9lcyBub3Qgc3VwcG9ydCBgdmlzdWFsVmlld3BvcnRgLlxuICAgICAgY29uc3Qgb2Zmc2V0TGVmdCA9ICgoX3dpbmRvdyR2aXN1YWxWaWV3cG9yID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PSBudWxsID8gdm9pZCAwIDogX3dpbmRvdyR2aXN1YWxWaWV3cG9yLm9mZnNldExlZnQpIHx8IDA7XG4gICAgICBjb25zdCBvZmZzZXRUb3AgPSAoKF93aW5kb3ckdmlzdWFsVmlld3BvcjIgPSB3aW5kb3cudmlzdWFsVmlld3BvcnQpID09IG51bGwgPyB2b2lkIDAgOiBfd2luZG93JHZpc3VhbFZpZXdwb3IyLm9mZnNldFRvcCkgfHwgMDtcbiAgICAgIE9iamVjdC5hc3NpZ24oYm9keVN0eWxlLCB7XG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICB0b3A6IC0oc2Nyb2xsWSAtIE1hdGguZmxvb3Iob2Zmc2V0VG9wKSkgKyBcInB4XCIsXG4gICAgICAgIGxlZnQ6IC0oc2Nyb2xsWCAtIE1hdGguZmxvb3Iob2Zmc2V0TGVmdCkpICsgXCJweFwiLFxuICAgICAgICByaWdodDogJzAnXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZUxvY2tzLmRlbGV0ZShsb2NrSWQpO1xuICAgICAgaWYgKGFjdGl2ZUxvY2tzLnNpemUgPT09IDApIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihib2R5U3R5bGUsIHtcbiAgICAgICAgICBvdmVyZmxvdzogJycsXG4gICAgICAgICAgW3BhZGRpbmdQcm9wXTogJydcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc0lPUykge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24oYm9keVN0eWxlLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJycsXG4gICAgICAgICAgICB0b3A6ICcnLFxuICAgICAgICAgICAgbGVmdDogJycsXG4gICAgICAgICAgICByaWdodDogJydcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oc2Nyb2xsWCwgc2Nyb2xsWSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LCBbbG9ja0lkLCBsb2NrU2Nyb2xsXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWZcbiAgfSwgcmVzdCwge1xuICAgIHN0eWxlOiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIG92ZXJmbG93OiAnYXV0bycsXG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICAuLi5yZXN0LnN0eWxlXG4gICAgfVxuICB9KSk7XG59KTtcblxuZnVuY3Rpb24gaXNCdXR0b25UYXJnZXQoZXZlbnQpIHtcbiAgcmV0dXJuIGlzSFRNTEVsZW1lbnQoZXZlbnQudGFyZ2V0KSAmJiBldmVudC50YXJnZXQudGFnTmFtZSA9PT0gJ0JVVFRPTic7XG59XG5mdW5jdGlvbiBpc1NwYWNlSWdub3JlZChlbGVtZW50KSB7XG4gIHJldHVybiBpc1R5cGVhYmxlRWxlbWVudChlbGVtZW50KTtcbn1cbi8qKlxuICogT3BlbnMgb3IgY2xvc2VzIHRoZSBmbG9hdGluZyBlbGVtZW50IHdoZW4gY2xpY2tpbmcgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUNsaWNrXG4gKi9cbmZ1bmN0aW9uIHVzZUNsaWNrKGNvbnRleHQsIHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZGF0YVJlZixcbiAgICBlbGVtZW50czoge1xuICAgICAgZG9tUmVmZXJlbmNlXG4gICAgfVxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIGV2ZW50OiBldmVudE9wdGlvbiA9ICdjbGljaycsXG4gICAgdG9nZ2xlID0gdHJ1ZSxcbiAgICBpZ25vcmVNb3VzZSA9IGZhbHNlLFxuICAgIGtleWJvYXJkSGFuZGxlcnMgPSB0cnVlXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgcG9pbnRlclR5cGVSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgY29uc3QgZGlkS2V5RG93blJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBvblBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICBwb2ludGVyVHlwZVJlZi5jdXJyZW50ID0gZXZlbnQucG9pbnRlclR5cGU7XG4gICAgfSxcbiAgICBvbk1vdXNlRG93bihldmVudCkge1xuICAgICAgY29uc3QgcG9pbnRlclR5cGUgPSBwb2ludGVyVHlwZVJlZi5jdXJyZW50O1xuXG4gICAgICAvLyBJZ25vcmUgYWxsIGJ1dHRvbnMgZXhjZXB0IGZvciB0aGUgXCJtYWluXCIgYnV0dG9uLlxuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL01vdXNlRXZlbnQvYnV0dG9uXG4gICAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSByZXR1cm47XG4gICAgICBpZiAoZXZlbnRPcHRpb24gPT09ICdjbGljaycpIHJldHVybjtcbiAgICAgIGlmIChpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlLCB0cnVlKSAmJiBpZ25vcmVNb3VzZSkgcmV0dXJuO1xuICAgICAgaWYgKG9wZW4gJiYgdG9nZ2xlICYmIChkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50ID8gZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudC50eXBlID09PSAnbW91c2Vkb3duJyA6IHRydWUpKSB7XG4gICAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUHJldmVudCBzdGVhbGluZyBmb2N1cyBmcm9tIHRoZSBmbG9hdGluZyBlbGVtZW50XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudC5uYXRpdmVFdmVudCwgJ2NsaWNrJyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICBjb25zdCBwb2ludGVyVHlwZSA9IHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoZXZlbnRPcHRpb24gPT09ICdtb3VzZWRvd24nICYmIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcG9pbnRlclR5cGVSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzTW91c2VMaWtlUG9pbnRlclR5cGUocG9pbnRlclR5cGUsIHRydWUpICYmIGlnbm9yZU1vdXNlKSByZXR1cm47XG4gICAgICBpZiAob3BlbiAmJiB0b2dnbGUgJiYgKGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQgPyBkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50LnR5cGUgPT09ICdjbGljaycgOiB0cnVlKSkge1xuICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudC5uYXRpdmVFdmVudCwgJ2NsaWNrJyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAha2V5Ym9hcmRIYW5kbGVycyB8fCBpc0J1dHRvblRhcmdldChldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJyAnICYmICFpc1NwYWNlSWdub3JlZChkb21SZWZlcmVuY2UpKSB7XG4gICAgICAgIC8vIFByZXZlbnQgc2Nyb2xsaW5nXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRpZEtleURvd25SZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGlmIChvcGVuICYmIHRvZ2dsZSkge1xuICAgICAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudC5uYXRpdmVFdmVudCwgJ2NsaWNrJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIG9uS2V5VXAoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFrZXlib2FyZEhhbmRsZXJzIHx8IGlzQnV0dG9uVGFyZ2V0KGV2ZW50KSB8fCBpc1NwYWNlSWdub3JlZChkb21SZWZlcmVuY2UpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJyAmJiBkaWRLZXlEb3duUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgZGlkS2V5RG93blJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChvcGVuICYmIHRvZ2dsZSkge1xuICAgICAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudC5uYXRpdmVFdmVudCwgJ2NsaWNrJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pLCBbZGF0YVJlZiwgZG9tUmVmZXJlbmNlLCBldmVudE9wdGlvbiwgaWdub3JlTW91c2UsIGtleWJvYXJkSGFuZGxlcnMsIG9uT3BlbkNoYW5nZSwgb3BlbiwgdG9nZ2xlXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IGVuYWJsZWQgPyB7XG4gICAgcmVmZXJlbmNlXG4gIH0gOiB7fSwgW2VuYWJsZWQsIHJlZmVyZW5jZV0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVWaXJ0dWFsRWxlbWVudChkb21FbGVtZW50LCBkYXRhKSB7XG4gIGxldCBvZmZzZXRYID0gbnVsbDtcbiAgbGV0IG9mZnNldFkgPSBudWxsO1xuICBsZXQgaXNBdXRvVXBkYXRlRXZlbnQgPSBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBjb250ZXh0RWxlbWVudDogZG9tRWxlbWVudCB8fCB1bmRlZmluZWQsXG4gICAgZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkge1xuICAgICAgdmFyIF9kYXRhJGRhdGFSZWYkY3VycmVudDtcbiAgICAgIGNvbnN0IGRvbVJlY3QgPSAoZG9tRWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkgfHwge1xuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwXG4gICAgICB9O1xuICAgICAgY29uc3QgaXNYQXhpcyA9IGRhdGEuYXhpcyA9PT0gJ3gnIHx8IGRhdGEuYXhpcyA9PT0gJ2JvdGgnO1xuICAgICAgY29uc3QgaXNZQXhpcyA9IGRhdGEuYXhpcyA9PT0gJ3knIHx8IGRhdGEuYXhpcyA9PT0gJ2JvdGgnO1xuICAgICAgY29uc3QgY2FuVHJhY2tDdXJzb3JPbkF1dG9VcGRhdGUgPSBbJ21vdXNlZW50ZXInLCAnbW91c2Vtb3ZlJ10uaW5jbHVkZXMoKChfZGF0YSRkYXRhUmVmJGN1cnJlbnQgPSBkYXRhLmRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZGF0YSRkYXRhUmVmJGN1cnJlbnQudHlwZSkgfHwgJycpICYmIGRhdGEucG9pbnRlclR5cGUgIT09ICd0b3VjaCc7XG4gICAgICBsZXQgd2lkdGggPSBkb21SZWN0LndpZHRoO1xuICAgICAgbGV0IGhlaWdodCA9IGRvbVJlY3QuaGVpZ2h0O1xuICAgICAgbGV0IHggPSBkb21SZWN0Lng7XG4gICAgICBsZXQgeSA9IGRvbVJlY3QueTtcbiAgICAgIGlmIChvZmZzZXRYID09IG51bGwgJiYgZGF0YS54ICYmIGlzWEF4aXMpIHtcbiAgICAgICAgb2Zmc2V0WCA9IGRvbVJlY3QueCAtIGRhdGEueDtcbiAgICAgIH1cbiAgICAgIGlmIChvZmZzZXRZID09IG51bGwgJiYgZGF0YS55ICYmIGlzWUF4aXMpIHtcbiAgICAgICAgb2Zmc2V0WSA9IGRvbVJlY3QueSAtIGRhdGEueTtcbiAgICAgIH1cbiAgICAgIHggLT0gb2Zmc2V0WCB8fCAwO1xuICAgICAgeSAtPSBvZmZzZXRZIHx8IDA7XG4gICAgICB3aWR0aCA9IDA7XG4gICAgICBoZWlnaHQgPSAwO1xuICAgICAgaWYgKCFpc0F1dG9VcGRhdGVFdmVudCB8fCBjYW5UcmFja0N1cnNvck9uQXV0b1VwZGF0ZSkge1xuICAgICAgICB3aWR0aCA9IGRhdGEuYXhpcyA9PT0gJ3knID8gZG9tUmVjdC53aWR0aCA6IDA7XG4gICAgICAgIGhlaWdodCA9IGRhdGEuYXhpcyA9PT0gJ3gnID8gZG9tUmVjdC5oZWlnaHQgOiAwO1xuICAgICAgICB4ID0gaXNYQXhpcyAmJiBkYXRhLnggIT0gbnVsbCA/IGRhdGEueCA6IHg7XG4gICAgICAgIHkgPSBpc1lBeGlzICYmIGRhdGEueSAhPSBudWxsID8gZGF0YS55IDogeTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBdXRvVXBkYXRlRXZlbnQgJiYgIWNhblRyYWNrQ3Vyc29yT25BdXRvVXBkYXRlKSB7XG4gICAgICAgIGhlaWdodCA9IGRhdGEuYXhpcyA9PT0gJ3gnID8gZG9tUmVjdC5oZWlnaHQgOiBoZWlnaHQ7XG4gICAgICAgIHdpZHRoID0gZGF0YS5heGlzID09PSAneScgPyBkb21SZWN0LndpZHRoIDogd2lkdGg7XG4gICAgICB9XG4gICAgICBpc0F1dG9VcGRhdGVFdmVudCA9IHRydWU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB0b3A6IHksXG4gICAgICAgIHJpZ2h0OiB4ICsgd2lkdGgsXG4gICAgICAgIGJvdHRvbTogeSArIGhlaWdodCxcbiAgICAgICAgbGVmdDogeFxuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBpc01vdXNlQmFzZWRFdmVudChldmVudCkge1xuICByZXR1cm4gZXZlbnQgIT0gbnVsbCAmJiBldmVudC5jbGllbnRYICE9IG51bGw7XG59XG4vKipcbiAqIFBvc2l0aW9ucyB0aGUgZmxvYXRpbmcgZWxlbWVudCByZWxhdGl2ZSB0byBhIGNsaWVudCBwb2ludCAoaW4gdGhlIHZpZXdwb3J0KSxcbiAqIHN1Y2ggYXMgdGhlIG1vdXNlIHBvc2l0aW9uLiBCeSBkZWZhdWx0LCBpdCBmb2xsb3dzIHRoZSBtb3VzZSBjdXJzb3IuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlQ2xpZW50UG9pbnRcbiAqL1xuZnVuY3Rpb24gdXNlQ2xpZW50UG9pbnQoY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIGRhdGFSZWYsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGZsb2F0aW5nLFxuICAgICAgZG9tUmVmZXJlbmNlXG4gICAgfSxcbiAgICByZWZzXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgYXhpcyA9ICdib3RoJyxcbiAgICB4ID0gbnVsbCxcbiAgICB5ID0gbnVsbFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGluaXRpYWxSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBjbGVhbnVwTGlzdGVuZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IFtwb2ludGVyVHlwZSwgc2V0UG9pbnRlclR5cGVdID0gUmVhY3QudXNlU3RhdGUoKTtcbiAgY29uc3QgW3JlYWN0aXZlLCBzZXRSZWFjdGl2ZV0gPSBSZWFjdC51c2VTdGF0ZShbXSk7XG4gIGNvbnN0IHNldFJlZmVyZW5jZSA9IHVzZUVmZmVjdEV2ZW50KCh4LCB5KSA9PiB7XG4gICAgaWYgKGluaXRpYWxSZWYuY3VycmVudCkgcmV0dXJuO1xuXG4gICAgLy8gUHJldmVudCBzZXR0aW5nIGlmIHRoZSBvcGVuIGV2ZW50IHdhcyBub3QgYSBtb3VzZS1saWtlIG9uZVxuICAgIC8vIChlLmcuIGZvY3VzIHRvIG9wZW4sIHRoZW4gaG92ZXIgb3ZlciB0aGUgcmVmZXJlbmNlIGVsZW1lbnQpLlxuICAgIC8vIE9ubHkgYXBwbHkgaWYgdGhlIGV2ZW50IGV4aXN0cy5cbiAgICBpZiAoZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCAmJiAhaXNNb3VzZUJhc2VkRXZlbnQoZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVmcy5zZXRQb3NpdGlvblJlZmVyZW5jZShjcmVhdGVWaXJ0dWFsRWxlbWVudChkb21SZWZlcmVuY2UsIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgYXhpcyxcbiAgICAgIGRhdGFSZWYsXG4gICAgICBwb2ludGVyVHlwZVxuICAgIH0pKTtcbiAgfSk7XG4gIGNvbnN0IGhhbmRsZVJlZmVyZW5jZUVudGVyT3JNb3ZlID0gdXNlRWZmZWN0RXZlbnQoZXZlbnQgPT4ge1xuICAgIGlmICh4ICE9IG51bGwgfHwgeSAhPSBudWxsKSByZXR1cm47XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICBzZXRSZWZlcmVuY2UoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgfSBlbHNlIGlmICghY2xlYW51cExpc3RlbmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gY2xlYW51cCwgdGhlcmUncyBubyBsaXN0ZW5lciwgYnV0IHdlIHdhbnQgdG8gZW5zdXJlXG4gICAgICAvLyB3ZSBhZGQgdGhlIGxpc3RlbmVyIGlmIHRoZSBjdXJzb3IgbGFuZGVkIG9uIHRoZSBmbG9hdGluZyBlbGVtZW50IGFuZFxuICAgICAgLy8gdGhlbiBiYWNrIG9uIHRoZSByZWZlcmVuY2UgKGkuZS4gaXQncyBpbnRlcmFjdGl2ZSkuXG4gICAgICBzZXRSZWFjdGl2ZShbXSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBJZiB0aGUgcG9pbnRlciBpcyBhIG1vdXNlLWxpa2UgcG9pbnRlciwgd2Ugd2FudCB0byBjb250aW51ZSBmb2xsb3dpbmcgdGhlXG4gIC8vIG1vdXNlIGV2ZW4gaWYgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXMgdHJhbnNpdGlvbmluZyBvdXQuIE9uIHRvdWNoXG4gIC8vIGRldmljZXMsIHRoaXMgaXMgdW5kZXNpcmFibGUgYmVjYXVzZSB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aWxsIG1vdmUgdG9cbiAgLy8gdGhlIGRpc21pc3NhbCB0b3VjaCBwb2ludC5cbiAgY29uc3Qgb3BlbkNoZWNrID0gaXNNb3VzZUxpa2VQb2ludGVyVHlwZShwb2ludGVyVHlwZSkgPyBmbG9hdGluZyA6IG9wZW47XG4gIGNvbnN0IGFkZExpc3RlbmVyID0gUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIC8vIEV4cGxpY2l0bHkgc3BlY2lmaWVkIGB4YC9geWAgY29vcmRpbmF0ZXMgc2hvdWxkbid0IGFkZCBhIGxpc3RlbmVyLlxuICAgIGlmICghb3BlbkNoZWNrIHx8ICFlbmFibGVkIHx8IHggIT0gbnVsbCB8fCB5ICE9IG51bGwpIHJldHVybjtcbiAgICBjb25zdCB3aW4gPSBnZXRXaW5kb3coZmxvYXRpbmcpO1xuICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShldmVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2ZW50KTtcbiAgICAgIGlmICghY29udGFpbnMoZmxvYXRpbmcsIHRhcmdldCkpIHtcbiAgICAgICAgc2V0UmVmZXJlbmNlKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgIGNsZWFudXBMaXN0ZW5lclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50IHx8IGlzTW91c2VCYXNlZEV2ZW50KGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQpKSB7XG4gICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgICBjbGVhbnVwTGlzdGVuZXJSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICB9O1xuICAgICAgY2xlYW51cExpc3RlbmVyUmVmLmN1cnJlbnQgPSBjbGVhbnVwO1xuICAgICAgcmV0dXJuIGNsZWFudXA7XG4gICAgfVxuICAgIHJlZnMuc2V0UG9zaXRpb25SZWZlcmVuY2UoZG9tUmVmZXJlbmNlKTtcbiAgfSwgW29wZW5DaGVjaywgZW5hYmxlZCwgeCwgeSwgZmxvYXRpbmcsIGRhdGFSZWYsIHJlZnMsIGRvbVJlZmVyZW5jZSwgc2V0UmVmZXJlbmNlXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuIGFkZExpc3RlbmVyKCk7XG4gIH0sIFthZGRMaXN0ZW5lciwgcmVhY3RpdmVdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZW5hYmxlZCAmJiAhZmxvYXRpbmcpIHtcbiAgICAgIGluaXRpYWxSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cbiAgfSwgW2VuYWJsZWQsIGZsb2F0aW5nXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkICYmIG9wZW4pIHtcbiAgICAgIGluaXRpYWxSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgb3Blbl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGVuYWJsZWQgJiYgKHggIT0gbnVsbCB8fCB5ICE9IG51bGwpKSB7XG4gICAgICBpbml0aWFsUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHNldFJlZmVyZW5jZSh4LCB5KTtcbiAgICB9XG4gIH0sIFtlbmFibGVkLCB4LCB5LCBzZXRSZWZlcmVuY2VdKTtcbiAgY29uc3QgcmVmZXJlbmNlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgZnVuY3Rpb24gc2V0UG9pbnRlclR5cGVSZWYoX3JlZikge1xuICAgICAgbGV0IHtcbiAgICAgICAgcG9pbnRlclR5cGVcbiAgICAgIH0gPSBfcmVmO1xuICAgICAgc2V0UG9pbnRlclR5cGUocG9pbnRlclR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgb25Qb2ludGVyRG93bjogc2V0UG9pbnRlclR5cGVSZWYsXG4gICAgICBvblBvaW50ZXJFbnRlcjogc2V0UG9pbnRlclR5cGVSZWYsXG4gICAgICBvbk1vdXNlTW92ZTogaGFuZGxlUmVmZXJlbmNlRW50ZXJPck1vdmUsXG4gICAgICBvbk1vdXNlRW50ZXI6IGhhbmRsZVJlZmVyZW5jZUVudGVyT3JNb3ZlXG4gICAgfTtcbiAgfSwgW2hhbmRsZVJlZmVyZW5jZUVudGVyT3JNb3ZlXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IGVuYWJsZWQgPyB7XG4gICAgcmVmZXJlbmNlXG4gIH0gOiB7fSwgW2VuYWJsZWQsIHJlZmVyZW5jZV0pO1xufVxuXG5jb25zdCBidWJibGVIYW5kbGVyS2V5cyA9IHtcbiAgcG9pbnRlcmRvd246ICdvblBvaW50ZXJEb3duJyxcbiAgbW91c2Vkb3duOiAnb25Nb3VzZURvd24nLFxuICBjbGljazogJ29uQ2xpY2snXG59O1xuY29uc3QgY2FwdHVyZUhhbmRsZXJLZXlzID0ge1xuICBwb2ludGVyZG93bjogJ29uUG9pbnRlckRvd25DYXB0dXJlJyxcbiAgbW91c2Vkb3duOiAnb25Nb3VzZURvd25DYXB0dXJlJyxcbiAgY2xpY2s6ICdvbkNsaWNrQ2FwdHVyZSdcbn07XG5jb25zdCBub3JtYWxpemVQcm9wID0gbm9ybWFsaXphYmxlID0+IHtcbiAgdmFyIF9ub3JtYWxpemFibGUkZXNjYXBlSywgX25vcm1hbGl6YWJsZSRvdXRzaWRlO1xuICByZXR1cm4ge1xuICAgIGVzY2FwZUtleTogdHlwZW9mIG5vcm1hbGl6YWJsZSA9PT0gJ2Jvb2xlYW4nID8gbm9ybWFsaXphYmxlIDogKF9ub3JtYWxpemFibGUkZXNjYXBlSyA9IG5vcm1hbGl6YWJsZSA9PSBudWxsID8gdm9pZCAwIDogbm9ybWFsaXphYmxlLmVzY2FwZUtleSkgIT0gbnVsbCA/IF9ub3JtYWxpemFibGUkZXNjYXBlSyA6IGZhbHNlLFxuICAgIG91dHNpZGVQcmVzczogdHlwZW9mIG5vcm1hbGl6YWJsZSA9PT0gJ2Jvb2xlYW4nID8gbm9ybWFsaXphYmxlIDogKF9ub3JtYWxpemFibGUkb3V0c2lkZSA9IG5vcm1hbGl6YWJsZSA9PSBudWxsID8gdm9pZCAwIDogbm9ybWFsaXphYmxlLm91dHNpZGVQcmVzcykgIT0gbnVsbCA/IF9ub3JtYWxpemFibGUkb3V0c2lkZSA6IHRydWVcbiAgfTtcbn07XG4vKipcbiAqIENsb3NlcyB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGVuIGEgZGlzbWlzc2FsIGlzIHJlcXVlc3RlZCDigJQgYnkgZGVmYXVsdCwgd2hlblxuICogdGhlIHVzZXIgcHJlc3NlcyB0aGUgYGVzY2FwZWAga2V5IG9yIG91dHNpZGUgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlRGlzbWlzc1xuICovXG5mdW5jdGlvbiB1c2VEaXNtaXNzKGNvbnRleHQsIHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZWxlbWVudHMsXG4gICAgZGF0YVJlZlxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIGVzY2FwZUtleSA9IHRydWUsXG4gICAgb3V0c2lkZVByZXNzOiB1bnN0YWJsZV9vdXRzaWRlUHJlc3MgPSB0cnVlLFxuICAgIG91dHNpZGVQcmVzc0V2ZW50ID0gJ3BvaW50ZXJkb3duJyxcbiAgICByZWZlcmVuY2VQcmVzcyA9IGZhbHNlLFxuICAgIHJlZmVyZW5jZVByZXNzRXZlbnQgPSAncG9pbnRlcmRvd24nLFxuICAgIGFuY2VzdG9yU2Nyb2xsID0gZmFsc2UsXG4gICAgYnViYmxlcyxcbiAgICBjYXB0dXJlXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdHJlZSA9IHVzZUZsb2F0aW5nVHJlZSgpO1xuICBjb25zdCBvdXRzaWRlUHJlc3NGbiA9IHVzZUVmZmVjdEV2ZW50KHR5cGVvZiB1bnN0YWJsZV9vdXRzaWRlUHJlc3MgPT09ICdmdW5jdGlvbicgPyB1bnN0YWJsZV9vdXRzaWRlUHJlc3MgOiAoKSA9PiBmYWxzZSk7XG4gIGNvbnN0IG91dHNpZGVQcmVzcyA9IHR5cGVvZiB1bnN0YWJsZV9vdXRzaWRlUHJlc3MgPT09ICdmdW5jdGlvbicgPyBvdXRzaWRlUHJlc3NGbiA6IHVuc3RhYmxlX291dHNpZGVQcmVzcztcbiAgY29uc3QgaW5zaWRlUmVhY3RUcmVlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgZW5kZWRPclN0YXJ0ZWRJbnNpZGVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCB7XG4gICAgZXNjYXBlS2V5OiBlc2NhcGVLZXlCdWJibGVzLFxuICAgIG91dHNpZGVQcmVzczogb3V0c2lkZVByZXNzQnViYmxlc1xuICB9ID0gbm9ybWFsaXplUHJvcChidWJibGVzKTtcbiAgY29uc3Qge1xuICAgIGVzY2FwZUtleTogZXNjYXBlS2V5Q2FwdHVyZSxcbiAgICBvdXRzaWRlUHJlc3M6IG91dHNpZGVQcmVzc0NhcHR1cmVcbiAgfSA9IG5vcm1hbGl6ZVByb3AoY2FwdHVyZSk7XG4gIGNvbnN0IGNsb3NlT25Fc2NhcGVLZXlEb3duID0gdXNlRWZmZWN0RXZlbnQoZXZlbnQgPT4ge1xuICAgIHZhciBfZGF0YVJlZiRjdXJyZW50JGZsb2E7XG4gICAgaWYgKCFvcGVuIHx8ICFlbmFibGVkIHx8ICFlc2NhcGVLZXkgfHwgZXZlbnQua2V5ICE9PSAnRXNjYXBlJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBub2RlSWQgPSAoX2RhdGFSZWYkY3VycmVudCRmbG9hID0gZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhUmVmJGN1cnJlbnQkZmxvYS5ub2RlSWQ7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0cmVlID8gZ2V0Q2hpbGRyZW4odHJlZS5ub2Rlc1JlZi5jdXJyZW50LCBub2RlSWQpIDogW107XG4gICAgaWYgKCFlc2NhcGVLZXlCdWJibGVzKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBzaG91bGREaXNtaXNzID0gdHJ1ZTtcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgdmFyIF9jaGlsZCRjb250ZXh0O1xuICAgICAgICAgIGlmICgoX2NoaWxkJGNvbnRleHQgPSBjaGlsZC5jb250ZXh0KSAhPSBudWxsICYmIF9jaGlsZCRjb250ZXh0Lm9wZW4gJiYgIWNoaWxkLmNvbnRleHQuZGF0YVJlZi5jdXJyZW50Ll9fZXNjYXBlS2V5QnViYmxlcykge1xuICAgICAgICAgICAgc2hvdWxkRGlzbWlzcyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghc2hvdWxkRGlzbWlzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGlzUmVhY3RFdmVudChldmVudCkgPyBldmVudC5uYXRpdmVFdmVudCA6IGV2ZW50LCAnZXNjYXBlLWtleScpO1xuICB9KTtcbiAgY29uc3QgY2xvc2VPbkVzY2FwZUtleURvd25DYXB0dXJlID0gdXNlRWZmZWN0RXZlbnQoZXZlbnQgPT4ge1xuICAgIHZhciBfZ2V0VGFyZ2V0MjtcbiAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHZhciBfZ2V0VGFyZ2V0O1xuICAgICAgY2xvc2VPbkVzY2FwZUtleURvd24oZXZlbnQpO1xuICAgICAgKF9nZXRUYXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQpKSA9PSBudWxsIHx8IF9nZXRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIChfZ2V0VGFyZ2V0MiA9IGdldFRhcmdldChldmVudCkpID09IG51bGwgfHwgX2dldFRhcmdldDIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGNhbGxiYWNrKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NlT25QcmVzc091dHNpZGUgPSB1c2VFZmZlY3RFdmVudChldmVudCA9PiB7XG4gICAgdmFyIF9kYXRhUmVmJGN1cnJlbnQkZmxvYTI7XG4gICAgLy8gR2l2ZW4gZGV2ZWxvcGVycyBjYW4gc3RvcCB0aGUgcHJvcGFnYXRpb24gb2YgdGhlIHN5bnRoZXRpYyBldmVudCxcbiAgICAvLyB3ZSBjYW4gb25seSBiZSBjb25maWRlbnQgd2l0aCBhIHBvc2l0aXZlIHZhbHVlLlxuICAgIGNvbnN0IGluc2lkZVJlYWN0VHJlZSA9IGluc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50O1xuICAgIGluc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50ID0gZmFsc2U7XG5cbiAgICAvLyBXaGVuIGNsaWNrIG91dHNpZGUgaXMgbGF6eSAoYGNsaWNrYCBldmVudCksIGhhbmRsZSBkcmFnZ2luZy5cbiAgICAvLyBEb24ndCBjbG9zZSBpZjpcbiAgICAvLyAtIFRoZSBjbGljayBzdGFydGVkIGluc2lkZSB0aGUgZmxvYXRpbmcgZWxlbWVudC5cbiAgICAvLyAtIFRoZSBjbGljayBlbmRlZCBpbnNpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQuXG4gICAgY29uc3QgZW5kZWRPclN0YXJ0ZWRJbnNpZGUgPSBlbmRlZE9yU3RhcnRlZEluc2lkZVJlZi5jdXJyZW50O1xuICAgIGVuZGVkT3JTdGFydGVkSW5zaWRlUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBpZiAob3V0c2lkZVByZXNzRXZlbnQgPT09ICdjbGljaycgJiYgZW5kZWRPclN0YXJ0ZWRJbnNpZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluc2lkZVJlYWN0VHJlZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG91dHNpZGVQcmVzcyA9PT0gJ2Z1bmN0aW9uJyAmJiAhb3V0c2lkZVByZXNzKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQpO1xuICAgIGNvbnN0IGluZXJ0U2VsZWN0b3IgPSBcIltcIiArIGNyZWF0ZUF0dHJpYnV0ZSgnaW5lcnQnKSArIFwiXVwiO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBnZXREb2N1bWVudChlbGVtZW50cy5mbG9hdGluZykucXVlcnlTZWxlY3RvckFsbChpbmVydFNlbGVjdG9yKTtcbiAgICBsZXQgdGFyZ2V0Um9vdEFuY2VzdG9yID0gaXNFbGVtZW50KHRhcmdldCkgPyB0YXJnZXQgOiBudWxsO1xuICAgIHdoaWxlICh0YXJnZXRSb290QW5jZXN0b3IgJiYgIWlzTGFzdFRyYXZlcnNhYmxlTm9kZSh0YXJnZXRSb290QW5jZXN0b3IpKSB7XG4gICAgICBjb25zdCBuZXh0UGFyZW50ID0gZ2V0UGFyZW50Tm9kZSh0YXJnZXRSb290QW5jZXN0b3IpO1xuICAgICAgaWYgKGlzTGFzdFRyYXZlcnNhYmxlTm9kZShuZXh0UGFyZW50KSB8fCAhaXNFbGVtZW50KG5leHRQYXJlbnQpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGFyZ2V0Um9vdEFuY2VzdG9yID0gbmV4dFBhcmVudDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY2xpY2sgb2NjdXJyZWQgb24gYSB0aGlyZC1wYXJ0eSBlbGVtZW50IGluamVjdGVkIGFmdGVyIHRoZVxuICAgIC8vIGZsb2F0aW5nIGVsZW1lbnQgcmVuZGVyZWQuXG4gICAgaWYgKG1hcmtlcnMubGVuZ3RoICYmIGlzRWxlbWVudCh0YXJnZXQpICYmICFpc1Jvb3RFbGVtZW50KHRhcmdldCkgJiZcbiAgICAvLyBDbGlja2VkIG9uIGEgZGlyZWN0IGFuY2VzdG9yIChlLmcuIEZsb2F0aW5nT3ZlcmxheSkuXG4gICAgIWNvbnRhaW5zKHRhcmdldCwgZWxlbWVudHMuZmxvYXRpbmcpICYmXG4gICAgLy8gSWYgdGhlIHRhcmdldCByb290IGVsZW1lbnQgY29udGFpbnMgbm9uZSBvZiB0aGUgbWFya2VycywgdGhlbiB0aGVcbiAgICAvLyBlbGVtZW50IHdhcyBpbmplY3RlZCBhZnRlciB0aGUgZmxvYXRpbmcgZWxlbWVudCByZW5kZXJlZC5cbiAgICBBcnJheS5mcm9tKG1hcmtlcnMpLmV2ZXJ5KG1hcmtlciA9PiAhY29udGFpbnModGFyZ2V0Um9vdEFuY2VzdG9yLCBtYXJrZXIpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBjbGljayBvY2N1cnJlZCBvbiB0aGUgc2Nyb2xsYmFyXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQodGFyZ2V0KSAmJiBmbG9hdGluZykge1xuICAgICAgLy8gSW4gRmlyZWZveCwgYHRhcmdldC5zY3JvbGxXaWR0aCA+IHRhcmdldC5jbGllbnRXaWR0aGAgZm9yIGlubGluZVxuICAgICAgLy8gZWxlbWVudHMuXG4gICAgICBjb25zdCBjYW5TY3JvbGxYID0gdGFyZ2V0LmNsaWVudFdpZHRoID4gMCAmJiB0YXJnZXQuc2Nyb2xsV2lkdGggPiB0YXJnZXQuY2xpZW50V2lkdGg7XG4gICAgICBjb25zdCBjYW5TY3JvbGxZID0gdGFyZ2V0LmNsaWVudEhlaWdodCA+IDAgJiYgdGFyZ2V0LnNjcm9sbEhlaWdodCA+IHRhcmdldC5jbGllbnRIZWlnaHQ7XG4gICAgICBsZXQgeENvbmQgPSBjYW5TY3JvbGxZICYmIGV2ZW50Lm9mZnNldFggPiB0YXJnZXQuY2xpZW50V2lkdGg7XG5cbiAgICAgIC8vIEluIHNvbWUgYnJvd3NlcnMgaXQgaXMgcG9zc2libGUgdG8gY2hhbmdlIHRoZSA8Ym9keT4gKG9yIHdpbmRvdylcbiAgICAgIC8vIHNjcm9sbGJhciB0byB0aGUgbGVmdCBzaWRlLCBidXQgaXMgdmVyeSByYXJlIGFuZCBpcyBkaWZmaWN1bHQgdG9cbiAgICAgIC8vIGNoZWNrIGZvci4gUGx1cywgZm9yIG1vZGFsIGRpYWxvZ3Mgd2l0aCBiYWNrZHJvcHMsIGl0IGlzIG1vcmVcbiAgICAgIC8vIGltcG9ydGFudCB0aGF0IHRoZSBiYWNrZHJvcCBpcyBjaGVja2VkIGJ1dCBub3Qgc28gbXVjaCB0aGUgd2luZG93LlxuICAgICAgaWYgKGNhblNjcm9sbFkpIHtcbiAgICAgICAgY29uc3QgaXNSVEwgPSBnZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZGlyZWN0aW9uID09PSAncnRsJztcbiAgICAgICAgaWYgKGlzUlRMKSB7XG4gICAgICAgICAgeENvbmQgPSBldmVudC5vZmZzZXRYIDw9IHRhcmdldC5vZmZzZXRXaWR0aCAtIHRhcmdldC5jbGllbnRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHhDb25kIHx8IGNhblNjcm9sbFggJiYgZXZlbnQub2Zmc2V0WSA+IHRhcmdldC5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBub2RlSWQgPSAoX2RhdGFSZWYkY3VycmVudCRmbG9hMiA9IGRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfZGF0YVJlZiRjdXJyZW50JGZsb2EyLm5vZGVJZDtcbiAgICBjb25zdCB0YXJnZXRJc0luc2lkZUNoaWxkcmVuID0gdHJlZSAmJiBnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkuc29tZShub2RlID0+IHtcbiAgICAgIHZhciBfbm9kZSRjb250ZXh0O1xuICAgICAgcmV0dXJuIGlzRXZlbnRUYXJnZXRXaXRoaW4oZXZlbnQsIChfbm9kZSRjb250ZXh0ID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dC5lbGVtZW50cy5mbG9hdGluZyk7XG4gICAgfSk7XG4gICAgaWYgKGlzRXZlbnRUYXJnZXRXaXRoaW4oZXZlbnQsIGVsZW1lbnRzLmZsb2F0aW5nKSB8fCBpc0V2ZW50VGFyZ2V0V2l0aGluKGV2ZW50LCBlbGVtZW50cy5kb21SZWZlcmVuY2UpIHx8IHRhcmdldElzSW5zaWRlQ2hpbGRyZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0cmVlID8gZ2V0Q2hpbGRyZW4odHJlZS5ub2Rlc1JlZi5jdXJyZW50LCBub2RlSWQpIDogW107XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBzaG91bGREaXNtaXNzID0gdHJ1ZTtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICB2YXIgX2NoaWxkJGNvbnRleHQyO1xuICAgICAgICBpZiAoKF9jaGlsZCRjb250ZXh0MiA9IGNoaWxkLmNvbnRleHQpICE9IG51bGwgJiYgX2NoaWxkJGNvbnRleHQyLm9wZW4gJiYgIWNoaWxkLmNvbnRleHQuZGF0YVJlZi5jdXJyZW50Ll9fb3V0c2lkZVByZXNzQnViYmxlcykge1xuICAgICAgICAgIHNob3VsZERpc21pc3MgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFzaG91bGREaXNtaXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudCwgJ291dHNpZGUtcHJlc3MnKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NlT25QcmVzc091dHNpZGVDYXB0dXJlID0gdXNlRWZmZWN0RXZlbnQoZXZlbnQgPT4ge1xuICAgIHZhciBfZ2V0VGFyZ2V0NDtcbiAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHZhciBfZ2V0VGFyZ2V0MztcbiAgICAgIGNsb3NlT25QcmVzc091dHNpZGUoZXZlbnQpO1xuICAgICAgKF9nZXRUYXJnZXQzID0gZ2V0VGFyZ2V0KGV2ZW50KSkgPT0gbnVsbCB8fCBfZ2V0VGFyZ2V0My5yZW1vdmVFdmVudExpc3RlbmVyKG91dHNpZGVQcmVzc0V2ZW50LCBjYWxsYmFjayk7XG4gICAgfTtcbiAgICAoX2dldFRhcmdldDQgPSBnZXRUYXJnZXQoZXZlbnQpKSA9PSBudWxsIHx8IF9nZXRUYXJnZXQ0LmFkZEV2ZW50TGlzdGVuZXIob3V0c2lkZVByZXNzRXZlbnQsIGNhbGxiYWNrKTtcbiAgfSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuIHx8ICFlbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRhdGFSZWYuY3VycmVudC5fX2VzY2FwZUtleUJ1YmJsZXMgPSBlc2NhcGVLZXlCdWJibGVzO1xuICAgIGRhdGFSZWYuY3VycmVudC5fX291dHNpZGVQcmVzc0J1YmJsZXMgPSBvdXRzaWRlUHJlc3NCdWJibGVzO1xuICAgIGZ1bmN0aW9uIG9uU2Nyb2xsKGV2ZW50KSB7XG4gICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50LCAnYW5jZXN0b3Itc2Nyb2xsJyk7XG4gICAgfVxuICAgIGNvbnN0IGRvYyA9IGdldERvY3VtZW50KGVsZW1lbnRzLmZsb2F0aW5nKTtcbiAgICBlc2NhcGVLZXkgJiYgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlc2NhcGVLZXlDYXB0dXJlID8gY2xvc2VPbkVzY2FwZUtleURvd25DYXB0dXJlIDogY2xvc2VPbkVzY2FwZUtleURvd24sIGVzY2FwZUtleUNhcHR1cmUpO1xuICAgIG91dHNpZGVQcmVzcyAmJiBkb2MuYWRkRXZlbnRMaXN0ZW5lcihvdXRzaWRlUHJlc3NFdmVudCwgb3V0c2lkZVByZXNzQ2FwdHVyZSA/IGNsb3NlT25QcmVzc091dHNpZGVDYXB0dXJlIDogY2xvc2VPblByZXNzT3V0c2lkZSwgb3V0c2lkZVByZXNzQ2FwdHVyZSk7XG4gICAgbGV0IGFuY2VzdG9ycyA9IFtdO1xuICAgIGlmIChhbmNlc3RvclNjcm9sbCkge1xuICAgICAgaWYgKGlzRWxlbWVudChlbGVtZW50cy5kb21SZWZlcmVuY2UpKSB7XG4gICAgICAgIGFuY2VzdG9ycyA9IGdldE92ZXJmbG93QW5jZXN0b3JzKGVsZW1lbnRzLmRvbVJlZmVyZW5jZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNFbGVtZW50KGVsZW1lbnRzLmZsb2F0aW5nKSkge1xuICAgICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMuY29uY2F0KGdldE92ZXJmbG93QW5jZXN0b3JzKGVsZW1lbnRzLmZsb2F0aW5nKSk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzRWxlbWVudChlbGVtZW50cy5yZWZlcmVuY2UpICYmIGVsZW1lbnRzLnJlZmVyZW5jZSAmJiBlbGVtZW50cy5yZWZlcmVuY2UuY29udGV4dEVsZW1lbnQpIHtcbiAgICAgICAgYW5jZXN0b3JzID0gYW5jZXN0b3JzLmNvbmNhdChnZXRPdmVyZmxvd0FuY2VzdG9ycyhlbGVtZW50cy5yZWZlcmVuY2UuY29udGV4dEVsZW1lbnQpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZ25vcmUgdGhlIHZpc3VhbCB2aWV3cG9ydCBmb3Igc2Nyb2xsaW5nIGRpc21pc3NhbCAoYWxsb3cgcGluY2gtem9vbSlcbiAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMuZmlsdGVyKGFuY2VzdG9yID0+IHtcbiAgICAgIHZhciBfZG9jJGRlZmF1bHRWaWV3O1xuICAgICAgcmV0dXJuIGFuY2VzdG9yICE9PSAoKF9kb2MkZGVmYXVsdFZpZXcgPSBkb2MuZGVmYXVsdFZpZXcpID09IG51bGwgPyB2b2lkIDAgOiBfZG9jJGRlZmF1bHRWaWV3LnZpc3VhbFZpZXdwb3J0KTtcbiAgICB9KTtcbiAgICBhbmNlc3RvcnMuZm9yRWFjaChhbmNlc3RvciA9PiB7XG4gICAgICBhbmNlc3Rvci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbCwge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZXNjYXBlS2V5ICYmIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjYXBlS2V5Q2FwdHVyZSA/IGNsb3NlT25Fc2NhcGVLZXlEb3duQ2FwdHVyZSA6IGNsb3NlT25Fc2NhcGVLZXlEb3duLCBlc2NhcGVLZXlDYXB0dXJlKTtcbiAgICAgIG91dHNpZGVQcmVzcyAmJiBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcihvdXRzaWRlUHJlc3NFdmVudCwgb3V0c2lkZVByZXNzQ2FwdHVyZSA/IGNsb3NlT25QcmVzc091dHNpZGVDYXB0dXJlIDogY2xvc2VPblByZXNzT3V0c2lkZSwgb3V0c2lkZVByZXNzQ2FwdHVyZSk7XG4gICAgICBhbmNlc3RvcnMuZm9yRWFjaChhbmNlc3RvciA9PiB7XG4gICAgICAgIGFuY2VzdG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sIFtkYXRhUmVmLCBlbGVtZW50cywgZXNjYXBlS2V5LCBvdXRzaWRlUHJlc3MsIG91dHNpZGVQcmVzc0V2ZW50LCBvcGVuLCBvbk9wZW5DaGFuZ2UsIGFuY2VzdG9yU2Nyb2xsLCBlbmFibGVkLCBlc2NhcGVLZXlCdWJibGVzLCBvdXRzaWRlUHJlc3NCdWJibGVzLCBjbG9zZU9uRXNjYXBlS2V5RG93biwgZXNjYXBlS2V5Q2FwdHVyZSwgY2xvc2VPbkVzY2FwZUtleURvd25DYXB0dXJlLCBjbG9zZU9uUHJlc3NPdXRzaWRlLCBvdXRzaWRlUHJlc3NDYXB0dXJlLCBjbG9zZU9uUHJlc3NPdXRzaWRlQ2FwdHVyZV0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGluc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gIH0sIFtvdXRzaWRlUHJlc3MsIG91dHNpZGVQcmVzc0V2ZW50XSk7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBvbktleURvd246IGNsb3NlT25Fc2NhcGVLZXlEb3duLFxuICAgIFtidWJibGVIYW5kbGVyS2V5c1tyZWZlcmVuY2VQcmVzc0V2ZW50XV06IGV2ZW50ID0+IHtcbiAgICAgIGlmIChyZWZlcmVuY2VQcmVzcykge1xuICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAncmVmZXJlbmNlLXByZXNzJyk7XG4gICAgICB9XG4gICAgfVxuICB9KSwgW2Nsb3NlT25Fc2NhcGVLZXlEb3duLCBvbk9wZW5DaGFuZ2UsIHJlZmVyZW5jZVByZXNzLCByZWZlcmVuY2VQcmVzc0V2ZW50XSk7XG4gIGNvbnN0IGZsb2F0aW5nID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIG9uS2V5RG93bjogY2xvc2VPbkVzY2FwZUtleURvd24sXG4gICAgb25Nb3VzZURvd24oKSB7XG4gICAgICBlbmRlZE9yU3RhcnRlZEluc2lkZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9LFxuICAgIG9uTW91c2VVcCgpIHtcbiAgICAgIGVuZGVkT3JTdGFydGVkSW5zaWRlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH0sXG4gICAgW2NhcHR1cmVIYW5kbGVyS2V5c1tvdXRzaWRlUHJlc3NFdmVudF1dOiAoKSA9PiB7XG4gICAgICBpbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfVxuICB9KSwgW2Nsb3NlT25Fc2NhcGVLZXlEb3duLCBvdXRzaWRlUHJlc3NFdmVudF0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIHJlZmVyZW5jZSxcbiAgICBmbG9hdGluZ1xuICB9IDoge30sIFtlbmFibGVkLCByZWZlcmVuY2UsIGZsb2F0aW5nXSk7XG59XG5cbmZ1bmN0aW9uIHVzZUZsb2F0aW5nUm9vdENvbnRleHQob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgb3BlbiA9IGZhbHNlLFxuICAgIG9uT3BlbkNoYW5nZTogb25PcGVuQ2hhbmdlUHJvcCxcbiAgICBlbGVtZW50czogZWxlbWVudHNQcm9wXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBmbG9hdGluZ0lkID0gdXNlSWQoKTtcbiAgY29uc3QgZGF0YVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIGNvbnN0IFtldmVudHNdID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gY3JlYXRlUHViU3ViKCkpO1xuICBjb25zdCBuZXN0ZWQgPSB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCgpICE9IG51bGw7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBjb25zdCBvcHRpb25Eb21SZWZlcmVuY2UgPSBlbGVtZW50c1Byb3AucmVmZXJlbmNlO1xuICAgIGlmIChvcHRpb25Eb21SZWZlcmVuY2UgJiYgIWlzRWxlbWVudChvcHRpb25Eb21SZWZlcmVuY2UpKSB7XG4gICAgICBlcnJvcignQ2Fubm90IHBhc3MgYSB2aXJ0dWFsIGVsZW1lbnQgdG8gdGhlIGBlbGVtZW50cy5yZWZlcmVuY2VgIG9wdGlvbiwnLCAnYXMgaXQgbXVzdCBiZSBhIHJlYWwgRE9NIGVsZW1lbnQuIFVzZSBgcmVmcy5zZXRQb3NpdGlvblJlZmVyZW5jZSgpYCcsICdpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbcG9zaXRpb25SZWZlcmVuY2UsIHNldFBvc2l0aW9uUmVmZXJlbmNlXSA9IFJlYWN0LnVzZVN0YXRlKGVsZW1lbnRzUHJvcC5yZWZlcmVuY2UpO1xuICBjb25zdCBvbk9wZW5DaGFuZ2UgPSB1c2VFZmZlY3RFdmVudCgob3BlbiwgZXZlbnQsIHJlYXNvbikgPT4ge1xuICAgIGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQgPSBvcGVuID8gZXZlbnQgOiB1bmRlZmluZWQ7XG4gICAgZXZlbnRzLmVtaXQoJ29wZW5jaGFuZ2UnLCB7XG4gICAgICBvcGVuLFxuICAgICAgZXZlbnQsXG4gICAgICByZWFzb24sXG4gICAgICBuZXN0ZWRcbiAgICB9KTtcbiAgICBvbk9wZW5DaGFuZ2VQcm9wID09IG51bGwgfHwgb25PcGVuQ2hhbmdlUHJvcChvcGVuLCBldmVudCwgcmVhc29uKTtcbiAgfSk7XG4gIGNvbnN0IHJlZnMgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgc2V0UG9zaXRpb25SZWZlcmVuY2VcbiAgfSksIFtdKTtcbiAgY29uc3QgZWxlbWVudHMgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgcmVmZXJlbmNlOiBwb3NpdGlvblJlZmVyZW5jZSB8fCBlbGVtZW50c1Byb3AucmVmZXJlbmNlIHx8IG51bGwsXG4gICAgZmxvYXRpbmc6IGVsZW1lbnRzUHJvcC5mbG9hdGluZyB8fCBudWxsLFxuICAgIGRvbVJlZmVyZW5jZTogZWxlbWVudHNQcm9wLnJlZmVyZW5jZVxuICB9KSwgW3Bvc2l0aW9uUmVmZXJlbmNlLCBlbGVtZW50c1Byb3AucmVmZXJlbmNlLCBlbGVtZW50c1Byb3AuZmxvYXRpbmddKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBkYXRhUmVmLFxuICAgIG9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGVsZW1lbnRzLFxuICAgIGV2ZW50cyxcbiAgICBmbG9hdGluZ0lkLFxuICAgIHJlZnNcbiAgfSksIFtvcGVuLCBvbk9wZW5DaGFuZ2UsIGVsZW1lbnRzLCBldmVudHMsIGZsb2F0aW5nSWQsIHJlZnNdKTtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIHBvc2l0aW9uIGEgZmxvYXRpbmcgZWxlbWVudCBhbmQgY29udGV4dCB0byBhZGQgaW50ZXJhY3Rpb25zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUZsb2F0aW5nXG4gKi9cbmZ1bmN0aW9uIHVzZUZsb2F0aW5nKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgbm9kZUlkXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBpbnRlcm5hbFJvb3RDb250ZXh0ID0gdXNlRmxvYXRpbmdSb290Q29udGV4dCh7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBlbGVtZW50czoge1xuICAgICAgcmVmZXJlbmNlOiBudWxsLFxuICAgICAgZmxvYXRpbmc6IG51bGwsXG4gICAgICAuLi5vcHRpb25zLmVsZW1lbnRzXG4gICAgfVxuICB9KTtcbiAgY29uc3Qgcm9vdENvbnRleHQgPSBvcHRpb25zLnJvb3RDb250ZXh0IHx8IGludGVybmFsUm9vdENvbnRleHQ7XG4gIGNvbnN0IGNvbXB1dGVkRWxlbWVudHMgPSByb290Q29udGV4dC5lbGVtZW50cztcbiAgY29uc3QgW19kb21SZWZlcmVuY2UsIHNldERvbVJlZmVyZW5jZV0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW3Bvc2l0aW9uUmVmZXJlbmNlLCBfc2V0UG9zaXRpb25SZWZlcmVuY2VdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IG9wdGlvbkRvbVJlZmVyZW5jZSA9IGNvbXB1dGVkRWxlbWVudHMgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbXB1dGVkRWxlbWVudHMucmVmZXJlbmNlO1xuICBjb25zdCBkb21SZWZlcmVuY2UgPSBvcHRpb25Eb21SZWZlcmVuY2UgfHwgX2RvbVJlZmVyZW5jZTtcbiAgY29uc3QgZG9tUmVmZXJlbmNlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCB0cmVlID0gdXNlRmxvYXRpbmdUcmVlKCk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoZG9tUmVmZXJlbmNlKSB7XG4gICAgICBkb21SZWZlcmVuY2VSZWYuY3VycmVudCA9IGRvbVJlZmVyZW5jZTtcbiAgICB9XG4gIH0sIFtkb21SZWZlcmVuY2VdKTtcbiAgY29uc3QgcG9zaXRpb24gPSB1c2VGbG9hdGluZyQxKHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGVsZW1lbnRzOiB7XG4gICAgICAuLi5jb21wdXRlZEVsZW1lbnRzLFxuICAgICAgLi4uKHBvc2l0aW9uUmVmZXJlbmNlICYmIHtcbiAgICAgICAgcmVmZXJlbmNlOiBwb3NpdGlvblJlZmVyZW5jZVxuICAgICAgfSlcbiAgICB9XG4gIH0pO1xuICBjb25zdCBzZXRQb3NpdGlvblJlZmVyZW5jZSA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIGNvbnN0IGNvbXB1dGVkUG9zaXRpb25SZWZlcmVuY2UgPSBpc0VsZW1lbnQobm9kZSkgPyB7XG4gICAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3Q6ICgpID0+IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICBjb250ZXh0RWxlbWVudDogbm9kZVxuICAgIH0gOiBub2RlO1xuICAgIC8vIFN0b3JlIHRoZSBwb3NpdGlvblJlZmVyZW5jZSBpbiBzdGF0ZSBpZiB0aGUgRE9NIHJlZmVyZW5jZSBpcyBzcGVjaWZpZWQgZXh0ZXJuYWxseSB2aWEgdGhlXG4gICAgLy8gYGVsZW1lbnRzLnJlZmVyZW5jZWAgb3B0aW9uLiBUaGlzIGVuc3VyZXMgdGhhdCBpdCB3b24ndCBiZSBvdmVycmlkZGVuIG9uIGZ1dHVyZSByZW5kZXJzLlxuICAgIF9zZXRQb3NpdGlvblJlZmVyZW5jZShjb21wdXRlZFBvc2l0aW9uUmVmZXJlbmNlKTtcbiAgICBwb3NpdGlvbi5yZWZzLnNldFJlZmVyZW5jZShjb21wdXRlZFBvc2l0aW9uUmVmZXJlbmNlKTtcbiAgfSwgW3Bvc2l0aW9uLnJlZnNdKTtcbiAgY29uc3Qgc2V0UmVmZXJlbmNlID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgaWYgKGlzRWxlbWVudChub2RlKSB8fCBub2RlID09PSBudWxsKSB7XG4gICAgICBkb21SZWZlcmVuY2VSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICBzZXREb21SZWZlcmVuY2Uobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gQmFja3dhcmRzLWNvbXBhdGliaWxpdHkgZm9yIHBhc3NpbmcgYSB2aXJ0dWFsIGVsZW1lbnQgdG8gYHJlZmVyZW5jZWBcbiAgICAvLyBhZnRlciBpdCBoYXMgc2V0IHRoZSBET00gcmVmZXJlbmNlLlxuICAgIGlmIChpc0VsZW1lbnQocG9zaXRpb24ucmVmcy5yZWZlcmVuY2UuY3VycmVudCkgfHwgcG9zaXRpb24ucmVmcy5yZWZlcmVuY2UuY3VycmVudCA9PT0gbnVsbCB8fFxuICAgIC8vIERvbid0IGFsbG93IHNldHRpbmcgdmlydHVhbCBlbGVtZW50cyB1c2luZyB0aGUgb2xkIHRlY2huaXF1ZSBiYWNrIHRvXG4gICAgLy8gYG51bGxgIHRvIHN1cHBvcnQgYHBvc2l0aW9uUmVmZXJlbmNlYCArIGFuIHVuc3RhYmxlIGByZWZlcmVuY2VgXG4gICAgLy8gY2FsbGJhY2sgcmVmLlxuICAgIG5vZGUgIT09IG51bGwgJiYgIWlzRWxlbWVudChub2RlKSkge1xuICAgICAgcG9zaXRpb24ucmVmcy5zZXRSZWZlcmVuY2Uobm9kZSk7XG4gICAgfVxuICB9LCBbcG9zaXRpb24ucmVmc10pO1xuICBjb25zdCByZWZzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIC4uLnBvc2l0aW9uLnJlZnMsXG4gICAgc2V0UmVmZXJlbmNlLFxuICAgIHNldFBvc2l0aW9uUmVmZXJlbmNlLFxuICAgIGRvbVJlZmVyZW5jZTogZG9tUmVmZXJlbmNlUmVmXG4gIH0pLCBbcG9zaXRpb24ucmVmcywgc2V0UmVmZXJlbmNlLCBzZXRQb3NpdGlvblJlZmVyZW5jZV0pO1xuICBjb25zdCBlbGVtZW50cyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5wb3NpdGlvbi5lbGVtZW50cyxcbiAgICBkb21SZWZlcmVuY2U6IGRvbVJlZmVyZW5jZVxuICB9KSwgW3Bvc2l0aW9uLmVsZW1lbnRzLCBkb21SZWZlcmVuY2VdKTtcbiAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5wb3NpdGlvbixcbiAgICAuLi5yb290Q29udGV4dCxcbiAgICByZWZzLFxuICAgIGVsZW1lbnRzLFxuICAgIG5vZGVJZFxuICB9KSwgW3Bvc2l0aW9uLCByZWZzLCBlbGVtZW50cywgbm9kZUlkLCByb290Q29udGV4dF0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgcm9vdENvbnRleHQuZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgY29uc3Qgbm9kZSA9IHRyZWUgPT0gbnVsbCA/IHZvaWQgMCA6IHRyZWUubm9kZXNSZWYuY3VycmVudC5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gbm9kZUlkKTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgbm9kZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIC4uLnBvc2l0aW9uLFxuICAgIGNvbnRleHQsXG4gICAgcmVmcyxcbiAgICBlbGVtZW50c1xuICB9KSwgW3Bvc2l0aW9uLCByZWZzLCBlbGVtZW50cywgY29udGV4dF0pO1xufVxuXG4vKipcbiAqIE9wZW5zIHRoZSBmbG9hdGluZyBlbGVtZW50IHdoaWxlIHRoZSByZWZlcmVuY2UgZWxlbWVudCBoYXMgZm9jdXMsIGxpa2UgQ1NTXG4gKiBgOmZvY3VzYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VGb2N1c1xuICovXG5mdW5jdGlvbiB1c2VGb2N1cyhjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGV2ZW50cyxcbiAgICBkYXRhUmVmLFxuICAgIGVsZW1lbnRzXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgdmlzaWJsZU9ubHkgPSB0cnVlXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgYmxvY2tGb2N1c1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHRpbWVvdXRSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgY29uc3Qga2V5Ym9hcmRNb2RhbGl0eVJlZiA9IFJlYWN0LnVzZVJlZih0cnVlKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBjb25zdCB3aW4gPSBnZXRXaW5kb3coZWxlbWVudHMuZG9tUmVmZXJlbmNlKTtcblxuICAgIC8vIElmIHRoZSByZWZlcmVuY2Ugd2FzIGZvY3VzZWQgYW5kIHRoZSB1c2VyIGxlZnQgdGhlIHRhYi93aW5kb3csIGFuZCB0aGVcbiAgICAvLyBmbG9hdGluZyBlbGVtZW50IHdhcyBub3Qgb3BlbiwgdGhlIGZvY3VzIHNob3VsZCBiZSBibG9ja2VkIHdoZW4gdGhleVxuICAgIC8vIHJldHVybiB0byB0aGUgdGFiL3dpbmRvdy5cbiAgICBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgICBpZiAoIW9wZW4gJiYgaXNIVE1MRWxlbWVudChlbGVtZW50cy5kb21SZWZlcmVuY2UpICYmIGVsZW1lbnRzLmRvbVJlZmVyZW5jZSA9PT0gYWN0aXZlRWxlbWVudChnZXREb2N1bWVudChlbGVtZW50cy5kb21SZWZlcmVuY2UpKSkge1xuICAgICAgICBibG9ja0ZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvbktleURvd24oKSB7XG4gICAgICBrZXlib2FyZE1vZGFsaXR5UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cbiAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIG9uQmx1cik7XG4gICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24sIHRydWUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIG9uQmx1cik7XG4gICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgdHJ1ZSk7XG4gICAgfTtcbiAgfSwgW2VsZW1lbnRzLmRvbVJlZmVyZW5jZSwgb3BlbiwgZW5hYmxlZF0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIG9uT3BlbkNoYW5nZShfcmVmKSB7XG4gICAgICBsZXQge1xuICAgICAgICByZWFzb25cbiAgICAgIH0gPSBfcmVmO1xuICAgICAgaWYgKHJlYXNvbiA9PT0gJ3JlZmVyZW5jZS1wcmVzcycgfHwgcmVhc29uID09PSAnZXNjYXBlLWtleScpIHtcbiAgICAgICAgYmxvY2tGb2N1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXZlbnRzLm9uKCdvcGVuY2hhbmdlJywgb25PcGVuQ2hhbmdlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZXZlbnRzLm9mZignb3BlbmNoYW5nZScsIG9uT3BlbkNoYW5nZSk7XG4gICAgfTtcbiAgfSwgW2V2ZW50cywgZW5hYmxlZF0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBvblBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICBpZiAoaXNWaXJ0dWFsUG9pbnRlckV2ZW50KGV2ZW50Lm5hdGl2ZUV2ZW50KSkgcmV0dXJuO1xuICAgICAga2V5Ym9hcmRNb2RhbGl0eVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSxcbiAgICBvbk1vdXNlTGVhdmUoKSB7XG4gICAgICBibG9ja0ZvY3VzUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9LFxuICAgIG9uRm9jdXMoZXZlbnQpIHtcbiAgICAgIGlmIChibG9ja0ZvY3VzUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudC5uYXRpdmVFdmVudCk7XG4gICAgICBpZiAodmlzaWJsZU9ubHkgJiYgaXNFbGVtZW50KHRhcmdldCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBNYWMgU2FmYXJpIHVucmVsaWFibHkgbWF0Y2hlcyBgOmZvY3VzLXZpc2libGVgIG9uIHRoZSByZWZlcmVuY2VcbiAgICAgICAgICAvLyBpZiBmb2N1cyB3YXMgb3V0c2lkZSB0aGUgcGFnZSBpbml0aWFsbHkgLSB1c2UgdGhlIGZhbGxiYWNrXG4gICAgICAgICAgLy8gaW5zdGVhZC5cbiAgICAgICAgICBpZiAoaXNTYWZhcmkoKSAmJiBpc01hYygpKSB0aHJvdyBFcnJvcigpO1xuICAgICAgICAgIGlmICghdGFyZ2V0Lm1hdGNoZXMoJzpmb2N1cy12aXNpYmxlJykpIHJldHVybjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIE9sZCBicm93c2VycyB3aWxsIHRocm93IGFuIGVycm9yIHdoZW4gdXNpbmcgYDpmb2N1cy12aXNpYmxlYC5cbiAgICAgICAgICBpZiAoIWtleWJvYXJkTW9kYWxpdHlSZWYuY3VycmVudCAmJiAhaXNUeXBlYWJsZUVsZW1lbnQodGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnZm9jdXMnKTtcbiAgICB9LFxuICAgIG9uQmx1cihldmVudCkge1xuICAgICAgYmxvY2tGb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgICAgIGNvbnN0IG5hdGl2ZUV2ZW50ID0gZXZlbnQubmF0aXZlRXZlbnQ7XG5cbiAgICAgIC8vIEhpdCB0aGUgbm9uLW1vZGFsIGZvY3VzIG1hbmFnZW1lbnQgcG9ydGFsIGd1YXJkLiBGb2N1cyB3aWxsIGJlXG4gICAgICAvLyBtb3ZlZCBpbnRvIHRoZSBmbG9hdGluZyBlbGVtZW50IGltbWVkaWF0ZWx5IGFmdGVyLlxuICAgICAgY29uc3QgbW92ZWRUb0ZvY3VzR3VhcmQgPSBpc0VsZW1lbnQocmVsYXRlZFRhcmdldCkgJiYgcmVsYXRlZFRhcmdldC5oYXNBdHRyaWJ1dGUoY3JlYXRlQXR0cmlidXRlKCdmb2N1cy1ndWFyZCcpKSAmJiByZWxhdGVkVGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJykgPT09ICdvdXRzaWRlJztcblxuICAgICAgLy8gV2FpdCBmb3IgdGhlIHdpbmRvdyBibHVyIGxpc3RlbmVyIHRvIGZpcmUuXG4gICAgICB0aW1lb3V0UmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHZhciBfZGF0YVJlZiRjdXJyZW50JGZsb2E7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsID0gYWN0aXZlRWxlbWVudChlbGVtZW50cy5kb21SZWZlcmVuY2UgPyBlbGVtZW50cy5kb21SZWZlcmVuY2Uub3duZXJEb2N1bWVudCA6IGRvY3VtZW50KTtcblxuICAgICAgICAvLyBGb2N1cyBsZWZ0IHRoZSBwYWdlLCBrZWVwIGl0IG9wZW4uXG4gICAgICAgIGlmICghcmVsYXRlZFRhcmdldCAmJiBhY3RpdmVFbCA9PT0gZWxlbWVudHMuZG9tUmVmZXJlbmNlKSByZXR1cm47XG5cbiAgICAgICAgLy8gV2hlbiBmb2N1c2luZyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgKGUuZy4gcmVndWxhciBjbGljayksIHRoZW5cbiAgICAgICAgLy8gY2xpY2tpbmcgaW50byB0aGUgZmxvYXRpbmcgZWxlbWVudCwgcHJldmVudCBpdCBmcm9tIGhpZGluZy5cbiAgICAgICAgLy8gTm90ZTogaXQgbXVzdCBiZSBmb2N1c2FibGUsIGUuZy4gYHRhYmluZGV4PVwiLTFcImAuXG4gICAgICAgIC8vIFdlIGNhbiBub3QgcmVseSBvbiByZWxhdGVkVGFyZ2V0IHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IGVsZW1lbnRcbiAgICAgICAgLy8gYXMgaXQgd2lsbCBvbmx5IHBvaW50IHRvIHRoZSBzaGFkb3cgaG9zdCBvZiB0aGUgbmV3bHkgZm9jdXNlZCBlbGVtZW50XG4gICAgICAgIC8vIGFuZCBub3QgdGhlIGVsZW1lbnQgdGhhdCBhY3R1YWxseSBoYXMgcmVjZWl2ZWQgZm9jdXMgaWYgaXQgaXMgbG9jYXRlZFxuICAgICAgICAvLyBpbnNpZGUgYSBzaGFkb3cgcm9vdC5cbiAgICAgICAgaWYgKGNvbnRhaW5zKChfZGF0YVJlZiRjdXJyZW50JGZsb2EgPSBkYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX2RhdGFSZWYkY3VycmVudCRmbG9hLnJlZnMuZmxvYXRpbmcuY3VycmVudCwgYWN0aXZlRWwpIHx8IGNvbnRhaW5zKGVsZW1lbnRzLmRvbVJlZmVyZW5jZSwgYWN0aXZlRWwpIHx8IG1vdmVkVG9Gb2N1c0d1YXJkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgbmF0aXZlRXZlbnQsICdmb2N1cycpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KSwgW2RhdGFSZWYsIGVsZW1lbnRzLmRvbVJlZmVyZW5jZSwgb25PcGVuQ2hhbmdlLCB2aXNpYmxlT25seV0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIHJlZmVyZW5jZVxuICB9IDoge30sIFtlbmFibGVkLCByZWZlcmVuY2VdKTtcbn1cblxuY29uc3QgQUNUSVZFX0tFWSA9ICdhY3RpdmUnO1xuY29uc3QgU0VMRUNURURfS0VZID0gJ3NlbGVjdGVkJztcbmZ1bmN0aW9uIG1lcmdlUHJvcHModXNlclByb3BzLCBwcm9wc0xpc3QsIGVsZW1lbnRLZXkpIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBpc0l0ZW0gPSBlbGVtZW50S2V5ID09PSAnaXRlbSc7XG4gIGxldCBkb21Vc2VyUHJvcHMgPSB1c2VyUHJvcHM7XG4gIGlmIChpc0l0ZW0gJiYgdXNlclByb3BzKSB7XG4gICAgY29uc3Qge1xuICAgICAgW0FDVElWRV9LRVldOiBfLFxuICAgICAgW1NFTEVDVEVEX0tFWV06IF9fLFxuICAgICAgLi4udmFsaWRQcm9wc1xuICAgIH0gPSB1c2VyUHJvcHM7XG4gICAgZG9tVXNlclByb3BzID0gdmFsaWRQcm9wcztcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLihlbGVtZW50S2V5ID09PSAnZmxvYXRpbmcnICYmIHtcbiAgICAgIHRhYkluZGV4OiAtMVxuICAgIH0pLFxuICAgIC4uLmRvbVVzZXJQcm9wcyxcbiAgICAuLi5wcm9wc0xpc3QubWFwKHZhbHVlID0+IHtcbiAgICAgIGNvbnN0IHByb3BzT3JHZXRQcm9wcyA9IHZhbHVlID8gdmFsdWVbZWxlbWVudEtleV0gOiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBwcm9wc09yR2V0UHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHVzZXJQcm9wcyA/IHByb3BzT3JHZXRQcm9wcyh1c2VyUHJvcHMpIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wc09yR2V0UHJvcHM7XG4gICAgfSkuY29uY2F0KHVzZXJQcm9wcykucmVkdWNlKChhY2MsIHByb3BzKSA9PiB7XG4gICAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG4gICAgICBPYmplY3QuZW50cmllcyhwcm9wcykuZm9yRWFjaChfcmVmID0+IHtcbiAgICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IF9yZWY7XG4gICAgICAgIGlmIChpc0l0ZW0gJiYgW0FDVElWRV9LRVksIFNFTEVDVEVEX0tFWV0uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ29uJykgPT09IDApIHtcbiAgICAgICAgICBpZiAoIW1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgbWFwLnNldChrZXksIFtdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIF9tYXAkZ2V0O1xuICAgICAgICAgICAgKF9tYXAkZ2V0ID0gbWFwLmdldChrZXkpKSA9PSBudWxsIHx8IF9tYXAkZ2V0LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgYWNjW2tleV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBfbWFwJGdldDI7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIChfbWFwJGdldDIgPSBtYXAuZ2V0KGtleSkpID09IG51bGwgPyB2b2lkIDAgOiBfbWFwJGdldDIubWFwKGZuID0+IGZuKC4uLmFyZ3MpKS5maW5kKHZhbCA9PiB2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pXG4gIH07XG59XG4vKipcbiAqIE1lcmdlcyBhbiBhcnJheSBvZiBpbnRlcmFjdGlvbiBob29rcycgcHJvcHMgaW50byBwcm9wIGdldHRlcnMsIGFsbG93aW5nXG4gKiBldmVudCBoYW5kbGVyIGZ1bmN0aW9ucyB0byBiZSBjb21wb3NlZCB0b2dldGhlciB3aXRob3V0IG92ZXJ3cml0aW5nIG9uZVxuICogYW5vdGhlci5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VJbnRlcmFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gdXNlSW50ZXJhY3Rpb25zKHByb3BzTGlzdCkge1xuICBpZiAocHJvcHNMaXN0ID09PSB2b2lkIDApIHtcbiAgICBwcm9wc0xpc3QgPSBbXTtcbiAgfVxuICBjb25zdCByZWZlcmVuY2VEZXBzID0gcHJvcHNMaXN0Lm1hcChrZXkgPT4ga2V5ID09IG51bGwgPyB2b2lkIDAgOiBrZXkucmVmZXJlbmNlKTtcbiAgY29uc3QgZmxvYXRpbmdEZXBzID0gcHJvcHNMaXN0Lm1hcChrZXkgPT4ga2V5ID09IG51bGwgPyB2b2lkIDAgOiBrZXkuZmxvYXRpbmcpO1xuICBjb25zdCBpdGVtRGVwcyA9IHByb3BzTGlzdC5tYXAoa2V5ID0+IGtleSA9PSBudWxsID8gdm9pZCAwIDoga2V5Lml0ZW0pO1xuICBjb25zdCBnZXRSZWZlcmVuY2VQcm9wcyA9IFJlYWN0LnVzZUNhbGxiYWNrKHVzZXJQcm9wcyA9PiBtZXJnZVByb3BzKHVzZXJQcm9wcywgcHJvcHNMaXN0LCAncmVmZXJlbmNlJyksXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgcmVmZXJlbmNlRGVwcyk7XG4gIGNvbnN0IGdldEZsb2F0aW5nUHJvcHMgPSBSZWFjdC51c2VDYWxsYmFjayh1c2VyUHJvcHMgPT4gbWVyZ2VQcm9wcyh1c2VyUHJvcHMsIHByb3BzTGlzdCwgJ2Zsb2F0aW5nJyksXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgZmxvYXRpbmdEZXBzKTtcbiAgY29uc3QgZ2V0SXRlbVByb3BzID0gUmVhY3QudXNlQ2FsbGJhY2sodXNlclByb3BzID0+IG1lcmdlUHJvcHModXNlclByb3BzLCBwcm9wc0xpc3QsICdpdGVtJyksXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgaXRlbURlcHMpO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGdldFJlZmVyZW5jZVByb3BzLFxuICAgIGdldEZsb2F0aW5nUHJvcHMsXG4gICAgZ2V0SXRlbVByb3BzXG4gIH0pLCBbZ2V0UmVmZXJlbmNlUHJvcHMsIGdldEZsb2F0aW5nUHJvcHMsIGdldEl0ZW1Qcm9wc10pO1xufVxuXG5sZXQgaXNQcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gZmFsc2U7XG5mdW5jdGlvbiBkb1N3aXRjaChvcmllbnRhdGlvbiwgdmVydGljYWwsIGhvcml6b250YWwpIHtcbiAgc3dpdGNoIChvcmllbnRhdGlvbikge1xuICAgIGNhc2UgJ3ZlcnRpY2FsJzpcbiAgICAgIHJldHVybiB2ZXJ0aWNhbDtcbiAgICBjYXNlICdob3Jpem9udGFsJzpcbiAgICAgIHJldHVybiBob3Jpem9udGFsO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdmVydGljYWwgfHwgaG9yaXpvbnRhbDtcbiAgfVxufVxuZnVuY3Rpb24gaXNNYWluT3JpZW50YXRpb25LZXkoa2V5LCBvcmllbnRhdGlvbikge1xuICBjb25zdCB2ZXJ0aWNhbCA9IGtleSA9PT0gQVJST1dfVVAgfHwga2V5ID09PSBBUlJPV19ET1dOO1xuICBjb25zdCBob3Jpem9udGFsID0ga2V5ID09PSBBUlJPV19MRUZUIHx8IGtleSA9PT0gQVJST1dfUklHSFQ7XG4gIHJldHVybiBkb1N3aXRjaChvcmllbnRhdGlvbiwgdmVydGljYWwsIGhvcml6b250YWwpO1xufVxuZnVuY3Rpb24gaXNNYWluT3JpZW50YXRpb25Ub0VuZEtleShrZXksIG9yaWVudGF0aW9uLCBydGwpIHtcbiAgY29uc3QgdmVydGljYWwgPSBrZXkgPT09IEFSUk9XX0RPV047XG4gIGNvbnN0IGhvcml6b250YWwgPSBydGwgPyBrZXkgPT09IEFSUk9XX0xFRlQgOiBrZXkgPT09IEFSUk9XX1JJR0hUO1xuICByZXR1cm4gZG9Td2l0Y2gob3JpZW50YXRpb24sIHZlcnRpY2FsLCBob3Jpem9udGFsKSB8fCBrZXkgPT09ICdFbnRlcicgfHwga2V5ID09PSAnICcgfHwga2V5ID09PSAnJztcbn1cbmZ1bmN0aW9uIGlzQ3Jvc3NPcmllbnRhdGlvbk9wZW5LZXkoa2V5LCBvcmllbnRhdGlvbiwgcnRsKSB7XG4gIGNvbnN0IHZlcnRpY2FsID0gcnRsID8ga2V5ID09PSBBUlJPV19MRUZUIDoga2V5ID09PSBBUlJPV19SSUdIVDtcbiAgY29uc3QgaG9yaXpvbnRhbCA9IGtleSA9PT0gQVJST1dfRE9XTjtcbiAgcmV0dXJuIGRvU3dpdGNoKG9yaWVudGF0aW9uLCB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCk7XG59XG5mdW5jdGlvbiBpc0Nyb3NzT3JpZW50YXRpb25DbG9zZUtleShrZXksIG9yaWVudGF0aW9uLCBydGwpIHtcbiAgY29uc3QgdmVydGljYWwgPSBydGwgPyBrZXkgPT09IEFSUk9XX1JJR0hUIDoga2V5ID09PSBBUlJPV19MRUZUO1xuICBjb25zdCBob3Jpem9udGFsID0ga2V5ID09PSBBUlJPV19VUDtcbiAgcmV0dXJuIGRvU3dpdGNoKG9yaWVudGF0aW9uLCB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCk7XG59XG4vKipcbiAqIEFkZHMgYXJyb3cga2V5LWJhc2VkIG5hdmlnYXRpb24gb2YgYSBsaXN0IG9mIGl0ZW1zLCBlaXRoZXIgdXNpbmcgcmVhbCBET01cbiAqIGZvY3VzIG9yIHZpcnR1YWwgZm9jdXMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlTGlzdE5hdmlnYXRpb25cbiAqL1xuZnVuY3Rpb24gdXNlTGlzdE5hdmlnYXRpb24oY29udGV4dCwgcHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGVsZW1lbnRzXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgbGlzdFJlZixcbiAgICBhY3RpdmVJbmRleCxcbiAgICBvbk5hdmlnYXRlOiB1bnN0YWJsZV9vbk5hdmlnYXRlID0gKCkgPT4ge30sXG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgc2VsZWN0ZWRJbmRleCA9IG51bGwsXG4gICAgYWxsb3dFc2NhcGUgPSBmYWxzZSxcbiAgICBsb29wID0gZmFsc2UsXG4gICAgbmVzdGVkID0gZmFsc2UsXG4gICAgcnRsID0gZmFsc2UsXG4gICAgdmlydHVhbCA9IGZhbHNlLFxuICAgIGZvY3VzSXRlbU9uT3BlbiA9ICdhdXRvJyxcbiAgICBmb2N1c0l0ZW1PbkhvdmVyID0gdHJ1ZSxcbiAgICBvcGVuT25BcnJvd0tleURvd24gPSB0cnVlLFxuICAgIGRpc2FibGVkSW5kaWNlcyA9IHVuZGVmaW5lZCxcbiAgICBvcmllbnRhdGlvbiA9ICd2ZXJ0aWNhbCcsXG4gICAgY29scyA9IDEsXG4gICAgc2Nyb2xsSXRlbUludG9WaWV3ID0gdHJ1ZSxcbiAgICB2aXJ0dWFsSXRlbVJlZixcbiAgICBpdGVtU2l6ZXMsXG4gICAgZGVuc2UgPSBmYWxzZVxuICB9ID0gcHJvcHM7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAoYWxsb3dFc2NhcGUpIHtcbiAgICAgIGlmICghbG9vcCkge1xuICAgICAgICB3YXJuKCdgdXNlTGlzdE5hdmlnYXRpb25gIGxvb3BpbmcgbXVzdCBiZSBlbmFibGVkIHRvIGFsbG93IGVzY2FwaW5nLicpO1xuICAgICAgfVxuICAgICAgaWYgKCF2aXJ0dWFsKSB7XG4gICAgICAgIHdhcm4oJ2B1c2VMaXN0TmF2aWdhdGlvbmAgbXVzdCBiZSB2aXJ0dWFsIHRvIGFsbG93IGVzY2FwaW5nLicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgJiYgY29scyA+IDEpIHtcbiAgICAgIHdhcm4oJ0luIGdyaWQgbGlzdCBuYXZpZ2F0aW9uIG1vZGUgKGBjb2xzYCA+IDEpLCB0aGUgYG9yaWVudGF0aW9uYCBzaG91bGQnLCAnYmUgZWl0aGVyIFwiaG9yaXpvbnRhbFwiIG9yIFwiYm90aFwiLicpO1xuICAgIH1cbiAgfVxuICBjb25zdCBwYXJlbnRJZCA9IHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkKCk7XG4gIGNvbnN0IHRyZWUgPSB1c2VGbG9hdGluZ1RyZWUoKTtcbiAgY29uc3Qgb25OYXZpZ2F0ZSA9IHVzZUVmZmVjdEV2ZW50KHVuc3RhYmxlX29uTmF2aWdhdGUpO1xuICBjb25zdCBmb2N1c0l0ZW1Pbk9wZW5SZWYgPSBSZWFjdC51c2VSZWYoZm9jdXNJdGVtT25PcGVuKTtcbiAgY29uc3QgaW5kZXhSZWYgPSBSZWFjdC51c2VSZWYoc2VsZWN0ZWRJbmRleCAhPSBudWxsID8gc2VsZWN0ZWRJbmRleCA6IC0xKTtcbiAgY29uc3Qga2V5UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBpc1BvaW50ZXJNb2RhbGl0eVJlZiA9IFJlYWN0LnVzZVJlZih0cnVlKTtcbiAgY29uc3QgcHJldmlvdXNPbk5hdmlnYXRlUmVmID0gUmVhY3QudXNlUmVmKG9uTmF2aWdhdGUpO1xuICBjb25zdCBwcmV2aW91c01vdW50ZWRSZWYgPSBSZWFjdC51c2VSZWYoISFlbGVtZW50cy5mbG9hdGluZyk7XG4gIGNvbnN0IHByZXZpb3VzT3BlblJlZiA9IFJlYWN0LnVzZVJlZihvcGVuKTtcbiAgY29uc3QgZm9yY2VTeW5jRm9jdXMgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBmb3JjZVNjcm9sbEludG9WaWV3UmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgZGlzYWJsZWRJbmRpY2VzUmVmID0gdXNlTGF0ZXN0UmVmKGRpc2FibGVkSW5kaWNlcyk7XG4gIGNvbnN0IGxhdGVzdE9wZW5SZWYgPSB1c2VMYXRlc3RSZWYob3Blbik7XG4gIGNvbnN0IHNjcm9sbEl0ZW1JbnRvVmlld1JlZiA9IHVzZUxhdGVzdFJlZihzY3JvbGxJdGVtSW50b1ZpZXcpO1xuICBjb25zdCBmbG9hdGluZ1JlZiA9IHVzZUxhdGVzdFJlZihlbGVtZW50cy5mbG9hdGluZyk7XG4gIGNvbnN0IHNlbGVjdGVkSW5kZXhSZWYgPSB1c2VMYXRlc3RSZWYoc2VsZWN0ZWRJbmRleCk7XG4gIGNvbnN0IFthY3RpdmVJZCwgc2V0QWN0aXZlSWRdID0gUmVhY3QudXNlU3RhdGUoKTtcbiAgY29uc3QgW3ZpcnR1YWxJZCwgc2V0VmlydHVhbElkXSA9IFJlYWN0LnVzZVN0YXRlKCk7XG4gIGNvbnN0IGZvY3VzSXRlbSA9IHVzZUVmZmVjdEV2ZW50KGZ1bmN0aW9uIChsaXN0UmVmLCBpbmRleFJlZiwgZm9yY2VTY3JvbGxJbnRvVmlldykge1xuICAgIGlmIChmb3JjZVNjcm9sbEludG9WaWV3ID09PSB2b2lkIDApIHtcbiAgICAgIGZvcmNlU2Nyb2xsSW50b1ZpZXcgPSBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcnVuRm9jdXMoaXRlbSkge1xuICAgICAgaWYgKHZpcnR1YWwpIHtcbiAgICAgICAgc2V0QWN0aXZlSWQoaXRlbS5pZCk7XG4gICAgICAgIHRyZWUgPT0gbnVsbCB8fCB0cmVlLmV2ZW50cy5lbWl0KCd2aXJ0dWFsZm9jdXMnLCBpdGVtKTtcbiAgICAgICAgaWYgKHZpcnR1YWxJdGVtUmVmKSB7XG4gICAgICAgICAgdmlydHVhbEl0ZW1SZWYuY3VycmVudCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVucXVldWVGb2N1cyhpdGVtLCB7XG4gICAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZSxcbiAgICAgICAgICAvLyBNYWMgU2FmYXJpIGRvZXMgbm90IG1vdmUgdGhlIHZpcnR1YWwgY3Vyc29yIHVubGVzcyB0aGUgZm9jdXMgY2FsbFxuICAgICAgICAgIC8vIGlzIHN5bmMuIEhvd2V2ZXIsIGZvciB0aGUgdmVyeSBmaXJzdCBmb2N1cyBjYWxsLCB3ZSBuZWVkIHRvIHdhaXRcbiAgICAgICAgICAvLyBmb3IgdGhlIHBvc2l0aW9uIHRvIGJlIHJlYWR5IGluIG9yZGVyIHRvIHByZXZlbnQgdW53YW50ZWRcbiAgICAgICAgICAvLyBzY3JvbGxpbmcuIFRoaXMgbWVhbnMgdGhlIHZpcnR1YWwgY3Vyc29yIHdpbGwgbm90IG1vdmUgdG8gdGhlIGZpcnN0XG4gICAgICAgICAgLy8gaXRlbSB3aGVuIGZpcnN0IG9wZW5pbmcgdGhlIGZsb2F0aW5nIGVsZW1lbnQsIGJ1dCB3aWxsIG9uXG4gICAgICAgICAgLy8gc3Vic2VxdWVudCBjYWxscy4gYHByZXZlbnRTY3JvbGxgIGlzIHN1cHBvcnRlZCBpbiBtb2Rlcm4gU2FmYXJpLFxuICAgICAgICAgIC8vIHNvIHdlIGNhbiB1c2UgdGhhdCBpbnN0ZWFkLlxuICAgICAgICAgIC8vIGlPUyBTYWZhcmkgbXVzdCBiZSBhc3luYyBvciB0aGUgZmlyc3QgaXRlbSB3aWxsIG5vdCBiZSBmb2N1c2VkLlxuICAgICAgICAgIHN5bmM6IGlzTWFjKCkgJiYgaXNTYWZhcmkoKSA/IGlzUHJldmVudFNjcm9sbFN1cHBvcnRlZCB8fCBmb3JjZVN5bmNGb2N1cy5jdXJyZW50IDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGluaXRpYWxJdGVtID0gbGlzdFJlZi5jdXJyZW50W2luZGV4UmVmLmN1cnJlbnRdO1xuICAgIGlmIChpbml0aWFsSXRlbSkge1xuICAgICAgcnVuRm9jdXMoaW5pdGlhbEl0ZW0pO1xuICAgIH1cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3Qgd2FpdGVkSXRlbSA9IGxpc3RSZWYuY3VycmVudFtpbmRleFJlZi5jdXJyZW50XSB8fCBpbml0aWFsSXRlbTtcbiAgICAgIGlmICghd2FpdGVkSXRlbSkgcmV0dXJuO1xuICAgICAgaWYgKCFpbml0aWFsSXRlbSkge1xuICAgICAgICBydW5Gb2N1cyh3YWl0ZWRJdGVtKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjcm9sbEludG9WaWV3T3B0aW9ucyA9IHNjcm9sbEl0ZW1JbnRvVmlld1JlZi5jdXJyZW50O1xuICAgICAgY29uc3Qgc2hvdWxkU2Nyb2xsSW50b1ZpZXcgPSBzY3JvbGxJbnRvVmlld09wdGlvbnMgJiYgaXRlbSAmJiAoZm9yY2VTY3JvbGxJbnRvVmlldyB8fCAhaXNQb2ludGVyTW9kYWxpdHlSZWYuY3VycmVudCk7XG4gICAgICBpZiAoc2hvdWxkU2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgLy8gSlNET00gZG9lc24ndCBzdXBwb3J0IGAuc2Nyb2xsSW50b1ZpZXcoKWAgYnV0IGl0J3Mgd2lkZWx5IHN1cHBvcnRlZFxuICAgICAgICAvLyBieSBhbGwgYnJvd3NlcnMuXG4gICAgICAgIHdhaXRlZEl0ZW0uc2Nyb2xsSW50b1ZpZXcgPT0gbnVsbCB8fCB3YWl0ZWRJdGVtLnNjcm9sbEludG9WaWV3KHR5cGVvZiBzY3JvbGxJbnRvVmlld09wdGlvbnMgPT09ICdib29sZWFuJyA/IHtcbiAgICAgICAgICBibG9jazogJ25lYXJlc3QnLFxuICAgICAgICAgIGlubGluZTogJ25lYXJlc3QnXG4gICAgICAgIH0gOiBzY3JvbGxJbnRvVmlld09wdGlvbnMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLmZvY3VzKHtcbiAgICAgIGdldCBwcmV2ZW50U2Nyb2xsKCkge1xuICAgICAgICBpc1ByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIFtdKTtcblxuICAvLyBTeW5jIGBzZWxlY3RlZEluZGV4YCB0byBiZSB0aGUgYGFjdGl2ZUluZGV4YCB1cG9uIG9wZW5pbmcgdGhlIGZsb2F0aW5nXG4gIC8vIGVsZW1lbnQuIEFsc28sIHJlc2V0IGBhY3RpdmVJbmRleGAgdXBvbiBjbG9zaW5nIHRoZSBmbG9hdGluZyBlbGVtZW50LlxuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgaWYgKG9wZW4gJiYgZWxlbWVudHMuZmxvYXRpbmcpIHtcbiAgICAgIGlmIChmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCAmJiBzZWxlY3RlZEluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgLy8gUmVnYXJkbGVzcyBvZiB0aGUgcG9pbnRlciBtb2RhbGl0eSwgd2Ugd2FudCB0byBlbnN1cmUgdGhlIHNlbGVjdGVkXG4gICAgICAgIC8vIGl0ZW0gY29tZXMgaW50byB2aWV3IHdoZW4gdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXMgb3BlbmVkLlxuICAgICAgICBmb3JjZVNjcm9sbEludG9WaWV3UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gc2VsZWN0ZWRJbmRleDtcbiAgICAgICAgb25OYXZpZ2F0ZShzZWxlY3RlZEluZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZXZpb3VzTW91bnRlZFJlZi5jdXJyZW50KSB7XG4gICAgICAvLyBTaW5jZSB0aGUgdXNlciBjYW4gc3BlY2lmeSBgb25OYXZpZ2F0ZWAgY29uZGl0aW9uYWxseVxuICAgICAgLy8gKG9uTmF2aWdhdGU6IG9wZW4gPyBzZXRBY3RpdmVJbmRleCA6IHNldFNlbGVjdGVkSW5kZXgpLFxuICAgICAgLy8gd2Ugc3RvcmUgYW5kIGNhbGwgdGhlIHByZXZpb3VzIGZ1bmN0aW9uLlxuICAgICAgaW5kZXhSZWYuY3VycmVudCA9IC0xO1xuICAgICAgcHJldmlvdXNPbk5hdmlnYXRlUmVmLmN1cnJlbnQobnVsbCk7XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgb3BlbiwgZWxlbWVudHMuZmxvYXRpbmcsIHNlbGVjdGVkSW5kZXgsIG9uTmF2aWdhdGVdKTtcblxuICAvLyBTeW5jIGBhY3RpdmVJbmRleGAgdG8gYmUgdGhlIGZvY3VzZWQgaXRlbSB3aGlsZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBpc1xuICAvLyBvcGVuLlxuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgaWYgKG9wZW4gJiYgZWxlbWVudHMuZmxvYXRpbmcpIHtcbiAgICAgIGlmIChhY3RpdmVJbmRleCA9PSBudWxsKSB7XG4gICAgICAgIGZvcmNlU3luY0ZvY3VzLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXhSZWYuY3VycmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgd2hpbGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgd2FzIG9wZW4gKGUuZy4gdGhlIGxpc3QgY2hhbmdlZCkuXG4gICAgICAgIGlmIChwcmV2aW91c01vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICAgICAgICBmb2N1c0l0ZW0obGlzdFJlZiwgaW5kZXhSZWYpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbCBzeW5jLlxuICAgICAgICBpZiAoKCFwcmV2aW91c09wZW5SZWYuY3VycmVudCB8fCAhcHJldmlvdXNNb3VudGVkUmVmLmN1cnJlbnQpICYmIGZvY3VzSXRlbU9uT3BlblJlZi5jdXJyZW50ICYmIChrZXlSZWYuY3VycmVudCAhPSBudWxsIHx8IGZvY3VzSXRlbU9uT3BlblJlZi5jdXJyZW50ID09PSB0cnVlICYmIGtleVJlZi5jdXJyZW50ID09IG51bGwpKSB7XG4gICAgICAgICAgbGV0IHJ1bnMgPSAwO1xuICAgICAgICAgIGNvbnN0IHdhaXRGb3JMaXN0UG9wdWxhdGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGxpc3RSZWYuY3VycmVudFswXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIEF2b2lkIGxldHRpbmcgdGhlIGJyb3dzZXIgcGFpbnQgaWYgcG9zc2libGUgb24gdGhlIGZpcnN0IHRyeSxcbiAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSByQUYuIERvbid0IHRyeSBtb3JlIHRoYW4gdHdpY2UsIHNpbmNlIHNvbWV0aGluZ1xuICAgICAgICAgICAgICAvLyBpcyB3cm9uZyBvdGhlcndpc2UuXG4gICAgICAgICAgICAgIGlmIChydW5zIDwgMikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVkdWxlciA9IHJ1bnMgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgOiBxdWV1ZU1pY3JvdGFzaztcbiAgICAgICAgICAgICAgICBzY2hlZHVsZXIod2FpdEZvckxpc3RQb3B1bGF0ZWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJ1bnMrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBrZXlSZWYuY3VycmVudCA9PSBudWxsIHx8IGlzTWFpbk9yaWVudGF0aW9uVG9FbmRLZXkoa2V5UmVmLmN1cnJlbnQsIG9yaWVudGF0aW9uLCBydGwpIHx8IG5lc3RlZCA/IGdldE1pbkluZGV4KGxpc3RSZWYsIGRpc2FibGVkSW5kaWNlc1JlZi5jdXJyZW50KSA6IGdldE1heEluZGV4KGxpc3RSZWYsIGRpc2FibGVkSW5kaWNlc1JlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAga2V5UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgd2FpdEZvckxpc3RQb3B1bGF0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaXNJbmRleE91dE9mQm91bmRzKGxpc3RSZWYsIGFjdGl2ZUluZGV4KSkge1xuICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gYWN0aXZlSW5kZXg7XG4gICAgICAgIGZvY3VzSXRlbShsaXN0UmVmLCBpbmRleFJlZiwgZm9yY2VTY3JvbGxJbnRvVmlld1JlZi5jdXJyZW50KTtcbiAgICAgICAgZm9yY2VTY3JvbGxJbnRvVmlld1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgb3BlbiwgZWxlbWVudHMuZmxvYXRpbmcsIGFjdGl2ZUluZGV4LCBzZWxlY3RlZEluZGV4UmVmLCBuZXN0ZWQsIGxpc3RSZWYsIG9yaWVudGF0aW9uLCBydGwsIG9uTmF2aWdhdGUsIGZvY3VzSXRlbSwgZGlzYWJsZWRJbmRpY2VzUmVmXSk7XG5cbiAgLy8gRW5zdXJlIHRoZSBwYXJlbnQgZmxvYXRpbmcgZWxlbWVudCBoYXMgZm9jdXMgd2hlbiBhIG5lc3RlZCBjaGlsZCBjbG9zZXNcbiAgLy8gdG8gYWxsb3cgYXJyb3cga2V5IG5hdmlnYXRpb24gdG8gd29yayBhZnRlciB0aGUgcG9pbnRlciBsZWF2ZXMgdGhlIGNoaWxkLlxuICBpbmRleCgoKSA9PiB7XG4gICAgdmFyIF9ub2RlcyRmaW5kO1xuICAgIGlmICghZW5hYmxlZCB8fCBlbGVtZW50cy5mbG9hdGluZyB8fCAhdHJlZSB8fCB2aXJ0dWFsIHx8ICFwcmV2aW91c01vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBub2RlcyA9IHRyZWUubm9kZXNSZWYuY3VycmVudDtcbiAgICBjb25zdCBwYXJlbnQgPSAoX25vZGVzJGZpbmQgPSBub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gcGFyZW50SWQpKSA9PSBudWxsIHx8IChfbm9kZXMkZmluZCA9IF9ub2RlcyRmaW5kLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZXMkZmluZC5lbGVtZW50cy5mbG9hdGluZztcbiAgICBjb25zdCBhY3RpdmVFbCA9IGFjdGl2ZUVsZW1lbnQoZ2V0RG9jdW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpKTtcbiAgICBjb25zdCB0cmVlQ29udGFpbnNBY3RpdmVFbCA9IG5vZGVzLnNvbWUobm9kZSA9PiBub2RlLmNvbnRleHQgJiYgY29udGFpbnMobm9kZS5jb250ZXh0LmVsZW1lbnRzLmZsb2F0aW5nLCBhY3RpdmVFbCkpO1xuICAgIGlmIChwYXJlbnQgJiYgIXRyZWVDb250YWluc0FjdGl2ZUVsICYmIGlzUG9pbnRlck1vZGFsaXR5UmVmLmN1cnJlbnQpIHtcbiAgICAgIHBhcmVudC5mb2N1cyh7XG4gICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW2VuYWJsZWQsIGVsZW1lbnRzLmZsb2F0aW5nLCB0cmVlLCBwYXJlbnRJZCwgdmlydHVhbF0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgaWYgKCF0cmVlKSByZXR1cm47XG4gICAgaWYgKCF2aXJ0dWFsKSByZXR1cm47XG4gICAgaWYgKHBhcmVudElkKSByZXR1cm47XG4gICAgZnVuY3Rpb24gaGFuZGxlVmlydHVhbEZvY3VzKGl0ZW0pIHtcbiAgICAgIHNldFZpcnR1YWxJZChpdGVtLmlkKTtcbiAgICAgIGlmICh2aXJ0dWFsSXRlbVJlZikge1xuICAgICAgICB2aXJ0dWFsSXRlbVJlZi5jdXJyZW50ID0gaXRlbTtcbiAgICAgIH1cbiAgICB9XG4gICAgdHJlZS5ldmVudHMub24oJ3ZpcnR1YWxmb2N1cycsIGhhbmRsZVZpcnR1YWxGb2N1cyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRyZWUuZXZlbnRzLm9mZigndmlydHVhbGZvY3VzJywgaGFuZGxlVmlydHVhbEZvY3VzKTtcbiAgICB9O1xuICB9LCBbZW5hYmxlZCwgdHJlZSwgdmlydHVhbCwgcGFyZW50SWQsIHZpcnR1YWxJdGVtUmVmXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBwcmV2aW91c09uTmF2aWdhdGVSZWYuY3VycmVudCA9IG9uTmF2aWdhdGU7XG4gICAgcHJldmlvdXNNb3VudGVkUmVmLmN1cnJlbnQgPSAhIWVsZW1lbnRzLmZsb2F0aW5nO1xuICB9KTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghb3Blbikge1xuICAgICAga2V5UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfSwgW29wZW5dKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIHByZXZpb3VzT3BlblJlZi5jdXJyZW50ID0gb3BlbjtcbiAgfSwgW29wZW5dKTtcbiAgY29uc3QgaGFzQWN0aXZlSW5kZXggPSBhY3RpdmVJbmRleCAhPSBudWxsO1xuICBjb25zdCBpdGVtID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgZnVuY3Rpb24gc3luY0N1cnJlbnRUYXJnZXQoY3VycmVudFRhcmdldCkge1xuICAgICAgaWYgKCFvcGVuKSByZXR1cm47XG4gICAgICBjb25zdCBpbmRleCA9IGxpc3RSZWYuY3VycmVudC5pbmRleE9mKGN1cnJlbnRUYXJnZXQpO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBvbk5hdmlnYXRlKGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICBvbkZvY3VzKF9yZWYpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBjdXJyZW50VGFyZ2V0XG4gICAgICAgIH0gPSBfcmVmO1xuICAgICAgICBzeW5jQ3VycmVudFRhcmdldChjdXJyZW50VGFyZ2V0KTtcbiAgICAgIH0sXG4gICAgICBvbkNsaWNrOiBfcmVmMiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgY3VycmVudFRhcmdldFxuICAgICAgICB9ID0gX3JlZjI7XG4gICAgICAgIHJldHVybiBjdXJyZW50VGFyZ2V0LmZvY3VzKHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8vIFNhZmFyaVxuICAgICAgLi4uKGZvY3VzSXRlbU9uSG92ZXIgJiYge1xuICAgICAgICBvbk1vdXNlTW92ZShfcmVmMykge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0XG4gICAgICAgICAgfSA9IF9yZWYzO1xuICAgICAgICAgIHN5bmNDdXJyZW50VGFyZ2V0KGN1cnJlbnRUYXJnZXQpO1xuICAgICAgICB9LFxuICAgICAgICBvblBvaW50ZXJMZWF2ZShfcmVmNCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBwb2ludGVyVHlwZVxuICAgICAgICAgIH0gPSBfcmVmNDtcbiAgICAgICAgICBpZiAoIWlzUG9pbnRlck1vZGFsaXR5UmVmLmN1cnJlbnQgfHwgcG9pbnRlclR5cGUgPT09ICd0b3VjaCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IC0xO1xuICAgICAgICAgIGZvY3VzSXRlbShsaXN0UmVmLCBpbmRleFJlZik7XG4gICAgICAgICAgb25OYXZpZ2F0ZShudWxsKTtcbiAgICAgICAgICBpZiAoIXZpcnR1YWwpIHtcbiAgICAgICAgICAgIGVucXVldWVGb2N1cyhmbG9hdGluZ1JlZi5jdXJyZW50LCB7XG4gICAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9O1xuICAgIHJldHVybiBwcm9wcztcbiAgfSwgW29wZW4sIGZsb2F0aW5nUmVmLCBmb2N1c0l0ZW0sIGZvY3VzSXRlbU9uSG92ZXIsIGxpc3RSZWYsIG9uTmF2aWdhdGUsIHZpcnR1YWxdKTtcbiAgY29uc3QgY29tbW9uT25LZXlEb3duID0gdXNlRWZmZWN0RXZlbnQoZXZlbnQgPT4ge1xuICAgIGlzUG9pbnRlck1vZGFsaXR5UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBmb3JjZVN5bmNGb2N1cy5jdXJyZW50ID0gdHJ1ZTtcblxuICAgIC8vIElmIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzIGFuaW1hdGluZyBvdXQsIGlnbm9yZSBuYXZpZ2F0aW9uLiBPdGhlcndpc2UsXG4gICAgLy8gdGhlIGBhY3RpdmVJbmRleGAgZ2V0cyBzZXQgdG8gMCBkZXNwaXRlIG5vdCBiZWluZyBvcGVuIHNvIHRoZSBuZXh0IHRpbWVcbiAgICAvLyB0aGUgdXNlciBBcnJvd0Rvd25zLCB0aGUgZmlyc3QgaXRlbSB3b24ndCBiZSBmb2N1c2VkLlxuICAgIGlmICghbGF0ZXN0T3BlblJlZi5jdXJyZW50ICYmIGV2ZW50LmN1cnJlbnRUYXJnZXQgPT09IGZsb2F0aW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5lc3RlZCAmJiBpc0Nyb3NzT3JpZW50YXRpb25DbG9zZUtleShldmVudC5rZXksIG9yaWVudGF0aW9uLCBydGwpKSB7XG4gICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCwgJ2xpc3QtbmF2aWdhdGlvbicpO1xuICAgICAgaWYgKGlzSFRNTEVsZW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlKSAmJiAhdmlydHVhbCkge1xuICAgICAgICBlbGVtZW50cy5kb21SZWZlcmVuY2UuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gaW5kZXhSZWYuY3VycmVudDtcbiAgICBjb25zdCBtaW5JbmRleCA9IGdldE1pbkluZGV4KGxpc3RSZWYsIGRpc2FibGVkSW5kaWNlcyk7XG4gICAgY29uc3QgbWF4SW5kZXggPSBnZXRNYXhJbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXMpO1xuICAgIGlmIChldmVudC5rZXkgPT09ICdIb21lJykge1xuICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBtaW5JbmRleDtcbiAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbmQnKSB7XG4gICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgaW5kZXhSZWYuY3VycmVudCA9IG1heEluZGV4O1xuICAgICAgb25OYXZpZ2F0ZShpbmRleFJlZi5jdXJyZW50KTtcbiAgICB9XG5cbiAgICAvLyBHcmlkIG5hdmlnYXRpb24uXG4gICAgaWYgKGNvbHMgPiAxKSB7XG4gICAgICBjb25zdCBzaXplcyA9IGl0ZW1TaXplcyB8fCBBcnJheS5mcm9tKHtcbiAgICAgICAgbGVuZ3RoOiBsaXN0UmVmLmN1cnJlbnQubGVuZ3RoXG4gICAgICB9LCAoKSA9PiAoe1xuICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgaGVpZ2h0OiAxXG4gICAgICB9KSk7XG4gICAgICAvLyBUbyBjYWxjdWxhdGUgbW92ZW1lbnRzIG9uIHRoZSBncmlkLCB3ZSB1c2UgaHlwb3RoZXRpY2FsIGNlbGwgaW5kaWNlc1xuICAgICAgLy8gYXMgaWYgZXZlcnkgaXRlbSB3YXMgMXgxLCB0aGVuIGNvbnZlcnQgYmFjayB0byByZWFsIGluZGljZXMuXG4gICAgICBjb25zdCBjZWxsTWFwID0gYnVpbGRDZWxsTWFwKHNpemVzLCBjb2xzLCBkZW5zZSk7XG4gICAgICBjb25zdCBtaW5HcmlkSW5kZXggPSBjZWxsTWFwLmZpbmRJbmRleChpbmRleCA9PiBpbmRleCAhPSBudWxsICYmICFpc0Rpc2FibGVkKGxpc3RSZWYuY3VycmVudCwgaW5kZXgsIGRpc2FibGVkSW5kaWNlcykpO1xuICAgICAgLy8gbGFzdCBlbmFibGVkIGluZGV4XG4gICAgICBjb25zdCBtYXhHcmlkSW5kZXggPSBjZWxsTWFwLnJlZHVjZSgoZm91bmRJbmRleCwgaW5kZXgsIGNlbGxJbmRleCkgPT4gaW5kZXggIT0gbnVsbCAmJiAhaXNEaXNhYmxlZChsaXN0UmVmLmN1cnJlbnQsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpID8gY2VsbEluZGV4IDogZm91bmRJbmRleCwgLTEpO1xuICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGNlbGxNYXBbZ2V0R3JpZE5hdmlnYXRlZEluZGV4KHtcbiAgICAgICAgY3VycmVudDogY2VsbE1hcC5tYXAoaXRlbUluZGV4ID0+IGl0ZW1JbmRleCAhPSBudWxsID8gbGlzdFJlZi5jdXJyZW50W2l0ZW1JbmRleF0gOiBudWxsKVxuICAgICAgfSwge1xuICAgICAgICBldmVudCxcbiAgICAgICAgb3JpZW50YXRpb24sXG4gICAgICAgIGxvb3AsXG4gICAgICAgIGNvbHMsXG4gICAgICAgIC8vIHRyZWF0IHVuZGVmaW5lZCAoZW1wdHkgZ3JpZCBzcGFjZXMpIGFzIGRpc2FibGVkIGluZGljZXMgc28gd2VcbiAgICAgICAgLy8gZG9uJ3QgZW5kIHVwIGluIHRoZW1cbiAgICAgICAgZGlzYWJsZWRJbmRpY2VzOiBnZXRDZWxsSW5kaWNlcyhbLi4uKGRpc2FibGVkSW5kaWNlcyB8fCBsaXN0UmVmLmN1cnJlbnQubWFwKChfLCBpbmRleCkgPT4gaXNEaXNhYmxlZChsaXN0UmVmLmN1cnJlbnQsIGluZGV4KSA/IGluZGV4IDogdW5kZWZpbmVkKSksIHVuZGVmaW5lZF0sIGNlbGxNYXApLFxuICAgICAgICBtaW5JbmRleDogbWluR3JpZEluZGV4LFxuICAgICAgICBtYXhJbmRleDogbWF4R3JpZEluZGV4LFxuICAgICAgICBwcmV2SW5kZXg6IGdldENlbGxJbmRleE9mQ29ybmVyKGluZGV4UmVmLmN1cnJlbnQgPiBtYXhJbmRleCA/IG1pbkluZGV4IDogaW5kZXhSZWYuY3VycmVudCwgc2l6ZXMsIGNlbGxNYXAsIGNvbHMsXG4gICAgICAgIC8vIHVzZSBhIGNvcm5lciBtYXRjaGluZyB0aGUgZWRnZSBjbG9zZXN0IHRvIHRoZSBkaXJlY3Rpb25cbiAgICAgICAgLy8gd2UncmUgbW92aW5nIGluIHNvIHdlIGRvbid0IGVuZCB1cCBpbiB0aGUgc2FtZSBpdGVtLiBQcmVmZXJcbiAgICAgICAgLy8gdG9wL2xlZnQgb3ZlciBib3R0b20vcmlnaHQuXG4gICAgICAgIGV2ZW50LmtleSA9PT0gQVJST1dfRE9XTiA/ICdibCcgOiBldmVudC5rZXkgPT09IEFSUk9XX1JJR0hUID8gJ3RyJyA6ICd0bCcpLFxuICAgICAgICBzdG9wRXZlbnQ6IHRydWVcbiAgICAgIH0pXTsgLy8gbmF2aWdhdGVkIGNlbGwgd2lsbCBuZXZlciBiZSBudWxsaXNoXG5cbiAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICBpZiAob3JpZW50YXRpb24gPT09ICdib3RoJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc01haW5PcmllbnRhdGlvbktleShldmVudC5rZXksIG9yaWVudGF0aW9uKSkge1xuICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcblxuICAgICAgLy8gUmVzZXQgdGhlIGluZGV4IGlmIG5vIGl0ZW0gaXMgZm9jdXNlZC5cbiAgICAgIGlmIChvcGVuICYmICF2aXJ0dWFsICYmIGFjdGl2ZUVsZW1lbnQoZXZlbnQuY3VycmVudFRhcmdldC5vd25lckRvY3VtZW50KSA9PT0gZXZlbnQuY3VycmVudFRhcmdldCkge1xuICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gaXNNYWluT3JpZW50YXRpb25Ub0VuZEtleShldmVudC5rZXksIG9yaWVudGF0aW9uLCBydGwpID8gbWluSW5kZXggOiBtYXhJbmRleDtcbiAgICAgICAgb25OYXZpZ2F0ZShpbmRleFJlZi5jdXJyZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzTWFpbk9yaWVudGF0aW9uVG9FbmRLZXkoZXZlbnQua2V5LCBvcmllbnRhdGlvbiwgcnRsKSkge1xuICAgICAgICBpZiAobG9vcCkge1xuICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBjdXJyZW50SW5kZXggPj0gbWF4SW5kZXggPyBhbGxvd0VzY2FwZSAmJiBjdXJyZW50SW5kZXggIT09IGxpc3RSZWYuY3VycmVudC5sZW5ndGggPyAtMSA6IG1pbkluZGV4IDogZmluZE5vbkRpc2FibGVkSW5kZXgobGlzdFJlZiwge1xuICAgICAgICAgICAgc3RhcnRpbmdJbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IE1hdGgubWluKG1heEluZGV4LCBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCB7XG4gICAgICAgICAgICBzdGFydGluZ0luZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsb29wKSB7XG4gICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGN1cnJlbnRJbmRleCA8PSBtaW5JbmRleCA/IGFsbG93RXNjYXBlICYmIGN1cnJlbnRJbmRleCAhPT0gLTEgPyBsaXN0UmVmLmN1cnJlbnQubGVuZ3RoIDogbWF4SW5kZXggOiBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCB7XG4gICAgICAgICAgICBzdGFydGluZ0luZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gTWF0aC5tYXgobWluSW5kZXgsIGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgIGRlY3JlbWVudDogdHJ1ZSxcbiAgICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzSW5kZXhPdXRPZkJvdW5kcyhsaXN0UmVmLCBpbmRleFJlZi5jdXJyZW50KSkge1xuICAgICAgICBvbk5hdmlnYXRlKG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25OYXZpZ2F0ZShpbmRleFJlZi5jdXJyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBjb25zdCBhcmlhQWN0aXZlRGVzY2VuZGFudFByb3AgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gdmlydHVhbCAmJiBvcGVuICYmIGhhc0FjdGl2ZUluZGV4ICYmIHtcbiAgICAgICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiB2aXJ0dWFsSWQgfHwgYWN0aXZlSWRcbiAgICB9O1xuICB9LCBbdmlydHVhbCwgb3BlbiwgaGFzQWN0aXZlSW5kZXgsIHZpcnR1YWxJZCwgYWN0aXZlSWRdKTtcbiAgY29uc3QgZmxvYXRpbmcgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2FyaWEtb3JpZW50YXRpb24nOiBvcmllbnRhdGlvbiA9PT0gJ2JvdGgnID8gdW5kZWZpbmVkIDogb3JpZW50YXRpb24sXG4gICAgICAuLi4oIWlzVHlwZWFibGVDb21ib2JveChlbGVtZW50cy5kb21SZWZlcmVuY2UpICYmIGFyaWFBY3RpdmVEZXNjZW5kYW50UHJvcCksXG4gICAgICBvbktleURvd246IGNvbW1vbk9uS2V5RG93bixcbiAgICAgIG9uUG9pbnRlck1vdmUoKSB7XG4gICAgICAgIGlzUG9pbnRlck1vZGFsaXR5UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFthcmlhQWN0aXZlRGVzY2VuZGFudFByb3AsIGNvbW1vbk9uS2V5RG93biwgZWxlbWVudHMuZG9tUmVmZXJlbmNlLCBvcmllbnRhdGlvbl0pO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBmdW5jdGlvbiBjaGVja1ZpcnR1YWxNb3VzZShldmVudCkge1xuICAgICAgaWYgKGZvY3VzSXRlbU9uT3BlbiA9PT0gJ2F1dG8nICYmIGlzVmlydHVhbENsaWNrKGV2ZW50Lm5hdGl2ZUV2ZW50KSkge1xuICAgICAgICBmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrVmlydHVhbFBvaW50ZXIoZXZlbnQpIHtcbiAgICAgIC8vIGBwb2ludGVyZG93bmAgZmlyZXMgZmlyc3QsIHJlc2V0IHRoZSBzdGF0ZSB0aGVuIHBlcmZvcm0gdGhlIGNoZWNrcy5cbiAgICAgIGZvY3VzSXRlbU9uT3BlblJlZi5jdXJyZW50ID0gZm9jdXNJdGVtT25PcGVuO1xuICAgICAgaWYgKGZvY3VzSXRlbU9uT3BlbiA9PT0gJ2F1dG8nICYmIGlzVmlydHVhbFBvaW50ZXJFdmVudChldmVudC5uYXRpdmVFdmVudCkpIHtcbiAgICAgICAgZm9jdXNJdGVtT25PcGVuUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYXJpYUFjdGl2ZURlc2NlbmRhbnRQcm9wLFxuICAgICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICAgIGlzUG9pbnRlck1vZGFsaXR5UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgaXNBcnJvd0tleSA9IGV2ZW50LmtleS5pbmRleE9mKCdBcnJvdycpID09PSAwO1xuICAgICAgICBjb25zdCBpc0Nyb3NzT3BlbktleSA9IGlzQ3Jvc3NPcmllbnRhdGlvbk9wZW5LZXkoZXZlbnQua2V5LCBvcmllbnRhdGlvbiwgcnRsKTtcbiAgICAgICAgY29uc3QgaXNDcm9zc0Nsb3NlS2V5ID0gaXNDcm9zc09yaWVudGF0aW9uQ2xvc2VLZXkoZXZlbnQua2V5LCBvcmllbnRhdGlvbiwgcnRsKTtcbiAgICAgICAgY29uc3QgaXNNYWluS2V5ID0gaXNNYWluT3JpZW50YXRpb25LZXkoZXZlbnQua2V5LCBvcmllbnRhdGlvbik7XG4gICAgICAgIGNvbnN0IGlzTmF2aWdhdGlvbktleSA9IChuZXN0ZWQgPyBpc0Nyb3NzT3BlbktleSA6IGlzTWFpbktleSkgfHwgZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleS50cmltKCkgPT09ICcnO1xuICAgICAgICBpZiAodmlydHVhbCAmJiBvcGVuKSB7XG4gICAgICAgICAgY29uc3Qgcm9vdE5vZGUgPSB0cmVlID09IG51bGwgPyB2b2lkIDAgOiB0cmVlLm5vZGVzUmVmLmN1cnJlbnQuZmluZChub2RlID0+IG5vZGUucGFyZW50SWQgPT0gbnVsbCk7XG4gICAgICAgICAgY29uc3QgZGVlcGVzdE5vZGUgPSB0cmVlICYmIHJvb3ROb2RlID8gZ2V0RGVlcGVzdE5vZGUodHJlZS5ub2Rlc1JlZi5jdXJyZW50LCByb290Tm9kZS5pZCkgOiBudWxsO1xuICAgICAgICAgIGlmIChpc0Fycm93S2V5ICYmIGRlZXBlc3ROb2RlICYmIHZpcnR1YWxJdGVtUmVmKSB7XG4gICAgICAgICAgICBjb25zdCBldmVudE9iamVjdCA9IG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywge1xuICAgICAgICAgICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNDcm9zc09wZW5LZXkgfHwgaXNDcm9zc0Nsb3NlS2V5KSB7XG4gICAgICAgICAgICAgIHZhciBfZGVlcGVzdE5vZGUkY29udGV4dCwgX2RlZXBlc3ROb2RlJGNvbnRleHQyO1xuICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRUYXJnZXQgPSAoKF9kZWVwZXN0Tm9kZSRjb250ZXh0ID0gZGVlcGVzdE5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kZWVwZXN0Tm9kZSRjb250ZXh0LmVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoSXRlbSA9IGlzQ3Jvc3NDbG9zZUtleSAmJiAhaXNDdXJyZW50VGFyZ2V0ID8gKF9kZWVwZXN0Tm9kZSRjb250ZXh0MiA9IGRlZXBlc3ROb2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfZGVlcGVzdE5vZGUkY29udGV4dDIuZWxlbWVudHMuZG9tUmVmZXJlbmNlIDogaXNDcm9zc09wZW5LZXkgPyBsaXN0UmVmLmN1cnJlbnQuZmluZChpdGVtID0+IChpdGVtID09IG51bGwgPyB2b2lkIDAgOiBpdGVtLmlkKSA9PT0gYWN0aXZlSWQpIDogbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoSXRlbSkge1xuICAgICAgICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hJdGVtLmRpc3BhdGNoRXZlbnQoZXZlbnRPYmplY3QpO1xuICAgICAgICAgICAgICAgIHNldFZpcnR1YWxJZCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNNYWluS2V5ICYmIGRlZXBlc3ROb2RlLmNvbnRleHQpIHtcbiAgICAgICAgICAgICAgaWYgKGRlZXBlc3ROb2RlLmNvbnRleHQub3BlbiAmJiBkZWVwZXN0Tm9kZS5wYXJlbnRJZCAmJiBldmVudC5jdXJyZW50VGFyZ2V0ICE9PSBkZWVwZXN0Tm9kZS5jb250ZXh0LmVsZW1lbnRzLmRvbVJlZmVyZW5jZSkge1xuICAgICAgICAgICAgICAgIHZhciBfZGVlcGVzdE5vZGUkY29udGV4dCQ7XG4gICAgICAgICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAoX2RlZXBlc3ROb2RlJGNvbnRleHQkID0gZGVlcGVzdE5vZGUuY29udGV4dC5lbGVtZW50cy5kb21SZWZlcmVuY2UpID09IG51bGwgfHwgX2RlZXBlc3ROb2RlJGNvbnRleHQkLmRpc3BhdGNoRXZlbnQoZXZlbnRPYmplY3QpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29tbW9uT25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGEgZmxvYXRpbmcgZWxlbWVudCBzaG91bGQgbm90IG9wZW4gb24gYXJyb3cga2V5IGRvd24sIGF2b2lkXG4gICAgICAgIC8vIHNldHRpbmcgYGFjdGl2ZUluZGV4YCB3aGlsZSBpdCdzIGNsb3NlZC5cbiAgICAgICAgaWYgKCFvcGVuICYmICFvcGVuT25BcnJvd0tleURvd24gJiYgaXNBcnJvd0tleSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOYXZpZ2F0aW9uS2V5KSB7XG4gICAgICAgICAga2V5UmVmLmN1cnJlbnQgPSBuZXN0ZWQgJiYgaXNNYWluS2V5ID8gbnVsbCA6IGV2ZW50LmtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmVzdGVkKSB7XG4gICAgICAgICAgaWYgKGlzQ3Jvc3NPcGVuS2V5KSB7XG4gICAgICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGdldE1pbkluZGV4KGxpc3RSZWYsIGRpc2FibGVkSW5kaWNlc1JlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgb25OYXZpZ2F0ZShpbmRleFJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudC5uYXRpdmVFdmVudCwgJ2xpc3QtbmF2aWdhdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTWFpbktleSkge1xuICAgICAgICAgIGlmIChzZWxlY3RlZEluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBzZWxlY3RlZEluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAgIGlmICghb3BlbiAmJiBvcGVuT25BcnJvd0tleURvd24pIHtcbiAgICAgICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudC5uYXRpdmVFdmVudCwgJ2xpc3QtbmF2aWdhdGlvbicpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21tb25PbktleURvd24oZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgICAgb25OYXZpZ2F0ZShpbmRleFJlZi5jdXJyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbkZvY3VzKCkge1xuICAgICAgICBpZiAob3BlbiAmJiAhdmlydHVhbCkge1xuICAgICAgICAgIG9uTmF2aWdhdGUobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvblBvaW50ZXJEb3duOiBjaGVja1ZpcnR1YWxQb2ludGVyLFxuICAgICAgb25Nb3VzZURvd246IGNoZWNrVmlydHVhbE1vdXNlLFxuICAgICAgb25DbGljazogY2hlY2tWaXJ0dWFsTW91c2VcbiAgICB9O1xuICB9LCBbYWN0aXZlSWQsIGFyaWFBY3RpdmVEZXNjZW5kYW50UHJvcCwgY29tbW9uT25LZXlEb3duLCBkaXNhYmxlZEluZGljZXNSZWYsIGZvY3VzSXRlbU9uT3BlbiwgbGlzdFJlZiwgbmVzdGVkLCBvbk5hdmlnYXRlLCBvbk9wZW5DaGFuZ2UsIG9wZW4sIG9wZW5PbkFycm93S2V5RG93biwgb3JpZW50YXRpb24sIHJ0bCwgc2VsZWN0ZWRJbmRleCwgdHJlZSwgdmlydHVhbCwgdmlydHVhbEl0ZW1SZWZdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmcsXG4gICAgaXRlbVxuICB9IDoge30sIFtlbmFibGVkLCByZWZlcmVuY2UsIGZsb2F0aW5nLCBpdGVtXSk7XG59XG5cbmNvbnN0IGNvbXBvbmVudFJvbGVUb0FyaWFSb2xlTWFwID0gLyojX19QVVJFX18qL25ldyBNYXAoW1snc2VsZWN0JywgJ2xpc3Rib3gnXSwgWydjb21ib2JveCcsICdsaXN0Ym94J10sIFsnbGFiZWwnLCBmYWxzZV1dKTtcblxuLyoqXG4gKiBBZGRzIGJhc2Ugc2NyZWVuIHJlYWRlciBwcm9wcyB0byB0aGUgcmVmZXJlbmNlIGFuZCBmbG9hdGluZyBlbGVtZW50cyBmb3IgYVxuICogZ2l2ZW4gZmxvYXRpbmcgZWxlbWVudCBgcm9sZWAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlUm9sZVxuICovXG5mdW5jdGlvbiB1c2VSb2xlKGNvbnRleHQsIHByb3BzKSB7XG4gIHZhciBfY29tcG9uZW50Um9sZVRvQXJpYVI7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBmbG9hdGluZ0lkXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgcm9sZSA9ICdkaWFsb2cnXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgYXJpYVJvbGUgPSAoX2NvbXBvbmVudFJvbGVUb0FyaWFSID0gY29tcG9uZW50Um9sZVRvQXJpYVJvbGVNYXAuZ2V0KHJvbGUpKSAhPSBudWxsID8gX2NvbXBvbmVudFJvbGVUb0FyaWFSIDogcm9sZTtcbiAgY29uc3QgcmVmZXJlbmNlSWQgPSB1c2VJZCgpO1xuICBjb25zdCBwYXJlbnRJZCA9IHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkKCk7XG4gIGNvbnN0IGlzTmVzdGVkID0gcGFyZW50SWQgIT0gbnVsbDtcbiAgY29uc3QgcmVmZXJlbmNlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGFyaWFSb2xlID09PSAndG9vbHRpcCcgfHwgcm9sZSA9PT0gJ2xhYmVsJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW1wiYXJpYS1cIiArIChyb2xlID09PSAnbGFiZWwnID8gJ2xhYmVsbGVkYnknIDogJ2Rlc2NyaWJlZGJ5JyldOiBvcGVuID8gZmxvYXRpbmdJZCA6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICdhcmlhLWV4cGFuZGVkJzogb3BlbiA/ICd0cnVlJyA6ICdmYWxzZScsXG4gICAgICAnYXJpYS1oYXNwb3B1cCc6IGFyaWFSb2xlID09PSAnYWxlcnRkaWFsb2cnID8gJ2RpYWxvZycgOiBhcmlhUm9sZSxcbiAgICAgICdhcmlhLWNvbnRyb2xzJzogb3BlbiA/IGZsb2F0aW5nSWQgOiB1bmRlZmluZWQsXG4gICAgICAuLi4oYXJpYVJvbGUgPT09ICdsaXN0Ym94JyAmJiB7XG4gICAgICAgIHJvbGU6ICdjb21ib2JveCdcbiAgICAgIH0pLFxuICAgICAgLi4uKGFyaWFSb2xlID09PSAnbWVudScgJiYge1xuICAgICAgICBpZDogcmVmZXJlbmNlSWRcbiAgICAgIH0pLFxuICAgICAgLi4uKGFyaWFSb2xlID09PSAnbWVudScgJiYgaXNOZXN0ZWQgJiYge1xuICAgICAgICByb2xlOiAnbWVudWl0ZW0nXG4gICAgICB9KSxcbiAgICAgIC4uLihyb2xlID09PSAnc2VsZWN0JyAmJiB7XG4gICAgICAgICdhcmlhLWF1dG9jb21wbGV0ZSc6ICdub25lJ1xuICAgICAgfSksXG4gICAgICAuLi4ocm9sZSA9PT0gJ2NvbWJvYm94JyAmJiB7XG4gICAgICAgICdhcmlhLWF1dG9jb21wbGV0ZSc6ICdsaXN0J1xuICAgICAgfSlcbiAgICB9O1xuICB9LCBbYXJpYVJvbGUsIGZsb2F0aW5nSWQsIGlzTmVzdGVkLCBvcGVuLCByZWZlcmVuY2VJZCwgcm9sZV0pO1xuICBjb25zdCBmbG9hdGluZyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGZsb2F0aW5nUHJvcHMgPSB7XG4gICAgICBpZDogZmxvYXRpbmdJZCxcbiAgICAgIC4uLihhcmlhUm9sZSAmJiB7XG4gICAgICAgIHJvbGU6IGFyaWFSb2xlXG4gICAgICB9KVxuICAgIH07XG4gICAgaWYgKGFyaWFSb2xlID09PSAndG9vbHRpcCcgfHwgcm9sZSA9PT0gJ2xhYmVsJykge1xuICAgICAgcmV0dXJuIGZsb2F0aW5nUHJvcHM7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5mbG9hdGluZ1Byb3BzLFxuICAgICAgLi4uKGFyaWFSb2xlID09PSAnbWVudScgJiYge1xuICAgICAgICAnYXJpYS1sYWJlbGxlZGJ5JzogcmVmZXJlbmNlSWRcbiAgICAgIH0pXG4gICAgfTtcbiAgfSwgW2FyaWFSb2xlLCBmbG9hdGluZ0lkLCByZWZlcmVuY2VJZCwgcm9sZV0pO1xuICBjb25zdCBpdGVtID0gUmVhY3QudXNlQ2FsbGJhY2soX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGFjdGl2ZSxcbiAgICAgIHNlbGVjdGVkXG4gICAgfSA9IF9yZWY7XG4gICAgY29uc3QgY29tbW9uUHJvcHMgPSB7XG4gICAgICByb2xlOiAnb3B0aW9uJyxcbiAgICAgIC4uLihhY3RpdmUgJiYge1xuICAgICAgICBpZDogZmxvYXRpbmdJZCArIFwiLW9wdGlvblwiXG4gICAgICB9KVxuICAgIH07XG5cbiAgICAvLyBGb3IgYG1lbnVgLCB3ZSBhcmUgdW5hYmxlIHRvIHRlbGwgaWYgdGhlIGl0ZW0gaXMgYSBgbWVudWl0ZW1yYWRpb2BcbiAgICAvLyBvciBgbWVudWl0ZW1jaGVja2JveGAuIEZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSByZWFzb25zLCBhbHNvXG4gICAgLy8gYXZvaWQgZGVmYXVsdGluZyB0byBgbWVudWl0ZW1gIGFzIGl0IG1heSBvdmVyd3JpdGUgY3VzdG9tIHJvbGUgcHJvcHMuXG4gICAgc3dpdGNoIChyb2xlKSB7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICAgICdhcmlhLXNlbGVjdGVkJzogYWN0aXZlICYmIHNlbGVjdGVkXG4gICAgICAgIH07XG4gICAgICBjYXNlICdjb21ib2JveCc6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY29tbW9uUHJvcHMsXG4gICAgICAgICAgICAuLi4oYWN0aXZlICYmIHtcbiAgICAgICAgICAgICAgJ2FyaWEtc2VsZWN0ZWQnOiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9LCBbZmxvYXRpbmdJZCwgcm9sZV0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIHJlZmVyZW5jZSxcbiAgICBmbG9hdGluZyxcbiAgICBpdGVtXG4gIH0gOiB7fSwgW2VuYWJsZWQsIHJlZmVyZW5jZSwgZmxvYXRpbmcsIGl0ZW1dKTtcbn1cblxuLy8gQ29udmVydHMgYSBKUyBzdHlsZSBrZXkgbGlrZSBgYmFja2dyb3VuZENvbG9yYCB0byBhIENTUyB0cmFuc2l0aW9uLXByb3BlcnR5XG4vLyBsaWtlIGBiYWNrZ3JvdW5kLWNvbG9yYC5cbmNvbnN0IGNhbWVsQ2FzZVRvS2ViYWJDYXNlID0gc3RyID0+IHN0ci5yZXBsYWNlKC9bQS1aXSsoPyFbYS16XSl8W0EtWl0vZywgKCQsIG9mcykgPT4gKG9mcyA/ICctJyA6ICcnKSArICQudG9Mb3dlckNhc2UoKSk7XG5mdW5jdGlvbiBleGVjV2l0aEFyZ3NPclJldHVybih2YWx1ZU9yRm4sIGFyZ3MpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZU9yRm4gPT09ICdmdW5jdGlvbicgPyB2YWx1ZU9yRm4oYXJncykgOiB2YWx1ZU9yRm47XG59XG5mdW5jdGlvbiB1c2VEZWxheVVubW91bnQob3BlbiwgZHVyYXRpb25Ncykge1xuICBjb25zdCBbaXNNb3VudGVkLCBzZXRJc01vdW50ZWRdID0gUmVhY3QudXNlU3RhdGUob3Blbik7XG4gIGlmIChvcGVuICYmICFpc01vdW50ZWQpIHtcbiAgICBzZXRJc01vdW50ZWQodHJ1ZSk7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW9wZW4gJiYgaXNNb3VudGVkKSB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBzZXRJc01vdW50ZWQoZmFsc2UpLCBkdXJhdGlvbk1zKTtcbiAgICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgfVxuICB9LCBbb3BlbiwgaXNNb3VudGVkLCBkdXJhdGlvbk1zXSk7XG4gIHJldHVybiBpc01vdW50ZWQ7XG59XG4vKipcbiAqIFByb3ZpZGVzIGEgc3RhdHVzIHN0cmluZyB0byBhcHBseSBDU1MgdHJhbnNpdGlvbnMgdG8gYSBmbG9hdGluZyBlbGVtZW50LFxuICogY29ycmVjdGx5IGhhbmRsaW5nIHBsYWNlbWVudC1hd2FyZSB0cmFuc2l0aW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VUcmFuc2l0aW9uI3VzZXRyYW5zaXRpb25zdGF0dXNcbiAqL1xuZnVuY3Rpb24gdXNlVHJhbnNpdGlvblN0YXR1cyhjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGZsb2F0aW5nXG4gICAgfVxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGR1cmF0aW9uID0gMjUwXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgaXNOdW1iZXJEdXJhdGlvbiA9IHR5cGVvZiBkdXJhdGlvbiA9PT0gJ251bWJlcic7XG4gIGNvbnN0IGNsb3NlRHVyYXRpb24gPSAoaXNOdW1iZXJEdXJhdGlvbiA/IGR1cmF0aW9uIDogZHVyYXRpb24uY2xvc2UpIHx8IDA7XG4gIGNvbnN0IFtzdGF0dXMsIHNldFN0YXR1c10gPSBSZWFjdC51c2VTdGF0ZSgndW5tb3VudGVkJyk7XG4gIGNvbnN0IGlzTW91bnRlZCA9IHVzZURlbGF5VW5tb3VudChvcGVuLCBjbG9zZUR1cmF0aW9uKTtcbiAgaWYgKCFpc01vdW50ZWQgJiYgc3RhdHVzID09PSAnY2xvc2UnKSB7XG4gICAgc2V0U3RhdHVzKCd1bm1vdW50ZWQnKTtcbiAgfVxuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFmbG9hdGluZykgcmV0dXJuO1xuICAgIGlmIChvcGVuKSB7XG4gICAgICBzZXRTdGF0dXMoJ2luaXRpYWwnKTtcbiAgICAgIGNvbnN0IGZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgc2V0U3RhdHVzKCdvcGVuJyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGZyYW1lKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHNldFN0YXR1cygnY2xvc2UnKTtcbiAgfSwgW29wZW4sIGZsb2F0aW5nXSk7XG4gIHJldHVybiB7XG4gICAgaXNNb3VudGVkLFxuICAgIHN0YXR1c1xuICB9O1xufVxuLyoqXG4gKiBQcm92aWRlcyBzdHlsZXMgdG8gYXBwbHkgQ1NTIHRyYW5zaXRpb25zIHRvIGEgZmxvYXRpbmcgZWxlbWVudCwgY29ycmVjdGx5XG4gKiBoYW5kbGluZyBwbGFjZW1lbnQtYXdhcmUgdHJhbnNpdGlvbnMuIFdyYXBwZXIgYXJvdW5kIGB1c2VUcmFuc2l0aW9uU3RhdHVzYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VUcmFuc2l0aW9uI3VzZXRyYW5zaXRpb25zdHlsZXNcbiAqL1xuZnVuY3Rpb24gdXNlVHJhbnNpdGlvblN0eWxlcyhjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIGluaXRpYWw6IHVuc3RhYmxlX2luaXRpYWwgPSB7XG4gICAgICBvcGFjaXR5OiAwXG4gICAgfSxcbiAgICBvcGVuOiB1bnN0YWJsZV9vcGVuLFxuICAgIGNsb3NlOiB1bnN0YWJsZV9jbG9zZSxcbiAgICBjb21tb246IHVuc3RhYmxlX2NvbW1vbixcbiAgICBkdXJhdGlvbiA9IDI1MFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHBsYWNlbWVudCA9IGNvbnRleHQucGxhY2VtZW50O1xuICBjb25zdCBzaWRlID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gIGNvbnN0IGZuQXJncyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBzaWRlLFxuICAgIHBsYWNlbWVudFxuICB9KSwgW3NpZGUsIHBsYWNlbWVudF0pO1xuICBjb25zdCBpc051bWJlckR1cmF0aW9uID0gdHlwZW9mIGR1cmF0aW9uID09PSAnbnVtYmVyJztcbiAgY29uc3Qgb3BlbkR1cmF0aW9uID0gKGlzTnVtYmVyRHVyYXRpb24gPyBkdXJhdGlvbiA6IGR1cmF0aW9uLm9wZW4pIHx8IDA7XG4gIGNvbnN0IGNsb3NlRHVyYXRpb24gPSAoaXNOdW1iZXJEdXJhdGlvbiA/IGR1cmF0aW9uIDogZHVyYXRpb24uY2xvc2UpIHx8IDA7XG4gIGNvbnN0IFtzdHlsZXMsIHNldFN0eWxlc10gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiAoe1xuICAgIC4uLmV4ZWNXaXRoQXJnc09yUmV0dXJuKHVuc3RhYmxlX2NvbW1vbiwgZm5BcmdzKSxcbiAgICAuLi5leGVjV2l0aEFyZ3NPclJldHVybih1bnN0YWJsZV9pbml0aWFsLCBmbkFyZ3MpXG4gIH0pKTtcbiAgY29uc3Qge1xuICAgIGlzTW91bnRlZCxcbiAgICBzdGF0dXNcbiAgfSA9IHVzZVRyYW5zaXRpb25TdGF0dXMoY29udGV4dCwge1xuICAgIGR1cmF0aW9uXG4gIH0pO1xuICBjb25zdCBpbml0aWFsUmVmID0gdXNlTGF0ZXN0UmVmKHVuc3RhYmxlX2luaXRpYWwpO1xuICBjb25zdCBvcGVuUmVmID0gdXNlTGF0ZXN0UmVmKHVuc3RhYmxlX29wZW4pO1xuICBjb25zdCBjbG9zZVJlZiA9IHVzZUxhdGVzdFJlZih1bnN0YWJsZV9jbG9zZSk7XG4gIGNvbnN0IGNvbW1vblJlZiA9IHVzZUxhdGVzdFJlZih1bnN0YWJsZV9jb21tb24pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgY29uc3QgaW5pdGlhbFN0eWxlcyA9IGV4ZWNXaXRoQXJnc09yUmV0dXJuKGluaXRpYWxSZWYuY3VycmVudCwgZm5BcmdzKTtcbiAgICBjb25zdCBjbG9zZVN0eWxlcyA9IGV4ZWNXaXRoQXJnc09yUmV0dXJuKGNsb3NlUmVmLmN1cnJlbnQsIGZuQXJncyk7XG4gICAgY29uc3QgY29tbW9uU3R5bGVzID0gZXhlY1dpdGhBcmdzT3JSZXR1cm4oY29tbW9uUmVmLmN1cnJlbnQsIGZuQXJncyk7XG4gICAgY29uc3Qgb3BlblN0eWxlcyA9IGV4ZWNXaXRoQXJnc09yUmV0dXJuKG9wZW5SZWYuY3VycmVudCwgZm5BcmdzKSB8fCBPYmplY3Qua2V5cyhpbml0aWFsU3R5bGVzKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICBhY2Nba2V5XSA9ICcnO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICBzZXRTdHlsZXMoc3R5bGVzID0+ICh7XG4gICAgICAgIHRyYW5zaXRpb25Qcm9wZXJ0eTogc3R5bGVzLnRyYW5zaXRpb25Qcm9wZXJ0eSxcbiAgICAgICAgLi4uY29tbW9uU3R5bGVzLFxuICAgICAgICAuLi5pbml0aWFsU3R5bGVzXG4gICAgICB9KSk7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09ICdvcGVuJykge1xuICAgICAgc2V0U3R5bGVzKHtcbiAgICAgICAgdHJhbnNpdGlvblByb3BlcnR5OiBPYmplY3Qua2V5cyhvcGVuU3R5bGVzKS5tYXAoY2FtZWxDYXNlVG9LZWJhYkNhc2UpLmpvaW4oJywnKSxcbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBvcGVuRHVyYXRpb24gKyBcIm1zXCIsXG4gICAgICAgIC4uLmNvbW1vblN0eWxlcyxcbiAgICAgICAgLi4ub3BlblN0eWxlc1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09ICdjbG9zZScpIHtcbiAgICAgIGNvbnN0IHN0eWxlcyA9IGNsb3NlU3R5bGVzIHx8IGluaXRpYWxTdHlsZXM7XG4gICAgICBzZXRTdHlsZXMoe1xuICAgICAgICB0cmFuc2l0aW9uUHJvcGVydHk6IE9iamVjdC5rZXlzKHN0eWxlcykubWFwKGNhbWVsQ2FzZVRvS2ViYWJDYXNlKS5qb2luKCcsJyksXG4gICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogY2xvc2VEdXJhdGlvbiArIFwibXNcIixcbiAgICAgICAgLi4uY29tbW9uU3R5bGVzLFxuICAgICAgICAuLi5zdHlsZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW2Nsb3NlRHVyYXRpb24sIGNsb3NlUmVmLCBpbml0aWFsUmVmLCBvcGVuUmVmLCBjb21tb25SZWYsIG9wZW5EdXJhdGlvbiwgc3RhdHVzLCBmbkFyZ3NdKTtcbiAgcmV0dXJuIHtcbiAgICBpc01vdW50ZWQsXG4gICAgc3R5bGVzXG4gIH07XG59XG5cbi8qKlxuICogUHJvdmlkZXMgYSBtYXRjaGluZyBjYWxsYmFjayB0aGF0IGNhbiBiZSB1c2VkIHRvIGZvY3VzIGFuIGl0ZW0gYXMgdGhlIHVzZXJcbiAqIHR5cGVzLCBvZnRlbiB1c2VkIGluIHRhbmRlbSB3aXRoIGB1c2VMaXN0TmF2aWdhdGlvbigpYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VUeXBlYWhlYWRcbiAqL1xuZnVuY3Rpb24gdXNlVHlwZWFoZWFkKGNvbnRleHQsIHByb3BzKSB7XG4gIHZhciBfcmVmO1xuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBkYXRhUmVmXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgbGlzdFJlZixcbiAgICBhY3RpdmVJbmRleCxcbiAgICBvbk1hdGNoOiB1bnN0YWJsZV9vbk1hdGNoLFxuICAgIG9uVHlwaW5nQ2hhbmdlOiB1bnN0YWJsZV9vblR5cGluZ0NoYW5nZSxcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBmaW5kTWF0Y2ggPSBudWxsLFxuICAgIHJlc2V0TXMgPSA3NTAsXG4gICAgaWdub3JlS2V5cyA9IFtdLFxuICAgIHNlbGVjdGVkSW5kZXggPSBudWxsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdGltZW91dElkUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IHN0cmluZ1JlZiA9IFJlYWN0LnVzZVJlZignJyk7XG4gIGNvbnN0IHByZXZJbmRleFJlZiA9IFJlYWN0LnVzZVJlZigoX3JlZiA9IHNlbGVjdGVkSW5kZXggIT0gbnVsbCA/IHNlbGVjdGVkSW5kZXggOiBhY3RpdmVJbmRleCkgIT0gbnVsbCA/IF9yZWYgOiAtMSk7XG4gIGNvbnN0IG1hdGNoSW5kZXhSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IG9uTWF0Y2ggPSB1c2VFZmZlY3RFdmVudCh1bnN0YWJsZV9vbk1hdGNoKTtcbiAgY29uc3Qgb25UeXBpbmdDaGFuZ2UgPSB1c2VFZmZlY3RFdmVudCh1bnN0YWJsZV9vblR5cGluZ0NoYW5nZSk7XG4gIGNvbnN0IGZpbmRNYXRjaFJlZiA9IHVzZUxhdGVzdFJlZihmaW5kTWF0Y2gpO1xuICBjb25zdCBpZ25vcmVLZXlzUmVmID0gdXNlTGF0ZXN0UmVmKGlnbm9yZUtleXMpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWRSZWYuY3VycmVudCk7XG4gICAgICBtYXRjaEluZGV4UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgc3RyaW5nUmVmLmN1cnJlbnQgPSAnJztcbiAgICB9XG4gIH0sIFtvcGVuXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICAvLyBTeW5jIGFycm93IGtleSBuYXZpZ2F0aW9uIGJ1dCBub3QgdHlwZWFoZWFkIG5hdmlnYXRpb24uXG4gICAgaWYgKG9wZW4gJiYgc3RyaW5nUmVmLmN1cnJlbnQgPT09ICcnKSB7XG4gICAgICB2YXIgX3JlZjI7XG4gICAgICBwcmV2SW5kZXhSZWYuY3VycmVudCA9IChfcmVmMiA9IHNlbGVjdGVkSW5kZXggIT0gbnVsbCA/IHNlbGVjdGVkSW5kZXggOiBhY3RpdmVJbmRleCkgIT0gbnVsbCA/IF9yZWYyIDogLTE7XG4gICAgfVxuICB9LCBbb3Blbiwgc2VsZWN0ZWRJbmRleCwgYWN0aXZlSW5kZXhdKTtcbiAgY29uc3Qgc2V0VHlwaW5nQ2hhbmdlID0gdXNlRWZmZWN0RXZlbnQodmFsdWUgPT4ge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKCFkYXRhUmVmLmN1cnJlbnQudHlwaW5nKSB7XG4gICAgICAgIGRhdGFSZWYuY3VycmVudC50eXBpbmcgPSB2YWx1ZTtcbiAgICAgICAgb25UeXBpbmdDaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YVJlZi5jdXJyZW50LnR5cGluZykge1xuICAgICAgICBkYXRhUmVmLmN1cnJlbnQudHlwaW5nID0gdmFsdWU7XG4gICAgICAgIG9uVHlwaW5nQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBjb25zdCBvbktleURvd24gPSB1c2VFZmZlY3RFdmVudChldmVudCA9PiB7XG4gICAgZnVuY3Rpb24gZ2V0TWF0Y2hpbmdJbmRleChsaXN0LCBvcmRlcmVkTGlzdCwgc3RyaW5nKSB7XG4gICAgICBjb25zdCBzdHIgPSBmaW5kTWF0Y2hSZWYuY3VycmVudCA/IGZpbmRNYXRjaFJlZi5jdXJyZW50KG9yZGVyZWRMaXN0LCBzdHJpbmcpIDogb3JkZXJlZExpc3QuZmluZCh0ZXh0ID0+ICh0ZXh0ID09IG51bGwgPyB2b2lkIDAgOiB0ZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5kZXhPZihzdHJpbmcudG9Mb2NhbGVMb3dlckNhc2UoKSkpID09PSAwKTtcbiAgICAgIHJldHVybiBzdHIgPyBsaXN0LmluZGV4T2Yoc3RyKSA6IC0xO1xuICAgIH1cbiAgICBjb25zdCBsaXN0Q29udGVudCA9IGxpc3RSZWYuY3VycmVudDtcbiAgICBpZiAoc3RyaW5nUmVmLmN1cnJlbnQubGVuZ3RoID4gMCAmJiBzdHJpbmdSZWYuY3VycmVudFswXSAhPT0gJyAnKSB7XG4gICAgICBpZiAoZ2V0TWF0Y2hpbmdJbmRleChsaXN0Q29udGVudCwgbGlzdENvbnRlbnQsIHN0cmluZ1JlZi5jdXJyZW50KSA9PT0gLTEpIHtcbiAgICAgICAgc2V0VHlwaW5nQ2hhbmdlKGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxpc3RDb250ZW50ID09IG51bGwgfHwgaWdub3JlS2V5c1JlZi5jdXJyZW50LmluY2x1ZGVzKGV2ZW50LmtleSkgfHxcbiAgICAvLyBDaGFyYWN0ZXIga2V5LlxuICAgIGV2ZW50LmtleS5sZW5ndGggIT09IDEgfHxcbiAgICAvLyBNb2RpZmllciBrZXkuXG4gICAgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3BlbiAmJiBldmVudC5rZXkgIT09ICcgJykge1xuICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIHNldFR5cGluZ0NoYW5nZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBCYWlsIG91dCBpZiB0aGUgbGlzdCBjb250YWlucyBhIHdvcmQgbGlrZSBcImxsYW1hXCIgb3IgXCJhYXJvblwiLiBUT0RPOlxuICAgIC8vIGFsbG93IGl0IGluIHRoaXMgY2FzZSwgdG9vLlxuICAgIGNvbnN0IGFsbG93UmFwaWRTdWNjZXNzaW9uT2ZGaXJzdExldHRlciA9IGxpc3RDb250ZW50LmV2ZXJ5KHRleHQgPT4ge1xuICAgICAgdmFyIF90ZXh0JCwgX3RleHQkMjtcbiAgICAgIHJldHVybiB0ZXh0ID8gKChfdGV4dCQgPSB0ZXh0WzBdKSA9PSBudWxsID8gdm9pZCAwIDogX3RleHQkLnRvTG9jYWxlTG93ZXJDYXNlKCkpICE9PSAoKF90ZXh0JDIgPSB0ZXh0WzFdKSA9PSBudWxsID8gdm9pZCAwIDogX3RleHQkMi50b0xvY2FsZUxvd2VyQ2FzZSgpKSA6IHRydWU7XG4gICAgfSk7XG5cbiAgICAvLyBBbGxvd3MgdGhlIHVzZXIgdG8gY3ljbGUgdGhyb3VnaCBpdGVtcyB0aGF0IHN0YXJ0IHdpdGggdGhlIHNhbWUgbGV0dGVyXG4gICAgLy8gaW4gcmFwaWQgc3VjY2Vzc2lvbi5cbiAgICBpZiAoYWxsb3dSYXBpZFN1Y2Nlc3Npb25PZkZpcnN0TGV0dGVyICYmIHN0cmluZ1JlZi5jdXJyZW50ID09PSBldmVudC5rZXkpIHtcbiAgICAgIHN0cmluZ1JlZi5jdXJyZW50ID0gJyc7XG4gICAgICBwcmV2SW5kZXhSZWYuY3VycmVudCA9IG1hdGNoSW5kZXhSZWYuY3VycmVudDtcbiAgICB9XG4gICAgc3RyaW5nUmVmLmN1cnJlbnQgKz0gZXZlbnQua2V5O1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWRSZWYuY3VycmVudCk7XG4gICAgdGltZW91dElkUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHN0cmluZ1JlZi5jdXJyZW50ID0gJyc7XG4gICAgICBwcmV2SW5kZXhSZWYuY3VycmVudCA9IG1hdGNoSW5kZXhSZWYuY3VycmVudDtcbiAgICAgIHNldFR5cGluZ0NoYW5nZShmYWxzZSk7XG4gICAgfSwgcmVzZXRNcyk7XG4gICAgY29uc3QgcHJldkluZGV4ID0gcHJldkluZGV4UmVmLmN1cnJlbnQ7XG4gICAgY29uc3QgaW5kZXggPSBnZXRNYXRjaGluZ0luZGV4KGxpc3RDb250ZW50LCBbLi4ubGlzdENvbnRlbnQuc2xpY2UoKHByZXZJbmRleCB8fCAwKSArIDEpLCAuLi5saXN0Q29udGVudC5zbGljZSgwLCAocHJldkluZGV4IHx8IDApICsgMSldLCBzdHJpbmdSZWYuY3VycmVudCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgb25NYXRjaChpbmRleCk7XG4gICAgICBtYXRjaEluZGV4UmVmLmN1cnJlbnQgPSBpbmRleDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICBzdHJpbmdSZWYuY3VycmVudCA9ICcnO1xuICAgICAgc2V0VHlwaW5nQ2hhbmdlKGZhbHNlKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgb25LZXlEb3duXG4gIH0pLCBbb25LZXlEb3duXSk7XG4gIGNvbnN0IGZsb2F0aW5nID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uS2V5RG93bixcbiAgICAgIG9uS2V5VXAoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgc2V0VHlwaW5nQ2hhbmdlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0sIFtvbktleURvd24sIHNldFR5cGluZ0NoYW5nZV0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIHJlZmVyZW5jZSxcbiAgICBmbG9hdGluZ1xuICB9IDoge30sIFtlbmFibGVkLCByZWZlcmVuY2UsIGZsb2F0aW5nXSk7XG59XG5cbmZ1bmN0aW9uIGdldEFyZ3NXaXRoQ3VzdG9tRmxvYXRpbmdIZWlnaHQoc3RhdGUsIGhlaWdodCkge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHJlY3RzOiB7XG4gICAgICAuLi5zdGF0ZS5yZWN0cyxcbiAgICAgIGZsb2F0aW5nOiB7XG4gICAgICAgIC4uLnN0YXRlLnJlY3RzLmZsb2F0aW5nLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4vKipcbiAqIFBvc2l0aW9ucyB0aGUgZmxvYXRpbmcgZWxlbWVudCBzdWNoIHRoYXQgYW4gaW5uZXIgZWxlbWVudCBpbnNpZGUgb2YgaXQgaXNcbiAqIGFuY2hvcmVkIHRvIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9pbm5lclxuICovXG5jb25zdCBpbm5lciA9IHByb3BzID0+ICh7XG4gIG5hbWU6ICdpbm5lcicsXG4gIG9wdGlvbnM6IHByb3BzLFxuICBhc3luYyBmbihzdGF0ZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxpc3RSZWYsXG4gICAgICBvdmVyZmxvd1JlZixcbiAgICAgIG9uRmFsbGJhY2tDaGFuZ2UsXG4gICAgICBvZmZzZXQ6IGlubmVyT2Zmc2V0ID0gMCxcbiAgICAgIGluZGV4ID0gMCxcbiAgICAgIG1pbkl0ZW1zVmlzaWJsZSA9IDQsXG4gICAgICByZWZlcmVuY2VPdmVyZmxvd1RocmVzaG9sZCA9IDAsXG4gICAgICBzY3JvbGxSZWYsXG4gICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICB9ID0gZXZhbHVhdGUocHJvcHMsIHN0YXRlKTtcbiAgICBjb25zdCB7XG4gICAgICByZWN0cyxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIGZsb2F0aW5nXG4gICAgICB9XG4gICAgfSA9IHN0YXRlO1xuICAgIGNvbnN0IGl0ZW0gPSBsaXN0UmVmLmN1cnJlbnRbaW5kZXhdO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmICghc3RhdGUucGxhY2VtZW50LnN0YXJ0c1dpdGgoJ2JvdHRvbScpKSB7XG4gICAgICAgIHdhcm4oJ2BwbGFjZW1lbnRgIHNpZGUgbXVzdCBiZSBcImJvdHRvbVwiIHdoZW4gdXNpbmcgdGhlIGBpbm5lcmAnLCAnbWlkZGxld2FyZS4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IG5leHRBcmdzID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICAuLi4oYXdhaXQgb2Zmc2V0KC1pdGVtLm9mZnNldFRvcCAtIGZsb2F0aW5nLmNsaWVudFRvcCAtIHJlY3RzLnJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gaXRlbS5vZmZzZXRIZWlnaHQgLyAyIC0gaW5uZXJPZmZzZXQpLmZuKHN0YXRlKSlcbiAgICB9O1xuICAgIGNvbnN0IGVsID0gKHNjcm9sbFJlZiA9PSBudWxsID8gdm9pZCAwIDogc2Nyb2xsUmVmLmN1cnJlbnQpIHx8IGZsb2F0aW5nO1xuICAgIGNvbnN0IG92ZXJmbG93ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3coZ2V0QXJnc1dpdGhDdXN0b21GbG9hdGluZ0hlaWdodChuZXh0QXJncywgZWwuc2Nyb2xsSGVpZ2h0KSwgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zKTtcbiAgICBjb25zdCByZWZPdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KG5leHRBcmdzLCB7XG4gICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnMsXG4gICAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgICB9KTtcbiAgICBjb25zdCBkaWZmWSA9IE1hdGgubWF4KDAsIG92ZXJmbG93LnRvcCk7XG4gICAgY29uc3QgbmV4dFkgPSBuZXh0QXJncy55ICsgZGlmZlk7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5tYXgoMCwgZWwuc2Nyb2xsSGVpZ2h0IC0gZGlmZlkgLSBNYXRoLm1heCgwLCBvdmVyZmxvdy5ib3R0b20pKTtcbiAgICBlbC5zdHlsZS5tYXhIZWlnaHQgPSBtYXhIZWlnaHQgKyBcInB4XCI7XG4gICAgZWwuc2Nyb2xsVG9wID0gZGlmZlk7XG5cbiAgICAvLyBUaGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlLCBmYWxsYmFjayB0byBzdGFuZGFyZCBhbmNob3JlZCBwb3NpdGlvbmluZ1xuICAgIGlmIChvbkZhbGxiYWNrQ2hhbmdlKSB7XG4gICAgICBpZiAoZWwub2Zmc2V0SGVpZ2h0IDwgaXRlbS5vZmZzZXRIZWlnaHQgKiBNYXRoLm1pbihtaW5JdGVtc1Zpc2libGUsIGxpc3RSZWYuY3VycmVudC5sZW5ndGggLSAxKSAtIDEgfHwgcmVmT3ZlcmZsb3cudG9wID49IC1yZWZlcmVuY2VPdmVyZmxvd1RocmVzaG9sZCB8fCByZWZPdmVyZmxvdy5ib3R0b20gPj0gLXJlZmVyZW5jZU92ZXJmbG93VGhyZXNob2xkKSB7XG4gICAgICAgIFJlYWN0RE9NLmZsdXNoU3luYygoKSA9PiBvbkZhbGxiYWNrQ2hhbmdlKHRydWUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFJlYWN0RE9NLmZsdXNoU3luYygoKSA9PiBvbkZhbGxiYWNrQ2hhbmdlKGZhbHNlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvdmVyZmxvd1JlZikge1xuICAgICAgb3ZlcmZsb3dSZWYuY3VycmVudCA9IGF3YWl0IGRldGVjdE92ZXJmbG93KGdldEFyZ3NXaXRoQ3VzdG9tRmxvYXRpbmdIZWlnaHQoe1xuICAgICAgICAuLi5uZXh0QXJncyxcbiAgICAgICAgeTogbmV4dFlcbiAgICAgIH0sIGVsLm9mZnNldEhlaWdodCksIGRldGVjdE92ZXJmbG93T3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB5OiBuZXh0WVxuICAgIH07XG4gIH1cbn0pO1xuLyoqXG4gKiBDaGFuZ2VzIHRoZSBgaW5uZXJgIG1pZGRsZXdhcmUncyBgb2Zmc2V0YCB1cG9uIGEgYHdoZWVsYCBldmVudCB0b1xuICogZXhwYW5kIHRoZSBmbG9hdGluZyBlbGVtZW50J3MgaGVpZ2h0LCByZXZlYWxpbmcgbW9yZSBsaXN0IGl0ZW1zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2lubmVyXG4gKi9cbmZ1bmN0aW9uIHVzZUlubmVyT2Zmc2V0KGNvbnRleHQsIHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIGVsZW1lbnRzXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgb3ZlcmZsb3dSZWYsXG4gICAgc2Nyb2xsUmVmLFxuICAgIG9uQ2hhbmdlOiB1bnN0YWJsZV9vbkNoYW5nZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IG9uQ2hhbmdlID0gdXNlRWZmZWN0RXZlbnQodW5zdGFibGVfb25DaGFuZ2UpO1xuICBjb25zdCBjb250cm9sbGVkU2Nyb2xsaW5nUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgcHJldlNjcm9sbFRvcFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgaW5pdGlhbE92ZXJmbG93UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIG9uV2hlZWwoZSkge1xuICAgICAgaWYgKGUuY3RybEtleSB8fCAhZWwgfHwgb3ZlcmZsb3dSZWYuY3VycmVudCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRZID0gZS5kZWx0YVk7XG4gICAgICBjb25zdCBpc0F0VG9wID0gb3ZlcmZsb3dSZWYuY3VycmVudC50b3AgPj0gLTAuNTtcbiAgICAgIGNvbnN0IGlzQXRCb3R0b20gPSBvdmVyZmxvd1JlZi5jdXJyZW50LmJvdHRvbSA+PSAtMC41O1xuICAgICAgY29uc3QgcmVtYWluaW5nU2Nyb2xsID0gZWwuc2Nyb2xsSGVpZ2h0IC0gZWwuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3Qgc2lnbiA9IGRZIDwgMCA/IC0xIDogMTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IGRZIDwgMCA/ICdtYXgnIDogJ21pbic7XG4gICAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0IDw9IGVsLmNsaWVudEhlaWdodCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXRUb3AgJiYgZFkgPiAwIHx8ICFpc0F0Qm90dG9tICYmIGRZIDwgMCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIFJlYWN0RE9NLmZsdXNoU3luYygoKSA9PiB7XG4gICAgICAgICAgb25DaGFuZ2UoZCA9PiBkICsgTWF0aFttZXRob2RdKGRZLCByZW1haW5pbmdTY3JvbGwgKiBzaWduKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICgvZmlyZWZveC9pLnRlc3QoZ2V0VXNlckFnZW50KCkpKSB7XG4gICAgICAgIC8vIE5lZWRlZCB0byBwcm9wYWdhdGUgc2Nyb2xsaW5nIGR1cmluZyBtb21lbnR1bSBzY3JvbGxpbmcgcGhhc2Ugb25jZVxuICAgICAgICAvLyBpdCBnZXRzIGxpbWl0ZWQgYnkgdGhlIGJvdW5kYXJ5LiBVWCBpbXByb3ZlbWVudCwgbm90IGNyaXRpY2FsLlxuICAgICAgICBlbC5zY3JvbGxUb3AgKz0gZFk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVsID0gKHNjcm9sbFJlZiA9PSBudWxsID8gdm9pZCAwIDogc2Nyb2xsUmVmLmN1cnJlbnQpIHx8IGVsZW1lbnRzLmZsb2F0aW5nO1xuICAgIGlmIChvcGVuICYmIGVsKSB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uV2hlZWwpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgcG9zaXRpb24gdG8gYmUgcmVhZHkuXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBwcmV2U2Nyb2xsVG9wUmVmLmN1cnJlbnQgPSBlbC5zY3JvbGxUb3A7XG4gICAgICAgIGlmIChvdmVyZmxvd1JlZi5jdXJyZW50ICE9IG51bGwpIHtcbiAgICAgICAgICBpbml0aWFsT3ZlcmZsb3dSZWYuY3VycmVudCA9IHtcbiAgICAgICAgICAgIC4uLm92ZXJmbG93UmVmLmN1cnJlbnRcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHByZXZTY3JvbGxUb3BSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgIGluaXRpYWxPdmVyZmxvd1JlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbldoZWVsKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgb3BlbiwgZWxlbWVudHMuZmxvYXRpbmcsIG92ZXJmbG93UmVmLCBzY3JvbGxSZWYsIG9uQ2hhbmdlXSk7XG4gIGNvbnN0IGZsb2F0aW5nID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIG9uS2V5RG93bigpIHtcbiAgICAgIGNvbnRyb2xsZWRTY3JvbGxpbmdSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfSxcbiAgICBvbldoZWVsKCkge1xuICAgICAgY29udHJvbGxlZFNjcm9sbGluZ1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSxcbiAgICBvblBvaW50ZXJNb3ZlKCkge1xuICAgICAgY29udHJvbGxlZFNjcm9sbGluZ1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSxcbiAgICBvblNjcm9sbCgpIHtcbiAgICAgIGNvbnN0IGVsID0gKHNjcm9sbFJlZiA9PSBudWxsID8gdm9pZCAwIDogc2Nyb2xsUmVmLmN1cnJlbnQpIHx8IGVsZW1lbnRzLmZsb2F0aW5nO1xuICAgICAgaWYgKCFvdmVyZmxvd1JlZi5jdXJyZW50IHx8ICFlbCB8fCAhY29udHJvbGxlZFNjcm9sbGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwcmV2U2Nyb2xsVG9wUmVmLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGlmZiA9IGVsLnNjcm9sbFRvcCAtIHByZXZTY3JvbGxUb3BSZWYuY3VycmVudDtcbiAgICAgICAgaWYgKG92ZXJmbG93UmVmLmN1cnJlbnQuYm90dG9tIDwgLTAuNSAmJiBzY3JvbGxEaWZmIDwgLTEgfHwgb3ZlcmZsb3dSZWYuY3VycmVudC50b3AgPCAtMC41ICYmIHNjcm9sbERpZmYgPiAxKSB7XG4gICAgICAgICAgUmVhY3RET00uZmx1c2hTeW5jKCgpID0+IG9uQ2hhbmdlKGQgPT4gZCArIHNjcm9sbERpZmYpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBbRmlyZWZveF0gV2FpdCBmb3IgdGhlIGhlaWdodCBjaGFuZ2UgdG8gaGF2ZSBiZWVuIGFwcGxpZWQuXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBwcmV2U2Nyb2xsVG9wUmVmLmN1cnJlbnQgPSBlbC5zY3JvbGxUb3A7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pLCBbZWxlbWVudHMuZmxvYXRpbmcsIG9uQ2hhbmdlLCBvdmVyZmxvd1JlZiwgc2Nyb2xsUmVmXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IGVuYWJsZWQgPyB7XG4gICAgZmxvYXRpbmdcbiAgfSA6IHt9LCBbZW5hYmxlZCwgZmxvYXRpbmddKTtcbn1cblxuZnVuY3Rpb24gaXNQb2ludEluUG9seWdvbihwb2ludCwgcG9seWdvbikge1xuICBjb25zdCBbeCwgeV0gPSBwb2ludDtcbiAgbGV0IGlzSW5zaWRlID0gZmFsc2U7XG4gIGNvbnN0IGxlbmd0aCA9IHBvbHlnb24ubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMCwgaiA9IGxlbmd0aCAtIDE7IGkgPCBsZW5ndGg7IGogPSBpKyspIHtcbiAgICBjb25zdCBbeGksIHlpXSA9IHBvbHlnb25baV0gfHwgWzAsIDBdO1xuICAgIGNvbnN0IFt4aiwgeWpdID0gcG9seWdvbltqXSB8fCBbMCwgMF07XG4gICAgY29uc3QgaW50ZXJzZWN0ID0geWkgPj0geSAhPT0geWogPj0geSAmJiB4IDw9ICh4aiAtIHhpKSAqICh5IC0geWkpIC8gKHlqIC0geWkpICsgeGk7XG4gICAgaWYgKGludGVyc2VjdCkge1xuICAgICAgaXNJbnNpZGUgPSAhaXNJbnNpZGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBpc0luc2lkZTtcbn1cbmZ1bmN0aW9uIGlzSW5zaWRlKHBvaW50LCByZWN0KSB7XG4gIHJldHVybiBwb2ludFswXSA+PSByZWN0LnggJiYgcG9pbnRbMF0gPD0gcmVjdC54ICsgcmVjdC53aWR0aCAmJiBwb2ludFsxXSA+PSByZWN0LnkgJiYgcG9pbnRbMV0gPD0gcmVjdC55ICsgcmVjdC5oZWlnaHQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHNhZmUgcG9seWdvbiBhcmVhIHRoYXQgdGhlIHVzZXIgY2FuIHRyYXZlcnNlIHdpdGhvdXQgY2xvc2luZyB0aGVcbiAqIGZsb2F0aW5nIGVsZW1lbnQgb25jZSBsZWF2aW5nIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VIb3ZlciNzYWZlcG9seWdvblxuICovXG5mdW5jdGlvbiBzYWZlUG9seWdvbihvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIGJ1ZmZlciA9IDAuNSxcbiAgICBibG9ja1BvaW50ZXJFdmVudHMgPSBmYWxzZSxcbiAgICByZXF1aXJlSW50ZW50ID0gdHJ1ZVxuICB9ID0gb3B0aW9ucztcbiAgbGV0IHRpbWVvdXRJZDtcbiAgbGV0IGhhc0xhbmRlZCA9IGZhbHNlO1xuICBsZXQgbGFzdFggPSBudWxsO1xuICBsZXQgbGFzdFkgPSBudWxsO1xuICBsZXQgbGFzdEN1cnNvclRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgZnVuY3Rpb24gZ2V0Q3Vyc29yU3BlZWQoeCwgeSkge1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgZWxhcHNlZFRpbWUgPSBjdXJyZW50VGltZSAtIGxhc3RDdXJzb3JUaW1lO1xuICAgIGlmIChsYXN0WCA9PT0gbnVsbCB8fCBsYXN0WSA9PT0gbnVsbCB8fCBlbGFwc2VkVGltZSA9PT0gMCkge1xuICAgICAgbGFzdFggPSB4O1xuICAgICAgbGFzdFkgPSB5O1xuICAgICAgbGFzdEN1cnNvclRpbWUgPSBjdXJyZW50VGltZTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBkZWx0YVggPSB4IC0gbGFzdFg7XG4gICAgY29uc3QgZGVsdGFZID0geSAtIGxhc3RZO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gICAgY29uc3Qgc3BlZWQgPSBkaXN0YW5jZSAvIGVsYXBzZWRUaW1lOyAvLyBweCAvIG1zXG5cbiAgICBsYXN0WCA9IHg7XG4gICAgbGFzdFkgPSB5O1xuICAgIGxhc3RDdXJzb3JUaW1lID0gY3VycmVudFRpbWU7XG4gICAgcmV0dXJuIHNwZWVkO1xuICB9XG4gIGNvbnN0IGZuID0gX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgcGxhY2VtZW50LFxuICAgICAgZWxlbWVudHMsXG4gICAgICBvbkNsb3NlLFxuICAgICAgbm9kZUlkLFxuICAgICAgdHJlZVxuICAgIH0gPSBfcmVmO1xuICAgIHJldHVybiBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkge1xuICAgICAgZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICBvbkNsb3NlKCk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgIGlmICghZWxlbWVudHMuZG9tUmVmZXJlbmNlIHx8ICFlbGVtZW50cy5mbG9hdGluZyB8fCBwbGFjZW1lbnQgPT0gbnVsbCB8fCB4ID09IG51bGwgfHwgeSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2xpZW50WCxcbiAgICAgICAgY2xpZW50WVxuICAgICAgfSA9IGV2ZW50O1xuICAgICAgY29uc3QgY2xpZW50UG9pbnQgPSBbY2xpZW50WCwgY2xpZW50WV07XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQpO1xuICAgICAgY29uc3QgaXNMZWF2ZSA9IGV2ZW50LnR5cGUgPT09ICdtb3VzZWxlYXZlJztcbiAgICAgIGNvbnN0IGlzT3ZlckZsb2F0aW5nRWwgPSBjb250YWlucyhlbGVtZW50cy5mbG9hdGluZywgdGFyZ2V0KTtcbiAgICAgIGNvbnN0IGlzT3ZlclJlZmVyZW5jZUVsID0gY29udGFpbnMoZWxlbWVudHMuZG9tUmVmZXJlbmNlLCB0YXJnZXQpO1xuICAgICAgY29uc3QgcmVmUmVjdCA9IGVsZW1lbnRzLmRvbVJlZmVyZW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50cy5mbG9hdGluZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHNpZGUgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgICAgIGNvbnN0IGN1cnNvckxlYXZlRnJvbVJpZ2h0ID0geCA+IHJlY3QucmlnaHQgLSByZWN0LndpZHRoIC8gMjtcbiAgICAgIGNvbnN0IGN1cnNvckxlYXZlRnJvbUJvdHRvbSA9IHkgPiByZWN0LmJvdHRvbSAtIHJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgIGNvbnN0IGlzT3ZlclJlZmVyZW5jZVJlY3QgPSBpc0luc2lkZShjbGllbnRQb2ludCwgcmVmUmVjdCk7XG4gICAgICBjb25zdCBpc0Zsb2F0aW5nV2lkZXIgPSByZWN0LndpZHRoID4gcmVmUmVjdC53aWR0aDtcbiAgICAgIGNvbnN0IGlzRmxvYXRpbmdUYWxsZXIgPSByZWN0LmhlaWdodCA+IHJlZlJlY3QuaGVpZ2h0O1xuICAgICAgY29uc3QgbGVmdCA9IChpc0Zsb2F0aW5nV2lkZXIgPyByZWZSZWN0IDogcmVjdCkubGVmdDtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gKGlzRmxvYXRpbmdXaWRlciA/IHJlZlJlY3QgOiByZWN0KS5yaWdodDtcbiAgICAgIGNvbnN0IHRvcCA9IChpc0Zsb2F0aW5nVGFsbGVyID8gcmVmUmVjdCA6IHJlY3QpLnRvcDtcbiAgICAgIGNvbnN0IGJvdHRvbSA9IChpc0Zsb2F0aW5nVGFsbGVyID8gcmVmUmVjdCA6IHJlY3QpLmJvdHRvbTtcbiAgICAgIGlmIChpc092ZXJGbG9hdGluZ0VsKSB7XG4gICAgICAgIGhhc0xhbmRlZCA9IHRydWU7XG4gICAgICAgIGlmICghaXNMZWF2ZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzT3ZlclJlZmVyZW5jZUVsKSB7XG4gICAgICAgIGhhc0xhbmRlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlzT3ZlclJlZmVyZW5jZUVsICYmICFpc0xlYXZlKSB7XG4gICAgICAgIGhhc0xhbmRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUHJldmVudCBvdmVybGFwcGluZyBmbG9hdGluZyBlbGVtZW50IGZyb20gYmVpbmcgc3R1Y2sgaW4gYW4gb3Blbi1jbG9zZVxuICAgICAgLy8gbG9vcDogaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8xOTEwXG4gICAgICBpZiAoaXNMZWF2ZSAmJiBpc0VsZW1lbnQoZXZlbnQucmVsYXRlZFRhcmdldCkgJiYgY29udGFpbnMoZWxlbWVudHMuZmxvYXRpbmcsIGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYW55IG5lc3RlZCBjaGlsZCBpcyBvcGVuLCBhYm9ydC5cbiAgICAgIGlmICh0cmVlICYmIGdldENoaWxkcmVuKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKS5zb21lKF9yZWYyID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgIH0gPSBfcmVmMjtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRleHQub3BlbjtcbiAgICAgIH0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHBvaW50ZXIgaXMgbGVhdmluZyBmcm9tIHRoZSBvcHBvc2l0ZSBzaWRlLCB0aGUgXCJidWZmZXJcIiBsb2dpY1xuICAgICAgLy8gY3JlYXRlcyBhIHBvaW50IHdoZXJlIHRoZSBmbG9hdGluZyBlbGVtZW50IHJlbWFpbnMgb3BlbiwgYnV0IHNob3VsZCBiZVxuICAgICAgLy8gaWdub3JlZC5cbiAgICAgIC8vIEEgY29uc3RhbnQgb2YgMSBoYW5kbGVzIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycy5cbiAgICAgIGlmIChzaWRlID09PSAndG9wJyAmJiB5ID49IHJlZlJlY3QuYm90dG9tIC0gMSB8fCBzaWRlID09PSAnYm90dG9tJyAmJiB5IDw9IHJlZlJlY3QudG9wICsgMSB8fCBzaWRlID09PSAnbGVmdCcgJiYgeCA+PSByZWZSZWN0LnJpZ2h0IC0gMSB8fCBzaWRlID09PSAncmlnaHQnICYmIHggPD0gcmVmUmVjdC5sZWZ0ICsgMSkge1xuICAgICAgICByZXR1cm4gY2xvc2UoKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWdub3JlIHdoZW4gdGhlIGN1cnNvciBpcyB3aXRoaW4gdGhlIHJlY3Rhbmd1bGFyIHRyb3VnaCBiZXR3ZWVuIHRoZVxuICAgICAgLy8gdHdvIGVsZW1lbnRzLiBTaW5jZSB0aGUgdHJpYW5nbGUgaXMgY3JlYXRlZCBmcm9tIHRoZSBjdXJzb3IgcG9pbnQsXG4gICAgICAvLyB3aGljaCBjYW4gc3RhcnQgYmV5b25kIHRoZSByZWYgZWxlbWVudCdzIGVkZ2UsIHRyYXZlcnNpbmcgYmFjayBhbmRcbiAgICAgIC8vIGZvcnRoIGZyb20gdGhlIHJlZiB0byB0aGUgZmxvYXRpbmcgZWxlbWVudCBjYW4gY2F1c2UgaXQgdG8gY2xvc2UuIFRoaXNcbiAgICAgIC8vIGVuc3VyZXMgaXQgYWx3YXlzIHJlbWFpbnMgb3BlbiBpbiB0aGF0IGNhc2UuXG4gICAgICBsZXQgcmVjdFBvbHkgPSBbXTtcbiAgICAgIHN3aXRjaCAoc2lkZSkge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHJlY3RQb2x5ID0gW1tsZWZ0LCByZWZSZWN0LnRvcCArIDFdLCBbbGVmdCwgcmVjdC5ib3R0b20gLSAxXSwgW3JpZ2h0LCByZWN0LmJvdHRvbSAtIDFdLCBbcmlnaHQsIHJlZlJlY3QudG9wICsgMV1dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHJlY3RQb2x5ID0gW1tsZWZ0LCByZWN0LnRvcCArIDFdLCBbbGVmdCwgcmVmUmVjdC5ib3R0b20gLSAxXSwgW3JpZ2h0LCByZWZSZWN0LmJvdHRvbSAtIDFdLCBbcmlnaHQsIHJlY3QudG9wICsgMV1dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICByZWN0UG9seSA9IFtbcmVjdC5yaWdodCAtIDEsIGJvdHRvbV0sIFtyZWN0LnJpZ2h0IC0gMSwgdG9wXSwgW3JlZlJlY3QubGVmdCArIDEsIHRvcF0sIFtyZWZSZWN0LmxlZnQgKyAxLCBib3R0b21dXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIHJlY3RQb2x5ID0gW1tyZWZSZWN0LnJpZ2h0IC0gMSwgYm90dG9tXSwgW3JlZlJlY3QucmlnaHQgLSAxLCB0b3BdLCBbcmVjdC5sZWZ0ICsgMSwgdG9wXSwgW3JlY3QubGVmdCArIDEsIGJvdHRvbV1dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gZ2V0UG9seWdvbihfcmVmMykge1xuICAgICAgICBsZXQgW3gsIHldID0gX3JlZjM7XG4gICAgICAgIHN3aXRjaCAoc2lkZSkge1xuICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50T25lID0gW2lzRmxvYXRpbmdXaWRlciA/IHggKyBidWZmZXIgLyAyIDogY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyB4ICsgYnVmZmVyICogNCA6IHggLSBidWZmZXIgKiA0LCB5ICsgYnVmZmVyICsgMV07XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50VHdvID0gW2lzRmxvYXRpbmdXaWRlciA/IHggLSBidWZmZXIgLyAyIDogY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyB4ICsgYnVmZmVyICogNCA6IHggLSBidWZmZXIgKiA0LCB5ICsgYnVmZmVyICsgMV07XG4gICAgICAgICAgICAgIGNvbnN0IGNvbW1vblBvaW50cyA9IFtbcmVjdC5sZWZ0LCBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IHJlY3QuYm90dG9tIC0gYnVmZmVyIDogaXNGbG9hdGluZ1dpZGVyID8gcmVjdC5ib3R0b20gLSBidWZmZXIgOiByZWN0LnRvcF0sIFtyZWN0LnJpZ2h0LCBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IGlzRmxvYXRpbmdXaWRlciA/IHJlY3QuYm90dG9tIC0gYnVmZmVyIDogcmVjdC50b3AgOiByZWN0LmJvdHRvbSAtIGJ1ZmZlcl1dO1xuICAgICAgICAgICAgICByZXR1cm4gW2N1cnNvclBvaW50T25lLCBjdXJzb3JQb2ludFR3bywgLi4uY29tbW9uUG9pbnRzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludE9uZSA9IFtpc0Zsb2F0aW5nV2lkZXIgPyB4ICsgYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8geCArIGJ1ZmZlciAqIDQgOiB4IC0gYnVmZmVyICogNCwgeSAtIGJ1ZmZlcl07XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50VHdvID0gW2lzRmxvYXRpbmdXaWRlciA/IHggLSBidWZmZXIgLyAyIDogY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyB4ICsgYnVmZmVyICogNCA6IHggLSBidWZmZXIgKiA0LCB5IC0gYnVmZmVyXTtcbiAgICAgICAgICAgICAgY29uc3QgY29tbW9uUG9pbnRzID0gW1tyZWN0LmxlZnQsIGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8gcmVjdC50b3AgKyBidWZmZXIgOiBpc0Zsb2F0aW5nV2lkZXIgPyByZWN0LnRvcCArIGJ1ZmZlciA6IHJlY3QuYm90dG9tXSwgW3JlY3QucmlnaHQsIGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8gaXNGbG9hdGluZ1dpZGVyID8gcmVjdC50b3AgKyBidWZmZXIgOiByZWN0LmJvdHRvbSA6IHJlY3QudG9wICsgYnVmZmVyXV07XG4gICAgICAgICAgICAgIHJldHVybiBbY3Vyc29yUG9pbnRPbmUsIGN1cnNvclBvaW50VHdvLCAuLi5jb21tb25Qb2ludHNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludE9uZSA9IFt4ICsgYnVmZmVyICsgMSwgaXNGbG9hdGluZ1RhbGxlciA/IHkgKyBidWZmZXIgLyAyIDogY3Vyc29yTGVhdmVGcm9tQm90dG9tID8geSArIGJ1ZmZlciAqIDQgOiB5IC0gYnVmZmVyICogNF07XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50VHdvID0gW3ggKyBidWZmZXIgKyAxLCBpc0Zsb2F0aW5nVGFsbGVyID8geSAtIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyB5ICsgYnVmZmVyICogNCA6IHkgLSBidWZmZXIgKiA0XTtcbiAgICAgICAgICAgICAgY29uc3QgY29tbW9uUG9pbnRzID0gW1tjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyByZWN0LnJpZ2h0IC0gYnVmZmVyIDogaXNGbG9hdGluZ1RhbGxlciA/IHJlY3QucmlnaHQgLSBidWZmZXIgOiByZWN0LmxlZnQsIHJlY3QudG9wXSwgW2N1cnNvckxlYXZlRnJvbUJvdHRvbSA/IGlzRmxvYXRpbmdUYWxsZXIgPyByZWN0LnJpZ2h0IC0gYnVmZmVyIDogcmVjdC5sZWZ0IDogcmVjdC5yaWdodCAtIGJ1ZmZlciwgcmVjdC5ib3R0b21dXTtcbiAgICAgICAgICAgICAgcmV0dXJuIFsuLi5jb21tb25Qb2ludHMsIGN1cnNvclBvaW50T25lLCBjdXJzb3JQb2ludFR3b107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludE9uZSA9IFt4IC0gYnVmZmVyLCBpc0Zsb2F0aW5nVGFsbGVyID8geSArIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyB5ICsgYnVmZmVyICogNCA6IHkgLSBidWZmZXIgKiA0XTtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRUd28gPSBbeCAtIGJ1ZmZlciwgaXNGbG9hdGluZ1RhbGxlciA/IHkgLSBidWZmZXIgLyAyIDogY3Vyc29yTGVhdmVGcm9tQm90dG9tID8geSArIGJ1ZmZlciAqIDQgOiB5IC0gYnVmZmVyICogNF07XG4gICAgICAgICAgICAgIGNvbnN0IGNvbW1vblBvaW50cyA9IFtbY3Vyc29yTGVhdmVGcm9tQm90dG9tID8gcmVjdC5sZWZ0ICsgYnVmZmVyIDogaXNGbG9hdGluZ1RhbGxlciA/IHJlY3QubGVmdCArIGJ1ZmZlciA6IHJlY3QucmlnaHQsIHJlY3QudG9wXSwgW2N1cnNvckxlYXZlRnJvbUJvdHRvbSA/IGlzRmxvYXRpbmdUYWxsZXIgPyByZWN0LmxlZnQgKyBidWZmZXIgOiByZWN0LnJpZ2h0IDogcmVjdC5sZWZ0ICsgYnVmZmVyLCByZWN0LmJvdHRvbV1dO1xuICAgICAgICAgICAgICByZXR1cm4gW2N1cnNvclBvaW50T25lLCBjdXJzb3JQb2ludFR3bywgLi4uY29tbW9uUG9pbnRzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzUG9pbnRJblBvbHlnb24oW2NsaWVudFgsIGNsaWVudFldLCByZWN0UG9seSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGhhc0xhbmRlZCAmJiAhaXNPdmVyUmVmZXJlbmNlUmVjdCkge1xuICAgICAgICByZXR1cm4gY2xvc2UoKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNMZWF2ZSAmJiByZXF1aXJlSW50ZW50KSB7XG4gICAgICAgIGNvbnN0IGN1cnNvclNwZWVkID0gZ2V0Q3Vyc29yU3BlZWQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICAgIGNvbnN0IGN1cnNvclNwZWVkVGhyZXNob2xkID0gMC4xO1xuICAgICAgICBpZiAoY3Vyc29yU3BlZWQgIT09IG51bGwgJiYgY3Vyc29yU3BlZWQgPCBjdXJzb3JTcGVlZFRocmVzaG9sZCkge1xuICAgICAgICAgIHJldHVybiBjbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzUG9pbnRJblBvbHlnb24oW2NsaWVudFgsIGNsaWVudFldLCBnZXRQb2x5Z29uKFt4LCB5XSkpKSB7XG4gICAgICAgIGNsb3NlKCk7XG4gICAgICB9IGVsc2UgaWYgKCFoYXNMYW5kZWQgJiYgcmVxdWlyZUludGVudCkge1xuICAgICAgICB0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dChjbG9zZSwgNDApO1xuICAgICAgfVxuICAgIH07XG4gIH07XG4gIGZuLl9fb3B0aW9ucyA9IHtcbiAgICBibG9ja1BvaW50ZXJFdmVudHNcbiAgfTtcbiAgcmV0dXJuIGZuO1xufVxuXG5leHBvcnQgeyBDb21wb3NpdGUsIENvbXBvc2l0ZUl0ZW0sIEZsb2F0aW5nQXJyb3csIEZsb2F0aW5nRGVsYXlHcm91cCwgRmxvYXRpbmdGb2N1c01hbmFnZXIsIEZsb2F0aW5nTGlzdCwgRmxvYXRpbmdOb2RlLCBGbG9hdGluZ092ZXJsYXksIEZsb2F0aW5nUG9ydGFsLCBGbG9hdGluZ1RyZWUsIGlubmVyLCBzYWZlUG9seWdvbiwgdXNlQ2xpY2ssIHVzZUNsaWVudFBvaW50LCB1c2VEZWxheUdyb3VwLCB1c2VEZWxheUdyb3VwQ29udGV4dCwgdXNlRGlzbWlzcywgdXNlRmxvYXRpbmcsIHVzZUZsb2F0aW5nTm9kZUlkLCB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCwgdXNlRmxvYXRpbmdQb3J0YWxOb2RlLCB1c2VGbG9hdGluZ1Jvb3RDb250ZXh0LCB1c2VGbG9hdGluZ1RyZWUsIHVzZUZvY3VzLCB1c2VIb3ZlciwgdXNlSWQsIHVzZUlubmVyT2Zmc2V0LCB1c2VJbnRlcmFjdGlvbnMsIHVzZUxpc3RJdGVtLCB1c2VMaXN0TmF2aWdhdGlvbiwgdXNlTWVyZ2VSZWZzLCB1c2VSb2xlLCB1c2VUcmFuc2l0aW9uU3RhdHVzLCB1c2VUcmFuc2l0aW9uU3R5bGVzLCB1c2VUeXBlYWhlYWQgfTtcbiIsImltcG9ydCBwYWtvIGZyb20gJ3Bha28nO1xuXG52YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxuZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4sIG1vZHVsZSkge1xuXHRyZXR1cm4gbW9kdWxlID0geyBleHBvcnRzOiB7fSB9LCBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7XG59XG5cbmZ1bmN0aW9uIGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UgKG4pIHtcblx0cmV0dXJuIG4gJiYgblsnZGVmYXVsdCddIHx8IG47XG59XG5cbnZhciBieXRlTGVuZ3RoXzEgPSBieXRlTGVuZ3RoO1xudmFyIHRvQnl0ZUFycmF5XzEgPSB0b0J5dGVBcnJheTtcbnZhciBmcm9tQnl0ZUFycmF5XzEgPSBmcm9tQnl0ZUFycmF5O1xudmFyIGxvb2t1cCA9IFtdO1xudmFyIHJldkxvb2t1cCA9IFtdO1xudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheTtcbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldO1xuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGk7XG59IC8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcblxuXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjI7XG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjM7XG5cbmZ1bmN0aW9uIGdldExlbnMoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoO1xuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpO1xuICB9IC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcblxuXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9Jyk7XG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuO1xuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlbiA/IDAgOiA0IC0gdmFsaWRMZW4gJSA0O1xuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dO1xufSAvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcblxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KTtcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXTtcbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV07XG4gIHJldHVybiAodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQgLSBwbGFjZUhvbGRlcnNMZW47XG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzTGVuO1xufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheShiNjQpIHtcbiAgdmFyIHRtcDtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NCk7XG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF07XG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdO1xuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKTtcbiAgdmFyIGN1ckJ5dGUgPSAwOyAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG5cbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDAgPyB2YWxpZExlbiAtIDQgOiB2YWxpZExlbjtcbiAgdmFyIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID0gcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNiB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldO1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wID4+IDE2ICYgMHhGRjtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCA+PiA4ICYgMHhGRjtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkY7XG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID0gcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNDtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkY7XG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID0gcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyO1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wID4+IDggJiAweEZGO1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRjtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICsgbG9va3VwW251bSAmIDB4M0ZdO1xufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wO1xuICB2YXIgb3V0cHV0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYgJiAweEZGMDAwMCkgKyAodWludDhbaSArIDFdIDw8IDggJiAweEZGMDApICsgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpO1xuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkodWludDgpIHtcbiAgdmFyIHRtcDtcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aDtcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzOyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuXG4gIHZhciBwYXJ0cyA9IFtdO1xuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MzsgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcblxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgaSArIG1heENodW5rTGVuZ3RoID4gbGVuMiA/IGxlbjIgOiBpICsgbWF4Q2h1bmtMZW5ndGgpKTtcbiAgfSAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG5cblxuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdO1xuICAgIHBhcnRzLnB1c2gobG9va3VwW3RtcCA+PiAyXSArIGxvb2t1cFt0bXAgPDwgNCAmIDB4M0ZdICsgJz09Jyk7XG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdO1xuICAgIHBhcnRzLnB1c2gobG9va3VwW3RtcCA+PiAxMF0gKyBsb29rdXBbdG1wID4+IDQgJiAweDNGXSArIGxvb2t1cFt0bXAgPDwgMiAmIDB4M0ZdICsgJz0nKTtcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKTtcbn1cblxudmFyIGJhc2U2NEpzID0ge1xuICBieXRlTGVuZ3RoOiBieXRlTGVuZ3RoXzEsXG4gIHRvQnl0ZUFycmF5OiB0b0J5dGVBcnJheV8xLFxuICBmcm9tQnl0ZUFycmF5OiBmcm9tQnl0ZUFycmF5XzFcbn07XG5cbnZhciByZWFkID0gZnVuY3Rpb24gcmVhZChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIG5CaXRzID0gLTc7XG4gIHZhciBpID0gaXNMRSA/IG5CeXRlcyAtIDEgOiAwO1xuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDE7XG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldO1xuICBpICs9IGQ7XG4gIGUgPSBzICYgKDEgPDwgLW5CaXRzKSAtIDE7XG4gIHMgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gZUxlbjtcblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKDEgPDwgLW5CaXRzKSAtIDE7XG4gIGUgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gbUxlbjtcblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhcztcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAocyA/IC0xIDogMSkgKiBJbmZpbml0eTtcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pO1xuICAgIGUgPSBlIC0gZUJpYXM7XG4gIH1cblxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKTtcbn07XG5cbnZhciB3cml0ZSA9IGZ1bmN0aW9uIHdyaXRlKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIHJ0ID0gbUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDA7XG4gIHZhciBpID0gaXNMRSA/IDAgOiBuQnl0ZXMgLSAxO1xuICB2YXIgZCA9IGlzTEUgPyAxIDogLTE7XG4gIHZhciBzID0gdmFsdWUgPCAwIHx8IHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDAgPyAxIDogMDtcbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSk7XG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDA7XG4gICAgZSA9IGVNYXg7XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpO1xuXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tO1xuICAgICAgYyAqPSAyO1xuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcyk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKys7XG4gICAgICBjIC89IDI7XG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMDtcbiAgICAgIGUgPSBlTWF4O1xuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSBlICsgZUJpYXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSAwO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IGUgPDwgbUxlbiB8IG07XG4gIGVMZW4gKz0gbUxlbjtcblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4O1xufTtcblxudmFyIGllZWU3NTQgPSB7XG4gIHJlYWQ6IHJlYWQsXG4gIHdyaXRlOiB3cml0ZVxufTtcblxudmFyIGJ1ZmZlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuICB2YXIgY3VzdG9tSW5zcGVjdFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbFtcImZvclwiXSA9PT0gJ2Z1bmN0aW9uJyA/IFN5bWJvbFtcImZvclwiXSgnbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKSA6IG51bGw7XG4gIGV4cG9ydHMuQnVmZmVyID0gQnVmZmVyO1xuICBleHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyO1xuICBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTA7XG4gIHZhciBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmO1xuICBleHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEg7XG4gIC8qKlxuICAgKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICAgKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICAgKiAgID09PSBmYWxzZSAgIFByaW50IHdhcm5pbmcgYW5kIHJlY29tbWVuZCB1c2luZyBgYnVmZmVyYCB2NC54IHdoaWNoIGhhcyBhbiBPYmplY3RcbiAgICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAgICpcbiAgICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICAgKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gICAqXG4gICAqIFdlIHJlcG9ydCB0aGF0IHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGlmIHRoZSBhcmUgbm90IHN1YmNsYXNzYWJsZVxuICAgKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gICAqIChTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOCkuIElFIDEwIGxhY2tzIHN1cHBvcnRcbiAgICogZm9yIF9fcHJvdG9fXyBhbmQgaGFzIGEgYnVnZ3kgdHlwZWQgYXJyYXkgaW1wbGVtZW50YXRpb24uXG4gICAqL1xuXG4gIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gdHlwZWRBcnJheVN1cHBvcnQoKTtcblxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSAnICsgJ2BidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuJyk7XG4gIH1cblxuICBmdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCgpIHtcbiAgICAvLyBDYW4gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWQ/XG4gICAgdHJ5IHtcbiAgICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKTtcbiAgICAgIHZhciBwcm90byA9IHtcbiAgICAgICAgZm9vOiBmdW5jdGlvbiBmb28oKSB7XG4gICAgICAgICAgcmV0dXJuIDQyO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHByb3RvLCBVaW50OEFycmF5LnByb3RvdHlwZSk7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYXJyLCBwcm90byk7XG4gICAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdwYXJlbnQnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAnb2Zmc2V0Jywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzLmJ5dGVPZmZzZXQ7XG4gICAgfVxuICB9KTtcblxuICBmdW5jdGlvbiBjcmVhdGVCdWZmZXIobGVuZ3RoKSB7XG4gICAgaWYgKGxlbmd0aCA+IEtfTUFYX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBsZW5ndGggKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJyk7XG4gICAgfSAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuXG5cbiAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVmLCBCdWZmZXIucHJvdG90eXBlKTtcbiAgICByZXR1cm4gYnVmO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAgICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICAgKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gICAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gICAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gICAqXG4gICAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAgICovXG5cblxuICBmdW5jdGlvbiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICAvLyBDb21tb24gY2FzZS5cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFsbG9jVW5zYWZlKGFyZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpO1xuICB9XG5cbiAgQnVmZmVyLnBvb2xTaXplID0gODE5MjsgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4gIGZ1bmN0aW9uIGZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZnJvbVN0cmluZyh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNJbnN0YW5jZSh2YWx1ZSwgQXJyYXlCdWZmZXIpIHx8IHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBBcnJheUJ1ZmZlcikpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgKGlzSW5zdGFuY2UodmFsdWUsIFNoYXJlZEFycmF5QnVmZmVyKSB8fCB2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgU2hhcmVkQXJyYXlCdWZmZXIpKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInKTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVPZiA9IHZhbHVlLnZhbHVlT2YgJiYgdmFsdWUudmFsdWVPZigpO1xuXG4gICAgaWYgKHZhbHVlT2YgIT0gbnVsbCAmJiB2YWx1ZU9mICE9PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlT2YsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgdmFyIGIgPSBmcm9tT2JqZWN0KHZhbHVlKTtcbiAgICBpZiAoYikgcmV0dXJuIGI7XG5cbiAgICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvUHJpbWl0aXZlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdKCdzdHJpbmcnKSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICsgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICAgKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAgICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICAgKiBCdWZmZXIuZnJvbShhcnJheSlcbiAgICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICAgKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAgICoqL1xuXG5cbiAgQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBmcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpO1xuICB9OyAvLyBOb3RlOiBDaGFuZ2UgcHJvdG90eXBlICphZnRlciogQnVmZmVyLmZyb20gaXMgZGVmaW5lZCB0byB3b3JrYXJvdW5kIENocm9tZSBidWc6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvMTQ4XG5cblxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLnByb3RvdHlwZSwgVWludDhBcnJheS5wcm90b3R5cGUpO1xuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLCBVaW50OEFycmF5KTtcblxuICBmdW5jdGlvbiBhc3NlcnRTaXplKHNpemUpIHtcbiAgICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJyk7XG4gICAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gICAgYXNzZXJ0U2l6ZShzaXplKTtcblxuICAgIGlmIChzaXplIDw9IDApIHtcbiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnID8gY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpIDogY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICAgKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gICAqKi9cblxuXG4gIEJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICAgIHJldHVybiBhbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gYWxsb2NVbnNhZmUoc2l6ZSkge1xuICAgIGFzc2VydFNpemUoc2l6ZSk7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMCk7XG4gIH1cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gICAqICovXG5cblxuICBCdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICAgIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKTtcbiAgfTtcbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICAgKi9cblxuXG4gIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICAgIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKTtcbiAgfTtcblxuICBmdW5jdGlvbiBmcm9tU3RyaW5nKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICAgIGVuY29kaW5nID0gJ3V0ZjgnO1xuICAgIH1cblxuICAgIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICAgIH1cblxuICAgIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMDtcbiAgICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aCk7XG4gICAgdmFyIGFjdHVhbCA9IGJ1Zi53cml0ZShzdHJpbmcsIGVuY29kaW5nKTtcblxuICAgIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgICBidWYgPSBidWYuc2xpY2UoMCwgYWN0dWFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgZnVuY3Rpb24gZnJvbUFycmF5TGlrZShhcnJheSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDA7XG4gICAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgYnVmW2ldID0gYXJyYXlbaV0gJiAyNTU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlcihhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJvZmZzZXRcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTtcbiAgICB9XG5cbiAgICB2YXIgYnVmO1xuXG4gICAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpO1xuICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gICAgfSAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuXG5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVmLCBCdWZmZXIucHJvdG90eXBlKTtcbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgZnVuY3Rpb24gZnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMDtcbiAgICAgIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuKTtcblxuICAgICAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICAgIH1cblxuICAgICAgb2JqLmNvcHkoYnVmLCAwLCAwLCBsZW4pO1xuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IG51bWJlcklzTmFOKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoMCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqLmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrZWQobGVuZ3RoKSB7XG4gICAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwgS19NQVhfTEVOR1RIYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gICAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gICAgaWYgKGxlbmd0aCA+PSBLX01BWF9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgKyAnc2l6ZTogMHgnICsgS19NQVhfTEVOR1RILnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuZ3RoIHwgMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIFNsb3dCdWZmZXIobGVuZ3RoKSB7XG4gICAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgICAgbGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpO1xuICB9XG5cbiAgQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIoYikge1xuICAgIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiYgYiAhPT0gQnVmZmVyLnByb3RvdHlwZTsgLy8gc28gQnVmZmVyLmlzQnVmZmVyKEJ1ZmZlci5wcm90b3R5cGUpIHdpbGwgYmUgZmFsc2VcbiAgfTtcblxuICBCdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAgIGlmIChpc0luc3RhbmNlKGEsIFVpbnQ4QXJyYXkpKSBhID0gQnVmZmVyLmZyb20oYSwgYS5vZmZzZXQsIGEuYnl0ZUxlbmd0aCk7XG4gICAgaWYgKGlzSW5zdGFuY2UoYiwgVWludDhBcnJheSkpIGIgPSBCdWZmZXIuZnJvbShiLCBiLm9mZnNldCwgYi5ieXRlTGVuZ3RoKTtcblxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImJ1ZjFcIiwgXCJidWYyXCIgYXJndW1lbnRzIG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIDA7XG4gICAgdmFyIHggPSBhLmxlbmd0aDtcbiAgICB2YXIgeSA9IGIubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICAgIHggPSBhW2ldO1xuICAgICAgICB5ID0gYltpXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHggPCB5KSByZXR1cm4gLTE7XG4gICAgaWYgKHkgPCB4KSByZXR1cm4gMTtcbiAgICByZXR1cm4gMDtcbiAgfTtcblxuICBCdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdChsaXN0LCBsZW5ndGgpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO1xuICAgIH1cblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICB9XG5cbiAgICB2YXIgaTtcblxuICAgIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGVuZ3RoID0gMDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKTtcbiAgICB2YXIgcG9zID0gMDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYnVmID0gbGlzdFtpXTtcblxuICAgICAgaWYgKGlzSW5zdGFuY2UoYnVmLCBVaW50OEFycmF5KSkge1xuICAgICAgICBidWYgPSBCdWZmZXIuZnJvbShidWYpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO1xuICAgICAgfVxuXG4gICAgICBidWYuY29weShidWZmZXIsIHBvcyk7XG4gICAgICBwb3MgKz0gYnVmLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHN0cmluZy5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IGlzSW5zdGFuY2Uoc3RyaW5nLCBBcnJheUJ1ZmZlcikpIHtcbiAgICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiAnICsgJ1JlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmcpO1xuICAgIH1cblxuICAgIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoO1xuICAgIHZhciBtdXN0TWF0Y2ggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWU7XG4gICAgaWYgKCFtdXN0TWF0Y2ggJiYgbGVuID09PSAwKSByZXR1cm4gMDsgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG5cbiAgICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZTtcblxuICAgIGZvciAoOzspIHtcbiAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICAgIHJldHVybiBsZW47XG5cbiAgICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGg7XG5cbiAgICAgICAgY2FzZSAndWNzMic6XG4gICAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgICByZXR1cm4gbGVuICogMjtcblxuICAgICAgICBjYXNlICdoZXgnOlxuICAgICAgICAgIHJldHVybiBsZW4gPj4+IDE7XG5cbiAgICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aDtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChsb3dlcmVkQ2FzZSkge1xuICAgICAgICAgICAgcmV0dXJuIG11c3RNYXRjaCA/IC0xIDogdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGg7IC8vIGFzc3VtZSB1dGY4XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIHNsb3dUb1N0cmluZyhlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICAgIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlOyAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuICAgIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAgIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAgIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuXG4gICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgICBzdGFydCA9IDA7XG4gICAgfSAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAgIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG5cblxuICAgIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAoZW5kIDw9IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG5cblxuICAgIGVuZCA+Pj49IDA7XG4gICAgc3RhcnQgPj4+PSAwO1xuXG4gICAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKTtcblxuICAgICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKTtcblxuICAgICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKTtcblxuICAgICAgICBjYXNlICd1Y3MyJzpcbiAgICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gICAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCAoYW5kIHRoZSBgaXMtYnVmZmVyYCBucG0gcGFja2FnZSlcbiAgLy8gdG8gZGV0ZWN0IGEgQnVmZmVyIGluc3RhbmNlLiBJdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGluc3RhbmNlb2YgQnVmZmVyYFxuICAvLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudFxuICAvLyBjb3BpZXMgb2YgdGhlICdidWZmZXInIHBhY2thZ2UgaW4gdXNlLiBUaGlzIG1ldGhvZCB3b3JrcyBldmVuIGZvciBCdWZmZXJcbiAgLy8gaW5zdGFuY2VzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gYW5vdGhlciBjb3B5IG9mIHRoZSBgYnVmZmVyYCBwYWNrYWdlLlxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTRcblxuXG4gIEJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZTtcblxuICBmdW5jdGlvbiBzd2FwKGIsIG4sIG0pIHtcbiAgICB2YXIgaSA9IGJbbl07XG4gICAgYltuXSA9IGJbbV07XG4gICAgYlttXSA9IGk7XG4gIH1cblxuICBCdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNigpIHtcbiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG5cbiAgICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgICAgc3dhcCh0aGlzLCBpLCBpICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIoKSB7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoO1xuXG4gICAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICAgIHN3YXAodGhpcywgaSwgaSArIDMpO1xuICAgICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0KCkge1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcblxuICAgIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgICBzd2FwKHRoaXMsIGksIGkgKyA3KTtcbiAgICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KTtcbiAgICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KTtcbiAgICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpO1xuICAgIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZztcblxuICBCdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhiKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKTtcbiAgICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTO1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkucmVwbGFjZSgvKC57Mn0pL2csICckMSAnKS50cmltKCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJztcbiAgICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+JztcbiAgfTtcblxuICBpZiAoY3VzdG9tSW5zcGVjdFN5bWJvbCkge1xuICAgIEJ1ZmZlci5wcm90b3R5cGVbY3VzdG9tSW5zcGVjdFN5bWJvbF0gPSBCdWZmZXIucHJvdG90eXBlLmluc3BlY3Q7XG4gIH1cblxuICBCdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gICAgaWYgKGlzSW5zdGFuY2UodGFyZ2V0LCBVaW50OEFycmF5KSkge1xuICAgICAgdGFyZ2V0ID0gQnVmZmVyLmZyb20odGFyZ2V0LCB0YXJnZXQub2Zmc2V0LCB0YXJnZXQuYnl0ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidGFyZ2V0XCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheS4gJyArICdSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdGFyZ2V0KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH1cblxuICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzU3RhcnQgPSAwO1xuICAgIH1cblxuICAgIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBzdGFydCA+Pj49IDA7XG4gICAgZW5kID4+Pj0gMDtcbiAgICB0aGlzU3RhcnQgPj4+PSAwO1xuICAgIHRoaXNFbmQgPj4+PSAwO1xuICAgIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwO1xuICAgIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydDtcbiAgICB2YXIgeSA9IGVuZCAtIHN0YXJ0O1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KTtcbiAgICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZCk7XG4gICAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgICAgeCA9IHRoaXNDb3B5W2ldO1xuICAgICAgICB5ID0gdGFyZ2V0Q29weVtpXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHggPCB5KSByZXR1cm4gLTE7XG4gICAgaWYgKHkgPCB4KSByZXR1cm4gMTtcbiAgICByZXR1cm4gMDtcbiAgfTsgLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuICAvLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuICAvL1xuICAvLyBBcmd1bWVudHM6XG4gIC8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4gIC8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4gIC8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuICAvLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuICAvLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuXG5cbiAgZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xOyAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuXG4gICAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0O1xuICAgICAgYnl0ZU9mZnNldCA9IDA7XG4gICAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmY7XG4gICAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMDtcbiAgICB9XG5cbiAgICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQ7IC8vIENvZXJjZSB0byBOdW1iZXIuXG5cbiAgICBpZiAobnVtYmVySXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiBidWZmZXIubGVuZ3RoIC0gMTtcbiAgICB9IC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG5cblxuICAgIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0O1xuXG4gICAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgaWYgKGRpcikgcmV0dXJuIC0xO2Vsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxO1xuICAgIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwO2Vsc2UgcmV0dXJuIC0xO1xuICAgIH0gLy8gTm9ybWFsaXplIHZhbFxuXG5cbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpO1xuICAgIH0gLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcblxuXG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhbCA9IHZhbCAmIDB4RkY7IC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cblxuICAgICAgaWYgKHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFt2YWxdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5SW5kZXhPZihhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAgIHZhciBpbmRleFNpemUgPSAxO1xuICAgIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xuICAgIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoO1xuXG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fCBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4U2l6ZSA9IDI7XG4gICAgICAgIGFyckxlbmd0aCAvPSAyO1xuICAgICAgICB2YWxMZW5ndGggLz0gMjtcbiAgICAgICAgYnl0ZU9mZnNldCAvPSAyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWQoYnVmLCBpKSB7XG4gICAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICAgIHJldHVybiBidWZbaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaTtcblxuICAgIGlmIChkaXIpIHtcbiAgICAgIHZhciBmb3VuZEluZGV4ID0gLTE7XG5cbiAgICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaTtcbiAgICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleDtcbiAgICAgICAgICBmb3VuZEluZGV4ID0gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGg7XG5cbiAgICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBmb3VuZCA9IHRydWU7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTE7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKTtcbiAgfTtcblxuICBmdW5jdGlvbiBoZXhXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwO1xuICAgIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0O1xuXG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XG5cbiAgICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoO1xuXG4gICAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICAgIGxlbmd0aCA9IHN0ckxlbiAvIDI7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNik7XG4gICAgICBpZiAobnVtYmVySXNOYU4ocGFyc2VkKSkgcmV0dXJuIGk7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGk7XG4gIH1cblxuICBmdW5jdGlvbiB1dGY4V3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7XG4gIH1cblxuICBmdW5jdGlvbiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxhdGluMVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCk7XG4gIH1cblxuICBmdW5jdGlvbiBiYXNlNjRXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpO1xuICB9XG5cbiAgZnVuY3Rpb24gdWNzMldyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpO1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gICAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuY29kaW5nID0gJ3V0ZjgnO1xuICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgICBvZmZzZXQgPSAwOyAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IG9mZnNldDtcbiAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgICAgb2Zmc2V0ID0gMDsgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcblxuICAgICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwO1xuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmNvZGluZyA9IGxlbmd0aDtcbiAgICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0O1xuICAgIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZztcblxuICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJyk7XG4gICAgfVxuXG4gICAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2U7XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpO1xuXG4gICAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTtcblxuICAgICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCk7XG5cbiAgICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCk7XG5cbiAgICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTtcblxuICAgICAgICBjYXNlICd1Y3MyJzpcbiAgICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gICAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gYmFzZTY0U2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGJhc2U2NEpzLmZyb21CeXRlQXJyYXkoYnVmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJhc2U2NEpzLmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1dGY4U2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGkgPSBzdGFydDtcblxuICAgIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldO1xuICAgICAgdmFyIGNvZGVQb2ludCA9IG51bGw7XG4gICAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IGZpcnN0Qnl0ZSA+IDB4RUYgPyA0IDogZmlyc3RCeXRlID4gMHhERiA/IDMgOiBmaXJzdEJ5dGUgPiAweEJGID8gMiA6IDE7XG5cbiAgICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludDtcblxuICAgICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV07XG5cbiAgICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgc2Vjb25kQnl0ZSAmIDB4M0Y7XG5cbiAgICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdO1xuICAgICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXTtcblxuICAgICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IHRoaXJkQnl0ZSAmIDB4M0Y7XG5cbiAgICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl07XG4gICAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXTtcblxuICAgICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCBmb3VydGhCeXRlICYgMHgzRjtcblxuICAgICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgICBjb2RlUG9pbnQgPSAweEZGRkQ7XG4gICAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxO1xuICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgICAgY29kZVBvaW50IC09IDB4MTAwMDA7XG4gICAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG4gICAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGO1xuICAgICAgfVxuXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQpO1xuICAgICAgaSArPSBieXRlc1BlclNlcXVlbmNlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKTtcbiAgfSAvLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbiAgLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuICAvLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG5cblxuICB2YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDA7XG5cbiAgZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5KGNvZGVQb2ludHMpIHtcbiAgICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGg7XG5cbiAgICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpOyAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gICAgfSAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG5cblxuICAgIHZhciByZXMgPSAnJztcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNjaWlTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgcmV0ID0gJyc7XG4gICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTtcblxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGF0aW4xU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHJldCA9ICcnO1xuICAgIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZCk7XG5cbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgZnVuY3Rpb24gaGV4U2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG4gICAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMDtcbiAgICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuO1xuICAgIHZhciBvdXQgPSAnJztcblxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICBvdXQgKz0gaGV4U2xpY2VMb29rdXBUYWJsZVtidWZbaV1dO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBmdW5jdGlvbiB1dGYxNmxlU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgIHZhciByZXMgPSAnJztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG4gICAgc3RhcnQgPSB+fnN0YXJ0O1xuICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmQ7XG5cbiAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICBzdGFydCArPSBsZW47XG4gICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7XG4gICAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgICAgc3RhcnQgPSBsZW47XG4gICAgfVxuXG4gICAgaWYgKGVuZCA8IDApIHtcbiAgICAgIGVuZCArPSBsZW47XG4gICAgICBpZiAoZW5kIDwgMCkgZW5kID0gMDtcbiAgICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgICAgZW5kID0gbGVuO1xuICAgIH1cblxuICAgIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnQ7XG4gICAgdmFyIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCk7IC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3QnVmLCBCdWZmZXIucHJvdG90eXBlKTtcbiAgICByZXR1cm4gbmV3QnVmO1xuICB9O1xuICAvKlxuICAgKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAgICovXG5cblxuICBmdW5jdGlvbiBjaGVja09mZnNldChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gICAgaWYgKG9mZnNldCAlIDEgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpO1xuICAgIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJyk7XG4gIH1cblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG4gICAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XTtcbiAgICB2YXIgbXVsID0gMTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDA7XG5cbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdO1xuICAgIHZhciBtdWwgPSAxO1xuXG4gICAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDgob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpc1tvZmZzZXRdO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgODtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzW29mZnNldF0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgMV07XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gKHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpICsgdGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzW29mZnNldF0gKiAweDEwMDAwMDAgKyAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNiB8IHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgM10pO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG4gICAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XTtcbiAgICB2YXIgbXVsID0gMTtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWw7XG4gICAgfVxuXG4gICAgbXVsICo9IDB4ODA7XG4gICAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRShvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciBpID0gYnl0ZUxlbmd0aDtcbiAgICB2YXIgbXVsID0gMTtcbiAgICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldO1xuXG4gICAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsO1xuICAgIH1cblxuICAgIG11bCAqPSAweDgwO1xuICAgIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpO1xuICAgIHJldHVybiB2YWw7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4KG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aCk7XG4gICAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiB0aGlzW29mZnNldF07XG4gICAgcmV0dXJuICgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgdGhpc1tvZmZzZXQgKyAxXSA8PCA4O1xuICAgIHJldHVybiB2YWwgJiAweDgwMDAgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgdGhpc1tvZmZzZXRdIDw8IDg7XG4gICAgcmV0dXJuIHZhbCAmIDB4ODAwMCA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWw7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYgfCB0aGlzW29mZnNldCArIDNdIDw8IDI0O1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzW29mZnNldF0gPDwgMjQgfCB0aGlzW29mZnNldCArIDFdIDw8IDE2IHwgdGhpc1tvZmZzZXQgKyAyXSA8PCA4IHwgdGhpc1tvZmZzZXQgKyAzXTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGNoZWNrSW50KGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO1xuICAgIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7XG4gICAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKTtcbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMDtcblxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDE7XG4gICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMCk7XG4gICAgfVxuXG4gICAgdmFyIG11bCA9IDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRjtcblxuICAgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgLyBtdWwgJiAweEZGO1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMDtcblxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDE7XG4gICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMCk7XG4gICAgfVxuXG4gICAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMTtcbiAgICB2YXIgbXVsID0gMTtcbiAgICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGO1xuXG4gICAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgLyBtdWwgJiAweEZGO1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDgodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMCk7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmO1xuICAgIHJldHVybiBvZmZzZXQgKyAxO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKTtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiA4O1xuICAgIHJldHVybiBvZmZzZXQgKyAyO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKTtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gODtcbiAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgJiAweGZmO1xuICAgIHJldHVybiBvZmZzZXQgKyAyO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMCk7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlID4+PiAyNDtcbiAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDE2O1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gODtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgcmV0dXJuIG9mZnNldCArIDQ7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKTtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjQ7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiAxNjtcbiAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDg7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlICYgMHhmZjtcbiAgICByZXR1cm4gb2Zmc2V0ICsgNDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuXG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKTtcbiAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KTtcbiAgICB9XG5cbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIG11bCA9IDE7XG4gICAgdmFyIHN1YiA9IDA7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGO1xuXG4gICAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICAgIHN1YiA9IDE7XG4gICAgICB9XG5cbiAgICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwgPj4gMCkgLSBzdWIgJiAweEZGO1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG5cbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpO1xuICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpO1xuICAgIH1cblxuICAgIHZhciBpID0gYnl0ZUxlbmd0aCAtIDE7XG4gICAgdmFyIG11bCA9IDE7XG4gICAgdmFyIHN1YiA9IDA7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRjtcblxuICAgIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgICAgc3ViID0gMTtcbiAgICAgIH1cblxuICAgICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCA+PiAwKSAtIHN1YiAmIDB4RkY7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDgodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApO1xuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMTtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgcmV0dXJuIG9mZnNldCArIDE7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKTtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiA4O1xuICAgIHJldHVybiBvZmZzZXQgKyAyO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMCk7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgPj4+IDg7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlICYgMHhmZjtcbiAgICByZXR1cm4gb2Zmc2V0ICsgMjtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCk7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gODtcbiAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDE2O1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZSA+Pj4gMjQ7XG4gICAgcmV0dXJuIG9mZnNldCArIDQ7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApO1xuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMTtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjQ7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiAxNjtcbiAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDg7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlICYgMHhmZjtcbiAgICByZXR1cm4gb2Zmc2V0ICsgNDtcbiAgfTtcblxuICBmdW5jdGlvbiBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gICAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKTtcbiAgICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVGbG9hdChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG5cbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0KTtcbiAgICB9XG5cbiAgICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNCk7XG4gICAgcmV0dXJuIG9mZnNldCArIDQ7XG4gIH1cblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gd3JpdGVEb3VibGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuXG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCk7XG4gICAgfVxuXG4gICAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpO1xuICAgIHJldHVybiBvZmZzZXQgKyA4O1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydCk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpO1xuICB9OyAvLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5cblxuICBCdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5KHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXInKTtcbiAgICBpZiAoIXN0YXJ0KSBzdGFydCA9IDA7XG4gICAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aDtcbiAgICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoO1xuICAgIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMDtcbiAgICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnQ7IC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuXG4gICAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMDsgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuXG4gICAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJyk7XG4gICAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpOyAvLyBBcmUgd2Ugb29iP1xuXG4gICAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aDtcblxuICAgIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnQ7XG4gICAgfVxuXG4gICAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0O1xuXG4gICAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVXNlIGJ1aWx0LWluIHdoZW4gYXZhaWxhYmxlLCBtaXNzaW5nIGZyb20gSUUxMVxuICAgICAgdGhpcy5jb3B5V2l0aGluKHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodGFyZ2V0LCB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpLCB0YXJnZXRTdGFydCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlbjtcbiAgfTsgLy8gVXNhZ2U6XG4gIC8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuICAvLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbiAgLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5cblxuICBCdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZW5jb2RpbmcgPSBzdGFydDtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSB0aGlzLmxlbmd0aDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZW5jb2RpbmcgPSBlbmQ7XG4gICAgICAgIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApO1xuXG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ3V0ZjgnICYmIGNvZGUgPCAxMjggfHwgZW5jb2RpbmcgPT09ICdsYXRpbjEnKSB7XG4gICAgICAgICAgLy8gRmFzdCBwYXRoOiBJZiBgdmFsYCBmaXRzIGludG8gYSBzaW5nbGUgYnl0ZSwgdXNlIHRoYXQgbnVtZXJpYyB2YWx1ZS5cbiAgICAgICAgICB2YWwgPSBjb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgdmFsID0gdmFsICYgMjU1O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB2YWwgPSBOdW1iZXIodmFsKTtcbiAgICB9IC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuXG5cbiAgICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKTtcbiAgICB9XG5cbiAgICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzdGFydCA9IHN0YXJ0ID4+PiAwO1xuICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDA7XG4gICAgaWYgKCF2YWwpIHZhbCA9IDA7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgICAgdGhpc1tpXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbCkgPyB2YWwgOiBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKTtcbiAgICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGg7XG5cbiAgICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJyArIHZhbCArICdcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07IC8vIEhFTFBFUiBGVU5DVElPTlNcbiAgLy8gPT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teKy8wLTlBLVphLXotX10vZztcblxuICBmdW5jdGlvbiBiYXNlNjRjbGVhbihzdHIpIHtcbiAgICAvLyBOb2RlIHRha2VzIGVxdWFsIHNpZ25zIGFzIGVuZCBvZiB0aGUgQmFzZTY0IGVuY29kaW5nXG4gICAgc3RyID0gc3RyLnNwbGl0KCc9JylbMF07IC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuXG4gICAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJyk7IC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcblxuICAgIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnOyAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcblxuICAgIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgICAgc3RyID0gc3RyICsgJz0nO1xuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBmdW5jdGlvbiB1dGY4VG9CeXRlcyhzdHJpbmcsIHVuaXRzKSB7XG4gICAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eTtcbiAgICB2YXIgY29kZVBvaW50O1xuICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbDtcbiAgICB2YXIgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpOyAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG5cbiAgICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IC8vIHZhbGlkIGxlYWRcblxuXG4gICAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyAyIGxlYWRzIGluIGEgcm93XG5cblxuICAgICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcblxuXG4gICAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gICAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICB9XG5cbiAgICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsOyAvLyBlbmNvZGUgdXRmOFxuXG4gICAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWs7XG4gICAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrO1xuICAgICAgICBieXRlcy5wdXNoKGNvZGVQb2ludCA+PiAweDYgfCAweEMwLCBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MCk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrO1xuICAgICAgICBieXRlcy5wdXNoKGNvZGVQb2ludCA+PiAweEMgfCAweEUwLCBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwKTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrO1xuICAgICAgICBieXRlcy5wdXNoKGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCwgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLCBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ5dGVzO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNjaWlUb0J5dGVzKHN0cikge1xuICAgIHZhciBieXRlQXJyYXkgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ5dGVBcnJheTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzKHN0ciwgdW5pdHMpIHtcbiAgICB2YXIgYywgaGksIGxvO1xuICAgIHZhciBieXRlQXJyYXkgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWs7XG4gICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICBoaSA9IGMgPj4gODtcbiAgICAgIGxvID0gYyAlIDI1NjtcbiAgICAgIGJ5dGVBcnJheS5wdXNoKGxvKTtcbiAgICAgIGJ5dGVBcnJheS5wdXNoKGhpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnl0ZUFycmF5O1xuICB9XG5cbiAgZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyhzdHIpIHtcbiAgICByZXR1cm4gYmFzZTY0SnMudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSk7XG4gIH1cblxuICBmdW5jdGlvbiBibGl0QnVmZmVyKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGggfHwgaSA+PSBzcmMubGVuZ3RoKSBicmVhaztcbiAgICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaTtcbiAgfSAvLyBBcnJheUJ1ZmZlciBvciBVaW50OEFycmF5IG9iamVjdHMgZnJvbSBvdGhlciBjb250ZXh0cyAoaS5lLiBpZnJhbWVzKSBkbyBub3QgcGFzc1xuICAvLyB0aGUgYGluc3RhbmNlb2ZgIGNoZWNrIGJ1dCB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIGFzIG9mIHRoYXQgdHlwZS5cbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5cblxuICBmdW5jdGlvbiBpc0luc3RhbmNlKG9iaiwgdHlwZSkge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiB0eXBlIHx8IG9iaiAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3RvciAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG51bWJlcklzTmFOKG9iaikge1xuICAgIC8vIEZvciBJRTExIHN1cHBvcnRcbiAgICByZXR1cm4gb2JqICE9PSBvYmo7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIH0gLy8gQ3JlYXRlIGxvb2t1cCB0YWJsZSBmb3IgYHRvU3RyaW5nKCdoZXgnKWBcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMjE5XG5cblxuICB2YXIgaGV4U2xpY2VMb29rdXBUYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYWxwaGFiZXQgPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG4gICAgdmFyIHRhYmxlID0gbmV3IEFycmF5KDI1Nik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIHZhciBpMTYgPSBpICogMTY7XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgICB0YWJsZVtpMTYgKyBqXSA9IGFscGhhYmV0W2ldICsgYWxwaGFiZXRbal07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlO1xuICB9KCk7XG59KTtcbnZhciBidWZmZXJfMSA9IGJ1ZmZlci5CdWZmZXI7XG52YXIgYnVmZmVyXzIgPSBidWZmZXIuU2xvd0J1ZmZlcjtcbnZhciBidWZmZXJfMyA9IGJ1ZmZlci5JTlNQRUNUX01BWF9CWVRFUztcbnZhciBidWZmZXJfNCA9IGJ1ZmZlci5rTWF4TGVuZ3RoO1xuXG52YXIgZG9tYWluOyAvLyBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gc3RvcmUgZXZlbnQgaGFuZGxlcnMuIEluc3RhbnRpYXRpbmcgdGhpcyBpc1xuLy8gZmFzdGVyIHRoYW4gZXhwbGljaXRseSBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCB0byBnZXQgYSBcImNsZWFuXCIgZW1wdHlcbi8vIG9iamVjdCAodGVzdGVkIHdpdGggdjggdjQuOSkuXG5cbmZ1bmN0aW9uIEV2ZW50SGFuZGxlcnMoKSB7fVxuXG5FdmVudEhhbmRsZXJzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbi8vIHJlcXVpcmUoJ2V2ZW50cycpID09PSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXJcblxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcbkV2ZW50RW1pdHRlci51c2luZ0RvbWFpbnMgPSBmYWxzZTtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZG9tYWluID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkOyAvLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5cbkV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmRvbWFpbiA9IG51bGw7XG5cbiAgaWYgKEV2ZW50RW1pdHRlci51c2luZ0RvbWFpbnMpIHtcbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgZG9tYWluLCB0aGVuIGF0dGFjaCB0byBpdC5cbiAgICBpZiAoZG9tYWluLmFjdGl2ZSApIDtcbiAgfVxuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8IHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59OyAvLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuXG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBpc05hTihuKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJuXCIgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uICRnZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiAkZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTsgLy8gVGhlc2Ugc3RhbmRhbG9uZSBlbWl0KiBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gb3B0aW1pemUgY2FsbGluZyBvZiBldmVudFxuLy8gaGFuZGxlcnMgZm9yIGZhc3QgY2FzZXMgYmVjYXVzZSBlbWl0KCkgaXRzZWxmIG9mdGVuIGhhcyBhIHZhcmlhYmxlIG51bWJlciBvZlxuLy8gYXJndW1lbnRzIGFuZCBjYW4gYmUgZGVvcHRpbWl6ZWQgYmVjYXVzZSBvZiB0aGF0LiBUaGVzZSBmdW5jdGlvbnMgYWx3YXlzIGhhdmVcbi8vIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgYW5kIHRodXMgZG8gbm90IGdldCBkZW9wdGltaXplZCwgc28gdGhlIGNvZGVcbi8vIGluc2lkZSB0aGVtIGNhbiBleGVjdXRlIGZhc3Rlci5cblxuXG5mdW5jdGlvbiBlbWl0Tm9uZShoYW5kbGVyLCBpc0ZuLCBzZWxmKSB7XG4gIGlmIChpc0ZuKSBoYW5kbGVyLmNhbGwoc2VsZik7ZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdE9uZShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxKSB7XG4gIGlmIChpc0ZuKSBoYW5kbGVyLmNhbGwoc2VsZiwgYXJnMSk7ZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmLCBhcmcxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFR3byhoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxLCBhcmcyKSB7XG4gIGlmIChpc0ZuKSBoYW5kbGVyLmNhbGwoc2VsZiwgYXJnMSwgYXJnMik7ZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmLCBhcmcxLCBhcmcyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFRocmVlKGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKGlzRm4pIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxLCBhcmcyLCBhcmczKTtlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0TWFueShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmdzKSB7XG4gIGlmIChpc0ZuKSBoYW5kbGVyLmFwcGx5KHNlbGYsIGFyZ3MpO2Vsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGV2ZW50cywgZG9tYWluO1xuICB2YXIgZG9FcnJvciA9IHR5cGUgPT09ICdlcnJvcic7XG4gIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cykgZG9FcnJvciA9IGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09IG51bGw7ZWxzZSBpZiAoIWRvRXJyb3IpIHJldHVybiBmYWxzZTtcbiAgZG9tYWluID0gdGhpcy5kb21haW47IC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cblxuICBpZiAoZG9FcnJvcikge1xuICAgIGVyID0gYXJndW1lbnRzWzFdO1xuXG4gICAgaWYgKGRvbWFpbikge1xuICAgICAgaWYgKCFlcikgZXIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQnKTtcbiAgICAgIGVyLmRvbWFpbkVtaXR0ZXIgPSB0aGlzO1xuICAgICAgZXIuZG9tYWluID0gZG9tYWluO1xuICAgICAgZXIuZG9tYWluVGhyb3duID0gZmFsc2U7XG4gICAgICBkb21haW4uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgfSBlbHNlIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG4gIGlmICghaGFuZGxlcikgcmV0dXJuIGZhbHNlO1xuICB2YXIgaXNGbiA9IHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nO1xuICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gIHN3aXRjaCAobGVuKSB7XG4gICAgLy8gZmFzdCBjYXNlc1xuICAgIGNhc2UgMTpcbiAgICAgIGVtaXROb25lKGhhbmRsZXIsIGlzRm4sIHRoaXMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDI6XG4gICAgICBlbWl0T25lKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgMzpcbiAgICAgIGVtaXRUd28oaGFuZGxlciwgaXNGbiwgdGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDQ6XG4gICAgICBlbWl0VGhyZWUoaGFuZGxlciwgaXNGbiwgdGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0sIGFyZ3VtZW50c1szXSk7XG4gICAgICBicmVhaztcbiAgICAvLyBzbG93ZXJcblxuICAgIGRlZmF1bHQ6XG4gICAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuXG4gICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICB9XG5cbiAgICAgIGVtaXRNYW55KGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoIWV2ZW50cykge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpOyAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG5cbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cblxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKCFleGlzdGluZykge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgICAgaWYgKHByZXBlbmQpIHtcbiAgICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9IC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG5cblxuICAgIGlmICghZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBtID0gJGdldE1heExpc3RlbmVycyh0YXJnZXQpO1xuXG4gICAgICBpZiAobSAmJiBtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtKSB7XG4gICAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgKyBleGlzdGluZy5sZW5ndGggKyAnICcgKyB0eXBlICsgJyBsaXN0ZW5lcnMgYWRkZWQuICcgKyAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgICAgZW1pdFdhcm5pbmcodyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gZW1pdFdhcm5pbmcoZSkge1xuICB0eXBlb2YgY29uc29sZS53YXJuID09PSAnZnVuY3Rpb24nID8gY29uc29sZS53YXJuKGUpIDogY29uc29sZS5sb2coZSk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPSBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG59O1xuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRhcmdldC5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblxuICAgIGlmICghZmlyZWQpIHtcbiAgICAgIGZpcmVkID0gdHJ1ZTtcbiAgICAgIGxpc3RlbmVyLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHJldHVybiBnO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTsgLy8gZW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWRcblxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoIWV2ZW50cykgcmV0dXJuIHRoaXM7XG4gIGxpc3QgPSBldmVudHNbdHlwZV07XG4gIGlmICghbGlzdCkgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IGxpc3QubGlzdGVuZXIgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtlbHNlIHtcbiAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcG9zaXRpb24gPSAtMTtcblxuICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3RbMF0gPSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgdmFyIGxpc3RlbmVycywgZXZlbnRzO1xuICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmICghZXZlbnRzKSByZXR1cm4gdGhpczsgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuXG4gIGlmICghZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0pIHtcbiAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO2Vsc2UgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcblxuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGtleTsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIGRvIHtcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gICAgfSB3aGlsZSAobGlzdGVuZXJzWzBdKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICB2YXIgZXZsaXN0ZW5lcjtcbiAgdmFyIHJldDtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKCFldmVudHMpIHJldCA9IFtdO2Vsc2Uge1xuICAgIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gICAgaWYgKCFldmxpc3RlbmVyKSByZXQgPSBbXTtlbHNlIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0ID0gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl07ZWxzZSByZXQgPSB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5cbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0Lm93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTsgLy8gQWJvdXQgMS41eCBmYXN0ZXIgdGhhbiB0aGUgdHdvLWFyZyB2ZXJzaW9uIG9mIEFycmF5I3NwbGljZSgpLlxuXG5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKHZhciBpID0gaW5kZXgsIGsgPSBpICsgMSwgbiA9IGxpc3QubGVuZ3RoOyBrIDwgbjsgaSArPSAxLCBrICs9IDEpIHtcbiAgICBsaXN0W2ldID0gbGlzdFtrXTtcbiAgfVxuXG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBpKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KGkpO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG52YXIgZ2xvYmFsJDEgPSB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9O1xuXG4vLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbi8vIGJhc2VkIG9mZiBodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9ub2RlLXByb2Nlc3MvYmxvYi9tYXN0ZXIvYnJvd3Nlci5qc1xuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuXG5pZiAodHlwZW9mIGdsb2JhbCQxLnNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG59XG5cbmlmICh0eXBlb2YgZ2xvYmFsJDEuY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbn1cblxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICB9IC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG5cblxuICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgfSAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG5cblxuICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgfVxuICB9XG59XG5cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkcmFpbmluZyA9IGZhbHNlO1xuXG4gIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICBxdWV1ZUluZGV4ID0gLTE7XG4gIH1cblxuICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgZHJhaW5RdWV1ZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gIGlmIChkcmFpbmluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICBkcmFpbmluZyA9IHRydWU7XG4gIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cbiAgd2hpbGUgKGxlbikge1xuICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgIHF1ZXVlID0gW107XG5cbiAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICB9XG5cbiAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayhmdW4pIHtcbiAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gIH1cblxuICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuXG4gIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgfVxufSAvLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5cbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICB0aGlzLmZ1biA9IGZ1bjtcbiAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuXG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcblxudmFyIHRpdGxlID0gJ2Jyb3dzZXInO1xudmFyIHBsYXRmb3JtID0gJ2Jyb3dzZXInO1xudmFyIGJyb3dzZXIgPSB0cnVlO1xudmFyIGVudiA9IHt9O1xudmFyIGFyZ3YgPSBbXTtcbnZhciB2ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5cbnZhciB2ZXJzaW9ucyA9IHt9O1xudmFyIHJlbGVhc2UgPSB7fTtcbnZhciBjb25maWcgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBvbiA9IG5vb3A7XG52YXIgYWRkTGlzdGVuZXIgPSBub29wO1xudmFyIG9uY2UgPSBub29wO1xudmFyIG9mZiA9IG5vb3A7XG52YXIgcmVtb3ZlTGlzdGVuZXIgPSBub29wO1xudmFyIHJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG52YXIgZW1pdCA9IG5vb3A7XG5mdW5jdGlvbiBiaW5kaW5nKG5hbWUpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufVxuZnVuY3Rpb24gY3dkKCkge1xuICByZXR1cm4gJy8nO1xufVxuZnVuY3Rpb24gY2hkaXIoZGlyKSB7XG4gIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59XG5mdW5jdGlvbiB1bWFzaygpIHtcbiAgcmV0dXJuIDA7XG59IC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2t1bWF2aXMvYnJvd3Nlci1wcm9jZXNzLWhydGltZS9ibG9iL21hc3Rlci9pbmRleC5qc1xuXG52YXIgcGVyZm9ybWFuY2UgPSBnbG9iYWwkMS5wZXJmb3JtYW5jZSB8fCB7fTtcblxudmFyIHBlcmZvcm1hbmNlTm93ID0gcGVyZm9ybWFuY2Uubm93IHx8IHBlcmZvcm1hbmNlLm1vek5vdyB8fCBwZXJmb3JtYW5jZS5tc05vdyB8fCBwZXJmb3JtYW5jZS5vTm93IHx8IHBlcmZvcm1hbmNlLndlYmtpdE5vdyB8fCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbn07IC8vIGdlbmVyYXRlIHRpbWVzdGFtcCBvciBkZWx0YVxuLy8gc2VlIGh0dHA6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc19wcm9jZXNzX2hydGltZVxuXG5cbmZ1bmN0aW9uIGhydGltZShwcmV2aW91c1RpbWVzdGFtcCkge1xuICB2YXIgY2xvY2t0aW1lID0gcGVyZm9ybWFuY2VOb3cuY2FsbChwZXJmb3JtYW5jZSkgKiAxZS0zO1xuICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IoY2xvY2t0aW1lKTtcbiAgdmFyIG5hbm9zZWNvbmRzID0gTWF0aC5mbG9vcihjbG9ja3RpbWUgJSAxICogMWU5KTtcblxuICBpZiAocHJldmlvdXNUaW1lc3RhbXApIHtcbiAgICBzZWNvbmRzID0gc2Vjb25kcyAtIHByZXZpb3VzVGltZXN0YW1wWzBdO1xuICAgIG5hbm9zZWNvbmRzID0gbmFub3NlY29uZHMgLSBwcmV2aW91c1RpbWVzdGFtcFsxXTtcblxuICAgIGlmIChuYW5vc2Vjb25kcyA8IDApIHtcbiAgICAgIHNlY29uZHMtLTtcbiAgICAgIG5hbm9zZWNvbmRzICs9IDFlOTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3NlY29uZHMsIG5hbm9zZWNvbmRzXTtcbn1cbnZhciBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuZnVuY3Rpb24gdXB0aW1lKCkge1xuICB2YXIgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpO1xuICB2YXIgZGlmID0gY3VycmVudFRpbWUgLSBzdGFydFRpbWU7XG4gIHJldHVybiBkaWYgLyAxMDAwO1xufVxudmFyIHByb2Nlc3MgPSB7XG4gIG5leHRUaWNrOiBuZXh0VGljayxcbiAgdGl0bGU6IHRpdGxlLFxuICBicm93c2VyOiBicm93c2VyLFxuICBlbnY6IGVudixcbiAgYXJndjogYXJndixcbiAgdmVyc2lvbjogdmVyc2lvbixcbiAgdmVyc2lvbnM6IHZlcnNpb25zLFxuICBvbjogb24sXG4gIGFkZExpc3RlbmVyOiBhZGRMaXN0ZW5lcixcbiAgb25jZTogb25jZSxcbiAgb2ZmOiBvZmYsXG4gIHJlbW92ZUxpc3RlbmVyOiByZW1vdmVMaXN0ZW5lcixcbiAgcmVtb3ZlQWxsTGlzdGVuZXJzOiByZW1vdmVBbGxMaXN0ZW5lcnMsXG4gIGVtaXQ6IGVtaXQsXG4gIGJpbmRpbmc6IGJpbmRpbmcsXG4gIGN3ZDogY3dkLFxuICBjaGRpcjogY2hkaXIsXG4gIHVtYXNrOiB1bWFzayxcbiAgaHJ0aW1lOiBocnRpbWUsXG4gIHBsYXRmb3JtOiBwbGF0Zm9ybSxcbiAgcmVsZWFzZTogcmVsZWFzZSxcbiAgY29uZmlnOiBjb25maWcsXG4gIHVwdGltZTogdXB0aW1lXG59O1xuXG52YXIgaW5oZXJpdHM7XG5cbmlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICBpbmhlcml0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3I7XG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgaW5oZXJpdHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcblxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uIFRlbXBDdG9yKCkge307XG5cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlO1xuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKCk7XG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yO1xuICB9O1xufVxuXG52YXIgaW5oZXJpdHMkMSA9IGluaGVyaXRzO1xuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmZ1bmN0aW9uIGZvcm1hdChmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24gKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuXG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6XG4gICAgICAgIHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcblxuICAgICAgY2FzZSAnJWQnOlxuICAgICAgICByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG5cbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcblxuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0cjtcbn1cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuXG5mdW5jdGlvbiBkZXByZWNhdGUoZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsJDEucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn1cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5mdW5jdGlvbiBkZWJ1Z2xvZyhzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuXG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSAwO1xuXG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1zZyA9IGZvcm1hdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24gKCkge307XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufVxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07IC8vIGxlZ2FjeS4uLlxuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcblxuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9IC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcblxuXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59IC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnOiBbMSwgMjJdLFxuICAnaXRhbGljJzogWzMsIDIzXSxcbiAgJ3VuZGVybGluZSc6IFs0LCAyNF0sXG4gICdpbnZlcnNlJzogWzcsIDI3XSxcbiAgJ3doaXRlJzogWzM3LCAzOV0sXG4gICdncmV5JzogWzkwLCAzOV0sXG4gICdibGFjayc6IFszMCwgMzldLFxuICAnYmx1ZSc6IFszNCwgMzldLFxuICAnY3lhbic6IFszNiwgMzldLFxuICAnZ3JlZW4nOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnOiBbMzUsIDM5XSxcbiAgJ3JlZCc6IFszMSwgMzldLFxuICAneWVsbG93JzogWzMzLCAzOV1cbn07IC8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuIFwiXFx4MUJbXCIgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgKyBcIlxceDFCW1wiICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAodmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcbiAgcmV0dXJuIGhhc2g7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiYgdmFsdWUgJiYgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJiAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgdmFsdWUuaW5zcGVjdCAhPT0gaW5zcGVjdCAmJiAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcblxuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfSAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuXG5cbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcblxuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfSAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG5cblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfSAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG5cblxuICBpZiAoaXNFcnJvcih2YWx1ZSkgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfSAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG5cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cblxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG5cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJyxcbiAgICAgIGFycmF5ID0gZmFsc2UsXG4gICAgICBicmFjZXMgPSBbJ3snLCAnfSddOyAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG5cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH0gLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG5cblxuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9IC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG5cblxuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH0gLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG5cblxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfSAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG5cblxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuICB2YXIgb3V0cHV0O1xuXG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcblxuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKS5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoaXNOdW1iZXIodmFsdWUpKSByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSkgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7IC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cblxuICBpZiAoaXNOdWxsKHZhbHVlKSkgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG5cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwge1xuICAgIHZhbHVlOiB2YWx1ZVtrZXldXG4gIH07XG5cbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG5cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG5cbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKS5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyKSB7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSA7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArICcgJyArIG91dHB1dC5qb2luKCcsXFxuICAnKSArICcgJyArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59IC8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5cblxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fCB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgLy8gRVM2IHN5bWJvbFxuICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmZ1bmN0aW9uIGlzQnVmZmVyKG1heWJlQnVmKSB7XG4gIHJldHVybiBidWZmZXJfMS5pc0J1ZmZlcihtYXliZUJ1Zik7XG59XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107IC8vIDI2IEZlYiAxNjoxOTozNFxuXG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksIHBhZChkLmdldE1pbnV0ZXMoKSksIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn0gLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xufVxuZnVuY3Rpb24gX2V4dGVuZChvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuXG4gIHJldHVybiBvcmlnaW47XG59XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cbnZhciByZXF1aXJlJCQzID0ge1xuICBpbmhlcml0czogaW5oZXJpdHMkMSxcbiAgX2V4dGVuZDogX2V4dGVuZCxcbiAgbG9nOiBsb2csXG4gIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgaXNQcmltaXRpdmU6IGlzUHJpbWl0aXZlLFxuICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uLFxuICBpc0Vycm9yOiBpc0Vycm9yLFxuICBpc0RhdGU6IGlzRGF0ZSxcbiAgaXNPYmplY3Q6IGlzT2JqZWN0LFxuICBpc1JlZ0V4cDogaXNSZWdFeHAsXG4gIGlzVW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcbiAgaXNTeW1ib2w6IGlzU3ltYm9sLFxuICBpc1N0cmluZzogaXNTdHJpbmcsXG4gIGlzTnVtYmVyOiBpc051bWJlcixcbiAgaXNOdWxsT3JVbmRlZmluZWQ6IGlzTnVsbE9yVW5kZWZpbmVkLFxuICBpc051bGw6IGlzTnVsbCxcbiAgaXNCb29sZWFuOiBpc0Jvb2xlYW4sXG4gIGlzQXJyYXk6IGlzQXJyYXksXG4gIGluc3BlY3Q6IGluc3BlY3QsXG4gIGRlcHJlY2F0ZTogZGVwcmVjYXRlLFxuICBmb3JtYXQ6IGZvcm1hdCxcbiAgZGVidWdsb2c6IGRlYnVnbG9nXG59O1xuXG5mdW5jdGlvbiBCdWZmZXJMaXN0KCkge1xuICB0aGlzLmhlYWQgPSBudWxsO1xuICB0aGlzLnRhaWwgPSBudWxsO1xuICB0aGlzLmxlbmd0aCA9IDA7XG59XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAodikge1xuICB2YXIgZW50cnkgPSB7XG4gICAgZGF0YTogdixcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnk7ZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgdGhpcy50YWlsID0gZW50cnk7XG4gICsrdGhpcy5sZW5ndGg7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKHYpIHtcbiAgdmFyIGVudHJ5ID0ge1xuICAgIGRhdGE6IHYsXG4gICAgbmV4dDogdGhpcy5oZWFkXG4gIH07XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgdGhpcy50YWlsID0gZW50cnk7XG4gIHRoaXMuaGVhZCA9IGVudHJ5O1xuICArK3RoaXMubGVuZ3RoO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICB2YXIgcmV0ID0gdGhpcy5oZWFkLmRhdGE7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAtLXRoaXMubGVuZ3RoO1xuICByZXR1cm4gcmV0O1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gIHRoaXMubGVuZ3RoID0gMDtcbn07XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiAocykge1xuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gIHZhciByZXQgPSAnJyArIHAuZGF0YTtcblxuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHJldCArPSBzICsgcC5kYXRhO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIChuKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGJ1ZmZlcl8xLmFsbG9jKDApO1xuICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLmhlYWQuZGF0YTtcbiAgdmFyIHJldCA9IGJ1ZmZlcl8xLmFsbG9jVW5zYWZlKG4gPj4+IDApO1xuICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgdmFyIGkgPSAwO1xuXG4gIHdoaWxlIChwKSB7XG4gICAgcC5kYXRhLmNvcHkocmV0LCBpKTtcbiAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgcCA9IHAubmV4dDtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG52YXIgc3RyaW5nX2RlY29kZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gIC8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuICAvL1xuICAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuICAvLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4gIC8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuICAvLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4gIC8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbiAgLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4gIC8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICAvL1xuICAvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuICAvLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgLy9cbiAgLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuICAvLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4gIC8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbiAgLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4gIC8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuICAvLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4gIC8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gIHZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyO1xuXG4gIHZhciBpc0J1ZmZlckVuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmcgfHwgZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICBjYXNlICdyYXcnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBhc3NlcnRFbmNvZGluZyhlbmNvZGluZykge1xuICAgIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgICB9XG4gIH0gLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuICAvLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbiAgLy8gY2hhcmFjdGVycy4gQ0VTVS04IGlzIGhhbmRsZWQgYXMgcGFydCBvZiB0aGUgVVRGLTggZW5jb2RpbmcuXG4gIC8vXG4gIC8vIEBUT0RPIEhhbmRsaW5nIGFsbCBlbmNvZGluZ3MgaW5zaWRlIGEgc2luZ2xlIG9iamVjdCBtYWtlcyBpdCB2ZXJ5IGRpZmZpY3VsdFxuICAvLyB0byByZWFzb24gYWJvdXQgdGhpcyBjb2RlLCBzbyBpdCBzaG91bGQgYmUgc3BsaXQgdXAgaW4gdGhlIGZ1dHVyZS5cbiAgLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuICAvLyBwb2ludHMgYXMgdXNlZCBieSBDRVNVLTguXG5cblxuICB2YXIgU3RyaW5nRGVjb2RlciA9IGV4cG9ydHMuU3RyaW5nRGVjb2RlciA9IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICAgIHRoaXMuZW5jb2RpbmcgPSAoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCAnJyk7XG4gICAgYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpO1xuXG4gICAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMjtcbiAgICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7XG4gICAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgICByZXR1cm47XG4gICAgfSAvLyBFbm91Z2ggc3BhY2UgdG8gc3RvcmUgYWxsIGJ5dGVzIG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4gVVRGLTggbmVlZHMgNFxuICAgIC8vIGJ5dGVzLCBidXQgQ0VTVS04IG1heSByZXF1aXJlIHVwIHRvIDYgKDMgYnl0ZXMgcGVyIHN1cnJvZ2F0ZSkuXG5cblxuICAgIHRoaXMuY2hhckJ1ZmZlciA9IG5ldyBCdWZmZXIoNik7IC8vIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cblxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gMDsgLy8gTnVtYmVyIG9mIGJ5dGVzIGV4cGVjdGVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuXG4gICAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbiAgfTsgLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4gIC8vIGd1YXJhbnRlZWQgdG8gbm90IGNvbnRhaW4gYW55IHBhcnRpYWwgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLiBBbnkgcGFydGlhbFxuICAvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGlzIGJ1ZmZlcmVkIHVwLCBhbmQgd2lsbCBiZVxuICAvLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuICAvL1xuICAvLyBOb3RlOiBDb252ZXJ0aW5nIGEgQnVmZmVyIGNvbnRhaW5pbmcgYW4gb3JwaGFuIHN1cnJvZ2F0ZSB0byBhIFN0cmluZ1xuICAvLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuICAvLyBCdWZmZXIjd3JpdGUpIHdpbGwgcmVwbGFjZSBpbmNvbXBsZXRlIHN1cnJvZ2F0ZXMgd2l0aCB0aGUgdW5pY29kZVxuICAvLyByZXBsYWNlbWVudCBjaGFyYWN0ZXIuIFNlZSBodHRwczovL2NvZGVyZXZpZXcuY2hyb21pdW0ub3JnLzEyMTE3MzAwOS8gLlxuXG5cbiAgU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgdmFyIGNoYXJTdHIgPSAnJzsgLy8gaWYgb3VyIGxhc3Qgd3JpdGUgZW5kZWQgd2l0aCBhbiBpbmNvbXBsZXRlIG11bHRpYnl0ZSBjaGFyYWN0ZXJcblxuICAgIHdoaWxlICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAgIC8vIGRldGVybWluZSBob3cgbWFueSByZW1haW5pbmcgYnl0ZXMgdGhpcyBidWZmZXIgaGFzIHRvIG9mZmVyIGZvciB0aGlzIGNoYXJcbiAgICAgIHZhciBhdmFpbGFibGUgPSBidWZmZXIubGVuZ3RoID49IHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkID8gdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQgOiBidWZmZXIubGVuZ3RoOyAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcblxuICAgICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCB0aGlzLmNoYXJSZWNlaXZlZCwgMCwgYXZhaWxhYmxlKTtcbiAgICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgICAgaWYgKHRoaXMuY2hhclJlY2VpdmVkIDwgdGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgICAgIC8vIHN0aWxsIG5vdCBlbm91Z2ggY2hhcnMgaW4gdGhpcyBidWZmZXI/IHdhaXQgZm9yIG1vcmUgLi4uXG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH0gLy8gcmVtb3ZlIGJ5dGVzIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCBjaGFyYWN0ZXIgZnJvbSB0aGUgYnVmZmVyXG5cblxuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKGF2YWlsYWJsZSwgYnVmZmVyLmxlbmd0aCk7IC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG5cbiAgICAgIGNoYXJTdHIgPSB0aGlzLmNoYXJCdWZmZXIuc2xpY2UoMCwgdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKTsgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuXG4gICAgICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoY2hhclN0ci5sZW5ndGggLSAxKTtcblxuICAgICAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoICs9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGFyUmVjZWl2ZWQgPSB0aGlzLmNoYXJMZW5ndGggPSAwOyAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBieXRlcyBpbiB0aGlzIGJ1ZmZlciwganVzdCBlbWl0IG91ciBjaGFyXG5cbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjaGFyU3RyO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9IC8vIGRldGVybWluZSBhbmQgc2V0IGNoYXJMZW5ndGggLyBjaGFyUmVjZWl2ZWRcblxuXG4gICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpO1xuICAgIHZhciBlbmQgPSBidWZmZXIubGVuZ3RoO1xuXG4gICAgaWYgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gYnVmZmVyIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlciBieXRlcyB3ZSBnb3RcbiAgICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgICAgZW5kIC09IHRoaXMuY2hhclJlY2VpdmVkO1xuICAgIH1cblxuICAgIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG4gICAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoZW5kKTsgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuXG4gICAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICAgIHZhciBzaXplID0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoICs9IHNpemU7XG4gICAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgICAgdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCBzaXplLCAwLCBzaXplKTtcbiAgICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgMCwgc2l6ZSk7XG4gICAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgICB9IC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuXG5cbiAgICByZXR1cm4gY2hhclN0cjtcbiAgfTsgLy8gZGV0ZWN0SW5jb21wbGV0ZUNoYXIgZGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhbiBpbmNvbXBsZXRlIFVURi04IGNoYXJhY3RlciBhdFxuICAvLyB0aGUgZW5kIG9mIHRoZSBnaXZlbiBidWZmZXIuIElmIHNvLCBpdCBzZXRzIHRoaXMuY2hhckxlbmd0aCB0byB0aGUgYnl0ZVxuICAvLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbiAgLy8gdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGNoYXJhY3Rlci5cblxuXG4gIFN0cmluZ0RlY29kZXIucHJvdG90eXBlLmRldGVjdEluY29tcGxldGVDaGFyID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgIC8vIGRldGVybWluZSBob3cgbWFueSBieXRlcyB3ZSBoYXZlIHRvIGNoZWNrIGF0IHRoZSBlbmQgb2YgdGhpcyBidWZmZXJcbiAgICB2YXIgaSA9IGJ1ZmZlci5sZW5ndGggPj0gMyA/IDMgOiBidWZmZXIubGVuZ3RoOyAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gICAgLy8gaW5jb21wbGV0ZSBjaGFyLlxuXG4gICAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICAgIHZhciBjID0gYnVmZmVyW2J1ZmZlci5sZW5ndGggLSBpXTsgLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTgjRGVzY3JpcHRpb25cbiAgICAgIC8vIDExMFhYWFhYXG5cbiAgICAgIGlmIChpID09IDEgJiYgYyA+PiA1ID09IDB4MDYpIHtcbiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIDExMTBYWFhYXG5cblxuICAgICAgaWYgKGkgPD0gMiAmJiBjID4+IDQgPT0gMHgwRSkge1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gMTExMTBYWFhcblxuXG4gICAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbiAgfTtcblxuICBTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aCkgcmVzID0gdGhpcy53cml0ZShidWZmZXIpO1xuXG4gICAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgICB2YXIgY3IgPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgICAgIHZhciBidWYgPSB0aGlzLmNoYXJCdWZmZXI7XG4gICAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICAgIHJlcyArPSBidWYuc2xpY2UoMCwgY3IpLnRvU3RyaW5nKGVuYyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBmdW5jdGlvbiBwYXNzVGhyb3VnaFdyaXRlKGJ1ZmZlcikge1xuICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG4gIH1cblxuICBmdW5jdGlvbiB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gICAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAyIDogMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDM7XG4gICAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAzIDogMDtcbiAgfVxufSk7XG52YXIgc3RyaW5nX2RlY29kZXJfMSA9IHN0cmluZ19kZWNvZGVyLlN0cmluZ0RlY29kZXI7XG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xudmFyIGRlYnVnID0gZGVidWdsb2coJ3N0cmVhbScpO1xuaW5oZXJpdHMkMShSZWFkYWJsZSwgRXZlbnRFbWl0dGVyKTtcblxuZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbikge1xuICAvLyBTYWRseSB0aGlzIGlzIG5vdCBjYWNoZWFibGUgYXMgc29tZSBsaWJyYXJpZXMgYnVuZGxlIHRoZWlyIG93blxuICAvLyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlbS5cbiAgaWYgKHR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lcihldmVudCwgZm4pO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnlcbiAgICAvLyB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy4gVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSB0aGlzIGNvZGUgbmVlZHNcbiAgICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gICAgLy8gdGhlIHByZXBlbmRMaXN0ZW5lcigpIG1ldGhvZC4gVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhpcyBoYWNrLlxuICAgIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSBlbWl0dGVyLm9uKGV2ZW50LCBmbik7ZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQkMShlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OyAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTsgLy8gdGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtOyAvLyBjYXN0IHRvIGludHMuXG5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfn50aGlzLmhpZ2hXYXRlck1hcms7IC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcblxuICB0aGlzLmJ1ZmZlciA9IG5ldyBCdWZmZXJMaXN0KCk7XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlOyAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cblxuICB0aGlzLnN5bmMgPSB0cnVlOyAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cblxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7IC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7IC8vIHdoZW4gcGlwaW5nLCB3ZSBvbmx5IGNhcmUgYWJvdXQgJ3JlYWRhYmxlJyBldmVudHMgdGhhdCBoYXBwZW5cbiAgLy8gYWZ0ZXIgcmVhZCgpaW5nIGFsbCB0aGUgYnl0ZXMgYW5kIG5vdCBnZXR0aW5nIGFueSBwdXNoYmFjay5cblxuICB0aGlzLnJhbk91dCA9IGZhbHNlOyAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7IC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcblxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuXG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IHN0cmluZ19kZWNvZGVyXzEob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpOyAvLyBsZWdhY3lcblxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcbiAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG59IC8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gYnVmZmVyXzEuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59OyAvLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuXG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgJycsIHRydWUpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID09PSBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250KSB7XG4gIHZhciBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuXG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIF9lID0gbmV3IEVycm9yKCdzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCcpO1xuXG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBfZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBza2lwQWRkO1xuXG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgc2tpcEFkZCA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIGNodW5rLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRUb0Zyb250KSBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7IC8vIERvbid0IGFkZCB0byB0aGUgYnVmZmVyIGlmIHdlJ3ZlIGRlY29kZWQgdG8gYW4gZW1wdHkgc3RyaW5nIGNodW5rIGFuZFxuICAgICAgLy8gd2UncmUgbm90IGluIG9iamVjdCBtb2RlXG5cbiAgICAgIGlmICghc2tpcEFkZCkge1xuICAgICAgICAvLyBpZiB3ZSB3YW50IHRoZSBkYXRhIG5vdywganVzdCBlbWl0IGl0LlxuICAgICAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59IC8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cblxuXG5mdW5jdGlvbiBuZWVkTW9yZURhdGEoc3RhdGUpIHtcbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubmVlZFJlYWRhYmxlIHx8IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUubGVuZ3RoID09PSAwKTtcbn0gLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5cblxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgc3RyaW5nX2RlY29kZXJfMShlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07IC8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcblxuXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuXG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG5cbiAgcmV0dXJuIG47XG59IC8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG5cbiAgaWYgKG4gIT09IG4pIHtcbiAgICAvLyBPbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGgpIHJldHVybiBzdGF0ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH0gLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgaHdtLCB0aGVuIHJhaXNlIHRoZSBod20uXG5cblxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjsgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcblxuICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZS5sZW5ndGg7XG59IC8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5cblxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICBuID0gcGFyc2VJbnQobiwgMTApO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuICBpZiAobiAhPT0gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7IC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cblxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTsgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuXG5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpOyAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcblxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9IC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cblxuXG4gIGlmIChzdGF0ZS5lbmRlZCB8fCBzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZG9SZWFkID0gZmFsc2U7XG4gICAgZGVidWcoJ3JlYWRpbmcgb3IgZW5kZWQnLCBkb1JlYWQpO1xuICB9IGVsc2UgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJyk7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7IC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlOyAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG5cbiAgICB0aGlzLl9yZWFkKHN0YXRlLmhpZ2hXYXRlck1hcmspO1xuXG4gICAgc3RhdGUuc3luYyA9IGZhbHNlOyAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2UgY2FuIHJldHVybiB0byB0aGUgdXNlci5cblxuICAgIGlmICghc3RhdGUucmVhZGluZykgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcbiAgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gbjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTsgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuXG4gICAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgfVxuXG4gIGlmIChyZXQgIT09IG51bGwpIHRoaXMuZW1pdCgnZGF0YScsIHJldCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlciA9IG51bGw7XG5cbiAgaWYgKCFidWZmZXJfMS5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cblxuICByZXR1cm4gZXI7XG59XG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcblxuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG5cbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUuZW5kZWQgPSB0cnVlOyAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cblxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn0gLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cblxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYykgbmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufSAvLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cblxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBuZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuXG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aCkgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO2Vsc2UgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB9XG5cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn0gLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5cblxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG4gIHZhciBkb0VuZCA9ICFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlO1xuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogY2xlYW51cDtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIG5leHRUaWNrKGVuZEZuKTtlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcblxuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSkge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuXG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9IC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuXG5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpOyAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcbiAgICBjbGVhbmVkVXAgPSB0cnVlOyAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gJiYgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSkgb25kcmFpbigpO1xuICB9IC8vIElmIHRoZSB1c2VyIHB1c2hlcyBtb3JlIGRhdGEgd2hpbGUgd2UncmUgd3JpdGluZyB0byBkZXN0IHRoZW4gd2UnbGwgZW5kIHVwXG4gIC8vIGluIG9uZGF0YSBhZ2Fpbi4gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIGluY3JlYXNlIGF3YWl0RHJhaW4gb25jZSBiZWNhdXNlXG4gIC8vIGRlc3Qgd2lsbCBvbmx5IGVtaXQgb25lICdkcmFpbicgZXZlbnQgZm9yIHRoZSBtdWx0aXBsZSB3cml0ZXMuXG4gIC8vID0+IEludHJvZHVjZSBhIGd1YXJkIG9uIGluY3JlYXNpbmcgYXdhaXREcmFpbi5cblxuXG4gIHZhciBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG5cbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgZGVidWcoJ29uZGF0YScpO1xuICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG5cbiAgICBpZiAoZmFsc2UgPT09IHJldCAmJiAhaW5jcmVhc2VkQXdhaXREcmFpbikge1xuICAgICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgICAvLyB0byBnZXQgc3R1Y2sgaW4gYSBwZXJtYW5lbnRseSBwYXVzZWQgc3RhdGUgaWYgdGhhdCB3cml0ZVxuICAgICAgLy8gYWxzbyByZXR1cm5lZCBmYWxzZS5cbiAgICAgIC8vID0+IENoZWNrIHdoZXRoZXIgYGRlc3RgIGlzIHN0aWxsIGEgcGlwaW5nIGRlc3RpbmF0aW9uLlxuICAgICAgaWYgKChzdGF0ZS5waXBlc0NvdW50ID09PSAxICYmIHN0YXRlLnBpcGVzID09PSBkZXN0IHx8IHN0YXRlLnBpcGVzQ291bnQgPiAxICYmIGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpICE9PSAtMSkgJiYgIWNsZWFuZWRVcCkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pO1xuICAgICAgICBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrO1xuICAgICAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9IC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG5cblxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAobGlzdGVuZXJDb3VudCQxKGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cblxuXG4gIHByZXBlbmRMaXN0ZW5lcihkZXN0LCAnZXJyb3InLCBvbmVycm9yKTsgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cblxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuXG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcblxuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG5cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9IC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG5cblxuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpOyAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcblxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIHNyYy5saXN0ZW5lcnMoJ2RhdGEnKS5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7IC8vIGlmIHdlJ3JlIG5vdCBwaXBpbmcgYW55d2hlcmUsIHRoZW4gZG8gbm90aGluZy5cblxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7IC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cblxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlczsgLy8gZ290IGEgbWF0Y2guXG5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9IC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuOyBfaSsrKSB7XG4gICAgICBkZXN0c1tfaV0uZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cblxuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSkgcmV0dXJuIHRoaXM7XG4gIHN0YXRlLnBpcGVzLnNwbGljZShpLCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgcmV0dXJuIHRoaXM7XG59OyAvLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuXG5cblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgLy8gU3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgICAgIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgICBuZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59IC8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblxuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiByZXN1bWUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlc3VtZVNjaGVkdWxlZCkge1xuICAgIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IHRydWU7XG4gICAgbmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG5cbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2Zsb3cnLCBzdGF0ZS5mbG93aW5nKTtcblxuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7fVxufSAvLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5cblxuUmVhZGFibGUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcblxuICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHNlbGYucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgc2VsZi5wdXNoKG51bGwpO1xuICB9KTtcbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspOyAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcblxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcbiAgICB2YXIgcmV0ID0gc2VsZi5wdXNoKGNodW5rKTtcblxuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTsgLy8gcHJveHkgYWxsIHRoZSBvdGhlciBtZXRob2RzLlxuICAvLyBpbXBvcnRhbnQgd2hlbiB3cmFwcGluZyBmaWx0ZXJzIGFuZCBkdXBsZXhlcy5cblxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH0gLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuXG5cbiAgdmFyIGV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcbiAgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uIChldikge1xuICAgIHN0cmVhbS5vbihldiwgc2VsZi5lbWl0LmJpbmQoc2VsZiwgZXYpKTtcbiAgfSk7IC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG5cbiAgc2VsZi5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcblxuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn07IC8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblxuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDsgLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICB2YXIgcmV0O1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0ID0gc3RhdGUuYnVmZmVyLnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBzdGF0ZS5sZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGxpc3RcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgcmV0ID0gc3RhdGUuYnVmZmVyLmpvaW4oJycpO2Vsc2UgaWYgKHN0YXRlLmJ1ZmZlci5sZW5ndGggPT09IDEpIHJldCA9IHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGE7ZWxzZSByZXQgPSBzdGF0ZS5idWZmZXIuY29uY2F0KHN0YXRlLmxlbmd0aCk7XG4gICAgc3RhdGUuYnVmZmVyLmNsZWFyKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBwYXJ0IG9mIGxpc3RcbiAgICByZXQgPSBmcm9tTGlzdFBhcnRpYWwobiwgc3RhdGUuYnVmZmVyLCBzdGF0ZS5kZWNvZGVyKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufSAvLyBFeHRyYWN0cyBvbmx5IGVub3VnaCBidWZmZXJlZCBkYXRhIHRvIHNhdGlzZnkgdGhlIGFtb3VudCByZXF1ZXN0ZWQuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cblxuXG5mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobiwgbGlzdCwgaGFzU3RyaW5ncykge1xuICB2YXIgcmV0O1xuXG4gIGlmIChuIDwgbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gc2xpY2UgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3NcbiAgICByZXQgPSBsaXN0LmhlYWQuZGF0YS5zbGljZSgwLCBuKTtcbiAgICBsaXN0LmhlYWQuZGF0YSA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKG4pO1xuICB9IGVsc2UgaWYgKG4gPT09IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIGZpcnN0IGNodW5rIGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXN1bHQgc3BhbnMgbW9yZSB0aGFuIG9uZSBidWZmZXJcbiAgICByZXQgPSBoYXNTdHJpbmdzID8gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkgOiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59IC8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGFcbi8vIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIHtcbiAgdmFyIHAgPSBsaXN0LmhlYWQ7XG4gIHZhciBjID0gMTtcbiAgdmFyIHJldCA9IHAuZGF0YTtcbiAgbiAtPSByZXQubGVuZ3RoO1xuXG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIHN0ciA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gc3RyLmxlbmd0aCA/IHN0ci5sZW5ndGggOiBuO1xuICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkgcmV0ICs9IHN0cjtlbHNlIHJldCArPSBzdHIuc2xpY2UoMCwgbik7XG4gICAgbiAtPSBuYjtcblxuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gc3RyLnNsaWNlKG5iKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgKytjO1xuICB9XG5cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn0gLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGEgY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5cblxuZnVuY3Rpb24gY29weUZyb21CdWZmZXIobiwgbGlzdCkge1xuICB2YXIgcmV0ID0gYnVmZmVyXzEuYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcblxuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHZhciBidWYgPSBwLmRhdGE7XG4gICAgdmFyIG5iID0gbiA+IGJ1Zi5sZW5ndGggPyBidWYubGVuZ3RoIDogbjtcbiAgICBidWYuY29weShyZXQsIHJldC5sZW5ndGggLSBuLCAwLCBuYik7XG4gICAgbiAtPSBuYjtcblxuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gYnVmLnNsaWNlKG5iKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgKytjO1xuICB9XG5cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTsgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignXCJlbmRSZWFkYWJsZSgpXCIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgbmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2goeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcbmluaGVyaXRzJDEoV3JpdGFibGUsIEV2ZW50RW1pdHRlcik7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdidWZmZXInLCB7XG4gICAgZ2V0OiBkZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nKVxuICB9KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307IC8vIG9iamVjdCBzdHJlYW0gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHN0cmVhbVxuICAvLyBjb250YWlucyBidWZmZXJzIG9yIG9iamVjdHMuXG5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG4gIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlOyAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcblxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod20gfHwgaHdtID09PSAwID8gaHdtIDogZGVmYXVsdEh3bTsgLy8gY2FzdCB0byBpbnRzLlxuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH5+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuICB0aGlzLm5lZWREcmFpbiA9IGZhbHNlOyAvLyBhdCB0aGUgc3RhcnQgb2YgY2FsbGluZyBlbmQoKVxuXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7IC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcblxuICB0aGlzLmVuZGVkID0gZmFsc2U7IC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuXG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZTsgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuXG4gIHZhciBub0RlY29kZSA9IG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlU3RyaW5ncyA9ICFub0RlY29kZTsgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cblxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JzsgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cblxuICB0aGlzLmxlbmd0aCA9IDA7IC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG5cbiAgdGhpcy53cml0aW5nID0gZmFsc2U7IC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcblxuICB0aGlzLmNvcmtlZCA9IDA7IC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuXG4gIHRoaXMuc3luYyA9IHRydWU7IC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG5cbiAgdGhpcy5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7IC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcblxuICB0aGlzLm9ud3JpdGUgPSBmdW5jdGlvbiAoZXIpIHtcbiAgICBvbndyaXRlKHN0cmVhbSwgZXIpO1xuICB9OyAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcblxuXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7IC8vIHRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cblxuICB0aGlzLndyaXRlbGVuID0gMDtcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsOyAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcblxuICB0aGlzLnBlbmRpbmdjYiA9IDA7IC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcblxuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2U7IC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTsgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDsgLy8gYWxsb2NhdGUgdGhlIGZpcnN0IENvcmtlZFJlcXVlc3QsIHRoZXJlIGlzIGFsd2F5c1xuICAvLyBvbmUgYWxsb2NhdGVkIGFuZCBmcmVlIHRvIHVzZSwgYW5kIHdlIG1haW50YWluIGF0IG1vc3QgdHdvXG5cbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbn1cblxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gd3JpdGFibGVTdGF0ZUdldEJ1ZmZlcigpIHtcbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgdmFyIG91dCA9IFtdO1xuXG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59O1xuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRob3VnaCB0aGV5J3JlIG5vdFxuICAvLyBpbnN0YW5jZW9mIFdyaXRhYmxlLCB0aGV5J3JlIGluc3RhbmNlb2YgUmVhZGFibGUuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkgJiYgISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpOyAvLyBsZWdhY3kuXG5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcbiAgfVxuXG4gIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xufSAvLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlJykpO1xufTtcblxuZnVuY3Rpb24gd3JpdGVBZnRlckVuZChzdHJlYW0sIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFcnJvcignd3JpdGUgYWZ0ZXIgZW5kJyk7IC8vIFRPRE86IGRlZmVyIGVycm9yIGV2ZW50cyBjb25zaXN0ZW50bHkgZXZlcnl3aGVyZSwgbm90IGp1c3QgdGhlIGNiXG5cbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBuZXh0VGljayhjYiwgZXIpO1xufSAvLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cblxuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICB2YXIgZXIgPSBmYWxzZTsgLy8gQWx3YXlzIHRocm93IGVycm9yIGlmIGEgbnVsbCBpcyB3cml0dGVuXG4gIC8vIGlmIHdlIGFyZSBub3QgaW4gb2JqZWN0IG1vZGUgdGhlbiB0aHJvd1xuICAvLyBpZiBpdCBpcyBub3QgYSBidWZmZXIsIHN0cmluZywgb3IgdW5kZWZpbmVkLlxuXG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nKTtcbiAgfSBlbHNlIGlmICghYnVmZmVyXzEuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG5cbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIG5leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChidWZmZXJfMS5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7ZWxzZSBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG4gIHJldHVybiByZXQ7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gYnVmZmVyXzEuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG5cbiAgcmV0dXJuIGNodW5rO1xufSAvLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuXG5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICBpZiAoYnVmZmVyXzEuaXNCdWZmZXIoY2h1bmspKSBlbmNvZGluZyA9ICdidWZmZXInO1xuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrOyAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cblxuICBpZiAoIXJldCkgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG5ldyBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKTtcblxuICAgIGlmIChsYXN0KSB7XG4gICAgICBsYXN0Lm5leHQgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH1cblxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIG5leHRUaWNrKGNiLCBlcik7ZWxzZSBjYihlcik7XG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuICBpZiAoZXIpIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpO2Vsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG5cbiAgICBpZiAoIWZpbmlzaGVkICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgLyo8cmVwbGFjZW1lbnQ+Ki9cbiAgICAgIG5leHRUaWNrKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKSBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn0gLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5cblxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufSAvLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuXG5cbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG4gIHZhciBlbnRyeSA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtcblxuICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgZW50cnkgJiYgZW50cnkubmV4dCkge1xuICAgIC8vIEZhc3QgY2FzZSwgd3JpdGUgZXZlcnl0aGluZyB1c2luZyBfd3JpdGV2KClcbiAgICB2YXIgbCA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50O1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGhvbGRlciA9IHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtcbiAgICBob2xkZXIuZW50cnkgPSBlbnRyeTtcbiAgICB2YXIgY291bnQgPSAwO1xuXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cblxuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgdHJ1ZSwgc3RhdGUubGVuZ3RoLCBidWZmZXIsICcnLCBob2xkZXIuZmluaXNoKTsgLy8gZG9Xcml0ZSBpcyBhbG1vc3QgYWx3YXlzIGFzeW5jLCBkZWZlciB0aGVzZSB0byBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAvLyBhcyB0aGUgaG90IHBhdGggZW5kcyB3aXRoIGRvV3JpdGVcblxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuXG4gICAgaWYgKGhvbGRlci5uZXh0KSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBob2xkZXIubmV4dDtcbiAgICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3Qoc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OyAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpOyAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH0gLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuXG5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xufTtcblxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuXG5mdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnByZWZpbmlzaGVkKSB7XG4gICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG5cbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG5cbiAgaWYgKGNiKSB7XG4gICAgaWYgKHN0YXRlLmZpbmlzaGVkKSBuZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG5cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn0gLy8gSXQgc2VlbXMgYSBsaW5rZWQgbGlzdCBidXQgaXQgaXMgbm90XG4vLyB0aGVyZSB3aWxsIGJlIG9ubHkgMiBvZiB0aGVzZSBmb3IgZWFjaCBzdHJlYW1cblxuXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG5cbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cnk7XG4gICAgX3RoaXMuZW50cnkgPSBudWxsO1xuXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgICAgY2IoZXJyKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlKSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IF90aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBfdGhpcztcbiAgICB9XG4gIH07XG59XG5cbmluaGVyaXRzJDEoRHVwbGV4LCBSZWFkYWJsZSk7XG52YXIga2V5cyA9IE9iamVjdC5rZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xufVxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFsbG93SGFsZk9wZW4gPT09IGZhbHNlKSB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59IC8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcblxuZnVuY3Rpb24gb25lbmQoKSB7XG4gIC8vIGlmIHdlIGFsbG93IGhhbGYtb3BlbiBzdGF0ZSwgb3IgaWYgdGhlIHdyaXRhYmxlIHNpZGUgZW5kZWQsXG4gIC8vIHRoZW4gd2UncmUgb2suXG4gIGlmICh0aGlzLmFsbG93SGFsZk9wZW4gfHwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCkgcmV0dXJuOyAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuXG4gIG5leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuaW5oZXJpdHMkMShUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0aGlzLndyaXRlZW5jb2RpbmcgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB2YXIgY2IgPSB0cy53cml0ZWNiO1xuICBpZiAoIWNiKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcycpKTtcbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHN0cmVhbS5wdXNoKGRhdGEpO1xuICBjYihlcik7XG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuXG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHN0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuICBEdXBsZXguY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSBuZXcgVHJhbnNmb3JtU3RhdGUodGhpcyk7IC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cblxuICB2YXIgc3RyZWFtID0gdGhpczsgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlOyAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlcikge1xuICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICB9KTtlbHNlIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07IC8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLndyaXRlY2IgPSBjYjtcbiAgdHMud3JpdGVjaHVuayA9IGNodW5rO1xuICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7XG5cbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59OyAvLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmIHRzLndyaXRlY2IgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG5cbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTsgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcblxuICB2YXIgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIGlmICh3cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwJyk7XG4gIGlmICh0cy50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59XG5cbmluaGVyaXRzJDEoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKTtcbn07XG5cbmluaGVyaXRzJDEoU3RyZWFtLCBFdmVudEVtaXR0ZXIpO1xuU3RyZWFtLlJlYWRhYmxlID0gUmVhZGFibGU7XG5TdHJlYW0uV3JpdGFibGUgPSBXcml0YWJsZTtcblN0cmVhbS5EdXBsZXggPSBEdXBsZXg7XG5TdHJlYW0uVHJhbnNmb3JtID0gVHJhbnNmb3JtO1xuU3RyZWFtLlBhc3NUaHJvdWdoID0gUGFzc1Rocm91Z2g7IC8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5cblN0cmVhbS5TdHJlYW0gPSBTdHJlYW07XG4vLyBwYXJ0IG9mIHRoaXMgY2xhc3MpIGlzIG92ZXJyaWRkZW4gaW4gdGhlIFJlYWRhYmxlIGNsYXNzLlxuXG5mdW5jdGlvbiBTdHJlYW0oKSB7XG4gIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xufVxuXG5TdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgb3B0aW9ucykge1xuICB2YXIgc291cmNlID0gdGhpcztcblxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBpZiAoZGVzdC53cml0YWJsZSkge1xuICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHtcbiAgICAgICAgc291cmNlLnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKTtcblxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7IC8vIElmIHRoZSAnZW5kJyBvcHRpb24gaXMgbm90IHN1cHBsaWVkLCBkZXN0LmVuZCgpIHdpbGwgYmUgY2FsbGVkIHdoZW5cbiAgLy8gc291cmNlIGdldHMgdGhlICdlbmQnIG9yICdjbG9zZScgZXZlbnRzLiAgT25seSBkZXN0LmVuZCgpIG9uY2UuXG5cbiAgaWYgKCFkZXN0Ll9pc1N0ZGlvICYmICghb3B0aW9ucyB8fCBvcHRpb25zLmVuZCAhPT0gZmFsc2UpKSB7XG4gICAgc291cmNlLm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9XG5cbiAgdmFyIGRpZE9uRW5kID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KCk7XG4gIH0gLy8gZG9uJ3QgbGVhdmUgZGFuZ2xpbmcgcGlwZXMgd2hlbiB0aGVyZSBhcmUgZXJyb3JzLlxuXG5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGNsZWFudXAoKTtcblxuICAgIGlmIChFdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCh0aGlzLCAnZXJyb3InKSA9PT0gMCkge1xuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCBzdHJlYW0gZXJyb3IgaW4gcGlwZS5cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIGRlc3Qub24oJ2Vycm9yJywgb25lcnJvcik7IC8vIHJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG4gIH1cblxuICBzb3VyY2Uub24oJ2VuZCcsIGNsZWFudXApO1xuICBzb3VyY2Uub24oJ2Nsb3NlJywgY2xlYW51cCk7XG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cCk7XG4gIGRlc3QuZW1pdCgncGlwZScsIHNvdXJjZSk7IC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlcjtcbnZhciBzYWZlciA9IHt9O1xudmFyIGtleTtcblxuZm9yIChrZXkgaW4gYnVmZmVyKSB7XG4gIGlmICghYnVmZmVyLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlO1xuICBpZiAoa2V5ID09PSAnU2xvd0J1ZmZlcicgfHwga2V5ID09PSAnQnVmZmVyJykgY29udGludWU7XG4gIHNhZmVyW2tleV0gPSBidWZmZXJba2V5XTtcbn1cblxudmFyIFNhZmVyID0gc2FmZXIuQnVmZmVyID0ge307XG5cbmZvciAoa2V5IGluIEJ1ZmZlcikge1xuICBpZiAoIUJ1ZmZlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZTtcbiAgaWYgKGtleSA9PT0gJ2FsbG9jVW5zYWZlJyB8fCBrZXkgPT09ICdhbGxvY1Vuc2FmZVNsb3cnKSBjb250aW51ZTtcbiAgU2FmZXJba2V5XSA9IEJ1ZmZlcltrZXldO1xufVxuXG5zYWZlci5CdWZmZXIucHJvdG90eXBlID0gQnVmZmVyLnByb3RvdHlwZTtcblxuaWYgKCFTYWZlci5mcm9tIHx8IFNhZmVyLmZyb20gPT09IFVpbnQ4QXJyYXkuZnJvbSkge1xuICBTYWZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59XG5cbmlmICghU2FmZXIuYWxsb2MpIHtcbiAgU2FmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHNpemUpO1xuICAgIH1cblxuICAgIGlmIChzaXplIDwgMCB8fCBzaXplID49IDIgKiAoMSA8PCAzMCkpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKTtcbiAgICB9XG5cbiAgICB2YXIgYnVmID0gQnVmZmVyKHNpemUpO1xuXG4gICAgaWYgKCFmaWxsIHx8IGZpbGwubGVuZ3RoID09PSAwKSB7XG4gICAgICBidWYuZmlsbCgwKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfTtcbn1cblxuaWYgKCFzYWZlci5rU3RyaW5nTWF4TGVuZ3RoKSB7XG4gIHRyeSB7XG4gICAgc2FmZXIua1N0cmluZ01heExlbmd0aCA9IHByb2Nlc3MuYmluZGluZygnYnVmZmVyJykua1N0cmluZ01heExlbmd0aDtcbiAgfSBjYXRjaCAoZSkgey8vIHdlIGNhbid0IGRldGVybWluZSBrU3RyaW5nTWF4TGVuZ3RoIGluIGVudmlyb25tZW50cyB3aGVyZSBwcm9jZXNzLmJpbmRpbmdcbiAgICAvLyBpcyB1bnN1cHBvcnRlZCwgc28gbGV0J3Mgbm90IHNldCBpdFxuICB9XG59XG5cbmlmICghc2FmZXIuY29uc3RhbnRzKSB7XG4gIHNhZmVyLmNvbnN0YW50cyA9IHtcbiAgICBNQVhfTEVOR1RIOiBzYWZlci5rTWF4TGVuZ3RoXG4gIH07XG5cbiAgaWYgKHNhZmVyLmtTdHJpbmdNYXhMZW5ndGgpIHtcbiAgICBzYWZlci5jb25zdGFudHMuTUFYX1NUUklOR19MRU5HVEggPSBzYWZlci5rU3RyaW5nTWF4TGVuZ3RoO1xuICB9XG59XG5cbnZhciBzYWZlcl8xID0gc2FmZXI7XG5cbnZhciBCT01DaGFyID0gXCJcXHVGRUZGXCI7XG52YXIgUHJlcGVuZEJPTSA9IFByZXBlbmRCT01XcmFwcGVyO1xuXG5mdW5jdGlvbiBQcmVwZW5kQk9NV3JhcHBlcihlbmNvZGVyLCBvcHRpb25zKSB7XG4gIHRoaXMuZW5jb2RlciA9IGVuY29kZXI7XG4gIHRoaXMuYWRkQk9NID0gdHJ1ZTtcbn1cblxuUHJlcGVuZEJPTVdyYXBwZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICBpZiAodGhpcy5hZGRCT00pIHtcbiAgICBzdHIgPSBCT01DaGFyICsgc3RyO1xuICAgIHRoaXMuYWRkQk9NID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lbmNvZGVyLndyaXRlKHN0cik7XG59O1xuXG5QcmVwZW5kQk9NV3JhcHBlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lbmNvZGVyLmVuZCgpO1xufTsgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG52YXIgU3RyaXBCT00gPSBTdHJpcEJPTVdyYXBwZXI7XG5cbmZ1bmN0aW9uIFN0cmlwQk9NV3JhcHBlcihkZWNvZGVyLCBvcHRpb25zKSB7XG4gIHRoaXMuZGVjb2RlciA9IGRlY29kZXI7XG4gIHRoaXMucGFzcyA9IGZhbHNlO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xufVxuXG5TdHJpcEJPTVdyYXBwZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICB2YXIgcmVzID0gdGhpcy5kZWNvZGVyLndyaXRlKGJ1Zik7XG4gIGlmICh0aGlzLnBhc3MgfHwgIXJlcykgcmV0dXJuIHJlcztcblxuICBpZiAocmVzWzBdID09PSBCT01DaGFyKSB7XG4gICAgcmVzID0gcmVzLnNsaWNlKDEpO1xuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnN0cmlwQk9NID09PSAnZnVuY3Rpb24nKSB0aGlzLm9wdGlvbnMuc3RyaXBCT00oKTtcbiAgfVxuXG4gIHRoaXMucGFzcyA9IHRydWU7XG4gIHJldHVybiByZXM7XG59O1xuXG5TdHJpcEJPTVdyYXBwZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZGVjb2Rlci5lbmQoKTtcbn07XG5cbnZhciBib21IYW5kbGluZyA9IHtcbiAgUHJlcGVuZEJPTTogUHJlcGVuZEJPTSxcbiAgU3RyaXBCT006IFN0cmlwQk9NXG59O1xuXG52YXIgQnVmZmVyJDEgPSBzYWZlcl8xLkJ1ZmZlcjsgLy8gRXhwb3J0IE5vZGUuanMgaW50ZXJuYWwgZW5jb2RpbmdzLlxuXG52YXIgaW50ZXJuYWwgPSB7XG4gIC8vIEVuY29kaW5nc1xuICB1dGY4OiB7XG4gICAgdHlwZTogXCJfaW50ZXJuYWxcIixcbiAgICBib21Bd2FyZTogdHJ1ZVxuICB9LFxuICBjZXN1ODoge1xuICAgIHR5cGU6IFwiX2ludGVybmFsXCIsXG4gICAgYm9tQXdhcmU6IHRydWVcbiAgfSxcbiAgdW5pY29kZTExdXRmODogXCJ1dGY4XCIsXG4gIHVjczI6IHtcbiAgICB0eXBlOiBcIl9pbnRlcm5hbFwiLFxuICAgIGJvbUF3YXJlOiB0cnVlXG4gIH0sXG4gIHV0ZjE2bGU6IFwidWNzMlwiLFxuICBiaW5hcnk6IHtcbiAgICB0eXBlOiBcIl9pbnRlcm5hbFwiXG4gIH0sXG4gIGJhc2U2NDoge1xuICAgIHR5cGU6IFwiX2ludGVybmFsXCJcbiAgfSxcbiAgaGV4OiB7XG4gICAgdHlwZTogXCJfaW50ZXJuYWxcIlxuICB9LFxuICAvLyBDb2RlYy5cbiAgX2ludGVybmFsOiBJbnRlcm5hbENvZGVjXG59OyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBJbnRlcm5hbENvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgdGhpcy5lbmMgPSBjb2RlY09wdGlvbnMuZW5jb2RpbmdOYW1lO1xuICB0aGlzLmJvbUF3YXJlID0gY29kZWNPcHRpb25zLmJvbUF3YXJlO1xuICBpZiAodGhpcy5lbmMgPT09IFwiYmFzZTY0XCIpIHRoaXMuZW5jb2RlciA9IEludGVybmFsRW5jb2RlckJhc2U2NDtlbHNlIGlmICh0aGlzLmVuYyA9PT0gXCJjZXN1OFwiKSB7XG4gICAgdGhpcy5lbmMgPSBcInV0ZjhcIjsgLy8gVXNlIHV0ZjggZm9yIGRlY29kaW5nLlxuXG4gICAgdGhpcy5lbmNvZGVyID0gSW50ZXJuYWxFbmNvZGVyQ2VzdTg7IC8vIEFkZCBkZWNvZGVyIGZvciB2ZXJzaW9ucyBvZiBOb2RlIG5vdCBzdXBwb3J0aW5nIENFU1UtOFxuXG4gICAgaWYgKEJ1ZmZlciQxLmZyb20oJ2VkYTBiZGVkYjJhOScsICdoZXgnKS50b1N0cmluZygpICE9PSAn8J+SqScpIHtcbiAgICAgIHRoaXMuZGVjb2RlciA9IEludGVybmFsRGVjb2RlckNlc3U4O1xuICAgICAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBpY29udi5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgfVxuICB9XG59XG5cbkludGVybmFsQ29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBJbnRlcm5hbEVuY29kZXI7XG5JbnRlcm5hbENvZGVjLnByb3RvdHlwZS5kZWNvZGVyID0gSW50ZXJuYWxEZWNvZGVyOyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV2UgdXNlIG5vZGUuanMgaW50ZXJuYWwgZGVjb2Rlci4gSXRzIHNpZ25hdHVyZSBpcyB0aGUgc2FtZSBhcyBvdXJzLlxuXG52YXIgU3RyaW5nRGVjb2RlciA9IHN0cmluZ19kZWNvZGVyLlN0cmluZ0RlY29kZXI7XG5pZiAoIVN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCkgLy8gTm9kZSB2MC44IGRvZXNuJ3QgaGF2ZSB0aGlzIG1ldGhvZC5cbiAgU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge307XG5cbmZ1bmN0aW9uIEludGVybmFsRGVjb2RlcihvcHRpb25zLCBjb2RlYykge1xuICBTdHJpbmdEZWNvZGVyLmNhbGwodGhpcywgY29kZWMuZW5jKTtcbn1cblxuSW50ZXJuYWxEZWNvZGVyLnByb3RvdHlwZSA9IFN0cmluZ0RlY29kZXIucHJvdG90eXBlOyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRW5jb2RlciBpcyBtb3N0bHkgdHJpdmlhbFxuXG5mdW5jdGlvbiBJbnRlcm5hbEVuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgdGhpcy5lbmMgPSBjb2RlYy5lbmM7XG59XG5cbkludGVybmFsRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBCdWZmZXIkMS5mcm9tKHN0ciwgdGhpcy5lbmMpO1xufTtcblxuSW50ZXJuYWxFbmNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7fTsgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4Y2VwdCBiYXNlNjQgZW5jb2Rlciwgd2hpY2ggbXVzdCBrZWVwIGl0cyBzdGF0ZS5cblxuXG5mdW5jdGlvbiBJbnRlcm5hbEVuY29kZXJCYXNlNjQob3B0aW9ucywgY29kZWMpIHtcbiAgdGhpcy5wcmV2U3RyID0gJyc7XG59XG5cbkludGVybmFsRW5jb2RlckJhc2U2NC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHN0ciA9IHRoaXMucHJldlN0ciArIHN0cjtcbiAgdmFyIGNvbXBsZXRlUXVhZHMgPSBzdHIubGVuZ3RoIC0gc3RyLmxlbmd0aCAlIDQ7XG4gIHRoaXMucHJldlN0ciA9IHN0ci5zbGljZShjb21wbGV0ZVF1YWRzKTtcbiAgc3RyID0gc3RyLnNsaWNlKDAsIGNvbXBsZXRlUXVhZHMpO1xuICByZXR1cm4gQnVmZmVyJDEuZnJvbShzdHIsIFwiYmFzZTY0XCIpO1xufTtcblxuSW50ZXJuYWxFbmNvZGVyQmFzZTY0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBCdWZmZXIkMS5mcm9tKHRoaXMucHJldlN0ciwgXCJiYXNlNjRcIik7XG59OyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ0VTVS04IGVuY29kZXIgaXMgYWxzbyBzcGVjaWFsLlxuXG5cbmZ1bmN0aW9uIEludGVybmFsRW5jb2RlckNlc3U4KG9wdGlvbnMsIGNvZGVjKSB7fVxuXG5JbnRlcm5hbEVuY29kZXJDZXN1OC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBidWYgPSBCdWZmZXIkMS5hbGxvYyhzdHIubGVuZ3RoICogMyksXG4gICAgICBidWZJZHggPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIE5haXZlIGltcGxlbWVudGF0aW9uLCBidXQgaXQgd29ya3MgYmVjYXVzZSBDRVNVLTggaXMgZXNwZWNpYWxseSBlYXN5XG4gICAgLy8gdG8gY29udmVydCBmcm9tIFVURi0xNiAod2hpY2ggYWxsIEpTIHN0cmluZ3MgYXJlIGVuY29kZWQgaW4pLlxuXG4gICAgaWYgKGNoYXJDb2RlIDwgMHg4MCkgYnVmW2J1ZklkeCsrXSA9IGNoYXJDb2RlO2Vsc2UgaWYgKGNoYXJDb2RlIDwgMHg4MDApIHtcbiAgICAgIGJ1ZltidWZJZHgrK10gPSAweEMwICsgKGNoYXJDb2RlID4+PiA2KTtcbiAgICAgIGJ1ZltidWZJZHgrK10gPSAweDgwICsgKGNoYXJDb2RlICYgMHgzZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNoYXJDb2RlIHdpbGwgYWx3YXlzIGJlIDwgMHgxMDAwMCBpbiBqYXZhc2NyaXB0LlxuICAgICAgYnVmW2J1ZklkeCsrXSA9IDB4RTAgKyAoY2hhckNvZGUgPj4+IDEyKTtcbiAgICAgIGJ1ZltidWZJZHgrK10gPSAweDgwICsgKGNoYXJDb2RlID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbYnVmSWR4KytdID0gMHg4MCArIChjaGFyQ29kZSAmIDB4M2YpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWYuc2xpY2UoMCwgYnVmSWR4KTtcbn07XG5cbkludGVybmFsRW5jb2RlckNlc3U4LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7fTsgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENFU1UtOCBkZWNvZGVyIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBOb2RlIHY0LjArXG5cblxuZnVuY3Rpb24gSW50ZXJuYWxEZWNvZGVyQ2VzdTgob3B0aW9ucywgY29kZWMpIHtcbiAgdGhpcy5hY2MgPSAwO1xuICB0aGlzLmNvbnRCeXRlcyA9IDA7XG4gIHRoaXMuYWNjQnl0ZXMgPSAwO1xuICB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZSA9IGNvZGVjLmRlZmF1bHRDaGFyVW5pY29kZTtcbn1cblxuSW50ZXJuYWxEZWNvZGVyQ2VzdTgucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICB2YXIgYWNjID0gdGhpcy5hY2MsXG4gICAgICBjb250Qnl0ZXMgPSB0aGlzLmNvbnRCeXRlcyxcbiAgICAgIGFjY0J5dGVzID0gdGhpcy5hY2NCeXRlcyxcbiAgICAgIHJlcyA9ICcnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN1ckJ5dGUgPSBidWZbaV07XG5cbiAgICBpZiAoKGN1ckJ5dGUgJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgLy8gTGVhZGluZyBieXRlXG4gICAgICBpZiAoY29udEJ5dGVzID4gMCkge1xuICAgICAgICAvLyBQcmV2aW91cyBjb2RlIGlzIGludmFsaWRcbiAgICAgICAgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgICBjb250Qnl0ZXMgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VyQnl0ZSA8IDB4ODApIHtcbiAgICAgICAgLy8gU2luZ2xlLWJ5dGUgY29kZVxuICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjdXJCeXRlKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VyQnl0ZSA8IDB4RTApIHtcbiAgICAgICAgLy8gVHdvLWJ5dGUgY29kZVxuICAgICAgICBhY2MgPSBjdXJCeXRlICYgMHgxRjtcbiAgICAgICAgY29udEJ5dGVzID0gMTtcbiAgICAgICAgYWNjQnl0ZXMgPSAxO1xuICAgICAgfSBlbHNlIGlmIChjdXJCeXRlIDwgMHhGMCkge1xuICAgICAgICAvLyBUaHJlZS1ieXRlIGNvZGVcbiAgICAgICAgYWNjID0gY3VyQnl0ZSAmIDB4MEY7XG4gICAgICAgIGNvbnRCeXRlcyA9IDI7XG4gICAgICAgIGFjY0J5dGVzID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvdXIgb3IgbW9yZSBhcmUgbm90IHN1cHBvcnRlZCBmb3IgQ0VTVS04LlxuICAgICAgICByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnRpbnVhdGlvbiBieXRlXG4gICAgICBpZiAoY29udEJ5dGVzID4gMCkge1xuICAgICAgICAvLyBXZSdyZSB3YWl0aW5nIGZvciBpdC5cbiAgICAgICAgYWNjID0gYWNjIDw8IDYgfCBjdXJCeXRlICYgMHgzZjtcbiAgICAgICAgY29udEJ5dGVzLS07XG4gICAgICAgIGFjY0J5dGVzKys7XG5cbiAgICAgICAgaWYgKGNvbnRCeXRlcyA9PT0gMCkge1xuICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVybG9uZyBlbmNvZGluZywgYnV0IHN1cHBvcnQgTW9kaWZpZWQgVVRGLTggKGVuY29kaW5nIE5VTEwgYXMgQzAgODApXG4gICAgICAgICAgaWYgKGFjY0J5dGVzID09PSAyICYmIGFjYyA8IDB4ODAgJiYgYWNjID4gMCkgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO2Vsc2UgaWYgKGFjY0J5dGVzID09PSAzICYmIGFjYyA8IDB4ODAwKSByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7ZWxzZSAvLyBBY3R1YWxseSBhZGQgY2hhcmFjdGVyLlxuICAgICAgICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYWNjKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVW5leHBlY3RlZCBjb250aW51YXRpb24gYnl0ZVxuICAgICAgICByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5hY2MgPSBhY2M7XG4gIHRoaXMuY29udEJ5dGVzID0gY29udEJ5dGVzO1xuICB0aGlzLmFjY0J5dGVzID0gYWNjQnl0ZXM7XG4gIHJldHVybiByZXM7XG59O1xuXG5JbnRlcm5hbERlY29kZXJDZXN1OC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmVzID0gMDtcbiAgaWYgKHRoaXMuY29udEJ5dGVzID4gMCkgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICByZXR1cm4gcmVzO1xufTtcblxudmFyIEJ1ZmZlciQyID0gc2FmZXJfMS5CdWZmZXI7IC8vIE5vdGU6IFVURjE2LUxFIChvciBVQ1MyKSBjb2RlYyBpcyBOb2RlLmpzIG5hdGl2ZS4gU2VlIGVuY29kaW5ncy9pbnRlcm5hbC5qc1xuLy8gPT0gVVRGMTYtQkUgY29kZWMuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxudmFyIHV0ZjE2YmUgPSBVdGYxNkJFQ29kZWM7XG5cbmZ1bmN0aW9uIFV0ZjE2QkVDb2RlYygpIHt9XG5cblV0ZjE2QkVDb2RlYy5wcm90b3R5cGUuZW5jb2RlciA9IFV0ZjE2QkVFbmNvZGVyO1xuVXRmMTZCRUNvZGVjLnByb3RvdHlwZS5kZWNvZGVyID0gVXRmMTZCRURlY29kZXI7XG5VdGYxNkJFQ29kZWMucHJvdG90eXBlLmJvbUF3YXJlID0gdHJ1ZTsgLy8gLS0gRW5jb2RpbmdcblxuZnVuY3Rpb24gVXRmMTZCRUVuY29kZXIoKSB7fVxuXG5VdGYxNkJFRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBidWYgPSBCdWZmZXIkMi5mcm9tKHN0ciwgJ3VjczInKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciB0bXAgPSBidWZbaV07XG4gICAgYnVmW2ldID0gYnVmW2kgKyAxXTtcbiAgICBidWZbaSArIDFdID0gdG1wO1xuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblV0ZjE2QkVFbmNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7fTsgLy8gLS0gRGVjb2RpbmdcblxuXG5mdW5jdGlvbiBVdGYxNkJFRGVjb2RlcigpIHtcbiAgdGhpcy5vdmVyZmxvd0J5dGUgPSAtMTtcbn1cblxuVXRmMTZCRURlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAoYnVmLmxlbmd0aCA9PSAwKSByZXR1cm4gJyc7XG4gIHZhciBidWYyID0gQnVmZmVyJDIuYWxsb2MoYnVmLmxlbmd0aCArIDEpLFxuICAgICAgaSA9IDAsXG4gICAgICBqID0gMDtcblxuICBpZiAodGhpcy5vdmVyZmxvd0J5dGUgIT09IC0xKSB7XG4gICAgYnVmMlswXSA9IGJ1ZlswXTtcbiAgICBidWYyWzFdID0gdGhpcy5vdmVyZmxvd0J5dGU7XG4gICAgaSA9IDE7XG4gICAgaiA9IDI7XG4gIH1cblxuICBmb3IgKDsgaSA8IGJ1Zi5sZW5ndGggLSAxOyBpICs9IDIsIGogKz0gMikge1xuICAgIGJ1ZjJbal0gPSBidWZbaSArIDFdO1xuICAgIGJ1ZjJbaiArIDFdID0gYnVmW2ldO1xuICB9XG5cbiAgdGhpcy5vdmVyZmxvd0J5dGUgPSBpID09IGJ1Zi5sZW5ndGggLSAxID8gYnVmW2J1Zi5sZW5ndGggLSAxXSA6IC0xO1xuICByZXR1cm4gYnVmMi5zbGljZSgwLCBqKS50b1N0cmluZygndWNzMicpO1xufTtcblxuVXRmMTZCRURlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHt9OyAvLyA9PSBVVEYtMTYgY29kZWMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVjb2RlciBjaG9vc2VzIGF1dG9tYXRpY2FsbHkgZnJvbSBVVEYtMTZMRSBhbmQgVVRGLTE2QkUgdXNpbmcgQk9NIGFuZCBzcGFjZS1iYXNlZCBoZXVyaXN0aWMuXG4vLyBEZWZhdWx0cyB0byBVVEYtMTZMRSwgYXMgaXQncyBwcmV2YWxlbnQgYW5kIGRlZmF1bHQgaW4gTm9kZS5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2IGFuZCBodHRwOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnLyN1dGYtMTZsZVxuLy8gRGVjb2RlciBkZWZhdWx0IGNhbiBiZSBjaGFuZ2VkOiBpY29udi5kZWNvZGUoYnVmLCAndXRmMTYnLCB7ZGVmYXVsdEVuY29kaW5nOiAndXRmLTE2YmUnfSk7XG4vLyBFbmNvZGVyIHVzZXMgVVRGLTE2TEUgYW5kIHByZXBlbmRzIEJPTSAod2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBhZGRCT006IGZhbHNlKS5cblxuXG52YXIgdXRmMTZfMSA9IFV0ZjE2Q29kZWM7XG5cbmZ1bmN0aW9uIFV0ZjE2Q29kZWMoY29kZWNPcHRpb25zLCBpY29udikge1xuICB0aGlzLmljb252ID0gaWNvbnY7XG59XG5cblV0ZjE2Q29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBVdGYxNkVuY29kZXI7XG5VdGYxNkNvZGVjLnByb3RvdHlwZS5kZWNvZGVyID0gVXRmMTZEZWNvZGVyOyAvLyAtLSBFbmNvZGluZyAocGFzcy10aHJvdWdoKVxuXG5mdW5jdGlvbiBVdGYxNkVuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmIChvcHRpb25zLmFkZEJPTSA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmFkZEJPTSA9IHRydWU7XG4gIHRoaXMuZW5jb2RlciA9IGNvZGVjLmljb252LmdldEVuY29kZXIoJ3V0Zi0xNmxlJywgb3B0aW9ucyk7XG59XG5cblV0ZjE2RW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiB0aGlzLmVuY29kZXIud3JpdGUoc3RyKTtcbn07XG5cblV0ZjE2RW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lbmNvZGVyLmVuZCgpO1xufTsgLy8gLS0gRGVjb2RpbmdcblxuXG5mdW5jdGlvbiBVdGYxNkRlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5pbml0aWFsQnl0ZXMgPSBbXTtcbiAgdGhpcy5pbml0aWFsQnl0ZXNMZW4gPSAwO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG59XG5cblV0ZjE2RGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmICghdGhpcy5kZWNvZGVyKSB7XG4gICAgLy8gQ29kZWMgaXMgbm90IGNob3NlbiB5ZXQuIEFjY3VtdWxhdGUgaW5pdGlhbCBieXRlcy5cbiAgICB0aGlzLmluaXRpYWxCeXRlcy5wdXNoKGJ1Zik7XG4gICAgdGhpcy5pbml0aWFsQnl0ZXNMZW4gKz0gYnVmLmxlbmd0aDtcbiAgICBpZiAodGhpcy5pbml0aWFsQnl0ZXNMZW4gPCAxNikgLy8gV2UgbmVlZCBtb3JlIGJ5dGVzIHRvIHVzZSBzcGFjZSBoZXVyaXN0aWMgKHNlZSBiZWxvdylcbiAgICAgIHJldHVybiAnJzsgLy8gV2UgaGF2ZSBlbm91Z2ggYnl0ZXMgLT4gZGV0ZWN0IGVuZGlhbm5lc3MuXG5cbiAgICB2YXIgYnVmID0gQnVmZmVyJDIuY29uY2F0KHRoaXMuaW5pdGlhbEJ5dGVzKSxcbiAgICAgICAgZW5jb2RpbmcgPSBkZXRlY3RFbmNvZGluZyhidWYsIHRoaXMub3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpO1xuICAgIHRoaXMuZGVjb2RlciA9IHRoaXMuaWNvbnYuZ2V0RGVjb2RlcihlbmNvZGluZywgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLmluaXRpYWxCeXRlcy5sZW5ndGggPSB0aGlzLmluaXRpYWxCeXRlc0xlbiA9IDA7XG4gIH1cblxuICByZXR1cm4gdGhpcy5kZWNvZGVyLndyaXRlKGJ1Zik7XG59O1xuXG5VdGYxNkRlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmRlY29kZXIpIHtcbiAgICB2YXIgYnVmID0gQnVmZmVyJDIuY29uY2F0KHRoaXMuaW5pdGlhbEJ5dGVzKSxcbiAgICAgICAgZW5jb2RpbmcgPSBkZXRlY3RFbmNvZGluZyhidWYsIHRoaXMub3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpO1xuICAgIHRoaXMuZGVjb2RlciA9IHRoaXMuaWNvbnYuZ2V0RGVjb2RlcihlbmNvZGluZywgdGhpcy5vcHRpb25zKTtcbiAgICB2YXIgcmVzID0gdGhpcy5kZWNvZGVyLndyaXRlKGJ1ZiksXG4gICAgICAgIHRyYWlsID0gdGhpcy5kZWNvZGVyLmVuZCgpO1xuICAgIHJldHVybiB0cmFpbCA/IHJlcyArIHRyYWlsIDogcmVzO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZGVjb2Rlci5lbmQoKTtcbn07XG5cbmZ1bmN0aW9uIGRldGVjdEVuY29kaW5nKGJ1ZiwgZGVmYXVsdEVuY29kaW5nKSB7XG4gIHZhciBlbmMgPSBkZWZhdWx0RW5jb2RpbmcgfHwgJ3V0Zi0xNmxlJztcblxuICBpZiAoYnVmLmxlbmd0aCA+PSAyKSB7XG4gICAgLy8gQ2hlY2sgQk9NLlxuICAgIGlmIChidWZbMF0gPT0gMHhGRSAmJiBidWZbMV0gPT0gMHhGRikgLy8gVVRGLTE2QkUgQk9NXG4gICAgICBlbmMgPSAndXRmLTE2YmUnO2Vsc2UgaWYgKGJ1ZlswXSA9PSAweEZGICYmIGJ1ZlsxXSA9PSAweEZFKSAvLyBVVEYtMTZMRSBCT01cbiAgICAgIGVuYyA9ICd1dGYtMTZsZSc7ZWxzZSB7XG4gICAgICAvLyBObyBCT00gZm91bmQuIFRyeSB0byBkZWR1Y2UgZW5jb2RpbmcgZnJvbSBpbml0aWFsIGNvbnRlbnQuXG4gICAgICAvLyBNb3N0IG9mIHRoZSB0aW1lLCB0aGUgY29udGVudCBoYXMgQVNDSUkgY2hhcnMgKFUrMDAqKiksIGJ1dCB0aGUgb3Bwb3NpdGUgKFUrKiowMCkgaXMgdW5jb21tb24uXG4gICAgICAvLyBTbywgd2UgY291bnQgQVNDSUkgYXMgaWYgaXQgd2FzIExFIG9yIEJFLCBhbmQgZGVjaWRlIGZyb20gdGhhdC5cbiAgICAgIHZhciBhc2NpaUNoYXJzTEUgPSAwLFxuICAgICAgICAgIGFzY2lpQ2hhcnNCRSA9IDAsXG4gICAgICAgICAgLy8gQ291bnRzIG9mIGNoYXJzIGluIGJvdGggcG9zaXRpb25zXG4gICAgICBfbGVuID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIGJ1Zi5sZW5ndGggJSAyLCA2NCk7IC8vIExlbiBpcyBhbHdheXMgZXZlbi5cblxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9sZW47IGkgKz0gMikge1xuICAgICAgICBpZiAoYnVmW2ldID09PSAwICYmIGJ1ZltpICsgMV0gIT09IDApIGFzY2lpQ2hhcnNCRSsrO1xuICAgICAgICBpZiAoYnVmW2ldICE9PSAwICYmIGJ1ZltpICsgMV0gPT09IDApIGFzY2lpQ2hhcnNMRSsrO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXNjaWlDaGFyc0JFID4gYXNjaWlDaGFyc0xFKSBlbmMgPSAndXRmLTE2YmUnO2Vsc2UgaWYgKGFzY2lpQ2hhcnNCRSA8IGFzY2lpQ2hhcnNMRSkgZW5jID0gJ3V0Zi0xNmxlJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW5jO1xufVxuXG52YXIgdXRmMTYgPSB7XG4gIHV0ZjE2YmU6IHV0ZjE2YmUsXG4gIHV0ZjE2OiB1dGYxNl8xXG59O1xuXG52YXIgQnVmZmVyJDMgPSBzYWZlcl8xLkJ1ZmZlcjsgLy8gVVRGLTcgY29kZWMsIGFjY29yZGluZyB0byBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjE1MlxuLy8gU2VlIGFsc28gYmVsb3cgYSBVVEYtNy1JTUFQIGNvZGVjLCBhY2NvcmRpbmcgdG8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTUuMS4zXG5cbnZhciB1dGY3XzEgPSBVdGY3Q29kZWM7XG52YXIgdW5pY29kZTExdXRmNyA9ICd1dGY3JzsgLy8gQWxpYXMgVU5JQ09ERS0xLTEtVVRGLTdcblxuZnVuY3Rpb24gVXRmN0NvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgdGhpcy5pY29udiA9IGljb252O1xufVxuVXRmN0NvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmN0VuY29kZXI7XG5VdGY3Q29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBVdGY3RGVjb2RlcjtcblV0ZjdDb2RlYy5wcm90b3R5cGUuYm9tQXdhcmUgPSB0cnVlOyAvLyAtLSBFbmNvZGluZ1xuXG52YXIgbm9uRGlyZWN0Q2hhcnMgPSAvW15BLVphLXowLTknXFwoXFwpLC1cXC5cXC86XFw/IFxcblxcclxcdF0rL2c7XG5cbmZ1bmN0aW9uIFV0ZjdFbmNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIHRoaXMuaWNvbnYgPSBjb2RlYy5pY29udjtcbn1cblxuVXRmN0VuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICAvLyBOYWl2ZSBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gTm9uLWRpcmVjdCBjaGFycyBhcmUgZW5jb2RlZCBhcyBcIis8YmFzZTY0Pi1cIjsgc2luZ2xlIFwiK1wiIGNoYXIgaXMgZW5jb2RlZCBhcyBcIistXCIuXG4gIHJldHVybiBCdWZmZXIkMy5mcm9tKHN0ci5yZXBsYWNlKG5vbkRpcmVjdENoYXJzLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICByZXR1cm4gXCIrXCIgKyAoY2h1bmsgPT09ICcrJyA/ICcnIDogdGhpcy5pY29udi5lbmNvZGUoY2h1bmssICd1dGYxNi1iZScpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC89KyQvLCAnJykpICsgXCItXCI7XG4gIH0uYmluZCh0aGlzKSkpO1xufTtcblxuVXRmN0VuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHt9OyAvLyAtLSBEZWNvZGluZ1xuXG5cbmZ1bmN0aW9uIFV0ZjdEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIHRoaXMuaWNvbnYgPSBjb2RlYy5pY29udjtcbiAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICB0aGlzLmJhc2U2NEFjY3VtID0gJyc7XG59XG5cbnZhciBiYXNlNjRSZWdleCA9IC9bQS1aYS16MC05XFwvK10vO1xudmFyIGJhc2U2NENoYXJzID0gW107XG5cbmZvciAodmFyIGkkMSA9IDA7IGkkMSA8IDI1NjsgaSQxKyspIHtcbiAgYmFzZTY0Q2hhcnNbaSQxXSA9IGJhc2U2NFJlZ2V4LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShpJDEpKTtcbn1cblxudmFyIHBsdXNDaGFyID0gJysnLmNoYXJDb2RlQXQoMCksXG4gICAgbWludXNDaGFyID0gJy0nLmNoYXJDb2RlQXQoMCksXG4gICAgYW5kQ2hhciA9ICcmJy5jaGFyQ29kZUF0KDApO1xuXG5VdGY3RGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIHZhciByZXMgPSBcIlwiLFxuICAgICAgbGFzdEkgPSAwLFxuICAgICAgaW5CYXNlNjQgPSB0aGlzLmluQmFzZTY0LFxuICAgICAgYmFzZTY0QWNjdW0gPSB0aGlzLmJhc2U2NEFjY3VtOyAvLyBUaGUgZGVjb2RlciBpcyBtb3JlIGludm9sdmVkIGFzIHdlIG11c3QgaGFuZGxlIGNodW5rcyBpbiBzdHJlYW0uXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWluQmFzZTY0KSB7XG4gICAgICAvLyBXZSdyZSBpbiBkaXJlY3QgbW9kZS5cbiAgICAgIC8vIFdyaXRlIGRpcmVjdCBjaGFycyB1bnRpbCAnKydcbiAgICAgIGlmIChidWZbaV0gPT0gcGx1c0NoYXIpIHtcbiAgICAgICAgcmVzICs9IHRoaXMuaWNvbnYuZGVjb2RlKGJ1Zi5zbGljZShsYXN0SSwgaSksIFwiYXNjaWlcIik7IC8vIFdyaXRlIGRpcmVjdCBjaGFycy5cblxuICAgICAgICBsYXN0SSA9IGkgKyAxO1xuICAgICAgICBpbkJhc2U2NCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGRlY29kZSBiYXNlNjQuXG4gICAgICBpZiAoIWJhc2U2NENoYXJzW2J1ZltpXV0pIHtcbiAgICAgICAgLy8gQmFzZTY0IGVuZGVkLlxuICAgICAgICBpZiAoaSA9PSBsYXN0SSAmJiBidWZbaV0gPT0gbWludXNDaGFyKSB7XG4gICAgICAgICAgLy8gXCIrLVwiIC0+IFwiK1wiXG4gICAgICAgICAgcmVzICs9IFwiK1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBiNjRzdHIgPSBiYXNlNjRBY2N1bSArIGJ1Zi5zbGljZShsYXN0SSwgaSkudG9TdHJpbmcoKTtcbiAgICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoQnVmZmVyJDMuZnJvbShiNjRzdHIsICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChidWZbaV0gIT0gbWludXNDaGFyKSAvLyBNaW51cyBpcyBhYnNvcmJlZCBhZnRlciBiYXNlNjQuXG4gICAgICAgICAgaS0tO1xuICAgICAgICBsYXN0SSA9IGkgKyAxO1xuICAgICAgICBpbkJhc2U2NCA9IGZhbHNlO1xuICAgICAgICBiYXNlNjRBY2N1bSA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaW5CYXNlNjQpIHtcbiAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoYnVmLnNsaWNlKGxhc3RJKSwgXCJhc2NpaVwiKTsgLy8gV3JpdGUgZGlyZWN0IGNoYXJzLlxuICB9IGVsc2Uge1xuICAgIHZhciBiNjRzdHIgPSBiYXNlNjRBY2N1bSArIGJ1Zi5zbGljZShsYXN0SSkudG9TdHJpbmcoKTtcbiAgICB2YXIgY2FuQmVEZWNvZGVkID0gYjY0c3RyLmxlbmd0aCAtIGI2NHN0ci5sZW5ndGggJSA4OyAvLyBNaW5pbWFsIGNodW5rOiAyIHF1YWRzIC0+IDJ4MyBieXRlcyAtPiAzIGNoYXJzLlxuXG4gICAgYmFzZTY0QWNjdW0gPSBiNjRzdHIuc2xpY2UoY2FuQmVEZWNvZGVkKTsgLy8gVGhlIHJlc3Qgd2lsbCBiZSBkZWNvZGVkIGluIGZ1dHVyZS5cblxuICAgIGI2NHN0ciA9IGI2NHN0ci5zbGljZSgwLCBjYW5CZURlY29kZWQpO1xuICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIkMy5mcm9tKGI2NHN0ciwgJ2Jhc2U2NCcpLCBcInV0ZjE2LWJlXCIpO1xuICB9XG5cbiAgdGhpcy5pbkJhc2U2NCA9IGluQmFzZTY0O1xuICB0aGlzLmJhc2U2NEFjY3VtID0gYmFzZTY0QWNjdW07XG4gIHJldHVybiByZXM7XG59O1xuXG5VdGY3RGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmVzID0gXCJcIjtcbiAgaWYgKHRoaXMuaW5CYXNlNjQgJiYgdGhpcy5iYXNlNjRBY2N1bS5sZW5ndGggPiAwKSByZXMgPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIkMy5mcm9tKHRoaXMuYmFzZTY0QWNjdW0sICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICB0aGlzLmJhc2U2NEFjY3VtID0gJyc7XG4gIHJldHVybiByZXM7XG59OyAvLyBVVEYtNy1JTUFQIGNvZGVjLlxuLy8gUkZDMzUwMSBTZWMuIDUuMS4zIE1vZGlmaWVkIFVURi03IChodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNS4xLjMpXG4vLyBEaWZmZXJlbmNlczpcbi8vICAqIEJhc2U2NCBwYXJ0IGlzIHN0YXJ0ZWQgYnkgXCImXCIgaW5zdGVhZCBvZiBcIitcIlxuLy8gICogRGlyZWN0IGNoYXJhY3RlcnMgYXJlIDB4MjAtMHg3RSwgZXhjZXB0IFwiJlwiICgweDI2KVxuLy8gICogSW4gQmFzZTY0LCBcIixcIiBpcyB1c2VkIGluc3RlYWQgb2YgXCIvXCJcbi8vICAqIEJhc2U2NCBtdXN0IG5vdCBiZSB1c2VkIHRvIHJlcHJlc2VudCBkaXJlY3QgY2hhcmFjdGVycy5cbi8vICAqIE5vIGltcGxpY2l0IHNoaWZ0IGJhY2sgZnJvbSBCYXNlNjQgKHNob3VsZCBhbHdheXMgZW5kIHdpdGggJy0nKVxuLy8gICogU3RyaW5nIG11c3QgZW5kIGluIG5vbi1zaGlmdGVkIHBvc2l0aW9uLlxuLy8gICogXCItJlwiIHdoaWxlIGluIGJhc2U2NCBpcyBub3QgYWxsb3dlZC5cblxuXG52YXIgdXRmN2ltYXAgPSBVdGY3SU1BUENvZGVjO1xuXG5mdW5jdGlvbiBVdGY3SU1BUENvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgdGhpcy5pY29udiA9IGljb252O1xufVxuVXRmN0lNQVBDb2RlYy5wcm90b3R5cGUuZW5jb2RlciA9IFV0ZjdJTUFQRW5jb2RlcjtcblV0ZjdJTUFQQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBVdGY3SU1BUERlY29kZXI7XG5VdGY3SU1BUENvZGVjLnByb3RvdHlwZS5ib21Bd2FyZSA9IHRydWU7IC8vIC0tIEVuY29kaW5nXG5cbmZ1bmN0aW9uIFV0ZjdJTUFQRW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG4gIHRoaXMuaW5CYXNlNjQgPSBmYWxzZTtcbiAgdGhpcy5iYXNlNjRBY2N1bSA9IEJ1ZmZlciQzLmFsbG9jKDYpO1xuICB0aGlzLmJhc2U2NEFjY3VtSWR4ID0gMDtcbn1cblxuVXRmN0lNQVBFbmNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGluQmFzZTY0ID0gdGhpcy5pbkJhc2U2NCxcbiAgICAgIGJhc2U2NEFjY3VtID0gdGhpcy5iYXNlNjRBY2N1bSxcbiAgICAgIGJhc2U2NEFjY3VtSWR4ID0gdGhpcy5iYXNlNjRBY2N1bUlkeCxcbiAgICAgIGJ1ZiA9IEJ1ZmZlciQzLmFsbG9jKHN0ci5sZW5ndGggKiA1ICsgMTApLFxuICAgICAgYnVmSWR4ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIHZhciB1Q2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXG4gICAgaWYgKDB4MjAgPD0gdUNoYXIgJiYgdUNoYXIgPD0gMHg3RSkge1xuICAgICAgLy8gRGlyZWN0IGNoYXJhY3RlciBvciAnJicuXG4gICAgICBpZiAoaW5CYXNlNjQpIHtcbiAgICAgICAgaWYgKGJhc2U2NEFjY3VtSWR4ID4gMCkge1xuICAgICAgICAgIGJ1ZklkeCArPSBidWYud3JpdGUoYmFzZTY0QWNjdW0uc2xpY2UoMCwgYmFzZTY0QWNjdW1JZHgpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXC8vZywgJywnKS5yZXBsYWNlKC89KyQvLCAnJyksIGJ1ZklkeCk7XG4gICAgICAgICAgYmFzZTY0QWNjdW1JZHggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVmW2J1ZklkeCsrXSA9IG1pbnVzQ2hhcjsgLy8gV3JpdGUgJy0nLCB0aGVuIGdvIHRvIGRpcmVjdCBtb2RlLlxuXG4gICAgICAgIGluQmFzZTY0ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5CYXNlNjQpIHtcbiAgICAgICAgYnVmW2J1ZklkeCsrXSA9IHVDaGFyOyAvLyBXcml0ZSBkaXJlY3QgY2hhcmFjdGVyXG5cbiAgICAgICAgaWYgKHVDaGFyID09PSBhbmRDaGFyKSAvLyBBbXBlcnNhbmQgLT4gJyYtJ1xuICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSBtaW51c0NoYXI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vbi1kaXJlY3QgY2hhcmFjdGVyXG4gICAgICBpZiAoIWluQmFzZTY0KSB7XG4gICAgICAgIGJ1ZltidWZJZHgrK10gPSBhbmRDaGFyOyAvLyBXcml0ZSAnJicsIHRoZW4gZ28gdG8gYmFzZTY0IG1vZGUuXG5cbiAgICAgICAgaW5CYXNlNjQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5CYXNlNjQpIHtcbiAgICAgICAgYmFzZTY0QWNjdW1bYmFzZTY0QWNjdW1JZHgrK10gPSB1Q2hhciA+PiA4O1xuICAgICAgICBiYXNlNjRBY2N1bVtiYXNlNjRBY2N1bUlkeCsrXSA9IHVDaGFyICYgMHhGRjtcblxuICAgICAgICBpZiAoYmFzZTY0QWNjdW1JZHggPT0gYmFzZTY0QWNjdW0ubGVuZ3RoKSB7XG4gICAgICAgICAgYnVmSWR4ICs9IGJ1Zi53cml0ZShiYXNlNjRBY2N1bS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvXFwvL2csICcsJyksIGJ1ZklkeCk7XG4gICAgICAgICAgYmFzZTY0QWNjdW1JZHggPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5pbkJhc2U2NCA9IGluQmFzZTY0O1xuICB0aGlzLmJhc2U2NEFjY3VtSWR4ID0gYmFzZTY0QWNjdW1JZHg7XG4gIHJldHVybiBidWYuc2xpY2UoMCwgYnVmSWR4KTtcbn07XG5cblV0ZjdJTUFQRW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYnVmID0gQnVmZmVyJDMuYWxsb2MoMTApLFxuICAgICAgYnVmSWR4ID0gMDtcblxuICBpZiAodGhpcy5pbkJhc2U2NCkge1xuICAgIGlmICh0aGlzLmJhc2U2NEFjY3VtSWR4ID4gMCkge1xuICAgICAgYnVmSWR4ICs9IGJ1Zi53cml0ZSh0aGlzLmJhc2U2NEFjY3VtLnNsaWNlKDAsIHRoaXMuYmFzZTY0QWNjdW1JZHgpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXC8vZywgJywnKS5yZXBsYWNlKC89KyQvLCAnJyksIGJ1ZklkeCk7XG4gICAgICB0aGlzLmJhc2U2NEFjY3VtSWR4ID0gMDtcbiAgICB9XG5cbiAgICBidWZbYnVmSWR4KytdID0gbWludXNDaGFyOyAvLyBXcml0ZSAnLScsIHRoZW4gZ28gdG8gZGlyZWN0IG1vZGUuXG5cbiAgICB0aGlzLmluQmFzZTY0ID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gYnVmLnNsaWNlKDAsIGJ1ZklkeCk7XG59OyAvLyAtLSBEZWNvZGluZ1xuXG5cbmZ1bmN0aW9uIFV0ZjdJTUFQRGVjb2RlcihvcHRpb25zLCBjb2RlYykge1xuICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG4gIHRoaXMuaW5CYXNlNjQgPSBmYWxzZTtcbiAgdGhpcy5iYXNlNjRBY2N1bSA9ICcnO1xufVxuXG52YXIgYmFzZTY0SU1BUENoYXJzID0gYmFzZTY0Q2hhcnMuc2xpY2UoKTtcbmJhc2U2NElNQVBDaGFyc1snLCcuY2hhckNvZGVBdCgwKV0gPSB0cnVlO1xuXG5VdGY3SU1BUERlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICB2YXIgcmVzID0gXCJcIixcbiAgICAgIGxhc3RJID0gMCxcbiAgICAgIGluQmFzZTY0ID0gdGhpcy5pbkJhc2U2NCxcbiAgICAgIGJhc2U2NEFjY3VtID0gdGhpcy5iYXNlNjRBY2N1bTsgLy8gVGhlIGRlY29kZXIgaXMgbW9yZSBpbnZvbHZlZCBhcyB3ZSBtdXN0IGhhbmRsZSBjaHVua3MgaW4gc3RyZWFtLlxuICAvLyBJdCBpcyBmb3JnaXZpbmcsIGNsb3NlciB0byBzdGFuZGFyZCBVVEYtNyAoZm9yIGV4YW1wbGUsICctJyBpcyBvcHRpb25hbCBhdCB0aGUgZW5kKS5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaW5CYXNlNjQpIHtcbiAgICAgIC8vIFdlJ3JlIGluIGRpcmVjdCBtb2RlLlxuICAgICAgLy8gV3JpdGUgZGlyZWN0IGNoYXJzIHVudGlsICcmJ1xuICAgICAgaWYgKGJ1ZltpXSA9PSBhbmRDaGFyKSB7XG4gICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShidWYuc2xpY2UobGFzdEksIGkpLCBcImFzY2lpXCIpOyAvLyBXcml0ZSBkaXJlY3QgY2hhcnMuXG5cbiAgICAgICAgbGFzdEkgPSBpICsgMTtcbiAgICAgICAgaW5CYXNlNjQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBkZWNvZGUgYmFzZTY0LlxuICAgICAgaWYgKCFiYXNlNjRJTUFQQ2hhcnNbYnVmW2ldXSkge1xuICAgICAgICAvLyBCYXNlNjQgZW5kZWQuXG4gICAgICAgIGlmIChpID09IGxhc3RJICYmIGJ1ZltpXSA9PSBtaW51c0NoYXIpIHtcbiAgICAgICAgICAvLyBcIiYtXCIgLT4gXCImXCJcbiAgICAgICAgICByZXMgKz0gXCImXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGI2NHN0ciA9IGJhc2U2NEFjY3VtICsgYnVmLnNsaWNlKGxhc3RJLCBpKS50b1N0cmluZygpLnJlcGxhY2UoLywvZywgJy8nKTtcbiAgICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoQnVmZmVyJDMuZnJvbShiNjRzdHIsICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChidWZbaV0gIT0gbWludXNDaGFyKSAvLyBNaW51cyBtYXkgYmUgYWJzb3JiZWQgYWZ0ZXIgYmFzZTY0LlxuICAgICAgICAgIGktLTtcbiAgICAgICAgbGFzdEkgPSBpICsgMTtcbiAgICAgICAgaW5CYXNlNjQgPSBmYWxzZTtcbiAgICAgICAgYmFzZTY0QWNjdW0gPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWluQmFzZTY0KSB7XG4gICAgcmVzICs9IHRoaXMuaWNvbnYuZGVjb2RlKGJ1Zi5zbGljZShsYXN0SSksIFwiYXNjaWlcIik7IC8vIFdyaXRlIGRpcmVjdCBjaGFycy5cbiAgfSBlbHNlIHtcbiAgICB2YXIgYjY0c3RyID0gYmFzZTY0QWNjdW0gKyBidWYuc2xpY2UobGFzdEkpLnRvU3RyaW5nKCkucmVwbGFjZSgvLC9nLCAnLycpO1xuICAgIHZhciBjYW5CZURlY29kZWQgPSBiNjRzdHIubGVuZ3RoIC0gYjY0c3RyLmxlbmd0aCAlIDg7IC8vIE1pbmltYWwgY2h1bms6IDIgcXVhZHMgLT4gMngzIGJ5dGVzIC0+IDMgY2hhcnMuXG5cbiAgICBiYXNlNjRBY2N1bSA9IGI2NHN0ci5zbGljZShjYW5CZURlY29kZWQpOyAvLyBUaGUgcmVzdCB3aWxsIGJlIGRlY29kZWQgaW4gZnV0dXJlLlxuXG4gICAgYjY0c3RyID0gYjY0c3RyLnNsaWNlKDAsIGNhbkJlRGVjb2RlZCk7XG4gICAgcmVzICs9IHRoaXMuaWNvbnYuZGVjb2RlKEJ1ZmZlciQzLmZyb20oYjY0c3RyLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG4gIH1cblxuICB0aGlzLmluQmFzZTY0ID0gaW5CYXNlNjQ7XG4gIHRoaXMuYmFzZTY0QWNjdW0gPSBiYXNlNjRBY2N1bTtcbiAgcmV0dXJuIHJlcztcbn07XG5cblV0ZjdJTUFQRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmVzID0gXCJcIjtcbiAgaWYgKHRoaXMuaW5CYXNlNjQgJiYgdGhpcy5iYXNlNjRBY2N1bS5sZW5ndGggPiAwKSByZXMgPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIkMy5mcm9tKHRoaXMuYmFzZTY0QWNjdW0sICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICB0aGlzLmJhc2U2NEFjY3VtID0gJyc7XG4gIHJldHVybiByZXM7XG59O1xuXG52YXIgdXRmNyA9IHtcbiAgdXRmNzogdXRmN18xLFxuICB1bmljb2RlMTF1dGY3OiB1bmljb2RlMTF1dGY3LFxuICB1dGY3aW1hcDogdXRmN2ltYXBcbn07XG5cbnZhciBCdWZmZXIkNCA9IHNhZmVyXzEuQnVmZmVyOyAvLyBTaW5nbGUtYnl0ZSBjb2RlYy4gTmVlZHMgYSAnY2hhcnMnIHN0cmluZyBwYXJhbWV0ZXIgdGhhdCBjb250YWlucyAyNTYgb3IgMTI4IGNoYXJzIHRoYXRcbi8vIGNvcnJlc3BvbmQgdG8gZW5jb2RlZCBieXRlcyAoaWYgMTI4IC0gdGhlbiBsb3dlciBoYWxmIGlzIEFTQ0lJKS4gXG5cbnZhciBfc2JjcyA9IFNCQ1NDb2RlYztcblxuZnVuY3Rpb24gU0JDU0NvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgaWYgKCFjb2RlY09wdGlvbnMpIHRocm93IG5ldyBFcnJvcihcIlNCQ1MgY29kZWMgaXMgY2FsbGVkIHdpdGhvdXQgdGhlIGRhdGEuXCIpOyAvLyBQcmVwYXJlIGNoYXIgYnVmZmVyIGZvciBkZWNvZGluZy5cblxuICBpZiAoIWNvZGVjT3B0aW9ucy5jaGFycyB8fCBjb2RlY09wdGlvbnMuY2hhcnMubGVuZ3RoICE9PSAxMjggJiYgY29kZWNPcHRpb25zLmNoYXJzLmxlbmd0aCAhPT0gMjU2KSB0aHJvdyBuZXcgRXJyb3IoXCJFbmNvZGluZyAnXCIgKyBjb2RlY09wdGlvbnMudHlwZSArIFwiJyBoYXMgaW5jb3JyZWN0ICdjaGFycycgKG11c3QgYmUgb2YgbGVuIDEyOCBvciAyNTYpXCIpO1xuXG4gIGlmIChjb2RlY09wdGlvbnMuY2hhcnMubGVuZ3RoID09PSAxMjgpIHtcbiAgICB2YXIgYXNjaWlTdHJpbmcgPSBcIlwiO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMjg7IGkrKykge1xuICAgICAgYXNjaWlTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShpKTtcbiAgICB9XG5cbiAgICBjb2RlY09wdGlvbnMuY2hhcnMgPSBhc2NpaVN0cmluZyArIGNvZGVjT3B0aW9ucy5jaGFycztcbiAgfVxuXG4gIHRoaXMuZGVjb2RlQnVmID0gQnVmZmVyJDQuZnJvbShjb2RlY09wdGlvbnMuY2hhcnMsICd1Y3MyJyk7IC8vIEVuY29kaW5nIGJ1ZmZlci5cblxuICB2YXIgZW5jb2RlQnVmID0gQnVmZmVyJDQuYWxsb2MoNjU1MzYsIGljb252LmRlZmF1bHRDaGFyU2luZ2xlQnl0ZS5jaGFyQ29kZUF0KDApKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVjT3B0aW9ucy5jaGFycy5sZW5ndGg7IGkrKykge1xuICAgIGVuY29kZUJ1Zltjb2RlY09wdGlvbnMuY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpO1xuICB9XG5cbiAgdGhpcy5lbmNvZGVCdWYgPSBlbmNvZGVCdWY7XG59XG5cblNCQ1NDb2RlYy5wcm90b3R5cGUuZW5jb2RlciA9IFNCQ1NFbmNvZGVyO1xuU0JDU0NvZGVjLnByb3RvdHlwZS5kZWNvZGVyID0gU0JDU0RlY29kZXI7XG5cbmZ1bmN0aW9uIFNCQ1NFbmNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIHRoaXMuZW5jb2RlQnVmID0gY29kZWMuZW5jb2RlQnVmO1xufVxuXG5TQkNTRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBidWYgPSBCdWZmZXIkNC5hbGxvYyhzdHIubGVuZ3RoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGJ1ZltpXSA9IHRoaXMuZW5jb2RlQnVmW3N0ci5jaGFyQ29kZUF0KGkpXTtcbiAgfVxuXG4gIHJldHVybiBidWY7XG59O1xuXG5TQkNTRW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge307XG5cbmZ1bmN0aW9uIFNCQ1NEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIHRoaXMuZGVjb2RlQnVmID0gY29kZWMuZGVjb2RlQnVmO1xufVxuXG5TQkNTRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIC8vIFN0cmluZ3MgYXJlIGltbXV0YWJsZSBpbiBKUyAtPiB3ZSB1c2UgdWNzMiBidWZmZXIgdG8gc3BlZWQgdXAgY29tcHV0YXRpb25zLlxuICB2YXIgZGVjb2RlQnVmID0gdGhpcy5kZWNvZGVCdWY7XG4gIHZhciBuZXdCdWYgPSBCdWZmZXIkNC5hbGxvYyhidWYubGVuZ3RoICogMik7XG4gIHZhciBpZHgxID0gMCxcbiAgICAgIGlkeDIgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgaWR4MSA9IGJ1ZltpXSAqIDI7XG4gICAgaWR4MiA9IGkgKiAyO1xuICAgIG5ld0J1ZltpZHgyXSA9IGRlY29kZUJ1ZltpZHgxXTtcbiAgICBuZXdCdWZbaWR4MiArIDFdID0gZGVjb2RlQnVmW2lkeDEgKyAxXTtcbiAgfVxuXG4gIHJldHVybiBuZXdCdWYudG9TdHJpbmcoJ3VjczInKTtcbn07XG5cblNCQ1NEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIHNiY3NDb2RlYyA9IHtcbiAgX3NiY3M6IF9zYmNzXG59O1xuXG52YXIgc2Jjc0RhdGEgPSB7XG4gIC8vIE5vdCBzdXBwb3J0ZWQgYnkgaWNvbnYsIG5vdCBzdXJlIHdoeS5cbiAgXCIxMDAyOVwiOiBcIm1hY2NlbnRldXJvXCIsXG4gIFwibWFjY2VudGV1cm9cIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOExIDEgcOJxITDlsOcw6HEhcSMw6TEjcSGxIfDqcW5xbrEjsOtxI/EksSTxJbDs8SXw7TDtsO1w7rEmsSbw7zigKDCsMSYwqPCp+KAosK2w5/CrsKp4oSixJnCqOKJoMSjxK7Er8Sq4omk4omlxKvEtuKIguKIkcWCxLvEvMS9xL7EucS6xYXFhsWDwqziiJrFhMWH4oiGwqvCu+KApsKgxYjFkMOVxZHFjOKAk+KAlOKAnOKAneKAmOKAmcO34peKxY3FlMWVxZjigLnigLrFmcWWxZfFoOKAmuKAnsWhxZrFm8OBxaTFpcONxb3FvsWqw5PDlMWrxa7DmsWvxbDFscWyxbPDncO9xLfFu8WBxbzEosuHXCJcbiAgfSxcbiAgXCI4MDhcIjogXCJjcDgwOFwiLFxuICBcImlibTgwOFwiOiBcImNwODA4XCIsXG4gIFwiY3A4MDhcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItCQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgNGA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP0IHRkdCE0ZTQh9GX0I7RnsKw4oiZwrfiiJrihJbigqzilqDCoFwiXG4gIH0sXG4gIFwibWlrXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLQkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj+KUlOKUtOKUrOKUnOKUgOKUvOKVo+KVkeKVmuKVlOKVqeKVpuKVoOKVkOKVrOKUkOKWkeKWkuKWk+KUguKUpOKElsKn4pWX4pWd4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoFwiXG4gIH0sXG4gIC8vIEFsaWFzZXMgb2YgZ2VuZXJhdGVkIGVuY29kaW5ncy5cbiAgXCJhc2NpaThiaXRcIjogXCJhc2NpaVwiLFxuICBcInVzYXNjaWlcIjogXCJhc2NpaVwiLFxuICBcImFuc2l4MzRcIjogXCJhc2NpaVwiLFxuICBcImFuc2l4MzQxOTY4XCI6IFwiYXNjaWlcIixcbiAgXCJhbnNpeDM0MTk4NlwiOiBcImFzY2lpXCIsXG4gIFwiY3Nhc2NpaVwiOiBcImFzY2lpXCIsXG4gIFwiY3AzNjdcIjogXCJhc2NpaVwiLFxuICBcImlibTM2N1wiOiBcImFzY2lpXCIsXG4gIFwiaXNvaXI2XCI6IFwiYXNjaWlcIixcbiAgXCJpc282NDZ1c1wiOiBcImFzY2lpXCIsXG4gIFwiaXNvNjQ2aXJ2XCI6IFwiYXNjaWlcIixcbiAgXCJ1c1wiOiBcImFzY2lpXCIsXG4gIFwibGF0aW4xXCI6IFwiaXNvODg1OTFcIixcbiAgXCJsYXRpbjJcIjogXCJpc284ODU5MlwiLFxuICBcImxhdGluM1wiOiBcImlzbzg4NTkzXCIsXG4gIFwibGF0aW40XCI6IFwiaXNvODg1OTRcIixcbiAgXCJsYXRpbjVcIjogXCJpc284ODU5OVwiLFxuICBcImxhdGluNlwiOiBcImlzbzg4NTkxMFwiLFxuICBcImxhdGluN1wiOiBcImlzbzg4NTkxM1wiLFxuICBcImxhdGluOFwiOiBcImlzbzg4NTkxNFwiLFxuICBcImxhdGluOVwiOiBcImlzbzg4NTkxNVwiLFxuICBcImxhdGluMTBcIjogXCJpc284ODU5MTZcIixcbiAgXCJjc2lzb2xhdGluMVwiOiBcImlzbzg4NTkxXCIsXG4gIFwiY3Npc29sYXRpbjJcIjogXCJpc284ODU5MlwiLFxuICBcImNzaXNvbGF0aW4zXCI6IFwiaXNvODg1OTNcIixcbiAgXCJjc2lzb2xhdGluNFwiOiBcImlzbzg4NTk0XCIsXG4gIFwiY3Npc29sYXRpbmN5cmlsbGljXCI6IFwiaXNvODg1OTVcIixcbiAgXCJjc2lzb2xhdGluYXJhYmljXCI6IFwiaXNvODg1OTZcIixcbiAgXCJjc2lzb2xhdGluZ3JlZWtcIjogXCJpc284ODU5N1wiLFxuICBcImNzaXNvbGF0aW5oZWJyZXdcIjogXCJpc284ODU5OFwiLFxuICBcImNzaXNvbGF0aW41XCI6IFwiaXNvODg1OTlcIixcbiAgXCJjc2lzb2xhdGluNlwiOiBcImlzbzg4NTkxMFwiLFxuICBcImwxXCI6IFwiaXNvODg1OTFcIixcbiAgXCJsMlwiOiBcImlzbzg4NTkyXCIsXG4gIFwibDNcIjogXCJpc284ODU5M1wiLFxuICBcImw0XCI6IFwiaXNvODg1OTRcIixcbiAgXCJsNVwiOiBcImlzbzg4NTk5XCIsXG4gIFwibDZcIjogXCJpc284ODU5MTBcIixcbiAgXCJsN1wiOiBcImlzbzg4NTkxM1wiLFxuICBcImw4XCI6IFwiaXNvODg1OTE0XCIsXG4gIFwibDlcIjogXCJpc284ODU5MTVcIixcbiAgXCJsMTBcIjogXCJpc284ODU5MTZcIixcbiAgXCJpc29pcjE0XCI6IFwiaXNvNjQ2anBcIixcbiAgXCJpc29pcjU3XCI6IFwiaXNvNjQ2Y25cIixcbiAgXCJpc29pcjEwMFwiOiBcImlzbzg4NTkxXCIsXG4gIFwiaXNvaXIxMDFcIjogXCJpc284ODU5MlwiLFxuICBcImlzb2lyMTA5XCI6IFwiaXNvODg1OTNcIixcbiAgXCJpc29pcjExMFwiOiBcImlzbzg4NTk0XCIsXG4gIFwiaXNvaXIxNDRcIjogXCJpc284ODU5NVwiLFxuICBcImlzb2lyMTI3XCI6IFwiaXNvODg1OTZcIixcbiAgXCJpc29pcjEyNlwiOiBcImlzbzg4NTk3XCIsXG4gIFwiaXNvaXIxMzhcIjogXCJpc284ODU5OFwiLFxuICBcImlzb2lyMTQ4XCI6IFwiaXNvODg1OTlcIixcbiAgXCJpc29pcjE1N1wiOiBcImlzbzg4NTkxMFwiLFxuICBcImlzb2lyMTY2XCI6IFwidGlzNjIwXCIsXG4gIFwiaXNvaXIxNzlcIjogXCJpc284ODU5MTNcIixcbiAgXCJpc29pcjE5OVwiOiBcImlzbzg4NTkxNFwiLFxuICBcImlzb2lyMjAzXCI6IFwiaXNvODg1OTE1XCIsXG4gIFwiaXNvaXIyMjZcIjogXCJpc284ODU5MTZcIixcbiAgXCJjcDgxOVwiOiBcImlzbzg4NTkxXCIsXG4gIFwiaWJtODE5XCI6IFwiaXNvODg1OTFcIixcbiAgXCJjeXJpbGxpY1wiOiBcImlzbzg4NTk1XCIsXG4gIFwiYXJhYmljXCI6IFwiaXNvODg1OTZcIixcbiAgXCJhcmFiaWM4XCI6IFwiaXNvODg1OTZcIixcbiAgXCJlY21hMTE0XCI6IFwiaXNvODg1OTZcIixcbiAgXCJhc21vNzA4XCI6IFwiaXNvODg1OTZcIixcbiAgXCJncmVla1wiOiBcImlzbzg4NTk3XCIsXG4gIFwiZ3JlZWs4XCI6IFwiaXNvODg1OTdcIixcbiAgXCJlY21hMTE4XCI6IFwiaXNvODg1OTdcIixcbiAgXCJlbG90OTI4XCI6IFwiaXNvODg1OTdcIixcbiAgXCJoZWJyZXdcIjogXCJpc284ODU5OFwiLFxuICBcImhlYnJldzhcIjogXCJpc284ODU5OFwiLFxuICBcInR1cmtpc2hcIjogXCJpc284ODU5OVwiLFxuICBcInR1cmtpc2g4XCI6IFwiaXNvODg1OTlcIixcbiAgXCJ0aGFpXCI6IFwiaXNvODg1OTExXCIsXG4gIFwidGhhaThcIjogXCJpc284ODU5MTFcIixcbiAgXCJjZWx0aWNcIjogXCJpc284ODU5MTRcIixcbiAgXCJjZWx0aWM4XCI6IFwiaXNvODg1OTE0XCIsXG4gIFwiaXNvY2VsdGljXCI6IFwiaXNvODg1OTE0XCIsXG4gIFwidGlzNjIwMFwiOiBcInRpczYyMFwiLFxuICBcInRpczYyMDI1MjkxXCI6IFwidGlzNjIwXCIsXG4gIFwidGlzNjIwMjUzMzBcIjogXCJ0aXM2MjBcIixcbiAgXCIxMDAwMFwiOiBcIm1hY3JvbWFuXCIsXG4gIFwiMTAwMDZcIjogXCJtYWNncmVla1wiLFxuICBcIjEwMDA3XCI6IFwibWFjY3lyaWxsaWNcIixcbiAgXCIxMDA3OVwiOiBcIm1hY2ljZWxhbmRcIixcbiAgXCIxMDA4MVwiOiBcIm1hY3R1cmtpc2hcIixcbiAgXCJjc3BjOGNvZGVwYWdlNDM3XCI6IFwiY3A0MzdcIixcbiAgXCJjc3BjNzc1YmFsdGljXCI6IFwiY3A3NzVcIixcbiAgXCJjc3BjODUwbXVsdGlsaW5ndWFsXCI6IFwiY3A4NTBcIixcbiAgXCJjc3BjcDg1MlwiOiBcImNwODUyXCIsXG4gIFwiY3NwYzg2MmxhdGluaGVicmV3XCI6IFwiY3A4NjJcIixcbiAgXCJjcGdyXCI6IFwiY3A4NjlcIixcbiAgXCJtc2VlXCI6IFwiY3AxMjUwXCIsXG4gIFwibXNjeXJsXCI6IFwiY3AxMjUxXCIsXG4gIFwibXNhbnNpXCI6IFwiY3AxMjUyXCIsXG4gIFwibXNncmVla1wiOiBcImNwMTI1M1wiLFxuICBcIm1zdHVya1wiOiBcImNwMTI1NFwiLFxuICBcIm1zaGViclwiOiBcImNwMTI1NVwiLFxuICBcIm1zYXJhYlwiOiBcImNwMTI1NlwiLFxuICBcIndpbmJhbHRyaW1cIjogXCJjcDEyNTdcIixcbiAgXCJjcDIwODY2XCI6IFwia29pOHJcIixcbiAgXCIyMDg2NlwiOiBcImtvaThyXCIsXG4gIFwiaWJtODc4XCI6IFwia29pOHJcIixcbiAgXCJjc2tvaThyXCI6IFwia29pOHJcIixcbiAgXCJjcDIxODY2XCI6IFwia29pOHVcIixcbiAgXCIyMTg2NlwiOiBcImtvaTh1XCIsXG4gIFwiaWJtMTE2OFwiOiBcImtvaTh1XCIsXG4gIFwic3RyazEwNDgyMDAyXCI6IFwicmsxMDQ4XCIsXG4gIFwidGN2bjU3MTJcIjogXCJ0Y3ZuXCIsXG4gIFwidGN2bjU3MTIxXCI6IFwidGN2blwiLFxuICBcImdiMTk4ODgwXCI6IFwiaXNvNjQ2Y25cIixcbiAgXCJjblwiOiBcImlzbzY0NmNuXCIsXG4gIFwiY3Npc28xNGppc2M2MjIwcm9cIjogXCJpc282NDZqcFwiLFxuICBcImppc2M2MjIwMTk2OXJvXCI6IFwiaXNvNjQ2anBcIixcbiAgXCJqcFwiOiBcImlzbzY0NmpwXCIsXG4gIFwiY3NocHJvbWFuOFwiOiBcImhwcm9tYW44XCIsXG4gIFwicjhcIjogXCJocHJvbWFuOFwiLFxuICBcInJvbWFuOFwiOiBcImhwcm9tYW44XCIsXG4gIFwieHJvbWFuOFwiOiBcImhwcm9tYW44XCIsXG4gIFwiaWJtMTA1MVwiOiBcImhwcm9tYW44XCIsXG4gIFwibWFjXCI6IFwibWFjaW50b3NoXCIsXG4gIFwiY3NtYWNpbnRvc2hcIjogXCJtYWNpbnRvc2hcIlxufTtcblxudmFyIHNiY3NEYXRhR2VuZXJhdGVkID0ge1xuICBcIjQzN1wiOiBcImNwNDM3XCIsXG4gIFwiNzM3XCI6IFwiY3A3MzdcIixcbiAgXCI3NzVcIjogXCJjcDc3NVwiLFxuICBcIjg1MFwiOiBcImNwODUwXCIsXG4gIFwiODUyXCI6IFwiY3A4NTJcIixcbiAgXCI4NTVcIjogXCJjcDg1NVwiLFxuICBcIjg1NlwiOiBcImNwODU2XCIsXG4gIFwiODU3XCI6IFwiY3A4NTdcIixcbiAgXCI4NThcIjogXCJjcDg1OFwiLFxuICBcIjg2MFwiOiBcImNwODYwXCIsXG4gIFwiODYxXCI6IFwiY3A4NjFcIixcbiAgXCI4NjJcIjogXCJjcDg2MlwiLFxuICBcIjg2M1wiOiBcImNwODYzXCIsXG4gIFwiODY0XCI6IFwiY3A4NjRcIixcbiAgXCI4NjVcIjogXCJjcDg2NVwiLFxuICBcIjg2NlwiOiBcImNwODY2XCIsXG4gIFwiODY5XCI6IFwiY3A4NjlcIixcbiAgXCI4NzRcIjogXCJ3aW5kb3dzODc0XCIsXG4gIFwiOTIyXCI6IFwiY3A5MjJcIixcbiAgXCIxMDQ2XCI6IFwiY3AxMDQ2XCIsXG4gIFwiMTEyNFwiOiBcImNwMTEyNFwiLFxuICBcIjExMjVcIjogXCJjcDExMjVcIixcbiAgXCIxMTI5XCI6IFwiY3AxMTI5XCIsXG4gIFwiMTEzM1wiOiBcImNwMTEzM1wiLFxuICBcIjExNjFcIjogXCJjcDExNjFcIixcbiAgXCIxMTYyXCI6IFwiY3AxMTYyXCIsXG4gIFwiMTE2M1wiOiBcImNwMTE2M1wiLFxuICBcIjEyNTBcIjogXCJ3aW5kb3dzMTI1MFwiLFxuICBcIjEyNTFcIjogXCJ3aW5kb3dzMTI1MVwiLFxuICBcIjEyNTJcIjogXCJ3aW5kb3dzMTI1MlwiLFxuICBcIjEyNTNcIjogXCJ3aW5kb3dzMTI1M1wiLFxuICBcIjEyNTRcIjogXCJ3aW5kb3dzMTI1NFwiLFxuICBcIjEyNTVcIjogXCJ3aW5kb3dzMTI1NVwiLFxuICBcIjEyNTZcIjogXCJ3aW5kb3dzMTI1NlwiLFxuICBcIjEyNTdcIjogXCJ3aW5kb3dzMTI1N1wiLFxuICBcIjEyNThcIjogXCJ3aW5kb3dzMTI1OFwiLFxuICBcIjI4NTkxXCI6IFwiaXNvODg1OTFcIixcbiAgXCIyODU5MlwiOiBcImlzbzg4NTkyXCIsXG4gIFwiMjg1OTNcIjogXCJpc284ODU5M1wiLFxuICBcIjI4NTk0XCI6IFwiaXNvODg1OTRcIixcbiAgXCIyODU5NVwiOiBcImlzbzg4NTk1XCIsXG4gIFwiMjg1OTZcIjogXCJpc284ODU5NlwiLFxuICBcIjI4NTk3XCI6IFwiaXNvODg1OTdcIixcbiAgXCIyODU5OFwiOiBcImlzbzg4NTk4XCIsXG4gIFwiMjg1OTlcIjogXCJpc284ODU5OVwiLFxuICBcIjI4NjAwXCI6IFwiaXNvODg1OTEwXCIsXG4gIFwiMjg2MDFcIjogXCJpc284ODU5MTFcIixcbiAgXCIyODYwM1wiOiBcImlzbzg4NTkxM1wiLFxuICBcIjI4NjA0XCI6IFwiaXNvODg1OTE0XCIsXG4gIFwiMjg2MDVcIjogXCJpc284ODU5MTVcIixcbiAgXCIyODYwNlwiOiBcImlzbzg4NTkxNlwiLFxuICBcIndpbmRvd3M4NzRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKCrO+/ve+/ve+/ve+/veKApu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKAmOKAmeKAnOKAneKAouKAk+KAlO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vcKg4LiB4LiC4LiD4LiE4LiF4LiG4LiH4LiI4LiJ4LiK4LiL4LiM4LiN4LiO4LiP4LiQ4LiR4LiS4LiT4LiU4LiV4LiW4LiX4LiY4LiZ4Lia4Lib4Lic4Lid4Lie4Lif4Lig4Lih4Lii4Lij4Lik4Lil4Lim4Lin4Lio4Lip4Liq4Lir4Lis4Lit4Liu4Liv4Liw4Lix4Liy4Liz4Li04Li14Li24Li34Li44Li54Li677+977+977+977+94Li/4LmA4LmB4LmC4LmD4LmE4LmF4LmG4LmH4LmI4LmJ4LmK4LmL4LmM4LmN4LmO4LmP4LmQ4LmR4LmS4LmT4LmU4LmV4LmW4LmX4LmY4LmZ4Lma4Lmb77+977+977+977+9XCJcbiAgfSxcbiAgXCJ3aW44NzRcIjogXCJ3aW5kb3dzODc0XCIsXG4gIFwiY3A4NzRcIjogXCJ3aW5kb3dzODc0XCIsXG4gIFwid2luZG93czEyNTBcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKCrO+/veKAmu+/veKAnuKApuKAoOKAoe+/veKAsMWg4oC5xZrFpMW9xbnvv73igJjigJnigJzigJ3igKLigJPigJTvv73ihKLFoeKAusWbxaXFvsW6wqDLh8uYxYHCpMSEwqbCp8KowqnFnsKrwqzCrcKuxbvCsMKxy5vFgsK0wrXCtsK3wrjEhcWfwrvEvcudxL7FvMWUw4HDgsSCw4TEucSGw4fEjMOJxJjDi8Saw43DjsSOxJDFg8WHw5PDlMWQw5bDl8WYxa7DmsWww5zDncWiw5/FlcOhw6LEg8OkxLrEh8OnxI3DqcSZw6vEm8Otw67Ej8SRxYTFiMOzw7TFkcO2w7fFmcWvw7rFscO8w73Fo8uZXCJcbiAgfSxcbiAgXCJ3aW4xMjUwXCI6IFwid2luZG93czEyNTBcIixcbiAgXCJjcDEyNTBcIjogXCJ3aW5kb3dzMTI1MFwiLFxuICBcIndpbmRvd3MxMjUxXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLQgtCD4oCa0ZPigJ7igKbigKDigKHigqzigLDQieKAudCK0IzQi9CP0ZLigJjigJnigJzigJ3igKLigJPigJTvv73ihKLRmeKAutGa0ZzRm9GfwqDQjtGe0IjCpNKQwqbCp9CBwqnQhMKrwqzCrcKu0IfCsMKx0IbRltKRwrXCtsK30ZHihJbRlMK70ZjQhdGV0ZfQkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj1wiXG4gIH0sXG4gIFwid2luMTI1MVwiOiBcIndpbmRvd3MxMjUxXCIsXG4gIFwiY3AxMjUxXCI6IFwid2luZG93czEyNTFcIixcbiAgXCJ3aW5kb3dzMTI1MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs77+94oCaxpLigJ7igKbigKDigKHLhuKAsMWg4oC5xZLvv73Fve+/ve+/veKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSixaHigLrFk++/vcW+xbjCoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcO+w79cIlxuICB9LFxuICBcIndpbjEyNTJcIjogXCJ3aW5kb3dzMTI1MlwiLFxuICBcImNwMTI1MlwiOiBcIndpbmRvd3MxMjUyXCIsXG4gIFwid2luZG93czEyNTNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKCrO+/veKAmsaS4oCe4oCm4oCg4oCh77+94oCw77+94oC577+977+977+977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCU77+94oSi77+94oC677+977+977+977+9wqDOhc6GwqPCpMKlwqbCp8Kowqnvv73Cq8Kswq3CruKAlcKwwrHCssKzzoTCtcK2wrfOiM6JzorCu86Mwr3Ojs6PzpDOkc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6h77+9zqPOpM6lzqbOp86ozqnOqs6rzqzOrc6uzq/OsM6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPgs+Dz4TPhc+Gz4fPiM+Jz4rPi8+Mz43Pju+/vVwiXG4gIH0sXG4gIFwid2luMTI1M1wiOiBcIndpbmRvd3MxMjUzXCIsXG4gIFwiY3AxMjUzXCI6IFwid2luZG93czEyNTNcIixcbiAgXCJ3aW5kb3dzMTI1NFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs77+94oCaxpLigJ7igKbigKDigKHLhuKAsMWg4oC5xZLvv73vv73vv73vv73igJjigJnigJzigJ3igKLigJPigJTLnOKEosWh4oC6xZPvv73vv73FuMKgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8Sew5HDksOTw5TDlcOWw5fDmMOZw5rDm8OcxLDFnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/En8Oxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMSxxZ/Dv1wiXG4gIH0sXG4gIFwid2luMTI1NFwiOiBcIndpbmRvd3MxMjU0XCIsXG4gIFwiY3AxMjU0XCI6IFwid2luZG93czEyNTRcIixcbiAgXCJ3aW5kb3dzMTI1NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs77+94oCaxpLigJ7igKbigKDigKHLhuKAsO+/veKAue+/ve+/ve+/ve+/ve+/veKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSi77+94oC677+977+977+977+9wqDCocKiwqPigqrCpcKmwqfCqMKpw5fCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnDt8K7wrzCvcK+wr/WsNax1rLWs9a01rXWtta31rjWuda61rvWvNa91r7Wv9eA14HXgteD17DXsdey17PXtO+/ve+/ve+/ve+/ve+/ve+/ve+/vdeQ15HXkteT15TXldeW15fXmNeZ15rXm9ec153Xntef16DXodei16PXpNel16bXp9eo16nXqu+/ve+/veKAjuKAj++/vVwiXG4gIH0sXG4gIFwid2luMTI1NVwiOiBcIndpbmRvd3MxMjU1XCIsXG4gIFwiY3AxMjU1XCI6IFwid2luZG93czEyNTVcIixcbiAgXCJ3aW5kb3dzMTI1NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs2b7igJrGkuKAnuKApuKAoOKAocuG4oCw2bnigLnFktqG2pjaiNqv4oCY4oCZ4oCc4oCd4oCi4oCT4oCU2qnihKLakeKAusWT4oCM4oCN2rrCoNiMwqLCo8KkwqXCpsKnwqjCqdq+wqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK52JvCu8K8wr3Cvtif24HYodii2KPYpNil2KbYp9io2KnYqtir2KzYrdiu2K/YsNix2LLYs9i02LXYtsOX2LfYuNi52LrZgNmB2YLZg8Og2YTDotmF2YbZh9mIw6fDqMOpw6rDq9mJ2YrDrsOv2YvZjNmN2Y7DtNmP2ZDDt9mRw7nZksO7w7zigI7igI/bklwiXG4gIH0sXG4gIFwid2luMTI1NlwiOiBcIndpbmRvd3MxMjU2XCIsXG4gIFwiY3AxMjU2XCI6IFwid2luZG93czEyNTZcIixcbiAgXCJ3aW5kb3dzMTI1N1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs77+94oCa77+94oCe4oCm4oCg4oCh77+94oCw77+94oC577+9wqjLh8K477+94oCY4oCZ4oCc4oCd4oCi4oCT4oCU77+94oSi77+94oC677+9wq/Lm++/vcKg77+9wqLCo8Kk77+9wqbCp8OYwqnFlsKrwqzCrcKuw4bCsMKxwrLCs8K0wrXCtsK3w7jCucWXwrvCvMK9wr7DpsSExK7EgMSGw4TDhcSYxJLEjMOJxbnElsSixLbEqsS7xaDFg8WFw5PFjMOVw5bDl8WyxYHFmsWqw5zFu8W9w5/EhcSvxIHEh8Okw6XEmcSTxI3DqcW6xJfEo8S3xKvEvMWhxYTFhsOzxY3DtcO2w7fFs8WCxZvFq8O8xbzFvsuZXCJcbiAgfSxcbiAgXCJ3aW4xMjU3XCI6IFwid2luZG93czEyNTdcIixcbiAgXCJjcDEyNTdcIjogXCJ3aW5kb3dzMTI1N1wiLFxuICBcIndpbmRvd3MxMjU4XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73igJrGkuKAnuKApuKAoOKAocuG4oCw77+94oC5xZLvv73vv73vv73vv73igJjigJnigJzigJ3igKLigJPigJTLnOKEou+/veKAusWT77+977+9xbjCoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCxILDhMOFw4bDh8OIw4nDisOLzIDDjcOOw4/EkMORzInDk8OUxqDDlsOXw5jDmcOaw5vDnMavzIPDn8Ogw6HDosSDw6TDpcOmw6fDqMOpw6rDq8yBw63DrsOvxJHDscyjw7PDtMahw7bDt8O4w7nDusO7w7zGsOKCq8O/XCJcbiAgfSxcbiAgXCJ3aW4xMjU4XCI6IFwid2luZG93czEyNThcIixcbiAgXCJjcDEyNThcIjogXCJ3aW5kb3dzMTI1OFwiLFxuICBcImlzbzg4NTkxXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv8OAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDl8OYw5nDmsObw5zDncOew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73DvsO/XCJcbiAgfSxcbiAgXCJjcDI4NTkxXCI6IFwiaXNvODg1OTFcIixcbiAgXCJpc284ODU5MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgxITLmMWBwqTEvcWawqfCqMWgxZ7FpMW5wq3FvcW7wrDEhcubxYLCtMS+xZvLh8K4xaHFn8WlxbrLncW+xbzFlMOBw4LEgsOExLnEhsOHxIzDicSYw4vEmsONw47EjsSQxYPFh8OTw5TFkMOWw5fFmMWuw5rFsMOcw53FosOfxZXDocOixIPDpMS6xIfDp8SNw6nEmcOrxJvDrcOuxI/EkcWExYjDs8O0xZHDtsO3xZnFr8O6xbHDvMO9xaPLmVwiXG4gIH0sXG4gIFwiY3AyODU5MlwiOiBcImlzbzg4NTkyXCIsXG4gIFwiaXNvODg1OTNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMSmy5jCo8Kk77+9xKTCp8KoxLDFnsSexLTCre+/vcW7wrDEp8KywrPCtMK1xKXCt8K4xLHFn8SfxLXCve+/vcW8w4DDgcOC77+9w4TEisSIw4fDiMOJw4rDi8OMw43DjsOP77+9w5HDksOTw5TEoMOWw5fEnMOZw5rDm8OcxazFnMOfw6DDocOi77+9w6TEi8SJw6fDqMOpw6rDq8Osw63DrsOv77+9w7HDssOzw7TEocO2w7fEncO5w7rDu8O8xa3FncuZXCJcbiAgfSxcbiAgXCJjcDI4NTkzXCI6IFwiaXNvODg1OTNcIixcbiAgXCJpc284ODU5NFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgxITEuMWWwqTEqMS7wqfCqMWgxJLEosWmwq3FvcKvwrDEhcubxZfCtMSpxLzLh8K4xaHEk8SjxafFisW+xYvEgMOBw4LDg8OEw4XDhsSuxIzDicSYw4vElsONw47EqsSQxYXFjMS2w5TDlcOWw5fDmMWyw5rDm8OcxajFqsOfxIHDocOiw6PDpMOlw6bEr8SNw6nEmcOrxJfDrcOuxKvEkcWGxY3Et8O0w7XDtsO3w7jFs8O6w7vDvMWpxavLmVwiXG4gIH0sXG4gIFwiY3AyODU5NFwiOiBcImlzbzg4NTk0XCIsXG4gIFwiaXNvODg1OTVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoNCB0ILQg9CE0IXQhtCH0IjQidCK0IvQjMKt0I7Qj9CQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP4oSW0ZHRktGT0ZTRldGW0ZfRmNGZ0ZrRm9GcwqfRntGfXCJcbiAgfSxcbiAgXCJjcDI4NTk1XCI6IFwiaXNvODg1OTVcIixcbiAgXCJpc284ODU5NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg77+977+977+9wqTvv73vv73vv73vv73vv73vv73vv73YjMKt77+977+977+977+977+977+977+977+977+977+977+977+977+92Jvvv73vv73vv73Yn++/vdih2KLYo9ik2KXYptin2KjYqdiq2KvYrNit2K7Yr9iw2LHYstiz2LTYtdi22LfYuNi52Lrvv73vv73vv73vv73vv73ZgNmB2YLZg9mE2YXZhtmH2YjZidmK2YvZjNmN2Y7Zj9mQ2ZHZku+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiXG4gIH0sXG4gIFwiY3AyODU5NlwiOiBcImlzbzg4NTk2XCIsXG4gIFwiaXNvODg1OTdcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoOKAmOKAmcKj4oKs4oKvwqbCp8KowqnNusKrwqzCre+/veKAlcKwwrHCssKzzoTOhc6GwrfOiM6JzorCu86Mwr3Ojs6PzpDOkc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6h77+9zqPOpM6lzqbOp86ozqnOqs6rzqzOrc6uzq/OsM6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPgs+Dz4TPhc+Gz4fPiM+Jz4rPi8+Mz43Pju+/vVwiXG4gIH0sXG4gIFwiY3AyODU5N1wiOiBcImlzbzg4NTk3XCIsXG4gIFwiaXNvODg1OThcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoO+/vcKiwqPCpMKlwqbCp8KowqnDl8KrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucO3wrvCvMK9wr7vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73igJfXkNeR15LXk9eU15XXlteX15jXmdea15vXnNed157Xn9eg16HXotej16TXpdem16fXqNep16rvv73vv73igI7igI/vv71cIlxuICB9LFxuICBcImNwMjg1OThcIjogXCJpc284ODU5OFwiLFxuICBcImlzbzg4NTk5XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv8OAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPxJ7DkcOSw5PDlMOVw5bDl8OYw5nDmsObw5zEsMWew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Sfw7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8xLHFn8O/XCJcbiAgfSxcbiAgXCJjcDI4NTk5XCI6IFwiaXNvODg1OTlcIixcbiAgXCJpc284ODU5MTBcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMSExJLEosSqxKjEtsKnxLvEkMWgxabFvcKtxarFisKwxIXEk8SjxKvEqcS3wrfEvMSRxaHFp8W+4oCVxavFi8SAw4HDgsODw4TDhcOGxK7EjMOJxJjDi8SWw43DjsOPw5DFhcWMw5PDlMOVw5bFqMOYxbLDmsObw5zDncOew5/EgcOhw6LDo8Okw6XDpsSvxI3DqcSZw6vEl8Otw67Dr8OwxYbFjcOzw7TDtcO2xanDuMWzw7rDu8O8w73DvsS4XCJcbiAgfSxcbiAgXCJjcDI4NjAwXCI6IFwiaXNvODg1OTEwXCIsXG4gIFwiaXNvODg1OTExXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDguIHguILguIPguITguIXguIbguIfguIjguInguIrguIvguIzguI3guI7guI/guJDguJHguJLguJPguJTguJXguJbguJfguJjguJnguJrguJvguJzguJ3guJ7guJ/guKDguKHguKLguKPguKTguKXguKbguKfguKjguKnguKrguKvguKzguK3guK7guK/guLDguLHguLLguLPguLTguLXguLbguLfguLjguLnguLrvv73vv73vv73vv73guL/guYDguYHguYLguYPguYTguYXguYbguYfguYjguYnguYrguYvguYzguY3guY7guY/guZDguZHguZLguZPguZTguZXguZbguZfguZjguZnguZrguZvvv73vv73vv73vv71cIlxuICB9LFxuICBcImNwMjg2MDFcIjogXCJpc284ODU5MTFcIixcbiAgXCJpc284ODU5MTNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoOKAncKiwqPCpOKAnsKmwqfDmMKpxZbCq8Kswq3CrsOGwrDCscKywrPigJzCtcK2wrfDuMK5xZfCu8K8wr3CvsOmxITErsSAxIbDhMOFxJjEksSMw4nFucSWxKLEtsSqxLvFoMWDxYXDk8WMw5XDlsOXxbLFgcWaxarDnMW7xb3Dn8SFxK/EgcSHw6TDpcSZxJPEjcOpxbrEl8SjxLfEq8S8xaHFhMWGw7PFjcO1w7bDt8WzxYLFm8Wrw7zFvMW+4oCZXCJcbiAgfSxcbiAgXCJjcDI4NjAzXCI6IFwiaXNvODg1OTEzXCIsXG4gIFwiaXNvODg1OTE0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDhuILhuIPCo8SKxIvhuIrCp+G6gMKp4bqC4biL4buywq3CrsW44bie4bifxKDEoeG5gOG5gcK24bmW4bqB4bmX4bqD4bmg4buz4bqE4bqF4bmhw4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/FtMORw5LDk8OUw5XDluG5qsOYw5nDmsObw5zDncW2w5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8W1w7HDssOzw7TDtcO24bmrw7jDucO6w7vDvMO9xbfDv1wiXG4gIH0sXG4gIFwiY3AyODYwNFwiOiBcImlzbzg4NTkxNFwiLFxuICBcImlzbzg4NTkxNVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgwqHCosKj4oKswqXFoMKnxaHCqcKqwqvCrMKtwq7Cr8KwwrHCssKzxb3CtcK2wrfFvsK5wrrCu8WSxZPFuMK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcO+w79cIlxuICB9LFxuICBcImNwMjg2MDVcIjogXCJpc284ODU5MTVcIixcbiAgXCJpc284ODU5MTZcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMSExIXFgeKCrOKAnsWgwqfFocKpyJjCq8W5wq3FusW7wrDCscSMxYLFveKAncK2wrfFvsSNyJnCu8WSxZPFuMW8w4DDgcOCxILDhMSGw4bDh8OIw4nDisOLw4zDjcOOw4/EkMWDw5LDk8OUxZDDlsWaxbDDmcOaw5vDnMSYyJrDn8Ogw6HDosSDw6TEh8Omw6fDqMOpw6rDq8Osw63DrsOvxJHFhMOyw7PDtMWRw7bFm8Wxw7nDusO7w7zEmcibw79cIlxuICB9LFxuICBcImNwMjg2MDZcIjogXCJpc284ODU5MTZcIixcbiAgXCJjcDQzN1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDpMOgw6XDp8Oqw6vDqMOvw67DrMOEw4XDicOmw4bDtMO2w7LDu8O5w7/DlsOcwqLCo8Kl4oKnxpLDocOtw7PDusOxw5HCqsK6wr/ijJDCrMK9wrzCocKrwrvilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDOscOfzpPPgM6jz4PCtc+EzqbOmM6pzrTiiJ7Phs614oip4omhwrHiiaXiiaTijKDijKHDt+KJiMKw4oiZwrfiiJrigb/CsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm00MzdcIjogXCJjcDQzN1wiLFxuICBcImNzaWJtNDM3XCI6IFwiY3A0MzdcIixcbiAgXCJjcDczN1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwizpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6pzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4LPhM+Fz4bPh8+I4paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAz4nOrM6tzq7Pis6vz4zPjc+Lz47Ohs6IzonOis6Mzo7Oj8Kx4oml4omkzqrOq8O34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTczN1wiOiBcImNwNzM3XCIsXG4gIFwiY3NpYm03MzdcIjogXCJjcDczN1wiLFxuICBcImNwNzc1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLEhsO8w6nEgcOkxKPDpcSHxYLEk8WWxZfEq8W5w4TDhcOJw6bDhsWNw7bEosKixZrFm8OWw5zDuMKjw5jDl8KkxIDEqsOzxbvFvMW64oCdwqbCqcKuwqzCvcK8xYHCq8K74paR4paS4paT4pSC4pSkxITEjMSYxJbilaPilZHilZfilZ3ErsWg4pSQ4pSU4pS04pSs4pSc4pSA4pS8xbLFquKVmuKVlOKVqeKVpuKVoOKVkOKVrMW9xIXEjcSZxJfEr8WhxbPFq8W+4pSY4pSM4paI4paE4paM4paQ4paAw5PDn8WMxYPDtcOVwrXFhMS2xLfEu8S8xYbEksWF4oCZwq3CseKAnMK+wrbCp8O34oCewrDiiJnCt8K5wrPCsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm03NzVcIjogXCJjcDc3NVwiLFxuICBcImNzaWJtNzc1XCI6IFwiY3A3NzVcIixcbiAgXCJjcDg1MFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDpMOgw6XDp8Oqw6vDqMOvw67DrMOEw4XDicOmw4bDtMO2w7LDu8O5w7/DlsOcw7jCo8OYw5fGksOhw63Ds8O6w7HDkcKqwrrCv8KuwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSkw4HDgsOAwqnilaPilZHilZfilZ3CosKl4pSQ4pSU4pS04pSs4pSc4pSA4pS8w6PDg+KVmuKVlOKVqeKVpuKVoOKVkOKVrMKkw7DDkMOKw4vDiMSxw43DjsOP4pSY4pSM4paI4paEwqbDjOKWgMOTw5/DlMOSw7XDlcK1w77DnsOaw5vDmcO9w53Cr8K0wq3CseKAl8K+wrbCp8O3wrjCsMKowrfCucKzwrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtODUwXCI6IFwiY3A4NTBcIixcbiAgXCJjc2libTg1MFwiOiBcImNwODUwXCIsXG4gIFwiY3A4NTJcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOHw7zDqcOiw6TFr8SHw6fFgsOrxZDFkcOuxbnDhMSGw4nEucS6w7TDtsS9xL7FmsWbw5bDnMWkxaXFgcOXxI3DocOtw7PDusSExIXFvcW+xJjEmcKsxbrEjMWfwqvCu+KWkeKWkuKWk+KUguKUpMOBw4LEmsWe4pWj4pWR4pWX4pWdxbvFvOKUkOKUlOKUtOKUrOKUnOKUgOKUvMSCxIPilZrilZTilanilabilaDilZDilazCpMSRxJDEjsOLxI/Fh8ONw47Em+KUmOKUjOKWiOKWhMWixa7iloDDk8Ofw5TFg8WExYjFoMWhxZTDmsWVxbDDvcOdxaPCtMKty53Lm8uHy5jCp8O3wrjCsMKoy5nFscWYxZnilqDCoFwiXG4gIH0sXG4gIFwiaWJtODUyXCI6IFwiY3A4NTJcIixcbiAgXCJjc2libTg1MlwiOiBcImNwODUyXCIsXG4gIFwiY3A4NTVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItGS0ILRk9CD0ZHQgdGU0ITRldCF0ZbQhtGX0IfRmNCI0ZnQidGa0IrRm9CL0ZzQjNGe0I7Rn9CP0Y7QrtGK0KrQsNCQ0LHQkdGG0KbQtNCU0LXQldGE0KTQs9CTwqvCu+KWkeKWkuKWk+KUguKUpNGF0KXQuNCY4pWj4pWR4pWX4pWd0LnQmeKUkOKUlOKUtOKUrOKUnOKUgOKUvNC60JrilZrilZTilanilabilaDilZDilazCpNC70JvQvNCc0L3QndC+0J7Qv+KUmOKUjOKWiOKWhNCf0Y/iloDQr9GA0KDRgdCh0YLQotGD0KPQttCW0LLQktGM0KzihJbCrdGL0KvQt9CX0YjQqNGN0K3RidCp0YfQp8Kn4pagwqBcIlxuICB9LFxuICBcImlibTg1NVwiOiBcImNwODU1XCIsXG4gIFwiY3NpYm04NTVcIjogXCJjcDg1NVwiLFxuICBcImNwODU2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLXkNeR15LXk9eU15XXlteX15jXmdea15vXnNed157Xn9eg16HXotej16TXpdem16fXqNep16rvv73Co++/vcOX77+977+977+977+977+977+977+977+977+977+9wq7CrMK9wrzvv73Cq8K74paR4paS4paT4pSC4pSk77+977+977+9wqnilaPilZHilZfilZ3CosKl4pSQ4pSU4pS04pSs4pSc4pSA4pS877+977+94pWa4pWU4pWp4pWm4pWg4pWQ4pWswqTvv73vv73vv73vv73vv73vv73vv73vv73vv73ilJjilIzilojiloTCpu+/veKWgO+/ve+/ve+/ve+/ve+/ve+/vcK177+977+977+977+977+977+977+9wq/CtMKtwrHigJfCvsK2wqfDt8K4wrDCqMK3wrnCs8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg1NlwiOiBcImNwODU2XCIsXG4gIFwiY3NpYm04NTZcIjogXCJjcDg1NlwiLFxuICBcImNwODU3XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOkw6DDpcOnw6rDq8Oow6/DrsSxw4TDhcOJw6bDhsO0w7bDssO7w7nEsMOWw5zDuMKjw5jFnsWfw6HDrcOzw7rDscORxJ7En8K/wq7CrMK9wrzCocKrwrvilpHilpLilpPilILilKTDgcOCw4DCqeKVo+KVkeKVl+KVncKiwqXilJDilJTilLTilKzilJzilIDilLzDo8OD4pWa4pWU4pWp4pWm4pWg4pWQ4pWswqTCusKqw4rDi8OI77+9w43DjsOP4pSY4pSM4paI4paEwqbDjOKWgMOTw5/DlMOSw7XDlcK177+9w5fDmsObw5nDrMO/wq/CtMKtwrHvv73CvsK2wqfDt8K4wrDCqMK3wrnCs8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg1N1wiOiBcImNwODU3XCIsXG4gIFwiY3NpYm04NTdcIjogXCJjcDg1N1wiLFxuICBcImNwODU4XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOkw6DDpcOnw6rDq8Oow6/DrsOsw4TDhcOJw6bDhsO0w7bDssO7w7nDv8OWw5zDuMKjw5jDl8aSw6HDrcOzw7rDscORwqrCusK/wq7CrMK9wrzCocKrwrvilpHilpLilpPilILilKTDgcOCw4DCqeKVo+KVkeKVl+KVncKiwqXilJDilJTilLTilKzilJzilIDilLzDo8OD4pWa4pWU4pWp4pWm4pWg4pWQ4pWswqTDsMOQw4rDi8OI4oKsw43DjsOP4pSY4pSM4paI4paEwqbDjOKWgMOTw5/DlMOSw7XDlcK1w77DnsOaw5vDmcO9w53Cr8K0wq3CseKAl8K+wrbCp8O3wrjCsMKowrfCucKzwrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtODU4XCI6IFwiY3A4NThcIixcbiAgXCJjc2libTg1OFwiOiBcImNwODU4XCIsXG4gIFwiY3A4NjBcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOHw7zDqcOiw6PDoMOBw6fDqsOKw6jDjcOUw6zDg8OCw4nDgMOIw7TDtcOyw5rDucOMw5XDnMKiwqPDmeKCp8OTw6HDrcOzw7rDscORwqrCusK/w5LCrMK9wrzCocKrwrvilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDOscOfzpPPgM6jz4PCtc+EzqbOmM6pzrTiiJ7Phs614oip4omhwrHiiaXiiaTijKDijKHDt+KJiMKw4oiZwrfiiJrigb/CsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NjBcIjogXCJjcDg2MFwiLFxuICBcImNzaWJtODYwXCI6IFwiY3A4NjBcIixcbiAgXCJjcDg2MVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDpMOgw6XDp8Oqw6vDqMOQw7DDnsOEw4XDicOmw4bDtMO2w77Du8Odw73DlsOcw7jCo8OY4oKnxpLDocOtw7PDusOBw43Dk8Oawr/ijJDCrMK9wrzCocKrwrvilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDOscOfzpPPgM6jz4PCtc+EzqbOmM6pzrTiiJ7Phs614oip4omhwrHiiaXiiaTijKDijKHDt+KJiMKw4oiZwrfiiJrigb/CsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NjFcIjogXCJjcDg2MVwiLFxuICBcImNzaWJtODYxXCI6IFwiY3A4NjFcIixcbiAgXCJjcDg2MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi15DXkdeS15PXlNeV15bXl9eY15nXmteb15zXndee15/XoNeh16LXo9ek16XXpten16jXqdeqwqLCo8Kl4oKnxpLDocOtw7PDusOxw5HCqsK6wr/ijJDCrMK9wrzCocKrwrvilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDOscOfzpPPgM6jz4PCtc+EzqbOmM6pzrTiiJ7Phs614oip4omhwrHiiaXiiaTijKDijKHDt+KJiMKw4oiZwrfiiJrigb/CsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NjJcIjogXCJjcDg2MlwiLFxuICBcImNzaWJtODYyXCI6IFwiY3A4NjJcIixcbiAgXCJjcDg2M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDgsOgwrbDp8Oqw6vDqMOvw67igJfDgMKnw4nDiMOKw7TDi8OPw7vDucKkw5TDnMKiwqPDmcObxpLCpsK0w7PDusKowrjCs8Kvw47ijJDCrMK9wrzCvsKrwrvilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDOscOfzpPPgM6jz4PCtc+EzqbOmM6pzrTiiJ7Phs614oip4omhwrHiiaXiiaTijKDijKHDt+KJiMKw4oiZwrfiiJrigb/CsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NjNcIjogXCJjcDg2M1wiLFxuICBcImNzaWJtODYzXCI6IFwiY3A4NjNcIixcbiAgXCJjcDg2NFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFwwXFx4MDFcXHgwMlxceDAzXFx4MDRcXHgwNVxceDA2XFx4MDdcXGJcXHRcXG5cXHgwQlxcZlxcclxceDBFXFx4MEZcXHgxMFxceDExXFx4MTJcXHgxM1xceDE0XFx4MTVcXHgxNlxceDE3XFx4MThcXHgxOVxceDFBXFx4MUJcXHgxQ1xceDFEXFx4MUVcXHgxRiAhXFxcIiMkXFx1MDY2QSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+XFx4N0ZcXHhCMFxceEI3XFx1MjIxOVxcdTIyMUFcXHUyNTkyXFx1MjUwMFxcdTI1MDJcXHUyNTNDXFx1MjUyNFxcdTI1MkNcXHUyNTFDXFx1MjUzNFxcdTI1MTBcXHUyNTBDXFx1MjUxNFxcdTI1MThcXHUwM0IyXFx1MjIxRVxcdTAzQzZcXHhCMVxceEJEXFx4QkNcXHUyMjQ4XFx4QUJcXHhCQlxcdUZFRjdcXHVGRUY4XFx1RkZGRFxcdUZGRkRcXHVGRUZCXFx1RkVGQ1xcdUZGRkRcXHhBMFxceEFEXFx1RkU4MlxceEEzXFx4QTRcXHVGRTg0XFx1RkZGRFxcdUZGRkRcXHVGRThFXFx1RkU4RlxcdUZFOTVcXHVGRTk5XFx1MDYwQ1xcdUZFOURcXHVGRUExXFx1RkVBNVxcdTA2NjBcXHUwNjYxXFx1MDY2MlxcdTA2NjNcXHUwNjY0XFx1MDY2NVxcdTA2NjZcXHUwNjY3XFx1MDY2OFxcdTA2NjlcXHVGRUQxXFx1MDYxQlxcdUZFQjFcXHVGRUI1XFx1RkVCOVxcdTA2MUZcXHhBMlxcdUZFODBcXHVGRTgxXFx1RkU4M1xcdUZFODVcXHVGRUNBXFx1RkU4QlxcdUZFOERcXHVGRTkxXFx1RkU5M1xcdUZFOTdcXHVGRTlCXFx1RkU5RlxcdUZFQTNcXHVGRUE3XFx1RkVBOVxcdUZFQUJcXHVGRUFEXFx1RkVBRlxcdUZFQjNcXHVGRUI3XFx1RkVCQlxcdUZFQkZcXHVGRUMxXFx1RkVDNVxcdUZFQ0JcXHVGRUNGXFx4QTZcXHhBQ1xceEY3XFx4RDdcXHVGRUM5XFx1MDY0MFxcdUZFRDNcXHVGRUQ3XFx1RkVEQlxcdUZFREZcXHVGRUUzXFx1RkVFN1xcdUZFRUJcXHVGRUVEXFx1RkVFRlxcdUZFRjNcXHVGRUJEXFx1RkVDQ1xcdUZFQ0VcXHVGRUNEXFx1RkVFMVxcdUZFN0RcXHUwNjUxXFx1RkVFNVxcdUZFRTlcXHVGRUVDXFx1RkVGMFxcdUZFRjJcXHVGRUQwXFx1RkVENVxcdUZFRjVcXHVGRUY2XFx1RkVERFxcdUZFRDlcXHVGRUYxXFx1MjVBMFxcdUZGRkRcIlxuICB9LFxuICBcImlibTg2NFwiOiBcImNwODY0XCIsXG4gIFwiY3NpYm04NjRcIjogXCJjcDg2NFwiLFxuICBcImNwODY1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOkw6DDpcOnw6rDq8Oow6/DrsOsw4TDhcOJw6bDhsO0w7bDssO7w7nDv8OWw5zDuMKjw5jigqfGksOhw63Ds8O6w7HDkcKqwrrCv+KMkMKswr3CvMKhwqvCpOKWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg2NVwiOiBcImNwODY1XCIsXG4gIFwiY3NpYm04NjVcIjogXCJjcDg2NVwiLFxuICBcImNwODY2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLQkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/ilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDRgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj9CB0ZHQhNGU0IfRl9CO0Z7CsOKImcK34oia4oSWwqTilqDCoFwiXG4gIH0sXG4gIFwiaWJtODY2XCI6IFwiY3A4NjZcIixcbiAgXCJjc2libTg2NlwiOiBcImNwODY2XCIsXG4gIFwiY3A4NjlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIu+/ve+/ve+/ve+/ve+/ve+/vc6G77+9wrfCrMKm4oCY4oCZzojigJXOic6KzqrOjO+/ve+/vc6OzqvCqc6PwrLCs86swqPOrc6uzq/Pis6Qz4zPjc6RzpLOk86UzpXOls6Xwr3OmM6ZwqvCu+KWkeKWkuKWk+KUguKUpM6azpvOnM6d4pWj4pWR4pWX4pWdzp7On+KUkOKUlOKUtOKUrOKUnOKUgOKUvM6gzqHilZrilZTilanilabilaDilZDilazOo86kzqXOps6nzqjOqc6xzrLOs+KUmOKUjOKWiOKWhM60zrXiloDOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPg8+Cz4TOhMKtwrHPhc+Gz4fCp8+IzoXCsMKoz4nPi86wz47ilqDCoFwiXG4gIH0sXG4gIFwiaWJtODY5XCI6IFwiY3A4NjlcIixcbiAgXCJjc2libTg2OVwiOiBcImNwODY5XCIsXG4gIFwiY3A5MjJcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7igL7CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv8OAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPxaDDkcOSw5PDlMOVw5bDl8OYw5nDmsObw5zDncW9w5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Whw7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73FvsO/XCJcbiAgfSxcbiAgXCJpYm05MjJcIjogXCJjcDkyMlwiLFxuICBcImNzaWJtOTIyXCI6IFwiY3A5MjJcIixcbiAgXCJjcDEwNDZcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIu+6iMOXw7fvo7bvo7Xvo7Tvo7fvubHCiOKWoOKUguKUgOKUkOKUjOKUlOKUmO+5ue+5u++5ve+5v++5t++6iu+7sO+7s++7su+7ju+7j++7kO+7tu+7uO+7uu+7vMKg76O676O576O4wqTvo7vvuovvupHvupfvupvvup/vuqPYjMKt77qn77qz2aDZodmi2aPZpNml2abZp9mo2anvurfYm++6u++6v++7itif77uL2KHYotij2KTYpdim2KfYqNip2KrYq9is2K3Yrtiv2LDYsdiy2LPYtNi12LbYt++7h9i52Lrvu4zvuoLvuoTvuo7vu5PZgNmB2YLZg9mE2YXZhtmH2YjZidmK2YvZjNmN2Y7Zj9mQ2ZHZku+7l++7m++7n++jvO+7te+7t++7ue+7u++7o++7p++7rO+7qe+/vVwiXG4gIH0sXG4gIFwiaWJtMTA0NlwiOiBcImNwMTA0NlwiLFxuICBcImNzaWJtMTA0NlwiOiBcImNwMTA0NlwiLFxuICBcImNwMTEyNFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg0IHQgtKQ0ITQhdCG0IfQiNCJ0IrQi9CMwq3QjtCP0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/ihJbRkdGS0pHRlNGV0ZbRl9GY0ZnRmtGb0ZzCp9Ge0Z9cIlxuICB9LFxuICBcImlibTExMjRcIjogXCJjcDExMjRcIixcbiAgXCJjc2libTExMjRcIjogXCJjcDExMjRcIixcbiAgXCJjcDExMjVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItCQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgNGA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP0IHRkdKQ0pHQhNGU0IbRltCH0ZfCt+KImuKElsKk4pagwqBcIlxuICB9LFxuICBcImlibTExMjVcIjogXCJjcDExMjVcIixcbiAgXCJjc2libTExMjVcIjogXCJjcDExMjVcIixcbiAgXCJjcDExMjlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMKhwqLCo8KkwqXCpsKnxZPCqcKqwqvCrMKtwq7Cr8KwwrHCssKzxbjCtcK2wrfFksK5wrrCu8K8wr3CvsK/w4DDgcOCxILDhMOFw4bDh8OIw4nDisOLzIDDjcOOw4/EkMORzInDk8OUxqDDlsOXw5jDmcOaw5vDnMavzIPDn8Ogw6HDosSDw6TDpcOmw6fDqMOpw6rDq8yBw63DrsOvxJHDscyjw7PDtMahw7bDt8O4w7nDusO7w7zGsOKCq8O/XCJcbiAgfSxcbiAgXCJpYm0xMTI5XCI6IFwiY3AxMTI5XCIsXG4gIFwiY3NpYm0xMTI5XCI6IFwiY3AxMTI5XCIsXG4gIFwiY3AxMTMzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDguoHguoLguoTguofguojguqrguorguo3gupTgupXgupbgupfgupnguprgupvgupzgup3gup7gup/guqHguqLguqPguqXguqfguqvguq3guq7vv73vv73vv73guq/gurDgurLgurPgurTgurXgurbgurfgurjgurngurzgurHgurvgur3vv73vv73vv73gu4Dgu4Hgu4Lgu4Pgu4Tgu4jgu4ngu4rgu4vgu4zgu43gu4bvv73gu5zgu53igq3vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73gu5Dgu5Hgu5Lgu5Pgu5Tgu5Xgu5bgu5fgu5jgu5nvv73vv73CosKswqbvv71cIlxuICB9LFxuICBcImlibTExMzNcIjogXCJjcDExMzNcIixcbiAgXCJjc2libTExMzNcIjogXCJjcDExMzNcIixcbiAgXCJjcDExNjFcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veC5iOC4geC4guC4g+C4hOC4heC4huC4h+C4iOC4ieC4iuC4i+C4jOC4jeC4juC4j+C4kOC4keC4kuC4k+C4lOC4leC4luC4l+C4mOC4meC4muC4m+C4nOC4neC4nuC4n+C4oOC4oeC4ouC4o+C4pOC4peC4puC4p+C4qOC4qeC4quC4q+C4rOC4reC4ruC4r+C4sOC4seC4suC4s+C4tOC4teC4tuC4t+C4uOC4ueC4uuC5ieC5iuC5i+KCrOC4v+C5gOC5geC5guC5g+C5hOC5heC5huC5h+C5iOC5ieC5iuC5i+C5jOC5jeC5juC5j+C5kOC5keC5kuC5k+C5lOC5leC5luC5l+C5mOC5meC5muC5m8KiwqzCpsKgXCJcbiAgfSxcbiAgXCJpYm0xMTYxXCI6IFwiY3AxMTYxXCIsXG4gIFwiY3NpYm0xMTYxXCI6IFwiY3AxMTYxXCIsXG4gIFwiY3AxMTYyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzCgcKCwoPChOKApsKGwofCiMKJworCi8KMwo3CjsKPwpDigJjigJnigJzigJ3igKLigJPigJTCmMKZwprCm8Kcwp3CnsKfwqDguIHguILguIPguITguIXguIbguIfguIjguInguIrguIvguIzguI3guI7guI/guJDguJHguJLguJPguJTguJXguJbguJfguJjguJnguJrguJvguJzguJ3guJ7guJ/guKDguKHguKLguKPguKTguKXguKbguKfguKjguKnguKrguKvguKzguK3guK7guK/guLDguLHguLLguLPguLTguLXguLbguLfguLjguLnguLrvv73vv73vv73vv73guL/guYDguYHguYLguYPguYTguYXguYbguYfguYjguYnguYrguYvguYzguY3guY7guY/guZDguZHguZLguZPguZTguZXguZbguZfguZjguZnguZrguZvvv73vv73vv73vv71cIlxuICB9LFxuICBcImlibTExNjJcIjogXCJjcDExNjJcIixcbiAgXCJjc2libTExNjJcIjogXCJjcDExNjJcIixcbiAgXCJjcDExNjNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMKhwqLCo+KCrMKlwqbCp8WTwqnCqsKrwqzCrcKuwq/CsMKxwrLCs8W4wrXCtsK3xZLCucK6wrvCvMK9wr7Cv8OAw4HDgsSCw4TDhcOGw4fDiMOJw4rDi8yAw43DjsOPxJDDkcyJw5PDlMagw5bDl8OYw5nDmsObw5zGr8yDw5/DoMOhw6LEg8Okw6XDpsOnw6jDqcOqw6vMgcOtw67Dr8SRw7HMo8Ozw7TGocO2w7fDuMO5w7rDu8O8xrDigqvDv1wiXG4gIH0sXG4gIFwiaWJtMTE2M1wiOiBcImNwMTE2M1wiLFxuICBcImNzaWJtMTE2M1wiOiBcImNwMTE2M1wiLFxuICBcIm1hY2Nyb2F0aWFuXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDhMOFw4fDicORw5bDnMOhw6DDosOkw6PDpcOnw6nDqMOqw6vDrcOsw67Dr8Oxw7PDssO0w7bDtcO6w7nDu8O84oCgwrDCosKjwqfigKLCtsOfwq7FoOKEosK0wqjiiaDFvcOY4oiewrHiiaTiiaXiiIbCteKIguKIkeKIj8Wh4oirwqrCuuKEpsW+w7jCv8KhwqziiJrGkuKJiMSGwqvEjOKApsKgw4DDg8OVxZLFk8SQ4oCU4oCc4oCd4oCY4oCZw7fil4rvv73CqeKBhMKk4oC54oC6w4bCu+KAk8K34oCa4oCe4oCww4LEh8OBxI3DiMONw47Dj8OMw5PDlMSRw5LDmsObw5nEscuGy5zCr8+Aw4vLmsK4w4rDpsuHXCJcbiAgfSxcbiAgXCJtYWNjeXJpbGxpY1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr+KAoMKwwqLCo8Kn4oCiwrbQhsKuwqnihKLQgtGS4omg0IPRk+KInsKx4omk4oml0ZbCteKIgtCI0ITRlNCH0ZfQidGZ0IrRmtGY0IXCrOKImsaS4omI4oiGwqvCu+KApsKg0IvRm9CM0ZzRleKAk+KAlOKAnOKAneKAmOKAmcO34oCe0I7RntCP0Z/ihJbQgdGR0Y/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjsKkXCJcbiAgfSxcbiAgXCJtYWNncmVla1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4TCucKyw4nCs8OWw5zOhcOgw6LDpM6EwqjDp8Opw6jDqsOrwqPihKLDrsOv4oCiwr3igLDDtMO2wqbCrcO5w7vDvOKAoM6TzpTOmM6bzp7OoMOfwq7Cqc6jzqrCp+KJoMKwzofOkcKx4omk4omlwqXOks6VzpbOl86ZzprOnM6mzqvOqM6pzqzOncKszp/OoeKJiM6kwqvCu+KApsKgzqXOp86GzojFk+KAk+KAleKAnOKAneKAmOKAmcO3zonOis6Mzo7Orc6uzq/PjM6Pz43Osc6yz4jOtM61z4bOs863zrnOvs66zrvOvM69zr/PgM+Oz4HPg8+EzrjPic+Cz4fPhc62z4rPi86QzrDvv71cIlxuICB9LFxuICBcIm1hY2ljZWxhbmRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOEw4XDh8OJw5HDlsOcw6HDoMOiw6TDo8Olw6fDqcOow6rDq8Otw6zDrsOvw7HDs8Oyw7TDtsO1w7rDucO7w7zDncKwwqLCo8Kn4oCiwrbDn8KuwqnihKLCtMKo4omgw4bDmOKInsKx4omk4omlwqXCteKIguKIkeKIj8+A4oirwqrCuuKEpsOmw7jCv8KhwqziiJrGkuKJiOKIhsKrwrvigKbCoMOAw4PDlcWSxZPigJPigJTigJzigJ3igJjigJnDt+KXisO/xbjigYTCpMOQw7DDnsO+w73Ct+KAmuKAnuKAsMOCw4rDgcOLw4jDjcOOw4/DjMOTw5Tvv73DksOaw5vDmcSxy4bLnMKvy5jLmcuawrjLncuby4dcIlxuICB9LFxuICBcIm1hY3JvbWFuXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDhMOFw4fDicORw5bDnMOhw6DDosOkw6PDpcOnw6nDqMOqw6vDrcOsw67Dr8Oxw7PDssO0w7bDtcO6w7nDu8O84oCgwrDCosKjwqfigKLCtsOfwq7CqeKEosK0wqjiiaDDhsOY4oiewrHiiaTiiaXCpcK14oiC4oiR4oiPz4DiiKvCqsK64oSmw6bDuMK/wqHCrOKImsaS4omI4oiGwqvCu+KApsKgw4DDg8OVxZLFk+KAk+KAlOKAnOKAneKAmOKAmcO34peKw7/FuOKBhMKk4oC54oC676yB76yC4oChwrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU77+9w5LDmsObw5nEscuGy5zCr8uYy5nLmsK4y53Lm8uHXCJcbiAgfSxcbiAgXCJtYWNyb21hbmlhXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDhMOFw4fDicORw5bDnMOhw6DDosOkw6PDpcOnw6nDqMOqw6vDrcOsw67Dr8Oxw7PDssO0w7bDtcO6w7nDu8O84oCgwrDCosKjwqfigKLCtsOfwq7CqeKEosK0wqjiiaDEgsWe4oiewrHiiaTiiaXCpcK14oiC4oiR4oiPz4DiiKvCqsK64oSmxIPFn8K/wqHCrOKImsaS4omI4oiGwqvCu+KApsKgw4DDg8OVxZLFk+KAk+KAlOKAnOKAneKAmOKAmcO34peKw7/FuOKBhMKk4oC54oC6xaLFo+KAocK34oCa4oCe4oCww4LDisOBw4vDiMONw47Dj8OMw5PDlO+/vcOSw5rDm8OZxLHLhsucwq/LmMuZy5rCuMudy5vLh1wiXG4gIH0sXG4gIFwibWFjdGhhaVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwqvCu+KApu+ijO+ij++iku+ile+imO+ii++iju+ike+ilO+il+KAnOKAne+ime+/veKAou+ihO+iie+ihe+ihu+ih++iiO+iiu+ije+ikO+ik++iluKAmOKAme+/vcKg4LiB4LiC4LiD4LiE4LiF4LiG4LiH4LiI4LiJ4LiK4LiL4LiM4LiN4LiO4LiP4LiQ4LiR4LiS4LiT4LiU4LiV4LiW4LiX4LiY4LiZ4Lia4Lib4Lic4Lid4Lie4Lif4Lig4Lih4Lii4Lij4Lik4Lil4Lim4Lin4Lio4Lip4Liq4Lir4Lis4Lit4Liu4Liv4Liw4Lix4Liy4Liz4Li04Li14Li24Li34Li44Li54Li677u/4oCL4oCT4oCU4Li/4LmA4LmB4LmC4LmD4LmE4LmF4LmG4LmH4LmI4LmJ4LmK4LmL4LmM4LmN4oSi4LmP4LmQ4LmR4LmS4LmT4LmU4LmV4LmW4LmX4LmY4LmZwq7Cqe+/ve+/ve+/ve+/vVwiXG4gIH0sXG4gIFwibWFjdHVya2lzaFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvOKAoMKwwqLCo8Kn4oCiwrbDn8KuwqnihKLCtMKo4omgw4bDmOKInsKx4omk4omlwqXCteKIguKIkeKIj8+A4oirwqrCuuKEpsOmw7jCv8KhwqziiJrGkuKJiOKIhsKrwrvigKbCoMOAw4PDlcWSxZPigJPigJTigJzigJ3igJjigJnDt+KXisO/xbjEnsSfxLDEscWexZ/igKHCt+KAmuKAnuKAsMOCw4rDgcOLw4jDjcOOw4/DjMOTw5Tvv73DksOaw5vDme+/vcuGy5zCr8uYy5nLmsK4y53Lm8uHXCJcbiAgfSxcbiAgXCJtYWN1a3JhaW5lXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLQkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv4oCgwrDSkMKjwqfigKLCttCGwq7CqeKEotCC0ZLiiaDQg9GT4oiewrHiiaTiiaXRlsK10pHQiNCE0ZTQh9GX0InRmdCK0ZrRmNCFwqziiJrGkuKJiOKIhsKrwrvigKbCoNCL0ZvQjNGc0ZXigJPigJTigJzigJ3igJjigJnDt+KAntCO0Z7Qj9Gf4oSW0IHRkdGP0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7CpFwiXG4gIH0sXG4gIFwia29pOHJcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKUgOKUguKUjOKUkOKUlOKUmOKUnOKUpOKUrOKUtOKUvOKWgOKWhOKWiOKWjOKWkOKWkeKWkuKWk+KMoOKWoOKImeKImuKJiOKJpOKJpcKg4oyhwrDCssK3w7filZDilZHilZLRkeKVk+KVlOKVleKVluKVl+KVmOKVmeKVmuKVm+KVnOKVneKVnuKVn+KVoOKVodCB4pWi4pWj4pWk4pWl4pWm4pWn4pWo4pWp4pWq4pWr4pWswqnRjtCw0LHRhtC00LXRhNCz0YXQuNC50LrQu9C80L3QvtC/0Y/RgNGB0YLRg9C20LLRjNGL0LfRiNGN0YnRh9GK0K7QkNCR0KbQlNCV0KTQk9Cl0JjQmdCa0JvQnNCd0J7Qn9Cv0KDQodCi0KPQltCS0KzQq9CX0KjQrdCp0KfQqlwiXG4gIH0sXG4gIFwia29pOHVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKUgOKUguKUjOKUkOKUlOKUmOKUnOKUpOKUrOKUtOKUvOKWgOKWhOKWiOKWjOKWkOKWkeKWkuKWk+KMoOKWoOKImeKImuKJiOKJpOKJpcKg4oyhwrDCssK3w7filZDilZHilZLRkdGU4pWU0ZbRl+KVl+KVmOKVmeKVmuKVm9KR4pWd4pWe4pWf4pWg4pWh0IHQhOKVo9CG0IfilabilafilajilanilarSkOKVrMKp0Y7QsNCx0YbQtNC10YTQs9GF0LjQudC60LvQvNC90L7Qv9GP0YDRgdGC0YPQttCy0YzRi9C30YjRjdGJ0YfRitCu0JDQkdCm0JTQldCk0JPQpdCY0JnQmtCb0JzQndCe0J/Qr9Cg0KHQotCj0JbQktCs0KvQl9Co0K3QqdCn0KpcIlxuICB9LFxuICBcImtvaThydVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4pSA4pSC4pSM4pSQ4pSU4pSY4pSc4pSk4pSs4pS04pS84paA4paE4paI4paM4paQ4paR4paS4paT4oyg4pag4oiZ4oia4omI4omk4omlwqDijKHCsMKywrfDt+KVkOKVkeKVktGR0ZTilZTRltGX4pWX4pWY4pWZ4pWa4pWb0pHRnuKVnuKVn+KVoOKVodCB0ITilaPQhtCH4pWm4pWn4pWo4pWp4pWq0pDQjsKp0Y7QsNCx0YbQtNC10YTQs9GF0LjQudC60LvQvNC90L7Qv9GP0YDRgdGC0YPQttCy0YzRi9C30YjRjdGJ0YfRitCu0JDQkdCm0JTQldCk0JPQpdCY0JnQmtCb0JzQndCe0J/Qr9Cg0KHQotCj0JbQktCs0KvQl9Co0K3QqdCn0KpcIlxuICB9LFxuICBcImtvaTh0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLSm9KT4oCa0pLigJ7igKbigKDigKHvv73igLDSs+KAudKy0rfStu+/vdKa4oCY4oCZ4oCc4oCd4oCi4oCT4oCU77+94oSi77+94oC677+977+977+977+977+906/TrtGRwqTTo8Kmwqfvv73vv73vv73Cq8Kswq3Cru+/vcKwwrHCstCB77+906LCtsK377+94oSW77+9wrvvv73vv73vv73CqdGO0LDQsdGG0LTQtdGE0LPRhdC40LnQutC70LzQvdC+0L/Rj9GA0YHRgtGD0LbQstGM0YvQt9GI0Y3RidGH0YrQrtCQ0JHQptCU0JXQpNCT0KXQmNCZ0JrQm9Cc0J3QntCf0K/QoNCh0KLQo9CW0JLQrNCr0JfQqNCt0KnQp9CqXCJcbiAgfSxcbiAgXCJhcm1zY2lpOFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg77+91ofWiSkowrvCq+KAlC7VnSwt1origKbVnNWb1Z7UsdWh1LLVotSz1aPUtNWk1LXVpdS21abUt9Wn1LjVqNS51anUutWq1LvVq9S81azUvdWt1L7VrtS/1a/VgNWw1YHVsdWC1bLVg9Wz1YTVtNWF1bXVhtW21YfVt9WI1bjVidW51YrVutWL1bvVjNW81Y3VvdWO1b7Vj9W/1ZDWgNWR1oHVktaC1ZPWg9WU1oTVldaF1ZbWhtWa77+9XCJcbiAgfSxcbiAgXCJyazEwNDhcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItCC0IPigJrRk+KAnuKApuKAoOKAoeKCrOKAsNCJ4oC50IrSmtK60I/RkuKAmOKAmeKAnOKAneKAouKAk+KAlO+/veKEotGZ4oC60ZrSm9K70Z/CoNKw0rHTmMKk06jCpsKn0IHCqdKSwqvCrMKtwq7SrsKwwrHQhtGW06nCtcK2wrfRkeKEltKTwrvTmdKi0qPSr9CQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGPXCJcbiAgfSxcbiAgXCJ0Y3ZuXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXDBcXHhEQVxcdTFFRTRcXHgwM1xcdTFFRUFcXHUxRUVDXFx1MUVFRVxceDA3XFxiXFx0XFxuXFx4MEJcXGZcXHJcXHgwRVxceDBGXFx4MTBcXHUxRUU4XFx1MUVGMFxcdTFFRjJcXHUxRUY2XFx1MUVGOFxceEREXFx1MUVGNFxceDE4XFx4MTlcXHgxQVxceDFCXFx4MUNcXHgxRFxceDFFXFx4MUYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9flxceDdGXFx4QzBcXHUxRUEyXFx4QzNcXHhDMVxcdTFFQTBcXHUxRUI2XFx1MUVBQ1xceEM4XFx1MUVCQVxcdTFFQkNcXHhDOVxcdTFFQjhcXHUxRUM2XFx4Q0NcXHUxRUM4XFx1MDEyOFxceENEXFx1MUVDQVxceEQyXFx1MUVDRVxceEQ1XFx4RDNcXHUxRUNDXFx1MUVEOFxcdTFFRENcXHUxRURFXFx1MUVFMFxcdTFFREFcXHUxRUUyXFx4RDlcXHUxRUU2XFx1MDE2OFxceEEwXFx1MDEwMlxceEMyXFx4Q0FcXHhENFxcdTAxQTBcXHUwMUFGXFx1MDExMFxcdTAxMDNcXHhFMlxceEVBXFx4RjRcXHUwMUExXFx1MDFCMFxcdTAxMTFcXHUxRUIwXFx1MDMwMFxcdTAzMDlcXHUwMzAzXFx1MDMwMVxcdTAzMjNcXHhFMFxcdTFFQTNcXHhFM1xceEUxXFx1MUVBMVxcdTFFQjJcXHUxRUIxXFx1MUVCM1xcdTFFQjVcXHUxRUFGXFx1MUVCNFxcdTFFQUVcXHUxRUE2XFx1MUVBOFxcdTFFQUFcXHUxRUE0XFx1MUVDMFxcdTFFQjdcXHUxRUE3XFx1MUVBOVxcdTFFQUJcXHUxRUE1XFx1MUVBRFxceEU4XFx1MUVDMlxcdTFFQkJcXHUxRUJEXFx4RTlcXHUxRUI5XFx1MUVDMVxcdTFFQzNcXHUxRUM1XFx1MUVCRlxcdTFFQzdcXHhFQ1xcdTFFQzlcXHUxRUM0XFx1MUVCRVxcdTFFRDJcXHUwMTI5XFx4RURcXHUxRUNCXFx4RjJcXHUxRUQ0XFx1MUVDRlxceEY1XFx4RjNcXHUxRUNEXFx1MUVEM1xcdTFFRDVcXHUxRUQ3XFx1MUVEMVxcdTFFRDlcXHUxRUREXFx1MUVERlxcdTFFRTFcXHUxRURCXFx1MUVFM1xceEY5XFx1MUVENlxcdTFFRTdcXHUwMTY5XFx4RkFcXHUxRUU1XFx1MUVFQlxcdTFFRURcXHUxRUVGXFx1MUVFOVxcdTFFRjFcXHUxRUYzXFx1MUVGN1xcdTFFRjlcXHhGRFxcdTFFRjVcXHUxRUQwXCJcbiAgfSxcbiAgXCJnZW9yZ2lhbmFjYWRlbXlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHigJrGkuKAnuKApuKAoOKAocuG4oCwxaDigLnFksKNwo7Cj8KQ4oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLFoeKAusWTwp3CnsW4wqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv+GDkOGDkeGDkuGDk+GDlOGDleGDluGDl+GDmOGDmeGDmuGDm+GDnOGDneGDnuGDn+GDoOGDoeGDouGDo+GDpOGDpeGDpuGDp+GDqOGDqeGDquGDq+GDrOGDreGDruGDr+GDsOGDseGDsuGDs+GDtOGDteGDtsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73DvsO/XCJcbiAgfSxcbiAgXCJnZW9yZ2lhbnBzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKB4oCaxpLigJ7igKbigKDigKHLhuKAsMWg4oC5xZLCjcKOwo/CkOKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSixaHigLrFk8Kdwp7FuMKgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/hg5Dhg5Hhg5Lhg5Phg5Thg5Xhg5bhg7Hhg5fhg5jhg5nhg5rhg5vhg5zhg7Lhg53hg57hg5/hg6Dhg6Hhg6Lhg7Phg6Phg6Thg6Xhg6bhg6fhg6jhg6nhg6rhg6vhg6zhg63hg67hg7Thg6/hg7Dhg7XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73DvsO/XCJcbiAgfSxcbiAgXCJwdDE1NFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0pbSktOu0pPigJ7igKbSttKu0rLSr9Kg06LSotKa0rrSuNKX4oCY4oCZ4oCc4oCd4oCi4oCT4oCU0rPSt9Kh06PSo9Kb0rvSucKg0I7RntCI06jSmNKwwqfQgcKp05jCq8Ks06/CrtKcwrDSsdCG0ZbSmdOpwrbCt9GR4oSW05nCu9GY0qrSq9Kd0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y9cIlxuICB9LFxuICBcInZpc2NpaVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFwwXFx4MDFcXHUxRUIyXFx4MDNcXHgwNFxcdTFFQjRcXHUxRUFBXFx4MDdcXGJcXHRcXG5cXHgwQlxcZlxcclxceDBFXFx4MEZcXHgxMFxceDExXFx4MTJcXHgxM1xcdTFFRjZcXHgxNVxceDE2XFx4MTdcXHgxOFxcdTFFRjhcXHgxQVxceDFCXFx4MUNcXHgxRFxcdTFFRjRcXHgxRiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+XFx4N0ZcXHUxRUEwXFx1MUVBRVxcdTFFQjBcXHUxRUI2XFx1MUVBNFxcdTFFQTZcXHUxRUE4XFx1MUVBQ1xcdTFFQkNcXHUxRUI4XFx1MUVCRVxcdTFFQzBcXHUxRUMyXFx1MUVDNFxcdTFFQzZcXHUxRUQwXFx1MUVEMlxcdTFFRDRcXHUxRUQ2XFx1MUVEOFxcdTFFRTJcXHUxRURBXFx1MUVEQ1xcdTFFREVcXHUxRUNBXFx1MUVDRVxcdTFFQ0NcXHUxRUM4XFx1MUVFNlxcdTAxNjhcXHUxRUU0XFx1MUVGMlxceEQ1XFx1MUVBRlxcdTFFQjFcXHUxRUI3XFx1MUVBNVxcdTFFQTdcXHUxRUE5XFx1MUVBRFxcdTFFQkRcXHUxRUI5XFx1MUVCRlxcdTFFQzFcXHUxRUMzXFx1MUVDNVxcdTFFQzdcXHUxRUQxXFx1MUVEM1xcdTFFRDVcXHUxRUQ3XFx1MUVFMFxcdTAxQTBcXHUxRUQ5XFx1MUVERFxcdTFFREZcXHUxRUNCXFx1MUVGMFxcdTFFRThcXHUxRUVBXFx1MUVFQ1xcdTAxQTFcXHUxRURCXFx1MDFBRlxceEMwXFx4QzFcXHhDMlxceEMzXFx1MUVBMlxcdTAxMDJcXHUxRUIzXFx1MUVCNVxceEM4XFx4QzlcXHhDQVxcdTFFQkFcXHhDQ1xceENEXFx1MDEyOFxcdTFFRjNcXHUwMTEwXFx1MUVFOVxceEQyXFx4RDNcXHhENFxcdTFFQTFcXHUxRUY3XFx1MUVFQlxcdTFFRURcXHhEOVxceERBXFx1MUVGOVxcdTFFRjVcXHhERFxcdTFFRTFcXHUwMUIwXFx4RTBcXHhFMVxceEUyXFx4RTNcXHUxRUEzXFx1MDEwM1xcdTFFRUZcXHUxRUFCXFx4RThcXHhFOVxceEVBXFx1MUVCQlxceEVDXFx4RURcXHUwMTI5XFx1MUVDOVxcdTAxMTFcXHUxRUYxXFx4RjJcXHhGM1xceEY0XFx4RjVcXHUxRUNGXFx1MUVDRFxcdTFFRTVcXHhGOVxceEZBXFx1MDE2OVxcdTFFRTdcXHhGRFxcdTFFRTNcXHUxRUVFXCJcbiAgfSxcbiAgXCJpc282NDZjblwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFwwXFx4MDFcXHgwMlxceDAzXFx4MDRcXHgwNVxceDA2XFx4MDdcXGJcXHRcXG5cXHgwQlxcZlxcclxceDBFXFx4MEZcXHgxMFxceDExXFx4MTJcXHgxM1xceDE0XFx4MTVcXHgxNlxceDE3XFx4MThcXHgxOVxceDFBXFx4MUJcXHgxQ1xceDFEXFx4MUVcXHgxRiAhXFxcIiNcXHhBNSUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9XFx1MjAzRVxceDdGXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcIlxuICB9LFxuICBcImlzbzY0NmpwXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXDBcXHgwMVxceDAyXFx4MDNcXHgwNFxceDA1XFx4MDZcXHgwN1xcYlxcdFxcblxceDBCXFxmXFxyXFx4MEVcXHgwRlxceDEwXFx4MTFcXHgxMlxceDEzXFx4MTRcXHgxNVxceDE2XFx4MTdcXHgxOFxceDE5XFx4MUFcXHgxQlxceDFDXFx4MURcXHgxRVxceDFGICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFx4QTVdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1cXHUyMDNFXFx4N0ZcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFwiXG4gIH0sXG4gIFwiaHByb21hbjhcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMOAw4LDiMOKw4vDjsOPwrTLi8uGwqjLnMOZw5vigqTCr8Odw73CsMOHw6fDkcOxwqHCv8KkwqPCpcKnxpLCosOiw6rDtMO7w6HDqcOzw7rDoMOow7LDucOkw6vDtsO8w4XDrsOYw4bDpcOtw7jDpsOEw6zDlsOcw4nDr8Ofw5TDgcODw6PDkMOww43DjMOTw5LDlcO1xaDFocOaxbjDv8Oew77Ct8K1wrbCvuKAlMK8wr3CqsK6wqvilqDCu8Kx77+9XCJcbiAgfSxcbiAgXCJtYWNpbnRvc2hcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOEw4XDh8OJw5HDlsOcw6HDoMOiw6TDo8Olw6fDqcOow6rDq8Otw6zDrsOvw7HDs8Oyw7TDtsO1w7rDucO7w7zigKDCsMKiwqPCp+KAosK2w5/CrsKp4oSiwrTCqOKJoMOGw5jiiJ7CseKJpOKJpcKlwrXiiILiiJHiiI/PgOKIq8KqwrrihKbDpsO4wr/CocKs4oiaxpLiiYjiiIbCq8K74oCmwqDDgMODw5XFksWT4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rDv8W44oGEwqTigLnigLrvrIHvrILigKHCt+KAmuKAnuKAsMOCw4rDgcOLw4jDjcOOw4/DjMOTw5Tvv73DksOaw5vDmcSxy4bLnMKvy5jLmcuawrjLncuby4dcIlxuICB9LFxuICBcImFzY2lpXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv71cIlxuICB9LFxuICBcInRpczYyMFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+94LiB4LiC4LiD4LiE4LiF4LiG4LiH4LiI4LiJ4LiK4LiL4LiM4LiN4LiO4LiP4LiQ4LiR4LiS4LiT4LiU4LiV4LiW4LiX4LiY4LiZ4Lia4Lib4Lic4Lid4Lie4Lif4Lig4Lih4Lii4Lij4Lik4Lil4Lim4Lin4Lio4Lip4Liq4Lir4Lis4Lit4Liu4Liv4Liw4Lix4Liy4Liz4Li04Li14Li24Li34Li44Li54Li677+977+977+977+94Li/4LmA4LmB4LmC4LmD4LmE4LmF4LmG4LmH4LmI4LmJ4LmK4LmL4LmM4LmN4LmO4LmP4LmQ4LmR4LmS4LmT4LmU4LmV4LmW4LmX4LmY4LmZ4Lma4Lmb77+977+977+977+9XCJcbiAgfVxufTtcblxudmFyIEJ1ZmZlciQ1ID0gc2FmZXJfMS5CdWZmZXI7IC8vIE11bHRpYnl0ZSBjb2RlYy4gSW4gdGhpcyBzY2hlbWUsIGEgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIGJ5IDEgb3IgbW9yZSBieXRlcy5cbi8vIE91ciBjb2RlYyBzdXBwb3J0cyBVVEYtMTYgc3Vycm9nYXRlcywgZXh0ZW5zaW9ucyBmb3IgR0IxODAzMCBhbmQgdW5pY29kZSBzZXF1ZW5jZXMuXG4vLyBUbyBzYXZlIG1lbW9yeSBhbmQgbG9hZGluZyB0aW1lLCB3ZSByZWFkIHRhYmxlIGZpbGVzIG9ubHkgd2hlbiByZXF1ZXN0ZWQuXG5cbnZhciBfZGJjcyA9IERCQ1NDb2RlYztcbnZhciBVTkFTU0lHTkVEID0gLTEsXG4gICAgR0IxODAzMF9DT0RFID0gLTIsXG4gICAgU0VRX1NUQVJUID0gLTEwLFxuICAgIE5PREVfU1RBUlQgPSAtMTAwMCxcbiAgICBVTkFTU0lHTkVEX05PREUgPSBuZXcgQXJyYXkoMHgxMDApLFxuICAgIERFRl9DSEFSID0gLTE7XG5cbmZvciAodmFyIGkkMiA9IDA7IGkkMiA8IDB4MTAwOyBpJDIrKykge1xuICBVTkFTU0lHTkVEX05PREVbaSQyXSA9IFVOQVNTSUdORUQ7XG59IC8vIENsYXNzIERCQ1NDb2RlYyByZWFkcyBhbmQgaW5pdGlhbGl6ZXMgbWFwcGluZyB0YWJsZXMuXG5cblxuZnVuY3Rpb24gREJDU0NvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgdGhpcy5lbmNvZGluZ05hbWUgPSBjb2RlY09wdGlvbnMuZW5jb2RpbmdOYW1lO1xuICBpZiAoIWNvZGVjT3B0aW9ucykgdGhyb3cgbmV3IEVycm9yKFwiREJDUyBjb2RlYyBpcyBjYWxsZWQgd2l0aG91dCB0aGUgZGF0YS5cIik7XG4gIGlmICghY29kZWNPcHRpb25zLnRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoXCJFbmNvZGluZyAnXCIgKyB0aGlzLmVuY29kaW5nTmFtZSArIFwiJyBoYXMgbm8gZGF0YS5cIik7IC8vIExvYWQgdGFibGVzLlxuXG4gIHZhciBtYXBwaW5nVGFibGUgPSBjb2RlY09wdGlvbnMudGFibGUoKTsgLy8gRGVjb2RlIHRhYmxlczogTUJDUyAtPiBVbmljb2RlLlxuICAvLyBkZWNvZGVUYWJsZXMgaXMgYSB0cmllLCBlbmNvZGVkIGFzIGFuIGFycmF5IG9mIGFycmF5cyBvZiBpbnRlZ2Vycy4gSW50ZXJuYWwgYXJyYXlzIGFyZSB0cmllIG5vZGVzIGFuZCBhbGwgaGF2ZSBsZW4gPSAyNTYuXG4gIC8vIFRyaWUgcm9vdCBpcyBkZWNvZGVUYWJsZXNbMF0uXG4gIC8vIFZhbHVlczogPj0gIDAgLT4gdW5pY29kZSBjaGFyYWN0ZXIgY29kZS4gY2FuIGJlID4gMHhGRkZGXG4gIC8vICAgICAgICAgPT0gVU5BU1NJR05FRCAtPiB1bmtub3duL3VuYXNzaWduZWQgc2VxdWVuY2UuXG4gIC8vICAgICAgICAgPT0gR0IxODAzMF9DT0RFIC0+IHRoaXMgaXMgdGhlIGVuZCBvZiBhIEdCMTgwMzAgNC1ieXRlIHNlcXVlbmNlLlxuICAvLyAgICAgICAgIDw9IE5PREVfU1RBUlQgLT4gaW5kZXggb2YgdGhlIG5leHQgbm9kZSBpbiBvdXIgdHJpZSB0byBwcm9jZXNzIG5leHQgYnl0ZS5cbiAgLy8gICAgICAgICA8PSBTRVFfU1RBUlQgIC0+IGluZGV4IG9mIHRoZSBzdGFydCBvZiBhIGNoYXJhY3RlciBjb2RlIHNlcXVlbmNlLCBpbiBkZWNvZGVUYWJsZVNlcS5cblxuICB0aGlzLmRlY29kZVRhYmxlcyA9IFtdO1xuICB0aGlzLmRlY29kZVRhYmxlc1swXSA9IFVOQVNTSUdORURfTk9ERS5zbGljZSgwKTsgLy8gQ3JlYXRlIHJvb3Qgbm9kZS5cbiAgLy8gU29tZXRpbWVzIGEgTUJDUyBjaGFyIGNvcnJlc3BvbmRzIHRvIGEgc2VxdWVuY2Ugb2YgdW5pY29kZSBjaGFycy4gV2Ugc3RvcmUgdGhlbSBhcyBhcnJheXMgb2YgaW50ZWdlcnMgaGVyZS4gXG5cbiAgdGhpcy5kZWNvZGVUYWJsZVNlcSA9IFtdOyAvLyBBY3R1YWwgbWFwcGluZyB0YWJsZXMgY29uc2lzdCBvZiBjaHVua3MuIFVzZSB0aGVtIHRvIGZpbGwgdXAgZGVjb2RlIHRhYmxlcy5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcHBpbmdUYWJsZS5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuX2FkZERlY29kZUNodW5rKG1hcHBpbmdUYWJsZVtpXSk7XG4gIH1cblxuICB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZSA9IGljb252LmRlZmF1bHRDaGFyVW5pY29kZTsgLy8gRW5jb2RlIHRhYmxlczogVW5pY29kZSAtPiBEQkNTLlxuICAvLyBgZW5jb2RlVGFibGVgIGlzIGFycmF5IG1hcHBpbmcgZnJvbSB1bmljb2RlIGNoYXIgdG8gZW5jb2RlZCBjaGFyLiBBbGwgaXRzIHZhbHVlcyBhcmUgaW50ZWdlcnMgZm9yIHBlcmZvcm1hbmNlLlxuICAvLyBCZWNhdXNlIGl0IGNhbiBiZSBzcGFyc2UsIGl0IGlzIHJlcHJlc2VudGVkIGFzIGFycmF5IG9mIGJ1Y2tldHMgYnkgMjU2IGNoYXJzIGVhY2guIEJ1Y2tldCBjYW4gYmUgbnVsbC5cbiAgLy8gVmFsdWVzOiA+PSAgMCAtPiBpdCBpcyBhIG5vcm1hbCBjaGFyLiBXcml0ZSB0aGUgdmFsdWUgKGlmIDw9MjU2IHRoZW4gMSBieXRlLCBpZiA8PTY1NTM2IHRoZW4gMiBieXRlcywgZXRjLikuXG4gIC8vICAgICAgICAgPT0gVU5BU1NJR05FRCAtPiBubyBjb252ZXJzaW9uIGZvdW5kLiBPdXRwdXQgYSBkZWZhdWx0IGNoYXIuXG4gIC8vICAgICAgICAgPD0gU0VRX1NUQVJUICAtPiBpdCdzIGFuIGluZGV4IGluIGVuY29kZVRhYmxlU2VxLCBzZWUgYmVsb3cuIFRoZSBjaGFyYWN0ZXIgc3RhcnRzIGEgc2VxdWVuY2UuXG5cbiAgdGhpcy5lbmNvZGVUYWJsZSA9IFtdOyAvLyBgZW5jb2RlVGFibGVTZXFgIGlzIHVzZWQgd2hlbiBhIHNlcXVlbmNlIG9mIHVuaWNvZGUgY2hhcmFjdGVycyBpcyBlbmNvZGVkIGFzIGEgc2luZ2xlIGNvZGUuIFdlIHVzZSBhIHRyZWUgb2ZcbiAgLy8gb2JqZWN0cyB3aGVyZSBrZXlzIGNvcnJlc3BvbmQgdG8gY2hhcmFjdGVycyBpbiBzZXF1ZW5jZSBhbmQgbGVhZnMgYXJlIHRoZSBlbmNvZGVkIGRiY3MgdmFsdWVzLiBBIHNwZWNpYWwgREVGX0NIQVIga2V5XG4gIC8vIG1lYW5zIGVuZCBvZiBzZXF1ZW5jZSAobmVlZGVkIHdoZW4gb25lIHNlcXVlbmNlIGlzIGEgc3RyaWN0IHN1YnNlcXVlbmNlIG9mIGFub3RoZXIpLlxuICAvLyBPYmplY3RzIGFyZSBrZXB0IHNlcGFyYXRlbHkgZnJvbSBlbmNvZGVUYWJsZSB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZS5cblxuICB0aGlzLmVuY29kZVRhYmxlU2VxID0gW107IC8vIFNvbWUgY2hhcnMgY2FuIGJlIGRlY29kZWQsIGJ1dCBuZWVkIG5vdCBiZSBlbmNvZGVkLlxuXG4gIHZhciBza2lwRW5jb2RlQ2hhcnMgPSB7fTtcbiAgaWYgKGNvZGVjT3B0aW9ucy5lbmNvZGVTa2lwVmFscykgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlY09wdGlvbnMuZW5jb2RlU2tpcFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdmFsID0gY29kZWNPcHRpb25zLmVuY29kZVNraXBWYWxzW2ldO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgc2tpcEVuY29kZUNoYXJzW3ZhbF0gPSB0cnVlO2Vsc2UgZm9yICh2YXIgaiA9IHZhbC5mcm9tOyBqIDw9IHZhbC50bzsgaisrKSB7XG4gICAgICBza2lwRW5jb2RlQ2hhcnNbal0gPSB0cnVlO1xuICAgIH1cbiAgfSAvLyBVc2UgZGVjb2RlIHRyaWUgdG8gcmVjdXJzaXZlbHkgZmlsbCBvdXQgZW5jb2RlIHRhYmxlcy5cblxuICB0aGlzLl9maWxsRW5jb2RlVGFibGUoMCwgMCwgc2tpcEVuY29kZUNoYXJzKTsgLy8gQWRkIG1vcmUgZW5jb2RpbmcgcGFpcnMgd2hlbiBuZWVkZWQuXG5cblxuICBpZiAoY29kZWNPcHRpb25zLmVuY29kZUFkZCkge1xuICAgIGZvciAodmFyIHVDaGFyIGluIGNvZGVjT3B0aW9ucy5lbmNvZGVBZGQpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29kZWNPcHRpb25zLmVuY29kZUFkZCwgdUNoYXIpKSB0aGlzLl9zZXRFbmNvZGVDaGFyKHVDaGFyLmNoYXJDb2RlQXQoMCksIGNvZGVjT3B0aW9ucy5lbmNvZGVBZGRbdUNoYXJdKTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmRlZkNoYXJTQiA9IHRoaXMuZW5jb2RlVGFibGVbMF1baWNvbnYuZGVmYXVsdENoYXJTaW5nbGVCeXRlLmNoYXJDb2RlQXQoMCldO1xuICBpZiAodGhpcy5kZWZDaGFyU0IgPT09IFVOQVNTSUdORUQpIHRoaXMuZGVmQ2hhclNCID0gdGhpcy5lbmNvZGVUYWJsZVswXVsnPyddO1xuICBpZiAodGhpcy5kZWZDaGFyU0IgPT09IFVOQVNTSUdORUQpIHRoaXMuZGVmQ2hhclNCID0gXCI/XCIuY2hhckNvZGVBdCgwKTsgLy8gTG9hZCAmIGNyZWF0ZSBHQjE4MDMwIHRhYmxlcyB3aGVuIG5lZWRlZC5cblxuICBpZiAodHlwZW9mIGNvZGVjT3B0aW9ucy5nYjE4MDMwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5nYjE4MDMwID0gY29kZWNPcHRpb25zLmdiMTgwMzAoKTsgLy8gTG9hZCBHQjE4MDMwIHJhbmdlcy5cbiAgICAvLyBBZGQgR0IxODAzMCBkZWNvZGUgdGFibGVzLlxuXG4gICAgdmFyIHRoaXJkQnl0ZU5vZGVJZHggPSB0aGlzLmRlY29kZVRhYmxlcy5sZW5ndGg7XG4gICAgdmFyIHRoaXJkQnl0ZU5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1t0aGlyZEJ5dGVOb2RlSWR4XSA9IFVOQVNTSUdORURfTk9ERS5zbGljZSgwKTtcbiAgICB2YXIgZm91cnRoQnl0ZU5vZGVJZHggPSB0aGlzLmRlY29kZVRhYmxlcy5sZW5ndGg7XG4gICAgdmFyIGZvdXJ0aEJ5dGVOb2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbZm91cnRoQnl0ZU5vZGVJZHhdID0gVU5BU1NJR05FRF9OT0RFLnNsaWNlKDApO1xuXG4gICAgZm9yICh2YXIgaSA9IDB4ODE7IGkgPD0gMHhGRTsgaSsrKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZU5vZGVJZHggPSBOT0RFX1NUQVJUIC0gdGhpcy5kZWNvZGVUYWJsZXNbMF1baV07XG4gICAgICB2YXIgc2Vjb25kQnl0ZU5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1tzZWNvbmRCeXRlTm9kZUlkeF07XG5cbiAgICAgIGZvciAodmFyIGogPSAweDMwOyBqIDw9IDB4Mzk7IGorKykge1xuICAgICAgICBzZWNvbmRCeXRlTm9kZVtqXSA9IE5PREVfU1RBUlQgLSB0aGlyZEJ5dGVOb2RlSWR4O1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAweDgxOyBpIDw9IDB4RkU7IGkrKykge1xuICAgICAgdGhpcmRCeXRlTm9kZVtpXSA9IE5PREVfU1RBUlQgLSBmb3VydGhCeXRlTm9kZUlkeDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMHgzMDsgaSA8PSAweDM5OyBpKyspIHtcbiAgICAgIGZvdXJ0aEJ5dGVOb2RlW2ldID0gR0IxODAzMF9DT0RFO1xuICAgIH1cbiAgfVxufVxuXG5EQkNTQ29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBEQkNTRW5jb2RlcjtcbkRCQ1NDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IERCQ1NEZWNvZGVyOyAvLyBEZWNvZGVyIGhlbHBlcnNcblxuREJDU0NvZGVjLnByb3RvdHlwZS5fZ2V0RGVjb2RlVHJpZU5vZGUgPSBmdW5jdGlvbiAoYWRkcikge1xuICB2YXIgYnl0ZXMgPSBbXTtcblxuICBmb3IgKDsgYWRkciA+IDA7IGFkZHIgPj49IDgpIHtcbiAgICBieXRlcy5wdXNoKGFkZHIgJiAweEZGKTtcbiAgfVxuXG4gIGlmIChieXRlcy5sZW5ndGggPT0gMCkgYnl0ZXMucHVzaCgwKTtcbiAgdmFyIG5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1swXTtcblxuICBmb3IgKHZhciBpID0gYnl0ZXMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgIC8vIFRyYXZlcnNlIG5vZGVzIGRlZXBlciBpbnRvIHRoZSB0cmllLlxuICAgIHZhciB2YWwgPSBub2RlW2J5dGVzW2ldXTtcblxuICAgIGlmICh2YWwgPT0gVU5BU1NJR05FRCkge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBub2RlLlxuICAgICAgbm9kZVtieXRlc1tpXV0gPSBOT0RFX1NUQVJUIC0gdGhpcy5kZWNvZGVUYWJsZXMubGVuZ3RoO1xuICAgICAgdGhpcy5kZWNvZGVUYWJsZXMucHVzaChub2RlID0gVU5BU1NJR05FRF9OT0RFLnNsaWNlKDApKTtcbiAgICB9IGVsc2UgaWYgKHZhbCA8PSBOT0RFX1NUQVJUKSB7XG4gICAgICAvLyBFeGlzdGluZyBub2RlLlxuICAgICAgbm9kZSA9IHRoaXMuZGVjb2RlVGFibGVzW05PREVfU1RBUlQgLSB2YWxdO1xuICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJPdmVyd3JpdGUgYnl0ZSBpbiBcIiArIHRoaXMuZW5jb2RpbmdOYW1lICsgXCIsIGFkZHI6IFwiICsgYWRkci50b1N0cmluZygxNikpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59O1xuXG5EQkNTQ29kZWMucHJvdG90eXBlLl9hZGREZWNvZGVDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAvLyBGaXJzdCBlbGVtZW50IG9mIGNodW5rIGlzIHRoZSBoZXggbWJjcyBjb2RlIHdoZXJlIHdlIHN0YXJ0LlxuICB2YXIgY3VyQWRkciA9IHBhcnNlSW50KGNodW5rWzBdLCAxNik7IC8vIENob29zZSB0aGUgZGVjb2Rpbmcgbm9kZSB3aGVyZSB3ZSdsbCB3cml0ZSBvdXIgY2hhcnMuXG5cbiAgdmFyIHdyaXRlVGFibGUgPSB0aGlzLl9nZXREZWNvZGVUcmllTm9kZShjdXJBZGRyKTtcblxuICBjdXJBZGRyID0gY3VyQWRkciAmIDB4RkY7IC8vIFdyaXRlIGFsbCBvdGhlciBlbGVtZW50cyBvZiB0aGUgY2h1bmsgdG8gdGhlIHRhYmxlLlxuXG4gIGZvciAodmFyIGsgPSAxOyBrIDwgY2h1bmsubGVuZ3RoOyBrKyspIHtcbiAgICB2YXIgcGFydCA9IGNodW5rW2tdO1xuXG4gICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBTdHJpbmcsIHdyaXRlIGFzLWlzLlxuICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBwYXJ0Lmxlbmd0aDspIHtcbiAgICAgICAgdmFyIGNvZGUgPSBwYXJ0LmNoYXJDb2RlQXQobCsrKTtcblxuICAgICAgICBpZiAoMHhEODAwIDw9IGNvZGUgJiYgY29kZSA8IDB4REMwMCkge1xuICAgICAgICAgIC8vIERlY29kZSBzdXJyb2dhdGVcbiAgICAgICAgICB2YXIgY29kZVRyYWlsID0gcGFydC5jaGFyQ29kZUF0KGwrKyk7XG4gICAgICAgICAgaWYgKDB4REMwMCA8PSBjb2RlVHJhaWwgJiYgY29kZVRyYWlsIDwgMHhFMDAwKSB3cml0ZVRhYmxlW2N1ckFkZHIrK10gPSAweDEwMDAwICsgKGNvZGUgLSAweEQ4MDApICogMHg0MDAgKyAoY29kZVRyYWlsIC0gMHhEQzAwKTtlbHNlIHRocm93IG5ldyBFcnJvcihcIkluY29ycmVjdCBzdXJyb2dhdGUgcGFpciBpbiBcIiArIHRoaXMuZW5jb2RpbmdOYW1lICsgXCIgYXQgY2h1bmsgXCIgKyBjaHVua1swXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoMHgwRkYwIDwgY29kZSAmJiBjb2RlIDw9IDB4MEZGRikge1xuICAgICAgICAgIC8vIENoYXJhY3RlciBzZXF1ZW5jZSAob3VyIG93biBlbmNvZGluZyB1c2VkKVxuICAgICAgICAgIHZhciBsZW4gPSAweEZGRiAtIGNvZGUgKyAyO1xuICAgICAgICAgIHZhciBzZXEgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIG0gPSAwOyBtIDwgbGVuOyBtKyspIHtcbiAgICAgICAgICAgIHNlcS5wdXNoKHBhcnQuY2hhckNvZGVBdChsKyspKTtcbiAgICAgICAgICB9IC8vIFNpbXBsZSB2YXJpYXRpb246IGRvbid0IHN1cHBvcnQgc3Vycm9nYXRlcyBvciBzdWJzZXF1ZW5jZXMgaW4gc2VxLlxuXG5cbiAgICAgICAgICB3cml0ZVRhYmxlW2N1ckFkZHIrK10gPSBTRVFfU1RBUlQgLSB0aGlzLmRlY29kZVRhYmxlU2VxLmxlbmd0aDtcbiAgICAgICAgICB0aGlzLmRlY29kZVRhYmxlU2VxLnB1c2goc2VxKTtcbiAgICAgICAgfSBlbHNlIHdyaXRlVGFibGVbY3VyQWRkcisrXSA9IGNvZGU7IC8vIEJhc2ljIGNoYXJcblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcnQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIC8vIEludGVnZXIsIG1lYW5pbmcgaW5jcmVhc2luZyBzZXF1ZW5jZSBzdGFydGluZyB3aXRoIHByZXYgY2hhcmFjdGVyLlxuICAgICAgdmFyIGNoYXJDb2RlID0gd3JpdGVUYWJsZVtjdXJBZGRyIC0gMV0gKyAxO1xuXG4gICAgICBmb3IgKHZhciBsID0gMDsgbCA8IHBhcnQ7IGwrKykge1xuICAgICAgICB3cml0ZVRhYmxlW2N1ckFkZHIrK10gPSBjaGFyQ29kZSsrO1xuICAgICAgfVxuICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJJbmNvcnJlY3QgdHlwZSAnXCIgKyB0eXBlb2YgcGFydCArIFwiJyBnaXZlbiBpbiBcIiArIHRoaXMuZW5jb2RpbmdOYW1lICsgXCIgYXQgY2h1bmsgXCIgKyBjaHVua1swXSk7XG4gIH1cblxuICBpZiAoY3VyQWRkciA+IDB4RkYpIHRocm93IG5ldyBFcnJvcihcIkluY29ycmVjdCBjaHVuayBpbiBcIiArIHRoaXMuZW5jb2RpbmdOYW1lICsgXCIgYXQgYWRkciBcIiArIGNodW5rWzBdICsgXCI6IHRvbyBsb25nXCIgKyBjdXJBZGRyKTtcbn07IC8vIEVuY29kZXIgaGVscGVyc1xuXG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX2dldEVuY29kZUJ1Y2tldCA9IGZ1bmN0aW9uICh1Q29kZSkge1xuICB2YXIgaGlnaCA9IHVDb2RlID4+IDg7IC8vIFRoaXMgY291bGQgYmUgPiAweEZGIGJlY2F1c2Ugb2YgYXN0cmFsIGNoYXJhY3RlcnMuXG5cbiAgaWYgKHRoaXMuZW5jb2RlVGFibGVbaGlnaF0gPT09IHVuZGVmaW5lZCkgdGhpcy5lbmNvZGVUYWJsZVtoaWdoXSA9IFVOQVNTSUdORURfTk9ERS5zbGljZSgwKTsgLy8gQ3JlYXRlIGJ1Y2tldCBvbiBkZW1hbmQuXG5cbiAgcmV0dXJuIHRoaXMuZW5jb2RlVGFibGVbaGlnaF07XG59O1xuXG5EQkNTQ29kZWMucHJvdG90eXBlLl9zZXRFbmNvZGVDaGFyID0gZnVuY3Rpb24gKHVDb2RlLCBkYmNzQ29kZSkge1xuICB2YXIgYnVja2V0ID0gdGhpcy5fZ2V0RW5jb2RlQnVja2V0KHVDb2RlKTtcblxuICB2YXIgbG93ID0gdUNvZGUgJiAweEZGO1xuICBpZiAoYnVja2V0W2xvd10gPD0gU0VRX1NUQVJUKSB0aGlzLmVuY29kZVRhYmxlU2VxW1NFUV9TVEFSVCAtIGJ1Y2tldFtsb3ddXVtERUZfQ0hBUl0gPSBkYmNzQ29kZTsgLy8gVGhlcmUncyBhbHJlYWR5IGEgc2VxdWVuY2UsIHNldCBhIHNpbmdsZS1jaGFyIHN1YnNlcXVlbmNlIG9mIGl0LlxuICBlbHNlIGlmIChidWNrZXRbbG93XSA9PSBVTkFTU0lHTkVEKSBidWNrZXRbbG93XSA9IGRiY3NDb2RlO1xufTtcblxuREJDU0NvZGVjLnByb3RvdHlwZS5fc2V0RW5jb2RlU2VxdWVuY2UgPSBmdW5jdGlvbiAoc2VxLCBkYmNzQ29kZSkge1xuICAvLyBHZXQgdGhlIHJvb3Qgb2YgY2hhcmFjdGVyIHRyZWUgYWNjb3JkaW5nIHRvIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc2VxdWVuY2UuXG4gIHZhciB1Q29kZSA9IHNlcVswXTtcblxuICB2YXIgYnVja2V0ID0gdGhpcy5fZ2V0RW5jb2RlQnVja2V0KHVDb2RlKTtcblxuICB2YXIgbG93ID0gdUNvZGUgJiAweEZGO1xuICB2YXIgbm9kZTtcblxuICBpZiAoYnVja2V0W2xvd10gPD0gU0VRX1NUQVJUKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgc2VxdWVuY2Ugd2l0aCAgLSB1c2UgaXQuXG4gICAgbm9kZSA9IHRoaXMuZW5jb2RlVGFibGVTZXFbU0VRX1NUQVJUIC0gYnVja2V0W2xvd11dO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlIHdhcyBubyBzZXF1ZW5jZSBvYmplY3QgLSBhbGxvY2F0ZSBhIG5ldyBvbmUuXG4gICAgbm9kZSA9IHt9O1xuICAgIGlmIChidWNrZXRbbG93XSAhPT0gVU5BU1NJR05FRCkgbm9kZVtERUZfQ0hBUl0gPSBidWNrZXRbbG93XTsgLy8gSWYgYSBjaGFyIHdhcyBzZXQgYmVmb3JlIC0gbWFrZSBpdCBhIHNpbmdsZS1jaGFyIHN1YnNlcXVlbmNlLlxuXG4gICAgYnVja2V0W2xvd10gPSBTRVFfU1RBUlQgLSB0aGlzLmVuY29kZVRhYmxlU2VxLmxlbmd0aDtcbiAgICB0aGlzLmVuY29kZVRhYmxlU2VxLnB1c2gobm9kZSk7XG4gIH0gLy8gVHJhdmVyc2UgdGhlIGNoYXJhY3RlciB0cmVlLCBhbGxvY2F0aW5nIG5ldyBub2RlcyBhcyBuZWVkZWQuXG5cblxuICBmb3IgKHZhciBqID0gMTsgaiA8IHNlcS5sZW5ndGggLSAxOyBqKyspIHtcbiAgICB2YXIgb2xkVmFsID0gbm9kZVt1Q29kZV07XG4gICAgaWYgKHR5cGVvZiBvbGRWYWwgPT09ICdvYmplY3QnKSBub2RlID0gb2xkVmFsO2Vsc2Uge1xuICAgICAgbm9kZSA9IG5vZGVbdUNvZGVdID0ge307XG4gICAgICBpZiAob2xkVmFsICE9PSB1bmRlZmluZWQpIG5vZGVbREVGX0NIQVJdID0gb2xkVmFsO1xuICAgIH1cbiAgfSAvLyBTZXQgdGhlIGxlYWYgdG8gZ2l2ZW4gZGJjc0NvZGUuXG5cblxuICB1Q29kZSA9IHNlcVtzZXEubGVuZ3RoIC0gMV07XG4gIG5vZGVbdUNvZGVdID0gZGJjc0NvZGU7XG59O1xuXG5EQkNTQ29kZWMucHJvdG90eXBlLl9maWxsRW5jb2RlVGFibGUgPSBmdW5jdGlvbiAobm9kZUlkeCwgcHJlZml4LCBza2lwRW5jb2RlQ2hhcnMpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1tub2RlSWR4XTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDB4MTAwOyBpKyspIHtcbiAgICB2YXIgdUNvZGUgPSBub2RlW2ldO1xuICAgIHZhciBtYkNvZGUgPSBwcmVmaXggKyBpO1xuICAgIGlmIChza2lwRW5jb2RlQ2hhcnNbbWJDb2RlXSkgY29udGludWU7XG4gICAgaWYgKHVDb2RlID49IDApIHRoaXMuX3NldEVuY29kZUNoYXIodUNvZGUsIG1iQ29kZSk7ZWxzZSBpZiAodUNvZGUgPD0gTk9ERV9TVEFSVCkgdGhpcy5fZmlsbEVuY29kZVRhYmxlKE5PREVfU1RBUlQgLSB1Q29kZSwgbWJDb2RlIDw8IDgsIHNraXBFbmNvZGVDaGFycyk7ZWxzZSBpZiAodUNvZGUgPD0gU0VRX1NUQVJUKSB0aGlzLl9zZXRFbmNvZGVTZXF1ZW5jZSh0aGlzLmRlY29kZVRhYmxlU2VxW1NFUV9TVEFSVCAtIHVDb2RlXSwgbWJDb2RlKTtcbiAgfVxufTsgLy8gPT0gRW5jb2RlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG5mdW5jdGlvbiBEQkNTRW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICAvLyBFbmNvZGVyIHN0YXRlXG4gIHRoaXMubGVhZFN1cnJvZ2F0ZSA9IC0xO1xuICB0aGlzLnNlcU9iaiA9IHVuZGVmaW5lZDsgLy8gU3RhdGljIGRhdGFcblxuICB0aGlzLmVuY29kZVRhYmxlID0gY29kZWMuZW5jb2RlVGFibGU7XG4gIHRoaXMuZW5jb2RlVGFibGVTZXEgPSBjb2RlYy5lbmNvZGVUYWJsZVNlcTtcbiAgdGhpcy5kZWZhdWx0Q2hhclNpbmdsZUJ5dGUgPSBjb2RlYy5kZWZDaGFyU0I7XG4gIHRoaXMuZ2IxODAzMCA9IGNvZGVjLmdiMTgwMzA7XG59XG5cbkRCQ1NFbmNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIG5ld0J1ZiA9IEJ1ZmZlciQ1LmFsbG9jKHN0ci5sZW5ndGggKiAodGhpcy5nYjE4MDMwID8gNCA6IDMpKSxcbiAgICAgIGxlYWRTdXJyb2dhdGUgPSB0aGlzLmxlYWRTdXJyb2dhdGUsXG4gICAgICBzZXFPYmogPSB0aGlzLnNlcU9iaixcbiAgICAgIG5leHRDaGFyID0gLTEsXG4gICAgICBpID0gMCxcbiAgICAgIGogPSAwO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gMC4gR2V0IG5leHQgY2hhcmFjdGVyLlxuICAgIGlmIChuZXh0Q2hhciA9PT0gLTEpIHtcbiAgICAgIGlmIChpID09IHN0ci5sZW5ndGgpIGJyZWFrO1xuICAgICAgdmFyIHVDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVDb2RlID0gbmV4dENoYXI7XG4gICAgICBuZXh0Q2hhciA9IC0xO1xuICAgIH0gLy8gMS4gSGFuZGxlIHN1cnJvZ2F0ZXMuXG5cblxuICAgIGlmICgweEQ4MDAgPD0gdUNvZGUgJiYgdUNvZGUgPCAweEUwMDApIHtcbiAgICAgIC8vIENoYXIgaXMgb25lIG9mIHN1cnJvZ2F0ZXMuXG4gICAgICBpZiAodUNvZGUgPCAweERDMDApIHtcbiAgICAgICAgLy8gV2UndmUgZ290IGxlYWQgc3Vycm9nYXRlLlxuICAgICAgICBpZiAobGVhZFN1cnJvZ2F0ZSA9PT0gLTEpIHtcbiAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gdUNvZGU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IHVDb2RlOyAvLyBEb3VibGUgbGVhZCBzdXJyb2dhdGUgZm91bmQuXG5cbiAgICAgICAgICB1Q29kZSA9IFVOQVNTSUdORUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdlJ3ZlIGdvdCB0cmFpbCBzdXJyb2dhdGUuXG4gICAgICAgIGlmIChsZWFkU3Vycm9nYXRlICE9PSAtMSkge1xuICAgICAgICAgIHVDb2RlID0gMHgxMDAwMCArIChsZWFkU3Vycm9nYXRlIC0gMHhEODAwKSAqIDB4NDAwICsgKHVDb2RlIC0gMHhEQzAwKTtcbiAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSW5jb21wbGV0ZSBzdXJyb2dhdGUgcGFpciAtIG9ubHkgdHJhaWwgc3Vycm9nYXRlIGZvdW5kLlxuICAgICAgICAgIHVDb2RlID0gVU5BU1NJR05FRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSAhPT0gLTEpIHtcbiAgICAgIC8vIEluY29tcGxldGUgc3Vycm9nYXRlIHBhaXIgLSBvbmx5IGxlYWQgc3Vycm9nYXRlIGZvdW5kLlxuICAgICAgbmV4dENoYXIgPSB1Q29kZTtcbiAgICAgIHVDb2RlID0gVU5BU1NJR05FRDsgLy8gV3JpdGUgYW4gZXJyb3IsIHRoZW4gY3VycmVudCBjaGFyLlxuXG4gICAgICBsZWFkU3Vycm9nYXRlID0gLTE7XG4gICAgfSAvLyAyLiBDb252ZXJ0IHVDb2RlIGNoYXJhY3Rlci5cblxuXG4gICAgdmFyIGRiY3NDb2RlID0gVU5BU1NJR05FRDtcblxuICAgIGlmIChzZXFPYmogIT09IHVuZGVmaW5lZCAmJiB1Q29kZSAhPSBVTkFTU0lHTkVEKSB7XG4gICAgICAvLyBXZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc2VxdWVuY2VcbiAgICAgIHZhciByZXNDb2RlID0gc2VxT2JqW3VDb2RlXTtcblxuICAgICAgaWYgKHR5cGVvZiByZXNDb2RlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBTZXF1ZW5jZSBjb250aW51ZXMuXG4gICAgICAgIHNlcU9iaiA9IHJlc0NvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzQ29kZSA9PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBTZXF1ZW5jZSBmaW5pc2hlZC4gV3JpdGUgaXQuXG4gICAgICAgIGRiY3NDb2RlID0gcmVzQ29kZTtcbiAgICAgIH0gZWxzZSBpZiAocmVzQ29kZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gQ3VycmVudCBjaGFyYWN0ZXIgaXMgbm90IHBhcnQgb2YgdGhlIHNlcXVlbmNlLlxuICAgICAgICAvLyBUcnkgZGVmYXVsdCBjaGFyYWN0ZXIgZm9yIHRoaXMgc2VxdWVuY2VcbiAgICAgICAgcmVzQ29kZSA9IHNlcU9ialtERUZfQ0hBUl07XG5cbiAgICAgICAgaWYgKHJlc0NvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRiY3NDb2RlID0gcmVzQ29kZTsgLy8gRm91bmQuIFdyaXRlIGl0LlxuXG4gICAgICAgICAgbmV4dENoYXIgPSB1Q29kZTsgLy8gQ3VycmVudCBjaGFyYWN0ZXIgd2lsbCBiZSB3cml0dGVuIHRvbyBpbiB0aGUgbmV4dCBpdGVyYXRpb24uXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VxT2JqID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodUNvZGUgPj0gMCkge1xuICAgICAgLy8gUmVndWxhciBjaGFyYWN0ZXJcbiAgICAgIHZhciBzdWJ0YWJsZSA9IHRoaXMuZW5jb2RlVGFibGVbdUNvZGUgPj4gOF07XG4gICAgICBpZiAoc3VidGFibGUgIT09IHVuZGVmaW5lZCkgZGJjc0NvZGUgPSBzdWJ0YWJsZVt1Q29kZSAmIDB4RkZdO1xuXG4gICAgICBpZiAoZGJjc0NvZGUgPD0gU0VRX1NUQVJUKSB7XG4gICAgICAgIC8vIFNlcXVlbmNlIHN0YXJ0XG4gICAgICAgIHNlcU9iaiA9IHRoaXMuZW5jb2RlVGFibGVTZXFbU0VRX1NUQVJUIC0gZGJjc0NvZGVdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRiY3NDb2RlID09IFVOQVNTSUdORUQgJiYgdGhpcy5nYjE4MDMwKSB7XG4gICAgICAgIC8vIFVzZSBHQjE4MDMwIGFsZ29yaXRobSB0byBmaW5kIGNoYXJhY3RlcihzKSB0byB3cml0ZS5cbiAgICAgICAgdmFyIGlkeCA9IGZpbmRJZHgodGhpcy5nYjE4MDMwLnVDaGFycywgdUNvZGUpO1xuXG4gICAgICAgIGlmIChpZHggIT0gLTEpIHtcbiAgICAgICAgICB2YXIgZGJjc0NvZGUgPSB0aGlzLmdiMTgwMzAuZ2JDaGFyc1tpZHhdICsgKHVDb2RlIC0gdGhpcy5nYjE4MDMwLnVDaGFyc1tpZHhdKTtcbiAgICAgICAgICBuZXdCdWZbaisrXSA9IDB4ODEgKyBNYXRoLmZsb29yKGRiY3NDb2RlIC8gMTI2MDApO1xuICAgICAgICAgIGRiY3NDb2RlID0gZGJjc0NvZGUgJSAxMjYwMDtcbiAgICAgICAgICBuZXdCdWZbaisrXSA9IDB4MzAgKyBNYXRoLmZsb29yKGRiY3NDb2RlIC8gMTI2MCk7XG4gICAgICAgICAgZGJjc0NvZGUgPSBkYmNzQ29kZSAlIDEyNjA7XG4gICAgICAgICAgbmV3QnVmW2orK10gPSAweDgxICsgTWF0aC5mbG9vcihkYmNzQ29kZSAvIDEwKTtcbiAgICAgICAgICBkYmNzQ29kZSA9IGRiY3NDb2RlICUgMTA7XG4gICAgICAgICAgbmV3QnVmW2orK10gPSAweDMwICsgZGJjc0NvZGU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIDMuIFdyaXRlIGRiY3NDb2RlIGNoYXJhY3Rlci5cblxuXG4gICAgaWYgKGRiY3NDb2RlID09PSBVTkFTU0lHTkVEKSBkYmNzQ29kZSA9IHRoaXMuZGVmYXVsdENoYXJTaW5nbGVCeXRlO1xuXG4gICAgaWYgKGRiY3NDb2RlIDwgMHgxMDApIHtcbiAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGU7XG4gICAgfSBlbHNlIGlmIChkYmNzQ29kZSA8IDB4MTAwMDApIHtcbiAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGUgPj4gODsgLy8gaGlnaCBieXRlXG5cbiAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGUgJiAweEZGOyAvLyBsb3cgYnl0ZVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlID4+IDE2O1xuICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZSA+PiA4ICYgMHhGRjtcbiAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGUgJiAweEZGO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuc2VxT2JqID0gc2VxT2JqO1xuICB0aGlzLmxlYWRTdXJyb2dhdGUgPSBsZWFkU3Vycm9nYXRlO1xuICByZXR1cm4gbmV3QnVmLnNsaWNlKDAsIGopO1xufTtcblxuREJDU0VuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubGVhZFN1cnJvZ2F0ZSA9PT0gLTEgJiYgdGhpcy5zZXFPYmogPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBBbGwgY2xlYW4uIE1vc3Qgb2Z0ZW4gY2FzZS5cblxuICB2YXIgbmV3QnVmID0gQnVmZmVyJDUuYWxsb2MoMTApLFxuICAgICAgaiA9IDA7XG5cbiAgaWYgKHRoaXMuc2VxT2JqKSB7XG4gICAgLy8gV2UncmUgaW4gdGhlIHNlcXVlbmNlLlxuICAgIHZhciBkYmNzQ29kZSA9IHRoaXMuc2VxT2JqW0RFRl9DSEFSXTtcblxuICAgIGlmIChkYmNzQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBXcml0ZSBiZWdpbm5pbmcgb2YgdGhlIHNlcXVlbmNlLlxuICAgICAgaWYgKGRiY3NDb2RlIDwgMHgxMDApIHtcbiAgICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGUgPj4gODsgLy8gaGlnaCBieXRlXG5cbiAgICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZSAmIDB4RkY7IC8vIGxvdyBieXRlXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXFPYmogPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodGhpcy5sZWFkU3Vycm9nYXRlICE9PSAtMSkge1xuICAgIC8vIEluY29tcGxldGUgc3Vycm9nYXRlIHBhaXIgLSBvbmx5IGxlYWQgc3Vycm9nYXRlIGZvdW5kLlxuICAgIG5ld0J1ZltqKytdID0gdGhpcy5kZWZhdWx0Q2hhclNpbmdsZUJ5dGU7XG4gICAgdGhpcy5sZWFkU3Vycm9nYXRlID0gLTE7XG4gIH1cblxuICByZXR1cm4gbmV3QnVmLnNsaWNlKDAsIGopO1xufTsgLy8gRXhwb3J0IGZvciB0ZXN0aW5nXG5cblxuREJDU0VuY29kZXIucHJvdG90eXBlLmZpbmRJZHggPSBmaW5kSWR4OyAvLyA9PSBEZWNvZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBEQkNTRGVjb2RlcihvcHRpb25zLCBjb2RlYykge1xuICAvLyBEZWNvZGVyIHN0YXRlXG4gIHRoaXMubm9kZUlkeCA9IDA7XG4gIHRoaXMucHJldkJ1ZiA9IEJ1ZmZlciQ1LmFsbG9jKDApOyAvLyBTdGF0aWMgZGF0YVxuXG4gIHRoaXMuZGVjb2RlVGFibGVzID0gY29kZWMuZGVjb2RlVGFibGVzO1xuICB0aGlzLmRlY29kZVRhYmxlU2VxID0gY29kZWMuZGVjb2RlVGFibGVTZXE7XG4gIHRoaXMuZGVmYXVsdENoYXJVbmljb2RlID0gY29kZWMuZGVmYXVsdENoYXJVbmljb2RlO1xuICB0aGlzLmdiMTgwMzAgPSBjb2RlYy5nYjE4MDMwO1xufVxuXG5EQkNTRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIHZhciBuZXdCdWYgPSBCdWZmZXIkNS5hbGxvYyhidWYubGVuZ3RoICogMiksXG4gICAgICBub2RlSWR4ID0gdGhpcy5ub2RlSWR4LFxuICAgICAgcHJldkJ1ZiA9IHRoaXMucHJldkJ1ZixcbiAgICAgIHByZXZCdWZPZmZzZXQgPSB0aGlzLnByZXZCdWYubGVuZ3RoLFxuICAgICAgc2VxU3RhcnQgPSAtdGhpcy5wcmV2QnVmLmxlbmd0aCxcbiAgICAgIC8vIGlkeCBvZiB0aGUgc3RhcnQgb2YgY3VycmVudCBwYXJzZWQgc2VxdWVuY2UuXG4gIHVDb2RlO1xuICBpZiAocHJldkJ1Zk9mZnNldCA+IDApIC8vIE1ha2UgcHJldiBidWYgb3ZlcmxhcCBhIGxpdHRsZSB0byBtYWtlIGl0IGVhc2llciB0byBzbGljZSBsYXRlci5cbiAgICBwcmV2QnVmID0gQnVmZmVyJDUuY29uY2F0KFtwcmV2QnVmLCBidWYuc2xpY2UoMCwgMTApXSk7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN1ckJ5dGUgPSBpID49IDAgPyBidWZbaV0gOiBwcmV2QnVmW2kgKyBwcmV2QnVmT2Zmc2V0XTsgLy8gTG9va3VwIGluIGN1cnJlbnQgdHJpZSBub2RlLlxuXG4gICAgdmFyIHVDb2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbbm9kZUlkeF1bY3VyQnl0ZV07XG5cbiAgICBpZiAodUNvZGUgPj0gMCkgOyBlbHNlIGlmICh1Q29kZSA9PT0gVU5BU1NJR05FRCkge1xuICAgICAgLy8gVW5rbm93biBjaGFyLlxuICAgICAgLy8gVE9ETzogQ2FsbGJhY2sgd2l0aCBzZXEuXG4gICAgICAvL3ZhciBjdXJTZXEgPSAoc2VxU3RhcnQgPj0gMCkgPyBidWYuc2xpY2Uoc2VxU3RhcnQsIGkrMSkgOiBwcmV2QnVmLnNsaWNlKHNlcVN0YXJ0ICsgcHJldkJ1Zk9mZnNldCwgaSsxICsgcHJldkJ1Zk9mZnNldCk7XG4gICAgICBpID0gc2VxU3RhcnQ7IC8vIFRyeSB0byBwYXJzZSBhZ2FpbiwgYWZ0ZXIgc2tpcHBpbmcgZmlyc3QgYnl0ZSBvZiB0aGUgc2VxdWVuY2UgKCdpJyB3aWxsIGJlIGluY3JlbWVudGVkIGJ5ICdmb3InIGN5Y2xlKS5cblxuICAgICAgdUNvZGUgPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZS5jaGFyQ29kZUF0KDApO1xuICAgIH0gZWxzZSBpZiAodUNvZGUgPT09IEdCMTgwMzBfQ09ERSkge1xuICAgICAgdmFyIGN1clNlcSA9IHNlcVN0YXJ0ID49IDAgPyBidWYuc2xpY2Uoc2VxU3RhcnQsIGkgKyAxKSA6IHByZXZCdWYuc2xpY2Uoc2VxU3RhcnQgKyBwcmV2QnVmT2Zmc2V0LCBpICsgMSArIHByZXZCdWZPZmZzZXQpO1xuICAgICAgdmFyIHB0ciA9IChjdXJTZXFbMF0gLSAweDgxKSAqIDEyNjAwICsgKGN1clNlcVsxXSAtIDB4MzApICogMTI2MCArIChjdXJTZXFbMl0gLSAweDgxKSAqIDEwICsgKGN1clNlcVszXSAtIDB4MzApO1xuICAgICAgdmFyIGlkeCA9IGZpbmRJZHgodGhpcy5nYjE4MDMwLmdiQ2hhcnMsIHB0cik7XG4gICAgICB1Q29kZSA9IHRoaXMuZ2IxODAzMC51Q2hhcnNbaWR4XSArIHB0ciAtIHRoaXMuZ2IxODAzMC5nYkNoYXJzW2lkeF07XG4gICAgfSBlbHNlIGlmICh1Q29kZSA8PSBOT0RFX1NUQVJUKSB7XG4gICAgICAvLyBHbyB0byBuZXh0IHRyaWUgbm9kZS5cbiAgICAgIG5vZGVJZHggPSBOT0RFX1NUQVJUIC0gdUNvZGU7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKHVDb2RlIDw9IFNFUV9TVEFSVCkge1xuICAgICAgLy8gT3V0cHV0IGEgc2VxdWVuY2Ugb2YgY2hhcnMuXG4gICAgICB2YXIgc2VxID0gdGhpcy5kZWNvZGVUYWJsZVNlcVtTRVFfU1RBUlQgLSB1Q29kZV07XG5cbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc2VxLmxlbmd0aCAtIDE7IGsrKykge1xuICAgICAgICB1Q29kZSA9IHNlcVtrXTtcbiAgICAgICAgbmV3QnVmW2orK10gPSB1Q29kZSAmIDB4RkY7XG4gICAgICAgIG5ld0J1ZltqKytdID0gdUNvZGUgPj4gODtcbiAgICAgIH1cblxuICAgICAgdUNvZGUgPSBzZXFbc2VxLmxlbmd0aCAtIDFdO1xuICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJpY29udi1saXRlIGludGVybmFsIGVycm9yOiBpbnZhbGlkIGRlY29kaW5nIHRhYmxlIHZhbHVlIFwiICsgdUNvZGUgKyBcIiBhdCBcIiArIG5vZGVJZHggKyBcIi9cIiArIGN1ckJ5dGUpOyAvLyBXcml0ZSB0aGUgY2hhcmFjdGVyIHRvIGJ1ZmZlciwgaGFuZGxpbmcgaGlnaGVyIHBsYW5lcyB1c2luZyBzdXJyb2dhdGUgcGFpci5cblxuXG4gICAgaWYgKHVDb2RlID4gMHhGRkZGKSB7XG4gICAgICB1Q29kZSAtPSAweDEwMDAwO1xuICAgICAgdmFyIHVDb2RlTGVhZCA9IDB4RDgwMCArIE1hdGguZmxvb3IodUNvZGUgLyAweDQwMCk7XG4gICAgICBuZXdCdWZbaisrXSA9IHVDb2RlTGVhZCAmIDB4RkY7XG4gICAgICBuZXdCdWZbaisrXSA9IHVDb2RlTGVhZCA+PiA4O1xuICAgICAgdUNvZGUgPSAweERDMDAgKyB1Q29kZSAlIDB4NDAwO1xuICAgIH1cblxuICAgIG5ld0J1ZltqKytdID0gdUNvZGUgJiAweEZGO1xuICAgIG5ld0J1ZltqKytdID0gdUNvZGUgPj4gODsgLy8gUmVzZXQgdHJpZSBub2RlLlxuXG4gICAgbm9kZUlkeCA9IDA7XG4gICAgc2VxU3RhcnQgPSBpICsgMTtcbiAgfVxuXG4gIHRoaXMubm9kZUlkeCA9IG5vZGVJZHg7XG4gIHRoaXMucHJldkJ1ZiA9IHNlcVN0YXJ0ID49IDAgPyBidWYuc2xpY2Uoc2VxU3RhcnQpIDogcHJldkJ1Zi5zbGljZShzZXFTdGFydCArIHByZXZCdWZPZmZzZXQpO1xuICByZXR1cm4gbmV3QnVmLnNsaWNlKDAsIGopLnRvU3RyaW5nKCd1Y3MyJyk7XG59O1xuXG5EQkNTRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmV0ID0gJyc7IC8vIFRyeSB0byBwYXJzZSBhbGwgcmVtYWluaW5nIGNoYXJzLlxuXG4gIHdoaWxlICh0aGlzLnByZXZCdWYubGVuZ3RoID4gMCkge1xuICAgIC8vIFNraXAgMSBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlci5cbiAgICByZXQgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgdmFyIGJ1ZiA9IHRoaXMucHJldkJ1Zi5zbGljZSgxKTsgLy8gUGFyc2UgcmVtYWluaW5nIGFzIHVzdWFsLlxuXG4gICAgdGhpcy5wcmV2QnVmID0gQnVmZmVyJDUuYWxsb2MoMCk7XG4gICAgdGhpcy5ub2RlSWR4ID0gMDtcbiAgICBpZiAoYnVmLmxlbmd0aCA+IDApIHJldCArPSB0aGlzLndyaXRlKGJ1Zik7XG4gIH1cblxuICB0aGlzLm5vZGVJZHggPSAwO1xuICByZXR1cm4gcmV0O1xufTsgLy8gQmluYXJ5IHNlYXJjaCBmb3IgR0IxODAzMC4gUmV0dXJucyBsYXJnZXN0IGkgc3VjaCB0aGF0IHRhYmxlW2ldIDw9IHZhbC5cblxuXG5mdW5jdGlvbiBmaW5kSWR4KHRhYmxlLCB2YWwpIHtcbiAgaWYgKHRhYmxlWzBdID4gdmFsKSByZXR1cm4gLTE7XG4gIHZhciBsID0gMCxcbiAgICAgIHIgPSB0YWJsZS5sZW5ndGg7XG5cbiAgd2hpbGUgKGwgPCByIC0gMSkge1xuICAgIC8vIGFsd2F5cyB0YWJsZVtsXSA8PSB2YWwgPCB0YWJsZVtyXVxuICAgIHZhciBtaWQgPSBsICsgTWF0aC5mbG9vcigociAtIGwgKyAxKSAvIDIpO1xuICAgIGlmICh0YWJsZVttaWRdIDw9IHZhbCkgbCA9IG1pZDtlbHNlIHIgPSBtaWQ7XG4gIH1cblxuICByZXR1cm4gbDtcbn1cblxudmFyIGRiY3NDb2RlYyA9IHtcbiAgX2RiY3M6IF9kYmNzXG59O1xuXG52YXIgc2hpZnRqaXMgPSBbXG5cdFtcblx0XHRcIjBcIixcblx0XHRcIlxcdTAwMDBcIixcblx0XHQxMjhcblx0XSxcblx0W1xuXHRcdFwiYTFcIixcblx0XHRcIu+9oVwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcIjgxNDBcIixcblx0XHRcIuOAgOOAgeOAgu+8jO+8juODu++8mu+8m++8n++8geOCm+OCnMK0772AwqjvvL7vv6PvvL/jg73jg77jgp3jgp7jgIPku53jgIXjgIbjgIfjg7zigJXigJDvvI/vvLzvvZ7iiKXvvZzigKbigKXigJjigJnigJzigJ3vvIjvvInjgJTjgJXvvLvvvL3vvZvvvZ3jgIhcIixcblx0XHQ5LFxuXHRcdFwi77yL77yNwrHDl1wiXG5cdF0sXG5cdFtcblx0XHRcIjgxODBcIixcblx0XHRcIsO377yd4omg77yc77ye4omm4omn4oie4oi04pmC4pmAwrDigLLigLPihIPvv6XvvITvv6Dvv6HvvIXvvIPvvIbvvIrvvKDCp+KYhuKYheKXi+KXj+KXjuKXh+KXhuKWoeKWoOKWs+KWsuKWveKWvOKAu+OAkuKGkuKGkOKGkeKGk+OAk1wiXG5cdF0sXG5cdFtcblx0XHRcIjgxYjhcIixcblx0XHRcIuKIiOKIi+KKhuKKh+KKguKKg+KIquKIqVwiXG5cdF0sXG5cdFtcblx0XHRcIjgxYzhcIixcblx0XHRcIuKIp+KIqO+/ouKHkuKHlOKIgOKIg1wiXG5cdF0sXG5cdFtcblx0XHRcIjgxZGFcIixcblx0XHRcIuKIoOKKpeKMkuKIguKIh+KJoeKJkuKJquKJq+KImuKIveKIneKIteKIq+KIrFwiXG5cdF0sXG5cdFtcblx0XHRcIjgxZjBcIixcblx0XHRcIuKEq+KAsOKZr+KZreKZquKAoOKAocK2XCJcblx0XSxcblx0W1xuXHRcdFwiODFmY1wiLFxuXHRcdFwi4pevXCJcblx0XSxcblx0W1xuXHRcdFwiODI0ZlwiLFxuXHRcdFwi77yQXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCI4MjYwXCIsXG5cdFx0XCLvvKFcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCI4MjgxXCIsXG5cdFx0XCLvvYFcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCI4MjlmXCIsXG5cdFx0XCLjgYFcIixcblx0XHQ4MlxuXHRdLFxuXHRbXG5cdFx0XCI4MzQwXCIsXG5cdFx0XCLjgqFcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCI4MzgwXCIsXG5cdFx0XCLjg6BcIixcblx0XHQyMlxuXHRdLFxuXHRbXG5cdFx0XCI4MzlmXCIsXG5cdFx0XCLOkVwiLFxuXHRcdDE2LFxuXHRcdFwizqNcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcIjgzYmZcIixcblx0XHRcIs6xXCIsXG5cdFx0MTYsXG5cdFx0XCLPg1wiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiODQ0MFwiLFxuXHRcdFwi0JBcIixcblx0XHQ1LFxuXHRcdFwi0IHQllwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcIjg0NzBcIixcblx0XHRcItCwXCIsXG5cdFx0NSxcblx0XHRcItGR0LZcIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcIjg0ODBcIixcblx0XHRcItC+XCIsXG5cdFx0MTdcblx0XSxcblx0W1xuXHRcdFwiODQ5ZlwiLFxuXHRcdFwi4pSA4pSC4pSM4pSQ4pSY4pSU4pSc4pSs4pSk4pS04pS84pSB4pSD4pSP4pST4pSb4pSX4pSj4pSz4pSr4pS74pWL4pSg4pSv4pSo4pS34pS/4pSd4pSw4pSl4pS44pWCXCJcblx0XSxcblx0W1xuXHRcdFwiODc0MFwiLFxuXHRcdFwi4pGgXCIsXG5cdFx0MTksXG5cdFx0XCLihaBcIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcIjg3NWZcIixcblx0XHRcIuONieOMlOOMouONjeOMmOOMp+OMg+OMtuONkeONl+OMjeOMpuOMo+OMq+ONiuOMu+OOnOOOneOOnuOOjuOOj+OPhOOOoVwiXG5cdF0sXG5cdFtcblx0XHRcIjg3N2VcIixcblx0XHRcIuONu1wiXG5cdF0sXG5cdFtcblx0XHRcIjg3ODBcIixcblx0XHRcIuOAneOAn+KEluOPjeKEoeOKpFwiLFxuXHRcdDQsXG5cdFx0XCLjiLHjiLLjiLnjjb7jjb3jjbziiZLiiaHiiKviiK7iiJHiiJriiqXiiKDiiJ/iir/iiLXiiKniiKpcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ODlmXCIsXG5cdFx0XCLkupzllJblqIPpmL/lk4DmhJvmjKjlp7bpgKLokbXojJznqZDmgqrmj6HmuKXml63okaboiqbpr7XmopPlnKfmlqHmibHlrpvlp5Dombvpo7TntaLntr7pro7miJbnsp/oorflronlurXmjInmmpfmoYjpl4fpno3mnY/ku6XkvIrkvY3kvp3lgYnlm7LlpLflp5TlqIHlsInmg5/mhI/mhbDmmJPmpIXngrrnlY/nlbDnp7vntq3nt6/og4PokI7ooaPorILpgZXpgbrljLvkupXkuqXln5/ogrLpg4Hno6/kuIDlo7HmuqLpgLjnqLLojKjoiovpsK/lhYHljbDlkr3lk6Hlm6Dlp7vlvJXpo7Lmt6vog6TolK1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4OTQwXCIsXG5cdFx0XCLpmaLpmbDpmqDpn7vlkIvlj7Plrofng4/nvr3ov4Lpm6jlja/ptZznqrrkuJHnopPoh7zmuKblmJjllITmrJ3olJrpsLvlp6Xljqnmtabnk5zplo/lmYLkupHpgYvpm7LojY/ppIzlj6HllrblrLDlvbHmmKDmm7PmoITmsLjms7PmtKnnkZvnm4jnqY7poLToi7HooZvoqaDpi63mtrLnlqvnm4rpp4XmgqborIHotorplrLmpo7ljq3lhoZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OTgwXCIsXG5cdFx0XCLlnJLloLDlpYTlrrTlu7bmgKjmjqnmj7Tmsr/mvJTngo7nhJTnhZnnh5XnjL/nuIHoibboi5HolpfpgaDpiZvptJvloanmlrzmsZrnlKXlh7nlpK7lpaXlvoDlv5zmirzml7rmqKrmrKfmrrTnjovnv4HopZbptKzptI7pu4TlsqHmspbojbvlhITlsYvmhrboh4bmobbniaHkuZnkv7rljbjmganmuKnnqY/pn7PkuIvljJbku67kvZXkvL3kvqHkvbPliqDlj6/lmInlpI/lq4Hlrrblr6Hnp5HmmofmnpzmnrbmrYzmsrPngavnj4Lnpo3npr7nqLznrofoirHoi5vojITojbfoj6/oj5PonaboqrLlmKnosqjov6bpgY7pnJ7omorkv4Tls6jmiJHniZnnlLvoh6Xoir3om77os4Dpm4XppJPpp5Xku4vkvJrop6Plm57loYrlo4rlu7vlv6vmgKrmgpTmgaLmh5DmiJLmi5DmlLlcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YTQwXCIsXG5cdFx0XCLprYHmmabmorDmtbfngbDnlYznmobntbXoiqXon7nplovpmo7osp3lh7Hlir7lpJblkrPlrrPltJbmhajmpoLmtq/noo3ok4vooZfoqbLpjqfpqrjmtazppqjom5nlnqPmn7/om47piI7lioPlmoflkITlu5Pmi6HmkrnmoLzmoLjmrrvnjbLnorrnqavopprop5LotavovIPpg63plqPpmpTpnanlrablsrPmpb3poY3poY7mjpvnrKDmqKtcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YTgwXCIsXG5cdFx0XCLmqb/morbpsI3mvZ/libLllp3mgbDmi6zmtLvmuIfmu5HokZvopJDovYTkuJTpsLnlj7bmpJvmqLrpnoTmoKrlhZznq4PokrLph5zpjozlmZvptKjmoKLojIXokLHnsqXliIjoi4Xnk6bkub7kvoPlhqDlr5LliIrli5jli6flt7vllprloKrlp6blrozlrpjlr5vlubLlubnmgqPmhJ/mhaPmhr7mj5vmlaLmn5HmoZPmo7rmrL7mrZPmsZfmvKLmvpfmvYXnkrDnlJjnm6PnnIvnq7/nrqHnsKHnt6nnvLbnv7Dogp3oiabojp7oprPoq4zosqvpgoTpkZHplpPplpHplqLpmaXpn5PppKjoiJjkuLjlkKvlsrjlt4znjqnnmYznnLzlsqnnv6votIvpm4HpoJHpoZTpoZjkvIHkvI7ljbHllpzlmajln7rlpYflrInlr4TlspDluIzlub7lv4zmj67mnLrml5fml6LmnJ/mo4vmo4RcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YjQwXCIsXG5cdFx0XCLmqZ/luLDmr4XmsJfmsb3nlb/npYjlraPnqIDntIDlvr3opo/oqJjosrTotbfou4zovJ3po6LpqI7prLzkuoDlgb3lhIDlppPlrpzmiK/mioDmk6zmrLrniqDnlpHnpYfnvqnon7voqrzorbDmjqzoj4rpnqDlkInlkIPllqvmoZTmqZjoqbDnoKfmnbXpu43ljbTlrqLohJromZDpgIbkuJjkuYXku4fkvJHlj4rlkLjlrq7lvJPmgKXmlZFcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YjgwXCIsXG5cdFx0XCLmnL3msYLmsbLms6PngbjnkIPnqbbnqq7nrIjntJrns77ntabml6fniZvljrvlsYXlt6jmi5Lmi6DmjJnmuKDomZroqLHot53pi7jmvIHnpqbprZrkuqjkuqvkuqzkvpvkvqDlg5HlhYfnq7blhbHlh7bljZTljKHljb/lj6vllqzlooPls6HlvLflvYrmgK/mgZDmga3mjJ/mlZnmqYvms4Hni4Lni63nn6/og7johIXoiIjolY7pg7fpj6Hpn7/ppZfpqZrku7Dlh53lsK3mmoHmpa3lsYDmm7LmpbXnjonmoZDnsoHlg4Xli6TlnYflt77pjKbmlqTmrKPmrL3nkLTnpoHnpr3nrYvnt4roirnoj4zoob/opZ/orLnov5Hph5HlkJ/pioDkuZ3lgLblj6XljLrni5fnjpbnn6noi6bouq/pp4bpp4jpp5LlhbfmhJromZ7llrDnqbrlgbblr5PpgYfpmoXkuLLmq5vph6flsZHlsYhcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YzQwXCIsXG5cdFx0XCLmjpjnqp/mspPpnbTovaHnqqrnhorpmojnsoLmoJfnubDmoZHpjazli7LlkJvolqvoqJPnvqTou43pg6HljabooojnpYHkv4Llgr7liJHlhYTllZPlnK3nj6rlnovlpZHlvaLlvoTmgbXmhbbmhafmhqnmjrLmkLrmlazmma/moYLmuJPnlabnqL3ns7vntYzntpnnuYvnvavojI7ojYrom43oqIjoqaPorabou73poJrpto/oirjov47pr6hcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YzgwXCIsXG5cdFx0XCLliofmiJ/mkoPmv4DpmpnmoYHlgpHmrKDmsbrmvZTnqbTntZDooYDoqKPmnIjku7blgLnlgKblgaXlhbzliLjliaPllqflnI/loIXlq4zlu7rmhrLmh7jmi7PmjbLmpJzmqKnnib3niqznjK7noJTnoa/ntbnnnIzogqnopovorJnos6Lou5LpgaPpjbXpmbrpoZXpqJPpubjlhYPljp/ljrPlubvlvKbmuJvmupDnjoTnj77ntYPoiLfoqIDoq7rpmZDkuY7lgIvlj6Tlkbzlm7rlp5HlraTlt7HluqvlvKfmiLjmlYXmnq/muZbni5Dns4roorTogqHog6Hoj7DomY7oqofot6jpiLfpm4fpoafpvJPkupTkupLkvI3ljYjlkYnlkL7lqK/lvozlvqHmgp/moqfmqo7nkZrnooHoqp7oqqTorbfphpDkuZ7pr4nkuqTkvbzkvq/lgJnlgJblhYnlhazlip/lirnli77ljprlj6PlkJFcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZDQwXCIsXG5cdFx0XCLlkI7llonlnZHlnqLlpb3lrZTlrZ3lro/lt6Xlt6flt7flubjluoPluprlurflvJjmgZLmhYzmipfmi5jmjqfmlLvmmILmmYPmm7Tmna3moKHmopfmp4vmsZ/mtKrmtanmuK/mup3nlLLnmofnoaznqL/ns6DntIXntJjntZ7ntrHogJXogIPogq/ogrHohZToho/oiKrojZLooYzooaHorJvosqLos7zpg4rphbXpibHnoL/pi7zplqTpmY1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZDgwXCIsXG5cdFx0XCLpoIXpppnpq5jptLvliZvliqvlj7flkIjlo5Xmi7fmv6DosarovZ/purnlhYvliLvlkYrlm73nqYDphbfptaDpu5LnjYTmvInohbDnlJHlv73mg5rpqqjni5vovrzmraTpoIPku4rlm7DlnaTlor7lqZrmgajmh4fmmI/mmIbmoLnmorHmt7fnl5XntLroia7prYLkupvkvZDlj4nllIblta/lt6blt67mn7vmspnnkbPnoILoqZDpjpboo5/lnZDluqfmjKvlgrXlgqzlho3mnIDlk4nloZ7lprvlrrDlvanmiY3mjqHmoL3mrbPmuIjngb3ph4fnioDnoJXnoKbnpa3mlo7ntLDoj5zoo4HovInpmpvliaTlnKjmnZDnvarosqHlhrTlnYLpmKrloLrmporogrTlkrLltI7ln7znopXpt7rkvZzliYrlkovmkL7mmKjmnJTmn7XnqoTnrZbntKLpjK/moZzprq3nrLnljJnlhorliLdcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZTQwXCIsXG5cdFx0XCLlr5/mi7bmkq7mk6bmnK3mrrrolqnpm5HnmpDpr5bmjYzpjIbprqvnmr/mmZLkuInlgpjlj4LlsbHmg6jmkpLmlaPmoZ/nh6bnj4rnlKPnrpfnuoLompXoroPos5vphbjppJDmlqzmmqvmrovku5Xku5TkvLrkvb/liLrlj7jlj7Lll6Plm5vlo6vlp4vlp4nlp7/lrZDlsY3luILluKvlv5fmgJ3mjIfmlK/lrZzmlq/mlr3ml6jmnp3mraJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZTgwXCIsXG5cdFx0XCLmrbvmsI/njYXnpYnnp4Hns7jntJnntKvogqLohILoh7PoppboqZ7oqanoqaboqozoq67os4fos5zpm4zpo7zmra/kuovkvLzkvo3lhZDlrZflr7rmhYjmjIHmmYLmrKHmu4vmsrvniL7nkr3nl5Tno4HnpLrogIzogLPoh6rokpTovp7msZDpub/lvI/orZjptKvnq7rou7jlro3pm6vkuIPlj7Hln7flpLHlq4nlrqTmgonmub/mvIbnlr7os6rlrp/olIDnr6DlgbLmn7Toip3lsaHolYrnuJ7oiI7lhpnlsITmjajotabmlpznha7npL7ntJfogIXorJ3ou4rpga7om4fpgqrlgJ/li7rlsLrmnZPngbzniLXphYzph4jpjKvoi6Xlr4LlvLHmg7nkuLvlj5blrojmiYvmnLHmrorni6nnj6DnqK7ohavotqPphZLpppblhJLlj5flkarlr7/mjojmqLnntqzpnIDlm5rlj47lkahcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZjQwXCIsXG5cdFx0XCLlrpflsLHlt57kv67mhIHmi77mtLLnp4Dnp4vntYLnuY3nv5Loh63oiJ/okpDooYbopbLorpDoubTovK/pgLHphYvphazpm4bphpzku4DkvY/lhYXljYHlvpPmiI7mn5TmsYHmuIvnjaPnuKbph43pioPlj5TlpJnlrr/mt5HnpZ3nuK7nspvlob7nhp/lh7rooZPov7Dkv4rls7vmmKXnnqznq6PoiJzpp7/lh4blvqrml6zmpa/mronmt7NcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZjgwXCIsXG5cdFx0XCLmupbmvaTnm77ntJTlt6HpgbXphofpoIblh6bliJ3miYDmmpHmm5nmuJrlurbnt5LnvbLmm7jolq/ol7foq7jliqnlj5nlpbPluo/lvpDmgZXpi6TpmaTlgrflhJ/li53ljKDljYflj6zlk6jllYbllLHlmJflpajlpr7lqLzlrrXlsIblsI/lsJHlsJrluoTluorlu6DlvbDmib/mioTmi5vmjozmjbfmmIfmmIzmmK3mmbbmnb7moqLmqJ/mqLXmsrzmtojmuInmuZjnhLznhKbnhafnl4fnnIHnoZ3npIHnpaXnp7Dnq6DnrJHnsqfntLnogpboj5bokovolYnooZ3oo7PoqJ/oqLzoqZToqbPosaHos57phqTpiabpjb7pkJjpmpzpnpjkuIrkuIjkuJ7kuZflhpflibDln47loLTlo4zlrKLluLjmg4Xmk77mnaHmnZbmtYTnirbnlbPnqaPokrjorbLphrjpjKDlmLHln7Tpo75cIlxuXHRdLFxuXHRbXG5cdFx0XCI5MDQwXCIsXG5cdFx0XCLmi63mpI3mrpbnh63nuZTogbfoibLop6bpo5/onZXovrHlsLvkvLjkv6HkvrXllIflqKDlr53lr6nlv4PmhY7mjK/mlrDmmYvmo67mppvmtbjmt7HnlLPnlrnnnJ/npZ7np6bntLPoh6Poiq/olqropqroqLrouqvovpvpgLLph53pnIfkurrku4HliIPlobXlo6zlsIvnlJrlsL3ohY7oqIrov4XpmaPpna3nrKXoq4/poIjphaLlm7PljqhcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MDgwXCIsXG5cdFx0XCLpgJflkLnlnoLluKXmjqjmsLTngornnaHnsovnv6DoobDpgYLphZTpjJDpjJjpmo/nkZ7pq4TltIfltanmlbDmnqLotqjpm5vmja7mnYnmpJnoj4XpoJfpm4Doo77mvoTmkbrlr7jkuJbngKznlZ3mmK/lh4TliLbli6Llp5PlvoHmgKfmiJDmlL/mlbTmmJ/mmbTmo7LmoJbmraPmuIXnibLnlJ/nm5vnsr7ogZblo7Doo73opb/oqqDoqpPoq4vpgJ3phpLpnZLpnZnmlonnqI7ohIbpmrvluK3mg5zmiJrmlqXmmJTmnpDnn7PnqY3nsY3nuL7ohIrosqzotaTot6HouZ/noqnliIfmi5nmjqXmkYLmipjoqK3nqoPnr4Doqqzpm6rntbboiIzonYnku5nlhYjljYPljaDlrqPlsILlsJblt53miKbmiYfmkrDmoJPmoLTms4nmtYXmtJfmn5PmvZznhY7nhb3ml4vnqb/nrq3nt5pcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MTQwXCIsXG5cdFx0XCLnuYrnvqjohbroiJvoiLnolqboqa7os47ot7Xpgbjpgbfpiq3pipHploPprq7liY3lloTmvLjnhLblhajnpoXnuZXohrPns47lmYzloZHlsqjmjqrmm77mm73mpZrni5nnlo/nlo7npI7npZbnp5/nspfntKDntYTomIfoqLTpmLvpgaHpvKDlg6flibXlj4zlj6LlgInllqrlo67lpY/niL3lrovlsaTljJ3mg6Pmg7PmjZzmjoPmjL/mjrtcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MTgwXCIsXG5cdFx0XCLmk43ml6nmm7nlt6Pmp43mp73mvJXnh6Xkuonnl6nnm7jnqpPns5/nt4/ntpzogaHojYnojZjokazokrzol7voo4XotbDpgIHpga3pjpfpnJzpqJLlg4/lopfmho7oh5PolLXotIjpgKDkv4PlgbTliYfljbPmga/mjYnmnZ/muKzotrPpgJ/kv5flsZ7os4rml4/ntprljZLoopblhbbmj4PlrZjlravlsIrmkI3mnZHpgZzku5blpJrlpKrmsbDoqZHllL7loJXlpqXmg7DmiZPmn4HoiLXmpZXpmYDpp4TpqKjkvZPloIblr77ogJDlsrHluK/lvoXmgKDmhYvmiLTmm7/ms7Dmu57og47ohb/oi5TooovosrjpgIDpgK7pmorpu5vpr5vku6Plj7DlpKfnrKzpho3poYzpt7nmu53ngKfljZPllYTlroXmiZjmip7mi5PmsqLmv6/nkKLoqJfpkLjmv4Hoq77ojLjlh6fom7jlj6pcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MjQwXCIsXG5cdFx0XCLlj6nkvYbpgZTovrDlparohLHlt73nq6rovr/mo5rosLfni7jpsYjmqL3oqrDkuLnljZjlmIblnabmi4XmjqLml6bmrY7mt6HmuZvngq3nn63nq6/nrqrntrvogL3og4bom4voqpXpjZvlm6Plo4flvL7mlq3mmpbmqoDmrrXnlLfoq4flgKTnn6XlnLDlvJvmgaXmmbrmsaDnl7TnqJrnva7oh7TonJjpgYXpprPnr4nnlZznq7nnrZHok4RcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MjgwXCIsXG5cdFx0XCLpgJDnp6nnqpLojLblq6HnnYDkuK3ku7Llrpnlv6Dmir3mmLzmn7Hms6jomavoobfoqLvphY7pi7Ppp5DmqJfngKbnjKroi6fokZfosq/kuIHlhYblh4vllovlr7XluJbluLPluoHlvJTlvLXlvavlvrTmh7LmjJHmmqLmnJ3mva7niZLnlLrnnLrogbTohLnohbjonbboqr/oq5zotoXot7PpiprplbfpoILps6Xli4XmjZfnm7TmnJXmsojnj43os4Ppjq7pmbPmtKXlopzmpI7mp4zov73pjprnl5vpgJrloZrmoILmjrTmp7vkvYPmvKzmn5jovrvolKbntrTpjZTmpL/mvbDlnarlo7flrKzntKzniKrlkIrph6PptrTkuq3kvY7lgZzlgbXliYPosp7lkYjloKTlrprluJ3lupXluq3lu7flvJ/mgozmirXmjLrmj5Dmoq/msYDnoofnpo7nqIvnt6DoiYfoqILoq6bouYTpgJNcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MzQwXCIsXG5cdFx0XCLpgrjphK3ph5jpvI7ms6XmkZjmk6LmlbXmu7TnmoTnrJvpganpj5Hmurrlk7LlvrnmkqTovY3ov63piYTlhbjloavlpKnlsZXlupfmt7vnuo/nlJzosrzou6LpoZvngrnkvJ3mrr/mvrHnlLDpm7vlhY7lkJDloLXloZflpqzlsaDlvpLmlpfmnZzmuKHnmbvoj5/os63pgJTpg73pjY3noKXnoLrliqrluqblnJ/lpbTmgJLlgJLlhZrlhqxcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MzgwXCIsXG5cdFx0XCLlh43liIDllJDloZTloZjlpZflrpXls7bltovmgrzmipXmkK3mnbHmoYPmorzmo5/nm5fmt5jmua/mtpvnga/nh4jlvZPnl5jnpbfnrYnnrZTnrZLns5bntbHliLDokaPolanol6ToqI7orITosYbouI/pgIPpgI/pkJnpmbbpoK3pqLDpl5jlg43li5XlkIzloILlsI7mhqfmkp7mtJ7nnrPnq6Xog7TokITpgZPpioXls6DptIfljL/lvpflvrPmtpznibnnnaPnpr/nr6Tmr5Lni6zoqq3moIPmqaHlh7jnqoHmpLTlsYrps7boi6vlr4XphYnngJ7lmbjlsa/mg4fmlabmsozosZrpgYHpoJPlkZHmm4fpiI3lpYjpgqPlhoXkuY3lh6rolpnorI7ngZjmjbrpjYvmpaLpprTnuITnlbfljZfmpaDou5/pm6PmsZ3kuozlsLzlvJDov6nljILos5Hogonombnlu7/ml6XkubPlhaVcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NDQwXCIsXG5cdFx0XCLlpoLlsL/pn67ku7vlporlv43oqo3mv6HnprDnpaLlr6fokbHnjKvnhrHlubTlv7Xmjbvmkprnh4PnspjkuYPlu7zkuYvln5zlmqLmgqnmv4PntI3og73ohLPohr/ovrLoppfomqTlt7Tmiormkq3opofmnbfms6LmtL7nkLbnoLTlqYbnvbXoiq3ppqzkv7Plu4Pmi53mjpLmlZfmna/nm4PniYzog4zogrrovKnphY3lgI3ln7nlqpLmooVcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NDgwXCIsXG5cdFx0XCLmpbPnhaTni73osrflo7Los6DpmarpgJnonb/np6Tnn6fokKnkvK/liaXljZrmi43mn4/ms4rnmb3nrpTnspXoiLboloTov6vmm53mvKDniIbnuJvojqvpp4Hpuqblh73nrrHnobLnrrjogofnrYjmq6jluaHogoznlZHnlaDlhavpiaLmuoznmbrphpfpq6rkvJDnvbDmipznrY/plqXps6nlmbrloZnom6TpmrzkvLTliKTljYrlj43lj5vluIbmkKzmlpHmnb/msL7msY7niYjniq/nj63nlZTnuYHoiKzol6nosqnnr4Tph4bnhanpoJLpo6/mjL3mmannlarnm6Tno5DolYPom67ljKrljZHlkKblpoPluoflvbzmgrLmiYnmibnmiqvmlpDmr5Tms4znlrLnmq7nopHnp5jnt4vnvbfogqXooqvoqrnosrvpgb/pnZ7po5vmqIvnsLjlgpnlsL7lvq7mnofmr5jnkLXnnInnvo5cIlxuXHRdLFxuXHRbXG5cdFx0XCI5NTQwXCIsXG5cdFx0XCLpvLvmn4rnqJfljLnnlovpq63lvabohp3oj7HogpjlvLzlv4XnlaLnrYbpgLzmoaflp6vlqpvntJDnmb7orKzkv7XlvarmqJnmsLfmvILnk6LnpajooajoqZXosbnlu5/mj4/nl4Xnp5Loi5fpjKjpi7Lokpzom63psK3lk4HlvazmlozmtZzngJXosqfos5PpoLvmlY/nk7bkuI3ku5jln6DlpKvlqablr4zlhqjluIPlupzmgJbmibbmlbdcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NTgwXCIsXG5cdFx0XCLmlqfmma7mta7niLbnrKbohZDohproipnorZzosqDos6botbTpmJzpmYTkvq7mkqvmraboiJ7okaHolarpg6jlsIHmpZPpoqjokbrolZfkvI/lia/lvqnluYXmnI3npo/ohbnopIfopobmt7XlvJfmiZXmsrjku4/nianprpLliIblkLvlmbTlorPmhqTmia7nhJrlpa7nsonns57ntJvpm7DmlofogZ7kuJnkvbXlhbXloYDluaPlubPlvIrmn4TkuKbolL3plonpmZvnsbPpoIHlg7vlo4HnmZbnoqfliKXnnqXolJHnroblgY/lpInniYfnr4fnt6jovrrov5TpgY3kvr/li4nlqKnlvIHpnq3kv53oiJfpi6rlnIPmjZXmrannlKvoo5zovJTnqYLli5/lopPmhZXmiIrmmq7mr43nsL/oj6nlgKPkv7jljIXlkYbloLHlpYnlrp3ls7Dls6/ltKnlupbmirHmjafmlL7mlrnmnItcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NjQwXCIsXG5cdFx0XCLms5Xms6Hng7nnoLLnuKvog57oirPokIzok6zonILopJLoqKrosYrpgqbpi5Lpo73ps7PptazkuY/kuqHlgo3liZblnYrlpqjluL3lv5jlv5nmiL/mmrTmnJvmn5Dmo5LlhpLntKHogqrohqjorIDosozosr/pib7pmLLlkKDpoKzljJflg5XljZzloqjmkrLmnLTniafnnabnqYbph6bli4PmsqHmrobloIDluYzlpZTmnKznv7vlh6Hnm4ZcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NjgwXCIsXG5cdFx0XCLmkanno6jprZTpurvln4vlprnmmKfmnprmr47lk6nmp5nluZXohpzmnpXprqrmn77psZLmoZ3kuqbkv6Plj4jmirnmnKvmsqvov4Tkvq3nua3pur/kuIfmhaLmuoDmvKvolJPlkbPmnKrprYXlt7PnrpXlsqzlr4bonJzmuYrok5HnqJTohIjlppnnso3msJHnnKDli5nlpKLnhKHniZ/nn5vpnKfptaHmpIvlqb/lqJjlhqXlkI3lkb3mmI7nm5/ov7fpipjps7Tlp6rniZ3mu4XlhY3mo4nntr/nt6zpnaLpurrmkbjmqKHojILlpoTlrZ/mr5vnjJvnm7LntrLogJfokpnlhLLmnKjpu5nnm67mnaLli7/ppIXlsKTmiLvnsb7osrDllY/mgrbntIvploDljIHkuZ/lhrblpJzniLrogLbph47lvKXnn6LljoTlvbnntITolqzoqLPouo3pnZbmn7Polq7pkZPmhInmhIjmsrnnmZJcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NzQwXCIsXG5cdFx0XCLoq63ovLjllK/kvZHlhKrli4flj4vlrqXlub3mgqDmhoLmj5bmnInmn5rmuafmtoznjLbnjLfnlLHnpZDoo5XoqpjpgYrpgpHpg7Xpm4Tono3lpJXkuojkvZnkuI7oqonovL/poJDlgq3lubzlppblrrnlurjmj5rmj7rmk4Hmm5zmpYrmp5jmtIvmurbnhpTnlKjnqq/nvorogIDokYnok4nopoHorKHouIrpgaXpmb3ppIrmhb7mipHmrLJcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NzgwXCIsXG5cdFx0XCLmsoPmtbTnv4znv7zmt4DnvoXonrroo7jmnaXojrHpoLzpm7fmtJvntaHokL3pharkubHljbXltZDmrITmv6vol43omK3opqfliKnlkI/lsaXmnY7moqjnkIbnkoPnl6Loo4/oo6Hph4zpm6Lpmbjlvovnjofnq4vokY7mjqDnlaXlionmtYHmupznkInnlZnnoavnspLpmobnq5zpvo3kvrbmha7ml4XomZzkuobkuq7lg5rkuKHlh4zlr67mlpnmooHmtrznjJ/nmYLnnq3nqJzns6foia/oq5Lpgbzph4/pmbXpoJjlipvnt5HlgKvljpjmnpfmt4vnh5DnkLPoh6jovKrpmqPpsZfpup/nkaDloYHmtpnntK/poZ7ku6TkvLbkvovlhrflirHltrrmgJznjrLnpLzoi5PpiLTpmrfpm7bpnIrpupfpvaLmmqbmrbTliJfliqPng4joo4Llu4nmgYvmhpDmvKPnhYnnsL7nt7Toga9cIlxuXHRdLFxuXHRbXG5cdFx0XCI5ODQwXCIsXG5cdFx0XCLok67pgKPpjKzlkYLpra/mq5Pngonos4Lot6/pnLLlirTlqYHlu4rlvITmnJfmpbzmppTmtarmvI/niaLni7znr63ogIHogb7onYvpg47lha3pupPnpoTogovpjLLoq5blgK3lkozoqbHmraros4TohIfmg5HmnqDpt7LkupnkupjpsJDoqavol4HolajmpIDmub7nopfohZVcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ODlmXCIsXG5cdFx0XCLlvIzkuJDkuJXkuKrkuLHkuLbkuLzkuL/kuYLkuZbkuZjkuoLkuoXosavkuoroiJLlvI3kuo7kup7kup/kuqDkuqLkurDkurPkurbku47ku43ku4Tku4bku4Lku5fku57ku63ku5/ku7fkvInkvZrkvLDkvZvkvZ3kvZfkvYfkvbbkvojkvo/kvpjkvbvkvankvbDkvpHkva/kvobkvpblhJjkv5Tkv5/kv47kv5jkv5vkv5Hkv5rkv5Dkv6Tkv6XlgJrlgKjlgJTlgKrlgKXlgIXkvJzkv7blgKHlgKnlgKzkv77kv6/lgJHlgIblgYPlgYfmnIPlgZXlgZDlgYjlgZrlgZblgazlgbjlgoDlgprlgoXlgrTlgrJcIlxuXHRdLFxuXHRbXG5cdFx0XCI5OTQwXCIsXG5cdFx0XCLlg4nlg4rlgrPlg4Llg5blg57lg6Xlg63lg6Plg67lg7nlg7XlhInlhIHlhILlhJblhJXlhJTlhJrlhKHlhLrlhLflhLzlhLvlhL/lhYDlhZLlhYzlhZTlhaLnq7jlhanlharlha7lhoDlhoLlm5jlhozlhonlho/lhpHlhpPlhpXlhpblhqTlhqblhqLlhqnlhqrlhqvlhrPlhrHlhrLlhrDlhrXlhr3lh4Xlh4nlh5vlh6DomZXlh6nlh61cIlxuXHRdLFxuXHRbXG5cdFx0XCI5OTgwXCIsXG5cdFx0XCLlh7Dlh7Xlh77liITliIvliJTliI7liKfliKrliK7liLPliLnliY/liYTliYvliYzliZ7liZTliarlibTlianlibPlib/lib3lio3lipTlipLlibHliojlipHovqjovqfliqzliq3lirzlirXli4Hli43li5fli57li6Pli6bpo63li6Dli7Pli7Xli7jli7nljIbljIjnlLjljI3ljJDljI/ljJXljJrljKPljK/ljLHljLPljLjljYDljYbljYXkuJfljYnljY3lh5bljZ7ljanlja7lpJjljbvljbfljoLljpbljqDljqbljqXljq7ljrDljrblj4PnsJLpm5nlj5/mm7znh67lj67lj6jlj63lj7rlkIHlkL3lkYDlkKzlkK3lkLzlkK7lkLblkKnlkJ3lkY7lko/lkbXlko7lkZ/lkbHlkbflkbDlkpLlkbvlkoDlkbblkoTlkpDlkoblk4flkqLlkrjlkqXlkqzlk4Tlk4jlkqhcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YTQwXCIsXG5cdFx0XCLlkqvlk4LlkqTlkr7lkrzlk5jlk6Xlk6bllI/llJTlk73lk67lk63lk7rlk6LllLnllYDllaPllYzllK7llZzllYXllZbllZfllLjllLPllZ3llpnlloDlkq/llorllp/llbvllb7llpjllp7llq7llbzlloPllqnllofllqjll5rll4Xll5/ll4Tll5zll6Tll5TlmJTll7flmJbll77ll73lmJvll7nlmY7lmZDnh5/lmLTlmLblmLLlmLhcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YTgwXCIsXG5cdFx0XCLlmavlmaTlmK/lmazlmarlmoblmoDlmorlmqDlmpTlmo/lmqXlmq7lmrblmrTlm4Llmrzlm4Hlm4Plm4Dlm4jlm47lm5Hlm5Plm5flm67lm7nlnIDlm7/lnITlnInlnIjlnIvlnI3lnJPlnJjlnJbll4flnJzlnKblnLflnLjlnY7lnLvlnYDlnY/lnanln4DlnojlnaHlnb/lnonlnpPlnqDlnrPlnqTlnqrlnrDln4Pln4bln5Tln5Lln5PloIrln5bln6PloIvloJnloJ3lobLloKHloaLloYvlobDmr4DloZLloL3lobnlooXlornlop/loqvlorrlo57lorvlorjloq7lo4Xlo5Plo5Hlo5flo5nlo5jlo6Xlo5zlo6Tlo5/lo6/lo7rlo7nlo7vlo7zlo73lpILlpIrlpJDlpJvmoqblpKXlpKzlpK3lpLLlpLjlpL7nq5LlpZXlpZDlpY7lpZrlpZjlpaLlpaDlpaflpazlpalcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YjQwXCIsXG5cdFx0XCLlpbjlpoHlpp3kvZ7kvqvlpqPlprLlp4blp6jlp5zlpo3lp5nlp5rlqKXlqJ/lqJHlqJzlqInlqJrlqYDlqazlqYnlqLXlqLblqaLlqarlqprlqrzlqr7lq4vlq4Llqr3lq6Plq5flq6blq6nlq5blq7rlq7vlrIzlrIvlrJblrLLlq5DlrKrlrLblrL7lrYPlrYXlrYDlrZHlrZXlrZrlrZvlraXlranlrbDlrbPlrbXlrbjmlojlrbrlroBcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YjgwXCIsXG5cdFx0XCLlroPlrqblrrjlr4Plr4flr4nlr5Tlr5Dlr6Tlr6blr6Llr57lr6Xlr6vlr7Dlr7blr7PlsIXlsIflsIjlsI3lsJPlsKDlsKLlsKjlsLjlsLnlsYHlsYblsY7lsZPlsZDlsY/lrbHlsazlsa7kuaLlsbblsbnlsozlspHlspTlppvlsqvlsrvlsrblsrzlsrfls4Xlsr7ls4fls5nls6nls73ls7rls63ltozls6rltIvltJXltJfltZzltJ/ltJvltJHltJTltKLltJrltJnltJjltYzltZLltY7ltYvltazltbPltbbltofltoTltoLltqLltp3ltqzltq7ltr3ltpDltrfltrzlt4nlt43lt5Plt5Llt5blt5vlt6vlt7Llt7XluIvluJrluJnluJHluJvluLbluLfluYTluYPluYDluY7luZfluZTluZ/luaLluaTluYflubXlubblubrpurzlub/luqDlu4Hlu4Llu4jlu5Dlu49cIlxuXHRdLFxuXHRbXG5cdFx0XCI5YzQwXCIsXG5cdFx0XCLlu5blu6Plu53lu5rlu5vlu6Llu6Hlu6jlu6nlu6zlu7Hlu7Plu7Dlu7Tlu7jlu77lvIPlvInlvZ3lvZzlvIvlvJHlvJblvKnlvK3lvLjlvYHlvYjlvYzlvY7lvK/lvZHlvZblvZflvZnlvaHlva3lvbPlvbflvoPlvoLlvb/lvorlvojlvpHlvoflvp7lvpnlvpjlvqDlvqjlvq3lvrzlv5blv7vlv6Tlv7jlv7Hlv53mgrPlv7/mgKHmgaBcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YzgwXCIsXG5cdFx0XCLmgJnmgJDmgKnmgI7mgLHmgJvmgJXmgKvmgKbmgI/mgLrmgZrmgYHmgarmgbfmgZ/mgYrmgYbmgY3mgaPmgYPmgaTmgYLmgazmgavmgZnmgoHmgo3mg6fmgoPmgprmgoTmgpvmgpbmgpfmgpLmgqfmgovmg6Hmgrjmg6Dmg5PmgrTlv7Dmgr3mg4bmgrXmg5jmhY3mhJXmhIbmg7bmg7fmhIDmg7Tmg7rmhIPmhKHmg7vmg7HmhI3mhI7mhYfmhL7mhKjmhKfmhYrmhL/mhLzmhKzmhLTmhL3mhYLmhYTmhbPmhbfmhZjmhZnmhZrmhavmhbTmha/mhaXmhbHmhZ/mhZ3mhZPmhbXmhpnmhpbmhofmhqzmhpTmhprmhormhpHmhqvmhq7mh4zmh4rmh4nmh7fmh4jmh4Pmh4bmhrrmh4vnvbnmh43mh6bmh6Pmh7bmh7rmh7Tmh7/mh73mh7zmh77miIDmiIjmiInmiI3miIzmiJTmiJtcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZDQwXCIsXG5cdFx0XCLmiJ7miKHmiKrmiK7miLDmiLLmiLPmiYHmiY7miZ7miaPmiZvmiaDmiajmibzmioLmionmib7mipLmipPmipbmi5TmioPmipTmi5fmi5Hmirvmi4/mi7/mi4bmk5Tmi4jmi5zmi4zmi4rmi4Lmi4fmipvmi4nmjIzmi67mi7HmjKfmjILmjIjmi6/mi7XmjZDmjL7mjY3mkJzmjY/mjpbmjo7mjoDmjqvmjbbmjqPmjo/mjonmjp/mjrXmjatcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZDgwXCIsXG5cdFx0XCLmjanmjr7mj6nmj4Dmj4bmj6Pmj4nmj5Lmj7bmj4TmkJbmkLTmkIbmkJPmkKbmkLbmlJ3mkJfmkKjmkI/mkafmka/mkbbmkY7mlKrmkpXmkpPmkqXmkqnmkojmkrzmk5rmk5Lmk4Xmk4fmkrvmk5jmk4Lmk7Hmk6foiInmk6Dmk6Hmiqzmk6Pmk6/mlKzmk7bmk7Tmk7Lmk7rmlIDmk73mlJjmlJzmlIXmlKTmlKPmlKvmlLTmlLXmlLfmlLbmlLjnlYvmlYjmlZbmlZXmlY3mlZjmlZ7mlZ3mlbLmlbjmloLmloPorormlpvmlp/mlqvmlrfml4Pml4bml4Hml4Tml4zml5Lml5vml5nml6Dml6Hml7HmnbLmmIrmmIPml7vmnbPmmLXmmLbmmLTmmJzmmY/mmYTmmYnmmYHmmZ7mmZ3mmaTmmafmmajmmZ/mmaLmmbDmmoPmmojmmo7mmonmmoTmmpjmmp3mm4Hmmrnmm4nmmr7mmrxcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZTQwXCIsXG5cdFx0XCLmm4Tmmrjmm5bmm5rmm6DmmL/mm6bmm6nmm7Dmm7Xmm7fmnI/mnJbmnJ7mnKbmnKfpnLjmnK7mnL/mnLbmnYHmnLjmnLfmnYbmnZ7mnaDmnZnmnaPmnaTmnonmnbDmnqnmnbzmnarmnozmnovmnqbmnqHmnoXmnrfmn6/mnrTmn6zmnrPmn6nmnrjmn6Tmn57mn53mn6Lmn67mnrnmn47mn4bmn6fmqpzmoJ7moYbmoKnmoYDmoY3moLLmoY5cIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZTgwXCIsXG5cdFx0XCLmorPmoKvmoZnmoaPmobfmob/mop/moo/moq3mopTmop3mopvmooPmqq7mornmobTmorXmoqDmorrmpI/moo3mob7mpIHmo4rmpIjmo5jmpKLmpKbmo6HmpIzmo43mo5Tmo6fmo5XmpLbmpJLmpITmo5fmo6PmpKXmo7nmo6Dmo6/mpKjmpKrmpJrmpKPmpKHmo4bmpbnmpbfmpZzmpbjmpavmpZTmpb7mpa7mpLnmpbTmpL3mpZnmpLDmpaHmpZ7mpZ3mpoHmparmprLmpq7mp5Dmpr/mp4Hmp5Pmpr7mp47lr6jmp4rmp53mprvmp4PmpqfmqK7mppHmpqDmppzmppXmprTmp57mp6jmqILmqJvmp7/mrIrmp7nmp7Lmp6fmqIXmprHmqJ7mp63mqJTmp6vmqIrmqJLmq4HmqKPmqJPmqYTmqIzmqbLmqLbmqbjmqYfmqaLmqZnmqabmqYjmqLjmqKLmqpDmqo3mqqDmqoTmqqLmqqNcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZjQwXCIsXG5cdFx0XCLmqpfomJfmqrvmq4Pmq4LmqrjmqrPmqqzmq57mq5Hmq5/mqqrmq5rmq6rmq7vmrIXomJbmq7rmrJLmrJbprLHmrJ/mrLjmrLfnm5zmrLnpo67mrYfmrYPmrYnmrZDmrZnmrZTmrZvmrZ/mraHmrbjmrbnmrb/mroDmroTmroPmro3mrpjmrpXmrp7mrqTmrqrmrqvmrq/mrrLmrrHmrrPmrrfmrrzmr4bmr4vmr5Pmr5/mr6zmr6vmr7Pmr69cIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZjgwXCIsXG5cdFx0XCLpur7msIjmsJPmsJTmsJvmsKTmsKPmsZ7msZXmsaLmsarmsoLmso3msprmsoHmspvmsb7msajmsbPmspLmspDms4Tms7Hms5Pmsr3ms5fms4Xms53msq7msrHmsr7msrrms5vms6/ms5nms6rmtJ/ooY3mtLbmtKvmtL3mtLjmtJnmtLXmtLPmtJLmtIzmtaPmtpPmtaTmtZrmtbnmtZnmto7mtpXmv6TmtoXmt7nmuJXmuIrmtrXmt4fmt6bmtrjmt4bmt6zmt57mt4zmt6jmt5Lmt4Xmt7rmt5nmt6Tmt5Xmt6rmt67muK3mua7muK7muJnmubLmuZ/muL7muKPmuavmuKvmubbmuY3muJ/muYPmuLrmuY7muKTmu7/muJ3muLjmuoLmuqrmupjmu4nmurfmu5Pmur3muq/mu4TmurLmu5Tmu5Xmuo/muqXmu4Lmup/mvYHmvJHngYzmu6zmu7jmu77mvL/mu7LmvLHmu6/mvLLmu4xcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMDQwXCIsXG5cdFx0XCLmvL7mvJPmu7fmvobmvbrmvbjmvoHmvoDmva/mvZvmv7Pmva3mvoLmvbzmvZjmvo7mvpHmv4LmvabmvrPmvqPmvqHmvqTmvrnmv4bmvqrmv5/mv5Xmv6zmv5Tmv5jmv7Hmv67mv5vngInngIvmv7rngJHngIHngI/mv77ngJvngJrmvbTngJ3ngJjngJ/ngLDngL7ngLLngZHngaPngpnngpLngq/ng7HngqzngrjngrPngq7ng5/ng4vng51cIlxuXHRdLFxuXHRbXG5cdFx0XCJlMDgwXCIsXG5cdFx0XCLng5nnhInng73nhJznhJnnhaXnhZXnhojnhabnhaLnhYznhZbnhaznho/nh7vnhoTnhpXnhqjnhqznh5fnhrnnhr7nh5Lnh4nnh5Tnh47nh6Dnh6znh6fnh7Xnh7znh7nnh7/niI3niJDniJvniKjniK3niKzniLDniLLniLvniLzniL/niYDniYbniYvniZjnibTnib7nioLnioHniofnipLnipbniqLniqfnirnnirLni4Pni4bni4Tni47ni5Lni6Lni6Dni6Hni7nni7flgI/njJfnjIrnjJznjJbnjJ3njLTnjK/njKnnjKXnjL7njY7njY/pu5jnjZfnjarnjajnjbDnjbjnjbXnjbvnjbrnj4jnjrPnj47njrvnj4Dnj6Xnj67nj57nkqLnkIXnka/nkKXnj7jnkLLnkLrnkZXnkL/nkZ/nkZnnkYHnkZznkannkbDnkaPnkarnkbbnkb7nkovnkp7nkqfnk4rnk4/nk5Tnj7FcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMTQwXCIsXG5cdFx0XCLnk6Dnk6Pnk6fnk6nnk67nk7Lnk7Dnk7Hnk7jnk7fnlITnlIPnlIXnlIznlI7nlI3nlJXnlJPnlJ7nlKbnlKznlLznlYTnlY3nlYrnlYnnlZvnlYbnlZrnlannlaTnlafnlavnla3nlbjnlbbnlobnlofnlbTnlornlonnloLnlpTnlprnlp3nlqXnlqPnl4LnlrPnl4PnlrXnlr3nlrjnlrznlrHnl43nl4rnl5Lnl5nnl6Pnl57nl77nl79cIlxuXHRdLFxuXHRbXG5cdFx0XCJlMTgwXCIsXG5cdFx0XCLnl7znmIHnl7Dnl7rnl7Lnl7PnmIvnmI3nmInnmJ/nmKfnmKDnmKHnmKLnmKTnmLTnmLDnmLvnmYfnmYjnmYbnmZznmZjnmaHnmaLnmajnmannmarnmafnmaznmbDnmbLnmbbnmbjnmbznmoDnmoPnmojnmovnmo7nmpbnmpPnmpnnmprnmrDnmrTnmrjnmrnnmrrnm4Lnm43nm5bnm5Lnm57nm6Hnm6Xnm6fnm6romK/nm7vnnIjnnIfnnITnnKnnnKTnnJ7nnKXnnKbnnJvnnLfnnLjnnYfnnZrnnajnnavnnZvnnaXnnb/nnb7nnbnnno7nnovnnpHnnqDnnp7nnrDnnrbnnrnnnr/nnrznnr3nnrvnn4fnn43nn5fnn5rnn5znn6Pnn67nn7znoIznoJLnpKbnoKDnpKrnoYXnoo7nobTnoobnobznoprnooznoqPnorXnoqrnoq/no5Hno4bno4vno5Tnor7norzno4Xno4rno6xcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMjQwXCIsXG5cdFx0XCLno6fno5rno73no7TnpIfnpJLnpJHnpJnnpKznpKvnpYDnpaDnpZfnpZ/npZrnpZXnpZPnpbrnpb/npornpp3npqfpvYvnpqrnpq7nprPnprnnprrnp4nnp5Xnp6fnp6znp6Hnp6PnqIjnqI3nqJjnqJnnqKDnqJ/npoDnqLHnqLvnqL7nqLfnqYPnqZfnqYnnqaHnqaLnqanpvp3nqbDnqbnnqb3nqojnqpfnqpXnqpjnqpbnqqnnq4jnqrBcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMjgwXCIsXG5cdFx0XCLnqrbnq4Xnq4Tnqr/pgoPnq4fnq4rnq43nq4/nq5Xnq5Pnq5nnq5rnq53nq6Hnq6Lnq6bnq63nq7DnrILnrI/nrIrnrIbnrLPnrJjnrJnnrJ7nrLXnrKjnrLbnrZDnrbrnrITnrY3nrIvnrYznrYXnrbXnraXnrbTnrafnrbDnrbHnraznra7nrp3nrpjnrp/nro3nrpznrprnrovnrpLnro/nrZ3nrpnnr4vnr4Hnr4znr4/nrrTnr4bnr53nr6nnsJHnsJTnr6bnr6XnsaDnsIDnsIfnsJPnr7Pnr7fnsJfnsI3nr7bnsKPnsKfnsKrnsJ/nsLfnsKvnsL3nsYznsYPnsZTnsY/nsYDnsZDnsZjnsZ/nsaTnsZbnsaXnsaznsbXnsoPnspDnsqTnsq3nsqLnsqvnsqHnsqjnsrPnsrLnsrHnsq7nsrnnsr3ns4Dns4Xns4Lns5jns5Lns5zns6LprLvns6/ns7Lns7Tns7bns7rntIZcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMzQwXCIsXG5cdFx0XCLntILntJzntJXntIrntYXntYvntK7ntLLntL/ntLXntYbntbPntZbntY7ntbLntajnta7ntY/ntaPntpPntonntZvnto/ntb3ntpvntrrntq7ntqPntrXnt4fntr3ntqvnuL3ntqLntq/nt5zntrjntp/ntrDnt5jnt53nt6Tnt57nt7vnt7Lnt6HnuIXnuIrnuKPnuKHnuJLnuLHnuJ/nuInnuIvnuKLnuYbnuabnuLvnuLXnuLnnuYPnuLdcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMzgwXCIsXG5cdFx0XCLnuLLnuLrnuafnuZ3nuZbnuZ7nuZnnuZrnubnnuarnuannubznubvnuoPnt5Xnub3ovq7nub/nuojnuonnuoznupLnupDnupPnupTnupbnuo7nupvnupznvLjnvLrnvYXnvYznvY3nvY7nvZDnvZHnvZXnvZTnvZjnvZ/nvaDnvajnvannvafnvbjnvoLnvobnvoPnvojnvofnvoznvpTnvp7nvp3nvprnvqPnvq/nvrLnvrnnvq7nvrbnvrjorbHnv4Xnv4bnv4rnv5Xnv5Tnv6Hnv6bnv6nnv7Pnv7npo5zogIbogITogIvogJLogJjogJnogJzogKHogKjogL/ogLvogYrogYbogZLogZjogZrogZ/ogaLogajogbPogbLogbDogbbogbnogb3ogb/ogoTogobogoXogpvogpPogprogq3lhpDogqzog5vog6Xog5nog53og4Tog5rog5bohInog6/og7HohJvohKnohKPohK/ohYtcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNDQwXCIsXG5cdFx0XCLpmovohYbohL7ohZPohZHog7zohbHoha7ohaXohabohbTohoPohojohorohoDohoLohqDohpXohqTohqPohZ/ohpPohqnohrDohrXohr7ohrjohr3oh4Doh4Lohrroh4noh43oh5Hoh5noh5joh4joh5roh5/oh6Doh6foh7roh7voh77oiIHoiILoiIXoiIfoiIroiI3oiJDoiJboiKnoiKvoiLjoiLPoiYDoiZnoiZjoiZ3oiZroiZ/oiaRcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNDgwXCIsXG5cdFx0XCLoiaLoiajoiaroiavoiK7oibHoibfoibjoib7oio3oipLoiqvoip/oirvoiqzoi6Hoi6Poi5/oi5Loi7Toi7Poi7rojpPojIPoi7voi7noi57ojIboi5zojInoi5nojLXojLTojJbojLLojLHojYDojLnojZDojYXojK/ojKvojJfojJjojoXojprojqrojp/ojqLojpbojKPojo7ojofojorojbzojrXojbPojbXojqDojonojqjoj7TokJPoj6voj47oj73okIPoj5jokIvoj4Hoj7fokIfoj6Doj7LokI3okKLokKDojr3okLjolIboj7voka3okKrokLzolZrokoTokbfokavokq3oka7okoLokanokYbokKzoka/okbnokLXok4rokaLokrnokr/okp/ok5nok43okrvok5rok5Dok4Hok4bok5bokqHolKHok7/ok7TolJfolJjolKzolJ/olJXolJTok7zolYDolaPolZjolYhcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNTQwXCIsXG5cdFx0XCLolYHomILolYvolZXoloDolqTolojolpHolorolqjola3olpTolpvol6rolofolpzolbfolb7olpDol4nolrrol4/olrnol5Dol5Xol53ol6Xol5zol7nomIromJPomIvol77ol7romIbomKLomJromLDomL/omY3kuZXomZTomZ/omafombHompPomqPomqnomqromovomozomrbomq/om4Tom4bomrDom4nooKPomqvom5Tom57om6nom6xcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNTgwXCIsXG5cdFx0XCLom5/om5vom6/onJLonIbonIjonIDonIPom7vonJHonInonI3om7nonIronLTonL/onLfonLvonKXonKnonJronaDonZ/onbjonYzonY7onbTonZfonajona7onZnonZPonaPonarooIXonqLonp/onoLonq/on4vonr3on4Don5Dpm5bonqvon4TonrPon4fon4bonrvon6/on7Lon6DooI/ooI3on77on7bon7fooI7on5LooJHooJbooJXooKLooKHooLHooLbooLnooKfooLvooYTooYLooZLooZnooZ7ooaLooavoooHoob7oop7oobXoob3oorXoobLoooLoopfoopLooq7oopnooqLooo3ooqToorDoor/oorHoo4Poo4Too5Too5joo5noo53oo7nopILoo7zoo7Too6joo7LopITopIzopIropJPopYPopJ7opKXopKropKvopYHopYTopLvopLbopLjopYzopJ3opaDopZ5cIlxuXHRdLFxuXHRbXG5cdFx0XCJlNjQwXCIsXG5cdFx0XCLopabopaTopa3oparopa/opbTopbfopb7opoPopojoporoppPoppjopqHopqnopqbopqzopq/oprLoprropr3opr/op4Dop5rop5zop53op6fop7Top7joqIPoqJboqJDoqIzoqJvoqJ3oqKXoqLboqYHoqZvoqZLoqYboqYjoqbzoqa3oqazoqaLoqoXoqoLoqoToqqjoqqHoqpHoqqXoqqboqproqqPoq4Toq43oq4Loq5roq6voq7Poq6dcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNjgwXCIsXG5cdFx0XCLoq6Toq7HorJToq6Doq6Loq7foq57oq5vorIzorIforJroq6HorJborJDorJforKDorLPpnqvorKborKvorL7orKjorYHorYzorY/orY7orYnorZborZvorZroravorZ/orazora/orbTorb3oroDorozoro7orpLorpPorpborpnorprosLrosYHosL/osYjosYzosY7osZDosZXosaLosazosbjosbrosoLosonosoXosoroso3oso7ospTosbzospjmiJ3osq3osqrosr3osrLosrPosq7osrbos4jos4Hos6Tos6Pos5ros73os7ros7votITotIXotIrotIfotI/otI3otJDpvY7otJPos43otJTotJbotafota3otbHotbPotoHotpnot4Lotr7otrrot4/ot5rot5bot4zot5vot4vot6rot6vot5/ot6Pot7zouIjouInot7/ouJ3ouJ7ouJDouJ/ouYLouLXouLDouLTouYpcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNzQwXCIsXG5cdFx0XCLouYfouYnouYzouZDouYjouZnouaTouaDouKrouaPouZXoubboubLoubzouoHouofouoXouoTouovouoroupPoupHoupToupnouqrouqHouqzourDou4bourHour7ou4Xou4jou4vou5vou6Pou7zou7vou6vou77ovIrovIXovJXovJLovJnovJPovJzovJ/ovJvovIzovKbovLPovLvovLnovYXovYLovL7ovYzovYnovYbovY7ovZfovZxcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNzgwXCIsXG5cdFx0XCLovaLovaPovaTovpzovp/ovqPovq3ovq/ovrfov5rov6Xov6Lov6rov6/pgofov7TpgIXov7nov7rpgJHpgJXpgKHpgI3pgJ7pgJbpgIvpgKfpgLbpgLXpgLnov7jpgY/pgZDpgZHpgZLpgI7pgYnpgL7pgZbpgZjpgZ7pgajpga/pgbbpmqjpgbLpgoLpgb3pgoHpgoDpgorpgonpgo/pgqjpgq/pgrHpgrXpg6Lpg6TmiYjpg5vphILphJLphJnphLLphLDphYrphZbphZjphaPphaXphanphbPphbLphovphonphoLphqLphqvphq/phqrphrXphrTphrrph4Dph4Hph4nph4vph5Dph5bph5/ph6Hph5vph7zph7Xph7bpiJ7ph7/piJTpiKzpiJXpiJHpiZ7piZfpiYXpiYnpiaTpiYjpipXpiL/piYvpiZDpipzpipbpipPpipvpiZrpi4/pirnpirfpi6npjI/pi7rpjYTpjK5cIlxuXHRdLFxuXHRbXG5cdFx0XCJlODQwXCIsXG5cdFx0XCLpjJnpjKLpjJrpjKPpjLrpjLXpjLvpjZzpjaDpjbzpja7pjZbpjrDpjqzpjq3pjpTpjrnpj5bpj5fpj6jpj6Xpj5jpj4Ppj53pj5Dpj4jpj6TpkJrpkJTpkJPpkIPpkIfpkJDpkLbpkKvpkLXpkKHpkLrpkYHpkZLpkYTpkZvpkaDpkaLpkZ7pkarpiKnpkbDpkbXpkbfpkb3pkZrpkbzpkb7pkoHpkb/ploLplofplorplpTplpbplpjplplcIlxuXHRdLFxuXHRbXG5cdFx0XCJlODgwXCIsXG5cdFx0XCLplqDplqjplqfplq3plrzplrvplrnplr7pl4rmv7bpl4Ppl43pl4zpl5Xpl5Tpl5bpl5zpl6Hpl6Xpl6LpmKHpmKjpmK7pmK/pmYLpmYzpmY/pmYvpmbfpmZzpmZ7pmZ3pmZ/pmabpmbLpmazpmo3pmpjpmpXpmpfpmqrpmqfpmrHpmrLpmrDpmrTpmrbpmrjpmrnpm47pm4vpm4npm43opY3pm5zpnI3pm5Xpm7npnITpnIbpnIjpnJPpnI7pnJHpnI/pnJbpnJnpnKTpnKrpnLDpnLnpnL3pnL7pnYTpnYbpnYjpnYLpnYnpnZzpnaDpnaTpnabpnajli5LpnavpnbHpnbnpnoXpnbzpnoHpnbrpnobpnovpno/pnpDpnpzpnqjpnqbpnqPpnrPpnrTpn4Ppn4bpn4jpn4vpn5zpn63pvY/pn7Lnq5/pn7bpn7XpoI/poIzpoLjpoKTpoKHpoLfpoL3poYbpoY/poYvpoavpoa/pobBcIlxuXHRdLFxuXHRbXG5cdFx0XCJlOTQwXCIsXG5cdFx0XCLpobHpobTpobPpoqrpoq/porHporbpo4Tpo4Ppo4bpo6npo6vppIPppInppJLppJTppJjppKHppJ3ppJ7ppKTppKDppKzppK7ppL3ppL7ppYLppYnppYXppZDppYvppZHppZLppYzppZXpppfpppjppqXppq3ppq7pprzpp5/pp5vpp53pp5jpp5Hpp63pp67pp7Hpp7Lpp7vpp7jpqIHpqI/pqIXpp6LpqJnpqKvpqLfpqYXpqYLpqYDpqYNcIlxuXHRdLFxuXHRbXG5cdFx0XCJlOTgwXCIsXG5cdFx0XCLpqL7pqZXpqY3pqZvpqZfpqZ/pqaLpqaXpqaTpqanpqavpqarpqq3pqrDpqrzpq4Dpq4/pq5Hpq5Ppq5Tpq57pq5/pq6Lpq6Ppq6bpq6/pq6vpq67pq7Tpq7Hpq7fpq7vprIbprJjprJrprJ/prKLprKPprKXprKfprKjprKnprKrprK7prK/prLLprYTprYPprY/prY3prY7prZHprZjprbTprpPproPprpHprpbprpfprp/prqDprqjprrTpr4Dpr4rprrnpr4bpr4/pr5Hpr5Lpr6Ppr6Lpr6Tpr5Tpr6HpsLrpr7Lpr7Hpr7DpsJXpsJTpsInpsJPpsIzpsIbpsIjpsJLpsIrpsITpsK7psJvpsKXpsKTpsKHpsLDpsYfpsLLpsYbpsL7psZrpsaDpsafpsbbpsbjps6fps6zps7DptInptIjps6vptIPptIbptKrptKbptq/ptKPptJ/ptYTptJXptJLptYHptL/ptL7ptYbptYhcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYTQwXCIsXG5cdFx0XCLptZ3ptZ7ptaTptZHptZDptZnptbLptonptofptqvpta/ptbrptprptqTptqnptrLpt4Tpt4Hptrvptrjptrrpt4bpt4/pt4Lpt5npt5Ppt7jpt6bpt63pt6/pt73puJrpuJvpuJ7pubXpubnpub3puoHpuojpuovpuozpupLpupXpupHpup3puqXpuqnpurjpuqrpuq3pnaHpu4zpu47pu4/pu5Dpu5Tpu5zpu57pu53pu6Dpu6Xpu6jpu69cIlxuXHRdLFxuXHRbXG5cdFx0XCJlYTgwXCIsXG5cdFx0XCLpu7Tpu7bpu7fpu7npu7vpu7zpu73pvIfpvIjnmrfpvJXpvKHpvKzpvL7pvYrpvZLpvZTpvaPpvZ/pvaDpvaHpvabpvafpvazpvarpvbfpvbLpvbbpvpXpvpzpvqDloK/mp4fpgZnnkaTlh5znhplcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZDQwXCIsXG5cdFx0XCLnuoropJzpjYjpiojok5zkv4nngrvmmLHmo4jpi7nmm7vlvYXkuKjku6Hku7zkvIDkvIPkvLnkvZbkvpLkvorkvprkvpTkv43lgYDlgKLkv7/lgJ7lgYblgbDlgYLlgpTlg7Tlg5jlhYrlhaTlhp3lhr7lh6zliJXlipzliqbli4Dli5vljIDljIfljKTljbLljpPljrLlj53vqI7lkpzlkorlkqnlk7/lloblnZnlnaXlnqzln4jln4fvqI9cIlxuXHRdLFxuXHRbXG5cdFx0XCJlZDgwXCIsXG5cdFx0XCLvqJDlop7lorLlpIvlpZPlpZvlpZ3lpaPlpqTlprrlrZblr4DnlK/lr5jlr6zlsJ7lsqblsrrls7XltKfltZPvqJHltYLlta3ltrjltrnlt5DlvKHlvLTlvaflvrflv57mgZ3mgoXmgormg57mg5XmhKDmg7LmhJHmhLfmhLDmhpjmiJPmiqbmj7XmkaDmkp3mk47mlY7mmIDmmJXmmLvmmInmmK7mmJ7mmKTmmaXmmZfmmZnvqJLmmbPmmpnmmqDmmrLmmr/mm7rmnI7vpKnmnabmnrvmoZLmn4DmoIHmoYTmo4/vqJPmpajvqJTmppjmp6LmqLDmqavmqYbmqbPmqb7mq6Lmq6Tmr5bmsL/msZzmsobmsa/ms5rmtITmtofmta/mtpbmtqzmt4/mt7jmt7Lmt7zmuLnmuZzmuKfmuLzmur/mvojmvrXmv7XngIXngIfngKjngoXngqvnhI/nhITnhZznhYbnhYfvqJXnh4Hnh77nirFcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZTQwXCIsXG5cdFx0XCLnir7njKTvqJbnjbfnjr3nj4nnj5bnj6Pnj5LnkIfnj7XnkKbnkKrnkKnnkK7nkaLnkonnkp/nlIHnla/nmoLnmpznmp7nmpvnmqbvqJfnnYbliq/noKHnoY7noaTnobrnpLDvqJjvqJnvqJrnppTvqJvnppvnq5Hnq6fvqJznq6vnrp7vqJ3ntYjntZzntrfntqDnt5bnuZLnvYfnvqHvqJ7ojIHojaLojb/oj4foj7bokYjokrTolZPolZlcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZTgwXCIsXG5cdFx0XCLolavvqJ/olrDvqKDvqKHooIfoo7XoqJLoqLfoqbnoqqfoqr7oq5/vqKLoq7borZPorb/os7Dos7TotJLotbbvqKPou4/vqKTvqKXpgafpg57vqKbphJXphKfph5rph5fph57ph63ph67ph6Tph6XpiIbpiJDpiIrpiLrpiYDpiLzpiY7piZnpiZHpiLnpiafpiqfpibfpibjpi6fpi5fpi5npi5DvqKfpi5Xpi6Dpi5PpjKXpjKHpi7vvqKjpjJ7pi7/pjJ3pjILpjbDpjZfpjqTpj4bpj57pj7jpkLHpkYXpkYjplpLvp5zvqKnpmp3pmq/pnLPpnLvpnYPpnY3pnY/pnZHpnZXpoZfpoaXvqKrvqKvppKfvqKzppp7pqY7pq5npq5zprbXprbLpro/prrHprrvpsIDptbDptavvqK3puJnpu5FcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZWVmXCIsXG5cdFx0XCLihbBcIixcblx0XHQ5LFxuXHRcdFwi77+i77+k77yH77yCXCJcblx0XSxcblx0W1xuXHRcdFwiZjA0MFwiLFxuXHRcdFwi7oCAXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjA4MFwiLFxuXHRcdFwi7oC/XCIsXG5cdFx0MTI0XG5cdF0sXG5cdFtcblx0XHRcImYxNDBcIixcblx0XHRcIu6CvFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImYxODBcIixcblx0XHRcIu6Du1wiLFxuXHRcdDEyNFxuXHRdLFxuXHRbXG5cdFx0XCJmMjQwXCIsXG5cdFx0XCLuhbhcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmMjgwXCIsXG5cdFx0XCLuhrdcIixcblx0XHQxMjRcblx0XSxcblx0W1xuXHRcdFwiZjM0MFwiLFxuXHRcdFwi7oi0XCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjM4MFwiLFxuXHRcdFwi7omzXCIsXG5cdFx0MTI0XG5cdF0sXG5cdFtcblx0XHRcImY0NDBcIixcblx0XHRcIu6LsFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImY0ODBcIixcblx0XHRcIu6Mr1wiLFxuXHRcdDEyNFxuXHRdLFxuXHRbXG5cdFx0XCJmNTQwXCIsXG5cdFx0XCLujqxcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmNTgwXCIsXG5cdFx0XCLuj6tcIixcblx0XHQxMjRcblx0XSxcblx0W1xuXHRcdFwiZjY0MFwiLFxuXHRcdFwi7pGoXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjY4MFwiLFxuXHRcdFwi7pKnXCIsXG5cdFx0MTI0XG5cdF0sXG5cdFtcblx0XHRcImY3NDBcIixcblx0XHRcIu6UpFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImY3ODBcIixcblx0XHRcIu6Vo1wiLFxuXHRcdDEyNFxuXHRdLFxuXHRbXG5cdFx0XCJmODQwXCIsXG5cdFx0XCLul6BcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmODgwXCIsXG5cdFx0XCLumJ9cIixcblx0XHQxMjRcblx0XSxcblx0W1xuXHRcdFwiZjk0MFwiLFxuXHRcdFwi7pqcXCJcblx0XSxcblx0W1xuXHRcdFwiZmE0MFwiLFxuXHRcdFwi4oWwXCIsXG5cdFx0OSxcblx0XHRcIuKFoFwiLFxuXHRcdDksXG5cdFx0XCLvv6Lvv6TvvIfvvILjiLHihJbihKHiiLXnuoropJzpjYjpiojok5zkv4nngrvmmLHmo4jpi7nmm7vlvYXkuKjku6Hku7zkvIDkvIPkvLnkvZbkvpLkvorkvprkvpTkv43lgYDlgKLkv7/lgJ7lgYblgbDlgYLlgpTlg7Tlg5jlhYpcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYTgwXCIsXG5cdFx0XCLlhaTlhp3lhr7lh6zliJXlipzliqbli4Dli5vljIDljIfljKTljbLljpPljrLlj53vqI7lkpzlkorlkqnlk7/lloblnZnlnaXlnqzln4jln4fvqI/vqJDlop7lorLlpIvlpZPlpZvlpZ3lpaPlpqTlprrlrZblr4DnlK/lr5jlr6zlsJ7lsqblsrrls7XltKfltZPvqJHltYLlta3ltrjltrnlt5DlvKHlvLTlvaflvrflv57mgZ3mgoXmgormg57mg5XmhKDmg7LmhJHmhLfmhLDmhpjmiJPmiqbmj7XmkaDmkp3mk47mlY7mmIDmmJXmmLvmmInmmK7mmJ7mmKTmmaXmmZfmmZnvqJLmmbPmmpnmmqDmmrLmmr/mm7rmnI7vpKnmnabmnrvmoZLmn4DmoIHmoYTmo4/vqJPmpajvqJTmppjmp6LmqLDmqavmqYbmqbPmqb7mq6Lmq6Tmr5bmsL/msZzmsobmsa/ms5rmtITmtofmta9cIlxuXHRdLFxuXHRbXG5cdFx0XCJmYjQwXCIsXG5cdFx0XCLmtpbmtqzmt4/mt7jmt7Lmt7zmuLnmuZzmuKfmuLzmur/mvojmvrXmv7XngIXngIfngKjngoXngqvnhI/nhITnhZznhYbnhYfvqJXnh4Hnh77nirHnir7njKTvqJbnjbfnjr3nj4nnj5bnj6Pnj5LnkIfnj7XnkKbnkKrnkKnnkK7nkaLnkonnkp/nlIHnla/nmoLnmpznmp7nmpvnmqbvqJfnnYbliq/noKHnoY7noaTnobrnpLDvqJjvqJlcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYjgwXCIsXG5cdFx0XCLvqJrnppTvqJvnppvnq5Hnq6fvqJznq6vnrp7vqJ3ntYjntZzntrfntqDnt5bnuZLnvYfnvqHvqJ7ojIHojaLojb/oj4foj7bokYjokrTolZPolZnolavvqJ/olrDvqKDvqKHooIfoo7XoqJLoqLfoqbnoqqfoqr7oq5/vqKLoq7borZPorb/os7Dos7TotJLotbbvqKPou4/vqKTvqKXpgafpg57vqKbphJXphKfph5rph5fph57ph63ph67ph6Tph6XpiIbpiJDpiIrpiLrpiYDpiLzpiY7piZnpiZHpiLnpiafpiqfpibfpibjpi6fpi5fpi5npi5DvqKfpi5Xpi6Dpi5PpjKXpjKHpi7vvqKjpjJ7pi7/pjJ3pjILpjbDpjZfpjqTpj4bpj57pj7jpkLHpkYXpkYjplpLvp5zvqKnpmp3pmq/pnLPpnLvpnYPpnY3pnY/pnZHpnZXpoZfpoaXvqKrvqKvppKfvqKzppp7pqY7pq5lcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYzQwXCIsXG5cdFx0XCLpq5zprbXprbLpro/prrHprrvpsIDptbDptavvqK3puJnpu5FcIlxuXHRdXG5dO1xuXG52YXIgc2hpZnRqaXMkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnZGVmYXVsdCc6IHNoaWZ0amlzXG59KTtcblxudmFyIGV1Y2pwID0gW1xuXHRbXG5cdFx0XCIwXCIsXG5cdFx0XCJcXHUwMDAwXCIsXG5cdFx0MTI3XG5cdF0sXG5cdFtcblx0XHRcIjhlYTFcIixcblx0XHRcIu+9oVwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImExYTFcIixcblx0XHRcIuOAgOOAgeOAgu+8jO+8juODu++8mu+8m++8n++8geOCm+OCnMK0772AwqjvvL7vv6PvvL/jg73jg77jgp3jgp7jgIPku53jgIXjgIbjgIfjg7zigJXigJDvvI/vvLzvvZ7iiKXvvZzigKbigKXigJjigJnigJzigJ3vvIjvvInjgJTjgJXvvLvvvL3vvZvvvZ3jgIhcIixcblx0XHQ5LFxuXHRcdFwi77yL77yNwrHDl8O377yd4omg77yc77ye4omm4omn4oie4oi04pmC4pmAwrDigLLigLPihIPvv6XvvITvv6Dvv6HvvIXvvIPvvIbvvIrvvKDCp+KYhuKYheKXi+KXj+KXjuKXh1wiXG5cdF0sXG5cdFtcblx0XHRcImEyYTFcIixcblx0XHRcIuKXhuKWoeKWoOKWs+KWsuKWveKWvOKAu+OAkuKGkuKGkOKGkeKGk+OAk1wiXG5cdF0sXG5cdFtcblx0XHRcImEyYmFcIixcblx0XHRcIuKIiOKIi+KKhuKKh+KKguKKg+KIquKIqVwiXG5cdF0sXG5cdFtcblx0XHRcImEyY2FcIixcblx0XHRcIuKIp+KIqO+/ouKHkuKHlOKIgOKIg1wiXG5cdF0sXG5cdFtcblx0XHRcImEyZGNcIixcblx0XHRcIuKIoOKKpeKMkuKIguKIh+KJoeKJkuKJquKJq+KImuKIveKIneKIteKIq+KIrFwiXG5cdF0sXG5cdFtcblx0XHRcImEyZjJcIixcblx0XHRcIuKEq+KAsOKZr+KZreKZquKAoOKAocK2XCJcblx0XSxcblx0W1xuXHRcdFwiYTJmZVwiLFxuXHRcdFwi4pevXCJcblx0XSxcblx0W1xuXHRcdFwiYTNiMFwiLFxuXHRcdFwi77yQXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCJhM2MxXCIsXG5cdFx0XCLvvKFcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCJhM2UxXCIsXG5cdFx0XCLvvYFcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCJhNGExXCIsXG5cdFx0XCLjgYFcIixcblx0XHQ4MlxuXHRdLFxuXHRbXG5cdFx0XCJhNWExXCIsXG5cdFx0XCLjgqFcIixcblx0XHQ4NVxuXHRdLFxuXHRbXG5cdFx0XCJhNmExXCIsXG5cdFx0XCLOkVwiLFxuXHRcdDE2LFxuXHRcdFwizqNcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImE2YzFcIixcblx0XHRcIs6xXCIsXG5cdFx0MTYsXG5cdFx0XCLPg1wiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiYTdhMVwiLFxuXHRcdFwi0JBcIixcblx0XHQ1LFxuXHRcdFwi0IHQllwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcImE3ZDFcIixcblx0XHRcItCwXCIsXG5cdFx0NSxcblx0XHRcItGR0LZcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCJhOGExXCIsXG5cdFx0XCLilIDilILilIzilJDilJjilJTilJzilKzilKTilLTilLzilIHilIPilI/ilJPilJvilJfilKPilLPilKvilLvilYvilKDilK/ilKjilLfilL/ilJ3ilLDilKXilLjilYJcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZGExXCIsXG5cdFx0XCLikaBcIixcblx0XHQxOSxcblx0XHRcIuKFoFwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiYWRjMFwiLFxuXHRcdFwi442J44yU44yi442N44yY44yn44yD44y2442R442X44yN44ym44yj44yr442K44y7446c446d446e446O446P44+E446hXCJcblx0XSxcblx0W1xuXHRcdFwiYWRkZlwiLFxuXHRcdFwi442744Cd44Cf4oSW44+N4oSh44qkXCIsXG5cdFx0NCxcblx0XHRcIuOIseOIsuOIueONvuONveONvOKJkuKJoeKIq+KIruKIkeKImuKKpeKIoOKIn+KKv+KIteKIqeKIqlwiXG5cdF0sXG5cdFtcblx0XHRcImIwYTFcIixcblx0XHRcIuS6nOWUluWog+mYv+WTgOaEm+aMqOWntumAouiRteiMnOepkOaCquaPoea4peaXreiRpuiKpumvteaik+Wcp+aWoeaJseWum+WnkOiZu+mjtOe1oue2vumujuaIlueyn+iit+WuieW6teaMieaal+ahiOmXh+mejeadj+S7peS8iuS9jeS+neWBieWbsuWkt+WnlOWogeWwieaDn+aEj+aFsOaYk+akheeCuueVj+eVsOenu+e2ree3r+iDg+iQjuiho+isgumBlemBuuWMu+S6leS6peWfn+iCsumDgeejr+S4gOWjsea6oumAuOeosuiMqOiKi+mwr+WFgeWNsOWSveWToeWboOWnu+W8lemjsua3q+iDpOiUrVwiXG5cdF0sXG5cdFtcblx0XHRcImIxYTFcIixcblx0XHRcIumZoumZsOmaoOmfu+WQi+WPs+Wuh+eDj+e+vei/gumbqOWNr+m1nOequuS4keeik+iHvOa4puWYmOWUhOasneiUmumwu+WnpeWOqea1pueTnOmWj+WZguS6kemBi+mbsuiNj+mkjOWPoeWWtuWssOW9seaYoOabs+aghOawuOazs+a0qeeRm+ebiOepjumgtOiLseihm+ipoOmLrea2sueWq+ebiumnheaCpuisgei2iumWsuamjuWOreWGhuWckuWgsOWlhOWutOW7tuaAqOaOqeaPtOayv+a8lOeCjueElOeFmeeHleeMv+e4geiJtuiLkeiWl+mBoOmJm+m0m+WhqeaWvOaxmueUpeWHueWkruWlpeW+gOW/nFwiXG5cdF0sXG5cdFtcblx0XHRcImIyYTFcIixcblx0XHRcIuaKvOaXuuaoquasp+autOeOi+e/geillum0rOm0jum7hOWyoeayluiNu+WEhOWxi+aGtuiHhuahtueJoeS5meS/uuWNuOaBqea4qeepj+mfs+S4i+WMluS7ruS9leS8veS+oeS9s+WKoOWPr+WYieWkj+WrgeWutuWvoeenkeaah+aenOaetuatjOays+eBq+ePguemjeemvueovOeuh+iKseiLm+iMhOiNt+iPr+iPk+idpuiqsuWYqeiyqOi/pumBjumcnuiaiuS/hOWzqOaIkeeJmeeUu+iHpeiKveibvuizgOmbhemkk+mnleS7i+S8muino+WbnuWhiuWjiuW7u+W/q+aAquaClOaBouaHkOaIkuaLkOaUuVwiXG5cdF0sXG5cdFtcblx0XHRcImIzYTFcIixcblx0XHRcIumtgeaZpuaisOa1t+eBsOeVjOeahue1teiKpeifuemWi+majuiyneWHseWKvuWkluWSs+Wus+W0luaFqOamgua2r+eijeiTi+ihl+ipsumOp+mquOa1rOmmqOibmeWeo+afv+ibjumIjuWKg+Wah+WQhOW7k+aLoeaSueagvOaguOauu+eNsueiuuepq+immuinkui1q+i8g+mDremWo+malOmdqeWtpuWys+alvemhjemhjuaOm+esoOaoq+apv+aitumwjea9n+WJsuWWneaBsOaLrOa0u+a4h+a7keiRm+ikkOi9hOS4lOmwueWPtuakm+aouumehOagquWFnOerg+iSsumHnOmOjOWZm+m0qOagouiMheiQsVwiXG5cdF0sXG5cdFtcblx0XHRcImI0YTFcIixcblx0XHRcIueypeWIiOiLheeTpuS5vuS+g+WGoOWvkuWIiuWLmOWLp+W3u+WWmuWgquWnpuWujOWumOWvm+W5suW5ueaCo+aEn+aFo+aGvuaPm+aVouafkeahk+ajuuasvuatk+axl+a8oua+l+a9heeSsOeUmOebo+eci+erv+euoeewoee3qee8tue/sOiCneiJpuiOnuims+irjOiyq+mChOmRkemWk+mWkemWoumZpemfk+mkqOiImOS4uOWQq+WyuOW3jOeOqeeZjOecvOWyqee/q+i0i+mbgemgkemhlOmhmOS8geS8juWNseWWnOWZqOWfuuWlh+WsieWvhOWykOW4jOW5vuW/jOaPruacuuaXl+aXouacn+aji+ajhFwiXG5cdF0sXG5cdFtcblx0XHRcImI1YTFcIixcblx0XHRcIuapn+W4sOavheawl+axveeVv+eliOWto+eogOe0gOW+veimj+iomOiytOi1t+i7jOi8nemjoumojumsvOS6gOWBveWEgOWmk+WunOaIr+aKgOaTrOasuueKoOeWkeelh+e+qeifu+iqvOitsOaOrOiPiumeoOWQieWQg+WWq+ahlOapmOipsOegp+adtem7jeWNtOWuouiEmuiZkOmAhuS4mOS5heS7h+S8keWPiuWQuOWuruW8k+aApeaVkeacveaxguaxsuazo+eBuOeQg+eptueqruesiOe0muezvue1puaXp+eJm+WOu+WxheW3qOaLkuaLoOaMmea4oOiZmuiosei3nemLuOa8geempumtmuS6qOS6q+S6rFwiXG5cdF0sXG5cdFtcblx0XHRcImI2YTFcIixcblx0XHRcIuS+m+S+oOWDkeWFh+ertuWFseWHtuWNlOWMoeWNv+WPq+WWrOWig+WzoeW8t+W9iuaAr+aBkOaBreaMn+aVmeapi+azgeeLgueLreefr+iDuOiEheiIiOiVjumDt+mPoemfv+mll+mpmuS7sOWHneWwreaagealreWxgOabsualteeOieahkOeygeWDheWLpOWdh+W3vumMpuaWpOaso+asveeQtOemgeemveeti+e3iuiKueiPjOihv+iln+isuei/kemHkeWQn+mKgOS5neWAtuWPpeWMuueLl+eOluefqeiLpui6r+mnhumniOmnkuWFt+aEmuiZnuWWsOepuuWBtuWvk+mBh+maheS4suarm+mHp+WxkeWxiFwiXG5cdF0sXG5cdFtcblx0XHRcImI3YTFcIixcblx0XHRcIuaOmOeqn+ayk+mdtOi9oeeqqueGiumaiOeyguagl+e5sOahkemNrOWLsuWQm+iWq+iok+e+pOi7jemDoeWNpuiiiOelgeS/guWCvuWIkeWFhOWVk+WcreePquWei+WlkeW9ouW+hOaBteaFtuaFp+aGqeaOsuaQuuaVrOaZr+ahgua4k+eVpueoveezu+e1jOe2mee5i+e9q+iMjuiNiuibjeioiOipo+itpui7vemgmum2j+iKuOi/jumvqOWKh+aIn+aSg+a/gOmameahgeWCkeasoOaxuua9lOeptOe1kOihgOioo+aciOS7tuWAueWApuWBpeWFvOWIuOWJo+WWp+Wcj+WgheWrjOW7uuaGsuaHuOaLs+aNslwiXG5cdF0sXG5cdFtcblx0XHRcImI4YTFcIixcblx0XHRcIuaknOaoqeeJveeKrOeMrueglOehr+e1ueecjOiCqeimi+ismeizoui7kumBo+mNtemZuumhlemok+m5uOWFg+WOn+WOs+W5u+W8pua4m+a6kOeOhOePvue1g+iIt+iogOiruumZkOS5juWAi+WPpOWRvOWbuuWnkeWtpOW3seW6q+W8p+aIuOaVheaer+a5lueLkOeziuiitOiCoeiDoeiPsOiZjuiqh+i3qOmIt+mbh+mhp+m8k+S6lOS6kuS8jeWNiOWRieWQvuWor+W+jOW+oeaCn+aip+aqjueRmueigeiqnuiqpOitt+mGkOS5numvieS6pOS9vOS+r+WAmeWAluWFieWFrOWKn+WKueWLvuWOmuWPo+WQkVwiXG5cdF0sXG5cdFtcblx0XHRcImI5YTFcIixcblx0XHRcIuWQjuWWieWdkeWeouWlveWtlOWtneWuj+W3peW3p+W3t+W5uOW6g+W6muW6t+W8mOaBkuaFjOaKl+aLmOaOp+aUu+aYguaZg+abtOadreagoeail+ani+axn+a0qua1qea4r+a6neeUsueah+ehrOeov+ezoOe0hee0mOe1nue2seiAleiAg+iCr+iCseiFlOiGj+iIquiNkuihjOihoeism+iyouizvOmDiumFtemJseegv+mLvOmWpOmZjemghemmmemrmOm0u+WJm+WKq+WPt+WQiOWjleaLt+a/oOixqui9n+m6ueWFi+WIu+WRiuWbveepgOmFt+m1oOm7kueNhOa8ieiFsOeUkeW/veaDmumqqOeLm+i+vFwiXG5cdF0sXG5cdFtcblx0XHRcImJhYTFcIixcblx0XHRcIuatpOmgg+S7iuWbsOWdpOWivuWpmuaBqOaHh+aYj+aYhuagueaisea3t+eXlee0uuiJrumtguS6m+S9kOWPieWUhuW1r+W3puW3ruafu+aymeeRs+egguipkOmOluijn+WdkOW6p+aMq+WCteWCrOWGjeacgOWTieWhnuWmu+WusOW9qeaJjeaOoeagveats+a4iOeBvemHh+eKgOegleegpuelreaWjue0sOiPnOijgei8iemam+WJpOWcqOadkOe9quiyoeWGtOWdgumYquWguuamiuiCtOWSsuW0juWfvOeilem3uuS9nOWJiuWSi+aQvuaYqOaclOafteeqhOetlue0oumMr+ahnOmureesueWMmeWGiuWIt1wiXG5cdF0sXG5cdFtcblx0XHRcImJiYTFcIixcblx0XHRcIuWvn+aLtuaSruaTpuacreauuuiWqembkeeakOmvluaNjOmMhumuq+eav+aZkuS4ieWCmOWPguWxseaDqOaSkuaVo+ahn+eHpuePiueUo+eul+e6guialeiug+izm+mFuOmkkOaWrOaaq+aui+S7leS7lOS8uuS9v+WIuuWPuOWPsuWXo+Wbm+Wjq+Wni+WnieWnv+WtkOWxjeW4guW4q+W/l+aAneaMh+aUr+WtnOaWr+aWveaXqOaeneatouatu+awj+eNheelieengeezuOe0mee0q+iCouiEguiHs+imluipnuipqeippuiqjOirruizh+iznOmbjOmjvOatr+S6i+S8vOS+jeWFkOWtl+WvuuaFiOaMgeaZglwiXG5cdF0sXG5cdFtcblx0XHRcImJjYTFcIixcblx0XHRcIuasoea7i+ayu+eIvueSveeXlOejgeekuuiAjOiAs+iHquiSlOi+nuaxkOm5v+W8j+itmOm0q+eruui7uOWujembq+S4g+WPseWft+WkseWrieWupOaCiea5v+a8hueWvuizquWun+iUgOevoOWBsuaftOiKneWxoeiViue4nuiIjuWGmeWwhOaNqOi1puaWnOeFruekvue0l+iAheisnei7iumBruibh+mCquWAn+WLuuWwuuadk+eBvOeItemFjOmHiOmMq+iLpeWvguW8seaDueS4u+WPluWuiOaJi+acseauiueLqeePoOeoruiFq+i2o+mFkummluWEkuWPl+WRquWvv+aOiOaouee2rOmcgOWbmuWPjuWRqFwiXG5cdF0sXG5cdFtcblx0XHRcImJkYTFcIixcblx0XHRcIuWul+WwseW3nuS/ruaEgeaLvua0suengOeni+e1gue5jee/kuiHreiIn+iSkOihhuilsuiukOi5tOi8r+mAsemFi+mFrOmbhumGnOS7gOS9j+WFheWNgeW+k+aIjuaflOaxgea4i+eNo+e4pumHjemKg+WPlOWkmeWuv+a3keelnee4rueym+WhvueGn+WHuuihk+i/sOS/iuWzu+aYpeeerOero+iInOmnv+WHhuW+quaXrOalr+auiea3s+a6lua9pOebvue0lOW3oemBtemGh+mghuWHpuWIneaJgOaakeabmea4muW6tue3kue9suabuOiWr+iXt+iruOWKqeWPmeWls+W6j+W+kOaBlemLpOmZpOWCt+WEn1wiXG5cdF0sXG5cdFtcblx0XHRcImJlYTFcIixcblx0XHRcIuWLneWMoOWNh+WPrOWTqOWVhuWUseWYl+WlqOWmvuWovOWuteWwhuWwj+WwkeWwmuW6hOW6iuW7oOW9sOaJv+aKhOaLm+aOjOaNt+aYh+aYjOaYreaZtuadvuaiouaon+aoteayvOa2iOa4iea5mOeEvOeEpueFp+eXh+ecgeehneekgeelpeensOeroOeskeeyp+e0ueiCluiPluiSi+iVieihneijs+ion+iovOiplOips+ixoeiznumGpOmJpumNvumQmOmanOmemOS4iuS4iOS4nuS5l+WGl+WJsOWfjuWgtOWjjOWsouW4uOaDheaTvuadoeadlua1hOeKtueVs+epo+iSuOitsumGuOmMoOWYseWftOmjvlwiXG5cdF0sXG5cdFtcblx0XHRcImJmYTFcIixcblx0XHRcIuaLreakjeaulueHree5lOiBt+iJsuinpumjn+idlei+seWwu+S8uOS/oeS+teWUh+WooOWvneWvqeW/g+aFjuaMr+aWsOaZi+ajruamm+a1uOa3seeUs+eWueecn+elnuenpue0s+iHo+iKr+iWquimquiouui6q+i+m+mAsumHnemch+S6uuS7geWIg+WhteWjrOWwi+eUmuWwveiFjuioiui/hemZo+mdreespeirj+mgiOmFouWbs+WOqOmAl+WQueWeguW4peaOqOawtOeCiuedoeeyi+e/oOihsOmBgumFlOmMkOmMmOmaj+eRnumrhOW0h+W1qeaVsOaeoui2qOmbm+aNruadieakmeiPhemgl+mbgOijvlwiXG5cdF0sXG5cdFtcblx0XHRcImMwYTFcIixcblx0XHRcIua+hOaRuuWvuOS4lueArOeVneaYr+WHhOWItuWLouWnk+W+geaAp+aIkOaUv+aVtOaYn+aZtOajsuagluato+a4heeJsueUn+ebm+eyvuiBluWjsOijveilv+iqoOiqk+iri+mAnemGkumdkumdmeaWieeojuiEhumau+W4reaDnOaImuaWpeaYlOaekOefs+epjeexjee4vuiEiuiyrOi1pOi3oei5n+eiqeWIh+aLmeaOpeaRguaKmOioreeqg+evgOiqrOmbque1tuiIjOidieS7meWFiOWNg+WNoOWuo+WwguWwluW3neaIpuaJh+aSsOagk+agtOaziea1hea0l+afk+a9nOeFjueFveaXi+epv+euree3mlwiXG5cdF0sXG5cdFtcblx0XHRcImMxYTFcIixcblx0XHRcIue5iue+qOiFuuiIm+iIueiWpuipruizjui3temBuOmBt+mKremKkemWg+muruWJjeWWhOa8uOeEtuWFqOemhee5leiGs+ezjuWZjOWhkeWyqOaOquabvuabvealmueLmeeWj+eWjuekjuelluenn+eyl+e0oOe1hOiYh+iotOmYu+mBoem8oOWDp+WJteWPjOWPouWAieWWquWjruWlj+eIveWui+WxpOWMneaDo+aDs+aNnOaOg+aMv+aOu+aTjeaXqeabueW3o+anjeanvea8leeHpeS6ieeXqeebuOeqk+ezn+e3j+e2nOiBoeiNieiNmOiRrOiSvOiXu+ijhei1sOmAgemBremOl+mcnOmokuWDj+Wil+aGjlwiXG5cdF0sXG5cdFtcblx0XHRcImMyYTFcIixcblx0XHRcIuiHk+iUtei0iOmAoOS/g+WBtOWJh+WNs+aBr+aNieadn+a4rOi2s+mAn+S/l+WxnuiziuaXj+e2muWNkuiiluWFtuaPg+WtmOWtq+WwiuaQjeadkemBnOS7luWkmuWkquaxsOipkeWUvuWgleWmpeaDsOaJk+afgeiIteallemZgOmnhOmoqOS9k+WghuWvvuiAkOWyseW4r+W+heaAoOaFi+aItOabv+azsOa7nuiDjuiFv+iLlOiii+iyuOmAgOmArumaium7m+mvm+S7o+WPsOWkp+esrOmGjemhjOm3uea7neeAp+WNk+WVhOWuheaJmOaKnuaLk+ayoua/r+eQouiol+mQuOa/geirvuiMuOWHp+ibuOWPqlwiXG5cdF0sXG5cdFtcblx0XHRcImMzYTFcIixcblx0XHRcIuWPqeS9humBlOi+sOWlquiEseW3veerqui+v+ajmuiwt+eLuOmxiOaoveiqsOS4ueWNmOWYhuWdpuaLheaOouaXpuatjua3oea5m+eCreefreerr+euque2u+iAveiDhuibi+iqlemNm+Wbo+Wjh+W8vuaWreaaluaqgOauteeUt+irh+WApOefpeWcsOW8m+aBpeaZuuaxoOeXtOeomue9ruiHtOicmOmBhemms+evieeVnOerueetkeiThOmAkOenqeeqkuiMtuWroeedgOS4reS7suWumeW/oOaKveaYvOafseazqOiZq+iht+iou+mFjumLs+mnkOaol+eApueMquiLp+iRl+iyr+S4geWFhuWHi+WWi+WvtVwiXG5cdF0sXG5cdFtcblx0XHRcImM0YTFcIixcblx0XHRcIuW4luW4s+W6geW8lOW8teW9q+W+tOaHsuaMkeaaouacnea9rueJkueUuuecuuiBtOiEueiFuOidtuiqv+irnOi2hei3s+mKmumVt+mggumzpeWLheaNl+ebtOacleayiOePjeizg+mOrumZs+a0peWinOakjuanjOi/vemOmueXm+mAmuWhmuagguaOtOanu+S9g+a8rOafmOi+u+iUpue2tOmNlOakv+a9sOWdquWjt+WsrOe0rOeIquWQiumHo+m2tOS6reS9juWBnOWBteWJg+iynuWRiOWgpOWumuW4neW6leW6reW7t+W8n+aCjOaKteaMuuaPkOair+axgOeih+emjueoi+e3oOiJh+ioguirpui5hOmAk1wiXG5cdF0sXG5cdFtcblx0XHRcImM1YTFcIixcblx0XHRcIumCuOmEremHmOm8juazpeaRmOaTouaVtea7tOeahOesm+mBqemPkea6uuWTsuW+ueaSpOi9jei/remJhOWFuOWhq+WkqeWxleW6l+a3u+e6j+eUnOiyvOi7oumhm+eCueS8neauv+a+seeUsOmbu+WFjuWQkOWgteWhl+WmrOWxoOW+kuaWl+adnOa4oeeZu+iPn+izremAlOmDvemNjeegpeeguuWKquW6puWcn+WltOaAkuWAkuWFmuWGrOWHjeWIgOWUkOWhlOWhmOWll+WuleWztuW2i+aCvOaKleaQreadseahg+aivOajn+ebl+a3mOa5r+a2m+eBr+eHiOW9k+eXmOelt+etieetlOetkuezlue1seWIsFwiXG5cdF0sXG5cdFtcblx0XHRcImM2YTFcIixcblx0XHRcIuiRo+iVqeiXpOiojuishOixhui4j+mAg+mAj+mQmemZtumgremosOmXmOWDjeWLleWQjOWgguWwjuaGp+aSnua0nuees+erpeiDtOiQhOmBk+mKheWzoOm0h+WMv+W+l+W+s+a2nOeJueedo+emv+evpOavkueLrOiqreagg+apoeWHuOeqgeaktOWxiumztuiLq+WvhemFieeAnuWZuOWxr+aDh+aVpuayjOixmumBgemgk+WRkeabh+mIjeWliOmCo+WGheS5jeWHquiWmeisjueBmOaNuumNi+aloummtOe4hOeVt+WNl+aloOi7n+mbo+axneS6jOWwvOW8kOi/qeWMguizkeiCieiZueW7v+aXpeS5s+WFpVwiXG5cdF0sXG5cdFtcblx0XHRcImM3YTFcIixcblx0XHRcIuWmguWwv+mfruS7u+WmiuW/jeiqjea/oeemsOelouWvp+iRseeMq+eGseW5tOW/teaNu+aSmueHg+eymOS5g+W7vOS5i+WfnOWaouaCqea/g+e0jeiDveiEs+iGv+i+suiml+iapOW3tOaKiuaSreimh+adt+azoua0vueQtuegtOWphue9teiKremmrOS/s+W7g+aLneaOkuaVl+adr+ebg+eJjOiDjOiCuui8qemFjeWAjeWfueWqkuaiheals+eFpOeLveiyt+WjsuizoOmZqumAmeidv+enpOefp+iQqeS8r+WJpeWNmuaLjeafj+aziueZveeulOeyleiItuiWhOi/q+abnea8oOeIhue4m+iOq+mngem6plwiXG5cdF0sXG5cdFtcblx0XHRcImM4YTFcIixcblx0XHRcIuWHveeuseehsueuuOiCh+etiOarqOW5oeiCjOeVkeeVoOWFq+mJoua6jOeZuumGl+mrquS8kOe9sOaKnOetj+mWpemzqeWZuuWhmeibpOmavOS8tOWIpOWNiuWPjeWPm+W4huaQrOaWkeadv+awvuaxjueJiOeKr+ePreeVlOe5geiIrOiXqeiyqeevhOmHhueFqemgkumjr+aMveaZqeeVquebpOejkOiVg+ibruWMquWNkeWQpuWmg+W6h+W9vOaCsuaJieaJueaKq+aWkOavlOazjOeWsuearueikeenmOe3i+e9t+iCpeiiq+iqueiyu+mBv+mdnumjm+aoi+ewuOWCmeWwvuW+ruaeh+avmOeQteeciee+jlwiXG5cdF0sXG5cdFtcblx0XHRcImM5YTFcIixcblx0XHRcIum8u+afiueol+WMueeWi+mrreW9puiGneiPseiCmOW8vOW/heeVouethumAvOahp+Wnq+Wqm+e0kOeZvuisrOS/teW9quaomeawt+a8gueTouelqOihqOipleixueW7n+aPj+eXheenkuiLl+mMqOmLsuiSnOibremwreWTgeW9rOaWjOa1nOeAleiyp+izk+mgu+aVj+eTtuS4jeS7mOWfoOWkq+WppuWvjOWGqOW4g+W6nOaAluaJtuaVt+aWp+aZrua1rueItuespuiFkOiGmuiKmeitnOiyoOizpui1tOmYnOmZhOS+ruaSq+atpuiInuiRoeiVqumDqOWwgealk+miqOiRuuiVl+S8j+WJr+W+qeW5heacjVwiXG5cdF0sXG5cdFtcblx0XHRcImNhYTFcIixcblx0XHRcIuemj+iFueikh+imhua3teW8l+aJleayuOS7j+eJqemukuWIhuWQu+WZtOWis+aGpOaJrueEmuWlrueyieeznue0m+mbsOaWh+iBnuS4meS9teWFteWhgOW5o+W5s+W8iuafhOS4puiUvemWiemZm+exs+mggeWDu+WjgeeZlueip+WIpeeepeiUkeeuhuWBj+WkieeJh+evh+e3qOi+uui/lOmBjeS+v+WLieWoqeW8gemereS/neiIl+mLquWcg+aNleatqeeUq+ijnOi8lOepguWLn+Wik+aFleaIiuaaruavjeewv+iPqeWAo+S/uOWMheWRhuWgseWlieWuneWzsOWzr+W0qeW6luaKseaNp+aUvuaWueaci1wiXG5cdF0sXG5cdFtcblx0XHRcImNiYTFcIixcblx0XHRcIuazleazoeeDueegsue4q+iDnuiKs+iQjOiTrOicguikkuioquixiumCpumLkumjvemzs+m1rOS5j+S6oeWCjeWJluWdiuWmqOW4veW/mOW/meaIv+aatOacm+afkOajkuWGkue0oeiCquiGqOisgOiyjOiyv+mJvumYsuWQoOmgrOWMl+WDleWNnOWiqOaSsuactOeJp+edpuephumHpuWLg+ayoeauhuWggOW5jOWllOacrOe/u+WHoeebhuaRqeejqOmtlOm6u+Wfi+WmueaYp+aemuavjuWTqeanmeW5leiGnOaelemuquafvumxkuahneS6puS/o+WPiOaKueacq+ayq+i/hOS+ree5rem6v+S4h+aFoua6gFwiXG5cdF0sXG5cdFtcblx0XHRcImNjYTFcIixcblx0XHRcIua8q+iUk+WRs+acqumtheW3s+euleWyrOWvhuicnOa5iuiTkeeolOiEiOWmmeeyjeawkeecoOWLmeWkoueEoeeJn+efm+mcp+m1oeaki+Wpv+WomOWGpeWQjeWRveaYjuebn+i/t+mKmOmztOWnqueJnea7heWFjeajiee2v+e3rOmdoum6uuaRuOaooeiMguWmhOWtn+avm+eMm+ebsue2suiAl+iSmeWEsuacqOm7meebruadouWLv+mkheWwpOaIu+exvuiysOWVj+aCtue0i+mWgOWMgeS5n+WGtuWknOeIuuiAtumHjuW8peefouWOhOW9uee0hOiWrOios+i6jemdluafs+iWrumRk+aEieaEiOayueeZklwiXG5cdF0sXG5cdFtcblx0XHRcImNkYTFcIixcblx0XHRcIuirrei8uOWUr+S9keWEquWLh+WPi+WupeW5veaCoOaGguaPluacieafmua5p+a2jOeMtueMt+eUseelkOijleiqmOmBiumCkemDtembhOiejeWkleS6iOS9meS4juiqiei8v+mgkOWCreW5vOWmluWuueW6uOaPmuaPuuaTgeabnOaliuanmOa0i+a6tueGlOeUqOeqr+e+iuiAgOiRieiTieimgeisoei4iumBpemZvemkiuaFvuaKkeassuayg+a1tOe/jOe/vOa3gOe+heieuuijuOadpeiOsemgvOmbt+a0m+e1oeiQvemFquS5seWNteW1kOashOa/q+iXjeiYreimp+WIqeWQj+WxpeadjuaiqOeQhueSg1wiXG5cdF0sXG5cdFtcblx0XHRcImNlYTFcIixcblx0XHRcIueXouijj+ijoemHjOmboumZuOW+i+eOh+eri+iRjuaOoOeVpeWKiea1gea6nOeQieeVmeehq+eykumahuernOm+jeS+tuaFruaXheiZnOS6huS6ruWDmuS4oeWHjOWvruaWmeaigea2vOeMn+eZgueereeonOezp+iJr+irkumBvOmHj+mZtemgmOWKm+e3keWAq+WOmOael+a3i+eHkOeQs+iHqOi8qumao+mxl+m6n+eRoOWhgea2mee0r+mhnuS7pOS8tuS+i+WGt+WKseW2uuaAnOeOsuekvOiLk+mItOmat+mbtumcium6l+m9ouaapuattOWIl+WKo+eDiOijguW7ieaBi+aGkOa8o+eFieewvue3tOiBr1wiXG5cdF0sXG5cdFtcblx0XHRcImNmYTFcIixcblx0XHRcIuiTrumAo+mMrOWRgumtr+ark+eCieizgui3r+mcsuWKtOWpgeW7iuW8hOacl+alvOamlOa1qua8j+eJoueLvOevreiAgeiBvuidi+mDjuWFrem6k+emhOiCi+mMsuirluWAreWSjOipseatquizhOiEh+aDkeaeoOm3suS6meS6mOmwkOipq+iXgeiVqOakgOa5vueil+iFlVwiXG5cdF0sXG5cdFtcblx0XHRcImQwYTFcIixcblx0XHRcIuW8jOS4kOS4leS4quS4seS4tuS4vOS4v+S5guS5luS5mOS6guS6heixq+S6iuiIkuW8jeS6juS6nuS6n+S6oOS6ouS6sOS6s+S6tuS7juS7jeS7hOS7huS7guS7l+S7nuS7reS7n+S7t+S8ieS9muS8sOS9m+S9neS9l+S9h+S9tuS+iOS+j+S+mOS9u+S9qeS9sOS+keS9r+S+huS+luWEmOS/lOS/n+S/juS/mOS/m+S/keS/muS/kOS/pOS/peWAmuWAqOWAlOWAquWApeWAheS8nOS/tuWAoeWAqeWArOS/vuS/r+WAkeWAhuWBg+WBh+acg+WBleWBkOWBiOWBmuWBluWBrOWBuOWCgOWCmuWCheWCtOWCslwiXG5cdF0sXG5cdFtcblx0XHRcImQxYTFcIixcblx0XHRcIuWDieWDiuWCs+WDguWDluWDnuWDpeWDreWDo+WDruWDueWDteWEieWEgeWEguWEluWEleWElOWEmuWEoeWEuuWEt+WEvOWEu+WEv+WFgOWFkuWFjOWFlOWFoueruOWFqeWFquWFruWGgOWGguWbmOWGjOWGieWGj+WGkeWGk+WGleWGluWGpOWGpuWGouWGqeWGquWGq+WGs+WGseWGsuWGsOWGteWGveWHheWHieWHm+WHoOiZleWHqeWHreWHsOWHteWHvuWIhOWIi+WIlOWIjuWIp+WIquWIruWIs+WIueWJj+WJhOWJi+WJjOWJnuWJlOWJquWJtOWJqeWJs+WJv+WJveWKjeWKlOWKkuWJseWKiOWKkei+qFwiXG5cdF0sXG5cdFtcblx0XHRcImQyYTFcIixcblx0XHRcIui+p+WKrOWKreWKvOWKteWLgeWLjeWLl+WLnuWLo+WLpumjreWLoOWLs+WLteWLuOWLueWMhuWMiOeUuOWMjeWMkOWMj+WMleWMmuWMo+WMr+WMseWMs+WMuOWNgOWNhuWNheS4l+WNieWNjeWHluWNnuWNqeWNruWkmOWNu+WNt+WOguWOluWOoOWOpuWOpeWOruWOsOWOtuWPg+ewkumbmeWPn+abvOeHruWPruWPqOWPreWPuuWQgeWQveWRgOWQrOWQreWQvOWQruWQtuWQqeWQneWRjuWSj+WRteWSjuWRn+WRseWRt+WRsOWSkuWRu+WSgOWRtuWShOWSkOWShuWTh+WSouWSuOWSpeWSrOWThOWTiOWSqFwiXG5cdF0sXG5cdFtcblx0XHRcImQzYTFcIixcblx0XHRcIuWSq+WTguWSpOWSvuWSvOWTmOWTpeWTpuWUj+WUlOWTveWTruWTreWTuuWTouWUueWVgOWVo+WVjOWUruWVnOWVheWVluWVl+WUuOWUs+WVneWWmeWWgOWSr+WWiuWWn+WVu+WVvuWWmOWWnuWWruWVvOWWg+WWqeWWh+WWqOWXmuWXheWXn+WXhOWXnOWXpOWXlOWYlOWXt+WYluWXvuWXveWYm+WXueWZjuWZkOeHn+WYtOWYtuWYsuWYuOWZq+WZpOWYr+WZrOWZquWahuWagOWaiuWaoOWalOWaj+WapeWaruWatuWatOWbguWavOWbgeWbg+WbgOWbiOWbjuWbkeWbk+Wbl+WbruWbueWcgOWbv+WchOWciVwiXG5cdF0sXG5cdFtcblx0XHRcImQ0YTFcIixcblx0XHRcIuWciOWci+WcjeWck+WcmOWcluWXh+WcnOWcpuWct+WcuOWdjuWcu+WdgOWdj+WdqeWfgOWeiOWdoeWdv+WeieWek+WeoOWes+WepOWequWesOWfg+WfhuWflOWfkuWfk+WgiuWfluWfo+Wgi+WgmeWgneWhsuWgoeWhouWhi+WhsOavgOWhkuWgveWhueWiheWiueWin+Wiq+WiuuWjnuWiu+WiuOWiruWjheWjk+WjkeWjl+WjmeWjmOWjpeWjnOWjpOWjn+Wjr+WjuuWjueWju+WjvOWjveWkguWkiuWkkOWkm+aipuWkpeWkrOWkreWksuWkuOWkvuerkuWlleWlkOWljuWlmuWlmOWlouWloOWlp+WlrOWlqVwiXG5cdF0sXG5cdFtcblx0XHRcImQ1YTFcIixcblx0XHRcIuWluOWmgeWmneS9nuS+q+Wmo+WmsuWnhuWnqOWnnOWmjeWnmeWnmuWopeWon+WokeWonOWoieWomuWpgOWprOWpieWoteWotuWpouWpquWqmuWqvOWqvuWri+WrguWqveWro+Wrl+WrpuWrqeWrluWruuWru+WsjOWsi+WsluWssuWrkOWsquWstuWsvuWtg+WtheWtgOWtkeWtleWtmuWtm+WtpeWtqeWtsOWts+WtteWtuOaWiOWtuuWugOWug+WupuWuuOWvg+Wvh+WvieWvlOWvkOWvpOWvpuWvouWvnuWvpeWvq+WvsOWvtuWvs+WwheWwh+WwiOWwjeWwk+WwoOWwouWwqOWwuOWwueWxgeWxhuWxjuWxk1wiXG5cdF0sXG5cdFtcblx0XHRcImQ2YTFcIixcblx0XHRcIuWxkOWxj+WtseWxrOWxruS5ouWxtuWxueWyjOWykeWylOWmm+Wyq+Wyu+WytuWyvOWyt+WzheWyvuWzh+WzmeWzqeWzveWzuuWzreW2jOWzquW0i+W0leW0l+W1nOW0n+W0m+W0keW0lOW0ouW0muW0meW0mOW1jOW1kuW1juW1i+W1rOW1s+W1tuW2h+W2hOW2guW2ouW2neW2rOW2ruW2veW2kOW2t+W2vOW3ieW3jeW3k+W3kuW3luW3m+W3q+W3suW3teW4i+W4muW4meW4keW4m+W4tuW4t+W5hOW5g+W5gOW5juW5l+W5lOW5n+W5ouW5pOW5h+W5teW5tuW5uum6vOW5v+W6oOW7geW7guW7iOW7kOW7j1wiXG5cdF0sXG5cdFtcblx0XHRcImQ3YTFcIixcblx0XHRcIuW7luW7o+W7neW7muW7m+W7ouW7oeW7qOW7qeW7rOW7seW7s+W7sOW7tOW7uOW7vuW8g+W8ieW9neW9nOW8i+W8keW8luW8qeW8reW8uOW9geW9iOW9jOW9juW8r+W9keW9luW9l+W9meW9oeW9reW9s+W9t+W+g+W+guW9v+W+iuW+iOW+keW+h+W+nuW+meW+mOW+oOW+qOW+reW+vOW/luW/u+W/pOW/uOW/seW/neaCs+W/v+aAoeaBoOaAmeaAkOaAqeaAjuaAseaAm+aAleaAq+aApuaAj+aAuuaBmuaBgeaBquaBt+aBn+aBiuaBhuaBjeaBo+aBg+aBpOaBguaBrOaBq+aBmeaCgeaCjeaDp+aCg+aCmlwiXG5cdF0sXG5cdFtcblx0XHRcImQ4YTFcIixcblx0XHRcIuaChOaCm+aCluaCl+aCkuaCp+aCi+aDoeaCuOaDoOaDk+aCtOW/sOaCveaDhuaCteaDmOaFjeaEleaEhuaDtuaDt+aEgOaDtOaDuuaEg+aEoeaDu+aDseaEjeaEjuaFh+aEvuaEqOaEp+aFiuaEv+aEvOaErOaEtOaEveaFguaFhOaFs+aFt+aFmOaFmeaFmuaFq+aFtOaFr+aFpeaFseaFn+aFneaFk+aFteaGmeaGluaGh+aGrOaGlOaGmuaGiuaGkeaGq+aGruaHjOaHiuaHieaHt+aHiOaHg+aHhuaGuuaHi+e9ueaHjeaHpuaHo+aHtuaHuuaHtOaHv+aHveaHvOaHvuaIgOaIiOaIieaIjeaIjOaIlOaIm1wiXG5cdF0sXG5cdFtcblx0XHRcImQ5YTFcIixcblx0XHRcIuaInuaIoeaIquaIruaIsOaIsuaIs+aJgeaJjuaJnuaJo+aJm+aJoOaJqOaJvOaKguaKieaJvuaKkuaKk+aKluaLlOaKg+aKlOaLl+aLkeaKu+aLj+aLv+aLhuaTlOaLiOaLnOaLjOaLiuaLguaLh+aKm+aLieaMjOaLruaLseaMp+aMguaMiOaLr+aLteaNkOaMvuaNjeaQnOaNj+aOluaOjuaOgOaOq+aNtuaOo+aOj+aOieaOn+aOteaNq+aNqeaOvuaPqeaPgOaPhuaPo+aPieaPkuaPtuaPhOaQluaQtOaQhuaQk+aQpuaQtuaUneaQl+aQqOaQj+aRp+aRr+aRtuaRjuaUquaSleaSk+aSpeaSqeaSiOaSvFwiXG5cdF0sXG5cdFtcblx0XHRcImRhYTFcIixcblx0XHRcIuaTmuaTkuaTheaTh+aSu+aTmOaTguaTseaTp+iIieaToOaToeaKrOaTo+aTr+aUrOaTtuaTtOaTsuaTuuaUgOaTveaUmOaUnOaUheaUpOaUo+aUq+aUtOaUteaUt+aUtuaUuOeVi+aViOaVluaVleaVjeaVmOaVnuaVneaVsuaVuOaWguaWg+iuiuaWm+aWn+aWq+aWt+aXg+aXhuaXgeaXhOaXjOaXkuaXm+aXmeaXoOaXoeaXseadsuaYiuaYg+aXu+ads+aYteaYtuaYtOaYnOaZj+aZhOaZieaZgeaZnuaZneaZpOaZp+aZqOaZn+aZouaZsOaag+aaiOaajuaaieaahOaamOaaneabgeaaueabieaavuaavFwiXG5cdF0sXG5cdFtcblx0XHRcImRiYTFcIixcblx0XHRcIuabhOaauOabluabmuaboOaYv+abpuabqeabsOabteabt+acj+acluacnuacpuacp+mcuOacruacv+actuadgeacuOact+adhuadnuadoOadmeado+adpOaeieadsOaeqeadvOadquaejOaei+aepuaeoeaeheaet+afr+aetOafrOaes+afqeaeuOafpOafnuafneafouafruaeueafjuafhuafp+aqnOagnuahhuagqeahgOahjeagsuahjuais+agq+ahmeaho+aht+ahv+ain+aij+aireailOaineaim+aig+aqruaiueahtOaiteaioOaiuuakj+aijeahvuakgeajiuakiOajmOakouakpuajoeakjOajjVwiXG5cdF0sXG5cdFtcblx0XHRcImRjYTFcIixcblx0XHRcIuajlOajp+ajleaktuakkuakhOajl+ajo+akpeajueajoOajr+akqOakquakmuako+akoeajhualuealt+alnOaluOalq+allOalvualruakuealtOakvealmeaksOaloealnualneamgealquamsuamruankOamv+angeank+amvuanjuWvqOaniuanneamu+ang+amp+aoruamkeamoOamnOamleamtOannuanqOaoguaom+anv+asiuanueansuanp+aoheamseaonuanreaolOanq+aoiuaokuargeaoo+aok+aphOaojOapsuaotuapuOaph+apouapmeappuapiOaouOaoouaqkOaqjeaqoOaqhOaqouaqo1wiXG5cdF0sXG5cdFtcblx0XHRcImRkYTFcIixcblx0XHRcIuaql+iYl+aqu+arg+arguaquOaqs+aqrOarnuarkearn+aqquarmuarquaru+asheiYluaruuaskuaslumsseasn+asuOast+ebnOasuemjruath+atg+atieatkOatmeatlOatm+atn+atoeatuOatueatv+augOauhOaug+aujeaumOauleaunuaupOauquauq+aur+ausuauseaus+aut+auvOavhuavi+avk+avn+avrOavq+avs+avr+m6vuawiOawk+awlOawm+awpOawo+axnuaxleaxouaxquayguayjeaymuaygeaym+axvuaxqOaxs+aykuaykOazhOazseazk+ayveazl+azheazneayruayseayvlwiXG5cdF0sXG5cdFtcblx0XHRcImRlYTFcIixcblx0XHRcIuayuuazm+azr+azmeazqua0n+ihjea0tua0q+a0vea0uOa0mea0tea0s+a0kua0jOa1o+a2k+a1pOa1mua1uea1mea2jua2lea/pOa2hea3uea4lea4iua2tea3h+a3pua2uOa3hua3rOa3nua3jOa3qOa3kua3hea3uua3mea3pOa3lea3qua3rua4rea5rua4rua4mea5sua5n+a4vua4o+a5q+a4q+a5tua5jea4n+a5g+a4uua5jua4pOa7v+a4nea4uOa6gua6qua6mOa7iea6t+a7k+a6vea6r+a7hOa6sua7lOa7lea6j+a6pea7gua6n+a9gea8keeBjOa7rOa7uOa7vua8v+a7sua8sea7r+a8sua7jFwiXG5cdF0sXG5cdFtcblx0XHRcImRmYTFcIixcblx0XHRcIua8vua8k+a7t+a+hua9uua9uOa+gea+gOa9r+a9m+a/s+a9rea+gua9vOa9mOa+jua+kea/gua9pua+s+a+o+a+oea+pOa+uea/hua+qua/n+a/lea/rOa/lOa/mOa/sea/rua/m+eAieeAi+a/uueAkeeAgeeAj+a/vueAm+eAmua9tOeAneeAmOeAn+eAsOeAvueAsueBkeeBo+eCmeeCkueCr+eDseeCrOeCuOeCs+eCrueDn+eDi+eDneeDmeeEieeDveeEnOeEmeeFpeeFleeGiOeFpueFoueFjOeFlueFrOeGj+eHu+eGhOeGleeGqOeGrOeHl+eGueeGvueHkueHieeHlOeHjueHoOeHrOeHp+eHteeHvFwiXG5cdF0sXG5cdFtcblx0XHRcImUwYTFcIixcblx0XHRcIueHueeHv+eIjeeIkOeIm+eIqOeIreeIrOeIsOeIsueIu+eIvOeIv+eJgOeJhueJi+eJmOeJtOeJvueKgueKgeeKh+eKkueKlueKoueKp+eKueeKsueLg+eLhueLhOeLjueLkueLoueLoOeLoeeLueeLt+WAj+eMl+eMiueMnOeMlueMneeMtOeMr+eMqeeMpeeMvueNjueNj+m7mOeNl+eNqueNqOeNsOeNuOeNteeNu+eNuuePiOeOs+ePjueOu+ePgOePpeePruePnueSoueQheeRr+eQpeePuOeQsueQuueRleeQv+eRn+eRmeeRgeeRnOeRqeeRsOeRo+eRqueRtueRvueSi+eSnueSp+eTiueTj+eTlOePsVwiXG5cdF0sXG5cdFtcblx0XHRcImUxYTFcIixcblx0XHRcIueToOeTo+eTp+eTqeeTrueTsueTsOeTseeTuOeTt+eUhOeUg+eUheeUjOeUjueUjeeUleeUk+eUnueUpueUrOeUvOeVhOeVjeeViueVieeVm+eVhueVmueVqeeVpOeVp+eVq+eVreeVuOeVtueWhueWh+eVtOeWiueWieeWgueWlOeWmueWneeWpeeWo+eXgueWs+eXg+eWteeWveeWuOeWvOeWseeXjeeXiueXkueXmeeXo+eXnueXvueXv+eXvOeYgeeXsOeXuueXsueXs+eYi+eYjeeYieeYn+eYp+eYoOeYoeeYoueYpOeYtOeYsOeYu+eZh+eZiOeZhueZnOeZmOeZoeeZoueZqOeZqeeZqueZp+eZrOeZsFwiXG5cdF0sXG5cdFtcblx0XHRcImUyYTFcIixcblx0XHRcIueZsueZtueZuOeZvOeagOeag+eaiOeai+eajuealueak+eameeamueasOeatOeauOeaueeauuebguebjeebluebkuebnueboeebpeebp+ebquiYr+ebu+eciOech+echOecqeecpOecnuecpeecpuecm+ect+ecuOedh+edmuedqOedq+edm+edpeedv+edvuedueeejueei+eekeeeoOeenueesOeetueeueeev+eevOeeveeeu+efh+efjeefl+efmuefnOefo+efruefvOegjOegkuekpuegoOekquehheeijuehtOeihuehvOeimueijOeio+eiteeiqueir+ejkeejhueji+ejlOeivueivOejheejiuejrFwiXG5cdF0sXG5cdFtcblx0XHRcImUzYTFcIixcblx0XHRcIuejp+ejmuejveejtOekh+ekkuekkeekmeekrOekq+elgOeloOell+eln+elmuelleelk+eluuelv+emiuemneemp+m9i+emquemruems+emueemuuenieenleenp+enrOenoeeno+eoiOeojeeomOeomeeooOeon+emgOeoseeou+eovueot+epg+epl+epieepoeepouepqem+neepsOepueepveeqiOeql+eqleeqmOeqlueqqeeriOeqsOeqtuerheerhOeqv+mCg+erh+eriuerjeerj+erleerk+ermeermuerneeroeerouerpuerreersOesguesj+esiueshuess+esmOesmeesnuesteesqOestuetkFwiXG5cdF0sXG5cdFtcblx0XHRcImU0YTFcIixcblx0XHRcIuetuueshOetjeesi+etjOetheetteetpeettOetp+etsOetseetrOetrueuneeumOeun+eujeeunOeumueui+eukueuj+etneeumeevi+evgeevjOevj+eutOevhuevneevqeewkeewlOevpuevpeexoOewgOewh+ewk+evs+evt+ewl+ewjeevtuewo+ewp+ewquewn+ewt+ewq+ewveexjOexg+exlOexj+exgOexkOexmOexn+expOexluexpeexrOexteeyg+eykOeypOeyreeyoueyq+eyoeeyqOeys+eysueyseeyrueyueeyveezgOezheezguezmOezkueznOezoumsu+ezr+ezsueztOeztuezuue0hlwiXG5cdF0sXG5cdFtcblx0XHRcImU1YTFcIixcblx0XHRcIue0gue0nOe0lee0iue1hee1i+e0rue0sue0v+e0tee1hue1s+e1lue1jue1sue1qOe1rue1j+e1o+e2k+e2iee1m+e2j+e1vee2m+e2uue2rue2o+e2tee3h+e2vee2q+e4vee2oue2r+e3nOe2uOe2n+e2sOe3mOe3nee3pOe3nue3u+e3sue3oee4hee4iue4o+e4oee4kue4see4n+e4iee4i+e4oue5hue5pue4u+e4tee4uee5g+e4t+e4sue4uue5p+e5nee5lue5nue5mee5mue5uee5que5qee5vOe5u+e6g+e3lee5vei+rue5v+e6iOe6iee6jOe6kue6kOe6k+e6lOe6lue6jue6m+e6nOe8uOe8ulwiXG5cdF0sXG5cdFtcblx0XHRcImU2YTFcIixcblx0XHRcIue9hee9jOe9jee9jue9kOe9kee9lee9lOe9mOe9n+e9oOe9qOe9qee9p+e9uOe+gue+hue+g+e+iOe+h+e+jOe+lOe+nue+nee+mue+o+e+r+e+sue+uee+rue+tue+uOitsee/hee/hue/iue/lee/lOe/oee/pue/qee/s+e/uemjnOiAhuiAhOiAi+iAkuiAmOiAmeiAnOiAoeiAqOiAv+iAu+iBiuiBhuiBkuiBmOiBmuiBn+iBouiBqOiBs+iBsuiBsOiBtuiBueiBveiBv+iChOiChuiCheiCm+iCk+iCmuiCreWGkOiCrOiDm+iDpeiDmeiDneiDhOiDmuiDluiEieiDr+iDseiEm+iEqeiEo+iEr+iFi1wiXG5cdF0sXG5cdFtcblx0XHRcImU3YTFcIixcblx0XHRcIumai+iFhuiEvuiFk+iFkeiDvOiFseiFruiFpeiFpuiFtOiGg+iGiOiGiuiGgOiGguiGoOiGleiGpOiGo+iFn+iGk+iGqeiGsOiGteiGvuiGuOiGveiHgOiHguiGuuiHieiHjeiHkeiHmeiHmOiHiOiHmuiHn+iHoOiHp+iHuuiHu+iHvuiIgeiIguiIheiIh+iIiuiIjeiIkOiIluiIqeiIq+iIuOiIs+iJgOiJmeiJmOiJneiJmuiJn+iJpOiJouiJqOiJquiJq+iIruiJseiJt+iJuOiJvuiKjeiKkuiKq+iKn+iKu+iKrOiLoeiLo+iLn+iLkuiLtOiLs+iLuuiOk+iMg+iLu+iLueiLnuiMhuiLnOiMieiLmVwiXG5cdF0sXG5cdFtcblx0XHRcImU4YTFcIixcblx0XHRcIuiMteiMtOiMluiMsuiMseiNgOiMueiNkOiNheiMr+iMq+iMl+iMmOiOheiOmuiOquiOn+iOouiOluiMo+iOjuiOh+iOiuiNvOiOteiNs+iNteiOoOiOieiOqOiPtOiQk+iPq+iPjuiPveiQg+iPmOiQi+iPgeiPt+iQh+iPoOiPsuiQjeiQouiQoOiOveiQuOiUhuiPu+iRreiQquiQvOiVmuiShOiRt+iRq+iSreiRruiSguiRqeiRhuiQrOiRr+iRueiQteiTiuiRouiSueiSv+iSn+iTmeiTjeiSu+iTmuiTkOiTgeiThuiTluiSoeiUoeiTv+iTtOiUl+iUmOiUrOiUn+iUleiUlOiTvOiVgOiVo+iVmOiViFwiXG5cdF0sXG5cdFtcblx0XHRcImU5YTFcIixcblx0XHRcIuiVgeiYguiVi+iVleiWgOiWpOiWiOiWkeiWiuiWqOiVreiWlOiWm+iXquiWh+iWnOiVt+iVvuiWkOiXieiWuuiXj+iWueiXkOiXleiXneiXpeiXnOiXueiYiuiYk+iYi+iXvuiXuuiYhuiYouiYmuiYsOiYv+iZjeS5leiZlOiZn+iZp+iZseiak+iao+iaqeiaquiai+iajOiatuiar+ibhOibhuiasOibieigo+iaq+iblOibnuibqeibrOibn+ibm+ibr+ickuichuiciOicgOicg+ibu+ickeicieicjeibueiciuictOicv+ict+icu+icpeicqeicmuidoOidn+iduOidjOidjuidtOidl+idqOidruidmVwiXG5cdF0sXG5cdFtcblx0XHRcImVhYTFcIixcblx0XHRcIuidk+ido+idquigheieouien+ieguier+ifi+ieveifgOifkOmbluieq+ifhOies+ifh+ifhuieu+ifr+ifsuifoOigj+igjeifvuiftuift+igjuifkuigkeigluigleigouigoeigseigtuigueigp+igu+ihhOihguihkuihmeihnuihouihq+iigeihvuiinuihteihveiiteihsuiiguiil+iikuiiruiimeiiouiijeiipOiisOiiv+iiseijg+ijhOijlOijmOijmeijneijueikguijvOijtOijqOijsuikhOikjOikiuikk+ilg+iknuikpeikquikq+ilgeilhOiku+iktuikuOiljOikneiloOilnlwiXG5cdF0sXG5cdFtcblx0XHRcImViYTFcIixcblx0XHRcIuilpuilpOilreilquilr+iltOilt+ilvuimg+imiOimiuimk+immOimoeimqeimpuimrOimr+imsuimuuimveimv+ingOinmuinnOinneinp+intOinuOiog+ioluiokOiojOiom+ioneiopeiotuipgeipm+ipkuiphuipiOipvOipreiprOipouiqheiqguiqhOiqqOiqoeiqkeiqpeiqpuiqmuiqo+irhOirjeirguirmuirq+irs+irp+irpOirseislOiroOirouirt+irnuirm+isjOish+ismuiroeisluiskOisl+isoOiss+meq+ispuisq+isvuisqOitgeitjOitj+itjuitieitluitm+itmuitq1wiXG5cdF0sXG5cdFtcblx0XHRcImVjYTFcIixcblx0XHRcIuitn+itrOitr+ittOitveiugOiujOiujuiukuiuk+iuluiumeiumuiwuuixgeiwv+ixiOixjOixjuixkOixleixouixrOixuOixuuiyguiyieiyheiyiuiyjeiyjuiylOixvOiymOaIneiyreiyquiyveiysuiys+iyruiytuiziOizgeizpOizo+izmuizveizuuizu+i0hOi0hei0iui0h+i0j+i0jei0kOm9jui0k+izjei0lOi0lui1p+i1rei1sei1s+i2gei2mei3gui2vui2uui3j+i3mui3lui3jOi3m+i3i+i3qui3q+i3n+i3o+i3vOi4iOi4iei3v+i4nei4nui4kOi4n+i5gui4tei4sOi4tOi5ilwiXG5cdF0sXG5cdFtcblx0XHRcImVkYTFcIixcblx0XHRcIui5h+i5iei5jOi5kOi5iOi5mei5pOi5oOi4qui5o+i5lei5tui5sui5vOi6gei6h+i6hei6hOi6i+i6iui6k+i6kei6lOi6mei6qui6oei6rOi6sOi7hui6sei6vui7hei7iOi7i+i7m+i7o+i7vOi7u+i7q+i7vui8iui8hei8lei8kui8mei8k+i8nOi8n+i8m+i8jOi8pui8s+i8u+i8uei9hei9gui8vui9jOi9iei9hui9jui9l+i9nOi9oui9o+i9pOi+nOi+n+i+o+i+rei+r+i+t+i/mui/pei/oui/qui/r+mCh+i/tOmAhei/uei/uumAkemAlemAoemAjemAnumAlumAi+mAp+mAtumAtemAuei/uFwiXG5cdF0sXG5cdFtcblx0XHRcImVlYTFcIixcblx0XHRcIumBj+mBkOmBkemBkumAjumBiemAvumBlumBmOmBnumBqOmBr+mBtumaqOmBsumCgumBvemCgemCgOmCiumCiemCj+mCqOmCr+mCsemCtemDoumDpOaJiOmDm+mEgumEkumEmemEsumEsOmFiumFlumFmOmFo+mFpemFqemFs+mFsumGi+mGiemGgumGoumGq+mGr+mGqumGtemGtOmGuumHgOmHgemHiemHi+mHkOmHlumHn+mHoemHm+mHvOmHtemHtumInumHv+mIlOmIrOmIlemIkemJnumJl+mJhemJiemJpOmJiOmKlemIv+mJi+mJkOmKnOmKlumKk+mKm+mJmumLj+mKuemKt+mLqemMj+mLuumNhOmMrlwiXG5cdF0sXG5cdFtcblx0XHRcImVmYTFcIixcblx0XHRcIumMmemMoumMmumMo+mMuumMtemMu+mNnOmNoOmNvOmNrumNlumOsOmOrOmOremOlOmOuemPlumPl+mPqOmPpemPmOmPg+mPnemPkOmPiOmPpOmQmumQlOmQk+mQg+mQh+mQkOmQtumQq+mQtemQoemQuumRgemRkumRhOmRm+mRoOmRoumRnumRqumIqemRsOmRtemRt+mRvemRmumRvOmRvumSgemRv+mWgumWh+mWiumWlOmWlumWmOmWmemWoOmWqOmWp+mWremWvOmWu+mWuemWvumXiua/tumXg+mXjemXjOmXlemXlOmXlumXnOmXoemXpemXoumYoemYqOmYrumYr+mZgumZjOmZj+mZi+mZt+mZnOmZnlwiXG5cdF0sXG5cdFtcblx0XHRcImYwYTFcIixcblx0XHRcIumZnemZn+mZpumZsumZrOmajemamOmalemal+maqumap+masemasumasOmatOmatumauOmauembjumbi+mbiembjeiljembnOmcjemblembuemchOmchumciOmck+mcjumckemcj+mclumcmemcpOmcqumcsOmcuemcvemcvumdhOmdhumdiOmdgumdiemdnOmdoOmdpOmdpumdqOWLkumdq+mdsemduemehemdvOmegemduumehumei+mej+mekOmenOmeqOmepumeo+mes+metOmfg+mfhumfiOmfi+mfnOmfrem9j+mfsuern+mftumftemgj+mgjOmguOmgpOmgoemgt+mgvemhhumhj+mhi+mhq+mhr+mhsFwiXG5cdF0sXG5cdFtcblx0XHRcImYxYTFcIixcblx0XHRcIumhsemhtOmhs+miqumir+misemitumjhOmjg+mjhumjqemjq+mkg+mkiemkkumklOmkmOmkoemknemknumkpOmkoOmkrOmkrumkvemkvumlgumliemlhemlkOmli+mlkemlkumljOmllemml+mmmOmmpemmremmrummvOmnn+mnm+mnnemnmOmnkemnremnrumnsemnsumnu+mnuOmogemoj+mohemnoumomemoq+mot+mphempgumpgOmpg+movumplempjempm+mpl+mpn+mpoumppemppOmpqempq+mpqumqremqsOmqvOmrgOmrj+mrkemrk+mrlOmrnumrn+mroumro+mrpumrr+mrq+mrrumrtOmrsemrt1wiXG5cdF0sXG5cdFtcblx0XHRcImYyYTFcIixcblx0XHRcIumru+mshumsmOmsmumsn+msoumso+mspemsp+msqOmsqemsqumsrumsr+mssumthOmtg+mtj+mtjemtjumtkemtmOmttOmuk+mug+mukemulumul+mun+muoOmuqOmutOmvgOmviumuuemvhumvj+mvkemvkumvo+mvoumvpOmvlOmvoemwuumvsumvsemvsOmwlemwlOmwiemwk+mwjOmwhumwiOmwkumwiumwhOmwrumwm+mwpemwpOmwoemwsOmxh+mwsumxhumwvumxmumxoOmxp+mxtumxuOmzp+mzrOmzsOm0iem0iOmzq+m0g+m0hum0qum0pum2r+m0o+m0n+m1hOm0lem0kum1gem0v+m0vum1hum1iFwiXG5cdF0sXG5cdFtcblx0XHRcImYzYTFcIixcblx0XHRcIum1nem1num1pOm1kem1kOm1mem1sum2iem2h+m2q+m1r+m1uum2mum2pOm2qem2sum3hOm3gem2u+m2uOm2uum3hum3j+m3gum3mem3k+m3uOm3pum3rem3r+m3vem4mum4m+m4num5tem5uem5vem6gem6iOm6i+m6jOm6kum6lem6kem6nem6pem6qem6uOm6qum6remdoem7jOm7jum7j+m7kOm7lOm7nOm7num7nem7oOm7pem7qOm7r+m7tOm7tum7t+m7uem7u+m7vOm7vem8h+m8iOeat+m8lem8oem8rOm8vum9ium9kum9lOm9o+m9n+m9oOm9oem9pum9p+m9rOm9qum9t+m9sum9tum+lem+nOm+oFwiXG5cdF0sXG5cdFtcblx0XHRcImY0YTFcIixcblx0XHRcIuWgr+anh+mBmeeRpOWHnOeGmVwiXG5cdF0sXG5cdFtcblx0XHRcImY5YTFcIixcblx0XHRcIue6iuiknOmNiOmKiOiTnOS/ieeCu+aYseajiOmLueabu+W9heS4qOS7oeS7vOS8gOS8g+S8ueS9luS+kuS+iuS+muS+lOS/jeWBgOWAouS/v+WAnuWBhuWBsOWBguWClOWDtOWDmOWFiuWFpOWGneWGvuWHrOWIleWKnOWKpuWLgOWLm+WMgOWMh+WMpOWNsuWOk+WOsuWPne+ojuWSnOWSiuWSqeWTv+WWhuWdmeWdpeWerOWfiOWfh++oj++okOWinuWisuWki+Wlk+Wlm+WlneWlo+WmpOWmuuWtluWvgOeUr+WvmOWvrOWwnuWypuWyuuWzteW0p+W1k++okeW1guW1reW2uOW2ueW3kOW8oeW8tOW9p+W+t1wiXG5cdF0sXG5cdFtcblx0XHRcImZhYTFcIixcblx0XHRcIuW/nuaBneaCheaCiuaDnuaDleaEoOaDsuaEkeaEt+aEsOaGmOaIk+aKpuaPteaRoOaSneaTjuaVjuaYgOaYleaYu+aYieaYruaYnuaYpOaZpeaZl+aZme+okuaZs+aameaaoOaasuaav+abuuacju+kqeadpuaeu+ahkuafgOaggeahhOajj++ok+alqO+olOammOanouaosOapq+aphuaps+apvuarouarpOavluawv+axnOayhuaxr+azmua0hOa2h+a1r+a2lua2rOa3j+a3uOa3sua3vOa4uea5nOa4p+a4vOa6v+a+iOa+tea/teeAheeAh+eAqOeCheeCq+eEj+eEhOeFnOeFhueFh++oleeHgeeHvueKsVwiXG5cdF0sXG5cdFtcblx0XHRcImZiYTFcIixcblx0XHRcIueKvueMpO+olueNt+eOveePieePluePo+ePkueQh+ePteeQpueQqueQqeeQrueRoueSieeSn+eUgeeVr+eagueanOeanueam+eapu+ol+edhuWKr+egoeehjuehpOehuueksO+omO+ome+omuemlO+om+emm+erkeerp++onOerq+eunu+onee1iOe1nOe2t+e2oOe3lue5kue9h+e+oe+onuiMgeiNouiNv+iPh+iPtuiRiOiStOiVk+iVmeiVq++on+iWsO+ooO+ooeigh+ijteiokuiot+ipueiqp+iqvuirn++oouirtuitk+itv+izsOiztOi0kui1tu+oo+i7j++opO+opemBp+mDnu+opumElemEp+mHmlwiXG5cdF0sXG5cdFtcblx0XHRcImZjYTFcIixcblx0XHRcIumHl+mHnumHremHrumHpOmHpemIhumIkOmIiumIuumJgOmIvOmJjumJmemJkemIuemJp+mKp+mJt+mJuOmLp+mLl+mLmemLkO+op+mLlemLoOmLk+mMpemMoemLu++oqOmMnumLv+mMnemMgumNsOmNl+mOpOmPhumPnumPuOmQsemRhemRiOmWku+nnO+oqemanemar+mcs+mcu+mdg+mdjemdj+mdkemdlemhl+mhpe+oqu+oq+mkp++orOmmnumpjumrmemrnOmttemtsumuj+musemuu+mwgOm1sOm1q++orem4mem7kVwiXG5cdF0sXG5cdFtcblx0XHRcImZjZjFcIixcblx0XHRcIuKFsFwiLFxuXHRcdDksXG5cdFx0XCLvv6Lvv6TvvIfvvIJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmEyYWZcIixcblx0XHRcIsuYy4fCuMuZy53Cr8uby5rvvZ7OhM6FXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhMmMyXCIsXG5cdFx0XCLCocKmwr9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmEyZWJcIixcblx0XHRcIsK6wqrCqcKu4oSiwqTihJZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE2ZTFcIixcblx0XHRcIs6GzojOic6KzqpcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE2ZTdcIixcblx0XHRcIs6MXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhNmU5XCIsXG5cdFx0XCLOjs6rXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhNmVjXCIsXG5cdFx0XCLOj1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTZmMVwiLFxuXHRcdFwizqzOrc6uzq/Pis6Qz4zPgs+Nz4vOsM+OXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhN2MyXCIsXG5cdFx0XCLQglwiLFxuXHRcdDEwLFxuXHRcdFwi0I7Qj1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTdmMlwiLFxuXHRcdFwi0ZJcIixcblx0XHQxMCxcblx0XHRcItGe0Z9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE5YTFcIixcblx0XHRcIsOGxJBcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE5YTRcIixcblx0XHRcIsSmXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhOWE2XCIsXG5cdFx0XCLEslwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTlhOFwiLFxuXHRcdFwixYHEv1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTlhYlwiLFxuXHRcdFwixYrDmMWSXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhOWFmXCIsXG5cdFx0XCLFpsOeXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhOWMxXCIsXG5cdFx0XCLDpsSRw7DEp8SxxLPEuMWCxYDFicWLw7jFk8OfxafDvlwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYWFhMVwiLFxuXHRcdFwiw4HDgMOEw4LEgseNxIDEhMOFw4PEhsSIxIzDh8SKxI7DicOIw4vDisSaxJbEksSYXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhYWJhXCIsXG5cdFx0XCLEnMSexKLEoMSkw43DjMOPw47Hj8SwxKrErsSoxLTEtsS5xL3Eu8WDxYfFhcORw5PDksOWw5THkcWQxYzDlcWUxZjFlsWaxZzFoMWexaTFosOaw5nDnMObxazHk8WwxarFssWuxajHl8ebx5nHlcW0w53FuMW2xbnFvcW7XCJcblx0XSxcblx0W1xuXHRcdFwiOGZhYmExXCIsXG5cdFx0XCLDocOgw6TDosSDx47EgcSFw6XDo8SHxInEjcOnxIvEj8Opw6jDq8OqxJvEl8STxJnHtcSdxJ9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmFiYmRcIixcblx0XHRcIsShxKXDrcOsw6/DrseQXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhYmM1XCIsXG5cdFx0XCLEq8SvxKnEtcS3xLrEvsS8xYTFiMWGw7HDs8Oyw7bDtMeSxZHFjcO1xZXFmcWXxZvFncWhxZ/FpcWjw7rDucO8w7vFrceUxbHFq8Wzxa/FqceYx5zHmseWxbXDvcO/xbfFusW+xbxcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmIwYTFcIixcblx0XHRcIuS4guS4hOS4heS4jOS4kuS4n+S4o+S4pOS4qOS4q+S4ruS4r+S4sOS4teS5gOS5geS5hOS5h+S5keS5muS5nOS5o+S5qOS5qeS5tOS5teS5ueS5v+S6jeS6luS6l+S6neS6r+S6ueS7g+S7kOS7muS7m+S7oOS7oeS7ouS7qOS7r+S7seS7s+S7teS7veS7vuS7v+S8gOS8guS8g+S8iOS8i+S8jOS8kuS8leS8luS8l+S8meS8ruS8seS9oOS8s+S8teS8t+S8ueS8u+S8vuS9gOS9guS9iOS9ieS9i+S9jOS9kuS9lOS9luS9mOS9n+S9o+S9quS9rOS9ruS9seS9t+S9uOS9ueS9uuS9veS9vuS+geS+guS+hFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYjFhMVwiLFxuXHRcdFwi5L6F5L6J5L6K5L6M5L6O5L6Q5L6S5L6T5L6U5L6X5L6Z5L6a5L6e5L6f5L6y5L635L655L675L685L695L6+5L+A5L+B5L+F5L+G5L+I5L+J5L+L5L+M5L+N5L+P5L+S5L+c5L+g5L+i5L+w5L+y5L+85L+95L+/5YCA5YCB5YCE5YCH5YCK5YCM5YCO5YCQ5YCT5YCX5YCY5YCb5YCc5YCd5YCe5YCi5YCn5YCu5YCw5YCy5YCz5YC15YGA5YGB5YGC5YGF5YGG5YGK5YGM5YGO5YGR5YGS5YGT5YGX5YGZ5YGf5YGg5YGi5YGj5YGm5YGn5YGq5YGt5YGw5YGx5YC75YKB5YKD5YKE5YKG5YKK5YKO5YKP5YKQXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiMmExXCIsXG5cdFx0XCLlgpLlgpPlgpTlgpblgpvlgpzlgp5cIixcblx0XHQ0LFxuXHRcdFwi5YKq5YKv5YKw5YK55YK65YK95YOA5YOD5YOE5YOH5YOM5YOO5YOQ5YOT5YOU5YOY5YOc5YOd5YOf5YOi5YOk5YOm5YOo5YOp5YOv5YOx5YO25YO65YO+5YSD5YSG5YSH5YSI5YSL5YSM5YSN5YSO5YOy5YSQ5YSX5YSZ5YSb5YSc5YSd5YSe5YSj5YSn5YSo5YSs5YSt5YSv5YSx5YSz5YS05YS15YS45YS55YWC5YWK5YWP5YWT5YWV5YWX5YWY5YWf5YWk5YWm5YW+5YaD5YaE5YaL5YaO5YaY5Yad5Yah5Yaj5Yat5Ya45Ya65Ya85Ya+5Ya/5YeCXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiM2ExXCIsXG5cdFx0XCLlh4jlh4/lh5Hlh5Llh5Plh5Xlh5jlh57lh6Llh6Xlh67lh7Llh7Plh7Tlh7fliIHliILliIXliJLliJPliJXliJbliJjliKLliKjliLHliLLliLXliLzliYXliYnliZXliZfliZjliZrliZzliZ/liaDliaHliablia7libflibjlibnlioDlioLlioXliorliozlipPlipXlipblipflipjliprlipzliqTliqXliqbliqfliq/lirDlirblirflirjlirrlirvlir3li4Dli4Tli4bli4jli4zli4/li5Hli5Tli5bli5vli5zli6Hli6Xli6jli6nli6rli6zli7Dli7Hli7Tli7bli7fljIDljIPljIrljItcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmI0YTFcIixcblx0XHRcIuWMjOWMkeWMk+WMmOWMm+WMnOWMnuWMn+WMpeWMp+WMqOWMqeWMq+WMrOWMreWMsOWMsuWMteWMvOWMveWMvuWNguWNjOWNi+WNmeWNm+WNoeWNo+WNpeWNrOWNreWNsuWNueWNvuWOg+WOh+WOiOWOjuWOk+WOlOWOmeWOneWOoeWOpOWOquWOq+WOr+WOsuWOtOWOteWOt+WOuOWOuuWOveWPgOWPheWPj+WPkuWPk+WPleWPmuWPneWPnuWPoOWPpuWPp+WPteWQguWQk+WQmuWQoeWQp+WQqOWQquWQr+WQseWQtOWQteWRg+WRhOWRh+WRjeWRj+WRnuWRouWRpOWRpuWRp+WRqeWRq+WRreWRruWRtOWRv1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYjVhMVwiLFxuXHRcdFwi5ZKB5ZKD5ZKF5ZKI5ZKJ5ZKN5ZKR5ZKV5ZKW5ZKc5ZKf5ZKh5ZKm5ZKn5ZKp5ZKq5ZKt5ZKu5ZKx5ZK35ZK55ZK65ZK75ZK/5ZOG5ZOK5ZON5ZOO5ZOg5ZOq5ZOs5ZOv5ZO25ZO85ZO+5ZO/5ZSA5ZSB5ZSF5ZSI5ZSJ5ZSM5ZSN5ZSO5ZSV5ZSq5ZSr5ZSy5ZS15ZS25ZS75ZS85ZS95ZWB5ZWH5ZWJ5ZWK5ZWN5ZWQ5ZWR5ZWY5ZWa5ZWb5ZWe5ZWg5ZWh5ZWk5ZWm5ZW/5ZaB5ZaC5ZaG5ZaI5ZaO5ZaP5ZaR5ZaS5ZaT5ZaU5ZaX5Zaj5Zak5Zat5Zay5Za/5ZeB5ZeD5ZeG5ZeJ5ZeL5ZeM5ZeO5ZeR5ZeSXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiNmExXCIsXG5cdFx0XCLll5Pll5fll5jll5vll57ll6Lll6nll7bll7/lmIXlmIjlmIrlmI1cIixcblx0XHQ1LFxuXHRcdFwi5ZiZ5Zis5Ziw5Ziz5Zi15Zi35Zi55Zi75Zi85Zi95Zi/5ZmA5ZmB5ZmD5ZmE5ZmG5ZmJ5ZmL5ZmN5ZmP5ZmU5Zme5Zmg5Zmh5Zmi5Zmj5Zmm5Zmp5Zmt5Zmv5Zmx5Zmy5Zm15ZqE5ZqF5ZqI5ZqL5ZqM5ZqV5ZqZ5Zqa5Zqd5Zqe5Zqf5Zqm5Zqn5Zqo5Zqp5Zqr5Zqs5Zqt5Zqx5Zqz5Zq35Zq+5ZuF5ZuJ5ZuK5ZuL5ZuP5ZuQ5ZuM5ZuN5ZuZ5Zuc5Zud5Zuf5Zuh5ZukXCIsXG5cdFx0NCxcblx0XHRcIuWbseWbq+WbrVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYjdhMVwiLFxuXHRcdFwi5Zu25Zu35ZyB5ZyC5ZyH5ZyK5ZyM5ZyR5ZyV5Zya5Zyb5Zyd5Zyg5Zyi5Zyj5Zyk5Zyl5Zyp5Zyq5Zys5Zyu5Zyv5Zyz5Zy05Zy95Zy+5Zy/5Z2F5Z2G5Z2M5Z2N5Z2S5Z2i5Z2l5Z2n5Z2o5Z2r5Z2tXCIsXG5cdFx0NCxcblx0XHRcIuWds+WdtOWdteWdt+WdueWduuWdu+WdvOWdvuWegeWeg+WejOWelOWel+WemeWemuWenOWeneWenuWen+WeoeWeleWep+WeqOWeqeWerOWeuOWeveWfh+WfiOWfjOWfj+WfleWfneWfnuWfpOWfpuWfp+WfqeWfreWfsOWfteWftuWfuOWfveWfvuWfv+Wgg+WghOWgiOWgieWfoVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYjhhMVwiLFxuXHRcdFwi5aCM5aCN5aCb5aCe5aCf5aCg5aCm5aCn5aCt5aCy5aC55aC/5aGJ5aGM5aGN5aGP5aGQ5aGV5aGf5aGh5aGk5aGn5aGo5aG45aG85aG/5aKA5aKB5aKH5aKI5aKJ5aKK5aKM5aKN5aKP5aKQ5aKU5aKW5aKd5aKg5aKh5aKi5aKm5aKp5aKx5aKy5aOE5aK85aOC5aOI5aON5aOO5aOQ5aOS5aOU5aOW5aOa5aOd5aOh5aOi5aOp5aOz5aSF5aSG5aSL5aSM5aSS5aST5aSU6JmB5aSd5aSh5aSj5aSk5aSo5aSv5aSw5aSz5aS15aS25aS/5aWD5aWG5aWS5aWT5aWZ5aWb5aWd5aWe5aWf5aWh5aWj5aWr5aWtXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiOWExXCIsXG5cdFx0XCLlpa/lpbLlpbXlpbblpbnlpbvlpbzlpovlpozlpo7lppLlppXlppflpp/lpqTlpqflpq3lpq7lpq/lprDlprPlprflprrlprzlp4Hlp4Plp4Tlp4jlp4rlp43lp5Llp53lp57lp5/lp6Plp6Tlp6flp67lp6/lp7Hlp7Llp7Tlp7flqIDlqITlqIzlqI3lqI7lqJLlqJPlqJ7lqKPlqKTlqKflqKjlqKrlqK3lqLDlqYTlqYXlqYflqYjlqYzlqZDlqZXlqZ7lqaPlqaXlqaflqa3lqbflqbrlqbvlqb7lqovlqpDlqpPlqpblqpnlqpzlqp7lqp/lqqDlqqLlqqflqqzlqrHlqrLlqrPlqrXlqrjlqrrlqrvlqr9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmJhYTFcIixcblx0XHRcIuWrhOWrhuWriOWrj+WrmuWrnOWroOWrpeWrquWrruWrteWrtuWrveWsgOWsgeWsiOWsl+WstOWsmeWsm+WsneWsoeWspeWsreWsuOWtgeWti+WtjOWtkuWtluWtnuWtqOWtruWtr+WtvOWtveWtvuWtv+WugeWuhOWuhuWuiuWujuWukOWukeWuk+WulOWuluWuqOWuqeWurOWureWur+WuseWusuWut+WuuuWuvOWvgOWvgeWvjeWvj+WvllwiLFxuXHRcdDQsXG5cdFx0XCLlr6Dlr6/lr7Hlr7Tlr73lsIzlsJflsJ7lsJ/lsKPlsKblsKnlsKvlsKzlsK7lsLDlsLLlsLXlsLblsZnlsZrlsZzlsaLlsaPlsaflsajlsalcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmJiYTFcIixcblx0XHRcIuWxreWxsOWxtOWxteWxuuWxu+WxvOWxveWyh+WyiOWyiuWyj+WykuWyneWyn+WyoOWyouWyo+WypuWyquWysuWytOWyteWyuuWzieWzi+WzkuWzneWzl+WzruWzseWzsuWztOW0geW0huW0jeW0kuW0q+W0o+W0pOW0puW0p+W0seW0tOW0ueW0veW0v+W1guW1g+W1huW1iOW1leW1keW1meW1iuW1n+W1oOW1oeW1ouW1pOW1quW1reW1sOW1ueW1uuW1vuW1v+W2geW2g+W2iOW2iuW2kuW2k+W2lOW2leW2meW2m+W2n+W2oOW2p+W2q+W2sOW2tOW2uOW2ueW3g+W3h+W3i+W3kOW3juW3mOW3meW3oOW3pFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYmNhMVwiLFxuXHRcdFwi5bep5be45be55biA5biH5biN5biS5biU5biV5biY5bif5big5biu5bio5biy5bi15bi+5bmL5bmQ5bmJ5bmR5bmW5bmY5bmb5bmc5bme5bmo5bmqXCIsXG5cdFx0NCxcblx0XHRcIuW5sOW6gOW6i+W6juW6ouW6pOW6peW6qOW6quW6rOW6seW6s+W6veW6vuW6v+W7huW7jOW7i+W7juW7keW7kuW7lOW7leW7nOW7nuW7peW7q+W8guW8huW8h+W8iOW8juW8meW8nOW8neW8oeW8ouW8o+W8pOW8qOW8q+W8rOW8ruW8sOW8tOW8tuW8u+W8veW8v+W9gOW9hOW9heW9h+W9jeW9kOW9lOW9mOW9m+W9oOW9o+W9pOW9p1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYmRhMVwiLFxuXHRcdFwi5b2v5b2y5b205b215b245b265b295b2+5b6J5b6N5b6P5b6W5b6c5b6d5b6i5b6n5b6r5b6k5b6s5b6v5b6w5b6x5b645b+E5b+H5b+I5b+J5b+L5b+QXCIsXG5cdFx0NCxcblx0XHRcIuW/nuW/oeW/ouW/qOW/qeW/quW/rOW/reW/ruW/r+W/suW/s+W/tuW/uuW/vOaAh+aAiuaAjeaAk+aAlOaAl+aAmOaAmuaAn+aApOaAreaAs+aAteaBgOaBh+aBiOaBieaBjOaBkeaBlOaBluaBl+aBneaBoeaBp+aBseaBvuaBv+aCguaChuaCiOaCiuaCjuaCkeaCk+aCleaCmOaCneaCnuaCouaCpOaCpeaCqOaCsOaCseaCt1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYmVhMVwiLFxuXHRcdFwi5oK75oK+5oOC5oOE5oOI5oOJ5oOK5oOL5oOO5oOP5oOU5oOV5oOZ5oOb5oOd5oOe5oOi5oOl5oOy5oO15oO45oO85oO95oSC5oSH5oSK5oSM5oSQXCIsXG5cdFx0NCxcblx0XHRcIuaEluaEl+aEmeaEnOaEnuaEouaEquaEq+aEsOaEseaEteaEtuaEt+aEueaFgeaFheaFhuaFieaFnuaFoOaFrOaFsuaFuOaFu+aFvOaFv+aGgOaGgeaGg+aGhOaGi+aGjeaGkuaGk+aGl+aGmOaGnOaGneaGn+aGoOaGpeaGqOaGquaGreaGuOaGueaGvOaHgOaHgeaHguaHjuaHj+aHleaHnOaHneaHnuaHn+aHoeaHouaHp+aHqeaHpVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYmZhMVwiLFxuXHRcdFwi5oes5oet5oev5oiB5oiD5oiE5oiH5oiT5oiV5oic5oig5oii5oij5oin5oip5oir5oi55oi95omC5omD5omE5omG5omM5omQ5omR5omS5omU5omW5oma5omc5omk5omt5omv5omz5om65om95oqN5oqO5oqP5oqQ5oqm5oqo5oqz5oq25oq35oq65oq+5oq/5ouE5ouO5ouV5ouW5oua5ouq5ouy5ou05ou85ou95oyD5oyE5oyK5oyL5oyN5oyQ5oyT5oyW5oyY5oyp5oyq5oyt5oy15oy25oy55oy85o2B5o2C5o2D5o2E5o2G5o2K5o2L5o2O5o2S5o2T5o2U5o2Y5o2b5o2l5o2m5o2s5o2t5o2x5o205o21XCJcblx0XSxcblx0W1xuXHRcdFwiOGZjMGExXCIsXG5cdFx0XCLmjbjmjbzmjb3mjb/mjoLmjoTmjofmjormjpDmjpTmjpXmjpnmjprmjp7mjqTmjqbmjq3mjq7mjq/mjr3mj4Hmj4Xmj4jmj47mj5Hmj5Pmj5Tmj5Xmj5zmj6Dmj6Xmj6rmj6zmj7Lmj7Pmj7Xmj7jmj7nmkInmkIrmkJDmkJLmkJTmkJjmkJ7mkKDmkKLmkKTmkKXmkKnmkKrmkK/mkLDmkLXmkL3mkL/mkYvmkY/mkZHmkZLmkZPmkZTmkZrmkZvmkZzmkZ3mkZ/mkaDmkaHmkaPmka3mkbPmkbTmkbvmkb3mkoXmkofmko/mkpDmkpHmkpjmkpnmkpvmkp3mkp/mkqHmkqPmkqbmkqjmkqzmkrPmkr3mkr7mkr9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmMxYTFcIixcblx0XHRcIuaThOaTieaTiuaTi+aTjOaTjuaTkOaTkeaTleaTl+aTpOaTpeaTqeaTquaTreaTsOaTteaTt+aTu+aTv+aUgeaUhOaUiOaUieaUiuaUj+aUk+aUlOaUluaUmeaUm+aUnuaUn+aUouaUpuaUqeaUruaUseaUuuaUvOaUveaVg+aVh+aVieaVkOaVkuaVlOaVn+aVoOaVp+aVq+aVuuaVveaWgeaWheaWiuaWkuaWleaWmOaWneaWoOaWo+aWpuaWruaWsuaWs+aWtOaWv+aXguaXiOaXieaXjuaXkOaXlOaXluaXmOaXn+aXsOaXsuaXtOaXteaXueaXvuaXv+aYgOaYhOaYiOaYieaYjeaYkeaYkuaYleaYluaYnVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYzJhMVwiLFxuXHRcdFwi5pie5pih5pii5pij5pik5pim5pip5piq5pir5pis5piu5piw5pix5piz5pi55pi35pmA5pmF5pmG5pmK5pmM5pmR5pmO5pmX5pmY5pmZ5pmb5pmc5pmg5pmh5pu75pmq5pmr5pms5pm+5pmz5pm15pm/5pm35pm45pm55pm75pqA5pm85pqL5pqM5pqN5pqQ5pqS5pqZ5pqa5pqb5pqc5pqf5pqg5pqk5pqt5pqx5pqy5pq15pq75pq/5puA5puC5puD5puI5puM5puO5puP5puU5pub5puf5puo5pur5pus5puu5pu65pyF5pyH5pyO5pyT5pyZ5pyc5pyg5pyi5pyz5py+5p2F5p2H5p2I5p2M5p2U5p2V5p2dXCJcblx0XSxcblx0W1xuXHRcdFwiOGZjM2ExXCIsXG5cdFx0XCLmnabmnazmna7mnbTmnbbmnbvmnoHmnoTmno7mno/mnpHmnpPmnpbmnpjmnpnmnpvmnrDmnrHmnrLmnrXmnrvmnrzmnr3mn7nmn4Dmn4Lmn4Pmn4Xmn4jmn4nmn5Lmn5fmn5nmn5zmn6Hmn6bmn7Dmn7Lmn7bmn7fmoZLmoJTmoJnmoJ3moJ/moKjmoKfmoKzmoK3moK/moLDmoLHmoLPmoLvmoL/moYTmoYXmoYrmoYzmoZXmoZfmoZjmoZvmoavmoa5cIixcblx0XHQ0LFxuXHRcdFwi5qG15qG55qG65qG75qG85qKC5qKE5qKG5qKI5qKW5qKY5qKa5qKc5qKh5qKj5qKl5qKp5qKq5qKu5qKy5qK75qOF5qOI5qOM5qOPXCJcblx0XSxcblx0W1xuXHRcdFwiOGZjNGExXCIsXG5cdFx0XCLmo5Dmo5Hmo5Pmo5bmo5nmo5zmo53mo6Xmo6jmo6rmo6vmo6zmo63mo7Dmo7Hmo7Xmo7bmo7vmo7zmo73mpIbmpInmpIrmpJDmpJHmpJPmpJbmpJfmpLHmpLPmpLXmpLjmpLvmpYLmpYXmpYnmpY7mpZfmpZvmpaPmpaTmpaXmpabmpajmpanmpazmpbDmpbHmpbLmpbrmpbvmpb/mpoDmpo3mppLmppbmppjmpqHmpqXmpqbmpqjmpqvmpq3mpq/mprfmprjmprrmprzmp4Xmp4jmp5Hmp5bmp5fmp6Lmp6Xmp67mp6/mp7Hmp7Pmp7Xmp77mqIDmqIHmqIPmqI/mqJHmqJXmqJrmqJ3mqKDmqKTmqKjmqLDmqLJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmM1YTFcIixcblx0XHRcIuaotOaot+aou+aovuaov+apheaphuapieapiuapjuapkOapkeapkuapleapluapm+appOapp+apquapseaps+apvuaqgeaqg+aqhuaqh+aqieaqi+aqkeaqm+aqneaqnuaqn+aqpeaqq+aqr+aqsOaqseaqtOaqveaqvuaqv+arhuarieariOarjOarkOarlOarlearluarnOarnearpOarp+arrOarsOarsearsuarvOarveasguasg+ashuash+asieasj+askOaskeasl+asm+asnuaspOasqOasq+asrOasr+asteastuasu+asv+athuatiuatjeatkuatluatmOatneatoOatp+atq+atruatsOatteatvVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYzZhMVwiLFxuXHRcdFwi5q2+5q6C5q6F5q6X5q6b5q6f5q6g5q6i5q6j5q6o5q6p5q6s5q6t5q6u5q6w5q645q655q695q6+5q+D5q+E5q+J5q+M5q+W5q+a5q+h5q+j5q+m5q+n5q+u5q+x5q+35q+55q+/5rCC5rCE5rCF5rCJ5rCN5rCO5rCQ5rCS5rCZ5rCf5rCm5rCn5rCo5rCs5rCu5rCz5rC15rC25rC65rC75rC/5rGK5rGL5rGN5rGP5rGS5rGU5rGZ5rGb5rGc5rGr5rGt5rGv5rG05rG25rG45rG55rG75rKF5rKG5rKH5rKJ5rKU5rKV5rKX5rKY5rKc5rKf5rKw5rKy5rK05rOC5rOG5rON5rOP5rOQ5rOR5rOS5rOU5rOWXCJcblx0XSxcblx0W1xuXHRcdFwiOGZjN2ExXCIsXG5cdFx0XCLms5rms5zms6Dms6fms6nms6vms6zms67ms7Lms7TmtITmtIfmtIrmtI7mtI/mtJHmtJPmtJrmtKbmtKfmtKjmsafmtK7mtK/mtLHmtLnmtLzmtL/mtZfmtZ7mtZ/mtaHmtaXmtafmta/mtbDmtbzmtoLmtofmtpHmtpLmtpTmtpbmtpfmtpjmtqrmtqzmtrTmtrfmtrnmtr3mtr/mt4Tmt4jmt4rmt47mt4/mt5bmt5vmt53mt5/mt6Dmt6Lmt6Xmt6nmt6/mt7Dmt7Tmt7bmt7zmuIDmuITmuJ7muKLmuKfmuLLmuLbmuLnmuLvmuLzmuYTmuYXmuYjmuYnmuYvmuY/muZHmuZLmuZPmuZTmuZfmuZzmuZ3muZ5cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmM4YTFcIixcblx0XHRcIua5oua5o+a5qOa5s+a5u+a5vea6jea6k+a6mea6oOa6p+a6rea6rua6sea6s+a6u+a6v+a7gOa7gea7g+a7h+a7iOa7iua7jea7jua7j+a7q+a7rea7rua7uea7u+a7vea8hOa8iOa8iua8jOa8jea8lua8mOa8mua8m+a8pua8qea8qua8r+a8sOa8s+a8tua8u+a8vOa8rea9j+a9kea9kua9k+a9l+a9mea9mua9nea9nua9oea9oua9qOa9rOa9vea9vua+g+a+h+a+iOa+i+a+jOa+jea+kOa+kua+k+a+lOa+lua+mua+n+a+oOa+pea+pua+p+a+qOa+rua+r+a+sOa+tea+tua+vOa/hea/h+a/iOa/ilwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYzlhMVwiLFxuXHRcdFwi5r+a5r+e5r+o5r+p5r+w5r+15r+55r+85r+954CA54CF54CG54CH54CN54CX54Cg54Cj54Cv54C054C354C554C854GD54GE54GI54GJ54GK54GL54GU54GV54Gd54Ge54GO54Gk54Gl54Gs54Gu54G154G254G+54KB54KF54KG54KUXCIsXG5cdFx0NCxcblx0XHRcIueCm+eCpOeCq+eCsOeCseeCtOeCt+eDiueDkeeDk+eDlOeDleeDlueDmOeDnOeDpOeDuueEg1wiLFxuXHRcdDQsXG5cdFx0XCLnhIvnhIznhI/nhJ7nhKDnhKvnhK3nhK/nhLDnhLHnhLjnhYHnhYXnhYbnhYfnhYrnhYvnhZDnhZLnhZfnhZrnhZznhZ7nhaBcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmNhYTFcIixcblx0XHRcIueFqOeFueeGgOeGheeGh+eGjOeGkueGmueGm+eGoOeGoueGr+eGsOeGsueGs+eGuueGv+eHgOeHgeeHhOeHi+eHjOeHk+eHlueHmeeHmueHnOeHuOeHvueIgOeIh+eIiOeIieeIk+eIl+eImueIneeIn+eIpOeIq+eIr+eItOeIuOeIueeJgeeJgueJg+eJheeJjueJj+eJkOeJk+eJleeJlueJmueJnOeJnueJoOeJo+eJqOeJq+eJrueJr+eJseeJt+eJuOeJu+eJvOeJv+eKhOeKieeKjeeKjueKk+eKm+eKqOeKreeKrueKseeKtOeKvueLgeeLh+eLieeLjOeLleeLlueLmOeLn+eLpeeLs+eLtOeLuueLu1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmY2JhMVwiLFxuXHRcdFwi54u+54yC54yE54yF54yH54yL54yN54yS54yT54yY54yZ54ye54yi54yk54yn54yo54ys54yx54yy54y154y654y754y9542D542N542Q542S542W542Y542d542e542f542g542m542n542p542r542s542u542v542x542354255428546A546B546D546F546G546O546Q546T546V546X546Y546c546e546f546g546i546l546m546q546r546t54615463546554685469546/54+F54+G54+J54+L54+M54+P54+S54+T54+W54+Z54+d54+h54+j54+m54+n54+p54+054+154+354+554+654+754+9XCJcblx0XSxcblx0W1xuXHRcdFwiOGZjY2ExXCIsXG5cdFx0XCLnj7/nkIDnkIHnkITnkIfnkIrnkJHnkJrnkJvnkKTnkKbnkKhcIixcblx0XHQ5LFxuXHRcdFwi55C555GA55GD55GE55GG55GH55GL55GN55GR55GS55GX55Gd55Gi55Gm55Gn55Go55Gr55Gt55Gu55Gx55Gy55KA55KB55KF55KG55KH55KJ55KP55KQ55KR55KS55KY55KZ55Ka55Kc55Kf55Kg55Kh55Kj55Km55Ko55Kp55Kq55Kr55Ku55Kv55Kx55Ky55K155K555K755K/55OI55OJ55OM55OQ55OT55OY55Oa55Ob55Oe55Of55Ok55Oo55Oq55Or55Ov55O055O655O755O855O/55SGXCJcblx0XSxcblx0W1xuXHRcdFwiOGZjZGExXCIsXG5cdFx0XCLnlJLnlJbnlJfnlKDnlKHnlKTnlKfnlKnnlKrnlK/nlLbnlLnnlL3nlL7nlL/nlYDnlYPnlYfnlYjnlY7nlZDnlZLnlZfnlZ7nlZ/nlaHnla/nlbHnlblcIixcblx0XHQ1LFxuXHRcdFwi55aB55aF55aQ55aS55aT55aV55aZ55ac55ai55ak55a055a655a/55eA55eB55eE55eG55eM55eO55eP55eX55ec55ef55eg55eh55ek55en55es55eu55ev55ex55e555iA55iC55iD55iE55iH55iI55iK55iM55iP55iS55iT55iV55iW55iZ55ib55ic55id55ie55ij55il55im55ip55it55iy55iz55i155i455i5XCJcblx0XSxcblx0W1xuXHRcdFwiOGZjZWExXCIsXG5cdFx0XCLnmLrnmLznmYrnmYDnmYHnmYPnmYTnmYXnmYnnmYvnmZXnmZnnmZ/nmaTnmaXnma3nma7nma/nmbHnmbTnmoHnmoXnmoznmo3nmpXnmpvnmpznmp3nmp/nmqDnmqJcIixcblx0XHQ2LFxuXHRcdFwi55qq55qt55q955uB55uF55uJ55uL55uM55uO55uU55uZ55ug55um55uo55us55uw55ux55u255u555u855yA55yG55yK55yO55yS55yU55yV55yX55yZ55ya55yc55yi55yo55yt55yu55yv55y055y155y255y555y955y+552C552F552G552K552N552O552P552S552W552X552c552e552f552g552iXCJcblx0XSxcblx0W1xuXHRcdFwiOGZjZmExXCIsXG5cdFx0XCLnnaTnnafnnarnnaznnbDnnbLnnbPnnbTnnbrnnb3nnoDnnoTnnoznno3nnpTnnpXnnpbnnprnnp/nnqLnnqfnnqrnnq7nnq/nnrHnnrXnnr7nn4Pnn4nnn5Hnn5Lnn5Xnn5nnn57nn5/nn6Dnn6Tnn6bnn6rnn6znn7Dnn7Hnn7Tnn7jnn7vnoIXnoIbnoInnoI3noI7noJHnoJ3noKHnoKLnoKPnoK3noK7noLDnoLXnoLfnoYPnoYTnoYfnoYjnoYznoY7noZLnoZznoZ7noaDnoaHnoaPnoaTnoajnoarnoa7nobrnob7noornoo/nopTnopjnoqHnop3nop7nop/noqTnoqjnoqznoq3norDnorHnorLnorNcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmQwYTFcIixcblx0XHRcIueiu+eiveeiv+ejh+ejiOejieejjOejjuejkuejk+ejleejluejpOejm+ejn+ejoOejoeejpuejquejsuejs+ekgOejtuejt+ejuueju+ejv+ekhuekjOekkOekmueknOeknuekn+ekoOekpeekp+ekqeekreekseektOekteeku+ekveekv+elhOelheelhueliueli+elj+elkeellOelmOelm+elnOelp+elqeelq+elsuelueelu+elvOelvuemi+emjOemkeemk+emlOemleemluemmOemm+emnOemoeemqOemqeemq+emr+emseemtOemuOemu+enguenhOenh+eniOeniuenj+enlOenluenmuenneennlwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZDFhMVwiLFxuXHRcdFwi56eg56ei56el56eq56er56et56ex56e456e856iC56iD56iH56iJ56iK56iM56iR56iV56ib56ie56ih56in56ir56it56iv56iw56i056i156i456i556i656mE56mF56mH56mI56mM56mV56mW56mZ56mc56md56mf56mg56ml56mn56mq56mt56m156m456m+56qA56qC56qF56qG56qK56qL56qQ56qR56qU56qe56qg56qj56qs56qz56q156q556q756q856uG56uJ56uM56uO56uR56ub56uo56up56ur56us56ux56u056u756u956u+56yH56yU56yf56yj56yn56yp56yq56yr56yt56yu56yv56ywXCJcblx0XSxcblx0W1xuXHRcdFwiOGZkMmExXCIsXG5cdFx0XCLnrLHnrLTnrL3nrL/nrYDnrYHnrYfnrY7nrZXnraDnraTnrabnrannrarnra3nra/nrbLnrbPnrbfnroTnronnro7nrpDnrpHnrpbnrpvnrp7nrqDnrqXnrqznrq/nrrDnrrLnrrXnrrbnrrrnrrvnrrznrr3nr4Lnr4Xnr4jnr4rnr5Tnr5bnr5fnr5nnr5rnr5vnr6jnr6rnr7Lnr7Tnr7Xnr7jnr7nnr7rnr7znr77nsIHnsILnsIPnsITnsIbnsInnsIvnsIznsI7nsI/nsJnnsJvnsKDnsKXnsKbnsKjnsKznsLHnsLPnsLTnsLbnsLnnsLrnsYbnsYrnsZXnsZHnsZLnsZPnsZlcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjhmZDNhMVwiLFxuXHRcdFwi57Gh57Gj57Gn57Gp57Gt57Gu57Gw57Gy57G557G857G957KG57KH57KP57KU57Ke57Kg57Km57Kw57K257K357K657K757K857K/57OE57OH57OI57OJ57ON57OP57OT57OU57OV57OX57OZ57Oa57Od57Om57Op57Or57O157SD57SH57SI57SJ57SP57SR57SS57ST57SW57Sd57Se57Sj57Sm57Sq57St57Sx57S857S957S+57WA57WB57WH57WI57WN57WR57WT57WX57WZ57Wa57Wc57Wd57Wl57Wn57Wq57Ww57W457W657W757W/57aB57aC57aD57aF57aG57aI57aL57aM57aN57aR57aW57aX57adXCJcblx0XSxcblx0W1xuXHRcdFwiOGZkNGExXCIsXG5cdFx0XCLntp7ntqbntqfntqrntrPntrbntrfntrnnt4JcIixcblx0XHQ0LFxuXHRcdFwi57eM57eN57eO57eX57eZ57iA57ei57el57em57eq57er57et57ex57e157e257e557e657iI57iQ57iR57iV57iX57ic57id57ig57in57io57is57it57iv57iz57i257i/57mE57mF57mH57mO57mQ57mS57mY57mf57mh57mi57ml57mr57mu57mv57mz57m457m+57qB57qG57qH57qK57qN57qR57qV57qY57qa57qd57qe57y857y757y957y+57y/572D572E572H572P572S572T572b572c572d572h572j572k572l572m572tXCJcblx0XSxcblx0W1xuXHRcdFwiOGZkNWExXCIsXG5cdFx0XCLnvbHnvb3nvb7nvb/nvoDnvovnvo3nvo/nvpDnvpHnvpbnvpfnvpznvqHnvqLnvqbnvqrnvq3nvrTnvrznvr/nv4Dnv4Pnv4jnv47nv4/nv5vnv5/nv6Pnv6Xnv6jnv6znv67nv6/nv7Lnv7rnv73nv77nv7/ogIfogIjogIrogI3ogI7ogI/ogJHogJPogJTogJbogJ3ogJ7ogJ/ogKDogKTogKbogKzogK7ogLDogLTogLXogLfogLnogLrogLzogL7ogYDogYTogaDogaTogaboga3ogbHogbXogoHogojogo7ogpzogp7ogqbogqfogqvogrjogrnog4jog43og4/og5Log5Tog5Xog5fog5jog6Dog63og65cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmQ2YTFcIixcblx0XHRcIuiDsOiDsuiDs+iDtuiDueiDuuiDvuiEg+iEi+iEluiEl+iEmOiEnOiEnuiEoOiEpOiEp+iErOiEsOiEteiEuuiEvOiFheiFh+iFiuiFjOiFkuiFl+iFoOiFoeiFp+iFqOiFqeiFreiFr+iFt+iGgeiGkOiGhOiGheiGhuiGi+iGjuiGluiGmOiGm+iGnuiGouiGruiGsuiGtOiGu+iHi+iHg+iHheiHiuiHjuiHj+iHleiHl+iHm+iHneiHnuiHoeiHpOiHq+iHrOiHsOiHseiHsuiHteiHtuiHuOiHueiHveiHv+iIgOiIg+iIj+iIk+iIlOiImeiImuiIneiIoeiIouiIqOiIsuiItOiIuuiJg+iJhOiJheiJhlwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZDdhMVwiLFxuXHRcdFwi6ImL6ImO6ImP6ImR6ImW6Imc6Img6Imj6Imn6Imt6Im06Im76Im96Im/6IqA6IqB6IqD6IqE6IqH6IqJ6IqK6IqO6IqR6IqU6IqW6IqY6Iqa6Iqb6Iqg6Iqh6Iqj6Iqk6Iqn6Iqo6Iqp6Iqq6Iqu6Iqw6Iqy6Iq06Iq36Iq66Iq86Iq+6Iq/6IuG6IuQ6IuV6Iua6Iug6Iui6Iuk6Iuo6Iuq6Iut6Iuv6Iu26Iu36Iu96Iu+6IyA6IyB6IyH6IyI6IyK6IyL6I2U6Iyb6Iyd6Iye6Iyf6Iyh6Iyi6Iys6Iyt6Iyu6Iyw6Iyz6Iy36Iy66Iy86Iy96I2C6I2D6I2E6I2H6I2N6I2O6I2R6I2V6I2W6I2X6I2w6I24XCJcblx0XSxcblx0W1xuXHRcdFwiOGZkOGExXCIsXG5cdFx0XCLojb3ojb/ojoDojoLojoTojobojo3ojpLojpTojpXojpjojpnojpvojpzojp3ojqbojqfojqnojqzojr7ojr/oj4Doj4foj4noj4/oj5Doj5Hoj5Toj53ojZPoj6joj6roj7boj7joj7noj7zokIHokIbokIrokI/okJHokJXokJnojq3okK/okLnokYXokYfokYjokYrokY3okY/okZHokZLokZbokZjokZnokZrokZzokaDokaTokaXokafokarokbDokbPokbTokbbokbjokbzokb3okoHokoXokpLokpPokpXokp7okqbokqjokqnokqrokq/okrHokrTokrrokr3okr7ok4Dok4Lok4fok4jok4zok4/ok5NcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmQ5YTFcIixcblx0XHRcIuiTnOiTp+iTquiTr+iTsOiTseiTsuiTt+iUsuiTuuiTu+iTveiUguiUg+iUh+iUjOiUjuiUkOiUnOiUnuiUouiUo+iUpOiUpeiUp+iUquiUq+iUr+iUs+iUtOiUtuiUv+iVhuiVj1wiLFxuXHRcdDQsXG5cdFx0XCLolZbolZnolZxcIixcblx0XHQ2LFxuXHRcdFwi6JWk6JWr6JWv6JW56JW66JW76JW96JW/6JaB6JaF6JaG6JaJ6JaL6JaM6JaP6JaT6JaY6Jad6Jaf6Jag6Jai6Jal6Jan6Ja06Ja26Ja36Ja46Ja86Ja96Ja+6Ja/6JeC6JeH6JeK6JeL6JeO6Jat6JeY6Jea6Jef6Jeg6Jem6Jeo6Jet6Jez6Je26Je8XCJcblx0XSxcblx0W1xuXHRcdFwiOGZkYWExXCIsXG5cdFx0XCLol7/omIDomITomIXomI3omI7omJDomJHomJLomJjomJnomJvomJ7omKHomKfomKnomLbomLjomLromLzomL3omYDomYLomYbomZLomZPomZbomZfomZjomZnomZ3omaBcIixcblx0XHQ0LFxuXHRcdFwi6Jmp6Jms6Jmv6Jm16Jm26Jm36Jm66JqN6JqR6JqW6JqY6Jqa6Jqc6Jqh6Jqm6Jqn6Jqo6Jqt6Jqx6Jqz6Jq06Jq16Jq36Jq46Jq56Jq/6JuA6JuB6JuD6JuF6JuR6JuS6JuV6JuX6Jua6Juc6Jug6Juj6Jul6Jun6JqI6Ju66Ju86Ju96JyE6JyF6JyH6JyL6JyO6JyP6JyQ6JyT6JyU6JyZ6Jye6Jyf6Jyh6JyjXCJcblx0XSxcblx0W1xuXHRcdFwiOGZkYmExXCIsXG5cdFx0XCLonKjonK7onK/onLHonLLonLnonLronLzonL3onL7onYDonYPonYXonY3onZjonZ3onaHonaTonaXona/onbHonbLonbvonoNcIixcblx0XHQ2LFxuXHRcdFwi6J6L6J6M6J6Q6J6T6J6V6J6X6J6Y6J6Z6J6e6J6g6J6j6J6n6J6s6J6t6J6u6J6x6J616J6+6J6/6J+B6J+I6J+J6J+K6J+O6J+V6J+W6J+Z6J+a6J+c6J+f6J+i6J+j6J+k6J+q6J+r6J+t6J+x6J+z6J+46J+66J+/6KCB6KCD6KCG6KCJ6KCK6KCL6KCQ6KCZ6KCS6KCT6KCU6KCY6KCa6KCb6KCc6KCe6KCf6KCo6KCt6KCu6KCw6KCy6KC1XCJcblx0XSxcblx0W1xuXHRcdFwiOGZkY2ExXCIsXG5cdFx0XCLooLrooLzooYHooYPooYXooYjooYnooYrooYvooY7ooZHooZXooZbooZjooZrooZzooZ/ooaDooaTooanoobHoobnoobvoooDoopjooproopvoopzoop/ooqDooqjooqroorroor3oor7oo4Doo4pcIixcblx0XHQ0LFxuXHRcdFwi6KOR6KOS6KOT6KOb6KOe6KOn6KOv6KOw6KOx6KO16KO36KSB6KSG6KSN6KSO6KSP6KSV6KSW6KSY6KSZ6KSa6KSc6KSg6KSm6KSn6KSo6KSw6KSx6KSy6KS16KS56KS66KS+6KWA6KWC6KWF6KWG6KWJ6KWP6KWS6KWX6KWa6KWb6KWc6KWh6KWi6KWj6KWr6KWu6KWw6KWz6KW16KW6XCJcblx0XSxcblx0W1xuXHRcdFwiOGZkZGExXCIsXG5cdFx0XCLopbvopbzopb3oponopo3oppDoppToppXoppvoppzopp/opqDopqXoprDoprToprXoprboprfoprzop5RcIixcblx0XHQ0LFxuXHRcdFwi6Kel6Kep6Ker6Ket6Kex6Kez6Ke26Ke56Ke96Ke/6KiE6KiF6KiH6KiP6KiR6KiS6KiU6KiV6Kie6Kig6Kii6Kik6Kim6Kir6Kis6Kiv6Ki16Ki36Ki96Ki+6KmA6KmD6KmF6KmH6KmJ6KmN6KmO6KmT6KmW6KmX6KmY6Kmc6Kmd6Kmh6Kml6Kmn6Km16Km26Km36Km56Km66Km76Km+6Km/6KqA6KqD6KqG6KqL6KqP6KqQ6KqS6KqW6KqX6KqZ6Kqf6Kqn6Kqp6Kqu6Kqv6KqzXCJcblx0XSxcblx0W1xuXHRcdFwiOGZkZWExXCIsXG5cdFx0XCLoqrboqrfoqrvoqr7oq4Poq4boq4joq4noq4roq5Hoq5Poq5Toq5Xoq5foq53oq5/oq6zoq7Doq7Toq7Xoq7boq7zoq7/orIXorIborIvorJHorJzorJ7orJ/orIrorK3orLDorLforLzorYJcIixcblx0XHQ0LFxuXHRcdFwi6K2I6K2S6K2T6K2U6K2Z6K2N6K2e6K2j6K2t6K226K246K256K286K2+6K6B6K6E6K6F6K6L6K6N6K6P6K6U6K6V6K6c6K6e6K6f6LC46LC56LC96LC+6LGF6LGH6LGJ6LGL6LGP6LGR6LGT6LGU6LGX6LGY6LGb6LGd6LGZ6LGj6LGk6LGm6LGo6LGp6LGt6LGz6LG16LG26LG76LG+6LKGXCJcblx0XSxcblx0W1xuXHRcdFwiOGZkZmExXCIsXG5cdFx0XCLosofosovospDospLospPospnospvospzosqTosrnosrros4Xos4bos4nos4vos4/os5bos5Xos5nos53os6Hos6jos6zos6/os7Dos7Los7Xos7fos7jos77os7/otIHotIPotInotJLotJfotJvotaXotanotazota7otb/otoLotoTotojoto3otpDotpHotpXotp7otp/otqDotqbotqvotqzotq/otrLotrXotrfotrnotrvot4Dot4Xot4bot4fot4jot4rot47ot5Hot5Tot5Xot5fot5not6Tot6Xot6fot6zot7Dotrzot7Hot7Lot7Tot73ouIHouITouIXouIbouIvouJHouJTouJbouKDouKHouKJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmUwYTFcIixcblx0XHRcIui4o+i4pui4p+i4sei4s+i4tui4t+i4uOi4uei4vei5gOi5gei5i+i5jei5jui5j+i5lOi5m+i5nOi5nei5nui5oei5oui5qei5rOi5rei5r+i5sOi5sei5uei5uui5u+i6gui6g+i6iei6kOi6kui6lei6mui6m+i6nei6nui6oui6p+i6qei6rei6rui6s+i6tei6uui6u+i7gOi7gei7g+i7hOi7h+i7j+i7kei7lOi7nOi7qOi7rui7sOi7sei7t+i7uei7uui7rei8gOi8gui8h+i8iOi8j+i8kOi8lui8l+i8mOi8nui8oOi8oei8o+i8pei8p+i8qOi8rOi8rei8rui8tOi8tei8tui8t+i8uui9gOi9gVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZTFhMVwiLFxuXHRcdFwi6L2D6L2H6L2P6L2RXCIsXG5cdFx0NCxcblx0XHRcIui9mOi9nei9nui9pei+nei+oOi+oei+pOi+pei+pui+tei+tui+uOi+vui/gOi/gei/hui/iui/i+i/jei/kOi/kui/k+i/lei/oOi/o+i/pOi/qOi/rui/sei/tei/tui/u+i/vumAgumAhOmAiOmAjOmAmOmAm+mAqOmAqemAr+mAqumArOmAremAs+mAtOmAt+mAv+mBg+mBhOmBjOmBm+mBnemBoumBpumBp+mBrOmBsOmBtOmBuemChemCiOmCi+mCjOmCjumCkOmClemCl+mCmOmCmemCm+mCoOmCoemCoumCpemCsOmCsumCs+mCtOmCtumCvemDjOmCvumDg1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmZTJhMVwiLFxuXHRcdFwi6YOE6YOF6YOH6YOI6YOV6YOX6YOY6YOZ6YOc6YOd6YOf6YOl6YOS6YO26YOr6YOv6YOw6YO06YO+6YO/6YSA6YSE6YSF6YSG6YSI6YSN6YSQ6YSU6YSW6YSX6YSY6YSa6YSc6YSe6YSg6YSl6YSi6YSj6YSn6YSp6YSu6YSv6YSx6YS06YS26YS36YS56YS66YS86YS96YWD6YWH6YWI6YWP6YWT6YWX6YWZ6YWa6YWb6YWh6YWk6YWn6YWt6YW06YW56YW66YW76YaB6YaD6YaF6YaG6YaK6YaO6YaR6YaT6YaU6YaV6YaY6Yae6Yah6Yam6Yao6Yas6Yat6Yau6Yaw6Yax6Yay6Yaz6Ya26Ya76Ya86Ya96Ya/XCJcblx0XSxcblx0W1xuXHRcdFwiOGZlM2ExXCIsXG5cdFx0XCLph4Lph4Pph4Xph5Pph5Tph5fph5nph5rph57ph6Tph6Xph6nph6rph6xcIixcblx0XHQ1LFxuXHRcdFwi6Ye36Ye56Ye76Ye96YiA6YiB6YiE6YiF6YiG6YiH6YiJ6YiK6YiM6YiQ6YiS6YiT6YiW6YiY6Yic6Yid6Yij6Yik6Yil6Yim6Yio6Yiu6Yiv6Yiw6Yiz6Yi16Yi26Yi46Yi56Yi66Yi86Yi+6YmA6YmC6YmD6YmG6YmH6YmK6YmN6YmO6YmP6YmR6YmY6YmZ6Ymc6Ymd6Ymg6Ymh6Yml6Ymn6Ymo6Ymp6Ymu6Ymv6Ymw6Ym1XCIsXG5cdFx0NCxcblx0XHRcIumJu+mJvOmJvemJv+mKiOmKiemKiumKjemKjumKkumKl1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmZTRhMVwiLFxuXHRcdFwi6YqZ6Yqf6Yqg6Yqk6Yql6Yqn6Yqo6Yqr6Yqv6Yqy6Yq26Yq46Yq66Yq76Yq86Yq96Yq/XCIsXG5cdFx0NCxcblx0XHRcIumLhemLhumLh+mLiOmLi+mLjOmLjemLjumLkOmLk+mLlemLl+mLmOmLmemLnOmLnemLn+mLoOmLoemLo+mLpemLp+mLqOmLrOmLrumLsOmLuemLu+mLv+mMgOmMgumMiOmMjemMkemMlOmMlemMnOmMnemMnumMn+mMoemMpOmMpemMp+mMqemMqumMs+mMtOmMtumMt+mNh+mNiOmNiemNkOmNkemNkumNlemNl+mNmOmNmumNnumNpOmNpemNp+mNqemNqumNremNr+mNsOmNsemNs+mNtOmNtlwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZTVhMVwiLFxuXHRcdFwi6Y266Y296Y2/6Y6A6Y6B6Y6C6Y6I6Y6K6Y6L6Y6N6Y6P6Y6S6Y6V6Y6Y6Y6b6Y6e6Y6h6Y6j6Y6k6Y6m6Y6o6Y6r6Y606Y616Y626Y666Y6p6Y+B6Y+E6Y+F6Y+G6Y+H6Y+JXCIsXG5cdFx0NCxcblx0XHRcIumPk+mPmemPnOmPnumPn+mPoumPpumPp+mPuemPt+mPuOmPuumPu+mPvemQgemQgumQhOmQiOmQiemQjemQjumQj+mQlemQlumQl+mQn+mQrumQr+mQsemQsumQs+mQtOmQu+mQv+mQvemRg+mRhemRiOmRiumRjOmRlemRmemRnOmRn+mRoemRo+mRqOmRq+mRremRrumRr+mRsemRsumShOmSg+mVuOmVuVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZTZhMVwiLFxuXHRcdFwi6ZW+6ZaE6ZaI6ZaM6ZaN6ZaO6Zad6Zae6Zaf6Zah6Zam6Zap6Zar6Zas6Za06Za26Za66Za96Za/6ZeG6ZeI6ZeJ6ZeL6ZeQ6ZeR6ZeS6ZeT6ZeZ6Zea6Zed6Zee6Zef6Zeg6Zek6Zem6Zid6Zie6Zii6Zik6Zil6Zim6Zis6Zix6Ziz6Zi36Zi46Zi56Zi66Zi86Zi96ZmB6ZmS6ZmU6ZmW6ZmX6ZmY6Zmh6Zmu6Zm06Zm76Zm86Zm+6Zm/6ZqB6ZqC6ZqD6ZqE6ZqJ6ZqR6ZqW6Zqa6Zqd6Zqf6Zqk6Zql6Zqm6Zqp6Zqu6Zqv6Zqz6Zq66ZuK6ZuS5bay6ZuY6Zua6Zud6Zue6Zuf6Zup6Zuv6Zux6Zu66ZyCXCJcblx0XSxcblx0W1xuXHRcdFwiOGZlN2ExXCIsXG5cdFx0XCLpnIPpnIXpnInpnJrpnJvpnJ3pnKHpnKLpnKPpnKjpnLHpnLPpnYHpnYPpnYrpnY7pnY/pnZXpnZfpnZjpnZrpnZvpnaPpnafpnarpna7pnbPpnbbpnbfpnbjpnbvpnb3pnb/pnoDpnonpnpXpnpbpnpfpnpnpnprpnp7pnp/pnqLpnqzpnq7pnrHpnrLpnrXpnrbpnrjpnrnpnrrpnrzpnr7pnr/pn4Hpn4Tpn4Xpn4fpn4npn4rpn4zpn43pn47pn5Dpn5Hpn5Tpn5fpn5jpn5npn53pn57pn6Dpn5vpn6Hpn6Tpn6/pn7Hpn7Tpn7fpn7jpn7rpoIfpoIrpoJnpoI3poI7poJTpoJbpoJzpoJ7poKDpoKPpoKZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmU4YTFcIixcblx0XHRcIumgq+mgrumgr+mgsOmgsumgs+mgtemgpemgvumhhOmhh+mhiumhkemhkumhk+mhlumhl+mhmemhmumhoumho+mhpemhpumhqumhrOmiq+miremirumisOmitOmit+miuOmiuumiu+miv+mjgumjhemjiOmjjOmjoemjo+mjpemjpumjp+mjqumjs+mjtumkgumkh+mkiOmkkemklemklumkl+mkmumkm+mknOmkn+mkoumkpumkp+mkq+mksVwiLFxuXHRcdDQsXG5cdFx0XCLppLnppLrppLvppLzppYDppYHppYbppYfppYjppY3ppY7ppZTppZjppZnppZvppZzppZ7ppZ/ppaDpppvppp3ppp/ppqbpprDpprHpprLpprVcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmU5YTFcIixcblx0XHRcIummuemmuummvemmv+mng+mniemnk+mnlOmnmemnmumnnOmnnumnp+mnqumnq+mnrOmnsOmntOmntemnuemnvemnvumogumog+mohOmoi+mojOmokOmokemolumonumooOmooumoo+mopOmop+moremorumos+motemotumouOmph+mpgemphOmpiumpi+mpjOmpjumpkemplOmplumpnemqqumqrOmqrumqr+mqsumqtOmqtemqtumquemqu+mqvumqv+mrgemrg+mrhumriOmrjumrkOmrkumrlemrlumrl+mrm+mrnOmroOmrpOmrpemrp+mrqemrrOmrsumrs+mrtemruemruumrvemrv1wiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiOGZlYWExXCIsXG5cdFx0XCLprITprIXprIjprInprIvprIzprI3prI7prJDprJLprJbprJnprJvprJzprKDprKbprKvprK3prLPprLTprLXprLfprLnprLrprL3prYjprYvprYzprZXprZbprZfprZvprZ7praHpraPpraXprabprajprapcIixcblx0XHQ0LFxuXHRcdFwi6a2z6a216a236a246a256a2/6a6A6a6E6a6F6a6G6a6H6a6J6a6K6a6L6a6N6a6P6a6Q6a6U6a6a6a6d6a6e6a6m6a6n6a6p6a6s6a6w6a6x6a6y6a636a646a676a686a6+6a6/6a+B6a+H6a+I6a+O6a+Q6a+X6a+Y6a+d6a+f6a+l6a+n6a+q6a+r6a+v6a+z6a+36a+4XCJcblx0XSxcblx0W1xuXHRcdFwiOGZlYmExXCIsXG5cdFx0XCLpr7npr7rpr73pr7/psIDpsILpsIvpsI/psJHpsJbpsJjpsJnpsJrpsJzpsJ7psKLpsKPpsKZcIixcblx0XHQ0LFxuXHRcdFwi6bCx6bC16bC26bC36bC96bGB6bGD6bGE6bGF6bGJ6bGK6bGO6bGP6bGQ6bGT6bGU6bGW6bGY6bGb6bGd6bGe6bGf6bGj6bGp6bGq6bGc6bGr6bGo6bGu6bGw6bGy6bG16bG36bG76bOm6bOy6bO36bO56bSL6bSC6bSR6bSX6bSY6bSc6bSd6bSe6bSv6bSw6bSy6bSz6bS06bS66bS86bWF6bS96bWC6bWD6bWH6bWK6bWT6bWU6bWf6bWj6bWi6bWl6bWp6bWq6bWr6bWw6bW26bW36bW7XCJcblx0XSxcblx0W1xuXHRcdFwiOGZlY2ExXCIsXG5cdFx0XCLptbzptb7ptoPptoTptobptorpto3pto7ptpLptpPptpXptpbptpfptpjptqHptqrptqzptq7ptrHptrXptrnptrzptr/pt4Ppt4fpt4npt4rpt5Tpt5Xpt5bpt5fpt5rpt57pt5/pt6Dpt6Xpt6fpt6npt6vpt67pt7Dpt7Ppt7Tpt77puIrpuILpuIfpuI7puJDpuJHpuJLpuJXpuJbpuJnpuJzpuJ3pubrpubvpubzpuoDpuoLpuoPpuoTpuoXpuofpuo7puo/pupbpupjpupvpup7puqTpuqjpuqzpuq7puq/purDpurPpurTpurXpu4bpu4jpu4vpu5Xpu5/pu6Tpu6fpu6zpu63pu67pu7Dpu7Hpu7Lpu7VcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmVkYTFcIixcblx0XHRcIum7uOm7v+m8gum8g+m8iem8j+m8kOm8kem8kum8lOm8lum8l+m8mem8mum8m+m8n+m8oum8pum8qum8q+m8r+m8sem8sum8tOm8t+m8uem8uum8vOm8vem8v+m9gem9g1wiLFxuXHRcdDQsXG5cdFx0XCLpvZPpvZXpvZbpvZfpvZjpvZrpvZ3pvZ7pvajpvanpva1cIixcblx0XHQ0LFxuXHRcdFwi6b2z6b216b266b296b6P6b6Q6b6R6b6S6b6U6b6W6b6X6b6e6b6h6b6i6b6j6b6lXCJcblx0XVxuXTtcblxudmFyIGV1Y2pwJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0J2RlZmF1bHQnOiBldWNqcFxufSk7XG5cbnZhciBjcDkzNiA9IFtcblx0W1xuXHRcdFwiMFwiLFxuXHRcdFwiXFx1MDAwMFwiLFxuXHRcdDEyNyxcblx0XHRcIuKCrFwiXG5cdF0sXG5cdFtcblx0XHRcIjgxNDBcIixcblx0XHRcIuS4guS4hOS4heS4huS4j+S4kuS4l+S4n+S4oOS4oeS4o+S4puS4qeS4ruS4r+S4seS4s+S4teS4t+S4vOS5gOS5geS5guS5hOS5huS5iuS5keS5leS5l+S5muS5m+S5ouS5o+S5pOS5peS5p+S5qOS5qlwiLFxuXHRcdDUsXG5cdFx0XCLkubLkubRcIixcblx0XHQ5LFxuXHRcdFwi5Lm/XCIsXG5cdFx0Nixcblx0XHRcIuS6h+S6ilwiXG5cdF0sXG5cdFtcblx0XHRcIjgxODBcIixcblx0XHRcIuS6kOS6luS6l+S6meS6nOS6neS6nuS6o+S6quS6r+S6sOS6seS6tOS6tuS6t+S6uOS6ueS6vOS6veS6vuS7iOS7jOS7j+S7kOS7kuS7muS7m+S7nOS7oOS7ouS7puS7p+S7qeS7reS7ruS7r+S7seS7tOS7uOS7ueS7uuS7vOS7vuS8gOS8glwiLFxuXHRcdDYsXG5cdFx0XCLkvIvkvIzkvJJcIixcblx0XHQ0LFxuXHRcdFwi5Lyc5Lyd5Lyh5Lyj5Lyo5Lyp5Lys5Lyt5Lyu5Lyx5Lyz5Ly15Ly35Ly55Ly75Ly+XCIsXG5cdFx0NCxcblx0XHRcIuS9hOS9heS9h1wiLFxuXHRcdDUsXG5cdFx0XCLkvZLkvZTkvZbkvaHkvaLkvabkvajkvarkvavkva3kva7kvbHkvbLkvbXkvbfkvbjkvbnkvbrkvb3kvoDkvoHkvoLkvoXkvobkvofkvorkvozkvo7kvpDkvpLkvpPkvpXkvpbkvpjkvpnkvprkvpzkvp7kvp/kvqHkvqJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MjQwXCIsXG5cdFx0XCLkvqTkvqvkvq3kvrBcIixcblx0XHQ0LFxuXHRcdFwi5L62XCIsXG5cdFx0OCxcblx0XHRcIuS/gOS/geS/guS/huS/h+S/iOS/ieS/i+S/jOS/jeS/klwiLFxuXHRcdDQsXG5cdFx0XCLkv5nkv5vkv6Dkv6Lkv6Tkv6Xkv6fkv6vkv6zkv7Dkv7Lkv7Tkv7Xkv7bkv7fkv7nkv7vkv7zkv73kv79cIixcblx0XHQxMVxuXHRdLFxuXHRbXG5cdFx0XCI4MjgwXCIsXG5cdFx0XCLlgIvlgI7lgJDlgJHlgJPlgJXlgJblgJflgJvlgJ3lgJ7lgKDlgKLlgKPlgKTlgKflgKvlgK9cIixcblx0XHQxMCxcblx0XHRcIuWAu+WAveWAv+WBgOWBgeWBguWBhOWBheWBhuWBieWBiuWBi+WBjeWBkFwiLFxuXHRcdDQsXG5cdFx0XCLlgZblgZflgZjlgZnlgZvlgZ1cIixcblx0XHQ3LFxuXHRcdFwi5YGmXCIsXG5cdFx0NSxcblx0XHRcIuWBrVwiLFxuXHRcdDgsXG5cdFx0XCLlgbjlgbnlgbrlgbzlgb3lgoHlgoLlgoPlgoTlgoblgoflgonlgorlgovlgozlgo5cIixcblx0XHQyMCxcblx0XHRcIuWCpOWCpuWCquWCq+WCrVwiLFxuXHRcdDQsXG5cdFx0XCLlgrNcIixcblx0XHQ2LFxuXHRcdFwi5YK8XCJcblx0XSxcblx0W1xuXHRcdFwiODM0MFwiLFxuXHRcdFwi5YK9XCIsXG5cdFx0MTcsXG5cdFx0XCLlg5BcIixcblx0XHQ1LFxuXHRcdFwi5YOX5YOY5YOZ5YObXCIsXG5cdFx0MTAsXG5cdFx0XCLlg6jlg6nlg6rlg6vlg6/lg7Dlg7Hlg7Llg7Tlg7ZcIixcblx0XHQ0LFxuXHRcdFwi5YO8XCIsXG5cdFx0OSxcblx0XHRcIuWEiFwiXG5cdF0sXG5cdFtcblx0XHRcIjgzODBcIixcblx0XHRcIuWEieWEiuWEjFwiLFxuXHRcdDUsXG5cdFx0XCLlhJNcIixcblx0XHQxMyxcblx0XHRcIuWEolwiLFxuXHRcdDI4LFxuXHRcdFwi5YWC5YWH5YWK5YWM5YWO5YWP5YWQ5YWS5YWT5YWX5YWY5YWZ5YWb5YWdXCIsXG5cdFx0NCxcblx0XHRcIuWFo+WFpOWFpuWFp+WFqeWFquWFr+WFsuWFuuWFvuWFv+WGg+WGhOWGhuWGh+WGiuWGi+WGjuWGj+WGkOWGkeWGk+WGlOWGmOWGmuWGneWGnuWGn+WGoeWGo+WGplwiLFxuXHRcdDQsXG5cdFx0XCLlhq3lhq7lhrTlhrjlhrnlhrrlhr7lhr/lh4Hlh4Llh4Plh4Xlh4jlh4rlh43lh47lh5Dlh5JcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjg0NDBcIixcblx0XHRcIuWHmOWHmeWHmuWHnOWHnuWHn+WHouWHo+WHpVwiLFxuXHRcdDUsXG5cdFx0XCLlh6zlh67lh7Hlh7Llh7Tlh7flh77liITliIXliInliIvliIzliI/liJDliJPliJTliJXliJzliJ7liJ/liKHliKLliKPliKXliKbliKfliKrliKzliK/liLHliLLliLTliLXliLzliL7liYRcIixcblx0XHQ1LFxuXHRcdFwi5YmL5YmO5YmP5YmS5YmT5YmV5YmX5YmYXCJcblx0XSxcblx0W1xuXHRcdFwiODQ4MFwiLFxuXHRcdFwi5YmZ5Yma5Ymb5Ymd5Ymf5Ymg5Ymi5Ymj5Ymk5Ymm5Ymo5Ymr5Yms5Ymt5Ymu5Ymw5Ymx5YmzXCIsXG5cdFx0OSxcblx0XHRcIuWJvuWKgOWKg1wiLFxuXHRcdDQsXG5cdFx0XCLliolcIixcblx0XHQ2LFxuXHRcdFwi5YqR5YqS5YqUXCIsXG5cdFx0Nixcblx0XHRcIuWKnOWKpOWKpeWKpuWKp+WKruWKr+WKsOWKtFwiLFxuXHRcdDksXG5cdFx0XCLli4Dli4Hli4Lli4Tli4Xli4bli4jli4rli4zli43li47li4/li5Hli5Pli5Tli5Xli5fli5lcIixcblx0XHQ1LFxuXHRcdFwi5Yug5Yuh5Yui5Yuj5YulXCIsXG5cdFx0MTAsXG5cdFx0XCLli7FcIixcblx0XHQ3LFxuXHRcdFwi5Yu75Yu85Yu95YyB5YyC5YyD5YyE5YyH5YyJ5YyK5YyL5YyM5YyOXCJcblx0XSxcblx0W1xuXHRcdFwiODU0MFwiLFxuXHRcdFwi5YyR5YyS5YyT5YyU5YyY5Yyb5Yyc5Yye5Yyf5Yyi5Yyk5Yyl5Yyn5Yyo5Yyp5Yyr5Yys5Yyt5YyvXCIsXG5cdFx0OSxcblx0XHRcIuWMvOWMveWNgOWNguWNhOWNhuWNi+WNjOWNjeWNkOWNlOWNmOWNmeWNm+WNneWNpeWNqOWNquWNrOWNreWNsuWNtuWNueWNu+WNvOWNveWNvuWOgOWOgeWOg+WOh+WOiOWOiuWOjuWOj1wiXG5cdF0sXG5cdFtcblx0XHRcIjg1ODBcIixcblx0XHRcIuWOkFwiLFxuXHRcdDQsXG5cdFx0XCLljpbljpfljpnljpvljpzljp7ljqDljqHljqTljqfljqrljqvljqzljq3ljq9cIixcblx0XHQ2LFxuXHRcdFwi5Y635Y645Y655Y665Y685Y695Y6+5Y+A5Y+DXCIsXG5cdFx0NCxcblx0XHRcIuWPjuWPj+WPkOWPkuWPk+WPleWPmuWPnOWPneWPnuWPoeWPouWPp+WPtOWPuuWPvuWPv+WQgOWQguWQheWQh+WQi+WQlOWQmOWQmeWQmuWQnOWQouWQpOWQpeWQquWQsOWQs+WQtuWQt+WQuuWQveWQv+WRgeWRguWRhOWRheWRh+WRieWRjOWRjeWRjuWRj+WRkeWRmuWRnVwiLFxuXHRcdDQsXG5cdFx0XCLlkaPlkaXlkaflkalcIixcblx0XHQ3LFxuXHRcdFwi5ZG05ZG55ZG65ZG+5ZG/5ZKB5ZKD5ZKF5ZKH5ZKI5ZKJ5ZKK5ZKN5ZKR5ZKT5ZKX5ZKY5ZKc5ZKe5ZKf5ZKg5ZKhXCJcblx0XSxcblx0W1xuXHRcdFwiODY0MFwiLFxuXHRcdFwi5ZKi5ZKl5ZKu5ZKw5ZKy5ZK15ZK25ZK35ZK55ZK65ZK85ZK+5ZOD5ZOF5ZOK5ZOL5ZOW5ZOY5ZOb5ZOgXCIsXG5cdFx0NCxcblx0XHRcIuWTq+WTrOWTr+WTsOWTseWTtFwiLFxuXHRcdDUsXG5cdFx0XCLlk7vlk77llIDllILllIPllITllIXllIjllIpcIixcblx0XHQ0LFxuXHRcdFwi5ZSS5ZST5ZSVXCIsXG5cdFx0NSxcblx0XHRcIuWUnOWUneWUnuWUn+WUoeWUpeWUplwiXG5cdF0sXG5cdFtcblx0XHRcIjg2ODBcIixcblx0XHRcIuWUqOWUqeWUq+WUreWUsuWUtOWUteWUtuWUuOWUueWUuuWUu+WUveWVgOWVguWVheWVh+WViOWVi1wiLFxuXHRcdDQsXG5cdFx0XCLllZHllZLllZPllZTllZdcIixcblx0XHQ0LFxuXHRcdFwi5ZWd5ZWe5ZWf5ZWg5ZWi5ZWj5ZWo5ZWp5ZWr5ZWvXCIsXG5cdFx0NSxcblx0XHRcIuWVueWVuuWVveWVv+WWheWWhuWWjOWWjeWWjuWWkOWWkuWWk+WWleWWluWWl+WWmuWWm+WWnuWWoFwiLFxuXHRcdDYsXG5cdFx0XCLllqhcIixcblx0XHQ4LFxuXHRcdFwi5Zay5Za05Za25Za45Za65Za85Za/XCIsXG5cdFx0NCxcblx0XHRcIuWXhuWXh+WXiOWXiuWXi+WXjuWXj+WXkOWXleWXl1wiLFxuXHRcdDQsXG5cdFx0XCLll57ll6Dll6Lll6fll6nll63ll67ll7Dll7Hll7Tll7bll7hcIixcblx0XHQ0LFxuXHRcdFwi5Ze/5ZiC5ZiD5ZiE5ZiFXCJcblx0XSxcblx0W1xuXHRcdFwiODc0MFwiLFxuXHRcdFwi5ZiG5ZiH5ZiK5ZiL5ZiN5ZiQXCIsXG5cdFx0Nyxcblx0XHRcIuWYmeWYmuWYnOWYneWYoOWYoeWYouWYpeWYpuWYqOWYqeWYquWYq+WYruWYr+WYsOWYs+WYteWYt+WYuOWYuuWYvOWYveWYvuWZgFwiLFxuXHRcdDExLFxuXHRcdFwi5ZmPXCIsXG5cdFx0NCxcblx0XHRcIuWZleWZluWZmuWZm+WZnVwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiODc4MFwiLFxuXHRcdFwi5Zmj5Zml5Zmm5Zmn5Zmt5Zmu5Zmv5Zmw5Zmy5Zmz5Zm05Zm15Zm35Zm45Zm55Zm65Zm9XCIsXG5cdFx0Nyxcblx0XHRcIuWah1wiLFxuXHRcdDYsXG5cdFx0XCLlmpDlmpHlmpLlmpRcIixcblx0XHQxNCxcblx0XHRcIuWapFwiLFxuXHRcdDEwLFxuXHRcdFwi5ZqwXCIsXG5cdFx0Nixcblx0XHRcIuWauOWaueWauuWau+WavVwiLFxuXHRcdDEyLFxuXHRcdFwi5ZuLXCIsXG5cdFx0OCxcblx0XHRcIuWbleWbluWbmOWbmeWbnOWbo+WbpVwiLFxuXHRcdDUsXG5cdFx0XCLlm6zlm67lm6/lm7Llm7Plm7blm7flm7jlm7vlm7zlnIDlnIHlnILlnIXlnIflnItcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcIjg4NDBcIixcblx0XHRcIuWcklwiLFxuXHRcdDksXG5cdFx0XCLlnJ3lnJ7lnKDlnKHlnKLlnKTlnKXlnKblnKflnKvlnLHlnLLlnLRcIixcblx0XHQ0LFxuXHRcdFwi5Zy85Zy95Zy/5Z2B5Z2D5Z2E5Z2F5Z2G5Z2I5Z2J5Z2L5Z2SXCIsXG5cdFx0NCxcblx0XHRcIuWdmOWdmeWdouWdo+WdpeWdp+WdrOWdruWdsOWdseWdsuWdtOWdteWduOWdueWduuWdveWdvuWdv+WegFwiXG5cdF0sXG5cdFtcblx0XHRcIjg4ODBcIixcblx0XHRcIuWegeWeh+WeiOWeieWeiuWejVwiLFxuXHRcdDQsXG5cdFx0XCLlnpRcIixcblx0XHQ2LFxuXHRcdFwi5Z6c5Z6d5Z6e5Z6f5Z6l5Z6o5Z6q5Z6s5Z6v5Z6w5Z6x5Z6z5Z615Z625Z635Z65XCIsXG5cdFx0OCxcblx0XHRcIuWfhFwiLFxuXHRcdDYsXG5cdFx0XCLln4zln43ln5Dln5Hln5Pln5bln5fln5vln5zln57ln6Hln6Lln6Pln6VcIixcblx0XHQ3LFxuXHRcdFwi5Z+u5Z+w5Z+x5Z+y5Z+z5Z+15Z+25Z+35Z+75Z+85Z++5Z+/5aCB5aCD5aCE5aCF5aCI5aCJ5aCK5aCM5aCO5aCP5aCQ5aCS5aCT5aCU5aCW5aCX5aCY5aCa5aCb5aCc5aCd5aCf5aCi5aCj5aClXCIsXG5cdFx0NCxcblx0XHRcIuWgq1wiLFxuXHRcdDQsXG5cdFx0XCLloLHloLLloLPloLTloLZcIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcIjg5NDBcIixcblx0XHRcIuWgvlwiLFxuXHRcdDUsXG5cdFx0XCLloYVcIixcblx0XHQ2LFxuXHRcdFwi5aGO5aGP5aGQ5aGS5aGT5aGV5aGW5aGX5aGZXCIsXG5cdFx0NCxcblx0XHRcIuWhn1wiLFxuXHRcdDUsXG5cdFx0XCLloaZcIixcblx0XHQ0LFxuXHRcdFwi5aGtXCIsXG5cdFx0MTYsXG5cdFx0XCLlob/looLlooTloobloofloojloorloovlooxcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OTgwXCIsXG5cdFx0XCLloo1cIixcblx0XHQ0LFxuXHRcdFwi5aKUXCIsXG5cdFx0NCxcblx0XHRcIuWim+WinOWineWioFwiLFxuXHRcdDcsXG5cdFx0XCLloqpcIixcblx0XHQxNyxcblx0XHRcIuWiveWivuWiv+WjgOWjguWjg+WjhOWjhlwiLFxuXHRcdDEwLFxuXHRcdFwi5aOS5aOT5aOU5aOWXCIsXG5cdFx0MTMsXG5cdFx0XCLlo6VcIixcblx0XHQ1LFxuXHRcdFwi5aOt5aOv5aOx5aOy5aO05aO15aO35aO45aO6XCIsXG5cdFx0Nyxcblx0XHRcIuWkg+WkheWkhuWkiFwiLFxuXHRcdDQsXG5cdFx0XCLlpI7lpJDlpJHlpJLlpJPlpJflpJjlpJvlpJ3lpJ7lpKDlpKHlpKLlpKPlpKblpKjlpKzlpLDlpLLlpLPlpLXlpLblpLtcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YTQwXCIsXG5cdFx0XCLlpL3lpL7lpL/lpYDlpYPlpYXlpYblpYrlpYzlpY3lpZDlpZLlpZPlpZnlpZtcIixcblx0XHQ0LFxuXHRcdFwi5aWh5aWj5aWk5aWmXCIsXG5cdFx0MTIsXG5cdFx0XCLlpbXlpbflpbrlpbvlpbzlpb7lpb/lpoDlpoXlponlpovlpozlpo7lpo/lppDlppHlppTlppXlppjlpprlppvlppzlpp3lpp/lpqDlpqHlpqLlpqZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YTgwXCIsXG5cdFx0XCLlpqflpqzlpq3lprDlprHlprNcIixcblx0XHQ1LFxuXHRcdFwi5aa65aa85aa95aa/XCIsXG5cdFx0Nixcblx0XHRcIuWnh+WniOWnieWnjOWnjeWnjuWnj+WnleWnluWnmeWnm+WnnlwiLFxuXHRcdDQsXG5cdFx0XCLlp6Tlp6blp6flp6nlp6rlp6vlp61cIixcblx0XHQxMSxcblx0XHRcIuWnuuWnvOWnveWnvuWogOWoguWoiuWoi+WojeWojuWoj+WokOWokuWolOWoleWoluWol+WomeWomuWom+WoneWonuWooeWoouWopOWopuWop+WoqOWoqlwiLFxuXHRcdDYsXG5cdFx0XCLlqLPlqLXlqLdcIixcblx0XHQ0LFxuXHRcdFwi5ai95ai+5ai/5amBXCIsXG5cdFx0NCxcblx0XHRcIuWph+WpiOWpi1wiLFxuXHRcdDksXG5cdFx0XCLlqZblqZflqZjlqZnlqZtcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjhiNDBcIixcblx0XHRcIuWpoeWpo+WppOWppeWppuWpqOWpqeWpq1wiLFxuXHRcdDgsXG5cdFx0XCLlqbjlqbnlqbvlqbzlqb3lqb7lqoBcIixcblx0XHQxNyxcblx0XHRcIuWqk1wiLFxuXHRcdDYsXG5cdFx0XCLlqpxcIixcblx0XHQxMyxcblx0XHRcIuWqq+WqrFwiXG5cdF0sXG5cdFtcblx0XHRcIjhiODBcIixcblx0XHRcIuWqrVwiLFxuXHRcdDQsXG5cdFx0XCLlqrTlqrblqrflqrlcIixcblx0XHQ0LFxuXHRcdFwi5aq/5auA5auDXCIsXG5cdFx0NSxcblx0XHRcIuWriuWri+WrjVwiLFxuXHRcdDQsXG5cdFx0XCLlq5Plq5Xlq5flq5nlq5rlq5vlq53lq57lq5/lq6Llq6Tlq6Xlq6flq6jlq6rlq6xcIixcblx0XHQ0LFxuXHRcdFwi5auyXCIsXG5cdFx0MjIsXG5cdFx0XCLlrIpcIixcblx0XHQxMSxcblx0XHRcIuWsmFwiLFxuXHRcdDI1LFxuXHRcdFwi5ayz5ay15ay25ay4XCIsXG5cdFx0Nyxcblx0XHRcIuWtgVwiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiOGM0MFwiLFxuXHRcdFwi5a2IXCIsXG5cdFx0Nyxcblx0XHRcIuWtkuWtluWtnuWtoOWtoeWtp+WtqOWtq+WtreWtruWtr+WtsuWttOWttuWtt+WtuOWtueWtu+WtvOWtvuWtv+WuguWuhuWuiuWujeWujuWukOWukeWukuWulOWuluWun+Wup+WuqOWuqeWurOWureWuruWur+WuseWusuWut+WuuuWuu+WuvOWvgOWvgeWvg+WviOWvieWviuWvi+WvjeWvjuWvj1wiXG5cdF0sXG5cdFtcblx0XHRcIjhjODBcIixcblx0XHRcIuWvkeWvlFwiLFxuXHRcdDgsXG5cdFx0XCLlr6Dlr6Llr6Plr6blr6flr6lcIixcblx0XHQ0LFxuXHRcdFwi5a+v5a+xXCIsXG5cdFx0Nixcblx0XHRcIuWvveWvvuWwgOWwguWwg+WwheWwh+WwiOWwi+WwjOWwjeWwjuWwkOWwkuWwk+Wwl+WwmeWwm+WwnuWwn+WwoOWwoeWwo+WwpuWwqOWwqeWwquWwq+WwreWwruWwr+WwsOWwsuWws+WwteWwtuWwt+Wxg+WxhOWxhuWxh+WxjOWxjeWxkuWxk+WxlOWxluWxl+WxmOWxmuWxm+WxnOWxneWxn+WxouWxpOWxp1wiLFxuXHRcdDYsXG5cdFx0XCLlsbDlsbJcIixcblx0XHQ2LFxuXHRcdFwi5bG75bG85bG95bG+5bKA5bKDXCIsXG5cdFx0NCxcblx0XHRcIuWyieWyiuWyi+WyjuWyj+WykuWyk+WyleWynVwiLFxuXHRcdDQsXG5cdFx0XCLlsqRcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcIjhkNDBcIixcblx0XHRcIuWyquWyruWyr+WysOWysuWytOWytuWyueWyuuWyu+WyvOWyvuWzgOWzguWzg+WzhVwiLFxuXHRcdDUsXG5cdFx0XCLls4xcIixcblx0XHQ1LFxuXHRcdFwi5bOTXCIsXG5cdFx0NSxcblx0XHRcIuWzmlwiLFxuXHRcdDYsXG5cdFx0XCLls6Lls6Pls6fls6nls6vls6zls67ls6/ls7FcIixcblx0XHQ5LFxuXHRcdFwi5bO8XCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCI4ZDgwXCIsXG5cdFx0XCLltIHltITltIXltIhcIixcblx0XHQ1LFxuXHRcdFwi5bSPXCIsXG5cdFx0NCxcblx0XHRcIuW0leW0l+W0mOW0meW0muW0nOW0neW0n1wiLFxuXHRcdDQsXG5cdFx0XCLltKXltKjltKrltKvltKzltK9cIixcblx0XHQ0LFxuXHRcdFwi5bS1XCIsXG5cdFx0Nyxcblx0XHRcIuW0v1wiLFxuXHRcdDcsXG5cdFx0XCLltYjltYnltY1cIixcblx0XHQxMCxcblx0XHRcIuW1meW1muW1nOW1nlwiLFxuXHRcdDEwLFxuXHRcdFwi5bWq5bWt5bWu5bWw5bWx5bWy5bWz5bW1XCIsXG5cdFx0MTIsXG5cdFx0XCLltoNcIixcblx0XHQyMSxcblx0XHRcIuW2muW2m+W2nOW2nuW2n+W2oFwiXG5cdF0sXG5cdFtcblx0XHRcIjhlNDBcIixcblx0XHRcIuW2oVwiLFxuXHRcdDIxLFxuXHRcdFwi5ba4XCIsXG5cdFx0MTIsXG5cdFx0XCLlt4ZcIixcblx0XHQ2LFxuXHRcdFwi5beOXCIsXG5cdFx0MTIsXG5cdFx0XCLlt5zlt5/lt6Dlt6Plt6Tlt6rlt6zlt61cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZTgwXCIsXG5cdFx0XCLlt7Dlt7Xlt7blt7hcIixcblx0XHQ0LFxuXHRcdFwi5be/5biA5biE5biH5biJ5biK5biL5biN5biO5biS5biT5biX5bieXCIsXG5cdFx0Nyxcblx0XHRcIuW4qFwiLFxuXHRcdDQsXG5cdFx0XCLluK/luLDluLJcIixcblx0XHQ0LFxuXHRcdFwi5bi55bi65bi+5bi/5bmA5bmB5bmD5bmGXCIsXG5cdFx0NSxcblx0XHRcIuW5jVwiLFxuXHRcdDYsXG5cdFx0XCLluZZcIixcblx0XHQ0LFxuXHRcdFwi5bmc5bmd5bmf5bmg5bmjXCIsXG5cdFx0MTQsXG5cdFx0XCLlubXlubflubnlub7luoHluoLluoPluoXluojluonluozluo3luo7lupLlupjlupvlup3luqHluqLluqPluqTluqhcIixcblx0XHQ0LFxuXHRcdFwi5bquXCIsXG5cdFx0NCxcblx0XHRcIuW6tOW6uuW6u+W6vOW6veW6v1wiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiOGY0MFwiLFxuXHRcdFwi5buG5buH5buI5buLXCIsXG5cdFx0NSxcblx0XHRcIuW7lOW7leW7l+W7mOW7meW7muW7nFwiLFxuXHRcdDExLFxuXHRcdFwi5bup5burXCIsXG5cdFx0OCxcblx0XHRcIuW7teW7uOW7ueW7u+W7vOW7veW8heW8huW8h+W8ieW8jOW8jeW8juW8kOW8kuW8lOW8luW8meW8muW8nOW8neW8nuW8oeW8ouW8o+W8pFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmODBcIixcblx0XHRcIuW8qOW8q+W8rOW8ruW8sOW8slwiLFxuXHRcdDYsXG5cdFx0XCLlvLvlvL3lvL7lvL/lvYFcIixcblx0XHQxNCxcblx0XHRcIuW9keW9lOW9meW9muW9m+W9nOW9nuW9n+W9oOW9o+W9peW9p+W9qOW9q+W9ruW9r+W9suW9tOW9teW9tuW9uOW9uuW9veW9vuW9v+W+g+W+huW+jeW+juW+j+W+keW+k+W+lOW+luW+muW+m+W+neW+nuW+n+W+oOW+olwiLFxuXHRcdDUsXG5cdFx0XCLlvqnlvqvlvqzlvq9cIixcblx0XHQ1LFxuXHRcdFwi5b625b645b655b665b675b6+XCIsXG5cdFx0NCxcblx0XHRcIuW/h+W/iOW/iuW/i+W/juW/k+W/lOW/leW/muW/m+W/nOW/nuW/n+W/ouW/o+W/peW/puW/qOW/qeW/rOW/r+W/sOW/suW/s+W/tOW/tuW/t+W/ueW/uuW/vOaAh1wiXG5cdF0sXG5cdFtcblx0XHRcIjkwNDBcIixcblx0XHRcIuaAiOaAieaAi+aAjOaAkOaAkeaAk+aAl+aAmOaAmuaAnuaAn+aAouaAo+aApOaArOaAreaAruaAsFwiLFxuXHRcdDQsXG5cdFx0XCLmgLZcIixcblx0XHQ0LFxuXHRcdFwi5oC95oC+5oGA5oGEXCIsXG5cdFx0Nixcblx0XHRcIuaBjOaBjuaBj+aBkeaBk+aBlOaBluaBl+aBmOaBm+aBnOaBnuaBn+aBoOaBoeaBpeaBpuaBruaBseaBsuaBtOaBteaBt+aBvuaCgFwiXG5cdF0sXG5cdFtcblx0XHRcIjkwODBcIixcblx0XHRcIuaCgeaCguaCheaChuaCh+aCiOaCiuaCi+aCjuaCj+aCkOaCkeaCk+aCleaCl+aCmOaCmeaCnOaCnuaCoeaCouaCpOaCpeaCp+aCqeaCquaCruaCsOaCs+aCteaCtuaCt+aCueaCuuaCvVwiLFxuXHRcdDcsXG5cdFx0XCLmg4fmg4jmg4nmg4xcIixcblx0XHQ0LFxuXHRcdFwi5oOS5oOT5oOU5oOW5oOX5oOZ5oOb5oOe5oOhXCIsXG5cdFx0NCxcblx0XHRcIuaDquaDseaDsuaDteaDt+aDuOaDu1wiLFxuXHRcdDQsXG5cdFx0XCLmhILmhIPmhITmhIXmhIfmhIrmhIvmhIzmhJBcIixcblx0XHQ0LFxuXHRcdFwi5oSW5oSX5oSY5oSZ5oSb5oSc5oSd5oSe5oSh5oSi5oSl5oSo5oSp5oSq5oSsXCIsXG5cdFx0MTgsXG5cdFx0XCLmhYBcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcIjkxNDBcIixcblx0XHRcIuaFh+aFieaFi+aFjeaFj+aFkOaFkuaFk+aFlOaFllwiLFxuXHRcdDYsXG5cdFx0XCLmhZ7mhZ/mhaDmhaHmhaPmhaTmhaXmhabmhalcIixcblx0XHQ2LFxuXHRcdFwi5oWx5oWy5oWz5oW05oW25oW4XCIsXG5cdFx0MTgsXG5cdFx0XCLmhozmho3mho9cIixcblx0XHQ0LFxuXHRcdFwi5oaVXCJcblx0XSxcblx0W1xuXHRcdFwiOTE4MFwiLFxuXHRcdFwi5oaWXCIsXG5cdFx0Nixcblx0XHRcIuaGnlwiLFxuXHRcdDgsXG5cdFx0XCLmhqrmhqvmhq1cIixcblx0XHQ5LFxuXHRcdFwi5oa4XCIsXG5cdFx0NSxcblx0XHRcIuaGv+aHgOaHgeaHg1wiLFxuXHRcdDQsXG5cdFx0XCLmh4nmh4xcIixcblx0XHQ0LFxuXHRcdFwi5oeT5oeVXCIsXG5cdFx0MTYsXG5cdFx0XCLmh6dcIixcblx0XHQxMyxcblx0XHRcIuaHtlwiLFxuXHRcdDgsXG5cdFx0XCLmiIBcIixcblx0XHQ1LFxuXHRcdFwi5oiH5oiJ5oiT5oiU5oiZ5oic5oid5oie5oig5oij5oim5oin5oio5oip5oir5oit5oiv5oiw5oix5oiy5oi15oi25oi4XCIsXG5cdFx0NCxcblx0XHRcIuaJguaJhOaJheaJhuaJilwiXG5cdF0sXG5cdFtcblx0XHRcIjkyNDBcIixcblx0XHRcIuaJj+aJkOaJleaJluaJl+aJmeaJmuaJnFwiLFxuXHRcdDYsXG5cdFx0XCLmiaTmiaXmiajmibHmibLmibTmibXmibfmibjmibrmibvmib3mioHmioLmioPmioXmiobmiofmiojmiotcIixcblx0XHQ1LFxuXHRcdFwi5oqU5oqZ5oqc5oqd5oqe5oqj5oqm5oqn5oqp5oqq5oqt5oqu5oqv5oqw5oqy5oqz5oq05oq25oq35oq45oq65oq+5ouA5ouBXCJcblx0XSxcblx0W1xuXHRcdFwiOTI4MFwiLFxuXHRcdFwi5ouD5ouL5ouP5ouR5ouV5oud5oue5oug5ouh5ouk5ouq5our5ouw5ouy5ou15ou45ou55ou65ou75oyA5oyD5oyE5oyF5oyG5oyK5oyL5oyM5oyN5oyP5oyQ5oyS5oyT5oyU5oyV5oyX5oyY5oyZ5oyc5oym5oyn5oyp5oys5oyt5oyu5oyw5oyx5oyzXCIsXG5cdFx0NSxcblx0XHRcIuaMu+aMvOaMvuaMv+aNgOaNgeaNhOaNh+aNiOaNiuaNkeaNkuaNk+aNlOaNllwiLFxuXHRcdDcsXG5cdFx0XCLmjaDmjaTmjaXmjabmjajmjarmjavmjazmja/mjbDmjbLmjbPmjbTmjbXmjbjmjbnmjbzmjb3mjb7mjb/mjoHmjoPmjoTmjoXmjobmjovmjo3mjpHmjpPmjpTmjpXmjpfmjplcIixcblx0XHQ2LFxuXHRcdFwi5o6h5o6k5o6m5o6r5o6v5o6x5o6y5o615o625o655o675o695o6/5o+AXCJcblx0XSxcblx0W1xuXHRcdFwiOTM0MFwiLFxuXHRcdFwi5o+B5o+C5o+D5o+F5o+H5o+I5o+K5o+L5o+M5o+R5o+T5o+U5o+V5o+XXCIsXG5cdFx0Nixcblx0XHRcIuaPn+aPouaPpFwiLFxuXHRcdDQsXG5cdFx0XCLmj6vmj6zmj67mj6/mj7Dmj7Hmj7Pmj7Xmj7fmj7nmj7rmj7vmj7zmj77mkIPmkITmkIZcIixcblx0XHQ0LFxuXHRcdFwi5pCN5pCO5pCR5pCS5pCVXCIsXG5cdFx0NSxcblx0XHRcIuaQneaQn+aQouaQo+aQpFwiXG5cdF0sXG5cdFtcblx0XHRcIjkzODBcIixcblx0XHRcIuaQpeaQp+aQqOaQqeaQq+aQrlwiLFxuXHRcdDUsXG5cdFx0XCLmkLVcIixcblx0XHQ0LFxuXHRcdFwi5pC75pC85pC+5pGA5pGC5pGD5pGJ5pGLXCIsXG5cdFx0Nixcblx0XHRcIuaRk+aRleaRluaRl+aRmVwiLFxuXHRcdDQsXG5cdFx0XCLmkZ9cIixcblx0XHQ3LFxuXHRcdFwi5pGo5pGq5pGr5pGs5pGuXCIsXG5cdFx0OSxcblx0XHRcIuaRu1wiLFxuXHRcdDYsXG5cdFx0XCLmkoPmkobmkohcIixcblx0XHQ4LFxuXHRcdFwi5pKT5pKU5pKX5pKY5pKa5pKb5pKc5pKd5pKfXCIsXG5cdFx0NCxcblx0XHRcIuaSpeaSpuaSp+aSqOaSquaSq+aSr+aSseaSsuaSs+aStOaStuaSueaSu+aSveaSvuaSv+aTgeaTg+aThOaThlwiLFxuXHRcdDYsXG5cdFx0XCLmk4/mk5Hmk5Pmk5Tmk5Xmk5bmk5nmk5pcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NDQwXCIsXG5cdFx0XCLmk5vmk5zmk53mk5/mk6Dmk6Hmk6Pmk6Xmk6dcIixcblx0XHQyNCxcblx0XHRcIuaUgVwiLFxuXHRcdDcsXG5cdFx0XCLmlIpcIixcblx0XHQ3LFxuXHRcdFwi5pSTXCIsXG5cdFx0NCxcblx0XHRcIuaUmVwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiOTQ4MFwiLFxuXHRcdFwi5pSi5pSj5pSk5pSmXCIsXG5cdFx0NCxcblx0XHRcIuaUrOaUreaUsOaUseaUsuaUs+aUt+aUuuaUvOaUveaVgFwiLFxuXHRcdDQsXG5cdFx0XCLmlYbmlYfmlYrmlYvmlY3mlY7mlZDmlZLmlZPmlZTmlZfmlZjmlZrmlZzmlZ/mlaDmlaHmlaTmlaXmlafmlajmlanmlarmla3mla7mla/mlbHmlbPmlbXmlbbmlbhcIixcblx0XHQxNCxcblx0XHRcIuaWiOaWieaWiuaWjeaWjuaWj+aWkuaWlOaWleaWluaWmOaWmuaWneaWnuaWoOaWouaWo+aWpuaWqOaWquaWrOaWruaWsVwiLFxuXHRcdDcsXG5cdFx0XCLmlrrmlrvmlr7mlr/ml4Dml4Lml4fml4jml4nml4rml43ml5Dml5Hml5Pml5Tml5Xml5hcIixcblx0XHQ3LFxuXHRcdFwi5peh5pej5pek5peq5perXCJcblx0XSxcblx0W1xuXHRcdFwiOTU0MFwiLFxuXHRcdFwi5pey5pez5pe05pe15pe45pe55pe7XCIsXG5cdFx0NCxcblx0XHRcIuaYgeaYhOaYheaYh+aYiOaYieaYi+aYjeaYkOaYkeaYkuaYluaYl+aYmOaYmuaYm+aYnOaYnuaYoeaYouaYo+aYpOaYpuaYqeaYquaYq+aYrOaYruaYsOaYsuaYs+aYt1wiLFxuXHRcdDQsXG5cdFx0XCLmmL3mmL/mmYDmmYLmmYRcIixcblx0XHQ2LFxuXHRcdFwi5pmN5pmO5pmQ5pmR5pmYXCJcblx0XSxcblx0W1xuXHRcdFwiOTU4MFwiLFxuXHRcdFwi5pmZ5pmb5pmc5pmd5pme5pmg5pmi5pmj5pml5pmn5pmpXCIsXG5cdFx0NCxcblx0XHRcIuaZseaZsuaZs+aZteaZuOaZueaZu+aZvOaZveaZv+aagOaageaag+aaheaahuaaiOaaieaaiuaai+aajeaajuaaj+aakOaakuaak+aalOaaleaamFwiLFxuXHRcdDQsXG5cdFx0XCLmmp5cIixcblx0XHQ4LFxuXHRcdFwi5pqpXCIsXG5cdFx0NCxcblx0XHRcIuaar1wiLFxuXHRcdDQsXG5cdFx0XCLmmrXmmrbmmrfmmrjmmrrmmrvmmrzmmr3mmr9cIixcblx0XHQyNSxcblx0XHRcIuabmuabnlwiLFxuXHRcdDcsXG5cdFx0XCLmm6fmm6jmm6pcIixcblx0XHQ1LFxuXHRcdFwi5pux5pu15pu25pu45pu65pu75pu95pyB5pyC5pyDXCJcblx0XSxcblx0W1xuXHRcdFwiOTY0MFwiLFxuXHRcdFwi5pyE5pyF5pyG5pyH5pyM5pyO5pyP5pyR5pyS5pyT5pyW5pyY5pyZ5pya5pyc5pye5pygXCIsXG5cdFx0NSxcblx0XHRcIuacp+acqeacruacsOacsuacs+actuact+acuOacueacu+acvOacvuacv+adgeadhOadheadh+adiuadi+adjeadkuadlOadleadl1wiLFxuXHRcdDQsXG5cdFx0XCLmnZ3mnaLmnaPmnaTmnabmnafmnavmnazmna7mnbHmnbTmnbZcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NjgwXCIsXG5cdFx0XCLmnbjmnbnmnbrmnbvmnb3mnoDmnoLmnoPmnoXmnobmnojmnormnozmno3mno7mno/mnpHmnpLmnpPmnpTmnpbmnpnmnpvmnp/mnqDmnqHmnqTmnqbmnqnmnqzmnq7mnrHmnrLmnrTmnrlcIixcblx0XHQ3LFxuXHRcdFwi5p+C5p+FXCIsXG5cdFx0OSxcblx0XHRcIuafleafluafl+afm+afn+afoeafo+afpOafpuafp+afqOafquafq+afreafruafsuaftVwiLFxuXHRcdDcsXG5cdFx0XCLmn77moIHmoILmoIPmoITmoIbmoI3moJDmoJLmoJTmoJXmoJhcIixcblx0XHQ0LFxuXHRcdFwi5qCe5qCf5qCg5qCiXCIsXG5cdFx0Nixcblx0XHRcIuagq1wiLFxuXHRcdDYsXG5cdFx0XCLmoLTmoLXmoLbmoLrmoLvmoL/moYfmoYvmoY3moY/moZLmoZZcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjk3NDBcIixcblx0XHRcIuahnOahneahnuahn+ahquahrFwiLFxuXHRcdDcsXG5cdFx0XCLmobXmobhcIixcblx0XHQ4LFxuXHRcdFwi5qKC5qKE5qKHXCIsXG5cdFx0Nyxcblx0XHRcIuaikOaikeaikuailOaileailuaimFwiLFxuXHRcdDksXG5cdFx0XCLmoqPmoqTmoqXmoqnmoqrmoqvmoqzmoq7morHmorLmorTmorbmorfmorhcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NzgwXCIsXG5cdFx0XCLmorlcIixcblx0XHQ2LFxuXHRcdFwi5qOB5qODXCIsXG5cdFx0NSxcblx0XHRcIuajiuajjOajjuajj+ajkOajkeajk+ajlOajluajl+ajmeajm1wiLFxuXHRcdDQsXG5cdFx0XCLmo6Hmo6Lmo6RcIixcblx0XHQ5LFxuXHRcdFwi5qOv5qOy5qOz5qO05qO25qO35qO45qO75qO95qO+5qO/5qSA5qSC5qSD5qSE5qSGXCIsXG5cdFx0NCxcblx0XHRcIuakjOakj+akkeakk1wiLFxuXHRcdDExLFxuXHRcdFwi5qSh5qSi5qSj5qSlXCIsXG5cdFx0Nyxcblx0XHRcIuakruakr+akseaksuaks+akteaktuakt+akuOakuuaku+akvOakvualgOalgealg1wiLFxuXHRcdDE2LFxuXHRcdFwi5qWV5qWW5qWY5qWZ5qWb5qWc5qWfXCJcblx0XSxcblx0W1xuXHRcdFwiOTg0MFwiLFxuXHRcdFwi5qWh5qWi5qWk5qWl5qWn5qWo5qWp5qWq5qWs5qWt5qWv5qWw5qWyXCIsXG5cdFx0NCxcblx0XHRcIualuualu+alvealvualv+amgeamg+amheamiuami+amjOamjlwiLFxuXHRcdDUsXG5cdFx0XCLmppbmppfmppnmpprmpp1cIixcblx0XHQ5LFxuXHRcdFwi5qap5qaq5qas5qau5qav5qaw5qay5qaz5qa15qa25qa45qa55qa65qa85qa9XCJcblx0XSxcblx0W1xuXHRcdFwiOTg4MFwiLFxuXHRcdFwi5qa+5qa/5qeA5qeCXCIsXG5cdFx0Nyxcblx0XHRcIuani+anjeanj+ankeankuank+anlVwiLFxuXHRcdDUsXG5cdFx0XCLmp5zmp53mp57mp6FcIixcblx0XHQxMSxcblx0XHRcIuanruanr+ansOanseans1wiLFxuXHRcdDksXG5cdFx0XCLmp77mqIBcIixcblx0XHQ5LFxuXHRcdFwi5qiLXCIsXG5cdFx0MTEsXG5cdFx0XCLmqJlcIixcblx0XHQ1LFxuXHRcdFwi5qig5qiiXCIsXG5cdFx0NSxcblx0XHRcIuaoqeaoq+aorOaoreaoruaosOaosuaos+aotOaotlwiLFxuXHRcdDYsXG5cdFx0XCLmqL9cIixcblx0XHQ0LFxuXHRcdFwi5qmF5qmG5qmIXCIsXG5cdFx0Nyxcblx0XHRcIuapkVwiLFxuXHRcdDYsXG5cdFx0XCLmqZpcIlxuXHRdLFxuXHRbXG5cdFx0XCI5OTQwXCIsXG5cdFx0XCLmqZxcIixcblx0XHQ0LFxuXHRcdFwi5qmi5qmj5qmk5qmmXCIsXG5cdFx0MTAsXG5cdFx0XCLmqbJcIixcblx0XHQ2LFxuXHRcdFwi5qm65qm75qm95qm+5qm/5qqB5qqC5qqD5qqFXCIsXG5cdFx0OCxcblx0XHRcIuaqj+aqklwiLFxuXHRcdDQsXG5cdFx0XCLmqphcIixcblx0XHQ3LFxuXHRcdFwi5qqhXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI5OTgwXCIsXG5cdFx0XCLmqqfmqqjmqqrmqq1cIixcblx0XHQxMTQsXG5cdFx0XCLmrKXmrKbmrKhcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcIjlhNDBcIixcblx0XHRcIuasr+assOasseass+astOasteastuasuOasu+asvOasveasv+atgOatgeatguathOatheatiOatiuati+atjVwiLFxuXHRcdDExLFxuXHRcdFwi5q2aXCIsXG5cdFx0Nyxcblx0XHRcIuatqOatqeatq1wiLFxuXHRcdDEzLFxuXHRcdFwi5q265q295q2+5q2/5q6A5q6F5q6IXCJcblx0XSxcblx0W1xuXHRcdFwiOWE4MFwiLFxuXHRcdFwi5q6M5q6O5q6P5q6Q5q6R5q6U5q6V5q6X5q6Y5q6Z5q6cXCIsXG5cdFx0NCxcblx0XHRcIuauolwiLFxuXHRcdDcsXG5cdFx0XCLmrqtcIixcblx0XHQ3LFxuXHRcdFwi5q625q64XCIsXG5cdFx0Nixcblx0XHRcIuavgOavg+avhOavhlwiLFxuXHRcdDQsXG5cdFx0XCLmr4zmr47mr5Dmr5Hmr5jmr5rmr5xcIixcblx0XHQ0LFxuXHRcdFwi5q+iXCIsXG5cdFx0Nyxcblx0XHRcIuavrOavreavruavsOavseavsuavtOavtuavt+avuOavuuavu+avvOavvlwiLFxuXHRcdDYsXG5cdFx0XCLmsIhcIixcblx0XHQ0LFxuXHRcdFwi5rCO5rCS5rCX5rCc5rCd5rCe5rCg5rCj5rCl5rCr5rCs5rCt5rCx5rCz5rC25rC35rC55rC65rC75rC85rC+5rC/5rGD5rGE5rGF5rGI5rGLXCIsXG5cdFx0NCxcblx0XHRcIuaxkeaxkuaxk+axluaxmFwiXG5cdF0sXG5cdFtcblx0XHRcIjliNDBcIixcblx0XHRcIuaxmeaxmuaxouaxo+axpeaxpuaxp+axq1wiLFxuXHRcdDQsXG5cdFx0XCLmsbHmsbPmsbXmsbfmsbjmsbrmsbvmsbzmsb/msoDmsoTmsofmsormsovmso3mso7mspHmspLmspXmspbmspfmspjmsprmspzmsp3msp7msqDmsqLmsqjmsqzmsq/msrDmsrTmsrXmsrbmsrfmsrrms4Dms4Hms4Lms4Pms4bms4fms4jms4vms43ms47ms4/ms5Hms5Lms5hcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YjgwXCIsXG5cdFx0XCLms5nms5rms5zms53ms5/ms6Tms6bms6fms6nms6zms63ms7Lms7Tms7nms7/mtIDmtILmtIPmtIXmtIbmtIjmtInmtIrmtI3mtI/mtJDmtJHmtJPmtJTmtJXmtJbmtJjmtJzmtJ3mtJ9cIixcblx0XHQ1LFxuXHRcdFwi5rSm5rSo5rSp5rSs5rSt5rSv5rSw5rS05rS25rS35rS45rS65rS/5rWA5rWC5rWE5rWJ5rWM5rWQ5rWV5rWW5rWX5rWY5rWb5rWd5rWf5rWh5rWi5rWk5rWl5rWn5rWo5rWr5rWs5rWt5rWw5rWx5rWy5rWz5rW15rW25rW55rW65rW75rW9XCIsXG5cdFx0NCxcblx0XHRcIua2g+a2hOa2hua2h+a2iua2i+a2jea2j+a2kOa2kua2llwiLFxuXHRcdDQsXG5cdFx0XCLmtpzmtqLmtqXmtqzmtq3mtrDmtrHmtrPmtrTmtrbmtrfmtrlcIixcblx0XHQ1LFxuXHRcdFwi5reB5reC5reD5reI5reJ5reKXCJcblx0XSxcblx0W1xuXHRcdFwiOWM0MFwiLFxuXHRcdFwi5reN5reO5reP5reQ5reS5reT5reU5reV5reX5rea5reb5rec5ref5rei5rej5rel5ren5reo5rep5req5ret5rev5rew5rey5re05re15re25re45re65re9XCIsXG5cdFx0Nyxcblx0XHRcIua4hua4h+a4iOa4iea4i+a4j+a4kua4k+a4lea4mOa4mea4m+a4nOa4nua4n+a4oua4pua4p+a4qOa4qua4rOa4rua4sOa4sea4s+a4tVwiXG5cdF0sXG5cdFtcblx0XHRcIjljODBcIixcblx0XHRcIua4tua4t+a4uea4u1wiLFxuXHRcdDcsXG5cdFx0XCLmuYVcIixcblx0XHQ3LFxuXHRcdFwi5rmP5rmQ5rmR5rmS5rmV5rmX5rmZ5rma5rmc5rmd5rme5rmgXCIsXG5cdFx0MTAsXG5cdFx0XCLmuazmua3mua9cIixcblx0XHQxNCxcblx0XHRcIua6gOa6gea6gua6hOa6h+a6iOa6ilwiLFxuXHRcdDQsXG5cdFx0XCLmupFcIixcblx0XHQ2LFxuXHRcdFwi5rqZ5rqa5rqb5rqd5rqe5rqg5rqh5rqj5rqk5rqm5rqo5rqp5rqr5rqs5rqt5rqu5rqw5rqz5rq15rq45rq55rq85rq+5rq/5ruA5ruD5ruE5ruF5ruG5ruI5ruJ5ruK5ruM5ruN5ruO5ruQ5ruS5ruW5ruY5ruZ5rub5ruc5rud5ruj5run5ruqXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI5ZDQwXCIsXG5cdFx0XCLmu7Dmu7Hmu7Lmu7Pmu7Xmu7bmu7fmu7jmu7pcIixcblx0XHQ3LFxuXHRcdFwi5ryD5ryE5ryF5ryH5ryI5ryKXCIsXG5cdFx0NCxcblx0XHRcIua8kOa8kea8kua8llwiLFxuXHRcdDksXG5cdFx0XCLmvKHmvKLmvKPmvKXmvKbmvKfmvKjmvKzmvK7mvLDmvLLmvLTmvLXmvLdcIixcblx0XHQ2LFxuXHRcdFwi5ry/5r2A5r2B5r2CXCJcblx0XSxcblx0W1xuXHRcdFwiOWQ4MFwiLFxuXHRcdFwi5r2D5r2E5r2F5r2I5r2J5r2K5r2M5r2OXCIsXG5cdFx0OSxcblx0XHRcIua9mea9mua9m+a9nea9n+a9oOa9oea9o+a9pOa9pea9p1wiLFxuXHRcdDUsXG5cdFx0XCLmva/mvbDmvbHmvbPmvbXmvbbmvbfmvbnmvbvmvb1cIixcblx0XHQ2LFxuXHRcdFwi5r6F5r6G5r6H5r6K5r6L5r6PXCIsXG5cdFx0MTIsXG5cdFx0XCLmvp3mvp7mvp/mvqDmvqJcIixcblx0XHQ0LFxuXHRcdFwi5r6oXCIsXG5cdFx0MTAsXG5cdFx0XCLmvrTmvrXmvrfmvrjmvrpcIixcblx0XHQ1LFxuXHRcdFwi5r+B5r+DXCIsXG5cdFx0NSxcblx0XHRcIua/ilwiLFxuXHRcdDYsXG5cdFx0XCLmv5NcIixcblx0XHQxMCxcblx0XHRcIua/n+a/oua/o+a/pOa/pVwiXG5cdF0sXG5cdFtcblx0XHRcIjllNDBcIixcblx0XHRcIua/plwiLFxuXHRcdDcsXG5cdFx0XCLmv7BcIixcblx0XHQzMixcblx0XHRcIueAklwiLFxuXHRcdDcsXG5cdFx0XCLngJxcIixcblx0XHQ2LFxuXHRcdFwi54CkXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCI5ZTgwXCIsXG5cdFx0XCLngKtcIixcblx0XHQ5LFxuXHRcdFwi54C254C354C454C6XCIsXG5cdFx0MTcsXG5cdFx0XCLngY3ngY7ngZBcIixcblx0XHQxMyxcblx0XHRcIueBn1wiLFxuXHRcdDExLFxuXHRcdFwi54Gu54Gx54Gy54Gz54G054G354G554G654G754G954KB54KC54KD54KE54KG54KH54KI54KL54KM54KN54KP54KQ54KR54KT54KX54KY54Ka54Kb54KeXCIsXG5cdFx0MTIsXG5cdFx0XCLngrDngrLngrTngrXngrbngrrngr7ngr/ng4Tng4Xng4bng4fng4nng4tcIixcblx0XHQxMixcblx0XHRcIueDmlwiXG5cdF0sXG5cdFtcblx0XHRcIjlmNDBcIixcblx0XHRcIueDnOeDneeDnueDoOeDoeeDoueDo+eDpeeDqueDrueDsFwiLFxuXHRcdDYsXG5cdFx0XCLng7jng7rng7vng7zng75cIixcblx0XHQxMCxcblx0XHRcIueEi1wiLFxuXHRcdDQsXG5cdFx0XCLnhJHnhJLnhJTnhJfnhJtcIixcblx0XHQxMCxcblx0XHRcIueEp1wiLFxuXHRcdDcsXG5cdFx0XCLnhLLnhLPnhLRcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZjgwXCIsXG5cdFx0XCLnhLXnhLdcIixcblx0XHQxMyxcblx0XHRcIueFhueFh+eFiOeFieeFi+eFjeeFj1wiLFxuXHRcdDEyLFxuXHRcdFwi54Wd54WfXCIsXG5cdFx0NCxcblx0XHRcIueFpeeFqVwiLFxuXHRcdDQsXG5cdFx0XCLnha/nhbDnhbHnhbTnhbXnhbbnhbfnhbnnhbvnhbznhb5cIixcblx0XHQ1LFxuXHRcdFwi54aFXCIsXG5cdFx0NCxcblx0XHRcIueGi+eGjOeGjeeGjueGkOeGkeeGkueGk+eGleeGlueGl+eGmlwiLFxuXHRcdDQsXG5cdFx0XCLnhqFcIixcblx0XHQ2LFxuXHRcdFwi54ap54aq54ar54atXCIsXG5cdFx0NSxcblx0XHRcIueGtOeGtueGt+eGuOeGulwiLFxuXHRcdDgsXG5cdFx0XCLnh4RcIixcblx0XHQ5LFxuXHRcdFwi54ePXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJhMDQwXCIsXG5cdFx0XCLnh5ZcIixcblx0XHQ5LFxuXHRcdFwi54eh54ei54ej54ek54em54eoXCIsXG5cdFx0NSxcblx0XHRcIueHr1wiLFxuXHRcdDksXG5cdFx0XCLnh7pcIixcblx0XHQxMSxcblx0XHRcIueIh1wiLFxuXHRcdDE5XG5cdF0sXG5cdFtcblx0XHRcImEwODBcIixcblx0XHRcIueIm+eInOeInlwiLFxuXHRcdDksXG5cdFx0XCLniKnniKvniK3niK7niK/niLLniLPniLTniLrniLzniL7niYBcIixcblx0XHQ2LFxuXHRcdFwi54mJ54mK54mL54mO54mP54mQ54mR54mT54mU54mV54mX54mY54ma54mc54me54mg54mj54mk54ml54mo54mq54mr54ms54mt54mw54mx54mz54m054m254m354m454m754m854m954qC54qD54qFXCIsXG5cdFx0NCxcblx0XHRcIueKjOeKjueKkOeKkeeKk1wiLFxuXHRcdDExLFxuXHRcdFwi54qgXCIsXG5cdFx0MTEsXG5cdFx0XCLniq7nirHnirLnirPnirXnirpcIixcblx0XHQ2LFxuXHRcdFwi54uF54uG54uH54uJ54uK54uL54uM54uP54uR54uT54uU54uV54uW54uY54ua54ubXCJcblx0XSxcblx0W1xuXHRcdFwiYTFhMVwiLFxuXHRcdFwi44CA44CB44CCwrfLicuHwqjjgIPjgIXigJTvvZ7igJbigKbigJjigJnigJzigJ3jgJTjgJXjgIhcIixcblx0XHQ3LFxuXHRcdFwi44CW44CX44CQ44CRwrHDl8O34oi24oin4oio4oiR4oiP4oiq4oip4oiI4oi34oia4oql4oil4oig4oyS4oqZ4oir4oiu4omh4omM4omI4oi94oid4omg4omu4omv4omk4oml4oie4oi14oi04pmC4pmAwrDigLLigLPihIPvvITCpO+/oO+/oeKAsMKn4oSW4piG4piF4peL4peP4peO4peH4peG4pah4pag4paz4pay4oC74oaS4oaQ4oaR4oaT44CTXCJcblx0XSxcblx0W1xuXHRcdFwiYTJhMVwiLFxuXHRcdFwi4oWwXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCJhMmIxXCIsXG5cdFx0XCLikohcIixcblx0XHQxOSxcblx0XHRcIuKRtFwiLFxuXHRcdDE5LFxuXHRcdFwi4pGgXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCJhMmU1XCIsXG5cdFx0XCLjiKBcIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcImEyZjFcIixcblx0XHRcIuKFoFwiLFxuXHRcdDExXG5cdF0sXG5cdFtcblx0XHRcImEzYTFcIixcblx0XHRcIu+8ge+8gu+8g++/pe+8hVwiLFxuXHRcdDg4LFxuXHRcdFwi77+jXCJcblx0XSxcblx0W1xuXHRcdFwiYTRhMVwiLFxuXHRcdFwi44GBXCIsXG5cdFx0ODJcblx0XSxcblx0W1xuXHRcdFwiYTVhMVwiLFxuXHRcdFwi44KhXCIsXG5cdFx0ODVcblx0XSxcblx0W1xuXHRcdFwiYTZhMVwiLFxuXHRcdFwizpFcIixcblx0XHQxNixcblx0XHRcIs6jXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJhNmMxXCIsXG5cdFx0XCLOsVwiLFxuXHRcdDE2LFxuXHRcdFwiz4NcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImE2ZTBcIixcblx0XHRcIu+4te+4tu+4ue+4uu+4v++5gO+4ve+4vu+5ge+5gu+5g++5hFwiXG5cdF0sXG5cdFtcblx0XHRcImE2ZWVcIixcblx0XHRcIu+4u++4vO+4t++4uO+4sVwiXG5cdF0sXG5cdFtcblx0XHRcImE2ZjRcIixcblx0XHRcIu+4s++4tFwiXG5cdF0sXG5cdFtcblx0XHRcImE3YTFcIixcblx0XHRcItCQXCIsXG5cdFx0NSxcblx0XHRcItCB0JZcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCJhN2QxXCIsXG5cdFx0XCLQsFwiLFxuXHRcdDUsXG5cdFx0XCLRkdC2XCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiYTg0MFwiLFxuXHRcdFwiy4rLi8uZ4oCT4oCV4oCl4oC14oSF4oSJ4oaW4oaX4oaY4oaZ4oiV4oif4oij4omS4omm4omn4oq/4pWQXCIsXG5cdFx0MzUsXG5cdFx0XCLiloFcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImE4ODBcIixcblx0XHRcIuKWiFwiLFxuXHRcdDcsXG5cdFx0XCLilpPilpTilpXilrzilr3il6Lil6Pil6Til6XimIniipXjgJLjgJ3jgJ5cIlxuXHRdLFxuXHRbXG5cdFx0XCJhOGExXCIsXG5cdFx0XCLEgcOhx47DoMSTw6nEm8OoxKvDrceQw6zFjcOzx5LDssWrw7rHlMO5x5bHmMeax5zDvMOqyZFcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOGJkXCIsXG5cdFx0XCLFhMWIXCJcblx0XSxcblx0W1xuXHRcdFwiYThjMFwiLFxuXHRcdFwiyaFcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOGM1XCIsXG5cdFx0XCLjhIVcIixcblx0XHQzNlxuXHRdLFxuXHRbXG5cdFx0XCJhOTQwXCIsXG5cdFx0XCLjgKFcIixcblx0XHQ4LFxuXHRcdFwi44qj446O446P446c446d446e446h44+E44+O44+R44+S44+V77iw77+i77+kXCJcblx0XSxcblx0W1xuXHRcdFwiYTk1OVwiLFxuXHRcdFwi4oSh44ixXCJcblx0XSxcblx0W1xuXHRcdFwiYTk1Y1wiLFxuXHRcdFwi4oCQXCJcblx0XSxcblx0W1xuXHRcdFwiYTk2MFwiLFxuXHRcdFwi44O844Kb44Kc44O944O+44CG44Kd44Ke77mJXCIsXG5cdFx0OSxcblx0XHRcIu+5lO+5le+5lu+5l++5mVwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiYTk4MFwiLFxuXHRcdFwi77miXCIsXG5cdFx0NCxcblx0XHRcIu+5qO+5qe+5qu+5q1wiXG5cdF0sXG5cdFtcblx0XHRcImE5OTZcIixcblx0XHRcIuOAh1wiXG5cdF0sXG5cdFtcblx0XHRcImE5YTRcIixcblx0XHRcIuKUgFwiLFxuXHRcdDc1XG5cdF0sXG5cdFtcblx0XHRcImFhNDBcIixcblx0XHRcIueLnOeLneeLn+eLolwiLFxuXHRcdDUsXG5cdFx0XCLni6rni6vni7Xni7bni7nni73ni77ni7/njIDnjILnjIRcIixcblx0XHQ1LFxuXHRcdFwi54yL54yM54yN54yP54yQ54yR54yS54yU54yY54yZ54ya54yf54yg54yj54yk54ym54yn54yo54yt54yv54yw54yy54yz54y154y254y654y754y854y9542AXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCJhYTgwXCIsXG5cdFx0XCLnjYnnjYrnjYvnjYznjY7njY/njZHnjZPnjZTnjZXnjZbnjZhcIixcblx0XHQ3LFxuXHRcdFwi542hXCIsXG5cdFx0MTAsXG5cdFx0XCLnja7njbDnjbFcIlxuXHRdLFxuXHRbXG5cdFx0XCJhYjQwXCIsXG5cdFx0XCLnjbJcIixcblx0XHQxMSxcblx0XHRcIueNv1wiLFxuXHRcdDQsXG5cdFx0XCLnjoXnjobnjojnjornjoznjo3njo/njpDnjpLnjpPnjpTnjpXnjpfnjpjnjpnnjprnjpznjp3njp7njqDnjqHnjqNcIixcblx0XHQ1LFxuXHRcdFwi546q546s546t546x5460546154625464546554685469546+546/54+B54+DXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJhYjgwXCIsXG5cdFx0XCLnj4vnj4znj47nj5JcIixcblx0XHQ2LFxuXHRcdFwi54+a54+b54+c54+d54+f54+h54+i54+j54+k54+m54+o54+q54+r54+s54+u54+v54+w54+x54+zXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJhYzQwXCIsXG5cdFx0XCLnj7hcIixcblx0XHQxMCxcblx0XHRcIueQhOeQh+eQiOeQi+eQjOeQjeeQjueQkVwiLFxuXHRcdDgsXG5cdFx0XCLnkJxcIixcblx0XHQ1LFxuXHRcdFwi55Cj55Ck55Cn55Cp55Cr55Ct55Cv55Cx55Cy55C3XCIsXG5cdFx0NCxcblx0XHRcIueQveeQvueQv+eRgOeRglwiLFxuXHRcdDExXG5cdF0sXG5cdFtcblx0XHRcImFjODBcIixcblx0XHRcIueRjlwiLFxuXHRcdDYsXG5cdFx0XCLnkZbnkZjnkZ3nkaBcIixcblx0XHQxMixcblx0XHRcIueRrueRr+eRsVwiLFxuXHRcdDQsXG5cdFx0XCLnkbjnkbnnkbpcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZDQwXCIsXG5cdFx0XCLnkbvnkbznkb3nkb/nkoLnkoTnkoXnkobnkojnkonnkornkoznko3nko/nkpFcIixcblx0XHQxMCxcblx0XHRcIueSneeSn1wiLFxuXHRcdDcsXG5cdFx0XCLnkqpcIixcblx0XHQxNSxcblx0XHRcIueSu1wiLFxuXHRcdDEyXG5cdF0sXG5cdFtcblx0XHRcImFkODBcIixcblx0XHRcIueTiFwiLFxuXHRcdDksXG5cdFx0XCLnk5NcIixcblx0XHQ4LFxuXHRcdFwi55Od55Of55Oh55Ol55OnXCIsXG5cdFx0Nixcblx0XHRcIueTsOeTseeTslwiXG5cdF0sXG5cdFtcblx0XHRcImFlNDBcIixcblx0XHRcIueTs+eTteeTuFwiLFxuXHRcdDYsXG5cdFx0XCLnlIDnlIHnlILnlIPnlIVcIixcblx0XHQ3LFxuXHRcdFwi55SO55SQ55SS55SU55SV55SW55SX55Sb55Sd55Se55SgXCIsXG5cdFx0NCxcblx0XHRcIueUpueUp+eUqueUrueUtOeUtueUueeUvOeUveeUv+eVgeeVgueVg+eVhOeVhueVh+eVieeViueVjeeVkOeVkeeVkueVk+eVleeVlueVl+eVmFwiXG5cdF0sXG5cdFtcblx0XHRcImFlODBcIixcblx0XHRcIueVnVwiLFxuXHRcdDcsXG5cdFx0XCLnlafnlajnlannlatcIixcblx0XHQ2LFxuXHRcdFwi55Wz55W155W255W355W6XCIsXG5cdFx0NCxcblx0XHRcIueWgOeWgeeWgueWhOeWheeWh1wiXG5cdF0sXG5cdFtcblx0XHRcImFmNDBcIixcblx0XHRcIueWiOeWieeWiueWjOeWjeeWjueWkOeWk+eWleeWmOeWm+eWnOeWnueWoueWplwiLFxuXHRcdDQsXG5cdFx0XCLnlq3nlrbnlrfnlrrnlrvnlr/nl4Dnl4Hnl4bnl4vnl4znl47nl4/nl5Dnl5Hnl5Pnl5fnl5nnl5rnl5znl53nl5/nl6Dnl6Hnl6Xnl6nnl6znl63nl67nl6/nl7Lnl7Pnl7Xnl7bnl7fnl7jnl7rnl7vnl73nl77nmILnmITnmIbnmIdcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZjgwXCIsXG5cdFx0XCLnmIjnmInnmIvnmI3nmI7nmI/nmJHnmJLnmJPnmJTnmJbnmJrnmJznmJ3nmJ7nmKHnmKPnmKfnmKjnmKznmK7nmK/nmLHnmLLnmLbnmLfnmLnnmLrnmLvnmL3nmYHnmYLnmYRcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMDQwXCIsXG5cdFx0XCLnmYVcIixcblx0XHQ2LFxuXHRcdFwi55mOXCIsXG5cdFx0NSxcblx0XHRcIueZleeZl1wiLFxuXHRcdDQsXG5cdFx0XCLnmZ3nmZ/nmaDnmaHnmaLnmaRcIixcblx0XHQ2LFxuXHRcdFwi55ms55mt55mu55mwXCIsXG5cdFx0Nyxcblx0XHRcIueZueeZuueZvOeZv+eagOeageeag+eaheeaieeaiueajOeajeeaj+eakOeakuealOealeeal+eamOeamueam1wiXG5cdF0sXG5cdFtcblx0XHRcImIwODBcIixcblx0XHRcIueanFwiLFxuXHRcdDcsXG5cdFx0XCLnmqVcIixcblx0XHQ4LFxuXHRcdFwi55qv55qw55qz55q1XCIsXG5cdFx0OSxcblx0XHRcIuebgOebgeebg+WViumYv+Wfg+aMqOWTjuWUieWTgOeakeeZjOiUvOefruiJvueijeeIsemamOmejeawqOWuieS/uuaMieaal+WyuOiDuuahiOiCruaYguebjuWHueaVlueGrOe/seiihOWCsuWlpeaHiua+s+iKreaNjOaJkuWPreWQp+eshuWFq+eWpOW3tOaLlOi3i+mdtuaKiuiAmeWdnemcuOe9oueIuOeZveafj+eZvuaRhuS9sOi0peaLnOeol+aWkeePreaQrOaJs+iIrOmigeadv+eJiOaJruaLjOS8tOeTo+WNiuWKnue7iumCpuW4ruaihuamnOiGgOe7keajkuejheiajOmVkeWCjeiwpOiLnuiDnuWMheikkuWJpVwiXG5cdF0sXG5cdFtcblx0XHRcImIxNDBcIixcblx0XHRcIuebhOebh+ebieebi+ebjOebk+ebleebmeebmuebnOebneebnueboFwiLFxuXHRcdDQsXG5cdFx0XCLnm6ZcIixcblx0XHQ3LFxuXHRcdFwi55uw55uz55u155u255u355u655u755u955u/55yA55yC55yD55yF55yG55yK55yM55yOXCIsXG5cdFx0MTAsXG5cdFx0XCLnnJvnnJznnJ3nnJ7nnKHnnKPnnKTnnKXnnKfnnKrnnKtcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMTgwXCIsXG5cdFx0XCLnnKznnK7nnLBcIixcblx0XHQ0LFxuXHRcdFwi55y555y755y955y+55y/552C552E552F552G552IXCIsXG5cdFx0Nyxcblx0XHRcIuedklwiLFxuXHRcdDcsXG5cdFx0XCLnnZzoloTpm7nkv53loKHppbHlrp3mirHmiqXmmrTosbnpso3niIbmna/nopHmgrLljZHljJfovojog4zotJ3pkqHlgI3ni4jlpIfmg6vnhJnooqvlpZToi6/mnKznrKjltKnnu7fnlK3ms7Xouabov7jpgLzpvLvmr5TphJnnrJTlvbznoqfok5bolL3mr5Xmr5nmr5bluIHluofnl7npl63mlZ3lvIrlv4Xovp/lo4Hoh4Lpgb/pmZvpnq3ovrnnvJbotKzmiYHkvr/lj5jljZ7ovqjovqnovqvpgY3moIflvarohpjooajps5bmhovliKvnmKrlvazmlozmv5Lmu6jlrr7mkYjlhbXlhrDmn4TkuJnnp4nppbzngrNcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMjQwXCIsXG5cdFx0XCLnnZ3nnZ7nnZ/nnaDnnaTnnafnnannnarnna1cIixcblx0XHQxMSxcblx0XHRcIueduuedu+edvOeegeeegueeg+eehlwiLFxuXHRcdDUsXG5cdFx0XCLnno/nnpDnnpNcIixcblx0XHQxMSxcblx0XHRcIueeoeeeo+eepOeepueeqOeeq+eereeerueer+eeseeesueetOeetlwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiYjI4MFwiLFxuXHRcdFwi5568556+55+AXCIsXG5cdFx0MTIsXG5cdFx0XCLnn45cIixcblx0XHQ4LFxuXHRcdFwi55+Y55+Z55+a55+dXCIsXG5cdFx0NCxcblx0XHRcIuefpOeXheW5tueOu+iPoOaSreaLqOmSteazouWNmuWLg+aQj+mTgueulOS8r+W4m+iItuiEluiGiua4pOaziumps+aNleWNnOWTuuihpeWfoOS4jeW4g+atpeewv+mDqOaAluaTpueMnOijgeadkOaJjei0ouedrOi4qemHh+W9qeiPnOiUoemkkOWPguialeaui+aDreaDqOeBv+iLjeiIseS7k+ayp+iXj+aTjeezmeanveabueiNieWOleetluS+p+WGjOa1i+Wxgui5reaPkuWPieiMrOiMtuafpeeitOaQveWvn+WylOW3ruivp+aLhuaftOixuuaQgOaOuuidiemmi+iwl+e8oOmTsuS6p+mYkOmipOaYjOeMllwiXG5cdF0sXG5cdFtcblx0XHRcImIzNDBcIixcblx0XHRcIuefpuefqOefquefr+efsOefseefsueftOefteeft+efueefuuefu+efvOegg1wiLFxuXHRcdDUsXG5cdFx0XCLnoIrnoIvnoI7noI/noJDnoJPnoJXnoJnnoJvnoJ7noKDnoKHnoKLnoKTnoKjnoKrnoKvnoK7noK/noLHnoLLnoLPnoLXnoLbnoL3noL/noYHnoYLnoYPnoYTnoYbnoYjnoYnnoYrnoYvnoY3noY/noZHnoZPnoZTnoZjnoZnnoZpcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMzgwXCIsXG5cdFx0XCLnoZvnoZznoZ5cIixcblx0XHQxMSxcblx0XHRcIuehr1wiLFxuXHRcdDcsXG5cdFx0XCLnobjnobnnobrnobvnob1cIixcblx0XHQ2LFxuXHRcdFwi5Zy65bCd5bi46ZW/5YG/6IKg5Y6C5pWe55WF5ZSx5YCh6LaF5oqE6ZKe5pyd5Ziy5r2u5bei5ZC154KS6L2m5omv5pKk5o6j5b275r6I6YO06Iej6L6w5bCY5pmo5b+x5rKJ6ZmI6LaB6KGs5pKR56ew5Z+O5qmZ5oiQ5ZGI5LmY56iL5oOp5r6E6K+a5om/6YCe6aqL56ek5ZCD55e05oyB5YyZ5rGg6L+f5byb6amw6IC76b2/5L6I5bC66LWk57+F5pal54K95YWF5Yay6Jmr5bSH5a6g5oq96YWs55W06LiM56ig5oSB56255LuH57u4556F5LiR6Iet5Yid5Ye65qmx5Y6o6LqH6ZSE6ZuP5ruB6Zmk5qWaXCJcblx0XSxcblx0W1xuXHRcdFwiYjQ0MFwiLFxuXHRcdFwi56KE56KF56KG56KI56KK56KL56KP56KQ56KS56KU56KV56KW56KZ56Kd56Ke56Kg56Ki56Kk56Km56KoXCIsXG5cdFx0Nyxcblx0XHRcIueiteeitueit+eiuOeiuueiu+eivOeiveeiv+ejgOejguejg+ejhOejhuejh+ejiOejjOejjeejjuejj+ejkeejkuejk+ejluejl+ejmOejmlwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiYjQ4MFwiLFxuXHRcdFwi56Ok56Ol56Om56On56Op56Oq56Or56OtXCIsXG5cdFx0NCxcblx0XHRcIuejs+ejteejtuejuOejueeju1wiLFxuXHRcdDUsXG5cdFx0XCLnpILnpIPnpITnpIZcIixcblx0XHQ2LFxuXHRcdFwi56GA5YKo55+X5pCQ6Kem5aSE5o+j5bed56m/5qS95Lyg6Ii55ZaY5Liy55au56qX5bmi5bqK6Zev5Yib5ZC554KK5o226ZSk5Z6C5pil5qS/6YaH5ZSH5rez57qv6KCi5oiz57uw55a16Iyo56OB6ZuM6L6e5oWI55O36K+N5q2k5Yi66LWQ5qyh6IGq6JGx5Zux5YyG5LuO5Lib5YeR57KX6YaL57CH5L+D6Lm/56+h56qc5pGn5bSU5YKs6ISG55iB57K55res57+g5p2R5a2Y5a+456OL5pKu5pCT5o6q5oyr6ZSZ5pCt6L6+562U55ip5omT5aSn5ZGG5q255YKj5oi05bim5q6G5Luj6LS36KKL5b6F6YCuXCJcblx0XSxcblx0W1xuXHRcdFwiYjU0MFwiLFxuXHRcdFwi56SNXCIsXG5cdFx0NSxcblx0XHRcIueklFwiLFxuXHRcdDksXG5cdFx0XCLnpJ9cIixcblx0XHQ0LFxuXHRcdFwi56SlXCIsXG5cdFx0MTQsXG5cdFx0XCLnpLVcIixcblx0XHQ0LFxuXHRcdFwi56S956S/56WC56WD56WE56WF56WH56WKXCIsXG5cdFx0OCxcblx0XHRcIuellOelleelmOelmeeloeelo1wiXG5cdF0sXG5cdFtcblx0XHRcImI1ODBcIixcblx0XHRcIuelpOelpuelqeelquelq+elrOelruelsFwiLFxuXHRcdDYsXG5cdFx0XCLnpbnnpbtcIixcblx0XHQ0LFxuXHRcdFwi56aC56aD56aG56aH56aI56aJ56aL56aM56aN56aO56aQ56aR56aS5oCg6IC95ouF5Li55Y2V6YO45o646IOG5pem5rCu5L2G5oOu5reh6K+e5by56JuL5b2T5oyh5YWa6I2h5qGj5YiA5o2j6LmI5YCS5bKb56W35a+85Yiw56i75oK86YGT55uX5b635b6X55qE6Lms54Gv55m7562J556q5Yez6YKT5aCk5L2O5ru06L+q5pWM56yb54uE5rak57+f5auh5oq15bqV5Zyw6JKC56ys5bid5byf6YCS57yU6aKg5o6C5ruH56KY54K55YW46Z2b5Z6r55S15L2D55S45bqX5oOm5aWg5reA5q6/56KJ5Y+86ZuV5YeL5YiB5o6J5ZCK6ZKT6LCD6LeM54i556Kf6J226L+t6LCN5Y+gXCJcblx0XSxcblx0W1xuXHRcdFwiYjY0MFwiLFxuXHRcdFwi56aTXCIsXG5cdFx0Nixcblx0XHRcIuemm1wiLFxuXHRcdDExLFxuXHRcdFwi56aoXCIsXG5cdFx0MTAsXG5cdFx0XCLnprRcIixcblx0XHQ0LFxuXHRcdFwi56a856a/56eC56eE56eF56eH56eI56eK56eM56eO56eP56eQ56eT56eU56eW56eX56eZXCIsXG5cdFx0NSxcblx0XHRcIuenoOenoeenouenpeenqOenqlwiXG5cdF0sXG5cdFtcblx0XHRcImI2ODBcIixcblx0XHRcIuenrOenruensVwiLFxuXHRcdDYsXG5cdFx0XCLnp7nnp7rnp7znp77np7/nqIHnqITnqIXnqIfnqIjnqInnqIrnqIznqI9cIixcblx0XHQ0LFxuXHRcdFwi56iV56iW56iY56iZ56ib56ic5LiB55uv5Y+u6ZKJ6aG26byO6ZSt5a6a6K6i5Lii5Lic5Yas6JGj5oeC5Yqo5qCL5L6X5oGr5Ya75rSe5YWc5oqW5paX6Zmh6LGG6YCX55eY6YO9552j5q+S54qK54us6K+75aC155256LWM5p2c6ZWA6IKa5bqm5rih5aaS56uv55+t6ZS75q615pat57yO5aCG5YWR6Zif5a+55aKp5ZCo6Lmy5pWm6aG/5Zuk6ZKd55u+6YGB5o6H5ZOG5aSa5aS65Z6b6Lqy5py16Le66Ii15YmB5oOw5aCV6Ju+5bOo6bmF5L+E6aKd6K655ail5oG25Y6E5om86YGP6YSC6aW/5oGp6ICM5YS/6ICz5bCU6aW15rSx5LqMXCJcblx0XSxcblx0W1xuXHRcdFwiYjc0MFwiLFxuXHRcdFwi56id56if56ih56ii56ikXCIsXG5cdFx0MTQsXG5cdFx0XCLnqLTnqLXnqLbnqLjnqLrnqL7nqYBcIixcblx0XHQ1LFxuXHRcdFwi56mHXCIsXG5cdFx0OSxcblx0XHRcIuepklwiLFxuXHRcdDQsXG5cdFx0XCLnqZhcIixcblx0XHQxNlxuXHRdLFxuXHRbXG5cdFx0XCJiNzgwXCIsXG5cdFx0XCLnqalcIixcblx0XHQ2LFxuXHRcdFwi56mx56my56mz56m156m756m856m956m+56qC56qF56qH56qJ56qK56qL56qM56qO56qP56qQ56qT56qU56qZ56qa56qb56qe56qh56qi6LSw5Y+R572a562P5LyQ5LmP6ZiA5rOV54+Q6Jep5biG55Wq57+75qiK55++6ZKS57mB5Yeh54Om5Y+N6L+U6IyD6LSp54qv6aWt5rOb5Z2K6Iqz5pa56IKq5oi/6Ziy5aao5Lu/6K6/57q65pS+6I+y6Z2e5ZWh6aOe6IKl5Yyq6K+95ZCg6IK65bqf5rK46LS56Iqs6YWa5ZCp5rCb5YiG57q35Z2f54Sa5rG+57KJ5aWL5Lu95b+/5oSk57Kq5Liw5bCB5p6r6JyC5bOw6ZSL6aOO55av54O96YCi5Yav57yd6K695aWJ5Yek5L2b5ZCm5aSr5pW36IKk5a215om25ouC6L6Q5bmF5rCf56ym5LyP5L+Y5pyNXCJcblx0XSxcblx0W1xuXHRcdFwiYjg0MFwiLFxuXHRcdFwi56qj56qk56qn56qp56qq56qr56quXCIsXG5cdFx0NCxcblx0XHRcIueqtFwiLFxuXHRcdDEwLFxuXHRcdFwi56uAXCIsXG5cdFx0MTAsXG5cdFx0XCLnq4xcIixcblx0XHQ5LFxuXHRcdFwi56uX56uY56ua56ub56uc56ud56uh56ui56uk56unXCIsXG5cdFx0NSxcblx0XHRcIuerruersOerseersuers1wiXG5cdF0sXG5cdFtcblx0XHRcImI4ODBcIixcblx0XHRcIuertFwiLFxuXHRcdDQsXG5cdFx0XCLnq7vnq7znq77nrIDnrIHnrILnrIXnrIfnrInnrIznrI3nrI7nrJDnrJLnrJPnrJbnrJfnrJjnrJrnrJznrJ3nrJ/nrKHnrKLnrKPnrKfnrKnnrK3mta7mtqrnpo/oorHlvJfnlKvmiprovoXkv6/ph5zmlqfohK/ohZHlupzohZDotbTlia/opobotYvlpI3lgoXku5jpmJzniLbohbnotJ/lr4zorqPpmYTlpofnvJrlkpDlmbblmI7or6XmlLnmpoLpkpnnm5bmuonlubLnlJjmnYbmn5Hnq7/ogp3otbbmhJ/np4bmlaLotaPlhojliJrpkqLnvLjogpvnurLlspfmuK/mnaDnr5nnmovpq5joho/nvpTns5XmkJ7plZDnqL/lkYrlk6XmrYzmkIHmiIjpuL3og7PnlpnlibLpnanokZvmoLzom6TpmIHpmpTpk6zkuKrlkITnu5nmoLnot5/ogJXmm7TluprnvrlcIlxuXHRdLFxuXHRbXG5cdFx0XCJiOTQwXCIsXG5cdFx0XCLnrK/nrLDnrLLnrLTnrLXnrLbnrLfnrLnnrLvnrL3nrL9cIixcblx0XHQ1LFxuXHRcdFwi562G562I562K562N562O562T562V562X562Z562c562e562f562h562jXCIsXG5cdFx0MTAsXG5cdFx0XCLnra/nrbDnrbPnrbTnrbbnrbjnrbrnrbznrb3nrb/nroHnroLnroPnroTnroZcIixcblx0XHQ2LFxuXHRcdFwi566O566PXCJcblx0XSxcblx0W1xuXHRcdFwiYjk4MFwiLFxuXHRcdFwi566R566S566T566W566Y566Z566a566b566e566f566g566j566k566l566u566v566w566y566z5661566256635665XCIsXG5cdFx0Nyxcblx0XHRcIuevguevg+evhOWfguiAv+ail+W3peaUu+WKn+aBrem+muS+m+i6rOWFrOWuq+W8k+W3qeaxnuaLsei0oeWFsemSqeWLvuayn+iLn+eLl+WeouaehOi0reWkn+i+nOiPh+WSleeujeS8sOayveWtpOWnkem8k+WPpOibiumqqOiwt+iCoeaVhemhvuWbuumbh+WIrueTnOWJkOWvoeaMguikguS5luaLkOaAquajuuWFs+WumOWGoOingueuoemmhue9kOaDr+eBjOi0r+WFieW5v+mAm+eRsOinhOWcreehheW9kum+n+mXuui9qOmsvOivoeeZuOahguafnOi3qui0teWIvei+iua7muajjemUhemDreWbveaenOijuei/h+WTiFwiXG5cdF0sXG5cdFtcblx0XHRcImJhNDBcIixcblx0XHRcIuevheeviOevieeviuevi+evjeevjuevj+evkOevkuevlFwiLFxuXHRcdDQsXG5cdFx0XCLnr5vnr5znr57nr5/nr6Dnr6Lnr6Pnr6Tnr6fnr6jnr6nnr6vnr6znr63nr6/nr7Dnr7JcIixcblx0XHQ0LFxuXHRcdFwi56+456+556+656+756+956+/XCIsXG5cdFx0Nyxcblx0XHRcIuewiOewieewiuewjeewjuewkFwiLFxuXHRcdDUsXG5cdFx0XCLnsJfnsJjnsJlcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYTgwXCIsXG5cdFx0XCLnsJpcIixcblx0XHQ0LFxuXHRcdFwi57CgXCIsXG5cdFx0NSxcblx0XHRcIuewqOewqeewq1wiLFxuXHRcdDEyLFxuXHRcdFwi57C5XCIsXG5cdFx0NSxcblx0XHRcIuexgumquOWtqea1t+awpuS6peWus+mqh+mFo+aGqOmCr+mfqeWQq+a2teWvkuWHveWWiue9lee/sOaSvOaNjeaXseaGvuaCjeeEiuaxl+axieWkr+adreiIquWjleWajuixquavq+mDneWlveiAl+WPt+a1qeWRteWWneiNt+iPj+aguOemvuWSjOS9leWQiOebkuiyiemYguays+a2uOi1q+ikkOm5pOi0uuWYv+m7keeXleW+iOeLoOaBqOWTvOS6qOaoquihoeaBkui9sOWThOeDmOiZuem4v+a0quWuj+W8mOe6ouWWieS+r+eMtOWQvOWOmuWAmeWQjuWRvOS5juW/veeRmuWjtuiRq+iDoeidtOeLkOeziua5llwiXG5cdF0sXG5cdFtcblx0XHRcImJiNDBcIixcblx0XHRcIuexg1wiLFxuXHRcdDksXG5cdFx0XCLnsY5cIixcblx0XHQzNixcblx0XHRcIuextVwiLFxuXHRcdDUsXG5cdFx0XCLnsb5cIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcImJiODBcIixcblx0XHRcIueyiOeyilwiLFxuXHRcdDYsXG5cdFx0XCLnspPnspTnspbnspnnsprnspvnsqDnsqHnsqPnsqbnsqfnsqjnsqnnsqvnsqznsq3nsq/nsrDnsrRcIixcblx0XHQ0LFxuXHRcdFwi57K657K75byn6JmO5ZSs5oqk5LqS5rKq5oi36Iqx5ZOX5Y2O54y+5ruR55S75YiS5YyW6K+d5qeQ5b6K5oCA5reu5Z2P5qyi546v5qGT6L+Y57yT5o2i5oKj5ZSk55eq6LGi54SV5raj5a6m5bm76I2S5oWM6buE56O66J2X57Cn55qH5Yew5oO254WM5pmD5bmM5oGN6LCO54Gw5oyl6L6J5b695oGi6JuU5Zue5q+B5oKU5oWn5Y2J5oOg5pmm6LS/56e95Lya54Op5rGH6K6z6K+y57uY6I2k5piP5ama6a2C5rWR5re36LGB5rS75LyZ54Gr6I635oiW5oOR6ZyN6LSn56W45Ye75Zy+5Z+65py655W456i956ev566VXCJcblx0XSxcblx0W1xuXHRcdFwiYmM0MFwiLFxuXHRcdFwi57K/57OA57OC57OD57OE57OG57OJ57OL57OOXCIsXG5cdFx0Nixcblx0XHRcIuezmOezmuezm+ezneeznuezoVwiLFxuXHRcdDYsXG5cdFx0XCLns6lcIixcblx0XHQ1LFxuXHRcdFwi57OwXCIsXG5cdFx0Nyxcblx0XHRcIuezueezuuezvFwiLFxuXHRcdDEzLFxuXHRcdFwi57SLXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCJiYzgwXCIsXG5cdFx0XCLntJFcIixcblx0XHQxNCxcblx0XHRcIue0oee0o+e0pOe0pee0pue0qOe0qee0que0rOe0ree0rue0sFwiLFxuXHRcdDYsXG5cdFx0XCLogozppaXov7nmv4DorqXpuKHlp6znu6nnvInlkInmnoHmo5jovpHnsY3pm4blj4rmgKXnlr7msbLljbPlq4nnuqfmjKTlh6DohIrlt7Hok5/mioDlhoDlraPkvI7npa3liYLmgrjmtY7lr4Tlr4LorqHorrDml6Llv4zpmYXlppPnu6fnuqrlmInmnrflpLnkvbPlrrbliqDojZrpoorotL7nlLLpkr7lgYfnqLzku7fmnrbpqb7lq4Hmrbznm5HlnZrlsJbnrLrpl7TnhY7lhbzogqnoibDlpbjnvITojKfmo4Dmn6znorHnobfmi6PmjaHnroDkv63liarlh4/ojZDmp5vpibTot7XotLHop4HplK7nrq3ku7ZcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZDQwXCIsXG5cdFx0XCLntLdcIixcblx0XHQ1NCxcblx0XHRcIue1r1wiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiYmQ4MFwiLFxuXHRcdFwi57W4XCIsXG5cdFx0MzIsXG5cdFx0XCLlgaXoiLDliZHppa/muJDmuoXmtqflu7rlg7Xlp5zlsIbmtYbmsZ/nlobokovmoajlpZborrLljKDphbHpmY3olYnmpJLnpIHnhKbog7bkuqTpg4rmtYfpqoTlqIflmrzmkIXpk7Dnn6vkvqXohJrni6Hop5LppbrnvLTnu57lib/mlZnphbXovb/ovoPlj6vnqpbmj63mjqXnmobnp7jooZfpmLbmiKrliqvoioLmoZTmnbDmjbfnnavnq63mtIHnu5Pop6Plp5DmiJLol4noiqXnlYzlgJ/ku4vnlqXor6vlsYrlt77nrYvmlqTph5Hku4rmtKXopZ/ntKfplKbku4XosKjov5vpnbPmmYvnpoHov5Hng6zmtbhcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZTQwXCIsXG5cdFx0XCLntplcIixcblx0XHQxMixcblx0XHRcIue2p1wiLFxuXHRcdDYsXG5cdFx0XCLntq9cIixcblx0XHQ0MlxuXHRdLFxuXHRbXG5cdFx0XCJiZTgwXCIsXG5cdFx0XCLnt5pcIixcblx0XHQzMixcblx0XHRcIuWwveWKsuiNhuWFouiMjuedm+aZtumyuOS6rOaDiueyvueys+e7j+S6leitpuaZr+miiOmdmeWig+aVrOmVnOW+hOeXiemdluern+ernuWHgOeCr+eqmOaPqueptue6oOeOlumfreS5heeBuOS5nemFkuWOqeaVkeaXp+iHvOiIheWSjuWwseeWmumeoOaLmOeLmeeWveWxhempueiPiuWxgOWSgOefqeS4vuayruiBmuaLkuaNruW3qOWFt+i3nei4numUr+S/seWPpeaDp+eCrOWJp+aNkOm5g+Won+WApuect+WNt+e7ouaSheaUq+aKieaOmOWAlOeIteinieWGs+ivgOe7neWdh+iPjOmSp+WGm+WQm+Wzu1wiXG5cdF0sXG5cdFtcblx0XHRcImJmNDBcIixcblx0XHRcIue3u1wiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImJmODBcIixcblx0XHRcIue4uue4vFwiLFxuXHRcdDQsXG5cdFx0XCLnuYJcIixcblx0XHQ0LFxuXHRcdFwi57mIXCIsXG5cdFx0MjEsXG5cdFx0XCLkv4rnq6PmtZrpg6Hpqo/lloDlkpbljaHlkq/lvIDmj6nmpbflh6/mhajliIrloKrli5jlnY7noI3nnIvlurfmhbfns6DmiZvmipfkuqLngpXogIPmi7fng6TpnaDlnbfoi5vmn6/mo7Xno5Xpopfnp5Hlo7PlkrPlj6/muLTlhYvliLvlrqLor77ogq/llYPlnqbmgbPlnZHlkK3nqbrmgZDlrZTmjqfmiqDlj6PmiaPlr4fmnq/lk63nqp/oi6bphbflupPoo6TlpLjlnq7mjI7ot6jog6/lnZfnrbfkvqnlv6vlrr3mrL7ljKHnrZDni4LmoYbnn7/nnLbml7flhrXkuo/nm5Tlsr/nqqXokbXlpY7prYHlgoBcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMDQwXCIsXG5cdFx0XCLnuZ5cIixcblx0XHQzNSxcblx0XHRcIue6g1wiLFxuXHRcdDIzLFxuXHRcdFwi57qc57qd57qeXCJcblx0XSxcblx0W1xuXHRcdFwiYzA4MFwiLFxuXHRcdFwi57qu57q057q757q857uW57uk57us57u557yK57yQ57ye57y357y557y7XCIsXG5cdFx0Nixcblx0XHRcIue9g+e9hlwiLFxuXHRcdDksXG5cdFx0XCLnvZLnvZPppojmhKfmuoPlnaTmmIbmjYblm7Dmi6zmianlu5PpmJTlnoPmi4nllofonKHohYrovqPllabojrHmnaXotZbok53lqarmoI/mi6bnr67pmJHlhbDmvpzosLDmj73op4jmh5LnvIbng4Lmu6XnkIXmppTni7zlu4rpg47mnJfmtarmjZ7lirPniaLogIHkvazlp6Xpharng5nmtp3li5LkuZDpm7fpla3olb7no4rntK/lhKHlnpLmk4Logovnsbvms6rmo7HmpZ7lhrfljpjmoqjnioHpu47nr7Hni7jnprvmvJPnkIbmnY7ph4zpsqTnpLzojonojZTlkI/moJfkuL3ljonlirHnoL7ljobliKnlgojkvovkv5BcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMTQwXCIsXG5cdFx0XCLnvZbnvZnnvZvnvZznvZ3nvZ7nvaDnvaNcIixcblx0XHQ0LFxuXHRcdFwi572r572s572t572v572w572z57215722572357245726572757285729572/576A576CXCIsXG5cdFx0Nyxcblx0XHRcIue+i+e+jee+j1wiLFxuXHRcdDQsXG5cdFx0XCLnvpVcIixcblx0XHQ0LFxuXHRcdFwi576b576c576g576i576j576l576m576oXCIsXG5cdFx0Nixcblx0XHRcIue+sVwiXG5cdF0sXG5cdFtcblx0XHRcImMxODBcIixcblx0XHRcIue+s1wiLFxuXHRcdDQsXG5cdFx0XCLnvrrnvrvnvr7nv4Dnv4Lnv4Pnv4Tnv4bnv4fnv4jnv4nnv4vnv43nv49cIixcblx0XHQ0LFxuXHRcdFwi57+W57+X57+ZXCIsXG5cdFx0NSxcblx0XHRcIue/oue/o+eXoueri+eykuaypematuWKm+eSg+WTqeS/qeiBlOiOsui/numVsOW7ieaAnOa2n+W4mOaVm+iEuOmTvuaBi+eCvOe7g+eyruWHieaigeeyseiJr+S4pOi+humHj+aZvuS6ruiwheaSqeiBiuWDmueWl+eHjuWvpei+vea9puS6huaSgumVo+W7luaWmeWIl+ijgueDiOWKo+eMjueQs+ael+ejt+mcluS4tOmCu+mznua3i+WHm+i1geWQneaLjueOsuiPsembtum+hOmTg+S8tue+muWHjOeBtemZteWyremihuWPpuS7pOa6nOeQieamtOehq+mmj+eVmeWImOeYpOa1geafs+WFrem+meiBi+WSmeesvOeqv1wiXG5cdF0sXG5cdFtcblx0XHRcImMyNDBcIixcblx0XHRcIue/pOe/p+e/qOe/que/q+e/rOe/ree/r+e/sue/tFwiLFxuXHRcdDYsXG5cdFx0XCLnv73nv77nv7/ogILogIfogIjogInogIrogI7ogI/ogJHogJPogJrogJvogJ3ogJ7ogJ/ogKHogKPogKTogKtcIixcblx0XHQ1LFxuXHRcdFwi6ICy6IC06IC56IC66IC86IC+6IGA6IGB6IGE6IGF6IGH6IGI6IGJ6IGO6IGP6IGQ6IGR6IGT6IGV6IGW6IGXXCJcblx0XSxcblx0W1xuXHRcdFwiYzI4MFwiLFxuXHRcdFwi6IGZ6IGbXCIsXG5cdFx0MTMsXG5cdFx0XCLogatcIixcblx0XHQ1LFxuXHRcdFwi6IGyXCIsXG5cdFx0MTEsXG5cdFx0XCLpmoblnoTmi6LpmYfmpbzlqITmkILnr5PmvI/pmYvoiqbljaLpooXlupDngonmjrPljaTomY/psoHpupPnoozpnLLot6/otYLpub/mvZ7npoTlvZXpmYbmiK7pqbTlkJXpk53kvqPml4XlsaXlsaHnvJXomZHmsK/lvovnjofmu6Tnu7/ls6bmjJvlrarmu6bljbXkubHmjqDnlaXmiqHova7kvKbku5HmsqbnurborrrokJ3onrrnvZfpgLvplKPnrqnpqqHoo7jokL3mtJvpqobnu5zlpojpurvnjpvnoIHomoLpqazpqoLlmJvlkJfln4vkubDpuqbljZbov4johInnnpLpppLom67mu6HolJPmm7zmhaLmvKtcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMzQwXCIsXG5cdFx0XCLogb7ogoHogoLogoXogojogorogo1cIixcblx0XHQ1LFxuXHRcdFwi6IKU6IKV6IKX6IKZ6IKe6IKj6IKm6IKn6IKo6IKs6IKw6IKz6IK16IK26IK46IK56IK76IOF6IOHXCIsXG5cdFx0NCxcblx0XHRcIuiDj1wiLFxuXHRcdDYsXG5cdFx0XCLog5jog5/og6Dog6Log6Pog6bog67og7Xog7fog7nog7vog77og7/ohIDohIHohIPohITohIXohIfohIjohItcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMzgwXCIsXG5cdFx0XCLohIzohJXohJfohJnohJvohJzohJ3ohJ9cIixcblx0XHQxMixcblx0XHRcIuiEreiEruiEsOiEs+iEtOiEteiEt+iEuVwiLFxuXHRcdDQsXG5cdFx0XCLohL/osKnoipLojKvnm7LmsJPlv5nojr3njKvojIXplJrmr5vnn5vpk4blja/ojILlhpLluL3osozotLjkuYjnjqvmnprmooXphbbpnInnhaTmsqHnnInlqpLplYHmr4/nvo7mmKflr5Dlprnlqprpl6jpl7fku6zokIzokpnmqqznm5/plLDnjJvmoqblrZ/nnK/phprpnaHns5zov7fosJzlvKXnsbPnp5jop4Xms4zonJzlr4bluYLmo4nnnKDnu7XlhpXlhY3li4nlqKnnvIXpnaLoi5fmj4/nnoTol5Dnp5LmuLrlupnlppnolJHnga3msJHmir/nmr/mlY/mgq/pl73mmI7onp/puKPpk63lkI3lkb3osKzmkbhcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNDQwXCIsXG5cdFx0XCLohYBcIixcblx0XHQ1LFxuXHRcdFwi6IWH6IWJ6IWN6IWO6IWP6IWS6IWW6IWX6IWY6IWbXCIsXG5cdFx0NCxcblx0XHRcIuiFoeiFouiFo+iFpOiFpuiFqOiFquiFq+iFrOiFr+iFsuiFs+iFteiFtuiFt+iFuOiGgeiGg1wiLFxuXHRcdDQsXG5cdFx0XCLohonohovohozoho3oho7ohpDohpJcIixcblx0XHQ1LFxuXHRcdFwi6IaZ6Iaa6IaeXCIsXG5cdFx0NCxcblx0XHRcIuiGpOiGpVwiXG5cdF0sXG5cdFtcblx0XHRcImM0ODBcIixcblx0XHRcIuiGp+iGqeiGq1wiLFxuXHRcdDcsXG5cdFx0XCLohrRcIixcblx0XHQ1LFxuXHRcdFwi6Ia86Ia96Ia+6Ia/6IeE6IeF6IeH6IeI6IeJ6IeL6IeNXCIsXG5cdFx0Nixcblx0XHRcIuaRueiYkeaooeiGnOejqOaRqemtlOaKueacq+iOq+WiqOm7mOayq+a8oOWvnumZjOiwi+eJn+afkOaLh+eJoeS6qeWnhuavjeWik+aaruW5leWLn+aFleacqOebruedpueJp+ephuaLv+WTquWRkOmSoOmCo+WonOe6s+awluS5g+WltuiAkOWliOWNl+eUt+mavuWbiuaMoOiEkeaBvOmXuea3luWRoummgeWGheWrqeiDveWmrumck+WAquazpeWwvOaLn+S9oOWMv+iFu+mAhua6uuiUq+aLiOW5tOeivuaSteaNu+W/teWomOmFv+m4n+Wwv+aNj+iBguWtveWVrumViumVjea2heaCqOafoOeLnuWHneWugVwiXG5cdF0sXG5cdFtcblx0XHRcImM1NDBcIixcblx0XHRcIuiHlFwiLFxuXHRcdDE0LFxuXHRcdFwi6Iek6Iel6Iem6Ieo6Iep6Ier6IeuXCIsXG5cdFx0NCxcblx0XHRcIuiHtVwiLFxuXHRcdDUsXG5cdFx0XCLoh73oh7/oiIPoiIdcIixcblx0XHQ0LFxuXHRcdFwi6IiO6IiP6IiR6IiT6IiVXCIsXG5cdFx0NSxcblx0XHRcIuiIneiIoOiIpOiIpeiIpuiIp+iIqeiIruiIsuiIuuiIvOiIveiIv1wiXG5cdF0sXG5cdFtcblx0XHRcImM1ODBcIixcblx0XHRcIuiJgOiJgeiJguiJg+iJheiJhuiJiOiJiuiJjOiJjeiJjuiJkFwiLFxuXHRcdDcsXG5cdFx0XCLoiZnoiZvoiZzoiZ3oiZ7oiaBcIixcblx0XHQ3LFxuXHRcdFwi6Imp5oun5rOe54mb5omt6ZKu57q96IST5rWT5Yac5byE5aW05Yqq5oCS5aWz5pqW6JmQ55af5oyq5oem57Ov6K+65ZOm5qyn6bil5q606JeV5ZGV5YG25rKk5ZWq6La054is5biV5oCV55C25ouN5o6S54mM5b6Y5rmD5rS+5pSA5r2Y55uY56OQ55u855WU5Yik5Y+b5LmT5bqe5peB6ICq6IOW5oqb5ZKG5Yio54Ku6KKN6LeR5rOh5ZG46IOa5Z+56KO06LWU6Zmq6YWN5L2p5rKb5Za355uG56Cw5oqo54O55r6O5b2t6JOs5qOa56G856+36Iao5pyL6bmP5o2n56Kw5Z2v56CS6Zy55om55oqr5YqI55C15q+XXCJcblx0XSxcblx0W1xuXHRcdFwiYzY0MFwiLFxuXHRcdFwi6Imq6Imr6Ims6Imt6Imx6Im16Im26Im36Im46Im76Im86IqA6IqB6IqD6IqF6IqG6IqH6IqJ6IqM6IqQ6IqT6IqU6IqV6IqW6Iqa6Iqb6Iqe6Iqg6Iqi6Iqj6Iqn6Iqy6Iq16Iq26Iq66Iq76Iq86Iq/6IuA6IuC6IuD6IuF6IuG6IuJ6IuQ6IuW6IuZ6Iua6Iud6Iui6Iun6Iuo6Iup6Iuq6Ius6Iut6Iuu6Iuw6Iuy6Iuz6Iu16Iu26Iu4XCJcblx0XSxcblx0W1xuXHRcdFwiYzY4MFwiLFxuXHRcdFwi6Iu66Iu8XCIsXG5cdFx0NCxcblx0XHRcIuiMiuiMi+iMjeiMkOiMkuiMk+iMluiMmOiMmeiMnVwiLFxuXHRcdDksXG5cdFx0XCLojKnojKrojK7ojLDojLLojLfojLvojL3llaTohL7nlrLnmq7ljLnnl57lg7vlsYHoraznr4flgY/niYfpqpfpo5jmvILnk6LnpajmkofnnqXmi7zpopHotKvlk4HogZjkuZLlnaroi7nokI3lubPlh63nk7bor4TlsY/lnaHms7zpooflqYbnoLTprYTov6vnspXliZbmiZHpk7rku4bojobokaHoj6nokrLln5TmnLTlnIPmma7mtabosLHmm53ngJHmnJ/mrLrmoJbmiJrlprvkuIPlh4TmvIbmn5Lmso/lhbbmo4vlpYfmrafnlabltI7ohJDpvZDml5fnpYjnpYHpqpHotbflsoLkuZ7kvIHlkK/lpZHnoIzlmajmsJTov4TlvIPmsb3ms6PorqvmjpBcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNzQwXCIsXG5cdFx0XCLojL7ojL/ojYHojYLojYTojYXojYjojYpcIixcblx0XHQ0LFxuXHRcdFwi6I2T6I2VXCIsXG5cdFx0NCxcblx0XHRcIuiNneiNouiNsFwiLFxuXHRcdDYsXG5cdFx0XCLojbnojbrojb5cIixcblx0XHQ2LFxuXHRcdFwi6I6H6I6I6I6K6I6L6I6M6I6N6I6P6I6Q6I6R6I6U6I6V6I6W6I6X6I6Z6I6a6I6d6I6f6I6hXCIsXG5cdFx0Nixcblx0XHRcIuiOrOiOreiOrlwiXG5cdF0sXG5cdFtcblx0XHRcImM3ODBcIixcblx0XHRcIuiOr+iOteiOu+iOvuiOv+iPguiPg+iPhOiPhuiPiOiPieiPi+iPjeiPjuiPkOiPkeiPkuiPk+iPleiPl+iPmeiPmuiPm+iPnuiPouiPo+iPpOiPpuiPp+iPqOiPq+iPrOiPreaBsOa0veeJteaJpumSjumTheWNg+i/geetvuS7n+iwpuS5vum7lOmSsemSs+WJjea9nOmBo+a1heiwtOWgkeW1jOasoOatieaequWRm+iFlOe+jOWimeiUt+W8uuaKouaph+mUueaVsuaChOahpeeep+S5lOS+qOW3p+memOaSrOe/mOWzreS/j+eqjeWIh+iMhOS4lOaAr+eqg+mSpuS+teS6suenpueQtOWLpOiKueaTkuemveWvneaygemdkui9u+awouWAvuWNv+a4heaTjuaZtOawsOaDhemht+ivt+W6hueQvOept+eni+S4mOmCseeQg+axguWbmumFi+azhei2i+WMuuibhuabsui6r+WxiOmpsea4oFwiXG5cdF0sXG5cdFtcblx0XHRcImM4NDBcIixcblx0XHRcIuiPruiPr+iPs1wiLFxuXHRcdDQsXG5cdFx0XCLoj7roj7voj7zoj77oj7/okIDokILokIXokIfokIjokInokIrokJDokJJcIixcblx0XHQ1LFxuXHRcdFwi6JCZ6JCa6JCb6JCeXCIsXG5cdFx0NSxcblx0XHRcIuiQqVwiLFxuXHRcdDcsXG5cdFx0XCLokLJcIixcblx0XHQ1LFxuXHRcdFwi6JC56JC66JC76JC+XCIsXG5cdFx0Nyxcblx0XHRcIuiRh+iRiOiRiVwiXG5cdF0sXG5cdFtcblx0XHRcImM4ODBcIixcblx0XHRcIuiRilwiLFxuXHRcdDYsXG5cdFx0XCLokZJcIixcblx0XHQ0LFxuXHRcdFwi6JGY6JGd6JGe6JGf6JGg6JGi6JGkXCIsXG5cdFx0NCxcblx0XHRcIuiRquiRruiRr+iRsOiRsuiRtOiRt+iRueiRu+iRvOWPluWotum+i+i2o+WOu+WciOmip+adg+mGm+azieWFqOeXiuaLs+eKrOWIuOWKnee8uueClOeYuOWNtOm5iuamt+ehrumbgOijmee+pOeEtueHg+WGieafk+eTpOWjpOaUmOWat+iuqemltuaJsOe7leaDueeDreWjrOS7geS6uuW/jemfp+S7u+iupOWIg+Wmiue6q+aJlOS7jeaXpeaIjuiMuOiTieiNo+iejeeGlOa6tuWuuee7kuWGl+aPieaflOiCieiMueigleWEkuWtuuWmgui+seS5s+axneWFpeikpei9r+mYruiViueRnumUkOmXsOa2puiLpeW8seaSkua0kuiQqOiFrumzg+Whnui1m+S4ieWPgVwiXG5cdF0sXG5cdFtcblx0XHRcImM5NDBcIixcblx0XHRcIuiRvVwiLFxuXHRcdDQsXG5cdFx0XCLokoPokoTokoXokobokoroko3oko9cIixcblx0XHQ3LFxuXHRcdFwi6JKY6JKa6JKb6JKd6JKe6JKf6JKg6JKiXCIsXG5cdFx0MTIsXG5cdFx0XCLokrDokrHokrPokrXokrbokrfokrvokrzokr7ok4Dok4Lok4Pok4Xok4bok4fok4jok4vok4zok47ok4/ok5Lok5Tok5Xok5dcIlxuXHRdLFxuXHRbXG5cdFx0XCJjOTgwXCIsXG5cdFx0XCLok5hcIixcblx0XHQ0LFxuXHRcdFwi6JOe6JOh6JOi6JOk6JOnXCIsXG5cdFx0NCxcblx0XHRcIuiTreiTruiTr+iTsVwiLFxuXHRcdDEwLFxuXHRcdFwi6JO96JO+6JSA6JSB6JSC5Lye5pWj5qGR5ZeT5Lin5pCU6aqa5omr5auC55Gf6Imy5rap5qOu5YOn6I6O56CC5p2A5Yi55rKZ57qx5YK75ZWl54We562b5pmS54+K6Iur5p2J5bGx5Yig54W96KGr6Zeq6ZmV5pOF6LWh6Iaz5ZaE5rGV5omH57yu5aKS5Lyk5ZWG6LWP5pmM5LiK5bCa6KOz5qKi5o2O56iN54On6IqN5Yu66Z+25bCR5ZOo6YK157uN5aWi6LWK6JuH6IiM6IiN6LWm5pGE5bCE5oWR5raJ56S+6K6+56C355Sz5ZG75Ly46Lqr5rex5aig57uF56We5rKI5a6h5am255Sa6IK+5oWO5riX5aOw55Sf55Sl54my5Y2H57uzXCJcblx0XSxcblx0W1xuXHRcdFwiY2E0MFwiLFxuXHRcdFwi6JSDXCIsXG5cdFx0OCxcblx0XHRcIuiUjeiUjuiUj+iUkOiUkuiUlOiUleiUluiUmOiUmeiUm+iUnOiUneiUnuiUoOiUolwiLFxuXHRcdDgsXG5cdFx0XCLolK1cIixcblx0XHQ5LFxuXHRcdFwi6JS+XCIsXG5cdFx0NCxcblx0XHRcIuiVhOiVheiVhuiVh+iVi1wiLFxuXHRcdDEwXG5cdF0sXG5cdFtcblx0XHRcImNhODBcIixcblx0XHRcIuiVl+iVmOiVmuiVm+iVnOiVneiVn1wiLFxuXHRcdDQsXG5cdFx0XCLolaXolabolafolalcIixcblx0XHQ4LFxuXHRcdFwi6JWz6JW16JW26JW36JW46JW86JW96JW/6JaA6JaB55yB55ub5Ymp6IOc5Zyj5biI5aSx54uu5pa95rm/6K+X5bC46Jmx5Y2B55+z5ou+5pe25LuA6aOf6JqA5a6e6K+G5Y+y55+i5L2/5bGO6am25aeL5byP56S65aOr5LiW5p+/5LqL5out6KqT6YCd5Yq/5piv5Zec5Zms6YCC5LuV5L6N6YeK6aWw5rCP5biC5oGD5a6k6KeG6K+V5pS25omL6aaW5a6I5a+/5o6I5ZSu5Y+X55im5YW96JSs5p6i5qKz5q6K5oqS6L6T5Y+U6IiS5reR55aP5Lmm6LWO5a2w54af6Jav5pqR5puZ572y6JyA6buN6byg5bGe5pyv6L+w5qCR5p2f5oiN56uW5aKF5bq25pWw5ryxXCJcblx0XSxcblx0W1xuXHRcdFwiY2I0MFwiLFxuXHRcdFwi6JaC6JaD6JaG6JaIXCIsXG5cdFx0Nixcblx0XHRcIuiWkFwiLFxuXHRcdDEwLFxuXHRcdFwi6JadXCIsXG5cdFx0Nixcblx0XHRcIuiWpeiWpuiWp+iWqeiWq+iWrOiWreiWsVwiLFxuXHRcdDUsXG5cdFx0XCLolrjolrpcIixcblx0XHQ2LFxuXHRcdFwi6JeCXCIsXG5cdFx0Nixcblx0XHRcIuiXilwiLFxuXHRcdDQsXG5cdFx0XCLol5Hol5JcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYjgwXCIsXG5cdFx0XCLol5Tol5ZcIixcblx0XHQ1LFxuXHRcdFwi6JedXCIsXG5cdFx0Nixcblx0XHRcIuiXpeiXpuiXp+iXqOiXqlwiLFxuXHRcdDE0LFxuXHRcdFwi5oGV5Yi36ICN5pGU6KGw55Sp5biF5qCT5ou06Zyc5Y+M54i96LCB5rC0552h56iO5ZCu556s6aG66Iic6K+056GV5pyU54OB5pav5pKV5Zi25oCd56eB5Y+45Lid5q276IKG5a+65Zej5Zub5Ly65Ly86aWy5bez5p2+6IC45oCC6aKC6YCB5a6L6K686K+15pCc6ImY5pOe5Ze96IuP6YWl5L+X57Sg6YCf57Kf5YOz5aGR5rqv5a6/6K+J6IKD6YW46JKc566X6Jm96ZqL6ZqP57ul6auT56KO5bKB56mX6YGC6Zqn56Wf5a2Z5o2f56yL6JOR5qKt5ZSG57yp55CQ57Si6ZSB5omA5aGM5LuW5a6D5aW55aGUXCJcblx0XSxcblx0W1xuXHRcdFwiY2M0MFwiLFxuXHRcdFwi6Je56Je66Je86Je96Je+6JiAXCIsXG5cdFx0NCxcblx0XHRcIuiYhlwiLFxuXHRcdDEwLFxuXHRcdFwi6JiS6JiT6JiU6JiV6JiXXCIsXG5cdFx0MTUsXG5cdFx0XCLomKjomKpcIixcblx0XHQxMyxcblx0XHRcIuiYueiYuuiYu+iYveiYvuiYv+iZgFwiXG5cdF0sXG5cdFtcblx0XHRcImNjODBcIixcblx0XHRcIuiZgVwiLFxuXHRcdDExLFxuXHRcdFwi6JmS6JmT6JmVXCIsXG5cdFx0NCxcblx0XHRcIuiZm+iZnOiZneiZn+iZoOiZoeiZo1wiLFxuXHRcdDcsXG5cdFx0XCLnja3mjJ7ouYvouI/og47oi5Tmiqzlj7Dms7DphZ7lpKrmgIHmsbDlnY3mkYrotKrnmKvmu6nlnZvmqoDnl7Dmva3osK3osIjlnabmr6/oopLnorPmjqLlj7nngq3msaTloZjmkKrloILmo6DohpvllJDns5blgJjourrmt4zotp/ng6vmjo/mtpvmu5Tnu6bokITmoYPpgIPmt5jpmbborqjlpZfnibnol6Tohb7nlrzoqormoq/liZTouKLplJHmj5DpopjouYTllbzkvZPmm7/lmo/mg5XmtpXliYPlsYnlpKnmt7vloavnlLDnlJzmgazoiJTohYbmjJHmnaHov6LnnLrot7PotLTpk4HluJbljoXlkKzng4NcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZDQwXCIsXG5cdFx0XCLoma3oma/ombDombJcIixcblx0XHQ2LFxuXHRcdFwi6JqDXCIsXG5cdFx0Nixcblx0XHRcIuiajlwiLFxuXHRcdDQsXG5cdFx0XCLompTompZcIixcblx0XHQ1LFxuXHRcdFwi6JqeXCIsXG5cdFx0NCxcblx0XHRcIuiapeiapuiaq+iareiaruiasuias+iat+iauOiaueiau1wiLFxuXHRcdDQsXG5cdFx0XCLom4Hom4Lom4Pom4Xom4jom4zom43om5Lom5Pom5Xom5bom5fom5rom5xcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZDgwXCIsXG5cdFx0XCLom53om6Dom6Hom6Lom6Pom6Xom6bom6fom6jom6rom6vom6zom6/om7Xom7bom7fom7rom7vom7zom73om7/onIHonITonIXonIbonIvonIzonI7onI/onJDonJHonJTonJbmsYDlu7flgZzkuq3luq3mjLroiYfpgJrmoZDpha7nnrPlkIzpk5zlvaTnq6XmobbmjYXnrZLnu5/nl5vlgbfmipXlpLTpgI/lh7jnp4PnqoHlm77lvpLpgJTmtoLlsaDlnJ/lkJDlhZTmuY3lm6LmjqjpopPohb/onJXopKrpgIDlkJ7lsa/oh4Dmi5bmiZjohLHpuLXpmYDpqa7pqbzmpK3lpqXmi5PllL7mjJblk4fom5nmtLzlqIPnk6boopzmrarlpJbosYzlvK/mub7njqnpob3kuLjng7flroznopfmjL3mmZrnmpbmg4vlrpvlqYnkuIfohZXmsarnjovkuqHmnonnvZHlvoDml7rmnJvlv5jlpoTlqIFcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZTQwXCIsXG5cdFx0XCLonJnonJvonJ3onJ/onKDonKTonKbonKfonKjonKronKvonKzonK3onK/onLDonLLonLPonLXonLbonLjonLnonLronLzonL3onYBcIixcblx0XHQ2LFxuXHRcdFwi6J2K6J2L6J2N6J2P6J2Q6J2R6J2S6J2U6J2V6J2W6J2Y6J2aXCIsXG5cdFx0NSxcblx0XHRcIuidoeidouidplwiLFxuXHRcdDcsXG5cdFx0XCLona/onbHonbLonbPonbVcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZTgwXCIsXG5cdFx0XCLonbfonbjonbnonbronb/onoDonoHonoTonobonofonononoronozono5cIixcblx0XHQ0LFxuXHRcdFwi6J6U6J6V6J6W6J6YXCIsXG5cdFx0Nixcblx0XHRcIuieoFwiLFxuXHRcdDQsXG5cdFx0XCLlt43lvq7ljbHpn6bov53moYXlm7TllK/mg5/kuLrmvY3nu7Toi4fokI7lp5TkvJ/kvKrlsL7nuqzmnKrolJrlkbPnlY/og4PlloLprY/kvY3muK3osJPlsInmhbDljavnmJ/muKnomormlofpl7vnurnlkLvnqLPntIrpl67ll6Hnv4Hnk67mjJ3onJfmtqHnqp3miJHmlqHljafmj6HmsoPlt6vlkZzpkqjkuYzmsaHor6zlsYvml6DoipzmoqflkL7lkLTmr4vmrabkupTmjYLljYjoiJ7kvI3kvq7lnZ7miIrpm77mmaTnianli7/liqHmgp/or6/mmJTnhpnmnpDopb/noZLnn73mmbDlmLvlkLjplKHnibpcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZjQwXCIsXG5cdFx0XCLonqXonqbonqfonqnonqronq7onrDonrHonrLonrTonrbonrfonrjonrnonrvonrzonr7onr/on4FcIixcblx0XHQ0LFxuXHRcdFwi6J+H6J+I6J+J6J+MXCIsXG5cdFx0NCxcblx0XHRcIuiflFwiLFxuXHRcdDYsXG5cdFx0XCLon5zon53on57on5/on6Hon6Lon6Pon6Ton6bon6fon6jon6non6von6zon63on69cIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcImNmODBcIixcblx0XHRcIuifuuifu+ifvOifveifv+iggOiggeigguighFwiLFxuXHRcdDUsXG5cdFx0XCLooItcIixcblx0XHQ3LFxuXHRcdFwi6KCU6KCX6KCY6KCZ6KCa6KCcXCIsXG5cdFx0NCxcblx0XHRcIuigo+eogOaBr+W4jOaCieiGneWkleaDnOeGhOeDr+a6quaxkOeKgOaqhOiireW4reS5oOWqs+WWnOmTo+a0l+ezu+mameaIj+e7hueejuiZvuWMo+mcnui+luaah+WzoeS+oOeLreS4i+WOpuWkj+WQk+aOgOmUqOWFiOS7memynOe6pOWSuOi0pOihlOiIt+mXsua2juW8puWrjOaYvumZqeeOsOeMruWOv+iFuummhee+oeWuqumZt+mZkOe6v+ebuOWOoumVtummmeeuseilhOa5mOS5oee/lOelpeivpuaDs+WTjeS6q+mhueW3t+apoeWDj+WQkeixoeiQp+ehnemchOWJiuWTruWao+mUgOa2iOWutea3huaZk1wiXG5cdF0sXG5cdFtcblx0XHRcImQwNDBcIixcblx0XHRcIuigpFwiLFxuXHRcdDEzLFxuXHRcdFwi6KCzXCIsXG5cdFx0NSxcblx0XHRcIuiguuigu+igveigvuigv+ihgeihguihg+ihhlwiLFxuXHRcdDUsXG5cdFx0XCLooY5cIixcblx0XHQ1LFxuXHRcdFwi6KGV6KGW6KGY6KGaXCIsXG5cdFx0Nixcblx0XHRcIuihpuihp+ihquihreihr+ihseihs+ihtOihteihtuihuOihueihulwiXG5cdF0sXG5cdFtcblx0XHRcImQwODBcIixcblx0XHRcIuihu+ihvOiigOiig+iihuiih+iiieiiiuiijOiijuiij+iikOiikeiik+iilOiileiil1wiLFxuXHRcdDQsXG5cdFx0XCLoop1cIixcblx0XHQ0LFxuXHRcdFwi6KKj6KKlXCIsXG5cdFx0NSxcblx0XHRcIuWwj+WtneagoeiCluWVuOeskeaViOallOS6m+ath+idjumei+WNj+aMn+aQuumCquaWnOiDgeiwkOWGmeaisOWNuOifueaHiOazhOazu+iwouWxkeiWquiKr+mUjOaso+i+m+aWsOW/u+W/g+S/oeihheaYn+iFpeeMqeaDuuWFtOWIkeWei+W9oumCouihjOmGkuW5uOadj+aAp+Wnk+WFhOWHtuiDuOWMiOaxuembhOeGiuS8keS/rue+nuacveWXhemUiOengOiilue7o+Win+aIjOmcgOiZmuWYmOmhu+W+kOiuuOiThOmFl+WPmeaXreW6j+eVnOaBpOe1ruWpv+e7que7rei9qeWWp+Wuo+aCrOaXi+eOhFwiXG5cdF0sXG5cdFtcblx0XHRcImQxNDBcIixcblx0XHRcIuiirOiiruiir+iisOiislwiLFxuXHRcdDQsXG5cdFx0XCLoorjoornoorroorvoor3oor7oor/oo4Doo4Poo4Too4foo4joo4roo4voo4zoo43oo4/oo5Doo5Hoo5Poo5boo5foo5pcIixcblx0XHQ0LFxuXHRcdFwi6KOg6KOh6KOm6KOn6KOpXCIsXG5cdFx0Nixcblx0XHRcIuijsuijteijtuijt+ijuuiju+ijveijv+ikgOikgeikg1wiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiZDE4MFwiLFxuXHRcdFwi6KSJ6KSLXCIsXG5cdFx0NCxcblx0XHRcIuikkeiklFwiLFxuXHRcdDQsXG5cdFx0XCLopJxcIixcblx0XHQ0LFxuXHRcdFwi6KSi6KSj6KSk6KSm6KSn6KSo6KSp6KSs6KSt6KSu6KSv6KSx6KSy6KSz6KS16KS36YCJ55mj55yp57ua6Z206Jab5a2m56m06Zuq6KGA5YuL54aP5b6q5pes6K+i5a+76amv5beh5q6J5rGb6K6t6K6v6YCK6L+F5Y6L5oq86bim6bit5ZGA5Lir6Iq954mZ6Jqc5bSW6KGZ5rav6ZuF5ZOR5Lqa6K6254SJ5ZK96ZiJ54Of5re555uQ5Lil56CU6JyS5bKp5bu26KiA6aKc6ZiO54KO5rK/5aWE5o6p55y86KGN5ryU6Imz5aCw54eV5Y6M56Ca6ZuB5ZSB5b2m54Sw5a606LCa6aqM5q6D5aSu6biv56en5p2o5oms5L2v55ah576K5rSL6Ziz5rCn5Luw55eS5YW75qC35ry+6YKA6IWw5aaW55G2XCJcblx0XSxcblx0W1xuXHRcdFwiZDI0MFwiLFxuXHRcdFwi6KS4XCIsXG5cdFx0OCxcblx0XHRcIuilguilg+ilhVwiLFxuXHRcdDI0LFxuXHRcdFwi6KWgXCIsXG5cdFx0NSxcblx0XHRcIuilp1wiLFxuXHRcdDE5LFxuXHRcdFwi6KW8XCJcblx0XSxcblx0W1xuXHRcdFwiZDI4MFwiLFxuXHRcdFwi6KW96KW+6KaA6KaC6KaE6KaF6KaHXCIsXG5cdFx0MjYsXG5cdFx0XCLmkYflsKfpgaXnqpHosKPlp5rlkqzoiIDoja/opoHogIDmpLDlmY7ogLbniLfph47lhrbkuZ/pobXmjpbkuJrlj7bmm7PohYvlpJzmtrLkuIDlo7nljLvmj5bpk7Hkvp3kvIrooaPpopDlpLfpgZfnp7vku6rog7DnlpHmsoLlrpzlp6jlvZ3mpIXomoHlgJrlt7LkuZnnn6Pku6XoibrmipHmmJPpgpHlsbnkur/lvbnoh4bpgLjogoTnlqvkuqboo5TmhI/mr4Xlv4bkuYnnm4rmuqLor6Porq7osIror5HlvILnv7znv4znu47ojLXojavlm6Dmrrfpn7PpmLTlp7vlkJ/pk7bmt6vlr4Xppa7lsLnlvJXpmpBcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMzQwXCIsXG5cdFx0XCLopqJcIixcblx0XHQzMCxcblx0XHRcIuing+injeink+inlOinleinl+inmOinmeinm+inneinn+inoOinoeinouinpOinp+inqOinqeinquinrOinreinruinsOinseinsuintFwiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiZDM4MFwiLFxuXHRcdFwi6Ke7XCIsXG5cdFx0NCxcblx0XHRcIuiogVwiLFxuXHRcdDUsXG5cdFx0XCLoqIhcIixcblx0XHQyMSxcblx0XHRcIuWNsOiLseaoseWptOm5sOW6lOe8qOiOueiQpOiQpeiNp+idh+i/jui1ouebiOW9semiluehrOaYoOWTn+aLpeS9o+iHg+eXiOW6uOmbjei4iuibueWSj+azs+a2jOawuOaBv+WLh+eUqOW5veS8mOaCoOW/p+WwpOeUsemCrumTgOeKueayuea4uOmFieacieWPi+WPs+S9kemHieivseWPiOW5vOi/gua3pOS6juebguamhuiZnuaEmuiIhuS9meS/numAvumxvOaEiea4nea4lOmaheS6iOWosembqOS4juWxv+emueWuh+ivree+veeOieWfn+iKi+mDgeWQgemBh+WWu+WzquW+oeaEiOassueLseiCsuiqiVwiXG5cdF0sXG5cdFtcblx0XHRcImQ0NDBcIixcblx0XHRcIuionlwiLFxuXHRcdDMxLFxuXHRcdFwi6Ki/XCIsXG5cdFx0OCxcblx0XHRcIuipiVwiLFxuXHRcdDIxXG5cdF0sXG5cdFtcblx0XHRcImQ0ODBcIixcblx0XHRcIuipn1wiLFxuXHRcdDI1LFxuXHRcdFwi6Km6XCIsXG5cdFx0Nixcblx0XHRcIua1tOWvk+ijlemihOixq+mprem4s+a4iuWGpOWFg+Weo+iigeWOn+aPtOi+leWbreWRmOWchueMv+a6kOe8mOi/nOiLkeaEv+aAqOmZouabsOe6pui2iui3g+mSpeWys+eypOaciOaCpumYheiAmOS6kemDp+WMgOmZqOWFgei/kOiVtOmFneaZlemfteWtleWMneeguOadguagveWTieeBvuWusOi9veWGjeWcqOWSseaUkuaagui1nui1g+iEj+iRrOmBreezn+WHv+iXu+aeo+aXqea+oeiapOi6geWZqumAoOeagueBtueHpei0o+aLqeWImeazvei0vOaAjuWinuaGjuabvui1oOaJjuWWs+a4o+acrei9p1wiXG5cdF0sXG5cdFtcblx0XHRcImQ1NDBcIixcblx0XHRcIuiqgVwiLFxuXHRcdDcsXG5cdFx0XCLoqotcIixcblx0XHQ3LFxuXHRcdFwi6KqUXCIsXG5cdFx0NDZcblx0XSxcblx0W1xuXHRcdFwiZDU4MFwiLFxuXHRcdFwi6KuDXCIsXG5cdFx0MzIsXG5cdFx0XCLpk6Hpl7jnnKjmoIXmpqjlkovkuY3ngrjor4jmkZjmlovlroXnqoTlgLrlr6jnnrvmr6Hoqbnnspjmsr7nm4/mlqnovpfltK3lsZXomLjmoIjljaDmiJjnq5nmuZvnu73mqJ/nq6DlvbDmvLPlvKDmjozmtqjmnZbkuIjluJDotKbku5fog4DnmLTpmpzmi5vmmK3mib7msrzotbXnhafnvanlhYbogoflj6zpga7mipjlk7Lom7DovpnogIXplJfolJfov5nmtZnnj43mlp/nnJ/nlITnoKfoh7votJ7pkojkvqbmnpXnlrnor4rpnIfmjK/plYfpmLXokrjmjKPnnYHlvoHni7DkuonmgJTmlbTmi6/mraPmlL9cIlxuXHRdLFxuXHRbXG5cdFx0XCJkNjQwXCIsXG5cdFx0XCLoq6RcIixcblx0XHQzNCxcblx0XHRcIuisiFwiLFxuXHRcdDI3XG5cdF0sXG5cdFtcblx0XHRcImQ2ODBcIixcblx0XHRcIuispOispeisp1wiLFxuXHRcdDMwLFxuXHRcdFwi5bin55eH6YOR6K+B6Iqd5p6d5pSv5ZCx6JyY55+l6IKi6ISC5rGB5LmL57uH6IGM55u05qSN5q6W5omn5YC85L6E5Z2A5oyH5q2i6La+5Y+q5peo57q45b+X5oya5o636Iez6Ie0572u5bic5bOZ5Yi25pm656ep56ia6LSo54KZ55eU5rue5rK756qS5Lit55uF5b+g6ZKf6KG357uI56eN6IK/6YeN5Luy5LyX6Iif5ZGo5bee5rSy6K+M57Kl6L206IKY5bia5ZKS55qx5a6Z5pi86aqk54+g5qCq6Jub5pyx54yq6K+46K+b6YCQ56u554Ob54Wu5ouE556p5Zix5Li76JGX5p+x5Yqp6JuA6LSu6ZO4562RXCJcblx0XSxcblx0W1xuXHRcdFwiZDc0MFwiLFxuXHRcdFwi6K2GXCIsXG5cdFx0MzEsXG5cdFx0XCLoradcIixcblx0XHQ0LFxuXHRcdFwi6K2tXCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiZDc4MFwiLFxuXHRcdFwi6K6HXCIsXG5cdFx0MjQsXG5cdFx0XCLorqzorrHorrvor4for5Dor6rosInosJ7kvY/ms6jnpZ3pqbvmipPniKrmi73kuJPnoJbovazmkrDotZrnr4bmoanluoToo4Xlpobmkp7lo67nirbmpI7plKXov73otZjlnaDnvIDosIblh4bmjYnmi5nljZPmoYznkKLojIHphYzllYTnnYDngbzmtYrlhbnlkqjotYTlp7/mu4vmt4TlrZzntKvku5Tnsb3mu5PlrZDoh6rmuI3lrZfprIPmo5XouKrlrpfnu7zmgLvnurXpgrnotbDlpY/mj43np5/otrPljZLml4/npZbor4XpmLvnu4TpkrvnuoLlmLTphonmnIDnvarlsIrpgbXmmKjlt6bkvZDmn57lgZrkvZzlnZDluqdcIlxuXHRdLFxuXHRbXG5cdFx0XCJkODQwXCIsXG5cdFx0XCLosLhcIixcblx0XHQ4LFxuXHRcdFwi6LGC6LGD6LGE6LGF6LGI6LGK6LGL6LGNXCIsXG5cdFx0Nyxcblx0XHRcIuixluixl+ixmOixmeixm1wiLFxuXHRcdDUsXG5cdFx0XCLosaNcIixcblx0XHQ2LFxuXHRcdFwi6LGsXCIsXG5cdFx0Nixcblx0XHRcIuixtOixteixtuixt+ixu1wiLFxuXHRcdDYsXG5cdFx0XCLosoPosoTosobosodcIlxuXHRdLFxuXHRbXG5cdFx0XCJkODgwXCIsXG5cdFx0XCLosojosovoso1cIixcblx0XHQ2LFxuXHRcdFwi6LKV6LKW6LKX6LKZXCIsXG5cdFx0MjAsXG5cdFx0XCLkuo3kuIzlhYDkuJDlu7/ljYXkuJXkupjkuJ7prLLlrazlmankuKjnprrkuL/ljJXkuYflpK3niLvlja7msJDlm5/og6Tpppfmr5Pnnb7pvJfkuLbkup/pvJDkuZzkuankupPoiojlrZvllazlmI/ku4Tljo3ljp3ljqPljqXljq7pnaXotZ3ljJrlj7XljKbljK7ljL7otZzljabljaPliILliIjliI7liK3liLPliL/liYDliYzliZ7liaHliZzokq/lib3lioLlioHlipDlipPlhoLnvZTkurvku4Pku4nku4Lku6jku6Hku6vku57kvJvku7PkvKLkvaTku7XkvKXkvKfkvInkvKvkvZ7kvafmlLjkvZrkvZ1cIlxuXHRdLFxuXHRbXG5cdFx0XCJkOTQwXCIsXG5cdFx0XCLosq5cIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJkOTgwXCIsXG5cdFx0XCLos61cIixcblx0XHQzMixcblx0XHRcIuS9n+S9l+S8suS8veS9tuS9tOS+keS+ieS+g+S+j+S9vuS9u+S+quS9vOS+rOS+lOS/puS/qOS/quS/heS/muS/o+S/nOS/keS/n+S/uOWAqeWBjOS/s+WArOWAj+WAruWAreS/vuWAnOWAjOWApeWAqOWBvuWBg+WBleWBiOWBjuWBrOWBu+WCpeWCp+WCqeWCuuWDluWEhuWDreWDrOWDpuWDruWEh+WEi+S7neawveS9mOS9peS/jum+oOaxhuextOWFruW3vem7iemmmOWGgeWklOWLueWMjeioh+WMkOWHq+WkmeWFleS6oOWFluS6s+ihruiipOS6teiElOijkuemgOWstOigg+e+uOWGq+WGseWGveWGvFwiXG5cdF0sXG5cdFtcblx0XHRcImRhNDBcIixcblx0XHRcIui0jlwiLFxuXHRcdDE0LFxuXHRcdFwi6LSg6LWR6LWS6LWX6LWf6LWl6LWo6LWp6LWq6LWs6LWu6LWv6LWx6LWy6LW4XCIsXG5cdFx0OCxcblx0XHRcIui2gui2g+i2hui2h+i2iOi2iei2jFwiLFxuXHRcdDQsXG5cdFx0XCLotpLotpPotpVcIixcblx0XHQ5LFxuXHRcdFwi6Lag6LahXCJcblx0XSxcblx0W1xuXHRcdFwiZGE4MFwiLFxuXHRcdFwi6Lai6LakXCIsXG5cdFx0MTIsXG5cdFx0XCLotrLotrbotrfotrnotrvotr3ot4Dot4Hot4Lot4Xot4fot4jot4not4rot43ot5Dot5Lot5Pot5Tlh4flhpblhqLlhqXorqDorqborqforqrorrTorrXorrfor4Lor4Por4vor4/or47or5Lor5Por5Tor5bor5jor5nor5zor5/or6Dor6Tor6jor6nor67or7Dor7Por7bor7nor7zor7/osIDosILosITosIfosIzosI/osJHosJLosJTosJXosJbosJnosJvosJjosJ3osJ/osKDosKHosKXosKfosKrosKvosK7osK/osLLosLPosLXosLbljanljbrpmJ3pmKLpmKHpmLHpmKrpmL3pmLzpmYLpmYnpmZTpmZ/pmafpmazpmbLpmbTpmojpmo3pmpfpmrDpgpfpgpvpgp3pgpnpgqzpgqHpgrTpgrPpgrbpgrpcIlxuXHRdLFxuXHRbXG5cdFx0XCJkYjQwXCIsXG5cdFx0XCLot5Xot5jot5not5zot6Dot6Hot6Lot6Xot6bot6fot6not63ot67ot7Dot7Hot7Lot7Tot7bot7zot75cIixcblx0XHQ2LFxuXHRcdFwi6LiG6LiH6LiI6LiL6LiN6LiO6LiQ6LiR6LiS6LiT6LiVXCIsXG5cdFx0Nyxcblx0XHRcIui4oOi4oei4pFwiLFxuXHRcdDQsXG5cdFx0XCLouKvouK3ouLDouLLouLPouLTouLbouLfouLjouLvouLzouL5cIlxuXHRdLFxuXHRbXG5cdFx0XCJkYjgwXCIsXG5cdFx0XCLouL/ouYPouYXouYbouYxcIixcblx0XHQ0LFxuXHRcdFwi6LmTXCIsXG5cdFx0NSxcblx0XHRcIui5mlwiLFxuXHRcdDExLFxuXHRcdFwi6Lmn6Lmo6Lmq6Lmr6Lmu6Lmx6YK46YKw6YOP6YOF6YK+6YOQ6YOE6YOH6YOT6YOm6YOi6YOc6YOX6YOb6YOr6YOv6YO+6YSE6YSi6YSe6YSj6YSx6YSv6YS56YWD6YWG5YiN5aWC5Yqi5Yqs5Yqt5Yq+5ZO/5YuQ5YuW5Yuw5Y+f54eu55+N5bu05Ye15Ye86ayv5Y625byB55Wa5bev5Z2M5Z6p5Z6h5aG+5aK85aOF5aOR5Zyp5Zys5Zyq5Zyz5Zy55Zyu5Zyv5Z2c5Zy75Z2C5Z2p5Z6F5Z2r5Z6G5Z285Z275Z2o5Z2t5Z225Z2z5Z6t5Z6k5Z6M5Z6y5Z+P5Z6n5Z605Z6T5Z6g5Z+V5Z+Y5Z+a5Z+Z5Z+S5Z645Z+05Z+v5Z+45Z+k5Z+dXCJcblx0XSxcblx0W1xuXHRcdFwiZGM0MFwiLFxuXHRcdFwi6Lmz6Lm16Lm3XCIsXG5cdFx0NCxcblx0XHRcIui5vei5vui6gOi6gui6g+i6hOi6hui6iFwiLFxuXHRcdDYsXG5cdFx0XCLoupHoupLoupPoupVcIixcblx0XHQ2LFxuXHRcdFwi6Lqd6LqfXCIsXG5cdFx0MTEsXG5cdFx0XCLouq3ouq7ourDourHourNcIixcblx0XHQ2LFxuXHRcdFwi6Lq7XCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCJkYzgwXCIsXG5cdFx0XCLou4NcIixcblx0XHQxMCxcblx0XHRcIui7j1wiLFxuXHRcdDIxLFxuXHRcdFwi5aCL5aCN5Z+95Z+t5aCA5aCe5aCZ5aGE5aCg5aGl5aGs5aKB5aKJ5aKa5aKA6aao6byZ5oe/6Im56Im96Im/6IqP6IqK6Iqo6IqE6IqO6IqR6IqX6IqZ6Iqr6Iq46Iq+6Iqw6IuI6IuK6Iuj6IqY6Iq36Iqu6IuL6IuM6IuB6Iqp6Iq06Iqh6Iqq6Iqf6IuE6IuO6Iqk6Iuh6IyJ6Iu36Iuk6IyP6IyH6Iuc6Iu06IuS6IuY6IyM6Iu76IuT6IyR6Iya6IyG6IyU6IyV6Iug6IuV6Iyc6I2R6I2b6I2c6IyI6I6S6Iy86Iy06Iyx6I6b6I2e6Iyv6I2P6I2H6I2D6I2f6I2A6IyX6I2g6Iyt6Iy66Iyz6I2m6I2lXCJcblx0XSxcblx0W1xuXHRcdFwiZGQ0MFwiLFxuXHRcdFwi6LulXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZGQ4MFwiLFxuXHRcdFwi6LykXCIsXG5cdFx0MzIsXG5cdFx0XCLojajojJvojanojazojaroja3oja7ojrDojbjojrPojrTojqDojqrojpPojpzojoXojbzojrbojqnojb3ojrjojbvojpjojp7ojqjojrrojrzoj4HokIHoj6Xoj5jloIfokJjokIvoj53oj73oj5bokJzokLjokJHokIboj5Toj5/okI/okIPoj7joj7noj6roj4Xoj4DokKboj7Doj6HokZzokZHokZrokZnokbPokofokojokbrokonokbjokLzokYbokanokbbokozoko7okLHoka3ok4Hok43ok5Dok6bokr3ok5Pok4rokr/okrrok6DokqHokrnokrTokpfok6Xok6PolIznlI3olLjok7DolLnolJ/olLpcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZTQwXCIsXG5cdFx0XCLovYVcIixcblx0XHQzMixcblx0XHRcIui9qui+gOi+jOi+kui+nei+oOi+oei+oui+pOi+pei+pui+p+i+qui+rOi+rei+rui+r+i+sui+s+i+tOi+tei+t+i+uOi+uui+u+i+vOi+v+i/gOi/g+i/hlwiXG5cdF0sXG5cdFtcblx0XHRcImRlODBcIixcblx0XHRcIui/iVwiLFxuXHRcdDQsXG5cdFx0XCLov4/ov5Lov5bov5fov5rov6Dov6Hov6Pov6fov6zov6/ov7Hov7Lov7Tov7Xov7bov7rov7vov7zov77ov7/pgIfpgIjpgIzpgI7pgJPpgJXpgJjolZbolLvok7/ok7zolZnolYjolajolaTolZ7olbrnnqLolYPolbLolbvolqTolqjolofolo/olbnolq7olpzoloXolrnolrfolrDol5Pol4Hol5zol7/omKfomIXomKnomJbomLzlu77lvIjlpLzlpYHogLflpZXlpZrlpZjljI/lsKLlsKXlsKzlsLTmiYzmiarmip/mirvmi4rmi5rmi5fmi67mjKLmi7bmjLnmjYvmjYPmjq3mj7bmjbHmjbrmjo7mjrTmja3mjqzmjormjanmjq7mjrzmj7Lmj7jmj6Dmj7/mj4Tmj57mj47mkZLmj4bmjr7mkYXmkYHmkIvmkJvmkKDmkIzmkKbmkKHmkZ7mkoTmka3mkpZcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZjQwXCIsXG5cdFx0XCLpgJnpgJzpgKPpgKTpgKXpgKdcIixcblx0XHQ1LFxuXHRcdFwi6YCwXCIsXG5cdFx0NCxcblx0XHRcIumAt+mAuemAuumAvemAv+mBgOmBg+mBhemBhumBiFwiLFxuXHRcdDQsXG5cdFx0XCLpgY7pgZTpgZXpgZbpgZnpgZrpgZxcIixcblx0XHQ1LFxuXHRcdFwi6YGk6YGm6YGn6YGp6YGq6YGr6YGs6YGvXCIsXG5cdFx0NCxcblx0XHRcIumBtlwiLFxuXHRcdDYsXG5cdFx0XCLpgb7pgoFcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZjgwXCIsXG5cdFx0XCLpgoTpgoXpgobpgofpgonpgorpgoxcIixcblx0XHQ0LFxuXHRcdFwi6YKS6YKU6YKW6YKY6YKa6YKc6YKe6YKf6YKg6YKk6YKl6YKn6YKo6YKp6YKr6YKt6YKy6YK36YK86YK96YK/6YOA5pG65pK35pK45pKZ5pK65pOA5pOQ5pOX5pOk5pOi5pSJ5pSl5pSu5byL5b+S55SZ5byR5Y2f5Y+x5Y+95Y+p5Y+o5Y+75ZCS5ZCW5ZCG5ZGL5ZGS5ZGT5ZGU5ZGW5ZGD5ZCh5ZGX5ZGZ5ZCj5ZCy5ZKC5ZKU5ZG35ZGx5ZGk5ZKa5ZKb5ZKE5ZG25ZGm5ZKd5ZOQ5ZKt5ZOC5ZK05ZOS5ZKn5ZKm5ZOT5ZOU5ZGy5ZKj5ZOV5ZK75ZK/5ZOM5ZOZ5ZOa5ZOc5ZKp5ZKq5ZKk5ZOd5ZOP5ZOe5ZSb5ZOn5ZSg5ZO95ZSU5ZOz5ZSi5ZSj5ZSP5ZSR5ZSn5ZSq5ZWn5ZaP5Za15ZWJ5ZWt5ZWB5ZWV5ZS/5ZWQ5ZS8XCJcblx0XSxcblx0W1xuXHRcdFwiZTA0MFwiLFxuXHRcdFwi6YOC6YOD6YOG6YOI6YOJ6YOL6YOM6YON6YOS6YOU6YOV6YOW6YOY6YOZ6YOa6YOe6YOf6YOg6YOj6YOk6YOl6YOp6YOq6YOs6YOu6YOw6YOx6YOy6YOz6YO16YO26YO36YO56YO66YO76YO86YO/6YSA6YSB6YSD6YSFXCIsXG5cdFx0MTksXG5cdFx0XCLphJrphJvphJxcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMDgwXCIsXG5cdFx0XCLphJ3phJ/phKDphKHphKRcIixcblx0XHQxMCxcblx0XHRcIumEsOmEslwiLFxuXHRcdDYsXG5cdFx0XCLphLpcIixcblx0XHQ4LFxuXHRcdFwi6YWE5ZS35ZWW5ZW15ZW25ZW35ZSz5ZSw5ZWc5ZaL5ZeS5ZaD5Zax5Za55ZaI5ZaB5Zaf5ZW+5ZeW5ZaR5ZW75Zef5Za95Za+5ZaU5ZaZ5Zeq5Ze35ZeJ5Zif5ZeR5Zer5Zes5ZeU5Zem5Zed5ZeE5Zev5Zel5Zey5Zez5ZeM5ZeN5Zeo5Ze15Zek6L6U5Zie5ZiI5ZiM5ZiB5Zik5Zij5Ze+5ZiA5Zin5Zit5ZmY5Zi55ZmX5Zis5ZmN5Zmi5ZmZ5Zmc5ZmM5ZmU5ZqG5Zmk5Zmx5Zmr5Zm75Zm85ZqF5ZqT5Zqv5ZuU5ZuX5Zud5Zuh5Zu15Zur5Zu55Zu/5ZyE5ZyK5ZyJ5Zyc5biP5biZ5biU5biR5bix5bi75bi8XCJcblx0XSxcblx0W1xuXHRcdFwiZTE0MFwiLFxuXHRcdFwi6YWF6YWH6YWI6YWR6YWT6YWU6YWV6YWW6YWY6YWZ6YWb6YWc6YWf6YWg6YWm6YWn6YWo6YWr6YWt6YWz6YW66YW76YW86YaAXCIsXG5cdFx0NCxcblx0XHRcIumGhumGiOmGiumGjumGj+mGk1wiLFxuXHRcdDYsXG5cdFx0XCLphpxcIixcblx0XHQ1LFxuXHRcdFwi6YakXCIsXG5cdFx0NSxcblx0XHRcIumGq+mGrOmGsOmGsemGsumGs+mGtumGt+mGuOmGuemGu1wiXG5cdF0sXG5cdFtcblx0XHRcImUxODBcIixcblx0XHRcIumGvFwiLFxuXHRcdDEwLFxuXHRcdFwi6YeI6YeL6YeQ6YeSXCIsXG5cdFx0OSxcblx0XHRcIumHnVwiLFxuXHRcdDgsXG5cdFx0XCLluLfluYTluZTluZvluZ7luaHlsozlsbrlso3lspDlspblsojlspjlspnlspHlsprlspzlsrXlsqLlsr3lsqzlsqvlsrHlsqPls4Hlsrfls4Tls5Lls6Tls4vls6XltILltIPltKfltKbltK7ltKTltJ7ltIbltJvltZjltL7ltLTltL3ltazltZvlta/ltZ3ltavltYvltYrltanltbTltoLltpnltp3osbPltrflt4XlvbPlvbflvoLlvoflvonlvozlvpXlvpnlvpzlvqjlvq3lvrXlvrzooaLlvaHniq3nirDnirTnirfnirjni4Pni4Hni47ni43ni5Lni6jni6/ni6nni7Lni7Tni7fnjIHni7PnjIPni7pcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMjQwXCIsXG5cdFx0XCLph6ZcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJlMjgwXCIsXG5cdFx0XCLpiKVcIixcblx0XHQzMixcblx0XHRcIueLu+eMl+eMk+eMoeeMiueMnueMneeMleeMoueMueeMpeeMrOeMuOeMseeNkOeNjeeNl+eNoOeNrOeNr+eNvuiIm+Wkpemjp+WkpOWkgumlo+mlp1wiLFxuXHRcdDUsXG5cdFx0XCLppbTppbfppb3ppoDppoTppofpporppo3pppDpppHpppPpppTpppXluoDlupHluovlupbluqXluqDlurnlurXlur7lurPotZPlu5Llu5Hlu5vlu6jlu6rohrrlv4Tlv4nlv5blv4/mgIPlv67mgITlv6Hlv6Tlv77mgIXmgIblv6rlv63lv7jmgJnmgLXmgKbmgJvmgI/mgI3mgKnmgKvmgIrmgL/mgKHmgbjmgbnmgbvmgbrmgYJcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMzQwXCIsXG5cdFx0XCLpiYZcIixcblx0XHQ0NSxcblx0XHRcIumJtVwiLFxuXHRcdDE2XG5cdF0sXG5cdFtcblx0XHRcImUzODBcIixcblx0XHRcIumKhlwiLFxuXHRcdDcsXG5cdFx0XCLpio9cIixcblx0XHQyNCxcblx0XHRcIuaBquaBveaCluaCmuaCreaCneaCg+aCkuaCjOaCm+aDrOaCu+aCseaDneaDmOaDhuaDmuaCtOaEoOaEpuaEleaEo+aDtOaEgOaEjuaEq+aFiuaFteaGrOaGlOaGp+aGt+aHlOaHteW/nemas+mXqemXq+mXsemXs+mXtemXtumXvOmXvumYg+mYhOmYhumYiOmYiumYi+mYjOmYjemYj+mYkumYlemYlumYl+mYmemYmuS4rOeIv+aIleawteaxlOaxnOaxiuayo+ayheaykOaylOayjOaxqOaxqeaxtOaxtuayhuayqeazkOazlOayreazt+azuOazseazl+aysuazoOazluazuuazq+azruayseazk+azr+azvlwiXG5cdF0sXG5cdFtcblx0XHRcImU0NDBcIixcblx0XHRcIumKqFwiLFxuXHRcdDUsXG5cdFx0XCLpiq9cIixcblx0XHQyNCxcblx0XHRcIumLiVwiLFxuXHRcdDMxXG5cdF0sXG5cdFtcblx0XHRcImU0ODBcIixcblx0XHRcIumLqVwiLFxuXHRcdDMyLFxuXHRcdFwi5rS55rSn5rSM5rWD5rWI5rSH5rSE5rSZ5rSO5rSr5rWN5rSu5rS15rSa5rWP5rWS5rWU5rSz5raR5rWv5rae5rag5rWe5raT5raU5rWc5rWg5rW85rWj5ria5reH5reF5ree5riO5ra/5reg5riR5rem5red5reZ5riW5rar5riM5rau5rir5rmu5rmO5rmr5rqy5rmf5rqG5rmT5rmU5riy5ril5rmE5ruf5rqx5rqY5rug5ryt5rui5rql5rqn5rq95rq75rq35ruX5rq05ruP5rqP5ruC5rqf5r2i5r2G5r2H5ryk5ryV5ru55ryv5ry25r2L5r205ryq5ryJ5ryp5r6J5r6N5r6M5r245r2y5r285r265r+RXCJcblx0XSxcblx0W1xuXHRcdFwiZTU0MFwiLFxuXHRcdFwi6YyKXCIsXG5cdFx0NTEsXG5cdFx0XCLpjL9cIixcblx0XHQxMFxuXHRdLFxuXHRbXG5cdFx0XCJlNTgwXCIsXG5cdFx0XCLpjYpcIixcblx0XHQzMSxcblx0XHRcIumNq+a/iea+p+a+uea+tua/gua/oea/rua/nua/oOa/r+eAmueAo+eAm+eAueeAteeBj+eBnuWugOWuhOWuleWuk+WupeWuuOeUr+mqnuaQtOWvpOWvruiksOWvsOi5h+ish+i+tui/k+i/lei/pei/rui/pOi/qei/pui/s+i/qOmAhemAhOmAi+mApumAkemAjemAlumAoemAtemAtumAremAr+mBhOmBkemBkumBkOmBqOmBmOmBoumBm+aauemBtOmBvemCgumCiOmCg+mCi+W9kOW9l+W9luW9mOWwu+WSq+WxkOWxmeWtseWxo+Wxpue+vOW8quW8qeW8reiJtOW8vOmsu+WxruWmgeWmg+WmjeWmqeWmquWmo1wiXG5cdF0sXG5cdFtcblx0XHRcImU2NDBcIixcblx0XHRcIumNrFwiLFxuXHRcdDM0LFxuXHRcdFwi6Y6QXCIsXG5cdFx0Mjdcblx0XSxcblx0W1xuXHRcdFwiZTY4MFwiLFxuXHRcdFwi6Y6sXCIsXG5cdFx0MjksXG5cdFx0XCLpj4vpj4zpj43lppflp4rlpqvlpp7lpqTlp5LlprLlpq/lp5flpr7lqIXlqIblp53lqIjlp6Plp5jlp7nlqIzlqInlqLLlqLTlqJHlqKPlqJPlqYDlqaflqYrlqZXlqLzlqaLlqbXog6zlqqrlqpvlqbflqbrlqr7lq6vlqrLlq5Llq5Tlqrjlq6Dlq6Plq7Hlq5blq6blq5jlq5zlrInlrJflrJblrLLlrLflrYDlsJXlsJzlrZrlraXlrbPlrZHlrZPlraLpqbXpqbfpqbjpqbrpqb/pqb3pqoDpqoHpqoXpqojpqorpqpDpqpLpqpPpqpbpqpjpqpvpqpzpqp3pqp/pqqDpqqLpqqPpqqXpqqfnup/nuqHnuqPnuqXnuqjnuqlcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNzQwXCIsXG5cdFx0XCLpj45cIixcblx0XHQ3LFxuXHRcdFwi6Y+XXCIsXG5cdFx0NTRcblx0XSxcblx0W1xuXHRcdFwiZTc4MFwiLFxuXHRcdFwi6ZCOXCIsXG5cdFx0MzIsXG5cdFx0XCLnuq3nurDnur7nu4Dnu4Hnu4Lnu4nnu4vnu4znu5Dnu5Tnu5fnu5vnu6Dnu6Hnu6jnu6vnu67nu6/nu7Hnu7LnvI3nu7bnu7rnu7vnu77nvIHnvILnvIPnvIfnvIjnvIvnvIznvI/nvJHnvJLnvJfnvJnnvJznvJvnvJ/nvKFcIixcblx0XHQ2LFxuXHRcdFwi57yq57yr57ys57yt57yvXCIsXG5cdFx0NCxcblx0XHRcIue8teW5uueVv+W3m+eUvumCleeOjueOkeeOrueOoueOn+ePj+ePguePkeeOt+eOs+ePgOePieePiOePpeePmemhvOeQiuePqeePp+ePnueOuuePsueQj+eQqueRm+eQpueQpeeQqOeQsOeQrueQrFwiXG5cdF0sXG5cdFtcblx0XHRcImU4NDBcIixcblx0XHRcIumQr1wiLFxuXHRcdDE0LFxuXHRcdFwi6ZC/XCIsXG5cdFx0NDMsXG5cdFx0XCLpkazpka3pka7pka9cIlxuXHRdLFxuXHRbXG5cdFx0XCJlODgwXCIsXG5cdFx0XCLpkbBcIixcblx0XHQyMCxcblx0XHRcIumSkemSlumSmOmTh+mTj+mTk+mTlOmTmumTpumTu+mUnOmUoOeQm+eQmueRgeeRnOeRl+eRleeRmeeRt+eRreeRvueSnOeSjueSgOeSgeeSh+eSi+eSnueSqOeSqeeSkOeSp+eTkueSuumfqumfq+mfrOadjOadk+adnuadiOadqeaepeaeh+adquads+aemOaep+adteaeqOaenuaereaei+adt+advOafsOagieafmOagiuafqeaesOagjOafmeaeteafmuaes+afneaggOafg+aeuOafouagjuafgeafveagsuags+ahoOahoeahjuahouahhOahpOaig+agneahleahpuahgeahp+ahgOagvuahiuahieagqeaiteaij+ahtOaht+aik+ahq+ajgualruajvOakn+akoOajuVwiXG5cdF0sXG5cdFtcblx0XHRcImU5NDBcIixcblx0XHRcIumUp+mUs+mUvemVg+mViOmVi+mVlemVmumVoOmVrumVtOmVtemVt1wiLFxuXHRcdDcsXG5cdFx0XCLploBcIixcblx0XHQ0MlxuXHRdLFxuXHRbXG5cdFx0XCJlOTgwXCIsXG5cdFx0XCLplqtcIixcblx0XHQzMixcblx0XHRcIuakpOajsOaki+akgeall+ajo+akkOalseakuealoOalgualneamhOalq+amgOammOaluOaktOanjOamh+amiOanjuamiealpualo+alueamm+amp+amu+amq+amreanlOamseangeaniuann+amleanoOamjeanv+aor+anreaol+aomOappeansuaphOaovuaqoOapkOapm+aoteaqjuapueaoveaoqOapmOapvOaqkeaqkOaqqeaql+aqq+eMt+eNkuaugeauguauh+auhOaukuauk+aujeaumuaum+auoeauqui9q+i9rei9sei9sui9s+i9tei9tui9uOi9t+i9uei9uui9vOi9vui+gei+gui+hOi+h+i+i1wiXG5cdF0sXG5cdFtcblx0XHRcImVhNDBcIixcblx0XHRcIumXjFwiLFxuXHRcdDI3LFxuXHRcdFwi6Zes6Ze/6ZiH6ZiT6ZiY6Zib6Zie6Zig6ZijXCIsXG5cdFx0Nixcblx0XHRcIumYq+mYrOmYremYr+mYsOmYt+mYuOmYuemYuumYvumZgemZg+mZiumZjumZj+mZkemZkumZk+mZlumZl1wiXG5cdF0sXG5cdFtcblx0XHRcImVhODBcIixcblx0XHRcIumZmOmZmemZmumZnOmZnemZnumZoOmZo+mZpemZpumZq+mZrVwiLFxuXHRcdDQsXG5cdFx0XCLpmbPpmbhcIixcblx0XHQxMixcblx0XHRcIumah+maiemaiui+jei+jui+j+i+mOi+mui7juaIi+aIl+aIm+aIn+aIouaIoeaIpeaIpOaIrOiHp+eTr+eTtOeTv+eUj+eUkeeUk+aUtOaXruaXr+aXsOaYiuaYmeadsuaYg+aYleaYgOeCheabt+aYneaYtOaYseaYtuaYteiAhuaZn+aZlOaZgeaZj+aZluaZoeaZl+aZt+aahOaajOaap+aaneaavuabm+abnOabpuabqei0sui0s+i0tui0u+i0vei1gOi1hei1hui1iOi1iei1h+i1jei1lei1meinh+iniuini+injOinjuinj+inkOinkeeJrueKn+eJneeJpueJr+eJvueJv+eKhOeKi+eKjeeKj+eKkuaMiOaMsuaOsFwiXG5cdF0sXG5cdFtcblx0XHRcImViNDBcIixcblx0XHRcIumajOmajumakemakumak+malemalumamumam+manVwiLFxuXHRcdDksXG5cdFx0XCLpmqhcIixcblx0XHQ3LFxuXHRcdFwi6Zqx6Zqy6Zq06Zq16Zq36Zq46Zq66Zq76Zq/6ZuC6ZuD6ZuI6ZuK6ZuL6ZuQ6ZuR6ZuT6ZuU6ZuWXCIsXG5cdFx0OSxcblx0XHRcIumboVwiLFxuXHRcdDYsXG5cdFx0XCLpm6tcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYjgwXCIsXG5cdFx0XCLpm6zpm63pm67pm7Dpm7Hpm7Lpm7Tpm7Xpm7jpm7rpm7vpm7zpm73pm7/pnILpnIPpnIXpnIrpnIvpnIzpnJDpnJHpnJLpnJTpnJXpnJdcIixcblx0XHQ0LFxuXHRcdFwi6Zyd6Zyf6Zyg5pC/5pOY6ICE5q+q5q+z5q+95q+15q+55rCF5rCH5rCG5rCN5rCV5rCY5rCZ5rCa5rCh5rCp5rCk5rCq5rCy5pS15pWV5pWr54mN54mS54mW54iw6Jmi5YiW6IKf6IKc6IKT6IK85pyK6IK96IKx6IKr6IKt6IK06IK36IOn6IOo6IOp6IOq6IOb6IOC6IOE6IOZ6ION6IOX5pyQ6IOd6IOr6IOx6IO06IOt6ISN6ISO6IOy6IO85pyV6ISS6LGa6IS26ISe6ISs6ISY6ISy6IWI6IWM6IWT6IW06IWZ6IWa6IWx6IWg6IWp6IW86IW96IWt6IWn5aGN5aq16IaI6IaC6IaR5ruV6Iaj6Iaq6IeM5pym6IeK6Ia7XCJcblx0XSxcblx0W1xuXHRcdFwiZWM0MFwiLFxuXHRcdFwi6ZyhXCIsXG5cdFx0OCxcblx0XHRcIumcq+mcrOmcrumcr+mcsemcs1wiLFxuXHRcdDQsXG5cdFx0XCLpnLrpnLvpnLzpnL3pnL9cIixcblx0XHQxOCxcblx0XHRcIumdlOmdlemdl+mdmOmdmumdnOmdnemdn+mdo+mdpOmdpumdp+mdqOmdqlwiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiZWM4MFwiLFxuXHRcdFwi6Z2y6Z216Z23XCIsXG5cdFx0NCxcblx0XHRcIumdvVwiLFxuXHRcdDcsXG5cdFx0XCLpnoZcIixcblx0XHQ0LFxuXHRcdFwi6Z6M6Z6O6Z6P6Z6Q6Z6T6Z6V6Z6W6Z6X6Z6ZXCIsXG5cdFx0NCxcblx0XHRcIuiHgeiGpuaspOast+asueatg+athuatmemjkemjkumjk+mjlemjmemjmuaus+W9gOavguins+aWkOm9keaWk+aWvOaXhuaXhOaXg+aXjOaXjuaXkuaXlueCgOeCnOeClueCneeCu+eDgOeCt+eCq+eCseeDqOeDiueEkOeEk+eElueEr+eEseeFs+eFnOeFqOeFheeFsueFiueFuOeFuueGmOeGs+eGteeGqOeGoOeHoOeHlOeHp+eHueeIneeIqOeBrOeEmOeFpueGueaIvuaIveaJg+aJiOaJieeku+elgOelhuelieelm+elnOelk+elmuelouell+eloOelr+elp+eluuemheemiuemmuemp+ems+W/keW/kFwiXG5cdF0sXG5cdFtcblx0XHRcImVkNDBcIixcblx0XHRcIumenumen+meoemeoumepFwiLFxuXHRcdDYsXG5cdFx0XCLpnqzpnq7pnrDpnrHpnrPpnrVcIixcblx0XHQ0NlxuXHRdLFxuXHRbXG5cdFx0XCJlZDgwXCIsXG5cdFx0XCLpn6Tpn6Xpn6jpn65cIixcblx0XHQ0LFxuXHRcdFwi6Z+06Z+3XCIsXG5cdFx0MjMsXG5cdFx0XCLmgLzmgZ3mgZrmgafmgYHmgZnmgaPmgqvmhIbmhI3mhZ3mhqnmhp3mh4vmh5HmiIbogoDogb/mspPms7bmt7znn7bnn7jnoIDnoInnoJfnoJjnoJHmlqvnoK3noJznoJ3noLnnoLrnoLvnoJ/noLznoKXnoKznoKPnoKnnoY7noa3noZbnoZfnoKbnoZDnoYfnoYznoarnopvnopPnoprnoofnopznoqHnoqPnorLnornnoqXno5Tno5nno4nno6zno7LnpIXno7TnpJPnpKTnpJ7npLTpvpvpu7npu7vpu7znm7HnnITnnI3nm7nnnIfnnIjnnJrnnKLnnJnnnK3nnKbnnLXnnLjnnZDnnZHnnYfnnYPnnZrnnahcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZTQwXCIsXG5cdFx0XCLpoI9cIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJlZTgwXCIsXG5cdFx0XCLpoY5cIixcblx0XHQzMixcblx0XHRcIuedouedpeedv+eejeedveeegOeejOeekeeen+eeoOeesOeeteeeveeUuueVgOeVjueVi+eViOeVm+eVsueVueeWg+e9mOe9oee9n+ipiOe9qOe9tOe9see9uee+gee9vuebjeebpeigsumShemShumSh+mSi+mSiumSjOmSjemSj+mSkOmSlOmSl+mSlemSmumSm+mSnOmSo+mSpOmSq+mSqumSremSrOmSr+mSsOmSsumStOmStlwiLFxuXHRcdDQsXG5cdFx0XCLpkrzpkr3pkr/pk4Tpk4hcIixcblx0XHQ2LFxuXHRcdFwi6ZOQ6ZOR6ZOS6ZOV6ZOW6ZOX6ZOZ6ZOY6ZOb6ZOe6ZOf6ZOg6ZOi6ZOk6ZOl6ZOn6ZOo6ZOqXCJcblx0XSxcblx0W1xuXHRcdFwiZWY0MFwiLFxuXHRcdFwi6aGvXCIsXG5cdFx0NSxcblx0XHRcIumii+mijumikumilemimemio+miqFwiLFxuXHRcdDM3LFxuXHRcdFwi6aOP6aOQ6aOU6aOW6aOX6aOb6aOc6aOd6aOgXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJlZjgwXCIsXG5cdFx0XCLpo6Xpo6bpo6lcIixcblx0XHQzMCxcblx0XHRcIumTqemTq+mTrumTr+mTs+mTtOmTtemTt+mTuemTvOmTvemTv+mUg+mUgumUhumUh+mUiemUiumUjemUjumUj+mUklwiLFxuXHRcdDQsXG5cdFx0XCLplJjplJvplJ3plJ7plJ/plKLplKrplKvplKnplKzplLHplLLplLTplLbplLfplLjplLzplL7plL/plYLplLXplYTplYXplYbplYnplYzplY7plY/plZLplZPplZTplZbplZfplZjplZnplZvplZ7plZ/plZ3plaHplaLplaRcIixcblx0XHQ4LFxuXHRcdFwi6ZWv6ZWx6ZWy6ZWz6ZS655+n55+s6ZuJ56eV56et56ej56er56iG5bWH56iD56iC56ie56iUXCJcblx0XSxcblx0W1xuXHRcdFwiZjA0MFwiLFxuXHRcdFwi6aSIXCIsXG5cdFx0NCxcblx0XHRcIumkjumkj+mkkVwiLFxuXHRcdDI4LFxuXHRcdFwi6aSvXCIsXG5cdFx0MjZcblx0XSxcblx0W1xuXHRcdFwiZjA4MFwiLFxuXHRcdFwi6aWKXCIsXG5cdFx0OSxcblx0XHRcIumlllwiLFxuXHRcdDEyLFxuXHRcdFwi6aWk6aWm6aWz6aW46aW56aW76aW+6aaC6aaD6aaJ56i556i356mR6buP6aal56mw55qI55qO55qT55qZ55qk55Oe55Og55Ss6big6bii6bioXCIsXG5cdFx0NCxcblx0XHRcIum4sum4sem4tum4uOm4t+m4uem4uum4vum5gem5gum5hOm5hum5h+m5iOm5iem5i+m5jOm5jum5kem5lem5l+m5mum5m+m5nOm5num5o+m5plwiLFxuXHRcdDYsXG5cdFx0XCLpubHpua3pubPnlpLnlpTnlpbnlqDnlp3nlqznlqPnlrPnlrTnlrjnl4TnlrHnlrDnl4Pnl4Lnl5bnl43nl6Pnl6jnl6bnl6Tnl6vnl6fnmIPnl7Hnl7znl7/nmJDnmIDnmIXnmIznmJfnmIrnmKXnmJjnmJXnmJlcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMTQwXCIsXG5cdFx0XCLppozppo7ppppcIixcblx0XHQxMCxcblx0XHRcIummpummp+mmqVwiLFxuXHRcdDQ3XG5cdF0sXG5cdFtcblx0XHRcImYxODBcIixcblx0XHRcIumnmVwiLFxuXHRcdDMyLFxuXHRcdFwi55ib55i855ii55ig55mA55it55iw55i/55i155mD55i+55iz55mN55me55mU55mc55mW55mr55mv57+K56um56m456m556qA56qG56qI56qV56qm56qg56qs56qo56qt56qz6KGk6KGp6KGy6KG96KG/6KKC6KKi6KOG6KK36KK86KOJ6KOi6KOO6KOj6KOl6KOx6KSa6KO86KOo6KO+6KOw6KSh6KSZ6KST6KSb6KSK6KS06KSr6KS26KWB6KWm6KW755aL6IOl55qy55q055+c6ICS6ICU6ICW6ICc6ICg6ICi6ICl6ICm6ICn6ICp6ICo6ICx6ICL6IC16IGD6IGG6IGN6IGS6IGp6IGx6KaD6aG46aKA6aKDXCJcblx0XSxcblx0W1xuXHRcdFwiZjI0MFwiLFxuXHRcdFwi6ae6XCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjI4MFwiLFxuXHRcdFwi6ai5XCIsXG5cdFx0MzIsXG5cdFx0XCLpoonpoozpoo3poo/popTpoprpopvpop7pop/poqHpoqLpoqXpoqbomY3omZTomazoma7omb/ombrombzombvomqjomo3omovomqzomp3omqfomqPomqrompPomqnomrbom4TomrXom47omrDomrromrHomq/om4nom4/omrTom6nom7Hom7Lom63om7Pom5DonJPom57om7Tom5/om5jom5HonIPonIfom7jonIjonIronI3onInonKPonLvonJ7onKXonK7onJronL7onYjonLTonLHonKnonLfonL/onoLonKLonb3onb7onbvonaDonbDonYzona7onovonZPonaPonbzonaTonZnonaXonpPonq/onqjon5JcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMzQwXCIsXG5cdFx0XCLpqZpcIixcblx0XHQxNyxcblx0XHRcIumpsumqg+mqiemqjemqjumqlOmqlemqmemqpumqqVwiLFxuXHRcdDYsXG5cdFx0XCLpqrLpqrPpqrTpqrXpqrnpqrvpqr3pqr7pqr/pq4Ppq4Tpq4ZcIixcblx0XHQ0LFxuXHRcdFwi6auN6auO6auP6auQ6auS6auU6auV6auW6auX6auZ6aua6aub6aucXCJcblx0XSxcblx0W1xuXHRcdFwiZjM4MFwiLFxuXHRcdFwi6aud6aue6aug6aui6auj6auk6aul6aun6auo6aup6auq6aus6auu6auwXCIsXG5cdFx0OCxcblx0XHRcIumruumrvFwiLFxuXHRcdDYsXG5cdFx0XCLprITprIXprIbon4bonojonoXonq3onpfonoPonqvon6XonqzonrXonrPon4von5Ponr3on5Hon4Don4ron5von6ron6Don67ooJbooJPon77ooIrooJvooKHooLnooLznvLbnvYLnvYTnvYXoiJDnq7rnq73nrIjnrIPnrITnrJXnrIrnrKvnrI/nrYfnrLjnrKrnrJnnrK7nrLHnrKDnrKXnrKTnrLPnrL7nrJ7nrZjnrZrnrYXnrbXnrYznrZ3nraDnra7nrbvnraLnrbLnrbHnrpDnrqbnrqfnrrjnrqznrp3nrqjnroXnrqrnrpznrqLnrqvnrrTnr5Hnr4Hnr4znr53nr5rnr6Xnr6bnr6rnsIznr77nr7znsI/nsJbnsItcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNDQwXCIsXG5cdFx0XCLprIfprIlcIixcblx0XHQ1LFxuXHRcdFwi6ayQ6ayR6ayS6ayUXCIsXG5cdFx0MTAsXG5cdFx0XCLprKDprKHprKLprKRcIixcblx0XHQxMCxcblx0XHRcIumssOmssemss1wiLFxuXHRcdDcsXG5cdFx0XCLprL3prL7prL/prYDprYbprYrprYvprYzprY7prZDprZLprZPprZVcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcImY0ODBcIixcblx0XHRcIumtm1wiLFxuXHRcdDMyLFxuXHRcdFwi57Cf57Cq57Cm57C457GB57GA6Ie+6IiB6IiC6IiE6Ies6KGE6Iih6Iii6Iij6Iit6Iiv6Iio6Iir6Ii46Ii76Iiz6Ii06Ii+6ImE6ImJ6ImL6ImP6Ima6Imf6Imo6KG+6KKF6KKI6KOY6KOf6KWe576d576f576n576v576w576y57G85pWJ57KR57Kd57Kc57Ke57Ki57Ky57K857K957OB57OH57OM57ON57OI57OF57OX57Oo6Imu5pqo576/57+O57+V57+l57+h57+m57+p57+u57+z57O457W357am57au57mH57qb6bq46bq06LWz6LaE6LaU6LaR6Lax6LWn6LWt6LGH6LGJ6YWK6YWQ6YWO6YWP6YWkXCJcblx0XSxcblx0W1xuXHRcdFwiZjU0MFwiLFxuXHRcdFwi6a28XCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjU4MFwiLFxuXHRcdFwi6a67XCIsXG5cdFx0MzIsXG5cdFx0XCLphaLphaHphbDphanpha/phb3phb7phbLphbTphbnphozphoXphpDpho3phpHphqLphqPphqrphq3phq7phq/phrXphrTphrrosZXpub7otrjot6vouIXouZnouanotrXotr/otrzotrrot4Tot5bot5fot5rot57ot47ot4/ot5vot4bot6zot7fot7jot6Pot7not7vot6TouInot73ouJTouJ3ouJ/ouKzouK7ouKPouK/ouLrouYDouLnouLXouL3ouLHouYnouYHouYLouZHouZLouYroubDoubboubzoua/oubTouoXouo/oupToupDoupzoup7osbjosoLosorosoXospjospTmlpvop5bop57op5rop5xcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNjQwXCIsXG5cdFx0XCLpr5xcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmNjgwXCIsXG5cdFx0XCLpsJtcIixcblx0XHQzMixcblx0XHRcIuinpeinq+inr+iovuispumdk+mbqembs+mbr+mchumcgemciOmcj+mcjumcqumcremcsOmcvum+gOm+g+m+hVwiLFxuXHRcdDUsXG5cdFx0XCLpvozpu77pvIvpvI3pmrnpmrzpmr3pm47pm5Lnnr/pm6Dpio7piq7pi4jpjL7pjarpj4rpjo/pkL7pkavpsb/psoLpsoXpsobpsofpsojnqKPpsovpso7pspDpspHpspLpspTpspXpsprpspvpsp5cIixcblx0XHQ1LFxuXHRcdFwi6bKlXCIsXG5cdFx0NCxcblx0XHRcIumyq+myremyrumysFwiLFxuXHRcdDcsXG5cdFx0XCLpsrrpsrvpsrzpsr3ps4Tps4Xps4bps4fps4rps4tcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNzQwXCIsXG5cdFx0XCLpsLxcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmNzgwXCIsXG5cdFx0XCLpsbvpsb3psb7psoDpsoPpsoTpsonpsorpsozpso/pspPpspbpspfpspjpspnpsp3psqrpsqzpsq/psrnpsr5cIixcblx0XHQ0LFxuXHRcdFwi6bOI6bOJ6bOR6bOS6bOa6bOb6bOg6bOh6bOMXCIsXG5cdFx0NCxcblx0XHRcIumzk+mzlOmzlemzl+mzmOmzmemznOmznemzn+mzoumdvOmehemekemekumelOmer+meq+meo+mesumetOmqsemqsOmqt+m5mOmqtumquumqvOmrgemrgOmrhemrgumri+mrjOmrkemthemtg+mth+mtiemtiOmtjemtkemjqOmkjemkrumllemllOmrn+mroemrpumrr+mrq+mru+mrremruemsiOmsj+msk+msn+mso+m6vem6vue4u+m6gum6h+m6iOm6i+m6kumPlum6nem6n+m7m+m7nOm7nem7oOm7n+m7oum7qem7p+m7pem7qum7r+m8oum8rOm8r+m8uem8t+m8vem8vum9hFwiXG5cdF0sXG5cdFtcblx0XHRcImY4NDBcIixcblx0XHRcIumzo1wiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImY4ODBcIixcblx0XHRcIum0olwiLFxuXHRcdDMyXG5cdF0sXG5cdFtcblx0XHRcImY5NDBcIixcblx0XHRcIum1g1wiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImY5ODBcIixcblx0XHRcIum2glwiLFxuXHRcdDMyXG5cdF0sXG5cdFtcblx0XHRcImZhNDBcIixcblx0XHRcIum2o1wiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImZhODBcIixcblx0XHRcIum3olwiLFxuXHRcdDMyXG5cdF0sXG5cdFtcblx0XHRcImZiNDBcIixcblx0XHRcIum4g1wiLFxuXHRcdDI3LFxuXHRcdFwi6bik6bin6biu6biw6bi06bi76bi86bmA6bmN6bmQ6bmS6bmT6bmU6bmW6bmZ6bmd6bmf6bmg6bmh6bmi6bml6bmu6bmv6bmy6bm0XCIsXG5cdFx0OSxcblx0XHRcIum6gFwiXG5cdF0sXG5cdFtcblx0XHRcImZiODBcIixcblx0XHRcIum6gem6g+m6hOm6hem6hum6iem6ium6jFwiLFxuXHRcdDUsXG5cdFx0XCLpupRcIixcblx0XHQ4LFxuXHRcdFwi6bqe6bqgXCIsXG5cdFx0NSxcblx0XHRcIum6p+m6qOm6qem6qlwiXG5cdF0sXG5cdFtcblx0XHRcImZjNDBcIixcblx0XHRcIum6q1wiLFxuXHRcdDgsXG5cdFx0XCLpurXpurbpurfpurnpurrpurzpur9cIixcblx0XHQ0LFxuXHRcdFwi6buF6buG6buH6buI6buK6buL6buM6buQ6buS6buT6buV6buW6buX6buZ6bua6bue6buh6buj6buk6bum6buo6bur6bus6but6buu6buwXCIsXG5cdFx0OCxcblx0XHRcIum7uum7vem7v1wiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiZmM4MFwiLFxuXHRcdFwi6byGXCIsXG5cdFx0NCxcblx0XHRcIum8jOm8j+m8kem8kum8lOm8lem8lum8mOm8mlwiLFxuXHRcdDUsXG5cdFx0XCLpvKHpvKNcIixcblx0XHQ4LFxuXHRcdFwi6byt6byu6byw6byxXCJcblx0XSxcblx0W1xuXHRcdFwiZmQ0MFwiLFxuXHRcdFwi6byyXCIsXG5cdFx0NCxcblx0XHRcIum8uOm8uum8vOm8v1wiLFxuXHRcdDQsXG5cdFx0XCLpvYVcIixcblx0XHQxMCxcblx0XHRcIum9klwiLFxuXHRcdDM4XG5cdF0sXG5cdFtcblx0XHRcImZkODBcIixcblx0XHRcIum9uVwiLFxuXHRcdDUsXG5cdFx0XCLpvoHpvoLpvo1cIixcblx0XHQxMSxcblx0XHRcIum+nOm+nem+num+oVwiLFxuXHRcdDQsXG5cdFx0XCLvpKzvpbnvppXvp6fvp7FcIlxuXHRdLFxuXHRbXG5cdFx0XCJmZTQwXCIsXG5cdFx0XCLvqIzvqI3vqI7vqI/vqJHvqJPvqJTvqJjvqJ/vqKDvqKHvqKPvqKTvqKfvqKjvqKlcIlxuXHRdXG5dO1xuXG52YXIgY3A5MzYkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnZGVmYXVsdCc6IGNwOTM2XG59KTtcblxudmFyIGdia0FkZGVkID0gW1xuXHRbXG5cdFx0XCJhMTQwXCIsXG5cdFx0XCLuk4ZcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJhMTgwXCIsXG5cdFx0XCLulIVcIixcblx0XHQzMlxuXHRdLFxuXHRbXG5cdFx0XCJhMjQwXCIsXG5cdFx0XCLulKZcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJhMjgwXCIsXG5cdFx0XCLulaVcIixcblx0XHQzMlxuXHRdLFxuXHRbXG5cdFx0XCJhMmFiXCIsXG5cdFx0XCLunaZcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcImEyZTNcIixcblx0XHRcIuKCrO6drVwiXG5cdF0sXG5cdFtcblx0XHRcImEyZWZcIixcblx0XHRcIu6dru6dr1wiXG5cdF0sXG5cdFtcblx0XHRcImEyZmRcIixcblx0XHRcIu6dsO6dsVwiXG5cdF0sXG5cdFtcblx0XHRcImEzNDBcIixcblx0XHRcIu6WhlwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImEzODBcIixcblx0XHRcIu6XhVwiLFxuXHRcdDMxLFxuXHRcdFwi44CAXCJcblx0XSxcblx0W1xuXHRcdFwiYTQ0MFwiLFxuXHRcdFwi7pemXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiYTQ4MFwiLFxuXHRcdFwi7pilXCIsXG5cdFx0MzJcblx0XSxcblx0W1xuXHRcdFwiYTRmNFwiLFxuXHRcdFwi7p2yXCIsXG5cdFx0MTBcblx0XSxcblx0W1xuXHRcdFwiYTU0MFwiLFxuXHRcdFwi7pmGXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiYTU4MFwiLFxuXHRcdFwi7pqFXCIsXG5cdFx0MzJcblx0XSxcblx0W1xuXHRcdFwiYTVmN1wiLFxuXHRcdFwi7p29XCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCJhNjQwXCIsXG5cdFx0XCLumqZcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJhNjgwXCIsXG5cdFx0XCLum6VcIixcblx0XHQzMlxuXHRdLFxuXHRbXG5cdFx0XCJhNmI5XCIsXG5cdFx0XCLunoVcIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcImE2ZDlcIixcblx0XHRcIu6ejVwiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiYTZlY1wiLFxuXHRcdFwi7p6U7p6VXCJcblx0XSxcblx0W1xuXHRcdFwiYTZmM1wiLFxuXHRcdFwi7p6WXCJcblx0XSxcblx0W1xuXHRcdFwiYTZmNlwiLFxuXHRcdFwi7p6XXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCJhNzQwXCIsXG5cdFx0XCLunIZcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJhNzgwXCIsXG5cdFx0XCLunYVcIixcblx0XHQzMlxuXHRdLFxuXHRbXG5cdFx0XCJhN2MyXCIsXG5cdFx0XCLunqBcIixcblx0XHQxNFxuXHRdLFxuXHRbXG5cdFx0XCJhN2YyXCIsXG5cdFx0XCLunq9cIixcblx0XHQxMlxuXHRdLFxuXHRbXG5cdFx0XCJhODk2XCIsXG5cdFx0XCLunrxcIixcblx0XHQxMFxuXHRdLFxuXHRbXG5cdFx0XCJhOGJjXCIsXG5cdFx0XCLun4dcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOGJmXCIsXG5cdFx0XCLHuVwiXG5cdF0sXG5cdFtcblx0XHRcImE4YzFcIixcblx0XHRcIu6fie6fiu6fi+6fjFwiXG5cdF0sXG5cdFtcblx0XHRcImE4ZWFcIixcblx0XHRcIu6fjVwiLFxuXHRcdDIwXG5cdF0sXG5cdFtcblx0XHRcImE5NThcIixcblx0XHRcIu6folwiXG5cdF0sXG5cdFtcblx0XHRcImE5NWJcIixcblx0XHRcIu6fo1wiXG5cdF0sXG5cdFtcblx0XHRcImE5NWRcIixcblx0XHRcIu6fpO6fpe6fplwiXG5cdF0sXG5cdFtcblx0XHRcImE5ODlcIixcblx0XHRcIuOAvuK/sFwiLFxuXHRcdDExXG5cdF0sXG5cdFtcblx0XHRcImE5OTdcIixcblx0XHRcIu6ftFwiLFxuXHRcdDEyXG5cdF0sXG5cdFtcblx0XHRcImE5ZjBcIixcblx0XHRcIu6ggVwiLFxuXHRcdDE0XG5cdF0sXG5cdFtcblx0XHRcImFhYTFcIixcblx0XHRcIu6AgFwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImFiYTFcIixcblx0XHRcIu6BnlwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImFjYTFcIixcblx0XHRcIu6CvFwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImFkYTFcIixcblx0XHRcIu6EmlwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImFlYTFcIixcblx0XHRcIu6FuFwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImFmYTFcIixcblx0XHRcIu6HllwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImQ3ZmFcIixcblx0XHRcIu6gkFwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiZjhhMVwiLFxuXHRcdFwi7oi0XCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiZjlhMVwiLFxuXHRcdFwi7oqSXCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiZmFhMVwiLFxuXHRcdFwi7ouwXCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiZmJhMVwiLFxuXHRcdFwi7o2OXCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiZmNhMVwiLFxuXHRcdFwi7o6sXCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiZmRhMVwiLFxuXHRcdFwi7pCKXCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiZmU1MFwiLFxuXHRcdFwi4rqB7qCW7qCX7qCY4rqE45Gz45GH4rqI4rqL7qCe45ae45ia45iO4rqM4rqX46Wu46SY7qCm46eP46ef46mz46eQ7qCr7qCs462O47Gu47Og4rqn7qCx7qCy4rqq5IGW5IWf4rqu5Iy34rqz4rq24rq37qC75I6x5I6s4rq75I+d5JOW5Jmh5JmM7qGDXCJcblx0XSxcblx0W1xuXHRcdFwiZmU4MFwiLFxuXHRcdFwi5Jyj5Jyp5J285J6N4ruK5KWH5KW65KW95KaC5KaD5KaF5KaG5Kaf5Kab5Ka35Ka27qGU7qGV5LKj5LKf5LKg5LKh5LG35LKi5LSTXCIsXG5cdFx0Nixcblx0XHRcIuS2ru6hpO6RqFwiLFxuXHRcdDkzXG5cdF1cbl07XG5cbnZhciBnYmtBZGRlZCQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCdkZWZhdWx0JzogZ2JrQWRkZWRcbn0pO1xuXG52YXIgdUNoYXJzID0gW1xuXHQxMjgsXG5cdDE2NSxcblx0MTY5LFxuXHQxNzgsXG5cdDE4NCxcblx0MjE2LFxuXHQyMjYsXG5cdDIzNSxcblx0MjM4LFxuXHQyNDQsXG5cdDI0OCxcblx0MjUxLFxuXHQyNTMsXG5cdDI1OCxcblx0Mjc2LFxuXHQyODQsXG5cdDMwMCxcblx0MzI1LFxuXHQzMjksXG5cdDMzNCxcblx0MzY0LFxuXHQ0NjMsXG5cdDQ2NSxcblx0NDY3LFxuXHQ0NjksXG5cdDQ3MSxcblx0NDczLFxuXHQ0NzUsXG5cdDQ3Nyxcblx0NTA2LFxuXHQ1OTQsXG5cdDYxMCxcblx0NzEyLFxuXHQ3MTYsXG5cdDczMCxcblx0OTMwLFxuXHQ5MzgsXG5cdDk2Mixcblx0OTcwLFxuXHQxMDI2LFxuXHQxMTA0LFxuXHQxMTA2LFxuXHQ4MjA5LFxuXHQ4MjE1LFxuXHQ4MjE4LFxuXHQ4MjIyLFxuXHQ4MjMxLFxuXHQ4MjQxLFxuXHQ4MjQ0LFxuXHQ4MjQ2LFxuXHQ4MjUyLFxuXHQ4MzY1LFxuXHQ4NDUyLFxuXHQ4NDU0LFxuXHQ4NDU4LFxuXHQ4NDcxLFxuXHQ4NDgyLFxuXHQ4NTU2LFxuXHQ4NTcwLFxuXHQ4NTk2LFxuXHQ4NjAyLFxuXHQ4NzEzLFxuXHQ4NzIwLFxuXHQ4NzIyLFxuXHQ4NzI2LFxuXHQ4NzMxLFxuXHQ4NzM3LFxuXHQ4NzQwLFxuXHQ4NzQyLFxuXHQ4NzQ4LFxuXHQ4NzUxLFxuXHQ4NzYwLFxuXHQ4NzY2LFxuXHQ4Nzc3LFxuXHQ4NzgxLFxuXHQ4Nzg3LFxuXHQ4ODAyLFxuXHQ4ODA4LFxuXHQ4ODE2LFxuXHQ4ODU0LFxuXHQ4ODU4LFxuXHQ4ODcwLFxuXHQ4ODk2LFxuXHQ4OTc5LFxuXHQ5MzIyLFxuXHQ5MzcyLFxuXHQ5NTQ4LFxuXHQ5NTg4LFxuXHQ5NjE2LFxuXHQ5NjIyLFxuXHQ5NjM0LFxuXHQ5NjUyLFxuXHQ5NjYyLFxuXHQ5NjcyLFxuXHQ5Njc2LFxuXHQ5NjgwLFxuXHQ5NzAyLFxuXHQ5NzM1LFxuXHQ5NzM4LFxuXHQ5NzkzLFxuXHQ5Nzk1LFxuXHQxMTkwNixcblx0MTE5MDksXG5cdDExOTEzLFxuXHQxMTkxNyxcblx0MTE5MjgsXG5cdDExOTQ0LFxuXHQxMTk0Nyxcblx0MTE5NTEsXG5cdDExOTU2LFxuXHQxMTk2MCxcblx0MTE5NjQsXG5cdDExOTc5LFxuXHQxMjI4NCxcblx0MTIyOTIsXG5cdDEyMzEyLFxuXHQxMjMxOSxcblx0MTIzMzAsXG5cdDEyMzUxLFxuXHQxMjQzNixcblx0MTI0NDcsXG5cdDEyNTM1LFxuXHQxMjU0Myxcblx0MTI1ODYsXG5cdDEyODQyLFxuXHQxMjg1MCxcblx0MTI5NjQsXG5cdDEzMjAwLFxuXHQxMzIxNSxcblx0MTMyMTgsXG5cdDEzMjUzLFxuXHQxMzI2Myxcblx0MTMyNjcsXG5cdDEzMjcwLFxuXHQxMzM4NCxcblx0MTM0MjgsXG5cdDEzNzI3LFxuXHQxMzgzOSxcblx0MTM4NTEsXG5cdDE0NjE3LFxuXHQxNDcwMyxcblx0MTQ4MDEsXG5cdDE0ODE2LFxuXHQxNDk2NCxcblx0MTUxODMsXG5cdDE1NDcxLFxuXHQxNTU4NSxcblx0MTY0NzEsXG5cdDE2NzM2LFxuXHQxNzIwOCxcblx0MTczMjUsXG5cdDE3MzMwLFxuXHQxNzM3NCxcblx0MTc2MjMsXG5cdDE3OTk3LFxuXHQxODAxOCxcblx0MTgyMTIsXG5cdDE4MjE4LFxuXHQxODMwMSxcblx0MTgzMTgsXG5cdDE4NzYwLFxuXHQxODgxMSxcblx0MTg4MTQsXG5cdDE4ODIwLFxuXHQxODgyMyxcblx0MTg4NDQsXG5cdDE4ODQ4LFxuXHQxODg3Mixcblx0MTk1NzYsXG5cdDE5NjIwLFxuXHQxOTczOCxcblx0MTk4ODcsXG5cdDQwODcwLFxuXHQ1OTI0NCxcblx0NTkzMzYsXG5cdDU5MzY3LFxuXHQ1OTQxMyxcblx0NTk0MTcsXG5cdDU5NDIzLFxuXHQ1OTQzMSxcblx0NTk0MzcsXG5cdDU5NDQzLFxuXHQ1OTQ1Mixcblx0NTk0NjAsXG5cdDU5NDc4LFxuXHQ1OTQ5Myxcblx0NjM3ODksXG5cdDYzODY2LFxuXHQ2Mzg5NCxcblx0NjM5NzYsXG5cdDYzOTg2LFxuXHQ2NDAxNixcblx0NjQwMTgsXG5cdDY0MDIxLFxuXHQ2NDAyNSxcblx0NjQwMzQsXG5cdDY0MDM3LFxuXHQ2NDA0Mixcblx0NjUwNzQsXG5cdDY1MDkzLFxuXHQ2NTEwNyxcblx0NjUxMTIsXG5cdDY1MTI3LFxuXHQ2NTEzMixcblx0NjUzNzUsXG5cdDY1NTEwLFxuXHQ2NTUzNlxuXTtcbnZhciBnYkNoYXJzID0gW1xuXHQwLFxuXHQzNixcblx0MzgsXG5cdDQ1LFxuXHQ1MCxcblx0ODEsXG5cdDg5LFxuXHQ5NSxcblx0OTYsXG5cdDEwMCxcblx0MTAzLFxuXHQxMDQsXG5cdDEwNSxcblx0MTA5LFxuXHQxMjYsXG5cdDEzMyxcblx0MTQ4LFxuXHQxNzIsXG5cdDE3NSxcblx0MTc5LFxuXHQyMDgsXG5cdDMwNixcblx0MzA3LFxuXHQzMDgsXG5cdDMwOSxcblx0MzEwLFxuXHQzMTEsXG5cdDMxMixcblx0MzEzLFxuXHQzNDEsXG5cdDQyOCxcblx0NDQzLFxuXHQ1NDQsXG5cdDU0NSxcblx0NTU4LFxuXHQ3NDEsXG5cdDc0Mixcblx0NzQ5LFxuXHQ3NTAsXG5cdDgwNSxcblx0ODE5LFxuXHQ4MjAsXG5cdDc5MjIsXG5cdDc5MjQsXG5cdDc5MjUsXG5cdDc5MjcsXG5cdDc5MzQsXG5cdDc5NDMsXG5cdDc5NDQsXG5cdDc5NDUsXG5cdDc5NTAsXG5cdDgwNjIsXG5cdDgxNDgsXG5cdDgxNDksXG5cdDgxNTIsXG5cdDgxNjQsXG5cdDgxNzQsXG5cdDgyMzYsXG5cdDgyNDAsXG5cdDgyNjIsXG5cdDgyNjQsXG5cdDgzNzQsXG5cdDgzODAsXG5cdDgzODEsXG5cdDgzODQsXG5cdDgzODgsXG5cdDgzOTAsXG5cdDgzOTIsXG5cdDgzOTMsXG5cdDgzOTQsXG5cdDgzOTYsXG5cdDg0MDEsXG5cdDg0MDYsXG5cdDg0MTYsXG5cdDg0MTksXG5cdDg0MjQsXG5cdDg0MzcsXG5cdDg0MzksXG5cdDg0NDUsXG5cdDg0ODIsXG5cdDg0ODUsXG5cdDg0OTYsXG5cdDg1MjEsXG5cdDg2MDMsXG5cdDg5MzYsXG5cdDg5NDYsXG5cdDkwNDYsXG5cdDkwNTAsXG5cdDkwNjMsXG5cdDkwNjYsXG5cdDkwNzYsXG5cdDkwOTIsXG5cdDkxMDAsXG5cdDkxMDgsXG5cdDkxMTEsXG5cdDkxMTMsXG5cdDkxMzEsXG5cdDkxNjIsXG5cdDkxNjQsXG5cdDkyMTgsXG5cdDkyMTksXG5cdDExMzI5LFxuXHQxMTMzMSxcblx0MTEzMzQsXG5cdDExMzM2LFxuXHQxMTM0Nixcblx0MTEzNjEsXG5cdDExMzYzLFxuXHQxMTM2Nixcblx0MTEzNzAsXG5cdDExMzcyLFxuXHQxMTM3NSxcblx0MTEzODksXG5cdDExNjgyLFxuXHQxMTY4Nixcblx0MTE2ODcsXG5cdDExNjkyLFxuXHQxMTY5NCxcblx0MTE3MTQsXG5cdDExNzE2LFxuXHQxMTcyMyxcblx0MTE3MjUsXG5cdDExNzMwLFxuXHQxMTczNixcblx0MTE5ODIsXG5cdDExOTg5LFxuXHQxMjEwMixcblx0MTIzMzYsXG5cdDEyMzQ4LFxuXHQxMjM1MCxcblx0MTIzODQsXG5cdDEyMzkzLFxuXHQxMjM5NSxcblx0MTIzOTcsXG5cdDEyNTEwLFxuXHQxMjU1Myxcblx0MTI4NTEsXG5cdDEyOTYyLFxuXHQxMjk3Myxcblx0MTM3MzgsXG5cdDEzODIzLFxuXHQxMzkxOSxcblx0MTM5MzMsXG5cdDE0MDgwLFxuXHQxNDI5OCxcblx0MTQ1ODUsXG5cdDE0Njk4LFxuXHQxNTU4Myxcblx0MTU4NDcsXG5cdDE2MzE4LFxuXHQxNjQzNCxcblx0MTY0MzgsXG5cdDE2NDgxLFxuXHQxNjcyOSxcblx0MTcxMDIsXG5cdDE3MTIyLFxuXHQxNzMxNSxcblx0MTczMjAsXG5cdDE3NDAyLFxuXHQxNzQxOCxcblx0MTc4NTksXG5cdDE3OTA5LFxuXHQxNzkxMSxcblx0MTc5MTUsXG5cdDE3OTE2LFxuXHQxNzkzNixcblx0MTc5MzksXG5cdDE3OTYxLFxuXHQxODY2NCxcblx0MTg3MDMsXG5cdDE4ODE0LFxuXHQxODk2Mixcblx0MTkwNDMsXG5cdDMzNDY5LFxuXHQzMzQ3MCxcblx0MzM0NzEsXG5cdDMzNDg0LFxuXHQzMzQ4NSxcblx0MzM0OTAsXG5cdDMzNDk3LFxuXHQzMzUwMSxcblx0MzM1MDUsXG5cdDMzNTEzLFxuXHQzMzUyMCxcblx0MzM1MzYsXG5cdDMzNTUwLFxuXHQzNzg0NSxcblx0Mzc5MjEsXG5cdDM3OTQ4LFxuXHQzODAyOSxcblx0MzgwMzgsXG5cdDM4MDY0LFxuXHQzODA2NSxcblx0MzgwNjYsXG5cdDM4MDY5LFxuXHQzODA3NSxcblx0MzgwNzYsXG5cdDM4MDc4LFxuXHQzOTEwOCxcblx0MzkxMDksXG5cdDM5MTEzLFxuXHQzOTExNCxcblx0MzkxMTUsXG5cdDM5MTE2LFxuXHQzOTI2NSxcblx0MzkzOTQsXG5cdDE4OTAwMFxuXTtcbnZhciBnYjE4MDMwUmFuZ2VzID0ge1xuXHR1Q2hhcnM6IHVDaGFycyxcblx0Z2JDaGFyczogZ2JDaGFyc1xufTtcblxudmFyIGdiMTgwMzBSYW5nZXMkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHR1Q2hhcnM6IHVDaGFycyxcblx0Z2JDaGFyczogZ2JDaGFycyxcblx0J2RlZmF1bHQnOiBnYjE4MDMwUmFuZ2VzXG59KTtcblxudmFyIGNwOTQ5ID0gW1xuXHRbXG5cdFx0XCIwXCIsXG5cdFx0XCJcXHUwMDAwXCIsXG5cdFx0MTI3XG5cdF0sXG5cdFtcblx0XHRcIjgxNDFcIixcblx0XHRcIuqwguqwg+qwheqwhuqwi1wiLFxuXHRcdDQsXG5cdFx0XCLqsJjqsJ7qsJ/qsKHqsKLqsKPqsKVcIixcblx0XHQ2LFxuXHRcdFwi6rCu6rCy6rCz6rC0XCJcblx0XSxcblx0W1xuXHRcdFwiODE2MVwiLFxuXHRcdFwi6rC16rC26rC36rC66rC76rC96rC+6rC/6rGBXCIsXG5cdFx0OSxcblx0XHRcIuqxjOqxjlwiLFxuXHRcdDUsXG5cdFx0XCLqsZVcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MTgxXCIsXG5cdFx0XCLqsZbqsZfqsZnqsZrqsZvqsZ1cIixcblx0XHQxOCxcblx0XHRcIuqxsuqxs+qxteqxtuqxueqxu1wiLFxuXHRcdDQsXG5cdFx0XCLqsoLqsofqsojqso3qso7qso/qspHqspLqspPqspVcIixcblx0XHQ2LFxuXHRcdFwi6rKe6rKiXCIsXG5cdFx0NSxcblx0XHRcIuqyq+qyreqyruqysVwiLFxuXHRcdDYsXG5cdFx0XCLqsrrqsr7qsr/qs4Dqs4Lqs4Pqs4Xqs4bqs4fqs4nqs4rqs4vqs41cIixcblx0XHQ3LFxuXHRcdFwi6rOW6rOYXCIsXG5cdFx0Nyxcblx0XHRcIuqzouqzo+qzpeqzpuqzqeqzq+qzreqzruqzsuqztOqzt1wiLFxuXHRcdDQsXG5cdFx0XCLqs77qs7/qtIHqtILqtIPqtIXqtIdcIixcblx0XHQ0LFxuXHRcdFwi6rSO6rSQ6rSS6rSTXCJcblx0XSxcblx0W1xuXHRcdFwiODI0MVwiLFxuXHRcdFwi6rSU6rSV6rSW6rSX6rSZ6rSa6rSb6rSd6rSe6rSf6rShXCIsXG5cdFx0Nyxcblx0XHRcIuq0quq0q+q0rlwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiODI2MVwiLFxuXHRcdFwi6rS26rS36rS56rS66rS76rS9XCIsXG5cdFx0Nixcblx0XHRcIuq1huq1iOq1ilwiLFxuXHRcdDUsXG5cdFx0XCLqtZHqtZLqtZPqtZXqtZbqtZdcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MjgxXCIsXG5cdFx0XCLqtZlcIixcblx0XHQ3LFxuXHRcdFwi6rWi6rWkXCIsXG5cdFx0Nyxcblx0XHRcIuq1ruq1r+q1seq1suq1t+q1uOq1ueq1uuq1vuq2gOq2g1wiLFxuXHRcdDQsXG5cdFx0XCLqtorqtovqto3qto7qto/qtpFcIixcblx0XHQxMCxcblx0XHRcIuq2nlwiLFxuXHRcdDUsXG5cdFx0XCLqtqVcIixcblx0XHQxNyxcblx0XHRcIuq2uFwiLFxuXHRcdDcsXG5cdFx0XCLqt4Lqt4Pqt4Xqt4bqt4fqt4lcIixcblx0XHQ2LFxuXHRcdFwi6reS6reUXCIsXG5cdFx0Nyxcblx0XHRcIuq3neq3nuq3n+q3oeq3ouq3o+q3pVwiLFxuXHRcdDE4XG5cdF0sXG5cdFtcblx0XHRcIjgzNDFcIixcblx0XHRcIuq3uuq3u+q3veq3vuq4glwiLFxuXHRcdDUsXG5cdFx0XCLquIrquIzquI5cIixcblx0XHQ1LFxuXHRcdFwi6riVXCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCI4MzYxXCIsXG5cdFx0XCLquJ1cIixcblx0XHQxOCxcblx0XHRcIuq4suq4s+q4teq4tuq4ueq4u+q4vFwiXG5cdF0sXG5cdFtcblx0XHRcIjgzODFcIixcblx0XHRcIuq4veq4vuq4v+q5guq5hOq5h+q5iOq5ieq5i+q5j+q5keq5kuq5k+q5leq5l1wiLFxuXHRcdDQsXG5cdFx0XCLquZ7quaLquaPquaTquabquafquarquavqua3qua7qua/qubFcIixcblx0XHQ2LFxuXHRcdFwi6rm66rm+XCIsXG5cdFx0NSxcblx0XHRcIuq6hlwiLFxuXHRcdDUsXG5cdFx0XCLquo1cIixcblx0XHQ0Nixcblx0XHRcIuq6v+q7geq7guq7g+q7hVwiLFxuXHRcdDYsXG5cdFx0XCLqu47qu5JcIixcblx0XHQ1LFxuXHRcdFwi6rua6rub6rudXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI4NDQxXCIsXG5cdFx0XCLqu6bqu6fqu6nqu6rqu6zqu65cIixcblx0XHQ1LFxuXHRcdFwi6ru16ru26ru36ru56ru66ru76ru9XCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI4NDYxXCIsXG5cdFx0XCLqvIbqvInqvIrqvIvqvIzqvI7qvI/qvJFcIixcblx0XHQxOFxuXHRdLFxuXHRbXG5cdFx0XCI4NDgxXCIsXG5cdFx0XCLqvKRcIixcblx0XHQ3LFxuXHRcdFwi6ryu6ryv6ryx6ryz6ry1XCIsXG5cdFx0Nixcblx0XHRcIuq8vuq9gOq9hOq9heq9huq9h+q9ilwiLFxuXHRcdDUsXG5cdFx0XCLqvZFcIixcblx0XHQxMCxcblx0XHRcIuq9nlwiLFxuXHRcdDUsXG5cdFx0XCLqvaZcIixcblx0XHQxOCxcblx0XHRcIuq9ulwiLFxuXHRcdDUsXG5cdFx0XCLqvoHqvoLqvoPqvoXqvobqvofqvolcIixcblx0XHQ2LFxuXHRcdFwi6r6S6r6T6r6U6r6WXCIsXG5cdFx0NSxcblx0XHRcIuq+nVwiLFxuXHRcdDI2LFxuXHRcdFwi6r666r676r696r6+XCJcblx0XSxcblx0W1xuXHRcdFwiODU0MVwiLFxuXHRcdFwi6r6/6r+BXCIsXG5cdFx0NSxcblx0XHRcIuq/iuq/jOq/j1wiLFxuXHRcdDQsXG5cdFx0XCLqv5VcIixcblx0XHQ2LFxuXHRcdFwi6r+dXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCI4NTYxXCIsXG5cdFx0XCLqv6JcIixcblx0XHQ1LFxuXHRcdFwi6r+qXCIsXG5cdFx0NSxcblx0XHRcIuq/suq/s+q/teq/tuq/t+q/uVwiLFxuXHRcdDYsXG5cdFx0XCLrgILrgINcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NTgxXCIsXG5cdFx0XCLrgIVcIixcblx0XHQ2LFxuXHRcdFwi64CN64CO64CP64CR64CS64CT64CVXCIsXG5cdFx0Nixcblx0XHRcIuuAnlwiLFxuXHRcdDksXG5cdFx0XCLrgKlcIixcblx0XHQyNixcblx0XHRcIuuBhuuBh+uBieuBi+uBjeuBj+uBkOuBkeuBkuuBluuBmOuBmuuBm+uBnOuBnlwiLFxuXHRcdDI5LFxuXHRcdFwi64G+64G/64KB64KC64KD64KFXCIsXG5cdFx0Nixcblx0XHRcIuuCjuuCkOuCklwiLFxuXHRcdDUsXG5cdFx0XCLrgpvrgp3rgp7rgqPrgqRcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NjQxXCIsXG5cdFx0XCLrgqXrgqbrgqfrgqrrgrDrgrLrgrbrgrfrgrnrgrrrgrvrgr1cIixcblx0XHQ2LFxuXHRcdFwi64OG64OKXCIsXG5cdFx0NSxcblx0XHRcIuuDklwiXG5cdF0sXG5cdFtcblx0XHRcIjg2NjFcIixcblx0XHRcIuuDk+uDleuDluuDl+uDmVwiLFxuXHRcdDYsXG5cdFx0XCLrg6Hrg6Lrg6Prg6Trg6ZcIixcblx0XHQxMFxuXHRdLFxuXHRbXG5cdFx0XCI4NjgxXCIsXG5cdFx0XCLrg7FcIixcblx0XHQyMixcblx0XHRcIuuEiuuEjeuEjuuEj+uEkeuElOuEleuEluuEl+uEmuuEnlwiLFxuXHRcdDQsXG5cdFx0XCLrhKbrhKfrhKnrhKrrhKvrhK1cIixcblx0XHQ2LFxuXHRcdFwi64S264S6XCIsXG5cdFx0NSxcblx0XHRcIuuFguuFg+uFheuFhuuFh+uFiVwiLFxuXHRcdDYsXG5cdFx0XCLrhZLrhZPrhZbrhZfrhZnrhZrrhZvrhZ3rhZ7rhZ/rhaFcIixcblx0XHQyMixcblx0XHRcIuuFuuuFu+uFveuFvuuFv+uGgeuGg1wiLFxuXHRcdDQsXG5cdFx0XCLrhorrhozrho7rho/rhpDrhpHrhpXrhpbrhpfrhpnrhprrhpvrhp1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4NzQxXCIsXG5cdFx0XCLrhp5cIixcblx0XHQ5LFxuXHRcdFwi64apXCIsXG5cdFx0MTVcblx0XSxcblx0W1xuXHRcdFwiODc2MVwiLFxuXHRcdFwi64a5XCIsXG5cdFx0MTgsXG5cdFx0XCLrh43rh47rh4/rh5Hrh5Lrh5Prh5VcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NzgxXCIsXG5cdFx0XCLrh5ZcIixcblx0XHQ1LFxuXHRcdFwi64ee64egXCIsXG5cdFx0Nyxcblx0XHRcIuuHquuHq+uHreuHruuHr+uHsVwiLFxuXHRcdDcsXG5cdFx0XCLrh7rrh7zrh75cIixcblx0XHQ1LFxuXHRcdFwi64iG64iH64iJ64iK64iNXCIsXG5cdFx0Nixcblx0XHRcIuuIluuImOuImlwiLFxuXHRcdDUsXG5cdFx0XCLriKFcIixcblx0XHQxOCxcblx0XHRcIuuItVwiLFxuXHRcdDYsXG5cdFx0XCLriL1cIixcblx0XHQyNixcblx0XHRcIuuJmeuJmuuJm+uJneuJnuuJn+uJoVwiLFxuXHRcdDYsXG5cdFx0XCLriapcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcIjg4NDFcIixcblx0XHRcIuuJr1wiLFxuXHRcdDQsXG5cdFx0XCLribZcIixcblx0XHQ1LFxuXHRcdFwi64m9XCIsXG5cdFx0Nixcblx0XHRcIuuKhuuKh+uKiOuKilwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiODg2MVwiLFxuXHRcdFwi64qP64qS64qT64qV64qW64qX64qbXCIsXG5cdFx0NCxcblx0XHRcIuuKouuKpOuKp+uKqOuKqeuKq+uKreuKruuKr+uKseuKsuuKs+uKteuKtuuKt1wiXG5cdF0sXG5cdFtcblx0XHRcIjg4ODFcIixcblx0XHRcIuuKuFwiLFxuXHRcdDE1LFxuXHRcdFwi64uK64uL64uN64uO64uP64uR64uTXCIsXG5cdFx0NCxcblx0XHRcIuuLmuuLnOuLnuuLn+uLoOuLoeuLo+uLp+uLqeuLquuLsOuLseuLsuuLtuuLvOuLveuLvuuMguuMg+uMheuMhuuMh+uMiVwiLFxuXHRcdDYsXG5cdFx0XCLrjJLrjJZcIixcblx0XHQ1LFxuXHRcdFwi64ydXCIsXG5cdFx0NTQsXG5cdFx0XCLrjZfrjZnrjZrrjZ3rjaDrjaHrjaLrjaNcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OTQxXCIsXG5cdFx0XCLrjabrjajrjarrjazrja3rja/rjbLrjbPrjbXrjbbrjbfrjblcIixcblx0XHQ2LFxuXHRcdFwi646C646GXCIsXG5cdFx0NSxcblx0XHRcIuuOjVwiXG5cdF0sXG5cdFtcblx0XHRcIjg5NjFcIixcblx0XHRcIuuOjuuOj+uOkeuOkuuOk+uOlVwiLFxuXHRcdDEwLFxuXHRcdFwi646iXCIsXG5cdFx0NSxcblx0XHRcIuuOqeuOquuOq+uOrVwiXG5cdF0sXG5cdFtcblx0XHRcIjg5ODFcIixcblx0XHRcIuuOrlwiLFxuXHRcdDIxLFxuXHRcdFwi64+G64+H64+J64+K64+N64+P64+R64+S64+T64+W64+Y64+a64+c64+e64+f64+h64+i64+j64+l64+m64+n64+pXCIsXG5cdFx0MTgsXG5cdFx0XCLrj71cIixcblx0XHQxOCxcblx0XHRcIuuQkVwiLFxuXHRcdDYsXG5cdFx0XCLrkJnrkJrrkJvrkJ3rkJ7rkJ/rkKFcIixcblx0XHQ2LFxuXHRcdFwi65Cq65CsXCIsXG5cdFx0Nyxcblx0XHRcIuuQtVwiLFxuXHRcdDE1XG5cdF0sXG5cdFtcblx0XHRcIjhhNDFcIixcblx0XHRcIuuRhVwiLFxuXHRcdDEwLFxuXHRcdFwi65GS65GT65GV65GW65GX65GZXCIsXG5cdFx0Nixcblx0XHRcIuuRouuRpOuRplwiXG5cdF0sXG5cdFtcblx0XHRcIjhhNjFcIixcblx0XHRcIuuRp1wiLFxuXHRcdDQsXG5cdFx0XCLrka1cIixcblx0XHQxOCxcblx0XHRcIuuSgeuSglwiXG5cdF0sXG5cdFtcblx0XHRcIjhhODFcIixcblx0XHRcIuuSg1wiLFxuXHRcdDQsXG5cdFx0XCLrkolcIixcblx0XHQxOSxcblx0XHRcIuuSnlwiLFxuXHRcdDUsXG5cdFx0XCLrkqXrkqbrkqfrkqnrkqrrkqvrkq1cIixcblx0XHQ3LFxuXHRcdFwi65K265K465K6XCIsXG5cdFx0NSxcblx0XHRcIuuTgeuTguuTg+uTheuThuuTh+uTiVwiLFxuXHRcdDYsXG5cdFx0XCLrk5Hrk5Lrk5Prk5Trk5ZcIixcblx0XHQ1LFxuXHRcdFwi65Oe65Of65Oh65Oi65Ol65OnXCIsXG5cdFx0NCxcblx0XHRcIuuTruuTsOuTslwiLFxuXHRcdDUsXG5cdFx0XCLrk7lcIixcblx0XHQyNixcblx0XHRcIuuUluuUl+uUmeuUmuuUnVwiXG5cdF0sXG5cdFtcblx0XHRcIjhiNDFcIixcblx0XHRcIuuUnlwiLFxuXHRcdDUsXG5cdFx0XCLrlKbrlKtcIixcblx0XHQ0LFxuXHRcdFwi65Sy65Sz65S165S265S365S5XCIsXG5cdFx0Nixcblx0XHRcIuuVguuVhlwiXG5cdF0sXG5cdFtcblx0XHRcIjhiNjFcIixcblx0XHRcIuuVh+uViOuVieuViuuVjuuVj+uVkeuVkuuVk+uVlVwiLFxuXHRcdDYsXG5cdFx0XCLrlZ7rlaJcIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjhiODFcIixcblx0XHRcIuuVq1wiLFxuXHRcdDUyLFxuXHRcdFwi65ai65aj65al65am65an65ap65as65at65au65av65ay65a2XCIsXG5cdFx0NCxcblx0XHRcIuuWvuuWv+uXgeuXguuXg+uXhVwiLFxuXHRcdDYsXG5cdFx0XCLrl47rl5JcIixcblx0XHQ1LFxuXHRcdFwi65eZXCIsXG5cdFx0MTgsXG5cdFx0XCLrl61cIixcblx0XHQxOFxuXHRdLFxuXHRbXG5cdFx0XCI4YzQxXCIsXG5cdFx0XCLrmIBcIixcblx0XHQxNSxcblx0XHRcIuuYkuuYk+uYleuYluuYl+uYmVwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiOGM2MVwiLFxuXHRcdFwi65ieXCIsXG5cdFx0Nixcblx0XHRcIuuYplwiLFxuXHRcdDUsXG5cdFx0XCLrmK1cIixcblx0XHQ2LFxuXHRcdFwi65i1XCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI4YzgxXCIsXG5cdFx0XCLrmLtcIixcblx0XHQxMixcblx0XHRcIuuZiVwiLFxuXHRcdDI2LFxuXHRcdFwi65ml65mm65mn65mpXCIsXG5cdFx0NTAsXG5cdFx0XCLrmp7rmp/rmqHrmqLrmqPrmqVcIixcblx0XHQ1LFxuXHRcdFwi65qt65qu65qv65qw65qyXCIsXG5cdFx0MTZcblx0XSxcblx0W1xuXHRcdFwiOGQ0MVwiLFxuXHRcdFwi65uDXCIsXG5cdFx0MTYsXG5cdFx0XCLrm5VcIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjhkNjFcIixcblx0XHRcIuubnlwiLFxuXHRcdDE3LFxuXHRcdFwi65ux65uy65uz65u165u265u365u565u6XCJcblx0XSxcblx0W1xuXHRcdFwiOGQ4MVwiLFxuXHRcdFwi65u7XCIsXG5cdFx0NCxcblx0XHRcIuucguucg+uchOuchlwiLFxuXHRcdDMzLFxuXHRcdFwi65yq65yr65yt65yu65yxXCIsXG5cdFx0Nixcblx0XHRcIuucuuucvFwiLFxuXHRcdDcsXG5cdFx0XCLrnYXrnYbrnYfrnYnrnYrrnYvrnY1cIixcblx0XHQ2LFxuXHRcdFwi652WXCIsXG5cdFx0OSxcblx0XHRcIuudoeudouudo+udpeudpuudp+udqVwiLFxuXHRcdDYsXG5cdFx0XCLrnbLrnbTrnbZcIixcblx0XHQ1LFxuXHRcdFwi652+652/656B656C656D656FXCIsXG5cdFx0Nixcblx0XHRcIuuejuuek+uelOueleuemuuem+ueneuenlwiXG5cdF0sXG5cdFtcblx0XHRcIjhlNDFcIixcblx0XHRcIuuen+ueoVwiLFxuXHRcdDYsXG5cdFx0XCLrnqrrnq5cIixcblx0XHQ1LFxuXHRcdFwi656265636565XCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI4ZTYxXCIsXG5cdFx0XCLrn4JcIixcblx0XHQ0LFxuXHRcdFwi65+I65+KXCIsXG5cdFx0MTlcblx0XSxcblx0W1xuXHRcdFwiOGU4MVwiLFxuXHRcdFwi65+eXCIsXG5cdFx0MTMsXG5cdFx0XCLrn67rn6/rn7Hrn7Lrn7Prn7VcIixcblx0XHQ2LFxuXHRcdFwi65++66CCXCIsXG5cdFx0NCxcblx0XHRcIuugiuugi+ugjeugjuugj+ugkVwiLFxuXHRcdDYsXG5cdFx0XCLroJrroJzroJ5cIixcblx0XHQ1LFxuXHRcdFwi66Cm66Cn66Cp66Cq66Cr66CtXCIsXG5cdFx0Nixcblx0XHRcIuugtuugulwiLFxuXHRcdDUsXG5cdFx0XCLroYHroYLroYProYVcIixcblx0XHQxMSxcblx0XHRcIuuhkuuhlFwiLFxuXHRcdDcsXG5cdFx0XCLroZ7roZ/roaHroaLroaProaVcIixcblx0XHQ2LFxuXHRcdFwi66Gu66Gw66GyXCIsXG5cdFx0NSxcblx0XHRcIuuhueuhuuuhu+uhvVwiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiOGY0MVwiLFxuXHRcdFwi66KFXCIsXG5cdFx0Nyxcblx0XHRcIuuijlwiLFxuXHRcdDE3XG5cdF0sXG5cdFtcblx0XHRcIjhmNjFcIixcblx0XHRcIuuioFwiLFxuXHRcdDcsXG5cdFx0XCLroqlcIixcblx0XHQ2LFxuXHRcdFwi66Kx66Ky66Kz66K166K266K366K5XCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCI4ZjgxXCIsXG5cdFx0XCLror7ror/ro4Lro4Tro4ZcIixcblx0XHQ1LFxuXHRcdFwi66ON66OO66OP66OR66OS66OT66OVXCIsXG5cdFx0Nyxcblx0XHRcIuujnuujoOujolwiLFxuXHRcdDUsXG5cdFx0XCLro6rro6vro63ro67ro6/ro7FcIixcblx0XHQ2LFxuXHRcdFwi66O666O866O+XCIsXG5cdFx0NSxcblx0XHRcIuukhVwiLFxuXHRcdDE4LFxuXHRcdFwi66SZXCIsXG5cdFx0Nixcblx0XHRcIuukoVwiLFxuXHRcdDI2LFxuXHRcdFwi66S+66S/66WB66WC66WD66WFXCIsXG5cdFx0Nixcblx0XHRcIuuljeuljuulkOulklwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiOTA0MVwiLFxuXHRcdFwi66Wa66Wb66Wd66We66Wf66WhXCIsXG5cdFx0Nixcblx0XHRcIuulquulrOulrlwiLFxuXHRcdDUsXG5cdFx0XCLrpbbrpbfrpbnrpbrrpbvrpb1cIlxuXHRdLFxuXHRbXG5cdFx0XCI5MDYxXCIsXG5cdFx0XCLrpb5cIixcblx0XHQ1LFxuXHRcdFwi66aG66aI66aL66aM66aPXCIsXG5cdFx0MTVcblx0XSxcblx0W1xuXHRcdFwiOTA4MVwiLFxuXHRcdFwi66afXCIsXG5cdFx0MTIsXG5cdFx0XCLrpq7rpq/rprHrprLrprPrprVcIixcblx0XHQ2LFxuXHRcdFwi66a+66eA66eCXCIsXG5cdFx0NSxcblx0XHRcIuuniuuni+unjeunk1wiLFxuXHRcdDQsXG5cdFx0XCLrp5rrp5zrp5/rp6Drp6Lrp6brp6frp6nrp6rrp6vrp61cIixcblx0XHQ2LFxuXHRcdFwi66e266e7XCIsXG5cdFx0NCxcblx0XHRcIuuoglwiLFxuXHRcdDUsXG5cdFx0XCLrqIlcIixcblx0XHQxMSxcblx0XHRcIuuollwiLFxuXHRcdDMzLFxuXHRcdFwi66i666i766i966i+66i/66mB66mD66mE66mF66mGXCJcblx0XSxcblx0W1xuXHRcdFwiOTE0MVwiLFxuXHRcdFwi66mH66mK66mM66mP66mQ66mR66mS66mW66mX66mZ66ma66mb66mdXCIsXG5cdFx0Nixcblx0XHRcIuuppuupqlwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiOTE2MVwiLFxuXHRcdFwi66my66mz66m166m266m366m5XCIsXG5cdFx0OSxcblx0XHRcIuuqhuuqiOuqieuqiuuqi+uqjVwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiOTE4MVwiLFxuXHRcdFwi66qTXCIsXG5cdFx0MjAsXG5cdFx0XCLrqqrrqq3rqq7rqq/rqrHrqrNcIixcblx0XHQ0LFxuXHRcdFwi66q666q866q+XCIsXG5cdFx0NSxcblx0XHRcIuurheurhuurh+uriVwiLFxuXHRcdDE0LFxuXHRcdFwi66uaXCIsXG5cdFx0MzMsXG5cdFx0XCLrq73rq77rq7/rrIHrrILrrIPrrIVcIixcblx0XHQ3LFxuXHRcdFwi66yO66yQ66ySXCIsXG5cdFx0NSxcblx0XHRcIuusmeusmuusm+usneusnuusn+usoVwiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiOTI0MVwiLFxuXHRcdFwi66yo66yq66ysXCIsXG5cdFx0Nyxcblx0XHRcIuust+usueusuuusv1wiLFxuXHRcdDQsXG5cdFx0XCLrrYbrrYjrrYrrrYvrrYzrrY7rrZHrrZJcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MjYxXCIsXG5cdFx0XCLrrZPrrZXrrZbrrZfrrZlcIixcblx0XHQ3LFxuXHRcdFwi662i662kXCIsXG5cdFx0Nyxcblx0XHRcIuutrVwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiOTI4MVwiLFxuXHRcdFwi662yXCIsXG5cdFx0MjEsXG5cdFx0XCLrronrrorrrovrro3rro7rro/rrpFcIixcblx0XHQxOCxcblx0XHRcIuuupeuupuuup+uuqeuuquuuq+uurVwiLFxuXHRcdDYsXG5cdFx0XCLrrrXrrrbrrrhcIixcblx0XHQ3LFxuXHRcdFwi66+B66+C66+D66+F66+G66+H66+JXCIsXG5cdFx0Nixcblx0XHRcIuuvkeuvkuuvlFwiLFxuXHRcdDM1LFxuXHRcdFwi66+666+766+966++67CBXCJcblx0XSxcblx0W1xuXHRcdFwiOTM0MVwiLFxuXHRcdFwi67CDXCIsXG5cdFx0NCxcblx0XHRcIuuwiuuwjuuwkOuwkuuwk+uwmeuwmuuwoOuwoeuwouuwo+uwpuuwqOuwquuwq+uwrOuwruuwr+uwsuuws+uwtVwiXG5cdF0sXG5cdFtcblx0XHRcIjkzNjFcIixcblx0XHRcIuuwtuuwt+uwuVwiLFxuXHRcdDYsXG5cdFx0XCLrsYLrsYbrsYfrsYjrsYrrsYvrsY7rsY/rsZFcIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjkzODFcIixcblx0XHRcIuuxmuuxm+uxnOuxnlwiLFxuXHRcdDM3LFxuXHRcdFwi67KG67KH67KJ67KK67KN67KPXCIsXG5cdFx0NCxcblx0XHRcIuuyluuymOuym1wiLFxuXHRcdDQsXG5cdFx0XCLrsqLrsqPrsqXrsqbrsqlcIixcblx0XHQ2LFxuXHRcdFwi67Ky67K2XCIsXG5cdFx0NSxcblx0XHRcIuuyvuuyv+uzgeuzguuzg+uzhVwiLFxuXHRcdDcsXG5cdFx0XCLrs47rs5Lrs5Prs5Trs5brs5frs5nrs5rrs5vrs51cIixcblx0XHQyMixcblx0XHRcIuuzt+uzueuzuuuzu+uzvVwiXG5cdF0sXG5cdFtcblx0XHRcIjk0NDFcIixcblx0XHRcIuuzvlwiLFxuXHRcdDUsXG5cdFx0XCLrtIbrtIjrtIpcIixcblx0XHQ1LFxuXHRcdFwi67SR67SS67ST67SVXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI5NDYxXCIsXG5cdFx0XCLrtJ5cIixcblx0XHQ1LFxuXHRcdFwi67SlXCIsXG5cdFx0Nixcblx0XHRcIuu0rVwiLFxuXHRcdDEyXG5cdF0sXG5cdFtcblx0XHRcIjk0ODFcIixcblx0XHRcIuu0ulwiLFxuXHRcdDUsXG5cdFx0XCLrtYFcIixcblx0XHQ2LFxuXHRcdFwi67WK67WL67WN67WO67WP67WRXCIsXG5cdFx0Nixcblx0XHRcIuu1mlwiLFxuXHRcdDksXG5cdFx0XCLrtaXrtabrtafrtalcIixcblx0XHQyMixcblx0XHRcIuu2guu2g+u2heu2huu2i1wiLFxuXHRcdDQsXG5cdFx0XCLrtpLrtpTrtpbrtpfrtpjrtpvrtp1cIixcblx0XHQ2LFxuXHRcdFwi67alXCIsXG5cdFx0MTAsXG5cdFx0XCLrtrFcIixcblx0XHQ2LFxuXHRcdFwi67a5XCIsXG5cdFx0MjRcblx0XSxcblx0W1xuXHRcdFwiOTU0MVwiLFxuXHRcdFwi67eS67eT67eW67eX67eZ67ea67eb67edXCIsXG5cdFx0MTEsXG5cdFx0XCLrt6pcIixcblx0XHQ1LFxuXHRcdFwi67exXCJcblx0XSxcblx0W1xuXHRcdFwiOTU2MVwiLFxuXHRcdFwi67ey67ez67e167e267e367e5XCIsXG5cdFx0Nixcblx0XHRcIuu4geu4guu4hOu4hlwiLFxuXHRcdDUsXG5cdFx0XCLruI7ruI/ruJHruJLruJNcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NTgxXCIsXG5cdFx0XCLruJVcIixcblx0XHQ2LFxuXHRcdFwi67ie67igXCIsXG5cdFx0MzUsXG5cdFx0XCLruYbruYfruYnruYrruYvruY3ruY9cIixcblx0XHQ0LFxuXHRcdFwi67mW67mY67mc67md67me67mf67mi67mj67ml67mm67mn67mp67mrXCIsXG5cdFx0NCxcblx0XHRcIuu5suu5tlwiLFxuXHRcdDQsXG5cdFx0XCLrub7rub/ruoHruoLruoPruoVcIixcblx0XHQ2LFxuXHRcdFwi67qO67qSXCIsXG5cdFx0NSxcblx0XHRcIuu6mlwiLFxuXHRcdDEzLFxuXHRcdFwi67qpXCIsXG5cdFx0MTRcblx0XSxcblx0W1xuXHRcdFwiOTY0MVwiLFxuXHRcdFwi67q4XCIsXG5cdFx0MjMsXG5cdFx0XCLru5Lru5NcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NjYxXCIsXG5cdFx0XCLru5Xru5bru5lcIixcblx0XHQ2LFxuXHRcdFwi67uh67ui67umXCIsXG5cdFx0NSxcblx0XHRcIuu7rVwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiOTY4MVwiLFxuXHRcdFwi67u2XCIsXG5cdFx0MTAsXG5cdFx0XCLrvIJcIixcblx0XHQ1LFxuXHRcdFwi67yKXCIsXG5cdFx0MTMsXG5cdFx0XCLrvJrrvJ5cIixcblx0XHQzMyxcblx0XHRcIuu9guu9g+u9heu9huu9h+u9iVwiLFxuXHRcdDYsXG5cdFx0XCLrvZLrvZPrvZTrvZZcIixcblx0XHQ0NFxuXHRdLFxuXHRbXG5cdFx0XCI5NzQxXCIsXG5cdFx0XCLrvoNcIixcblx0XHQxNixcblx0XHRcIuu+lVwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiOTc2MVwiLFxuXHRcdFwi676eXCIsXG5cdFx0MTcsXG5cdFx0XCLrvrFcIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcIjk3ODFcIixcblx0XHRcIuu+uVwiLFxuXHRcdDExLFxuXHRcdFwi67+GXCIsXG5cdFx0NSxcblx0XHRcIuu/juu/j+u/keu/kuu/k+u/lVwiLFxuXHRcdDYsXG5cdFx0XCLrv53rv57rv6Drv6JcIixcblx0XHQ4OSxcblx0XHRcIuyAveyAvuyAv1wiXG5cdF0sXG5cdFtcblx0XHRcIjk4NDFcIixcblx0XHRcIuyBgFwiLFxuXHRcdDE2LFxuXHRcdFwi7IGSXCIsXG5cdFx0NSxcblx0XHRcIuyBmeyBmuyBm1wiXG5cdF0sXG5cdFtcblx0XHRcIjk4NjFcIixcblx0XHRcIuyBneyBnuyBn+yBoVwiLFxuXHRcdDYsXG5cdFx0XCLsgapcIixcblx0XHQxNVxuXHRdLFxuXHRbXG5cdFx0XCI5ODgxXCIsXG5cdFx0XCLsgbpcIixcblx0XHQyMSxcblx0XHRcIuyCkuyCk+yCleyCluyCl+yCmVwiLFxuXHRcdDYsXG5cdFx0XCLsgqLsgqTsgqZcIixcblx0XHQ1LFxuXHRcdFwi7IKu7IKx7IKy7IK3XCIsXG5cdFx0NCxcblx0XHRcIuyCvuyDguyDg+yDhOyDhuyDh+yDiuyDi+yDjeyDjuyDj+yDkVwiLFxuXHRcdDYsXG5cdFx0XCLsg5rsg55cIixcblx0XHQ1LFxuXHRcdFwi7IOm7IOn7IOp7IOq7IOr7IOtXCIsXG5cdFx0Nixcblx0XHRcIuyDtuyDuOyDulwiLFxuXHRcdDUsXG5cdFx0XCLshIHshILshIPshIXshIbshIfshIlcIixcblx0XHQ2LFxuXHRcdFwi7ISR7ISS7IST7ISU7ISWXCIsXG5cdFx0NSxcblx0XHRcIuyEoeyEouyEpeyEqOyEqeyEquyEq+yErlwiXG5cdF0sXG5cdFtcblx0XHRcIjk5NDFcIixcblx0XHRcIuyEsuyEs+yEtOyEteyEt+yEuuyEu+yEveyEvuyEv+yFgVwiLFxuXHRcdDYsXG5cdFx0XCLshYrshY5cIixcblx0XHQ1LFxuXHRcdFwi7IWW7IWXXCJcblx0XSxcblx0W1xuXHRcdFwiOTk2MVwiLFxuXHRcdFwi7IWZ7IWa7IWb7IWdXCIsXG5cdFx0Nixcblx0XHRcIuyFpuyFqlwiLFxuXHRcdDUsXG5cdFx0XCLshbHshbLshbPshbXshbbshbfshbnshbrshbtcIlxuXHRdLFxuXHRbXG5cdFx0XCI5OTgxXCIsXG5cdFx0XCLshbxcIixcblx0XHQ4LFxuXHRcdFwi7IaGXCIsXG5cdFx0NSxcblx0XHRcIuyGj+yGkeyGkuyGk+yGleyGl1wiLFxuXHRcdDQsXG5cdFx0XCLshp7shqDshqLshqPshqTshqbshqfshqrshqvshq3shq7shq/shrFcIixcblx0XHQxMSxcblx0XHRcIuyGvlwiLFxuXHRcdDUsXG5cdFx0XCLsh4Xsh4bsh4fsh4nsh4rsh4vsh41cIixcblx0XHQ2LFxuXHRcdFwi7IeV7IeW7IeZXCIsXG5cdFx0Nixcblx0XHRcIuyHoeyHouyHo+yHpeyHpuyHp+yHqVwiLFxuXHRcdDYsXG5cdFx0XCLsh7Lsh7RcIixcblx0XHQ3LFxuXHRcdFwi7Ie+7Ie/7IiB7IiC7IiD7IiFXCIsXG5cdFx0Nixcblx0XHRcIuyIjuyIkOyIklwiLFxuXHRcdDUsXG5cdFx0XCLsiJrsiJvsiJ3siJ7siKHsiKLsiKNcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YTQxXCIsXG5cdFx0XCLsiKTsiKXsiKbsiKfsiKrsiKzsiK7siLDsiLPsiLVcIixcblx0XHQxNlxuXHRdLFxuXHRbXG5cdFx0XCI5YTYxXCIsXG5cdFx0XCLsiYbsiYfsiYlcIixcblx0XHQ2LFxuXHRcdFwi7ImS7ImT7ImV7ImW7ImX7ImZXCIsXG5cdFx0Nixcblx0XHRcIuyJoeyJouyJo+yJpOyJplwiXG5cdF0sXG5cdFtcblx0XHRcIjlhODFcIixcblx0XHRcIuyJp1wiLFxuXHRcdDQsXG5cdFx0XCLsia7sia/sibHsibLsibPsibVcIixcblx0XHQ2LFxuXHRcdFwi7Im+7IqA7IqCXCIsXG5cdFx0NSxcblx0XHRcIuyKilwiLFxuXHRcdDUsXG5cdFx0XCLsipFcIixcblx0XHQ2LFxuXHRcdFwi7IqZ7Iqa7Iqc7IqeXCIsXG5cdFx0NSxcblx0XHRcIuyKpuyKp+yKqeyKquyKq+yKrlwiLFxuXHRcdDUsXG5cdFx0XCLsirbsirjsirpcIixcblx0XHQzMyxcblx0XHRcIuyLnuyLn+yLoeyLouyLpVwiLFxuXHRcdDUsXG5cdFx0XCLsi67si7Dsi7Lsi7Psi7Tsi7Xsi7fsi7rsi73si77si7/sjIFcIixcblx0XHQ2LFxuXHRcdFwi7IyK7IyL7IyO7IyPXCJcblx0XSxcblx0W1xuXHRcdFwiOWI0MVwiLFxuXHRcdFwi7IyQ7IyR7IyS7IyW7IyX7IyZ7Iya7Iyb7IydXCIsXG5cdFx0Nixcblx0XHRcIuyMpuyMp+yMqlwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiOWI2MVwiLFxuXHRcdFwi7IyzXCIsXG5cdFx0MTcsXG5cdFx0XCLsjYZcIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcIjliODFcIixcblx0XHRcIuyNjlwiLFxuXHRcdDI1LFxuXHRcdFwi7I2q7I2r7I2t7I2u7I2v7I2x7I2zXCIsXG5cdFx0NCxcblx0XHRcIuyNuuyNu+yNvlwiLFxuXHRcdDUsXG5cdFx0XCLsjoXsjobsjofsjonsjorsjovsjo1cIixcblx0XHQ1MCxcblx0XHRcIuyPgVwiLFxuXHRcdDIyLFxuXHRcdFwi7I+aXCJcblx0XSxcblx0W1xuXHRcdFwiOWM0MVwiLFxuXHRcdFwi7I+b7I+d7I+e7I+h7I+jXCIsXG5cdFx0NCxcblx0XHRcIuyPquyPq+yPrOyPrlwiLFxuXHRcdDUsXG5cdFx0XCLsj7bsj7fsj7lcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjljNjFcIixcblx0XHRcIuyPv1wiLFxuXHRcdDgsXG5cdFx0XCLskIlcIixcblx0XHQ2LFxuXHRcdFwi7JCRXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCI5YzgxXCIsXG5cdFx0XCLskJtcIixcblx0XHQ4LFxuXHRcdFwi7JClXCIsXG5cdFx0Nixcblx0XHRcIuyQreyQruyQr+yQseyQsuyQs+yQtVwiLFxuXHRcdDYsXG5cdFx0XCLskL5cIixcblx0XHQ5LFxuXHRcdFwi7JGJXCIsXG5cdFx0MjYsXG5cdFx0XCLskabskafskanskarskavska1cIixcblx0XHQ2LFxuXHRcdFwi7JG27JG37JG47JG6XCIsXG5cdFx0NSxcblx0XHRcIuySgVwiLFxuXHRcdDE4LFxuXHRcdFwi7JKVXCIsXG5cdFx0Nixcblx0XHRcIuySnVwiLFxuXHRcdDEyXG5cdF0sXG5cdFtcblx0XHRcIjlkNDFcIixcblx0XHRcIuySqlwiLFxuXHRcdDEzLFxuXHRcdFwi7JK57JK67JK77JK9XCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI5ZDYxXCIsXG5cdFx0XCLsk4ZcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCI5ZDgxXCIsXG5cdFx0XCLsk6BcIixcblx0XHQ4LFxuXHRcdFwi7JOqXCIsXG5cdFx0NSxcblx0XHRcIuyTsuyTs+yTteyTtuyTt+yTueyTu+yTvOyTveyTvuyUglwiLFxuXHRcdDksXG5cdFx0XCLslI3slI7slI/slJHslJLslJPslJVcIixcblx0XHQ2LFxuXHRcdFwi7JSdXCIsXG5cdFx0MTAsXG5cdFx0XCLslKrslKvslK3slK7slK/slLFcIixcblx0XHQ2LFxuXHRcdFwi7JS67JS87JS+XCIsXG5cdFx0NSxcblx0XHRcIuyVhuyVh+yVi+yVj+yVkOyVkeyVkuyVluyVmuyVm+yVnOyVn+yVouyVo+yVpeyVpuyVp+yVqVwiLFxuXHRcdDYsXG5cdFx0XCLslbLslbZcIixcblx0XHQ1LFxuXHRcdFwi7JW+7JW/7JaB7JaC7JaD7JaF7JaG7JaI7JaJ7JaK7JaL7JaO7JaQ7JaS7JaT7JaUXCJcblx0XSxcblx0W1xuXHRcdFwiOWU0MVwiLFxuXHRcdFwi7JaW7JaZ7Jaa7Jab7Jad7Jae7Jaf7JahXCIsXG5cdFx0Nyxcblx0XHRcIuyWqlwiLFxuXHRcdDksXG5cdFx0XCLslrZcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZTYxXCIsXG5cdFx0XCLslrfslrrslr9cIixcblx0XHQ0LFxuXHRcdFwi7JeL7JeN7JeP7JeS7JeT7JeV7JeW7JeX7JeZXCIsXG5cdFx0Nixcblx0XHRcIuyXouyXpOyXpuyXp1wiXG5cdF0sXG5cdFtcblx0XHRcIjllODFcIixcblx0XHRcIuyXqOyXqeyXquyXq+yXr+yXseyXsuyXs+yXteyXuOyXueyXuuyXu+yYguyYg+yYhOyYieyYiuyYi+yYjeyYjuyYj+yYkVwiLFxuXHRcdDYsXG5cdFx0XCLsmJrsmJ1cIixcblx0XHQ2LFxuXHRcdFwi7Jim7Jin7Jip7Jiq7Jir7Jiv7Jix7Jiy7Ji27Ji47Ji67Ji87Ji97Ji+7Ji/7JmC7JmD7JmF7JmG7JmH7JmJXCIsXG5cdFx0Nixcblx0XHRcIuyZkuyZllwiLFxuXHRcdDUsXG5cdFx0XCLsmZ7smZ/smaFcIixcblx0XHQxMCxcblx0XHRcIuyZreyZruyZsOyZslwiLFxuXHRcdDUsXG5cdFx0XCLsmbrsmbvsmb3smb7smb/smoFcIixcblx0XHQ2LFxuXHRcdFwi7JqK7JqM7JqOXCIsXG5cdFx0NSxcblx0XHRcIuyaluyal+yameyamuyam+yanVwiLFxuXHRcdDYsXG5cdFx0XCLsmqZcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZjQxXCIsXG5cdFx0XCLsmqjsmqpcIixcblx0XHQ1LFxuXHRcdFwi7Jqy7Jqz7Jq17Jq27Jq37Jq7XCIsXG5cdFx0NCxcblx0XHRcIuybguybhOybhlwiLFxuXHRcdDUsXG5cdFx0XCLsm45cIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZjYxXCIsXG5cdFx0XCLsm4/sm5Hsm5Lsm5Psm5VcIixcblx0XHQ2LFxuXHRcdFwi7Jue7Juf7JuiXCIsXG5cdFx0NSxcblx0XHRcIuybquybq+ybreybruybr+ybseybslwiXG5cdF0sXG5cdFtcblx0XHRcIjlmODFcIixcblx0XHRcIuybs1wiLFxuXHRcdDQsXG5cdFx0XCLsm7rsm7vsm7zsm75cIixcblx0XHQ1LFxuXHRcdFwi7JyG7JyH7JyJ7JyK7JyL7JyNXCIsXG5cdFx0Nixcblx0XHRcIuycluycmOycmlwiLFxuXHRcdDUsXG5cdFx0XCLsnKLsnKPsnKXsnKbsnKfsnKlcIixcblx0XHQ2LFxuXHRcdFwi7Jyy7Jy07Jy27Jy47Jy57Jy67Jy77Jy+7Jy/7J2B7J2C7J2D7J2FXCIsXG5cdFx0NCxcblx0XHRcIuydi+ydjuydkOydmeydmuydm+ydneydnuydn+ydoVwiLFxuXHRcdDYsXG5cdFx0XCLsnansnarsnaxcIixcblx0XHQ3LFxuXHRcdFwi7J227J237J257J267J277J2/7J6A7J6B7J6C7J6G7J6L7J6M7J6N7J6P7J6S7J6T7J6V7J6Z7J6bXCIsXG5cdFx0NCxcblx0XHRcIuyeouyep1wiLFxuXHRcdDQsXG5cdFx0XCLsnq7snq/snrHsnrLsnrPsnrXsnrbsnrdcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMDQxXCIsXG5cdFx0XCLsnrjsnrnsnrrsnrvsnr7sn4JcIixcblx0XHQ1LFxuXHRcdFwi7J+K7J+L7J+N7J+P7J+RXCIsXG5cdFx0Nixcblx0XHRcIuyfmeyfmuyfm+yfnFwiXG5cdF0sXG5cdFtcblx0XHRcImEwNjFcIixcblx0XHRcIuyfnlwiLFxuXHRcdDUsXG5cdFx0XCLsn6Xsn6bsn6fsn6nsn6rsn6vsn61cIixcblx0XHQxM1xuXHRdLFxuXHRbXG5cdFx0XCJhMDgxXCIsXG5cdFx0XCLsn7tcIixcblx0XHQ0LFxuXHRcdFwi7KCC7KCD7KCF7KCG7KCH7KCJ7KCLXCIsXG5cdFx0NCxcblx0XHRcIuygkuyglOygl1wiLFxuXHRcdDQsXG5cdFx0XCLsoJ7soJ/soKHsoKLsoKPsoKVcIixcblx0XHQ2LFxuXHRcdFwi7KCu7KCw7KCyXCIsXG5cdFx0NSxcblx0XHRcIuygueyguuygu+ygveygvuygv+yhgVwiLFxuXHRcdDYsXG5cdFx0XCLsoYrsoYvsoY5cIixcblx0XHQ1LFxuXHRcdFwi7KGVXCIsXG5cdFx0MjYsXG5cdFx0XCLsobLsobPsobXsobbsobfsobnsobtcIixcblx0XHQ0LFxuXHRcdFwi7KKC7KKE7KKI7KKJ7KKK7KKOXCIsXG5cdFx0NSxcblx0XHRcIuyilVwiLFxuXHRcdDcsXG5cdFx0XCLsop7soqDsoqLsoqPsoqRcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMTQxXCIsXG5cdFx0XCLsoqXsoqbsoqfsoqlcIixcblx0XHQxOCxcblx0XHRcIuyivuyiv+yjgOyjgVwiXG5cdF0sXG5cdFtcblx0XHRcImExNjFcIixcblx0XHRcIuyjguyjg+yjheyjhuyjh+yjieyjiuyji+yjjVwiLFxuXHRcdDYsXG5cdFx0XCLso5bso5jso5pcIixcblx0XHQ1LFxuXHRcdFwi7KOi7KOj7KOlXCJcblx0XSxcblx0W1xuXHRcdFwiYTE4MVwiLFxuXHRcdFwi7KOmXCIsXG5cdFx0MTQsXG5cdFx0XCLso7ZcIixcblx0XHQ1LFxuXHRcdFwi7KO+7KO/7KSB7KSC7KSD7KSHXCIsXG5cdFx0NCxcblx0XHRcIuykjuOAgOOAgeOAgsK34oCl4oCmwqjjgIPCreKAleKIpe+8vOKIvOKAmOKAmeKAnOKAneOAlOOAleOAiFwiLFxuXHRcdDksXG5cdFx0XCLCscOXw7fiiaDiiaTiiaXiiJ7iiLTCsOKAsuKAs+KEg+KEq++/oO+/oe+/peKZguKZgOKIoOKKpeKMkuKIguKIh+KJoeKJksKn4oC74piG4piF4peL4peP4peO4peH4peG4pah4pag4paz4pay4pa94pa84oaS4oaQ4oaR4oaT4oaU44CT4omq4omr4oia4oi94oid4oi14oir4ois4oiI4oiL4oqG4oqH4oqC4oqD4oiq4oip4oin4oio77+iXCJcblx0XSxcblx0W1xuXHRcdFwiYTI0MVwiLFxuXHRcdFwi7KSQ7KSSXCIsXG5cdFx0NSxcblx0XHRcIuykmVwiLFxuXHRcdDE4XG5cdF0sXG5cdFtcblx0XHRcImEyNjFcIixcblx0XHRcIuykrVwiLFxuXHRcdDYsXG5cdFx0XCLspLVcIixcblx0XHQxOFxuXHRdLFxuXHRbXG5cdFx0XCJhMjgxXCIsXG5cdFx0XCLspYhcIixcblx0XHQ3LFxuXHRcdFwi7KWS7KWT7KWV7KWW7KWX7KWZXCIsXG5cdFx0Nixcblx0XHRcIuylouylpFwiLFxuXHRcdDcsXG5cdFx0XCLspa3spa7spa/ih5Lih5TiiIDiiIPCtO+9nsuHy5jLncuay5nCuMubwqHCv8uQ4oiu4oiR4oiPwqTihInigLDil4Hil4DilrfilrbimaTimaDimaHimaXimafimaPiipnil4jilqPil5Dil5HilpLilqTilqXilqjilqfilqbilqnimajimI/imI7imJzimJ7CtuKAoOKAoeKGleKGl+KGmeKGluKGmOKZreKZqeKZquKZrOOJv+OInOKEluOPh+KEouOPguOPmOKEoeKCrMKuXCJcblx0XSxcblx0W1xuXHRcdFwiYTM0MVwiLFxuXHRcdFwi7KWx7KWy7KWz7KW1XCIsXG5cdFx0Nixcblx0XHRcIuylvVwiLFxuXHRcdDEwLFxuXHRcdFwi7KaK7KaL7KaN7KaO7KaPXCJcblx0XSxcblx0W1xuXHRcdFwiYTM2MVwiLFxuXHRcdFwi7KaRXCIsXG5cdFx0Nixcblx0XHRcIuymmuymnOymnlwiLFxuXHRcdDE2XG5cdF0sXG5cdFtcblx0XHRcImEzODFcIixcblx0XHRcIuymr1wiLFxuXHRcdDE2LFxuXHRcdFwi7KeC7KeD7KeF7KeG7KeJ7KeLXCIsXG5cdFx0NCxcblx0XHRcIuynkuynlOynl+ynmOynm++8gVwiLFxuXHRcdDU4LFxuXHRcdFwi77+m77y9XCIsXG5cdFx0MzIsXG5cdFx0XCLvv6NcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNDQxXCIsXG5cdFx0XCLsp57sp5/sp6Hsp6Psp6Xsp6bsp6jsp6nsp6rsp6vsp67sp7JcIixcblx0XHQ1LFxuXHRcdFwi7Ke67Ke77Ke97Ke+7Ke/7KiB7KiC7KiD7KiEXCJcblx0XSxcblx0W1xuXHRcdFwiYTQ2MVwiLFxuXHRcdFwi7KiF7KiG7KiH7KiK7KiOXCIsXG5cdFx0NSxcblx0XHRcIuyoleyoluyol+yomVwiLFxuXHRcdDEyXG5cdF0sXG5cdFtcblx0XHRcImE0ODFcIixcblx0XHRcIuyopuyop+yoqOyoqlwiLFxuXHRcdDI4LFxuXHRcdFwi44SxXCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiYTU0MVwiLFxuXHRcdFwi7KmHXCIsXG5cdFx0NCxcblx0XHRcIuypjuypj+ypkeypkuypk+yplVwiLFxuXHRcdDYsXG5cdFx0XCLsqZ7sqaJcIixcblx0XHQ1LFxuXHRcdFwi7Kmp7KmqXCJcblx0XSxcblx0W1xuXHRcdFwiYTU2MVwiLFxuXHRcdFwi7KmrXCIsXG5cdFx0MTcsXG5cdFx0XCLsqb5cIixcblx0XHQ1LFxuXHRcdFwi7KqF7KqGXCJcblx0XSxcblx0W1xuXHRcdFwiYTU4MVwiLFxuXHRcdFwi7KqHXCIsXG5cdFx0MTYsXG5cdFx0XCLsqplcIixcblx0XHQxNCxcblx0XHRcIuKFsFwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiYTViMFwiLFxuXHRcdFwi4oWgXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCJhNWMxXCIsXG5cdFx0XCLOkVwiLFxuXHRcdDE2LFxuXHRcdFwizqNcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImE1ZTFcIixcblx0XHRcIs6xXCIsXG5cdFx0MTYsXG5cdFx0XCLPg1wiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiYTY0MVwiLFxuXHRcdFwi7KqoXCIsXG5cdFx0MTksXG5cdFx0XCLsqr7sqr/sq4Hsq4Lsq4Psq4VcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNjYxXCIsXG5cdFx0XCLsq4ZcIixcblx0XHQ1LFxuXHRcdFwi7KuO7KuQ7KuS7KuU7KuV7KuW7KuX7KuaXCIsXG5cdFx0NSxcblx0XHRcIuyroVwiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiYTY4MVwiLFxuXHRcdFwi7Kuo7Kup7Kuq7Kur7KutXCIsXG5cdFx0Nixcblx0XHRcIuyrtVwiLFxuXHRcdDE4LFxuXHRcdFwi7KyJ7KyK4pSA4pSC4pSM4pSQ4pSY4pSU4pSc4pSs4pSk4pS04pS84pSB4pSD4pSP4pST4pSb4pSX4pSj4pSz4pSr4pS74pWL4pSg4pSv4pSo4pS34pS/4pSd4pSw4pSl4pS44pWC4pSS4pSR4pSa4pSZ4pSW4pSV4pSO4pSN4pSe4pSf4pSh4pSi4pSm4pSn4pSp4pSq4pSt4pSu4pSx4pSy4pS14pS24pS54pS64pS94pS+4pWA4pWB4pWDXCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCJhNzQxXCIsXG5cdFx0XCLsrItcIixcblx0XHQ0LFxuXHRcdFwi7KyR7KyS7KyT7KyV7KyW7KyX7KyZXCIsXG5cdFx0Nixcblx0XHRcIuysolwiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiYTc2MVwiLFxuXHRcdFwi7KyqXCIsXG5cdFx0MjIsXG5cdFx0XCLsrYLsrYPsrYRcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNzgxXCIsXG5cdFx0XCLsrYXsrYbsrYfsrYrsrYvsrY3srY7srY/srZFcIixcblx0XHQ2LFxuXHRcdFwi7K2a7K2b7K2c7K2eXCIsXG5cdFx0NSxcblx0XHRcIuytpVwiLFxuXHRcdDcsXG5cdFx0XCLjjpXjjpbjjpfihJPjjpjjj4TjjqPjjqTjjqXjjqbjjplcIixcblx0XHQ5LFxuXHRcdFwi44+K446N446O446P44+P446I446J44+I446n446o446wXCIsXG5cdFx0OSxcblx0XHRcIuOOgFwiLFxuXHRcdDQsXG5cdFx0XCLjjrpcIixcblx0XHQ1LFxuXHRcdFwi446QXCIsXG5cdFx0NCxcblx0XHRcIuKEpuOPgOOPgeOOiuOOi+OOjOOPluOPheOOreOOruOOr+OPm+OOqeOOquOOq+OOrOOPneOPkOOPk+OPg+OPieOPnOOPhlwiXG5cdF0sXG5cdFtcblx0XHRcImE4NDFcIixcblx0XHRcIuytrVwiLFxuXHRcdDEwLFxuXHRcdFwi7K26XCIsXG5cdFx0MTRcblx0XSxcblx0W1xuXHRcdFwiYTg2MVwiLFxuXHRcdFwi7K6JXCIsXG5cdFx0MTgsXG5cdFx0XCLsrp1cIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImE4ODFcIixcblx0XHRcIuyupFwiLFxuXHRcdDE5LFxuXHRcdFwi7K65XCIsXG5cdFx0MTEsXG5cdFx0XCLDhsOQwqrEplwiXG5cdF0sXG5cdFtcblx0XHRcImE4YTZcIixcblx0XHRcIsSyXCJcblx0XSxcblx0W1xuXHRcdFwiYThhOFwiLFxuXHRcdFwixL/FgcOYxZLCusOexabFilwiXG5cdF0sXG5cdFtcblx0XHRcImE4YjFcIixcblx0XHRcIuOJoFwiLFxuXHRcdDI3LFxuXHRcdFwi4pOQXCIsXG5cdFx0MjUsXG5cdFx0XCLikaBcIixcblx0XHQxNCxcblx0XHRcIsK94oWT4oWUwrzCvuKFm+KFnOKFneKFnlwiXG5cdF0sXG5cdFtcblx0XHRcImE5NDFcIixcblx0XHRcIuyvhVwiLFxuXHRcdDE0LFxuXHRcdFwi7K+VXCIsXG5cdFx0MTBcblx0XSxcblx0W1xuXHRcdFwiYTk2MVwiLFxuXHRcdFwi7K+g7K+h7K+i7K+j7K+l7K+m7K+o7K+qXCIsXG5cdFx0MThcblx0XSxcblx0W1xuXHRcdFwiYTk4MVwiLFxuXHRcdFwi7K+9XCIsXG5cdFx0MTQsXG5cdFx0XCLssI7ssI/ssJHssJLssJPssJVcIixcblx0XHQ2LFxuXHRcdFwi7LCe7LCf7LCg7LCj7LCkw6bEkcOwxKfEscSzxLjFgMWCw7jFk8Ofw77Fp8WLxYnjiIBcIixcblx0XHQyNyxcblx0XHRcIuKSnFwiLFxuXHRcdDI1LFxuXHRcdFwi4pG0XCIsXG5cdFx0MTQsXG5cdFx0XCLCucKywrPigbTigb/igoHigoLigoPigoRcIlxuXHRdLFxuXHRbXG5cdFx0XCJhYTQxXCIsXG5cdFx0XCLssKXssKbssKrssKvssK3ssK/ssLFcIixcblx0XHQ2LFxuXHRcdFwi7LC67LC/XCIsXG5cdFx0NCxcblx0XHRcIuyxhuyxh+yxieyxiuyxi+yxjeyxjlwiXG5cdF0sXG5cdFtcblx0XHRcImFhNjFcIixcblx0XHRcIuyxj1wiLFxuXHRcdDQsXG5cdFx0XCLssZbssZpcIixcblx0XHQ1LFxuXHRcdFwi7LGh7LGi7LGj7LGl7LGn7LGpXCIsXG5cdFx0Nixcblx0XHRcIuyxseyxslwiXG5cdF0sXG5cdFtcblx0XHRcImFhODFcIixcblx0XHRcIuyxs+yxtOyxtlwiLFxuXHRcdDI5LFxuXHRcdFwi44GBXCIsXG5cdFx0ODJcblx0XSxcblx0W1xuXHRcdFwiYWI0MVwiLFxuXHRcdFwi7LKU7LKV7LKW7LKX7LKa7LKb7LKd7LKe7LKf7LKhXCIsXG5cdFx0Nixcblx0XHRcIuyyquyyrlwiLFxuXHRcdDUsXG5cdFx0XCLssrbssrfssrlcIlxuXHRdLFxuXHRbXG5cdFx0XCJhYjYxXCIsXG5cdFx0XCLssrrssrvssr1cIixcblx0XHQ2LFxuXHRcdFwi7LOG7LOI7LOKXCIsXG5cdFx0NSxcblx0XHRcIuyzkeyzkuyzk+yzlVwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiYWI4MVwiLFxuXHRcdFwi7LObXCIsXG5cdFx0OCxcblx0XHRcIuyzpVwiLFxuXHRcdDYsXG5cdFx0XCLss63ss67ss6/ss7FcIixcblx0XHQxMixcblx0XHRcIuOCoVwiLFxuXHRcdDg1XG5cdF0sXG5cdFtcblx0XHRcImFjNDFcIixcblx0XHRcIuyzvuyzv+y0gOy0glwiLFxuXHRcdDUsXG5cdFx0XCLstIrstIvstI3stI7stI/stJFcIixcblx0XHQ2LFxuXHRcdFwi7LSa7LSc7LSe7LSf7LSgXCJcblx0XSxcblx0W1xuXHRcdFwiYWM2MVwiLFxuXHRcdFwi7LSh7LSi7LSj7LSl7LSm7LSn7LSp7LSq7LSr7LStXCIsXG5cdFx0MTEsXG5cdFx0XCLstLpcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImFjODFcIixcblx0XHRcIuy0v1wiLFxuXHRcdDI4LFxuXHRcdFwi7LWd7LWe7LWf0JBcIixcblx0XHQ1LFxuXHRcdFwi0IHQllwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcImFjZDFcIixcblx0XHRcItCwXCIsXG5cdFx0NSxcblx0XHRcItGR0LZcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCJhZDQxXCIsXG5cdFx0XCLstaHstaLstaPstaVcIixcblx0XHQ2LFxuXHRcdFwi7LWu7LWw7LWyXCIsXG5cdFx0NSxcblx0XHRcIuy1uVwiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiYWQ2MVwiLFxuXHRcdFwi7LaBXCIsXG5cdFx0Nixcblx0XHRcIuy2iVwiLFxuXHRcdDEwLFxuXHRcdFwi7LaW7LaX7LaZ7Laa7Lab7Lad7Lae7LafXCJcblx0XSxcblx0W1xuXHRcdFwiYWQ4MVwiLFxuXHRcdFwi7Lag7Lah7Lai7Laj7Lam7Lao7LaqXCIsXG5cdFx0NSxcblx0XHRcIuy2sVwiLFxuXHRcdDE4LFxuXHRcdFwi7LeFXCJcblx0XSxcblx0W1xuXHRcdFwiYWU0MVwiLFxuXHRcdFwi7LeGXCIsXG5cdFx0NSxcblx0XHRcIuy3jey3juy3j+y3kVwiLFxuXHRcdDE2XG5cdF0sXG5cdFtcblx0XHRcImFlNjFcIixcblx0XHRcIuy3olwiLFxuXHRcdDUsXG5cdFx0XCLst6nst6rst6vst63st67st6/st7FcIixcblx0XHQ2LFxuXHRcdFwi7Le67Le87Le+XCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJhZTgxXCIsXG5cdFx0XCLsuIPsuIXsuIbsuIfsuInsuIrsuIvsuI1cIixcblx0XHQ2LFxuXHRcdFwi7LiV7LiW7LiX7LiY7LiaXCIsXG5cdFx0NSxcblx0XHRcIuy4ouy4o+y4pey4puy4p+y4qey4quy4q1wiXG5cdF0sXG5cdFtcblx0XHRcImFmNDFcIixcblx0XHRcIuy4rOy4rey4ruy4r+y4suy4tOy4tlwiLFxuXHRcdDE5XG5cdF0sXG5cdFtcblx0XHRcImFmNjFcIixcblx0XHRcIuy5ilwiLFxuXHRcdDEzLFxuXHRcdFwi7Lma7Lmb7Lmd7Lme7LmiXCIsXG5cdFx0NSxcblx0XHRcIuy5quy5rFwiXG5cdF0sXG5cdFtcblx0XHRcImFmODFcIixcblx0XHRcIuy5rlwiLFxuXHRcdDUsXG5cdFx0XCLsubbsubfsubnsubrsubvsub1cIixcblx0XHQ2LFxuXHRcdFwi7LqG7LqI7LqKXCIsXG5cdFx0NSxcblx0XHRcIuy6kuy6k+y6ley6luy6l+y6mVwiXG5cdF0sXG5cdFtcblx0XHRcImIwNDFcIixcblx0XHRcIuy6mlwiLFxuXHRcdDUsXG5cdFx0XCLsuqLsuqZcIixcblx0XHQ1LFxuXHRcdFwi7LquXCIsXG5cdFx0MTJcblx0XSxcblx0W1xuXHRcdFwiYjA2MVwiLFxuXHRcdFwi7Lq7XCIsXG5cdFx0NSxcblx0XHRcIuy7glwiLFxuXHRcdDE5XG5cdF0sXG5cdFtcblx0XHRcImIwODFcIixcblx0XHRcIuy7llwiLFxuXHRcdDEzLFxuXHRcdFwi7Lum7Lun7Lup7Luq7LutXCIsXG5cdFx0Nixcblx0XHRcIuy7tuy7ulwiLFxuXHRcdDUsXG5cdFx0XCLqsIDqsIHqsITqsIfqsIjqsInqsIrqsJBcIixcblx0XHQ3LFxuXHRcdFwi6rCZXCIsXG5cdFx0NCxcblx0XHRcIuqwoOqwpOqwrOqwreqwr+qwsOqwseqwuOqwueqwvOqxgOqxi+qxjeqxlOqxmOqxnOqxsOqxseqxtOqxt+qxuOqxuuqygOqygeqyg+qyhOqyheqyhuqyieqyiuqyi+qyjOqykOqylOqynOqyneqyn+qyoOqyoeqyqOqyqeqyquqyrOqyr+qysOqyuOqyueqyu+qyvOqyveqzgeqzhOqziOqzjOqzleqzl+qzoOqzoeqzpOqzp+qzqOqzquqzrOqzr+qzsOqzseqzs+qzteqztuqzvOqzveq0gOq0hOq0hlwiXG5cdF0sXG5cdFtcblx0XHRcImIxNDFcIixcblx0XHRcIuy8guy8g+y8hey8huy8h+y8iVwiLFxuXHRcdDYsXG5cdFx0XCLsvJLsvJTsvJZcIixcblx0XHQ1LFxuXHRcdFwi7Lyd7Lye7Lyf7Lyh7Lyi7LyjXCJcblx0XSxcblx0W1xuXHRcdFwiYjE2MVwiLFxuXHRcdFwi7LylXCIsXG5cdFx0Nixcblx0XHRcIuy8ruy8slwiLFxuXHRcdDUsXG5cdFx0XCLsvLlcIixcblx0XHQxMVxuXHRdLFxuXHRbXG5cdFx0XCJiMTgxXCIsXG5cdFx0XCLsvYVcIixcblx0XHQxNCxcblx0XHRcIuy9luy9l+y9mey9muy9m+y9nVwiLFxuXHRcdDYsXG5cdFx0XCLsvabsvajsvarsvavsvazqtIzqtI3qtI/qtJHqtJjqtJzqtKDqtKnqtKzqtK3qtLTqtLXqtLjqtLzqtYTqtYXqtYfqtYnqtZDqtZTqtZjqtaHqtaPqtazqta3qtbDqtbPqtbTqtbXqtbbqtbvqtbzqtb3qtb/qtoHqtoLqtojqtonqtozqtpDqtpzqtp3qtqTqtrfqt4Dqt4Hqt4Tqt4jqt5Dqt5Hqt5Pqt5zqt6Dqt6Tqt7jqt7nqt7zqt7/quIDquIHquIjquInquIvquI3quJTquLDquLHquLTquLfquLjquLrquYDquYHquYPquYXquYbquYrquYzquY3quY7quZDquZTquZbquZzquZ3quZ/quaDquaHquaXquajquanquazqubDqubhcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMjQxXCIsXG5cdFx0XCLsva3sva7sva/svbLsvbPsvbXsvbbsvbfsvblcIixcblx0XHQ2LFxuXHRcdFwi7L6B7L6C7L6D7L6E7L6GXCIsXG5cdFx0NSxcblx0XHRcIuy+jVwiXG5cdF0sXG5cdFtcblx0XHRcImIyNjFcIixcblx0XHRcIuy+jlwiLFxuXHRcdDE4LFxuXHRcdFwi7L6iXCIsXG5cdFx0NSxcblx0XHRcIuy+qVwiXG5cdF0sXG5cdFtcblx0XHRcImIyODFcIixcblx0XHRcIuy+qlwiLFxuXHRcdDUsXG5cdFx0XCLsvrFcIixcblx0XHQxOCxcblx0XHRcIuy/hVwiLFxuXHRcdDYsXG5cdFx0XCLqubnqubvqubzqub3quoTquoXquozqurzqur3qur7qu4Dqu4Tqu4zqu43qu4/qu5Dqu5Hqu5jqu5nqu5zqu6jqu6vqu63qu7Tqu7jqu7zqvIfqvIjqvI3qvJDqvKzqvK3qvLDqvLLqvLTqvLzqvL3qvL/qvYHqvYLqvYPqvYjqvYnqvZDqvZzqvZ3qvaTqvaXqvbnqvoDqvoTqvojqvpDqvpHqvpXqvpzqvrjqvrnqvrzqv4Dqv4fqv4jqv4nqv4vqv43qv47qv5Tqv5zqv6jqv6nqv7Dqv7Hqv7Tqv7jrgIDrgIHrgITrgIzrgJDrgJTrgJzrgJ3rgKjrgYTrgYXrgYjrgYrrgYzrgY7rgZPrgZTrgZXrgZfrgZlcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMzQxXCIsXG5cdFx0XCLsv4xcIixcblx0XHQxOSxcblx0XHRcIuy/ouy/o+y/pey/puy/p+y/qVwiXG5cdF0sXG5cdFtcblx0XHRcImIzNjFcIixcblx0XHRcIuy/qlwiLFxuXHRcdDUsXG5cdFx0XCLsv7Lsv7Tsv7ZcIixcblx0XHQ1LFxuXHRcdFwi7L+97L++7L+/7YCB7YCC7YCD7YCFXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCJiMzgxXCIsXG5cdFx0XCLtgItcIixcblx0XHQ1LFxuXHRcdFwi7YCSXCIsXG5cdFx0NSxcblx0XHRcIu2AmVwiLFxuXHRcdDE5LFxuXHRcdFwi64Gd64G864G964KA64KE64KM64KN64KP64KR64KY64KZ64Ka64Kc64Kf64Kg64Kh64Ki64Ko64Kp64KrXCIsXG5cdFx0NCxcblx0XHRcIuuCseuCs+uCtOuCteuCuOuCvOuDhOuDheuDh+uDiOuDieuDkOuDkeuDlOuDmOuDoOuDpeuEiOuEieuEi+uEjOuEkOuEkuuEk+uEmOuEmeuEm+uEnOuEneuEo+uEpOuEpeuEqOuErOuEtOuEteuEt+uEuOuEueuFgOuFgeuFhOuFiOuFkOuFkeuFlOuFleuFmOuFnOuFoOuFuOuFueuFvOuGgOuGguuGiOuGieuGi+uGjeuGkuuGk+uGlOuGmOuGnOuGqOuHjOuHkOuHlOuHnOuHnVwiXG5cdF0sXG5cdFtcblx0XHRcImI0NDFcIixcblx0XHRcIu2ArlwiLFxuXHRcdDUsXG5cdFx0XCLtgLbtgLftgLntgLrtgLvtgL1cIixcblx0XHQ2LFxuXHRcdFwi7YGG7YGI7YGKXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCJiNDYxXCIsXG5cdFx0XCLtgZHtgZLtgZPtgZXtgZbtgZftgZlcIixcblx0XHQ2LFxuXHRcdFwi7YGhXCIsXG5cdFx0MTAsXG5cdFx0XCLtga7tga9cIlxuXHRdLFxuXHRbXG5cdFx0XCJiNDgxXCIsXG5cdFx0XCLtgbHtgbLtgbPtgbVcIixcblx0XHQ2LFxuXHRcdFwi7YG+7YG/7YKA7YKCXCIsXG5cdFx0MTgsXG5cdFx0XCLrh5/rh6jrh6nrh6zrh7Drh7nrh7vrh73riITriIXriIjriIvriIzriJTriJXriJfriJnriKDriLTriLzriZjriZzriaDriajrianribTribXribzrioTrioXrionripDripHripTripjripnriprriqDriqHriqPriqXriqbriqrriqzrirDrirTri4jri4nri4zri5Dri5Lri5jri5nri5vri53ri6Lri6Tri6Xri6bri6jri6tcIixcblx0XHQ0LFxuXHRcdFwi64uz64u064u164u3XCIsXG5cdFx0NCxcblx0XHRcIuuLv+uMgOuMgeuMhOuMiOuMkOuMkeuMk+uMlOuMleuMnOuNlOuNleuNluuNmOuNm+uNnOuNnuuNn+uNpOuNpVwiXG5cdF0sXG5cdFtcblx0XHRcImI1NDFcIixcblx0XHRcIu2ClVwiLFxuXHRcdDE0LFxuXHRcdFwi7YKm7YKn7YKp7YKq7YKr7YKtXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCJiNTYxXCIsXG5cdFx0XCLtgrPtgrbtgrjtgrpcIixcblx0XHQ1LFxuXHRcdFwi7YOC7YOD7YOF7YOG7YOH7YOKXCIsXG5cdFx0NSxcblx0XHRcIu2Dku2DllwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiYjU4MVwiLFxuXHRcdFwi7YOb7YOe7YOf7YOh7YOi7YOj7YOlXCIsXG5cdFx0Nixcblx0XHRcIu2Dru2DslwiLFxuXHRcdDUsXG5cdFx0XCLtg7lcIixcblx0XHQxMSxcblx0XHRcIuuNp+uNqeuNq+uNruuNsOuNseuNtOuNuOuOgOuOgeuOg+uOhOuOheuOjOuOkOuOlOuOoOuOoeuOqOuOrOuPhOuPheuPiOuPi+uPjOuPjuuPkOuPlOuPleuPl+uPmeuPm+uPneuPoOuPpOuPqOuPvOuQkOuQmOuQnOuQoOuQqOuQqeuQq+uQtOuRkOuRkeuRlOuRmOuRoOuRoeuRo+uRpeuRrOuSgOuSiOuSneuSpOuSqOuSrOuSteuSt+uSueuTgOuThOuTiOuTkOuTleuTnOuTneuToOuTo+uTpOuTpuuTrOuTreuTr+uTseuTuOuUlOuUleuUmOuUm+uUnOuUpOuUpeuUp+uUqOuUqeuUquuUsOuUseuUtOuUuFwiXG5cdF0sXG5cdFtcblx0XHRcImI2NDFcIixcblx0XHRcIu2EhVwiLFxuXHRcdDcsXG5cdFx0XCLthI5cIixcblx0XHQxN1xuXHRdLFxuXHRbXG5cdFx0XCJiNjYxXCIsXG5cdFx0XCLthKBcIixcblx0XHQxNSxcblx0XHRcIu2Esu2Es+2Ete2Etu2Et+2Eue2Eu+2EvO2Eve2EvlwiXG5cdF0sXG5cdFtcblx0XHRcImI2ODFcIixcblx0XHRcIu2Ev+2Fgu2FhlwiLFxuXHRcdDUsXG5cdFx0XCLthY7thY/thZHthZLthZPthZVcIixcblx0XHQ2LFxuXHRcdFwi7YWe7YWg7YWiXCIsXG5cdFx0NSxcblx0XHRcIu2Fqe2Fqu2Fq+2FreuVgOuVgeuVg+uVhOuVheuVi+uVjOuVjeuVkOuVlOuVnOuVneuVn+uVoOuVoeuWoOuWoeuWpOuWqOuWquuWq+uWsOuWseuWs+uWtOuWteuWu+uWvOuWveuXgOuXhOuXjOuXjeuXj+uXkOuXkeuXmOuXrOuYkOuYkeuYlOuYmOuYpeuYrOuYtOuZiOuZpOuZqOuanOuaneuaoOuapOuaq+uarOuaseublOubsOubtOubuOucgOucgeucheucqOucqeucrOucr+ucsOucuOucueucu+udhOudiOudjOudlOudleudoOudpOudqOudsOudseuds+udteudvOudveuegOuehOuejOuejeuej+uekOuekeuekuueluuel1wiXG5cdF0sXG5cdFtcblx0XHRcImI3NDFcIixcblx0XHRcIu2FrlwiLFxuXHRcdDEzLFxuXHRcdFwi7YW9XCIsXG5cdFx0Nixcblx0XHRcIu2Ghe2Ghu2Gh+2Gie2GilwiXG5cdF0sXG5cdFtcblx0XHRcImI3NjFcIixcblx0XHRcIu2Gi1wiLFxuXHRcdDIwLFxuXHRcdFwi7Yai7Yaj7Yal7Yam7YanXCJcblx0XSxcblx0W1xuXHRcdFwiYjc4MVwiLFxuXHRcdFwi7YapXCIsXG5cdFx0Nixcblx0XHRcIu2Gsu2GtO2Gtu2Gt+2GuO2Gue2Gu+2Gve2Gvu2Gv+2HgVwiLFxuXHRcdDE0LFxuXHRcdFwi656Y656Z656c656g656o656p656r656s656t65606561656465+H65+J65+s65+t65+w65+065+865+965+/66CA66CB66CH66CI66CJ66CM66CQ66CY66CZ66Cb66Cd66Ck66Cl66Co66Cs66C066C166C366C466C566GA66GE66GR66GT66Gc66Gd66Gg66Gk66Gs66Gt66Gv66Gx66G466G866KN66Ko66Kw66K066K466OA66OB66OD66OF66OM66OQ66OU66Od66Of66Oh66Oo66Op66Os66Ow66O466O566O766O966SE66SY66Sg66S866S966WA66WE66WM66WP66WR66WY66WZ66Wc66Wg66Wo66WpXCJcblx0XSxcblx0W1xuXHRcdFwiYjg0MVwiLFxuXHRcdFwi7YeQXCIsXG5cdFx0Nyxcblx0XHRcIu2HmVwiLFxuXHRcdDE3XG5cdF0sXG5cdFtcblx0XHRcImI4NjFcIixcblx0XHRcIu2Hq1wiLFxuXHRcdDgsXG5cdFx0XCLth7Xth7bth7fth7lcIixcblx0XHQxM1xuXHRdLFxuXHRbXG5cdFx0XCJiODgxXCIsXG5cdFx0XCLtiIjtiIpcIixcblx0XHQ1LFxuXHRcdFwi7YiRXCIsXG5cdFx0MjQsXG5cdFx0XCLrpavrpa3rpbTrpbXrpbjrpbzrpoTrpoXrpofrponrporrpo3rpo7rpqzrpq3rprDrprTrprzrpr3rpr/rp4Hrp4jrp4nrp4zrp45cIixcblx0XHQ0LFxuXHRcdFwi66eY66eZ66eb66ed66ee66eh66ej66ek66el66eo66es66e066e166e366e466e566e666iA66iB66iI66iV66i466i566i866mA66mC66mI66mJ66mL66mN66mO66mT66mU66mV66mY66mc66mk66ml66mn66mo66mp66mw66mx66m066m466qD66qE66qF66qH66qM66qo66qp66qr66qs66qw66qy66q466q566q766q966uE66uI66uY66uZ66u8XCJcblx0XSxcblx0W1xuXHRcdFwiYjk0MVwiLFxuXHRcdFwi7Yiq7Yir7Yiu7Yiv7Yix7Yiy7Yiz7Yi1XCIsXG5cdFx0Nixcblx0XHRcIu2Ivu2JgO2JglwiLFxuXHRcdDUsXG5cdFx0XCLtiYntiYrtiYvtiYxcIlxuXHRdLFxuXHRbXG5cdFx0XCJiOTYxXCIsXG5cdFx0XCLtiY1cIixcblx0XHQxNCxcblx0XHRcIu2JnVwiLFxuXHRcdDYsXG5cdFx0XCLtiaXtiabtiaftiahcIlxuXHRdLFxuXHRbXG5cdFx0XCJiOTgxXCIsXG5cdFx0XCLtialcIixcblx0XHQyMixcblx0XHRcIu2Kgu2Kg+2Khe2Khu2Kh+2Kie2Kiu2Ki+2KjOusgOushOusjeusj+uskeusmOusnOusoOusqeusq+ustOusteustuusuOusu+usvOusveusvuuthOutheuth+utieutjeutj+utkOutlOutmOutoeuto+utrOuuiOuujOuukOuupOuuqOuurOuutOuut+uvgOuvhOuviOuvkOuvk+uvuOuvueuvvOuvv+uwgOuwguuwiOuwieuwi+uwjOuwjeuwj+uwkeuwlFwiLFxuXHRcdDQsXG5cdFx0XCLrsJtcIixcblx0XHQ0LFxuXHRcdFwi67Ck67Cl67Cn67Cp67Ct67Cw67Cx67C067C467GA67GB67GD67GE67GF67GJ67GM67GN67GQ67Gd67KE67KF67KI67KL67KM67KO67KU67KV67KXXCJcblx0XSxcblx0W1xuXHRcdFwiYmE0MVwiLFxuXHRcdFwi7YqN7YqO7YqP7YqS7YqT7YqU7YqWXCIsXG5cdFx0NSxcblx0XHRcIu2Kne2Knu2Kn+2Koe2Kou2Ko+2KpVwiLFxuXHRcdDYsXG5cdFx0XCLtiq1cIlxuXHRdLFxuXHRbXG5cdFx0XCJiYTYxXCIsXG5cdFx0XCLtiq7tiq/tirDtirJcIixcblx0XHQ1LFxuXHRcdFwi7Yq67Yq77Yq97Yq+7YuB7YuDXCIsXG5cdFx0NCxcblx0XHRcIu2Liu2LjFwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiYmE4MVwiLFxuXHRcdFwi7YuS7YuT7YuV7YuW7YuX7YuZ7Yua7Yub7YudXCIsXG5cdFx0Nixcblx0XHRcIu2LplwiLFxuXHRcdDksXG5cdFx0XCLti7Lti7Pti7Xti7bti7fti7nti7rrspnrsprrsqDrsqHrsqTrsqfrsqjrsrDrsrHrsrPrsrTrsrXrsrzrsr3rs4Drs4Trs43rs4/rs5Drs5Hrs5Xrs5jrs5zrs7Trs7Xrs7brs7jrs7zrtITrtIXrtIfrtInrtJDrtJTrtKTrtKzrtYDrtYjrtYnrtYzrtZDrtZjrtZnrtaTrtajrtoDrtoHrtoTrtofrtojrtonrtorrtpDrtpHrtpPrtpXrtpnrtprrtpzrtqTrtrDrtrjrt5Trt5Xrt5jrt5zrt6nrt7Drt7Trt7jruIDruIPruIXruIzruI3ruJDruJTruJzruJ3ruJ/ruYTruYXruYjruYzruY7ruZTruZXruZfruZnruZrruZvruaDruaHruaRcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYjQxXCIsXG5cdFx0XCLti7tcIixcblx0XHQ0LFxuXHRcdFwi7YyC7YyE7YyGXCIsXG5cdFx0NSxcblx0XHRcIu2Mj+2Mke2Mku2Mk+2Mle2Ml1wiLFxuXHRcdDQsXG5cdFx0XCLtjJ7tjKLtjKNcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYjYxXCIsXG5cdFx0XCLtjKTtjKbtjKftjKrtjKvtjK3tjK7tjK/tjLFcIixcblx0XHQ2LFxuXHRcdFwi7Yy67Yy+XCIsXG5cdFx0NSxcblx0XHRcIu2Nhu2Nh+2NiO2NiVwiXG5cdF0sXG5cdFtcblx0XHRcImJiODFcIixcblx0XHRcIu2NilwiLFxuXHRcdDMxLFxuXHRcdFwi67mo67mq67mw67mx67mz67m067m167m767m867m967qA67qE67qM67qN67qP67qQ67qR67qY67qZ67qo67uQ67uR67uU67uX67uY67ug67uj67uk67ul67us67yB67yI67yJ67yY67yZ67yb67yc67yd672A672B672E672I672Q672R672V676U676w67+F67+M67+N67+Q67+U67+c67+f67+h7IC87IGR7IGY7IGc7IGg7IGo7IGp7IKQ7IKR7IKU7IKY7IKg7IKh7IKj7IKl7IKs7IKt7IKv7IKw7IKz7IK07IK17IK27IK87IK97IK/7IOA7IOB7IOF7IOI7IOJ7IOM7IOQ7IOY7IOZ7IOb7IOc7IOd7IOkXCJcblx0XSxcblx0W1xuXHRcdFwiYmM0MVwiLFxuXHRcdFwi7Y2qXCIsXG5cdFx0MTcsXG5cdFx0XCLtjb7tjb/tjoHtjoLtjoPtjoXtjobtjodcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYzYxXCIsXG5cdFx0XCLtjojtjontjortjovtjo7tjpJcIixcblx0XHQ1LFxuXHRcdFwi7Y6a7Y6b7Y6d7Y6e7Y6f7Y6hXCIsXG5cdFx0Nixcblx0XHRcIu2Oqu2OrO2OrlwiXG5cdF0sXG5cdFtcblx0XHRcImJjODFcIixcblx0XHRcIu2Or1wiLFxuXHRcdDQsXG5cdFx0XCLtjrXtjrbtjrftjrntjrrtjrvtjr1cIixcblx0XHQ2LFxuXHRcdFwi7Y+G7Y+H7Y+KXCIsXG5cdFx0NSxcblx0XHRcIu2PkVwiLFxuXHRcdDUsXG5cdFx0XCLsg6Xsg6jsg6zsg7Tsg7Xsg7fsg7nshIDshITshIjshJDshJXshJxcIixcblx0XHQ0LFxuXHRcdFwi7ISj7ISk7ISm7ISn7ISs7ISt7ISv7ISw7ISx7IS27IS47IS57IS87IWA7IWI7IWJ7IWL7IWM7IWN7IWU7IWV7IWY7IWc7IWk7IWl7IWn7IWo7IWp7IWw7IW07IW47IaF7IaM7IaN7IaO7IaQ7IaU7IaW7Iac7Iad7Iaf7Iah7Ial7Iao7Iap7Ias7Iaw7Ia97IeE7IeI7IeM7IeU7IeX7IeY7Ieg7Iek7Ieo7Iew7Iex7Iez7Ie87Ie97IiA7IiE7IiM7IiN7IiP7IiR7IiY7IiZ7Iic7Iif7Iig7Iio7Iip7Iir7IitXCJcblx0XSxcblx0W1xuXHRcdFwiYmQ0MVwiLFxuXHRcdFwi7Y+X7Y+ZXCIsXG5cdFx0Nyxcblx0XHRcIu2Pou2PpFwiLFxuXHRcdDcsXG5cdFx0XCLtj67tj6/tj7Htj7Ltj7Ptj7Xtj7btj7dcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZDYxXCIsXG5cdFx0XCLtj7jtj7ntj7rtj7vtj77tkIDtkIJcIixcblx0XHQ1LFxuXHRcdFwi7ZCJXCIsXG5cdFx0MTNcblx0XSxcblx0W1xuXHRcdFwiYmQ4MVwiLFxuXHRcdFwi7ZCXXCIsXG5cdFx0NSxcblx0XHRcIu2QnlwiLFxuXHRcdDI1LFxuXHRcdFwi7Iiv7Iix7Iiy7Ii07ImI7ImQ7ImR7ImU7ImY7Img7Iml7Ims7Imt7Imw7Im07Im87Im97Im/7IqB7IqI7IqJ7IqQ7IqY7Iqb7Iqd7Iqk7Iql7Iqo7Iqs7Iqt7Iq07Iq17Iq37Iq57Iuc7Iud7Iug7Iuj7Iuk7Iur7Ius7Iut7Iuv7Iux7Iu27Iu47Iu57Iu77Iu87IyA7IyI7IyJ7IyM7IyN7IyT7IyU7IyV7IyY7Iyc7Iyk7Iyl7Iyo7Iyp7I2F7I2o7I2p7I2s7I2w7I2y7I247I257I287I297I6E7I6I7I6M7I+A7I+Y7I+Z7I+c7I+f7I+g7I+i7I+o7I+p7I+t7I+07I+17I+47JCI7JCQ7JCk7JCs7JCwXCJcblx0XSxcblx0W1xuXHRcdFwiYmU0MVwiLFxuXHRcdFwi7ZC4XCIsXG5cdFx0Nyxcblx0XHRcIu2Rge2Rgu2Rg+2RhVwiLFxuXHRcdDE0XG5cdF0sXG5cdFtcblx0XHRcImJlNjFcIixcblx0XHRcIu2RlFwiLFxuXHRcdDcsXG5cdFx0XCLtkZ3tkZ7tkZ/tkaHtkaLtkaPtkaVcIixcblx0XHQ3LFxuXHRcdFwi7ZGu7ZGw7ZGx7ZGyXCJcblx0XSxcblx0W1xuXHRcdFwiYmU4MVwiLFxuXHRcdFwi7ZGzXCIsXG5cdFx0NCxcblx0XHRcIu2Ruu2Ru+2Rve2Rvu2Sge2Sg1wiLFxuXHRcdDQsXG5cdFx0XCLtkortkoztko5cIixcblx0XHQ1LFxuXHRcdFwi7ZKVXCIsXG5cdFx0OCxcblx0XHRcIuyQtOyQvOyQveyRiOyRpOyRpeyRqOyRrOyRtOyRteyRueySgOySlOySnOySuOySvOyTqeyTsOyTseyTtOyTuOyTuuyTv+yUgOyUgeyUjOyUkOyUlOyUnOyUqOyUqeyUrOyUsOyUuOyUueyUu+yUveyVhOyVheyViOyVieyViuyVjOyVjeyVjuyVk+yVlOyVleyVl+yVmOyVmeyVneyVnuyVoOyVoeyVpOyVqOyVsOyVseyVs+yVtOyVteyVvOyVveyWgOyWhOyWh+yWjOyWjeyWj+yWkeyWleyWl+yWmOyWnOyWoOyWqeyWtOyWteyWuOyWueyWu+yWvOyWveyWvuyXhFwiLFxuXHRcdDYsXG5cdFx0XCLsl4zsl45cIlxuXHRdLFxuXHRbXG5cdFx0XCJiZjQxXCIsXG5cdFx0XCLtkp5cIixcblx0XHQxMCxcblx0XHRcIu2SqlwiLFxuXHRcdDE0XG5cdF0sXG5cdFtcblx0XHRcImJmNjFcIixcblx0XHRcIu2SuVwiLFxuXHRcdDE4LFxuXHRcdFwi7ZON7ZOO7ZOP7ZOR7ZOS7ZOT7ZOVXCJcblx0XSxcblx0W1xuXHRcdFwiYmY4MVwiLFxuXHRcdFwi7ZOWXCIsXG5cdFx0NSxcblx0XHRcIu2Tne2Tnu2ToFwiLFxuXHRcdDcsXG5cdFx0XCLtk6ntk6rtk6vtk63tk67tk6/tk7FcIixcblx0XHQ2LFxuXHRcdFwi7ZO57ZO67ZO87JeQ7JeR7JeU7JeY7Jeg7Jeh7Jej7Jel7Jes7Jet7Jeu7Jew7Je07Je27Je37Je8XCIsXG5cdFx0NSxcblx0XHRcIuyYheyYhuyYh+yYiOyYjOyYkOyYmOyYmeyYm+yYnOyYpOyYpeyYqOyYrOyYreyYruyYsOyYs+yYtOyYteyYt+yYueyYu+yZgOyZgeyZhOyZiOyZkOyZkeyZk+yZlOyZleyZnOyZneyZoOyZrOyZr+yZseyZuOyZueyZvOyagOyaiOyaieyai+yajeyalOyaleyamOyanOyapOyapeyap+yaqeyasOyaseyatOyauOyaueyauuybgOybgeybg+ybheybjOybjeybkOyblOybnOybneyboOyboeybqFwiXG5cdF0sXG5cdFtcblx0XHRcImMwNDFcIixcblx0XHRcIu2TvlwiLFxuXHRcdDUsXG5cdFx0XCLtlIXtlIbtlIftlIntlIrtlIvtlI1cIixcblx0XHQ2LFxuXHRcdFwi7ZSW7ZSYXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCJjMDYxXCIsXG5cdFx0XCLtlJ5cIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCJjMDgxXCIsXG5cdFx0XCLtlLjtlLntlLrtlLvtlL7tlL/tlYHtlYLtlYPtlYVcIixcblx0XHQ2LFxuXHRcdFwi7ZWO7ZWQ7ZWSXCIsXG5cdFx0NSxcblx0XHRcIu2Vmu2Vm+2Vne2Vnu2Vn+2Voe2Vou2Vo+ybqeybrOybsOybuOybueybveychOycheyciOycjOyclOycleycl+ycmeycoOycoeycpOycqOycsOycseycs+ycteyct+ycvOycveydgOydhOydiuydjOydjeydj+ydkVwiLFxuXHRcdDcsXG5cdFx0XCLsnZzsnaDsnajsnavsnbTsnbXsnbjsnbzsnb3snb7snoPsnoTsnoXsnofsnojsnonsnorsno7snpDsnpHsnpTsnpbsnpfsnpjsnprsnqDsnqHsnqPsnqTsnqXsnqbsnqzsnq3snrDsnrTsnrzsnr3snr/sn4Dsn4Hsn4jsn4nsn4zsn47sn5Dsn5jsn53sn6Tsn6jsn6zsoIDsoIHsoITsoIjsoIpcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMTQxXCIsXG5cdFx0XCLtlaTtlabtlaftlartlaztla5cIixcblx0XHQ1LFxuXHRcdFwi7ZW27ZW37ZW57ZW67ZW77ZW9XCIsXG5cdFx0Nixcblx0XHRcIu2Whu2Wiu2Wi1wiXG5cdF0sXG5cdFtcblx0XHRcImMxNjFcIixcblx0XHRcIu2WjO2Wje2Wju2Wj+2WkVwiLFxuXHRcdDE5LFxuXHRcdFwi7Zam7ZanXCJcblx0XSxcblx0W1xuXHRcdFwiYzE4MVwiLFxuXHRcdFwi7ZaoXCIsXG5cdFx0MzEsXG5cdFx0XCLsoJDsoJHsoJPsoJXsoJbsoJzsoJ3soKDsoKTsoKzsoK3soK/soLHsoLjsoLzsoYDsoYjsoYnsoYzsoY3soZTsobDsobHsobTsobjsobrsooDsooHsooPsooXsoobsoofsoovsoozsoo3sopTsop3sop/soqHsoqjsorzsor3so4Tso4jso4zso5Tso5Xso5fso5nso6Dso6Hso6Tso7Xso7zso73spIDspITspIXspIbspIzspI3spI/spJHspJjspKzspLTspZDspZHspZTspZjspaDspaHspaPspazspbDspbTspbzspojsponspozsppDsppjsppnsppvspp3sp4Dsp4Hsp4Tsp4fsp4jsp4rsp5Dsp5Hsp5NcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMjQxXCIsXG5cdFx0XCLtl4rtl4vtl43tl47tl4/tl5Htl5NcIixcblx0XHQ0LFxuXHRcdFwi7Zea7Zec7ZeeXCIsXG5cdFx0NSxcblx0XHRcIu2Xpu2Xp+2Xqe2Xqu2Xq+2Xre2XrlwiXG5cdF0sXG5cdFtcblx0XHRcImMyNjFcIixcblx0XHRcIu2Xr1wiLFxuXHRcdDQsXG5cdFx0XCLtl7btl7jtl7pcIixcblx0XHQ1LFxuXHRcdFwi7ZiC7ZiD7ZiF7ZiG7ZiH7ZiJXCIsXG5cdFx0Nixcblx0XHRcIu2YklwiXG5cdF0sXG5cdFtcblx0XHRcImMyODFcIixcblx0XHRcIu2YllwiLFxuXHRcdDUsXG5cdFx0XCLtmJ3tmJ7tmJ/tmKHtmKLtmKPtmKVcIixcblx0XHQ3LFxuXHRcdFwi7ZiuXCIsXG5cdFx0OSxcblx0XHRcIu2Yuu2Yu+ynleynluynmeynmuynnOynneynoOynouynpOynp+ynrOynreynr+ynsOynseynuOynueynvOyogOyoiOyoieyoi+yojOyojeyolOyomOyoqeypjOypjeypkOyplOypnOypneypn+ypoOypoeypqOypveyqhOyqmOyqvOyqveyrgOyrhOyrjOyrjeyrj+yrkeyrk+yrmOyrmeyroOyrrOyrtOysiOyskOyslOysmOysoOysoeytgeytiOytieytjOytkOytmOytmeytneytpOytuOytueyunOyuuOyvlOyvpOyvp+yvqeywjOywjeywkOywlOywnOywneywoeywouywp+ywqOywqeywrOywruywsOywuOywueywu1wiXG5cdF0sXG5cdFtcblx0XHRcImMzNDFcIixcblx0XHRcIu2Yve2Yvu2Yv+2Zge2Zgu2Zg+2ZhO2Zhu2Zh+2Ziu2ZjO2Zju2Zj+2ZkO2Zku2Zk+2Zlu2Zl+2Zme2Zmu2Zm+2ZnVwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiYzM2MVwiLFxuXHRcdFwi7ZmiXCIsXG5cdFx0NCxcblx0XHRcIu2ZqO2ZqlwiLFxuXHRcdDUsXG5cdFx0XCLtmbLtmbPtmbVcIixcblx0XHQxMVxuXHRdLFxuXHRbXG5cdFx0XCJjMzgxXCIsXG5cdFx0XCLtmoHtmoLtmoTtmoZcIixcblx0XHQ1LFxuXHRcdFwi7ZqO7ZqP7ZqR7ZqS7ZqT7ZqVXCIsXG5cdFx0Nyxcblx0XHRcIu2anu2aoO2aolwiLFxuXHRcdDUsXG5cdFx0XCLtmqntmqrssLzssL3ssL7ssYTssYXssYjssYzssZTssZXssZfssZjssZnssaDssaTssabssajssbDssbXsspjsspnsspzssqDssqjssqnssqvssqzssq3ssrTssrXssrjssrzss4Tss4Xss4fss4nss5Dss5Tss6Tss6zss7DstIHstIjstInstIzstJDstJjstJnstJvstJ3stKTstKjstKzstLnstZzstaDstaTstazsta3sta/stbHstbjstojstpTstpXstpjstpzstqTstqXstqfstqnstrDst4Tst4zst5Dst6jst6zst7Dst7jst7nst7vst73suITsuIjsuIzsuJTsuJnsuKDsuKHsuKTsuKjsuLDsuLHsuLPsuLVcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNDQxXCIsXG5cdFx0XCLtmqvtmq3tmq7tmq/tmrFcIixcblx0XHQ3LFxuXHRcdFwi7Zq67Zq8XCIsXG5cdFx0Nyxcblx0XHRcIu2bhu2bh+2bie2biu2bi1wiXG5cdF0sXG5cdFtcblx0XHRcImM0NjFcIixcblx0XHRcIu2bje2bju2bj+2bkO2bku2bk+2ble2blu2bmO2bmlwiLFxuXHRcdDUsXG5cdFx0XCLtm6Htm6Ltm6Ptm6Xtm6btm6ftm6lcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImM0ODFcIixcblx0XHRcIu2bru2br+2bse2bsu2bs+2btO2btlwiLFxuXHRcdDUsXG5cdFx0XCLtm77tm7/tnIHtnILtnIPtnIVcIixcblx0XHQxMSxcblx0XHRcIu2cku2ck+2clOy5mOy5mey5nOy5n+y5oOy5oey5qOy5qey5q+y5rey5tOy5tey5uOy5vOy6hOy6hey6h+y6iey6kOy6key6lOy6mOy6oOy6oey6o+y6pOy6pey6rOy6rey7gey7pOy7pey7qOy7q+y7rOy7tOy7tey7t+y7uOy7uey8gOy8gey8hOy8iOy8kOy8key8k+y8ley8nOy8oOy8pOy8rOy8rey8r+y8sOy8sey8uOy9lOy9ley9mOy9nOy9pOy9pey9p+y9qey9sOy9sey9tOy9uOy+gOy+hey+jOy+oey+qOy+sOy/hOy/oOy/oey/pOy/qOy/sOy/sey/s+y/tey/vO2AgO2AhO2Ake2AmO2Are2AtO2Ate2AuO2AvFwiXG5cdF0sXG5cdFtcblx0XHRcImM1NDFcIixcblx0XHRcIu2cle2clu2cl+2cmu2cm+2cne2cnu2cn+2coVwiLFxuXHRcdDYsXG5cdFx0XCLtnKrtnKztnK5cIixcblx0XHQ1LFxuXHRcdFwi7Zy27Zy37Zy5XCJcblx0XSxcblx0W1xuXHRcdFwiYzU2MVwiLFxuXHRcdFwi7Zy67Zy77Zy9XCIsXG5cdFx0Nixcblx0XHRcIu2dhe2dhu2diO2dilwiLFxuXHRcdDUsXG5cdFx0XCLtnZLtnZPtnZXtnZpcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImM1ODFcIixcblx0XHRcIu2dn+2dou2dpO2dpu2dp+2dqO2dqu2dq+2dre2dru2dr+2dse2dsu2ds+2dtVwiLFxuXHRcdDYsXG5cdFx0XCLtnb7tnb/tnoDtnoJcIixcblx0XHQ1LFxuXHRcdFwi7Z6K7Z6L7YGE7YGF7YGH7YGJ7YGQ7YGU7YGY7YGg7YGs7YGt7YGw7YG07YG87YG97YKB7YKk7YKl7YKo7YKs7YK07YK17YK37YK57YOA7YOB7YOE7YOI7YOJ7YOQ7YOR7YOT7YOU7YOV7YOc7YOd7YOg7YOk7YOs7YOt7YOv7YOw7YOx7YO47YSN7YSw7YSx7YS07YS47YS67YWA7YWB7YWD7YWE7YWF7YWM7YWN7YWQ7YWU7YWc7YWd7YWf7YWh7YWo7YWs7YW87YaE7YaI7Yag7Yah7Yak7Yao7Yaw7Yax7Yaz7Ya17Ya67Ya87YeA7YeY7Ye07Ye47YiH7YiJ7YiQ7Yis7Yit7Yiw7Yi07Yi87Yi97Yi/7YmB7YmI7YmcXCJcblx0XSxcblx0W1xuXHRcdFwiYzY0MVwiLFxuXHRcdFwi7Z6N7Z6O7Z6P7Z6RXCIsXG5cdFx0Nixcblx0XHRcIu2emu2enO2enlwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiYzZhMVwiLFxuXHRcdFwi7Ymk7YqA7YqB7YqE7YqI7YqQ7YqR7YqV7Yqc7Yqg7Yqk7Yqs7Yqx7Yq47Yq57Yq87Yq/7YuA7YuC7YuI7YuJ7YuL7YuU7YuY7Yuc7Yuk7Yul7Yuw7Yux7Yu07Yu47YyA7YyB7YyD7YyF7YyM7YyN7YyO7YyQ7YyU7YyW7Yyc7Yyd7Yyf7Yyg7Yyh7Yyl7Yyo7Yyp7Yys7Yyw7Yy47Yy57Yy77Yy87Yy97Y2E7Y2F7Y287Y297Y6A7Y6E7Y6M7Y6N7Y6P7Y6Q7Y6R7Y6Y7Y6Z7Y6c7Y6g7Y6o7Y6p7Y6r7Y6t7Y607Y647Y687Y+E7Y+F7Y+I7Y+J7Y+Q7Y+Y7Y+h7Y+j7Y+s7Y+t7Y+w7Y+07Y+87Y+97Y+/7ZCBXCJcblx0XSxcblx0W1xuXHRcdFwiYzdhMVwiLFxuXHRcdFwi7ZCI7ZCd7ZGA7ZGE7ZGc7ZGg7ZGk7ZGt7ZGv7ZG47ZG57ZG87ZG/7ZKA7ZKC7ZKI7ZKJ7ZKL7ZKN7ZKU7ZKp7ZOM7ZOQ7ZOU7ZOc7ZOf7ZOo7ZOs7ZOw7ZO47ZO77ZO97ZSE7ZSI7ZSM7ZSU7ZSV7ZSX7ZS87ZS97ZWA7ZWE7ZWM7ZWN7ZWP7ZWR7ZWY7ZWZ7ZWc7ZWg7ZWl7ZWo7ZWp7ZWr7ZWt7ZW07ZW17ZW47ZW87ZaE7ZaF7ZaH7ZaI7ZaJ7ZaQ7Zal7ZeI7ZeJ7ZeM7ZeQ7ZeS7ZeY7ZeZ7Zeb7Zed7Zek7Zel7Zeo7Zes7Ze07Ze17Ze37Ze57ZiA7ZiB7ZiE7ZiI7ZiQ7ZiR7ZiT7ZiU7ZiV7Zic7ZigXCJcblx0XSxcblx0W1xuXHRcdFwiYzhhMVwiLFxuXHRcdFwi7Zik7Zit7Zi47Zi57Zi87ZmA7ZmF7ZmI7ZmJ7ZmL7ZmN7ZmR7ZmU7ZmV7ZmY7Zmc7Zmn7Zmp7Zmw7Zmx7Zm07ZqD7ZqF7ZqM7ZqN7ZqQ7ZqU7Zqd7Zqf7Zqh7Zqo7Zqs7Zqw7Zq57Zq77ZuE7ZuF7ZuI7ZuM7ZuR7ZuU7ZuX7ZuZ7Zug7Zuk7Zuo7Zuw7Zu17Zu87Zu97ZyA7ZyE7ZyR7ZyY7ZyZ7Zyc7Zyg7Zyo7Zyp7Zyr7Zyt7Zy07Zy17Zy47Zy87Z2E7Z2H7Z2J7Z2Q7Z2R7Z2U7Z2W7Z2X7Z2Y7Z2Z7Z2g7Z2h7Z2j7Z2l7Z2p7Z2s7Z2w7Z207Z287Z297Z6B7Z6I7Z6J7Z6M7Z6Q7Z6Y7Z6Z7Z6b7Z6dXCJcblx0XSxcblx0W1xuXHRcdFwiY2FhMVwiLFxuXHRcdFwi5Ly95L2z5YGH5YO55Yqg5Y+v5ZG15ZOl5ZiJ5auB5a625pqH5p625p635p+v5q2M54+C55eC56i86Iub6IyE6KGX6KKI6Ki26LOI6LeP6Lu76L+m6aeV5Yi75Y205ZCE5oGq5oWk5q6854+P6ISa6Ka66KeS6Zaj5L6D5YiK5aK+5aW45aem5bmy5bm55oeH5o+A5p2G5p+s5qG/5r6X55mO55yL56O156iI56u/57Ch6IKd6Imu6Imx6Kur6ZaT5Lmr5Zad5pu35ri056Kj56ut6JGb6KSQ6J2O6Z6o5YuY5Z2O5aCq5bWM5oSf5oa+5oih5pWi5p+R5qmE5rib55SY55az55uj556w57S66YKv6ZGR6ZGS6b6VXCJcblx0XSxcblx0W1xuXHRcdFwiY2JhMVwiLFxuXHRcdFwi5Yyj5bKs55Sy6IOb6YmA6ZaY5Ymb5aCI5aec5bKh5bSX5bq35by65b2K5oW35rGf55W655aG57Og57Wz57ax576M6IWU6Iih6JaR6KWB6Kyb6Yu86ZmN6bGH5LuL5Lu35YCL5Yex5aGP5oS35oS+5oWo5pS55qeq5ryR55al55qG55uW566H6Iql6JOL76SA6Y6n6ZaL5ZaA5a6i5Z2R76SB57Kz57656Ya15YCo5Y675bGF5beo5ouS5o2u5pOa5pOn5rig54Ks56Wb6Led6Lie76SC6YG96YmF6Yu45Lm+5Lu25YGl5be+5bu65oSG5qWX6IWx6JmU6LmH6Y216air5Lme5YKR5p2w5qGA5YSJ5YqN5YqS5qqiXCJcblx0XSxcblx0W1xuXHRcdFwiY2NhMVwiLFxuXHRcdFwi55686YiQ6buU5Yqr5oCv6L+y5YGI5oap5o+t5pOK5qC85qqE5r+A6IaI6Kah6ZqU5aCF54m954qs55SE57W557mt6IKp6KaL6K206YGj6bWR5oqJ5rG65r2U57WQ57y66Kij5YW85oWK566d6KyZ6YmX6Y6M5Lqs5L+T5YCe5YK+5YSG5YuB5YuN5Y2/5Z2w5aKD5bqa5b6R5oW25oas5pOO5pWs5pmv5pq75pu05qKX5raH54KF54Ox55Kf55Kl55OK55eZ56Gs56Os56uf56u257WF57aT6ICV6IC/6ISb6I6W6K2m6LyV6YCV6Y+h6aCD6aC46ama6a+o5L+C5ZWT5aC65aWR5a2j5bGG5oK45oiS5qGC5qKwXCJcblx0XSxcblx0W1xuXHRcdFwiY2RhMVwiLFxuXHRcdFwi5qOo5rqq55WM55m456OO56i957O757mr57m86KiI6Kqh6LC/6ZqO6beE5Y+k5Y+p5ZGK5ZGx5Zu65aeR5a2k5bC75bqr5ou35pS35pWF5pWy5pqg5p6v5qeB5rK955e855qQ552+56i/576U6ICD6IKh6IaP6Ium6Iu96I+w6JeB6KCx6KK06Kql76SD6L6c6Yyu6ZuH6aGn6auY6byT5ZOt5pab5puy5qKP56mA6LC36bWg5Zuw5Z2k5bSR5piG5qKx5qON5ru+55Co6KKe6a+k5rGo76SE6aqo5L6b5YWs5YWx5Yqf5a2U5bel5oGQ5oGt5oux5o6n5pS754+Z56m66Jqj6LKi6Z6P5Liy5a+h5oiI5p6c55OcXCJcblx0XSxcblx0W1xuXHRcdFwiY2VhMVwiLFxuXHRcdFwi56eR6I+T6KqH6Kqy6Leo6YGO6Y2L6aGG5buT5qeo6Je/6YOt76SF5Yag5a6Y5a+s5oWj5qO65qy+54GM55Cv55OY566h572Q6I+F6KeA6LKr6Zec6aSo5Yiu5oGd5ous6YCC5L6K5YWJ5Yyh5aOZ5buj5pug5rS454Ka54uC54+W562Q6IOx6ZGb5Y2m5o6b572r5LmW5YKA5aGK5aOe5oCq5oSn5ouQ5qeQ6a2B5a6P57SY6IKx6L2f5Lqk5YOR5ZKs5Zas5ayM5bag5ben5pSq5pWO5qCh5qmL54uh55qO55+v57We57+56Iag6JWO6Juf6LyD6L2O6YOK6aSD6amV6a6r5LiY5LmF5Lmd5LuH5L+x5YW35Yu+XCJcblx0XSxcblx0W1xuXHRcdFwiY2ZhMVwiLFxuXHRcdFwi5Y2A5Y+j5Y+l5ZKO5ZiU5Z215Z6i5a+H5baH5buQ5oe85ouY5pWR5p645p+p5qeL5q2Q5q+G5q+s5rGC5rqd54G454uX546W55CD556/55+p56m257W/6ICJ6Ie86IiF6IiK6Iuf6KGi6Kyz6LO86LuA6YCR6YKx6Ymk6Yq26aeS6amF6bOp6beX6b6c5ZyL5bGA6I+K6Z6g6Z6r6bq05ZCb56qY576k6KOZ6LuN6YOh5aCA5bGI5o6Y56qf5a6u5byT56m556qu6IqO6Lqs5YCm5Yi45Yu45Y235ZyI5ouz5o2y5qyK5reD55y35Y6l542X6JWo6Lm26ZeV5py65quD5r2w6Kmt6LuM6aWL76SG5pm35q246LK0XCJcblx0XSxcblx0W1xuXHRcdFwiZDBhMVwiLFxuXHRcdFwi6ay876SH5Y+r5Zyt5aWO5o+G5qe754+q56GF56q656uF57O+6JG16KaP6LWz6YC16Zao5Yu75Z2H55WH562g6I+M6Yie76SI5qmY5YWL5YmL5YqH5oif5qOY5qW16ZqZ5YOF5Yqk5Yuk5oeD5pak5qC55qe/55G+562L6Iq56I+r6Kay6Ky56L+R6aWJ76SJ5LuK5aaX5pOS5piR5qqO55C056aB56a96Iqp6KG+6KG/6KWf76SK6Yym5LyL5Y+K5oCl5omx5rGy57Sa57Wm5LqY5YWi55+c6IKv5LyB5LyO5YW25YaA5Zec5Zmo5Zy75Z+65Z+85aSU5aWH5aaT5a+E5bKQ5bSO5bex5bm+5b+M5oqA5peX5pejXCJcblx0XSxcblx0W1xuXHRcdFwiZDFhMVwiLFxuXHRcdFwi5pye5pyf5p2e5qOL5qOE5qmf5qy65rCj5rG95rKC5reH546Y55Cm55Cq55KC55Kj55W455W/56KB56Ov56WB56WH56WI56W6566V57SA57a6576I6ICG6ICt6IKM6KiY6K2P6LGI6LW36Yyh6Yyk6aOi6aWR6aiO6aiP6aml6bqS57eK5L225ZCJ5ouu5qGU6YeR5Zar5YS676SL76SM5aic5oem76SN5ouP5ou/76SOXCIsXG5cdFx0NSxcblx0XHRcIumCo++klFwiLFxuXHRcdDQsXG5cdFx0XCLoq77vpJnvpJrvpJvvpJzmmpbvpJ3nhZbvpJ7vpJ/pm6PvpKDmjY/mjbrljZfvpKHmno/mpaDmubPvpKLnlLfvpKPvpKTvpKVcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMmExXCIsXG5cdFx0XCLntI3vpKbvpKfoobLlm4rlqJjvpKhcIixcblx0XHQ0LFxuXHRcdFwi5LmD76St5YWn5aWI5p+w6ICQ76Su5aWz5bm05pKa56eK5b+15oGs5ouI5o275a+n5a+X5Yqq76Sv5aW05byp5oCS76Sw76Sx76Sy55GZ76SzXCIsXG5cdFx0NSxcblx0XHRcIumnke+kuVwiLFxuXHRcdDEwLFxuXHRcdFwi5r+D76WE76WF6Ia/6L6y5oOx76WG76WH6IWm76WI76WJ5bC/76WKXCIsXG5cdFx0Nyxcblx0XHRcIuWrqeiopeadu+e0kO+lklwiLFxuXHRcdDUsXG5cdFx0XCLog73vpZjvpZnlsLzms6XljL/murrlpJrojLZcIlxuXHRdLFxuXHRbXG5cdFx0XCJkM2ExXCIsXG5cdFx0XCLkuLnkurbkvYbllq7lnJjlo4flvZbmlrfml6bmqoDmrrXmuY3nn63nq6/nsJ7nt57om4voopLphLLpjZvmkrvmvr7njbrnlrjpgZTllZblnY3mhrrmk5Tmm4fmt6HmuZvmva3mvrnnl7DogYPohr3olYHopoPoq4forZrpjJ/mspPnlZPnrZTouI/pgZ3llJDloILloZjluaLmiIfmkp7mo6Dnlbbns5bonrPpu6jku6Plnojlna7lpKflsI3lsrHluLblvoXmiLTmk6HnjrPoh7rooovosrjpmorpu5vlroXlvrfmgrPlgJLliIDliLDlnJbloLXloZflsI7lsaDls7bltovluqblvpLmgrzmjJHmjonmkJfmoYNcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNGExXCIsXG5cdFx0XCLmo7nmq4Lmt5jmuKHmu5Tmv6Tnh77nm5znnbnnprHnqLvokITopqnos63ot7PouYjpgIPpgJTpgZPpg73pjY3pmbbpn5zmr5LngIbniZjniqLnjajnnaPnpr/nr6TnupvoroDloqnmg4fmlabml73mmr7msoznhJ7nh4nosZrpoJPkua3nqoHku53lhqzlh43li5XlkIzmhqfmnbHmoZDmo5/mtJ7mvbznlrznnrPnq6Xog7TokaPpioXlhZzmlpfmnZzmnpPnl5jnq4fojbPvpZrosYbpgJfpoK3lsa/oh4DoiprpgYHpga/piI3lvpfltp3mqZnnh4jnmbvnrYnol6TorITphKfpqLDllofmh7bvpZvnmannvoVcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNWExXCIsXG5cdFx0XCLomL/onrroo7jpgo/vpZzmtJvng5nnj57ntaHokL3vpZ3pharpp7HvpZ7kuoLljbXmrITmrJLngL7niJvomK3puJ7liYzovqPltZDmk6XmlKzmrJbmv6vnsYPnupzol43opaTopr3mi4noh5jooJ/lu4rmnJfmtarni7znkIXnka/onoLpg57kvobltI3lvqDokIrlhrfmjqDnlaXkuq7lgIblhanlh4nmooHmqJHnsq7nsrHns6foia/oq5LovJvph4/kvrblhLfli7XlkYLlu6zmha7miL7ml4Xmq5rmv77npKrol5zooKPplq3pqaLpqarpupfpu47lipvmm4bmrbfngJ3npKvovaLpnYLmhpDmiIDmlKPmvKNcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNmExXCIsXG5cdFx0XCLnhYnnkonnt7Toga/ok67ovKbpgKPpjYrlhr3liJfliqPmtIzng4joo4Llu4nmloLmrq7mv4LnsL7njbXku6TkvLblm7nvpZ/lsrrltrrmgJznjrLnrK3nvprnv47ogYbpgJ7piLTpm7bpnYjpoJjpvaHkvovmvqfnpq7phrTpmrfli57vpaDmkojmk4Tmq5PmvZ7ngJjniJDnm6fogIHomIbomZzot6/ovIXpnLLpra/pt7rpubXnooznpb/ntqDoj4npjITpub/pupPoq5blo5/lvITmnKfngKfnk4/nsaDogb7lhKHngKjniaLno4ros4Los5ros7Tpm7fkuoblg5rlr67lu5bmlpnnh47nmYLnnq3ogYrok7xcIlxuXHRdLFxuXHRbXG5cdFx0XCJkN2ExXCIsXG5cdFx0XCLpgbzprKfpvo3lo5jlqYHlsaLmqJPmt5rmvI/nmLvntK/nuLfolJ7opLjpj6TpmYvlionml5Lmn7PmprTmtYHmupzngI/nkInnkaDnlZnnmKTnoavorKzpoZ7lha3miK7pmbjkvpblgKvltJnmt6rntrjovKrlvovmhYTmoJfvpaHpmobli5Logovlh5zlh4zmpZ7nqJzntr7oj7HpmbXkv5rliKnljpjlkI/llI7lsaXmgqfmnY7moqjmtaznioHni7jnkIbnkoPvpaLnl6Lnsaznvbnnvrjojonoo4/oo6Hph4zph5Dpm6Lpr4nlkJ3mvb7nh5Dnkpjol7rouqrpmqPpsZfpup/mnpfmt4vnkLPoh6jpnJbnoKxcIlxuXHRdLFxuXHRbXG5cdFx0XCJkOGExXCIsXG5cdFx0XCLnq4vnrKDnspLmkannkarnl7Lnorzno6jppqzprZTpurvlr57luZXmvKDohpzojqvpgojkuIfljY3lqKnlt5LlvY7mhaLmjL3mmanmm7zmu7/mvKvngaPnnp7okKzolJPooLvovJPppYXpsLvllJzmirnmnKvmsqvojInoparpnbrkuqHlpoTlv5jlv5nmnJvntrLnvZToipLojKvojr3ovJ7pgpnln4vlprnlqpLlr5DmmKfmnprmooXmr4/nhaTnvbXosrfos6PpgoHprYXohIjosorpmYzpqYDpuqXlrZ/msJPnjJvnm7Lnm5/okIzlhqroppPlhY3lhpXli4nmo4nmspTnnITnnKDntr/nt6zpnaLpurXmu4VcIlxuXHRdLFxuXHRbXG5cdFx0XCJkOWExXCIsXG5cdFx0XCLolJHlhqXlkI3lkb3mmI7mmp3mpKfmup/nmr/nnpHojJfok4Lonp/phanpipjps7ToooLkvq7lhpLli5/lp4bluL3mhZXmkbjmkbnmmq7mn5DmqKHmr43mr5vniZ/niaHnkYHnnLjnn5vogJfoirzojIXorIDorKjosozmnKjmspDniafnm67nnabnqYbptqnmrb/mspLlpKLmnKbokpnlja/lopPlppnlu5/mj4/mmLTmnbPmuLrnjKvnq5foi5fpjKjli5nlt6vmhq7mh4vmiIrmi4fmkqvml6DmpZnmrabmr4vnhKHnj7fnlZ3nuYboiJ7ojILolaroqqPosr/pnKfptaHloqjpu5jlgJHliI7lkLvllY/mlodcIlxuXHRdLFxuXHRbXG5cdFx0XCJkYWExXCIsXG5cdFx0XCLmsbbntIrntIvogZ7omorploDpm6/li7/mspXnianlkbPlqprlsL7ltYvlvYzlvq7mnKrmorbmpaPmuLzmuYTnnInnsbPnvo7oloforI7ov7fpnaHpu7TlsrfmgrbmhI3mhqvmlY/ml7vml7zmsJHms6/njp/nj4nnt6HplpTlr4bonJzorJDliZ3ljZrmi43mkI/mkrLmnLTmqLjms4rnj4Dnkp7nrpTnspXnuJvohoroiLboloTov6vpm7npp4HkvLTljYrlj43lj5vmi4zmkKzmlIDmlpHmp4Pms67mvZjnj63nlZTnmKLnm6Tnm7zno5Dno7vnpKzntYboiKzon6Dov5TpoJLpo6/li4Pmi5TmkqXmuKTmvZFcIlxuXHRdLFxuXHRbXG5cdFx0XCJkYmExXCIsXG5cdFx0XCLnmbzot4vphrHpiaLpq67prYPlgKPlgo3lnYrlpqjlsKjluYflvbfmiL/mlL7mlrnml4HmmInmnovmppzmu4Lno4XntKHogqrohoDoiKvoirPokqHomozoqKrorJfpgqbpmLLpvpDlgI3kv7PvpaPln7nlvpjmi5zmjpLmna/muYPnhJnnm4Pog4zog5roo7Too7XopJnos6DovKnphY3pmarkvK/kvbDluJvmn4/moKLnmb3nmb7prYTluaHmqIrnhannh5TnlarvpaTnuYHolYPol6npo5zkvJDnrY/nvbDplqXlh6HluIbmorXmsL7msY7ms5vniq/nr4TojIPms5XnkLrlg7vliojlo4Hmk5jmqpfnkqfnmZZcIlxuXHRdLFxuXHRbXG5cdFx0XCJkY2ExXCIsXG5cdFx0XCLnoqfomJfpl6LpnLnvpaXljZ7lvIHororovqjovq/pgorliKXnnqXpsYnpvIjkuJnlgILlhbXlsZvlubfmmJ7mmLrmn4Tmo4XngrPnlIHnl4Xnp4nnq53ovKfppKDpqIjkv53loKHloLHlr7bmma7mraXmtJHmubrmvb3nj6TnlKvoj6noo5zopJPorZzovJTkvI/lg5XljJDljZzlrpPlvqnmnI3npo/ohbnojK/olJTopIfopobovLnovLvppqXpsJLmnKzkubbkv7jlpYnlsIHls6/ls7Dmjafmo5Lng73nhqLnkKvnuKvok6zonILpgKLpi5Lps7PkuI3ku5jkv6/lgoXliZblia/lkKblkpDln6DlpKvlqaZcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZGExXCIsXG5cdFx0XCLlrZrlrbXlr4zlupzvpabmibbmlbfmlqfmta7muqXniLbnrKbnsL/nvLbohZDohZHohproiYDoipnojqnoqIPosqDos6bos7votbTotrrpg6jph5zpmJzpmYTpp5nps6fljJfliIblkKnlmbTlorPlpZTlpa7lv7/mhqTmia7mmJDmsb7nhJrnm4bnsonns57ntJvoiqzos4Hpm7DvpafkvZvlvJflvb/mi4LltKnmnIvmo5rnobznuYPptazkuJXlgpnljJXljKrljZHlpoPlqaLluofmgrLmhormiYnmibnmlpDmnofmpqfmr5Tmr5bmr5fmr5jmsrjvpajnkLXnl7rnoJLnopHnp5Xnp5jnsoPnt4vnv6HogqVcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZWExXCIsXG5cdFx0XCLohL7oh4Loj7LonJroo6joqrnorazosrvphJnpnZ7po5vpvLvlmqzlrKrlvazmlozmqrPmrq/mtZzmv7HngJXniZ3njq3osqfos5PpoLvmhpHmsLfogZjpqIHkuY3kuovkupvku5XkvLrkvLzkvb/kv5/lg7/lj7Llj7jllIbll6Plm5vlo6vlpaLlqJHlr6vlr7rlsITlt7PluKvlvpnmgJ3mjajmlpzmlq/mn7bmn7vmoq3mrbvmspnms5fmuKPngInnjYXnoILnpL7npYDnpaDnp4Hnr6nntJfntbLogoboiI3ojo7ok5Hom4foo5/oqZDoqZ7orJ3os5zotabovq3pgqrpo7zpp5/pup3liYrvpanmnJTvpapcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZmExXCIsXG5cdFx0XCLlgpjliKrlsbHmlaPmsZXnj4rnlKPnlp3nrpfokpzphbjpnLDkubfmkpLmrrrnhZ7olqnkuInvpavmnYnmo67muJfoip/olJjooavmj7fmvoHpiJLpoq/kuIrlgrflg4/lhJ/llYbllqrlmJflrYDlsJnls6DluLjluorluqDlu4Lmg7PmoZHmqaHmuZjniL3niYDni4Dnm7jnpaXnrrHnv5Too7Pop7ToqbPosaHos57pnJzloZ7nkr3os73ll4fvpaznqaHntKLoibLnibLnlJ/nlKXvpa3nrJnlooXlo7vltrzluo/lurblvpDmgZXmipLmjb/mlY3mmpHmm5nmm7jmoJbmo7LnioDnkZ7nra7nta7nt5bnvbJcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMGExXCIsXG5cdFx0XCLog6XoiJLolq/opb/oqpPpgJ3pi6Tpu43pvKDlpJXlpa3luK3mg5zmmJTmmbPmnpDmsZDmt4XmvZ/nn7Pnoqnok4bph4vpjKvku5nlg4rlhYjlloTlrIvlrqPmiYfmlb7ml4vmuLLnhb3nkIHnkYTnkofnkr/nmaznpqrnt5rnuZXnvqjohbrohrPoiLnomJron6zoqbXot6PpgbjpipHpkKXppY3prq7ljajlsZHmpZTms4TmtKnmuKvoiIzolpvopLvoqK3oqqrpm6rpvafliaHmmrnmrrLnupbon77otI3ploPpmZ3mlJ3mtonnh67vpa7ln47lp5PlrqzmgKfmg7rmiJDmmJ/mmZ/njKnnj7nnm5vnnIHnraxcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMWExXCIsXG5cdFx0XCLogZbogbLohaXoqqDphpLkuJbli6LmrbLmtJfnqIXnrLnntLDvpa/osrDlj6zlmK/loZHlrrXlsI/lsJHlt6LmiYDmjoPmkJTmmK3morPmsrzmtojmuq/ngJ/ngqTnh5LnlKbnlo/nlo7nmJnnrJHnr6DnsKvntKDntLnolKzola3omIfoqLTpgI3pgaHpgrXpirfpn7bpqLfkv5flsazmnZ/mtpHnsp/nuozorJbotJbpgJ/lravlt73mkI3ok4DpgZzpo6Hnjoflrovmgprmnb7mt57oqJ/oqqbpgIHpoIzliLfvpbDngZHnoo7pjpboobDph5fkv67lj5fll73lm5rlnoLlo73lq4Llrojlsqvls4DluKXmhIFcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMmExXCIsXG5cdFx0XCLmiI3miYvmjojmkJzmlLbmlbjmqLnmrormsLTmtJnmvLHnh6fni6nnjbjnkIfnkrLnmKbnnaHnp4DnqZfnq6rnsrnnto/ntqznuaHnvp7ohKnojLHokpDok5rol6roopboqrDorpDovLjpgYLpgoPphazpipbpirnpmovpmqfpmqjpm5bpnIDpoIjpppbpq5PprJrlj5Tlob7lpJnlrbDlrr/mt5HmvZrnhp/nkKHnkrnogoXoj73lt6HlvoflvqrmgYLml6zmoJLmpa/mqZPmronmtLXmt7Pnj6Pnm77nnqznrY3ntJTohKPoiJzojYDok7TolaPoqaLoq4TphofpjJ7poIbpprTmiIzooZPov7DpiaXltIfltKdcIlxuXHRdLFxuXHRbXG5cdFx0XCJlM2ExXCIsXG5cdFx0XCLltannkZ/ohp3onajmv5Xmi77nv5LopLbopbLkuJ7kuZjlg6fli53ljYfmib/mmIfnuanooIXpmZ7kvo3ljJnlmLblp4vlqqTlsLjlsY7lsY3luILlvJHmgYPmlr3mmK/mmYLmnr7mn7TnjJznn6LnpLrnv4XokpTok43oppboqaboqanoq6HosZXosbrln7Tlr5TlvI/mga/mi63mpI3mrpbmuZznhoTnr5LonZXorZjou77po5/po77kvLjkvoHkv6HlkbvlqKDlrrjmhLzmlrDmmajnh7znlLPnpZ7ntLPohY7oh6Pojpjolqrol47onIPoqIrouqvovpvvpbHov4XlpLHlrqTlr6bmgonlr6nlsIvlv4PmsoFcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNGExXCIsXG5cdFx0XCLvpbLmt7HngIvnlJroiq/oq7bku4DljYHvpbPpm5nmsI/kup7kv4TlhZLllZ7lqKXls6jmiJHniZnoir3ojqrom77ooZnoqJ3pmL/pm4XppJPptInptZ3loIrlsrPltr3luYTmg6HmhJXmj6HmqILmuKXphILpjZTpoY7psJDpvbflronlsrjmjInmmY/moYjnnLzpm4Hpno3poZTprp/mlqHorIHou4vplrzllLXlsqnlt5blurXmmpfnmYzoj7Tpl4flo5Pmirzni47ptKjku7DlpK7mgI/mmLvmroPnp6fptKbljpPlk4Dln4PltJbmhJvmm5bmtq/noo3oib7pmpjpnYTljoTmibzmjpbmtrLnuIrohYvpoY1cIlxuXHRdLFxuXHRbXG5cdFx0XCJlNWExXCIsXG5cdFx0XCLmq7vnvYzptq/puJrkuZ/lgLvlhrblpJzmg7nmj7bmpLDniLrogLbvpbTph47lvLHvpbXvpbbntIToi6Xoka/okrvol6Xouo3vpbfkva/vpbjvpbnlo6TlrYPmgZnmj5rmlJjmla3mmpjvpbrmpYrmqKPmtIvngIHnhaznl5LnmI3nprPnqbDvpbvnvorvpbzopYTvpb3orpPph4Dpmb3vpb7ppIrlnITlvqHmlrzmvIHnmIDnpqboqp7ppq3prZrpvazlhITmhrbmipHmqo3oh4blgYPloLDlvabnhInoqIDoq7rlrbzomJbkv7rlhLzlmrTlpYTmjqnmt7nltqrmpa3lhobkuojkvZnvpb/vpoDvpoHlpoLvpoJcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNmExXCIsXG5cdFx0XCLvpoPmrZ/msZ3vpoTnkrXnpJbvpoXoiIfoiYXojLnovL/ovZ3vpobppJjvpofvpojvponkuqbvporln5/lvbnmmJPvpovvpoznlqvnubnora/vpo3pgIbpqZvlmqXloKflp7jlqJ/lrrTvpo7lu7bvpo/vppDmjZDmjLvvppHmpL3msofmsr/mto7mtpPmt7XmvJTvppLng5/nhLbnhZnvppPnh4Pnh5XvppTnoY/noa/vppXnrbXnt6PvppbnuK/vppfooY3ou5/vppjvppnvpprpiZvvppvps7bvppzvpp3vpp7mgoXmtoXvpp/nhrHvpqDvpqHplrHljq3vpqLvpqPvpqTmn5PvpqXngo7nhLDnkLDoibboi5JcIlxuXHRdLFxuXHRbXG5cdFx0XCJlN2ExXCIsXG5cdFx0XCLvpqbplrvpq6Xpub3mm4Tvpqfnh4HokYnvpqjvpqnloYvvpqrvpqvltrjlvbHvpqzmmKDmmo7mpbnmpq7msLjms7PmuLbmvYHmv5rngJvngK/nhZDnh5/njbDvpq3nkZvvpq7nk5Tnm4jnqY7nupPvpq/vprDoi7HoqaDov47vprHpjYjvprLpnJnvprPvprTkuYLlgKrvprXliIjlj6Hmm7Pmsa3mv4rnjIrnnb/nqaLoiq7ol53omILvprboo5ToqaPorb3osavvprfpirPvprjpnJPpoJDkupTkvI3kv4nlgrLljYjlkL7lkLPll5rloaLlorrlpaflqJvlr6Tmgp/vprnmh4rmlZbml7/mmaTmoqfmsZrmvrNcIlxuXHRdLFxuXHRbXG5cdFx0XCJlOGExXCIsXG5cdFx0XCLng4/nhqznjZLnrb3onIjoqqTpsLLpvIflsYvmsoPnjYTnjonpiLrmuqvnkaXnmJ/nqannuJXomIrlhYDlo4Xmk4Hnk67nlJXnmbDnv4HpgpXpm43ppZTmuKbnk6bnqqnnqqroh6Xom5nonbjoqJvlqYnlrozlrpvmoqHmpIDmtaPnjqnnkJPnkKznopfnt6nnv6vohJjohZXojp7osYzpmK7poJHmm7DlvoDml7rmnonmsarnjovlgK3lqIPmrarnn67lpJbltazlt43njKXnlY/vprrvprvlg6Xlh7nloK/lpK3lppblp5rlr6Xvprzvpr3ltqLmi5fmkJbmkpPmk77vpr7mm5zvpr/mqYjvp4Dnh7/nkaTvp4FcIlxuXHRdLFxuXHRbXG5cdFx0XCJlOWExXCIsXG5cdFx0XCLnqojnqq/nuYfnuZ7ogIDohbDvp4Lon6/opoHorKDpgZnvp4PpgoDppZLmhb7mrLLmtbTnuJ/opKXovrHkv5Hlgq3lhpfli4fln4floonlrrnlurjmhYLmppXmtozmuafmurbnhpTnkaLnlKjnlKzogbPojLjok4nouIrpjpTpj57vp4Tkuo7kvZHlgbblhKrlj4jlj4vlj7Plroflr5PlsKTmhJrmhoLml7TniZvnjpfnkYDnm4LnpZDnppHnprnntIbnvr3oiovol5XomZ7ov4LpgYfpg7Xph6rpmoXpm6jpm6nli5blvafml63mmLHmoK/nhZznqLbpg4HpoIrkupHvp4XmqZLmrp7mvpDnhonogJjoirjolZNcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYWExXCIsXG5cdFx0XCLpgYvpmpXpm7Lpn7volJrprLHkupDnhorpm4TlhYPljp/lk6HlnJPlnJLlnqPlqpvlq4Tlr4PmgKjmhL/mj7TmsoXmtLnmubLmupDniLDnjL/nkZfoi5HoooHovYXpgaDvp4bpmaLpoZjptJvmnIjotorpiZ7kvY3lgYnlg57ljbHlnI3lp5TlqIHlsInmhbDmmpDmuK3niLLnkYvnt6/og4PokI7okabolL/onZ/ooZvopJjorILpgZXpn4vprY/kubPkvpHlhJLlharvp4fllK/llqnlrbrlrqXlubzlub3lur7mgqDmg5/mhIjmhInmj4TmlLjmnInvp4jmn5Tmn5rvp4nmpaHmpaLmsrnmtKfvp4rmuLjvp4tcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYmExXCIsXG5cdFx0XCLmv6HnjLbnjLfvp4znkZznlLHvp43nmZLvp47vp4/ntq3oh77okLjoo5Xoqpjoq5voq63ouLDouYLpgYrpgL7pgbrphYnph4npja7vp5Dvp5HloInvp5Lmr5PogonogrLvp5Pvp5TlhYHlpavlsLnvp5Xvp5bmvaTnjqfog6TotIfvp5fpiJfplo/vp5jvp5nvp5rvp5vogb/miI7ngJzntajono3vp5zlnqDmganmhYfmrrfoqr7pioDpmrHkuZnlkJ/mt6volK3pmbDpn7Ppo67mj5bms6PpgpHlh53mh4nohrrpt7nkvp3lgJrlhIDlrpzmhI/mh7/mk6zmpIXmr4XnlpHnn6PnvqnoiaTolo/on7vooaPoqrxcIlxuXHRdLFxuXHRbXG5cdFx0XCJlY2ExXCIsXG5cdFx0XCLorbDphqvkuozku6XkvIrvp53vp57lpLflp6jvp5/lt7LlvJvlvZvmgKHvp6Dvp6Hvp6Lvp6PniL7nj6Xvp6TnlbDnl43vp6Xnp7vvp6bogIzogLPogoToi6HojZHvp6fvp6josr3osrPpgofvp6nvp6rpo7TppIzvp6vvp6zngLfnm4rnv4rnv4znv7zorJrkurrku4HliIPljbDvp63lkr3lm6Dlp7vlr4XlvJXlv43mua7vp67vp6/ntarojLXvp7DompPoqo3vp7Hpna3pnbfvp7Lvp7PkuIDkvZrkvb7lo7nml6XmuqLpgLjpjrDpprnku7vlo6zlporlp5nmgYHvp7Tvp7XnqJTvp7bojY/os4PlhaXljYRcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZGExXCIsXG5cdFx0XCLvp7fvp7jvp7nku43lianlrZXoir/ku5TliLrlkqjlp4nlp7/lrZDlrZflrZzmgaPmhYjmu4vngpnnha7njobnk7fnlrXno4HntKvogIXoh6rojKjolJfol4noq67os4fpm4zkvZzli7rlmrzmlqvmmKjngbzngrjniLXntr3oio3phYzpm4DptbLlrbHmo6fmrpjmvbrnm57lspHmmqvmvZvnrrTnsKrooLbpm5zkuIjku5fljKDloLTlorvlo6/lpazlsIfluLPluoTlvLXmjozmmrLmnZbmqJ/mqqPmrIzmvL/niYbvp7rnjZDnkovnq6Dnsqfohbjoh5/oh6fojorokazolKPolpTol4/oo53otJPphqzplbdcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZWExXCIsXG5cdFx0XCLpmpzlho3lk4nlnKjlrrDmiY3mnZDmoL3mopPmuL3mu5Pngb3nuKHoo4HosqHovInpvYvpvY7niK3nro/oq43pjJrkvYfkvY7lhLLlkoDlp5DlupXmirXmnbXmpa7mqJfmsq7muJrni5nnjKrnlr3nrrjntLXoi6foj7nokZfol7foqZvosq/ouofpgJnpgrjpm47pvZ/li6PlkIrlq6Hlr4LmkZjmlbXmu7Tni4Tvp7vnmoTnqY3nrJvnsY3nuL7nv5/ojbvorKvos4rotaTot6HouZ/ov6rov7npganpj5HkvYPkvbrlgrPlhajlhbjliY3liarloaHlobzlpaDlsIjlsZXlu5vmgpvmiLDmoJPmrr/msIjmvrFcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZmExXCIsXG5cdFx0XCLnhY7nkKDnlLDnlLjnlZHnmbLnrYznrovnrq3nr4bnuo/oqa7ovL7ovYnpiL/pipPpjKLpkKvpm7vpoZrpoavppJ7liIfmiKrmipjmtZnnmaTnq4rnr4DntbbljaDlsr7lupfmvLjngrnnspjpnJHpro7pu57mjqXmkbronbbkuIHkupXkuq3lgZzlgbXlkYjlp4PlrprluYDluq3lu7flvoHmg4XmjLrmlL/mlbTml4zmmbbmmbjmn77mpajmqonmraPmsYDmt4Dmt6jmuJ/muZ7ngJ7ngqHnjo7nj73nlLrnnZvnoofnpo7nqIvnqb3nsr7nto7oiYfoqILoq6rosp7phK3phYrph5jpiabpi4zpjKDpnIbpnZZcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMGExXCIsXG5cdFx0XCLpnZzpoILpvI7liLblipHllbzloKTluJ3lvJ/mgozmj5Dmoq/mv5/npa3nrKzoh43olrroo73oq7jouYTpho3pmaTpmpvpnL3poYzpvYrkv47lhYblh4vliqnlmLLlvJTlvavmjqrmk43ml6nmmYHmm7rmm7nmnJ3mop3mo5fmp73mvJXmva7nhafnh6XniKrnkqrnnLrnpZbnpZrnp5/nqKDnqpXnspfns5/ntYTnubDogofol7vomqToqZToqr/otpnouoHpgKDpga3ph6PpmLvpm5Xps6Xml4/nsIfotrPpj4PlrZjlsIrljZLmi5nnjJ3lgKflrpflvp7mgrDmhavmo5Xmt5nnkK7nqK7ntYLntpznuLHohatcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMWExXCIsXG5cdFx0XCLouKrouLXpjb7pkJjkvZDlnZDlt6bluqfmjKvnvarkuLvkvY/kvo/lgZrlp53og4Tlkarlkajll77lpY/lrpnlt57lu5rmmZ3mnLHmn7HmoKrms6jmtLLmuYrmvo3ngrfnj6DnlofnsYzntILntKzntqLoiJ/om5voqLvoqoXotbDouorovLPpgLHphY7phZLpkYTpp5Dnq7nnsqXkv4rlhIHlh4bln4jlr6/ls7vmmZnmqL3mtZrmupbmv6znhIznla/nq6PooKLpgKHpgbXpm4vpp7/ojIHkuK3ku7LooYbph43ljb3mq5vmpavmsYHokbrlop7mho7mm77mi6/ng53nlJHnl4fnuZLokrjorYnotIjkuYvlj6pcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMmExXCIsXG5cdFx0XCLlkqvlnLDlnYDlv5fmjIHmjIfmka/mlK/ml6jmmbrmnp3mnrPmraLmsaDmsprmvKznn6XnoKXnpYnnpZfntJnogqLohILoh7Poip3oirfonJjoqozvp7zotITotr7pgbLnm7TnqJnnqLfnuZTogbfllIfll5TlobXmjK/mkKLmmYnmmYvmoa3mppvmroTmtKXmurHnj43nkajnkqHnlZvnlrnnm6HnnJ7nnovnp6bnuInnuJ3oh7volK/oopfoqLros5Hou6vovrDpgLLpjq3pmaPpmbPpnIfkvoTlj7Hlp6rlq4nluJnmoY7nk4bnlr7np6nnqpLohqPom63os6rot4zov63mlp/mnJXvp73ln7fmvZfnt53ovK9cIlxuXHRdLFxuXHRbXG5cdFx0XCJmM2ExXCIsXG5cdFx0XCLpj7bpm4blvrXmh7LmvoTkuJTkvpjlgJ/lj4nll5/lta/lt67mrKHmraTno4vnrprvp77ouYnou4rpga7mjYnmkL7nnYDnqoTpjK/pkb/pvarmkrDmvq/nh6bnkqjnk5rnq4TnsJLnuoLnsrLnupjorprotIrpkb3ppJDppYzliLnlr5/mk6bmnK3ntK7lg63lj4PlobnmhZjmhZnmh7rmlqznq5norpLorpblgInlgKHlibXllLHlqLzlu6DlvbDmhLTmlZ7mmIzmmLbmmqLmp43mu4TmvLLnjJbnmKHnqpPohLnoiZnoj5bokrzlgrXln7Dlr4Dlr6jlvanmjqHnoKbntrXoj5zolKHph4fph7Xlhormn7XnrZZcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNGExXCIsXG5cdFx0XCLosqzlh4Tlprvmgr3omZXlgJzvp7/liZTlsLrmhb3miJrmi5Pmk7LmlqXmu4znmKDohIrouaDpmZ/pmrvku5/ljYPllpjlpKnlt53mk4Xms4nmt7rnjpTnqb/oiJvolqbos6TouJDpgbfph6fpl6HpmKHpn4blh7jlk7LlloblvrnmkqTmvojntrTovJ/ovY3pkLXlg4nlsJbmsr7mt7vnlJvnnrvnsL3nsaToqbnoq4LloJ7lpr7luJbmjbfniZLnlornnavoq5zosrzovJLlu7PmmbTmt7jogb3oj4Hoq4vpnZHpr5bvqIDliYPmm7/mtpXmu6/nt6Doq6bpgK7pgZ7pq5TliJ3lib/lk6jmhpTmioTmi5vmoqJcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNWExXCIsXG5cdFx0XCLmpJLmpZrmqLXngpLnhKbnoZ3npIHnpI7np5LnqI3ogpboibjoi5XojYnolYnosoLotoXphaLphovphq7kv4Plm5Hnh63nn5fonIDop7jlr7jlv5bmnZHpgqjlj6LloZrlr7XmgqTmhoHmkaDnuL3ogbDolKXpioPmkq7lgqzltJTmnIDlopzmir3mjqjmpI7mpbjmqJ7muavnmrrnp4voirvokKnoq4/otqjov73phJLphYvphpzpjJDpjJjpjprpm5vpqLbpsI3kuJHnlZznpZ3nq7rnrZHnr4nnuK7ok4TouZnoubTou7jpgJDmmKXmpL/nkYPlh7rmnK7pu5zlhYXlv6Dmspbon7LooZ3oobfmgrTohrXokINcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNmExXCIsXG5cdFx0XCLotIXlj5blkLnlmLTlqLblsLHngornv6DogZrohIboh63otqPphonpqZ/pt7LlgbTku4TljqDmg7vmuKzlsaTkvojlgKTll6Tls5nluZ/mgaXmopTmsrvmt4Tnhr7nl5Tnl7TnmaHnqJrnqYnnt4fnt7vnva7oh7TomqnovJzpm4npprPpvZLliYfli4Xpo63opqrkuIPmn5LmvIbkvrXlr6LmnpXmsojmtbjnkJvnoKfph53pjbzon4Tnp6TnqLHlv6vku5blkqTllL7loq7lpqXmg7DmiZPmi5bmnLbmpZXoiLXpmYDpprHpp53lgKzljZPllYTlnbzvqIHmiZjvqILmk6Lmmavmn53mv4Hmv6/nkKLnkLjoqJdcIlxuXHRdLFxuXHRbXG5cdFx0XCJmN2ExXCIsXG5cdFx0XCLpkLjlkZHlmIblnablvYjmhprmrY7ngZjngq3ntrvoqpXlparohKvmjqLnnIjogL3osqrloZTmkK3mprvlrpXluJHmua/vqIPolanlhYzlj7DlpKrmgKDmhYvmrobmsbDms7DnrJ7og47oi5Tot4bpgrDporHvqITmk4fmvqTmkpHmlITlhY7lkJDlnJ/oqI7mhZ/mobbvqIXnl5vnrZLntbHpgJrloIbmp4zohb/opKrpgIDpoLnlgbjlpZflpqzmipXpgI/prKrmhZ3nibnpl5blnaHlqYblt7Tmiormkq3mk7rmnbfms6LmtL7niKznkLbnoLTnvbfoiq3ot5vpoJfliKTlnYLmnb/niYjnk6PosqnovqbpiJFcIlxuXHRdLFxuXHRbXG5cdFx0XCJmOGExXCIsXG5cdFx0XCLpmKrlhavlj63mjYzkvanllITmgpbmlZfmspvmtb/niYzni73nqJfopofosp3lva3mvo7ng7nohqjmhI7kvr/lgY/miYHniYfnr4fnt6jnv6npgY3pnq3pqJnosrblnarlubPmnrDokI3oqZXlkKDlrJbluaPlu6LlvIrmloPogrrolL3plonpmZvkvYjljIXljI3ljI/lkoblk7rlnIPluIPmgJbmipvmirHmjZXvqIbms6HmtabnlrHnoLLog57ohK/oi57okaHokrLooo3opJLpgIvpi6rpo73prpHluYXmmrTmm53ngJHniIbvqIfkv7Xlib3lvarmhZPmnZPmqJnmvILnk6Lnpajooajosbnpo4fpo4TpqYNcIlxuXHRdLFxuXHRbXG5cdFx0XCJmOWExXCIsXG5cdFx0XCLlk4HnqJ/mpZPoq7fosYrpoqjppq7lvbzmiqvnlrLnmq7ooqvpgb/pmYLljLnlvLzlv4Xms4znj4znlaLnlovnrYboi77ppp3kuY/pgLzkuIvkvZXljqblpI/lu4jmmLDmsrPnkZXojbfonabos4DpgZDpnJ7psJXlo5HlrbjomZDorJTptrTlr5Lmgajmgo3ml7HmsZfmvKLmvqPngJrnvZXnv7DplpHplpLpmZDpn5PlibLovYTlh73lkKvlkrjllaPllormqrvmtrXnt5joiabpipzpmbfpubnlkIjlk4jnm5Lom6TplqTpl5TpmZzkuqLkvInlp67lq6blt7fmgZLmipfmna3moYHmsobmuK/nvLjogpvoiKpcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYWExXCIsXG5cdFx0XCLvqIjvqInpoIXkuqXlgZXlkrPlnpPlpZrlranlrrPmh4jmpbfmtbfngKPon7nop6PoqbLoq6fpgoLpp63pqrjlir7moLjlgJblubjmnY/ojYfooYzkuqvlkJHlmq7nj6bphJXpn7/ppInppZfpppnlmZPlop/omZvoqLHmhrLmq7bnjbvou5LmrYfpmqrpqZflpZXniIDotavpnankv5Tls7TlvKbmh7jmmZvms6vngqvnjoTnjrnnj77nnKnnnY3ntYPntaLnuKPoiLfooZLvqIros6LpiYnpoa/lrZHnqbTooYDpoIHlq4zkv6DljZTlpL7ls73mjL7mtbnni7nohIXohIfojqLpi4/poLDkuqjlhYTliJHlnotcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYmExXCIsXG5cdFx0XCLlvaLms4Lmu47ngIXngZDngq/nhpLnj6nnkanojYronqLooaHpgIjpgqLpjqPppqjlha7lvZfmg6DmhafmmrPolZnouYrphq/pnovkuY7kupLlkbzlo5Xlo7rlpb3lsrXlvKfmiLbmiYjmmIrmmafmr6vmtanmt4/muZbmu7jmvpTmv6Dmv6nngZ3ni5DnkKXnkZrnk6DnmpPnpZzns4rnuJ7og6Hoiqbokavokr/omY7omZ/onbTorbfosarpjqzpoIDpoaXmg5HmiJbphbflqZrmmI/mt7fmuL7nkL/prYLlv73mg5rnrI/lk4TlvJjmsZ7ms5PmtKrng5jntIXombnoqIzptLvljJblkozlrIXmqLrngavnlbVcIlxuXHRdLFxuXHRbXG5cdFx0XCJmY2ExXCIsXG5cdFx0XCLnpo3npr7oirHoj6/oqbHorYHosqjpnbTvqIvmk7TmlKvnorrnorvnqavkuLjllprlpZDlrqblubvmgqPmj5vmraHmmaXmoZPmuJnnhaXnkrDntIjpgoTpqanpsKXmtLvmu5HnjL7osYHpl4rlh7DluYzlvqjmgY3mg7bmhLDmhYzmmYPmmYTmpqXms4HmuZ/mu4nmvaLnhYznkpznmofnr4HnsKfojZLonZfpgZHpmo3pu4PljK/lm57lu7vlvormgaLmgpTmh7fmmabmnIPmqpzmt67mvq7ngbDnjarnuarohr7ojLTom5Toqqjos4TlioPnjbLlrpbmqavpkITlk67lmoblrZ3mlYjmloXmm4nmop/mto3mt4ZcIlxuXHRdLFxuXHRbXG5cdFx0XCJmZGExXCIsXG5cdFx0XCLniLvogrTphbXpqY3kvq/lgJnljprlkI7lkLzllonll4XluL/lvozmnL3nhabnj53pgIXli5vli7PloaTlo47nhITnho/nh7volrDoqJPmmojolqjllqfmmoTnhYrokLHljYnllpnmr4HlvZnlvr3mj67mmonnhYfoq7HovJ3pur7kvJHmkLrng4vnlabomafmgaTorY7pt7jlhYflh7bljIjmtLbog7jpu5HmmJXmrKPngpjnl5XlkIPlsbnntIfoqJbmrKDmrL3mrYblkLjmgbDmtL3nv5XoiIjlg5blh57llpzlmavlm43lp6zlrInluIzmhpnmhpjmiLHmmZ7mm6bnhpnnhrnnhrrniqfnpqfnqIDnvrLoqbBcIlxuXHRdXG5dO1xuXG52YXIgY3A5NDkkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnZGVmYXVsdCc6IGNwOTQ5XG59KTtcblxudmFyIGNwOTUwID0gW1xuXHRbXG5cdFx0XCIwXCIsXG5cdFx0XCJcXHUwMDAwXCIsXG5cdFx0MTI3XG5cdF0sXG5cdFtcblx0XHRcImExNDBcIixcblx0XHRcIuOAgO+8jOOAgeOAgu+8juKAp++8m++8mu+8n++8ge+4sOKApuKApe+5kO+5ke+5ksK377mU77mV77mW77mX772c4oCT77ix4oCU77iz4pW077i077mP77yI77yJ77i177i2772b772d77i377i444CU44CV77i577i644CQ44CR77i777i844CK44CL77i977i+44CI44CJ77i/77mA44CM44CN77mB77mC44CO44CP77mD77mE77mZ77maXCJcblx0XSxcblx0W1xuXHRcdFwiYTFhMVwiLFxuXHRcdFwi77mb77mc77md77me4oCY4oCZ4oCc4oCd44Cd44Ce4oC14oCy77yD77yG77yK4oC7wqfjgIPil4vil4/ilrPilrLil47imIbimIXil4fil4bilqHilqDilr3ilrzjiqPihIXCr++/o++8v8uN77mJ77mK77mN77mO77mL77mM77mf77mg77mh77yL77yNw5fDt8Kx4oia77yc77ye77yd4omm4omn4omg4oie4omS4omh77miXCIsXG5cdFx0NCxcblx0XHRcIu+9nuKIqeKIquKKpeKIoOKIn+KKv+OPkuOPkeKIq+KIruKIteKItOKZgOKZguKKleKKmeKGkeKGk+KGkOKGkuKGluKGl+KGmeKGmOKIpeKIo++8j1wiXG5cdF0sXG5cdFtcblx0XHRcImEyNDBcIixcblx0XHRcIu+8vOKIle+5qO+8hO+/peOAku+/oO+/oe+8he+8oOKEg+KEie+5qe+5qu+5q+OPleOOnOOOneOOnuOPjuOOoeOOjuOOj+OPhMKw5YWZ5YWb5YWe5YWd5YWh5YWj5Zen55Op57OO4paBXCIsXG5cdFx0Nyxcblx0XHRcIuKWj+KWjuKWjeKWjOKWi+KWiuKWieKUvOKUtOKUrOKUpOKUnOKWlOKUgOKUguKWleKUjOKUkOKUlOKUmOKVrVwiXG5cdF0sXG5cdFtcblx0XHRcImEyYTFcIixcblx0XHRcIuKVruKVsOKVr+KVkOKVnuKVquKVoeKXouKXo+KXpeKXpOKVseKVsuKVs++8kFwiLFxuXHRcdDksXG5cdFx0XCLihaBcIixcblx0XHQ5LFxuXHRcdFwi44ChXCIsXG5cdFx0OCxcblx0XHRcIuWNgeWNhOWNhe+8oVwiLFxuXHRcdDI1LFxuXHRcdFwi772BXCIsXG5cdFx0MjFcblx0XSxcblx0W1xuXHRcdFwiYTM0MFwiLFxuXHRcdFwi772X772Y772Z772azpFcIixcblx0XHQxNixcblx0XHRcIs6jXCIsXG5cdFx0Nixcblx0XHRcIs6xXCIsXG5cdFx0MTYsXG5cdFx0XCLPg1wiLFxuXHRcdDYsXG5cdFx0XCLjhIVcIixcblx0XHQxMFxuXHRdLFxuXHRbXG5cdFx0XCJhM2ExXCIsXG5cdFx0XCLjhJBcIixcblx0XHQyNSxcblx0XHRcIsuZy4nLisuHy4tcIlxuXHRdLFxuXHRbXG5cdFx0XCJhM2UxXCIsXG5cdFx0XCLigqxcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNDQwXCIsXG5cdFx0XCLkuIDkuZnkuIHkuIPkuYPkuZ3kuobkuozkurrlhL/lhaXlhavlh6DliIDliIHlipvljJXljYHljZzlj4jkuInkuIvkuIjkuIrkuKvkuLjlh6HkuYXkuYjkuZ/kuZ7kuo7kuqHlhYDliIPli7rljYPlj4nlj6PlnJ/lo6vlpJXlpKflpbPlrZDlrZHlrZPlr7jlsI/lsKLlsLjlsbHlt53lt6Xlt7Hlt7Llt7Plt77lubLlu77lvIvlvJPmiY1cIlxuXHRdLFxuXHRbXG5cdFx0XCJhNGExXCIsXG5cdFx0XCLkuJHkuJDkuI3kuK3kuLDkuLnkuYvlsLnkuojkupHkupXkupLkupTkuqLku4Hku4Dku4Pku4bku4fku43ku4rku4vku4TlhYPlhYHlhaflha3lha7lhazlhpflh7bliIbliIfliIjli7vli77li7/ljJbljLnljYjljYfljYXljZ7ljoTlj4vlj4rlj43lo6zlpKnlpKvlpKrlpK3lrZTlsJHlsKTlsLrlsa/lt7Tlubvlu7/lvJTlvJXlv4PmiIjmiLbmiYvmiY7mlK/mlofmlpfmlqTmlrnml6Xmm7DmnIjmnKjmrKDmraLmrbnmr4vmr5Tmr5vmsI/msLTngavniKrniLbniLvniYfniZnniZvniqznjovkuJlcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNTQwXCIsXG5cdFx0XCLkuJbkuJXkuJTkuJjkuLvkuY3kuY/kuY7ku6Xku5jku5Tku5Xku5bku5fku6Pku6Tku5nku57lhYXlhYTlhonlhorlhqzlh7nlh7rlh7jliIrliqDlip/ljIXljIbljJfljJ3ku5/ljYrljYnljaHljaDlja/lja7ljrvlj6/lj6Tlj7Plj6zlj67lj6nlj6jlj7zlj7jlj7Xlj6vlj6blj6rlj7Llj7Hlj7Dlj6Xlj63lj7vlm5vlm5rlpJZcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNWExXCIsXG5cdFx0XCLlpK7lpLHlpbTlpbblrZXlroPlsLzlt6jlt6flt6bluILluIPlubPlubzlvIHlvJjlvJflv4XmiIrmiZPmiZTmiZLmiZHmlqXml6bmnK7mnKzmnKrmnKvmnK3mraPmr43msJHmsJDmsLjmsYHmsYDmsL7niq/njoTnjonnk5znk6bnlJjnlJ/nlKjnlKnnlLDnlLHnlLLnlLPnlovnmb3nmq7nmr/nm67nn5vnn6Lnn7PnpLrnpr7nqbTnq4vkuJ7kuJ/kuZLkuZPkuankupnkuqTkuqbkuqXku7/kvInkvJnkvIrkvJXkvI3kvJDkvJHkvI/ku7Lku7bku7vku7Dku7Pku73kvIHkvIvlhYnlhYflhYblhYjlhahcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNjQwXCIsXG5cdFx0XCLlhbHlho3lhrDliJfliJHliJLliI7liJbliqPljIjljKHljKDljbDljbHlkInlkI/lkIzlkIrlkJDlkIHlkIvlkITlkJHlkI3lkIjlkIPlkI7lkIblkJLlm6Dlm57lm53lnLPlnLDlnKjlnK3lnKzlnK/lnKnlpJnlpJrlpLflpLjlpoTlpbjlpoPlpb3lpbnlpoLlpoHlrZflrZjlroflrojlroXlronlr7rlsJblsbnlt57luIblubblubRcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNmExXCIsXG5cdFx0XCLlvI/lvJvlv5nlv5bmiI7miIzmiI3miJDmiaPmiZvmiZjmlLbml6nml6jml6zml63mm7Lmm7PmnInmnL3mnLTmnLHmnLXmrKHmraTmrbvmsJbmsZ3msZfmsZnmsZ/msaDmsZDmsZXmsaHmsZvmsY3msY7ngbDniZ/niZ3nmb7nq7nnsbPns7jnvLbnvornvr3ogIHogIPogIzogJLogLPogb/ogonogovogozoh6Poh6roh7Poh7zoiIzoiJvoiJ/oia7oibLoib7omavooYDooYzooaPopb/pmKHkuLLkuqjkvY3kvY/kvYfkvZfkvZ7kvLTkvZvkvZXkvLDkvZDkvZHkvL3kvLrkvLjkvYPkvZTkvLzkvYbkvaNcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNzQwXCIsXG5cdFx0XCLkvZzkvaDkvK/kvY7kvLbkvZnkvZ3kvYjkvZrlhYzlhYvlhY3lhbXlhrblhrfliKXliKTliKnliKrliKjliqvliqnliqrliqzljKPljbPljbXlkJ3lkK3lkJ7lkL7lkKblkY7lkKflkYblkYPlkLPlkYjlkYLlkJvlkKnlkYrlkLnlkLvlkLjlkK7lkLXlkLblkKDlkLzlkYDlkLHlkKvlkJ/lkKzlm6rlm7Dlm6Tlm6vlnYrlnZHlnYDlnY1cIlxuXHRdLFxuXHRbXG5cdFx0XCJhN2ExXCIsXG5cdFx0XCLlnYflnY7lnL7lnZDlnY/lnLvlo6/lpL7lpp3lppLlpqjlpp7lpqPlppnlppblpo3lpqTlppPlporlpqXlrZ3lrZzlrZrlrZvlrozlrovlro/lsKzlsYDlsYHlsL/lsL7lspDlspHlspTlsozlt6vluIzluo/luofluorlu7flvITlvJ/lvaTlvaLlvbflvbnlv5jlv4zlv5flv43lv7Hlv6vlv7jlv6rmiJLmiJHmioTmipfmipbmioDmibbmionmia3miormibzmib7mibnmibPmipLmia/mipjmia7mipXmipPmipHmiobmlLnmlLvmlLjml7Hmm7TmnZ/mnY7mnY/mnZDmnZHmnZzmnZbmnZ7mnYnmnYbmnaBcIlxuXHRdLFxuXHRbXG5cdFx0XCJhODQwXCIsXG5cdFx0XCLmnZPmnZfmraXmr4/msYLmsZ7mspnmsoHmsojmsonmsoXmspvmsarmsbrmspDmsbDmsozmsajmspbmspLmsb3msoPmsbLmsb7msbTmsobmsbbmso3mspTmspjmsoLngbbngbzngb3ngbjniaLniaHniaDni4Tni4LnjpbnlKznlKvnlLfnlLjnmoLnm6/nn6Pnp4Hnp4Dnpr/nqbbns7vnvZXogpbogpPogp3ogpjogpvogprogrLoia/oipJcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOGExXCIsXG5cdFx0XCLoiovoio3opovop5LoqIDosLfosYbosZXosp3otaTotbDotrPouqvou4rovpvovrDov4Lov4bov4Xov4Tlt6HpgpHpgqLpgqrpgqbpgqPphYnph4bph4zpmLLpmK7pmLHpmKrpmKzkuKbkuZbkubPkuovkupvkup7kuqvkuqzkva/kvp3kvo3kvbPkvb/kvazkvpvkvovkvobkvoPkvbDkvbXkvojkvankvbvkvpbkvb7kvo/kvpHkvbrlhZTlhZLlhZXlhanlhbflhbblhbjlhr3lh73liLvliLjliLfliLrliLDliK7liLbliYHlir7lirvljZLljZTljZPljZHljabljbfljbjljbnlj5blj5Tlj5flkbPlkbVcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOTQwXCIsXG5cdFx0XCLlkpblkbjlkpXlkoDlkbvlkbflkoTlkpLlkoblkbzlkpDlkbHlkbblkozlkprlkaLlkajlkovlkb3lko7lm7rlnoPlnbflnarlnanlnaHlnablnaTlnbzlpJzlpYnlpYflpYjlpYTlpZTlpr7lprvlp5Tlprnlpq7lp5Hlp4blp5Dlp43lp4vlp5Plp4rlpq/lprPlp5Llp4XlrZ/lraTlraPlrpflrprlrpjlrpzlrpnlrpvlsJrlsYjlsYVcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOWExXCIsXG5cdFx0XCLlsYblsrflsqHlsrjlsqnlsqvlsrHlsrPluJjluJrluJbluJXluJvluJHlubjluprlupflupzlupXlupblu7blvKblvKflvKnlvoDlvoHlvb/lvbzlv53lv6Dlv73lv7Xlv7/mgI/mgJTmgK/mgLXmgJbmgKrmgJXmgKHmgKfmgKnmgKvmgJvmiJbmiJXmiL/miL7miYDmib/mi4nmi4zmi4Tmir/mi4Lmirnmi5Lmi5vmiqvmi5Pmi5Tmi4vmi4jmiqjmir3mirzmi5Dmi5nmi4fmi43mirXmi5rmirHmi5jmi5bmi5fmi4bmiqzmi47mlL7mlqfmlrzml7rmmJTmmJPmmIzmmIbmmILmmI7mmIDmmI/mmJXmmIpcIlxuXHRdLFxuXHRbXG5cdFx0XCJhYTQwXCIsXG5cdFx0XCLmmIfmnI3mnIvmna3mnovmnpXmnbHmnpzmnbPmnbfmnofmnp3mnpfmna/mnbDmnb/mnonmnb7mnpDmnbXmnprmnpPmnbzmnarmnbLmrKPmrabmrafmrb/msJPmsJvms6Pms6jms7PmsrHms4zms6XmsrPmsr3msr7msrzms6Lmsqvms5Xms5Pmsrjms4Tmsrnms4Hmsq7ms5fms4Xms7Hmsr/msrvms6Hms5vms4rmsqzms6/ms5zms5bms6BcIlxuXHRdLFxuXHRbXG5cdFx0XCJhYWExXCIsXG5cdFx0XCLngpXngo7ngpLngorngpnniKzniK3niLjniYjniafnianni4Dni47ni5nni5fni5Dnjqnnjqjnjp/njqvnjqXnlL3nlp3nlpnnlprnmoTnm4Lnm7Lnm7Tnn6Xnn73npL7npYDnpYHnp4nnp4jnqbrnqbnnq7rns77nvZTnvoznvovogIXogrrogqXogqLogrHogqHogqvogqnogrTogqrogq/oh6Xoh77oiI3oirPoip3oipnoiq3oir3oip/oirnoirHoiqzoiqXoiq/oirjoiqPoirDoir7oirfomY7ombHliJ3ooajou4vov47ov5Tov5HpgrXpgrjpgrHpgrbph4fph5HplbfploDpmJzpmYDpmL/pmLvpmYRcIlxuXHRdLFxuXHRbXG5cdFx0XCJhYjQwXCIsXG5cdFx0XCLpmYLpmrnpm6jpnZLpnZ7kup/kuq3kuq7kv6HkvrXkvq/kvr/kv6Dkv5Hkv4/kv53kv4Pkvrbkv5jkv5/kv4rkv5fkvq7kv5Dkv4Tkv4Lkv5rkv47kv57kvrflhZflhpLlhpHlhqDliY7liYPliYrliY3liYzliYvliYfli4fli4nli4Pli4HljI3ljZfljbvljprlj5vlkqzlk4Dlkqjlk47lk4nlkrjlkqblkrPlk4flk4Llkr3lkqrlk4FcIlxuXHRdLFxuXHRbXG5cdFx0XCJhYmExXCIsXG5cdFx0XCLlk4Tlk4jlkq/lkqvlkrHlkrvlkqnlkqflkr/lm7/lnoLlnovlnqDlnqPlnqLln47lnq7lnpPlpZXlpZHlpY/lpY7lpZDlp5zlp5jlp7/lp6Plp6jlqIPlp6Xlp6rlp5rlp6blqIHlp7vlranlrqPlrqblrqTlrqLlrqXlsIHlsY7lsY/lsY3lsYvls5nls5Llt7fluJ3luKXluJ/lub3luqDluqblu7rlvIjlvK3lvaXlvojlvoXlvorlvovlvoflvozlvonmgJLmgJ3mgKDmgKXmgI7mgKjmgY3mgbDmgajmgaLmgYbmgYPmgazmgavmgarmgaTmiYHmi5zmjJbmjInmi7zmi63mjIHmi67mi73mjIfmi7Hmi7dcIlxuXHRdLFxuXHRbXG5cdFx0XCJhYzQwXCIsXG5cdFx0XCLmi6/mi6zmi77mi7TmjJHmjILmlL/mlYXmlqvmlr3ml6LmmKXmmK3mmKDmmKfmmK/mmJ/mmKjmmLHmmKTmm7fmn7/mn5Pmn7Hmn5Tmn5Dmn6zmnrbmnq/mn7Xmn6nmn6/mn4Tmn5HmnrTmn5rmn6Xmnrjmn4/mn57mn7PmnrDmn5nmn6Lmn53mn5LmrarmroPmrobmrrXmr5Lmr5fmsJ/ms4nmtIvmtLLmtKrmtYHmtKXmtIzmtLHmtJ7mtJdcIlxuXHRdLFxuXHRbXG5cdFx0XCJhY2ExXCIsXG5cdFx0XCLmtLvmtL3mtL7mtLbmtJvms7XmtLnmtKfmtLjmtKnmtK7mtLXmtI7mtKvngqvngrrngrPngqzngq/ngq3ngrjngq7ngqTniLDnibLnia/nibTni6nni6Dni6Hnjrfnj4rnjrvnjrLnj43nj4DnjrPnlJrnlK3nlY/nlYznlY7nlYvnlqvnlqTnlqXnlqLnlqPnmbjnmobnmofnmojnm4jnm4bnm4Pnm4XnnIHnm7nnm7jnnInnnIvnm77nm7znnIfnn5znoILnoJTnoIznoI3npYbnpYnnpYjnpYfnprnnprrnp5Hnp5Lnp4vnqb/nqoHnq7/nq73nsb3ntILntIXntIDntInntIfntITntIbnvLjnvo7nvr/ogIRcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZDQwXCIsXG5cdFx0XCLogJDogI3ogJHogLbog5bog6Xog5rog4Pog4Tog4zog6Hog5vog47og57og6Tog53oh7ToiKLoi6fojIPojIXoi6Poi5voi6bojIToi6XojILojInoi5Loi5foi7HojIHoi5zoi5Toi5Hoi57oi5Poi5/oi6/ojIbomZDombnombvombrooY3ooavopoHop5ToqIjoqILoqIPosp7osqDotbTotbPotrTou43ou4zov7Dov6bov6Lov6rov6VcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZGExXCIsXG5cdFx0XCLov63ov6vov6Tov6jpg4rpg47pg4Hpg4PphYvphYrph43ploLpmZDpmYvpmYzpmY3pnaLpnanpn4vpn63pn7PpoIHpoqjpo5vpo5/pppbpppnkuZjkurPlgIzlgI3lgKPkv6/lgKblgKXkv7jlgKnlgJblgIblgLzlgJ/lgJrlgJLlgJHkv7rlgIDlgJTlgKjkv7HlgKHlgIvlgJnlgJjkv7Pkv67lgK3lgKrkv77lgKvlgInlhbzlhqTlhqXlhqLlh43lh4zlh4blh4vliZbliZzliZTliZvliZ3ljKrljb/ljp/ljp3lj5/lk6jllJDllIHllLflk7zlk6Xlk7LllIblk7rllJTlk6nlk63lk6HllInlk67lk6pcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZTQwXCIsXG5cdFx0XCLlk6bllKfllIflk73llI/lnIPlnITln4Lln5Tln4vln4PloInlpI/lpZflpZjlpZrlqJHlqJjlqJzlqJ/lqJvlqJPlp6zlqKDlqKPlqKnlqKXlqIzlqInlravlsZjlrrDlrrPlrrblrrTlrq7lrrXlrrnlrrjlsITlsZHlsZXlsZDls63ls73ls7vls6rls6jls7Dls7bltIHls7Tlt67luK3luKvluqvluq3luqflvLHlvpLlvpHlvpDmgZlcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZWExXCIsXG5cdFx0XCLmgaPmgaXmgZDmgZXmga3mganmga/mgoTmgp/mgprmgo3mgpTmgozmgoXmgpbmiYfmi7PmjIjmi7/mjY7mjL7mjK/mjZXmjYLmjYbmjY/mjYnmjLrmjZDmjL3mjKrmjKvmjKjmjY3mjYzmlYjmlYnmlpnml4Hml4XmmYLmmYnmmY/mmYPmmZLmmYzmmYXmmYHmm7jmnJTmnJXmnJfmoKHmoLjmoYjmoYbmoZPmoLnmoYLmoZTmoKnmorPmoJfmoYzmoZHmoL3mn7TmoZDmoYDmoLzmoYPmoKrmoYXmoJPmoJjmoYHmrormronmrrfmsKPmsKfmsKjmsKbmsKTms7DmtarmtpXmtojmtofmtabmtbjmtbfmtZnmtpNcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZjQwXCIsXG5cdFx0XCLmtazmtonmta7mtZrmtbTmtanmtozmtormtbnmtoXmtaXmtpTng4rng5jng6Tng5nng4jng4/niLnnibnni7zni7nni73ni7jni7fnjobnj63nkInnj67nj6Dnj6rnj57nlZTnlZ3nlZznlZrnlZnnlr7nl4Xnl4fnlrLnlrPnlr3nlrznlrnnl4LnlrjnmovnmrDnm4rnm43nm47nnKnnnJ/nnKDnnKjnn6nnoLDnoKfnoLjnoJ3noLTnoLdcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZmExXCIsXG5cdFx0XCLnoKXnoK3noKDnoJ/noLLnpZXnpZDnpaDnpZ/npZbnpZ7npZ3npZfnpZrnp6Tnp6Pnp6fnp5/np6bnp6nnp5jnqoTnqojnq5nnrIbnrJHnsonntKHntJfntIvntIrntKDntKLntJTntJDntJXntJrntJzntI3ntJnntJvnvLrnvZ/nvpTnv4Xnv4HogIbogJjogJXogJnogJfogL3ogL/og7HohILog7DohIXog63og7TohIbog7jog7PohIjog73ohIrog7zog6/oh63oh6zoiIDoiJDoiKroiKvoiKjoiKzoirvojKvojZLojZTojYrojLjojZDojYnojLXojLTojY/ojLLojLnojLbojJfojYDojLHojKjojYNcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMDQwXCIsXG5cdFx0XCLomZTomoromqrompPomqTomqnomozomqPompzoobDoobfoooHoooLoob3oobnoqJjoqJDoqI7oqIzoqJXoqIroqJfoqJPoqJboqI/oqJHosYjosbrosbnosqHosqLotbfouqzou5Lou5Tou4/ovrHpgIHpgIbov7fpgIDov7rov7TpgIPov73pgIXov7jpgpXpg6Hpg53pg6LphZLphY3phYzph5jph53ph5fph5zph5nploPpmaLpmaPpmaFcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMGExXCIsXG5cdFx0XCLpmZvpmZ3pmaTpmZjpmZ7pmrvpo6Lppqzpqqjpq5jprKXprLLprLzkub7lgbrlgb3lgZzlgYflgYPlgYzlgZrlgYnlgaXlgbblgY7lgZXlgbXlgbTlgbflgY/lgI/lga/lga3lhZzlhpXlh7Dliarlia/li5Lli5nli5jli5XljJDljI/ljJnljL/ljYDljL7lj4Pmm7zllYbllarllabllYTllZ7llaHllYPllYrllLHllZbllY/llZXllK/llaTllLjllK7llZzllKzllaPllLPllYHllZflnIjlnIvlnInln5/loIXloIrloIbln6Dln6Tln7rloILloLXln7fln7nlpKDlpaLlqLblqYHlqYnlqablqarlqYBcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMTQwXCIsXG5cdFx0XCLlqLzlqaLlqZrlqYblqYrlrbDlr4flr4Xlr4Tlr4Llrr/lr4blsInlsIjlsIflsaDlsZzlsZ3ltIfltIbltI7ltJvltJbltKLltJHltKnltJTltJnltKTltKfltJflt6LluLjluLbluLPluLflurflurjlurblurXlur7lvLXlvLflvZflvazlvanlvavlvpflvpnlvp7lvpjlvqHlvqDlvpzmgb/mgqPmgonmgqDmgqjmg4vmgrTmg6bmgr1cIlxuXHRdLFxuXHRbXG5cdFx0XCJiMWExXCIsXG5cdFx0XCLmg4XmgrvmgrXmg5zmgrzmg5jmg5Xmg4bmg5/mgrjmg5rmg4fmiJrmiJvmiYjmjqDmjqfmjbLmjpbmjqLmjqXmjbfmjafmjpjmjqrmjbHmjqnmjonmjoPmjpvmjavmjqjmjoTmjojmjpnmjqHmjqzmjpLmjo/mjoDmjbvmjanmjajmjbrmlZ3mlZbmlZHmlZnmlZfllZ/mlY/mlZjmlZXmlZTmlpzmlpvmlqzml4/ml4vml4zml47mmZ3mmZrmmaTmmajmmabmmZ7mm7nli5fmnJvmooHmoq/moqLmopPmorXmob/mobbmorHmoqfmopfmorDmooPmo4Tmoq3moobmooXmopTmop3moqjmop/moqHmooLmrLLmrrpcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMjQwXCIsXG5cdFx0XCLmr6vmr6zmsKvmto7mtrzmt7Pmt5nmtrLmt6Hmt4zmt6Tmt7vmt7rmuIXmt4fmt4vmtq/mt5Hmtq7mt57mt7nmtrjmt7fmt7Xmt4Xmt5LmuJrmtrXmt5rmt6vmt5jmt6rmt7Hmt67mt6jmt4bmt4Tmtqrmt6zmtr/mt6bng7nnhInnhIrng73ng6/niL3nib3nioHnjJznjJvnjJbnjJPnjJnnjofnkIXnkIrnkIPnkIbnj77nkI3nk6Dnk7ZcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMmExXCIsXG5cdFx0XCLnk7fnlJznlKLnlaXnlabnlaLnlbDnlo/nl5Tnl5XnlrXnl4rnl43nmo7nm5Tnm5Lnm5vnnLfnnL7nnLznnLbnnLjnnLrnoavnoYPnoY7npaXnpajnpa3np7vnqpLnqpXnrKDnrKjnrJvnrKznrKbnrJnnrJ7nrK7nspLnspfnspXntYbntYPntbHntK7ntLnntLzntYDntLDntLPntYTntK/ntYLntLLntLHnvL3nvp7nvprnv4znv47nv5LogJzogYrogYbohK/ohJbohKPohKvohKnohLDohKToiILoiLXoiLfoiLboiLnojo7ojp7ojpjojbjojqLojpbojr3ojqvojpLojorojpPojonojqDojbfojbvojbxcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMzQwXCIsXG5cdFx0XCLojobojqfomZXlvarom4fom4Domrbom4TomrXom4bom4vomrHomq/om4nooZPoop7ooojooqvoopLoopbooo3ooovoppPopo/oqKroqJ3oqKPoqKXoqLHoqK3oqJ/oqJvoqKLosYnosZrosqnosqzosqvosqjosqrosqfotafotabotr7otrrou5vou5/pgJnpgI3pgJrpgJfpgKPpgJ/pgJ3pgJDpgJXpgJ7pgKDpgI/pgKLpgJbpgJvpgJRcIlxuXHRdLFxuXHRbXG5cdFx0XCJiM2ExXCIsXG5cdFx0XCLpg6jpg63pg73phZfph47ph7Xph6bph6Pph6fph63ph6nplonpmarpmbXpmbPpmbjpmbDpmbTpmbbpmbfpmazpm4Dpm6rpm6nnq6Dnq5/poILpoIPprZrps6XpubXpub/puqXpurvlgqLlgo3lgoXlgpnlgpHlgoDlgpblgpjlgprmnIDlh7HlibLlibTlibXlianli57li53li5vljZrljqXllbvlloDllqfllbzllorllp3llpjlloLllpzllqrllpTllofllovlloPllrPllq7llp/llL7llrLllprllrvllqzllrHllb7llonllqvllpnlnI3loK/loKrloLTloKTloLDloLHloKHloJ3loKDlo7nlo7rlpaBcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNDQwXCIsXG5cdFx0XCLlqbflqprlqb/lqpLlqpvlqqflrbPlrbHlr5Llr4zlr5Plr5DlsIrlsIvlsLHltYzltZDltLTltYflt73luYXluL3luYDluYPlub7lu4rlu4Hlu4Llu4TlvLzlva3lvqnlvqrlvqjmg5Hmg6HmgrLmgrbmg6DmhJzmhKPmg7rmhJXmg7Dmg7vmg7Tmhajmg7HmhI7mg7bmhInmhIDmhJLmiJ/miYnmjqPmjozmj4/mj4Dmj6nmj4nmj4bmj41cIlxuXHRdLFxuXHRbXG5cdFx0XCJiNGExXCIsXG5cdFx0XCLmj5Lmj6Pmj5Dmj6Hmj5bmj63mj67mjbbmj7Tmj6rmj5vmkZLmj5rmj7nmlZ7mlabmlaLmlaPmlpHmlpDmlq/mma7mmbDmmbTmmbbmma/mmpHmmbrmmb7mmbfmm77mm7/mnJ/mnJ3mo7rmo5Xmo6Dmo5jmo5fmpIXmo5/mo7Xmo67mo6fmo7nmo5Lmo7Lmo6Pmo4vmo43mpI3mpJLmpI7mo4nmo5rmpa7mo7vmrL7mrLrmrL3mrpjmrpbmrrzmr6/msK7msK/msKzmuK/muLjmuZTmuKHmuLLmuafmuYrmuKDmuKXmuKPmuJvmuZvmuZjmuKTmuZbmua7muK3muKbmua/muLTmuY3muLrmuKzmuYPmuJ3muL7mu4tcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNTQwXCIsXG5cdFx0XCLmuonmuJnmuY7muaPmuYTmubLmuanmuZ/nhJnnhJrnhKbnhLDnhKHnhLbnha7nhJzniYznioTnioDnjLbnjKXnjLTnjKnnkLrnkKrnkLPnkKLnkKXnkLXnkLbnkLTnkK/nkJvnkKbnkKjnlKXnlKbnlavnlarnl6Lnl5vnl6Pnl5nnl5jnl57nl6DnmbvnmbznmpbnmpPnmrTnm5znnY/nn63noZ3noaznoa/nqI3nqIjnqIvnqIXnqIDnqphcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNWExXCIsXG5cdFx0XCLnqpfnqpbnq6Xnq6PnrYnnrZbnrYbnrZDnrZLnrZTnrY3nrYvnrY/nrZHnsp/nsqXntZ7ntZDntajntZXntKvnta7ntbLntaHntabntaLntbDntbPlloTnv5Tnv5XogIvogZLogoXohZXohZTohYvohZHohY7ohLnohYbohL7ohYzohZPohbToiJLoiJzoj6nokIPoj7jokI3oj6Doj4XokIvoj4Hoj6/oj7Hoj7TokZfokIroj7DokIzoj4zoj73oj7Loj4rokLjokI7okIToj5zokIfoj5Toj5/omZvom5/om5nom63om5Tom5vom6Tom5Dom57ooZfoo4Hoo4LoorHopoPoppboqLvoqaDoqZXoqZ7oqLzoqYFcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNjQwXCIsXG5cdFx0XCLoqZToqZvoqZDoqYboqLToqLroqLboqZbosaHosoLosq/osrzosrPosr3os4Hosrvos4DosrTosrfosrbosr/osrjotorotoXotoHot47ot53ot4vot5rot5Hot4zot5vot4bou7vou7jou7zovpzpgK7pgLXpgLHpgLjpgLLpgLbphILpg7XphInpg77phaPphaXph4/piJTpiJXpiKPpiInpiJ7piI3piJDpiIfpiJHplpTplo/plovplpFcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNmExXCIsXG5cdFx0XCLplpPplpLplo7pmorpmo7pmovpmb3pmoXpmobpmo3pmbLpmoTpm4Hpm4Xpm4Tpm4bpm4fpm6/pm7Lpn4zpoIXpoIbpoIjpo6fpo6rpo6/po6npo7Lpo63ppq7ppq3pu4Ppu43pu5HkuoLlgq3lgrXlgrLlgrPlg4Xlgr7lgqzlgrflgrvlgq/lg4flib/libflib3li5/li6bli6Tli6Lli6PljK/ll5/ll6jll5Pll6bll47ll5zll4fll5Hll6Pll6Tll6/ll5rll6Hll4Xll4bll6Xll4nlnJLlnJPloZ7loZHloZjloZfloZrloZTloavloYzloa3loYrloaLloZLloYvlpaflq4Hlq4nlq4zlqr7lqr3lqrxcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNzQwXCIsXG5cdFx0XCLlqrPlq4LlqrLltanlta/luYzlubnlu4nlu4jlvJLlvZnlvqzlvq7mhJrmhI/mhYjmhJ/mg7PmhJvmg7nmhIHmhIjmhY7mhYzmhYTmhY3mhL7mhLTmhKfmhI3mhIbmhLfmiKHmiKLmkJPmkL7mkJ7mkKrmkK3mkL3mkKzmkI/mkJzmkJTmkI3mkLbmkJbmkJfmkIbmlazmlp/mlrDmmpfmmonmmofmmojmmpbmmoTmmpjmmo3mnIPmppTmpa1cIlxuXHRdLFxuXHRbXG5cdFx0XCJiN2ExXCIsXG5cdFx0XCLmpZrmpbfmpaDmpZTmpbXmpLDmpoLmpYrmpajmpavmpZ7mpZPmpbnmpobmpZ3mpaPmpZvmrYfmrbLmr4Dmrr/mr5Pmr73muqLmuq/mu5Pmurbmu4LmupDmup3mu4fmu4XmuqXmupjmurzmurrmuqvmu5Hmupbmupzmu4Tmu5TmuqrmuqfmurTnhY7nhZnnhannhaTnhYnnhafnhZznhaznhabnhYznhaXnhZ7nhYbnhajnhZbniLrniZLnjLfnjYXnjL/njL7nka/nkZrnkZXnkZ/nkZ7nkYHnkL/nkZnnkZvnkZznlbbnlbjnmIDnl7DnmIHnl7Lnl7Hnl7rnl7/nl7Tnl7Pnm57nm5/nnZvnnavnnabnnZ7nnaNcIlxuXHRdLFxuXHRbXG5cdFx0XCJiODQwXCIsXG5cdFx0XCLnnbnnnarnnaznnZznnaXnnajnnaLnn67noo7norDnopfnopjnooznoonnobznopHnopPnob/npbrnpb/npoHokKznpr3nqJznqJrnqKDnqJTnqJ/nqJ7nqp/nqqDnrbfnr4DnraDnra7nrafnsrHnsrPnsrXntpPntbnntpHntoHnto/ntZvnva7nvannvarnvbLnvqnnvqjnvqTogZbogZjogobogoTohbHohbDohbjohaXoha7ohbPohatcIlxuXHRdLFxuXHRbXG5cdFx0XCJiOGExXCIsXG5cdFx0XCLohbnohbrohaboiIXoiYfokoLokbfokL3okLHokbXokabokavokYnokazokZvokLzokLXokaHokaPokanoka3okYbomZ7omZzomZ/om7nonJPonIjonIfonIDom77om7vonILonIPonIbonIrooZnoo5/oo5Too5noo5zoo5joo53oo6Hoo4roo5Xoo5Loppzop6PoqavoqbLoqbPoqaboqanoqbDoqofoqbzoqaPoqqDoqbHoqoXoqa3oqaLoqa7oqazoqbnoqbvoqL7oqajosaLosorosonos4ros4fos4jos4TosrLos4Pos4Los4Xot6Hot5/ot6jot6/ot7Pot7rot6rot6Tot6bourLovIPovInou77ovIpcIlxuXHRdLFxuXHRbXG5cdFx0XCJiOTQwXCIsXG5cdFx0XCLovp/ovrLpgYvpgYrpgZPpgYLpgZTpgLzpgZXpgZDpgYfpgY/pgY7pgY3pgZHpgL7pgYHphJLphJfphazpharphanph4npiLfpiZfpiLjpiL3piYDpiL7piZvpiYvpiaTpiZHpiLTpiYnpiY3piYXpiLnpiL/piZrplpjpmpjpmpTpmpXpm43pm4vpm4npm4rpm7fpm7vpm7npm7bpnZbpnbTpnbbpoJDpoJHpoJPpoIrpoJLpoIzpo7zpo7RcIlxuXHRdLFxuXHRbXG5cdFx0XCJiOWExXCIsXG5cdFx0XCLpo73po77pprPpprHpprTpq6Hps6npuoLpvI7pvJPpvKDlg6flg67lg6Xlg5blg63lg5rlg5Xlg4/lg5Hlg7Hlg47lg6nlhaLlh7PlioPlioLljLHljq3ll77lmIDlmJvlmJfll73lmJTlmIblmInlmI3lmI7ll7flmJblmJ/lmIjlmJDll7blnJjlnJblobXlob7looPlopPloorlobnlooXlob3lo73lpKXlpKLlpKTlparlpanlq6Hlq6blq6nlq5flq5blq5jlq6PlrbXlr57lr6flr6Hlr6Xlr6blr6jlr6Llr6Tlr5/lsI3lsaLltoTltofluZvluaPluZXluZfluZTlu5Plu5blvIrlvYblvbDlvrnmhYdcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYTQwXCIsXG5cdFx0XCLmhL/mhYvmhbfmhaLmhaPmhZ/mhZrmhZjmhbXmiKrmkofmkZjmkZTmkqTmkbjmkZ/mkbrmkZHmkafmkLTmka3mkbvmlbLmlqHml5fml5bmmqLmmqjmmp3mppzmpqjmppXmp4Hmpq7mp5Pmp4vmppvmprfmprvmpqvmprTmp5Dmp43mpq3mp4zmpqbmp4PmpqPmrYnmrYzmsLPmvLPmvJTmu77mvJPmu7TmvKnmvL7mvKDmvKzmvI/mvILmvKJcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYWExXCIsXG5cdFx0XCLmu7/mu6/mvIbmvLHmvLjmvLLmvKPmvJXmvKvmvK/mvojmvKrmu6zmvIHmu7Lmu4zmu7fnhpTnhpnnhb3nhornhoTnhpLniL7nipLnipbnjYTnjZDnkaTnkaPnkarnkbDnka3nlITnlpHnmKfnmI3nmIvnmInnmJPnm6Hnm6PnnoTnnb3nnb/nnaHno4Hnop/noqfnorPnoqnnoqPnpo7npo/npo3nqK7nqLHnqqrnqqnnq63nq6/nrqHnrpXnrovnrbXnrpfnrp3nrpTnro/nrrjnrofnroTnsrnnsr3nsr7ntrvntrDntpzntr3ntr7ntqDnt4rntrTntrLntrHntrrntqLntr/ntrXntrjntq3nt5Lnt4fntqxcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYjQwXCIsXG5cdFx0XCLnvbDnv6Dnv6Hnv5/ogZ7ogZrogofohZDohoDoho/ohojohorohb/ohoLoh6foh7roiIfoiJToiJ7oiYvok4nokr/ok4bok4Tokpnokp7okrLokpzok4vokrjok4Dok5PokpDokrzok5Hok4ronL/onJzonLvonKLonKXonLTonJjonZXonLfonKnoo7PopILoo7Too7noo7joo73oo6jopJroo6/oqqboqozoqp7oqqPoqo3oqqHoqpPoqqRcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYmExXCIsXG5cdFx0XCLoqqroqqXoqqjoqpjoqpHoqproqqfosaroso3osozos5Pos5Hos5LotavotpnotpXot7zovJTovJLovJXovJPovqPpgaDpgZjpgZzpgaPpgZnpgZ7pgaLpgZ3pgZvphJnphJjphJ7phbXphbjphbfphbTpibjpioDpioXpipjpipbpibvpipPpipzpiqjpibzpipHplqHplqjplqnplqPplqXplqTpmpnpmpzpmpvpm4zpm5LpnIDpnbzpnoXpn7bpoJfpoJjpoq/porHppIPppIXppIzppInpp4Hpqq/pqrDpq6bprYHprYLps7Tps7bps7PpurzpvLvpvYrlhITlhIDlg7vlg7Xlg7nlhILlhIjlhInlhIXlh5xcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYzQwXCIsXG5cdFx0XCLliofliojlionlio3liorli7DljrLlmK7lmLvlmLnlmLLlmL/lmLTlmKnlmZPlmY7lmZflmbTlmLblmK/lmLDlooDlop/lop7lorPlopzloq7loqnloqblpa3lrInlq7vlrIvlq7XlrIzlrIjlr67lr6zlr6nlr6vlsaTlsaXltp3ltpTluaLluZ/luaHlu6Llu5rlu5/lu53lu6Plu6DlvYjlvbHlvrflvrXmhbbmhafmha7mhZ3mhZXmhoJcIlxuXHRdLFxuXHRbXG5cdFx0XCJiY2ExXCIsXG5cdFx0XCLmhbzmhbDmhavmhb7mhqfmhpDmhqvmho7mhqzmhprmhqTmhpTmhq7miK7mkanmka/mkbnmkp7mkrLmkojmkpDmkrDmkqXmkpPmkpXmkqnmkpLmkq7mkq3mkqvmkprmkqzmkpnmkqLmkrPmlbXmlbfmlbjmmq7mmqvmmrTmmrHmqKPmqJ/mp6jmqIHmqJ7mqJnmp73mqKHmqJPmqIrmp7PmqILmqIXmp63mqJHmrZDmrY7mrqTmr4Xmr4bmvL/mvbzmvoTmvZHmvabmvZTmvobmva3mvZvmvbjmva7mvo7mvbrmvbDmvaTmvpfmvZjmu5Xmva/mvaDmvZ/nhp/nhqznhrHnhqjniZbnipvnjY7njZfnkannkovnkoNcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZDQwXCIsXG5cdFx0XCLnkb7nkoDnlb/nmKDnmKnnmJ/nmKTnmKbnmKHnmKLnmprnmrrnm6Tnno7nnofnnoznnpHnnovno4vno4Xnorrno4rnor7no5Xnorzno5DnqL/nqLznqYDnqL3nqLfnqLvnqq/nqq7nrq3nrrHnr4TnrrTnr4bnr4fnr4HnrqDnr4zns4rnt6Dnt7Tnt6/nt7vnt5jnt6znt53nt6jnt6Pnt5rnt57nt6nntp7nt5nnt7Lnt7nnvbXnvbfnvq9cIlxuXHRdLFxuXHRbXG5cdFx0XCJiZGExXCIsXG5cdFx0XCLnv6nogKbohpvohpzohp3ohqDohprohpjolJfolL3olJrok67olKzolK3olJPolJHolKPolKHolJTok6zolKXok7/olIbonoLonbTonbbonaDonabonbjonajonZnonZfonYzonZPooZvooZ3opJDopIfopJLopJPopJXopIroqrzoq5Loq4foq4ToqpXoq4voq7joqrLoq4noq4Loqr/oqrDoq5boq43oqrboqrnoq5vosYzosY7osazos6Dos57os6bos6Tos6zos63os6Los6Pos5zos6ros6Hota3otp/otqPouKvouJDouJ3ouKLouI/ouKnouJ/ouKHouJ7ourrovJ3ovJvovJ/ovKnovKbovKrovJzovJ5cIlxuXHRdLFxuXHRbXG5cdFx0XCJiZTQwXCIsXG5cdFx0XCLovKXpganpga7pgajpga3pgbfphLDphK3phKfphLHphofphonphovphoPpi4Xpirvpirfpi6rpiqzpi6Tpi4HpirPpirzpi5Lpi4fpi7DpirLplq3plrHpnITpnIbpnIfpnInpnaDpno3pnovpno/poKHpoKvpoJzporPppIrppJPppJLppJjpp53pp5Dpp5/pp5vpp5Hpp5Xpp5Lpp5npqrfpq67pq6/prKfprYXprYTprbfpra/ptIbptIlcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZWExXCIsXG5cdFx0XCLptIPpuqnpur7pu47loqjpvZLlhJLlhJjlhJTlhJDlhJXlhoDlhqrlh53lipHlipPli7PlmZnlmavlmbnlmanlmaTlmbjlmarlmajlmaXlmbHlma/lmazlmaLlmbblo4Hlor7lo4flo4Xlpa7lrJ3lrLTlrbjlr7DlsI7lvYrmhrLmhpHmhqnmhormh43mhrbmhr7mh4rmh4jmiLDmk4Xmk4Hmk4vmkrvmkrzmk5rmk4Tmk4fmk4Lmk43mkr/mk5Lmk5Tmkr7mlbTmm4bmm4nmmrnmm4Tmm4fmmrjmqL3mqLjmqLrmqZnmqavmqZjmqLnmqYTmqaLmqaHmqYvmqYfmqLXmqZ/mqYjmrZnmrbfmsIXmv4LmvrHmvqFcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZjQwXCIsXG5cdFx0XCLmv4PmvqTmv4HmvqfmvrPmv4DmvrnmvrbmvqbmvqDmvrTnhr7nh4nnh5Dnh5Lnh4jnh5Xnhrnnh47nh5nnh5znh4Pnh4TnjajnkpznkqPnkpjnkp/nkp7nk6LnlIznlI3nmLTnmLjnmLrnm6fnm6XnnqDnnp7nnp/nnqXno6jno5rno6zno6fnpqbnqY3nqY7nqYbnqYznqYvnqrrnr5nnsJHnr4nnr6Tnr5vnr6Hnr6nnr6bns5Xns5bnuIpcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZmExXCIsXG5cdFx0XCLnuJHnuIjnuJvnuKPnuJ7nuJ3nuInnuJDnvbnnvrLnv7Dnv7Hnv67ogKjohrPohqnohqjoh7voiIjoiZjoiZnolYrolZnolYjolajolanolYPolYnola3olarolZ7onoPonp/onp7onqLono3ooaHopKropLLopKXopKvopKHopqropqboq6boq7roq6voq7HorIDoq5zoq6foq67oq77orIHorILoq7foq63oq7Poq7boq7zosavosa3ospPos7TouYTouLHouLTouYLouLnouLXovLvovK/ovLjovLPovqjovqbpgbXpgbTpgbjpgbLpgbzpgbrphLTphpLpjKDpjLbpi7jpjLPpjK/pjKLpi7zpjKvpjITpjJpcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMDQwXCIsXG5cdFx0XCLpjJDpjKbpjKHpjJXpjK7pjJnplrvpmqfpmqjpmqrpm5XpnI7pnJHpnJbpnI3pnJPpnI/pnZvpnZzpnabpnpjpoLDpoLjpoLvpoLfpoK3poLnpoKTppJDppKjppJ7ppJvppKHppJrpp63pp6Lpp7Hpqrjpqrzpq7vpq63prKjprpHptJXptKPptKbptKjptJLptJvpu5jpu5Tpvo3pvpzlhKrlhJ/lhKHlhLLli7Xlmo7lmoDlmpDlmoXlmodcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMGExXCIsXG5cdFx0XCLlmo/lo5Xlo5Plo5Hlo47lrLDlrKrlrKTlrbrlsLflsajltrzltrrltr3ltrjluavlvYzlvr3mh4nmh4Lmh4fmh6bmh4vmiLLmiLTmk47mk4rmk5jmk6Dmk7Dmk6bmk6zmk7Hmk6Lmk63mloLmloPmm5nmm5bmqoDmqpTmqoTmqqLmqpzmq5vmqqPmqb7mqpfmqpDmqqDmrZzmrq7mr5rmsIjmv5jmv7Hmv5/mv6Dmv5vmv6Tmv6vmv6/mvoDmv6zmv6Hmv6nmv5Xmv67mv7Dnh6fnh5/nh67nh6bnh6Xnh63nh6znh7Tnh6DniLXniYbnjbDnjbLnkqnnkrDnkqbnkqjnmYbnmYLnmYznm6rnnrPnnqrnnrDnnqxcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMTQwXCIsXG5cdFx0XCLnnqfnnq3nn6/no7fno7rno7Tno6/npIHnpqfnpqrnqZfnqr/nsIfnsI3nr77nr7fnsIznr6Dns6Dns5zns57ns6Lns5/ns5nns53nuK7nuL7nuYbnuLfnuLLnuYPnuKvnuL3nuLHnuYXnuYHnuLTnuLnnuYjnuLXnuL/nuK/nvYTnv7Pnv7zogbHogbLogbDoga/ogbPoh4boh4Pohrroh4Loh4Dohr/ohr3oh4nohr7oh6joiInoibHolqpcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMWExXCIsXG5cdFx0XCLoloTolb7olpzolpHolpTolq/olpvolofolqjoloromafon4Don5HonrPon5Lon4bonqvonrvonrron4jon4vopLvopLbopYTopLjopL3opqzorI7orJforJnorJvorIrorKDorJ3orITorJDosYHosL/osbPos7ros73os7zos7jos7votqjouYnouYvouYjouYrovYTovL7ovYLovYXovL/pgb/pgb3pgoTpgoHpgoLpgoDphLnphqPphp7phpzpjY3pjoLpjKjpjbXpjYrpjaXpjYvpjJjpjb7pjazpjZvpjbDpjZrpjZTpl4rpl4vpl4zpl4jpl4bpmrHpmrjpm5bpnJzpnJ7pnqDpn5PpoYbporbppLXpqIFcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMjQwXCIsXG5cdFx0XCLpp7/prq7prqvprqrprq3ptLvptL/puovpu4/pu57pu5zpu53pu5vpvL7pvYvlj6LlmpXlmq7lo5nlo5jlrLjlvZ3mh6PmiLPmk7Tmk7Lmk77mlIbmk7rmk7vmk7fmlrfmm5zmnKbmqrPmqqzmq4Pmqrvmqrjmq4Lmqq7mqq/mrZ/mrbjmrq/ngInngIvmv77ngIbmv7rngJHngI/nh7vnh7znh77nh7jnjbfnjbXnkqfnkr/nlJXnmZbnmZhcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMmExXCIsXG5cdFx0XCLnmZLnnr3nnr/nnrvnnrznpI7npq7nqaHnqaLnqaDnq4Tnq4XnsKvnsKfnsKrnsJ7nsKPnsKHns6fnuZTnuZXnuZ7nuZrnuaHnuZLnuZnnvYjnv7nnv7vogbfogbboh43oh4/oiIrol4/olqnol43ol5Dol4nolrDolrrolrnolqbon6/on6zon7Lon6DopoboprLop7TorKjorLnorKzorKvosZDotIXouZnouaPouabouaTouZ/ouZXou4DovYnovY3pgofpgoPpgojphqvphqzph5DpjpTpjorpjpbpjqLpjrPpjq7pjqzpjrDpjpjpjprpjpfpl5Tpl5bpl5Dpl5Xpm6Lpm5zpm5npm5vpm57pnKTpnqPpnqZcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMzQwXCIsXG5cdFx0XCLpnq3pn7npoY3poY/poYzpoY7poZPporrppL7ppL/ppL3ppK7ppqXpqI7pq4HprIPprIbprY/prY7prY3pr4rpr4npr73pr4jpr4DptZHptZ3ptaDpu6DpvJXpvKzlhLPlmqXlo57lo5/lo6Llr7XpvpDlu6zmh7Lmh7fmh7bmh7XmlIDmlI/mm6Dmm53mq6Xmq53mq5rmq5PngJvngJ/ngKjngJrngJ3ngJXngJjniIbniI3niZjniqLnjbhcIlxuXHRdLFxuXHRbXG5cdFx0XCJjM2ExXCIsXG5cdFx0XCLnjbrnkr3nk4rnk6PnlofnlobnmZ/nmaHnn4fnpJnnprHnqavnqannsL7nsL/nsLjnsL3nsLfnsYDnuavnua3nubnnuannuarnvoXnubPnvrbnvrnnvrjoh5jol6nol53ol6rol5Xol6Tol6Xol7fon7vooIXooI3on7non77opaDopZ/opZbopZ7orYHorZzorZjorYnorZrorY7orY/orYborZnotIjotIroubzoubLouofoubbouazoubroubTovZTovY7ovq3pgorpgovphrHphq7pj6Hpj5Hpj5/pj4Ppj4jpj5zpj53pj5bpj6Lpj43pj5jpj6Tpj5fpj6jpl5zpmrTpm6PpnKrpnKfpnaHpn5zpn7vpoZ5cIlxuXHRdLFxuXHRbXG5cdFx0XCJjNDQwXCIsXG5cdFx0XCLpoZjpoZvporzppYXppYnpqJbpqJnprI3pr6jpr6fpr5bpr5vptonptaHptbLptarptazpupLpupfpupPpurTli7jlmqjlmrflmrblmrTlmrzlo6TlrYDlrYPlrb3lr7blt4nmh7jmh7rmlJjmlJTmlJnmm6bmnKfmq6zngL7ngLDngLLniJDnjbvnk4/nmaLnmaXnpKbnpKrnpKznpKvnq4fnq7bnsYznsYPnsY3ns6/ns7Dovq7nub3nubxcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNGExXCIsXG5cdFx0XCLnuoLnvYzogIDoh5roiabol7vol7nomJHol7romIbomIvomIfomIrooJTooJXopaToprrop7jorbDorazorabora/orZ/oravotI/otI3ouonouoHouoXouoLphrTph4vpkJjpkIPpj73pl6HpnLDpo4TppZLppZHppqjpqKvpqLDpqLfpqLXpsJPpsI3pubnpurXpu6jpvK/pvZ/pvaPpvaHlhLflhLjlm4Hlm4Dlm4LlpJTlsazlt43mh7zmh77mlJ3mlJzmlpXmm6nmq7vmrITmq7rmrrLngYzniJvniqfnk5bnk5Tnmannn5PnsZDnuo/nuoznvrzomJfomK3omJrooKPooKLooKHooJ/oparopazopr3orbRcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNTQwXCIsXG5cdFx0XCLorbforb3otJPouorouo3ouovovZ/ovq/phrrpkK7pkLPpkLXpkLrpkLjpkLLpkKvpl6LpnLjpnLnpnLLpn7/poafpoaXppZfpqYXpqYPpqYDpqL7pq4/prZTprZHpsK3psKXptq/ptrTpt4Lptrjpup3pu6/pvJnpvZzpvabpvaflhLzlhLvlm4jlm4rlm4nlrb/lt5Tlt5LlvY7mh7/mlKTmrIrmraHngZHngZjnjoDnk6Tnlornma7nmaxcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNWExXCIsXG5cdFx0XCLnprPnsaDnsZ/ogb7ogb3oh5/opbLopa/op7zoroDotJbotJfoupHoupPovaHphYjpkYTpkZHpkZLpnL3pnL7pn4Ppn4HpoavppZXpqZXpqY3pq5LprJrpsYnpsLHpsL7psLvpt5Ppt5fpvLTpvazpvarpvpTlm4zlt5bmiIDmlKPmlKvmlKrmm6zmrJDnk5rnq4rnsaTnsaPnsaXnupPnupbnupToh6LomLjomL/ooLHororpgpDpgo/pkaPpkaDpkaTpnajpoa/ppZzpqZrpqZvpqZfpq5Ppq5Tpq5HpsZTpsZfpsZbpt6Xpup/pu7Tlm5Hlo6nmlKzngZ7nmbHnmbLnn5fnvZDnvojooLbooLnooaLorpPorpJcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNjQwXCIsXG5cdFx0XCLorpboibfotJvph4DpkarpnYLpnYjpnYTpn4bpobDpqZ/prKLprZjpsZ/pt7npt7rpubzpub3pvIfpvbfpvbLlu7PmrJbngaPnsaznsa7ooLvop4DouqHph4HpkbLpkbDpobHppZ7pq5bprKPpu4zngaTnn5rorprpkbfpn4npqaLpqaXnupzorpzouqrph4Xpkb3pkb7pkbzpsbfpsbjpu7fosZTpkb/puJrniKjpqarprLHpuJvpuJ7nsbJcIlxuXHRdLFxuXHRbXG5cdFx0XCJjOTQwXCIsXG5cdFx0XCLkuYLkuZzlh7XljJrljoLkuIfkuIzkuYfkuo3lm5fvqIzlsa7lvbPkuI/lhofkuI7kuK7kupPku4Lku4nku4jlhpjli7zljazljrnlnKDlpIPlpKzlsJDlt7/ml6HmrrPmr4zmsJTniL/kuLHkuLzku6jku5zku6nku6Hku53ku5rliIzljJzljYzlnKLlnKPlpJflpK/lroHlroTlsJLlsLvlsbTlsbPluITluoDluoLlv4nmiInmiZDmsJVcIlxuXHRdLFxuXHRbXG5cdFx0XCJjOWExXCIsXG5cdFx0XCLmsLbmsYPmsL/msLvniq7nirDnjornprjogorpmJ7kvI7kvJjkvKzku7XkvJTku7HkvIDku7fkvIjkvJ3kvILkvIXkvKLkvJPkvITku7TkvJLlhrHliJPliInliJDliqbljKLljJ/ljY3ljorlkIflm6Hlm5/lnK7lnKrlnLTlpLzlpoDlpbzlpoXlpbvlpb7lpbflpb/lrZblsJXlsKXlsbzlsbrlsbvlsb7lt5/lubXluoTlvILlvJrlvbTlv5Xlv5Tlv4/miZzmiZ7miaTmiaHmiabmiaLmiZnmiaDmiZrmiaXml6/ml67mnL7mnLnmnLjmnLvmnLrmnL/mnLzmnLPmsJjmsYbmsZLmsZzmsY/msYrmsZTmsYtcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYTQwXCIsXG5cdFx0XCLmsYzngbHniZ7nirTnirXnjo7nlKrnmb/nqbXnvZHoibjoibzoioDoib3oib/omY3opb7pgpnpgpfpgpjpgpvpgpTpmKLpmKTpmKDpmKPkvZbkvLvkvaLkvYnkvZPkvaTkvL7kvafkvZLkvZ/kvYHkvZjkvK3kvLPkvL/kvaHlho/lhrnliJzliJ7liKHliq3liq7ljInljaPljbLljo7ljo/lkLDlkLflkKrlkZTlkYXlkJnlkJzlkKXlkJhcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYWExXCIsXG5cdFx0XCLlkL3lkY/lkYHlkKjlkKTlkYflm67lm6flm6XlnYHlnYXlnYzlnYnlnYvlnZLlpIblpYDlpqblppjlpqDlppflpo7lpqLlppDlpo/lpqflpqHlro7lrpLlsKjlsKrlso3lso/lsojlsovlsonlspLlsorlsoblspPlspXlt6DluIrluI7luovluonluozluojluo3lvIXlvJ3lvbjlvbblv5Llv5Hlv5Dlv63lv6jlv67lv7Plv6Hlv6Tlv6Plv7rlv6/lv7flv7vmgIDlv7TmiLrmioPmiozmio7mio/mipTmiofmibHmibvmibrmibDmioHmiojmibfmib3mibLmibTmlLfml7Dml7Tml7Pml7Lml7XmnYXmnYdcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYjQwXCIsXG5cdFx0XCLmnZnmnZXmnYzmnYjmnZ3mnY3mnZrmnYvmr5DmsJnmsJrmsbjmsafmsavmsoTmsovmso/msbHmsa/msanmsprmsa3msofmspXmspzmsabmsbPmsaXmsbvmso7ngbTngbrniaPnir/nir3ni4Pni4bni4Hnirrni4XnjpXnjpfnjpPnjpTnjpLnlLrnlLnnlpTnlpXnmoHnpL3ogLTogpXogpnogpDogpLogpzoipDoio/oioXoio7oipHoipNcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYmExXCIsXG5cdFx0XCLoioroioPoioTosbjov4novr/pgp/pgqHpgqXpgp7pgqfpgqDpmLDpmKjpmK/pmK3kuLPkvpjkvbzkvoXkvb3kvoDkvofkvbbkvbTkvonkvoTkvbfkvYzkvpfkvarkvprkvbnkvoHkvbjkvpDkvpzkvpTkvp7kvpLkvoLkvpXkvavkva7lhp7lhrzlhr7liLXliLLliLPliYbliLHlirzljIrljIvljLzljpLljpTlkoflkb/lkoHlkpHlkoLlkojlkavlkbrlkb7lkaXlkazlkbTlkablko3lka/lkaHlkaDlkpjlkaPlkaflkaTlm7flm7nlna/lnbLlna3lnavlnbHlnbDlnbblnoDlnbXlnbvlnbPlnbTlnaJcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYzQwXCIsXG5cdFx0XCLlnajlnb3lpIzlpYXlprXlprrlp4/lp47lprLlp4zlp4Hlprblprzlp4Plp5blprHlpr3lp4Dlp4jlprTlp4flraLlraXlrpPlrpXlsYTlsYflsq7lsqTlsqDlsrXlsq/lsqjlsqzlsp/lsqPlsq3lsqLlsqrlsqflsp3lsqXlsrblsrDlsqbluJfluJTluJnlvKjlvKLlvKPlvKTlvZTlvoLlvb7lvb3lv57lv6XmgK3mgKbmgJnmgLLmgItcIlxuXHRdLFxuXHRbXG5cdFx0XCJjY2ExXCIsXG5cdFx0XCLmgLTmgIrmgJfmgLPmgJrmgJ7mgKzmgKLmgI3mgJDmgK7mgJPmgJHmgIzmgInmgJzmiJTmiL3miq3mirTmi5Hmir7miqrmirbmi4rmiq7mirPmiq/mirvmiqnmirDmirjmlL3mlqjmlrvmmInml7zmmITmmJLmmIjml7vmmIPmmIvmmI3mmIXml73mmJHmmJDmm7bmnIrmnoXmnazmno7mnpLmnbbmnbvmnpjmnobmnoTmnbTmno3mnozmnbrmnp/mnpHmnpnmnoPmnb3mnoHmnbjmnbnmnpTmrKXmroDmrb7mr57msJ3mspPms6zms6vms67ms5nmsrbms5Tmsq3ms6fmsrfms5Dms4Lmsrrms4Pms4bms63ms7JcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZDQwXCIsXG5cdFx0XCLms5Lms53msrTmsormsp3msoDms57ms4DmtLDms43ms4fmsrDms7nms4/ms6nms5HngpTngpjngoXngpPngobngoTngpHngpbngoLngprngoPniarni5bni4vni5jni4nni5zni5Lni5Tni5rni4zni5HnjqTnjqHnjq3njqbnjqLnjqDnjqznjp3nk53nk6jnlL/nlYDnlL7nloznlpjnmq/nm7Pnm7Hnm7Dnm7Xnn7jnn7znn7nnn7vnn7pcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZGExXCIsXG5cdFx0XCLnn7fnpYLnpL/np4Xnqbjnqbvnq7vnsbXns73ogLXogo/ogq7ogqPogrjogrXogq3oiKDoiqDoi4DoiqvoiproipjoipvoirXoiqfoiq7oirzoip7oirroirToiqjoiqHoiqnoi4LoiqToi4PoirboiqLombDoma/oma3oma7osZbov5Lov4vov5Pov43ov5bov5Xov5fpgrLpgrTpgq/pgrPpgrDpmLnpmL3pmLzpmLrpmYPkv43kv4Xkv5PkvrLkv4nkv4vkv4Hkv5Tkv5zkv5nkvrvkvrPkv5vkv4fkv5bkvrrkv4Dkvrnkv6zliYTliYnli4Dli4LljL3ljbzljpfljpbljpnljpjlkrrlkqHlkq3lkqXlk49cIlxuXHRdLFxuXHRbXG5cdFx0XCJjZTQwXCIsXG5cdFx0XCLlk4PojI3lkrflkq7lk5blkrblk4Xlk4blkqDlkbDlkrzlkqLlkr7lkbLlk57lkrDlnrXlnp7lnp/lnqTlnozlnpflnp3lnpvlnpTlnpjlno/lnpnlnqXlnprlnpXlo7TlpI3lpZPlp6Hlp57lp67lqIDlp7Hlp53lp7rlp73lp7zlp7blp6Tlp7Llp7flp5vlp6nlp7Plp7Xlp6Dlp77lp7Tlp63lrqjlsYzls5Dls5jls4zls5fls4vls5tcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZWExXCIsXG5cdFx0XCLls57ls5rls4nls4fls4rls5bls5Pls5Tls4/ls4jls4bls47ls5/ls7jlt7nluKHluKLluKPluKDluKTlurDluqTluqLlupvluqPluqXlvIflvK7lvZblvobmgLfmgLnmgZTmgbLmgZ7mgYXmgZPmgYfmgYnmgZvmgYzmgYDmgYLmgZ/mgKTmgYTmgZjmgabmga7miYLmiYPmi4/mjI3mjIvmi7XmjI7mjIPmi6vmi7nmjI/mjIzmi7jmi7bmjIDmjJPmjJTmi7rmjJXmi7vmi7DmlYHmlYPmlqrmlr/mmLbmmKHmmLLmmLXmmJzmmKbmmKLmmLPmmKvmmLrmmJ3mmLTmmLnmmK7mnI/mnJDmn4Hmn7Lmn4jmnrpcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZjQwXCIsXG5cdFx0XCLmn5zmnrvmn7jmn5jmn4Dmnrfmn4Xmn6vmn6Tmn5/mnrXmn43mnrPmn7fmn7bmn67mn6Pmn4Lmnrnmn47mn6fmn7DmnrLmn7zmn4bmn63mn4zmnq7mn6bmn5vmn7rmn4nmn4rmn4Pmn6rmn4vmrKjmroLmroTmrrbmr5bmr5jmr6DmsKDmsKHmtKjmtLTmtK3mtJ/mtLzmtL/mtJLmtIrms5rmtLPmtITmtJnmtLrmtJrmtJHmtIDmtJ3mtYJcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZmExXCIsXG5cdFx0XCLmtIHmtJjmtLfmtIPmtI/mtYDmtIfmtKDmtKzmtIjmtKLmtInmtJDngrfngp/ngr7ngrHngrDngqHngrTngrXngqnniYHniYnniYrniaznibDnibPnia7ni4rni6Tni6jni6vni5/ni6rni6bni6PnjoXnj4znj4Lnj4jnj4XnjrnnjrbnjrXnjrTnj6vnjr/nj4fnjr7nj4Pnj4bnjrjnj4vnk6znk67nlK7nlYfnlYjnlqfnlqrnmbnnm4TnnIjnnIPnnITnnIXnnIrnm7fnm7vnm7rnn6fnn6jnoIbnoJHnoJLnoIXnoJDnoI/noI7noInnoIPnoJPnpYrnpYznpYvnpYXnpYTnp5Xnp43np4/np5bnp47nqoBcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMDQwXCIsXG5cdFx0XCLnqb7nq5HnrIDnrIHnsbrnsbjnsbnnsb/nsoDnsoHntIPntIjntIHnvZjnvpHnvo3nvr7ogIfogI7ogI/ogJTogLfog5jog4fog6Dog5Hog4jog4Log5Dog4Xog6Pog5nog5zog4rog5Xog4nog4/og5fog6bog43oh7/oiKHoipToi5noi77oi7nojIfoi6jojIDoi5XojLroi6voi5boi7Toi6zoi6Hoi7Loi7XojIzoi7voi7boi7Doi6pcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMGExXCIsXG5cdFx0XCLoi6Toi6Doi7roi7Poi63ombfombTombzombPooYHooY7ooafooarooanop5PoqIToqIfotbLov6Pov6Hov67ov6Dpg7Hpgr3pgr/pg5Xpg4Xpgr7pg4fpg4vpg4jph5Tph5PpmZTpmY/pmZHpmZPpmYrpmY7lgJ7lgIXlgIflgJPlgKLlgLDlgJvkv7Xkv7TlgLPlgLflgKzkv7bkv7flgJflgJzlgKDlgKflgLXlgK/lgLHlgI7lhZrlhpTlhpPlh4rlh4Tlh4Xlh4jlh47liaHliZrliZLliZ7liZ/liZXliaLli43ljI7ljp7llKblk6LllJfllJLlk6flk7Plk6TllJrlk7/llITllIjlk6vllJHllIXlk7FcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMTQwXCIsXG5cdFx0XCLllIrlk7vlk7flk7jlk6DllI7llIPllIvlnIHlnILln4zloLLln5Xln5Llnrrln4blnr3lnrzlnrjlnrblnr/ln4fln5Dlnrnln4HlpI7lpYrlqJnlqJblqK3lqK7lqJXlqI/lqJflqIrlqJ7lqLPlrazlrqflrq3lrqzlsIPlsZblsZTls6zls7/ls67ls7Hls7fltIDls7nluKnluKjluqjluq7luqrluqzlvLPlvLDlvafmgZ3mgZrmgadcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMWExXCIsXG5cdFx0XCLmgYHmgqLmgojmgoDmgpLmgoHmgp3mgoPmgpXmgpvmgpfmgofmgpzmgo7miJnmiYbmi7LmjJDmjZbmjKzmjYTmjYXmjLbmjYPmj6TmjLnmjYvmjYrmjLzmjKnmjYHmjLTmjZjmjZTmjZnmjK3mjYfmjLPmjZrmjZHmjLjmjZfmjYDmjYjmlYrmlYbml4bml4Pml4Tml4LmmYrmmZ/mmYfmmZHmnJLmnJPmoJ/moJrmoYnmoLLmoLPmoLvmoYvmoY/moJbmoLHmoJzmoLXmoKvmoK3moK/moY7moYTmoLTmoJ3moJLmoJTmoKbmoKjmoK7moY3moLrmoKXmoKDmrKzmrK/mrK3mrLHmrLTmra3ogoLmrojmr6bmr6RcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMjQwXCIsXG5cdFx0XCLmr6jmr6Pmr6Lmr6fmsKXmtbrmtaPmtaTmtbbmtI3mtaHmtpLmtZjmtaLmta3mta/mtpHmto3mt6/mtb/mtobmtZ7mtafmtaDmtpfmtbDmtbzmtZ/mtoLmtpjmtK/mtajmtovmtb7mtoDmtoTmtJbmtoPmtbvmtb3mtbXmtpDng5zng5Png5Hng53ng4vnvLnng6Lng5fng5Lng57ng6Dng5Tng43ng4Xng4bng4fng5rng47ng6HniYLnibhcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMmExXCIsXG5cdFx0XCLnibfnibbnjIDni7rni7Tni77ni7bni7Pni7vnjIHnj5Pnj5nnj6Xnj5bnjrznj6fnj6Pnj6nnj5znj5Lnj5vnj5Tnj53nj5rnj5fnj5jnj6jnk57nk5/nk7Tnk7XnlKHnlZvnlZ/nlrDnl4Hnlrvnl4Tnl4Dnlr/nlrbnlrrnmornm4nnnJ3nnJvnnJDnnJPnnJLnnKPnnJHnnJXnnJnnnJrnnKLnnKfnoKPnoKznoKLnoLXnoK/noKjnoK7noKvnoKHnoKnnoLPnoKrnoLHnpZTnpZvnpY/npZznpZPnpZLnpZHnp6vnp6znp6Dnp67np63np6rnp5znp57np53nqobnqonnqoXnqovnqoznqornqofnq5jnrJBcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMzQwXCIsXG5cdFx0XCLnrITnrJPnrIXnrI/nrIjnrIrnrI7nrInnrJLnsoTnspHnsornsoznsojnso3nsoXntJ7ntJ3ntJHntI7ntJjntJbntJPntJ/ntJLntI/ntIznvZznvaHnvZ7nvaDnvZ3nvZvnvpbnvpLnv4Pnv4Lnv4DogJbogL7ogLnog7rog7Log7nog7XohIHog7vohIDoiIHoiK/oiKXojLPojK3ojYTojJnojZHojKXojZbojL/ojYHojKbojJzojKJcIlxuXHRdLFxuXHRbXG5cdFx0XCJkM2ExXCIsXG5cdFx0XCLojYLojY7ojJvojKrojIjojLzojY3ojJbojKTojKDojLfojK/ojKnojYfojYXojYzojZPojJ7ojKzojYvojKfojYjomZPomZLomqLomqjompbomo3ompHomp7omofompfomobomovompromoXomqXompnomqHomqfompXompjomo7omp3ompDompTooYPooYTooa3oobXoobboobLoooDoobHoob/ooa/oooPoob7oobToobzoqJLosYfosZfosbvosqTosqPotbbotbjotrXotrfotrbou5Hou5Pov77ov7XpgILov7/ov7vpgITov7zov7bpg5bpg6Dpg5npg5rpg6Ppg5/pg6Xpg5jpg5vpg5fpg5zpg6TphZBcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNDQwXCIsXG5cdFx0XCLphY7phY/ph5Xph6Lph5rpmZzpmZ/pmrzpo6Ppq5/prK/kub/lgbDlgarlgaHlgZ7lgaDlgZPlgYvlgZ3lgbLlgYjlgY3lgYHlgZvlgYrlgaLlgJXlgYXlgZ/lganlgavlgaPlgaTlgYblgYDlga7lgbPlgZflgZHlh5Dliavlia3liazlia7li5bli5PljK3ljpzllbXllbbllLzllY3llZDllLTllKrllZHllaLllLbllLXllLDllZLllYVcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNGExXCIsXG5cdFx0XCLllIzllLLllaXllY7llLnllYjllK3llLvllYDllYvlnIrlnIfln7vloJTln6Lln7bln5zln7TloIDln63ln73loIjln7jloIvln7Pln4/loIfln67ln6Pln7Lln6Xln6zln6HloI7ln7zloJDln6floIHloIzln7Hln6nln7DloI3loITlpZzlqaDlqZjlqZXlqaflqZ7lqLjlqLXlqa3lqZDlqZ/lqaXlqazlqZPlqaTlqZflqYPlqZ3lqZLlqYTlqZvlqYjlqo7lqL7lqY3lqLnlqYzlqbDlqanlqYflqZHlqZblqYLlqZzlrbLlra7lr4Hlr4DlsZnltJ7ltIvltJ3ltJrltKDltIzltKjltI3ltKbltKXltI9cIlxuXHRdLFxuXHRbXG5cdFx0XCJkNTQwXCIsXG5cdFx0XCLltLDltJLltKPltJ/ltK7luL7luLTlurHlurTlurnlurLlurPlvLblvLjlvpvlvpblvp/mgormgpDmgobmgr7mgrDmgrrmg5Pmg5Tmg4/mg6Tmg5nmg53mg4jmgrHmg5vmgrfmg4rmgr/mg4Pmg43mg4DmjLLmjaXmjormjoLmjb3mjr3mjp7mjq3mjp3mjpfmjqvmjo7mja/mjofmjpDmja7mjq/mjbXmjpzmja3mjq7mjbzmjqTmjLvmjp9cIlxuXHRdLFxuXHRbXG5cdFx0XCJkNWExXCIsXG5cdFx0XCLmjbjmjoXmjoHmjpHmjo3mjbDmlZPml43mmaXmmaHmmZvmmZnmmZzmmaLmnJjmobnmoofmopDmopzmoa3moa7moq7moqvmpZbmoa/moqPmoqzmoqnmobXmobTmorLmoo/mobfmopLmobzmoavmobLmoqrmooDmobHmob7mopvmopbmoovmoqDmoonmoqTmobjmobvmopHmoozmoormob3mrLbmrLPmrLfmrLjmrpHmro/mro3mro7mrozmsKrmt4DmtqvmtrTmtrPmubTmtqzmt6nmt6Lmtrfmt7bmt5TmuIDmt4jmt6Dmt5/mt5bmtr7mt6Xmt5zmt53mt5vmt7Tmt4rmtr3mt63mt7Dmtrrmt5Xmt4Lmt4/mt4lcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNjQwXCIsXG5cdFx0XCLmt5Dmt7Lmt5Pmt73mt5fmt43mt6Pmtrvng7rnhI3ng7fnhJfng7TnhIzng7DnhITng7PnhJDng7zng7/nhIbnhJPnhIDng7jng7bnhIvnhILnhI7nib7nibvnibznib/njJ3njJfnjIfnjJHnjJjnjIrnjIjni7/njI/njJ7njojnj7bnj7jnj7XnkITnkIHnj73nkIfnkIDnj7rnj7znj7/nkIznkIvnj7TnkIjnlaTnlaPnl47nl5Lnl49cIlxuXHRdLFxuXHRbXG5cdFx0XCJkNmExXCIsXG5cdFx0XCLnl4vnl4znl5Hnl5Dnmo/nmonnm5PnnLnnnK/nnK3nnLHnnLLnnLTnnLPnnL3nnKXnnLvnnLXnoYjnoZLnoYnnoY3noYrnoYznoKbnoYXnoZDnpaTnpafnpannparnpaPnpavnpaHnprvnp7rnp7jnp7bnp7fnqo/nqpTnqpDnrLXnrYfnrLTnrKXnrLDnrKLnrKTnrLPnrJjnrKrnrJ3nrLHnrKvnrK3nrK/nrLLnrLjnrJrnrKPnspTnspjnspbnsqPntLXntL3ntLjntLbntLrntYXntKzntKnntYHntYfntL7ntL/ntYrntLvntKjnvaPnvpXnvpznvp3nvpvnv4rnv4vnv43nv5Dnv5Hnv4fnv4/nv4nogJ9cIlxuXHRdLFxuXHRbXG5cdFx0XCJkNzQwXCIsXG5cdFx0XCLogJ7ogJvogYfogYPogYjohJjohKXohJnohJvohK3ohJ/ohKzohJ7ohKHohJXohKfohJ3ohKLoiJHoiLjoiLPoiLroiLToiLLoibTojpDojqPojqjojo3ojbrojbPojqTojbTojo/ojoHojpXojpnojbXojpTojqnojb3ojoPojozojp3ojpvojqrojovojb7ojqXojq/ojojojpfojrDojb/ojqbojofojq7ojbbojpromZnomZbomr/omrdcIlxuXHRdLFxuXHRbXG5cdFx0XCJkN2ExXCIsXG5cdFx0XCLom4Lom4Hom4XomrromrDom4jomrnomrPomrjom4zomrTomrvomrzom4Pomr3omr7ooZLooonoopXooqjooqLooqrooproopHooqHoop/oopjooqfoopnoopvoopfooqTooqzooozoopPooo7opoLop5bop5nop5XoqLDoqKfoqKzoqJ7osLnosLvosZzosZ3osb3osqXotb3otbvotbnotrzot4Lotrnotr/ot4Hou5jou57ou53ou5zou5fou6Dou6HpgKTpgIvpgJHpgJzpgIzpgKHpg6/pg6rpg7Dpg7Tpg7Lpg7Ppg5Tpg6vpg6zpg6nphZbphZjphZrphZPphZXph6zph7Tph7Hph7Pph7jph6Tph7nph6pcIlxuXHRdLFxuXHRbXG5cdFx0XCJkODQwXCIsXG5cdFx0XCLph6vph7fph6jph67plbrplobplojpmbzpma3pmavpmbHpma/pmr/pnarpoITpo6XpppflgpvlgpXlgpTlgp7lgovlgqPlgoPlgozlgo7lgp3lgajlgpzlgpLlgoLlgoflhZ/lh5TljJLljJHljqTljqfllpHllqjllqXllq3llbflmYXllqLllpPllojllo/llrXlloHllqPllpLllqTllb3llozllqbllb/llpXllqHllo7lnIzloKnloLdcIlxuXHRdLFxuXHRbXG5cdFx0XCJkOGExXCIsXG5cdFx0XCLloJnloJ7loKfloKPloKjln7XloYjloKXloJzloJvloLPloL/loLbloK7loLnloLjloK3loKzloLvlpaHlqq/lqpTlqp/lqbrlqqLlqp7lqbjlqqblqbzlqqXlqqzlqpXlqq7lqLflqoTlqorlqpflqoPlqovlqqnlqbvlqb3lqozlqpzlqo/lqpPlqp3lr6rlr43lr4vlr5Tlr5Hlr4rlr47lsIzlsLDltLfltYPltavltYHltYvltL/ltLXltZHltY7ltZXltLPltLrltZLltL3ltLHltZnltYLltLnltYnltLjltLzltLLltLbltYDltYXluYTluYHlvZjlvqblvqXlvqvmg4nmgrnmg4zmg6Lmg47mg4TmhJRcIlxuXHRdLFxuXHRbXG5cdFx0XCJkOTQwXCIsXG5cdFx0XCLmg7LmhIrmhJbmhIXmg7XmhJPmg7jmg7zmg77mg4HmhIPmhJjmhJ3mhJDmg7/mhITmhIvmiYrmjpTmjrHmjrDmj47mj6Xmj6jmj6/mj4Pmkp3mj7Pmj4rmj6Dmj7bmj5Xmj7Lmj7XmkaHmj5/mjr7mj53mj5zmj4Tmj5jmj5Pmj4Lmj4fmj4zmj4vmj4jmj7Dmj5fmj5nmlLLmlafmlarmlaTmlZzmlajmlaXmlozmlp3mlp7mlq7ml5Dml5JcIlxuXHRdLFxuXHRbXG5cdFx0XCJkOWExXCIsXG5cdFx0XCLmmbzmmazmmbvmmoDmmbHmmbnmmarmmbLmnIHmpIzmo5PmpITmo5zmpKrmo6zmo6rmo7HmpI/mo5bmo7fmo6vmo6Tmo7bmpJPmpJDmo7Pmo6HmpIfmo4zmpIjmpbDmorTmpJHmo6/mo4bmpJTmo7jmo5Dmo73mo7zmo6jmpIvmpIrmpJfmo47mo4jmo53mo57mo6bmo7Tmo5HmpIbmo5Tmo6nmpJXmpKXmo4fmrLnmrLvmrL/mrLzmrpTmrpfmrpnmrpXmrr3mr7Dmr7Lmr7PmsLDmt7zmuYbmuYfmuJ/muYnmuojmuLzmuL3muYXmuaLmuKvmuL/muYHmuZ3mubPmuJzmuLPmuYvmuYDmuZHmuLvmuIPmuK7muZ5cIlxuXHRdLFxuXHRbXG5cdFx0XCJkYTQwXCIsXG5cdFx0XCLmuajmuZzmuaHmuLHmuKjmuaDmubHmuavmuLnmuKLmuLDmuZPmuaXmuKfmubjmuaTmubfmuZXmubnmuZLmuabmuLXmuLbmuZrnhKDnhJ7nhK/ng7vnhK7nhLHnhKPnhKXnhKLnhLLnhJ/nhKjnhLrnhJvniYvniZrniojnionniobnioXniovnjJLnjIvnjLDnjKLnjLHnjLPnjKfnjLLnjK3njKbnjKPnjLXnjIznkK7nkKznkLDnkKvnkJZcIlxuXHRdLFxuXHRbXG5cdFx0XCJkYWExXCIsXG5cdFx0XCLnkJrnkKHnkK3nkLHnkKTnkKPnkJ3nkKnnkKDnkLLnk7vnlK/nla/nlaznl6fnl5rnl6Hnl6bnl53nl5/nl6Tnl5fnmpXnmpLnm5rnnYbnnYfnnYTnnY3nnYXnnYrnnY7nnYvnnYznn57nn6znoaDnoaTnoaXnoZznoa3nobHnoarnoa7nobDnoannoajnoZ7noaLnpbTnpbPnpbLnpbDnqILnqIrnqIPnqIznqITnqpnnq6bnq6TnrYrnrLvnrYTnrYjnrYznrY7nrYDnrZjnrYXnsqLnsp7nsqjnsqHntZjnta/ntaPntZPntZbntafntarntY/nta3ntZzntavntZLntZTntanntZHntZ/ntY7nvL7nvL/nvaVcIlxuXHRdLFxuXHRbXG5cdFx0XCJkYjQwXCIsXG5cdFx0XCLnvabnvqLnvqDnvqHnv5fogZHogY/ogZDog77og5TohYPohYrohZLohY/ohYfohL3ohY3ohLroh6boh67oh7foh7joh7noiIToiLzoiL3oiL/oibXojLvoj4/oj7nokKPoj4Doj6jokJLoj6foj6Toj7zoj7bokJDoj4boj4joj6voj6Pojr/okIHoj53oj6Xoj5joj7/oj6Hoj4voj47oj5boj7Xoj4nokInokI/oj57okJHokIboj4Loj7NcIlxuXHRdLFxuXHRbXG5cdFx0XCJkYmExXCIsXG5cdFx0XCLoj5Xoj7roj4foj5Hoj6rokJPoj4Poj6zoj67oj4Toj7voj5foj6LokJvoj5voj77om5jom6Lom6bom5Pom6Pom5rom6rom53om6vom5zom6zom6nom5fom6jom5HooYjooZbooZXoorroo5foornoorjoo4Door7oorboorzoorfoor3oorLopIHoo4noppXoppjoppfop53op5rop5voqY7oqY3oqLnoqZnoqYDoqZfoqZjoqYToqYXoqZLoqYjoqZHoqYroqYzoqY/osZ/osoHosoDosrrosr7osrDosrnosrXotoTotoDotonot5jot5Pot43ot4fot5bot5zot4/ot5Xot5not4jot5fot4Xou6/ou7fou7pcIlxuXHRdLFxuXHRbXG5cdFx0XCJkYzQwXCIsXG5cdFx0XCLou7nou6bou67ou6Xou7Xou6fou6jou7bou6vou7Hou6zou7Tou6npgK3pgLTpgK/phIbphKzphITpg7/pg7zphIjpg7npg7vphIHphIDphIfphIXphIPphaHphaTphZ/phaLphaDpiIHpiIrpiKXpiIPpiJrpiKbpiI/piIzpiIDpiJLph7/ph73piIbpiITpiKfpiILpiJzpiKTpiJnpiJfpiIXpiJbplbvplo3plozplpDpmofpmb7pmohcIlxuXHRdLFxuXHRbXG5cdFx0XCJkY2ExXCIsXG5cdFx0XCLpmonpmoPpmoDpm4Lpm4jpm4Ppm7Hpm7DpnazpnbDpna7poIfpoqnpo6vps6bpu7nkuoPkuoTkurblgr3lgr/lg4blgq7lg4Tlg4rlgrTlg4jlg4LlgrDlg4HlgrrlgrHlg4vlg4nlgrblgrjlh5flibrlibjlibvlibzll4Pll5vll4zll5Dll4vll4rll53ll4Dll5Tll4Tll6nllr/ll5Lllo3ll4/ll5Xll6Lll5bll4jll7Lll43ll5nll4LlnJTloZPloajloaTloY/loY3loYnloa/loZXloY7loZ3loZnloaXloZvloL3loaPlobHlo7zlq4flq4Tlq4vlqrrlqrjlqrHlqrXlqrDlqr/lq4jlqrvlq4ZcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZDQwXCIsXG5cdFx0XCLlqrflq4Dlq4rlqrTlqrblq43lqrnlqpDlr5blr5jlr5nlsJ/lsLPltbHltaPltYrltaXltbLltazltZ7ltajltafltaLlt7DluY/luY7luYrluY3luYvlu4Xlu4zlu4blu4vlu4flvYDlvq/lvq3mg7fmhYnmhYrmhKvmhYXmhLbmhLLmhK7mhYbmhK/mhY/mhKnmhYDmiKDphajmiKPmiKXmiKTmj4Xmj7Hmj6vmkJDmkJLmkInmkKDmkKRcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZGExXCIsXG5cdFx0XCLmkLPmkYPmkJ/mkJXmkJjmkLnmkLfmkKLmkKPmkIzmkKbmkLDmkKjmkYHmkLXmkK/mkIrmkJrmkYDmkKXmkKfmkIvmj6fmkJvmkK7mkKHmkI7mla/mlpLml5PmmobmmozmmpXmmpDmmovmmormmpnmmpTmmbjmnKDmpabmpZ/mpLjmpY7mpaLmpbHmpL/mpYXmparmpLnmpYLmpZfmpZnmpbrmpYjmpYnmpLXmpazmpLPmpL3mpaXmo7DmpbjmpLTmpanmpYDmpa/mpYTmpbbmpZjmpYHmpbTmpYzmpLvmpYvmpLfmpZzmpY/mpZHmpLLmpZLmpK/mpbvmpLzmrYbmrYXmrYPmrYLmrYjmrYHmrpvvqI3mr7vmr7xcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZTQwXCIsXG5cdFx0XCLmr7nmr7fmr7jmupvmu5bmu4jmuo/mu4Dmup/mupPmupTmuqDmurHmurnmu4bmu5Lmur3mu4Hmup7mu4nmurfmurDmu43muqbmu4/murLmur7mu4Pmu5zmu5jmupnmupLmuo7muo3muqTmuqHmur/murPmu5Dmu4rmupfmuq7muqPnhYfnhZTnhZLnhaPnhaDnhYHnhZ3nhaLnhbLnhbjnharnhaHnhYLnhZjnhYPnhYvnhbDnhZ/nhZDnhZNcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZWExXCIsXG5cdFx0XCLnhYTnhY3nhZrniY/nio3nioznipHnipDnio7njLznjYLnjLvnjLrnjYDnjYrnjYnnkYTnkYrnkYvnkZLnkZHnkZfnkYDnkY/nkZDnkY7nkYLnkYbnkY3nkZTnk6Hnk7/nk77nk73nlJ3nlbnnlbfmpoPnl6/nmI/nmIPnl7fnl77nl7znl7nnl7jnmJDnl7vnl7bnl63nl7Xnl73nmpnnmrXnm53nnZXnnZ/nnaDnnZLnnZbnnZrnnannnafnnZTnnZnnna3nn6DnoofnoprnopTnoo/nooTnopXnooXnoobnoqHnooPnobnnopnnooDnopbnobvnpbznpoLnpb3npbnnqJHnqJjnqJnnqJLnqJfnqJXnqKLnqJNcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZjQwXCIsXG5cdFx0XCLnqJvnqJDnqqPnqqLnqp7nq6vnrabnraTnra3nrbTnrannrbLnraXnrbPnrbHnrbDnraHnrbjnrbbnraPnsrLnsrTnsq/ntojntobntoDnto3ntb/ntoXntbrnto7ntbvntoPntbzntozntpTntoTntb3ntpLnva3nvavnvafnvajnvaznvqbnvqXnvqfnv5vnv5zogKHohaTohaDohbfohZzohanohZvohaLohbLmnKHohZ7ohbbohafoha9cIlxuXHRdLFxuXHRbXG5cdFx0XCJkZmExXCIsXG5cdFx0XCLohYTohaHoiJ3oiYnoiYToiYDoiYLoiYXok7HokL/okZbokbbokbnoko/oko3okaXokZHokYDokobokafokLDokY3okb3okZrokZnokbTokbPokZ3olIfokZ7okLfokLrokLTokbrokYPokbjokLLokYXokKnoj5nokYvokK/okYLokK3okZ/okbDokLnokY7okYzokZLoka/ok4Xoko7okLvokYfokLbokLPokajokb7okYTokKvokaDokZToka7okZDonIvonITom7fonIzom7rom5bom7XonY3om7jonI7onInonIHom7bonI3onIXoo5boo4voo43oo47oo57oo5voo5roo4zoo5DopoXoppvop5/op6Xop6RcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMDQwXCIsXG5cdFx0XCLop6Hop6Dop6Lop5zop6boqbboqoboqb/oqaHoqL/oqbfoqoLoqoToqbXoqoPoqoHoqbToqbrosLzosYvosYrosaXosaTosabosobosoTosoXos4zotajotanotpHotozoto7oto/oto3otpPotpTotpDotpLot7Dot6Dot6zot7Hot67ot5Dot6not6Pot6Lot6fot7Lot6vot7TovIbou7/ovIHovIDovIXovIfovIjovILovIvpgZLpgL9cIlxuXHRdLFxuXHRbXG5cdFx0XCJlMGExXCIsXG5cdFx0XCLpgYTpgYnpgL3phJDphI3phI/phJHphJbphJTphIvphI7pha7pha/piYjpiZLpiLDpiLrpiabpiLPpiaXpiZ7pioPpiK7piYrpiYbpia3piazpiY/piaDpiafpia/piLbpiaHpibDpiLHpiZTpiaPpiZDpibLpiY7piZPpiYzpiZbpiLLplp/plpzplp7plpvpmpLpmpPpmpHpmpfpm47pm7rpm73pm7jpm7XpnbPpnbfpnbjpnbLpoI/poI3poI7poqzpo7bpo7nppq/pprLpprDpprXpqq3pqqvprZvps6rps63ps6fpuoDpu73lg6blg5Tlg5flg6jlg7Plg5vlg6rlg53lg6Tlg5Plg6zlg7Dlg6/lg6Plg6BcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMTQwXCIsXG5cdFx0XCLlh5jlioDlioHli6nli6vljLDljqzlmKflmJXlmIzlmJLll7zlmI/lmJzlmIHlmJPlmILll7rlmJ3lmITll7/ll7nloonlobzlopDlopjlooblooHlob/lobTloovlobrlooflopHloo7lobblooLloojlobvlopTloo/lo77lpavlq5zlq67lq6Xlq5Xlq6rlq5rlq63lq6vlq7Plq6Llq6Dlq5vlq6zlq57lq53lq5nlq6jlq5/lrbflr6BcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMWExXCIsXG5cdFx0XCLlr6PlsaPltoLltoDltb3ltobltbrltoHltbfltorltonltojltb7ltbzlto3ltbnltb/luZjluZnluZPlu5jlu5Hlu5flu47lu5zlu5Xlu5nlu5Llu5TlvYTlvYPlva/lvrbmhKzmhKjmhYHmhZ7mhbHmhbPmhZLmhZPmhbLmhazmhoDmhbTmhZTmhbrmhZvmhaXmhLvmharmhaHmhZbmiKnmiKfmiKvmkKvmkY3mkZvmkZ3mkbTmkbbmkbLmkbPmkb3mkbXmkabmkqbmkY7mkoLmkZ7mkZzmkYvmkZPmkaDmkZDmkb/mkL/mkazmkavmkZnmkaXmkbfmlbPmlqDmmqHmmqDmmp/mnIXmnITmnKLmprHmprbmp4lcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMjQwXCIsXG5cdFx0XCLmpqDmp47mppbmprDmpqzmprzmppHmppnmpo7mpqfmpo3mpqnmpr7mpq/mpr/mp4Tmpr3mpqTmp5Tmprnmp4rmpprmp4/mprPmppPmpqrmpqHmpp7mp5nmppfmppDmp4LmprXmpqXmp4bmrYrmrY3mrYvmrp7mrp/mrqDmr4Pmr4Tmr77mu47mu7Xmu7HmvIPmvKXmu7jmvLfmu7vmvK7mvInmvY7mvJnmvJrmvKfmvJjmvLvmvJLmu63mvIpcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMmExXCIsXG5cdFx0XCLmvLbmvbPmu7nmu67mvK3mvYDmvLDmvLzmvLXmu6vmvIfmvI7mvYPmvIXmu73mu7bmvLnmvJzmu7zmvLrmvJ/mvI3mvJ7mvIjmvKHnhofnhpDnhonnhoDnhoXnhoLnho/nhbvnhobnhoHnhpfniYTniZPnipfnipXnipPnjYPnjY3njZHnjYznkaLnkbPnkbHnkbXnkbLnkafnka7nlIDnlILnlIPnlb3nlpDnmJbnmIjnmIznmJXnmJHnmIrnmJTnmrjnnoHnnbznnoXnnoLnna7nnoDnna/nnb7nnoPnorLnoqrnorTnoq3noqjnob7noqvnop7noqXnoqDnoqznoqLnoqTnppjnpornpovnppbnppXnppTnppNcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMzQwXCIsXG5cdFx0XCLnppfnpojnppLnppDnqKvnqYrnqLDnqK/nqKjnqKbnqqjnqqvnqqznq67nrojnrpznrornrpHnrpDnrpbnro3nroznrpvnro7nroXnrpjlioTnrpnnrqTnroLnsrvnsr/nsrznsrrntqfntrfnt4LntqPntqrnt4Hnt4Dnt4Xntp3nt47nt4Tnt4bnt4vnt4zntq/ntrnntpbntrzntp/ntqbntq7ntqnntqHnt4nnvbPnv6Lnv6Pnv6Xnv55cIlxuXHRdLFxuXHRbXG5cdFx0XCJlM2ExXCIsXG5cdFx0XCLogKTogZ3ogZzohonohobohoPohofoho3ohozohovoiJXokpfokqTokqHokp/okrrok47ok4Lokqzokq7okqvokrnokrTok4Hok43okqrokprokrHok5Dokp3okqfokrvokqLokpTok4fok4zokpvokqnokq/okqjok5bokpjokrbok4/okqDok5fok5Tok5Lok5vokrDokpHomaHonLPonKPonKjonavonYDonK7onJ7onKHonJnonJvonYPonKzonYHonL7onYbonKDonLLonKronK3onLzonJLonLronLHonLXonYLonKbonKfonLjonKTonJronLDonJHoo7foo6foo7Hoo7Loo7roo77oo67oo7zoo7boo7tcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNDQwXCIsXG5cdFx0XCLoo7Doo6zoo6vopp3opqHopp/opp7op6nop6vop6joqqvoqpnoqovoqpLoqo/oqpbosL3osajosanos5Xos4/os5fotpbouInouILot7/ouI3ot73ouIrouIPouIfouIbouIXot77ouIDouITovJDovJHovI7ovI3phKPphJzphKDphKLphJ/phJ3phJrphKTphKHphJvphbrphbLphbnphbPpiqXpiqTpibbpipvpibrpiqDpipTpiqrpio1cIlxuXHRdLFxuXHRbXG5cdFx0XCJlNGExXCIsXG5cdFx0XCLpiqbpiprpiqvpibnpipfpib/piqPpi67pio7pioLpipXpiqLpib3piojpiqHpiorpiobpiozpipnpiqfpib7piofpiqnpip3piovpiK3pmp7pmqHpm7/pnZjpnb3pnbrpnb7pnoPpnoDpnoLpnbvpnoTpnoHpnb/pn47pn43poJbpoq3poq7ppILppIDppIfppp3pppzpp4Ppprnpprvpprrpp4Lppr3pp4fpqrHpq6Ppq6fprL7prL/praDpraHprZ/ps7Hps7Lps7Xpuqflg7/lhIPlhLDlg7jlhIblhIflg7blg77lhIvlhIzlg73lhIrliovliozli7Hli6/lmYjlmYLlmYzlmLXlmYHlmYrlmYnlmYblmZhcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNTQwXCIsXG5cdFx0XCLlmZrlmYDlmLPlmL3lmKzlmL7lmLjlmKrlmLrlnJrloqvlop3lorHloqDloqPloq/loqzloqXloqHlo7/lq7/lq7Tlq73lq7flq7blrIPlq7jlrILlq7nlrIHlrIflrIXlrI/lsafltpnltpfltp/ltpLltqLltpPltpXltqDltpzltqHltprltp7luanluZ3luaDluZznt7Plu5vlu57lu6HlvYnlvrLmhovmhoPmhbnmhrHmhrDmhqLmholcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNWExXCIsXG5cdFx0XCLmhpvmhpPmhq/mhq3mhp/mhpLmhqrmhqHmho3mhabmhrPmiK3mka7mkbDmkpbmkqDmkoXmkpfmkpzmko/mkovmkormkozmkqPmkp/mkajmkrHmkpjmlbbmlbrmlbnmlbvmlrLmlrPmmrXmmrDmmqnmmrLmmrfmmqrmmq/mqIDmqIbmqJfmp6Xmp7jmqJXmp7Hmp6TmqKDmp7/mp6zmp6LmqJvmqJ3mp77mqKfmp7Lmp67mqJTmp7fmp6fmqYDmqIjmp6bmp7vmqI3mp7zmp6vmqInmqITmqJjmqKXmqI/mp7bmqKbmqIfmp7TmqJbmrZHmrqXmrqPmrqLmrqbmsIHmsIDmr7/msILmvYHmvKbmvb7mvofmv4bmvpJcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNjQwXCIsXG5cdFx0XCLmvo3mvonmvozmvaLmvY/mvoXmvZrmvpbmvbbmvazmvoLmvZXmvbLmvZLmvZDmvZfmvpTmvpPmvZ3mvIDmvaHmvavmvb3mvafmvpDmvZPmvovmvanmvb/mvpXmvaPmvbfmvarmvbvnhrLnhq/nhpvnhrDnhqDnhprnhqnnhrXnhp3nhqXnhp7nhqTnhqHnhqrnhpznhqfnhrPnipjniprnjZjnjZLnjZ7njZ/njaDnjZ3njZvnjaHnjZrnjZlcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNmExXCIsXG5cdFx0XCLnjaLnkofnkonnkornkobnkoHnkb3nkoXnkojnkbznkbnnlIjnlIfnlb7nmKXnmJ7nmJnnmJ3nmJznmKPnmJrnmKjnmJvnmpznmp3nmp7nmpvnno3nno/nnonnnojno43norvno4/no4zno5Hno47no5Tno4jno4Pno4Tno4nnpprnpqHnpqDnppznpqLnppvmrbbnqLnnqrLnqrTnqrPnrrfnr4vnrr7nrqznr47nrq/nrrnnr4rnrrXns4Xns4jns4zns4vnt7fnt5vnt6rnt6fnt5fnt6HnuIPnt7rnt6bnt7bnt7Hnt7Dnt67nt5/nvbbnvqznvrDnvq3nv63nv6vnv6rnv6znv6bnv6jogaTogafohqPohp9cIlxuXHRdLFxuXHRbXG5cdFx0XCJlNzQwXCIsXG5cdFx0XCLohp7ohpXohqLohpnohpfoiJboiY/oiZPoiZLoiZDoiY7oiZHolKTolLvolI/olIDolKnolI7olInolI3olJ/olIrolKfolJzok7volKvok7rolIjolIzok7TolKrok7LolJXok7fok6vok7Pok7zolJLok6rok6nolJbok77olKjolJ3olK7olILok73olJ7ok7bolLHolKbok6fok6jok7Dok6/ok7nolJjolKDolLDolIvolJnolK/omaJcIlxuXHRdLFxuXHRbXG5cdFx0XCJlN2ExXCIsXG5cdFx0XCLonZbonaPonaTonbfon6HonbPonZjonZTonZvonZLonaHonZronZHonZ7ona3onaronZDonY7onZ/onZ3ona/onazonbrona7onZzonaXonY/onbvonbXonaLonafonanooZropIXopIzopJTopIvopJfopJjopJnopIbopJbopJHopI7opInopqLopqTopqPop63op7Dop6zoq4/oq4boqrjoq5Poq5Hoq5Toq5Xoqrvoq5foqr7oq4Doq4Xoq5joq4Poqrroqr3oq5nosL7osY3oso/os6Xos5/os5nos6jos5ros53os6fotqDotpzotqHotpvouKDouKPouKXouKTouK7ouJXouJvouJbouJHouJnouKbouKdcIlxuXHRdLFxuXHRbXG5cdFx0XCJlODQwXCIsXG5cdFx0XCLouJTouJLouJjouJPouJzouJfouJrovKzovKTovJjovJrovKDovKPovJbovJfpgbPpgbDpga/pgafpgavphK/phKvphKnphKrphLLphKbphK7phoXphobphorphoHphoLphoTphoDpi5Dpi4Ppi4Tpi4Dpi5npirbpi4/pi7Hpi5/pi5jpi6npi5fpi53pi4zpi6/pi4Lpi6jpi4rpi4jpi47pi6bpi43pi5Xpi4npi6Dpi57pi6fpi5Hpi5NcIlxuXHRdLFxuXHRbXG5cdFx0XCJlOGExXCIsXG5cdFx0XCLpirXpi6Hpi4bpirTplbzplqzplqvplq7plrDpmqTpmqLpm5PpnIXpnIjpnILpnZrpnorpno7pnojpn5Dpn4/poJ7poJ3poKbpoKnpoKjpoKDpoJvpoKfporLppIjpo7rppJHppJTppJbppJfppJXpp5zpp43pp4/pp5Ppp5Tpp47pp4npp5bpp5jpp4vpp5fpp4zpqrPpq6zpq6vpq7Ppq7Lpq7HprYbprYPprafprbTprbHprabprbbprbXprbDprajpraTprazps7zps7rps73ps7/ps7fptIfptIDps7nps7vptIjptIXptITpuoPpu5PpvI/pvJDlhJzlhJPlhJflhJrlhJHlh57ljLTlj6HlmbDlmaDlma5cIlxuXHRdLFxuXHRbXG5cdFx0XCJlOTQwXCIsXG5cdFx0XCLlmbPlmablmaPlma3lmbLlmZ7lmbflnJzlnJvlo4jlor3lo4nlor/lorrlo4Llorzlo4blrJflrJnlrJvlrKHlrJTlrJPlrJDlrJblrKjlrJrlrKDlrJ7lr6/ltqzltrHltqnltqfltrXltrDltq7ltqrltqjltrLltq3ltq/ltrTluafluajluablua/lu6nlu6flu6blu6jlu6XlvYvlvrzmhp3mhqjmhpbmh4XmhrTmh4bmh4Hmh4zmhrpcIlxuXHRdLFxuXHRbXG5cdFx0XCJlOWExXCIsXG5cdFx0XCLmhr/mhrjmhozmk5fmk5bmk5Dmk4/mk4nmkr3mkonmk4Pmk5vmk7Pmk5nmlLPmlb/mlbzmlqLmm4jmmr7mm4Dmm4rmm4vmm4/mmr3mmrvmmrrmm4zmnKPmqLTmqabmqYnmqafmqLLmqajmqL7mqZ3mqa3mqbbmqZvmqZHmqKjmqZrmqLvmqL/mqYHmqarmqaTmqZDmqY/mqZTmqa/mqanmqaDmqLzmqZ7mqZbmqZXmqY3mqY7mqYbmrZXmrZTmrZbmrqfmrqrmrqvmr4jmr4fmsITmsIPmsIbmvq3mv4vmvqPmv4fmvrzmv47mv4jmvZ7mv4Tmvr3mvp7mv4rmvqjngITmvqXmvq7mvrrmvqzmvqrmv4/mvr/mvrhcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYTQwXCIsXG5cdFx0XCLmvqLmv4nmvqvmv43mvq/mvrLmvrDnh4Xnh4Lnhr/nhrjnh5bnh4Dnh4Hnh4vnh5Tnh4rnh4fnh4/nhr3nh5jnhrznh4bnh5rnh5vnip3nip7njannjabnjafnjaznjaXnjavnjarnkb/nkprnkqDnkpTnkpLnkpXnkqHnlIvnloDnmK/nmK3nmLHnmL3nmLPnmLznmLXnmLLnmLDnmrvnm6bnnprnnp3nnqHnnpznnpvnnqLnnqPnnpXnnplcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYWExXCIsXG5cdFx0XCLnnpfno53no6nno6Xno6rno57no6Pno5vno6Hno6Lno63no5/no6DnpqTnqYTnqYjnqYfnqrbnqrjnqrXnqrHnqrfnr57nr6Pnr6fnr53nr5Xnr6Xnr5rnr6jnr7nnr5Tnr6rnr6Lnr5znr6vnr5jnr5/ns5Lns5Tns5fns5Dns5HnuJLnuKHnuJfnuIznuJ/nuKDnuJPnuI7nuJznuJXnuJrnuKLnuIvnuI/nuJbnuI3nuJTnuKXnuKTnvYPnvbvnvbznvbrnvrHnv6/ogKrogKnogazohrHohqbohq7ohrnohrXohqvohrDohqzohrTohrLohrfohqfoh7LoiZXoiZboiZfolZbolYXolavolY3olZPolaHolZhcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYjQwXCIsXG5cdFx0XCLolYDolYbolaTolYHolaLolYTolZHolYfolaPolL7olZvolbHolY7ola7olbXolZXolafolaDolozolabolZ3olZTolaXolazomaPomaXomaTonpvono/onpfonpPonpLonojonoHonpbonpjonbnonofonqPonoXonpDonpHonp3onoTonpTonpzonprononopJ7opKbopLDopK3opK7opKfopLHopKLopKnopKPopK/opKzopJ/op7Hoq6BcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYmExXCIsXG5cdFx0XCLoq6Loq7Loq7Toq7Xoq53orJToq6Toq5/oq7Doq4joq57oq6Hoq6joq7/oq6/oq7vospHospLospDos7Xos67os7Hos7Dos7Potazota7otqXotqfouLPouL7ouLjouYDouYXouLbouLzouL3ouYHouLDouL/our3ovLbovK7ovLXovLLovLnovLfovLTpgbbpgbnpgbvpgobpg7rphLPphLXphLbphpPphpDphpHpho3pho/pjKfpjJ7pjIjpjJ/pjIbpjI/pjbrpjLjpjLzpjJvpjKPpjJLpjIHpjYbpjK3pjI7pjI3pi4vpjJ3pi7rpjKXpjJPpi7npi7fpjLTpjILpjKTpi7/pjKnpjLnpjLXpjKrpjJTpjIxcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYzQwXCIsXG5cdFx0XCLpjIvpi77pjInpjIDpi7vpjJbplrzpl43plr7plrnplrrplrbplr/plrXplr3pmqnpm5TpnIvpnJLpnJDpnpnpnpfpnpTpn7Dpn7jpoLXpoK/poLLppKTppJ/ppKfppKnppp7pp67pp6zpp6Xpp6Tpp7Dpp6Ppp6rpp6npp6fpqrnpqr/pqrTpqrvpq7bpq7rpq7npq7fprLPproDproXprofprbzprb7prbvproLprpPprpLprpDprbrprpVcIlxuXHRdLFxuXHRbXG5cdFx0XCJlY2ExXCIsXG5cdFx0XCLprb3projptKXptJfptKDptJ7ptJTptKnptJ3ptJjptKLptJDptJnptJ/puojpuobpuofpuq7puq3pu5Xpu5bpu7rpvJLpvL3lhKblhKXlhKLlhKTlhKDlhKnli7TlmpPlmozlmo3lmoblmoTlmoPlmb7lmoLlmb/lmoHlo5blo5Tlo4/lo5LlrK3lrKXlrLLlrKPlrKzlrKflrKblrK/lrK7lrbvlr7Hlr7Lltrfluazluarlvr7lvrvmh4PmhrXmhrzmh6fmh6Dmh6Xmh6Tmh6jmh57mk6/mk6nmk6Pmk6vmk6Tmk6jmloHmloDmlrbml5rmm5Lmqo3mqpbmqoHmqqXmqonmqp/mqpvmqqHmqp7mqofmqpPmqo5cIlxuXHRdLFxuXHRbXG5cdFx0XCJlZDQwXCIsXG5cdFx0XCLmqpXmqoPmqqjmqqTmqpHmqb/mqqbmqprmqoXmqozmqpLmrZvmrq3msInmv4zmvqnmv7Tmv5Tmv6Pmv5zmv63mv6fmv6bmv57mv7Lmv53mv6Lmv6jnh6Hnh7Hnh6jnh7Lnh6Tnh7Dnh6LnjbPnja7nja/nkpfnkrLnkqvnkpDnkqrnkq3nkrHnkqXnkq/nlJDnlJHnlJLnlI/nloTnmYPnmYjnmYnnmYfnmqTnm6nnnrXnnqvnnrLnnrfnnrZcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZGExXCIsXG5cdFx0XCLnnrTnnrHnnqjnn7Dno7Pno73npILno7vno7zno7LnpIXno7nno77npITnpqvnpqjnqZznqZvnqZbnqZjnqZTnqZrnqr7nq4Dnq4HnsIXnsI/nr7LnsIDnr7/nr7vnsI7nr7TnsIvnr7PnsILnsInnsIPnsIHnr7jnr73nsIbnr7Dnr7HnsJDnsIrns6jnuK3nuLznuYLnuLPpoYjnuLjnuKrnuYnnuYDnuYfnuKnnuYznuLDnuLvnuLbnuYTnuLrnvYXnvb/nvb7nvb3nv7Tnv7LogKzohrvoh4Toh4zoh4roh4Xoh4fohrzoh6noiZvoiZroiZzoloPoloDolo/olqfolpXolqDolovolqPolbvolqTolprolp5cIlxuXHRdLFxuXHRbXG5cdFx0XCJlZTQwXCIsXG5cdFx0XCLolbfolbzolonolqHolbrolbjolZfolo7olpbolobolo3olpnolp3oloHolqLoloLolojoloXolbnolbbolpjolpDolp/omajonr7onqronq3on4XonrDonqzonrnonrXonrzonq7on4non4Pon4Lon4zonrfonq/on4Ton4ronrTonrbonr/onrjonr3on57onrLopLXopLPopLzopL7opYHopZLopLfopYLopq3opq/opq7op7Lop7PorJ5cIlxuXHRdLFxuXHRbXG5cdFx0XCJlZWExXCIsXG5cdFx0XCLorJjorJborJHorIXorIvorKLorI/orJLorJXorIforI3orIjorIborJzorJPorJrosY/osbDosbLosbHosa/ospXospTos7nota/ouY7ouY3ouZPouZDouYzouYfovYPovYDpgoXpgb7phLjphprphqLphpvphpnphp/phqHphp3phqDpjqHpjoPpjq/pjaTpjZbpjYfpjbzpjZjpjZzpjbbpjYnpjZDpjZHpjaDpja3pjo/pjYzpjarpjbnpjZfpjZXpjZLpjY/pjbHpjbfpjbvpjaHpjZ7pjaPpjafpjoDpjY7pjZnpl4fpl4Dpl4npl4Ppl4Xplrfpmq7pmrDpmqzpnKDpnJ/pnJjpnJ3pnJnpnprpnqHpnpxcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZjQwXCIsXG5cdFx0XCLpnp7pnp3pn5Xpn5Tpn7HpoYHpoYTpoYrpoYnpoYXpoYPppKXppKvppKzppKrppLPppLLppK/ppK3ppLHppLDpppjppqPppqHpqILpp7rpp7Tpp7fpp7npp7jpp7bpp7vpp73pp77pp7zpqIPpqr7pq77pq73prIHpq7zprYjprprprqjprp7prpvprqbprqHprqXprqTprobprqLprqDprq/ptLPptYHptafptLbptK7ptK/ptLHptLjptLBcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZmExXCIsXG5cdFx0XCLptYXptYLptYPptL7ptLfptYDptL3nv7XptK3puorpuonpuo3purDpu4jpu5rpu7vpu7/pvKTpvKPpvKLpvZTpvqDlhLHlhK3lhK7lmpjlmpzlmpflmprlmp3lmpnlpbDlrLzlsanlsarlt4Dlua3lua7mh5jmh5/mh63mh67mh7Hmh6rmh7Dmh6vmh5bmh6nmk7/mlITmk73mk7jmlIHmlIPmk7zmlpTml5vmm5rmm5vmm5jmq4Xmqrnmqr3mq6Hmq4bmqrrmqrbmqrfmq4fmqrTmqq3mrZ7mr4nmsIvngIfngIzngI3ngIHngIXngJTngI7mv7/ngIDmv7vngKbmv7zmv7fngIrniIHnh7/nh7nniIPnh73njbZcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMDQwXCIsXG5cdFx0XCLnkrjnk4DnkrXnk4Hnkr7nkrbnkrvnk4LnlJTnlJPnmZznmaTnmZnnmZDnmZPnmZfnmZrnmqbnmr3nm6znn4Lnnrrno7/npIznpJPnpJTnpInnpJDnpJLnpJHnpq3npqznqZ/nsJznsKnnsJnnsKDnsJ/nsK3nsJ3nsKbnsKjnsKLnsKXnsLDnuZznuZDnuZbnuaPnuZjnuaLnuZ/nuZHnuaDnuZfnuZPnvrXnvrPnv7fnv7jogbXoh5Hoh5JcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMGExXCIsXG5cdFx0XCLoh5DoiZ/oiZ7olrTol4bol4Dol4Pol4LolrPolrXolr3ol4fol4Tolr/ol4vol47ol4jol4XolrHolrbol5LomKTolrjolrfolr7omanon6fon6bon6Lon5von6von6ron6Xon5/on7Pon6Ton5Ton5zon5Pon63on5jon6PonqTon5fon5nooIHon7Ton6jon53opZPopYvopY/opYzopYbopZDopZHopYnorKrorKforKPorLPorLDorLXorYforK/orLzorL7orLHorKXorLforKborLborK7orKTorLvorL3orLrosYLosbXospnospjospfos77otITotILotIDouZzouaLouaDouZfouZbouZ7ouaXouadcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMTQwXCIsXG5cdFx0XCLouZvouZrouaHouZ3ouanouZTovYbovYfovYjovYvphKjphLrphLvphL7phqjphqXphqfphq/phqrpjrXpjozpjpLpjrfpjpvpjp3pjonpjqfpjo7pjqrpjp7pjqbpjpXpjojpjpnpjp/pjo3pjrHpjpHpjrLpjqTpjqjpjrTpjqPpjqXpl5Lpl5Ppl5HpmrPpm5fpm5rlt4Lpm5/pm5jpm53pnKPpnKLpnKXpnqzpnq7pnqjpnqvpnqTpnqpcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMWExXCIsXG5cdFx0XCLpnqLpnqXpn5fpn5npn5bpn5jpn7rpoZDpoZHpoZLporjppYHppLzppLrpqI/pqIvpqInpqI3pqITpqJHpqIrpqIXpqIfpqIbpq4Dpq5zprIjprITprIXprKnprLXprYrprYzprYvpr4fpr4bpr4Pprr/pr4HprrXprrjpr5Pprrbpr4Tprrnprr3ptZzptZPptY/ptYrptZvptYvptZnptZbptYzptZfptZLptZTptZ/ptZjptZrpuo7puozpu5/pvIHpvIDpvJbpvKXpvKvpvKrpvKnpvKjpvYzpvZXlhLTlhLXlipbli7fljrTlmqvlmq3lmqblmqflmqrlmqzlo5rlo53lo5vlpJLlrL3lrL7lrL/lt4PlubBcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMjQwXCIsXG5cdFx0XCLlvr/mh7vmlIfmlJDmlI3mlInmlIzmlI7mloTml57ml53mm57mq6fmq6Dmq4zmq5Hmq5nmq4vmq5/mq5zmq5Dmq6vmq4/mq43mq57mraDmrrDmsIzngJnngKfngKDngJbngKvngKHngKLngKPngKnngJfngKTngJzngKrniIzniIrniIfniILniIXniqXniqbniqTniqPniqHnk4vnk4Xnkrfnk4PnlJbnmaDnn4nnn4rnn4Tnn7HnpJ3npJtcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMmExXCIsXG5cdFx0XCLnpKHnpJznpJfnpJ7nprDnqafnqajnsLPnsLznsLnnsKznsLvns6zns6rnubbnubXnubjnubDnubfnua/nubrnubLnubTnuajnvYvnvYrnvoPnvobnvrfnv73nv77ogbjoh5foh5XoiaToiaHoiaPol6vol7Hol63ol5nol6Hol6jol5rol5fol6zol7Lol7jol5jol5/ol6Pol5zol5Hol7Dol6bol6/ol57ol6LooIDon7rooIPon7bon7fooInooIzooIvooIbon7zooIjon7/ooIrooILopaLopZropZvopZfopaHopZzopZjopZ3opZnopojoprfoprbop7borZDorYjorYrorYDorZPorZborZTorYvorZVcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMzQwXCIsXG5cdFx0XCLorZHorYLorZLorZfosYPosbfosbbosprotIbotIfotInotqzotqrotq3otqvoua3oubjoubPouaroua/oubvou4LovZLovZHovY/ovZDovZPovrTphYDphL/phrDphq3pj57pj4fpj4/pj4Lpj5rpj5Dpj7npj6zpj4zpj5npjqnpj6bpj4rpj5Tpj67pj6Ppj5Xpj4Tpj47pj4Dpj5Lpj6fplb3pl5rpl5vpm6HpnKnpnKvpnKzpnKjpnKZcIlxuXHRdLFxuXHRbXG5cdFx0XCJmM2ExXCIsXG5cdFx0XCLpnrPpnrfpnrbpn53pn57pn5/poZzpoZnpoZ3poZfpor/por3porvpor7ppYjppYfppYPppqbppqfpqJrpqJXpqKXpqJ3pqKTpqJvpqKLpqKDpqKfpqKPpqJ7pqJzpqJTpq4LprIvprIrprI7prIzprLfpr6rpr6vpr6Dpr57pr6Tpr6bpr6Lpr7Dpr5Tpr5fpr6zpr5zpr5npr6Xpr5Xpr6Hpr5rptbfptoHptorptoTptojptbHptoDptbjptobptovptozptb3ptavptbTptbXptbDptanptoXptbPptbvptoLpta/ptbnptb/ptofptajpupTpupHpu4Dpu7zpvK3pvYDpvYHpvY3pvZbpvZfpvZjljLflmrJcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNDQwXCIsXG5cdFx0XCLlmrXlmrPlo6PlrYXlt4blt4flu67lu6/lv4Dlv4Hmh7nmlJfmlJbmlJXmlJPml5/mm6jmm6Pmm6Tmq7Pmq7Dmq6rmq6jmq7nmq7Hmq67mq6/ngLzngLXngK/ngLfngLTngLHngYLngLjngL/ngLrngLnngYDngLvngLPngYHniJPniJTniqjnjb3njbznkrrnmqvnmqrnmr7nm63nn4znn47nn4/nn43nn7LnpKXnpKPnpKfnpKjnpKTnpKlcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNGExXCIsXG5cdFx0XCLnprLnqa7nqaznqa3nq7fnsYnnsYjnsYrnsYfnsYXns67nubvnub7nuoHnuoDnvrrnv7/ogbnoh5voh5noiIvoiajoianomKLol7/omIHol77omJvomIDol7bomITomInomIXomIzol73ooJnooJDooJHooJfooJPooJbopaPopaboprnop7foraDorarorZ3orajoraPoraXorafora3otq7ouobouojouoTovZnovZbovZfovZXovZjovZrpgo3phYPphYHphrfphrXphrLphrPpkIvpkJPpj7vpkKDpkI/pkJTpj77pkJXpkJDpkKjpkJnpkI3pj7XpkIDpj7fpkIfpkI7pkJbpkJLpj7rpkInpj7jpkIrpj79cIlxuXHRdLFxuXHRbXG5cdFx0XCJmNTQwXCIsXG5cdFx0XCLpj7zpkIzpj7bpkJHpkIbpl57pl6Dpl5/pnK7pnK/pnrnpnrvpn73pn77poaDpoaLpoaPpoZ/po4Hpo4LppZDppY7ppZnppYzppYvppZPpqLLpqLTpqLHpqKzpqKrpqLbpqKnpqK7pqLjpqK3pq4fpq4rpq4bprJDprJLprJHpsIvpsIjpr7fpsIXpsJLpr7jpsYDpsIfpsI7psIbpsJfpsJTpsInptp/ptpnptqTptp3ptpLptpjptpDptptcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNWExXCIsXG5cdFx0XCLptqDptpTptpzptqrptpfptqHptprptqLptqjptp7ptqPptr/ptqnptpbptqbptqfpupnpupvpuprpu6Xpu6Tpu6fpu6bpvLDpvK7pvZvpvaDpvZ7pvZ3pvZnpvpHlhLrlhLnlipjlipflm4Plmr3lmr7lrYjlrYflt4vlt4/lu7Hmh73mlJvmrILmq7zmrIPmq7jmrIDngYPngYTngYrngYjngYnngYXngYbniJ3niJrniJnnjb7nlJfnmarnn5DnpK3npLHnpK/nsZTnsZPns7Lnuornuofnuojnuovnuobnuo3nvY3nvrvogLDoh53omJjomKromKbomJ/omKPomJzomJnomKfomK7omKHomKDomKnomJ7omKVcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNjQwXCIsXG5cdFx0XCLooKnooJ3ooJvooKDooKTooJzooKvooYropa3opanopa7opavop7rorbnorbjorYXorbrorbvotJDotJTotq/ouo7ouozovZ7ovZvovZ3phYbphYTphYXphrnpkL/pkLvpkLbpkKnpkL3pkLzpkLDpkLnpkKrpkLfpkKzpkYDpkLHpl6Xpl6Tpl6PpnLXpnLrpnr/pn6HpoaTpo4npo4bpo4DppZjppZbpqLnpqL3pqYbpqYTpqYLpqYHpqLpcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNmExXCIsXG5cdFx0XCLpqL/pq43prJXprJfprJjprJbprLrprZLpsKvpsJ3psJzpsKzpsKPpsKjpsKnpsKTpsKHptrfptrbptrzpt4Hpt4fpt4rpt4/ptr7pt4Xpt4PptrvptrXpt47ptrnptrrptqzpt4jptrHptq3pt4zptrPpt43ptrLpubrpupzpu6vpu67pu63pvJvpvJjpvJrpvLHpvY7pvaXpvaTpvpLkurnlm4blm4Xlm4vlpbHlrYvlrYzlt5Xlt5Hlu7LmlKHmlKDmlKbmlKLmrIvmrIjmrInmsI3ngZXngZbngZfngZLniJ7niJ/niqnnjb/nk5jnk5Xnk5nnk5fnma3nmq3npLXnprTnqbDnqbHnsZfnsZznsZnnsZvnsZpcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNzQwXCIsXG5cdFx0XCLns7Tns7HnupHnvY/nvofoh57oiavomLTomLXomLPomKzomLLomLbooKzooKjooKbooKrooKXopbHopr/opr7op7vorb7oroToroLoroboroXorb/otJXoupXoupTouproupLoupDoupboupfovaDovaLphYfpkYzpkZDpkYrpkYvpkY/pkYfpkYXpkYjpkYnpkYbpnL/pn6Ppoarpoanpo4vppZTppZvpqY7pqZPpqZTpqYzpqY/pqYjpqYpcIlxuXHRdLFxuXHRbXG5cdFx0XCJmN2ExXCIsXG5cdFx0XCLpqYnpqZLpqZDpq5DprJnprKvprLvprZbprZXpsYbpsYjpsL/psYTpsLnpsLPpsYHpsLzpsLfpsLTpsLLpsL3psLbpt5vpt5Lpt57pt5rpt4vpt5Dpt5zpt5Hpt5/pt6npt5npt5jpt5bpt7Xpt5Xpt53purbpu7DpvLXpvLPpvLLpvYLpvavpvpXpvqLlhL3lipnlo6jlo6flpbLlrY3lt5jooK/lvY/miIHmiIPmiITmlKnmlKXmlpbmm6vmrJHmrJLmrI/mr4rngZvngZrniKLnjoLnjoHnjoPnmbDnn5TnsafnsabnupXoiazomLromYDomLnomLzomLHomLvomL7ooLDooLLooK7ooLPopbbopbTopbPop75cIlxuXHRdLFxuXHRbXG5cdFx0XCJmODQwXCIsXG5cdFx0XCLorozoro7orovorojosYXotJnoupjovaTovaPphrzpkaLpkZXpkZ3pkZfpkZ7pn4Tpn4XpoIDpqZbpqZnprJ7prJ/prKDpsZLpsZjpsZDpsYrpsY3psYvpsZXpsZnpsYzpsY7pt7vpt7fpt6/pt6Ppt6vpt7jpt6Tpt7bpt6Hpt67pt6bpt7Lpt7Dpt6Lpt6zpt7Tpt7Ppt6jpt63pu4Lpu5Dpu7Lpu7PpvIbpvJzpvLjpvLfpvLbpvYPpvY9cIlxuXHRdLFxuXHRbXG5cdFx0XCJmOGExXCIsXG5cdFx0XCLpvbHpvbDpva7pva/lm5Plm43lrY7lsa3mlK3mm63mm67mrJPngZ/ngaHngZ3ngaDniKPnk5vnk6Xnn5XnpLjnprfnprbnsarnupfnvonoia3omYPooLjooLfooLXooYvorpTorpXoup7oup/ouqDoup3phr7phr3ph4Lpkavpkajpkanpm6XpnYbpnYPpnYfpn4fpn6XpqZ7pq5XprZnpsaPpsafpsabpsaLpsZ7psaDpuILpt77puIfpuIPpuIbpuIXpuIDpuIHpuInpt7/pt73puITpuqDpvJ7pvYbpvbTpvbXpvbblm5TmlK7mlrjmrJjmrJnmrJfmrJrngaLniKbniqrnn5jnn5nnpLnnsannsavns7bnuppcIlxuXHRdLFxuXHRbXG5cdFx0XCJmOTQwXCIsXG5cdFx0XCLnupjnupvnupnoh6Doh6HomYbomYfomYjopbnopbropbzopbvop7/orpjorpnouqXouqTouqPpka7pka3pka/pkbHpkbPpnYnpobLppZ/psajpsa7psa3puIvpuI3puJDpuI/puJLpuJHpuqHpu7XpvInpvYfpvbjpvbvpvbrpvbnlnJ7ngabnsa/ooLzotrLouqbph4PpkbTpkbjpkbbpkbXpqaDpsbTpsbPpsbHpsbXpuJTpuJPpu7bpvIpcIlxuXHRdLFxuXHRbXG5cdFx0XCJmOWExXCIsXG5cdFx0XCLpvqTngajngaXns7fomarooL7ooL3ooL/orp7ospzouqnou4npnYvpobPpobTpo4zppaHppqvpqaTpqabpqafprKTpuJXpuJfpvYjmiIfmrJ7niKfomYzouqjpkoLpkoDpkoHpqanpqajprK7puJnniKnomYvorp/pkoPpsbnpurfnmbXpqavpsbrpuJ3nganngarpuqTpvb7pvYnpvpjnooHpirnoo4/lorvmgZLnsqflq7rilZTilabilZfilaDilazilaPilZrilanilZ3ilZLilaTilZXilZ7ilarilaHilZjilafilZvilZPilaXilZbilZ/ilavilaLilZnilajilZzilZHilZDila3ila7ilbDila/ilpNcIlxuXHRdXG5dO1xuXG52YXIgY3A5NTAkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnZGVmYXVsdCc6IGNwOTUwXG59KTtcblxudmFyIGJpZzVBZGRlZCA9IFtcblx0W1xuXHRcdFwiODc0MFwiLFxuXHRcdFwi5I+w5LCy5JiD5Jam5JW48KeJp+S1t+SWs/CnsrHks6Lwp7OF466V5Jy25J2E5LGH5LGA8KSKv/CjmJfwp42S8Ka6i/Cng5LksZfwqo2R5J2P5Jea5LKF8KexrOS0h+SqpOSaofCmrKPniKXwpamU8KGpo/CjuIbwo72h5pmN5Zu7XCJcblx0XSxcblx0W1xuXHRcdFwiODc2N1wiLFxuXHRcdFwi57aV5aSd8KiuueO3tOmctPCnr6/lr5vwobWe5aqk45il8Km6sOWrkeWut+WzvOadruiWk/CppYXnkaHnkp3jobXwobWT8KOanvCmgKHju6xcIlxuXHRdLFxuXHRbXG5cdFx0XCI4N2ExXCIsXG5cdFx0XCLwpaOe46u156u86b6X8KSFofCopI3wo4eq8KCqivCjiZ7kjIrokoTpvpbpkK/kpLDomJPlopbpnYrpiJjnp5DnqLLmmaDmqKnoop3nkYznr4XmnoLnqKzliY/pgYbjk6bnj4Twpba555OG6b+H5Z6z5KSv5ZGM5ISx8KOajuWgmOepsvCnraXoro/kmq7wprqI5IaB8KW2meeurvCikrzpv4jwopOB8KKTifCik4zpv4nolITwo5a75IK06b+K5JOh8Kq3v+aLgeeBrum/i1wiXG5cdF0sXG5cdFtcblx0XHRcIjg4NDBcIixcblx0XHRcIuOHgFwiLFxuXHRcdDQsXG5cdFx0XCLwoISM44eF8KCDkfCgg43jh4bjh4fwoIOL8KG/qOOHiPCgg4rjh4njh4rjh4vjh4zwoISO44eN44eOxIDDgceNw4DEksOJxJrDiMWMw5PHkcOS4L+/w4rMhOG6vuC/v8OKzIzhu4DDisSBw6HHjsOgyZHEk8OpxJvDqMSrw63HkMOsxY3Ds8eSw7LFq8O6x5TDuceWx5jHmlwiXG5cdF0sXG5cdFtcblx0XHRcIjg4YTFcIixcblx0XHRcIsecw7zgv7/DqsyE4bq/4L+/w6rMjOG7gcOqyaHij5rij5tcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OTQwXCIsXG5cdFx0XCLwqo6p8KGFhVwiXG5cdF0sXG5cdFtcblx0XHRcIjg5NDNcIixcblx0XHRcIuaUilwiXG5cdF0sXG5cdFtcblx0XHRcIjg5NDZcIixcblx0XHRcIuS4vea7nem1jumHn1wiXG5cdF0sXG5cdFtcblx0XHRcIjg5NGNcIixcblx0XHRcIvCnnLXmkpHkvJrkvKjkvqjlhZblhbTlhpzlh6TliqHliqjljLvljY7lj5Hlj5jlm6Llo7DlpITlpIflpLLlpLTlrablrp7lrp/lsprluobmgLvmlonmn77moITmoaXmtY7ngrznlLXnuqTnuqznurrnu4fnu4/nu5/nvIbnvLfoibroi4/oja/op4borr7or6Lovabovafova5cIlxuXHRdLFxuXHRbXG5cdFx0XCI4OWExXCIsXG5cdFx0XCLnkJHns7znt43mpYbnq4nliKdcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OWFiXCIsXG5cdFx0XCLphoznorjphZ7ogrxcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OWIwXCIsXG5cdFx0XCLotIvog7bwoKenXCJcblx0XSxcblx0W1xuXHRcdFwiODliNVwiLFxuXHRcdFwi6IKf6buH5LON6beJ6biM5LC+8Km3tvCngI7puIrwqoSz45eBXCJcblx0XSxcblx0W1xuXHRcdFwiODljMVwiLFxuXHRcdFwi5rqa6Ii+55SZXCJcblx0XSxcblx0W1xuXHRcdFwiODljNVwiLFxuXHRcdFwi5KSR6ams6aqP6b6Z56aH8KiRrPCht4rwoJeQ8KKrpuS4pOS6geS6gOS6h+S6v+S7q+S8t+ORjOS+veO5iOWAg+WCiOORveOSk+OSpeWGhuWkheWHm+WHvOWIheS6ieWJueWKkOWMp+OXh+WOqeOVkeWOsOOVk+WPguWQo+OVreOVsuOageWSk+WSo+WStOWSueWTkOWTr+WUmOWUo+WUqOOWmOWUv+OWpeOWv+WXl+OXhVwiXG5cdF0sXG5cdFtcblx0XHRcIjhhNDBcIixcblx0XHRcIvCntoTllKVcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YTQzXCIsXG5cdFx0XCLwoLGC8KC0lfClhKvllpDworOG46es8KCNgei5hvCktrjwqZOl5IGT8KiCvueduvCisLjjqLTkn5XwqIWd8KansvCkt6rmk53woLW88KC+tPCgs5XwoYO05pKN6Lm+8KC6lvCgsIvwoL2k8KKyqfCoiZbwpJOTXCJcblx0XSxcblx0W1xuXHRcdFwiOGE2NFwiLFxuXHRcdFwi8KC1hvCpqY3wqIOp5J+08KS6p/Cis4LpqrLjqafwqZe047+t45SG8KWLh/Cpn5Twp6OI8KK1hOm1rumglVwiXG5cdF0sXG5cdFtcblx0XHRcIjhhNzZcIixcblx0XHRcIuSPmfCmgqXmkrTlk6PworWM8KKvivChgbfjp7vwoYGvXCJcblx0XSxcblx0W1xuXHRcdFwiOGFhMVwiLFxuXHRcdFwi8KabmvCmnJbwp6ag5pOq8KWBkvCgsYPouajwooah8KitjPCgnLFcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YWFjXCIsXG5cdFx0XCLkoIvwoIap47+65aGz8KK2jVwiXG5cdF0sXG5cdFtcblx0XHRcIjhhYjJcIixcblx0XHRcIvCkl4jwoJO88KaCl/CgvYzwoLaW5ZW55IK75I66XCJcblx0XSxcblx0W1xuXHRcdFwiOGFiYlwiLFxuXHRcdFwi5Kq08KKppvChgp3ohqrpo7XwoLac5o2546e+8KKdtei3gOWaoeaRvOO5g1wiXG5cdF0sXG5cdFtcblx0XHRcIjhhYzlcIixcblx0XHRcIvCqmIHwoLiJ8KKrj/Cis4lcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YWNlXCIsXG5cdFx0XCLwoYOI8KOnguOmkuOohvCoipvjlbjwpbmJ8KKDh+WZkvCgvLHworKy8KmcoOOSvOawvfCkuLtcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YWRmXCIsXG5cdFx0XCLwp5W08KK6i/CiiIjwqpmb8KizjfCgubrwoLC08KagnOe+k/Chg4/woqCD8KKkueOXu/Clh6PwoLqM8KC+jfCguqrjvpPwoLyw8KC1h/ChhY/woLmMXCJcblx0XSxcblx0W1xuXHRcdFwiOGFmNlwiLFxuXHRcdFwi8KC6q/CgrqnwoLWI8KGDgPChhL3jv7nwopqW5pCy8KC+rVwiXG5cdF0sXG5cdFtcblx0XHRcIjhiNDBcIixcblx0XHRcIvCjj7Twp5i58KKvjvCgtb7woLW/8KKxkfCisZXjqJjwoLqY8KGDh/CgvK7wqpiy8KatkPCos5LwqLaZ8KiziumWquWTjOiLhOWWuVwiXG5cdF0sXG5cdFtcblx0XHRcIjhiNTVcIixcblx0XHRcIvCpu4PpsKbpqrbwp52e8KK3rueFgOiFreiDrOWwnPCmlbLohLTjnpfljZ/wqIK96Ya28KC7uvCguI/woLm38KC7u+OXnfCkt6vjmInwoLOW5Zqv8KKetfChg4nwoLiQ8KC5uPChgbjwoYWI8KiIh/ChkZXwoLm58KS5kPCitqTlqZTwoYCd8KGAnvChg7XwoYO25Z6c8KC4kVwiXG5cdF0sXG5cdFtcblx0XHRcIjhiYTFcIixcblx0XHRcIvCnmpTwqIuN8KC+tfCgubvwpYW+45yD8KC+tvChhoDwpYuY8KqKvfCkp5rwoaC68KSFt/CoibzlopnliajjmJrwpZy9566y5a2o5KCA5Kys6byn5Ken6bCf6a6N8KWttPCjhL3ll7vjl7LlmonkuKjlpILwoa+B8K+huOmdkfCggobkuZvkurvjlL7lsKPlvZHlv4Tjo7rmiYzmlLXmrbrmsLXmsLrngazniKvkuKzniq3wpKOp572S56S757O5572T8KaJquOTgVwiXG5cdF0sXG5cdFtcblx0XHRcIjhiZGVcIixcblx0XHRcIvCmjYvogILogoDwppiS8KalkeWNneihpOingfCnorLorqDotJ3pkoXplbjplb/pl6jwqLiP6Z+m6aG16aOO6aOe6aWj8KmgkOmxvOm4n+m7hOatr++kh+S4t/CggofpmJ3miLfpkqJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YzQwXCIsXG5cdFx0XCLlgLvmt77wqbGz6b6m47eJ6KKP8KSFjueBt+WzteSsoPClh43jlZnwpbSw5oSi8Kiosui+p+mHtueGkeacmeeOuvCjioHwqoSH47KL8KGmgOSskOejpOeQguWGrvConI/kgInmqaPwqoq65Iij6JiP8KCpr+eoqvCppYfwqKuq6Z2V54GN5Yyk8KKBvumPtOebmfCop6Ppvqfnn53kuqPkv7DlgrzkuK/kvJfpvqjlkLTntovlopLlo5Dwoba25bqS5bqZ5b+C8KKckuaWi1wiXG5cdF0sXG5cdFtcblx0XHRcIjhjYTFcIixcblx0XHRcIvCjj7nmpJnmqYPwo7Gj5rO/XCJcblx0XSxcblx0W1xuXHRcdFwiOGNhN1wiLFxuXHRcdFwi54iA8KSUheeOjOO7m/CkqJPlrJXnkrnoroPwpbKk8KWaleeqk+evrOezg+e5rOiLuOiWl+m+qeiikOm+qui6uem+q+i/j+iVn+mnoOmIoem+rPCotrnwoZC/5IGx5Iqi5aiaXCJcblx0XSxcblx0W1xuXHRcdFwiOGNjOVwiLFxuXHRcdFwi6aGo5p2r5Im25Zy9XCJcblx0XSxcblx0W1xuXHRcdFwiOGNjZVwiLFxuXHRcdFwi6JeW8KSlu+iKv/CnhI3ksoHwprW05bW78KaslfCmvr7pvq3pvq7lrpbpvq/mm6fnuZvmuZfnp4rjtojkk4Pwo4mW8KKeluSOmuSUtlwiXG5cdF0sXG5cdFtcblx0XHRcIjhjZTZcIixcblx0XHRcIuWzlfCjrJroq7nlsbjjtJLwo5WR5bW46b6y54WX5JWY8KSDrPChuKPksbfjpbjjkYrwoIak8KaxgeirjOS+tPCgiLnlpr/ohazpoZbwqaO65by7XCJcblx0XSxcblx0W1xuXHRcdFwiOGQ0MFwiLFxuXHRcdFwi8KCun1wiXG5cdF0sXG5cdFtcblx0XHRcIjhkNDJcIixcblx0XHRcIvCih4HwqKWt5ISC5Jq78KmBueO8h+m+s/CqhrXkg7jjn5bkm7fwprGG5IW88KiasvCnj7/kla3jo5TwpZKa5JWh5JSb5LaJ5LG75LW25Jeq47+I8KSsj+OZoeSTnuSSveSHreW0vuW1iOW1luO3vOOgj+W2pOW2ueOgoOOguOW5guW6veW8peW+g+OkiOOklOOkv+OljeaDl+aEveWzpeOmieaGt+aGueaHj+OmuOaIrOaKkOaLpeaMmOOnuOWasVwiXG5cdF0sXG5cdFtcblx0XHRcIjhkYTFcIixcblx0XHRcIuOog+aPouaPu+aQh+aRmuOpi+aTgOW0leWYoem+n+Oql+aWhuOqveaXv+aZk+OrsuaakuOsouacluOtguaepOaggOOtmOahiuaihOOtsuOtseOtu+akiealg+eJnOalpOamn+amheOuvOanluOvneappeaptOapseaqguOvrOaqmeOvsuaqq+aqtearlOartuaugeavgeavquaxteayquOzi+a0gua0hua0pua2geOzr+a2pOa2sea4lea4mOa4qea6hvCop4Dmurvmu6Lmu5rpvb/mu6jmu6nmvKTmvLTjtYbwo72B5r6B5r6+47Wq47W154a35bKZ47aK54Cs47aR54GQ54GU54Gv54G/54KJ8KCMpeSPgeOXsfCgu5hcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZTQwXCIsXG5cdFx0XCLwo7uX5Z6+8Ka7k+eEvvCln6DjmY7mpqLwqK+p5a2056mJ8KWjofCpk5nnqaXnqb3wpaas56q756qw56uC56uD54eR8KaSjeSHiuermuerneerquSHr+WSsvClsIHnrIvnrZXnrKnwpYyO8KWzvueuouetr+iOnPClrrTwprG/56+Q6JCh566S56648KW0oOO2rfClsaXokpLnr7rnsIbnsLXwpbOB57GE57KD8KSigueypuaZvfCklbjns4nns4fns6bnsbTns7Pns7Xns45cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZWExXCIsXG5cdFx0XCLnuafklJ3wprmE57Wd8Ka7lueSjee2iee2q+eEtee2s+e3kvCkgZfwpoCp57ek47ST57e18KGfuee3pfCoja3nuJ3wpoSh8KaFmue5rue6kuSMq+mRrOe4p+e9gOe9gee9h+ektvCmi5Dpp6Hnvpfwpo2R576j8KGZofCggajklZzwo52m5JSD8KiMuue/uvCmkonogIXogIjogJ3ogKjogK/wqoKH8Kazg+iAu+iAvOiBofCinJTkponwppim8KO3o/Cmm6jmnKXogqfwqKmI6ISH6ISa5aKw8KKbtuaxv/CmkpjwpL645pOn8KGSiuiImPChoZ7mqZPwpKml8KSqleSRuuiIqfCgrI3wpqmS8KO1vuS/ufChk73ok6LojaLwpqyK8KSmp/CjlLDwoZ2z8KO3uOiKquakm/CvppTkh5tcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZjQwXCIsXG5cdFx0XCLolYvoi5DojJrwoLiW8KGetOObgfCjhb3wo5Wa6Im76Iui6IyY8KO6i/CmtqPwpqyF8Kaul/Cjl47jtr/ojJ3ll6zojoXklIvwpral6I6s6I+B6I+T45G+8Ka7lOapl+iVmuOSlvCmuYLworuv6JGY8KWvpOiRseO3k+STpOaqp+iRivCjsrXnpZjokqjwpq6W8Ka5t/CmuYPok57okI/ojpHkkqDokpPok6TwpbKR5ImA8KWzgOSVg+iUtOWrsvCmupnklKfolbPklJbmnr/omJZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmExXCIsXG5cdFx0XCLwqJil8KiYu+iXgfCngojomILwoZaC8KeDjfCvprLklaromKjjmYjwoaKi5Y+38KeOmuiZvuidsfCqg7jon67worCn6J6x6J+a6KCP5Zmh6Jms5qGW5JiP6KGF6KGG8KeXoPCjtrnwp5ek6KGe6KKc5Jmb6KK06KK15o+B6KOF55238Kecj+imh+imiuimpuimqeimp+imvPCoqKXop6fwp6Sk8KeqveiqnOeek+mHvuiqkPCnqZnnq6nwp6y68KO+j+Sck/CnrLjnhbzorIzorJ/wpZCw8KWVpeisv+itjOitjeiqqfCkqbrorpDorpvoqq/woZuf5JiV6KGP6LKb8Ke1lPCnto/wr6eU45yl8Ke1k+izlvCntpjwp7a96LSS6LSD8KGkkOizm+eBnOi0kfCks4nju5DotbdcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MDQwXCIsXG5cdFx0XCLotqnwqICC8KGAlPCkporjrbzwqIa88KeEjOerp+i6rei6tui7g+mLlOi8mei8rfCojaXwqJCS6L6l6YyD8KqKn/CgqZDovrPkpKrwqKee8KiUvfCjtrvlu7jwo4mi6L+58KqAlPComrzwqJSB8KKMpeOmgPCmu5fpgLfwqJS88KeqvumBofColazwqJiL6YKo8Kick+mDhPCom6bpgq7pg73phafjq7Dphqnph4TnsqzwqKSz8KG6iemIjuayn+mJgemJovCllrnpirnwqKuG8KOym/CorIzwpZebXCJcblx0XSxcblx0W1xuXHRcdFwiOTBhMVwiLFxuXHRcdFwi8KC0semMrOmNq/Coq6HwqK+r54KP5auD8KirovCoq6XkpaXpiYTwqK+s8KiwufCor7/pjbPpkZvourzploXplqbpkKbplqDmv7bkirnwopm68KibmPChibzwo7iu5Kef5rCc6Zm76ZqW5IWs6Zqj8Ka7leaHmumatuejtfCoq6Dpmr3lj4zkpqHwprK48KCJtPCmkJDwqYKv8KmDpfCkq5HwoaSV8KOMiumcseiZgumctuSoj+SUveSWhfCkq6nngbXlrYHpnJvpnZzwqYeV6Z2X5a2K8KmHq+mdn+mQpeWDkPCjgrfwo4K86Z6J6Z6f6Z6x6Z6+6Z+A6Z+S6Z+g8KWRrOmfrueQnPCpkLPpn7/pn7XwqZCd8KeluuSrkemgtOmgs+mhi+mhpuOsjvCnhbXjtZHwoJiw8KSFnFwiXG5cdF0sXG5cdFtcblx0XHRcIjkxNDBcIixcblx0XHRcIvClnIbpo4rporfpo4jpo4fkq7/wprSn8KGbk+WWsOmjoemjpumjrOmNuOmkufCkqKnkrbLwqaGX8KmkhemntemojOmou+mokOmpmPClnKXjm4TwqYKx8KmvlemroOmrovCprIXpq7TksI7prJTprK3wqJiA5YC06ay08KamqOOjg/Cjgb3prZDprYDwqbS+5amF8KGho+mujvCkiYvpsILpr7/psIzwqbmo6beU8Km+t/CqhpLwqoar8KqDofCqhKPwqoef6bW+6baD8KqEtOm4juaiiFwiXG5cdF0sXG5cdFtcblx0XHRcIjkxYTFcIixcblx0XHRcIum3hPCihZvwqoaT8KqIoPChpLvwqoiz6bS58KqCufCqirTpupDpupXpup7puqLktLTpuqrpuq/wpI2k6buB462g46el47Sd5Lyy456+8Kiwq+m8gum8iOSulumQpPCmtqLpvJfpvJbpvLnlmp/lmorpvYXpprjwqYKL6Z+y6JG/6b2i6b2p56uc6b6O54iW5K6+8KSltfCkprvnhbfwpKe48KSNiPCkqZHnjp7wqK+a8KGjuuemn/Copb7wqLi26Y2p6Y+z8KiphOmLrOmOgemPi/CopazwpJK554iX47ur552y56mD54OQ8KSRs/Ckj7jnhb7woZ+v54Kj8KGivvCjlpnju4fwoaKF8KWQr/Chn7jjnKLwoZu78KGgueObofChnbTwoaOR8KW9i+Oco/Chm4DlnZvwpKil8KGPvvChiqhcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MjQwXCIsXG5cdFx0XCLwoY+G8KGStuiUg/CjmqbolIPokZXwpKaU8KeFpfCjuLHwpZWc8KO7u/CngZLkk7Two5uu8KmmnfCmvKbmn7njnLPjsJXjt6floazwoaSi5qCQ5IGX8KOcv/Ckg6HwpIKL8KSEj/CmsKHlk4vlmp7wppqx5ZqS8KC/n/CgrqjwoLiN6Y+G8Kisk+mOnOS7uOWEq+OgmfCkkLbkurzwoJGl8KCNv+S9i+S+ivClmZHlqajwoIar8KCPi+OmmfCgjIrwoJCU45C15Lyp8KCLgPCourPwoIm16Kua8KCIjOS6mFwiXG5cdF0sXG5cdFtcblx0XHRcIjkyYTFcIixcblx0XHRcIuWDjeWEjeS+ouS8g/CkqI7wo7qK5L2C5YCu5YGs5YKB5L+M5L+l5YGY5YO85YWZ5YWb5YWd5YWe5rm28KOWlfCjuLnwo7q/5rWy8KGihPCjuonlhqjlh4PwoJeg5JOd8KCSo/CgkpLwoJKR6LW68KiqnPCgnI7liZnliqTwoKGz5Yuh6Y2u5Jm654aM8KSOjPCgsKDwpKas8KGDpOankfCguJ3nkbnju57nkpnnkJTnkZbnjpjkro7wpKq88KSCjeWPkOOWhOeIj/Ckg4nllrTwoI2F5ZON8KCvhuWcnemJnembtOmNpuWfneWejeWdv+OYvuWji+WqmfCoqYbwoZu68KGdr/ChnJDlqKzlprjpio/lqb7lq4/lqJLwpaWG8KGns/ChoaHwpIqV45u15rSF55GD5aih8KW6g1wiXG5cdF0sXG5cdFtcblx0XHRcIjkzNDBcIixcblx0XHRcIuWqgfCor5fwoJCT6Y+g55KM8KGMg+eEheSlsumQiPCop7vpjr3jnqDlsJ7lsp7luZ7luYjwoaaW8KGlvPCjq67lu43lrY/woaSD8KGkhOOcgfChoqDjm53woZu+45uT6ISq8Kiph/Chtrrwo5Gy8KimqOW8jOW8jvChpKfwoZ6r5amr8KGcu+WthOiYlPCnl73ooaDmgb7woqGg8KKYq+W/m+O6uPCilq/wopa+8KmCiPCmvbPmh4DwoIC+8KCBhvCimJvmhpnmhpjmgbXworKb8KK0h/Ckm5TwqYWNXCJcblx0XSxcblx0W1xuXHRcdFwiOTNhMVwiLFxuXHRcdFwi5pGx8KSZpfCirarjqKnwoqyi8KORkPCpo6rworm45oy38KqRm+aStuaMseaPkfCkp6PworWn5oqk8KKyoeaQu+aVq+alsuOvtPCjgo7wo4qt8KSmifCjiqvllI3wo4ug8KGjmfCpkL/mm47wo4qJ8KOGs+OroOSGkPClloTwqKyi8KWWj/Chm7zwpZWb8KWQpeejrvCjhIPwoaCq8KOItOORpPCjiI/wo4aC8KSLieaajvCmtKTmmavkrpPmmLDwp6Gw8KG3q+aZo/Cji5Lwo4uh5pie8KWhsuOjkfCjoLrwo568466Z8KOeovCjj77nk5Djrpbmno/wpJiq5qK25qCe46+E5qq+46Gj8KOflfCkkofmqLPmqZLmq4nmrIXwoaSS5pSR5qKY5qmM46+X5qm65q2X8KO/gPCjsprpjqDpi7LwqK+q8Kiri1wiXG5cdF0sXG5cdFtcblx0XHRcIjk0NDBcIixcblx0XHRcIumKifCogJ7wqKec6ZGn5ral5ryL8KSnrOa1p/Cjvb/jto/muITwpIC85ai95riK5aGH5rSk56GC54S78KSMmvCkibbng7HniZDniofnipTwpJ6P8KScpeWFufCkqqTwoJer55G68KO7uPCjmZ/wpKmK8KSkl/Clv6HjvIbjurHwpKuf8Kiwo/CjvLXmgqfju7Pnk4znkLzpjofnkLfkkp/wpreq5JWR55aD472j8KSzmfCktIbjvZjnlZXnmbPwqpeG46yZ55Go8KirjPCkpqvwpKaO46u7XCJcblx0XSxcblx0W1xuXHRcdFwiOTRhMVwiLFxuXHRcdFwi47eN8KSpjuO7v/Ckp4XwpKOz6Ye65Zyy6Y2C8Kiro/ChoaTlg5/wpYih8KWHp+eduPCjiLLnnI7nnI/nnbvwpJqX8KOegeOpnvCko7DnkLjnkpvjur/wpKq68KSrh+SDiPCkqpbwpoau6YyH8KWWgeegnueijeeiiOejkuePkOelmfCnnYHwpZuj5ISO56ab6JKW56al5qit8KO7uueouuentOSFrvChm6bkhLLpiLXnp7HwoLWM8KSmjPCgipnwo7a68KGdruOWl+WVq+OVsOOaqvCgh5TwoLCN56ui5amZ8KKbtfClqq/wpaqc5aiN8KCJm+ejsOWoqvClr4bnq77kh7nnsZ3nsa3kiJHwpa6z8KW6vPCluqbns43wpKe58KGesOeyjuexvOeyruaqsue3nOe4h+e3k+e9jvCmiaFcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NTQwXCIsXG5cdFx0XCLwpoWc8KetiOe2l/CluoLkiarwpq218KCkluaflvCggY7wo5eP5Z+E8KaQkvCmj7jwpKWi57+d56yn8KCgrPClq6nwpbWD56yM8KW4jumnpuiZhempo+aonPCjkL/jp6LwpKe38KaWremon/CmlqDokoDwp4Sn8KazkeSTquiEt+SQguiDhuiEieiFgvCmnrTpo4PwpqmC6Imi6Iml8KapkeiRk/CmtqfomJDwp4ib5aqG5IW/8KGhgOWsq/ChoqHlq6TwoaOY6Jqg8K+mvPCjto/ooK3wp5Ci5aiCXCJcblx0XSxcblx0W1xuXHRcdFwiOTVhMVwiLFxuXHRcdFwi6KGu5L2F6KKH6KK/6KOm6KWl6KWN8KWag+illPCnnoXwp56E8KivtfCor5nwqK6c8KinueO6reiSo+SbteSbj+OfsuioveionPCpkYjlvY3piKvwpIqE5peU54Sp54OE8KGhhem1reiyn+izqfCnt5zlpprnn4Plp7Dkja7jm5TouKrouqfwpLCJ6Lyw6L2K5Iu05rGY5r678KKMoeSim+a9uea6i/Chn5rpr6njmrXwpKSv6YK76YKX5ZWx5KSG6Ya76ZCE8Kipi+SBovCoq7zpkKfwqLCd8Kiwu+iTpeioq+mWmemWp+mWl+mWlvCotLTnkYXju4LwpKO/8KSpgvCkj6rju6fwo4il6ZqP8Ki7p/CouabwqLml47uM8KSnrfCkqbjwo7+u55CS55Gr47u86Z2B8KmCsFwiXG5cdF0sXG5cdFtcblx0XHRcIjk2NDBcIixcblx0XHRcIuahh+SonfCpgpPwpZ+f6Z2d6Y2o8KimifCosKbwqKyv8KaOvumKuuWskeitqeSkvOePufCkiJvpnpvpnbHppLjwoLym5beB8KivhfCkqrLpoJ/wqZOa6Yu28KmXl+mHpeSTgPCorZDwpKmn8KitpOmjnPCoqYXjvIDpiKrkpKXokJTppLvppY3wp6yG47e96aab5K2v6aaq6amc8KitpfClo4jmqo/pqKHlq77pqK/wqaOx5K6Q8KmliOmmvOSuveSul+mNveWhsvChjILloKLwpKa4XCJcblx0XSxcblx0W1xuXHRcdFwiOTZhMVwiLFxuXHRcdFwi8KGTqOehhPCinJ/wo7a45qOF47W96ZGY46Sn5oWQ8KKegfCipavmhIfpsY/psZPpsbvpsLXpsJDprb/pr4/wqbit6a6f8KqHtfCqg77ptKHksq7wpISE6biY5LKw6bSM8KqGtPCqg63wqoOz8Kmkr+m2peiSvfCmuJLwpr+f8KauguiXvOSUs/CmtqTwprqE8Ka3sOiQoOiXrvCmuIDwo5+X8KaBpOenovCjlpzwo5mA5KSt8KSnnuO1oumPm+mKvumNiPCgir/nornpibfpkY3kv6TjkYDpgaTwpZWd56C956GU56K256GL8KGdl/Cjh4nwpKWB45qa5L2y5r+a5r+Z54Ce54Ce5ZCU8KSGteWeu+Wjs+Weium0luWfl+eEtOOSr/Ckhqznh6vwprGA8KS+l+WsqPChnrXwqKmJXCJcblx0XSxcblx0W1xuXHRcdFwiOTc0MFwiLFxuXHRcdFwi5oSM5auO5aiL5Iq88KSSiOOcrOStu/Cop7zpjrvpjrjwoaOW8KC8neiRsvCms4DwoZCT8KSLuvCisKbwpI+B5aaU8KO2t/CmnYHntqjwpoWb8KaCpPCkprnwpKaL8KinuumLpeePouO7qeeStPCoraPwoaKf47uh8KSqs+armOePs+ePu+O7lvCkqL7wpKqU8KGfmfCkqabwoI6n8KGQpPCkp6XnkYjwpKSW54Kl8KSltumKhOePpumNn/Cgk77pjLHwqKuO8KiolumOhvCor6fwpZeV5KS18KiqgueFq1wiXG5cdF0sXG5cdFtcblx0XHRcIjk3YTFcIixcblx0XHRcIvCkpYPwoLO/5Zqk8KCYmvCgr6vwoLK45ZSC56eE8KGfuue3vvChm4LwpKmQ8KGhkuSUrumQgeOcivCoq4DwpKat5aaw8KGiv/ChooPwp5KE5aqh45ui8KO1m+OasOmJn+WpufCoqoHwoaGi6Y2047ON8KCqtOSqluOmiuWDtOO1qeO1jPChjpznhbXki7vwqIiY5riP8KmDpOSTq+a1l/CnuY/ngafmsq/js5bwo7+t8KO4rea4gua8jOO1r/Cgj7XnlZHjmrzjk4jkmoDju5rkobHlp4Tpia7kpL7ovYHwqLCc8KavgOWgkuWfiOOblvChkZLng77wpI2i8KSpsfCiv6PwoYqw8KKOveaiuealp/Chjpjwo5Ol8KevtPCjm5/wqKqD8KOflvCjj7rwpLKf5qia8KOarfCmsrfokL7kk5/kk45cIlxuXHRdLFxuXHRbXG5cdFx0XCI5ODQwXCIsXG5cdFx0XCLwprSm8Ka1kfCmsoLwpr+e5ryX8KeEieiMvfChnLroj63wprKA8KeBk/Chn5vlponlqoLwoZ6z5amh5amx8KGkhfCkh7zjnK3lp6/woZy845uH54aO6Y6Q5pqa8KSKpeWpruWoq/CkipPmqKvwo7u58KectvCkkZvwpIuK54Sd8KSJmfCop6HkvrDwprSo5bOC8KSTjvCnuY3wpI695qiM8KSJlvChjITngqbnhLPwpI+p47al5rOf8K+gpfCkqY/nuaXlp6vltK/jt7PlvZzwpKmd8KGfn+e2pOiQplwiXG5cdF0sXG5cdFtcblx0XHRcIjk4YTFcIixcblx0XHRcIuWShfCjq7rwo4yA8KCIlOWdvvCgo5XwoJiZ47+l8KG+nvCqirbngIPwqYWb5bWw546P57OT8KipmfCpkKDkv4jnv6fni43njJDwp6u054y454y58KWbtueNgeeNiOO6qfCnrJjpgaznh7XwpKOy54+h6Ie247uK55yM47uR5rKi5Zu955CZ55Ce55Cf47ui47uw47u047u655OT47yO472T55WC55Wt55Wy55aN472855eI55ec47+A55mN47+X55m047+c55m68KS9nOeGiOWYo+imgOWhqeSAneedg+SAueadoeSBheOXm+eemOSBquSBr+Wxnueevuefi+WjsuegmOeCueegnOSCqOegueehh+ehkeehpuiRiPCllLXnpLPmoIPnpLLkhINcIlxuXHRdLFxuXHRbXG5cdFx0XCI5OTQwXCIsXG5cdFx0XCLkhInnppHnppnovrvnqIbovrzkhafnqpHkhrLnqrzoibnkh4Tnq4/nq5vkh4/kuKHnraLnraznrbvnsJLnsJvkiaDkibrnsbvnspzkioznsrjkipTns63ovpPng4DwoLOP57eP57eU57eQ57e9576u576054qf5I6X6ICg6ICl56y56ICu6ICx6IGU47eM5Z6054Kg6IK36IOp5I+t6ISM54yq6ISO6ISS55Wg6ISU5JCB46y56IWW6IWZ6IWaXCJcblx0XSxcblx0W1xuXHRcdFwiOTlhMVwiLFxuXHRcdFwi5JCT5aC66IW86IaE5JCl6IaT5JCt6Ial5Z+v6IeB6Iek6ImU5JKP6Iqm6Im26IuK6IuY6Iu/5JKw6I2X6Zmp5qaK6JCF54O16JGk5oOj6JKI5JSE6JK+6JOh6JO46JSQ6JS46JWS5JS76JWv6JWw6Jeg5JW36Jmy6JqS6Jqy6Juv6ZmF6J6L5JiG5JiX6KKu6KO/6KSk6KWH6KaR8Kelp+ioqeiouOiqlOiqtOixkeizlOizsui0nOSemOWhn+i3g+SfreS7rui4uuWXmOWdlOi5seWXtei6sOSgt+i7jui7oui7pOi7rei7sui+t+i/gei/iui/jOmAs+mnhOSiremjoOmIk+SknumIqOmJmOmJq+mKsemKrumKv1wiXG5cdF0sXG5cdFtcblx0XHRcIjlhNDBcIixcblx0XHRcIumLo+mLq+mLs+mLtOmLvemNg+mOhOmOreSlheSlkem6v+mQl+WMgemQnemQremQvuSlqumRlOmRuemUremWouSmp+mXtOmYs+SnpeaeoOSopOmdgOSotemesumfguWZlOSrpOaDqOmiueSsmemjseWhhOmkjumkmeWGtOmknOmkt+mlgumlnemlouStsOmnheSunemovOmsj+eqg+mtqemugemvnemvsemvtOSxremwoOOdr/Chr4LptYnpsLpcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YWExXCIsXG5cdFx0XCLpu77lmZDptpPptr3pt4Dpt7zpk7bovrbpubvpuqzpurHpur3pu4bpk5zpu6Lpu7Hpu7jnq4jpvYTwoIKU8KCKt/CgjqDmpJrpk4PlpqzwoJOX5aGA6ZOB45658KCXlfCgmJXwoJm28KGauuWdl+eFs/Cgq4LwoKuN8KCuv+WRqvCvoLvwoK+L5ZKe8KCvu/CgsLvwoLGT8KCxpfCgsbzmg6fwoLKN5Zm68KCytfCgs53woLOt8KC1r/CgtrLwoLeI5qWV6bCv6J6l8KC4hPCguI7woLuX8KC+kPCgvK3woLmz5bCg8KC+vOW4i/ChgZzwoYGP8KGBtuacnvChgbvwoYKI8KGCluOZh/Chgr/woYOT8KGEr/ChhLvljaTokq3woYuj8KGNtfChjLboroHwoZW38KGYmfChn4PwoZ+H5Lm454K78KGgrfChpapcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YjQwXCIsXG5cdFx0XCLwoait8KGphfChsKrwobGw8KGyrPChu4jmi4PwobuV8KG8leeGmOahlfCigYXmp6njm4jwoom88KKPl/Cij7rwopyq8KKhsfCipY/oi73woqWn8KKmk/Ciq5XopqXwoquo6L6g8KKsjumeuPCirL/poYfpqr3worGMXCJcblx0XSxcblx0W1xuXHRcdFwiOWI2MlwiLFxuXHRcdFwi8KKyiPCisrfwpa+o8KK0iPCitJLwora38KK2lfCiuYLwor208KK/jPCjgLPwo4Gm8KOMn/Cjj57lvrHmmYjmmr/wp6m58KOVp/Cjl7PniIHwpKa655+X8KOYmvCjnJbnuofwoI2G5aK15pyOXCJcblx0XSxcblx0W1xuXHRcdFwiOWJhMVwiLFxuXHRcdFwi5qSY8KOqp/CnmZfwpb+i8KO4kfCjurnwp5e+8KKCmuSjkOSquPCkhJnwqKqa8KSLrvCkjI3wpIC78KSMtPCkjpbwpKmF8KCXiuWHkvCgmJHlpp/wobqo466+8KOzv/CkkITwpJOW5Z6I8KSZtOOmm/CknK/wqJeo8KmnieOdovCih4PorZ7wqK2O6aeW8KSgkvCko7vwpKiV54iJ8KSrgPCgsbjlpaXwpLql8KS+hvCgnbnou5rwpYCs5YqP5Zy/54Wx8KWKmfClkJnwo72K8KSqp+WWvPClkYbwpZGu8KatkumHlOORs/CllL/wp5iy8KWVnuScmPCllaLwpZWm8KWfh/CkpL/wpaGd5YGm45O78KOPjOaDnvClpIPknbzwqKWI8KWqrvClronwpbCG8KG2kOWeoeeFkea+tvCmhILwp7CS6YGW8KaGsvCkvproraLwppCC8KaRilwiXG5cdF0sXG5cdFtcblx0XHRcIjljNDBcIixcblx0XHRcIuW1m/Cmr7fovLbwppKE8KGknOirqvCkp7bwppKI8KO/r/CmlJLkr4Dwppa/8KaatfCinJvpkaXwpZ+h5oaV5ain8K+jjeS+u+WaufCklKHwppu85Lmq8KSktOmZlua2j/Cmsr3jmJjopbfwpp6Z8KahrvCmkJHwpqGe54ef8Kajh+etgvCpg4DwoKiR8KakpumEhPCmpLnnqYXpt7Dwpqe66aim8KaoreOZn/CmkanwoICh56aD8KaotPCmrZvltKzwo5SZ6I+P8KauneSbkPCmsqTnlLvooaXwprau5aK2XCJcblx0XSxcblx0W1xuXHRcdFwiOWNhMVwiLFxuXHRcdFwi45yc8KKWjfCngYvwp4eN47GU8KeKgPCnioXpioHwooW68KeKi+mMsPCni6bwpKeQ5rC56ZKf8KeRkPCgu7jooKfoo7XwoqSm8KiRs/ChnrHmurjwpKiq8KGgoOOmpOOaueWwkOeno+SUv+aatvCpsq3wqaKk6KWD8KefjPCnoZjlm5bkg5/woZiK46ah8KOcr/Cog6jwoY+F54at6I2m8KennfCphqjlqafksrfwp4Kv8Kimq/Cnp73wp6iK8Kesi/CntabwpIW6562D56W+8KiAiea+tfCqi5/mqIPwqIyY5Y6i8Ka4h+mOv+agtumdnfCoha/wqICj8KamtfChj63wo4iv8KiBiOW2hfCosLDwqIKD5ZyV6aCj8KilieW2q/Ckpojmlr7mp5Xlj5LwpKql8KO+geOwkeactvCogpDwqIO08KiErvChvqHwqIWPXCJcblx0XSxcblx0W1xuXHRcdFwiOWQ0MFwiLFxuXHRcdFwi8KiGifCohq/wqIia8KiMhvCojK/wqI6K45eK8KiRqPComqrko7rmj6bwqKWW56CI6YmV8KimuOSPsvCop6fkj5/wqKeo8KithvCor5Tlp7jwqLCJ6LyL8Ki/hfCpg6znrZHwqYSQ8KmEvOO3t/CphZ7wpKuK6L+Q54qP5ZqL8KmTp/Cpl6nwqZaw8KmWuPCpnLLwqaOR8KmlifCpparwqaeD8KmoqPCprI7wqbWa8Km2m+e6n/Cpu7jwqbyj5LKk6ZWH8KqKk+eGovCqi7/ktpHpgJLwqpeL5Lac8KCynOi+vuWXgVwiXG5cdF0sXG5cdFtcblx0XHRcIjlkYTFcIixcblx0XHRcIui+uvCikrDovrnwpKqT5JSJ57m/5r2W5qqx5Luq45Ok8KisrPCnop3jnLrouoDwoZ+18KiApPCorazwqK6Z8KeovvCmmq/jt6vwp5mV8KOyt/ClmLXwpaWW5Lqa8KW6gfCmiZjlmr/woLmt6LiO5a2t8KO6iPCksp7mj57mi5DwoZ+28KGhu+aUsOWYrfClsYrlkJrwpYyR47eG8Km2mOSxveWYouWYnue9ifClu5jlpbXwo7WA6J2w5Lic8KC/qvCgtYnwo5q66ISX6bWe6LSY55i76bGF55mO55656Y2F5ZCy6IWI6Iu35Zil6ISy6JCY6IK95Zeq56Wi5ZmD5ZCW8KC6neOXjuWYheWXseabsfCoi6LjmK3nlLTll7DllrrlkpfllbLwoLGB8KCyluW7kPClhYjwoLm28KKxolwiXG5cdF0sXG5cdFtcblx0XHRcIjllNDBcIixcblx0XHRcIvCguqLpuqvntZrll57woYG15oqd6Z2t5ZKU6LON54e26YW25o+85o655o++5ZWp8KKtg+mxsvCiurPlhprjk5/woLan5Yan5ZGN5ZSe5ZST55mm6Lit8KaiiueWseiCtuighOiehuijh+iGtuiQnPChg4Hkk6znjITwpJyG5a6Q6IyL8Kaik+WZu/Cim7Twp7Sv8KSGo/CntbPwpruQ8KeKtumFsPChh5npiIjwo7O88KqaqfCguqzwoLu554mm8KGyouSdjvCkv4Lwp7+58KC/q+SDulwiXG5cdF0sXG5cdFtcblx0XHRcIjllYTFcIixcblx0XHRcIumxneaUn/CitqDko7PwpJ+g8Km1vPCgv6zwoLiK5oGi8KeWo/Cgv61cIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZWFkXCIsXG5cdFx0XCLwpoGI8KGGh+eGo+e6jum1kOS4muS4hOOVt+WsjeaysuWNp+OarOOnnOWNveOapfCkmJjloprwpK2u6Iit5ZGL5Z6q8KWqlfCgpblcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZWM1XCIsXG5cdFx0XCLjqZLwopGl54208Km6rOS0iemvrfCjs77wqbyw5LGb8KS+qfCplp7wqb+e6JGc8KO2tvCnirLwpp6z8KOcoOaMrue0pfCju7fwo7is46iq6YCI5YuM47m045m65Jep8KCSjueZgOWrsPCgurbnobrwp7yu5aKn5IK/5Zm86a6L5bW055mU8KqQtOm6heSzoeeXueOfu+aEmfCjg5rwpI+yXCJcblx0XSxcblx0W1xuXHRcdFwiOWVmNVwiLFxuXHRcdFwi5Zmd8KGKqeWep/CkpaPwqbiG5Yi08KeCruOWreaxium1vFwiXG5cdF0sXG5cdFtcblx0XHRcIjlmNDBcIixcblx0XHRcIuexlumsueWfnvChnazlsZPmk5PwqZOQ8KaMtfCnhaTomq3woLSo8Ka0ovCkq6LwoLWxXCJcblx0XSxcblx0W1xuXHRcdFwiOWY0ZlwiLFxuXHRcdFwi5Ye+8KG8j+W2jumcg/Cht5HpuoHpgYznrJ/prILls5HnrqPmiajmjLXpq7/nr4/prKrnsb7prK7nsYLnsobpsJXnr7zprInpvJfpsJvwpKS+6b2a5ZWz5a+D5L+96bqY5L+y5Ymg47iG5YuR5Z2n5YGW5aa35biS6Z+I6bar6L2c5ZGp6Z606aWA6Z665Yys5oSwXCJcblx0XSxcblx0W1xuXHRcdFwiOWZhMVwiLFxuXHRcdFwi5qSs5Y+a6bCK6bSC5LC76ZmB5qaA5YKm55WG8KGdremnmuWJs1wiXG5cdF0sXG5cdFtcblx0XHRcIjlmYWVcIixcblx0XHRcIumFmemagemFnFwiXG5cdF0sXG5cdFtcblx0XHRcIjlmYjJcIixcblx0XHRcIumFkfCoupfmjb/wprSj5quK5ZiR6YaO55W65oqF8KCPvOeNj+exsPClsKHwo7O9XCJcblx0XSxcblx0W1xuXHRcdFwiOWZjMVwiLFxuXHRcdFwi8KSkmeeblumuneS4qvCgs5Tojr7ooYJcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZmM5XCIsXG5cdFx0XCLlsYrmp4Dlg63lnbrliJ/lt7Xku47msLHwoIey5Ly55ZKc5ZOa5Yqa6LaC45e+5byM45ezXCJcblx0XSxcblx0W1xuXHRcdFwiOWZkYlwiLFxuXHRcdFwi5q2S6YW86b6l6a6X6aCu6aK06aq66bqo6bqE54W656yUXCJcblx0XSxcblx0W1xuXHRcdFwiOWZlN1wiLFxuXHRcdFwi5q+66KCY5724XCJcblx0XSxcblx0W1xuXHRcdFwiOWZlYlwiLFxuXHRcdFwi5Zig8KqZiui5t+m9k1wiXG5cdF0sXG5cdFtcblx0XHRcIjlmZjBcIixcblx0XHRcIui3lOi5j+m4nOi4geaKgvCojb3ouKjoubXnq5PwpKm356i+56OY5rOq6Kmn55iHXCJcblx0XSxcblx0W1xuXHRcdFwiYTA0MFwiLFxuXHRcdFwi8Kipmum8puazjuiflueXg/CqirLnoZPwr6GA6LSM54ui542x6Kyt54yC55Ox6LOr8KSqu+iYr+W+uuiioOSSt1wiXG5cdF0sXG5cdFtcblx0XHRcImEwNTVcIixcblx0XHRcIvChoLvwpriFXCJcblx0XSxcblx0W1xuXHRcdFwiYTA1OFwiLFxuXHRcdFwi6Km+8KKUm1wiXG5cdF0sXG5cdFtcblx0XHRcImEwNWJcIixcblx0XHRcIuaDveeZp+mrl+m1hOmNrumuj+iftVwiXG5cdF0sXG5cdFtcblx0XHRcImEwNjNcIixcblx0XHRcIuigj+izt+eMrOmcoemusOOXlueKsuSwh+exkemlivCmhZnmhZnksITpupbmhb1cIlxuXHRdLFxuXHRbXG5cdFx0XCJhMDczXCIsXG5cdFx0XCLlnZ/mha/miqbmiLnmi47jqZzmh6Lljqrwo4+15o2k5qCC45eSXCJcblx0XSxcblx0W1xuXHRcdFwiYTBhMVwiLFxuXHRcdFwi5bWX8Kivgui/mvCouLlcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMGE2XCIsXG5cdFx0XCLlg5nwobWG56SG5Yyy6Zi48KC8u+SBpVwiXG5cdF0sXG5cdFtcblx0XHRcImEwYWVcIixcblx0XHRcIuefvlwiXG5cdF0sXG5cdFtcblx0XHRcImEwYjBcIixcblx0XHRcIuezgvClvJrns5rnqK3ogabogaPntY3nlIXnk7LoppToiJrmnIzogaLwp5KG6IGb55Ow6ISD55yk6KaJ8KafjOeVk/Cmu5Honqnon47oh4jonozoqYnosq3orYPnnKvnk7jok5rjmLXmprLotqZcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMGQ0XCIsXG5cdFx0XCLopqnnkajmtrnon4HwpICR55On47eb54W25oKk5oac47OR54Wi5oG3XCJcblx0XSxcblx0W1xuXHRcdFwiYTBlMlwiLFxuXHRcdFwi572x8KisreeJkOaDqeStvuWIoOOwmPCjs4fwpbuX8KeZlvCllLHwoaWE8KGLvvCppIPwprec8KeCreWzgfCmhq3wqKiP8KOZt/Cgg67wpqGG8KS8juSVouWsn/CmjYzpvZDpuqbwpomrXCJcblx0XSxcblx0W1xuXHRcdFwiYTNjMFwiLFxuXHRcdFwi4pCAXCIsXG5cdFx0MzEsXG5cdFx0XCLikKFcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNmExXCIsXG5cdFx0XCLikaBcIixcblx0XHQ5LFxuXHRcdFwi4pG0XCIsXG5cdFx0OSxcblx0XHRcIuKFsFwiLFxuXHRcdDksXG5cdFx0XCLkuLbkuL/kuoXkuqDlhoLlhpblhqvli7nljLjljanljrblpIrlroDlt5vivLPlub/lu7TlvZDlvaHmlLTml6DnlpLnmbbovrXpmrbCqMuG44O944O+44Kd44Ke44CD5Lud44CF44CG44CH44O877y777y94py944GBXCIsXG5cdFx0MjNcblx0XSxcblx0W1xuXHRcdFwiYzc0MFwiLFxuXHRcdFwi44GZXCIsXG5cdFx0NTgsXG5cdFx0XCLjgqHjgqLjgqPjgqRcIlxuXHRdLFxuXHRbXG5cdFx0XCJjN2ExXCIsXG5cdFx0XCLjgqVcIixcblx0XHQ4MSxcblx0XHRcItCQXCIsXG5cdFx0NSxcblx0XHRcItCB0JZcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImM4NDBcIixcblx0XHRcItCbXCIsXG5cdFx0MjYsXG5cdFx0XCLRkdC2XCIsXG5cdFx0MjUsXG5cdFx0XCLih6fihrjihrnjh4/woIOM5Lma8KCCiuWIguSSkVwiXG5cdF0sXG5cdFtcblx0XHRcImM4YTFcIixcblx0XHRcIum+sOWGiOm+sfCnmIdcIlxuXHRdLFxuXHRbXG5cdFx0XCJjOGNkXCIsXG5cdFx0XCLvv6Lvv6TvvIfvvILjiLHihJbihKHjgpvjgpziuoDiuoTiuobiuofiuojiuoriuoziuo3iupXiupziup3iuqXiuqfiuqriuqziuq7iurbiurziur7iu4biu4riu4ziu43iu4/iu5biu5fiu57iu6NcIlxuXHRdLFxuXHRbXG5cdFx0XCJjOGY1XCIsXG5cdFx0XCLKg8mQyZvJlMm1xZPDuMWLyorJqlwiXG5cdF0sXG5cdFtcblx0XHRcImY5ZmVcIixcblx0XHRcIu+/rVwiXG5cdF0sXG5cdFtcblx0XHRcImZhNDBcIixcblx0XHRcIvCglYfpi5vwoJef8KO/heiVjOSKteePr+WGteOZifCkpYLwqKek6Y2E8KGnm+iLrvCjs4jnoLzmnYTmi5/wpKSz8KimqvCgiqDwpq6z8KGMheS+q/Cik63lgIjwprSp8KeqhPCjmIDwpKqx8KKUk+WAqfCgjb7lvqTwoI6A8KCNh+a7m/CgkJ/lgb3lhIHjkbrlhI7poazjnYPokJbwpKak8KCSh+WFoPCjjrTlharwoK+/8KKDvPCgi6XwopSw8KCWjvCjiLPwoaaD5a6C6J298KCWs/CjspnlhrLlhrhcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYWExXCIsXG5cdFx0XCLptLTlh4nlh4/lh5Hjs5zlh5PwpKqm5Yaz5Yei5Y2C5Yet6I+N5qS+8KOcreW9u+WIi+WIpuWIvOWKteWJl+WKlOWKueWLheewleiVguWLoOiYjfCmrJPljIXwqKue5ZWJ5ruZ8KO+gPCgpZTwo7+s5Yyz5Y2E8KCvouazi/ChnKbmoJvnj5XmgYrjuqrjo4zwoZuo54ed5JKi5Y2t5Y208Kiaq+WNvuWNv/ChlpbwoZiT55+m5Y6T8Kiqm+WOoOWOq+WOrueOp/ClnbLjvZnnjpzlj4Hlj4XmsYnkuYnln77lj5njqqvwoK6P5Y+g8KO/q/CitqPlj7bwoLG35ZCT54G55ZSr5pmX5rWb5ZGt8Katk/CgtbTllZ3lko/lkqTknqbwoZyN8KC7neO2tPCgtY1cIlxuXHRdLFxuXHRbXG5cdFx0XCJmYjQwXCIsXG5cdFx0XCLwqKa88KKamOWVh+SzreWQr+eQl+WWhuWWqeWYhfCho5fwpIC65JWS8KSQteaas/ChgrTlmLfmm43wo4qK5pqk5pqt5ZmN5ZmP56Ox5Zux6Z6H5Y++5ZyA5Zuv5Zut8KitpuOYo/ChiY/lnYbwpIal5rGu54KL5Z2C45qx8KaxvuWfpvChkJbloIPwoZGU8KSNo+WgpvCkr7XloZzloqrjlaHlo6Dlo5zwoYi85aO75a+/5Z2D8KqFkPCkibjpj5PjlqHlpJ/moqbjm4PmuZlcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYmExXCIsXG5cdFx0XCLwoZi+5aik5ZWT8KGakuiUheWnifCgtY7wprKB8Ka0qvChn5zlp5nwoZ+78KGesvCmtqbmtbHwoaCo8KGbleWnufCmuYXlqqvlqaPjm6bwpKap5am345yI5aqW55Gl5auT8Ka+ofCilZTjtoXwoaSR45yy8KGauOW6g+WLkOWttuaWiOWtvPCnqI7kgITkoZ3woIiE5a+V5oWg8KGotPClp4zwoJal5a+z5a6d5LSQ5bCF8KGthOWwk+ePjuWwlPChsqXwpqyo5bGJ5KOd5bKF5bOp5bOv5baL8KG3ufChuLfltJDltJjltYbwobqk5bK65beX6Iu846Ct8KSkgfCigYnwooWz6IqH46C246+C5biu5qqK5bm15bm68KSSvPCgs5Pljqbkurflu5DljqjwoZ2x5biJ5bu08KiSglwiXG5cdF0sXG5cdFtcblx0XHRcImZjNDBcIixcblx0XHRcIuW7ueW7u+OioOW7vOagvumQm+W8jfCgh4Hwr6KU46ue5KKu8KGMuuW8uvCmoojwoo+Q5b2Y8KKRseW9o+mevfCmua7lvbLpjYDwqKi25b6n5ba247Wf8KWJkPChvarwp4O48KKZqOmHlvCgip7wqKip5oCx5pqF8KGht+Olo+O3h+OYueWekPCinrTnpbHjuYDmgp7mgqTmgrPwpKaC8KSmj/CnqZPnkqTlg6HlqqDmhaTokKTmhYLwr6Km8Ka7kuaGgeWHtPCgmZbmhoflrqrwo763XCJcblx0XSxcblx0W1xuXHRcdFwiZmNhMVwiLFxuXHRcdFwi8KKhn+aHk/Corp3wqaWd5oeQ46Sy8KKmgPCio4HmgKPmhZzmlJ7mjovwoISY5ouF8KGdsOaLlfCiuI3mjazwpKef46iX5pC45o+48KGOjvChn7zmkpDmvorwori26aCU8KSCjPClnJ3mk6Hmk6XpkbvjqabmkLrjqZfmlY3mvJbwpKio8KSoo+aWheaVreaVn/Cjgb7mlrXwpKWA5Ky35peR5IOY8KGgqeaXoOaXo+W/n/CjkIDmmJjwo4e38KOHuOaZhPCjhqTwo4al5pmL8KC5teaZp/Clh6bmmbPmmbTwobi98KOIsfCol7Two4eI8KWMk+efhfCio7fppqTmnILwpI6c8KSooeOsq+anuvCjn4LmnZ7mnafmnaLwpIeN8KmDreafl+STqeagoua5kOmIvOaggfCjj6bwprag5qGdXCJcblx0XSxcblx0W1xuXHRcdFwiZmQ0MFwiLFxuXHRcdFwi8KORr+anoeaoi/Coq5/mpbPmo4Pwo5eN5qSB5qSA47Sy46iB8KOYvOOugOaerOalofCoqYrki7zmpLbmppjjrqHwoI+J6I2j5YKQ5qe58KOZmfCihKrmqYXwo5yD5qqd46+z5p6x5quI8KmGnOOwjeasnfCgpKPmg57mrLXmrbTwop+N5rq18KOrm/CgjrXwoaWY452A5ZCh8KOtmuavofCju7zmr5zmsLfwopKL8KSjsfCmrZHmsZroiKbmsbnwo7a85JOF8KO2vfCkhqTwpKSM8KSkgFwiXG5cdF0sXG5cdFtcblx0XHRcImZkYTFcIixcblx0XHRcIvCjs4njm6Xjs6vwoLSy6a6D8KOHufCikpHnvo/moLfwprSl8Ka2ofCmt6vmtpbmtZzmubzmvITwpKW/8KSChfCmubLolLPwpr205YeH5rKc5rid6JCu8Kisoea4r/CjuK/nkZPwo76C56eM5rmP5aqR8KOBi+a/uOOcjea+nfCjuLDmu7rwoZKX8KSAveSVlemPsOa9hOa9nOO1jua9tPCphbDjtLvmvp/wpIWE5r+T8KSCkfCkhZXwpIC58KO/sPCjvrTwpIS/5Yef8KSFlvCkhZfwpIWA8KaHneeBi+eBvueCp+eCgeeDjOeDleeDlueDn+SEhOO3qOeGtOeGlvCkibfnhKvnhYXlqojnhYrnha7lspzwpI2l54WP6Y2i8KSLgeeErPCkkZrwpKin8KSooueGuvCor6jngr3niI5cIlxuXHRdLFxuXHRbXG5cdFx0XCJmZTQwXCIsXG5cdFx0XCLpkYLniJXlpJHpkYPniKTpjYHwpZiF54iu54mA8KSltOaiveeJleeJl+O5lfCjgYTmoI3mvL3nioLnjKrnjKvwpKCj8Kigq+SjrfCooITnjKjnjK7nj4/njqrwoLC68KaoruePieeRifCkh6LwoZun8KSopOaYo+ObhfCkprfwpKaN8KSnu+ePt+eQleakg/CkqKbnkLnwoJeD47uX55Gc8KKireeRoPCourLnkYfnj6TnkbbojrnnkazjnLDnkbTpj7HmqKznkoLkpZPwpKqMXCJcblx0XSxcblx0W1xuXHRcdFwiZmVhMVwiLFxuXHRcdFwi8KSFn/CkqbnwqK6P5a2G8Kiwg/Chop7nk4jwoaaI55SO55Op55Se8Ki7mfChqYvlr5fwqLqs6Y6F55WN55WK55Wn55Wu8KS+guO8hPCktJPnlo7nkZ3nlp7nlrTnmILnmKznmZHnmY/nma/nmbbwpo+155qQ6Iev45+48KakkfCmpI7nmqHnmqXnmrfnm4zwpr6f6JGi8KWCnfClhb3wobic55ye55ym552A5pKv8KWIoOedmPCjiqznnq/wqKWk8KilqPChm4Hnn7TnoInwoY228KSokuajiueir+ejh+ejk+mapeekrvCll6Dno5fnpLTnorHwp5iM6L646KKE8Kisq/CmgoPwopic56aG6KSA5qSC56aA8KWhl+emnfCnrLnnpLznpqnmuKrwp4Sm47qo56eG8KmEjeenlFwiXG5cdF1cbl07XG5cbnZhciBiaWc1QWRkZWQkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnZGVmYXVsdCc6IGJpZzVBZGRlZFxufSk7XG5cbnZhciByZXF1aXJlJCQwID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShzaGlmdGppcyQxKTtcblxudmFyIHJlcXVpcmUkJDEgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKGV1Y2pwJDEpO1xuXG52YXIgcmVxdWlyZSQkMiA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoY3A5MzYkMSk7XG5cbnZhciByZXF1aXJlJCQzJDEgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKGdia0FkZGVkJDEpO1xuXG52YXIgcmVxdWlyZSQkNCA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoZ2IxODAzMFJhbmdlcyQxKTtcblxudmFyIHJlcXVpcmUkJDUgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKGNwOTQ5JDEpO1xuXG52YXIgcmVxdWlyZSQkNiA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoY3A5NTAkMSk7XG5cbnZhciByZXF1aXJlJCQ3ID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShiaWc1QWRkZWQkMSk7XG5cbi8vIFRhYmxlcyBhcmUgbm90IHJlcXVpcmUoKS1kIHVudGlsIHRoZXkgYXJlIG5lZWRlZCB0byBzcGVlZCB1cCBsaWJyYXJ5IGxvYWQuXG4vLyByZXF1aXJlKCktcyBhcmUgZGlyZWN0IHRvIHN1cHBvcnQgQnJvd3NlcmlmeS5cblxuXG52YXIgZGJjc0RhdGEgPSB7XG4gIC8vID09IEphcGFuZXNlL1NoaWZ0SklTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWxsIGphcGFuZXNlIGVuY29kaW5ncyBhcmUgYmFzZWQgb24gSklTIFggc2V0IG9mIHN0YW5kYXJkczpcbiAgLy8gSklTIFggMDIwMSAtIFNpbmdsZS1ieXRlIGVuY29kaW5nIG9mIEFTQ0lJICsgwqUgKyBLYW5hIGNoYXJzIGF0IDB4QTEtMHhERi5cbiAgLy8gSklTIFggMDIwOCAtIE1haW4gc2V0IG9mIDY4NzkgY2hhcmFjdGVycywgcGxhY2VkIGluIDk0eDk0IHBsYW5lLCB0byBiZSBlbmNvZGVkIGJ5IDIgYnl0ZXMuIFxuICAvLyAgICAgICAgICAgICAgSGFzIHNldmVyYWwgdmFyaWF0aW9ucyBpbiAxOTc4LCAxOTgzLCAxOTkwIGFuZCAxOTk3LlxuICAvLyBKSVMgWCAwMjEyIC0gU3VwcGxlbWVudGFyeSBwbGFuZSBvZiA2MDY3IGNoYXJzIGluIDk0eDk0IHBsYW5lLiAxOTkwLiBFZmZlY3RpdmVseSBkZWFkLlxuICAvLyBKSVMgWCAwMjEzIC0gRXh0ZW5zaW9uIGFuZCBtb2Rlcm4gcmVwbGFjZW1lbnQgb2YgMDIwOCBhbmQgMDIxMi4gVG90YWwgY2hhcnM6IDExMjMzLlxuICAvLyAgICAgICAgICAgICAgMiBwbGFuZXMsIGZpcnN0IGlzIHN1cGVyc2V0IG9mIDAyMDgsIHNlY29uZCAtIHJldmlzZWQgMDIxMi5cbiAgLy8gICAgICAgICAgICAgIEludHJvZHVjZWQgaW4gMjAwMCwgcmV2aXNlZCAyMDA0LiBTb21lIGNoYXJhY3RlcnMgYXJlIGluIFVuaWNvZGUgUGxhbmUgMiAoMHgyeHh4eClcbiAgLy8gQnl0ZSBlbmNvZGluZ3MgYXJlOlxuICAvLyAgKiBTaGlmdF9KSVM6IENvbXBhdGlibGUgd2l0aCAwMjAxLCB1c2VzIG5vdCBkZWZpbmVkIGNoYXJzIGluIHRvcCBoYWxmIGFzIGxlYWQgYnl0ZXMgZm9yIGRvdWJsZS1ieXRlXG4gIC8vICAgICAgICAgICAgICAgZW5jb2Rpbmcgb2YgMDIwOC4gTGVhZCBieXRlIHJhbmdlczogMHg4MS0weDlGLCAweEUwLTB4RUY7IFRyYWlsIGJ5dGUgcmFuZ2VzOiAweDQwLTB4N0UsIDB4ODAtMHg5RSwgMHg5Ri0weEZDLlxuICAvLyAgICAgICAgICAgICAgIFdpbmRvd3MgQ1A5MzIgaXMgYSBzdXBlcnNldCBvZiBTaGlmdF9KSVMuIFNvbWUgY29tcGFuaWVzIGFkZGVkIG1vcmUgY2hhcnMsIG5vdGFibHkgS0RESS5cbiAgLy8gICogRVVDLUpQOiAgICBVcCB0byAzIGJ5dGVzIHBlciBjaGFyYWN0ZXIuIFVzZWQgbW9zdGx5IG9uICpuaXhlcy5cbiAgLy8gICAgICAgICAgICAgICAweDAwLTB4N0YgICAgICAgLSBsb3dlciBwYXJ0IG9mIDAyMDFcbiAgLy8gICAgICAgICAgICAgICAweDhFLCAweEExLTB4REYgLSB1cHBlciBwYXJ0IG9mIDAyMDFcbiAgLy8gICAgICAgICAgICAgICAoMHhBMS0weEZFKXgyICAgLSAwMjA4IHBsYW5lICg5NHg5NCkuXG4gIC8vICAgICAgICAgICAgICAgMHg4RiwgKDB4QTEtMHhGRSl4MiAtIDAyMTIgcGxhbmUgKDk0eDk0KS5cbiAgLy8gICogSklTIFggMjA4OiA3LWJpdCwgZGlyZWN0IGVuY29kaW5nIG9mIDAyMDguIEJ5dGUgcmFuZ2VzOiAweDIxLTB4N0UgKDk0IHZhbHVlcykuIFVuY29tbW9uLlxuICAvLyAgICAgICAgICAgICAgIFVzZWQgYXMtaXMgaW4gSVNPMjAyMiBmYW1pbHkuXG4gIC8vICAqIElTTzIwMjItSlA6IFN0YXRlZnVsIGVuY29kaW5nLCB3aXRoIGVzY2FwZSBzZXF1ZW5jZXMgdG8gc3dpdGNoIGJldHdlZW4gQVNDSUksIFxuICAvLyAgICAgICAgICAgICAgICAwMjAxLTE5NzYgUm9tYW4sIDAyMDgtMTk3OCwgMDIwOC0xOTgzLlxuICAvLyAgKiBJU08yMDIyLUpQLTE6IEFkZHMgZXNjIHNlcSBmb3IgMDIxMi0xOTkwLlxuICAvLyAgKiBJU08yMDIyLUpQLTI6IEFkZHMgZXNjIHNlcSBmb3IgR0IyMzEzLTE5ODAsIEtTWDEwMDEtMTk5MiwgSVNPODg1OS0xLCBJU084ODU5LTcuXG4gIC8vICAqIElTTzIwMjItSlAtMzogQWRkcyBlc2Mgc2VxIGZvciAwMjAxLTE5NzYgS2FuYSBzZXQsIDAyMTMtMjAwMCBQbGFuZXMgMSwgMi5cbiAgLy8gICogSVNPMjAyMi1KUC0yMDA0OiBBZGRzIDAyMTMtMjAwNCBQbGFuZSAxLlxuICAvL1xuICAvLyBBZnRlciBKSVMgWCAwMjEzIGFwcGVhcmVkLCBTaGlmdF9KSVMtMjAwNCwgRVVDLUpJU1gwMjEzIGFuZCBJU08yMDIyLUpQLTIwMDQgZm9sbG93ZWQsIHdpdGgganVzdCBjaGFuZ2luZyB0aGUgcGxhbmVzLlxuICAvL1xuICAvLyBPdmVyYWxsLCBpdCBzZWVtcyB0aGF0IGl0J3MgYSBtZXNzIDooIGh0dHA6Ly93d3c4LnBsYWxhLm9yLmpwL3RrdWJvdGExL3VuaWNvZGUtc3ltYm9scy1tYXAyLmh0bWxcbiAgJ3NoaWZ0amlzJzoge1xuICAgIHR5cGU6ICdfZGJjcycsXG4gICAgdGFibGU6IGZ1bmN0aW9uIHRhYmxlKCkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUkJDA7XG4gICAgfSxcbiAgICBlbmNvZGVBZGQ6IHtcbiAgICAgIFwiXFx4QTVcIjogMHg1QyxcbiAgICAgIFwiXFx1MjAzRVwiOiAweDdFXG4gICAgfSxcbiAgICBlbmNvZGVTa2lwVmFsczogW3tcbiAgICAgIGZyb206IDB4RUQ0MCxcbiAgICAgIHRvOiAweEY5NDBcbiAgICB9XVxuICB9LFxuICAnY3NzaGlmdGppcyc6ICdzaGlmdGppcycsXG4gICdtc2thbmppJzogJ3NoaWZ0amlzJyxcbiAgJ3NqaXMnOiAnc2hpZnRqaXMnLFxuICAnd2luZG93czMxaic6ICdzaGlmdGppcycsXG4gICdtczMxaic6ICdzaGlmdGppcycsXG4gICd4c2ppcyc6ICdzaGlmdGppcycsXG4gICd3aW5kb3dzOTMyJzogJ3NoaWZ0amlzJyxcbiAgJ21zOTMyJzogJ3NoaWZ0amlzJyxcbiAgJzkzMic6ICdzaGlmdGppcycsXG4gICdjcDkzMic6ICdzaGlmdGppcycsXG4gICdldWNqcCc6IHtcbiAgICB0eXBlOiAnX2RiY3MnLFxuICAgIHRhYmxlOiBmdW5jdGlvbiB0YWJsZSgpIHtcbiAgICAgIHJldHVybiByZXF1aXJlJCQxO1xuICAgIH0sXG4gICAgZW5jb2RlQWRkOiB7XG4gICAgICBcIlxceEE1XCI6IDB4NUMsXG4gICAgICBcIlxcdTIwM0VcIjogMHg3RVxuICAgIH1cbiAgfSxcbiAgLy8gVE9ETzogS0RESSBleHRlbnNpb24gdG8gU2hpZnRfSklTXG4gIC8vIFRPRE86IElCTSBDQ1NJRCA5NDIgPSBDUDkzMiwgYnV0IEYwLUY5IGN1c3RvbSBjaGFycyBhbmQgb3RoZXIgY2hhciBjaGFuZ2VzLlxuICAvLyBUT0RPOiBJQk0gQ0NTSUQgOTQzID0gU2hpZnRfSklTID0gQ1A5MzIgd2l0aCBvcmlnaW5hbCBTaGlmdF9KSVMgbG93ZXIgMTI4IGNoYXJzLlxuICAvLyA9PSBDaGluZXNlL0dCSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR0JLXG4gIC8vIFdlIG1vc3RseSBpbXBsZW1lbnQgVzNDIHJlY29tbWVuZGF0aW9uOiBodHRwczovL3d3dy53My5vcmcvVFIvZW5jb2RpbmcvI2diay1lbmNvZGVyXG4gIC8vIE9sZGVzdCBHQjIzMTIgKDE5ODEsIH43NjAwIGNoYXJzKSBpcyBhIHN1YnNldCBvZiBDUDkzNlxuICAnZ2IyMzEyJzogJ2NwOTM2JyxcbiAgJ2diMjMxMjgwJzogJ2NwOTM2JyxcbiAgJ2diMjMxMjE5ODAnOiAnY3A5MzYnLFxuICAnY3NnYjIzMTInOiAnY3A5MzYnLFxuICAnY3Npc281OGdiMjMxMjgwJzogJ2NwOTM2JyxcbiAgJ2V1Y2NuJzogJ2NwOTM2JyxcbiAgLy8gTWljcm9zb2Z0J3MgQ1A5MzYgaXMgYSBzdWJzZXQgYW5kIGFwcHJveGltYXRpb24gb2YgR0JLLlxuICAnd2luZG93czkzNic6ICdjcDkzNicsXG4gICdtczkzNic6ICdjcDkzNicsXG4gICc5MzYnOiAnY3A5MzYnLFxuICAnY3A5MzYnOiB7XG4gICAgdHlwZTogJ19kYmNzJyxcbiAgICB0YWJsZTogZnVuY3Rpb24gdGFibGUoKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZSQkMjtcbiAgICB9XG4gIH0sXG4gIC8vIEdCSyAofjIyMDAwIGNoYXJzKSBpcyBhbiBleHRlbnNpb24gb2YgQ1A5MzYgdGhhdCBhZGRlZCB1c2VyLW1hcHBlZCBjaGFycyBhbmQgc29tZSBvdGhlci5cbiAgJ2diayc6IHtcbiAgICB0eXBlOiAnX2RiY3MnLFxuICAgIHRhYmxlOiBmdW5jdGlvbiB0YWJsZSgpIHtcbiAgICAgIHJldHVybiByZXF1aXJlJCQyLmNvbmNhdChyZXF1aXJlJCQzJDEpO1xuICAgIH1cbiAgfSxcbiAgJ3hnYmsnOiAnZ2JrJyxcbiAgJ2lzb2lyNTgnOiAnZ2JrJyxcbiAgLy8gR0IxODAzMCBpcyBhbiBhbGdvcml0aG1pYyBleHRlbnNpb24gb2YgR0JLLlxuICAvLyBNYWluIHNvdXJjZTogaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY29kaW5nLyNnYmstZW5jb2RlclxuICAvLyBodHRwOi8vaWN1LXByb2plY3Qub3JnL2RvY3MvcGFwZXJzL2diMTgwMzAuaHRtbFxuICAvLyBodHRwOi8vc291cmNlLmljdS1wcm9qZWN0Lm9yZy9yZXBvcy9pY3UvZGF0YS90cnVuay9jaGFyc2V0L2RhdGEveG1sL2diLTE4MDMwLTIwMDAueG1sXG4gIC8vIGh0dHA6Ly93d3cua2huZ2FpLmNvbS9jaGluZXNlL2NoYXJtYXAvdGJsZ2JrLnBocD9wYWdlPTBcbiAgJ2diMTgwMzAnOiB7XG4gICAgdHlwZTogJ19kYmNzJyxcbiAgICB0YWJsZTogZnVuY3Rpb24gdGFibGUoKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZSQkMi5jb25jYXQocmVxdWlyZSQkMyQxKTtcbiAgICB9LFxuICAgIGdiMTgwMzA6IGZ1bmN0aW9uIGdiMTgwMzAoKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZSQkNDtcbiAgICB9LFxuICAgIGVuY29kZVNraXBWYWxzOiBbMHg4MF0sXG4gICAgZW5jb2RlQWRkOiB7XG4gICAgICAn4oKsJzogMHhBMkUzXG4gICAgfVxuICB9LFxuICAnY2hpbmVzZSc6ICdnYjE4MDMwJyxcbiAgLy8gPT0gS29yZWFuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFVUMtS1IsIEtTX0NfNTYwMSBhbmQgS1MgWCAxMDAxIGFyZSBleGFjdGx5IHRoZSBzYW1lLlxuICAnd2luZG93czk0OSc6ICdjcDk0OScsXG4gICdtczk0OSc6ICdjcDk0OScsXG4gICc5NDknOiAnY3A5NDknLFxuICAnY3A5NDknOiB7XG4gICAgdHlwZTogJ19kYmNzJyxcbiAgICB0YWJsZTogZnVuY3Rpb24gdGFibGUoKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZSQkNTtcbiAgICB9XG4gIH0sXG4gICdjc2V1Y2tyJzogJ2NwOTQ5JyxcbiAgJ2Nza3NjNTYwMTE5ODcnOiAnY3A5NDknLFxuICAnZXVja3InOiAnY3A5NDknLFxuICAnaXNvaXIxNDknOiAnY3A5NDknLFxuICAna29yZWFuJzogJ2NwOTQ5JyxcbiAgJ2tzYzU2MDExOTg3JzogJ2NwOTQ5JyxcbiAgJ2tzYzU2MDExOTg5JzogJ2NwOTQ5JyxcbiAgJ2tzYzU2MDEnOiAnY3A5NDknLFxuICAvLyA9PSBCaWc1L1RhaXdhbi9Ib25nIEtvbmcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRoZXJlIGFyZSBsb3RzIG9mIHRhYmxlcyBmb3IgQmlnNSBhbmQgY3A5NTAuIFBsZWFzZSBzZWUgdGhlIGZvbGxvd2luZyBsaW5rcyBmb3IgaGlzdG9yeTpcbiAgLy8gaHR0cDovL21venR3Lm9yZy9kb2NzL2JpZzUvICBodHRwOi8vd3d3LmhhaWJsZS5kZS9icnVuby9jaGFyc2V0cy9jb252ZXJzaW9uLXRhYmxlcy9CaWc1Lmh0bWxcbiAgLy8gVmFyaWF0aW9ucywgaW4gcm91Z2hseSBudW1iZXIgb2YgZGVmaW5lZCBjaGFyczpcbiAgLy8gICogV2luZG93cyBDUCA5NTA6IE1pY3Jvc29mdCB2YXJpYW50IG9mIEJpZzUuIENhbm9uaWNhbDogaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDk1MC5UWFRcbiAgLy8gICogV2luZG93cyBDUCA5NTE6IE1pY3Jvc29mdCB2YXJpYW50IG9mIEJpZzUtSEtTQ1MtMjAwMS4gU2VlbXMgdG8gYmUgbmV2ZXIgcHVibGljLiBodHRwOi8vbWUuYWJlbGNoZXVuZy5vcmcvYXJ0aWNsZXMvcmVzZWFyY2gvd2hhdC1pcy1jcDk1MS9cbiAgLy8gICogQmlnNS0yMDAzIChUYWl3YW4gc3RhbmRhcmQpIGFsbW9zdCBzdXBlcnNldCBvZiBjcDk1MC5cbiAgLy8gICogVW5pY29kZS1hdC1vbiAoVUFPKSAvIE1vemlsbGEgMS44LiBGYWxsaW5nIG91dCBvZiB1c2Ugb24gdGhlIFdlYi4gTm90IHN1cHBvcnRlZCBieSBvdGhlciBicm93c2Vycy5cbiAgLy8gICogQmlnNS1IS1NDUyAoLTIwMDEsIC0yMDA0LCAtMjAwOCkuIEhvbmcgS29uZyBzdGFuZGFyZC4gXG4gIC8vICAgIG1hbnkgdW5pY29kZSBjb2RlIHBvaW50cyBtb3ZlZCBmcm9tIFBVQSB0byBTdXBwbGVtZW50YXJ5IHBsYW5lIChVKzJYWFhYKSBvdmVyIHRoZSB5ZWFycy5cbiAgLy8gICAgUGx1cywgaXQgaGFzIDQgY29tYmluaW5nIHNlcXVlbmNlcy5cbiAgLy8gICAgU2VlbXMgdGhhdCBNb3ppbGxhIHJlZnVzZWQgdG8gc3VwcG9ydCBpdCBmb3IgMTAgeXJzLiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjI0MzEgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzEwMjk5XG4gIC8vICAgIGJlY2F1c2UgYmlnNS1oa3NjcyBpcyB0aGUgb25seSBlbmNvZGluZyB0byBpbmNsdWRlIGFzdHJhbCBjaGFyYWN0ZXJzIGluIG5vbi1hbGdvcml0aG1pYyB3YXkuXG4gIC8vICAgIEltcGxlbWVudGF0aW9ucyBhcmUgbm90IGNvbnNpc3RlbnQgd2l0aGluIGJyb3dzZXJzOyBzb21ldGltZXMgbGFiZWxlZCBhcyBqdXN0IGJpZzUuXG4gIC8vICAgIE1TIEludGVybmV0IEV4cGxvcmVyIHN3aXRjaGVzIGZyb20gYmlnNSB0byBiaWc1LWhrc2NzIHdoZW4gYSBwYXRjaCBhcHBsaWVkLlxuICAvLyAgICBHcmVhdCBkaXNjdXNzaW9uICYgcmVjYXAgb2Ygd2hhdCdzIGdvaW5nIG9uIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTkxMjQ3MCNjMzFcbiAgLy8gICAgSW4gdGhlIGVuY29kZXIsIGl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gc3VwcG9ydCBlbmNvZGluZyBvbGQgUFVBIG1hcHBpbmdzIHRvIEJpZzUgYnl0ZXMgc2VxLXMuXG4gIC8vICAgIE9mZmljaWFsIHNwZWM6IGh0dHA6Ly93d3cub2djaW8uZ292LmhrL2VuL2J1c2luZXNzL3RlY2hfcHJvbW90aW9uL2NjbGkvdGVybXMvZG9jLzIwMDNjbXBfMjAwOC50eHRcbiAgLy8gICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5vZ2Npby5nb3YuaGsvdGMvYnVzaW5lc3MvdGVjaF9wcm9tb3Rpb24vY2NsaS90ZXJtcy9kb2MvaGtzY3MtMjAwOC1iaWc1LWlzby50eHRcbiAgLy8gXG4gIC8vIEN1cnJlbnQgdW5kZXJzdGFuZGluZyBvZiBob3cgdG8gZGVhbCB3aXRoIEJpZzUoLUhLU0NTKSBpcyBpbiB0aGUgRW5jb2RpbmcgU3RhbmRhcmQsIGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2JpZzUtZW5jb2RlclxuICAvLyBVbmljb2RlIG1hcHBpbmcgKGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL09CU09MRVRFL0VBU1RBU0lBL09USEVSL0JJRzUuVFhUKSBpcyBzYWlkIHRvIGJlIHdyb25nLlxuICAnd2luZG93czk1MCc6ICdjcDk1MCcsXG4gICdtczk1MCc6ICdjcDk1MCcsXG4gICc5NTAnOiAnY3A5NTAnLFxuICAnY3A5NTAnOiB7XG4gICAgdHlwZTogJ19kYmNzJyxcbiAgICB0YWJsZTogZnVuY3Rpb24gdGFibGUoKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZSQkNjtcbiAgICB9XG4gIH0sXG4gIC8vIEJpZzUgaGFzIG1hbnkgdmFyaWF0aW9ucyBhbmQgaXMgYW4gZXh0ZW5zaW9uIG9mIGNwOTUwLiBXZSB1c2UgRW5jb2RpbmcgU3RhbmRhcmQncyBhcyBhIGNvbnNlbnN1cy5cbiAgJ2JpZzUnOiAnYmlnNWhrc2NzJyxcbiAgJ2JpZzVoa3Njcyc6IHtcbiAgICB0eXBlOiAnX2RiY3MnLFxuICAgIHRhYmxlOiBmdW5jdGlvbiB0YWJsZSgpIHtcbiAgICAgIHJldHVybiByZXF1aXJlJCQ2LmNvbmNhdChyZXF1aXJlJCQ3KTtcbiAgICB9LFxuICAgIGVuY29kZVNraXBWYWxzOiBbMHhhMmNjXVxuICB9LFxuICAnY25iaWc1JzogJ2JpZzVoa3NjcycsXG4gICdjc2JpZzUnOiAnYmlnNWhrc2NzJyxcbiAgJ3h4YmlnNSc6ICdiaWc1aGtzY3MnXG59O1xuXG52YXIgZW5jb2RpbmdzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAvLyBXZSBzdXBwb3J0IEJyb3dzZXJpZnkgYnkgc2tpcHBpbmcgYXV0b21hdGljIG1vZHVsZSBkaXNjb3ZlcnkgYW5kIHJlcXVpcmluZyBtb2R1bGVzIGRpcmVjdGx5LlxuXG4gIHZhciBtb2R1bGVzID0gW2ludGVybmFsLCB1dGYxNiwgdXRmNywgc2Jjc0NvZGVjLCBzYmNzRGF0YSwgc2Jjc0RhdGFHZW5lcmF0ZWQsIGRiY3NDb2RlYywgZGJjc0RhdGFdOyAvLyBQdXQgYWxsIGVuY29kaW5nL2FsaWFzL2NvZGVjIGRlZmluaXRpb25zIHRvIHNpbmdsZSBvYmplY3QgYW5kIGV4cG9ydCBpdC4gXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG1vZHVsZSA9IG1vZHVsZXNbaV07XG5cbiAgICBmb3IgKHZhciBlbmMgaW4gbW9kdWxlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZHVsZSwgZW5jKSkgZXhwb3J0c1tlbmNdID0gbW9kdWxlW2VuY107XG4gICAgfVxuICB9XG59KTtcblxudmFyIEJ1ZmZlciQ2ID0gYnVmZmVyLkJ1ZmZlcixcbiAgICBUcmFuc2Zvcm0kMSA9IFN0cmVhbS5UcmFuc2Zvcm07IC8vID09IEV4cG9ydHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbnZhciBzdHJlYW1zID0gZnVuY3Rpb24gc3RyZWFtcyhpY29udikge1xuICAvLyBBZGRpdGlvbmFsIFB1YmxpYyBBUEkuXG4gIGljb252LmVuY29kZVN0cmVhbSA9IGZ1bmN0aW9uIGVuY29kZVN0cmVhbShlbmNvZGluZywgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgSWNvbnZMaXRlRW5jb2RlclN0cmVhbShpY29udi5nZXRFbmNvZGVyKGVuY29kaW5nLCBvcHRpb25zKSwgb3B0aW9ucyk7XG4gIH07XG5cbiAgaWNvbnYuZGVjb2RlU3RyZWFtID0gZnVuY3Rpb24gZGVjb2RlU3RyZWFtKGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBJY29udkxpdGVEZWNvZGVyU3RyZWFtKGljb252LmdldERlY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgfTtcblxuICBpY29udi5zdXBwb3J0c1N0cmVhbXMgPSB0cnVlOyAvLyBOb3QgcHVibGlzaGVkIHlldC5cblxuICBpY29udi5JY29udkxpdGVFbmNvZGVyU3RyZWFtID0gSWNvbnZMaXRlRW5jb2RlclN0cmVhbTtcbiAgaWNvbnYuSWNvbnZMaXRlRGVjb2RlclN0cmVhbSA9IEljb252TGl0ZURlY29kZXJTdHJlYW07XG4gIGljb252Ll9jb2xsZWN0ID0gSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUuY29sbGVjdDtcbn07IC8vID09IEVuY29kZXIgc3RyZWFtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG5mdW5jdGlvbiBJY29udkxpdGVFbmNvZGVyU3RyZWFtKGNvbnYsIG9wdGlvbnMpIHtcbiAgdGhpcy5jb252ID0gY29udjtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9IGZhbHNlOyAvLyBXZSBhY2NlcHQgb25seSBzdHJpbmdzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRlY29kZSB0aGVtLlxuXG4gIFRyYW5zZm9ybSQxLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cbkljb252TGl0ZUVuY29kZXJTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShUcmFuc2Zvcm0kMS5wcm90b3R5cGUsIHtcbiAgY29uc3RydWN0b3I6IHtcbiAgICB2YWx1ZTogSWNvbnZMaXRlRW5jb2RlclN0cmVhbVxuICB9XG59KTtcblxuSWNvbnZMaXRlRW5jb2RlclN0cmVhbS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGRvbmUpIHtcbiAgaWYgKHR5cGVvZiBjaHVuayAhPSAnc3RyaW5nJykgcmV0dXJuIGRvbmUobmV3IEVycm9yKFwiSWNvbnYgZW5jb2Rpbmcgc3RyZWFtIG5lZWRzIHN0cmluZ3MgYXMgaXRzIGlucHV0LlwiKSk7XG5cbiAgdHJ5IHtcbiAgICB2YXIgcmVzID0gdGhpcy5jb252LndyaXRlKGNodW5rKTtcbiAgICBpZiAocmVzICYmIHJlcy5sZW5ndGgpIHRoaXMucHVzaChyZXMpO1xuICAgIGRvbmUoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRvbmUoZSk7XG4gIH1cbn07XG5cbkljb252TGl0ZUVuY29kZXJTdHJlYW0ucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uIChkb25lKSB7XG4gIHRyeSB7XG4gICAgdmFyIHJlcyA9IHRoaXMuY29udi5lbmQoKTtcbiAgICBpZiAocmVzICYmIHJlcy5sZW5ndGgpIHRoaXMucHVzaChyZXMpO1xuICAgIGRvbmUoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRvbmUoZSk7XG4gIH1cbn07XG5cbkljb252TGl0ZUVuY29kZXJTdHJlYW0ucHJvdG90eXBlLmNvbGxlY3QgPSBmdW5jdGlvbiAoY2IpIHtcbiAgdmFyIGNodW5rcyA9IFtdO1xuICB0aGlzLm9uKCdlcnJvcicsIGNiKTtcbiAgdGhpcy5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgfSk7XG4gIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjYihudWxsLCBCdWZmZXIkNi5jb25jYXQoY2h1bmtzKSk7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07IC8vID09IERlY29kZXIgc3RyZWFtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG5mdW5jdGlvbiBJY29udkxpdGVEZWNvZGVyU3RyZWFtKGNvbnYsIG9wdGlvbnMpIHtcbiAgdGhpcy5jb252ID0gY29udjtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZW5jb2RpbmcgPSB0aGlzLmVuY29kaW5nID0gJ3V0ZjgnOyAvLyBXZSBvdXRwdXQgc3RyaW5ncy5cblxuICBUcmFuc2Zvcm0kMS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5JY29udkxpdGVEZWNvZGVyU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtJDEucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiB7XG4gICAgdmFsdWU6IEljb252TGl0ZURlY29kZXJTdHJlYW1cbiAgfVxufSk7XG5cbkljb252TGl0ZURlY29kZXJTdHJlYW0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gIGlmICghQnVmZmVyJDYuaXNCdWZmZXIoY2h1bmspKSByZXR1cm4gZG9uZShuZXcgRXJyb3IoXCJJY29udiBkZWNvZGluZyBzdHJlYW0gbmVlZHMgYnVmZmVycyBhcyBpdHMgaW5wdXQuXCIpKTtcblxuICB0cnkge1xuICAgIHZhciByZXMgPSB0aGlzLmNvbnYud3JpdGUoY2h1bmspO1xuICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCkgdGhpcy5wdXNoKHJlcywgdGhpcy5lbmNvZGluZyk7XG4gICAgZG9uZSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZG9uZShlKTtcbiAgfVxufTtcblxuSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUuX2ZsdXNoID0gZnVuY3Rpb24gKGRvbmUpIHtcbiAgdHJ5IHtcbiAgICB2YXIgcmVzID0gdGhpcy5jb252LmVuZCgpO1xuICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCkgdGhpcy5wdXNoKHJlcywgdGhpcy5lbmNvZGluZyk7XG4gICAgZG9uZSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZG9uZShlKTtcbiAgfVxufTtcblxuSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUuY29sbGVjdCA9IGZ1bmN0aW9uIChjYikge1xuICB2YXIgcmVzID0gJyc7XG4gIHRoaXMub24oJ2Vycm9yJywgY2IpO1xuICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgcmVzICs9IGNodW5rO1xuICB9KTtcbiAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIGNiKG51bGwsIHJlcyk7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnZhciBCdWZmZXIkNyA9IGJ1ZmZlci5CdWZmZXI7IC8vIE5vdGU6IG5vdCBwb2x5ZmlsbGVkIHdpdGggc2FmZXItYnVmZmVyIG9uIGEgcHVycG9zZSwgYXMgb3ZlcnJpZGVzIEJ1ZmZlclxuLy8gPT0gRXh0ZW5kIE5vZGUgcHJpbWl0aXZlcyB0byB1c2UgaWNvbnYtbGl0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxudmFyIGV4dGVuZE5vZGUgPSBmdW5jdGlvbiBleHRlbmROb2RlKGljb252KSB7XG4gIHZhciBvcmlnaW5hbCA9IHVuZGVmaW5lZDsgLy8gUGxhY2UgdG8ga2VlcCBvcmlnaW5hbCBtZXRob2RzLlxuICAvLyBOb2RlIGF1dGhvcnMgcmV3cm90ZSBCdWZmZXIgaW50ZXJuYWxzIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoXG4gIC8vIFVpbnQ4QXJyYXkgYW5kIHdlIGNhbm5vdCBwYXRjaCBrZXkgZnVuY3Rpb25zIHNpbmNlIHRoZW4uXG4gIC8vIE5vdGU6IHRoaXMgZG9lcyB1c2Ugb2xkZXIgQnVmZmVyIEFQSSBvbiBhIHB1cnBvc2VcblxuICBpY29udi5zdXBwb3J0c05vZGVFbmNvZGluZ3NFeHRlbnNpb24gPSAhKEJ1ZmZlciQ3LmZyb20gfHwgbmV3IEJ1ZmZlciQ3KDApIGluc3RhbmNlb2YgVWludDhBcnJheSk7XG5cbiAgaWNvbnYuZXh0ZW5kTm9kZUVuY29kaW5ncyA9IGZ1bmN0aW9uIGV4dGVuZE5vZGVFbmNvZGluZ3MoKSB7XG4gICAgaWYgKG9yaWdpbmFsKSByZXR1cm47XG4gICAgb3JpZ2luYWwgPSB7fTtcblxuICAgIGlmICghaWNvbnYuc3VwcG9ydHNOb2RlRW5jb2RpbmdzRXh0ZW5zaW9uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiQUNUSU9OIE5FRURFRDogcmVxdWlyZSgnaWNvbnYtbGl0ZScpLmV4dGVuZE5vZGVFbmNvZGluZ3MoKSBpcyBub3Qgc3VwcG9ydGVkIGluIHlvdXIgdmVyc2lvbiBvZiBOb2RlXCIpO1xuICAgICAgY29uc29sZS5lcnJvcihcIlNlZSBtb3JlIGluZm8gYXQgaHR0cHM6Ly9naXRodWIuY29tL2FzaHR1Y2hraW4vaWNvbnYtbGl0ZS93aWtpL05vZGUtdjQtY29tcGF0aWJpbGl0eVwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9kZU5hdGl2ZUVuY29kaW5ncyA9IHtcbiAgICAgICdoZXgnOiB0cnVlLFxuICAgICAgJ3V0ZjgnOiB0cnVlLFxuICAgICAgJ3V0Zi04JzogdHJ1ZSxcbiAgICAgICdhc2NpaSc6IHRydWUsXG4gICAgICAnYmluYXJ5JzogdHJ1ZSxcbiAgICAgICdiYXNlNjQnOiB0cnVlLFxuICAgICAgJ3VjczInOiB0cnVlLFxuICAgICAgJ3Vjcy0yJzogdHJ1ZSxcbiAgICAgICd1dGYxNmxlJzogdHJ1ZSxcbiAgICAgICd1dGYtMTZsZSc6IHRydWVcbiAgICB9O1xuXG4gICAgQnVmZmVyJDcuaXNOYXRpdmVFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgICAgIHJldHVybiBlbmMgJiYgbm9kZU5hdGl2ZUVuY29kaW5nc1tlbmMudG9Mb3dlckNhc2UoKV07XG4gICAgfTsgLy8gLS0gU2xvd0J1ZmZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgICB2YXIgU2xvd0J1ZmZlciA9IGJ1ZmZlci5TbG93QnVmZmVyO1xuICAgIG9yaWdpbmFsLlNsb3dCdWZmZXJUb1N0cmluZyA9IFNsb3dCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4gICAgU2xvd0J1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKTsgLy8gVXNlIG5hdGl2ZSBjb252ZXJzaW9uIHdoZW4gcG9zc2libGVcblxuICAgICAgaWYgKEJ1ZmZlciQ3LmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpKSByZXR1cm4gb3JpZ2luYWwuU2xvd0J1ZmZlclRvU3RyaW5nLmNhbGwodGhpcywgZW5jb2RpbmcsIHN0YXJ0LCBlbmQpOyAvLyBPdGhlcndpc2UsIHVzZSBvdXIgZGVjb2RpbmcgbWV0aG9kLlxuXG4gICAgICBpZiAodHlwZW9mIHN0YXJ0ID09ICd1bmRlZmluZWQnKSBzdGFydCA9IDA7XG4gICAgICBpZiAodHlwZW9mIGVuZCA9PSAndW5kZWZpbmVkJykgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgICByZXR1cm4gaWNvbnYuZGVjb2RlKHRoaXMuc2xpY2Uoc3RhcnQsIGVuZCksIGVuY29kaW5nKTtcbiAgICB9O1xuXG4gICAgb3JpZ2luYWwuU2xvd0J1ZmZlcldyaXRlID0gU2xvd0J1ZmZlci5wcm90b3R5cGUud3JpdGU7XG5cbiAgICBTbG93QnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAgICAgLy8gU3VwcG9ydCBib3RoIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZylcbiAgICAgIC8vIGFuZCB0aGUgbGVnYWN5IChzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aClcbiAgICAgIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgICAgIGlmICghaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgICAgIGVuY29kaW5nID0gbGVuZ3RoO1xuICAgICAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbGVnYWN5XG4gICAgICAgIHZhciBzd2FwID0gZW5jb2Rpbmc7XG4gICAgICAgIGVuY29kaW5nID0gb2Zmc2V0O1xuICAgICAgICBvZmZzZXQgPSBsZW5ndGg7XG4gICAgICAgIGxlbmd0aCA9IHN3YXA7XG4gICAgICB9XG5cbiAgICAgIG9mZnNldCA9ICtvZmZzZXQgfHwgMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldDtcblxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVuZ3RoID0gK2xlbmd0aDtcblxuICAgICAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICAgICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKTsgLy8gVXNlIG5hdGl2ZSBjb252ZXJzaW9uIHdoZW4gcG9zc2libGVcblxuICAgICAgaWYgKEJ1ZmZlciQ3LmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpKSByZXR1cm4gb3JpZ2luYWwuU2xvd0J1ZmZlcldyaXRlLmNhbGwodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpO1xuICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXR0ZW1wdCB0byB3cml0ZSBiZXlvbmQgYnVmZmVyIGJvdW5kcycpOyAvLyBPdGhlcndpc2UsIHVzZSBvdXIgZW5jb2RpbmcgbWV0aG9kLlxuXG4gICAgICB2YXIgYnVmID0gaWNvbnYuZW5jb2RlKHN0cmluZywgZW5jb2RpbmcpO1xuICAgICAgaWYgKGJ1Zi5sZW5ndGggPCBsZW5ndGgpIGxlbmd0aCA9IGJ1Zi5sZW5ndGg7XG4gICAgICBidWYuY29weSh0aGlzLCBvZmZzZXQsIDAsIGxlbmd0aCk7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH07IC8vIC0tIEJ1ZmZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4gICAgb3JpZ2luYWwuQnVmZmVySXNFbmNvZGluZyA9IEJ1ZmZlciQ3LmlzRW5jb2Rpbmc7XG5cbiAgICBCdWZmZXIkNy5pc0VuY29kaW5nID0gZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gICAgICByZXR1cm4gQnVmZmVyJDcuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykgfHwgaWNvbnYuZW5jb2RpbmdFeGlzdHMoZW5jb2RpbmcpO1xuICAgIH07XG5cbiAgICBvcmlnaW5hbC5CdWZmZXJCeXRlTGVuZ3RoID0gQnVmZmVyJDcuYnl0ZUxlbmd0aDtcblxuICAgIEJ1ZmZlciQ3LmJ5dGVMZW5ndGggPSBTbG93QnVmZmVyLmJ5dGVMZW5ndGggPSBmdW5jdGlvbiAoc3RyLCBlbmNvZGluZykge1xuICAgICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpOyAvLyBVc2UgbmF0aXZlIGNvbnZlcnNpb24gd2hlbiBwb3NzaWJsZVxuXG4gICAgICBpZiAoQnVmZmVyJDcuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykpIHJldHVybiBvcmlnaW5hbC5CdWZmZXJCeXRlTGVuZ3RoLmNhbGwodGhpcywgc3RyLCBlbmNvZGluZyk7IC8vIFNsb3csIEkga25vdywgYnV0IHdlIGRvbid0IGhhdmUgYSBiZXR0ZXIgd2F5IHlldC5cblxuICAgICAgcmV0dXJuIGljb252LmVuY29kZShzdHIsIGVuY29kaW5nKS5sZW5ndGg7XG4gICAgfTtcblxuICAgIG9yaWdpbmFsLkJ1ZmZlclRvU3RyaW5nID0gQnVmZmVyJDcucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4gICAgQnVmZmVyJDcucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7IC8vIFVzZSBuYXRpdmUgY29udmVyc2lvbiB3aGVuIHBvc3NpYmxlXG5cbiAgICAgIGlmIChCdWZmZXIkNy5pc05hdGl2ZUVuY29kaW5nKGVuY29kaW5nKSkgcmV0dXJuIG9yaWdpbmFsLkJ1ZmZlclRvU3RyaW5nLmNhbGwodGhpcywgZW5jb2RpbmcsIHN0YXJ0LCBlbmQpOyAvLyBPdGhlcndpc2UsIHVzZSBvdXIgZGVjb2RpbmcgbWV0aG9kLlxuXG4gICAgICBpZiAodHlwZW9mIHN0YXJ0ID09ICd1bmRlZmluZWQnKSBzdGFydCA9IDA7XG4gICAgICBpZiAodHlwZW9mIGVuZCA9PSAndW5kZWZpbmVkJykgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgICByZXR1cm4gaWNvbnYuZGVjb2RlKHRoaXMuc2xpY2Uoc3RhcnQsIGVuZCksIGVuY29kaW5nKTtcbiAgICB9O1xuXG4gICAgb3JpZ2luYWwuQnVmZmVyV3JpdGUgPSBCdWZmZXIkNy5wcm90b3R5cGUud3JpdGU7XG5cbiAgICBCdWZmZXIkNy5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgICAgIHZhciBfb2Zmc2V0ID0gb2Zmc2V0LFxuICAgICAgICAgIF9sZW5ndGggPSBsZW5ndGgsXG4gICAgICAgICAgX2VuY29kaW5nID0gZW5jb2Rpbmc7IC8vIFN1cHBvcnQgYm90aCAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpXG4gICAgICAvLyBhbmQgdGhlIGxlZ2FjeSAoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgICAgIGlmICghaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgICAgIGVuY29kaW5nID0gbGVuZ3RoO1xuICAgICAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbGVnYWN5XG4gICAgICAgIHZhciBzd2FwID0gZW5jb2Rpbmc7XG4gICAgICAgIGVuY29kaW5nID0gb2Zmc2V0O1xuICAgICAgICBvZmZzZXQgPSBsZW5ndGg7XG4gICAgICAgIGxlbmd0aCA9IHN3YXA7XG4gICAgICB9XG5cbiAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKTsgLy8gVXNlIG5hdGl2ZSBjb252ZXJzaW9uIHdoZW4gcG9zc2libGVcblxuICAgICAgaWYgKEJ1ZmZlciQ3LmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpKSByZXR1cm4gb3JpZ2luYWwuQnVmZmVyV3JpdGUuY2FsbCh0aGlzLCBzdHJpbmcsIF9vZmZzZXQsIF9sZW5ndGgsIF9lbmNvZGluZyk7XG4gICAgICBvZmZzZXQgPSArb2Zmc2V0IHx8IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXQ7XG5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbmd0aCA9ICtsZW5ndGg7XG5cbiAgICAgICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHRocm93IG5ldyBSYW5nZUVycm9yKCdhdHRlbXB0IHRvIHdyaXRlIGJleW9uZCBidWZmZXIgYm91bmRzJyk7IC8vIE90aGVyd2lzZSwgdXNlIG91ciBlbmNvZGluZyBtZXRob2QuXG5cbiAgICAgIHZhciBidWYgPSBpY29udi5lbmNvZGUoc3RyaW5nLCBlbmNvZGluZyk7XG4gICAgICBpZiAoYnVmLmxlbmd0aCA8IGxlbmd0aCkgbGVuZ3RoID0gYnVmLmxlbmd0aDtcbiAgICAgIGJ1Zi5jb3B5KHRoaXMsIG9mZnNldCwgMCwgbGVuZ3RoKTtcbiAgICAgIHJldHVybiBsZW5ndGg7IC8vIFRPRE86IFNldCBfY2hhcnNXcml0dGVuLlxuICAgIH07IC8vIC0tIFJlYWRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4gICAgaWYgKGljb252LnN1cHBvcnRzU3RyZWFtcykge1xuICAgICAgdmFyIFJlYWRhYmxlID0gU3RyZWFtLlJlYWRhYmxlO1xuICAgICAgb3JpZ2luYWwuUmVhZGFibGVTZXRFbmNvZGluZyA9IFJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZztcblxuICAgICAgUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RW5jb2RpbmcoZW5jLCBvcHRpb25zKSB7XG4gICAgICAgIC8vIFVzZSBvdXIgb3duIGRlY29kZXIsIGl0IGhhcyB0aGUgc2FtZSBpbnRlcmZhY2UuXG4gICAgICAgIC8vIFdlIGNhbm5vdCB1c2Ugb3JpZ2luYWwgZnVuY3Rpb24gYXMgaXQgZG9lc24ndCBoYW5kbGUgQk9NLXMuXG4gICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2RlciA9IGljb252LmdldERlY29kZXIoZW5jLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgICAgIH07XG5cbiAgICAgIFJlYWRhYmxlLnByb3RvdHlwZS5jb2xsZWN0ID0gaWNvbnYuX2NvbGxlY3Q7XG4gICAgfVxuICB9OyAvLyBSZW1vdmUgaWNvbnYtbGl0ZSBOb2RlIHByaW1pdGl2ZSBleHRlbnNpb25zLlxuXG5cbiAgaWNvbnYudW5kb0V4dGVuZE5vZGVFbmNvZGluZ3MgPSBmdW5jdGlvbiB1bmRvRXh0ZW5kTm9kZUVuY29kaW5ncygpIHtcbiAgICBpZiAoIWljb252LnN1cHBvcnRzTm9kZUVuY29kaW5nc0V4dGVuc2lvbikgcmV0dXJuO1xuICAgIGlmICghb3JpZ2luYWwpIHRocm93IG5ldyBFcnJvcihcInJlcXVpcmUoJ2ljb252LWxpdGUnKS51bmRvRXh0ZW5kTm9kZUVuY29kaW5ncygpOiBOb3RoaW5nIHRvIHVuZG87IGV4dGVuZE5vZGVFbmNvZGluZ3MoKSBpcyBub3QgY2FsbGVkLlwiKTtcbiAgICBkZWxldGUgQnVmZmVyJDcuaXNOYXRpdmVFbmNvZGluZztcbiAgICB2YXIgU2xvd0J1ZmZlciA9IGJ1ZmZlci5TbG93QnVmZmVyO1xuICAgIFNsb3dCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gb3JpZ2luYWwuU2xvd0J1ZmZlclRvU3RyaW5nO1xuICAgIFNsb3dCdWZmZXIucHJvdG90eXBlLndyaXRlID0gb3JpZ2luYWwuU2xvd0J1ZmZlcldyaXRlO1xuICAgIEJ1ZmZlciQ3LmlzRW5jb2RpbmcgPSBvcmlnaW5hbC5CdWZmZXJJc0VuY29kaW5nO1xuICAgIEJ1ZmZlciQ3LmJ5dGVMZW5ndGggPSBvcmlnaW5hbC5CdWZmZXJCeXRlTGVuZ3RoO1xuICAgIEJ1ZmZlciQ3LnByb3RvdHlwZS50b1N0cmluZyA9IG9yaWdpbmFsLkJ1ZmZlclRvU3RyaW5nO1xuICAgIEJ1ZmZlciQ3LnByb3RvdHlwZS53cml0ZSA9IG9yaWdpbmFsLkJ1ZmZlcldyaXRlO1xuXG4gICAgaWYgKGljb252LnN1cHBvcnRzU3RyZWFtcykge1xuICAgICAgdmFyIFJlYWRhYmxlID0gU3RyZWFtLlJlYWRhYmxlO1xuICAgICAgUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gb3JpZ2luYWwuUmVhZGFibGVTZXRFbmNvZGluZztcbiAgICAgIGRlbGV0ZSBSZWFkYWJsZS5wcm90b3R5cGUuY29sbGVjdDtcbiAgICB9XG5cbiAgICBvcmlnaW5hbCA9IHVuZGVmaW5lZDtcbiAgfTtcbn07XG5cbnZhciBsaWIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIFNvbHV0aW9uIHdvdWxkIGJlIGluc3RhbGxpbmcgbnBtIG1vZHVsZXMgXCJidWZmZXJcIiBhbmQgXCJzdHJlYW1cIiBleHBsaWNpdGx5LlxuXG4gIHZhciBCdWZmZXIgPSBzYWZlcl8xLkJ1ZmZlcjtcbiAgdmFyIGljb252ID0gbW9kdWxlLmV4cG9ydHM7IC8vIEFsbCBjb2RlY3MgYW5kIGFsaWFzZXMgYXJlIGtlcHQgaGVyZSwga2V5ZWQgYnkgZW5jb2RpbmcgbmFtZS9hbGlhcy5cbiAgLy8gVGhleSBhcmUgbGF6eSBsb2FkZWQgaW4gYGljb252LmdldENvZGVjYCBmcm9tIGBlbmNvZGluZ3MvaW5kZXguanNgLlxuXG4gIGljb252LmVuY29kaW5ncyA9IG51bGw7IC8vIENoYXJhY3RlcnMgZW1pdHRlZCBpbiBjYXNlIG9mIGVycm9yLlxuXG4gIGljb252LmRlZmF1bHRDaGFyVW5pY29kZSA9ICfvv70nO1xuICBpY29udi5kZWZhdWx0Q2hhclNpbmdsZUJ5dGUgPSAnPyc7IC8vIFB1YmxpYyBBUEkuXG5cbiAgaWNvbnYuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0ciwgZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICBzdHIgPSBcIlwiICsgKHN0ciB8fCBcIlwiKTsgLy8gRW5zdXJlIHN0cmluZy5cblxuICAgIHZhciBlbmNvZGVyID0gaWNvbnYuZ2V0RW5jb2RlcihlbmNvZGluZywgb3B0aW9ucyk7XG4gICAgdmFyIHJlcyA9IGVuY29kZXIud3JpdGUoc3RyKTtcbiAgICB2YXIgdHJhaWwgPSBlbmNvZGVyLmVuZCgpO1xuICAgIHJldHVybiB0cmFpbCAmJiB0cmFpbC5sZW5ndGggPiAwID8gQnVmZmVyLmNvbmNhdChbcmVzLCB0cmFpbF0pIDogcmVzO1xuICB9O1xuXG4gIGljb252LmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShidWYsIGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBidWYgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoIWljb252LnNraXBEZWNvZGVXYXJuaW5nKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ljb252LWxpdGUgd2FybmluZzogZGVjb2RlKCktaW5nIHN0cmluZ3MgaXMgZGVwcmVjYXRlZC4gUmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL2FzaHR1Y2hraW4vaWNvbnYtbGl0ZS93aWtpL1VzZS1CdWZmZXJzLXdoZW4tZGVjb2RpbmcnKTtcbiAgICAgICAgaWNvbnYuc2tpcERlY29kZVdhcm5pbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBidWYgPSBCdWZmZXIuZnJvbShcIlwiICsgKGJ1ZiB8fCBcIlwiKSwgXCJiaW5hcnlcIik7IC8vIEVuc3VyZSBidWZmZXIuXG4gICAgfVxuXG4gICAgdmFyIGRlY29kZXIgPSBpY29udi5nZXREZWNvZGVyKGVuY29kaW5nLCBvcHRpb25zKTtcbiAgICB2YXIgcmVzID0gZGVjb2Rlci53cml0ZShidWYpO1xuICAgIHZhciB0cmFpbCA9IGRlY29kZXIuZW5kKCk7XG4gICAgcmV0dXJuIHRyYWlsID8gcmVzICsgdHJhaWwgOiByZXM7XG4gIH07XG5cbiAgaWNvbnYuZW5jb2RpbmdFeGlzdHMgPSBmdW5jdGlvbiBlbmNvZGluZ0V4aXN0cyhlbmMpIHtcbiAgICB0cnkge1xuICAgICAgaWNvbnYuZ2V0Q29kZWMoZW5jKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07IC8vIExlZ2FjeSBhbGlhc2VzIHRvIGNvbnZlcnQgZnVuY3Rpb25zXG5cblxuICBpY29udi50b0VuY29kaW5nID0gaWNvbnYuZW5jb2RlO1xuICBpY29udi5mcm9tRW5jb2RpbmcgPSBpY29udi5kZWNvZGU7IC8vIFNlYXJjaCBmb3IgYSBjb2RlYyBpbiBpY29udi5lbmNvZGluZ3MuIENhY2hlIGNvZGVjIGRhdGEgaW4gaWNvbnYuX2NvZGVjRGF0YUNhY2hlLlxuXG4gIGljb252Ll9jb2RlY0RhdGFDYWNoZSA9IHt9O1xuXG4gIGljb252LmdldENvZGVjID0gZnVuY3Rpb24gZ2V0Q29kZWMoZW5jb2RpbmcpIHtcbiAgICBpZiAoIWljb252LmVuY29kaW5ncykgaWNvbnYuZW5jb2RpbmdzID0gZW5jb2RpbmdzOyAvLyBMYXp5IGxvYWQgYWxsIGVuY29kaW5nIGRlZmluaXRpb25zLlxuICAgIC8vIENhbm9uaWNhbGl6ZSBlbmNvZGluZyBuYW1lOiBzdHJpcCBhbGwgbm9uLWFscGhhbnVtZXJpYyBjaGFycyBhbmQgYXBwZW5kZWQgeWVhci5cblxuICAgIHZhciBlbmMgPSBpY29udi5fY2Fub25pY2FsaXplRW5jb2RpbmcoZW5jb2RpbmcpOyAvLyBUcmF2ZXJzZSBpY29udi5lbmNvZGluZ3MgdG8gZmluZCBhY3R1YWwgY29kZWMuXG5cblxuICAgIHZhciBjb2RlY09wdGlvbnMgPSB7fTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB2YXIgY29kZWMgPSBpY29udi5fY29kZWNEYXRhQ2FjaGVbZW5jXTtcbiAgICAgIGlmIChjb2RlYykgcmV0dXJuIGNvZGVjO1xuICAgICAgdmFyIGNvZGVjRGVmID0gaWNvbnYuZW5jb2RpbmdzW2VuY107XG5cbiAgICAgIHN3aXRjaCAodHlwZW9mIGNvZGVjRGVmKSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAvLyBEaXJlY3QgYWxpYXMgdG8gb3RoZXIgZW5jb2RpbmcuXG4gICAgICAgICAgZW5jID0gY29kZWNEZWY7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgIC8vIEFsaWFzIHdpdGggb3B0aW9ucy4gQ2FuIGJlIGxheWVyZWQuXG4gICAgICAgICAgZm9yICh2YXIga2V5IGluIGNvZGVjRGVmKSB7XG4gICAgICAgICAgICBjb2RlY09wdGlvbnNba2V5XSA9IGNvZGVjRGVmW2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFjb2RlY09wdGlvbnMuZW5jb2RpbmdOYW1lKSBjb2RlY09wdGlvbnMuZW5jb2RpbmdOYW1lID0gZW5jO1xuICAgICAgICAgIGVuYyA9IGNvZGVjRGVmLnR5cGU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgLy8gQ29kZWMgaXRzZWxmLlxuICAgICAgICAgIGlmICghY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSkgY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSA9IGVuYzsgLy8gVGhlIGNvZGVjIGZ1bmN0aW9uIG11c3QgbG9hZCBhbGwgdGFibGVzIGFuZCByZXR1cm4gb2JqZWN0IHdpdGggLmVuY29kZXIgYW5kIC5kZWNvZGVyIG1ldGhvZHMuXG4gICAgICAgICAgLy8gSXQnbGwgYmUgY2FsbGVkIG9ubHkgb25jZSAoZm9yIGVhY2ggZGlmZmVyZW50IG9wdGlvbnMgb2JqZWN0KS5cblxuICAgICAgICAgIGNvZGVjID0gbmV3IGNvZGVjRGVmKGNvZGVjT3B0aW9ucywgaWNvbnYpO1xuICAgICAgICAgIGljb252Ll9jb2RlY0RhdGFDYWNoZVtjb2RlY09wdGlvbnMuZW5jb2RpbmdOYW1lXSA9IGNvZGVjOyAvLyBTYXZlIGl0IHRvIGJlIHJldXNlZCBsYXRlci5cblxuICAgICAgICAgIHJldHVybiBjb2RlYztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuY29kaW5nIG5vdCByZWNvZ25pemVkOiAnXCIgKyBlbmNvZGluZyArIFwiJyAoc2VhcmNoZWQgYXM6ICdcIiArIGVuYyArIFwiJylcIik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGljb252Ll9jYW5vbmljYWxpemVFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICAgIC8vIENhbm9uaWNhbGl6ZSBlbmNvZGluZyBuYW1lOiBzdHJpcCBhbGwgbm9uLWFscGhhbnVtZXJpYyBjaGFycyBhbmQgYXBwZW5kZWQgeWVhci5cbiAgICByZXR1cm4gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvOlxcZHs0fSR8W14wLTlhLXpdL2csIFwiXCIpO1xuICB9O1xuXG4gIGljb252LmdldEVuY29kZXIgPSBmdW5jdGlvbiBnZXRFbmNvZGVyKGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgdmFyIGNvZGVjID0gaWNvbnYuZ2V0Q29kZWMoZW5jb2RpbmcpLFxuICAgICAgICBlbmNvZGVyID0gbmV3IGNvZGVjLmVuY29kZXIob3B0aW9ucywgY29kZWMpO1xuICAgIGlmIChjb2RlYy5ib21Bd2FyZSAmJiBvcHRpb25zICYmIG9wdGlvbnMuYWRkQk9NKSBlbmNvZGVyID0gbmV3IGJvbUhhbmRsaW5nLlByZXBlbmRCT00oZW5jb2Rlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGVuY29kZXI7XG4gIH07XG5cbiAgaWNvbnYuZ2V0RGVjb2RlciA9IGZ1bmN0aW9uIGdldERlY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICB2YXIgY29kZWMgPSBpY29udi5nZXRDb2RlYyhlbmNvZGluZyksXG4gICAgICAgIGRlY29kZXIgPSBuZXcgY29kZWMuZGVjb2RlcihvcHRpb25zLCBjb2RlYyk7XG4gICAgaWYgKGNvZGVjLmJvbUF3YXJlICYmICEob3B0aW9ucyAmJiBvcHRpb25zLnN0cmlwQk9NID09PSBmYWxzZSkpIGRlY29kZXIgPSBuZXcgYm9tSGFuZGxpbmcuU3RyaXBCT00oZGVjb2Rlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGRlY29kZXI7XG4gIH07IC8vIExvYWQgZXh0ZW5zaW9ucyBpbiBOb2RlLiBBbGwgb2YgdGhlbSBhcmUgb21pdHRlZCBpbiBCcm93c2VyaWZ5IGJ1aWxkIHZpYSAnYnJvd3NlcicgZmllbGQgaW4gcGFja2FnZS5qc29uLlxuXG5cbiAgdmFyIG5vZGVWZXIgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGU7XG5cbiAgaWYgKG5vZGVWZXIpIHtcbiAgICAvLyBMb2FkIHN0cmVhbWluZyBzdXBwb3J0IGluIE5vZGUgdjAuMTArXG4gICAgdmFyIG5vZGVWZXJBcnIgPSBub2RlVmVyLnNwbGl0KFwiLlwiKS5tYXAoTnVtYmVyKTtcblxuICAgIGlmIChub2RlVmVyQXJyWzBdID4gMCB8fCBub2RlVmVyQXJyWzFdID49IDEwKSB7XG4gICAgICBzdHJlYW1zKGljb252KTtcbiAgICB9IC8vIExvYWQgTm9kZSBwcmltaXRpdmUgZXh0ZW5zaW9ucy5cblxuXG4gICAgZXh0ZW5kTm9kZShpY29udik7XG4gIH1cbn0pO1xuXG52YXIgRGVjb2RlU3RyZWFtID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIERlY29kZVN0cmVhbSwgaWNvbnY7XG5cbiAgICB0cnkge1xuICAgICAgaWNvbnYgPSBsaWI7XG4gICAgfSBjYXRjaCAoX2Vycm9yKSB7fVxuXG4gICAgRGVjb2RlU3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGtleTtcblxuICAgICAgZnVuY3Rpb24gRGVjb2RlU3RyZWFtKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmZmVyLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgRGVjb2RlU3RyZWFtLlRZUEVTID0ge1xuICAgICAgICBVSW50ODogMSxcbiAgICAgICAgVUludDE2OiAyLFxuICAgICAgICBVSW50MjQ6IDMsXG4gICAgICAgIFVJbnQzMjogNCxcbiAgICAgICAgSW50ODogMSxcbiAgICAgICAgSW50MTY6IDIsXG4gICAgICAgIEludDI0OiAzLFxuICAgICAgICBJbnQzMjogNCxcbiAgICAgICAgRmxvYXQ6IDQsXG4gICAgICAgIERvdWJsZTogOFxuICAgICAgfTtcblxuICAgICAgZm9yIChrZXkgaW4gYnVmZmVyXzEucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChrZXkuc2xpY2UoMCwgNCkgPT09ICdyZWFkJykge1xuICAgICAgICAgIChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICB2YXIgYnl0ZXM7XG4gICAgICAgICAgICBieXRlcyA9IERlY29kZVN0cmVhbS5UWVBFU1trZXkucmVwbGFjZSgvcmVhZHxbQkxdRS9nLCAnJyldO1xuICAgICAgICAgICAgcmV0dXJuIERlY29kZVN0cmVhbS5wcm90b3R5cGVba2V5XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIHJldDtcbiAgICAgICAgICAgICAgcmV0ID0gdGhpcy5idWZmZXJba2V5XSh0aGlzLnBvcyk7XG4gICAgICAgICAgICAgIHRoaXMucG9zICs9IGJ5dGVzO1xuICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KShrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uIChsZW5ndGgsIGVuY29kaW5nKSB7XG4gICAgICAgIHZhciBidWYsIF9ieXRlLCBpLCBfaSwgX3JlZjtcblxuICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkge1xuICAgICAgICAgIGVuY29kaW5nID0gJ2FzY2lpJztcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgICAgICBjYXNlICd1Y3MyJzpcbiAgICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIudG9TdHJpbmcoZW5jb2RpbmcsIHRoaXMucG9zLCB0aGlzLnBvcyArPSBsZW5ndGgpO1xuXG4gICAgICAgICAgY2FzZSAndXRmMTZiZSc6XG4gICAgICAgICAgICBidWYgPSBuZXcgYnVmZmVyXzEodGhpcy5yZWFkQnVmZmVyKGxlbmd0aCkpO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSBfaSA9IDAsIF9yZWYgPSBidWYubGVuZ3RoIC0gMTsgX2kgPCBfcmVmOyBpID0gX2kgKz0gMikge1xuICAgICAgICAgICAgICBfYnl0ZSA9IGJ1ZltpXTtcbiAgICAgICAgICAgICAgYnVmW2ldID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgICAgYnVmW2kgKyAxXSA9IF9ieXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGYxNmxlJyk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnVmID0gdGhpcy5yZWFkQnVmZmVyKGxlbmd0aCk7XG5cbiAgICAgICAgICAgIGlmIChpY29udikge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpY29udi5kZWNvZGUoYnVmLCBlbmNvZGluZyk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKF9lcnJvcikge31cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5yZWFkQnVmZmVyID0gZnVuY3Rpb24gKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuc2xpY2UodGhpcy5wb3MsIHRoaXMucG9zICs9IGxlbmd0aCk7XG4gICAgICB9O1xuXG4gICAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnJlYWRVSW50MjRCRSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnJlYWRVSW50MTZCRSgpIDw8IDgpICsgdGhpcy5yZWFkVUludDgoKTtcbiAgICAgIH07XG5cbiAgICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUucmVhZFVJbnQyNExFID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVUludDE2TEUoKSArICh0aGlzLnJlYWRVSW50OCgpIDw8IDE2KTtcbiAgICAgIH07XG5cbiAgICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUucmVhZEludDI0QkUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5yZWFkSW50MTZCRSgpIDw8IDgpICsgdGhpcy5yZWFkVUludDgoKTtcbiAgICAgIH07XG5cbiAgICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUucmVhZEludDI0TEUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRVSW50MTZMRSgpICsgKHRoaXMucmVhZEludDgoKSA8PCAxNik7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gRGVjb2RlU3RyZWFtO1xuICAgIH0oKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gRGVjb2RlU3RyZWFtO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgRW5jb2RlU3RyZWFtID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIERlY29kZVN0cmVhbSQxLFxuICAgICAgICBFbmNvZGVTdHJlYW0sXG4gICAgICAgIGljb252LFxuICAgICAgICBzdHJlYW0sXG4gICAgICAgIF9faGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LFxuICAgICAgICBfX2V4dGVuZHMgPSBmdW5jdGlvbiBfX2V4dGVuZHMoY2hpbGQsIHBhcmVudCkge1xuICAgICAgZm9yICh2YXIga2V5IGluIHBhcmVudCkge1xuICAgICAgICBpZiAoX19oYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICAgIH1cblxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuICAgICAgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTtcbiAgICAgIGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcblxuICAgIHN0cmVhbSA9IFN0cmVhbTtcbiAgICBEZWNvZGVTdHJlYW0kMSA9IERlY29kZVN0cmVhbTtcblxuICAgIHRyeSB7XG4gICAgICBpY29udiA9IGxpYjtcbiAgICB9IGNhdGNoIChfZXJyb3IpIHt9XG5cbiAgICBFbmNvZGVTdHJlYW0gPSBmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICB2YXIga2V5O1xuXG4gICAgICBfX2V4dGVuZHMoRW5jb2RlU3RyZWFtLCBfc3VwZXIpO1xuXG4gICAgICBmdW5jdGlvbiBFbmNvZGVTdHJlYW0oYnVmZmVyU2l6ZSkge1xuICAgICAgICBpZiAoYnVmZmVyU2l6ZSA9PSBudWxsKSB7XG4gICAgICAgICAgYnVmZmVyU2l6ZSA9IDY1NTM2O1xuICAgICAgICB9XG5cbiAgICAgICAgRW5jb2RlU3RyZWFtLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IGJ1ZmZlcl8xKGJ1ZmZlclNpemUpO1xuICAgICAgICB0aGlzLmJ1ZmZlck9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgIH1cblxuICAgICAgZm9yIChrZXkgaW4gYnVmZmVyXzEucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChrZXkuc2xpY2UoMCwgNSkgPT09ICd3cml0ZScpIHtcbiAgICAgICAgICAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIGJ5dGVzO1xuICAgICAgICAgICAgYnl0ZXMgPSArRGVjb2RlU3RyZWFtJDEuVFlQRVNba2V5LnJlcGxhY2UoL3dyaXRlfFtCTF1FL2csICcnKV07XG4gICAgICAgICAgICByZXR1cm4gRW5jb2RlU3RyZWFtLnByb3RvdHlwZVtrZXldID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHRoaXMuZW5zdXJlKGJ5dGVzKTtcbiAgICAgICAgICAgICAgdGhpcy5idWZmZXJba2V5XSh2YWx1ZSwgdGhpcy5idWZmZXJPZmZzZXQpO1xuICAgICAgICAgICAgICB0aGlzLmJ1ZmZlck9mZnNldCArPSBieXRlcztcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zICs9IGJ5dGVzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KShrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEVuY29kZVN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgICAgRW5jb2RlU3RyZWFtLnByb3RvdHlwZS5lbnN1cmUgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyT2Zmc2V0ICsgYnl0ZXMgPiB0aGlzLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mbHVzaCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBFbmNvZGVTdHJlYW0ucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5idWZmZXJPZmZzZXQgPiAwKSB7XG4gICAgICAgICAgdGhpcy5wdXNoKG5ldyBidWZmZXJfMSh0aGlzLmJ1ZmZlci5zbGljZSgwLCB0aGlzLmJ1ZmZlck9mZnNldCkpKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXJPZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBFbmNvZGVTdHJlYW0ucHJvdG90eXBlLndyaXRlQnVmZmVyID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIHRoaXMucHVzaChidWZmZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICAgIH07XG5cbiAgICAgIEVuY29kZVN0cmVhbS5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbiAoc3RyaW5nLCBlbmNvZGluZykge1xuICAgICAgICB2YXIgYnVmLCBfYnl0ZSwgaSwgX2ksIF9yZWY7XG5cbiAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHtcbiAgICAgICAgICBlbmNvZGluZyA9ICdhc2NpaSc7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAgICAgY2FzZSAndWNzMic6XG4gICAgICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXIobmV3IGJ1ZmZlcl8xKHN0cmluZywgZW5jb2RpbmcpKTtcblxuICAgICAgICAgIGNhc2UgJ3V0ZjE2YmUnOlxuICAgICAgICAgICAgYnVmID0gbmV3IGJ1ZmZlcl8xKHN0cmluZywgJ3V0ZjE2bGUnKTtcblxuICAgICAgICAgICAgZm9yIChpID0gX2kgPSAwLCBfcmVmID0gYnVmLmxlbmd0aCAtIDE7IF9pIDwgX3JlZjsgaSA9IF9pICs9IDIpIHtcbiAgICAgICAgICAgICAgX2J5dGUgPSBidWZbaV07XG4gICAgICAgICAgICAgIGJ1ZltpXSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICAgIGJ1ZltpICsgMV0gPSBfYnl0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXIoYnVmKTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoaWNvbnYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXIoaWNvbnYuZW5jb2RlKHN0cmluZywgZW5jb2RpbmcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5zdGFsbCBpY29udi1saXRlIHRvIGVuYWJsZSBhZGRpdGlvbmFsIHN0cmluZyBlbmNvZGluZ3MuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgRW5jb2RlU3RyZWFtLnByb3RvdHlwZS53cml0ZVVJbnQyNEJFID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB0aGlzLmVuc3VyZSgzKTtcbiAgICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmZzZXQrK10gPSB2YWwgPj4+IDE2ICYgMHhmZjtcbiAgICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmZzZXQrK10gPSB2YWwgPj4+IDggJiAweGZmO1xuICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZnNldCsrXSA9IHZhbCAmIDB4ZmY7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyArPSAzO1xuICAgICAgfTtcblxuICAgICAgRW5jb2RlU3RyZWFtLnByb3RvdHlwZS53cml0ZVVJbnQyNExFID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB0aGlzLmVuc3VyZSgzKTtcbiAgICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmZzZXQrK10gPSB2YWwgJiAweGZmO1xuICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZnNldCsrXSA9IHZhbCA+Pj4gOCAmIDB4ZmY7XG4gICAgICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyT2Zmc2V0KytdID0gdmFsID4+PiAxNiAmIDB4ZmY7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyArPSAzO1xuICAgICAgfTtcblxuICAgICAgRW5jb2RlU3RyZWFtLnByb3RvdHlwZS53cml0ZUludDI0QkUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIGlmICh2YWwgPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlVUludDI0QkUodmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZVVJbnQyNEJFKHZhbCArIDB4ZmZmZmZmICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIEVuY29kZVN0cmVhbS5wcm90b3R5cGUud3JpdGVJbnQyNExFID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICBpZiAodmFsID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZVVJbnQyNExFKHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVVSW50MjRMRSh2YWwgKyAweGZmZmZmZiArIDEpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBFbmNvZGVTdHJlYW0ucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiAodmFsLCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGJ1ZjtcblxuICAgICAgICBpZiAobGVuZ3RoIDwgdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5lbnN1cmUobGVuZ3RoKTtcbiAgICAgICAgICB0aGlzLmJ1ZmZlci5maWxsKHZhbCwgdGhpcy5idWZmZXJPZmZzZXQsIHRoaXMuYnVmZmVyT2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICAgICAgICB0aGlzLmJ1ZmZlck9mZnNldCArPSBsZW5ndGg7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucG9zICs9IGxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWYgPSBuZXcgYnVmZmVyXzEobGVuZ3RoKTtcbiAgICAgICAgICBidWYuZmlsbCh2YWwpO1xuICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlQnVmZmVyKGJ1Zik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIEVuY29kZVN0cmVhbS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnB1c2gobnVsbCk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gRW5jb2RlU3RyZWFtO1xuICAgIH0oc3RyZWFtLlJlYWRhYmxlKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gRW5jb2RlU3RyZWFtO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgX051bWJlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBEZWNvZGVTdHJlYW0kMSxcbiAgICAgICAgRml4ZWQsXG4gICAgICAgIE51bWJlclQsXG4gICAgICAgIF9faGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LFxuICAgICAgICBfX2V4dGVuZHMgPSBmdW5jdGlvbiBfX2V4dGVuZHMoY2hpbGQsIHBhcmVudCkge1xuICAgICAgZm9yICh2YXIga2V5IGluIHBhcmVudCkge1xuICAgICAgICBpZiAoX19oYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICAgIH1cblxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuICAgICAgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTtcbiAgICAgIGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcblxuICAgIERlY29kZVN0cmVhbSQxID0gRGVjb2RlU3RyZWFtO1xuXG4gICAgTnVtYmVyVCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIE51bWJlclQodHlwZSwgZW5kaWFuKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuZW5kaWFuID0gZW5kaWFuICE9IG51bGwgPyBlbmRpYW4gOiAnQkUnO1xuICAgICAgICB0aGlzLmZuID0gdGhpcy50eXBlO1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGVbdGhpcy50eXBlLmxlbmd0aCAtIDFdICE9PSAnOCcpIHtcbiAgICAgICAgICB0aGlzLmZuICs9IHRoaXMuZW5kaWFuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIE51bWJlclQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBEZWNvZGVTdHJlYW0kMS5UWVBFU1t0aGlzLnR5cGVdO1xuICAgICAgfTtcblxuICAgICAgTnVtYmVyVC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICByZXR1cm4gc3RyZWFtWydyZWFkJyArIHRoaXMuZm5dKCk7XG4gICAgICB9O1xuXG4gICAgICBOdW1iZXJULnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIHN0cmVhbVsnd3JpdGUnICsgdGhpcy5mbl0odmFsKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBOdW1iZXJUO1xuICAgIH0oKTtcblxuICAgIGV4cG9ydHMuTnVtYmVyID0gTnVtYmVyVDtcbiAgICBleHBvcnRzLnVpbnQ4ID0gbmV3IE51bWJlclQoJ1VJbnQ4Jyk7XG4gICAgZXhwb3J0cy51aW50MTZiZSA9IGV4cG9ydHMudWludDE2ID0gbmV3IE51bWJlclQoJ1VJbnQxNicsICdCRScpO1xuICAgIGV4cG9ydHMudWludDE2bGUgPSBuZXcgTnVtYmVyVCgnVUludDE2JywgJ0xFJyk7XG4gICAgZXhwb3J0cy51aW50MjRiZSA9IGV4cG9ydHMudWludDI0ID0gbmV3IE51bWJlclQoJ1VJbnQyNCcsICdCRScpO1xuICAgIGV4cG9ydHMudWludDI0bGUgPSBuZXcgTnVtYmVyVCgnVUludDI0JywgJ0xFJyk7XG4gICAgZXhwb3J0cy51aW50MzJiZSA9IGV4cG9ydHMudWludDMyID0gbmV3IE51bWJlclQoJ1VJbnQzMicsICdCRScpO1xuICAgIGV4cG9ydHMudWludDMybGUgPSBuZXcgTnVtYmVyVCgnVUludDMyJywgJ0xFJyk7XG4gICAgZXhwb3J0cy5pbnQ4ID0gbmV3IE51bWJlclQoJ0ludDgnKTtcbiAgICBleHBvcnRzLmludDE2YmUgPSBleHBvcnRzLmludDE2ID0gbmV3IE51bWJlclQoJ0ludDE2JywgJ0JFJyk7XG4gICAgZXhwb3J0cy5pbnQxNmxlID0gbmV3IE51bWJlclQoJ0ludDE2JywgJ0xFJyk7XG4gICAgZXhwb3J0cy5pbnQyNGJlID0gZXhwb3J0cy5pbnQyNCA9IG5ldyBOdW1iZXJUKCdJbnQyNCcsICdCRScpO1xuICAgIGV4cG9ydHMuaW50MjRsZSA9IG5ldyBOdW1iZXJUKCdJbnQyNCcsICdMRScpO1xuICAgIGV4cG9ydHMuaW50MzJiZSA9IGV4cG9ydHMuaW50MzIgPSBuZXcgTnVtYmVyVCgnSW50MzInLCAnQkUnKTtcbiAgICBleHBvcnRzLmludDMybGUgPSBuZXcgTnVtYmVyVCgnSW50MzInLCAnTEUnKTtcbiAgICBleHBvcnRzLmZsb2F0YmUgPSBleHBvcnRzW1wiZmxvYXRcIl0gPSBuZXcgTnVtYmVyVCgnRmxvYXQnLCAnQkUnKTtcbiAgICBleHBvcnRzLmZsb2F0bGUgPSBuZXcgTnVtYmVyVCgnRmxvYXQnLCAnTEUnKTtcbiAgICBleHBvcnRzLmRvdWJsZWJlID0gZXhwb3J0c1tcImRvdWJsZVwiXSA9IG5ldyBOdW1iZXJUKCdEb3VibGUnLCAnQkUnKTtcbiAgICBleHBvcnRzLmRvdWJsZWxlID0gbmV3IE51bWJlclQoJ0RvdWJsZScsICdMRScpO1xuXG4gICAgRml4ZWQgPSBmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMoRml4ZWQsIF9zdXBlcik7XG5cbiAgICAgIGZ1bmN0aW9uIEZpeGVkKHNpemUsIGVuZGlhbiwgZnJhY0JpdHMpIHtcbiAgICAgICAgaWYgKGZyYWNCaXRzID09IG51bGwpIHtcbiAgICAgICAgICBmcmFjQml0cyA9IHNpemUgPj4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIEZpeGVkLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIFwiSW50XCIgKyBzaXplLCBlbmRpYW4pO1xuXG4gICAgICAgIHRoaXMuX3BvaW50ID0gMSA8PCBmcmFjQml0cztcbiAgICAgIH1cblxuICAgICAgRml4ZWQucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICAgICAgcmV0dXJuIEZpeGVkLl9fc3VwZXJfXy5kZWNvZGUuY2FsbCh0aGlzLCBzdHJlYW0pIC8gdGhpcy5fcG9pbnQ7XG4gICAgICB9O1xuXG4gICAgICBGaXhlZC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgdmFsKSB7XG4gICAgICAgIHJldHVybiBGaXhlZC5fX3N1cGVyX18uZW5jb2RlLmNhbGwodGhpcywgc3RyZWFtLCB2YWwgKiB0aGlzLl9wb2ludCB8IDApO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIEZpeGVkO1xuICAgIH0oTnVtYmVyVCk7XG5cbiAgICBleHBvcnRzLkZpeGVkID0gRml4ZWQ7XG4gICAgZXhwb3J0cy5maXhlZDE2YmUgPSBleHBvcnRzLmZpeGVkMTYgPSBuZXcgRml4ZWQoMTYsICdCRScpO1xuICAgIGV4cG9ydHMuZml4ZWQxNmxlID0gbmV3IEZpeGVkKDE2LCAnTEUnKTtcbiAgICBleHBvcnRzLmZpeGVkMzJiZSA9IGV4cG9ydHMuZml4ZWQzMiA9IG5ldyBGaXhlZCgzMiwgJ0JFJyk7XG4gICAgZXhwb3J0cy5maXhlZDMybGUgPSBuZXcgRml4ZWQoMzIsICdMRScpO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xudmFyIF9OdW1iZXJfMSA9IF9OdW1iZXIuTnVtYmVyO1xudmFyIF9OdW1iZXJfMiA9IF9OdW1iZXIudWludDg7XG52YXIgX051bWJlcl8zID0gX051bWJlci51aW50MTZiZTtcbnZhciBfTnVtYmVyXzQgPSBfTnVtYmVyLnVpbnQxNjtcbnZhciBfTnVtYmVyXzUgPSBfTnVtYmVyLnVpbnQxNmxlO1xudmFyIF9OdW1iZXJfNiA9IF9OdW1iZXIudWludDI0YmU7XG52YXIgX051bWJlcl83ID0gX051bWJlci51aW50MjQ7XG52YXIgX051bWJlcl84ID0gX051bWJlci51aW50MjRsZTtcbnZhciBfTnVtYmVyXzkgPSBfTnVtYmVyLnVpbnQzMmJlO1xudmFyIF9OdW1iZXJfMTAgPSBfTnVtYmVyLnVpbnQzMjtcbnZhciBfTnVtYmVyXzExID0gX051bWJlci51aW50MzJsZTtcbnZhciBfTnVtYmVyXzEyID0gX051bWJlci5pbnQ4O1xudmFyIF9OdW1iZXJfMTMgPSBfTnVtYmVyLmludDE2YmU7XG52YXIgX051bWJlcl8xNCA9IF9OdW1iZXIuaW50MTY7XG52YXIgX051bWJlcl8xNSA9IF9OdW1iZXIuaW50MTZsZTtcbnZhciBfTnVtYmVyXzE2ID0gX051bWJlci5pbnQyNGJlO1xudmFyIF9OdW1iZXJfMTcgPSBfTnVtYmVyLmludDI0O1xudmFyIF9OdW1iZXJfMTggPSBfTnVtYmVyLmludDI0bGU7XG52YXIgX051bWJlcl8xOSA9IF9OdW1iZXIuaW50MzJiZTtcbnZhciBfTnVtYmVyXzIwID0gX051bWJlci5pbnQzMjtcbnZhciBfTnVtYmVyXzIxID0gX051bWJlci5pbnQzMmxlO1xudmFyIF9OdW1iZXJfMjIgPSBfTnVtYmVyLmZsb2F0YmU7XG52YXIgX051bWJlcl8yMyA9IF9OdW1iZXIuZmxvYXRsZTtcbnZhciBfTnVtYmVyXzI0ID0gX051bWJlci5kb3VibGViZTtcbnZhciBfTnVtYmVyXzI1ID0gX051bWJlci5kb3VibGVsZTtcbnZhciBfTnVtYmVyXzI2ID0gX051bWJlci5GaXhlZDtcbnZhciBfTnVtYmVyXzI3ID0gX051bWJlci5maXhlZDE2YmU7XG52YXIgX051bWJlcl8yOCA9IF9OdW1iZXIuZml4ZWQxNjtcbnZhciBfTnVtYmVyXzI5ID0gX051bWJlci5maXhlZDE2bGU7XG52YXIgX051bWJlcl8zMCA9IF9OdW1iZXIuZml4ZWQzMmJlO1xudmFyIF9OdW1iZXJfMzEgPSBfTnVtYmVyLmZpeGVkMzI7XG52YXIgX051bWJlcl8zMiA9IF9OdW1iZXIuZml4ZWQzMmxlO1xuXG52YXIgdXRpbHMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgTnVtYmVyVCwgUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgIE51bWJlclQgPSBfTnVtYmVyLk51bWJlcjtcblxuICAgIGV4cG9ydHMucmVzb2x2ZUxlbmd0aCA9IGZ1bmN0aW9uIChsZW5ndGgsIHN0cmVhbSwgcGFyZW50KSB7XG4gICAgICB2YXIgcmVzO1xuXG4gICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmVzID0gbGVuZ3RoO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGVuZ3RoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlcyA9IGxlbmd0aC5jYWxsKHBhcmVudCwgcGFyZW50KTtcbiAgICAgIH0gZWxzZSBpZiAocGFyZW50ICYmIHR5cGVvZiBsZW5ndGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlcyA9IHBhcmVudFtsZW5ndGhdO1xuICAgICAgfSBlbHNlIGlmIChzdHJlYW0gJiYgbGVuZ3RoIGluc3RhbmNlb2YgTnVtYmVyVCkge1xuICAgICAgICByZXMgPSBsZW5ndGguZGVjb2RlKHN0cmVhbSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05hTihyZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgZml4ZWQgc2l6ZScpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbiAgICBQcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBQcm9wZXJ0eURlc2NyaXB0b3Iob3B0cykge1xuICAgICAgICB2YXIga2V5LCB2YWw7XG5cbiAgICAgICAgaWYgKG9wdHMgPT0gbnVsbCkge1xuICAgICAgICAgIG9wdHMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW51bWVyYWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29uZmlndXJhYmxlID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKGtleSBpbiBvcHRzKSB7XG4gICAgICAgICAgdmFsID0gb3B0c1trZXldO1xuICAgICAgICAgIHRoaXNba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgIH0oKTtcblxuICAgIGV4cG9ydHMuUHJvcGVydHlEZXNjcmlwdG9yID0gUHJvcGVydHlEZXNjcmlwdG9yO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xudmFyIHV0aWxzXzEgPSB1dGlscy5yZXNvbHZlTGVuZ3RoO1xudmFyIHV0aWxzXzIgPSB1dGlscy5Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBfQXJyYXkgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgQXJyYXlULCBOdW1iZXJULCB1dGlscyQxO1xuICAgIE51bWJlclQgPSBfTnVtYmVyLk51bWJlcjtcbiAgICB1dGlscyQxID0gdXRpbHM7XG5cbiAgICBBcnJheVQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBBcnJheVQodHlwZSwgbGVuZ3RoLCBsZW5ndGhUeXBlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLmxlbmd0aFR5cGUgPSBsZW5ndGhUeXBlICE9IG51bGwgPyBsZW5ndGhUeXBlIDogJ2NvdW50JztcbiAgICAgIH1cblxuICAgICAgQXJyYXlULnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGN0eCwgaSwgbGVuZ3RoLCBwb3MsIHJlcywgdGFyZ2V0LCBfaTtcblxuICAgICAgICBwb3MgPSBzdHJlYW0ucG9zO1xuICAgICAgICByZXMgPSBbXTtcbiAgICAgICAgY3R4ID0gcGFyZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPSBudWxsKSB7XG4gICAgICAgICAgbGVuZ3RoID0gdXRpbHMkMS5yZXNvbHZlTGVuZ3RoKHRoaXMubGVuZ3RoLCBzdHJlYW0sIHBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggaW5zdGFuY2VvZiBOdW1iZXJUKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmVzLCB7XG4gICAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6IHBhcmVudFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9zdGFydE9mZnNldDoge1xuICAgICAgICAgICAgICB2YWx1ZTogcG9zXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2N1cnJlbnRPZmZzZXQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2xlbmd0aDoge1xuICAgICAgICAgICAgICB2YWx1ZTogbGVuZ3RoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3R4ID0gcmVzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxlbmd0aCA9PSBudWxsIHx8IHRoaXMubGVuZ3RoVHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICAgIHRhcmdldCA9IGxlbmd0aCAhPSBudWxsID8gc3RyZWFtLnBvcyArIGxlbmd0aCA6IChwYXJlbnQgIT0gbnVsbCA/IHBhcmVudC5fbGVuZ3RoIDogdm9pZCAwKSA/IHBhcmVudC5fc3RhcnRPZmZzZXQgKyBwYXJlbnQuX2xlbmd0aCA6IHN0cmVhbS5sZW5ndGg7XG5cbiAgICAgICAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IHRhcmdldCkge1xuICAgICAgICAgICAgcmVzLnB1c2godGhpcy50eXBlLmRlY29kZShzdHJlYW0sIGN0eCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGkgPSBfaSA9IDA7IF9pIDwgbGVuZ3RoOyBpID0gX2kgKz0gMSkge1xuICAgICAgICAgICAgcmVzLnB1c2godGhpcy50eXBlLmRlY29kZShzdHJlYW0sIGN0eCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9O1xuXG4gICAgICBBcnJheVQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoYXJyYXksIGN0eCkge1xuICAgICAgICB2YXIgaXRlbSwgc2l6ZSwgX2ksIF9sZW47XG5cbiAgICAgICAgaWYgKCFhcnJheSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuc2l6ZShudWxsLCBjdHgpICogdXRpbHMkMS5yZXNvbHZlTGVuZ3RoKHRoaXMubGVuZ3RoLCBudWxsLCBjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2l6ZSA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIGluc3RhbmNlb2YgTnVtYmVyVCkge1xuICAgICAgICAgIHNpemUgKz0gdGhpcy5sZW5ndGguc2l6ZSgpO1xuICAgICAgICAgIGN0eCA9IHtcbiAgICAgICAgICAgIHBhcmVudDogY3R4XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gYXJyYXkubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICBpdGVtID0gYXJyYXlbX2ldO1xuICAgICAgICAgIHNpemUgKz0gdGhpcy50eXBlLnNpemUoaXRlbSwgY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaXplO1xuICAgICAgfTtcblxuICAgICAgQXJyYXlULnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBhcnJheSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBjdHgsIGksIGl0ZW0sIHB0ciwgX2ksIF9sZW47XG5cbiAgICAgICAgY3R4ID0gcGFyZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCBpbnN0YW5jZW9mIE51bWJlclQpIHtcbiAgICAgICAgICBjdHggPSB7XG4gICAgICAgICAgICBwb2ludGVyczogW10sXG4gICAgICAgICAgICBzdGFydE9mZnNldDogc3RyZWFtLnBvcyxcbiAgICAgICAgICAgIHBhcmVudDogcGFyZW50XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjdHgucG9pbnRlck9mZnNldCA9IHN0cmVhbS5wb3MgKyB0aGlzLnNpemUoYXJyYXksIGN0eCk7XG4gICAgICAgICAgdGhpcy5sZW5ndGguZW5jb2RlKHN0cmVhbSwgYXJyYXkubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gYXJyYXkubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICBpdGVtID0gYXJyYXlbX2ldO1xuICAgICAgICAgIHRoaXMudHlwZS5lbmNvZGUoc3RyZWFtLCBpdGVtLCBjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIGluc3RhbmNlb2YgTnVtYmVyVCkge1xuICAgICAgICAgIGkgPSAwO1xuXG4gICAgICAgICAgd2hpbGUgKGkgPCBjdHgucG9pbnRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwdHIgPSBjdHgucG9pbnRlcnNbaSsrXTtcbiAgICAgICAgICAgIHB0ci50eXBlLmVuY29kZShzdHJlYW0sIHB0ci52YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIEFycmF5VDtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IEFycmF5VDtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIExhenlBcnJheSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBBcnJheVQsXG4gICAgICAgIExhenlBcnJheSxcbiAgICAgICAgTGF6eUFycmF5VCxcbiAgICAgICAgTnVtYmVyVCxcbiAgICAgICAgaW5zcGVjdCxcbiAgICAgICAgdXRpbHMkMSxcbiAgICAgICAgX19oYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHksXG4gICAgICAgIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uIF9fZXh0ZW5kcyhjaGlsZCwgcGFyZW50KSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7XG4gICAgICAgIGlmIChfX2hhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY3RvcigpIHtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgICAgfVxuXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpO1xuICAgICAgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuXG4gICAgQXJyYXlUID0gX0FycmF5O1xuICAgIE51bWJlclQgPSBfTnVtYmVyLk51bWJlcjtcbiAgICB1dGlscyQxID0gdXRpbHM7XG4gICAgaW5zcGVjdCA9IHJlcXVpcmUkJDMuaW5zcGVjdDtcblxuICAgIExhenlBcnJheVQgPSBmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMoTGF6eUFycmF5VCwgX3N1cGVyKTtcblxuICAgICAgZnVuY3Rpb24gTGF6eUFycmF5VCgpIHtcbiAgICAgICAgcmV0dXJuIExhenlBcnJheVQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIExhenlBcnJheVQucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHBhcmVudCkge1xuICAgICAgICB2YXIgbGVuZ3RoLCBwb3MsIHJlcztcbiAgICAgICAgcG9zID0gc3RyZWFtLnBvcztcbiAgICAgICAgbGVuZ3RoID0gdXRpbHMkMS5yZXNvbHZlTGVuZ3RoKHRoaXMubGVuZ3RoLCBzdHJlYW0sIHBhcmVudCk7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIGluc3RhbmNlb2YgTnVtYmVyVCkge1xuICAgICAgICAgIHBhcmVudCA9IHtcbiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICAgICAgX3N0YXJ0T2Zmc2V0OiBwb3MsXG4gICAgICAgICAgICBfY3VycmVudE9mZnNldDogMCxcbiAgICAgICAgICAgIF9sZW5ndGg6IGxlbmd0aFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXMgPSBuZXcgTGF6eUFycmF5KHRoaXMudHlwZSwgbGVuZ3RoLCBzdHJlYW0sIHBhcmVudCk7XG4gICAgICAgIHN0cmVhbS5wb3MgKz0gbGVuZ3RoICogdGhpcy50eXBlLnNpemUobnVsbCwgcGFyZW50KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH07XG5cbiAgICAgIExhenlBcnJheVQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAodmFsLCBjdHgpIHtcbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIExhenlBcnJheSkge1xuICAgICAgICAgIHZhbCA9IHZhbC50b0FycmF5KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gTGF6eUFycmF5VC5fX3N1cGVyX18uc2l6ZS5jYWxsKHRoaXMsIHZhbCwgY3R4KTtcbiAgICAgIH07XG5cbiAgICAgIExhenlBcnJheVQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHZhbCwgY3R4KSB7XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBMYXp5QXJyYXkpIHtcbiAgICAgICAgICB2YWwgPSB2YWwudG9BcnJheSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIExhenlBcnJheVQuX19zdXBlcl9fLmVuY29kZS5jYWxsKHRoaXMsIHN0cmVhbSwgdmFsLCBjdHgpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIExhenlBcnJheVQ7XG4gICAgfShBcnJheVQpO1xuXG4gICAgTGF6eUFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gTGF6eUFycmF5KHR5cGUsIGxlbmd0aCwgc3RyZWFtLCBjdHgpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICB0aGlzLmN0eCA9IGN0eDtcbiAgICAgICAgdGhpcy5iYXNlID0gdGhpcy5zdHJlYW0ucG9zO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICB9XG5cbiAgICAgIExhenlBcnJheS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBwb3M7XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pdGVtc1tpbmRleF0gPT0gbnVsbCkge1xuICAgICAgICAgIHBvcyA9IHRoaXMuc3RyZWFtLnBvcztcbiAgICAgICAgICB0aGlzLnN0cmVhbS5wb3MgPSB0aGlzLmJhc2UgKyB0aGlzLnR5cGUuc2l6ZShudWxsLCB0aGlzLmN0eCkgKiBpbmRleDtcbiAgICAgICAgICB0aGlzLml0ZW1zW2luZGV4XSA9IHRoaXMudHlwZS5kZWNvZGUodGhpcy5zdHJlYW0sIHRoaXMuY3R4KTtcbiAgICAgICAgICB0aGlzLnN0cmVhbS5wb3MgPSBwb3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1tpbmRleF07XG4gICAgICB9O1xuXG4gICAgICBMYXp5QXJyYXkucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpLCBfaSwgX3JlZiwgX3Jlc3VsdHM7XG5cbiAgICAgICAgX3Jlc3VsdHMgPSBbXTtcblxuICAgICAgICBmb3IgKGkgPSBfaSA9IDAsIF9yZWYgPSB0aGlzLmxlbmd0aDsgX2kgPCBfcmVmOyBpID0gX2kgKz0gMSkge1xuICAgICAgICAgIF9yZXN1bHRzLnB1c2godGhpcy5nZXQoaSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9yZXN1bHRzO1xuICAgICAgfTtcblxuICAgICAgTGF6eUFycmF5LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaW5zcGVjdCh0aGlzLnRvQXJyYXkoKSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gTGF6eUFycmF5O1xuICAgIH0oKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gTGF6eUFycmF5VDtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIEJpdGZpZWxkID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIEJpdGZpZWxkO1xuXG4gICAgQml0ZmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBCaXRmaWVsZCh0eXBlLCBmbGFncykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3MgIT0gbnVsbCA/IGZsYWdzIDogW107XG4gICAgICB9XG5cbiAgICAgIEJpdGZpZWxkLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgICAgIHZhciBmbGFnLCBpLCByZXMsIHZhbCwgX2ksIF9sZW4sIF9yZWY7XG5cbiAgICAgICAgdmFsID0gdGhpcy50eXBlLmRlY29kZShzdHJlYW0pO1xuICAgICAgICByZXMgPSB7fTtcbiAgICAgICAgX3JlZiA9IHRoaXMuZmxhZ3M7XG5cbiAgICAgICAgZm9yIChpID0gX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgaSA9ICsrX2kpIHtcbiAgICAgICAgICBmbGFnID0gX3JlZltpXTtcblxuICAgICAgICAgIGlmIChmbGFnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlc1tmbGFnXSA9ICEhKHZhbCAmIDEgPDwgaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH07XG5cbiAgICAgIEJpdGZpZWxkLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNpemUoKTtcbiAgICAgIH07XG5cbiAgICAgIEJpdGZpZWxkLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBrZXlzKSB7XG4gICAgICAgIHZhciBmbGFnLCBpLCB2YWwsIF9pLCBfbGVuLCBfcmVmO1xuXG4gICAgICAgIHZhbCA9IDA7XG4gICAgICAgIF9yZWYgPSB0aGlzLmZsYWdzO1xuXG4gICAgICAgIGZvciAoaSA9IF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IGkgPSArK19pKSB7XG4gICAgICAgICAgZmxhZyA9IF9yZWZbaV07XG5cbiAgICAgICAgICBpZiAoZmxhZyAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoa2V5c1tmbGFnXSkge1xuICAgICAgICAgICAgICB2YWwgfD0gMSA8PCBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuZW5jb2RlKHN0cmVhbSwgdmFsKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBCaXRmaWVsZDtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IEJpdGZpZWxkO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgX0Jvb2xlYW4gPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgQm9vbGVhblQ7XG5cbiAgICBCb29sZWFuVCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEJvb2xlYW5UKHR5cGUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgIH1cblxuICAgICAgQm9vbGVhblQucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHBhcmVudCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSwgcGFyZW50KTtcbiAgICAgIH07XG5cbiAgICAgIEJvb2xlYW5ULnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKHZhbCwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuc2l6ZSh2YWwsIHBhcmVudCk7XG4gICAgICB9O1xuXG4gICAgICBCb29sZWFuVC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgdmFsLCBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5lbmNvZGUoc3RyZWFtLCArdmFsLCBwYXJlbnQpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIEJvb2xlYW5UO1xuICAgIH0oKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gQm9vbGVhblQ7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBCdWZmZXIkOCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBCdWZmZXJULCBOdW1iZXJULCB1dGlscyQxO1xuICAgIHV0aWxzJDEgPSB1dGlscztcbiAgICBOdW1iZXJUID0gX051bWJlci5OdW1iZXI7XG5cbiAgICBCdWZmZXJUID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gQnVmZmVyVChsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIEJ1ZmZlclQucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHBhcmVudCkge1xuICAgICAgICB2YXIgbGVuZ3RoO1xuICAgICAgICBsZW5ndGggPSB1dGlscyQxLnJlc29sdmVMZW5ndGgodGhpcy5sZW5ndGgsIHN0cmVhbSwgcGFyZW50KTtcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCk7XG4gICAgICB9O1xuXG4gICAgICBCdWZmZXJULnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKHZhbCwgcGFyZW50KSB7XG4gICAgICAgIGlmICghdmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHV0aWxzJDEucmVzb2x2ZUxlbmd0aCh0aGlzLmxlbmd0aCwgbnVsbCwgcGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWwubGVuZ3RoO1xuICAgICAgfTtcblxuICAgICAgQnVmZmVyVC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgYnVmLCBwYXJlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIGluc3RhbmNlb2YgTnVtYmVyVCkge1xuICAgICAgICAgIHRoaXMubGVuZ3RoLmVuY29kZShzdHJlYW0sIGJ1Zi5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cmVhbS53cml0ZUJ1ZmZlcihidWYpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIEJ1ZmZlclQ7XG4gICAgfSgpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBCdWZmZXJUO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgRW51bSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBFbnVtO1xuXG4gICAgRW51bSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEVudW0odHlwZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDogW107XG4gICAgICB9XG5cbiAgICAgIEVudW0ucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICAgICAgdmFyIGluZGV4O1xuICAgICAgICBpbmRleCA9IHRoaXMudHlwZS5kZWNvZGUoc3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1tpbmRleF0gfHwgaW5kZXg7XG4gICAgICB9O1xuXG4gICAgICBFbnVtLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNpemUoKTtcbiAgICAgIH07XG5cbiAgICAgIEVudW0ucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHZhbCkge1xuICAgICAgICB2YXIgaW5kZXg7XG4gICAgICAgIGluZGV4ID0gdGhpcy5vcHRpb25zLmluZGV4T2YodmFsKTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcHRpb24gaW4gZW51bTogXCIgKyB2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5lbmNvZGUoc3RyZWFtLCBpbmRleCk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gRW51bTtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IEVudW07XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBPcHRpb25hbCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBPcHRpb25hbDtcblxuICAgIE9wdGlvbmFsID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gT3B0aW9uYWwodHlwZSwgY29uZGl0aW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uICE9IG51bGwgPyBjb25kaXRpb24gOiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBPcHRpb25hbC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBjb25kaXRpb247XG4gICAgICAgIGNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmNhbGwocGFyZW50LCBwYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSwgcGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgT3B0aW9uYWwucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAodmFsLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGNvbmRpdGlvbjtcbiAgICAgICAgY29uZGl0aW9uID0gdGhpcy5jb25kaXRpb247XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uY2FsbChwYXJlbnQsIHBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zaXplKHZhbCwgcGFyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgT3B0aW9uYWwucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHZhbCwgcGFyZW50KSB7XG4gICAgICAgIHZhciBjb25kaXRpb247XG4gICAgICAgIGNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmNhbGwocGFyZW50LCBwYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuZW5jb2RlKHN0cmVhbSwgdmFsLCBwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gT3B0aW9uYWw7XG4gICAgfSgpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBPcHRpb25hbDtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIFJlc2VydmVkID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIFJlc2VydmVkLCB1dGlscyQxO1xuICAgIHV0aWxzJDEgPSB1dGlscztcblxuICAgIFJlc2VydmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gUmVzZXJ2ZWQodHlwZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50ICE9IG51bGwgPyBjb3VudCA6IDE7XG4gICAgICB9XG5cbiAgICAgIFJlc2VydmVkLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICAgICAgc3RyZWFtLnBvcyArPSB0aGlzLnNpemUobnVsbCwgcGFyZW50KTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgIH07XG5cbiAgICAgIFJlc2VydmVkLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKGRhdGEsIHBhcmVudCkge1xuICAgICAgICB2YXIgY291bnQ7XG4gICAgICAgIGNvdW50ID0gdXRpbHMkMS5yZXNvbHZlTGVuZ3RoKHRoaXMuY291bnQsIG51bGwsIHBhcmVudCk7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuc2l6ZSgpICogY291bnQ7XG4gICAgICB9O1xuXG4gICAgICBSZXNlcnZlZC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgdmFsLCBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5maWxsKDAsIHRoaXMuc2l6ZSh2YWwsIHBhcmVudCkpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFJlc2VydmVkO1xuICAgIH0oKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gUmVzZXJ2ZWQ7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBfU3RyaW5nID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIE51bWJlclQsIFN0cmluZ1QsIHV0aWxzJDE7XG4gICAgTnVtYmVyVCA9IF9OdW1iZXIuTnVtYmVyO1xuICAgIHV0aWxzJDEgPSB1dGlscztcblxuICAgIFN0cmluZ1QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBTdHJpbmdUKGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZyAhPSBudWxsID8gZW5jb2RpbmcgOiAnYXNjaWknO1xuICAgICAgfVxuXG4gICAgICBTdHJpbmdULnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciwgZW5jb2RpbmcsIGxlbmd0aCwgcG9zLCBzdHJpbmc7XG5cbiAgICAgICAgbGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMkMS5yZXNvbHZlTGVuZ3RoKHRoaXMubGVuZ3RoLCBzdHJlYW0sIHBhcmVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IHN0cmVhbS5idWZmZXIsIGxlbmd0aCA9IHN0cmVhbS5sZW5ndGgsIHBvcyA9IHN0cmVhbS5wb3M7XG5cbiAgICAgICAgICAgIHdoaWxlIChwb3MgPCBsZW5ndGggJiYgYnVmZmVyW3Bvc10gIT09IDB4MDApIHtcbiAgICAgICAgICAgICAgKytwb3M7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwb3MgLSBzdHJlYW0ucG9zO1xuICAgICAgICAgIH1cbiAgICAgICAgfS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGVuY29kaW5nID0gdGhpcy5lbmNvZGluZztcblxuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy5jYWxsKHBhcmVudCwgcGFyZW50KSB8fCAnYXNjaWknO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyaW5nID0gc3RyZWFtLnJlYWRTdHJpbmcobGVuZ3RoLCBlbmNvZGluZyk7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09IG51bGwgJiYgc3RyZWFtLnBvcyA8IHN0cmVhbS5sZW5ndGgpIHtcbiAgICAgICAgICBzdHJlYW0ucG9zKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfTtcblxuICAgICAgU3RyaW5nVC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICh2YWwsIHBhcmVudCkge1xuICAgICAgICB2YXIgZW5jb2RpbmcsIHNpemU7XG5cbiAgICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgICByZXR1cm4gdXRpbHMkMS5yZXNvbHZlTGVuZ3RoKHRoaXMubGVuZ3RoLCBudWxsLCBwYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5jb2RpbmcgPSB0aGlzLmVuY29kaW5nO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLmNhbGwocGFyZW50ICE9IG51bGwgPyBwYXJlbnQudmFsIDogdm9pZCAwLCBwYXJlbnQgIT0gbnVsbCA/IHBhcmVudC52YWwgOiB2b2lkIDApIHx8ICdhc2NpaSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5jb2RpbmcgPT09ICd1dGYxNmJlJykge1xuICAgICAgICAgIGVuY29kaW5nID0gJ3V0ZjE2bGUnO1xuICAgICAgICB9XG5cbiAgICAgICAgc2l6ZSA9IGJ1ZmZlcl8xLmJ5dGVMZW5ndGgodmFsLCBlbmNvZGluZyk7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIGluc3RhbmNlb2YgTnVtYmVyVCkge1xuICAgICAgICAgIHNpemUgKz0gdGhpcy5sZW5ndGguc2l6ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09IG51bGwpIHtcbiAgICAgICAgICBzaXplKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgIH07XG5cbiAgICAgIFN0cmluZ1QucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHZhbCwgcGFyZW50KSB7XG4gICAgICAgIHZhciBlbmNvZGluZztcbiAgICAgICAgZW5jb2RpbmcgPSB0aGlzLmVuY29kaW5nO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLmNhbGwocGFyZW50ICE9IG51bGwgPyBwYXJlbnQudmFsIDogdm9pZCAwLCBwYXJlbnQgIT0gbnVsbCA/IHBhcmVudC52YWwgOiB2b2lkIDApIHx8ICdhc2NpaSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggaW5zdGFuY2VvZiBOdW1iZXJUKSB7XG4gICAgICAgICAgdGhpcy5sZW5ndGguZW5jb2RlKHN0cmVhbSwgYnVmZmVyXzEuYnl0ZUxlbmd0aCh2YWwsIGVuY29kaW5nKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0ud3JpdGVTdHJpbmcodmFsLCBlbmNvZGluZyk7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtLndyaXRlVUludDgoMHgwMCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBTdHJpbmdUO1xuICAgIH0oKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gU3RyaW5nVDtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIFN0cnVjdCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBTdHJ1Y3QsIHV0aWxzJDE7XG4gICAgdXRpbHMkMSA9IHV0aWxzO1xuXG4gICAgU3RydWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gU3RydWN0KGZpZWxkcykge1xuICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcyAhPSBudWxsID8gZmllbGRzIDoge307XG4gICAgICB9XG5cbiAgICAgIFN0cnVjdC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgcGFyZW50LCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlcywgX3JlZjtcblxuICAgICAgICBpZiAobGVuZ3RoID09IG51bGwpIHtcbiAgICAgICAgICBsZW5ndGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzID0gdGhpcy5fc2V0dXAoc3RyZWFtLCBwYXJlbnQsIGxlbmd0aCk7XG5cbiAgICAgICAgdGhpcy5fcGFyc2VGaWVsZHMoc3RyZWFtLCByZXMsIHRoaXMuZmllbGRzKTtcblxuICAgICAgICBpZiAoKF9yZWYgPSB0aGlzLnByb2Nlc3MpICE9IG51bGwpIHtcbiAgICAgICAgICBfcmVmLmNhbGwocmVzLCBzdHJlYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH07XG5cbiAgICAgIFN0cnVjdC5wcm90b3R5cGUuX3NldHVwID0gZnVuY3Rpb24gKHN0cmVhbSwgcGFyZW50LCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlcztcbiAgICAgICAgcmVzID0ge307XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJlcywge1xuICAgICAgICAgIHBhcmVudDoge1xuICAgICAgICAgICAgdmFsdWU6IHBhcmVudFxuICAgICAgICAgIH0sXG4gICAgICAgICAgX3N0YXJ0T2Zmc2V0OiB7XG4gICAgICAgICAgICB2YWx1ZTogc3RyZWFtLnBvc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgX2N1cnJlbnRPZmZzZXQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9sZW5ndGg6IHtcbiAgICAgICAgICAgIHZhbHVlOiBsZW5ndGhcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfTtcblxuICAgICAgU3RydWN0LnByb3RvdHlwZS5fcGFyc2VGaWVsZHMgPSBmdW5jdGlvbiAoc3RyZWFtLCByZXMsIGZpZWxkcykge1xuICAgICAgICB2YXIga2V5LCB0eXBlLCB2YWw7XG5cbiAgICAgICAgZm9yIChrZXkgaW4gZmllbGRzKSB7XG4gICAgICAgICAgdHlwZSA9IGZpZWxkc1trZXldO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwgPSB0eXBlLmNhbGwocmVzLCByZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWwgPSB0eXBlLmRlY29kZShzdHJlYW0sIHJlcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgdXRpbHMkMS5Qcm9wZXJ0eURlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcywga2V5LCB2YWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzW2tleV0gPSB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzLl9jdXJyZW50T2Zmc2V0ID0gc3RyZWFtLnBvcyAtIHJlcy5fc3RhcnRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIFN0cnVjdC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICh2YWwsIHBhcmVudCwgaW5jbHVkZVBvaW50ZXJzKSB7XG4gICAgICAgIHZhciBjdHgsIGtleSwgc2l6ZSwgdHlwZSwgX3JlZjtcblxuICAgICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgICB2YWwgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNsdWRlUG9pbnRlcnMgPT0gbnVsbCkge1xuICAgICAgICAgIGluY2x1ZGVQb2ludGVycyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjdHggPSB7XG4gICAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgdmFsOiB2YWwsXG4gICAgICAgICAgcG9pbnRlclNpemU6IDBcbiAgICAgICAgfTtcbiAgICAgICAgc2l6ZSA9IDA7XG4gICAgICAgIF9yZWYgPSB0aGlzLmZpZWxkcztcblxuICAgICAgICBmb3IgKGtleSBpbiBfcmVmKSB7XG4gICAgICAgICAgdHlwZSA9IF9yZWZba2V5XTtcblxuICAgICAgICAgIGlmICh0eXBlLnNpemUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2l6ZSArPSB0eXBlLnNpemUodmFsW2tleV0sIGN0eCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluY2x1ZGVQb2ludGVycykge1xuICAgICAgICAgIHNpemUgKz0gY3R4LnBvaW50ZXJTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICB9O1xuXG4gICAgICBTdHJ1Y3QucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHZhbCwgcGFyZW50KSB7XG4gICAgICAgIHZhciBjdHgsIGksIGtleSwgcHRyLCB0eXBlLCBfcmVmLCBfcmVmMTtcblxuICAgICAgICBpZiAoKF9yZWYgPSB0aGlzLnByZUVuY29kZSkgIT0gbnVsbCkge1xuICAgICAgICAgIF9yZWYuY2FsbCh2YWwsIHN0cmVhbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjdHggPSB7XG4gICAgICAgICAgcG9pbnRlcnM6IFtdLFxuICAgICAgICAgIHN0YXJ0T2Zmc2V0OiBzdHJlYW0ucG9zLFxuICAgICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICAgIHZhbDogdmFsLFxuICAgICAgICAgIHBvaW50ZXJTaXplOiAwXG4gICAgICAgIH07XG4gICAgICAgIGN0eC5wb2ludGVyT2Zmc2V0ID0gc3RyZWFtLnBvcyArIHRoaXMuc2l6ZSh2YWwsIGN0eCwgZmFsc2UpO1xuICAgICAgICBfcmVmMSA9IHRoaXMuZmllbGRzO1xuXG4gICAgICAgIGZvciAoa2V5IGluIF9yZWYxKSB7XG4gICAgICAgICAgdHlwZSA9IF9yZWYxW2tleV07XG5cbiAgICAgICAgICBpZiAodHlwZS5lbmNvZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdHlwZS5lbmNvZGUoc3RyZWFtLCB2YWxba2V5XSwgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpID0gMDtcblxuICAgICAgICB3aGlsZSAoaSA8IGN0eC5wb2ludGVycy5sZW5ndGgpIHtcbiAgICAgICAgICBwdHIgPSBjdHgucG9pbnRlcnNbaSsrXTtcbiAgICAgICAgICBwdHIudHlwZS5lbmNvZGUoc3RyZWFtLCBwdHIudmFsLCBwdHIucGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFN0cnVjdDtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IFN0cnVjdDtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIFZlcnNpb25lZFN0cnVjdCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBTdHJ1Y3QkMSxcbiAgICAgICAgVmVyc2lvbmVkU3RydWN0LFxuICAgICAgICBfX2hhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgICAgX19leHRlbmRzID0gZnVuY3Rpb24gX19leHRlbmRzKGNoaWxkLCBwYXJlbnQpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHtcbiAgICAgICAgaWYgKF9faGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjdG9yKCkge1xuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7XG4gICAgICB9XG5cbiAgICAgIGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICAgIGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7XG4gICAgICBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlO1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICBTdHJ1Y3QkMSA9IFN0cnVjdDtcblxuICAgIFZlcnNpb25lZFN0cnVjdCA9IGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyhWZXJzaW9uZWRTdHJ1Y3QsIF9zdXBlcik7XG5cbiAgICAgIGZ1bmN0aW9uIFZlcnNpb25lZFN0cnVjdCh0eXBlLCB2ZXJzaW9ucykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZlcnNpb25zID0gdmVyc2lvbnMgIT0gbnVsbCA/IHZlcnNpb25zIDoge307XG4gICAgICB9XG5cbiAgICAgIFZlcnNpb25lZFN0cnVjdC5wcm90b3R5cGUudmVyc2lvbkdldHRlciA9IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zcGxpdCgnLicpLnJlZHVjZShmdW5jdGlvbiAob2JqLCBwcm9wKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9ialtwcm9wXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgcGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgVmVyc2lvbmVkU3RydWN0LnByb3RvdHlwZS52ZXJzaW9uU2V0dGVyID0gZnVuY3Rpb24gKHBhcmVudCwgdmVyc2lvbikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNwbGl0KCcuJykucmVkdWNlKGZ1bmN0aW9uIChvYmosIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBvYmpbcHJvcF0gPSB2ZXJzaW9uO1xuICAgICAgICAgIH0sIHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIFZlcnNpb25lZFN0cnVjdC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgcGFyZW50LCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGZpZWxkcywgcmVzLCBfcmVmO1xuXG4gICAgICAgIGlmIChsZW5ndGggPT0gbnVsbCkge1xuICAgICAgICAgIGxlbmd0aCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXMgPSB0aGlzLl9zZXR1cChzdHJlYW0sIHBhcmVudCwgbGVuZ3RoKTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXMudmVyc2lvbiA9IHRoaXMudmVyc2lvbkdldHRlcihwYXJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcy52ZXJzaW9uID0gdGhpcy50eXBlLmRlY29kZShzdHJlYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbnMuaGVhZGVyKSB7XG4gICAgICAgICAgdGhpcy5fcGFyc2VGaWVsZHMoc3RyZWFtLCByZXMsIHRoaXMudmVyc2lvbnMuaGVhZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkcyA9IHRoaXMudmVyc2lvbnNbcmVzLnZlcnNpb25dO1xuXG4gICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdmVyc2lvbiBcIiArIHJlcy52ZXJzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZHMgaW5zdGFuY2VvZiBWZXJzaW9uZWRTdHJ1Y3QpIHtcbiAgICAgICAgICByZXR1cm4gZmllbGRzLmRlY29kZShzdHJlYW0sIHBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wYXJzZUZpZWxkcyhzdHJlYW0sIHJlcywgZmllbGRzKTtcblxuICAgICAgICBpZiAoKF9yZWYgPSB0aGlzLnByb2Nlc3MpICE9IG51bGwpIHtcbiAgICAgICAgICBfcmVmLmNhbGwocmVzLCBzdHJlYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH07XG5cbiAgICAgIFZlcnNpb25lZFN0cnVjdC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICh2YWwsIHBhcmVudCwgaW5jbHVkZVBvaW50ZXJzKSB7XG4gICAgICAgIHZhciBjdHgsIGZpZWxkcywga2V5LCBzaXplLCB0eXBlLCBfcmVmO1xuXG4gICAgICAgIGlmIChpbmNsdWRlUG9pbnRlcnMgPT0gbnVsbCkge1xuICAgICAgICAgIGluY2x1ZGVQb2ludGVycyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgZml4ZWQgc2l6ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3R4ID0ge1xuICAgICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICAgIHZhbDogdmFsLFxuICAgICAgICAgIHBvaW50ZXJTaXplOiAwXG4gICAgICAgIH07XG4gICAgICAgIHNpemUgPSAwO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHNpemUgKz0gdGhpcy50eXBlLnNpemUodmFsLnZlcnNpb24sIGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52ZXJzaW9ucy5oZWFkZXIpIHtcbiAgICAgICAgICBfcmVmID0gdGhpcy52ZXJzaW9ucy5oZWFkZXI7XG5cbiAgICAgICAgICBmb3IgKGtleSBpbiBfcmVmKSB7XG4gICAgICAgICAgICB0eXBlID0gX3JlZltrZXldO1xuXG4gICAgICAgICAgICBpZiAodHlwZS5zaXplICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgc2l6ZSArPSB0eXBlLnNpemUodmFsW2tleV0sIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmllbGRzID0gdGhpcy52ZXJzaW9uc1t2YWwudmVyc2lvbl07XG5cbiAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB2ZXJzaW9uIFwiICsgdmFsLnZlcnNpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChrZXkgaW4gZmllbGRzKSB7XG4gICAgICAgICAgdHlwZSA9IGZpZWxkc1trZXldO1xuXG4gICAgICAgICAgaWYgKHR5cGUuc2l6ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBzaXplICs9IHR5cGUuc2l6ZSh2YWxba2V5XSwgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5jbHVkZVBvaW50ZXJzKSB7XG4gICAgICAgICAgc2l6ZSArPSBjdHgucG9pbnRlclNpemU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgIH07XG5cbiAgICAgIFZlcnNpb25lZFN0cnVjdC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgdmFsLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGN0eCwgZmllbGRzLCBpLCBrZXksIHB0ciwgdHlwZSwgX3JlZiwgX3JlZjE7XG5cbiAgICAgICAgaWYgKChfcmVmID0gdGhpcy5wcmVFbmNvZGUpICE9IG51bGwpIHtcbiAgICAgICAgICBfcmVmLmNhbGwodmFsLCBzdHJlYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY3R4ID0ge1xuICAgICAgICAgIHBvaW50ZXJzOiBbXSxcbiAgICAgICAgICBzdGFydE9mZnNldDogc3RyZWFtLnBvcyxcbiAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICB2YWw6IHZhbCxcbiAgICAgICAgICBwb2ludGVyU2l6ZTogMFxuICAgICAgICB9O1xuICAgICAgICBjdHgucG9pbnRlck9mZnNldCA9IHN0cmVhbS5wb3MgKyB0aGlzLnNpemUodmFsLCBjdHgsIGZhbHNlKTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLnR5cGUuZW5jb2RlKHN0cmVhbSwgdmFsLnZlcnNpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbnMuaGVhZGVyKSB7XG4gICAgICAgICAgX3JlZjEgPSB0aGlzLnZlcnNpb25zLmhlYWRlcjtcblxuICAgICAgICAgIGZvciAoa2V5IGluIF9yZWYxKSB7XG4gICAgICAgICAgICB0eXBlID0gX3JlZjFba2V5XTtcblxuICAgICAgICAgICAgaWYgKHR5cGUuZW5jb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdHlwZS5lbmNvZGUoc3RyZWFtLCB2YWxba2V5XSwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZHMgPSB0aGlzLnZlcnNpb25zW3ZhbC52ZXJzaW9uXTtcblxuICAgICAgICBmb3IgKGtleSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICB0eXBlID0gZmllbGRzW2tleV07XG5cbiAgICAgICAgICBpZiAodHlwZS5lbmNvZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdHlwZS5lbmNvZGUoc3RyZWFtLCB2YWxba2V5XSwgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpID0gMDtcblxuICAgICAgICB3aGlsZSAoaSA8IGN0eC5wb2ludGVycy5sZW5ndGgpIHtcbiAgICAgICAgICBwdHIgPSBjdHgucG9pbnRlcnNbaSsrXTtcbiAgICAgICAgICBwdHIudHlwZS5lbmNvZGUoc3RyZWFtLCBwdHIudmFsLCBwdHIucGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFZlcnNpb25lZFN0cnVjdDtcbiAgICB9KFN0cnVjdCQxKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gVmVyc2lvbmVkU3RydWN0O1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgUG9pbnRlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBQb2ludGVyLCBWb2lkUG9pbnRlciwgdXRpbHMkMTtcbiAgICB1dGlscyQxID0gdXRpbHM7XG5cbiAgICBQb2ludGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gUG9pbnRlcihvZmZzZXRUeXBlLCB0eXBlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYmFzZSwgX2Jhc2UxLCBfYmFzZTIsIF9iYXNlMztcblxuICAgICAgICB0aGlzLm9mZnNldFR5cGUgPSBvZmZzZXRUeXBlO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDoge307XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3ZvaWQnKSB7XG4gICAgICAgICAgdGhpcy50eXBlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoX2Jhc2UgPSB0aGlzLm9wdGlvbnMpLnR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgIF9iYXNlLnR5cGUgPSAnbG9jYWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChfYmFzZTEgPSB0aGlzLm9wdGlvbnMpLmFsbG93TnVsbCA9PSBudWxsKSB7XG4gICAgICAgICAgX2Jhc2UxLmFsbG93TnVsbCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKF9iYXNlMiA9IHRoaXMub3B0aW9ucykubnVsbFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICBfYmFzZTIubnVsbFZhbHVlID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoX2Jhc2UzID0gdGhpcy5vcHRpb25zKS5sYXp5ID09IG51bGwpIHtcbiAgICAgICAgICBfYmFzZTMubGF6eSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIFBvaW50ZXIucHJvdG90eXBlLnJlbGF0aXZlVG9HZXR0ZXIgPSBmdW5jdGlvbiAoY3R4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMucmVsYXRpdmVUby5zcGxpdCgnLicpLnJlZHVjZShmdW5jdGlvbiAob2JqLCBwcm9wKSB7XG4gICAgICAgICAgcmV0dXJuIG9ialtwcm9wXTtcbiAgICAgICAgfSwgY3R4KTtcbiAgICAgIH07XG5cbiAgICAgIFBvaW50ZXIucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIGN0eCkge1xuICAgICAgICB2YXIgYywgZGVjb2RlVmFsdWUsIG9mZnNldCwgcHRyLCByZWxhdGl2ZSwgdmFsO1xuICAgICAgICBvZmZzZXQgPSB0aGlzLm9mZnNldFR5cGUuZGVjb2RlKHN0cmVhbSwgY3R4KTtcblxuICAgICAgICBpZiAob2Zmc2V0ID09PSB0aGlzLm9wdGlvbnMubnVsbFZhbHVlICYmIHRoaXMub3B0aW9ucy5hbGxvd051bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlbGF0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2xvY2FsJzpcbiAgICAgICAgICAgICAgcmV0dXJuIGN0eC5fc3RhcnRPZmZzZXQ7XG5cbiAgICAgICAgICAgIGNhc2UgJ2ltbWVkaWF0ZSc6XG4gICAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucG9zIC0gdGhpcy5vZmZzZXRUeXBlLnNpemUoKTtcblxuICAgICAgICAgICAgY2FzZSAncGFyZW50JzpcbiAgICAgICAgICAgICAgcmV0dXJuIGN0eC5wYXJlbnQuX3N0YXJ0T2Zmc2V0O1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBjID0gY3R4O1xuXG4gICAgICAgICAgICAgIHdoaWxlIChjLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGMgPSBjLnBhcmVudDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBjLl9zdGFydE9mZnNldCB8fCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVsYXRpdmVUbykge1xuICAgICAgICAgIHJlbGF0aXZlICs9IHRoaXMucmVsYXRpdmVUb0dldHRlcihjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHRyID0gb2Zmc2V0ICsgcmVsYXRpdmU7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFsID0gbnVsbDtcblxuICAgICAgICAgIGRlY29kZVZhbHVlID0gZnVuY3Rpb24gKF90aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgcG9zO1xuXG4gICAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBwb3MgPSBzdHJlYW0ucG9zO1xuICAgICAgICAgICAgICBzdHJlYW0ucG9zID0gcHRyO1xuICAgICAgICAgICAgICB2YWwgPSBfdGhpcy50eXBlLmRlY29kZShzdHJlYW0sIGN0eCk7XG4gICAgICAgICAgICAgIHN0cmVhbS5wb3MgPSBwb3M7XG4gICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0odGhpcyk7XG5cbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxhenkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgdXRpbHMkMS5Qcm9wZXJ0eURlc2NyaXB0b3Ioe1xuICAgICAgICAgICAgICBnZXQ6IGRlY29kZVZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZGVjb2RlVmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcHRyO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBQb2ludGVyLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKHZhbCwgY3R4KSB7XG4gICAgICAgIHZhciBwYXJlbnQsIHR5cGU7XG4gICAgICAgIHBhcmVudCA9IGN0eDtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnbG9jYWwnOlxuICAgICAgICAgIGNhc2UgJ2ltbWVkaWF0ZSc6XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3BhcmVudCc6XG4gICAgICAgICAgICBjdHggPSBjdHgucGFyZW50O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgd2hpbGUgKGN0eC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgY3R4ID0gY3R4LnBhcmVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgdHlwZSA9IHRoaXMudHlwZTtcblxuICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKCEodmFsIGluc3RhbmNlb2YgVm9pZFBvaW50ZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IGJlIGEgVm9pZFBvaW50ZXJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHlwZSA9IHZhbC50eXBlO1xuICAgICAgICAgIHZhbCA9IHZhbC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWwgJiYgY3R4KSB7XG4gICAgICAgICAgY3R4LnBvaW50ZXJTaXplICs9IHR5cGUuc2l6ZSh2YWwsIHBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXRUeXBlLnNpemUoKTtcbiAgICAgIH07XG5cbiAgICAgIFBvaW50ZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHZhbCwgY3R4KSB7XG4gICAgICAgIHZhciBwYXJlbnQsIHJlbGF0aXZlLCB0eXBlO1xuICAgICAgICBwYXJlbnQgPSBjdHg7XG5cbiAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5vZmZzZXRUeXBlLmVuY29kZShzdHJlYW0sIHRoaXMub3B0aW9ucy5udWxsVmFsdWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdsb2NhbCc6XG4gICAgICAgICAgICByZWxhdGl2ZSA9IGN0eC5zdGFydE9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnaW1tZWRpYXRlJzpcbiAgICAgICAgICAgIHJlbGF0aXZlID0gc3RyZWFtLnBvcyArIHRoaXMub2Zmc2V0VHlwZS5zaXplKHZhbCwgcGFyZW50KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAncGFyZW50JzpcbiAgICAgICAgICAgIGN0eCA9IGN0eC5wYXJlbnQ7XG4gICAgICAgICAgICByZWxhdGl2ZSA9IGN0eC5zdGFydE9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJlbGF0aXZlID0gMDtcblxuICAgICAgICAgICAgd2hpbGUgKGN0eC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgY3R4ID0gY3R4LnBhcmVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWxhdGl2ZVRvKSB7XG4gICAgICAgICAgcmVsYXRpdmUgKz0gdGhpcy5yZWxhdGl2ZVRvR2V0dGVyKHBhcmVudC52YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vZmZzZXRUeXBlLmVuY29kZShzdHJlYW0sIGN0eC5wb2ludGVyT2Zmc2V0IC0gcmVsYXRpdmUpO1xuICAgICAgICB0eXBlID0gdGhpcy50eXBlO1xuXG4gICAgICAgIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoISh2YWwgaW5zdGFuY2VvZiBWb2lkUG9pbnRlcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgYmUgYSBWb2lkUG9pbnRlclwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0eXBlID0gdmFsLnR5cGU7XG4gICAgICAgICAgdmFsID0gdmFsLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3R4LnBvaW50ZXJzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgdmFsOiB2YWwsXG4gICAgICAgICAgcGFyZW50OiBwYXJlbnRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjdHgucG9pbnRlck9mZnNldCArPSB0eXBlLnNpemUodmFsLCBwYXJlbnQpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFBvaW50ZXI7XG4gICAgfSgpO1xuXG4gICAgVm9pZFBvaW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBWb2lkUG9pbnRlcih0eXBlLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBWb2lkUG9pbnRlcjtcbiAgICB9KCk7XG5cbiAgICBleHBvcnRzLlBvaW50ZXIgPSBQb2ludGVyO1xuICAgIGV4cG9ydHMuVm9pZFBvaW50ZXIgPSBWb2lkUG9pbnRlcjtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcbnZhciBQb2ludGVyXzEgPSBQb2ludGVyLlBvaW50ZXI7XG52YXIgUG9pbnRlcl8yID0gUG9pbnRlci5Wb2lkUG9pbnRlcjtcblxudmFyIHJlc3RydWN0dXJlID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGtleSwgdmFsLCBfcmVmLCBfcmVmMTtcblxuICAgIGV4cG9ydHMuRW5jb2RlU3RyZWFtID0gRW5jb2RlU3RyZWFtO1xuICAgIGV4cG9ydHMuRGVjb2RlU3RyZWFtID0gRGVjb2RlU3RyZWFtO1xuICAgIGV4cG9ydHMuQXJyYXkgPSBfQXJyYXk7XG4gICAgZXhwb3J0cy5MYXp5QXJyYXkgPSBMYXp5QXJyYXk7XG4gICAgZXhwb3J0cy5CaXRmaWVsZCA9IEJpdGZpZWxkO1xuICAgIGV4cG9ydHMuQm9vbGVhbiA9IF9Cb29sZWFuO1xuICAgIGV4cG9ydHMuQnVmZmVyID0gQnVmZmVyJDg7XG4gICAgZXhwb3J0cy5FbnVtID0gRW51bTtcbiAgICBleHBvcnRzLk9wdGlvbmFsID0gT3B0aW9uYWw7XG4gICAgZXhwb3J0cy5SZXNlcnZlZCA9IFJlc2VydmVkO1xuICAgIGV4cG9ydHMuU3RyaW5nID0gX1N0cmluZztcbiAgICBleHBvcnRzLlN0cnVjdCA9IFN0cnVjdDtcbiAgICBleHBvcnRzLlZlcnNpb25lZFN0cnVjdCA9IFZlcnNpb25lZFN0cnVjdDtcbiAgICBfcmVmID0gX051bWJlcjtcblxuICAgIGZvciAoa2V5IGluIF9yZWYpIHtcbiAgICAgIHZhbCA9IF9yZWZba2V5XTtcbiAgICAgIGV4cG9ydHNba2V5XSA9IHZhbDtcbiAgICB9XG5cbiAgICBfcmVmMSA9IFBvaW50ZXI7XG5cbiAgICBmb3IgKGtleSBpbiBfcmVmMSkge1xuICAgICAgdmFsID0gX3JlZjFba2V5XTtcbiAgICAgIGV4cG9ydHNba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG52YXIgcmVzdHJ1Y3R1cmVfMSA9IHJlc3RydWN0dXJlLkVuY29kZVN0cmVhbTtcbnZhciByZXN0cnVjdHVyZV8yID0gcmVzdHJ1Y3R1cmUuRGVjb2RlU3RyZWFtO1xudmFyIHJlc3RydWN0dXJlXzMgPSByZXN0cnVjdHVyZS5BcnJheTtcbnZhciByZXN0cnVjdHVyZV80ID0gcmVzdHJ1Y3R1cmUuTGF6eUFycmF5O1xudmFyIHJlc3RydWN0dXJlXzUgPSByZXN0cnVjdHVyZS5CaXRmaWVsZDtcbnZhciByZXN0cnVjdHVyZV82ID0gcmVzdHJ1Y3R1cmUuQm9vbGVhbjtcbnZhciByZXN0cnVjdHVyZV83ID0gcmVzdHJ1Y3R1cmUuQnVmZmVyO1xudmFyIHJlc3RydWN0dXJlXzggPSByZXN0cnVjdHVyZS5FbnVtO1xudmFyIHJlc3RydWN0dXJlXzkgPSByZXN0cnVjdHVyZS5PcHRpb25hbDtcbnZhciByZXN0cnVjdHVyZV8xMCA9IHJlc3RydWN0dXJlLlJlc2VydmVkO1xudmFyIHJlc3RydWN0dXJlXzExID0gcmVzdHJ1Y3R1cmUuU3RyaW5nO1xudmFyIHJlc3RydWN0dXJlXzEyID0gcmVzdHJ1Y3R1cmUuU3RydWN0O1xudmFyIHJlc3RydWN0dXJlXzEzID0gcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0O1xuXG52YXIgZm9ybWF0cyA9IFtdO1xudmFyIGZvbnRraXQgPSB7XG4gIGxvZ0Vycm9yczogZmFsc2UsXG4gIHJlZ2lzdGVyRm9ybWF0OiBmdW5jdGlvbiByZWdpc3RlckZvcm1hdChmb3JtYXQpIHtcbiAgICBmb3JtYXRzLnB1c2goZm9ybWF0KTtcbiAgfSxcbiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUodWludDhBcnJheUZvbnREYXRhLCBwb3N0c2NyaXB0TmFtZSkge1xuICAgIHZhciBidWZmZXIgPSBuZXcgYnVmZmVyXzEuZnJvbSh1aW50OEFycmF5Rm9udERhdGEpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtYXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZm9ybWF0ID0gZm9ybWF0c1tpXTtcblxuICAgICAgaWYgKGZvcm1hdC5wcm9iZShidWZmZXIpKSB7XG4gICAgICAgIHZhciBmb250ID0gbmV3IGZvcm1hdChuZXcgcmVzdHJ1Y3R1cmUuRGVjb2RlU3RyZWFtKGJ1ZmZlcikpO1xuXG4gICAgICAgIGlmIChwb3N0c2NyaXB0TmFtZSkge1xuICAgICAgICAgIHJldHVybiBmb250LmdldEZvbnQocG9zdHNjcmlwdE5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGZvbnQgZm9ybWF0Jyk7XG4gIH1cbn07XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGEgZ2V0dGVyIG9yIG1ldGhvZCBzdWNoIHRoYXRcbiAqIHRoZSByZXN1bHRzIGFyZSBsYXppbHkgY29tcHV0ZWQgb25jZSwgYW5kIHRoZW4gY2FjaGVkLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2FjaGUodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpIHtcbiAgaWYgKGRlc2NyaXB0b3IuZ2V0KSB7XG4gICAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0O1xuXG4gICAgZGVzY3JpcHRvci5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXQuY2FsbCh0aGlzKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGZuID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IG5ldyBNYXAoKTtcblxuICAgICAgICBmdW5jdGlvbiBtZW1vaXplZCgpIHtcbiAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGtleSA9IGFyZ3MubGVuZ3RoID4gMCA/IGFyZ3NbMF0gOiAndmFsdWUnO1xuXG4gICAgICAgICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgIGNhY2hlLnNldChrZXksIHJlc3VsdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCB7XG4gICAgICAgICAgdmFsdWU6IG1lbW9pemVkXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG52YXIgU3ViSGVhZGVyID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZpcnN0Q29kZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBlbnRyeUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGlkRGVsdGE6IHJlc3RydWN0dXJlLmludDE2LFxuICBpZFJhbmdlT2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MTZcbn0pO1xudmFyIENtYXBHcm91cCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBzdGFydENoYXJDb2RlOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGVuZENoYXJDb2RlOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGdseXBoSUQ6IHJlc3RydWN0dXJlLnVpbnQzMlxufSk7XG52YXIgVW5pY29kZVZhbHVlUmFuZ2UgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgc3RhcnRVbmljb2RlVmFsdWU6IHJlc3RydWN0dXJlLnVpbnQyNCxcbiAgYWRkaXRpb25hbENvdW50OiByZXN0cnVjdHVyZS51aW50OFxufSk7XG52YXIgVVZTTWFwcGluZyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB1bmljb2RlVmFsdWU6IHJlc3RydWN0dXJlLnVpbnQyNCxcbiAgZ2x5cGhJRDogcmVzdHJ1Y3R1cmUudWludDE2XG59KTtcbnZhciBEZWZhdWx0VVZTID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KFVuaWNvZGVWYWx1ZVJhbmdlLCByZXN0cnVjdHVyZS51aW50MzIpO1xudmFyIE5vbkRlZmF1bHRVVlMgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoVVZTTWFwcGluZywgcmVzdHJ1Y3R1cmUudWludDMyKTtcbnZhciBWYXJTZWxlY3RvclJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2YXJTZWxlY3RvcjogcmVzdHJ1Y3R1cmUudWludDI0LFxuICBkZWZhdWx0VVZTOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIERlZmF1bHRVVlMsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KSxcbiAgbm9uRGVmYXVsdFVWUzogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBOb25EZWZhdWx0VVZTLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIENtYXBTdWJ0YWJsZSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIDA6IHtcbiAgICAvLyBCeXRlIGVuY29kaW5nXG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gVG90YWwgdGFibGUgbGVuZ3RoIGluIGJ5dGVzIChzZXQgdG8gMjYyIGZvciBmb3JtYXQgMClcbiAgICBsYW5ndWFnZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIExhbmd1YWdlIGNvZGUgZm9yIHRoaXMgZW5jb2Rpbmcgc3VidGFibGUsIG9yIHplcm8gaWYgbGFuZ3VhZ2UtaW5kZXBlbmRlbnRcbiAgICBjb2RlTWFwOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCAyNTYpXG4gIH0sXG4gIDI6IHtcbiAgICAvLyBIaWdoLWJ5dGUgbWFwcGluZyAoQ0pLKVxuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGxhbmd1YWdlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgc3ViSGVhZGVyS2V5czogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgMjU2KSxcbiAgICBzdWJIZWFkZXJDb3VudDogZnVuY3Rpb24gc3ViSGVhZGVyQ291bnQodCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsIHQuc3ViSGVhZGVyS2V5cyk7XG4gICAgfSxcbiAgICBzdWJIZWFkZXJzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KFN1YkhlYWRlciwgJ3N1YkhlYWRlckNvdW50JyksXG4gICAgZ2x5cGhJbmRleEFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ3N1YkhlYWRlckNvdW50JylcbiAgfSxcbiAgNDoge1xuICAgIC8vIFNlZ21lbnQgbWFwcGluZyB0byBkZWx0YSB2YWx1ZXNcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyBUb3RhbCB0YWJsZSBsZW5ndGggaW4gYnl0ZXNcbiAgICBsYW5ndWFnZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIExhbmd1YWdlIGNvZGVcbiAgICBzZWdDb3VudFgyOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgc2VnQ291bnQ6IGZ1bmN0aW9uIHNlZ0NvdW50KHQpIHtcbiAgICAgIHJldHVybiB0LnNlZ0NvdW50WDIgPj4gMTtcbiAgICB9LFxuICAgIHNlYXJjaFJhbmdlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZW50cnlTZWxlY3RvcjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHJhbmdlU2hpZnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBlbmRDb2RlOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ3NlZ0NvdW50JyksXG4gICAgcmVzZXJ2ZWRQYWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICAgIC8vIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHplcm9cbiAgICBzdGFydENvZGU6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnc2VnQ291bnQnKSxcbiAgICBpZERlbHRhOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLmludDE2LCAnc2VnQ291bnQnKSxcbiAgICBpZFJhbmdlT2Zmc2V0OiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ3NlZ0NvdW50JyksXG4gICAgZ2x5cGhJbmRleEFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAodC5sZW5ndGggLSB0Ll9jdXJyZW50T2Zmc2V0KSAvIDI7XG4gICAgfSlcbiAgfSxcbiAgNjoge1xuICAgIC8vIFRyaW1tZWQgdGFibGVcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBsYW5ndWFnZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGZpcnN0Q29kZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGVudHJ5Q291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBnbHlwaEluZGljZXM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnZW50cnlDb3VudCcpXG4gIH0sXG4gIDg6IHtcbiAgICAvLyBtaXhlZCAxNi1iaXQgYW5kIDMyLWJpdCBjb3ZlcmFnZVxuICAgIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBsYW5ndWFnZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGlzMzI6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUudWludDgsIDgxOTIpLFxuICAgIG5Hcm91cHM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBncm91cHM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkoQ21hcEdyb3VwLCAnbkdyb3VwcycpXG4gIH0sXG4gIDEwOiB7XG4gICAgLy8gVHJpbW1lZCBBcnJheVxuICAgIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBsYW5ndWFnZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGZpcnN0Q29kZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGVudHJ5Q291bnQ6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBnbHlwaEluZGljZXM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnbnVtQ2hhcnMnKVxuICB9LFxuICAxMjoge1xuICAgIC8vIFNlZ21lbnRlZCBjb3ZlcmFnZVxuICAgIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBsYW5ndWFnZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIG5Hcm91cHM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBncm91cHM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkoQ21hcEdyb3VwLCAnbkdyb3VwcycpXG4gIH0sXG4gIDEzOiB7XG4gICAgLy8gTWFueS10by1vbmUgcmFuZ2UgbWFwcGluZ3MgKHNhbWUgYXMgMTIgZXhjZXB0IGZvciBncm91cC5zdGFydEdseXBoSUQpXG4gICAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGxhbmd1YWdlOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgbkdyb3VwczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGdyb3VwczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShDbWFwR3JvdXAsICduR3JvdXBzJylcbiAgfSxcbiAgMTQ6IHtcbiAgICAvLyBVbmljb2RlIFZhcmlhdGlvbiBTZXF1ZW5jZXNcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBudW1SZWNvcmRzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgdmFyU2VsZWN0b3JzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KFZhclNlbGVjdG9yUmVjb3JkLCAnbnVtUmVjb3JkcycpXG4gIH1cbn0pO1xudmFyIENtYXBFbnRyeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBwbGF0Zm9ybUlEOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIFBsYXRmb3JtIGlkZW50aWZpZXJcbiAgZW5jb2RpbmdJRDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBQbGF0Zm9ybS1zcGVjaWZpYyBlbmNvZGluZyBpZGVudGlmaWVyXG4gIHRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIENtYXBTdWJ0YWJsZSwge1xuICAgIHR5cGU6ICdwYXJlbnQnLFxuICAgIGxhenk6IHRydWVcbiAgfSlcbn0pOyAvLyBjaGFyYWN0ZXIgdG8gZ2x5cGggbWFwcGluZ1xuXG52YXIgY21hcCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG51bVN1YnRhYmxlczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB0YWJsZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShDbWFwRW50cnksICdudW1TdWJ0YWJsZXMnKVxufSk7XG5cbnZhciBoZWFkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLmludDMyLFxuICAvLyAweDAwMDEwMDAwICh2ZXJzaW9uIDEuMClcbiAgcmV2aXNpb246IHJlc3RydWN0dXJlLmludDMyLFxuICAvLyBzZXQgYnkgZm9udCBtYW51ZmFjdHVyZXJcbiAgY2hlY2tTdW1BZGp1c3RtZW50OiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG1hZ2ljTnVtYmVyOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIC8vIHNldCB0byAweDVGMEYzQ0Y1XG4gIGZsYWdzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHVuaXRzUGVyRW06IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gcmFuZ2UgZnJvbSA2NCB0byAxNjM4NFxuICBjcmVhdGVkOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUuaW50MzIsIDIpLFxuICBtb2RpZmllZDogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLmludDMyLCAyKSxcbiAgeE1pbjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIGZvciBhbGwgZ2x5cGggYm91bmRpbmcgYm94ZXNcbiAgeU1pbjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIGZvciBhbGwgZ2x5cGggYm91bmRpbmcgYm94ZXNcbiAgeE1heDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIGZvciBhbGwgZ2x5cGggYm91bmRpbmcgYm94ZXNcbiAgeU1heDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIGZvciBhbGwgZ2x5cGggYm91bmRpbmcgYm94ZXNcbiAgbWFjU3R5bGU6IG5ldyByZXN0cnVjdHVyZS5CaXRmaWVsZChyZXN0cnVjdHVyZS51aW50MTYsIFsnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ291dGxpbmUnLCAnc2hhZG93JywgJ2NvbmRlbnNlZCcsICdleHRlbmRlZCddKSxcbiAgbG93ZXN0UmVjUFBFTTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBzbWFsbGVzdCByZWFkYWJsZSBzaXplIGluIHBpeGVsc1xuICBmb250RGlyZWN0aW9uSGludDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIGluZGV4VG9Mb2NGb3JtYXQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyAwIGZvciBzaG9ydCBvZmZzZXRzLCAxIGZvciBsb25nXG4gIGdseXBoRGF0YUZvcm1hdDogcmVzdHJ1Y3R1cmUuaW50MTYgLy8gMCBmb3IgY3VycmVudCBmb3JtYXRcblxufSk7XG5cbnZhciBoaGVhID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLmludDMyLFxuICBhc2NlbnQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBEaXN0YW5jZSBmcm9tIGJhc2VsaW5lIG9mIGhpZ2hlc3QgYXNjZW5kZXJcbiAgZGVzY2VudDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIERpc3RhbmNlIGZyb20gYmFzZWxpbmUgb2YgbG93ZXN0IGRlc2NlbmRlclxuICBsaW5lR2FwOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gVHlwb2dyYXBoaWMgbGluZSBnYXBcbiAgYWR2YW5jZVdpZHRoTWF4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE1heGltdW0gYWR2YW5jZSB3aWR0aCB2YWx1ZSBpbiAnaG10eCcgdGFibGVcbiAgbWluTGVmdFNpZGVCZWFyaW5nOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gTWF4aW11bSBhZHZhbmNlIHdpZHRoIHZhbHVlIGluICdobXR4JyB0YWJsZVxuICBtaW5SaWdodFNpZGVCZWFyaW5nOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gTWluaW11bSByaWdodCBzaWRlYmVhcmluZyB2YWx1ZVxuICB4TWF4RXh0ZW50OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgY2FyZXRTbG9wZVJpc2U6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBVc2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2xvcGUgb2YgdGhlIGN1cnNvciAocmlzZS9ydW4pOyAxIGZvciB2ZXJ0aWNhbFxuICBjYXJldFNsb3BlUnVuOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gMCBmb3IgdmVydGljYWxcbiAgY2FyZXRPZmZzZXQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBTZXQgdG8gMCBmb3Igbm9uLXNsYW50ZWQgZm9udHNcbiAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS5pbnQxNiwgNCksXG4gIG1ldHJpY0RhdGFGb3JtYXQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyAwIGZvciBjdXJyZW50IGZvcm1hdFxuICBudW1iZXJPZk1ldHJpY3M6IHJlc3RydWN0dXJlLnVpbnQxNiAvLyBOdW1iZXIgb2YgYWR2YW5jZSB3aWR0aHMgaW4gJ2htdHgnIHRhYmxlXG5cbn0pO1xuXG52YXIgSG10eEVudHJ5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGFkdmFuY2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgYmVhcmluZzogcmVzdHJ1Y3R1cmUuaW50MTZcbn0pO1xudmFyIGhtdHggPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbWV0cmljczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShIbXR4RW50cnksIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LmhoZWEubnVtYmVyT2ZNZXRyaWNzO1xuICB9KSxcbiAgYmVhcmluZ3M6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUuaW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50Lm1heHAubnVtR2x5cGhzIC0gdC5wYXJlbnQuaGhlYS5udW1iZXJPZk1ldHJpY3M7XG4gIH0pXG59KTtcblxudmFyIG1heHAgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUuaW50MzIsXG4gIG51bUdseXBoczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgZm9udFxuICBtYXhQb2ludHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTWF4aW11bSBwb2ludHMgaW4gYSBub24tY29tcG9zaXRlIGdseXBoXG4gIG1heENvbnRvdXJzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE1heGltdW0gY29udG91cnMgaW4gYSBub24tY29tcG9zaXRlIGdseXBoXG4gIG1heENvbXBvbmVudFBvaW50czogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBNYXhpbXVtIHBvaW50cyBpbiBhIGNvbXBvc2l0ZSBnbHlwaFxuICBtYXhDb21wb25lbnRDb250b3VyczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBNYXhpbXVtIGNvbnRvdXJzIGluIGEgY29tcG9zaXRlIGdseXBoXG4gIG1heFpvbmVzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIDEgaWYgaW5zdHJ1Y3Rpb25zIGRvIG5vdCB1c2UgdGhlIHR3aWxpZ2h0IHpvbmUsIDIgb3RoZXJ3aXNlXG4gIG1heFR3aWxpZ2h0UG9pbnRzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE1heGltdW0gcG9pbnRzIHVzZWQgaW4gWjBcbiAgbWF4U3RvcmFnZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBOdW1iZXIgb2YgU3RvcmFnZSBBcmVhIGxvY2F0aW9uc1xuICBtYXhGdW5jdGlvbkRlZnM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTnVtYmVyIG9mIEZERUZzXG4gIG1heEluc3RydWN0aW9uRGVmczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBOdW1iZXIgb2YgSURFRnNcbiAgbWF4U3RhY2tFbGVtZW50czogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBNYXhpbXVtIHN0YWNrIGRlcHRoXG4gIG1heFNpemVPZkluc3RydWN0aW9uczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBNYXhpbXVtIGJ5dGUgY291bnQgZm9yIGdseXBoIGluc3RydWN0aW9uc1xuICBtYXhDb21wb25lbnRFbGVtZW50czogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBjb21wb25lbnRzIHJlZmVyZW5jZWQgYXQg4oCcdG9wIGxldmVs4oCdIGZvciBhbnkgY29tcG9zaXRlIGdseXBoXG4gIG1heENvbXBvbmVudERlcHRoOiByZXN0cnVjdHVyZS51aW50MTYgLy8gTWF4aW11bSBsZXZlbHMgb2YgcmVjdXJzaW9uOyAxIGZvciBzaW1wbGUgY29tcG9uZW50c1xuXG59KTtcblxuLyoqXG4gKiBHZXRzIGFuIGVuY29kaW5nIG5hbWUgZnJvbSBwbGF0Zm9ybSwgZW5jb2RpbmcsIGFuZCBsYW5ndWFnZSBpZHMuXG4gKiBSZXR1cm5lZCBlbmNvZGluZyBuYW1lcyBjYW4gYmUgdXNlZCBpbiBpY29udi1saXRlIHRvIGRlY29kZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBnZXRFbmNvZGluZyhwbGF0Zm9ybUlELCBlbmNvZGluZ0lELCBsYW5ndWFnZUlEKSB7XG4gIGlmIChsYW5ndWFnZUlEID09PSB2b2lkIDApIHtcbiAgICBsYW5ndWFnZUlEID0gMDtcbiAgfVxuXG4gIGlmIChwbGF0Zm9ybUlEID09PSAxICYmIE1BQ19MQU5HVUFHRV9FTkNPRElOR1NbbGFuZ3VhZ2VJRF0pIHtcbiAgICByZXR1cm4gTUFDX0xBTkdVQUdFX0VOQ09ESU5HU1tsYW5ndWFnZUlEXTtcbiAgfVxuXG4gIHJldHVybiBFTkNPRElOR1NbcGxhdGZvcm1JRF1bZW5jb2RpbmdJRF07XG59IC8vIE1hcCBvZiBwbGF0Zm9ybSBpZHMgdG8gZW5jb2RpbmcgaWRzLlxuXG52YXIgRU5DT0RJTkdTID0gWy8vIHVuaWNvZGVcblsndXRmMTZiZScsICd1dGYxNmJlJywgJ3V0ZjE2YmUnLCAndXRmMTZiZScsICd1dGYxNmJlJywgJ3V0ZjE2YmUnXSwgLy8gbWFjaW50b3NoXG4vLyBNYXBwaW5ncyBhdmFpbGFibGUgYXQgaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL0FQUExFL1xuLy8gMFx0Um9tYW4gICAgICAgICAgICAgICAgIDE3XHRNYWxheWFsYW1cbi8vIDFcdEphcGFuZXNlXHQgICAgICAgICAgICAxOFx0U2luaGFsZXNlXG4vLyAyXHRUcmFkaXRpb25hbCBDaGluZXNlXHQgIDE5XHRCdXJtZXNlXG4vLyAzXHRLb3JlYW5cdCAgICAgICAgICAgICAgMjBcdEtobWVyXG4vLyA0XHRBcmFiaWNcdCAgICAgICAgICAgICAgMjFcdFRoYWlcbi8vIDVcdEhlYnJld1x0ICAgICAgICAgICAgICAyMlx0TGFvdGlhblxuLy8gNlx0R3JlZWtcdCAgICAgICAgICAgICAgICAyM1x0R2VvcmdpYW5cbi8vIDdcdFJ1c3NpYW5cdCAgICAgICAgICAgICAgMjRcdEFybWVuaWFuXG4vLyA4XHRSU3ltYm9sXHQgICAgICAgICAgICAgIDI1XHRTaW1wbGlmaWVkIENoaW5lc2Vcbi8vIDlcdERldmFuYWdhcmlcdCAgICAgICAgICAyNlx0VGliZXRhblxuLy8gMTBcdEd1cm11a2hpXHQgICAgICAgICAgICAyN1x0TW9uZ29saWFuXG4vLyAxMVx0R3VqYXJhdGlcdCAgICAgICAgICAgIDI4XHRHZWV6XG4vLyAxMlx0T3JpeWFcdCAgICAgICAgICAgICAgICAyOVx0U2xhdmljXG4vLyAxM1x0QmVuZ2FsaVx0ICAgICAgICAgICAgICAzMFx0VmlldG5hbWVzZVxuLy8gMTRcdFRhbWlsXHQgICAgICAgICAgICAgICAgMzFcdFNpbmRoaVxuLy8gMTVcdFRlbHVndVx0ICAgICAgICAgICAgICAzMlx0KFVuaW50ZXJwcmV0ZWQpXG4vLyAxNlx0S2FubmFkYVxuWydtYWNyb21hbicsICdzaGlmdC1qaXMnLCAnYmlnNScsICdldWMta3InLCAnaXNvLTg4NTktNicsICdpc28tODg1OS04JywgJ21hY2dyZWVrJywgJ21hY2N5cmlsbGljJywgJ3N5bWJvbCcsICdEZXZhbmFnYXJpJywgJ0d1cm11a2hpJywgJ0d1amFyYXRpJywgJ09yaXlhJywgJ0JlbmdhbGknLCAnVGFtaWwnLCAnVGVsdWd1JywgJ0thbm5hZGEnLCAnTWFsYXlhbGFtJywgJ1NpbmhhbGVzZScsICdCdXJtZXNlJywgJ0tobWVyJywgJ21hY3RoYWknLCAnTGFvdGlhbicsICdHZW9yZ2lhbicsICdBcm1lbmlhbicsICdnYi0yMzEyLTgwJywgJ1RpYmV0YW4nLCAnTW9uZ29saWFuJywgJ0dlZXonLCAnbWFjY2VudGV1cm8nLCAnVmlldG5hbWVzZScsICdTaW5kaGknXSwgLy8gSVNPIChkZXByZWNhdGVkKVxuWydhc2NpaSddLCAvLyB3aW5kb3dzXG4vLyBEb2NzIGhlcmU6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9zeXN0ZW0udGV4dC5lbmNvZGluZyh2PXZzLjExMCkuYXNweFxuWydzeW1ib2wnLCAndXRmMTZiZScsICdzaGlmdC1qaXMnLCAnZ2IxODAzMCcsICdiaWc1JywgJ3dhbnN1bmcnLCAnam9oYWInLCBudWxsLCBudWxsLCBudWxsLCAndXRmMTZiZSddXTsgLy8gT3ZlcnJpZGVzIGZvciBNYWMgc2NyaXB0cyBieSBsYW5ndWFnZSBpZC5cbi8vIFNlZSBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvUmVhZG1lLnR4dFxuXG52YXIgTUFDX0xBTkdVQUdFX0VOQ09ESU5HUyA9IHtcbiAgMTU6ICdtYWNpY2VsYW5kJyxcbiAgMTc6ICdtYWN0dXJraXNoJyxcbiAgMTg6ICdtYWNjcm9hdGlhbicsXG4gIDI0OiAnbWFjY2VudGV1cm8nLFxuICAyNTogJ21hY2NlbnRldXJvJyxcbiAgMjY6ICdtYWNjZW50ZXVybycsXG4gIDI3OiAnbWFjY2VudGV1cm8nLFxuICAyODogJ21hY2NlbnRldXJvJyxcbiAgMzA6ICdtYWNpY2VsYW5kJyxcbiAgMzc6ICdtYWNyb21hbmlhJyxcbiAgMzg6ICdtYWNjZW50ZXVybycsXG4gIDM5OiAnbWFjY2VudGV1cm8nLFxuICA0MDogJ21hY2NlbnRldXJvJyxcbiAgMTQzOiAnbWFjaW51aXQnLFxuICAvLyBVbnN1cHBvcnRlZCBieSBpY29udi1saXRlXG4gIDE0NjogJ21hY2dhZWxpYycgLy8gVW5zdXBwb3J0ZWQgYnkgaWNvbnYtbGl0ZVxuXG59OyAvLyBNYXAgb2YgcGxhdGZvcm0gaWRzIHRvIEJDUC00NyBsYW5ndWFnZSBjb2Rlcy5cblxudmFyIExBTkdVQUdFUyA9IFsvLyB1bmljb2RlXG5bXSwge1xuICAvLyBtYWNpbnRvc2hcbiAgMDogJ2VuJyxcbiAgMzA6ICdmbycsXG4gIDYwOiAna3MnLFxuICA5MDogJ3J3JyxcbiAgMTogJ2ZyJyxcbiAgMzE6ICdmYScsXG4gIDYxOiAna3UnLFxuICA5MTogJ3JuJyxcbiAgMjogJ2RlJyxcbiAgMzI6ICdydScsXG4gIDYyOiAnc2QnLFxuICA5MjogJ255JyxcbiAgMzogJ2l0JyxcbiAgMzM6ICd6aCcsXG4gIDYzOiAnYm8nLFxuICA5MzogJ21nJyxcbiAgNDogJ25sJyxcbiAgMzQ6ICdubC1CRScsXG4gIDY0OiAnbmUnLFxuICA5NDogJ2VvJyxcbiAgNTogJ3N2JyxcbiAgMzU6ICdnYScsXG4gIDY1OiAnc2EnLFxuICAxMjg6ICdjeScsXG4gIDY6ICdlcycsXG4gIDM2OiAnc3EnLFxuICA2NjogJ21yJyxcbiAgMTI5OiAnZXUnLFxuICA3OiAnZGEnLFxuICAzNzogJ3JvJyxcbiAgNjc6ICdibicsXG4gIDEzMDogJ2NhJyxcbiAgODogJ3B0JyxcbiAgMzg6ICdjeicsXG4gIDY4OiAnYXMnLFxuICAxMzE6ICdsYScsXG4gIDk6ICdubycsXG4gIDM5OiAnc2snLFxuICA2OTogJ2d1JyxcbiAgMTMyOiAncXUnLFxuICAxMDogJ2hlJyxcbiAgNDA6ICdzaScsXG4gIDcwOiAncGEnLFxuICAxMzM6ICdnbicsXG4gIDExOiAnamEnLFxuICA0MTogJ3lpJyxcbiAgNzE6ICdvcicsXG4gIDEzNDogJ2F5JyxcbiAgMTI6ICdhcicsXG4gIDQyOiAnc3InLFxuICA3MjogJ21sJyxcbiAgMTM1OiAndHQnLFxuICAxMzogJ2ZpJyxcbiAgNDM6ICdtaycsXG4gIDczOiAna24nLFxuICAxMzY6ICd1ZycsXG4gIDE0OiAnZWwnLFxuICA0NDogJ2JnJyxcbiAgNzQ6ICd0YScsXG4gIDEzNzogJ2R6JyxcbiAgMTU6ICdpcycsXG4gIDQ1OiAndWsnLFxuICA3NTogJ3RlJyxcbiAgMTM4OiAnanYnLFxuICAxNjogJ210JyxcbiAgNDY6ICdiZScsXG4gIDc2OiAnc2knLFxuICAxMzk6ICdzdScsXG4gIDE3OiAndHInLFxuICA0NzogJ3V6JyxcbiAgNzc6ICdteScsXG4gIDE0MDogJ2dsJyxcbiAgMTg6ICdocicsXG4gIDQ4OiAna2snLFxuICA3ODogJ2ttJyxcbiAgMTQxOiAnYWYnLFxuICAxOTogJ3poLUhhbnQnLFxuICA0OTogJ2F6LUN5cmwnLFxuICA3OTogJ2xvJyxcbiAgMTQyOiAnYnInLFxuICAyMDogJ3VyJyxcbiAgNTA6ICdhei1BcmFiJyxcbiAgODA6ICd2aScsXG4gIDE0MzogJ2l1JyxcbiAgMjE6ICdoaScsXG4gIDUxOiAnaHknLFxuICA4MTogJ2lkJyxcbiAgMTQ0OiAnZ2QnLFxuICAyMjogJ3RoJyxcbiAgNTI6ICdrYScsXG4gIDgyOiAndGwnLFxuICAxNDU6ICdndicsXG4gIDIzOiAna28nLFxuICA1MzogJ21vJyxcbiAgODM6ICdtcycsXG4gIDE0NjogJ2dhJyxcbiAgMjQ6ICdsdCcsXG4gIDU0OiAna3knLFxuICA4NDogJ21zLUFyYWInLFxuICAxNDc6ICd0bycsXG4gIDI1OiAncGwnLFxuICA1NTogJ3RnJyxcbiAgODU6ICdhbScsXG4gIDE0ODogJ2VsLXBvbHl0b24nLFxuICAyNjogJ2h1JyxcbiAgNTY6ICd0aycsXG4gIDg2OiAndGknLFxuICAxNDk6ICdrbCcsXG4gIDI3OiAnZXMnLFxuICA1NzogJ21uLUNOJyxcbiAgODc6ICdvbScsXG4gIDE1MDogJ2F6JyxcbiAgMjg6ICdsdicsXG4gIDU4OiAnbW4nLFxuICA4ODogJ3NvJyxcbiAgMTUxOiAnbm4nLFxuICAyOTogJ3NlJyxcbiAgNTk6ICdwcycsXG4gIDg5OiAnc3cnXG59LCAvLyBJU08gKGRlcHJlY2F0ZWQpXG5bXSwge1xuICAvLyB3aW5kb3dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAweDA0MzY6ICdhZicsXG4gIDB4NDAwOTogJ2VuLUlOJyxcbiAgMHgwNDg3OiAncncnLFxuICAweDA0MzI6ICd0bicsXG4gIDB4MDQxQzogJ3NxJyxcbiAgMHgxODA5OiAnZW4tSUUnLFxuICAweDA0NDE6ICdzdycsXG4gIDB4MDQ1QjogJ3NpJyxcbiAgMHgwNDg0OiAnZ3N3JyxcbiAgMHgyMDA5OiAnZW4tSk0nLFxuICAweDA0NTc6ICdrb2snLFxuICAweDA0MUI6ICdzaycsXG4gIDB4MDQ1RTogJ2FtJyxcbiAgMHg0NDA5OiAnZW4tTVknLFxuICAweDA0MTI6ICdrbycsXG4gIDB4MDQyNDogJ3NsJyxcbiAgMHgxNDAxOiAnYXItRFonLFxuICAweDE0MDk6ICdlbi1OWicsXG4gIDB4MDQ0MDogJ2t5JyxcbiAgMHgyQzBBOiAnZXMtQVInLFxuICAweDNDMDE6ICdhci1CSCcsXG4gIDB4MzQwOTogJ2VuLVBIJyxcbiAgMHgwNDU0OiAnbG8nLFxuICAweDQwMEE6ICdlcy1CTycsXG4gIDB4MEMwMTogJ2FyJyxcbiAgMHg0ODA5OiAnZW4tU0cnLFxuICAweDA0MjY6ICdsdicsXG4gIDB4MzQwQTogJ2VzLUNMJyxcbiAgMHgwODAxOiAnYXItSVEnLFxuICAweDFDMDk6ICdlbi1aQScsXG4gIDB4MDQyNzogJ2x0JyxcbiAgMHgyNDBBOiAnZXMtQ08nLFxuICAweDJDMDE6ICdhci1KTycsXG4gIDB4MkMwOTogJ2VuLVRUJyxcbiAgMHgwODJFOiAnZHNiJyxcbiAgMHgxNDBBOiAnZXMtQ1InLFxuICAweDM0MDE6ICdhci1LVycsXG4gIDB4MDgwOTogJ2VuLUdCJyxcbiAgMHgwNDZFOiAnbGInLFxuICAweDFDMEE6ICdlcy1ETycsXG4gIDB4MzAwMTogJ2FyLUxCJyxcbiAgMHgwNDA5OiAnZW4nLFxuICAweDA0MkY6ICdtaycsXG4gIDB4MzAwQTogJ2VzLUVDJyxcbiAgMHgxMDAxOiAnYXItTFknLFxuICAweDMwMDk6ICdlbi1aVycsXG4gIDB4MDgzRTogJ21zLUJOJyxcbiAgMHg0NDBBOiAnZXMtU1YnLFxuICAweDE4MDE6ICdhcnknLFxuICAweDA0MjU6ICdldCcsXG4gIDB4MDQzRTogJ21zJyxcbiAgMHgxMDBBOiAnZXMtR1QnLFxuICAweDIwMDE6ICdhci1PTScsXG4gIDB4MDQzODogJ2ZvJyxcbiAgMHgwNDRDOiAnbWwnLFxuICAweDQ4MEE6ICdlcy1ITicsXG4gIDB4NDAwMTogJ2FyLVFBJyxcbiAgMHgwNDY0OiAnZmlsJyxcbiAgMHgwNDNBOiAnbXQnLFxuICAweDA4MEE6ICdlcy1NWCcsXG4gIDB4MDQwMTogJ2FyLVNBJyxcbiAgMHgwNDBCOiAnZmknLFxuICAweDA0ODE6ICdtaScsXG4gIDB4NEMwQTogJ2VzLU5JJyxcbiAgMHgyODAxOiAnYXItU1knLFxuICAweDA4MEM6ICdmci1CRScsXG4gIDB4MDQ3QTogJ2FybicsXG4gIDB4MTgwQTogJ2VzLVBBJyxcbiAgMHgxQzAxOiAnYWViJyxcbiAgMHgwQzBDOiAnZnItQ0EnLFxuICAweDA0NEU6ICdtcicsXG4gIDB4M0MwQTogJ2VzLVBZJyxcbiAgMHgzODAxOiAnYXItQUUnLFxuICAweDA0MEM6ICdmcicsXG4gIDB4MDQ3QzogJ21vaCcsXG4gIDB4MjgwQTogJ2VzLVBFJyxcbiAgMHgyNDAxOiAnYXItWUUnLFxuICAweDE0MEM6ICdmci1MVScsXG4gIDB4MDQ1MDogJ21uJyxcbiAgMHg1MDBBOiAnZXMtUFInLFxuICAweDA0MkI6ICdoeScsXG4gIDB4MTgwQzogJ2ZyLU1DJyxcbiAgMHgwODUwOiAnbW4tQ04nLFxuICAweDBDMEE6ICdlcycsXG4gIDB4MDQ0RDogJ2FzJyxcbiAgMHgxMDBDOiAnZnItQ0gnLFxuICAweDA0NjE6ICduZScsXG4gIDB4MDQwQTogJ2VzJyxcbiAgMHgwODJDOiAnYXotQ3lybCcsXG4gIDB4MDQ2MjogJ2Z5JyxcbiAgMHgwNDE0OiAnbmInLFxuICAweDU0MEE6ICdlcy1VUycsXG4gIDB4MDQyQzogJ2F6JyxcbiAgMHgwNDU2OiAnZ2wnLFxuICAweDA4MTQ6ICdubicsXG4gIDB4MzgwQTogJ2VzLVVZJyxcbiAgMHgwNDZEOiAnYmEnLFxuICAweDA0Mzc6ICdrYScsXG4gIDB4MDQ4MjogJ29jJyxcbiAgMHgyMDBBOiAnZXMtVkUnLFxuICAweDA0MkQ6ICdldScsXG4gIDB4MEMwNzogJ2RlLUFUJyxcbiAgMHgwNDQ4OiAnb3InLFxuICAweDA4MUQ6ICdzdi1GSScsXG4gIDB4MDQyMzogJ2JlJyxcbiAgMHgwNDA3OiAnZGUnLFxuICAweDA0NjM6ICdwcycsXG4gIDB4MDQxRDogJ3N2JyxcbiAgMHgwODQ1OiAnYm4nLFxuICAweDE0MDc6ICdkZS1MSScsXG4gIDB4MDQxNTogJ3BsJyxcbiAgMHgwNDVBOiAnc3lyJyxcbiAgMHgwNDQ1OiAnYm4tSU4nLFxuICAweDEwMDc6ICdkZS1MVScsXG4gIDB4MDQxNjogJ3B0JyxcbiAgMHgwNDI4OiAndGcnLFxuICAweDIwMUE6ICdicy1DeXJsJyxcbiAgMHgwODA3OiAnZGUtQ0gnLFxuICAweDA4MTY6ICdwdC1QVCcsXG4gIDB4MDg1RjogJ3R6bScsXG4gIDB4MTQxQTogJ2JzJyxcbiAgMHgwNDA4OiAnZWwnLFxuICAweDA0NDY6ICdwYScsXG4gIDB4MDQ0OTogJ3RhJyxcbiAgMHgwNDdFOiAnYnInLFxuICAweDA0NkY6ICdrbCcsXG4gIDB4MDQ2QjogJ3F1LUJPJyxcbiAgMHgwNDQ0OiAndHQnLFxuICAweDA0MDI6ICdiZycsXG4gIDB4MDQ0NzogJ2d1JyxcbiAgMHgwODZCOiAncXUtRUMnLFxuICAweDA0NEE6ICd0ZScsXG4gIDB4MDQwMzogJ2NhJyxcbiAgMHgwNDY4OiAnaGEnLFxuICAweDBDNkI6ICdxdScsXG4gIDB4MDQxRTogJ3RoJyxcbiAgMHgwQzA0OiAnemgtSEsnLFxuICAweDA0MEQ6ICdoZScsXG4gIDB4MDQxODogJ3JvJyxcbiAgMHgwNDUxOiAnYm8nLFxuICAweDE0MDQ6ICd6aC1NTycsXG4gIDB4MDQzOTogJ2hpJyxcbiAgMHgwNDE3OiAncm0nLFxuICAweDA0MUY6ICd0cicsXG4gIDB4MDgwNDogJ3poJyxcbiAgMHgwNDBFOiAnaHUnLFxuICAweDA0MTk6ICdydScsXG4gIDB4MDQ0MjogJ3RrJyxcbiAgMHgxMDA0OiAnemgtU0cnLFxuICAweDA0MEY6ICdpcycsXG4gIDB4MjQzQjogJ3NtbicsXG4gIDB4MDQ4MDogJ3VnJyxcbiAgMHgwNDA0OiAnemgtVFcnLFxuICAweDA0NzA6ICdpZycsXG4gIDB4MTAzQjogJ3Ntai1OTycsXG4gIDB4MDQyMjogJ3VrJyxcbiAgMHgwNDgzOiAnY28nLFxuICAweDA0MjE6ICdpZCcsXG4gIDB4MTQzQjogJ3NtaicsXG4gIDB4MDQyRTogJ2hzYicsXG4gIDB4MDQxQTogJ2hyJyxcbiAgMHgwNDVEOiAnaXUnLFxuICAweDBDM0I6ICdzZS1GSScsXG4gIDB4MDQyMDogJ3VyJyxcbiAgMHgxMDFBOiAnaHItQkEnLFxuICAweDA4NUQ6ICdpdS1MYXRuJyxcbiAgMHgwNDNCOiAnc2UnLFxuICAweDA4NDM6ICd1ei1DeXJsJyxcbiAgMHgwNDA1OiAnY3MnLFxuICAweDA4M0M6ICdnYScsXG4gIDB4MDgzQjogJ3NlLVNFJyxcbiAgMHgwNDQzOiAndXonLFxuICAweDA0MDY6ICdkYScsXG4gIDB4MDQzNDogJ3hoJyxcbiAgMHgyMDNCOiAnc21zJyxcbiAgMHgwNDJBOiAndmknLFxuICAweDA0OEM6ICdwcnMnLFxuICAweDA0MzU6ICd6dScsXG4gIDB4MTgzQjogJ3NtYS1OTycsXG4gIDB4MDQ1MjogJ2N5JyxcbiAgMHgwNDY1OiAnZHYnLFxuICAweDA0MTA6ICdpdCcsXG4gIDB4MUMzQjogJ3NtcycsXG4gIDB4MDQ4ODogJ3dvJyxcbiAgMHgwODEzOiAnbmwtQkUnLFxuICAweDA4MTA6ICdpdC1DSCcsXG4gIDB4MDQ0RjogJ3NhJyxcbiAgMHgwNDg1OiAnc2FoJyxcbiAgMHgwNDEzOiAnbmwnLFxuICAweDA0MTE6ICdqYScsXG4gIDB4MUMxQTogJ3NyLUN5cmwtQkEnLFxuICAweDA0Nzg6ICdpaScsXG4gIDB4MEMwOTogJ2VuLUFVJyxcbiAgMHgwNDRCOiAna24nLFxuICAweDBDMUE6ICdzcicsXG4gIDB4MDQ2QTogJ3lvJyxcbiAgMHgyODA5OiAnZW4tQlonLFxuICAweDA0M0Y6ICdraycsXG4gIDB4MTgxQTogJ3NyLUxhdG4tQkEnLFxuICAweDEwMDk6ICdlbi1DQScsXG4gIDB4MDQ1MzogJ2ttJyxcbiAgMHgwODFBOiAnc3ItTGF0bicsXG4gIDB4MjQwOTogJ2VuLTAyOScsXG4gIDB4MDQ4NjogJ3F1YycsXG4gIDB4MDQ2QzogJ25zbydcbn1dO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG52YXIgTmFtZVJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBwbGF0Zm9ybUlEOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGVuY29kaW5nSUQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbGFuZ3VhZ2VJRDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBuYW1lSUQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHN0cmluZzogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKCdsZW5ndGgnLCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiBnZXRFbmNvZGluZyh0LnBsYXRmb3JtSUQsIHQuZW5jb2RpbmdJRCwgdC5sYW5ndWFnZUlEKTtcbiAgfSksIHtcbiAgICB0eXBlOiAncGFyZW50JyxcbiAgICByZWxhdGl2ZVRvOiAncGFyZW50LnN0cmluZ09mZnNldCcsXG4gICAgYWxsb3dOdWxsOiBmYWxzZVxuICB9KVxufSk7XG52YXIgTGFuZ1RhZ1JlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoJ2xlbmd0aCcsICd1dGYxNmJlJyksIHtcbiAgICB0eXBlOiAncGFyZW50JyxcbiAgICByZWxhdGl2ZVRvOiAnc3RyaW5nT2Zmc2V0J1xuICB9KVxufSk7XG52YXIgTmFtZVRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgMDoge1xuICAgIGNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgc3RyaW5nT2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgcmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KE5hbWVSZWNvcmQsICdjb3VudCcpXG4gIH0sXG4gIDE6IHtcbiAgICBjb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHN0cmluZ09mZnNldDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShOYW1lUmVjb3JkLCAnY291bnQnKSxcbiAgICBsYW5nVGFnQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBsYW5nVGFnczogbmV3IHJlc3RydWN0dXJlLkFycmF5KExhbmdUYWdSZWNvcmQsICdsYW5nVGFnQ291bnQnKVxuICB9XG59KTtcbnZhciBOQU1FUyA9IFsnY29weXJpZ2h0JywgJ2ZvbnRGYW1pbHknLCAnZm9udFN1YmZhbWlseScsICd1bmlxdWVTdWJmYW1pbHknLCAnZnVsbE5hbWUnLCAndmVyc2lvbicsICdwb3N0c2NyaXB0TmFtZScsIC8vIE5vdGU6IEEgZm9udCBtYXkgaGF2ZSBvbmx5IG9uZSBQb3N0U2NyaXB0IG5hbWUgYW5kIHRoYXQgbmFtZSBtdXN0IGJlIEFTQ0lJLlxuJ3RyYWRlbWFyaycsICdtYW51ZmFjdHVyZXInLCAnZGVzaWduZXInLCAnZGVzY3JpcHRpb24nLCAndmVuZG9yVVJMJywgJ2Rlc2lnbmVyVVJMJywgJ2xpY2Vuc2UnLCAnbGljZW5zZVVSTCcsIG51bGwsIC8vIHJlc2VydmVkXG4ncHJlZmVycmVkRmFtaWx5JywgJ3ByZWZlcnJlZFN1YmZhbWlseScsICdjb21wYXRpYmxlRnVsbCcsICdzYW1wbGVUZXh0JywgJ3Bvc3RzY3JpcHRDSURGb250TmFtZScsICd3d3NGYW1pbHlOYW1lJywgJ3d3c1N1YmZhbWlseU5hbWUnXTtcblxuTmFtZVRhYmxlLnByb2Nlc3MgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHZhciByZWNvcmRzID0ge307XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSh0aGlzLnJlY29yZHMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgIHZhciByZWNvcmQgPSBfc3RlcC52YWx1ZTtcbiAgICAvLyBmaW5kIG91dCB3aGF0IGxhbmd1YWdlIHRoaXMgaXMgZm9yXG4gICAgdmFyIGxhbmd1YWdlID0gTEFOR1VBR0VTW3JlY29yZC5wbGF0Zm9ybUlEXVtyZWNvcmQubGFuZ3VhZ2VJRF07XG5cbiAgICBpZiAobGFuZ3VhZ2UgPT0gbnVsbCAmJiB0aGlzLmxhbmdUYWdzICE9IG51bGwgJiYgcmVjb3JkLmxhbmd1YWdlSUQgPj0gMHg4MDAwKSB7XG4gICAgICBsYW5ndWFnZSA9IHRoaXMubGFuZ1RhZ3NbcmVjb3JkLmxhbmd1YWdlSUQgLSAweDgwMDBdLnRhZztcbiAgICB9XG5cbiAgICBpZiAobGFuZ3VhZ2UgPT0gbnVsbCkge1xuICAgICAgbGFuZ3VhZ2UgPSByZWNvcmQucGxhdGZvcm1JRCArICctJyArIHJlY29yZC5sYW5ndWFnZUlEO1xuICAgIH0gLy8gaWYgdGhlIG5hbWVJRCBpcyA+PSAyNTYsIGl0IGlzIGEgZm9udCBmZWF0dXJlIHJlY29yZCAoQUFUKVxuXG5cbiAgICB2YXIga2V5ID0gcmVjb3JkLm5hbWVJRCA+PSAyNTYgPyAnZm9udEZlYXR1cmVzJyA6IE5BTUVTW3JlY29yZC5uYW1lSURdIHx8IHJlY29yZC5uYW1lSUQ7XG5cbiAgICBpZiAocmVjb3Jkc1trZXldID09IG51bGwpIHtcbiAgICAgIHJlY29yZHNba2V5XSA9IHt9O1xuICAgIH1cblxuICAgIHZhciBvYmogPSByZWNvcmRzW2tleV07XG5cbiAgICBpZiAocmVjb3JkLm5hbWVJRCA+PSAyNTYpIHtcbiAgICAgIG9iaiA9IG9ialtyZWNvcmQubmFtZUlEXSB8fCAob2JqW3JlY29yZC5uYW1lSURdID0ge30pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVjb3JkLnN0cmluZyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9ialtsYW5ndWFnZV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICBvYmpbbGFuZ3VhZ2VdID0gcmVjb3JkLnN0cmluZztcbiAgICB9XG4gIH1cblxuICB0aGlzLnJlY29yZHMgPSByZWNvcmRzO1xufTtcblxuTmFtZVRhYmxlLnByZUVuY29kZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5yZWNvcmRzKSkgcmV0dXJuO1xuICB0aGlzLnZlcnNpb24gPSAwO1xuICB2YXIgcmVjb3JkcyA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiB0aGlzLnJlY29yZHMpIHtcbiAgICB2YXIgdmFsID0gdGhpcy5yZWNvcmRzW2tleV07XG4gICAgaWYgKGtleSA9PT0gJ2ZvbnRGZWF0dXJlcycpIGNvbnRpbnVlO1xuICAgIHJlY29yZHMucHVzaCh7XG4gICAgICBwbGF0Zm9ybUlEOiAzLFxuICAgICAgZW5jb2RpbmdJRDogMSxcbiAgICAgIGxhbmd1YWdlSUQ6IDB4NDA5LFxuICAgICAgbmFtZUlEOiBOQU1FUy5pbmRleE9mKGtleSksXG4gICAgICBsZW5ndGg6IGJ1ZmZlcl8xLmJ5dGVMZW5ndGgodmFsLmVuLCAndXRmMTZsZScpLFxuICAgICAgc3RyaW5nOiB2YWwuZW5cbiAgICB9KTtcblxuICAgIGlmIChrZXkgPT09ICdwb3N0c2NyaXB0TmFtZScpIHtcbiAgICAgIHJlY29yZHMucHVzaCh7XG4gICAgICAgIHBsYXRmb3JtSUQ6IDEsXG4gICAgICAgIGVuY29kaW5nSUQ6IDAsXG4gICAgICAgIGxhbmd1YWdlSUQ6IDAsXG4gICAgICAgIG5hbWVJRDogTkFNRVMuaW5kZXhPZihrZXkpLFxuICAgICAgICBsZW5ndGg6IHZhbC5lbi5sZW5ndGgsXG4gICAgICAgIHN0cmluZzogdmFsLmVuXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0aGlzLnJlY29yZHMgPSByZWNvcmRzO1xuICB0aGlzLmNvdW50ID0gcmVjb3Jkcy5sZW5ndGg7XG4gIHRoaXMuc3RyaW5nT2Zmc2V0ID0gTmFtZVRhYmxlLnNpemUodGhpcywgbnVsbCwgZmFsc2UpO1xufTtcblxudmFyIE9TMiA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIGhlYWRlcjoge1xuICAgIHhBdmdDaGFyV2lkdGg6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIGF2ZXJhZ2Ugd2VpZ2h0ZWQgYWR2YW5jZSB3aWR0aCBvZiBsb3dlciBjYXNlIGxldHRlcnMgYW5kIHNwYWNlXG4gICAgdXNXZWlnaHRDbGFzczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIHZpc3VhbCB3ZWlnaHQgb2Ygc3Ryb2tlIGluIGdseXBoc1xuICAgIHVzV2lkdGhDbGFzczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIHJlbGF0aXZlIGNoYW5nZSBmcm9tIHRoZSBub3JtYWwgYXNwZWN0IHJhdGlvICh3aWR0aCB0byBoZWlnaHQgcmF0aW8pXG4gICAgZnNUeXBlOiBuZXcgcmVzdHJ1Y3R1cmUuQml0ZmllbGQocmVzdHJ1Y3R1cmUudWludDE2LCBbLy8gSW5kaWNhdGVzIGZvbnQgZW1iZWRkaW5nIGxpY2Vuc2luZyByaWdodHNcbiAgICBudWxsLCAnbm9FbWJlZGRpbmcnLCAndmlld09ubHknLCAnZWRpdGFibGUnLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAnbm9TdWJzZXR0aW5nJywgJ2JpdG1hcE9ubHknXSksXG4gICAgeVN1YnNjcmlwdFhTaXplOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyByZWNvbW1lbmRlZCBob3Jpem9udGFsIHNpemUgaW4gcGl4ZWxzIGZvciBzdWJzY3JpcHRzXG4gICAgeVN1YnNjcmlwdFlTaXplOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyByZWNvbW1lbmRlZCB2ZXJ0aWNhbCBzaXplIGluIHBpeGVscyBmb3Igc3Vic2NyaXB0c1xuICAgIHlTdWJzY3JpcHRYT2Zmc2V0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyByZWNvbW1lbmRlZCBob3Jpem9udGFsIG9mZnNldCBmb3Igc3Vic2NyaXB0c1xuICAgIHlTdWJzY3JpcHRZT2Zmc2V0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyByZWNvbW1lbmRlZCB2ZXJ0aWNhbCBvZmZzZXQgZm9ybSB0aGUgYmFzZWxpbmUgZm9yIHN1YnNjcmlwdHNcbiAgICB5U3VwZXJzY3JpcHRYU2l6ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gcmVjb21tZW5kZWQgaG9yaXpvbnRhbCBzaXplIGluIHBpeGVscyBmb3Igc3VwZXJzY3JpcHRzXG4gICAgeVN1cGVyc2NyaXB0WVNpemU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIHJlY29tbWVuZGVkIHZlcnRpY2FsIHNpemUgaW4gcGl4ZWxzIGZvciBzdXBlcnNjcmlwdHNcbiAgICB5U3VwZXJzY3JpcHRYT2Zmc2V0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyByZWNvbW1lbmRlZCBob3Jpem9udGFsIG9mZnNldCBmb3Igc3VwZXJzY3JpcHRzXG4gICAgeVN1cGVyc2NyaXB0WU9mZnNldDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gcmVjb21tZW5kZWQgdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIGJhc2VsaW5lIGZvciBzdXBlcnNjcmlwdHNcbiAgICB5U3RyaWtlb3V0U2l6ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gd2lkdGggb2YgdGhlIHN0cmlrZW91dCBzdHJva2VcbiAgICB5U3RyaWtlb3V0UG9zaXRpb246IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIHBvc2l0aW9uIG9mIHRoZSBzdHJpa2VvdXQgc3Ryb2tlIHJlbGF0aXZlIHRvIHRoZSBiYXNlbGluZVxuICAgIHNGYW1pbHlDbGFzczogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gY2xhc3NpZmljYXRpb24gb2YgZm9udC1mYW1pbHkgZGVzaWduXG4gICAgcGFub3NlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsIDEwKSxcbiAgICAvLyBkZXNjcmliZSB0aGUgdmlzdWFsIGNoYXJhY3RlcmlzdGljcyBvZiBhIGdpdmVuIHR5cGVmYWNlXG4gICAgdWxDaGFyUmFuZ2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MzIsIDQpLFxuICAgIHZlbmRvcklEOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICAgIC8vIGZvdXIgY2hhcmFjdGVyIGlkZW50aWZpZXIgZm9yIHRoZSBmb250IHZlbmRvclxuICAgIGZzU2VsZWN0aW9uOiBuZXcgcmVzdHJ1Y3R1cmUuQml0ZmllbGQocmVzdHJ1Y3R1cmUudWludDE2LCBbLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZvbnRcbiAgICAnaXRhbGljJywgJ3VuZGVyc2NvcmUnLCAnbmVnYXRpdmUnLCAnb3V0bGluZWQnLCAnc3RyaWtlb3V0JywgJ2JvbGQnLCAncmVndWxhcicsICd1c2VUeXBvTWV0cmljcycsICd3d3MnLCAnb2JsaXF1ZSddKSxcbiAgICB1c0ZpcnN0Q2hhckluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gVGhlIG1pbmltdW0gVW5pY29kZSBpbmRleCBpbiB0aGlzIGZvbnRcbiAgICB1c0xhc3RDaGFySW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNiAvLyBUaGUgbWF4aW11bSBVbmljb2RlIGluZGV4IGluIHRoaXMgZm9udFxuXG4gIH0sXG4gIC8vIFRoZSBBcHBsZSB2ZXJzaW9uIG9mIHRoaXMgdGFibGUgZW5kcyBoZXJlLCBidXQgdGhlIE1pY3Jvc29mdCBvbmUgY29udGludWVzIG9uLi4uXG4gIDA6IHt9LFxuICAxOiB7XG4gICAgdHlwb0FzY2VuZGVyOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB0eXBvRGVzY2VuZGVyOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB0eXBvTGluZUdhcDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgd2luQXNjZW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgd2luRGVzY2VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvZGVQYWdlUmFuZ2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MzIsIDIpXG4gIH0sXG4gIDI6IHtcbiAgICAvLyB0aGVzZSBzaG91bGQgYmUgY29tbW9uIHdpdGggdmVyc2lvbiAxIHNvbWVob3dcbiAgICB0eXBvQXNjZW5kZXI6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHR5cG9EZXNjZW5kZXI6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHR5cG9MaW5lR2FwOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB3aW5Bc2NlbnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICB3aW5EZXNjZW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY29kZVBhZ2VSYW5nZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQzMiwgMiksXG4gICAgeEhlaWdodDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgY2FwSGVpZ2h0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICBkZWZhdWx0Q2hhcjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGJyZWFrQ2hhcjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG1heENvbnRlbnQ6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9LFxuICA1OiB7XG4gICAgdHlwb0FzY2VuZGVyOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB0eXBvRGVzY2VuZGVyOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB0eXBvTGluZUdhcDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgd2luQXNjZW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgd2luRGVzY2VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvZGVQYWdlUmFuZ2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MzIsIDIpLFxuICAgIHhIZWlnaHQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIGNhcEhlaWdodDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgZGVmYXVsdENoYXI6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBicmVha0NoYXI6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBtYXhDb250ZW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgdXNMb3dlck9wdGljYWxQb2ludFNpemU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICB1c1VwcGVyT3B0aWNhbFBvaW50U2l6ZTogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH1cbn0pO1xudmFyIHZlcnNpb25zJDEgPSBPUzIudmVyc2lvbnM7XG52ZXJzaW9ucyQxWzNdID0gdmVyc2lvbnMkMVs0XSA9IHZlcnNpb25zJDFbMl07XG5cbnZhciBwb3N0ID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS5maXhlZDMyLCB7XG4gIGhlYWRlcjoge1xuICAgIC8vIHRoZXNlIGZpZWxkcyBleGlzdCBhdCB0aGUgdG9wIG9mIGFsbCB2ZXJzaW9uc1xuICAgIGl0YWxpY0FuZ2xlOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICAgIC8vIEl0YWxpYyBhbmdsZSBpbiBjb3VudGVyLWNsb2Nrd2lzZSBkZWdyZWVzIGZyb20gdGhlIHZlcnRpY2FsLlxuICAgIHVuZGVybGluZVBvc2l0aW9uOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyBTdWdnZXN0ZWQgZGlzdGFuY2Ugb2YgdGhlIHRvcCBvZiB0aGUgdW5kZXJsaW5lIGZyb20gdGhlIGJhc2VsaW5lXG4gICAgdW5kZXJsaW5lVGhpY2tuZXNzOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyBTdWdnZXN0ZWQgdmFsdWVzIGZvciB0aGUgdW5kZXJsaW5lIHRoaWNrbmVzc1xuICAgIGlzRml4ZWRQaXRjaDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIC8vIFdoZXRoZXIgdGhlIGZvbnQgaXMgbW9ub3NwYWNlZFxuICAgIG1pbk1lbVR5cGU0MjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIC8vIE1pbmltdW0gbWVtb3J5IHVzYWdlIHdoZW4gYSBUcnVlVHlwZSBmb250IGlzIGRvd25sb2FkZWQgYXMgYSBUeXBlIDQyIGZvbnRcbiAgICBtYXhNZW1UeXBlNDI6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICAvLyBNYXhpbXVtIG1lbW9yeSB1c2FnZSB3aGVuIGEgVHJ1ZVR5cGUgZm9udCBpcyBkb3dubG9hZGVkIGFzIGEgVHlwZSA0MiBmb250XG4gICAgbWluTWVtVHlwZTE6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICAvLyBNaW5pbXVtIG1lbW9yeSB1c2FnZSB3aGVuIGEgVHJ1ZVR5cGUgZm9udCBpcyBkb3dubG9hZGVkIGFzIGEgVHlwZSAxIGZvbnRcbiAgICBtYXhNZW1UeXBlMTogcmVzdHJ1Y3R1cmUudWludDMyIC8vIE1heGltdW0gbWVtb3J5IHVzYWdlIHdoZW4gYSBUcnVlVHlwZSBmb250IGlzIGRvd25sb2FkZWQgYXMgYSBUeXBlIDEgZm9udFxuXG4gIH0sXG4gIDE6IHt9LFxuICAvLyB2ZXJzaW9uIDEgaGFzIG5vIGFkZGl0aW9uYWwgZmllbGRzXG4gIDI6IHtcbiAgICBudW1iZXJPZkdseXBoczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGdseXBoTmFtZUluZGV4OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnbnVtYmVyT2ZHbHlwaHMnKSxcbiAgICBuYW1lczogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5TdHJpbmcocmVzdHJ1Y3R1cmUudWludDgpKVxuICB9LFxuICAyLjU6IHtcbiAgICBudW1iZXJPZkdseXBoczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG9mZnNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgJ251bWJlck9mR2x5cGhzJylcbiAgfSxcbiAgMzoge30sXG4gIC8vIHZlcnNpb24gMyBoYXMgbm8gYWRkaXRpb25hbCBmaWVsZHNcbiAgNDoge1xuICAgIG1hcDogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQzMiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LnBhcmVudC5tYXhwLm51bUdseXBocztcbiAgICB9KVxuICB9XG59KTtcblxudmFyIGN2dCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBjb250cm9sVmFsdWVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUuaW50MTYpXG59KTtcblxuLy8gVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBrbm93biBhcyB0aGUgZm9udCBwcm9ncmFtLiBUaGUgbWFpbiB1c2Ugb2YgdGhpcyB0YWJsZVxuLy8gaXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGluIG1hbnkgZGlmZmVyZW50IGdseXBoIHByb2dyYW1zLlxuXG52YXIgZnBnbSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBpbnN0cnVjdGlvbnM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OClcbn0pO1xuXG52YXIgbG9jYSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QoJ2hlYWQuaW5kZXhUb0xvY0Zvcm1hdCcsIHtcbiAgMDoge1xuICAgIG9mZnNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYpXG4gIH0sXG4gIDE6IHtcbiAgICBvZmZzZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDMyKVxuICB9XG59KTtcblxubG9jYS5wcm9jZXNzID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy52ZXJzaW9uID09PSAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMub2Zmc2V0c1tpXSA8PD0gMTtcbiAgICB9XG4gIH1cbn07XG5cbmxvY2EucHJlRW5jb2RlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy52ZXJzaW9uICE9IG51bGwpIHJldHVybjsgLy8gYXNzdW1lIHRoaXMub2Zmc2V0cyBpcyBhIHNvcnRlZCBhcnJheVxuXG4gIHRoaXMudmVyc2lvbiA9IHRoaXMub2Zmc2V0c1t0aGlzLm9mZnNldHMubGVuZ3RoIC0gMV0gPiAweGZmZmYgPyAxIDogMDtcblxuICBpZiAodGhpcy52ZXJzaW9uID09PSAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMub2Zmc2V0c1tpXSA+Pj49IDE7XG4gICAgfVxuICB9XG59O1xuXG52YXIgcHJlcCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBjb250cm9sVmFsdWVQcm9ncmFtOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgpXG59KTtcblxudmFyIGdseWYgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLkJ1ZmZlcigpKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQxKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQxKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQxKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDEobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQxKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgQ0ZGSW5kZXggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDRkZJbmRleCh0eXBlKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBDRkZJbmRleC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmdldENGRlZlcnNpb24gPSBmdW5jdGlvbiBnZXRDRkZWZXJzaW9uKGN0eCkge1xuICAgIHdoaWxlIChjdHggJiYgIWN0eC5oZHJTaXplKSB7XG4gICAgICBjdHggPSBjdHgucGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiBjdHggPyBjdHgudmVyc2lvbiA6IC0xO1xuICB9O1xuXG4gIF9wcm90by5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICB2YXIgdmVyc2lvbiA9IHRoaXMuZ2V0Q0ZGVmVyc2lvbihwYXJlbnQpO1xuICAgIHZhciBjb3VudCA9IHZlcnNpb24gPj0gMiA/IHN0cmVhbS5yZWFkVUludDMyQkUoKSA6IHN0cmVhbS5yZWFkVUludDE2QkUoKTtcblxuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHZhciBvZmZTaXplID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuICAgIHZhciBvZmZzZXRUeXBlO1xuXG4gICAgaWYgKG9mZlNpemUgPT09IDEpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50ODtcbiAgICB9IGVsc2UgaWYgKG9mZlNpemUgPT09IDIpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50MTY7XG4gICAgfSBlbHNlIGlmIChvZmZTaXplID09PSAzKSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDI0O1xuICAgIH0gZWxzZSBpZiAob2ZmU2l6ZSA9PT0gNCkge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQzMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIG9mZnNldCBzaXplIGluIENGRkluZGV4OiBcIiArIG9mZlNpemUgKyBcIiBcIiArIHN0cmVhbS5wb3MpO1xuICAgIH1cblxuICAgIHZhciByZXQgPSBbXTtcbiAgICB2YXIgc3RhcnRQb3MgPSBzdHJlYW0ucG9zICsgKGNvdW50ICsgMSkgKiBvZmZTaXplIC0gMTtcbiAgICB2YXIgc3RhcnQgPSBvZmZzZXRUeXBlLmRlY29kZShzdHJlYW0pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICB2YXIgZW5kID0gb2Zmc2V0VHlwZS5kZWNvZGUoc3RyZWFtKTtcblxuICAgICAgaWYgKHRoaXMudHlwZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBwb3MgPSBzdHJlYW0ucG9zO1xuICAgICAgICBzdHJlYW0ucG9zID0gc3RhcnRQb3MgKyBzdGFydDtcbiAgICAgICAgcGFyZW50Lmxlbmd0aCA9IGVuZCAtIHN0YXJ0O1xuICAgICAgICByZXQucHVzaCh0aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSwgcGFyZW50KSk7XG4gICAgICAgIHN0cmVhbS5wb3MgPSBwb3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgb2Zmc2V0OiBzdGFydFBvcyArIHN0YXJ0LFxuICAgICAgICAgIGxlbmd0aDogZW5kIC0gc3RhcnRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHN0YXJ0ID0gZW5kO1xuICAgIH1cblxuICAgIHN0cmVhbS5wb3MgPSBzdGFydFBvcyArIHN0YXJ0O1xuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgX3Byb3RvLnNpemUgPSBmdW5jdGlvbiBzaXplKGFyciwgcGFyZW50KSB7XG4gICAgdmFyIHNpemUgPSAyO1xuXG4gICAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBzaXplO1xuICAgIH1cblxuICAgIHZhciB0eXBlID0gdGhpcy50eXBlIHx8IG5ldyByZXN0cnVjdHVyZS5CdWZmZXIoKTsgLy8gZmluZCBtYXhpbXVtIG9mZnNldCB0byBkZXRtaW5pbmUgb2Zmc2V0IHR5cGVcblxuICAgIHZhciBvZmZzZXQgPSAxO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gYXJyW2ldO1xuICAgICAgb2Zmc2V0ICs9IHR5cGUuc2l6ZShpdGVtLCBwYXJlbnQpO1xuICAgIH1cblxuICAgIHZhciBvZmZzZXRUeXBlO1xuXG4gICAgaWYgKG9mZnNldCA8PSAweGZmKSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDg7XG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gMHhmZmZmKSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDE2O1xuICAgIH0gZWxzZSBpZiAob2Zmc2V0IDw9IDB4ZmZmZmZmKSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDI0O1xuICAgIH0gZWxzZSBpZiAob2Zmc2V0IDw9IDB4ZmZmZmZmZmYpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50MzI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCBvZmZzZXQgaW4gQ0ZGSW5kZXhcIik7XG4gICAgfVxuXG4gICAgc2l6ZSArPSAxICsgb2Zmc2V0VHlwZS5zaXplKCkgKiAoYXJyLmxlbmd0aCArIDEpO1xuICAgIHNpemUgKz0gb2Zmc2V0IC0gMTtcbiAgICByZXR1cm4gc2l6ZTtcbiAgfTtcblxuICBfcHJvdG8uZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0cmVhbSwgYXJyLCBwYXJlbnQpIHtcbiAgICBzdHJlYW0ud3JpdGVVSW50MTZCRShhcnIubGVuZ3RoKTtcblxuICAgIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHR5cGUgPSB0aGlzLnR5cGUgfHwgbmV3IHJlc3RydWN0dXJlLkJ1ZmZlcigpOyAvLyBmaW5kIG1heGltdW0gb2Zmc2V0IHRvIGRldG1pbmluZSBvZmZzZXQgdHlwZVxuXG4gICAgdmFyIHNpemVzID0gW107XG4gICAgdmFyIG9mZnNldCA9IDE7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDEoYXJyKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBpdGVtID0gX3N0ZXAudmFsdWU7XG4gICAgICB2YXIgcyA9IHR5cGUuc2l6ZShpdGVtLCBwYXJlbnQpO1xuICAgICAgc2l6ZXMucHVzaChzKTtcbiAgICAgIG9mZnNldCArPSBzO1xuICAgIH1cblxuICAgIHZhciBvZmZzZXRUeXBlO1xuXG4gICAgaWYgKG9mZnNldCA8PSAweGZmKSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDg7XG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gMHhmZmZmKSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDE2O1xuICAgIH0gZWxzZSBpZiAob2Zmc2V0IDw9IDB4ZmZmZmZmKSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDI0O1xuICAgIH0gZWxzZSBpZiAob2Zmc2V0IDw9IDB4ZmZmZmZmZmYpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50MzI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCBvZmZzZXQgaW4gQ0ZGSW5kZXhcIik7XG4gICAgfSAvLyB3cml0ZSBvZmZzZXQgc2l6ZVxuXG5cbiAgICBzdHJlYW0ud3JpdGVVSW50OChvZmZzZXRUeXBlLnNpemUoKSk7IC8vIHdyaXRlIGVsZW1lbnRzXG5cbiAgICBvZmZzZXQgPSAxO1xuICAgIG9mZnNldFR5cGUuZW5jb2RlKHN0cmVhbSwgb2Zmc2V0KTtcblxuICAgIGZvciAodmFyIF9pID0gMCwgX3NpemVzID0gc2l6ZXM7IF9pIDwgX3NpemVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNpemUgPSBfc2l6ZXNbX2ldO1xuICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgICBvZmZzZXRUeXBlLmVuY29kZShzdHJlYW0sIG9mZnNldCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkMShhcnIpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgdmFyIF9pdGVtID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgdHlwZS5lbmNvZGUoc3RyZWFtLCBfaXRlbSwgcGFyZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH07XG5cbiAgcmV0dXJuIENGRkluZGV4O1xufSgpO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG52YXIgaXNBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICB2YXIgc3RyID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG4gIHZhciBpc0FyZ3MgPSBzdHIgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4gIGlmICghaXNBcmdzKSB7XG4gICAgaXNBcmdzID0gc3RyICE9PSAnW29iamVjdCBBcnJheV0nICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcicgJiYgdmFsdWUubGVuZ3RoID49IDAgJiYgdG9TdHIuY2FsbCh2YWx1ZS5jYWxsZWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICB9XG5cbiAgcmV0dXJuIGlzQXJncztcbn07XG5cbnZhciBrZXlzU2hpbTtcblxuaWYgKCFPYmplY3Qua2V5cykge1xuICAvLyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbVxuICB2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHRvU3RyJDEgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICB2YXIgaXNBcmdzID0gaXNBcmd1bWVudHM7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2xvYmFsLXJlcXVpcmVcblxuICB2YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgdmFyIGhhc0RvbnRFbnVtQnVnID0gIWlzRW51bWVyYWJsZS5jYWxsKHtcbiAgICB0b1N0cmluZzogbnVsbFxuICB9LCAndG9TdHJpbmcnKTtcbiAgdmFyIGhhc1Byb3RvRW51bUJ1ZyA9IGlzRW51bWVyYWJsZS5jYWxsKGZ1bmN0aW9uICgpIHt9LCAncHJvdG90eXBlJyk7XG4gIHZhciBkb250RW51bXMgPSBbJ3RvU3RyaW5nJywgJ3RvTG9jYWxlU3RyaW5nJywgJ3ZhbHVlT2YnLCAnaGFzT3duUHJvcGVydHknLCAnaXNQcm90b3R5cGVPZicsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICdjb25zdHJ1Y3RvciddO1xuXG4gIHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKG8pIHtcbiAgICB2YXIgY3RvciA9IG8uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3IgJiYgY3Rvci5wcm90b3R5cGUgPT09IG87XG4gIH07XG5cbiAgdmFyIGV4Y2x1ZGVkS2V5cyA9IHtcbiAgICAkYXBwbGljYXRpb25DYWNoZTogdHJ1ZSxcbiAgICAkY29uc29sZTogdHJ1ZSxcbiAgICAkZXh0ZXJuYWw6IHRydWUsXG4gICAgJGZyYW1lOiB0cnVlLFxuICAgICRmcmFtZUVsZW1lbnQ6IHRydWUsXG4gICAgJGZyYW1lczogdHJ1ZSxcbiAgICAkaW5uZXJIZWlnaHQ6IHRydWUsXG4gICAgJGlubmVyV2lkdGg6IHRydWUsXG4gICAgJG9ubW96ZnVsbHNjcmVlbmNoYW5nZTogdHJ1ZSxcbiAgICAkb25tb3pmdWxsc2NyZWVuZXJyb3I6IHRydWUsXG4gICAgJG91dGVySGVpZ2h0OiB0cnVlLFxuICAgICRvdXRlcldpZHRoOiB0cnVlLFxuICAgICRwYWdlWE9mZnNldDogdHJ1ZSxcbiAgICAkcGFnZVlPZmZzZXQ6IHRydWUsXG4gICAgJHBhcmVudDogdHJ1ZSxcbiAgICAkc2Nyb2xsTGVmdDogdHJ1ZSxcbiAgICAkc2Nyb2xsVG9wOiB0cnVlLFxuICAgICRzY3JvbGxYOiB0cnVlLFxuICAgICRzY3JvbGxZOiB0cnVlLFxuICAgICRzZWxmOiB0cnVlLFxuICAgICR3ZWJraXRJbmRleGVkREI6IHRydWUsXG4gICAgJHdlYmtpdFN0b3JhZ2VJbmZvOiB0cnVlLFxuICAgICR3aW5kb3c6IHRydWVcbiAgfTtcblxuICB2YXIgaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnID0gZnVuY3Rpb24gKCkge1xuICAgIC8qIGdsb2JhbCB3aW5kb3cgKi9cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBrIGluIHdpbmRvdykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFleGNsdWRlZEtleXNbJyQnICsga10gJiYgaGFzLmNhbGwod2luZG93LCBrKSAmJiB3aW5kb3dba10gIT09IG51bGwgJiYgdHlwZW9mIHdpbmRvd1trXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUod2luZG93W2tdKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KCk7XG5cbiAgdmFyIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneSA9IGZ1bmN0aW9uIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvKSB7XG4gICAgLyogZ2xvYmFsIHdpbmRvdyAqL1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnKSB7XG4gICAgICByZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUobyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIGtleXNTaGltID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgICB2YXIgaXNPYmplY3QgPSBvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCc7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSB0b1N0ciQxLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB2YXIgaXNBcmd1bWVudHMgPSBpc0FyZ3Mob2JqZWN0KTtcbiAgICB2YXIgaXNTdHJpbmcgPSBpc09iamVjdCAmJiB0b1N0ciQxLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG4gICAgdmFyIHRoZUtleXMgPSBbXTtcblxuICAgIGlmICghaXNPYmplY3QgJiYgIWlzRnVuY3Rpb24gJiYgIWlzQXJndW1lbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgdmFyIHNraXBQcm90byA9IGhhc1Byb3RvRW51bUJ1ZyAmJiBpc0Z1bmN0aW9uO1xuXG4gICAgaWYgKGlzU3RyaW5nICYmIG9iamVjdC5sZW5ndGggPiAwICYmICFoYXMuY2FsbChvYmplY3QsIDApKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuICAgICAgICB0aGVLZXlzLnB1c2goU3RyaW5nKGkpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNBcmd1bWVudHMgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqZWN0Lmxlbmd0aDsgKytqKSB7XG4gICAgICAgIHRoZUtleXMucHVzaChTdHJpbmcoaikpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIG9iamVjdCkge1xuICAgICAgICBpZiAoIShza2lwUHJvdG8gJiYgbmFtZSA9PT0gJ3Byb3RvdHlwZScpICYmIGhhcy5jYWxsKG9iamVjdCwgbmFtZSkpIHtcbiAgICAgICAgICB0aGVLZXlzLnB1c2goU3RyaW5nKG5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNEb250RW51bUJ1Zykge1xuICAgICAgdmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuXG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IGRvbnRFbnVtcy5sZW5ndGg7ICsraykge1xuICAgICAgICBpZiAoIShza2lwQ29uc3RydWN0b3IgJiYgZG9udEVudW1zW2tdID09PSAnY29uc3RydWN0b3InKSAmJiBoYXMuY2FsbChvYmplY3QsIGRvbnRFbnVtc1trXSkpIHtcbiAgICAgICAgICB0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGVLZXlzO1xuICB9O1xufVxuXG52YXIgaW1wbGVtZW50YXRpb24gPSBrZXlzU2hpbTtcblxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIG9yaWdLZXlzID0gT2JqZWN0LmtleXM7XG52YXIga2V5c1NoaW0kMSA9IG9yaWdLZXlzID8gZnVuY3Rpb24ga2V5cyhvKSB7XG4gIHJldHVybiBvcmlnS2V5cyhvKTtcbn0gOiBpbXBsZW1lbnRhdGlvbjtcbnZhciBvcmlnaW5hbEtleXMgPSBPYmplY3Qua2V5cztcblxua2V5c1NoaW0kMS5zaGltID0gZnVuY3Rpb24gc2hpbU9iamVjdEtleXMoKSB7XG4gIGlmIChPYmplY3Qua2V5cykge1xuICAgIHZhciBrZXlzV29ya3NXaXRoQXJndW1lbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gU2FmYXJpIDUuMCBidWdcbiAgICAgIHZhciBhcmdzID0gT2JqZWN0LmtleXMoYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBhcmdzICYmIGFyZ3MubGVuZ3RoID09PSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIH0oMSwgMik7XG5cbiAgICBpZiAoIWtleXNXb3Jrc1dpdGhBcmd1bWVudHMpIHtcbiAgICAgIE9iamVjdC5rZXlzID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICAgICAgaWYgKGlzQXJndW1lbnRzKG9iamVjdCkpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxLZXlzKHNsaWNlLmNhbGwob2JqZWN0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3JpZ2luYWxLZXlzKG9iamVjdCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBPYmplY3Qua2V5cyA9IGtleXNTaGltJDE7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXMgfHwga2V5c1NoaW0kMTtcbn07XG5cbnZhciBvYmplY3RLZXlzID0ga2V5c1NoaW0kMTtcblxudmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJztcbnZhciB0b1N0ciQyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIGlzU3RhbmRhcmRBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICBpZiAoaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdG9TdHIkMi5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG59O1xuXG52YXIgaXNMZWdhY3lBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICBpZiAoaXNTdGFuZGFyZEFyZ3VtZW50cyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmIHZhbHVlLmxlbmd0aCA+PSAwICYmIHRvU3RyJDIuY2FsbCh2YWx1ZSkgIT09ICdbb2JqZWN0IEFycmF5XScgJiYgdG9TdHIkMi5jYWxsKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgc3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzU3RhbmRhcmRBcmd1bWVudHMoYXJndW1lbnRzKTtcbn0oKTtcblxuaXNTdGFuZGFyZEFyZ3VtZW50cy5pc0xlZ2FjeUFyZ3VtZW50cyA9IGlzTGVnYWN5QXJndW1lbnRzOyAvLyBmb3IgdGVzdHNcblxudmFyIGlzQXJndW1lbnRzJDEgPSBzdXBwb3J0c1N0YW5kYXJkQXJndW1lbnRzID8gaXNTdGFuZGFyZEFyZ3VtZW50cyA6IGlzTGVnYWN5QXJndW1lbnRzO1xuXG52YXIgaGFzU3ltYm9scyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbCgnZm9vJykgPT09ICdzeW1ib2wnO1xudmFyIHRvU3RyJDMgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGNvbmNhdCA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQ7XG52YXIgb3JpZ0RlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG52YXIgaXNGdW5jdGlvbiQxID0gZnVuY3Rpb24gaXNGdW5jdGlvbihmbikge1xuICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nICYmIHRvU3RyJDMuY2FsbChmbikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgYXJlUHJvcGVydHlEZXNjcmlwdG9yc1N1cHBvcnRlZCA9IGZ1bmN0aW9uIGFyZVByb3BlcnR5RGVzY3JpcHRvcnNTdXBwb3J0ZWQoKSB7XG4gIHZhciBvYmogPSB7fTtcblxuICB0cnkge1xuICAgIG9yaWdEZWZpbmVQcm9wZXJ0eShvYmosICd4Jywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogb2JqXG4gICAgfSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycywgbm8tcmVzdHJpY3RlZC1zeW50YXhcblxuICAgIGZvciAodmFyIF8gaW4gb2JqKSB7XG4gICAgICAvLyBqc2NzOmlnbm9yZSBkaXNhbGxvd1VudXNlZFZhcmlhYmxlc1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBvYmoueCA9PT0gb2JqO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLyogdGhpcyBpcyBJRSA4LiAqL1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxudmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMgPSBvcmlnRGVmaW5lUHJvcGVydHkgJiYgYXJlUHJvcGVydHlEZXNjcmlwdG9yc1N1cHBvcnRlZCgpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIG5hbWUsIHZhbHVlLCBwcmVkaWNhdGUpIHtcbiAgaWYgKG5hbWUgaW4gb2JqZWN0ICYmICghaXNGdW5jdGlvbiQxKHByZWRpY2F0ZSkgfHwgIXByZWRpY2F0ZSgpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgb3JpZ0RlZmluZVByb3BlcnR5KG9iamVjdCwgbmFtZSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtuYW1lXSA9IHZhbHVlO1xuICB9XG59O1xuXG52YXIgZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBtYXApIHtcbiAgdmFyIHByZWRpY2F0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICB2YXIgcHJvcHMgPSBvYmplY3RLZXlzKG1hcCk7XG5cbiAgaWYgKGhhc1N5bWJvbHMpIHtcbiAgICBwcm9wcyA9IGNvbmNhdC5jYWxsKHByb3BzLCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG1hcCkpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcHNbaV0sIG1hcFtwcm9wc1tpXV0sIHByZWRpY2F0ZXNbcHJvcHNbaV1dKTtcbiAgfVxufTtcblxuZGVmaW5lUHJvcGVydGllcy5zdXBwb3J0c0Rlc2NyaXB0b3JzID0gISFzdXBwb3J0c0Rlc2NyaXB0b3JzO1xudmFyIGRlZmluZVByb3BlcnRpZXNfMSA9IGRlZmluZVByb3BlcnRpZXM7XG5cbi8qIGVzbGludCBuby1pbnZhbGlkLXRoaXM6IDEgKi9cblxudmFyIEVSUk9SX01FU1NBR0UgPSAnRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgY2FsbGVkIG9uIGluY29tcGF0aWJsZSAnO1xudmFyIHNsaWNlJDEgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHIkNCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY1R5cGUgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXG52YXIgaW1wbGVtZW50YXRpb24kMSA9IGZ1bmN0aW9uIGJpbmQodGhhdCkge1xuICB2YXIgdGFyZ2V0ID0gdGhpcztcblxuICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ciQ0LmNhbGwodGFyZ2V0KSAhPT0gZnVuY1R5cGUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUk9SX01FU1NBR0UgKyB0YXJnZXQpO1xuICB9XG5cbiAgdmFyIGFyZ3MgPSBzbGljZSQxLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGJvdW5kO1xuXG4gIHZhciBiaW5kZXIgPSBmdW5jdGlvbiBiaW5kZXIoKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseSh0aGlzLCBhcmdzLmNvbmNhdChzbGljZSQxLmNhbGwoYXJndW1lbnRzKSkpO1xuXG4gICAgICBpZiAoT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRhcmdldC5hcHBseSh0aGF0LCBhcmdzLmNvbmNhdChzbGljZSQxLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgYm91bmRMZW5ndGggPSBNYXRoLm1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICB2YXIgYm91bmRBcmdzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3VuZExlbmd0aDsgaSsrKSB7XG4gICAgYm91bmRBcmdzLnB1c2goJyQnICsgaSk7XG4gIH1cblxuICBib3VuZCA9IEZ1bmN0aW9uKCdiaW5kZXInLCAncmV0dXJuIGZ1bmN0aW9uICgnICsgYm91bmRBcmdzLmpvaW4oJywnKSArICcpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsgfScpKGJpbmRlcik7XG5cbiAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICB2YXIgRW1wdHkgPSBmdW5jdGlvbiBFbXB0eSgpIHt9O1xuXG4gICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICBib3VuZC5wcm90b3R5cGUgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eS5wcm90b3R5cGUgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGJvdW5kO1xufTtcblxudmFyIGZ1bmN0aW9uQmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGltcGxlbWVudGF0aW9uJDE7XG5cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMThdLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xuXG52YXIgc2hhbXMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIG9iaiA9IHt9O1xuICB2YXIgc3ltID0gU3ltYm9sKCd0ZXN0Jyk7XG4gIHZhciBzeW1PYmogPSBPYmplY3Qoc3ltKTtcblxuICBpZiAodHlwZW9mIHN5bSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW1PYmopICE9PSAnW29iamVjdCBTeW1ib2xdJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL29iamVjdC5hc3NpZ24vaXNzdWVzLzE3XG4gIC8vIGlmIChzeW0gaW5zdGFuY2VvZiBTeW1ib2wpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL2dldC1vd24tcHJvcGVydHktc3ltYm9scy9pc3N1ZXMvNFxuICAvLyBpZiAoIShzeW1PYmogaW5zdGFuY2VvZiBTeW1ib2wpKSB7IHJldHVybiBmYWxzZTsgfVxuICAvLyBpZiAodHlwZW9mIFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIC8vIGlmIChTdHJpbmcoc3ltKSAhPT0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblxuICB2YXIgc3ltVmFsID0gNDI7XG4gIG9ialtzeW1dID0gc3ltVmFsO1xuXG4gIGZvciAoc3ltIGluIG9iaikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cblxuICBpZiAodHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBzeW1zID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuXG4gIGlmIChzeW1zLmxlbmd0aCAhPT0gMSB8fCBzeW1zWzBdICE9PSBzeW0pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pO1xuXG4gICAgaWYgKGRlc2NyaXB0b3IudmFsdWUgIT09IHN5bVZhbCB8fCBkZXNjcmlwdG9yLmVudW1lcmFibGUgIT09IHRydWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBvcmlnU3ltYm9sID0gY29tbW9uanNHbG9iYWwuU3ltYm9sO1xuXG52YXIgaGFzU3ltYm9scyQxID0gZnVuY3Rpb24gaGFzTmF0aXZlU3ltYm9scygpIHtcbiAgaWYgKHR5cGVvZiBvcmlnU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIG9yaWdTeW1ib2woJ2ZvbycpICE9PSAnc3ltYm9sJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgU3ltYm9sKCdiYXInKSAhPT0gJ3N5bWJvbCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gc2hhbXMoKTtcbn07XG5cbi8qIGdsb2JhbHNcblx0QXRvbWljcyxcblx0U2hhcmVkQXJyYXlCdWZmZXIsXG4qL1xuXG5cbnZhciB1bmRlZmluZWQkMTtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xudmFyICRnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuaWYgKCRnT1BEKSB7XG4gIHRyeSB7XG4gICAgJGdPUEQoe30sICcnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgICRnT1BEID0gbnVsbDsgLy8gdGhpcyBpcyBJRSA4LCB3aGljaCBoYXMgYSBicm9rZW4gZ09QRFxuICB9XG59XG5cbnZhciB0aHJvd1R5cGVFcnJvciA9IGZ1bmN0aW9uIHRocm93VHlwZUVycm9yKCkge1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcblxudmFyIFRocm93VHlwZUVycm9yID0gJGdPUEQgPyBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcbiAgICBhcmd1bWVudHMuY2FsbGVlOyAvLyBJRSA4IGRvZXMgbm90IHRocm93IGhlcmVcblxuICAgIHJldHVybiB0aHJvd1R5cGVFcnJvcjtcbiAgfSBjYXRjaCAoY2FsbGVlVGhyb3dzKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIElFIDggdGhyb3dzIG9uIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXJndW1lbnRzLCAnJylcbiAgICAgIHJldHVybiAkZ09QRChhcmd1bWVudHMsICdjYWxsZWUnKS5nZXQ7XG4gICAgfSBjYXRjaCAoZ09QRHRocm93cykge1xuICAgICAgcmV0dXJuIHRocm93VHlwZUVycm9yO1xuICAgIH1cbiAgfVxufSgpIDogdGhyb3dUeXBlRXJyb3I7XG52YXIgaGFzU3ltYm9scyQyID0gaGFzU3ltYm9scyQxKCk7XG5cbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoeCkge1xuICByZXR1cm4geC5fX3Byb3RvX187XG59OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG5cbnZhciBnZW5lcmF0b3JGdW5jdGlvbiA9ICB1bmRlZmluZWQkMTtcblxudmFyIGFzeW5jRnVuY3Rpb24gPSAgdW5kZWZpbmVkJDE7XG5cbnZhciBhc3luY0dlbkZ1bmN0aW9uID0gIHVuZGVmaW5lZCQxO1xudmFyIFR5cGVkQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IGdldFByb3RvKFVpbnQ4QXJyYXkpO1xudmFyIElOVFJJTlNJQ1MgPSB7XG4gICclQXJyYXklJzogQXJyYXksXG4gICclQXJyYXlCdWZmZXIlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogQXJyYXlCdWZmZXIsXG4gICclQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogQXJyYXlCdWZmZXIucHJvdG90eXBlLFxuICAnJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyQyID8gZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCQxLFxuICAnJUFycmF5UHJvdG90eXBlJSc6IEFycmF5LnByb3RvdHlwZSxcbiAgJyVBcnJheVByb3RvX2VudHJpZXMlJzogQXJyYXkucHJvdG90eXBlLmVudHJpZXMsXG4gICclQXJyYXlQcm90b19mb3JFYWNoJSc6IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLFxuICAnJUFycmF5UHJvdG9fa2V5cyUnOiBBcnJheS5wcm90b3R5cGUua2V5cyxcbiAgJyVBcnJheVByb3RvX3ZhbHVlcyUnOiBBcnJheS5wcm90b3R5cGUudmFsdWVzLFxuICAnJUFzeW5jRnJvbVN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB1bmRlZmluZWQkMSxcbiAgJyVBc3luY0Z1bmN0aW9uJSc6IGFzeW5jRnVuY3Rpb24sXG4gICclQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnOiAgdW5kZWZpbmVkJDEsXG4gICclQXN5bmNHZW5lcmF0b3IlJzogIHVuZGVmaW5lZCQxLFxuICAnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzogYXN5bmNHZW5GdW5jdGlvbixcbiAgJyVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiAgdW5kZWZpbmVkJDEsXG4gICclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiAgdW5kZWZpbmVkJDEsXG4gICclQXRvbWljcyUnOiB0eXBlb2YgQXRvbWljcyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEF0b21pY3MsXG4gICclQm9vbGVhbiUnOiBCb29sZWFuLFxuICAnJUJvb2xlYW5Qcm90b3R5cGUlJzogQm9vbGVhbi5wcm90b3R5cGUsXG4gICclRGF0YVZpZXclJzogdHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogRGF0YVZpZXcsXG4gICclRGF0YVZpZXdQcm90b3R5cGUlJzogdHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogRGF0YVZpZXcucHJvdG90eXBlLFxuICAnJURhdGUlJzogRGF0ZSxcbiAgJyVEYXRlUHJvdG90eXBlJSc6IERhdGUucHJvdG90eXBlLFxuICAnJWRlY29kZVVSSSUnOiBkZWNvZGVVUkksXG4gICclZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcbiAgJyVlbmNvZGVVUkklJzogZW5jb2RlVVJJLFxuICAnJWVuY29kZVVSSUNvbXBvbmVudCUnOiBlbmNvZGVVUklDb21wb25lbnQsXG4gICclRXJyb3IlJzogRXJyb3IsXG4gICclRXJyb3JQcm90b3R5cGUlJzogRXJyb3IucHJvdG90eXBlLFxuICAnJWV2YWwlJzogZXZhbCxcbiAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1ldmFsXG4gICclRXZhbEVycm9yJSc6IEV2YWxFcnJvcixcbiAgJyVFdmFsRXJyb3JQcm90b3R5cGUlJzogRXZhbEVycm9yLnByb3RvdHlwZSxcbiAgJyVGbG9hdDMyQXJyYXklJzogdHlwZW9mIEZsb2F0MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEZsb2F0MzJBcnJheSxcbiAgJyVGbG9hdDMyQXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIEZsb2F0MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEZsb2F0MzJBcnJheS5wcm90b3R5cGUsXG4gICclRmxvYXQ2NEFycmF5JSc6IHR5cGVvZiBGbG9hdDY0QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBGbG9hdDY0QXJyYXksXG4gICclRmxvYXQ2NEFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBGbG9hdDY0QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBGbG9hdDY0QXJyYXkucHJvdG90eXBlLFxuICAnJUZ1bmN0aW9uJSc6IEZ1bmN0aW9uLFxuICAnJUZ1bmN0aW9uUHJvdG90eXBlJSc6IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgJyVHZW5lcmF0b3IlJzogIHVuZGVmaW5lZCQxLFxuICAnJUdlbmVyYXRvckZ1bmN0aW9uJSc6IGdlbmVyYXRvckZ1bmN0aW9uLFxuICAnJUdlbmVyYXRvclByb3RvdHlwZSUnOiAgdW5kZWZpbmVkJDEsXG4gICclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBJbnQ4QXJyYXksXG4gICclSW50OEFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBJbnQ4QXJyYXkucHJvdG90eXBlLFxuICAnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBJbnQxNkFycmF5LFxuICAnJUludDE2QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBJbnQ4QXJyYXkucHJvdG90eXBlLFxuICAnJUludDMyQXJyYXklJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBJbnQzMkFycmF5LFxuICAnJUludDMyQXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIEludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBJbnQzMkFycmF5LnByb3RvdHlwZSxcbiAgJyVpc0Zpbml0ZSUnOiBpc0Zpbml0ZSxcbiAgJyVpc05hTiUnOiBpc05hTixcbiAgJyVJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzJDIgPyBnZXRQcm90byhnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpKSA6IHVuZGVmaW5lZCQxLFxuICAnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCQxLFxuICAnJUpTT05QYXJzZSUnOiB0eXBlb2YgSlNPTiA9PT0gJ29iamVjdCcgPyBKU09OLnBhcnNlIDogdW5kZWZpbmVkJDEsXG4gICclTWFwJSc6IHR5cGVvZiBNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBNYXAsXG4gICclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMkMiA/IHVuZGVmaW5lZCQxIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG4gICclTWFwUHJvdG90eXBlJSc6IHR5cGVvZiBNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBNYXAucHJvdG90eXBlLFxuICAnJU1hdGglJzogTWF0aCxcbiAgJyVOdW1iZXIlJzogTnVtYmVyLFxuICAnJU51bWJlclByb3RvdHlwZSUnOiBOdW1iZXIucHJvdG90eXBlLFxuICAnJU9iamVjdCUnOiBPYmplY3QsXG4gICclT2JqZWN0UHJvdG90eXBlJSc6IE9iamVjdC5wcm90b3R5cGUsXG4gICclT2JqUHJvdG9fdG9TdHJpbmclJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxcbiAgJyVPYmpQcm90b192YWx1ZU9mJSc6IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZixcbiAgJyVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG4gICclcGFyc2VJbnQlJzogcGFyc2VJbnQsXG4gICclUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFByb21pc2UsXG4gICclUHJvbWlzZVByb3RvdHlwZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFByb21pc2UucHJvdG90eXBlLFxuICAnJVByb21pc2VQcm90b190aGVuJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogUHJvbWlzZS5wcm90b3R5cGUudGhlbixcbiAgJyVQcm9taXNlX2FsbCUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFByb21pc2UuYWxsLFxuICAnJVByb21pc2VfcmVqZWN0JSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogUHJvbWlzZS5yZWplY3QsXG4gICclUHJvbWlzZV9yZXNvbHZlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogUHJvbWlzZS5yZXNvbHZlLFxuICAnJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFByb3h5LFxuICAnJVJhbmdlRXJyb3IlJzogUmFuZ2VFcnJvcixcbiAgJyVSYW5nZUVycm9yUHJvdG90eXBlJSc6IFJhbmdlRXJyb3IucHJvdG90eXBlLFxuICAnJVJlZmVyZW5jZUVycm9yJSc6IFJlZmVyZW5jZUVycm9yLFxuICAnJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IFJlZmVyZW5jZUVycm9yLnByb3RvdHlwZSxcbiAgJyVSZWZsZWN0JSc6IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogUmVmbGVjdCxcbiAgJyVSZWdFeHAlJzogUmVnRXhwLFxuICAnJVJlZ0V4cFByb3RvdHlwZSUnOiBSZWdFeHAucHJvdG90eXBlLFxuICAnJVNldCUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogU2V0LFxuICAnJVNldEl0ZXJhdG9yUHJvdG90eXBlJSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNTeW1ib2xzJDIgPyB1bmRlZmluZWQkMSA6IGdldFByb3RvKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuICAnJVNldFByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogU2V0LnByb3RvdHlwZSxcbiAgJyVTaGFyZWRBcnJheUJ1ZmZlciUnOiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBTaGFyZWRBcnJheUJ1ZmZlcixcbiAgJyVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBTaGFyZWRBcnJheUJ1ZmZlci5wcm90b3R5cGUsXG4gICclU3RyaW5nJSc6IFN0cmluZyxcbiAgJyVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzJDIgPyBnZXRQcm90bygnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkJDEsXG4gICclU3RyaW5nUHJvdG90eXBlJSc6IFN0cmluZy5wcm90b3R5cGUsXG4gICclU3ltYm9sJSc6IGhhc1N5bWJvbHMkMiA/IFN5bWJvbCA6IHVuZGVmaW5lZCQxLFxuICAnJVN5bWJvbFByb3RvdHlwZSUnOiBoYXNTeW1ib2xzJDIgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkJDEsXG4gICclU3ludGF4RXJyb3IlJzogU3ludGF4RXJyb3IsXG4gICclU3ludGF4RXJyb3JQcm90b3R5cGUlJzogU3ludGF4RXJyb3IucHJvdG90eXBlLFxuICAnJVRocm93VHlwZUVycm9yJSc6IFRocm93VHlwZUVycm9yLFxuICAnJVR5cGVkQXJyYXklJzogVHlwZWRBcnJheSxcbiAgJyVUeXBlZEFycmF5UHJvdG90eXBlJSc6IFR5cGVkQXJyYXkgPyBUeXBlZEFycmF5LnByb3RvdHlwZSA6IHVuZGVmaW5lZCQxLFxuICAnJVR5cGVFcnJvciUnOiAkVHlwZUVycm9yLFxuICAnJVR5cGVFcnJvclByb3RvdHlwZSUnOiAkVHlwZUVycm9yLnByb3RvdHlwZSxcbiAgJyVVaW50OEFycmF5JSc6IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogVWludDhBcnJheSxcbiAgJyVVaW50OEFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogVWludDhBcnJheS5wcm90b3R5cGUsXG4gICclVWludDhDbGFtcGVkQXJyYXklJzogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogVWludDhDbGFtcGVkQXJyYXksXG4gICclVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlLFxuICAnJVVpbnQxNkFycmF5JSc6IHR5cGVvZiBVaW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFVpbnQxNkFycmF5LFxuICAnJVVpbnQxNkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBVaW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFVpbnQxNkFycmF5LnByb3RvdHlwZSxcbiAgJyVVaW50MzJBcnJheSUnOiB0eXBlb2YgVWludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBVaW50MzJBcnJheSxcbiAgJyVVaW50MzJBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgVWludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBVaW50MzJBcnJheS5wcm90b3R5cGUsXG4gICclVVJJRXJyb3IlJzogVVJJRXJyb3IsXG4gICclVVJJRXJyb3JQcm90b3R5cGUlJzogVVJJRXJyb3IucHJvdG90eXBlLFxuICAnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBXZWFrTWFwLFxuICAnJVdlYWtNYXBQcm90b3R5cGUlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBXZWFrTWFwLnByb3RvdHlwZSxcbiAgJyVXZWFrU2V0JSc6IHR5cGVvZiBXZWFrU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogV2Vha1NldCxcbiAgJyVXZWFrU2V0UHJvdG90eXBlJSc6IHR5cGVvZiBXZWFrU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogV2Vha1NldC5wcm90b3R5cGVcbn07XG52YXIgJHJlcGxhY2UgPSBmdW5jdGlvbkJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpO1xuLyogYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvNC4xNy4xNS9kaXN0L2xvZGFzaC5qcyNMNjczNS1MNjc0NCAqL1xuXG52YXIgcmVQcm9wTmFtZSA9IC9bXiUuW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JSQpKS9nO1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG5cbnZhciBzdHJpbmdUb1BhdGggPSBmdW5jdGlvbiBzdHJpbmdUb1BhdGgoc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgJHJlcGxhY2Uoc3RyaW5nLCByZVByb3BOYW1lLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHF1b3RlID8gJHJlcGxhY2Uoc3ViU3RyaW5nLCByZUVzY2FwZUNoYXIsICckMScpIDogbnVtYmVyIHx8IG1hdGNoO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4vKiBlbmQgYWRhcHRhdGlvbiAqL1xuXG5cbnZhciBnZXRCYXNlSW50cmluc2ljID0gZnVuY3Rpb24gZ2V0QmFzZUludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcbiAgaWYgKCEobmFtZSBpbiBJTlRSSU5TSUNTKSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBkb2VzIG5vdCBleGlzdCEnKTtcbiAgfSAvLyBpc3RhbmJ1bCBpZ25vcmUgaWYgLy8gaG9wZWZ1bGx5IHRoaXMgaXMgaW1wb3NzaWJsZSB0byB0ZXN0IDotKVxuXG5cbiAgaWYgKHR5cGVvZiBJTlRSSU5TSUNTW25hbWVdID09PSAndW5kZWZpbmVkJyAmJiAhYWxsb3dNaXNzaW5nKSB7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJyk7XG4gIH1cblxuICByZXR1cm4gSU5UUklOU0lDU1tuYW1lXTtcbn07XG5cbnZhciBHZXRJbnRyaW5zaWMgPSBmdW5jdGlvbiBHZXRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnRyaW5zaWMgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhbGxvd01pc3NpbmcgIT09ICdib29sZWFuJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYWxsb3dNaXNzaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgfVxuXG4gIHZhciBwYXJ0cyA9IHN0cmluZ1RvUGF0aChuYW1lKTtcbiAgdmFyIHZhbHVlID0gZ2V0QmFzZUludHJpbnNpYygnJScgKyAocGFydHMubGVuZ3RoID4gMCA/IHBhcnRzWzBdIDogJycpICsgJyUnLCBhbGxvd01pc3NpbmcpO1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDwgcGFydHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKCRnT1BEICYmIGkgKyAxID49IHBhcnRzLmxlbmd0aCkge1xuICAgICAgICB2YXIgZGVzYyA9ICRnT1BEKHZhbHVlLCBwYXJ0c1tpXSk7XG5cbiAgICAgICAgaWYgKCFhbGxvd01pc3NpbmcgJiYgIShwYXJ0c1tpXSBpbiB2YWx1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcignYmFzZSBpbnRyaW5zaWMgZm9yICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCB0aGUgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gZGVzYyA/IGRlc2MuZ2V0IHx8IGRlc2MudmFsdWUgOiB2YWx1ZVtwYXJ0c1tpXV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlW3BhcnRzW2ldXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgJEZ1bmN0aW9uID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24lJyk7XG52YXIgJGFwcGx5ID0gJEZ1bmN0aW9uLmFwcGx5O1xudmFyICRjYWxsID0gJEZ1bmN0aW9uLmNhbGw7XG5cbnZhciBjYWxsQmluZCA9IGZ1bmN0aW9uIGNhbGxCaW5kKCkge1xuICByZXR1cm4gZnVuY3Rpb25CaW5kLmFwcGx5KCRjYWxsLCBhcmd1bWVudHMpO1xufTtcblxudmFyIGFwcGx5ID0gZnVuY3Rpb24gYXBwbHlCaW5kKCkge1xuICByZXR1cm4gZnVuY3Rpb25CaW5kLmFwcGx5KCRhcHBseSwgYXJndW1lbnRzKTtcbn07XG5jYWxsQmluZC5hcHBseSA9IGFwcGx5O1xuXG52YXIgbnVtYmVySXNOYU4gPSBmdW5jdGlvbiBudW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufTtcblxudmFyIGltcGxlbWVudGF0aW9uJDIgPSBmdW5jdGlvbiBpcyhhLCBiKSB7XG4gIGlmIChhID09PSAwICYmIGIgPT09IDApIHtcbiAgICByZXR1cm4gMSAvIGEgPT09IDEgLyBiO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChudW1iZXJJc05hTihhKSAmJiBudW1iZXJJc05hTihiKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIHBvbHlmaWxsID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG4gIHJldHVybiB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaW1wbGVtZW50YXRpb24kMjtcbn07XG5cbnZhciBzaGltID0gZnVuY3Rpb24gc2hpbU9iamVjdElzKCkge1xuICB2YXIgcG9seWZpbGwkMSA9IHBvbHlmaWxsKCk7XG4gIGRlZmluZVByb3BlcnRpZXNfMShPYmplY3QsIHtcbiAgICBpczogcG9seWZpbGwkMVxuICB9LCB7XG4gICAgaXM6IGZ1bmN0aW9uIHRlc3RPYmplY3RJcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QuaXMgIT09IHBvbHlmaWxsJDE7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBvbHlmaWxsJDE7XG59O1xuXG52YXIgcG9seWZpbGwkMSA9IGNhbGxCaW5kKHBvbHlmaWxsKCksIE9iamVjdCk7XG5kZWZpbmVQcm9wZXJ0aWVzXzEocG9seWZpbGwkMSwge1xuICBnZXRQb2x5ZmlsbDogcG9seWZpbGwsXG4gIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbiQyLFxuICBzaGltOiBzaGltXG59KTtcbnZhciBvYmplY3RJcyA9IHBvbHlmaWxsJDE7XG5cbnZhciBzcmMgPSBmdW5jdGlvbkJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxudmFyIHJlZ2V4RXhlYyA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYztcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIHRyeVJlZ2V4RXhlY0NhbGwgPSBmdW5jdGlvbiB0cnlSZWdleEV4ZWModmFsdWUpIHtcbiAgdHJ5IHtcbiAgICB2YXIgbGFzdEluZGV4ID0gdmFsdWUubGFzdEluZGV4O1xuICAgIHZhbHVlLmxhc3RJbmRleCA9IDA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblxuICAgIHJlZ2V4RXhlYy5jYWxsKHZhbHVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBmaW5hbGx5IHtcbiAgICB2YWx1ZS5sYXN0SW5kZXggPSBsYXN0SW5kZXg7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgfVxufTtcblxudmFyIHRvU3RyJDUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHJlZ2V4Q2xhc3MgPSAnW29iamVjdCBSZWdFeHBdJztcbnZhciBoYXNUb1N0cmluZ1RhZyQxID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJztcblxudmFyIGlzUmVnZXggPSBmdW5jdGlvbiBpc1JlZ2V4KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzVG9TdHJpbmdUYWckMSkge1xuICAgIHJldHVybiB0b1N0ciQ1LmNhbGwodmFsdWUpID09PSByZWdleENsYXNzO1xuICB9XG5cbiAgdmFyIGRlc2NyaXB0b3IgPSBnT1BEKHZhbHVlLCAnbGFzdEluZGV4Jyk7XG4gIHZhciBoYXNMYXN0SW5kZXhEYXRhUHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIHNyYyhkZXNjcmlwdG9yLCAndmFsdWUnKTtcblxuICBpZiAoIWhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnlSZWdleEV4ZWNDYWxsKHZhbHVlKTtcbn07XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyICRUeXBlRXJyb3IkMSA9IFR5cGVFcnJvcjtcblxudmFyIGltcGxlbWVudGF0aW9uJDMgPSBmdW5jdGlvbiBmbGFncygpIHtcbiAgaWYgKHRoaXMgIT0gbnVsbCAmJiB0aGlzICE9PSAkT2JqZWN0KHRoaXMpKSB7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IkMSgnUmVnRXhwLnByb3RvdHlwZS5mbGFncyBnZXR0ZXIgY2FsbGVkIG9uIG5vbi1vYmplY3QnKTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcblxuICBpZiAodGhpcy5nbG9iYWwpIHtcbiAgICByZXN1bHQgKz0gJ2cnO1xuICB9XG5cbiAgaWYgKHRoaXMuaWdub3JlQ2FzZSkge1xuICAgIHJlc3VsdCArPSAnaSc7XG4gIH1cblxuICBpZiAodGhpcy5tdWx0aWxpbmUpIHtcbiAgICByZXN1bHQgKz0gJ20nO1xuICB9XG5cbiAgaWYgKHRoaXMuZG90QWxsKSB7XG4gICAgcmVzdWx0ICs9ICdzJztcbiAgfVxuXG4gIGlmICh0aGlzLnVuaWNvZGUpIHtcbiAgICByZXN1bHQgKz0gJ3UnO1xuICB9XG5cbiAgaWYgKHRoaXMuc3RpY2t5KSB7XG4gICAgcmVzdWx0ICs9ICd5JztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG52YXIgc3VwcG9ydHNEZXNjcmlwdG9ycyQxID0gZGVmaW5lUHJvcGVydGllc18xLnN1cHBvcnRzRGVzY3JpcHRvcnM7XG52YXIgJGdPUEQkMSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgJFR5cGVFcnJvciQyID0gVHlwZUVycm9yO1xuXG52YXIgcG9seWZpbGwkMiA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuICBpZiAoIXN1cHBvcnRzRGVzY3JpcHRvcnMkMSkge1xuICAgIHRocm93IG5ldyAkVHlwZUVycm9yJDIoJ1JlZ0V4cC5wcm90b3R5cGUuZmxhZ3MgcmVxdWlyZXMgYSB0cnVlIEVTNSBlbnZpcm9ubWVudCB0aGF0IHN1cHBvcnRzIHByb3BlcnR5IGRlc2NyaXB0b3JzJyk7XG4gIH1cblxuICBpZiAoL2EvbWlnLmZsYWdzID09PSAnZ2ltJykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gJGdPUEQkMShSZWdFeHAucHJvdG90eXBlLCAnZmxhZ3MnKTtcblxuICAgIGlmIChkZXNjcmlwdG9yICYmIHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgL2EvLmRvdEFsbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGltcGxlbWVudGF0aW9uJDM7XG59O1xuXG52YXIgc3VwcG9ydHNEZXNjcmlwdG9ycyQyID0gZGVmaW5lUHJvcGVydGllc18xLnN1cHBvcnRzRGVzY3JpcHRvcnM7XG52YXIgZ09QRCQxID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBkZWZpbmVQcm9wZXJ0eSQxID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIFR5cGVFcnIgPSBUeXBlRXJyb3I7XG52YXIgZ2V0UHJvdG8kMSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciByZWdleCA9IC9hLztcblxudmFyIHNoaW0kMSA9IGZ1bmN0aW9uIHNoaW1GbGFncygpIHtcbiAgaWYgKCFzdXBwb3J0c0Rlc2NyaXB0b3JzJDIgfHwgIWdldFByb3RvJDEpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycignUmVnRXhwLnByb3RvdHlwZS5mbGFncyByZXF1aXJlcyBhIHRydWUgRVM1IGVudmlyb25tZW50IHRoYXQgc3VwcG9ydHMgcHJvcGVydHkgZGVzY3JpcHRvcnMnKTtcbiAgfVxuXG4gIHZhciBwb2x5ZmlsbCA9IHBvbHlmaWxsJDIoKTtcbiAgdmFyIHByb3RvID0gZ2V0UHJvdG8kMShyZWdleCk7XG4gIHZhciBkZXNjcmlwdG9yID0gZ09QRCQxKHByb3RvLCAnZmxhZ3MnKTtcblxuICBpZiAoIWRlc2NyaXB0b3IgfHwgZGVzY3JpcHRvci5nZXQgIT09IHBvbHlmaWxsKSB7XG4gICAgZGVmaW5lUHJvcGVydHkkMShwcm90bywgJ2ZsYWdzJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6IHBvbHlmaWxsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcG9seWZpbGw7XG59O1xuXG52YXIgZmxhZ3NCb3VuZCA9IGNhbGxCaW5kKGltcGxlbWVudGF0aW9uJDMpO1xuZGVmaW5lUHJvcGVydGllc18xKGZsYWdzQm91bmQsIHtcbiAgZ2V0UG9seWZpbGw6IHBvbHlmaWxsJDIsXG4gIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbiQzLFxuICBzaGltOiBzaGltJDFcbn0pO1xudmFyIHJlZ2V4cF9wcm90b3R5cGVfZmxhZ3MgPSBmbGFnc0JvdW5kO1xuXG52YXIgZ2V0RGF5ID0gRGF0ZS5wcm90b3R5cGUuZ2V0RGF5O1xuXG52YXIgdHJ5RGF0ZU9iamVjdCA9IGZ1bmN0aW9uIHRyeURhdGVHZXREYXlDYWxsKHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgZ2V0RGF5LmNhbGwodmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG52YXIgdG9TdHIkNiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZGF0ZUNsYXNzID0gJ1tvYmplY3QgRGF0ZV0nO1xudmFyIGhhc1RvU3RyaW5nVGFnJDIgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG52YXIgaXNEYXRlT2JqZWN0ID0gZnVuY3Rpb24gaXNEYXRlT2JqZWN0KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGhhc1RvU3RyaW5nVGFnJDIgPyB0cnlEYXRlT2JqZWN0KHZhbHVlKSA6IHRvU3RyJDYuY2FsbCh2YWx1ZSkgPT09IGRhdGVDbGFzcztcbn07XG5cbnZhciBnZXRUaW1lID0gRGF0ZS5wcm90b3R5cGUuZ2V0VGltZTtcblxuZnVuY3Rpb24gZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9OyAvLyA3LjEuIEFsbCBpZGVudGljYWwgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cblxuICBpZiAob3B0cy5zdHJpY3QgPyBvYmplY3RJcyhhY3R1YWwsIGV4cGVjdGVkKSA6IGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyA3LjMuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG5cblxuICBpZiAoIWFjdHVhbCB8fCAhZXhwZWN0ZWQgfHwgdHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvcHRzLnN0cmljdCA/IG9iamVjdElzKGFjdHVhbCwgZXhwZWN0ZWQpIDogYWN0dWFsID09IGV4cGVjdGVkO1xuICB9XG4gIC8qXG4gICAqIDcuNC4gRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAgKiBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgICogd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAgKiAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gICAqIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gICAqIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG5cblxuICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgb3B0cyk7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkT3JOdWxsKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciQxKHgpIHtcbiAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgeC5sZW5ndGggIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB4LmNvcHkgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHguc2xpY2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoeC5sZW5ndGggPiAwICYmIHR5cGVvZiB4WzBdICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBvcHRzKSB7XG4gIC8qIGVzbGludCBtYXgtc3RhdGVtZW50czogWzIsIDUwXSAqL1xuICB2YXIgaSwga2V5O1xuXG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNVbmRlZmluZWRPck51bGwoYSkgfHwgaXNVbmRlZmluZWRPck51bGwoYikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LlxuXG5cbiAgaWYgKGEucHJvdG90eXBlICE9PSBiLnByb3RvdHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc0FyZ3VtZW50cyQxKGEpICE9PSBpc0FyZ3VtZW50cyQxKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGFJc1JlZ2V4ID0gaXNSZWdleChhKTtcbiAgdmFyIGJJc1JlZ2V4ID0gaXNSZWdleChiKTtcblxuICBpZiAoYUlzUmVnZXggIT09IGJJc1JlZ2V4KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGFJc1JlZ2V4IHx8IGJJc1JlZ2V4KSB7XG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiByZWdleHBfcHJvdG90eXBlX2ZsYWdzKGEpID09PSByZWdleHBfcHJvdG90eXBlX2ZsYWdzKGIpO1xuICB9XG5cbiAgaWYgKGlzRGF0ZU9iamVjdChhKSAmJiBpc0RhdGVPYmplY3QoYikpIHtcbiAgICByZXR1cm4gZ2V0VGltZS5jYWxsKGEpID09PSBnZXRUaW1lLmNhbGwoYik7XG4gIH1cblxuICB2YXIgYUlzQnVmZmVyID0gaXNCdWZmZXIkMShhKTtcbiAgdmFyIGJJc0J1ZmZlciA9IGlzQnVmZmVyJDEoYik7XG5cbiAgaWYgKGFJc0J1ZmZlciAhPT0gYklzQnVmZmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGFJc0J1ZmZlciB8fCBiSXNCdWZmZXIpIHtcbiAgICAvLyAmJiB3b3VsZCB3b3JrIHRvbywgYmVjYXVzZSBib3RoIGFyZSB0cnVlIG9yIGJvdGggZmFsc2UgaGVyZVxuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgdmFyIGthID0gb2JqZWN0S2V5cyhhKTtcbiAgICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gaGFwcGVucyB3aGVuIG9uZSBpcyBhIHN0cmluZyBsaXRlcmFsIGFuZCB0aGUgb3RoZXIgaXNuJ3RcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlcyBoYXNPd25Qcm9wZXJ0eSlcblxuXG4gIGlmIChrYS5sZW5ndGggIT09IGtiLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyB0aGUgc2FtZSBzZXQgb2Yga2V5cyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSxcblxuXG4gIGthLnNvcnQoKTtcbiAga2Iuc29ydCgpOyAvLyB+fn5jaGVhcCBrZXkgdGVzdFxuXG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGthW2ldICE9IGtiW2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IC8vIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeSBjb3JyZXNwb25kaW5nIGtleSwgYW5kIH5+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcblxuXG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAga2V5ID0ga2FbaV07XG5cbiAgICBpZiAoIWRlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgb3B0cykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxudmFyIGRlZXBFcXVhbF8xID0gZGVlcEVxdWFsO1xuXG52YXIgRkxPQVRfRU9GID0gMHhmO1xudmFyIEZMT0FUX0xPT0tVUCA9IFsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcuJywgJ0UnLCAnRS0nLCBudWxsLCAnLSddO1xudmFyIEZMT0FUX0VOQ09ERV9MT09LVVAgPSB7XG4gICcuJzogMTAsXG4gICdFJzogMTEsXG4gICdFLSc6IDEyLFxuICAnLSc6IDE0XG59O1xuXG52YXIgQ0ZGT3BlcmFuZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENGRk9wZXJhbmQoKSB7fVxuXG4gIENGRk9wZXJhbmQuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgdmFsdWUpIHtcbiAgICBpZiAoMzIgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjQ2KSB7XG4gICAgICByZXR1cm4gdmFsdWUgLSAxMzk7XG4gICAgfVxuXG4gICAgaWYgKDI0NyA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyNTApIHtcbiAgICAgIHJldHVybiAodmFsdWUgLSAyNDcpICogMjU2ICsgc3RyZWFtLnJlYWRVSW50OCgpICsgMTA4O1xuICAgIH1cblxuICAgIGlmICgyNTEgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjU0KSB7XG4gICAgICByZXR1cm4gLSh2YWx1ZSAtIDI1MSkgKiAyNTYgLSBzdHJlYW0ucmVhZFVJbnQ4KCkgLSAxMDg7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAyOCkge1xuICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkSW50MTZCRSgpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gMjkpIHtcbiAgICAgIHJldHVybiBzdHJlYW0ucmVhZEludDMyQkUoKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IDMwKSB7XG4gICAgICB2YXIgc3RyID0gJyc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBiID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuICAgICAgICB2YXIgbjEgPSBiID4+IDQ7XG5cbiAgICAgICAgaWYgKG4xID09PSBGTE9BVF9FT0YpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBGTE9BVF9MT09LVVBbbjFdO1xuICAgICAgICB2YXIgbjIgPSBiICYgMTU7XG5cbiAgICAgICAgaWYgKG4yID09PSBGTE9BVF9FT0YpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBGTE9BVF9MT09LVVBbbjJdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VGbG9hdChzdHIpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIENGRk9wZXJhbmQuc2l6ZSA9IGZ1bmN0aW9uIHNpemUodmFsdWUpIHtcbiAgICAvLyBpZiB0aGUgdmFsdWUgbmVlZHMgdG8gYmUgZm9yY2VkIHRvIHRoZSBsYXJnZXN0IHNpemUgKDMyIGJpdClcbiAgICAvLyBlLmcuIGZvciB1bmtub3duIHBvaW50ZXJzLCBzZXQgdG8gMzI3NjhcbiAgICBpZiAodmFsdWUuZm9yY2VMYXJnZSkge1xuICAgICAgdmFsdWUgPSAzMjc2ODtcbiAgICB9XG5cbiAgICBpZiAoKHZhbHVlIHwgMCkgIT09IHZhbHVlKSB7XG4gICAgICAvLyBmbG9hdGluZyBwb2ludFxuICAgICAgdmFyIHN0ciA9ICcnICsgdmFsdWU7XG4gICAgICByZXR1cm4gMSArIE1hdGguY2VpbCgoc3RyLmxlbmd0aCArIDEpIC8gMik7XG4gICAgfSBlbHNlIGlmICgtMTA3IDw9IHZhbHVlICYmIHZhbHVlIDw9IDEwNykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmICgxMDggPD0gdmFsdWUgJiYgdmFsdWUgPD0gMTEzMSB8fCAtMTEzMSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAtMTA4KSB7XG4gICAgICByZXR1cm4gMjtcbiAgICB9IGVsc2UgaWYgKC0zMjc2OCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAzMjc2Nykge1xuICAgICAgcmV0dXJuIDM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA1O1xuICAgIH1cbiAgfTtcblxuICBDRkZPcGVyYW5kLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHJlYW0sIHZhbHVlKSB7XG4gICAgLy8gaWYgdGhlIHZhbHVlIG5lZWRzIHRvIGJlIGZvcmNlZCB0byB0aGUgbGFyZ2VzdCBzaXplICgzMiBiaXQpXG4gICAgLy8gZS5nLiBmb3IgdW5rbm93biBwb2ludGVycywgc2F2ZSB0aGUgb2xkIHZhbHVlIGFuZCBzZXQgdG8gMzI3NjhcbiAgICB2YXIgdmFsID0gTnVtYmVyKHZhbHVlKTtcblxuICAgIGlmICh2YWx1ZS5mb3JjZUxhcmdlKSB7XG4gICAgICBzdHJlYW0ud3JpdGVVSW50OCgyOSk7XG4gICAgICByZXR1cm4gc3RyZWFtLndyaXRlSW50MzJCRSh2YWwpO1xuICAgIH0gZWxzZSBpZiAoKHZhbCB8IDApICE9PSB2YWwpIHtcbiAgICAgIC8vIGZsb2F0aW5nIHBvaW50XG4gICAgICBzdHJlYW0ud3JpdGVVSW50OCgzMCk7XG4gICAgICB2YXIgc3RyID0gJycgKyB2YWw7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHZhciBjMSA9IHN0cltpXTtcbiAgICAgICAgdmFyIG4xID0gRkxPQVRfRU5DT0RFX0xPT0tVUFtjMV0gfHwgK2MxO1xuXG4gICAgICAgIGlmIChpID09PSBzdHIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHZhciBuMiA9IEZMT0FUX0VPRjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYzIgPSBzdHJbaSArIDFdO1xuICAgICAgICAgIHZhciBuMiA9IEZMT0FUX0VOQ09ERV9MT09LVVBbYzJdIHx8ICtjMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmVhbS53cml0ZVVJbnQ4KG4xIDw8IDQgfCBuMiAmIDE1KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG4yICE9PSBGTE9BVF9FT0YpIHtcbiAgICAgICAgcmV0dXJuIHN0cmVhbS53cml0ZVVJbnQ4KEZMT0FUX0VPRiA8PCA0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKC0xMDcgPD0gdmFsICYmIHZhbCA8PSAxMDcpIHtcbiAgICAgIHJldHVybiBzdHJlYW0ud3JpdGVVSW50OCh2YWwgKyAxMzkpO1xuICAgIH0gZWxzZSBpZiAoMTA4IDw9IHZhbCAmJiB2YWwgPD0gMTEzMSkge1xuICAgICAgdmFsIC09IDEwODtcbiAgICAgIHN0cmVhbS53cml0ZVVJbnQ4KCh2YWwgPj4gOCkgKyAyNDcpO1xuICAgICAgcmV0dXJuIHN0cmVhbS53cml0ZVVJbnQ4KHZhbCAmIDB4ZmYpO1xuICAgIH0gZWxzZSBpZiAoLTExMzEgPD0gdmFsICYmIHZhbCA8PSAtMTA4KSB7XG4gICAgICB2YWwgPSAtdmFsIC0gMTA4O1xuICAgICAgc3RyZWFtLndyaXRlVUludDgoKHZhbCA+PiA4KSArIDI1MSk7XG4gICAgICByZXR1cm4gc3RyZWFtLndyaXRlVUludDgodmFsICYgMHhmZik7XG4gICAgfSBlbHNlIGlmICgtMzI3NjggPD0gdmFsICYmIHZhbCA8PSAzMjc2Nykge1xuICAgICAgc3RyZWFtLndyaXRlVUludDgoMjgpO1xuICAgICAgcmV0dXJuIHN0cmVhbS53cml0ZUludDE2QkUodmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLndyaXRlVUludDgoMjkpO1xuICAgICAgcmV0dXJuIHN0cmVhbS53cml0ZUludDMyQkUodmFsKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIENGRk9wZXJhbmQ7XG59KCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkMihvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkMihvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkMihvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDIobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQyKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkMihhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIENGRkRpY3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDRkZEaWN0KG9wcykge1xuICAgIGlmIChvcHMgPT09IHZvaWQgMCkge1xuICAgICAgb3BzID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5vcHMgPSBvcHM7XG4gICAgdGhpcy5maWVsZHMgPSB7fTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkMihvcHMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIGZpZWxkID0gX3N0ZXAudmFsdWU7XG4gICAgICB2YXIga2V5ID0gQXJyYXkuaXNBcnJheShmaWVsZFswXSkgPyBmaWVsZFswXVswXSA8PCA4IHwgZmllbGRbMF1bMV0gOiBmaWVsZFswXTtcbiAgICAgIHRoaXMuZmllbGRzW2tleV0gPSBmaWVsZDtcbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQ0ZGRGljdC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmRlY29kZU9wZXJhbmRzID0gZnVuY3Rpb24gZGVjb2RlT3BlcmFuZHModHlwZSwgc3RyZWFtLCByZXQsIG9wZXJhbmRzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICByZXR1cm4gb3BlcmFuZHMubWFwKGZ1bmN0aW9uIChvcCwgaSkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZGVjb2RlT3BlcmFuZHModHlwZVtpXSwgc3RyZWFtLCByZXQsIFtvcF0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlLmRlY29kZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdHlwZS5kZWNvZGUoc3RyZWFtLCByZXQsIG9wZXJhbmRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGNhc2UgJ29mZnNldCc6XG4gICAgICAgIGNhc2UgJ3NpZCc6XG4gICAgICAgICAgcmV0dXJuIG9wZXJhbmRzWzBdO1xuXG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgIHJldHVybiAhIW9wZXJhbmRzWzBdO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG9wZXJhbmRzO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZW5jb2RlT3BlcmFuZHMgPSBmdW5jdGlvbiBlbmNvZGVPcGVyYW5kcyh0eXBlLCBzdHJlYW0sIGN0eCwgb3BlcmFuZHMpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICByZXR1cm4gb3BlcmFuZHMubWFwKGZ1bmN0aW9uIChvcCwgaSkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLmVuY29kZU9wZXJhbmRzKHR5cGVbaV0sIHN0cmVhbSwgY3R4LCBvcClbMF07XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuZW5jb2RlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0eXBlLmVuY29kZShzdHJlYW0sIG9wZXJhbmRzLCBjdHgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wZXJhbmRzID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIFtvcGVyYW5kc107XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb3BlcmFuZHMgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIFsrb3BlcmFuZHNdO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvcGVyYW5kcykpIHtcbiAgICAgIHJldHVybiBvcGVyYW5kcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtvcGVyYW5kc107XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICB2YXIgZW5kID0gc3RyZWFtLnBvcyArIHBhcmVudC5sZW5ndGg7XG4gICAgdmFyIHJldCA9IHt9O1xuICAgIHZhciBvcGVyYW5kcyA9IFtdOyAvLyBkZWZpbmUgaGlkZGVuIHByb3BlcnRpZXNcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJldCwge1xuICAgICAgcGFyZW50OiB7XG4gICAgICAgIHZhbHVlOiBwYXJlbnRcbiAgICAgIH0sXG4gICAgICBfc3RhcnRPZmZzZXQ6IHtcbiAgICAgICAgdmFsdWU6IHN0cmVhbS5wb3NcbiAgICAgIH1cbiAgICB9KTsgLy8gZmlsbCBpbiBkZWZhdWx0c1xuXG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuZmllbGRzKSB7XG4gICAgICB2YXIgZmllbGQgPSB0aGlzLmZpZWxkc1trZXldO1xuICAgICAgcmV0W2ZpZWxkWzFdXSA9IGZpZWxkWzNdO1xuICAgIH1cblxuICAgIHdoaWxlIChzdHJlYW0ucG9zIDwgZW5kKSB7XG4gICAgICB2YXIgYiA9IHN0cmVhbS5yZWFkVUludDgoKTtcblxuICAgICAgaWYgKGIgPCAyOCkge1xuICAgICAgICBpZiAoYiA9PT0gMTIpIHtcbiAgICAgICAgICBiID0gYiA8PCA4IHwgc3RyZWFtLnJlYWRVSW50OCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9maWVsZCA9IHRoaXMuZmllbGRzW2JdO1xuXG4gICAgICAgIGlmICghX2ZpZWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcGVyYXRvciBcIiArIGIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuZGVjb2RlT3BlcmFuZHMoX2ZpZWxkWzJdLCBzdHJlYW0sIHJldCwgb3BlcmFuZHMpO1xuXG4gICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiB1dGlsc18yKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCBfZmllbGRbMV0sIHZhbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldFtfZmllbGRbMV1dID0gdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9wZXJhbmRzID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcGVyYW5kcy5wdXNoKENGRk9wZXJhbmQuZGVjb2RlKHN0cmVhbSwgYikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgX3Byb3RvLnNpemUgPSBmdW5jdGlvbiBzaXplKGRpY3QsIHBhcmVudCwgaW5jbHVkZVBvaW50ZXJzKSB7XG4gICAgaWYgKGluY2x1ZGVQb2ludGVycyA9PT0gdm9pZCAwKSB7XG4gICAgICBpbmNsdWRlUG9pbnRlcnMgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBjdHggPSB7XG4gICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgIHZhbDogZGljdCxcbiAgICAgIHBvaW50ZXJTaXplOiAwLFxuICAgICAgc3RhcnRPZmZzZXQ6IHBhcmVudC5zdGFydE9mZnNldCB8fCAwXG4gICAgfTtcbiAgICB2YXIgbGVuID0gMDtcblxuICAgIGZvciAodmFyIGsgaW4gdGhpcy5maWVsZHMpIHtcbiAgICAgIHZhciBmaWVsZCA9IHRoaXMuZmllbGRzW2tdO1xuICAgICAgdmFyIHZhbCA9IGRpY3RbZmllbGRbMV1dO1xuXG4gICAgICBpZiAodmFsID09IG51bGwgfHwgZGVlcEVxdWFsXzEodmFsLCBmaWVsZFszXSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBvcGVyYW5kcyA9IHRoaXMuZW5jb2RlT3BlcmFuZHMoZmllbGRbMl0sIG51bGwsIGN0eCwgdmFsKTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkMihvcGVyYW5kcyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBvcCA9IF9zdGVwMi52YWx1ZTtcbiAgICAgICAgbGVuICs9IENGRk9wZXJhbmQuc2l6ZShvcCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXkgPSBBcnJheS5pc0FycmF5KGZpZWxkWzBdKSA/IGZpZWxkWzBdIDogW2ZpZWxkWzBdXTtcbiAgICAgIGxlbiArPSBrZXkubGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChpbmNsdWRlUG9pbnRlcnMpIHtcbiAgICAgIGxlbiArPSBjdHgucG9pbnRlclNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlbjtcbiAgfTtcblxuICBfcHJvdG8uZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0cmVhbSwgZGljdCwgcGFyZW50KSB7XG4gICAgdmFyIGN0eCA9IHtcbiAgICAgIHBvaW50ZXJzOiBbXSxcbiAgICAgIHN0YXJ0T2Zmc2V0OiBzdHJlYW0ucG9zLFxuICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICB2YWw6IGRpY3QsXG4gICAgICBwb2ludGVyU2l6ZTogMFxuICAgIH07XG4gICAgY3R4LnBvaW50ZXJPZmZzZXQgPSBzdHJlYW0ucG9zICsgdGhpcy5zaXplKGRpY3QsIGN0eCwgZmFsc2UpO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkMih0aGlzLm9wcyksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgZmllbGQgPSBfc3RlcDMudmFsdWU7XG4gICAgICB2YXIgdmFsID0gZGljdFtmaWVsZFsxXV07XG5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBkZWVwRXF1YWxfMSh2YWwsIGZpZWxkWzNdKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG9wZXJhbmRzID0gdGhpcy5lbmNvZGVPcGVyYW5kcyhmaWVsZFsyXSwgc3RyZWFtLCBjdHgsIHZhbCk7XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDIob3BlcmFuZHMpLCBfc3RlcDQ7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNCgpKS5kb25lOykge1xuICAgICAgICB2YXIgb3AgPSBfc3RlcDQudmFsdWU7XG4gICAgICAgIENGRk9wZXJhbmQuZW5jb2RlKHN0cmVhbSwgb3ApO1xuICAgICAgfVxuXG4gICAgICB2YXIga2V5ID0gQXJyYXkuaXNBcnJheShmaWVsZFswXSkgPyBmaWVsZFswXSA6IFtmaWVsZFswXV07XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDIoa2V5KSwgX3N0ZXA1OyAhKF9zdGVwNSA9IF9pdGVyYXRvcjUoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIF9vcCA9IF9zdGVwNS52YWx1ZTtcbiAgICAgICAgc3RyZWFtLndyaXRlVUludDgoX29wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGN0eC5wb2ludGVycy5sZW5ndGgpIHtcbiAgICAgIHZhciBwdHIgPSBjdHgucG9pbnRlcnNbaSsrXTtcbiAgICAgIHB0ci50eXBlLmVuY29kZShzdHJlYW0sIHB0ci52YWwsIHB0ci5wYXJlbnQpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfTtcblxuICByZXR1cm4gQ0ZGRGljdDtcbn0oKTtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBDRkZQb2ludGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfciRQb2ludGVyKSB7XG4gIF9pbmhlcml0c0xvb3NlKENGRlBvaW50ZXIsIF9yJFBvaW50ZXIpO1xuXG4gIGZ1bmN0aW9uIENGRlBvaW50ZXIodHlwZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy50eXBlID09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMudHlwZSA9ICdnbG9iYWwnO1xuICAgIH1cblxuICAgIHJldHVybiBfciRQb2ludGVyLmNhbGwodGhpcywgbnVsbCwgdHlwZSwgb3B0aW9ucykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBDRkZQb2ludGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50LCBvcGVyYW5kcykge1xuICAgIHRoaXMub2Zmc2V0VHlwZSA9IHtcbiAgICAgIGRlY29kZTogZnVuY3Rpb24gZGVjb2RlKCkge1xuICAgICAgICByZXR1cm4gb3BlcmFuZHNbMF07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gX3IkUG9pbnRlci5wcm90b3R5cGUuZGVjb2RlLmNhbGwodGhpcywgc3RyZWFtLCBwYXJlbnQsIG9wZXJhbmRzKTtcbiAgfTtcblxuICBfcHJvdG8uZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0cmVhbSwgdmFsdWUsIGN0eCkge1xuICAgIGlmICghc3RyZWFtKSB7XG4gICAgICAvLyBjb21wdXRlIHRoZSBzaXplIChzbyBjdHgucG9pbnRlclNpemUgaXMgY29ycmVjdClcbiAgICAgIHRoaXMub2Zmc2V0VHlwZSA9IHtcbiAgICAgICAgc2l6ZTogZnVuY3Rpb24gc2l6ZSgpIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMuc2l6ZSh2YWx1ZSwgY3R4KTtcbiAgICAgIHJldHVybiBbbmV3IFB0cigwKV07XG4gICAgfVxuXG4gICAgdmFyIHB0ciA9IG51bGw7XG4gICAgdGhpcy5vZmZzZXRUeXBlID0ge1xuICAgICAgZW5jb2RlOiBmdW5jdGlvbiBlbmNvZGUoc3RyZWFtLCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIHB0ciA9IHZhbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3IkUG9pbnRlci5wcm90b3R5cGUuZW5jb2RlLmNhbGwodGhpcywgc3RyZWFtLCB2YWx1ZSwgY3R4KTtcblxuICAgIHJldHVybiBbbmV3IFB0cihwdHIpXTtcbiAgfTtcblxuICByZXR1cm4gQ0ZGUG9pbnRlcjtcbn0ocmVzdHJ1Y3R1cmUuUG9pbnRlcik7XG5cbnZhciBQdHIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQdHIodmFsKSB7XG4gICAgdGhpcy52YWwgPSB2YWw7XG4gICAgdGhpcy5mb3JjZUxhcmdlID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBfcHJvdG8yID0gUHRyLnByb3RvdHlwZTtcblxuICBfcHJvdG8yLnZhbHVlT2YgPSBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLnZhbDtcbiAgfTtcblxuICByZXR1cm4gUHRyO1xufSgpO1xuXG52YXIgQ0ZGQmxlbmRPcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENGRkJsZW5kT3AoKSB7fVxuXG4gIENGRkJsZW5kT3AuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50LCBvcGVyYW5kcykge1xuICAgIHZhciBudW1CbGVuZHMgPSBvcGVyYW5kcy5wb3AoKTsgLy8gVE9ETzogYWN0dWFsbHkgYmxlbmQuIEZvciBub3cganVzdCBjb25zdW1lIHRoZSBkZWx0YXNcbiAgICAvLyBzaW5jZSB3ZSBkb24ndCB1c2UgYW55IG9mIHRoZSB2YWx1ZXMgYW55d2F5LlxuXG4gICAgd2hpbGUgKG9wZXJhbmRzLmxlbmd0aCA+IG51bUJsZW5kcykge1xuICAgICAgb3BlcmFuZHMucG9wKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBDRkZCbGVuZE9wO1xufSgpO1xuXG52YXIgQ0ZGUHJpdmF0ZURpY3QgPSBuZXcgQ0ZGRGljdChbLy8ga2V5ICAgICAgIG5hbWUgICAgICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0XG5bNiwgJ0JsdWVWYWx1ZXMnLCAnZGVsdGEnLCBudWxsXSwgWzcsICdPdGhlckJsdWVzJywgJ2RlbHRhJywgbnVsbF0sIFs4LCAnRmFtaWx5Qmx1ZXMnLCAnZGVsdGEnLCBudWxsXSwgWzksICdGYW1pbHlPdGhlckJsdWVzJywgJ2RlbHRhJywgbnVsbF0sIFtbMTIsIDldLCAnQmx1ZVNjYWxlJywgJ251bWJlcicsIDAuMDM5NjI1XSwgW1sxMiwgMTBdLCAnQmx1ZVNoaWZ0JywgJ251bWJlcicsIDddLCBbWzEyLCAxMV0sICdCbHVlRnV6eicsICdudW1iZXInLCAxXSwgWzEwLCAnU3RkSFcnLCAnbnVtYmVyJywgbnVsbF0sIFsxMSwgJ1N0ZFZXJywgJ251bWJlcicsIG51bGxdLCBbWzEyLCAxMl0sICdTdGVtU25hcEgnLCAnZGVsdGEnLCBudWxsXSwgW1sxMiwgMTNdLCAnU3RlbVNuYXBWJywgJ2RlbHRhJywgbnVsbF0sIFtbMTIsIDE0XSwgJ0ZvcmNlQm9sZCcsICdib29sZWFuJywgZmFsc2VdLCBbWzEyLCAxN10sICdMYW5ndWFnZUdyb3VwJywgJ251bWJlcicsIDBdLCBbWzEyLCAxOF0sICdFeHBhbnNpb25GYWN0b3InLCAnbnVtYmVyJywgMC4wNl0sIFtbMTIsIDE5XSwgJ2luaXRpYWxSYW5kb21TZWVkJywgJ251bWJlcicsIDBdLCBbMjAsICdkZWZhdWx0V2lkdGhYJywgJ251bWJlcicsIDBdLCBbMjEsICdub21pbmFsV2lkdGhYJywgJ251bWJlcicsIDBdLCBbMjIsICd2c2luZGV4JywgJ251bWJlcicsIDBdLCBbMjMsICdibGVuZCcsIENGRkJsZW5kT3AsIG51bGxdLCBbMTksICdTdWJycycsIG5ldyBDRkZQb2ludGVyKG5ldyBDRkZJbmRleCgpLCB7XG4gIHR5cGU6ICdsb2NhbCdcbn0pLCBudWxsXV0pO1xuXG4vLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIEFwcGVuZGl4IEEgb2YgdGhlIENGRiBzcGVjaWZpY2F0aW9uOyBkb1xuLy8gbm90IGVkaXQuIExlbmd0aCBzaG91bGQgYmUgMzkxLlxudmFyIHN0YW5kYXJkU3RyaW5ncyA9IFtcIi5ub3RkZWZcIiwgXCJzcGFjZVwiLCBcImV4Y2xhbVwiLCBcInF1b3RlZGJsXCIsIFwibnVtYmVyc2lnblwiLCBcImRvbGxhclwiLCBcInBlcmNlbnRcIiwgXCJhbXBlcnNhbmRcIiwgXCJxdW90ZXJpZ2h0XCIsIFwicGFyZW5sZWZ0XCIsIFwicGFyZW5yaWdodFwiLCBcImFzdGVyaXNrXCIsIFwicGx1c1wiLCBcImNvbW1hXCIsIFwiaHlwaGVuXCIsIFwicGVyaW9kXCIsIFwic2xhc2hcIiwgXCJ6ZXJvXCIsIFwib25lXCIsIFwidHdvXCIsIFwidGhyZWVcIiwgXCJmb3VyXCIsIFwiZml2ZVwiLCBcInNpeFwiLCBcInNldmVuXCIsIFwiZWlnaHRcIiwgXCJuaW5lXCIsIFwiY29sb25cIiwgXCJzZW1pY29sb25cIiwgXCJsZXNzXCIsIFwiZXF1YWxcIiwgXCJncmVhdGVyXCIsIFwicXVlc3Rpb25cIiwgXCJhdFwiLCBcIkFcIiwgXCJCXCIsIFwiQ1wiLCBcIkRcIiwgXCJFXCIsIFwiRlwiLCBcIkdcIiwgXCJIXCIsIFwiSVwiLCBcIkpcIiwgXCJLXCIsIFwiTFwiLCBcIk1cIiwgXCJOXCIsIFwiT1wiLCBcIlBcIiwgXCJRXCIsIFwiUlwiLCBcIlNcIiwgXCJUXCIsIFwiVVwiLCBcIlZcIiwgXCJXXCIsIFwiWFwiLCBcIllcIiwgXCJaXCIsIFwiYnJhY2tldGxlZnRcIiwgXCJiYWNrc2xhc2hcIiwgXCJicmFja2V0cmlnaHRcIiwgXCJhc2NpaWNpcmN1bVwiLCBcInVuZGVyc2NvcmVcIiwgXCJxdW90ZWxlZnRcIiwgXCJhXCIsIFwiYlwiLCBcImNcIiwgXCJkXCIsIFwiZVwiLCBcImZcIiwgXCJnXCIsIFwiaFwiLCBcImlcIiwgXCJqXCIsIFwia1wiLCBcImxcIiwgXCJtXCIsIFwiblwiLCBcIm9cIiwgXCJwXCIsIFwicVwiLCBcInJcIiwgXCJzXCIsIFwidFwiLCBcInVcIiwgXCJ2XCIsIFwid1wiLCBcInhcIiwgXCJ5XCIsIFwielwiLCBcImJyYWNlbGVmdFwiLCBcImJhclwiLCBcImJyYWNlcmlnaHRcIiwgXCJhc2NpaXRpbGRlXCIsIFwiZXhjbGFtZG93blwiLCBcImNlbnRcIiwgXCJzdGVybGluZ1wiLCBcImZyYWN0aW9uXCIsIFwieWVuXCIsIFwiZmxvcmluXCIsIFwic2VjdGlvblwiLCBcImN1cnJlbmN5XCIsIFwicXVvdGVzaW5nbGVcIiwgXCJxdW90ZWRibGxlZnRcIiwgXCJndWlsbGVtb3RsZWZ0XCIsIFwiZ3VpbHNpbmdsbGVmdFwiLCBcImd1aWxzaW5nbHJpZ2h0XCIsIFwiZmlcIiwgXCJmbFwiLCBcImVuZGFzaFwiLCBcImRhZ2dlclwiLCBcImRhZ2dlcmRibFwiLCBcInBlcmlvZGNlbnRlcmVkXCIsIFwicGFyYWdyYXBoXCIsIFwiYnVsbGV0XCIsIFwicXVvdGVzaW5nbGJhc2VcIiwgXCJxdW90ZWRibGJhc2VcIiwgXCJxdW90ZWRibHJpZ2h0XCIsIFwiZ3VpbGxlbW90cmlnaHRcIiwgXCJlbGxpcHNpc1wiLCBcInBlcnRob3VzYW5kXCIsIFwicXVlc3Rpb25kb3duXCIsIFwiZ3JhdmVcIiwgXCJhY3V0ZVwiLCBcImNpcmN1bWZsZXhcIiwgXCJ0aWxkZVwiLCBcIm1hY3JvblwiLCBcImJyZXZlXCIsIFwiZG90YWNjZW50XCIsIFwiZGllcmVzaXNcIiwgXCJyaW5nXCIsIFwiY2VkaWxsYVwiLCBcImh1bmdhcnVtbGF1dFwiLCBcIm9nb25la1wiLCBcImNhcm9uXCIsIFwiZW1kYXNoXCIsIFwiQUVcIiwgXCJvcmRmZW1pbmluZVwiLCBcIkxzbGFzaFwiLCBcIk9zbGFzaFwiLCBcIk9FXCIsIFwib3JkbWFzY3VsaW5lXCIsIFwiYWVcIiwgXCJkb3RsZXNzaVwiLCBcImxzbGFzaFwiLCBcIm9zbGFzaFwiLCBcIm9lXCIsIFwiZ2VybWFuZGJsc1wiLCBcIm9uZXN1cGVyaW9yXCIsIFwibG9naWNhbG5vdFwiLCBcIm11XCIsIFwidHJhZGVtYXJrXCIsIFwiRXRoXCIsIFwib25laGFsZlwiLCBcInBsdXNtaW51c1wiLCBcIlRob3JuXCIsIFwib25lcXVhcnRlclwiLCBcImRpdmlkZVwiLCBcImJyb2tlbmJhclwiLCBcImRlZ3JlZVwiLCBcInRob3JuXCIsIFwidGhyZWVxdWFydGVyc1wiLCBcInR3b3N1cGVyaW9yXCIsIFwicmVnaXN0ZXJlZFwiLCBcIm1pbnVzXCIsIFwiZXRoXCIsIFwibXVsdGlwbHlcIiwgXCJ0aHJlZXN1cGVyaW9yXCIsIFwiY29weXJpZ2h0XCIsIFwiQWFjdXRlXCIsIFwiQWNpcmN1bWZsZXhcIiwgXCJBZGllcmVzaXNcIiwgXCJBZ3JhdmVcIiwgXCJBcmluZ1wiLCBcIkF0aWxkZVwiLCBcIkNjZWRpbGxhXCIsIFwiRWFjdXRlXCIsIFwiRWNpcmN1bWZsZXhcIiwgXCJFZGllcmVzaXNcIiwgXCJFZ3JhdmVcIiwgXCJJYWN1dGVcIiwgXCJJY2lyY3VtZmxleFwiLCBcIklkaWVyZXNpc1wiLCBcIklncmF2ZVwiLCBcIk50aWxkZVwiLCBcIk9hY3V0ZVwiLCBcIk9jaXJjdW1mbGV4XCIsIFwiT2RpZXJlc2lzXCIsIFwiT2dyYXZlXCIsIFwiT3RpbGRlXCIsIFwiU2Nhcm9uXCIsIFwiVWFjdXRlXCIsIFwiVWNpcmN1bWZsZXhcIiwgXCJVZGllcmVzaXNcIiwgXCJVZ3JhdmVcIiwgXCJZYWN1dGVcIiwgXCJZZGllcmVzaXNcIiwgXCJaY2Fyb25cIiwgXCJhYWN1dGVcIiwgXCJhY2lyY3VtZmxleFwiLCBcImFkaWVyZXNpc1wiLCBcImFncmF2ZVwiLCBcImFyaW5nXCIsIFwiYXRpbGRlXCIsIFwiY2NlZGlsbGFcIiwgXCJlYWN1dGVcIiwgXCJlY2lyY3VtZmxleFwiLCBcImVkaWVyZXNpc1wiLCBcImVncmF2ZVwiLCBcImlhY3V0ZVwiLCBcImljaXJjdW1mbGV4XCIsIFwiaWRpZXJlc2lzXCIsIFwiaWdyYXZlXCIsIFwibnRpbGRlXCIsIFwib2FjdXRlXCIsIFwib2NpcmN1bWZsZXhcIiwgXCJvZGllcmVzaXNcIiwgXCJvZ3JhdmVcIiwgXCJvdGlsZGVcIiwgXCJzY2Fyb25cIiwgXCJ1YWN1dGVcIiwgXCJ1Y2lyY3VtZmxleFwiLCBcInVkaWVyZXNpc1wiLCBcInVncmF2ZVwiLCBcInlhY3V0ZVwiLCBcInlkaWVyZXNpc1wiLCBcInpjYXJvblwiLCBcImV4Y2xhbXNtYWxsXCIsIFwiSHVuZ2FydW1sYXV0c21hbGxcIiwgXCJkb2xsYXJvbGRzdHlsZVwiLCBcImRvbGxhcnN1cGVyaW9yXCIsIFwiYW1wZXJzYW5kc21hbGxcIiwgXCJBY3V0ZXNtYWxsXCIsIFwicGFyZW5sZWZ0c3VwZXJpb3JcIiwgXCJwYXJlbnJpZ2h0c3VwZXJpb3JcIiwgXCJ0d29kb3RlbmxlYWRlclwiLCBcIm9uZWRvdGVubGVhZGVyXCIsIFwiemVyb29sZHN0eWxlXCIsIFwib25lb2xkc3R5bGVcIiwgXCJ0d29vbGRzdHlsZVwiLCBcInRocmVlb2xkc3R5bGVcIiwgXCJmb3Vyb2xkc3R5bGVcIiwgXCJmaXZlb2xkc3R5bGVcIiwgXCJzaXhvbGRzdHlsZVwiLCBcInNldmVub2xkc3R5bGVcIiwgXCJlaWdodG9sZHN0eWxlXCIsIFwibmluZW9sZHN0eWxlXCIsIFwiY29tbWFzdXBlcmlvclwiLCBcInRocmVlcXVhcnRlcnNlbWRhc2hcIiwgXCJwZXJpb2RzdXBlcmlvclwiLCBcInF1ZXN0aW9uc21hbGxcIiwgXCJhc3VwZXJpb3JcIiwgXCJic3VwZXJpb3JcIiwgXCJjZW50c3VwZXJpb3JcIiwgXCJkc3VwZXJpb3JcIiwgXCJlc3VwZXJpb3JcIiwgXCJpc3VwZXJpb3JcIiwgXCJsc3VwZXJpb3JcIiwgXCJtc3VwZXJpb3JcIiwgXCJuc3VwZXJpb3JcIiwgXCJvc3VwZXJpb3JcIiwgXCJyc3VwZXJpb3JcIiwgXCJzc3VwZXJpb3JcIiwgXCJ0c3VwZXJpb3JcIiwgXCJmZlwiLCBcImZmaVwiLCBcImZmbFwiLCBcInBhcmVubGVmdGluZmVyaW9yXCIsIFwicGFyZW5yaWdodGluZmVyaW9yXCIsIFwiQ2lyY3VtZmxleHNtYWxsXCIsIFwiaHlwaGVuc3VwZXJpb3JcIiwgXCJHcmF2ZXNtYWxsXCIsIFwiQXNtYWxsXCIsIFwiQnNtYWxsXCIsIFwiQ3NtYWxsXCIsIFwiRHNtYWxsXCIsIFwiRXNtYWxsXCIsIFwiRnNtYWxsXCIsIFwiR3NtYWxsXCIsIFwiSHNtYWxsXCIsIFwiSXNtYWxsXCIsIFwiSnNtYWxsXCIsIFwiS3NtYWxsXCIsIFwiTHNtYWxsXCIsIFwiTXNtYWxsXCIsIFwiTnNtYWxsXCIsIFwiT3NtYWxsXCIsIFwiUHNtYWxsXCIsIFwiUXNtYWxsXCIsIFwiUnNtYWxsXCIsIFwiU3NtYWxsXCIsIFwiVHNtYWxsXCIsIFwiVXNtYWxsXCIsIFwiVnNtYWxsXCIsIFwiV3NtYWxsXCIsIFwiWHNtYWxsXCIsIFwiWXNtYWxsXCIsIFwiWnNtYWxsXCIsIFwiY29sb25tb25ldGFyeVwiLCBcIm9uZWZpdHRlZFwiLCBcInJ1cGlhaFwiLCBcIlRpbGRlc21hbGxcIiwgXCJleGNsYW1kb3duc21hbGxcIiwgXCJjZW50b2xkc3R5bGVcIiwgXCJMc2xhc2hzbWFsbFwiLCBcIlNjYXJvbnNtYWxsXCIsIFwiWmNhcm9uc21hbGxcIiwgXCJEaWVyZXNpc3NtYWxsXCIsIFwiQnJldmVzbWFsbFwiLCBcIkNhcm9uc21hbGxcIiwgXCJEb3RhY2NlbnRzbWFsbFwiLCBcIk1hY3JvbnNtYWxsXCIsIFwiZmlndXJlZGFzaFwiLCBcImh5cGhlbmluZmVyaW9yXCIsIFwiT2dvbmVrc21hbGxcIiwgXCJSaW5nc21hbGxcIiwgXCJDZWRpbGxhc21hbGxcIiwgXCJxdWVzdGlvbmRvd25zbWFsbFwiLCBcIm9uZWVpZ2h0aFwiLCBcInRocmVlZWlnaHRoc1wiLCBcImZpdmVlaWdodGhzXCIsIFwic2V2ZW5laWdodGhzXCIsIFwib25ldGhpcmRcIiwgXCJ0d290aGlyZHNcIiwgXCJ6ZXJvc3VwZXJpb3JcIiwgXCJmb3Vyc3VwZXJpb3JcIiwgXCJmaXZlc3VwZXJpb3JcIiwgXCJzaXhzdXBlcmlvclwiLCBcInNldmVuc3VwZXJpb3JcIiwgXCJlaWdodHN1cGVyaW9yXCIsIFwibmluZXN1cGVyaW9yXCIsIFwiemVyb2luZmVyaW9yXCIsIFwib25laW5mZXJpb3JcIiwgXCJ0d29pbmZlcmlvclwiLCBcInRocmVlaW5mZXJpb3JcIiwgXCJmb3VyaW5mZXJpb3JcIiwgXCJmaXZlaW5mZXJpb3JcIiwgXCJzaXhpbmZlcmlvclwiLCBcInNldmVuaW5mZXJpb3JcIiwgXCJlaWdodGluZmVyaW9yXCIsIFwibmluZWluZmVyaW9yXCIsIFwiY2VudGluZmVyaW9yXCIsIFwiZG9sbGFyaW5mZXJpb3JcIiwgXCJwZXJpb2RpbmZlcmlvclwiLCBcImNvbW1haW5mZXJpb3JcIiwgXCJBZ3JhdmVzbWFsbFwiLCBcIkFhY3V0ZXNtYWxsXCIsIFwiQWNpcmN1bWZsZXhzbWFsbFwiLCBcIkF0aWxkZXNtYWxsXCIsIFwiQWRpZXJlc2lzc21hbGxcIiwgXCJBcmluZ3NtYWxsXCIsIFwiQUVzbWFsbFwiLCBcIkNjZWRpbGxhc21hbGxcIiwgXCJFZ3JhdmVzbWFsbFwiLCBcIkVhY3V0ZXNtYWxsXCIsIFwiRWNpcmN1bWZsZXhzbWFsbFwiLCBcIkVkaWVyZXNpc3NtYWxsXCIsIFwiSWdyYXZlc21hbGxcIiwgXCJJYWN1dGVzbWFsbFwiLCBcIkljaXJjdW1mbGV4c21hbGxcIiwgXCJJZGllcmVzaXNzbWFsbFwiLCBcIkV0aHNtYWxsXCIsIFwiTnRpbGRlc21hbGxcIiwgXCJPZ3JhdmVzbWFsbFwiLCBcIk9hY3V0ZXNtYWxsXCIsIFwiT2NpcmN1bWZsZXhzbWFsbFwiLCBcIk90aWxkZXNtYWxsXCIsIFwiT2RpZXJlc2lzc21hbGxcIiwgXCJPRXNtYWxsXCIsIFwiT3NsYXNoc21hbGxcIiwgXCJVZ3JhdmVzbWFsbFwiLCBcIlVhY3V0ZXNtYWxsXCIsIFwiVWNpcmN1bWZsZXhzbWFsbFwiLCBcIlVkaWVyZXNpc3NtYWxsXCIsIFwiWWFjdXRlc21hbGxcIiwgXCJUaG9ybnNtYWxsXCIsIFwiWWRpZXJlc2lzc21hbGxcIiwgXCIwMDEuMDAwXCIsIFwiMDAxLjAwMVwiLCBcIjAwMS4wMDJcIiwgXCIwMDEuMDAzXCIsIFwiQmxhY2tcIiwgXCJCb2xkXCIsIFwiQm9va1wiLCBcIkxpZ2h0XCIsIFwiTWVkaXVtXCIsIFwiUmVndWxhclwiLCBcIlJvbWFuXCIsIFwiU2VtaWJvbGRcIl07XG5cbnZhciBTdGFuZGFyZEVuY29kaW5nID0gWycnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJ3NwYWNlJywgJ2V4Y2xhbScsICdxdW90ZWRibCcsICdudW1iZXJzaWduJywgJ2RvbGxhcicsICdwZXJjZW50JywgJ2FtcGVyc2FuZCcsICdxdW90ZXJpZ2h0JywgJ3BhcmVubGVmdCcsICdwYXJlbnJpZ2h0JywgJ2FzdGVyaXNrJywgJ3BsdXMnLCAnY29tbWEnLCAnaHlwaGVuJywgJ3BlcmlvZCcsICdzbGFzaCcsICd6ZXJvJywgJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicsICdmaXZlJywgJ3NpeCcsICdzZXZlbicsICdlaWdodCcsICduaW5lJywgJ2NvbG9uJywgJ3NlbWljb2xvbicsICdsZXNzJywgJ2VxdWFsJywgJ2dyZWF0ZXInLCAncXVlc3Rpb24nLCAnYXQnLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywgJ2JyYWNrZXRsZWZ0JywgJ2JhY2tzbGFzaCcsICdicmFja2V0cmlnaHQnLCAnYXNjaWljaXJjdW0nLCAndW5kZXJzY29yZScsICdxdW90ZWxlZnQnLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsICduJywgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgJ2JyYWNlbGVmdCcsICdiYXInLCAnYnJhY2VyaWdodCcsICdhc2NpaXRpbGRlJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICdleGNsYW1kb3duJywgJ2NlbnQnLCAnc3RlcmxpbmcnLCAnZnJhY3Rpb24nLCAneWVuJywgJ2Zsb3JpbicsICdzZWN0aW9uJywgJ2N1cnJlbmN5JywgJ3F1b3Rlc2luZ2xlJywgJ3F1b3RlZGJsbGVmdCcsICdndWlsbGVtb3RsZWZ0JywgJ2d1aWxzaW5nbGxlZnQnLCAnZ3VpbHNpbmdscmlnaHQnLCAnZmknLCAnZmwnLCAnJywgJ2VuZGFzaCcsICdkYWdnZXInLCAnZGFnZ2VyZGJsJywgJ3BlcmlvZGNlbnRlcmVkJywgJycsICdwYXJhZ3JhcGgnLCAnYnVsbGV0JywgJ3F1b3Rlc2luZ2xiYXNlJywgJ3F1b3RlZGJsYmFzZScsICdxdW90ZWRibHJpZ2h0JywgJ2d1aWxsZW1vdHJpZ2h0JywgJ2VsbGlwc2lzJywgJ3BlcnRob3VzYW5kJywgJycsICdxdWVzdGlvbmRvd24nLCAnJywgJ2dyYXZlJywgJ2FjdXRlJywgJ2NpcmN1bWZsZXgnLCAndGlsZGUnLCAnbWFjcm9uJywgJ2JyZXZlJywgJ2RvdGFjY2VudCcsICdkaWVyZXNpcycsICcnLCAncmluZycsICdjZWRpbGxhJywgJycsICdodW5nYXJ1bWxhdXQnLCAnb2dvbmVrJywgJ2Nhcm9uJywgJ2VtZGFzaCcsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnQUUnLCAnJywgJ29yZGZlbWluaW5lJywgJycsICcnLCAnJywgJycsICdMc2xhc2gnLCAnT3NsYXNoJywgJ09FJywgJ29yZG1hc2N1bGluZScsICcnLCAnJywgJycsICcnLCAnJywgJ2FlJywgJycsICcnLCAnJywgJ2RvdGxlc3NpJywgJycsICcnLCAnbHNsYXNoJywgJ29zbGFzaCcsICdvZScsICdnZXJtYW5kYmxzJ107XG52YXIgRXhwZXJ0RW5jb2RpbmcgPSBbJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnc3BhY2UnLCAnZXhjbGFtc21hbGwnLCAnSHVuZ2FydW1sYXV0c21hbGwnLCAnJywgJ2RvbGxhcm9sZHN0eWxlJywgJ2RvbGxhcnN1cGVyaW9yJywgJ2FtcGVyc2FuZHNtYWxsJywgJ0FjdXRlc21hbGwnLCAncGFyZW5sZWZ0c3VwZXJpb3InLCAncGFyZW5yaWdodHN1cGVyaW9yJywgJ3R3b2RvdGVubGVhZGVyJywgJ29uZWRvdGVubGVhZGVyJywgJ2NvbW1hJywgJ2h5cGhlbicsICdwZXJpb2QnLCAnZnJhY3Rpb24nLCAnemVyb29sZHN0eWxlJywgJ29uZW9sZHN0eWxlJywgJ3R3b29sZHN0eWxlJywgJ3RocmVlb2xkc3R5bGUnLCAnZm91cm9sZHN0eWxlJywgJ2ZpdmVvbGRzdHlsZScsICdzaXhvbGRzdHlsZScsICdzZXZlbm9sZHN0eWxlJywgJ2VpZ2h0b2xkc3R5bGUnLCAnbmluZW9sZHN0eWxlJywgJ2NvbG9uJywgJ3NlbWljb2xvbicsICdjb21tYXN1cGVyaW9yJywgJ3RocmVlcXVhcnRlcnNlbWRhc2gnLCAncGVyaW9kc3VwZXJpb3InLCAncXVlc3Rpb25zbWFsbCcsICcnLCAnYXN1cGVyaW9yJywgJ2JzdXBlcmlvcicsICdjZW50c3VwZXJpb3InLCAnZHN1cGVyaW9yJywgJ2VzdXBlcmlvcicsICcnLCAnJywgJ2lzdXBlcmlvcicsICcnLCAnJywgJ2xzdXBlcmlvcicsICdtc3VwZXJpb3InLCAnbnN1cGVyaW9yJywgJ29zdXBlcmlvcicsICcnLCAnJywgJ3JzdXBlcmlvcicsICdzc3VwZXJpb3InLCAndHN1cGVyaW9yJywgJycsICdmZicsICdmaScsICdmbCcsICdmZmknLCAnZmZsJywgJ3BhcmVubGVmdGluZmVyaW9yJywgJycsICdwYXJlbnJpZ2h0aW5mZXJpb3InLCAnQ2lyY3VtZmxleHNtYWxsJywgJ2h5cGhlbnN1cGVyaW9yJywgJ0dyYXZlc21hbGwnLCAnQXNtYWxsJywgJ0JzbWFsbCcsICdDc21hbGwnLCAnRHNtYWxsJywgJ0VzbWFsbCcsICdGc21hbGwnLCAnR3NtYWxsJywgJ0hzbWFsbCcsICdJc21hbGwnLCAnSnNtYWxsJywgJ0tzbWFsbCcsICdMc21hbGwnLCAnTXNtYWxsJywgJ05zbWFsbCcsICdPc21hbGwnLCAnUHNtYWxsJywgJ1FzbWFsbCcsICdSc21hbGwnLCAnU3NtYWxsJywgJ1RzbWFsbCcsICdVc21hbGwnLCAnVnNtYWxsJywgJ1dzbWFsbCcsICdYc21hbGwnLCAnWXNtYWxsJywgJ1pzbWFsbCcsICdjb2xvbm1vbmV0YXJ5JywgJ29uZWZpdHRlZCcsICdydXBpYWgnLCAnVGlsZGVzbWFsbCcsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnZXhjbGFtZG93bnNtYWxsJywgJ2NlbnRvbGRzdHlsZScsICdMc2xhc2hzbWFsbCcsICcnLCAnJywgJ1NjYXJvbnNtYWxsJywgJ1pjYXJvbnNtYWxsJywgJ0RpZXJlc2lzc21hbGwnLCAnQnJldmVzbWFsbCcsICdDYXJvbnNtYWxsJywgJycsICdEb3RhY2NlbnRzbWFsbCcsICcnLCAnJywgJ01hY3JvbnNtYWxsJywgJycsICcnLCAnZmlndXJlZGFzaCcsICdoeXBoZW5pbmZlcmlvcicsICcnLCAnJywgJ09nb25la3NtYWxsJywgJ1JpbmdzbWFsbCcsICdDZWRpbGxhc21hbGwnLCAnJywgJycsICcnLCAnb25lcXVhcnRlcicsICdvbmVoYWxmJywgJ3RocmVlcXVhcnRlcnMnLCAncXVlc3Rpb25kb3duc21hbGwnLCAnb25lZWlnaHRoJywgJ3RocmVlZWlnaHRocycsICdmaXZlZWlnaHRocycsICdzZXZlbmVpZ2h0aHMnLCAnb25ldGhpcmQnLCAndHdvdGhpcmRzJywgJycsICcnLCAnemVyb3N1cGVyaW9yJywgJ29uZXN1cGVyaW9yJywgJ3R3b3N1cGVyaW9yJywgJ3RocmVlc3VwZXJpb3InLCAnZm91cnN1cGVyaW9yJywgJ2ZpdmVzdXBlcmlvcicsICdzaXhzdXBlcmlvcicsICdzZXZlbnN1cGVyaW9yJywgJ2VpZ2h0c3VwZXJpb3InLCAnbmluZXN1cGVyaW9yJywgJ3plcm9pbmZlcmlvcicsICdvbmVpbmZlcmlvcicsICd0d29pbmZlcmlvcicsICd0aHJlZWluZmVyaW9yJywgJ2ZvdXJpbmZlcmlvcicsICdmaXZlaW5mZXJpb3InLCAnc2l4aW5mZXJpb3InLCAnc2V2ZW5pbmZlcmlvcicsICdlaWdodGluZmVyaW9yJywgJ25pbmVpbmZlcmlvcicsICdjZW50aW5mZXJpb3InLCAnZG9sbGFyaW5mZXJpb3InLCAncGVyaW9kaW5mZXJpb3InLCAnY29tbWFpbmZlcmlvcicsICdBZ3JhdmVzbWFsbCcsICdBYWN1dGVzbWFsbCcsICdBY2lyY3VtZmxleHNtYWxsJywgJ0F0aWxkZXNtYWxsJywgJ0FkaWVyZXNpc3NtYWxsJywgJ0FyaW5nc21hbGwnLCAnQUVzbWFsbCcsICdDY2VkaWxsYXNtYWxsJywgJ0VncmF2ZXNtYWxsJywgJ0VhY3V0ZXNtYWxsJywgJ0VjaXJjdW1mbGV4c21hbGwnLCAnRWRpZXJlc2lzc21hbGwnLCAnSWdyYXZlc21hbGwnLCAnSWFjdXRlc21hbGwnLCAnSWNpcmN1bWZsZXhzbWFsbCcsICdJZGllcmVzaXNzbWFsbCcsICdFdGhzbWFsbCcsICdOdGlsZGVzbWFsbCcsICdPZ3JhdmVzbWFsbCcsICdPYWN1dGVzbWFsbCcsICdPY2lyY3VtZmxleHNtYWxsJywgJ090aWxkZXNtYWxsJywgJ09kaWVyZXNpc3NtYWxsJywgJ09Fc21hbGwnLCAnT3NsYXNoc21hbGwnLCAnVWdyYXZlc21hbGwnLCAnVWFjdXRlc21hbGwnLCAnVWNpcmN1bWZsZXhzbWFsbCcsICdVZGllcmVzaXNzbWFsbCcsICdZYWN1dGVzbWFsbCcsICdUaG9ybnNtYWxsJywgJ1lkaWVyZXNpc3NtYWxsJ107XG5cbnZhciBJU09BZG9iZUNoYXJzZXQgPSBbJy5ub3RkZWYnLCAnc3BhY2UnLCAnZXhjbGFtJywgJ3F1b3RlZGJsJywgJ251bWJlcnNpZ24nLCAnZG9sbGFyJywgJ3BlcmNlbnQnLCAnYW1wZXJzYW5kJywgJ3F1b3RlcmlnaHQnLCAncGFyZW5sZWZ0JywgJ3BhcmVucmlnaHQnLCAnYXN0ZXJpc2snLCAncGx1cycsICdjb21tYScsICdoeXBoZW4nLCAncGVyaW9kJywgJ3NsYXNoJywgJ3plcm8nLCAnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJywgJ2ZpdmUnLCAnc2l4JywgJ3NldmVuJywgJ2VpZ2h0JywgJ25pbmUnLCAnY29sb24nLCAnc2VtaWNvbG9uJywgJ2xlc3MnLCAnZXF1YWwnLCAnZ3JlYXRlcicsICdxdWVzdGlvbicsICdhdCcsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLCAnTycsICdQJywgJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnYnJhY2tldGxlZnQnLCAnYmFja3NsYXNoJywgJ2JyYWNrZXRyaWdodCcsICdhc2NpaWNpcmN1bScsICd1bmRlcnNjb3JlJywgJ3F1b3RlbGVmdCcsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLCAnYnJhY2VsZWZ0JywgJ2JhcicsICdicmFjZXJpZ2h0JywgJ2FzY2lpdGlsZGUnLCAnZXhjbGFtZG93bicsICdjZW50JywgJ3N0ZXJsaW5nJywgJ2ZyYWN0aW9uJywgJ3llbicsICdmbG9yaW4nLCAnc2VjdGlvbicsICdjdXJyZW5jeScsICdxdW90ZXNpbmdsZScsICdxdW90ZWRibGxlZnQnLCAnZ3VpbGxlbW90bGVmdCcsICdndWlsc2luZ2xsZWZ0JywgJ2d1aWxzaW5nbHJpZ2h0JywgJ2ZpJywgJ2ZsJywgJ2VuZGFzaCcsICdkYWdnZXInLCAnZGFnZ2VyZGJsJywgJ3BlcmlvZGNlbnRlcmVkJywgJ3BhcmFncmFwaCcsICdidWxsZXQnLCAncXVvdGVzaW5nbGJhc2UnLCAncXVvdGVkYmxiYXNlJywgJ3F1b3RlZGJscmlnaHQnLCAnZ3VpbGxlbW90cmlnaHQnLCAnZWxsaXBzaXMnLCAncGVydGhvdXNhbmQnLCAncXVlc3Rpb25kb3duJywgJ2dyYXZlJywgJ2FjdXRlJywgJ2NpcmN1bWZsZXgnLCAndGlsZGUnLCAnbWFjcm9uJywgJ2JyZXZlJywgJ2RvdGFjY2VudCcsICdkaWVyZXNpcycsICdyaW5nJywgJ2NlZGlsbGEnLCAnaHVuZ2FydW1sYXV0JywgJ29nb25laycsICdjYXJvbicsICdlbWRhc2gnLCAnQUUnLCAnb3JkZmVtaW5pbmUnLCAnTHNsYXNoJywgJ09zbGFzaCcsICdPRScsICdvcmRtYXNjdWxpbmUnLCAnYWUnLCAnZG90bGVzc2knLCAnbHNsYXNoJywgJ29zbGFzaCcsICdvZScsICdnZXJtYW5kYmxzJywgJ29uZXN1cGVyaW9yJywgJ2xvZ2ljYWxub3QnLCAnbXUnLCAndHJhZGVtYXJrJywgJ0V0aCcsICdvbmVoYWxmJywgJ3BsdXNtaW51cycsICdUaG9ybicsICdvbmVxdWFydGVyJywgJ2RpdmlkZScsICdicm9rZW5iYXInLCAnZGVncmVlJywgJ3Rob3JuJywgJ3RocmVlcXVhcnRlcnMnLCAndHdvc3VwZXJpb3InLCAncmVnaXN0ZXJlZCcsICdtaW51cycsICdldGgnLCAnbXVsdGlwbHknLCAndGhyZWVzdXBlcmlvcicsICdjb3B5cmlnaHQnLCAnQWFjdXRlJywgJ0FjaXJjdW1mbGV4JywgJ0FkaWVyZXNpcycsICdBZ3JhdmUnLCAnQXJpbmcnLCAnQXRpbGRlJywgJ0NjZWRpbGxhJywgJ0VhY3V0ZScsICdFY2lyY3VtZmxleCcsICdFZGllcmVzaXMnLCAnRWdyYXZlJywgJ0lhY3V0ZScsICdJY2lyY3VtZmxleCcsICdJZGllcmVzaXMnLCAnSWdyYXZlJywgJ050aWxkZScsICdPYWN1dGUnLCAnT2NpcmN1bWZsZXgnLCAnT2RpZXJlc2lzJywgJ09ncmF2ZScsICdPdGlsZGUnLCAnU2Nhcm9uJywgJ1VhY3V0ZScsICdVY2lyY3VtZmxleCcsICdVZGllcmVzaXMnLCAnVWdyYXZlJywgJ1lhY3V0ZScsICdZZGllcmVzaXMnLCAnWmNhcm9uJywgJ2FhY3V0ZScsICdhY2lyY3VtZmxleCcsICdhZGllcmVzaXMnLCAnYWdyYXZlJywgJ2FyaW5nJywgJ2F0aWxkZScsICdjY2VkaWxsYScsICdlYWN1dGUnLCAnZWNpcmN1bWZsZXgnLCAnZWRpZXJlc2lzJywgJ2VncmF2ZScsICdpYWN1dGUnLCAnaWNpcmN1bWZsZXgnLCAnaWRpZXJlc2lzJywgJ2lncmF2ZScsICdudGlsZGUnLCAnb2FjdXRlJywgJ29jaXJjdW1mbGV4JywgJ29kaWVyZXNpcycsICdvZ3JhdmUnLCAnb3RpbGRlJywgJ3NjYXJvbicsICd1YWN1dGUnLCAndWNpcmN1bWZsZXgnLCAndWRpZXJlc2lzJywgJ3VncmF2ZScsICd5YWN1dGUnLCAneWRpZXJlc2lzJywgJ3pjYXJvbiddO1xudmFyIEV4cGVydENoYXJzZXQgPSBbJy5ub3RkZWYnLCAnc3BhY2UnLCAnZXhjbGFtc21hbGwnLCAnSHVuZ2FydW1sYXV0c21hbGwnLCAnZG9sbGFyb2xkc3R5bGUnLCAnZG9sbGFyc3VwZXJpb3InLCAnYW1wZXJzYW5kc21hbGwnLCAnQWN1dGVzbWFsbCcsICdwYXJlbmxlZnRzdXBlcmlvcicsICdwYXJlbnJpZ2h0c3VwZXJpb3InLCAndHdvZG90ZW5sZWFkZXInLCAnb25lZG90ZW5sZWFkZXInLCAnY29tbWEnLCAnaHlwaGVuJywgJ3BlcmlvZCcsICdmcmFjdGlvbicsICd6ZXJvb2xkc3R5bGUnLCAnb25lb2xkc3R5bGUnLCAndHdvb2xkc3R5bGUnLCAndGhyZWVvbGRzdHlsZScsICdmb3Vyb2xkc3R5bGUnLCAnZml2ZW9sZHN0eWxlJywgJ3NpeG9sZHN0eWxlJywgJ3NldmVub2xkc3R5bGUnLCAnZWlnaHRvbGRzdHlsZScsICduaW5lb2xkc3R5bGUnLCAnY29sb24nLCAnc2VtaWNvbG9uJywgJ2NvbW1hc3VwZXJpb3InLCAndGhyZWVxdWFydGVyc2VtZGFzaCcsICdwZXJpb2RzdXBlcmlvcicsICdxdWVzdGlvbnNtYWxsJywgJ2FzdXBlcmlvcicsICdic3VwZXJpb3InLCAnY2VudHN1cGVyaW9yJywgJ2RzdXBlcmlvcicsICdlc3VwZXJpb3InLCAnaXN1cGVyaW9yJywgJ2xzdXBlcmlvcicsICdtc3VwZXJpb3InLCAnbnN1cGVyaW9yJywgJ29zdXBlcmlvcicsICdyc3VwZXJpb3InLCAnc3N1cGVyaW9yJywgJ3RzdXBlcmlvcicsICdmZicsICdmaScsICdmbCcsICdmZmknLCAnZmZsJywgJ3BhcmVubGVmdGluZmVyaW9yJywgJ3BhcmVucmlnaHRpbmZlcmlvcicsICdDaXJjdW1mbGV4c21hbGwnLCAnaHlwaGVuc3VwZXJpb3InLCAnR3JhdmVzbWFsbCcsICdBc21hbGwnLCAnQnNtYWxsJywgJ0NzbWFsbCcsICdEc21hbGwnLCAnRXNtYWxsJywgJ0ZzbWFsbCcsICdHc21hbGwnLCAnSHNtYWxsJywgJ0lzbWFsbCcsICdKc21hbGwnLCAnS3NtYWxsJywgJ0xzbWFsbCcsICdNc21hbGwnLCAnTnNtYWxsJywgJ09zbWFsbCcsICdQc21hbGwnLCAnUXNtYWxsJywgJ1JzbWFsbCcsICdTc21hbGwnLCAnVHNtYWxsJywgJ1VzbWFsbCcsICdWc21hbGwnLCAnV3NtYWxsJywgJ1hzbWFsbCcsICdZc21hbGwnLCAnWnNtYWxsJywgJ2NvbG9ubW9uZXRhcnknLCAnb25lZml0dGVkJywgJ3J1cGlhaCcsICdUaWxkZXNtYWxsJywgJ2V4Y2xhbWRvd25zbWFsbCcsICdjZW50b2xkc3R5bGUnLCAnTHNsYXNoc21hbGwnLCAnU2Nhcm9uc21hbGwnLCAnWmNhcm9uc21hbGwnLCAnRGllcmVzaXNzbWFsbCcsICdCcmV2ZXNtYWxsJywgJ0Nhcm9uc21hbGwnLCAnRG90YWNjZW50c21hbGwnLCAnTWFjcm9uc21hbGwnLCAnZmlndXJlZGFzaCcsICdoeXBoZW5pbmZlcmlvcicsICdPZ29uZWtzbWFsbCcsICdSaW5nc21hbGwnLCAnQ2VkaWxsYXNtYWxsJywgJ29uZXF1YXJ0ZXInLCAnb25laGFsZicsICd0aHJlZXF1YXJ0ZXJzJywgJ3F1ZXN0aW9uZG93bnNtYWxsJywgJ29uZWVpZ2h0aCcsICd0aHJlZWVpZ2h0aHMnLCAnZml2ZWVpZ2h0aHMnLCAnc2V2ZW5laWdodGhzJywgJ29uZXRoaXJkJywgJ3R3b3RoaXJkcycsICd6ZXJvc3VwZXJpb3InLCAnb25lc3VwZXJpb3InLCAndHdvc3VwZXJpb3InLCAndGhyZWVzdXBlcmlvcicsICdmb3Vyc3VwZXJpb3InLCAnZml2ZXN1cGVyaW9yJywgJ3NpeHN1cGVyaW9yJywgJ3NldmVuc3VwZXJpb3InLCAnZWlnaHRzdXBlcmlvcicsICduaW5lc3VwZXJpb3InLCAnemVyb2luZmVyaW9yJywgJ29uZWluZmVyaW9yJywgJ3R3b2luZmVyaW9yJywgJ3RocmVlaW5mZXJpb3InLCAnZm91cmluZmVyaW9yJywgJ2ZpdmVpbmZlcmlvcicsICdzaXhpbmZlcmlvcicsICdzZXZlbmluZmVyaW9yJywgJ2VpZ2h0aW5mZXJpb3InLCAnbmluZWluZmVyaW9yJywgJ2NlbnRpbmZlcmlvcicsICdkb2xsYXJpbmZlcmlvcicsICdwZXJpb2RpbmZlcmlvcicsICdjb21tYWluZmVyaW9yJywgJ0FncmF2ZXNtYWxsJywgJ0FhY3V0ZXNtYWxsJywgJ0FjaXJjdW1mbGV4c21hbGwnLCAnQXRpbGRlc21hbGwnLCAnQWRpZXJlc2lzc21hbGwnLCAnQXJpbmdzbWFsbCcsICdBRXNtYWxsJywgJ0NjZWRpbGxhc21hbGwnLCAnRWdyYXZlc21hbGwnLCAnRWFjdXRlc21hbGwnLCAnRWNpcmN1bWZsZXhzbWFsbCcsICdFZGllcmVzaXNzbWFsbCcsICdJZ3JhdmVzbWFsbCcsICdJYWN1dGVzbWFsbCcsICdJY2lyY3VtZmxleHNtYWxsJywgJ0lkaWVyZXNpc3NtYWxsJywgJ0V0aHNtYWxsJywgJ050aWxkZXNtYWxsJywgJ09ncmF2ZXNtYWxsJywgJ09hY3V0ZXNtYWxsJywgJ09jaXJjdW1mbGV4c21hbGwnLCAnT3RpbGRlc21hbGwnLCAnT2RpZXJlc2lzc21hbGwnLCAnT0VzbWFsbCcsICdPc2xhc2hzbWFsbCcsICdVZ3JhdmVzbWFsbCcsICdVYWN1dGVzbWFsbCcsICdVY2lyY3VtZmxleHNtYWxsJywgJ1VkaWVyZXNpc3NtYWxsJywgJ1lhY3V0ZXNtYWxsJywgJ1Rob3Juc21hbGwnLCAnWWRpZXJlc2lzc21hbGwnXTtcbnZhciBFeHBlcnRTdWJzZXRDaGFyc2V0ID0gWycubm90ZGVmJywgJ3NwYWNlJywgJ2RvbGxhcm9sZHN0eWxlJywgJ2RvbGxhcnN1cGVyaW9yJywgJ3BhcmVubGVmdHN1cGVyaW9yJywgJ3BhcmVucmlnaHRzdXBlcmlvcicsICd0d29kb3RlbmxlYWRlcicsICdvbmVkb3RlbmxlYWRlcicsICdjb21tYScsICdoeXBoZW4nLCAncGVyaW9kJywgJ2ZyYWN0aW9uJywgJ3plcm9vbGRzdHlsZScsICdvbmVvbGRzdHlsZScsICd0d29vbGRzdHlsZScsICd0aHJlZW9sZHN0eWxlJywgJ2ZvdXJvbGRzdHlsZScsICdmaXZlb2xkc3R5bGUnLCAnc2l4b2xkc3R5bGUnLCAnc2V2ZW5vbGRzdHlsZScsICdlaWdodG9sZHN0eWxlJywgJ25pbmVvbGRzdHlsZScsICdjb2xvbicsICdzZW1pY29sb24nLCAnY29tbWFzdXBlcmlvcicsICd0aHJlZXF1YXJ0ZXJzZW1kYXNoJywgJ3BlcmlvZHN1cGVyaW9yJywgJ2FzdXBlcmlvcicsICdic3VwZXJpb3InLCAnY2VudHN1cGVyaW9yJywgJ2RzdXBlcmlvcicsICdlc3VwZXJpb3InLCAnaXN1cGVyaW9yJywgJ2xzdXBlcmlvcicsICdtc3VwZXJpb3InLCAnbnN1cGVyaW9yJywgJ29zdXBlcmlvcicsICdyc3VwZXJpb3InLCAnc3N1cGVyaW9yJywgJ3RzdXBlcmlvcicsICdmZicsICdmaScsICdmbCcsICdmZmknLCAnZmZsJywgJ3BhcmVubGVmdGluZmVyaW9yJywgJ3BhcmVucmlnaHRpbmZlcmlvcicsICdoeXBoZW5zdXBlcmlvcicsICdjb2xvbm1vbmV0YXJ5JywgJ29uZWZpdHRlZCcsICdydXBpYWgnLCAnY2VudG9sZHN0eWxlJywgJ2ZpZ3VyZWRhc2gnLCAnaHlwaGVuaW5mZXJpb3InLCAnb25lcXVhcnRlcicsICdvbmVoYWxmJywgJ3RocmVlcXVhcnRlcnMnLCAnb25lZWlnaHRoJywgJ3RocmVlZWlnaHRocycsICdmaXZlZWlnaHRocycsICdzZXZlbmVpZ2h0aHMnLCAnb25ldGhpcmQnLCAndHdvdGhpcmRzJywgJ3plcm9zdXBlcmlvcicsICdvbmVzdXBlcmlvcicsICd0d29zdXBlcmlvcicsICd0aHJlZXN1cGVyaW9yJywgJ2ZvdXJzdXBlcmlvcicsICdmaXZlc3VwZXJpb3InLCAnc2l4c3VwZXJpb3InLCAnc2V2ZW5zdXBlcmlvcicsICdlaWdodHN1cGVyaW9yJywgJ25pbmVzdXBlcmlvcicsICd6ZXJvaW5mZXJpb3InLCAnb25laW5mZXJpb3InLCAndHdvaW5mZXJpb3InLCAndGhyZWVpbmZlcmlvcicsICdmb3VyaW5mZXJpb3InLCAnZml2ZWluZmVyaW9yJywgJ3NpeGluZmVyaW9yJywgJ3NldmVuaW5mZXJpb3InLCAnZWlnaHRpbmZlcmlvcicsICduaW5laW5mZXJpb3InLCAnY2VudGluZmVyaW9yJywgJ2RvbGxhcmluZmVyaW9yJywgJ3BlcmlvZGluZmVyaW9yJywgJ2NvbW1haW5mZXJpb3InXTtcblxuLy8gU2NyaXB0cyBhbmQgTGFuZ3VhZ2VzICNcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbnZhciBMYW5nU3lzVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICByZXFGZWF0dXJlSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZmVhdHVyZUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGZlYXR1cmVJbmRleGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnZmVhdHVyZUNvdW50Jylcbn0pO1xudmFyIExhbmdTeXNSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICBsYW5nU3lzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIExhbmdTeXNUYWJsZSwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBTY3JpcHQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZGVmYXVsdExhbmdTeXM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTGFuZ1N5c1RhYmxlKSxcbiAgY291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbGFuZ1N5c1JlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShMYW5nU3lzUmVjb3JkLCAnY291bnQnKVxufSk7XG52YXIgU2NyaXB0UmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgc2NyaXB0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFNjcmlwdCwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBTY3JpcHRMaXN0ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KFNjcmlwdFJlY29yZCwgcmVzdHJ1Y3R1cmUudWludDE2KTsgLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gRmVhdHVyZXMgYW5kIExvb2t1cHMgI1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG52YXIgRmVhdHVyZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmZWF0dXJlUGFyYW1zOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIHBvaW50ZXJcbiAgbG9va3VwQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbG9va3VwTGlzdEluZGV4ZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdsb29rdXBDb3VudCcpXG59KTtcbnZhciBGZWF0dXJlUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgZmVhdHVyZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBGZWF0dXJlLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIEZlYXR1cmVMaXN0ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KEZlYXR1cmVSZWNvcmQsIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgTG9va3VwRmxhZ3MgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbWFya0F0dGFjaG1lbnRUeXBlOiByZXN0cnVjdHVyZS51aW50OCxcbiAgZmxhZ3M6IG5ldyByZXN0cnVjdHVyZS5CaXRmaWVsZChyZXN0cnVjdHVyZS51aW50OCwgWydyaWdodFRvTGVmdCcsICdpZ25vcmVCYXNlR2x5cGhzJywgJ2lnbm9yZUxpZ2F0dXJlcycsICdpZ25vcmVNYXJrcycsICd1c2VNYXJrRmlsdGVyaW5nU2V0J10pXG59KTtcbmZ1bmN0aW9uIExvb2t1cExpc3QoU3ViVGFibGUpIHtcbiAgdmFyIExvb2t1cCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICAgIGxvb2t1cFR5cGU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBmbGFnczogTG9va3VwRmxhZ3MsXG4gICAgc3ViVGFibGVDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHN1YlRhYmxlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgU3ViVGFibGUpLCAnc3ViVGFibGVDb3VudCcpLFxuICAgIG1hcmtGaWx0ZXJpbmdTZXQ6IG5ldyByZXN0cnVjdHVyZS5PcHRpb25hbChyZXN0cnVjdHVyZS51aW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5mbGFncy5mbGFncy51c2VNYXJrRmlsdGVyaW5nU2V0O1xuICAgIH0pXG4gIH0pO1xuICByZXR1cm4gbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIExvb2t1cCksIHJlc3RydWN0dXJlLnVpbnQxNik7XG59IC8vIyMjIyMjIyMjIyMjIyMjIyNcbi8vIENvdmVyYWdlIFRhYmxlICNcbi8vIyMjIyMjIyMjIyMjIyMjIyNcblxudmFyIFJhbmdlUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHN0YXJ0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGVuZDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzdGFydENvdmVyYWdlSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7XG52YXIgQ292ZXJhZ2UgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAxOiB7XG4gICAgZ2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGdseXBoczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ2dseXBoQ291bnQnKVxuICB9LFxuICAyOiB7XG4gICAgcmFuZ2VDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHJhbmdlUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFJhbmdlUmVjb3JkLCAncmFuZ2VDb3VudCcpXG4gIH1cbn0pOyAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbi8vIENsYXNzIERlZmluaXRpb24gVGFibGUgI1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbnZhciBDbGFzc1JhbmdlUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHN0YXJ0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGVuZDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBcImNsYXNzXCI6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7XG52YXIgQ2xhc3NEZWYgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAxOiB7XG4gICAgLy8gQ2xhc3MgYXJyYXlcbiAgICBzdGFydEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZ2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNsYXNzVmFsdWVBcnJheTogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ2dseXBoQ291bnQnKVxuICB9LFxuICAyOiB7XG4gICAgLy8gQ2xhc3MgcmFuZ2VzXG4gICAgY2xhc3NSYW5nZUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY2xhc3NSYW5nZVJlY29yZDogbmV3IHJlc3RydWN0dXJlLkFycmF5KENsYXNzUmFuZ2VSZWNvcmQsICdjbGFzc1JhbmdlQ291bnQnKVxuICB9XG59KTsgLy8jIyMjIyMjIyMjIyMjIyNcbi8vIERldmljZSBUYWJsZSAjXG4vLyMjIyMjIyMjIyMjIyMjI1xuXG52YXIgRGV2aWNlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGE6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gc3RhcnRTaXplIGZvciBoaW50aW5nIERldmljZSwgb3V0ZXJJbmRleCBmb3IgVmFyaWF0aW9uSW5kZXhcbiAgYjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBlbmRTaXplIGZvciBEZXZpY2UsIGlubmVySW5kZXggZm9yIFZhcmlhdGlvbkluZGV4XG4gIGRlbHRhRm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTZcbn0pOyAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gQ29udGV4dHVhbCBTdWJzdGl0dXRpb24vUG9zaXRpb25pbmcgVGFibGVzICNcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbnZhciBMb29rdXBSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgc2VxdWVuY2VJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsb29rdXBMaXN0SW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7XG52YXIgUnVsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBnbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxvb2t1cENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGlucHV0OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LmdseXBoQ291bnQgLSAxO1xuICB9KSxcbiAgbG9va3VwUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KExvb2t1cFJlY29yZCwgJ2xvb2t1cENvdW50Jylcbn0pO1xudmFyIFJ1bGVTZXQgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBSdWxlKSwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBDbGFzc1J1bGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZ2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsb29rdXBDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBjbGFzc2VzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LmdseXBoQ291bnQgLSAxO1xuICB9KSxcbiAgbG9va3VwUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KExvb2t1cFJlY29yZCwgJ2xvb2t1cENvdW50Jylcbn0pO1xudmFyIENsYXNzU2V0ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NSdWxlKSwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBDb250ZXh0ID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgMToge1xuICAgIC8vIFNpbXBsZSBjb250ZXh0XG4gICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIHJ1bGVTZXRDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHJ1bGVTZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBSdWxlU2V0KSwgJ3J1bGVTZXRDb3VudCcpXG4gIH0sXG4gIDI6IHtcbiAgICAvLyBDbGFzcy1iYXNlZCBjb250ZXh0XG4gICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGNsYXNzRGVmOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzRGVmKSxcbiAgICBjbGFzc1NldENudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNsYXNzU2V0OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc1NldCksICdjbGFzc1NldENudCcpXG4gIH0sXG4gIDM6IHtcbiAgICBnbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbG9va3VwQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb3ZlcmFnZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSwgJ2dseXBoQ291bnQnKSxcbiAgICBsb29rdXBSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTG9va3VwUmVjb3JkLCAnbG9va3VwQ291bnQnKVxuICB9XG59KTsgLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbi8vIENoYWluaW5nIENvbnRleHR1YWwgU3Vic3RpdHV0aW9uL1Bvc2l0aW9uaW5nIFRhYmxlcyAjXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG52YXIgQ2hhaW5SdWxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGJhY2t0cmFja0dseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgYmFja3RyYWNrOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnYmFja3RyYWNrR2x5cGhDb3VudCcpLFxuICBpbnB1dEdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgaW5wdXQ6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuaW5wdXRHbHlwaENvdW50IC0gMTtcbiAgfSksXG4gIGxvb2thaGVhZEdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbG9va2FoZWFkOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnbG9va2FoZWFkR2x5cGhDb3VudCcpLFxuICBsb29rdXBDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsb29rdXBSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTG9va3VwUmVjb3JkLCAnbG9va3VwQ291bnQnKVxufSk7XG52YXIgQ2hhaW5SdWxlU2V0ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2hhaW5SdWxlKSwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBDaGFpbmluZ0NvbnRleHQgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAxOiB7XG4gICAgLy8gU2ltcGxlIGNvbnRleHQgZ2x5cGggc3Vic3RpdHV0aW9uXG4gICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGNoYWluQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjaGFpblJ1bGVTZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDaGFpblJ1bGVTZXQpLCAnY2hhaW5Db3VudCcpXG4gIH0sXG4gIDI6IHtcbiAgICAvLyBDbGFzcy1iYXNlZCBjaGFpbmluZyBjb250ZXh0XG4gICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGJhY2t0cmFja0NsYXNzRGVmOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzRGVmKSxcbiAgICBpbnB1dENsYXNzRGVmOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzRGVmKSxcbiAgICBsb29rYWhlYWRDbGFzc0RlZjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc0RlZiksXG4gICAgY2hhaW5Db3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNoYWluQ2xhc3NTZXQ6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENoYWluUnVsZVNldCksICdjaGFpbkNvdW50JylcbiAgfSxcbiAgMzoge1xuICAgIC8vIENvdmVyYWdlLWJhc2VkIGNoYWluaW5nIGNvbnRleHRcbiAgICBiYWNrdHJhY2tHbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgYmFja3RyYWNrQ292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSwgJ2JhY2t0cmFja0dseXBoQ291bnQnKSxcbiAgICBpbnB1dEdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBpbnB1dENvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksICdpbnB1dEdseXBoQ291bnQnKSxcbiAgICBsb29rYWhlYWRHbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbG9va2FoZWFkQ292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSwgJ2xvb2thaGVhZEdseXBoQ291bnQnKSxcbiAgICBsb29rdXBDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGxvb2t1cFJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShMb29rdXBSZWNvcmQsICdsb29rdXBDb3VudCcpXG4gIH1cbn0pO1xuXG52YXIgXztcbi8qKioqKioqKioqKioqKioqKioqXG4gKiBWYXJpYXRpb24gU3RvcmUgKlxuICoqKioqKioqKioqKioqKioqKiovXG5cbnZhciBGMkRPVDE0ID0gbmV3IHJlc3RydWN0dXJlLkZpeGVkKDE2LCAnQkUnLCAxNCk7XG52YXIgUmVnaW9uQXhpc0Nvb3JkaW5hdGVzID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHN0YXJ0Q29vcmQ6IEYyRE9UMTQsXG4gIHBlYWtDb29yZDogRjJET1QxNCxcbiAgZW5kQ29vcmQ6IEYyRE9UMTRcbn0pO1xudmFyIFZhcmlhdGlvblJlZ2lvbkxpc3QgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYXhpc0NvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHJlZ2lvbkNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHZhcmlhdGlvblJlZ2lvbnM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoUmVnaW9uQXhpc0Nvb3JkaW5hdGVzLCAnYXhpc0NvdW50JyksICdyZWdpb25Db3VudCcpXG59KTtcbnZhciBEZWx0YVNldCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBzaG9ydERlbHRhczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLmludDE2LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5zaG9ydERlbHRhQ291bnQ7XG4gIH0pLFxuICByZWdpb25EZWx0YXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS5pbnQ4LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5yZWdpb25JbmRleENvdW50IC0gdC5wYXJlbnQuc2hvcnREZWx0YUNvdW50O1xuICB9KSxcbiAgZGVsdGFzOiBmdW5jdGlvbiBkZWx0YXModCkge1xuICAgIHJldHVybiB0LnNob3J0RGVsdGFzLmNvbmNhdCh0LnJlZ2lvbkRlbHRhcyk7XG4gIH1cbn0pO1xudmFyIEl0ZW1WYXJpYXRpb25EYXRhID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGl0ZW1Db3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzaG9ydERlbHRhQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcmVnaW9uSW5kZXhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICByZWdpb25JbmRleGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAncmVnaW9uSW5kZXhDb3VudCcpLFxuICBkZWx0YVNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShEZWx0YVNldCwgJ2l0ZW1Db3VudCcpXG59KTtcbnZhciBJdGVtVmFyaWF0aW9uU3RvcmUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHZhcmlhdGlvblJlZ2lvbkxpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgVmFyaWF0aW9uUmVnaW9uTGlzdCksXG4gIHZhcmlhdGlvbkRhdGFDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBpdGVtVmFyaWF0aW9uRGF0YTogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgSXRlbVZhcmlhdGlvbkRhdGEpLCAndmFyaWF0aW9uRGF0YUNvdW50Jylcbn0pO1xuLyoqKioqKioqKioqKioqKioqKioqKipcbiAqIEZlYXR1cmUgVmFyaWF0aW9ucyAqXG4gKioqKioqKioqKioqKioqKioqKioqKi9cblxudmFyIENvbmRpdGlvblRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgMTogKF8gPSB7XG4gICAgYXhpc0luZGV4OiByZXN0cnVjdHVyZS51aW50MTZcbiAgfSwgX1tcImF4aXNJbmRleFwiXSA9IHJlc3RydWN0dXJlLnVpbnQxNiwgXy5maWx0ZXJSYW5nZU1pblZhbHVlID0gRjJET1QxNCwgXy5maWx0ZXJSYW5nZU1heFZhbHVlID0gRjJET1QxNCwgXylcbn0pO1xudmFyIENvbmRpdGlvblNldCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBjb25kaXRpb25Db3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBjb25kaXRpb25UYWJsZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgQ29uZGl0aW9uVGFibGUpLCAnY29uZGl0aW9uQ291bnQnKVxufSk7XG52YXIgRmVhdHVyZVRhYmxlU3Vic3RpdHV0aW9uUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZlYXR1cmVJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBhbHRlcm5hdGVGZWF0dXJlVGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgRmVhdHVyZSwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBGZWF0dXJlVGFibGVTdWJzdGl0dXRpb24gPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgc3Vic3RpdHV0aW9uQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc3Vic3RpdHV0aW9uczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEZlYXR1cmVUYWJsZVN1YnN0aXR1dGlvblJlY29yZCwgJ3N1YnN0aXR1dGlvbkNvdW50Jylcbn0pO1xudmFyIEZlYXR1cmVWYXJpYXRpb25SZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgY29uZGl0aW9uU2V0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIENvbmRpdGlvblNldCwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pLFxuICBmZWF0dXJlVGFibGVTdWJzdGl0dXRpb246IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgRmVhdHVyZVRhYmxlU3Vic3RpdHV0aW9uLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIEZlYXR1cmVWYXJpYXRpb25zID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG1ham9yVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtaW5vclZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZmVhdHVyZVZhcmlhdGlvblJlY29yZENvdW50OiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGZlYXR1cmVWYXJpYXRpb25SZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRmVhdHVyZVZhcmlhdGlvblJlY29yZCwgJ2ZlYXR1cmVWYXJpYXRpb25SZWNvcmRDb3VudCcpXG59KTtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkMShzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cbi8vIG90aGVyd2lzZSBkZWxlZ2F0ZXMgdG8gdGhlIHByb3ZpZGVkIHR5cGUuXG5cbnZhciBQcmVkZWZpbmVkT3AgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQcmVkZWZpbmVkT3AocHJlZGVmaW5lZE9wcywgdHlwZSkge1xuICAgIHRoaXMucHJlZGVmaW5lZE9wcyA9IHByZWRlZmluZWRPcHM7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBQcmVkZWZpbmVkT3AucHJvdG90eXBlO1xuXG4gIF9wcm90by5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQsIG9wZXJhbmRzKSB7XG4gICAgaWYgKHRoaXMucHJlZGVmaW5lZE9wc1tvcGVyYW5kc1swXV0pIHtcbiAgICAgIHJldHVybiB0aGlzLnByZWRlZmluZWRPcHNbb3BlcmFuZHNbMF1dO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSwgcGFyZW50LCBvcGVyYW5kcyk7XG4gIH07XG5cbiAgX3Byb3RvLnNpemUgPSBmdW5jdGlvbiBzaXplKHZhbHVlLCBjdHgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlLnNpemUodmFsdWUsIGN0eCk7XG4gIH07XG5cbiAgX3Byb3RvLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHJlYW0sIHZhbHVlLCBjdHgpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnByZWRlZmluZWRPcHMuaW5kZXhPZih2YWx1ZSk7XG5cbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHlwZS5lbmNvZGUoc3RyZWFtLCB2YWx1ZSwgY3R4KTtcbiAgfTtcblxuICByZXR1cm4gUHJlZGVmaW5lZE9wO1xufSgpO1xuXG52YXIgQ0ZGRW5jb2RpbmdWZXJzaW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfciROdW1iZXIpIHtcbiAgX2luaGVyaXRzTG9vc2UkMShDRkZFbmNvZGluZ1ZlcnNpb24sIF9yJE51bWJlcik7XG5cbiAgZnVuY3Rpb24gQ0ZGRW5jb2RpbmdWZXJzaW9uKCkge1xuICAgIHJldHVybiBfciROdW1iZXIuY2FsbCh0aGlzLCAnVUludDgnKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90bzIgPSBDRkZFbmNvZGluZ1ZlcnNpb24ucHJvdG90eXBlO1xuXG4gIF9wcm90bzIuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSkge1xuICAgIHJldHVybiByZXN0cnVjdHVyZS51aW50OC5kZWNvZGUoc3RyZWFtKSAmIDB4N2Y7XG4gIH07XG5cbiAgcmV0dXJuIENGRkVuY29kaW5nVmVyc2lvbjtcbn0ocmVzdHJ1Y3R1cmUuTnVtYmVyKTtcblxudmFyIFJhbmdlMSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmaXJzdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBuTGVmdDogcmVzdHJ1Y3R1cmUudWludDhcbn0pO1xudmFyIFJhbmdlMiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmaXJzdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBuTGVmdDogcmVzdHJ1Y3R1cmUudWludDE2XG59KTtcbnZhciBDRkZDdXN0b21FbmNvZGluZyA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QobmV3IENGRkVuY29kaW5nVmVyc2lvbigpLCB7XG4gIDA6IHtcbiAgICBuQ29kZXM6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAgIGNvZGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsICduQ29kZXMnKVxuICB9LFxuICAxOiB7XG4gICAgblJhbmdlczogcmVzdHJ1Y3R1cmUudWludDgsXG4gICAgcmFuZ2VzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoUmFuZ2UxLCAnblJhbmdlcycpXG4gIH0gLy8gVE9ETzogc3VwcGxlbWVudD9cblxufSk7XG52YXIgQ0ZGRW5jb2RpbmcgPSBuZXcgUHJlZGVmaW5lZE9wKFtTdGFuZGFyZEVuY29kaW5nLCBFeHBlcnRFbmNvZGluZ10sIG5ldyBDRkZQb2ludGVyKENGRkN1c3RvbUVuY29kaW5nLCB7XG4gIGxhenk6IHRydWVcbn0pKTsgLy8gRGVjb2RlcyBhbiBhcnJheSBvZiByYW5nZXMgdW50aWwgdGhlIHRvdGFsXG4vLyBsZW5ndGggaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIGxlbmd0aC5cblxudmFyIFJhbmdlQXJyYXkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9yJEFycmF5KSB7XG4gIF9pbmhlcml0c0xvb3NlJDEoUmFuZ2VBcnJheSwgX3IkQXJyYXkpO1xuXG4gIGZ1bmN0aW9uIFJhbmdlQXJyYXkoKSB7XG4gICAgcmV0dXJuIF9yJEFycmF5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8zID0gUmFuZ2VBcnJheS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMy5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICB2YXIgbGVuZ3RoID0gdXRpbHNfMSh0aGlzLmxlbmd0aCwgc3RyZWFtLCBwYXJlbnQpO1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIHJlcyA9IFtdO1xuXG4gICAgd2hpbGUgKGNvdW50IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgcmFuZ2UgPSB0aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSwgcGFyZW50KTtcbiAgICAgIHJhbmdlLm9mZnNldCA9IGNvdW50O1xuICAgICAgY291bnQgKz0gcmFuZ2UubkxlZnQgKyAxO1xuICAgICAgcmVzLnB1c2gocmFuZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgcmV0dXJuIFJhbmdlQXJyYXk7XG59KHJlc3RydWN0dXJlLkFycmF5KTtcblxudmFyIENGRkN1c3RvbUNoYXJzZXQgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQ4LCB7XG4gIDA6IHtcbiAgICBnbHlwaHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5wYXJlbnQuQ2hhclN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICB9KVxuICB9LFxuICAxOiB7XG4gICAgcmFuZ2VzOiBuZXcgUmFuZ2VBcnJheShSYW5nZTEsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5wYXJlbnQuQ2hhclN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICB9KVxuICB9LFxuICAyOiB7XG4gICAgcmFuZ2VzOiBuZXcgUmFuZ2VBcnJheShSYW5nZTIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5wYXJlbnQuQ2hhclN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICB9KVxuICB9XG59KTtcbnZhciBDRkZDaGFyc2V0ID0gbmV3IFByZWRlZmluZWRPcChbSVNPQWRvYmVDaGFyc2V0LCBFeHBlcnRDaGFyc2V0LCBFeHBlcnRTdWJzZXRDaGFyc2V0XSwgbmV3IENGRlBvaW50ZXIoQ0ZGQ3VzdG9tQ2hhcnNldCwge1xuICBsYXp5OiB0cnVlXG59KSk7XG52YXIgRkRSYW5nZTMgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmlyc3Q6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZmQ6IHJlc3RydWN0dXJlLnVpbnQ4XG59KTtcbnZhciBGRFJhbmdlNCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmaXJzdDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBmZDogcmVzdHJ1Y3R1cmUudWludDE2XG59KTtcbnZhciBGRFNlbGVjdCA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDgsIHtcbiAgMDoge1xuICAgIGZkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQucGFyZW50LkNoYXJTdHJpbmdzLmxlbmd0aDtcbiAgICB9KVxuICB9LFxuICAzOiB7XG4gICAgblJhbmdlczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHJhbmdlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEZEUmFuZ2UzLCAnblJhbmdlcycpLFxuICAgIHNlbnRpbmVsOiByZXN0cnVjdHVyZS51aW50MTZcbiAgfSxcbiAgNDoge1xuICAgIG5SYW5nZXM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICByYW5nZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShGRFJhbmdlNCwgJ25SYW5nZXMnKSxcbiAgICBzZW50aW5lbDogcmVzdHJ1Y3R1cmUudWludDMyXG4gIH1cbn0pO1xudmFyIHB0ciA9IG5ldyBDRkZQb2ludGVyKENGRlByaXZhdGVEaWN0KTtcblxudmFyIENGRlByaXZhdGVPcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENGRlByaXZhdGVPcCgpIHt9XG5cbiAgdmFyIF9wcm90bzQgPSBDRkZQcml2YXRlT3AucHJvdG90eXBlO1xuXG4gIF9wcm90bzQuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50LCBvcGVyYW5kcykge1xuICAgIHBhcmVudC5sZW5ndGggPSBvcGVyYW5kc1swXTtcbiAgICByZXR1cm4gcHRyLmRlY29kZShzdHJlYW0sIHBhcmVudCwgW29wZXJhbmRzWzFdXSk7XG4gIH07XG5cbiAgX3Byb3RvNC5zaXplID0gZnVuY3Rpb24gc2l6ZShkaWN0LCBjdHgpIHtcbiAgICByZXR1cm4gW0NGRlByaXZhdGVEaWN0LnNpemUoZGljdCwgY3R4LCBmYWxzZSksIHB0ci5zaXplKGRpY3QsIGN0eClbMF1dO1xuICB9O1xuXG4gIF9wcm90bzQuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0cmVhbSwgZGljdCwgY3R4KSB7XG4gICAgcmV0dXJuIFtDRkZQcml2YXRlRGljdC5zaXplKGRpY3QsIGN0eCwgZmFsc2UpLCBwdHIuZW5jb2RlKHN0cmVhbSwgZGljdCwgY3R4KVswXV07XG4gIH07XG5cbiAgcmV0dXJuIENGRlByaXZhdGVPcDtcbn0oKTtcblxudmFyIEZvbnREaWN0ID0gbmV3IENGRkRpY3QoWy8vIGtleSAgICAgICBuYW1lICAgICAgICAgICAgICAgICAgIHR5cGUocykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0XG5bMTgsICdQcml2YXRlJywgbmV3IENGRlByaXZhdGVPcCgpLCBudWxsXSwgW1sxMiwgMzhdLCAnRm9udE5hbWUnLCAnc2lkJywgbnVsbF1dKTtcbnZhciBDRkZUb3BEaWN0ID0gbmV3IENGRkRpY3QoWy8vIGtleSAgICAgICBuYW1lICAgICAgICAgICAgICAgICAgIHR5cGUocykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0XG5bWzEyLCAzMF0sICdST1MnLCBbJ3NpZCcsICdzaWQnLCAnbnVtYmVyJ10sIG51bGxdLCBbMCwgJ3ZlcnNpb24nLCAnc2lkJywgbnVsbF0sIFsxLCAnTm90aWNlJywgJ3NpZCcsIG51bGxdLCBbWzEyLCAwXSwgJ0NvcHlyaWdodCcsICdzaWQnLCBudWxsXSwgWzIsICdGdWxsTmFtZScsICdzaWQnLCBudWxsXSwgWzMsICdGYW1pbHlOYW1lJywgJ3NpZCcsIG51bGxdLCBbNCwgJ1dlaWdodCcsICdzaWQnLCBudWxsXSwgW1sxMiwgMV0sICdpc0ZpeGVkUGl0Y2gnLCAnYm9vbGVhbicsIGZhbHNlXSwgW1sxMiwgMl0sICdJdGFsaWNBbmdsZScsICdudW1iZXInLCAwXSwgW1sxMiwgM10sICdVbmRlcmxpbmVQb3NpdGlvbicsICdudW1iZXInLCAtMTAwXSwgW1sxMiwgNF0sICdVbmRlcmxpbmVUaGlja25lc3MnLCAnbnVtYmVyJywgNTBdLCBbWzEyLCA1XSwgJ1BhaW50VHlwZScsICdudW1iZXInLCAwXSwgW1sxMiwgNl0sICdDaGFyc3RyaW5nVHlwZScsICdudW1iZXInLCAyXSwgW1sxMiwgN10sICdGb250TWF0cml4JywgJ2FycmF5JywgWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF1dLCBbMTMsICdVbmlxdWVJRCcsICdudW1iZXInLCBudWxsXSwgWzUsICdGb250QkJveCcsICdhcnJheScsIFswLCAwLCAwLCAwXV0sIFtbMTIsIDhdLCAnU3Ryb2tlV2lkdGgnLCAnbnVtYmVyJywgMF0sIFsxNCwgJ1hVSUQnLCAnYXJyYXknLCBudWxsXSwgWzE1LCAnY2hhcnNldCcsIENGRkNoYXJzZXQsIElTT0Fkb2JlQ2hhcnNldF0sIFsxNiwgJ0VuY29kaW5nJywgQ0ZGRW5jb2RpbmcsIFN0YW5kYXJkRW5jb2RpbmddLCBbMTcsICdDaGFyU3RyaW5ncycsIG5ldyBDRkZQb2ludGVyKG5ldyBDRkZJbmRleCgpKSwgbnVsbF0sIFsxOCwgJ1ByaXZhdGUnLCBuZXcgQ0ZGUHJpdmF0ZU9wKCksIG51bGxdLCBbWzEyLCAyMF0sICdTeW50aGV0aWNCYXNlJywgJ251bWJlcicsIG51bGxdLCBbWzEyLCAyMV0sICdQb3N0U2NyaXB0JywgJ3NpZCcsIG51bGxdLCBbWzEyLCAyMl0sICdCYXNlRm9udE5hbWUnLCAnc2lkJywgbnVsbF0sIFtbMTIsIDIzXSwgJ0Jhc2VGb250QmxlbmQnLCAnZGVsdGEnLCBudWxsXSwgLy8gQ0lEIGZvbnQgc3BlY2lmaWNcbltbMTIsIDMxXSwgJ0NJREZvbnRWZXJzaW9uJywgJ251bWJlcicsIDBdLCBbWzEyLCAzMl0sICdDSURGb250UmV2aXNpb24nLCAnbnVtYmVyJywgMF0sIFtbMTIsIDMzXSwgJ0NJREZvbnRUeXBlJywgJ251bWJlcicsIDBdLCBbWzEyLCAzNF0sICdDSURDb3VudCcsICdudW1iZXInLCA4NzIwXSwgW1sxMiwgMzVdLCAnVUlEQmFzZScsICdudW1iZXInLCBudWxsXSwgW1sxMiwgMzddLCAnRkRTZWxlY3QnLCBuZXcgQ0ZGUG9pbnRlcihGRFNlbGVjdCksIG51bGxdLCBbWzEyLCAzNl0sICdGREFycmF5JywgbmV3IENGRlBvaW50ZXIobmV3IENGRkluZGV4KEZvbnREaWN0KSksIG51bGxdLCBbWzEyLCAzOF0sICdGb250TmFtZScsICdzaWQnLCBudWxsXV0pO1xudmFyIFZhcmlhdGlvblN0b3JlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBpdGVtVmFyaWF0aW9uU3RvcmU6IEl0ZW1WYXJpYXRpb25TdG9yZVxufSk7XG52YXIgQ0ZGMlRvcERpY3QgPSBuZXcgQ0ZGRGljdChbW1sxMiwgN10sICdGb250TWF0cml4JywgJ2FycmF5JywgWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF1dLCBbMTcsICdDaGFyU3RyaW5ncycsIG5ldyBDRkZQb2ludGVyKG5ldyBDRkZJbmRleCgpKSwgbnVsbF0sIFtbMTIsIDM3XSwgJ0ZEU2VsZWN0JywgbmV3IENGRlBvaW50ZXIoRkRTZWxlY3QpLCBudWxsXSwgW1sxMiwgMzZdLCAnRkRBcnJheScsIG5ldyBDRkZQb2ludGVyKG5ldyBDRkZJbmRleChGb250RGljdCkpLCBudWxsXSwgWzI0LCAndnN0b3JlJywgbmV3IENGRlBvaW50ZXIoVmFyaWF0aW9uU3RvcmUpLCBudWxsXSwgWzI1LCAnbWF4c3RhY2snLCAnbnVtYmVyJywgMTkzXV0pO1xudmFyIENGRlRvcCA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUuZml4ZWQxNiwge1xuICAxOiB7XG4gICAgaGRyU2l6ZTogcmVzdHJ1Y3R1cmUudWludDgsXG4gICAgb2ZmU2l6ZTogcmVzdHJ1Y3R1cmUudWludDgsXG4gICAgbmFtZUluZGV4OiBuZXcgQ0ZGSW5kZXgobmV3IHJlc3RydWN0dXJlLlN0cmluZygnbGVuZ3RoJykpLFxuICAgIHRvcERpY3RJbmRleDogbmV3IENGRkluZGV4KENGRlRvcERpY3QpLFxuICAgIHN0cmluZ0luZGV4OiBuZXcgQ0ZGSW5kZXgobmV3IHJlc3RydWN0dXJlLlN0cmluZygnbGVuZ3RoJykpLFxuICAgIGdsb2JhbFN1YnJJbmRleDogbmV3IENGRkluZGV4KClcbiAgfSxcbiAgMjoge1xuICAgIGhkclNpemU6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHRvcERpY3Q6IENGRjJUb3BEaWN0LFxuICAgIGdsb2JhbFN1YnJJbmRleDogbmV3IENGRkluZGV4KClcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxudmFyIENGRkZvbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDRkZGb250KHN0cmVhbSkge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuZGVjb2RlKCk7XG4gIH1cblxuICBDRkZGb250LmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0pIHtcbiAgICByZXR1cm4gbmV3IENGRkZvbnQoc3RyZWFtKTtcbiAgfTtcblxuICB2YXIgX3Byb3RvID0gQ0ZGRm9udC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZSgpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnN0cmVhbS5wb3M7XG4gICAgdmFyIHRvcCA9IENGRlRvcC5kZWNvZGUodGhpcy5zdHJlYW0pO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHRvcCkge1xuICAgICAgdmFyIHZhbCA9IHRvcFtrZXldO1xuICAgICAgdGhpc1trZXldID0gdmFsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZlcnNpb24gPCAyKSB7XG4gICAgICBpZiAodGhpcy50b3BEaWN0SW5kZXgubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9ubHkgYSBzaW5nbGUgZm9udCBpcyBhbGxvd2VkIGluIENGRlwiKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50b3BEaWN0ID0gdGhpcy50b3BEaWN0SW5kZXhbMF07XG4gICAgfVxuXG4gICAgdGhpcy5pc0NJREZvbnQgPSB0aGlzLnRvcERpY3QuUk9TICE9IG51bGw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLnN0cmluZyA9IGZ1bmN0aW9uIHN0cmluZyhzaWQpIHtcbiAgICBpZiAodGhpcy52ZXJzaW9uID49IDIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzaWQgPCBzdGFuZGFyZFN0cmluZ3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gc3RhbmRhcmRTdHJpbmdzW3NpZF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nSW5kZXhbc2lkIC0gc3RhbmRhcmRTdHJpbmdzLmxlbmd0aF07XG4gIH07XG5cbiAgX3Byb3RvLmdldENoYXJTdHJpbmcgPSBmdW5jdGlvbiBnZXRDaGFyU3RyaW5nKGdseXBoKSB7XG4gICAgdGhpcy5zdHJlYW0ucG9zID0gdGhpcy50b3BEaWN0LkNoYXJTdHJpbmdzW2dseXBoXS5vZmZzZXQ7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtLnJlYWRCdWZmZXIodGhpcy50b3BEaWN0LkNoYXJTdHJpbmdzW2dseXBoXS5sZW5ndGgpO1xuICB9O1xuXG4gIF9wcm90by5nZXRHbHlwaE5hbWUgPSBmdW5jdGlvbiBnZXRHbHlwaE5hbWUoZ2lkKSB7XG4gICAgLy8gQ0ZGMiBnbHlwaCBuYW1lcyBhcmUgaW4gdGhlIHBvc3QgdGFibGUuXG4gICAgaWYgKHRoaXMudmVyc2lvbiA+PSAyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIENJRC1rZXllZCBmb250cyBkb24ndCBoYXZlIGdseXBoIG5hbWVzXG5cblxuICAgIGlmICh0aGlzLmlzQ0lERm9udCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGNoYXJzZXQgPSB0aGlzLnRvcERpY3QuY2hhcnNldDtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGNoYXJzZXQpKSB7XG4gICAgICByZXR1cm4gY2hhcnNldFtnaWRdO1xuICAgIH1cblxuICAgIGlmIChnaWQgPT09IDApIHtcbiAgICAgIHJldHVybiAnLm5vdGRlZic7XG4gICAgfVxuXG4gICAgZ2lkIC09IDE7XG5cbiAgICBzd2l0Y2ggKGNoYXJzZXQudmVyc2lvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcoY2hhcnNldC5nbHlwaHNbZ2lkXSk7XG5cbiAgICAgIGNhc2UgMTpcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFyc2V0LnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciByYW5nZSA9IGNoYXJzZXQucmFuZ2VzW2ldO1xuXG4gICAgICAgICAgaWYgKHJhbmdlLm9mZnNldCA8PSBnaWQgJiYgZ2lkIDw9IHJhbmdlLm9mZnNldCArIHJhbmdlLm5MZWZ0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcocmFuZ2UuZmlyc3QgKyAoZ2lkIC0gcmFuZ2Uub2Zmc2V0KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX3Byb3RvLmZkRm9yR2x5cGggPSBmdW5jdGlvbiBmZEZvckdseXBoKGdpZCkge1xuICAgIGlmICghdGhpcy50b3BEaWN0LkZEU2VsZWN0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMudG9wRGljdC5GRFNlbGVjdC52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiB0aGlzLnRvcERpY3QuRkRTZWxlY3QuZmRzW2dpZF07XG5cbiAgICAgIGNhc2UgMzpcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgdmFyIHJhbmdlcyA9IHRoaXMudG9wRGljdC5GRFNlbGVjdC5yYW5nZXM7XG4gICAgICAgIHZhciBsb3cgPSAwO1xuICAgICAgICB2YXIgaGlnaCA9IHJhbmdlcy5sZW5ndGggLSAxO1xuXG4gICAgICAgIHdoaWxlIChsb3cgPD0gaGlnaCkge1xuICAgICAgICAgIHZhciBtaWQgPSBsb3cgKyBoaWdoID4+IDE7XG5cbiAgICAgICAgICBpZiAoZ2lkIDwgcmFuZ2VzW21pZF0uZmlyc3QpIHtcbiAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAobWlkIDwgaGlnaCAmJiBnaWQgPiByYW5nZXNbbWlkICsgMV0uZmlyc3QpIHtcbiAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByYW5nZXNbbWlkXS5mZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBGRFNlbGVjdCB2ZXJzaW9uOiBcIiArIHRoaXMudG9wRGljdC5GRFNlbGVjdC52ZXJzaW9uKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnByaXZhdGVEaWN0Rm9yR2x5cGggPSBmdW5jdGlvbiBwcml2YXRlRGljdEZvckdseXBoKGdpZCkge1xuICAgIGlmICh0aGlzLnRvcERpY3QuRkRTZWxlY3QpIHtcbiAgICAgIHZhciBmZCA9IHRoaXMuZmRGb3JHbHlwaChnaWQpO1xuXG4gICAgICBpZiAodGhpcy50b3BEaWN0LkZEQXJyYXlbZmRdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvcERpY3QuRkRBcnJheVtmZF0uUHJpdmF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmVyc2lvbiA8IDIpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvcERpY3QuUHJpdmF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b3BEaWN0LkZEQXJyYXlbMF0uUHJpdmF0ZTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MoQ0ZGRm9udCwgW3tcbiAgICBrZXk6IFwicG9zdHNjcmlwdE5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLnZlcnNpb24gPCAyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVJbmRleFswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZ1bGxOYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJpbmcodGhpcy50b3BEaWN0LkZ1bGxOYW1lKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZmFtaWx5TmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nKHRoaXMudG9wRGljdC5GYW1pbHlOYW1lKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ0ZGRm9udDtcbn0oKTtcblxudmFyIFZlcnRpY2FsT3JpZ2luID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGdseXBoSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdmVydE9yaWdpblk6IHJlc3RydWN0dXJlLmludDE2XG59KTtcbnZhciBWT1JHID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG1ham9yVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtaW5vclZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZGVmYXVsdFZlcnRPcmlnaW5ZOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgbnVtVmVydE9yaWdpbllNZXRyaWNzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1ldHJpY3M6IG5ldyByZXN0cnVjdHVyZS5BcnJheShWZXJ0aWNhbE9yaWdpbiwgJ251bVZlcnRPcmlnaW5ZTWV0cmljcycpXG59KTtcblxudmFyIEJpZ01ldHJpY3MgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgaGVpZ2h0OiByZXN0cnVjdHVyZS51aW50OCxcbiAgd2lkdGg6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBob3JpQmVhcmluZ1g6IHJlc3RydWN0dXJlLmludDgsXG4gIGhvcmlCZWFyaW5nWTogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgaG9yaUFkdmFuY2U6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICB2ZXJ0QmVhcmluZ1g6IHJlc3RydWN0dXJlLmludDgsXG4gIHZlcnRCZWFyaW5nWTogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgdmVydEFkdmFuY2U6IHJlc3RydWN0dXJlLnVpbnQ4XG59KTtcbnZhciBTbWFsbE1ldHJpY3MgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgaGVpZ2h0OiByZXN0cnVjdHVyZS51aW50OCxcbiAgd2lkdGg6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBiZWFyaW5nWDogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgYmVhcmluZ1k6IHJlc3RydWN0dXJlLmludDgsXG4gIGFkdmFuY2U6IHJlc3RydWN0dXJlLnVpbnQ4XG59KTtcbnZhciBFQkRUQ29tcG9uZW50ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHhPZmZzZXQ6IHJlc3RydWN0dXJlLmludDgsXG4gIHlPZmZzZXQ6IHJlc3RydWN0dXJlLmludDhcbn0pO1xuXG52YXIgQnl0ZUFsaWduZWQgPSBmdW5jdGlvbiBCeXRlQWxpZ25lZCgpIHt9O1xuXG52YXIgQml0QWxpZ25lZCA9IGZ1bmN0aW9uIEJpdEFsaWduZWQoKSB7fTtcblxudmFyIGdseXBoID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdCgndmVyc2lvbicsIHtcbiAgMToge1xuICAgIG1ldHJpY3M6IFNtYWxsTWV0cmljcyxcbiAgICBkYXRhOiBCeXRlQWxpZ25lZFxuICB9LFxuICAyOiB7XG4gICAgbWV0cmljczogU21hbGxNZXRyaWNzLFxuICAgIGRhdGE6IEJpdEFsaWduZWRcbiAgfSxcbiAgLy8gZm9ybWF0IDMgaXMgZGVwcmVjYXRlZFxuICAvLyBmb3JtYXQgNCBpcyBub3Qgc3VwcG9ydGVkIGJ5IE1pY3Jvc29mdFxuICA1OiB7XG4gICAgZGF0YTogQml0QWxpZ25lZFxuICB9LFxuICA2OiB7XG4gICAgbWV0cmljczogQmlnTWV0cmljcyxcbiAgICBkYXRhOiBCeXRlQWxpZ25lZFxuICB9LFxuICA3OiB7XG4gICAgbWV0cmljczogQmlnTWV0cmljcyxcbiAgICBkYXRhOiBCaXRBbGlnbmVkXG4gIH0sXG4gIDg6IHtcbiAgICBtZXRyaWNzOiBTbWFsbE1ldHJpY3MsXG4gICAgcGFkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDgpLFxuICAgIG51bUNvbXBvbmVudHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb21wb25lbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRUJEVENvbXBvbmVudCwgJ251bUNvbXBvbmVudHMnKVxuICB9LFxuICA5OiB7XG4gICAgbWV0cmljczogQmlnTWV0cmljcyxcbiAgICBwYWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50OCksXG4gICAgbnVtQ29tcG9uZW50czogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvbXBvbmVudHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShFQkRUQ29tcG9uZW50LCAnbnVtQ29tcG9uZW50cycpXG4gIH0sXG4gIDE3OiB7XG4gICAgbWV0cmljczogU21hbGxNZXRyaWNzLFxuICAgIGRhdGFMZW46IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBkYXRhOiBuZXcgcmVzdHJ1Y3R1cmUuQnVmZmVyKCdkYXRhTGVuJylcbiAgfSxcbiAgMTg6IHtcbiAgICBtZXRyaWNzOiBCaWdNZXRyaWNzLFxuICAgIGRhdGFMZW46IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBkYXRhOiBuZXcgcmVzdHJ1Y3R1cmUuQnVmZmVyKCdkYXRhTGVuJylcbiAgfSxcbiAgMTk6IHtcbiAgICBkYXRhTGVuOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZGF0YTogbmV3IHJlc3RydWN0dXJlLkJ1ZmZlcignZGF0YUxlbicpXG4gIH1cbn0pO1xuXG52YXIgU0JpdExpbmVNZXRyaWNzID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGFzY2VuZGVyOiByZXN0cnVjdHVyZS5pbnQ4LFxuICBkZXNjZW5kZXI6IHJlc3RydWN0dXJlLmludDgsXG4gIHdpZHRoTWF4OiByZXN0cnVjdHVyZS51aW50OCxcbiAgY2FyZXRTbG9wZU51bWVyYXRvcjogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgY2FyZXRTbG9wZURlbm9taW5hdG9yOiByZXN0cnVjdHVyZS5pbnQ4LFxuICBjYXJldE9mZnNldDogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgbWluT3JpZ2luU0I6IHJlc3RydWN0dXJlLmludDgsXG4gIG1pbkFkdmFuY2VTQjogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgbWF4QmVmb3JlQkw6IHJlc3RydWN0dXJlLmludDgsXG4gIG1pbkFmdGVyQkw6IHJlc3RydWN0dXJlLmludDgsXG4gIHBhZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLmludDgsIDIpXG59KTtcbnZhciBDb2RlT2Zmc2V0UGFpciA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBnbHlwaENvZGU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgb2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MTZcbn0pO1xudmFyIEluZGV4U3VidGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICBoZWFkZXI6IHtcbiAgICBpbWFnZUZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGltYWdlRGF0YU9mZnNldDogcmVzdHJ1Y3R1cmUudWludDMyXG4gIH0sXG4gIDE6IHtcbiAgICBvZmZzZXRBcnJheTogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQzMiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LnBhcmVudC5sYXN0R2x5cGhJbmRleCAtIHQucGFyZW50LmZpcnN0R2x5cGhJbmRleCArIDE7XG4gICAgfSlcbiAgfSxcbiAgMjoge1xuICAgIGltYWdlU2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGJpZ01ldHJpY3M6IEJpZ01ldHJpY3NcbiAgfSxcbiAgMzoge1xuICAgIG9mZnNldEFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQucGFyZW50Lmxhc3RHbHlwaEluZGV4IC0gdC5wYXJlbnQuZmlyc3RHbHlwaEluZGV4ICsgMTtcbiAgICB9KVxuICB9LFxuICA0OiB7XG4gICAgbnVtR2x5cGhzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZ2x5cGhBcnJheTogbmV3IHJlc3RydWN0dXJlLkFycmF5KENvZGVPZmZzZXRQYWlyLCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQubnVtR2x5cGhzICsgMTtcbiAgICB9KVxuICB9LFxuICA1OiB7XG4gICAgaW1hZ2VTaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgYmlnTWV0cmljczogQmlnTWV0cmljcyxcbiAgICBudW1HbHlwaHM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBnbHlwaENvZGVBcnJheTogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ251bUdseXBocycpXG4gIH1cbn0pO1xudmFyIEluZGV4U3VidGFibGVBcnJheSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmaXJzdEdseXBoSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbGFzdEdseXBoSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc3VidGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgSW5kZXhTdWJ0YWJsZSlcbn0pO1xudmFyIEJpdG1hcFNpemVUYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBpbmRleFN1YlRhYmxlQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KEluZGV4U3VidGFibGVBcnJheSwgMSksIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KSxcbiAgaW5kZXhUYWJsZXNTaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG51bWJlck9mSW5kZXhTdWJUYWJsZXM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgY29sb3JSZWY6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgaG9yaTogU0JpdExpbmVNZXRyaWNzLFxuICB2ZXJ0OiBTQml0TGluZU1ldHJpY3MsXG4gIHN0YXJ0R2x5cGhJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBlbmRHbHlwaEluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHBwZW1YOiByZXN0cnVjdHVyZS51aW50OCxcbiAgcHBlbVk6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBiaXREZXB0aDogcmVzdHJ1Y3R1cmUudWludDgsXG4gIGZsYWdzOiBuZXcgcmVzdHJ1Y3R1cmUuQml0ZmllbGQocmVzdHJ1Y3R1cmUudWludDgsIFsnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCddKVxufSk7XG52YXIgRUJMQyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIC8vIDB4MDAwMjAwMDBcbiAgbnVtU2l6ZXM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgc2l6ZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShCaXRtYXBTaXplVGFibGUsICdudW1TaXplcycpXG59KTtcblxudmFyIEltYWdlVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgcHBlbTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICByZXNvbHV0aW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGltYWdlT2Zmc2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgJ3ZvaWQnKSwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQucGFyZW50Lm1heHAubnVtR2x5cGhzICsgMTtcbiAgfSlcbn0pOyAvLyBUaGlzIGlzIHRoZSBBcHBsZSBzYml4IHRhYmxlLCB1c2VkIGJ5IHRoZSBcIkFwcGxlIENvbG9yIEVtb2ppXCIgZm9udC5cbi8vIEl0IGluY2x1ZGVzIHNldmVyYWwgaW1hZ2UgdGFibGVzIHdpdGggaW1hZ2VzIGZvciBlYWNoIGJpdG1hcCBnbHlwaFxuLy8gb2Ygc2V2ZXJhbCBkaWZmZXJlbnQgc2l6ZXMuXG5cbnZhciBzYml4ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZmxhZ3M6IG5ldyByZXN0cnVjdHVyZS5CaXRmaWVsZChyZXN0cnVjdHVyZS51aW50MTYsIFsncmVuZGVyT3V0bGluZXMnXSksXG4gIG51bUltZ1RhYmxlczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBpbWFnZVRhYmxlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgSW1hZ2VUYWJsZSksICdudW1JbWdUYWJsZXMnKVxufSk7XG5cbnZhciBMYXllclJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBnaWQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gR2x5cGggSUQgb2YgbGF5ZXIgZ2x5cGggKG11c3QgYmUgaW4gei1vcmRlciBmcm9tIGJvdHRvbSB0byB0b3ApLlxuICBwYWxldHRlSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNiAvLyBJbmRleCB2YWx1ZSB0byB1c2UgaW4gdGhlIGFwcHJvcHJpYXRlIHBhbGV0dGUuIFRoaXMgdmFsdWUgbXVzdFxuXG59KTsgLy8gYmUgbGVzcyB0aGFuIG51bVBhbGV0dGVFbnRyaWVzIGluIHRoZSBDUEFMIHRhYmxlLCBleGNlcHQgZm9yXG4vLyB0aGUgc3BlY2lhbCBjYXNlIG5vdGVkIGJlbG93LiBFYWNoIHBhbGV0dGUgZW50cnkgaXMgMTYgYml0cy5cbi8vIEEgcGFsZXR0ZSBpbmRleCBvZiAweEZGRkYgaXMgYSBzcGVjaWFsIGNhc2UgaW5kaWNhdGluZyB0aGF0XG4vLyB0aGUgdGV4dCBmb3JlZ3JvdW5kIGNvbG9yIHNob3VsZCBiZSB1c2VkLlxuXG52YXIgQmFzZUdseXBoUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGdpZDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBHbHlwaCBJRCBvZiByZWZlcmVuY2UgZ2x5cGguIFRoaXMgZ2x5cGggaXMgZm9yIHJlZmVyZW5jZSBvbmx5XG4gIC8vIGFuZCBpcyBub3QgcmVuZGVyZWQgZm9yIGNvbG9yLlxuICBmaXJzdExheWVySW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gSW5kZXggKGZyb20gYmVnaW5uaW5nIG9mIHRoZSBMYXllciBSZWNvcmRzKSB0byB0aGUgbGF5ZXIgcmVjb3JkLlxuICAvLyBUaGVyZSB3aWxsIGJlIG51bUxheWVycyBjb25zZWN1dGl2ZSBlbnRyaWVzIGZvciB0aGlzIGJhc2UgZ2x5cGguXG4gIG51bUxheWVyczogcmVzdHJ1Y3R1cmUudWludDE2XG59KTtcbnZhciBDT0xSID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbnVtQmFzZUdseXBoUmVjb3JkczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBiYXNlR2x5cGhSZWNvcmQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KEJhc2VHbHlwaFJlY29yZCwgJ251bUJhc2VHbHlwaFJlY29yZHMnKSksXG4gIGxheWVyUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTGF5ZXJSZWNvcmQsICdudW1MYXllclJlY29yZHMnKSwge1xuICAgIGxhenk6IHRydWVcbiAgfSksXG4gIG51bUxheWVyUmVjb3JkczogcmVzdHJ1Y3R1cmUudWludDE2XG59KTtcblxudmFyIENvbG9yUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGJsdWU6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBncmVlbjogcmVzdHJ1Y3R1cmUudWludDgsXG4gIHJlZDogcmVzdHJ1Y3R1cmUudWludDgsXG4gIGFscGhhOiByZXN0cnVjdHVyZS51aW50OFxufSk7XG52YXIgQ1BBTCA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIGhlYWRlcjoge1xuICAgIG51bVBhbGV0dGVFbnRyaWVzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbnVtUGFsZXR0ZXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBudW1Db2xvclJlY29yZHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb2xvclJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KENvbG9yUmVjb3JkLCAnbnVtQ29sb3JSZWNvcmRzJykpLFxuICAgIGNvbG9yUmVjb3JkSW5kaWNlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ251bVBhbGV0dGVzJylcbiAgfSxcbiAgMDoge30sXG4gIDE6IHtcbiAgICBvZmZzZXRQYWxldHRlVHlwZUFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MzIsICdudW1QYWxldHRlcycpKSxcbiAgICBvZmZzZXRQYWxldHRlTGFiZWxBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnbnVtUGFsZXR0ZXMnKSksXG4gICAgb2Zmc2V0UGFsZXR0ZUVudHJ5TGFiZWxBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnbnVtUGFsZXR0ZUVudHJpZXMnKSlcbiAgfVxufSk7XG5cbnZhciBCYXNlQ29vcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAxOiB7XG4gICAgLy8gRGVzaWduIHVuaXRzIG9ubHlcbiAgICBjb29yZGluYXRlOiByZXN0cnVjdHVyZS5pbnQxNiAvLyBYIG9yIFkgdmFsdWUsIGluIGRlc2lnbiB1bml0c1xuXG4gIH0sXG4gIDI6IHtcbiAgICAvLyBEZXNpZ24gdW5pdHMgcGx1cyBjb250b3VyIHBvaW50XG4gICAgY29vcmRpbmF0ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gWCBvciBZIHZhbHVlLCBpbiBkZXNpZ24gdW5pdHNcbiAgICByZWZlcmVuY2VHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIEdseXBoSUQgb2YgY29udHJvbCBnbHlwaFxuICAgIGJhc2VDb29yZFBvaW50OiByZXN0cnVjdHVyZS51aW50MTYgLy8gSW5kZXggb2YgY29udG91ciBwb2ludCBvbiB0aGUgcmVmZXJlbmNlR2x5cGhcblxuICB9LFxuICAzOiB7XG4gICAgLy8gRGVzaWduIHVuaXRzIHBsdXMgRGV2aWNlIHRhYmxlXG4gICAgY29vcmRpbmF0ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gWCBvciBZIHZhbHVlLCBpbiBkZXNpZ24gdW5pdHNcbiAgICBkZXZpY2VUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBEZXZpY2UpIC8vIERldmljZSB0YWJsZSBmb3IgWCBvciBZIHZhbHVlXG5cbiAgfVxufSk7XG52YXIgQmFzZVZhbHVlcyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBkZWZhdWx0SW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gSW5kZXggb2YgZGVmYXVsdCBiYXNlbGluZSBmb3IgdGhpcyBzY3JpcHQtc2FtZSBpbmRleCBpbiB0aGUgQmFzZVRhZ0xpc3RcbiAgYmFzZUNvb3JkQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgYmFzZUNvb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQmFzZUNvb3JkKSwgJ2Jhc2VDb29yZENvdW50Jylcbn0pO1xudmFyIEZlYXRNaW5NYXhSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICAvLyA0LWJ5dGUgZmVhdHVyZSBpZGVudGlmaWNhdGlvbiB0YWctbXVzdCBtYXRjaCBGZWF0dXJlVGFnIGluIEZlYXR1cmVMaXN0XG4gIG1pbkNvb3JkOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEJhc2VDb29yZCwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pLFxuICAvLyBNYXkgYmUgTlVMTFxuICBtYXhDb29yZDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBCYXNlQ29vcmQsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KSAvLyBNYXkgYmUgTlVMTFxuXG59KTtcbnZhciBNaW5NYXggPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbWluQ29vcmQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQmFzZUNvb3JkKSxcbiAgLy8gTWF5IGJlIE5VTExcbiAgbWF4Q29vcmQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQmFzZUNvb3JkKSxcbiAgLy8gTWF5IGJlIE5VTExcbiAgZmVhdE1pbk1heENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE1heSBiZSAwXG4gIGZlYXRNaW5NYXhSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRmVhdE1pbk1heFJlY29yZCwgJ2ZlYXRNaW5NYXhDb3VudCcpIC8vIEluIGFscGhhYmV0aWNhbCBvcmRlclxuXG59KTtcbnZhciBCYXNlTGFuZ1N5c1JlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIC8vIDQtYnl0ZSBsYW5ndWFnZSBzeXN0ZW0gaWRlbnRpZmljYXRpb24gdGFnXG4gIG1pbk1heDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBNaW5NYXgsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgQmFzZVNjcmlwdCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBiYXNlVmFsdWVzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEJhc2VWYWx1ZXMpLFxuICAvLyBNYXkgYmUgTlVMTFxuICBkZWZhdWx0TWluTWF4OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIE1pbk1heCksXG4gIC8vIE1heSBiZSBOVUxMXG4gIGJhc2VMYW5nU3lzQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTWF5IGJlIDBcbiAgYmFzZUxhbmdTeXNSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQmFzZUxhbmdTeXNSZWNvcmQsICdiYXNlTGFuZ1N5c0NvdW50JykgLy8gaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGJ5IEJhc2VMYW5nU3lzVGFnXG5cbn0pO1xudmFyIEJhc2VTY3JpcHRSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICAvLyA0LWJ5dGUgc2NyaXB0IGlkZW50aWZpY2F0aW9uIHRhZ1xuICBzY3JpcHQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQmFzZVNjcmlwdCwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBCYXNlU2NyaXB0TGlzdCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShCYXNlU2NyaXB0UmVjb3JkLCByZXN0cnVjdHVyZS51aW50MTYpOyAvLyBBcnJheSBvZiA0LWJ5dGUgYmFzZWxpbmUgaWRlbnRpZmljYXRpb24gdGFncy1tdXN0IGJlIGluIGFscGhhYmV0aWNhbCBvcmRlclxuXG52YXIgQmFzZVRhZ0xpc3QgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBBeGlzID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGJhc2VUYWdMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEJhc2VUYWdMaXN0KSxcbiAgLy8gTWF5IGJlIE5VTExcbiAgYmFzZVNjcmlwdExpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQmFzZVNjcmlwdExpc3QpXG59KTtcbnZhciBCQVNFID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MzIsIHtcbiAgaGVhZGVyOiB7XG4gICAgaG9yaXpBeGlzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEF4aXMpLFxuICAgIC8vIE1heSBiZSBOVUxMXG4gICAgdmVydEF4aXM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQXhpcykgLy8gTWF5IGJlIE5VTExcblxuICB9LFxuICAweDAwMDEwMDAwOiB7fSxcbiAgMHgwMDAxMDAwMToge1xuICAgIGl0ZW1WYXJpYXRpb25TdG9yZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBJdGVtVmFyaWF0aW9uU3RvcmUpXG4gIH1cbn0pO1xuXG52YXIgQXR0YWNoUG9pbnQgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIEF0dGFjaExpc3QgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICBnbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGF0dGFjaFBvaW50czogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQXR0YWNoUG9pbnQpLCAnZ2x5cGhDb3VudCcpXG59KTtcbnZhciBDYXJldFZhbHVlID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgMToge1xuICAgIC8vIERlc2lnbiB1bml0cyBvbmx5XG4gICAgY29vcmRpbmF0ZTogcmVzdHJ1Y3R1cmUuaW50MTZcbiAgfSxcbiAgMjoge1xuICAgIC8vIENvbnRvdXIgcG9pbnRcbiAgICBjYXJldFZhbHVlUG9pbnQ6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9LFxuICAzOiB7XG4gICAgLy8gRGVzaWduIHVuaXRzIHBsdXMgRGV2aWNlIHRhYmxlXG4gICAgY29vcmRpbmF0ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgZGV2aWNlVGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgRGV2aWNlKVxuICB9XG59KTtcbnZhciBMaWdHbHlwaCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENhcmV0VmFsdWUpLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIExpZ0NhcmV0TGlzdCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gIGxpZ0dseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbGlnR2x5cGhzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBMaWdHbHlwaCksICdsaWdHbHlwaENvdW50Jylcbn0pO1xudmFyIE1hcmtHbHlwaFNldHNEZWYgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbWFya1NldFRhYmxlRm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1hcmtTZXRDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgQ292ZXJhZ2UpLCAnbWFya1NldENvdW50Jylcbn0pO1xudmFyIEdERUYgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQzMiwge1xuICBoZWFkZXI6IHtcbiAgICBnbHlwaENsYXNzRGVmOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzRGVmKSxcbiAgICBhdHRhY2hMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEF0dGFjaExpc3QpLFxuICAgIGxpZ0NhcmV0TGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBMaWdDYXJldExpc3QpLFxuICAgIG1hcmtBdHRhY2hDbGFzc0RlZjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc0RlZilcbiAgfSxcbiAgMHgwMDAxMDAwMDoge30sXG4gIDB4MDAwMTAwMDI6IHtcbiAgICBtYXJrR2x5cGhTZXRzRGVmOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIE1hcmtHbHlwaFNldHNEZWYpXG4gIH0sXG4gIDB4MDAwMTAwMDM6IHtcbiAgICBtYXJrR2x5cGhTZXRzRGVmOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIE1hcmtHbHlwaFNldHNEZWYpLFxuICAgIGl0ZW1WYXJpYXRpb25TdG9yZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBJdGVtVmFyaWF0aW9uU3RvcmUpXG4gIH1cbn0pO1xuXG52YXIgVmFsdWVGb3JtYXQgPSBuZXcgcmVzdHJ1Y3R1cmUuQml0ZmllbGQocmVzdHJ1Y3R1cmUudWludDE2LCBbJ3hQbGFjZW1lbnQnLCAneVBsYWNlbWVudCcsICd4QWR2YW5jZScsICd5QWR2YW5jZScsICd4UGxhRGV2aWNlJywgJ3lQbGFEZXZpY2UnLCAneEFkdkRldmljZScsICd5QWR2RGV2aWNlJ10pO1xudmFyIHR5cGVzID0ge1xuICB4UGxhY2VtZW50OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgeVBsYWNlbWVudDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHhBZHZhbmNlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgeUFkdmFuY2U6IHJlc3RydWN0dXJlLmludDE2LFxuICB4UGxhRGV2aWNlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIERldmljZSwge1xuICAgIHR5cGU6ICdnbG9iYWwnLFxuICAgIHJlbGF0aXZlVG86ICdyZWwnXG4gIH0pLFxuICB5UGxhRGV2aWNlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIERldmljZSwge1xuICAgIHR5cGU6ICdnbG9iYWwnLFxuICAgIHJlbGF0aXZlVG86ICdyZWwnXG4gIH0pLFxuICB4QWR2RGV2aWNlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIERldmljZSwge1xuICAgIHR5cGU6ICdnbG9iYWwnLFxuICAgIHJlbGF0aXZlVG86ICdyZWwnXG4gIH0pLFxuICB5QWR2RGV2aWNlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIERldmljZSwge1xuICAgIHR5cGU6ICdnbG9iYWwnLFxuICAgIHJlbGF0aXZlVG86ICdyZWwnXG4gIH0pXG59O1xuXG52YXIgVmFsdWVSZWNvcmQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBWYWx1ZVJlY29yZChrZXkpIHtcbiAgICBpZiAoa2V5ID09PSB2b2lkIDApIHtcbiAgICAgIGtleSA9ICd2YWx1ZUZvcm1hdCc7XG4gICAgfVxuXG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gVmFsdWVSZWNvcmQucHJvdG90eXBlO1xuXG4gIF9wcm90by5idWlsZFN0cnVjdCA9IGZ1bmN0aW9uIGJ1aWxkU3RydWN0KHBhcmVudCkge1xuICAgIHZhciBzdHJ1Y3QgPSBwYXJlbnQ7XG5cbiAgICB3aGlsZSAoIXN0cnVjdFt0aGlzLmtleV0gJiYgc3RydWN0LnBhcmVudCkge1xuICAgICAgc3RydWN0ID0gc3RydWN0LnBhcmVudDtcbiAgICB9XG5cbiAgICBpZiAoIXN0cnVjdFt0aGlzLmtleV0pIHJldHVybjtcbiAgICB2YXIgZmllbGRzID0ge307XG5cbiAgICBmaWVsZHMucmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHN0cnVjdC5fc3RhcnRPZmZzZXQ7XG4gICAgfTtcblxuICAgIHZhciBmb3JtYXQgPSBzdHJ1Y3RbdGhpcy5rZXldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIGZvcm1hdCkge1xuICAgICAgaWYgKGZvcm1hdFtrZXldKSB7XG4gICAgICAgIGZpZWxkc1trZXldID0gdHlwZXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHJlc3RydWN0dXJlLlN0cnVjdChmaWVsZHMpO1xuICB9O1xuXG4gIF9wcm90by5zaXplID0gZnVuY3Rpb24gc2l6ZSh2YWwsIGN0eCkge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkU3RydWN0KGN0eCkuc2l6ZSh2YWwsIGN0eCk7XG4gIH07XG5cbiAgX3Byb3RvLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCkge1xuICAgIHZhciByZXMgPSB0aGlzLmJ1aWxkU3RydWN0KHBhcmVudCkuZGVjb2RlKHN0cmVhbSwgcGFyZW50KTtcbiAgICBkZWxldGUgcmVzLnJlbDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIHJldHVybiBWYWx1ZVJlY29yZDtcbn0oKTtcblxudmFyIFBhaXJWYWx1ZVJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBzZWNvbmRHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB2YWx1ZTE6IG5ldyBWYWx1ZVJlY29yZCgndmFsdWVGb3JtYXQxJyksXG4gIHZhbHVlMjogbmV3IFZhbHVlUmVjb3JkKCd2YWx1ZUZvcm1hdDInKVxufSk7XG52YXIgUGFpclNldCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShQYWlyVmFsdWVSZWNvcmQsIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgQ2xhc3MyUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZhbHVlMTogbmV3IFZhbHVlUmVjb3JkKCd2YWx1ZUZvcm1hdDEnKSxcbiAgdmFsdWUyOiBuZXcgVmFsdWVSZWNvcmQoJ3ZhbHVlRm9ybWF0MicpXG59KTtcbnZhciBBbmNob3IgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAxOiB7XG4gICAgLy8gRGVzaWduIHVuaXRzIG9ubHlcbiAgICB4Q29vcmRpbmF0ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgeUNvb3JkaW5hdGU6IHJlc3RydWN0dXJlLmludDE2XG4gIH0sXG4gIDI6IHtcbiAgICAvLyBEZXNpZ24gdW5pdHMgcGx1cyBjb250b3VyIHBvaW50XG4gICAgeENvb3JkaW5hdGU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHlDb29yZGluYXRlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICBhbmNob3JQb2ludDogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH0sXG4gIDM6IHtcbiAgICAvLyBEZXNpZ24gdW5pdHMgcGx1cyBEZXZpY2UgdGFibGVzXG4gICAgeENvb3JkaW5hdGU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHlDb29yZGluYXRlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB4RGV2aWNlVGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgRGV2aWNlKSxcbiAgICB5RGV2aWNlVGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgRGV2aWNlKVxuICB9XG59KTtcbnZhciBFbnRyeUV4aXRSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZW50cnlBbmNob3I6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQW5jaG9yLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSksXG4gIGV4aXRBbmNob3I6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQW5jaG9yLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIE1hcmtSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgXCJjbGFzc1wiOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1hcmtBbmNob3I6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQW5jaG9yLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIE1hcmtBcnJheSA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShNYXJrUmVjb3JkLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIEJhc2VSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBBbmNob3IpLCBmdW5jdGlvbiAodCkge1xuICByZXR1cm4gdC5wYXJlbnQuY2xhc3NDb3VudDtcbn0pO1xudmFyIEJhc2VBcnJheSA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShCYXNlUmVjb3JkLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIENvbXBvbmVudFJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEFuY2hvciksIGZ1bmN0aW9uICh0KSB7XG4gIHJldHVybiB0LnBhcmVudC5wYXJlbnQuY2xhc3NDb3VudDtcbn0pO1xudmFyIExpZ2F0dXJlQXR0YWNoID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KENvbXBvbmVudFJlY29yZCwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBMaWdhdHVyZUFycmF5ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTGlnYXR1cmVBdHRhY2gpLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIEdQT1NMb29rdXAgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KCdsb29rdXBUeXBlJywge1xuICAxOiBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAgIC8vIFNpbmdsZSBBZGp1c3RtZW50XG4gICAgMToge1xuICAgICAgLy8gU2luZ2xlIHBvc2l0aW9uaW5nIHZhbHVlXG4gICAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgICB2YWx1ZUZvcm1hdDogVmFsdWVGb3JtYXQsXG4gICAgICB2YWx1ZTogbmV3IFZhbHVlUmVjb3JkKClcbiAgICB9LFxuICAgIDI6IHtcbiAgICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICAgIHZhbHVlRm9ybWF0OiBWYWx1ZUZvcm1hdCxcbiAgICAgIHZhbHVlQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAgIHZhbHVlczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShuZXcgVmFsdWVSZWNvcmQoKSwgJ3ZhbHVlQ291bnQnKVxuICAgIH1cbiAgfSksXG4gIDI6IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gICAgLy8gUGFpciBBZGp1c3RtZW50IFBvc2l0aW9uaW5nXG4gICAgMToge1xuICAgICAgLy8gQWRqdXN0bWVudHMgZm9yIGdseXBoIHBhaXJzXG4gICAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgICB2YWx1ZUZvcm1hdDE6IFZhbHVlRm9ybWF0LFxuICAgICAgdmFsdWVGb3JtYXQyOiBWYWx1ZUZvcm1hdCxcbiAgICAgIHBhaXJTZXRDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgICAgcGFpclNldHM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBQYWlyU2V0KSwgJ3BhaXJTZXRDb3VudCcpXG4gICAgfSxcbiAgICAyOiB7XG4gICAgICAvLyBDbGFzcyBwYWlyIGFkanVzdG1lbnRcbiAgICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICAgIHZhbHVlRm9ybWF0MTogVmFsdWVGb3JtYXQsXG4gICAgICB2YWx1ZUZvcm1hdDI6IFZhbHVlRm9ybWF0LFxuICAgICAgY2xhc3NEZWYxOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzRGVmKSxcbiAgICAgIGNsYXNzRGVmMjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc0RlZiksXG4gICAgICBjbGFzczFDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgICAgY2xhc3MyQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAgIGNsYXNzUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KENsYXNzMlJlY29yZCwgJ2NsYXNzMkNvdW50JyksICdjbGFzczFDb3VudCcpXG4gICAgfVxuICB9KSxcbiAgMzoge1xuICAgIC8vIEN1cnNpdmUgQXR0YWNobWVudCBQb3NpdGlvbmluZ1xuICAgIGZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBlbnRyeUV4aXRDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGVudHJ5RXhpdFJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShFbnRyeUV4aXRSZWNvcmQsICdlbnRyeUV4aXRDb3VudCcpXG4gIH0sXG4gIDQ6IHtcbiAgICAvLyBNYXJrVG9CYXNlIEF0dGFjaG1lbnQgUG9zaXRpb25pbmdcbiAgICBmb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBtYXJrQ292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGJhc2VDb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgY2xhc3NDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG1hcmtBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBNYXJrQXJyYXkpLFxuICAgIGJhc2VBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBCYXNlQXJyYXkpXG4gIH0sXG4gIDU6IHtcbiAgICAvLyBNYXJrVG9MaWdhdHVyZSBBdHRhY2htZW50IFBvc2l0aW9uaW5nXG4gICAgZm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbWFya0NvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBsaWdhdHVyZUNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBjbGFzc0NvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbWFya0FycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIE1hcmtBcnJheSksXG4gICAgbGlnYXR1cmVBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBMaWdhdHVyZUFycmF5KVxuICB9LFxuICA2OiB7XG4gICAgLy8gTWFya1RvTWFyayBBdHRhY2htZW50IFBvc2l0aW9uaW5nXG4gICAgZm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbWFyazFDb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgbWFyazJDb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgY2xhc3NDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG1hcmsxQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTWFya0FycmF5KSxcbiAgICBtYXJrMkFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEJhc2VBcnJheSlcbiAgfSxcbiAgNzogQ29udGV4dCxcbiAgLy8gQ29udGV4dHVhbCBwb3NpdGlvbmluZ1xuICA4OiBDaGFpbmluZ0NvbnRleHQsXG4gIC8vIENoYWluaW5nIGNvbnRleHR1YWwgcG9zaXRpb25pbmdcbiAgOToge1xuICAgIC8vIEV4dGVuc2lvbiBQb3NpdGlvbmluZ1xuICAgIHBvc0Zvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGxvb2t1cFR5cGU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyBjYW5ub3QgYWxzbyBiZSA5XG4gICAgZXh0ZW5zaW9uOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEdQT1NMb29rdXApXG4gIH1cbn0pOyAvLyBGaXggY2lyY3VsYXIgcmVmZXJlbmNlXG5cbkdQT1NMb29rdXAudmVyc2lvbnNbOV0uZXh0ZW5zaW9uLnR5cGUgPSBHUE9TTG9va3VwO1xudmFyIEdQT1MgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQzMiwge1xuICBoZWFkZXI6IHtcbiAgICBzY3JpcHRMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFNjcmlwdExpc3QpLFxuICAgIGZlYXR1cmVMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEZlYXR1cmVMaXN0KSxcbiAgICBsb29rdXBMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIG5ldyBMb29rdXBMaXN0KEdQT1NMb29rdXApKVxuICB9LFxuICAweDAwMDEwMDAwOiB7fSxcbiAgMHgwMDAxMDAwMToge1xuICAgIGZlYXR1cmVWYXJpYXRpb25zOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEZlYXR1cmVWYXJpYXRpb25zKVxuICB9XG59KTsgLy8gZXhwb3J0IEdQT1NMb29rdXAgZm9yIEpTVEYgdGFibGVcblxudmFyIFNlcXVlbmNlID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBBbHRlcm5hdGVTZXQgPSBTZXF1ZW5jZTtcbnZhciBMaWdhdHVyZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBnbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBjb21wQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgY29tcG9uZW50czogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5jb21wQ291bnQgLSAxO1xuICB9KVxufSk7XG52YXIgTGlnYXR1cmVTZXQgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBMaWdhdHVyZSksIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgR1NVQkxvb2t1cCA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QoJ2xvb2t1cFR5cGUnLCB7XG4gIDE6IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gICAgLy8gU2luZ2xlIFN1YnN0aXR1dGlvblxuICAgIDE6IHtcbiAgICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICAgIGRlbHRhR2x5cGhJRDogcmVzdHJ1Y3R1cmUuaW50MTZcbiAgICB9LFxuICAgIDI6IHtcbiAgICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICAgIGdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAgIHN1YnN0aXR1dGU6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnZ2x5cGhDb3VudCcpXG4gICAgfVxuICB9KSxcbiAgMjoge1xuICAgIC8vIE11bHRpcGxlIFN1YnN0aXR1dGlvblxuICAgIHN1YnN0Rm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgc2VxdWVuY2VzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgU2VxdWVuY2UpLCAnY291bnQnKVxuICB9LFxuICAzOiB7XG4gICAgLy8gQWx0ZXJuYXRlIFN1YnN0aXR1dGlvblxuICAgIHN1YnN0Rm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgYWx0ZXJuYXRlU2V0OiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQWx0ZXJuYXRlU2V0KSwgJ2NvdW50JylcbiAgfSxcbiAgNDoge1xuICAgIC8vIExpZ2F0dXJlIFN1YnN0aXR1dGlvblxuICAgIHN1YnN0Rm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbGlnYXR1cmVTZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTGlnYXR1cmVTZXQpLCAnY291bnQnKVxuICB9LFxuICA1OiBDb250ZXh0LFxuICAvLyBDb250ZXh0dWFsIFN1YnN0aXR1dGlvblxuICA2OiBDaGFpbmluZ0NvbnRleHQsXG4gIC8vIENoYWluaW5nIENvbnRleHR1YWwgU3Vic3RpdHV0aW9uXG4gIDc6IHtcbiAgICAvLyBFeHRlbnNpb24gU3Vic3RpdHV0aW9uXG4gICAgc3Vic3RGb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBsb29rdXBUeXBlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gY2Fubm90IGFsc28gYmUgN1xuICAgIGV4dGVuc2lvbjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBHU1VCTG9va3VwKVxuICB9LFxuICA4OiB7XG4gICAgLy8gUmV2ZXJzZSBDaGFpbmluZyBDb250ZXh0dWFsIFNpbmdsZSBTdWJzdGl0dXRpb25cbiAgICBzdWJzdEZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBiYWNrdHJhY2tDb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLCAnYmFja3RyYWNrR2x5cGhDb3VudCcpLFxuICAgIGxvb2thaGVhZEdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBsb29rYWhlYWRDb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLCAnbG9va2FoZWFkR2x5cGhDb3VudCcpLFxuICAgIGdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBzdWJzdGl0dXRlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ2dseXBoQ291bnQnKVxuICB9XG59KTsgLy8gRml4IGNpcmN1bGFyIHJlZmVyZW5jZVxuXG5HU1VCTG9va3VwLnZlcnNpb25zWzddLmV4dGVuc2lvbi50eXBlID0gR1NVQkxvb2t1cDtcbnZhciBHU1VCID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MzIsIHtcbiAgaGVhZGVyOiB7XG4gICAgc2NyaXB0TGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBTY3JpcHRMaXN0KSxcbiAgICBmZWF0dXJlTGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBGZWF0dXJlTGlzdCksXG4gICAgbG9va3VwTGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBuZXcgTG9va3VwTGlzdChHU1VCTG9va3VwKSlcbiAgfSxcbiAgMHgwMDAxMDAwMDoge30sXG4gIDB4MDAwMTAwMDE6IHtcbiAgICBmZWF0dXJlVmFyaWF0aW9uczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBGZWF0dXJlVmFyaWF0aW9ucylcbiAgfVxufSk7XG5cbnZhciBKc3RmR1NVQk1vZExpc3QgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIEpzdGZQcmlvcml0eSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBzaHJpbmthZ2VFbmFibGVHU1VCOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZHU1VCTW9kTGlzdCksXG4gIHNocmlua2FnZURpc2FibGVHU1VCOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZHU1VCTW9kTGlzdCksXG4gIHNocmlua2FnZUVuYWJsZUdQT1M6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZkdTVUJNb2RMaXN0KSxcbiAgc2hyaW5rYWdlRGlzYWJsZUdQT1M6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZkdTVUJNb2RMaXN0KSxcbiAgc2hyaW5rYWdlSnN0Zk1heDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBuZXcgTG9va3VwTGlzdChHUE9TTG9va3VwKSksXG4gIGV4dGVuc2lvbkVuYWJsZUdTVUI6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZkdTVUJNb2RMaXN0KSxcbiAgZXh0ZW5zaW9uRGlzYWJsZUdTVUI6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZkdTVUJNb2RMaXN0KSxcbiAgZXh0ZW5zaW9uRW5hYmxlR1BPUzogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmR1NVQk1vZExpc3QpLFxuICBleHRlbnNpb25EaXNhYmxlR1BPUzogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmR1NVQk1vZExpc3QpLFxuICBleHRlbnNpb25Kc3RmTWF4OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIG5ldyBMb29rdXBMaXN0KEdQT1NMb29rdXApKVxufSk7XG52YXIgSnN0ZkxhbmdTeXMgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmUHJpb3JpdHkpLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIEpzdGZMYW5nU3lzUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAganN0ZkxhbmdTeXM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZkxhbmdTeXMpXG59KTtcbnZhciBKc3RmU2NyaXB0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGV4dGVuZGVyR2x5cGhzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIHJlc3RydWN0dXJlLnVpbnQxNikpLFxuICAvLyBhcnJheSBvZiBnbHlwaHMgdG8gZXh0ZW5kIGxpbmUgbGVuZ3RoXG4gIGRlZmF1bHRMYW5nU3lzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZMYW5nU3lzKSxcbiAgbGFuZ1N5c0NvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxhbmdTeXNSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoSnN0ZkxhbmdTeXNSZWNvcmQsICdsYW5nU3lzQ291bnQnKVxufSk7XG52YXIgSnN0ZlNjcmlwdFJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIHNjcmlwdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmU2NyaXB0LCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIEpTVEYgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAvLyBzaG91bGQgYmUgMHgwMDAxMDAwMFxuICBzY3JpcHRDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzY3JpcHRMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoSnN0ZlNjcmlwdFJlY29yZCwgJ3NjcmlwdENvdW50Jylcbn0pO1xuXG52YXIgVmFyaWFibGVTaXplTnVtYmVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVmFyaWFibGVTaXplTnVtYmVyKHNpemUpIHtcbiAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBWYXJpYWJsZVNpemVOdW1iZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICBzd2l0Y2ggKHRoaXMuc2l6ZSgwLCBwYXJlbnQpKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBzdHJlYW0ucmVhZFVJbnQ4KCk7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkVUludDE2QkUoKTtcblxuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWRVSW50MjRCRSgpO1xuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiBzdHJlYW0ucmVhZFVJbnQzMkJFKCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5zaXplID0gZnVuY3Rpb24gc2l6ZSh2YWwsIHBhcmVudCkge1xuICAgIHJldHVybiB1dGlsc18xKHRoaXMuX3NpemUsIG51bGwsIHBhcmVudCk7XG4gIH07XG5cbiAgcmV0dXJuIFZhcmlhYmxlU2l6ZU51bWJlcjtcbn0oKTtcblxudmFyIE1hcERhdGFFbnRyeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBlbnRyeTogbmV3IFZhcmlhYmxlU2l6ZU51bWJlcihmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiAoKHQucGFyZW50LmVudHJ5Rm9ybWF0ICYgMHgwMDMwKSA+PiA0KSArIDE7XG4gIH0pLFxuICBvdXRlckluZGV4OiBmdW5jdGlvbiBvdXRlckluZGV4KHQpIHtcbiAgICByZXR1cm4gdC5lbnRyeSA+PiAodC5wYXJlbnQuZW50cnlGb3JtYXQgJiAweDAwMEYpICsgMTtcbiAgfSxcbiAgaW5uZXJJbmRleDogZnVuY3Rpb24gaW5uZXJJbmRleCh0KSB7XG4gICAgcmV0dXJuIHQuZW50cnkgJiAoMSA8PCAodC5wYXJlbnQuZW50cnlGb3JtYXQgJiAweDAwMEYpICsgMSkgLSAxO1xuICB9XG59KTtcbnZhciBEZWx0YVNldEluZGV4TWFwID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGVudHJ5Rm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1hcENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1hcERhdGE6IG5ldyByZXN0cnVjdHVyZS5BcnJheShNYXBEYXRhRW50cnksICdtYXBDb3VudCcpXG59KTtcbnZhciBIVkFSID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG1ham9yVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtaW5vclZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgaXRlbVZhcmlhdGlvblN0b3JlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEl0ZW1WYXJpYXRpb25TdG9yZSksXG4gIGFkdmFuY2VXaWR0aE1hcHBpbmc6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgRGVsdGFTZXRJbmRleE1hcCksXG4gIExTQk1hcHBpbmc6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgRGVsdGFTZXRJbmRleE1hcCksXG4gIFJTQk1hcHBpbmc6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgRGVsdGFTZXRJbmRleE1hcClcbn0pO1xuXG52YXIgU2lnbmF0dXJlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgb2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MzJcbn0pO1xudmFyIFNpZ25hdHVyZUJsb2NrID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2LCAyKSxcbiAgY2JTaWduYXR1cmU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgLy8gTGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIFBLQ1MjNyBwYWNrZXQgaW4gcGJTaWduYXR1cmVcbiAgc2lnbmF0dXJlOiBuZXcgcmVzdHJ1Y3R1cmUuQnVmZmVyKCdjYlNpZ25hdHVyZScpXG59KTtcbnZhciBEU0lHID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHVsVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGUgRFNJRyB0YWJsZSAoMHgwMDAwMDAwMSlcbiAgdXNOdW1TaWdzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE51bWJlciBvZiBzaWduYXR1cmVzIGluIHRoZSB0YWJsZVxuICB1c0ZsYWc6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gUGVybWlzc2lvbiBmbGFnc1xuICBzaWduYXR1cmVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoU2lnbmF0dXJlLCAndXNOdW1TaWdzJyksXG4gIHNpZ25hdHVyZUJsb2NrczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFNpZ25hdHVyZUJsb2NrLCAndXNOdW1TaWdzJylcbn0pO1xuXG52YXIgR2FzcFJhbmdlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHJhbmdlTWF4UFBFTTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBVcHBlciBsaW1pdCBvZiByYW5nZSwgaW4gcHBlbVxuICByYW5nZUdhc3BCZWhhdmlvcjogbmV3IHJlc3RydWN0dXJlLkJpdGZpZWxkKHJlc3RydWN0dXJlLnVpbnQxNiwgWy8vIEZsYWdzIGRlc2NyaWJpbmcgZGVzaXJlZCByYXN0ZXJpemVyIGJlaGF2aW9yXG4gICdncmF5c2NhbGUnLCAnZ3JpZGZpdCcsICdzeW1tZXRyaWNTbW9vdGhpbmcnLCAnc3ltbWV0cmljR3JpZGZpdCcgLy8gb25seSBpbiB2ZXJzaW9uIDEsIGZvciBDbGVhclR5cGVcbiAgXSlcbn0pO1xudmFyIGdhc3AgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBzZXQgdG8gMFxuICBudW1SYW5nZXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZ2FzcFJhbmdlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEdhc3BSYW5nZSwgJ251bVJhbmdlcycpIC8vIFNvcnRlZCBieSBwcGVtXG5cbn0pO1xuXG52YXIgRGV2aWNlUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHBpeGVsU2l6ZTogcmVzdHJ1Y3R1cmUudWludDgsXG4gIG1heGltdW1XaWR0aDogcmVzdHJ1Y3R1cmUudWludDgsXG4gIHdpZHRoczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5wYXJlbnQubWF4cC5udW1HbHlwaHM7XG4gIH0pXG59KTsgLy8gVGhlIEhvcml6b250YWwgRGV2aWNlIE1ldHJpY3MgdGFibGUgc3RvcmVzIGludGVnZXIgYWR2YW5jZSB3aWR0aHMgc2NhbGVkIHRvIHBhcnRpY3VsYXIgcGl4ZWwgc2l6ZXNcblxudmFyIGhkbXggPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBudW1SZWNvcmRzOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgc2l6ZURldmljZVJlY29yZDogcmVzdHJ1Y3R1cmUuaW50MzIsXG4gIHJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShEZXZpY2VSZWNvcmQsICdudW1SZWNvcmRzJylcbn0pO1xuXG52YXIgS2VyblBhaXIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbGVmdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICByaWdodDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB2YWx1ZTogcmVzdHJ1Y3R1cmUuaW50MTZcbn0pO1xudmFyIENsYXNzVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmlyc3RHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBuR2x5cGhzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG9mZnNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICduR2x5cGhzJyksXG4gIG1heDogZnVuY3Rpb24gbWF4KHQpIHtcbiAgICByZXR1cm4gdC5vZmZzZXRzLmxlbmd0aCAmJiBNYXRoLm1heC5hcHBseShNYXRoLCB0Lm9mZnNldHMpO1xuICB9XG59KTtcbnZhciBLZXJuMkFycmF5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG9mZjogZnVuY3Rpb24gb2ZmKHQpIHtcbiAgICByZXR1cm4gdC5fc3RhcnRPZmZzZXQgLSB0LnBhcmVudC5wYXJlbnQuX3N0YXJ0T2Zmc2V0O1xuICB9LFxuICBsZW46IGZ1bmN0aW9uIGxlbih0KSB7XG4gICAgcmV0dXJuICgodC5wYXJlbnQubGVmdFRhYmxlLm1heCAtIHQub2ZmKSAvIHQucGFyZW50LnJvd1dpZHRoICsgMSkgKiAodC5wYXJlbnQucm93V2lkdGggLyAyKTtcbiAgfSxcbiAgdmFsdWVzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLmludDE2LCAnbGVuJylcbn0pO1xudmFyIEtlcm5TdWJ0YWJsZSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QoJ2Zvcm1hdCcsIHtcbiAgMDoge1xuICAgIG5QYWlyczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHNlYXJjaFJhbmdlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZW50cnlTZWxlY3RvcjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHJhbmdlU2hpZnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBwYWlyczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEtlcm5QYWlyLCAnblBhaXJzJylcbiAgfSxcbiAgMjoge1xuICAgIHJvd1dpZHRoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbGVmdFRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzVGFibGUsIHtcbiAgICAgIHR5cGU6ICdwYXJlbnQnXG4gICAgfSksXG4gICAgcmlnaHRUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc1RhYmxlLCB7XG4gICAgICB0eXBlOiAncGFyZW50J1xuICAgIH0pLFxuICAgIGFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEtlcm4yQXJyYXksIHtcbiAgICAgIHR5cGU6ICdwYXJlbnQnXG4gICAgfSlcbiAgfSxcbiAgMzoge1xuICAgIGdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBrZXJuVmFsdWVDb3VudDogcmVzdHJ1Y3R1cmUudWludDgsXG4gICAgbGVmdENsYXNzQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAgIHJpZ2h0Q2xhc3NDb3VudDogcmVzdHJ1Y3R1cmUudWludDgsXG4gICAgZmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAgIGtlcm5WYWx1ZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLmludDE2LCAna2VyblZhbHVlQ291bnQnKSxcbiAgICBsZWZ0Q2xhc3M6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgJ2dseXBoQ291bnQnKSxcbiAgICByaWdodENsYXNzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsICdnbHlwaENvdW50JyksXG4gICAga2VybkluZGV4OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5sZWZ0Q2xhc3NDb3VudCAqIHQucmlnaHRDbGFzc0NvdW50O1xuICAgIH0pXG4gIH1cbn0pO1xudmFyIEtlcm5UYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QoJ3ZlcnNpb24nLCB7XG4gIDA6IHtcbiAgICAvLyBNaWNyb3NvZnQgdXNlcyB0aGlzIGZvcm1hdFxuICAgIHN1YlZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyBNaWNyb3NvZnQgaGFzIGFuIGV4dHJhIHN1Yi10YWJsZSB2ZXJzaW9uIG51bWJlclxuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIExlbmd0aCBvZiB0aGUgc3VidGFibGUsIGluIGJ5dGVzXG4gICAgZm9ybWF0OiByZXN0cnVjdHVyZS51aW50OCxcbiAgICAvLyBGb3JtYXQgb2Ygc3VidGFibGVcbiAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLkJpdGZpZWxkKHJlc3RydWN0dXJlLnVpbnQ4LCBbJ2hvcml6b250YWwnLCAvLyAxIGlmIHRhYmxlIGhhcyBob3Jpem9udGFsIGRhdGEsIDAgaWYgdmVydGljYWxcbiAgICAnbWluaW11bScsIC8vIElmIHNldCB0byAxLCB0aGUgdGFibGUgaGFzIG1pbmltdW0gdmFsdWVzLiBJZiBzZXQgdG8gMCwgdGhlIHRhYmxlIGhhcyBrZXJuaW5nIHZhbHVlcy5cbiAgICAnY3Jvc3NTdHJlYW0nLCAvLyBJZiBzZXQgdG8gMSwga2VybmluZyBpcyBwZXJwZW5kaWN1bGFyIHRvIHRoZSBmbG93IG9mIHRoZSB0ZXh0XG4gICAgJ292ZXJyaWRlJyAvLyBJZiBzZXQgdG8gMSB0aGUgdmFsdWUgaW4gdGhpcyB0YWJsZSByZXBsYWNlcyB0aGUgYWNjdW11bGF0ZWQgdmFsdWVcbiAgICBdKSxcbiAgICBzdWJ0YWJsZTogS2VyblN1YnRhYmxlLFxuICAgIHBhZGRpbmc6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50OCwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0Lmxlbmd0aCAtIHQuX2N1cnJlbnRPZmZzZXQ7XG4gICAgfSlcbiAgfSxcbiAgMToge1xuICAgIC8vIEFwcGxlIHVzZXMgdGhpcyBmb3JtYXRcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLkJpdGZpZWxkKHJlc3RydWN0dXJlLnVpbnQ4LCBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgJ3ZhcmlhdGlvbicsIC8vIFNldCBpZiB0YWJsZSBoYXMgdmFyaWF0aW9uIGtlcm5pbmcgdmFsdWVzXG4gICAgJ2Nyb3NzU3RyZWFtJywgLy8gU2V0IGlmIHRhYmxlIGhhcyBjcm9zcy1zdHJlYW0ga2VybmluZyB2YWx1ZXNcbiAgICAndmVydGljYWwnIC8vIFNldCBpZiB0YWJsZSBoYXMgdmVydGljYWwga2VybmluZyB2YWx1ZXNcbiAgICBdKSxcbiAgICBmb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAgIHR1cGxlSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBzdWJ0YWJsZTogS2VyblN1YnRhYmxlLFxuICAgIHBhZGRpbmc6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50OCwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0Lmxlbmd0aCAtIHQuX2N1cnJlbnRPZmZzZXQ7XG4gICAgfSlcbiAgfVxufSk7XG52YXIga2VybiA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIDA6IHtcbiAgICAvLyBNaWNyb3NvZnQgVmVyc2lvblxuICAgIG5UYWJsZXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICB0YWJsZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShLZXJuVGFibGUsICduVGFibGVzJylcbiAgfSxcbiAgMToge1xuICAgIC8vIEFwcGxlIFZlcnNpb25cbiAgICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gICAgLy8gdGhlIG90aGVyIGhhbGYgb2YgdGhlIHZlcnNpb24gbnVtYmVyXG4gICAgblRhYmxlczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIHRhYmxlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEtlcm5UYWJsZSwgJ25UYWJsZXMnKVxuICB9XG59KTtcblxuLy8gUmVjb3JkcyB0aGUgcHBlbSBmb3IgZWFjaCBnbHlwaCBhdCB3aGljaCB0aGUgc2NhbGluZyBiZWNvbWVzIGxpbmVhciBhZ2Fpbixcbi8vIGRlc3BpdGUgaW5zdHJ1Y3Rpb25zIGVmZmVjdGluZyB0aGUgYWR2YW5jZSB3aWR0aFxuXG52YXIgTFRTSCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG51bUdseXBoczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB5UGVsczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCAnbnVtR2x5cGhzJylcbn0pO1xuXG4vLyBOT1RFOiBUaGUgUENMVCB0YWJsZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCBmb3IgT3BlblR5cGUgZm9udHMgd2l0aCBUcnVlVHlwZSBvdXRsaW5lc1xuXG52YXIgUENMVCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGZvbnROdW1iZXI6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgcGl0Y2g6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgeEhlaWdodDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzdHlsZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB0eXBlRmFtaWx5OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGNhcEhlaWdodDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzeW1ib2xTZXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdHlwZWZhY2U6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoMTYpLFxuICBjaGFyYWN0ZXJDb21wbGVtZW50OiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDgpLFxuICBmaWxlTmFtZTogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg2KSxcbiAgc3Ryb2tlV2VpZ2h0OiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDEpLFxuICB3aWR0aFR5cGU6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoMSksXG4gIHNlcmlmU3R5bGU6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQ4KVxufSk7XG5cbi8vIHNpemVzLiBUaGlzIGlzIG5lZWRlZCBpbiBvcmRlciB0byBtYXRjaCBmb250IG1ldHJpY3Mgb24gV2luZG93cy5cblxudmFyIFJhdGlvID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGJDaGFyU2V0OiByZXN0cnVjdHVyZS51aW50OCxcbiAgLy8gQ2hhcmFjdGVyIHNldFxuICB4UmF0aW86IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAvLyBWYWx1ZSB0byB1c2UgZm9yIHgtUmF0aW9cbiAgeVN0YXJ0UmF0aW86IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAvLyBTdGFydGluZyB5LVJhdGlvIHZhbHVlXG4gIHlFbmRSYXRpbzogcmVzdHJ1Y3R1cmUudWludDggLy8gRW5kaW5nIHktUmF0aW8gdmFsdWVcblxufSk7XG52YXIgdlRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHlQZWxIZWlnaHQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8geVBlbEhlaWdodCB0byB3aGljaCB2YWx1ZXMgYXBwbHlcbiAgeU1heDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIE1heGltdW0gdmFsdWUgKGluIHBlbHMpIGZvciB0aGlzIHlQZWxIZWlnaHRcbiAgeU1pbjogcmVzdHJ1Y3R1cmUuaW50MTYgLy8gTWluaW11bSB2YWx1ZSAoaW4gcGVscykgZm9yIHRoaXMgeVBlbEhlaWdodFxuXG59KTtcbnZhciBWZG14R3JvdXAgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgcmVjczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBOdW1iZXIgb2YgaGVpZ2h0IHJlY29yZHMgaW4gdGhpcyBncm91cFxuICBzdGFydHN6OiByZXN0cnVjdHVyZS51aW50OCxcbiAgLy8gU3RhcnRpbmcgeVBlbEhlaWdodFxuICBlbmRzejogcmVzdHJ1Y3R1cmUudWludDgsXG4gIC8vIEVuZGluZyB5UGVsSGVpZ2h0XG4gIGVudHJpZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheSh2VGFibGUsICdyZWNzJykgLy8gVGhlIFZETVggcmVjb3Jkc1xuXG59KTtcbnZhciBWRE1YID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gVmVyc2lvbiBudW1iZXIgKDAgb3IgMSlcbiAgbnVtUmVjczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBOdW1iZXIgb2YgVkRNWCBncm91cHMgcHJlc2VudFxuICBudW1SYXRpb3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTnVtYmVyIG9mIGFzcGVjdCByYXRpbyBncm91cGluZ3NcbiAgcmF0aW9SYW5nZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShSYXRpbywgJ251bVJhdGlvcycpLFxuICAvLyBSYXRpbyByYW5nZXNcbiAgb2Zmc2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ251bVJhdGlvcycpLFxuICAvLyBPZmZzZXQgdG8gdGhlIFZETVggZ3JvdXAgZm9yIHRoaXMgcmF0aW8gcmFuZ2VcbiAgZ3JvdXBzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoVmRteEdyb3VwLCAnbnVtUmVjcycpIC8vIFRoZSBhY3R1YWwgVkRNWCBncm91cGluZ3NcblxufSk7XG5cbnZhciB2aGVhID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gVmVyc2lvbiBudW1iZXIgb2YgdGhlIFZlcnRpY2FsIEhlYWRlciBUYWJsZVxuICBhc2NlbnQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBUaGUgdmVydGljYWwgdHlwb2dyYXBoaWMgYXNjZW5kZXIgZm9yIHRoaXMgZm9udFxuICBkZXNjZW50OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gVGhlIHZlcnRpY2FsIHR5cG9ncmFwaGljIGRlc2NlbmRlciBmb3IgdGhpcyBmb250XG4gIGxpbmVHYXA6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBUaGUgdmVydGljYWwgdHlwb2dyYXBoaWMgbGluZSBnYXAgZm9yIHRoaXMgZm9udFxuICBhZHZhbmNlSGVpZ2h0TWF4OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gVGhlIG1heGltdW0gYWR2YW5jZSBoZWlnaHQgbWVhc3VyZW1lbnQgZm91bmQgaW4gdGhlIGZvbnRcbiAgbWluVG9wU2lkZUJlYXJpbmc6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBUaGUgbWluaW11bSB0b3Agc2lkZSBiZWFyaW5nIG1lYXN1cmVtZW50IGZvdW5kIGluIHRoZSBmb250XG4gIG1pbkJvdHRvbVNpZGVCZWFyaW5nOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gVGhlIG1pbmltdW0gYm90dG9tIHNpZGUgYmVhcmluZyBtZWFzdXJlbWVudCBmb3VuZCBpbiB0aGUgZm9udFxuICB5TWF4RXh0ZW50OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgY2FyZXRTbG9wZVJpc2U6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBDYXJldCBzbG9wZSAocmlzZS9ydW4pXG4gIGNhcmV0U2xvcGVSdW46IHJlc3RydWN0dXJlLmludDE2LFxuICBjYXJldE9mZnNldDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIFNldCB2YWx1ZSBlcXVhbCB0byAwIGZvciBub25zbGFudGVkIGZvbnRzXG4gIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUuaW50MTYsIDQpLFxuICBtZXRyaWNEYXRhRm9ybWF0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gU2V0IHRvIDBcbiAgbnVtYmVyT2ZNZXRyaWNzOiByZXN0cnVjdHVyZS51aW50MTYgLy8gTnVtYmVyIG9mIGFkdmFuY2UgaGVpZ2h0cyBpbiB0aGUgVmVydGljYWwgTWV0cmljcyB0YWJsZVxuXG59KTtcblxudmFyIFZtdHhFbnRyeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBhZHZhbmNlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIFRoZSBhZHZhbmNlIGhlaWdodCBvZiB0aGUgZ2x5cGhcbiAgYmVhcmluZzogcmVzdHJ1Y3R1cmUuaW50MTYgLy8gVGhlIHRvcCBzaWRlYmVhcmluZyBvZiB0aGUgZ2x5cGhcblxufSk7IC8vIFZlcnRpY2FsIE1ldHJpY3MgVGFibGVcblxudmFyIHZtdHggPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbWV0cmljczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShWbXR4RW50cnksIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LnZoZWEubnVtYmVyT2ZNZXRyaWNzO1xuICB9KSxcbiAgYmVhcmluZ3M6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUuaW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50Lm1heHAubnVtR2x5cGhzIC0gdC5wYXJlbnQudmhlYS5udW1iZXJPZk1ldHJpY3M7XG4gIH0pXG59KTtcblxudmFyIHNob3J0RnJhYyA9IG5ldyByZXN0cnVjdHVyZS5GaXhlZCgxNiwgJ0JFJywgMTQpO1xudmFyIENvcnJlc3BvbmRlbmNlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZyb21Db29yZDogc2hvcnRGcmFjLFxuICB0b0Nvb3JkOiBzaG9ydEZyYWNcbn0pO1xudmFyIFNlZ21lbnQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgcGFpckNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGNvcnJlc3BvbmRlbmNlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQ29ycmVzcG9uZGVuY2UsICdwYWlyQ291bnQnKVxufSk7XG52YXIgYXZhciA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBheGlzQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgc2VnbWVudDogbmV3IHJlc3RydWN0dXJlLkFycmF5KFNlZ21lbnQsICdheGlzQ291bnQnKVxufSk7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJDIoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBVbmJvdW5kZWRBcnJheUFjY2Vzc29yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVW5ib3VuZGVkQXJyYXlBY2Nlc3Nvcih0eXBlLCBzdHJlYW0sIHBhcmVudCkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5iYXNlID0gdGhpcy5zdHJlYW0ucG9zO1xuICAgIHRoaXMuX2l0ZW1zID0gW107XG4gIH1cblxuICB2YXIgX3Byb3RvID0gVW5ib3VuZGVkQXJyYXlBY2Nlc3Nvci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmdldEl0ZW0gPSBmdW5jdGlvbiBnZXRJdGVtKGluZGV4KSB7XG4gICAgaWYgKHRoaXMuX2l0ZW1zW2luZGV4XSA9PSBudWxsKSB7XG4gICAgICB2YXIgcG9zID0gdGhpcy5zdHJlYW0ucG9zO1xuICAgICAgdGhpcy5zdHJlYW0ucG9zID0gdGhpcy5iYXNlICsgdGhpcy50eXBlLnNpemUobnVsbCwgdGhpcy5wYXJlbnQpICogaW5kZXg7XG4gICAgICB0aGlzLl9pdGVtc1tpbmRleF0gPSB0aGlzLnR5cGUuZGVjb2RlKHRoaXMuc3RyZWFtLCB0aGlzLnBhcmVudCk7XG4gICAgICB0aGlzLnN0cmVhbS5wb3MgPSBwb3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zW2luZGV4XTtcbiAgfTtcblxuICBfcHJvdG8uaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gICAgcmV0dXJuIFwiW1VuYm91bmRlZEFycmF5IFwiICsgdGhpcy50eXBlLmNvbnN0cnVjdG9yLm5hbWUgKyBcIl1cIjtcbiAgfTtcblxuICByZXR1cm4gVW5ib3VuZGVkQXJyYXlBY2Nlc3Nvcjtcbn0oKTtcblxudmFyIFVuYm91bmRlZEFycmF5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfciRBcnJheSkge1xuICBfaW5oZXJpdHNMb29zZSQyKFVuYm91bmRlZEFycmF5LCBfciRBcnJheSk7XG5cbiAgZnVuY3Rpb24gVW5ib3VuZGVkQXJyYXkodHlwZSkge1xuICAgIHJldHVybiBfciRBcnJheS5jYWxsKHRoaXMsIHR5cGUsIDApIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvMiA9IFVuYm91bmRlZEFycmF5LnByb3RvdHlwZTtcblxuICBfcHJvdG8yLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCkge1xuICAgIHJldHVybiBuZXcgVW5ib3VuZGVkQXJyYXlBY2Nlc3Nvcih0aGlzLnR5cGUsIHN0cmVhbSwgcGFyZW50KTtcbiAgfTtcblxuICByZXR1cm4gVW5ib3VuZGVkQXJyYXk7XG59KHJlc3RydWN0dXJlLkFycmF5KTtcbnZhciBMb29rdXBUYWJsZSA9IGZ1bmN0aW9uIExvb2t1cFRhYmxlKFZhbHVlVHlwZSkge1xuICBpZiAoVmFsdWVUeXBlID09PSB2b2lkIDApIHtcbiAgICBWYWx1ZVR5cGUgPSByZXN0cnVjdHVyZS51aW50MTY7XG4gIH1cblxuICAvLyBIZWxwZXIgY2xhc3MgdGhhdCBtYWtlcyBpbnRlcm5hbCBzdHJ1Y3R1cmVzIGludmlzaWJsZSB0byBwb2ludGVyc1xuICB2YXIgU2hhZG93ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaGFkb3codHlwZSkge1xuICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgX3Byb3RvMyA9IFNoYWRvdy5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8zLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIGN0eCkge1xuICAgICAgY3R4ID0gY3R4LnBhcmVudC5wYXJlbnQ7XG4gICAgICByZXR1cm4gdGhpcy50eXBlLmRlY29kZShzdHJlYW0sIGN0eCk7XG4gICAgfTtcblxuICAgIF9wcm90bzMuc2l6ZSA9IGZ1bmN0aW9uIHNpemUodmFsLCBjdHgpIHtcbiAgICAgIGN0eCA9IGN0eC5wYXJlbnQucGFyZW50O1xuICAgICAgcmV0dXJuIHRoaXMudHlwZS5zaXplKHZhbCwgY3R4KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvMy5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyZWFtLCB2YWwsIGN0eCkge1xuICAgICAgY3R4ID0gY3R4LnBhcmVudC5wYXJlbnQ7XG4gICAgICByZXR1cm4gdGhpcy50eXBlLmVuY29kZShzdHJlYW0sIHZhbCwgY3R4KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFNoYWRvdztcbiAgfSgpO1xuXG4gIFZhbHVlVHlwZSA9IG5ldyBTaGFkb3coVmFsdWVUeXBlKTtcbiAgdmFyIEJpbmFyeVNlYXJjaEhlYWRlciA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICAgIHVuaXRTaXplOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgblVuaXRzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgc2VhcmNoUmFuZ2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBlbnRyeVNlbGVjdG9yOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgcmFuZ2VTaGlmdDogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH0pO1xuICB2YXIgTG9va3VwU2VnbWVudFNpbmdsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICAgIGxhc3RHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGZpcnN0R2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICB2YWx1ZTogVmFsdWVUeXBlXG4gIH0pO1xuICB2YXIgTG9va3VwU2VnbWVudEFycmF5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gICAgbGFzdEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZmlyc3RHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHZhbHVlczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoVmFsdWVUeXBlLCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQubGFzdEdseXBoIC0gdC5maXJzdEdseXBoICsgMTtcbiAgICB9KSwge1xuICAgICAgdHlwZTogJ3BhcmVudCdcbiAgICB9KVxuICB9KTtcbiAgdmFyIExvb2t1cFNpbmdsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICAgIGdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgdmFsdWU6IFZhbHVlVHlwZVxuICB9KTtcbiAgcmV0dXJuIG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gICAgMDoge1xuICAgICAgdmFsdWVzOiBuZXcgVW5ib3VuZGVkQXJyYXkoVmFsdWVUeXBlKSAvLyBsZW5ndGggPT0gbnVtYmVyIG9mIGdseXBocyBtYXliZT9cblxuICAgIH0sXG4gICAgMjoge1xuICAgICAgYmluYXJ5U2VhcmNoSGVhZGVyOiBCaW5hcnlTZWFyY2hIZWFkZXIsXG4gICAgICBzZWdtZW50czogbmV3IHJlc3RydWN0dXJlLkFycmF5KExvb2t1cFNlZ21lbnRTaW5nbGUsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmJpbmFyeVNlYXJjaEhlYWRlci5uVW5pdHM7XG4gICAgICB9KVxuICAgIH0sXG4gICAgNDoge1xuICAgICAgYmluYXJ5U2VhcmNoSGVhZGVyOiBCaW5hcnlTZWFyY2hIZWFkZXIsXG4gICAgICBzZWdtZW50czogbmV3IHJlc3RydWN0dXJlLkFycmF5KExvb2t1cFNlZ21lbnRBcnJheSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuYmluYXJ5U2VhcmNoSGVhZGVyLm5Vbml0cztcbiAgICAgIH0pXG4gICAgfSxcbiAgICA2OiB7XG4gICAgICBiaW5hcnlTZWFyY2hIZWFkZXI6IEJpbmFyeVNlYXJjaEhlYWRlcixcbiAgICAgIHNlZ21lbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTG9va3VwU2luZ2xlLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5iaW5hcnlTZWFyY2hIZWFkZXIublVuaXRzO1xuICAgICAgfSlcbiAgICB9LFxuICAgIDg6IHtcbiAgICAgIGZpcnN0R2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAgIGNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgICB2YWx1ZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShWYWx1ZVR5cGUsICdjb3VudCcpXG4gICAgfVxuICB9KTtcbn07XG5mdW5jdGlvbiBTdGF0ZVRhYmxlKGVudHJ5RGF0YSwgbG9va3VwVHlwZSkge1xuICBpZiAoZW50cnlEYXRhID09PSB2b2lkIDApIHtcbiAgICBlbnRyeURhdGEgPSB7fTtcbiAgfVxuXG4gIGlmIChsb29rdXBUeXBlID09PSB2b2lkIDApIHtcbiAgICBsb29rdXBUeXBlID0gcmVzdHJ1Y3R1cmUudWludDE2O1xuICB9XG5cbiAgdmFyIGVudHJ5ID0gT2JqZWN0LmFzc2lnbih7XG4gICAgbmV3U3RhdGU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBmbGFnczogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH0sIGVudHJ5RGF0YSk7XG4gIHZhciBFbnRyeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3QoZW50cnkpO1xuICB2YXIgU3RhdGVBcnJheSA9IG5ldyBVbmJvdW5kZWRBcnJheShuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0Lm5DbGFzc2VzO1xuICB9KSk7XG4gIHZhciBTdGF0ZUhlYWRlciA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICAgIG5DbGFzc2VzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgY2xhc3NUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgTG9va3VwVGFibGUobG9va3VwVHlwZSkpLFxuICAgIHN0YXRlQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgU3RhdGVBcnJheSksXG4gICAgZW50cnlUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgVW5ib3VuZGVkQXJyYXkoRW50cnkpKVxuICB9KTtcbiAgcmV0dXJuIFN0YXRlSGVhZGVyO1xufSAvLyBUaGlzIGlzIHRoZSBvbGQgdmVyc2lvbiBvZiB0aGUgU3RhdGVUYWJsZSBzdHJ1Y3R1cmVcblxuZnVuY3Rpb24gU3RhdGVUYWJsZTEoZW50cnlEYXRhLCBsb29rdXBUeXBlKSB7XG4gIGlmIChlbnRyeURhdGEgPT09IHZvaWQgMCkge1xuICAgIGVudHJ5RGF0YSA9IHt9O1xuICB9XG5cbiAgaWYgKGxvb2t1cFR5cGUgPT09IHZvaWQgMCkge1xuICAgIGxvb2t1cFR5cGUgPSByZXN0cnVjdHVyZS51aW50MTY7XG4gIH1cblxuICB2YXIgQ2xhc3NMb29rdXBUYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICAgIHZlcnNpb246IGZ1bmN0aW9uIHZlcnNpb24oKSB7XG4gICAgICByZXR1cm4gODtcbiAgICB9LFxuICAgIC8vIHNpbXVsYXRlIExvb2t1cFRhYmxlXG4gICAgZmlyc3RHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHZhbHVlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCByZXN0cnVjdHVyZS51aW50MTYpXG4gIH0pO1xuICB2YXIgZW50cnkgPSBPYmplY3QuYXNzaWduKHtcbiAgICBuZXdTdGF0ZU9mZnNldDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIGNvbnZlcnQgb2Zmc2V0IHRvIHN0YXRlQXJyYXkgaW5kZXhcbiAgICBuZXdTdGF0ZTogZnVuY3Rpb24gbmV3U3RhdGUodCkge1xuICAgICAgcmV0dXJuICh0Lm5ld1N0YXRlT2Zmc2V0IC0gKHQucGFyZW50LnN0YXRlQXJyYXkuYmFzZSAtIHQucGFyZW50Ll9zdGFydE9mZnNldCkpIC8gdC5wYXJlbnQubkNsYXNzZXM7XG4gICAgfSxcbiAgICBmbGFnczogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH0sIGVudHJ5RGF0YSk7XG4gIHZhciBFbnRyeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3QoZW50cnkpO1xuICB2YXIgU3RhdGVBcnJheSA9IG5ldyBVbmJvdW5kZWRBcnJheShuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQubkNsYXNzZXM7XG4gIH0pKTtcbiAgdmFyIFN0YXRlSGVhZGVyMSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICAgIG5DbGFzc2VzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY2xhc3NUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc0xvb2t1cFRhYmxlKSxcbiAgICBzdGF0ZUFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFN0YXRlQXJyYXkpLFxuICAgIGVudHJ5VGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgbmV3IFVuYm91bmRlZEFycmF5KEVudHJ5KSlcbiAgfSk7XG4gIHJldHVybiBTdGF0ZUhlYWRlcjE7XG59XG5cbnZhciBCc2xuU3VidGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KCdmb3JtYXQnLCB7XG4gIDA6IHtcbiAgICAvLyBEaXN0YW5jZS1iYXNlZCwgbm8gbWFwcGluZ1xuICAgIGRlbHRhczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLmludDE2LCAzMilcbiAgfSxcbiAgMToge1xuICAgIC8vIERpc3RhbmNlLWJhc2VkLCB3aXRoIG1hcHBpbmdcbiAgICBkZWx0YXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS5pbnQxNiwgMzIpLFxuICAgIG1hcHBpbmdEYXRhOiBuZXcgTG9va3VwVGFibGUocmVzdHJ1Y3R1cmUudWludDE2KVxuICB9LFxuICAyOiB7XG4gICAgLy8gQ29udHJvbCBwb2ludC1iYXNlZCwgbm8gbWFwcGluZ1xuICAgIHN0YW5kYXJkR2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb250cm9sUG9pbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAzMilcbiAgfSxcbiAgMzoge1xuICAgIC8vIENvbnRyb2wgcG9pbnQtYmFzZWQsIHdpdGggbWFwcGluZ1xuICAgIHN0YW5kYXJkR2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb250cm9sUG9pbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAzMiksXG4gICAgbWFwcGluZ0RhdGE6IG5ldyBMb29rdXBUYWJsZShyZXN0cnVjdHVyZS51aW50MTYpXG4gIH1cbn0pO1xudmFyIGJzbG4gPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgZm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGRlZmF1bHRCYXNlbGluZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzdWJ0YWJsZTogQnNsblN1YnRhYmxlXG59KTtcblxudmFyIFNldHRpbmcgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgc2V0dGluZzogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBuYW1lSW5kZXg6IHJlc3RydWN0dXJlLmludDE2LFxuICBuYW1lOiBmdW5jdGlvbiBuYW1lKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQucGFyZW50LnBhcmVudC5uYW1lLnJlY29yZHMuZm9udEZlYXR1cmVzW3QubmFtZUluZGV4XTtcbiAgfVxufSk7XG52YXIgRmVhdHVyZU5hbWUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmVhdHVyZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBuU2V0dGluZ3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc2V0dGluZ1RhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyByZXN0cnVjdHVyZS5BcnJheShTZXR0aW5nLCAnblNldHRpbmdzJyksIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KSxcbiAgZmVhdHVyZUZsYWdzOiBuZXcgcmVzdHJ1Y3R1cmUuQml0ZmllbGQocmVzdHJ1Y3R1cmUudWludDgsIFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAnaGFzRGVmYXVsdCcsICdleGNsdXNpdmUnXSksXG4gIGRlZmF1bHRTZXR0aW5nOiByZXN0cnVjdHVyZS51aW50OCxcbiAgbmFtZUluZGV4OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgbmFtZTogZnVuY3Rpb24gbmFtZSh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LnBhcmVudC5uYW1lLnJlY29yZHMuZm9udEZlYXR1cmVzW3QubmFtZUluZGV4XTtcbiAgfVxufSk7XG52YXIgZmVhdCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBmZWF0dXJlTmFtZUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHJlc2VydmVkMTogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gIHJlc2VydmVkMjogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQzMiksXG4gIGZlYXR1cmVOYW1lczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEZlYXR1cmVOYW1lLCAnZmVhdHVyZU5hbWVDb3VudCcpXG59KTtcblxudmFyIEF4aXMkMSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBheGlzVGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICBtaW5WYWx1ZTogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgZGVmYXVsdFZhbHVlOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBtYXhWYWx1ZTogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgZmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbmFtZUlEOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG5hbWU6IGZ1bmN0aW9uIG5hbWUodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5wYXJlbnQubmFtZS5yZWNvcmRzLmZvbnRGZWF0dXJlc1t0Lm5hbWVJRF07XG4gIH1cbn0pO1xudmFyIEluc3RhbmNlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG5hbWVJRDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBuYW1lOiBmdW5jdGlvbiBuYW1lKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQucGFyZW50Lm5hbWUucmVjb3Jkcy5mb250RmVhdHVyZXNbdC5uYW1lSURdO1xuICB9LFxuICBmbGFnczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBjb29yZDogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLmZpeGVkMzIsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LmF4aXNDb3VudDtcbiAgfSksXG4gIHBvc3RzY3JpcHROYW1lSUQ6IG5ldyByZXN0cnVjdHVyZS5PcHRpb25hbChyZXN0cnVjdHVyZS51aW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50Lmluc3RhbmNlU2l6ZSAtIHQuX2N1cnJlbnRPZmZzZXQgPiAwO1xuICB9KVxufSk7XG52YXIgZnZhciA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBvZmZzZXRUb0RhdGE6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgY291bnRTaXplUGFpcnM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgYXhpc0NvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGF4aXNTaXplOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGluc3RhbmNlQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgaW5zdGFuY2VTaXplOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGF4aXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShBeGlzJDEsICdheGlzQ291bnQnKSxcbiAgaW5zdGFuY2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShJbnN0YW5jZSwgJ2luc3RhbmNlQ291bnQnKVxufSk7XG5cbnZhciBzaG9ydEZyYWMkMSA9IG5ldyByZXN0cnVjdHVyZS5GaXhlZCgxNiwgJ0JFJywgMTQpO1xuXG52YXIgT2Zmc2V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gT2Zmc2V0KCkge31cblxuICBPZmZzZXQuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgLy8gSW4gc2hvcnQgZm9ybWF0LCBvZmZzZXRzIGFyZSBtdWx0aXBsaWVkIGJ5IDIuXG4gICAgLy8gVGhpcyBkb2Vzbid0IHNlZW0gdG8gYmUgZG9jdW1lbnRlZCBieSBBcHBsZSwgYnV0IGl0XG4gICAgLy8gaXMgaW1wbGVtZW50ZWQgdGhpcyB3YXkgaW4gRnJlZXR5cGUuXG4gICAgcmV0dXJuIHBhcmVudC5mbGFncyA/IHN0cmVhbS5yZWFkVUludDMyQkUoKSA6IHN0cmVhbS5yZWFkVUludDE2QkUoKSAqIDI7XG4gIH07XG5cbiAgcmV0dXJuIE9mZnNldDtcbn0oKTtcblxudmFyIGd2YXIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gIGF4aXNDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBnbG9iYWxDb29yZENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGdsb2JhbENvb3JkczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLkFycmF5KHNob3J0RnJhYyQxLCAnYXhpc0NvdW50JyksICdnbG9iYWxDb29yZENvdW50JykpLFxuICBnbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGZsYWdzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG9mZnNldFRvRGF0YTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBvZmZzZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIoT2Zmc2V0LCAndm9pZCcsIHtcbiAgICByZWxhdGl2ZVRvOiAnb2Zmc2V0VG9EYXRhJyxcbiAgICBhbGxvd051bGw6IGZhbHNlXG4gIH0pLCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LmdseXBoQ291bnQgKyAxO1xuICB9KVxufSk7XG5cbnZhciBDbGFzc1RhYmxlJDEgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGNvdmVyYWdlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHN1YkZlYXR1cmVGbGFnczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBzdGF0ZVRhYmxlOiBuZXcgU3RhdGVUYWJsZTEoKVxufSk7XG52YXIgV2lkdGhEZWx0YVJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBqdXN0Q2xhc3M6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgYmVmb3JlR3Jvd0xpbWl0OiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBiZWZvcmVTaHJpbmtMaW1pdDogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgYWZ0ZXJHcm93TGltaXQ6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIGFmdGVyU2hyaW5rTGltaXQ6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIGdyb3dGbGFnczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzaHJpbmtGbGFnczogcmVzdHJ1Y3R1cmUudWludDE2XG59KTtcbnZhciBXaWR0aERlbHRhQ2x1c3RlciA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShXaWR0aERlbHRhUmVjb3JkLCByZXN0cnVjdHVyZS51aW50MzIpO1xudmFyIEFjdGlvbkRhdGEgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KCdhY3Rpb25UeXBlJywge1xuICAwOiB7XG4gICAgLy8gRGVjb21wb3NpdGlvbiBhY3Rpb25cbiAgICBsb3dlckxpbWl0OiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICAgIHVwcGVyTGltaXQ6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gICAgb3JkZXI6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBnbHlwaHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIHJlc3RydWN0dXJlLnVpbnQxNilcbiAgfSxcbiAgMToge1xuICAgIC8vIFVuY29uZGl0aW9uYWwgYWRkIGdseXBoIGFjdGlvblxuICAgIGFkZEdseXBoOiByZXN0cnVjdHVyZS51aW50MTZcbiAgfSxcbiAgMjoge1xuICAgIC8vIENvbmRpdGlvbmFsIGFkZCBnbHlwaCBhY3Rpb25cbiAgICBzdWJzdFRocmVzaG9sZDogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgICBhZGRHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHN1YnN0R2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9LFxuICAzOiB7fSxcbiAgLy8gU3RyZXRjaCBnbHlwaCBhY3Rpb24gKG5vIGRhdGEsIG5vdCBzdXBwb3J0ZWQgYnkgQ29yZVRleHQpXG4gIDQ6IHtcbiAgICAvLyBEdWN0aWxlIGdseXBoIGFjdGlvbiAobm90IHN1cHBvcnRlZCBieSBDb3JlVGV4dClcbiAgICB2YXJpYXRpb25BeGlzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgbWluaW11bUxpbWl0OiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICAgIG5vU3RyZXRjaFZhbHVlOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICAgIG1heGltdW1MaW1pdDogcmVzdHJ1Y3R1cmUuZml4ZWQzMlxuICB9LFxuICA1OiB7XG4gICAgLy8gUmVwZWF0ZWQgYWRkIGdseXBoIGFjdGlvblxuICAgIGZsYWdzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZ2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9XG59KTtcbnZhciBBY3Rpb24gPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYWN0aW9uQ2xhc3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgYWN0aW9uVHlwZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBhY3Rpb25MZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgYWN0aW9uRGF0YTogQWN0aW9uRGF0YSxcbiAgcGFkZGluZzogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQ4LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LmFjdGlvbkxlbmd0aCAtIHQuX2N1cnJlbnRPZmZzZXQ7XG4gIH0pXG59KTtcbnZhciBQb3N0Y29tcGVuc2F0aW9uQWN0aW9uID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KEFjdGlvbiwgcmVzdHJ1Y3R1cmUudWludDMyKTtcbnZhciBQb3N0Q29tcGVuc2F0aW9uVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbG9va3VwVGFibGU6IG5ldyBMb29rdXBUYWJsZShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFBvc3Rjb21wZW5zYXRpb25BY3Rpb24pKVxufSk7XG52YXIgSnVzdGlmaWNhdGlvblRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGNsYXNzVGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NUYWJsZSQxLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSksXG4gIHdkY09mZnNldDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBwb3N0Q29tcGVuc2F0aW9uVGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgUG9zdENvbXBlbnNhdGlvblRhYmxlLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSksXG4gIHdpZHRoRGVsdGFDbHVzdGVyczogbmV3IExvb2t1cFRhYmxlKG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgV2lkdGhEZWx0YUNsdXN0ZXIsIHtcbiAgICB0eXBlOiAncGFyZW50JyxcbiAgICByZWxhdGl2ZVRvOiAnd2RjT2Zmc2V0J1xuICB9KSlcbn0pO1xudmFyIGp1c3QgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBmb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgaG9yaXpvbnRhbDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKdXN0aWZpY2F0aW9uVGFibGUpLFxuICB2ZXJ0aWNhbDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKdXN0aWZpY2F0aW9uVGFibGUpXG59KTtcblxudmFyIExpZ2F0dXJlRGF0YSA9IHtcbiAgYWN0aW9uOiByZXN0cnVjdHVyZS51aW50MTZcbn07XG52YXIgQ29udGV4dHVhbERhdGEgPSB7XG4gIG1hcmtJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBjdXJyZW50SW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNlxufTtcbnZhciBJbnNlcnRpb25EYXRhID0ge1xuICBjdXJyZW50SW5zZXJ0SW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWFya2VkSW5zZXJ0SW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNlxufTtcbnZhciBTdWJzdGl0dXRpb25UYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBpdGVtczogbmV3IFVuYm91bmRlZEFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IExvb2t1cFRhYmxlKCkpKVxufSk7XG52YXIgU3VidGFibGVEYXRhID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdCgndHlwZScsIHtcbiAgMDoge1xuICAgIC8vIEluZGljIFJlYXJyYW5nZW1lbnQgU3VidGFibGVcbiAgICBzdGF0ZVRhYmxlOiBuZXcgU3RhdGVUYWJsZSgpXG4gIH0sXG4gIDE6IHtcbiAgICAvLyBDb250ZXh0dWFsIEdseXBoIFN1YnN0aXR1dGlvbiBTdWJ0YWJsZVxuICAgIHN0YXRlVGFibGU6IG5ldyBTdGF0ZVRhYmxlKENvbnRleHR1YWxEYXRhKSxcbiAgICBzdWJzdGl0dXRpb25UYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBTdWJzdGl0dXRpb25UYWJsZSlcbiAgfSxcbiAgMjoge1xuICAgIC8vIExpZ2F0dXJlIHN1YnRhYmxlXG4gICAgc3RhdGVUYWJsZTogbmV3IFN0YXRlVGFibGUoTGlnYXR1cmVEYXRhKSxcbiAgICBsaWdhdHVyZUFjdGlvbnM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IFVuYm91bmRlZEFycmF5KHJlc3RydWN0dXJlLnVpbnQzMikpLFxuICAgIGNvbXBvbmVudHM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IFVuYm91bmRlZEFycmF5KHJlc3RydWN0dXJlLnVpbnQxNikpLFxuICAgIGxpZ2F0dXJlTGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgVW5ib3VuZGVkQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2KSlcbiAgfSxcbiAgNDoge1xuICAgIC8vIE5vbi1jb250ZXh0dWFsIEdseXBoIFN1YnN0aXR1dGlvbiBTdWJ0YWJsZVxuICAgIGxvb2t1cFRhYmxlOiBuZXcgTG9va3VwVGFibGUoKVxuICB9LFxuICA1OiB7XG4gICAgLy8gR2x5cGggSW5zZXJ0aW9uIFN1YnRhYmxlXG4gICAgc3RhdGVUYWJsZTogbmV3IFN0YXRlVGFibGUoSW5zZXJ0aW9uRGF0YSksXG4gICAgaW5zZXJ0aW9uQWN0aW9uczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgVW5ib3VuZGVkQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2KSlcbiAgfVxufSk7XG52YXIgU3VidGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGNvdmVyYWdlOiByZXN0cnVjdHVyZS51aW50MjQsXG4gIHR5cGU6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBzdWJGZWF0dXJlRmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgdGFibGU6IFN1YnRhYmxlRGF0YSxcbiAgcGFkZGluZzogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQ4LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0Lmxlbmd0aCAtIHQuX2N1cnJlbnRPZmZzZXQ7XG4gIH0pXG59KTtcbnZhciBGZWF0dXJlRW50cnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmVhdHVyZVR5cGU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZmVhdHVyZVNldHRpbmc6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZW5hYmxlRmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgZGlzYWJsZUZsYWdzOiByZXN0cnVjdHVyZS51aW50MzJcbn0pO1xudmFyIE1vcnhDaGFpbiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBkZWZhdWx0RmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgY2hhaW5MZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbkZlYXR1cmVFbnRyaWVzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG5TdWJ0YWJsZXM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgZmVhdHVyZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShGZWF0dXJlRW50cnksICduRmVhdHVyZUVudHJpZXMnKSxcbiAgc3VidGFibGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoU3VidGFibGUsICduU3VidGFibGVzJylcbn0pO1xudmFyIG1vcnggPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB1bnVzZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICBuQ2hhaW5zOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGNoYWluczogbmV3IHJlc3RydWN0dXJlLkFycmF5KE1vcnhDaGFpbiwgJ25DaGFpbnMnKVxufSk7XG5cbnZhciBPcHRpY2FsQm91bmRzID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGxlZnQ6IHJlc3RydWN0dXJlLmludDE2LFxuICB0b3A6IHJlc3RydWN0dXJlLmludDE2LFxuICByaWdodDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIGJvdHRvbTogcmVzdHJ1Y3R1cmUuaW50MTZcbn0pO1xudmFyIG9wYmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgZm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxvb2t1cFRhYmxlOiBuZXcgTG9va3VwVGFibGUoT3B0aWNhbEJvdW5kcylcbn0pO1xuXG52YXIgdGFibGVzID0ge307XG50YWJsZXMuY21hcCA9IGNtYXA7XG50YWJsZXMuaGVhZCA9IGhlYWQ7XG50YWJsZXMuaGhlYSA9IGhoZWE7XG50YWJsZXMuaG10eCA9IGhtdHg7XG50YWJsZXMubWF4cCA9IG1heHA7XG50YWJsZXMubmFtZSA9IE5hbWVUYWJsZTtcbnRhYmxlc1snT1MvMiddID0gT1MyO1xudGFibGVzLnBvc3QgPSBwb3N0OyAvLyBUcnVlVHlwZSBPdXRsaW5lc1xudGFibGVzLmZwZ20gPSBmcGdtO1xudGFibGVzLmxvY2EgPSBsb2NhO1xudGFibGVzLnByZXAgPSBwcmVwO1xudGFibGVzWydjdnQgJ10gPSBjdnQ7XG50YWJsZXMuZ2x5ZiA9IGdseWY7IC8vIFBvc3RTY3JpcHQgT3V0bGluZXNcbnRhYmxlc1snQ0ZGICddID0gQ0ZGRm9udDtcbnRhYmxlc1snQ0ZGMiddID0gQ0ZGRm9udDtcbnRhYmxlcy5WT1JHID0gVk9SRzsgLy8gQml0bWFwIEdseXBoc1xudGFibGVzLkVCTEMgPSBFQkxDO1xudGFibGVzLkNCTEMgPSB0YWJsZXMuRUJMQztcbnRhYmxlcy5zYml4ID0gc2JpeDtcbnRhYmxlcy5DT0xSID0gQ09MUjtcbnRhYmxlcy5DUEFMID0gQ1BBTDsgLy8gQWR2YW5jZWQgT3BlblR5cGUgVGFibGVzXG50YWJsZXMuQkFTRSA9IEJBU0U7XG50YWJsZXMuR0RFRiA9IEdERUY7XG50YWJsZXMuR1BPUyA9IEdQT1M7XG50YWJsZXMuR1NVQiA9IEdTVUI7XG50YWJsZXMuSlNURiA9IEpTVEY7IC8vIE9wZW5UeXBlIHZhcmlhdGlvbnMgdGFibGVzXG50YWJsZXMuSFZBUiA9IEhWQVI7IC8vIE90aGVyIE9wZW5UeXBlIFRhYmxlc1xudGFibGVzLkRTSUcgPSBEU0lHO1xudGFibGVzLmdhc3AgPSBnYXNwO1xudGFibGVzLmhkbXggPSBoZG14O1xudGFibGVzLmtlcm4gPSBrZXJuO1xudGFibGVzLkxUU0ggPSBMVFNIO1xudGFibGVzLlBDTFQgPSBQQ0xUO1xudGFibGVzLlZETVggPSBWRE1YO1xudGFibGVzLnZoZWEgPSB2aGVhO1xudGFibGVzLnZtdHggPSB2bXR4OyAvLyBBcHBsZSBBZHZhbmNlZCBUeXBvZ3JhcGh5IFRhYmxlc1xudGFibGVzLmF2YXIgPSBhdmFyO1xudGFibGVzLmJzbG4gPSBic2xuO1xudGFibGVzLmZlYXQgPSBmZWF0O1xudGFibGVzLmZ2YXIgPSBmdmFyO1xudGFibGVzLmd2YXIgPSBndmFyO1xudGFibGVzLmp1c3QgPSBqdXN0O1xudGFibGVzLm1vcnggPSBtb3J4O1xudGFibGVzLm9wYmQgPSBvcGJkO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDMobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDMobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDMobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQzKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMyhvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JDMoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG52YXIgVGFibGVFbnRyeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIGNoZWNrU3VtOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG9mZnNldDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCAndm9pZCcsIHtcbiAgICB0eXBlOiAnZ2xvYmFsJ1xuICB9KSxcbiAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzJcbn0pO1xudmFyIERpcmVjdG9yeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIG51bVRhYmxlczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzZWFyY2hSYW5nZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBlbnRyeVNlbGVjdG9yOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHJhbmdlU2hpZnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdGFibGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoVGFibGVFbnRyeSwgJ251bVRhYmxlcycpXG59KTtcblxuRGlyZWN0b3J5LnByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0YWJsZXMgPSB7fTtcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDModGhpcy50YWJsZXMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgIHZhciB0YWJsZSA9IF9zdGVwLnZhbHVlO1xuICAgIHRhYmxlc1t0YWJsZS50YWddID0gdGFibGU7XG4gIH1cblxuICB0aGlzLnRhYmxlcyA9IHRhYmxlcztcbn07XG5cbkRpcmVjdG9yeS5wcmVFbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHZhciB0YWJsZXMkMSA9IFtdO1xuXG4gIGZvciAodmFyIHRhZyBpbiB0aGlzLnRhYmxlcykge1xuICAgIHZhciB0YWJsZSA9IHRoaXMudGFibGVzW3RhZ107XG5cbiAgICBpZiAodGFibGUpIHtcbiAgICAgIHRhYmxlcyQxLnB1c2goe1xuICAgICAgICB0YWc6IHRhZyxcbiAgICAgICAgY2hlY2tTdW06IDAsXG4gICAgICAgIG9mZnNldDogbmV3IHJlc3RydWN0dXJlLlZvaWRQb2ludGVyKHRhYmxlc1t0YWddLCB0YWJsZSksXG4gICAgICAgIGxlbmd0aDogdGFibGVzW3RhZ10uc2l6ZSh0YWJsZSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMudGFnID0gJ3RydWUnO1xuICB0aGlzLm51bVRhYmxlcyA9IHRhYmxlcyQxLmxlbmd0aDtcbiAgdGhpcy50YWJsZXMgPSB0YWJsZXMkMTtcbiAgdmFyIG1heEV4cG9uZW50Rm9yMiA9IE1hdGguZmxvb3IoTWF0aC5sb2codGhpcy5udW1UYWJsZXMpIC8gTWF0aC5MTjIpO1xuICB2YXIgbWF4UG93ZXJPZjIgPSBNYXRoLnBvdygyLCBtYXhFeHBvbmVudEZvcjIpO1xuICB0aGlzLnNlYXJjaFJhbmdlID0gbWF4UG93ZXJPZjIgKiAxNjtcbiAgdGhpcy5lbnRyeVNlbGVjdG9yID0gTWF0aC5sb2cobWF4UG93ZXJPZjIpIC8gTWF0aC5MTjI7XG4gIHRoaXMucmFuZ2VTaGlmdCA9IHRoaXMubnVtVGFibGVzICogMTYgLSB0aGlzLnNlYXJjaFJhbmdlO1xufTtcblxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKGFyciwgY21wKSB7XG4gIHZhciBtaW4gPSAwO1xuICB2YXIgbWF4ID0gYXJyLmxlbmd0aCAtIDE7XG5cbiAgd2hpbGUgKG1pbiA8PSBtYXgpIHtcbiAgICB2YXIgbWlkID0gbWluICsgbWF4ID4+IDE7XG4gICAgdmFyIHJlcyA9IGNtcChhcnJbbWlkXSk7XG5cbiAgICBpZiAocmVzIDwgMCkge1xuICAgICAgbWF4ID0gbWlkIC0gMTtcbiAgICB9IGVsc2UgaWYgKHJlcyA+IDApIHtcbiAgICAgIG1pbiA9IG1pZCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gcmFuZ2UoaW5kZXgsIGVuZCkge1xuICB2YXIgcmFuZ2UgPSBbXTtcblxuICB3aGlsZSAoaW5kZXggPCBlbmQpIHtcbiAgICByYW5nZS5wdXNoKGluZGV4KyspO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlO1xufVxuXG52YXIgX2NsYXNzO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDQobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDQobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDQobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ0KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkNChvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JDQoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSwgZGVjb3JhdG9ycywgZGVzY3JpcHRvciwgY29udGV4dCkgeyB2YXIgZGVzYyA9IHt9OyBPYmplY3Qua2V5cyhkZXNjcmlwdG9yKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgZGVzY1trZXldID0gZGVzY3JpcHRvcltrZXldOyB9KTsgZGVzYy5lbnVtZXJhYmxlID0gISFkZXNjLmVudW1lcmFibGU7IGRlc2MuY29uZmlndXJhYmxlID0gISFkZXNjLmNvbmZpZ3VyYWJsZTsgaWYgKCd2YWx1ZScgaW4gZGVzYyB8fCBkZXNjLmluaXRpYWxpemVyKSB7IGRlc2Mud3JpdGFibGUgPSB0cnVlOyB9IGRlc2MgPSBkZWNvcmF0b3JzLnNsaWNlKCkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoZGVzYywgZGVjb3JhdG9yKSB7IHJldHVybiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYykgfHwgZGVzYzsgfSwgZGVzYyk7IGlmIChjb250ZXh0ICYmIGRlc2MuaW5pdGlhbGl6ZXIgIT09IHZvaWQgMCkgeyBkZXNjLnZhbHVlID0gZGVzYy5pbml0aWFsaXplciA/IGRlc2MuaW5pdGlhbGl6ZXIuY2FsbChjb250ZXh0KSA6IHZvaWQgMDsgZGVzYy5pbml0aWFsaXplciA9IHVuZGVmaW5lZDsgfSBpZiAoZGVzYy5pbml0aWFsaXplciA9PT0gdm9pZCAwKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjKTsgZGVzYyA9IG51bGw7IH0gcmV0dXJuIGRlc2M7IH1cbnZhciBDbWFwUHJvY2Vzc29yID0gKF9jbGFzcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENtYXBQcm9jZXNzb3IoY21hcFRhYmxlKSB7XG4gICAgLy8gQXR0ZW1wdCB0byBmaW5kIGEgVW5pY29kZSBjbWFwIGZpcnN0XG4gICAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gICAgdGhpcy5jbWFwID0gdGhpcy5maW5kU3VidGFibGUoY21hcFRhYmxlLCBbLy8gMzItYml0IHN1YnRhYmxlc1xuICAgIFszLCAxMF0sIFswLCA2XSwgWzAsIDRdLCAvLyAxNi1iaXQgc3VidGFibGVzXG4gICAgWzMsIDFdLCBbMCwgM10sIFswLCAyXSwgWzAsIDFdLCBbMCwgMF1dKTsgLy8gSWYgbm90IHVuaWNvZGUgY21hcCB3YXMgZm91bmQsIGFuZCBpY29udi1saXRlIGlzIGluc3RhbGxlZCxcbiAgICAvLyB0YWtlIHRoZSBmaXJzdCB0YWJsZSB3aXRoIGEgc3VwcG9ydGVkIGVuY29kaW5nLlxuXG4gICAgaWYgKCF0aGlzLmNtYXAgJiYgbGliKSB7XG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDQoY21hcFRhYmxlLnRhYmxlcyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBjbWFwID0gX3N0ZXAudmFsdWU7XG4gICAgICAgIHZhciBlbmNvZGluZyA9IGdldEVuY29kaW5nKGNtYXAucGxhdGZvcm1JRCwgY21hcC5lbmNvZGluZ0lELCBjbWFwLnRhYmxlLmxhbmd1YWdlIC0gMSk7XG5cbiAgICAgICAgaWYgKGxpYi5lbmNvZGluZ0V4aXN0cyhlbmNvZGluZykpIHtcbiAgICAgICAgICB0aGlzLmNtYXAgPSBjbWFwLnRhYmxlO1xuICAgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5jbWFwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBhIHN1cHBvcnRlZCBjbWFwIHRhYmxlXCIpO1xuICAgIH1cblxuICAgIHRoaXMudXZzID0gdGhpcy5maW5kU3VidGFibGUoY21hcFRhYmxlLCBbWzAsIDVdXSk7XG5cbiAgICBpZiAodGhpcy51dnMgJiYgdGhpcy51dnMudmVyc2lvbiAhPT0gMTQpIHtcbiAgICAgIHRoaXMudXZzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQ21hcFByb2Nlc3Nvci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmZpbmRTdWJ0YWJsZSA9IGZ1bmN0aW9uIGZpbmRTdWJ0YWJsZShjbWFwVGFibGUsIHBhaXJzKSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNChwYWlycyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgX3N0ZXAyJHZhbHVlID0gX3N0ZXAyLnZhbHVlLFxuICAgICAgICAgIHBsYXRmb3JtSUQgPSBfc3RlcDIkdmFsdWVbMF0sXG4gICAgICAgICAgZW5jb2RpbmdJRCA9IF9zdGVwMiR2YWx1ZVsxXTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNChjbWFwVGFibGUudGFibGVzKSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGNtYXAgPSBfc3RlcDMudmFsdWU7XG5cbiAgICAgICAgaWYgKGNtYXAucGxhdGZvcm1JRCA9PT0gcGxhdGZvcm1JRCAmJiBjbWFwLmVuY29kaW5nSUQgPT09IGVuY29kaW5nSUQpIHtcbiAgICAgICAgICByZXR1cm4gY21hcC50YWJsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9wcm90by5sb29rdXAgPSBmdW5jdGlvbiBsb29rdXAoY29kZXBvaW50LCB2YXJpYXRpb25TZWxlY3Rvcikge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIFVuaWNvZGUgY21hcCBpbiB0aGlzIGZvbnQsIHdlIG5lZWQgdG8gcmUtZW5jb2RlXG4gICAgLy8gdGhlIGNvZGVwb2ludCBpbiB0aGUgZW5jb2RpbmcgdGhhdCB0aGUgY21hcCBzdXBwb3J0cy5cbiAgICBpZiAodGhpcy5lbmNvZGluZykge1xuICAgICAgdmFyIGJ1ZiA9IGxpYi5lbmNvZGUoU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZXBvaW50KSwgdGhpcy5lbmNvZGluZyk7XG4gICAgICBjb2RlcG9pbnQgPSAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb2RlcG9pbnQgPSBjb2RlcG9pbnQgPDwgOCB8IGJ1ZltpXTtcbiAgICAgIH0gLy8gT3RoZXJ3aXNlLCB0cnkgdG8gZ2V0IGEgVW5pY29kZSB2YXJpYXRpb24gc2VsZWN0b3IgZm9yIHRoaXMgY29kZXBvaW50IGlmIG9uZSBpcyBwcm92aWRlZC5cblxuICAgIH0gZWxzZSBpZiAodmFyaWF0aW9uU2VsZWN0b3IpIHtcbiAgICAgIHZhciBnaWQgPSB0aGlzLmdldFZhcmlhdGlvblNlbGVjdG9yKGNvZGVwb2ludCwgdmFyaWF0aW9uU2VsZWN0b3IpO1xuXG4gICAgICBpZiAoZ2lkKSB7XG4gICAgICAgIHJldHVybiBnaWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNtYXAgPSB0aGlzLmNtYXA7XG5cbiAgICBzd2l0Y2ggKGNtYXAudmVyc2lvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gY21hcC5jb2RlTWFwLmdldChjb2RlcG9pbnQpIHx8IDA7XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBtaW4gPSAwO1xuICAgICAgICAgIHZhciBtYXggPSBjbWFwLnNlZ0NvdW50IC0gMTtcblxuICAgICAgICAgIHdoaWxlIChtaW4gPD0gbWF4KSB7XG4gICAgICAgICAgICB2YXIgbWlkID0gbWluICsgbWF4ID4+IDE7XG5cbiAgICAgICAgICAgIGlmIChjb2RlcG9pbnQgPCBjbWFwLnN0YXJ0Q29kZS5nZXQobWlkKSkge1xuICAgICAgICAgICAgICBtYXggPSBtaWQgLSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlcG9pbnQgPiBjbWFwLmVuZENvZGUuZ2V0KG1pZCkpIHtcbiAgICAgICAgICAgICAgbWluID0gbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciByYW5nZU9mZnNldCA9IGNtYXAuaWRSYW5nZU9mZnNldC5nZXQobWlkKTtcblxuICAgICAgICAgICAgICB2YXIgX2dpZCA9IHZvaWQgMDtcblxuICAgICAgICAgICAgICBpZiAocmFuZ2VPZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBfZ2lkID0gY29kZXBvaW50ICsgY21hcC5pZERlbHRhLmdldChtaWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHJhbmdlT2Zmc2V0IC8gMiArIChjb2RlcG9pbnQgLSBjbWFwLnN0YXJ0Q29kZS5nZXQobWlkKSkgLSAoY21hcC5zZWdDb3VudCAtIG1pZCk7XG4gICAgICAgICAgICAgICAgX2dpZCA9IGNtYXAuZ2x5cGhJbmRleEFycmF5LmdldChpbmRleCkgfHwgMDtcblxuICAgICAgICAgICAgICAgIGlmIChfZ2lkICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICBfZ2lkICs9IGNtYXAuaWREZWx0YS5nZXQobWlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gX2dpZCAmIDB4ZmZmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDg6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVE9ETzogY21hcCBmb3JtYXQgOCcpO1xuXG4gICAgICBjYXNlIDY6XG4gICAgICBjYXNlIDEwOlxuICAgICAgICByZXR1cm4gY21hcC5nbHlwaEluZGljZXMuZ2V0KGNvZGVwb2ludCAtIGNtYXAuZmlyc3RDb2RlKSB8fCAwO1xuXG4gICAgICBjYXNlIDEyOlxuICAgICAgY2FzZSAxMzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfbWluID0gMDtcblxuICAgICAgICAgIHZhciBfbWF4ID0gY21hcC5uR3JvdXBzIC0gMTtcblxuICAgICAgICAgIHdoaWxlIChfbWluIDw9IF9tYXgpIHtcbiAgICAgICAgICAgIHZhciBfbWlkID0gX21pbiArIF9tYXggPj4gMTtcblxuICAgICAgICAgICAgdmFyIGdyb3VwID0gY21hcC5ncm91cHMuZ2V0KF9taWQpO1xuXG4gICAgICAgICAgICBpZiAoY29kZXBvaW50IDwgZ3JvdXAuc3RhcnRDaGFyQ29kZSkge1xuICAgICAgICAgICAgICBfbWF4ID0gX21pZCAtIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVwb2ludCA+IGdyb3VwLmVuZENoYXJDb2RlKSB7XG4gICAgICAgICAgICAgIF9taW4gPSBfbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChjbWFwLnZlcnNpb24gPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmdseXBoSUQgKyAoY29kZXBvaW50IC0gZ3JvdXAuc3RhcnRDaGFyQ29kZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmdseXBoSUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDE0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE86IGNtYXAgZm9ybWF0IDE0Jyk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY21hcCBmb3JtYXQgXCIgKyBjbWFwLnZlcnNpb24pO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZ2V0VmFyaWF0aW9uU2VsZWN0b3IgPSBmdW5jdGlvbiBnZXRWYXJpYXRpb25TZWxlY3Rvcihjb2RlcG9pbnQsIHZhcmlhdGlvblNlbGVjdG9yKSB7XG4gICAgaWYgKCF0aGlzLnV2cykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgdmFyIHNlbGVjdG9ycyA9IHRoaXMudXZzLnZhclNlbGVjdG9ycy50b0FycmF5KCk7XG4gICAgdmFyIGkgPSBiaW5hcnlTZWFyY2goc2VsZWN0b3JzLCBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHZhcmlhdGlvblNlbGVjdG9yIC0geC52YXJTZWxlY3RvcjtcbiAgICB9KTtcbiAgICB2YXIgc2VsID0gc2VsZWN0b3JzW2ldO1xuXG4gICAgaWYgKGkgIT09IC0xICYmIHNlbC5kZWZhdWx0VVZTKSB7XG4gICAgICBpID0gYmluYXJ5U2VhcmNoKHNlbC5kZWZhdWx0VVZTLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gY29kZXBvaW50IDwgeC5zdGFydFVuaWNvZGVWYWx1ZSA/IC0xIDogY29kZXBvaW50ID4geC5zdGFydFVuaWNvZGVWYWx1ZSArIHguYWRkaXRpb25hbENvdW50ID8gKzEgOiAwO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGkgIT09IC0xICYmIHNlbC5ub25EZWZhdWx0VVZTKSB7XG4gICAgICBpID0gYmluYXJ5U2VhcmNoKHNlbC5ub25EZWZhdWx0VVZTLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gY29kZXBvaW50IC0geC51bmljb2RlVmFsdWU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBzZWwubm9uRGVmYXVsdFVWU1tpXS5nbHlwaElEO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9O1xuXG4gIF9wcm90by5nZXRDaGFyYWN0ZXJTZXQgPSBmdW5jdGlvbiBnZXRDaGFyYWN0ZXJTZXQoKSB7XG4gICAgdmFyIGNtYXAgPSB0aGlzLmNtYXA7XG5cbiAgICBzd2l0Y2ggKGNtYXAudmVyc2lvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gcmFuZ2UoMCwgY21hcC5jb2RlTWFwLmxlbmd0aCk7XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgICAgICB2YXIgZW5kQ29kZXMgPSBjbWFwLmVuZENvZGUudG9BcnJheSgpO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmRDb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHRhaWwgPSBlbmRDb2Rlc1tpXSArIDE7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBjbWFwLnN0YXJ0Q29kZS5nZXQoaSk7XG4gICAgICAgICAgICByZXMucHVzaC5hcHBseShyZXMsIHJhbmdlKHN0YXJ0LCB0YWlsKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDg6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVE9ETzogY21hcCBmb3JtYXQgOCcpO1xuXG4gICAgICBjYXNlIDY6XG4gICAgICBjYXNlIDEwOlxuICAgICAgICByZXR1cm4gcmFuZ2UoY21hcC5maXJzdENvZGUsIGNtYXAuZmlyc3RDb2RlICsgY21hcC5nbHlwaEluZGljZXMubGVuZ3RoKTtcblxuICAgICAgY2FzZSAxMjpcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX3JlcyA9IFtdO1xuXG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNChjbWFwLmdyb3Vwcy50b0FycmF5KCkpLCBfc3RlcDQ7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNCgpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gX3N0ZXA0LnZhbHVlO1xuXG4gICAgICAgICAgICBfcmVzLnB1c2guYXBwbHkoX3JlcywgcmFuZ2UoZ3JvdXAuc3RhcnRDaGFyQ29kZSwgZ3JvdXAuZW5kQ2hhckNvZGUgKyAxKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9yZXM7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAxNDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPOiBjbWFwIGZvcm1hdCAxNCcpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNtYXAgZm9ybWF0IFwiICsgY21hcC52ZXJzaW9uKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmNvZGVQb2ludHNGb3JHbHlwaCA9IGZ1bmN0aW9uIGNvZGVQb2ludHNGb3JHbHlwaChnaWQpIHtcbiAgICB2YXIgY21hcCA9IHRoaXMuY21hcDtcblxuICAgIHN3aXRjaCAoY21hcC52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcmVzID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY21hcC5jb2RlTWFwLmdldChpKSA9PT0gZ2lkKSB7XG4gICAgICAgICAgICAgIHJlcy5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA0OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9yZXMyID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgY21hcC5zZWdDb3VudDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGVuZCA9IGNtYXAuZW5kQ29kZS5nZXQoX2kpO1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gY21hcC5zdGFydENvZGUuZ2V0KF9pKTtcbiAgICAgICAgICAgIHZhciByYW5nZU9mZnNldCA9IGNtYXAuaWRSYW5nZU9mZnNldC5nZXQoX2kpO1xuICAgICAgICAgICAgdmFyIGRlbHRhID0gY21hcC5pZERlbHRhLmdldChfaSk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGMgPSBzdGFydDsgYyA8PSBlbmQ7IGMrKykge1xuICAgICAgICAgICAgICB2YXIgZyA9IDA7XG5cbiAgICAgICAgICAgICAgaWYgKHJhbmdlT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZyA9IGMgKyBkZWx0YTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSByYW5nZU9mZnNldCAvIDIgKyAoYyAtIHN0YXJ0KSAtIChjbWFwLnNlZ0NvdW50IC0gX2kpO1xuICAgICAgICAgICAgICAgIGcgPSBjbWFwLmdseXBoSW5kZXhBcnJheS5nZXQoaW5kZXgpIHx8IDA7XG5cbiAgICAgICAgICAgICAgICBpZiAoZyAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgZyArPSBkZWx0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoZyA9PT0gZ2lkKSB7XG4gICAgICAgICAgICAgICAgX3JlczIucHVzaChjKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfcmVzMjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDEyOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9yZXMzID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ0KGNtYXAuZ3JvdXBzLnRvQXJyYXkoKSksIF9zdGVwNTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1KCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgZ3JvdXAgPSBfc3RlcDUudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChnaWQgPj0gZ3JvdXAuZ2x5cGhJRCAmJiBnaWQgPD0gZ3JvdXAuZ2x5cGhJRCArIChncm91cC5lbmRDaGFyQ29kZSAtIGdyb3VwLnN0YXJ0Q2hhckNvZGUpKSB7XG4gICAgICAgICAgICAgIF9yZXMzLnB1c2goZ3JvdXAuc3RhcnRDaGFyQ29kZSArIChnaWQgLSBncm91cC5nbHlwaElEKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9yZXMzO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX3JlczQgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDQoY21hcC5ncm91cHMudG9BcnJheSgpKSwgX3N0ZXA2OyAhKF9zdGVwNiA9IF9pdGVyYXRvcjYoKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBfZ3JvdXAgPSBfc3RlcDYudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChnaWQgPT09IF9ncm91cC5nbHlwaElEKSB7XG4gICAgICAgICAgICAgIF9yZXM0LnB1c2guYXBwbHkoX3JlczQsIHJhbmdlKF9ncm91cC5zdGFydENoYXJDb2RlLCBfZ3JvdXAuZW5kQ2hhckNvZGUgKyAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9yZXM0O1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY21hcCBmb3JtYXQgXCIgKyBjbWFwLnZlcnNpb24pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gQ21hcFByb2Nlc3Nvcjtcbn0oKSwgKF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzLnByb3RvdHlwZSwgXCJnZXRDaGFyYWN0ZXJTZXRcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MucHJvdG90eXBlLCBcImdldENoYXJhY3RlclNldFwiKSwgX2NsYXNzLnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzLnByb3RvdHlwZSwgXCJjb2RlUG9pbnRzRm9yR2x5cGhcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MucHJvdG90eXBlLCBcImNvZGVQb2ludHNGb3JHbHlwaFwiKSwgX2NsYXNzLnByb3RvdHlwZSkpLCBfY2xhc3MpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDUobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDUobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDUobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ1KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkNShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JDUoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBLZXJuUHJvY2Vzc29yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gS2VyblByb2Nlc3Nvcihmb250KSB7XG4gICAgdGhpcy5rZXJuID0gZm9udC5rZXJuO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEtlcm5Qcm9jZXNzb3IucHJvdG90eXBlO1xuXG4gIF9wcm90by5wcm9jZXNzID0gZnVuY3Rpb24gcHJvY2VzcyhnbHlwaHMsIHBvc2l0aW9ucykge1xuICAgIGZvciAodmFyIGdseXBoSW5kZXggPSAwOyBnbHlwaEluZGV4IDwgZ2x5cGhzLmxlbmd0aCAtIDE7IGdseXBoSW5kZXgrKykge1xuICAgICAgdmFyIGxlZnQgPSBnbHlwaHNbZ2x5cGhJbmRleF0uaWQ7XG4gICAgICB2YXIgcmlnaHQgPSBnbHlwaHNbZ2x5cGhJbmRleCArIDFdLmlkO1xuICAgICAgcG9zaXRpb25zW2dseXBoSW5kZXhdLnhBZHZhbmNlICs9IHRoaXMuZ2V0S2VybmluZyhsZWZ0LCByaWdodCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5nZXRLZXJuaW5nID0gZnVuY3Rpb24gZ2V0S2VybmluZyhsZWZ0LCByaWdodCkge1xuICAgIHZhciByZXMgPSAwO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ1KHRoaXMua2Vybi50YWJsZXMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIHRhYmxlID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgIGlmICh0YWJsZS5jb3ZlcmFnZS5jcm9zc1N0cmVhbSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh0YWJsZS52ZXJzaW9uKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBpZiAoIXRhYmxlLmNvdmVyYWdlLmhvcml6b250YWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAodGFibGUuY292ZXJhZ2UudmVydGljYWwgfHwgdGFibGUuY292ZXJhZ2UudmFyaWF0aW9uKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGtlcm5pbmcgdGFibGUgdmVyc2lvbiBcIiArIHRhYmxlLnZlcnNpb24pO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmFsID0gMDtcbiAgICAgIHZhciBzID0gdGFibGUuc3VidGFibGU7XG5cbiAgICAgIHN3aXRjaCAodGFibGUuZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICB2YXIgcGFpcklkeCA9IGJpbmFyeVNlYXJjaChzLnBhaXJzLCBmdW5jdGlvbiAocGFpcikge1xuICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSBwYWlyLmxlZnQgfHwgcmlnaHQgLSBwYWlyLnJpZ2h0O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHBhaXJJZHggPj0gMCkge1xuICAgICAgICAgICAgdmFsID0gcy5wYWlyc1twYWlySWR4XS52YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgdmFyIGxlZnRPZmZzZXQgPSAwLFxuICAgICAgICAgICAgICByaWdodE9mZnNldCA9IDA7XG5cbiAgICAgICAgICBpZiAobGVmdCA+PSBzLmxlZnRUYWJsZS5maXJzdEdseXBoICYmIGxlZnQgPCBzLmxlZnRUYWJsZS5maXJzdEdseXBoICsgcy5sZWZ0VGFibGUubkdseXBocykge1xuICAgICAgICAgICAgbGVmdE9mZnNldCA9IHMubGVmdFRhYmxlLm9mZnNldHNbbGVmdCAtIHMubGVmdFRhYmxlLmZpcnN0R2x5cGhdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZWZ0T2Zmc2V0ID0gcy5hcnJheS5vZmY7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJpZ2h0ID49IHMucmlnaHRUYWJsZS5maXJzdEdseXBoICYmIHJpZ2h0IDwgcy5yaWdodFRhYmxlLmZpcnN0R2x5cGggKyBzLnJpZ2h0VGFibGUubkdseXBocykge1xuICAgICAgICAgICAgcmlnaHRPZmZzZXQgPSBzLnJpZ2h0VGFibGUub2Zmc2V0c1tyaWdodCAtIHMucmlnaHRUYWJsZS5maXJzdEdseXBoXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaW5kZXggPSAobGVmdE9mZnNldCArIHJpZ2h0T2Zmc2V0IC0gcy5hcnJheS5vZmYpIC8gMjtcbiAgICAgICAgICB2YWwgPSBzLmFycmF5LnZhbHVlcy5nZXQoaW5kZXgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpZiAobGVmdCA+PSBzLmdseXBoQ291bnQgfHwgcmlnaHQgPj0gcy5nbHlwaENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWwgPSBzLmtlcm5WYWx1ZVtzLmtlcm5JbmRleFtzLmxlZnRDbGFzc1tsZWZ0XSAqIHMucmlnaHRDbGFzc0NvdW50ICsgcy5yaWdodENsYXNzW3JpZ2h0XV1dO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQga2VybmluZyBzdWItdGFibGUgZm9ybWF0IFwiICsgdGFibGUuZm9ybWF0KTtcbiAgICAgIH0gLy8gTWljcm9zb2Z0IHN1cHBvcnRzIHRoZSBvdmVycmlkZSBmbGFnLCB3aGljaCByZXNldHMgdGhlIHJlc3VsdFxuICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgc3VtIG9mIHRoZSByZXN1bHRzIGZyb20gYWxsIHN1YnRhYmxlcyBpcyByZXR1cm5lZFxuXG5cbiAgICAgIGlmICh0YWJsZS5jb3ZlcmFnZS5vdmVycmlkZSkge1xuICAgICAgICByZXMgPSB2YWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXMgKz0gdmFsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgcmV0dXJuIEtlcm5Qcm9jZXNzb3I7XG59KCk7XG5cbnZhciBUSU5GX09LID0gMDtcbnZhciBUSU5GX0RBVEFfRVJST1IgPSAtMztcblxuZnVuY3Rpb24gVHJlZSgpIHtcbiAgdGhpcy50YWJsZSA9IG5ldyBVaW50MTZBcnJheSgxNik7XG4gIC8qIHRhYmxlIG9mIGNvZGUgbGVuZ3RoIGNvdW50cyAqL1xuXG4gIHRoaXMudHJhbnMgPSBuZXcgVWludDE2QXJyYXkoMjg4KTtcbiAgLyogY29kZSAtPiBzeW1ib2wgdHJhbnNsYXRpb24gdGFibGUgKi9cbn1cblxuZnVuY3Rpb24gRGF0YShzb3VyY2UsIGRlc3QpIHtcbiAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gIHRoaXMuc291cmNlSW5kZXggPSAwO1xuICB0aGlzLnRhZyA9IDA7XG4gIHRoaXMuYml0Y291bnQgPSAwO1xuICB0aGlzLmRlc3QgPSBkZXN0O1xuICB0aGlzLmRlc3RMZW4gPSAwO1xuICB0aGlzLmx0cmVlID0gbmV3IFRyZWUoKTtcbiAgLyogZHluYW1pYyBsZW5ndGgvc3ltYm9sIHRyZWUgKi9cblxuICB0aGlzLmR0cmVlID0gbmV3IFRyZWUoKTtcbiAgLyogZHluYW1pYyBkaXN0YW5jZSB0cmVlICovXG59XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKlxuICogLS0gdW5pbml0aWFsaXplZCBnbG9iYWwgZGF0YSAoc3RhdGljIHN0cnVjdHVyZXMpIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cbnZhciBzbHRyZWUgPSBuZXcgVHJlZSgpO1xudmFyIHNkdHJlZSA9IG5ldyBUcmVlKCk7XG4vKiBleHRyYSBiaXRzIGFuZCBiYXNlIHRhYmxlcyBmb3IgbGVuZ3RoIGNvZGVzICovXG5cbnZhciBsZW5ndGhfYml0cyA9IG5ldyBVaW50OEFycmF5KDMwKTtcbnZhciBsZW5ndGhfYmFzZSA9IG5ldyBVaW50MTZBcnJheSgzMCk7XG4vKiBleHRyYSBiaXRzIGFuZCBiYXNlIHRhYmxlcyBmb3IgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIGRpc3RfYml0cyA9IG5ldyBVaW50OEFycmF5KDMwKTtcbnZhciBkaXN0X2Jhc2UgPSBuZXcgVWludDE2QXJyYXkoMzApO1xuLyogc3BlY2lhbCBvcmRlcmluZyBvZiBjb2RlIGxlbmd0aCBjb2RlcyAqL1xuXG52YXIgY2xjaWR4ID0gbmV3IFVpbnQ4QXJyYXkoWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdKTtcbi8qIHVzZWQgYnkgdGluZl9kZWNvZGVfdHJlZXMsIGF2b2lkcyBhbGxvY2F0aW9ucyBldmVyeSBjYWxsICovXG5cbnZhciBjb2RlX3RyZWUgPSBuZXcgVHJlZSgpO1xudmFyIGxlbmd0aHMgPSBuZXcgVWludDhBcnJheSgyODggKyAzMik7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSB1dGlsaXR5IGZ1bmN0aW9ucyAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiBidWlsZCBleHRyYSBiaXRzIGFuZCBiYXNlIHRhYmxlcyAqL1xuXG5mdW5jdGlvbiB0aW5mX2J1aWxkX2JpdHNfYmFzZShiaXRzLCBiYXNlLCBkZWx0YSwgZmlyc3QpIHtcbiAgdmFyIGksIHN1bTtcbiAgLyogYnVpbGQgYml0cyB0YWJsZSAqL1xuXG4gIGZvciAoaSA9IDA7IGkgPCBkZWx0YTsgKytpKSB7XG4gICAgYml0c1tpXSA9IDA7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgMzAgLSBkZWx0YTsgKytpKSB7XG4gICAgYml0c1tpICsgZGVsdGFdID0gaSAvIGRlbHRhIHwgMDtcbiAgfVxuICAvKiBidWlsZCBiYXNlIHRhYmxlICovXG5cblxuICBmb3IgKHN1bSA9IGZpcnN0LCBpID0gMDsgaSA8IDMwOyArK2kpIHtcbiAgICBiYXNlW2ldID0gc3VtO1xuICAgIHN1bSArPSAxIDw8IGJpdHNbaV07XG4gIH1cbn1cbi8qIGJ1aWxkIHRoZSBmaXhlZCBodWZmbWFuIHRyZWVzICovXG5cblxuZnVuY3Rpb24gdGluZl9idWlsZF9maXhlZF90cmVlcyhsdCwgZHQpIHtcbiAgdmFyIGk7XG4gIC8qIGJ1aWxkIGZpeGVkIGxlbmd0aCB0cmVlICovXG5cbiAgZm9yIChpID0gMDsgaSA8IDc7ICsraSkge1xuICAgIGx0LnRhYmxlW2ldID0gMDtcbiAgfVxuXG4gIGx0LnRhYmxlWzddID0gMjQ7XG4gIGx0LnRhYmxlWzhdID0gMTUyO1xuICBsdC50YWJsZVs5XSA9IDExMjtcblxuICBmb3IgKGkgPSAwOyBpIDwgMjQ7ICsraSkge1xuICAgIGx0LnRyYW5zW2ldID0gMjU2ICsgaTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCAxNDQ7ICsraSkge1xuICAgIGx0LnRyYW5zWzI0ICsgaV0gPSBpO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkge1xuICAgIGx0LnRyYW5zWzI0ICsgMTQ0ICsgaV0gPSAyODAgKyBpO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IDExMjsgKytpKSB7XG4gICAgbHQudHJhbnNbMjQgKyAxNDQgKyA4ICsgaV0gPSAxNDQgKyBpO1xuICB9XG4gIC8qIGJ1aWxkIGZpeGVkIGRpc3RhbmNlIHRyZWUgKi9cblxuXG4gIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHtcbiAgICBkdC50YWJsZVtpXSA9IDA7XG4gIH1cblxuICBkdC50YWJsZVs1XSA9IDMyO1xuXG4gIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKSB7XG4gICAgZHQudHJhbnNbaV0gPSBpO1xuICB9XG59XG4vKiBnaXZlbiBhbiBhcnJheSBvZiBjb2RlIGxlbmd0aHMsIGJ1aWxkIGEgdHJlZSAqL1xuXG5cbnZhciBvZmZzID0gbmV3IFVpbnQxNkFycmF5KDE2KTtcblxuZnVuY3Rpb24gdGluZl9idWlsZF90cmVlKHQsIGxlbmd0aHMsIG9mZiwgbnVtKSB7XG4gIHZhciBpLCBzdW07XG4gIC8qIGNsZWFyIGNvZGUgbGVuZ3RoIGNvdW50IHRhYmxlICovXG5cbiAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICB0LnRhYmxlW2ldID0gMDtcbiAgfVxuICAvKiBzY2FuIHN5bWJvbCBsZW5ndGhzLCBhbmQgc3VtIGNvZGUgbGVuZ3RoIGNvdW50cyAqL1xuXG5cbiAgZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7XG4gICAgdC50YWJsZVtsZW5ndGhzW29mZiArIGldXSsrO1xuICB9XG5cbiAgdC50YWJsZVswXSA9IDA7XG4gIC8qIGNvbXB1dGUgb2Zmc2V0IHRhYmxlIGZvciBkaXN0cmlidXRpb24gc29ydCAqL1xuXG4gIGZvciAoc3VtID0gMCwgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgb2Zmc1tpXSA9IHN1bTtcbiAgICBzdW0gKz0gdC50YWJsZVtpXTtcbiAgfVxuICAvKiBjcmVhdGUgY29kZS0+c3ltYm9sIHRyYW5zbGF0aW9uIHRhYmxlIChzeW1ib2xzIHNvcnRlZCBieSBjb2RlKSAqL1xuXG5cbiAgZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7XG4gICAgaWYgKGxlbmd0aHNbb2ZmICsgaV0pIHQudHJhbnNbb2Zmc1tsZW5ndGhzW29mZiArIGldXSsrXSA9IGk7XG4gIH1cbn1cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKlxuICogLS0gZGVjb2RlIGZ1bmN0aW9ucyAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qIGdldCBvbmUgYml0IGZyb20gc291cmNlIHN0cmVhbSAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfZ2V0Yml0KGQpIHtcbiAgLyogY2hlY2sgaWYgdGFnIGlzIGVtcHR5ICovXG4gIGlmICghZC5iaXRjb3VudC0tKSB7XG4gICAgLyogbG9hZCBuZXh0IHRhZyAqL1xuICAgIGQudGFnID0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCsrXTtcbiAgICBkLmJpdGNvdW50ID0gNztcbiAgfVxuICAvKiBzaGlmdCBiaXQgb3V0IG9mIHRhZyAqL1xuXG5cbiAgdmFyIGJpdCA9IGQudGFnICYgMTtcbiAgZC50YWcgPj4+PSAxO1xuICByZXR1cm4gYml0O1xufVxuLyogcmVhZCBhIG51bSBiaXQgdmFsdWUgZnJvbSBhIHN0cmVhbSBhbmQgYWRkIGJhc2UgKi9cblxuXG5mdW5jdGlvbiB0aW5mX3JlYWRfYml0cyhkLCBudW0sIGJhc2UpIHtcbiAgaWYgKCFudW0pIHJldHVybiBiYXNlO1xuXG4gIHdoaWxlIChkLmJpdGNvdW50IDwgMjQpIHtcbiAgICBkLnRhZyB8PSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4KytdIDw8IGQuYml0Y291bnQ7XG4gICAgZC5iaXRjb3VudCArPSA4O1xuICB9XG5cbiAgdmFyIHZhbCA9IGQudGFnICYgMHhmZmZmID4+PiAxNiAtIG51bTtcbiAgZC50YWcgPj4+PSBudW07XG4gIGQuYml0Y291bnQgLT0gbnVtO1xuICByZXR1cm4gdmFsICsgYmFzZTtcbn1cbi8qIGdpdmVuIGEgZGF0YSBzdHJlYW0gYW5kIGEgdHJlZSwgZGVjb2RlIGEgc3ltYm9sICovXG5cblxuZnVuY3Rpb24gdGluZl9kZWNvZGVfc3ltYm9sKGQsIHQpIHtcbiAgd2hpbGUgKGQuYml0Y291bnQgPCAyNCkge1xuICAgIGQudGFnIHw9IGQuc291cmNlW2Quc291cmNlSW5kZXgrK10gPDwgZC5iaXRjb3VudDtcbiAgICBkLmJpdGNvdW50ICs9IDg7XG4gIH1cblxuICB2YXIgc3VtID0gMCxcbiAgICAgIGN1ciA9IDAsXG4gICAgICBsZW4gPSAwO1xuICB2YXIgdGFnID0gZC50YWc7XG4gIC8qIGdldCBtb3JlIGJpdHMgd2hpbGUgY29kZSB2YWx1ZSBpcyBhYm92ZSBzdW0gKi9cblxuICBkbyB7XG4gICAgY3VyID0gMiAqIGN1ciArICh0YWcgJiAxKTtcbiAgICB0YWcgPj4+PSAxO1xuICAgICsrbGVuO1xuICAgIHN1bSArPSB0LnRhYmxlW2xlbl07XG4gICAgY3VyIC09IHQudGFibGVbbGVuXTtcbiAgfSB3aGlsZSAoY3VyID49IDApO1xuXG4gIGQudGFnID0gdGFnO1xuICBkLmJpdGNvdW50IC09IGxlbjtcbiAgcmV0dXJuIHQudHJhbnNbc3VtICsgY3VyXTtcbn1cbi8qIGdpdmVuIGEgZGF0YSBzdHJlYW0sIGRlY29kZSBkeW5hbWljIHRyZWVzIGZyb20gaXQgKi9cblxuXG5mdW5jdGlvbiB0aW5mX2RlY29kZV90cmVlcyhkLCBsdCwgZHQpIHtcbiAgdmFyIGhsaXQsIGhkaXN0LCBoY2xlbjtcbiAgdmFyIGksIG51bSwgbGVuZ3RoO1xuICAvKiBnZXQgNSBiaXRzIEhMSVQgKDI1Ny0yODYpICovXG5cbiAgaGxpdCA9IHRpbmZfcmVhZF9iaXRzKGQsIDUsIDI1Nyk7XG4gIC8qIGdldCA1IGJpdHMgSERJU1QgKDEtMzIpICovXG5cbiAgaGRpc3QgPSB0aW5mX3JlYWRfYml0cyhkLCA1LCAxKTtcbiAgLyogZ2V0IDQgYml0cyBIQ0xFTiAoNC0xOSkgKi9cblxuICBoY2xlbiA9IHRpbmZfcmVhZF9iaXRzKGQsIDQsIDQpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCAxOTsgKytpKSB7XG4gICAgbGVuZ3Roc1tpXSA9IDA7XG4gIH1cbiAgLyogcmVhZCBjb2RlIGxlbmd0aHMgZm9yIGNvZGUgbGVuZ3RoIGFscGhhYmV0ICovXG5cblxuICBmb3IgKGkgPSAwOyBpIDwgaGNsZW47ICsraSkge1xuICAgIC8qIGdldCAzIGJpdHMgY29kZSBsZW5ndGggKDAtNykgKi9cbiAgICB2YXIgY2xlbiA9IHRpbmZfcmVhZF9iaXRzKGQsIDMsIDApO1xuICAgIGxlbmd0aHNbY2xjaWR4W2ldXSA9IGNsZW47XG4gIH1cbiAgLyogYnVpbGQgY29kZSBsZW5ndGggdHJlZSAqL1xuXG5cbiAgdGluZl9idWlsZF90cmVlKGNvZGVfdHJlZSwgbGVuZ3RocywgMCwgMTkpO1xuICAvKiBkZWNvZGUgY29kZSBsZW5ndGhzIGZvciB0aGUgZHluYW1pYyB0cmVlcyAqL1xuXG4gIGZvciAobnVtID0gMDsgbnVtIDwgaGxpdCArIGhkaXN0Oykge1xuICAgIHZhciBzeW0gPSB0aW5mX2RlY29kZV9zeW1ib2woZCwgY29kZV90cmVlKTtcblxuICAgIHN3aXRjaCAoc3ltKSB7XG4gICAgICBjYXNlIDE2OlxuICAgICAgICAvKiBjb3B5IHByZXZpb3VzIGNvZGUgbGVuZ3RoIDMtNiB0aW1lcyAocmVhZCAyIGJpdHMpICovXG4gICAgICAgIHZhciBwcmV2ID0gbGVuZ3Roc1tudW0gLSAxXTtcblxuICAgICAgICBmb3IgKGxlbmd0aCA9IHRpbmZfcmVhZF9iaXRzKGQsIDIsIDMpOyBsZW5ndGg7IC0tbGVuZ3RoKSB7XG4gICAgICAgICAgbGVuZ3Roc1tudW0rK10gPSBwcmV2O1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMTc6XG4gICAgICAgIC8qIHJlcGVhdCBjb2RlIGxlbmd0aCAwIGZvciAzLTEwIHRpbWVzIChyZWFkIDMgYml0cykgKi9cbiAgICAgICAgZm9yIChsZW5ndGggPSB0aW5mX3JlYWRfYml0cyhkLCAzLCAzKTsgbGVuZ3RoOyAtLWxlbmd0aCkge1xuICAgICAgICAgIGxlbmd0aHNbbnVtKytdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDE4OlxuICAgICAgICAvKiByZXBlYXQgY29kZSBsZW5ndGggMCBmb3IgMTEtMTM4IHRpbWVzIChyZWFkIDcgYml0cykgKi9cbiAgICAgICAgZm9yIChsZW5ndGggPSB0aW5mX3JlYWRfYml0cyhkLCA3LCAxMSk7IGxlbmd0aDsgLS1sZW5ndGgpIHtcbiAgICAgICAgICBsZW5ndGhzW251bSsrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogdmFsdWVzIDAtMTUgcmVwcmVzZW50IHRoZSBhY3R1YWwgY29kZSBsZW5ndGhzICovXG4gICAgICAgIGxlbmd0aHNbbnVtKytdID0gc3ltO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyogYnVpbGQgZHluYW1pYyB0cmVlcyAqL1xuXG5cbiAgdGluZl9idWlsZF90cmVlKGx0LCBsZW5ndGhzLCAwLCBobGl0KTtcbiAgdGluZl9idWlsZF90cmVlKGR0LCBsZW5ndGhzLCBobGl0LCBoZGlzdCk7XG59XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSBibG9jayBpbmZsYXRlIGZ1bmN0aW9ucyAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiBnaXZlbiBhIHN0cmVhbSBhbmQgdHdvIHRyZWVzLCBpbmZsYXRlIGEgYmxvY2sgb2YgZGF0YSAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfaW5mbGF0ZV9ibG9ja19kYXRhKGQsIGx0LCBkdCkge1xuICB3aGlsZSAoMSkge1xuICAgIHZhciBzeW0gPSB0aW5mX2RlY29kZV9zeW1ib2woZCwgbHQpO1xuICAgIC8qIGNoZWNrIGZvciBlbmQgb2YgYmxvY2sgKi9cblxuICAgIGlmIChzeW0gPT09IDI1Nikge1xuICAgICAgcmV0dXJuIFRJTkZfT0s7XG4gICAgfVxuXG4gICAgaWYgKHN5bSA8IDI1Nikge1xuICAgICAgZC5kZXN0W2QuZGVzdExlbisrXSA9IHN5bTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGxlbmd0aCwgZGlzdCwgb2ZmcztcbiAgICAgIHZhciBpO1xuICAgICAgc3ltIC09IDI1NztcbiAgICAgIC8qIHBvc3NpYmx5IGdldCBtb3JlIGJpdHMgZnJvbSBsZW5ndGggY29kZSAqL1xuXG4gICAgICBsZW5ndGggPSB0aW5mX3JlYWRfYml0cyhkLCBsZW5ndGhfYml0c1tzeW1dLCBsZW5ndGhfYmFzZVtzeW1dKTtcbiAgICAgIGRpc3QgPSB0aW5mX2RlY29kZV9zeW1ib2woZCwgZHQpO1xuICAgICAgLyogcG9zc2libHkgZ2V0IG1vcmUgYml0cyBmcm9tIGRpc3RhbmNlIGNvZGUgKi9cblxuICAgICAgb2ZmcyA9IGQuZGVzdExlbiAtIHRpbmZfcmVhZF9iaXRzKGQsIGRpc3RfYml0c1tkaXN0XSwgZGlzdF9iYXNlW2Rpc3RdKTtcbiAgICAgIC8qIGNvcHkgbWF0Y2ggKi9cblxuICAgICAgZm9yIChpID0gb2ZmczsgaSA8IG9mZnMgKyBsZW5ndGg7ICsraSkge1xuICAgICAgICBkLmRlc3RbZC5kZXN0TGVuKytdID0gZC5kZXN0W2ldO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyogaW5mbGF0ZSBhbiB1bmNvbXByZXNzZWQgYmxvY2sgb2YgZGF0YSAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfaW5mbGF0ZV91bmNvbXByZXNzZWRfYmxvY2soZCkge1xuICB2YXIgbGVuZ3RoLCBpbnZsZW5ndGg7XG4gIHZhciBpO1xuICAvKiB1bnJlYWQgZnJvbSBiaXRidWZmZXIgKi9cblxuICB3aGlsZSAoZC5iaXRjb3VudCA+IDgpIHtcbiAgICBkLnNvdXJjZUluZGV4LS07XG4gICAgZC5iaXRjb3VudCAtPSA4O1xuICB9XG4gIC8qIGdldCBsZW5ndGggKi9cblxuXG4gIGxlbmd0aCA9IGQuc291cmNlW2Quc291cmNlSW5kZXggKyAxXTtcbiAgbGVuZ3RoID0gMjU2ICogbGVuZ3RoICsgZC5zb3VyY2VbZC5zb3VyY2VJbmRleF07XG4gIC8qIGdldCBvbmUncyBjb21wbGVtZW50IG9mIGxlbmd0aCAqL1xuXG4gIGludmxlbmd0aCA9IGQuc291cmNlW2Quc291cmNlSW5kZXggKyAzXTtcbiAgaW52bGVuZ3RoID0gMjU2ICogaW52bGVuZ3RoICsgZC5zb3VyY2VbZC5zb3VyY2VJbmRleCArIDJdO1xuICAvKiBjaGVjayBsZW5ndGggKi9cblxuICBpZiAobGVuZ3RoICE9PSAofmludmxlbmd0aCAmIDB4MDAwMGZmZmYpKSByZXR1cm4gVElORl9EQVRBX0VSUk9SO1xuICBkLnNvdXJjZUluZGV4ICs9IDQ7XG4gIC8qIGNvcHkgYmxvY2sgKi9cblxuICBmb3IgKGkgPSBsZW5ndGg7IGk7IC0taSkge1xuICAgIGQuZGVzdFtkLmRlc3RMZW4rK10gPSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4KytdO1xuICB9XG4gIC8qIG1ha2Ugc3VyZSB3ZSBzdGFydCBuZXh0IGJsb2NrIG9uIGEgYnl0ZSBib3VuZGFyeSAqL1xuXG5cbiAgZC5iaXRjb3VudCA9IDA7XG4gIHJldHVybiBUSU5GX09LO1xufVxuLyogaW5mbGF0ZSBzdHJlYW0gZnJvbSBzb3VyY2UgdG8gZGVzdCAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfdW5jb21wcmVzcyhzb3VyY2UsIGRlc3QpIHtcbiAgdmFyIGQgPSBuZXcgRGF0YShzb3VyY2UsIGRlc3QpO1xuICB2YXIgYmZpbmFsLCBidHlwZSwgcmVzO1xuXG4gIGRvIHtcbiAgICAvKiByZWFkIGZpbmFsIGJsb2NrIGZsYWcgKi9cbiAgICBiZmluYWwgPSB0aW5mX2dldGJpdChkKTtcbiAgICAvKiByZWFkIGJsb2NrIHR5cGUgKDIgYml0cykgKi9cblxuICAgIGJ0eXBlID0gdGluZl9yZWFkX2JpdHMoZCwgMiwgMCk7XG4gICAgLyogZGVjb21wcmVzcyBibG9jayAqL1xuXG4gICAgc3dpdGNoIChidHlwZSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICAvKiBkZWNvbXByZXNzIHVuY29tcHJlc3NlZCBibG9jayAqL1xuICAgICAgICByZXMgPSB0aW5mX2luZmxhdGVfdW5jb21wcmVzc2VkX2Jsb2NrKGQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAxOlxuICAgICAgICAvKiBkZWNvbXByZXNzIGJsb2NrIHdpdGggZml4ZWQgaHVmZm1hbiB0cmVlcyAqL1xuICAgICAgICByZXMgPSB0aW5mX2luZmxhdGVfYmxvY2tfZGF0YShkLCBzbHRyZWUsIHNkdHJlZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIC8qIGRlY29tcHJlc3MgYmxvY2sgd2l0aCBkeW5hbWljIGh1ZmZtYW4gdHJlZXMgKi9cbiAgICAgICAgdGluZl9kZWNvZGVfdHJlZXMoZCwgZC5sdHJlZSwgZC5kdHJlZSk7XG4gICAgICAgIHJlcyA9IHRpbmZfaW5mbGF0ZV9ibG9ja19kYXRhKGQsIGQubHRyZWUsIGQuZHRyZWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVzID0gVElORl9EQVRBX0VSUk9SO1xuICAgIH1cblxuICAgIGlmIChyZXMgIT09IFRJTkZfT0spIHRocm93IG5ldyBFcnJvcignRGF0YSBlcnJvcicpO1xuICB9IHdoaWxlICghYmZpbmFsKTtcblxuICBpZiAoZC5kZXN0TGVuIDwgZC5kZXN0Lmxlbmd0aCkge1xuICAgIGlmICh0eXBlb2YgZC5kZXN0LnNsaWNlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZC5kZXN0LnNsaWNlKDAsIGQuZGVzdExlbik7ZWxzZSByZXR1cm4gZC5kZXN0LnN1YmFycmF5KDAsIGQuZGVzdExlbik7XG4gIH1cblxuICByZXR1cm4gZC5kZXN0O1xufVxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gKlxuICogLS0gaW5pdGlhbGl6YXRpb24gLS0gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0cmVlcyAqL1xuXG5cbnRpbmZfYnVpbGRfZml4ZWRfdHJlZXMoc2x0cmVlLCBzZHRyZWUpO1xuLyogYnVpbGQgZXh0cmEgYml0cyBhbmQgYmFzZSB0YWJsZXMgKi9cblxudGluZl9idWlsZF9iaXRzX2Jhc2UobGVuZ3RoX2JpdHMsIGxlbmd0aF9iYXNlLCA0LCAzKTtcbnRpbmZfYnVpbGRfYml0c19iYXNlKGRpc3RfYml0cywgZGlzdF9iYXNlLCAyLCAxKTtcbi8qIGZpeCBhIHNwZWNpYWwgY2FzZSAqL1xuXG5sZW5ndGhfYml0c1syOF0gPSAwO1xubGVuZ3RoX2Jhc2VbMjhdID0gMjU4O1xudmFyIHRpbnlJbmZsYXRlID0gdGluZl91bmNvbXByZXNzO1xuXG52YXIgVW5pY29kZVRyaWUsIGluZmxhdGU7XG5pbmZsYXRlID0gdGlueUluZmxhdGU7XG5cblVuaWNvZGVUcmllID0gZnVuY3Rpb24gKCkge1xuICB2YXIgREFUQV9CTE9DS19MRU5HVEgsIERBVEFfR1JBTlVMQVJJVFksIERBVEFfTUFTSywgSU5ERVhfMV9PRkZTRVQsIElOREVYXzJfQkxPQ0tfTEVOR1RILCBJTkRFWF8yX0JNUF9MRU5HVEgsIElOREVYXzJfTUFTSywgSU5ERVhfU0hJRlQsIExTQ1BfSU5ERVhfMl9MRU5HVEgsIExTQ1BfSU5ERVhfMl9PRkZTRVQsIE9NSVRURURfQk1QX0lOREVYXzFfTEVOR1RILCBTSElGVF8xLCBTSElGVF8xXzIsIFNISUZUXzIsIFVURjhfMkJfSU5ERVhfMl9MRU5HVEgsIFVURjhfMkJfSU5ERVhfMl9PRkZTRVQ7XG4gIFNISUZUXzEgPSA2ICsgNTtcbiAgU0hJRlRfMiA9IDU7XG4gIFNISUZUXzFfMiA9IFNISUZUXzEgLSBTSElGVF8yO1xuICBPTUlUVEVEX0JNUF9JTkRFWF8xX0xFTkdUSCA9IDB4MTAwMDAgPj4gU0hJRlRfMTtcbiAgSU5ERVhfMl9CTE9DS19MRU5HVEggPSAxIDw8IFNISUZUXzFfMjtcbiAgSU5ERVhfMl9NQVNLID0gSU5ERVhfMl9CTE9DS19MRU5HVEggLSAxO1xuICBJTkRFWF9TSElGVCA9IDI7XG4gIERBVEFfQkxPQ0tfTEVOR1RIID0gMSA8PCBTSElGVF8yO1xuICBEQVRBX01BU0sgPSBEQVRBX0JMT0NLX0xFTkdUSCAtIDE7XG4gIExTQ1BfSU5ERVhfMl9PRkZTRVQgPSAweDEwMDAwID4+IFNISUZUXzI7XG4gIExTQ1BfSU5ERVhfMl9MRU5HVEggPSAweDQwMCA+PiBTSElGVF8yO1xuICBJTkRFWF8yX0JNUF9MRU5HVEggPSBMU0NQX0lOREVYXzJfT0ZGU0VUICsgTFNDUF9JTkRFWF8yX0xFTkdUSDtcbiAgVVRGOF8yQl9JTkRFWF8yX09GRlNFVCA9IElOREVYXzJfQk1QX0xFTkdUSDtcbiAgVVRGOF8yQl9JTkRFWF8yX0xFTkdUSCA9IDB4ODAwID4+IDY7XG4gIElOREVYXzFfT0ZGU0VUID0gVVRGOF8yQl9JTkRFWF8yX09GRlNFVCArIFVURjhfMkJfSU5ERVhfMl9MRU5HVEg7XG4gIERBVEFfR1JBTlVMQVJJVFkgPSAxIDw8IElOREVYX1NISUZUO1xuXG4gIGZ1bmN0aW9uIFVuaWNvZGVUcmllKGRhdGEpIHtcbiAgICB2YXIgaXNCdWZmZXIsIHVuY29tcHJlc3NlZExlbmd0aCwgdmlldztcbiAgICBpc0J1ZmZlciA9IHR5cGVvZiBkYXRhLnJlYWRVSW50MzJCRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGF0YS5zbGljZSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmIChpc0J1ZmZlciB8fCBkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgaWYgKGlzQnVmZmVyKSB7XG4gICAgICAgIHRoaXMuaGlnaFN0YXJ0ID0gZGF0YS5yZWFkVUludDMyQkUoMCk7XG4gICAgICAgIHRoaXMuZXJyb3JWYWx1ZSA9IGRhdGEucmVhZFVJbnQzMkJFKDQpO1xuICAgICAgICB1bmNvbXByZXNzZWRMZW5ndGggPSBkYXRhLnJlYWRVSW50MzJCRSg4KTtcbiAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoMTIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlldyA9IG5ldyBEYXRhVmlldyhkYXRhLmJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaGlnaFN0YXJ0ID0gdmlldy5nZXRVaW50MzIoMCk7XG4gICAgICAgIHRoaXMuZXJyb3JWYWx1ZSA9IHZpZXcuZ2V0VWludDMyKDQpO1xuICAgICAgICB1bmNvbXByZXNzZWRMZW5ndGggPSB2aWV3LmdldFVpbnQzMig4KTtcbiAgICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoMTIpO1xuICAgICAgfVxuXG4gICAgICBkYXRhID0gaW5mbGF0ZShkYXRhLCBuZXcgVWludDhBcnJheSh1bmNvbXByZXNzZWRMZW5ndGgpKTtcbiAgICAgIGRhdGEgPSBpbmZsYXRlKGRhdGEsIG5ldyBVaW50OEFycmF5KHVuY29tcHJlc3NlZExlbmd0aCkpO1xuICAgICAgdGhpcy5kYXRhID0gbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0gZGF0YS5kYXRhLCB0aGlzLmhpZ2hTdGFydCA9IGRhdGEuaGlnaFN0YXJ0LCB0aGlzLmVycm9yVmFsdWUgPSBkYXRhLmVycm9yVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgVW5pY29kZVRyaWUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICB2YXIgaW5kZXg7XG5cbiAgICBpZiAoY29kZVBvaW50IDwgMCB8fCBjb2RlUG9pbnQgPiAweDEwZmZmZikge1xuICAgICAgcmV0dXJuIHRoaXMuZXJyb3JWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50IDwgMHhkODAwIHx8IGNvZGVQb2ludCA+IDB4ZGJmZiAmJiBjb2RlUG9pbnQgPD0gMHhmZmZmKSB7XG4gICAgICBpbmRleCA9ICh0aGlzLmRhdGFbY29kZVBvaW50ID4+IFNISUZUXzJdIDw8IElOREVYX1NISUZUKSArIChjb2RlUG9pbnQgJiBEQVRBX01BU0spO1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVtpbmRleF07XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcbiAgICAgIGluZGV4ID0gKHRoaXMuZGF0YVtMU0NQX0lOREVYXzJfT0ZGU0VUICsgKGNvZGVQb2ludCAtIDB4ZDgwMCA+PiBTSElGVF8yKV0gPDwgSU5ERVhfU0hJRlQpICsgKGNvZGVQb2ludCAmIERBVEFfTUFTSyk7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhW2luZGV4XTtcbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50IDwgdGhpcy5oaWdoU3RhcnQpIHtcbiAgICAgIGluZGV4ID0gdGhpcy5kYXRhW0lOREVYXzFfT0ZGU0VUIC0gT01JVFRFRF9CTVBfSU5ERVhfMV9MRU5HVEggKyAoY29kZVBvaW50ID4+IFNISUZUXzEpXTtcbiAgICAgIGluZGV4ID0gdGhpcy5kYXRhW2luZGV4ICsgKGNvZGVQb2ludCA+PiBTSElGVF8yICYgSU5ERVhfMl9NQVNLKV07XG4gICAgICBpbmRleCA9IChpbmRleCA8PCBJTkRFWF9TSElGVCkgKyAoY29kZVBvaW50ICYgREFUQV9NQVNLKTtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbaW5kZXhdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5kYXRhLmxlbmd0aCAtIERBVEFfR1JBTlVMQVJJVFldO1xuICB9O1xuXG4gIHJldHVybiBVbmljb2RlVHJpZTtcbn0oKTtcblxudmFyIHVuaWNvZGVUcmllID0gVW5pY29kZVRyaWU7XG5cbnZhciBiYXNlNjRBcnJheWJ1ZmZlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgLypcbiAgICogYmFzZTY0LWFycmF5YnVmZmVyXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uaWtsYXN2aC9iYXNlNjQtYXJyYXlidWZmZXJcbiAgICpcbiAgICogQ29weXJpZ2h0IChjKSAyMDEyIE5pa2xhcyB2b24gSGVydHplblxuICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gICAqL1xuICAoZnVuY3Rpb24gKCkge1xuXG4gICAgdmFyIGNoYXJzID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7IC8vIFVzZSBhIGxvb2t1cCB0YWJsZSB0byBmaW5kIHRoZSBpbmRleC5cblxuICAgIHZhciBsb29rdXAgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgbG9va3VwW2NoYXJzLmNoYXJDb2RlQXQoaSldID0gaTtcbiAgICB9XG5cbiAgICBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChhcnJheWJ1ZmZlcikge1xuICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLFxuICAgICAgICAgIGksXG4gICAgICAgICAgbGVuID0gYnl0ZXMubGVuZ3RoLFxuICAgICAgICAgIGJhc2U2NCA9IFwiXCI7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soYnl0ZXNbaV0gJiAzKSA8PCA0IHwgYnl0ZXNbaSArIDFdID4+IDRdO1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbKGJ5dGVzW2kgKyAxXSAmIDE1KSA8PCAyIHwgYnl0ZXNbaSArIDJdID4+IDZdO1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaSArIDJdICYgNjNdO1xuICAgICAgfVxuXG4gICAgICBpZiAobGVuICUgMyA9PT0gMikge1xuICAgICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKDAsIGJhc2U2NC5sZW5ndGggLSAxKSArIFwiPVwiO1xuICAgICAgfSBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgXCI9PVwiO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFzZTY0O1xuICAgIH07XG5cbiAgICBleHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIChiYXNlNjQpIHtcbiAgICAgIHZhciBidWZmZXJMZW5ndGggPSBiYXNlNjQubGVuZ3RoICogMC43NSxcbiAgICAgICAgICBsZW4gPSBiYXNlNjQubGVuZ3RoLFxuICAgICAgICAgIGksXG4gICAgICAgICAgcCA9IDAsXG4gICAgICAgICAgZW5jb2RlZDEsXG4gICAgICAgICAgZW5jb2RlZDIsXG4gICAgICAgICAgZW5jb2RlZDMsXG4gICAgICAgICAgZW5jb2RlZDQ7XG5cbiAgICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDFdID09PSBcIj1cIikge1xuICAgICAgICBidWZmZXJMZW5ndGgtLTtcblxuICAgICAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAyXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICBidWZmZXJMZW5ndGgtLTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgYXJyYXlidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyTGVuZ3RoKSxcbiAgICAgICAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgICAgIGVuY29kZWQxID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkpXTtcbiAgICAgICAgZW5jb2RlZDIgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDEpXTtcbiAgICAgICAgZW5jb2RlZDMgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDIpXTtcbiAgICAgICAgZW5jb2RlZDQgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDMpXTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9IGVuY29kZWQxIDw8IDIgfCBlbmNvZGVkMiA+PiA0O1xuICAgICAgICBieXRlc1twKytdID0gKGVuY29kZWQyICYgMTUpIDw8IDQgfCBlbmNvZGVkMyA+PiAyO1xuICAgICAgICBieXRlc1twKytdID0gKGVuY29kZWQzICYgMykgPDwgNiB8IGVuY29kZWQ0ICYgNjM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheWJ1ZmZlcjtcbiAgICB9O1xuICB9KSgpO1xufSk7XG52YXIgYmFzZTY0QXJyYXlidWZmZXJfMSA9IGJhc2U2NEFycmF5YnVmZmVyLmVuY29kZTtcbnZhciBiYXNlNjRBcnJheWJ1ZmZlcl8yID0gYmFzZTY0QXJyYXlidWZmZXIuZGVjb2RlO1xuXG52YXIgYmFzZTY0RGVmbGF0ZWREYXRhID0gXCJlSnh0VnR0eTR6WU0vUmMvNzBOaTk3TGJOMXRKNDlTWGVHSTNPOTNPamdheUdCRVJSWG9vMGg1TnAvOWVBS1RjcE5PSEVDQUZBZ2ZBQVoyL0prY0lxbkVlVlQvNTVjOUpjWng4bW56cmFkazVXdmE4M2NsVzhiWmpyYVpseThzNjhsbkxaMnkzTnJ6bGEydGVka2hMOGNyR3NtVnRIWGhoTHh2TEN6dmQ4TjB0My8wbXk0bXZjY2pDVGI1L21oeGRWNkZGMnhRRytqNmgzTHBRUGl2bmErVVZBNWxYN3F4R1dUNWpvem5PUWhsMzRkTVE0S2hWWFg3OGZEMGU3WjdPeWhzWVNIdDBBY3A5clBxanh4UGIzcmxZR1hXMXpOc3hyQnovNjFlaXJOVXJiNHFpdUwzSjhqYkxhWmF6TEgvSThzY3NmOHJ5NXl3L1ova2x5V24yTjgzK3B0bmZOUHViWm4vVDdHK1c3V2ZaZmpiYVovL1Q3SCthL2MreW4xbjJNeHY5TUs1dGJBT1FmRUVQSGFRUG43UGhsekhCbXpHem16R0ZhdzRqMk5zeDJ1MEk3MVp3ZmV6VnRiYTVtbG1zd0VMNTR2QklyTWpZR1Z0cUFGRW10UzN4MlhXZFk2cXRJU0RMaFR1NXpyMHlJeCt0Vmg2RE1PakJLOVVLNTA0Qm1aREY0TkVZVWVlK1V4YUJieTlWNVpWd3lrTWxIL2RrQjZ3Y05CQXNMbEVyazBQbEllZHlhd08yQnJHK1UyY3lhdWlMcEdZYk1LdzlSTi9GVmlmMURUeGhaVDU2SE5qaEFUcmt5VGdvRTV1WThyZFFnM2dtd3RJZlQ5UWVyU1kxUVVGSm1ZRWNzRklaeGdDV1FIRVFtcDBtWndTMmllejlQbWgwcDVRNzFjVzFpc3RmRU55YUxMa2ZIaHUwd0xaUGpaYVF6OUhLaFFPbFpGeVQzRVhyT080aWFxelR0d3JzaFhHdGRLYzQvTWJaeHBrVWY0MWRGY1VNcWN0Y1BuVXBaUk9sL1pGaXFsNWxpME9LdTZDeTVkTjlwTnBtZlFFQldxSEo2YWc1NEpNcEM0MnRGTnNEOVpPdEhneHc5TlRtQTc1U1RvMU8wSGtsWWplcGtTdDJsOVEvcEo3WU05SVhLZTRDdWloVkg0d0xXRzZoa1o3dU5EUjl1UU5oUVBUUTYrQ1Ryd0YwdVdhVFovVUd3dHZmNER3aUwxSmVuT0lMS3ViNFJxbWdzTnpBSUx5MDBSaUJZQlg0Y3NIcWNFd1ZMSWhOb2p5WnVud01rRWo3NEtpZngzeTZVNzZUemU5TXZmRCt2RTkzN3dpSGw4QjdEZWZzcisvQUNnUHZUUVY5RGhhUDBBc2g2TXlPUFJSVWN4bWJrMGZIZmg2N0UwMFhtSExPTDRXRTNJSHBCcStzdEJrcUtxL0tIS1FpV2FtZW8wbkxlYTJIT2lrYllpT0RMcGRJV21PR2srN2ZIeGVSc3BESFlxWEJPeXE1VEJJbnVIY3g2RktHOVZxaXJmTWZ6bWc2a2VpU29NelBxay9UOG1qVE00S09PRThkcFV2NHZ4KzBvWUl4K0I1TVVQN2RDVWM3Uk45ZTY3Mk10aG03UllUVUhRbzFNQUhlTzArL09vN3FscDQxRFcyWGhsd0RVUVpUYzN5YS9KVjJiMExzVFRRaGZWenBXTU9GeGxYZU03QkJadUNBWGtkNXMvZFkxNGxuR3lkR0IyaUZ0SFB0K1BRcitiWk5XYUM4UGp1SXBOcHlDVXo2SWxxRnI4NnozWDB6VVBaRWdZLzltRnNJTXRYLzdaT1g1NEIrdk9uUkJpMnVOVngwdWFTWG1SUGRvRHhVZC9GazNDQzEyV05qdnpKUjAzZGxhMVd1c0lVMklyL3ZDaTd5WDREUWlDTXplT1lSL2YwNitmNzNQMCttcytrPVwiO1xuXG52YXIgYmFzZTY0RGVmbGF0ZWRUcmllID0gXCJlSndCQXlIODNnQVJBQUFBQUFBQUFBRlFjRjE0ZHlDYisvdjI2WEZLaDNGb1ViR09xbG9OVlh1ZlVxczJ0V3FFcXRvajFBNTZxclZKcTJyVWlFMWJoRm94VXpPdEZYc0ZRV3BHaElhRUlIbjcvWDNmWDN2ZTk3L25lZjU0UHZmbkh0ZDEzUmRoOFhMRERUZVg1ZjN0MEdCMGxKd3NkNkR3NVFtR1l1NlhZZnZMWUFqaElBSGF4a1JXdXZpa1IrS0pWOWhqMVg5NnAvczRRWWJvdngvbEJyTUFwZ3ZCMm13SUExTkVqeGJyVFdPdU1xYlUxZWZkU29DOVlEL3N1VDlpRTZUK3JPZjl1b1A4MExsTis5QmFjUGFoUHdpcGpEeiswRW1oV0ZtRkJtTWoyMVRGZGNMNU5MczA3eHBMM21kUEZuTzVPRGliZHNlNjlqTDMzejMrSzVROTJCNnNqbHV3QzdVdnZvTTZ0eENuR25BQjFPY0M0Y1VmQ1JYMDFvZXg1cVFVRDYyRzhjV0QrcitHc1k5OG5nc0RMajBqN1ZrN0pCanVZY0s0YXo0emdWazBrdkI3UEJDdWp3aiswRlZEQkxkZVlha3hsaFBEZGtYekg5SDlXd1hhTnorSzVkYWVGMTE5a0pkV3Z5ZXgwNXU3ejNYS0dJS3pPSlZhaW1WYm9leUR3UHdhc2J6N1dVZVNwOEI1QkJQYnNoQkVFTHBxb0pZTUU4NjN6T0M1NWN4ZWxxZThMckxxNXNOOTRyYkt1ZE1OeC9Fai9zaEtQcFZNd0VLampyUWh2OFA2bzAvWitESWdJMzBiTDZXVGpwejR1dG5yWXBBSnlOVGcwejgxT1F1NjBQc0xDVGVzZE1TZDYyc1RPREpyVXdoaU9MNjhaTkoraUVQSzRGN2JveFAxRDNOTEp3bVVWZUVqSlkxRXpSNWpwV2VZQUNiV0ZVTUVHN2FYTXJuVWNuQUJBMTBSUDJWR3ZScVVIRkF6K2Z4VmljVjlkUWNDWC9LZWkyWVk2VGsrQ2oweWRrZ2FCSjlmeWxLRWE4NDU2YzNyemRLVk5GNmVLVDJMUGVMVGdDSjdadmFBLy9kU0c2L0VBNENyWVhrdkpnSnVqdlI3QjdDTzlCMkhxVXIxRTVjWHUwL3EySkJRemMrb1BleWU1NExZT1AzM21EUjZJcktidjl0eG5Hd1RJSjIyM0JaMnpYVFpjNnlmcmgzNHB2anhTK1c4MnE5RHFqbEhPa29NN3NrTk14eXcyQ0NHOWpibjBFNzlTTjU5Z1N5SWFBY2NXKzdBU2V5TEQ1Q25YYTdwT3p3aXprSVpFTWJqV3J5Z3JnNmxGSDlYeHlPaDZDUjZjbTlLK05LM3hPUnVMay9NMWoyZm5pMmx5L0R1ai9zcTdleiszWmRDVm1iY0k2RG4vRjFQcnAreUxyMmt1RWhycEdoeVlHS2U4d1pjOGVOaVRWSXhnV0ZxWGJSdlZQT1F3RHJjRkZzRm45bGFsNTQ0Rmw0Rk5jMU55aXNxdms5aFA2dmlTd2RDTUFaS1hQWjRodHFiVERsZVdrRW5RSVVVdmQvMVhGUUtuNFpJZjN1d21yVmFaUmUwQzcreDlJOGlEbmdrMzg1Qy9DeUM0TE5aWnBpTjErd1YzVE00NWFIeE5TK0hMQ1JLcjJpb1BZc2Y3Y0lkWGZ4UjJzUG9EU09KcENBeVplYS9CNGNCdnlQYU9DdUdEcGY4b1lPRzY2dUgzMzlFRXBaT3pBRUJ5YUVjeUlzYkt0L1JXV1M2N2dJSW1kK1FESjdMT3c3eVdsU2RpNFkzQ0g2THplalF6WUFuSDduMndqNVhnSVZabHhYMGNtTjZhSTVIbDNaUnNVY0NBbDNRdlNHSFU2am0vYkVIeitNWVZhZzA4QTR1UXUzRndST2RjSWFhcnF4WFM5MGFOVjJFTUVaMzZWZHhrbURKNk9kck9NNnlKUFRxdWF1bVpobU9DQzYyUXV0bCtUOHpqSk8rQXlDL3VaSHBXUWxJNlVkekJySm5uaWJFd3FINDBrQ1krNGx5SFYzRmlRbHlBYVluTFBNUW5hZ0E2cHJ2ZEI5WnFCbHVnZFlSWG5mK1QyYjdUWE9nTFhRSHlBREpjalJtQ0U1ZkpRZnRuck9vNnJsWngyVy9IcG1HTXZoUGYzTCtaMUk1OHpZK1JmdUxFTFE4S2d1VEpNMTc1SS9FYW5wZ1NhMks3SUtmNy81bjJQVzlLQjk5c0ZEaG96VERHTDJOV1BVazBmMHF3N09OQTdsZFJhdXJkV0s3T3FuWXNodE8vZVJIY0VnTzRjZnNuVjh0T05SY3pnK1RydUZ3MHpRNmxZRnd3THFqK1Q3N0lyUzlpR1pqQjV5dlF6VDMyU0hjM24zTE9OSElXNC9DRnkwbmo4VnBCdkRCcUtZa25sdkw1NVhPVitCdXRmOE83ekU1NVQyVm9LbEhreEJPa2NnK01uRmxNVXlUWEpUbTNkY0JHUTBEWkJ6ZnNsWWZXREtoOGl2ZCtJNjhmeW9QTWR5SmdSMjVxQW1SWVRkcDdyQm95L2JNMlJmQVhDWmtuRW5wcm9IMkpDeGpRc0YwT3BuZisvc2RNaWlSUDZ6ZXRLTTV4Uk1ZNHhwMEtwWDNuUFF0ZmJnRVBQY3NxQzVhUXpHRnJvOFYvRHcxZmsxamlLd0g1cS9SWXpCZVVGbVI5L2RWV0JSWitvaEFqOUVWSzViNUVpWW9DaFMrUHRjd3IrZmVqODUyUzNOaHZnbzQxK3NqZnVZWnlyZDhaQ2lndnlGSmUrbEFHZ0g3SXFzdEkxemVVM1gvWmw1ODg2cVd3L09ZMUI5UW9KSFFvUlJqQ0IvQjM4dUhMc3NmVlZZRy9VQTU5T3FUMDR0K24wSExYQkJBVEtyMDhxQTJWWVUxK1Vpb2FrVUcycGl0YStvTHBrRFJiNVJQTCtPR3BBS2NWdi9JUytFR1pvZTdTNzFRcFlQcVJsVk5RWDFrazNad2x4cWREdHlIQTdOalFzSG45bDlhNUhMWFIvRXNKVklpRHRaQ294d2JsMkhFQXhkem1xdlFOdkNUVk15T0dFWENrMjdhRjFiZGdyMnhtdHQzMGpkOTVCODZoR2V0b3pjTFRaT1AvOXJGcWdPeTJyaWo2elpFVDdDWGw4SmoxTS9qa2ljVXJ6dFVqTFJpOSsxczRJMXBKeEVDL2Vickoyd2M3alM2M1I0Wml2d05HZyttUTVSTjZNV0NTSVQyUTNQempGc3FaRU5iRHN6ZzlTVy9OZEh4KzhxSlY4ZS8vSlhNOStDYitiUEpwVSs5UnBGRm4rNndyenNrUGRKb0MvaUhIV2syZHJON0o4YnVBTWxIS1lLbEYzNUhxeEM1NXB5dVlqaUZIZGVPeEh5a3hhMVdKVk9ETGQ4Q0pQcnJMRk1EQjhXdDNsY0lEWGdYMTVocnZxL0lQWVNyZDVOZDFId3pnWUgzckIyQTRhVjY0aWlFR2ltTCthSE5WeGVEcEN3SGNzZkFWOS9zTThxTTlOeEFUUUxoN1c3MFpKajRZMVZ6cWwyZ09ORXE1bXNKeEwrQUZuWHJlS2lvT1pwR090aU9HVlVhT0kxMWhhc0JDMU9DSXZ2SzB1eVY0U3BPYnQxcHFqdEhDd09iSDZSdzcxVTJqMmNNRHhlYjh6ZTBHc0tlYmlTZUtNVk9menZtaTl4WGdiZFAzNERFK0VIUjVzejJNVXBURnlrekYwcGZmQm9zVExJMXRkUXBrSGc5UWNDME9ieG5UUklPRWZTUFVYVXJtc2tLaFprL3VEODhKcWtkTkRyaEpiWFZHdmVud3FJcDVtVzkwZWlSNm5YeUI5Y3ljWUd0d1B4UHJpRGx2MjhkK09xQjhBQW9yM3dOZytRME9obUFhbXoyajN2M3VpWjRDM20rS0FzYzkwNUplcWk5Mk1POXpONDZyVnBqdTdkblBCYlV1UUN6alByaitUd1lQNk1oQUplcGVaSEUyNXQ2N2hGUkJxaEtEUkQwNXFVa2hQMUo2VFhodlcrZnhGUi9Sd1NzNDBrS0s1ejR3eFhVWXBVUUNjR2xNRlh6VWhEeDBNTlJsMGlPcXRHVjF4VTlRYkc4c3FEa1ZKNkRPcCtzZm50MnJ1RVg2c1k2Yyt2TFJwand6eDE1RGt1cDlwRzY5a3hEaEk3ZUUvQUZ2UDZweU5ac292cHM4bG0zVUpVd1dEWWJyYUQrSkRXVWc4aU9zUVpSbTV3VXhXNThlSE5sTm1ic3FsQUdSNk1HZFZGZnZPNlcrS1hrL2hablB4dWpxaXg0aDZKazJablMwL3BIdEVZTDR3UDdxNzVXcm1WWTdFdmd4MkMvOVNUYnRaYmY1SnQ0UFVxR09wdm1vd3BHRVlwQXdyNHRWTDJKY0UvYzNPVDZTN2s3WDY0emNZWmYvWXVmSWZtYXBhODhXVDVQNnBFdlpNU0FkQnFpSEZydCtzWWp1K3BweDQ2QW5uSTk4Z0xLVktBRUVUSXJKYnQwZDdOb3FQSGhOR1lXNmRVUGRsWWZxSXBuYi9NbHZoN1B3MkFjdHNQNytzR1d2ZTJSWjZpWVRoYTkzSWZERjlRS2NwOXJGL2NmeHY1cWRJc1M2Q3lZTldKZStKR0FvaEhuVlJHV21mTWVvN3UydDdsNHFVVERJRU9LMkF5dlA5ZzV3a08ycVE1bmExczF5blVXMzNLekJDQjNvRjZCOExVL3lRemVMZU5RMi9DM1AyeUQ3N1hUTjI4OEJqNXd2VTdWYkpBZzIzTnNLQzMyQSsxQWI4a2ZGeU5yUnhTNnJCVUhqZzVJS0lTcDhkT3dQSzFMbm85ZjZiQktmQmQ3cHRKdXZRb0FQSFhNS0UyTGZnTjhJNUJ1RldPOU53K1ZxS3g1SzgwRWwxbnNrQmgvbUY3dTJNemlPZktkTmpaRm95MDhkNWp4TmZaeGJUak1OMHRmdTJHaEx4eDdLOURzdGQ0NWl6T2R4WGZwVlpvSnJrclBLOEI4WHo1bXV6bG9KVVliQSt0QXdWTWdkTUd1bGJTK21hTTd5QW5UM3hrTlNUM0k3TTJEemJTZlRLOXNlb0dVa2N2eVRyQlhZbURJYXkwQXorUFhzVWxxbDE2bHBTN0UwOFB5aW96Q0xRMTNiQmlVQjE5V2M1Y0RrUkQ0cDhXV0FNaHdRMmJwSENwcXFiajlLV1N0aWVsaWh3eVpLckszNlhOcUtKVEsvT25MWFIyQjgyYnhNNllDTTI2ek1sNEhIMldralljc1M5cGhUdXFVczhybjJ5b24zL212b0dhTXZBMUlYdk1IL1pqYytuYTRjZzBJS1k4M3BRQXFxb2t2K3NkMC9wVWt6ZzRhTzlCT002V2lMbzRKYkRRaG1LVWRCNGlhNlVVY3pLWjJ0S3VyRzlsNVkzTFdyVWMrQ2pZZjNLWnVZRGplTGZwU1RxMngwY1lxTkQvZlFkOFh6SWtBRks5NDZldTdYTXFWWDBxZU5YWjhqV0RDRjU0bHhlc0loMXhtV2NjNE8zREpWbThQMnQwMHloY2pzTXpyK3B0WXlVZ2JHbTdCWEtXeExkZ0xpQUxlcjdIM2NSbXhOZmhSVUpNWEx6UVl3c3NIS24ybHkyajNyZkE2OUhjSXlxWEpzaUpmaFRBNWtlWkxsWVdHNTBaamh0cUE2MHRQMUtMejNMb25FOGVYL25LckhsM2ZuemZ5bmxzWENZSUZmYlFSWFQ0YU9Hd2ZWRUxOeTltaXlvYjNmMTMzODNSL1laRTJrcjhmdys2Nk81b3A2SjV6TzdpL1NKSG1GWHBhWHA1cVY1NUZYQ0FHcUsyUjIyZSswclBuVVRQNDNGZWJBV3EvQ21kcnY3Ri9EYTgwdnFKOHpUU1VEOTNHWHpOWUtHOXVBWHhUNThqUG9wenl3YmlGSUxiV25hTE55dGJtVUQ4TjRIbW5ydXMwVVpaeW1mTEtEUEZHOTFjWWJyZDA0QXJxMm9rdC9SKzNaalB6Z2thL05kRUdpazF6V2VwcGZVd0VId0wzRlpGcG5wOUovYTJqcWd1WXNRVy9OY0l0eVhxZmNzbWEzOTFSZWdUU0VvV3NtNVhueDZSL1pBTU1SUXo3MmNIM3lWU1A3SDFqSnNJOTN1czNVbXhTeEhHZy80M2NiVXN0bEZ6R0k1RysrcWVFeFMySEJiazU2dVo5anhUQlg1WHJlZmlCWnNuWExHcWxlUm1aRkxxQ1E3REVIMmFmT3NFQ0lZMENXYlUzK29CRjI0WnNkOTNpMXBqbnVka2s1bnYwdDNDZE9yMnNiSUlOc3VQMkhRVEw4eldSdUd6Ymt4clhBRTlzYkl2QXlpQTBWcGx4aHZRMWVpbjgyeHllQWtOUnNaRmZJN2JPaXZxcHh0RE0wYWNCaGozY05zTnFJK3phb0RPdkgranhpeVovYzBzVzZFNmJ5c0UrL2RaNFkwUmhJYXh4YmRybW1uRlp6SkJBRkdpQlArakZvYmZ5UFB3YTRQM2I5NFZNa2lHTXloMWQ3YUk2NWttOUxQYnpVVExlcUNyWjh3ZkxtZXVadTliK285UWVzdWJ1TWN2NExnTDZaa3lVY3Q1UjdRbVRmb2pGNGMvRFBzOUhmSWhtdG9lV2I2dlc4dHFzTUM2OGxILzZSZk1TeHZYckh1bkRpMVdlY2NtSklsV0I0ZndMWlFjaER5cU16SzkxVmdjKzFBbld1bS83S1o4VnNEV2haWjZVT2Z5d3RlUDg1UXZtYU5YSkw5Q0JEcWVKQS8wOTlQaTMwY0pkRHpsalhmcTB5dmw0aFdDOUVzOEVnTXBrNm9BZGVzRWZjRDNlU1A2SmNaR0liNXZuZVErVkpnYTFWb21tNVBRNDE1Z3hQcHpuT0hIdThZREJyeUZvdDg2bEJtL1B2QWRWUk9mLyt5R1NudGZjaTNnNnJlem5tM1VIMHhhdWJtd3d2SW5zUGZyVnNDTEUvUW1UNENTNW0wdnVaaGVtUnNxWTFEQVNaU2hTSHA5Q0JvK053eEF0TnoxVE95YUNmclQyYVlUYXpjc201bGF6OWIzc0RKcTFadFJYQjVvVVNjRisrWHFOV0Z0ZVJCLzhIeDRwOUJoeXZWcTFuTVY5YzFKTXNBS2NpaEsrNGNVbitqUFE1M2I5dEd2Mk9BUStJMXMrR3pNYk1LS290TUhyd0ZDK2RJeGRWcHRwRk9kR2NyMnoyREZoOHkxQUVkYk84TE9EeW9tbkU2ZDJSVkdlc21QckRyK2d1eUZxbHltdUNoMldyQUVvQ0xjZUxVV3laZEZwNkxkNThBV3ZTV0t0VXdqd2dlZ0cwVm9ITmdLV0t6dkl2UHlhdHBuZlNWQ0Yyc1RqWHY1cW91QmtEWW1WZ0pwZ2hGUHFyR0ZDaUk4UTVtclk3cEMxNjNoNnZ4QlU3ejY5SzkvMjdmZlUxb3NpZzJlaG1TZkVXeFNzR29Qd2Y5bkxIVnZtdWI5bXRjcjFUc3R3L09tM2Z3NUh6NyswYVBLd0xJZUhOZjR1eDZDLzF1a1Q0MS9rTTRTKzZYSTYvWFQ2U0R4c0hxRTlDS0QvaHl5SzhvQ3E4MXRwaWtYbXYyYnJONTJTMDhkeWFsZFo3cjk2OXBmbUxoNHUzQmlTZ0lyV2F5MXVHSW9RdUlxcmw0NDhpQmlSNjJBcHlVL1BxOUIzSlNsaHcyKytZNVRuOWhXR3k0RGx1VmNHN3NGQ0l6OUhsTWdjTndiWEZCRmFBOXF5QW9jMW45a1BOZWorM2NHKzMwNTd5OUJSdHdVN0tUU2lCbDJSdDFkdXhuL3hFM2tXcVM0Wk5vVmZnMWJRUFhtUVUzRTJhclJqcG1IcHlwM0RjN29nckliVUJ1UlFwZTNla3BUQkpQWHNjR0dtakk0NG1XSUxQWTA0WEV6VG50M1B2WnRhT1BQaGVtWC9obHpPQTE1U2xKOVZDOGNNQUgyYVZFZFlrQTRSSHcrUkpnaW9qUkxRSm9TUEZmcGc5RnZFZEthZkgraXZMMjVaZmJPWmZGdDNNM1YyZk5EUWJSbnBQdUVPVXkzNlpGLzZ2bDJ4N3BmSysrcUdEMW5sbk5BbGhWa3lLSGVaamViSGtNVXdkUU4rUEdsVWVNb21wWG9UM1VPdXZWWXA1dnRSYUNCZUViS3A0VzVQUVk5c2ZHOHlMQWo4bUM5ckxBVlhuZ2Qzd0FSdlB2ampqTFF4N0d0MUgwL3dmb1F0UGl4NzM5L1pBU1JCN01EbVd4YU8xS3JRd2V5NmFHVGRwQTF5SnVhcmd0U0dONmZ4TmxwNTE0MzcrNm5jZTFwZ2MzNTZEcG5pd011MmdqbGluQmt4aDd3aDZPMHhqMThzb3dGWGNZbUNONGp1UjJYdEZqRWk2ZFRHNXRJR3k1OWF3THRDa3NDemFyZWpvZU1aMmlUdW14cVdyL1Qwak9QUThPd3dPSEpXNDc3UDRzVGF2WmJrdmR0YkY2Y1F0T3JEZXFZelZRYXFGZlZndW1tMWx1OFJ4dGlzRTlNaXozeHlaRlZYSGNjWFB6UExLS2luOU9IcVI2bndENFoyemExK1cwNmVJNlN1aitxVUlGUWJHN0twWS8xcVNOVHArbnFXUVBsWnJUZXVXYlBLdkVrd1pEak9zYzBGeFFrdHhEZVhabE5Nck5VR1VJeEkxRndCRDdWZ2Z5dnlVM2ZWbk5KSndjRStiSkx2NWhobFZodnJmZVYvWUdRYWtmVk9xS0NQYjkyOEZ6eWJBclQ5WE5jKzZKMHZoQW5xbUVuOGg2YmlOK245eW93cEcwYmk0emwwS0Nrb0tkbjJId1YvV1l2UHlUb0pvOEpKbFd0NWJ2SDUvck80UDV0R2xxRXhTOURZYUJKWjRrckdybyszSEZ5WkVlVGU3TG9Ud3J5RDJWZm5aanM1WWkvenlTQXo4cU5MQmJDNmplU0pDVk9ET3F4Z2ZGS1BSc1VXc2FYMGdPTDJ5bndCaTNjd2ZDR3QrRmtGb2E1ckY1U3pnTTlZb2pTMG9rb0Fsa0Q3eExjWUZRb2FQQnVXRHBmRzdXQUlEdnhrc010VjEwdGVra2RnejBCb2ovVTFDbzVRU2dXVEZmVmhMdHZNQU4ycE5CN0EzTnYzTG1sNnlha0NPMGpGVllyNnU1Rlp1NlhxQWl6eHo1eGczZ0ZuYkp0Q3E2M04vcktZdlJjNVFXNG15RWg4Z0ZVUmdkN2NyV2g0NzV3aXV5WVRMZDZSWDkwL0lOMVF6M0kxYXZCb210NjFmWSsyaEpWbUpoMy9VZktsdWJOZVNtb0V1Ny9acDVPbHRoSHlpaUNGR2FGT1J4dnNJL1dlZWlQWkEvbXM2UmoxOGVSaTJOZDRRVEJVL2VLYkhVa1B2b2xhalpKTHN2ZEZPTnh0bC8zQzQwaHdQVUZRTE9MZGtYblQ0cG1kWllEUElmc0R2N1lHMzBuRGNkT2Y2TGVKUTdSRGtnTmJRcDRoRWhrR29yaGp1cHliWmdKY1V0d0pYMzFPcmpYUnNoVjYyMXRKRGJ1aTdvRlQ3eCsvSFBSdXZ2WWt3N0hjUWJzU1FOS01EUVBrNEJlY01hdTB2REFCMU9QeGI3Yy9vSXZUYTFEZlVpeE1mNmhITFJBTVhOMVZDQlV0NFpKbmpreGJ5dnJRRzdlc1p2cGZVVmsxcktzVWMzMGNhemtWVTQ1b0xKd01kVmFzNldaQmZIUW1SLzd1ZWlSeWF6VnIvL2U4aEppWGJ3THVOSTJJSDNMc0srUTl0OXpYT211SEJrWHBOZWhXeUVDNVYvcHN1MW5YcVJ5cldhdk1lWW1ncnNIYWxQcTl3SjBDM2k2d3FqQzNJSW1hRk1wOEYwOFNkaEkyaWExZFVSTUkwb1hMbEljd3VjTDgzYnhlWEFUZ0JPRng4Y1ZGdWpsaDhtWVp6Rk5PeFptU29yL0liSE9hSjloRE1qWWFHVGtGZ1dxMVdGa3cwNWZpbkRJanNWMG5nbkorMmIxS2dLcXRxL29LZ1lTZkpQRDM3L2R4ZmNaWE5ncHlsMnU5VXdCQzJXNW5XRlUyVW1odUNWVjFOQTRkdVI4ZDlkSWJHek15eFk2R295NmRhU1lIcFBsRHV2SmdoeVJtNzg0UVFsNlp1Qyt1enVxazB6N250ZmRGNDd2WW1sbWxibmFkOTRMOUV6L1dtT1c3ZkxMMGdxRUkrbVB6L1pNV2gvaG9uRlhEUldZdnc4citVczVobkpBbTNSSzR6WkgwOEY5cjJIS1VXck84WGc5SjFUYzUzVXVSUzhqODBhbitUMGt2SmpJZDJQN3VURUtkR2trVm1XNDNtaHZ6MUIyMUdJQXl4VVNuOGcya0tLYWhBN0ppKzJjakgvNkE1QUlybWJoTVZ3ZGp2WWlQOGZJenRxaktvVkY5anp6c3I1OE5yMUViNXQvWEZad2RFQlU5WGh3dnZieUFoWTJDUUd6eTA4Qm9ZelpnVjVTbTBTWlJkTWkyRlphYlUvbnYxVVIrNjJqNndGWGlza2JjdWRPUjJLUlNpU2hGWGVLSk9zQnJLUE5kaDYyTjV6d3A4OTNTNGJmVzdVMlF0NG8ybk02WUZLZHdzZ0tPNlQ5MjlicW9jeGZ0ZjZFMHZvUE5yRDFHMVBuQmNld0JQNW5DK1J3MG1KSjIvSzU4WlJSVXc3VVdIRGREdVd5azMwRHlYNmdLYXQycWMzeGFnRWxVZ01KK3h2NnlDWDMyRWR1aGx6MWFQbEtaVWsrNGl4bzFGMHlhd25tSldyTXZrVXladnNIVjUyQ1pnQW0wSUlld2orUkdndWl3N3lJakxYeW9sbkNrcVhudk12KzJVZ3ZqMmVFdXpYNUlLV1B0Z3B1SU5jaHBLN0J6SnVUWitKY2R3SUJZOStZNmh5TXhsQjJYMzFOTFNGRzlKemh4UFlJSXNzNVlOOXRCR200OFBsdktwWnk4K2dmbXVkVkZEWWZPb1VOV2ZoZmFJZTRkOW0vd3dSZlBwenUxQ2xBSC9kakdvSDUyR1k2NzI0M05IbmpoelRDMkVJR1U3dzhidFlhUFl2NEJVLzRmLzRjckk1RGpsdzU0MytHV21CUFM5Ry8vQnpaTVdyaVJmU2FkVE10cTg3YVhvNzExOXVWK3UrWWdmL1VNcnRDZHlTK0toeHNJTEJlb1N3VmVrSkFkZ0Nobno2Q0xsVHFweXRaYjVWdEZYelQwWm9vZVhSRDA0c0FUTCtwOHNTbmhLVFZ4OEIwa3NHREloWGo1RDFUY1EyS25XY2FzMWl6eXJtWmN0VUZaSjBNYm1OUHZzNk90dGg1ZE5YaVZZMkRVVEp2QlYxMFFuMkh3cDMrUHlVNlgwdzVLU0YxUTd4Q1pMS3B4SG83U21ZM25CVGNYd09TaWF5VGpQeVBQMUN3czUrTmYzK05xbzRqN3NrUUdqR25JK3ZyQ2M1Ym12TmVyaWZLa2p1OXB1L0w0N2ZDdkQwMEh1ajRRRzRKaGMrVkcvc2diL2VzM29IclNnNUR0MXBJd2dOcWxCOFgzellnSlZvcXI3MVJtdFdNaTM3QytvVVorRXlDZFhCNHlXMVhKazFQT21JTmlidi9UbVBjTlp4RkRUOUhVTlFDQzBJOThUVHM3VDRvaDlLUG5XcWtoY1ExTjBsaFdpWW14UWNSTHhtTlhjRVE5MU43RFVvSDFDVmFuckNja0wwOElZU0l6OTdYWjB0WWUzUXd0cXQ4Rit6aHF1NGc4bWJkOWUybks5cTNyZGExaUI3RWZzTkxxY0x0enlvTGVYL29ES1lyb2wyTTY3ekVEWEJNdHpTck5iNXFZYTFXUFVnQi9CWHFNYmpRa0JMV1hQSVNENHhXaUVLOUpad09wU1F2eFFaRHZJZTVHQjZQaWV3NDJsUld2K3VjamlxS1orYXR3WWxmZExJTlRKRnBMUHlXZVlJd1hzSDZydEpBcmxPWmNCR3l4OTJ5bnZOV2kyTUhoZDYxUHZZalh1cnBmSHZueXV1b3hhY1BnYnYweUVvR1JmaVJ4MmVncXd1UFR6Yi9IeEZRWkRWS2p5YU5zS3ZwMXNHaytmSm12aElUOGdPbHorOHF4bU5oMnBVYlVFTHRHZ0lmbFdVQXU3cS92YjN3cWZtNEswNVZCelBiRXBRZllmeFlSbHhRWEZsVUwrTDl6a2czRnRMVlpXQnJHdWxUY09Ib3h0VmNpYTdsUHdQcG9sUG5BalVUVExqeVluYnlpdTFDOWdYTVpLRTB3N1ZOR1hMUEIzWVNZbzFHaFBKUXJSKzQreGFlSlllSk9zVUg3SVE3bDBKWWVsYWNLOG0wcFgvVXhJODdmSEc4T0lCdkV0eW5aYnUwVXZXcC9DRFY3Vng0MW0wWHA5ZnJVTS85am9xZW5sWnMybmFQVWUzRjI4ZDQzRS95ejM1czh0TWg1VHpRWnVkMmNVMnh4M2JjN3ZZeW5RUFpKMklnenM5djRxWlZXQnM4NGozRVpKQng3L1BvV2V1LzBzMjNvSGV1bklRQWNNT0xTRlRscUxpTlpobE45U2t5VmRSb3c4MlQ3eDJCMXpUdE5BL2lydEQzTlFoNDRhSDI2Uy84aDFCclBEcUNzMDBVTjd4VXZSUmNOcXd4ZWozdWNxL3pYajJCWVpaaWVzZzR6eDJoT3UreUFlYjJ6SFhNRUdGSkJ1UUpMUXUrSHZxdTRaODRvMTZ0UmhxWlZlL0g2bVJ6dDVmcDc3NjUzNFJQL2dJdHlIUDUzVld6NkE4MlpTSjIyNURqa24wMzlHTUN3MncxUStTYlpLNUpSVkJUSE9CK2h3VG94elE1aDBITmhycExEYUZuMlRsMlQ2d2tQZkl2WS9OcXlWR1kzSFp3Wm5PL21hQmY1MzBvMURYK3FxYS9DMzhJUGdMdXNFT2RDWFZqNHY4KzhGaHZPOUt3M3luV2J2elh4SkVkaHNNR3VmUGlPNzQ5UGFwOHZMbHltOGcwT1RVMXF5VE1DRFNidWx1SnhwKzgwcG92TjNqUVp4ektteWpBUGl0NlFTeFArNlZyZEpTbW5OY3JtcWg5d3dzdVRNL1ZVbFB4VW92aTlxaGgrMlZxVGt2UDNXRmo2bGUva0JiSDBPMStpdE04K1dTcm4raURqYmZCT3lHejNxNnJqdkRqWjFUZmlzQlVsUHJhdUpQekxUV3owOWdlTndkcit2VVUvdkc3MUEySytQb2hpQ3NGSkxEeHJxNDFqUGNZblBLVTl2WVlXWTE2eU5oelAwUGZrSzJIRis1ZHpPd2IzT0V6bHZpVmFTMVg2dmRJLzdJQ1RPSTczVnpTY2EwUThXMDlVS0pjMFE4NGlCKzk1cG0zc0t4ZWdOc0lFWUxod3lQLy8wdkpwNDNTd3dkK0xaNmpoQTl6SjhaZng1ZTFXM3ZpaXZHRXh0MlF1N1NUNkdCVjYzM01KT2hqb0dObUtVZU9MT3JzLzhhYTYrdGxwWWVGWWFQdkQ5UEw0ekt0dGI5MXpTU0RjTEhrZUNBRC9yZS9oSVBndkZ0MmdWbzZoRGp3TTNpbDA3RGVwRGRRTkE2WnRld0RlaWhvak1oalV6RjlBSjZDQjdET0h0T3hEMmVia2RIMmkrdzFBSHZRWGtjV2hqMmZMa1Z0ZEhUejQ4ZVJxWDI2MThpYWt3RkhPdVVRRi9DK3IxT09rQ2wxYjFOTitzMnZKM1hLYzQ1M1VWbG9ETGZMNXZmaEQ3WitLME5rM3FpYWF1Y0V5NDhGVnQyaVJKdy96T0g0d1FlSy9rditvWUlhSjFLNlJ2WEhZcFFabld3K1B1bzNHeDRZN0NRNlJxTTdSenloZUd5MmllYjlIRnhuUjVQWXV2UDhPVWYzZkNKK3B3UTl1UEo4UGxuUWx4RmVMWmhrV2FFUFNRanZicGV2bmJjcWlxem9mKzVIQUkxMERiellldlQxbVRGczl5dThnTUlIL3dITFU3ZFkrQ0VIaE56QnRJR0lIMStxcEJEbVJRNnRBMVBVeUlNb2syZndGZ0dDVWJQRENBS0pSN1U4ZmtwVktpbzRaSUFuK2Fqc3BuQlFnanNXM1grYlNJbm5YbjV4OGU0VFZ0Mi9iemRoL3FBVFVWN1RpbkhtUmg0Ti9oT21ucTZDRlVoT2NudDdBOC9QMUNSK2RFMEJwVmlWSEZvR3IwQWpvM0dpUmJTcm8yMzVUZWMrb04vYXB4NzBuRUxqWloxZXlrbllpVGdhb0s5OXBQdFJzMC9tODNDTGlONTB6Y01mNjdTMHpuamZtQjVxN01wY2FNKzk2SzdiNUhCT2tudzdPSHZDcnFpTFJKVEwwSnpNK1dHSzlUejlac1NlTnRxcE1IdE0yVGp4dFhzZDF2UXRPRFIreHVEYUZ2Y2ttOCtMdHhiSCt4M3c0ODV1ajlJWXFHQVp5OVQxSVo5NEc4dDJhYjh0OG8wVHBrZlRkWXo4U3oxcnJ5ZkNZdDNweGplbWtNcXV3aDBZMExxc0hzVTVLRGxCUGRjMnp2alpEL1pJcDJtQWRmYVlHMjFBZUNkZlowb09tdmpMTHVFTVJXTHVLb0lnRkVjM1hsMHJ5SnBDYzJ2Uko3Z0NpZVFFNThIN09ER2pmeStTMWVTcHdLSytrQ3Ryb3VDTnJGTURiWmhOaDI4TlliWnVhZjhHZzJ0YjBsNkI4MkxnbGJwUndVcSsvUnF2eURmY3g3OGNwQ3Jwai9QRExiOWU1OVBoanNza0wyM3JLQ2k3NEZDL2YrSk1xdXhNVnBrUFpFVnJKQzR0SGM3ZkRLdS9KK1p4VkVxQVJwMzVSTEpqK3o0ZFhQbGpNaVB3U2loSEtmWTl6TzJoekgwcWNoOTBhQ0llQ2FQTkdRVDltbklwL2QrN3J6dGpJVjdmTGlkV2g4aDUwbDM3TnNPd2g4QjFDb016N3pvNTFsUzM1QUFGSlpQdHRsd1VjYnhQZFBGVnpsNmJYOHFRblRiVHo5Z2h4T3ZFai9lNjZvTTIxd0pxWFkxVld3S1pqcHJPaDBJVzRNOXBiRnhiZVZlclNIZWdlL2R6L0FmdEQzOU09XCI7XG5cbi8vIHdlIG1heSBiZSBydW5uaW5nIGluIGEgYnJvd3NlciBzbyB3ZSBtYWtlIGFuIFVpbnQ4QXJyYXlcblxudmFyIGRhdGEgPSBKU09OLnBhcnNlKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBwYWtvLmluZmxhdGUoYmFzZTY0QXJyYXlidWZmZXJfMihiYXNlNjREZWZsYXRlZERhdGEpKSkpO1xudmFyIHRyaWVEYXRhID0gcGFrby5pbmZsYXRlKGJhc2U2NEFycmF5YnVmZmVyXzIoYmFzZTY0RGVmbGF0ZWRUcmllKSk7XG52YXIgdHJpZSA9IG5ldyB1bmljb2RlVHJpZSh0cmllRGF0YSk7XG5cbnZhciBsb2cyID0gTWF0aC5sb2cyIHx8IGZ1bmN0aW9uIChuKSB7XG4gIHJldHVybiBNYXRoLmxvZyhuKSAvIE1hdGguTE4yO1xufTtcblxudmFyIGJpdHMgPSBmdW5jdGlvbiBiaXRzKG4pIHtcbiAgcmV0dXJuIGxvZzIobikgKyAxIHwgMDtcbn07IC8vIGNvbXB1dGUgdGhlIG51bWJlciBvZiBiaXRzIHN0b3JlZCBmb3IgZWFjaCBmaWVsZFxuXG5cbnZhciBDQVRFR09SWV9CSVRTID0gYml0cyhkYXRhLmNhdGVnb3JpZXMubGVuZ3RoIC0gMSk7XG52YXIgQ09NQklOSU5HX0JJVFMgPSBiaXRzKGRhdGEuY29tYmluaW5nQ2xhc3Nlcy5sZW5ndGggLSAxKTtcbnZhciBTQ1JJUFRfQklUUyA9IGJpdHMoZGF0YS5zY3JpcHRzLmxlbmd0aCAtIDEpO1xudmFyIEVBV19CSVRTID0gYml0cyhkYXRhLmVhdy5sZW5ndGggLSAxKTtcbnZhciBOVU1CRVJfQklUUyA9IDEwOyAvLyBjb21wdXRlIHNoaWZ0IGFuZCBtYXNrIHZhbHVlcyBmb3IgZWFjaCBmaWVsZFxuXG52YXIgQ0FURUdPUllfU0hJRlQgPSBDT01CSU5JTkdfQklUUyArIFNDUklQVF9CSVRTICsgRUFXX0JJVFMgKyBOVU1CRVJfQklUUztcbnZhciBDT01CSU5JTkdfU0hJRlQgPSBTQ1JJUFRfQklUUyArIEVBV19CSVRTICsgTlVNQkVSX0JJVFM7XG52YXIgU0NSSVBUX1NISUZUID0gRUFXX0JJVFMgKyBOVU1CRVJfQklUUztcbnZhciBFQVdfU0hJRlQgPSBOVU1CRVJfQklUUztcbnZhciBDQVRFR09SWV9NQVNLID0gKDEgPDwgQ0FURUdPUllfQklUUykgLSAxO1xudmFyIENPTUJJTklOR19NQVNLID0gKDEgPDwgQ09NQklOSU5HX0JJVFMpIC0gMTtcbnZhciBTQ1JJUFRfTUFTSyA9ICgxIDw8IFNDUklQVF9CSVRTKSAtIDE7XG52YXIgRUFXX01BU0sgPSAoMSA8PCBFQVdfQklUUykgLSAxO1xudmFyIE5VTUJFUl9NQVNLID0gKDEgPDwgTlVNQkVSX0JJVFMpIC0gMTtcbnZhciBnZXRDYXRlZ29yeSA9IGZ1bmN0aW9uIGdldENhdGVnb3J5KGNvZGVQb2ludCkge1xuICB2YXIgdmFsID0gdHJpZS5nZXQoY29kZVBvaW50KTtcbiAgcmV0dXJuIGRhdGEuY2F0ZWdvcmllc1t2YWwgPj4gQ0FURUdPUllfU0hJRlQgJiBDQVRFR09SWV9NQVNLXTtcbn07XG52YXIgZ2V0Q29tYmluaW5nQ2xhc3MgPSBmdW5jdGlvbiBnZXRDb21iaW5pbmdDbGFzcyhjb2RlUG9pbnQpIHtcbiAgdmFyIHZhbCA9IHRyaWUuZ2V0KGNvZGVQb2ludCk7XG4gIHJldHVybiBkYXRhLmNvbWJpbmluZ0NsYXNzZXNbdmFsID4+IENPTUJJTklOR19TSElGVCAmIENPTUJJTklOR19NQVNLXTtcbn07XG52YXIgZ2V0U2NyaXB0ID0gZnVuY3Rpb24gZ2V0U2NyaXB0KGNvZGVQb2ludCkge1xuICB2YXIgdmFsID0gdHJpZS5nZXQoY29kZVBvaW50KTtcbiAgcmV0dXJuIGRhdGEuc2NyaXB0c1t2YWwgPj4gU0NSSVBUX1NISUZUICYgU0NSSVBUX01BU0tdO1xufTtcbnZhciBnZXRFYXN0QXNpYW5XaWR0aCA9IGZ1bmN0aW9uIGdldEVhc3RBc2lhbldpZHRoKGNvZGVQb2ludCkge1xuICB2YXIgdmFsID0gdHJpZS5nZXQoY29kZVBvaW50KTtcbiAgcmV0dXJuIGRhdGEuZWF3W3ZhbCA+PiBFQVdfU0hJRlQgJiBFQVdfTUFTS107XG59O1xudmFyIGdldE51bWVyaWNWYWx1ZSA9IGZ1bmN0aW9uIGdldE51bWVyaWNWYWx1ZShjb2RlUG9pbnQpIHtcbiAgdmFyIHZhbCA9IHRyaWUuZ2V0KGNvZGVQb2ludCk7XG4gIHZhciBudW0gPSB2YWwgJiBOVU1CRVJfTUFTSztcblxuICBpZiAobnVtID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAobnVtIDw9IDUwKSB7XG4gICAgcmV0dXJuIG51bSAtIDE7XG4gIH0gZWxzZSBpZiAobnVtIDwgMHgxZTApIHtcbiAgICB2YXIgbnVtZXJhdG9yID0gKG51bSA+PiA0KSAtIDEyO1xuICAgIHZhciBkZW5vbWluYXRvciA9IChudW0gJiAweGYpICsgMTtcbiAgICByZXR1cm4gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7XG4gIH0gZWxzZSBpZiAobnVtIDwgMHgzMDApIHtcbiAgICB2YWwgPSAobnVtID4+IDUpIC0gMTQ7XG4gICAgdmFyIGV4cCA9IChudW0gJiAweDFmKSArIDI7XG5cbiAgICB3aGlsZSAoZXhwID4gMCkge1xuICAgICAgdmFsICo9IDEwO1xuICAgICAgZXhwLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfSBlbHNlIHtcbiAgICB2YWwgPSAobnVtID4+IDIpIC0gMHhiZjtcblxuICAgIHZhciBfZXhwID0gKG51bSAmIDMpICsgMTtcblxuICAgIHdoaWxlIChfZXhwID4gMCkge1xuICAgICAgdmFsICo9IDYwO1xuICAgICAgX2V4cC0tO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH1cbn07XG52YXIgaXNBbHBoYWJldGljID0gZnVuY3Rpb24gaXNBbHBoYWJldGljKGNvZGVQb2ludCkge1xuICB2YXIgY2F0ZWdvcnkgPSBnZXRDYXRlZ29yeShjb2RlUG9pbnQpO1xuICByZXR1cm4gY2F0ZWdvcnkgPT09ICdMdScgfHwgY2F0ZWdvcnkgPT09ICdMbCcgfHwgY2F0ZWdvcnkgPT09ICdMdCcgfHwgY2F0ZWdvcnkgPT09ICdMbScgfHwgY2F0ZWdvcnkgPT09ICdMbycgfHwgY2F0ZWdvcnkgPT09ICdObCc7XG59O1xudmFyIGlzRGlnaXQgPSBmdW5jdGlvbiBpc0RpZ2l0KGNvZGVQb2ludCkge1xuICByZXR1cm4gZ2V0Q2F0ZWdvcnkoY29kZVBvaW50KSA9PT0gJ05kJztcbn07XG52YXIgaXNQdW5jdHVhdGlvbiA9IGZ1bmN0aW9uIGlzUHVuY3R1YXRpb24oY29kZVBvaW50KSB7XG4gIHZhciBjYXRlZ29yeSA9IGdldENhdGVnb3J5KGNvZGVQb2ludCk7XG4gIHJldHVybiBjYXRlZ29yeSA9PT0gJ1BjJyB8fCBjYXRlZ29yeSA9PT0gJ1BkJyB8fCBjYXRlZ29yeSA9PT0gJ1BlJyB8fCBjYXRlZ29yeSA9PT0gJ1BmJyB8fCBjYXRlZ29yeSA9PT0gJ1BpJyB8fCBjYXRlZ29yeSA9PT0gJ1BvJyB8fCBjYXRlZ29yeSA9PT0gJ1BzJztcbn07XG52YXIgaXNMb3dlckNhc2UgPSBmdW5jdGlvbiBpc0xvd2VyQ2FzZShjb2RlUG9pbnQpIHtcbiAgcmV0dXJuIGdldENhdGVnb3J5KGNvZGVQb2ludCkgPT09ICdMbCc7XG59O1xudmFyIGlzVXBwZXJDYXNlID0gZnVuY3Rpb24gaXNVcHBlckNhc2UoY29kZVBvaW50KSB7XG4gIHJldHVybiBnZXRDYXRlZ29yeShjb2RlUG9pbnQpID09PSAnTHUnO1xufTtcbnZhciBpc1RpdGxlQ2FzZSA9IGZ1bmN0aW9uIGlzVGl0bGVDYXNlKGNvZGVQb2ludCkge1xuICByZXR1cm4gZ2V0Q2F0ZWdvcnkoY29kZVBvaW50KSA9PT0gJ0x0Jztcbn07XG52YXIgaXNXaGl0ZVNwYWNlID0gZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNvZGVQb2ludCkge1xuICB2YXIgY2F0ZWdvcnkgPSBnZXRDYXRlZ29yeShjb2RlUG9pbnQpO1xuICByZXR1cm4gY2F0ZWdvcnkgPT09ICdacycgfHwgY2F0ZWdvcnkgPT09ICdabCcgfHwgY2F0ZWdvcnkgPT09ICdacCc7XG59O1xudmFyIGlzQmFzZUZvcm0gPSBmdW5jdGlvbiBpc0Jhc2VGb3JtKGNvZGVQb2ludCkge1xuICB2YXIgY2F0ZWdvcnkgPSBnZXRDYXRlZ29yeShjb2RlUG9pbnQpO1xuICByZXR1cm4gY2F0ZWdvcnkgPT09ICdOZCcgfHwgY2F0ZWdvcnkgPT09ICdObycgfHwgY2F0ZWdvcnkgPT09ICdObCcgfHwgY2F0ZWdvcnkgPT09ICdMdScgfHwgY2F0ZWdvcnkgPT09ICdMbCcgfHwgY2F0ZWdvcnkgPT09ICdMdCcgfHwgY2F0ZWdvcnkgPT09ICdMbScgfHwgY2F0ZWdvcnkgPT09ICdMbycgfHwgY2F0ZWdvcnkgPT09ICdNZScgfHwgY2F0ZWdvcnkgPT09ICdNYyc7XG59O1xudmFyIGlzTWFyayA9IGZ1bmN0aW9uIGlzTWFyayhjb2RlUG9pbnQpIHtcbiAgdmFyIGNhdGVnb3J5ID0gZ2V0Q2F0ZWdvcnkoY29kZVBvaW50KTtcbiAgcmV0dXJuIGNhdGVnb3J5ID09PSAnTW4nIHx8IGNhdGVnb3J5ID09PSAnTWUnIHx8IGNhdGVnb3J5ID09PSAnTWMnO1xufTtcbnZhciB1bmljb2RlID0ge1xuICBnZXRDYXRlZ29yeTogZ2V0Q2F0ZWdvcnksXG4gIGdldENvbWJpbmluZ0NsYXNzOiBnZXRDb21iaW5pbmdDbGFzcyxcbiAgZ2V0U2NyaXB0OiBnZXRTY3JpcHQsXG4gIGdldEVhc3RBc2lhbldpZHRoOiBnZXRFYXN0QXNpYW5XaWR0aCxcbiAgZ2V0TnVtZXJpY1ZhbHVlOiBnZXROdW1lcmljVmFsdWUsXG4gIGlzQWxwaGFiZXRpYzogaXNBbHBoYWJldGljLFxuICBpc0RpZ2l0OiBpc0RpZ2l0LFxuICBpc1B1bmN0dWF0aW9uOiBpc1B1bmN0dWF0aW9uLFxuICBpc0xvd2VyQ2FzZTogaXNMb3dlckNhc2UsXG4gIGlzVXBwZXJDYXNlOiBpc1VwcGVyQ2FzZSxcbiAgaXNUaXRsZUNhc2U6IGlzVGl0bGVDYXNlLFxuICBpc1doaXRlU3BhY2U6IGlzV2hpdGVTcGFjZSxcbiAgaXNCYXNlRm9ybTogaXNCYXNlRm9ybSxcbiAgaXNNYXJrOiBpc01hcmtcbn07XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIHdoZW4gR1BPUyBkb2VzIG5vdCBkZWZpbmUgJ21hcmsnIG9yICdta21rJyBmZWF0dXJlc1xuICogZm9yIHBvc2l0aW9uaW5nIG1hcmtzIHJlbGF0aXZlIHRvIGJhc2UgZ2x5cGhzLiBJdCB1c2VzIHRoZSB1bmljb2RlXG4gKiBjb21iaW5pbmcgY2xhc3MgcHJvcGVydHkgdG8gcG9zaXRpb24gbWFya3MuXG4gKlxuICogQmFzZWQgb24gY29kZSBmcm9tIEhhcmZidXp6LCB0aGFua3MhXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmVoZGFkL2hhcmZidXp6L2Jsb2IvbWFzdGVyL3NyYy9oYi1vdC1zaGFwZS1mYWxsYmFjay5jY1xuICovXG5cbnZhciBVbmljb2RlTGF5b3V0RW5naW5lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVW5pY29kZUxheW91dEVuZ2luZShmb250KSB7XG4gICAgdGhpcy5mb250ID0gZm9udDtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBVbmljb2RlTGF5b3V0RW5naW5lLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucG9zaXRpb25HbHlwaHMgPSBmdW5jdGlvbiBwb3NpdGlvbkdseXBocyhnbHlwaHMsIHBvc2l0aW9ucykge1xuICAgIC8vIGZpbmQgZWFjaCBiYXNlICsgbWFyayBjbHVzdGVyLCBhbmQgcG9zaXRpb24gdGhlIG1hcmtzIHJlbGF0aXZlIHRvIHRoZSBiYXNlXG4gICAgdmFyIGNsdXN0ZXJTdGFydCA9IDA7XG4gICAgdmFyIGNsdXN0ZXJFbmQgPSAwO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGdseXBocy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpbmRleF07XG5cbiAgICAgIGlmIChnbHlwaC5pc01hcmspIHtcbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIGxpZ2F0dXJlc1xuICAgICAgICBjbHVzdGVyRW5kID0gaW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY2x1c3RlclN0YXJ0ICE9PSBjbHVzdGVyRW5kKSB7XG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkNsdXN0ZXIoZ2x5cGhzLCBwb3NpdGlvbnMsIGNsdXN0ZXJTdGFydCwgY2x1c3RlckVuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjbHVzdGVyU3RhcnQgPSBjbHVzdGVyRW5kID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsdXN0ZXJTdGFydCAhPT0gY2x1c3RlckVuZCkge1xuICAgICAgdGhpcy5wb3NpdGlvbkNsdXN0ZXIoZ2x5cGhzLCBwb3NpdGlvbnMsIGNsdXN0ZXJTdGFydCwgY2x1c3RlckVuZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9ucztcbiAgfTtcblxuICBfcHJvdG8ucG9zaXRpb25DbHVzdGVyID0gZnVuY3Rpb24gcG9zaXRpb25DbHVzdGVyKGdseXBocywgcG9zaXRpb25zLCBjbHVzdGVyU3RhcnQsIGNsdXN0ZXJFbmQpIHtcbiAgICB2YXIgYmFzZSA9IGdseXBoc1tjbHVzdGVyU3RhcnRdO1xuICAgIHZhciBiYXNlQm94ID0gYmFzZS5jYm94LmNvcHkoKTsgLy8gYWRqdXN0IGJvdW5kaW5nIGJveCBmb3IgbGlnYXR1cmUgZ2x5cGhzXG5cbiAgICBpZiAoYmFzZS5jb2RlUG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIExUUi4gVE9ETzogUlRMIHN1cHBvcnQuXG4gICAgICBiYXNlQm94Lm1pblggKz0gKGJhc2UuY29kZVBvaW50cy5sZW5ndGggLSAxKSAqIGJhc2VCb3gud2lkdGggLyBiYXNlLmNvZGVQb2ludHMubGVuZ3RoO1xuICAgIH1cblxuICAgIHZhciB4T2Zmc2V0ID0gLXBvc2l0aW9uc1tjbHVzdGVyU3RhcnRdLnhBZHZhbmNlO1xuICAgIHZhciB5T2Zmc2V0ID0gMDtcbiAgICB2YXIgeUdhcCA9IHRoaXMuZm9udC51bml0c1BlckVtIC8gMTY7IC8vIHBvc2l0aW9uIGVhY2ggb2YgdGhlIG1hcmsgZ2x5cGhzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGdseXBoXG5cbiAgICBmb3IgKHZhciBpbmRleCA9IGNsdXN0ZXJTdGFydCArIDE7IGluZGV4IDw9IGNsdXN0ZXJFbmQ7IGluZGV4KyspIHtcbiAgICAgIHZhciBtYXJrID0gZ2x5cGhzW2luZGV4XTtcbiAgICAgIHZhciBtYXJrQm94ID0gbWFyay5jYm94O1xuICAgICAgdmFyIHBvc2l0aW9uID0gcG9zaXRpb25zW2luZGV4XTtcbiAgICAgIHZhciBjb21iaW5pbmdDbGFzcyA9IHRoaXMuZ2V0Q29tYmluaW5nQ2xhc3MobWFyay5jb2RlUG9pbnRzWzBdKTtcblxuICAgICAgaWYgKGNvbWJpbmluZ0NsYXNzICE9PSAnTm90X1Jlb3JkZXJlZCcpIHtcbiAgICAgICAgcG9zaXRpb24ueE9mZnNldCA9IHBvc2l0aW9uLnlPZmZzZXQgPSAwOyAvLyB4IHBvc2l0aW9uaW5nXG5cbiAgICAgICAgc3dpdGNoIChjb21iaW5pbmdDbGFzcykge1xuICAgICAgICAgIGNhc2UgJ0RvdWJsZV9BYm92ZSc6XG4gICAgICAgICAgY2FzZSAnRG91YmxlX0JlbG93JzpcbiAgICAgICAgICAgIC8vIExUUi4gVE9ETzogUlRMIHN1cHBvcnQuXG4gICAgICAgICAgICBwb3NpdGlvbi54T2Zmc2V0ICs9IGJhc2VCb3gubWluWCAtIG1hcmtCb3gud2lkdGggLyAyIC0gbWFya0JveC5taW5YO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdBdHRhY2hlZF9CZWxvd19MZWZ0JzpcbiAgICAgICAgICBjYXNlICdCZWxvd19MZWZ0JzpcbiAgICAgICAgICBjYXNlICdBYm92ZV9MZWZ0JzpcbiAgICAgICAgICAgIC8vIGxlZnQgYWxpZ25cbiAgICAgICAgICAgIHBvc2l0aW9uLnhPZmZzZXQgKz0gYmFzZUJveC5taW5YIC0gbWFya0JveC5taW5YO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdBdHRhY2hlZF9BYm92ZV9SaWdodCc6XG4gICAgICAgICAgY2FzZSAnQmVsb3dfUmlnaHQnOlxuICAgICAgICAgIGNhc2UgJ0Fib3ZlX1JpZ2h0JzpcbiAgICAgICAgICAgIC8vIHJpZ2h0IGFsaWduXG4gICAgICAgICAgICBwb3NpdGlvbi54T2Zmc2V0ICs9IGJhc2VCb3gubWF4WCAtIG1hcmtCb3gud2lkdGggLSBtYXJrQm94Lm1pblg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBBdHRhY2hlZF9CZWxvdywgQXR0YWNoZWRfQWJvdmUsIEJlbG93LCBBYm92ZSwgb3RoZXJcbiAgICAgICAgICAgIC8vIGNlbnRlciBhbGlnblxuICAgICAgICAgICAgcG9zaXRpb24ueE9mZnNldCArPSBiYXNlQm94Lm1pblggKyAoYmFzZUJveC53aWR0aCAtIG1hcmtCb3gud2lkdGgpIC8gMiAtIG1hcmtCb3gubWluWDtcbiAgICAgICAgfSAvLyB5IHBvc2l0aW9uaW5nXG5cblxuICAgICAgICBzd2l0Y2ggKGNvbWJpbmluZ0NsYXNzKSB7XG4gICAgICAgICAgY2FzZSAnRG91YmxlX0JlbG93JzpcbiAgICAgICAgICBjYXNlICdCZWxvd19MZWZ0JzpcbiAgICAgICAgICBjYXNlICdCZWxvdyc6XG4gICAgICAgICAgY2FzZSAnQmVsb3dfUmlnaHQnOlxuICAgICAgICAgIGNhc2UgJ0F0dGFjaGVkX0JlbG93X0xlZnQnOlxuICAgICAgICAgIGNhc2UgJ0F0dGFjaGVkX0JlbG93JzpcbiAgICAgICAgICAgIC8vIGFkZCBhIHNtYWxsIGdhcCBiZXR3ZWVuIHRoZSBnbHlwaHMgaWYgdGhleSBhcmUgbm90IGF0dGFjaGVkXG4gICAgICAgICAgICBpZiAoY29tYmluaW5nQ2xhc3MgPT09ICdBdHRhY2hlZF9CZWxvd19MZWZ0JyB8fCBjb21iaW5pbmdDbGFzcyA9PT0gJ0F0dGFjaGVkX0JlbG93Jykge1xuICAgICAgICAgICAgICBiYXNlQm94Lm1pblkgKz0geUdhcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9zaXRpb24ueU9mZnNldCA9IC1iYXNlQm94Lm1pblkgLSBtYXJrQm94Lm1heFk7XG4gICAgICAgICAgICBiYXNlQm94Lm1pblkgKz0gbWFya0JveC5oZWlnaHQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ0RvdWJsZV9BYm92ZSc6XG4gICAgICAgICAgY2FzZSAnQWJvdmVfTGVmdCc6XG4gICAgICAgICAgY2FzZSAnQWJvdmUnOlxuICAgICAgICAgIGNhc2UgJ0Fib3ZlX1JpZ2h0JzpcbiAgICAgICAgICBjYXNlICdBdHRhY2hlZF9BYm92ZSc6XG4gICAgICAgICAgY2FzZSAnQXR0YWNoZWRfQWJvdmVfUmlnaHQnOlxuICAgICAgICAgICAgLy8gYWRkIGEgc21hbGwgZ2FwIGJldHdlZW4gdGhlIGdseXBocyBpZiB0aGV5IGFyZSBub3QgYXR0YWNoZWRcbiAgICAgICAgICAgIGlmIChjb21iaW5pbmdDbGFzcyA9PT0gJ0F0dGFjaGVkX0Fib3ZlJyB8fCBjb21iaW5pbmdDbGFzcyA9PT0gJ0F0dGFjaGVkX0Fib3ZlX1JpZ2h0Jykge1xuICAgICAgICAgICAgICBiYXNlQm94Lm1heFkgKz0geUdhcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9zaXRpb24ueU9mZnNldCA9IGJhc2VCb3gubWF4WSAtIG1hcmtCb3gubWluWTtcbiAgICAgICAgICAgIGJhc2VCb3gubWF4WSArPSBtYXJrQm94LmhlaWdodDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9zaXRpb24ueEFkdmFuY2UgPSBwb3NpdGlvbi55QWR2YW5jZSA9IDA7XG4gICAgICAgIHBvc2l0aW9uLnhPZmZzZXQgKz0geE9mZnNldDtcbiAgICAgICAgcG9zaXRpb24ueU9mZnNldCArPSB5T2Zmc2V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeE9mZnNldCAtPSBwb3NpdGlvbi54QWR2YW5jZTtcbiAgICAgICAgeU9mZnNldCAtPSBwb3NpdGlvbi55QWR2YW5jZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH07XG5cbiAgX3Byb3RvLmdldENvbWJpbmluZ0NsYXNzID0gZnVuY3Rpb24gZ2V0Q29tYmluaW5nQ2xhc3MoY29kZVBvaW50KSB7XG4gICAgdmFyIGNvbWJpbmluZ0NsYXNzID0gdW5pY29kZS5nZXRDb21iaW5pbmdDbGFzcyhjb2RlUG9pbnQpOyAvLyBUaGFpIC8gTGFvIG5lZWQgc29tZSBwZXItY2hhcmFjdGVyIHdvcmtcblxuICAgIGlmICgoY29kZVBvaW50ICYgfjB4ZmYpID09PSAweDBlMDApIHtcbiAgICAgIGlmIChjb21iaW5pbmdDbGFzcyA9PT0gJ05vdF9SZW9yZGVyZWQnKSB7XG4gICAgICAgIHN3aXRjaCAoY29kZVBvaW50KSB7XG4gICAgICAgICAgY2FzZSAweDBlMzE6XG4gICAgICAgICAgY2FzZSAweDBlMzQ6XG4gICAgICAgICAgY2FzZSAweDBlMzU6XG4gICAgICAgICAgY2FzZSAweDBlMzY6XG4gICAgICAgICAgY2FzZSAweDBlMzc6XG4gICAgICAgICAgY2FzZSAweDBlNDc6XG4gICAgICAgICAgY2FzZSAweDBlNGM6XG4gICAgICAgICAgY2FzZSAweDBlM2Q6XG4gICAgICAgICAgY2FzZSAweDBlNGU6XG4gICAgICAgICAgICByZXR1cm4gJ0Fib3ZlX1JpZ2h0JztcblxuICAgICAgICAgIGNhc2UgMHgwZWIxOlxuICAgICAgICAgIGNhc2UgMHgwZWI0OlxuICAgICAgICAgIGNhc2UgMHgwZWI1OlxuICAgICAgICAgIGNhc2UgMHgwZWI2OlxuICAgICAgICAgIGNhc2UgMHgwZWI3OlxuICAgICAgICAgIGNhc2UgMHgwZWJiOlxuICAgICAgICAgIGNhc2UgMHgwZWNjOlxuICAgICAgICAgIGNhc2UgMHgwZWNkOlxuICAgICAgICAgICAgcmV0dXJuICdBYm92ZSc7XG5cbiAgICAgICAgICBjYXNlIDB4MGViYzpcbiAgICAgICAgICAgIHJldHVybiAnQmVsb3cnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA9PT0gMHgwZTNhKSB7XG4gICAgICAgIC8vIHZpcmFtYVxuICAgICAgICByZXR1cm4gJ0JlbG93X1JpZ2h0JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbWJpbmluZ0NsYXNzKSB7XG4gICAgICAvLyBIZWJyZXdcbiAgICAgIGNhc2UgJ0NDQzEwJzogLy8gc2hldmFcblxuICAgICAgY2FzZSAnQ0NDMTEnOiAvLyBoYXRhZiBzZWdvbFxuXG4gICAgICBjYXNlICdDQ0MxMic6IC8vIGhhdGFmIHBhdGFoXG5cbiAgICAgIGNhc2UgJ0NDQzEzJzogLy8gaGF0YWYgcWFtYXRzXG5cbiAgICAgIGNhc2UgJ0NDQzE0JzogLy8gaGlyaXFcblxuICAgICAgY2FzZSAnQ0NDMTUnOiAvLyB0c2VyZVxuXG4gICAgICBjYXNlICdDQ0MxNic6IC8vIHNlZ29sXG5cbiAgICAgIGNhc2UgJ0NDQzE3JzogLy8gcGF0YWhcblxuICAgICAgY2FzZSAnQ0NDMTgnOiAvLyBxYW1hdHNcblxuICAgICAgY2FzZSAnQ0NDMjAnOiAvLyBxdWJ1dHNcblxuICAgICAgY2FzZSAnQ0NDMjInOlxuICAgICAgICAvLyBtZXRlZ1xuICAgICAgICByZXR1cm4gJ0JlbG93JztcblxuICAgICAgY2FzZSAnQ0NDMjMnOlxuICAgICAgICAvLyByYWZlXG4gICAgICAgIHJldHVybiAnQXR0YWNoZWRfQWJvdmUnO1xuXG4gICAgICBjYXNlICdDQ0MyNCc6XG4gICAgICAgIC8vIHNoaW4gZG90XG4gICAgICAgIHJldHVybiAnQWJvdmVfUmlnaHQnO1xuXG4gICAgICBjYXNlICdDQ0MyNSc6IC8vIHNpbiBkb3RcblxuICAgICAgY2FzZSAnQ0NDMTknOlxuICAgICAgICAvLyBob2xhbVxuICAgICAgICByZXR1cm4gJ0Fib3ZlX0xlZnQnO1xuXG4gICAgICBjYXNlICdDQ0MyNic6XG4gICAgICAgIC8vIHBvaW50IHZhcmlrYVxuICAgICAgICByZXR1cm4gJ0Fib3ZlJztcblxuICAgICAgY2FzZSAnQ0NDMjEnOlxuICAgICAgICAvLyBkYWdlc2hcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBBcmFiaWMgYW5kIFN5cmlhY1xuXG4gICAgICBjYXNlICdDQ0MyNyc6IC8vIGZhdGhhdGFuXG5cbiAgICAgIGNhc2UgJ0NDQzI4JzogLy8gZGFtbWF0YW5cblxuICAgICAgY2FzZSAnQ0NDMzAnOiAvLyBmYXRoYVxuXG4gICAgICBjYXNlICdDQ0MzMSc6IC8vIGRhbW1hXG5cbiAgICAgIGNhc2UgJ0NDQzMzJzogLy8gc2hhZGRhXG5cbiAgICAgIGNhc2UgJ0NDQzM0JzogLy8gc3VrdW5cblxuICAgICAgY2FzZSAnQ0NDMzUnOiAvLyBzdXBlcnNjcmlwdCBhbGVmXG5cbiAgICAgIGNhc2UgJ0NDQzM2JzpcbiAgICAgICAgLy8gc3VwZXJzY3JpcHQgYWxhcGhcbiAgICAgICAgcmV0dXJuICdBYm92ZSc7XG5cbiAgICAgIGNhc2UgJ0NDQzI5JzogLy8ga2FzcmF0YW5cblxuICAgICAgY2FzZSAnQ0NDMzInOlxuICAgICAgICAvLyBrYXNyYVxuICAgICAgICByZXR1cm4gJ0JlbG93JztcbiAgICAgIC8vIFRoYWlcblxuICAgICAgY2FzZSAnQ0NDMTAzJzpcbiAgICAgICAgLy8gc2FyYSB1IC8gc2FyYSB1dVxuICAgICAgICByZXR1cm4gJ0JlbG93X1JpZ2h0JztcblxuICAgICAgY2FzZSAnQ0NDMTA3JzpcbiAgICAgICAgLy8gbWFpXG4gICAgICAgIHJldHVybiAnQWJvdmVfUmlnaHQnO1xuICAgICAgLy8gTGFvXG5cbiAgICAgIGNhc2UgJ0NDQzExOCc6XG4gICAgICAgIC8vIHNpZ24gdSAvIHNpZ24gdXVcbiAgICAgICAgcmV0dXJuICdCZWxvdyc7XG5cbiAgICAgIGNhc2UgJ0NDQzEyMic6XG4gICAgICAgIC8vIG1haVxuICAgICAgICByZXR1cm4gJ0Fib3ZlJztcbiAgICAgIC8vIFRpYmV0YW5cblxuICAgICAgY2FzZSAnQ0NDMTI5JzogLy8gc2lnbiBhYVxuXG4gICAgICBjYXNlICdDQ0MxMzInOlxuICAgICAgICAvLyBzaWduIHVcbiAgICAgICAgcmV0dXJuICdCZWxvdyc7XG5cbiAgICAgIGNhc2UgJ0NDQzEzMCc6XG4gICAgICAgIC8vIHNpZ24gaVxuICAgICAgICByZXR1cm4gJ0Fib3ZlJztcbiAgICB9XG5cbiAgICByZXR1cm4gY29tYmluaW5nQ2xhc3M7XG4gIH07XG5cbiAgcmV0dXJuIFVuaWNvZGVMYXlvdXRFbmdpbmU7XG59KCk7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDEodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MkMShDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQxKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnbHlwaCBib3VuZGluZyBib3hcbiAqL1xudmFyIEJCb3ggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCQm94KG1pblgsIG1pblksIG1heFgsIG1heFkpIHtcbiAgICBpZiAobWluWCA9PT0gdm9pZCAwKSB7XG4gICAgICBtaW5YID0gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgaWYgKG1pblkgPT09IHZvaWQgMCkge1xuICAgICAgbWluWSA9IEluZmluaXR5O1xuICAgIH1cblxuICAgIGlmIChtYXhYID09PSB2b2lkIDApIHtcbiAgICAgIG1heFggPSAtSW5maW5pdHk7XG4gICAgfVxuXG4gICAgaWYgKG1heFkgPT09IHZvaWQgMCkge1xuICAgICAgbWF4WSA9IC1JbmZpbml0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBYIHBvc2l0aW9uIGluIHRoZSBib3VuZGluZyBib3hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMubWluWCA9IG1pblg7XG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gWSBwb3NpdGlvbiBpbiB0aGUgYm91bmRpbmcgYm94XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICAgIHRoaXMubWluWSA9IG1pblk7XG4gICAgLyoqXG4gICAgICogVGhlIG1heG1pbXVtIFggcG9zaXRpb24gaW4gdGhlIGJvdW5kaW5nIGJveFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgICB0aGlzLm1heFggPSBtYXhYO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhtaW11bSBZIHBvc2l0aW9uIGluIHRoZSBib3VuZGluZyBib3hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gICAgdGhpcy5tYXhZID0gbWF4WTtcbiAgfVxuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSBib3VuZGluZyBib3hcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gQkJveC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmFkZFBvaW50ID0gZnVuY3Rpb24gYWRkUG9pbnQoeCwgeSkge1xuICAgIGlmIChNYXRoLmFicyh4KSAhPT0gSW5maW5pdHkpIHtcbiAgICAgIGlmICh4IDwgdGhpcy5taW5YKSB7XG4gICAgICAgIHRoaXMubWluWCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGlmICh4ID4gdGhpcy5tYXhYKSB7XG4gICAgICAgIHRoaXMubWF4WCA9IHg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKHkpICE9PSBJbmZpbml0eSkge1xuICAgICAgaWYgKHkgPCB0aGlzLm1pblkpIHtcbiAgICAgICAgdGhpcy5taW5ZID0geTtcbiAgICAgIH1cblxuICAgICAgaWYgKHkgPiB0aGlzLm1heFkpIHtcbiAgICAgICAgdGhpcy5tYXhZID0geTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmNvcHkgPSBmdW5jdGlvbiBjb3B5KCkge1xuICAgIHJldHVybiBuZXcgQkJveCh0aGlzLm1pblgsIHRoaXMubWluWSwgdGhpcy5tYXhYLCB0aGlzLm1heFkpO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyQxKEJCb3gsIFt7XG4gICAga2V5OiBcIndpZHRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXhYIC0gdGhpcy5taW5YO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyBib3hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaGVpZ2h0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXhZIC0gdGhpcy5taW5ZO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCQm94O1xufSgpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDYobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDYobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDYobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ2KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkNihvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JDYoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG4vLyBEYXRhIGZyb20gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL3NjcmlwdHRhZ3MuaHRtXG4vLyBhbmQgaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvVU5JREFUQS9Qcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQuXG5cbnZhciBVTklDT0RFX1NDUklQVFMgPSB7XG4gIENhdWNhc2lhbl9BbGJhbmlhbjogJ2FnaGInLFxuICBBcmFiaWM6ICdhcmFiJyxcbiAgSW1wZXJpYWxfQXJhbWFpYzogJ2FybWknLFxuICBBcm1lbmlhbjogJ2FybW4nLFxuICBBdmVzdGFuOiAnYXZzdCcsXG4gIEJhbGluZXNlOiAnYmFsaScsXG4gIEJhbXVtOiAnYmFtdScsXG4gIEJhc3NhX1ZhaDogJ2Jhc3MnLFxuICBCYXRhazogJ2JhdGsnLFxuICBCZW5nYWxpOiBbJ2JuZzInLCAnYmVuZyddLFxuICBCb3BvbW9mbzogJ2JvcG8nLFxuICBCcmFobWk6ICdicmFoJyxcbiAgQnJhaWxsZTogJ2JyYWknLFxuICBCdWdpbmVzZTogJ2J1Z2knLFxuICBCdWhpZDogJ2J1aGQnLFxuICBDaGFrbWE6ICdjYWttJyxcbiAgQ2FuYWRpYW5fQWJvcmlnaW5hbDogJ2NhbnMnLFxuICBDYXJpYW46ICdjYXJpJyxcbiAgQ2hhbTogJ2NoYW0nLFxuICBDaGVyb2tlZTogJ2NoZXInLFxuICBDb3B0aWM6ICdjb3B0JyxcbiAgQ3lwcmlvdDogJ2NwcnQnLFxuICBDeXJpbGxpYzogJ2N5cmwnLFxuICBEZXZhbmFnYXJpOiBbJ2RldjInLCAnZGV2YSddLFxuICBEZXNlcmV0OiAnZHNydCcsXG4gIER1cGxveWFuOiAnZHVwbCcsXG4gIEVneXB0aWFuX0hpZXJvZ2x5cGhzOiAnZWd5cCcsXG4gIEVsYmFzYW46ICdlbGJhJyxcbiAgRXRoaW9waWM6ICdldGhpJyxcbiAgR2VvcmdpYW46ICdnZW9yJyxcbiAgR2xhZ29saXRpYzogJ2dsYWcnLFxuICBHb3RoaWM6ICdnb3RoJyxcbiAgR3JhbnRoYTogJ2dyYW4nLFxuICBHcmVlazogJ2dyZWsnLFxuICBHdWphcmF0aTogWydnanIyJywgJ2d1anInXSxcbiAgR3VybXVraGk6IFsnZ3VyMicsICdndXJ1J10sXG4gIEhhbmd1bDogJ2hhbmcnLFxuICBIYW46ICdoYW5pJyxcbiAgSGFudW5vbzogJ2hhbm8nLFxuICBIZWJyZXc6ICdoZWJyJyxcbiAgSGlyYWdhbmE6ICdoaXJhJyxcbiAgUGFoYXdoX0htb25nOiAnaG1uZycsXG4gIEthdGFrYW5hX09yX0hpcmFnYW5hOiAnaHJrdCcsXG4gIE9sZF9JdGFsaWM6ICdpdGFsJyxcbiAgSmF2YW5lc2U6ICdqYXZhJyxcbiAgS2F5YWhfTGk6ICdrYWxpJyxcbiAgS2F0YWthbmE6ICdrYW5hJyxcbiAgS2hhcm9zaHRoaTogJ2toYXInLFxuICBLaG1lcjogJ2tobXInLFxuICBLaG9qa2k6ICdraG9qJyxcbiAgS2FubmFkYTogWydrbmQyJywgJ2tuZGEnXSxcbiAgS2FpdGhpOiAna3RoaScsXG4gIFRhaV9UaGFtOiAnbGFuYScsXG4gIExhbzogJ2xhbyAnLFxuICBMYXRpbjogJ2xhdG4nLFxuICBMZXBjaGE6ICdsZXBjJyxcbiAgTGltYnU6ICdsaW1iJyxcbiAgTGluZWFyX0E6ICdsaW5hJyxcbiAgTGluZWFyX0I6ICdsaW5iJyxcbiAgTGlzdTogJ2xpc3UnLFxuICBMeWNpYW46ICdseWNpJyxcbiAgTHlkaWFuOiAnbHlkaScsXG4gIE1haGFqYW5pOiAnbWFoaicsXG4gIE1hbmRhaWM6ICdtYW5kJyxcbiAgTWFuaWNoYWVhbjogJ21hbmknLFxuICBNZW5kZV9LaWtha3VpOiAnbWVuZCcsXG4gIE1lcm9pdGljX0N1cnNpdmU6ICdtZXJjJyxcbiAgTWVyb2l0aWNfSGllcm9nbHlwaHM6ICdtZXJvJyxcbiAgTWFsYXlhbGFtOiBbJ21sbTInLCAnbWx5bSddLFxuICBNb2RpOiAnbW9kaScsXG4gIE1vbmdvbGlhbjogJ21vbmcnLFxuICBNcm86ICdtcm9vJyxcbiAgTWVldGVpX01heWVrOiAnbXRlaScsXG4gIE15YW5tYXI6IFsnbXltMicsICdteW1yJ10sXG4gIE9sZF9Ob3J0aF9BcmFiaWFuOiAnbmFyYicsXG4gIE5hYmF0YWVhbjogJ25iYXQnLFxuICBOa286ICdua28gJyxcbiAgT2doYW06ICdvZ2FtJyxcbiAgT2xfQ2hpa2k6ICdvbGNrJyxcbiAgT2xkX1R1cmtpYzogJ29ya2gnLFxuICBPcml5YTogWydvcnkyJywgJ29yeWEnXSxcbiAgT3NtYW55YTogJ29zbWEnLFxuICBQYWxteXJlbmU6ICdwYWxtJyxcbiAgUGF1X0Npbl9IYXU6ICdwYXVjJyxcbiAgT2xkX1Blcm1pYzogJ3Blcm0nLFxuICBQaGFnc19QYTogJ3BoYWcnLFxuICBJbnNjcmlwdGlvbmFsX1BhaGxhdmk6ICdwaGxpJyxcbiAgUHNhbHRlcl9QYWhsYXZpOiAncGhscCcsXG4gIFBob2VuaWNpYW46ICdwaG54JyxcbiAgTWlhbzogJ3BscmQnLFxuICBJbnNjcmlwdGlvbmFsX1BhcnRoaWFuOiAncHJ0aScsXG4gIFJlamFuZzogJ3JqbmcnLFxuICBSdW5pYzogJ3J1bnInLFxuICBTYW1hcml0YW46ICdzYW1yJyxcbiAgT2xkX1NvdXRoX0FyYWJpYW46ICdzYXJiJyxcbiAgU2F1cmFzaHRyYTogJ3NhdXInLFxuICBTaGF2aWFuOiAnc2hhdycsXG4gIFNoYXJhZGE6ICdzaHJkJyxcbiAgU2lkZGhhbTogJ3NpZGQnLFxuICBLaHVkYXdhZGk6ICdzaW5kJyxcbiAgU2luaGFsYTogJ3NpbmgnLFxuICBTb3JhX1NvbXBlbmc6ICdzb3JhJyxcbiAgU3VuZGFuZXNlOiAnc3VuZCcsXG4gIFN5bG90aV9OYWdyaTogJ3N5bG8nLFxuICBTeXJpYWM6ICdzeXJjJyxcbiAgVGFnYmFud2E6ICd0YWdiJyxcbiAgVGFrcmk6ICd0YWtyJyxcbiAgVGFpX0xlOiAndGFsZScsXG4gIE5ld19UYWlfTHVlOiAndGFsdScsXG4gIFRhbWlsOiBbJ3RtbDInLCAndGFtbCddLFxuICBUYWlfVmlldDogJ3RhdnQnLFxuICBUZWx1Z3U6IFsndGVsMicsICd0ZWx1J10sXG4gIFRpZmluYWdoOiAndGZuZycsXG4gIFRhZ2Fsb2c6ICd0Z2xnJyxcbiAgVGhhYW5hOiAndGhhYScsXG4gIFRoYWk6ICd0aGFpJyxcbiAgVGliZXRhbjogJ3RpYnQnLFxuICBUaXJodXRhOiAndGlyaCcsXG4gIFVnYXJpdGljOiAndWdhcicsXG4gIFZhaTogJ3ZhaSAnLFxuICBXYXJhbmdfQ2l0aTogJ3dhcmEnLFxuICBPbGRfUGVyc2lhbjogJ3hwZW8nLFxuICBDdW5laWZvcm06ICd4c3V4JyxcbiAgWWk6ICd5aSAgJyxcbiAgSW5oZXJpdGVkOiAnemluaCcsXG4gIENvbW1vbjogJ3p5eXknLFxuICBVbmtub3duOiAnenp6eidcbn07XG52YXIgT1BFTlRZUEVfU0NSSVBUUyA9IHt9O1xuXG5mb3IgKHZhciBzY3JpcHQgaW4gVU5JQ09ERV9TQ1JJUFRTKSB7XG4gIHZhciB0YWcgPSBVTklDT0RFX1NDUklQVFNbc2NyaXB0XTtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh0YWcpKSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ2KHRhZyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgdCA9IF9zdGVwLnZhbHVlO1xuICAgICAgT1BFTlRZUEVfU0NSSVBUU1t0XSA9IHNjcmlwdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgT1BFTlRZUEVfU0NSSVBUU1t0YWddID0gc2NyaXB0O1xuICB9XG59XG5mdW5jdGlvbiBmcm9tT3BlblR5cGUodGFnKSB7XG4gIHJldHVybiBPUEVOVFlQRV9TQ1JJUFRTW3RhZ107XG59XG5mdW5jdGlvbiBmb3JTdHJpbmcoc3RyaW5nKSB7XG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoO1xuICB2YXIgaWR4ID0gMDtcblxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgdmFyIGNvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChpZHgrKyk7IC8vIENoZWNrIGlmIHRoaXMgaXMgYSBoaWdoIHN1cnJvZ2F0ZVxuXG4gICAgaWYgKDB4ZDgwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhkYmZmICYmIGlkeCA8IGxlbikge1xuICAgICAgdmFyIG5leHQgPSBzdHJpbmcuY2hhckNvZGVBdChpZHgpOyAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbG93IHN1cnJvZ2F0ZVxuXG4gICAgICBpZiAoMHhkYzAwIDw9IG5leHQgJiYgbmV4dCA8PSAweGRmZmYpIHtcbiAgICAgICAgaWR4Kys7XG4gICAgICAgIGNvZGUgPSAoKGNvZGUgJiAweDNGRikgPDwgMTApICsgKG5leHQgJiAweDNGRikgKyAweDEwMDAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfc2NyaXB0ID0gdW5pY29kZS5nZXRTY3JpcHQoY29kZSk7XG5cbiAgICBpZiAoX3NjcmlwdCAhPT0gJ0NvbW1vbicgJiYgX3NjcmlwdCAhPT0gJ0luaGVyaXRlZCcgJiYgX3NjcmlwdCAhPT0gJ1Vua25vd24nKSB7XG4gICAgICByZXR1cm4gVU5JQ09ERV9TQ1JJUFRTW19zY3JpcHRdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBVTklDT0RFX1NDUklQVFMuVW5rbm93bjtcbn1cbmZ1bmN0aW9uIGZvckNvZGVQb2ludHMoY29kZVBvaW50cykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29kZVBvaW50ID0gY29kZVBvaW50c1tpXTtcblxuICAgIHZhciBfc2NyaXB0MiA9IHVuaWNvZGUuZ2V0U2NyaXB0KGNvZGVQb2ludCk7XG5cbiAgICBpZiAoX3NjcmlwdDIgIT09ICdDb21tb24nICYmIF9zY3JpcHQyICE9PSAnSW5oZXJpdGVkJyAmJiBfc2NyaXB0MiAhPT0gJ1Vua25vd24nKSB7XG4gICAgICByZXR1cm4gVU5JQ09ERV9TQ1JJUFRTW19zY3JpcHQyXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gVU5JQ09ERV9TQ1JJUFRTLlVua25vd247XG59IC8vIFRoZSBzY3JpcHRzIGluIHRoaXMgbWFwIGFyZSB3cml0dGVuIGZyb20gcmlnaHQgdG8gbGVmdFxuXG52YXIgUlRMID0ge1xuICBhcmFiOiB0cnVlLFxuICAvLyBBcmFiaWNcbiAgaGVicjogdHJ1ZSxcbiAgLy8gSGVicmV3XG4gIHN5cmM6IHRydWUsXG4gIC8vIFN5cmlhY1xuICB0aGFhOiB0cnVlLFxuICAvLyBUaGFhbmFcbiAgY3BydDogdHJ1ZSxcbiAgLy8gQ3lwcmlvdCBTeWxsYWJhcnlcbiAga2hhcjogdHJ1ZSxcbiAgLy8gS2hhcm9zdGhpXG4gIHBobng6IHRydWUsXG4gIC8vIFBob2VuaWNpYW5cbiAgJ25rbyAnOiB0cnVlLFxuICAvLyBOJ0tvXG4gIGx5ZGk6IHRydWUsXG4gIC8vIEx5ZGlhblxuICBhdnN0OiB0cnVlLFxuICAvLyBBdmVzdGFuXG4gIGFybWk6IHRydWUsXG4gIC8vIEltcGVyaWFsIEFyYW1haWNcbiAgcGhsaTogdHJ1ZSxcbiAgLy8gSW5zY3JpcHRpb25hbCBQYWhsYXZpXG4gIHBydGk6IHRydWUsXG4gIC8vIEluc2NyaXB0aW9uYWwgUGFydGhpYW5cbiAgc2FyYjogdHJ1ZSxcbiAgLy8gT2xkIFNvdXRoIEFyYWJpYW5cbiAgb3JraDogdHJ1ZSxcbiAgLy8gT2xkIFR1cmtpYywgT3JraG9uIFJ1bmljXG4gIHNhbXI6IHRydWUsXG4gIC8vIFNhbWFyaXRhblxuICBtYW5kOiB0cnVlLFxuICAvLyBNYW5kYWljLCBNYW5kYWVhblxuICBtZXJjOiB0cnVlLFxuICAvLyBNZXJvaXRpYyBDdXJzaXZlXG4gIG1lcm86IHRydWUsXG4gIC8vIE1lcm9pdGljIEhpZXJvZ2x5cGhzXG4gIC8vIFVuaWNvZGUgNy4wIChub3QgbGlzdGVkIG9uIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9zY3JpcHR0YWdzLmh0bSlcbiAgbWFuaTogdHJ1ZSxcbiAgLy8gTWFuaWNoYWVhblxuICBtZW5kOiB0cnVlLFxuICAvLyBNZW5kZSBLaWtha3VpXG4gIG5iYXQ6IHRydWUsXG4gIC8vIE5hYmF0YWVhblxuICBuYXJiOiB0cnVlLFxuICAvLyBPbGQgTm9ydGggQXJhYmlhblxuICBwYWxtOiB0cnVlLFxuICAvLyBQYWxteXJlbmVcbiAgcGhscDogdHJ1ZSAvLyBQc2FsdGVyIFBhaGxhdmlcblxufTtcbmZ1bmN0aW9uIGRpcmVjdGlvbihzY3JpcHQpIHtcbiAgaWYgKFJUTFtzY3JpcHRdKSB7XG4gICAgcmV0dXJuICdydGwnO1xuICB9XG5cbiAgcmV0dXJuICdsdHInO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDcobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDcobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDcobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ3KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkNyhvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JDcoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDIodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MkMihDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDIoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQyKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcnVuIG9mIEdseXBoIGFuZCBHbHlwaFBvc2l0aW9uIG9iamVjdHMuXG4gKiBSZXR1cm5lZCBieSB0aGUgZm9udCBsYXlvdXQgbWV0aG9kLlxuICovXG5cbnZhciBHbHlwaFJ1biA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEdseXBoUnVuKGdseXBocywgZmVhdHVyZXMsIHNjcmlwdCwgbGFuZ3VhZ2UsIGRpcmVjdGlvbiQxKSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgR2x5cGggb2JqZWN0cyBpbiB0aGUgcnVuXG4gICAgICogQHR5cGUge0dseXBoW119XG4gICAgICovXG4gICAgdGhpcy5nbHlwaHMgPSBnbHlwaHM7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgR2x5cGhQb3NpdGlvbiBvYmplY3RzIGZvciBlYWNoIGdseXBoIGluIHRoZSBydW5cbiAgICAgKiBAdHlwZSB7R2x5cGhQb3NpdGlvbltdfVxuICAgICAqL1xuXG4gICAgdGhpcy5wb3NpdGlvbnMgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzY3JpcHQgdGhhdCB3YXMgcmVxdWVzdGVkIGZvciBzaGFwaW5nLiBUaGlzIHdhcyBlaXRoZXIgcGFzc2VkIGluIG9yIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0O1xuICAgIC8qKlxuICAgICAqIFRoZSBsYW5ndWFnZSByZXF1ZXN0ZWQgZm9yIHNoYXBpbmcsIGFzIHBhc3NlZCBpbi4gSWYgYG51bGxgLCB0aGUgZGVmYXVsdCBsYW5ndWFnZSBmb3IgdGhlXG4gICAgICogc2NyaXB0IHdhcyB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2UgfHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGlyZWN0aW9uIHJlcXVlc3RlZCBmb3Igc2hhcGluZywgYXMgcGFzc2VkIGluIChlaXRoZXIgbHRyIG9yIHJ0bCkuXG4gICAgICogSWYgYG51bGxgLCB0aGUgZGVmYXVsdCBkaXJlY3Rpb24gb2YgdGhlIHNjcmlwdCBpcyB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbiQxIHx8IGRpcmVjdGlvbihzY3JpcHQpO1xuICAgIC8qKlxuICAgICAqIFRoZSBmZWF0dXJlcyByZXF1ZXN0ZWQgZHVyaW5nIHNoYXBpbmcuIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiB1c2VyXG4gICAgICogc3BlY2lmaWVkIGZlYXR1cmVzIGFuZCBmZWF0dXJlcyBjaG9zZW4gYnkgdGhlIHNoYXBlci5cbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqL1xuXG4gICAgdGhpcy5mZWF0dXJlcyA9IHt9OyAvLyBDb252ZXJ0IGZlYXR1cmVzIHRvIGFuIG9iamVjdFxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdHVyZXMpKSB7XG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDcoZmVhdHVyZXMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgICB2YXIgdGFnID0gX3N0ZXAudmFsdWU7XG4gICAgICAgIHRoaXMuZmVhdHVyZXNbdGFnXSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZmVhdHVyZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgYWR2YW5jZSB3aWR0aCBvZiB0aGUgcnVuLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyQyKEdseXBoUnVuLCBbe1xuICAgIGtleTogXCJhZHZhbmNlV2lkdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciB3aWR0aCA9IDA7XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDcodGhpcy5wb3NpdGlvbnMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBfc3RlcDIudmFsdWU7XG4gICAgICAgIHdpZHRoICs9IHBvc2l0aW9uLnhBZHZhbmNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gd2lkdGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhZHZhbmNlIGhlaWdodCBvZiB0aGUgcnVuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZHZhbmNlSGVpZ2h0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgaGVpZ2h0ID0gMDtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNyh0aGlzLnBvc2l0aW9ucyksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IF9zdGVwMy52YWx1ZTtcbiAgICAgICAgaGVpZ2h0ICs9IHBvc2l0aW9uLnlBZHZhbmNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYm91bmRpbmcgYm94IGNvbnRhaW5pbmcgYWxsIGdseXBocyBpbiB0aGUgcnVuLlxuICAgICAqIEB0eXBlIHtCQm94fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYmJveFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGJib3ggPSBuZXcgQkJveCgpO1xuICAgICAgdmFyIHggPSAwO1xuICAgICAgdmFyIHkgPSAwO1xuXG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5nbHlwaHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBnbHlwaCA9IHRoaXMuZ2x5cGhzW2luZGV4XTtcbiAgICAgICAgdmFyIHAgPSB0aGlzLnBvc2l0aW9uc1tpbmRleF07XG4gICAgICAgIHZhciBiID0gZ2x5cGguYmJveDtcbiAgICAgICAgYmJveC5hZGRQb2ludChiLm1pblggKyB4ICsgcC54T2Zmc2V0LCBiLm1pblkgKyB5ICsgcC55T2Zmc2V0KTtcbiAgICAgICAgYmJveC5hZGRQb2ludChiLm1heFggKyB4ICsgcC54T2Zmc2V0LCBiLm1heFkgKyB5ICsgcC55T2Zmc2V0KTtcbiAgICAgICAgeCArPSBwLnhBZHZhbmNlO1xuICAgICAgICB5ICs9IHAueUFkdmFuY2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiYm94O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBHbHlwaFJ1bjtcbn0oKTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHBvc2l0aW9uaW5nIGluZm9ybWF0aW9uIGZvciBhIGdseXBoIGluIGEgR2x5cGhSdW4uXG4gKi9cbnZhciBHbHlwaFBvc2l0aW9uID0gZnVuY3Rpb24gR2x5cGhQb3NpdGlvbih4QWR2YW5jZSwgeUFkdmFuY2UsIHhPZmZzZXQsIHlPZmZzZXQpIHtcbiAgaWYgKHhBZHZhbmNlID09PSB2b2lkIDApIHtcbiAgICB4QWR2YW5jZSA9IDA7XG4gIH1cblxuICBpZiAoeUFkdmFuY2UgPT09IHZvaWQgMCkge1xuICAgIHlBZHZhbmNlID0gMDtcbiAgfVxuXG4gIGlmICh4T2Zmc2V0ID09PSB2b2lkIDApIHtcbiAgICB4T2Zmc2V0ID0gMDtcbiAgfVxuXG4gIGlmICh5T2Zmc2V0ID09PSB2b2lkIDApIHtcbiAgICB5T2Zmc2V0ID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IHRvIG1vdmUgdGhlIHZpcnR1YWwgcGVuIGluIHRoZSBYIGRpcmVjdGlvbiBhZnRlciByZW5kZXJpbmcgdGhpcyBnbHlwaC5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIHRoaXMueEFkdmFuY2UgPSB4QWR2YW5jZTtcbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgdG8gbW92ZSB0aGUgdmlydHVhbCBwZW4gaW4gdGhlIFkgZGlyZWN0aW9uIGFmdGVyIHJlbmRlcmluZyB0aGlzIGdseXBoLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuICB0aGlzLnlBZHZhbmNlID0geUFkdmFuY2U7XG4gIC8qKlxuICAgKiBUaGUgb2Zmc2V0IGZyb20gdGhlIHBlbiBwb3NpdGlvbiBpbiB0aGUgWCBkaXJlY3Rpb24gYXQgd2hpY2ggdG8gcmVuZGVyIHRoaXMgZ2x5cGguXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuXG4gIHRoaXMueE9mZnNldCA9IHhPZmZzZXQ7XG4gIC8qKlxuICAgKiBUaGUgb2Zmc2V0IGZyb20gdGhlIHBlbiBwb3NpdGlvbiBpbiB0aGUgWSBkaXJlY3Rpb24gYXQgd2hpY2ggdG8gcmVuZGVyIHRoaXMgZ2x5cGguXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuXG4gIHRoaXMueU9mZnNldCA9IHlPZmZzZXQ7XG59O1xuXG4vLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wOS9BcHBlbmRpeEYuaHRtbFxuLy8gYW5kIC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvcmVUZXh0LmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvU0ZOVExheW91dFR5cGVzLmggb24gYSBNYWNcbnZhciBmZWF0dXJlcyA9IHtcbiAgYWxsVHlwb2dyYXBoaWNGZWF0dXJlczoge1xuICAgIGNvZGU6IDAsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICBhbGxUeXBlRmVhdHVyZXM6IDBcbiAgfSxcbiAgbGlnYXR1cmVzOiB7XG4gICAgY29kZTogMSxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIHJlcXVpcmVkTGlnYXR1cmVzOiAwLFxuICAgIGNvbW1vbkxpZ2F0dXJlczogMixcbiAgICByYXJlTGlnYXR1cmVzOiA0LFxuICAgIC8vIGxvZ29zOiA2XG4gICAgcmVidXNQaWN0dXJlczogOCxcbiAgICBkaXBodGhvbmdMaWdhdHVyZXM6IDEwLFxuICAgIHNxdWFyZWRMaWdhdHVyZXM6IDEyLFxuICAgIGFiYnJldlNxdWFyZWRMaWdhdHVyZXM6IDE0LFxuICAgIHN5bWJvbExpZ2F0dXJlczogMTYsXG4gICAgY29udGV4dHVhbExpZ2F0dXJlczogMTgsXG4gICAgaGlzdG9yaWNhbExpZ2F0dXJlczogMjBcbiAgfSxcbiAgY3Vyc2l2ZUNvbm5lY3Rpb246IHtcbiAgICBjb2RlOiAyLFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICB1bmNvbm5lY3RlZDogMCxcbiAgICBwYXJ0aWFsbHlDb25uZWN0ZWQ6IDEsXG4gICAgY3Vyc2l2ZTogMlxuICB9LFxuICBsZXR0ZXJDYXNlOiB7XG4gICAgY29kZTogMyxcbiAgICBleGNsdXNpdmU6IHRydWVcbiAgfSxcbiAgLy8gdXBwZXJBbmRMb3dlckNhc2U6IDAgICAgICAgICAgIyBkZXByZWNhdGVkXG4gIC8vIGFsbENhcHM6IDEgICAgICAgICAgICAgICAgICAgICMgZGVwcmVjYXRlZFxuICAvLyBhbGxMb3dlckNhc2U6IDIgICAgICAgICAgICAgICAjIGRlcHJlY2F0ZWRcbiAgLy8gc21hbGxDYXBzOiAzICAgICAgICAgICAgICAgICAgIyBkZXByZWNhdGVkXG4gIC8vIGluaXRpYWxDYXBzOiA0ICAgICAgICAgICAgICAgICMgZGVwcmVjYXRlZFxuICAvLyBpbml0aWFsQ2Fwc0FuZFNtYWxsQ2FwczogNSAgICAjIGRlcHJlY2F0ZWRcbiAgdmVydGljYWxTdWJzdGl0dXRpb246IHtcbiAgICBjb2RlOiA0LFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgc3Vic3RpdHV0ZVZlcnRpY2FsRm9ybXM6IDBcbiAgfSxcbiAgbGluZ3Vpc3RpY1JlYXJyYW5nZW1lbnQ6IHtcbiAgICBjb2RlOiA1LFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgbGluZ3Vpc3RpY1JlYXJyYW5nZW1lbnQ6IDBcbiAgfSxcbiAgbnVtYmVyU3BhY2luZzoge1xuICAgIGNvZGU6IDYsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIG1vbm9zcGFjZWROdW1iZXJzOiAwLFxuICAgIHByb3BvcnRpb25hbE51bWJlcnM6IDEsXG4gICAgdGhpcmRXaWR0aE51bWJlcnM6IDIsXG4gICAgcXVhcnRlcldpZHRoTnVtYmVyczogM1xuICB9LFxuICBzbWFydFN3YXNoOiB7XG4gICAgY29kZTogOCxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIHdvcmRJbml0aWFsU3dhc2hlczogMCxcbiAgICB3b3JkRmluYWxTd2FzaGVzOiAyLFxuICAgIC8vIGxpbmVJbml0aWFsU3dhc2hlczogNFxuICAgIC8vIGxpbmVGaW5hbFN3YXNoZXM6IDZcbiAgICBub25GaW5hbFN3YXNoZXM6IDhcbiAgfSxcbiAgZGlhY3JpdGljczoge1xuICAgIGNvZGU6IDksXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIHNob3dEaWFjcml0aWNzOiAwLFxuICAgIGhpZGVEaWFjcml0aWNzOiAxLFxuICAgIGRlY29tcG9zZURpYWNyaXRpY3M6IDJcbiAgfSxcbiAgdmVydGljYWxQb3NpdGlvbjoge1xuICAgIGNvZGU6IDEwLFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBub3JtYWxQb3NpdGlvbjogMCxcbiAgICBzdXBlcmlvcnM6IDEsXG4gICAgaW5mZXJpb3JzOiAyLFxuICAgIG9yZGluYWxzOiAzLFxuICAgIHNjaWVudGlmaWNJbmZlcmlvcnM6IDRcbiAgfSxcbiAgZnJhY3Rpb25zOiB7XG4gICAgY29kZTogMTEsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIG5vRnJhY3Rpb25zOiAwLFxuICAgIHZlcnRpY2FsRnJhY3Rpb25zOiAxLFxuICAgIGRpYWdvbmFsRnJhY3Rpb25zOiAyXG4gIH0sXG4gIG92ZXJsYXBwaW5nQ2hhcmFjdGVyczoge1xuICAgIGNvZGU6IDEzLFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgcHJldmVudE92ZXJsYXA6IDBcbiAgfSxcbiAgdHlwb2dyYXBoaWNFeHRyYXM6IHtcbiAgICBjb2RlOiAxNCxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIC8vIGh5cGhlbnNUb0VtRGFzaDogMFxuICAgIC8vIGh5cGhlblRvRW5EYXNoOiAyXG4gICAgc2xhc2hlZFplcm86IDRcbiAgfSxcbiAgLy8gZm9ybUludGVycm9iYW5nOiA2XG4gIC8vIHNtYXJ0UXVvdGVzOiA4XG4gIC8vIHBlcmlvZHNUb0VsbGlwc2lzOiAxMFxuICBtYXRoZW1hdGljYWxFeHRyYXM6IHtcbiAgICBjb2RlOiAxNSxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIC8vIGh5cGhlblRvTWludXM6IDBcbiAgICAvLyBhc3RlcmlzdG9NdWx0aXBseTogMlxuICAgIC8vIHNsYXNoVG9EaXZpZGU6IDRcbiAgICAvLyBpbmVxdWFsaXR5TGlnYXR1cmVzOiA2XG4gICAgLy8gZXhwb25lbnRzOiA4XG4gICAgbWF0aGVtYXRpY2FsR3JlZWs6IDEwXG4gIH0sXG4gIG9ybmFtZW50U2V0czoge1xuICAgIGNvZGU6IDE2LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBub09ybmFtZW50czogMCxcbiAgICBkaW5nYmF0czogMSxcbiAgICBwaUNoYXJhY3RlcnM6IDIsXG4gICAgZmxldXJvbnM6IDMsXG4gICAgZGVjb3JhdGl2ZUJvcmRlcnM6IDQsXG4gICAgaW50ZXJuYXRpb25hbFN5bWJvbHM6IDUsXG4gICAgbWF0aFN5bWJvbHM6IDZcbiAgfSxcbiAgY2hhcmFjdGVyQWx0ZXJuYXRpdmVzOiB7XG4gICAgY29kZTogMTcsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIG5vQWx0ZXJuYXRlczogMFxuICB9LFxuICAvLyB1c2VyIGRlZmluZWQgb3B0aW9uc1xuICBkZXNpZ25Db21wbGV4aXR5OiB7XG4gICAgY29kZTogMTgsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIGRlc2lnbkxldmVsMTogMCxcbiAgICBkZXNpZ25MZXZlbDI6IDEsXG4gICAgZGVzaWduTGV2ZWwzOiAyLFxuICAgIGRlc2lnbkxldmVsNDogMyxcbiAgICBkZXNpZ25MZXZlbDU6IDRcbiAgfSxcbiAgc3R5bGVPcHRpb25zOiB7XG4gICAgY29kZTogMTksXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIG5vU3R5bGVPcHRpb25zOiAwLFxuICAgIGRpc3BsYXlUZXh0OiAxLFxuICAgIGVuZ3JhdmVkVGV4dDogMixcbiAgICBpbGx1bWluYXRlZENhcHM6IDMsXG4gICAgdGl0bGluZ0NhcHM6IDQsXG4gICAgdGFsbENhcHM6IDVcbiAgfSxcbiAgY2hhcmFjdGVyU2hhcGU6IHtcbiAgICBjb2RlOiAyMCxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgdHJhZGl0aW9uYWxDaGFyYWN0ZXJzOiAwLFxuICAgIHNpbXBsaWZpZWRDaGFyYWN0ZXJzOiAxLFxuICAgIEpJUzE5NzhDaGFyYWN0ZXJzOiAyLFxuICAgIEpJUzE5ODNDaGFyYWN0ZXJzOiAzLFxuICAgIEpJUzE5OTBDaGFyYWN0ZXJzOiA0LFxuICAgIHRyYWRpdGlvbmFsQWx0T25lOiA1LFxuICAgIHRyYWRpdGlvbmFsQWx0VHdvOiA2LFxuICAgIHRyYWRpdGlvbmFsQWx0VGhyZWU6IDcsXG4gICAgdHJhZGl0aW9uYWxBbHRGb3VyOiA4LFxuICAgIHRyYWRpdGlvbmFsQWx0Rml2ZTogOSxcbiAgICBleHBlcnRDaGFyYWN0ZXJzOiAxMCxcbiAgICBKSVMyMDA0Q2hhcmFjdGVyczogMTEsXG4gICAgaG9qb0NoYXJhY3RlcnM6IDEyLFxuICAgIE5MQ0NoYXJhY3RlcnM6IDEzLFxuICAgIHRyYWRpdGlvbmFsTmFtZXNDaGFyYWN0ZXJzOiAxNFxuICB9LFxuICBudW1iZXJDYXNlOiB7XG4gICAgY29kZTogMjEsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIGxvd2VyQ2FzZU51bWJlcnM6IDAsXG4gICAgdXBwZXJDYXNlTnVtYmVyczogMVxuICB9LFxuICB0ZXh0U3BhY2luZzoge1xuICAgIGNvZGU6IDIyLFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBwcm9wb3J0aW9uYWxUZXh0OiAwLFxuICAgIG1vbm9zcGFjZWRUZXh0OiAxLFxuICAgIGhhbGZXaWR0aFRleHQ6IDIsXG4gICAgdGhpcmRXaWR0aFRleHQ6IDMsXG4gICAgcXVhcnRlcldpZHRoVGV4dDogNCxcbiAgICBhbHRQcm9wb3J0aW9uYWxUZXh0OiA1LFxuICAgIGFsdEhhbGZXaWR0aFRleHQ6IDZcbiAgfSxcbiAgdHJhbnNsaXRlcmF0aW9uOiB7XG4gICAgY29kZTogMjMsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIG5vVHJhbnNsaXRlcmF0aW9uOiAwXG4gIH0sXG4gIC8vIGhhbmphVG9IYW5ndWw6IDFcbiAgLy8gaGlyYWdhbmFUb0thdGFrYW5hOiAyXG4gIC8vIGthdGFrYW5hVG9IaXJhZ2FuYTogM1xuICAvLyBrYW5hVG9Sb21hbml6YXRpb246IDRcbiAgLy8gcm9tYW5pemF0aW9uVG9IaXJhZ2FuYTogNVxuICAvLyByb21hbml6YXRpb25Ub0thdGFrYW5hOiA2XG4gIC8vIGhhbmphVG9IYW5ndWxBbHRPbmU6IDdcbiAgLy8gaGFuamFUb0hhbmd1bEFsdFR3bzogOFxuICAvLyBoYW5qYVRvSGFuZ3VsQWx0VGhyZWU6IDlcbiAgYW5ub3RhdGlvbjoge1xuICAgIGNvZGU6IDI0LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBub0Fubm90YXRpb246IDAsXG4gICAgYm94QW5ub3RhdGlvbjogMSxcbiAgICByb3VuZGVkQm94QW5ub3RhdGlvbjogMixcbiAgICBjaXJjbGVBbm5vdGF0aW9uOiAzLFxuICAgIGludmVydGVkQ2lyY2xlQW5ub3RhdGlvbjogNCxcbiAgICBwYXJlbnRoZXNpc0Fubm90YXRpb246IDUsXG4gICAgcGVyaW9kQW5ub3RhdGlvbjogNixcbiAgICByb21hbk51bWVyYWxBbm5vdGF0aW9uOiA3LFxuICAgIGRpYW1vbmRBbm5vdGF0aW9uOiA4LFxuICAgIGludmVydGVkQm94QW5ub3RhdGlvbjogOSxcbiAgICBpbnZlcnRlZFJvdW5kZWRCb3hBbm5vdGF0aW9uOiAxMFxuICB9LFxuICBrYW5hU3BhY2luZzoge1xuICAgIGNvZGU6IDI1LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBmdWxsV2lkdGhLYW5hOiAwLFxuICAgIHByb3BvcnRpb25hbEthbmE6IDFcbiAgfSxcbiAgaWRlb2dyYXBoaWNTcGFjaW5nOiB7XG4gICAgY29kZTogMjYsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIGZ1bGxXaWR0aElkZW9ncmFwaHM6IDAsXG4gICAgcHJvcG9ydGlvbmFsSWRlb2dyYXBoczogMSxcbiAgICBoYWxmV2lkdGhJZGVvZ3JhcGhzOiAyXG4gIH0sXG4gIHVuaWNvZGVEZWNvbXBvc2l0aW9uOiB7XG4gICAgY29kZTogMjcsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICBjYW5vbmljYWxDb21wb3NpdGlvbjogMCxcbiAgICBjb21wYXRpYmlsaXR5Q29tcG9zaXRpb246IDIsXG4gICAgdHJhbnNjb2RpbmdDb21wb3NpdGlvbjogNFxuICB9LFxuICBydWJ5S2FuYToge1xuICAgIGNvZGU6IDI4LFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgLy8gbm9SdWJ5S2FuYTogMCAgICAgIyBkZXByZWNhdGVkIC0gdXNlIHJ1YnlLYW5hT2ZmIGluc3RlYWRcbiAgICAvLyBydWJ5S2FuYTogMSAgICAgIyBkZXByZWNhdGVkIC0gdXNlIHJ1YnlLYW5hT24gaW5zdGVhZFxuICAgIHJ1YnlLYW5hOiAyXG4gIH0sXG4gIENKS1N5bWJvbEFsdGVybmF0aXZlczoge1xuICAgIGNvZGU6IDI5LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBub0NKS1N5bWJvbEFsdGVybmF0aXZlczogMCxcbiAgICBDSktTeW1ib2xBbHRPbmU6IDEsXG4gICAgQ0pLU3ltYm9sQWx0VHdvOiAyLFxuICAgIENKS1N5bWJvbEFsdFRocmVlOiAzLFxuICAgIENKS1N5bWJvbEFsdEZvdXI6IDQsXG4gICAgQ0pLU3ltYm9sQWx0Rml2ZTogNVxuICB9LFxuICBpZGVvZ3JhcGhpY0FsdGVybmF0aXZlczoge1xuICAgIGNvZGU6IDMwLFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBub0lkZW9ncmFwaGljQWx0ZXJuYXRpdmVzOiAwLFxuICAgIGlkZW9ncmFwaGljQWx0T25lOiAxLFxuICAgIGlkZW9ncmFwaGljQWx0VHdvOiAyLFxuICAgIGlkZW9ncmFwaGljQWx0VGhyZWU6IDMsXG4gICAgaWRlb2dyYXBoaWNBbHRGb3VyOiA0LFxuICAgIGlkZW9ncmFwaGljQWx0Rml2ZTogNVxuICB9LFxuICBDSktWZXJ0aWNhbFJvbWFuUGxhY2VtZW50OiB7XG4gICAgY29kZTogMzEsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIENKS1ZlcnRpY2FsUm9tYW5DZW50ZXJlZDogMCxcbiAgICBDSktWZXJ0aWNhbFJvbWFuSEJhc2VsaW5lOiAxXG4gIH0sXG4gIGl0YWxpY0NKS1JvbWFuOiB7XG4gICAgY29kZTogMzIsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICAvLyBub0NKS0l0YWxpY1JvbWFuOiAwICAgICAjIGRlcHJlY2F0ZWQgLSB1c2UgQ0pLSXRhbGljUm9tYW5PZmYgaW5zdGVhZFxuICAgIC8vIENKS0l0YWxpY1JvbWFuOiAxICAgICAjIGRlcHJlY2F0ZWQgLSB1c2UgQ0pLSXRhbGljUm9tYW5PbiBpbnN0ZWFkXG4gICAgQ0pLSXRhbGljUm9tYW46IDJcbiAgfSxcbiAgY2FzZVNlbnNpdGl2ZUxheW91dDoge1xuICAgIGNvZGU6IDMzLFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgY2FzZVNlbnNpdGl2ZUxheW91dDogMCxcbiAgICBjYXNlU2Vuc2l0aXZlU3BhY2luZzogMlxuICB9LFxuICBhbHRlcm5hdGVLYW5hOiB7XG4gICAgY29kZTogMzQsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICBhbHRlcm5hdGVIb3JpekthbmE6IDAsXG4gICAgYWx0ZXJuYXRlVmVydEthbmE6IDJcbiAgfSxcbiAgc3R5bGlzdGljQWx0ZXJuYXRpdmVzOiB7XG4gICAgY29kZTogMzUsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICBub1N0eWxpc3RpY0FsdGVybmF0ZXM6IDAsXG4gICAgc3R5bGlzdGljQWx0T25lOiAyLFxuICAgIHN0eWxpc3RpY0FsdFR3bzogNCxcbiAgICBzdHlsaXN0aWNBbHRUaHJlZTogNixcbiAgICBzdHlsaXN0aWNBbHRGb3VyOiA4LFxuICAgIHN0eWxpc3RpY0FsdEZpdmU6IDEwLFxuICAgIHN0eWxpc3RpY0FsdFNpeDogMTIsXG4gICAgc3R5bGlzdGljQWx0U2V2ZW46IDE0LFxuICAgIHN0eWxpc3RpY0FsdEVpZ2h0OiAxNixcbiAgICBzdHlsaXN0aWNBbHROaW5lOiAxOCxcbiAgICBzdHlsaXN0aWNBbHRUZW46IDIwLFxuICAgIHN0eWxpc3RpY0FsdEVsZXZlbjogMjIsXG4gICAgc3R5bGlzdGljQWx0VHdlbHZlOiAyNCxcbiAgICBzdHlsaXN0aWNBbHRUaGlydGVlbjogMjYsXG4gICAgc3R5bGlzdGljQWx0Rm91cnRlZW46IDI4LFxuICAgIHN0eWxpc3RpY0FsdEZpZnRlZW46IDMwLFxuICAgIHN0eWxpc3RpY0FsdFNpeHRlZW46IDMyLFxuICAgIHN0eWxpc3RpY0FsdFNldmVudGVlbjogMzQsXG4gICAgc3R5bGlzdGljQWx0RWlnaHRlZW46IDM2LFxuICAgIHN0eWxpc3RpY0FsdE5pbmV0ZWVuOiAzOCxcbiAgICBzdHlsaXN0aWNBbHRUd2VudHk6IDQwXG4gIH0sXG4gIGNvbnRleHR1YWxBbHRlcm5hdGVzOiB7XG4gICAgY29kZTogMzYsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICBjb250ZXh0dWFsQWx0ZXJuYXRlczogMCxcbiAgICBzd2FzaEFsdGVybmF0ZXM6IDIsXG4gICAgY29udGV4dHVhbFN3YXNoQWx0ZXJuYXRlczogNFxuICB9LFxuICBsb3dlckNhc2U6IHtcbiAgICBjb2RlOiAzNyxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgZGVmYXVsdExvd2VyQ2FzZTogMCxcbiAgICBsb3dlckNhc2VTbWFsbENhcHM6IDEsXG4gICAgbG93ZXJDYXNlUGV0aXRlQ2FwczogMlxuICB9LFxuICB1cHBlckNhc2U6IHtcbiAgICBjb2RlOiAzOCxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgZGVmYXVsdFVwcGVyQ2FzZTogMCxcbiAgICB1cHBlckNhc2VTbWFsbENhcHM6IDEsXG4gICAgdXBwZXJDYXNlUGV0aXRlQ2FwczogMlxuICB9LFxuICBsYW5ndWFnZVRhZzoge1xuICAgIC8vIGluZGljZXMgaW50byBsdGFnIHRhYmxlXG4gICAgY29kZTogMzksXG4gICAgZXhjbHVzaXZlOiB0cnVlXG4gIH0sXG4gIENKS1JvbWFuU3BhY2luZzoge1xuICAgIGNvZGU6IDEwMyxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgaGFsZldpZHRoQ0pLUm9tYW46IDAsXG4gICAgcHJvcG9ydGlvbmFsQ0pLUm9tYW46IDEsXG4gICAgZGVmYXVsdENKS1JvbWFuOiAyLFxuICAgIGZ1bGxXaWR0aENKS1JvbWFuOiAzXG4gIH1cbn07XG5cbnZhciBmZWF0dXJlID0gZnVuY3Rpb24gZmVhdHVyZShuYW1lLCBzZWxlY3Rvcikge1xuICByZXR1cm4gW2ZlYXR1cmVzW25hbWVdLmNvZGUsIGZlYXR1cmVzW25hbWVdW3NlbGVjdG9yXV07XG59O1xuXG52YXIgT1RNYXBwaW5nID0ge1xuICBybGlnOiBmZWF0dXJlKCdsaWdhdHVyZXMnLCAncmVxdWlyZWRMaWdhdHVyZXMnKSxcbiAgY2xpZzogZmVhdHVyZSgnbGlnYXR1cmVzJywgJ2NvbnRleHR1YWxMaWdhdHVyZXMnKSxcbiAgZGxpZzogZmVhdHVyZSgnbGlnYXR1cmVzJywgJ3JhcmVMaWdhdHVyZXMnKSxcbiAgaGxpZzogZmVhdHVyZSgnbGlnYXR1cmVzJywgJ2hpc3RvcmljYWxMaWdhdHVyZXMnKSxcbiAgbGlnYTogZmVhdHVyZSgnbGlnYXR1cmVzJywgJ2NvbW1vbkxpZ2F0dXJlcycpLFxuICBoaXN0OiBmZWF0dXJlKCdsaWdhdHVyZXMnLCAnaGlzdG9yaWNhbExpZ2F0dXJlcycpLFxuICAvLyA/P1xuICBzbWNwOiBmZWF0dXJlKCdsb3dlckNhc2UnLCAnbG93ZXJDYXNlU21hbGxDYXBzJyksXG4gIHBjYXA6IGZlYXR1cmUoJ2xvd2VyQ2FzZScsICdsb3dlckNhc2VQZXRpdGVDYXBzJyksXG4gIGZyYWM6IGZlYXR1cmUoJ2ZyYWN0aW9ucycsICdkaWFnb25hbEZyYWN0aW9ucycpLFxuICBkbm9tOiBmZWF0dXJlKCdmcmFjdGlvbnMnLCAnZGlhZ29uYWxGcmFjdGlvbnMnKSxcbiAgLy8gPz9cbiAgbnVtcjogZmVhdHVyZSgnZnJhY3Rpb25zJywgJ2RpYWdvbmFsRnJhY3Rpb25zJyksXG4gIC8vID8/XG4gIGFmcmM6IGZlYXR1cmUoJ2ZyYWN0aW9ucycsICd2ZXJ0aWNhbEZyYWN0aW9ucycpLFxuICAvLyBhYWx0XG4gIC8vIGFidmYsIGFidm0sIGFidnMsIGFraG4sIGJsd2YsIGJsd20sIGJsd3MsIGNmYXIsIGNqY3QsIGNwc3AsIGZhbHQsIGlzb2wsIGphbHQsIGxqbW8sIG1zZXQ/XG4gIC8vIGx0cmEsIGx0cm0sIG51a3QsIHByZWYsIHByZXMsIHBzdGYsIHBzdHMsIHJhbmQsIHJrcmYsIHJwaGYsIHJ0bGEsIHJ0bG0sIHNpemUsIHRqbW8sIHRudW0/XG4gIC8vIHVuaWMsIHZhdHUsIHZoYWwsIHZqbW8sIHZwYWwsIHZydDJcbiAgLy8gZGlzdCAtPiB0cmFrIHRhYmxlP1xuICAvLyBrZXJuLCB2a3JuIC0+IGtlcm4gdGFibGVcbiAgLy8gbGZiZCArIG9wYmQgKyBydGJkIC0+IG9wYmQgdGFibGU/XG4gIC8vIG1hcmssIG1rbWsgLT4gYWNudCB0YWJsZT9cbiAgLy8gbG9jbCAtPiBsYW5ndWFnZVRhZyArIGx0YWcgdGFibGVcbiAgXCJjYXNlXCI6IGZlYXR1cmUoJ2Nhc2VTZW5zaXRpdmVMYXlvdXQnLCAnY2FzZVNlbnNpdGl2ZUxheW91dCcpLFxuICAvLyBhbHNvIGNhc2VTZW5zaXRpdmVTcGFjaW5nXG4gIGNjbXA6IGZlYXR1cmUoJ3VuaWNvZGVEZWNvbXBvc2l0aW9uJywgJ2Nhbm9uaWNhbENvbXBvc2l0aW9uJyksXG4gIC8vIGNvbXBhdGliaWxpdHlDb21wb3NpdGlvbj9cbiAgY3BjdDogZmVhdHVyZSgnQ0pLVmVydGljYWxSb21hblBsYWNlbWVudCcsICdDSktWZXJ0aWNhbFJvbWFuQ2VudGVyZWQnKSxcbiAgLy8gZ3Vlc3MuLi4sIHByb2JhYmx5IG5vdCBnaXZlbiBiZWxvd1xuICB2YWx0OiBmZWF0dXJlKCdDSktWZXJ0aWNhbFJvbWFuUGxhY2VtZW50JywgJ0NKS1ZlcnRpY2FsUm9tYW5DZW50ZXJlZCcpLFxuICBzd3NoOiBmZWF0dXJlKCdjb250ZXh0dWFsQWx0ZXJuYXRlcycsICdzd2FzaEFsdGVybmF0ZXMnKSxcbiAgY3N3aDogZmVhdHVyZSgnY29udGV4dHVhbEFsdGVybmF0ZXMnLCAnY29udGV4dHVhbFN3YXNoQWx0ZXJuYXRlcycpLFxuICBjdXJzOiBmZWF0dXJlKCdjdXJzaXZlQ29ubmVjdGlvbicsICdjdXJzaXZlJyksXG4gIC8vID8/XG4gIGMycGM6IGZlYXR1cmUoJ3VwcGVyQ2FzZScsICd1cHBlckNhc2VQZXRpdGVDYXBzJyksXG4gIGMyc2M6IGZlYXR1cmUoJ3VwcGVyQ2FzZScsICd1cHBlckNhc2VTbWFsbENhcHMnKSxcbiAgaW5pdDogZmVhdHVyZSgnc21hcnRTd2FzaCcsICd3b3JkSW5pdGlhbFN3YXNoZXMnKSxcbiAgLy8gPz9cbiAgZmluMjogZmVhdHVyZSgnc21hcnRTd2FzaCcsICd3b3JkRmluYWxTd2FzaGVzJyksXG4gIC8vID8/XG4gIG1lZGk6IGZlYXR1cmUoJ3NtYXJ0U3dhc2gnLCAnbm9uRmluYWxTd2FzaGVzJyksXG4gIC8vID8/XG4gIG1lZDI6IGZlYXR1cmUoJ3NtYXJ0U3dhc2gnLCAnbm9uRmluYWxTd2FzaGVzJyksXG4gIC8vID8/XG4gIGZpbjM6IGZlYXR1cmUoJ3NtYXJ0U3dhc2gnLCAnd29yZEZpbmFsU3dhc2hlcycpLFxuICAvLyA/P1xuICBmaW5hOiBmZWF0dXJlKCdzbWFydFN3YXNoJywgJ3dvcmRGaW5hbFN3YXNoZXMnKSxcbiAgLy8gPz9cbiAgcGtuYTogZmVhdHVyZSgna2FuYVNwYWNpbmcnLCAncHJvcG9ydGlvbmFsS2FuYScpLFxuICBoYWxmOiBmZWF0dXJlKCd0ZXh0U3BhY2luZycsICdoYWxmV2lkdGhUZXh0JyksXG4gIC8vIGFsc28gSGFsZldpZHRoQ0pLUm9tYW4sIEhhbGZXaWR0aElkZW9ncmFwaHM/XG4gIGhhbHQ6IGZlYXR1cmUoJ3RleHRTcGFjaW5nJywgJ2FsdEhhbGZXaWR0aFRleHQnKSxcbiAgaGtuYTogZmVhdHVyZSgnYWx0ZXJuYXRlS2FuYScsICdhbHRlcm5hdGVIb3JpekthbmEnKSxcbiAgdmtuYTogZmVhdHVyZSgnYWx0ZXJuYXRlS2FuYScsICdhbHRlcm5hdGVWZXJ0S2FuYScpLFxuICAvLyBobmdsOiBmZWF0dXJlICd0cmFuc2xpdGVyYXRpb24nLCAnaGFuamFUb0hhbmd1bFNlbGVjdG9yJyAjIGRlcHJlY2F0ZWRcbiAgaXRhbDogZmVhdHVyZSgnaXRhbGljQ0pLUm9tYW4nLCAnQ0pLSXRhbGljUm9tYW4nKSxcbiAgbG51bTogZmVhdHVyZSgnbnVtYmVyQ2FzZScsICd1cHBlckNhc2VOdW1iZXJzJyksXG4gIG9udW06IGZlYXR1cmUoJ251bWJlckNhc2UnLCAnbG93ZXJDYXNlTnVtYmVycycpLFxuICBtZ3JrOiBmZWF0dXJlKCdtYXRoZW1hdGljYWxFeHRyYXMnLCAnbWF0aGVtYXRpY2FsR3JlZWsnKSxcbiAgLy8gbmFsdDogbm90IGVub3VnaCBpbmZvLiB3aGF0IHR5cGUgb2YgYW5ub3RhdGlvbj9cbiAgLy8gb3JubTogZGl0dG8sIHdoaWNoIG9ybmFtZW50IHN0eWxlP1xuICBjYWx0OiBmZWF0dXJlKCdjb250ZXh0dWFsQWx0ZXJuYXRlcycsICdjb250ZXh0dWFsQWx0ZXJuYXRlcycpLFxuICAvLyBvciBtb3JlP1xuICB2cnQyOiBmZWF0dXJlKCd2ZXJ0aWNhbFN1YnN0aXR1dGlvbicsICdzdWJzdGl0dXRlVmVydGljYWxGb3JtcycpLFxuICAvLyBvaC4uLiBiZWxvdz9cbiAgdmVydDogZmVhdHVyZSgndmVydGljYWxTdWJzdGl0dXRpb24nLCAnc3Vic3RpdHV0ZVZlcnRpY2FsRm9ybXMnKSxcbiAgdG51bTogZmVhdHVyZSgnbnVtYmVyU3BhY2luZycsICdtb25vc3BhY2VkTnVtYmVycycpLFxuICBwbnVtOiBmZWF0dXJlKCdudW1iZXJTcGFjaW5nJywgJ3Byb3BvcnRpb25hbE51bWJlcnMnKSxcbiAgc3VwczogZmVhdHVyZSgndmVydGljYWxQb3NpdGlvbicsICdzdXBlcmlvcnMnKSxcbiAgc3ViczogZmVhdHVyZSgndmVydGljYWxQb3NpdGlvbicsICdpbmZlcmlvcnMnKSxcbiAgb3JkbjogZmVhdHVyZSgndmVydGljYWxQb3NpdGlvbicsICdvcmRpbmFscycpLFxuICBwd2lkOiBmZWF0dXJlKCd0ZXh0U3BhY2luZycsICdwcm9wb3J0aW9uYWxUZXh0JyksXG4gIGh3aWQ6IGZlYXR1cmUoJ3RleHRTcGFjaW5nJywgJ2hhbGZXaWR0aFRleHQnKSxcbiAgcXdpZDogZmVhdHVyZSgndGV4dFNwYWNpbmcnLCAncXVhcnRlcldpZHRoVGV4dCcpLFxuICAvLyBhbHNvIFF1YXJ0ZXJXaWR0aE51bWJlcnM/XG4gIHR3aWQ6IGZlYXR1cmUoJ3RleHRTcGFjaW5nJywgJ3RoaXJkV2lkdGhUZXh0JyksXG4gIC8vIGFsc28gVGhpcmRXaWR0aE51bWJlcnM/XG4gIGZ3aWQ6IGZlYXR1cmUoJ3RleHRTcGFjaW5nJywgJ3Byb3BvcnRpb25hbFRleHQnKSxcbiAgLy8/P1xuICBwYWx0OiBmZWF0dXJlKCd0ZXh0U3BhY2luZycsICdhbHRQcm9wb3J0aW9uYWxUZXh0JyksXG4gIHRyYWQ6IGZlYXR1cmUoJ2NoYXJhY3RlclNoYXBlJywgJ3RyYWRpdGlvbmFsQ2hhcmFjdGVycycpLFxuICBzbXBsOiBmZWF0dXJlKCdjaGFyYWN0ZXJTaGFwZScsICdzaW1wbGlmaWVkQ2hhcmFjdGVycycpLFxuICBqcDc4OiBmZWF0dXJlKCdjaGFyYWN0ZXJTaGFwZScsICdKSVMxOTc4Q2hhcmFjdGVycycpLFxuICBqcDgzOiBmZWF0dXJlKCdjaGFyYWN0ZXJTaGFwZScsICdKSVMxOTgzQ2hhcmFjdGVycycpLFxuICBqcDkwOiBmZWF0dXJlKCdjaGFyYWN0ZXJTaGFwZScsICdKSVMxOTkwQ2hhcmFjdGVycycpLFxuICBqcDA0OiBmZWF0dXJlKCdjaGFyYWN0ZXJTaGFwZScsICdKSVMyMDA0Q2hhcmFjdGVycycpLFxuICBleHB0OiBmZWF0dXJlKCdjaGFyYWN0ZXJTaGFwZScsICdleHBlcnRDaGFyYWN0ZXJzJyksXG4gIGhvam86IGZlYXR1cmUoJ2NoYXJhY3RlclNoYXBlJywgJ2hvam9DaGFyYWN0ZXJzJyksXG4gIG5sY2s6IGZlYXR1cmUoJ2NoYXJhY3RlclNoYXBlJywgJ05MQ0NoYXJhY3RlcnMnKSxcbiAgdG5hbTogZmVhdHVyZSgnY2hhcmFjdGVyU2hhcGUnLCAndHJhZGl0aW9uYWxOYW1lc0NoYXJhY3RlcnMnKSxcbiAgcnVieTogZmVhdHVyZSgncnVieUthbmEnLCAncnVieUthbmEnKSxcbiAgdGl0bDogZmVhdHVyZSgnc3R5bGVPcHRpb25zJywgJ3RpdGxpbmdDYXBzJyksXG4gIHplcm86IGZlYXR1cmUoJ3R5cG9ncmFwaGljRXh0cmFzJywgJ3NsYXNoZWRaZXJvJyksXG4gIHNzMDE6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRPbmUnKSxcbiAgc3MwMjogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdFR3bycpLFxuICBzczAzOiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0VGhyZWUnKSxcbiAgc3MwNDogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdEZvdXInKSxcbiAgc3MwNTogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdEZpdmUnKSxcbiAgc3MwNjogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdFNpeCcpLFxuICBzczA3OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0U2V2ZW4nKSxcbiAgc3MwODogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdEVpZ2h0JyksXG4gIHNzMDk6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHROaW5lJyksXG4gIHNzMTA6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRUZW4nKSxcbiAgc3MxMTogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdEVsZXZlbicpLFxuICBzczEyOiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0VHdlbHZlJyksXG4gIHNzMTM6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRUaGlydGVlbicpLFxuICBzczE0OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0Rm91cnRlZW4nKSxcbiAgc3MxNTogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdEZpZnRlZW4nKSxcbiAgc3MxNjogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdFNpeHRlZW4nKSxcbiAgc3MxNzogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdFNldmVudGVlbicpLFxuICBzczE4OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0RWlnaHRlZW4nKSxcbiAgc3MxOTogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdE5pbmV0ZWVuJyksXG4gIHNzMjA6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRUd2VudHknKVxufTsgLy8gc2FsdDogZmVhdHVyZSAnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdE9uZScgIyBobW0sIHdoaWNoIG9uZSB0byBjaG9vc2Vcbi8vIEFkZCBjdjAxLWN2OTkgZmVhdHVyZXNcblxuZm9yICh2YXIgaSQzID0gMTsgaSQzIDw9IDk5OyBpJDMrKykge1xuICBPVE1hcHBpbmdbXCJjdlwiICsgKFwiMDBcIiArIGkkMykuc2xpY2UoLTIpXSA9IFtmZWF0dXJlcy5jaGFyYWN0ZXJBbHRlcm5hdGl2ZXMuY29kZSwgaSQzXTtcbn0gLy8gY3JlYXRlIGludmVyc2UgbWFwcGluZ1xuXG5cbnZhciBBQVRNYXBwaW5nID0ge307XG5cbmZvciAodmFyIG90IGluIE9UTWFwcGluZykge1xuICB2YXIgYWF0ID0gT1RNYXBwaW5nW290XTtcblxuICBpZiAoQUFUTWFwcGluZ1thYXRbMF1dID09IG51bGwpIHtcbiAgICBBQVRNYXBwaW5nW2FhdFswXV0gPSB7fTtcbiAgfVxuXG4gIEFBVE1hcHBpbmdbYWF0WzBdXVthYXRbMV1dID0gb3Q7XG59IC8vIE1hcHMgYW4gYXJyYXkgb2YgT3BlblR5cGUgZmVhdHVyZXMgdG8gQUFUIGZlYXR1cmVzXG4vLyBpbiB0aGUgZm9ybSBvZiB7ZmVhdHVyZVR5cGU6e2ZlYXR1cmVTZXR0aW5nOnRydWV9fVxuXG5cbmZ1bmN0aW9uIG1hcE9UVG9BQVQoZmVhdHVyZXMpIHtcbiAgdmFyIHJlcyA9IHt9O1xuXG4gIGZvciAodmFyIGsgaW4gZmVhdHVyZXMpIHtcbiAgICB2YXIgciA9IHZvaWQgMDtcblxuICAgIGlmIChyID0gT1RNYXBwaW5nW2tdKSB7XG4gICAgICBpZiAocmVzW3JbMF1dID09IG51bGwpIHtcbiAgICAgICAgcmVzW3JbMF1dID0ge307XG4gICAgICB9XG5cbiAgICAgIHJlc1tyWzBdXVtyWzFdXSA9IGZlYXR1cmVzW2tdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59IC8vIE1hcHMgc3RyaW5ncyBpbiBhIFtmZWF0dXJlVHlwZSwgZmVhdHVyZVNldHRpbmddXG4vLyB0byB0aGVpciBlcXVpdmFsZW50IG51bWJlciBjb2Rlc1xuXG5mdW5jdGlvbiBtYXBGZWF0dXJlU3RyaW5ncyhmKSB7XG4gIHZhciB0eXBlID0gZlswXSxcbiAgICAgIHNldHRpbmcgPSBmWzFdO1xuXG4gIGlmIChpc05hTih0eXBlKSkge1xuICAgIHZhciB0eXBlQ29kZSA9IGZlYXR1cmVzW3R5cGVdICYmIGZlYXR1cmVzW3R5cGVdLmNvZGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHR5cGVDb2RlID0gdHlwZTtcbiAgfVxuXG4gIGlmIChpc05hTihzZXR0aW5nKSkge1xuICAgIHZhciBzZXR0aW5nQ29kZSA9IGZlYXR1cmVzW3R5cGVdICYmIGZlYXR1cmVzW3R5cGVdW3NldHRpbmddO1xuICB9IGVsc2Uge1xuICAgIHZhciBzZXR0aW5nQ29kZSA9IHNldHRpbmc7XG4gIH1cblxuICByZXR1cm4gW3R5cGVDb2RlLCBzZXR0aW5nQ29kZV07XG59IC8vIE1hcHMgQUFUIGZlYXR1cmVzIHRvIGFuIGFycmF5IG9mIE9wZW5UeXBlIGZlYXR1cmVzXG4vLyBTdXBwb3J0cyBib3RoIGFycmF5cyBpbiB0aGUgZm9ybSBvZiBbW2ZlYXR1cmVUeXBlLCBmZWF0dXJlU2V0dGluZ11dXG4vLyBhbmQgb2JqZWN0cyBpbiB0aGUgZm9ybSBvZiB7ZmVhdHVyZVR5cGU6e2ZlYXR1cmVTZXR0aW5nOnRydWV9fVxuLy8gZmVhdHVyZVR5cGVzIGFuZCBmZWF0dXJlU2V0dGluZ3MgY2FuIGJlIGVpdGhlciBzdHJpbmdzIG9yIG51bWJlciBjb2Rlc1xuXG5cbmZ1bmN0aW9uIG1hcEFBVFRvT1QoZmVhdHVyZXMpIHtcbiAgdmFyIHJlcyA9IHt9O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGZlYXR1cmVzKSkge1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZmVhdHVyZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgIHZhciByID0gdm9pZCAwO1xuICAgICAgdmFyIGYgPSBtYXBGZWF0dXJlU3RyaW5ncyhmZWF0dXJlc1trXSk7XG5cbiAgICAgIGlmIChyID0gQUFUTWFwcGluZ1tmWzBdXSAmJiBBQVRNYXBwaW5nW2ZbMF1dW2ZbMV1dKSB7XG4gICAgICAgIHJlc1tyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmZWF0dXJlcyA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHZhciB0eXBlIGluIGZlYXR1cmVzKSB7XG4gICAgICB2YXIgX2ZlYXR1cmUgPSBmZWF0dXJlc1t0eXBlXTtcblxuICAgICAgZm9yICh2YXIgc2V0dGluZyBpbiBfZmVhdHVyZSkge1xuICAgICAgICB2YXIgX3IgPSB2b2lkIDA7XG5cbiAgICAgICAgdmFyIF9mID0gbWFwRmVhdHVyZVN0cmluZ3MoW3R5cGUsIHNldHRpbmddKTtcblxuICAgICAgICBpZiAoX2ZlYXR1cmVbc2V0dGluZ10gJiYgKF9yID0gQUFUTWFwcGluZ1tfZlswXV0gJiYgQUFUTWFwcGluZ1tfZlswXV1bX2ZbMV1dKSkge1xuICAgICAgICAgIHJlc1tfcl0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHJlcyk7XG59XG5cbnZhciBfY2xhc3MkMTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ4KG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ4KG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ4KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkOChvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDgobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQ4KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDEodGFyZ2V0LCBwcm9wZXJ0eSwgZGVjb3JhdG9ycywgZGVzY3JpcHRvciwgY29udGV4dCkgeyB2YXIgZGVzYyA9IHt9OyBPYmplY3Qua2V5cyhkZXNjcmlwdG9yKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgZGVzY1trZXldID0gZGVzY3JpcHRvcltrZXldOyB9KTsgZGVzYy5lbnVtZXJhYmxlID0gISFkZXNjLmVudW1lcmFibGU7IGRlc2MuY29uZmlndXJhYmxlID0gISFkZXNjLmNvbmZpZ3VyYWJsZTsgaWYgKCd2YWx1ZScgaW4gZGVzYyB8fCBkZXNjLmluaXRpYWxpemVyKSB7IGRlc2Mud3JpdGFibGUgPSB0cnVlOyB9IGRlc2MgPSBkZWNvcmF0b3JzLnNsaWNlKCkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoZGVzYywgZGVjb3JhdG9yKSB7IHJldHVybiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYykgfHwgZGVzYzsgfSwgZGVzYyk7IGlmIChjb250ZXh0ICYmIGRlc2MuaW5pdGlhbGl6ZXIgIT09IHZvaWQgMCkgeyBkZXNjLnZhbHVlID0gZGVzYy5pbml0aWFsaXplciA/IGRlc2MuaW5pdGlhbGl6ZXIuY2FsbChjb250ZXh0KSA6IHZvaWQgMDsgZGVzYy5pbml0aWFsaXplciA9IHVuZGVmaW5lZDsgfSBpZiAoZGVzYy5pbml0aWFsaXplciA9PT0gdm9pZCAwKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjKTsgZGVzYyA9IG51bGw7IH0gcmV0dXJuIGRlc2M7IH1cbnZhciBBQVRMb29rdXBUYWJsZSA9IChfY2xhc3MkMSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFBVExvb2t1cFRhYmxlKHRhYmxlKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEFBVExvb2t1cFRhYmxlLnByb3RvdHlwZTtcblxuICBfcHJvdG8ubG9va3VwID0gZnVuY3Rpb24gbG9va3VwKGdseXBoKSB7XG4gICAgc3dpdGNoICh0aGlzLnRhYmxlLnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgLy8gc2ltcGxlIGFycmF5IGZvcm1hdFxuICAgICAgICByZXR1cm4gdGhpcy50YWJsZS52YWx1ZXMuZ2V0SXRlbShnbHlwaCk7XG5cbiAgICAgIGNhc2UgMjogLy8gc2VnbWVudCBmb3JtYXRcblxuICAgICAgY2FzZSA0OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIG1pbiA9IDA7XG4gICAgICAgICAgdmFyIG1heCA9IHRoaXMudGFibGUuYmluYXJ5U2VhcmNoSGVhZGVyLm5Vbml0cyAtIDE7XG5cbiAgICAgICAgICB3aGlsZSAobWluIDw9IG1heCkge1xuICAgICAgICAgICAgdmFyIG1pZCA9IG1pbiArIG1heCA+PiAxO1xuICAgICAgICAgICAgdmFyIHNlZyA9IHRoaXMudGFibGUuc2VnbWVudHNbbWlkXTsgLy8gc3BlY2lhbCBlbmQgb2Ygc2VhcmNoIHZhbHVlXG5cbiAgICAgICAgICAgIGlmIChzZWcuZmlyc3RHbHlwaCA9PT0gMHhmZmZmKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZ2x5cGggPCBzZWcuZmlyc3RHbHlwaCkge1xuICAgICAgICAgICAgICBtYXggPSBtaWQgLSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChnbHlwaCA+IHNlZy5sYXN0R2x5cGgpIHtcbiAgICAgICAgICAgICAgbWluID0gbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlLnZlcnNpb24gPT09IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VnLnZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWcudmFsdWVzW2dseXBoIC0gc2VnLmZpcnN0R2x5cGhdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA2OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gbG9va3VwIHNpbmdsZVxuICAgICAgICAgIHZhciBfbWluID0gMDtcblxuICAgICAgICAgIHZhciBfbWF4ID0gdGhpcy50YWJsZS5iaW5hcnlTZWFyY2hIZWFkZXIublVuaXRzIC0gMTtcblxuICAgICAgICAgIHdoaWxlIChfbWluIDw9IF9tYXgpIHtcbiAgICAgICAgICAgIHZhciBtaWQgPSBfbWluICsgX21heCA+PiAxO1xuICAgICAgICAgICAgdmFyIHNlZyA9IHRoaXMudGFibGUuc2VnbWVudHNbbWlkXTsgLy8gc3BlY2lhbCBlbmQgb2Ygc2VhcmNoIHZhbHVlXG5cbiAgICAgICAgICAgIGlmIChzZWcuZ2x5cGggPT09IDB4ZmZmZikge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdseXBoIDwgc2VnLmdseXBoKSB7XG4gICAgICAgICAgICAgIF9tYXggPSBtaWQgLSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChnbHlwaCA+IHNlZy5nbHlwaCkge1xuICAgICAgICAgICAgICBfbWluID0gbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWcudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA4OlxuICAgICAgICAvLyBsb29rdXAgdHJpbW1lZFxuICAgICAgICByZXR1cm4gdGhpcy50YWJsZS52YWx1ZXNbZ2x5cGggLSB0aGlzLnRhYmxlLmZpcnN0R2x5cGhdO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGxvb2t1cCB0YWJsZSBmb3JtYXQ6IFwiICsgdGhpcy50YWJsZS52ZXJzaW9uKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmdseXBoc0ZvclZhbHVlID0gZnVuY3Rpb24gZ2x5cGhzRm9yVmFsdWUoY2xhc3NWYWx1ZSkge1xuICAgIHZhciByZXMgPSBbXTtcblxuICAgIHN3aXRjaCAodGhpcy50YWJsZS52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDI6IC8vIHNlZ21lbnQgZm9ybWF0XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkOCh0aGlzLnRhYmxlLnNlZ21lbnRzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBzZWdtZW50ID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlLnZlcnNpb24gPT09IDIgJiYgc2VnbWVudC52YWx1ZSA9PT0gY2xhc3NWYWx1ZSkge1xuICAgICAgICAgICAgICByZXMucHVzaC5hcHBseShyZXMsIHJhbmdlKHNlZ21lbnQuZmlyc3RHbHlwaCwgc2VnbWVudC5sYXN0R2x5cGggKyAxKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc2VnbWVudC52YWx1ZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQudmFsdWVzW2luZGV4XSA9PT0gY2xhc3NWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgcmVzLnB1c2goc2VnbWVudC5maXJzdEdseXBoICsgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgNjpcbiAgICAgICAge1xuICAgICAgICAgIC8vIGxvb2t1cCBzaW5nbGVcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ4KHRoaXMudGFibGUuc2VnbWVudHMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIF9zZWdtZW50ID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoX3NlZ21lbnQudmFsdWUgPT09IGNsYXNzVmFsdWUpIHtcbiAgICAgICAgICAgICAgcmVzLnB1c2goX3NlZ21lbnQuZ2x5cGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgODpcbiAgICAgICAge1xuICAgICAgICAgIC8vIGxvb2t1cCB0cmltbWVkXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRhYmxlLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMudGFibGUudmFsdWVzW2ldID09PSBjbGFzc1ZhbHVlKSB7XG4gICAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMudGFibGUuZmlyc3RHbHlwaCArIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gbG9va3VwIHRhYmxlIGZvcm1hdDogXCIgKyB0aGlzLnRhYmxlLnZlcnNpb24pO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgcmV0dXJuIEFBVExvb2t1cFRhYmxlO1xufSgpLCAoX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQxKF9jbGFzcyQxLnByb3RvdHlwZSwgXCJnbHlwaHNGb3JWYWx1ZVwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQxLnByb3RvdHlwZSwgXCJnbHlwaHNGb3JWYWx1ZVwiKSwgX2NsYXNzJDEucHJvdG90eXBlKSksIF9jbGFzcyQxKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ5KG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ5KG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkOShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQ5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxudmFyIFNUQVJUX09GX1RFWFRfU1RBVEUgPSAwO1xudmFyIEVORF9PRl9URVhUX0NMQVNTID0gMDtcbnZhciBPVVRfT0ZfQk9VTkRTX0NMQVNTID0gMTtcbnZhciBERUxFVEVEX0dMWVBIX0NMQVNTID0gMjtcbnZhciBET05UX0FEVkFOQ0UgPSAweDQwMDA7XG5cbnZhciBBQVRTdGF0ZU1hY2hpbmUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBQVRTdGF0ZU1hY2hpbmUoc3RhdGVUYWJsZSkge1xuICAgIHRoaXMuc3RhdGVUYWJsZSA9IHN0YXRlVGFibGU7XG4gICAgdGhpcy5sb29rdXBUYWJsZSA9IG5ldyBBQVRMb29rdXBUYWJsZShzdGF0ZVRhYmxlLmNsYXNzVGFibGUpO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEFBVFN0YXRlTWFjaGluZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnByb2Nlc3MgPSBmdW5jdGlvbiBwcm9jZXNzKGdseXBocywgcmV2ZXJzZSwgcHJvY2Vzc0VudHJ5KSB7XG4gICAgdmFyIGN1cnJlbnRTdGF0ZSA9IFNUQVJUX09GX1RFWFRfU1RBVEU7IC8vIFNUQVJUX09GX0xJTkVfU1RBVEUgaXMgdXNlZCBmb3Iga2FzaGlkYSBnbHlwaCBpbnNlcnRpb25zIHNvbWV0aW1lcyBJIHRoaW5rP1xuXG4gICAgdmFyIGluZGV4ID0gcmV2ZXJzZSA/IGdseXBocy5sZW5ndGggLSAxIDogMDtcbiAgICB2YXIgZGlyID0gcmV2ZXJzZSA/IC0xIDogMTtcblxuICAgIHdoaWxlIChkaXIgPT09IDEgJiYgaW5kZXggPD0gZ2x5cGhzLmxlbmd0aCB8fCBkaXIgPT09IC0xICYmIGluZGV4ID49IC0xKSB7XG4gICAgICB2YXIgZ2x5cGggPSBudWxsO1xuICAgICAgdmFyIGNsYXNzQ29kZSA9IE9VVF9PRl9CT1VORFNfQ0xBU1M7XG4gICAgICB2YXIgc2hvdWxkQWR2YW5jZSA9IHRydWU7XG5cbiAgICAgIGlmIChpbmRleCA9PT0gZ2x5cGhzLmxlbmd0aCB8fCBpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgY2xhc3NDb2RlID0gRU5EX09GX1RFWFRfQ0xBU1M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnbHlwaCA9IGdseXBoc1tpbmRleF07XG5cbiAgICAgICAgaWYgKGdseXBoLmlkID09PSAweGZmZmYpIHtcbiAgICAgICAgICAvLyBkZWxldGVkIGdseXBoXG4gICAgICAgICAgY2xhc3NDb2RlID0gREVMRVRFRF9HTFlQSF9DTEFTUztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGFzc0NvZGUgPSB0aGlzLmxvb2t1cFRhYmxlLmxvb2t1cChnbHlwaC5pZCk7XG5cbiAgICAgICAgICBpZiAoY2xhc3NDb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNsYXNzQ29kZSA9IE9VVF9PRl9CT1VORFNfQ0xBU1M7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByb3cgPSB0aGlzLnN0YXRlVGFibGUuc3RhdGVBcnJheS5nZXRJdGVtKGN1cnJlbnRTdGF0ZSk7XG4gICAgICB2YXIgZW50cnlJbmRleCA9IHJvd1tjbGFzc0NvZGVdO1xuICAgICAgdmFyIGVudHJ5ID0gdGhpcy5zdGF0ZVRhYmxlLmVudHJ5VGFibGUuZ2V0SXRlbShlbnRyeUluZGV4KTtcblxuICAgICAgaWYgKGNsYXNzQ29kZSAhPT0gRU5EX09GX1RFWFRfQ0xBU1MgJiYgY2xhc3NDb2RlICE9PSBERUxFVEVEX0dMWVBIX0NMQVNTKSB7XG4gICAgICAgIHByb2Nlc3NFbnRyeShnbHlwaCwgZW50cnksIGluZGV4KTtcbiAgICAgICAgc2hvdWxkQWR2YW5jZSA9ICEoZW50cnkuZmxhZ3MgJiBET05UX0FEVkFOQ0UpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50U3RhdGUgPSBlbnRyeS5uZXdTdGF0ZTtcblxuICAgICAgaWYgKHNob3VsZEFkdmFuY2UpIHtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBnbHlwaHM7XG4gIH1cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIG9mIHRoZSBnbHlwaCBzdHJpbmdzXG4gICAqIHJlcHJlc2VudGVkIGJ5IHRoZSBzdGF0ZSBtYWNoaW5lLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50cmF2ZXJzZSA9IGZ1bmN0aW9uIHRyYXZlcnNlKG9wdHMsIHN0YXRlLCB2aXNpdGVkKSB7XG4gICAgaWYgKHN0YXRlID09PSB2b2lkIDApIHtcbiAgICAgIHN0YXRlID0gMDtcbiAgICB9XG5cbiAgICBpZiAodmlzaXRlZCA9PT0gdm9pZCAwKSB7XG4gICAgICB2aXNpdGVkID0gbmV3IFNldCgpO1xuICAgIH1cblxuICAgIGlmICh2aXNpdGVkLmhhcyhzdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2aXNpdGVkLmFkZChzdGF0ZSk7XG4gICAgdmFyIF90aGlzJHN0YXRlVGFibGUgPSB0aGlzLnN0YXRlVGFibGUsXG4gICAgICAgIG5DbGFzc2VzID0gX3RoaXMkc3RhdGVUYWJsZS5uQ2xhc3NlcyxcbiAgICAgICAgc3RhdGVBcnJheSA9IF90aGlzJHN0YXRlVGFibGUuc3RhdGVBcnJheSxcbiAgICAgICAgZW50cnlUYWJsZSA9IF90aGlzJHN0YXRlVGFibGUuZW50cnlUYWJsZTtcbiAgICB2YXIgcm93ID0gc3RhdGVBcnJheS5nZXRJdGVtKHN0YXRlKTsgLy8gU2tpcCBwcmVkZWZpbmVkIGNsYXNzZXNcblxuICAgIGZvciAodmFyIGNsYXNzQ29kZSA9IDQ7IGNsYXNzQ29kZSA8IG5DbGFzc2VzOyBjbGFzc0NvZGUrKykge1xuICAgICAgdmFyIGVudHJ5SW5kZXggPSByb3dbY2xhc3NDb2RlXTtcbiAgICAgIHZhciBlbnRyeSA9IGVudHJ5VGFibGUuZ2V0SXRlbShlbnRyeUluZGV4KTsgLy8gVHJ5IGFsbCBnbHlwaHMgaW4gdGhlIGNsYXNzXG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkOSh0aGlzLmxvb2t1cFRhYmxlLmdseXBoc0ZvclZhbHVlKGNsYXNzQ29kZSkpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgICB2YXIgZ2x5cGggPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICBpZiAob3B0cy5lbnRlcikge1xuICAgICAgICAgIG9wdHMuZW50ZXIoZ2x5cGgsIGVudHJ5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS5uZXdTdGF0ZSAhPT0gMCkge1xuICAgICAgICAgIHRoaXMudHJhdmVyc2Uob3B0cywgZW50cnkubmV3U3RhdGUsIHZpc2l0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdHMuZXhpdCkge1xuICAgICAgICAgIG9wdHMuZXhpdChnbHlwaCwgZW50cnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBBQVRTdGF0ZU1hY2hpbmU7XG59KCk7XG5cbnZhciBfY2xhc3MkMjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRhKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRhKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRhKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkYShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGEobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRhKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDIodGFyZ2V0LCBwcm9wZXJ0eSwgZGVjb3JhdG9ycywgZGVzY3JpcHRvciwgY29udGV4dCkgeyB2YXIgZGVzYyA9IHt9OyBPYmplY3Qua2V5cyhkZXNjcmlwdG9yKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgZGVzY1trZXldID0gZGVzY3JpcHRvcltrZXldOyB9KTsgZGVzYy5lbnVtZXJhYmxlID0gISFkZXNjLmVudW1lcmFibGU7IGRlc2MuY29uZmlndXJhYmxlID0gISFkZXNjLmNvbmZpZ3VyYWJsZTsgaWYgKCd2YWx1ZScgaW4gZGVzYyB8fCBkZXNjLmluaXRpYWxpemVyKSB7IGRlc2Mud3JpdGFibGUgPSB0cnVlOyB9IGRlc2MgPSBkZWNvcmF0b3JzLnNsaWNlKCkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoZGVzYywgZGVjb3JhdG9yKSB7IHJldHVybiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYykgfHwgZGVzYzsgfSwgZGVzYyk7IGlmIChjb250ZXh0ICYmIGRlc2MuaW5pdGlhbGl6ZXIgIT09IHZvaWQgMCkgeyBkZXNjLnZhbHVlID0gZGVzYy5pbml0aWFsaXplciA/IGRlc2MuaW5pdGlhbGl6ZXIuY2FsbChjb250ZXh0KSA6IHZvaWQgMDsgZGVzYy5pbml0aWFsaXplciA9IHVuZGVmaW5lZDsgfSBpZiAoZGVzYy5pbml0aWFsaXplciA9PT0gdm9pZCAwKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjKTsgZGVzYyA9IG51bGw7IH0gcmV0dXJuIGRlc2M7IH1cblxudmFyIE1BUktfRklSU1QgPSAweDgwMDA7XG52YXIgTUFSS19MQVNUID0gMHgyMDAwO1xudmFyIFZFUkIgPSAweDAwMEY7IC8vIGNvbnRleHR1YWwgc3Vic3RpdHV0aW9uIGFuZCBnbHlwaCBpbnNlcnRpb24gZmxhZ1xuXG52YXIgU0VUX01BUksgPSAweDgwMDA7IC8vIGxpZ2F0dXJlIGVudHJ5IGZsYWdzXG5cbnZhciBTRVRfQ09NUE9ORU5UID0gMHg4MDAwO1xudmFyIFBFUkZPUk1fQUNUSU9OID0gMHgyMDAwOyAvLyBsaWdhdHVyZSBhY3Rpb24gbWFza3NcblxudmFyIExBU1RfTUFTSyA9IDB4ODAwMDAwMDA7XG52YXIgU1RPUkVfTUFTSyA9IDB4NDAwMDAwMDA7XG52YXIgT0ZGU0VUX01BU0sgPSAweDNGRkZGRkZGO1xudmFyIFJFVkVSU0VfRElSRUNUSU9OID0gMHg0MDAwMDA7XG52YXIgQ1VSUkVOVF9JTlNFUlRfQkVGT1JFID0gMHgwODAwO1xudmFyIE1BUktFRF9JTlNFUlRfQkVGT1JFID0gMHgwNDAwO1xudmFyIENVUlJFTlRfSU5TRVJUX0NPVU5UID0gMHgwM0UwO1xudmFyIE1BUktFRF9JTlNFUlRfQ09VTlQgPSAweDAwMUY7XG52YXIgQUFUTW9yeFByb2Nlc3NvciA9IChfY2xhc3MkMiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFBVE1vcnhQcm9jZXNzb3IoZm9udCkge1xuICAgIHRoaXMucHJvY2Vzc0luZGljUmVhcnJhZ2VtZW50ID0gdGhpcy5wcm9jZXNzSW5kaWNSZWFycmFnZW1lbnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLnByb2Nlc3NDb250ZXh0dWFsU3Vic3RpdHV0aW9uID0gdGhpcy5wcm9jZXNzQ29udGV4dHVhbFN1YnN0aXR1dGlvbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMucHJvY2Vzc0xpZ2F0dXJlID0gdGhpcy5wcm9jZXNzTGlnYXR1cmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLnByb2Nlc3NOb25jb250ZXh0dWFsU3Vic3RpdHV0aW9ucyA9IHRoaXMucHJvY2Vzc05vbmNvbnRleHR1YWxTdWJzdGl0dXRpb25zLmJpbmQodGhpcyk7XG4gICAgdGhpcy5wcm9jZXNzR2x5cGhJbnNlcnRpb24gPSB0aGlzLnByb2Nlc3NHbHlwaEluc2VydGlvbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgdGhpcy5tb3J4ID0gZm9udC5tb3J4O1xuICAgIHRoaXMuaW5wdXRDYWNoZSA9IG51bGw7XG4gIH0gLy8gUHJvY2Vzc2VzIGFuIGFycmF5IG9mIGdseXBocyBhbmQgYXBwbGllcyB0aGUgc3BlY2lmaWVkIGZlYXR1cmVzXG4gIC8vIEZlYXR1cmVzIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZiB7ZmVhdHVyZVR5cGU6e2ZlYXR1cmVTZXR0aW5nOnRydWV9fVxuXG5cbiAgdmFyIF9wcm90byA9IEFBVE1vcnhQcm9jZXNzb3IucHJvdG90eXBlO1xuXG4gIF9wcm90by5wcm9jZXNzID0gZnVuY3Rpb24gcHJvY2VzcyhnbHlwaHMsIGZlYXR1cmVzKSB7XG4gICAgaWYgKGZlYXR1cmVzID09PSB2b2lkIDApIHtcbiAgICAgIGZlYXR1cmVzID0ge307XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRhKHRoaXMubW9yeC5jaGFpbnMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIGNoYWluID0gX3N0ZXAudmFsdWU7XG4gICAgICB2YXIgZmxhZ3MgPSBjaGFpbi5kZWZhdWx0RmxhZ3M7IC8vIGVuYWJsZS9kaXNhYmxlIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZXNcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYShjaGFpbi5mZWF0dXJlcyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICB2YXIgZiA9IHZvaWQgMDtcblxuICAgICAgICBpZiAoKGYgPSBmZWF0dXJlc1tmZWF0dXJlLmZlYXR1cmVUeXBlXSkgJiYgZltmZWF0dXJlLmZlYXR1cmVTZXR0aW5nXSkge1xuICAgICAgICAgIGZsYWdzICY9IGZlYXR1cmUuZGlzYWJsZUZsYWdzO1xuICAgICAgICAgIGZsYWdzIHw9IGZlYXR1cmUuZW5hYmxlRmxhZ3M7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYShjaGFpbi5zdWJ0YWJsZXMpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgICB2YXIgc3VidGFibGUgPSBfc3RlcDMudmFsdWU7XG5cbiAgICAgICAgaWYgKHN1YnRhYmxlLnN1YkZlYXR1cmVGbGFncyAmIGZsYWdzKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzU3VidGFibGUoc3VidGFibGUsIGdseXBocyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIHJlbW92ZSBkZWxldGVkIGdseXBoc1xuXG5cbiAgICB2YXIgaW5kZXggPSBnbHlwaHMubGVuZ3RoIC0gMTtcblxuICAgIHdoaWxlIChpbmRleCA+PSAwKSB7XG4gICAgICBpZiAoZ2x5cGhzW2luZGV4XS5pZCA9PT0gMHhmZmZmKSB7XG4gICAgICAgIGdseXBocy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICBpbmRleC0tO1xuICAgIH1cblxuICAgIHJldHVybiBnbHlwaHM7XG4gIH07XG5cbiAgX3Byb3RvLnByb2Nlc3NTdWJ0YWJsZSA9IGZ1bmN0aW9uIHByb2Nlc3NTdWJ0YWJsZShzdWJ0YWJsZSwgZ2x5cGhzKSB7XG4gICAgdGhpcy5zdWJ0YWJsZSA9IHN1YnRhYmxlO1xuICAgIHRoaXMuZ2x5cGhzID0gZ2x5cGhzO1xuXG4gICAgaWYgKHRoaXMuc3VidGFibGUudHlwZSA9PT0gNCkge1xuICAgICAgdGhpcy5wcm9jZXNzTm9uY29udGV4dHVhbFN1YnN0aXR1dGlvbnModGhpcy5zdWJ0YWJsZSwgdGhpcy5nbHlwaHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubGlnYXR1cmVTdGFjayA9IFtdO1xuICAgIHRoaXMubWFya2VkR2x5cGggPSBudWxsO1xuICAgIHRoaXMuZmlyc3RHbHlwaCA9IG51bGw7XG4gICAgdGhpcy5sYXN0R2x5cGggPSBudWxsO1xuICAgIHRoaXMubWFya2VkSW5kZXggPSBudWxsO1xuICAgIHZhciBzdGF0ZU1hY2hpbmUgPSB0aGlzLmdldFN0YXRlTWFjaGluZShzdWJ0YWJsZSk7XG4gICAgdmFyIHByb2Nlc3MgPSB0aGlzLmdldFByb2Nlc3NvcigpO1xuICAgIHZhciByZXZlcnNlID0gISEodGhpcy5zdWJ0YWJsZS5jb3ZlcmFnZSAmIFJFVkVSU0VfRElSRUNUSU9OKTtcbiAgICByZXR1cm4gc3RhdGVNYWNoaW5lLnByb2Nlc3ModGhpcy5nbHlwaHMsIHJldmVyc2UsIHByb2Nlc3MpO1xuICB9O1xuXG4gIF9wcm90by5nZXRTdGF0ZU1hY2hpbmUgPSBmdW5jdGlvbiBnZXRTdGF0ZU1hY2hpbmUoc3VidGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEFBVFN0YXRlTWFjaGluZShzdWJ0YWJsZS50YWJsZS5zdGF0ZVRhYmxlKTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0UHJvY2Vzc29yID0gZnVuY3Rpb24gZ2V0UHJvY2Vzc29yKCkge1xuICAgIHN3aXRjaCAodGhpcy5zdWJ0YWJsZS50eXBlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NJbmRpY1JlYXJyYWdlbWVudDtcblxuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQ29udGV4dHVhbFN1YnN0aXR1dGlvbjtcblxuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTGlnYXR1cmU7XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc05vbmNvbnRleHR1YWxTdWJzdGl0dXRpb25zO1xuXG4gICAgICBjYXNlIDU6XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NHbHlwaEluc2VydGlvbjtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBtb3J4IHN1YnRhYmxlIHR5cGU6IFwiICsgdGhpcy5zdWJ0YWJsZS50eXBlKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnByb2Nlc3NJbmRpY1JlYXJyYWdlbWVudCA9IGZ1bmN0aW9uIHByb2Nlc3NJbmRpY1JlYXJyYWdlbWVudChnbHlwaCwgZW50cnksIGluZGV4KSB7XG4gICAgaWYgKGVudHJ5LmZsYWdzICYgTUFSS19GSVJTVCkge1xuICAgICAgdGhpcy5maXJzdEdseXBoID0gaW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LmZsYWdzICYgTUFSS19MQVNUKSB7XG4gICAgICB0aGlzLmxhc3RHbHlwaCA9IGluZGV4O1xuICAgIH1cblxuICAgIHJlb3JkZXJHbHlwaHModGhpcy5nbHlwaHMsIGVudHJ5LmZsYWdzICYgVkVSQiwgdGhpcy5maXJzdEdseXBoLCB0aGlzLmxhc3RHbHlwaCk7XG4gIH07XG5cbiAgX3Byb3RvLnByb2Nlc3NDb250ZXh0dWFsU3Vic3RpdHV0aW9uID0gZnVuY3Rpb24gcHJvY2Vzc0NvbnRleHR1YWxTdWJzdGl0dXRpb24oZ2x5cGgsIGVudHJ5LCBpbmRleCkge1xuICAgIHZhciBzdWJzaXR1dGlvbnMgPSB0aGlzLnN1YnRhYmxlLnRhYmxlLnN1YnN0aXR1dGlvblRhYmxlLml0ZW1zO1xuXG4gICAgaWYgKGVudHJ5Lm1hcmtJbmRleCAhPT0gMHhmZmZmKSB7XG4gICAgICB2YXIgbG9va3VwID0gc3Vic2l0dXRpb25zLmdldEl0ZW0oZW50cnkubWFya0luZGV4KTtcbiAgICAgIHZhciBsb29rdXBUYWJsZSA9IG5ldyBBQVRMb29rdXBUYWJsZShsb29rdXApO1xuICAgICAgZ2x5cGggPSB0aGlzLmdseXBoc1t0aGlzLm1hcmtlZEdseXBoXTtcbiAgICAgIHZhciBnaWQgPSBsb29rdXBUYWJsZS5sb29rdXAoZ2x5cGguaWQpO1xuXG4gICAgICBpZiAoZ2lkKSB7XG4gICAgICAgIHRoaXMuZ2x5cGhzW3RoaXMubWFya2VkR2x5cGhdID0gdGhpcy5mb250LmdldEdseXBoKGdpZCwgZ2x5cGguY29kZVBvaW50cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LmN1cnJlbnRJbmRleCAhPT0gMHhmZmZmKSB7XG4gICAgICB2YXIgX2xvb2t1cCA9IHN1YnNpdHV0aW9ucy5nZXRJdGVtKGVudHJ5LmN1cnJlbnRJbmRleCk7XG5cbiAgICAgIHZhciBfbG9va3VwVGFibGUgPSBuZXcgQUFUTG9va3VwVGFibGUoX2xvb2t1cCk7XG5cbiAgICAgIGdseXBoID0gdGhpcy5nbHlwaHNbaW5kZXhdO1xuXG4gICAgICB2YXIgZ2lkID0gX2xvb2t1cFRhYmxlLmxvb2t1cChnbHlwaC5pZCk7XG5cbiAgICAgIGlmIChnaWQpIHtcbiAgICAgICAgdGhpcy5nbHlwaHNbaW5kZXhdID0gdGhpcy5mb250LmdldEdseXBoKGdpZCwgZ2x5cGguY29kZVBvaW50cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LmZsYWdzICYgU0VUX01BUkspIHtcbiAgICAgIHRoaXMubWFya2VkR2x5cGggPSBpbmRleDtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnByb2Nlc3NMaWdhdHVyZSA9IGZ1bmN0aW9uIHByb2Nlc3NMaWdhdHVyZShnbHlwaCwgZW50cnksIGluZGV4KSB7XG4gICAgaWYgKGVudHJ5LmZsYWdzICYgU0VUX0NPTVBPTkVOVCkge1xuICAgICAgdGhpcy5saWdhdHVyZVN0YWNrLnB1c2goaW5kZXgpO1xuICAgIH1cblxuICAgIGlmIChlbnRyeS5mbGFncyAmIFBFUkZPUk1fQUNUSU9OKSB7XG4gICAgICB2YXIgX3RoaXMkbGlnYXR1cmVTdGFjaztcblxuICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLnN1YnRhYmxlLnRhYmxlLmxpZ2F0dXJlQWN0aW9ucztcbiAgICAgIHZhciBjb21wb25lbnRzID0gdGhpcy5zdWJ0YWJsZS50YWJsZS5jb21wb25lbnRzO1xuICAgICAgdmFyIGxpZ2F0dXJlTGlzdCA9IHRoaXMuc3VidGFibGUudGFibGUubGlnYXR1cmVMaXN0O1xuICAgICAgdmFyIGFjdGlvbkluZGV4ID0gZW50cnkuYWN0aW9uO1xuICAgICAgdmFyIGxhc3QgPSBmYWxzZTtcbiAgICAgIHZhciBsaWdhdHVyZUluZGV4ID0gMDtcbiAgICAgIHZhciBjb2RlUG9pbnRzID0gW107XG4gICAgICB2YXIgbGlnYXR1cmVHbHlwaHMgPSBbXTtcblxuICAgICAgd2hpbGUgKCFsYXN0KSB7XG4gICAgICAgIHZhciBfY29kZVBvaW50cztcblxuICAgICAgICB2YXIgY29tcG9uZW50R2x5cGggPSB0aGlzLmxpZ2F0dXJlU3RhY2sucG9wKCk7XG5cbiAgICAgICAgKF9jb2RlUG9pbnRzID0gY29kZVBvaW50cykudW5zaGlmdC5hcHBseShfY29kZVBvaW50cywgdGhpcy5nbHlwaHNbY29tcG9uZW50R2x5cGhdLmNvZGVQb2ludHMpO1xuXG4gICAgICAgIHZhciBhY3Rpb24gPSBhY3Rpb25zLmdldEl0ZW0oYWN0aW9uSW5kZXgrKyk7XG4gICAgICAgIGxhc3QgPSAhIShhY3Rpb24gJiBMQVNUX01BU0spO1xuICAgICAgICB2YXIgc3RvcmUgPSAhIShhY3Rpb24gJiBTVE9SRV9NQVNLKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IChhY3Rpb24gJiBPRkZTRVRfTUFTSykgPDwgMiA+PiAyOyAvLyBzaWduIGV4dGVuZCAzMCB0byAzMiBiaXRzXG5cbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMuZ2x5cGhzW2NvbXBvbmVudEdseXBoXS5pZDtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHMuZ2V0SXRlbShvZmZzZXQpO1xuICAgICAgICBsaWdhdHVyZUluZGV4ICs9IGNvbXBvbmVudDtcblxuICAgICAgICBpZiAobGFzdCB8fCBzdG9yZSkge1xuICAgICAgICAgIHZhciBsaWdhdHVyZUVudHJ5ID0gbGlnYXR1cmVMaXN0LmdldEl0ZW0obGlnYXR1cmVJbmRleCk7XG4gICAgICAgICAgdGhpcy5nbHlwaHNbY29tcG9uZW50R2x5cGhdID0gdGhpcy5mb250LmdldEdseXBoKGxpZ2F0dXJlRW50cnksIGNvZGVQb2ludHMpO1xuICAgICAgICAgIGxpZ2F0dXJlR2x5cGhzLnB1c2goY29tcG9uZW50R2x5cGgpO1xuICAgICAgICAgIGxpZ2F0dXJlSW5kZXggPSAwO1xuICAgICAgICAgIGNvZGVQb2ludHMgPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdseXBoc1tjb21wb25lbnRHbHlwaF0gPSB0aGlzLmZvbnQuZ2V0R2x5cGgoMHhmZmZmKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBQdXQgbGlnYXR1cmUgZ2x5cGggaW5kZXhlcyBiYWNrIG9uIHRoZSBzdGFja1xuXG5cbiAgICAgIChfdGhpcyRsaWdhdHVyZVN0YWNrID0gdGhpcy5saWdhdHVyZVN0YWNrKS5wdXNoLmFwcGx5KF90aGlzJGxpZ2F0dXJlU3RhY2ssIGxpZ2F0dXJlR2x5cGhzKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnByb2Nlc3NOb25jb250ZXh0dWFsU3Vic3RpdHV0aW9ucyA9IGZ1bmN0aW9uIHByb2Nlc3NOb25jb250ZXh0dWFsU3Vic3RpdHV0aW9ucyhzdWJ0YWJsZSwgZ2x5cGhzLCBpbmRleCkge1xuICAgIHZhciBsb29rdXBUYWJsZSA9IG5ldyBBQVRMb29rdXBUYWJsZShzdWJ0YWJsZS50YWJsZS5sb29rdXBUYWJsZSk7XG5cbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBnbHlwaHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaW5kZXhdO1xuXG4gICAgICBpZiAoZ2x5cGguaWQgIT09IDB4ZmZmZikge1xuICAgICAgICB2YXIgZ2lkID0gbG9va3VwVGFibGUubG9va3VwKGdseXBoLmlkKTtcblxuICAgICAgICBpZiAoZ2lkKSB7XG4gICAgICAgICAgLy8gMCBtZWFucyBkbyBub3RoaW5nXG4gICAgICAgICAgZ2x5cGhzW2luZGV4XSA9IHRoaXMuZm9udC5nZXRHbHlwaChnaWQsIGdseXBoLmNvZGVQb2ludHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5faW5zZXJ0R2x5cGhzID0gZnVuY3Rpb24gX2luc2VydEdseXBocyhnbHlwaEluZGV4LCBpbnNlcnRpb25BY3Rpb25JbmRleCwgY291bnQsIGlzQmVmb3JlKSB7XG4gICAgdmFyIF90aGlzJGdseXBocztcblxuICAgIHZhciBpbnNlcnRpb25zID0gW107XG5cbiAgICB3aGlsZSAoY291bnQtLSkge1xuICAgICAgdmFyIGdpZCA9IHRoaXMuc3VidGFibGUudGFibGUuaW5zZXJ0aW9uQWN0aW9ucy5nZXRJdGVtKGluc2VydGlvbkFjdGlvbkluZGV4KyspO1xuICAgICAgaW5zZXJ0aW9ucy5wdXNoKHRoaXMuZm9udC5nZXRHbHlwaChnaWQpKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQmVmb3JlKSB7XG4gICAgICBnbHlwaEluZGV4Kys7XG4gICAgfVxuXG4gICAgKF90aGlzJGdseXBocyA9IHRoaXMuZ2x5cGhzKS5zcGxpY2UuYXBwbHkoX3RoaXMkZ2x5cGhzLCBbZ2x5cGhJbmRleCwgMF0uY29uY2F0KGluc2VydGlvbnMpKTtcbiAgfTtcblxuICBfcHJvdG8ucHJvY2Vzc0dseXBoSW5zZXJ0aW9uID0gZnVuY3Rpb24gcHJvY2Vzc0dseXBoSW5zZXJ0aW9uKGdseXBoLCBlbnRyeSwgaW5kZXgpIHtcbiAgICBpZiAoZW50cnkuZmxhZ3MgJiBTRVRfTUFSSykge1xuICAgICAgdGhpcy5tYXJrZWRJbmRleCA9IGluZGV4O1xuICAgIH1cblxuICAgIGlmIChlbnRyeS5tYXJrZWRJbnNlcnRJbmRleCAhPT0gMHhmZmZmKSB7XG4gICAgICB2YXIgY291bnQgPSAoZW50cnkuZmxhZ3MgJiBNQVJLRURfSU5TRVJUX0NPVU5UKSA+Pj4gNTtcbiAgICAgIHZhciBpc0JlZm9yZSA9ICEhKGVudHJ5LmZsYWdzICYgTUFSS0VEX0lOU0VSVF9CRUZPUkUpO1xuXG4gICAgICB0aGlzLl9pbnNlcnRHbHlwaHModGhpcy5tYXJrZWRJbmRleCwgZW50cnkubWFya2VkSW5zZXJ0SW5kZXgsIGNvdW50LCBpc0JlZm9yZSk7XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LmN1cnJlbnRJbnNlcnRJbmRleCAhPT0gMHhmZmZmKSB7XG4gICAgICB2YXIgX2NvdW50ID0gKGVudHJ5LmZsYWdzICYgQ1VSUkVOVF9JTlNFUlRfQ09VTlQpID4+PiA1O1xuXG4gICAgICB2YXIgX2lzQmVmb3JlID0gISEoZW50cnkuZmxhZ3MgJiBDVVJSRU5UX0lOU0VSVF9CRUZPUkUpO1xuXG4gICAgICB0aGlzLl9pbnNlcnRHbHlwaHMoaW5kZXgsIGVudHJ5LmN1cnJlbnRJbnNlcnRJbmRleCwgX2NvdW50LCBfaXNCZWZvcmUpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZ2V0U3VwcG9ydGVkRmVhdHVyZXMgPSBmdW5jdGlvbiBnZXRTdXBwb3J0ZWRGZWF0dXJlcygpIHtcbiAgICB2YXIgZmVhdHVyZXMgPSBbXTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGEodGhpcy5tb3J4LmNoYWlucyksIF9zdGVwNDsgIShfc3RlcDQgPSBfaXRlcmF0b3I0KCkpLmRvbmU7KSB7XG4gICAgICB2YXIgY2hhaW4gPSBfc3RlcDQudmFsdWU7XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGEoY2hhaW4uZmVhdHVyZXMpLCBfc3RlcDU7ICEoX3N0ZXA1ID0gX2l0ZXJhdG9yNSgpKS5kb25lOykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IF9zdGVwNS52YWx1ZTtcbiAgICAgICAgZmVhdHVyZXMucHVzaChbZmVhdHVyZS5mZWF0dXJlVHlwZSwgZmVhdHVyZS5mZWF0dXJlU2V0dGluZ10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmZWF0dXJlcztcbiAgfTtcblxuICBfcHJvdG8uZ2VuZXJhdGVJbnB1dHMgPSBmdW5jdGlvbiBnZW5lcmF0ZUlucHV0cyhnaWQpIHtcbiAgICBpZiAoIXRoaXMuaW5wdXRDYWNoZSkge1xuICAgICAgdGhpcy5nZW5lcmF0ZUlucHV0Q2FjaGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbnB1dENhY2hlW2dpZF0gfHwgW107XG4gIH07XG5cbiAgX3Byb3RvLmdlbmVyYXRlSW5wdXRDYWNoZSA9IGZ1bmN0aW9uIGdlbmVyYXRlSW5wdXRDYWNoZSgpIHtcbiAgICB0aGlzLmlucHV0Q2FjaGUgPSB7fTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGEodGhpcy5tb3J4LmNoYWlucyksIF9zdGVwNjsgIShfc3RlcDYgPSBfaXRlcmF0b3I2KCkpLmRvbmU7KSB7XG4gICAgICB2YXIgY2hhaW4gPSBfc3RlcDYudmFsdWU7XG4gICAgICB2YXIgZmxhZ3MgPSBjaGFpbi5kZWZhdWx0RmxhZ3M7XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjcgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGEoY2hhaW4uc3VidGFibGVzKSwgX3N0ZXA3OyAhKF9zdGVwNyA9IF9pdGVyYXRvcjcoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHN1YnRhYmxlID0gX3N0ZXA3LnZhbHVlO1xuXG4gICAgICAgIGlmIChzdWJ0YWJsZS5zdWJGZWF0dXJlRmxhZ3MgJiBmbGFncykge1xuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVJbnB1dHNGb3JTdWJ0YWJsZShzdWJ0YWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmdlbmVyYXRlSW5wdXRzRm9yU3VidGFibGUgPSBmdW5jdGlvbiBnZW5lcmF0ZUlucHV0c0ZvclN1YnRhYmxlKHN1YnRhYmxlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIC8vIEN1cnJlbnRseSwgb25seSBzdXBwb3J0aW5nIGxpZ2F0dXJlIHN1YnRhYmxlcy5cbiAgICBpZiAoc3VidGFibGUudHlwZSAhPT0gMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByZXZlcnNlID0gISEoc3VidGFibGUuY292ZXJhZ2UgJiBSRVZFUlNFX0RJUkVDVElPTik7XG5cbiAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXZlcnNlIHN1YnRhYmxlLCBub3Qgc3VwcG9ydGVkLicpO1xuICAgIH1cblxuICAgIHRoaXMuc3VidGFibGUgPSBzdWJ0YWJsZTtcbiAgICB0aGlzLmxpZ2F0dXJlU3RhY2sgPSBbXTtcbiAgICB2YXIgc3RhdGVNYWNoaW5lID0gdGhpcy5nZXRTdGF0ZU1hY2hpbmUoc3VidGFibGUpO1xuICAgIHZhciBwcm9jZXNzID0gdGhpcy5nZXRQcm9jZXNzb3IoKTtcbiAgICB2YXIgaW5wdXQgPSBbXTtcbiAgICB2YXIgc3RhY2sgPSBbXTtcbiAgICB0aGlzLmdseXBocyA9IFtdO1xuICAgIHN0YXRlTWFjaGluZS50cmF2ZXJzZSh7XG4gICAgICBlbnRlcjogZnVuY3Rpb24gZW50ZXIoZ2x5cGgsIGVudHJ5KSB7XG4gICAgICAgIHZhciBnbHlwaHMgPSBfdGhpcy5nbHlwaHM7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgIGdseXBoczogZ2x5cGhzLnNsaWNlKCksXG4gICAgICAgICAgbGlnYXR1cmVTdGFjazogX3RoaXMubGlnYXR1cmVTdGFjay5zbGljZSgpXG4gICAgICAgIH0pOyAvLyBBZGQgZ2x5cGggdG8gaW5wdXQgYW5kIGdseXBocyB0byBwcm9jZXNzLlxuXG4gICAgICAgIHZhciBnID0gX3RoaXMuZm9udC5nZXRHbHlwaChnbHlwaCk7XG5cbiAgICAgICAgaW5wdXQucHVzaChnKTtcbiAgICAgICAgZ2x5cGhzLnB1c2goaW5wdXRbaW5wdXQubGVuZ3RoIC0gMV0pOyAvLyBQcm9jZXNzIGxpZ2F0dXJlIHN1YnN0aXR1dGlvblxuXG4gICAgICAgIHByb2Nlc3MoZ2x5cGhzW2dseXBocy5sZW5ndGggLSAxXSwgZW50cnksIGdseXBocy5sZW5ndGggLSAxKTsgLy8gQWRkIGlucHV0IHRvIHJlc3VsdCBpZiBvbmx5IG9uZSBtYXRjaGluZyAobm9uLWRlbGV0ZWQpIGdseXBoIHJlbWFpbnMuXG5cbiAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgdmFyIGZvdW5kID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdseXBocy5sZW5ndGggJiYgY291bnQgPD0gMTsgaSsrKSB7XG4gICAgICAgICAgaWYgKGdseXBoc1tpXS5pZCAhPT0gMHhmZmZmKSB7XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgZm91bmQgPSBnbHlwaHNbaV0uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGlucHV0Lm1hcChmdW5jdGlvbiAoZykge1xuICAgICAgICAgICAgcmV0dXJuIGcuaWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIF9jYWNoZSA9IF90aGlzLmlucHV0Q2FjaGVbZm91bmRdO1xuXG4gICAgICAgICAgaWYgKF9jYWNoZSkge1xuICAgICAgICAgICAgX2NhY2hlLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMuaW5wdXRDYWNoZVtmb3VuZF0gPSBbcmVzdWx0XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBleGl0OiBmdW5jdGlvbiBleGl0KCkge1xuICAgICAgICB2YXIgX3N0YWNrJHBvcCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIF90aGlzLmdseXBocyA9IF9zdGFjayRwb3AuZ2x5cGhzO1xuICAgICAgICBfdGhpcy5saWdhdHVyZVN0YWNrID0gX3N0YWNrJHBvcC5saWdhdHVyZVN0YWNrO1xuICAgICAgICBpbnB1dC5wb3AoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gQUFUTW9yeFByb2Nlc3Nvcjtcbn0oKSwgKF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkMihfY2xhc3MkMi5wcm90b3R5cGUsIFwiZ2V0U3RhdGVNYWNoaW5lXCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDIucHJvdG90eXBlLCBcImdldFN0YXRlTWFjaGluZVwiKSwgX2NsYXNzJDIucHJvdG90eXBlKSksIF9jbGFzcyQyKTtcbi8vIHJldmVyc2UgdGhlIGdseXBocyBpbnNpZGUgdGhvc2UgcmFuZ2VzIGlmIHNwZWNpZmllZFxuLy8gcmFuZ2VzIGFyZSBpbiBbb2Zmc2V0LCBsZW5ndGhdIGZvcm1hdFxuXG5mdW5jdGlvbiBzd2FwKGdseXBocywgcmFuZ2VBLCByYW5nZUIsIHJldmVyc2VBLCByZXZlcnNlQikge1xuICBpZiAocmV2ZXJzZUEgPT09IHZvaWQgMCkge1xuICAgIHJldmVyc2VBID0gZmFsc2U7XG4gIH1cblxuICBpZiAocmV2ZXJzZUIgPT09IHZvaWQgMCkge1xuICAgIHJldmVyc2VCID0gZmFsc2U7XG4gIH1cblxuICB2YXIgZW5kID0gZ2x5cGhzLnNwbGljZShyYW5nZUJbMF0gLSAocmFuZ2VCWzFdIC0gMSksIHJhbmdlQlsxXSk7XG5cbiAgaWYgKHJldmVyc2VCKSB7XG4gICAgZW5kLnJldmVyc2UoKTtcbiAgfVxuXG4gIHZhciBzdGFydCA9IGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbcmFuZ2VBWzBdLCByYW5nZUFbMV1dLmNvbmNhdChlbmQpKTtcblxuICBpZiAocmV2ZXJzZUEpIHtcbiAgICBzdGFydC5yZXZlcnNlKCk7XG4gIH1cblxuICBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW3JhbmdlQlswXSAtIChyYW5nZUFbMV0gLSAxKSwgMF0uY29uY2F0KHN0YXJ0KSk7XG4gIHJldHVybiBnbHlwaHM7XG59XG5cbmZ1bmN0aW9uIHJlb3JkZXJHbHlwaHMoZ2x5cGhzLCB2ZXJiLCBmaXJzdEdseXBoLCBsYXN0R2x5cGgpIHtcblxuICBzd2l0Y2ggKHZlcmIpIHtcbiAgICBjYXNlIDA6XG4gICAgICAvLyBubyBjaGFuZ2VcbiAgICAgIHJldHVybiBnbHlwaHM7XG5cbiAgICBjYXNlIDE6XG4gICAgICAvLyBBeCA9PiB4QVxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMV0sIFtsYXN0R2x5cGgsIDBdKTtcblxuICAgIGNhc2UgMjpcbiAgICAgIC8vIHhEID0+IER4XG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAwXSwgW2xhc3RHbHlwaCwgMV0pO1xuXG4gICAgY2FzZSAzOlxuICAgICAgLy8gQXhEID0+IER4QVxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMV0sIFtsYXN0R2x5cGgsIDFdKTtcblxuICAgIGNhc2UgNDpcbiAgICAgIC8vIEFCeCA9PiB4QUJcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDJdLCBbbGFzdEdseXBoLCAwXSk7XG5cbiAgICBjYXNlIDU6XG4gICAgICAvLyBBQnggPT4geEJBXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAyXSwgW2xhc3RHbHlwaCwgMF0sIHRydWUsIGZhbHNlKTtcblxuICAgIGNhc2UgNjpcbiAgICAgIC8vIHhDRCA9PiBDRHhcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDBdLCBbbGFzdEdseXBoLCAyXSk7XG5cbiAgICBjYXNlIDc6XG4gICAgICAvLyB4Q0QgPT4gREN4XG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAwXSwgW2xhc3RHbHlwaCwgMl0sIGZhbHNlLCB0cnVlKTtcblxuICAgIGNhc2UgODpcbiAgICAgIC8vIEF4Q0QgPT4gQ0R4QVxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMV0sIFtsYXN0R2x5cGgsIDJdKTtcblxuICAgIGNhc2UgOTpcbiAgICAgIC8vIEF4Q0QgPT4gREN4QVxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMV0sIFtsYXN0R2x5cGgsIDJdLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgICBjYXNlIDEwOlxuICAgICAgLy8gQUJ4RCA9PiBEeEFCXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAyXSwgW2xhc3RHbHlwaCwgMV0pO1xuXG4gICAgY2FzZSAxMTpcbiAgICAgIC8vIEFCeEQgPT4gRHhCQVxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMl0sIFtsYXN0R2x5cGgsIDFdLCB0cnVlLCBmYWxzZSk7XG5cbiAgICBjYXNlIDEyOlxuICAgICAgLy8gQUJ4Q0QgPT4gQ0R4QUJcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDJdLCBbbGFzdEdseXBoLCAyXSk7XG5cbiAgICBjYXNlIDEzOlxuICAgICAgLy8gQUJ4Q0QgPT4gQ0R4QkFcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDJdLCBbbGFzdEdseXBoLCAyXSwgdHJ1ZSwgZmFsc2UpO1xuXG4gICAgY2FzZSAxNDpcbiAgICAgIC8vIEFCeENEID0+IERDeEFCXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAyXSwgW2xhc3RHbHlwaCwgMl0sIGZhbHNlLCB0cnVlKTtcblxuICAgIGNhc2UgMTU6XG4gICAgICAvLyBBQnhDRCA9PiBEQ3hCQVxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMl0sIFtsYXN0R2x5cGgsIDJdLCB0cnVlLCB0cnVlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHZlcmI6IFwiICsgdmVyYik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRiKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRiKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRiKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkYihvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGIobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRiKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgQUFUTGF5b3V0RW5naW5lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQUFUTGF5b3V0RW5naW5lKGZvbnQpIHtcbiAgICB0aGlzLmZvbnQgPSBmb250O1xuICAgIHRoaXMubW9yeFByb2Nlc3NvciA9IG5ldyBBQVRNb3J4UHJvY2Vzc29yKGZvbnQpO1xuICAgIHRoaXMuZmFsbGJhY2tQb3NpdGlvbiA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEFBVExheW91dEVuZ2luZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnN1YnN0aXR1dGUgPSBmdW5jdGlvbiBzdWJzdGl0dXRlKGdseXBoUnVuKSB7XG4gICAgLy8gQUFUIGV4cGVjdHMgdGhlIGdseXBocyB0byBiZSBpbiB2aXN1YWwgb3JkZXIgcHJpb3IgdG8gbW9yeCBwcm9jZXNzaW5nLFxuICAgIC8vIHNvIHJldmVyc2UgdGhlIGdseXBocyBpZiB0aGUgc2NyaXB0IGlzIHJpZ2h0LXRvLWxlZnQuXG4gICAgaWYgKGdseXBoUnVuLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICAgIGdseXBoUnVuLmdseXBocy5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tb3J4UHJvY2Vzc29yLnByb2Nlc3MoZ2x5cGhSdW4uZ2x5cGhzLCBtYXBPVFRvQUFUKGdseXBoUnVuLmZlYXR1cmVzKSk7XG4gIH07XG5cbiAgX3Byb3RvLmdldEF2YWlsYWJsZUZlYXR1cmVzID0gZnVuY3Rpb24gZ2V0QXZhaWxhYmxlRmVhdHVyZXMoc2NyaXB0LCBsYW5ndWFnZSkge1xuICAgIHJldHVybiBtYXBBQVRUb09UKHRoaXMubW9yeFByb2Nlc3Nvci5nZXRTdXBwb3J0ZWRGZWF0dXJlcygpKTtcbiAgfTtcblxuICBfcHJvdG8uc3RyaW5nc0ZvckdseXBoID0gZnVuY3Rpb24gc3RyaW5nc0ZvckdseXBoKGdpZCkge1xuICAgIHZhciBnbHlwaFN0cmluZ3MgPSB0aGlzLm1vcnhQcm9jZXNzb3IuZ2VuZXJhdGVJbnB1dHMoZ2lkKTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IFNldCgpO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRiKGdseXBoU3RyaW5ncyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgZ2x5cGhzID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgIHRoaXMuX2FkZFN0cmluZ3MoZ2x5cGhzLCAwLCByZXN1bHQsICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIF9wcm90by5fYWRkU3RyaW5ncyA9IGZ1bmN0aW9uIF9hZGRTdHJpbmdzKGdseXBocywgaW5kZXgsIHN0cmluZ3MsIHN0cmluZykge1xuICAgIHZhciBjb2RlUG9pbnRzID0gdGhpcy5mb250Ll9jbWFwUHJvY2Vzc29yLmNvZGVQb2ludHNGb3JHbHlwaChnbHlwaHNbaW5kZXhdKTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGIoY29kZVBvaW50cyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgY29kZVBvaW50ID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgdmFyIHMgPSBzdHJpbmcgKyBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlUG9pbnQpO1xuXG4gICAgICBpZiAoaW5kZXggPCBnbHlwaHMubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aGlzLl9hZGRTdHJpbmdzKGdseXBocywgaW5kZXggKyAxLCBzdHJpbmdzLCBzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0cmluZ3MuYWRkKHMpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gQUFUTGF5b3V0RW5naW5lO1xufSgpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGMobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGMobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGMobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRjKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkYyhvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGMoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG4vKipcbiAqIFNoYXBpbmdQbGFucyBhcmUgdXNlZCBieSB0aGUgT3BlblR5cGUgc2hhcGVycyB0byBzdG9yZSB3aGljaFxuICogZmVhdHVyZXMgc2hvdWxkIGJ5IGFwcGxpZWQsIGFuZCBpbiB3aGF0IG9yZGVyIHRvIGFwcGx5IHRoZW0uXG4gKiBUaGUgZmVhdHVyZXMgYXJlIGFwcGxpZWQgaW4gZ3JvdXBzIGNhbGxlZCBzdGFnZXMuIEEgZmVhdHVyZVxuICogY2FuIGJlIGFwcGxpZWQgZ2xvYmFsbHkgdG8gYWxsIGdseXBocywgb3IgbG9jYWxseSB0byBvbmx5XG4gKiBzcGVjaWZpYyBnbHlwaHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgU2hhcGluZ1BsYW4gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTaGFwaW5nUGxhbihmb250LCBzY3JpcHQsIGRpcmVjdGlvbikge1xuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7XG4gICAgdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgdGhpcy5zdGFnZXMgPSBbXTtcbiAgICB0aGlzLmdsb2JhbEZlYXR1cmVzID0ge307XG4gICAgdGhpcy5hbGxGZWF0dXJlcyA9IHt9O1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIHRoZSBnaXZlbiBmZWF0dXJlcyB0byB0aGUgbGFzdCBzdGFnZS5cbiAgICogSWdub3JlcyBmZWF0dXJlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFNoYXBpbmdQbGFuLnByb3RvdHlwZTtcblxuICBfcHJvdG8uX2FkZEZlYXR1cmVzID0gZnVuY3Rpb24gX2FkZEZlYXR1cmVzKGZlYXR1cmVzLCBnbG9iYWwpIHtcbiAgICB2YXIgc3RhZ2VJbmRleCA9IHRoaXMuc3RhZ2VzLmxlbmd0aCAtIDE7XG4gICAgdmFyIHN0YWdlID0gdGhpcy5zdGFnZXNbc3RhZ2VJbmRleF07XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGMoZmVhdHVyZXMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIGZlYXR1cmUgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKHRoaXMuYWxsRmVhdHVyZXNbZmVhdHVyZV0gPT0gbnVsbCkge1xuICAgICAgICBzdGFnZS5wdXNoKGZlYXR1cmUpO1xuICAgICAgICB0aGlzLmFsbEZlYXR1cmVzW2ZlYXR1cmVdID0gc3RhZ2VJbmRleDtcblxuICAgICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgICAgdGhpcy5nbG9iYWxGZWF0dXJlc1tmZWF0dXJlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBmZWF0dXJlcyB0byB0aGUgbGFzdCBzdGFnZVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5hZGQgPSBmdW5jdGlvbiBhZGQoYXJnLCBnbG9iYWwpIHtcbiAgICBpZiAoZ2xvYmFsID09PSB2b2lkIDApIHtcbiAgICAgIGdsb2JhbCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zdGFnZXMucHVzaChbXSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBhcmcgPSBbYXJnXTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICB0aGlzLl9hZGRGZWF0dXJlcyhhcmcsIGdsb2JhbCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5fYWRkRmVhdHVyZXMoYXJnLmdsb2JhbCB8fCBbXSwgdHJ1ZSk7XG5cbiAgICAgIHRoaXMuX2FkZEZlYXR1cmVzKGFyZy5sb2NhbCB8fCBbXSwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhcmd1bWVudCB0byBTaGFwaW5nUGxhbiNhZGRcIik7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgc3RhZ2VcbiAgICovXG4gIDtcblxuICBfcHJvdG8uYWRkU3RhZ2UgPSBmdW5jdGlvbiBhZGRTdGFnZShhcmcsIGdsb2JhbCkge1xuICAgIGlmICh0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnN0YWdlcy5wdXNoKGFyZywgW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YWdlcy5wdXNoKFtdKTtcbiAgICAgIHRoaXMuYWRkKGFyZywgZ2xvYmFsKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnNldEZlYXR1cmVPdmVycmlkZXMgPSBmdW5jdGlvbiBzZXRGZWF0dXJlT3ZlcnJpZGVzKGZlYXR1cmVzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdHVyZXMpKSB7XG4gICAgICB0aGlzLmFkZChmZWF0dXJlcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZmVhdHVyZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKHZhciB0YWcgaW4gZmVhdHVyZXMpIHtcbiAgICAgICAgaWYgKGZlYXR1cmVzW3RhZ10pIHtcbiAgICAgICAgICB0aGlzLmFkZCh0YWcpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWxsRmVhdHVyZXNbdGFnXSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIHN0YWdlID0gdGhpcy5zdGFnZXNbdGhpcy5hbGxGZWF0dXJlc1t0YWddXTtcbiAgICAgICAgICBzdGFnZS5zcGxpY2Uoc3RhZ2UuaW5kZXhPZih0YWcpLCAxKTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5hbGxGZWF0dXJlc1t0YWddO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmdsb2JhbEZlYXR1cmVzW3RhZ107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEFzc2lnbnMgdGhlIGdsb2JhbCBmZWF0dXJlcyB0byB0aGUgZ2l2ZW4gZ2x5cGhzXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmFzc2lnbkdsb2JhbEZlYXR1cmVzID0gZnVuY3Rpb24gYXNzaWduR2xvYmFsRmVhdHVyZXMoZ2x5cGhzKSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYyhnbHlwaHMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgdmFyIGdseXBoID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICBmb3IgKHZhciBmZWF0dXJlIGluIHRoaXMuZ2xvYmFsRmVhdHVyZXMpIHtcbiAgICAgICAgZ2x5cGguZmVhdHVyZXNbZmVhdHVyZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIHBsYW5uZWQgc3RhZ2VzIHVzaW5nIHRoZSBnaXZlbiBPVFByb2Nlc3NvclxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5wcm9jZXNzID0gZnVuY3Rpb24gcHJvY2Vzcyhwcm9jZXNzb3IsIGdseXBocywgcG9zaXRpb25zKSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYyh0aGlzLnN0YWdlcyksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgc3RhZ2UgPSBfc3RlcDMudmFsdWU7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3RhZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKCFwb3NpdGlvbnMpIHtcbiAgICAgICAgICBzdGFnZSh0aGlzLmZvbnQsIGdseXBocywgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9jZXNzb3IuYXBwbHlGZWF0dXJlcyhzdGFnZSwgZ2x5cGhzLCBwb3NpdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gU2hhcGluZ1BsYW47XG59KCk7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG52YXIgVkFSSUFUSU9OX0ZFQVRVUkVTID0gWydydnJuJ107XG52YXIgQ09NTU9OX0ZFQVRVUkVTID0gWydjY21wJywgJ2xvY2wnLCAncmxpZycsICdtYXJrJywgJ21rbWsnXTtcbnZhciBGUkFDVElPTkFMX0ZFQVRVUkVTID0gWydmcmFjJywgJ251bXInLCAnZG5vbSddO1xudmFyIEhPUklaT05UQUxfRkVBVFVSRVMgPSBbJ2NhbHQnLCAnY2xpZycsICdsaWdhJywgJ3JjbHQnLCAnY3VycycsICdrZXJuJ107XG52YXIgRElSRUNUSU9OQUxfRkVBVFVSRVMgPSB7XG4gIGx0cjogWydsdHJhJywgJ2x0cm0nXSxcbiAgcnRsOiBbJ3J0bGEnLCAncnRsbSddXG59O1xuXG52YXIgRGVmYXVsdFNoYXBlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIERlZmF1bHRTaGFwZXIoKSB7fVxuXG4gIERlZmF1bHRTaGFwZXIucGxhbiA9IGZ1bmN0aW9uIHBsYW4oX3BsYW4sIGdseXBocywgZmVhdHVyZXMpIHtcbiAgICAvLyBQbGFuIHRoZSBmZWF0dXJlcyB3ZSB3YW50IHRvIGFwcGx5XG4gICAgdGhpcy5wbGFuUHJlcHJvY2Vzc2luZyhfcGxhbik7XG4gICAgdGhpcy5wbGFuRmVhdHVyZXMoX3BsYW4pO1xuICAgIHRoaXMucGxhblBvc3Rwcm9jZXNzaW5nKF9wbGFuLCBmZWF0dXJlcyk7IC8vIEFzc2lnbiB0aGUgZ2xvYmFsIGZlYXR1cmVzIHRvIGFsbCB0aGUgZ2x5cGhzXG5cbiAgICBfcGxhbi5hc3NpZ25HbG9iYWxGZWF0dXJlcyhnbHlwaHMpOyAvLyBBc3NpZ24gbG9jYWwgZmVhdHVyZXMgdG8gZ2x5cGhzXG5cblxuICAgIHRoaXMuYXNzaWduRmVhdHVyZXMoX3BsYW4sIGdseXBocyk7XG4gIH07XG5cbiAgRGVmYXVsdFNoYXBlci5wbGFuUHJlcHJvY2Vzc2luZyA9IGZ1bmN0aW9uIHBsYW5QcmVwcm9jZXNzaW5nKHBsYW4pIHtcbiAgICBwbGFuLmFkZCh7XG4gICAgICBnbG9iYWw6IFtdLmNvbmNhdChWQVJJQVRJT05fRkVBVFVSRVMsIERJUkVDVElPTkFMX0ZFQVRVUkVTW3BsYW4uZGlyZWN0aW9uXSksXG4gICAgICBsb2NhbDogRlJBQ1RJT05BTF9GRUFUVVJFU1xuICAgIH0pO1xuICB9O1xuXG4gIERlZmF1bHRTaGFwZXIucGxhbkZlYXR1cmVzID0gZnVuY3Rpb24gcGxhbkZlYXR1cmVzKHBsYW4pIHsvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuIExldCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMuXG4gIH07XG5cbiAgRGVmYXVsdFNoYXBlci5wbGFuUG9zdHByb2Nlc3NpbmcgPSBmdW5jdGlvbiBwbGFuUG9zdHByb2Nlc3NpbmcocGxhbiwgdXNlckZlYXR1cmVzKSB7XG4gICAgcGxhbi5hZGQoW10uY29uY2F0KENPTU1PTl9GRUFUVVJFUywgSE9SSVpPTlRBTF9GRUFUVVJFUykpO1xuICAgIHBsYW4uc2V0RmVhdHVyZU92ZXJyaWRlcyh1c2VyRmVhdHVyZXMpO1xuICB9O1xuXG4gIERlZmF1bHRTaGFwZXIuYXNzaWduRmVhdHVyZXMgPSBmdW5jdGlvbiBhc3NpZ25GZWF0dXJlcyhwbGFuLCBnbHlwaHMpIHtcbiAgICAvLyBFbmFibGUgY29udGV4dHVhbCBmcmFjdGlvbnNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdseXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2ldO1xuXG4gICAgICBpZiAoZ2x5cGguY29kZVBvaW50c1swXSA9PT0gMHgyMDQ0KSB7XG4gICAgICAgIC8vIGZyYWN0aW9uIHNsYXNoXG4gICAgICAgIHZhciBzdGFydCA9IGk7XG4gICAgICAgIHZhciBlbmQgPSBpICsgMTsgLy8gQXBwbHkgbnVtZXJhdG9yXG5cbiAgICAgICAgd2hpbGUgKHN0YXJ0ID4gMCAmJiB1bmljb2RlLmlzRGlnaXQoZ2x5cGhzW3N0YXJ0IC0gMV0uY29kZVBvaW50c1swXSkpIHtcbiAgICAgICAgICBnbHlwaHNbc3RhcnQgLSAxXS5mZWF0dXJlcy5udW1yID0gdHJ1ZTtcbiAgICAgICAgICBnbHlwaHNbc3RhcnQgLSAxXS5mZWF0dXJlcy5mcmFjID0gdHJ1ZTtcbiAgICAgICAgICBzdGFydC0tO1xuICAgICAgICB9IC8vIEFwcGx5IGRlbm9taW5hdG9yXG5cblxuICAgICAgICB3aGlsZSAoZW5kIDwgZ2x5cGhzLmxlbmd0aCAmJiB1bmljb2RlLmlzRGlnaXQoZ2x5cGhzW2VuZF0uY29kZVBvaW50c1swXSkpIHtcbiAgICAgICAgICBnbHlwaHNbZW5kXS5mZWF0dXJlcy5kbm9tID0gdHJ1ZTtcbiAgICAgICAgICBnbHlwaHNbZW5kXS5mZWF0dXJlcy5mcmFjID0gdHJ1ZTtcbiAgICAgICAgICBlbmQrKztcbiAgICAgICAgfSAvLyBBcHBseSBmcmFjdGlvbiBzbGFzaFxuXG5cbiAgICAgICAgZ2x5cGguZmVhdHVyZXMuZnJhYyA9IHRydWU7XG4gICAgICAgIGkgPSBlbmQgLSAxO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gRGVmYXVsdFNoYXBlcjtcbn0oKTtcblxuX2RlZmluZVByb3BlcnR5KERlZmF1bHRTaGFwZXIsIFwiemVyb01hcmtXaWR0aHNcIiwgJ0FGVEVSX0dQT1MnKTtcblxudmFyIGJhc2U2NERlZmxhdGVkVHJpZSQxID0gXCJlSndCRGdMeC9RQUI4QUFBQUFBQUFBQTRBQUg5QVFMKzdab3RUTVF3Rk1lNzdiNDRRSUhBNEpCSUJBSjVseEFTREFtR2hITW9CSXFnVU9CUUpBaE9JcEZJRElvZ1NVZ0lFb2xFRWd6Si9TL1hrcGVtM1hYWGJvUGJlOGt2N2EzcjYzdnQ2OXU2WERjV1lodnNnbjNRbGIvL1Mza01Uc0VadUFDWG9BOXV3QzI0QS9mZ0FUeVJmcy9nVGY0ZThnNCtaUDFUbGwra25abE9mc0MxcEo0SU1ROFdrdkx0S29vbCtMb3MvVjJwa044TXd6QU13ekFNd3pBTXcxU1A0ZmVmVmY3K3dUQU13ekFNd3pDNWNqVXpZakVuWHNGY1c0Z09PQWVQNExzOWFsdWZGV0pUQ05GckNkRnZqZXBGOE5MS2J6N1hjSWJaTUp4ak9yaTJsZUY4czRONzl6elBRejMwUDdEb09NVDFvNHFjdDlUL0MwNm0xTjlPSFAzQ3dsSmxpU3pRZGxNOWxOU2sza1NqWmloMVRIMnlRdnY5SmFFMlVSLzF1WEx4THdTVHpHMFJKRnJkeFE5VFhLbDJRVXFiaE5nSGREd1hvVDdUYXo3U0JIV0Qvb1lrYmYxZFl5SWhPdlYrRFUvN2xXU056MUJ4UFc1dVRPM2p4bldWc3ZlZGIrelorby9MOVZsaWo5NXJlcmJaN0lvTWVsVGUxWE5GYUpra2hxbHRwaGpUOVpybVQ1ZXkzNHpWR2lqUmJReGxYOW43eFBUdTFaUVV1WTk5OTNPYWYzbnFEcW5MTlVmNFNLZzFpeWUwMDVaTElxMVU5VWlPNWZKT0dLZm9ONDJueG5LMU5VVE9wZmJZZk5GenFaNVRmZTJ3eldPSXVMT3RRZEVvdjRxV3RMaHpKZXM2aEk1Ulh3bVp2MHpQQ3BzMEE0NXJrd0dhTVFYdlwiO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSQzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxudmFyIHRyaWVEYXRhJDEgPSBwYWtvLmluZmxhdGUoYmFzZTY0QXJyYXlidWZmZXJfMihiYXNlNjREZWZsYXRlZFRyaWUkMSkpO1xudmFyIHRyaWUkMSA9IG5ldyB1bmljb2RlVHJpZSh0cmllRGF0YSQxKTtcbnZhciBGRUFUVVJFUyA9IFsnaXNvbCcsICdmaW5hJywgJ2ZpbjInLCAnZmluMycsICdtZWRpJywgJ21lZDInLCAnaW5pdCddO1xudmFyIFNoYXBpbmdDbGFzc2VzID0ge1xuICBOb25fSm9pbmluZzogMCxcbiAgTGVmdF9Kb2luaW5nOiAxLFxuICBSaWdodF9Kb2luaW5nOiAyLFxuICBEdWFsX0pvaW5pbmc6IDMsXG4gIEpvaW5fQ2F1c2luZzogMyxcbiAgQUxBUEg6IDQsXG4gICdEQUxBVEggUklTSCc6IDUsXG4gIFRyYW5zcGFyZW50OiA2XG59O1xudmFyIElTT0wgPSAnaXNvbCc7XG52YXIgRklOQSA9ICdmaW5hJztcbnZhciBGSU4yID0gJ2ZpbjInO1xudmFyIEZJTjMgPSAnZmluMyc7XG52YXIgTUVESSA9ICdtZWRpJztcbnZhciBNRUQyID0gJ21lZDInO1xudmFyIElOSVQgPSAnaW5pdCc7XG52YXIgTk9ORSA9IG51bGw7IC8vIEVhY2ggZW50cnkgaXMgW3ByZXZBY3Rpb24sIGN1ckFjdGlvbiwgbmV4dFN0YXRlXVxuXG52YXIgU1RBVEVfVEFCTEUgPSBbLy8gICBOb25fSm9pbmluZywgICAgICAgIExlZnRfSm9pbmluZywgICAgICAgUmlnaHRfSm9pbmluZywgICAgIER1YWxfSm9pbmluZywgICAgICAgICAgIEFMQVBILCAgICAgICAgICAgIERBTEFUSCBSSVNIXG4vLyBTdGF0ZSAwOiBwcmV2IHdhcyBVLCAgbm90IHdpbGxpbmcgdG8gam9pbi5cbltbTk9ORSwgTk9ORSwgMF0sIFtOT05FLCBJU09MLCAyXSwgW05PTkUsIElTT0wsIDFdLCBbTk9ORSwgSVNPTCwgMl0sIFtOT05FLCBJU09MLCAxXSwgW05PTkUsIElTT0wsIDZdXSwgLy8gU3RhdGUgMTogcHJldiB3YXMgUiBvciBJU09ML0FMQVBILCAgbm90IHdpbGxpbmcgdG8gam9pbi5cbltbTk9ORSwgTk9ORSwgMF0sIFtOT05FLCBJU09MLCAyXSwgW05PTkUsIElTT0wsIDFdLCBbTk9ORSwgSVNPTCwgMl0sIFtOT05FLCBGSU4yLCA1XSwgW05PTkUsIElTT0wsIDZdXSwgLy8gU3RhdGUgMjogcHJldiB3YXMgRC9MIGluIElTT0wgZm9ybSwgIHdpbGxpbmcgdG8gam9pbi5cbltbTk9ORSwgTk9ORSwgMF0sIFtOT05FLCBJU09MLCAyXSwgW0lOSVQsIEZJTkEsIDFdLCBbSU5JVCwgRklOQSwgM10sIFtJTklULCBGSU5BLCA0XSwgW0lOSVQsIEZJTkEsIDZdXSwgLy8gU3RhdGUgMzogcHJldiB3YXMgRCBpbiBGSU5BIGZvcm0sICB3aWxsaW5nIHRvIGpvaW4uXG5bW05PTkUsIE5PTkUsIDBdLCBbTk9ORSwgSVNPTCwgMl0sIFtNRURJLCBGSU5BLCAxXSwgW01FREksIEZJTkEsIDNdLCBbTUVESSwgRklOQSwgNF0sIFtNRURJLCBGSU5BLCA2XV0sIC8vIFN0YXRlIDQ6IHByZXYgd2FzIEZJTkEgQUxBUEgsICBub3Qgd2lsbGluZyB0byBqb2luLlxuW1tOT05FLCBOT05FLCAwXSwgW05PTkUsIElTT0wsIDJdLCBbTUVEMiwgSVNPTCwgMV0sIFtNRUQyLCBJU09MLCAyXSwgW01FRDIsIEZJTjIsIDVdLCBbTUVEMiwgSVNPTCwgNl1dLCAvLyBTdGF0ZSA1OiBwcmV2IHdhcyBGSU4yL0ZJTjMgQUxBUEgsICBub3Qgd2lsbGluZyB0byBqb2luLlxuW1tOT05FLCBOT05FLCAwXSwgW05PTkUsIElTT0wsIDJdLCBbSVNPTCwgSVNPTCwgMV0sIFtJU09MLCBJU09MLCAyXSwgW0lTT0wsIEZJTjIsIDVdLCBbSVNPTCwgSVNPTCwgNl1dLCAvLyBTdGF0ZSA2OiBwcmV2IHdhcyBEQUxBVEgvUklTSCwgIG5vdCB3aWxsaW5nIHRvIGpvaW4uXG5bW05PTkUsIE5PTkUsIDBdLCBbTk9ORSwgSVNPTCwgMl0sIFtOT05FLCBJU09MLCAxXSwgW05PTkUsIElTT0wsIDJdLCBbTk9ORSwgRklOMywgNV0sIFtOT05FLCBJU09MLCA2XV1dO1xuLyoqXG4gKiBUaGlzIGlzIGEgc2hhcGVyIGZvciBBcmFiaWMsIGFuZCBvdGhlciBjdXJzaXZlIHNjcmlwdHMuXG4gKiBJdCB1c2VzIGRhdGEgZnJvbSBBcmFiaWNTaGFwaW5nLnR4dCBpbiB0aGUgVW5pY29kZSBkYXRhYmFzZSxcbiAqIGNvbXBpbGVkIHRvIGEgVW5pY29kZVRyaWUgYnkgZ2VuZXJhdGUtZGF0YS5jb2ZmZWUuXG4gKlxuICogVGhlIHNoYXBpbmcgc3RhdGUgbWFjaGluZSB3YXMgcG9ydGVkIGZyb20gSGFyZmJ1enouXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmVoZGFkL2hhcmZidXp6L2Jsb2IvbWFzdGVyL3NyYy9oYi1vdC1zaGFwZS1jb21wbGV4LWFyYWJpYy5jY1xuICovXG5cbnZhciBBcmFiaWNTaGFwZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9EZWZhdWx0U2hhcGVyKSB7XG4gIF9pbmhlcml0c0xvb3NlJDMoQXJhYmljU2hhcGVyLCBfRGVmYXVsdFNoYXBlcik7XG5cbiAgZnVuY3Rpb24gQXJhYmljU2hhcGVyKCkge1xuICAgIHJldHVybiBfRGVmYXVsdFNoYXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICBBcmFiaWNTaGFwZXIucGxhbkZlYXR1cmVzID0gZnVuY3Rpb24gcGxhbkZlYXR1cmVzKHBsYW4pIHtcbiAgICBwbGFuLmFkZChbJ2NjbXAnLCAnbG9jbCddKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgRkVBVFVSRVMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmZWF0dXJlID0gRkVBVFVSRVNbaV07XG4gICAgICBwbGFuLmFkZFN0YWdlKGZlYXR1cmUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwbGFuLmFkZFN0YWdlKCdtc2V0Jyk7XG4gIH07XG5cbiAgQXJhYmljU2hhcGVyLmFzc2lnbkZlYXR1cmVzID0gZnVuY3Rpb24gYXNzaWduRmVhdHVyZXMocGxhbiwgZ2x5cGhzKSB7XG4gICAgX0RlZmF1bHRTaGFwZXIuYXNzaWduRmVhdHVyZXMuY2FsbCh0aGlzLCBwbGFuLCBnbHlwaHMpO1xuXG4gICAgdmFyIHByZXYgPSAtMTtcbiAgICB2YXIgc3RhdGUgPSAwO1xuICAgIHZhciBhY3Rpb25zID0gW107IC8vIEFwcGx5IHRoZSBzdGF0ZSBtYWNoaW5lIHRvIG1hcCBnbHlwaHMgdG8gZmVhdHVyZXNcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY3VyQWN0aW9uID0gdm9pZCAwLFxuICAgICAgICAgIHByZXZBY3Rpb24gPSB2b2lkIDA7XG4gICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICB2YXIgdHlwZSA9IGdldFNoYXBpbmdDbGFzcyhnbHlwaC5jb2RlUG9pbnRzWzBdKTtcblxuICAgICAgaWYgKHR5cGUgPT09IFNoYXBpbmdDbGFzc2VzLlRyYW5zcGFyZW50KSB7XG4gICAgICAgIGFjdGlvbnNbaV0gPSBOT05FO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIF9TVEFURV9UQUJMRSRzdGF0ZSR0eSA9IFNUQVRFX1RBQkxFW3N0YXRlXVt0eXBlXTtcbiAgICAgIHByZXZBY3Rpb24gPSBfU1RBVEVfVEFCTEUkc3RhdGUkdHlbMF07XG4gICAgICBjdXJBY3Rpb24gPSBfU1RBVEVfVEFCTEUkc3RhdGUkdHlbMV07XG4gICAgICBzdGF0ZSA9IF9TVEFURV9UQUJMRSRzdGF0ZSR0eVsyXTtcblxuICAgICAgaWYgKHByZXZBY3Rpb24gIT09IE5PTkUgJiYgcHJldiAhPT0gLTEpIHtcbiAgICAgICAgYWN0aW9uc1twcmV2XSA9IHByZXZBY3Rpb247XG4gICAgICB9XG5cbiAgICAgIGFjdGlvbnNbaV0gPSBjdXJBY3Rpb247XG4gICAgICBwcmV2ID0gaTtcbiAgICB9IC8vIEFwcGx5IHRoZSBjaG9zZW4gZmVhdHVyZXMgdG8gdGhlaXIgcmVzcGVjdGl2ZSBnbHlwaHNcblxuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGdseXBocy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBmZWF0dXJlID0gdm9pZCAwO1xuICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2luZGV4XTtcblxuICAgICAgaWYgKGZlYXR1cmUgPSBhY3Rpb25zW2luZGV4XSkge1xuICAgICAgICBnbHlwaC5mZWF0dXJlc1tmZWF0dXJlXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBBcmFiaWNTaGFwZXI7XG59KERlZmF1bHRTaGFwZXIpO1xuXG5mdW5jdGlvbiBnZXRTaGFwaW5nQ2xhc3MoY29kZVBvaW50KSB7XG4gIHZhciByZXMgPSB0cmllJDEuZ2V0KGNvZGVQb2ludCk7XG5cbiAgaWYgKHJlcykge1xuICAgIHJldHVybiByZXMgLSAxO1xuICB9XG5cbiAgdmFyIGNhdGVnb3J5ID0gdW5pY29kZS5nZXRDYXRlZ29yeShjb2RlUG9pbnQpO1xuXG4gIGlmIChjYXRlZ29yeSA9PT0gJ01uJyB8fCBjYXRlZ29yeSA9PT0gJ01lJyB8fCBjYXRlZ29yeSA9PT0gJ0NmJykge1xuICAgIHJldHVybiBTaGFwaW5nQ2xhc3Nlcy5UcmFuc3BhcmVudDtcbiAgfVxuXG4gIHJldHVybiBTaGFwaW5nQ2xhc3Nlcy5Ob25fSm9pbmluZztcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkMyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciBHbHlwaEl0ZXJhdG9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gR2x5cGhJdGVyYXRvcihnbHlwaHMsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmdseXBocyA9IGdseXBocztcbiAgICB0aGlzLnJlc2V0KG9wdGlvbnMpO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEdseXBoSXRlcmF0b3IucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KG9wdGlvbnMsIGluZGV4KSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmZsYWdzID0gb3B0aW9ucy5mbGFncyB8fCB7fTtcbiAgICB0aGlzLm1hcmtBdHRhY2htZW50VHlwZSA9IG9wdGlvbnMubWFya0F0dGFjaG1lbnRUeXBlIHx8IDA7XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICB9O1xuXG4gIF9wcm90by5zaG91bGRJZ25vcmUgPSBmdW5jdGlvbiBzaG91bGRJZ25vcmUoZ2x5cGgpIHtcbiAgICByZXR1cm4gdGhpcy5mbGFncy5pZ25vcmVNYXJrcyAmJiBnbHlwaC5pc01hcmsgfHwgdGhpcy5mbGFncy5pZ25vcmVCYXNlR2x5cGhzICYmIGdseXBoLmlzQmFzZSB8fCB0aGlzLmZsYWdzLmlnbm9yZUxpZ2F0dXJlcyAmJiBnbHlwaC5pc0xpZ2F0dXJlIHx8IHRoaXMubWFya0F0dGFjaG1lbnRUeXBlICYmIGdseXBoLmlzTWFyayAmJiBnbHlwaC5tYXJrQXR0YWNobWVudFR5cGUgIT09IHRoaXMubWFya0F0dGFjaG1lbnRUeXBlO1xuICB9O1xuXG4gIF9wcm90by5tb3ZlID0gZnVuY3Rpb24gbW92ZShkaXIpIHtcbiAgICB0aGlzLmluZGV4ICs9IGRpcjtcblxuICAgIHdoaWxlICgwIDw9IHRoaXMuaW5kZXggJiYgdGhpcy5pbmRleCA8IHRoaXMuZ2x5cGhzLmxlbmd0aCAmJiB0aGlzLnNob3VsZElnbm9yZSh0aGlzLmdseXBoc1t0aGlzLmluZGV4XSkpIHtcbiAgICAgIHRoaXMuaW5kZXggKz0gZGlyO1xuICAgIH1cblxuICAgIGlmICgwID4gdGhpcy5pbmRleCB8fCB0aGlzLmluZGV4ID49IHRoaXMuZ2x5cGhzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2x5cGhzW3RoaXMuaW5kZXhdO1xuICB9O1xuXG4gIF9wcm90by5uZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb3ZlKCsxKTtcbiAgfTtcblxuICBfcHJvdG8ucHJldiA9IGZ1bmN0aW9uIHByZXYoKSB7XG4gICAgcmV0dXJuIHRoaXMubW92ZSgtMSk7XG4gIH07XG5cbiAgX3Byb3RvLnBlZWsgPSBmdW5jdGlvbiBwZWVrKGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09PSB2b2lkIDApIHtcbiAgICAgIGNvdW50ID0gMTtcbiAgICB9XG5cbiAgICB2YXIgaWR4ID0gdGhpcy5pbmRleDtcbiAgICB2YXIgcmVzID0gdGhpcy5pbmNyZW1lbnQoY291bnQpO1xuICAgIHRoaXMuaW5kZXggPSBpZHg7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBfcHJvdG8ucGVla0luZGV4ID0gZnVuY3Rpb24gcGVla0luZGV4KGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09PSB2b2lkIDApIHtcbiAgICAgIGNvdW50ID0gMTtcbiAgICB9XG5cbiAgICB2YXIgaWR4ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLmluY3JlbWVudChjb3VudCk7XG4gICAgdmFyIHJlcyA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5pbmRleCA9IGlkeDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIF9wcm90by5pbmNyZW1lbnQgPSBmdW5jdGlvbiBpbmNyZW1lbnQoY291bnQpIHtcbiAgICBpZiAoY291bnQgPT09IHZvaWQgMCkge1xuICAgICAgY291bnQgPSAxO1xuICAgIH1cblxuICAgIHZhciBkaXIgPSBjb3VudCA8IDAgPyAtMSA6IDE7XG4gICAgY291bnQgPSBNYXRoLmFicyhjb3VudCk7XG5cbiAgICB3aGlsZSAoY291bnQtLSkge1xuICAgICAgdGhpcy5tb3ZlKGRpcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2x5cGhzW3RoaXMuaW5kZXhdO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyQzKEdseXBoSXRlcmF0b3IsIFt7XG4gICAga2V5OiBcImN1clwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2x5cGhzW3RoaXMuaW5kZXhdIHx8IG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEdseXBoSXRlcmF0b3I7XG59KCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkZChvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkZChvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGQobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRkKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkZChhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cbnZhciBERUZBVUxUX1NDUklQVFMgPSBbJ0RGTFQnLCAnZGZsdCcsICdsYXRuJ107XG5cbnZhciBPVFByb2Nlc3NvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE9UUHJvY2Vzc29yKGZvbnQsIHRhYmxlKSB7XG4gICAgdGhpcy5mb250ID0gZm9udDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5zY3JpcHQgPSBudWxsO1xuICAgIHRoaXMuc2NyaXB0VGFnID0gbnVsbDtcbiAgICB0aGlzLmxhbmd1YWdlID0gbnVsbDtcbiAgICB0aGlzLmxhbmd1YWdlVGFnID0gbnVsbDtcbiAgICB0aGlzLmZlYXR1cmVzID0ge307XG4gICAgdGhpcy5sb29rdXBzID0ge307IC8vIFNldHVwIHZhcmlhdGlvbiBzdWJzdGl0dXRpb25zXG5cbiAgICB0aGlzLnZhcmlhdGlvbnNJbmRleCA9IGZvbnQuX3ZhcmlhdGlvblByb2Nlc3NvciA/IHRoaXMuZmluZFZhcmlhdGlvbnNJbmRleChmb250Ll92YXJpYXRpb25Qcm9jZXNzb3Iubm9ybWFsaXplZENvb3JkcykgOiAtMTsgLy8gaW5pdGlhbGl6ZSB0byBkZWZhdWx0IHNjcmlwdCArIGxhbmd1YWdlXG5cbiAgICB0aGlzLnNlbGVjdFNjcmlwdCgpOyAvLyBjdXJyZW50IGNvbnRleHQgKHNldCBieSBhcHBseUZlYXR1cmVzKVxuXG4gICAgdGhpcy5nbHlwaHMgPSBbXTtcbiAgICB0aGlzLnBvc2l0aW9ucyA9IFtdOyAvLyBvbmx5IHVzZWQgYnkgR1BPU1xuXG4gICAgdGhpcy5saWdhdHVyZUlEID0gMTtcbiAgICB0aGlzLmN1cnJlbnRGZWF0dXJlID0gbnVsbDtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBPVFByb2Nlc3Nvci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmZpbmRTY3JpcHQgPSBmdW5jdGlvbiBmaW5kU2NyaXB0KHNjcmlwdCkge1xuICAgIGlmICh0aGlzLnRhYmxlLnNjcmlwdExpc3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNjcmlwdCkpIHtcbiAgICAgIHNjcmlwdCA9IFtzY3JpcHRdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChzY3JpcHQpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIHMgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZCh0aGlzLnRhYmxlLnNjcmlwdExpc3QpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgICB2YXIgZW50cnkgPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgaWYgKGVudHJ5LnRhZyA9PT0gcykge1xuICAgICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9wcm90by5zZWxlY3RTY3JpcHQgPSBmdW5jdGlvbiBzZWxlY3RTY3JpcHQoc2NyaXB0LCBsYW5ndWFnZSwgZGlyZWN0aW9uJDEpIHtcbiAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciBlbnRyeTtcblxuICAgIGlmICghdGhpcy5zY3JpcHQgfHwgc2NyaXB0ICE9PSB0aGlzLnNjcmlwdFRhZykge1xuICAgICAgZW50cnkgPSB0aGlzLmZpbmRTY3JpcHQoc2NyaXB0KTtcblxuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICBlbnRyeSA9IHRoaXMuZmluZFNjcmlwdChERUZBVUxUX1NDUklQVFMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcmlwdFRhZztcbiAgICAgIH1cblxuICAgICAgdGhpcy5zY3JpcHRUYWcgPSBlbnRyeS50YWc7XG4gICAgICB0aGlzLnNjcmlwdCA9IGVudHJ5LnNjcmlwdDtcbiAgICAgIHRoaXMubGFuZ3VhZ2UgPSBudWxsO1xuICAgICAgdGhpcy5sYW5ndWFnZVRhZyA9IG51bGw7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWRpcmVjdGlvbiQxIHx8IGRpcmVjdGlvbiQxICE9PSB0aGlzLmRpcmVjdGlvbikge1xuICAgICAgdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb24kMSB8fCBkaXJlY3Rpb24oc2NyaXB0KTtcbiAgICB9XG5cbiAgICBpZiAobGFuZ3VhZ2UgJiYgbGFuZ3VhZ2UubGVuZ3RoIDwgNCkge1xuICAgICAgbGFuZ3VhZ2UgKz0gJyAnLnJlcGVhdCg0IC0gbGFuZ3VhZ2UubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAoIWxhbmd1YWdlIHx8IGxhbmd1YWdlICE9PSB0aGlzLmxhbmd1YWdlVGFnKSB7XG4gICAgICB0aGlzLmxhbmd1YWdlID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZCh0aGlzLnNjcmlwdC5sYW5nU3lzUmVjb3JkcyksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBsYW5nID0gX3N0ZXAzLnZhbHVlO1xuXG4gICAgICAgIGlmIChsYW5nLnRhZyA9PT0gbGFuZ3VhZ2UpIHtcbiAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZy5sYW5nU3lzO1xuICAgICAgICAgIHRoaXMubGFuZ3VhZ2VUYWcgPSBsYW5nLnRhZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMubGFuZ3VhZ2UpIHtcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9IHRoaXMuc2NyaXB0LmRlZmF1bHRMYW5nU3lzO1xuICAgICAgICB0aGlzLmxhbmd1YWdlVGFnID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfSAvLyBCdWlsZCBhIGZlYXR1cmUgbG9va3VwIHRhYmxlXG5cblxuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICB0aGlzLmZlYXR1cmVzID0ge307XG5cbiAgICAgIGlmICh0aGlzLmxhbmd1YWdlKSB7XG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQodGhpcy5sYW5ndWFnZS5mZWF0dXJlSW5kZXhlcyksIF9zdGVwNDsgIShfc3RlcDQgPSBfaXRlcmF0b3I0KCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGZlYXR1cmVJbmRleCA9IF9zdGVwNC52YWx1ZTtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gdGhpcy50YWJsZS5mZWF0dXJlTGlzdFtmZWF0dXJlSW5kZXhdO1xuICAgICAgICAgIHZhciBzdWJzdGl0dXRlRmVhdHVyZSA9IHRoaXMuc3Vic3RpdHV0ZUZlYXR1cmVGb3JWYXJpYXRpb25zKGZlYXR1cmVJbmRleCk7XG4gICAgICAgICAgdGhpcy5mZWF0dXJlc1tyZWNvcmQudGFnXSA9IHN1YnN0aXR1dGVGZWF0dXJlIHx8IHJlY29yZC5mZWF0dXJlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2NyaXB0VGFnO1xuICB9O1xuXG4gIF9wcm90by5sb29rdXBzRm9yRmVhdHVyZXMgPSBmdW5jdGlvbiBsb29rdXBzRm9yRmVhdHVyZXModXNlckZlYXR1cmVzLCBleGNsdWRlKSB7XG4gICAgaWYgKHVzZXJGZWF0dXJlcyA9PT0gdm9pZCAwKSB7XG4gICAgICB1c2VyRmVhdHVyZXMgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgbG9va3VwcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yNSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZCh1c2VyRmVhdHVyZXMpLCBfc3RlcDU7ICEoX3N0ZXA1ID0gX2l0ZXJhdG9yNSgpKS5kb25lOykge1xuICAgICAgdmFyIHRhZyA9IF9zdGVwNS52YWx1ZTtcbiAgICAgIHZhciBmZWF0dXJlID0gdGhpcy5mZWF0dXJlc1t0YWddO1xuXG4gICAgICBpZiAoIWZlYXR1cmUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQoZmVhdHVyZS5sb29rdXBMaXN0SW5kZXhlcyksIF9zdGVwNjsgIShfc3RlcDYgPSBfaXRlcmF0b3I2KCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBsb29rdXBJbmRleCA9IF9zdGVwNi52YWx1ZTtcblxuICAgICAgICBpZiAoZXhjbHVkZSAmJiBleGNsdWRlLmluZGV4T2YobG9va3VwSW5kZXgpICE9PSAtMSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9va3Vwcy5wdXNoKHtcbiAgICAgICAgICBmZWF0dXJlOiB0YWcsXG4gICAgICAgICAgaW5kZXg6IGxvb2t1cEluZGV4LFxuICAgICAgICAgIGxvb2t1cDogdGhpcy50YWJsZS5sb29rdXBMaXN0LmdldChsb29rdXBJbmRleClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9va3Vwcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgfSk7XG4gICAgcmV0dXJuIGxvb2t1cHM7XG4gIH07XG5cbiAgX3Byb3RvLnN1YnN0aXR1dGVGZWF0dXJlRm9yVmFyaWF0aW9ucyA9IGZ1bmN0aW9uIHN1YnN0aXR1dGVGZWF0dXJlRm9yVmFyaWF0aW9ucyhmZWF0dXJlSW5kZXgpIHtcbiAgICBpZiAodGhpcy52YXJpYXRpb25zSW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdGhpcy50YWJsZS5mZWF0dXJlVmFyaWF0aW9ucy5mZWF0dXJlVmFyaWF0aW9uUmVjb3Jkc1t0aGlzLnZhcmlhdGlvbnNJbmRleF07XG4gICAgdmFyIHN1YnN0aXR1dGlvbnMgPSByZWNvcmQuZmVhdHVyZVRhYmxlU3Vic3RpdHV0aW9uLnN1YnN0aXR1dGlvbnM7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3I3ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKHN1YnN0aXR1dGlvbnMpLCBfc3RlcDc7ICEoX3N0ZXA3ID0gX2l0ZXJhdG9yNygpKS5kb25lOykge1xuICAgICAgdmFyIHN1YnN0aXR1dGlvbiA9IF9zdGVwNy52YWx1ZTtcblxuICAgICAgaWYgKHN1YnN0aXR1dGlvbi5mZWF0dXJlSW5kZXggPT09IGZlYXR1cmVJbmRleCkge1xuICAgICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLmFsdGVybmF0ZUZlYXR1cmVUYWJsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBfcHJvdG8uZmluZFZhcmlhdGlvbnNJbmRleCA9IGZ1bmN0aW9uIGZpbmRWYXJpYXRpb25zSW5kZXgoY29vcmRzKSB7XG4gICAgdmFyIHZhcmlhdGlvbnMgPSB0aGlzLnRhYmxlLmZlYXR1cmVWYXJpYXRpb25zO1xuXG4gICAgaWYgKCF2YXJpYXRpb25zKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZHMgPSB2YXJpYXRpb25zLmZlYXR1cmVWYXJpYXRpb25SZWNvcmRzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY29uZGl0aW9ucyA9IHJlY29yZHNbaV0uY29uZGl0aW9uU2V0LmNvbmRpdGlvblRhYmxlO1xuXG4gICAgICBpZiAodGhpcy52YXJpYXRpb25Db25kaXRpb25zTWF0Y2goY29uZGl0aW9ucywgY29vcmRzKSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH07XG5cbiAgX3Byb3RvLnZhcmlhdGlvbkNvbmRpdGlvbnNNYXRjaCA9IGZ1bmN0aW9uIHZhcmlhdGlvbkNvbmRpdGlvbnNNYXRjaChjb25kaXRpb25zLCBjb29yZHMpIHtcbiAgICByZXR1cm4gY29uZGl0aW9ucy5ldmVyeShmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgICB2YXIgY29vcmQgPSBjb25kaXRpb24uYXhpc0luZGV4IDwgY29vcmRzLmxlbmd0aCA/IGNvb3Jkc1tjb25kaXRpb24uYXhpc0luZGV4XSA6IDA7XG4gICAgICByZXR1cm4gY29uZGl0aW9uLmZpbHRlclJhbmdlTWluVmFsdWUgPD0gY29vcmQgJiYgY29vcmQgPD0gY29uZGl0aW9uLmZpbHRlclJhbmdlTWF4VmFsdWU7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLmFwcGx5RmVhdHVyZXMgPSBmdW5jdGlvbiBhcHBseUZlYXR1cmVzKHVzZXJGZWF0dXJlcywgZ2x5cGhzLCBhZHZhbmNlcykge1xuICAgIHZhciBsb29rdXBzID0gdGhpcy5sb29rdXBzRm9yRmVhdHVyZXModXNlckZlYXR1cmVzKTtcbiAgICB0aGlzLmFwcGx5TG9va3Vwcyhsb29rdXBzLCBnbHlwaHMsIGFkdmFuY2VzKTtcbiAgfTtcblxuICBfcHJvdG8uYXBwbHlMb29rdXBzID0gZnVuY3Rpb24gYXBwbHlMb29rdXBzKGxvb2t1cHMsIGdseXBocywgcG9zaXRpb25zKSB7XG4gICAgdGhpcy5nbHlwaHMgPSBnbHlwaHM7XG4gICAgdGhpcy5wb3NpdGlvbnMgPSBwb3NpdGlvbnM7XG4gICAgdGhpcy5nbHlwaEl0ZXJhdG9yID0gbmV3IEdseXBoSXRlcmF0b3IoZ2x5cGhzKTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjggPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQobG9va3VwcyksIF9zdGVwODsgIShfc3RlcDggPSBfaXRlcmF0b3I4KCkpLmRvbmU7KSB7XG4gICAgICB2YXIgX3N0ZXA4JHZhbHVlID0gX3N0ZXA4LnZhbHVlLFxuICAgICAgICAgIGZlYXR1cmUgPSBfc3RlcDgkdmFsdWUuZmVhdHVyZSxcbiAgICAgICAgICBsb29rdXAgPSBfc3RlcDgkdmFsdWUubG9va3VwO1xuICAgICAgdGhpcy5jdXJyZW50RmVhdHVyZSA9IGZlYXR1cmU7XG4gICAgICB0aGlzLmdseXBoSXRlcmF0b3IucmVzZXQobG9va3VwLmZsYWdzKTtcblxuICAgICAgd2hpbGUgKHRoaXMuZ2x5cGhJdGVyYXRvci5pbmRleCA8IGdseXBocy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCEoZmVhdHVyZSBpbiB0aGlzLmdseXBoSXRlcmF0b3IuY3VyLmZlYXR1cmVzKSkge1xuICAgICAgICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I5ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKGxvb2t1cC5zdWJUYWJsZXMpLCBfc3RlcDk7ICEoX3N0ZXA5ID0gX2l0ZXJhdG9yOSgpKS5kb25lOykge1xuICAgICAgICAgIHZhciB0YWJsZSA9IF9zdGVwOS52YWx1ZTtcbiAgICAgICAgICB2YXIgcmVzID0gdGhpcy5hcHBseUxvb2t1cChsb29rdXAubG9va3VwVHlwZSwgdGFibGUpO1xuXG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbHlwaEl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmFwcGx5TG9va3VwID0gZnVuY3Rpb24gYXBwbHlMb29rdXAobG9va3VwLCB0YWJsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImFwcGx5TG9va3VwIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlc1wiKTtcbiAgfTtcblxuICBfcHJvdG8uYXBwbHlMb29rdXBMaXN0ID0gZnVuY3Rpb24gYXBwbHlMb29rdXBMaXN0KGxvb2t1cFJlY29yZHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuZ2x5cGhJdGVyYXRvci5vcHRpb25zO1xuICAgIHZhciBnbHlwaEluZGV4ID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4O1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMTAgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQobG9va3VwUmVjb3JkcyksIF9zdGVwMTA7ICEoX3N0ZXAxMCA9IF9pdGVyYXRvcjEwKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgbG9va3VwUmVjb3JkID0gX3N0ZXAxMC52YWx1ZTtcbiAgICAgIC8vIFJlc2V0IGZsYWdzIGFuZCBmaW5kIGdseXBoIGluZGV4IGZvciB0aGlzIGxvb2t1cCByZWNvcmRcbiAgICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5yZXNldChvcHRpb25zLCBnbHlwaEluZGV4KTtcbiAgICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5pbmNyZW1lbnQobG9va3VwUmVjb3JkLnNlcXVlbmNlSW5kZXgpOyAvLyBHZXQgdGhlIGxvb2t1cCBhbmQgc2V0dXAgZmxhZ3MgZm9yIHN1YnRhYmxlc1xuXG4gICAgICB2YXIgbG9va3VwID0gdGhpcy50YWJsZS5sb29rdXBMaXN0LmdldChsb29rdXBSZWNvcmQubG9va3VwTGlzdEluZGV4KTtcbiAgICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5yZXNldChsb29rdXAuZmxhZ3MsIHRoaXMuZ2x5cGhJdGVyYXRvci5pbmRleCk7IC8vIEFwcGx5IGxvb2t1cCBzdWJ0YWJsZXMgdW50aWwgb25lIG1hdGNoZXNcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTEgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQobG9va3VwLnN1YlRhYmxlcyksIF9zdGVwMTE7ICEoX3N0ZXAxMSA9IF9pdGVyYXRvcjExKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciB0YWJsZSA9IF9zdGVwMTEudmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMuYXBwbHlMb29rdXAobG9va3VwLmxvb2t1cFR5cGUsIHRhYmxlKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5nbHlwaEl0ZXJhdG9yLnJlc2V0KG9wdGlvbnMsIGdseXBoSW5kZXgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIF9wcm90by5jb3ZlcmFnZUluZGV4ID0gZnVuY3Rpb24gY292ZXJhZ2VJbmRleChjb3ZlcmFnZSwgZ2x5cGgpIHtcbiAgICBpZiAoZ2x5cGggPT0gbnVsbCkge1xuICAgICAgZ2x5cGggPSB0aGlzLmdseXBoSXRlcmF0b3IuY3VyLmlkO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY292ZXJhZ2UudmVyc2lvbikge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gY292ZXJhZ2UuZ2x5cGhzLmluZGV4T2YoZ2x5cGgpO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjEyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKGNvdmVyYWdlLnJhbmdlUmVjb3JkcyksIF9zdGVwMTI7ICEoX3N0ZXAxMiA9IF9pdGVyYXRvcjEyKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIHJhbmdlID0gX3N0ZXAxMi52YWx1ZTtcblxuICAgICAgICAgIGlmIChyYW5nZS5zdGFydCA8PSBnbHlwaCAmJiBnbHlwaCA8PSByYW5nZS5lbmQpIHtcbiAgICAgICAgICAgIHJldHVybiByYW5nZS5zdGFydENvdmVyYWdlSW5kZXggKyBnbHlwaCAtIHJhbmdlLnN0YXJ0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfTtcblxuICBfcHJvdG8ubWF0Y2ggPSBmdW5jdGlvbiBtYXRjaChzZXF1ZW5jZUluZGV4LCBzZXF1ZW5jZSwgZm4sIG1hdGNoZWQpIHtcbiAgICB2YXIgcG9zID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4O1xuICAgIHZhciBnbHlwaCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5pbmNyZW1lbnQoc2VxdWVuY2VJbmRleCk7XG4gICAgdmFyIGlkeCA9IDA7XG5cbiAgICB3aGlsZSAoaWR4IDwgc2VxdWVuY2UubGVuZ3RoICYmIGdseXBoICYmIGZuKHNlcXVlbmNlW2lkeF0sIGdseXBoKSkge1xuICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgbWF0Y2hlZC5wdXNoKHRoaXMuZ2x5cGhJdGVyYXRvci5pbmRleCk7XG4gICAgICB9XG5cbiAgICAgIGlkeCsrO1xuICAgICAgZ2x5cGggPSB0aGlzLmdseXBoSXRlcmF0b3IubmV4dCgpO1xuICAgIH1cblxuICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5pbmRleCA9IHBvcztcblxuICAgIGlmIChpZHggPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hlZCB8fCB0cnVlO1xuICB9O1xuXG4gIF9wcm90by5zZXF1ZW5jZU1hdGNoZXMgPSBmdW5jdGlvbiBzZXF1ZW5jZU1hdGNoZXMoc2VxdWVuY2VJbmRleCwgc2VxdWVuY2UpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaChzZXF1ZW5jZUluZGV4LCBzZXF1ZW5jZSwgZnVuY3Rpb24gKGNvbXBvbmVudCwgZ2x5cGgpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnQgPT09IGdseXBoLmlkO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5zZXF1ZW5jZU1hdGNoSW5kaWNlcyA9IGZ1bmN0aW9uIHNlcXVlbmNlTWF0Y2hJbmRpY2VzKHNlcXVlbmNlSW5kZXgsIHNlcXVlbmNlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiB0aGlzLm1hdGNoKHNlcXVlbmNlSW5kZXgsIHNlcXVlbmNlLCBmdW5jdGlvbiAoY29tcG9uZW50LCBnbHlwaCkge1xuICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZmVhdHVyZSBkb2Vzbid0IGFwcGx5IHRvIHRoaXMgZ2x5cGgsXG4gICAgICBpZiAoIShfdGhpcy5jdXJyZW50RmVhdHVyZSBpbiBnbHlwaC5mZWF0dXJlcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcG9uZW50ID09PSBnbHlwaC5pZDtcbiAgICB9LCBbXSk7XG4gIH07XG5cbiAgX3Byb3RvLmNvdmVyYWdlU2VxdWVuY2VNYXRjaGVzID0gZnVuY3Rpb24gY292ZXJhZ2VTZXF1ZW5jZU1hdGNoZXMoc2VxdWVuY2VJbmRleCwgc2VxdWVuY2UpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHJldHVybiB0aGlzLm1hdGNoKHNlcXVlbmNlSW5kZXgsIHNlcXVlbmNlLCBmdW5jdGlvbiAoY292ZXJhZ2UsIGdseXBoKSB7XG4gICAgICByZXR1cm4gX3RoaXMyLmNvdmVyYWdlSW5kZXgoY292ZXJhZ2UsIGdseXBoLmlkKSA+PSAwO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5nZXRDbGFzc0lEID0gZnVuY3Rpb24gZ2V0Q2xhc3NJRChnbHlwaCwgY2xhc3NEZWYpIHtcbiAgICBzd2l0Y2ggKGNsYXNzRGVmLnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgLy8gQ2xhc3MgYXJyYXlcbiAgICAgICAgdmFyIGkgPSBnbHlwaCAtIGNsYXNzRGVmLnN0YXJ0R2x5cGg7XG5cbiAgICAgICAgaWYgKGkgPj0gMCAmJiBpIDwgY2xhc3NEZWYuY2xhc3NWYWx1ZUFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBjbGFzc0RlZi5jbGFzc1ZhbHVlQXJyYXlbaV07XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IxMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChjbGFzc0RlZi5jbGFzc1JhbmdlUmVjb3JkKSwgX3N0ZXAxMzsgIShfc3RlcDEzID0gX2l0ZXJhdG9yMTMoKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgcmFuZ2UgPSBfc3RlcDEzLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0IDw9IGdseXBoICYmIGdseXBoIDw9IHJhbmdlLmVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJhbmdlW1wiY2xhc3NcIl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH07XG5cbiAgX3Byb3RvLmNsYXNzU2VxdWVuY2VNYXRjaGVzID0gZnVuY3Rpb24gY2xhc3NTZXF1ZW5jZU1hdGNoZXMoc2VxdWVuY2VJbmRleCwgc2VxdWVuY2UsIGNsYXNzRGVmKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICByZXR1cm4gdGhpcy5tYXRjaChzZXF1ZW5jZUluZGV4LCBzZXF1ZW5jZSwgZnVuY3Rpb24gKGNsYXNzSUQsIGdseXBoKSB7XG4gICAgICByZXR1cm4gY2xhc3NJRCA9PT0gX3RoaXMzLmdldENsYXNzSUQoZ2x5cGguaWQsIGNsYXNzRGVmKTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uYXBwbHlDb250ZXh0ID0gZnVuY3Rpb24gYXBwbHlDb250ZXh0KHRhYmxlKSB7XG4gICAgc3dpdGNoICh0YWJsZS52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSk7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZXQgPSB0YWJsZS5ydWxlU2V0c1tpbmRleF07XG5cbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQoc2V0KSwgX3N0ZXAxNDsgIShfc3RlcDE0ID0gX2l0ZXJhdG9yMTQoKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgcnVsZSA9IF9zdGVwMTQudmFsdWU7XG5cbiAgICAgICAgICBpZiAodGhpcy5zZXF1ZW5jZU1hdGNoZXMoMSwgcnVsZS5pbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5TG9va3VwTGlzdChydWxlLmxvb2t1cFJlY29yZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIGlmICh0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UpID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gdGhpcy5nZXRDbGFzc0lEKHRoaXMuZ2x5cGhJdGVyYXRvci5jdXIuaWQsIHRhYmxlLmNsYXNzRGVmKTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0ID0gdGFibGUuY2xhc3NTZXRbaW5kZXhdO1xuXG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjE1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKHNldCksIF9zdGVwMTU7ICEoX3N0ZXAxNSA9IF9pdGVyYXRvcjE1KCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIF9ydWxlID0gX3N0ZXAxNS52YWx1ZTtcblxuICAgICAgICAgIGlmICh0aGlzLmNsYXNzU2VxdWVuY2VNYXRjaGVzKDEsIF9ydWxlLmNsYXNzZXMsIHRhYmxlLmNsYXNzRGVmKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMb29rdXBMaXN0KF9ydWxlLmxvb2t1cFJlY29yZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICAgIGlmICh0aGlzLmNvdmVyYWdlU2VxdWVuY2VNYXRjaGVzKDAsIHRhYmxlLmNvdmVyYWdlcykpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxvb2t1cExpc3QodGFibGUubG9va3VwUmVjb3Jkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgX3Byb3RvLmFwcGx5Q2hhaW5pbmdDb250ZXh0ID0gZnVuY3Rpb24gYXBwbHlDaGFpbmluZ0NvbnRleHQodGFibGUpIHtcbiAgICBzd2l0Y2ggKHRhYmxlLnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlKTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNldCA9IHRhYmxlLmNoYWluUnVsZVNldHNbaW5kZXhdO1xuXG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjE2ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKHNldCksIF9zdGVwMTY7ICEoX3N0ZXAxNiA9IF9pdGVyYXRvcjE2KCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIHJ1bGUgPSBfc3RlcDE2LnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc2VxdWVuY2VNYXRjaGVzKC1ydWxlLmJhY2t0cmFjay5sZW5ndGgsIHJ1bGUuYmFja3RyYWNrKSAmJiB0aGlzLnNlcXVlbmNlTWF0Y2hlcygxLCBydWxlLmlucHV0KSAmJiB0aGlzLnNlcXVlbmNlTWF0Y2hlcygxICsgcnVsZS5pbnB1dC5sZW5ndGgsIHJ1bGUubG9va2FoZWFkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMb29rdXBMaXN0KHJ1bGUubG9va3VwUmVjb3Jkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaWYgKHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSkgPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSB0aGlzLmdldENsYXNzSUQodGhpcy5nbHlwaEl0ZXJhdG9yLmN1ci5pZCwgdGFibGUuaW5wdXRDbGFzc0RlZik7XG4gICAgICAgIHZhciBydWxlcyA9IHRhYmxlLmNoYWluQ2xhc3NTZXRbaW5kZXhdO1xuXG4gICAgICAgIGlmICghcnVsZXMpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IxNyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChydWxlcyksIF9zdGVwMTc7ICEoX3N0ZXAxNyA9IF9pdGVyYXRvcjE3KCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIF9ydWxlMiA9IF9zdGVwMTcudmFsdWU7XG5cbiAgICAgICAgICBpZiAodGhpcy5jbGFzc1NlcXVlbmNlTWF0Y2hlcygtX3J1bGUyLmJhY2t0cmFjay5sZW5ndGgsIF9ydWxlMi5iYWNrdHJhY2ssIHRhYmxlLmJhY2t0cmFja0NsYXNzRGVmKSAmJiB0aGlzLmNsYXNzU2VxdWVuY2VNYXRjaGVzKDEsIF9ydWxlMi5pbnB1dCwgdGFibGUuaW5wdXRDbGFzc0RlZikgJiYgdGhpcy5jbGFzc1NlcXVlbmNlTWF0Y2hlcygxICsgX3J1bGUyLmlucHV0Lmxlbmd0aCwgX3J1bGUyLmxvb2thaGVhZCwgdGFibGUubG9va2FoZWFkQ2xhc3NEZWYpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxvb2t1cExpc3QoX3J1bGUyLmxvb2t1cFJlY29yZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICAgIGlmICh0aGlzLmNvdmVyYWdlU2VxdWVuY2VNYXRjaGVzKC10YWJsZS5iYWNrdHJhY2tHbHlwaENvdW50LCB0YWJsZS5iYWNrdHJhY2tDb3ZlcmFnZSkgJiYgdGhpcy5jb3ZlcmFnZVNlcXVlbmNlTWF0Y2hlcygwLCB0YWJsZS5pbnB1dENvdmVyYWdlKSAmJiB0aGlzLmNvdmVyYWdlU2VxdWVuY2VNYXRjaGVzKHRhYmxlLmlucHV0R2x5cGhDb3VudCwgdGFibGUubG9va2FoZWFkQ292ZXJhZ2UpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMb29rdXBMaXN0KHRhYmxlLmxvb2t1cFJlY29yZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHJldHVybiBPVFByb2Nlc3Nvcjtcbn0oKTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkNCh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQ0KENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNChDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDQoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciBHbHlwaEluZm8gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHbHlwaEluZm8oZm9udCwgaWQsIGNvZGVQb2ludHMsIGZlYXR1cmVzKSB7XG4gICAgaWYgKGNvZGVQb2ludHMgPT09IHZvaWQgMCkge1xuICAgICAgY29kZVBvaW50cyA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMuX2ZvbnQgPSBmb250O1xuICAgIHRoaXMuY29kZVBvaW50cyA9IGNvZGVQb2ludHM7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuZmVhdHVyZXMgPSB7fTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGZlYXR1cmVzKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldO1xuICAgICAgICB0aGlzLmZlYXR1cmVzW2ZlYXR1cmVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmZWF0dXJlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5mZWF0dXJlcywgZmVhdHVyZXMpO1xuICAgIH1cblxuICAgIHRoaXMubGlnYXR1cmVJRCA9IG51bGw7XG4gICAgdGhpcy5saWdhdHVyZUNvbXBvbmVudCA9IG51bGw7XG4gICAgdGhpcy5pc0xpZ2F0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmN1cnNpdmVBdHRhY2htZW50ID0gbnVsbDtcbiAgICB0aGlzLm1hcmtBdHRhY2htZW50ID0gbnVsbDtcbiAgICB0aGlzLnNoYXBlckluZm8gPSBudWxsO1xuICAgIHRoaXMuc3Vic3RpdHV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzTXVsdGlwbGllZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEdseXBoSW5mby5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmNvcHkgPSBmdW5jdGlvbiBjb3B5KCkge1xuICAgIHJldHVybiBuZXcgR2x5cGhJbmZvKHRoaXMuX2ZvbnQsIHRoaXMuaWQsIHRoaXMuY29kZVBvaW50cywgdGhpcy5mZWF0dXJlcyk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzJDQoR2x5cGhJbmZvLCBbe1xuICAgIGtleTogXCJpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoaWQpIHtcbiAgICAgIHRoaXMuX2lkID0gaWQ7XG4gICAgICB0aGlzLnN1YnN0aXR1dGVkID0gdHJ1ZTtcbiAgICAgIHZhciBHREVGID0gdGhpcy5fZm9udC5HREVGO1xuXG4gICAgICBpZiAoR0RFRiAmJiBHREVGLmdseXBoQ2xhc3NEZWYpIHtcbiAgICAgICAgLy8gVE9ETzogY2xlYW4gdGhpcyB1cFxuICAgICAgICB2YXIgY2xhc3NJRCA9IE9UUHJvY2Vzc29yLnByb3RvdHlwZS5nZXRDbGFzc0lEKGlkLCBHREVGLmdseXBoQ2xhc3NEZWYpO1xuICAgICAgICB0aGlzLmlzQmFzZSA9IGNsYXNzSUQgPT09IDE7XG4gICAgICAgIHRoaXMuaXNMaWdhdHVyZSA9IGNsYXNzSUQgPT09IDI7XG4gICAgICAgIHRoaXMuaXNNYXJrID0gY2xhc3NJRCA9PT0gMztcbiAgICAgICAgdGhpcy5tYXJrQXR0YWNobWVudFR5cGUgPSBHREVGLm1hcmtBdHRhY2hDbGFzc0RlZiA/IE9UUHJvY2Vzc29yLnByb3RvdHlwZS5nZXRDbGFzc0lEKGlkLCBHREVGLm1hcmtBdHRhY2hDbGFzc0RlZikgOiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc01hcmsgPSB0aGlzLmNvZGVQb2ludHMubGVuZ3RoID4gMCAmJiB0aGlzLmNvZGVQb2ludHMuZXZlcnkodW5pY29kZS5pc01hcmspO1xuICAgICAgICB0aGlzLmlzQmFzZSA9ICF0aGlzLmlzTWFyaztcbiAgICAgICAgdGhpcy5pc0xpZ2F0dXJlID0gdGhpcy5jb2RlUG9pbnRzLmxlbmd0aCA+IDE7XG4gICAgICAgIHRoaXMubWFya0F0dGFjaG1lbnRUeXBlID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gR2x5cGhJbmZvO1xufSgpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSQ0KHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkkMShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG4vKipcbiAqIFRoaXMgaXMgYSBzaGFwZXIgZm9yIHRoZSBIYW5ndWwgc2NyaXB0LCB1c2VkIGJ5IHRoZSBLb3JlYW4gbGFuZ3VhZ2UuXG4gKiBJdCBkb2VzIHRoZSBmb2xsb3dpbmc6XG4gKiAgIC0gZGVjb21wb3NlIGlmIHVuc3VwcG9ydGVkIGJ5IHRoZSBmb250OlxuICogICAgIDxMVj4gICAtPiA8TCxWPlxuICogICAgIDxMVlQ+ICAtPiA8TCxWLFQ+XG4gKiAgICAgPExWLFQ+IC0+IDxMLFYsVD5cbiAqXG4gKiAgIC0gY29tcG9zZSBpZiBzdXBwb3J0ZWQgYnkgdGhlIGZvbnQ6XG4gKiAgICAgPEwsVj4gICAtPiA8TFY+XG4gKiAgICAgPEwsVixUPiAtPiA8TFZUPlxuICogICAgIDxMVixUPiAgLT4gPExWVD5cbiAqXG4gKiAgIC0gcmVvcmRlciB0b25lIG1hcmtzIChTIGlzIGFueSB2YWxpZCBzeWxsYWJsZSk6XG4gKiAgICAgPFMsIE0+IC0+IDxNLCBTPlxuICpcbiAqICAgLSBhcHBseSBsam1vLCB2am1vLCBhbmQgdGptbyBPcGVuVHlwZSBmZWF0dXJlcyB0byBkZWNvbXBvc2VkIEphbW8gc2VxdWVuY2VzLlxuICpcbiAqIFRoaXMgbG9naWMgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBkb2N1bWVudHM6XG4gKiAgIC0gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvT3BlblR5cGVEZXYvaGFuZ3VsL2ludHJvLmh0bVxuICogICAtIGh0dHA6Ly9rdHVnLm9yZy9+bm9tb3MvaGFyZmJ1enotaGFuZ3VsL2hhbmd1bHNoYXBlci5wZGZcbiAqL1xuXG52YXIgSGFuZ3VsU2hhcGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRGVmYXVsdFNoYXBlcikge1xuICBfaW5oZXJpdHNMb29zZSQ0KEhhbmd1bFNoYXBlciwgX0RlZmF1bHRTaGFwZXIpO1xuXG4gIGZ1bmN0aW9uIEhhbmd1bFNoYXBlcigpIHtcbiAgICByZXR1cm4gX0RlZmF1bHRTaGFwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgSGFuZ3VsU2hhcGVyLnBsYW5GZWF0dXJlcyA9IGZ1bmN0aW9uIHBsYW5GZWF0dXJlcyhwbGFuKSB7XG4gICAgcGxhbi5hZGQoWydsam1vJywgJ3ZqbW8nLCAndGptbyddLCBmYWxzZSk7XG4gIH07XG5cbiAgSGFuZ3VsU2hhcGVyLmFzc2lnbkZlYXR1cmVzID0gZnVuY3Rpb24gYXNzaWduRmVhdHVyZXMocGxhbiwgZ2x5cGhzKSB7XG4gICAgdmFyIHN0YXRlID0gMDtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGdseXBocy5sZW5ndGgpIHtcbiAgICAgIHZhciBhY3Rpb24gPSB2b2lkIDA7XG4gICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICB2YXIgY29kZSA9IGdseXBoLmNvZGVQb2ludHNbMF07XG4gICAgICB2YXIgdHlwZSA9IGdldFR5cGUoY29kZSk7XG4gICAgICB2YXIgX1NUQVRFX1RBQkxFJHN0YXRlJHR5ID0gU1RBVEVfVEFCTEUkMVtzdGF0ZV1bdHlwZV07XG4gICAgICBhY3Rpb24gPSBfU1RBVEVfVEFCTEUkc3RhdGUkdHlbMF07XG4gICAgICBzdGF0ZSA9IF9TVEFURV9UQUJMRSRzdGF0ZSR0eVsxXTtcblxuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgY2FzZSBERUNPTVBPU0U6XG4gICAgICAgICAgLy8gRGVjb21wb3NlIHRoZSBjb21wb3NlZCBzeWxsYWJsZSBpZiBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBmb250LlxuICAgICAgICAgIGlmICghcGxhbi5mb250Lmhhc0dseXBoRm9yQ29kZVBvaW50KGNvZGUpKSB7XG4gICAgICAgICAgICBpID0gZGVjb21wb3NlKGdseXBocywgaSwgcGxhbi5mb250KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIENPTVBPU0U6XG4gICAgICAgICAgLy8gRm91bmQgYSBkZWNvbXBvc2VkIHN5bGxhYmxlLiBUcnkgdG8gY29tcG9zZSBpZiBzdXBwb3J0ZWQgYnkgdGhlIGZvbnQuXG4gICAgICAgICAgaSA9IGNvbXBvc2UoZ2x5cGhzLCBpLCBwbGFuLmZvbnQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgVE9ORV9NQVJLOlxuICAgICAgICAgIC8vIEdvdCBhIHZhbGlkIHN5bGxhYmxlLCBmb2xsb3dlZCBieSBhIHRvbmUgbWFyay4gTW92ZSB0aGUgdG9uZSBtYXJrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN5bGxhYmxlLlxuICAgICAgICAgIHJlb3JkZXJUb25lTWFyayhnbHlwaHMsIGksIHBsYW4uZm9udCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBJTlZBTElEOlxuICAgICAgICAgIC8vIFRvbmUgbWFyayBoYXMgbm8gdmFsaWQgc3lsbGFibGUgdG8gYXR0YWNoIHRvLCBzbyBpbnNlcnQgYSBkb3R0ZWQgY2lyY2xlXG4gICAgICAgICAgaSA9IGluc2VydERvdHRlZENpcmNsZShnbHlwaHMsIGksIHBsYW4uZm9udCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGkrKztcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEhhbmd1bFNoYXBlcjtcbn0oRGVmYXVsdFNoYXBlcik7XG5cbl9kZWZpbmVQcm9wZXJ0eSQxKEhhbmd1bFNoYXBlciwgXCJ6ZXJvTWFya1dpZHRoc1wiLCAnTk9ORScpO1xudmFyIEhBTkdVTF9CQVNFID0gMHhhYzAwO1xudmFyIEhBTkdVTF9FTkQgPSAweGQ3YTQ7XG52YXIgSEFOR1VMX0NPVU5UID0gSEFOR1VMX0VORCAtIEhBTkdVTF9CQVNFICsgMTtcbnZhciBMX0JBU0UgPSAweDExMDA7IC8vIGxlYWRcblxudmFyIFZfQkFTRSA9IDB4MTE2MTsgLy8gdm93ZWxcblxudmFyIFRfQkFTRSA9IDB4MTFhNzsgLy8gdHJhaWxcblxudmFyIExfQ09VTlQgPSAxOTtcbnZhciBWX0NPVU5UID0gMjE7XG52YXIgVF9DT1VOVCA9IDI4O1xudmFyIExfRU5EID0gTF9CQVNFICsgTF9DT1VOVCAtIDE7XG52YXIgVl9FTkQgPSBWX0JBU0UgKyBWX0NPVU5UIC0gMTtcbnZhciBUX0VORCA9IFRfQkFTRSArIFRfQ09VTlQgLSAxO1xudmFyIERPVFRFRF9DSVJDTEUgPSAweDI1Y2M7XG5cbnZhciBpc0wgPSBmdW5jdGlvbiBpc0woY29kZSkge1xuICByZXR1cm4gMHgxMTAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDExNWYgfHwgMHhhOTYwIDw9IGNvZGUgJiYgY29kZSA8PSAweGE5N2M7XG59O1xuXG52YXIgaXNWID0gZnVuY3Rpb24gaXNWKGNvZGUpIHtcbiAgcmV0dXJuIDB4MTE2MCA8PSBjb2RlICYmIGNvZGUgPD0gMHgxMWE3IHx8IDB4ZDdiMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhkN2M2O1xufTtcblxudmFyIGlzVCA9IGZ1bmN0aW9uIGlzVChjb2RlKSB7XG4gIHJldHVybiAweDExYTggPD0gY29kZSAmJiBjb2RlIDw9IDB4MTFmZiB8fCAweGQ3Y2IgPD0gY29kZSAmJiBjb2RlIDw9IDB4ZDdmYjtcbn07XG5cbnZhciBpc1RvbmUgPSBmdW5jdGlvbiBpc1RvbmUoY29kZSkge1xuICByZXR1cm4gMHgzMDJlIDw9IGNvZGUgJiYgY29kZSA8PSAweDMwMmY7XG59O1xuXG52YXIgaXNMVlQgPSBmdW5jdGlvbiBpc0xWVChjb2RlKSB7XG4gIHJldHVybiBIQU5HVUxfQkFTRSA8PSBjb2RlICYmIGNvZGUgPD0gSEFOR1VMX0VORDtcbn07XG5cbnZhciBpc0xWID0gZnVuY3Rpb24gaXNMVihjb2RlKSB7XG4gIHJldHVybiBjb2RlIC0gSEFOR1VMX0JBU0UgPCBIQU5HVUxfQ09VTlQgJiYgKGNvZGUgLSBIQU5HVUxfQkFTRSkgJSBUX0NPVU5UID09PSAwO1xufTtcblxudmFyIGlzQ29tYmluaW5nTCA9IGZ1bmN0aW9uIGlzQ29tYmluaW5nTChjb2RlKSB7XG4gIHJldHVybiBMX0JBU0UgPD0gY29kZSAmJiBjb2RlIDw9IExfRU5EO1xufTtcblxudmFyIGlzQ29tYmluaW5nViA9IGZ1bmN0aW9uIGlzQ29tYmluaW5nVihjb2RlKSB7XG4gIHJldHVybiBWX0JBU0UgPD0gY29kZSAmJiBjb2RlIDw9IFZfRU5EO1xufTtcblxudmFyIGlzQ29tYmluaW5nVCA9IGZ1bmN0aW9uIGlzQ29tYmluaW5nVChjb2RlKSB7XG4gIHJldHVybiAgMSA8PSBjb2RlICYmIGNvZGUgPD0gVF9FTkQ7XG59OyAvLyBDaGFyYWN0ZXIgY2F0ZWdvcmllc1xuXG5cbnZhciBYID0gMDsgLy8gT3RoZXIgY2hhcmFjdGVyXG5cbnZhciBMID0gMTsgLy8gTGVhZGluZyBjb25zb25hbnRcblxudmFyIFYgPSAyOyAvLyBNZWRpYWwgdm93ZWxcblxudmFyIFQgPSAzOyAvLyBUcmFpbGluZyBjb25zb25hbnRcblxudmFyIExWID0gNDsgLy8gQ29tcG9zZWQgPExWPiBzeWxsYWJsZVxuXG52YXIgTFZUID0gNTsgLy8gQ29tcG9zZWQgPExWVD4gc3lsbGFibGVcblxudmFyIE0gPSA2OyAvLyBUb25lIG1hcmtcbi8vIFRoaXMgZnVuY3Rpb24gY2xhc3NpZmllcyBhIGNoYXJhY3RlciB1c2luZyB0aGUgYWJvdmUgY2F0ZWdvcmllcy5cblxuZnVuY3Rpb24gZ2V0VHlwZShjb2RlKSB7XG4gIGlmIChpc0woY29kZSkpIHtcbiAgICByZXR1cm4gTDtcbiAgfVxuXG4gIGlmIChpc1YoY29kZSkpIHtcbiAgICByZXR1cm4gVjtcbiAgfVxuXG4gIGlmIChpc1QoY29kZSkpIHtcbiAgICByZXR1cm4gVDtcbiAgfVxuXG4gIGlmIChpc0xWKGNvZGUpKSB7XG4gICAgcmV0dXJuIExWO1xuICB9XG5cbiAgaWYgKGlzTFZUKGNvZGUpKSB7XG4gICAgcmV0dXJuIExWVDtcbiAgfVxuXG4gIGlmIChpc1RvbmUoY29kZSkpIHtcbiAgICByZXR1cm4gTTtcbiAgfVxuXG4gIHJldHVybiBYO1xufSAvLyBTdGF0ZSBtYWNoaW5lIGFjdGlvbnNcblxuXG52YXIgTk9fQUNUSU9OID0gMDtcbnZhciBERUNPTVBPU0UgPSAxO1xudmFyIENPTVBPU0UgPSAyO1xudmFyIFRPTkVfTUFSSyA9IDQ7XG52YXIgSU5WQUxJRCA9IDU7IC8vIEJ1aWxkIGEgc3RhdGUgbWFjaGluZSB0aGF0IGFjY2VwdHMgdmFsaWQgc3lsbGFibGVzLCBhbmQgYXBwbGllcyBhY3Rpb25zIGFsb25nIHRoZSB3YXkuXG4vLyBUaGUgbG9naWMgdGhpcyBpcyBpbXBsZW1lbnRpbmcgaXMgZG9jdW1lbnRlZCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLlxuXG52YXIgU1RBVEVfVEFCTEUkMSA9IFsvLyAgICAgICBYICAgICAgICAgICAgICAgICBMICAgICAgICAgICAgICAgICBWICAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICBMViAgICAgICAgICAgICAgICBMVlQgICAgICAgICAgICAgICBNXG4vLyBTdGF0ZSAwOiBzdGFydCBzdGF0ZVxuW1tOT19BQ1RJT04sIDBdLCBbTk9fQUNUSU9OLCAxXSwgW05PX0FDVElPTiwgMF0sIFtOT19BQ1RJT04sIDBdLCBbREVDT01QT1NFLCAyXSwgW0RFQ09NUE9TRSwgM10sIFtJTlZBTElELCAwXV0sIC8vIFN0YXRlIDE6IDxMPlxuW1tOT19BQ1RJT04sIDBdLCBbTk9fQUNUSU9OLCAxXSwgW0NPTVBPU0UsIDJdLCBbTk9fQUNUSU9OLCAwXSwgW0RFQ09NUE9TRSwgMl0sIFtERUNPTVBPU0UsIDNdLCBbSU5WQUxJRCwgMF1dLCAvLyBTdGF0ZSAyOiA8TCxWPiBvciA8TFY+XG5bW05PX0FDVElPTiwgMF0sIFtOT19BQ1RJT04sIDFdLCBbTk9fQUNUSU9OLCAwXSwgW0NPTVBPU0UsIDNdLCBbREVDT01QT1NFLCAyXSwgW0RFQ09NUE9TRSwgM10sIFtUT05FX01BUkssIDBdXSwgLy8gU3RhdGUgMzogPEwsVixUPiBvciA8TFZUPlxuW1tOT19BQ1RJT04sIDBdLCBbTk9fQUNUSU9OLCAxXSwgW05PX0FDVElPTiwgMF0sIFtOT19BQ1RJT04sIDBdLCBbREVDT01QT1NFLCAyXSwgW0RFQ09NUE9TRSwgM10sIFtUT05FX01BUkssIDBdXV07XG5cbmZ1bmN0aW9uIGdldEdseXBoKGZvbnQsIGNvZGUsIGZlYXR1cmVzKSB7XG4gIHJldHVybiBuZXcgR2x5cGhJbmZvKGZvbnQsIGZvbnQuZ2x5cGhGb3JDb2RlUG9pbnQoY29kZSkuaWQsIFtjb2RlXSwgZmVhdHVyZXMpO1xufVxuXG5mdW5jdGlvbiBkZWNvbXBvc2UoZ2x5cGhzLCBpLCBmb250KSB7XG4gIHZhciBnbHlwaCA9IGdseXBoc1tpXTtcbiAgdmFyIGNvZGUgPSBnbHlwaC5jb2RlUG9pbnRzWzBdO1xuICB2YXIgcyA9IGNvZGUgLSBIQU5HVUxfQkFTRTtcbiAgdmFyIHQgPSBUX0JBU0UgKyBzICUgVF9DT1VOVDtcbiAgcyA9IHMgLyBUX0NPVU5UIHwgMDtcbiAgdmFyIGwgPSBMX0JBU0UgKyBzIC8gVl9DT1VOVCB8IDA7XG4gIHZhciB2ID0gVl9CQVNFICsgcyAlIFZfQ09VTlQ7IC8vIERvbid0IGRlY29tcG9zZSBpZiBhbGwgb2YgdGhlIGNvbXBvbmVudHMgYXJlIG5vdCBhdmFpbGFibGVcblxuICBpZiAoIWZvbnQuaGFzR2x5cGhGb3JDb2RlUG9pbnQobCkgfHwgIWZvbnQuaGFzR2x5cGhGb3JDb2RlUG9pbnQodikgfHwgdCAhPT0gVF9CQVNFICYmICFmb250Lmhhc0dseXBoRm9yQ29kZVBvaW50KHQpKSB7XG4gICAgcmV0dXJuIGk7XG4gIH0gLy8gUmVwbGFjZSB0aGUgY3VycmVudCBnbHlwaCB3aXRoIGRlY29tcG9zZWQgTCwgViwgYW5kIFQgZ2x5cGhzLFxuICAvLyBhbmQgYXBwbHkgdGhlIHByb3BlciBPcGVuVHlwZSBmZWF0dXJlcyB0byBlYWNoIGNvbXBvbmVudC5cblxuXG4gIHZhciBsam1vID0gZ2V0R2x5cGgoZm9udCwgbCwgZ2x5cGguZmVhdHVyZXMpO1xuICBsam1vLmZlYXR1cmVzLmxqbW8gPSB0cnVlO1xuICB2YXIgdmptbyA9IGdldEdseXBoKGZvbnQsIHYsIGdseXBoLmZlYXR1cmVzKTtcbiAgdmptby5mZWF0dXJlcy52am1vID0gdHJ1ZTtcbiAgdmFyIGluc2VydCA9IFtsam1vLCB2am1vXTtcblxuICBpZiAodCA+IFRfQkFTRSkge1xuICAgIHZhciB0am1vID0gZ2V0R2x5cGgoZm9udCwgdCwgZ2x5cGguZmVhdHVyZXMpO1xuICAgIHRqbW8uZmVhdHVyZXMudGptbyA9IHRydWU7XG4gICAgaW5zZXJ0LnB1c2godGptbyk7XG4gIH1cblxuICBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW2ksIDFdLmNvbmNhdChpbnNlcnQpKTtcbiAgcmV0dXJuIGkgKyBpbnNlcnQubGVuZ3RoIC0gMTtcbn1cblxuZnVuY3Rpb24gY29tcG9zZShnbHlwaHMsIGksIGZvbnQpIHtcbiAgdmFyIGdseXBoID0gZ2x5cGhzW2ldO1xuICB2YXIgY29kZSA9IGdseXBoc1tpXS5jb2RlUG9pbnRzWzBdO1xuICB2YXIgdHlwZSA9IGdldFR5cGUoY29kZSk7XG4gIHZhciBwcmV2ID0gZ2x5cGhzW2kgLSAxXS5jb2RlUG9pbnRzWzBdO1xuICB2YXIgcHJldlR5cGUgPSBnZXRUeXBlKHByZXYpOyAvLyBGaWd1cmUgb3V0IHdoYXQgdHlwZSBvZiBzeWxsYWJsZSB3ZSdyZSBkZWFsaW5nIHdpdGhcblxuICB2YXIgbHYsIGxqbW8sIHZqbW8sIHRqbW87XG5cbiAgaWYgKHByZXZUeXBlID09PSBMViAmJiB0eXBlID09PSBUKSB7XG4gICAgLy8gPExWLFQ+XG4gICAgbHYgPSBwcmV2O1xuICAgIHRqbW8gPSBnbHlwaDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZSA9PT0gVikge1xuICAgICAgLy8gPEwsVj5cbiAgICAgIGxqbW8gPSBnbHlwaHNbaSAtIDFdO1xuICAgICAgdmptbyA9IGdseXBoO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyA8TCxWLFQ+XG4gICAgICBsam1vID0gZ2x5cGhzW2kgLSAyXTtcbiAgICAgIHZqbW8gPSBnbHlwaHNbaSAtIDFdO1xuICAgICAgdGptbyA9IGdseXBoO1xuICAgIH1cblxuICAgIHZhciBsID0gbGptby5jb2RlUG9pbnRzWzBdO1xuICAgIHZhciB2ID0gdmptby5jb2RlUG9pbnRzWzBdOyAvLyBNYWtlIHN1cmUgTCBhbmQgViBhcmUgY29tYmluaW5nIGNoYXJhY3RlcnNcblxuICAgIGlmIChpc0NvbWJpbmluZ0wobCkgJiYgaXNDb21iaW5pbmdWKHYpKSB7XG4gICAgICBsdiA9IEhBTkdVTF9CQVNFICsgKChsIC0gTF9CQVNFKSAqIFZfQ09VTlQgKyAodiAtIFZfQkFTRSkpICogVF9DT1VOVDtcbiAgICB9XG4gIH1cblxuICB2YXIgdCA9IHRqbW8gJiYgdGptby5jb2RlUG9pbnRzWzBdIHx8IFRfQkFTRTtcblxuICBpZiAobHYgIT0gbnVsbCAmJiAodCA9PT0gVF9CQVNFIHx8IGlzQ29tYmluaW5nVCh0KSkpIHtcbiAgICB2YXIgcyA9IGx2ICsgKHQgLSBUX0JBU0UpOyAvLyBSZXBsYWNlIHdpdGggYSBjb21wb3NlZCBnbHlwaCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGZvbnQsXG4gICAgLy8gb3RoZXJ3aXNlIGFwcGx5IHRoZSBwcm9wZXIgT3BlblR5cGUgZmVhdHVyZXMgdG8gZWFjaCBjb21wb25lbnQuXG5cbiAgICBpZiAoZm9udC5oYXNHbHlwaEZvckNvZGVQb2ludChzKSkge1xuICAgICAgdmFyIGRlbCA9IHByZXZUeXBlID09PSBWID8gMyA6IDI7XG4gICAgICBnbHlwaHMuc3BsaWNlKGkgLSBkZWwgKyAxLCBkZWwsIGdldEdseXBoKGZvbnQsIHMsIGdseXBoLmZlYXR1cmVzKSk7XG4gICAgICByZXR1cm4gaSAtIGRlbCArIDE7XG4gICAgfVxuICB9IC8vIERpZG4ndCBjb21wb3NlIChlaXRoZXIgYSBub24tY29tYmluaW5nIGNvbXBvbmVudCBvciB1bnN1cHBvcnRlZCBieSBmb250KS5cblxuXG4gIGlmIChsam1vKSB7XG4gICAgbGptby5mZWF0dXJlcy5sam1vID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICh2am1vKSB7XG4gICAgdmptby5mZWF0dXJlcy52am1vID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0am1vKSB7XG4gICAgdGptby5mZWF0dXJlcy50am1vID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChwcmV2VHlwZSA9PT0gTFYpIHtcbiAgICAvLyBTZXF1ZW5jZSB3YXMgb3JpZ2luYWxseSA8TCxWPiwgd2hpY2ggZ290IGNvbWJpbmVkIGVhcmxpZXIuXG4gICAgLy8gRWl0aGVyIHRoZSBUIHdhcyBub24tY29tYmluaW5nLCBvciB0aGUgTFZUIGdseXBoIHdhc24ndCBzdXBwb3J0ZWQuXG4gICAgLy8gRGVjb21wb3NlIHRoZSBnbHlwaCBhZ2FpbiBhbmQgYXBwbHkgT1QgZmVhdHVyZXMuXG4gICAgZGVjb21wb3NlKGdseXBocywgaSAtIDEsIGZvbnQpO1xuICAgIHJldHVybiBpICsgMTtcbiAgfVxuXG4gIHJldHVybiBpO1xufVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgoY29kZSkge1xuICBzd2l0Y2ggKGdldFR5cGUoY29kZSkpIHtcbiAgICBjYXNlIExWOlxuICAgIGNhc2UgTFZUOlxuICAgICAgcmV0dXJuIDE7XG5cbiAgICBjYXNlIFY6XG4gICAgICByZXR1cm4gMjtcblxuICAgIGNhc2UgVDpcbiAgICAgIHJldHVybiAzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlb3JkZXJUb25lTWFyayhnbHlwaHMsIGksIGZvbnQpIHtcbiAgdmFyIGdseXBoID0gZ2x5cGhzW2ldO1xuICB2YXIgY29kZSA9IGdseXBoc1tpXS5jb2RlUG9pbnRzWzBdOyAvLyBNb3ZlIHRvbmUgbWFyayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcmV2aW91cyBzeWxsYWJsZSwgdW5sZXNzIGl0IGlzIHplcm8gd2lkdGhcblxuICBpZiAoZm9udC5nbHlwaEZvckNvZGVQb2ludChjb2RlKS5hZHZhbmNlV2lkdGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcHJldiA9IGdseXBoc1tpIC0gMV0uY29kZVBvaW50c1swXTtcbiAgdmFyIGxlbiA9IGdldExlbmd0aChwcmV2KTtcbiAgZ2x5cGhzLnNwbGljZShpLCAxKTtcbiAgcmV0dXJuIGdseXBocy5zcGxpY2UoaSAtIGxlbiwgMCwgZ2x5cGgpO1xufVxuXG5mdW5jdGlvbiBpbnNlcnREb3R0ZWRDaXJjbGUoZ2x5cGhzLCBpLCBmb250KSB7XG4gIHZhciBnbHlwaCA9IGdseXBoc1tpXTtcbiAgdmFyIGNvZGUgPSBnbHlwaHNbaV0uY29kZVBvaW50c1swXTtcblxuICBpZiAoZm9udC5oYXNHbHlwaEZvckNvZGVQb2ludChET1RURURfQ0lSQ0xFKSkge1xuICAgIHZhciBkb3R0ZWRDaXJjbGUgPSBnZXRHbHlwaChmb250LCBET1RURURfQ0lSQ0xFLCBnbHlwaC5mZWF0dXJlcyk7IC8vIElmIHRoZSB0b25lIG1hcmsgaXMgemVybyB3aWR0aCwgaW5zZXJ0IHRoZSBkb3R0ZWQgY2lyY2xlIGJlZm9yZSwgb3RoZXJ3aXNlIGFmdGVyXG5cbiAgICB2YXIgaWR4ID0gZm9udC5nbHlwaEZvckNvZGVQb2ludChjb2RlKS5hZHZhbmNlV2lkdGggPT09IDAgPyBpIDogaSArIDE7XG4gICAgZ2x5cGhzLnNwbGljZShpZHgsIDAsIGRvdHRlZENpcmNsZSk7XG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIGk7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZShvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkZShvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkZShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGUobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRlKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkZShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIElOSVRJQUxfU1RBVEUgPSAxO1xudmFyIEZBSUxfU1RBVEUgPSAwO1xuLyoqXG4gKiBBIFN0YXRlTWFjaGluZSByZXByZXNlbnRzIGEgZGV0ZXJtaW5pc3RpYyBmaW5pdGUgYXV0b21hdG9uLlxuICogSXQgY2FuIHBlcmZvcm0gbWF0Y2hlcyBvdmVyIGEgc2VxdWVuY2Ugb2YgdmFsdWVzLCBzaW1pbGFyIHRvIGEgcmVndWxhciBleHByZXNzaW9uLlxuICovXG5cbnZhciBTdGF0ZU1hY2hpbmUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdGF0ZU1hY2hpbmUoZGZhKSB7XG4gICAgdGhpcy5zdGF0ZVRhYmxlID0gZGZhLnN0YXRlVGFibGU7XG4gICAgdGhpcy5hY2NlcHRpbmcgPSBkZmEuYWNjZXB0aW5nO1xuICAgIHRoaXMudGFncyA9IGRmYS50YWdzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIG9iamVjdCB0aGF0IHlpZWxkcyBwYXR0ZXJuIG1hdGNoZXMgb3ZlciB0aGUgaW5wdXQgc2VxdWVuY2UuXG4gICAqIE1hdGNoZXMgYXJlIG9mIHRoZSBmb3JtIFtzdGFydEluZGV4LCBlbmRJbmRleCwgdGFnc10uXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFN0YXRlTWFjaGluZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLm1hdGNoID0gZnVuY3Rpb24gbWF0Y2goc3RyKSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIF9yZWYgPSB7fSwgX3JlZltTeW1ib2wuaXRlcmF0b3JdID0gLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICB2YXIgc3RhdGUsIHN0YXJ0UnVuLCBsYXN0QWNjZXB0aW5nLCBsYXN0U3RhdGUsIHAsIGM7XG4gICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHN0YXRlID0gSU5JVElBTF9TVEFURTtcbiAgICAgICAgICAgICAgc3RhcnRSdW4gPSBudWxsO1xuICAgICAgICAgICAgICBsYXN0QWNjZXB0aW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgbGFzdFN0YXRlID0gbnVsbDtcbiAgICAgICAgICAgICAgcCA9IDA7XG5cbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgaWYgKCEocCA8IHN0ci5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYyA9IHN0cltwXTtcbiAgICAgICAgICAgICAgbGFzdFN0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICAgIHN0YXRlID0gc2VsZi5zdGF0ZVRhYmxlW3N0YXRlXVtjXTtcblxuICAgICAgICAgICAgICBpZiAoIShzdGF0ZSA9PT0gRkFJTF9TVEFURSkpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoIShzdGFydFJ1biAhPSBudWxsICYmIGxhc3RBY2NlcHRpbmcgIT0gbnVsbCAmJiBsYXN0QWNjZXB0aW5nID49IHN0YXJ0UnVuKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMztcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdGFydFJ1biwgbGFzdEFjY2VwdGluZywgc2VsZi50YWdzW2xhc3RTdGF0ZV1dO1xuXG4gICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAvLyByZXNldCB0aGUgc3RhdGUgYXMgaWYgd2Ugc3RhcnRlZCBvdmVyIGZyb20gdGhlIGluaXRpYWwgc3RhdGVcbiAgICAgICAgICAgICAgc3RhdGUgPSBzZWxmLnN0YXRlVGFibGVbSU5JVElBTF9TVEFURV1bY107XG4gICAgICAgICAgICAgIHN0YXJ0UnVuID0gbnVsbDtcblxuICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgLy8gc3RhcnQgYSBydW4gaWYgbm90IGluIHRoZSBmYWlsdXJlIHN0YXRlXG4gICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gRkFJTF9TVEFURSAmJiBzdGFydFJ1biA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRSdW4gPSBwO1xuICAgICAgICAgICAgICB9IC8vIGlmIGFjY2VwdGluZywgbWFyayB0aGUgcG90ZW50aWFsIG1hdGNoIGVuZFxuXG5cbiAgICAgICAgICAgICAgaWYgKHNlbGYuYWNjZXB0aW5nW3N0YXRlXSkge1xuICAgICAgICAgICAgICAgIGxhc3RBY2NlcHRpbmcgPSBwO1xuICAgICAgICAgICAgICB9IC8vIHJlc2V0IHRoZSBzdGF0ZSB0byB0aGUgaW5pdGlhbCBzdGF0ZSBpZiB3ZSBnZXQgaW50byB0aGUgZmFpbHVyZSBzdGF0ZVxuXG5cbiAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSBGQUlMX1NUQVRFKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSBJTklUSUFMX1NUQVRFO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgIHArKztcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgICBpZiAoIShzdGFydFJ1biAhPSBudWxsICYmIGxhc3RBY2NlcHRpbmcgIT0gbnVsbCAmJiBsYXN0QWNjZXB0aW5nID49IHN0YXJ0UnVuKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyNDtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdGFydFJ1biwgbGFzdEFjY2VwdGluZywgc2VsZi50YWdzW3N0YXRlXV07XG5cbiAgICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBfY2FsbGVlKTtcbiAgICB9KSwgX3JlZjtcbiAgfVxuICAvKipcbiAgICogRm9yIGVhY2ggbWF0Y2ggb3ZlciB0aGUgaW5wdXQgc2VxdWVuY2UsIGFjdGlvbiBmdW5jdGlvbnMgbWF0Y2hpbmdcbiAgICogdGhlIHRhZyBkZWZpbml0aW9ucyBpbiB0aGUgaW5wdXQgcGF0dGVybiBhcmUgY2FsbGVkIHdpdGggdGhlIHN0YXJ0SW5kZXgsXG4gICAqIGVuZEluZGV4LCBhbmQgc3ViLW1hdGNoIHNlcXVlbmNlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5hcHBseSA9IGZ1bmN0aW9uIGFwcGx5KHN0ciwgYWN0aW9ucykge1xuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZSh0aGlzLm1hdGNoKHN0cikpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIF9zdGVwJHZhbHVlID0gX3N0ZXAudmFsdWUsXG4gICAgICAgICAgc3RhcnQgPSBfc3RlcCR2YWx1ZVswXSxcbiAgICAgICAgICBlbmQgPSBfc3RlcCR2YWx1ZVsxXSxcbiAgICAgICAgICB0YWdzID0gX3N0ZXAkdmFsdWVbMl07XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGUodGFncyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciB0YWcgPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb25zW3RhZ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBhY3Rpb25zW3RhZ10oc3RhcnQsIGVuZCwgc3RyLnNsaWNlKHN0YXJ0LCBlbmQgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFN0YXRlTWFjaGluZTtcbn0oKTtcblxudmFyIGRmYSA9IFN0YXRlTWFjaGluZTtcblxuLy8gQ2F0ZW9yaWVzIHVzZWQgaW4gdGhlIE9wZW5UeXBlIHNwZWM6XG4vLyBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RmbnRkZXYvZGV2YW5vdC9zaGFwaW5nLmFzcHhcbnZhciBDQVRFR09SSUVTID0ge1xuICBYOiAxIDw8IDAsXG4gIEM6IDEgPDwgMSxcbiAgVjogMSA8PCAyLFxuICBOOiAxIDw8IDMsXG4gIEg6IDEgPDwgNCxcbiAgWldOSjogMSA8PCA1LFxuICBaV0o6IDEgPDwgNixcbiAgTTogMSA8PCA3LFxuICBTTTogMSA8PCA4LFxuICBWRDogMSA8PCA5LFxuICBBOiAxIDw8IDEwLFxuICBQbGFjZWhvbGRlcjogMSA8PCAxMSxcbiAgRG90dGVkX0NpcmNsZTogMSA8PCAxMixcbiAgUlM6IDEgPDwgMTMsXG4gIC8vIFJlZ2lzdGVyIFNoaWZ0ZXIsIHVzZWQgaW4gS2htZXIgT1Qgc3BlYy5cbiAgQ29lbmc6IDEgPDwgMTQsXG4gIC8vIEtobWVyLXN0eWxlIFZpcmFtYS5cbiAgUmVwaGE6IDEgPDwgMTUsXG4gIC8vIEF0b21pY2FsbHktZW5jb2RlZCBsb2dpY2FsIG9yIHZpc3VhbCByZXBoYS5cbiAgUmE6IDEgPDwgMTYsXG4gIENNOiAxIDw8IDE3LFxuICAvLyBDb25zb25hbnQtTWVkaWFsLlxuICBTeW1ib2w6IDEgPDwgMTggLy8gQXZhZ3JhaGEsIGV0YyB0aGF0IHRha2UgbWFya3MgKFNNLEEsVkQpLlxuXG59OyAvLyBWaXN1YWwgcG9zaXRpb25zIGluIGEgc3lsbGFibGUgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuXG52YXIgUE9TSVRJT05TID0ge1xuICBTdGFydDogMSA8PCAwLFxuICBSYV9Ub19CZWNvbWVfUmVwaDogMSA8PCAxLFxuICBQcmVfTTogMSA8PCAyLFxuICBQcmVfQzogMSA8PCAzLFxuICBCYXNlX0M6IDEgPDwgNCxcbiAgQWZ0ZXJfTWFpbjogMSA8PCA1LFxuICBBYm92ZV9DOiAxIDw8IDYsXG4gIEJlZm9yZV9TdWI6IDEgPDwgNyxcbiAgQmVsb3dfQzogMSA8PCA4LFxuICBBZnRlcl9TdWI6IDEgPDwgOSxcbiAgQmVmb3JlX1Bvc3Q6IDEgPDwgMTAsXG4gIFBvc3RfQzogMSA8PCAxMSxcbiAgQWZ0ZXJfUG9zdDogMSA8PCAxMixcbiAgRmluYWxfQzogMSA8PCAxMyxcbiAgU01WRDogMSA8PCAxNCxcbiAgRW5kOiAxIDw8IDE1XG59O1xudmFyIENPTlNPTkFOVF9GTEFHUyA9IENBVEVHT1JJRVMuQyB8IENBVEVHT1JJRVMuUmEgfCBDQVRFR09SSUVTLkNNIHwgQ0FURUdPUklFUy5WIHwgQ0FURUdPUklFUy5QbGFjZWhvbGRlciB8IENBVEVHT1JJRVMuRG90dGVkX0NpcmNsZTtcbnZhciBKT0lORVJfRkxBR1MgPSBDQVRFR09SSUVTLlpXSiB8IENBVEVHT1JJRVMuWldOSjtcbnZhciBIQUxBTlRfT1JfQ09FTkdfRkxBR1MgPSBDQVRFR09SSUVTLkggfCBDQVRFR09SSUVTLkNvZW5nO1xudmFyIElORElDX0NPTkZJR1MgPSB7XG4gIERlZmF1bHQ6IHtcbiAgICBoYXNPbGRTcGVjOiBmYWxzZSxcbiAgICB2aXJhbWE6IDAsXG4gICAgYmFzZVBvczogJ0xhc3QnLFxuICAgIHJlcGhQb3M6IFBPU0lUSU9OUy5CZWZvcmVfUG9zdCxcbiAgICByZXBoTW9kZTogJ0ltcGxpY2l0JyxcbiAgICBibHdmTW9kZTogJ1ByZV9BbmRfUG9zdCdcbiAgfSxcbiAgRGV2YW5hZ2FyaToge1xuICAgIGhhc09sZFNwZWM6IHRydWUsXG4gICAgdmlyYW1hOiAweDA5NEQsXG4gICAgYmFzZVBvczogJ0xhc3QnLFxuICAgIHJlcGhQb3M6IFBPU0lUSU9OUy5CZWZvcmVfUG9zdCxcbiAgICByZXBoTW9kZTogJ0ltcGxpY2l0JyxcbiAgICBibHdmTW9kZTogJ1ByZV9BbmRfUG9zdCdcbiAgfSxcbiAgQmVuZ2FsaToge1xuICAgIGhhc09sZFNwZWM6IHRydWUsXG4gICAgdmlyYW1hOiAweDA5Q0QsXG4gICAgYmFzZVBvczogJ0xhc3QnLFxuICAgIHJlcGhQb3M6IFBPU0lUSU9OUy5BZnRlcl9TdWIsXG4gICAgcmVwaE1vZGU6ICdJbXBsaWNpdCcsXG4gICAgYmx3Zk1vZGU6ICdQcmVfQW5kX1Bvc3QnXG4gIH0sXG4gIEd1cm11a2hpOiB7XG4gICAgaGFzT2xkU3BlYzogdHJ1ZSxcbiAgICB2aXJhbWE6IDB4MEE0RCxcbiAgICBiYXNlUG9zOiAnTGFzdCcsXG4gICAgcmVwaFBvczogUE9TSVRJT05TLkJlZm9yZV9TdWIsXG4gICAgcmVwaE1vZGU6ICdJbXBsaWNpdCcsXG4gICAgYmx3Zk1vZGU6ICdQcmVfQW5kX1Bvc3QnXG4gIH0sXG4gIEd1amFyYXRpOiB7XG4gICAgaGFzT2xkU3BlYzogdHJ1ZSxcbiAgICB2aXJhbWE6IDB4MEFDRCxcbiAgICBiYXNlUG9zOiAnTGFzdCcsXG4gICAgcmVwaFBvczogUE9TSVRJT05TLkJlZm9yZV9Qb3N0LFxuICAgIHJlcGhNb2RlOiAnSW1wbGljaXQnLFxuICAgIGJsd2ZNb2RlOiAnUHJlX0FuZF9Qb3N0J1xuICB9LFxuICBPcml5YToge1xuICAgIGhhc09sZFNwZWM6IHRydWUsXG4gICAgdmlyYW1hOiAweDBCNEQsXG4gICAgYmFzZVBvczogJ0xhc3QnLFxuICAgIHJlcGhQb3M6IFBPU0lUSU9OUy5BZnRlcl9NYWluLFxuICAgIHJlcGhNb2RlOiAnSW1wbGljaXQnLFxuICAgIGJsd2ZNb2RlOiAnUHJlX0FuZF9Qb3N0J1xuICB9LFxuICBUYW1pbDoge1xuICAgIGhhc09sZFNwZWM6IHRydWUsXG4gICAgdmlyYW1hOiAweDBCQ0QsXG4gICAgYmFzZVBvczogJ0xhc3QnLFxuICAgIHJlcGhQb3M6IFBPU0lUSU9OUy5BZnRlcl9Qb3N0LFxuICAgIHJlcGhNb2RlOiAnSW1wbGljaXQnLFxuICAgIGJsd2ZNb2RlOiAnUHJlX0FuZF9Qb3N0J1xuICB9LFxuICBUZWx1Z3U6IHtcbiAgICBoYXNPbGRTcGVjOiB0cnVlLFxuICAgIHZpcmFtYTogMHgwQzRELFxuICAgIGJhc2VQb3M6ICdMYXN0JyxcbiAgICByZXBoUG9zOiBQT1NJVElPTlMuQWZ0ZXJfUG9zdCxcbiAgICByZXBoTW9kZTogJ0V4cGxpY2l0JyxcbiAgICBibHdmTW9kZTogJ1Bvc3RfT25seSdcbiAgfSxcbiAgS2FubmFkYToge1xuICAgIGhhc09sZFNwZWM6IHRydWUsXG4gICAgdmlyYW1hOiAweDBDQ0QsXG4gICAgYmFzZVBvczogJ0xhc3QnLFxuICAgIHJlcGhQb3M6IFBPU0lUSU9OUy5BZnRlcl9Qb3N0LFxuICAgIHJlcGhNb2RlOiAnSW1wbGljaXQnLFxuICAgIGJsd2ZNb2RlOiAnUG9zdF9Pbmx5J1xuICB9LFxuICBNYWxheWFsYW06IHtcbiAgICBoYXNPbGRTcGVjOiB0cnVlLFxuICAgIHZpcmFtYTogMHgwRDRELFxuICAgIGJhc2VQb3M6ICdMYXN0JyxcbiAgICByZXBoUG9zOiBQT1NJVElPTlMuQWZ0ZXJfTWFpbixcbiAgICByZXBoTW9kZTogJ0xvZ19SZXBoYScsXG4gICAgYmx3Zk1vZGU6ICdQcmVfQW5kX1Bvc3QnXG4gIH0sXG4gIC8vIEhhbmRsZWQgYnkgVW5pdmVyc2FsU2hhcGVyXG4gIC8vIFNpbmhhbGE6IHtcbiAgLy8gICBoYXNPbGRTcGVjOiBmYWxzZSxcbiAgLy8gICB2aXJhbWE6IDB4MERDQSxcbiAgLy8gICBiYXNlUG9zOiAnTGFzdF9TaW5oYWxhJyxcbiAgLy8gICByZXBoUG9zOiBQT1NJVElPTlMuQWZ0ZXJfTWFpbixcbiAgLy8gICByZXBoTW9kZTogJ0V4cGxpY2l0JyxcbiAgLy8gICBibHdmTW9kZTogJ1ByZV9BbmRfUG9zdCdcbiAgLy8gfSxcbiAgS2htZXI6IHtcbiAgICBoYXNPbGRTcGVjOiBmYWxzZSxcbiAgICB2aXJhbWE6IDB4MTdEMixcbiAgICBiYXNlUG9zOiAnRmlyc3QnLFxuICAgIHJlcGhQb3M6IFBPU0lUSU9OUy5SYV9Ub19CZWNvbWVfUmVwaCxcbiAgICByZXBoTW9kZTogJ1Zpc19SZXBoYScsXG4gICAgYmx3Zk1vZGU6ICdQcmVfQW5kX1Bvc3QnXG4gIH1cbn07IC8vIEFkZGl0aW9uYWwgZGVjb21wb3NpdGlvbnMgdGhhdCBhcmVuJ3QgaW4gVW5pY29kZVxuXG52YXIgSU5ESUNfREVDT01QT1NJVElPTlMgPSB7XG4gIC8vIEtobWVyXG4gIDB4MTdCRTogWzB4MTdDMSwgMHgxN0JFXSxcbiAgMHgxN0JGOiBbMHgxN0MxLCAweDE3QkZdLFxuICAweDE3QzA6IFsweDE3QzEsIDB4MTdDMF0sXG4gIDB4MTdDNDogWzB4MTdDMSwgMHgxN0M0XSxcbiAgMHgxN0M1OiBbMHgxN0MxLCAweDE3QzVdXG59O1xuXG52YXIgYmFzZTY0RGVmbGF0ZWRJbmRpY01hY2hpbmUgPSBcImVKemxYZHVPNURpTy9aZDY5b1B1dHVjNzlxM1JHR1QzNURZV2sxTzE2S3JaUldPeC96Nms1SXNrVWpibGNHUldUVU9oakNvSEtWRVVKWkxIQ3NmL2ZmcjY3ZVhiNjMrOC9QTDIrdWt2UC8ya0JrSDVlUUE2TTlqQkRYNEl3emhNd3d6WE5ieDBmSmxCMjBHN1FmdEJoMEdQa1FHTG5nWTlEd2E0OVdETVlDeGNNeTUrWlB4Z1F2clh1SFFSL3pNTlpoNnNHcXdlTFBTSkhEWnhXRC9ZeEdGekRqdUJWR011MWRLM1RXOWhvYlh6OG9HRGw0YjNndHFaWVNYWldvYXJNR2FIcjlUMjByREI2N2x1RG9nVlIrdjg0TUxneHNGTmc1c1pRZXFtMWVDWE41M1RLcFkwWXpKTlFtOEhEOVBwQng4R1B3NSt3bXRKN0FBdm5mNWxjcUZsYWc1MkNPNUV6OEhLelFwSnRzWVhtd3EreTZhZ3d6Q0VFVitWOEdFaWlnbElNTVlYL0VINXg3WVdSNHYyUFRwOFZiSW9Jc3JvbHc5R0dPeUlueFRrSThxU2FETEp4M21ZRkw3VzV0VTYwbkVtNG16TGpZclRVTTJraDhrTWt4MG1NRnZQU1VUdGEwcnRUR05PZTJhSzA5UWtURklMbFRqQmNqblY0bFN2NDFrUHM4RVhhWCttcTNOMnVBWE5udG1DRk5tQjVyQTJOQTR6OWwyU3p5aEpvc25FMFFxcmpuWHRZV25leHcrcEx0c3NpdVhRQ3BhTkF2TlVzQzByYkRWd290RXAwMnBjM3FlYytteCt0WnFibEdsUEZ5cFV4L1d2ejNTcU5kRVE3aGZvaDZDU1hyUjJSQ3dsMjlBU08yZ1FYWnNlb1U0bGl3YnIxVVpScm5qQjZGaTViWEFYSnpvZWJVejhhMk9kanYyVEJnc09aSEx5Q1VrbVhycStKSTFucFNIT0Q4bERyR1R0RWszMnVqTWtIcVhFR2xZLzFvWDhTQTROdGlZbTEyQ1YydUtNZzFZc2Voc3JraWVUN0VpV3pXa0xLRFBDZ3lXbllYdEFyeDBZcjAyZHRyWmhheE0wWWlOeHdhR1QzVm15UHptc090YTFtNldQOUNHaitDWUx6NkZCdDlwaDFBajdFOFJER2l5SUU0NnhCcmRzVUs0Z1A5V3JhMU11d1pCUXJSNnJsaWpXRXkxQlJLYWhONnlrSSszcEhxWDlzdkY0ck5WZXBmM1V2ZkdVZzRkd0k0VmZHcVRRTUxuUVlCeXZEbkV2U2tGWUROZEdUL3ZBT1krYjBQbXEwUkN6Y2RFeFhzK3BzMzN0b1BWOGMxdUxOR2JMT0RSako1VVdRMWplUjJtcmlid2Q3cWlPYUdlUms0OEJGUnNDUXZ5cVFROGFCcWRIRXZCb2pGaEh4L1dDSC9wWTJaaXFNQnFrRGZIdkdDc1pTQjNNYXJnd2M1cmErNTdLRG5hQlpsNGdFaXBqSkptcUlmTkU1cUEvNnJYeEphVFdFRmhqWGVtUFJORWdpNXhlZ3hRYTVOWkFxaUVVMXhDSGkwVGF5MG5RUGdVcFpUN2VvL2grTWNrWkswbmFOSVRsM1NiSnl3TTJxV05BTDFDSWhqQ2ZYMVg0U1U2ZjJlNVJCN2tGTDlvVEI3MUx4NzB4UHJTdVp4UUpWaUVFeWxVM2VzWmNVSEU5Z1d6UUIxWTJ1TjY3aWFtTFVTYit0YkdTd2RRNWpzR1VRN043NjlhNUszdllKZks4UkNTRlF2b1FxejFmN0JjVEliZFVJWU9CekFucnhuQWtrb0gwcW9QQlFIcGxOR0llb0NUd3lRYVRISWxRZXpsSjVkYThUMENhRFZtM0tZMU8xbWswMXJHMkc2T25mdXZrNVFIek4zb214S3hHakdtdk1XUEs5bk5EUHVvak4rZlVqbzVCbThHZEJXcWRZTllobTltMkg0Zi80VU9laGFnWUNoZFNZVFpxVEJsVXBldDdDa3VFYXFhd0s1ZDhLQ0VMMzlwam9jdDUwU2RqWkd3T0t3UndGUnQwTXNacUlwU0VTSVdaeTZhTlpVVlpzL1V1WWJDY0o5UFlwNDZWNWl3TU1aSTM5c0J5Rjd5UTZpWjZMYVkzUUlkMXBUK1N4OEFxa3RNYmk2RVJXS0xGZUFmbXljckFnNE9TSTBIaTlDL0tncllOaWE2QlBvMGpxWndCZ3pQT1U3NzBZWWlWVHhsM3VWSldibHhDV2FkWWFjcElFbmdESnJObXAzd3hicTQ2MmNTSythb01Ja0JFV2NmcVI3NmpBaHk0bHVpN3BVbzVES1RYV0RlT1EvT0RITHlEd1lDSkdNakdqVWRGZ1EwQ3ZVeXF2WnlBRlN1eUlTRE54M3dBdkliRlRnTldRK3dVRXZ0dU8yMklqcXN5YnZ3U25aamdtMkNScVFDQjNLQ1BlOGtOTzdiVTZZWlhMdGFyK29uM3FoaytRNzFxQzU5WnVmb2tnMFZrUW9oMWhXbldGQXFhQ1dNaDNKYWtSNjVwcVhQSnB4WTJKcFUyNC9xK3cwRWljMnhnSkdZRU9jYXpHNE5JbGJmdDB1amFpRGhqaVhoYmNPUWg3aVBCVDdDZEZRZ1NrT2JLQ0UxS0U2RVRmSjlTclNFVWtoT2JEZTZCWnMwVVA2TnA2RUtWV3pUaUNreW1pMWdRZmxaTGxrTklqR1JOQ0dubDZ4alJaTExNdWoya3lUU1VmSUNWVkNCU0E5VmlMSjhIQlpnSm5HSnpFN2lGcVc3ZFpCZ0tBNXIxQ1JRYlBFOXlzZGN4MXNrTGlKRzhFWXBXNk5RRnJDa3hlRG1EbWVaWU40WWprY3pjeFdBUWM4Sjd2elBZZTd5NUt3VHhEc29EeTNnZGNHTlJvcURjb3N4QU5HNVJ0a0MwbGE5UFBnRzR5MHc2Mks1SmdORVp1WW1JRlN6NWVZcVZZRW9FR1RCYk5nK3NObjdLWmVKenZmblpKZGVuK1Q3Q1kxWXhtczVRTlVhMkpxcTI4c25IWlBFZS9ZNHZORWRsVld2L08wQ05LbHl0Z2ZReHVGb0xIYUcyYjFWc1VEbW9OVzVuVmIwREZsQmluMGl4UWNrT2FOVVlxMWJFOFRMVVNDL1pBaThCYjRsQnl4bXNtbVBkR0k1RXNycUx3WUlnRnFTM1NLcGh2clR2aFEvYmpmY3Y1blhBcmFXSjJDQzNOQXRJa2ZiVWhCUTN2aTRKNTVoNkg2TGV6TFRqWURCd2w1RGZsWjBvTmpleENMcWlKalhZaVZGbEQ5YWcwazNaUjhJWWJmeDdGSFhuV09RT1h1cllwQXk5dE1ZbjJRd0MrR010MjBSbHd4SlRQOUdON2JMc21xSmdYdExlaXY2UmhvOFl1aVVSd25sY2NYUlh0SGhRTmg1aFlSYy8zZXhzcy9rQ2xldkgyQkw5S0thM2VFOHNRcHpuSjNwc1hIbFNlZ3U2Y0lzcFdzbkpCSXV3b2tQcUVDdUIyQWhBWXUyYWFTTWNZWnVuUHhhNllpaHpBL1pBeE5BeVVFa09ORExTTllIR2xhOWpWS2kxREdZNUdKZmpqRXV0MVB6Y1ZFQmpFLy9rZ01ZV1VzVE1mb1FWTENvcm5yck9lN0RPRFp4TUs4TGFLMVVjOERuMGlSMzdXTFVUeGlRdHVncTl2QUpGSm83UXdXRkJQVmczamlPaHJKdDZHQ3pzaDliam9WZXdWQStUaHFlaU9pSFZnOWE3Vi9iSzExeWx3ZktyTklOWnVWWGFnbGxYdmo0SnRSWGNFbUNtSHN6S2VpbENxN0t6bndmcHRRVXJuRmY2ZzZPbG5xSWExb2RZRVpROFNlQXRETktDMUJhRXRnRlBUK2ppbUZxa0NXY0EzeG1HdVNLZUV0cHNHSUhJdnNzZFhBenhiTUJ2cm9UcWNCMStQcmJQNzlrd3hhcklVR2xIYnArQXM1UEdncElIcURjaUc0ckZOU3hNdngweDhvWjFRTStyMlJHV0hBK0UyZ1ZTT3dJcGNqQjBoMDhScUxCakE2aW84Vk1MalNjQllUN0dtUWc0S1NvZ2xubnRTWDU4YWRGU2xnY1JHREZkWFlGSDJ2UVJSNzh3UWlDUkt3eGthMkg2YlR6bkpuR2JTQys1cTMwSjJVc01WczVnUVlOWU40WWprU3hNVFFlREJUWGp3VEsweWtrRW41M0R5TFZJOStibmlzM09MY3lybmFEOUNaYjByTWpYOTJab1pqWmxUd213cytsTTNXR3FuVU43T3hnWTArMTRYaytBQmxvOGpZY0NnakxzVEU0a1dkUk5MV0JVWHNUbytzNGtMVDFtMyt3aGdGaTZ1a0pvdE9rampuNWhwSkFZVjdTcXp4Nmh0dVpZalpabG4wNDEyeTl3clFzZ1ZXS3djZ1lIbW5NUnFQSG5VSnRUcG9mQmdhNFFPWTRjRGNNc09SYWNTWFFlTS9XUXNCTUhNNHExUW1nSWN1SzJrMzE0NHpVaW5qUkNXSWlLY2M4TTFJUzRrVk5VcUJ4c0lrS3hZRlBPSlI2S1Z2bTNTMXRqeWI0YlZzSlRyZmlJQWxvckNDYmp1VEl0eDFxZWVDMW5zQm1qNVFac3RuTDFTYlpvVFFndWNVVmJTdWxnTDhWcTlyVGpzRjJuSlVGQUYrU0RqYTZET2oyamRtc0NxZGowMGNGZTUyQmpjVEFCRGhaRTFZL0RtZE56MlZNQ2w1eEpZaHltZ2prT3RXTlhtQTY2YU5rUzdNcUJpVVFSd2VZZFJCcTFpSWhLMXlMRzFyd2UydURLa1MxbFdxUElUYnE2WWoyMDZTT09mbUdrd0ExWHRLT2UwK0hpTlFtRWtiVHJUQ05lTHEzdUVwQ1NPSFFIaDhPdENYZWFsZU5JS0dmbUhnWm5FN3dSamRPMmpMUGtXZUVRMmFuSzFJdUphYmxEck5nNmtwWTcvQkoyODJ0MTYxZU13dm4rZFJXemlEeVJUODdqYkloMTV6bWNGMUJhRDRlek1JY1dQUlVlcUlZZEhMKzllU0taYy91Skw3NDRabkVjbEYwYWwzQVZoOC9SZ0ZwUG9PanVXVDVrQkdMWU8yZ1pnTU4xMUFSd1ZzWnVDVGN6TzVzUVJQTkdmQjlqSmZBSHdTU2NXOWNlSGdxTWQ2S1l2SEdoeWszRjgwZWlFSmx4bmtxV0F6cU1aQ3lnay9OMWpBajJyVmt3cEhSWGc4R0FtdGt6aFkxV3NFbklkRzJLVGhRK0tWN2hHVURGS2J3RlVLMTh2Zkl0K2hPQ09GekJJMlUxcFFPM2hSWHhFa203empmaTBvS3lEMWJCVmpkTTVDVEw4d2xLY0Q3RVNyL2hWd01KYnJ0WkJQbWU4NDNIV2l4VWhVaHo2MWtoczQ2ZkVvUEljQmhHTmhhSHlmazZ4aFJVZm9DcFBhcXdTMWhpTjgyVWw4STlLMGdrWkxvMlMrYzZuM2lkWjlBU3EvTUd0TFR5OVVxNGFGQ0l2WERGa0FlbzREenBXQkhta0xUcjZEMEpocklQRGNGVzExRUpqa0hkazI4ck50dDI0TVVkdXY0QVBkUVBqM0lCdWw2Q3dBcHFjZkZPMHRFQm1oeHQyZUVaVEdIZHlLTU5OVDdqUnBOa1F6Yzh1a3EyMFZQWmlza1hadCtzNGJBM3d4MDk2azcxQ1I0blpwSG9xVVltWVNVNXBOdjlOVWFzOFlBNEYrQTdjdWpkVGJxUmhNZDhtcmtUVmFUaFZEbzJEUy80NUtQQ0wveG5aeTBPeHBYZFJpbHo5M2F5US9QOUZTYVFjbDJicTFPOVkvRE42VDNIRmhpOXQ3Q0ZqYTlUd2tXSHd1U2JYUUhNN1d3MzJWaHRLeTZwMTh2VXpJd3l5dDVrR050ZHQrNnpYUHZ1SkFyVFppNkpLdEp0cHFObXVyMHg5aWRSRGdJK3JKWlBvNWpaa0VBc3ZSbnd4dWZXMnNHRFFRSFdqZWRRTWd6MU9qamNqQlcvWHd4ckNPSXFOenVSWkM1RzV3NkRuSGpYb3BySmVXS2x1OVhNRkd0azZ0WlVpMCswSEVRclh1RlR2V0JyVStTb2dsY1dLcHQxZTNWK1ZDSFB2UGRjSGJNWHJ4clpTNTJzZTRnUmtvQ3dHeXB5Vk1GclJRWE1pelQzNG9xWnVlOG8rUFpqUVBLcHV6VkVWMnlBN3JXQkNqTUUzdHJqWGJ5eUh3L1c1L1ZZOXBTU01hOWpkbjk0Y3pwUDIvWkVENk5lMzNwb1JKM3BlYU9TZ0JBRWVwaTVXa0JqcVlCNWtjYnNYTEdhblR4NlFvU3FGVmNwaEtIZWhGanJZTGNPUXYyR1pUdjhEMy8vYmlIS3hQR0dpOW94QlBmbU9HNG5RckZ4ZTg0bEhvck43MFUyeDVMZEF5c2ovZFo5UlpvYnJQbUVqT2ZLdEJ4cUdiY2dUc3RaQmtLMTNNcEFWcTQreVZxRkhFVytOMlJWYk1EcUlSanpzRHc5ckU5dnljMHdqdzlwWEk0N1Y0bU1seHpkekhPWlBmL0JLTkEzejJUWCtZK0hxMUZFdE14c1dLdUl6bEFSOHlLTllybGl5Vk1QVTVjU3ZHNXBRUmkxOGIzWEFEYjI3V0oxcmdGWEVGa2JXMmxwTmhmaXA4Um5saXJuOFRqN21BZHNQRWVTZVFpQmVqZzhHaU9leGNiOU5NNmVSSzUwYjZmbm1PcGVpcnlCalJyM1NKTnIvWWluUnlLUHp5L0JpTW1iV0Vsb1J1SWx2NjJNRVJRYzRXSW1NbHVvOGptQm5KRUxOV1BVNkptc0tRODJxV1Jzc0Zud2RZd29aTGRSRG9hMHd6NWxmTnE4STBKRDJqVVFGakpkbTZJVGhXdkZLcndJbmhtRnQ0TG5qYTlUdmxZWlMzVE40OWFOWVNGK25jSXpoemRKVU9nMzN3QXBtby9JT3hOK0xsUzV3a0xydUdjTWpnUGpDUE9ZbXNyR3h0UUZuM3hNb2ZpbWRIdFVZUTlreXppOGVjK0FodTVyd0M5a3VqWkxwenJIZUovVGVaNG1NRHB2cFFrYlg2ZUVyVEtUKzFRM2hadUtEVFk5L3F3RVdpRStwOHVYSFhqOGRZZXA3Q0dsRUQ2a3IybTJnZmc4MWRoekV3eXpmWkFsSng0R2g1SkJqTzVIWFVrR3dXNHRXYnB1VTNnMnVxVldVUjBKenZ6K09CT0xKOFJhTUs0bnp3L3hpRHF3MFcwTVZNZnlzVUhwZWhiZlV1blkrTGJnNnhqVlZBRGhSK1BLWEVrUkZMY2hiUnBJZThGWklSSktkOC9WcWQ0eCttYjFuZ1h0ak41YlFmdkcxeWxocTJqeXhkWEYvSVhoTTFjYzh6QkVENXJHNnVZR3psQ0g1Vk96L1NMNDdRMWswL1ZXME1oeitDMHZGSVRqTjBZdmpkZ0ZuNk1FWmpiaENUdnlXSEUvK2ZWblRxb3cxay9uejNuSlE5azkrSTI0WlBvRm1QUG8xMDlURWcvbWUxWkVQUHh4bGtxOGhlOVdqNnA0ZjRvUHpzRjRCRVR3WUlpMVA4V0h1bWhYOXBSaUo3ODgwT1FJRjh5anJEMHVpN2hnZEtDQ3dNeERxcE1FQkQralZOMVJ3TEhXQXFZUHpOblBIbFgrbUg5RVAzclgraUg5NmZybWtlc09PSWVjc1loRUtwMXhDL2VpN250MStUS2VXeFUxbW9haXRnQ0JLS29WSHlTV0RwSHU5VkNLOVU4Qm42SU5lMWlBTFNzb1QzODJMR3cvWVZIRkxVRUpjSzg4ZE5uREhYVFVRYlZ3cnpyY0NXcE9JdUwzUkRUQnZRTCtta1V0WWw2a3JvZ3JpQWRSeXRBNm9wTkxEZXYzOUJlcXFyMng5Zmg2M096ckI5aW42NXVMb0oxd0hpSmpFZ3BXZW9kbWdrOGR5dXFHaEV5M3F3d2E0bFcydVMxR1pRMnZ0VEIxQ0JiaUk3WUZ2MTFWZWJyMms4elJhZFhQTWsvWGQxL0g5TVQ2dXB4UExtSHA2NXBwTkhXUHExTVZNajFIZitoVGVmM3RycGpwcWVtS1Y3NWVDWHRjUUlnUG9SWDh1bEMxNzdVZnhZdjdlZjB3M25SOWR3Tk1UNndieVBua0VwWmVvSjJ5VWMreE9od3AxNU0wR0ovTHkybHc5MUtjQmx0ZWF1WHJsYkJWZlBYQVpNSHZKTlpiNmdXcmxvL2c1K0hUeTYrL3Z2NzN0Ly82L051bnYvejBueTl2WDErSGI3Ly9rLytUUGo0aEV2eTUwTUpEbldiTWRUdnlJVDAyZUw1ZnlTQnZFZjZTRERkMzkzQ2ZqODdkdStud3ptVnh2MjQ2RmZhQm9uUitUSVY0VkpUM0hQRkJYMWR0NXoxVjlhUytMbHZzWWE5eVhUOVZjVWR5WGZyL25ZcjVRTTJmcS9kOUpIcGtncnRIOTk3cTZPNzBxdWsvWTEyL2d3S2VZM0xYUlhuQ3h6ZmE2SlZPSHJNT2lTRkFldlB0NWJldmtObjhCT25ScDE5Ky8vTDMxODkvL2ZYdG4xKy92ZjcrQ1MvOSt1WHoxeStmWHo1LysrdlhQOTdlWG41NWU0MlgvK2ZMLzc2K2xaY1labm9wdldTMDNLV3YzMTQrLyszbDdjdm4xd3ZNOHVGeFBmL3hqMSsrdkVtWStjdmREQjl4bVpsV2VrbE0rT3hMbDJlZHRVdngxU2VZdGR6UytjdEwvMTA4VDcxOGVmVU5qOHdYczBnYlMxZThtdTlhV2pmMjhJTnNKbDNiekNQN3dJTXRma2M3Mm9PZTlXTjN2K2RzbGsvY3BLNTg4cVBzdjkzamVzU2dIdDR0MkUzL3VuT1FtcGJJTFh3dmNkL3REdVFqL2M2elBkTFQ0OWhiZk01N3VhaTdIZGU5enVkbTkzYW5QN3ByYy8xWXQvU1IzdXdkSEJwdkszZDdtZStkN2hIRTR0bTc4ZDF1NjMwODEwY0FILzBPNURrKzVPa1p4NGY3Z1EvYnNtN2YyOTluZXhmdVEwL1kydnBhZlk0QTc5VGs5N1pGditQT2ZmOFcrVDN1eSsreWtWN2ZGbjRJcE9MeWR2amhTLzZIYWZYeGJlejVPOURoR3J0MzZmY3MwWnZYOHYxQjBZY2xhdlQxWXl5R2QxcGZIN2FXbnUvNy8wMGMrenVzOWorcHcvNTNjazEvZHZ6MWcvM0xkN1dIZm8vRzgwZ1AzOHRzMzdnSGRkeEI0dHI0K2YvL0JWb1RZZG89XCI7XG5cbnZhciBiYXNlNjREZWZsYXRlZFVzZURhdGEgPSBcImVKek5tVnR2MnpZVXg3K0xudm5BKzZWdmE0YTBLNUJzV0xjV21CRUVzcU1HM213NWtKVU9ROUh2dnNPTExVcDJvd3NWd0dCQ21qOGQvbmwwRGtrenlMZHNsZGZGNDY1YUYvdnN6U0w3TlVQWkw3Yy9RLzBSZnQrOWhjcitYdDlBZGZYdUE5U2ZibjVhZm5YdGIvdmF0cUhyZTFjM2J6Zi91bTVWMk1iMzNqdDcvL2txakQ5MDdUeS8yL24rdEJNRjBScy8vTnFiWG50NDdVZVV6NXVOdFE4Nkh3OHpoakYvZmI3OTRCcGJ1OHI2L3NsT2MydGRzWlViZW9leWgySzEyejd0OXV0NnZTdmgvYjlsVkdBRmNZQ0dJY29OQnlQNHJJOUlFR09SMWc1cHJSQTFtRHBreUJGcHBUMmlrUlVEeERDeEE2SGhpR0VzUFRJZWlRWlIzRmd4WWhIaDNDTENLV0pFV0hsR3BVTlVNc1NvRmc0cDRwRENFYUlSa2g3eEJzbUFSSXlPb3psMm81blJDQ3JzRWZQSVJJZ2ZyVGh4QXdXWEZna09ieVVZOWtoSEtGaVpHRFdtQWpkY3VBQkk1anlVa2lENGJCUERsSFNlS0EyZUtHbXp3SXh3VmtaQVRJemdIcWtJU1krc0p4eVNBVWhxajB5RG5HbmdFbnR1SWtRYTFESTF6VVFPU2VQeUFRMUcwa2poRWZPSVJraDZ4Q09rUEJJUk1oN3BCaG5HSFROTUFUUlVCU29DMVVlcU1IY3B0aTFCVUx0NDJaNk1xZmEybWpOSE5iZFVjeG9vanlrN1VObXl0WjRwZ28wTnNXMGxndHJyUXM4RXFnTDlqcko5RFVmUUgvbHlVOEN6QlVhemxUdTBvQWoyQytKUUJCQndCV2xrRU1HSUVFUW9JZ3pCSG9PZFJ5UThKZ3BCK3UwVGd5aEdsQ0JLZ3habHZ2RTF0eFc4NXl6T1VubjBkcUtBUFhIYS9WTkJhcUJpOEFQYkIwSUNTeFRPRnRoZHNOVVZZbmJSSSs0dElZM3dBTTRaRG9HRHlJbWd3T1ZSakJsUDFFd2hhUExWOUE3NWlpMEk3NzU2TzB2OWlyaWplQkxMc1lLSEplWGNvd044REN1cC83WE40TmNlS0hsbTVXTy84SEhmdW8rbUZpK0V3RXZQSG9OMFRhSzdEOGVYM3JXVXZqcDd6cWRYVFJQQU1URWRlS1RPNHpMWExYSGJIU3pPemNpQWtNTTVOeWdpWjNUN3lvUkRxMWVTL1BqaE5MbVJxemEyU056OTA0dHdGWG54bEU1STlWeHVwcXAxdisvVHZadFpydTlsbzd0SWJNUzZYblF1SUFORVR6UzdaYnhrZkdkeUU4Z0Jya1ozcGQ0QXNHYWR6U2Q3OW82SFIxenhBbEI5QWZINnJ4S1JkRjMrOG1JWVZBWXNzaGtXN2x3Mzg2UzBNVEV5dm1la0JXMDVEOTNoemdzMnhYcyt5djF6NG4xbHlqblVxOW45a2t6WEc3L2VZcU81ejU2a0xQMzRHN3h6Rlp6MUQ1aVVhK1paOGJSeWNwTkpFdVA5S2V2czNmbS9MbElPaDdNekpNVGpHT0U3bE9XclZmRlVyOHZIN00zaVM3N1pGNml1bmlkWDZRcVhWa0dJNnZ6Ui9vTmdBZUhQbHRYdW42SzhYMjJlOTNWUlpSYXR5NGZpcVlDcXJGdDgvOTkydWR1MFVaMlhEM24xMElKbkpDOEJYWW9mMDFINXZDMnFmTk5uTmlaL0ExTjZnZkRydXNxMytUMTB0K3N5cjR0TDh1MDE0UFFsQW14WlZQZC83OVlsTk1rQk81bmk3dnYvTGJ5SkxnPT1cIjtcblxudmFyIGJhc2U2NERlZmxhdGVkVHJpZSQyID0gXCJlSndCZHcrSThBQVJBQUFBQUFBQUFBRFlZQUZtRDVudzdaMTdqRnhWSGNmdjdzN096TzdNN25RTFJBaGlVU0RFVUcxQUlyWVVGcEJnQ29sWVRhUlZVVVFKaUVGUWc1QTJDQWhxTFNBUFFVd3MvQ0hsTDRyK3dVTmp3YlFTRVN3UVVDRmdGTENvTlFTc1VRS2lJSDdQM0hQbW5qbHozbzk3WjJWK3lTZjNjYzQ5NTNkK3YvTytkMmVYMUxMc1lMQU1IQUZPQnFlQVQ0RFBnbmVEOTBZNG5nN09CbDhDNnh5ZVd3OHVBeHZBTmVDNzRHYXdHV3dCZDRKN05NOWZBQzRHUHdlL0F2ZURSOEFUNEdtd0JQd0YvQTI4RE9iQmYwRjlNZytieFhGUDhGWndJRmdLRGdNcndISGdSUEFoc0FhY0JzNENYd0JmQVY4RjN3QlhndXZCSnJBWmJBRjNncTNnUHZBZ2VBdzhCZjRJZG9IZDRCWHdCcGlzWjlrTTJBdnNCdzRFUzhIaFlDVTRGcXlxNTdxdnhuRU5PSTFlbjRYamVlQkNjQkc0SEZ3QnZrUER2NC9qTGVBMmNBZllXcy9MZlI4OTJ2SWdqZjhZanI4RVQ5SHJ4K254T3ZBTXpoL2ludG5sbUljTnozQnA3c2I1SytBTjBHaGtXUWU4QlN3QkI0Tmw0SWhHZjN4eW5LZjNIZ1lmd1BuSjRCVHdxVVp1cnpOeFBKZkd1WURldXhqSGI0S3JHM2w5bXFmY2lPdE5ZRE80RGR3QnR0Sm43cVBISFRqK2hxYjNWSVBhQ3NjL04vUmxmZEVRenR2NEpjVGRRZS9kRFY3RGRhMlpaZTFtRVhjUG5POUxyMDhDQnpRSDB6dEVjaStVdzVwNTIzTjVaa1VDUFZKek5IUStYcUwzOCtCYVNmd1RhVnpXRmxmamVpMzROSVdQZXlTdGI1L2o3cS9RNkVMcTloZTV1TitteHcxQ3ZBdWJlZi9MNjdxT1B2ZTFwbHh2aGk1c3hJZ1Jmanc4QkRxTUdERml4SWdSSTBhTVdIZ2NPUVE2aUR4SDE3cmZjbGpmcjFUY1g2NTU1bHFrZnozWUJEYURMZUJPY0EvWURoNEFqNElud2JOZ1Z6UGZXOXFONHovQmY4REVWSmExd0J6WUI3eDlLdC9QZVNlT2g0TGw0Rmh3QmkzTFppNy9WYmkvZXFwNmU0OFlNV0xFbXdteWI3a1dmZS83YXNVK2ZWVlViWXNSSTBiRTRRUnV6a3JlYzg2RDA5RFBuQVhPRStaNkZ6ck8vVTZpeDNtYXgxSGdrcW5pZmVvR25GOHRwSG5EVlBGZWg0ZThsN2tKWWJjT3dmenp0VVU1SytkZ0kvQ1RSV1kySU40RGlyZ3Y0UDcraTdOc0RiZ0dQTHE0UC96M0NHL3VrV1Y3Z3pYZ2t1a3Myd2F5VnBZZEF5NGhSM0tQSG5mU0k4ODcybG4ydmJHYzAzSCtnL1pnbkoyNE56NVRYQitIODB2QmRqQTJpM1VCdUhTMlNDY1cyMm1hcitLNHZKT2ZIOS9wajdPdWsrdjAwODZnM2lOR2pCZ3hvaHorWFhFZkhIdjhjV0hGb3Vyem42Kzl1YmtjM0k1NTRGMVRnK3RSOHAzUHZiaS9qWnNuM28velI2YnkrZWdPU1hycys3c242UHFhbkQ4OWxYOVRSOUxiU2RONlhwTGZFcHJtUHhEMk12YzgyemQ5ZmNwdi9VeSttU0xmVEJ3bDBYY1NiYUFKRmswWGMrTzlwL093L1hFOEdDeWI3cy92aU9saUhqNlA4eFBBQjZlTC9GaThqOUo3bjV6T3YvczZBOGZQZ3k5UEQrcS9mcnE0WGtiVHZvdyt2M0hhN01kNXFydk1Qc1IrRDBuQ2lGMnVROW8zZ3B2QkxlQTI4Q1B3WTNBditBVjRDUHdXL0E3c0JMdkFidkFLZUFQVVdrV2FiWnp2Q2ZZRkI0QkR3S0ZnT1RpMk5hakR2ZEJoRmU2dnBtRnJjVHdWbkNHSnkrS2ZnN0R6VzhYMVJUai9PcmdLL0F6WE4rQjRFdzIvRmNmYkZXa1JTUHk3V29NMkk1d3FxVy9kUEJGL08zZ1FQQVllQjM5bzVYdi9mOEx4aFZiKy9PNjYyV2N2SWU2cllBenJoVHBvZ2JsMkViNFB6dmNEQjRGM2dmZTBpN0taT0xLdERpUDZ2YjlkL25wUHJJZDgyRWthZlk2MktLOFBaWmRmeGtjMGZpcUxXR1VoMy9KV2xUOXBiNlFQL0RoblR6Sk9mWWFyVjJmaS9KeDI4YjFzS2p1dWE4cnZuMDkxV2MvcGVIUkUreTlFZE85cFk3RE1zMDZXaWFrTWJHeS9EUFZtbzJPL1BRenZPVnpLZnczS2QwTTdYWi92YW4vMnZlMlZpdkQxM054dms2UXY1Ny9ESjNNdTJieUFoZDlOaitUdm1qWWpyUzNVMTNmZytFT3cxY0gzTDFyOGZjMHhDZjZPWWh0MGZHQUl4alJiSG9XdVR4cm1TcysyKzhjVjJ6cTF6SEx1WGlVcVAvNjEzUi8rOXhKOCtpOWF2MS9uOGlMdk1HUnJUUVpwSTVNeldUWUQ5Z0w3Z1lObThyQ2xNM2JsNS8rdWliVFhqZUR3bWJ6dFA4ZTFJM1orRloyRHIwU2M0MmZ5UHZiRUdYbjdWOWszTlVUM0Q4LzAzK1A3SXRJUHJlVEt2cEgyWTJTOStESE9icGR6ejV4TzB6c2J4eXRxZzJtZmkvdm5XOWg4bUtqS1A2bFoyL3ovTGgvUDY1cHhjVWRKT2d3cnY2NDQvMGNVK3lobEVsb0czZml6RUxoSUdBZGM3Sk5xcmJ5US9MK1FJWFgzYmJXeExwMHNXM0NRL1dYKzNJYXFkUjVXM3V4U3RmMmoxVTM2ZXhZTFF0Y2hob2twM0JTdnc0V2I0dm5xV2JXdEZsbzViSHcyVE1qMFhVajY2OHFra2lwMThkVzVLdjJIdlU1VWFaT3k2NDZ0VkszM1F2Vi9qTFNxc0QrdnQyditLU1JWR1JkS1dXYWIvZFRHSXpBV2tVVjI4YVlhT2MwSmxHTnhmajdlS082NzBLd1Z6M1p0TkUyaE51TGpHbldqTnBuaTBpTzRydE85YmQzcTkyK21TNHZDUkhYdDZzUHVzeHIvc25CZVpHa1FZZjV0VS8rMkpmNWpNazdqTUduVCtNUy9ZbjR5YVRjRzd3MlVTZkJ2TDU2bGYxbjlkbW12NU1qblpldmZnYktVN0Y4eHJuaE9oUGlYMlo3NWx5SHpUMXZoWDE1STI5V0pxanphWnl6OTIrdFh4d28vMStiY3hnRFg5c3Q4cXJ3dXliKzI3VmVFMVczV3BwaVBaZjROSFV1WlRjUzY1Tm8vYS9NWTQ4WVFVSjhvSU5KWUlQMnpxMzhuTGZyblNZdjJLNU5KUlo4UXUzL3VaRVc3RFpuSHNYNjdtN2RGLzZ4cnk2cXhrcDJMOTJUeHhIdksrNWJ6TDFINHRpenJ2OW5ZUEM2MGJVTGRzbjNML0srU0ZPOUZaQ0xPcDIzbTFGMzlEUDZPMlo1ZC9VbmFNL2w5YUJHK1RmSDN4ZXU2b1QzenorbnFGRzhYL2hrWC8rckVaNzJrblpzUGdYOVZjWm13L3RyR3YvdzFPN2Z4cjlqM3lxU25hd1QvZGpvNVBpTDZsOWVwTFA5cXNXeS9CR1ozTmg2cklHTHFqN3MyVmZpTjBXN28ydzV2azlENWxnbFR2K1k2bjdhZGM4dnNFZ09yTkNWcmFkcytYdGFHVmZzakxJd2QyVjZKYkw5RkphNzlOYjkvNGlxeGZlRUxXN2ZiSWdwNW5tK240NDMrZlNweTVOY1doRzc3YnhaeFlxeHJ4RHFwc25FSzI1dnlETEYzZHo5dkxvZUp6TjdNRjBSRWU5ZXpvbC9KSE95dHFxc3A5cWQ1bWhSbFAycTdqK1ZRci9qNjJxRTJGUE1sSnBtdzhIR0tPcWJySnpPUE9zWGFJR3VIWkR3bTlhU3UwbjNPbm03NUhlS25nTFVISGZ6ZXQyd2Q1Vk4zWlZKMUg5L0ZjcjZncWl1eWNaVFVuZTVjbmF3NVp2djdxaDRrYjVkOURhNmY1L2M2WkdVWTZDZDFkWFlzajlPYXlHRngyTFBzUGcrZmxqRXZHK1lHYlNuTGw5Q2srWGYxc0xRZmUxWjhyMk9xNHpMcENPZWh5Tkt4U1Q4TGZENDAvOVRsODBtM0RIaEpuWWR2ZUtyeWl1S3pidTQrSjl5eldZUEV5bDhHbjc5TnVWUGw3eW94N0UvRU8vK3l4bWliZlpRSWV3TE05N3I5RnhGK3JkSGJnNkZqZi9kOEpvZmRsNlZCNWdpbS9SZ0MyeHZxMlQ5d0h6VzBEeWlyLzQ2UmYyejlDVjM3bHRVR0pPM1laWTNNcjVPWnNQdmQ5eDZhTllOdWowTm1UK3MxWmt5YmVPejl1WTUzQS9iejhCa3ZxdlVFdjFla1dtUEkvQ3ZDNXIxSy9SMzJBcVIrVGxpL1pXV1BrcitxWHJCd2lSMjdhMy9aT25yV2IzOUJ0UzlJMnVIQUh0VkUvN044M1FudC8wT2Y1OSs5c0RIUGUveE5VSWRFMjVuOElkNXYxZlRwKzlyVFo2d2hkYkNaRlh0Uk1sekhRV3UvcFJ6TEpPT016QmVrcmZYdG5ZeloyNXZNbTZSNUt2b0cyM3BqR2g5RkdaZy9LR3locTVPNi9wN2Z0MnhPNlBOMkdhZjc2amluYitqOHlUVGVwa3liQ1ArZFYwZTR0bWF4Z09RZXN4Y0o0ODhacWo0MmhuMXQ3V1RhODlYcFk2dHZaampxbmdueGY0cTBiZk96emNOTGwwbFFMNjVqakRVK2V2VEtiYkdHbGRMSW5QOEcyTmQzdklUNjIvU3Rza2xDZEkraHZ5N3RGT0txVTYwZHQ0ektlcHVZVlBtRTJsZ25vZldpTEp2NjZsQjFlR3hiK05wSUoyWFh4OVQxSTlRK3cxUi9YZkpJVVRkY3hVWmYvdjAxdi82c1M5YmgvTi9wcE54L2tyMGJVdGt3MVBkSjE5azZUT3Y5Y2MyYVdiYUdIU3UrdDNhcGM5SCtyalhoWG9YTFBoLzUyeGorK3pLVjlPcC82SDZjei9yVlprMUwwYlZibC8zSTB1dXpoT1pFUWE4Y2lmc1AzVDZPNi92WER0ZGV0SHQ0S3J0RXRybHV6NHpmeStwN1AxSHpIOWRDMm92TzM2eWZ0eXAzUUgzUE1rMzlUTjArTE9xcHVQOG9lLzloa3BCdkZETVAvdzcwUzRHMkdVaERzYTlDd2xyMFhZMzRmVnhzMzZqZURZcjMyWGU2N0poYWRQTTVtN0xLeWlSTGszMVRHYUtYYVc3c0VxNFRiOS96ZHJQdER3eHR5alFla1RLeGJ5UjcrZ2ZPUjF6bXdLRnJIZDg1dDR2dXJtV01yYi91ZnFhSVc2YU92cmFXU1JYNWhwYTNESCtIUEc5VDN0amxDTEdseWE0cHdrMzJzYldUcmZqV0oxTjRTSDBKVGR0R2Y5Zm5iZXlXcWk3R3lNOG5EVm1acTVUWU5nM052eXlkVS9rK2xxNjJFcHBlQ3J1NHBPOGlNZHFLU1ErZGIxUFZIMVVacTZpL0x2NkpXWTlEOGdpMWVZcThYSFNxSXYrcXltL0trNng3SjRWdlk4bVIvNTBxWGxnODhYZmUrdmJrTk5lcFlGTG45cVFIeWo0YnRoYVgyUzltRy9iSnl6WmYzelNIcVYybExJK0x6VndsMUdlK2FjZktJelQvRkQ3d0xXdG9PbjIvaGRYSkdicDNySWI5YnhsMXczc2tVYXpmMndUMHRTYnBmcGZ1ODF2T2tlMXIrdDFsOGc2YmYwY2Eya1k3d3Zrd3R6dXRmMHFvLzZhMm9QTWQrOXNrSXI1L2w4TG5heU5sOWhOaW5iU1JLTCtkbnRDL3JyK0JUdDZmNjc3TElMQy9CZUhmOC9UODVWa3ZlSnZINmt0OSt0Ull2dXFtbFdCOEl2V00rSWg5bjZHeUkvdU9YS2MvMDFHbXE2LytQcy9yMmxyVmJjZ0Y5bmRTeHZGdlF0My9oZFpwMzkrdjVPTU4yRDZ5Ny9sd1ZWd2liTjNLL3ArRENpYmk3LzN6ZlJvVFhWMVQrYVNURGZieFl0NjZiOS82L0dNSU4wbUtldXN6VHJEdkVCbk1UNlo1a1V2OVpyNWlZNDd0NysybTdDTnNiS1VLNzdOWFRXNHpvLzhEKzRkVVpXY2loc3ZLSEhPTlBGQy9CSitMK3NYd3Z5dDgrZGw4eVhldGsvTDdtUmhyTWFQK2p1T3A3WmphcWhXLzQ2Yk52NFIxZUt6eWg5TEwwK0tiTFZPN2RyV2ZidjJYYW15UzlUTUQranZPaGNyZUkyR2lLeHMvWm94TGZKUlMrRDdWUk9yNkxSdGorbjZYWC94bVViSHU3TjIzK0FiVXBmd3lHeWpITGNmdm1mdktPaXVzL1JUenNDckVabDRtalpld3Z1aldFYVk1VzZodFkrOW4rUGFyTG1PRzYzZjJwbStHVlhQRTBQckVoL2ZPUzZ4SHZJajFpWjN6NnlVVzFtMi9uY0orTWVxUHEvMmt0a3U4TjZscmYveTUyTTlwN1JOTHg5YmczTWltcmNkYXgvaElqRHhEZFVtUnY0cyt2dmFOTlVhRytqdTBQc1MyZFl4Nkd5dXRWUHFWbGI2TmhLYmxxczh3K2o2R3ZxYjRaWXRNSi9HYXYrOWpNNXRuZmRLT1ZUZGNmV1NyczIwNEw2bHNGQ0lwL0JVcVpkUWwxN3hVY1ZOSXFNMVQyQ1EwYlJkN2hhWVorbHdNaVZGSFErMG8weWZMK3AvWDFXMVRtNUNscWROTlpYUFZVWmFuVG4rYjlHVFBtOHBuVzM2ZFRYeHRHNnR1Mk9TVE1uOFhpWkZPcVA0cHloL0R0bVg0SW5XK29mNE4xU2UwSEZXMWk5RDhiZXE1YXo2bXVDbjBOdVd0czVlUHhQQm5UUCtIeXY4QUtYUkw2QT09XCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZihvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkZihvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkZihvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGYobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRmKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkZihhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkNShzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5JDIob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuLy8gd2UgbWF5IGJlIHJ1bm5pbmcgaW4gYSBicm93c2VyIHNvIHdlIG1ha2UgYW4gVWludDhBcnJheVxuXG52YXIgaW5kaWNNYWNoaW5lID0gSlNPTi5wYXJzZShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgcGFrby5pbmZsYXRlKGJhc2U2NEFycmF5YnVmZmVyXzIoYmFzZTY0RGVmbGF0ZWRJbmRpY01hY2hpbmUpKSkpO1xudmFyIHVzZURhdGEgPSBKU09OLnBhcnNlKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBwYWtvLmluZmxhdGUoYmFzZTY0QXJyYXlidWZmZXJfMihiYXNlNjREZWZsYXRlZFVzZURhdGEpKSkpO1xudmFyIHRyaWVEYXRhJDIgPSBwYWtvLmluZmxhdGUoYmFzZTY0QXJyYXlidWZmZXJfMihiYXNlNjREZWZsYXRlZFRyaWUkMikpO1xudmFyIGRlY29tcG9zaXRpb25zID0gdXNlRGF0YS5kZWNvbXBvc2l0aW9ucztcbnZhciB0cmllJDIgPSBuZXcgdW5pY29kZVRyaWUodHJpZURhdGEkMik7XG52YXIgc3RhdGVNYWNoaW5lID0gbmV3IGRmYShpbmRpY01hY2hpbmUpO1xuLyoqXG4gKiBUaGUgSW5kaWNTaGFwZXIgc3VwcG9ydHMgaW5kaWMgc2NyaXB0cyBlLmcuIERldmFuYWdhcmksIEthbm5hZGEsIGV0Yy5cbiAqIEJhc2VkIG9uIGNvZGUgZnJvbSBIYXJmYnV6ejogaHR0cHM6Ly9naXRodWIuY29tL2JlaGRhZC9oYXJmYnV6ei9ibG9iL21hc3Rlci9zcmMvaGItb3Qtc2hhcGUtY29tcGxleC1pbmRpYy5jY1xuICovXG5cbnZhciBJbmRpY1NoYXBlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0RlZmF1bHRTaGFwZXIpIHtcbiAgX2luaGVyaXRzTG9vc2UkNShJbmRpY1NoYXBlciwgX0RlZmF1bHRTaGFwZXIpO1xuXG4gIGZ1bmN0aW9uIEluZGljU2hhcGVyKCkge1xuICAgIHJldHVybiBfRGVmYXVsdFNoYXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICBJbmRpY1NoYXBlci5wbGFuRmVhdHVyZXMgPSBmdW5jdGlvbiBwbGFuRmVhdHVyZXMocGxhbikge1xuICAgIHBsYW4uYWRkU3RhZ2Uoc2V0dXBTeWxsYWJsZXMpO1xuICAgIHBsYW4uYWRkU3RhZ2UoWydsb2NsJywgJ2NjbXAnXSk7XG4gICAgcGxhbi5hZGRTdGFnZShpbml0aWFsUmVvcmRlcmluZyk7XG4gICAgcGxhbi5hZGRTdGFnZSgnbnVrdCcpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ2FraG4nKTtcbiAgICBwbGFuLmFkZFN0YWdlKCdycGhmJywgZmFsc2UpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ3JrcmYnKTtcbiAgICBwbGFuLmFkZFN0YWdlKCdwcmVmJywgZmFsc2UpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ2Jsd2YnLCBmYWxzZSk7XG4gICAgcGxhbi5hZGRTdGFnZSgnYWJ2ZicsIGZhbHNlKTtcbiAgICBwbGFuLmFkZFN0YWdlKCdoYWxmJywgZmFsc2UpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ3BzdGYnLCBmYWxzZSk7XG4gICAgcGxhbi5hZGRTdGFnZSgndmF0dScpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ2NqY3QnKTtcbiAgICBwbGFuLmFkZFN0YWdlKCdjZmFyJywgZmFsc2UpO1xuICAgIHBsYW4uYWRkU3RhZ2UoZmluYWxSZW9yZGVyaW5nKTtcbiAgICBwbGFuLmFkZFN0YWdlKHtcbiAgICAgIGxvY2FsOiBbJ2luaXQnXSxcbiAgICAgIGdsb2JhbDogWydwcmVzJywgJ2FidnMnLCAnYmx3cycsICdwc3RzJywgJ2hhbG4nLCAnZGlzdCcsICdhYnZtJywgJ2Jsd20nLCAnY2FsdCcsICdjbGlnJ11cbiAgICB9KTsgLy8gU2V0dXAgdGhlIGluZGljIGNvbmZpZyBmb3IgdGhlIHNlbGVjdGVkIHNjcmlwdFxuXG4gICAgcGxhbi51bmljb2RlU2NyaXB0ID0gZnJvbU9wZW5UeXBlKHBsYW4uc2NyaXB0KTtcbiAgICBwbGFuLmluZGljQ29uZmlnID0gSU5ESUNfQ09ORklHU1twbGFuLnVuaWNvZGVTY3JpcHRdIHx8IElORElDX0NPTkZJR1MuRGVmYXVsdDtcbiAgICBwbGFuLmlzT2xkU3BlYyA9IHBsYW4uaW5kaWNDb25maWcuaGFzT2xkU3BlYyAmJiBwbGFuLnNjcmlwdFtwbGFuLnNjcmlwdC5sZW5ndGggLSAxXSAhPT0gJzInOyAvLyBUT0RPOiB0dXJuIG9mZiBrZXJuIChLaG1lcikgYW5kIGxpZ2EgZmVhdHVyZXMuXG4gIH07XG5cbiAgSW5kaWNTaGFwZXIuYXNzaWduRmVhdHVyZXMgPSBmdW5jdGlvbiBhc3NpZ25GZWF0dXJlcyhwbGFuLCBnbHlwaHMpIHtcbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChpKSB7XG4gICAgICB2YXIgY29kZXBvaW50ID0gZ2x5cGhzW2ldLmNvZGVQb2ludHNbMF07XG4gICAgICB2YXIgZCA9IElORElDX0RFQ09NUE9TSVRJT05TW2NvZGVwb2ludF0gfHwgZGVjb21wb3NpdGlvbnNbY29kZXBvaW50XTtcblxuICAgICAgaWYgKGQpIHtcbiAgICAgICAgdmFyIGRlY29tcG9zZWQgPSBkLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICAgIHZhciBnID0gcGxhbi5mb250LmdseXBoRm9yQ29kZVBvaW50KGMpO1xuICAgICAgICAgIHJldHVybiBuZXcgR2x5cGhJbmZvKHBsYW4uZm9udCwgZy5pZCwgW2NdLCBnbHlwaHNbaV0uZmVhdHVyZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtpLCAxXS5jb25jYXQoZGVjb21wb3NlZCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBEZWNvbXBvc2Ugc3BsaXQgbWF0cmFzXG4gICAgLy8gVE9ETzogZG8gdGhpcyBpbiBhIG1vcmUgZ2VuZXJhbCB1bmljb2RlIG5vcm1hbGl6ZXJcbiAgICBmb3IgKHZhciBpID0gZ2x5cGhzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBfbG9vcChpKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEluZGljU2hhcGVyO1xufShEZWZhdWx0U2hhcGVyKTtcblxuX2RlZmluZVByb3BlcnR5JDIoSW5kaWNTaGFwZXIsIFwiemVyb01hcmtXaWR0aHNcIiwgJ05PTkUnKTtcblxuZnVuY3Rpb24gaW5kaWNDYXRlZ29yeShnbHlwaCkge1xuICByZXR1cm4gdHJpZSQyLmdldChnbHlwaC5jb2RlUG9pbnRzWzBdKSA+PiA4O1xufVxuXG5mdW5jdGlvbiBpbmRpY1Bvc2l0aW9uKGdseXBoKSB7XG4gIHJldHVybiAxIDw8ICh0cmllJDIuZ2V0KGdseXBoLmNvZGVQb2ludHNbMF0pICYgMHhmZik7XG59XG5cbnZhciBJbmRpY0luZm8gPSBmdW5jdGlvbiBJbmRpY0luZm8oY2F0ZWdvcnksIHBvc2l0aW9uLCBzeWxsYWJsZVR5cGUsIHN5bGxhYmxlKSB7XG4gIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICB0aGlzLnN5bGxhYmxlVHlwZSA9IHN5bGxhYmxlVHlwZTtcbiAgdGhpcy5zeWxsYWJsZSA9IHN5bGxhYmxlO1xufTtcblxuZnVuY3Rpb24gc2V0dXBTeWxsYWJsZXMoZm9udCwgZ2x5cGhzKSB7XG4gIHZhciBzeWxsYWJsZSA9IDA7XG4gIHZhciBsYXN0ID0gMDtcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGYoc3RhdGVNYWNoaW5lLm1hdGNoKGdseXBocy5tYXAoaW5kaWNDYXRlZ29yeSkpKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgX3N0ZXAkdmFsdWUgPSBfc3RlcC52YWx1ZSxcbiAgICAgICAgc3RhcnQgPSBfc3RlcCR2YWx1ZVswXSxcbiAgICAgICAgZW5kID0gX3N0ZXAkdmFsdWVbMV0sXG4gICAgICAgIHRhZ3MgPSBfc3RlcCR2YWx1ZVsyXTtcblxuICAgIGlmIChzdGFydCA+IGxhc3QpIHtcbiAgICAgICsrc3lsbGFibGU7XG5cbiAgICAgIGZvciAodmFyIF9pID0gbGFzdDsgX2kgPCBzdGFydDsgX2krKykge1xuICAgICAgICBnbHlwaHNbX2ldLnNoYXBlckluZm8gPSBuZXcgSW5kaWNJbmZvKENBVEVHT1JJRVMuWCwgUE9TSVRJT05TLkVuZCwgJ25vbl9pbmRpY19jbHVzdGVyJywgc3lsbGFibGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgICsrc3lsbGFibGU7IC8vIENyZWF0ZSBzaGFwZXIgaW5mb1xuXG4gICAgZm9yICh2YXIgX2kyID0gc3RhcnQ7IF9pMiA8PSBlbmQ7IF9pMisrKSB7XG4gICAgICBnbHlwaHNbX2kyXS5zaGFwZXJJbmZvID0gbmV3IEluZGljSW5mbygxIDw8IGluZGljQ2F0ZWdvcnkoZ2x5cGhzW19pMl0pLCBpbmRpY1Bvc2l0aW9uKGdseXBoc1tfaTJdKSwgdGFnc1swXSwgc3lsbGFibGUpO1xuICAgIH1cblxuICAgIGxhc3QgPSBlbmQgKyAxO1xuICB9XG5cbiAgaWYgKGxhc3QgPCBnbHlwaHMubGVuZ3RoKSB7XG4gICAgKytzeWxsYWJsZTtcblxuICAgIGZvciAodmFyIGkgPSBsYXN0OyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBnbHlwaHNbaV0uc2hhcGVySW5mbyA9IG5ldyBJbmRpY0luZm8oQ0FURUdPUklFUy5YLCBQT1NJVElPTlMuRW5kLCAnbm9uX2luZGljX2NsdXN0ZXInLCBzeWxsYWJsZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29uc29uYW50KGdseXBoKSB7XG4gIHJldHVybiBnbHlwaC5zaGFwZXJJbmZvLmNhdGVnb3J5ICYgQ09OU09OQU5UX0ZMQUdTO1xufVxuXG5mdW5jdGlvbiBpc0pvaW5lcihnbHlwaCkge1xuICByZXR1cm4gZ2x5cGguc2hhcGVySW5mby5jYXRlZ29yeSAmIEpPSU5FUl9GTEFHUztcbn1cblxuZnVuY3Rpb24gaXNIYWxhbnRPckNvZW5nKGdseXBoKSB7XG4gIHJldHVybiBnbHlwaC5zaGFwZXJJbmZvLmNhdGVnb3J5ICYgSEFMQU5UX09SX0NPRU5HX0ZMQUdTO1xufVxuXG5mdW5jdGlvbiB3b3VsZFN1YnN0aXR1dGUoZ2x5cGhzLCBmZWF0dXJlKSB7XG4gIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGYoZ2x5cGhzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICB2YXIgX2dseXBoJGZlYXR1cmVzO1xuXG4gICAgdmFyIGdseXBoID0gX3N0ZXAyLnZhbHVlO1xuICAgIGdseXBoLmZlYXR1cmVzID0gKF9nbHlwaCRmZWF0dXJlcyA9IHt9LCBfZ2x5cGgkZmVhdHVyZXNbZmVhdHVyZV0gPSB0cnVlLCBfZ2x5cGgkZmVhdHVyZXMpO1xuICB9XG5cbiAgdmFyIEdTVUIgPSBnbHlwaHNbMF0uX2ZvbnQuX2xheW91dEVuZ2luZS5lbmdpbmUuR1NVQlByb2Nlc3NvcjtcbiAgR1NVQi5hcHBseUZlYXR1cmVzKFtmZWF0dXJlXSwgZ2x5cGhzKTtcbiAgcmV0dXJuIGdseXBocy5sZW5ndGggPT09IDE7XG59XG5cbmZ1bmN0aW9uIGNvbnNvbmFudFBvc2l0aW9uKGZvbnQsIGNvbnNvbmFudCwgdmlyYW1hKSB7XG4gIHZhciBnbHlwaHMgPSBbdmlyYW1hLCBjb25zb25hbnQsIHZpcmFtYV07XG5cbiAgaWYgKHdvdWxkU3Vic3RpdHV0ZShnbHlwaHMuc2xpY2UoMCwgMiksICdibHdmJykgfHwgd291bGRTdWJzdGl0dXRlKGdseXBocy5zbGljZSgxLCAzKSwgJ2Jsd2YnKSkge1xuICAgIHJldHVybiBQT1NJVElPTlMuQmVsb3dfQztcbiAgfSBlbHNlIGlmICh3b3VsZFN1YnN0aXR1dGUoZ2x5cGhzLnNsaWNlKDAsIDIpLCAncHN0ZicpIHx8IHdvdWxkU3Vic3RpdHV0ZShnbHlwaHMuc2xpY2UoMSwgMyksICdwc3RmJykpIHtcbiAgICByZXR1cm4gUE9TSVRJT05TLlBvc3RfQztcbiAgfSBlbHNlIGlmICh3b3VsZFN1YnN0aXR1dGUoZ2x5cGhzLnNsaWNlKDAsIDIpLCAncHJlZicpIHx8IHdvdWxkU3Vic3RpdHV0ZShnbHlwaHMuc2xpY2UoMSwgMyksICdwcmVmJykpIHtcbiAgICByZXR1cm4gUE9TSVRJT05TLlBvc3RfQztcbiAgfVxuXG4gIHJldHVybiBQT1NJVElPTlMuQmFzZV9DO1xufVxuXG5mdW5jdGlvbiBpbml0aWFsUmVvcmRlcmluZyhmb250LCBnbHlwaHMsIHBsYW4pIHtcbiAgdmFyIGluZGljQ29uZmlnID0gcGxhbi5pbmRpY0NvbmZpZztcbiAgdmFyIGZlYXR1cmVzID0gZm9udC5fbGF5b3V0RW5naW5lLmVuZ2luZS5HU1VCUHJvY2Vzc29yLmZlYXR1cmVzO1xuICB2YXIgZG90dGVkQ2lyY2xlID0gZm9udC5nbHlwaEZvckNvZGVQb2ludCgweDI1Y2MpLmlkO1xuICB2YXIgdmlyYW1hID0gZm9udC5nbHlwaEZvckNvZGVQb2ludChpbmRpY0NvbmZpZy52aXJhbWEpLmlkO1xuXG4gIGlmICh2aXJhbWEpIHtcbiAgICB2YXIgaW5mbyA9IG5ldyBHbHlwaEluZm8oZm9udCwgdmlyYW1hLCBbaW5kaWNDb25maWcudmlyYW1hXSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdseXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGdseXBoc1tpXS5zaGFwZXJJbmZvLnBvc2l0aW9uID09PSBQT1NJVElPTlMuQmFzZV9DKSB7XG4gICAgICAgIGdseXBoc1tpXS5zaGFwZXJJbmZvLnBvc2l0aW9uID0gY29uc29uYW50UG9zaXRpb24oZm9udCwgZ2x5cGhzW2ldLmNvcHkoKSwgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgc3RhcnQgPSAwLCBlbmQgPSBuZXh0U3lsbGFibGUoZ2x5cGhzLCAwKTsgc3RhcnQgPCBnbHlwaHMubGVuZ3RoOyBzdGFydCA9IGVuZCwgZW5kID0gbmV4dFN5bGxhYmxlKGdseXBocywgc3RhcnQpKSB7XG4gICAgdmFyIF9nbHlwaHMkc3RhcnQkc2hhcGVySSA9IGdseXBoc1tzdGFydF0uc2hhcGVySW5mbyxcbiAgICAgICAgY2F0ZWdvcnkgPSBfZ2x5cGhzJHN0YXJ0JHNoYXBlckkuY2F0ZWdvcnksXG4gICAgICAgIHN5bGxhYmxlVHlwZSA9IF9nbHlwaHMkc3RhcnQkc2hhcGVySS5zeWxsYWJsZVR5cGU7XG5cbiAgICBpZiAoc3lsbGFibGVUeXBlID09PSAnc3ltYm9sX2NsdXN0ZXInIHx8IHN5bGxhYmxlVHlwZSA9PT0gJ25vbl9pbmRpY19jbHVzdGVyJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHN5bGxhYmxlVHlwZSA9PT0gJ2Jyb2tlbl9jbHVzdGVyJyAmJiBkb3R0ZWRDaXJjbGUpIHtcbiAgICAgIHZhciBnID0gbmV3IEdseXBoSW5mbyhmb250LCBkb3R0ZWRDaXJjbGUsIFsweDI1Y2NdKTtcbiAgICAgIGcuc2hhcGVySW5mbyA9IG5ldyBJbmRpY0luZm8oMSA8PCBpbmRpY0NhdGVnb3J5KGcpLCBpbmRpY1Bvc2l0aW9uKGcpLCBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8uc3lsbGFibGVUeXBlLCBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8uc3lsbGFibGUpOyAvLyBJbnNlcnQgYWZ0ZXIgcG9zc2libGUgUmVwaGEuXG5cbiAgICAgIHZhciBfaTMgPSBzdGFydDtcblxuICAgICAgd2hpbGUgKF9pMyA8IGVuZCAmJiBnbHlwaHNbX2kzXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLlJlcGhhKSB7XG4gICAgICAgIF9pMysrO1xuICAgICAgfVxuXG4gICAgICBnbHlwaHMuc3BsaWNlKF9pMysrLCAwLCBnKTtcbiAgICAgIGVuZCsrO1xuICAgIH0gLy8gMS4gRmluZCBiYXNlIGNvbnNvbmFudDpcbiAgICAvL1xuICAgIC8vIFRoZSBzaGFwaW5nIGVuZ2luZSBmaW5kcyB0aGUgYmFzZSBjb25zb25hbnQgb2YgdGhlIHN5bGxhYmxlLCB1c2luZyB0aGVcbiAgICAvLyBmb2xsb3dpbmcgYWxnb3JpdGhtOiBzdGFydGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIHN5bGxhYmxlLCBtb3ZlIGJhY2t3YXJkc1xuICAgIC8vIHVudGlsIGEgY29uc29uYW50IGlzIGZvdW5kIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGJlbG93LWJhc2Ugb3IgcG9zdC1iYXNlXG4gICAgLy8gZm9ybSAocG9zdC1iYXNlIGZvcm1zIGhhdmUgdG8gZm9sbG93IGJlbG93LWJhc2UgZm9ybXMpLCBvciB0aGF0IGlzIG5vdCBhXG4gICAgLy8gcHJlLWJhc2UgcmVvcmRlcmluZyBSYSwgb3IgYXJyaXZlIGF0IHRoZSBmaXJzdCBjb25zb25hbnQuIFRoZSBjb25zb25hbnRcbiAgICAvLyBzdG9wcGVkIGF0IHdpbGwgYmUgdGhlIGJhc2UuXG5cblxuICAgIHZhciBiYXNlID0gZW5kO1xuICAgIHZhciBsaW1pdCA9IHN0YXJ0O1xuICAgIHZhciBoYXNSZXBoID0gZmFsc2U7IC8vIElmIHRoZSBzeWxsYWJsZSBzdGFydHMgd2l0aCBSYSArIEhhbGFudCAoaW4gYSBzY3JpcHQgdGhhdCBoYXMgUmVwaClcbiAgICAvLyBhbmQgaGFzIG1vcmUgdGhhbiBvbmUgY29uc29uYW50LCBSYSBpcyBleGNsdWRlZCBmcm9tIGNhbmRpZGF0ZXMgZm9yXG4gICAgLy8gYmFzZSBjb25zb25hbnRzLlxuXG4gICAgaWYgKGluZGljQ29uZmlnLnJlcGhQb3MgIT09IFBPU0lUSU9OUy5SYV9Ub19CZWNvbWVfUmVwaCAmJiBmZWF0dXJlcy5ycGhmICYmIHN0YXJ0ICsgMyA8PSBlbmQgJiYgKGluZGljQ29uZmlnLnJlcGhNb2RlID09PSAnSW1wbGljaXQnICYmICFpc0pvaW5lcihnbHlwaHNbc3RhcnQgKyAyXSkgfHwgaW5kaWNDb25maWcucmVwaE1vZGUgPT09ICdFeHBsaWNpdCcgJiYgZ2x5cGhzW3N0YXJ0ICsgMl0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5aV0opKSB7XG4gICAgICAvLyBTZWUgaWYgaXQgbWF0Y2hlcyB0aGUgJ3JwaGYnIGZlYXR1cmUuXG4gICAgICB2YXIgX2cgPSBbZ2x5cGhzW3N0YXJ0XS5jb3B5KCksIGdseXBoc1tzdGFydCArIDFdLmNvcHkoKSwgZ2x5cGhzW3N0YXJ0ICsgMl0uY29weSgpXTtcblxuICAgICAgaWYgKHdvdWxkU3Vic3RpdHV0ZShfZy5zbGljZSgwLCAyKSwgJ3JwaGYnKSB8fCBpbmRpY0NvbmZpZy5yZXBoTW9kZSA9PT0gJ0V4cGxpY2l0JyAmJiB3b3VsZFN1YnN0aXR1dGUoX2csICdycGhmJykpIHtcbiAgICAgICAgbGltaXQgKz0gMjtcblxuICAgICAgICB3aGlsZSAobGltaXQgPCBlbmQgJiYgaXNKb2luZXIoZ2x5cGhzW2xpbWl0XSkpIHtcbiAgICAgICAgICBsaW1pdCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgYmFzZSA9IHN0YXJ0O1xuICAgICAgICBoYXNSZXBoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluZGljQ29uZmlnLnJlcGhNb2RlID09PSAnTG9nX1JlcGhhJyAmJiBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuUmVwaGEpIHtcbiAgICAgIGxpbWl0Kys7XG5cbiAgICAgIHdoaWxlIChsaW1pdCA8IGVuZCAmJiBpc0pvaW5lcihnbHlwaHNbbGltaXRdKSkge1xuICAgICAgICBsaW1pdCsrO1xuICAgICAgfVxuXG4gICAgICBiYXNlID0gc3RhcnQ7XG4gICAgICBoYXNSZXBoID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGluZGljQ29uZmlnLmJhc2VQb3MpIHtcbiAgICAgIGNhc2UgJ0xhc3QnOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBzeWxsYWJsZSwgbW92ZSBiYWNrd2FyZHNcbiAgICAgICAgICB2YXIgX2k0ID0gZW5kO1xuICAgICAgICAgIHZhciBzZWVuQmVsb3cgPSBmYWxzZTtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIHZhciBfaW5mbyA9IGdseXBoc1stLV9pNF0uc2hhcGVySW5mbzsgLy8gdW50aWwgYSBjb25zb25hbnQgaXMgZm91bmRcblxuICAgICAgICAgICAgaWYgKGlzQ29uc29uYW50KGdseXBoc1tfaTRdKSkge1xuICAgICAgICAgICAgICAvLyB0aGF0IGRvZXMgbm90IGhhdmUgYSBiZWxvdy1iYXNlIG9yIHBvc3QtYmFzZSBmb3JtXG4gICAgICAgICAgICAgIC8vIChwb3N0LWJhc2UgZm9ybXMgaGF2ZSB0byBmb2xsb3cgYmVsb3ctYmFzZSBmb3JtcyksXG4gICAgICAgICAgICAgIGlmIChfaW5mby5wb3NpdGlvbiAhPT0gUE9TSVRJT05TLkJlbG93X0MgJiYgKF9pbmZvLnBvc2l0aW9uICE9PSBQT1NJVElPTlMuUG9zdF9DIHx8IHNlZW5CZWxvdykpIHtcbiAgICAgICAgICAgICAgICBiYXNlID0gX2k0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9IC8vIG9yIHRoYXQgaXMgbm90IGEgcHJlLWJhc2UgcmVvcmRlcmluZyBSYSxcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gSU1QTEVNRU5UQVRJT04gTk9URVM6XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIE91ciBwcmUtYmFzZSByZW9yZGVyaW5nIFJhJ3MgYXJlIG1hcmtlZCBQT1NfUE9TVF9DLCBzbyB3aWxsIGJlIHNraXBwZWRcbiAgICAgICAgICAgICAgLy8gYnkgdGhlIGxvZ2ljIGFib3ZlIGFscmVhZHkuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIG9yIGFycml2ZSBhdCB0aGUgZmlyc3QgY29uc29uYW50LiBUaGUgY29uc29uYW50IHN0b3BwZWQgYXQgd2lsbFxuICAgICAgICAgICAgICAvLyBiZSB0aGUgYmFzZS5cblxuXG4gICAgICAgICAgICAgIGlmIChfaW5mby5wb3NpdGlvbiA9PT0gUE9TSVRJT05TLkJlbG93X0MpIHtcbiAgICAgICAgICAgICAgICBzZWVuQmVsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYmFzZSA9IF9pNDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPCBfaTQgJiYgX2luZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuWldKICYmIGdseXBoc1tfaTQgLSAxXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLkgpIHtcbiAgICAgICAgICAgICAgLy8gQSBaV0ogYWZ0ZXIgYSBIYWxhbnQgc3RvcHMgdGhlIGJhc2Ugc2VhcmNoLCBhbmQgcmVxdWVzdHMgYW4gZXhwbGljaXRcbiAgICAgICAgICAgICAgLy8gaGFsZiBmb3JtLlxuICAgICAgICAgICAgICAvLyBBIFpXSiBiZWZvcmUgYSBIYWxhbnQsIHJlcXVlc3RzIGEgc3Viam9pbmVkIGZvcm0gaW5zdGVhZCwgYW5kIGhlbmNlXG4gICAgICAgICAgICAgIC8vIHNlYXJjaCBjb250aW51ZXMuICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgZm9yIEJlbmdhbGlcbiAgICAgICAgICAgICAgLy8gc2VxdWVuY2UgUmEsSCxZYSB0aGF0IHNob3VsZCBmb3JtIFlhLVBoYWxhYSBieSBzdWJqb2luaW5nIFlhLlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlIChfaTQgPiBsaW1pdCk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdGaXJzdCc6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgZmlyc3QgY29uc29uYW50IGlzIGFsd2F5cyB0aGUgYmFzZS5cbiAgICAgICAgICBiYXNlID0gc3RhcnQ7IC8vIE1hcmsgYWxsIHN1YnNlcXVlbnQgY29uc29uYW50cyBhcyBiZWxvdy5cblxuICAgICAgICAgIGZvciAodmFyIF9pNSA9IGJhc2UgKyAxOyBfaTUgPCBlbmQ7IF9pNSsrKSB7XG4gICAgICAgICAgICBpZiAoaXNDb25zb25hbnQoZ2x5cGhzW19pNV0pKSB7XG4gICAgICAgICAgICAgIGdseXBoc1tfaTVdLnNoYXBlckluZm8ucG9zaXRpb24gPSBQT1NJVElPTlMuQmVsb3dfQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IC8vIElmIHRoZSBzeWxsYWJsZSBzdGFydHMgd2l0aCBSYSArIEhhbGFudCAoaW4gYSBzY3JpcHQgdGhhdCBoYXMgUmVwaClcbiAgICAvLyBhbmQgaGFzIG1vcmUgdGhhbiBvbmUgY29uc29uYW50LCBSYSBpcyBleGNsdWRlZCBmcm9tIGNhbmRpZGF0ZXMgZm9yXG4gICAgLy8gYmFzZSBjb25zb25hbnRzLlxuICAgIC8vXG4gICAgLy8gIE9ubHkgZG8gdGhpcyBmb3IgdW5mb3JjZWQgUmVwaC4gKGllLiBub3QgZm9yIFJhLEgsWldKKVxuXG5cbiAgICBpZiAoaGFzUmVwaCAmJiBiYXNlID09PSBzdGFydCAmJiBsaW1pdCAtIGJhc2UgPD0gMikge1xuICAgICAgaGFzUmVwaCA9IGZhbHNlO1xuICAgIH0gLy8gMi4gRGVjb21wb3NlIGFuZCByZW9yZGVyIE1hdHJhczpcbiAgICAvL1xuICAgIC8vIEVhY2ggbWF0cmEgYW5kIGFueSBzeWxsYWJsZSBtb2RpZmllciBzaWduIGluIHRoZSBjbHVzdGVyIGFyZSBtb3ZlZCB0byB0aGVcbiAgICAvLyBhcHByb3ByaWF0ZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY29uc29uYW50KHMpIGluIHRoZSBjbHVzdGVyLiBUaGVcbiAgICAvLyBzaGFwaW5nIGVuZ2luZSBkZWNvbXBvc2VzIHR3by0gb3IgdGhyZWUtcGFydCBtYXRyYXMgaW50byB0aGVpciBjb25zdGl0dWVudFxuICAgIC8vIHBhcnRzIGJlZm9yZSBhbnkgcmVwb3NpdGlvbmluZy4gTWF0cmEgY2hhcmFjdGVycyBhcmUgY2xhc3NpZmllZCBieSB3aGljaFxuICAgIC8vIGNvbnNvbmFudCBpbiBhIGNvbmp1bmN0IHRoZXkgaGF2ZSBhZmZpbml0eSBmb3IgYW5kIGFyZSByZW9yZGVyZWQgdG8gdGhlXG4gICAgLy8gZm9sbG93aW5nIHBvc2l0aW9uczpcbiAgICAvL1xuICAgIC8vICAgbyBCZWZvcmUgZmlyc3QgaGFsZiBmb3JtIGluIHRoZSBzeWxsYWJsZVxuICAgIC8vICAgbyBBZnRlciBzdWJqb2luZWQgY29uc29uYW50c1xuICAgIC8vICAgbyBBZnRlciBwb3N0LWZvcm0gY29uc29uYW50XG4gICAgLy8gICBvIEFmdGVyIG1haW4gY29uc29uYW50IChmb3IgYWJvdmUgbWFya3MpXG4gICAgLy9cbiAgICAvLyBJTVBMRU1FTlRBVElPTiBOT1RFUzpcbiAgICAvL1xuICAgIC8vIFRoZSBub3JtYWxpemUoKSByb3V0aW5lIGhhcyBhbHJlYWR5IGRlY29tcG9zZWQgbWF0cmFzIGZvciB1cywgc28gd2UgZG9uJ3RcbiAgICAvLyBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoYXQuXG4gICAgLy8gMy4gIFJlb3JkZXIgbWFya3MgdG8gY2Fub25pY2FsIG9yZGVyOlxuICAgIC8vXG4gICAgLy8gQWRqYWNlbnQgbnVrdGEgYW5kIGhhbGFudCBvciBudWt0YSBhbmQgdmVkaWMgc2lnbiBhcmUgYWx3YXlzIHJlcG9zaXRpb25lZFxuICAgIC8vIGlmIG5lY2Vzc2FyeSwgc28gdGhhdCB0aGUgbnVrdGEgaXMgZmlyc3QuXG4gICAgLy9cbiAgICAvLyBJTVBMRU1FTlRBVElPTiBOT1RFUzpcbiAgICAvL1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gZG8gdGhpczogdGhlIG5vcm1hbGl6ZSgpIHJvdXRpbmUgYWxyZWFkeSBkaWQgdGhpcyBmb3IgdXMuXG4gICAgLy8gUmVvcmRlciBjaGFyYWN0ZXJzXG5cblxuICAgIGZvciAodmFyIF9pNiA9IHN0YXJ0OyBfaTYgPCBiYXNlOyBfaTYrKykge1xuICAgICAgdmFyIF9pbmZvMiA9IGdseXBoc1tfaTZdLnNoYXBlckluZm87XG4gICAgICBfaW5mbzIucG9zaXRpb24gPSBNYXRoLm1pbihQT1NJVElPTlMuUHJlX0MsIF9pbmZvMi5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPCBlbmQpIHtcbiAgICAgIGdseXBoc1tiYXNlXS5zaGFwZXJJbmZvLnBvc2l0aW9uID0gUE9TSVRJT05TLkJhc2VfQztcbiAgICB9IC8vIE1hcmsgZmluYWwgY29uc29uYW50cy4gIEEgZmluYWwgY29uc29uYW50IGlzIG9uZSBhcHBlYXJpbmcgYWZ0ZXIgYSBtYXRyYSxcbiAgICAvLyBsaWtlIGluIEtobWVyLlxuXG5cbiAgICBmb3IgKHZhciBfaTcgPSBiYXNlICsgMTsgX2k3IDwgZW5kOyBfaTcrKykge1xuICAgICAgaWYgKGdseXBoc1tfaTddLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuTSkge1xuICAgICAgICBmb3IgKHZhciBqID0gX2k3ICsgMTsgaiA8IGVuZDsgaisrKSB7XG4gICAgICAgICAgaWYgKGlzQ29uc29uYW50KGdseXBoc1tqXSkpIHtcbiAgICAgICAgICAgIGdseXBoc1tqXS5zaGFwZXJJbmZvLnBvc2l0aW9uID0gUE9TSVRJT05TLkZpbmFsX0M7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IC8vIEhhbmRsZSBiZWdpbm5pbmcgUmFcblxuXG4gICAgaWYgKGhhc1JlcGgpIHtcbiAgICAgIGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5wb3NpdGlvbiA9IFBPU0lUSU9OUy5SYV9Ub19CZWNvbWVfUmVwaDtcbiAgICB9IC8vIEZvciBvbGQtc3R5bGUgSW5kaWMgc2NyaXB0IHRhZ3MsIG1vdmUgdGhlIGZpcnN0IHBvc3QtYmFzZSBIYWxhbnQgYWZ0ZXJcbiAgICAvLyBsYXN0IGNvbnNvbmFudC5cbiAgICAvL1xuICAgIC8vIFJlcG9ydHMgc3VnZ2VzdCB0aGF0IGluIHNvbWUgc2NyaXB0cyBVbmlzY3JpYmUgZG9lcyB0aGlzIG9ubHkgaWYgdGhlcmVcbiAgICAvLyBpcyAqbm90KiBhIEhhbGFudCBhZnRlciBsYXN0IGNvbnNvbmFudCBhbHJlYWR5IChlZy4gS2FubmFkYSksIHdoaWxlIGl0XG4gICAgLy8gZG9lcyBpdCB1bmNvbmRpdGlvbmFsbHkgaW4gb3RoZXIgc2NyaXB0cyAoZWcuIE1hbGF5YWxhbSkuICBXZSBkb24ndFxuICAgIC8vIGN1cnJlbnRseSBrbm93IGFib3V0IG90aGVyIHNjcmlwdHMsIHNvIHdlIHNpbmdsZSBvdXQgTWFsYXlhbGFtIGZvciBub3cuXG4gICAgLy9cbiAgICAvLyBLYW5uYWRhIHRlc3QgY2FzZTpcbiAgICAvLyBVKzBDOUEsVSswQ0NELFUrMEM5QSxVKzBDQ0RcbiAgICAvLyBXaXRoIHNvbWUgdmVyc2lvbnMgb2YgTG9oaXQgS2FubmFkYS5cbiAgICAvLyBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD01OTExOFxuICAgIC8vXG4gICAgLy8gTWFsYXlhbGFtIHRlc3QgY2FzZTpcbiAgICAvLyBVKzBEMzgsVSswRDRELFUrMEQzMSxVKzBENEQsVSswRDMxLFUrMEQ0RFxuICAgIC8vIFdpdGggbG9oaXQtdHRmLTIwMTIxMTIyL0xvaGl0LU1hbGF5YWxhbS50dGZcblxuXG4gICAgaWYgKHBsYW4uaXNPbGRTcGVjKSB7XG4gICAgICB2YXIgZGlzYWxsb3dEb3VibGVIYWxhbnRzID0gcGxhbi51bmljb2RlU2NyaXB0ICE9PSAnTWFsYXlhbGFtJztcblxuICAgICAgZm9yICh2YXIgX2k4ID0gYmFzZSArIDE7IF9pOCA8IGVuZDsgX2k4KyspIHtcbiAgICAgICAgaWYgKGdseXBoc1tfaThdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuSCkge1xuICAgICAgICAgIHZhciBfaiA9IHZvaWQgMDtcblxuICAgICAgICAgIGZvciAoX2ogPSBlbmQgLSAxOyBfaiA+IF9pODsgX2otLSkge1xuICAgICAgICAgICAgaWYgKGlzQ29uc29uYW50KGdseXBoc1tfal0pIHx8IGRpc2FsbG93RG91YmxlSGFsYW50cyAmJiBnbHlwaHNbX2pdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuSCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZ2x5cGhzW19qXS5zaGFwZXJJbmZvLmNhdGVnb3J5ICE9PSBDQVRFR09SSUVTLkggJiYgX2ogPiBfaTgpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgSGFsYW50IHRvIGFmdGVyIGxhc3QgY29uc29uYW50LlxuICAgICAgICAgICAgdmFyIHQgPSBnbHlwaHNbX2k4XTtcbiAgICAgICAgICAgIGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbX2k4LCAwXS5jb25jYXQoZ2x5cGhzLnNwbGljZShfaTggKyAxLCBfaiAtIF9pOCkpKTtcbiAgICAgICAgICAgIGdseXBoc1tfal0gPSB0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBBdHRhY2ggbWlzYyBtYXJrcyB0byBwcmV2aW91cyBjaGFyIHRvIG1vdmUgd2l0aCB0aGVtLlxuXG5cbiAgICB2YXIgbGFzdFBvcyA9IFBPU0lUSU9OUy5TdGFydDtcblxuICAgIGZvciAodmFyIF9pOSA9IHN0YXJ0OyBfaTkgPCBlbmQ7IF9pOSsrKSB7XG4gICAgICB2YXIgX2luZm8zID0gZ2x5cGhzW19pOV0uc2hhcGVySW5mbztcblxuICAgICAgaWYgKF9pbmZvMy5jYXRlZ29yeSAmIChKT0lORVJfRkxBR1MgfCBDQVRFR09SSUVTLk4gfCBDQVRFR09SSUVTLlJTIHwgQ0FURUdPUklFUy5DTSB8IEhBTEFOVF9PUl9DT0VOR19GTEFHUyAmIF9pbmZvMy5jYXRlZ29yeSkpIHtcbiAgICAgICAgX2luZm8zLnBvc2l0aW9uID0gbGFzdFBvcztcblxuICAgICAgICBpZiAoX2luZm8zLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLkggJiYgX2luZm8zLnBvc2l0aW9uID09PSBQT1NJVElPTlMuUHJlX00pIHtcbiAgICAgICAgICAvLyBVbmlzY3JpYmUgZG9lc24ndCBtb3ZlIHRoZSBIYWxhbnQgd2l0aCBMZWZ0IE1hdHJhLlxuICAgICAgICAgIC8vIFRFU1Q6IFUrMDkyQixVKzA5M0YsVSswOTRERVxuICAgICAgICAgIC8vIFdlIGZvbGxvdy4gIFRoaXMgaXMgaW1wb3J0YW50IGZvciB0aGUgU2luaGFsYVxuICAgICAgICAgIC8vIFUrMEREQSBzcGxpdCBtYXRyYSBzaW5jZSBpdCBkZWNvbXBvc2VzIHRvIFUrMEREOSxVKzBEQ0FcbiAgICAgICAgICAvLyB3aGVyZSBVKzBERDkgaXMgYSBsZWZ0IG1hdHJhIGFuZCBVKzBEQ0EgaXMgdGhlIHZpcmFtYS5cbiAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIG1vdmUgdGhlIHZpcmFtYSB3aXRoIHRoZSBsZWZ0IG1hdHJhLlxuICAgICAgICAgIC8vIFRFU1Q6IFUrMEQ5QSxVKzBEREFcbiAgICAgICAgICBmb3IgKHZhciBfajIgPSBfaTk7IF9qMiA+IHN0YXJ0OyBfajItLSkge1xuICAgICAgICAgICAgaWYgKGdseXBoc1tfajIgLSAxXS5zaGFwZXJJbmZvLnBvc2l0aW9uICE9PSBQT1NJVElPTlMuUHJlX00pIHtcbiAgICAgICAgICAgICAgX2luZm8zLnBvc2l0aW9uID0gZ2x5cGhzW19qMiAtIDFdLnNoYXBlckluZm8ucG9zaXRpb247XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChfaW5mbzMucG9zaXRpb24gIT09IFBPU0lUSU9OUy5TTVZEKSB7XG4gICAgICAgIGxhc3RQb3MgPSBfaW5mbzMucG9zaXRpb247XG4gICAgICB9XG4gICAgfSAvLyBGb3IgcG9zdC1iYXNlIGNvbnNvbmFudHMgbGV0IHRoZW0gb3duIGFueXRoaW5nIGJlZm9yZSB0aGVtXG4gICAgLy8gc2luY2UgdGhlIGxhc3QgY29uc29uYW50IG9yIG1hdHJhLlxuXG5cbiAgICB2YXIgbGFzdCA9IGJhc2U7XG5cbiAgICBmb3IgKHZhciBfaTEwID0gYmFzZSArIDE7IF9pMTAgPCBlbmQ7IF9pMTArKykge1xuICAgICAgaWYgKGlzQ29uc29uYW50KGdseXBoc1tfaTEwXSkpIHtcbiAgICAgICAgZm9yICh2YXIgX2ozID0gbGFzdCArIDE7IF9qMyA8IF9pMTA7IF9qMysrKSB7XG4gICAgICAgICAgaWYgKGdseXBoc1tfajNdLnNoYXBlckluZm8ucG9zaXRpb24gPCBQT1NJVElPTlMuU01WRCkge1xuICAgICAgICAgICAgZ2x5cGhzW19qM10uc2hhcGVySW5mby5wb3NpdGlvbiA9IGdseXBoc1tfaTEwXS5zaGFwZXJJbmZvLnBvc2l0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3QgPSBfaTEwO1xuICAgICAgfSBlbHNlIGlmIChnbHlwaHNbX2kxMF0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5NKSB7XG4gICAgICAgIGxhc3QgPSBfaTEwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhcnIgPSBnbHlwaHMuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgYXJyLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLnNoYXBlckluZm8ucG9zaXRpb24gLSBiLnNoYXBlckluZm8ucG9zaXRpb247XG4gICAgfSk7XG4gICAgZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtzdGFydCwgYXJyLmxlbmd0aF0uY29uY2F0KGFycikpOyAvLyBGaW5kIGJhc2UgYWdhaW5cblxuICAgIGZvciAodmFyIF9pMTEgPSBzdGFydDsgX2kxMSA8IGVuZDsgX2kxMSsrKSB7XG4gICAgICBpZiAoZ2x5cGhzW19pMTFdLnNoYXBlckluZm8ucG9zaXRpb24gPT09IFBPU0lUSU9OUy5CYXNlX0MpIHtcbiAgICAgICAgYmFzZSA9IF9pMTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gLy8gU2V0dXAgZmVhdHVyZXMgbm93XG4gICAgLy8gUmVwaFxuXG5cbiAgICBmb3IgKHZhciBfaTEyID0gc3RhcnQ7IF9pMTIgPCBlbmQgJiYgZ2x5cGhzW19pMTJdLnNoYXBlckluZm8ucG9zaXRpb24gPT09IFBPU0lUSU9OUy5SYV9Ub19CZWNvbWVfUmVwaDsgX2kxMisrKSB7XG4gICAgICBnbHlwaHNbX2kxMl0uZmVhdHVyZXMucnBoZiA9IHRydWU7XG4gICAgfSAvLyBQcmUtYmFzZVxuXG5cbiAgICB2YXIgYmx3ZiA9ICFwbGFuLmlzT2xkU3BlYyAmJiBpbmRpY0NvbmZpZy5ibHdmTW9kZSA9PT0gJ1ByZV9BbmRfUG9zdCc7XG5cbiAgICBmb3IgKHZhciBfaTEzID0gc3RhcnQ7IF9pMTMgPCBiYXNlOyBfaTEzKyspIHtcbiAgICAgIGdseXBoc1tfaTEzXS5mZWF0dXJlcy5oYWxmID0gdHJ1ZTtcblxuICAgICAgaWYgKGJsd2YpIHtcbiAgICAgICAgZ2x5cGhzW19pMTNdLmZlYXR1cmVzLmJsd2YgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUG9zdC1iYXNlXG5cblxuICAgIGZvciAodmFyIF9pMTQgPSBiYXNlICsgMTsgX2kxNCA8IGVuZDsgX2kxNCsrKSB7XG4gICAgICBnbHlwaHNbX2kxNF0uZmVhdHVyZXMuYWJ2ZiA9IHRydWU7XG4gICAgICBnbHlwaHNbX2kxNF0uZmVhdHVyZXMucHN0ZiA9IHRydWU7XG4gICAgICBnbHlwaHNbX2kxNF0uZmVhdHVyZXMuYmx3ZiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHBsYW4uaXNPbGRTcGVjICYmIHBsYW4udW5pY29kZVNjcmlwdCA9PT0gJ0RldmFuYWdhcmknKSB7XG4gICAgICAvLyBPbGQtc3BlYyBleWUtbGFzaCBSYSBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nLiAgRnJvbSB0aGVcbiAgICAgIC8vIHNwZWM6XG4gICAgICAvL1xuICAgICAgLy8gXCJUaGUgZmVhdHVyZSAnYmVsb3ctYmFzZSBmb3JtJyBpcyBhcHBsaWVkIHRvIGNvbnNvbmFudHNcbiAgICAgIC8vIGhhdmluZyBiZWxvdy1iYXNlIGZvcm1zIGFuZCBmb2xsb3dpbmcgdGhlIGJhc2UgY29uc29uYW50LlxuICAgICAgLy8gVGhlIGV4Y2VwdGlvbiBpcyB2YXR0dSwgd2hpY2ggbWF5IGFwcGVhciBiZWxvdyBoYWxmIGZvcm1zXG4gICAgICAvLyBhcyB3ZWxsIGFzIGJlbG93IHRoZSBiYXNlIGdseXBoLiBUaGUgZmVhdHVyZSAnYmVsb3ctYmFzZVxuICAgICAgLy8gZm9ybScgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBzdWNoIG9jY3VycmVuY2VzIG9mIFJhIGFzIHdlbGwuXCJcbiAgICAgIC8vXG4gICAgICAvLyBUZXN0IGNhc2U6IFUrMDkyNCxVKzA5NEQsVSswOTMwLFUrMDk0ZCxVKzA5MTVcbiAgICAgIC8vIHdpdGggU2Fuc2tyaXQgMjAwMyBmb250LlxuICAgICAgLy9cbiAgICAgIC8vIEhvd2V2ZXIsIG5vdGUgdGhhdCBSYSxIYWxhbnQsWldKIGlzIHRoZSBjb3JyZWN0IHdheSB0b1xuICAgICAgLy8gcmVxdWVzdCBleWVsYXNoIGZvcm0gb2YgUmEsIHNvIHdlIHdvdWxkYm4ndCBpbmhpYml0IGl0XG4gICAgICAvLyBpbiB0aGF0IHNlcXVlbmNlLlxuICAgICAgLy9cbiAgICAgIC8vIFRlc3QgY2FzZTogVSswOTI0LFUrMDk0RCxVKzA5MzAsVSswOTRkLFUrMjAwRCxVKzA5MTVcbiAgICAgIGZvciAodmFyIF9pMTUgPSBzdGFydDsgX2kxNSArIDEgPCBiYXNlOyBfaTE1KyspIHtcbiAgICAgICAgaWYgKGdseXBoc1tfaTE1XS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLlJhICYmIGdseXBoc1tfaTE1ICsgMV0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5IICYmIChfaTE1ICsgMSA9PT0gYmFzZSB8fCBnbHlwaHNbX2kxNSArIDJdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuWldKKSkge1xuICAgICAgICAgIGdseXBoc1tfaTE1XS5mZWF0dXJlcy5ibHdmID0gdHJ1ZTtcbiAgICAgICAgICBnbHlwaHNbX2kxNSArIDFdLmZlYXR1cmVzLmJsd2YgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZWZMZW4gPSAyO1xuXG4gICAgaWYgKGZlYXR1cmVzLnByZWYgJiYgYmFzZSArIHByZWZMZW4gPCBlbmQpIHtcbiAgICAgIC8vIEZpbmQgYSBIYWxhbnQsUmEgc2VxdWVuY2UgYW5kIG1hcmsgaXQgZm9yIHByZS1iYXNlIHJlb3JkZXJpbmcgcHJvY2Vzc2luZy5cbiAgICAgIGZvciAodmFyIF9pMTYgPSBiYXNlICsgMTsgX2kxNiArIHByZWZMZW4gLSAxIDwgZW5kOyBfaTE2KyspIHtcbiAgICAgICAgdmFyIF9nMiA9IFtnbHlwaHNbX2kxNl0uY29weSgpLCBnbHlwaHNbX2kxNiArIDFdLmNvcHkoKV07XG5cbiAgICAgICAgaWYgKHdvdWxkU3Vic3RpdHV0ZShfZzIsICdwcmVmJykpIHtcbiAgICAgICAgICBmb3IgKHZhciBfajQgPSAwOyBfajQgPCBwcmVmTGVuOyBfajQrKykge1xuICAgICAgICAgICAgZ2x5cGhzW19pMTYrK10uZmVhdHVyZXMucHJlZiA9IHRydWU7XG4gICAgICAgICAgfSAvLyBNYXJrIHRoZSBzdWJzZXF1ZW50IHN0dWZmIHdpdGggJ2NmYXInLiAgVXNlZCBpbiBLaG1lci5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBmZWF0dXJlIHNwZWMuXG4gICAgICAgICAgLy8gVGhpcyBhbGxvd3MgZGlzdGluZ3Vpc2hpbmcgdGhlIGZvbGxvd2luZyBjYXNlcyB3aXRoIE1TIEtobWVyIGZvbnRzOlxuICAgICAgICAgIC8vIFUrMTc4NCxVKzE3RDIsVSsxNzlBLFUrMTdEMixVKzE3ODJcbiAgICAgICAgICAvLyBVKzE3ODQsVSsxN0QyLFUrMTc4MixVKzE3RDIsVSsxNzlBXG5cblxuICAgICAgICAgIGlmIChmZWF0dXJlcy5jZmFyKSB7XG4gICAgICAgICAgICBmb3IgKDsgX2kxNiA8IGVuZDsgX2kxNisrKSB7XG4gICAgICAgICAgICAgIGdseXBoc1tfaTE2XS5mZWF0dXJlcy5jZmFyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gQXBwbHkgWldKL1pXTkogZWZmZWN0c1xuXG5cbiAgICBmb3IgKHZhciBfaTE3ID0gc3RhcnQgKyAxOyBfaTE3IDwgZW5kOyBfaTE3KyspIHtcbiAgICAgIGlmIChpc0pvaW5lcihnbHlwaHNbX2kxN10pKSB7XG4gICAgICAgIHZhciBub25Kb2luZXIgPSBnbHlwaHNbX2kxN10uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5aV05KO1xuICAgICAgICB2YXIgX2o1ID0gX2kxNztcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgX2o1LS07IC8vIFpXSi9aV05KIHNob3VsZCBkaXNhYmxlIENKQ1QuICBUaGV5IGRvIHRoYXQgYnkgc2ltcGx5XG4gICAgICAgICAgLy8gYmVpbmcgdGhlcmUsIHNpbmNlIHdlIGRvbid0IHNraXAgdGhlbSBmb3IgdGhlIENKQ1RcbiAgICAgICAgICAvLyBmZWF0dXJlIChpZS4gRl9NQU5VQUxfWldKKVxuICAgICAgICAgIC8vIEEgWldOSiBkaXNhYmxlcyBIQUxGLlxuXG4gICAgICAgICAgaWYgKG5vbkpvaW5lcikge1xuICAgICAgICAgICAgZGVsZXRlIGdseXBoc1tfajVdLmZlYXR1cmVzLmhhbGY7XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChfajUgPiBzdGFydCAmJiAhaXNDb25zb25hbnQoZ2x5cGhzW19qNV0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluYWxSZW9yZGVyaW5nKGZvbnQsIGdseXBocywgcGxhbikge1xuICB2YXIgaW5kaWNDb25maWcgPSBwbGFuLmluZGljQ29uZmlnO1xuICB2YXIgZmVhdHVyZXMgPSBmb250Ll9sYXlvdXRFbmdpbmUuZW5naW5lLkdTVUJQcm9jZXNzb3IuZmVhdHVyZXM7XG5cbiAgZm9yICh2YXIgc3RhcnQgPSAwLCBlbmQgPSBuZXh0U3lsbGFibGUoZ2x5cGhzLCAwKTsgc3RhcnQgPCBnbHlwaHMubGVuZ3RoOyBzdGFydCA9IGVuZCwgZW5kID0gbmV4dFN5bGxhYmxlKGdseXBocywgc3RhcnQpKSB7XG4gICAgLy8gNC4gRmluYWwgcmVvcmRlcmluZzpcbiAgICAvL1xuICAgIC8vIEFmdGVyIHRoZSBsb2NhbGl6ZWQgZm9ybXMgYW5kIGJhc2ljIHNoYXBpbmcgZm9ybXMgR1NVQiBmZWF0dXJlcyBoYXZlIGJlZW5cbiAgICAvLyBhcHBsaWVkIChzZWUgYmVsb3cpLCB0aGUgc2hhcGluZyBlbmdpbmUgcGVyZm9ybXMgc29tZSBmaW5hbCBnbHlwaFxuICAgIC8vIHJlb3JkZXJpbmcgYmVmb3JlIGFwcGx5aW5nIGFsbCB0aGUgcmVtYWluaW5nIGZvbnQgZmVhdHVyZXMgdG8gdGhlIGVudGlyZVxuICAgIC8vIGNsdXN0ZXIuXG4gICAgdmFyIHRyeVByZWYgPSAhIWZlYXR1cmVzLnByZWY7IC8vIEZpbmQgYmFzZSBhZ2FpblxuXG4gICAgdmFyIGJhc2UgPSBzdGFydDtcblxuICAgIGZvciAoOyBiYXNlIDwgZW5kOyBiYXNlKyspIHtcbiAgICAgIGlmIChnbHlwaHNbYmFzZV0uc2hhcGVySW5mby5wb3NpdGlvbiA+PSBQT1NJVElPTlMuQmFzZV9DKSB7XG4gICAgICAgIGlmICh0cnlQcmVmICYmIGJhc2UgKyAxIDwgZW5kKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IGJhc2UgKyAxOyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnbHlwaHNbaV0uZmVhdHVyZXMucHJlZikge1xuICAgICAgICAgICAgICBpZiAoIShnbHlwaHNbaV0uc3Vic3RpdHV0ZWQgJiYgZ2x5cGhzW2ldLmlzTGlnYXRlZCAmJiAhZ2x5cGhzW2ldLmlzTXVsdGlwbGllZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBPaywgdGhpcyB3YXMgYSAncHJlZicgY2FuZGlkYXRlIGJ1dCBkaWRuJ3QgZm9ybSBhbnkuXG4gICAgICAgICAgICAgICAgLy8gQmFzZSBpcyBhcm91bmQgaGVyZS4uLlxuICAgICAgICAgICAgICAgIGJhc2UgPSBpO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGJhc2UgPCBlbmQgJiYgaXNIYWxhbnRPckNvZW5nKGdseXBoc1tiYXNlXSkpIHtcbiAgICAgICAgICAgICAgICAgIGJhc2UrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBnbHlwaHNbYmFzZV0uc2hhcGVySW5mby5wb3NpdGlvbiA9IFBPU0lUSU9OUy5CQVNFX0M7XG4gICAgICAgICAgICAgICAgdHJ5UHJlZiA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIEZvciBNYWxheWFsYW0sIHNraXAgb3ZlciB1bmZvcm1lZCBiZWxvdy0gKGJ1dCBOT1QgcG9zdC0pIGZvcm1zLlxuXG5cbiAgICAgICAgaWYgKHBsYW4udW5pY29kZVNjcmlwdCA9PT0gJ01hbGF5YWxhbScpIHtcbiAgICAgICAgICBmb3IgKHZhciBfaTE4ID0gYmFzZSArIDE7IF9pMTggPCBlbmQ7IF9pMTgrKykge1xuICAgICAgICAgICAgd2hpbGUgKF9pMTggPCBlbmQgJiYgaXNKb2luZXIoZ2x5cGhzW19pMThdKSkge1xuICAgICAgICAgICAgICBfaTE4Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfaTE4ID09PSBlbmQgfHwgIWlzSGFsYW50T3JDb2VuZyhnbHlwaHNbX2kxOF0pKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfaTE4Kys7IC8vIFNraXAgaGFsYW50LlxuXG4gICAgICAgICAgICB3aGlsZSAoX2kxOCA8IGVuZCAmJiBpc0pvaW5lcihnbHlwaHNbX2kxOF0pKSB7XG4gICAgICAgICAgICAgIF9pMTgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKF9pMTggPCBlbmQgJiYgaXNDb25zb25hbnQoZ2x5cGhzW19pMThdKSAmJiBnbHlwaHNbX2kxOF0uc2hhcGVySW5mby5wb3NpdGlvbiA9PT0gUE9TSVRJT05TLkJlbG93X0MpIHtcbiAgICAgICAgICAgICAgYmFzZSA9IF9pMTg7XG4gICAgICAgICAgICAgIGdseXBoc1tiYXNlXS5zaGFwZXJJbmZvLnBvc2l0aW9uID0gUE9TSVRJT05TLkJhc2VfQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnQgPCBiYXNlICYmIGdseXBoc1tiYXNlXS5zaGFwZXJJbmZvLnBvc2l0aW9uID4gUE9TSVRJT05TLkJhc2VfQykge1xuICAgICAgICAgIGJhc2UtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiYXNlID09PSBlbmQgJiYgc3RhcnQgPCBiYXNlICYmIGdseXBoc1tiYXNlIC0gMV0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5aV0opIHtcbiAgICAgIGJhc2UtLTtcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA8IGVuZCkge1xuICAgICAgd2hpbGUgKHN0YXJ0IDwgYmFzZSAmJiBnbHlwaHNbYmFzZV0uc2hhcGVySW5mby5jYXRlZ29yeSAmIChDQVRFR09SSUVTLk4gfCBIQUxBTlRfT1JfQ09FTkdfRkxBR1MpKSB7XG4gICAgICAgIGJhc2UtLTtcbiAgICAgIH1cbiAgICB9IC8vIG8gUmVvcmRlciBtYXRyYXM6XG4gICAgLy9cbiAgICAvLyBJZiBhIHByZS1iYXNlIG1hdHJhIGNoYXJhY3RlciBoYWQgYmVlbiByZW9yZGVyZWQgYmVmb3JlIGFwcGx5aW5nIGJhc2ljXG4gICAgLy8gZmVhdHVyZXMsIHRoZSBnbHlwaCBjYW4gYmUgbW92ZWQgY2xvc2VyIHRvIHRoZSBtYWluIGNvbnNvbmFudCBiYXNlZCBvblxuICAgIC8vIHdoZXRoZXIgaGFsZi1mb3JtcyBoYWQgYmVlbiBmb3JtZWQuIEFjdHVhbCBwb3NpdGlvbiBmb3IgdGhlIG1hdHJhIGlzXG4gICAgLy8gZGVmaW5lZCBhcyDigJxhZnRlciBsYXN0IHN0YW5kYWxvbmUgaGFsYW50IGdseXBoLCBhZnRlciBpbml0aWFsIG1hdHJhXG4gICAgLy8gcG9zaXRpb24gYW5kIGJlZm9yZSB0aGUgbWFpbiBjb25zb25hbnTigJ0uIElmIFpXSiBvciBaV05KIGZvbGxvdyB0aGlzXG4gICAgLy8gaGFsYW50LCBwb3NpdGlvbiBpcyBtb3ZlZCBhZnRlciBpdC5cbiAgICAvL1xuXG5cbiAgICBpZiAoc3RhcnQgKyAxIDwgZW5kICYmIHN0YXJ0IDwgYmFzZSkge1xuICAgICAgLy8gT3RoZXJ3aXNlIHRoZXJlIGNhbid0IGJlIGFueSBwcmUtYmFzZSBtYXRyYSBjaGFyYWN0ZXJzLlxuICAgICAgLy8gSWYgd2UgbG9zdCB0cmFjayBvZiBiYXNlLCBhbGFzLCBwb3NpdGlvbiBiZWZvcmUgbGFzdCB0aGluZ3kuXG4gICAgICB2YXIgbmV3UG9zID0gYmFzZSA9PT0gZW5kID8gYmFzZSAtIDIgOiBiYXNlIC0gMTsgLy8gTWFsYXlhbGFtIC8gVGFtaWwgZG8gbm90IGhhdmUgXCJoYWxmXCIgZm9ybXMgb3IgZXhwbGljaXQgdmlyYW1hIGZvcm1zLlxuICAgICAgLy8gVGhlIGdseXBocyBmb3JtZWQgYnkgJ2hhbGYnIGFyZSBDaGlsbHVzIG9yIGxpZ2F0ZWQgZXhwbGljaXQgdmlyYW1hcy5cbiAgICAgIC8vIFdlIHdhbnQgdG8gcG9zaXRpb24gbWF0cmEgYWZ0ZXIgdGhlbS5cblxuICAgICAgaWYgKHBsYW4udW5pY29kZVNjcmlwdCAhPT0gJ01hbGF5YWxhbScgJiYgcGxhbi51bmljb2RlU2NyaXB0ICE9PSAnVGFtaWwnKSB7XG4gICAgICAgIHdoaWxlIChuZXdQb3MgPiBzdGFydCAmJiAhKGdseXBoc1tuZXdQb3NdLnNoYXBlckluZm8uY2F0ZWdvcnkgJiAoQ0FURUdPUklFUy5NIHwgSEFMQU5UX09SX0NPRU5HX0ZMQUdTKSkpIHtcbiAgICAgICAgICBuZXdQb3MtLTtcbiAgICAgICAgfSAvLyBJZiB3ZSBmb3VuZCBubyBIYWxhbnQgd2UgYXJlIGRvbmUuXG4gICAgICAgIC8vIE90aGVyd2lzZSBvbmx5IHByb2NlZWQgaWYgdGhlIEhhbGFudCBkb2VzXG4gICAgICAgIC8vIG5vdCBiZWxvbmcgdG8gdGhlIE1hdHJhIGl0c2VsZiFcblxuXG4gICAgICAgIGlmIChpc0hhbGFudE9yQ29lbmcoZ2x5cGhzW25ld1Bvc10pICYmIGdseXBoc1tuZXdQb3NdLnNoYXBlckluZm8ucG9zaXRpb24gIT09IFBPU0lUSU9OUy5QcmVfTSkge1xuICAgICAgICAgIC8vIElmIFpXSiBvciBaV05KIGZvbGxvdyB0aGlzIGhhbGFudCwgcG9zaXRpb24gaXMgbW92ZWQgYWZ0ZXIgaXQuXG4gICAgICAgICAgaWYgKG5ld1BvcyArIDEgPCBlbmQgJiYgaXNKb2luZXIoZ2x5cGhzW25ld1BvcyArIDFdKSkge1xuICAgICAgICAgICAgbmV3UG9zKys7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1BvcyA9IHN0YXJ0OyAvLyBObyBtb3ZlLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydCA8IG5ld1BvcyAmJiBnbHlwaHNbbmV3UG9zXS5zaGFwZXJJbmZvLnBvc2l0aW9uICE9PSBQT1NJVElPTlMuUHJlX00pIHtcbiAgICAgICAgLy8gTm93IGdvIHNlZSBpZiB0aGVyZSdzIGFjdHVhbGx5IGFueSBtYXRyYXMuLi5cbiAgICAgICAgZm9yICh2YXIgX2kxOSA9IG5ld1BvczsgX2kxOSA+IHN0YXJ0OyBfaTE5LS0pIHtcbiAgICAgICAgICBpZiAoZ2x5cGhzW19pMTkgLSAxXS5zaGFwZXJJbmZvLnBvc2l0aW9uID09PSBQT1NJVElPTlMuUHJlX00pIHtcbiAgICAgICAgICAgIHZhciBvbGRQb3MgPSBfaTE5IC0gMTtcblxuICAgICAgICAgICAgaWYgKG9sZFBvcyA8IGJhc2UgJiYgYmFzZSA8PSBuZXdQb3MpIHtcbiAgICAgICAgICAgICAgLy8gU2hvdWxkbid0IGFjdHVhbGx5IGhhcHBlbi5cbiAgICAgICAgICAgICAgYmFzZS0tO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdG1wID0gZ2x5cGhzW29sZFBvc107XG4gICAgICAgICAgICBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW29sZFBvcywgMF0uY29uY2F0KGdseXBocy5zcGxpY2Uob2xkUG9zICsgMSwgbmV3UG9zIC0gb2xkUG9zKSkpO1xuICAgICAgICAgICAgZ2x5cGhzW25ld1Bvc10gPSB0bXA7XG4gICAgICAgICAgICBuZXdQb3MtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIG8gUmVvcmRlciByZXBoOlxuICAgIC8vXG4gICAgLy8gUmVwaOKAmXMgb3JpZ2luYWwgcG9zaXRpb24gaXMgYWx3YXlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN5bGxhYmxlLFxuICAgIC8vIChpLmUuIGl0IGlzIG5vdCByZW9yZGVyZWQgYXQgdGhlIGNoYXJhY3RlciByZW9yZGVyaW5nIHN0YWdlKS4gSG93ZXZlcixcbiAgICAvLyBpdCB3aWxsIGJlIHJlb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlIGJhc2ljLWZvcm1zIHNoYXBpbmcgcmVzdWx0cy5cbiAgICAvLyBQb3NzaWJsZSBwb3NpdGlvbnMgZm9yIHJlcGgsIGRlcGVuZGluZyBvbiB0aGUgc2NyaXB0LCBhcmU7IGFmdGVyIG1haW4sXG4gICAgLy8gYmVmb3JlIHBvc3QtYmFzZSBjb25zb25hbnQgZm9ybXMsIGFuZCBhZnRlciBwb3N0LWJhc2UgY29uc29uYW50IGZvcm1zLlxuICAgIC8vIFR3byBjYXNlczpcbiAgICAvL1xuICAgIC8vIC0gSWYgcmVwaGEgaXMgZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgKFJhLEggb3IgUmEsSCxaV0opLCB0aGVuXG4gICAgLy8gICB3ZSBzaG91bGQgb25seSBtb3ZlIGl0IGlmIHRoZSBzZXF1ZW5jZSBsaWdhdGVkIHRvIHRoZSByZXBoYSBmb3JtLlxuICAgIC8vXG4gICAgLy8gLSBJZiByZXBoYSBpcyBlbmNvZGVkIHNlcGFyYXRlbHkgYW5kIGluIHRoZSBsb2dpY2FsIHBvc2l0aW9uLCB3ZSBzaG91bGQgb25seVxuICAgIC8vICAgbW92ZSBpdCBpZiBpdCBkaWQgTk9UIGxpZ2F0ZS4gIElmIGl0IGxpZ2F0ZWQsIGl0J3MgcHJvYmFibHkgdGhlIGZvbnQgdHJ5aW5nXG4gICAgLy8gICB0byBtYWtlIGl0IHdvcmsgd2l0aG91dCB0aGUgcmVvcmRlcmluZy5cblxuXG4gICAgaWYgKHN0YXJ0ICsgMSA8IGVuZCAmJiBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8ucG9zaXRpb24gPT09IFBPU0lUSU9OUy5SYV9Ub19CZWNvbWVfUmVwaCAmJiBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuUmVwaGEgIT09IChnbHlwaHNbc3RhcnRdLmlzTGlnYXRlZCAmJiAhZ2x5cGhzW3N0YXJ0XS5pc011bHRpcGxpZWQpKSB7XG4gICAgICB2YXIgbmV3UmVwaFBvcyA9IHZvaWQgMDtcbiAgICAgIHZhciByZXBoUG9zID0gaW5kaWNDb25maWcucmVwaFBvcztcbiAgICAgIHZhciBmb3VuZCA9IGZhbHNlOyAvLyAxLiBJZiByZXBoIHNob3VsZCBiZSBwb3NpdGlvbmVkIGFmdGVyIHBvc3QtYmFzZSBjb25zb25hbnQgZm9ybXMsXG4gICAgICAvLyAgICBwcm9jZWVkIHRvIHN0ZXAgNS5cblxuICAgICAgaWYgKHJlcGhQb3MgIT09IFBPU0lUSU9OUy5BZnRlcl9Qb3N0KSB7XG4gICAgICAgIC8vICAyLiBJZiB0aGUgcmVwaCByZXBvc2l0aW9uaW5nIGNsYXNzIGlzIG5vdCBhZnRlciBwb3N0LWJhc2U6IHRhcmdldFxuICAgICAgICAvLyAgICAgcG9zaXRpb24gaXMgYWZ0ZXIgdGhlIGZpcnN0IGV4cGxpY2l0IGhhbGFudCBnbHlwaCBiZXR3ZWVuIHRoZVxuICAgICAgICAvLyAgICAgZmlyc3QgcG9zdC1yZXBoIGNvbnNvbmFudCBhbmQgbGFzdCBtYWluIGNvbnNvbmFudC4gSWYgWldKIG9yIFpXTkpcbiAgICAgICAgLy8gICAgIGFyZSBmb2xsb3dpbmcgdGhpcyBoYWxhbnQsIHBvc2l0aW9uIGlzIG1vdmVkIGFmdGVyIGl0LiBJZiBzdWNoXG4gICAgICAgIC8vICAgICBwb3NpdGlvbiBpcyBmb3VuZCwgdGhpcyBpcyB0aGUgdGFyZ2V0IHBvc2l0aW9uLiBPdGhlcndpc2UsXG4gICAgICAgIC8vICAgICBwcm9jZWVkIHRvIHRoZSBuZXh0IHN0ZXAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICBOb3RlOiBpbiBvbGQtaW1wbGVtZW50YXRpb24gZm9udHMsIHdoZXJlIGNsYXNzaWZpY2F0aW9ucyB3ZXJlXG4gICAgICAgIC8vICAgICBmaXhlZCBpbiBzaGFwaW5nIGVuZ2luZSwgdGhlcmUgd2FzIG5vIGNhc2Ugd2hlcmUgcmVwaCBwb3NpdGlvblxuICAgICAgICAvLyAgICAgd2lsbCBiZSBmb3VuZCBvbiB0aGlzIHN0ZXAuXG4gICAgICAgIG5ld1JlcGhQb3MgPSBzdGFydCArIDE7XG5cbiAgICAgICAgd2hpbGUgKG5ld1JlcGhQb3MgPCBiYXNlICYmICFpc0hhbGFudE9yQ29lbmcoZ2x5cGhzW25ld1JlcGhQb3NdKSkge1xuICAgICAgICAgIG5ld1JlcGhQb3MrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdSZXBoUG9zIDwgYmFzZSAmJiBpc0hhbGFudE9yQ29lbmcoZ2x5cGhzW25ld1JlcGhQb3NdKSkge1xuICAgICAgICAgIC8vIC0+SWYgWldKIG9yIFpXTkogYXJlIGZvbGxvd2luZyB0aGlzIGhhbGFudCwgcG9zaXRpb24gaXMgbW92ZWQgYWZ0ZXIgaXQuXG4gICAgICAgICAgaWYgKG5ld1JlcGhQb3MgKyAxIDwgYmFzZSAmJiBpc0pvaW5lcihnbHlwaHNbbmV3UmVwaFBvcyArIDFdKSkge1xuICAgICAgICAgICAgbmV3UmVwaFBvcysrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfSAvLyAzLiBJZiByZXBoIHNob3VsZCBiZSByZXBvc2l0aW9uZWQgYWZ0ZXIgdGhlIG1haW4gY29uc29uYW50OiBmaW5kIHRoZVxuICAgICAgICAvLyAgICBmaXJzdCBjb25zb25hbnQgbm90IGxpZ2F0ZWQgd2l0aCBtYWluLCBvciBmaW5kIHRoZSBmaXJzdFxuICAgICAgICAvLyAgICBjb25zb25hbnQgdGhhdCBpcyBub3QgYSBwb3RlbnRpYWwgcHJlLWJhc2UgcmVvcmRlcmluZyBSYS5cblxuXG4gICAgICAgIGlmICghZm91bmQgJiYgcmVwaFBvcyA9PT0gUE9TSVRJT05TLkFmdGVyX01haW4pIHtcbiAgICAgICAgICBuZXdSZXBoUG9zID0gYmFzZTtcblxuICAgICAgICAgIHdoaWxlIChuZXdSZXBoUG9zICsgMSA8IGVuZCAmJiBnbHlwaHNbbmV3UmVwaFBvcyArIDFdLnNoYXBlckluZm8ucG9zaXRpb24gPD0gUE9TSVRJT05TLkFmdGVyX01haW4pIHtcbiAgICAgICAgICAgIG5ld1JlcGhQb3MrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3VuZCA9IG5ld1JlcGhQb3MgPCBlbmQ7XG4gICAgICAgIH0gLy8gNC4gSWYgcmVwaCBzaG91bGQgYmUgcG9zaXRpb25lZCBiZWZvcmUgcG9zdC1iYXNlIGNvbnNvbmFudCwgZmluZFxuICAgICAgICAvLyAgICBmaXJzdCBwb3N0LWJhc2UgY2xhc3NpZmllZCBjb25zb25hbnQgbm90IGxpZ2F0ZWQgd2l0aCBtYWluLiBJZiBub1xuICAgICAgICAvLyAgICBjb25zb25hbnQgaXMgZm91bmQsIHRoZSB0YXJnZXQgcG9zaXRpb24gc2hvdWxkIGJlIGJlZm9yZSB0aGVcbiAgICAgICAgLy8gICAgZmlyc3QgbWF0cmEsIHN5bGxhYmxlIG1vZGlmaWVyIHNpZ24gb3IgdmVkaWMgc2lnbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBpcyBvdXIgdGFrZSBvbiB3aGF0IHN0ZXAgNCBpcyB0cnlpbmcgdG8gc2F5IChhbmQgZmFpbGluZywgQkFETFkpLlxuXG5cbiAgICAgICAgaWYgKCFmb3VuZCAmJiByZXBoUG9zID09PSBQT1NJVElPTlMuQWZ0ZXJfU3ViKSB7XG4gICAgICAgICAgbmV3UmVwaFBvcyA9IGJhc2U7XG5cbiAgICAgICAgICB3aGlsZSAobmV3UmVwaFBvcyArIDEgPCBlbmQgJiYgIShnbHlwaHNbbmV3UmVwaFBvcyArIDFdLnNoYXBlckluZm8ucG9zaXRpb24gJiAoUE9TSVRJT05TLlBvc3RfQyB8IFBPU0lUSU9OUy5BZnRlcl9Qb3N0IHwgUE9TSVRJT05TLlNNVkQpKSkge1xuICAgICAgICAgICAgbmV3UmVwaFBvcysrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvdW5kID0gbmV3UmVwaFBvcyA8IGVuZDtcbiAgICAgICAgfVxuICAgICAgfSAvLyAgNS4gSWYgbm8gY29uc29uYW50IGlzIGZvdW5kIGluIHN0ZXBzIDMgb3IgNCwgbW92ZSByZXBoIHRvIGEgcG9zaXRpb25cbiAgICAgIC8vICAgICBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGZpcnN0IHBvc3QtYmFzZSBtYXRyYSwgc3lsbGFibGUgbW9kaWZpZXJcbiAgICAgIC8vICAgICBzaWduIG9yIHZlZGljIHNpZ24gdGhhdCBoYXMgYSByZW9yZGVyaW5nIGNsYXNzIGFmdGVyIHRoZSBpbnRlbmRlZFxuICAgICAgLy8gICAgIHJlcGggcG9zaXRpb24uIEZvciBleGFtcGxlLCBpZiB0aGUgcmVvcmRlcmluZyBwb3NpdGlvbiBmb3IgcmVwaFxuICAgICAgLy8gICAgIGlzIHBvc3QtbWFpbiwgaXQgd2lsbCBza2lwIGFib3ZlLWJhc2UgbWF0cmFzIHRoYXQgYWxzbyBoYXZlIGFcbiAgICAgIC8vICAgICBwb3N0LW1haW4gcG9zaXRpb24uXG5cblxuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAvLyBDb3BpZWQgZnJvbSBzdGVwIDIuXG4gICAgICAgIG5ld1JlcGhQb3MgPSBzdGFydCArIDE7XG5cbiAgICAgICAgd2hpbGUgKG5ld1JlcGhQb3MgPCBiYXNlICYmICFpc0hhbGFudE9yQ29lbmcoZ2x5cGhzW25ld1JlcGhQb3NdKSkge1xuICAgICAgICAgIG5ld1JlcGhQb3MrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdSZXBoUG9zIDwgYmFzZSAmJiBpc0hhbGFudE9yQ29lbmcoZ2x5cGhzW25ld1JlcGhQb3NdKSkge1xuICAgICAgICAgIC8vIC0+SWYgWldKIG9yIFpXTkogYXJlIGZvbGxvd2luZyB0aGlzIGhhbGFudCwgcG9zaXRpb24gaXMgbW92ZWQgYWZ0ZXIgaXQuXG4gICAgICAgICAgaWYgKG5ld1JlcGhQb3MgKyAxIDwgYmFzZSAmJiBpc0pvaW5lcihnbHlwaHNbbmV3UmVwaFBvcyArIDFdKSkge1xuICAgICAgICAgICAgbmV3UmVwaFBvcysrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyA2LiBPdGhlcndpc2UsIHJlb3JkZXIgcmVwaCB0byB0aGUgZW5kIG9mIHRoZSBzeWxsYWJsZS5cblxuXG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIG5ld1JlcGhQb3MgPSBlbmQgLSAxO1xuXG4gICAgICAgIHdoaWxlIChuZXdSZXBoUG9zID4gc3RhcnQgJiYgZ2x5cGhzW25ld1JlcGhQb3NdLnNoYXBlckluZm8ucG9zaXRpb24gPT09IFBPU0lUSU9OUy5TTVZEKSB7XG4gICAgICAgICAgbmV3UmVwaFBvcy0tO1xuICAgICAgICB9IC8vIElmIHRoZSBSZXBoIGlzIHRvIGJlIGVuZGluZyB1cCBhZnRlciBhIE1hdHJhLEhhbGFudCBzZXF1ZW5jZSxcbiAgICAgICAgLy8gcG9zaXRpb24gaXQgYmVmb3JlIHRoYXQgSGFsYW50IHNvIGl0IGNhbiBpbnRlcmFjdCB3aXRoIHRoZSBNYXRyYS5cbiAgICAgICAgLy8gSG93ZXZlciwgaWYgaXQncyBhIHBsYWluIENvbnNvbmFudCxIYWxhbnQgd2Ugc2hvdWxkbid0IGRvIHRoYXQuXG4gICAgICAgIC8vIFVuaXNjcmliZSBkb2Vzbid0IGRvIHRoaXMuXG4gICAgICAgIC8vIFRFU1Q6IFUrMDkzMCxVKzA5NEQsVSswOTE1LFUrMDk0QixVKzA5NERcblxuXG4gICAgICAgIGlmIChpc0hhbGFudE9yQ29lbmcoZ2x5cGhzW25ld1JlcGhQb3NdKSkge1xuICAgICAgICAgIGZvciAodmFyIF9pMjAgPSBiYXNlICsgMTsgX2kyMCA8IG5ld1JlcGhQb3M7IF9pMjArKykge1xuICAgICAgICAgICAgaWYgKGdseXBoc1tfaTIwXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLk0pIHtcbiAgICAgICAgICAgICAgbmV3UmVwaFBvcy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgcmVwaCA9IGdseXBoc1tzdGFydF07XG4gICAgICBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW3N0YXJ0LCAwXS5jb25jYXQoZ2x5cGhzLnNwbGljZShzdGFydCArIDEsIG5ld1JlcGhQb3MgLSBzdGFydCkpKTtcbiAgICAgIGdseXBoc1tuZXdSZXBoUG9zXSA9IHJlcGg7XG5cbiAgICAgIGlmIChzdGFydCA8IGJhc2UgJiYgYmFzZSA8PSBuZXdSZXBoUG9zKSB7XG4gICAgICAgIGJhc2UtLTtcbiAgICAgIH1cbiAgICB9IC8vIG8gUmVvcmRlciBwcmUtYmFzZSByZW9yZGVyaW5nIGNvbnNvbmFudHM6XG4gICAgLy9cbiAgICAvLyBJZiBhIHByZS1iYXNlIHJlb3JkZXJpbmcgY29uc29uYW50IGlzIGZvdW5kLCByZW9yZGVyIGl0IGFjY29yZGluZyB0b1xuICAgIC8vIHRoZSBmb2xsb3dpbmcgcnVsZXM6XG5cblxuICAgIGlmICh0cnlQcmVmICYmIGJhc2UgKyAxIDwgZW5kKSB7XG4gICAgICBmb3IgKHZhciBfaTIxID0gYmFzZSArIDE7IF9pMjEgPCBlbmQ7IF9pMjErKykge1xuICAgICAgICBpZiAoZ2x5cGhzW19pMjFdLmZlYXR1cmVzLnByZWYpIHtcbiAgICAgICAgICAvLyAxLiBPbmx5IHJlb3JkZXIgYSBnbHlwaCBwcm9kdWNlZCBieSBzdWJzdGl0dXRpb24gZHVyaW5nIGFwcGxpY2F0aW9uXG4gICAgICAgICAgLy8gICAgb2YgdGhlIDxwcmVmPiBmZWF0dXJlLiAoTm90ZSB0aGF0IGEgZm9udCBtYXkgc2hhcGUgYSBSYSBjb25zb25hbnQgd2l0aFxuICAgICAgICAgIC8vICAgIHRoZSBmZWF0dXJlIGdlbmVyYWxseSBidXQgYmxvY2sgaXQgaW4gY2VydGFpbiBjb250ZXh0cy4pXG4gICAgICAgICAgLy8gTm90ZTogV2UganVzdCBjaGVjayB0aGF0IHNvbWV0aGluZyBnb3Qgc3Vic3RpdHV0ZWQuICBXZSBkb24ndCBjaGVjayB0aGF0XG4gICAgICAgICAgLy8gdGhlIDxwcmVmPiBmZWF0dXJlIGFjdHVhbGx5IGRpZCBpdC4uLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gUmVvcmRlciBwcmVmIG9ubHkgaWYgaXQgbGlnYXRlZC5cbiAgICAgICAgICBpZiAoZ2x5cGhzW19pMjFdLmlzTGlnYXRlZCAmJiAhZ2x5cGhzW19pMjFdLmlzTXVsdGlwbGllZCkge1xuICAgICAgICAgICAgLy8gMi4gVHJ5IHRvIGZpbmQgYSB0YXJnZXQgcG9zaXRpb24gdGhlIHNhbWUgd2F5IGFzIGZvciBwcmUtYmFzZSBtYXRyYS5cbiAgICAgICAgICAgIC8vICAgIElmIGl0IGlzIGZvdW5kLCByZW9yZGVyIHByZS1iYXNlIGNvbnNvbmFudCBnbHlwaC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAzLiBJZiBwb3NpdGlvbiBpcyBub3QgZm91bmQsIHJlb3JkZXIgaW1tZWRpYXRlbHkgYmVmb3JlIG1haW5cbiAgICAgICAgICAgIC8vICAgIGNvbnNvbmFudC5cbiAgICAgICAgICAgIHZhciBfbmV3UG9zID0gYmFzZTsgLy8gTWFsYXlhbGFtIC8gVGFtaWwgZG8gbm90IGhhdmUgXCJoYWxmXCIgZm9ybXMgb3IgZXhwbGljaXQgdmlyYW1hIGZvcm1zLlxuICAgICAgICAgICAgLy8gVGhlIGdseXBocyBmb3JtZWQgYnkgJ2hhbGYnIGFyZSBDaGlsbHVzIG9yIGxpZ2F0ZWQgZXhwbGljaXQgdmlyYW1hcy5cbiAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gcG9zaXRpb24gbWF0cmEgYWZ0ZXIgdGhlbS5cblxuICAgICAgICAgICAgaWYgKHBsYW4udW5pY29kZVNjcmlwdCAhPT0gJ01hbGF5YWxhbScgJiYgcGxhbi51bmljb2RlU2NyaXB0ICE9PSAnVGFtaWwnKSB7XG4gICAgICAgICAgICAgIHdoaWxlIChfbmV3UG9zID4gc3RhcnQgJiYgIShnbHlwaHNbX25ld1BvcyAtIDFdLnNoYXBlckluZm8uY2F0ZWdvcnkgJiAoQ0FURUdPUklFUy5NIHwgSEFMQU5UX09SX0NPRU5HX0ZMQUdTKSkpIHtcbiAgICAgICAgICAgICAgICBfbmV3UG9zLS07XG4gICAgICAgICAgICAgIH0gLy8gSW4gS2htZXIgY29lbmcgbW9kZWwsIGEgSCxSYSBjYW4gZ28gKmFmdGVyKiBtYXRyYXMuICBJZiBpdCBnb2VzIGFmdGVyIGFcbiAgICAgICAgICAgICAgLy8gc3BsaXQgbWF0cmEsIGl0IHNob3VsZCBiZSByZW9yZGVyZWQgdG8gKmJlZm9yZSogdGhlIGxlZnQgcGFydCBvZiBzdWNoIG1hdHJhLlxuXG5cbiAgICAgICAgICAgICAgaWYgKF9uZXdQb3MgPiBzdGFydCAmJiBnbHlwaHNbX25ld1BvcyAtIDFdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuTSkge1xuICAgICAgICAgICAgICAgIHZhciBfb2xkUG9zMiA9IF9pMjE7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gYmFzZSArIDE7IGogPCBfb2xkUG9zMjsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZ2x5cGhzW2pdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuTSkge1xuICAgICAgICAgICAgICAgICAgICBfbmV3UG9zLS07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoX25ld1BvcyA+IHN0YXJ0ICYmIGlzSGFsYW50T3JDb2VuZyhnbHlwaHNbX25ld1BvcyAtIDFdKSkge1xuICAgICAgICAgICAgICAvLyAtPiBJZiBaV0ogb3IgWldOSiBmb2xsb3cgdGhpcyBoYWxhbnQsIHBvc2l0aW9uIGlzIG1vdmVkIGFmdGVyIGl0LlxuICAgICAgICAgICAgICBpZiAoX25ld1BvcyA8IGVuZCAmJiBpc0pvaW5lcihnbHlwaHNbX25ld1Bvc10pKSB7XG4gICAgICAgICAgICAgICAgX25ld1BvcysrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBfb2xkUG9zID0gX2kyMTtcbiAgICAgICAgICAgIHZhciBfdG1wID0gZ2x5cGhzW19vbGRQb3NdO1xuICAgICAgICAgICAgZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtfbmV3UG9zICsgMSwgMF0uY29uY2F0KGdseXBocy5zcGxpY2UoX25ld1BvcywgX29sZFBvcyAtIF9uZXdQb3MpKSk7XG4gICAgICAgICAgICBnbHlwaHNbX25ld1Bvc10gPSBfdG1wO1xuXG4gICAgICAgICAgICBpZiAoX25ld1BvcyA8PSBiYXNlICYmIGJhc2UgPCBfb2xkUG9zKSB7XG4gICAgICAgICAgICAgIGJhc2UrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gQXBwbHkgJ2luaXQnIHRvIHRoZSBMZWZ0IE1hdHJhIGlmIGl0J3MgYSB3b3JkIHN0YXJ0LlxuXG5cbiAgICBpZiAoZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLnBvc2l0aW9uID09PSBQT1NJVElPTlMuUHJlX00gJiYgKCFzdGFydCB8fCAhL0NmfE1uLy50ZXN0KHVuaWNvZGUuZ2V0Q2F0ZWdvcnkoZ2x5cGhzW3N0YXJ0IC0gMV0uY29kZVBvaW50c1swXSkpKSkge1xuICAgICAgZ2x5cGhzW3N0YXJ0XS5mZWF0dXJlcy5pbml0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbmV4dFN5bGxhYmxlKGdseXBocywgc3RhcnQpIHtcbiAgaWYgKHN0YXJ0ID49IGdseXBocy5sZW5ndGgpIHJldHVybiBzdGFydDtcbiAgdmFyIHN5bGxhYmxlID0gZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLnN5bGxhYmxlO1xuXG4gIHdoaWxlICgrK3N0YXJ0IDwgZ2x5cGhzLmxlbmd0aCAmJiBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8uc3lsbGFibGUgPT09IHN5bGxhYmxlKSB7XG4gIH1cblxuICByZXR1cm4gc3RhcnQ7XG59XG5cbnZhciBiYXNlNjREZWZsYXRlZFRyaWUkMyA9IFwiZUp3QkZnN3A4UUFDQUFBQUFBQUFBQUM2RUFFRkR2cng3Wng3akY5RkZjZG5kN3Y3ZTIxM3V4WmFvTHdmcHFVSVJab1lwREVRSU5HVUptcERGUG5EMWdjMllyQkJqWTFLYUlpR0FoSUpobEJqaEJxamxUVDFHVkJqUVBrRFNBVk5pa1JCQlJVakFWR0VTRWpGeFBnZDc1ejh6czZlZWQ3WEZuNG4rV1R1WTU3bnpNeWRtVHYzcnBwUTZoU3dGcHdETGdRYndXWnd1YmwyWGdYdUZyQU5iQWM3UFA1MmdsM0M5UnZCcldBMzJBTytEYjRIN2dIM0dSNWsvbjhCSGdXL0EwOEw4VDBGbmdHcndBc21iNnZNL1ZXTVY4QWhvSllvMVFYTHdBcHdQSGdqT0JPc0J4dkFSZUFTOEc3d1B2QUI4Rkd3SGV3QU84RXVjQXZZRGU0RWU4RitjRGU0Rnp3QUhnYS9CcjhIZndIUGdoZkJJYUFtbGVxQVdiQVNuQUJPQldkTUZubGZEL2M4Y0tFNTN3aDNNN2djYkFIYndNZkJwODM5YStGK0Fkd01iZ05mbXh5Vy9adVQ4M1ZSbHYySTcvc1Z4OG41c1JYM2ZUaC9FUHdLL0FZOE5WbVU5eG53QW5nRi9EZVFuNmtwcFdiQUNyQnFxZ2gvQ3R3MTRHeHdycmwyQWR4M2dIZUJ5NllLM1dxMjR2aEQ0R1BnaytCejRQTW16RTNHL1RMY3I0SWJXTHJmd1BtK0tYL2VmaEM0SDhOUEVNZjk0QUE0Q0o0dzVkTDNub1Q3Vi9BUDhMSzU5aXJjOFE3cUlGamFDY2QvSlB3YzF5bmlQQkh1YW5BV1dBL1dtYlEyNFBnTUU5ZmJqRi9OeGV5WXN3blhMd1dYV2ZlM092d1RIekZwbjgzMDV2UFAvZVdpNC9ndzByd0tYQTEyZE9MajMybnA5MHpCenk3NHVRWHM3aFQxYlErTGY2bEhIM3R4YnorNEc5enJzS1BVL2gvb0RNdjFDSTRmQTM4QVQ1dTA5UEhmelBGakFYdFVvZDhSSTE2UGpOclBpQkVqUm93WU1XTEVpTmNDNnpyRE5ZRWJJdnovazgxZC8yWE5ZNzhZRWY0L0NEUFJMZFpoQm5DWGd4WGdPSENhdWY0bXVPdTdoZjhOY004SGJ3ZnZOUGZmQzNjTDJHYk90OFBkQVhaMjNlbHFmN3M4OTBlTUdERmlSTDJjMHpKdGwzL0VpQkgxVUhmNy9oTEdqN2QzaS9kQ2Q4RDlsakNlL0U2M2VMZXZqKyt4N3QrM0NNYWZmNTh1bUY2cTFDWGdrZWt3TytIdjU1WmZOVE04WG8zakxXQVBlQndjTXZkV3oyS01QanYwdHdQSGU2Q0RQNEVUZXdnRDl2U0tzZndkVTRYN3NEbm5EUHJ3Tnpaa1kzK2huNXR3YlIrNy9qeU8xdzZVdWhMc0E4K0R0ZFB0UDMvYUp0UmVIb1R1RHBoNmVoRHU0OFplZXA3NGJEZjllYnJmdUdkRyt1ZThtSkdlMUNkSTRWOUczSzkyNS91ai9PNzNwRGVPK3RrRGM3MWgyYlMvbzNCK2JLODRQN2szOUg5NmIzNCtZdnVyV0Z1Nnl2Zm1ubnp2cmJpK0FWd0VOb0xONEQzZ1NYUC8vVGkrQWx3RnJqYjNQd091QXplQ1c4SHRMTzQ3Y2J3WDdBTS9CRDhGOTRNRDRLQ1FCejBQZndMWC8yenU2ZjAweitINEpjRXYrZjgzN28zMWgrYzlITStCby92RitVbjlZbStKdnI4R3gyZjMzVHJUL3MvdHl6cHo2ZjBDK0w4WWJBS1hnc3ZBVnBQMnRuN1JabUx0dGgzK1B3V3VBZGVCNjhITkxEKzM0ZmdyNE92Z0x2QmRWcllRUC9LVSsxSGs4V2Y5ZHA0NUxsMC9GTWpQWXVvcnE5UkJHK24vc2o4LzNvTkc5NytGKzhkK3VYekdsdU5wVDd1ejA3K3I0dkl2eHZwVmhmM0wxSk8yeTVkYS91ZjZ6ZWJidDQ5cXIxazNmNmxmdUlmZ0tvd3hwd2JGK2ZSZzZQZUlnVncydXIrbUk1ZXI3dm9mSXJTWExHYXYyY3BCNFI0UDk3VEI0Vkh2YlAySDdwOHUyRGNVNzBQQzJIYXhFZHZ2M05CZ1hzNGF6TDkyVFViK3o1bUlxNGU2RHIrRnRXTzl2M01EenM4ZkZPMS9IZHR2ZWJIeE56RDUyd1QzMGtHeDcvWnl1QjhVNm9pdjdheU8yTXVaaTg3N2xZUDUxL2plMWVkUU42L29ETXYrQ2VOK0Z1NWRuV0grVDJWaHJqVityb2Q3c3hEM3JiaTJPN0dkdE0weEUyTnFNY2dZWTl3NjUzN0luV0QzbDBSaXg2Y2MxK3FXeGFIeGtaQlFYUm9YSUZ1TkMrSEdMWGZTUUJKVHQrcXVDeE0xeDErMVRMV2RnUklTWTh2WFU5dVgyc3pyU2NZY0xBYXg4OEg3dk1OZHBER0RmWHk0U0c2ZGtjWlNPZmExOVhjNDZiQ3BkaGNiZDRydXEyNkgzUGF1ZmluRWExMWM4dzUrdndxNzVPcWY4dFJoWUJvYlBmK3BtaDR3UzRML1A5ZkgwOFpkYXRHejZGdk1zTEJVeGxtbXN4NkxLelovNUQ5bm5xaEs2R1dDMmFZYkdaZXkvTm5ucVlUQ0tqVS9IY2svU1l4OVNhWU45cm0yYjB3ZjBoZXV1Y3BrcDUycW8xQjdwdnRVSi9qY2pyYy9YOXErc3VUa09kVytvV010QStOSzlyV0YycTk5UG1QNW0xVitpYW1Qb1RBdXRGMldxYUlkMHZ4M1RxVTl3Mkx0NjdOSlNwNnJzbTl1K3lXYjhqNWFxZm45YzFWU3R2M1NXRGFVQm45T0xtTW9kZmowejZuMnBXZHJUdjhjRXJ2dDJ6cXc4NWxyMzNFMXYzeTVvbTBjZXBaTDVYRHBYUEtyQlA4dWY2NTBwT3V4ZFlnTHRWVSt2dUl5cmViYm41L0h0bS9wK2V5U25ISklhN0NodFFuZWxydm1QTFg5cGVRM3B6Mm42a0dmKzhiTFNpM3NxL2w1eUo0MG5wYjBZRXZaOXV5VDBET1orZ0p1NDVpeHZGU3VwdXpyOGt0aTk5ZDEyRmRxLzdiWWVTMWozemNZY29TUHRWS2V4MVczdnh6SUhtUlBHNjdUVVArN1hNbDlISi8veDlpMHp2WktZcStWU09zbUtmYk15VnZWdG95TlU2bjVlWW5OcjlSbWVWMmh1a1EyVzhyOFREdncxWWRVblZJK2N0YjYybWg3UHR2MDJEVjc3VWthRjVPTUszL2NPbnhITFp4YmRNeTlzdnNSYkgwcXk4MnRzems2akltYi9NVHFXNS9Qc2JDK2NwSFkrbGJNVFNtL3k3OFcrNTEvTHVQTXRjZXNyakZ0MWZiVGNVNWFMczE3SlltMWNaM1l3dGVNWFd2SU5qU0c0T2NkTlZ3RDlwWDNpQVJVb3Y4NjBCS2FLMDE2N3ZId3Jub3N0UWxKNnE0YktValBVczIwa3V1TFhxZlVkV2JHWERzU3JGQkZIeldYbUxhOUw0Mk9RM2wxdmRlWVUvUHowVmZETVpVZFIxZUF4MldYUFVlM2MybzRGcUY0cEhTN1JxOUxoSHo0b0xCa3Z6YjJJMGgxdk8xM282RjJYb1dlK0Y2M0txVU9IZVUrWCt4cnZIK29PMzBKbm42S2pxcE9QMVdxMEw5cU9QMVEzclR3NTRZMGRuWE53UWdhZi9UVmNPeWhuOEVyVlRIK21tVFFHbzQrdHR1SS9Sd21XNldXdnk3eDlZRk45SXY2dVZwMUhValJLYThiOW5pRHNNZHFYSTR5ekxKam02Tk5QSk5DZUx1dlQ5M2ZVSFc3S1Z2M2N0UE5EVy9EMTZuSzVvOUw3SE83YnVxc0E5UU9hQzJLOTFOMTFrc2FvK3YydGRKd2pKTG5TVE1zYjY3Mnl1ZVkxSzZsUGw1YS95R292ZkkyTzVsUUpwZVVEUjhhdDlZOXB1VTYwblpxZXMrYWZ2WktjMEo3WFVHeU5UMm42K2lQUXV0SU1hd0N4eHJYUmVyY29TMDdjWGdibHZvWWFzc3p6Ri9kOWNaZXF5ZVgrcCtZZDI1YWJGdTd5bTczUVh5OVlLV0g0d3k2NzZHOVhhNjBVL3BuTGpIOVRxeVVuVnZ6L2tYN24zVkFmcVRyWFU4NGFTK2JkSTN5cStPajk2RzBIMEhUeHJkWTB2Z3hKTWVERTlqNWhJTlkrOWpyWWFuMlRWbC9pYm1lR3JmOXJFd0pwK1hFaURLbVNJNU5LWnc5UG1sQ09tRXZYcEhXcktWcktmSEZoQXV0blV1dWxFNUt2c3FXbzhyMTBwVDgrTVlVSVp2NTdPc0tWd1ZTT2V0SXh6ZldpcEhVK09yS2Ixay9kZXF6alhSemJCa2piWmVoNmZLR3BFMWJwS1JmWjkxTnljZEV6WG4yNmQwZUk1YlZYeFg2YjBKQ2FUV2gvNmJzbktQdnFtMlQ4KzdCTlM5d3hSbGFMM09GenkxRHp0eEM4cTh5NGtxWmo0V2t5WDZuaWZyZXRENGs0ZmJKelZ0dXVlcnFRMFBscmNvT3JuaWFyZ2V4MGxUN0tWdld0dkpRMWlhTG9XK29zcisxNDAzMVMrdTQ5cjR3NmIxSHpMZFZaZUJyM0xUR25xdjcySEJWbHlIMWVTcnQxMnNTdmVkUituYkZoYTRYTVd0NlZQNmM5d3RjWE85YlUzR2w0eG83U1cyQ0krMUI1dThNVXNzZmcvM2UwbjZYeWQ4RDZYMGtLZDlyVXRuYmZGZHJRKy9nWEh0NjZUMnQzZ3VnNi9GSmF2aXZpZHh4YjI1OTlkbWI5a1hVcmEvWU5LVDlEL3dkT0YyejkwUEhDRTluWlVSZXFLNUs0V1AwYjl1eGFoM3k5UXorUE5IMzZQMWVsZTJreDF5eWcyMDNWempxNThodFVuTDByK3NhcjN0OUpUODNhWTkralBENHBXL2krYjY5TVJOM1hkOUoxaUgyZU9ia2tzU3VNZmdrWmsxQ3VoZnk2MHJINTQvbWpuV01yNlY4akN1L3pxUjFvNVEwN0d0S3licHVTdXo2WjQreGZYUHRLdEtyYSs2VUk0dGwvYURNSEZheVg1bTVjRk5sZGtsZDZ4Sk4yTGp1T2wxMy9ESDYwTTlPK3h0czM3Y2c1SS8yYW9YR2EvWjVYWkRvT2NwQUxkeHJweVcwZHpSbUxGSDFtbjNkN2JQT2R3dUhTeDZhVGpPbG5Iek9RdnNVbTJndjloekd0Ui9iOWIxM2FGNXZ5eWtsYVdJZWNLcHEvMSt1MG44QjdUM1BXdmU2ZjVQRzdkSWFXMXRJOVVyNjlwdnUwWGZmS2lFTmFiMGhkdTkzU2pveDJEWnBPbjNmUHlWOTdWaUhYVzVRYXFGT2FlODYyU3AzZlU2YVkxYXRBMG9yVnFwTU05ZG05bnNXKzc4STJrYjB2MHhYZjB2dkFHTHlLUGtycTR1VThMNzJVWFZkU0VIcjBOZi9FZ1BsSGgrWHJhTzUvMTlUbnZPcWJXbW41ZkpENDNCZXorMXZkM2cvWGVaL3FFcjUrM3hYdXlQeHZhdFNBWDhwVWtlOVRlbjM3ZmVHVk5mSVRseWtmaWFsRHZIK1B1WGJ5N0pscFRFRy8xYUwvZ2xBNWFVeGxKM1hrSlJ0MzNXVm5VVDZENEpkNXBnNWJDNTJuc3YrRjk3VmJsUHFPaTkvejhwdnFwUzFmNDVPcTVRVVhmTi9lSVdlaVhaN3FpTDlzcERvZDZYNnZlbHBLdnhQS3J0c1pmUFA3VGllRWQ3WDVxV3hvdDNPVS9PZlc4NnErekc3RGRONGlPWXJWRFkrWG1oQ2xxaUYveWlRa1A0aFZqV1RKaDE3UEtMMXBPZHljeGF1Yno3cGVzdzR5MWQrcVYrMjg3emN3ZEdKVURtWHFZVnJVVXVVKzNua3F2Tk45RWUrL3g3d3RYZTdUZk4yYmZjcGJhdzNjRWtkRjhiR1hlWmZqTDc3MU5melBZMHA0L2pZZWhUeVd3WlhmOE9seDF4K1RHWGw2em4wdit1WVBVVTVkU1FtdkhJYzE5a1dmZjk1VjBvZVAxYWxueEFUYXVHL05tTGFlcHZ2VUtzWXE5WTEvcTN6M1U5Yjc3Rm9UT216MjVqamVoTlM1endtVnV5OUtxbDdNSnJhbjlERUhwV1krSnNxODJMYzd5R0psRVpiN2FtcWNzZm9NMFgzZEZ6MzJvVlVqcXJqS0J2blltd1haZU9vc24zVzFkYXIxRnZadlBpazduVEw1TTJYdjZha3lmcVZrMzVWK2M4TlgxWDZNZW1VMVhQSWJ4MzVUa20vanJodFNiR2RKTG4xd0NYL0E4bzNxSjQ9XCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZyhvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkZyhvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkZyhvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGcobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRnKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkZyhhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkNihzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5JDMob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuLy8gd2UgbWF5IGJlIHJ1bm5pbmcgaW4gYSBicm93c2VyIHNvIHdlIG1ha2UgYW4gVWludDhBcnJheVxuXG52YXIgdXNlRGF0YSQxID0gSlNPTi5wYXJzZShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgcGFrby5pbmZsYXRlKGJhc2U2NEFycmF5YnVmZmVyXzIoYmFzZTY0RGVmbGF0ZWRVc2VEYXRhKSkpKTtcbnZhciB0cmllRGF0YSQzID0gcGFrby5pbmZsYXRlKGJhc2U2NEFycmF5YnVmZmVyXzIoYmFzZTY0RGVmbGF0ZWRUcmllJDMpKTtcbnZhciBjYXRlZ29yaWVzID0gdXNlRGF0YSQxLmNhdGVnb3JpZXMsXG4gICAgZGVjb21wb3NpdGlvbnMkMSA9IHVzZURhdGEkMS5kZWNvbXBvc2l0aW9ucztcbnZhciB0cmllJDMgPSBuZXcgdW5pY29kZVRyaWUodHJpZURhdGEkMyk7XG52YXIgc3RhdGVNYWNoaW5lJDEgPSBuZXcgZGZhKHVzZURhdGEkMSk7XG4vKipcbiAqIFRoaXMgc2hhcGVyIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml2ZXJzYWwgU2hhcGluZyBFbmdpbmUsIHdoaWNoXG4gKiB1c2VzIFVuaWNvZGUgZGF0YSB0byBzaGFwZSBhIG51bWJlciBvZiBzY3JpcHRzIHdpdGhvdXQgYSBkZWRpY2F0ZWQgc2hhcGluZyBlbmdpbmUuXG4gKiBTZWUgaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09wZW5UeXBlRGV2L1VTRS9pbnRyby5odG0uXG4gKi9cblxudmFyIFVuaXZlcnNhbFNoYXBlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0RlZmF1bHRTaGFwZXIpIHtcbiAgX2luaGVyaXRzTG9vc2UkNihVbml2ZXJzYWxTaGFwZXIsIF9EZWZhdWx0U2hhcGVyKTtcblxuICBmdW5jdGlvbiBVbml2ZXJzYWxTaGFwZXIoKSB7XG4gICAgcmV0dXJuIF9EZWZhdWx0U2hhcGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIFVuaXZlcnNhbFNoYXBlci5wbGFuRmVhdHVyZXMgPSBmdW5jdGlvbiBwbGFuRmVhdHVyZXMocGxhbikge1xuICAgIHBsYW4uYWRkU3RhZ2Uoc2V0dXBTeWxsYWJsZXMkMSk7IC8vIERlZmF1bHQgZ2x5cGggcHJlLXByb2Nlc3NpbmcgZ3JvdXBcblxuICAgIHBsYW4uYWRkU3RhZ2UoWydsb2NsJywgJ2NjbXAnLCAnbnVrdCcsICdha2huJ10pOyAvLyBSZW9yZGVyaW5nIGdyb3VwXG5cbiAgICBwbGFuLmFkZFN0YWdlKGNsZWFyU3Vic3RpdHV0aW9uRmxhZ3MpO1xuICAgIHBsYW4uYWRkU3RhZ2UoWydycGhmJ10sIGZhbHNlKTtcbiAgICBwbGFuLmFkZFN0YWdlKHJlY29yZFJwaGYpO1xuICAgIHBsYW4uYWRkU3RhZ2UoY2xlYXJTdWJzdGl0dXRpb25GbGFncyk7XG4gICAgcGxhbi5hZGRTdGFnZShbJ3ByZWYnXSk7XG4gICAgcGxhbi5hZGRTdGFnZShyZWNvcmRQcmVmKTsgLy8gT3J0aG9ncmFwaGljIHVuaXQgc2hhcGluZyBncm91cFxuXG4gICAgcGxhbi5hZGRTdGFnZShbJ3JrcmYnLCAnYWJ2ZicsICdibHdmJywgJ2hhbGYnLCAncHN0ZicsICd2YXR1JywgJ2NqY3QnXSk7XG4gICAgcGxhbi5hZGRTdGFnZShyZW9yZGVyKTsgLy8gVG9wb2dyYXBoaWNhbCBmZWF0dXJlc1xuICAgIC8vIFNjcmlwdHMgdGhhdCBuZWVkIHRoaXMgYXJlIGhhbmRsZWQgYnkgdGhlIEFyYWJpYyBzaGFwZXIsIG5vdCBpbXBsZW1lbnRlZCBoZXJlIGZvciBub3cuXG4gICAgLy8gcGxhbi5hZGRTdGFnZShbJ2lzb2wnLCAnaW5pdCcsICdtZWRpJywgJ2ZpbmEnLCAnbWVkMicsICdmaW4yJywgJ2ZpbjMnXSwgZmFsc2UpO1xuICAgIC8vIFN0YW5kYXJkIHRvcG9ncmFwaGljIHByZXNlbnRhdGlvbiBhbmQgcG9zaXRpb25hbCBmZWF0dXJlIGFwcGxpY2F0aW9uXG5cbiAgICBwbGFuLmFkZFN0YWdlKFsnYWJ2cycsICdibHdzJywgJ3ByZXMnLCAncHN0cycsICdkaXN0JywgJ2Fidm0nLCAnYmx3bSddKTtcbiAgfTtcblxuICBVbml2ZXJzYWxTaGFwZXIuYXNzaWduRmVhdHVyZXMgPSBmdW5jdGlvbiBhc3NpZ25GZWF0dXJlcyhwbGFuLCBnbHlwaHMpIHtcbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChpKSB7XG4gICAgICB2YXIgY29kZXBvaW50ID0gZ2x5cGhzW2ldLmNvZGVQb2ludHNbMF07XG5cbiAgICAgIGlmIChkZWNvbXBvc2l0aW9ucyQxW2NvZGVwb2ludF0pIHtcbiAgICAgICAgdmFyIGRlY29tcG9zZWQgPSBkZWNvbXBvc2l0aW9ucyQxW2NvZGVwb2ludF0ubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgdmFyIGcgPSBwbGFuLmZvbnQuZ2x5cGhGb3JDb2RlUG9pbnQoYyk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBHbHlwaEluZm8ocGxhbi5mb250LCBnLmlkLCBbY10sIGdseXBoc1tpXS5mZWF0dXJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW2ksIDFdLmNvbmNhdChkZWNvbXBvc2VkKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIERlY29tcG9zZSBzcGxpdCB2b3dlbHNcbiAgICAvLyBUT0RPOiBkbyB0aGlzIGluIGEgbW9yZSBnZW5lcmFsIHVuaWNvZGUgbm9ybWFsaXplclxuICAgIGZvciAodmFyIGkgPSBnbHlwaHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIF9sb29wKGkpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gVW5pdmVyc2FsU2hhcGVyO1xufShEZWZhdWx0U2hhcGVyKTtcblxuX2RlZmluZVByb3BlcnR5JDMoVW5pdmVyc2FsU2hhcGVyLCBcInplcm9NYXJrV2lkdGhzXCIsICdCRUZPUkVfR1BPUycpO1xuXG5mdW5jdGlvbiB1c2VDYXRlZ29yeShnbHlwaCkge1xuICByZXR1cm4gdHJpZSQzLmdldChnbHlwaC5jb2RlUG9pbnRzWzBdKTtcbn1cblxudmFyIFVTRUluZm8gPSBmdW5jdGlvbiBVU0VJbmZvKGNhdGVnb3J5LCBzeWxsYWJsZVR5cGUsIHN5bGxhYmxlKSB7XG4gIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgdGhpcy5zeWxsYWJsZVR5cGUgPSBzeWxsYWJsZVR5cGU7XG4gIHRoaXMuc3lsbGFibGUgPSBzeWxsYWJsZTtcbn07XG5cbmZ1bmN0aW9uIHNldHVwU3lsbGFibGVzJDEoZm9udCwgZ2x5cGhzKSB7XG4gIHZhciBzeWxsYWJsZSA9IDA7XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRnKHN0YXRlTWFjaGluZSQxLm1hdGNoKGdseXBocy5tYXAodXNlQ2F0ZWdvcnkpKSksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgdmFyIF9zdGVwJHZhbHVlID0gX3N0ZXAudmFsdWUsXG4gICAgICAgIHN0YXJ0ID0gX3N0ZXAkdmFsdWVbMF0sXG4gICAgICAgIGVuZCA9IF9zdGVwJHZhbHVlWzFdLFxuICAgICAgICB0YWdzID0gX3N0ZXAkdmFsdWVbMl07XG4gICAgKytzeWxsYWJsZTsgLy8gQ3JlYXRlIHNoYXBlciBpbmZvXG5cbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgIGdseXBoc1tpXS5zaGFwZXJJbmZvID0gbmV3IFVTRUluZm8oY2F0ZWdvcmllc1t1c2VDYXRlZ29yeShnbHlwaHNbaV0pXSwgdGFnc1swXSwgc3lsbGFibGUpO1xuICAgIH0gLy8gQXNzaWduIHJwaGYgZmVhdHVyZVxuXG5cbiAgICB2YXIgbGltaXQgPSBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09ICdSJyA/IDEgOiBNYXRoLm1pbigzLCBlbmQgLSBzdGFydCk7XG5cbiAgICBmb3IgKHZhciBfaSA9IHN0YXJ0OyBfaSA8IHN0YXJ0ICsgbGltaXQ7IF9pKyspIHtcbiAgICAgIGdseXBoc1tfaV0uZmVhdHVyZXMucnBoZiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFyU3Vic3RpdHV0aW9uRmxhZ3MoZm9udCwgZ2x5cGhzKSB7XG4gIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGcoZ2x5cGhzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICB2YXIgZ2x5cGggPSBfc3RlcDIudmFsdWU7XG4gICAgZ2x5cGguc3Vic3RpdHV0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRScGhmKGZvbnQsIGdseXBocykge1xuICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRnKGdseXBocyksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgdmFyIGdseXBoID0gX3N0ZXAzLnZhbHVlO1xuXG4gICAgaWYgKGdseXBoLnN1YnN0aXR1dGVkICYmIGdseXBoLmZlYXR1cmVzLnJwaGYpIHtcbiAgICAgIC8vIE1hcmsgYSBzdWJzdGl0dXRlZCByZXBoYS5cbiAgICAgIGdseXBoLnNoYXBlckluZm8uY2F0ZWdvcnkgPSAnUic7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZFByZWYoZm9udCwgZ2x5cGhzKSB7XG4gIGZvciAodmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGcoZ2x5cGhzKSwgX3N0ZXA0OyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQoKSkuZG9uZTspIHtcbiAgICB2YXIgZ2x5cGggPSBfc3RlcDQudmFsdWU7XG5cbiAgICBpZiAoZ2x5cGguc3Vic3RpdHV0ZWQpIHtcbiAgICAgIC8vIE1hcmsgYSBzdWJzdGl0dXRlZCBwcmVmIGFzIFZQcmUsIGFzIHRoZXkgYmVoYXZlIHRoZSBzYW1lIHdheS5cbiAgICAgIGdseXBoLnNoYXBlckluZm8uY2F0ZWdvcnkgPSAnVlByZSc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlb3JkZXIoZm9udCwgZ2x5cGhzKSB7XG4gIHZhciBkb3R0ZWRDaXJjbGUgPSBmb250LmdseXBoRm9yQ29kZVBvaW50KDB4MjVjYykuaWQ7XG5cbiAgZm9yICh2YXIgc3RhcnQgPSAwLCBlbmQgPSBuZXh0U3lsbGFibGUkMShnbHlwaHMsIDApOyBzdGFydCA8IGdseXBocy5sZW5ndGg7IHN0YXJ0ID0gZW5kLCBlbmQgPSBuZXh0U3lsbGFibGUkMShnbHlwaHMsIHN0YXJ0KSkge1xuICAgIHZhciBpID0gdm9pZCAwLFxuICAgICAgICBqID0gdm9pZCAwO1xuICAgIHZhciBpbmZvID0gZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvO1xuICAgIHZhciB0eXBlID0gaW5mby5zeWxsYWJsZVR5cGU7IC8vIE9ubHkgYSBmZXcgc3lsbGFibGUgdHlwZXMgbmVlZCByZW9yZGVyaW5nLlxuXG4gICAgaWYgKHR5cGUgIT09ICd2aXJhbWFfdGVybWluYXRlZF9jbHVzdGVyJyAmJiB0eXBlICE9PSAnc3RhbmRhcmRfY2x1c3RlcicgJiYgdHlwZSAhPT0gJ2Jyb2tlbl9jbHVzdGVyJykge1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBJbnNlcnQgYSBkb3R0ZWQgY2lyY2xlIGdseXBoIGluIGJyb2tlbiBjbHVzdGVycy5cblxuXG4gICAgaWYgKHR5cGUgPT09ICdicm9rZW5fY2x1c3RlcicgJiYgZG90dGVkQ2lyY2xlKSB7XG4gICAgICB2YXIgZyA9IG5ldyBHbHlwaEluZm8oZm9udCwgZG90dGVkQ2lyY2xlLCBbMHgyNWNjXSk7XG4gICAgICBnLnNoYXBlckluZm8gPSBpbmZvOyAvLyBJbnNlcnQgYWZ0ZXIgcG9zc2libGUgUmVwaGEuXG5cbiAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kICYmIGdseXBoc1tpXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSAnUic7IGkrKykge1xuICAgICAgfVxuXG4gICAgICBnbHlwaHMuc3BsaWNlKCsraSwgMCwgZyk7XG4gICAgICBlbmQrKztcbiAgICB9IC8vIE1vdmUgdGhpbmdzIGZvcndhcmQuXG5cblxuICAgIGlmIChpbmZvLmNhdGVnb3J5ID09PSAnUicgJiYgZW5kIC0gc3RhcnQgPiAxKSB7XG4gICAgICAvLyBHb3QgYSByZXBoYS4gUmVvcmRlciBpdCB0byBhZnRlciBmaXJzdCBiYXNlLCBiZWZvcmUgZmlyc3QgaGFsYW50LlxuICAgICAgZm9yIChpID0gc3RhcnQgKyAxOyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgaW5mbyA9IGdseXBoc1tpXS5zaGFwZXJJbmZvO1xuXG4gICAgICAgIGlmIChpc0Jhc2UoaW5mbykgfHwgaXNIYWxhbnQoZ2x5cGhzW2ldKSkge1xuICAgICAgICAgIC8vIElmIHdlIGhpdCBhIGhhbGFudCwgbW92ZSBiZWZvcmUgaXQ7IG90aGVyd2lzZSBpdCdzIGEgYmFzZTogbW92ZSB0byBpdCdzXG4gICAgICAgICAgLy8gcGxhY2UsIGFuZCBzaGlmdCB0aGluZ3MgaW4gYmV0d2VlbiBiYWNrd2FyZC5cbiAgICAgICAgICBpZiAoaXNIYWxhbnQoZ2x5cGhzW2ldKSkge1xuICAgICAgICAgICAgaS0tO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbc3RhcnQsIDBdLmNvbmNhdChnbHlwaHMuc3BsaWNlKHN0YXJ0ICsgMSwgaSAtIHN0YXJ0KSwgW2dseXBoc1tpXV0pKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gTW92ZSB0aGluZ3MgYmFjay5cblxuXG4gICAgZm9yIChpID0gc3RhcnQsIGogPSBlbmQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgaW5mbyA9IGdseXBoc1tpXS5zaGFwZXJJbmZvO1xuXG4gICAgICBpZiAoaXNCYXNlKGluZm8pIHx8IGlzSGFsYW50KGdseXBoc1tpXSkpIHtcbiAgICAgICAgLy8gSWYgd2UgaGl0IGEgaGFsYW50LCBtb3ZlIGFmdGVyIGl0OyBvdGhlcndpc2UgaXQncyBhIGJhc2U6IG1vdmUgdG8gaXQnc1xuICAgICAgICAvLyBwbGFjZSwgYW5kIHNoaWZ0IHRoaW5ncyBpbiBiZXR3ZWVuIGJhY2t3YXJkLlxuICAgICAgICBqID0gaXNIYWxhbnQoZ2x5cGhzW2ldKSA/IGkgKyAxIDogaTtcbiAgICAgIH0gZWxzZSBpZiAoKGluZm8uY2F0ZWdvcnkgPT09ICdWUHJlJyB8fCBpbmZvLmNhdGVnb3J5ID09PSAnVk1QcmUnKSAmJiBqIDwgaSkge1xuICAgICAgICBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW2osIDEsIGdseXBoc1tpXV0uY29uY2F0KGdseXBocy5zcGxpY2UoaiwgaSAtIGopKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5leHRTeWxsYWJsZSQxKGdseXBocywgc3RhcnQpIHtcbiAgaWYgKHN0YXJ0ID49IGdseXBocy5sZW5ndGgpIHJldHVybiBzdGFydDtcbiAgdmFyIHN5bGxhYmxlID0gZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLnN5bGxhYmxlO1xuXG4gIHdoaWxlICgrK3N0YXJ0IDwgZ2x5cGhzLmxlbmd0aCAmJiBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8uc3lsbGFibGUgPT09IHN5bGxhYmxlKSB7XG4gIH1cblxuICByZXR1cm4gc3RhcnQ7XG59XG5cbmZ1bmN0aW9uIGlzSGFsYW50KGdseXBoKSB7XG4gIHJldHVybiBnbHlwaC5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSAnSCcgJiYgIWdseXBoLmlzTGlnYXRlZDtcbn1cblxuZnVuY3Rpb24gaXNCYXNlKGluZm8pIHtcbiAgcmV0dXJuIGluZm8uY2F0ZWdvcnkgPT09ICdCJyB8fCBpbmZvLmNhdGVnb3J5ID09PSAnR0InO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGgobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGgobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGgobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRoKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkaChvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGgoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG52YXIgU0hBUEVSUyA9IHtcbiAgYXJhYjogQXJhYmljU2hhcGVyLFxuICAvLyBBcmFiaWNcbiAgbW9uZzogQXJhYmljU2hhcGVyLFxuICAvLyBNb25nb2xpYW5cbiAgc3lyYzogQXJhYmljU2hhcGVyLFxuICAvLyBTeXJpYWNcbiAgJ25rbyAnOiBBcmFiaWNTaGFwZXIsXG4gIC8vIE4nS29cbiAgcGhhZzogQXJhYmljU2hhcGVyLFxuICAvLyBQaGFncyBQYVxuICBtYW5kOiBBcmFiaWNTaGFwZXIsXG4gIC8vIE1hbmRhaWNcbiAgbWFuaTogQXJhYmljU2hhcGVyLFxuICAvLyBNYW5pY2hhZWFuXG4gIHBobHA6IEFyYWJpY1NoYXBlcixcbiAgLy8gUHNhbHRlciBQYWhsYXZpXG4gIGhhbmc6IEhhbmd1bFNoYXBlcixcbiAgLy8gSGFuZ3VsXG4gIGJuZzI6IEluZGljU2hhcGVyLFxuICAvLyBCZW5nYWxpXG4gIGJlbmc6IEluZGljU2hhcGVyLFxuICAvLyBCZW5nYWxpXG4gIGRldjI6IEluZGljU2hhcGVyLFxuICAvLyBEZXZhbmFnYXJpXG4gIGRldmE6IEluZGljU2hhcGVyLFxuICAvLyBEZXZhbmFnYXJpXG4gIGdqcjI6IEluZGljU2hhcGVyLFxuICAvLyBHdWphcmF0aVxuICBndWpyOiBJbmRpY1NoYXBlcixcbiAgLy8gR3VqYXJhdGlcbiAgZ3VydTogSW5kaWNTaGFwZXIsXG4gIC8vIEd1cm11a2hpXG4gIGd1cjI6IEluZGljU2hhcGVyLFxuICAvLyBHdXJtdWtoaVxuICBrbmRhOiBJbmRpY1NoYXBlcixcbiAgLy8gS2FubmFkYVxuICBrbmQyOiBJbmRpY1NoYXBlcixcbiAgLy8gS2FubmFkYVxuICBtbG0yOiBJbmRpY1NoYXBlcixcbiAgLy8gTWFsYXlhbGFtXG4gIG1seW06IEluZGljU2hhcGVyLFxuICAvLyBNYWxheWFsYW1cbiAgb3J5MjogSW5kaWNTaGFwZXIsXG4gIC8vIE9yaXlhXG4gIG9yeWE6IEluZGljU2hhcGVyLFxuICAvLyBPcml5YVxuICB0YW1sOiBJbmRpY1NoYXBlcixcbiAgLy8gVGFtaWxcbiAgdG1sMjogSW5kaWNTaGFwZXIsXG4gIC8vIFRhbWlsXG4gIHRlbHU6IEluZGljU2hhcGVyLFxuICAvLyBUZWx1Z3VcbiAgdGVsMjogSW5kaWNTaGFwZXIsXG4gIC8vIFRlbHVndVxuICBraG1yOiBJbmRpY1NoYXBlcixcbiAgLy8gS2htZXJcbiAgYmFsaTogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBCYWxpbmVzZVxuICBiYXRrOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEJhdGFrXG4gIGJyYWg6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gQnJhaG1pXG4gIGJ1Z2k6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gQnVnaW5lc2VcbiAgYnVoZDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBCdWhpZFxuICBjYWttOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIENoYWttYVxuICBjaGFtOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIENoYW1cbiAgZHVwbDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBEdXBsb3lhblxuICBlZ3lwOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEVneXB0aWFuIEhpZXJvZ2x5cGhzXG4gIGdyYW46IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gR3JhbnRoYVxuICBoYW5vOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEhhbnVub29cbiAgamF2YTogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBKYXZhbmVzZVxuICBrdGhpOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEthaXRoaVxuICBrYWxpOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEtheWFoIExpXG4gIGtoYXI6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gS2hhcm9zaHRoaVxuICBraG9qOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEtob2praVxuICBzaW5kOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEtodWRhd2FkaVxuICBsZXBjOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIExlcGNoYVxuICBsaW1iOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIExpbWJ1XG4gIG1haGo6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gTWFoYWphbmlcbiAgLy8gbWFuZDogVW5pdmVyc2FsU2hhcGVyLCAvLyBNYW5kYWljXG4gIC8vIG1hbmk6IFVuaXZlcnNhbFNoYXBlciwgLy8gTWFuaWNoYWVhblxuICBtdGVpOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIE1laXRlaSBNYXlla1xuICBtb2RpOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIE1vZGlcbiAgLy8gbW9uZzogVW5pdmVyc2FsU2hhcGVyLCAvLyBNb25nb2xpYW5cbiAgLy8gJ25rbyAnOiBVbml2ZXJzYWxTaGFwZXIsIC8vIE7igJlLb1xuICBobW5nOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFBhaGF3aCBIbW9uZ1xuICAvLyBwaGFnOiBVbml2ZXJzYWxTaGFwZXIsIC8vIFBoYWdzLXBhXG4gIC8vIHBobHA6IFVuaXZlcnNhbFNoYXBlciwgLy8gUHNhbHRlciBQYWhsYXZpXG4gIHJqbmc6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gUmVqYW5nXG4gIHNhdXI6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gU2F1cmFzaHRyYVxuICBzaHJkOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFNoYXJhZGFcbiAgc2lkZDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBTaWRkaGFtXG4gIHNpbmg6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gU2luaGFsYVxuICBzdW5kOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFN1bmRhbmVzZVxuICBzeWxvOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFN5bG90aSBOYWdyaVxuICB0Z2xnOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFRhZ2Fsb2dcbiAgdGFnYjogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBUYWdiYW53YVxuICB0YWxlOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFRhaSBMZVxuICBsYW5hOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFRhaSBUaGFtXG4gIHRhdnQ6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gVGFpIFZpZXRcbiAgdGFrcjogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBUYWtyaVxuICB0aWJ0OiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFRpYmV0YW5cbiAgdGZuZzogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBUaWZpbmFnaFxuICB0aXJoOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFRpcmh1dGFcbiAgbGF0bjogRGVmYXVsdFNoYXBlcixcbiAgLy8gTGF0aW5cbiAgREZMVDogRGVmYXVsdFNoYXBlciAvLyBEZWZhdWx0XG5cbn07XG5mdW5jdGlvbiBjaG9vc2Uoc2NyaXB0KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShzY3JpcHQpKSB7XG4gICAgc2NyaXB0ID0gW3NjcmlwdF07XG4gIH1cblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGgoc2NyaXB0KSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgcyA9IF9zdGVwLnZhbHVlO1xuICAgIHZhciBzaGFwZXIgPSBTSEFQRVJTW3NdO1xuXG4gICAgaWYgKHNoYXBlcikge1xuICAgICAgcmV0dXJuIHNoYXBlcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRGVmYXVsdFNoYXBlcjtcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRpKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRpKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRpKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkaShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRpKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSQ3KHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgR1NVQlByb2Nlc3NvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX09UUHJvY2Vzc29yKSB7XG4gIF9pbmhlcml0c0xvb3NlJDcoR1NVQlByb2Nlc3NvciwgX09UUHJvY2Vzc29yKTtcblxuICBmdW5jdGlvbiBHU1VCUHJvY2Vzc29yKCkge1xuICAgIHJldHVybiBfT1RQcm9jZXNzb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEdTVUJQcm9jZXNzb3IucHJvdG90eXBlO1xuXG4gIF9wcm90by5hcHBseUxvb2t1cCA9IGZ1bmN0aW9uIGFwcGx5TG9va3VwKGxvb2t1cFR5cGUsIHRhYmxlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHN3aXRjaCAobG9va3VwVHlwZSkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gU2luZ2xlIFN1YnN0aXR1dGlvblxuICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSk7XG5cbiAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGdseXBoID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmN1cjtcblxuICAgICAgICAgIHN3aXRjaCAodGFibGUudmVyc2lvbikge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBnbHlwaC5pZCA9IGdseXBoLmlkICsgdGFibGUuZGVsdGFHbHlwaElEICYgMHhmZmZmO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBnbHlwaC5pZCA9IHRhYmxlLnN1YnN0aXR1dGUuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAyOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gTXVsdGlwbGUgU3Vic3RpdHV0aW9uXG4gICAgICAgICAgdmFyIF9pbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSk7XG5cbiAgICAgICAgICBpZiAoX2luZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgdmFyIF90aGlzJGdseXBocztcblxuICAgICAgICAgICAgdmFyIHNlcXVlbmNlID0gdGFibGUuc2VxdWVuY2VzLmdldChfaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5nbHlwaEl0ZXJhdG9yLmN1ci5pZCA9IHNlcXVlbmNlWzBdO1xuICAgICAgICAgICAgdGhpcy5nbHlwaEl0ZXJhdG9yLmN1ci5saWdhdHVyZUNvbXBvbmVudCA9IDA7XG4gICAgICAgICAgICB2YXIgZmVhdHVyZXMgPSB0aGlzLmdseXBoSXRlcmF0b3IuY3VyLmZlYXR1cmVzO1xuICAgICAgICAgICAgdmFyIGN1ckdseXBoID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmN1cjtcbiAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IHNlcXVlbmNlLnNsaWNlKDEpLm1hcChmdW5jdGlvbiAoZ2lkLCBpKSB7XG4gICAgICAgICAgICAgIHZhciBnbHlwaCA9IG5ldyBHbHlwaEluZm8oX3RoaXMuZm9udCwgZ2lkLCB1bmRlZmluZWQsIGZlYXR1cmVzKTtcbiAgICAgICAgICAgICAgZ2x5cGguc2hhcGVySW5mbyA9IGN1ckdseXBoLnNoYXBlckluZm87XG4gICAgICAgICAgICAgIGdseXBoLmlzTGlnYXRlZCA9IGN1ckdseXBoLmlzTGlnYXRlZDtcbiAgICAgICAgICAgICAgZ2x5cGgubGlnYXR1cmVDb21wb25lbnQgPSBpICsgMTtcbiAgICAgICAgICAgICAgZ2x5cGguc3Vic3RpdHV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBnbHlwaC5pc011bHRpcGxpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gZ2x5cGg7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgKF90aGlzJGdseXBocyA9IHRoaXMuZ2x5cGhzKS5zcGxpY2UuYXBwbHkoX3RoaXMkZ2x5cGhzLCBbdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4ICsgMSwgMF0uY29uY2F0KHJlcGxhY2VtZW50KSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDM6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBBbHRlcm5hdGUgU3Vic3RpdHV0aW9uXG4gICAgICAgICAgdmFyIF9pbmRleDIgPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UpO1xuXG4gICAgICAgICAgaWYgKF9pbmRleDIgIT09IC0xKSB7XG4gICAgICAgICAgICB2YXIgVVNFUl9JTkRFWCA9IDA7IC8vIFRPRE9cblxuICAgICAgICAgICAgdGhpcy5nbHlwaEl0ZXJhdG9yLmN1ci5pZCA9IHRhYmxlLmFsdGVybmF0ZVNldC5nZXQoX2luZGV4MilbVVNFUl9JTkRFWF07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gTGlnYXR1cmUgU3Vic3RpdHV0aW9uXG4gICAgICAgICAgdmFyIF9pbmRleDMgPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UpO1xuXG4gICAgICAgICAgaWYgKF9pbmRleDMgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRpKHRhYmxlLmxpZ2F0dXJlU2V0cy5nZXQoX2luZGV4MykpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIGxpZ2F0dXJlID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgICB2YXIgbWF0Y2hlZCA9IHRoaXMuc2VxdWVuY2VNYXRjaEluZGljZXMoMSwgbGlnYXR1cmUuY29tcG9uZW50cyk7XG5cbiAgICAgICAgICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIF9jdXJHbHlwaCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5jdXI7IC8vIENvbmNhdGVuYXRlIGFsbCBvZiB0aGUgY2hhcmFjdGVycyB0aGUgbmV3IGxpZ2F0dXJlIHdpbGwgcmVwcmVzZW50XG5cbiAgICAgICAgICAgIHZhciBjaGFyYWN0ZXJzID0gX2N1ckdseXBoLmNvZGVQb2ludHMuc2xpY2UoKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkaShtYXRjaGVkKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgdmFyIF9pbmRleDQgPSBfc3RlcDIudmFsdWU7XG4gICAgICAgICAgICAgIGNoYXJhY3RlcnMucHVzaC5hcHBseShjaGFyYWN0ZXJzLCB0aGlzLmdseXBoc1tfaW5kZXg0XS5jb2RlUG9pbnRzKTtcbiAgICAgICAgICAgIH0gLy8gQ3JlYXRlIHRoZSByZXBsYWNlbWVudCBsaWdhdHVyZSBnbHlwaFxuXG5cbiAgICAgICAgICAgIHZhciBsaWdhdHVyZUdseXBoID0gbmV3IEdseXBoSW5mbyh0aGlzLmZvbnQsIGxpZ2F0dXJlLmdseXBoLCBjaGFyYWN0ZXJzLCBfY3VyR2x5cGguZmVhdHVyZXMpO1xuICAgICAgICAgICAgbGlnYXR1cmVHbHlwaC5zaGFwZXJJbmZvID0gX2N1ckdseXBoLnNoYXBlckluZm87XG4gICAgICAgICAgICBsaWdhdHVyZUdseXBoLmlzTGlnYXRlZCA9IHRydWU7XG4gICAgICAgICAgICBsaWdhdHVyZUdseXBoLnN1YnN0aXR1dGVkID0gdHJ1ZTsgLy8gRnJvbSBIYXJmYnV6ejpcbiAgICAgICAgICAgIC8vIC0gSWYgaXQgKmlzKiBhIG1hcmsgbGlnYXR1cmUsIHdlIGRvbid0IGFsbG9jYXRlIGEgbmV3IGxpZ2F0dXJlIGlkLCBhbmQgbGVhdmVcbiAgICAgICAgICAgIC8vICAgdGhlIGxpZ2F0dXJlIHRvIGtlZXAgaXRzIG9sZCBsaWdhdHVyZSBpZC4gIFRoaXMgd2lsbCBhbGxvdyBpdCB0byBhdHRhY2ggdG9cbiAgICAgICAgICAgIC8vICAgYSBiYXNlIGxpZ2F0dXJlIGluIEdQT1MuICBFZy4gaWYgdGhlIHNlcXVlbmNlIGlzOiBMQU0sTEFNLFNIQUREQSxGQVRIQSxIRUgsXG4gICAgICAgICAgICAvLyAgIGFuZCBMQU0sTEFNLEhFSCBmb3IgYSBsaWdhdHVyZSwgdGhleSB3aWxsIGxlYXZlIFNIQUREQSBhbmQgRkFUSEEgd2l0aCBhXG4gICAgICAgICAgICAvLyAgIGxpZ2F0dXJlIGlkIGFuZCBjb21wb25lbnQgdmFsdWUgb2YgMi4gIFRoZW4gaWYgU0hBRERBLEZBVEhBIGZvcm0gYSBsaWdhdHVyZVxuICAgICAgICAgICAgLy8gICBsYXRlciwgd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIGxvc2UgdGhlaXIgbGlnYXR1cmUgaWQvY29tcG9uZW50LCBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vICAgR1BPUyB3aWxsIGZhaWwgdG8gY29ycmVjdGx5IHBvc2l0aW9uIHRoZSBtYXJrIGxpZ2F0dXJlIG9uIHRvcCBvZiB0aGVcbiAgICAgICAgICAgIC8vICAgTEFNLExBTSxIRUggbGlnYXR1cmUuIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MzQzXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gLSBJZiBhIGxpZ2F0dXJlIGlzIGZvcm1lZCBvZiBjb21wb25lbnRzIHRoYXQgc29tZSBvZiB3aGljaCBhcmUgYWxzbyBsaWdhdHVyZXNcbiAgICAgICAgICAgIC8vICAgdGhlbXNlbHZlcywgYW5kIHRob3NlIGxpZ2F0dXJlIGNvbXBvbmVudHMgaGFkIG1hcmtzIGF0dGFjaGVkIHRvICp0aGVpcipcbiAgICAgICAgICAgIC8vICAgY29tcG9uZW50cywgd2UgaGF2ZSB0byBhdHRhY2ggdGhlIG1hcmtzIHRvIHRoZSBuZXcgbGlnYXR1cmUgY29tcG9uZW50XG4gICAgICAgICAgICAvLyAgIHBvc2l0aW9ucyEgIE5vdyAqdGhhdConcyB0cmlja3khICBBbmQgdGhlc2UgbWFya3MgbWF5IGJlIGZvbGxvd2luZyB0aGVcbiAgICAgICAgICAgIC8vICAgbGFzdCBjb21wb25lbnQgb2YgdGhlIHdob2xlIHNlcXVlbmNlLCBzbyB3ZSBzaG91bGQgbG9vcCBmb3J3YXJkIGxvb2tpbmdcbiAgICAgICAgICAgIC8vICAgZm9yIHRoZW0gYW5kIHVwZGF0ZSB0aGVtLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vICAgRWcuIHRoZSBzZXF1ZW5jZSBpcyBMQU0sTEFNLFNIQUREQSxGQVRIQSxIRUgsIGFuZCB0aGUgZm9udCBmaXJzdCBmb3JtcyBhXG4gICAgICAgICAgICAvLyAgICdjYWx0JyBsaWdhdHVyZSBvZiBMQU0sSEVILCBsZWF2aW5nIHRoZSBTSEFEREEgYW5kIEZBVEhBIHdpdGggYSBsaWdhdHVyZVxuICAgICAgICAgICAgLy8gICBpZCBhbmQgY29tcG9uZW50ID09IDEuICBOb3csIGR1cmluZyAnbGlnYScsIHRoZSBMQU0gYW5kIHRoZSBMQU0tSEVIIGxpZ2F0dXJlXG4gICAgICAgICAgICAvLyAgIGZvcm0gYSBMQU0tTEFNLUhFSCBsaWdhdHVyZS4gIFdlIG5lZWQgdG8gcmVhc3NpZ24gdGhlIFNIQUREQSBhbmQgRkFUSEEgdG9cbiAgICAgICAgICAgIC8vICAgdGhlIG5ldyBsaWdhdHVyZSB3aXRoIGEgY29tcG9uZW50IHZhbHVlIG9mIDIuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gICBUaGlzIGluIGZhY3QgaGFwcGVuZWQgdG8gYSBmb250Li4uICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTQzNzYzM1xuXG4gICAgICAgICAgICB2YXIgaXNNYXJrTGlnYXR1cmUgPSBfY3VyR2x5cGguaXNNYXJrO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoZWQubGVuZ3RoICYmIGlzTWFya0xpZ2F0dXJlOyBpKyspIHtcbiAgICAgICAgICAgICAgaXNNYXJrTGlnYXR1cmUgPSB0aGlzLmdseXBoc1ttYXRjaGVkW2ldXS5pc01hcms7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpZ2F0dXJlR2x5cGgubGlnYXR1cmVJRCA9IGlzTWFya0xpZ2F0dXJlID8gbnVsbCA6IHRoaXMubGlnYXR1cmVJRCsrO1xuICAgICAgICAgICAgdmFyIGxhc3RMaWdJRCA9IF9jdXJHbHlwaC5saWdhdHVyZUlEO1xuICAgICAgICAgICAgdmFyIGxhc3ROdW1Db21wcyA9IF9jdXJHbHlwaC5jb2RlUG9pbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBjdXJDb21wcyA9IGxhc3ROdW1Db21wcztcbiAgICAgICAgICAgIHZhciBpZHggPSB0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXggKyAxOyAvLyBTZXQgbGlnYXR1cmVJRCBhbmQgbGlnYXR1cmVDb21wb25lbnQgb24gZ2x5cGhzIHRoYXQgd2VyZSBza2lwcGVkIGluIHRoZSBtYXRjaGVkIHNlcXVlbmNlLlxuICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgR1BPUyB0byBhdHRhY2ggbWFya3MgdG8gdGhlIGNvcnJlY3QgbGlnYXR1cmUgY29tcG9uZW50cy5cblxuICAgICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkaShtYXRjaGVkKSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgdmFyIG1hdGNoSW5kZXggPSBfc3RlcDMudmFsdWU7XG5cbiAgICAgICAgICAgICAgLy8gRG9uJ3QgYXNzaWduIG5ldyBsaWdhdHVyZSBjb21wb25lbnRzIGZvciBtYXJrIGxpZ2F0dXJlcyAoc2VlIGFib3ZlKVxuICAgICAgICAgICAgICBpZiAoaXNNYXJrTGlnYXR1cmUpIHtcbiAgICAgICAgICAgICAgICBpZHggPSBtYXRjaEluZGV4O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPCBtYXRjaEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbGlnYXR1cmVDb21wb25lbnQgPSBjdXJDb21wcyAtIGxhc3ROdW1Db21wcyArIE1hdGgubWluKHRoaXMuZ2x5cGhzW2lkeF0ubGlnYXR1cmVDb21wb25lbnQgfHwgMSwgbGFzdE51bUNvbXBzKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2x5cGhzW2lkeF0ubGlnYXR1cmVJRCA9IGxpZ2F0dXJlR2x5cGgubGlnYXR1cmVJRDtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2x5cGhzW2lkeF0ubGlnYXR1cmVDb21wb25lbnQgPSBsaWdhdHVyZUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxhc3RMaWdJRCA9IHRoaXMuZ2x5cGhzW2lkeF0ubGlnYXR1cmVJRDtcbiAgICAgICAgICAgICAgbGFzdE51bUNvbXBzID0gdGhpcy5nbHlwaHNbaWR4XS5jb2RlUG9pbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgY3VyQ29tcHMgKz0gbGFzdE51bUNvbXBzO1xuICAgICAgICAgICAgICBpZHgrKzsgLy8gc2tpcCBiYXNlIGdseXBoXG4gICAgICAgICAgICB9IC8vIEFkanVzdCBsaWdhdHVyZSBjb21wb25lbnRzIGZvciBhbnkgbWFya3MgZm9sbG93aW5nXG5cblxuICAgICAgICAgICAgaWYgKGxhc3RMaWdJRCAmJiAhaXNNYXJrTGlnYXR1cmUpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSBpZHg7IF9pIDwgdGhpcy5nbHlwaHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2x5cGhzW19pXS5saWdhdHVyZUlEID09PSBsYXN0TGlnSUQpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBsaWdhdHVyZUNvbXBvbmVudCA9IGN1ckNvbXBzIC0gbGFzdE51bUNvbXBzICsgTWF0aC5taW4odGhpcy5nbHlwaHNbX2ldLmxpZ2F0dXJlQ29tcG9uZW50IHx8IDEsIGxhc3ROdW1Db21wcyk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmdseXBoc1tfaV0ubGlnYXR1cmVDb21wb25lbnQgPSBsaWdhdHVyZUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIERlbGV0ZSB0aGUgbWF0Y2hlZCBnbHlwaHMsIGFuZCByZXBsYWNlIHRoZSBjdXJyZW50IGdseXBoIHdpdGggdGhlIGxpZ2F0dXJlIGdseXBoXG5cblxuICAgICAgICAgICAgZm9yICh2YXIgX2kyID0gbWF0Y2hlZC5sZW5ndGggLSAxOyBfaTIgPj0gMDsgX2kyLS0pIHtcbiAgICAgICAgICAgICAgdGhpcy5nbHlwaHMuc3BsaWNlKG1hdGNoZWRbX2kyXSwgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZ2x5cGhzW3RoaXMuZ2x5cGhJdGVyYXRvci5pbmRleF0gPSBsaWdhdHVyZUdseXBoO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgNTpcbiAgICAgICAgLy8gQ29udGV4dHVhbCBTdWJzdGl0dXRpb25cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlDb250ZXh0KHRhYmxlKTtcblxuICAgICAgY2FzZSA2OlxuICAgICAgICAvLyBDaGFpbmluZyBDb250ZXh0dWFsIFN1YnN0aXR1dGlvblxuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUNoYWluaW5nQ29udGV4dCh0YWJsZSk7XG5cbiAgICAgIGNhc2UgNzpcbiAgICAgICAgLy8gRXh0ZW5zaW9uIFN1YnN0aXR1dGlvblxuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxvb2t1cCh0YWJsZS5sb29rdXBUeXBlLCB0YWJsZS5leHRlbnNpb24pO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHU1VCIGxvb2t1cFR5cGUgXCIgKyBsb29rdXBUeXBlICsgXCIgaXMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEdTVUJQcm9jZXNzb3I7XG59KE9UUHJvY2Vzc29yKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRqKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRqKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRqKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkaihvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGoobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRqKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSQ4KHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgR1BPU1Byb2Nlc3NvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX09UUHJvY2Vzc29yKSB7XG4gIF9pbmhlcml0c0xvb3NlJDgoR1BPU1Byb2Nlc3NvciwgX09UUHJvY2Vzc29yKTtcblxuICBmdW5jdGlvbiBHUE9TUHJvY2Vzc29yKCkge1xuICAgIHJldHVybiBfT1RQcm9jZXNzb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEdQT1NQcm9jZXNzb3IucHJvdG90eXBlO1xuXG4gIF9wcm90by5hcHBseVBvc2l0aW9uVmFsdWUgPSBmdW5jdGlvbiBhcHBseVBvc2l0aW9uVmFsdWUoc2VxdWVuY2VJbmRleCwgdmFsdWUpIHtcbiAgICB2YXIgcG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uc1t0aGlzLmdseXBoSXRlcmF0b3IucGVla0luZGV4KHNlcXVlbmNlSW5kZXgpXTtcblxuICAgIGlmICh2YWx1ZS54QWR2YW5jZSAhPSBudWxsKSB7XG4gICAgICBwb3NpdGlvbi54QWR2YW5jZSArPSB2YWx1ZS54QWR2YW5jZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUueUFkdmFuY2UgIT0gbnVsbCkge1xuICAgICAgcG9zaXRpb24ueUFkdmFuY2UgKz0gdmFsdWUueUFkdmFuY2U7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnhQbGFjZW1lbnQgIT0gbnVsbCkge1xuICAgICAgcG9zaXRpb24ueE9mZnNldCArPSB2YWx1ZS54UGxhY2VtZW50O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS55UGxhY2VtZW50ICE9IG51bGwpIHtcbiAgICAgIHBvc2l0aW9uLnlPZmZzZXQgKz0gdmFsdWUueVBsYWNlbWVudDtcbiAgICB9IC8vIEFkanVzdG1lbnRzIGZvciBmb250IHZhcmlhdGlvbnNcblxuXG4gICAgdmFyIHZhcmlhdGlvblByb2Nlc3NvciA9IHRoaXMuZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yO1xuICAgIHZhciB2YXJpYXRpb25TdG9yZSA9IHRoaXMuZm9udC5HREVGICYmIHRoaXMuZm9udC5HREVGLml0ZW1WYXJpYXRpb25TdG9yZTtcblxuICAgIGlmICh2YXJpYXRpb25Qcm9jZXNzb3IgJiYgdmFyaWF0aW9uU3RvcmUpIHtcbiAgICAgIGlmICh2YWx1ZS54UGxhRGV2aWNlKSB7XG4gICAgICAgIHBvc2l0aW9uLnhPZmZzZXQgKz0gdmFyaWF0aW9uUHJvY2Vzc29yLmdldERlbHRhKHZhcmlhdGlvblN0b3JlLCB2YWx1ZS54UGxhRGV2aWNlLmEsIHZhbHVlLnhQbGFEZXZpY2UuYik7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZS55UGxhRGV2aWNlKSB7XG4gICAgICAgIHBvc2l0aW9uLnlPZmZzZXQgKz0gdmFyaWF0aW9uUHJvY2Vzc29yLmdldERlbHRhKHZhcmlhdGlvblN0b3JlLCB2YWx1ZS55UGxhRGV2aWNlLmEsIHZhbHVlLnlQbGFEZXZpY2UuYik7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZS54QWR2RGV2aWNlKSB7XG4gICAgICAgIHBvc2l0aW9uLnhBZHZhbmNlICs9IHZhcmlhdGlvblByb2Nlc3Nvci5nZXREZWx0YSh2YXJpYXRpb25TdG9yZSwgdmFsdWUueEFkdkRldmljZS5hLCB2YWx1ZS54QWR2RGV2aWNlLmIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUueUFkdkRldmljZSkge1xuICAgICAgICBwb3NpdGlvbi55QWR2YW5jZSArPSB2YXJpYXRpb25Qcm9jZXNzb3IuZ2V0RGVsdGEodmFyaWF0aW9uU3RvcmUsIHZhbHVlLnlBZHZEZXZpY2UuYSwgdmFsdWUueUFkdkRldmljZS5iKTtcbiAgICAgIH1cbiAgICB9IC8vIFRPRE86IGRldmljZSB0YWJsZXNcblxuICB9O1xuXG4gIF9wcm90by5hcHBseUxvb2t1cCA9IGZ1bmN0aW9uIGFwcGx5TG9va3VwKGxvb2t1cFR5cGUsIHRhYmxlKSB7XG4gICAgc3dpdGNoIChsb29rdXBUeXBlKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBTaW5nbGUgcG9zaXRpb25pbmcgdmFsdWVcbiAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UpO1xuXG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3aXRjaCAodGFibGUudmVyc2lvbikge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICB0aGlzLmFwcGx5UG9zaXRpb25WYWx1ZSgwLCB0YWJsZS52YWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgIHRoaXMuYXBwbHlQb3NpdGlvblZhbHVlKDAsIHRhYmxlLnZhbHVlcy5nZXQoaW5kZXgpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAyOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gUGFpciBBZGp1c3RtZW50IFBvc2l0aW9uaW5nXG4gICAgICAgICAgdmFyIG5leHRHbHlwaCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5wZWVrKCk7XG5cbiAgICAgICAgICBpZiAoIW5leHRHbHlwaCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfaW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UpO1xuXG4gICAgICAgICAgaWYgKF9pbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2l0Y2ggKHRhYmxlLnZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgLy8gQWRqdXN0bWVudHMgZm9yIGdseXBoIHBhaXJzXG4gICAgICAgICAgICAgIHZhciBzZXQgPSB0YWJsZS5wYWlyU2V0cy5nZXQoX2luZGV4KTtcblxuICAgICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGooc2V0KSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgICB2YXIgX3BhaXIgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChfcGFpci5zZWNvbmRHbHlwaCA9PT0gbmV4dEdseXBoLmlkKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5UG9zaXRpb25WYWx1ZSgwLCBfcGFpci52YWx1ZTEpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseVBvc2l0aW9uVmFsdWUoMSwgX3BhaXIudmFsdWUyKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAvLyBDbGFzcyBwYWlyIGFkanVzdG1lbnRcbiAgICAgICAgICAgICAgdmFyIGNsYXNzMSA9IHRoaXMuZ2V0Q2xhc3NJRCh0aGlzLmdseXBoSXRlcmF0b3IuY3VyLmlkLCB0YWJsZS5jbGFzc0RlZjEpO1xuICAgICAgICAgICAgICB2YXIgY2xhc3MyID0gdGhpcy5nZXRDbGFzc0lEKG5leHRHbHlwaC5pZCwgdGFibGUuY2xhc3NEZWYyKTtcblxuICAgICAgICAgICAgICBpZiAoY2xhc3MxID09PSAtMSB8fCBjbGFzczIgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIHBhaXIgPSB0YWJsZS5jbGFzc1JlY29yZHMuZ2V0KGNsYXNzMSkuZ2V0KGNsYXNzMik7XG4gICAgICAgICAgICAgIHRoaXMuYXBwbHlQb3NpdGlvblZhbHVlKDAsIHBhaXIudmFsdWUxKTtcbiAgICAgICAgICAgICAgdGhpcy5hcHBseVBvc2l0aW9uVmFsdWUoMSwgcGFpci52YWx1ZTIpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAzOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gQ3Vyc2l2ZSBBdHRhY2htZW50IFBvc2l0aW9uaW5nXG4gICAgICAgICAgdmFyIG5leHRJbmRleCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5wZWVrSW5kZXgoKTtcbiAgICAgICAgICB2YXIgX25leHRHbHlwaCA9IHRoaXMuZ2x5cGhzW25leHRJbmRleF07XG5cbiAgICAgICAgICBpZiAoIV9uZXh0R2x5cGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY3VyUmVjb3JkID0gdGFibGUuZW50cnlFeGl0UmVjb3Jkc1t0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UpXTtcblxuICAgICAgICAgIGlmICghY3VyUmVjb3JkIHx8ICFjdXJSZWNvcmQuZXhpdEFuY2hvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0UmVjb3JkID0gdGFibGUuZW50cnlFeGl0UmVjb3Jkc1t0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UsIF9uZXh0R2x5cGguaWQpXTtcblxuICAgICAgICAgIGlmICghbmV4dFJlY29yZCB8fCAhbmV4dFJlY29yZC5lbnRyeUFuY2hvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMuZ2V0QW5jaG9yKG5leHRSZWNvcmQuZW50cnlBbmNob3IpO1xuICAgICAgICAgIHZhciBleGl0ID0gdGhpcy5nZXRBbmNob3IoY3VyUmVjb3JkLmV4aXRBbmNob3IpO1xuICAgICAgICAgIHZhciBjdXIgPSB0aGlzLnBvc2l0aW9uc1t0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXhdO1xuICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5wb3NpdGlvbnNbbmV4dEluZGV4XTtcblxuICAgICAgICAgIHN3aXRjaCAodGhpcy5kaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2x0cic6XG4gICAgICAgICAgICAgIGN1ci54QWR2YW5jZSA9IGV4aXQueCArIGN1ci54T2Zmc2V0O1xuICAgICAgICAgICAgICB2YXIgZCA9IGVudHJ5LnggKyBuZXh0LnhPZmZzZXQ7XG4gICAgICAgICAgICAgIG5leHQueEFkdmFuY2UgLT0gZDtcbiAgICAgICAgICAgICAgbmV4dC54T2Zmc2V0IC09IGQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdydGwnOlxuICAgICAgICAgICAgICBkID0gZXhpdC54ICsgY3VyLnhPZmZzZXQ7XG4gICAgICAgICAgICAgIGN1ci54QWR2YW5jZSAtPSBkO1xuICAgICAgICAgICAgICBjdXIueE9mZnNldCAtPSBkO1xuICAgICAgICAgICAgICBuZXh0LnhBZHZhbmNlID0gZW50cnkueCArIG5leHQueE9mZnNldDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuZ2x5cGhJdGVyYXRvci5mbGFncy5yaWdodFRvTGVmdCkge1xuICAgICAgICAgICAgdGhpcy5nbHlwaEl0ZXJhdG9yLmN1ci5jdXJzaXZlQXR0YWNobWVudCA9IG5leHRJbmRleDtcbiAgICAgICAgICAgIGN1ci55T2Zmc2V0ID0gZW50cnkueSAtIGV4aXQueTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX25leHRHbHlwaC5jdXJzaXZlQXR0YWNobWVudCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5pbmRleDtcbiAgICAgICAgICAgIGN1ci55T2Zmc2V0ID0gZXhpdC55IC0gZW50cnkueTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBNYXJrIHRvIGJhc2UgcG9zaXRpb25pbmdcbiAgICAgICAgICB2YXIgbWFya0luZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLm1hcmtDb3ZlcmFnZSk7XG5cbiAgICAgICAgICBpZiAobWFya0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gLy8gc2VhcmNoIGJhY2t3YXJkIGZvciBhIGJhc2UgZ2x5cGhcblxuXG4gICAgICAgICAgdmFyIGJhc2VHbHlwaEluZGV4ID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4O1xuXG4gICAgICAgICAgd2hpbGUgKC0tYmFzZUdseXBoSW5kZXggPj0gMCAmJiAodGhpcy5nbHlwaHNbYmFzZUdseXBoSW5kZXhdLmlzTWFyayB8fCB0aGlzLmdseXBoc1tiYXNlR2x5cGhJbmRleF0ubGlnYXR1cmVDb21wb25lbnQgPiAwKSkge1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChiYXNlR2x5cGhJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgYmFzZUluZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmJhc2VDb3ZlcmFnZSwgdGhpcy5nbHlwaHNbYmFzZUdseXBoSW5kZXhdLmlkKTtcblxuICAgICAgICAgIGlmIChiYXNlSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG1hcmtSZWNvcmQgPSB0YWJsZS5tYXJrQXJyYXlbbWFya0luZGV4XTtcbiAgICAgICAgICB2YXIgYmFzZUFuY2hvciA9IHRhYmxlLmJhc2VBcnJheVtiYXNlSW5kZXhdW21hcmtSZWNvcmRbXCJjbGFzc1wiXV07XG4gICAgICAgICAgdGhpcy5hcHBseUFuY2hvcihtYXJrUmVjb3JkLCBiYXNlQW5jaG9yLCBiYXNlR2x5cGhJbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA1OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gTWFyayB0byBsaWdhdHVyZSBwb3NpdGlvbmluZ1xuICAgICAgICAgIHZhciBfbWFya0luZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLm1hcmtDb3ZlcmFnZSk7XG5cbiAgICAgICAgICBpZiAoX21hcmtJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IC8vIHNlYXJjaCBiYWNrd2FyZCBmb3IgYSBiYXNlIGdseXBoXG5cblxuICAgICAgICAgIHZhciBfYmFzZUdseXBoSW5kZXggPSB0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXg7XG5cbiAgICAgICAgICB3aGlsZSAoLS1fYmFzZUdseXBoSW5kZXggPj0gMCAmJiB0aGlzLmdseXBoc1tfYmFzZUdseXBoSW5kZXhdLmlzTWFyaykge1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfYmFzZUdseXBoSW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGxpZ0luZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmxpZ2F0dXJlQ292ZXJhZ2UsIHRoaXMuZ2x5cGhzW19iYXNlR2x5cGhJbmRleF0uaWQpO1xuXG4gICAgICAgICAgaWYgKGxpZ0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBsaWdBdHRhY2ggPSB0YWJsZS5saWdhdHVyZUFycmF5W2xpZ0luZGV4XTtcbiAgICAgICAgICB2YXIgbWFya0dseXBoID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmN1cjtcbiAgICAgICAgICB2YXIgbGlnR2x5cGggPSB0aGlzLmdseXBoc1tfYmFzZUdseXBoSW5kZXhdO1xuICAgICAgICAgIHZhciBjb21wSW5kZXggPSBsaWdHbHlwaC5saWdhdHVyZUlEICYmIGxpZ0dseXBoLmxpZ2F0dXJlSUQgPT09IG1hcmtHbHlwaC5saWdhdHVyZUlEICYmIG1hcmtHbHlwaC5saWdhdHVyZUNvbXBvbmVudCA+IDAgPyBNYXRoLm1pbihtYXJrR2x5cGgubGlnYXR1cmVDb21wb25lbnQsIGxpZ0dseXBoLmNvZGVQb2ludHMubGVuZ3RoKSAtIDEgOiBsaWdHbHlwaC5jb2RlUG9pbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgdmFyIF9tYXJrUmVjb3JkID0gdGFibGUubWFya0FycmF5W19tYXJrSW5kZXhdO1xuICAgICAgICAgIHZhciBfYmFzZUFuY2hvciA9IGxpZ0F0dGFjaFtjb21wSW5kZXhdW19tYXJrUmVjb3JkW1wiY2xhc3NcIl1dO1xuICAgICAgICAgIHRoaXMuYXBwbHlBbmNob3IoX21hcmtSZWNvcmQsIF9iYXNlQW5jaG9yLCBfYmFzZUdseXBoSW5kZXgpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgNjpcbiAgICAgICAge1xuICAgICAgICAgIC8vIE1hcmsgdG8gbWFyayBwb3NpdGlvbmluZ1xuICAgICAgICAgIHZhciBtYXJrMUluZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLm1hcmsxQ292ZXJhZ2UpO1xuXG4gICAgICAgICAgaWYgKG1hcmsxSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSAvLyBnZXQgdGhlIHByZXZpb3VzIG1hcmsgdG8gYXR0YWNoIHRvXG5cblxuICAgICAgICAgIHZhciBwcmV2SW5kZXggPSB0aGlzLmdseXBoSXRlcmF0b3IucGVla0luZGV4KC0xKTtcbiAgICAgICAgICB2YXIgcHJldiA9IHRoaXMuZ2x5cGhzW3ByZXZJbmRleF07XG5cbiAgICAgICAgICBpZiAoIXByZXYgfHwgIXByZXYuaXNNYXJrKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9jdXIgPSB0aGlzLmdseXBoSXRlcmF0b3IuY3VyOyAvLyBUaGUgZm9sbG93aW5nIGxvZ2ljIHdhcyBib3Jyb3dlZCBmcm9tIEhhcmZidXp6XG5cbiAgICAgICAgICB2YXIgZ29vZCA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKF9jdXIubGlnYXR1cmVJRCA9PT0gcHJldi5saWdhdHVyZUlEKSB7XG4gICAgICAgICAgICBpZiAoIV9jdXIubGlnYXR1cmVJRCkge1xuICAgICAgICAgICAgICAvLyBNYXJrcyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgYmFzZVxuICAgICAgICAgICAgICBnb29kID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX2N1ci5saWdhdHVyZUNvbXBvbmVudCA9PT0gcHJldi5saWdhdHVyZUNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAvLyBNYXJrcyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgbGlnYXR1cmUgY29tcG9uZW50XG4gICAgICAgICAgICAgIGdvb2QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBsaWdhdHVyZSBpZHMgZG9uJ3QgbWF0Y2gsIGl0IG1heSBiZSB0aGUgY2FzZSB0aGF0IG9uZSBvZiB0aGUgbWFya3NcbiAgICAgICAgICAgIC8vIGl0c2VsZiBpcyBhIGxpZ2F0dXJlLCBpbiB3aGljaCBjYXNlIG1hdGNoLlxuICAgICAgICAgICAgaWYgKF9jdXIubGlnYXR1cmVJRCAmJiAhX2N1ci5saWdhdHVyZUNvbXBvbmVudCB8fCBwcmV2LmxpZ2F0dXJlSUQgJiYgIXByZXYubGlnYXR1cmVDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgZ29vZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFnb29kKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG1hcmsySW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUubWFyazJDb3ZlcmFnZSwgcHJldi5pZCk7XG5cbiAgICAgICAgICBpZiAobWFyazJJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX21hcmtSZWNvcmQyID0gdGFibGUubWFyazFBcnJheVttYXJrMUluZGV4XTtcbiAgICAgICAgICB2YXIgX2Jhc2VBbmNob3IyID0gdGFibGUubWFyazJBcnJheVttYXJrMkluZGV4XVtfbWFya1JlY29yZDJbXCJjbGFzc1wiXV07XG4gICAgICAgICAgdGhpcy5hcHBseUFuY2hvcihfbWFya1JlY29yZDIsIF9iYXNlQW5jaG9yMiwgcHJldkluZGV4KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDc6XG4gICAgICAgIC8vIENvbnRleHR1YWwgcG9zaXRpb25pbmdcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlDb250ZXh0KHRhYmxlKTtcblxuICAgICAgY2FzZSA4OlxuICAgICAgICAvLyBDaGFpbmluZyBjb250ZXh0dWFsIHBvc2l0aW9uaW5nXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5Q2hhaW5pbmdDb250ZXh0KHRhYmxlKTtcblxuICAgICAgY2FzZSA5OlxuICAgICAgICAvLyBFeHRlbnNpb24gcG9zaXRpb25pbmdcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMb29rdXAodGFibGUubG9va3VwVHlwZSwgdGFibGUuZXh0ZW5zaW9uKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgR1BPUyB0YWJsZTogXCIgKyBsb29rdXBUeXBlKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmFwcGx5QW5jaG9yID0gZnVuY3Rpb24gYXBwbHlBbmNob3IobWFya1JlY29yZCwgYmFzZUFuY2hvciwgYmFzZUdseXBoSW5kZXgpIHtcbiAgICB2YXIgYmFzZUNvb3JkcyA9IHRoaXMuZ2V0QW5jaG9yKGJhc2VBbmNob3IpO1xuICAgIHZhciBtYXJrQ29vcmRzID0gdGhpcy5nZXRBbmNob3IobWFya1JlY29yZC5tYXJrQW5jaG9yKTtcbiAgICB2YXIgYmFzZVBvcyA9IHRoaXMucG9zaXRpb25zW2Jhc2VHbHlwaEluZGV4XTtcbiAgICB2YXIgbWFya1BvcyA9IHRoaXMucG9zaXRpb25zW3RoaXMuZ2x5cGhJdGVyYXRvci5pbmRleF07XG4gICAgbWFya1Bvcy54T2Zmc2V0ID0gYmFzZUNvb3Jkcy54IC0gbWFya0Nvb3Jkcy54O1xuICAgIG1hcmtQb3MueU9mZnNldCA9IGJhc2VDb29yZHMueSAtIG1hcmtDb29yZHMueTtcbiAgICB0aGlzLmdseXBoSXRlcmF0b3IuY3VyLm1hcmtBdHRhY2htZW50ID0gYmFzZUdseXBoSW5kZXg7XG4gIH07XG5cbiAgX3Byb3RvLmdldEFuY2hvciA9IGZ1bmN0aW9uIGdldEFuY2hvcihhbmNob3IpIHtcbiAgICAvLyBUT0RPOiBjb250b3VyIHBvaW50LCBkZXZpY2UgdGFibGVzXG4gICAgdmFyIHggPSBhbmNob3IueENvb3JkaW5hdGU7XG4gICAgdmFyIHkgPSBhbmNob3IueUNvb3JkaW5hdGU7IC8vIEFkanVzdG1lbnRzIGZvciBmb250IHZhcmlhdGlvbnNcblxuICAgIHZhciB2YXJpYXRpb25Qcm9jZXNzb3IgPSB0aGlzLmZvbnQuX3ZhcmlhdGlvblByb2Nlc3NvcjtcbiAgICB2YXIgdmFyaWF0aW9uU3RvcmUgPSB0aGlzLmZvbnQuR0RFRiAmJiB0aGlzLmZvbnQuR0RFRi5pdGVtVmFyaWF0aW9uU3RvcmU7XG5cbiAgICBpZiAodmFyaWF0aW9uUHJvY2Vzc29yICYmIHZhcmlhdGlvblN0b3JlKSB7XG4gICAgICBpZiAoYW5jaG9yLnhEZXZpY2VUYWJsZSkge1xuICAgICAgICB4ICs9IHZhcmlhdGlvblByb2Nlc3Nvci5nZXREZWx0YSh2YXJpYXRpb25TdG9yZSwgYW5jaG9yLnhEZXZpY2VUYWJsZS5hLCBhbmNob3IueERldmljZVRhYmxlLmIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYW5jaG9yLnlEZXZpY2VUYWJsZSkge1xuICAgICAgICB5ICs9IHZhcmlhdGlvblByb2Nlc3Nvci5nZXREZWx0YSh2YXJpYXRpb25TdG9yZSwgYW5jaG9yLnlEZXZpY2VUYWJsZS5hLCBhbmNob3IueURldmljZVRhYmxlLmIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4OiB4LFxuICAgICAgeTogeVxuICAgIH07XG4gIH07XG5cbiAgX3Byb3RvLmFwcGx5RmVhdHVyZXMgPSBmdW5jdGlvbiBhcHBseUZlYXR1cmVzKHVzZXJGZWF0dXJlcywgZ2x5cGhzLCBhZHZhbmNlcykge1xuICAgIF9PVFByb2Nlc3Nvci5wcm90b3R5cGUuYXBwbHlGZWF0dXJlcy5jYWxsKHRoaXMsIHVzZXJGZWF0dXJlcywgZ2x5cGhzLCBhZHZhbmNlcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmZpeEN1cnNpdmVBdHRhY2htZW50KGkpO1xuICAgIH1cblxuICAgIHRoaXMuZml4TWFya0F0dGFjaG1lbnQoKTtcbiAgfTtcblxuICBfcHJvdG8uZml4Q3Vyc2l2ZUF0dGFjaG1lbnQgPSBmdW5jdGlvbiBmaXhDdXJzaXZlQXR0YWNobWVudChpKSB7XG4gICAgdmFyIGdseXBoID0gdGhpcy5nbHlwaHNbaV07XG5cbiAgICBpZiAoZ2x5cGguY3Vyc2l2ZUF0dGFjaG1lbnQgIT0gbnVsbCkge1xuICAgICAgdmFyIGogPSBnbHlwaC5jdXJzaXZlQXR0YWNobWVudDtcbiAgICAgIGdseXBoLmN1cnNpdmVBdHRhY2htZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZml4Q3Vyc2l2ZUF0dGFjaG1lbnQoaik7XG4gICAgICB0aGlzLnBvc2l0aW9uc1tpXS55T2Zmc2V0ICs9IHRoaXMucG9zaXRpb25zW2pdLnlPZmZzZXQ7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5maXhNYXJrQXR0YWNobWVudCA9IGZ1bmN0aW9uIGZpeE1hcmtBdHRhY2htZW50KCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBnbHlwaCA9IHRoaXMuZ2x5cGhzW2ldO1xuXG4gICAgICBpZiAoZ2x5cGgubWFya0F0dGFjaG1lbnQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgaiA9IGdseXBoLm1hcmtBdHRhY2htZW50O1xuICAgICAgICB0aGlzLnBvc2l0aW9uc1tpXS54T2Zmc2V0ICs9IHRoaXMucG9zaXRpb25zW2pdLnhPZmZzZXQ7XG4gICAgICAgIHRoaXMucG9zaXRpb25zW2ldLnlPZmZzZXQgKz0gdGhpcy5wb3NpdGlvbnNbal0ueU9mZnNldDtcblxuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsdHInKSB7XG4gICAgICAgICAgZm9yICh2YXIgayA9IGo7IGsgPCBpOyBrKyspIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25zW2ldLnhPZmZzZXQgLT0gdGhpcy5wb3NpdGlvbnNba10ueEFkdmFuY2U7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uc1tpXS55T2Zmc2V0IC09IHRoaXMucG9zaXRpb25zW2tdLnlBZHZhbmNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKHZhciBfayA9IGogKyAxOyBfayA8IGkgKyAxOyBfaysrKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uc1tpXS54T2Zmc2V0ICs9IHRoaXMucG9zaXRpb25zW19rXS54QWR2YW5jZTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25zW2ldLnlPZmZzZXQgKz0gdGhpcy5wb3NpdGlvbnNbX2tdLnlBZHZhbmNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gR1BPU1Byb2Nlc3Nvcjtcbn0oT1RQcm9jZXNzb3IpO1xuXG52YXIgT1RMYXlvdXRFbmdpbmUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBPVExheW91dEVuZ2luZShmb250KSB7XG4gICAgdGhpcy5mb250ID0gZm9udDtcbiAgICB0aGlzLmdseXBoSW5mb3MgPSBudWxsO1xuICAgIHRoaXMucGxhbiA9IG51bGw7XG4gICAgdGhpcy5HU1VCUHJvY2Vzc29yID0gbnVsbDtcbiAgICB0aGlzLkdQT1NQcm9jZXNzb3IgPSBudWxsO1xuICAgIHRoaXMuZmFsbGJhY2tQb3NpdGlvbiA9IHRydWU7XG5cbiAgICBpZiAoZm9udC5HU1VCKSB7XG4gICAgICB0aGlzLkdTVUJQcm9jZXNzb3IgPSBuZXcgR1NVQlByb2Nlc3Nvcihmb250LCBmb250LkdTVUIpO1xuICAgIH1cblxuICAgIGlmIChmb250LkdQT1MpIHtcbiAgICAgIHRoaXMuR1BPU1Byb2Nlc3NvciA9IG5ldyBHUE9TUHJvY2Vzc29yKGZvbnQsIGZvbnQuR1BPUyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIF9wcm90byA9IE9UTGF5b3V0RW5naW5lLnByb3RvdHlwZTtcblxuICBfcHJvdG8uc2V0dXAgPSBmdW5jdGlvbiBzZXR1cChnbHlwaFJ1bikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAvLyBNYXAgZ2x5cGhzIHRvIEdseXBoSW5mbyBvYmplY3RzIHNvIGRhdGEgY2FuIGJlIHBhc3NlZCBiZXR3ZWVuXG4gICAgLy8gR1NVQiBhbmQgR1BPUyB3aXRob3V0IG11dGF0aW5nIHRoZSByZWFsIChzaGFyZWQpIEdseXBoIG9iamVjdHMuXG4gICAgdGhpcy5nbHlwaEluZm9zID0gZ2x5cGhSdW4uZ2x5cGhzLm1hcChmdW5jdGlvbiAoZ2x5cGgpIHtcbiAgICAgIHJldHVybiBuZXcgR2x5cGhJbmZvKF90aGlzLmZvbnQsIGdseXBoLmlkLCBbXS5jb25jYXQoZ2x5cGguY29kZVBvaW50cykpO1xuICAgIH0pOyAvLyBTZWxlY3QgYSBzY3JpcHQgYmFzZWQgb24gd2hhdCBpcyBhdmFpbGFibGUgaW4gR1NVQi9HUE9TLlxuXG4gICAgdmFyIHNjcmlwdCA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5HUE9TUHJvY2Vzc29yKSB7XG4gICAgICBzY3JpcHQgPSB0aGlzLkdQT1NQcm9jZXNzb3Iuc2VsZWN0U2NyaXB0KGdseXBoUnVuLnNjcmlwdCwgZ2x5cGhSdW4ubGFuZ3VhZ2UsIGdseXBoUnVuLmRpcmVjdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuR1NVQlByb2Nlc3Nvcikge1xuICAgICAgc2NyaXB0ID0gdGhpcy5HU1VCUHJvY2Vzc29yLnNlbGVjdFNjcmlwdChnbHlwaFJ1bi5zY3JpcHQsIGdseXBoUnVuLmxhbmd1YWdlLCBnbHlwaFJ1bi5kaXJlY3Rpb24pO1xuICAgIH0gLy8gQ2hvb3NlIGEgc2hhcGVyIGJhc2VkIG9uIHRoZSBzY3JpcHQsIGFuZCBzZXR1cCBhIHNoYXBpbmcgcGxhbi5cbiAgICAvLyBUaGlzIGRldGVybWluZXMgd2hpY2ggZmVhdHVyZXMgdG8gYXBwbHkgdG8gd2hpY2ggZ2x5cGhzLlxuXG5cbiAgICB0aGlzLnNoYXBlciA9IGNob29zZShzY3JpcHQpO1xuICAgIHRoaXMucGxhbiA9IG5ldyBTaGFwaW5nUGxhbih0aGlzLmZvbnQsIHNjcmlwdCwgZ2x5cGhSdW4uZGlyZWN0aW9uKTtcbiAgICB0aGlzLnNoYXBlci5wbGFuKHRoaXMucGxhbiwgdGhpcy5nbHlwaEluZm9zLCBnbHlwaFJ1bi5mZWF0dXJlcyk7IC8vIEFzc2lnbiBjaG9zZW4gZmVhdHVyZXMgdG8gb3V0cHV0IGdseXBoIHJ1blxuXG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMucGxhbi5hbGxGZWF0dXJlcykge1xuICAgICAgZ2x5cGhSdW4uZmVhdHVyZXNba2V5XSA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5zdWJzdGl0dXRlID0gZnVuY3Rpb24gc3Vic3RpdHV0ZShnbHlwaFJ1bikge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuR1NVQlByb2Nlc3Nvcikge1xuICAgICAgdGhpcy5wbGFuLnByb2Nlc3ModGhpcy5HU1VCUHJvY2Vzc29yLCB0aGlzLmdseXBoSW5mb3MpOyAvLyBNYXAgZ2x5cGggaW5mb3MgYmFjayB0byBub3JtYWwgR2x5cGggb2JqZWN0c1xuXG4gICAgICBnbHlwaFJ1bi5nbHlwaHMgPSB0aGlzLmdseXBoSW5mb3MubWFwKGZ1bmN0aW9uIChnbHlwaEluZm8pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5mb250LmdldEdseXBoKGdseXBoSW5mby5pZCwgZ2x5cGhJbmZvLmNvZGVQb2ludHMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5wb3NpdGlvbiA9IGZ1bmN0aW9uIHBvc2l0aW9uKGdseXBoUnVuKSB7XG4gICAgaWYgKHRoaXMuc2hhcGVyLnplcm9NYXJrV2lkdGhzID09PSAnQkVGT1JFX0dQT1MnKSB7XG4gICAgICB0aGlzLnplcm9NYXJrQWR2YW5jZXMoZ2x5cGhSdW4ucG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5HUE9TUHJvY2Vzc29yKSB7XG4gICAgICB0aGlzLnBsYW4ucHJvY2Vzcyh0aGlzLkdQT1NQcm9jZXNzb3IsIHRoaXMuZ2x5cGhJbmZvcywgZ2x5cGhSdW4ucG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaGFwZXIuemVyb01hcmtXaWR0aHMgPT09ICdBRlRFUl9HUE9TJykge1xuICAgICAgdGhpcy56ZXJvTWFya0FkdmFuY2VzKGdseXBoUnVuLnBvc2l0aW9ucyk7XG4gICAgfSAvLyBSZXZlcnNlIHRoZSBnbHlwaHMgYW5kIHBvc2l0aW9ucyBpZiB0aGUgc2NyaXB0IGlzIHJpZ2h0LXRvLWxlZnRcblxuXG4gICAgaWYgKGdseXBoUnVuLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICAgIGdseXBoUnVuLmdseXBocy5yZXZlcnNlKCk7XG4gICAgICBnbHlwaFJ1bi5wb3NpdGlvbnMucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLkdQT1NQcm9jZXNzb3IgJiYgdGhpcy5HUE9TUHJvY2Vzc29yLmZlYXR1cmVzO1xuICB9O1xuXG4gIF9wcm90by56ZXJvTWFya0FkdmFuY2VzID0gZnVuY3Rpb24gemVyb01hcmtBZHZhbmNlcyhwb3NpdGlvbnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2x5cGhJbmZvcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2x5cGhJbmZvc1tpXS5pc01hcmspIHtcbiAgICAgICAgcG9zaXRpb25zW2ldLnhBZHZhbmNlID0gMDtcbiAgICAgICAgcG9zaXRpb25zW2ldLnlBZHZhbmNlID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmNsZWFudXAgPSBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHRoaXMuZ2x5cGhJbmZvcyA9IG51bGw7XG4gICAgdGhpcy5wbGFuID0gbnVsbDtcbiAgICB0aGlzLnNoYXBlciA9IG51bGw7XG4gIH07XG5cbiAgX3Byb3RvLmdldEF2YWlsYWJsZUZlYXR1cmVzID0gZnVuY3Rpb24gZ2V0QXZhaWxhYmxlRmVhdHVyZXMoc2NyaXB0LCBsYW5ndWFnZSkge1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuR1NVQlByb2Nlc3Nvcikge1xuICAgICAgdGhpcy5HU1VCUHJvY2Vzc29yLnNlbGVjdFNjcmlwdChzY3JpcHQsIGxhbmd1YWdlKTtcbiAgICAgIGZlYXR1cmVzLnB1c2guYXBwbHkoZmVhdHVyZXMsIE9iamVjdC5rZXlzKHRoaXMuR1NVQlByb2Nlc3Nvci5mZWF0dXJlcykpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLkdQT1NQcm9jZXNzb3IpIHtcbiAgICAgIHRoaXMuR1BPU1Byb2Nlc3Nvci5zZWxlY3RTY3JpcHQoc2NyaXB0LCBsYW5ndWFnZSk7XG4gICAgICBmZWF0dXJlcy5wdXNoLmFwcGx5KGZlYXR1cmVzLCBPYmplY3Qua2V5cyh0aGlzLkdQT1NQcm9jZXNzb3IuZmVhdHVyZXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmVhdHVyZXM7XG4gIH07XG5cbiAgcmV0dXJuIE9UTGF5b3V0RW5naW5lO1xufSgpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGsobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGsobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGsobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRrKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkayhvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGsoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBMYXlvdXRFbmdpbmUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBMYXlvdXRFbmdpbmUoZm9udCkge1xuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgdGhpcy51bmljb2RlTGF5b3V0RW5naW5lID0gbnVsbDtcbiAgICB0aGlzLmtlcm5Qcm9jZXNzb3IgPSBudWxsOyAvLyBDaG9vc2UgYW4gYWR2YW5jZWQgbGF5b3V0IGVuZ2luZS4gV2UgdHJ5IHRoZSBBQVQgbW9yeCB0YWJsZSBmaXJzdCBzaW5jZSBtb3JlXG4gICAgLy8gc2NyaXB0cyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCBiZWNhdXNlIHRoZSBzaGFwaW5nIGxvZ2ljIGlzIGJ1aWx0IGludG8gdGhlIGZvbnQuXG5cbiAgICBpZiAodGhpcy5mb250Lm1vcngpIHtcbiAgICAgIHRoaXMuZW5naW5lID0gbmV3IEFBVExheW91dEVuZ2luZSh0aGlzLmZvbnQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mb250LkdTVUIgfHwgdGhpcy5mb250LkdQT1MpIHtcbiAgICAgIHRoaXMuZW5naW5lID0gbmV3IE9UTGF5b3V0RW5naW5lKHRoaXMuZm9udCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIF9wcm90byA9IExheW91dEVuZ2luZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmxheW91dCA9IGZ1bmN0aW9uIGxheW91dChzdHJpbmcsIGZlYXR1cmVzLCBzY3JpcHQsIGxhbmd1YWdlLCBkaXJlY3Rpb24pIHtcbiAgICAvLyBNYWtlIHRoZSBmZWF0dXJlcyBwYXJhbWV0ZXIgb3B0aW9uYWxcbiAgICBpZiAodHlwZW9mIGZlYXR1cmVzID09PSAnc3RyaW5nJykge1xuICAgICAgZGlyZWN0aW9uID0gbGFuZ3VhZ2U7XG4gICAgICBsYW5ndWFnZSA9IHNjcmlwdDtcbiAgICAgIHNjcmlwdCA9IGZlYXR1cmVzO1xuICAgICAgZmVhdHVyZXMgPSBbXTtcbiAgICB9IC8vIE1hcCBzdHJpbmcgdG8gZ2x5cGhzIGlmIG5lZWRlZFxuXG5cbiAgICBpZiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gZGV0ZWN0IHRoZSBzY3JpcHQgZnJvbSB0aGUgc3RyaW5nIGlmIG5vdCBwcm92aWRlZC5cbiAgICAgIGlmIChzY3JpcHQgPT0gbnVsbCkge1xuICAgICAgICBzY3JpcHQgPSBmb3JTdHJpbmcoc3RyaW5nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGdseXBocyA9IHRoaXMuZm9udC5nbHlwaHNGb3JTdHJpbmcoc3RyaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXR0ZW1wdCB0byBkZXRlY3QgdGhlIHNjcmlwdCBmcm9tIHRoZSBnbHlwaCBjb2RlIHBvaW50cyBpZiBub3QgcHJvdmlkZWQuXG4gICAgICBpZiAoc2NyaXB0ID09IG51bGwpIHtcbiAgICAgICAgdmFyIGNvZGVQb2ludHMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGsoc3RyaW5nKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgZ2x5cGggPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBjb2RlUG9pbnRzLnB1c2guYXBwbHkoY29kZVBvaW50cywgZ2x5cGguY29kZVBvaW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICBzY3JpcHQgPSBmb3JDb2RlUG9pbnRzKGNvZGVQb2ludHMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZ2x5cGhzID0gc3RyaW5nO1xuICAgIH1cblxuICAgIHZhciBnbHlwaFJ1biA9IG5ldyBHbHlwaFJ1bihnbHlwaHMsIGZlYXR1cmVzLCBzY3JpcHQsIGxhbmd1YWdlLCBkaXJlY3Rpb24pOyAvLyBSZXR1cm4gZWFybHkgaWYgdGhlcmUgYXJlIG5vIGdseXBoc1xuXG4gICAgaWYgKGdseXBocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGdseXBoUnVuLnBvc2l0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuIGdseXBoUnVuO1xuICAgIH0gLy8gU2V0dXAgdGhlIGFkdmFuY2VkIGxheW91dCBlbmdpbmVcblxuXG4gICAgaWYgKHRoaXMuZW5naW5lICYmIHRoaXMuZW5naW5lLnNldHVwKSB7XG4gICAgICB0aGlzLmVuZ2luZS5zZXR1cChnbHlwaFJ1bik7XG4gICAgfSAvLyBTdWJzdGl0dXRlIGFuZCBwb3NpdGlvbiB0aGUgZ2x5cGhzXG5cblxuICAgIHRoaXMuc3Vic3RpdHV0ZShnbHlwaFJ1bik7XG4gICAgdGhpcy5wb3NpdGlvbihnbHlwaFJ1bik7XG4gICAgdGhpcy5oaWRlRGVmYXVsdElnbm9yYWJsZXMoZ2x5cGhSdW4uZ2x5cGhzLCBnbHlwaFJ1bi5wb3NpdGlvbnMpOyAvLyBMZXQgdGhlIGxheW91dCBlbmdpbmUgY2xlYW4gdXAgYW55IHN0YXRlIGl0IG1pZ2h0IGhhdmVcblxuICAgIGlmICh0aGlzLmVuZ2luZSAmJiB0aGlzLmVuZ2luZS5jbGVhbnVwKSB7XG4gICAgICB0aGlzLmVuZ2luZS5jbGVhbnVwKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdseXBoUnVuO1xuICB9O1xuXG4gIF9wcm90by5zdWJzdGl0dXRlID0gZnVuY3Rpb24gc3Vic3RpdHV0ZShnbHlwaFJ1bikge1xuICAgIC8vIENhbGwgdGhlIGFkdmFuY2VkIGxheW91dCBlbmdpbmUgdG8gbWFrZSBzdWJzdGl0dXRpb25zXG4gICAgaWYgKHRoaXMuZW5naW5lICYmIHRoaXMuZW5naW5lLnN1YnN0aXR1dGUpIHtcbiAgICAgIHRoaXMuZW5naW5lLnN1YnN0aXR1dGUoZ2x5cGhSdW4pO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucG9zaXRpb24gPSBmdW5jdGlvbiBwb3NpdGlvbihnbHlwaFJ1bikge1xuICAgIC8vIEdldCBpbml0aWFsIGdseXBoIHBvc2l0aW9uc1xuICAgIGdseXBoUnVuLnBvc2l0aW9ucyA9IGdseXBoUnVuLmdseXBocy5tYXAoZnVuY3Rpb24gKGdseXBoKSB7XG4gICAgICByZXR1cm4gbmV3IEdseXBoUG9zaXRpb24oZ2x5cGguYWR2YW5jZVdpZHRoKTtcbiAgICB9KTtcbiAgICB2YXIgcG9zaXRpb25lZCA9IG51bGw7IC8vIENhbGwgdGhlIGFkdmFuY2VkIGxheW91dCBlbmdpbmUuIFJldHVybnMgdGhlIGZlYXR1cmVzIGFwcGxpZWQuXG5cbiAgICBpZiAodGhpcy5lbmdpbmUgJiYgdGhpcy5lbmdpbmUucG9zaXRpb24pIHtcbiAgICAgIHBvc2l0aW9uZWQgPSB0aGlzLmVuZ2luZS5wb3NpdGlvbihnbHlwaFJ1bik7XG4gICAgfSAvLyBpZiB0aGVyZSBpcyBubyBHUE9TIHRhYmxlLCB1c2UgdW5pY29kZSBwcm9wZXJ0aWVzIHRvIHBvc2l0aW9uIG1hcmtzLlxuXG5cbiAgICBpZiAoIXBvc2l0aW9uZWQgJiYgKCF0aGlzLmVuZ2luZSB8fCB0aGlzLmVuZ2luZS5mYWxsYmFja1Bvc2l0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLnVuaWNvZGVMYXlvdXRFbmdpbmUpIHtcbiAgICAgICAgdGhpcy51bmljb2RlTGF5b3V0RW5naW5lID0gbmV3IFVuaWNvZGVMYXlvdXRFbmdpbmUodGhpcy5mb250KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51bmljb2RlTGF5b3V0RW5naW5lLnBvc2l0aW9uR2x5cGhzKGdseXBoUnVuLmdseXBocywgZ2x5cGhSdW4ucG9zaXRpb25zKTtcbiAgICB9IC8vIGlmIGtlcm5pbmcgaXMgbm90IHN1cHBvcnRlZCBieSBHUE9TLCBkbyBrZXJuaW5nIHdpdGggdGhlIFRydWVUeXBlL0FBVCBrZXJuIHRhYmxlXG5cblxuICAgIGlmICgoIXBvc2l0aW9uZWQgfHwgIXBvc2l0aW9uZWQua2VybikgJiYgZ2x5cGhSdW4uZmVhdHVyZXMua2VybiAhPT0gZmFsc2UgJiYgdGhpcy5mb250Lmtlcm4pIHtcbiAgICAgIGlmICghdGhpcy5rZXJuUHJvY2Vzc29yKSB7XG4gICAgICAgIHRoaXMua2VyblByb2Nlc3NvciA9IG5ldyBLZXJuUHJvY2Vzc29yKHRoaXMuZm9udCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMua2VyblByb2Nlc3Nvci5wcm9jZXNzKGdseXBoUnVuLmdseXBocywgZ2x5cGhSdW4ucG9zaXRpb25zKTtcbiAgICAgIGdseXBoUnVuLmZlYXR1cmVzLmtlcm4gPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uaGlkZURlZmF1bHRJZ25vcmFibGVzID0gZnVuY3Rpb24gaGlkZURlZmF1bHRJZ25vcmFibGVzKGdseXBocywgcG9zaXRpb25zKSB7XG4gICAgdmFyIHNwYWNlID0gdGhpcy5mb250LmdseXBoRm9yQ29kZVBvaW50KDB4MjApO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmlzRGVmYXVsdElnbm9yYWJsZShnbHlwaHNbaV0uY29kZVBvaW50c1swXSkpIHtcbiAgICAgICAgZ2x5cGhzW2ldID0gc3BhY2U7XG4gICAgICAgIHBvc2l0aW9uc1tpXS54QWR2YW5jZSA9IDA7XG4gICAgICAgIHBvc2l0aW9uc1tpXS55QWR2YW5jZSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5pc0RlZmF1bHRJZ25vcmFibGUgPSBmdW5jdGlvbiBpc0RlZmF1bHRJZ25vcmFibGUoY2gpIHtcbiAgICAvLyBGcm9tIERlcml2ZWRDb3JlUHJvcGVydGllcy50eHQgaW4gdGhlIFVuaWNvZGUgZGF0YWJhc2UsXG4gICAgLy8gbWludXMgVSsxMTVGLCBVKzExNjAsIFUrMzE2NCBhbmQgVStGRkEwLCB3aGljaCBpcyB3aGF0XG4gICAgLy8gSGFyZmJ1enogYW5kIFVuaXNjcmliZSBkby5cbiAgICB2YXIgcGxhbmUgPSBjaCA+PiAxNjtcblxuICAgIGlmIChwbGFuZSA9PT0gMCkge1xuICAgICAgLy8gQk1QXG4gICAgICBzd2l0Y2ggKGNoID4+IDgpIHtcbiAgICAgICAgY2FzZSAweDAwOlxuICAgICAgICAgIHJldHVybiBjaCA9PT0gMHgwMEFEO1xuXG4gICAgICAgIGNhc2UgMHgwMzpcbiAgICAgICAgICByZXR1cm4gY2ggPT09IDB4MDM0RjtcblxuICAgICAgICBjYXNlIDB4MDY6XG4gICAgICAgICAgcmV0dXJuIGNoID09PSAweDA2MUM7XG5cbiAgICAgICAgY2FzZSAweDE3OlxuICAgICAgICAgIHJldHVybiAweDE3QjQgPD0gY2ggJiYgY2ggPD0gMHgxN0I1O1xuXG4gICAgICAgIGNhc2UgMHgxODpcbiAgICAgICAgICByZXR1cm4gMHgxODBCIDw9IGNoICYmIGNoIDw9IDB4MTgwRTtcblxuICAgICAgICBjYXNlIDB4MjA6XG4gICAgICAgICAgcmV0dXJuIDB4MjAwQiA8PSBjaCAmJiBjaCA8PSAweDIwMEYgfHwgMHgyMDJBIDw9IGNoICYmIGNoIDw9IDB4MjAyRSB8fCAweDIwNjAgPD0gY2ggJiYgY2ggPD0gMHgyMDZGO1xuXG4gICAgICAgIGNhc2UgMHhGRTpcbiAgICAgICAgICByZXR1cm4gMHhGRTAwIDw9IGNoICYmIGNoIDw9IDB4RkUwRiB8fCBjaCA9PT0gMHhGRUZGO1xuXG4gICAgICAgIGNhc2UgMHhGRjpcbiAgICAgICAgICByZXR1cm4gMHhGRkYwIDw9IGNoICYmIGNoIDw9IDB4RkZGODtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXIgcGxhbmVzXG4gICAgICBzd2l0Y2ggKHBsYW5lKSB7XG4gICAgICAgIGNhc2UgMHgwMTpcbiAgICAgICAgICByZXR1cm4gMHgxQkNBMCA8PSBjaCAmJiBjaCA8PSAweDFCQ0EzIHx8IDB4MUQxNzMgPD0gY2ggJiYgY2ggPD0gMHgxRDE3QTtcblxuICAgICAgICBjYXNlIDB4MEU6XG4gICAgICAgICAgcmV0dXJuIDB4RTAwMDAgPD0gY2ggJiYgY2ggPD0gMHhFMEZGRjtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmdldEF2YWlsYWJsZUZlYXR1cmVzID0gZnVuY3Rpb24gZ2V0QXZhaWxhYmxlRmVhdHVyZXMoc2NyaXB0LCBsYW5ndWFnZSkge1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuZW5naW5lKSB7XG4gICAgICBmZWF0dXJlcy5wdXNoLmFwcGx5KGZlYXR1cmVzLCB0aGlzLmVuZ2luZS5nZXRBdmFpbGFibGVGZWF0dXJlcyhzY3JpcHQsIGxhbmd1YWdlKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZm9udC5rZXJuICYmIGZlYXR1cmVzLmluZGV4T2YoJ2tlcm4nKSA9PT0gLTEpIHtcbiAgICAgIGZlYXR1cmVzLnB1c2goJ2tlcm4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmVhdHVyZXM7XG4gIH07XG5cbiAgX3Byb3RvLnN0cmluZ3NGb3JHbHlwaCA9IGZ1bmN0aW9uIHN0cmluZ3NGb3JHbHlwaChnaWQpIHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IFNldCgpO1xuXG4gICAgdmFyIGNvZGVQb2ludHMgPSB0aGlzLmZvbnQuX2NtYXBQcm9jZXNzb3IuY29kZVBvaW50c0ZvckdseXBoKGdpZCk7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRrKGNvZGVQb2ludHMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgdmFyIGNvZGVQb2ludCA9IF9zdGVwMi52YWx1ZTtcbiAgICAgIHJlc3VsdC5hZGQoU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZVBvaW50KSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZW5naW5lICYmIHRoaXMuZW5naW5lLnN0cmluZ3NGb3JHbHlwaCkge1xuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2Ukayh0aGlzLmVuZ2luZS5zdHJpbmdzRm9yR2x5cGgoZ2lkKSksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBzdHJpbmcgPSBfc3RlcDMudmFsdWU7XG4gICAgICAgIHJlc3VsdC5hZGQoc3RyaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShyZXN1bHQpO1xuICB9O1xuXG4gIHJldHVybiBMYXlvdXRFbmdpbmU7XG59KCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkbChvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkbChvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkbChvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGwobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRsKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkbChhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkNSh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQ1KENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNShDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDUoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG52YXIgU1ZHX0NPTU1BTkRTID0ge1xuICBtb3ZlVG86ICdNJyxcbiAgbGluZVRvOiAnTCcsXG4gIHF1YWRyYXRpY0N1cnZlVG86ICdRJyxcbiAgYmV6aWVyQ3VydmVUbzogJ0MnLFxuICBjbG9zZVBhdGg6ICdaJ1xufTtcbi8qKlxuICogUGF0aCBvYmplY3RzIGFyZSByZXR1cm5lZCBieSBnbHlwaHMgYW5kIHJlcHJlc2VudCB0aGUgYWN0dWFsXG4gKiB2ZWN0b3Igb3V0bGluZXMgZm9yIGVhY2ggZ2x5cGggaW4gdGhlIGZvbnQuIFBhdGhzIGNhbiBiZSBjb252ZXJ0ZWRcbiAqIHRvIFNWRyBwYXRoIGRhdGEgc3RyaW5ncywgb3IgdG8gZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG9cbiAqIHJlbmRlciB0aGUgcGF0aCB0byBhIGdyYXBoaWNzIGNvbnRleHQuXG4gKi9cblxudmFyIFBhdGggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQYXRoKCkge1xuICAgIHRoaXMuY29tbWFuZHMgPSBbXTtcbiAgICB0aGlzLl9iYm94ID0gbnVsbDtcbiAgICB0aGlzLl9jYm94ID0gbnVsbDtcbiAgfVxuICAvKipcbiAgICogQ29tcGlsZXMgdGhlIHBhdGggdG8gYSBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgd2l0aFxuICAgKiBhIGdyYXBoaWNzIGNvbnRleHQgaW4gb3JkZXIgdG8gcmVuZGVyIHRoZSBwYXRoLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFBhdGgucHJvdG90eXBlO1xuXG4gIF9wcm90by50b0Z1bmN0aW9uID0gZnVuY3Rpb24gdG9GdW5jdGlvbigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjdHgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5jb21tYW5kcy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjdHhbYy5jb21tYW5kXS5hcHBseShjdHgsIGMuYXJncyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgcGF0aCB0byBhbiBTVkcgcGF0aCBkYXRhIHN0cmluZ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvU1ZHID0gZnVuY3Rpb24gdG9TVkcoKSB7XG4gICAgdmFyIGNtZHMgPSB0aGlzLmNvbW1hbmRzLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgdmFyIGFyZ3MgPSBjLmFyZ3MubWFwKGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoYXJnICogMTAwKSAvIDEwMDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFwiXCIgKyBTVkdfQ09NTUFORFNbYy5jb21tYW5kXSArIGFyZ3Muam9pbignICcpO1xuICAgIH0pO1xuICAgIHJldHVybiBjbWRzLmpvaW4oJycpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBcImNvbnRyb2wgYm94XCIgb2YgYSBwYXRoLlxuICAgKiBUaGlzIGlzIGxpa2UgdGhlIGJvdW5kaW5nIGJveCwgYnV0IGl0IGluY2x1ZGVzIGFsbCBwb2ludHMgaW5jbHVkaW5nXG4gICAqIGNvbnRyb2wgcG9pbnRzIG9mIGJlemllciBzZWdtZW50cyBhbmQgaXMgbXVjaCBmYXN0ZXIgdG8gY29tcHV0ZSB0aGFuXG4gICAqIHRoZSByZWFsIGJvdW5kaW5nIGJveC5cbiAgICogQHR5cGUge0JCb3h9XG4gICAqL1xuICA7XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYSBtYXBwaW5nIGZ1bmN0aW9uIHRvIGVhY2ggcG9pbnQgaW4gdGhlIHBhdGguXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm4ge1BhdGh9XG4gICAqL1xuICBfcHJvdG8ubWFwUG9pbnRzID0gZnVuY3Rpb24gbWFwUG9pbnRzKGZuKSB7XG4gICAgdmFyIHBhdGggPSBuZXcgUGF0aCgpO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRsKHRoaXMuY29tbWFuZHMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIGMgPSBfc3RlcC52YWx1ZTtcbiAgICAgIHZhciBhcmdzID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYy5hcmdzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHZhciBfZm4gPSBmbihjLmFyZ3NbaV0sIGMuYXJnc1tpICsgMV0pLFxuICAgICAgICAgICAgeCA9IF9mblswXSxcbiAgICAgICAgICAgIHkgPSBfZm5bMV07XG5cbiAgICAgICAgYXJncy5wdXNoKHgsIHkpO1xuICAgICAgfVxuXG4gICAgICBwYXRoW2MuY29tbWFuZF0uYXBwbHkocGF0aCwgYXJncyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgdGhlIHBhdGggYnkgdGhlIGdpdmVuIG1hdHJpeC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udHJhbnNmb3JtID0gZnVuY3Rpb24gdHJhbnNmb3JtKG0wLCBtMSwgbTIsIG0zLCBtNCwgbTUpIHtcbiAgICByZXR1cm4gdGhpcy5tYXBQb2ludHMoZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgIHggPSBtMCAqIHggKyBtMiAqIHkgKyBtNDtcbiAgICAgIHkgPSBtMSAqIHggKyBtMyAqIHkgKyBtNTtcbiAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgdGhlIHBhdGggYnkgdGhlIGdpdmVuIG9mZnNldC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udHJhbnNsYXRlID0gZnVuY3Rpb24gdHJhbnNsYXRlKHgsIHkpIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oMSwgMCwgMCwgMSwgeCwgeSk7XG4gIH1cbiAgLyoqXG4gICAqIFJvdGF0ZXMgdGhlIHBhdGggYnkgdGhlIGdpdmVuIGFuZ2xlIChpbiByYWRpYW5zKS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucm90YXRlID0gZnVuY3Rpb24gcm90YXRlKGFuZ2xlKSB7XG4gICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybShjb3MsIHNpbiwgLXNpbiwgY29zLCAwLCAwKTtcbiAgfVxuICAvKipcbiAgICogU2NhbGVzIHRoZSBwYXRoLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5zY2FsZSA9IGZ1bmN0aW9uIHNjYWxlKHNjYWxlWCwgc2NhbGVZKSB7XG4gICAgaWYgKHNjYWxlWSA9PT0gdm9pZCAwKSB7XG4gICAgICBzY2FsZVkgPSBzY2FsZVg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKHNjYWxlWCwgMCwgMCwgc2NhbGVZLCAwLCAwKTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MkNShQYXRoLCBbe1xuICAgIGtleTogXCJjYm94XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoIXRoaXMuX2Nib3gpIHtcbiAgICAgICAgdmFyIGNib3ggPSBuZXcgQkJveCgpO1xuXG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGwodGhpcy5jb21tYW5kcyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGNvbW1hbmQgPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1hbmQuYXJncy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgY2JveC5hZGRQb2ludChjb21tYW5kLmFyZ3NbaV0sIGNvbW1hbmQuYXJnc1tpICsgMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Nib3ggPSBPYmplY3QuZnJlZXplKGNib3gpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fY2JveDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZXhhY3QgYm91bmRpbmcgYm94IG9mIHRoZSBwYXRoIGJ5IGV2YWx1YXRpbmcgY3VydmUgc2VnbWVudHMuXG4gICAgICogU2xvd2VyIHRvIGNvbXB1dGUgdGhhbiB0aGUgY29udHJvbCBib3gsIGJ1dCBtb3JlIGFjY3VyYXRlLlxuICAgICAqIEB0eXBlIHtCQm94fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYmJveFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuX2Jib3gpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jib3g7XG4gICAgICB9XG5cbiAgICAgIHZhciBiYm94ID0gbmV3IEJCb3goKTtcbiAgICAgIHZhciBjeCA9IDAsXG4gICAgICAgICAgY3kgPSAwO1xuXG4gICAgICB2YXIgZiA9IGZ1bmN0aW9uIGYodCkge1xuICAgICAgICByZXR1cm4gTWF0aC5wb3coMSAtIHQsIDMpICogcDBbaV0gKyAzICogTWF0aC5wb3coMSAtIHQsIDIpICogdCAqIHAxW2ldICsgMyAqICgxIC0gdCkgKiBNYXRoLnBvdyh0LCAyKSAqIHAyW2ldICsgTWF0aC5wb3codCwgMykgKiBwM1tpXTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGwodGhpcy5jb21tYW5kcyksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBjID0gX3N0ZXAzLnZhbHVlO1xuXG4gICAgICAgIHN3aXRjaCAoYy5jb21tYW5kKSB7XG4gICAgICAgICAgY2FzZSAnbW92ZVRvJzpcbiAgICAgICAgICBjYXNlICdsaW5lVG8nOlxuICAgICAgICAgICAgdmFyIF9jJGFyZ3MgPSBjLmFyZ3MsXG4gICAgICAgICAgICAgICAgeCA9IF9jJGFyZ3NbMF0sXG4gICAgICAgICAgICAgICAgeSA9IF9jJGFyZ3NbMV07XG4gICAgICAgICAgICBiYm94LmFkZFBvaW50KHgsIHkpO1xuICAgICAgICAgICAgY3ggPSB4O1xuICAgICAgICAgICAgY3kgPSB5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdxdWFkcmF0aWNDdXJ2ZVRvJzpcbiAgICAgICAgICBjYXNlICdiZXppZXJDdXJ2ZVRvJzpcbiAgICAgICAgICAgIGlmIChjLmNvbW1hbmQgPT09ICdxdWFkcmF0aWNDdXJ2ZVRvJykge1xuICAgICAgICAgICAgICAvLyBodHRwOi8vZm9udGZvcmdlLm9yZy9iZXppZXIuaHRtbFxuICAgICAgICAgICAgICB2YXIgX2MkYXJnczIgPSBjLmFyZ3MsXG4gICAgICAgICAgICAgICAgICBxcDF4ID0gX2MkYXJnczJbMF0sXG4gICAgICAgICAgICAgICAgICBxcDF5ID0gX2MkYXJnczJbMV0sXG4gICAgICAgICAgICAgICAgICBwM3ggPSBfYyRhcmdzMlsyXSxcbiAgICAgICAgICAgICAgICAgIHAzeSA9IF9jJGFyZ3MyWzNdO1xuICAgICAgICAgICAgICB2YXIgY3AxeCA9IGN4ICsgMiAvIDMgKiAocXAxeCAtIGN4KTsgLy8gQ1AxID0gUVAwICsgMi8zICogKFFQMS1RUDApXG5cbiAgICAgICAgICAgICAgdmFyIGNwMXkgPSBjeSArIDIgLyAzICogKHFwMXkgLSBjeSk7XG4gICAgICAgICAgICAgIHZhciBjcDJ4ID0gcDN4ICsgMiAvIDMgKiAocXAxeCAtIHAzeCk7IC8vIENQMiA9IFFQMiArIDIvMyAqIChRUDEtUVAyKVxuXG4gICAgICAgICAgICAgIHZhciBjcDJ5ID0gcDN5ICsgMiAvIDMgKiAocXAxeSAtIHAzeSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgX2MkYXJnczMgPSBjLmFyZ3MsXG4gICAgICAgICAgICAgICAgICBjcDF4ID0gX2MkYXJnczNbMF0sXG4gICAgICAgICAgICAgICAgICBjcDF5ID0gX2MkYXJnczNbMV0sXG4gICAgICAgICAgICAgICAgICBjcDJ4ID0gX2MkYXJnczNbMl0sXG4gICAgICAgICAgICAgICAgICBjcDJ5ID0gX2MkYXJnczNbM10sXG4gICAgICAgICAgICAgICAgICBwM3ggPSBfYyRhcmdzM1s0XSxcbiAgICAgICAgICAgICAgICAgIHAzeSA9IF9jJGFyZ3MzWzVdO1xuICAgICAgICAgICAgfSAvLyBodHRwOi8vYmxvZy5oYWNrZXJzLWNhZmUubmV0LzIwMDkvMDYvaG93LXRvLWNhbGN1bGF0ZS1iZXppZXItY3VydmVzLWJvdW5kaW5nLmh0bWxcblxuXG4gICAgICAgICAgICBiYm94LmFkZFBvaW50KHAzeCwgcDN5KTtcbiAgICAgICAgICAgIHZhciBwMCA9IFtjeCwgY3ldO1xuICAgICAgICAgICAgdmFyIHAxID0gW2NwMXgsIGNwMXldO1xuICAgICAgICAgICAgdmFyIHAyID0gW2NwMngsIGNwMnldO1xuICAgICAgICAgICAgdmFyIHAzID0gW3AzeCwgcDN5XTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBiID0gNiAqIHAwW2ldIC0gMTIgKiBwMVtpXSArIDYgKiBwMltpXTtcbiAgICAgICAgICAgICAgdmFyIGEgPSAtMyAqIHAwW2ldICsgOSAqIHAxW2ldIC0gOSAqIHAyW2ldICsgMyAqIHAzW2ldO1xuICAgICAgICAgICAgICBjID0gMyAqIHAxW2ldIC0gMyAqIHAwW2ldO1xuXG4gICAgICAgICAgICAgIGlmIChhID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciB0ID0gLWMgLyBiO1xuXG4gICAgICAgICAgICAgICAgaWYgKDAgPCB0ICYmIHQgPCAxKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBiYm94LmFkZFBvaW50KGYodCksIGJib3gubWF4WSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYmJveC5hZGRQb2ludChiYm94Lm1heFgsIGYodCkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIGIyYWMgPSBNYXRoLnBvdyhiLCAyKSAtIDQgKiBjICogYTtcblxuICAgICAgICAgICAgICBpZiAoYjJhYyA8IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciB0MSA9ICgtYiArIE1hdGguc3FydChiMmFjKSkgLyAoMiAqIGEpO1xuXG4gICAgICAgICAgICAgIGlmICgwIDwgdDEgJiYgdDEgPCAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIGJib3guYWRkUG9pbnQoZih0MSksIGJib3gubWF4WSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICBiYm94LmFkZFBvaW50KGJib3gubWF4WCwgZih0MSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciB0MiA9ICgtYiAtIE1hdGguc3FydChiMmFjKSkgLyAoMiAqIGEpO1xuXG4gICAgICAgICAgICAgIGlmICgwIDwgdDIgJiYgdDIgPCAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIGJib3guYWRkUG9pbnQoZih0MiksIGJib3gubWF4WSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICBiYm94LmFkZFBvaW50KGJib3gubWF4WCwgZih0MikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjeCA9IHAzeDtcbiAgICAgICAgICAgIGN5ID0gcDN5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2Jib3ggPSBPYmplY3QuZnJlZXplKGJib3gpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQYXRoO1xufSgpO1xuXG52YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgdmFyIGNvbW1hbmQgPSBfYXJyW19pXTtcblxuICBQYXRoLnByb3RvdHlwZVtjb21tYW5kXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9iYm94ID0gdGhpcy5fY2JveCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdGhpcy5jb21tYW5kcy5wdXNoKHtcbiAgICAgIGNvbW1hbmQ6IGNvbW1hbmQsXG4gICAgICBhcmdzOiBhcmdzXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59O1xuXG5mb3IgKHZhciBfaSA9IDAsIF9hcnIgPSBbJ21vdmVUbycsICdsaW5lVG8nLCAncXVhZHJhdGljQ3VydmVUbycsICdiZXppZXJDdXJ2ZVRvJywgJ2Nsb3NlUGF0aCddOyBfaSA8IF9hcnIubGVuZ3RoOyBfaSsrKSB7XG4gIF9sb29wKCk7XG59XG5cbnZhciBTdGFuZGFyZE5hbWVzID0gWycubm90ZGVmJywgJy5udWxsJywgJ25vbm1hcmtpbmdyZXR1cm4nLCAnc3BhY2UnLCAnZXhjbGFtJywgJ3F1b3RlZGJsJywgJ251bWJlcnNpZ24nLCAnZG9sbGFyJywgJ3BlcmNlbnQnLCAnYW1wZXJzYW5kJywgJ3F1b3Rlc2luZ2xlJywgJ3BhcmVubGVmdCcsICdwYXJlbnJpZ2h0JywgJ2FzdGVyaXNrJywgJ3BsdXMnLCAnY29tbWEnLCAnaHlwaGVuJywgJ3BlcmlvZCcsICdzbGFzaCcsICd6ZXJvJywgJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicsICdmaXZlJywgJ3NpeCcsICdzZXZlbicsICdlaWdodCcsICduaW5lJywgJ2NvbG9uJywgJ3NlbWljb2xvbicsICdsZXNzJywgJ2VxdWFsJywgJ2dyZWF0ZXInLCAncXVlc3Rpb24nLCAnYXQnLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywgJ2JyYWNrZXRsZWZ0JywgJ2JhY2tzbGFzaCcsICdicmFja2V0cmlnaHQnLCAnYXNjaWljaXJjdW0nLCAndW5kZXJzY29yZScsICdncmF2ZScsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLCAnYnJhY2VsZWZ0JywgJ2JhcicsICdicmFjZXJpZ2h0JywgJ2FzY2lpdGlsZGUnLCAnQWRpZXJlc2lzJywgJ0FyaW5nJywgJ0NjZWRpbGxhJywgJ0VhY3V0ZScsICdOdGlsZGUnLCAnT2RpZXJlc2lzJywgJ1VkaWVyZXNpcycsICdhYWN1dGUnLCAnYWdyYXZlJywgJ2FjaXJjdW1mbGV4JywgJ2FkaWVyZXNpcycsICdhdGlsZGUnLCAnYXJpbmcnLCAnY2NlZGlsbGEnLCAnZWFjdXRlJywgJ2VncmF2ZScsICdlY2lyY3VtZmxleCcsICdlZGllcmVzaXMnLCAnaWFjdXRlJywgJ2lncmF2ZScsICdpY2lyY3VtZmxleCcsICdpZGllcmVzaXMnLCAnbnRpbGRlJywgJ29hY3V0ZScsICdvZ3JhdmUnLCAnb2NpcmN1bWZsZXgnLCAnb2RpZXJlc2lzJywgJ290aWxkZScsICd1YWN1dGUnLCAndWdyYXZlJywgJ3VjaXJjdW1mbGV4JywgJ3VkaWVyZXNpcycsICdkYWdnZXInLCAnZGVncmVlJywgJ2NlbnQnLCAnc3RlcmxpbmcnLCAnc2VjdGlvbicsICdidWxsZXQnLCAncGFyYWdyYXBoJywgJ2dlcm1hbmRibHMnLCAncmVnaXN0ZXJlZCcsICdjb3B5cmlnaHQnLCAndHJhZGVtYXJrJywgJ2FjdXRlJywgJ2RpZXJlc2lzJywgJ25vdGVxdWFsJywgJ0FFJywgJ09zbGFzaCcsICdpbmZpbml0eScsICdwbHVzbWludXMnLCAnbGVzc2VxdWFsJywgJ2dyZWF0ZXJlcXVhbCcsICd5ZW4nLCAnbXUnLCAncGFydGlhbGRpZmYnLCAnc3VtbWF0aW9uJywgJ3Byb2R1Y3QnLCAncGknLCAnaW50ZWdyYWwnLCAnb3JkZmVtaW5pbmUnLCAnb3JkbWFzY3VsaW5lJywgJ09tZWdhJywgJ2FlJywgJ29zbGFzaCcsICdxdWVzdGlvbmRvd24nLCAnZXhjbGFtZG93bicsICdsb2dpY2Fsbm90JywgJ3JhZGljYWwnLCAnZmxvcmluJywgJ2FwcHJveGVxdWFsJywgJ0RlbHRhJywgJ2d1aWxsZW1vdGxlZnQnLCAnZ3VpbGxlbW90cmlnaHQnLCAnZWxsaXBzaXMnLCAnbm9uYnJlYWtpbmdzcGFjZScsICdBZ3JhdmUnLCAnQXRpbGRlJywgJ090aWxkZScsICdPRScsICdvZScsICdlbmRhc2gnLCAnZW1kYXNoJywgJ3F1b3RlZGJsbGVmdCcsICdxdW90ZWRibHJpZ2h0JywgJ3F1b3RlbGVmdCcsICdxdW90ZXJpZ2h0JywgJ2RpdmlkZScsICdsb3plbmdlJywgJ3lkaWVyZXNpcycsICdZZGllcmVzaXMnLCAnZnJhY3Rpb24nLCAnY3VycmVuY3knLCAnZ3VpbHNpbmdsbGVmdCcsICdndWlsc2luZ2xyaWdodCcsICdmaScsICdmbCcsICdkYWdnZXJkYmwnLCAncGVyaW9kY2VudGVyZWQnLCAncXVvdGVzaW5nbGJhc2UnLCAncXVvdGVkYmxiYXNlJywgJ3BlcnRob3VzYW5kJywgJ0FjaXJjdW1mbGV4JywgJ0VjaXJjdW1mbGV4JywgJ0FhY3V0ZScsICdFZGllcmVzaXMnLCAnRWdyYXZlJywgJ0lhY3V0ZScsICdJY2lyY3VtZmxleCcsICdJZGllcmVzaXMnLCAnSWdyYXZlJywgJ09hY3V0ZScsICdPY2lyY3VtZmxleCcsICdhcHBsZScsICdPZ3JhdmUnLCAnVWFjdXRlJywgJ1VjaXJjdW1mbGV4JywgJ1VncmF2ZScsICdkb3RsZXNzaScsICdjaXJjdW1mbGV4JywgJ3RpbGRlJywgJ21hY3JvbicsICdicmV2ZScsICdkb3RhY2NlbnQnLCAncmluZycsICdjZWRpbGxhJywgJ2h1bmdhcnVtbGF1dCcsICdvZ29uZWsnLCAnY2Fyb24nLCAnTHNsYXNoJywgJ2xzbGFzaCcsICdTY2Fyb24nLCAnc2Nhcm9uJywgJ1pjYXJvbicsICd6Y2Fyb24nLCAnYnJva2VuYmFyJywgJ0V0aCcsICdldGgnLCAnWWFjdXRlJywgJ3lhY3V0ZScsICdUaG9ybicsICd0aG9ybicsICdtaW51cycsICdtdWx0aXBseScsICdvbmVzdXBlcmlvcicsICd0d29zdXBlcmlvcicsICd0aHJlZXN1cGVyaW9yJywgJ29uZWhhbGYnLCAnb25lcXVhcnRlcicsICd0aHJlZXF1YXJ0ZXJzJywgJ2ZyYW5jJywgJ0dicmV2ZScsICdnYnJldmUnLCAnSWRvdGFjY2VudCcsICdTY2VkaWxsYScsICdzY2VkaWxsYScsICdDYWN1dGUnLCAnY2FjdXRlJywgJ0NjYXJvbicsICdjY2Fyb24nLCAnZGNyb2F0J107XG5cbnZhciBfY2xhc3MkMztcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkNih0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQ2KENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNihDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDYoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkMyh0YXJnZXQsIHByb3BlcnR5LCBkZWNvcmF0b3JzLCBkZXNjcmlwdG9yLCBjb250ZXh0KSB7IHZhciBkZXNjID0ge307IE9iamVjdC5rZXlzKGRlc2NyaXB0b3IpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBkZXNjW2tleV0gPSBkZXNjcmlwdG9yW2tleV07IH0pOyBkZXNjLmVudW1lcmFibGUgPSAhIWRlc2MuZW51bWVyYWJsZTsgZGVzYy5jb25maWd1cmFibGUgPSAhIWRlc2MuY29uZmlndXJhYmxlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjIHx8IGRlc2MuaW5pdGlhbGl6ZXIpIHsgZGVzYy53cml0YWJsZSA9IHRydWU7IH0gZGVzYyA9IGRlY29yYXRvcnMuc2xpY2UoKS5yZXZlcnNlKCkucmVkdWNlKGZ1bmN0aW9uIChkZXNjLCBkZWNvcmF0b3IpIHsgcmV0dXJuIGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5LCBkZXNjKSB8fCBkZXNjOyB9LCBkZXNjKTsgaWYgKGNvbnRleHQgJiYgZGVzYy5pbml0aWFsaXplciAhPT0gdm9pZCAwKSB7IGRlc2MudmFsdWUgPSBkZXNjLmluaXRpYWxpemVyID8gZGVzYy5pbml0aWFsaXplci5jYWxsKGNvbnRleHQpIDogdm9pZCAwOyBkZXNjLmluaXRpYWxpemVyID0gdW5kZWZpbmVkOyB9IGlmIChkZXNjLmluaXRpYWxpemVyID09PSB2b2lkIDApIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIGRlc2MpOyBkZXNjID0gbnVsbDsgfSByZXR1cm4gZGVzYzsgfVxuLyoqXG4gKiBHbHlwaCBvYmplY3RzIHJlcHJlc2VudCBhIGdseXBoIGluIHRoZSBmb250LiBUaGV5IGhhdmUgdmFyaW91cyBwcm9wZXJ0aWVzIGZvciBhY2Nlc3NpbmcgbWV0cmljcyBhbmRcbiAqIHRoZSBhY3R1YWwgdmVjdG9yIHBhdGggdGhlIGdseXBoIHJlcHJlc2VudHMsIGFuZCBtZXRob2RzIGZvciByZW5kZXJpbmcgdGhlIGdseXBoIHRvIGEgZ3JhcGhpY3MgY29udGV4dC5cbiAqXG4gKiBZb3UgZG8gbm90IGNyZWF0ZSBnbHlwaCBvYmplY3RzIGRpcmVjdGx5LiBUaGV5IGFyZSBjcmVhdGVkIGJ5IHZhcmlvdXMgbWV0aG9kcyBvbiB0aGUgZm9udCBvYmplY3QuXG4gKiBUaGVyZSBhcmUgc2V2ZXJhbCBzdWJjbGFzc2VzIG9mIHRoZSBiYXNlIEdseXBoIGNsYXNzIGludGVybmFsbHkgdGhhdCBtYXkgYmUgcmV0dXJuZWQgZGVwZW5kaW5nXG4gKiBvbiB0aGUgZm9udCBmb3JtYXQsIGJ1dCB0aGV5IGFsbCBpbmhlcml0IGZyb20gdGhpcyBjbGFzcy5cbiAqL1xuXG52YXIgR2x5cGggPSAoX2NsYXNzJDMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHbHlwaChpZCwgY29kZVBvaW50cywgZm9udCkge1xuICAgIC8qKlxuICAgICAqIFRoZSBnbHlwaCBpZCBpbiB0aGUgZm9udFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHVuaWNvZGUgY29kZSBwb2ludHMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgdGhpcyBnbHlwaC5cbiAgICAgKiBUaGVyZSBjYW4gYmUgbXVsdGlwbGUgY29kZSBwb2ludHMgaW4gdGhlIGNhc2Ugb2YgbGlnYXR1cmVzIGFuZCBvdGhlciBnbHlwaHNcbiAgICAgKiB0aGF0IHJlcHJlc2VudCBtdWx0aXBsZSB2aXN1YWwgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyW119XG4gICAgICovXG5cbiAgICB0aGlzLmNvZGVQb2ludHMgPSBjb2RlUG9pbnRzO1xuICAgIHRoaXMuX2ZvbnQgPSBmb250OyAvLyBUT0RPOiBnZXQgdGhpcyBpbmZvIGZyb20gR0RFRiBpZiBhdmFpbGFibGVcblxuICAgIHRoaXMuaXNNYXJrID0gdGhpcy5jb2RlUG9pbnRzLmxlbmd0aCA+IDAgJiYgdGhpcy5jb2RlUG9pbnRzLmV2ZXJ5KHVuaWNvZGUuaXNNYXJrKTtcbiAgICB0aGlzLmlzTGlnYXR1cmUgPSB0aGlzLmNvZGVQb2ludHMubGVuZ3RoID4gMTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBHbHlwaC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9nZXRQYXRoID0gZnVuY3Rpb24gX2dldFBhdGgoKSB7XG4gICAgcmV0dXJuIG5ldyBQYXRoKCk7XG4gIH07XG5cbiAgX3Byb3RvLl9nZXRDQm94ID0gZnVuY3Rpb24gX2dldENCb3goKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aC5jYm94O1xuICB9O1xuXG4gIF9wcm90by5fZ2V0QkJveCA9IGZ1bmN0aW9uIF9nZXRCQm94KCkge1xuICAgIHJldHVybiB0aGlzLnBhdGguYmJveDtcbiAgfTtcblxuICBfcHJvdG8uX2dldFRhYmxlTWV0cmljcyA9IGZ1bmN0aW9uIF9nZXRUYWJsZU1ldHJpY3ModGFibGUpIHtcbiAgICBpZiAodGhpcy5pZCA8IHRhYmxlLm1ldHJpY3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGFibGUubWV0cmljcy5nZXQodGhpcy5pZCk7XG4gICAgfVxuXG4gICAgdmFyIG1ldHJpYyA9IHRhYmxlLm1ldHJpY3MuZ2V0KHRhYmxlLm1ldHJpY3MubGVuZ3RoIC0gMSk7XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIGFkdmFuY2U6IG1ldHJpYyA/IG1ldHJpYy5hZHZhbmNlIDogMCxcbiAgICAgIGJlYXJpbmc6IHRhYmxlLmJlYXJpbmdzLmdldCh0aGlzLmlkIC0gdGFibGUubWV0cmljcy5sZW5ndGgpIHx8IDBcbiAgICB9O1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgX3Byb3RvLl9nZXRNZXRyaWNzID0gZnVuY3Rpb24gX2dldE1ldHJpY3MoY2JveCkge1xuICAgIGlmICh0aGlzLl9tZXRyaWNzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWV0cmljcztcbiAgICB9XG5cbiAgICB2YXIgX3RoaXMkX2dldFRhYmxlTWV0cmljID0gdGhpcy5fZ2V0VGFibGVNZXRyaWNzKHRoaXMuX2ZvbnQuaG10eCksXG4gICAgICAgIGFkdmFuY2VXaWR0aCA9IF90aGlzJF9nZXRUYWJsZU1ldHJpYy5hZHZhbmNlLFxuICAgICAgICBsZWZ0QmVhcmluZyA9IF90aGlzJF9nZXRUYWJsZU1ldHJpYy5iZWFyaW5nOyAvLyBGb3IgdmVydGljYWwgbWV0cmljcywgdXNlIHZtdHggaWYgYXZhaWxhYmxlLCBvciBmYWxsIGJhY2sgdG8gZ2xvYmFsIGRhdGEgZnJvbSBPUy8yIG9yIGhoZWFcblxuXG4gICAgaWYgKHRoaXMuX2ZvbnQudm10eCkge1xuICAgICAgdmFyIF90aGlzJF9nZXRUYWJsZU1ldHJpYzIgPSB0aGlzLl9nZXRUYWJsZU1ldHJpY3ModGhpcy5fZm9udC52bXR4KSxcbiAgICAgICAgICBhZHZhbmNlSGVpZ2h0ID0gX3RoaXMkX2dldFRhYmxlTWV0cmljMi5hZHZhbmNlLFxuICAgICAgICAgIHRvcEJlYXJpbmcgPSBfdGhpcyRfZ2V0VGFibGVNZXRyaWMyLmJlYXJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvczI7XG5cbiAgICAgIGlmICh0eXBlb2YgY2JveCA9PT0gJ3VuZGVmaW5lZCcgfHwgY2JveCA9PT0gbnVsbCkge1xuICAgICAgICBjYm94ID0gdGhpcy5jYm94O1xuICAgICAgfVxuXG4gICAgICBpZiAoKG9zMiA9IHRoaXMuX2ZvbnRbJ09TLzInXSkgJiYgb3MyLnZlcnNpb24gPiAwKSB7XG4gICAgICAgIHZhciBhZHZhbmNlSGVpZ2h0ID0gTWF0aC5hYnMob3MyLnR5cG9Bc2NlbmRlciAtIG9zMi50eXBvRGVzY2VuZGVyKTtcbiAgICAgICAgdmFyIHRvcEJlYXJpbmcgPSBvczIudHlwb0FzY2VuZGVyIC0gY2JveC5tYXhZO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGhoZWEgPSB0aGlzLl9mb250LmhoZWE7XG4gICAgICAgIHZhciBhZHZhbmNlSGVpZ2h0ID0gTWF0aC5hYnMoaGhlYS5hc2NlbnQgLSBoaGVhLmRlc2NlbnQpO1xuICAgICAgICB2YXIgdG9wQmVhcmluZyA9IGhoZWEuYXNjZW50IC0gY2JveC5tYXhZO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9mb250Ll92YXJpYXRpb25Qcm9jZXNzb3IgJiYgdGhpcy5fZm9udC5IVkFSKSB7XG4gICAgICBhZHZhbmNlV2lkdGggKz0gdGhpcy5fZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yLmdldEFkdmFuY2VBZGp1c3RtZW50KHRoaXMuaWQsIHRoaXMuX2ZvbnQuSFZBUik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX21ldHJpY3MgPSB7XG4gICAgICBhZHZhbmNlV2lkdGg6IGFkdmFuY2VXaWR0aCxcbiAgICAgIGFkdmFuY2VIZWlnaHQ6IGFkdmFuY2VIZWlnaHQsXG4gICAgICBsZWZ0QmVhcmluZzogbGVmdEJlYXJpbmcsXG4gICAgICB0b3BCZWFyaW5nOiB0b3BCZWFyaW5nXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogVGhlIGdseXBo4oCZcyBjb250cm9sIGJveC5cbiAgICogVGhpcyBpcyBvZnRlbiB0aGUgc2FtZSBhcyB0aGUgYm91bmRpbmcgYm94LCBidXQgaXMgZmFzdGVyIHRvIGNvbXB1dGUuXG4gICAqIEJlY2F1c2Ugb2YgdGhlIHdheSBiZXppZXIgY3VydmVzIGFyZSBkZWZpbmVkLCBzb21lIG9mIHRoZSBjb250cm9sIHBvaW50c1xuICAgKiBjYW4gYmUgb3V0c2lkZSBvZiB0aGUgYm91bmRpbmcgYm94LiBXaGVyZSBgYmJveGAgdGFrZXMgdGhpcyBpbnRvIGFjY291bnQsXG4gICAqIGBjYm94YCBkb2VzIG5vdC4gVGh1cywgY2JveCBpcyBsZXNzIGFjY3VyYXRlLCBidXQgZmFzdGVyIHRvIGNvbXB1dGUuXG4gICAqIFNlZSBbaGVyZV0oaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvZnJlZXR5cGUyL2RvY3MvZ2x5cGhzL2dseXBocy02Lmh0bWwjc2VjdGlvbi0yKVxuICAgKiBmb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7QkJveH1cbiAgICovXG4gIDtcblxuICAvKipcbiAgICogUmV0dXJucyBhIHBhdGggc2NhbGVkIHRvIHRoZSBnaXZlbiBmb250IHNpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gICAqIEByZXR1cm4ge1BhdGh9XG4gICAqL1xuICBfcHJvdG8uZ2V0U2NhbGVkUGF0aCA9IGZ1bmN0aW9uIGdldFNjYWxlZFBhdGgoc2l6ZSkge1xuICAgIHZhciBzY2FsZSA9IDEgLyB0aGlzLl9mb250LnVuaXRzUGVyRW0gKiBzaXplO1xuICAgIHJldHVybiB0aGlzLnBhdGguc2NhbGUoc2NhbGUpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZ2x5cGgncyBhZHZhbmNlIHdpZHRoLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5fZ2V0TmFtZSA9IGZ1bmN0aW9uIF9nZXROYW1lKCkge1xuICAgIHZhciBwb3N0ID0gdGhpcy5fZm9udC5wb3N0O1xuXG4gICAgaWYgKCFwb3N0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHBvc3QudmVyc2lvbikge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gU3RhbmRhcmROYW1lc1t0aGlzLmlkXTtcblxuICAgICAgY2FzZSAyOlxuICAgICAgICB2YXIgaWQgPSBwb3N0LmdseXBoTmFtZUluZGV4W3RoaXMuaWRdO1xuXG4gICAgICAgIGlmIChpZCA8IFN0YW5kYXJkTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIFN0YW5kYXJkTmFtZXNbaWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvc3QubmFtZXNbaWQgLSBTdGFuZGFyZE5hbWVzLmxlbmd0aF07XG5cbiAgICAgIGNhc2UgMi41OlxuICAgICAgICByZXR1cm4gU3RhbmRhcmROYW1lc1t0aGlzLmlkICsgcG9zdC5vZmZzZXRzW3RoaXMuaWRdXTtcblxuICAgICAgY2FzZSA0OlxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwb3N0Lm1hcFt0aGlzLmlkXSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgZ2x5cGgncyBuYW1lXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGdseXBoIHRvIHRoZSBnaXZlbiBncmFwaGljcyBjb250ZXh0LCBhdCB0aGUgc3BlY2lmaWVkIGZvbnQgc2l6ZS5cbiAgICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MmR9IGN0eFxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICAgKi9cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcihjdHgsIHNpemUpIHtcbiAgICBjdHguc2F2ZSgpO1xuICAgIHZhciBzY2FsZSA9IDEgLyB0aGlzLl9mb250LmhlYWQudW5pdHNQZXJFbSAqIHNpemU7XG4gICAgY3R4LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgdmFyIGZuID0gdGhpcy5wYXRoLnRvRnVuY3Rpb24oKTtcbiAgICBmbihjdHgpO1xuICAgIGN0eC5maWxsKCk7XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MkNihHbHlwaCwgW3tcbiAgICBrZXk6IFwiY2JveFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldENCb3goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGdseXBo4oCZcyBib3VuZGluZyBib3gsIGkuZS4gdGhlIHJlY3RhbmdsZSB0aGF0IGVuY2xvc2VzIHRoZVxuICAgICAqIGdseXBoIG91dGxpbmUgYXMgdGlnaHRseSBhcyBwb3NzaWJsZS5cbiAgICAgKiBAdHlwZSB7QkJveH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImJib3hcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRCQm94KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgdmVjdG9yIFBhdGggb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2x5cGggb3V0bGluZS5cbiAgICAgKiBAdHlwZSB7UGF0aH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInBhdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIC8vIENhY2hlIHRoZSBwYXRoIHNvIHdlIG9ubHkgZGVjb2RlIGl0IG9uY2VcbiAgICAgIC8vIERlY29kaW5nIGlzIGFjdHVhbGx5IHBlcmZvcm1lZCBieSBzdWJjbGFzc2VzXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0UGF0aCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZHZhbmNlV2lkdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRyaWNzKCkuYWR2YW5jZVdpZHRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZ2x5cGgncyBhZHZhbmNlIGhlaWdodC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWR2YW5jZUhlaWdodFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldHJpY3MoKS5hZHZhbmNlSGVpZ2h0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsaWdhdHVyZUNhcmV0UG9zaXRpb25zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7fVxuICB9LCB7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXROYW1lKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEdseXBoO1xufSgpLCAoX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQzKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJjYm94XCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDMucHJvdG90eXBlLCBcImNib3hcIiksIF9jbGFzcyQzLnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkMyhfY2xhc3MkMy5wcm90b3R5cGUsIFwiYmJveFwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJiYm94XCIpLCBfY2xhc3MkMy5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDMoX2NsYXNzJDMucHJvdG90eXBlLCBcInBhdGhcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkMy5wcm90b3R5cGUsIFwicGF0aFwiKSwgX2NsYXNzJDMucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQzKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJhZHZhbmNlV2lkdGhcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkMy5wcm90b3R5cGUsIFwiYWR2YW5jZVdpZHRoXCIpLCBfY2xhc3MkMy5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDMoX2NsYXNzJDMucHJvdG90eXBlLCBcImFkdmFuY2VIZWlnaHRcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkMy5wcm90b3R5cGUsIFwiYWR2YW5jZUhlaWdodFwiKSwgX2NsYXNzJDMucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQzKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJuYW1lXCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDMucHJvdG90eXBlLCBcIm5hbWVcIiksIF9jbGFzcyQzLnByb3RvdHlwZSkpLCBfY2xhc3MkMyk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkbShvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkbShvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkbShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JG0obywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRtKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkbShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkOShzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIEdseWZIZWFkZXIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbnVtYmVyT2ZDb250b3VyczogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIGlmIG5lZ2F0aXZlLCB0aGlzIGlzIGEgY29tcG9zaXRlIGdseXBoXG4gIHhNaW46IHJlc3RydWN0dXJlLmludDE2LFxuICB5TWluOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgeE1heDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHlNYXg6IHJlc3RydWN0dXJlLmludDE2XG59KTsgLy8gRmxhZ3MgZm9yIHNpbXBsZSBnbHlwaHNcblxudmFyIE9OX0NVUlZFID0gMSA8PCAwO1xudmFyIFhfU0hPUlRfVkVDVE9SID0gMSA8PCAxO1xudmFyIFlfU0hPUlRfVkVDVE9SID0gMSA8PCAyO1xudmFyIFJFUEVBVCA9IDEgPDwgMztcbnZhciBTQU1FX1ggPSAxIDw8IDQ7XG52YXIgU0FNRV9ZID0gMSA8PCA1OyAvLyBGbGFncyBmb3IgY29tcG9zaXRlIGdseXBoc1xuXG52YXIgQVJHXzFfQU5EXzJfQVJFX1dPUkRTID0gMSA8PCAwO1xudmFyIFdFX0hBVkVfQV9TQ0FMRSA9IDEgPDwgMztcbnZhciBNT1JFX0NPTVBPTkVOVFMgPSAxIDw8IDU7XG52YXIgV0VfSEFWRV9BTl9YX0FORF9ZX1NDQUxFID0gMSA8PCA2O1xudmFyIFdFX0hBVkVfQV9UV09fQllfVFdPID0gMSA8PCA3O1xudmFyIFdFX0hBVkVfSU5TVFJVQ1RJT05TID0gMSA8PCA4O1xuXG52YXIgUG9pbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQb2ludChvbkN1cnZlLCBlbmRDb250b3VyLCB4LCB5KSB7XG4gICAgaWYgKHggPT09IHZvaWQgMCkge1xuICAgICAgeCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHkgPT09IHZvaWQgMCkge1xuICAgICAgeSA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5vbkN1cnZlID0gb25DdXJ2ZTtcbiAgICB0aGlzLmVuZENvbnRvdXIgPSBlbmRDb250b3VyO1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBQb2ludC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmNvcHkgPSBmdW5jdGlvbiBjb3B5KCkge1xuICAgIHJldHVybiBuZXcgUG9pbnQodGhpcy5vbkN1cnZlLCB0aGlzLmVuZENvbnRvdXIsIHRoaXMueCwgdGhpcy55KTtcbiAgfTtcblxuICByZXR1cm4gUG9pbnQ7XG59KCk7IC8vIFJlcHJlc2VudHMgYSBjb21wb25lbnQgaW4gYSBjb21wb3NpdGUgZ2x5cGhcblxudmFyIENvbXBvbmVudCA9IGZ1bmN0aW9uIENvbXBvbmVudChnbHlwaElELCBkeCwgZHkpIHtcbiAgdGhpcy5nbHlwaElEID0gZ2x5cGhJRDtcbiAgdGhpcy5keCA9IGR4O1xuICB0aGlzLmR5ID0gZHk7XG4gIHRoaXMucG9zID0gMDtcbiAgdGhpcy5zY2FsZVggPSB0aGlzLnNjYWxlWSA9IDE7XG4gIHRoaXMuc2NhbGUwMSA9IHRoaXMuc2NhbGUxMCA9IDA7XG59O1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgVHJ1ZVR5cGUgZ2x5cGguXG4gKi9cblxuXG52YXIgVFRGR2x5cGggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9HbHlwaCkge1xuICBfaW5oZXJpdHNMb29zZSQ5KFRURkdseXBoLCBfR2x5cGgpO1xuXG4gIGZ1bmN0aW9uIFRURkdseXBoKCkge1xuICAgIHJldHVybiBfR2x5cGguYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90bzIgPSBUVEZHbHlwaC5wcm90b3R5cGU7XG5cbiAgLy8gUGFyc2VzIGp1c3QgdGhlIGdseXBoIGhlYWRlciBhbmQgcmV0dXJucyB0aGUgYm91bmRpbmcgYm94XG4gIF9wcm90bzIuX2dldENCb3ggPSBmdW5jdGlvbiBfZ2V0Q0JveChpbnRlcm5hbCkge1xuICAgIC8vIFdlIG5lZWQgdG8gZGVjb2RlIHRoZSBnbHlwaCBpZiB2YXJpYXRpb24gcHJvY2Vzc2luZyBpcyByZXF1ZXN0ZWQsXG4gICAgLy8gc28gaXQncyBlYXNpZXIganVzdCB0byByZWNvbXB1dGUgdGhlIHBhdGgncyBjYm94IGFmdGVyIGRlY29kaW5nLlxuICAgIGlmICh0aGlzLl9mb250Ll92YXJpYXRpb25Qcm9jZXNzb3IgJiYgIWludGVybmFsKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXRoLmNib3g7XG4gICAgfVxuXG4gICAgdmFyIHN0cmVhbSA9IHRoaXMuX2ZvbnQuX2dldFRhYmxlU3RyZWFtKCdnbHlmJyk7XG5cbiAgICBzdHJlYW0ucG9zICs9IHRoaXMuX2ZvbnQubG9jYS5vZmZzZXRzW3RoaXMuaWRdO1xuICAgIHZhciBnbHlwaCA9IEdseWZIZWFkZXIuZGVjb2RlKHN0cmVhbSk7XG4gICAgdmFyIGNib3ggPSBuZXcgQkJveChnbHlwaC54TWluLCBnbHlwaC55TWluLCBnbHlwaC54TWF4LCBnbHlwaC55TWF4KTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShjYm94KTtcbiAgfSAvLyBQYXJzZXMgYSBzaW5nbGUgZ2x5cGggY29vcmRpbmF0ZVxuICA7XG5cbiAgX3Byb3RvMi5fcGFyc2VHbHlwaENvb3JkID0gZnVuY3Rpb24gX3BhcnNlR2x5cGhDb29yZChzdHJlYW0sIHByZXYsIF9zaG9ydCwgc2FtZSkge1xuICAgIGlmIChfc2hvcnQpIHtcbiAgICAgIHZhciB2YWwgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG5cbiAgICAgIGlmICghc2FtZSkge1xuICAgICAgICB2YWwgPSAtdmFsO1xuICAgICAgfVxuXG4gICAgICB2YWwgKz0gcHJldjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNhbWUpIHtcbiAgICAgICAgdmFyIHZhbCA9IHByZXY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdmFsID0gcHJldiArIHN0cmVhbS5yZWFkSW50MTZCRSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH0gLy8gRGVjb2RlcyB0aGUgZ2x5cGggZGF0YSBpbnRvIHBvaW50cyBmb3Igc2ltcGxlIGdseXBocyxcbiAgLy8gb3IgY29tcG9uZW50cyBmb3IgY29tcG9zaXRlIGdseXBoc1xuICA7XG5cbiAgX3Byb3RvMi5fZGVjb2RlID0gZnVuY3Rpb24gX2RlY29kZSgpIHtcbiAgICB2YXIgZ2x5ZlBvcyA9IHRoaXMuX2ZvbnQubG9jYS5vZmZzZXRzW3RoaXMuaWRdO1xuICAgIHZhciBuZXh0UG9zID0gdGhpcy5fZm9udC5sb2NhLm9mZnNldHNbdGhpcy5pZCArIDFdOyAvLyBOb3RoaW5nIHRvIGRvIGlmIHRoZXJlIGlzIG5vIGRhdGEgZm9yIHRoaXMgZ2x5cGhcblxuICAgIGlmIChnbHlmUG9zID09PSBuZXh0UG9zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgc3RyZWFtID0gdGhpcy5fZm9udC5fZ2V0VGFibGVTdHJlYW0oJ2dseWYnKTtcblxuICAgIHN0cmVhbS5wb3MgKz0gZ2x5ZlBvcztcbiAgICB2YXIgc3RhcnRQb3MgPSBzdHJlYW0ucG9zO1xuICAgIHZhciBnbHlwaCA9IEdseWZIZWFkZXIuZGVjb2RlKHN0cmVhbSk7XG5cbiAgICBpZiAoZ2x5cGgubnVtYmVyT2ZDb250b3VycyA+IDApIHtcbiAgICAgIHRoaXMuX2RlY29kZVNpbXBsZShnbHlwaCwgc3RyZWFtKTtcbiAgICB9IGVsc2UgaWYgKGdseXBoLm51bWJlck9mQ29udG91cnMgPCAwKSB7XG4gICAgICB0aGlzLl9kZWNvZGVDb21wb3NpdGUoZ2x5cGgsIHN0cmVhbSwgc3RhcnRQb3MpO1xuICAgIH1cblxuICAgIHJldHVybiBnbHlwaDtcbiAgfTtcblxuICBfcHJvdG8yLl9kZWNvZGVTaW1wbGUgPSBmdW5jdGlvbiBfZGVjb2RlU2ltcGxlKGdseXBoLCBzdHJlYW0pIHtcbiAgICAvLyB0aGlzIGlzIGEgc2ltcGxlIGdseXBoXG4gICAgZ2x5cGgucG9pbnRzID0gW107XG4gICAgdmFyIGVuZFB0c09mQ29udG91cnMgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCBnbHlwaC5udW1iZXJPZkNvbnRvdXJzKS5kZWNvZGUoc3RyZWFtKTtcbiAgICBnbHlwaC5pbnN0cnVjdGlvbnMgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsIHJlc3RydWN0dXJlLnVpbnQxNikuZGVjb2RlKHN0cmVhbSk7XG4gICAgdmFyIGZsYWdzID0gW107XG4gICAgdmFyIG51bUNvb3JkcyA9IGVuZFB0c09mQ29udG91cnNbZW5kUHRzT2ZDb250b3Vycy5sZW5ndGggLSAxXSArIDE7XG5cbiAgICB3aGlsZSAoZmxhZ3MubGVuZ3RoIDwgbnVtQ29vcmRzKSB7XG4gICAgICB2YXIgZmxhZyA9IHN0cmVhbS5yZWFkVUludDgoKTtcbiAgICAgIGZsYWdzLnB1c2goZmxhZyk7IC8vIGNoZWNrIGZvciByZXBlYXQgZmxhZ1xuXG4gICAgICBpZiAoZmxhZyAmIFJFUEVBVCkge1xuICAgICAgICB2YXIgY291bnQgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7XG4gICAgICAgICAgZmxhZ3MucHVzaChmbGFnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmbGFnID0gZmxhZ3NbaV07XG4gICAgICB2YXIgcG9pbnQgPSBuZXcgUG9pbnQoISEoZmxhZyAmIE9OX0NVUlZFKSwgZW5kUHRzT2ZDb250b3Vycy5pbmRleE9mKGkpID49IDAsIDAsIDApO1xuICAgICAgZ2x5cGgucG9pbnRzLnB1c2gocG9pbnQpO1xuICAgIH1cblxuICAgIHZhciBweCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZmxhZyA9IGZsYWdzW2ldO1xuICAgICAgZ2x5cGgucG9pbnRzW2ldLnggPSBweCA9IHRoaXMuX3BhcnNlR2x5cGhDb29yZChzdHJlYW0sIHB4LCBmbGFnICYgWF9TSE9SVF9WRUNUT1IsIGZsYWcgJiBTQU1FX1gpO1xuICAgIH1cblxuICAgIHZhciBweSA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZmxhZyA9IGZsYWdzW2ldO1xuICAgICAgZ2x5cGgucG9pbnRzW2ldLnkgPSBweSA9IHRoaXMuX3BhcnNlR2x5cGhDb29yZChzdHJlYW0sIHB5LCBmbGFnICYgWV9TSE9SVF9WRUNUT1IsIGZsYWcgJiBTQU1FX1kpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9mb250Ll92YXJpYXRpb25Qcm9jZXNzb3IpIHtcbiAgICAgIHZhciBwb2ludHMgPSBnbHlwaC5wb2ludHMuc2xpY2UoKTtcbiAgICAgIHBvaW50cy5wdXNoLmFwcGx5KHBvaW50cywgdGhpcy5fZ2V0UGhhbnRvbVBvaW50cyhnbHlwaCkpO1xuXG4gICAgICB0aGlzLl9mb250Ll92YXJpYXRpb25Qcm9jZXNzb3IudHJhbnNmb3JtUG9pbnRzKHRoaXMuaWQsIHBvaW50cyk7XG5cbiAgICAgIGdseXBoLnBoYW50b21Qb2ludHMgPSBwb2ludHMuc2xpY2UoLTQpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfTtcblxuICBfcHJvdG8yLl9kZWNvZGVDb21wb3NpdGUgPSBmdW5jdGlvbiBfZGVjb2RlQ29tcG9zaXRlKGdseXBoLCBzdHJlYW0sIG9mZnNldCkge1xuICAgIGlmIChvZmZzZXQgPT09IHZvaWQgMCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGlzIGEgY29tcG9zaXRlIGdseXBoXG4gICAgZ2x5cGguY29tcG9uZW50cyA9IFtdO1xuICAgIHZhciBoYXZlSW5zdHJ1Y3Rpb25zID0gZmFsc2U7XG4gICAgdmFyIGZsYWdzID0gTU9SRV9DT01QT05FTlRTO1xuXG4gICAgd2hpbGUgKGZsYWdzICYgTU9SRV9DT01QT05FTlRTKSB7XG4gICAgICBmbGFncyA9IHN0cmVhbS5yZWFkVUludDE2QkUoKTtcbiAgICAgIHZhciBnUG9zID0gc3RyZWFtLnBvcyAtIG9mZnNldDtcbiAgICAgIHZhciBnbHlwaElEID0gc3RyZWFtLnJlYWRVSW50MTZCRSgpO1xuXG4gICAgICBpZiAoIWhhdmVJbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgaGF2ZUluc3RydWN0aW9ucyA9IChmbGFncyAmIFdFX0hBVkVfSU5TVFJVQ1RJT05TKSAhPT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZsYWdzICYgQVJHXzFfQU5EXzJfQVJFX1dPUkRTKSB7XG4gICAgICAgIHZhciBkeCA9IHN0cmVhbS5yZWFkSW50MTZCRSgpO1xuICAgICAgICB2YXIgZHkgPSBzdHJlYW0ucmVhZEludDE2QkUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBkeCA9IHN0cmVhbS5yZWFkSW50OCgpO1xuICAgICAgICB2YXIgZHkgPSBzdHJlYW0ucmVhZEludDgoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoZ2x5cGhJRCwgZHgsIGR5KTtcbiAgICAgIGNvbXBvbmVudC5wb3MgPSBnUG9zO1xuXG4gICAgICBpZiAoZmxhZ3MgJiBXRV9IQVZFX0FfU0NBTEUpIHtcbiAgICAgICAgLy8gZml4ZWQgbnVtYmVyIHdpdGggMTQgYml0cyBvZiBmcmFjdGlvblxuICAgICAgICBjb21wb25lbnQuc2NhbGVYID0gY29tcG9uZW50LnNjYWxlWSA9IChzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMjQgfCBzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMTYpIC8gMTA3Mzc0MTgyNDtcbiAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBXRV9IQVZFX0FOX1hfQU5EX1lfU0NBTEUpIHtcbiAgICAgICAgY29tcG9uZW50LnNjYWxlWCA9IChzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMjQgfCBzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMTYpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgY29tcG9uZW50LnNjYWxlWSA9IChzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMjQgfCBzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMTYpIC8gMTA3Mzc0MTgyNDtcbiAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBXRV9IQVZFX0FfVFdPX0JZX1RXTykge1xuICAgICAgICBjb21wb25lbnQuc2NhbGVYID0gKHN0cmVhbS5yZWFkVUludDgoKSA8PCAyNCB8IHN0cmVhbS5yZWFkVUludDgoKSA8PCAxNikgLyAxMDczNzQxODI0O1xuICAgICAgICBjb21wb25lbnQuc2NhbGUwMSA9IChzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMjQgfCBzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMTYpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgY29tcG9uZW50LnNjYWxlMTAgPSAoc3RyZWFtLnJlYWRVSW50OCgpIDw8IDI0IHwgc3RyZWFtLnJlYWRVSW50OCgpIDw8IDE2KSAvIDEwNzM3NDE4MjQ7XG4gICAgICAgIGNvbXBvbmVudC5zY2FsZVkgPSAoc3RyZWFtLnJlYWRVSW50OCgpIDw8IDI0IHwgc3RyZWFtLnJlYWRVSW50OCgpIDw8IDE2KSAvIDEwNzM3NDE4MjQ7XG4gICAgICB9XG5cbiAgICAgIGdseXBoLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9mb250Ll92YXJpYXRpb25Qcm9jZXNzb3IpIHtcbiAgICAgIHZhciBwb2ludHMgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBnbHlwaC5jb21wb25lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSBnbHlwaC5jb21wb25lbnRzW2pdO1xuICAgICAgICBwb2ludHMucHVzaChuZXcgUG9pbnQodHJ1ZSwgdHJ1ZSwgY29tcG9uZW50LmR4LCBjb21wb25lbnQuZHkpKTtcbiAgICAgIH1cblxuICAgICAgcG9pbnRzLnB1c2guYXBwbHkocG9pbnRzLCB0aGlzLl9nZXRQaGFudG9tUG9pbnRzKGdseXBoKSk7XG5cbiAgICAgIHRoaXMuX2ZvbnQuX3ZhcmlhdGlvblByb2Nlc3Nvci50cmFuc2Zvcm1Qb2ludHModGhpcy5pZCwgcG9pbnRzKTtcblxuICAgICAgZ2x5cGgucGhhbnRvbVBvaW50cyA9IHBvaW50cy5zcGxpY2UoLTQsIDQpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgICAgIGdseXBoLmNvbXBvbmVudHNbaV0uZHggPSBwb2ludC54O1xuICAgICAgICBnbHlwaC5jb21wb25lbnRzW2ldLmR5ID0gcG9pbnQueTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGF2ZUluc3RydWN0aW9ucztcbiAgfTtcblxuICBfcHJvdG8yLl9nZXRQaGFudG9tUG9pbnRzID0gZnVuY3Rpb24gX2dldFBoYW50b21Qb2ludHMoZ2x5cGgpIHtcbiAgICB2YXIgY2JveCA9IHRoaXMuX2dldENCb3godHJ1ZSk7XG5cbiAgICBpZiAodGhpcy5fbWV0cmljcyA9PSBudWxsKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzID0gR2x5cGgucHJvdG90eXBlLl9nZXRNZXRyaWNzLmNhbGwodGhpcywgY2JveCk7XG4gICAgfVxuXG4gICAgdmFyIF90aGlzJF9tZXRyaWNzID0gdGhpcy5fbWV0cmljcyxcbiAgICAgICAgYWR2YW5jZVdpZHRoID0gX3RoaXMkX21ldHJpY3MuYWR2YW5jZVdpZHRoLFxuICAgICAgICBhZHZhbmNlSGVpZ2h0ID0gX3RoaXMkX21ldHJpY3MuYWR2YW5jZUhlaWdodCxcbiAgICAgICAgbGVmdEJlYXJpbmcgPSBfdGhpcyRfbWV0cmljcy5sZWZ0QmVhcmluZyxcbiAgICAgICAgdG9wQmVhcmluZyA9IF90aGlzJF9tZXRyaWNzLnRvcEJlYXJpbmc7XG4gICAgcmV0dXJuIFtuZXcgUG9pbnQoZmFsc2UsIHRydWUsIGdseXBoLnhNaW4gLSBsZWZ0QmVhcmluZywgMCksIG5ldyBQb2ludChmYWxzZSwgdHJ1ZSwgZ2x5cGgueE1pbiAtIGxlZnRCZWFyaW5nICsgYWR2YW5jZVdpZHRoLCAwKSwgbmV3IFBvaW50KGZhbHNlLCB0cnVlLCAwLCBnbHlwaC55TWF4ICsgdG9wQmVhcmluZyksIG5ldyBQb2ludChmYWxzZSwgdHJ1ZSwgMCwgZ2x5cGgueU1heCArIHRvcEJlYXJpbmcgKyBhZHZhbmNlSGVpZ2h0KV07XG4gIH0gLy8gRGVjb2RlcyBmb250IGRhdGEsIHJlc29sdmVzIGNvbXBvc2l0ZSBnbHlwaHMsIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGNvbnRvdXJzXG4gIDtcblxuICBfcHJvdG8yLl9nZXRDb250b3VycyA9IGZ1bmN0aW9uIF9nZXRDb250b3VycygpIHtcbiAgICB2YXIgZ2x5cGggPSB0aGlzLl9kZWNvZGUoKTtcblxuICAgIGlmICghZ2x5cGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgcG9pbnRzID0gW107XG5cbiAgICBpZiAoZ2x5cGgubnVtYmVyT2ZDb250b3VycyA8IDApIHtcbiAgICAgIC8vIHJlc29sdmUgY29tcG9zaXRlIGdseXBoc1xuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRtKGdseXBoLmNvbXBvbmVudHMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgdmFyIF9jb250b3VycyA9IHRoaXMuX2ZvbnQuZ2V0R2x5cGgoY29tcG9uZW50LmdseXBoSUQpLl9nZXRDb250b3VycygpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2NvbnRvdXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNvbnRvdXIgPSBfY29udG91cnNbaV07XG5cbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRvdXIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBfcG9pbnQgPSBjb250b3VyW2pdO1xuICAgICAgICAgICAgdmFyIHggPSBfcG9pbnQueCAqIGNvbXBvbmVudC5zY2FsZVggKyBfcG9pbnQueSAqIGNvbXBvbmVudC5zY2FsZTAxICsgY29tcG9uZW50LmR4O1xuICAgICAgICAgICAgdmFyIHkgPSBfcG9pbnQueSAqIGNvbXBvbmVudC5zY2FsZVkgKyBfcG9pbnQueCAqIGNvbXBvbmVudC5zY2FsZTEwICsgY29tcG9uZW50LmR5O1xuICAgICAgICAgICAgcG9pbnRzLnB1c2gobmV3IFBvaW50KF9wb2ludC5vbkN1cnZlLCBfcG9pbnQuZW5kQ29udG91ciwgeCwgeSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb2ludHMgPSBnbHlwaC5wb2ludHMgfHwgW107XG4gICAgfSAvLyBSZWNvbXB1dGUgYW5kIGNhY2hlIG1ldHJpY3MgaWYgd2UgcGVyZm9ybWVkIHZhcmlhdGlvbiBwcm9jZXNzaW5nLCBhbmQgZG9uJ3QgaGF2ZSBhbiBIVkFSIHRhYmxlXG5cblxuICAgIGlmIChnbHlwaC5waGFudG9tUG9pbnRzICYmICF0aGlzLl9mb250LmRpcmVjdG9yeS50YWJsZXMuSFZBUikge1xuICAgICAgdGhpcy5fbWV0cmljcy5hZHZhbmNlV2lkdGggPSBnbHlwaC5waGFudG9tUG9pbnRzWzFdLnggLSBnbHlwaC5waGFudG9tUG9pbnRzWzBdLng7XG4gICAgICB0aGlzLl9tZXRyaWNzLmFkdmFuY2VIZWlnaHQgPSBnbHlwaC5waGFudG9tUG9pbnRzWzNdLnkgLSBnbHlwaC5waGFudG9tUG9pbnRzWzJdLnk7XG4gICAgICB0aGlzLl9tZXRyaWNzLmxlZnRCZWFyaW5nID0gZ2x5cGgueE1pbiAtIGdseXBoLnBoYW50b21Qb2ludHNbMF0ueDtcbiAgICAgIHRoaXMuX21ldHJpY3MudG9wQmVhcmluZyA9IGdseXBoLnBoYW50b21Qb2ludHNbMl0ueSAtIGdseXBoLnlNYXg7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRvdXJzID0gW107XG4gICAgdmFyIGN1ciA9IFtdO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBwb2ludHMubGVuZ3RoOyBrKyspIHtcbiAgICAgIHZhciBwb2ludCA9IHBvaW50c1trXTtcbiAgICAgIGN1ci5wdXNoKHBvaW50KTtcblxuICAgICAgaWYgKHBvaW50LmVuZENvbnRvdXIpIHtcbiAgICAgICAgY29udG91cnMucHVzaChjdXIpO1xuICAgICAgICBjdXIgPSBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udG91cnM7XG4gIH07XG5cbiAgX3Byb3RvMi5fZ2V0TWV0cmljcyA9IGZ1bmN0aW9uIF9nZXRNZXRyaWNzKCkge1xuICAgIGlmICh0aGlzLl9tZXRyaWNzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWV0cmljcztcbiAgICB9XG5cbiAgICB2YXIgY2JveCA9IHRoaXMuX2dldENCb3godHJ1ZSk7XG5cbiAgICBfR2x5cGgucHJvdG90eXBlLl9nZXRNZXRyaWNzLmNhbGwodGhpcywgY2JveCk7XG5cbiAgICBpZiAodGhpcy5fZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yICYmICF0aGlzLl9mb250LkhWQVIpIHtcbiAgICAgIC8vIE5vIEhWQVIgdGFibGUsIGRlY29kZSB0aGUgZ2x5cGguIFRoaXMgdHJpZ2dlcnMgcmVjb21wdXRhdGlvbiBvZiBtZXRyaWNzLlxuICAgICAgdGhpcy5wYXRoO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzO1xuICB9IC8vIENvbnZlcnRzIGNvbnRvdXJzIHRvIGEgUGF0aCBvYmplY3QgdGhhdCBjYW4gYmUgcmVuZGVyZWRcbiAgO1xuXG4gIF9wcm90bzIuX2dldFBhdGggPSBmdW5jdGlvbiBfZ2V0UGF0aCgpIHtcbiAgICB2YXIgY29udG91cnMgPSB0aGlzLl9nZXRDb250b3VycygpO1xuXG4gICAgdmFyIHBhdGggPSBuZXcgUGF0aCgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250b3Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbnRvdXIgPSBjb250b3Vyc1tpXTtcbiAgICAgIHZhciBmaXJzdFB0ID0gY29udG91clswXTtcbiAgICAgIHZhciBsYXN0UHQgPSBjb250b3VyW2NvbnRvdXIubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgc3RhcnQgPSAwO1xuXG4gICAgICBpZiAoZmlyc3RQdC5vbkN1cnZlKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwb2ludCB3aWxsIGJlIGNvbnN1bWVkIGJ5IHRoZSBtb3ZlVG8gY29tbWFuZCwgc28gc2tpcCBpbiB0aGUgbG9vcFxuICAgICAgICB2YXIgY3VydmVQdCA9IG51bGw7XG4gICAgICAgIHN0YXJ0ID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsYXN0UHQub25DdXJ2ZSkge1xuICAgICAgICAgIC8vIFN0YXJ0IGF0IHRoZSBsYXN0IHBvaW50IGlmIHRoZSBmaXJzdCBwb2ludCBpcyBvZmYgY3VydmUgYW5kIHRoZSBsYXN0IHBvaW50IGlzIG9uIGN1cnZlXG4gICAgICAgICAgZmlyc3RQdCA9IGxhc3RQdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTdGFydCBhdCB0aGUgbWlkZGxlIGlmIGJvdGggdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBhcmUgb2ZmIGN1cnZlXG4gICAgICAgICAgZmlyc3RQdCA9IG5ldyBQb2ludChmYWxzZSwgZmFsc2UsIChmaXJzdFB0LnggKyBsYXN0UHQueCkgLyAyLCAoZmlyc3RQdC55ICsgbGFzdFB0LnkpIC8gMik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY3VydmVQdCA9IGZpcnN0UHQ7XG4gICAgICB9XG5cbiAgICAgIHBhdGgubW92ZVRvKGZpcnN0UHQueCwgZmlyc3RQdC55KTtcblxuICAgICAgZm9yICh2YXIgaiA9IHN0YXJ0OyBqIDwgY29udG91ci5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgcHQgPSBjb250b3VyW2pdO1xuICAgICAgICB2YXIgcHJldlB0ID0gaiA9PT0gMCA/IGZpcnN0UHQgOiBjb250b3VyW2ogLSAxXTtcblxuICAgICAgICBpZiAocHJldlB0Lm9uQ3VydmUgJiYgcHQub25DdXJ2ZSkge1xuICAgICAgICAgIHBhdGgubGluZVRvKHB0LngsIHB0LnkpO1xuICAgICAgICB9IGVsc2UgaWYgKHByZXZQdC5vbkN1cnZlICYmICFwdC5vbkN1cnZlKSB7XG4gICAgICAgICAgdmFyIGN1cnZlUHQgPSBwdDtcbiAgICAgICAgfSBlbHNlIGlmICghcHJldlB0Lm9uQ3VydmUgJiYgIXB0Lm9uQ3VydmUpIHtcbiAgICAgICAgICB2YXIgbWlkWCA9IChwcmV2UHQueCArIHB0LngpIC8gMjtcbiAgICAgICAgICB2YXIgbWlkWSA9IChwcmV2UHQueSArIHB0LnkpIC8gMjtcbiAgICAgICAgICBwYXRoLnF1YWRyYXRpY0N1cnZlVG8ocHJldlB0LngsIHByZXZQdC55LCBtaWRYLCBtaWRZKTtcbiAgICAgICAgICB2YXIgY3VydmVQdCA9IHB0O1xuICAgICAgICB9IGVsc2UgaWYgKCFwcmV2UHQub25DdXJ2ZSAmJiBwdC5vbkN1cnZlKSB7XG4gICAgICAgICAgcGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKGN1cnZlUHQueCwgY3VydmVQdC55LCBwdC54LCBwdC55KTtcbiAgICAgICAgICB2YXIgY3VydmVQdCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBUVEYgcGF0aCBzdGF0ZVwiKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBDb25uZWN0IHRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludHNcblxuXG4gICAgICBpZiAoY3VydmVQdCkge1xuICAgICAgICBwYXRoLnF1YWRyYXRpY0N1cnZlVG8oY3VydmVQdC54LCBjdXJ2ZVB0LnksIGZpcnN0UHQueCwgZmlyc3RQdC55KTtcbiAgICAgIH1cblxuICAgICAgcGF0aC5jbG9zZVBhdGgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aDtcbiAgfTtcblxuICByZXR1cm4gVFRGR2x5cGg7XG59KEdseXBoKTtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkYShzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cbi8qKlxuICogUmVwcmVzZW50cyBhbiBPcGVuVHlwZSBQb3N0U2NyaXB0IGdseXBoLCBpbiB0aGUgQ29tcGFjdCBGb250IEZvcm1hdC5cbiAqL1xuXG52YXIgQ0ZGR2x5cGggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9HbHlwaCkge1xuICBfaW5oZXJpdHNMb29zZSRhKENGRkdseXBoLCBfR2x5cGgpO1xuXG4gIGZ1bmN0aW9uIENGRkdseXBoKCkge1xuICAgIHJldHVybiBfR2x5cGguYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IENGRkdseXBoLnByb3RvdHlwZTtcblxuICBfcHJvdG8uX2dldE5hbWUgPSBmdW5jdGlvbiBfZ2V0TmFtZSgpIHtcbiAgICBpZiAodGhpcy5fZm9udC5DRkYyKSB7XG4gICAgICByZXR1cm4gX0dseXBoLnByb3RvdHlwZS5fZ2V0TmFtZS5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9mb250WydDRkYgJ10uZ2V0R2x5cGhOYW1lKHRoaXMuaWQpO1xuICB9O1xuXG4gIF9wcm90by5iaWFzID0gZnVuY3Rpb24gYmlhcyhzKSB7XG4gICAgaWYgKHMubGVuZ3RoIDwgMTI0MCkge1xuICAgICAgcmV0dXJuIDEwNztcbiAgICB9IGVsc2UgaWYgKHMubGVuZ3RoIDwgMzM5MDApIHtcbiAgICAgIHJldHVybiAxMTMxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMzI3Njg7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5fZ2V0UGF0aCA9IGZ1bmN0aW9uIF9nZXRQYXRoKCkge1xuICAgIHZhciBzdHJlYW0gPSB0aGlzLl9mb250LnN0cmVhbTtcbiAgICB2YXIgcG9zID0gc3RyZWFtLnBvcztcbiAgICB2YXIgY2ZmID0gdGhpcy5fZm9udC5DRkYyIHx8IHRoaXMuX2ZvbnRbJ0NGRiAnXTtcbiAgICB2YXIgc3RyID0gY2ZmLnRvcERpY3QuQ2hhclN0cmluZ3NbdGhpcy5pZF07XG4gICAgdmFyIGVuZCA9IHN0ci5vZmZzZXQgKyBzdHIubGVuZ3RoO1xuICAgIHN0cmVhbS5wb3MgPSBzdHIub2Zmc2V0O1xuICAgIHZhciBwYXRoID0gbmV3IFBhdGgoKTtcbiAgICB2YXIgc3RhY2sgPSBbXTtcbiAgICB2YXIgdHJhbnMgPSBbXTtcbiAgICB2YXIgd2lkdGggPSBudWxsO1xuICAgIHZhciBuU3RlbXMgPSAwO1xuICAgIHZhciB4ID0gMCxcbiAgICAgICAgeSA9IDA7XG4gICAgdmFyIHVzZWRHc3VicnM7XG4gICAgdmFyIHVzZWRTdWJycztcbiAgICB2YXIgb3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuX3VzZWRHc3VicnMgPSB1c2VkR3N1YnJzID0ge307XG4gICAgdGhpcy5fdXNlZFN1YnJzID0gdXNlZFN1YnJzID0ge307XG4gICAgdmFyIGdzdWJycyA9IGNmZi5nbG9iYWxTdWJySW5kZXggfHwgW107XG4gICAgdmFyIGdzdWJyc0JpYXMgPSB0aGlzLmJpYXMoZ3N1YnJzKTtcbiAgICB2YXIgcHJpdmF0ZURpY3QgPSBjZmYucHJpdmF0ZURpY3RGb3JHbHlwaCh0aGlzLmlkKTtcbiAgICB2YXIgc3VicnMgPSBwcml2YXRlRGljdC5TdWJycyB8fCBbXTtcbiAgICB2YXIgc3VicnNCaWFzID0gdGhpcy5iaWFzKHN1YnJzKTtcbiAgICB2YXIgdnN0b3JlID0gY2ZmLnRvcERpY3QudnN0b3JlICYmIGNmZi50b3BEaWN0LnZzdG9yZS5pdGVtVmFyaWF0aW9uU3RvcmU7XG4gICAgdmFyIHZzaW5kZXggPSBwcml2YXRlRGljdC52c2luZGV4O1xuICAgIHZhciB2YXJpYXRpb25Qcm9jZXNzb3IgPSB0aGlzLl9mb250Ll92YXJpYXRpb25Qcm9jZXNzb3I7XG5cbiAgICBmdW5jdGlvbiBjaGVja1dpZHRoKCkge1xuICAgICAgaWYgKHdpZHRoID09IG51bGwpIHtcbiAgICAgICAgd2lkdGggPSBzdGFjay5zaGlmdCgpICsgcHJpdmF0ZURpY3Qubm9taW5hbFdpZHRoWDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVN0ZW1zKCkge1xuICAgICAgaWYgKHN0YWNrLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAgICAgY2hlY2tXaWR0aCgpO1xuICAgICAgfVxuXG4gICAgICBuU3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7XG4gICAgICByZXR1cm4gc3RhY2subGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkge1xuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgcGF0aC5jbG9zZVBhdGgoKTtcbiAgICAgIH1cblxuICAgICAgcGF0aC5tb3ZlVG8oeCwgeSk7XG4gICAgICBvcGVuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgcGFyc2UgPSBmdW5jdGlvbiBwYXJzZSgpIHtcbiAgICAgIHdoaWxlIChzdHJlYW0ucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciBvcCA9IHN0cmVhbS5yZWFkVUludDgoKTtcblxuICAgICAgICBpZiAob3AgPCAzMikge1xuICAgICAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgICAgIGNhc2UgMTogLy8gaHN0ZW1cblxuICAgICAgICAgICAgY2FzZSAzOiAvLyB2c3RlbVxuXG4gICAgICAgICAgICBjYXNlIDE4OiAvLyBoc3RlbWhtXG5cbiAgICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICAgIC8vIHZzdGVtaG1cbiAgICAgICAgICAgICAgcGFyc2VTdGVtcygpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAvLyB2bW92ZXRvXG4gICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tXaWR0aCgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBtb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgIC8vIHJsaW5ldG9cbiAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBwYXRoLmxpbmVUbyh4LCB5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDY6IC8vIGhsaW5ldG9cblxuICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAvLyB2bGluZXRvXG4gICAgICAgICAgICAgIHZhciBwaGFzZSA9IG9wID09PSA2O1xuXG4gICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChwaGFzZSkge1xuICAgICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGF0aC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAhcGhhc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAvLyBycmN1cnZldG9cbiAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgYzF4ID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGMxeSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHZhciBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHZhciBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHggPSBjMnggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHkgPSBjMnkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgIC8vIGNhbGxzdWJyXG4gICAgICAgICAgICAgIHZhciBpbmRleCA9IHN0YWNrLnBvcCgpICsgc3VicnNCaWFzO1xuICAgICAgICAgICAgICB2YXIgc3ViciA9IHN1YnJzW2luZGV4XTtcblxuICAgICAgICAgICAgICBpZiAoc3Vicikge1xuICAgICAgICAgICAgICAgIHVzZWRTdWJyc1tpbmRleF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciBwID0gc3RyZWFtLnBvcztcbiAgICAgICAgICAgICAgICB2YXIgZSA9IGVuZDtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucG9zID0gc3Vici5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgZW5kID0gc3Vici5vZmZzZXQgKyBzdWJyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBwYXJzZSgpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wb3MgPSBwO1xuICAgICAgICAgICAgICAgIGVuZCA9IGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgLy8gcmV0dXJuXG4gICAgICAgICAgICAgIGlmIChjZmYudmVyc2lvbiA+PSAyKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgIC8vIGVuZGNoYXJcbiAgICAgICAgICAgICAgaWYgKGNmZi52ZXJzaW9uID49IDIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tXaWR0aCgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgICAgICAgICBwYXRoLmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICAgIG9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gdnNpbmRleFxuICAgICAgICAgICAgICAgIGlmIChjZmYudmVyc2lvbiA8IDIpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndnNpbmRleCBvcGVyYXRvciBub3Qgc3VwcG9ydGVkIGluIENGRiB2MScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZzaW5kZXggPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gYmxlbmRcbiAgICAgICAgICAgICAgICBpZiAoY2ZmLnZlcnNpb24gPCAyKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JsZW5kIG9wZXJhdG9yIG5vdCBzdXBwb3J0ZWQgaW4gQ0ZGIHYxJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYXRpb25Qcm9jZXNzb3IpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmxlbmQgb3BlcmF0b3IgaW4gbm9uLXZhcmlhdGlvbiBmb250Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGJsZW5kVmVjdG9yID0gdmFyaWF0aW9uUHJvY2Vzc29yLmdldEJsZW5kVmVjdG9yKHZzdG9yZSwgdnNpbmRleCk7XG4gICAgICAgICAgICAgICAgdmFyIG51bUJsZW5kcyA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHZhciBudW1PcGVyYW5kcyA9IG51bUJsZW5kcyAqIGJsZW5kVmVjdG9yLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSBzdGFjay5sZW5ndGggLSBudW1PcGVyYW5kcztcbiAgICAgICAgICAgICAgICB2YXIgYmFzZSA9IGRlbHRhIC0gbnVtQmxlbmRzO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1CbGVuZHM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgdmFyIHN1bSA9IHN0YWNrW2Jhc2UgKyBpXTtcblxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBibGVuZFZlY3Rvci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYmxlbmRWZWN0b3Jbal0gKiBzdGFja1tkZWx0YSsrXTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgc3RhY2tbYmFzZSArIGldID0gc3VtO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHdoaWxlIChudW1PcGVyYW5kcy0tKSB7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIDE5OiAvLyBoaW50bWFza1xuXG4gICAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgICAvLyBjbnRybWFza1xuICAgICAgICAgICAgICBwYXJzZVN0ZW1zKCk7XG4gICAgICAgICAgICAgIHN0cmVhbS5wb3MgKz0gblN0ZW1zICsgNyA+PiAzO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgLy8gcm1vdmV0b1xuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIGNoZWNrV2lkdGgoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBtb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAvLyBobW92ZXRvXG4gICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tXaWR0aCgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBtb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgICAvLyByY3VydmVsaW5lXG4gICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPj0gOCkge1xuICAgICAgICAgICAgICAgIHZhciBjMXggPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB2YXIgYzF5ID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IGMyeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeSA9IGMyeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwgeCwgeSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgcGF0aC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgICAvLyBybGluZWN1cnZlXG4gICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPj0gOCkge1xuICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgcGF0aC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgYzF4ID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHZhciBjMXkgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgdmFyIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHZhciBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeSA9IGMyeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHkpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICAgICAgLy8gdnZjdXJ2ZXRvXG4gICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggJSAyKSB7XG4gICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgICAgICAgICAgYzF4ID0geDtcbiAgICAgICAgICAgICAgICBjMXkgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IGMyeDtcbiAgICAgICAgICAgICAgICB5ID0gYzJ5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgICAvLyBoaGN1cnZldG9cbiAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCAlIDIpIHtcbiAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID49IDQpIHtcbiAgICAgICAgICAgICAgICBjMXggPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBjMXkgPSB5O1xuICAgICAgICAgICAgICAgIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5ID0gYzJ5O1xuICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjg6XG4gICAgICAgICAgICAgIC8vIHNob3J0aW50XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goc3RyZWFtLnJlYWRJbnQxNkJFKCkpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgICAgLy8gY2FsbGdzdWJyXG4gICAgICAgICAgICAgIGluZGV4ID0gc3RhY2sucG9wKCkgKyBnc3VicnNCaWFzO1xuICAgICAgICAgICAgICBzdWJyID0gZ3N1YnJzW2luZGV4XTtcblxuICAgICAgICAgICAgICBpZiAoc3Vicikge1xuICAgICAgICAgICAgICAgIHVzZWRHc3VicnNbaW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgcCA9IHN0cmVhbS5wb3M7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBlbmQ7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnBvcyA9IHN1YnIub2Zmc2V0O1xuICAgICAgICAgICAgICAgIGVuZCA9IHN1YnIub2Zmc2V0ICsgc3Vici5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcGFyc2UoKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucG9zID0gcDtcbiAgICAgICAgICAgICAgICBlbmQgPSBlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMzA6IC8vIHZoY3VydmV0b1xuXG4gICAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgICAvLyBodmN1cnZldG9cbiAgICAgICAgICAgICAgcGhhc2UgPSBvcCA9PT0gMzE7XG5cbiAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHBoYXNlKSB7XG4gICAgICAgICAgICAgICAgICBjMXggPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGMxeSA9IHk7XG4gICAgICAgICAgICAgICAgICBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHkgPSBjMnkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgeCA9IGMyeCArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGMxeCA9IHg7XG4gICAgICAgICAgICAgICAgICBjMXkgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgeCA9IGMyeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICB5ID0gYzJ5ICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5KTtcbiAgICAgICAgICAgICAgICBwaGFzZSA9ICFwaGFzZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICBvcCA9IHN0cmVhbS5yZWFkVUludDgoKTtcblxuICAgICAgICAgICAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgLy8gYW5kXG4gICAgICAgICAgICAgICAgICB2YXIgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgdmFyIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAmJiBiID8gMSA6IDApO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAvLyBvclxuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhIHx8IGIgPyAxIDogMCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgIC8vIG5vdFxuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhID8gMCA6IDEpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAvLyBhYnNcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hYnMoYSkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgLy8gYWRkXG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgKyBiKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgIC8vIHN1YlxuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhIC0gYik7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAvLyBkaXZcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAvIGIpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgLy8gbmVnXG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKC1hKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgIC8vIGVxXG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgPT09IGIgPyAxIDogMCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAvLyBkcm9wXG4gICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgICAgICAgIC8vIHB1dFxuICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgdHJhbnNbaWR4XSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgIC8vIGdldFxuICAgICAgICAgICAgICAgICAgaWR4ID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRyYW5zW2lkeF0gfHwgMCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgICAgICAvLyBpZmVsc2VcbiAgICAgICAgICAgICAgICAgIHZhciBzMSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgdmFyIHMyID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICB2YXIgdjEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHZhciB2MiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh2MSA8PSB2MiA/IHMxIDogczIpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgICAgICAgLy8gcmFuZG9tXG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGgucmFuZG9tKCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgICAgICAgLy8gbXVsXG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgKiBiKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICAgICAgICAgIC8vIHNxcnRcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5zcXJ0KGEpKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgICAgIC8vIGR1cFxuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhLCBhKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICAgICAgICAgIC8vIGV4Y2hcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYiwgYSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICAgICAgICAvLyBpbmRleFxuICAgICAgICAgICAgICAgICAgaWR4ID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkeCA9IDA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlkeCA+IHN0YWNrLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWR4ID0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChzdGFja1tpZHhdKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICAgICAgICAgIC8vIHJvbGxcbiAgICAgICAgICAgICAgICAgIHZhciBuID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgICAgICAgICAgIHZhciBfaiA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoX2ogPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX2ogPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBzdGFja1tuIC0gMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IG4gLSAyOyBfaSA+PSAwOyBfaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFja1tfaSArIDFdID0gc3RhY2tbX2ldO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHN0YWNrWzBdID0gdDtcbiAgICAgICAgICAgICAgICAgICAgICBfai0tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX2ogPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBzdGFja1swXTtcblxuICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8PSBuOyBfaTIrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tbX2kyXSA9IHN0YWNrW19pMiArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW24gLSAxXSA9IHQ7XG4gICAgICAgICAgICAgICAgICAgICAgX2orKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICAgICAgICAvLyBoZmxleFxuICAgICAgICAgICAgICAgICAgYzF4ID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjMXkgPSB5O1xuICAgICAgICAgICAgICAgICAgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICB2YXIgYzN4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHZhciBjM3kgPSBjMnk7XG4gICAgICAgICAgICAgICAgICB2YXIgYzR4ID0gYzN4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHZhciBjNHkgPSBjM3k7XG4gICAgICAgICAgICAgICAgICB2YXIgYzV4ID0gYzR4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHZhciBjNXkgPSBjNHk7XG4gICAgICAgICAgICAgICAgICB2YXIgYzZ4ID0gYzV4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHZhciBjNnkgPSBjNXk7XG4gICAgICAgICAgICAgICAgICB4ID0gYzZ4O1xuICAgICAgICAgICAgICAgICAgeSA9IGM2eTtcbiAgICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIGMzeCwgYzN5KTtcbiAgICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUbyhjNHgsIGM0eSwgYzV4LCBjNXksIGM2eCwgYzZ5KTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAzNTpcbiAgICAgICAgICAgICAgICAgIC8vIGZsZXhcbiAgICAgICAgICAgICAgICAgIHZhciBwdHMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDw9IDU7IF9pMysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBwdHMucHVzaCh4LCB5KTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvLmFwcGx5KHBhdGgsIHB0cy5zbGljZSgwLCA2KSk7XG4gICAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8uYXBwbHkocGF0aCwgcHRzLnNsaWNlKDYpKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnNoaWZ0KCk7IC8vIGZkXG5cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgICAgICAgIC8vIGhmbGV4MVxuICAgICAgICAgICAgICAgICAgYzF4ID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjMXkgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzN4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGMzeSA9IGMyeTtcbiAgICAgICAgICAgICAgICAgIGM0eCA9IGMzeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjNHkgPSBjM3k7XG4gICAgICAgICAgICAgICAgICBjNXggPSBjNHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzV5ID0gYzR5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGM2eCA9IGM1eCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjNnkgPSBjNXk7XG4gICAgICAgICAgICAgICAgICB4ID0gYzZ4O1xuICAgICAgICAgICAgICAgICAgeSA9IGM2eTtcbiAgICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIGMzeCwgYzN5KTtcbiAgICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUbyhjNHgsIGM0eSwgYzV4LCBjNXksIGM2eCwgYzZ5KTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgICAgICAgIC8vIGZsZXgxXG4gICAgICAgICAgICAgICAgICB2YXIgc3RhcnR4ID0geDtcbiAgICAgICAgICAgICAgICAgIHZhciBzdGFydHkgPSB5O1xuICAgICAgICAgICAgICAgICAgcHRzID0gW107XG5cbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8PSA0OyBfaTQrKykge1xuICAgICAgICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgcHRzLnB1c2goeCwgeSk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyh4IC0gc3RhcnR4KSA+IE1hdGguYWJzKHkgLSBzdGFydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhvcml6b250YWxcbiAgICAgICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICB5ID0gc3RhcnR5O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgeCA9IHN0YXJ0eDtcbiAgICAgICAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBwdHMucHVzaCh4LCB5KTtcbiAgICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUby5hcHBseShwYXRoLCBwdHMuc2xpY2UoMCwgNikpO1xuICAgICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvLmFwcGx5KHBhdGgsIHB0cy5zbGljZSg2KSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG9wOiAxMiBcIiArIG9wKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG9wOiBcIiArIG9wKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3AgPCAyNDcpIHtcbiAgICAgICAgICBzdGFjay5wdXNoKG9wIC0gMTM5KTtcbiAgICAgICAgfSBlbHNlIGlmIChvcCA8IDI1MSkge1xuICAgICAgICAgIHZhciBiMSA9IHN0cmVhbS5yZWFkVUludDgoKTtcbiAgICAgICAgICBzdGFjay5wdXNoKChvcCAtIDI0NykgKiAyNTYgKyBiMSArIDEwOCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3AgPCAyNTUpIHtcbiAgICAgICAgICB2YXIgYjEgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG4gICAgICAgICAgc3RhY2sucHVzaCgtKG9wIC0gMjUxKSAqIDI1NiAtIGIxIC0gMTA4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGFjay5wdXNoKHN0cmVhbS5yZWFkSW50MzJCRSgpIC8gNjU1MzYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHBhcnNlKCk7XG5cbiAgICBpZiAob3Blbikge1xuICAgICAgcGF0aC5jbG9zZVBhdGgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aDtcbiAgfTtcblxuICByZXR1cm4gQ0ZGR2x5cGg7XG59KEdseXBoKTtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkYihzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cbnZhciBTQklYSW1hZ2UgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgb3JpZ2luWDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBvcmlnaW5ZOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHR5cGU6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIGRhdGE6IG5ldyByZXN0cnVjdHVyZS5CdWZmZXIoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQuYnVmbGVuIC0gdC5fY3VycmVudE9mZnNldDtcbiAgfSlcbn0pO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29sb3IgKGUuZy4gZW1vamkpIGdseXBoIGluIEFwcGxlJ3MgU0JJWCBmb3JtYXQuXG4gKi9cblxudmFyIFNCSVhHbHlwaCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1RURkdseXBoKSB7XG4gIF9pbmhlcml0c0xvb3NlJGIoU0JJWEdseXBoLCBfVFRGR2x5cGgpO1xuXG4gIGZ1bmN0aW9uIFNCSVhHbHlwaCgpIHtcbiAgICByZXR1cm4gX1RURkdseXBoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTQklYR2x5cGgucHJvdG90eXBlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBnbHlwaCBpbWFnZSBhdCB0aGUgZ2l2ZW4gcG9pbnQgc2l6ZS5cbiAgICogVGhlIG9iamVjdCBoYXMgYSBkYXRhIHByb3BlcnR5IHdpdGggYSBCdWZmZXIgY29udGFpbmluZyB0aGUgYWN0dWFsIGltYWdlIGRhdGEsXG4gICAqIGFsb25nIHdpdGggdGhlIGltYWdlIHR5cGUsIGFuZCBvcmlnaW4uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIF9wcm90by5nZXRJbWFnZUZvclNpemUgPSBmdW5jdGlvbiBnZXRJbWFnZUZvclNpemUoc2l6ZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fZm9udC5zYml4LmltYWdlVGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdGFibGUgPSB0aGlzLl9mb250LnNiaXguaW1hZ2VUYWJsZXNbaV07XG5cbiAgICAgIGlmICh0YWJsZS5wcGVtID49IHNpemUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldHMgPSB0YWJsZS5pbWFnZU9mZnNldHM7XG4gICAgdmFyIHN0YXJ0ID0gb2Zmc2V0c1t0aGlzLmlkXTtcbiAgICB2YXIgZW5kID0gb2Zmc2V0c1t0aGlzLmlkICsgMV07XG5cbiAgICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZm9udC5zdHJlYW0ucG9zID0gc3RhcnQ7XG4gICAgcmV0dXJuIFNCSVhJbWFnZS5kZWNvZGUodGhpcy5fZm9udC5zdHJlYW0sIHtcbiAgICAgIGJ1ZmxlbjogZW5kIC0gc3RhcnRcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKGN0eCwgc2l6ZSkge1xuICAgIHZhciBpbWcgPSB0aGlzLmdldEltYWdlRm9yU2l6ZShzaXplKTtcblxuICAgIGlmIChpbWcgIT0gbnVsbCkge1xuICAgICAgdmFyIHNjYWxlID0gc2l6ZSAvIHRoaXMuX2ZvbnQudW5pdHNQZXJFbTtcbiAgICAgIGN0eC5pbWFnZShpbWcuZGF0YSwge1xuICAgICAgICBoZWlnaHQ6IHNpemUsXG4gICAgICAgIHg6IGltZy5vcmlnaW5YLFxuICAgICAgICB5OiAodGhpcy5iYm94Lm1pblkgLSBpbWcub3JpZ2luWSkgKiBzY2FsZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZvbnQuc2JpeC5mbGFncy5yZW5kZXJPdXRsaW5lcykge1xuICAgICAgX1RURkdseXBoLnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzLCBjdHgsIHNpemUpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gU0JJWEdseXBoO1xufShUVEZHbHlwaCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkbihvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkbihvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkbihvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JG4obywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRuKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkbihhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkNyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQ3KENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDcoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJGMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBDT0xSTGF5ZXIgPSBmdW5jdGlvbiBDT0xSTGF5ZXIoZ2x5cGgsIGNvbG9yKSB7XG4gIHRoaXMuZ2x5cGggPSBnbHlwaDtcbiAgdGhpcy5jb2xvciA9IGNvbG9yO1xufTtcbi8qKlxuICogUmVwcmVzZW50cyBhIGNvbG9yIChlLmcuIGVtb2ppKSBnbHlwaCBpbiBNaWNyb3NvZnQncyBDT0xSIGZvcm1hdC5cbiAqIEVhY2ggZ2x5cGggaW4gdGhpcyBmb3JtYXQgY29udGFpbiBhIGxpc3Qgb2YgY29sb3JlZCBsYXllcnMsIGVhY2hcbiAqIG9mIHdoaWNoICBpcyBhbm90aGVyIHZlY3RvciBnbHlwaC5cbiAqL1xuXG5cbnZhciBDT0xSR2x5cGggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9HbHlwaCkge1xuICBfaW5oZXJpdHNMb29zZSRjKENPTFJHbHlwaCwgX0dseXBoKTtcblxuICBmdW5jdGlvbiBDT0xSR2x5cGgoKSB7XG4gICAgcmV0dXJuIF9HbHlwaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQ09MUkdseXBoLnByb3RvdHlwZTtcblxuICBfcHJvdG8uX2dldEJCb3ggPSBmdW5jdGlvbiBfZ2V0QkJveCgpIHtcbiAgICB2YXIgYmJveCA9IG5ldyBCQm94KCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGF5ZXIgPSB0aGlzLmxheWVyc1tpXTtcbiAgICAgIHZhciBiID0gbGF5ZXIuZ2x5cGguYmJveDtcbiAgICAgIGJib3guYWRkUG9pbnQoYi5taW5YLCBiLm1pblkpO1xuICAgICAgYmJveC5hZGRQb2ludChiLm1heFgsIGIubWF4WSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJib3g7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHRoZSBnbHlwaCBhbmQgY29sb3IgZm9yXG4gICAqIGVhY2ggbGF5ZXIgaW4gdGhlIGNvbXBvc2l0ZSBjb2xvciBnbHlwaC5cbiAgICogQHR5cGUge29iamVjdFtdfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoY3R4LCBzaXplKSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRuKHRoaXMubGF5ZXJzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBfc3RlcCR2YWx1ZSA9IF9zdGVwLnZhbHVlLFxuICAgICAgICAgIGdseXBoID0gX3N0ZXAkdmFsdWUuZ2x5cGgsXG4gICAgICAgICAgY29sb3IgPSBfc3RlcCR2YWx1ZS5jb2xvcjtcbiAgICAgIGN0eC5maWxsQ29sb3IoW2NvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWVdLCBjb2xvci5hbHBoYSAvIDI1NSAqIDEwMCk7XG4gICAgICBnbHlwaC5yZW5kZXIoY3R4LCBzaXplKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzJDcoQ09MUkdseXBoLCBbe1xuICAgIGtleTogXCJsYXllcnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBjcGFsID0gdGhpcy5fZm9udC5DUEFMO1xuICAgICAgdmFyIGNvbHIgPSB0aGlzLl9mb250LkNPTFI7XG4gICAgICB2YXIgbG93ID0gMDtcbiAgICAgIHZhciBoaWdoID0gY29sci5iYXNlR2x5cGhSZWNvcmQubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSBsb3cgKyBoaWdoID4+IDE7XG4gICAgICAgIHZhciByZWMgPSBjb2xyLmJhc2VHbHlwaFJlY29yZFttaWRdO1xuXG4gICAgICAgIGlmICh0aGlzLmlkIDwgcmVjLmdpZCkge1xuICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaWQgPiByZWMuZ2lkKSB7XG4gICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYmFzZUxheWVyID0gcmVjO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IC8vIGlmIGJhc2UgZ2x5cGggbm90IGZvdW5kIGluIENPTFIgdGFibGUsXG4gICAgICAvLyBkZWZhdWx0IHRvIG5vcm1hbCBnbHlwaCBmcm9tIGdseWYgb3IgQ0ZGXG5cblxuICAgICAgaWYgKGJhc2VMYXllciA9PSBudWxsKSB7XG4gICAgICAgIHZhciBnID0gdGhpcy5fZm9udC5fZ2V0QmFzZUdseXBoKHRoaXMuaWQpO1xuXG4gICAgICAgIHZhciBjb2xvciA9IHtcbiAgICAgICAgICByZWQ6IDAsXG4gICAgICAgICAgZ3JlZW46IDAsXG4gICAgICAgICAgYmx1ZTogMCxcbiAgICAgICAgICBhbHBoYTogMjU1XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBbbmV3IENPTFJMYXllcihnLCBjb2xvcildO1xuICAgICAgfSAvLyBvdGhlcndpc2UsIHJldHVybiBhbiBhcnJheSBvZiBhbGwgdGhlIGxheWVyc1xuXG5cbiAgICAgIHZhciBsYXllcnMgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IGJhc2VMYXllci5maXJzdExheWVySW5kZXg7IGkgPCBiYXNlTGF5ZXIuZmlyc3RMYXllckluZGV4ICsgYmFzZUxheWVyLm51bUxheWVyczsgaSsrKSB7XG4gICAgICAgIHZhciByZWMgPSBjb2xyLmxheWVyUmVjb3Jkc1tpXTtcbiAgICAgICAgdmFyIGNvbG9yID0gY3BhbC5jb2xvclJlY29yZHNbcmVjLnBhbGV0dGVJbmRleF07XG5cbiAgICAgICAgdmFyIGcgPSB0aGlzLl9mb250Ll9nZXRCYXNlR2x5cGgocmVjLmdpZCk7XG5cbiAgICAgICAgbGF5ZXJzLnB1c2gobmV3IENPTFJMYXllcihnLCBjb2xvcikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGF5ZXJzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDT0xSR2x5cGg7XG59KEdseXBoKTtcblxudmFyIFRVUExFU19TSEFSRV9QT0lOVF9OVU1CRVJTID0gMHg4MDAwO1xudmFyIFRVUExFX0NPVU5UX01BU0sgPSAweDBmZmY7XG52YXIgRU1CRURERURfVFVQTEVfQ09PUkQgPSAweDgwMDA7XG52YXIgSU5URVJNRURJQVRFX1RVUExFID0gMHg0MDAwO1xudmFyIFBSSVZBVEVfUE9JTlRfTlVNQkVSUyA9IDB4MjAwMDtcbnZhciBUVVBMRV9JTkRFWF9NQVNLID0gMHgwZmZmO1xudmFyIFBPSU5UU19BUkVfV09SRFMgPSAweDgwO1xudmFyIFBPSU5UX1JVTl9DT1VOVF9NQVNLID0gMHg3ZjtcbnZhciBERUxUQVNfQVJFX1pFUk8gPSAweDgwO1xudmFyIERFTFRBU19BUkVfV09SRFMgPSAweDQwO1xudmFyIERFTFRBX1JVTl9DT1VOVF9NQVNLID0gMHgzZjtcbi8qKlxuICogVGhpcyBjbGFzcyBpcyB0cmFuc2Zvcm1zIFRydWVUeXBlIGdseXBocyBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgZnJvbVxuICogdGhlIEFwcGxlIEFkdmFuY2VkIFR5cG9ncmFwaHkgdmFyaWF0aW9uIHRhYmxlcyAoZnZhciwgZ3ZhciwgYW5kIGF2YXIpLlxuICogVGhlc2UgdGFibGVzIGFsbG93IGluZmluaXRlIGFkanVzdG1lbnRzIHRvIGdseXBoIHdlaWdodCwgd2lkdGgsIHNsYW50LFxuICogYW5kIG9wdGljYWwgc2l6ZSB3aXRob3V0IHRoZSBkZXNpZ25lciBuZWVkaW5nIHRvIHNwZWNpZnkgZXZlcnkgZXhhY3Qgc3R5bGUuXG4gKlxuICogQXBwbGUncyBkb2N1bWVudGF0aW9uIGZvciB0aGVzZSB0YWJsZXMgaXMgbm90IGdyZWF0LCBzbyB0aGFua3MgdG8gdGhlXG4gKiBGcmVldHlwZSBwcm9qZWN0IGZvciBmaWd1cmluZyBtdWNoIG9mIHRoaXMgb3V0LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIEdseXBoVmFyaWF0aW9uUHJvY2Vzc29yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gR2x5cGhWYXJpYXRpb25Qcm9jZXNzb3IoZm9udCwgY29vcmRzKSB7XG4gICAgdGhpcy5mb250ID0gZm9udDtcbiAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZHMgPSB0aGlzLm5vcm1hbGl6ZUNvb3Jkcyhjb29yZHMpO1xuICAgIHRoaXMuYmxlbmRWZWN0b3JzID0gbmV3IE1hcCgpO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEdseXBoVmFyaWF0aW9uUHJvY2Vzc29yLnByb3RvdHlwZTtcblxuICBfcHJvdG8ubm9ybWFsaXplQ29vcmRzID0gZnVuY3Rpb24gbm9ybWFsaXplQ29vcmRzKGNvb3Jkcykge1xuICAgIC8vIHRoZSBkZWZhdWx0IG1hcHBpbmcgaXMgbGluZWFyIGFsb25nIGVhY2ggYXhpcywgaW4gdHdvIHNlZ21lbnRzOlxuICAgIC8vIGZyb20gdGhlIG1pblZhbHVlIHRvIGRlZmF1bHRWYWx1ZSwgYW5kIGZyb20gZGVmYXVsdFZhbHVlIHRvIG1heFZhbHVlLlxuICAgIHZhciBub3JtYWxpemVkID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZm9udC5mdmFyLmF4aXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBheGlzID0gdGhpcy5mb250LmZ2YXIuYXhpc1tpXTtcblxuICAgICAgaWYgKGNvb3Jkc1tpXSA8IGF4aXMuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQucHVzaCgoY29vcmRzW2ldIC0gYXhpcy5kZWZhdWx0VmFsdWUgKyBOdW1iZXIuRVBTSUxPTikgLyAoYXhpcy5kZWZhdWx0VmFsdWUgLSBheGlzLm1pblZhbHVlICsgTnVtYmVyLkVQU0lMT04pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vcm1hbGl6ZWQucHVzaCgoY29vcmRzW2ldIC0gYXhpcy5kZWZhdWx0VmFsdWUgKyBOdW1iZXIuRVBTSUxPTikgLyAoYXhpcy5tYXhWYWx1ZSAtIGF4aXMuZGVmYXVsdFZhbHVlICsgTnVtYmVyLkVQU0lMT04pKTtcbiAgICAgIH1cbiAgICB9IC8vIGlmIHRoZXJlIGlzIGFuIGF2YXIgdGFibGUsIHRoZSBub3JtYWxpemVkIHZhbHVlIGlzIGNhbGN1bGF0ZWRcbiAgICAvLyBieSBpbnRlcnBvbGF0aW5nIGJldHdlZW4gdGhlIHR3byBuZWFyZXN0IG1hcHBlZCB2YWx1ZXMuXG5cblxuICAgIGlmICh0aGlzLmZvbnQuYXZhcikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZvbnQuYXZhci5zZWdtZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzZWdtZW50ID0gdGhpcy5mb250LmF2YXIuc2VnbWVudFtpXTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNlZ21lbnQuY29ycmVzcG9uZGVuY2UubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgcGFpciA9IHNlZ21lbnQuY29ycmVzcG9uZGVuY2Vbal07XG5cbiAgICAgICAgICBpZiAoaiA+PSAxICYmIG5vcm1hbGl6ZWRbaV0gPCBwYWlyLmZyb21Db29yZCkge1xuICAgICAgICAgICAgdmFyIHByZXYgPSBzZWdtZW50LmNvcnJlc3BvbmRlbmNlW2ogLSAxXTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRbaV0gPSAoKG5vcm1hbGl6ZWRbaV0gLSBwcmV2LmZyb21Db29yZCkgKiAocGFpci50b0Nvb3JkIC0gcHJldi50b0Nvb3JkKSArIE51bWJlci5FUFNJTE9OKSAvIChwYWlyLmZyb21Db29yZCAtIHByZXYuZnJvbUNvb3JkICsgTnVtYmVyLkVQU0lMT04pICsgcHJldi50b0Nvb3JkO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIH07XG5cbiAgX3Byb3RvLnRyYW5zZm9ybVBvaW50cyA9IGZ1bmN0aW9uIHRyYW5zZm9ybVBvaW50cyhnaWQsIGdseXBoUG9pbnRzKSB7XG4gICAgaWYgKCF0aGlzLmZvbnQuZnZhciB8fCAhdGhpcy5mb250Lmd2YXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZ3ZhciA9IHRoaXMuZm9udC5ndmFyO1xuXG4gICAgaWYgKGdpZCA+PSBndmFyLmdseXBoQ291bnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0ID0gZ3Zhci5vZmZzZXRzW2dpZF07XG5cbiAgICBpZiAob2Zmc2V0ID09PSBndmFyLm9mZnNldHNbZ2lkICsgMV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFJlYWQgdGhlIGd2YXIgZGF0YSBmb3IgdGhpcyBnbHlwaFxuXG5cbiAgICB2YXIgc3RyZWFtID0gdGhpcy5mb250LnN0cmVhbTtcbiAgICBzdHJlYW0ucG9zID0gb2Zmc2V0O1xuXG4gICAgaWYgKHN0cmVhbS5wb3MgPj0gc3RyZWFtLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0dXBsZUNvdW50ID0gc3RyZWFtLnJlYWRVSW50MTZCRSgpO1xuICAgIHZhciBvZmZzZXRUb0RhdGEgPSBvZmZzZXQgKyBzdHJlYW0ucmVhZFVJbnQxNkJFKCk7XG5cbiAgICBpZiAodHVwbGVDb3VudCAmIFRVUExFU19TSEFSRV9QT0lOVF9OVU1CRVJTKSB7XG4gICAgICB2YXIgaGVyZSA9IHN0cmVhbS5wb3M7XG4gICAgICBzdHJlYW0ucG9zID0gb2Zmc2V0VG9EYXRhO1xuICAgICAgdmFyIHNoYXJlZFBvaW50cyA9IHRoaXMuZGVjb2RlUG9pbnRzKCk7XG4gICAgICBvZmZzZXRUb0RhdGEgPSBzdHJlYW0ucG9zO1xuICAgICAgc3RyZWFtLnBvcyA9IGhlcmU7XG4gICAgfVxuXG4gICAgdmFyIG9yaWdQb2ludHMgPSBnbHlwaFBvaW50cy5tYXAoZnVuY3Rpb24gKHB0KSB7XG4gICAgICByZXR1cm4gcHQuY29weSgpO1xuICAgIH0pO1xuICAgIHR1cGxlQ291bnQgJj0gVFVQTEVfQ09VTlRfTUFTSztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHVwbGVDb3VudDsgaSsrKSB7XG4gICAgICB2YXIgdHVwbGVEYXRhU2l6ZSA9IHN0cmVhbS5yZWFkVUludDE2QkUoKTtcbiAgICAgIHZhciB0dXBsZUluZGV4ID0gc3RyZWFtLnJlYWRVSW50MTZCRSgpO1xuXG4gICAgICBpZiAodHVwbGVJbmRleCAmIEVNQkVEREVEX1RVUExFX0NPT1JEKSB7XG4gICAgICAgIHZhciB0dXBsZUNvb3JkcyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZ3Zhci5heGlzQ291bnQ7IGErKykge1xuICAgICAgICAgIHR1cGxlQ29vcmRzLnB1c2goc3RyZWFtLnJlYWRJbnQxNkJFKCkgLyAxNjM4NCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgodHVwbGVJbmRleCAmIFRVUExFX0lOREVYX01BU0spID49IGd2YXIuZ2xvYmFsQ29vcmRDb3VudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBndmFyIHRhYmxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdHVwbGVDb29yZHMgPSBndmFyLmdsb2JhbENvb3Jkc1t0dXBsZUluZGV4ICYgVFVQTEVfSU5ERVhfTUFTS107XG4gICAgICB9XG5cbiAgICAgIGlmICh0dXBsZUluZGV4ICYgSU5URVJNRURJQVRFX1RVUExFKSB7XG4gICAgICAgIHZhciBzdGFydENvb3JkcyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIF9hID0gMDsgX2EgPCBndmFyLmF4aXNDb3VudDsgX2ErKykge1xuICAgICAgICAgIHN0YXJ0Q29vcmRzLnB1c2goc3RyZWFtLnJlYWRJbnQxNkJFKCkgLyAxNjM4NCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW5kQ29vcmRzID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgX2EyID0gMDsgX2EyIDwgZ3Zhci5heGlzQ291bnQ7IF9hMisrKSB7XG4gICAgICAgICAgZW5kQ29vcmRzLnB1c2goc3RyZWFtLnJlYWRJbnQxNkJFKCkgLyAxNjM4NCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gR2V0IHRoZSBmYWN0b3IgYXQgd2hpY2ggdG8gYXBwbHkgdGhpcyB0dXBsZVxuXG5cbiAgICAgIHZhciBmYWN0b3IgPSB0aGlzLnR1cGxlRmFjdG9yKHR1cGxlSW5kZXgsIHR1cGxlQ29vcmRzLCBzdGFydENvb3JkcywgZW5kQ29vcmRzKTtcblxuICAgICAgaWYgKGZhY3RvciA9PT0gMCkge1xuICAgICAgICBvZmZzZXRUb0RhdGEgKz0gdHVwbGVEYXRhU2l6ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBoZXJlID0gc3RyZWFtLnBvcztcbiAgICAgIHN0cmVhbS5wb3MgPSBvZmZzZXRUb0RhdGE7XG5cbiAgICAgIGlmICh0dXBsZUluZGV4ICYgUFJJVkFURV9QT0lOVF9OVU1CRVJTKSB7XG4gICAgICAgIHZhciBwb2ludHMgPSB0aGlzLmRlY29kZVBvaW50cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHNoYXJlZFBvaW50cztcbiAgICAgIH0gLy8gcG9pbnRzLmxlbmd0aCA9IDAgbWVhbnMgdGhlcmUgYXJlIGRlbHRhcyBmb3IgYWxsIHBvaW50c1xuXG5cbiAgICAgIHZhciBuUG9pbnRzID0gcG9pbnRzLmxlbmd0aCA9PT0gMCA/IGdseXBoUG9pbnRzLmxlbmd0aCA6IHBvaW50cy5sZW5ndGg7XG4gICAgICB2YXIgeERlbHRhcyA9IHRoaXMuZGVjb2RlRGVsdGFzKG5Qb2ludHMpO1xuICAgICAgdmFyIHlEZWx0YXMgPSB0aGlzLmRlY29kZURlbHRhcyhuUG9pbnRzKTtcblxuICAgICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gYWxsIHBvaW50c1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZ2x5cGhQb2ludHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgdmFyIHBvaW50ID0gZ2x5cGhQb2ludHNbX2ldO1xuICAgICAgICAgIHBvaW50LnggKz0gTWF0aC5yb3VuZCh4RGVsdGFzW19pXSAqIGZhY3Rvcik7XG4gICAgICAgICAgcG9pbnQueSArPSBNYXRoLnJvdW5kKHlEZWx0YXNbX2ldICogZmFjdG9yKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG91dFBvaW50cyA9IG9yaWdQb2ludHMubWFwKGZ1bmN0aW9uIChwdCkge1xuICAgICAgICAgIHJldHVybiBwdC5jb3B5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgaGFzRGVsdGEgPSBnbHlwaFBvaW50cy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgcG9pbnRzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgICB2YXIgaWR4ID0gcG9pbnRzW19pMl07XG5cbiAgICAgICAgICBpZiAoaWR4IDwgZ2x5cGhQb2ludHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgX3BvaW50ID0gb3V0UG9pbnRzW2lkeF07XG4gICAgICAgICAgICBoYXNEZWx0YVtpZHhdID0gdHJ1ZTtcbiAgICAgICAgICAgIF9wb2ludC54ICs9IE1hdGgucm91bmQoeERlbHRhc1tfaTJdICogZmFjdG9yKTtcbiAgICAgICAgICAgIF9wb2ludC55ICs9IE1hdGgucm91bmQoeURlbHRhc1tfaTJdICogZmFjdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmludGVycG9sYXRlTWlzc2luZ0RlbHRhcyhvdXRQb2ludHMsIG9yaWdQb2ludHMsIGhhc0RlbHRhKTtcblxuICAgICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBnbHlwaFBvaW50cy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICAgICAgdmFyIGRlbHRhWCA9IG91dFBvaW50c1tfaTNdLnggLSBvcmlnUG9pbnRzW19pM10ueDtcbiAgICAgICAgICB2YXIgZGVsdGFZID0gb3V0UG9pbnRzW19pM10ueSAtIG9yaWdQb2ludHNbX2kzXS55O1xuICAgICAgICAgIGdseXBoUG9pbnRzW19pM10ueCArPSBkZWx0YVg7XG4gICAgICAgICAgZ2x5cGhQb2ludHNbX2kzXS55ICs9IGRlbHRhWTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvZmZzZXRUb0RhdGEgKz0gdHVwbGVEYXRhU2l6ZTtcbiAgICAgIHN0cmVhbS5wb3MgPSBoZXJlO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZGVjb2RlUG9pbnRzID0gZnVuY3Rpb24gZGVjb2RlUG9pbnRzKCkge1xuICAgIHZhciBzdHJlYW0gPSB0aGlzLmZvbnQuc3RyZWFtO1xuICAgIHZhciBjb3VudCA9IHN0cmVhbS5yZWFkVUludDgoKTtcblxuICAgIGlmIChjb3VudCAmIFBPSU5UU19BUkVfV09SRFMpIHtcbiAgICAgIGNvdW50ID0gKGNvdW50ICYgUE9JTlRfUlVOX0NPVU5UX01BU0spIDw8IDggfCBzdHJlYW0ucmVhZFVJbnQ4KCk7XG4gICAgfVxuXG4gICAgdmFyIHBvaW50cyA9IG5ldyBVaW50MTZBcnJheShjb3VudCk7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBwb2ludCA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGNvdW50KSB7XG4gICAgICB2YXIgcnVuID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuICAgICAgdmFyIHJ1bkNvdW50ID0gKHJ1biAmIFBPSU5UX1JVTl9DT1VOVF9NQVNLKSArIDE7XG4gICAgICB2YXIgZm4gPSBydW4gJiBQT0lOVFNfQVJFX1dPUkRTID8gc3RyZWFtLnJlYWRVSW50MTYgOiBzdHJlYW0ucmVhZFVJbnQ4O1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJ1bkNvdW50ICYmIGkgPCBjb3VudDsgaisrKSB7XG4gICAgICAgIHBvaW50ICs9IGZuLmNhbGwoc3RyZWFtKTtcbiAgICAgICAgcG9pbnRzW2krK10gPSBwb2ludDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9O1xuXG4gIF9wcm90by5kZWNvZGVEZWx0YXMgPSBmdW5jdGlvbiBkZWNvZGVEZWx0YXMoY291bnQpIHtcbiAgICB2YXIgc3RyZWFtID0gdGhpcy5mb250LnN0cmVhbTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGRlbHRhcyA9IG5ldyBJbnQxNkFycmF5KGNvdW50KTtcblxuICAgIHdoaWxlIChpIDwgY291bnQpIHtcbiAgICAgIHZhciBydW4gPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG4gICAgICB2YXIgcnVuQ291bnQgPSAocnVuICYgREVMVEFfUlVOX0NPVU5UX01BU0spICsgMTtcblxuICAgICAgaWYgKHJ1biAmIERFTFRBU19BUkVfWkVSTykge1xuICAgICAgICBpICs9IHJ1bkNvdW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGZuID0gcnVuICYgREVMVEFTX0FSRV9XT1JEUyA/IHN0cmVhbS5yZWFkSW50MTZCRSA6IHN0cmVhbS5yZWFkSW50ODtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJ1bkNvdW50ICYmIGkgPCBjb3VudDsgaisrKSB7XG4gICAgICAgICAgZGVsdGFzW2krK10gPSBmbi5jYWxsKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsdGFzO1xuICB9O1xuXG4gIF9wcm90by50dXBsZUZhY3RvciA9IGZ1bmN0aW9uIHR1cGxlRmFjdG9yKHR1cGxlSW5kZXgsIHR1cGxlQ29vcmRzLCBzdGFydENvb3JkcywgZW5kQ29vcmRzKSB7XG4gICAgdmFyIG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZWRDb29yZHM7XG4gICAgdmFyIGd2YXIgPSB0aGlzLmZvbnQuZ3ZhcjtcbiAgICB2YXIgZmFjdG9yID0gMTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3Zhci5heGlzQ291bnQ7IGkrKykge1xuICAgICAgaWYgKHR1cGxlQ29vcmRzW2ldID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9ybWFsaXplZFtpXSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCh0dXBsZUluZGV4ICYgSU5URVJNRURJQVRFX1RVUExFKSA9PT0gMCkge1xuICAgICAgICBpZiAobm9ybWFsaXplZFtpXSA8IE1hdGgubWluKDAsIHR1cGxlQ29vcmRzW2ldKSB8fCBub3JtYWxpemVkW2ldID4gTWF0aC5tYXgoMCwgdHVwbGVDb29yZHNbaV0pKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogbm9ybWFsaXplZFtpXSArIE51bWJlci5FUFNJTE9OKSAvICh0dXBsZUNvb3Jkc1tpXSArIE51bWJlci5FUFNJTE9OKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChub3JtYWxpemVkW2ldIDwgc3RhcnRDb29yZHNbaV0gfHwgbm9ybWFsaXplZFtpXSA+IGVuZENvb3Jkc1tpXSkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRbaV0gPCB0dXBsZUNvb3Jkc1tpXSkge1xuICAgICAgICAgIGZhY3RvciA9IGZhY3RvciAqIChub3JtYWxpemVkW2ldIC0gc3RhcnRDb29yZHNbaV0gKyBOdW1iZXIuRVBTSUxPTikgLyAodHVwbGVDb29yZHNbaV0gLSBzdGFydENvb3Jkc1tpXSArIE51bWJlci5FUFNJTE9OKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmYWN0b3IgPSBmYWN0b3IgKiAoZW5kQ29vcmRzW2ldIC0gbm9ybWFsaXplZFtpXSArIE51bWJlci5FUFNJTE9OKSAvIChlbmRDb29yZHNbaV0gLSB0dXBsZUNvb3Jkc1tpXSArIE51bWJlci5FUFNJTE9OKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWN0b3I7XG4gIH0gLy8gSW50ZXJwb2xhdGVzIHBvaW50cyB3aXRob3V0IGRlbHRhIHZhbHVlcy5cbiAgLy8gTmVlZGVkIGZvciB0aGUgw5ggYW5kIFEgZ2x5cGhzIGluIFNraWEuXG4gIC8vIEFsZ29yaXRobSBmcm9tIEZyZWV0eXBlLlxuICA7XG5cbiAgX3Byb3RvLmludGVycG9sYXRlTWlzc2luZ0RlbHRhcyA9IGZ1bmN0aW9uIGludGVycG9sYXRlTWlzc2luZ0RlbHRhcyhwb2ludHMsIGluUG9pbnRzLCBoYXNEZWx0YSkge1xuICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHBvaW50ID0gMDtcblxuICAgIHdoaWxlIChwb2ludCA8IHBvaW50cy5sZW5ndGgpIHtcbiAgICAgIHZhciBmaXJzdFBvaW50ID0gcG9pbnQ7IC8vIGZpbmQgdGhlIGVuZCBwb2ludCBvZiB0aGUgY29udG91clxuXG4gICAgICB2YXIgZW5kUG9pbnQgPSBwb2ludDtcbiAgICAgIHZhciBwdCA9IHBvaW50c1tlbmRQb2ludF07XG5cbiAgICAgIHdoaWxlICghcHQuZW5kQ29udG91cikge1xuICAgICAgICBwdCA9IHBvaW50c1srK2VuZFBvaW50XTtcbiAgICAgIH0gLy8gZmluZCB0aGUgZmlyc3QgcG9pbnQgdGhhdCBoYXMgYSBkZWx0YVxuXG5cbiAgICAgIHdoaWxlIChwb2ludCA8PSBlbmRQb2ludCAmJiAhaGFzRGVsdGFbcG9pbnRdKSB7XG4gICAgICAgIHBvaW50Kys7XG4gICAgICB9XG5cbiAgICAgIGlmIChwb2ludCA+IGVuZFBvaW50KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmlyc3REZWx0YSA9IHBvaW50O1xuICAgICAgdmFyIGN1ckRlbHRhID0gcG9pbnQ7XG4gICAgICBwb2ludCsrO1xuXG4gICAgICB3aGlsZSAocG9pbnQgPD0gZW5kUG9pbnQpIHtcbiAgICAgICAgLy8gZmluZCB0aGUgbmV4dCBwb2ludCB3aXRoIGEgZGVsdGEsIGFuZCBpbnRlcnBvbGF0ZSBpbnRlcm1lZGlhdGUgcG9pbnRzXG4gICAgICAgIGlmIChoYXNEZWx0YVtwb2ludF0pIHtcbiAgICAgICAgICB0aGlzLmRlbHRhSW50ZXJwb2xhdGUoY3VyRGVsdGEgKyAxLCBwb2ludCAtIDEsIGN1ckRlbHRhLCBwb2ludCwgaW5Qb2ludHMsIHBvaW50cyk7XG4gICAgICAgICAgY3VyRGVsdGEgPSBwb2ludDtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvaW50Kys7XG4gICAgICB9IC8vIHNoaWZ0IGNvbnRvdXIgaWYgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGRlbHRhXG5cblxuICAgICAgaWYgKGN1ckRlbHRhID09PSBmaXJzdERlbHRhKSB7XG4gICAgICAgIHRoaXMuZGVsdGFTaGlmdChmaXJzdFBvaW50LCBlbmRQb2ludCwgY3VyRGVsdGEsIGluUG9pbnRzLCBwb2ludHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBoYW5kbGUgdGhlIHJlbWFpbmluZyBwb2ludHMgYXQgdGhlIGVuZCBhbmQgYmVnaW5uaW5nIG9mIHRoZSBjb250b3VyXG4gICAgICAgIHRoaXMuZGVsdGFJbnRlcnBvbGF0ZShjdXJEZWx0YSArIDEsIGVuZFBvaW50LCBjdXJEZWx0YSwgZmlyc3REZWx0YSwgaW5Qb2ludHMsIHBvaW50cyk7XG5cbiAgICAgICAgaWYgKGZpcnN0RGVsdGEgPiAwKSB7XG4gICAgICAgICAgdGhpcy5kZWx0YUludGVycG9sYXRlKGZpcnN0UG9pbnQsIGZpcnN0RGVsdGEgLSAxLCBjdXJEZWx0YSwgZmlyc3REZWx0YSwgaW5Qb2ludHMsIHBvaW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcG9pbnQgPSBlbmRQb2ludCArIDE7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5kZWx0YUludGVycG9sYXRlID0gZnVuY3Rpb24gZGVsdGFJbnRlcnBvbGF0ZShwMSwgcDIsIHJlZjEsIHJlZjIsIGluUG9pbnRzLCBvdXRQb2ludHMpIHtcbiAgICBpZiAocDEgPiBwMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpdGVyYWJsZSA9IFsneCcsICd5J107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgayA9IGl0ZXJhYmxlW2ldO1xuXG4gICAgICBpZiAoaW5Qb2ludHNbcmVmMV1ba10gPiBpblBvaW50c1tyZWYyXVtrXSkge1xuICAgICAgICB2YXIgcCA9IHJlZjE7XG4gICAgICAgIHJlZjEgPSByZWYyO1xuICAgICAgICByZWYyID0gcDtcbiAgICAgIH1cblxuICAgICAgdmFyIGluMSA9IGluUG9pbnRzW3JlZjFdW2tdO1xuICAgICAgdmFyIGluMiA9IGluUG9pbnRzW3JlZjJdW2tdO1xuICAgICAgdmFyIG91dDEgPSBvdXRQb2ludHNbcmVmMV1ba107XG4gICAgICB2YXIgb3V0MiA9IG91dFBvaW50c1tyZWYyXVtrXTsgLy8gSWYgdGhlIHJlZmVyZW5jZSBwb2ludHMgaGF2ZSB0aGUgc2FtZSBjb29yZGluYXRlIGJ1dCBkaWZmZXJlbnRcbiAgICAgIC8vIGRlbHRhLCBpbmZlcnJlZCBkZWx0YSBpcyB6ZXJvLiAgT3RoZXJ3aXNlIGludGVycG9sYXRlLlxuXG4gICAgICBpZiAoaW4xICE9PSBpbjIgfHwgb3V0MSA9PT0gb3V0Mikge1xuICAgICAgICB2YXIgc2NhbGUgPSBpbjEgPT09IGluMiA/IDAgOiAob3V0MiAtIG91dDEpIC8gKGluMiAtIGluMSk7XG5cbiAgICAgICAgZm9yICh2YXIgX3AgPSBwMTsgX3AgPD0gcDI7IF9wKyspIHtcbiAgICAgICAgICB2YXIgb3V0ID0gaW5Qb2ludHNbX3BdW2tdO1xuXG4gICAgICAgICAgaWYgKG91dCA8PSBpbjEpIHtcbiAgICAgICAgICAgIG91dCArPSBvdXQxIC0gaW4xO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3V0ID49IGluMikge1xuICAgICAgICAgICAgb3V0ICs9IG91dDIgLSBpbjI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCA9IG91dDEgKyAob3V0IC0gaW4xKSAqIHNjYWxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG91dFBvaW50c1tfcF1ba10gPSBvdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmRlbHRhU2hpZnQgPSBmdW5jdGlvbiBkZWx0YVNoaWZ0KHAxLCBwMiwgcmVmLCBpblBvaW50cywgb3V0UG9pbnRzKSB7XG4gICAgdmFyIGRlbHRhWCA9IG91dFBvaW50c1tyZWZdLnggLSBpblBvaW50c1tyZWZdLng7XG4gICAgdmFyIGRlbHRhWSA9IG91dFBvaW50c1tyZWZdLnkgLSBpblBvaW50c1tyZWZdLnk7XG5cbiAgICBpZiAoZGVsdGFYID09PSAwICYmIGRlbHRhWSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAodmFyIHAgPSBwMTsgcCA8PSBwMjsgcCsrKSB7XG4gICAgICBpZiAocCAhPT0gcmVmKSB7XG4gICAgICAgIG91dFBvaW50c1twXS54ICs9IGRlbHRhWDtcbiAgICAgICAgb3V0UG9pbnRzW3BdLnkgKz0gZGVsdGFZO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZ2V0QWR2YW5jZUFkanVzdG1lbnQgPSBmdW5jdGlvbiBnZXRBZHZhbmNlQWRqdXN0bWVudChnaWQsIHRhYmxlKSB7XG4gICAgdmFyIG91dGVySW5kZXgsIGlubmVySW5kZXg7XG5cbiAgICBpZiAodGFibGUuYWR2YW5jZVdpZHRoTWFwcGluZykge1xuICAgICAgdmFyIGlkeCA9IGdpZDtcblxuICAgICAgaWYgKGlkeCA+PSB0YWJsZS5hZHZhbmNlV2lkdGhNYXBwaW5nLm1hcENvdW50KSB7XG4gICAgICAgIGlkeCA9IHRhYmxlLmFkdmFuY2VXaWR0aE1hcHBpbmcubWFwQ291bnQgLSAxO1xuICAgICAgfVxuXG4gICAgICB2YXIgZW50cnlGb3JtYXQgPSB0YWJsZS5hZHZhbmNlV2lkdGhNYXBwaW5nLmVudHJ5Rm9ybWF0O1xuICAgICAgdmFyIF90YWJsZSRhZHZhbmNlV2lkdGhNYSA9IHRhYmxlLmFkdmFuY2VXaWR0aE1hcHBpbmcubWFwRGF0YVtpZHhdO1xuICAgICAgb3V0ZXJJbmRleCA9IF90YWJsZSRhZHZhbmNlV2lkdGhNYS5vdXRlckluZGV4O1xuICAgICAgaW5uZXJJbmRleCA9IF90YWJsZSRhZHZhbmNlV2lkdGhNYS5pbm5lckluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRlckluZGV4ID0gMDtcbiAgICAgIGlubmVySW5kZXggPSBnaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVsdGEodGFibGUuaXRlbVZhcmlhdGlvblN0b3JlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KTtcbiAgfSAvLyBTZWUgcHNldWRvIGNvZGUgZnJvbSBgRm9udCBWYXJpYXRpb25zIE92ZXJ2aWV3J1xuICAvLyBpbiB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi5cbiAgO1xuXG4gIF9wcm90by5nZXREZWx0YSA9IGZ1bmN0aW9uIGdldERlbHRhKGl0ZW1TdG9yZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCkge1xuICAgIGlmIChvdXRlckluZGV4ID49IGl0ZW1TdG9yZS5pdGVtVmFyaWF0aW9uRGF0YS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHZhciB2YXJEYXRhID0gaXRlbVN0b3JlLml0ZW1WYXJpYXRpb25EYXRhW291dGVySW5kZXhdO1xuXG4gICAgaWYgKGlubmVySW5kZXggPj0gdmFyRGF0YS5kZWx0YVNldHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICB2YXIgZGVsdGFTZXQgPSB2YXJEYXRhLmRlbHRhU2V0c1tpbm5lckluZGV4XTtcbiAgICB2YXIgYmxlbmRWZWN0b3IgPSB0aGlzLmdldEJsZW5kVmVjdG9yKGl0ZW1TdG9yZSwgb3V0ZXJJbmRleCk7XG4gICAgdmFyIG5ldEFkanVzdG1lbnQgPSAwO1xuXG4gICAgZm9yICh2YXIgbWFzdGVyID0gMDsgbWFzdGVyIDwgdmFyRGF0YS5yZWdpb25JbmRleENvdW50OyBtYXN0ZXIrKykge1xuICAgICAgbmV0QWRqdXN0bWVudCArPSBkZWx0YVNldC5kZWx0YXNbbWFzdGVyXSAqIGJsZW5kVmVjdG9yW21hc3Rlcl07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldEFkanVzdG1lbnQ7XG4gIH07XG5cbiAgX3Byb3RvLmdldEJsZW5kVmVjdG9yID0gZnVuY3Rpb24gZ2V0QmxlbmRWZWN0b3IoaXRlbVN0b3JlLCBvdXRlckluZGV4KSB7XG4gICAgdmFyIHZhckRhdGEgPSBpdGVtU3RvcmUuaXRlbVZhcmlhdGlvbkRhdGFbb3V0ZXJJbmRleF07XG5cbiAgICBpZiAodGhpcy5ibGVuZFZlY3RvcnMuaGFzKHZhckRhdGEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibGVuZFZlY3RvcnMuZ2V0KHZhckRhdGEpO1xuICAgIH1cblxuICAgIHZhciBub3JtYWxpemVkQ29vcmRzID0gdGhpcy5ub3JtYWxpemVkQ29vcmRzO1xuICAgIHZhciBibGVuZFZlY3RvciA9IFtdOyAvLyBvdXRlciBsb29wIHN0ZXBzIHRocm91Z2ggbWFzdGVyIGRlc2lnbnMgdG8gYmUgYmxlbmRlZFxuXG4gICAgZm9yICh2YXIgbWFzdGVyID0gMDsgbWFzdGVyIDwgdmFyRGF0YS5yZWdpb25JbmRleENvdW50OyBtYXN0ZXIrKykge1xuICAgICAgdmFyIHNjYWxhciA9IDE7XG4gICAgICB2YXIgcmVnaW9uSW5kZXggPSB2YXJEYXRhLnJlZ2lvbkluZGV4ZXNbbWFzdGVyXTtcbiAgICAgIHZhciBheGVzID0gaXRlbVN0b3JlLnZhcmlhdGlvblJlZ2lvbkxpc3QudmFyaWF0aW9uUmVnaW9uc1tyZWdpb25JbmRleF07IC8vIGlubmVyIGxvb3Agc3RlcHMgdGhyb3VnaCBheGVzIGluIHRoaXMgcmVnaW9uXG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXhlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgYXhpcyA9IGF4ZXNbal07XG4gICAgICAgIHZhciBheGlzU2NhbGFyID0gdm9pZCAwOyAvLyBjb21wdXRlIHRoZSBzY2FsYXIgY29udHJpYnV0aW9uIG9mIHRoaXMgYXhpc1xuICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZXNcblxuICAgICAgICBpZiAoYXhpcy5zdGFydENvb3JkID4gYXhpcy5wZWFrQ29vcmQgfHwgYXhpcy5wZWFrQ29vcmQgPiBheGlzLmVuZENvb3JkKSB7XG4gICAgICAgICAgYXhpc1NjYWxhciA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoYXhpcy5zdGFydENvb3JkIDwgMCAmJiBheGlzLmVuZENvb3JkID4gMCAmJiBheGlzLnBlYWtDb29yZCAhPT0gMCkge1xuICAgICAgICAgIGF4aXNTY2FsYXIgPSAxOyAvLyBwZWFrIG9mIDAgbWVhbnMgaWdub3JlIHRoaXMgYXhpc1xuICAgICAgICB9IGVsc2UgaWYgKGF4aXMucGVha0Nvb3JkID09PSAwKSB7XG4gICAgICAgICAgYXhpc1NjYWxhciA9IDE7IC8vIGlnbm9yZSB0aGlzIHJlZ2lvbiBpZiBjb29yZHMgYXJlIG91dCBvZiByYW5nZVxuICAgICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRDb29yZHNbal0gPCBheGlzLnN0YXJ0Q29vcmQgfHwgbm9ybWFsaXplZENvb3Jkc1tqXSA+IGF4aXMuZW5kQ29vcmQpIHtcbiAgICAgICAgICBheGlzU2NhbGFyID0gMDsgLy8gY2FsY3VsYXRlIGEgcHJvcG9ydGlvbmFsIGZhY3RvclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChub3JtYWxpemVkQ29vcmRzW2pdID09PSBheGlzLnBlYWtDb29yZCkge1xuICAgICAgICAgICAgYXhpc1NjYWxhciA9IDE7XG4gICAgICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkQ29vcmRzW2pdIDwgYXhpcy5wZWFrQ29vcmQpIHtcbiAgICAgICAgICAgIGF4aXNTY2FsYXIgPSAobm9ybWFsaXplZENvb3Jkc1tqXSAtIGF4aXMuc3RhcnRDb29yZCArIE51bWJlci5FUFNJTE9OKSAvIChheGlzLnBlYWtDb29yZCAtIGF4aXMuc3RhcnRDb29yZCArIE51bWJlci5FUFNJTE9OKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXhpc1NjYWxhciA9IChheGlzLmVuZENvb3JkIC0gbm9ybWFsaXplZENvb3Jkc1tqXSArIE51bWJlci5FUFNJTE9OKSAvIChheGlzLmVuZENvb3JkIC0gYXhpcy5wZWFrQ29vcmQgKyBOdW1iZXIuRVBTSUxPTik7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIHRha2UgcHJvZHVjdCBvZiBhbGwgdGhlIGF4aXMgc2NhbGFyc1xuXG5cbiAgICAgICAgc2NhbGFyICo9IGF4aXNTY2FsYXI7XG4gICAgICB9XG5cbiAgICAgIGJsZW5kVmVjdG9yW21hc3Rlcl0gPSBzY2FsYXI7XG4gICAgfVxuXG4gICAgdGhpcy5ibGVuZFZlY3RvcnMuc2V0KHZhckRhdGEsIGJsZW5kVmVjdG9yKTtcbiAgICByZXR1cm4gYmxlbmRWZWN0b3I7XG4gIH07XG5cbiAgcmV0dXJuIEdseXBoVmFyaWF0aW9uUHJvY2Vzc29yO1xufSgpO1xuXG52YXIgY2xvbmVfMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgdmFyIGNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENsb25lcyAoY29waWVzKSBhbiBPYmplY3QgdXNpbmcgZGVlcCBjb3B5aW5nLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGRlZmF1bHQsIGJ1dCBpZiB5b3UgYXJlIGNlcnRhaW5cbiAgICAgKiB0aGVyZSBhcmUgbm8gY2lyY3VsYXIgcmVmZXJlbmNlcyBpbiB5b3VyIG9iamVjdCwgeW91IGNhbiBzYXZlIHNvbWUgQ1BVIHRpbWVcbiAgICAgKiBieSBjYWxsaW5nIGNsb25lKG9iaiwgZmFsc2UpLlxuICAgICAqXG4gICAgICogQ2F1dGlvbjogaWYgYGNpcmN1bGFyYCBpcyBmYWxzZSBhbmQgYHBhcmVudGAgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlcyxcbiAgICAgKiB5b3VyIHByb2dyYW0gbWF5IGVudGVyIGFuIGluZmluaXRlIGxvb3AgYW5kIGNyYXNoLlxuICAgICAqXG4gICAgICogQHBhcmFtIGBwYXJlbnRgIC0gdGhlIG9iamVjdCB0byBiZSBjbG9uZWRcbiAgICAgKiBAcGFyYW0gYGNpcmN1bGFyYCAtIHNldCB0byB0cnVlIGlmIHRoZSBvYmplY3QgdG8gYmUgY2xvbmVkIG1heSBjb250YWluXG4gICAgICogICAgY2lyY3VsYXIgcmVmZXJlbmNlcy4gKG9wdGlvbmFsIC0gdHJ1ZSBieSBkZWZhdWx0KVxuICAgICAqIEBwYXJhbSBgZGVwdGhgIC0gc2V0IHRvIGEgbnVtYmVyIGlmIHRoZSBvYmplY3QgaXMgb25seSB0byBiZSBjbG9uZWQgdG9cbiAgICAgKiAgICBhIHBhcnRpY3VsYXIgZGVwdGguIChvcHRpb25hbCAtIGRlZmF1bHRzIHRvIEluZmluaXR5KVxuICAgICAqIEBwYXJhbSBgcHJvdG90eXBlYCAtIHNldHMgdGhlIHByb3RvdHlwZSB0byBiZSB1c2VkIHdoZW4gY2xvbmluZyBhbiBvYmplY3QuXG4gICAgICogICAgKG9wdGlvbmFsIC0gZGVmYXVsdHMgdG8gcGFyZW50IHByb3RvdHlwZSkuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGNsb25lKHBhcmVudCwgY2lyY3VsYXIsIGRlcHRoLCBwcm90b3R5cGUpIHtcbiAgICAgIHZhciBmaWx0ZXI7XG5cbiAgICAgIGlmICh0eXBlb2YgY2lyY3VsYXIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGRlcHRoID0gY2lyY3VsYXIuZGVwdGg7XG4gICAgICAgIHByb3RvdHlwZSA9IGNpcmN1bGFyLnByb3RvdHlwZTtcbiAgICAgICAgZmlsdGVyID0gY2lyY3VsYXIuZmlsdGVyO1xuICAgICAgICBjaXJjdWxhciA9IGNpcmN1bGFyLmNpcmN1bGFyO1xuICAgICAgfSAvLyBtYWludGFpbiB0d28gYXJyYXlzIGZvciBjaXJjdWxhciByZWZlcmVuY2VzLCB3aGVyZSBjb3JyZXNwb25kaW5nIHBhcmVudHNcbiAgICAgIC8vIGFuZCBjaGlsZHJlbiBoYXZlIHRoZSBzYW1lIGluZGV4XG5cblxuICAgICAgdmFyIGFsbFBhcmVudHMgPSBbXTtcbiAgICAgIHZhciBhbGxDaGlsZHJlbiA9IFtdO1xuICAgICAgdmFyIHVzZUJ1ZmZlciA9IHR5cGVvZiBidWZmZXJfMSAhPSAndW5kZWZpbmVkJztcbiAgICAgIGlmICh0eXBlb2YgY2lyY3VsYXIgPT0gJ3VuZGVmaW5lZCcpIGNpcmN1bGFyID0gdHJ1ZTtcbiAgICAgIGlmICh0eXBlb2YgZGVwdGggPT0gJ3VuZGVmaW5lZCcpIGRlcHRoID0gSW5maW5pdHk7IC8vIHJlY3Vyc2UgdGhpcyBmdW5jdGlvbiBzbyB3ZSBkb24ndCByZXNldCBhbGxQYXJlbnRzIGFuZCBhbGxDaGlsZHJlblxuXG4gICAgICBmdW5jdGlvbiBfY2xvbmUocGFyZW50LCBkZXB0aCkge1xuICAgICAgICAvLyBjbG9uaW5nIG51bGwgYWx3YXlzIHJldHVybnMgbnVsbFxuICAgICAgICBpZiAocGFyZW50ID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGRlcHRoID09IDApIHJldHVybiBwYXJlbnQ7XG4gICAgICAgIHZhciBjaGlsZDtcbiAgICAgICAgdmFyIHByb3RvO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcGFyZW50ICE9ICdvYmplY3QnKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbG9uZS5fX2lzQXJyYXkocGFyZW50KSkge1xuICAgICAgICAgIGNoaWxkID0gW107XG4gICAgICAgIH0gZWxzZSBpZiAoY2xvbmUuX19pc1JlZ0V4cChwYXJlbnQpKSB7XG4gICAgICAgICAgY2hpbGQgPSBuZXcgUmVnRXhwKHBhcmVudC5zb3VyY2UsIF9fZ2V0UmVnRXhwRmxhZ3MocGFyZW50KSk7XG4gICAgICAgICAgaWYgKHBhcmVudC5sYXN0SW5kZXgpIGNoaWxkLmxhc3RJbmRleCA9IHBhcmVudC5sYXN0SW5kZXg7XG4gICAgICAgIH0gZWxzZSBpZiAoY2xvbmUuX19pc0RhdGUocGFyZW50KSkge1xuICAgICAgICAgIGNoaWxkID0gbmV3IERhdGUocGFyZW50LmdldFRpbWUoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodXNlQnVmZmVyICYmIGJ1ZmZlcl8xLmlzQnVmZmVyKHBhcmVudCkpIHtcbiAgICAgICAgICBpZiAoYnVmZmVyXzEuYWxsb2NVbnNhZmUpIHtcbiAgICAgICAgICAgIC8vIE5vZGUuanMgPj0gNC41LjBcbiAgICAgICAgICAgIGNoaWxkID0gYnVmZmVyXzEuYWxsb2NVbnNhZmUocGFyZW50Lmxlbmd0aCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9sZGVyIE5vZGUuanMgdmVyc2lvbnNcbiAgICAgICAgICAgIGNoaWxkID0gbmV3IGJ1ZmZlcl8xKHBhcmVudC5sZW5ndGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudC5jb3B5KGNoaWxkKTtcbiAgICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwcm90b3R5cGUgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBhcmVudCk7XG4gICAgICAgICAgICBjaGlsZCA9IE9iamVjdC5jcmVhdGUocHJvdG8pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGlsZCA9IE9iamVjdC5jcmVhdGUocHJvdG90eXBlKTtcbiAgICAgICAgICAgIHByb3RvID0gcHJvdG90eXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaXJjdWxhcikge1xuICAgICAgICAgIHZhciBpbmRleCA9IGFsbFBhcmVudHMuaW5kZXhPZihwYXJlbnQpO1xuXG4gICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsQ2hpbGRyZW5baW5kZXhdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFsbFBhcmVudHMucHVzaChwYXJlbnQpO1xuICAgICAgICAgIGFsbENoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSBpbiBwYXJlbnQpIHtcbiAgICAgICAgICB2YXIgYXR0cnM7XG5cbiAgICAgICAgICBpZiAocHJvdG8pIHtcbiAgICAgICAgICAgIGF0dHJzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgaSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGF0dHJzICYmIGF0dHJzLnNldCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGlsZFtpXSA9IF9jbG9uZShwYXJlbnRbaV0sIGRlcHRoIC0gMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfY2xvbmUocGFyZW50LCBkZXB0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBsZSBmbGF0IGNsb25lIHVzaW5nIHByb3RvdHlwZSwgYWNjZXB0cyBvbmx5IG9iamVjdHMsIHVzZWZ1bGwgZm9yIHByb3BlcnR5XG4gICAgICogb3ZlcnJpZGUgb24gRkxBVCBjb25maWd1cmF0aW9uIG9iamVjdCAobm8gbmVzdGVkIHByb3BzKS5cbiAgICAgKlxuICAgICAqIFVTRSBXSVRIIENBVVRJT04hIFRoaXMgbWF5IG5vdCBiZWhhdmUgYXMgeW91IHdpc2ggaWYgeW91IGRvIG5vdCBrbm93IGhvdyB0aGlzXG4gICAgICogd29ya3MuXG4gICAgICovXG5cblxuICAgIGNsb25lLmNsb25lUHJvdG90eXBlID0gZnVuY3Rpb24gY2xvbmVQcm90b3R5cGUocGFyZW50KSB7XG4gICAgICBpZiAocGFyZW50ID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgdmFyIGMgPSBmdW5jdGlvbiBjKCkge307XG5cbiAgICAgIGMucHJvdG90eXBlID0gcGFyZW50O1xuICAgICAgcmV0dXJuIG5ldyBjKCk7XG4gICAgfTsgLy8gcHJpdmF0ZSB1dGlsaXR5IGZ1bmN0aW9uc1xuXG5cbiAgICBmdW5jdGlvbiBfX29ialRvU3RyKG8pIHtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG4gICAgfVxuICAgIGNsb25lLl9fb2JqVG9TdHIgPSBfX29ialRvU3RyO1xuXG4gICAgZnVuY3Rpb24gX19pc0RhdGUobykge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJiBfX29ialRvU3RyKG8pID09PSAnW29iamVjdCBEYXRlXSc7XG4gICAgfVxuICAgIGNsb25lLl9faXNEYXRlID0gX19pc0RhdGU7XG5cbiAgICBmdW5jdGlvbiBfX2lzQXJyYXkobykge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJiBfX29ialRvU3RyKG8pID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgIH1cbiAgICBjbG9uZS5fX2lzQXJyYXkgPSBfX2lzQXJyYXk7XG5cbiAgICBmdW5jdGlvbiBfX2lzUmVnRXhwKG8pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgX19vYmpUb1N0cihvKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG4gICAgfVxuICAgIGNsb25lLl9faXNSZWdFeHAgPSBfX2lzUmVnRXhwO1xuXG4gICAgZnVuY3Rpb24gX19nZXRSZWdFeHBGbGFncyhyZSkge1xuICAgICAgdmFyIGZsYWdzID0gJyc7XG4gICAgICBpZiAocmUuZ2xvYmFsKSBmbGFncyArPSAnZyc7XG4gICAgICBpZiAocmUuaWdub3JlQ2FzZSkgZmxhZ3MgKz0gJ2knO1xuICAgICAgaWYgKHJlLm11bHRpbGluZSkgZmxhZ3MgKz0gJ20nO1xuICAgICAgcmV0dXJuIGZsYWdzO1xuICAgIH1cbiAgICBjbG9uZS5fX2dldFJlZ0V4cEZsYWdzID0gX19nZXRSZWdFeHBGbGFncztcbiAgICByZXR1cm4gY2xvbmU7XG4gIH0oKTtcblxuICBpZiAoIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBjbG9uZTtcbiAgfVxufSk7XG5cbnZhciBTdWJzZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdWJzZXQoZm9udCkge1xuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgdGhpcy5nbHlwaHMgPSBbXTtcbiAgICB0aGlzLm1hcHBpbmcgPSB7fTsgLy8gYWx3YXlzIGluY2x1ZGUgdGhlIG1pc3NpbmcgZ2x5cGhcblxuICAgIHRoaXMuaW5jbHVkZUdseXBoKDApO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFN1YnNldC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmluY2x1ZGVHbHlwaCA9IGZ1bmN0aW9uIGluY2x1ZGVHbHlwaChnbHlwaCkge1xuICAgIGlmICh0eXBlb2YgZ2x5cGggPT09ICdvYmplY3QnKSB7XG4gICAgICBnbHlwaCA9IGdseXBoLmlkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1hcHBpbmdbZ2x5cGhdID09IG51bGwpIHtcbiAgICAgIHRoaXMuZ2x5cGhzLnB1c2goZ2x5cGgpO1xuICAgICAgdGhpcy5tYXBwaW5nW2dseXBoXSA9IHRoaXMuZ2x5cGhzLmxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwcGluZ1tnbHlwaF07XG4gIH07XG5cbiAgX3Byb3RvLmVuY29kZVN0cmVhbSA9IGZ1bmN0aW9uIGVuY29kZVN0cmVhbSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIHMgPSBuZXcgcmVzdHJ1Y3R1cmUuRW5jb2RlU3RyZWFtKCk7XG4gICAgbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuZW5jb2RlKHMpO1xuXG4gICAgICByZXR1cm4gcy5lbmQoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcztcbiAgfTtcblxuICByZXR1cm4gU3Vic2V0O1xufSgpO1xuXG52YXIgT05fQ1VSVkUkMSA9IDEgPDwgMDtcbnZhciBYX1NIT1JUX1ZFQ1RPUiQxID0gMSA8PCAxO1xudmFyIFlfU0hPUlRfVkVDVE9SJDEgPSAxIDw8IDI7XG52YXIgUkVQRUFUJDEgPSAxIDw8IDM7XG52YXIgU0FNRV9YJDEgPSAxIDw8IDQ7XG52YXIgU0FNRV9ZJDEgPSAxIDw8IDU7XG5cbnZhciBQb2ludCQxID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUG9pbnQoKSB7fVxuXG4gIFBvaW50LnNpemUgPSBmdW5jdGlvbiBzaXplKHZhbCkge1xuICAgIHJldHVybiB2YWwgPj0gMCAmJiB2YWwgPD0gMjU1ID8gMSA6IDI7XG4gIH07XG5cbiAgUG9pbnQuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0cmVhbSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAyNTUpIHtcbiAgICAgIHN0cmVhbS53cml0ZVVJbnQ4KHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLndyaXRlSW50MTZCRSh2YWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBQb2ludDtcbn0oKTtcblxudmFyIEdseWYgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbnVtYmVyT2ZDb250b3VyczogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIGlmIG5lZ2F0aXZlLCB0aGlzIGlzIGEgY29tcG9zaXRlIGdseXBoXG4gIHhNaW46IHJlc3RydWN0dXJlLmludDE2LFxuICB5TWluOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgeE1heDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHlNYXg6IHJlc3RydWN0dXJlLmludDE2LFxuICBlbmRQdHNPZkNvbnRvdXJzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnbnVtYmVyT2ZDb250b3VycycpLFxuICBpbnN0cnVjdGlvbnM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgcmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgZmxhZ3M6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgMCksXG4gIHhQb2ludHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShQb2ludCQxLCAwKSxcbiAgeVBvaW50czogbmV3IHJlc3RydWN0dXJlLkFycmF5KFBvaW50JDEsIDApXG59KTtcbi8qKlxuICogRW5jb2RlcyBUcnVlVHlwZSBnbHlwaCBvdXRsaW5lc1xuICovXG5cbnZhciBUVEZHbHlwaEVuY29kZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUVEZHbHlwaEVuY29kZXIoKSB7fVxuXG4gIHZhciBfcHJvdG8gPSBUVEZHbHlwaEVuY29kZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5lbmNvZGVTaW1wbGUgPSBmdW5jdGlvbiBlbmNvZGVTaW1wbGUocGF0aCwgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgaWYgKGluc3RydWN0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBpbnN0cnVjdGlvbnMgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgZW5kUHRzT2ZDb250b3VycyA9IFtdO1xuICAgIHZhciB4UG9pbnRzID0gW107XG4gICAgdmFyIHlQb2ludHMgPSBbXTtcbiAgICB2YXIgZmxhZ3MgPSBbXTtcbiAgICB2YXIgc2FtZSA9IDA7XG4gICAgdmFyIGxhc3RYID0gMCxcbiAgICAgICAgbGFzdFkgPSAwLFxuICAgICAgICBsYXN0RmxhZyA9IDA7XG4gICAgdmFyIHBvaW50Q291bnQgPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHBhdGguY29tbWFuZHNbaV07XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYy5hcmdzLmxlbmd0aDsgaiArPSAyKSB7XG4gICAgICAgIHZhciB4ID0gYy5hcmdzW2pdO1xuICAgICAgICB2YXIgeSA9IGMuYXJnc1tqICsgMV07XG4gICAgICAgIHZhciBmbGFnID0gMDsgLy8gSWYgdGhlIGVuZGluZyBwb2ludCBvZiBhIHF1YWRyYXRpYyBjdXJ2ZSBpcyB0aGUgbWlkcG9pbnRcbiAgICAgICAgLy8gYmV0d2VlbiB0aGUgY29udHJvbCBwb2ludCBhbmQgdGhlIGNvbnRyb2wgcG9pbnQgb2YgdGhlIG5leHRcbiAgICAgICAgLy8gcXVhZHJhdGljIGN1cnZlLCB3ZSBjYW4gb21pdCB0aGUgZW5kaW5nIHBvaW50LlxuXG4gICAgICAgIGlmIChjLmNvbW1hbmQgPT09ICdxdWFkcmF0aWNDdXJ2ZVRvJyAmJiBqID09PSAyKSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBwYXRoLmNvbW1hbmRzW2kgKyAxXTtcblxuICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQuY29tbWFuZCA9PT0gJ3F1YWRyYXRpY0N1cnZlVG8nKSB7XG4gICAgICAgICAgICB2YXIgbWlkWCA9IChsYXN0WCArIG5leHQuYXJnc1swXSkgLyAyO1xuICAgICAgICAgICAgdmFyIG1pZFkgPSAobGFzdFkgKyBuZXh0LmFyZ3NbMV0pIC8gMjtcblxuICAgICAgICAgICAgaWYgKHggPT09IG1pZFggJiYgeSA9PT0gbWlkWSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gQWxsIHBvaW50cyBleGNlcHQgY29udHJvbCBwb2ludHMgYXJlIG9uIGN1cnZlLlxuXG5cbiAgICAgICAgaWYgKCEoYy5jb21tYW5kID09PSAncXVhZHJhdGljQ3VydmVUbycgJiYgaiA9PT0gMCkpIHtcbiAgICAgICAgICBmbGFnIHw9IE9OX0NVUlZFJDE7XG4gICAgICAgIH1cblxuICAgICAgICBmbGFnID0gdGhpcy5fZW5jb2RlUG9pbnQoeCwgbGFzdFgsIHhQb2ludHMsIGZsYWcsIFhfU0hPUlRfVkVDVE9SJDEsIFNBTUVfWCQxKTtcbiAgICAgICAgZmxhZyA9IHRoaXMuX2VuY29kZVBvaW50KHksIGxhc3RZLCB5UG9pbnRzLCBmbGFnLCBZX1NIT1JUX1ZFQ1RPUiQxLCBTQU1FX1kkMSk7XG5cbiAgICAgICAgaWYgKGZsYWcgPT09IGxhc3RGbGFnICYmIHNhbWUgPCAyNTUpIHtcbiAgICAgICAgICBmbGFnc1tmbGFncy5sZW5ndGggLSAxXSB8PSBSRVBFQVQkMTtcbiAgICAgICAgICBzYW1lKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNhbWUgPiAwKSB7XG4gICAgICAgICAgICBmbGFncy5wdXNoKHNhbWUpO1xuICAgICAgICAgICAgc2FtZSA9IDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmxhZ3MucHVzaChmbGFnKTtcbiAgICAgICAgICBsYXN0RmxhZyA9IGZsYWc7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0WCA9IHg7XG4gICAgICAgIGxhc3RZID0geTtcbiAgICAgICAgcG9pbnRDb3VudCsrO1xuICAgICAgfVxuXG4gICAgICBpZiAoYy5jb21tYW5kID09PSAnY2xvc2VQYXRoJykge1xuICAgICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2gocG9pbnRDb3VudCAtIDEpO1xuICAgICAgfVxuICAgIH0gLy8gQ2xvc2UgdGhlIHBhdGggaWYgdGhlIGxhc3QgY29tbWFuZCBkaWRuJ3QgYWxyZWFkeVxuXG5cbiAgICBpZiAocGF0aC5jb21tYW5kcy5sZW5ndGggPiAxICYmIHBhdGguY29tbWFuZHNbcGF0aC5jb21tYW5kcy5sZW5ndGggLSAxXS5jb21tYW5kICE9PSAnY2xvc2VQYXRoJykge1xuICAgICAgZW5kUHRzT2ZDb250b3Vycy5wdXNoKHBvaW50Q291bnQgLSAxKTtcbiAgICB9XG5cbiAgICB2YXIgYmJveCA9IHBhdGguYmJveDtcbiAgICB2YXIgZ2x5ZiA9IHtcbiAgICAgIG51bWJlck9mQ29udG91cnM6IGVuZFB0c09mQ29udG91cnMubGVuZ3RoLFxuICAgICAgeE1pbjogYmJveC5taW5YLFxuICAgICAgeU1pbjogYmJveC5taW5ZLFxuICAgICAgeE1heDogYmJveC5tYXhYLFxuICAgICAgeU1heDogYmJveC5tYXhZLFxuICAgICAgZW5kUHRzT2ZDb250b3VyczogZW5kUHRzT2ZDb250b3VycyxcbiAgICAgIGluc3RydWN0aW9uczogaW5zdHJ1Y3Rpb25zLFxuICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgeFBvaW50czogeFBvaW50cyxcbiAgICAgIHlQb2ludHM6IHlQb2ludHNcbiAgICB9O1xuICAgIHZhciBzaXplID0gR2x5Zi5zaXplKGdseWYpO1xuICAgIHZhciB0YWlsID0gNCAtIHNpemUgJSA0O1xuICAgIHZhciBzdHJlYW0gPSBuZXcgcmVzdHJ1Y3R1cmUuRW5jb2RlU3RyZWFtKHNpemUgKyB0YWlsKTtcbiAgICBHbHlmLmVuY29kZShzdHJlYW0sIGdseWYpOyAvLyBBbGlnbiB0byA0LWJ5dGUgbGVuZ3RoXG5cbiAgICBpZiAodGFpbCAhPT0gMCkge1xuICAgICAgc3RyZWFtLmZpbGwoMCwgdGFpbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmVhbS5idWZmZXI7XG4gIH07XG5cbiAgX3Byb3RvLl9lbmNvZGVQb2ludCA9IGZ1bmN0aW9uIF9lbmNvZGVQb2ludCh2YWx1ZSwgbGFzdCwgcG9pbnRzLCBmbGFnLCBzaG9ydEZsYWcsIHNhbWVGbGFnKSB7XG4gICAgdmFyIGRpZmYgPSB2YWx1ZSAtIGxhc3Q7XG5cbiAgICBpZiAodmFsdWUgPT09IGxhc3QpIHtcbiAgICAgIGZsYWcgfD0gc2FtZUZsYWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgtMjU1IDw9IGRpZmYgJiYgZGlmZiA8PSAyNTUpIHtcbiAgICAgICAgZmxhZyB8PSBzaG9ydEZsYWc7XG5cbiAgICAgICAgaWYgKGRpZmYgPCAwKSB7XG4gICAgICAgICAgZGlmZiA9IC1kaWZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZsYWcgfD0gc2FtZUZsYWc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcG9pbnRzLnB1c2goZGlmZik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYWc7XG4gIH07XG5cbiAgcmV0dXJuIFRURkdseXBoRW5jb2Rlcjtcbn0oKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRvKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRvKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRvKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkbyhvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JG8obywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRvKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSRkKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgVFRGU3Vic2V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfU3Vic2V0KSB7XG4gIF9pbmhlcml0c0xvb3NlJGQoVFRGU3Vic2V0LCBfU3Vic2V0KTtcblxuICBmdW5jdGlvbiBUVEZTdWJzZXQoZm9udCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1N1YnNldC5jYWxsKHRoaXMsIGZvbnQpIHx8IHRoaXM7XG4gICAgX3RoaXMuZ2x5cGhFbmNvZGVyID0gbmV3IFRURkdseXBoRW5jb2RlcigpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBUVEZTdWJzZXQucHJvdG90eXBlO1xuXG4gIF9wcm90by5fYWRkR2x5cGggPSBmdW5jdGlvbiBfYWRkR2x5cGgoZ2lkKSB7XG4gICAgdmFyIGdseXBoID0gdGhpcy5mb250LmdldEdseXBoKGdpZCk7XG5cbiAgICB2YXIgZ2x5ZiA9IGdseXBoLl9kZWNvZGUoKTsgLy8gZ2V0IHRoZSBvZmZzZXQgdG8gdGhlIGdseXBoIGZyb20gdGhlIGxvY2EgdGFibGVcblxuXG4gICAgdmFyIGN1ck9mZnNldCA9IHRoaXMuZm9udC5sb2NhLm9mZnNldHNbZ2lkXTtcbiAgICB2YXIgbmV4dE9mZnNldCA9IHRoaXMuZm9udC5sb2NhLm9mZnNldHNbZ2lkICsgMV07XG5cbiAgICB2YXIgc3RyZWFtID0gdGhpcy5mb250Ll9nZXRUYWJsZVN0cmVhbSgnZ2x5ZicpO1xuXG4gICAgc3RyZWFtLnBvcyArPSBjdXJPZmZzZXQ7XG4gICAgdmFyIGJ1ZmZlciA9IHN0cmVhbS5yZWFkQnVmZmVyKG5leHRPZmZzZXQgLSBjdXJPZmZzZXQpOyAvLyBpZiBpdCBpcyBhIGNvbXBvdW5kIGdseXBoLCBpbmNsdWRlIGl0cyBjb21wb25lbnRzXG5cbiAgICBpZiAoZ2x5ZiAmJiBnbHlmLm51bWJlck9mQ29udG91cnMgPCAwKSB7XG4gICAgICBidWZmZXIgPSBuZXcgYnVmZmVyXzEoYnVmZmVyKTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRvKGdseWYuY29tcG9uZW50cyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgZ2lkID0gdGhpcy5pbmNsdWRlR2x5cGgoY29tcG9uZW50LmdseXBoSUQpO1xuICAgICAgICBidWZmZXIud3JpdGVVSW50MTZCRShnaWQsIGNvbXBvbmVudC5wb3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZ2x5ZiAmJiB0aGlzLmZvbnQuX3ZhcmlhdGlvblByb2Nlc3Nvcikge1xuICAgICAgLy8gSWYgdGhpcyBpcyBhIFRydWVUeXBlIHZhcmlhdGlvbiBnbHlwaCwgcmUtZW5jb2RlIHRoZSBwYXRoXG4gICAgICBidWZmZXIgPSB0aGlzLmdseXBoRW5jb2Rlci5lbmNvZGVTaW1wbGUoZ2x5cGgucGF0aCwgZ2x5Zi5pbnN0cnVjdGlvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuZ2x5Zi5wdXNoKGJ1ZmZlcik7XG4gICAgdGhpcy5sb2NhLm9mZnNldHMucHVzaCh0aGlzLm9mZnNldCk7XG4gICAgdGhpcy5obXR4Lm1ldHJpY3MucHVzaCh7XG4gICAgICBhZHZhbmNlOiBnbHlwaC5hZHZhbmNlV2lkdGgsXG4gICAgICBiZWFyaW5nOiBnbHlwaC5fZ2V0TWV0cmljcygpLmxlZnRCZWFyaW5nXG4gICAgfSk7XG4gICAgdGhpcy5vZmZzZXQgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy5nbHlmLmxlbmd0aCAtIDE7XG4gIH07XG5cbiAgX3Byb3RvLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHJlYW0pIHtcbiAgICAvLyB0YWJsZXMgcmVxdWlyZWQgYnkgUERGIHNwZWM6XG4gICAgLy8gICBoZWFkLCBoaGVhLCBsb2NhLCBtYXhwLCBjdnQgLCBwcmVwLCBnbHlmLCBobXR4LCBmcGdtXG4gICAgLy9cbiAgICAvLyBhZGRpdGlvbmFsIHRhYmxlcyByZXF1aXJlZCBmb3Igc3RhbmRhbG9uZSBmb250czpcbiAgICAvLyAgIG5hbWUsIGNtYXAsIE9TLzIsIHBvc3RcbiAgICB0aGlzLmdseWYgPSBbXTtcbiAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgdGhpcy5sb2NhID0ge1xuICAgICAgb2Zmc2V0czogW11cbiAgICB9O1xuICAgIHRoaXMuaG10eCA9IHtcbiAgICAgIG1ldHJpY3M6IFtdLFxuICAgICAgYmVhcmluZ3M6IFtdXG4gICAgfTsgLy8gaW5jbHVkZSBhbGwgdGhlIGdseXBoc1xuICAgIC8vIG5vdCB1c2luZyBhIGZvciBsb29wIGJlY2F1c2Ugd2UgbmVlZCB0byBzdXBwb3J0IGFkZGluZyBtb3JlXG4gICAgLy8gZ2x5cGhzIHRvIHRoZSBhcnJheSBhcyB3ZSBnbywgYW5kIENvZmZlZVNjcmlwdCBjYWNoZXMgdGhlIGxlbmd0aC5cblxuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgdGhpcy5nbHlwaHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9hZGRHbHlwaCh0aGlzLmdseXBoc1tpKytdKTtcbiAgICB9XG5cbiAgICB2YXIgbWF4cCA9IGNsb25lXzEodGhpcy5mb250Lm1heHApO1xuICAgIG1heHAubnVtR2x5cGhzID0gdGhpcy5nbHlmLmxlbmd0aDtcbiAgICB0aGlzLmxvY2Eub2Zmc2V0cy5wdXNoKHRoaXMub2Zmc2V0KTtcbiAgICB0YWJsZXMubG9jYS5wcmVFbmNvZGUuY2FsbCh0aGlzLmxvY2EpO1xuICAgIHZhciBoZWFkID0gY2xvbmVfMSh0aGlzLmZvbnQuaGVhZCk7XG4gICAgaGVhZC5pbmRleFRvTG9jRm9ybWF0ID0gdGhpcy5sb2NhLnZlcnNpb247XG4gICAgdmFyIGhoZWEgPSBjbG9uZV8xKHRoaXMuZm9udC5oaGVhKTtcbiAgICBoaGVhLm51bWJlck9mTWV0cmljcyA9IHRoaXMuaG10eC5tZXRyaWNzLmxlbmd0aDsgLy8gbWFwID0gW11cbiAgICAvLyBmb3IgaW5kZXggaW4gWzAuLi4yNTZdXG4gICAgLy8gICAgIGlmIGluZGV4IDwgQG51bUdseXBoc1xuICAgIC8vICAgICAgICAgbWFwW2luZGV4XSA9IGluZGV4XG4gICAgLy8gICAgIGVsc2VcbiAgICAvLyAgICAgICAgIG1hcFtpbmRleF0gPSAwXG4gICAgLy9cbiAgICAvLyBjbWFwVGFibGUgPVxuICAgIC8vICAgICB2ZXJzaW9uOiAwXG4gICAgLy8gICAgIGxlbmd0aDogMjYyXG4gICAgLy8gICAgIGxhbmd1YWdlOiAwXG4gICAgLy8gICAgIGNvZGVNYXA6IG1hcFxuICAgIC8vXG4gICAgLy8gY21hcCA9XG4gICAgLy8gICAgIHZlcnNpb246IDBcbiAgICAvLyAgICAgbnVtU3VidGFibGVzOiAxXG4gICAgLy8gICAgIHRhYmxlczogW1xuICAgIC8vICAgICAgICAgcGxhdGZvcm1JRDogMVxuICAgIC8vICAgICAgICAgZW5jb2RpbmdJRDogMFxuICAgIC8vICAgICAgICAgdGFibGU6IGNtYXBUYWJsZVxuICAgIC8vICAgICBdXG4gICAgLy8gVE9ETzogc3Vic2V0IHByZXAsIGN2dCwgZnBnbT9cblxuICAgIERpcmVjdG9yeS5lbmNvZGUoc3RyZWFtLCB7XG4gICAgICB0YWJsZXM6IHtcbiAgICAgICAgaGVhZDogaGVhZCxcbiAgICAgICAgaGhlYTogaGhlYSxcbiAgICAgICAgbG9jYTogdGhpcy5sb2NhLFxuICAgICAgICBtYXhwOiBtYXhwLFxuICAgICAgICAnY3Z0ICc6IHRoaXMuZm9udFsnY3Z0ICddLFxuICAgICAgICBwcmVwOiB0aGlzLmZvbnQucHJlcCxcbiAgICAgICAgZ2x5ZjogdGhpcy5nbHlmLFxuICAgICAgICBobXR4OiB0aGlzLmhtdHgsXG4gICAgICAgIGZwZ206IHRoaXMuZm9udC5mcGdtIC8vIG5hbWU6IGNsb25lIEBmb250Lm5hbWVcbiAgICAgICAgLy8gJ09TLzInOiBjbG9uZSBAZm9udFsnT1MvMiddXG4gICAgICAgIC8vIHBvc3Q6IGNsb25lIEBmb250LnBvc3RcbiAgICAgICAgLy8gY21hcDogY21hcFxuXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFRURlN1YnNldDtcbn0oU3Vic2V0KTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRwKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRwKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRwKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkcChvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JHAobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRwKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSRlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgQ0ZGU3Vic2V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfU3Vic2V0KSB7XG4gIF9pbmhlcml0c0xvb3NlJGUoQ0ZGU3Vic2V0LCBfU3Vic2V0KTtcblxuICBmdW5jdGlvbiBDRkZTdWJzZXQoZm9udCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1N1YnNldC5jYWxsKHRoaXMsIGZvbnQpIHx8IHRoaXM7XG4gICAgX3RoaXMuY2ZmID0gX3RoaXMuZm9udFsnQ0ZGICddO1xuXG4gICAgaWYgKCFfdGhpcy5jZmYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgQ0ZGIEZvbnQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQ0ZGU3Vic2V0LnByb3RvdHlwZTtcblxuICBfcHJvdG8uc3Vic2V0Q2hhcnN0cmluZ3MgPSBmdW5jdGlvbiBzdWJzZXRDaGFyc3RyaW5ncygpIHtcbiAgICB0aGlzLmNoYXJzdHJpbmdzID0gW107XG4gICAgdmFyIGdzdWJycyA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRwKHRoaXMuZ2x5cGhzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBnaWQgPSBfc3RlcC52YWx1ZTtcbiAgICAgIHRoaXMuY2hhcnN0cmluZ3MucHVzaCh0aGlzLmNmZi5nZXRDaGFyU3RyaW5nKGdpZCkpO1xuICAgICAgdmFyIGdseXBoID0gdGhpcy5mb250LmdldEdseXBoKGdpZCk7XG4gICAgICB2YXIgcGF0aCA9IGdseXBoLnBhdGg7IC8vIHRoaXMgY2F1c2VzIHRoZSBnbHlwaCB0byBiZSBwYXJzZWRcblxuICAgICAgZm9yICh2YXIgc3ViciBpbiBnbHlwaC5fdXNlZEdzdWJycykge1xuICAgICAgICBnc3VicnNbc3Vicl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZ3N1YnJzID0gdGhpcy5zdWJzZXRTdWJycyh0aGlzLmNmZi5nbG9iYWxTdWJySW5kZXgsIGdzdWJycyk7XG4gIH07XG5cbiAgX3Byb3RvLnN1YnNldFN1YnJzID0gZnVuY3Rpb24gc3Vic2V0U3VicnMoc3VicnMsIHVzZWQpIHtcbiAgICB2YXIgcmVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YnJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3ViciA9IHN1YnJzW2ldO1xuXG4gICAgICBpZiAodXNlZFtpXSkge1xuICAgICAgICB0aGlzLmNmZi5zdHJlYW0ucG9zID0gc3Vici5vZmZzZXQ7XG4gICAgICAgIHJlcy5wdXNoKHRoaXMuY2ZmLnN0cmVhbS5yZWFkQnVmZmVyKHN1YnIubGVuZ3RoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXMucHVzaChuZXcgYnVmZmVyXzEoWzExXSkpOyAvLyByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIF9wcm90by5zdWJzZXRGb250ZGljdCA9IGZ1bmN0aW9uIHN1YnNldEZvbnRkaWN0KHRvcERpY3QpIHtcbiAgICB0b3BEaWN0LkZEQXJyYXkgPSBbXTtcbiAgICB0b3BEaWN0LkZEU2VsZWN0ID0ge1xuICAgICAgdmVyc2lvbjogMCxcbiAgICAgIGZkczogW11cbiAgICB9O1xuICAgIHZhciB1c2VkX2ZkcyA9IHt9O1xuICAgIHZhciB1c2VkX3N1YnJzID0gW107XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRwKHRoaXMuZ2x5cGhzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgIHZhciBnaWQgPSBfc3RlcDIudmFsdWU7XG4gICAgICB2YXIgZmQgPSB0aGlzLmNmZi5mZEZvckdseXBoKGdpZCk7XG5cbiAgICAgIGlmIChmZCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVzZWRfZmRzW2ZkXSkge1xuICAgICAgICB0b3BEaWN0LkZEQXJyYXkucHVzaChPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNmZi50b3BEaWN0LkZEQXJyYXlbZmRdKSk7XG4gICAgICAgIHVzZWRfc3VicnMucHVzaCh7fSk7XG4gICAgICB9XG5cbiAgICAgIHVzZWRfZmRzW2ZkXSA9IHRydWU7XG4gICAgICB0b3BEaWN0LkZEU2VsZWN0LmZkcy5wdXNoKHRvcERpY3QuRkRBcnJheS5sZW5ndGggLSAxKTtcbiAgICAgIHZhciBnbHlwaCA9IHRoaXMuZm9udC5nZXRHbHlwaChnaWQpO1xuICAgICAgdmFyIHBhdGggPSBnbHlwaC5wYXRoOyAvLyB0aGlzIGNhdXNlcyB0aGUgZ2x5cGggdG8gYmUgcGFyc2VkXG5cbiAgICAgIGZvciAodmFyIHN1YnIgaW4gZ2x5cGguX3VzZWRTdWJycykge1xuICAgICAgICB1c2VkX3N1YnJzW3VzZWRfc3VicnMubGVuZ3RoIC0gMV1bc3Vicl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9wRGljdC5GREFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGljdCA9IHRvcERpY3QuRkRBcnJheVtpXTtcbiAgICAgIGRlbGV0ZSBkaWN0LkZvbnROYW1lO1xuXG4gICAgICBpZiAoZGljdC5Qcml2YXRlICYmIGRpY3QuUHJpdmF0ZS5TdWJycykge1xuICAgICAgICBkaWN0LlByaXZhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBkaWN0LlByaXZhdGUpO1xuICAgICAgICBkaWN0LlByaXZhdGUuU3VicnMgPSB0aGlzLnN1YnNldFN1YnJzKGRpY3QuUHJpdmF0ZS5TdWJycywgdXNlZF9zdWJyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9O1xuXG4gIF9wcm90by5jcmVhdGVDSURGb250ZGljdCA9IGZ1bmN0aW9uIGNyZWF0ZUNJREZvbnRkaWN0KHRvcERpY3QpIHtcbiAgICB2YXIgdXNlZF9zdWJycyA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkcCh0aGlzLmdseXBocyksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgZ2lkID0gX3N0ZXAzLnZhbHVlO1xuICAgICAgdmFyIGdseXBoID0gdGhpcy5mb250LmdldEdseXBoKGdpZCk7XG4gICAgICB2YXIgcGF0aCA9IGdseXBoLnBhdGg7IC8vIHRoaXMgY2F1c2VzIHRoZSBnbHlwaCB0byBiZSBwYXJzZWRcblxuICAgICAgZm9yICh2YXIgc3ViciBpbiBnbHlwaC5fdXNlZFN1YnJzKSB7XG4gICAgICAgIHVzZWRfc3VicnNbc3Vicl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcml2YXRlRGljdCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2ZmLnRvcERpY3QuUHJpdmF0ZSk7XG5cbiAgICBpZiAodGhpcy5jZmYudG9wRGljdC5Qcml2YXRlICYmIHRoaXMuY2ZmLnRvcERpY3QuUHJpdmF0ZS5TdWJycykge1xuICAgICAgcHJpdmF0ZURpY3QuU3VicnMgPSB0aGlzLnN1YnNldFN1YnJzKHRoaXMuY2ZmLnRvcERpY3QuUHJpdmF0ZS5TdWJycywgdXNlZF9zdWJycyk7XG4gICAgfVxuXG4gICAgdG9wRGljdC5GREFycmF5ID0gW3tcbiAgICAgIFByaXZhdGU6IHByaXZhdGVEaWN0XG4gICAgfV07XG4gICAgcmV0dXJuIHRvcERpY3QuRkRTZWxlY3QgPSB7XG4gICAgICB2ZXJzaW9uOiAzLFxuICAgICAgblJhbmdlczogMSxcbiAgICAgIHJhbmdlczogW3tcbiAgICAgICAgZmlyc3Q6IDAsXG4gICAgICAgIGZkOiAwXG4gICAgICB9XSxcbiAgICAgIHNlbnRpbmVsOiB0aGlzLmNoYXJzdHJpbmdzLmxlbmd0aFxuICAgIH07XG4gIH07XG5cbiAgX3Byb3RvLmFkZFN0cmluZyA9IGZ1bmN0aW9uIGFkZFN0cmluZyhzdHJpbmcpIHtcbiAgICBpZiAoIXN0cmluZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0cmluZ3MpIHtcbiAgICAgIHRoaXMuc3RyaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMuc3RyaW5ncy5wdXNoKHN0cmluZyk7XG4gICAgcmV0dXJuIHN0YW5kYXJkU3RyaW5ncy5sZW5ndGggKyB0aGlzLnN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgfTtcblxuICBfcHJvdG8uZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0cmVhbSkge1xuICAgIHRoaXMuc3Vic2V0Q2hhcnN0cmluZ3MoKTtcbiAgICB2YXIgY2hhcnNldCA9IHtcbiAgICAgIHZlcnNpb246IHRoaXMuY2hhcnN0cmluZ3MubGVuZ3RoID4gMjU1ID8gMiA6IDEsXG4gICAgICByYW5nZXM6IFt7XG4gICAgICAgIGZpcnN0OiAxLFxuICAgICAgICBuTGVmdDogdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGggLSAyXG4gICAgICB9XVxuICAgIH07XG4gICAgdmFyIHRvcERpY3QgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNmZi50b3BEaWN0KTtcbiAgICB0b3BEaWN0LlByaXZhdGUgPSBudWxsO1xuICAgIHRvcERpY3QuY2hhcnNldCA9IGNoYXJzZXQ7XG4gICAgdG9wRGljdC5FbmNvZGluZyA9IG51bGw7XG4gICAgdG9wRGljdC5DaGFyU3RyaW5ncyA9IHRoaXMuY2hhcnN0cmluZ3M7XG5cbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hcnIgPSBbJ3ZlcnNpb24nLCAnTm90aWNlJywgJ0NvcHlyaWdodCcsICdGdWxsTmFtZScsICdGYW1pbHlOYW1lJywgJ1dlaWdodCcsICdQb3N0U2NyaXB0JywgJ0Jhc2VGb250TmFtZScsICdGb250TmFtZSddOyBfaSA8IF9hcnIubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIga2V5ID0gX2FycltfaV07XG4gICAgICB0b3BEaWN0W2tleV0gPSB0aGlzLmFkZFN0cmluZyh0aGlzLmNmZi5zdHJpbmcodG9wRGljdFtrZXldKSk7XG4gICAgfVxuXG4gICAgdG9wRGljdC5ST1MgPSBbdGhpcy5hZGRTdHJpbmcoJ0Fkb2JlJyksIHRoaXMuYWRkU3RyaW5nKCdJZGVudGl0eScpLCAwXTtcbiAgICB0b3BEaWN0LkNJRENvdW50ID0gdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGg7XG5cbiAgICBpZiAodGhpcy5jZmYuaXNDSURGb250KSB7XG4gICAgICB0aGlzLnN1YnNldEZvbnRkaWN0KHRvcERpY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZUNJREZvbnRkaWN0KHRvcERpY3QpO1xuICAgIH1cblxuICAgIHZhciB0b3AgPSB7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgaGRyU2l6ZTogdGhpcy5jZmYuaGRyU2l6ZSxcbiAgICAgIG9mZlNpemU6IHRoaXMuY2ZmLmxlbmd0aCxcbiAgICAgIGhlYWRlcjogdGhpcy5jZmYuaGVhZGVyLFxuICAgICAgbmFtZUluZGV4OiBbdGhpcy5jZmYucG9zdHNjcmlwdE5hbWVdLFxuICAgICAgdG9wRGljdEluZGV4OiBbdG9wRGljdF0sXG4gICAgICBzdHJpbmdJbmRleDogdGhpcy5zdHJpbmdzLFxuICAgICAgZ2xvYmFsU3VickluZGV4OiB0aGlzLmdzdWJyc1xuICAgIH07XG4gICAgQ0ZGVG9wLmVuY29kZShzdHJlYW0sIHRvcCk7XG4gIH07XG5cbiAgcmV0dXJuIENGRlN1YnNldDtcbn0oU3Vic2V0KTtcblxudmFyIF9jbGFzcyQ0O1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHEobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JHEobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JHEobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRxKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkcShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JHEoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDgodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MkOChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDgoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ4KENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDQodGFyZ2V0LCBwcm9wZXJ0eSwgZGVjb3JhdG9ycywgZGVzY3JpcHRvciwgY29udGV4dCkgeyB2YXIgZGVzYyA9IHt9OyBPYmplY3Qua2V5cyhkZXNjcmlwdG9yKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgZGVzY1trZXldID0gZGVzY3JpcHRvcltrZXldOyB9KTsgZGVzYy5lbnVtZXJhYmxlID0gISFkZXNjLmVudW1lcmFibGU7IGRlc2MuY29uZmlndXJhYmxlID0gISFkZXNjLmNvbmZpZ3VyYWJsZTsgaWYgKCd2YWx1ZScgaW4gZGVzYyB8fCBkZXNjLmluaXRpYWxpemVyKSB7IGRlc2Mud3JpdGFibGUgPSB0cnVlOyB9IGRlc2MgPSBkZWNvcmF0b3JzLnNsaWNlKCkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoZGVzYywgZGVjb3JhdG9yKSB7IHJldHVybiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYykgfHwgZGVzYzsgfSwgZGVzYyk7IGlmIChjb250ZXh0ICYmIGRlc2MuaW5pdGlhbGl6ZXIgIT09IHZvaWQgMCkgeyBkZXNjLnZhbHVlID0gZGVzYy5pbml0aWFsaXplciA/IGRlc2MuaW5pdGlhbGl6ZXIuY2FsbChjb250ZXh0KSA6IHZvaWQgMDsgZGVzYy5pbml0aWFsaXplciA9IHVuZGVmaW5lZDsgfSBpZiAoZGVzYy5pbml0aWFsaXplciA9PT0gdm9pZCAwKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjKTsgZGVzYyA9IG51bGw7IH0gcmV0dXJuIGRlc2M7IH1cbi8qKlxuICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIFNGTlQtYmFzZWQgZm9udCBmb3JtYXRzIGluIGZvbnRraXQuXG4gKiBJdCBzdXBwb3J0cyBUcnVlVHlwZSwgYW5kIFBvc3RTY3JpcHQgZ2x5cGhzLCBhbmQgc2V2ZXJhbCBjb2xvciBnbHlwaCBmb3JtYXRzLlxuICovXG5cbnZhciBUVEZGb250ID0gKF9jbGFzcyQ0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgVFRGRm9udC5wcm9iZSA9IGZ1bmN0aW9uIHByb2JlKGJ1ZmZlcikge1xuICAgIHZhciBmb3JtYXQgPSBidWZmZXIudG9TdHJpbmcoJ2FzY2lpJywgMCwgNCk7XG4gICAgcmV0dXJuIGZvcm1hdCA9PT0gJ3RydWUnIHx8IGZvcm1hdCA9PT0gJ09UVE8nIHx8IGZvcm1hdCA9PT0gU3RyaW5nLmZyb21DaGFyQ29kZSgwLCAxLCAwLCAwKTtcbiAgfTtcblxuICBmdW5jdGlvbiBUVEZGb250KHN0cmVhbSwgdmFyaWF0aW9uQ29vcmRzKSB7XG4gICAgaWYgKHZhcmlhdGlvbkNvb3JkcyA9PT0gdm9pZCAwKSB7XG4gICAgICB2YXJpYXRpb25Db29yZHMgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMudmFyaWF0aW9uQ29vcmRzID0gdmFyaWF0aW9uQ29vcmRzO1xuICAgIHRoaXMuX2RpcmVjdG9yeVBvcyA9IHRoaXMuc3RyZWFtLnBvcztcbiAgICB0aGlzLl90YWJsZXMgPSB7fTtcbiAgICB0aGlzLl9nbHlwaHMgPSB7fTtcblxuICAgIHRoaXMuX2RlY29kZURpcmVjdG9yeSgpOyAvLyBkZWZpbmUgcHJvcGVydGllcyBmb3IgZWFjaCB0YWJsZSB0byBsYXppbHkgcGFyc2VcblxuXG4gICAgZm9yICh2YXIgdGFnIGluIHRoaXMuZGlyZWN0b3J5LnRhYmxlcykge1xuICAgICAgdmFyIHRhYmxlID0gdGhpcy5kaXJlY3RvcnkudGFibGVzW3RhZ107XG5cbiAgICAgIGlmICh0YWJsZXNbdGFnXSAmJiB0YWJsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB0YWcsIHtcbiAgICAgICAgICBnZXQ6IHRoaXMuX2dldFRhYmxlLmJpbmQodGhpcywgdGFibGUpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBUVEZGb250LnByb3RvdHlwZTtcblxuICBfcHJvdG8uX2dldFRhYmxlID0gZnVuY3Rpb24gX2dldFRhYmxlKHRhYmxlKSB7XG4gICAgaWYgKCEodGFibGUudGFnIGluIHRoaXMuX3RhYmxlcykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3RhYmxlc1t0YWJsZS50YWddID0gdGhpcy5fZGVjb2RlVGFibGUodGFibGUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZm9udGtpdC5sb2dFcnJvcnMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZGVjb2RpbmcgdGFibGUgXCIgKyB0YWJsZS50YWcpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGFibGVzW3RhYmxlLnRhZ107XG4gIH07XG5cbiAgX3Byb3RvLl9nZXRUYWJsZVN0cmVhbSA9IGZ1bmN0aW9uIF9nZXRUYWJsZVN0cmVhbSh0YWcpIHtcbiAgICB2YXIgdGFibGUgPSB0aGlzLmRpcmVjdG9yeS50YWJsZXNbdGFnXTtcblxuICAgIGlmICh0YWJsZSkge1xuICAgICAgdGhpcy5zdHJlYW0ucG9zID0gdGFibGUub2Zmc2V0O1xuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9wcm90by5fZGVjb2RlRGlyZWN0b3J5ID0gZnVuY3Rpb24gX2RlY29kZURpcmVjdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXJlY3RvcnkgPSBEaXJlY3RvcnkuZGVjb2RlKHRoaXMuc3RyZWFtLCB7XG4gICAgICBfc3RhcnRPZmZzZXQ6IDBcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uX2RlY29kZVRhYmxlID0gZnVuY3Rpb24gX2RlY29kZVRhYmxlKHRhYmxlKSB7XG4gICAgdmFyIHBvcyA9IHRoaXMuc3RyZWFtLnBvcztcblxuICAgIHZhciBzdHJlYW0gPSB0aGlzLl9nZXRUYWJsZVN0cmVhbSh0YWJsZS50YWcpO1xuXG4gICAgdmFyIHJlc3VsdCA9IHRhYmxlc1t0YWJsZS50YWddLmRlY29kZShzdHJlYW0sIHRoaXMsIHRhYmxlLmxlbmd0aCk7XG4gICAgdGhpcy5zdHJlYW0ucG9zID0gcG9zO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgUG9zdFNjcmlwdCBuYW1lIGZvciB0aGlzIGZvbnRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIDtcblxuICAvKipcbiAgICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSBmb250J3MgYG5hbWVgIHRhYmxlXG4gICAqIGBsYW5nYCBpcyBhIEJDUC00NyBsYW5ndWFnZSBjb2RlLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBfcHJvdG8uZ2V0TmFtZSA9IGZ1bmN0aW9uIGdldE5hbWUoa2V5LCBsYW5nKSB7XG4gICAgaWYgKGxhbmcgPT09IHZvaWQgMCkge1xuICAgICAgbGFuZyA9ICdlbic7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRoaXMubmFtZS5yZWNvcmRzW2tleV07XG5cbiAgICBpZiAocmVjb3JkKSB7XG4gICAgICByZXR1cm4gcmVjb3JkW2xhbmddO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZm9udCdzIGZ1bGwgbmFtZSwgZS5nLiBcIkhlbHZldGljYSBCb2xkXCJcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIDtcblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGlzIGdseXBoIGluIHRoZSBmb250IGZvciB0aGUgZ2l2ZW4gdW5pY29kZSBjb2RlIHBvaW50LlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZVBvaW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBfcHJvdG8uaGFzR2x5cGhGb3JDb2RlUG9pbnQgPSBmdW5jdGlvbiBoYXNHbHlwaEZvckNvZGVQb2ludChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gISF0aGlzLl9jbWFwUHJvY2Vzc29yLmxvb2t1cChjb2RlUG9pbnQpO1xuICB9XG4gIC8qKlxuICAgKiBNYXBzIGEgc2luZ2xlIHVuaWNvZGUgY29kZSBwb2ludCB0byBhIEdseXBoIG9iamVjdC5cbiAgICogRG9lcyBub3QgcGVyZm9ybSBhbnkgYWR2YW5jZWQgc3Vic3RpdHV0aW9ucyAodGhlcmUgaXMgbm8gY29udGV4dCB0byBkbyBzbykuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlUG9pbnRcbiAgICogQHJldHVybiB7R2x5cGh9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmdseXBoRm9yQ29kZVBvaW50ID0gZnVuY3Rpb24gZ2x5cGhGb3JDb2RlUG9pbnQoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0R2x5cGgodGhpcy5fY21hcFByb2Nlc3Nvci5sb29rdXAoY29kZVBvaW50KSwgW2NvZGVQb2ludF0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIEdseXBoIG9iamVjdHMgZm9yIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAqIFRoaXMgaXMgb25seSBhIG9uZS10by1vbmUgbWFwcGluZyBmcm9tIGNoYXJhY3RlcnMgdG8gZ2x5cGhzLlxuICAgKiBGb3IgbW9zdCB1c2VzLCB5b3Ugc2hvdWxkIHVzZSBmb250LmxheW91dCAoZGVzY3JpYmVkIGJlbG93KSwgd2hpY2hcbiAgICogcHJvdmlkZXMgYSBtdWNoIG1vcmUgYWR2YW5jZWQgbWFwcGluZyBzdXBwb3J0aW5nIEFBVCBhbmQgT3BlblR5cGUgc2hhcGluZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcmV0dXJuIHtHbHlwaFtdfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5nbHlwaHNGb3JTdHJpbmcgPSBmdW5jdGlvbiBnbHlwaHNGb3JTdHJpbmcoc3RyaW5nKSB7XG4gICAgdmFyIGdseXBocyA9IFtdO1xuICAgIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoO1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBsYXN0ID0gLTE7XG4gICAgdmFyIHN0YXRlID0gLTE7XG5cbiAgICB3aGlsZSAoaWR4IDw9IGxlbikge1xuICAgICAgdmFyIGNvZGUgPSAwO1xuICAgICAgdmFyIG5leHRTdGF0ZSA9IDA7XG5cbiAgICAgIGlmIChpZHggPCBsZW4pIHtcbiAgICAgICAgLy8gRGVjb2RlIHRoZSBuZXh0IGNvZGVwb2ludCBmcm9tIFVURiAxNlxuICAgICAgICBjb2RlID0gc3RyaW5nLmNoYXJDb2RlQXQoaWR4KyspO1xuXG4gICAgICAgIGlmICgweGQ4MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4ZGJmZiAmJiBpZHggPCBsZW4pIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IHN0cmluZy5jaGFyQ29kZUF0KGlkeCk7XG5cbiAgICAgICAgICBpZiAoMHhkYzAwIDw9IG5leHQgJiYgbmV4dCA8PSAweGRmZmYpIHtcbiAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgY29kZSA9ICgoY29kZSAmIDB4M2ZmKSA8PCAxMCkgKyAobmV4dCAmIDB4M2ZmKSArIDB4MTAwMDA7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIENvbXB1dGUgdGhlIG5leHQgc3RhdGU6IDEgaWYgdGhlIG5leHQgY29kZXBvaW50IGlzIGEgdmFyaWF0aW9uIHNlbGVjdG9yLCAwIG90aGVyd2lzZS5cblxuXG4gICAgICAgIG5leHRTdGF0ZSA9IDB4ZmUwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhmZTBmIHx8IDB4ZTAxMDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4ZTAxZWYgPyAxIDogMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlkeCsrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IDAgJiYgbmV4dFN0YXRlID09PSAxKSB7XG4gICAgICAgIC8vIFZhcmlhdGlvbiBzZWxlY3RvciBmb2xsb3dpbmcgbm9ybWFsIGNvZGVwb2ludC5cbiAgICAgICAgZ2x5cGhzLnB1c2godGhpcy5nZXRHbHlwaCh0aGlzLl9jbWFwUHJvY2Vzc29yLmxvb2t1cChsYXN0LCBjb2RlKSwgW2xhc3QsIGNvZGVdKSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAwICYmIG5leHRTdGF0ZSA9PT0gMCkge1xuICAgICAgICAvLyBOb3JtYWwgY29kZXBvaW50IGZvbGxvd2luZyBub3JtYWwgY29kZXBvaW50LlxuICAgICAgICBnbHlwaHMucHVzaCh0aGlzLmdseXBoRm9yQ29kZVBvaW50KGxhc3QpKTtcbiAgICAgIH1cblxuICAgICAgbGFzdCA9IGNvZGU7XG4gICAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2x5cGhzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgR2x5cGhSdW4gb2JqZWN0LCB3aGljaCBpbmNsdWRlcyBhbiBhcnJheSBvZiBHbHlwaHMgYW5kIEdseXBoUG9zaXRpb25zIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFt1c2VyRmVhdHVyZXNdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2NyaXB0XVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xhbmd1YWdlXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RpcmVjdGlvbl1cbiAgICogQHJldHVybiB7R2x5cGhSdW59XG4gICAqL1xuICBfcHJvdG8ubGF5b3V0ID0gZnVuY3Rpb24gbGF5b3V0KHN0cmluZywgdXNlckZlYXR1cmVzLCBzY3JpcHQsIGxhbmd1YWdlLCBkaXJlY3Rpb24pIHtcbiAgICByZXR1cm4gdGhpcy5fbGF5b3V0RW5naW5lLmxheW91dChzdHJpbmcsIHVzZXJGZWF0dXJlcywgc2NyaXB0LCBsYW5ndWFnZSwgZGlyZWN0aW9uKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgbWFwIHRvIHRoZSBnaXZlbiBnbHlwaCBpZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGdpZCAtIGdseXBoIGlkXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnN0cmluZ3NGb3JHbHlwaCA9IGZ1bmN0aW9uIHN0cmluZ3NGb3JHbHlwaChnaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF5b3V0RW5naW5lLnN0cmluZ3NGb3JHbHlwaChnaWQpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBhbGwgW09wZW5UeXBlIGZlYXR1cmUgdGFnc10oaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9mZWF0dXJldGFncy5odG0pXG4gICAqIChvciBtYXBwZWQgQUFUIHRhZ3MpIHN1cHBvcnRlZCBieSB0aGUgZm9udC5cbiAgICogVGhlIGZlYXR1cmVzIHBhcmFtZXRlciBpcyBhbiBhcnJheSBvZiBPcGVuVHlwZSBmZWF0dXJlIHRhZ3MgdG8gYmUgYXBwbGllZCBpbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCBzZXQuXG4gICAqIElmIHRoaXMgaXMgYW4gQUFUIGZvbnQsIHRoZSBPcGVuVHlwZSBmZWF0dXJlIHRhZ3MgYXJlIG1hcHBlZCB0byBBQVQgZmVhdHVyZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmdbXX1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZ2V0QXZhaWxhYmxlRmVhdHVyZXMgPSBmdW5jdGlvbiBnZXRBdmFpbGFibGVGZWF0dXJlcyhzY3JpcHQsIGxhbmd1YWdlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheW91dEVuZ2luZS5nZXRBdmFpbGFibGVGZWF0dXJlcyhzY3JpcHQsIGxhbmd1YWdlKTtcbiAgfTtcblxuICBfcHJvdG8uX2dldEJhc2VHbHlwaCA9IGZ1bmN0aW9uIF9nZXRCYXNlR2x5cGgoZ2x5cGgsIGNoYXJhY3RlcnMpIHtcbiAgICBpZiAoY2hhcmFjdGVycyA9PT0gdm9pZCAwKSB7XG4gICAgICBjaGFyYWN0ZXJzID0gW107XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9nbHlwaHNbZ2x5cGhdKSB7XG4gICAgICBpZiAodGhpcy5kaXJlY3RvcnkudGFibGVzLmdseWYpIHtcbiAgICAgICAgdGhpcy5fZ2x5cGhzW2dseXBoXSA9IG5ldyBUVEZHbHlwaChnbHlwaCwgY2hhcmFjdGVycywgdGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGlyZWN0b3J5LnRhYmxlc1snQ0ZGICddIHx8IHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5DRkYyKSB7XG4gICAgICAgIHRoaXMuX2dseXBoc1tnbHlwaF0gPSBuZXcgQ0ZGR2x5cGgoZ2x5cGgsIGNoYXJhY3RlcnMsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9nbHlwaHNbZ2x5cGhdIHx8IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBnbHlwaCBvYmplY3QgZm9yIHRoZSBnaXZlbiBnbHlwaCBpZC5cbiAgICogWW91IGNhbiBwYXNzIHRoZSBhcnJheSBvZiBjb2RlIHBvaW50cyB0aGlzIGdseXBoIHJlcHJlc2VudHMgZm9yXG4gICAqIHlvdXIgdXNlIGxhdGVyLCBhbmQgaXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGdseXBoIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGdseXBoXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IGNoYXJhY3RlcnNcbiAgICogQHJldHVybiB7R2x5cGh9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmdldEdseXBoID0gZnVuY3Rpb24gZ2V0R2x5cGgoZ2x5cGgsIGNoYXJhY3RlcnMpIHtcbiAgICBpZiAoY2hhcmFjdGVycyA9PT0gdm9pZCAwKSB7XG4gICAgICBjaGFyYWN0ZXJzID0gW107XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9nbHlwaHNbZ2x5cGhdKSB7XG4gICAgICBpZiAodGhpcy5kaXJlY3RvcnkudGFibGVzLnNiaXgpIHtcbiAgICAgICAgdGhpcy5fZ2x5cGhzW2dseXBoXSA9IG5ldyBTQklYR2x5cGgoZ2x5cGgsIGNoYXJhY3RlcnMsIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpcmVjdG9yeS50YWJsZXMuQ09MUiAmJiB0aGlzLmRpcmVjdG9yeS50YWJsZXMuQ1BBTCkge1xuICAgICAgICB0aGlzLl9nbHlwaHNbZ2x5cGhdID0gbmV3IENPTFJHbHlwaChnbHlwaCwgY2hhcmFjdGVycywgdGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9nZXRCYXNlR2x5cGgoZ2x5cGgsIGNoYXJhY3RlcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9nbHlwaHNbZ2x5cGhdIHx8IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBTdWJzZXQgZm9yIHRoaXMgZm9udC5cbiAgICogQHJldHVybiB7U3Vic2V0fVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5jcmVhdGVTdWJzZXQgPSBmdW5jdGlvbiBjcmVhdGVTdWJzZXQoKSB7XG4gICAgaWYgKHRoaXMuZGlyZWN0b3J5LnRhYmxlc1snQ0ZGICddKSB7XG4gICAgICByZXR1cm4gbmV3IENGRlN1YnNldCh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRURlN1YnNldCh0aGlzKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgZGVzY3JpYmluZyB0aGUgYXZhaWxhYmxlIHZhcmlhdGlvbiBheGVzXG4gICAqIHRoYXQgdGhpcyBmb250IHN1cHBvcnRzLiBLZXlzIGFyZSBzZXR0aW5nIHRhZ3MsIGFuZCB2YWx1ZXNcbiAgICogY29udGFpbiB0aGUgYXhpcyBuYW1lLCByYW5nZSwgYW5kIGRlZmF1bHQgdmFsdWUuXG4gICAqXG4gICAqIEB0eXBlIHtvYmplY3R9XG4gICAqL1xuICA7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgZm9udCB3aXRoIHRoZSBnaXZlbiB2YXJpYXRpb24gc2V0dGluZ3MgYXBwbGllZC5cbiAgICogU2V0dGluZ3MgY2FuIGVpdGhlciBiZSBhbiBpbnN0YW5jZSBuYW1lLCBvciBhbiBvYmplY3QgY29udGFpbmluZ1xuICAgKiB2YXJpYXRpb24gdGFncyBhcyBzcGVjaWZpZWQgYnkgdGhlIGB2YXJpYXRpb25BeGVzYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzXG4gICAqIEByZXR1cm4ge1RURkZvbnR9XG4gICAqL1xuICBfcHJvdG8uZ2V0VmFyaWF0aW9uID0gZnVuY3Rpb24gZ2V0VmFyaWF0aW9uKHNldHRpbmdzKSB7XG4gICAgaWYgKCEodGhpcy5kaXJlY3RvcnkudGFibGVzLmZ2YXIgJiYgKHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5ndmFyICYmIHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5nbHlmIHx8IHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5DRkYyKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFyaWF0aW9ucyByZXF1aXJlIGEgZm9udCB3aXRoIHRoZSBmdmFyLCBndmFyIGFuZCBnbHlmLCBvciBDRkYyIHRhYmxlcy4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnc3RyaW5nJykge1xuICAgICAgc2V0dGluZ3MgPSB0aGlzLm5hbWVkVmFyaWF0aW9uc1tzZXR0aW5nc107XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzZXR0aW5ncyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFyaWF0aW9uIHNldHRpbmdzIG11c3QgYmUgZWl0aGVyIGEgdmFyaWF0aW9uIG5hbWUgb3Igc2V0dGluZ3Mgb2JqZWN0LicpO1xuICAgIH0gLy8gbm9ybWFsaXplIHRoZSBjb29yZGluYXRlc1xuXG5cbiAgICB2YXIgY29vcmRzID0gdGhpcy5mdmFyLmF4aXMubWFwKGZ1bmN0aW9uIChheGlzLCBpKSB7XG4gICAgICB2YXIgYXhpc1RhZyA9IGF4aXMuYXhpc1RhZy50cmltKCk7XG5cbiAgICAgIGlmIChheGlzVGFnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChheGlzLm1pblZhbHVlLCBNYXRoLm1pbihheGlzLm1heFZhbHVlLCBzZXR0aW5nc1theGlzVGFnXSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGF4aXMuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBzdHJlYW0gPSBuZXcgcmVzdHJ1Y3R1cmUuRGVjb2RlU3RyZWFtKHRoaXMuc3RyZWFtLmJ1ZmZlcik7XG4gICAgc3RyZWFtLnBvcyA9IHRoaXMuX2RpcmVjdG9yeVBvcztcbiAgICB2YXIgZm9udCA9IG5ldyBUVEZGb250KHN0cmVhbSwgY29vcmRzKTtcbiAgICBmb250Ll90YWJsZXMgPSB0aGlzLl90YWJsZXM7XG4gICAgcmV0dXJuIGZvbnQ7XG4gIH07XG5cbiAgLy8gU3RhbmRhcmRpemVkIGZvcm1hdCBwbHVnaW4gQVBJXG4gIF9wcm90by5nZXRGb250ID0gZnVuY3Rpb24gZ2V0Rm9udChuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWF0aW9uKG5hbWUpO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyQ4KFRURkZvbnQsIFt7XG4gICAga2V5OiBcInBvc3RzY3JpcHROYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgbmFtZSA9IHRoaXMubmFtZS5yZWNvcmRzLnBvc3RzY3JpcHROYW1lO1xuXG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICB2YXIgbGFuZyA9IE9iamVjdC5rZXlzKG5hbWUpWzBdO1xuICAgICAgICByZXR1cm4gbmFtZVtsYW5nXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZ1bGxOYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROYW1lKCdmdWxsTmFtZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZm9udCdzIGZhbWlseSBuYW1lLCBlLmcuIFwiSGVsdmV0aWNhXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZmFtaWx5TmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgnZm9udEZhbWlseScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZm9udCdzIHN1Yi1mYW1pbHksIGUuZy4gXCJCb2xkXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN1YmZhbWlseU5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5hbWUoJ2ZvbnRTdWJmYW1pbHknKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZvbnQncyBjb3B5cmlnaHQgaW5mb3JtYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29weXJpZ2h0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROYW1lKCdjb3B5cmlnaHQnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZvbnQncyB2ZXJzaW9uIG51bWJlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ2ZXJzaW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROYW1lKCd2ZXJzaW9uJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmb2504oCZcyBbYXNjZW5kZXJdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FzY2VuZGVyXyh0eXBvZ3JhcGh5KSlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYXNjZW50XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaGVhLmFzY2VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZvbnTigJlzIFtkZXNjZW5kZXJdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Rlc2NlbmRlcilcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVzY2VudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGhlYS5kZXNjZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHNwYWNlIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGJldHdlZW4gbGluZXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibGluZUdhcFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGhlYS5saW5lR2FwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgb2Zmc2V0IGZyb20gdGhlIG5vcm1hbCB1bmRlcmxpbmUgcG9zaXRpb24gdGhhdCBzaG91bGQgYmUgdXNlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bmRlcmxpbmVQb3NpdGlvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zdC51bmRlcmxpbmVQb3NpdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHdlaWdodCBvZiB0aGUgdW5kZXJsaW5lIHRoYXQgc2hvdWxkIGJlIHVzZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidW5kZXJsaW5lVGhpY2tuZXNzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3N0LnVuZGVybGluZVRoaWNrbmVzcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBpcyBhbiBpdGFsaWMgZm9udCwgdGhlIGFuZ2xlIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGRyYXduIGF0IHRvIG1hdGNoIHRoZSBmb250IGRlc2lnblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpdGFsaWNBbmdsZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zdC5pdGFsaWNBbmdsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGhlaWdodCBvZiBjYXBpdGFsIGxldHRlcnMgYWJvdmUgdGhlIGJhc2VsaW5lLlxuICAgICAqIFNlZSBbaGVyZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FwX2hlaWdodCkgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2FwSGVpZ2h0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgb3MyID0gdGhpc1snT1MvMiddO1xuICAgICAgcmV0dXJuIG9zMiA/IG9zMi5jYXBIZWlnaHQgOiB0aGlzLmFzY2VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGhlaWdodCBvZiBsb3dlciBjYXNlIGxldHRlcnMgaW4gdGhlIGZvbnQuXG4gICAgICogU2VlIFtoZXJlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9YLWhlaWdodCkgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwieEhlaWdodFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIG9zMiA9IHRoaXNbJ09TLzInXTtcbiAgICAgIHJldHVybiBvczIgPyBvczIueEhlaWdodCA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSBmb250LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJudW1HbHlwaHNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1heHAubnVtR2x5cGhzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgZm9udOKAmXMgaW50ZXJuYWwgY29vcmRpbmF0ZSBncmlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVuaXRzUGVyRW1cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhlYWQudW5pdHNQZXJFbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZvbnTigJlzIGJvdW5kaW5nIGJveCwgaS5lLiB0aGUgYm94IHRoYXQgZW5jbG9zZXMgYWxsIGdseXBocyBpbiB0aGUgZm9udC5cbiAgICAgKiBAdHlwZSB7QkJveH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImJib3hcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKG5ldyBCQm94KHRoaXMuaGVhZC54TWluLCB0aGlzLmhlYWQueU1pbiwgdGhpcy5oZWFkLnhNYXgsIHRoaXMuaGVhZC55TWF4KSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jbWFwUHJvY2Vzc29yXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbmV3IENtYXBQcm9jZXNzb3IodGhpcy5jbWFwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWxsIG9mIHRoZSB1bmljb2RlIGNvZGUgcG9pbnRzIHN1cHBvcnRlZCBieSB0aGUgZm9udC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyW119XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjaGFyYWN0ZXJTZXRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jbWFwUHJvY2Vzc29yLmdldENoYXJhY3RlclNldCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfbGF5b3V0RW5naW5lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbmV3IExheW91dEVuZ2luZSh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYXZhaWxhYmxlRmVhdHVyZXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYXlvdXRFbmdpbmUuZ2V0QXZhaWxhYmxlRmVhdHVyZXMoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidmFyaWF0aW9uQXhlc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIHJlcyA9IHt9O1xuXG4gICAgICBpZiAoIXRoaXMuZnZhcikge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHEodGhpcy5mdmFyLmF4aXMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgICB2YXIgYXhpcyA9IF9zdGVwLnZhbHVlO1xuICAgICAgICByZXNbYXhpcy5heGlzVGFnLnRyaW0oKV0gPSB7XG4gICAgICAgICAgbmFtZTogYXhpcy5uYW1lLmVuLFxuICAgICAgICAgIG1pbjogYXhpcy5taW5WYWx1ZSxcbiAgICAgICAgICBcImRlZmF1bHRcIjogYXhpcy5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgbWF4OiBheGlzLm1heFZhbHVlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5hbWVkIHZhcmlhdGlvbiBpbnN0YW5jZXNcbiAgICAgKiB0aGF0IHRoZSBmb250IGRlc2lnbmVyIGhhcyBzcGVjaWZpZWQuIEtleXMgYXJlIHZhcmlhdGlvbiBuYW1lc1xuICAgICAqIGFuZCB2YWx1ZXMgYXJlIHRoZSB2YXJpYXRpb24gc2V0dGluZ3MgZm9yIHRoaXMgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibmFtZWRWYXJpYXRpb25zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgcmVzID0ge307XG5cbiAgICAgIGlmICghdGhpcy5mdmFyKSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHEodGhpcy5mdmFyLmluc3RhbmNlKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICB2YXIgc2V0dGluZ3MgPSB7fTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZnZhci5heGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGF4aXMgPSB0aGlzLmZ2YXIuYXhpc1tpXTtcbiAgICAgICAgICBzZXR0aW5nc1theGlzLmF4aXNUYWcudHJpbSgpXSA9IGluc3RhbmNlLmNvb3JkW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzW2luc3RhbmNlLm5hbWUuZW5dID0gc2V0dGluZ3M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl92YXJpYXRpb25Qcm9jZXNzb3JcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICghdGhpcy5mdmFyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmFyaWF0aW9uQ29vcmRzID0gdGhpcy52YXJpYXRpb25Db29yZHM7IC8vIElnbm9yZSBpZiBubyB2YXJpYXRpb24gY29vcmRzIGFuZCBub3QgQ0ZGMlxuXG4gICAgICBpZiAoIXZhcmlhdGlvbkNvb3JkcyAmJiAhdGhpcy5DRkYyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhcmlhdGlvbkNvb3Jkcykge1xuICAgICAgICB2YXJpYXRpb25Db29yZHMgPSB0aGlzLmZ2YXIuYXhpcy5tYXAoZnVuY3Rpb24gKGF4aXMpIHtcbiAgICAgICAgICByZXR1cm4gYXhpcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEdseXBoVmFyaWF0aW9uUHJvY2Vzc29yKHRoaXMsIHZhcmlhdGlvbkNvb3Jkcyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRURkZvbnQ7XG59KCksIChfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDQoX2NsYXNzJDQucHJvdG90eXBlLCBcImJib3hcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkNC5wcm90b3R5cGUsIFwiYmJveFwiKSwgX2NsYXNzJDQucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQ0KF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJfY21hcFByb2Nlc3NvclwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJfY21hcFByb2Nlc3NvclwiKSwgX2NsYXNzJDQucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQ0KF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJjaGFyYWN0ZXJTZXRcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkNC5wcm90b3R5cGUsIFwiY2hhcmFjdGVyU2V0XCIpLCBfY2xhc3MkNC5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDQoX2NsYXNzJDQucHJvdG90eXBlLCBcIl9sYXlvdXRFbmdpbmVcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkNC5wcm90b3R5cGUsIFwiX2xheW91dEVuZ2luZVwiKSwgX2NsYXNzJDQucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQ0KF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJ2YXJpYXRpb25BeGVzXCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDQucHJvdG90eXBlLCBcInZhcmlhdGlvbkF4ZXNcIiksIF9jbGFzcyQ0LnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkNChfY2xhc3MkNC5wcm90b3R5cGUsIFwibmFtZWRWYXJpYXRpb25zXCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDQucHJvdG90eXBlLCBcIm5hbWVkVmFyaWF0aW9uc1wiKSwgX2NsYXNzJDQucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQ0KF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJfdmFyaWF0aW9uUHJvY2Vzc29yXCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDQucHJvdG90eXBlLCBcIl92YXJpYXRpb25Qcm9jZXNzb3JcIiksIF9jbGFzcyQ0LnByb3RvdHlwZSkpLCBfY2xhc3MkNCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkcihvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkcihvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkcihvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JHIobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRyKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkcihhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cbnZhciBXT0ZGRGlyZWN0b3J5RW50cnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICBvZmZzZXQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgJ3ZvaWQnLCB7XG4gICAgdHlwZTogJ2dsb2JhbCdcbiAgfSksXG4gIGNvbXBMZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG9yaWdDaGVja3N1bTogcmVzdHJ1Y3R1cmUudWludDMyXG59KTtcbnZhciBXT0ZGRGlyZWN0b3J5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgLy8gc2hvdWxkIGJlICd3T0ZGJ1xuICBmbGF2b3I6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG51bVRhYmxlczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gIHRvdGFsU2ZudFNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbWFqb3JWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1pbm9yVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtZXRhT2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG1ldGFMZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbWV0YU9yaWdMZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgcHJpdk9mZnNldDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBwcml2TGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHRhYmxlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFdPRkZEaXJlY3RvcnlFbnRyeSwgJ251bVRhYmxlcycpXG59KTtcblxuV09GRkRpcmVjdG9yeS5wcm9jZXNzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGFibGVzID0ge307XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRyKHRoaXMudGFibGVzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgdGFibGUgPSBfc3RlcC52YWx1ZTtcbiAgICB0YWJsZXNbdGFibGUudGFnXSA9IHRhYmxlO1xuICB9XG5cbiAgdGhpcy50YWJsZXMgPSB0YWJsZXM7XG59O1xuXG52YXIgVElORl9PSyQxID0gMDtcbnZhciBUSU5GX0RBVEFfRVJST1IkMSA9IC0zO1xuXG5mdW5jdGlvbiBUcmVlJDEoKSB7XG4gIHRoaXMudGFibGUgPSBuZXcgVWludDE2QXJyYXkoMTYpO1xuICAvKiB0YWJsZSBvZiBjb2RlIGxlbmd0aCBjb3VudHMgKi9cblxuICB0aGlzLnRyYW5zID0gbmV3IFVpbnQxNkFycmF5KDI4OCk7XG4gIC8qIGNvZGUgLT4gc3ltYm9sIHRyYW5zbGF0aW9uIHRhYmxlICovXG59XG5cbmZ1bmN0aW9uIERhdGEkMShzb3VyY2UsIGRlc3QpIHtcbiAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gIHRoaXMuc291cmNlSW5kZXggPSAwO1xuICB0aGlzLnRhZyA9IDA7XG4gIHRoaXMuYml0Y291bnQgPSAwO1xuICB0aGlzLmRlc3QgPSBkZXN0O1xuICB0aGlzLmRlc3RMZW4gPSAwO1xuICB0aGlzLmx0cmVlID0gbmV3IFRyZWUkMSgpO1xuICAvKiBkeW5hbWljIGxlbmd0aC9zeW1ib2wgdHJlZSAqL1xuXG4gIHRoaXMuZHRyZWUgPSBuZXcgVHJlZSQxKCk7XG4gIC8qIGR5bmFtaWMgZGlzdGFuY2UgdHJlZSAqL1xufVxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIHVuaW5pdGlhbGl6ZWQgZ2xvYmFsIGRhdGEgKHN0YXRpYyBzdHJ1Y3R1cmVzKSAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXG52YXIgc2x0cmVlJDEgPSBuZXcgVHJlZSQxKCk7XG52YXIgc2R0cmVlJDEgPSBuZXcgVHJlZSQxKCk7XG4vKiBleHRyYSBiaXRzIGFuZCBiYXNlIHRhYmxlcyBmb3IgbGVuZ3RoIGNvZGVzICovXG5cbnZhciBsZW5ndGhfYml0cyQxID0gbmV3IFVpbnQ4QXJyYXkoMzApO1xudmFyIGxlbmd0aF9iYXNlJDEgPSBuZXcgVWludDE2QXJyYXkoMzApO1xuLyogZXh0cmEgYml0cyBhbmQgYmFzZSB0YWJsZXMgZm9yIGRpc3RhbmNlIGNvZGVzICovXG5cbnZhciBkaXN0X2JpdHMkMSA9IG5ldyBVaW50OEFycmF5KDMwKTtcbnZhciBkaXN0X2Jhc2UkMSA9IG5ldyBVaW50MTZBcnJheSgzMCk7XG4vKiBzcGVjaWFsIG9yZGVyaW5nIG9mIGNvZGUgbGVuZ3RoIGNvZGVzICovXG5cbnZhciBjbGNpZHgkMSA9IG5ldyBVaW50OEFycmF5KFsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1XSk7XG4vKiB1c2VkIGJ5IHRpbmZfZGVjb2RlX3RyZWVzLCBhdm9pZHMgYWxsb2NhdGlvbnMgZXZlcnkgY2FsbCAqL1xuXG52YXIgY29kZV90cmVlJDEgPSBuZXcgVHJlZSQxKCk7XG52YXIgbGVuZ3RocyQxID0gbmV3IFVpbnQ4QXJyYXkoMjg4ICsgMzIpO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKlxuICogLS0gdXRpbGl0eSBmdW5jdGlvbnMgLS0gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogYnVpbGQgZXh0cmEgYml0cyBhbmQgYmFzZSB0YWJsZXMgKi9cblxuZnVuY3Rpb24gdGluZl9idWlsZF9iaXRzX2Jhc2UkMShiaXRzLCBiYXNlLCBkZWx0YSwgZmlyc3QpIHtcbiAgdmFyIGksIHN1bTtcbiAgLyogYnVpbGQgYml0cyB0YWJsZSAqL1xuXG4gIGZvciAoaSA9IDA7IGkgPCBkZWx0YTsgKytpKSB7XG4gICAgYml0c1tpXSA9IDA7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgMzAgLSBkZWx0YTsgKytpKSB7XG4gICAgYml0c1tpICsgZGVsdGFdID0gaSAvIGRlbHRhIHwgMDtcbiAgfVxuICAvKiBidWlsZCBiYXNlIHRhYmxlICovXG5cblxuICBmb3IgKHN1bSA9IGZpcnN0LCBpID0gMDsgaSA8IDMwOyArK2kpIHtcbiAgICBiYXNlW2ldID0gc3VtO1xuICAgIHN1bSArPSAxIDw8IGJpdHNbaV07XG4gIH1cbn1cbi8qIGJ1aWxkIHRoZSBmaXhlZCBodWZmbWFuIHRyZWVzICovXG5cblxuZnVuY3Rpb24gdGluZl9idWlsZF9maXhlZF90cmVlcyQxKGx0LCBkdCkge1xuICB2YXIgaTtcbiAgLyogYnVpbGQgZml4ZWQgbGVuZ3RoIHRyZWUgKi9cblxuICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7XG4gICAgbHQudGFibGVbaV0gPSAwO1xuICB9XG5cbiAgbHQudGFibGVbN10gPSAyNDtcbiAgbHQudGFibGVbOF0gPSAxNTI7XG4gIGx0LnRhYmxlWzldID0gMTEyO1xuXG4gIGZvciAoaSA9IDA7IGkgPCAyNDsgKytpKSB7XG4gICAgbHQudHJhbnNbaV0gPSAyNTYgKyBpO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IDE0NDsgKytpKSB7XG4gICAgbHQudHJhbnNbMjQgKyBpXSA9IGk7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7XG4gICAgbHQudHJhbnNbMjQgKyAxNDQgKyBpXSA9IDI4MCArIGk7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgMTEyOyArK2kpIHtcbiAgICBsdC50cmFuc1syNCArIDE0NCArIDggKyBpXSA9IDE0NCArIGk7XG4gIH1cbiAgLyogYnVpbGQgZml4ZWQgZGlzdGFuY2UgdHJlZSAqL1xuXG5cbiAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkge1xuICAgIGR0LnRhYmxlW2ldID0gMDtcbiAgfVxuXG4gIGR0LnRhYmxlWzVdID0gMzI7XG5cbiAgZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHtcbiAgICBkdC50cmFuc1tpXSA9IGk7XG4gIH1cbn1cbi8qIGdpdmVuIGFuIGFycmF5IG9mIGNvZGUgbGVuZ3RocywgYnVpbGQgYSB0cmVlICovXG5cblxudmFyIG9mZnMkMSA9IG5ldyBVaW50MTZBcnJheSgxNik7XG5cbmZ1bmN0aW9uIHRpbmZfYnVpbGRfdHJlZSQxKHQsIGxlbmd0aHMsIG9mZiwgbnVtKSB7XG4gIHZhciBpLCBzdW07XG4gIC8qIGNsZWFyIGNvZGUgbGVuZ3RoIGNvdW50IHRhYmxlICovXG5cbiAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICB0LnRhYmxlW2ldID0gMDtcbiAgfVxuICAvKiBzY2FuIHN5bWJvbCBsZW5ndGhzLCBhbmQgc3VtIGNvZGUgbGVuZ3RoIGNvdW50cyAqL1xuXG5cbiAgZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7XG4gICAgdC50YWJsZVtsZW5ndGhzW29mZiArIGldXSsrO1xuICB9XG5cbiAgdC50YWJsZVswXSA9IDA7XG4gIC8qIGNvbXB1dGUgb2Zmc2V0IHRhYmxlIGZvciBkaXN0cmlidXRpb24gc29ydCAqL1xuXG4gIGZvciAoc3VtID0gMCwgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgb2ZmcyQxW2ldID0gc3VtO1xuICAgIHN1bSArPSB0LnRhYmxlW2ldO1xuICB9XG4gIC8qIGNyZWF0ZSBjb2RlLT5zeW1ib2wgdHJhbnNsYXRpb24gdGFibGUgKHN5bWJvbHMgc29ydGVkIGJ5IGNvZGUpICovXG5cblxuICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHtcbiAgICBpZiAobGVuZ3Roc1tvZmYgKyBpXSkgdC50cmFuc1tvZmZzJDFbbGVuZ3Roc1tvZmYgKyBpXV0rK10gPSBpO1xuICB9XG59XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIGRlY29kZSBmdW5jdGlvbnMgLS0gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiBnZXQgb25lIGJpdCBmcm9tIHNvdXJjZSBzdHJlYW0gKi9cblxuXG5mdW5jdGlvbiB0aW5mX2dldGJpdCQxKGQpIHtcbiAgLyogY2hlY2sgaWYgdGFnIGlzIGVtcHR5ICovXG4gIGlmICghZC5iaXRjb3VudC0tKSB7XG4gICAgLyogbG9hZCBuZXh0IHRhZyAqL1xuICAgIGQudGFnID0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCsrXTtcbiAgICBkLmJpdGNvdW50ID0gNztcbiAgfVxuICAvKiBzaGlmdCBiaXQgb3V0IG9mIHRhZyAqL1xuXG5cbiAgdmFyIGJpdCA9IGQudGFnICYgMTtcbiAgZC50YWcgPj4+PSAxO1xuICByZXR1cm4gYml0O1xufVxuLyogcmVhZCBhIG51bSBiaXQgdmFsdWUgZnJvbSBhIHN0cmVhbSBhbmQgYWRkIGJhc2UgKi9cblxuXG5mdW5jdGlvbiB0aW5mX3JlYWRfYml0cyQxKGQsIG51bSwgYmFzZSkge1xuICBpZiAoIW51bSkgcmV0dXJuIGJhc2U7XG5cbiAgd2hpbGUgKGQuYml0Y291bnQgPCAyNCkge1xuICAgIGQudGFnIHw9IGQuc291cmNlW2Quc291cmNlSW5kZXgrK10gPDwgZC5iaXRjb3VudDtcbiAgICBkLmJpdGNvdW50ICs9IDg7XG4gIH1cblxuICB2YXIgdmFsID0gZC50YWcgJiAweGZmZmYgPj4+IDE2IC0gbnVtO1xuICBkLnRhZyA+Pj49IG51bTtcbiAgZC5iaXRjb3VudCAtPSBudW07XG4gIHJldHVybiB2YWwgKyBiYXNlO1xufVxuLyogZ2l2ZW4gYSBkYXRhIHN0cmVhbSBhbmQgYSB0cmVlLCBkZWNvZGUgYSBzeW1ib2wgKi9cblxuXG5mdW5jdGlvbiB0aW5mX2RlY29kZV9zeW1ib2wkMShkLCB0KSB7XG4gIHdoaWxlIChkLmJpdGNvdW50IDwgMjQpIHtcbiAgICBkLnRhZyB8PSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4KytdIDw8IGQuYml0Y291bnQ7XG4gICAgZC5iaXRjb3VudCArPSA4O1xuICB9XG5cbiAgdmFyIHN1bSA9IDAsXG4gICAgICBjdXIgPSAwLFxuICAgICAgbGVuID0gMDtcbiAgdmFyIHRhZyA9IGQudGFnO1xuICAvKiBnZXQgbW9yZSBiaXRzIHdoaWxlIGNvZGUgdmFsdWUgaXMgYWJvdmUgc3VtICovXG5cbiAgZG8ge1xuICAgIGN1ciA9IDIgKiBjdXIgKyAodGFnICYgMSk7XG4gICAgdGFnID4+Pj0gMTtcbiAgICArK2xlbjtcbiAgICBzdW0gKz0gdC50YWJsZVtsZW5dO1xuICAgIGN1ciAtPSB0LnRhYmxlW2xlbl07XG4gIH0gd2hpbGUgKGN1ciA+PSAwKTtcblxuICBkLnRhZyA9IHRhZztcbiAgZC5iaXRjb3VudCAtPSBsZW47XG4gIHJldHVybiB0LnRyYW5zW3N1bSArIGN1cl07XG59XG4vKiBnaXZlbiBhIGRhdGEgc3RyZWFtLCBkZWNvZGUgZHluYW1pYyB0cmVlcyBmcm9tIGl0ICovXG5cblxuZnVuY3Rpb24gdGluZl9kZWNvZGVfdHJlZXMkMShkLCBsdCwgZHQpIHtcbiAgdmFyIGhsaXQsIGhkaXN0LCBoY2xlbjtcbiAgdmFyIGksIG51bSwgbGVuZ3RoO1xuICAvKiBnZXQgNSBiaXRzIEhMSVQgKDI1Ny0yODYpICovXG5cbiAgaGxpdCA9IHRpbmZfcmVhZF9iaXRzJDEoZCwgNSwgMjU3KTtcbiAgLyogZ2V0IDUgYml0cyBIRElTVCAoMS0zMikgKi9cblxuICBoZGlzdCA9IHRpbmZfcmVhZF9iaXRzJDEoZCwgNSwgMSk7XG4gIC8qIGdldCA0IGJpdHMgSENMRU4gKDQtMTkpICovXG5cbiAgaGNsZW4gPSB0aW5mX3JlYWRfYml0cyQxKGQsIDQsIDQpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCAxOTsgKytpKSB7XG4gICAgbGVuZ3RocyQxW2ldID0gMDtcbiAgfVxuICAvKiByZWFkIGNvZGUgbGVuZ3RocyBmb3IgY29kZSBsZW5ndGggYWxwaGFiZXQgKi9cblxuXG4gIGZvciAoaSA9IDA7IGkgPCBoY2xlbjsgKytpKSB7XG4gICAgLyogZ2V0IDMgYml0cyBjb2RlIGxlbmd0aCAoMC03KSAqL1xuICAgIHZhciBjbGVuID0gdGluZl9yZWFkX2JpdHMkMShkLCAzLCAwKTtcbiAgICBsZW5ndGhzJDFbY2xjaWR4JDFbaV1dID0gY2xlbjtcbiAgfVxuICAvKiBidWlsZCBjb2RlIGxlbmd0aCB0cmVlICovXG5cblxuICB0aW5mX2J1aWxkX3RyZWUkMShjb2RlX3RyZWUkMSwgbGVuZ3RocyQxLCAwLCAxOSk7XG4gIC8qIGRlY29kZSBjb2RlIGxlbmd0aHMgZm9yIHRoZSBkeW5hbWljIHRyZWVzICovXG5cbiAgZm9yIChudW0gPSAwOyBudW0gPCBobGl0ICsgaGRpc3Q7KSB7XG4gICAgdmFyIHN5bSA9IHRpbmZfZGVjb2RlX3N5bWJvbCQxKGQsIGNvZGVfdHJlZSQxKTtcblxuICAgIHN3aXRjaCAoc3ltKSB7XG4gICAgICBjYXNlIDE2OlxuICAgICAgICAvKiBjb3B5IHByZXZpb3VzIGNvZGUgbGVuZ3RoIDMtNiB0aW1lcyAocmVhZCAyIGJpdHMpICovXG4gICAgICAgIHZhciBwcmV2ID0gbGVuZ3RocyQxW251bSAtIDFdO1xuXG4gICAgICAgIGZvciAobGVuZ3RoID0gdGluZl9yZWFkX2JpdHMkMShkLCAyLCAzKTsgbGVuZ3RoOyAtLWxlbmd0aCkge1xuICAgICAgICAgIGxlbmd0aHMkMVtudW0rK10gPSBwcmV2O1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMTc6XG4gICAgICAgIC8qIHJlcGVhdCBjb2RlIGxlbmd0aCAwIGZvciAzLTEwIHRpbWVzIChyZWFkIDMgYml0cykgKi9cbiAgICAgICAgZm9yIChsZW5ndGggPSB0aW5mX3JlYWRfYml0cyQxKGQsIDMsIDMpOyBsZW5ndGg7IC0tbGVuZ3RoKSB7XG4gICAgICAgICAgbGVuZ3RocyQxW251bSsrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAxODpcbiAgICAgICAgLyogcmVwZWF0IGNvZGUgbGVuZ3RoIDAgZm9yIDExLTEzOCB0aW1lcyAocmVhZCA3IGJpdHMpICovXG4gICAgICAgIGZvciAobGVuZ3RoID0gdGluZl9yZWFkX2JpdHMkMShkLCA3LCAxMSk7IGxlbmd0aDsgLS1sZW5ndGgpIHtcbiAgICAgICAgICBsZW5ndGhzJDFbbnVtKytdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvKiB2YWx1ZXMgMC0xNSByZXByZXNlbnQgdGhlIGFjdHVhbCBjb2RlIGxlbmd0aHMgKi9cbiAgICAgICAgbGVuZ3RocyQxW251bSsrXSA9IHN5bTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIGJ1aWxkIGR5bmFtaWMgdHJlZXMgKi9cblxuXG4gIHRpbmZfYnVpbGRfdHJlZSQxKGx0LCBsZW5ndGhzJDEsIDAsIGhsaXQpO1xuICB0aW5mX2J1aWxkX3RyZWUkMShkdCwgbGVuZ3RocyQxLCBobGl0LCBoZGlzdCk7XG59XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSBibG9jayBpbmZsYXRlIGZ1bmN0aW9ucyAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiBnaXZlbiBhIHN0cmVhbSBhbmQgdHdvIHRyZWVzLCBpbmZsYXRlIGEgYmxvY2sgb2YgZGF0YSAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfaW5mbGF0ZV9ibG9ja19kYXRhJDEoZCwgbHQsIGR0KSB7XG4gIHdoaWxlICgxKSB7XG4gICAgdmFyIHN5bSA9IHRpbmZfZGVjb2RlX3N5bWJvbCQxKGQsIGx0KTtcbiAgICAvKiBjaGVjayBmb3IgZW5kIG9mIGJsb2NrICovXG5cbiAgICBpZiAoc3ltID09PSAyNTYpIHtcbiAgICAgIHJldHVybiBUSU5GX09LJDE7XG4gICAgfVxuXG4gICAgaWYgKHN5bSA8IDI1Nikge1xuICAgICAgZC5kZXN0W2QuZGVzdExlbisrXSA9IHN5bTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGxlbmd0aCwgZGlzdCwgb2ZmcztcbiAgICAgIHZhciBpO1xuICAgICAgc3ltIC09IDI1NztcbiAgICAgIC8qIHBvc3NpYmx5IGdldCBtb3JlIGJpdHMgZnJvbSBsZW5ndGggY29kZSAqL1xuXG4gICAgICBsZW5ndGggPSB0aW5mX3JlYWRfYml0cyQxKGQsIGxlbmd0aF9iaXRzJDFbc3ltXSwgbGVuZ3RoX2Jhc2UkMVtzeW1dKTtcbiAgICAgIGRpc3QgPSB0aW5mX2RlY29kZV9zeW1ib2wkMShkLCBkdCk7XG4gICAgICAvKiBwb3NzaWJseSBnZXQgbW9yZSBiaXRzIGZyb20gZGlzdGFuY2UgY29kZSAqL1xuXG4gICAgICBvZmZzID0gZC5kZXN0TGVuIC0gdGluZl9yZWFkX2JpdHMkMShkLCBkaXN0X2JpdHMkMVtkaXN0XSwgZGlzdF9iYXNlJDFbZGlzdF0pO1xuICAgICAgLyogY29weSBtYXRjaCAqL1xuXG4gICAgICBmb3IgKGkgPSBvZmZzOyBpIDwgb2ZmcyArIGxlbmd0aDsgKytpKSB7XG4gICAgICAgIGQuZGVzdFtkLmRlc3RMZW4rK10gPSBkLmRlc3RbaV07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKiBpbmZsYXRlIGFuIHVuY29tcHJlc3NlZCBibG9jayBvZiBkYXRhICovXG5cblxuZnVuY3Rpb24gdGluZl9pbmZsYXRlX3VuY29tcHJlc3NlZF9ibG9jayQxKGQpIHtcbiAgdmFyIGxlbmd0aCwgaW52bGVuZ3RoO1xuICB2YXIgaTtcbiAgLyogdW5yZWFkIGZyb20gYml0YnVmZmVyICovXG5cbiAgd2hpbGUgKGQuYml0Y291bnQgPiA4KSB7XG4gICAgZC5zb3VyY2VJbmRleC0tO1xuICAgIGQuYml0Y291bnQgLT0gODtcbiAgfVxuICAvKiBnZXQgbGVuZ3RoICovXG5cblxuICBsZW5ndGggPSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4ICsgMV07XG4gIGxlbmd0aCA9IDI1NiAqIGxlbmd0aCArIGQuc291cmNlW2Quc291cmNlSW5kZXhdO1xuICAvKiBnZXQgb25lJ3MgY29tcGxlbWVudCBvZiBsZW5ndGggKi9cblxuICBpbnZsZW5ndGggPSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4ICsgM107XG4gIGludmxlbmd0aCA9IDI1NiAqIGludmxlbmd0aCArIGQuc291cmNlW2Quc291cmNlSW5kZXggKyAyXTtcbiAgLyogY2hlY2sgbGVuZ3RoICovXG5cbiAgaWYgKGxlbmd0aCAhPT0gKH5pbnZsZW5ndGggJiAweDAwMDBmZmZmKSkgcmV0dXJuIFRJTkZfREFUQV9FUlJPUiQxO1xuICBkLnNvdXJjZUluZGV4ICs9IDQ7XG4gIC8qIGNvcHkgYmxvY2sgKi9cblxuICBmb3IgKGkgPSBsZW5ndGg7IGk7IC0taSkge1xuICAgIGQuZGVzdFtkLmRlc3RMZW4rK10gPSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4KytdO1xuICB9XG4gIC8qIG1ha2Ugc3VyZSB3ZSBzdGFydCBuZXh0IGJsb2NrIG9uIGEgYnl0ZSBib3VuZGFyeSAqL1xuXG5cbiAgZC5iaXRjb3VudCA9IDA7XG4gIHJldHVybiBUSU5GX09LJDE7XG59XG4vKiBpbmZsYXRlIHN0cmVhbSBmcm9tIHNvdXJjZSB0byBkZXN0ICovXG5cblxuZnVuY3Rpb24gdGluZl91bmNvbXByZXNzJDEoc291cmNlLCBkZXN0KSB7XG4gIHZhciBkID0gbmV3IERhdGEkMShzb3VyY2UsIGRlc3QpO1xuICB2YXIgYmZpbmFsLCBidHlwZSwgcmVzO1xuXG4gIGRvIHtcbiAgICAvKiByZWFkIGZpbmFsIGJsb2NrIGZsYWcgKi9cbiAgICBiZmluYWwgPSB0aW5mX2dldGJpdCQxKGQpO1xuICAgIC8qIHJlYWQgYmxvY2sgdHlwZSAoMiBiaXRzKSAqL1xuXG4gICAgYnR5cGUgPSB0aW5mX3JlYWRfYml0cyQxKGQsIDIsIDApO1xuICAgIC8qIGRlY29tcHJlc3MgYmxvY2sgKi9cblxuICAgIHN3aXRjaCAoYnR5cGUpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgLyogZGVjb21wcmVzcyB1bmNvbXByZXNzZWQgYmxvY2sgKi9cbiAgICAgICAgcmVzID0gdGluZl9pbmZsYXRlX3VuY29tcHJlc3NlZF9ibG9jayQxKGQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAxOlxuICAgICAgICAvKiBkZWNvbXByZXNzIGJsb2NrIHdpdGggZml4ZWQgaHVmZm1hbiB0cmVlcyAqL1xuICAgICAgICByZXMgPSB0aW5mX2luZmxhdGVfYmxvY2tfZGF0YSQxKGQsIHNsdHJlZSQxLCBzZHRyZWUkMSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIC8qIGRlY29tcHJlc3MgYmxvY2sgd2l0aCBkeW5hbWljIGh1ZmZtYW4gdHJlZXMgKi9cbiAgICAgICAgdGluZl9kZWNvZGVfdHJlZXMkMShkLCBkLmx0cmVlLCBkLmR0cmVlKTtcbiAgICAgICAgcmVzID0gdGluZl9pbmZsYXRlX2Jsb2NrX2RhdGEkMShkLCBkLmx0cmVlLCBkLmR0cmVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJlcyA9IFRJTkZfREFUQV9FUlJPUiQxO1xuICAgIH1cblxuICAgIGlmIChyZXMgIT09IFRJTkZfT0skMSkgdGhyb3cgbmV3IEVycm9yKCdEYXRhIGVycm9yJyk7XG4gIH0gd2hpbGUgKCFiZmluYWwpO1xuXG4gIGlmIChkLmRlc3RMZW4gPCBkLmRlc3QubGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiBkLmRlc3Quc2xpY2UgPT09ICdmdW5jdGlvbicpIHJldHVybiBkLmRlc3Quc2xpY2UoMCwgZC5kZXN0TGVuKTtlbHNlIHJldHVybiBkLmRlc3Quc3ViYXJyYXkoMCwgZC5kZXN0TGVuKTtcbiAgfVxuXG4gIHJldHVybiBkLmRlc3Q7XG59XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSBpbml0aWFsaXphdGlvbiAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiBidWlsZCBmaXhlZCBodWZmbWFuIHRyZWVzICovXG5cblxudGluZl9idWlsZF9maXhlZF90cmVlcyQxKHNsdHJlZSQxLCBzZHRyZWUkMSk7XG4vKiBidWlsZCBleHRyYSBiaXRzIGFuZCBiYXNlIHRhYmxlcyAqL1xuXG50aW5mX2J1aWxkX2JpdHNfYmFzZSQxKGxlbmd0aF9iaXRzJDEsIGxlbmd0aF9iYXNlJDEsIDQsIDMpO1xudGluZl9idWlsZF9iaXRzX2Jhc2UkMShkaXN0X2JpdHMkMSwgZGlzdF9iYXNlJDEsIDIsIDEpO1xuLyogZml4IGEgc3BlY2lhbCBjYXNlICovXG5cbmxlbmd0aF9iaXRzJDFbMjhdID0gMDtcbmxlbmd0aF9iYXNlJDFbMjhdID0gMjU4O1xudmFyIHRpbnlJbmZsYXRlJDEgPSB0aW5mX3VuY29tcHJlc3MkMTtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkZihzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIFdPRkZGb250ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfVFRGRm9udCkge1xuICBfaW5oZXJpdHNMb29zZSRmKFdPRkZGb250LCBfVFRGRm9udCk7XG5cbiAgZnVuY3Rpb24gV09GRkZvbnQoKSB7XG4gICAgcmV0dXJuIF9UVEZGb250LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIFdPRkZGb250LnByb2JlID0gZnVuY3Rpb24gcHJvYmUoYnVmZmVyKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygnYXNjaWknLCAwLCA0KSA9PT0gJ3dPRkYnO1xuICB9O1xuXG4gIHZhciBfcHJvdG8gPSBXT0ZGRm9udC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9kZWNvZGVEaXJlY3RvcnkgPSBmdW5jdGlvbiBfZGVjb2RlRGlyZWN0b3J5KCkge1xuICAgIHRoaXMuZGlyZWN0b3J5ID0gV09GRkRpcmVjdG9yeS5kZWNvZGUodGhpcy5zdHJlYW0sIHtcbiAgICAgIF9zdGFydE9mZnNldDogMFxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5fZ2V0VGFibGVTdHJlYW0gPSBmdW5jdGlvbiBfZ2V0VGFibGVTdHJlYW0odGFnKSB7XG4gICAgdmFyIHRhYmxlID0gdGhpcy5kaXJlY3RvcnkudGFibGVzW3RhZ107XG5cbiAgICBpZiAodGFibGUpIHtcbiAgICAgIHRoaXMuc3RyZWFtLnBvcyA9IHRhYmxlLm9mZnNldDtcblxuICAgICAgaWYgKHRhYmxlLmNvbXBMZW5ndGggPCB0YWJsZS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zdHJlYW0ucG9zICs9IDI7IC8vIHNraXAgZGVmbGF0ZSBoZWFkZXJcblxuICAgICAgICB2YXIgb3V0QnVmZmVyID0gbmV3IGJ1ZmZlcl8xKHRhYmxlLmxlbmd0aCk7XG4gICAgICAgIHZhciBidWYgPSB0aW55SW5mbGF0ZSQxKHRoaXMuc3RyZWFtLnJlYWRCdWZmZXIodGFibGUuY29tcExlbmd0aCAtIDIpLCBvdXRCdWZmZXIpO1xuICAgICAgICByZXR1cm4gbmV3IHJlc3RydWN0dXJlLkRlY29kZVN0cmVhbShidWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHJldHVybiBXT0ZGRm9udDtcbn0oVFRGRm9udCk7XG5cbmZ1bmN0aW9uIEJyb3RsaUlucHV0KGJ1ZmZlcikge1xuICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgdGhpcy5wb3MgPSAwO1xufVxuXG5Ccm90bGlJbnB1dC5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChidWYsIGksIGNvdW50KSB7XG4gIGlmICh0aGlzLnBvcyArIGNvdW50ID4gdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgY291bnQgPSB0aGlzLmJ1ZmZlci5sZW5ndGggLSB0aGlzLnBvcztcbiAgfVxuXG4gIGZvciAodmFyIHAgPSAwOyBwIDwgY291bnQ7IHArKykge1xuICAgIGJ1ZltpICsgcF0gPSB0aGlzLmJ1ZmZlclt0aGlzLnBvcyArIHBdO1xuICB9XG5cbiAgdGhpcy5wb3MgKz0gY291bnQ7XG4gIHJldHVybiBjb3VudDtcbn07XG5cbnZhciBCcm90bGlJbnB1dF8xID0gQnJvdGxpSW5wdXQ7XG5cbmZ1bmN0aW9uIEJyb3RsaU91dHB1dChidWYpIHtcbiAgdGhpcy5idWZmZXIgPSBidWY7XG4gIHRoaXMucG9zID0gMDtcbn1cblxuQnJvdGxpT3V0cHV0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYsIGNvdW50KSB7XG4gIGlmICh0aGlzLnBvcyArIGNvdW50ID4gdGhpcy5idWZmZXIubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ091dHB1dCBidWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaCcpO1xuICB0aGlzLmJ1ZmZlci5zZXQoYnVmLnN1YmFycmF5KDAsIGNvdW50KSwgdGhpcy5wb3MpO1xuICB0aGlzLnBvcyArPSBjb3VudDtcbiAgcmV0dXJuIGNvdW50O1xufTtcblxudmFyIEJyb3RsaU91dHB1dF8xID0gQnJvdGxpT3V0cHV0O1xudmFyIHN0cmVhbXMkMSA9IHtcbiAgQnJvdGxpSW5wdXQ6IEJyb3RsaUlucHV0XzEsXG4gIEJyb3RsaU91dHB1dDogQnJvdGxpT3V0cHV0XzFcbn07XG5cbi8qIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cbiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiAgIEJpdCByZWFkaW5nIGhlbHBlcnNcbiovXG52YXIgQlJPVExJX1JFQURfU0laRSA9IDQwOTY7XG52YXIgQlJPVExJX0lCVUZfU0laRSA9IDIgKiBCUk9UTElfUkVBRF9TSVpFICsgMzI7XG52YXIgQlJPVExJX0lCVUZfTUFTSyA9IDIgKiBCUk9UTElfUkVBRF9TSVpFIC0gMTtcbnZhciBrQml0TWFzayA9IG5ldyBVaW50MzJBcnJheShbMCwgMSwgMywgNywgMTUsIDMxLCA2MywgMTI3LCAyNTUsIDUxMSwgMTAyMywgMjA0NywgNDA5NSwgODE5MSwgMTYzODMsIDMyNzY3LCA2NTUzNSwgMTMxMDcxLCAyNjIxNDMsIDUyNDI4NywgMTA0ODU3NSwgMjA5NzE1MSwgNDE5NDMwMywgODM4ODYwNywgMTY3NzcyMTVdKTtcbi8qIElucHV0IGJ5dGUgYnVmZmVyLCBjb25zaXN0IG9mIGEgcmluZ2J1ZmZlciBhbmQgYSBcInNsYWNrXCIgcmVnaW9uIHdoZXJlICovXG5cbi8qIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSByaW5nYnVmZmVyIGFyZSBjb3BpZWQuICovXG5cbmZ1bmN0aW9uIEJyb3RsaUJpdFJlYWRlcihpbnB1dCkge1xuICB0aGlzLmJ1Zl8gPSBuZXcgVWludDhBcnJheShCUk9UTElfSUJVRl9TSVpFKTtcbiAgdGhpcy5pbnB1dF8gPSBpbnB1dDtcbiAgLyogaW5wdXQgY2FsbGJhY2sgKi9cblxuICB0aGlzLnJlc2V0KCk7XG59XG5cbkJyb3RsaUJpdFJlYWRlci5SRUFEX1NJWkUgPSBCUk9UTElfUkVBRF9TSVpFO1xuQnJvdGxpQml0UmVhZGVyLklCVUZfTUFTSyA9IEJST1RMSV9JQlVGX01BU0s7XG5cbkJyb3RsaUJpdFJlYWRlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYnVmX3B0cl8gPSAwO1xuICAvKiBuZXh0IGlucHV0IHdpbGwgd3JpdGUgaGVyZSAqL1xuXG4gIHRoaXMudmFsXyA9IDA7XG4gIC8qIHByZS1mZXRjaGVkIGJpdHMgKi9cblxuICB0aGlzLnBvc18gPSAwO1xuICAvKiBieXRlIHBvc2l0aW9uIGluIHN0cmVhbSAqL1xuXG4gIHRoaXMuYml0X3Bvc18gPSAwO1xuICAvKiBjdXJyZW50IGJpdC1yZWFkaW5nIHBvc2l0aW9uIGluIHZhbF8gKi9cblxuICB0aGlzLmJpdF9lbmRfcG9zXyA9IDA7XG4gIC8qIGJpdC1yZWFkaW5nIGVuZCBwb3NpdGlvbiBmcm9tIExTQiBvZiB2YWxfICovXG5cbiAgdGhpcy5lb3NfID0gMDtcbiAgLyogaW5wdXQgc3RyZWFtIGlzIGZpbmlzaGVkICovXG5cbiAgdGhpcy5yZWFkTW9yZUlucHV0KCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB0aGlzLnZhbF8gfD0gdGhpcy5idWZfW3RoaXMucG9zX10gPDwgOCAqIGk7XG4gICAgKyt0aGlzLnBvc187XG4gIH1cblxuICByZXR1cm4gdGhpcy5iaXRfZW5kX3Bvc18gPiAwO1xufTtcbi8qIEZpbGxzIHVwIHRoZSBpbnB1dCByaW5nYnVmZmVyIGJ5IGNhbGxpbmcgdGhlIGlucHV0IGNhbGxiYWNrLlxuXG4gICBEb2VzIG5vdGhpbmcgaWYgdGhlcmUgYXJlIGF0IGxlYXN0IDMyIGJ5dGVzIHByZXNlbnQgYWZ0ZXIgY3VycmVudCBwb3NpdGlvbi5cblxuICAgUmV0dXJucyAwIGlmIGVpdGhlcjpcbiAgICAtIHRoZSBpbnB1dCBjYWxsYmFjayByZXR1cm5lZCBhbiBlcnJvciwgb3JcbiAgICAtIHRoZXJlIGlzIG5vIG1vcmUgaW5wdXQgYW5kIHRoZSBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS5cblxuICAgQWZ0ZXIgZW5jb3VudGVyaW5nIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmVhbSwgMzIgYWRkaXRpb25hbCB6ZXJvIGJ5dGVzIGFyZVxuICAgY29waWVkIHRvIHRoZSByaW5nYnVmZmVyLCB0aGVyZWZvcmUgaXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXJcbiAgIGV2ZXJ5IDMyIGJ5dGVzIG9mIGlucHV0IGlzIHJlYWQuXG4qL1xuXG5cbkJyb3RsaUJpdFJlYWRlci5wcm90b3R5cGUucmVhZE1vcmVJbnB1dCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYml0X2VuZF9wb3NfID4gMjU2KSB7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKHRoaXMuZW9zXykge1xuICAgIGlmICh0aGlzLmJpdF9wb3NfID4gdGhpcy5iaXRfZW5kX3Bvc18pIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgJyArIHRoaXMuYml0X3Bvc18gKyAnICcgKyB0aGlzLmJpdF9lbmRfcG9zXyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGRzdCA9IHRoaXMuYnVmX3B0cl87XG4gICAgdmFyIGJ5dGVzX3JlYWQgPSB0aGlzLmlucHV0Xy5yZWFkKHRoaXMuYnVmXywgZHN0LCBCUk9UTElfUkVBRF9TSVpFKTtcblxuICAgIGlmIChieXRlc19yZWFkIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCcpO1xuICAgIH1cblxuICAgIGlmIChieXRlc19yZWFkIDwgQlJPVExJX1JFQURfU0laRSkge1xuICAgICAgdGhpcy5lb3NfID0gMTtcbiAgICAgIC8qIFN0b3JlIDMyIGJ5dGVzIG9mIHplcm8gYWZ0ZXIgdGhlIHN0cmVhbSBlbmQuICovXG5cbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgMzI7IHArKykge1xuICAgICAgICB0aGlzLmJ1Zl9bZHN0ICsgYnl0ZXNfcmVhZCArIHBdID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZHN0ID09PSAwKSB7XG4gICAgICAvKiBDb3B5IHRoZSBoZWFkIG9mIHRoZSByaW5nYnVmZmVyIHRvIHRoZSBzbGFjayByZWdpb24uICovXG4gICAgICBmb3IgKHZhciBwID0gMDsgcCA8IDMyOyBwKyspIHtcbiAgICAgICAgdGhpcy5idWZfWyhCUk9UTElfUkVBRF9TSVpFIDw8IDEpICsgcF0gPSB0aGlzLmJ1Zl9bcF07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnVmX3B0cl8gPSBCUk9UTElfUkVBRF9TSVpFO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1Zl9wdHJfID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLmJpdF9lbmRfcG9zXyArPSBieXRlc19yZWFkIDw8IDM7XG4gIH1cbn07XG4vKiBHdWFyYW50ZWVzIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0IDI0IGJpdHMgaW4gdGhlIGJ1ZmZlci4gKi9cblxuXG5Ccm90bGlCaXRSZWFkZXIucHJvdG90eXBlLmZpbGxCaXRXaW5kb3cgPSBmdW5jdGlvbiAoKSB7XG4gIHdoaWxlICh0aGlzLmJpdF9wb3NfID49IDgpIHtcbiAgICB0aGlzLnZhbF8gPj4+PSA4O1xuICAgIHRoaXMudmFsXyB8PSB0aGlzLmJ1Zl9bdGhpcy5wb3NfICYgQlJPVExJX0lCVUZfTUFTS10gPDwgMjQ7XG4gICAgKyt0aGlzLnBvc187XG4gICAgdGhpcy5iaXRfcG9zXyA9IHRoaXMuYml0X3Bvc18gLSA4ID4+PiAwO1xuICAgIHRoaXMuYml0X2VuZF9wb3NfID0gdGhpcy5iaXRfZW5kX3Bvc18gLSA4ID4+PiAwO1xuICB9XG59O1xuLyogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cyBmcm9tIFJlYWQgQnVmZmVyLiAqL1xuXG5cbkJyb3RsaUJpdFJlYWRlci5wcm90b3R5cGUucmVhZEJpdHMgPSBmdW5jdGlvbiAobl9iaXRzKSB7XG4gIGlmICgzMiAtIHRoaXMuYml0X3Bvc18gPCBuX2JpdHMpIHtcbiAgICB0aGlzLmZpbGxCaXRXaW5kb3coKTtcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzLnZhbF8gPj4+IHRoaXMuYml0X3Bvc18gJiBrQml0TWFza1tuX2JpdHNdO1xuICB0aGlzLmJpdF9wb3NfICs9IG5fYml0cztcbiAgcmV0dXJuIHZhbDtcbn07XG5cbnZhciBiaXRfcmVhZGVyID0gQnJvdGxpQml0UmVhZGVyO1xuXG52YXIgYnl0ZUxlbmd0aF8xJDEgPSBieXRlTGVuZ3RoJDE7XG52YXIgdG9CeXRlQXJyYXlfMSQxID0gdG9CeXRlQXJyYXkkMTtcbnZhciBmcm9tQnl0ZUFycmF5XzEkMSA9IGZyb21CeXRlQXJyYXkkMTtcbnZhciBsb29rdXAkMSA9IFtdO1xudmFyIHJldkxvb2t1cCQxID0gW107XG52YXIgQXJyJDEgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXk7XG52YXIgY29kZSQxID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG5mb3IgKHZhciBpJDQgPSAwLCBsZW4kMSA9IGNvZGUkMS5sZW5ndGg7IGkkNCA8IGxlbiQxOyArK2kkNCkge1xuICBsb29rdXAkMVtpJDRdID0gY29kZSQxW2kkNF07XG4gIHJldkxvb2t1cCQxW2NvZGUkMS5jaGFyQ29kZUF0KGkkNCldID0gaSQ0O1xufSAvLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5cblxucmV2TG9va3VwJDFbJy0nLmNoYXJDb2RlQXQoMCldID0gNjI7XG5yZXZMb29rdXAkMVsnXycuY2hhckNvZGVBdCgwKV0gPSA2MztcblxuZnVuY3Rpb24gZ2V0TGVucyQxKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aDtcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKTtcbiAgfSAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG5cblxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpO1xuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlbjtcbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW4gPyAwIDogNCAtIHZhbGlkTGVuICUgNDtcbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXTtcbn0gLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCQxKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMkMShiNjQpO1xuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdO1xuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXTtcbiAgcmV0dXJuICh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCAtIHBsYWNlSG9sZGVyc0xlbjtcbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGgkMShiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCAtIHBsYWNlSG9sZGVyc0xlbjtcbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkkMShiNjQpIHtcbiAgdmFyIHRtcDtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zJDEoYjY0KTtcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXTtcbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV07XG4gIHZhciBhcnIgPSBuZXcgQXJyJDEoX2J5dGVMZW5ndGgkMShiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKTtcbiAgdmFyIGN1ckJ5dGUgPSAwOyAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG5cbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDAgPyB2YWxpZExlbiAtIDQgOiB2YWxpZExlbjtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID0gcmV2TG9va3VwJDFbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4IHwgcmV2TG9va3VwJDFbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMiB8IHJldkxvb2t1cCQxW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNiB8IHJldkxvb2t1cCQxW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV07XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgPj4gMTYgJiAweEZGO1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wID4+IDggJiAweEZGO1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRjtcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPSByZXZMb29rdXAkMVtiNjQuY2hhckNvZGVBdChpKV0gPDwgMiB8IHJldkxvb2t1cCQxW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNDtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkY7XG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID0gcmV2TG9va3VwJDFbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwIHwgcmV2TG9va3VwJDFbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0IHwgcmV2TG9va3VwJDFbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyO1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wID4+IDggJiAweEZGO1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRjtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCQxKG51bSkge1xuICByZXR1cm4gbG9va3VwJDFbbnVtID4+IDE4ICYgMHgzRl0gKyBsb29rdXAkMVtudW0gPj4gMTIgJiAweDNGXSArIGxvb2t1cCQxW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXAkMVtudW0gJiAweDNGXTtcbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmskMSh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wO1xuICB2YXIgb3V0cHV0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYgJiAweEZGMDAwMCkgKyAodWludDhbaSArIDFdIDw8IDggJiAweEZGMDApICsgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpO1xuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCQxKHRtcCkpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSQxKHVpbnQ4KSB7XG4gIHZhciB0bXA7XG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGg7XG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMzsgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcblxuICB2YXIgcGFydHMgPSBbXTtcbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODM7IC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmskMSh1aW50OCwgaSwgaSArIG1heENodW5rTGVuZ3RoID4gbGVuMiA/IGxlbjIgOiBpICsgbWF4Q2h1bmtMZW5ndGgpKTtcbiAgfSAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG5cblxuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdO1xuICAgIHBhcnRzLnB1c2gobG9va3VwJDFbdG1wID4+IDJdICsgbG9va3VwJDFbdG1wIDw8IDQgJiAweDNGXSArICc9PScpO1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXTtcbiAgICBwYXJ0cy5wdXNoKGxvb2t1cCQxW3RtcCA+PiAxMF0gKyBsb29rdXAkMVt0bXAgPj4gNCAmIDB4M0ZdICsgbG9va3VwJDFbdG1wIDw8IDIgJiAweDNGXSArICc9Jyk7XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJyk7XG59XG5cbnZhciBiYXNlNjRKcyQxID0ge1xuICBieXRlTGVuZ3RoOiBieXRlTGVuZ3RoXzEkMSxcbiAgdG9CeXRlQXJyYXk6IHRvQnl0ZUFycmF5XzEkMSxcbiAgZnJvbUJ5dGVBcnJheTogZnJvbUJ5dGVBcnJheV8xJDFcbn07XG5cbnZhciBkaWN0aW9uYXJ5X2JpbiA9IFwiVzUvZmNRTG41Z0tmMlhVYkFpUTFYVUxYK1RaejZBRFRvRHNncWs2cVZmZUMwZTRtNk9PMndjUTFKNzZaQlZSVjFmUmtFc2R1Ly82MnpRc0ZFWldTVENuTWhjc1FLbFMycU9odVZZWU1HQ2tWMGZYV0VvTUZiRVNYcktFWjl3ZFVFc3l3OWc0YkpsRXQxWTZvVk14TVJURVZiQ0l3WnpKemJvSzVqOG00WUgwMnFnWFlodjFWK1BNNDM1c0xWeHlISmloYUpSRUVoWkdxTDAzdHhHRlFMbTc2Y2FHTy9vdnhLdnpDYnkvM3ZNVHRYLzQ1OWYwaWdpN1d1dG5LaU1RNndPRFNvUmgvOEx4MVYzUTk5TXZLdHdCNmJIZEVSWVJZMGhTdEpvTWpOZVRzTlg3Ym4rWTdlNEVRM2JmOHhCYzdMMEJzeWZGUEs0M2RHU1hwTDZjbFlDL0kzMjhoNTQvVllyUTVpMDY0OEZnYkd0bDgzN3N2SjM1TDNNb3QvK25QbE5wV2dLeDFnR1hRWXFYNm4rYmJaN3d1eUNIS2NVb2sxMlhqcXViN05YWkd6cUJ4MFNEK3V6aU5mODd0N3ZlNDJqeFNLUW9XM255eFZyV0lHbEZTaGhDS3hqcFpaNU1lR25hMCtsQmtrK2thTjhGOXFGQkFGZ0VvZ3lNQmRjWC9UMVcvV25NT2kvN3ljV1VRbG9FQktHZUM0OE1raXdxSmtKTysxMmVRaU9GSE1tY2s2cS9JaldXM1JabGFueTIzVEJtK2NOci84NC9vaTVHR21HQlpXclo2ait6eWtWb3p6NWZUL1FIL0RhNldUYlpZWVB5blZOTzdreHp1Tk4ya3hLS1djaGU1V3ZlaXRQS0FlY0I4WWNBSHovK3pYTGpjTHprZERTa3ROSUR3WkU5SjlYK3R0bzQzb0p5NjV3QXBNM21Eell0Q3dYOWxNK041VlIza1hZbzBaM3QwVHRYZmdCRmc3Z1U4b04wRGdsN2ZabFViaE5sbCswdXVvaFJWS2pyRWQ4ZWdyU25keTUvVGdkMmdxakE0Q0FWdUM3RVNVbUwzRFpvR25maFFWOHV3bnBpOEVHdkFWVnNvd05SeFB1ZGNrNytvcUFVRGt3Wm9wV3FGblcxcmlzczB0MXo2aUNJU1ZLcmVZR052UWNYdisxTDkramJQOGNkL2RQVWlxQnNvMnErN1p5RkJ2RU5Da2tWcjQ0aXlQYnRPb09vQ2VjV3NpdXFNU01MNWx2K3ZONU16VXIrRG5oNzNHN1ExWW5SWUpWWVhIUkphTkFPQnlpYUs2Q3VzZ0ZkQlBFNDByMHJ2cVhWN3Rrc0tPMkRySFlYQlR2OFA1eXNxeEV4OFZEWFVERHFrUEg2Tk5PVi9hMldIOHpsa1hSRUxTYThQK2hlTnlKQkJQN1Bnc0cxRXRXdE5lZjYvaStsY2F5elF3UUNzZHVpZHBiS2ZoV1VEZ0FFbXloR3UvelZUYWNJNlJTMHpUQUJyT1l1ZWVtblZhMTl1OWZUMjNOL1RhNlJ2VHBvZjVEV3lncXJlQ3FyREFnTTRMSUQxKzFUL3RhVTZ5VEZWTHFYT3YrL011UU9GbmFGOHZMTUtEN3RLV0RvQmRBTGd4RjMzelFjY0NjZEh4OGZLSVZkVzY5TzdxSHRYcGVHcjlqYmJwRkErcVJNV3I1aHAwczY3RlBjN0hBaUxWMGcwL3BlWmxXN2hKUFlFaFp5aHBTd2FobmY5My90WmdmcVpXWEZkbWRYQnpxeEdITHJRS3hvQVk2ZlJvQmhnQ1JQbW1HdWVZWjVKZXhUVkRLVUlYemtHL2ZxcC8wVTNoQWdRZEo5enVtdXRLNm5xV2JhcXZtMXBndTAzSVlSK0crOHMwakRCQno4Y0FwWkZTQmV1V2FzeXFvMk9NREtBWkNvelMrR1dTdkwvSHNFOXJIeG9vZTE3VTNzL2xURStWWkFrNGozZHA2dUlHYUMwSk1pcVI1Q1VzYWJQeU0wZE9ZRFI3RWE3aXA0VVNabHlhMzhZZlB0dnJYL3RCbGhIaWxqNTVuWjFuZk4yNEFPQWk5QlZ0ei9NYm44QUVESkNxSmdzVlVhNm5RblN4djJGczdsL05sQ3pwZllFam1Qck55aWIvK3QwZWkyZUVNanZOaExrSENabGNpNFdoQmU3ZVBaVG16WXFsWTkrMXB4dFM0R0IrNWxNMUJIVDl0UzI3MEVXVURZRnExSTB5WS9mTmlBazRiazl5QmdtZWYvZjJrNkFsWVFaSHNORm5XOHdCUXhDZDY4aVd2Ny8zNWJYZnozSlptZkdsaWdXQUtSaklzM0lwenhRMjd2QWdsSFNpT3pDWXpKOUw5QTFDZGl5RnZ5UjY2dWNBNGpLaWZ1NWVod0VSMjZ5VjdIaktxbjVNZm96bzdDb3h4dDhMV1dQVDQ3QmVNeFg4cDBQamI3aFpuKzZidzd6M0x3Kzc2NTNqNXNJOENMdTVrVGhwTWxqMW00YzJjaDNqR2NQMUZzVDEzdnVLM3FqZWNLVFprMmtIY09aWTQwVVgrcWRheHN0WnFzcVFxZ1h6K1FHRjk5WkpMcXIzVll1NGFlY2wxQWI1R21xUzhrL0dWNWI5NXp4UTVkNEVmWFVKNmtUUy9DWEYvYWlxS0RPVDFUN0p6NXowUHdEVWN3cjljbExOMU9KR0NpS2ZxdmFoK2gzWHpyQk9pTE9XOHd2bjhnVzZxRTh2UHhpK0VmditVSDU1VDdQUUZWTWg2Y1oxcFpRbHpKcEtaN1A3dVd2d1BHSjZEVGxSNndieWozSXYySHllZm5Sby9kdjdkTngrcWFhME4zOGlCc1IrK1VpbDdXZDRhZndETnNyekRBSzRmWFp3dkVZL2pkS3VJS1hsZnJRZDJDMzlkVzdudG5SYklwOU90R3k5cFBCbi9WMkFTb2kvMlVKWmZTK3h1R0xIOGJuTHVQbHpkVE5TNnpkeWs4RHQvaDZzZk9XNW15eGgxZit6ZjN6WjNNWC9tTzljUVBwNXBPeDk2N1pBNi9wcUh2Y2xOZm5VRkYrcnErVmQ3YWxLcjZLV1BjSURocG42djJLNk5sVXU2THJLbzhiL3BZcFUvR2F6ZnZ0d2huN3RFT1V1WGh0NXJVSmRTZjZzTGpZZjBWVFlEZ3dKODF5YXFLVFVZZWovdGJIY2tTUmIvSFppY3dHSnFoMW1BSEIvSXVOczlkYzl5dXZGM0Q1WG9jbTNlbFdGZHE1b0V5NzBkWUZpdDc5eWFMaU5qUGo1VVVjVm1aVVZoUUVoVzVWMlo2Q200SFZIL1I4cWxhbVJZd0JpbGV1aDA3Q2JFY2UzVFhhMkptWFdCZitvenQzMTlwc2Jvb2JlWmhWbndoTVp6T2VRSnpocFREYlA3MVR2OEh1Wnh4VUkvK21hM1hXNkRGRERzNCtxbXBFUndIR0JkMmVkeHdVS2xPRFJkVVdaL2cwR09lenJiek9aYXVGTWFpNFFVNkdWSFY2YVBOQmlCbmRIU3NWNEl6cHZVaWlZeWc2T3l5ckw0RGo1cS9MdzNONWtBd2Z0RVZsOXJOZDdKazVQRGlqMmhUSDZ3SVhuc3lYa0tlUHhibUhZZ0M4QTZhbjVGb2IvS0g1R3RDMGw0ZUZzbytWcHhlZHRKSGRIcE5tK0J2eTRDNzl5Vk9rclpzTHJRM09IQ2VCMFJhK2tCSVJsZFVHbERDRW1xMlJ3WG5meWg2RHorYWxrNmVmdEkybjZzYXN0UnJHd2J3c3pCZURSUy9GYS9Ld1JKa0N6VHNMci9KQ3M1aE9QRS9NUExZZFoxRjFmdjdEK1ZteXNYNk5wT0M4YVU5RjRRczZIdkR5VXk5UHZGR0RLWi9QNTEwMVRZSEZsOHBqajZ3bS9xeVM3NWV0WmhoZmcwVUVMNE9ZbUhrNm02ZE8xOTJBem9JeVBTVjlRZWREQTRNbDIzclJicXhNUE14ZjdGSm5EYzVGVEVsVlMvUHlxZ2VQem13VloyNk5XaFJEUStvYVQ3bHk3ZWxsNHMzRHlwUzFzMGcrdE9yN1hIcnJrWmo5K3gvbUpCdHRyTHg5OGxGSWFSWnpIejRhQzdyNTIvSlE0VmpIYWhZMi9ZVlhabi9RQzJ6dFFiL3NZM3VSbHljNXZRUzhuTFBHVC9uMjc0OTVpOEhQQTE1Mno3Rmg1YUZweW4xR1BKS0h1UEw4SXc5NER1VzNLamtVUkFXWlhuNEVReTg5eGlLRUhOMW1rL3RrTTRnWURCeHdOb1l2UmZFNkxGcXN4V0p0UHJER2JzbkxNYXAzS2EzTVVveXRXMGN2aWVvek9tZEVSbWhjcXpHKzNIbVp2MnlaZWlJZVFUS0dkUlQ0SEhOeGVrbTF0WSsvbjA2ckdtRmxlcUxzY1NFUnpjdFRLTTZHOVAwUGMxUm1WdnJhc2NJeGFPMUNRQ2lZUEUxNWJEN2MzeFNlVzdnWHhZamd4Y3JVbGNiSXZPMHIrWXBsaHgwa1R0M3FhZkRPbUZ5TWpnR3hYdTczcmRkTUhwVjF3TXVieUFHY2YvdjVkTHI1UDcyVGE5bEJGK2Z6TUpyTXljd3YrOXZuVTNBTklsMWNIOXRmVzdhZjh1MC9IRzB2VjQ3ak5GWHpGVHRhaGExeHZ6ZS9zOEtNdENZdWNYYzFuemZkL01ReWRVWG4vYjcyUkJ0NXdPLzNqUmNNSDlCZGhDL3ljdEtCSXZlUllQck5wRFdxQnNPOFZNbVArV3ZSYU9jQTR6Uk1SMVB2U29POTJyUzdwWUV2K2ZaZkVmVE16RWRNKzZYNXRMbHl4RXhocUxSa21zNUV1TG92TGZ4NjZkZTVmTDIveVgwMkg1MkZQVndhaHJQcW1OL0Uwb1ZYbnNDS2hiaS95UnhYODNuUmJVS1doelljZVhPbnRmdVhuNTFOc3pKNk1PNzNwUWY1UGw0aW4zZWM0SlU4aEY3cHBWMzQrbW05cjFMWTBlZS9pMU8xd3BkOCt6Zkx6dEUwY3FCeGdnaUJpNUJ1OTV2OWwzcjlyL1U1aHdlTG4rVGJmeG93cldEcWRKYXVLZDgrcS9kSDhzYlBrYzl0dHV5Tzk0ZjcvWEsvbkhYNDZNUEZMRWI1cVFsTlB2aEo1MC81OXQ5ZnQzTFh1N3VWYVdhTzJiRHJEQ25SU3paeVd2Rkt4TzErdlQ4TXd3dW5SM2JYMENrZlBqcWI0SzlPMTl0bjVYNTBQdm1ZcEV3SHRpVzlXdHp1Vi9zNzZCMXp2TExOa1ZpTmQ4eVN4SWwvM29yZnFQOTBUeVRHYWY3L3J4OGpRemVISlhkbWgvTjZZRHZidm1UQndDZHhmRVExTmNMNndOTWRTSVhOcTdiMUVVelJ5MS9BeHN5azVwMjJHTUcxYitHeEZnYkhFclpoOTJ3dXZjbzBBdU9MWGN0OWh2dzJudy9McUljRFJSbUptbVp6Y2dVYTdKcE0vV1YvUzlJVWZiRjU2VEwyb3J6cXdlYmRSRDhuSVlOSjQxRC9oejM3Rm8xMXAyWTIxd3pQY243MTNxVkdocXRldlN0WWZHSDRuNjlPRUp0UHZiYkxZV3ZzY0RxYzNIZ251MTY2K3RBeUxueHJYMFk1em9ZalYrKzFzSTd0NWtNcjAyS1QvK3V3dGtjK3JaTE9mL3FuL3MzbllDZjEzRGc4L3NCMmRpSmdqR3FqUStUTGh4Ynp5dWUyT2I3WDYvOWxVd1c3YStsYnpuSHpPWXk4TEtXMUMvdVJQYlFZM0tXLzBnTzlMWHVuSEx2UEw5N2FmYmE5YkZ0YzlobXo3R0F0dGpWWWxDdlFBaU93QWsvZ0M1K2hrTEVzNnRyM0FaS3hMSnRPRXdrMmRMeFRZV3NJQi9qL1RvV3RJV3pvOTA2RnJTRzhpYXFxcXFxcWlJaUlpQWd6TXpNek56K0F5SyswMS96aThuOFMrWTFNam9SYVE4MFdVL0c4TUJsTys1M1ZQWEFOcldtNHd6R1VWWlVqakJKWlZkaHBjZmtqc21jV2FPK1VFbGRYaTFlK3pxK0hPc0Nwa25Zc2h1aDhwT0xJU0p1bjdUTjBFSUdXMnhUbmxPSW1lZWNub0dXNHJheGUyRzFUM0hFdmZZVVlNaEcrZ0FGT0F3aDVuSzhtWmh3Sk1tTjdyMjI0UVZzTkZ2Wjg3WjBxYXR2a25rbHlQREszSHk0NVBnVktYamk1MldlbjRkNFBsRlZWWUduTmFwK2ZTcEZiSzkwclluaFVjNm45MVEzQVk5RTB0Sk9GcmNmWnRtLzQ5MVhiY0cvanNWaVVQUFg3NnFtZXVpeitxWTFIazcvMVZQTTQwNXpXVnVvaGVMVWltcFdZZFZ6Q21VZEtIZWJNZHpncllyYjhtTDJlZUxTblJXSGRvbmZaYThSc09VOUYzN3crNTkxbDVGTFlIaU9xV2VIdEUvbFdyQkhjUktwM3VodHI4eVhtOExVLzVtcytOTTZaS3NxdTkwY0ZaNG81OCtrNHJkcnRCOTdOQURGYndtRUc3bFhxdmlyaE9UT3FVMTR4dVVGMm15SWpVUmNQSHJQT1E0bG1NM1BlTWc3YlV1azBublppNjdiWHNVNkg4bGhxSW84VGFPckVhZkNPMUFSSzlQakMwUU9vcTJCeG1NZGdZQjlHL2xJYjkrK2ZxTkoyczdCSEdGeUJObVpBUjhKM0tDbzAxMmlrYVNQOEJDcmY2VkkwWDV4ZG5iaEhJTytCNXJiT3lCNTR6WGt6Zk9ieUo0ZWN3eGZxQkpNTEZjN201OXJOY3c3aG9IbkZaMGIwMHplZStnVHF2am02MVBiNHhuMGtjRFg0anZITTByQlhaeXBHM0RDS25EL1dhYS9adEhtdEZQZ081ZUVUeCtrN1JyVmczYVN3bTJZb05YbkNzM1hQUURoTm4rRmlhNklsT091SUc2VkpIN1RQNmF2YTI2ZWhLSFFhMlQ0TjB0Y1o5ZFBDR28zWmRuTmx0c0hRYmVZdDV2UG5KZXpWL2NBZU55cGRtbDF2Q0hJOE04MW5TUlA1UWkyK21JOHYvc3hpWnJ1OTE4N25SdHAzZi80Mk5lbWNPTmErNGVWQzNQQ1p6Yzg4YVpoODUxQ3FTc3NoZTcwdVB4ZU4vZG1Zd2x3YjN0cndNck4xR3E4amJuQXBjVkR4L3lEUGVZczUvN3I2MnRzUTZsTGcrRGlGWFRFaHpSOWRIcXYwaVQ0dGdqODI1VytIM1hpUlVOVVpUMmtSOVJpMCtscCtVTTNpUXRTOHVPRTIzTHk0S1l0dnFIMTNqZ2hVbnRKUkFld3V6TkxEWHA4UnhkY2FBM2NNWTZUTzJJZVNGUlhlemVXSWpDcXloc1VkTVl1Q2dZVFpTS3BCeXBlMXpSZnE4RnNodmZCUGM2QkFRV2w3L1F4SURwM1ZHbzFKM3ZuNDJPRXMzcXpud3MrWUxSWGJ5bXlCMTlhOVhCeDZuL293Y3l4bEVZeUZXQ2kra0c5RitFeUQvNHluODArYWdhWjlQN2F5MkRueTk5YUsybzkxRmtmRU9ZOGhCd3lmaTV1d3gyeTVTYUhtRytvcS96bDFGWC84aXJPZjhZM3ZBY1gvNnVMUDZBNm52TU8yNGVkU0dQalFjODI3UncyYXRYK3oyYktxMENtVzltT3RZbnI1L0FmRGExWmZQYVhuS3RsV2JvcnVwN1FZeCtPcjJ1V2IrTjNOLy8yK3lEY1hNcUlKZGY1NXhsNy92c2o0V29QUGx4THh0VnJrSjR3L3RUZTNtTGRBVE9PWXd4Y3E1Mnc1V3h6NU1iUGRWczVPOC9saGZFN2RQajBiSWlQUTNRVjBpcW00bTNZWDhoUmZjNmpRM2ZXZXBldk1xVURKZDg2WjR2d000MENXSG5uK1dwaHNHSGZpZUYwMkQzdG1adnBXRCtrQnBOQ0ZjTG5aaGNtbXJocEd6emJkQStzUTFhcjE4T0pEODdJT0tPRm9STnpuYUhQTkhVZlVOaHZZMWlVK3VodkV2cEtIYVVuM3FLM2V4VlZ5WDRqb2lwcDN1bTdGbVlKV21BK1diSURzaFJwYlZSeDUvbnFzdENneTg3RkdiZlZCOHlER0NxUysycUNzblJ3blNBTjZ6Z3p4ZmRCMm5CVC92WjQvNnV4YjZvSDhiNFZCUnhpSUI5M3dMYTQ3aEczdzJTTC8yWjI3eU9YSkZ3WnBTSmFCWXl2YWpBN3ZSUllOS3FsalhLcHQvQ0ZEL3RTTXIxOERLS2J3QjB4Z2dCZVBhdGwxbmtpMHl2cVc1emNobHlabUowT1R4SjNEK2ZzWUpzL214WU41K0xlNW9hZ3RjbCtZc1Z2eThrU2pJMllHdkdqdm1wa1JTOVcyZHRYcVduVnV4VWhVUm0xbEt0b3UvaGRFcTE5VkJwOU9qR3ZIRVFTbXJwdWYyUjI0bVhHaGVpbDhLZWlBTlk4ZlcxVkVSVWZCSW1iNjRqMTJjYUJabVJWaVpIYmVWTWpDclBEZzlBOTBJWHJ0bnNZQ3VadFJRMFB5cktEakJOT3NQZktzZzFwQTAyZ0hsVnIwT1hpRmh0cDZuSnFYVnpjYmZNMEtuekMzZ2dPRU5QRTlWQmRtSEtONkxZYWlqYjR3WHhKbjVBMEZTREY1aitoMW9vWng4ODVKdDNaS3pPNW43WjVXZk5FT3R5eVBxUUVubjdXTHY1RmlzM1BkZ01zaGpGMUZSeWRiTnllQmJ5S0kxb04xVFJWclZLN2tnc2IvempYNE5EUElSTWN0VmVheFZCMzhWaDF4NUtiZUpiVTEzOEFNNUt6bVp1M3VueTBFcnlneGlKRjdHVlhVclB6RnhybHgxdUZkQWFaRkROOWN2SWI3NHFEOXR6Qk1vN0w3V0lFWUsrc2xhMURWTUhwRjBGN2IzK1k2Uyt6anZMZURNQ3BhcG1KbzF3ZUJXdXhLRjNyT29jaWgxZ3VuNEJvSmgxa1duVi9KbWlxNnVPaEszVmZLeEVIRWthZmpMZ0szb3VqYVB6WTZTWGc4cGhoTDRUTlIxeHZKZDFXYTBhWUZmUFVNTHJOQkRDaDRBdUdSVGJ0S01jNloxVWRqOGV2WS9acEN1TUFVZWZkbzY5RFpVbmdvcUUxUDlBM1BKZk9mN1dpeENFaitZNnQ3ZlllSGJieFVBb0ZWM004OWNDS2ZtYTNmYzEraktSZTdNRldFYlFxRWZ5ek8yeC93ck8yVllIN2lZZFE5QmtQeUk4LzNrWEJwTGFDcFU3ZUMwWXYvYW0vdEVEdTdIWnBxZzBFdkhvMG5mL1IvZ1J6VVd5MzMvSFhNSlFldTFHeWxLbU9rWHpsQ2ZHRnJ1QWNQUGhhR3FaT3R1MTl6c0oxU08ySno0WnR0aDVjQlg2bVJRd1dtRHdyeUc5RlVNbFp6TmNrTWRLK0lvTUp2MXJPV25CYW1TMncyS0hpYVBNUExDMTVoQ1ptNEtUcG9aeWo0RTJUcUMvUDZyNy9FaG5ETWhLaWNaWjFad3h1QzdEUHpER3M1M3E4Z1hhSTlrRlRLKzJMVHE3Ymh3c1Rick1WOFJzZnVhNWxNUzBGd2JUaXRVVm5WYTF5VGI1SVg1MW1tWW5VY1A5d1ByOEppMXRpWUplSlY5R1pUclFoRjd2dmRVMk9UVTQyb2dKOUZEd2hteWNJMkxJZysrMDNDNnNjWWhVeVV1TVY1dGt3NmtHVW9MK21qTkMzOCt3TWRXTmxqbjZ0R1BwUkVTN3ZlcXJTbjVUUnV2K2RoNkpWTC9pREhVMWRiNGM5V0szKytPckgzUHF6aUY5MTZVTVVLbjhHNjduTjYwR2ZXaUhyWFloVUczeVZXbXlZYWs1OU5Iajh0MXNtRzRVRGlXejJyUEhOcktuTjRabzFMQmJyMi9lRjlZWjBuMGJseDJuRzRYK0VLRnh2UzNXMjhKRVNEK0ZXazYxVkNEM3ovVVJHSGlKbCsrN1RkQndrQ2o2dEdPSDNxRGIwUXFjT0Y5S3pwajBIVWIvS3lGVzNZaGoyVk1LSnFHWmxlRkJIN3ZxdmY3V3FMQzNYTXVIVjhxOGE0c1RGdXhVdGtELzZKSUJ2S2FWanY5Nm5kZ3J1S1oxay9CSHpxZjJLOWZMazdIR1hBTnlMRGQxdnhrSy9pMDU1cG56bCt6dzZ6TG53WGxWWVZ0Zm1hY0pnRXBSUDFoYkdncllQVk42djJsRytpZFFOR213Y0tYdS84eEVqL1A2cWUvc0IyV213TnA2cHA4amFJU01rd2RsZUZYWUs1NU5IV0xUVGJ1dFNVcWpCZkRHV28vWWc5MThxUSs4QlJaU0FIWmJmdU5aejJPMHNvdjFVZTRDV2xWZzNyRmhNM0tsamo5a3NHZC9OVWhrNG5IK2E1VU4yKzFpOCtOTTN2Uk5wN3VRNnNxZXhTQ3VrRVZsVlpyaUhOcUZpNXJMbTlUTVdhNHFtM2lkSnFwcFFBQ29sMmw0VlN1dldMZnRhNEpjWHkzYlJPUE5iWE9nZE9oRzQ3TEMwQ3dXL2RNbFN4NEpmMTdhRVUzeUExeDlwK1ljMGp1cFhnY011WU5rdTY0aVlPa0dUb1ZEdUp2bGJFS2xKcXNtaUhidk5ySVZaRUgreUZkRjhEYmxlWjZpTmlXd01xdnRNcC9tU3B3eDVLeFJyVDlwM01BUFRIR3RNYmZ2ZEZoeWo5dmhhS2NuM0F0OExjMTZBaSt2QmNTcDF6dFhpN3JDSlp4L3FsN1RYY2NscTZRNzZVZUtXRHk5Ym9TMFdISWpVdVdoUEc4TEJtVzV5MnJodVRwTTV2c0x0K0hPTGgxWWYwRHFYYTl0c2ZDK2thS3QyaHRBMGFpL0wyaTdSS29OakV3enRrbVJVMEdmZ1cxVHhVdlBGaGcwVjdEZGZXSms1Z2ZyY2NwWXYrTUE5TTBka0dUTEVDZVl3VWl4UnpqUkZkbWpHN3pkWklsM1hLQjlZbGlOS0kzMWxmYTdpMkpHNUM4U3MrckhlMEQ3WjY5Ni9WM0RFQU9XSG5ROXlOYWhNVWw1a0VOV1M2cEhLS3AyRDFCYVNyckhkRTF3MnFOeEl6dHBYZ1VJckYwYm0xNVlNTDRiNlYxaytHcE55c1RhaEtNVnJyUzg1bFRWbzlPR0o5Nkk0N2VBeTVyWVdwUmYvbUl6ZW9ZVTFES2FRQ1RVVndyaEhleU5vRHFIZWwrbEx4cjlXS3poU1l3N3ZyUjYrVjVxMHBmaTJrM0wxenFrdWJZNnJyZDlaTHZTdVdOZjB1cW5rWStGcFR2RnpTVzlGcDBiOWw4SkE3VEhWOWVDaS9QWS9TQ1pJVVl4M0JVMmFsajdDbTNWVjZlWXBpb3M0YjZXdU5PSmRZWFVLM3pUcWo1Q1ZHMkZxWU00WjdDdUlVMHFPMDVYUjBkNzFGSE0wWWhabUptVFJmTGxYRXVtTjgyQkd0emRYMFMxOXQxZStiVWllSzh6Um1xcGE0UWM1VFNqaWZtYVFzWTJFVExqaEkzNmdNUjErN3FwamRYWEhpY2VVZWtmQmF1Y0hTaEFPaUZYbXYzc05tR1F5VTVpVmdub29jdW9uUVhFUFRGd3NsSHRTOFIrQTQ3U3RJOXdqMGlTcnRiaTVyTXlzY3pGaUltc1ErYmRGQ2xuRmpqcFhYd015Nk83cWZqT3I4RmIwYTdPREl0aXNqbm4zRVFPMTYreXBkMWN3eWFBVzVZenh6NVFrbmZNTzc2NDNmWFcvSTl5M1UyeEgyN09hcHFyNTZaL3RFemdsajZJYlQ2SEVIam9waVhxZVJiZTVtUVF2eHRjYkRPVnZlck4wWmdNZHpxUllSamFYdE1SZDU2UTRjWlNtZFB2WkpkU3JoSjFEOXpOWFBxQUVxUElhdlBkZnVidDVva2Uya212MGR6dElzelN2MlZZdW95ZjFVdW9wYnNZYit1WDloNldwd2pwZ3RaNmZOTmF3Tko0cThPM0NGb1NiaW9BYU9TWk14MkdZYVBZQityRWI2cWpRaU5SRlE3NlR2d05GVktEK0JoSDlWaGNLR3NYem1NSTdCcHRVL0NOV29sTTdZelJPdnBGQW50c2lXSnA2ZVIyZDNHYXJjWVNoVllTVXFobVlPV2o1RTk2TksyV3ZtWU5UZVk3WnM0UlVFZHY5aDlRVDRFc2VLdDZMekxycUVPczNoeEFZMU1hTldwU2E2elp4OEYzWU9WZUNZTVM4OFcrQ1lIRHVXZTR5b2M2WUsrZGpEdUVPckJSNWx2aDByK1E5dU04OGxyang5eDlBdGdwUVZORThyKzNPNkd2dzU5RCtrQkYvVU1YeWhsaVlVdFBqbXZYR1k2RGszeCtrRU9XK0d0ZE1WQzRFWlRxb1Mvam1SMFAwTFM3NURPYy93MnZucmk5N000U2RiWjhxZVU3Z2c4RFZiRVJrVTVnZWFNUU8zbVlyU1l5QW5nZVVRcXJOMEMwL3ZzRm1jZ1dOWE5laWRzVEFqNy80TW5jSlIwY2FhQlVwYkxLMXlCQ0JOUmpFdjZLdnVWU2RwUG5FTUpkc1JSdHFKK1U4dE4xZ1hBNGVQSGM2WlQwZXZpSTczVU9KRjBmRVo4WWFuZUFRcVFkR3BoTnZ3TTRuSXFQblh4VjB4QTBmbkNUK29BaEp1eXcvcThqTzB5OENqU3RlWkV4d0JwSU42U3ZOcDZBNUcvYWJpNmVnZU5ELzFHVGd1aHVOamFVYmJuU2JHZDRMODkzN0V6bTM0RXlpNm4xbWFlT0J4aDNQSTBqekpEZjVtaC9Cc0xEN0YyR09LdmxBLzVndHZ4STMvZVY0c0xmS1c1V3krb2lvK2VzL3U2VDhVVStuc29meTU3SWNiL0psWkhQRnRDZ2QveCtid3QzWlQreFhUdFR0VHJHQWI0UWVoQzZYOUcrOFlUK296Y0x4RHNkQ2pzdU9xd1BGbnJkTFlhRmM5MlVpMG00ZnIzOWxZbWxDYXFUaXQ3RzZPLzNrV0RrZ3RYak5INEJpRW0vK2plZ1FuaWhPdGZmZm4zM1d4c0ZqaGZNZDQ4SFQrZjZvNlg2NWo3WFI4V0xTSE1Ga3hidk9Zc3JSc0YxYm93RHVTUTE4TWt4azRxejJ6b0dQTDVmdTloMkhxbXQxYXNsM1EzWXUzc3pPYytzcGlDbVg0QUVUQk0zcExvVFlTcDNzVnhhaHloTDhlQzRtUE45azJ4M28weGtpaXhJek0zQ1pGemY1b1I0bWVjUTUrYXgyd0NhaDMvY3JtbkhvcVIwK0tNYU9QeFJpZjFvRUZSRk9PL2tUUFBtdHd3K05mTVh4RUs2Z242aVUzMlU2ZkZydUl6OFE0V2dsanRuYUNWVEJnV3g3ZGlVZHNoQzlaRWE1eUtwUkJCZVcxMnIvaU5jLytFZ05xbWhzd05COFNCb2loSFhlREY3cnJXRExjbXQzVjhHWVlON3BYUnk0RFpqajRESnVVQkw1aUMzRFFBYW9vNHZrZnRxVlRZUkdMUzNtSFo3Z2RtZFRUcWJnTk4vUFRkVENPVGdYb2xjODhNaFhBRVVNZFgwaXkxSk11azV3THNnZXUwUVVZbHoyUzRza1RXd0p6NnBPbS84aWhybWdHZkZncmkrWldVSzJnQVBIZ2JXYThqYW9jZFN1TTRGSllvS2ljWVgvWlNFTmtnOVExWnpKZndTY2ZWblIyRGVnT0d3Q3Ztb2dhV0pDTFFlcHY5V05sVTZRZ3NtT3dJQ3F1VTI4TWxrM2Q5VzVFODFsVS81RXowTGNYNmx3S01XRE5sdU5LZkJEVXkvcGhKZ0JjTW5ma2g5aVJ4cmRPemdzMDhKZFBCODVMd28rR1VTYjR0M25DKzBieXFNWnRPMmZRSjRVMnpHSXI0OXQvMjhxbW1HdjJSYW5ERDdhM0ZFY2R0dXRrVzh0d3d3bFVTcGI4UWFsb2RkZGJCZk5IS0RRODI4QmRFN09CZ0ZkaUtZb2hMYXdGWXFweWJRb3hBVFpyaGVMaGRJNyswWmx1OVExbXlSY2QxNXI5VUltOEsyTEdKeHFUZWdudHFOVk1LbmYxYTh6UWl5VVIxcnhvcWppRnhlSHhxRmNZVVRIZkR1N3JoYlduZzZxT3hPc0krNUExcDltUnlFUGRWa1RsRTI0dlk1NFc3YldjNmpNZ1p2TlhkZkM5LzlxNzQwOEtEc2JkTDdVdHo3UUZTRGV0ejJwaWNBcnpyZHBMOE9hQ0hDOVYyNlJyb2VtdERaNXlOTS9LR2tXTXlUbWZuSW5Fdnd0U0QyM1VjRmNqaGFFM1ZLemtvYUVNS0dCZnQ0WGJJTzZmb3JUWTFsbUdRd1ZtS2ljQkNpQXJEekUrMW9JeEUwOGZXZXZpSU9ENVR6bnFIK09vSGFkdm9PUDIwZHJNUGU1SXJnM1hCUXppVzJYRHVIWXpqcVFRNHd5U3NzalhVczVIK3QzRldZTUhwcFVuQkhNeC9uWUlUNWQ3T21qRGJnRDlGNm5hM200bDdLZGtlU08za1RFUFhhZmlXaW5vZ2FnN2I1MnRhaVpoTDFUU3ZCRm1FWmFmRnEySDhraFFhWlh1aXRDZXdUNUZCZ1Z0UEswajR4VUhQZlV6M1EyOGVhYzFaMTM5REFQMjNkZ2tpOTRFQzh2YkRQVFFDOTdIUFBTV2pVTkc1dFdLTXNheEFFTUtDMDY2NVh2bzFOdGQwN3dDTE5mOFE1Nm1yRVBWcEN4bElNVmxRbFdSeE0zb0FmcGdJYys4S0MzckVYVW9nNWcwNnZ0N3pnWFk4Z3JIN2hod1ZTYWV1dkMwNllZUkF3cGJ5ay9VbnpqOWhMRVpOczJveFBRQjl5YytHbkw2elRncTdySSsrS0RKd1gyU1A4U2Q2WXpUdXc1bFYva1U2ZVF4UkQxMm9tZlFBVzZjYVRSNExpa1lrQkIxQ01PcnZnUnIvVlk3NStOU0I0MENuaTZiQURBdGFLK3Z5eFZXcGY5TmVLSnhOMktZUThRMnhQQjNLMXM3ZnVodldicjJYcGdXMDQ0VkQ2RFJzMHFYb3FLZjFORnNhR3ZLSmM0N2xlVVYzcHBwUC81VlRLRmhhR3VvbDRFc2ZqZjV6eUN5VUhtSHRoQ2hjWWg0aFlMUUYrQUZXc3VxNHQwd0p5V2dkd1FWT1ppVjBlZlJIUG9LNStFMXZqejl3VEptVmtJVEM5b0VzdEFzeVpTZ0UvZGJpY3dLcjg5WVV4S1pJK293RDIwNVRtNWxubm1EUnVQL0puenhYM2dNdGxyY1gwVWVzWmR4eVFxWVF1RVc0UjUxdm1RNXhPWnRlVWQ4U0pydU1sVFV6aHRWdy9OcTdlVUJjcU4yL0hWb3RnZm5naWY2MHlLRXRvVXgzV1lPWmxWSnVKT2g4dTU5ZnpTRFBGWXRRZ3FEVUFHeUdoUU9Bdktyb1hNY09ZWTBxam5TdEpSL0czYVArSnQxc0xWbEdWOFBPd3IvNk9Hc3FldG55RjNUbVRxWmpFTmZuWGg1MW94ZTlxVlV3Mk03OEV6QUorSU04bFoxTUJQUTlaV1NWYzRKM21XU3JMS3JNSFJlQTVxZEdvejBPRFJzYUErdnd4WEEyY0FNNHFsZnpCSkE2NTgxbTRoenhJdFF3NWR4cnJCTDNZNmtDYlVjRnhvMVM4anlWNDRxLy8rN0FTTk51ZFo2eGVhTk9TSVVmZnFNbjRBOWxJakZjdFluMmdwRVBBYjNmN3AzaUlCTjhIMTRGVUdROWN0MmhQc0wrY0VzVGdVclI0N3VKVk40bjR3dC93Z2Z3d0h1T25MZDR5b2Jrb2Z5OEp2eFNRVEE3ck1wREljNjA4U2xaRkpmWlljbWJUMHRBSHBQRThNcnRRNDJzaVRVTld4cXZXWk9tdnU5ZjBKUG9RbWcrNmw3c1pXd3lmaTZQWGt4Sm53QnJhVUcwTVlHNHpZSFF6M2lneS9Yc0ZreDV0TlF4dzQzcXZJOWRVM2YwRGRoT1VsSEtqbWkxVkFyMktpeTBIWndEOFZlRWJoaDBPaURkTVlzcG9sUXNZZFN3akNjamVvd0lYTlpWVVBtTDJ3d0lrWWhtWEtoR296ZENKNGxSS2JzZjROQmgvWG5Rb1M5Mk5KRVdPVk9GczJZaE44YzVRWkZlSzBwUmRBRzQwaHF2TGJtb1NBOHhRbXpPT0VjN3dMY21lOUpPc2pQQ0VncEN3VXM5RTJEb2hNSFJoVWV5R0lONlRGdnJibnk4bkR1aWxzRHB6ckg1bVM3NkFQb0lFSm1JdFM2N3NRSituZndkZHptalB4Y0JFQkJDdzBrV0R3ZDBFWkNrTmVPRDdOTlFodEJtN0tITDltUnhqNlUxeVdVMnB1emxJRHRwWXhkSDRaUGVYQkprVEdBSmZVci9vVEN6L2l5cFk2dVhhUjJWMWRvUHhKWWxydzJnaEgwRDVnYnJoRmNJeHpZd2k0YS80aHFWZGYyRGR4QnA2dkdZRGphdnhNQUFveSsxKzNhaU82UzNXL1FBS05WWGFnRHR2c050eDdLcytIS2dvNlUyMUIrUVNaZ0lvZ1Y1QnQrQm5YaXNkVmZ5OVZ5WFYrMlA1Zk11dmRwQWpNMW8vSzlaK1huRTRFT0NydWUra2NkWUhxQVEwL1kvT21ObFE2T0kzM2pIL3VEMVJhbFBhSHBKQW0yYXYwL3h0cHFkWFZLTkRyYzlGMml6bzIzV3U3ZmlyZ2JVUkZETlg5ZUdHZVlCaGl5cHlYWmZ0MmozaFR2ekU2UE1XS3NvZC8vckVJTERrekJYZmk3eGgwZUZrZmIzLzF6elBLL1BJNU5rM0ZiWnlUbDRtcTVCZkJvVm9xaVBITzRRNFFLWkFsclEzTWROZmkzb3hJanZzTTNrQUZ2M2ZkdWZ1cnFZUjNQU3dYL21wR3kvR0ZJL0IyTU5QaU5kT3BwV1Zicy9nakYzWUgrUUE5ak1obEFiaHZhc0FIc3RCMElKZXcwOWlBa21YSGwxL1RFaitqdkhPcE9HclBSUVhiUEFETStJZzIvT0VjVWNwZ1BUSXRNdFc0RGRxZ2ZZVkkvKzRoQUZXWWpVR3BPUC9Vd051QjcrQmJLT2NBTGJqb2JkZ3plQlFmamdOU3AyR09weHpHTGo3MFZ2cTVjdzJBb1lFTndLTFV0SlVYOHNHUm94NGRWYS9UTjR4S3dhS2NsOVhhd1FSL3VOdXM3MDBIZjE3cHlObmV6clVnYVk5ZTRNQURoRURCcHNKVDZ5MWdESnMxcTZ3bHdHaHVVekdSN0M4a2dwalB5SFd3c3ZyZjN5bjF6SkVJUmE1ZVN4b0xBWk9DUjl4YnV6dHhGUkpXOVptTVlmQ0ZKMGV2bTlGMmZWbnVqZTkyUmM0UGw2QThibHVOOE1aeXlKR1owK3NOU2IvL0R2QUZ4QzJCcWxFc0Z3Y2NXZUFsNkN5QmNRVjFieDRtUU1CUDFKeHFrMUVVQUROTGVpZVMyZFVGYlEvYy9rdndJdGJaN3R4MHN0MTZ2aXFkNTNXc1JtUFRLdjJBRDhDVW5odFBXZzVhVWVnTnBzWWdhc2F3MitFVm9vZU5LbXJXM01GdGo3NmJZSEptNUs5Z3BBWFpYc0U1VThETThYbVZPU0oxRjFXbkx5Nm5RdXArang1MmJBYityQ3E2eTlXWGwyQjJvWkRoZkRrVzdIM29ZZlQvNHh4NVZuY0J1eE1YUDJsTmZoVVZRalNTelNSYnVaRkU0dkZhd2x6dmVYeGFZS1ZzOExwdkFiOElSWUYzWkhpUm5tMEFEZU5QV29jd3hTek5zZUc3TnJTRVZab0hkS1dxYUdFQnoxTjhQdDdrRmJxaDNMWW1BYm05aTFJQ2hJcExwTTVBUzZtcjZPQVBITXd3em5WeTYxWXBCWVg4eFpETi9hK2x0N24reDVqNGJOT1Z0ZVo4bGozaHBBSFN4MVZSOHZaSGVjNEFITzlYRkNkalo5ZVJrU1Y2NWxqTW1aVnphZWoycUZuL3F0MWx2V3pOWkVmSHhLM3FPSnJITDZjcnIwQ1J6TW94NWYyZThBTEJCNFVHRlpLQTN0TjZGNklYZDMyR1RKWEdRN0RUaTlqL2ROY0xGOWpDYkRjV0dLeG9LVFlibEl3YkxEUmVMMDBMUmNEUE1jUXVYTE1oNVl6Z3RmamtGSzFEUDFpRHp6WVlWWno1TS9rV1lSbFJwaWcxaHRWUmpWQ2tubStoMU01TGlFRFhPeUhSRWh2ekNHcEZaakhTMFJzSzI3bzJhdmdkaWxySmthbFdxUFczRDlnbXdWMzdIS21mTTNGOFlaajJhcit2SEZ2ZjNCOENSb0g0a0RISUs5bXJBZytvd2lFd05qamQ5VitGc1FLWVI4Y3pKclVrZjdRb2kyWWFXNkVWRFpwNXpZbHFpWXR1WE9USGs0ZkFjWjdxQmJkTERpSnEwV05WMWwyK0hudGsxbU1XdnhyWW1jOGtJeDhHM3JXMzZKNlJhNGxMclRPQ2dpT2lobW93K1luelVUMTlqYlYyQjNSV3FTSHl4a2htZ3NCcU1ZV3ZPY1VvbTFqRFE0MzYrZmNidTN4ZjJiYmVxVS9jYStDNERPS0UrZTNxdm1lTXFXM0F4ZWpmekJSRlZjd1ZZUHE0TDBBUFNXV29KdSs1VVlYNHFnNVU2WVRpb3FRR1BHOVhybnVaL0JreHVZcGU2TGk4NysxOEVza3lRVy91QSt1azJycEhwcjZodXQyVGxWYktnV2tGcHgrQVpmZndlaXcyK1ZpdHRrRXlmL2lmaW5TLzBJdFJMMkpxM3RRT2N4UGFXTzJ4ckc2OEdkRm9VcFpnRlhhUDJ3WVZ0UmM2eFlDZkkxQ2FCcXlXcGc0Yng4T0hCUXdzVjRYV01pYlpaMExZaldFeTJJeFExbVpyZjEvVU5iWUNKcGxXdTNuWjRXcG9kSUdWQTA1ZCtSV1NTK0VUOXRIM1JmR0dtTkkxY0lZN2V2WlpxN28rYTBiamp5Z3BtUjNtVmZhbGtUL1NaR1QyN1E4UUdhbHdHbERPUzlWSEN5RkFJTDBhMVE3SmlXM3NhejlncVk4bHFLeW5GclBDenhrVTRTSWZMYzlWZkNJNWVkZ1JoRFhzMGVkTzk5Mm5oVEtIcmlSRVAxTkpDNlNST01nUTB4TzVrTk5aT2hNT0lUOTlBVUVsYnhxZVpGOEEzeHJmREpzV3REblVlbkFIZFlXU3dBYllqRnFRWitENWdpM2hOSzhDU3hVOWk2ZjZDbEw5SUdsajFPUE1RQXNyODRZRzZpanNKcENhR1dqNzVjM3lPWktCQjltTnBRTlBVS2tLMEQ2d2dMSDhNR295UnhUWDZZMDVRNEFuWU5YTVp3WE00ZWlqLzlXcHNNLzlDb1JuRlFYR1I2TUVhWStGWHZYRU8zUk8wSmFTdGs2T1h1SFZBVEhKRSsxVytUVTNiU1oya3NNdHFqTzB6ZlNKQ2RCdjd5MmQ4RE14NlRmVm1lM3EwWnBUS01NdTRZTC90N2NpVE50ZERrd1BvZ2gzQ25qeDdxazA4U0h3Zitka3NaN00ydkNPbGZzRjBoUTZKNGVoUENhSFROck0vekJTT3FEODNkQkVCQ1cvRi9MRW1laDBuT0hkN29WbDMvUW8vOUdVRGtrYmo3eXorOWN2dnUrZERBdHg4TnpDRFRQNGlLZFp2azlNV2lpenZ0SUxMZXB5c2ZsU3ZUTEZCWjM3Ukx3aXJpcXlSeFl2L3pyZ0ZkLzlYVkhoL09tekJ2RFg0bWl0TVIvbFVhdnMyVng2Y1I5NGx6QWtwbG0zSVJOeTRURmZ1NDd0dVlzOUVRUElQVnRhNFA2NHRWK3NaN24zdWVkM2NnRXgyWUsrUUw1K3htczZvc2s4cVFiVHl1S1ZHZGFYOUZRcWs2cWZEblQ1eWt4azBWSzdLWjYyYjZETkRVZlFscUdIeFNNS3YxUDBYTjVCcU1lS0cxUDRXcDVRZlpEVUNFbGRwcG9YMFU2c3MyaklrbzJYcFVSS0NJaGZhT3FMUGZTaGR0UzM3WnJUK2pGUlNIMnhZVlYxcm1UL01CdFJRaHhpTzRNUTNpQUdsYVppKzlQV0JFSVhPVm51OWpOMWY5MjFsV0xaa3k5YnFiTTNKMk1BQUk5am11QXgzZ3lvRVVhNlAyaXZzMEVlTnYvT1IrQVg2cTVTVzZsNUhhb0Z1UzZqcjZ5ZzlsaW11K1AwS1lLemZNWFdjUVNmVFh6cE96S0VLcHdJM1lHWFpwU1N5MkxUbE1nZm1GQTNDRjZSNWM5eFdFdFJ1Q2cyWlBVUTJOYjZkUkZUTmQ0VGZHSHJuRVdTS0hQdVJ5aUpTREFaK0tYMFZ4bVNIakdQYlFUTFZwcWl4aWEydXloUTM5NGdCTXQ3QzNaQW14bi9ESlMrbDFmQnNBbzJFaXIvQzBqRzljc2Q0Ky90cDEycFBjL0JWSkdhSzltZnZyN00vQ2V6dHJtQ081cVkwNkVkaTR4QUd0aUVobldBYnpMeTJWRXlhekUxSjVuUG1nVTRScFc0U2EwVG5PVDZ3NWxndDMvdE1wUk9pZ0hIbWV4QkdBTVkwbWRjRGJEeFdJejQxTmdkRDZveGdIc0pSZ3I1Um5UNndaQWtUT2NTdFU0Tk1PUU5lbVNPN2d4R2FoZEVzQytOUlZHeE1VaFFtbU0wbGxXUmJibUZHSHpFcUxNNEl3MEg3NTc3S3lvK1pmKzJjVUZJT3c5M2dFWTE3MXZRYU0wSEx3cGpwZFJSNkp6N1YwY2tFN1h6WUowVG1ZOXpuTGR6a3ZhMHZOckFHR1Q1U1VaNXVhSERrY0d2STB5U3B3a2FzRWdaUE1zZVljdTg1dzhIUGRTTmkrNFQ2QTgzaUF3RGJ4Z2VGY0IxWk0yaUdYekZjRU9VbFlWckVja2FPeW9kZnZhWVNRN0d1QjRJU0UwbllKYzE1WC8xY2lEVFBiUENnWUpLNTVWa0VvcjRMdnpMOVMyV0R5NHhqKzZGT3FWeVRBQzJaTm93aGVlZVNJNWhBLzAybDhVWWt2NG5rOWlhVm4ra0NWRVVzdGdrNUh5cStnSm02Ujl2RzNyaHVNOTA0aGUvaEZtTlFhVUlBVEIxeTN2dytPbXhQNFg1WWk2QTVJNWpKdWZIQ2pGOStBR053bkVsbFpqVWNvNlhoc081VDUrUjN5eHo1eUxWT25BbjB6dVMrNnpkajBuVEpiRVpDYlhKZHRwZllaZkNlQ09xSkhvRTJ2UFBGUzZlUkxqSUpsRzY5WDkzbmZSMG14U0ZYenAxWmMwbHQvVmFmRGFJbWhVTXRibnFXVmI5TTRuR05RTE42OEJIUDdBUjhJbDlka2N4em1CdjhQQ1psdzlndVkwbHVyYkJzbU5ZbHdKWnNBL0IxNS9IZmtiamJ3UGRkYVZlY2xzL2VsbURITlcycjRjckF4NDNmZU5rZlJ3c2FOcS95eUowZC9wNWhaNkFaYWp6N0RCZlVvazBaVTYyZ0N6ejd4OGVWZkpUS0E4SVduNDV2SU5MU00xcStIRjlDVjlxRjN6UDZNbDIxa1BQTDNDWHprdVlVbG5TcVQrSWo0dEkvb2Q1S3dJcyt0RGFqRHM2NG93Tjd0T0FkNmV1Y0d6K0tmTzI2aU5jQkZwYldBNTczMmJCTldPNGtITnByOUQ5NTVMNjFidkhDRi9td1NyejZlUWFEamZERUFOcUdNa0ZjK05HeHBLWnpDRDJzai9KckhkK3psUFE4SXo3USsySlZJaVZDdUNLb0svaGxBRUh6dmsvUGlxM21STDFyVC9mRWg5aG9UNUdKbWVZc3dnMW90aUt5ZGl6Si9mUzJTZUtIVnU2WjNKRUhqaVc4TmFUUWdQNXhkQmxpOG5DNTdYaU45aHJxdUJ1OTlobjl6cXdvOTIrUE0ySlh0cGVWWlMwUGRxUjVtRHlEcmVNTXRFd3MrQ3B3YVJ5eXpvWXRmY3Z0OVBKSVcwZkpWTk5pL0ZGeVJzZWE3cGVMdkpyTCs1YjRHT1hKOHRBcitBVGs5ZjhLbWlJc1JocVJ5MHZGendSVjNaNWRaM1FxSVU4SlEvdVFwa0piak1VTUZqMkY5c0NGZWFCakk0K2ZML29OMytMUWdqSTR6dUFmUSszSVBJUEZRQmNjZjBjbEpwc2ZwbkJ4RDg0YXR3dHVwa0dxS3ZySDdjR05sL1FjV2NTaTZ3Y1ZETUw2bGpPZ1libysyQk9BV05OamxVQlBpeWl0VUF3Ym5oRnZMYm5xdzQya1IzWXAya3YyZE1lRGRjR09YNWtUNFM2TTQ0S0hFQi9TcENmbDd4Z3NVdnMrSk5ZOUczTzJYLzZGRXQ5RnlBbjU3bHJiaXUrdGw4M3NDeW1TdnE5ZVpiZTltY2hMN01UZi9UYTc4ZTgwelNmMGhZWTVlVVU3K2ZmMTRqdjdYeThxanpmenp6dmFKbnJJZHZGYjVCTFdLY1dHeTUvdzcrdlYyY3ZJZndIcWRUQitSdUpLNW9qOW1idDBIeTk0QW1qTWpqd1lOWmxOUzZ1aXl4Tm53Tnl0M2dkcmVMYjY0cC8zKzA4blhrYjkyTFRra1JnRk93azFvR0VWbGxjT2o1bHYxaGZBWnl3RG93czA5NDRVOHZVRncrQS9udVZxL1VDeWdzcm1XSUJuSHlVMDFkMFhKUHdyaUVPdngvSVNLNlBrNHkydzBnbW9qWnM3bFU4VHRha0JBZG5lNHYvYU54bU1wSzRWY0dNcDdzaTB5cXNpb2xYUnVPaTFaMVA3U3FEM1ptcDBDV2N5SzRVYm1wMlNYaVh1STVuR0xDaWVGSEtITlJJbGNZM1B5czJkd01UWUNhcWx5V1NJVHdyMm9HWHZ5VTNoMVBmOGVRM3cxYm5EN2lsb2NWallEa2NYUjNPbzFCWGdNTFRVak53MnhNVndqdHA5OU5oU1ZjNWFJV3JEUVQ1REhQS3RDdGhlQlA0ekhjdzRkejJlUmRUTWFtaGxIaHRmZ3FKSkhJN05HRFV3MVhMOHZzU2VTSHlLcUR0cW9BbXJRcXNZd3Z3aTdIVzNvald5aElhNW96NXhKVGFxMTROQXpGTGpWTFIxMnJSTlVRNnhvaERucldGYjViRzl5ZjhhQ0Q4ZDVwaG9hY2tjTkpwK0R3M0R1ZTNSTSs1UmlkN0V1SWdzbndncFgwclVXaC9ucVB0QnlNaE1aWjY5TnBndlJUS1o2MlZpWitRN0RwNXI0SzBkN0VmSnVpeTA2S3VJWWF1Umg1RWNyaGR0MlFwVFMxazFBc2NFSHZhcE5iVTNITDFGMlRGeVIzM1d4YjVNdkg1aVpzcm4zU0Rjc3hsbm5zaE84UEx3bWRHTitwYVduUXVPUnRaR1gzN3VoRlQ2NFNldVBzeDhVT29rWTZPTjg1V2RRMWRraTV6RXJzSkdhemNCT2RkV0pFS3FOUGlKcHNNRDFHclZMclZZK0FPZFBXUW5lVHl5UDFoUlgvbE1NNFpvZ0dHT2hZdUFkcjdGL0RPaUFvYysrY241dmxmMHprTVVKNDBaMXJsZ3Y5QmVsUHFWT3B4S2VPcHpLZEY4bWFLKzFWdjIzTU85ay84K3FwTG94cklHSDJFRFFsbkdtSDhDRDMxRzhRcWx5UUljcG1SNWJ3bVNWdzkvTnM2SUhndWxDUmVodlovK1ZyTTYwQ3UvcjNBb250RmZybGpldzc0c2tZZTJ1eW43SktRdEZRQlFSSjlyeUdpYy96UU9zYlM0c2NVQmN0QThjUFRvUTN4NlpCUXU2RFB1NW0xYm5DdFA4VGxsTFlBMFVUUU5WcXphNW5mZXczTW9weTFHUFV3RzVqc2wwT1ZYbmlQbUFjbUxxTzVIRzhIdjNuU0xlY0U5b09qUERYY3NUeG9DQnhZeXpCZGo0d21ueUVWNGt2RkR1bmlwUzhTU2t2ZGFNblRCTjlickhVUjh4ZG1tRUFwL1BkcWs5dWV4dHAxdCtKcnRYd3BOL01HMncvcWhSTXBTTnhRMXVoZy9rS08zMGVRL0Z5SFVEa1dIVDhWNmdHUlU0RGhETXhadTd4WGlqOVVpNmpscFdtUUNxSmczRmtPVHEzV0tuZUNSWVp4QlhNTkFWTFFnSFhTQ0dTcU5kamViWTk0b3lJcFZqTVllaEFpRngvdHF6QlhGSFphTDVQZWVENzRyVzVPeXNGb1VYWThzZWJVWmxlRlRVYS8rekJLVlRGRG9wVFJlWE51WnE0N1Fqa1dueGppckNvbW1PNEwvR3JGdFZWMjFFcE15dzh3eVRoTDVZNTlkODh4dGx4MWcxdHRTSUNEd25vZjZsdC82emxpUHpnVlVMOGpXQmpDMG8yRDZLZytqTnVUaGtBbGFESnNxL0FHMmFLQS8vQTc2YXZ3MktOcXR2MjIzUCtXcTNTdFJERE5LRkZndHNGdWtZdDFHRkRXb29GVlhpdGFOaGIzUkN5Smk0Y01lTmpST2lQRURiNGsrRzMraEQ4dHNnKzVoaG1TYy84dDJKVFN3WW9DekFJNzVkb3E4UVRIZStFL1R3MFJRU1VEbFUrNnVCZU5OM2g2akpHWC9tSDhvajBpM2NhQ05zanZUbm9oNzNCdHlacHNmbEhMcTZBZndKTkNEWDRTOThoNCtwQ09oR0tEaFYzcnRrS0hNYTNFRzRKOXk4ekZXSTRVc2ZOekMvUmw1bWlkTm43Z3dvTjlqMjNIR0NRUStPQVpwVFRQTWRpVm93NzQwZ0l5dUV0ZDBxVnhNeU5YaEhjbnVYUktkdzV3RFVTTDM1OGt0ak1YbUFrdklCNzNCTGExdmZGOUJBVVpJblBZSml3eHFGV1FRQlZrN2dRSDRvamZVUS9LRWpuK0EvV1I2RUVlNEN0YnBvTGUxbXpIa2FqZ1RJb0UwU0xESFZhdUtocnExMnpyQVhCR2JQUFdLQ3Q0REdlZHEzSnlHUmJtUEZXMzJiRTdUMjArNzNCYXRWL3FRaGhCV2ZXQkZIZmhZV1hqQUx0czM4RmVtbm9UKzlibjFqREJNY1VNbVlnU2MwZTdHUWp2Mk1VQndMVThpb25DcGdWK1FyaGc3aVVJZlVZNkpGeFIwWStaVENQTStyVnVxMEdOTHlKWFg2bnJVVHQ4SHpGQlJZMUUvRkltMkVlVkE5TmNYcmo3UzZZWUlDaFZRQ1dyL20yZllVakM0ajBYTGt6WjhHQ1NMZm1rVzNQQi94cStubFhzS1ZCT2o3dlR2cUtDT01xN1p0cXIzY1ErTjhnQm5QYUFwcytvR3dXT2tidXhuUllqL3gvV2ppRGNsVnJzMjJ4TUs0cUFyRTFadGsxNDU2a2lKcml3NmFia05lUkhvZ2FQUkJnYmdGOVo4aS90YnpXRUxONEN2YnF0cnFWOVR0R1NubVBTMkY5a3FPSUJhYXpIWWFKOWJpM0FvREJ2bFphc01sdXh0MEJEWGZocDAySm40MTFhVnQ2UzRUVUI4WmdGRGtJNlRQNmd3UFk4NXcrb1VRU3NqSWVYVm1pbnJ3SWRLMlpBYXdiOFNlNlhPSmJPYWxpUXhIU3JuQWVPTkRMdUNuRmVqSWJwNFlEdEJjUUN3TXNZaVJaZkhlZnVFSnFKY3dLVFRKOHN4NWhqSG1KSTFzUEZIT3I2VzlBaFoyTkFvZDM4bW5MUWsxZ096MkxDQW9ob1FiZ01iVUs5Uk1FQTNMa2lGN1NyOXRMWnA2bGtjaUlHaEUyVjU0NnczTWFtNTNWdFZrR2JCOXcwWWsyWGlSbkNtYnB4bUhyMms0ZVNDMFJ1TmJqTnNVZkRJZmM4RFp2UnZnVURlMUlsS2RaVHpjVDRaR0ViNTNkcDhWdHNvWmx5WHpMSE9kQWJzcDFMUFRWYUh2TEEwR1lERk1iQVcvV1VCZlVBZEh3cUxGQVYrM3VIdllXckNmaFVPUjJpODlxdkNCb09iNDh1c0FHZGNGMk00YUtuNzlrLzQzV3pCWit4UjFMMHVaZmlhNzBYUDlzb1FSZWV1aFppVW5YRkRHMVQ4L09YTm1zc1RTbllPKzNrVkxBZ2VpWTcxOXVEd0w5RlF5Y2dMUGVzc05paE1aYkFLRzdxd1BaeUcxMUcxK1pBM2pBWDJ5ZGRwWWZtYUtCbG1mY0svVjBtd0lSVURDMG5KU09QVWwyS0I4aDEzRjRkbFZaaVJoZEdZNWZhcndOK2Y5aEViMWNSaTQxWmNHRG42WGU5TU1TVE9ZODFVTEp5WElIU1dGSVFIc3RWWUxpSkVpVWprdGxIaUdqbnRONS9idEI4RnUrdnAyOHpsMmZaWE4rZEpEeU42RVhoUysweXpxcGwvTFNKTkVVVnhtdTdCc05kakFZMGpWc0Foa051dVkwRTFHNDhlajI1bVN0KzAweVBiUTRTUkNWa0l3YjZJU3ZZdG1KUlB6OVp0NWRrNzZibGYrbEp3QVBINUtERit2SEFtQUNMb0NkRzJBZGlpNmRPSG5OSm5UbVp0b09HTzhRMWp5MXZlTXc2Z2JMRlRvUW1mSmE3blQ3QWw4OW1SYlJrWlpReEpUS2dLNUtjOUlOem1USkZwMHRwQVB6Tm15TC9GMDhiWDNuaEN1bU0vY1IvMlJQbjllbVozVmxqb2t0dFpEMXpWV1hsVUlxRVU3U0xrNUkwbEZSVTBBY0VOWEJZYXpOYVZ6c1ZIQS9zRDNvOWhtNDJ3YkhJUmIvQkJRVEt6QWk4czMrYk10cE9PWmdMZFF6Q1lQZlgzVVV4S2QxV1lWa0dIN2xoL1JCQmdNWlp3WHpVOStHWXhkQnFsR3MwTFArRFo1ZzJCV05oNkZBY1I5NDRCK0svSlRXSTN0OVl5VnlSaGxQNENDb1VrL21tRjcrcjJwaWxWQmp4WEJIRmFCZkJ0cjloYlZuMnpEdUkwa0VPRzNrQng4Q0dkUE9qWDFwaDFQT09aSlVPMUpFR0cwanpVeTJ0SzRYMENnVk5ZaG1rcXFReXNSTnRLdVBkQ0pxSzNXVzU3a2FWMTd2WGdpeVBybDRLRUVXZ2lHRjFldUk0UWtTRkhGZjBURHJvUWlMTktKaUxiZGhIMFlCaHJpUk5DSFB4U3FKbU5Ob2tldGFpb29ocU1nbGg2d0x0RUdXU00xRVpiUWc3MmgwVUpBSVBWRkNBSk9UaHBRR0dkS2ZGb3Zjd0VlaUJ1WkhOMk9iNHVWTTcrZ3daTHoxRDlFN3RhNFJtTVoyNE9CQkFnN0VoNmRMWEdvZlo0VTJURk9DUU1LandoVmNranJ5ZFJTK1lhcUN3MWtZdDZVZXh1emJORUR5WUxUWm5yWTFQenNIWkpUNFUrYXdPMnhscVRTWXU2bi9VMjlPMndQWGdHT0VLRE1TcSt6VFV0eWM4KzZpTHAwaXZhdjRGS3greHhWeTRGeGhJRi9wdWNWRHFwc1ZlMmpGT2ZkWmhUekx6MlFqdHp2c1RDdkRQVTdiekRIMmVYVktVVjlUWitxRnRhU1N4bllnWWRYS3dWcmVJZ3ZXaFQ5ZUdEQjJPdm5XeVBMZklJSWZObmZJeFU4blc3TWJjSDA1bmhsc1l0YVc5RVpSc3hXY0tkRXFJbnExRGlaUEtDejdpR21BVTkvY2NublF1ZDJwTmdJR0ZZT1RBV2poSXJkNjNhUERnZmo4L3NkbEQ0bCtVVGxjeFRJOWpiYU1xcU4wZ1F4U0hzNjBJQWNXM2NINHAzVjFhU2NpVEtCMjlMMXR6MmVVUWhSaVRnVHZtcWMrc0d0Qk5oNGt5MG1RSkdzZHljQlJFUCtmQWFTczFFUkVEVm81Z3ZnaTUrYUNON05FQ3czMG93YkNjMW1TcGppYWh5TlZ3SmQxamlHZ3pTd2ZUcHpmMmM1WEp2Ry9nMW4wZkg4OEtITm5mK3U3WmlSTWxYdWVTSXNsb0pCVXRXOWV6dnN4OWdyZnNYL0ZOeG5ieFUxTHZnMGhMeGl4eXBIS0dGQWFQdTB4Q0Q4b0RUZUZTeWZSVDZzODEwOUdNVVpMOG0yeFhwOFgyZHBQQ1dXZFg4NGlnYTRCclRsT2Zxb3g0c2hxRWdoL0h0NHFSc3Q1MmNBMXhPSVV1T3hnZlVpdnA2djVmOElWeWFyeUVkcFZrNzJFUkF3ZFQ0YW9ZMXVzQmdtUCswbTA2UTIxNkgvbnVidE5ZeEhhT0lZamNhY2gzQThFei96YzBLY1NoaGVsMEhDWWpGc0EwRmpZcXlKNVpVSDFhWnczK3pXQzBoTHBNNkdEZmNBZG45ZnEyb3JQbVpiVzZYWHJmK0tyYzlSdHZJSTVqZUQzZEZvVDFLd1pKd3hmVU12YzVLTGZuOHJST1cyM0p3ODlzSjJhNWRwQjNxV0RVQldGMmlYOE9DdUtwckhvc0oybWZsQlIrV3FzODZWdmdJL1hNbnNxYjk3K1ZsS2RQVnlzY3pQajhKaHpmK1dDdkdCSGlqQXFZbGF2YkY2MHNvTVdsSGJ2S1QrU2N2aHByZ2VUbG41MXhYMHNGK0VhZGMvbDJzMmE1QmdrVmJIWXl6MEU4NXAwTHN0cUgrZ0VHaVI4NG5CUlJGSW44aExTWnJHd3FqWjNFMjljdUdpKzVaNWJwN0VNOE1XRmE5c3NTL3Z5NFZyRGZFQ1N2N0RTVTg0RGFQMHNYSTNBcDRsV3puUTY1blFvVEtSV1UzMGdkN05uOFpvd1V2R0l4NGFxeVhHd21BL1BCNHFOOG1zSlVPRGV6VUhFbDBWUDl1bytjWjh2UEZvZFNJQjRDN2xRWWpFRmo4eXU0OUMyS0lWM3F4TUZZVGV2RzhLcUFyMFRQbGtiekhIblRwRHB2cHp6aUFpTkZoOHhpVDdDL1RpeUgwRWd1VXc0dnhBZ3BuRTI3V0l5cFYrdUZOMnpXN3huaUYvbjc1dHJzOUlKNWFtQjF6WFhaMUxGa0o2R2JTL2RGb2t6bDRjYzJtYW1Wd2hMNFhVMEF2NWdEV0FsK2FFV2hBUDd0MlZJd1UrRXB2Zk9QRGNMQVNYN0g3bFpwWEEyWFFmYlNsRDRxVTE4TmZmTlBvQUtNTlNjY0JmTzlZVlZnbWxXNFJ5ZEJxZkhBVjcraHJaODRXSkdobzZiTlQwWU1oeHhMZE94L2R3R2owb3lhazlhQWtOSjhsUkp6VXVBOHNSK2ZQeWl5VGdVSGlvNStQcCtZYUtsSHJoUjQxalk1TkVTUFMzeCt6VE1lMFMySG5MT0tDT1FQcGR4S3l2aUJ2ZEhyQ0RScU8rbDk2SGhoTkJMWFd2NHlFTXVFVVlvOGtYbllKTThvSWdWTTRYSit4WE9ldjRZYldlcXN2Z3EwbG13NC9QaVlyOXNZTHQrVzVFQXVZU0ZuSkVhbjhDd0p3YnRBU0JmTEJCcEpaaVJQb3IvYUNKQlpzTStNaHZTN1plcHlIdlU4bTVXU21hWm54dUx0czhvamw2S2tTOG9TQUhrcTVHV2xDQi9OZ0o1VzNyTzJDajFNSzdhaHhzQ3JiVFQzYTBWL1FRSCtzRXJ4VjRYVVdESHgwa2tGeTI1YlBtQk1CUTZCVTNIb0hoaFljSkI5SmhQNk5YVVdLeG5FMHJhWEhCNlU5S0hwV2RRQ1FJNzJxZXZwNWZNemNtK0F2Qzg1cnN5blZRaHJ1REE5ZnA5Q09lN041NmNnMVVLR1Nhczg5dnJOK1dsR0xZVHdpNVcrMHhZZEtFR3RHQ2VOSndYS0RVMFhxVTV1UVluV3NNd1RFTkxHdGJRTXZvR2pJRklFTXpDUmFsNHJuQkFnN0QvQ1NuOE1zQ3ZTK0ZESkpBem9paW9KRWhaSmdBcDluMisxWXpucjdIKzZlVDRZa0o5TXBqNjBJbWNXNGk0aUhETG45UnlkQjhkeDNRWW0zcnNYNm40VlJyWkRzWUs2RENHd2t3ZDVuMy9JTkZFcGsxNmZZcFA2SnRNUXBxRU16Y09mUUdBSFhCVEVHenVMSjAzR1lRTDlibVYyLzdFeERsUmYrVXZmMXNNMmZyUnRDV21hbDEycE1ndG9udlNDdFI0bjFDTFVaUmRUSERIUDFPdHdxZCtyY2RsYXZuS2pVQi9PWVhRSFVKenBOeUZvS3BRSysyT2dyRUtwR3lJZ0lCZ24yeTlRSG5USmloWk9wRXZPS0lvSEFNR0FYSG1qMjFMeW0zOU1iaW93NElGKzc3eE51ZXd6aU5WQnhyNktENWUrOUh6WlNCSWxVYS9BbXNERkpGWGV5clFha1IzRndvd1RHY0FESkhjRWZoR2tYWU5HU1lvNGRoNGJ4d0xNKzI4eGppcWtkbjAvM1I0VUVrdmNCckJmbi9TekJjMVhoS00yVlBsSmdLU29yakRhYzk2VjJVblFZWGwxL3laUFQ0RFZlbGdPK3NvTWpleFh3WU81OFZMbDV4SW5RVVpJOGpjM0gyQ1BuQ05iOVgwNW5PeEl5NE1sZWNhc1RxR0s2czJhejRSanBGMmNRUDJHMjhSKzd3RFBzWkRaQy9rV3RqZG9IQzdTcGRQbXFRclVBaE13S1Z1eENtWVRpRDlxL083R0h0WnZQU04wQ0FVUU4vcnltWFpObmlZTGxKREU3MGJzazZYeHNoNGtET2R4ZTdBMndvN1A5RjVZdnFxUkRJNmJyZjc5eVBDU3A0STBqVm9PNFluTFl0WDVuenNwUjVXQjRBS09ZdFIxdWpYYk9RcFB5WUR2ZlJFM0ZONXp3MGk3cmVlaGRpN3lWMFlEUktSbGxHQ0dSazVZeitVdjFmWWwyWndybkdzcXNqZ0FWbzB4RVViYThvaGphTk1KTndUd1pBL3dCRFdGU0NwZzFlVUg4TVlMMnpkaW94UlRxZ0dRckRaeFF5Tnp5QkpQWFpGMCtveElUSkFiajdvTkM1SndnRE1VSmFNNUdxbEdDV2MvL0tDSXJJK2FjbEVlNElBMHV6djdjdWo2R0NkYUpPTnBpMTNPNTQ0dmJ0SUhCRitBK0plREZVUU55NjFHa2kzcnR5UTRhVXl3bjZydTMxNC9ka0dpUDhJd2pvMEovMlR4czQ5Wmt3RWw0bXgraVlVVU81NUk2cEp6VTRQKzdSUnMrRFhaa3lLVVlacVZXclBGNEk5NG00V3gxdFhlRTc0bzlHdVg5Nzd5dkovamtkYWs4K0Ftb0hWakkxNVYrV3dCZEFSRlYySVBpckpnVk1kc2cxUGV6MlZOSHFhN0VIV2RUa2wzWFRjeWpHOUJpdWVXRnZRZlhJOGFXU2t1dVJtcWkvSFV1enF5dkxKZk5mczB0eE1xbGRZWWZsV0IxQlMzMVdrdVBKR0d3WFVDcGppUVNrdGt1Qk1Xd0hqU2tReGVlaHF3MUtnejBUcnptN1FidGd4aUVQRFZtV0NOQ0FlQ2ZST1RwaGQxWk5PaHpMeTZYZkp5RzZYZ2Q1TUNBWnc0eGllMFNqNUFuWTEvYWtEZ05TOVlGbDNZMDZ2ZDZGQXNnMmdWUUp0ekc3TFZxMU9IMmZyYlhOSFdIL05ZODlOTlo0UVVTSnFMMnlFY0dBRGJUMzhYMGJHZHVrcVlsU29saUtPY3NTVHVxaGNhZW1VZVlMTG9JOCtNWm9yMlJ4WFRSVGhGMUxySGZxZi81TGNMQWpkbDRFRVJnVXlzWVMyZ2VFK3lGZGFzVTkxVWdVRHNjMmNTUTFab1Q5K3VMT3dkZ0FtaWZ3UXFGMDI4SU5jMklRRURmVG1VdzNlWnh2ejdVZDF6M3hjMVBRZmVDdmZLc0I5ak9oUmo3ckZ5YjlYY0RXTGNZajBiQnlvc3ljaE1lek1MVmtGaVljZEJCUXR2STZLMEtSdU9aUUgya0JzWUhKYVhUa3VwOEYwZUloTzEvR2NJd1dLcHIybW91QjdnNVRVREpOdk9SWFBYYS9tVThiaDI3VEFaWUJlMnNLeDROU3Y1T2puSElXRDJSdXlzQ3pCbFVmZU5YaERkMmp4bkhvVWxoZUozakJBcHpVUnkwZndtMkZ3d3NTVTBjYVFHbDBLdjhob3BSUUUyMTFObnZ0TFJzbUNOcmhocEVEb05pWkV6RDJRZEpXS2JSUlduYUZlZFhIQUVMU04wdDBiZnNDc01mMGt0ZkJvWEJvTkErblpOOStwU2xtdXpzcEZldm1zcXFjTWxsenp2a3lYcnpvQStSeW8xZVBYcGRHT29Kdmh5cnUrRUJSc21PcDdNWFowdk5VTVVxSExVb0tnbGcxcDczc1dlWm1QYytLQXcwcEUyeklzRkZFNUg0MTkyS3dEdkR4ZHhFWW9EQkROWmpiZzJibUFEVGVVS0s1N0lQRDRmVFlGNGM2RW5YeC90ZVlNT1JCRHRJaFBKbmVpWm55N052L3pHK1ltZWtJS0NveHI2a2F1RTJiWnRCTHVmZXRORzBCdEJZN2YrL0ltVXlwTUJ2ZFd1L1E3dlRNUnp3NWFRR1pXdWMxVjBIRXNJdEZZTUlCbm9LR1oweGNhcmJhL1RZWnE1MGtDYWZsRnlzWWpBNEVES0hxR2RwWVdkS1ltbSthN1RBRG1XMzV5Zm5PWXBaWXJrcFZFdGlxRjBFdWpJMDBhZXBsTnMyaytxeUZaTmVFM0NEUEw5UDZiNFBRL2thdGFIa1ZwTFNFVkdLN0VYNnJBYTdJVk5ydlp0RnZPQTZva0t2QmdNdEZEQUdaT3g4OE1lQmNKOEFSM0FnVVVlSXpuQU42dGpDVWlwR0RaT05tMUZqV0pwNEEzUUl6U2FJT21aN0R2Ri95c1lZYk0vZkZET1Ywam50QWpSZGFweEp4TDBlVGhwRWhLT2pDRERxMmtzKzNHcnd4cUlGS0xlMVdkT3pJSThYSU9QR253eTZMS1hWZnBTRE9URWZhUnNHdWpocFM0aEJJc01PcUhibDE2UEp4YzRFa2FWdTl3cEVZbEYvODROU3Y1WnVtNGRyTWZwOXlYYnp6QU9KcXFTNFlrSTRjQnJGckM3Yk1QaUNmZ0kzbk5aQXFrazNRT1pxUit5eXF4K25EUUtCQkJaN1FLcmZHTUNMK1hwcUZhQkpVMHdwa0JkQWhiUjRoSnNtVDVheW5sdmtvdW94bS9OakQ1b2U2QnpWSU85dWt0TSsvNWRFQzVQN3ZadmFybXVPL2xLWHo0c0JhYlZQSUFUdUtUcndiSlA4WFVrZE02dUVjdEhLWElDVUpHamFaSVdSYlpwOGN6cXVRWWZZNnluQlVDZklVK2dHNndxU0lCbVlJbTlwWnBYZGFMMTIxVjdxMFZqRGptUW5Ydk1lN3lzb0VablpMMTVCMFNweFMxampkODN1TklPS1p3dTVNUHpnMk5oT3gzeE1PUFl3RW4yQ1V6YlNyd0FzNU9BdHJ6M0dBYVVrSk9VNzRYd2phWVVtR0pkWkJTMU5KVmtHWXJUb0lOTEtEanhjdUlseWZWc0tRU0cvRzREeWlPMlNsUXZKMGQwT3QxdU9HNUlGU0FrcStQUlZNZ1ZNRHZPSUpNZHFqZUNGS1VHUldCVzl3aWdZdmNiVTdDUUwvN21lRjJLWkFhV2wrNHk5dWhvd0FYN2Vsb2dBdkl0QUF4bzIrU0Z4R1JzSEdFVzlCbmhsVHVXaWdZeFJjblZVQlJRSFY0MUxWK0ZyNUNKWVY3c0hmZXl3c3d4NFhNdFV4NkVrQmhSK3E4QVhYVUE4dVBKNzNQYjQ5aTlLRzlmT2xqdlhleUZqOWl4Z2JvNkNjYkFKN1dIV3FLSHkvaCtZakJ3cDZWY043TTg5Rkd6UTA0cWJyUXRnck9GeWJnM2dRUlRZRzV4bjczQXJrZlFXakNKUk93eTNKMzhEeC9EN2pPYTZCQk5zaXRFdzF3R3E3ODBFRWlvT2VEK1pHcDJKNjZBRGlWR01heWlIWXVjTWs4blRLMnp6VDlDbkVyYUFrOTVrUWp5NGswR1JFbExMNVlBS0xRRXJKNXJwMWVheTlPNEZiNnlKR205VTRGYU13UEd4dEtENm9kSUlIS29XbmhLbzFVOEtJcEZDK01WbjU5WlhtYzdaVEJaZnNnNkZROFcxMFlmVHI0dTBuWXJwSFpiWjFqWGlMbW9vRjBjT20wK21QbkpCWFF0ZXBjN24wQnFPaXBOQ3FJNnl5bG9UZVJTaE5LSDA0RklvMGdjTWswSC94VGh5TjRwUEFXakREa0VwM2xOTlBSTlZmcE1JNDRDV1JsUmdWaVA2NGVLMEpTUnAwV1V2Q1dZdW1sVy9jNThWY3oveU13VmNXNW9ZYjkrMjZURWh3dmJ4aU5nNDhobDFWSTFVWFRVLy9FdGErQk1LbkdVaXZjdGZMNXdJTkREMGdpUUwxaXB0NlU3QzljZDQrbGdxWTJsTVVaMDJVdjZQcnMrWkVaZXI3WmZXQlhWZ2hsZk9PckNsd3NvT0ZLeldFZno2Ulp1MWVDcytLOGZMdmt0czUrQlgwZ3lyRll2ZTBDM3FIcm41VS9PaDZEL0NpaG1XSXJZN0hVWlJoSmF4ZGUrdGxkdTZhZFlKK0xlWHVwUXcwWEV4QzM2UkVUZE5GeGNxOWdsTXU0Y05RU1g5Y3FSL0dRWXArSXhVa0ljTkdXVlU3WnRHYTZQM1hBeW9kUnQwWGVTM1RwMDFBbkNoMFpiVWg0VnJTWmVWOVJXZlNvV3l4blkzaHpjWjMwRy9JbkRxNHd4UnJFZWpyZUJ4bmhJUWJreGVueGtheGwrazdlTFVRa1VSNnZLSjJpREZOR1gzV21WQTF5YU9IK212aEJkK3NFNnZhY1F6Rm9id1k1QnFFQUZtZWp3VzVuZTdIdFZOb2xPVWdKYzhDc1V4bWMvTEJpOE41bXU5VnNJQTVIeUVyblM2emVDejdWTEk5K24vaGJUNmhUb2tNWFRWeVhKUktTRzJoZDJsYWJYVGJ0bUs0Zk5IM0laQlByZVNBNEZNZVZvdVZOM3pHNXg5Q2lHcEx3LzNwY2VvNHFHcXArclZwK3orN3lROThvRWYrbnlINEYzK0o5SWhlREJhOTRXaTYzekpiTEJDSVptN1AwYXNIR3BJSnQzUHpFM20wUzRZSVd5WEJDVlhHaWtqOE11ZERQQi82Tm0ydjRJeEo1Z1UwaWkwZ3V5NVNVSHFHVVl6VFAwaklKVTVFODJSSFVYdFg0bERkcmloQkxkUDFZYUcxQUdVQzEyclFLdUlhR3ZDcE1qWkM5YldTQ1luakRsdnBXYmtkWE1UTmVCSExLaXVvb3pNR0l2a2N6bVAwYVJKU0o4UFluTENWTmhLSFhCTmNrSDc5ZThaOEtjMndVZWo0c1Fab0g4cURSR2tnODZtYVcvWlFXR05uTGNYbXEzRmxYTTZzc1IvM1A2RS9iSE12bTZITHJ2MXlSaXhpdDI1SnNIMy9JT3IyVVY0QldKaHhYVzVCSjZYZHIwN245a0YzWk5BazYvWHBjNU1TRm1ZSjJSN2JkTDhLazdxMU9VOUVsZy90Q3hKOGdpVDI3d1NUeVNGMEdPeGc0UGJZSmRpL055aWE5Tm44OUNHRHVsZkplbW0xYWlFci9lbGVHU04rNU1SclZKNEs2bGd5VFRJVzNpOWNRMGRBaTZGSHQwWU1iSDN3RFNBdEdMU0FjY2V6enhIaXR0MVFkaFczNkNRZ1BjQTh2SUlCaDMvSk5qZi9PYm1jMnl6cGs4ZWRTbFM0bFZkd2dXNXZ6YllFeUZvRjRHQ0JCYnkxa2VWTnVlSEFIK2V2aStIN29PVmZTM1h1UFFTTlRYT09OQWJ6SmVTYjVzdHdkUUhsMVpqckdvRTQ5STgrQTlqM3QrYWhoUWo3NEZDU1dwWnJqN3dSU0ZKSm5ud2kxVDlITDVxckNGVy9KWnE2UDYyWGtNV1RiK3U0bEdwS2ZtbXdpSld4MTc4R09HN0ticlpHcXlXd211eUtXUGtOc3drWjFxOHVwdFVsdmlJaStBWGgyYk9PVE9Mc3J0TmtmcWJRSmVoMjRyZWVia0lOTGtqdXQ1cjRkOUdSL3I4Q0JhOVNVMFVRaHNuWnA1Y1ArUnFXQ2l4Um03aTRZUkZidFo0RUFraHROYTZqSGI2Z1BZUXY3TUtxa1BMUm1YM2RGc0s4WHNSTFZaNklFVnJDYm1ORGM4bzVtcXNvZ2pBUWZvQzlCYzdSNmdmdzAzbStsUXB2NmtUZmh4c2NESVg2czB3K2ZCeHRraGpYQVhyMTBVb3VXQ3gzQy9wL0ZZd0pSUy9BWFJLa2pPYjVDTG1LNFhSZTAreGVERHdWa0pQWmF1NTJiekxFREhDcVYwZjQ0cFBnS09rWUtnVFpKMzNmbWszVHU4U2R4SjAyU0hNOEZlbTVTTXNXcVJ5aTJGMXluZlJKc3pjRkt5a2RXbE5xZ0RBL0w5bEtZQm1jN1p1L3E5aWkxRlBGNDdWSmtxaGlyVW9iNTN6b2lKdFZWUlZ3TVIzNGdWOWlxY0JhSGJSdTlra3ZxazN5TXBmUkZHNDlwS0tqSWlxN2gvVnBSd1BHVEhvWTRjZzA1WDUwMjhpSHNMdlVXL3V6K2tqUHlJRWhoY0tVd0NrSkF3YlI5cElFR09uOHo2c3ZBTzhpODlzSjNkTDVxRFdGWWJTK0hHUFJNeFl3Skl0RlFOODZZRVNlSlFobjJ1ckdpTFJmZlFlTHB0RGw4ZEFnYitUcDQ3VVFQeFdPdzE3T2VDaExOMVduemxrUEwxVDVPK08zTWVucG40QzNJWTVMRWVwSHBuUGVaSGJ2dVdmZVZ0UGxrSDRMWmpQYkJya0pUM05vUkp6QnQ4NkNPMFhxNTlvUSs4ZHNtMHltUmNtUXluOHc3MW1obWN1RUk1Ynl1RitDODhWUFlseTJzRXpqbHpBUTN2ZG4vMStIemd1dzZxRk5OYnFlbmhaR2JkaUc2UndaYVRHN2pUQTJYOVJkWGpETjl5ajF1UXB5TzRMeDhLUkFjWmNiWk1hZnA0d1BPZDVNZFhvRlk1MlYxQThNOWhpM3NzbzkzK3VwckUwcVlOTWprRTIyQ3ZLNEh1VXhxTjdvSXo1cFd1RVRxMWxRQWpxbFNscWREMlJuci9nZ3AvVFZrUVlqbjlsTWZZZWxrMnNINUhQZG9wWW83TUh3bFYxb3I5QnhmK1FDeUx6bTkydnpHMndqaUlqQy9aSEVKemVyb0psNmJkRlBUcFpobzVNVjJVODZmTFFxeE5sR0lNcUNHeSs5V1loSjhvYjFyMCtXaHhkZTlMMlBkeXNFVHY5N08reFZ3K1ZOTjFUWlNRTjVJNmw5bTVJcDZwTElxTG00YTFCMWZmSDZnSHlxVDlwODJOT2pudFJXR0lvZk8zYkp6NUdoa3ZTV2JzWHVlVEFNYUpEb3U5OWtHTHFEbGh3QlpORVE0bUtQdUR2VndTSzRXbUxsdUh5aEE5N3BaaVZlOGcrSnhtbkpGOElrVi90Q3M0SnEvSGdPb0FFR1I5dENEc0RiRG1pM092aVVRcEc1RDhYbUtjU0FVYUZMUlhiMmxtSlROWWRodFl5ZmpCWVpRbU41cVQ1Q051YUQzQlZubGtDazdic01XM0F0WGtOTU1UdVc0SGpVRVJTSm5WUTB2c0JHYTF3bzNRaDcxMTVYR2VURjNOVHo4dzA0NDBBZ1U3YzNiU1hPL0tNSU5hSVdYZDBvTHBvcS8wL1FKeENRU0o5WG5ZeTFXN1RZTEJKcEhzVldEMWFoc0E3RmpOdlJkNm14Q2lIc204ZzZaMHBuenFJcEYxZEhVdFAySVRVNVoxaFpIYnUrTDNCRUVTdEJiTDlYWXZHZkVha3YxYm1mK2JPWkdub2l1SEVkbEJuYUNoeFlLTnpCMjNiOHN3OFl5VDdBanhmazQ5ZUpJQXZkYlZrZEZDZTJKMGdNZWZoUTBiSVp4aHgzZnpNSXlzUU5pTjhQZ09VS3hPTXVyMTBMZHVpZ1JFRFJNWnlQNG9HV3JQMUdGWTR0Nmdyb0FTc1o0MjFvczQ4d0FkbnJib3ZOaEx0N1NjTlVMa3daNUFJWkpUcmJhS1lUTGpBMW9KM3NJdU4vYVlvY20vOXVvUUhFSWxhY0Yxcy9UTTFmTGNQVEwzOE85Zk9zak1FSXdvUEtmdnQ3b3B1STlHMkhmL1BSNGFDTERRN3dObUlkRXVYSi9RTkw3Mms1cTROZWpBbGRQZmUzVVZWcXpreXM4WVovallPR09wNmMrWXpSQ3JDdXEwTTExeTdUaU42cWs3WVhSTW4vZ3VreHJFaW1iTVFqcjNqd1JNNmRLVlo0UlVmV1FyOG5vUFhMSnE2eWg1UjNFSDFJVk9IRVNzdC9MSXRiRzJEMnZSc1pSa0FPYnp2UUFBRDNtYjMvRzROem9wSTBGQWlIZmJwcTBYNzJhZGc2U1JqKzhPSE1TaHRGeHhMWmxmL25MZ1JMYkNsd2w1V21hWVNzK3lFamtxNDh0WTdaMmJFME45MW1Kd3QrdWEwTmxSSklEaDBIaWtGNFV2U1ZvckZqMllWdTlZZVM1dGZ2bFZqUFNvTnUvWnU2ZEVVZkJPVDU1NWhhaEJkTjNTYTVYdWoyUnZhdTFsUU5JYUM5NDR5MFJXajlVaU5Ec2tBSzFXb0wrRWZYY0M2SWJCWEZSeVZmWC9XS1h4UEF3VXlJQUdXOGdnWjA4aGNpaktUdDFZS25VTzZRUHZjcm1EVkFiMEZDTElYbjVpZDRmRC9KeDR0dy9nYlhzN1dGOWIyUmdYdFBoTEJHOXZGNUZFa2RIQUtyUUhaQUpDL0hXdms3bnZ6ekR6SVhabGZGVEpvQzNKcEdnTFBCWTdTUVRqR2xVdkc1Nzd5TnV0WjFoVGZzOS8xbmtTWEs5enpLTFJaM1ZPRGVLVW92SmUwV0NxMXpWTVl4Q0pNZW5tTnpQSVUyUzhUQTRFN3dXbWJOa3hxOXJJMmRkNnYwVnBjQVBWTXhuRHN2V1RXRmF5eXF2S1pPN1owOGE2Mmkvb0gyL2p4ZjhycG1mTzY0aW4zRkxpTDFHWDhJR3RWRTlNMjN5R3NJcUpieERUeStMdGFNV0RhUHFreW1iNVZyUWR6T3ZxbGRlVTBTVWk2SWlyRzhVWjNqY3BSYndIYTFDMER3dzlHL1NGWDNnUHZUSlFFK2t5eitnMUJlTUlMS0tPK29sY0h6Y3RPV2d6eFlIbk9EN2RwQ1J0dVpFWEFDamdxZXNaTWFzb1BnbnVEQzRuVXZpQUF4RGM1cG5nam9BSVRJa3ZoS3dnNWQ2MDhwZHJaY0ErcW41VE1UNlVvL1F6QmFPeEJDTFRKWDNNZ2s4NXJNZnNuV3g4Nm9MeGY3cDJQWDVPTnFpZVRhL3FNM3RQdzRaWHZsQXA4M05TRDhGNytaZ2N0SzFUcG9Zd3RpVTJoMDJIQ0dpb0g1dGtWQ3FOVlRNSDVwMDBzUnkySlUxcXlEQlAyQ0lJL0RnNFdEc0lsK3pnZVg3NTg5c3J4NllPUlJRTUJmS2JvZGJCNzQzVGw0V0xLT0Vud1dVVkJzbTk0U09sQ3JhY1U3Mk1TeWowNjh3ZHBZanl6MUZ3QzJialFueG5CNk1wL3BaK3l5Wlh0Z3VFYVlCK2txaGpRNlVVbXdTRmF6T2IrcmhZakxhb2lNK2FOOS84S0tuMHphQ1RGcE45ZUt3V3k3L3U0RUh6TzQ2VGRGU05qTWZuMmlQU0p3RFBDRkhjMEkxK3ZqZEFadzVaanFSL3V6aTlabjIwb0FhNUpuTEVrL0VBM1ZSV0U3Si9YcnVwZkZKUHRDVXVxSFBwbmxMN0lTSnRScFNWY0I4cXNaQ20yUUVrV29ST3RDS0t4VWgzeUVjTWJXWUp3azZEbEVCRzBiWlA2ZWcwNkZMM3Y2UlBiN29kR3V3bTdGTjhmRzR3b3F0QjhlN001a2xQcG85N0dvT2JOd3QrbHVkVEFteHlDNWhtY0Z4K2RJdkVaS0k2aWdGS0hxTEgwMWlZMW83OTAzVnpHOVFHZXR5Vng1Uk5tQllVVSt6SXVTdmEveUljRUNVaTRwUm1FM1ZrRjJhdnF1bFFFVVk0eVovd21OYm9CelBtQVBleTMrZFNZdEJaVWplV1dUMHBQd0N6NFZvenhwOXhlQ2xJVTYwcXZFRk1RQ2FQdlBhQTcwV2xPUDlmL2V5MzltYWN2cEdDVmEremZhOGdPNDR3YnhwSlVsQzhHTi9wUk1UUXR6WThaOC9oaU5yVStacTY0WmZGR0lrZGo3bTdhYmNLMUVCdHdzMVg0Si9obnF2YXNQdnZEU0RZV04rUWNRVkdNcVhhbGtEdFRhZDVyWVkwVElSMUVxb3gzY3p3UE1qS1B2RjVzRnYxN1RodWpyMUlaMVl0bDRWWDFKMHZqWEttTFk0bG1YaXBSQXJvMHFWR0VjWHhFVk1NRWw1NGpRTWQ0SjdSamdvbVUwajFwdGp5eFkrY0xpU3lYUGZpRWNJUzJsV0RLM0lTQXk2VVozSGI1dm5QbmNBOTQ0MTFqY3k3NWF5NkI2RFNUeks2VVRDWlI5dURBTnRQQnJ2SURnanNmYXJNaXdvYXgyT2xMeGFTb1luNGlSZ2twRUdxRWt3b3g1dHlJOGFLa0xsZloxMmxPMTFUeHNxUk1ZODlqNUphTzU1WGZQSlBETDFMR1NuQzg4UmU5QWkrTnU1YlpqdHdScnZGSVRVRkhQUjRabXhHc2xRTWVjZ2JaTzduSGszMnFIeFlrZHZXcHVwMDdvamNNQ2FWcnBGQXlGWkpKYk52QnBaZmRmMzlIZG8ya1B0VDd2MC9mOFIvQjVOejRmMXQ5LzN6Tk0vN242U1VIZmNXazVkZlFGSnZjSk1nUG9sR0NwT0ZiL1dDMEZHV1UyYXN1UXlUK3JtODhaS1o3OENlaS9DQWg5MzlDSDBKWWJwWklQdHhjMnVmWHFqUzNwSEg5bG5XSzRpSjdPalIvRUVTcENvMlIzTVlLeUU3ckhmaFR2V2hvNGNMMVFkTjRqRlR5UjZzeU13Rm0xMjRUVkREUlhNTnZlSTFEcC9udHdkejhrOGt4dzdpRlN4NitZeDZPKzFMek1Wck4wQkJ6emlaaTlrbmVaU3pnb2xsQm5Wd0JoNm9TT1BIWHJnbHJPaitRbVIvQUVTcmhEcEtyV1QrOC9BaU1EeFMvNXd3Uk51R1FQTGxKOW92b21oSlduOHNNTFZJdFE4Ti83SVh2dEQ4a2RPb0hhdyt2QlNiRkltUXN2L09DQUl1aTk5RStZU0lPTWxNdkJYa0F0K05BWks4d0I5SmY4Q1B0QitUT1VPUit6NzFkL0FGWHBQQlQ2K0E1RkxqeE1qTElFb0p6clFmcXV2eEVJaStXb1V6R1IxSXpRRk52YllPbnhiMlB5UTBrR2R5WEt6VzJheFFMOGxOQVhQazZORWpxclJEMW9adEtMbEZvb2ZyWHcwZENOV0FTSHp5KzdQU3pPVUozWHRhUFpzeExEanIrbzQxZkt1S1dObWppWnRma096SXR2bFYyTURHU2hlR0YwbWEwNHFFM1RVRWZxSk1yWEZtN0RwSysyN0RTdkNVVmY3cmJOb2xqUGhoYTVXN0tCcVZxMFNoVVNUYlJtdXFQdFFyZVZXSDRKRVQ1eU1odXFNb1NkNHIvTjhzRG1lUWlRUXZpMXRjWnY3TW9jN2RUNVg1QXRDRDZrTkVHWk96VmNOWWxwWDRBYlRzTGdTWVlsaWlQeVZvbml1WVl5U3hzQnk1Y2diM3BEK0VLMEdwYjB3SmcwMzFkUGdhTDhKWnQ2c0l2ek5QRUhmVlBPalhtYVhqNGJkNHZvWHpwWjVHQXBNaElMZ01iQ0VXWjJ6d2dkZVFnak5ITGJQSXQrS3F4UndXUExUTjZId1owT3Vpamo0VUYrU2cwQXU4WHVJS1cwV3hsZXhkckZyRGNaSjhTaGF1YXQzWDBYbUh5Z3FnTDFuQXUyaHJKRmI0d1pYa2NTK2kzNktNeVUxeUZ2WXYyM2JRVUppLzN5UXBxci9uYVVPb2lFV094Y2t5cS9ncTQzZEZvdTFEVkRhWU1aSzl0aG83K0lYWG9rQkNzNUdSZk9jQks3ZzNBK2pYUTM5SzRZQThQQlJXNG01K3lSMFpBeFdKbmNqUlZiSVR2SUFQSFlSdDFFSjNZTGlVYnFJdm9LSHR6SEt0VXkxZGRSVVEwQVVPNDF2b25aRFVPVyttcnN6dytTVy82US9JVWdOcGNYRmprTTdGNENTU1EyRXhaZzg1b3RzTXM3a3FzUUQ0T3hZZUJORGNTcGlmak1vTGI3R0ViR1dUd2FzVk9ibUIvYmZQY1VscTB3WWhYQ1lFRFdSVzAyVFA1YkJyWXNLVEdXam5XRERKMUY3eldhaTB6Vy8yWHNDdXZCUWpQRmNUWWFRWDN0U1hSU204aHNBb0RkakFySy9PRnA2dmNXWU9FN2xpelAwWWMrOHAxNmk3L05pWElpaVFUcDdjN1h1czkyNVZFdGxLQWpVZEZoeWFpTFQ3VnhEYWdwck1Gd2l4NHdaMDV1MHFqN2NEV0ZkMFc5T1lISXUzSmJKS01YUkoxYVlOb3Z1Z2crUXFSTjdmTkhTaTI2VlNnQnBuK0pmTXVQbzNhZXFQV2lrL3dJNVJ6M0JXYXJQUVg0aTUrZE0wbnB3Vk9zWCtLc09oQzd2RGcrT0pzejRRNXpsbkllZmxVV0w2UVlNYmY5V0RmTG1vc0xGNFFldjNtSmlPdUhqb29yL2RNZUJwQTlpS0RrTWpZQk5iUm80MTRIQ3hqc0hyQjRFWE5iSHpOTURIQ0x1TkJHNlNmK0o0TVovRWxWc0RTTHhqSWlHc1RQaHc4QlBqeGJmUXRza2orZHlOTUtPT2NVWUlSQkVJcWJhenozbG1qbFJRaHBseHE2NzNWa2xNTVk2NTk3dnUrZDg5ZWMvenE3TWk0Z1F2aDg3ZWhZYnBPdVpFWGo1Zy9RN1M3QkZEQUFCOUR6RzM1U0M4NTN4dFdWY25aUW9INTRqZU9xWUxSOU5EdXd4c1Z0aFRWN1Y5OW4vQjdIU2JBeXRiRXlWVHovNU5oSjhnR0lqRzBFNWozZ3JpVUxVZDVSZzd0UVIrOTBoSmdOUUtRSDJidGJTZlBjYVRPZklleGMxZGIxQnhVT2hNMXZXQ3BMYVl1S3IzRmROVHQvVDNQV0NwRVVXREtFdHpZcmpwemxML3dyaTNNSVRLc0Z2dEY4UVZWL05oVm85N2FLSUJnZGxpTmMxMGRXZFhWRHBWdHNObisyVUlvbHJncWRXQTRFWThzbzBZdkI0YSthTHpNWGlNQXVPSFFyWFkwdHIrQ0wxMEpidlp6Z2pKSnVCMWNSa2RUN0RVcVR2bnN3VlVwNWtrVVNGVnRJSUZZSzA1K3RReFQ2OTkySEhOV1ZoV3hVc0QxUGtjZUlybFh1VVZSb2d3bWZkaHlyZjZ6emFMOCtjMEw3R1hNWk90ZUFoQVZRVndkSmgrN25yWDd4NExhSUlmejJGMnY3RGcvdURmejJGYSs0Z0ZtMnpIQW9yOFVxaW1KRzNWVEp0WkVvRlhobkRZWHZ4TUpGYzZrdTJiaGJDeHppajJ6NVVOdUswam1wMW1udmtWTlVmUitTRW1qMUxyOTRMeW03NVBPN0ZzME1JcjNHZHNXWFJYU2ZnTFRWWTBGTHFiYTk3dTFJbjhOQWNZN0lDNlRqV0xpZ3dLRUltNDNOeFRkYVZUdjltY0trenV6QmtLZDh4L3h0MXAvOUJiUDdXeWI0YnBvMUsxZ25PcGJMdkt6NThwV2wzQjU1UkovWjVtUkRMUHROUWcxNGpkT0VzOStoL1Y1VVZwd3JBSThrR2JYOEtQVlBESU1mSXFLRGpKRDlVeURPUGhqWjN2RkF5ZWN3eXE0YWtVRTltRE90SkVLMWhwRHlpNkFlODdzV0FDbFhHVGl3UHdON1BYV3dqeGFSNzlBckhSSVBlWUtUdW5WVzI0c1ByLzNIUHoySXdIOG9LSDRPbFdFbXQ0QkxNNlc1ZzRrTWNZYkx3ajJ1c29kRDEwODhzdFpBN1ZPc1VTcEVWbDR3N05NYjFFVUhNUnhBeExGMENJViswTDNpWmIrZWtCMXZTRFNGakFaM2hmTEpmN2dGYVhyT0tuK21oUityV3cvZVRYSWNBZ2w0SHZGdUJnMUxPbU9Bd0pIM2VvVkVqandoZUtBNGljYnJRQ212QXRwUTBtWEcwYWdZcDVtajRSYjZtZFErUlY0UUJQYnhNcWg5QzdvOG5QMFdrbzJvY25DSGVSR2hOMVhWeVQyYjlBQ3NMKzZ5bFV5K3lDM1FFbmFLUklKSzkxWXRhb1NyY1daTU13eHVNMEU5SjY4WitZeWpBMGc4cDFQZkhBQUlST3k2U2EwNFZYT3VUNkEzNTFGT1doS2ZUR3NGSjNSVEpHV1lQb0xrNUZWSzRPYVlSOWhrSnZlendGOXZRTjExMjZyNmlzTUdYV1RxRlcrM0hMM0kvanVybElkRFdJVnZZWStzNnlxN2xyRlNQQUdSZG5VN1BWd1kvU3ZXYlpHcFh6eTNCUTJMbUFKbHJPTlVzWnM0b0drbHkwVjI2N3hiRDVLTVk4d29OTnNtV0cxVlZnTENyYThhUUJCY0k0RFAyQmxOd3hoaUN0SGxhejZPV0ZvQ1cwdk1SM0Vyckc3SnlNalRTQ252UmNzRUhnbVBud0E2aU5wSjJEckZiNGdMbGhLSnlaR2FXa0E5N0g2RkZkd0VjTFQ2RFJRUUwrK2ZPa1ZDNGNZR1cxVEcvM2lLNWRTaFJTdWlCdWxtaWhxZ2pSNDVWaTAzbzJSYlFiUDNzeHQ5MFZ4UTZ2emRsR2ZrWG1tS21qT2kwODBKU0hrTG50anZzQkpudjdnS3NjT2FUT2tFYVJRcUFuQ0E0SFd0QjRYbk10T2hwUm1IMkZIOHRUWHJJakFHTldFbXVkUUxDa2NWbEdUUTk2NUtoMEg2aXhYYmdJbVFQNmI0MkI0OXNPNUM4cGM3aVJsZ3l2U1l2Y25IOUZnUTNhekxiUUcyY1VXOTZTRG9qVFFTdHhrT0p5T3VER1RIQW5uV2t6MjlhRXdOOUZUOEVKNHloWE9nK2pMVHJDUEtlRW9KOWE3bERYT2pFcjhBZ1g0Qm1uTVE2NjhvVzB6WVB5UWlWTVB4S1JIdHBmbkVFeWFLaGR6TlZUaGx4eERRTmRySGVaaVVGYjZOb1kyS3d2U2I3Qm5SY3BKeSsvZy96QVl4M2ZZU041UUVhVkQyWTFWc05XeEIwQlNPMTJNUnNSWThKTGZBZXpSTXo1bFVSdUxVbkcxVG9LazZRMzBGdWdocVdONmdCTmNGeFAvblkvaXYraWFVUU9hKzJOdXltNDZ3dEkvRHZTZnpTcDFqRWk0U2RZQkU3WWhUaVZWNWNYOWd3Ym9WRE1WZ1pwNVlCUWxIT1F2YUROZmNDb0NKdVloZjVrejVrd2lJS1BqemdwY1JKSFBiT2hKYWplb2VSTDUzY3VNYWhoVjhaN0lScjZNNGhXMEp6VDdtemFNVXpRcG04NjZ6d003Q3MwN2ZKWVh1V3ZqQU1rYmU1TzZWNGJ1NzFzT0c2SlE0b0w4ekllWEhoZUZWYXZ6eG1sSXlCa2djOUlabEVEcGxNUHI4eGxjeXNzNHBWVWR3SzFlN0NLMmtUc1NkcTdnNVNIUkFsM3BZVUI5S280ZnNoNHFsZU95SnYxejNLRlNUU3Z3RWNSTy9FdzhvekVEWVpTcXBmb1ZXOXVoSmZZck5BWFIwWjNWbWVvQUQrclZXdHdQLzEzc0UvM0lDWDNIaERHM0NNYzQ3NmRFRUMwSzN1bVNBRDRqK1pRTFZkRk9zV0wyQzFUSDUrNEtpU1dIK2xNaWJvK0I1NWhSM0dxNDBHMW4yNXNHY04wbUVjb1Uyd045RkNWeVFMQmhZT3U5YUhWTFdqRUt4MkpJVVppNXlTb0hVQUk5YjhoR3phTE14Q1pETUxodjhNa2NwVHFFd3o5S0ZEcENwcVFoVm1zR1FOOG0yNHd5QjgyRkFLTm1qZ2ZLUnNYUm1zU0VTb3ZBd1hqQklvTUtTRzUxcDZVbThiM2k3R0lTczdralRxL1Bab2lvQ2ZKemZLZEpUTjBRNDVrUUVRdWg5SDg4TTN5RXMzRGJ0UlRLQUxyYU0wWUM4bGFpTWlPT2U2QURtVGNDaVJFZUFXWmVsQmFFWFJhU3VqMmx4MHhIYVJZcUY2NU8wTG81T0NGVTE4QThjTURFNE1MWW05dzJRU3I5TmdRQUljUnhac05wQTdVSlIwZTcxSkwrVlUrSVNXRms1STk3bHJhOHVHZzdHbFFZaEdkNEdjNnJ4c0xGUmlJZUdPNGFiUDRTNGVrUTFmaXFEQ3k4N0daSGQ1MmZuNWFhREd1dk9tSW9mcnpwVndNdnRicmVaLzg1NU9hWFRSY05pTkUwd3pHWlN4YmpnMjZ2OGtvOEw1Mzd2L1hDQ1dQMk1GYUFySnB2bmtlcDBwQStPODZNV2pSQVpQUVJmem5aaVNJYVRwcHk2bTNwNkhyTlNzWTdmRHR6N0NsNFYvREpBalFEb3lpTDJ1d2YxVUhWZDJBSXJ6QlVTbEphVGo0azZOTDk3YS9HcWhXS1U5UlVtam5ZS3BtMnIrSllVY3JrQ3VaS3ZjWXZyZzhwRG9VS1F5d1k5R0RXZzAzRFVGU2lybFVYQlM1U1duL0tBbnRuZjBJZEhHTC83bXdYcURHK0xaWWpiRWRRbXFVcXE0eTU0VE5tV1VQN0lnY0F3NTgxNllCendpTklKaUU5TTRsUEN6ZUkvRkdCZVl5M3A2SUFtSDRBalhYbXZRNEl5MFk4Mk5Ub2JjQWdnVDJDZHF6Nk14NFRkR29xOWZuMmV0cldLVU5GeWF0QUh5ZFFUVlVRMlM1T1dWVWx1Z2NOdm9VcmxBOGNKSno5TXFPYS9XM2lWbm80ekRIZkU3emhvWTVmNWxSVFZaRGhyUWJSOExTNGVSTHo4aVBNeUJMNm80UGlMbHA4OUZqZG9rUUxhU0JtS0hVd1dwMG5hNWZFM3Y5em55MlljRFhHL2pmSTlzY3R1bEhSYmRrSTVhNEdPUEp4NG9BSlF6VloveVlBYWRvOEtOWlVkRUZzOVpQaUJzYXVzb3RYTU5lYkVncjBkeW9wdXFmU2NGSjNPRE5QSGdjbEFDUGRjY3d2MFlKR1Fkc04ybGhvVjRIVkdCeGNFVWVVWC9hbHI0bnFwY2MxQ0NSM3ZSN2c0MHp0ZVFnL0p2V21GbFVFNG1BaVRwSGxZR3JCN3crVTJLZFN3UXoyUUpLQmUvNWVpaXhXaXBtZlAxNUFGV3JLOFNoMUdCQllMZ3praTF3VE1oR1FtYWdYcUoyK0Z1cUo4ZjBYelhDVkpGSFFkTUF3OHhjbzExSGhNMzQ3YWxyQXUrd21YM3BERkFCT3ZrQytXUFgwVWhnMVo1TVZIS05ST3hhUjg0WVYzczEyVWNNKzcwY0o0NjBTekVhS0x5aDQ3MnZPTUQzWG5hSzd6eFpjWGxXcWVuRXZjam1nR05SMk9LYkkxczhVK2l3aVcrSG90SGFscDNlMU1HRHk2Qk1WSXZham5BemtGSGJlVnNnam1KVWtyUDlPQXduRUhZWFZCcVl4M3E3THZYam9WUjBtWThoK1phT25oMDUzcGRzR2ttYnFoeXJ5TjAxZVZIeVNyK0NrRFlrU01lWjF4alBOVk0rZ1ZMVERLdTJWR3NNVUpxV080VHdQRFAwVk9nMi84SVRiQVVhTUdiNExqTDdMK1BpMTFsRVZNWFRZSWxBWi9RSG1URU5qeXgza0RrQmRmY3Z2UXQ2dEtrNmpZRk00RUc1VVhEVGFGNSsxWmpSejZXN01kSlBDK3dUa2JEVWltNHA1UVFIM2I5a0drMkJraWx5ZXVyOEJjMjB3bTV1SlNCTzk1R2ZZREkxRVppcG9SYUg3dVZ2ZW5lcXo0M3RsVFpHUlE0YTdDTm1NSGdYeU9RUU9MNldRa2dNVVRRRFQ4dmgyMWFTZHo3RVJpWlQxaks5Rit2NndnRnZ1RW1HbmdTdklVUjJDSmtjNXR4MVF5Z2ZabkFydU9Ob2JCMWlkQ0xCMUZDZk83TjFaZFJvY1Q4L1d5ZStFbkRpTzlwenFJcG5MRGw0YmthUktXK2VrQlZ3SG40NlNodzFYMHRjbHQvMFJPaWp1VUI0a0lJbnJWSlU0YnVXZjRZSVRKdGpPSjZpS2RyMXUrZmxnUWVGSDcwR3hLamhkZ3QvTXJ3ZkI0Sy9zWGN6USs5elljckQ0ZGhZNnFaaFowMTBycnhnZ1dBOEphWnlnMnBZaWo4aWVZRWcxYVpKa1pLOU8xUmU3c0IwaW91ZjYwckswR2QrQVlscDdzb3FDQkNER3dmS2VVUWhDQm4wRTBvMEdTNlBkbWpMaTBUdENZWmVxYXpxd04reU5JTklBOExrM2lQRG5XVWlJUExHTmNIbVpEeGZlSzBpQWR4bS9UN0xuTitnZW1STDYxaEhJYzBOQ0FaYWlZSlIrT0huTFdTZThzTHJLOTA1QjVlRUpITmxXcTRSbUVYSWFGVG1vNDlmOHc2MStOd2ZFVXl1SkF3VnFaQ0xGY3lIQktBY0lWajNzTnpmRU9YelZLSW5keEh3K0FSOTNvd2hiQ3hVWmY2R3M4Y3o2LzFWZHJGRVBydjMzMCs5czZCdE1WUEozemwvVWY5clVpMFovb3BleGZkTDN5a0Y3NmU5OTlHUGZWdjhmSnYvWS8rLzVoRU1vbjF0cU5GeVZSZXZWOXk5L3VJdnNHM2RiQjhHUlJyZ2FFWGZoeCsyeGVPRnQrY0VuM1JaYW5OeGRFZTIrQjZNSHBOYnJSRTUzUGxEaWZQdkZjcDRrTzc4SUxSMFQ0eHlXL1dHUHlCc3FHZG9BN3pKSkN1MVRLYkdmaG5xZ25SYnhiQjJCM1Vab2VRMmJ6MnNUVm5Vd29rVGNUVTIxUnhOMVBZUFMzU2FyN1QwZVJJc3lDTm93cjlhbXdvTVUvb2Q5czJBUHRpS05MNkVOT2x5S0FEc3RBRVdLQStzZEtEaHJKNkJPaFJKbVorUUpiQWFaMy81RnEwL2x1bUNnRXpHRWJ1M3lpMFk0STRFZ1ZBanF4aDRIYnVRbjBHclJoT1d5QWZzZ2xRSkFWTDF5LzZ5ZXpTMms4UkUyTXN0SkxoOTJOT0IzR0NZZ0ZYem5GNGQyNXFpUDRaQ3lJNFJZR2VzdXQ2RlhLNkd3UHBLSzhXSEVraFl1aTBBeUVtcjVNbDN1QkZ0UEZkbmlvSThSaUNvb2E3WjFHMVd1eUlpM25TTmdsdXRjK3hZOEJrZVczSkpYUEs2amQyVklNcGFTeHBWdEZxK1IreVNLOUo2V0c1UXZ0K0MrUUgxaHlZVU9WSzc4NTduRm15REJZZ1ovbytBbmliek5WcXlZQ0pRdnlEWERUSytpWGRrQTcxYlk3VEwzYnZ1THhMQlE4a2JUdlRFWTlhcWtRMytNaUxXYkVnakx6T0grbFhnY28xRVJnemQ4MHJEQ3ltbHBhUlFiT1luS0cvT0RvRmw0Nmx6VDBjak01RllWdnYwcUxVYkQ1bHlKdE1VYUMxcEZsVGtOT054NmxsaWFYOW8waS8xdndzNWJOS241T3VFTlFFS21MbGNQNG8yWm1KakQ0enpkM0ZrMzJ1UTR1UldrUFNVcWI0TEJlM0VYSGRPUk5CMkJXc3dzNWRhUm5NZk5WWDdpc1BTYjFoTVFkQUppMS9xbURNZlJVbENVNzRwbW56amJYZkw4UFZHOE5zVzZJUU0yTmUyM2lDUElwcnlKalliVm5tNWhDdktwTWE3SExWaU5pTmMreFRmRElhS20zamN0VmlEOEExTTlZUEpOazAwM1ZWcjRabzJNdUdXOHZpbDhTTGFHcFBYcUc3STRETGR0bDhhNFJieDFMdDR3NUh1cWFhMVh6WkJ0ajIwOEVKVkdjbUtZRXVhZU4yN3pUOUVFNmEwOUplclhkRWJwYU5nTnFZSmRoUDFOZHFpUEtzYkRSVWk4Nlh2dk5DN3JNRTVtclNRdHJ6QVpWbmR0U2pDTXFkOEJtYWVHUjRsNFlGVUxHUkJlWElWOVk0eXhMRmR5b1VOcGl5MkloZVBTV3pCb2ZZUFAwZUlhMnE1SlA0ajlHOGF0L0Fxb1NzTEFVdVJYdHZnc3FYL3pZd3NFK29mNm9TRGJVT280Uk1KdytET1VUSnEraG5xd0tpbTlZeS9uYXB5Wk5UYzJyQ3E2VjlqSHRKYnhHUER3bHpXai9TazN6Ri9CSE9sVC9mU2pTcTdGcWxQSTFxNkorcnU4QWt1MDA4U0ZJTlhaZk9mblpOT3ZHUE10RW1uMmdMUHQrSDRRTEErL1NZZTRqMzk4YXV6aEtJcDJQb2szbVBDNXExSU4xSGdSK21uRWZjNE5lZUhZd2QyL2twc3pSM2NCbjduaTlOYklxaHRTV0ZXOHhiVUp1VVBWT2VlWHUzajBJR1ptRk5pd2FOWjZySDQvelEyT0R6NnRGeFJMc1VZWnUxYmZkMXVJdmZRRHQ0WUQvZWZLWXY4VkY4YkhHRGdLMjJ3Mldxd3BpNDN2TkNPWEZKWkNHTXFXaVBiTDhtaWw2dHNtT1RYQVdDeU1DdzczZTJyQURaajJJSzZycWtzTTNFWEYyY2JMYjR2akIxNHdhL3lYSzV2d1UrMDVNekVSSjVuWHNYc1cyMW83TStnTzBqczJPeUtjaVA1dUYyaVh5YjJEaXB0d1FlSGVxeWdrck5zcVZDU2xsZHhCTXB3SGkxdmZjOFJLcFAvNEwzTG1wcTZEWmN2aEREZnhUQ0Uzc3BsYWNUY090WGRLMmczMDNkSVdCVmUyd0QvR3ZqYTFjQ2xGUTY3Z3cwdDFaVXR0c1VnUTFWZWt5OG9PcFM2a3NZRWM0YnFzZUNiWnk3NjZTdkwzRm9kbW5haGxXSlJnVkNOalB4aEwvZmsyd3l2bEtoSVRIL1ZRQ2lwT0kwZE5jUmE1QjFNNUhtT0JqVExlWlFKeTIzN2UybW9id21EeUpOSGVQaGREbWlrbnZMS2FEYlNoTCtJczFYVENKdUxRZDJ3bWRKTDcrbUt2czI5NHdoWFFEK3Z0ZDg4S0trMERYUDhCMVh1OUoreG82OVZPdUZnZXhnVHJjdkk2U3lsdHVMaXg5T1B1RTYvaVJKWW9CTUVYeFU0c2hRTWY0Rmpxd2YxUHRuSi93V1NaZDI5cmhaalJtVEdnaUdUQVVRcVJ6K25DZGplTWZZaHNCRDVMdjYwS0lMV0V2TkVIZm1zRHMyTDBBMjUyMzUxZVVvWXhBeXNWYUNKVkxkSDlRRldBbXFKRENPRFVjZG9vMTIrZ2Q2YlcyYm9ZMHBCVkhXTDZMUURLNWJZV2gxVjh2RnZpMGNScGZ3djdjSmlNWDNBWk5KdVRkZEhlaFRJZFUwWVEvc1ExZExvRjJ4UVBjQ3VIS2l1Q1dPWTMwREhlMU93Y0NsTEFocUFLeXFsbkliSC84dTlTY0pwY1M0a2dwNkhLRFVkaU9nUmFSR1NpVUNSQmp6STVnU2tzTVpLcXk3U2Q1MWFlZzB0Z0oreDBUSDlZSDJNZ3NhcDlON0VOWmRFQjBiZXkyRE1UckJBMWhuNTZTRXJOSGYzdEt0cXlMOWI2eVhFUDk3L3JjK2pnRDJOMUxOVUg2Uk05QXpQM2tTaXByMDZSa0tPb2xSN0hPNzY4ampXaUgxWDkyakE3ZGtnN2djTmNqcXNaQ2dmcVd3MHRQWGRMZzIwY0Y2dm5ReXBnN2dMdGthenJIQW9keVlmRU5QUVpzZGZuak1aaU51NG5KTzk3RDEvc1FFKzN2TkZ6clNET0t3K2tlTEVDWWY3Ukp3VkhlUC9qNzk4MzNvWjBlZ29uWUIyRmxGRTVxajAyQi9MVk9NSlFsc0I4dU5nM0xlZzRxdFp3bnRzT1NOaWRSMGFiYlptQUs0c0N6dnQ4WWl1ejJ5ck5DSm9INU84WHZYL3ZMZVIvQkJZVFdqMHNPUFlNL2p5eFJkNSsvSnppS0FBQmFQY3cvMzRVQTNhai9nTFp4WmdSQ1dONm00bTNkZW1hbk5nc3gwUDIzNy9RK0V3NVZZbkpQa3lDWTBjSVZIb0ZuMkF5L2U3VTRQMTlBUGJQRlhFSFg5NE42S2hFTVBHN2l3QjMrSStPMWpkNW42VlNnSGVneGdhU2F3TzZpUUNZRmdEc1BTTXNOT2NVajRxM3NGNkt6R2FILzB1NVBRb0FqLzh6cTZVYzlNb05yR3FoWWViMmpRbzBXbEdsWGp4dGFuWkxTMjQvT0lONUd4LzJnNjg0QlBEUXB3bHFua0ZjeHBtUC9vc25PWHJGdXU0UHFpZm91UUgwZUY1cUNrdklUUWJKdy9adnk1bUFIV0M5b1UrY1RpWWhKbVNmS3NDeXQxY0dWeGlzS3UrTnltRVFJQXlhQ2d1ZC9WMDlxVDNuay85cy9TV3NZdGhhN3lOcHpCSU1NNDByQ1NHYUo5dTZsRWtsMDB2WEJpRXQ3cDlQNUlCQ2lhdnluRU92N0ZnTHFQZGVxeFJpQ3d1RlZNb2xTSVVCY295ZlVDMmUyRkpTQVVnWWRWR0ZmMGIwS24yRVpsSzk3eXl4clQyTVZndnRSaWtmZGFBVzhSd0VFZk4rQjcvZUs4YkJkcDdVUnBicW4xeGNyQzZkMlVqZHNLYnpDakJGcWtLa29adDdNcmhnNllhZ0U3c3BrcWowak9yV00rVUdRME1VbEcyZXZQMXVFMXAyeFN2NGRNSzBkbmE2RU5jTlVGK3hrYUo3Qjc2NE5keExDcHV2aGJsbHRWUkFmN3ZLNXFQdHRKLzlSWUZVVVNHY0xkaWJuejZtZjdXa1BPM01rVVVoUjJtQU91R3Y4SVd3NVhHMVp2b1ZNbmpTQVplNlQ3V1lBOTlHRU54b0hrTWlLeEhsQ3VLNUdkMElOcklTSW1IUXJRbXY2RjRtcVUvVFRROG5ITUR6Q1Jpdkt5U1E4ZHFrcFFnblVNbndJa2FBdWM2L0ZHcTFodzNiMlNiYTM5OEJoVXdVWlNBSU84WFp2bnVMZFkybjZoT1h3cytncTlCSFVLY0tGQTZrejZGRG5weExQSUNhM3FHaG5jOTdibzFGVC9YSms0OExya0hKMkNBdEJ2MFJ0Tjk3TjIxcGxmcFhIdlo4Z01KYjdaYzRjZkk2TWJQd3NXN0FpbENTWE1GSUVVRW1pcjhYTEVrbEEwenRZYkdwVFRHcXR0cDVocEZUVElxVXlhQUlxdk1UOUEveCtKaTVlakE0Qmh4Yi9jbDFwVWRPRDZlcGQzeWlsSWRPNmoyOTd4SW5vaUJQdUVEVzIvVWZzbER5aEdrUXM3V3kyNTNiVm5sVCtTV2c4OXpZSUsvOUtYRmw1ZmUram93MnJkNUZYdjh6RFBybWZNWGlVUHQ5UUJPL2lLNFFHYlg1ai83UngxYzF2enNZOE9OYlAzbFZJYVByaEw0KzFRckVDVE4zbnlLYXZHRzBnQkJ0SHZUS2hHb0JIZ01YSFN0Rm93TitIS3JQcmlZdStPWjA1RnJuOG9rUXJQYWF4b0tQMVVMQ1MvY21LRk4zZ2NIN0hRbFZqcmFDZVFtdGpnMXBTUXhldXFYaVNLZ0xweGMvMU9pWnNVNCtuNGx6NGhwYWhHeVdCVVJMaTQ2NDJuMWduOXF6OWJJc2FDZUVQSjB1Sm1lbk1XcDJ0Sm1Jd0xRNlZTZ0RZRXJPZUJDZlNqOVA0Ry92STdvSUYrbC9uNWZwOTU2UWd4R3Z1cjc3eW5hd0F1M0c5TWRGYkpidTQ5TlpuV25uRmNRSGp4UnVoVVl2ZzFVL2U4NE40SlRlY2NpREFLYi9LWUlGWHpsb3l1RTFlWVhmNTRNbWhqVHE3Qi95QlRvRHp6cHgzdEpDVG8zSENtVlBZZm10QlJlM21QWUVFLzZSbFRJeGJmNGZTT2NhS0ZHazRnYmFVV2U0NGhWazlTWnpoVzgweWZXNVFXQkh4bXRVenZNaGZWUWxpNGdaVGt0SU9aZDltako1aHNibXp0dGFIUUIyOUFtM2Raa214M2cvcXZZb2N5aFoyUFhBV3NOUWlJYWYrUThXL01XUElLNy9UanZDeDVxMlhScDRsVld5ZE1jMndJUWtoYWREQjB4c253L2tTRXlHakxLakk0Y29WSXd0dWJURjNFN01KNkxTNlVPc0pLajgyWFZBVlBKSmNlcGZld2J6RTkxaXZYWnZPdllmc21NZXZ3dFBwZk16R21DN1dKbHlXMmowamg3QUYxSkxtd0VKU0tZd0l2dTZESGMzWW55TEg5WmRJQm5RK25PVkRSaVArUkVwcXYrK3R5cFlISXZvSnlJQ0dBNDBkOGJSN0hSMms3ZG82VVFUSEY0b3JpWWVJUWJ4S2U0VGg2Ky9sMUJqVXRTOWhxT1JoM01iZ3ZZclN0WFRmU3dhQk9tQVZRWnpwWU5xc0FtUXlqWTU2TVVxdHkzYy94SDZHdWhOdk5hRzl2R2JHNmNQdEJNOFVBM2U4cjUxRDBBUjlrb3pLdUdHU01nTHozbkFIeERObmM3R1R3cExqNy82SGVXcDFpa3NEZVRqd0NMcHhlanVNdHBNbkdKZ3Npa3Uxc09BQ3dROXVrekVTaURSTjc3WU5FU3hSNUxwaE9sY0FTWEE1dUl0czFMbkJJY24xSjdCTFdzNDlETUFMU251ejk1Z2RPclRacjB1MVNlWUhpbm5vL3BFNTh4WW9YYlZPL1MrRkVNTXM1cXlXa01ucDhRM0NseVRsWlA1Mlk5bnE3YjhmSVRQdVZYVWs5b2hHNUVGSHc0Z0FFY2pGeGZLYjN4dUFzRWp4Mnoxd3hOYlNaTWNnUzlHS3lXM1I2S3dKT05ndEE2NExUeXhXbThCdnVkcDBNMUZkSlBFR29wTTRGdmc3Ry9oc3B0a2hDZkhGZWd2NEVOd3hQZVhtWWh4d1p5N2pzK0JlTTI3dDlPREJNeW5WQ0xKN1JXY0JNdGVaSnR2ak9ZSGI1bE9uQ0xZV05FTUtDNTlCQTdjb3Z1MWNBTmEyUFhMMDVpR2R1Zk96a2dGcXFIQk9yZ1FWVW1MRWMrTWt6NFJxOE82V2tOcjdhdE5rSDRNOGQrU0QxdC90U3p0M29GcWwrbmVWcytBd0VJNUphQkpheEFSdFkyWjRtS29VcXhkczRVcFowc3YzekliTm9vMEo0ZmlobGRRVFgzWE5jdU5jWm1jckI1TFRXTWR6ZVJ1QXRCazNjWkhZUUY2Z1RpM1BOdURKMG5tUis0TFBMb0h2eFFJeFJnSjlpTk5YcWYyU1lKaGN2Q3RKaVZXbzg1VHN5Rk91cTdFeUJQSnJBZGhFZ0UwY1RxMTZGUVhoWVBKRnFTZmlWbjBJUW5QT3kwTGJVNEJlRzk0UWpkWU5CMENpUTNRYXhRcUQyZWJTTWlOamFWYXc4V2FNNFo1V256Y1ZEc3I0ZUd3ZVNMYTJERTNCV1ZpYXhoWkZJY1NUamd4TkNBZmVsZytoem5WT1lvZTVWcVRZczFnN1d0ZlRtM2U0L1dkdUM2cCtxcUFNOEg0WnlySkNHcGV3VGhURFBlNkg3Q3pYL3pROFRtK3I2NUhlWm4rTXNteFVjaUVXUGxBVmFLL1ZCYVFCV2ZvRy9hUkwvalNaSVFmZXAvODlHamFzV21iYVd6ZUVaMlIxRk9qdnlKVDM3TzlCODA0NlNSU0tWRW5YV2xCcWJrYjVYQ1MzcUZldUU5eGI5K2ZyRWtueFdCNWgxRC9ocnV6MmlWREVBUzcrcWtFejVPdDVhZ0hKYzdXQ2RZOTRXczYxc1VSY1g1bkc4VUVMR0JBSFozaSszVnVsQXlUMG5LTk56NEsyTEJIQldKY1RCWDF3emYrLy91L2ovOSsvL3Y4Nys5L2w5TGJoL0wvdXlOWWlUc1dWMkx3c2phQTZNeFR1ekZNcW14VzhKdy8rSXBwZFg4dC9DbGdpMXJJMVNOMFVDL3I2dFgvNGxVYzJWVjFPUVJlU2VDc2pVcEtaY2h3NFhVY2pIZnc2cnlDVjNSOHM2VlhtNjd2cDRuK2xjUFY5Z0p3bWJLUUVzbXJKaTljMnZrd3JtOEhGYlZZTlRhUkdxOEQ5MXQ5bjUrVSthRC9oTnROM0hqQy9uQy92VW9HRlNDa1hQK05sUmNtTFVxTGJpVUJsNExZZjFVL0NDdnd0ZDNyeUNIOGdVbUdJVEF4aUgxTzVybkdUejd5MUx1RmptbkZHUTFVV3VNN0h3Zlh0V2wyZlBGS2tsWXdOVXBGMklML1RtYVJFVGpRaU01U0phY0krM0d2NU1CVThsUDVJbzZnV2thd3B5ek5FVkdxT2R4NFlsTzFkQ3ZqYldGWldiQ21laUZLUFNsTUt0S2NNRkxzL0tReHRnQUhpN05aTkNRMzJiQkFXMm1iSGZsVlo4d1hLaTFKS1ZIa1cyMGJuWW5sM2RLV0plV0pPaVgzb0tQQkQ2WmJpMFp2U0l1V2t0VUhCOHFEUjhETU1oMVpma0JMOUZTOXg1cjBoQkdMSjhwVUNKdjNOWUgrQWU4cDQwbVpXZDVtNWZob2JGalFlUXZxVFQ0VktXSVlmUkwwdGZhWEtpVmw3NWhIUmV1VEpFY3FWbHVnK2VPSUljNGJkSXlkdG4ySzBpTlpQc1lXUXZRaW8ycWJPM09xQWxQSERET0I3RGZqR0VmVkY1MUZxcU5hY2Q2UW1nRktKcE1mTHA1REhUdjR3WGxPTktWWEY5elRKcERWNG0xc1lacUpQaG90Y3NsaVpNOHlrc0trQ2t6cGlYdCtFY1JRdlNRcW1CUzlXZFdreE1USlhQU3c5NGpxSTN2YXJDalF4VGF6amxNSDhqVFM4aWxhVzgwMTQvdndBL0xOYStZaUZveXl4M3MvS3N3UDNPOFFXMWp0cTQ1eVRNL0RYOWE4TTR2b1RWYU8yZWJ2dzFFb29Edy95ZzZZMWZhWStXd3JkVnM1WXQwaFE1RXdSZllYU0Z4cmF5MVl2U00ra1ltbHBMRzIvOW1tMU1mbWJLSFhyNDRJaDhuVktiMU01MzdaQU5Va0N0ZHNQWjgwSlZLVkthYlZIQ2FkYUxYZytJVjhpNUdTd3BadGkwaDZkaVRhS3M5c2RwVUtFcGQ3akRVcFltSHRpWDMzU0tpTzN0dXlka2F4QTdwRWM5WElRRU9mV0psc3pqNVlwTDViS2VReVQ3YVpTQk9hbXZTSGw4eHNXdmdvMjZJUC9icWsrMEVKVXorZ2trY3ZsVWx5UHAya2RLRnR0N3k1YUNka3M5WkpKY0ZwNVpXZWFXS2d0blhNTjNPUndHTEJFMFB0a0VJZWs1RlkyYVZzc1VaSHRzV0l2bmxqTVZKdHVWSWpwWnVwLzVWTDF5UE9IV1dIa09NYzZZeVNXTWNrY3pENWpVajJtbExWcXVGYU1VOGxlR1ZhcWVYaXMrYVJSTDh6bTRXdUJrNmN5V2ZHTXhndHI4dXNlUUV4N2svUHZSb1p5ZDluZGUxR1VDVjg0Z01YOE9ndS9CV2V6WVBTUjI3bGx6UW5BOTdvbzBwWXl4b2JZVUpmc2oreXNUbTl6SitTNHBrMFRHbzlWVEcwS2pxWWhUbUFMZm9EWlZLbGEyYjV5aHYyNDFQeEZhTEpzM2kwNUswQUFJZGNHeENKWm1UM1pkVDdDbGlSN3Era3VyN1dkUWp5Z1l0T1dSTDlCOEU0czRMSThLcEFqN2JFMGRnN0RMT2FYK01HZUFpMGhNTVNTV1pFeitSdWRYYlpDc0dZUzBRcWlYakg5WFFiZDhzQ0IrbklWVHE3L1QvRkRTK3pXWTlxN1oyZmRxMXRkTGI2djNoS0tWREF3NWdqajZvOXIxd0hGUk9kSGMxOE1KcDRTSjJVY3Z1K2lROUVna2VrVzhWQ00rcHNNNnkrLzJTQnk4dE5ONGEzTDFNelArT0xzeXZFU281Z1M3SVFPbklxTW12aUpCVmM2emJWRzFuOGVYaUEzajQ2a212dnRKbGV3d05EcnhrNFNiSk90UC9UVi9sSVZLOXVlU2hOYmJNSGZ3bkxUTExoYlp1Tzc5ZWM1WHZmZ1J3TEZLK3cxcjVaV1cxNXJWRlpyRSt3S3FOUnY1S3FzTE5mcEdnbm9VVTZZNzFOeEVtTjdNeXF3cUFRcW9JVUxPdy9MYnVVQjIrdUU3NWdKdCtrcTFxWTRMb3hWK3FSL3phbHVwZWEzRDUrV01lYVJJbjBzQUk2RERXRGgxNThmcVViNFloQXhoUkViVU4wcXl5SllrQlU0VjJLQVJYRFQ2NWdXM2dSc2l2N3hTUFlFS0x3emdyaVdjV2dQcjBzYlpudjdtMVhITkZXNnhQZEdOWlVkeEZpVVlsbVhOakRWV3V1N0xDa1gvblZrclhhSmhpWWt0QklTQzJ4Z0JYUW5ORVArY3B0V2wxZUc2MmE3Q1BYcm5ya1RRNUJRQVNiRXFVWldNRGlaVWlzS3lIRGVMRk9hSklMVW81ZjZpRHQ0Wk84TWxxYUtMdG8wQW1USFZWYmtHdXlQYTFSL3l3WnNXUm9SRG9SZE5NTUh3WVRza2xNVm5sQWQyUzAyODJiZ01JOGZpSnBEaDY5T1NMNkszcWJvMjBLZnBOTXVybllHUVNyL3N0RnFaN2hZc3hLbExuS0FLaHNtQjhBSXBFUTRiZC9OclRMVFhlZnNFNkNoUm1LV2pYS1ZncEdvUHM4R0FpY2dLVnc0SzBxZ0RneTFBNmhGcTFXUmF0M2ZIRitGa1UrYjZINE5XcE9VM0tYVHhySWIycVNIQWIrcWhtOGhpU1JPaS85b2ZhcGp4aHlLeHhudFBwZ2U2S0w1WjQrV0JNWWtBY0U2KzBIZDNZaDJ6QnNLMk1WM2lXMFk2Y3ZPQ3JvWGxSYjJNTUp0ZFd4KzNka0Z6R2gyUGUzRFo5UXBTcXBhUi9yRTFJbU9ySHFZWXljY3BpTEMyMmFtSklqUldWQWhlclRmcFFMbW82L0sycG5hODVHckR1UVBsSDFUc2FyOGlzQUpiWExhZlN3T29mNGdnOVJrQUdtL29ZcEJRUWlQVW95RGsyQkNRMWsrS0lMcTQ4RXJGbzRXU1JoSExxL3k3bWd3MytMODVQcFA2eFdyNmNncDlzT2pZakthZ09yeEYxNDh1aHVhV3RqZXQ5NTNmaDFJUWlFemdDK2QySWdCQ2NVWnFnVEFJQ20yYlI4b0NqRExCc21nK1RoeWhmRCt6QmFsc0tCWTFDZTU0WS90OWN3ZmJMdTlTRndFZ3BoZm9wTkEzeU54Z3lEYWZVTTNtWVRvdlpOZ1BHZGQ0WkZGT2oxdnRmRlczdTdOK2lIRU4xSGtlZXNETVhLUHlvQ0RDR1ZNbzRHQ0NENlBCaFEzZFJaSUh5MFkvM01hRTV6VTltVENyd3duWm9qdEUrcU5wTVNrSlNwbUdlMEV6THlGZWxNSnFoZkZRN2E1MHVYeFo4cENjMnd4dEFLV2dIb2VhbVIyTzdSK2JxN0liUFlJdE8wZXNkUmdvVGFZMzhoWkxKNXkwMm9JVndvUG9rR0l6eEFNRHVhblExdm4yV0RRMDBSaDZvNVFPYUNSdTk5ZndEYlFjTjBYQXVxa0ZweFQvY2Z6M3NsR1JWb2tyTlUwaXFpTUFKRkViS1NjWmRtU2tUVXpuQzBVK01md0ZPR2RMZ3Nld1J5UEt3QlpZU215NlUzMjVpVWhCUU54YkFDM0ZMS0RWOVZTT3VRcE9PdWtKL0dBbXUvdHlFYlg5RGdFcDZkdjF6b1UwSXF6cEc2Z3NzU2pJWVJWUEdnVTFRQVFZUmdJVDhnRVYwRVhyMXNxZWgySTZyWGp0bW9DWXlFRENlL1BrRkVpL1E0OEZ1VDI5cDU1N2lOK0xDd2s1Q0svQ1oyV2RBZGZRWmgyWjlRR3J6UExTTlJqNWlnVVd6bDlWaTByQ3FIOEcxS3A0UU1Ma3V3TUNBeXBkdmlEWHlPSWswQUhUTThIQllLaDNiMC9GK0R4b05qNFpkb1pmQ3BRVmRuWmFycW9NYUhXbk1MTlZjeWV2eXRHc3JYUUVvSWJ1YnFXWU5vN05SSHpkYzB6dlQyMWZXVmlyajdnMzZpeTZweG9nZnZnSHAxeEgxVHVyYno4UXl5SG5YZUJKaWNwWVVjdGJ6QXB3eloxSFQrRlBFWE1BZ1VaZXRnZUdNd3Q0RytESGlEVDJMdStQVDIxZmpKQ0FmVjE2YS9XdTFQcU9rVUhTVEtZaFdXNlBoaEhVbE50V3pGbkE3TWJZK3I2NHZrd2RwZk5CMkpmV2dXWEF2a3pkNDJLNGxOOXg3V3JnNGtJS2dYQ2I0bWNXNTk1TUNQSi9jVGZQQU1RTUZXd25xd2RlNHc4SFpZSkZwUXdjU01oalZ6NEI4cDZuY1NDTjFYNGtseG9JSDRCTjJKNnRhQk1qNmxIa0FPczhKSkFtWHE1eHNRdHJQSVBJSXAvSEc2aTIxeE1HY0ZncURYU1JGMHhRZzE0ZDJ1eTZIZ0tFMTNMU3ZRZTUyb1NoRjVKeDFSNmF2eUw0dGhoWFFaSGZDOTRvWnp1UFVCS0ZZZjFWdkRheElydFY2ZE5HU3g3RE8waTFwNkN6Qmt1QW1FcXlXY2VRWTdGOStVME9iWUR6b2ExaUthby9jT0QvdjZROWdIcnJyMXVDZU9rOGZTVDlNRzIzVWwwS21NM3IrV242SGk2V0FjTDdnRWVheWtpY3ZnanpralN3RnNBWElSODFaeDRRSjZvb3NWeUprQ2NUKzR4QWxkQ2NpaHF2VGY5NEhIVVBYWXAzUkVJYVI0ZGhwUUY2K0ZLMUgwaTlpN1B2aDhvd3UzbE80UFQxaXVxdStEa0wyQmo5K2tkZkdBZzJUWHcwM2lOSHlvYnhvZkxFMmlianNZRFBnZUVRbFJNUjdhZlhiU0dRY25QakkyRCtzZHRtdVE3NzFkYkFTVXNEbmRVN3Q1OGpyck5HUnpJU3Z3aW9BbEhzNUZBK2NCRTVDY3pua2Q4Tk1WNkJSNmtzbktMUFpuTVVhd1JEVTFNWi9pYjN4Q2RrVGJsSEt1NGJsTml5bEg1bjIxM3lNMHp1YkVpZTBvNEpoemNmQXkzSDVxaDJsMTd1TG9vQk5MYU8rZ3pvblRIMnVGOFBRdTlFeUgrcGpHc0FDVE15NGNIenNQZHltVVNYWUpPTVAzeVRrWHF2Ty9scHZ0MGNYNWVrREV1OVBVZkJlWk9Ea0Z1QWpYQ2FHZGk2ZXc0cXhKOFBtRmZ3bVBwa2dRalFsV3FvbUZZNlVram1jbkF0Skc3NUVWUitOcHpHcFAxRWY1cVVVYmZvd3JDM3pjU0xYM0J4Z1dFZ0V4L3Y5Y1A4SDh1MU12dDkvck1EWWY2c2p3VTF4U09QQmd6RkVlSkxNUlZGdEtvNVFIc1VZVDhaUkxDYWgyNzU5OUV1cW9DOVBZallPNmFvQU1IQjhYMU9Id0VBWW91SGZIQjNueWIyQitTblp4TS92dy9iQ3RPUmpMTVN5NWFab0VwdmdkR3ZsSmZOUEZVdS9wN1o0VlZLMWhpSTAvVVR1QjNaUHE0b2hFYm03TW50Z2MxZXZFdGtuYW9zZ1pTd25EQzJCZE1taWJwZWc0OFg4SXhsKy84K3hYZGJzaFFYVVBQdng4alQzZmtFTGl2SFNtcWJoYmxmTkZTaFdBeVFuSjNXQlU2U01ZU0lwVERtSGpkTFZBZGxBRGR6OWdDcGxadzZtVGlIcUR3SXN4Ym05RXJHdXNpVnBnMnc4UTNraEtWL1I5T2o4UEZlRjQzaG1XL25TZDk5blp6aHlqQ1gzUU9aa2tCNkJzSDRIODY2V0d5djlFMGhWQXpQWWFoMnRrUmZRWk1tUDJyaW5mT2VRYWxnZTBvdmhkdUJqSnM5YTFHQndSZWVyY2VpZnk0OWN0T2g1LzY1QVRZdU1zQWtWbHRtdlRMQms0b0hwZGw2aStwOERvTmo0RmIydmhkRlllcjJKU0VpbEV3UGQ1bjV6Tm9HQlhFanJlZy93aDJORm5OUmFJVUhTT1hhNGVKUnd5Z1pvWDZ2blducVZkQ1JUMUFSeGVGck5CSit0c2Rvb013cW5ZaEU3ekl4bkQ4cFpIK1AwTnUxd1d4Q1BUQURmTldtcXg2MjZJQkpKcTZOZWFwY0dlT21idFh2bDBUZVdHMFk3T0dHVjQrRUhUdE5CSVQ1V2QwQnVqbDdpblhnWmdmWFRNNWVmRDNxRFRKNTRPOXYzQmt2K3RkSVJscTFrWGNWRDBCRU1pcm1GeGdsTlB0NXBlZGIxQW54dUNZTUNoVXlrd3NUSVdxVDIzWERwdlRpS0VydTFjVGNFTWVuaUIrSFFEZWh4UFhObWtvdEZkd1VQbmlsQi91NE54NVhjNmw4SjlqSDFFZ0taVVV0OHQ4Y3lvWmxlREJFdDhvaWJEbUpSQW9NS0o1T2U5Q1NXUzVaTUVKdmFjc0dWZFhEV2pwL1lwZTV4MHA5UFhCMlBBd3QyTFJEM2QrZnROZ3B1eXZ4bFA4cEI4NG9CMWk3M3ZBVnB3eXJtWFc3MmhmVzZEem45SmtqNCsrMFZRNGQwS1N4MUFzREE0T3RYWERvNjMvdytHRCt6Qzd3NVNKYXhzbW5sWVJRNGRnZGpBN3RUbDJLTkxucEorbXZrb0R4dHQxYTRvUGFYM0VWcWo5Nm85c1JLQlFxVTdaT2l1cGVBSXlMTUQrWTNZd0h4MzBYV0hCNUNRaXc3cTNtajFFRGxQMmVCc1piejc5YXlVTWJ5SFE3czhndTRMZ2lwMUxpR0pqN05RajkwNS8rcmdVWUtBQTVxZHJsSEtJa25XbXFmdVIrUEI4UmRCa0RnL05nbmxUODlHNzJoMk52eVNuajdVeUJ3RCttaS9JV3MxeFdieHVWd1VJVlh1bjVjTXFCdEZicmNjSStESUxqc1ZRZzZlZXEwaXRpUmZlZG44OUN2eUZ0cGt4YWF1RXZTQU51Wm1CMXA4RkdQYlU5NEo5bWVkd3NaOUhrVVlqbUk3T0g1SHV4ZW5kTGJ4VGFZclB1SWZFMmZmWEZLaG9OQlVwMzNIc0ZBWG1DVi9WeHBxNUFZZ0ZvUnI1QXk5M1pMUmxnYUlQamhaalhaWkNoVCthRTVpV0FYTVgwb1NGUUV0d2ppdWhRUUl0VFFYNUlZcktmS0IrcXVlVE5wbFIxSG9mbG81L0k2YVBQbUFDd1FDRTJqVE9ZbzVEejFjczdTb2QwS1RHLzNrRURHazNrVWFVQ09OMTl4U0pDYWIza05wV1poU1drTzhsK1NwVzcwV24zZzBjaU9JSk81SlhtYTZkYm9zNmp5aXN1eFh3VVVoajIrMXVHaGN2dWxpS3RXd3NVVHc0Z2kxYy9kaUVFcFpIb0tveFRCZU1EbWhQaEtUeDdUWFdSYWtWOGltSlIzNTVEY0lIa1I5SVJFSHhvaFA0VGJ5UjVMdEZVMjR1bVJQUm1FWUhicGUxTGdoeXhQeDdZZ1VIak5iYlFGUlFoaDRLZVUxRWFiWHg4RlMzSkF4cDJyd1JEb2VXa0pnV1JVU0t3NmdHUDVVMlB1TzlWNFp1aUtYR0d6RlF1UnVmK3RrU1NzYkJ0UkpLaENpM0VOdUxsWGhQYmpUS0Q0ZGpYVm5mWEZkczZaYisxWGlVclJmeWF5R3hKcTErU1lCRWZiS2xnamlTbWswb3JnVHF6U1MrRFo1clRxc0pidHRpTnRwK0tNcUdFMkFIR0Z3NmpRcU01dkQ2dk1wdG1YVjlPQWpxNDlVZi9MeDlPcGFtK0huNU85cDhxb0JCQVFpeHpRWjRlTlZrTzlzUHpKQU15UjF5NC9SQ1FRMXMwcFY1S0FVNXNLTHczdGtjRmJJL0pxcmpDc0s0TXcrVzhhb2Q0bGlvWXVhd1VpQ3lWV0JFL3FQYUZpNWJua2dwZnUvYWU0NzE3NHJJMWZxUW9UYlcwSHJVNkZBZWpxN0J5TTBWNHprWlRnMDIvWUpLMk43aFVRUkNlWjRCSWdTRXFnRDhYc2p6RzZMSXNTYnVIb0lkei9MaEZ6Yk5uMWNsY2kxTkhXSjAvNi9POEhKTWRJcEVaYnFpMVJyckZmb28vckkvN3VmbTJNUEc1bFVJMElZSjRNQWlIUlRTT0ZKMm9UdmVyRkhZWFRoa1lGSW95Rng2ck1ZRmdhT0tNNHhOV2RsT25JY0tiL3N1cHRwdGdUT1RkVklmNFlnZGFBakpuSUFtNHFOTkhOUXFxQXp2aTUzR2t5UkNFb3NlVUJySG9oWnNqVWJrUjhnZkt0Yy8rT2E3Mmx3eEo4TXE2SERmREFUYmZiSmh6ZUl1RlFKU2l3MXVacHJIbHpVZjkwV2dxRzc2ek8wZUNCMVdkUHYxSVQ2c054eGg5MUdFTDJZcGdDOTdpa0ZIeW9hSDkybmR3ZHVxWjZJWWprZzIwRFgzM01XZG9aazdRa2NLVUNnaXNJWXNsT2FhTHl2SUlxUktXUWoxNmpFMURsUVdKSmFQb3BXVEpqWGZpeEVqUkpKbzhnNCsrd3VRamJxK1dWWWpzcUN1TklRVzNZam54S2UyTTVaS0VxcStjWDdaVmdua2JzVTNSV0l5WEExcnh2NGtHZXJzWUpqRC8vYXVsZFhHbWNFYmNmVGVGMTZZMTcwOEZCMUhJZm1XdjZkU0ZpNm9ENEUrUklqQ3NFWitrWTdkS253UmVKSnczeENqS3ZpM2tHTjQycnZ5aFVsSXowQnArZk5TVjV4d0ZpdUJ6RzI5NmU1cy9vSG9GdFV5VXBsbVB1bElQbCtlMUNRSVFWdGpsekx6enpiVitEL09WUXRZem81aXh0TWk1Qm1IdUc0Ti91S2ZKazVVSVJFcDcrMTJvWmxLdFBCb21YU3pBWTBLZ3RiUHp6Wm9IUXh1am5SRVVnQlUrTy9qS0toZ3hWaFJQdGJxeUhpVWFSd1JwSHY3cGdSUHlVcm5FN2ZZa1ZibEdtZlRZMjh0RkN2bElMQzA0VHozaXZrTldWYXpBK09zWXJ4dlJNL2hpTm44RmM0YlFCZVVaQUJHeDVTL3hGZjlMYmJtazI5OFg3aUZnMnllaW12c1FxcUoraFlidDZ1cStaZjlqQytKY3dpY2NkNjFOS1F0RnZHV3JnSmlIQjVsd2k2ZlI4S3pZUzdFYUVIZi9rYTlFQzdIOEQrV0VhM1RFQUNIQmtOU2ovY1h4RmVxNFJsbEMrZlVGbTJ4dHN0WUxMMm5vczFEZnpzQzl2cUREZFJWY1BBM0hvOTVhRVFIdkV4VlRoWFBxeW02NWxsa0tsZlJYYlBUUmlEZXBkeWxIam1WOVlUV0FFamxEOURkUW5DZW03QWovbWw1OE9uMzY2MzkyMjE0QjV6cm1Rei85eVNHMm1GcUV3anE1c0ZsNXRZSlB3NWhOejhseVpQVVRzcjVFMEYyQzlWTVBuWmNrV1A3K21id3AvQmlON2Y0a2Y3dnRHblpGMkpHdmpLL3NEWDFSdGNGWTVvUFFuRTRsSUFZVjQ5VTNDOVNQMExDWS85aS9XSUZLOU9SanpNOWtHL0tHckF1d0ZtZ2RFcGRMYWlxUU5wQ1RHWlZ1QU82NWFma1kxaDMzaHJxeUxqWnk5MkpLMy90d2RqOXBhZkZjd2ZYT05tUFFXbGRQbE1lN2psUDI0SnMwdjltOGJJSjlUZ1MySXVSdkU5WlZSYUN3U0pZT3RBZkw1SC9ZUzRGZnpLV0tiZWsrR0Z1bGhleUt0RE5sQnRyZG1yK0tVK2liSFRkYWx6RlVtTWZ4dzNmMzZ4KzNjUWJKTEl0U2lsVzljdXZaRU1qS3c5ODdqeWtaUmxzSC9VSStIbEtmbzJ0THdlbUJFZUJGdG14RjJ4bUl0QS9kQUlmUStyWG5tODhkcXZYYStHYXBPWVZ0LzJ3YUZpbVhGeDNUQzJNVWlPaTUvTWwrM3JqL1lVNkloeDJoWGdpRFhGc1VlUWtSQUQ2d0YzU0NQaTJmbGs3WHdLQUE0emJvcXludUVMRDMxMkVKODhsbURFVk9NYTFXL0svYTh0R3lsWlJNck1vSUx5b01RenpiREpITlpyaEg3N0w5cVNDNDJIVm1LaVo1UzAwMTZVVHA4M2dPaEN3ejlYSXRLOWZnWGZLM0Y1ZDduWkNCVWVrb0x4cnV0UWFQSGExNlJqc2EwZ1RyenlqcVRubWNJY3J4ZzZYNmRrS2l1Y3VkYzBERDVXNHBKUGYwdnVEVzhyNS91dzI0WWZNdXhGUnBEMm92VDJtRlg3OXhINkpmK01WZHYyVFlxUjYvOTU1UWdWUGUzSkNEL1dqQVljTEE5dHBYZ0ZpRWpnZTJKNWxqZUkvaVV6ZzkxS1F1SGtJSTRtbUhaeEMzWFFPUkxBQzZHN3VGbjVMT21sblhrakZkb085NzZtb05UeEVsUzhIZHhXb1BBa2pqb2NEUjEzNm0ybCtmNXQ2eGFhTmdkb2RPdlR1MHJpZXZuaE5BQjc5V05yVnM2RXNQZ2tnZmFoRjlnU0Z6ekFkK3JKU3JhdzVNbGxpdDd2VVA1WXhBODQzbFVwdTYvNWpBUjBSdkg0clJYa1NnM25FK081R0Z5ZmUrTDBzNXIzazA1RnlnaFNGbktvNFRUZ3MwN3FqNG5UTHFPWWo2cWFXOWtuSlREa0Y1T0ZNWWJtQ1ArOEgxNlR5NDgyT2p2RVJWNk9GeXcwNDNMOXczaG9KaTQwOHNSK1NHbzFXdmlYVXU4ZDdxUytlaEtqcEt3eGVDdGhzbTJMQkZTRmVldHgweDRBYUtQeHRwM0N4ZFdxQ3NMckIxcy9qNVRBaGMxak5ac1hXbDZ0am8vV0RvZXd4emc4VDhObmhaMW5pVXdML25oZnlnTGFuQ25Sd2FGR0R5THcrc2ZaaHlaMVV0WVRwOFRZQjZkRTdSM1ZzS0tIOTVDVXhKOHU4Tis5dTIvOUhVTktIVzN4M3c1R1FyZk9QYWZrMnc1cVpxOE1hSFQwZWJlWTN3SXNwM3JOOWxycElzVzljMXdzM1ZOVitKd056MExvOStWN3pacjZHRDU2V2U2Z1dWSXZ0bWFtNUdQUGtWQWJyNzRyNlN3aHVMK1RSWHRXLzBwZ3lYMTZWTmw0L0VBRDUwVG5VUHV3clc2T2NVTzJWbFdYUzBpbnE4NzJrazdHVWxXNm8vb3pGS3ErU2lwNkxjVHRTRGZEclBUY0NIaHg3NUg4QmVSb24rS0cyd1J3emZEZ1doQUxtaVdPTU82aDNwbTFVQ1pFUEVqU2N5azd0ZEx4NldyZEEyTjFRVFBFTnZObmhDUWpXNmtsMDU3L3F2N0l3UnJ5SHJaQkN3VlNiTExuRlJpSGRUd2s4bWxZaXhGdDFzbEVjUEQ3RlZodDEzSHlxVmV5RDU1SE9YcmgyRWxBeEp5aW5HZW9GendLQTkxemZyZEx2RHhKU2p6bUltZnZUaXNyZUkyNUVEY1ZmR3NteExWYmZVOFBHZS83Tm1XV0tqWGNkVEoxMWpBbFZJWS9Cdi9tY3hnL1ExMHZDSHdLRzFHVy9YYkpxNW54RGh5THFpb3JuN1dkN1ZFVkw4VWdWenBITWpRK1o4RFVnU3VraVZ3V0FLa2VUbFZWZVo3dDFER25DZ0pWSWRCUFpBRUs1ZjhDRHlETm83dEs0LzVEQmpkRDVNUFY4NlRhRWhHc0xWRlBRU0k2OEtsQll5ODRGaWV2ZFU5Z1doNlhacnVndnRDWm1pOXZmZDZkYjZWN0Ztb0VjUkhuRzM2VlpIOE40YVphbGRxOXpaYXd0MXVCRmd4WVl4K0dzL3FXMWp3QU5lRnkrTENveW15TTZ6Z0c3ajhiR3pVeUxodnJiSmtUWUFFZElDRWI0a01LdXNLVDlWM2VJd01Mc2pkVWRnaWpNYys3aUtycitUeHJWV0cwVStXOTVTR3J4bnhHckU0ZWFKRmZndkFqVU00U0F5OFVhUndFOWo2WlFINXFZQVdHdFhCeXZEaUxTRGZPRDB5RkEzVUNNS1N5UTMwZnl5MW1JUmc0WmNnWkhMTkhXbCtjOVNlaWpPdmJPSnhvUXk3bFROMnIzWThwNm92eHZVWTc0YU9ZYnVWZXpyeXFYQTZVK2ZjcDZ3U1Y5WDUvT1pLUDE4dEI1NlVhMGdNeXhKSTdYeU5UN0lycU44R3NCOXJML2tQNUtNcmpYeGdxS0xEYStWNU9DSDZhNWhtT1dlbU1Vc2VhOXZRbDl0NU9jZTc2UHJUeVR2NTBFeE9xbmdFM1BIUGZTTC8vQUl0UGRCN2tHbnlUUmhWVVVGTmRKSjJ6N1J0a3Rad2dtUXpoQkcvRzdRc2pabUpmQ0U3azc1RW1kSUtIN3hsbm1Eck5NL1hiVFQ2RnpsZGNIL3JjUkd4bFBydjRxRFNjcUU3SlNtUUFCSldxUlQvVFVjSlN3b1FNKzFqdkRpZ3ZyampIOG9lSzJpbjFTKy95TzFqOHhBd3MvVDV1MFZuSXZBUHFhRTFhdE51TjBjdVJsaUxjSDJqMG5UTDRKcGNSN3c5UXlhMEpvYUhnc09pQUxMQ0N6UmtsMVVVRVN6K3plL2dJWEhHdER3Z1lySzZwQ0ZLSjF3ZWJTRG9nNHpUbFBrZ1hacXhsUURpWU1qaERwd1R0QlcyV3h0aFdib3Y5ZHQyWDlYRkxGbWNGK2VFYzFVYVE3NGdxWmlac2RqNjNwSDFxY3YzVnk4SlljaW9nSVZLc0o4WXkzSjl3L0doaldWU1FBbXJTMEJQT1dLK1JLViswbFdxWGdZTW5JRndwY1pWRDd6UFNwNTQ3aTlIbGZsQjhnVm5TVEdtbXExQ2xPMDgxT1cvVUgxMXBFUU1ma0VkREZ6akxDMUNkby9CZEwzczdjWGI4SisrSHp6MXJoT1VWWkZJUGVoUmlaOFZZdTYrN0VyN2o1UFNadTlnL0dCZG1OekpteUNEOXdpc3dqOUJadytUM2lCcmc4MXJlMzZpaE1Mam9WTG9XYys2MmExVS83cVZYNUNwdlRWRjdyb2NTQUt3djRjQlZxWm03bExEUy9xb1hzNGZNcy9WUWk2QnRWYk5BM3VTektwUWZqSDFvM3g0THJ2a09uNDB6aG02aGpkdURnbHpKVXdBMFBPYWJnZFhJbmRwOWZ6aE9vMjNQZStSazlHU0xYMGQ3MVBvcXJ5OE5RRFR6TmxzYStKVE5HOStVckVmK25neENqR0VzRENjMGJ6K3VkVlJ5SFFJMWptRU8zUytJT1F5Y0VxN1h3QjZ6M3dmTWZhNzNtOFBWUnAraU9ndFpmZVNCbDAxeG4wM3ZNYVFKa3lqN3ZuaEdDa2xzQ1dWUlVsNHkrNW9OVXpRNjNCMmRiakRGM3Zpa2QvM1JVTWlmUFluWDVHbGZ1azJGc1YvN1Jxakk5eUtUYkU4d0pZKzc0cDdxWE84K2RJWWdqdExEL044VEp0UmgwNE45dFhKQTRINTlJa01tTEVsZ3ZyMFE1T0NlVmZkQXQrNWhraDRwUWdmUk1IcEw3NFhhdExRcFBpT3lIUnMvT2RtSHRCZjhuT1pjeFZLemRHY2xJTjE2bEU3a0orcFZNanNwT0krNStUcUxSTzZtMFpwTlhKb1pSdjlNUERSY0FmSlV0TlpIeWlnL3Myd3dSZWFrRmdQUEp3Q1FtdTFJMzAvdGNCYmppK05hNTNpMVcxTitCcW9ZN1p4bytVL005WHlKNE9rMlNTa0J0b09yd3VoQVkzYTAzRXU2bDh3RmRJRzFjTitlOGhvcFRraUtGMDkzS3VIL0JjQjM5ck1pR0RMbjZYVmhHS0VhYVQvdnFiL2x1ZnVBZHBHRXhldkYxK0o5aXRrRmhDZnltV3I5dkdiM0JUSzRqNTk4elJINytlK01VOW1hcnVacWIwcGtHeFJEUkUxQ0Q0WjhMVjR2aGdQaWRrNXcyQnE4MTZnM25IdzEvL2ozSlN0ejdOUjlISVdFTE84VE1uM1FyUC96WnAvLytEdjlwNDI5L29nditHQVRSK24vVWRGK25zOXhOa1haUUpYWTR0OWpNa0pOVUZ5Z0F0em5kWHdqc3MreVdIOUhBbkxRUWZoQXNrZFpTMmwwMUhMV3Y3TDd1czV1VEg0MDlwcWl0dmZTT1FnL2MrWnQ3azg3OVAzSzkrV1Y2OG43KzNjWmZ1UmQvZERQUC8wM3JuK2QrL25CdldmZ0RsdDgrTHpqcUovdngzQ25OT3dpWGhobzc3OEM5NmlEKzFUQnZSWlllUCtFSDgxTEUwdlZ3T09ybUNMQjNpS3pJMXgrdkpFc3JQSDR1RjBVQjRUSjRYM3VEZk9DbzNQWXBZZTBNRjRib3VoMERRL2w0M2Z4VUY3WStkcFd1dlRTZmZCMHlPMlVRVUVUSS9Md0NaRTNCdm5ldko3Yzl6VWxZM0g1OHh6a2U2RE5GRFFHOG4wV3RETjRMQVlONG5vZ0thdjFlek9mSy96K3Q2dHNDVHArZGh4NHltald1Q0prMWRFVWlmRFArSHlTNGlQL1ZnOUIyalRvOUw0TmJpQnVEUzRudXVIVzZIK0pEUW4ySnRxUktHa0VRUEVZRTd1emF6WElrY3hJQXFVcTFlc2FzWkJFVGxFWlk3eTdKbytSb1YvSXNqWTllSU1rVXZyNDJIYzB4cXRzYXZadmh6MU9Md1N4TU9UdXF6bGhiMFdiZE93Qkg5RVlpeUJqYXR6NDBiVXhUSGJpV3hxSjB1bWExOXFoUHJ1dmNXSmxiaVNTSDQ4T0xERHBhSFBzenZ5Y3Q0MVpmVHUxMCt2am94NmtPcUs2djBLL2dFUHBoRXZNbC92d1N2K0E0SGhtMzZKU1A5SVhUeUNaRG00a0tzcUQ1YXk4YjFTYWQvdmFpeU81Ti9zRGZFVjZaNHE5NUUreWZqeHBxQm9CRVRXMkM3eGw0cElPMmJET0RERnVyVVB3RTdFV0MyVXBscStBSG1CSHZpcjJQU2drUjEyL1J5NjVPMGFadFFQZVhpOW1UbEYvV2o1R1ErdkZrWXloWHNMVGpyQlNQOWh3azRHUHFEUDVyQm41L2w4YjBtTFJBdlJTelhIYzI5M2JzM3M4RXNkRTNtMmV4eGlkV1ZCNGpvSFIrUytkejUvVyt2MDBLM1RxTjE0Q0RCdGg4ZVdjc1RiaXdYUHN5Z0hkR2lkMFBFZHk2SEhtMnYvSVV1VjVSVmFwWW16R3NYOTBtcG5JZE5HY09PcTY0RGJjNUdVYllwRDlNN1MrNmNMWS8vUW1qeEZMUDVjdVRGUm0zdkE1cmtGWnJvRm5PM2JqSEYzNXVVM3M4bXZMN1RwOW55VGM0bXltVEo1c0xJcDd1bVNuR2tPMjNmYWVodHozbW1UUzdmYlZ4NXJQN3gzSFhJalJOZXEvQTN4Q3M5Sk5CMDhjOVM5QkYyTzNiT3VyMEl0c2xGeFhnUlBkYWFwQklpNGRScEtHeFZ6N2lyNjl0L2JjOXFUeGp2dE95R09maUxHRGhSNGZZeXdIdjFXZE9wbHhJVjg3VHBMQnkzV2MwUVAwUDlzNEc3RkJOT2RJVFMvdGVwM28zaDFURWE1WEREaWk3Zld0cVJ6VUVSZVAyZmJ4ejdiSFdXSmRiSU94T1VKWnRJdE5acFRGUmZqNnZtOXNZalJ4UVZPK1dUZGlPaGRQZVRKKzhZaXJQdm9lTDg4bDVpTFlPSGQzYi9JbWtxKzFaTjFFbDNVaWtoZnR1dGVFWXhmMVd1am9mOFByNElDVHU1ZXpaeVo0dEhRTXhselVITFlPMlZNT29OTUdMLzIwUzVpMm8yb2Jmays4cXFkUjd4emJSRGJnVTBsbnVJZ3o0TGVsUTVYUzd4Ykx1U1F0TlM5NXYzWlVPZGFVeC9RZDhxeEN0NnhmMkU2MnliL0h1a0xPNlJ5b3JWOEtnWWw1WU5jNzV5K0t2ZWZyeFkrbGMvNjR5OWt2V1AwYTBiRHovcm9qcStSV2pPMDZXZXJ1V3FORlU3cjNIUEljTFdScWw4SUNac3oyTHMvcU9tL0NMbjYrK1grUWY3bUdzcFlDclpvZC9scGw2Unc0eE4veXVxOGdxVjRCNmFIazFoVkUxU2ZJTHhXdTVndlhxYmZBUllRcHNwY3hLcDFGL2M4WE9Qemtadm1vU3crdkVxQkxkcnExZnIzd0FQdjVObk05aThGK2pkQXV4a1A1WjcxYzZ1aEszZW5sbkd5bXI3VXNXWktDMTJxZ1VpRzhYWEdROW14bnF6NEdTSWx5YkY5ZVhtYnFqMnNIWCthMWpmMGdSb09OSFJkUlNySXEwM1R5ODllUTFHYlYvQmsrZHU0K1YxNXpscyt2dkVSdlo0RTdaYm54V1RWakRqYjRvL2s4amx3NDRwVElyVUd4eHVKdkJlTytoZXVoT2pwRnNPNmxWSi9hWG5KRGEvYk0wUWwxY0xiWEUvUGJ2M0VaM3ZqM2lWckI1aXJqdXBaVHpsbnY2NzdOckk5VU5ZTnFiUGdwL0haWFMrbEptazg3d2VjKzdZT3hURG8yYXcybDNOZkRyMzRWTmx2cVdKQmtudUs3b1NsWjYvVDEwenVPb1BaT2VvSWs4MU4rc0w4NDNXSjJRNFowZlozc2NzcUMvSlYyZnVoV2kxakdVUlNLWlY2MzdsZjUzWG5ueDE2L3ZLRVhZODlhVkowZnY5MWpHZGZHK0c0K3NuaXdIZXM0aFMrdWRPcjRSZmhGaEcvRjVnVUczNVFhVStNY3VMbWNsYjVaV21SK3NHNVY2bmYrUHhZemxybkZHeHBaYUs4ZXFxVm8wTmZtQVdvR2ZYRGlUL0ZuVWJXdnpHRE9Ucjhha3RPWldnNEJZdno1WUgxMlpiZkNjR3ROaytkREFaTkdXdkhvditQSU9uWTlQcmpnOGgvd0xSclQ2OXN1YU1WWjViTnVLMDBsU1ZwbnFTWDFOT04vODFGb1A5MnJZbmRpb253Z09pQThXTWY0dmM4bDE1S3FFRUc0eUFtMitXQU41QnJmdTFzcTlzdVdZcWdvYWpnT1l0L0pDazFnQzh3UGtLK1hLQ3RSWDZUQXRndnJudUJnTlJtbjZJOGxWRGlwT1ZCOWtYNk94a3A0Wkt5ZDFNNkdqOC92MlU3aytZUUJMOTVLYjlQUUVOdWNKYjBKbFczYjV0T2JON20vWjFqMWV2Mzg4ZDdvMTV6Z1hzSTlDaWtBR0FWaVI2bGtKdjduYjRBazQwTTJHOFRKNDQ3a04rcHZmSGlPRmpTVVNQNlBNK1FmYkF5d0tKQ0JheFNWeHBpekhzZVpVeVVCaHE1OXZGd3JreUdvUmlIYm8wYXB3ZUVaZVNMdU5pUStIQWVrT25hckZnMDBkWk5YYVBlb0hQVFJSMEZtRXlxWUV4T1ZhYWFPOGMwdUZVaDdVNGUvVXhkQm10aGxCRGdnMjU3UTMzajFoQTdIVHhTZVRUU3VWblBaYmdXMW5vZHdtRzE2YUtCREt4RWV0djdEOU9qTzBKaHJiSlRub2Ura2NHb0RKYXpGU084L2ZVTjlKeS9nNFhLNVBVa3cyZGdQREdwSnFCZmhlN0dBK2NqemZFL0VHc01NK0ZWOW5qOUlBaHJTZlQvSjNRRTVURUlZeWs1VWpzSTZaWmNDUHI2QThGWlVGNGc5bm5wVm1qWDkwTUxTUXlzSVBEMG5GenF3Q2NTSm1JYjVtWXYyQ21rK0MxTURGa1pReUNCcTRjL1lhaTlMSjZ4WWtHUy94MnM1L2ZySVcydm1HMldydjBBUHBDZGdDQTlzbkZ2ZnBlOHVjME93ZFJzNEc5OTczUEdFQm5RQjVxS3JDUTZtNlgvSDdOSW5aN3kvMTY3NC9aWE9WcDdPZXVDUms4SkZTNTE2VkhybkgxSGtJVUlsVElsampIYVF0RXRrSnRvc1l1bDc3Y1Z3amszZ1cxQWphYTZ6V2V5SEdMbHBrM1ZIRTJWRnpUMnlJL0V2bEdVU3oySDl6WUUxczRuc0tNdE1xTnlLTnRMLzU5Q3BGSmtpNUZvdTZWWEdtOHZXQVRFUHdyVVZPTHZvQThqTHV3T3pWQkNnSEIyQ3I1VjZPd0VXdEpFS29rSmtmYzg3aCtzTkhUdk1iMEtWVHA1Mjg0UVRQdXBvV3ZRVlV3VWVvZ1pSM2tCTUVTWW8wbWZ1a2V3UlZQS2g1K3J6TFFiN0hLakZGSWdXaGoxdzN5Ti9xQ05vUEk4WEZpVWdCTlQxaENIQnNBejhMN095dDh3UVdVRmo5Mk9Obi9BUHlKRmc4aHp1ZXFvSmROajU3Uk9yRmJmZnVTL1h4clNYTFRSZ2o1dXhaanBnUVljZWVNYzJ3SnJhaFJlU0twbTNRakhmcUV4VExBQjJpcFZ1bUU4cHFjWnY4TFlYUWlQSEhzZ2I1Qk1XOHpNNXB2UWl0K21ReDhYR2FWRGNmVmJMeU1UbFk4eGNmbW0vUlNBVC9IMDlVUW9sNWdJejdyRVNEbW5yUTRiVVJJQjRpUlhNRFF3eGdleDFHZ3REeEtwMkhheUlrUitFL2FEbUN0dE5tMkM2bHl0V2RmT1Z6RDZYMlNwRFdqUURsTVJ2QXAxc3ltV3Y0bXkxYlBDRCtFMUVtR25NR1doTndteWNKbkRWMldyUU54TzQ1dWtFYjA4QUFmZml6WUtWVUxwMTVJNHZiTks1RHpXd0NTVUFEZm1LaGZHU1VxaWkxTDJVc0U4ckI3bUx1SHVVSlpPeDQrV2lpekhCSi9od2JvYUJ6aHBOT1Z2Z0ZUZjVjSnNIZWY3TDFIQ0k5ZE9VVWJiK1l4VUpXbjZkWU9MeitUSGk5MWt6WTVkdE81Yytnclg3djBqRWJzdW9PR25vSXJlRElnL3NGTXlHK1R5Q0xJY0FXZDFJWjFVTkZ4RThVaWUxM3VjbTQwVTJmY3hDMHUzV0x2TE94d3UrRjdNV1VzSHNkdEZRWjdXK25sZkNBU2lBS3loOHJuUDNFeURCeXZ0SmI2S2F4Ni9Ia0x6VDlTeUV5VE1WTTF6UHRNME1KWTE0RG1zV2g0TWdEMTVFYTlIZDAwQWRrVFowRWlHNU5BR3VJQnpRSkowSlIwbmErT0I3bFFBNlVLeE1maWhJUTdHQ0NuVno2OTRRdnlrV1hUeHBTMnNvRHUrc21ydTFVZEl4U3ZBc3pCRkQxYzhjNlpPb2JBOGJKaUpJdnV5Y2dJWEJRSVhXd2h5VGdaRFF4SlRSWGdFd1JOQWF3R1NYTzBhMURLamRpaExWTnAvdGFFL3hZaHNnd2UrVnBLRUVCNExscmFReUU4NGdFaWh4Q25iZm95T3VKSUVYeTJGSVl3K0pqUnVzeWJLbFUyZy92aFRTR1R5ZHZDdlhoWUJkdEFYdFMydjdMa0h0bVhoLzhmbHkxZG84RkkvRDBmOFVielZiNWgrS1JoTUdTQW1SMm1oaTBZRy91ajd3Z3hjZnpDck12ZGppdFVJcFhEWDhhZTJKY0YvMzZxVVdJTXdONkpzamFSR05qK2pFdGVHRGNGeVRVYjhYL05IU3VjS01KcDdwZHV4dEQ2S3V4Vmx5eHh3YWVpQzFGYkdCRVNPODRsYnlyQXVnWXhkbCsyTjgvNkFnV3BvL0llb0FPY3NHMzVJQS9iM0F1U3lvYTU1TDdsbEJMbGFXbEVXdnVDRmQ4ZjhOZmNUVWd6SnY2Q2JCKzZvaFd3b2RsazluR1dGcEJBT2F6NXVFVzV4QnZtam5IRmVEc2IwbVh3YXlqM21kWXE1Z3h4TmYzSDMvdG5DZ0h3alNycFNnVnhMbWlUdHVzemRSVUZJc242TGlNUGpMODA4dkwxdVFoRGJNN2FBNDNtSVNYUmVxalNza3luSVJjSENKOXFlRm9wSmZ4OXRxeVVvR2JTd0pleC8wYURFM3BsQlBHdE5CWWdXYmRMb20zK1EvYmpkaXpSMi9BUy9jL2RIL2QzRzdweWwxcURYZ3RPRnRFcWlkd0xxeFBZdHJORXZlYXNXcTN2UFVVdHFUZXU4Z3BvdjRiZE9RUkkya25lRnZSTk1yU2h5VmVFdXBLMVBvTERQTVNmV01JSmNzMjY3bUdCOFg5Q2VoUUNGMGdJeWhwUDEwbWJ5TTdsd1cxZTZUR3ZIQlYxc2cvVXlUZ2hIUEdScU15YWViQzZwYkIxV0tOQ1F0bGFpMUdHdm1xOXpVS2FVekxhWHNYRUJZdEh4bUZiRVoya0poUjE2NExoV1cyVGxwMWRoc0dFN1pnSVdSQk94M1pjdTJEeGdIK0c4M1dUUGNlS0cwVGdRS0tpaU5OT2xXZ3ZxTkVibnJrNmZWRCtBcVJhbTJPZ3VaYjBZV1NUWDg4TitpL0VMU3hiYVVVcFB4NHZKVXpZZy9Xb25TZUE4eFVLNnU3RFBIZ3BxV3BFZTZENGNYZzV1SzlGSVlWYmE0N1YvbmIrd3lPdGsrekc4UnJTNEVBMG91d2EwNGlCeVJMU3ZvSkEyRnphb2JiWnRYbnE4R2RiZnFFcDVJMmRwZnBqNTlUQ1ZpZjYrRTc1cDY2NWZhaVg4Z1MyMTNScUJ4VFpxZkhQNDZuRjZOU2VuT25ldVQrdmdiTFViZFRIMi90MFJFRlhaSk9FQjZESHZ4Nk42Zzk5NTZDWXJZL0FZY205Z0VMSlhZa3JTaSswRjBnZUtEWmdPQ0lZa0xVLytHT1c1YUdqOG12TEZndEZINStYQzhodkFFM0N2SFJmbDRvZk0vUXdrNHgyQStSK255YzlnTnUvOVRlbTdYVzRYUm55UnltZjUyejA5Y1RPZHIrUEc2K1AvVmI0UWlYbHdhdWM1V0IxejNvK0lKamxieEk4TXlXdFN6VCtrNHNLVmJoRjN4YSt2RHRzM054WGE4N2lpdSt4Ukg5Y0Fwcm5PTDJoNnZWNTRpUVJYdU9BajFzOG5MRks4Z1o3MFRoSVFjV2RGMTkvMnhhSm1UMGVmcmtORGtXYnBBUVBkbzkyWjgrSG4vYUxqYk96QjlBSS9rMTJmUHM5SGhVTkRKMXU2YXgyVnhEM1I2UHl3TjdCckxKMjZ6NnMzUW9NcDc2cXp6d2V0ckRBQktTR2tmVzVQd1MxR3ZZTlViSzZ1UnF4ZnlWR055RkIwRStPdWdNTThrS3dtSm11cHVSV084WGtYWFhRRUN5UlZ3OVV5SXJ0Q3RjYzRvTnFYcXI3QVVSQm1LbjZLaHozZUJOOTZMd0lKckFHUDltci81OXVUT1N4NjMxc3V5VCtRdWpEZDRiZVVGcFowa0pFRW5qbFArWC9LcjJrQ0tobkVOVGc0QnNNVE9tTXFsajJXTUZMUlVsVkcwZnpkQ0JnVXRhOW9kckpmcFZkRm9tVGk2YWswdEZqWFRjZHFxdldCQXpqWTZoVnJIOXNidDNaOWduK0FWRHBUY1FJbWVmYkI0ZWRpcmp6cnNOaWV2dmU0WlQ0RVVaV1YzVHhFc0lXKzlNVC9SSm9LZlpaWVNSR2ZDMUN3UEcvOXJkTU9NOHFSL0xVWXZ3NWYvZW1VU29EN1lTRnVPb3FjaGRVZzJVZVBkMWVDdEZTS2d4TFNaNzY0b3k0bHZSQ0lINmJvd1B4Wld3eE5GY3Rrc0xlaWw0N3BmZXZjQmlwa2tCSWM0bmdaRytreEdaNzFhNzJLUTdWYVo2TVpPWmtRSlpYTTZrYi9BYzAvWGtKeDhkdnlmSmNXYkkzek9ORWFFUElXOEdia1lqc1pjd3krZU1vS3JZakRtdkVFaXhIemtDU0NSUFJ6aE9mSlp1TGRjYngxOUVMMjNNQThybmpUWlo3ODdGR01ua3FucHV6QjUvOTB3MWd0VVNSYVdjYjBldGE4MTk4VkVlWk1VU2ZJaHl1YzQvbnl3RlE5dXFuN2pkcVhoKzV3d3YrUks5WG91TlBiWWRvRWVsTkdvMzRLeXlTd2lnc3JmQ2Uwdi9QbFdQdlF2UWc4UjBLZ0hPMThtVFZUaGhRcmxiRVEwS3AvSnhQZGpIeVI3RTFRUHcvdXQwcitIRERHN0J3WkZtOUlxRVVaUnB2MldwemxNa09lbWVMY0F0NUNzcnpza0xHYVZPQXh5eVN6WlYvRDJFWTd5ZE5aTWY4ZThWaEhjS0dIQVdOc3pmMUVPcThmTnN0aWpNWTRKWHlBVHdUZG5jRkZxY05EZkRvK21XRnZ4SkpwYzRzRVp0alh5QmRvRmN4YlVtbmlDb0txNWp5ZFVITmpZSnhNcU4xS3pZVjYyTXVnY0VMVmhTM0JuZCtUTExPaDdkd3MvelNYV3p4RWI0Tmo0YUZ1bjV4NGtEV0xLNVRVRi95Q1hCL2NaWXZJOWtQZ1ZzRzJqU2h0WGt4ZmdUK3h6akpvZlhxUEVuSVhJUTFsbklkbVZ6Qk9NOTBFWHZKVVc2YTBuWi83WGpKR2w4VG9PM0gvZmR4bnhtVE5LQlp4bmtwWExWZ0xYQ1p5d0dUM1l5Uzc1dy9QQUg1SS9qTXVSc3Blajh4Wk9iVTlrUkViUkEra3FqbUtSRmFLR1dBbUZRc3BDK1FMYktQZjBSYUszT1h2QlNXcW80NnA3MHdzL2VacHU2akN0WlVnUXk2cjR0SE1QVWRBZ1dHR1VZTmJ1di8xYTZLK01WRnNkM1QxODMrVDhjYXBTbzZtMCtTaDU3ZkVlRy85NWR5a0dKQlFNajA5RFNXMmJZMG1Vb25EeTlhOHRyTG5uTDVCNUxXM05sOHJKWk55c084WmIrODB6WHhxVUdGcHVkM1F6d2I3YmYrOG1xNngwVEFuSlU5cERRUjlZUW1aaGxuYTJ4dXhKdDBhQ08vZjFTVThnYmxPcmJJeU1zeFRsVlVXNjlWSlB6WVUySGxSWGNxRTJsTEx4bk9iWnV6MnRUOUNpdmZUQVVZZm16Smx0L2xPUGdzUjZWTjY0L3hRZDRKbGsvUlY3VUtWdjJHeC9BV3NtVEF1Q1dLaGR3Qys0SG1LRUtZWmgyWGlzNEtzVVIxQmVPYnMxYzEzd3FGUm5vY2RtdWhlYVRWMzBndlZYWmNvdXpIS0s1endyTjUyalhKRXVYNmRHeDNCQ3BWLysrNGYzaHlhVy9jUUpMRktxYXNqc011TzNCM1dsTXEyZ3lZZmRLMWU3TDJwTy90UnllMm13endaUGZkVU1ybDV3ZExxZGQyS3Yvd1Z0bnB5V1loZDQ5TDZyc09WKzhIWFByV0gyS3VwODlsMnR6NmJmODBpWVNkK1Y0TFJPU09IZWFtdmV4UjUyNHE0cjQzclRtdEZ6UXZBcnB2V2ZMWUZacmJGc3BCc1hOVXFxZW5qeE5Oc0ZYYXRadmxJaGs3dGVVUGZLK1lMMzJGOE1jVG5qdjBCWk5wcGIrdnNob0NydExYaklXcTNFSlhwVlhJbEc2Wk5MMGRoNnFFbTJXTXdEakQzTGZPZmtHaDEvY3pZYy8wcWhpRDJvek5uSDQ4ODJNVlZ0M0piVkZrYndvd05DTzNLTDVJb1lXNXdsVmVHQ1ZpT3V2MXN2Wng3RmJ6eEt6QTR6R3FCbFJSYVJXQ29iWGFWcTR5WUNXYlpmOGVpSnd0M09ZK01GaVNKZW5nY0ZQMnQwSk1mek9pSjdjRUN2cHg3bmVnMVJjNXgrN215UEpPWHQyRm9oVlJ5WHREKy9yRG9UT3lHWUluSmVsWk1qb2xlY1ZIVWhVTnF2ZFpXZzJKMnQwalBtaUxGZVJELzhmT1Q0bytOR0lMYitUdWZDbzljZUJCbTNKTFZuK01PMjY3NW43cWlFWC82VysxODhjWWczWm41TlNUamdPS2ZXRlNBQU5hNnJhQ3hTb1ZVODUxb0pMWTExV0lvWUswZHUwZWM1RTR0Q25BUG9LaDcxcmlUc2pWSXAzZ0t2QmJFWVFpTllybUgyMm9MUVdBMkFkd01uSUQ2UFg5YjU4ZFIyUUtvNHFhZzFEMVorTC9Gd0VLVFI3b3NPWlBXRUNQSklIUXFQVXNNNWkvQ0g1WXVwVlBmRkE1cEhVQmNzZXNoOGVPNVloeVduYVZSUFpuL0JtZFhWdW1aV1B4TVA1ZTI4em0ydXFIZ0ZvVDlDeW1IWU5OcnpycmpsWFpNMDZIbnpEeFlObEk1Yi9Rb3N4TG1tcnFERnFtb2dRZHFrMFdMa1VjZW9BdlF4SGdrSXl2V1U2OUJQRnIyNFZCNitseDc1Um5hNmRHdHJtT3hEbnZCb2p2aTEvNGRIalZlZzhvd29mUGUxY09ueFUxaW9oMDE2cy9WdWR2OW1oVjlmMzVBdCtTaDI4aDFicHA4eGhyMDkrdmY0N0VseDNNczZoeXA2UXZCM3Qwdm5MYk9od282NjBjcDdLMHZ2ZXBhYks3WUpmeEVXV2ZyQzJZekpmWU9qeWdQd2Z3ZC8xYW1UcWEwaFo1dWVlYmhXWVZNdWJSVHdJamorME9xMG9oVTN6ZlJmdUw4Z3Q1OVhzSGR3S3R4VFFRNFkycXo2Z2lzeG5tMlVkbG1wRWtnT3NaejdpRWs2UU90OEJ1UHdyK05SMDFMVHFYbUpvMUM3Nm8xTjI3NHR3SnZsK0kwNjlUaUxwZW5LL21pUnhoeVk4anZZVjZXMVd1U3doSDlxN2t1d25KTXRtN0lXY3FzN0hzbnlIU3FXWExTcFl0WkdhUjFWM3QwZ2F1bmluRlBaR3RXc2tGNjVydHRpNDhVVjl1VjlLTThrZkRZczBwZ0IwMFMrVGx6VFhWNlA4bXhxMTViOUVuOHN6M2pXU3N6Y2lmWmEvTnV1ZlBObk5UYjAzMXBwdHQwK3NSU0gvN1VHOHB6YnNndHQzT0czdXQ3QjlKekRNdDJtVFp1eVJOSVY4RDU0VHVUcnBOY0h0Z21NbFlKZWlZOVhTODNOWUppY2pSanRKU2Y5QlpMc1F2NjI5UWREc0tRaFRLNUNuWGhwazd2TU5rSHpQaG0wRXhXL1ZDR0FwSGZQeUJhZ3RaUVRRbVBIeDdnNUlYWHNyUURQeklWaHYyTEI2SWgxMzhpU0R3dzFKTkhyRHZ6VXh2cDczTXNRQlZoVzhFYnJSZWFWVWNMQjFSM1BVWHlhWUc0SHBKVWNMVnhNZ0R4Y1BrVlJRcEw3VlRBR2FiRHpiS2N2ZzEydDVQOFRTR1FrcmovZ09ycG5iaURId2x1QTczeGJYdHMvTDd1NDY4Y1JXU1dSdGdUd2xRbkE0N0VLZzBPaVpEZ0Z4QUtRUVVjc2JHb21JVGdlWFVBQXlLZTAzZUE3TXA0Z255S1FtbTBMWEp0RWs2ZGRrc01KQ3V4RG1tSHptVmhPK1hhTjJBNTRNSWgzbml3NUNGN1B3aVhGWnJuQTh3T2RlSEx2dmhkb3FJREc5UERJN1VuV1dIcTUyNlQ4eTZpeEpQaGt1Vktabm9VcnVPcFVnT09wM2lJS0Jqayt5aTF2SG81Y0l0SFhiMVBJS3pHYVpsUlMwZzVkM01WMnBEOEZRZEdZTFo3M2FhZS9lRUlVZVBNYzRORno4cElVZkxDcnJGNGpWV0g1Z1FuZU4zUzh2QU5CbVVYckVjS0duNmhJVU45NXkxdnBzdkx3YkdwelY5TDBaS1RhbjZURFhNMDUyMzZ1TEpjSUVNS1ZBeEtOVDBLOFdsanV3Tm55M0JOUVJmem92QTg1YmVJOXpyMUFHTlluWUNWa1IxYUduZ1dVUlVyZ3FSK2dSclFoeFc4MWwzQ0hldmp2R0VQelBNVHhkc0lmQjlkZkdSYlpVMGNnLzFtY3VidEVDWDR0dmFlZG1OQXZUeENKdGMyUWFvVWFsR2ZFTkNHSzdJUy9POENScGRPVmNhOEVXQ1J3djJzU1dFOENKUFc1UEN1Z2pDWFBkM2g2VTYwY1BEK2JkaHRYWnVZQjZzdGNvdmVFN1NtNU1NMnl2ZlVIWEZTVzdLekxtaTcvRWVFV0wwd3FjT0g5TU9TS2poQ0hIbXcrSkdMY1lFLzdTQlpRQ1JnZ294MFpaVEF4cmx6Tk5YWVhMNWZOSWprZFQ0WU1xVlV6NnA4WUR0MDQ5djRPWEdkZzNxVHJ0TEJVWE9aZjdhaFBsWkFZL08rN1NwMGJ2R1NIZHlROEIxTE9zcGxxTWI5U2U4VkFFN2dJZFNadnhiUlNyZmwrTGs1UWFxaTVRSmNlcWppdGRFcmNIWGcvM01yeWxqUFNJQU1hYWxvRm0xY1Z3Qko4RE5ta0Rxb0dST1NIRmV0cmdqUTVDYWh1S2tkSDVwUlBpZ01yZ1R0bEZJOHVmSlBKU1VsR2dUamJCU3ZwUmMwenlwaVVuNlU1S1pxY1JveXJ0emhtSjcvY2FlWmttVlJ3SlFlTE9HOExZNnZQNUNocEtoYzhKczBFbCtuNkZYcWJ4OUl0ZHRMdFlQOTJrS2ZhVEx0Q2k4U3RMWmRFTkphOUV4MW5Pb3oxa1E3cXhvaVpGS1J5TGY0TzRDSFJUMFQvMFc5RjhlcE5LVm9leXhVWGh5M3NRTU1zSmpRSkV5TU9qbU9oTUZnT21tbHNjVjRlRmkxQ2xkVTkyeWp3bGVpckVLUFczYlBBdUVoUlpWN0pzS1YzTHI1Y0VUQWlGdVg1Tnc1VWxGN2QySFo5NkJoMHNnRklMNUtHYUtTb1ZZVmx2ZEtwWkpWUDUrTlo3eERFa1FobURnc0RLY2lhekpDWEo2Wk4yQjNGWTJmNlZaeUdsL3Q0YXVuR0lBay9CSGFTK2krU3BkUmZuQi9Pa3RPdnlqaW5XTmZNOUtzcjZXd3RDYTFoQ21lUkk2aWNwRk00bzhxdUNMc2lrVTB0TW9aSS85RXFYUk1wS0dhV3pvZmw0blF1VlFtMTdkNWZVNXFYQ1FlQ0RxVmFMOVhKOXFKMDhuM0czRUZaUzI4U0hFYjNjZFJCZHRPMFljVHppbDNRa25OS0VlL3NtUTFmVGIwWGJweU5CNXhBZXVJbGYrNUtXbEVZMERxSmJzbnpKbFF4SlBPVnlIaUtNeDVYdTlGY0V2MUZiZzZGaG00dCtKeXk1SkMxVzNZTzhkWUxzTzBQWFBieG9kQmd0dFRiSDNydDlDcDFsSklrMnIzTzFacXU5NGVSYm5JejJmNTBsV29sWXp1S3NqNFBNb2s0YWJITE84TkFDODg0aGlYeDVGeTVwV0tPMGJXTDd1RUdYYUpDdHpuaFA2N1NsUTR4aldJZmdxNkVwWjI4UU10dVpLN0pDMFJHYmw5bkE0WHRGTHVnL05MTW9IMXBHdDlJb25BSnFjRURMeUg2VERST2Nic21HUGFHSXhNbzQxSVVBblFWUE1QR0J5cDRtT21oOVpRTWtCQWNrc1VLNTVMc1pqN0U1ejVYdVpveVdDS3U2bkhtRHEyMnhJLzlaOFlkeEp5NGtXcEQxNmpMVnJwd0dMV2Z5T0QwV2QrY0J6RkJ4VmFHdjdTNWs5cXdoLzV0L0xRRVhzUnFJM1E5Um0zUUlvYVpXOUdsc0RhS09VeXlreVd1aE5PcHJTRWkwczFHNHJnb2lYMVY3NDNFRUx0aStwSnU1b2c2WDBnNm9UeW5VcWxoSDlrNmV6eVJpMDVOR1pIejBudnAzSE9KcjdlYnJBVUZyRGpia0ZCT2JFdmRRV2trVWJMMHBFdk1VNDZYNTh2RjlqOUYzajZrcHlldE5VQkl0ckV1Ylc5WnZNUE00cU5xTGxzU0JKcU9IM1hiTnd2L2NYRFhOeE44aUZMelVodGVpc1lZK1JsSFlPdVAyOS9DYitMK3h2KzM1UnY3eHVkblo2b2hLNGNNUGZDRzhLSTdkTm1qTmsvSDRlODRwT3huL3NaSEs5cHNmdmo4bmNBOHFKejdPOHhxYnhFU0RpdkdKT1p6RjdvNVBKTFE3ZzM0cUFXb3l1QSt4M2J0VTk4TFQ2WnlHeWNlSVhqcnFvYjJDQVZxbDRWT1RRUFVRWXZIVi9nNHpBdUNaR3ZZUUJ0ZjB3bWQ1bGlscnZ1RW4xQlhMbnkwMUI0aDRTTURsWXNuTnBtOWQ3bTloNTc4dWZwZWY5WjRXcGxxV1F2cW81MmZ5VUE3SjI0ZVpENWF2NlN5R0lWOWtwbUhOcXl2ZGZ6Y3BFTXc5N0J2a25WMmZxK01GSHVuOUJUM0xzZjhwYnp2aXNXaUlRdllrbmcrOFZ4azFWK2RsaTF1NTZrWTUwTFJqYVBkb3R2VDVCd3F0d3lGK2Vtby96OUozeVZVVkdmS3J4UXRKTU9BUVdvUWlpLzRkcDl3Z3liU2E1bWt1Y21STHRFUVovcHowdEwvTlZjZ1dBZDk1bkVRM1RnNnROYnV5bjNJZXB6NjVMM2h1TVVVQm50bGxXdXU0RGJ0T0ZTTVNicElMVjRmeTZ3bE0wU092aTZDcExoODFjMUxyZUl2S2Q2MXVFV0JjRHcxbFVCVVcxSTBaK20vUGFSbFgrUFEvb3hnMFllNktVaUlpVEY0QUROazU5WWRwdDUvcmt4bXE5dFY1S2NwL2VRTFVWVm1CelFOVnV5dFFDUDZFemQwRzhlTHhXeUhwbVpXSjNiQXprV1R0ZzRsWmx3NDJTUWV6RW1pVVBhSlV1Ui9xa2xWQS84N1M0QXJGQ3BBTGRZM1FSZFV3M0czWGJXVXA2YXE5ejB6VWl6Y1BhNzM1MXA5SlhPWnlmZFpCRm5xdDkwVnpRbmRYQi9td2Y4TEM5U1RqNWtlblZwTnVxT1FRUDNtSVJKajdlVjIxRnhHOFZBeEtyRW4zYytYZm1aODAwRVBiOS81bElsaWpzY1ViQjZkYTBSUWFNb29rMHp1ZzFHMHRLaS9KQkM0cnc3L0QzbTRBUnpBa3pNY1ZyRGNUMlN5RnRVZFdBc0Zsc1BERnFWM04rRWp5WGFvRWVQd3JvYVpDaUxxRXpiOE1XK1BORTlUbVRDMDFFeldsaTUxUHpadlVxa215dVJPVStWNmlrK0xlLzlxVDZud3pVemY5dFA2OHRZZWkwWWFER3g2a0FkN2puMWNLcU9DdVliaUVMSDl6WXFjYzRNblJKamtlR2lxYUd3TEltaHllS3MreEtKTUJsT0owNW93OWdHQ0taMVZwbk1Lb1NDVGJNUytYKzIzeTA0MnpPYjVNdGNZLzZvQmVBbzFWeTg5T1R5aHBhdkZQNzhqWENjRkgwdDdHeDI0aE1FT20yZ3NFZkdhYlZwUWd2RnFiUUtNc2tuRlJSbXVQSGNadTBTdS9XTUZwaFp2QjJyL0VHYkc3MnJwR0dobzNoK01zejB1R3pKN2hOSzJ1cVFpRTFxbW4wemdhY0tZWVpCQ3FzeFYrc2picG9WZFNpbFcvYjk0bjJ4TmI2NDhWbU5Jb2l6cUVXaEJuc2VuK2Qwa2JDUG1SSXRmV3FTQmVPZDlXbmUzYzZiY2Q2dXZYT0o2V2RpU3N1WHEwbmRocXJRNFFvV1VqQ2pZdFowRUFoblNPUDFtNDR4a2YwTzdqWGdocnpTSld4UDRhL3Q3MmpVMjlWdTJydnU0bjdIZkhra21RT01HU1MrTlBlTEdPNUk3M21DMkI3K2xNaUJRUVpSTTkvOWxpTElmb3d1cFVGQWJQQmJSK2x4RE02TThQdGdoMXBhSnE1UnZzN3lFdUxRdi83ZDFvVTJ3b0ZTYjNGTVBXUU9LTXVDdUo3cEREanBJY2x1czVUZUVvTUJ5MllkVkI0ZnhtZXNhQ2VNTnNFZ1RIS1M1V0RTR3lOVU9vRXBjQzJPRld0SVJmMHcyN2NrMzQvRGp4UlRWSWNjOStrcVpFNmlNU2lWRHNpS2RQL1h6NVhmRWhtL3NCaE81MHAxcnZKRGxreXl4dUo5U1BnczdZZVVKQmpYZGVBa0UrUDlPUUptNlNabm4xc3ZjZHVJNzhkWW1ia0UybXR6aVByY2pWaXNYRzc4c3BMdmJaYVNGeC9Sa3M5elA0TEtuMENkei8zSnNldGtUMDZBOGYveUNnTU82TWIxSG1lMEpKN2Iyd1p6MXFsZXFUdUtCR29raFBWVVowZFZ1K3RuUVlORVkxZm1rWlN6NitFR1o1RXpMNzY1N21yZVpHUjNqVWZhRWs0NThQRG5pQnpzU21CS2hEUnpmWGFtZXJ5SnY5L0Q1bTZISXFaMFIrb3VDRTU0RHpwNElKdXVEMWU0RGM1aStQcFNPUkpmRzIzdVZncWl4QU1EdmNoTVIwblpkSDVicmNsWXdSb0pSV3Yvcmx4R1JJNWZmRDVOUEdtSUR0N3ZERTE0MzRwWWRWWklGaDg5QnM5NEhHR0piVHdyTjhUNmxoMUhaRlRPQjRsV3pXajZFVnF4U012QzAvbGpXQlEzRjJrYy9tTzJiNnRXb25UMkpFcUV3RnRzOHJ6Mmgrb1dOZHM5Y2VSMmNiN3padkpURHBwSGFFaEs1YXZXcXNzZVdhMkR0NUJCaGFiZFdTa3RTODBvTVFyTDRUdkFNOWI1SE1teURuTytPa2tiTVhmVUpHN2VYcVRJRzZscVNPRWJxVlIrcVlkUDd1V2I1N1dFSnF6eWg0MTFHQVZzRGluUHM3S3ZVZVhJdGxjTWRPVVd6WEJINnpzY3ltVjFMTFZDdGM4SWVQb2p6WEhGOW01YjV6R3dCUmR6Y3lVSmtpdTkzOEFwbUFheVJkSnJYMVBtVmd1V1V2dDJUaFE2MmN6SXRUeVdKTVcyQW4vaGREZk1LN1NpRlFsR0lkQWJsdEh6M3ljb2g3ajlWN0d4TldCcGJ0Y1NkcW00WHhSd1Rhd2MzY2JaK3hmU3Y5cVFmRWtES2ZaVHdDa3FXR0kvdXIyNTBJdFhsTWxoNnZVTldFWUlnOUEzR3piZ21icXZUTjhqczJZTW84N0NVNXk2blo0ZGJKTERRSmo5ZmM3eU03dFp6SkRaRnRxT2NVOCttWmpZbHE0Vm1pZkkyM2lIYjFab1Q5RStrVDJkb2xuUDFBZmlPa3Q3UFFDU3lrQmlYeTVtdjYzN0llZ1dTS2o5SUtyWVpmNEx1OStJN3ViK21rUmRsdll6ZWhoL2phSjluN0hVSDViMkliZ2VOZGtZN3d4MXlWenhTN3Bidmt5NitubVZVdFJsbEVGZndlVVEwL25HMDE3V29VWVN4cytqMkI0RlYvRjYyRXRIbE1XWlhZcmpHSHB0aG5OYjF4NjZMS1owUWU5MklOV0hkZlIvdnFwMDJ3TVM4cjFHNGRKcUhvazhLbVE3OTQ3RzEzYTRZWGJzR2dIY0J2UnVWdTFlQWk0L0E1K1ppeG1kU1hNNzNMdXBCL0xIN085eXhMVFZYSlR5QmJJMVM0OVRJUk9yZlZDT2IvY3paOXBNNEpzWng4a1V6OGRRR3Y3Z1VXS3hYdlRIN1FNLzNKMk91WFhnY2lVaHFZK2NndGFPbGlRUVZPWXRoQkxWM3hwRVNaVDNybWZFWU5aeG1wQmJiMjRDUmFvODZwcm4raTlUTk9oOFZ4UkpHWEpmWEhBVEpIczFUNXR4Z2Mvb3BZclk4WGpsR1FRYlJjb3hJQmNuVnNNam1VMXltbUlVTDRkdmlKWG5kTUFKMFlldCtjN081Mi9wOTh5dGxtQXNHQmFUQW1NaGltQW52cDFUV05HTTlCcHVpdEdqK3Q4MTBDVTJVaG9ycmpQS0d0VGhWQzhXYVh3MDRXRm5UNWZUanFtUHlyUTB0TjNDa0xzY3RWeTJ4cjBaV2dpV1ZaMU9ybEZqanhKWXNPaVp2MmNBb092RSs3c1kwSS9Ud1djWnFNb3lJS05PZnR3UDd3KytSZmc2N2xqZm92S1lhNTBpZjNmekUvOGFQWVZleS9OcTM1K25IMnNMUGgvZlA1VHN5bFNLR09aNGs2OWQyUG5INDMra3ErK3NSWEhRcUdBcldkd2h4K2hwd1FDNkpnVDJ1eGVoWVU0WmJ3N29OYjYvSExpa1B5SlJPR0syb3V5cit2enNlRVNwOUc1MFQ0QXlGclNxT1EwcnJvQ1lQNHNNREZCckhuMzQyRXlaVE1sU3lrNDdySFNxODlZOS9uSTN6RzVsWDE2WjVseHBoZ3VMT2NaVW5kTDh3TmNya3lqSDgyanFnOEJvOE9Za3lucnhadmJGbm81bFVTM09QcjhLbzNtWDlOb1JQZFlPS0tqRDA3YnZnRmdwWi9SRitZemtXdkovSHMvdFViZmVHekdXTHhOQWpmRHpISE1WU0R3QjVTYWJRTHNJWkhpQnA0M0ZqR2thaWVuWW9EZDE4aHUyQkd3T0s3VTNvNzBLL1dZL2t1dUtkbWRyeWtJQlVkRzJtdkU5MUwxSnRUYmgyMG1PTGJrMXZDQWFtdTd1dGxYZUdVMm9vVmlrYlUvYWN0Y2dtc0MxRktrMnFtajNHV2VJV2JqNHRHSXhFN0JMY0JXVXZ2Y25kL2xZeHNNVjRGOTE3ZldlRkIvWGJJTk4zcUd2SXlUcENhbHoxbFZld2RJR3FlQVMvZ0I4TWkrc0ErQnFEaVgzVkdEMmVVdW5UUmJTWStBdUR5NEUzUXgzaEFod25TWFgrQjB6dWozZVExbWlTOFZ1eDJ6L2w2L0JrV3RqS0dVNzJhSmtPQ1doR2NTZjMra0Zra0IxNXZHT3NRclNkRnI2cVRqMGdCWWlPbG5CTzQxMTcwZ09XSFNVb0JWUlUySmp3cHBZZGhJRkRmdTd0SVJIY2NTTk01S1pPRkRQejBUR01Banp6RXBlTHdUV3Ara24yMDFrVTZOamJpTVFKeDgzK0xYMWUxdFoxMGt1Q2hKWi9YQlVRMWR3YUJIalRESkRxT3ltcEVrOFgyTTNWdFZ3MjFKa3NDaEE4dzF0VGVmTzNSSjFGTWJxWjAxYkhIa3VkREIvT2hMZmU3UDVHT0hhSTI4WlhLVE11cW8waExXUTRIYWJCc0dHN05iUDFSaVh0RVR6MDc0ZXI2dy9PZXJKV0Vxam1rcTJ5NTFxMUJWSStKVXVkblZhM29nQnB6ZGhGRTdmQzdreWJyQXQyWjZScURqQVRBVUVZZVlLNDVXTXVwQktRUnRRbFUrdU5zam56ajZabUdyZXpBK0FTcld4UTZMTWtIUlhxWHdOcTdmdHYyOGRVeC9aU0pjaURYUDJTV0pzV2FOMEZqUFg5WWtvNkxvYlo3YVlXL0lkVWt0STlhcFRMeUhTOER5V1B5dW9aeXhOMVRLL3Z0ZnhrM0h3V2g2SmN6WkM4RnRuMGJJSmF5MmcrbjV3ZDdsbTlyRXNLTytzdnFWbWkrYzFqODhoU0N4YnpyZzQrSEVQME50MS9CNllXMVhWbTA5VDFDcEFLamM5bjE4aGpxc2FGR2RmeXZhMVpHMFh1M2lwNk42SkdweVRTcVk1aDRCT2xwTFBhT255dzQ1UGRYVE4rRHRBS2c3RExyTEZUbld1c29TQkhrM3MwZDdZb3VKSHE4NS9SMDlUZmMzN0VOWFpGNDhlQVlMbnE5R0xpb05jd0RackM2Rlc2Z29kQjhKbnFZVVB2bjBwV0xmUXowbE0wWXk4TXliZ244NERzM1E5YkRQMTBiTHlPVitxenhhNFJkOURodTdjanU4bU1hT05YSzNVcW1CUTlxSWc3ZXRJd0VxTS9rRUNrL0R6amE0QnMxeFIrUS90Q2JjOElLclNHc1RkSkowdmdlN0lHMjBXNjg3dVZtSzZpY1dRNmNEM2x3RnpnTk1HdEZ2TzVxeUplS2ZsR0xBQWNRWk9ya3hWd3kzY1d2cWxHcHZqbWY5UWU2QXAyME1QYlY5MkRQVjBPaEZNNGt6OFlyMGZmQzJ6TFdTUTFrcVk2UWRRcnR0UjNraDFZTHRRZDFrQ0V2NWhWb1BJUldsNUVSY1VUdHRCSXJXcDZYczVFaGg1T1VVd0k1YUVCdnVpRG1Vb0VObW5WdzFGb2hDcmJScDFBMUUrWFNsV1ZPVGk3QURXKzVPaGI5ejF2SzRxeDVSNWxQZEdDUEJKWjAwbUMrU3NwOFZVYmdwR0F2WFdNdVdRUVJiQ3FJNlJyMmp0eFp4dGZQN1cvOG9ueit5ejBHczc2TGFUNUhYOWVjeWlaQ0IvWlIvZ0Z0TXhQc0R3b2hvZUNSdGl1THhFMUdNMXZVRVVnQnY4NitlZWhMNTgvUDU2UUZHUS9NcU9lL3ZDNzZMNjNqem1lYXg0ZXhkL09LVFV2a1hnK2ZPSlVIeWNoOXh0Lzlnb0pNcmFwU2d2WHJqOCs4dmsvTjgwZjIyU2V3ajZjeUdxdDFCNm16dG9la2xWSEhyYW91aHZISmFHL091Qno2REhLTXBGbVFVTFUxYlJXbHlZRTBSUFhZWWtVeWNJZW1ON1RMdGdOQ0pYNkJxZHl4REtrZWdPN25KSzV4UTdPVllEWlRNZjliVkhpZHRrNkRRWDlFdCtWOU03ZXNnYnNZQmRFZVVwc0IwWHZ3MmtkOStySTdWK200N3UrTy90cTdtdzcyNjJIVTFXbFM5dUZ6c1Y2SnhJSE5tVUN5MFFTOWUwNzdKR1JGYkc2NXozL2RPS0IvWmsreURkS3BVbWRYam4vYVMzTjVudjRmSzdiTUhIbVBsSGQ0RTIraVRiVjVycHpTY1JueGs2S0FSdURUSjhRMUxwSzJtUDhnajFFYnVKOVJJeVkrRVdLNGhDaUlEQkFTMVRtMklFWEFGZmdLUGdkTDlPNm1BYTA2d2pDY1VBTDZFc3hQUVdPOVZOZWdCUG0vMEdna1piRHhDeW54dWpYLzkydm1HY2paUk1BWTQ1cHVhazJzRkxDTFN3WHBFc3l5NWZuRjBqR0pCaG0rZk5TSEtLVVVmeSsyNzZBNy9mZUxPRnh4VXVIUk5KSTJPc2VueHl2ZjhEQUdPYlQ2MHBmVFRsaEVnOXUvS0traEpxbTVVMS8rQkVjU2twRkRBNVhlQ3F4d1htUGFjMWpjdVozSldRK3AwTmRXemIvNXYxWnZGOEd0TVRGRkVkUWpwTE8wYndQYjBCSE5XbmlwM2xpRFhJMmZYZjA1amp2ZkowTnBqTENVZ2ZUaDlDTUZZVkZLRWQ0Wi9PRy8yQytONDM1bW5LKzl0MWd2Q2lWY2FhSDdySzQrUGpDdnBWTml6K3QyUXlxSDFPOHgzSktaVmw2UStMcC9YSzh3TWpWTXNsT3E5RmRTdzVGdFVzL0NwdFhIOVBXK3diV0hnclYxN1I1alRWT3RHdEtGdTNuYjgwVCtFMHR2OVFrelczSjJkYmF3LzhkZEFLWjBweElhRXFMamxQcmppM1ZnSjNHdmRGdmxxRDgwNzV3b3hoNGZWdDBKWkUwS1ZGc0F2cWhlMGRxTjliMzVqdFNwbllNWGtVK3ZacStJQUhhZDNJSGMycy9MWXJuRDFhbmZHNDZJRmlNSXI5b05iWkRXdnd0aHFZTnFPaWdhS2QvWGxMVTRYSGZrL1BYSWpQc0x5Lzkva0F0USsvd0tIK2hJL0lST1dqNUZQdlRaQVQ5ZjdqNFpYUXlHNE0wVHVqTUFGWFlrS3ZFSHYxeGh5U2VrZ1hHR3FOeFdlV0tsZjhkREFsTHVCMWNiL3FPRCtyazdjbXd0KzF5S3BrOWN1ZHFCYW5UaTZ6VGJYUnRWOHF5bE50anlPVkt5MUhUejBHVzlyanQ2c1NqQVpjVDVSK0tkdHlZYjB6eXFHOXBTTHVDdzVXQndBbjdmakJqS0xMb3hMWE1JKzUyTDljTHdJUjJCNk9sbEpaTEhKOHZEeG1XZHRGK1FKbm10MXJzSFBJV1kyMGxmdGs4ZlllUGtBSWc2SGduNTMyUW9JcGVnTXhpV2dBT2ZlNS9VNDRBUFI4QWMwTmVaclZoM2dFaHMxMlcrdFZTaVdpVVFla2YvWUJFQ1V5NWZkWWJBMDhkZDdWelBBUDlhaVZjSUI5azZ0WTdXZEoxd05WK2JIZXlkTnRtQzZHNUlDdEZDMVp3bUpVL2o4aGYwSThUUlZLU2l6NW9ZSWE5M0VwVUk3OFg4R1lJQVphYng0Ny9uOExEQUFKMG5OdFAxcnBST3BycUtNQlJlY1NoY2E2cVh1VFNJM2paQkxPQjNWcDM4MUI1ckNHaGpTdmgvTlNWa1lwMnFJZFAvQmc9XCI7XG5cbi8qKlxuICogVGhlIG5vcm1hbCBkaWN0aW9uYXJ5LWRhdGEuanMgaXMgcXVpdGUgbGFyZ2UsIHdoaWNoIG1ha2VzIGl0XG4gKiB1bnN1aXRhYmxlIGZvciBicm93c2VyIHVzYWdlLiBJbiBvcmRlciB0byBtYWtlIGl0IHNtYWxsZXIsXG4gKiB3ZSByZWFkIGRpY3Rpb25hcnkuYmluLCB3aGljaCBpcyBhIGNvbXByZXNzZWQgdmVyc2lvbiBvZlxuICogdGhlIGRpY3Rpb25hcnksIGFuZCBvbiBpbml0aWFsIGxvYWQsIEJyb3RsaSBkZWNvbXByZXNzZXNcbiAqIGl0J3Mgb3duIGRpY3Rpb25hcnkuIPCfmJxcbiAqL1xuXG52YXIgaW5pdCA9IGZ1bmN0aW9uIGluaXQoQnJvdGxpRGVjb21wcmVzc0J1ZmZlcikge1xuICB2YXIgY29tcHJlc3NlZCA9IGJhc2U2NEpzJDEudG9CeXRlQXJyYXkoZGljdGlvbmFyeV9iaW4pO1xuICByZXR1cm4gQnJvdGxpRGVjb21wcmVzc0J1ZmZlcihjb21wcmVzc2VkKTtcbn07XG5cbnZhciBkaWN0aW9uYXJ5RGF0YUNvbXByZXNzZWQgPSB7XG4gIGluaXQ6IGluaXRcbn07XG5cbnZhciBkaWN0aW9uYXJ5ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAvKiBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICBcbiAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgXG4gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBcbiAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICBcbiAgICAgQ29sbGVjdGlvbiBvZiBzdGF0aWMgZGljdGlvbmFyeSB3b3Jkcy5cbiAgKi9cbiAgZXhwb3J0cy5pbml0ID0gZnVuY3Rpb24gKEJyb3RsaURlY29tcHJlc3NCdWZmZXIpIHtcbiAgICBleHBvcnRzLmRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5RGF0YUNvbXByZXNzZWQuaW5pdChCcm90bGlEZWNvbXByZXNzQnVmZmVyKTtcbiAgfTtcblxuICBleHBvcnRzLm9mZnNldHNCeUxlbmd0aCA9IG5ldyBVaW50MzJBcnJheShbMCwgMCwgMCwgMCwgMCwgNDA5NiwgOTIxNiwgMjE1MDQsIDM1ODQwLCA0NDAzMiwgNTMyNDgsIDYzNDg4LCA3NDc1MiwgODcwNDAsIDkzNjk2LCAxMDA4NjQsIDEwNDcwNCwgMTA2NzUyLCAxMDg5MjgsIDExMzUzNiwgMTE1OTY4LCAxMTg1MjgsIDExOTg3MiwgMTIxMjgwLCAxMjIwMTZdKTtcbiAgZXhwb3J0cy5zaXplQml0c0J5TGVuZ3RoID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDAsIDAsIDAsIDEwLCAxMCwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDksIDksIDgsIDcsIDcsIDgsIDcsIDcsIDYsIDYsIDUsIDVdKTtcbiAgZXhwb3J0cy5taW5EaWN0aW9uYXJ5V29yZExlbmd0aCA9IDQ7XG4gIGV4cG9ydHMubWF4RGljdGlvbmFyeVdvcmRMZW5ndGggPSAyNDtcbn0pO1xudmFyIGRpY3Rpb25hcnlfMSA9IGRpY3Rpb25hcnkuaW5pdDtcbnZhciBkaWN0aW9uYXJ5XzIgPSBkaWN0aW9uYXJ5LmRpY3Rpb25hcnk7XG52YXIgZGljdGlvbmFyeV8zID0gZGljdGlvbmFyeS5vZmZzZXRzQnlMZW5ndGg7XG52YXIgZGljdGlvbmFyeV80ID0gZGljdGlvbmFyeS5zaXplQml0c0J5TGVuZ3RoO1xudmFyIGRpY3Rpb25hcnlfNSA9IGRpY3Rpb25hcnkubWluRGljdGlvbmFyeVdvcmRMZW5ndGg7XG52YXIgZGljdGlvbmFyeV82ID0gZGljdGlvbmFyeS5tYXhEaWN0aW9uYXJ5V29yZExlbmd0aDtcblxuZnVuY3Rpb24gSHVmZm1hbkNvZGUoYml0cywgdmFsdWUpIHtcbiAgdGhpcy5iaXRzID0gYml0cztcbiAgLyogbnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgdGhpcyBzeW1ib2wgKi9cblxuICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIC8qIHN5bWJvbCB2YWx1ZSBvciB0YWJsZSBvZmZzZXQgKi9cbn1cblxudmFyIEh1ZmZtYW5Db2RlXzEgPSBIdWZmbWFuQ29kZTtcbnZhciBNQVhfTEVOR1RIID0gMTU7XG4vKiBSZXR1cm5zIHJldmVyc2UocmV2ZXJzZShrZXksIGxlbikgKyAxLCBsZW4pLCB3aGVyZSByZXZlcnNlKGtleSwgbGVuKSBpcyB0aGVcbiAgIGJpdC13aXNlIHJldmVyc2FsIG9mIHRoZSBsZW4gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBrZXkuICovXG5cbmZ1bmN0aW9uIEdldE5leHRLZXkoa2V5LCBsZW4pIHtcbiAgdmFyIHN0ZXAgPSAxIDw8IGxlbiAtIDE7XG5cbiAgd2hpbGUgKGtleSAmIHN0ZXApIHtcbiAgICBzdGVwID4+PSAxO1xuICB9XG5cbiAgcmV0dXJuIChrZXkgJiBzdGVwIC0gMSkgKyBzdGVwO1xufVxuLyogU3RvcmVzIGNvZGUgaW4gdGFibGVbMF0sIHRhYmxlW3N0ZXBdLCB0YWJsZVsyKnN0ZXBdLCAuLi4sIHRhYmxlW2VuZF0gKi9cblxuLyogQXNzdW1lcyB0aGF0IGVuZCBpcyBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHN0ZXAgKi9cblxuXG5mdW5jdGlvbiBSZXBsaWNhdGVWYWx1ZSh0YWJsZSwgaSwgc3RlcCwgZW5kLCBjb2RlKSB7XG4gIGRvIHtcbiAgICBlbmQgLT0gc3RlcDtcbiAgICB0YWJsZVtpICsgZW5kXSA9IG5ldyBIdWZmbWFuQ29kZShjb2RlLmJpdHMsIGNvZGUudmFsdWUpO1xuICB9IHdoaWxlIChlbmQgPiAwKTtcbn1cbi8qIFJldHVybnMgdGhlIHRhYmxlIHdpZHRoIG9mIHRoZSBuZXh0IDJuZCBsZXZlbCB0YWJsZS4gY291bnQgaXMgdGhlIGhpc3RvZ3JhbVxuICAgb2YgYml0IGxlbmd0aHMgZm9yIHRoZSByZW1haW5pbmcgc3ltYm9scywgbGVuIGlzIHRoZSBjb2RlIGxlbmd0aCBvZiB0aGUgbmV4dFxuICAgcHJvY2Vzc2VkIHN5bWJvbCAqL1xuXG5cbmZ1bmN0aW9uIE5leHRUYWJsZUJpdFNpemUoY291bnQsIGxlbiwgcm9vdF9iaXRzKSB7XG4gIHZhciBsZWZ0ID0gMSA8PCBsZW4gLSByb290X2JpdHM7XG5cbiAgd2hpbGUgKGxlbiA8IE1BWF9MRU5HVEgpIHtcbiAgICBsZWZ0IC09IGNvdW50W2xlbl07XG4gICAgaWYgKGxlZnQgPD0gMCkgYnJlYWs7XG4gICAgKytsZW47XG4gICAgbGVmdCA8PD0gMTtcbiAgfVxuXG4gIHJldHVybiBsZW4gLSByb290X2JpdHM7XG59XG5cbnZhciBCcm90bGlCdWlsZEh1ZmZtYW5UYWJsZSA9IGZ1bmN0aW9uIEJyb3RsaUJ1aWxkSHVmZm1hblRhYmxlKHJvb3RfdGFibGUsIHRhYmxlLCByb290X2JpdHMsIGNvZGVfbGVuZ3RocywgY29kZV9sZW5ndGhzX3NpemUpIHtcbiAgdmFyIHN0YXJ0X3RhYmxlID0gdGFibGU7XG4gIHZhciBjb2RlO1xuICAvKiBjdXJyZW50IHRhYmxlIGVudHJ5ICovXG5cbiAgdmFyIGxlbjtcbiAgLyogY3VycmVudCBjb2RlIGxlbmd0aCAqL1xuXG4gIHZhciBzeW1ib2w7XG4gIC8qIHN5bWJvbCBpbmRleCBpbiBvcmlnaW5hbCBvciBzb3J0ZWQgdGFibGUgKi9cblxuICB2YXIga2V5O1xuICAvKiByZXZlcnNlZCBwcmVmaXggY29kZSAqL1xuXG4gIHZhciBzdGVwO1xuICAvKiBzdGVwIHNpemUgdG8gcmVwbGljYXRlIHZhbHVlcyBpbiBjdXJyZW50IHRhYmxlICovXG5cbiAgdmFyIGxvdztcbiAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuXG4gIHZhciBtYXNrO1xuICAvKiBtYXNrIGZvciBsb3cgYml0cyAqL1xuXG4gIHZhciB0YWJsZV9iaXRzO1xuICAvKiBrZXkgbGVuZ3RoIG9mIGN1cnJlbnQgdGFibGUgKi9cblxuICB2YXIgdGFibGVfc2l6ZTtcbiAgLyogc2l6ZSBvZiBjdXJyZW50IHRhYmxlICovXG5cbiAgdmFyIHRvdGFsX3NpemU7XG4gIC8qIHN1bSBvZiByb290IHRhYmxlIHNpemUgYW5kIDJuZCBsZXZlbCB0YWJsZSBzaXplcyAqL1xuXG4gIHZhciBzb3J0ZWQ7XG4gIC8qIHN5bWJvbHMgc29ydGVkIGJ5IGNvZGUgbGVuZ3RoICovXG5cbiAgdmFyIGNvdW50ID0gbmV3IEludDMyQXJyYXkoTUFYX0xFTkdUSCArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cblxuICB2YXIgb2Zmc2V0ID0gbmV3IEludDMyQXJyYXkoTUFYX0xFTkdUSCArIDEpO1xuICAvKiBvZmZzZXRzIGluIHNvcnRlZCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi9cblxuICBzb3J0ZWQgPSBuZXcgSW50MzJBcnJheShjb2RlX2xlbmd0aHNfc2l6ZSk7XG4gIC8qIGJ1aWxkIGhpc3RvZ3JhbSBvZiBjb2RlIGxlbmd0aHMgKi9cblxuICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IGNvZGVfbGVuZ3Roc19zaXplOyBzeW1ib2wrKykge1xuICAgIGNvdW50W2NvZGVfbGVuZ3Roc1tzeW1ib2xdXSsrO1xuICB9XG4gIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzb3J0ZWQgc3ltYm9sIHRhYmxlIGJ5IGNvZGUgbGVuZ3RoICovXG5cblxuICBvZmZzZXRbMV0gPSAwO1xuXG4gIGZvciAobGVuID0gMTsgbGVuIDwgTUFYX0xFTkdUSDsgbGVuKyspIHtcbiAgICBvZmZzZXRbbGVuICsgMV0gPSBvZmZzZXRbbGVuXSArIGNvdW50W2xlbl07XG4gIH1cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuXG5cbiAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBjb2RlX2xlbmd0aHNfc2l6ZTsgc3ltYm9sKyspIHtcbiAgICBpZiAoY29kZV9sZW5ndGhzW3N5bWJvbF0gIT09IDApIHtcbiAgICAgIHNvcnRlZFtvZmZzZXRbY29kZV9sZW5ndGhzW3N5bWJvbF1dKytdID0gc3ltYm9sO1xuICAgIH1cbiAgfVxuXG4gIHRhYmxlX2JpdHMgPSByb290X2JpdHM7XG4gIHRhYmxlX3NpemUgPSAxIDw8IHRhYmxlX2JpdHM7XG4gIHRvdGFsX3NpemUgPSB0YWJsZV9zaXplO1xuICAvKiBzcGVjaWFsIGNhc2UgY29kZSB3aXRoIG9ubHkgb25lIHZhbHVlICovXG5cbiAgaWYgKG9mZnNldFtNQVhfTEVOR1RIXSA9PT0gMSkge1xuICAgIGZvciAoa2V5ID0gMDsga2V5IDwgdG90YWxfc2l6ZTsgKytrZXkpIHtcbiAgICAgIHJvb3RfdGFibGVbdGFibGUgKyBrZXldID0gbmV3IEh1ZmZtYW5Db2RlKDAsIHNvcnRlZFswXSAmIDB4ZmZmZik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvdGFsX3NpemU7XG4gIH1cbiAgLyogZmlsbCBpbiByb290IHRhYmxlICovXG5cblxuICBrZXkgPSAwO1xuICBzeW1ib2wgPSAwO1xuXG4gIGZvciAobGVuID0gMSwgc3RlcCA9IDI7IGxlbiA8PSByb290X2JpdHM7ICsrbGVuLCBzdGVwIDw8PSAxKSB7XG4gICAgZm9yICg7IGNvdW50W2xlbl0gPiAwOyAtLWNvdW50W2xlbl0pIHtcbiAgICAgIGNvZGUgPSBuZXcgSHVmZm1hbkNvZGUobGVuICYgMHhmZiwgc29ydGVkW3N5bWJvbCsrXSAmIDB4ZmZmZik7XG4gICAgICBSZXBsaWNhdGVWYWx1ZShyb290X3RhYmxlLCB0YWJsZSArIGtleSwgc3RlcCwgdGFibGVfc2l6ZSwgY29kZSk7XG4gICAgICBrZXkgPSBHZXROZXh0S2V5KGtleSwgbGVuKTtcbiAgICB9XG4gIH1cbiAgLyogZmlsbCBpbiAybmQgbGV2ZWwgdGFibGVzIGFuZCBhZGQgcG9pbnRlcnMgdG8gcm9vdCB0YWJsZSAqL1xuXG5cbiAgbWFzayA9IHRvdGFsX3NpemUgLSAxO1xuICBsb3cgPSAtMTtcblxuICBmb3IgKGxlbiA9IHJvb3RfYml0cyArIDEsIHN0ZXAgPSAyOyBsZW4gPD0gTUFYX0xFTkdUSDsgKytsZW4sIHN0ZXAgPDw9IDEpIHtcbiAgICBmb3IgKDsgY291bnRbbGVuXSA+IDA7IC0tY291bnRbbGVuXSkge1xuICAgICAgaWYgKChrZXkgJiBtYXNrKSAhPT0gbG93KSB7XG4gICAgICAgIHRhYmxlICs9IHRhYmxlX3NpemU7XG4gICAgICAgIHRhYmxlX2JpdHMgPSBOZXh0VGFibGVCaXRTaXplKGNvdW50LCBsZW4sIHJvb3RfYml0cyk7XG4gICAgICAgIHRhYmxlX3NpemUgPSAxIDw8IHRhYmxlX2JpdHM7XG4gICAgICAgIHRvdGFsX3NpemUgKz0gdGFibGVfc2l6ZTtcbiAgICAgICAgbG93ID0ga2V5ICYgbWFzaztcbiAgICAgICAgcm9vdF90YWJsZVtzdGFydF90YWJsZSArIGxvd10gPSBuZXcgSHVmZm1hbkNvZGUodGFibGVfYml0cyArIHJvb3RfYml0cyAmIDB4ZmYsIHRhYmxlIC0gc3RhcnRfdGFibGUgLSBsb3cgJiAweGZmZmYpO1xuICAgICAgfVxuXG4gICAgICBjb2RlID0gbmV3IEh1ZmZtYW5Db2RlKGxlbiAtIHJvb3RfYml0cyAmIDB4ZmYsIHNvcnRlZFtzeW1ib2wrK10gJiAweGZmZmYpO1xuICAgICAgUmVwbGljYXRlVmFsdWUocm9vdF90YWJsZSwgdGFibGUgKyAoa2V5ID4+IHJvb3RfYml0cyksIHN0ZXAsIHRhYmxlX3NpemUsIGNvZGUpO1xuICAgICAga2V5ID0gR2V0TmV4dEtleShrZXksIGxlbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsX3NpemU7XG59O1xuXG52YXIgaHVmZm1hbiA9IHtcbiAgSHVmZm1hbkNvZGU6IEh1ZmZtYW5Db2RlXzEsXG4gIEJyb3RsaUJ1aWxkSHVmZm1hblRhYmxlOiBCcm90bGlCdWlsZEh1ZmZtYW5UYWJsZVxufTtcblxuLyogQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblxuICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuICAgTG9va3VwIHRhYmxlIHRvIG1hcCB0aGUgcHJldmlvdXMgdHdvIGJ5dGVzIHRvIGEgY29udGV4dCBpZC5cblxuICAgVGhlcmUgYXJlIGZvdXIgZGlmZmVyZW50IGNvbnRleHQgbW9kZWxpbmcgbW9kZXMgZGVmaW5lZCBoZXJlOlxuICAgICBDT05URVhUX0xTQjY6IGNvbnRleHQgaWQgaXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IDYgYml0cyBvZiB0aGUgbGFzdCBieXRlLFxuICAgICBDT05URVhUX01TQjY6IGNvbnRleHQgaWQgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgNiBiaXRzIG9mIHRoZSBsYXN0IGJ5dGUsXG4gICAgIENPTlRFWFRfVVRGODogc2Vjb25kLW9yZGVyIGNvbnRleHQgbW9kZWwgdHVuZWQgZm9yIFVURjgtZW5jb2RlZCB0ZXh0LFxuICAgICBDT05URVhUX1NJR05FRDogc2Vjb25kLW9yZGVyIGNvbnRleHQgbW9kZWwgdHVuZWQgZm9yIHNpZ25lZCBpbnRlZ2Vycy5cblxuICAgVGhlIGNvbnRleHQgaWQgZm9yIHRoZSBVVEY4IGNvbnRleHQgbW9kZWwgaXMgY2FsY3VsYXRlZCBhcyBmb2xsb3dzLiBJZiBwMVxuICAgYW5kIHAyIGFyZSB0aGUgcHJldmlvdXMgdHdvIGJ5dGVzLCB3ZSBjYWxjdWFsdGUgdGhlIGNvbnRleHQgYXNcblxuICAgICBjb250ZXh0ID0ga0NvbnRleHRMb29rdXBbcDFdIHwga0NvbnRleHRMb29rdXBbcDIgKyAyNTZdLlxuXG4gICBJZiB0aGUgcHJldmlvdXMgdHdvIGJ5dGVzIGFyZSBBU0NJSSBjaGFyYWN0ZXJzIChpLmUuIDwgMTI4KSwgdGhpcyB3aWxsIGJlXG4gICBlcXVpdmFsZW50IHRvXG5cbiAgICAgY29udGV4dCA9IDQgKiBjb250ZXh0MShwMSkgKyBjb250ZXh0MihwMiksXG5cbiAgIHdoZXJlIGNvbnRleHQxIGlzIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBieXRlIGluIHRoZSBmb2xsb3dpbmcgd2F5OlxuXG4gICAgIDAgIDogbm9uLUFTQ0lJIGNvbnRyb2xcbiAgICAgMSAgOiBcXHQsIFxcbiwgXFxyXG4gICAgIDIgIDogc3BhY2VcbiAgICAgMyAgOiBvdGhlciBwdW5jdHVhdGlvblxuICAgICA0ICA6IFwiICdcbiAgICAgNSAgOiAlXG4gICAgIDYgIDogKCA8IFsge1xuICAgICA3ICA6ICkgPiBdIH1cbiAgICAgOCAgOiAsIDsgOlxuICAgICA5ICA6IC5cbiAgICAgMTAgOiA9XG4gICAgIDExIDogbnVtYmVyXG4gICAgIDEyIDogdXBwZXItY2FzZSB2b3dlbFxuICAgICAxMyA6IHVwcGVyLWNhc2UgY29uc29uYW50XG4gICAgIDE0IDogbG93ZXItY2FzZSB2b3dlbFxuICAgICAxNSA6IGxvd2VyLWNhc2UgY29uc29uYW50XG5cbiAgIGFuZCBjb250ZXh0MiBpcyBiYXNlZCBvbiB0aGUgc2Vjb25kIGxhc3QgYnl0ZTpcblxuICAgICAwIDogY29udHJvbCwgc3BhY2VcbiAgICAgMSA6IHB1bmN0dWF0aW9uXG4gICAgIDIgOiB1cHBlci1jYXNlIGxldHRlciwgbnVtYmVyXG4gICAgIDMgOiBsb3dlci1jYXNlIGxldHRlclxuXG4gICBJZiB0aGUgbGFzdCBieXRlIGlzIEFTQ0lJLCBhbmQgdGhlIHNlY29uZCBsYXN0IGJ5dGUgaXMgbm90IChpbiBhIHZhbGlkIFVURjhcbiAgIHN0cmVhbSBpdCB3aWxsIGJlIGEgY29udGludWF0aW9uIGJ5dGUsIHZhbHVlIGJldHdlZW4gMTI4IGFuZCAxOTEpLCB0aGVcbiAgIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgaWYgdGhlIHNlY29uZCBsYXN0IGJ5dGUgd2FzIGFuIEFTQ0lJIGNvbnRyb2wgb3Igc3BhY2UuXG5cbiAgIElmIHRoZSBsYXN0IGJ5dGUgaXMgYSBVVEY4IGxlYWQgYnl0ZSAodmFsdWUgPj0gMTkyKSwgdGhlbiB0aGUgbmV4dCBieXRlIHdpbGxcbiAgIGJlIGEgY29udGludWF0aW9uIGJ5dGUgYW5kIHRoZSBjb250ZXh0IGlkIGlzIDIgb3IgMyBkZXBlbmRpbmcgb24gdGhlIExTQiBvZlxuICAgdGhlIGxhc3QgYnl0ZSBhbmQgdG8gYSBsZXNzZXIgZXh0ZW50IG9uIHRoZSBzZWNvbmQgbGFzdCBieXRlIGlmIGl0IGlzIEFTQ0lJLlxuXG4gICBJZiB0aGUgbGFzdCBieXRlIGlzIGEgVVRGOCBjb250aW51YXRpb24gYnl0ZSwgdGhlIHNlY29uZCBsYXN0IGJ5dGUgY2FuIGJlOlxuICAgICAtIGNvbnRpbnVhdGlvbiBieXRlOiB0aGUgbmV4dCBieXRlIGlzIHByb2JhYmx5IEFTQ0lJIG9yIGxlYWQgYnl0ZSAoYXNzdW1pbmdcbiAgICAgICA0LWJ5dGUgVVRGOCBjaGFyYWN0ZXJzIGFyZSByYXJlKSBhbmQgdGhlIGNvbnRleHQgaWQgaXMgMCBvciAxLlxuICAgICAtIGxlYWQgYnl0ZSAoMTkyIC0gMjA3KTogbmV4dCBieXRlIGlzIEFTQ0lJIG9yIGxlYWQgYnl0ZSwgY29udGV4dCBpcyAwIG9yIDFcbiAgICAgLSBsZWFkIGJ5dGUgKDIwOCAtIDI1NSk6IG5leHQgYnl0ZSBpcyBjb250aW51YXRpb24gYnl0ZSwgY29udGV4dCBpcyAyIG9yIDNcblxuICAgVGhlIHBvc3NpYmxlIHZhbHVlIGNvbWJpbmF0aW9ucyBvZiB0aGUgcHJldmlvdXMgdHdvIGJ5dGVzLCB0aGUgcmFuZ2Ugb2ZcbiAgIGNvbnRleHQgaWRzIGFuZCB0aGUgdHlwZSBvZiB0aGUgbmV4dCBieXRlIGlzIHN1bW1hcml6ZWQgaW4gdGhlIHRhYmxlIGJlbG93OlxuXG4gICB8LS0tLS0tLS1cXC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgfCAgICAgICAgIFxcICAgICAgICAgICAgICAgICAgICAgICAgIExhc3QgYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgIHwgU2Vjb25kICAgXFwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gICB8IGxhc3QgYnl0ZSBcXCAgICBBU0NJSSAgICAgICAgICAgIHwgICBjb250LiBieXRlICAgICAgICB8ICAgbGVhZCBieXRlICAgICAgfFxuICAgfCAgICAgICAgICAgIFxcICAgKDAtMTI3KSAgICAgICAgICB8ICAgKDEyOC0xOTEpICAgICAgICAgfCAgICgxOTItKSAgICAgICAgIHxcbiAgIHw9PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PXxcbiAgIHwgIEFTQ0lJICAgICAgfCBuZXh0OiBBU0NJSS9sZWFkICB8ICBub3QgdmFsaWQgICAgICAgICAgfCAgbmV4dDogY29udC4gICAgIHxcbiAgIHwgICgwLTEyNykgICAgfCBjb250ZXh0OiA0IC0gNjMgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgY29udGV4dDogMiAtIDMgIHxcbiAgIHwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgIHwgIGNvbnQuIGJ5dGUgfCBuZXh0OiBBU0NJSS9sZWFkICB8ICBuZXh0OiBBU0NJSS9sZWFkICAgfCAgbmV4dDogY29udC4gICAgIHxcbiAgIHwgICgxMjgtMTkxKSAgfCBjb250ZXh0OiA0IC0gNjMgICB8ICBjb250ZXh0OiAwIC0gMSAgICAgfCAgY29udGV4dDogMiAtIDMgIHxcbiAgIHwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgIHwgIGxlYWQgYnl0ZSAgfCBub3QgdmFsaWQgICAgICAgICB8ICBuZXh0OiBBU0NJSS9sZWFkICAgfCAgbm90IHZhbGlkICAgICAgIHxcbiAgIHwgICgxOTItMjA3KSAgfCAgICAgICAgICAgICAgICAgICB8ICBjb250ZXh0OiAwIC0gMSAgICAgfCAgICAgICAgICAgICAgICAgIHxcbiAgIHwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgIHwgIGxlYWQgYnl0ZSAgfCBub3QgdmFsaWQgICAgICAgICB8ICBuZXh0OiBjb250LiAgICAgICAgfCAgbm90IHZhbGlkICAgICAgIHxcbiAgIHwgICgyMDgtKSAgICAgfCAgICAgICAgICAgICAgICAgICB8ICBjb250ZXh0OiAyIC0gMyAgICAgfCAgICAgICAgICAgICAgICAgIHxcbiAgIHwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXxcblxuICAgVGhlIGNvbnRleHQgaWQgZm9yIHRoZSBzaWduZWQgY29udGV4dCBtb2RlIGlzIGNhbGN1bGF0ZWQgYXM6XG5cbiAgICAgY29udGV4dCA9IChrQ29udGV4dExvb2t1cFs1MTIgKyBwMV0gPDwgMykgfCBrQ29udGV4dExvb2t1cFs1MTIgKyBwMl0uXG5cbiAgIEZvciBhbnkgY29udGV4dCBtb2RlbGluZyBtb2RlcywgdGhlIGNvbnRleHQgaWRzIGNhbiBiZSBjYWxjdWxhdGVkIGJ5IHwtaW5nXG4gICB0b2dldGhlciB0d28gbG9va3VwcyBmcm9tIG9uZSB0YWJsZSB1c2luZyBjb250ZXh0IG1vZGVsIGRlcGVuZGVudCBvZmZzZXRzOlxuXG4gICAgIGNvbnRleHQgPSBrQ29udGV4dExvb2t1cFtvZmZzZXQxICsgcDFdIHwga0NvbnRleHRMb29rdXBbb2Zmc2V0MiArIHAyXS5cblxuICAgd2hlcmUgb2Zmc2V0MSBhbmQgb2Zmc2V0MiBhcmUgZGVwZW5kZW50IG9uIHRoZSBjb250ZXh0IG1vZGUuXG4qL1xuLyogQ29tbW9uIGNvbnRleHQgbG9va3VwIHRhYmxlIGZvciBhbGwgY29udGV4dCBtb2Rlcy4gKi9cblxudmFyIGxvb2t1cCQyID0gbmV3IFVpbnQ4QXJyYXkoW1xuLyogQ09OVEVYVF9VVEY4LCBsYXN0IGJ5dGUuICovXG5cbi8qIEFTQ0lJIHJhbmdlLiAqL1xuMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNCwgNCwgMCwgMCwgNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgOCwgMTIsIDE2LCAxMiwgMTIsIDIwLCAxMiwgMTYsIDI0LCAyOCwgMTIsIDEyLCAzMiwgMTIsIDM2LCAxMiwgNDQsIDQ0LCA0NCwgNDQsIDQ0LCA0NCwgNDQsIDQ0LCA0NCwgNDQsIDMyLCAzMiwgMjQsIDQwLCAyOCwgMTIsIDEyLCA0OCwgNTIsIDUyLCA1MiwgNDgsIDUyLCA1MiwgNTIsIDQ4LCA1MiwgNTIsIDUyLCA1MiwgNTIsIDQ4LCA1MiwgNTIsIDUyLCA1MiwgNTIsIDQ4LCA1MiwgNTIsIDUyLCA1MiwgNTIsIDI0LCAxMiwgMjgsIDEyLCAxMiwgMTIsIDU2LCA2MCwgNjAsIDYwLCA1NiwgNjAsIDYwLCA2MCwgNTYsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNTYsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNTYsIDYwLCA2MCwgNjAsIDYwLCA2MCwgMjQsIDEyLCAyOCwgMTIsIDAsXG4vKiBVVEY4IGNvbnRpbnVhdGlvbiBieXRlIHJhbmdlLiAqL1xuMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSxcbi8qIFVURjggbGVhZCBieXRlIHJhbmdlLiAqL1xuMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMiwgMyxcbi8qIENPTlRFWFRfVVRGOCBzZWNvbmQgbGFzdCBieXRlLiAqL1xuXG4vKiBBU0NJSSByYW5nZS4gKi9cbjAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDEsIDEsIDEsIDEsIDAsXG4vKiBVVEY4IGNvbnRpbnVhdGlvbiBieXRlIHJhbmdlLiAqL1xuMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbi8qIFVURjggbGVhZCBieXRlIHJhbmdlLiAqL1xuMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMixcbi8qIENPTlRFWFRfU0lHTkVELCBzZWNvbmQgbGFzdCBieXRlLiAqL1xuMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNyxcbi8qIENPTlRFWFRfU0lHTkVELCBsYXN0IGJ5dGUsIHNhbWUgYXMgdGhlIGFib3ZlIHZhbHVlcyBzaGlmdGVkIGJ5IDMgYml0cy4gKi9cbjAsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNTYsXG4vKiBDT05URVhUX0xTQjYsIGxhc3QgYnl0ZS4gKi9cbjAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsXG4vKiBDT05URVhUX01TQjYsIGxhc3QgYnl0ZS4gKi9cbjAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDYsIDYsIDYsIDYsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDksIDksIDksIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI1LCAyNSwgMjUsIDI1LCAyNiwgMjYsIDI2LCAyNiwgMjcsIDI3LCAyNywgMjcsIDI4LCAyOCwgMjgsIDI4LCAyOSwgMjksIDI5LCAyOSwgMzAsIDMwLCAzMCwgMzAsIDMxLCAzMSwgMzEsIDMxLCAzMiwgMzIsIDMyLCAzMiwgMzMsIDMzLCAzMywgMzMsIDM0LCAzNCwgMzQsIDM0LCAzNSwgMzUsIDM1LCAzNSwgMzYsIDM2LCAzNiwgMzYsIDM3LCAzNywgMzcsIDM3LCAzOCwgMzgsIDM4LCAzOCwgMzksIDM5LCAzOSwgMzksIDQwLCA0MCwgNDAsIDQwLCA0MSwgNDEsIDQxLCA0MSwgNDIsIDQyLCA0MiwgNDIsIDQzLCA0MywgNDMsIDQzLCA0NCwgNDQsIDQ0LCA0NCwgNDUsIDQ1LCA0NSwgNDUsIDQ2LCA0NiwgNDYsIDQ2LCA0NywgNDcsIDQ3LCA0NywgNDgsIDQ4LCA0OCwgNDgsIDQ5LCA0OSwgNDksIDQ5LCA1MCwgNTAsIDUwLCA1MCwgNTEsIDUxLCA1MSwgNTEsIDUyLCA1MiwgNTIsIDUyLCA1MywgNTMsIDUzLCA1MywgNTQsIDU0LCA1NCwgNTQsIDU1LCA1NSwgNTUsIDU1LCA1NiwgNTYsIDU2LCA1NiwgNTcsIDU3LCA1NywgNTcsIDU4LCA1OCwgNTgsIDU4LCA1OSwgNTksIDU5LCA1OSwgNjAsIDYwLCA2MCwgNjAsIDYxLCA2MSwgNjEsIDYxLCA2MiwgNjIsIDYyLCA2MiwgNjMsIDYzLCA2MywgNjMsXG4vKiBDT05URVhUX3tNLEx9U0I2LCBzZWNvbmQgbGFzdCBieXRlLCAqL1xuMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pO1xudmFyIGxvb2t1cE9mZnNldHMgPSBuZXcgVWludDE2QXJyYXkoW1xuLyogQ09OVEVYVF9MU0I2ICovXG4xMDI0LCAxNTM2LFxuLyogQ09OVEVYVF9NU0I2ICovXG4xMjgwLCAxNTM2LFxuLyogQ09OVEVYVF9VVEY4ICovXG4wLCAyNTYsXG4vKiBDT05URVhUX1NJR05FRCAqL1xuNzY4LCA1MTJdKTtcbnZhciBjb250ZXh0ID0ge1xuICBsb29rdXA6IGxvb2t1cCQyLFxuICBsb29rdXBPZmZzZXRzOiBsb29rdXBPZmZzZXRzXG59O1xuXG4vKiBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXG4gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4gICBMb29rdXAgdGFibGVzIHRvIG1hcCBwcmVmaXggY29kZXMgdG8gdmFsdWUgcmFuZ2VzLiBUaGlzIGlzIHVzZWQgZHVyaW5nXG4gICBkZWNvZGluZyBvZiB0aGUgYmxvY2sgbGVuZ3RocywgbGl0ZXJhbCBpbnNlcnRpb24gbGVuZ3RocyBhbmQgY29weSBsZW5ndGhzLlxuKi9cblxuLyogUmVwcmVzZW50cyB0aGUgcmFuZ2Ugb2YgdmFsdWVzIGJlbG9uZ2luZyB0byBhIHByZWZpeCBjb2RlOiAqL1xuXG4vKiBbb2Zmc2V0LCBvZmZzZXQgKyAyXm5iaXRzKSAqL1xuZnVuY3Rpb24gUHJlZml4Q29kZVJhbmdlKG9mZnNldCwgbmJpdHMpIHtcbiAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gIHRoaXMubmJpdHMgPSBuYml0cztcbn1cblxudmFyIGtCbG9ja0xlbmd0aFByZWZpeENvZGUgPSBbbmV3IFByZWZpeENvZGVSYW5nZSgxLCAyKSwgbmV3IFByZWZpeENvZGVSYW5nZSg1LCAyKSwgbmV3IFByZWZpeENvZGVSYW5nZSg5LCAyKSwgbmV3IFByZWZpeENvZGVSYW5nZSgxMywgMiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTcsIDMpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDI1LCAzKSwgbmV3IFByZWZpeENvZGVSYW5nZSgzMywgMyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNDEsIDMpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDQ5LCA0KSwgbmV3IFByZWZpeENvZGVSYW5nZSg2NSwgNCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoODEsIDQpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDk3LCA0KSwgbmV3IFByZWZpeENvZGVSYW5nZSgxMTMsIDUpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDE0NSwgNSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTc3LCA1KSwgbmV3IFByZWZpeENvZGVSYW5nZSgyMDksIDUpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDI0MSwgNiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMzA1LCA2KSwgbmV3IFByZWZpeENvZGVSYW5nZSgzNjksIDcpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDQ5NywgOCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNzUzLCA5KSwgbmV3IFByZWZpeENvZGVSYW5nZSgxMjY1LCAxMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMjI4OSwgMTEpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDQzMzcsIDEyKSwgbmV3IFByZWZpeENvZGVSYW5nZSg4NDMzLCAxMyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTY2MjUsIDI0KV07XG52YXIga0luc2VydExlbmd0aFByZWZpeENvZGUgPSBbbmV3IFByZWZpeENvZGVSYW5nZSgwLCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSgxLCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSgyLCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSgzLCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSg0LCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSg1LCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSg2LCAxKSwgbmV3IFByZWZpeENvZGVSYW5nZSg4LCAxKSwgbmV3IFByZWZpeENvZGVSYW5nZSgxMCwgMiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTQsIDIpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDE4LCAzKSwgbmV3IFByZWZpeENvZGVSYW5nZSgyNiwgMyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMzQsIDQpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDUwLCA0KSwgbmV3IFByZWZpeENvZGVSYW5nZSg2NiwgNSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoOTgsIDUpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDEzMCwgNiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTk0LCA3KSwgbmV3IFByZWZpeENvZGVSYW5nZSgzMjIsIDgpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDU3OCwgOSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTA5MCwgMTApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDIxMTQsIDEyKSwgbmV3IFByZWZpeENvZGVSYW5nZSg2MjEwLCAxNCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMjI1OTQsIDI0KV07XG52YXIga0NvcHlMZW5ndGhQcmVmaXhDb2RlID0gW25ldyBQcmVmaXhDb2RlUmFuZ2UoMiwgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMywgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNCwgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNSwgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNiwgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNywgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoOCwgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoOSwgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTAsIDEpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDEyLCAxKSwgbmV3IFByZWZpeENvZGVSYW5nZSgxNCwgMiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTgsIDIpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDIyLCAzKSwgbmV3IFByZWZpeENvZGVSYW5nZSgzMCwgMyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMzgsIDQpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDU0LCA0KSwgbmV3IFByZWZpeENvZGVSYW5nZSg3MCwgNSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTAyLCA1KSwgbmV3IFByZWZpeENvZGVSYW5nZSgxMzQsIDYpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDE5OCwgNyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMzI2LCA4KSwgbmV3IFByZWZpeENvZGVSYW5nZSg1ODIsIDkpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDEwOTQsIDEwKSwgbmV3IFByZWZpeENvZGVSYW5nZSgyMTE4LCAyNCldO1xudmFyIGtJbnNlcnRSYW5nZUx1dCA9IFswLCAwLCA4LCA4LCAwLCAxNiwgOCwgMTYsIDE2XTtcbnZhciBrQ29weVJhbmdlTHV0ID0gWzAsIDgsIDAsIDgsIDE2LCAwLCAxNiwgOCwgMTZdO1xudmFyIHByZWZpeCA9IHtcbiAga0Jsb2NrTGVuZ3RoUHJlZml4Q29kZToga0Jsb2NrTGVuZ3RoUHJlZml4Q29kZSxcbiAga0luc2VydExlbmd0aFByZWZpeENvZGU6IGtJbnNlcnRMZW5ndGhQcmVmaXhDb2RlLFxuICBrQ29weUxlbmd0aFByZWZpeENvZGU6IGtDb3B5TGVuZ3RoUHJlZml4Q29kZSxcbiAga0luc2VydFJhbmdlTHV0OiBrSW5zZXJ0UmFuZ2VMdXQsXG4gIGtDb3B5UmFuZ2VMdXQ6IGtDb3B5UmFuZ2VMdXRcbn07XG5cbi8qIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cbiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiAgIFRyYW5zZm9ybWF0aW9ucyBvbiBkaWN0aW9uYXJ5IHdvcmRzLlxuKi9cblxudmFyIGtJZGVudGl0eSA9IDA7XG52YXIga09taXRMYXN0MSA9IDE7XG52YXIga09taXRMYXN0MiA9IDI7XG52YXIga09taXRMYXN0MyA9IDM7XG52YXIga09taXRMYXN0NCA9IDQ7XG52YXIga09taXRMYXN0NSA9IDU7XG52YXIga09taXRMYXN0NiA9IDY7XG52YXIga09taXRMYXN0NyA9IDc7XG52YXIga09taXRMYXN0OCA9IDg7XG52YXIga09taXRMYXN0OSA9IDk7XG52YXIga1VwcGVyY2FzZUZpcnN0ID0gMTA7XG52YXIga1VwcGVyY2FzZUFsbCA9IDExO1xudmFyIGtPbWl0Rmlyc3QxID0gMTI7XG52YXIga09taXRGaXJzdDIgPSAxMztcbnZhciBrT21pdEZpcnN0MyA9IDE0O1xudmFyIGtPbWl0Rmlyc3Q0ID0gMTU7XG52YXIga09taXRGaXJzdDUgPSAxNjtcbnZhciBrT21pdEZpcnN0NiA9IDE3O1xudmFyIGtPbWl0Rmlyc3Q3ID0gMTg7XG52YXIga09taXRGaXJzdDkgPSAyMDtcblxuZnVuY3Rpb24gVHJhbnNmb3JtJDIocHJlZml4LCB0cmFuc2Zvcm0sIHN1ZmZpeCkge1xuICB0aGlzLnByZWZpeCA9IG5ldyBVaW50OEFycmF5KHByZWZpeC5sZW5ndGgpO1xuICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgdGhpcy5zdWZmaXggPSBuZXcgVWludDhBcnJheShzdWZmaXgubGVuZ3RoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZpeC5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMucHJlZml4W2ldID0gcHJlZml4LmNoYXJDb2RlQXQoaSk7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN1ZmZpeC5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuc3VmZml4W2ldID0gc3VmZml4LmNoYXJDb2RlQXQoaSk7XG4gIH1cbn1cblxudmFyIGtUcmFuc2Zvcm1zID0gW25ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga0lkZW50aXR5LCBcIiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdEZpcnN0MSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgdGhlIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrSWRlbnRpdHksIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJzIFwiLCBrSWRlbnRpdHksIFwiIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgb2YgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgYW5kIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0Rmlyc3QyLCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0TGFzdDEsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIsIFwiLCBrSWRlbnRpdHksIFwiIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIsIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgaW4gXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiB0byBcIiksIG5ldyBUcmFuc2Zvcm0kMihcImUgXCIsIGtJZGVudGl0eSwgXCIgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIlxcXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiLlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJcXFwiPlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJcXG5cIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdExhc3QzLCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJdXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBmb3IgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRGaXJzdDMsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRMYXN0MiwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIGEgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiB0aGF0IFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIi4gXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIuXCIsIGtJZGVudGl0eSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga0lkZW50aXR5LCBcIiwgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRGaXJzdDQsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiB3aXRoIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCInXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBmcm9tIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgYnkgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRGaXJzdDUsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRGaXJzdDYsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgdGhlIFwiLCBrSWRlbnRpdHksIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRMYXN0NCwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiLiBUaGUgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIG9uIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgYXMgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBpcyBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdExhc3Q3LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0TGFzdDEsIFwiaW5nIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJcXG5cXHRcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiOlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrSWRlbnRpdHksIFwiLiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiZWQgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRGaXJzdDksIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRGaXJzdDcsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRMYXN0NiwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiKFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCIsIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0TGFzdDgsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBhdCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwibHkgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgdGhlIFwiLCBrSWRlbnRpdHksIFwiIG9mIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0TGFzdDUsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRMYXN0OSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUZpcnN0LCBcIiwgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIlxcXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIi5cIiwga0lkZW50aXR5LCBcIihcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiXFxcIj5cIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiPVxcXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga0lkZW50aXR5LCBcIi5cIiksIG5ldyBUcmFuc2Zvcm0kMihcIi5jb20vXCIsIGtJZGVudGl0eSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiB0aGUgXCIsIGtJZGVudGl0eSwgXCIgb2YgdGhlIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCInXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIi4gVGhpcyBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiLFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiLlwiLCBrSWRlbnRpdHksIFwiIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCIoXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIi5cIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIG5vdCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga0lkZW50aXR5LCBcIj1cXFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcImVyIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlQWxsLCBcIiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiYWwgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VBbGwsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIj0nXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCJcXFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIi4gXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtJZGVudGl0eSwgXCIoXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcImZ1bCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUZpcnN0LCBcIi4gXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIml2ZSBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwibGVzcyBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIidcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiZXN0IFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiLlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiXFxcIj5cIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga0lkZW50aXR5LCBcIj0nXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIixcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiaXplIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiLlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXFx4YzJcXHhhMFwiLCBrSWRlbnRpdHksIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtJZGVudGl0eSwgXCIsXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIj1cXFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCI9XFxcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJvdXMgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCIsIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCI9J1wiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiLFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlQWxsLCBcIj1cXFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VBbGwsIFwiLCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIixcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIihcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIi4gXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VBbGwsIFwiLlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiPSdcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUFsbCwgXCIuIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiPVxcXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUFsbCwgXCI9J1wiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiPSdcIildO1xudmFyIGtUcmFuc2Zvcm1zXzEgPSBrVHJhbnNmb3JtcztcbnZhciBrTnVtVHJhbnNmb3JtcyA9IGtUcmFuc2Zvcm1zLmxlbmd0aDtcblxuZnVuY3Rpb24gVG9VcHBlckNhc2UocCwgaSkge1xuICBpZiAocFtpXSA8IDB4YzApIHtcbiAgICBpZiAocFtpXSA+PSA5NyAmJiBwW2ldIDw9IDEyMikge1xuICAgICAgcFtpXSBePSAzMjtcbiAgICB9XG5cbiAgICByZXR1cm4gMTtcbiAgfVxuICAvKiBBbiBvdmVybHkgc2ltcGxpZmllZCB1cHBlcmNhc2luZyBtb2RlbCBmb3IgdXRmLTguICovXG5cblxuICBpZiAocFtpXSA8IDB4ZTApIHtcbiAgICBwW2kgKyAxXSBePSAzMjtcbiAgICByZXR1cm4gMjtcbiAgfVxuICAvKiBBbiBhcmJpdHJhcnkgdHJhbnNmb3JtIGZvciB0aHJlZSBieXRlIGNoYXJhY3RlcnMuICovXG5cblxuICBwW2kgKyAyXSBePSA1O1xuICByZXR1cm4gMztcbn1cblxudmFyIHRyYW5zZm9ybURpY3Rpb25hcnlXb3JkID0gZnVuY3Rpb24gdHJhbnNmb3JtRGljdGlvbmFyeVdvcmQoZHN0LCBpZHgsIHdvcmQsIGxlbiwgdHJhbnNmb3JtKSB7XG4gIHZhciBwcmVmaXggPSBrVHJhbnNmb3Jtc1t0cmFuc2Zvcm1dLnByZWZpeDtcbiAgdmFyIHN1ZmZpeCA9IGtUcmFuc2Zvcm1zW3RyYW5zZm9ybV0uc3VmZml4O1xuICB2YXIgdCA9IGtUcmFuc2Zvcm1zW3RyYW5zZm9ybV0udHJhbnNmb3JtO1xuICB2YXIgc2tpcCA9IHQgPCBrT21pdEZpcnN0MSA/IDAgOiB0IC0gKGtPbWl0Rmlyc3QxIC0gMSk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHN0YXJ0X2lkeCA9IGlkeDtcbiAgdmFyIHVwcGVyY2FzZTtcblxuICBpZiAoc2tpcCA+IGxlbikge1xuICAgIHNraXAgPSBsZW47XG4gIH1cblxuICB2YXIgcHJlZml4X3BvcyA9IDA7XG5cbiAgd2hpbGUgKHByZWZpeF9wb3MgPCBwcmVmaXgubGVuZ3RoKSB7XG4gICAgZHN0W2lkeCsrXSA9IHByZWZpeFtwcmVmaXhfcG9zKytdO1xuICB9XG5cbiAgd29yZCArPSBza2lwO1xuICBsZW4gLT0gc2tpcDtcblxuICBpZiAodCA8PSBrT21pdExhc3Q5KSB7XG4gICAgbGVuIC09IHQ7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBkc3RbaWR4KytdID0gZGljdGlvbmFyeS5kaWN0aW9uYXJ5W3dvcmQgKyBpXTtcbiAgfVxuXG4gIHVwcGVyY2FzZSA9IGlkeCAtIGxlbjtcblxuICBpZiAodCA9PT0ga1VwcGVyY2FzZUZpcnN0KSB7XG4gICAgVG9VcHBlckNhc2UoZHN0LCB1cHBlcmNhc2UpO1xuICB9IGVsc2UgaWYgKHQgPT09IGtVcHBlcmNhc2VBbGwpIHtcbiAgICB3aGlsZSAobGVuID4gMCkge1xuICAgICAgdmFyIHN0ZXAgPSBUb1VwcGVyQ2FzZShkc3QsIHVwcGVyY2FzZSk7XG4gICAgICB1cHBlcmNhc2UgKz0gc3RlcDtcbiAgICAgIGxlbiAtPSBzdGVwO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdWZmaXhfcG9zID0gMDtcblxuICB3aGlsZSAoc3VmZml4X3BvcyA8IHN1ZmZpeC5sZW5ndGgpIHtcbiAgICBkc3RbaWR4KytdID0gc3VmZml4W3N1ZmZpeF9wb3MrK107XG4gIH1cblxuICByZXR1cm4gaWR4IC0gc3RhcnRfaWR4O1xufTtcblxudmFyIHRyYW5zZm9ybSA9IHtcbiAga1RyYW5zZm9ybXM6IGtUcmFuc2Zvcm1zXzEsXG4gIGtOdW1UcmFuc2Zvcm1zOiBrTnVtVHJhbnNmb3JtcyxcbiAgdHJhbnNmb3JtRGljdGlvbmFyeVdvcmQ6IHRyYW5zZm9ybURpY3Rpb25hcnlXb3JkXG59O1xuXG4vKiBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXG4gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxudmFyIEJyb3RsaUlucHV0JDEgPSBzdHJlYW1zJDEuQnJvdGxpSW5wdXQ7XG52YXIgQnJvdGxpT3V0cHV0JDEgPSBzdHJlYW1zJDEuQnJvdGxpT3V0cHV0O1xudmFyIEh1ZmZtYW5Db2RlJDEgPSBodWZmbWFuLkh1ZmZtYW5Db2RlO1xudmFyIEJyb3RsaUJ1aWxkSHVmZm1hblRhYmxlJDEgPSBodWZmbWFuLkJyb3RsaUJ1aWxkSHVmZm1hblRhYmxlO1xudmFyIGtEZWZhdWx0Q29kZUxlbmd0aCA9IDg7XG52YXIga0NvZGVMZW5ndGhSZXBlYXRDb2RlID0gMTY7XG52YXIga051bUxpdGVyYWxDb2RlcyA9IDI1NjtcbnZhciBrTnVtSW5zZXJ0QW5kQ29weUNvZGVzID0gNzA0O1xudmFyIGtOdW1CbG9ja0xlbmd0aENvZGVzID0gMjY7XG52YXIga0xpdGVyYWxDb250ZXh0Qml0cyA9IDY7XG52YXIga0Rpc3RhbmNlQ29udGV4dEJpdHMgPSAyO1xudmFyIEhVRkZNQU5fVEFCTEVfQklUUyA9IDg7XG52YXIgSFVGRk1BTl9UQUJMRV9NQVNLID0gMHhmZjtcbi8qIE1heGltdW0gcG9zc2libGUgSHVmZm1hbiB0YWJsZSBzaXplIGZvciBhbiBhbHBoYWJldCBzaXplIG9mIDcwNCwgbWF4IGNvZGVcbiAqIGxlbmd0aCAxNSBhbmQgcm9vdCB0YWJsZSBiaXRzIDguICovXG5cbnZhciBIVUZGTUFOX01BWF9UQUJMRV9TSVpFID0gMTA4MDtcbnZhciBDT0RFX0xFTkdUSF9DT0RFUyA9IDE4O1xudmFyIGtDb2RlTGVuZ3RoQ29kZU9yZGVyID0gbmV3IFVpbnQ4QXJyYXkoWzEsIDIsIDMsIDQsIDAsIDUsIDE3LCA2LCAxNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNV0pO1xudmFyIE5VTV9ESVNUQU5DRV9TSE9SVF9DT0RFUyA9IDE2O1xudmFyIGtEaXN0YW5jZVNob3J0Q29kZUluZGV4T2Zmc2V0ID0gbmV3IFVpbnQ4QXJyYXkoWzMsIDIsIDEsIDAsIDMsIDMsIDMsIDMsIDMsIDMsIDIsIDIsIDIsIDIsIDIsIDJdKTtcbnZhciBrRGlzdGFuY2VTaG9ydENvZGVWYWx1ZU9mZnNldCA9IG5ldyBJbnQ4QXJyYXkoWzAsIDAsIDAsIDAsIC0xLCAxLCAtMiwgMiwgLTMsIDMsIC0xLCAxLCAtMiwgMiwgLTMsIDNdKTtcbnZhciBrTWF4SHVmZm1hblRhYmxlU2l6ZSA9IG5ldyBVaW50MTZBcnJheShbMjU2LCA0MDIsIDQzNiwgNDY4LCA1MDAsIDUzNCwgNTY2LCA1OTgsIDYzMCwgNjYyLCA2OTQsIDcyNiwgNzU4LCA3OTAsIDgyMiwgODU0LCA4ODYsIDkyMCwgOTUyLCA5ODQsIDEwMTYsIDEwNDgsIDEwODBdKTtcblxuZnVuY3Rpb24gRGVjb2RlV2luZG93Qml0cyhicikge1xuICB2YXIgbjtcblxuICBpZiAoYnIucmVhZEJpdHMoMSkgPT09IDApIHtcbiAgICByZXR1cm4gMTY7XG4gIH1cblxuICBuID0gYnIucmVhZEJpdHMoMyk7XG5cbiAgaWYgKG4gPiAwKSB7XG4gICAgcmV0dXJuIDE3ICsgbjtcbiAgfVxuXG4gIG4gPSBici5yZWFkQml0cygzKTtcblxuICBpZiAobiA+IDApIHtcbiAgICByZXR1cm4gOCArIG47XG4gIH1cblxuICByZXR1cm4gMTc7XG59XG4vKiBEZWNvZGVzIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbMC4uMjU1XSwgYnkgcmVhZGluZyAxIC0gMTEgYml0cy4gKi9cblxuXG5mdW5jdGlvbiBEZWNvZGVWYXJMZW5VaW50OChicikge1xuICBpZiAoYnIucmVhZEJpdHMoMSkpIHtcbiAgICB2YXIgbmJpdHMgPSBici5yZWFkQml0cygzKTtcblxuICAgIGlmIChuYml0cyA9PT0gMCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBici5yZWFkQml0cyhuYml0cykgKyAoMSA8PCBuYml0cyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIE1ldGFCbG9ja0xlbmd0aCgpIHtcbiAgdGhpcy5tZXRhX2Jsb2NrX2xlbmd0aCA9IDA7XG4gIHRoaXMuaW5wdXRfZW5kID0gMDtcbiAgdGhpcy5pc191bmNvbXByZXNzZWQgPSAwO1xuICB0aGlzLmlzX21ldGFkYXRhID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIERlY29kZU1ldGFCbG9ja0xlbmd0aChicikge1xuICB2YXIgb3V0ID0gbmV3IE1ldGFCbG9ja0xlbmd0aCgpO1xuICB2YXIgc2l6ZV9uaWJibGVzO1xuICB2YXIgc2l6ZV9ieXRlcztcbiAgdmFyIGk7XG4gIG91dC5pbnB1dF9lbmQgPSBici5yZWFkQml0cygxKTtcblxuICBpZiAob3V0LmlucHV0X2VuZCAmJiBici5yZWFkQml0cygxKSkge1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBzaXplX25pYmJsZXMgPSBici5yZWFkQml0cygyKSArIDQ7XG5cbiAgaWYgKHNpemVfbmliYmxlcyA9PT0gNykge1xuICAgIG91dC5pc19tZXRhZGF0YSA9IHRydWU7XG4gICAgaWYgKGJyLnJlYWRCaXRzKDEpICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVzZXJ2ZWQgYml0Jyk7XG4gICAgc2l6ZV9ieXRlcyA9IGJyLnJlYWRCaXRzKDIpO1xuICAgIGlmIChzaXplX2J5dGVzID09PSAwKSByZXR1cm4gb3V0O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNpemVfYnl0ZXM7IGkrKykge1xuICAgICAgdmFyIG5leHRfYnl0ZSA9IGJyLnJlYWRCaXRzKDgpO1xuICAgICAgaWYgKGkgKyAxID09PSBzaXplX2J5dGVzICYmIHNpemVfYnl0ZXMgPiAxICYmIG5leHRfYnl0ZSA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpemUgYnl0ZScpO1xuICAgICAgb3V0Lm1ldGFfYmxvY2tfbGVuZ3RoIHw9IG5leHRfYnl0ZSA8PCBpICogODtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChpID0gMDsgaSA8IHNpemVfbmliYmxlczsgKytpKSB7XG4gICAgICB2YXIgbmV4dF9uaWJibGUgPSBici5yZWFkQml0cyg0KTtcbiAgICAgIGlmIChpICsgMSA9PT0gc2l6ZV9uaWJibGVzICYmIHNpemVfbmliYmxlcyA+IDQgJiYgbmV4dF9uaWJibGUgPT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaXplIG5pYmJsZScpO1xuICAgICAgb3V0Lm1ldGFfYmxvY2tfbGVuZ3RoIHw9IG5leHRfbmliYmxlIDw8IGkgKiA0O1xuICAgIH1cbiAgfVxuXG4gICsrb3V0Lm1ldGFfYmxvY2tfbGVuZ3RoO1xuXG4gIGlmICghb3V0LmlucHV0X2VuZCAmJiAhb3V0LmlzX21ldGFkYXRhKSB7XG4gICAgb3V0LmlzX3VuY29tcHJlc3NlZCA9IGJyLnJlYWRCaXRzKDEpO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qIERlY29kZXMgdGhlIG5leHQgSHVmZm1hbiBjb2RlIGZyb20gYml0LXN0cmVhbS4gKi9cblxuXG5mdW5jdGlvbiBSZWFkU3ltYm9sKHRhYmxlLCBpbmRleCwgYnIpIHtcbiAgdmFyIG5iaXRzO1xuICBici5maWxsQml0V2luZG93KCk7XG4gIGluZGV4ICs9IGJyLnZhbF8gPj4+IGJyLmJpdF9wb3NfICYgSFVGRk1BTl9UQUJMRV9NQVNLO1xuICBuYml0cyA9IHRhYmxlW2luZGV4XS5iaXRzIC0gSFVGRk1BTl9UQUJMRV9CSVRTO1xuXG4gIGlmIChuYml0cyA+IDApIHtcbiAgICBici5iaXRfcG9zXyArPSBIVUZGTUFOX1RBQkxFX0JJVFM7XG4gICAgaW5kZXggKz0gdGFibGVbaW5kZXhdLnZhbHVlO1xuICAgIGluZGV4ICs9IGJyLnZhbF8gPj4+IGJyLmJpdF9wb3NfICYgKDEgPDwgbmJpdHMpIC0gMTtcbiAgfVxuXG4gIGJyLmJpdF9wb3NfICs9IHRhYmxlW2luZGV4XS5iaXRzO1xuICByZXR1cm4gdGFibGVbaW5kZXhdLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBSZWFkSHVmZm1hbkNvZGVMZW5ndGhzKGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywgbnVtX3N5bWJvbHMsIGNvZGVfbGVuZ3RocywgYnIpIHtcbiAgdmFyIHN5bWJvbCA9IDA7XG4gIHZhciBwcmV2X2NvZGVfbGVuID0ga0RlZmF1bHRDb2RlTGVuZ3RoO1xuICB2YXIgcmVwZWF0ID0gMDtcbiAgdmFyIHJlcGVhdF9jb2RlX2xlbiA9IDA7XG4gIHZhciBzcGFjZSA9IDMyNzY4O1xuICB2YXIgdGFibGUgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICB0YWJsZS5wdXNoKG5ldyBIdWZmbWFuQ29kZSQxKDAsIDApKTtcbiAgfVxuXG4gIEJyb3RsaUJ1aWxkSHVmZm1hblRhYmxlJDEodGFibGUsIDAsIDUsIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywgQ09ERV9MRU5HVEhfQ09ERVMpO1xuXG4gIHdoaWxlIChzeW1ib2wgPCBudW1fc3ltYm9scyAmJiBzcGFjZSA+IDApIHtcbiAgICB2YXIgcCA9IDA7XG4gICAgdmFyIGNvZGVfbGVuO1xuICAgIGJyLnJlYWRNb3JlSW5wdXQoKTtcbiAgICBici5maWxsQml0V2luZG93KCk7XG4gICAgcCArPSBici52YWxfID4+PiBici5iaXRfcG9zXyAmIDMxO1xuICAgIGJyLmJpdF9wb3NfICs9IHRhYmxlW3BdLmJpdHM7XG4gICAgY29kZV9sZW4gPSB0YWJsZVtwXS52YWx1ZSAmIDB4ZmY7XG5cbiAgICBpZiAoY29kZV9sZW4gPCBrQ29kZUxlbmd0aFJlcGVhdENvZGUpIHtcbiAgICAgIHJlcGVhdCA9IDA7XG4gICAgICBjb2RlX2xlbmd0aHNbc3ltYm9sKytdID0gY29kZV9sZW47XG5cbiAgICAgIGlmIChjb2RlX2xlbiAhPT0gMCkge1xuICAgICAgICBwcmV2X2NvZGVfbGVuID0gY29kZV9sZW47XG4gICAgICAgIHNwYWNlIC09IDMyNzY4ID4+IGNvZGVfbGVuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZXh0cmFfYml0cyA9IGNvZGVfbGVuIC0gMTQ7XG4gICAgICB2YXIgb2xkX3JlcGVhdDtcbiAgICAgIHZhciByZXBlYXRfZGVsdGE7XG4gICAgICB2YXIgbmV3X2xlbiA9IDA7XG5cbiAgICAgIGlmIChjb2RlX2xlbiA9PT0ga0NvZGVMZW5ndGhSZXBlYXRDb2RlKSB7XG4gICAgICAgIG5ld19sZW4gPSBwcmV2X2NvZGVfbGVuO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVwZWF0X2NvZGVfbGVuICE9PSBuZXdfbGVuKSB7XG4gICAgICAgIHJlcGVhdCA9IDA7XG4gICAgICAgIHJlcGVhdF9jb2RlX2xlbiA9IG5ld19sZW47XG4gICAgICB9XG5cbiAgICAgIG9sZF9yZXBlYXQgPSByZXBlYXQ7XG5cbiAgICAgIGlmIChyZXBlYXQgPiAwKSB7XG4gICAgICAgIHJlcGVhdCAtPSAyO1xuICAgICAgICByZXBlYXQgPDw9IGV4dHJhX2JpdHM7XG4gICAgICB9XG5cbiAgICAgIHJlcGVhdCArPSBici5yZWFkQml0cyhleHRyYV9iaXRzKSArIDM7XG4gICAgICByZXBlYXRfZGVsdGEgPSByZXBlYXQgLSBvbGRfcmVwZWF0O1xuXG4gICAgICBpZiAoc3ltYm9sICsgcmVwZWF0X2RlbHRhID4gbnVtX3N5bWJvbHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVhZEh1ZmZtYW5Db2RlTGVuZ3Roc10gc3ltYm9sICsgcmVwZWF0X2RlbHRhID4gbnVtX3N5bWJvbHMnKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCByZXBlYXRfZGVsdGE7IHgrKykge1xuICAgICAgICBjb2RlX2xlbmd0aHNbc3ltYm9sICsgeF0gPSByZXBlYXRfY29kZV9sZW47XG4gICAgICB9XG5cbiAgICAgIHN5bWJvbCArPSByZXBlYXRfZGVsdGE7XG5cbiAgICAgIGlmIChyZXBlYXRfY29kZV9sZW4gIT09IDApIHtcbiAgICAgICAgc3BhY2UgLT0gcmVwZWF0X2RlbHRhIDw8IDE1IC0gcmVwZWF0X2NvZGVfbGVuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzcGFjZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIltSZWFkSHVmZm1hbkNvZGVMZW5ndGhzXSBzcGFjZSA9IFwiICsgc3BhY2UpO1xuICB9XG5cbiAgZm9yICg7IHN5bWJvbCA8IG51bV9zeW1ib2xzOyBzeW1ib2wrKykge1xuICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2xdID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBSZWFkSHVmZm1hbkNvZGUoYWxwaGFiZXRfc2l6ZSwgdGFibGVzLCB0YWJsZSwgYnIpIHtcbiAgdmFyIHRhYmxlX3NpemUgPSAwO1xuICB2YXIgc2ltcGxlX2NvZGVfb3Jfc2tpcDtcbiAgdmFyIGNvZGVfbGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KGFscGhhYmV0X3NpemUpO1xuICBici5yZWFkTW9yZUlucHV0KCk7XG4gIC8qIHNpbXBsZV9jb2RlX29yX3NraXAgaXMgdXNlZCBhcyBmb2xsb3dzOlxuICAgICAxIGZvciBzaW1wbGUgY29kZTtcbiAgICAgMCBmb3Igbm8gc2tpcHBpbmcsIDIgc2tpcHMgMiBjb2RlIGxlbmd0aHMsIDMgc2tpcHMgMyBjb2RlIGxlbmd0aHMgKi9cblxuICBzaW1wbGVfY29kZV9vcl9za2lwID0gYnIucmVhZEJpdHMoMik7XG5cbiAgaWYgKHNpbXBsZV9jb2RlX29yX3NraXAgPT09IDEpIHtcbiAgICAvKiBSZWFkIHN5bWJvbHMsIGNvZGVzICYgY29kZSBsZW5ndGhzIGRpcmVjdGx5LiAqL1xuICAgIHZhciBpO1xuICAgIHZhciBtYXhfYml0c19jb3VudGVyID0gYWxwaGFiZXRfc2l6ZSAtIDE7XG4gICAgdmFyIG1heF9iaXRzID0gMDtcbiAgICB2YXIgc3ltYm9scyA9IG5ldyBJbnQzMkFycmF5KDQpO1xuICAgIHZhciBudW1fc3ltYm9scyA9IGJyLnJlYWRCaXRzKDIpICsgMTtcblxuICAgIHdoaWxlIChtYXhfYml0c19jb3VudGVyKSB7XG4gICAgICBtYXhfYml0c19jb3VudGVyID4+PSAxO1xuICAgICAgKyttYXhfYml0cztcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bWJvbHM7ICsraSkge1xuICAgICAgc3ltYm9sc1tpXSA9IGJyLnJlYWRCaXRzKG1heF9iaXRzKSAlIGFscGhhYmV0X3NpemU7XG4gICAgICBjb2RlX2xlbmd0aHNbc3ltYm9sc1tpXV0gPSAyO1xuICAgIH1cblxuICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2xzWzBdXSA9IDE7XG5cbiAgICBzd2l0Y2ggKG51bV9zeW1ib2xzKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICAgIGlmIChzeW1ib2xzWzBdID09PSBzeW1ib2xzWzFdIHx8IHN5bWJvbHNbMF0gPT09IHN5bWJvbHNbMl0gfHwgc3ltYm9sc1sxXSA9PT0gc3ltYm9sc1syXSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW1JlYWRIdWZmbWFuQ29kZV0gaW52YWxpZCBzeW1ib2xzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICBpZiAoc3ltYm9sc1swXSA9PT0gc3ltYm9sc1sxXSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW1JlYWRIdWZmbWFuQ29kZV0gaW52YWxpZCBzeW1ib2xzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RlX2xlbmd0aHNbc3ltYm9sc1sxXV0gPSAxO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA0OlxuICAgICAgICBpZiAoc3ltYm9sc1swXSA9PT0gc3ltYm9sc1sxXSB8fCBzeW1ib2xzWzBdID09PSBzeW1ib2xzWzJdIHx8IHN5bWJvbHNbMF0gPT09IHN5bWJvbHNbM10gfHwgc3ltYm9sc1sxXSA9PT0gc3ltYm9sc1syXSB8fCBzeW1ib2xzWzFdID09PSBzeW1ib2xzWzNdIHx8IHN5bWJvbHNbMl0gPT09IHN5bWJvbHNbM10pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWFkSHVmZm1hbkNvZGVdIGludmFsaWQgc3ltYm9scycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJyLnJlYWRCaXRzKDEpKSB7XG4gICAgICAgICAgY29kZV9sZW5ndGhzW3N5bWJvbHNbMl1dID0gMztcbiAgICAgICAgICBjb2RlX2xlbmd0aHNbc3ltYm9sc1szXV0gPSAzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2xzWzBdXSA9IDI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLyogRGVjb2RlIEh1ZmZtYW4tY29kZWQgY29kZSBsZW5ndGhzLiAqL1xuICAgIHZhciBpO1xuICAgIHZhciBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHMgPSBuZXcgVWludDhBcnJheShDT0RFX0xFTkdUSF9DT0RFUyk7XG4gICAgdmFyIHNwYWNlID0gMzI7XG4gICAgdmFyIG51bV9jb2RlcyA9IDA7XG4gICAgLyogU3RhdGljIEh1ZmZtYW4gY29kZSBmb3IgdGhlIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuXG4gICAgdmFyIGh1ZmYgPSBbbmV3IEh1ZmZtYW5Db2RlJDEoMiwgMCksIG5ldyBIdWZmbWFuQ29kZSQxKDIsIDQpLCBuZXcgSHVmZm1hbkNvZGUkMSgyLCAzKSwgbmV3IEh1ZmZtYW5Db2RlJDEoMywgMiksIG5ldyBIdWZmbWFuQ29kZSQxKDIsIDApLCBuZXcgSHVmZm1hbkNvZGUkMSgyLCA0KSwgbmV3IEh1ZmZtYW5Db2RlJDEoMiwgMyksIG5ldyBIdWZmbWFuQ29kZSQxKDQsIDEpLCBuZXcgSHVmZm1hbkNvZGUkMSgyLCAwKSwgbmV3IEh1ZmZtYW5Db2RlJDEoMiwgNCksIG5ldyBIdWZmbWFuQ29kZSQxKDIsIDMpLCBuZXcgSHVmZm1hbkNvZGUkMSgzLCAyKSwgbmV3IEh1ZmZtYW5Db2RlJDEoMiwgMCksIG5ldyBIdWZmbWFuQ29kZSQxKDIsIDQpLCBuZXcgSHVmZm1hbkNvZGUkMSgyLCAzKSwgbmV3IEh1ZmZtYW5Db2RlJDEoNCwgNSldO1xuXG4gICAgZm9yIChpID0gc2ltcGxlX2NvZGVfb3Jfc2tpcDsgaSA8IENPREVfTEVOR1RIX0NPREVTICYmIHNwYWNlID4gMDsgKytpKSB7XG4gICAgICB2YXIgY29kZV9sZW5faWR4ID0ga0NvZGVMZW5ndGhDb2RlT3JkZXJbaV07XG4gICAgICB2YXIgcCA9IDA7XG4gICAgICB2YXIgdjtcbiAgICAgIGJyLmZpbGxCaXRXaW5kb3coKTtcbiAgICAgIHAgKz0gYnIudmFsXyA+Pj4gYnIuYml0X3Bvc18gJiAxNTtcbiAgICAgIGJyLmJpdF9wb3NfICs9IGh1ZmZbcF0uYml0cztcbiAgICAgIHYgPSBodWZmW3BdLnZhbHVlO1xuICAgICAgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzW2NvZGVfbGVuX2lkeF0gPSB2O1xuXG4gICAgICBpZiAodiAhPT0gMCkge1xuICAgICAgICBzcGFjZSAtPSAzMiA+PiB2O1xuICAgICAgICArK251bV9jb2RlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIShudW1fY29kZXMgPT09IDEgfHwgc3BhY2UgPT09IDApKSB0aHJvdyBuZXcgRXJyb3IoJ1tSZWFkSHVmZm1hbkNvZGVdIGludmFsaWQgbnVtX2NvZGVzIG9yIHNwYWNlJyk7XG4gICAgUmVhZEh1ZmZtYW5Db2RlTGVuZ3Rocyhjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHMsIGFscGhhYmV0X3NpemUsIGNvZGVfbGVuZ3RocywgYnIpO1xuICB9XG5cbiAgdGFibGVfc2l6ZSA9IEJyb3RsaUJ1aWxkSHVmZm1hblRhYmxlJDEodGFibGVzLCB0YWJsZSwgSFVGRk1BTl9UQUJMRV9CSVRTLCBjb2RlX2xlbmd0aHMsIGFscGhhYmV0X3NpemUpO1xuXG4gIGlmICh0YWJsZV9zaXplID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiW1JlYWRIdWZmbWFuQ29kZV0gQnVpbGRIdWZmbWFuVGFibGUgZmFpbGVkOiBcIik7XG4gIH1cblxuICByZXR1cm4gdGFibGVfc2l6ZTtcbn1cblxuZnVuY3Rpb24gUmVhZEJsb2NrTGVuZ3RoKHRhYmxlLCBpbmRleCwgYnIpIHtcbiAgdmFyIGNvZGU7XG4gIHZhciBuYml0cztcbiAgY29kZSA9IFJlYWRTeW1ib2wodGFibGUsIGluZGV4LCBicik7XG4gIG5iaXRzID0gcHJlZml4LmtCbG9ja0xlbmd0aFByZWZpeENvZGVbY29kZV0ubmJpdHM7XG4gIHJldHVybiBwcmVmaXgua0Jsb2NrTGVuZ3RoUHJlZml4Q29kZVtjb2RlXS5vZmZzZXQgKyBici5yZWFkQml0cyhuYml0cyk7XG59XG5cbmZ1bmN0aW9uIFRyYW5zbGF0ZVNob3J0Q29kZXMoY29kZSwgcmluZ2J1ZmZlciwgaW5kZXgpIHtcbiAgdmFyIHZhbDtcblxuICBpZiAoY29kZSA8IE5VTV9ESVNUQU5DRV9TSE9SVF9DT0RFUykge1xuICAgIGluZGV4ICs9IGtEaXN0YW5jZVNob3J0Q29kZUluZGV4T2Zmc2V0W2NvZGVdO1xuICAgIGluZGV4ICY9IDM7XG4gICAgdmFsID0gcmluZ2J1ZmZlcltpbmRleF0gKyBrRGlzdGFuY2VTaG9ydENvZGVWYWx1ZU9mZnNldFtjb2RlXTtcbiAgfSBlbHNlIHtcbiAgICB2YWwgPSBjb2RlIC0gTlVNX0RJU1RBTkNFX1NIT1JUX0NPREVTICsgMTtcbiAgfVxuXG4gIHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIE1vdmVUb0Zyb250KHYsIGluZGV4KSB7XG4gIHZhciB2YWx1ZSA9IHZbaW5kZXhdO1xuICB2YXIgaSA9IGluZGV4O1xuXG4gIGZvciAoOyBpOyAtLWkpIHtcbiAgICB2W2ldID0gdltpIC0gMV07XG4gIH1cblxuICB2WzBdID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEludmVyc2VNb3ZlVG9Gcm9udFRyYW5zZm9ybSh2LCB2X2xlbikge1xuICB2YXIgbXRmID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbiAgdmFyIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gICAgbXRmW2ldID0gaTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCB2X2xlbjsgKytpKSB7XG4gICAgdmFyIGluZGV4ID0gdltpXTtcbiAgICB2W2ldID0gbXRmW2luZGV4XTtcbiAgICBpZiAoaW5kZXgpIE1vdmVUb0Zyb250KG10ZiwgaW5kZXgpO1xuICB9XG59XG4vKiBDb250YWlucyBhIGNvbGxlY3Rpb24gb2YgaHVmZm1hbiB0cmVlcyB3aXRoIHRoZSBzYW1lIGFscGhhYmV0IHNpemUuICovXG5cblxuZnVuY3Rpb24gSHVmZm1hblRyZWVHcm91cChhbHBoYWJldF9zaXplLCBudW1faHRyZWVzKSB7XG4gIHRoaXMuYWxwaGFiZXRfc2l6ZSA9IGFscGhhYmV0X3NpemU7XG4gIHRoaXMubnVtX2h0cmVlcyA9IG51bV9odHJlZXM7XG4gIHRoaXMuY29kZXMgPSBuZXcgQXJyYXkobnVtX2h0cmVlcyArIG51bV9odHJlZXMgKiBrTWF4SHVmZm1hblRhYmxlU2l6ZVthbHBoYWJldF9zaXplICsgMzEgPj4+IDVdKTtcbiAgdGhpcy5odHJlZXMgPSBuZXcgVWludDMyQXJyYXkobnVtX2h0cmVlcyk7XG59XG5cbkh1ZmZtYW5UcmVlR3JvdXAucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChicikge1xuICB2YXIgaTtcbiAgdmFyIHRhYmxlX3NpemU7XG4gIHZhciBuZXh0ID0gMDtcblxuICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5udW1faHRyZWVzOyArK2kpIHtcbiAgICB0aGlzLmh0cmVlc1tpXSA9IG5leHQ7XG4gICAgdGFibGVfc2l6ZSA9IFJlYWRIdWZmbWFuQ29kZSh0aGlzLmFscGhhYmV0X3NpemUsIHRoaXMuY29kZXMsIG5leHQsIGJyKTtcbiAgICBuZXh0ICs9IHRhYmxlX3NpemU7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIERlY29kZUNvbnRleHRNYXAoY29udGV4dF9tYXBfc2l6ZSwgYnIpIHtcbiAgdmFyIG91dCA9IHtcbiAgICBudW1faHRyZWVzOiBudWxsLFxuICAgIGNvbnRleHRfbWFwOiBudWxsXG4gIH07XG4gIHZhciB1c2VfcmxlX2Zvcl96ZXJvcztcbiAgdmFyIG1heF9ydW5fbGVuZ3RoX3ByZWZpeCA9IDA7XG4gIHZhciB0YWJsZTtcbiAgdmFyIGk7XG4gIGJyLnJlYWRNb3JlSW5wdXQoKTtcbiAgdmFyIG51bV9odHJlZXMgPSBvdXQubnVtX2h0cmVlcyA9IERlY29kZVZhckxlblVpbnQ4KGJyKSArIDE7XG4gIHZhciBjb250ZXh0X21hcCA9IG91dC5jb250ZXh0X21hcCA9IG5ldyBVaW50OEFycmF5KGNvbnRleHRfbWFwX3NpemUpO1xuXG4gIGlmIChudW1faHRyZWVzIDw9IDEpIHtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgdXNlX3JsZV9mb3JfemVyb3MgPSBici5yZWFkQml0cygxKTtcblxuICBpZiAodXNlX3JsZV9mb3JfemVyb3MpIHtcbiAgICBtYXhfcnVuX2xlbmd0aF9wcmVmaXggPSBici5yZWFkQml0cyg0KSArIDE7XG4gIH1cblxuICB0YWJsZSA9IFtdO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBIVUZGTUFOX01BWF9UQUJMRV9TSVpFOyBpKyspIHtcbiAgICB0YWJsZVtpXSA9IG5ldyBIdWZmbWFuQ29kZSQxKDAsIDApO1xuICB9XG5cbiAgUmVhZEh1ZmZtYW5Db2RlKG51bV9odHJlZXMgKyBtYXhfcnVuX2xlbmd0aF9wcmVmaXgsIHRhYmxlLCAwLCBicik7XG5cbiAgZm9yIChpID0gMDsgaSA8IGNvbnRleHRfbWFwX3NpemU7KSB7XG4gICAgdmFyIGNvZGU7XG4gICAgYnIucmVhZE1vcmVJbnB1dCgpO1xuICAgIGNvZGUgPSBSZWFkU3ltYm9sKHRhYmxlLCAwLCBicik7XG5cbiAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgY29udGV4dF9tYXBbaV0gPSAwO1xuICAgICAgKytpO1xuICAgIH0gZWxzZSBpZiAoY29kZSA8PSBtYXhfcnVuX2xlbmd0aF9wcmVmaXgpIHtcbiAgICAgIHZhciByZXBzID0gMSArICgxIDw8IGNvZGUpICsgYnIucmVhZEJpdHMoY29kZSk7XG5cbiAgICAgIHdoaWxlICgtLXJlcHMpIHtcbiAgICAgICAgaWYgKGkgPj0gY29udGV4dF9tYXBfc2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIltEZWNvZGVDb250ZXh0TWFwXSBpID49IGNvbnRleHRfbWFwX3NpemVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0X21hcFtpXSA9IDA7XG4gICAgICAgICsraTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dF9tYXBbaV0gPSBjb2RlIC0gbWF4X3J1bl9sZW5ndGhfcHJlZml4O1xuICAgICAgKytpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChici5yZWFkQml0cygxKSkge1xuICAgIEludmVyc2VNb3ZlVG9Gcm9udFRyYW5zZm9ybShjb250ZXh0X21hcCwgY29udGV4dF9tYXBfc2l6ZSk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBEZWNvZGVCbG9ja1R5cGUobWF4X2Jsb2NrX3R5cGUsIHRyZWVzLCB0cmVlX3R5cGUsIGJsb2NrX3R5cGVzLCByaW5nYnVmZmVycywgaW5kZXhlcywgYnIpIHtcbiAgdmFyIHJpbmdidWZmZXIgPSB0cmVlX3R5cGUgKiAyO1xuICB2YXIgaW5kZXggPSB0cmVlX3R5cGU7XG4gIHZhciB0eXBlX2NvZGUgPSBSZWFkU3ltYm9sKHRyZWVzLCB0cmVlX3R5cGUgKiBIVUZGTUFOX01BWF9UQUJMRV9TSVpFLCBicik7XG4gIHZhciBibG9ja190eXBlO1xuXG4gIGlmICh0eXBlX2NvZGUgPT09IDApIHtcbiAgICBibG9ja190eXBlID0gcmluZ2J1ZmZlcnNbcmluZ2J1ZmZlciArIChpbmRleGVzW2luZGV4XSAmIDEpXTtcbiAgfSBlbHNlIGlmICh0eXBlX2NvZGUgPT09IDEpIHtcbiAgICBibG9ja190eXBlID0gcmluZ2J1ZmZlcnNbcmluZ2J1ZmZlciArIChpbmRleGVzW2luZGV4XSAtIDEgJiAxKV0gKyAxO1xuICB9IGVsc2Uge1xuICAgIGJsb2NrX3R5cGUgPSB0eXBlX2NvZGUgLSAyO1xuICB9XG5cbiAgaWYgKGJsb2NrX3R5cGUgPj0gbWF4X2Jsb2NrX3R5cGUpIHtcbiAgICBibG9ja190eXBlIC09IG1heF9ibG9ja190eXBlO1xuICB9XG5cbiAgYmxvY2tfdHlwZXNbdHJlZV90eXBlXSA9IGJsb2NrX3R5cGU7XG4gIHJpbmdidWZmZXJzW3JpbmdidWZmZXIgKyAoaW5kZXhlc1tpbmRleF0gJiAxKV0gPSBibG9ja190eXBlO1xuICArK2luZGV4ZXNbaW5kZXhdO1xufVxuXG5mdW5jdGlvbiBDb3B5VW5jb21wcmVzc2VkQmxvY2tUb091dHB1dChvdXRwdXQsIGxlbiwgcG9zLCByaW5nYnVmZmVyLCByaW5nYnVmZmVyX21hc2ssIGJyKSB7XG4gIHZhciByYl9zaXplID0gcmluZ2J1ZmZlcl9tYXNrICsgMTtcbiAgdmFyIHJiX3BvcyA9IHBvcyAmIHJpbmdidWZmZXJfbWFzaztcbiAgdmFyIGJyX3BvcyA9IGJyLnBvc18gJiBiaXRfcmVhZGVyLklCVUZfTUFTSztcbiAgdmFyIG5ieXRlcztcbiAgLyogRm9yIHNob3J0IGxlbmd0aHMgY29weSBieXRlLWJ5LWJ5dGUgKi9cblxuICBpZiAobGVuIDwgOCB8fCBici5iaXRfcG9zXyArIChsZW4gPDwgMykgPCBici5iaXRfZW5kX3Bvc18pIHtcbiAgICB3aGlsZSAobGVuLS0gPiAwKSB7XG4gICAgICBici5yZWFkTW9yZUlucHV0KCk7XG4gICAgICByaW5nYnVmZmVyW3JiX3BvcysrXSA9IGJyLnJlYWRCaXRzKDgpO1xuXG4gICAgICBpZiAocmJfcG9zID09PSByYl9zaXplKSB7XG4gICAgICAgIG91dHB1dC53cml0ZShyaW5nYnVmZmVyLCByYl9zaXplKTtcbiAgICAgICAgcmJfcG9zID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYnIuYml0X2VuZF9wb3NfIDwgMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1tDb3B5VW5jb21wcmVzc2VkQmxvY2tUb091dHB1dF0gYnIuYml0X2VuZF9wb3NfIDwgMzInKTtcbiAgfVxuICAvKiBDb3B5IHJlbWFpbmluZyAwLTQgYnl0ZXMgZnJvbSBici52YWxfIHRvIHJpbmdidWZmZXIuICovXG5cblxuICB3aGlsZSAoYnIuYml0X3Bvc18gPCAzMikge1xuICAgIHJpbmdidWZmZXJbcmJfcG9zXSA9IGJyLnZhbF8gPj4+IGJyLmJpdF9wb3NfO1xuICAgIGJyLmJpdF9wb3NfICs9IDg7XG4gICAgKytyYl9wb3M7XG4gICAgLS1sZW47XG4gIH1cbiAgLyogQ29weSByZW1haW5pbmcgYnl0ZXMgZnJvbSBici5idWZfIHRvIHJpbmdidWZmZXIuICovXG5cblxuICBuYnl0ZXMgPSBici5iaXRfZW5kX3Bvc18gLSBici5iaXRfcG9zXyA+PiAzO1xuXG4gIGlmIChicl9wb3MgKyBuYnl0ZXMgPiBiaXRfcmVhZGVyLklCVUZfTUFTSykge1xuICAgIHZhciB0YWlsID0gYml0X3JlYWRlci5JQlVGX01BU0sgKyAxIC0gYnJfcG9zO1xuXG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCB0YWlsOyB4KyspIHtcbiAgICAgIHJpbmdidWZmZXJbcmJfcG9zICsgeF0gPSBici5idWZfW2JyX3BvcyArIHhdO1xuICAgIH1cblxuICAgIG5ieXRlcyAtPSB0YWlsO1xuICAgIHJiX3BvcyArPSB0YWlsO1xuICAgIGxlbiAtPSB0YWlsO1xuICAgIGJyX3BvcyA9IDA7XG4gIH1cblxuICBmb3IgKHZhciB4ID0gMDsgeCA8IG5ieXRlczsgeCsrKSB7XG4gICAgcmluZ2J1ZmZlcltyYl9wb3MgKyB4XSA9IGJyLmJ1Zl9bYnJfcG9zICsgeF07XG4gIH1cblxuICByYl9wb3MgKz0gbmJ5dGVzO1xuICBsZW4gLT0gbmJ5dGVzO1xuICAvKiBJZiB3ZSB3cm90ZSBwYXN0IHRoZSBsb2dpY2FsIGVuZCBvZiB0aGUgcmluZ2J1ZmZlciwgY29weSB0aGUgdGFpbCBvZiB0aGVcbiAgICAgcmluZ2J1ZmZlciB0byBpdHMgYmVnaW5uaW5nIGFuZCBmbHVzaCB0aGUgcmluZ2J1ZmZlciB0byB0aGUgb3V0cHV0LiAqL1xuXG4gIGlmIChyYl9wb3MgPj0gcmJfc2l6ZSkge1xuICAgIG91dHB1dC53cml0ZShyaW5nYnVmZmVyLCByYl9zaXplKTtcbiAgICByYl9wb3MgLT0gcmJfc2l6ZTtcblxuICAgIGZvciAodmFyIHggPSAwOyB4IDwgcmJfcG9zOyB4KyspIHtcbiAgICAgIHJpbmdidWZmZXJbeF0gPSByaW5nYnVmZmVyW3JiX3NpemUgKyB4XTtcbiAgICB9XG4gIH1cbiAgLyogSWYgd2UgaGF2ZSBtb3JlIHRvIGNvcHkgdGhhbiB0aGUgcmVtYWluaW5nIHNpemUgb2YgdGhlIHJpbmdidWZmZXIsIHRoZW4gd2VcbiAgICAgZmlyc3QgZmlsbCB0aGUgcmluZ2J1ZmZlciBmcm9tIHRoZSBpbnB1dCBhbmQgdGhlbiBmbHVzaCB0aGUgcmluZ2J1ZmZlciB0b1xuICAgICB0aGUgb3V0cHV0ICovXG5cblxuICB3aGlsZSAocmJfcG9zICsgbGVuID49IHJiX3NpemUpIHtcbiAgICBuYnl0ZXMgPSByYl9zaXplIC0gcmJfcG9zO1xuXG4gICAgaWYgKGJyLmlucHV0Xy5yZWFkKHJpbmdidWZmZXIsIHJiX3BvcywgbmJ5dGVzKSA8IG5ieXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbQ29weVVuY29tcHJlc3NlZEJsb2NrVG9PdXRwdXRdIG5vdCBlbm91Z2ggYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBvdXRwdXQud3JpdGUocmluZ2J1ZmZlciwgcmJfc2l6ZSk7XG4gICAgbGVuIC09IG5ieXRlcztcbiAgICByYl9wb3MgPSAwO1xuICB9XG4gIC8qIENvcHkgc3RyYWlnaHQgZnJvbSB0aGUgaW5wdXQgb250byB0aGUgcmluZ2J1ZmZlci4gVGhlIHJpbmdidWZmZXIgd2lsbCBiZVxuICAgICBmbHVzaGVkIHRvIHRoZSBvdXRwdXQgYXQgYSBsYXRlciB0aW1lLiAqL1xuXG5cbiAgaWYgKGJyLmlucHV0Xy5yZWFkKHJpbmdidWZmZXIsIHJiX3BvcywgbGVuKSA8IGxlbikge1xuICAgIHRocm93IG5ldyBFcnJvcignW0NvcHlVbmNvbXByZXNzZWRCbG9ja1RvT3V0cHV0XSBub3QgZW5vdWdoIGJ5dGVzJyk7XG4gIH1cbiAgLyogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGJpdCByZWFkZXIuICovXG5cblxuICBici5yZXNldCgpO1xufVxuLyogQWR2YW5jZXMgdGhlIGJpdCByZWFkZXIgcG9zaXRpb24gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeSBhbmQgdmVyaWZpZXNcbiAgIHRoYXQgYW55IHNraXBwZWQgYml0cyBhcmUgc2V0IHRvIHplcm8uICovXG5cblxuZnVuY3Rpb24gSnVtcFRvQnl0ZUJvdW5kYXJ5KGJyKSB7XG4gIHZhciBuZXdfYml0X3BvcyA9IGJyLmJpdF9wb3NfICsgNyAmIH43O1xuICB2YXIgcGFkX2JpdHMgPSBici5yZWFkQml0cyhuZXdfYml0X3BvcyAtIGJyLmJpdF9wb3NfKTtcbiAgcmV0dXJuIHBhZF9iaXRzID09IDA7XG59XG5cbmZ1bmN0aW9uIEJyb3RsaURlY29tcHJlc3NlZFNpemUoYnVmZmVyKSB7XG4gIHZhciBpbnB1dCA9IG5ldyBCcm90bGlJbnB1dCQxKGJ1ZmZlcik7XG4gIHZhciBiciA9IG5ldyBiaXRfcmVhZGVyKGlucHV0KTtcbiAgRGVjb2RlV2luZG93Qml0cyhicik7XG4gIHZhciBvdXQgPSBEZWNvZGVNZXRhQmxvY2tMZW5ndGgoYnIpO1xuICByZXR1cm4gb3V0Lm1ldGFfYmxvY2tfbGVuZ3RoO1xufVxuXG52YXIgQnJvdGxpRGVjb21wcmVzc2VkU2l6ZV8xID0gQnJvdGxpRGVjb21wcmVzc2VkU2l6ZTtcblxuZnVuY3Rpb24gQnJvdGxpRGVjb21wcmVzc0J1ZmZlcihidWZmZXIsIG91dHB1dF9zaXplKSB7XG4gIHZhciBpbnB1dCA9IG5ldyBCcm90bGlJbnB1dCQxKGJ1ZmZlcik7XG5cbiAgaWYgKG91dHB1dF9zaXplID09IG51bGwpIHtcbiAgICBvdXRwdXRfc2l6ZSA9IEJyb3RsaURlY29tcHJlc3NlZFNpemUoYnVmZmVyKTtcbiAgfVxuXG4gIHZhciBvdXRwdXRfYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkob3V0cHV0X3NpemUpO1xuICB2YXIgb3V0cHV0ID0gbmV3IEJyb3RsaU91dHB1dCQxKG91dHB1dF9idWZmZXIpO1xuICBCcm90bGlEZWNvbXByZXNzKGlucHV0LCBvdXRwdXQpO1xuXG4gIGlmIChvdXRwdXQucG9zIDwgb3V0cHV0LmJ1ZmZlci5sZW5ndGgpIHtcbiAgICBvdXRwdXQuYnVmZmVyID0gb3V0cHV0LmJ1ZmZlci5zdWJhcnJheSgwLCBvdXRwdXQucG9zKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQuYnVmZmVyO1xufVxuXG52YXIgQnJvdGxpRGVjb21wcmVzc0J1ZmZlcl8xID0gQnJvdGxpRGVjb21wcmVzc0J1ZmZlcjtcblxuZnVuY3Rpb24gQnJvdGxpRGVjb21wcmVzcyhpbnB1dCwgb3V0cHV0KSB7XG4gIHZhciBpO1xuICB2YXIgcG9zID0gMDtcbiAgdmFyIGlucHV0X2VuZCA9IDA7XG4gIHZhciB3aW5kb3dfYml0cyA9IDA7XG4gIHZhciBtYXhfYmFja3dhcmRfZGlzdGFuY2U7XG4gIHZhciBtYXhfZGlzdGFuY2UgPSAwO1xuICB2YXIgcmluZ2J1ZmZlcl9zaXplO1xuICB2YXIgcmluZ2J1ZmZlcl9tYXNrO1xuICB2YXIgcmluZ2J1ZmZlcjtcbiAgdmFyIHJpbmdidWZmZXJfZW5kO1xuICAvKiBUaGlzIHJpbmcgYnVmZmVyIGhvbGRzIGEgZmV3IHBhc3QgY29weSBkaXN0YW5jZXMgdGhhdCB3aWxsIGJlIHVzZWQgYnkgKi9cblxuICAvKiBzb21lIHNwZWNpYWwgZGlzdGFuY2UgY29kZXMuICovXG5cbiAgdmFyIGRpc3RfcmIgPSBbMTYsIDE1LCAxMSwgNF07XG4gIHZhciBkaXN0X3JiX2lkeCA9IDA7XG4gIC8qIFRoZSBwcmV2aW91cyAyIGJ5dGVzIHVzZWQgZm9yIGNvbnRleHQuICovXG5cbiAgdmFyIHByZXZfYnl0ZTEgPSAwO1xuICB2YXIgcHJldl9ieXRlMiA9IDA7XG4gIHZhciBoZ3JvdXAgPSBbbmV3IEh1ZmZtYW5UcmVlR3JvdXAoMCwgMCksIG5ldyBIdWZmbWFuVHJlZUdyb3VwKDAsIDApLCBuZXcgSHVmZm1hblRyZWVHcm91cCgwLCAwKV07XG4gIHZhciBibG9ja190eXBlX3RyZWVzO1xuICB2YXIgYmxvY2tfbGVuX3RyZWVzO1xuICB2YXIgYnI7XG4gIC8qIFdlIG5lZWQgdGhlIHNsYWNrIHJlZ2lvbiBmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zOlxuICAgICAgIC0gYWx3YXlzIGRvaW5nIHR3byA4LWJ5dGUgY29waWVzIGZvciBmYXN0IGJhY2t3YXJkIGNvcHlpbmdcbiAgICAgICAtIHRyYW5zZm9ybXNcbiAgICAgICAtIGZsdXNoaW5nIHRoZSBpbnB1dCByaW5nYnVmZmVyIHdoZW4gZGVjb2RpbmcgdW5jb21wcmVzc2VkIGJsb2NrcyAqL1xuXG4gIHZhciBrUmluZ0J1ZmZlcldyaXRlQWhlYWRTbGFjayA9IDEyOCArIGJpdF9yZWFkZXIuUkVBRF9TSVpFO1xuICBiciA9IG5ldyBiaXRfcmVhZGVyKGlucHV0KTtcbiAgLyogRGVjb2RlIHdpbmRvdyBzaXplLiAqL1xuXG4gIHdpbmRvd19iaXRzID0gRGVjb2RlV2luZG93Qml0cyhicik7XG4gIG1heF9iYWNrd2FyZF9kaXN0YW5jZSA9ICgxIDw8IHdpbmRvd19iaXRzKSAtIDE2O1xuICByaW5nYnVmZmVyX3NpemUgPSAxIDw8IHdpbmRvd19iaXRzO1xuICByaW5nYnVmZmVyX21hc2sgPSByaW5nYnVmZmVyX3NpemUgLSAxO1xuICByaW5nYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkocmluZ2J1ZmZlcl9zaXplICsga1JpbmdCdWZmZXJXcml0ZUFoZWFkU2xhY2sgKyBkaWN0aW9uYXJ5Lm1heERpY3Rpb25hcnlXb3JkTGVuZ3RoKTtcbiAgcmluZ2J1ZmZlcl9lbmQgPSByaW5nYnVmZmVyX3NpemU7XG4gIGJsb2NrX3R5cGVfdHJlZXMgPSBbXTtcbiAgYmxvY2tfbGVuX3RyZWVzID0gW107XG5cbiAgZm9yICh2YXIgeCA9IDA7IHggPCAzICogSFVGRk1BTl9NQVhfVEFCTEVfU0laRTsgeCsrKSB7XG4gICAgYmxvY2tfdHlwZV90cmVlc1t4XSA9IG5ldyBIdWZmbWFuQ29kZSQxKDAsIDApO1xuICAgIGJsb2NrX2xlbl90cmVlc1t4XSA9IG5ldyBIdWZmbWFuQ29kZSQxKDAsIDApO1xuICB9XG5cbiAgd2hpbGUgKCFpbnB1dF9lbmQpIHtcbiAgICB2YXIgbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuID0gMDtcbiAgICB2YXIgaXNfdW5jb21wcmVzc2VkO1xuICAgIHZhciBibG9ja19sZW5ndGggPSBbMSA8PCAyOCwgMSA8PCAyOCwgMSA8PCAyOF07XG4gICAgdmFyIGJsb2NrX3R5cGUgPSBbMF07XG4gICAgdmFyIG51bV9ibG9ja190eXBlcyA9IFsxLCAxLCAxXTtcbiAgICB2YXIgYmxvY2tfdHlwZV9yYiA9IFswLCAxLCAwLCAxLCAwLCAxXTtcbiAgICB2YXIgYmxvY2tfdHlwZV9yYl9pbmRleCA9IFswXTtcbiAgICB2YXIgZGlzdGFuY2VfcG9zdGZpeF9iaXRzO1xuICAgIHZhciBudW1fZGlyZWN0X2Rpc3RhbmNlX2NvZGVzO1xuICAgIHZhciBkaXN0YW5jZV9wb3N0Zml4X21hc2s7XG4gICAgdmFyIG51bV9kaXN0YW5jZV9jb2RlcztcbiAgICB2YXIgY29udGV4dF9tYXAgPSBudWxsO1xuICAgIHZhciBjb250ZXh0X21vZGVzID0gbnVsbDtcbiAgICB2YXIgbnVtX2xpdGVyYWxfaHRyZWVzO1xuICAgIHZhciBkaXN0X2NvbnRleHRfbWFwID0gbnVsbDtcbiAgICB2YXIgbnVtX2Rpc3RfaHRyZWVzO1xuICAgIHZhciBjb250ZXh0X29mZnNldCA9IDA7XG4gICAgdmFyIGNvbnRleHRfbWFwX3NsaWNlID0gbnVsbDtcbiAgICB2YXIgbGl0ZXJhbF9odHJlZV9pbmRleCA9IDA7XG4gICAgdmFyIGRpc3RfY29udGV4dF9vZmZzZXQgPSAwO1xuICAgIHZhciBkaXN0X2NvbnRleHRfbWFwX3NsaWNlID0gbnVsbDtcbiAgICB2YXIgZGlzdF9odHJlZV9pbmRleCA9IDA7XG4gICAgdmFyIGNvbnRleHRfbG9va3VwX29mZnNldDEgPSAwO1xuICAgIHZhciBjb250ZXh0X2xvb2t1cF9vZmZzZXQyID0gMDtcbiAgICB2YXIgY29udGV4dF9tb2RlO1xuICAgIHZhciBodHJlZV9jb21tYW5kO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkge1xuICAgICAgaGdyb3VwW2ldLmNvZGVzID0gbnVsbDtcbiAgICAgIGhncm91cFtpXS5odHJlZXMgPSBudWxsO1xuICAgIH1cblxuICAgIGJyLnJlYWRNb3JlSW5wdXQoKTtcblxuICAgIHZhciBfb3V0ID0gRGVjb2RlTWV0YUJsb2NrTGVuZ3RoKGJyKTtcblxuICAgIG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbiA9IF9vdXQubWV0YV9ibG9ja19sZW5ndGg7XG5cbiAgICBpZiAocG9zICsgbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuID4gb3V0cHV0LmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgIC8qIFdlIG5lZWQgdG8gZ3JvdyB0aGUgb3V0cHV0IGJ1ZmZlciB0byBmaXQgdGhlIGFkZGl0aW9uYWwgZGF0YS4gKi9cbiAgICAgIHZhciB0bXAgPSBuZXcgVWludDhBcnJheShwb3MgKyBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4pO1xuICAgICAgdG1wLnNldChvdXRwdXQuYnVmZmVyKTtcbiAgICAgIG91dHB1dC5idWZmZXIgPSB0bXA7XG4gICAgfVxuXG4gICAgaW5wdXRfZW5kID0gX291dC5pbnB1dF9lbmQ7XG4gICAgaXNfdW5jb21wcmVzc2VkID0gX291dC5pc191bmNvbXByZXNzZWQ7XG5cbiAgICBpZiAoX291dC5pc19tZXRhZGF0YSkge1xuICAgICAgSnVtcFRvQnl0ZUJvdW5kYXJ5KGJyKTtcblxuICAgICAgZm9yICg7IG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbiA+IDA7IC0tbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuKSB7XG4gICAgICAgIGJyLnJlYWRNb3JlSW5wdXQoKTtcbiAgICAgICAgLyogUmVhZCBvbmUgYnl0ZSBhbmQgaWdub3JlIGl0LiAqL1xuXG4gICAgICAgIGJyLnJlYWRCaXRzKDgpO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobWV0YV9ibG9ja19yZW1haW5pbmdfbGVuID09PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNfdW5jb21wcmVzc2VkKSB7XG4gICAgICBici5iaXRfcG9zXyA9IGJyLmJpdF9wb3NfICsgNyAmIH43O1xuICAgICAgQ29weVVuY29tcHJlc3NlZEJsb2NrVG9PdXRwdXQob3V0cHV0LCBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4sIHBvcywgcmluZ2J1ZmZlciwgcmluZ2J1ZmZlcl9tYXNrLCBicik7XG4gICAgICBwb3MgKz0gbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkge1xuICAgICAgbnVtX2Jsb2NrX3R5cGVzW2ldID0gRGVjb2RlVmFyTGVuVWludDgoYnIpICsgMTtcblxuICAgICAgaWYgKG51bV9ibG9ja190eXBlc1tpXSA+PSAyKSB7XG4gICAgICAgIFJlYWRIdWZmbWFuQ29kZShudW1fYmxvY2tfdHlwZXNbaV0gKyAyLCBibG9ja190eXBlX3RyZWVzLCBpICogSFVGRk1BTl9NQVhfVEFCTEVfU0laRSwgYnIpO1xuICAgICAgICBSZWFkSHVmZm1hbkNvZGUoa051bUJsb2NrTGVuZ3RoQ29kZXMsIGJsb2NrX2xlbl90cmVlcywgaSAqIEhVRkZNQU5fTUFYX1RBQkxFX1NJWkUsIGJyKTtcbiAgICAgICAgYmxvY2tfbGVuZ3RoW2ldID0gUmVhZEJsb2NrTGVuZ3RoKGJsb2NrX2xlbl90cmVlcywgaSAqIEhVRkZNQU5fTUFYX1RBQkxFX1NJWkUsIGJyKTtcbiAgICAgICAgYmxvY2tfdHlwZV9yYl9pbmRleFtpXSA9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYnIucmVhZE1vcmVJbnB1dCgpO1xuICAgIGRpc3RhbmNlX3Bvc3RmaXhfYml0cyA9IGJyLnJlYWRCaXRzKDIpO1xuICAgIG51bV9kaXJlY3RfZGlzdGFuY2VfY29kZXMgPSBOVU1fRElTVEFOQ0VfU0hPUlRfQ09ERVMgKyAoYnIucmVhZEJpdHMoNCkgPDwgZGlzdGFuY2VfcG9zdGZpeF9iaXRzKTtcbiAgICBkaXN0YW5jZV9wb3N0Zml4X21hc2sgPSAoMSA8PCBkaXN0YW5jZV9wb3N0Zml4X2JpdHMpIC0gMTtcbiAgICBudW1fZGlzdGFuY2VfY29kZXMgPSBudW1fZGlyZWN0X2Rpc3RhbmNlX2NvZGVzICsgKDQ4IDw8IGRpc3RhbmNlX3Bvc3RmaXhfYml0cyk7XG4gICAgY29udGV4dF9tb2RlcyA9IG5ldyBVaW50OEFycmF5KG51bV9ibG9ja190eXBlc1swXSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrX3R5cGVzWzBdOyArK2kpIHtcbiAgICAgIGJyLnJlYWRNb3JlSW5wdXQoKTtcbiAgICAgIGNvbnRleHRfbW9kZXNbaV0gPSBici5yZWFkQml0cygyKSA8PCAxO1xuICAgIH1cblxuICAgIHZhciBfbzEgPSBEZWNvZGVDb250ZXh0TWFwKG51bV9ibG9ja190eXBlc1swXSA8PCBrTGl0ZXJhbENvbnRleHRCaXRzLCBicik7XG5cbiAgICBudW1fbGl0ZXJhbF9odHJlZXMgPSBfbzEubnVtX2h0cmVlcztcbiAgICBjb250ZXh0X21hcCA9IF9vMS5jb250ZXh0X21hcDtcblxuICAgIHZhciBfbzIgPSBEZWNvZGVDb250ZXh0TWFwKG51bV9ibG9ja190eXBlc1syXSA8PCBrRGlzdGFuY2VDb250ZXh0Qml0cywgYnIpO1xuXG4gICAgbnVtX2Rpc3RfaHRyZWVzID0gX28yLm51bV9odHJlZXM7XG4gICAgZGlzdF9jb250ZXh0X21hcCA9IF9vMi5jb250ZXh0X21hcDtcbiAgICBoZ3JvdXBbMF0gPSBuZXcgSHVmZm1hblRyZWVHcm91cChrTnVtTGl0ZXJhbENvZGVzLCBudW1fbGl0ZXJhbF9odHJlZXMpO1xuICAgIGhncm91cFsxXSA9IG5ldyBIdWZmbWFuVHJlZUdyb3VwKGtOdW1JbnNlcnRBbmRDb3B5Q29kZXMsIG51bV9ibG9ja190eXBlc1sxXSk7XG4gICAgaGdyb3VwWzJdID0gbmV3IEh1ZmZtYW5UcmVlR3JvdXAobnVtX2Rpc3RhbmNlX2NvZGVzLCBudW1fZGlzdF9odHJlZXMpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkge1xuICAgICAgaGdyb3VwW2ldLmRlY29kZShicik7XG4gICAgfVxuXG4gICAgY29udGV4dF9tYXBfc2xpY2UgPSAwO1xuICAgIGRpc3RfY29udGV4dF9tYXBfc2xpY2UgPSAwO1xuICAgIGNvbnRleHRfbW9kZSA9IGNvbnRleHRfbW9kZXNbYmxvY2tfdHlwZVswXV07XG4gICAgY29udGV4dF9sb29rdXBfb2Zmc2V0MSA9IGNvbnRleHQubG9va3VwT2Zmc2V0c1tjb250ZXh0X21vZGVdO1xuICAgIGNvbnRleHRfbG9va3VwX29mZnNldDIgPSBjb250ZXh0Lmxvb2t1cE9mZnNldHNbY29udGV4dF9tb2RlICsgMV07XG4gICAgaHRyZWVfY29tbWFuZCA9IGhncm91cFsxXS5odHJlZXNbMF07XG5cbiAgICB3aGlsZSAobWV0YV9ibG9ja19yZW1haW5pbmdfbGVuID4gMCkge1xuICAgICAgdmFyIGNtZF9jb2RlO1xuICAgICAgdmFyIHJhbmdlX2lkeDtcbiAgICAgIHZhciBpbnNlcnRfY29kZTtcbiAgICAgIHZhciBjb3B5X2NvZGU7XG4gICAgICB2YXIgaW5zZXJ0X2xlbmd0aDtcbiAgICAgIHZhciBjb3B5X2xlbmd0aDtcbiAgICAgIHZhciBkaXN0YW5jZV9jb2RlO1xuICAgICAgdmFyIGRpc3RhbmNlO1xuICAgICAgdmFyIGNvbnRleHQkMTtcbiAgICAgIHZhciBqO1xuICAgICAgdmFyIGNvcHlfZHN0O1xuICAgICAgYnIucmVhZE1vcmVJbnB1dCgpO1xuXG4gICAgICBpZiAoYmxvY2tfbGVuZ3RoWzFdID09PSAwKSB7XG4gICAgICAgIERlY29kZUJsb2NrVHlwZShudW1fYmxvY2tfdHlwZXNbMV0sIGJsb2NrX3R5cGVfdHJlZXMsIDEsIGJsb2NrX3R5cGUsIGJsb2NrX3R5cGVfcmIsIGJsb2NrX3R5cGVfcmJfaW5kZXgsIGJyKTtcbiAgICAgICAgYmxvY2tfbGVuZ3RoWzFdID0gUmVhZEJsb2NrTGVuZ3RoKGJsb2NrX2xlbl90cmVlcywgSFVGRk1BTl9NQVhfVEFCTEVfU0laRSwgYnIpO1xuICAgICAgICBodHJlZV9jb21tYW5kID0gaGdyb3VwWzFdLmh0cmVlc1tibG9ja190eXBlWzFdXTtcbiAgICAgIH1cblxuICAgICAgLS1ibG9ja19sZW5ndGhbMV07XG4gICAgICBjbWRfY29kZSA9IFJlYWRTeW1ib2woaGdyb3VwWzFdLmNvZGVzLCBodHJlZV9jb21tYW5kLCBicik7XG4gICAgICByYW5nZV9pZHggPSBjbWRfY29kZSA+PiA2O1xuXG4gICAgICBpZiAocmFuZ2VfaWR4ID49IDIpIHtcbiAgICAgICAgcmFuZ2VfaWR4IC09IDI7XG4gICAgICAgIGRpc3RhbmNlX2NvZGUgPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3RhbmNlX2NvZGUgPSAwO1xuICAgICAgfVxuXG4gICAgICBpbnNlcnRfY29kZSA9IHByZWZpeC5rSW5zZXJ0UmFuZ2VMdXRbcmFuZ2VfaWR4XSArIChjbWRfY29kZSA+PiAzICYgNyk7XG4gICAgICBjb3B5X2NvZGUgPSBwcmVmaXgua0NvcHlSYW5nZUx1dFtyYW5nZV9pZHhdICsgKGNtZF9jb2RlICYgNyk7XG4gICAgICBpbnNlcnRfbGVuZ3RoID0gcHJlZml4LmtJbnNlcnRMZW5ndGhQcmVmaXhDb2RlW2luc2VydF9jb2RlXS5vZmZzZXQgKyBici5yZWFkQml0cyhwcmVmaXgua0luc2VydExlbmd0aFByZWZpeENvZGVbaW5zZXJ0X2NvZGVdLm5iaXRzKTtcbiAgICAgIGNvcHlfbGVuZ3RoID0gcHJlZml4LmtDb3B5TGVuZ3RoUHJlZml4Q29kZVtjb3B5X2NvZGVdLm9mZnNldCArIGJyLnJlYWRCaXRzKHByZWZpeC5rQ29weUxlbmd0aFByZWZpeENvZGVbY29weV9jb2RlXS5uYml0cyk7XG4gICAgICBwcmV2X2J5dGUxID0gcmluZ2J1ZmZlcltwb3MgLSAxICYgcmluZ2J1ZmZlcl9tYXNrXTtcbiAgICAgIHByZXZfYnl0ZTIgPSByaW5nYnVmZmVyW3BvcyAtIDIgJiByaW5nYnVmZmVyX21hc2tdO1xuXG4gICAgICBmb3IgKGogPSAwOyBqIDwgaW5zZXJ0X2xlbmd0aDsgKytqKSB7XG4gICAgICAgIGJyLnJlYWRNb3JlSW5wdXQoKTtcblxuICAgICAgICBpZiAoYmxvY2tfbGVuZ3RoWzBdID09PSAwKSB7XG4gICAgICAgICAgRGVjb2RlQmxvY2tUeXBlKG51bV9ibG9ja190eXBlc1swXSwgYmxvY2tfdHlwZV90cmVlcywgMCwgYmxvY2tfdHlwZSwgYmxvY2tfdHlwZV9yYiwgYmxvY2tfdHlwZV9yYl9pbmRleCwgYnIpO1xuICAgICAgICAgIGJsb2NrX2xlbmd0aFswXSA9IFJlYWRCbG9ja0xlbmd0aChibG9ja19sZW5fdHJlZXMsIDAsIGJyKTtcbiAgICAgICAgICBjb250ZXh0X29mZnNldCA9IGJsb2NrX3R5cGVbMF0gPDwga0xpdGVyYWxDb250ZXh0Qml0cztcbiAgICAgICAgICBjb250ZXh0X21hcF9zbGljZSA9IGNvbnRleHRfb2Zmc2V0O1xuICAgICAgICAgIGNvbnRleHRfbW9kZSA9IGNvbnRleHRfbW9kZXNbYmxvY2tfdHlwZVswXV07XG4gICAgICAgICAgY29udGV4dF9sb29rdXBfb2Zmc2V0MSA9IGNvbnRleHQubG9va3VwT2Zmc2V0c1tjb250ZXh0X21vZGVdO1xuICAgICAgICAgIGNvbnRleHRfbG9va3VwX29mZnNldDIgPSBjb250ZXh0Lmxvb2t1cE9mZnNldHNbY29udGV4dF9tb2RlICsgMV07XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0JDEgPSBjb250ZXh0Lmxvb2t1cFtjb250ZXh0X2xvb2t1cF9vZmZzZXQxICsgcHJldl9ieXRlMV0gfCBjb250ZXh0Lmxvb2t1cFtjb250ZXh0X2xvb2t1cF9vZmZzZXQyICsgcHJldl9ieXRlMl07XG4gICAgICAgIGxpdGVyYWxfaHRyZWVfaW5kZXggPSBjb250ZXh0X21hcFtjb250ZXh0X21hcF9zbGljZSArIGNvbnRleHQkMV07XG4gICAgICAgIC0tYmxvY2tfbGVuZ3RoWzBdO1xuICAgICAgICBwcmV2X2J5dGUyID0gcHJldl9ieXRlMTtcbiAgICAgICAgcHJldl9ieXRlMSA9IFJlYWRTeW1ib2woaGdyb3VwWzBdLmNvZGVzLCBoZ3JvdXBbMF0uaHRyZWVzW2xpdGVyYWxfaHRyZWVfaW5kZXhdLCBicik7XG4gICAgICAgIHJpbmdidWZmZXJbcG9zICYgcmluZ2J1ZmZlcl9tYXNrXSA9IHByZXZfYnl0ZTE7XG5cbiAgICAgICAgaWYgKChwb3MgJiByaW5nYnVmZmVyX21hc2spID09PSByaW5nYnVmZmVyX21hc2spIHtcbiAgICAgICAgICBvdXRwdXQud3JpdGUocmluZ2J1ZmZlciwgcmluZ2J1ZmZlcl9zaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgICsrcG9zO1xuICAgICAgfVxuXG4gICAgICBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4gLT0gaW5zZXJ0X2xlbmd0aDtcbiAgICAgIGlmIChtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4gPD0gMCkgYnJlYWs7XG5cbiAgICAgIGlmIChkaXN0YW5jZV9jb2RlIDwgMCkge1xuICAgICAgICB2YXIgY29udGV4dCQxO1xuICAgICAgICBici5yZWFkTW9yZUlucHV0KCk7XG5cbiAgICAgICAgaWYgKGJsb2NrX2xlbmd0aFsyXSA9PT0gMCkge1xuICAgICAgICAgIERlY29kZUJsb2NrVHlwZShudW1fYmxvY2tfdHlwZXNbMl0sIGJsb2NrX3R5cGVfdHJlZXMsIDIsIGJsb2NrX3R5cGUsIGJsb2NrX3R5cGVfcmIsIGJsb2NrX3R5cGVfcmJfaW5kZXgsIGJyKTtcbiAgICAgICAgICBibG9ja19sZW5ndGhbMl0gPSBSZWFkQmxvY2tMZW5ndGgoYmxvY2tfbGVuX3RyZWVzLCAyICogSFVGRk1BTl9NQVhfVEFCTEVfU0laRSwgYnIpO1xuICAgICAgICAgIGRpc3RfY29udGV4dF9vZmZzZXQgPSBibG9ja190eXBlWzJdIDw8IGtEaXN0YW5jZUNvbnRleHRCaXRzO1xuICAgICAgICAgIGRpc3RfY29udGV4dF9tYXBfc2xpY2UgPSBkaXN0X2NvbnRleHRfb2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgLS1ibG9ja19sZW5ndGhbMl07XG4gICAgICAgIGNvbnRleHQkMSA9IChjb3B5X2xlbmd0aCA+IDQgPyAzIDogY29weV9sZW5ndGggLSAyKSAmIDB4ZmY7XG4gICAgICAgIGRpc3RfaHRyZWVfaW5kZXggPSBkaXN0X2NvbnRleHRfbWFwW2Rpc3RfY29udGV4dF9tYXBfc2xpY2UgKyBjb250ZXh0JDFdO1xuICAgICAgICBkaXN0YW5jZV9jb2RlID0gUmVhZFN5bWJvbChoZ3JvdXBbMl0uY29kZXMsIGhncm91cFsyXS5odHJlZXNbZGlzdF9odHJlZV9pbmRleF0sIGJyKTtcblxuICAgICAgICBpZiAoZGlzdGFuY2VfY29kZSA+PSBudW1fZGlyZWN0X2Rpc3RhbmNlX2NvZGVzKSB7XG4gICAgICAgICAgdmFyIG5iaXRzO1xuICAgICAgICAgIHZhciBwb3N0Zml4O1xuICAgICAgICAgIHZhciBvZmZzZXQ7XG4gICAgICAgICAgZGlzdGFuY2VfY29kZSAtPSBudW1fZGlyZWN0X2Rpc3RhbmNlX2NvZGVzO1xuICAgICAgICAgIHBvc3RmaXggPSBkaXN0YW5jZV9jb2RlICYgZGlzdGFuY2VfcG9zdGZpeF9tYXNrO1xuICAgICAgICAgIGRpc3RhbmNlX2NvZGUgPj49IGRpc3RhbmNlX3Bvc3RmaXhfYml0cztcbiAgICAgICAgICBuYml0cyA9IChkaXN0YW5jZV9jb2RlID4+IDEpICsgMTtcbiAgICAgICAgICBvZmZzZXQgPSAoMiArIChkaXN0YW5jZV9jb2RlICYgMSkgPDwgbmJpdHMpIC0gNDtcbiAgICAgICAgICBkaXN0YW5jZV9jb2RlID0gbnVtX2RpcmVjdF9kaXN0YW5jZV9jb2RlcyArIChvZmZzZXQgKyBici5yZWFkQml0cyhuYml0cykgPDwgZGlzdGFuY2VfcG9zdGZpeF9iaXRzKSArIHBvc3RmaXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIENvbnZlcnQgdGhlIGRpc3RhbmNlIGNvZGUgdG8gdGhlIGFjdHVhbCBkaXN0YW5jZSBieSBwb3NzaWJseSBsb29raW5nICovXG5cbiAgICAgIC8qIHVwIHBhc3QgZGlzdG5hY2VzIGZyb20gdGhlIHJpbmdidWZmZXIuICovXG5cblxuICAgICAgZGlzdGFuY2UgPSBUcmFuc2xhdGVTaG9ydENvZGVzKGRpc3RhbmNlX2NvZGUsIGRpc3RfcmIsIGRpc3RfcmJfaWR4KTtcblxuICAgICAgaWYgKGRpc3RhbmNlIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tCcm90bGlEZWNvbXByZXNzXSBpbnZhbGlkIGRpc3RhbmNlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwb3MgPCBtYXhfYmFja3dhcmRfZGlzdGFuY2UgJiYgbWF4X2Rpc3RhbmNlICE9PSBtYXhfYmFja3dhcmRfZGlzdGFuY2UpIHtcbiAgICAgICAgbWF4X2Rpc3RhbmNlID0gcG9zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF4X2Rpc3RhbmNlID0gbWF4X2JhY2t3YXJkX2Rpc3RhbmNlO1xuICAgICAgfVxuXG4gICAgICBjb3B5X2RzdCA9IHBvcyAmIHJpbmdidWZmZXJfbWFzaztcblxuICAgICAgaWYgKGRpc3RhbmNlID4gbWF4X2Rpc3RhbmNlKSB7XG4gICAgICAgIGlmIChjb3B5X2xlbmd0aCA+PSBkaWN0aW9uYXJ5Lm1pbkRpY3Rpb25hcnlXb3JkTGVuZ3RoICYmIGNvcHlfbGVuZ3RoIDw9IGRpY3Rpb25hcnkubWF4RGljdGlvbmFyeVdvcmRMZW5ndGgpIHtcbiAgICAgICAgICB2YXIgb2Zmc2V0ID0gZGljdGlvbmFyeS5vZmZzZXRzQnlMZW5ndGhbY29weV9sZW5ndGhdO1xuICAgICAgICAgIHZhciB3b3JkX2lkID0gZGlzdGFuY2UgLSBtYXhfZGlzdGFuY2UgLSAxO1xuICAgICAgICAgIHZhciBzaGlmdCA9IGRpY3Rpb25hcnkuc2l6ZUJpdHNCeUxlbmd0aFtjb3B5X2xlbmd0aF07XG4gICAgICAgICAgdmFyIG1hc2sgPSAoMSA8PCBzaGlmdCkgLSAxO1xuICAgICAgICAgIHZhciB3b3JkX2lkeCA9IHdvcmRfaWQgJiBtYXNrO1xuICAgICAgICAgIHZhciB0cmFuc2Zvcm1faWR4ID0gd29yZF9pZCA+PiBzaGlmdDtcbiAgICAgICAgICBvZmZzZXQgKz0gd29yZF9pZHggKiBjb3B5X2xlbmd0aDtcblxuICAgICAgICAgIGlmICh0cmFuc2Zvcm1faWR4IDwgdHJhbnNmb3JtLmtOdW1UcmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICB2YXIgbGVuID0gdHJhbnNmb3JtLnRyYW5zZm9ybURpY3Rpb25hcnlXb3JkKHJpbmdidWZmZXIsIGNvcHlfZHN0LCBvZmZzZXQsIGNvcHlfbGVuZ3RoLCB0cmFuc2Zvcm1faWR4KTtcbiAgICAgICAgICAgIGNvcHlfZHN0ICs9IGxlbjtcbiAgICAgICAgICAgIHBvcyArPSBsZW47XG4gICAgICAgICAgICBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4gLT0gbGVuO1xuXG4gICAgICAgICAgICBpZiAoY29weV9kc3QgPj0gcmluZ2J1ZmZlcl9lbmQpIHtcbiAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKHJpbmdidWZmZXIsIHJpbmdidWZmZXJfc2l6ZSk7XG5cbiAgICAgICAgICAgICAgZm9yICh2YXIgX3ggPSAwOyBfeCA8IGNvcHlfZHN0IC0gcmluZ2J1ZmZlcl9lbmQ7IF94KyspIHtcbiAgICAgICAgICAgICAgICByaW5nYnVmZmVyW194XSA9IHJpbmdidWZmZXJbcmluZ2J1ZmZlcl9lbmQgKyBfeF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYWNrd2FyZCByZWZlcmVuY2UuIHBvczogXCIgKyBwb3MgKyBcIiBkaXN0YW5jZTogXCIgKyBkaXN0YW5jZSArIFwiIGxlbjogXCIgKyBjb3B5X2xlbmd0aCArIFwiIGJ5dGVzIGxlZnQ6IFwiICsgbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYWNrd2FyZCByZWZlcmVuY2UuIHBvczogXCIgKyBwb3MgKyBcIiBkaXN0YW5jZTogXCIgKyBkaXN0YW5jZSArIFwiIGxlbjogXCIgKyBjb3B5X2xlbmd0aCArIFwiIGJ5dGVzIGxlZnQ6IFwiICsgbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRpc3RhbmNlX2NvZGUgPiAwKSB7XG4gICAgICAgICAgZGlzdF9yYltkaXN0X3JiX2lkeCAmIDNdID0gZGlzdGFuY2U7XG4gICAgICAgICAgKytkaXN0X3JiX2lkeDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb3B5X2xlbmd0aCA+IG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmFja3dhcmQgcmVmZXJlbmNlLiBwb3M6IFwiICsgcG9zICsgXCIgZGlzdGFuY2U6IFwiICsgZGlzdGFuY2UgKyBcIiBsZW46IFwiICsgY29weV9sZW5ndGggKyBcIiBieXRlcyBsZWZ0OiBcIiArIG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29weV9sZW5ndGg7ICsraikge1xuICAgICAgICAgIHJpbmdidWZmZXJbcG9zICYgcmluZ2J1ZmZlcl9tYXNrXSA9IHJpbmdidWZmZXJbcG9zIC0gZGlzdGFuY2UgJiByaW5nYnVmZmVyX21hc2tdO1xuXG4gICAgICAgICAgaWYgKChwb3MgJiByaW5nYnVmZmVyX21hc2spID09PSByaW5nYnVmZmVyX21hc2spIHtcbiAgICAgICAgICAgIG91dHB1dC53cml0ZShyaW5nYnVmZmVyLCByaW5nYnVmZmVyX3NpemUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICsrcG9zO1xuICAgICAgICAgIC0tbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBXaGVuIHdlIGdldCBoZXJlLCB3ZSBtdXN0IGhhdmUgaW5zZXJ0ZWQgYXQgbGVhc3Qgb25lIGxpdGVyYWwgYW5kICovXG5cbiAgICAgIC8qIG1hZGUgYSBjb3B5IG9mIGF0IGxlYXN0IGxlbmd0aCB0d28sIHRoZXJlZm9yZSBhY2Nlc3NpbmcgdGhlIGxhc3QgMiAqL1xuXG4gICAgICAvKiBieXRlcyBpcyB2YWxpZC4gKi9cblxuXG4gICAgICBwcmV2X2J5dGUxID0gcmluZ2J1ZmZlcltwb3MgLSAxICYgcmluZ2J1ZmZlcl9tYXNrXTtcbiAgICAgIHByZXZfYnl0ZTIgPSByaW5nYnVmZmVyW3BvcyAtIDIgJiByaW5nYnVmZmVyX21hc2tdO1xuICAgIH1cbiAgICAvKiBQcm90ZWN0IHBvcyBmcm9tIG92ZXJmbG93LCB3cmFwIGl0IGFyb3VuZCBhdCBldmVyeSBHQiBvZiBpbnB1dCBkYXRhICovXG5cblxuICAgIHBvcyAmPSAweDNmZmZmZmZmO1xuICB9XG5cbiAgb3V0cHV0LndyaXRlKHJpbmdidWZmZXIsIHBvcyAmIHJpbmdidWZmZXJfbWFzayk7XG59XG5cbnZhciBCcm90bGlEZWNvbXByZXNzXzEgPSBCcm90bGlEZWNvbXByZXNzO1xuZGljdGlvbmFyeS5pbml0KEJyb3RsaURlY29tcHJlc3NCdWZmZXIpO1xudmFyIGRlY29kZSA9IHtcbiAgQnJvdGxpRGVjb21wcmVzc2VkU2l6ZTogQnJvdGxpRGVjb21wcmVzc2VkU2l6ZV8xLFxuICBCcm90bGlEZWNvbXByZXNzQnVmZmVyOiBCcm90bGlEZWNvbXByZXNzQnVmZmVyXzEsXG4gIEJyb3RsaURlY29tcHJlc3M6IEJyb3RsaURlY29tcHJlc3NfMVxufTtcblxudmFyIGRlY29tcHJlc3MgPSBkZWNvZGUuQnJvdGxpRGVjb21wcmVzc0J1ZmZlcjtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkZyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cbi8qKlxuICogUmVwcmVzZW50cyBhIFRydWVUeXBlIGdseXBoIGluIHRoZSBXT0ZGMiBmb3JtYXQsIHdoaWNoIGNvbXByZXNzZXMgZ2x5cGhzIGRpZmZlcmVudGx5LlxuICovXG5cbnZhciBXT0ZGMkdseXBoID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfVFRGR2x5cGgpIHtcbiAgX2luaGVyaXRzTG9vc2UkZyhXT0ZGMkdseXBoLCBfVFRGR2x5cGgpO1xuXG4gIGZ1bmN0aW9uIFdPRkYyR2x5cGgoKSB7XG4gICAgcmV0dXJuIF9UVEZHbHlwaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gV09GRjJHbHlwaC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9kZWNvZGUgPSBmdW5jdGlvbiBfZGVjb2RlKCkge1xuICAgIC8vIFdlIGhhdmUgdG8gZGVjb2RlIGluIGFkdmFuY2UgKGluIFdPRkYyRm9udCksIHNvIGp1c3QgcmV0dXJuIHRoZSBwcmUtZGVjb2RlZCBkYXRhLlxuICAgIHJldHVybiB0aGlzLl9mb250Ll90cmFuc2Zvcm1lZEdseXBoc1t0aGlzLmlkXTtcbiAgfTtcblxuICBfcHJvdG8uX2dldENCb3ggPSBmdW5jdGlvbiBfZ2V0Q0JveCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoLmJib3g7XG4gIH07XG5cbiAgcmV0dXJuIFdPRkYyR2x5cGg7XG59KFRURkdseXBoKTtcblxudmFyIEJhc2UxMjggPSB7XG4gIGRlY29kZTogZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSkge1xuICAgIHZhciByZXN1bHQgPSAwO1xuICAgIHZhciBpdGVyYWJsZSA9IFswLCAxLCAyLCAzLCA0XTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgaXRlcmFibGUubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBjb2RlID0gc3RyZWFtLnJlYWRVSW50OCgpOyAvLyBJZiBhbnkgb2YgdGhlIHRvcCBzZXZlbiBiaXRzIGFyZSBzZXQgdGhlbiB3ZSdyZSBhYm91dCB0byBvdmVyZmxvdy5cblxuICAgICAgaWYgKHJlc3VsdCAmIDB4ZTAwMDAwMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVyZmxvdycpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHQgPSByZXN1bHQgPDwgNyB8IGNvZGUgJiAweDdmO1xuXG4gICAgICBpZiAoKGNvZGUgJiAweDgwKSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignQmFkIGJhc2UgMTI4IG51bWJlcicpO1xuICB9XG59O1xudmFyIGtub3duVGFncyA9IFsnY21hcCcsICdoZWFkJywgJ2hoZWEnLCAnaG10eCcsICdtYXhwJywgJ25hbWUnLCAnT1MvMicsICdwb3N0JywgJ2N2dCAnLCAnZnBnbScsICdnbHlmJywgJ2xvY2EnLCAncHJlcCcsICdDRkYgJywgJ1ZPUkcnLCAnRUJEVCcsICdFQkxDJywgJ2dhc3AnLCAnaGRteCcsICdrZXJuJywgJ0xUU0gnLCAnUENMVCcsICdWRE1YJywgJ3ZoZWEnLCAndm10eCcsICdCQVNFJywgJ0dERUYnLCAnR1BPUycsICdHU1VCJywgJ0VCU0MnLCAnSlNURicsICdNQVRIJywgJ0NCRFQnLCAnQ0JMQycsICdDT0xSJywgJ0NQQUwnLCAnU1ZHICcsICdzYml4JywgJ2FjbnQnLCAnYXZhcicsICdiZGF0JywgJ2Jsb2MnLCAnYnNsbicsICdjdmFyJywgJ2Zkc2MnLCAnZmVhdCcsICdmbXR4JywgJ2Z2YXInLCAnZ3ZhcicsICdoc3R5JywgJ2p1c3QnLCAnbGNhcicsICdtb3J0JywgJ21vcngnLCAnb3BiZCcsICdwcm9wJywgJ3RyYWsnLCAnWmFwZicsICdTaWxmJywgJ0dsYXQnLCAnR2xvYycsICdGZWF0JywgJ1NpbGwnXTtcbnZhciBXT0ZGMkRpcmVjdG9yeUVudHJ5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZsYWdzOiByZXN0cnVjdHVyZS51aW50OCxcbiAgY3VzdG9tVGFnOiBuZXcgcmVzdHJ1Y3R1cmUuT3B0aW9uYWwobmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gKHQuZmxhZ3MgJiAweDNmKSA9PT0gMHgzZjtcbiAgfSksXG4gIHRhZzogZnVuY3Rpb24gdGFnKHQpIHtcbiAgICByZXR1cm4gdC5jdXN0b21UYWcgfHwga25vd25UYWdzW3QuZmxhZ3MgJiAweDNmXTtcbiAgfSxcbiAgLy8gfHwgKCgpID0+IHsgdGhyb3cgbmV3IEVycm9yKGBCYWQgdGFnOiAke2ZsYWdzICYgMHgzZn1gKTsgfSkoKTsgfSxcbiAgbGVuZ3RoOiBCYXNlMTI4LFxuICB0cmFuc2Zvcm1WZXJzaW9uOiBmdW5jdGlvbiB0cmFuc2Zvcm1WZXJzaW9uKHQpIHtcbiAgICByZXR1cm4gdC5mbGFncyA+Pj4gNiAmIDB4MDM7XG4gIH0sXG4gIHRyYW5zZm9ybWVkOiBmdW5jdGlvbiB0cmFuc2Zvcm1lZCh0KSB7XG4gICAgcmV0dXJuIHQudGFnID09PSAnZ2x5ZicgfHwgdC50YWcgPT09ICdsb2NhJyA/IHQudHJhbnNmb3JtVmVyc2lvbiA9PT0gMCA6IHQudHJhbnNmb3JtVmVyc2lvbiAhPT0gMDtcbiAgfSxcbiAgdHJhbnNmb3JtTGVuZ3RoOiBuZXcgcmVzdHJ1Y3R1cmUuT3B0aW9uYWwoQmFzZTEyOCwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC50cmFuc2Zvcm1lZDtcbiAgfSlcbn0pO1xudmFyIFdPRkYyRGlyZWN0b3J5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgLy8gc2hvdWxkIGJlICd3T0YyJ1xuICBmbGF2b3I6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG51bVRhYmxlczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gIHRvdGFsU2ZudFNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgdG90YWxDb21wcmVzc2VkU2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBtYWpvclZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWlub3JWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1ldGFPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbWV0YUxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBtZXRhT3JpZ0xlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBwcml2T2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHByaXZMZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgdGFibGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoV09GRjJEaXJlY3RvcnlFbnRyeSwgJ251bVRhYmxlcycpXG59KTtcblxuV09GRjJEaXJlY3RvcnkucHJvY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRhYmxlcyA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50YWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdGFibGUgPSB0aGlzLnRhYmxlc1tpXTtcbiAgICB0YWJsZXNbdGFibGUudGFnXSA9IHRhYmxlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMudGFibGVzID0gdGFibGVzO1xufTtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkaChzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cbi8qKlxuICogU3ViY2xhc3Mgb2YgVFRGRm9udCB0aGF0IHJlcHJlc2VudHMgYSBUVEYvT1RGIGZvbnQgY29tcHJlc3NlZCBieSBXT0ZGMlxuICogU2VlIHNwZWMgaGVyZTogaHR0cDovL3d3dy53My5vcmcvVFIvV09GRjIvXG4gKi9cblxudmFyIFdPRkYyRm9udCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1RURkZvbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UkaChXT0ZGMkZvbnQsIF9UVEZGb250KTtcblxuICBmdW5jdGlvbiBXT0ZGMkZvbnQoKSB7XG4gICAgcmV0dXJuIF9UVEZGb250LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIFdPRkYyRm9udC5wcm9iZSA9IGZ1bmN0aW9uIHByb2JlKGJ1ZmZlcikge1xuICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoJ2FzY2lpJywgMCwgNCkgPT09ICd3T0YyJztcbiAgfTtcblxuICB2YXIgX3Byb3RvID0gV09GRjJGb250LnByb3RvdHlwZTtcblxuICBfcHJvdG8uX2RlY29kZURpcmVjdG9yeSA9IGZ1bmN0aW9uIF9kZWNvZGVEaXJlY3RvcnkoKSB7XG4gICAgdGhpcy5kaXJlY3RvcnkgPSBXT0ZGMkRpcmVjdG9yeS5kZWNvZGUodGhpcy5zdHJlYW0pO1xuICAgIHRoaXMuX2RhdGFQb3MgPSB0aGlzLnN0cmVhbS5wb3M7XG4gIH07XG5cbiAgX3Byb3RvLl9kZWNvbXByZXNzID0gZnVuY3Rpb24gX2RlY29tcHJlc3MoKSB7XG4gICAgLy8gZGVjb21wcmVzcyBkYXRhIGFuZCBzZXR1cCB0YWJsZSBvZmZzZXRzIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeVxuICAgIGlmICghdGhpcy5fZGVjb21wcmVzc2VkKSB7XG4gICAgICB0aGlzLnN0cmVhbS5wb3MgPSB0aGlzLl9kYXRhUG9zO1xuICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuc3RyZWFtLnJlYWRCdWZmZXIodGhpcy5kaXJlY3RvcnkudG90YWxDb21wcmVzc2VkU2l6ZSk7XG4gICAgICB2YXIgZGVjb21wcmVzc2VkU2l6ZSA9IDA7XG5cbiAgICAgIGZvciAodmFyIHRhZyBpbiB0aGlzLmRpcmVjdG9yeS50YWJsZXMpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5kaXJlY3RvcnkudGFibGVzW3RhZ107XG4gICAgICAgIGVudHJ5Lm9mZnNldCA9IGRlY29tcHJlc3NlZFNpemU7XG4gICAgICAgIGRlY29tcHJlc3NlZFNpemUgKz0gZW50cnkudHJhbnNmb3JtTGVuZ3RoICE9IG51bGwgPyBlbnRyeS50cmFuc2Zvcm1MZW5ndGggOiBlbnRyeS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIHZhciBkZWNvbXByZXNzZWQgPSBkZWNvbXByZXNzKGJ1ZmZlciwgZGVjb21wcmVzc2VkU2l6ZSk7XG5cbiAgICAgIGlmICghZGVjb21wcmVzc2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgZGVjb2RpbmcgY29tcHJlc3NlZCBkYXRhIGluIFdPRkYyJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RyZWFtID0gbmV3IHJlc3RydWN0dXJlLkRlY29kZVN0cmVhbShuZXcgYnVmZmVyXzEoZGVjb21wcmVzc2VkKSk7XG4gICAgICB0aGlzLl9kZWNvbXByZXNzZWQgPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uX2RlY29kZVRhYmxlID0gZnVuY3Rpb24gX2RlY29kZVRhYmxlKHRhYmxlKSB7XG4gICAgdGhpcy5fZGVjb21wcmVzcygpO1xuXG4gICAgcmV0dXJuIF9UVEZGb250LnByb3RvdHlwZS5fZGVjb2RlVGFibGUuY2FsbCh0aGlzLCB0YWJsZSk7XG4gIH0gLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZ2V0IGEgZ2x5cGggYW5kIHJldHVybiBvdXJcbiAgLy8gY3VzdG9tIHN1YmNsYXNzIGlmIHRoZXJlIGlzIGEgZ2x5ZiB0YWJsZS5cbiAgO1xuXG4gIF9wcm90by5fZ2V0QmFzZUdseXBoID0gZnVuY3Rpb24gX2dldEJhc2VHbHlwaChnbHlwaCwgY2hhcmFjdGVycykge1xuICAgIGlmIChjaGFyYWN0ZXJzID09PSB2b2lkIDApIHtcbiAgICAgIGNoYXJhY3RlcnMgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2dseXBoc1tnbHlwaF0pIHtcbiAgICAgIGlmICh0aGlzLmRpcmVjdG9yeS50YWJsZXMuZ2x5ZiAmJiB0aGlzLmRpcmVjdG9yeS50YWJsZXMuZ2x5Zi50cmFuc2Zvcm1lZCkge1xuICAgICAgICBpZiAoIXRoaXMuX3RyYW5zZm9ybWVkR2x5cGhzKSB7XG4gICAgICAgICAgdGhpcy5fdHJhbnNmb3JtR2x5ZlRhYmxlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2x5cGhzW2dseXBoXSA9IG5ldyBXT0ZGMkdseXBoKGdseXBoLCBjaGFyYWN0ZXJzLCB0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBfVFRGRm9udC5wcm90b3R5cGUuX2dldEJhc2VHbHlwaC5jYWxsKHRoaXMsIGdseXBoLCBjaGFyYWN0ZXJzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLl90cmFuc2Zvcm1HbHlmVGFibGUgPSBmdW5jdGlvbiBfdHJhbnNmb3JtR2x5ZlRhYmxlKCkge1xuICAgIHRoaXMuX2RlY29tcHJlc3MoKTtcblxuICAgIHRoaXMuc3RyZWFtLnBvcyA9IHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5nbHlmLm9mZnNldDtcbiAgICB2YXIgdGFibGUgPSBHbHlmVGFibGUuZGVjb2RlKHRoaXMuc3RyZWFtKTtcbiAgICB2YXIgZ2x5cGhzID0gW107XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGFibGUubnVtR2x5cGhzOyBpbmRleCsrKSB7XG4gICAgICB2YXIgZ2x5cGggPSB7fTtcbiAgICAgIHZhciBuQ29udG91cnMgPSB0YWJsZS5uQ29udG91cnMucmVhZEludDE2QkUoKTtcbiAgICAgIGdseXBoLm51bWJlck9mQ29udG91cnMgPSBuQ29udG91cnM7XG5cbiAgICAgIGlmIChuQ29udG91cnMgPiAwKSB7XG4gICAgICAgIC8vIHNpbXBsZSBnbHlwaFxuICAgICAgICB2YXIgblBvaW50cyA9IFtdO1xuICAgICAgICB2YXIgdG90YWxQb2ludHMgPSAwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbkNvbnRvdXJzOyBpKyspIHtcbiAgICAgICAgICB2YXIgX3IgPSByZWFkMjU1VUludDE2KHRhYmxlLm5Qb2ludHMpO1xuXG4gICAgICAgICAgdG90YWxQb2ludHMgKz0gX3I7XG4gICAgICAgICAgblBvaW50cy5wdXNoKHRvdGFsUG9pbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdseXBoLnBvaW50cyA9IGRlY29kZVRyaXBsZXQodGFibGUuZmxhZ3MsIHRhYmxlLmdseXBocywgdG90YWxQb2ludHMpO1xuXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBuQ29udG91cnM7IF9pKyspIHtcbiAgICAgICAgICBnbHlwaC5wb2ludHNbblBvaW50c1tfaV0gLSAxXS5lbmRDb250b3VyID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbnN0cnVjdGlvblNpemUgPSByZWFkMjU1VUludDE2KHRhYmxlLmdseXBocyk7XG4gICAgICB9IGVsc2UgaWYgKG5Db250b3VycyA8IDApIHtcbiAgICAgICAgLy8gY29tcG9zaXRlIGdseXBoXG4gICAgICAgIHZhciBoYXZlSW5zdHJ1Y3Rpb25zID0gVFRGR2x5cGgucHJvdG90eXBlLl9kZWNvZGVDb21wb3NpdGUuY2FsbCh7XG4gICAgICAgICAgX2ZvbnQ6IHRoaXNcbiAgICAgICAgfSwgZ2x5cGgsIHRhYmxlLmNvbXBvc2l0ZXMpO1xuXG4gICAgICAgIGlmIChoYXZlSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgICAgdmFyIGluc3RydWN0aW9uU2l6ZSA9IHJlYWQyNTVVSW50MTYodGFibGUuZ2x5cGhzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBnbHlwaHMucHVzaChnbHlwaCk7XG4gICAgfVxuXG4gICAgdGhpcy5fdHJhbnNmb3JtZWRHbHlwaHMgPSBnbHlwaHM7XG4gIH07XG5cbiAgcmV0dXJuIFdPRkYyRm9udDtcbn0oVFRGRm9udCk7IC8vIFNwZWNpYWwgY2xhc3MgdGhhdCBhY2NlcHRzIGEgbGVuZ3RoIGFuZCByZXR1cm5zIGEgc3ViLXN0cmVhbSBmb3IgdGhhdCBkYXRhXG5cbnZhciBTdWJzdHJlYW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdWJzdHJlYW0obGVuZ3RoKSB7XG4gICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgdGhpcy5fYnVmID0gbmV3IHJlc3RydWN0dXJlLkJ1ZmZlcihsZW5ndGgpO1xuICB9XG5cbiAgdmFyIF9wcm90bzIgPSBTdWJzdHJlYW0ucHJvdG90eXBlO1xuXG4gIF9wcm90bzIuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgcmV0dXJuIG5ldyByZXN0cnVjdHVyZS5EZWNvZGVTdHJlYW0odGhpcy5fYnVmLmRlY29kZShzdHJlYW0sIHBhcmVudCkpO1xuICB9O1xuXG4gIHJldHVybiBTdWJzdHJlYW07XG59KCk7IC8vIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgdGhlIGVudGlyZSBnbHlmIHRhYmxlXG5cblxudmFyIEdseWZUYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG51bUdseXBoczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBpbmRleEZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBuQ29udG91clN0cmVhbVNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgblBvaW50c1N0cmVhbVNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgZmxhZ1N0cmVhbVNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgZ2x5cGhTdHJlYW1TaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGNvbXBvc2l0ZVN0cmVhbVNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgYmJveFN0cmVhbVNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgaW5zdHJ1Y3Rpb25TdHJlYW1TaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG5Db250b3VyczogbmV3IFN1YnN0cmVhbSgnbkNvbnRvdXJTdHJlYW1TaXplJyksXG4gIG5Qb2ludHM6IG5ldyBTdWJzdHJlYW0oJ25Qb2ludHNTdHJlYW1TaXplJyksXG4gIGZsYWdzOiBuZXcgU3Vic3RyZWFtKCdmbGFnU3RyZWFtU2l6ZScpLFxuICBnbHlwaHM6IG5ldyBTdWJzdHJlYW0oJ2dseXBoU3RyZWFtU2l6ZScpLFxuICBjb21wb3NpdGVzOiBuZXcgU3Vic3RyZWFtKCdjb21wb3NpdGVTdHJlYW1TaXplJyksXG4gIGJib3hlczogbmV3IFN1YnN0cmVhbSgnYmJveFN0cmVhbVNpemUnKSxcbiAgaW5zdHJ1Y3Rpb25zOiBuZXcgU3Vic3RyZWFtKCdpbnN0cnVjdGlvblN0cmVhbVNpemUnKVxufSk7XG52YXIgV09SRF9DT0RFID0gMjUzO1xudmFyIE9ORV9NT1JFX0JZVEVfQ09ERTIgPSAyNTQ7XG52YXIgT05FX01PUkVfQllURV9DT0RFMSA9IDI1NTtcbnZhciBMT1dFU1RfVV9DT0RFID0gMjUzO1xuXG5mdW5jdGlvbiByZWFkMjU1VUludDE2KHN0cmVhbSkge1xuICB2YXIgY29kZSA9IHN0cmVhbS5yZWFkVUludDgoKTtcblxuICBpZiAoY29kZSA9PT0gV09SRF9DT0RFKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5yZWFkVUludDE2QkUoKTtcbiAgfVxuXG4gIGlmIChjb2RlID09PSBPTkVfTU9SRV9CWVRFX0NPREUxKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5yZWFkVUludDgoKSArIExPV0VTVF9VX0NPREU7XG4gIH1cblxuICBpZiAoY29kZSA9PT0gT05FX01PUkVfQllURV9DT0RFMikge1xuICAgIHJldHVybiBzdHJlYW0ucmVhZFVJbnQ4KCkgKyBMT1dFU1RfVV9DT0RFICogMjtcbiAgfVxuXG4gIHJldHVybiBjb2RlO1xufVxuXG5mdW5jdGlvbiB3aXRoU2lnbihmbGFnLCBiYXNldmFsKSB7XG4gIHJldHVybiBmbGFnICYgMSA/IGJhc2V2YWwgOiAtYmFzZXZhbDtcbn1cblxuZnVuY3Rpb24gZGVjb2RlVHJpcGxldChmbGFncywgZ2x5cGhzLCBuUG9pbnRzKSB7XG4gIHZhciB5O1xuICB2YXIgeCA9IHkgPSAwO1xuICB2YXIgcmVzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHtcbiAgICB2YXIgZHggPSAwLFxuICAgICAgICBkeSA9IDA7XG4gICAgdmFyIGZsYWcgPSBmbGFncy5yZWFkVUludDgoKTtcbiAgICB2YXIgb25DdXJ2ZSA9ICEoZmxhZyA+PiA3KTtcbiAgICBmbGFnICY9IDB4N2Y7XG5cbiAgICBpZiAoZmxhZyA8IDEwKSB7XG4gICAgICBkeCA9IDA7XG4gICAgICBkeSA9IHdpdGhTaWduKGZsYWcsICgoZmxhZyAmIDE0KSA8PCA3KSArIGdseXBocy5yZWFkVUludDgoKSk7XG4gICAgfSBlbHNlIGlmIChmbGFnIDwgMjApIHtcbiAgICAgIGR4ID0gd2l0aFNpZ24oZmxhZywgKChmbGFnIC0gMTAgJiAxNCkgPDwgNykgKyBnbHlwaHMucmVhZFVJbnQ4KCkpO1xuICAgICAgZHkgPSAwO1xuICAgIH0gZWxzZSBpZiAoZmxhZyA8IDg0KSB7XG4gICAgICB2YXIgYjAgPSBmbGFnIC0gMjA7XG4gICAgICB2YXIgYjEgPSBnbHlwaHMucmVhZFVJbnQ4KCk7XG4gICAgICBkeCA9IHdpdGhTaWduKGZsYWcsIDEgKyAoYjAgJiAweDMwKSArIChiMSA+PiA0KSk7XG4gICAgICBkeSA9IHdpdGhTaWduKGZsYWcgPj4gMSwgMSArICgoYjAgJiAweDBjKSA8PCAyKSArIChiMSAmIDB4MGYpKTtcbiAgICB9IGVsc2UgaWYgKGZsYWcgPCAxMjApIHtcbiAgICAgIHZhciBiMCA9IGZsYWcgLSA4NDtcbiAgICAgIGR4ID0gd2l0aFNpZ24oZmxhZywgMSArIChiMCAvIDEyIDw8IDgpICsgZ2x5cGhzLnJlYWRVSW50OCgpKTtcbiAgICAgIGR5ID0gd2l0aFNpZ24oZmxhZyA+PiAxLCAxICsgKGIwICUgMTIgPj4gMiA8PCA4KSArIGdseXBocy5yZWFkVUludDgoKSk7XG4gICAgfSBlbHNlIGlmIChmbGFnIDwgMTI0KSB7XG4gICAgICB2YXIgYjEgPSBnbHlwaHMucmVhZFVJbnQ4KCk7XG4gICAgICB2YXIgYjIgPSBnbHlwaHMucmVhZFVJbnQ4KCk7XG4gICAgICBkeCA9IHdpdGhTaWduKGZsYWcsIChiMSA8PCA0KSArIChiMiA+PiA0KSk7XG4gICAgICBkeSA9IHdpdGhTaWduKGZsYWcgPj4gMSwgKChiMiAmIDB4MGYpIDw8IDgpICsgZ2x5cGhzLnJlYWRVSW50OCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZHggPSB3aXRoU2lnbihmbGFnLCBnbHlwaHMucmVhZFVJbnQxNkJFKCkpO1xuICAgICAgZHkgPSB3aXRoU2lnbihmbGFnID4+IDEsIGdseXBocy5yZWFkVUludDE2QkUoKSk7XG4gICAgfVxuXG4gICAgeCArPSBkeDtcbiAgICB5ICs9IGR5O1xuICAgIHJlcy5wdXNoKG5ldyBQb2ludChvbkN1cnZlLCBmYWxzZSwgeCwgeSkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRzKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRzKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRzKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkcyhvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JHMobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRzKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQ5KHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDkoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ5KENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkOShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbnZhciBUVENIZWFkZXIgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQzMiwge1xuICAweDAwMDEwMDAwOiB7XG4gICAgbnVtRm9udHM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBvZmZzZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDMyLCAnbnVtRm9udHMnKVxuICB9LFxuICAweDAwMDIwMDAwOiB7XG4gICAgbnVtRm9udHM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBvZmZzZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDMyLCAnbnVtRm9udHMnKSxcbiAgICBkc2lnVGFnOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZHNpZ0xlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGRzaWdPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQzMlxuICB9XG59KTtcblxudmFyIFRydWVUeXBlQ29sbGVjdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIFRydWVUeXBlQ29sbGVjdGlvbi5wcm9iZSA9IGZ1bmN0aW9uIHByb2JlKGJ1ZmZlcikge1xuICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoJ2FzY2lpJywgMCwgNCkgPT09ICd0dGNmJztcbiAgfTtcblxuICBmdW5jdGlvbiBUcnVlVHlwZUNvbGxlY3Rpb24oc3RyZWFtKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG5cbiAgICBpZiAoc3RyZWFtLnJlYWRTdHJpbmcoNCkgIT09ICd0dGNmJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSBUcnVlVHlwZSBjb2xsZWN0aW9uJyk7XG4gICAgfVxuXG4gICAgdGhpcy5oZWFkZXIgPSBUVENIZWFkZXIuZGVjb2RlKHN0cmVhbSk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gVHJ1ZVR5cGVDb2xsZWN0aW9uLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0Rm9udCA9IGZ1bmN0aW9uIGdldEZvbnQobmFtZSkge1xuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2Ukcyh0aGlzLmhlYWRlci5vZmZzZXRzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBvZmZzZXQgPSBfc3RlcC52YWx1ZTtcbiAgICAgIHZhciBzdHJlYW0gPSBuZXcgcmVzdHJ1Y3R1cmUuRGVjb2RlU3RyZWFtKHRoaXMuc3RyZWFtLmJ1ZmZlcik7XG4gICAgICBzdHJlYW0ucG9zID0gb2Zmc2V0O1xuICAgICAgdmFyIGZvbnQgPSBuZXcgVFRGRm9udChzdHJlYW0pO1xuXG4gICAgICBpZiAoZm9udC5wb3N0c2NyaXB0TmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gZm9udDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MkOShUcnVlVHlwZUNvbGxlY3Rpb24sIFt7XG4gICAga2V5OiBcImZvbnRzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgZm9udHMgPSBbXTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2Ukcyh0aGlzLmhlYWRlci5vZmZzZXRzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IF9zdGVwMi52YWx1ZTtcbiAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyByZXN0cnVjdHVyZS5EZWNvZGVTdHJlYW0odGhpcy5zdHJlYW0uYnVmZmVyKTtcbiAgICAgICAgc3RyZWFtLnBvcyA9IG9mZnNldDtcbiAgICAgICAgZm9udHMucHVzaChuZXcgVFRGRm9udChzdHJlYW0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvbnRzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUcnVlVHlwZUNvbGxlY3Rpb247XG59KCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkdChvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkdChvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkdChvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JHQobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSR0KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkdChhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkYSh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyRhKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkYShDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJGEoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG52YXIgREZvbnROYW1lID0gbmV3IHJlc3RydWN0dXJlLlN0cmluZyhyZXN0cnVjdHVyZS51aW50OCk7XG52YXIgREZvbnREYXRhID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGxlbjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBidWY6IG5ldyByZXN0cnVjdHVyZS5CdWZmZXIoJ2xlbicpXG59KTtcbnZhciBSZWYgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgaWQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbmFtZU9mZnNldDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIGF0dHI6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBkYXRhT2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MjQsXG4gIGhhbmRsZTogcmVzdHJ1Y3R1cmUudWludDMyXG59KTtcbnZhciBUeXBlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG5hbWU6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIG1heFR5cGVJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICByZWZMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIG5ldyByZXN0cnVjdHVyZS5BcnJheShSZWYsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQubWF4VHlwZUluZGV4ICsgMTtcbiAgfSksIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgVHlwZUxpc3QgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHR5cGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoVHlwZSwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5sZW5ndGggKyAxO1xuICB9KVxufSk7XG52YXIgREZvbnRNYXAgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50OCwgMjQpLFxuICB0eXBlTGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBUeXBlTGlzdCksXG4gIG5hbWVMaXN0T2Zmc2V0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsICd2b2lkJylcbn0pO1xudmFyIERGb250SGVhZGVyID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGRhdGFPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbWFwOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIERGb250TWFwKSxcbiAgZGF0YUxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBtYXBMZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMlxufSk7XG5cbnZhciBERm9udCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIERGb250LnByb2JlID0gZnVuY3Rpb24gcHJvYmUoYnVmZmVyKSB7XG4gICAgdmFyIHN0cmVhbSA9IG5ldyByZXN0cnVjdHVyZS5EZWNvZGVTdHJlYW0oYnVmZmVyKTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgaGVhZGVyID0gREZvbnRIZWFkZXIuZGVjb2RlKHN0cmVhbSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkdChoZWFkZXIubWFwLnR5cGVMaXN0LnR5cGVzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciB0eXBlID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgIGlmICh0eXBlLm5hbWUgPT09ICdzZm50Jykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgZnVuY3Rpb24gREZvbnQoc3RyZWFtKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5oZWFkZXIgPSBERm9udEhlYWRlci5kZWNvZGUodGhpcy5zdHJlYW0pO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkdCh0aGlzLmhlYWRlci5tYXAudHlwZUxpc3QudHlwZXMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgdmFyIHR5cGUgPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHQodHlwZS5yZWZMaXN0KSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHJlZiA9IF9zdGVwMy52YWx1ZTtcblxuICAgICAgICBpZiAocmVmLm5hbWVPZmZzZXQgPj0gMCkge1xuICAgICAgICAgIHRoaXMuc3RyZWFtLnBvcyA9IHJlZi5uYW1lT2Zmc2V0ICsgdGhpcy5oZWFkZXIubWFwLm5hbWVMaXN0T2Zmc2V0O1xuICAgICAgICAgIHJlZi5uYW1lID0gREZvbnROYW1lLmRlY29kZSh0aGlzLnN0cmVhbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmLm5hbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlLm5hbWUgPT09ICdzZm50Jykge1xuICAgICAgICB0aGlzLnNmbnQgPSB0eXBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBERm9udC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmdldEZvbnQgPSBmdW5jdGlvbiBnZXRGb250KG5hbWUpIHtcbiAgICBpZiAoIXRoaXMuc2ZudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkdCh0aGlzLnNmbnQucmVmTGlzdCksIF9zdGVwNDsgIShfc3RlcDQgPSBfaXRlcmF0b3I0KCkpLmRvbmU7KSB7XG4gICAgICB2YXIgcmVmID0gX3N0ZXA0LnZhbHVlO1xuICAgICAgdmFyIHBvcyA9IHRoaXMuaGVhZGVyLmRhdGFPZmZzZXQgKyByZWYuZGF0YU9mZnNldCArIDQ7XG4gICAgICB2YXIgc3RyZWFtID0gbmV3IHJlc3RydWN0dXJlLkRlY29kZVN0cmVhbSh0aGlzLnN0cmVhbS5idWZmZXIuc2xpY2UocG9zKSk7XG4gICAgICB2YXIgZm9udCA9IG5ldyBUVEZGb250KHN0cmVhbSk7XG5cbiAgICAgIGlmIChmb250LnBvc3RzY3JpcHROYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBmb250O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyRhKERGb250LCBbe1xuICAgIGtleTogXCJmb250c1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGZvbnRzID0gW107XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHQodGhpcy5zZm50LnJlZkxpc3QpLCBfc3RlcDU7ICEoX3N0ZXA1ID0gX2l0ZXJhdG9yNSgpKS5kb25lOykge1xuICAgICAgICB2YXIgcmVmID0gX3N0ZXA1LnZhbHVlO1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5oZWFkZXIuZGF0YU9mZnNldCArIHJlZi5kYXRhT2Zmc2V0ICsgNDtcbiAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyByZXN0cnVjdHVyZS5EZWNvZGVTdHJlYW0odGhpcy5zdHJlYW0uYnVmZmVyLnNsaWNlKHBvcykpO1xuICAgICAgICBmb250cy5wdXNoKG5ldyBUVEZGb250KHN0cmVhbSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9udHM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERGb250O1xufSgpO1xuXG5mb250a2l0LnJlZ2lzdGVyRm9ybWF0KFRURkZvbnQpO1xuZm9udGtpdC5yZWdpc3RlckZvcm1hdChXT0ZGRm9udCk7XG5mb250a2l0LnJlZ2lzdGVyRm9ybWF0KFdPRkYyRm9udCk7XG5mb250a2l0LnJlZ2lzdGVyRm9ybWF0KFRydWVUeXBlQ29sbGVjdGlvbik7XG5mb250a2l0LnJlZ2lzdGVyRm9ybWF0KERGb250KTtcblxuZXhwb3J0IGRlZmF1bHQgZm9udGtpdDtcbiIsIi8qIHRzbGludDpkaXNhYmxlIG1heC1jbGFzc2VzLXBlci1maWxlICovXG5pbXBvcnQgeyBkZWNvbXByZXNzSnNvbiwgcGFkU3RhcnQgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBBbGxFbmNvZGluZ3NDb21wcmVzc2VkIGZyb20gJy4vYWxsLWVuY29kaW5ncy5jb21wcmVzc2VkLmpzb24nO1xudmFyIGRlY29tcHJlc3NlZEVuY29kaW5ncyA9IGRlY29tcHJlc3NKc29uKEFsbEVuY29kaW5nc0NvbXByZXNzZWQpO1xudmFyIGFsbFVuaWNvZGVNYXBwaW5ncyA9IEpTT04ucGFyc2UoZGVjb21wcmVzc2VkRW5jb2RpbmdzKTtcbnZhciBFbmNvZGluZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbmNvZGluZyhuYW1lLCB1bmljb2RlTWFwcGluZ3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5jYW5FbmNvZGVVbmljb2RlQ29kZVBvaW50ID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVQb2ludCBpbiBfdGhpcy51bmljb2RlTWFwcGluZ3M7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZW5jb2RlVW5pY29kZUNvZGVQb2ludCA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICAgICAgICAgIHZhciBtYXBwZWQgPSBfdGhpcy51bmljb2RlTWFwcGluZ3NbY29kZVBvaW50XTtcbiAgICAgICAgICAgIGlmICghbWFwcGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0ciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KTtcbiAgICAgICAgICAgICAgICB2YXIgaGV4Q29kZSA9IFwiMHhcIiArIHBhZFN0YXJ0KGNvZGVQb2ludC50b1N0cmluZygxNiksIDQsICcwJyk7XG4gICAgICAgICAgICAgICAgdmFyIG1zZyA9IF90aGlzLm5hbWUgKyBcIiBjYW5ub3QgZW5jb2RlIFxcXCJcIiArIHN0ciArIFwiXFxcIiAoXCIgKyBoZXhDb2RlICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBjb2RlOiBtYXBwZWRbMF0sIG5hbWU6IG1hcHBlZFsxXSB9O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnN1cHBvcnRlZENvZGVQb2ludHMgPSBPYmplY3Qua2V5cyh1bmljb2RlTWFwcGluZ3MpXG4gICAgICAgICAgICAubWFwKE51bWJlcilcbiAgICAgICAgICAgIC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIC0gYjsgfSk7XG4gICAgICAgIHRoaXMudW5pY29kZU1hcHBpbmdzID0gdW5pY29kZU1hcHBpbmdzO1xuICAgIH1cbiAgICByZXR1cm4gRW5jb2Rpbmc7XG59KCkpO1xuZXhwb3J0IHZhciBFbmNvZGluZ3MgPSB7XG4gICAgU3ltYm9sOiBuZXcgRW5jb2RpbmcoJ1N5bWJvbCcsIGFsbFVuaWNvZGVNYXBwaW5ncy5zeW1ib2wpLFxuICAgIFphcGZEaW5nYmF0czogbmV3IEVuY29kaW5nKCdaYXBmRGluZ2JhdHMnLCBhbGxVbmljb2RlTWFwcGluZ3MuemFwZmRpbmdiYXRzKSxcbiAgICBXaW5BbnNpOiBuZXcgRW5jb2RpbmcoJ1dpbkFuc2knLCBhbGxVbmljb2RlTWFwcGluZ3Mud2luMTI1MiksXG59O1xuIiwiaW1wb3J0IHsgZGVjb21wcmVzc0pzb24gfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBDb3VyaWVyQm9sZENvbXByZXNzZWQgZnJvbSAnLi9Db3VyaWVyLUJvbGQuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBDb3VyaWVyQm9sZE9ibGlxdWVDb21wcmVzc2VkIGZyb20gJy4vQ291cmllci1Cb2xkT2JsaXF1ZS5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IENvdXJpZXJPYmxpcXVlQ29tcHJlc3NlZCBmcm9tICcuL0NvdXJpZXItT2JsaXF1ZS5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IENvdXJpZXJDb21wcmVzc2VkIGZyb20gJy4vQ291cmllci5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IEhlbHZldGljYUJvbGRDb21wcmVzc2VkIGZyb20gJy4vSGVsdmV0aWNhLUJvbGQuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBIZWx2ZXRpY2FCb2xkT2JsaXF1ZUNvbXByZXNzZWQgZnJvbSAnLi9IZWx2ZXRpY2EtQm9sZE9ibGlxdWUuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBIZWx2ZXRpY2FPYmxpcXVlQ29tcHJlc3NlZCBmcm9tICcuL0hlbHZldGljYS1PYmxpcXVlLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgSGVsdmV0aWNhQ29tcHJlc3NlZCBmcm9tICcuL0hlbHZldGljYS5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IFRpbWVzQm9sZENvbXByZXNzZWQgZnJvbSAnLi9UaW1lcy1Cb2xkLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgVGltZXNCb2xkSXRhbGljQ29tcHJlc3NlZCBmcm9tICcuL1RpbWVzLUJvbGRJdGFsaWMuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBUaW1lc0l0YWxpY0NvbXByZXNzZWQgZnJvbSAnLi9UaW1lcy1JdGFsaWMuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBUaW1lc1JvbWFuQ29tcHJlc3NlZCBmcm9tICcuL1RpbWVzLVJvbWFuLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgU3ltYm9sQ29tcHJlc3NlZCBmcm9tICcuL1N5bWJvbC5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IFphcGZEaW5nYmF0c0NvbXByZXNzZWQgZnJvbSAnLi9aYXBmRGluZ2JhdHMuY29tcHJlc3NlZC5qc29uJztcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGNvbXByZXNzZWRKc29uRm9yRm9udE5hbWUgPSB7XG4gICAgJ0NvdXJpZXInOiBDb3VyaWVyQ29tcHJlc3NlZCxcbiAgICAnQ291cmllci1Cb2xkJzogQ291cmllckJvbGRDb21wcmVzc2VkLFxuICAgICdDb3VyaWVyLU9ibGlxdWUnOiBDb3VyaWVyT2JsaXF1ZUNvbXByZXNzZWQsXG4gICAgJ0NvdXJpZXItQm9sZE9ibGlxdWUnOiBDb3VyaWVyQm9sZE9ibGlxdWVDb21wcmVzc2VkLFxuICAgICdIZWx2ZXRpY2EnOiBIZWx2ZXRpY2FDb21wcmVzc2VkLFxuICAgICdIZWx2ZXRpY2EtQm9sZCc6IEhlbHZldGljYUJvbGRDb21wcmVzc2VkLFxuICAgICdIZWx2ZXRpY2EtT2JsaXF1ZSc6IEhlbHZldGljYU9ibGlxdWVDb21wcmVzc2VkLFxuICAgICdIZWx2ZXRpY2EtQm9sZE9ibGlxdWUnOiBIZWx2ZXRpY2FCb2xkT2JsaXF1ZUNvbXByZXNzZWQsXG4gICAgJ1RpbWVzLVJvbWFuJzogVGltZXNSb21hbkNvbXByZXNzZWQsXG4gICAgJ1RpbWVzLUJvbGQnOiBUaW1lc0JvbGRDb21wcmVzc2VkLFxuICAgICdUaW1lcy1JdGFsaWMnOiBUaW1lc0l0YWxpY0NvbXByZXNzZWQsXG4gICAgJ1RpbWVzLUJvbGRJdGFsaWMnOiBUaW1lc0JvbGRJdGFsaWNDb21wcmVzc2VkLFxuICAgICdTeW1ib2wnOiBTeW1ib2xDb21wcmVzc2VkLFxuICAgICdaYXBmRGluZ2JhdHMnOiBaYXBmRGluZ2JhdHNDb21wcmVzc2VkLFxufTtcbmV4cG9ydCB2YXIgRm9udE5hbWVzO1xuKGZ1bmN0aW9uIChGb250TmFtZXMpIHtcbiAgICBGb250TmFtZXNbXCJDb3VyaWVyXCJdID0gXCJDb3VyaWVyXCI7XG4gICAgRm9udE5hbWVzW1wiQ291cmllckJvbGRcIl0gPSBcIkNvdXJpZXItQm9sZFwiO1xuICAgIEZvbnROYW1lc1tcIkNvdXJpZXJPYmxpcXVlXCJdID0gXCJDb3VyaWVyLU9ibGlxdWVcIjtcbiAgICBGb250TmFtZXNbXCJDb3VyaWVyQm9sZE9ibGlxdWVcIl0gPSBcIkNvdXJpZXItQm9sZE9ibGlxdWVcIjtcbiAgICBGb250TmFtZXNbXCJIZWx2ZXRpY2FcIl0gPSBcIkhlbHZldGljYVwiO1xuICAgIEZvbnROYW1lc1tcIkhlbHZldGljYUJvbGRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gICAgRm9udE5hbWVzW1wiSGVsdmV0aWNhT2JsaXF1ZVwiXSA9IFwiSGVsdmV0aWNhLU9ibGlxdWVcIjtcbiAgICBGb250TmFtZXNbXCJIZWx2ZXRpY2FCb2xkT2JsaXF1ZVwiXSA9IFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCI7XG4gICAgRm9udE5hbWVzW1wiVGltZXNSb21hblwiXSA9IFwiVGltZXMtUm9tYW5cIjtcbiAgICBGb250TmFtZXNbXCJUaW1lc1JvbWFuQm9sZFwiXSA9IFwiVGltZXMtQm9sZFwiO1xuICAgIEZvbnROYW1lc1tcIlRpbWVzUm9tYW5JdGFsaWNcIl0gPSBcIlRpbWVzLUl0YWxpY1wiO1xuICAgIEZvbnROYW1lc1tcIlRpbWVzUm9tYW5Cb2xkSXRhbGljXCJdID0gXCJUaW1lcy1Cb2xkSXRhbGljXCI7XG4gICAgRm9udE5hbWVzW1wiU3ltYm9sXCJdID0gXCJTeW1ib2xcIjtcbiAgICBGb250TmFtZXNbXCJaYXBmRGluZ2JhdHNcIl0gPSBcIlphcGZEaW5nYmF0c1wiO1xufSkoRm9udE5hbWVzIHx8IChGb250TmFtZXMgPSB7fSkpO1xudmFyIGZvbnRDYWNoZSA9IHt9O1xudmFyIEZvbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRm9udCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5nZXRXaWR0aE9mR2x5cGggPSBmdW5jdGlvbiAoZ2x5cGhOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuQ2hhcldpZHRoc1tnbHlwaE5hbWVdO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdldFhBeGlzS2VybmluZ0ZvclBhaXIgPSBmdW5jdGlvbiAobGVmdEdseXBoTmFtZSwgcmlnaHRHbHlwaE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiAoX3RoaXMuS2VyblBhaXJYQW1vdW50c1tsZWZ0R2x5cGhOYW1lXSB8fCB7fSlbcmlnaHRHbHlwaE5hbWVdO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBGb250LmxvYWQgPSBmdW5jdGlvbiAoZm9udE5hbWUpIHtcbiAgICAgICAgdmFyIGNhY2hlZEZvbnQgPSBmb250Q2FjaGVbZm9udE5hbWVdO1xuICAgICAgICBpZiAoY2FjaGVkRm9udClcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRGb250O1xuICAgICAgICB2YXIganNvbiA9IGRlY29tcHJlc3NKc29uKGNvbXByZXNzZWRKc29uRm9yRm9udE5hbWVbZm9udE5hbWVdKTtcbiAgICAgICAgdmFyIGZvbnQgPSBPYmplY3QuYXNzaWduKG5ldyBGb250KCksIEpTT04ucGFyc2UoanNvbikpO1xuICAgICAgICBmb250LkNoYXJXaWR0aHMgPSBmb250LkNoYXJNZXRyaWNzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBtZXRyaWMpIHtcbiAgICAgICAgICAgIGFjY1ttZXRyaWMuTl0gPSBtZXRyaWMuV1g7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIGZvbnQuS2VyblBhaXJYQW1vdW50cyA9IGZvbnQuS2VyblBhaXJzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBfYSkge1xuICAgICAgICAgICAgdmFyIG5hbWUxID0gX2FbMF0sIG5hbWUyID0gX2FbMV0sIHdpZHRoID0gX2FbMl07XG4gICAgICAgICAgICBpZiAoIWFjY1tuYW1lMV0pXG4gICAgICAgICAgICAgICAgYWNjW25hbWUxXSA9IHt9O1xuICAgICAgICAgICAgYWNjW25hbWUxXVtuYW1lMl0gPSB3aWR0aDtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgZm9udENhY2hlW2ZvbnROYW1lXSA9IGZvbnQ7XG4gICAgICAgIHJldHVybiBmb250O1xuICAgIH07XG4gICAgcmV0dXJuIEZvbnQ7XG59KCkpO1xuZXhwb3J0IHsgRm9udCB9O1xuIiwiZXhwb3J0ICogZnJvbSAnLi9Gb250JztcbmV4cG9ydCAqIGZyb20gJy4vRW5jb2RpbmcnO1xuIiwiLypcbiAqIFRoZSBgY2hhcnNgLCBgbG9va3VwYCwgYW5kIGBkZWNvZGVGcm9tQmFzZTY0YCBtZW1iZXJzIG9mIHRoaXMgZmlsZSBhcmVcbiAqIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICAgIGJhc2U2NC1hcnJheWJ1ZmZlclxuICogICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uaWtsYXN2aC9iYXNlNjQtYXJyYXlidWZmZXJcbiAqXG4gKiAgICAgQ29weXJpZ2h0IChjKSAyMDEyIE5pa2xhcyB2b24gSGVydHplblxuICogICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqXG4gKi9cbmltcG9ydCBwYWtvIGZyb20gJ3Bha28nO1xudmFyIGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuLy8gVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxudmFyIGxvb2t1cCA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5mb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgbG9va3VwW2NoYXJzLmNoYXJDb2RlQXQoaSldID0gaTtcbn1cbmV4cG9ydCB2YXIgZGVjb2RlRnJvbUJhc2U2NCA9IGZ1bmN0aW9uIChiYXNlNjQpIHtcbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gYmFzZTY0Lmxlbmd0aCAqIDAuNzU7XG4gICAgdmFyIGxlbiA9IGJhc2U2NC5sZW5ndGg7XG4gICAgdmFyIGk7XG4gICAgdmFyIHAgPSAwO1xuICAgIHZhciBlbmNvZGVkMTtcbiAgICB2YXIgZW5jb2RlZDI7XG4gICAgdmFyIGVuY29kZWQzO1xuICAgIHZhciBlbmNvZGVkNDtcbiAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAxXSA9PT0gJz0nKSB7XG4gICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAyXSA9PT0gJz0nKSB7XG4gICAgICAgICAgICBidWZmZXJMZW5ndGgtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXJMZW5ndGgpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICBlbmNvZGVkMSA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGVuY29kZWQyID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAxKV07XG4gICAgICAgIGVuY29kZWQzID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAyKV07XG4gICAgICAgIGVuY29kZWQ0ID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAzKV07XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoZW5jb2RlZDEgPDwgMikgfCAoZW5jb2RlZDIgPj4gNCk7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQyICYgMTUpIDw8IDQpIHwgKGVuY29kZWQzID4+IDIpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMyAmIDMpIDw8IDYpIHwgKGVuY29kZWQ0ICYgNjMpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59O1xudmFyIGFycmF5VG9TdHJpbmcgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJheVtpXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59O1xuZXhwb3J0IHZhciBkZWNvbXByZXNzSnNvbiA9IGZ1bmN0aW9uIChjb21wcmVzc2VkSnNvbikge1xuICAgIHJldHVybiBhcnJheVRvU3RyaW5nKHBha28uaW5mbGF0ZShkZWNvZGVGcm9tQmFzZTY0KGNvbXByZXNzZWRKc29uKSkpO1xufTtcbmV4cG9ydCB2YXIgcGFkU3RhcnQgPSBmdW5jdGlvbiAodmFsdWUsIGxlbmd0aCwgcGFkQ2hhcikge1xuICAgIHZhciBwYWRkaW5nID0gJyc7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGVuZ3RoIC0gdmFsdWUubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHBhZGRpbmcgKz0gcGFkQ2hhcjtcbiAgICB9XG4gICAgcmV0dXJuIHBhZGRpbmcgKyB2YWx1ZTtcbn07XG4iLCJpbXBvcnQgcGFrbyBmcm9tICdwYWtvJztcblxudmFyIFVQTkcgPSB7fTtcblxuXHRcblxuVVBORy50b1JHQkE4ID0gZnVuY3Rpb24ob3V0KVxue1xuXHR2YXIgdyA9IG91dC53aWR0aCwgaCA9IG91dC5oZWlnaHQ7XG5cdGlmKG91dC50YWJzLmFjVEw9PW51bGwpIHJldHVybiBbVVBORy50b1JHQkE4LmRlY29kZUltYWdlKG91dC5kYXRhLCB3LCBoLCBvdXQpLmJ1ZmZlcl07XG5cdFxuXHR2YXIgZnJtcyA9IFtdO1xuXHRpZihvdXQuZnJhbWVzWzBdLmRhdGE9PW51bGwpIG91dC5mcmFtZXNbMF0uZGF0YSA9IG91dC5kYXRhO1xuXHRcblx0dmFyIGxlbiA9IHcqaCo0LCBpbWcgPSBuZXcgVWludDhBcnJheShsZW4pLCBlbXB0eSA9IG5ldyBVaW50OEFycmF5KGxlbiksIHByZXY9bmV3IFVpbnQ4QXJyYXkobGVuKTtcblx0Zm9yKHZhciBpPTA7IGk8b3V0LmZyYW1lcy5sZW5ndGg7IGkrKylcblx0e1xuXHRcdHZhciBmcm0gPSBvdXQuZnJhbWVzW2ldO1xuXHRcdHZhciBmeD1mcm0ucmVjdC54LCBmeT1mcm0ucmVjdC55LCBmdyA9IGZybS5yZWN0LndpZHRoLCBmaCA9IGZybS5yZWN0LmhlaWdodDtcblx0XHR2YXIgZmRhdGEgPSBVUE5HLnRvUkdCQTguZGVjb2RlSW1hZ2UoZnJtLmRhdGEsIGZ3LGZoLCBvdXQpO1xuXHRcdFxuXHRcdGlmKGkhPTApIGZvcih2YXIgaj0wOyBqPGxlbjsgaisrKSBwcmV2W2pdPWltZ1tqXTtcblx0XHRcblx0XHRpZiAgICAgKGZybS5ibGVuZD09MCkgVVBORy5fY29weVRpbGUoZmRhdGEsIGZ3LCBmaCwgaW1nLCB3LCBoLCBmeCwgZnksIDApO1xuXHRcdGVsc2UgaWYoZnJtLmJsZW5kPT0xKSBVUE5HLl9jb3B5VGlsZShmZGF0YSwgZncsIGZoLCBpbWcsIHcsIGgsIGZ4LCBmeSwgMSk7XG5cdFx0XG5cdFx0ZnJtcy5wdXNoKGltZy5idWZmZXIuc2xpY2UoMCkpO1xuXHRcdFxuXHRcdGlmICAgICAoZnJtLmRpc3Bvc2U9PTApIHt9XG5cdFx0ZWxzZSBpZihmcm0uZGlzcG9zZT09MSkgVVBORy5fY29weVRpbGUoZW1wdHksIGZ3LCBmaCwgaW1nLCB3LCBoLCBmeCwgZnksIDApO1xuXHRcdGVsc2UgaWYoZnJtLmRpc3Bvc2U9PTIpIGZvcih2YXIgaj0wOyBqPGxlbjsgaisrKSBpbWdbal09cHJldltqXTtcblx0fVxuXHRyZXR1cm4gZnJtcztcbn1cblVQTkcudG9SR0JBOC5kZWNvZGVJbWFnZSA9IGZ1bmN0aW9uKGRhdGEsIHcsIGgsIG91dClcbntcblx0dmFyIGFyZWEgPSB3KmgsIGJwcCA9IFVQTkcuZGVjb2RlLl9nZXRCUFAob3V0KTtcblx0dmFyIGJwbCA9IE1hdGguY2VpbCh3KmJwcC84KTtcdC8vIGJ5dGVzIHBlciBsaW5lXG5cblx0dmFyIGJmID0gbmV3IFVpbnQ4QXJyYXkoYXJlYSo0KSwgYmYzMiA9IG5ldyBVaW50MzJBcnJheShiZi5idWZmZXIpO1xuXHR2YXIgY3R5cGUgPSBvdXQuY3R5cGUsIGRlcHRoID0gb3V0LmRlcHRoO1xuXHR2YXIgcnMgPSBVUE5HLl9iaW4ucmVhZFVzaG9ydDtcblx0XG5cdC8vY29uc29sZS5sb2coY3R5cGUsIGRlcHRoKTtcblx0dmFyIHRpbWUgPSBEYXRlLm5vdygpO1xuXG5cdGlmICAgICAoY3R5cGU9PTYpIHsgLy8gUkdCICsgYWxwaGFcblx0XHR2YXIgcWFyZWEgPSBhcmVhPDwyO1xuXHRcdGlmKGRlcHRoPT0gOCkgZm9yKHZhciBpPTA7IGk8cWFyZWE7aSs9NCkgeyAgYmZbaV0gPSBkYXRhW2ldOyAgYmZbaSsxXSA9IGRhdGFbaSsxXTsgIGJmW2krMl0gPSBkYXRhW2krMl07ICBiZltpKzNdID0gZGF0YVtpKzNdOyB9XG5cdFx0aWYoZGVwdGg9PTE2KSBmb3IodmFyIGk9MDsgaTxxYXJlYTtpKysgKSB7ICBiZltpXSA9IGRhdGFbaTw8MV07ICB9XG5cdH1cblx0ZWxzZSBpZihjdHlwZT09Mikge1x0Ly8gUkdCXG5cdFx0dmFyIHRzPW91dC50YWJzW1widFJOU1wiXTtcblx0XHRpZih0cz09bnVsbCkge1xuXHRcdFx0aWYoZGVwdGg9PSA4KSBmb3IodmFyIGk9MDsgaTxhcmVhOyBpKyspIHsgIHZhciB0aT1pKjM7ICBiZjMyW2ldID0gKDI1NTw8MjQpfChkYXRhW3RpKzJdPDwxNil8KGRhdGFbdGkrMV08PDgpfGRhdGFbdGldOyAgfVxuXHRcdFx0aWYoZGVwdGg9PTE2KSBmb3IodmFyIGk9MDsgaTxhcmVhOyBpKyspIHsgIHZhciB0aT1pKjY7ICBiZjMyW2ldID0gKDI1NTw8MjQpfChkYXRhW3RpKzRdPDwxNil8KGRhdGFbdGkrMl08PDgpfGRhdGFbdGldOyAgfVxuXHRcdH1cblx0XHRlbHNlIHsgIHZhciB0cj10c1swXSwgdGc9dHNbMV0sIHRiPXRzWzJdO1xuXHRcdFx0aWYoZGVwdGg9PSA4KSBmb3IodmFyIGk9MDsgaTxhcmVhOyBpKyspIHsgIHZhciBxaT1pPDwyLCB0aT1pKjM7ICBiZjMyW2ldID0gKDI1NTw8MjQpfChkYXRhW3RpKzJdPDwxNil8KGRhdGFbdGkrMV08PDgpfGRhdGFbdGldO1xuXHRcdFx0XHRpZihkYXRhW3RpXSAgID09dHIgJiYgZGF0YVt0aSsxXSAgID09dGcgJiYgZGF0YVt0aSsyXSAgID09dGIpIGJmW3FpKzNdID0gMDsgIH1cblx0XHRcdGlmKGRlcHRoPT0xNikgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7ICB2YXIgcWk9aTw8MiwgdGk9aSo2OyAgYmYzMltpXSA9ICgyNTU8PDI0KXwoZGF0YVt0aSs0XTw8MTYpfChkYXRhW3RpKzJdPDw4KXxkYXRhW3RpXTtcblx0XHRcdFx0aWYocnMoZGF0YSx0aSk9PXRyICYmIHJzKGRhdGEsdGkrMik9PXRnICYmIHJzKGRhdGEsdGkrNCk9PXRiKSBiZltxaSszXSA9IDA7ICB9XG5cdFx0fVxuXHR9XG5cdGVsc2UgaWYoY3R5cGU9PTMpIHtcdC8vIHBhbGV0dGVcblx0XHR2YXIgcD1vdXQudGFic1tcIlBMVEVcIl0sIGFwPW91dC50YWJzW1widFJOU1wiXSwgdGw9YXA/YXAubGVuZ3RoOjA7XG5cdFx0Ly9jb25zb2xlLmxvZyhwLCBhcCk7XG5cdFx0aWYoZGVwdGg9PTEpIGZvcih2YXIgeT0wOyB5PGg7IHkrKykgeyAgdmFyIHMwID0geSpicGwsIHQwID0geSp3O1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8dzsgaSsrKSB7IHZhciBxaT0odDAraSk8PDIsIGo9KChkYXRhW3MwKyhpPj4zKV0+Pig3LSgoaSY3KTw8MCkpKSYgMSksIGNqPTMqajsgIGJmW3FpXT1wW2NqXTsgIGJmW3FpKzFdPXBbY2orMV07ICBiZltxaSsyXT1wW2NqKzJdOyAgYmZbcWkrM109KGo8dGwpP2FwW2pdOjI1NTsgIH1cblx0XHR9XG5cdFx0aWYoZGVwdGg9PTIpIGZvcih2YXIgeT0wOyB5PGg7IHkrKykgeyAgdmFyIHMwID0geSpicGwsIHQwID0geSp3O1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8dzsgaSsrKSB7IHZhciBxaT0odDAraSk8PDIsIGo9KChkYXRhW3MwKyhpPj4yKV0+Pig2LSgoaSYzKTw8MSkpKSYgMyksIGNqPTMqajsgIGJmW3FpXT1wW2NqXTsgIGJmW3FpKzFdPXBbY2orMV07ICBiZltxaSsyXT1wW2NqKzJdOyAgYmZbcWkrM109KGo8dGwpP2FwW2pdOjI1NTsgIH1cblx0XHR9XG5cdFx0aWYoZGVwdGg9PTQpIGZvcih2YXIgeT0wOyB5PGg7IHkrKykgeyAgdmFyIHMwID0geSpicGwsIHQwID0geSp3O1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8dzsgaSsrKSB7IHZhciBxaT0odDAraSk8PDIsIGo9KChkYXRhW3MwKyhpPj4xKV0+Pig0LSgoaSYxKTw8MikpKSYxNSksIGNqPTMqajsgIGJmW3FpXT1wW2NqXTsgIGJmW3FpKzFdPXBbY2orMV07ICBiZltxaSsyXT1wW2NqKzJdOyAgYmZbcWkrM109KGo8dGwpP2FwW2pdOjI1NTsgIH1cblx0XHR9XG5cdFx0aWYoZGVwdGg9PTgpIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKyApIHsgIHZhciBxaT1pPDwyLCBqPWRhdGFbaV0gICAgICAgICAgICAgICAgICAgICAgLCBjaj0zKmo7ICBiZltxaV09cFtjal07ICBiZltxaSsxXT1wW2NqKzFdOyAgYmZbcWkrMl09cFtjaisyXTsgIGJmW3FpKzNdPShqPHRsKT9hcFtqXToyNTU7ICB9XG5cdH1cblx0ZWxzZSBpZihjdHlwZT09NCkge1x0Ly8gZ3JheSArIGFscGhhXG5cdFx0aWYoZGVwdGg9PSA4KSAgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7ICB2YXIgcWk9aTw8MiwgZGk9aTw8MSwgZ3I9ZGF0YVtkaV07ICBiZltxaV09Z3I7ICBiZltxaSsxXT1ncjsgIGJmW3FpKzJdPWdyOyAgYmZbcWkrM109ZGF0YVtkaSsxXTsgIH1cblx0XHRpZihkZXB0aD09MTYpICBmb3IodmFyIGk9MDsgaTxhcmVhOyBpKyspIHsgIHZhciBxaT1pPDwyLCBkaT1pPDwyLCBncj1kYXRhW2RpXTsgIGJmW3FpXT1ncjsgIGJmW3FpKzFdPWdyOyAgYmZbcWkrMl09Z3I7ICBiZltxaSszXT1kYXRhW2RpKzJdOyAgfVxuXHR9XG5cdGVsc2UgaWYoY3R5cGU9PTApIHtcdC8vIGdyYXlcblx0XHR2YXIgdHIgPSBvdXQudGFic1tcInRSTlNcIl0gPyBvdXQudGFic1tcInRSTlNcIl0gOiAtMTtcblx0XHRmb3IodmFyIHk9MDsgeTxoOyB5KyspIHtcblx0XHRcdHZhciBvZmYgPSB5KmJwbCwgdG8gPSB5Knc7XG5cdFx0XHRpZiAgICAgKGRlcHRoPT0gMSkgZm9yKHZhciB4PTA7IHg8dzsgeCsrKSB7ICB2YXIgZ3I9MjU1KigoZGF0YVtvZmYrKHg+Pj4zKV0+Pj4oNyAtKCh4JjcpICAgKSkpJiAxKSwgYWw9KGdyPT10cioyNTUpPzA6MjU1OyAgYmYzMlt0byt4XT0oYWw8PDI0KXwoZ3I8PDE2KXwoZ3I8PDgpfGdyOyAgfVxuXHRcdFx0ZWxzZSBpZihkZXB0aD09IDIpIGZvcih2YXIgeD0wOyB4PHc7IHgrKykgeyAgdmFyIGdyPSA4NSooKGRhdGFbb2ZmKyh4Pj4+MildPj4+KDYgLSgoeCYzKTw8MSkpKSYgMyksIGFsPShncj09dHIqIDg1KT8wOjI1NTsgIGJmMzJbdG8reF09KGFsPDwyNCl8KGdyPDwxNil8KGdyPDw4KXxncjsgIH1cblx0XHRcdGVsc2UgaWYoZGVwdGg9PSA0KSBmb3IodmFyIHg9MDsgeDx3OyB4KyspIHsgIHZhciBncj0gMTcqKChkYXRhW29mZisoeD4+PjEpXT4+Pig0IC0oKHgmMSk8PDIpKSkmMTUpLCBhbD0oZ3I9PXRyKiAxNyk/MDoyNTU7ICBiZjMyW3RvK3hdPShhbDw8MjQpfChncjw8MTYpfChncjw8OCl8Z3I7ICB9XG5cdFx0XHRlbHNlIGlmKGRlcHRoPT0gOCkgZm9yKHZhciB4PTA7IHg8dzsgeCsrKSB7ICB2YXIgZ3I9ZGF0YVtvZmYrICAgICB4XSwgYWw9KGdyICAgICAgICAgICAgICAgICA9PXRyKT8wOjI1NTsgIGJmMzJbdG8reF09KGFsPDwyNCl8KGdyPDwxNil8KGdyPDw4KXxncjsgIH1cblx0XHRcdGVsc2UgaWYoZGVwdGg9PTE2KSBmb3IodmFyIHg9MDsgeDx3OyB4KyspIHsgIHZhciBncj1kYXRhW29mZisoeDw8MSldLCBhbD0ocnMoZGF0YSxvZmYrKHg8PGkpKT09dHIpPzA6MjU1OyAgYmYzMlt0byt4XT0oYWw8PDI0KXwoZ3I8PDE2KXwoZ3I8PDgpfGdyOyAgfVxuXHRcdH1cblx0fVxuXHQvL2NvbnNvbGUubG9nKERhdGUubm93KCktdGltZSk7XG5cdHJldHVybiBiZjtcbn1cblxuXG5cblVQTkcuZGVjb2RlID0gZnVuY3Rpb24oYnVmZilcbntcblx0dmFyIGRhdGEgPSBuZXcgVWludDhBcnJheShidWZmKSwgb2Zmc2V0ID0gOCwgYmluID0gVVBORy5fYmluLCByVXMgPSBiaW4ucmVhZFVzaG9ydCwgclVpID0gYmluLnJlYWRVaW50O1xuXHR2YXIgb3V0ID0ge3RhYnM6e30sIGZyYW1lczpbXX07XG5cdHZhciBkZCA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoKSwgZG9mZiA9IDA7XHQgLy8gcHV0IGFsbCBJREFUIGRhdGEgaW50byBpdFxuXHR2YXIgZmQsIGZvZmYgPSAwO1x0Ly8gZnJhbWVzXG5cdFxuXHR2YXIgbWdjayA9IFsweDg5LCAweDUwLCAweDRlLCAweDQ3LCAweDBkLCAweDBhLCAweDFhLCAweDBhXTtcblx0Zm9yKHZhciBpPTA7IGk8ODsgaSsrKSBpZihkYXRhW2ldIT1tZ2NrW2ldKSB0aHJvdyBcIlRoZSBpbnB1dCBpcyBub3QgYSBQTkcgZmlsZSFcIjtcblxuXHR3aGlsZShvZmZzZXQ8ZGF0YS5sZW5ndGgpXG5cdHtcblx0XHR2YXIgbGVuICA9IGJpbi5yZWFkVWludChkYXRhLCBvZmZzZXQpOyAgb2Zmc2V0ICs9IDQ7XG5cdFx0dmFyIHR5cGUgPSBiaW4ucmVhZEFTQ0lJKGRhdGEsIG9mZnNldCwgNCk7ICBvZmZzZXQgKz0gNDtcblx0XHQvL2NvbnNvbGUubG9nKHR5cGUsbGVuKTtcblx0XHRcblx0XHRpZiAgICAgKHR5cGU9PVwiSUhEUlwiKSAgeyAgVVBORy5kZWNvZGUuX0lIRFIoZGF0YSwgb2Zmc2V0LCBvdXQpOyAgfVxuXHRcdGVsc2UgaWYodHlwZT09XCJJREFUXCIpIHtcblx0XHRcdGZvcih2YXIgaT0wOyBpPGxlbjsgaSsrKSBkZFtkb2ZmK2ldID0gZGF0YVtvZmZzZXQraV07XG5cdFx0XHRkb2ZmICs9IGxlbjtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cImFjVExcIikgIHtcblx0XHRcdG91dC50YWJzW3R5cGVdID0geyAgbnVtX2ZyYW1lczpyVWkoZGF0YSwgb2Zmc2V0KSwgbnVtX3BsYXlzOnJVaShkYXRhLCBvZmZzZXQrNCkgIH07XG5cdFx0XHRmZCA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoKTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cImZjVExcIikgIHtcblx0XHRcdGlmKGZvZmYhPTApIHsgIHZhciBmciA9IG91dC5mcmFtZXNbb3V0LmZyYW1lcy5sZW5ndGgtMV07XG5cdFx0XHRcdGZyLmRhdGEgPSBVUE5HLmRlY29kZS5fZGVjb21wcmVzcyhvdXQsIGZkLnNsaWNlKDAsZm9mZiksIGZyLnJlY3Qud2lkdGgsIGZyLnJlY3QuaGVpZ2h0KTsgIGZvZmY9MDtcblx0XHRcdH1cblx0XHRcdHZhciByY3QgPSB7eDpyVWkoZGF0YSwgb2Zmc2V0KzEyKSx5OnJVaShkYXRhLCBvZmZzZXQrMTYpLHdpZHRoOnJVaShkYXRhLCBvZmZzZXQrNCksaGVpZ2h0OnJVaShkYXRhLCBvZmZzZXQrOCl9O1xuXHRcdFx0dmFyIGRlbCA9IHJVcyhkYXRhLCBvZmZzZXQrMjIpOyAgZGVsID0gclVzKGRhdGEsIG9mZnNldCsyMCkgLyAoZGVsPT0wPzEwMDpkZWwpO1xuXHRcdFx0dmFyIGZybSA9IHtyZWN0OnJjdCwgZGVsYXk6TWF0aC5yb3VuZChkZWwqMTAwMCksIGRpc3Bvc2U6ZGF0YVtvZmZzZXQrMjRdLCBibGVuZDpkYXRhW29mZnNldCsyNV19O1xuXHRcdFx0Ly9jb25zb2xlLmxvZyhmcm0pO1xuXHRcdFx0b3V0LmZyYW1lcy5wdXNoKGZybSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJmZEFUXCIpIHtcblx0XHRcdGZvcih2YXIgaT0wOyBpPGxlbi00OyBpKyspIGZkW2ZvZmYraV0gPSBkYXRhW29mZnNldCtpKzRdO1xuXHRcdFx0Zm9mZiArPSBsZW4tNDtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cInBIWXNcIikge1xuXHRcdFx0b3V0LnRhYnNbdHlwZV0gPSBbYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCksIGJpbi5yZWFkVWludChkYXRhLCBvZmZzZXQrNCksIGRhdGFbb2Zmc2V0KzhdXTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cImNIUk1cIikge1xuXHRcdFx0b3V0LnRhYnNbdHlwZV0gPSBbXTtcblx0XHRcdGZvcih2YXIgaT0wOyBpPDg7IGkrKykgb3V0LnRhYnNbdHlwZV0ucHVzaChiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0K2kqNCkpO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwidEVYdFwiKSB7XG5cdFx0XHRpZihvdXQudGFic1t0eXBlXT09bnVsbCkgb3V0LnRhYnNbdHlwZV0gPSB7fTtcblx0XHRcdHZhciBueiA9IGJpbi5uZXh0WmVybyhkYXRhLCBvZmZzZXQpO1xuXHRcdFx0dmFyIGtleXcgPSBiaW4ucmVhZEFTQ0lJKGRhdGEsIG9mZnNldCwgbnotb2Zmc2V0KTtcblx0XHRcdHZhciB0ZXh0ID0gYmluLnJlYWRBU0NJSShkYXRhLCBueisxLCBvZmZzZXQrbGVuLW56LTEpO1xuXHRcdFx0b3V0LnRhYnNbdHlwZV1ba2V5d10gPSB0ZXh0O1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiaVRYdFwiKSB7XG5cdFx0XHRpZihvdXQudGFic1t0eXBlXT09bnVsbCkgb3V0LnRhYnNbdHlwZV0gPSB7fTtcblx0XHRcdHZhciBueiA9IDAsIG9mZiA9IG9mZnNldDtcblx0XHRcdG56ID0gYmluLm5leHRaZXJvKGRhdGEsIG9mZik7XG5cdFx0XHR2YXIga2V5dyA9IGJpbi5yZWFkQVNDSUkoZGF0YSwgb2ZmLCBuei1vZmYpOyAgb2ZmID0gbnogKyAxO1xuXHRcdFx0dmFyIGNmbGFnID0gZGF0YVtvZmZdLCBjbWV0aCA9IGRhdGFbb2ZmKzFdOyAgb2ZmKz0yO1xuXHRcdFx0bnogPSBiaW4ubmV4dFplcm8oZGF0YSwgb2ZmKTtcblx0XHRcdHZhciBsdGFnID0gYmluLnJlYWRBU0NJSShkYXRhLCBvZmYsIG56LW9mZik7ICBvZmYgPSBueiArIDE7XG5cdFx0XHRueiA9IGJpbi5uZXh0WmVybyhkYXRhLCBvZmYpO1xuXHRcdFx0dmFyIHRrZXl3ID0gYmluLnJlYWRVVEY4KGRhdGEsIG9mZiwgbnotb2ZmKTsgIG9mZiA9IG56ICsgMTtcblx0XHRcdHZhciB0ZXh0ICA9IGJpbi5yZWFkVVRGOChkYXRhLCBvZmYsIGxlbi0ob2ZmLW9mZnNldCkpO1xuXHRcdFx0b3V0LnRhYnNbdHlwZV1ba2V5d10gPSB0ZXh0O1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiUExURVwiKSB7XG5cdFx0XHRvdXQudGFic1t0eXBlXSA9IGJpbi5yZWFkQnl0ZXMoZGF0YSwgb2Zmc2V0LCBsZW4pO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiaElTVFwiKSB7XG5cdFx0XHR2YXIgcGwgPSBvdXQudGFic1tcIlBMVEVcIl0ubGVuZ3RoLzM7XG5cdFx0XHRvdXQudGFic1t0eXBlXSA9IFtdOyAgZm9yKHZhciBpPTA7IGk8cGw7IGkrKykgb3V0LnRhYnNbdHlwZV0ucHVzaChyVXMoZGF0YSwgb2Zmc2V0K2kqMikpO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwidFJOU1wiKSB7XG5cdFx0XHRpZiAgICAgKG91dC5jdHlwZT09Mykgb3V0LnRhYnNbdHlwZV0gPSBiaW4ucmVhZEJ5dGVzKGRhdGEsIG9mZnNldCwgbGVuKTtcblx0XHRcdGVsc2UgaWYob3V0LmN0eXBlPT0wKSBvdXQudGFic1t0eXBlXSA9IHJVcyhkYXRhLCBvZmZzZXQpO1xuXHRcdFx0ZWxzZSBpZihvdXQuY3R5cGU9PTIpIG91dC50YWJzW3R5cGVdID0gWyByVXMoZGF0YSxvZmZzZXQpLHJVcyhkYXRhLG9mZnNldCsyKSxyVXMoZGF0YSxvZmZzZXQrNCkgXTtcblx0XHRcdC8vZWxzZSBjb25zb2xlLmxvZyhcInRSTlMgZm9yIHVuc3VwcG9ydGVkIGNvbG9yIHR5cGVcIixvdXQuY3R5cGUsIGxlbik7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJnQU1BXCIpIG91dC50YWJzW3R5cGVdID0gYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCkvMTAwMDAwO1xuXHRcdGVsc2UgaWYodHlwZT09XCJzUkdCXCIpIG91dC50YWJzW3R5cGVdID0gZGF0YVtvZmZzZXRdO1xuXHRcdGVsc2UgaWYodHlwZT09XCJiS0dEXCIpXG5cdFx0e1xuXHRcdFx0aWYgICAgIChvdXQuY3R5cGU9PTAgfHwgb3V0LmN0eXBlPT00KSBvdXQudGFic1t0eXBlXSA9IFtyVXMoZGF0YSwgb2Zmc2V0KV07XG5cdFx0XHRlbHNlIGlmKG91dC5jdHlwZT09MiB8fCBvdXQuY3R5cGU9PTYpIG91dC50YWJzW3R5cGVdID0gW3JVcyhkYXRhLCBvZmZzZXQpLCByVXMoZGF0YSwgb2Zmc2V0KzIpLCByVXMoZGF0YSwgb2Zmc2V0KzQpXTtcblx0XHRcdGVsc2UgaWYob3V0LmN0eXBlPT0zKSBvdXQudGFic1t0eXBlXSA9IGRhdGFbb2Zmc2V0XTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cIklFTkRcIikge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdC8vZWxzZSB7ICBsb2coXCJ1bmtub3duIGNodW5rIHR5cGVcIiwgdHlwZSwgbGVuKTsgIH1cblx0XHRvZmZzZXQgKz0gbGVuO1xuXHRcdHZhciBjcmMgPSBiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KTsgIG9mZnNldCArPSA0O1xuXHR9XG5cdGlmKGZvZmYhPTApIHsgIHZhciBmciA9IG91dC5mcmFtZXNbb3V0LmZyYW1lcy5sZW5ndGgtMV07XG5cdFx0ZnIuZGF0YSA9IFVQTkcuZGVjb2RlLl9kZWNvbXByZXNzKG91dCwgZmQuc2xpY2UoMCxmb2ZmKSwgZnIucmVjdC53aWR0aCwgZnIucmVjdC5oZWlnaHQpOyAgZm9mZj0wO1xuXHR9XHRcblx0b3V0LmRhdGEgPSBVUE5HLmRlY29kZS5fZGVjb21wcmVzcyhvdXQsIGRkLCBvdXQud2lkdGgsIG91dC5oZWlnaHQpO1xuXHRcblx0ZGVsZXRlIG91dC5jb21wcmVzczsgIGRlbGV0ZSBvdXQuaW50ZXJsYWNlOyAgZGVsZXRlIG91dC5maWx0ZXI7XG5cdHJldHVybiBvdXQ7XG59XG5cblVQTkcuZGVjb2RlLl9kZWNvbXByZXNzID0gZnVuY3Rpb24ob3V0LCBkZCwgdywgaCkge1xuXHR2YXIgdGltZSA9IERhdGUubm93KCk7XG5cdHZhciBicHAgPSBVUE5HLmRlY29kZS5fZ2V0QlBQKG91dCksIGJwbCA9IE1hdGguY2VpbCh3KmJwcC84KSwgYnVmZiA9IG5ldyBVaW50OEFycmF5KChicGwrMStvdXQuaW50ZXJsYWNlKSpoKTtcblx0ZGQgPSBVUE5HLmRlY29kZS5faW5mbGF0ZShkZCxidWZmKTtcblx0Ly9jb25zb2xlLmxvZyhkZC5sZW5ndGgsIGJ1ZmYubGVuZ3RoKTtcblx0Ly9jb25zb2xlLmxvZyhEYXRlLm5vdygpLXRpbWUpO1xuXG5cdHZhciB0aW1lPURhdGUubm93KCk7XG5cdGlmICAgICAob3V0LmludGVybGFjZT09MCkgZGQgPSBVUE5HLmRlY29kZS5fZmlsdGVyWmVybyhkZCwgb3V0LCAwLCB3LCBoKTtcblx0ZWxzZSBpZihvdXQuaW50ZXJsYWNlPT0xKSBkZCA9IFVQTkcuZGVjb2RlLl9yZWFkSW50ZXJsYWNlKGRkLCBvdXQpO1xuXHQvL2NvbnNvbGUubG9nKERhdGUubm93KCktdGltZSk7XG5cdHJldHVybiBkZDtcbn1cblxuVVBORy5kZWNvZGUuX2luZmxhdGUgPSBmdW5jdGlvbihkYXRhLCBidWZmKSB7ICB2YXIgb3V0PVVQTkdbXCJpbmZsYXRlUmF3XCJdKG5ldyBVaW50OEFycmF5KGRhdGEuYnVmZmVyLCAyLGRhdGEubGVuZ3RoLTYpLGJ1ZmYpOyAgcmV0dXJuIG91dDsgIH1cblVQTkcuaW5mbGF0ZVJhdz1mdW5jdGlvbigpe3ZhciBIPXt9O0guSD17fTtILkguTj1mdW5jdGlvbihOLFcpe3ZhciBSPVVpbnQ4QXJyYXksaT0wLG09MCxKPTAsaD0wLFE9MCxYPTAsdT0wLHc9MCxkPTAsdixDO1xuaWYoTlswXT09MyYmTlsxXT09MClyZXR1cm4gVz9XOm5ldyBSKDApO3ZhciBWPUguSCxuPVYuYixBPVYuZSxsPVYuUixNPVYubixJPVYuQSxlPVYuWixiPVYubSxaPVc9PW51bGw7XG5pZihaKVc9bmV3IFIoTi5sZW5ndGg+Pj4yPDwzKTt3aGlsZShpPT0wKXtpPW4oTixkLDEpO209bihOLGQrMSwyKTtkKz0zO2lmKG09PTApe2lmKChkJjcpIT0wKWQrPTgtKGQmNyk7XG52YXIgRD0oZD4+PjMpKzQscT1OW0QtNF18TltELTNdPDw4O2lmKFopVz1ILkguVyhXLHcrcSk7Vy5zZXQobmV3IFIoTi5idWZmZXIsTi5ieXRlT2Zmc2V0K0QscSksdyk7ZD1EK3E8PDM7XG53Kz1xO2NvbnRpbnVlfWlmKFopVz1ILkguVyhXLHcrKDE8PDE3KSk7aWYobT09MSl7dj1iLko7Qz1iLmg7WD0oMTw8OSktMTt1PSgxPDw1KS0xfWlmKG09PTIpe0o9QShOLGQsNSkrMjU3O1xuaD1BKE4sZCs1LDUpKzE7UT1BKE4sZCsxMCw0KSs0O2QrPTE0O3ZhciBFPWQsaj0xO2Zvcih2YXIgYz0wO2M8Mzg7Yys9Mil7Yi5RW2NdPTA7Yi5RW2MrMV09MH1mb3IodmFyIGM9MDtcbmM8UTtjKyspe3ZhciBLPUEoTixkK2MqMywzKTtiLlFbKGIuWFtjXTw8MSkrMV09SztpZihLPmopaj1LfWQrPTMqUTtNKGIuUSxqKTtJKGIuUSxqLGIudSk7dj1iLnc7Qz1iLmQ7XG5kPWwoYi51LCgxPDxqKS0xLEoraCxOLGQsYi52KTt2YXIgcj1WLlYoYi52LDAsSixiLkMpO1g9KDE8PHIpLTE7dmFyIFM9Vi5WKGIudixKLGgsYi5EKTt1PSgxPDxTKS0xO00oYi5DLHIpO1xuSShiLkMscix2KTtNKGIuRCxTKTtJKGIuRCxTLEMpfXdoaWxlKCEwKXt2YXIgVD12W2UoTixkKSZYXTtkKz1UJjE1O3ZhciBwPVQ+Pj40O2lmKHA+Pj44PT0wKXtXW3crK109cH1lbHNlIGlmKHA9PTI1Nil7YnJlYWt9ZWxzZXt2YXIgej13K3AtMjU0O1xuaWYocD4yNjQpe3ZhciBfPWIucVtwLTI1N107ej13KyhfPj4+MykrQShOLGQsXyY3KTtkKz1fJjd9dmFyICQ9Q1tlKE4sZCkmdV07ZCs9JCYxNTt2YXIgcz0kPj4+NCxZPWIuY1tzXSxhPShZPj4+NCkrbihOLGQsWSYxNSk7XG5kKz1ZJjE1O3doaWxlKHc8eil7V1t3XT1XW3crKy1hXTtXW3ddPVdbdysrLWFdO1dbd109V1t3KystYV07V1t3XT1XW3crKy1hXX13PXp9fX1yZXR1cm4gVy5sZW5ndGg9PXc/VzpXLnNsaWNlKDAsdyl9O1xuSC5ILlc9ZnVuY3Rpb24oTixXKXt2YXIgUj1OLmxlbmd0aDtpZihXPD1SKXJldHVybiBOO3ZhciBWPW5ldyBVaW50OEFycmF5KFI8PDEpO1Yuc2V0KE4sMCk7cmV0dXJuIFZ9O1xuSC5ILlI9ZnVuY3Rpb24oTixXLFIsVixuLEEpe3ZhciBsPUguSC5lLE09SC5ILlosST0wO3doaWxlKEk8Uil7dmFyIGU9TltNKFYsbikmV107bis9ZSYxNTt2YXIgYj1lPj4+NDtcbmlmKGI8PTE1KXtBW0ldPWI7SSsrfWVsc2V7dmFyIFo9MCxtPTA7aWYoYj09MTYpe209MytsKFYsbiwyKTtuKz0yO1o9QVtJLTFdfWVsc2UgaWYoYj09MTcpe209MytsKFYsbiwzKTtcbm4rPTN9ZWxzZSBpZihiPT0xOCl7bT0xMStsKFYsbiw3KTtuKz03fXZhciBKPUkrbTt3aGlsZShJPEope0FbSV09WjtJKyt9fX1yZXR1cm4gbn07SC5ILlY9ZnVuY3Rpb24oTixXLFIsVil7dmFyIG49MCxBPTAsbD1WLmxlbmd0aD4+PjE7XG53aGlsZShBPFIpe3ZhciBNPU5bQStXXTtWW0E8PDFdPTA7VlsoQTw8MSkrMV09TTtpZihNPm4pbj1NO0ErK313aGlsZShBPGwpe1ZbQTw8MV09MDtWWyhBPDwxKSsxXT0wO0ErK31yZXR1cm4gbn07XG5ILkgubj1mdW5jdGlvbihOLFcpe3ZhciBSPUguSC5tLFY9Ti5sZW5ndGgsbixBLGwsTSxJLGU9Ui5qO2Zvcih2YXIgTT0wO008PVc7TSsrKWVbTV09MDtmb3IoTT0xO008VjtNKz0yKWVbTltNXV0rKztcbnZhciBiPVIuSztuPTA7ZVswXT0wO2ZvcihBPTE7QTw9VztBKyspe249bitlW0EtMV08PDE7YltBXT1ufWZvcihsPTA7bDxWO2wrPTIpe0k9TltsKzFdO2lmKEkhPTApe05bbF09YltJXTtcbmJbSV0rK319fTtILkguQT1mdW5jdGlvbihOLFcsUil7dmFyIFY9Ti5sZW5ndGgsbj1ILkgubSxBPW4ucjtmb3IodmFyIGw9MDtsPFY7bCs9MilpZihOW2wrMV0hPTApe3ZhciBNPWw+PjEsST1OW2wrMV0sZT1NPDw0fEksYj1XLUksWj1OW2xdPDxiLG09WisoMTw8Yik7XG53aGlsZShaIT1tKXt2YXIgSj1BW1pdPj4+MTUtVztSW0pdPWU7WisrfX19O0guSC5sPWZ1bmN0aW9uKE4sVyl7dmFyIFI9SC5ILm0ucixWPTE1LVc7Zm9yKHZhciBuPTA7bjxOLmxlbmd0aDtcbm4rPTIpe3ZhciBBPU5bbl08PFctTltuKzFdO05bbl09UltBXT4+PlZ9fTtILkguTT1mdW5jdGlvbihOLFcsUil7Uj1SPDwoVyY3KTt2YXIgVj1XPj4+MztOW1ZdfD1SO05bVisxXXw9Uj4+Pjh9O1xuSC5ILkk9ZnVuY3Rpb24oTixXLFIpe1I9Ujw8KFcmNyk7dmFyIFY9Vz4+PjM7TltWXXw9UjtOW1YrMV18PVI+Pj44O05bVisyXXw9Uj4+PjE2fTtILkguZT1mdW5jdGlvbihOLFcsUil7cmV0dXJuKE5bVz4+PjNdfE5bKFc+Pj4zKSsxXTw8OCk+Pj4oVyY3KSYoMTw8UiktMX07XG5ILkguYj1mdW5jdGlvbihOLFcsUil7cmV0dXJuKE5bVz4+PjNdfE5bKFc+Pj4zKSsxXTw8OHxOWyhXPj4+MykrMl08PDE2KT4+PihXJjcpJigxPDxSKS0xfTtILkguWj1mdW5jdGlvbihOLFcpe3JldHVybihOW1c+Pj4zXXxOWyhXPj4+MykrMV08PDh8TlsoVz4+PjMpKzJdPDwxNik+Pj4oVyY3KX07XG5ILkguaT1mdW5jdGlvbihOLFcpe3JldHVybihOW1c+Pj4zXXxOWyhXPj4+MykrMV08PDh8TlsoVz4+PjMpKzJdPDwxNnxOWyhXPj4+MykrM108PDI0KT4+PihXJjcpfTtILkgubT1mdW5jdGlvbigpe3ZhciBOPVVpbnQxNkFycmF5LFc9VWludDMyQXJyYXk7XG5yZXR1cm57SzpuZXcgTigxNiksajpuZXcgTigxNiksWDpbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sUzpbMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCw5OTksOTk5LDk5OV0sVDpbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwLDAsMCwwXSxxOm5ldyBOKDMyKSxwOlsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsNjU1MzUsNjU1MzVdLHo6WzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMCwwXSxjOm5ldyBXKDMyKSxKOm5ldyBOKDUxMiksXzpbXSxoOm5ldyBOKDMyKSwkOltdLHc6bmV3IE4oMzI3NjgpLEM6W10sdjpbXSxkOm5ldyBOKDMyNzY4KSxEOltdLHU6bmV3IE4oNTEyKSxROltdLHI6bmV3IE4oMTw8MTUpLHM6bmV3IFcoMjg2KSxZOm5ldyBXKDMwKSxhOm5ldyBXKDE5KSx0Om5ldyBXKDE1ZTMpLGs6bmV3IE4oMTw8MTYpLGc6bmV3IE4oMTw8MTUpfX0oKTtcbihmdW5jdGlvbigpe3ZhciBOPUguSC5tLFc9MTw8MTU7Zm9yKHZhciBSPTA7UjxXO1IrKyl7dmFyIFY9UjtWPShWJjI4NjMzMTE1MzApPj4+MXwoViYxNDMxNjU1NzY1KTw8MTtcblY9KFYmMzQzNTk3MzgzNik+Pj4yfChWJjg1ODk5MzQ1OSk8PDI7Vj0oViY0MDQyMzIyMTYwKT4+PjR8KFYmMjUyNjQ1MTM1KTw8NDtWPShWJjQyNzgyNTUzNjApPj4+OHwoViYxNjcxMTkzNSk8PDg7XG5OLnJbUl09KFY+Pj4xNnxWPDwxNik+Pj4xN31mdW5jdGlvbiBuKEEsbCxNKXt3aGlsZShsLS0hPTApQS5wdXNoKDAsTSl9Zm9yKHZhciBSPTA7UjwzMjtSKyspe04ucVtSXT1OLlNbUl08PDN8Ti5UW1JdO1xuTi5jW1JdPU4ucFtSXTw8NHxOLnpbUl19bihOLl8sMTQ0LDgpO24oTi5fLDI1NS0xNDMsOSk7bihOLl8sMjc5LTI1NSw3KTtuKE4uXywyODctMjc5LDgpO0guSC5uKE4uXyw5KTtcbkguSC5BKE4uXyw5LE4uSik7SC5ILmwoTi5fLDkpO24oTi4kLDMyLDUpO0guSC5uKE4uJCw1KTtILkguQShOLiQsNSxOLmgpO0guSC5sKE4uJCw1KTtuKE4uUSwxOSwwKTtuKE4uQywyODYsMCk7XG5uKE4uRCwzMCwwKTtuKE4udiwzMjAsMCl9KCkpO3JldHVybiBILkguTn0oKVxuXG5cblVQTkcuZGVjb2RlLl9yZWFkSW50ZXJsYWNlID0gZnVuY3Rpb24oZGF0YSwgb3V0KVxue1xuXHR2YXIgdyA9IG91dC53aWR0aCwgaCA9IG91dC5oZWlnaHQ7XG5cdHZhciBicHAgPSBVUE5HLmRlY29kZS5fZ2V0QlBQKG91dCksIGNicHAgPSBicHA+PjMsIGJwbCA9IE1hdGguY2VpbCh3KmJwcC84KTtcblx0dmFyIGltZyA9IG5ldyBVaW50OEFycmF5KCBoICogYnBsICk7XG5cdHZhciBkaSA9IDA7XG5cblx0dmFyIHN0YXJ0aW5nX3JvdyAgPSBbIDAsIDAsIDQsIDAsIDIsIDAsIDEgXTtcblx0dmFyIHN0YXJ0aW5nX2NvbCAgPSBbIDAsIDQsIDAsIDIsIDAsIDEsIDAgXTtcblx0dmFyIHJvd19pbmNyZW1lbnQgPSBbIDgsIDgsIDgsIDQsIDQsIDIsIDIgXTtcblx0dmFyIGNvbF9pbmNyZW1lbnQgPSBbIDgsIDgsIDQsIDQsIDIsIDIsIDEgXTtcblxuXHR2YXIgcGFzcz0wO1xuXHR3aGlsZShwYXNzPDcpXG5cdHtcblx0XHR2YXIgcmkgPSByb3dfaW5jcmVtZW50W3Bhc3NdLCBjaSA9IGNvbF9pbmNyZW1lbnRbcGFzc107XG5cdFx0dmFyIHN3ID0gMCwgc2ggPSAwO1xuXHRcdHZhciBjciA9IHN0YXJ0aW5nX3Jvd1twYXNzXTsgIHdoaWxlKGNyPGgpIHsgIGNyKz1yaTsgIHNoKys7ICB9XG5cdFx0dmFyIGNjID0gc3RhcnRpbmdfY29sW3Bhc3NdOyAgd2hpbGUoY2M8dykgeyAgY2MrPWNpOyAgc3crKzsgIH1cblx0XHR2YXIgYnBsbCA9IE1hdGguY2VpbChzdypicHAvOCk7XG5cdFx0VVBORy5kZWNvZGUuX2ZpbHRlclplcm8oZGF0YSwgb3V0LCBkaSwgc3csIHNoKTtcblxuXHRcdHZhciB5PTAsIHJvdyA9IHN0YXJ0aW5nX3Jvd1twYXNzXTtcblx0XHR3aGlsZShyb3c8aClcblx0XHR7XG5cdFx0XHR2YXIgY29sID0gc3RhcnRpbmdfY29sW3Bhc3NdO1xuXHRcdFx0dmFyIGNkaSA9IChkaSt5KmJwbGwpPDwzO1xuXG5cdFx0XHR3aGlsZShjb2w8dylcblx0XHRcdHtcblx0XHRcdFx0aWYoYnBwPT0xKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGRhdGFbY2RpPj4zXTsgIHZhbCA9ICh2YWw+Pig3LShjZGkmNykpKSYxO1xuXHRcdFx0XHRcdGltZ1tyb3cqYnBsICsgKGNvbD4+MyldIHw9ICh2YWwgPDwgKDctKChjb2wmNyk8PDApKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoYnBwPT0yKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGRhdGFbY2RpPj4zXTsgIHZhbCA9ICh2YWw+Pig2LShjZGkmNykpKSYzO1xuXHRcdFx0XHRcdGltZ1tyb3cqYnBsICsgKGNvbD4+MildIHw9ICh2YWwgPDwgKDYtKChjb2wmMyk8PDEpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoYnBwPT00KSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGRhdGFbY2RpPj4zXTsgIHZhbCA9ICh2YWw+Pig0LShjZGkmNykpKSYxNTtcblx0XHRcdFx0XHRpbWdbcm93KmJwbCArIChjb2w+PjEpXSB8PSAodmFsIDw8ICg0LSgoY29sJjEpPDwyKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKGJwcD49OCkge1xuXHRcdFx0XHRcdHZhciBpaSA9IHJvdypicGwrY29sKmNicHA7XG5cdFx0XHRcdFx0Zm9yKHZhciBqPTA7IGo8Y2JwcDsgaisrKSBpbWdbaWkral0gPSBkYXRhWyhjZGk+PjMpK2pdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNkaSs9YnBwOyAgY29sKz1jaTtcblx0XHRcdH1cblx0XHRcdHkrKzsgIHJvdyArPSByaTtcblx0XHR9XG5cdFx0aWYoc3cqc2ghPTApIGRpICs9IHNoICogKDEgKyBicGxsKTtcblx0XHRwYXNzID0gcGFzcyArIDE7XG5cdH1cblx0cmV0dXJuIGltZztcbn1cblxuVVBORy5kZWNvZGUuX2dldEJQUCA9IGZ1bmN0aW9uKG91dCkge1xuXHR2YXIgbm9jID0gWzEsbnVsbCwzLDEsMixudWxsLDRdW291dC5jdHlwZV07XG5cdHJldHVybiBub2MgKiBvdXQuZGVwdGg7XG59XG5cblVQTkcuZGVjb2RlLl9maWx0ZXJaZXJvID0gZnVuY3Rpb24oZGF0YSwgb3V0LCBvZmYsIHcsIGgpXG57XG5cdHZhciBicHAgPSBVUE5HLmRlY29kZS5fZ2V0QlBQKG91dCksIGJwbCA9IE1hdGguY2VpbCh3KmJwcC84KSwgcGFldGggPSBVUE5HLmRlY29kZS5fcGFldGg7XG5cdGJwcCA9IE1hdGguY2VpbChicHAvOCk7XG5cdFxuXHR2YXIgaT0wLCBkaT0xLCB0eXBlPWRhdGFbb2ZmXSwgeD0wO1xuXHRcblx0aWYodHlwZT4xKSBkYXRhW29mZl09WzAsMCwxXVt0eXBlLTJdOyAgXG5cdGlmKHR5cGU9PTMpIGZvcih4PWJwcDsgeDxicGw7IHgrKykgZGF0YVt4KzFdID0gKGRhdGFbeCsxXSArIChkYXRhW3grMS1icHBdPj4+MSkgKSYyNTU7XG5cblx0Zm9yKHZhciB5PTA7IHk8aDsgeSsrKSAge1xuXHRcdGkgPSBvZmYreSpicGw7IGRpID0gaSt5KzE7XG5cdFx0dHlwZSA9IGRhdGFbZGktMV07IHg9MDtcblxuXHRcdGlmICAgICAodHlwZT09MCkgICBmb3IoOyB4PGJwbDsgeCsrKSBkYXRhW2kreF0gPSBkYXRhW2RpK3hdO1xuXHRcdGVsc2UgaWYodHlwZT09MSkgeyBmb3IoOyB4PGJwcDsgeCsrKSBkYXRhW2kreF0gPSBkYXRhW2RpK3hdO1xuXHRcdFx0XHRcdFx0ICAgZm9yKDsgeDxicGw7IHgrKykgZGF0YVtpK3hdID0gKGRhdGFbZGkreF0gKyBkYXRhW2kreC1icHBdKTsgIH1cblx0XHRlbHNlIGlmKHR5cGU9PTIpIHsgZm9yKDsgeDxicGw7IHgrKykgZGF0YVtpK3hdID0gKGRhdGFbZGkreF0gKyBkYXRhW2kreC1icGxdKTsgIH1cblx0XHRlbHNlIGlmKHR5cGU9PTMpIHsgZm9yKDsgeDxicHA7IHgrKykgZGF0YVtpK3hdID0gKGRhdGFbZGkreF0gKyAoIGRhdGFbaSt4LWJwbF0+Pj4xKSk7XG5cdFx0XHQgICAgICAgICAgICAgICBmb3IoOyB4PGJwbDsgeCsrKSBkYXRhW2kreF0gPSAoZGF0YVtkaSt4XSArICgoZGF0YVtpK3gtYnBsXStkYXRhW2kreC1icHBdKT4+PjEpICk7ICB9XG5cdFx0ZWxzZSAgICAgICAgICAgICB7IGZvcig7IHg8YnBwOyB4KyspIGRhdGFbaSt4XSA9IChkYXRhW2RpK3hdICsgcGFldGgoMCwgZGF0YVtpK3gtYnBsXSwgMCkpO1xuXHRcdFx0XHRcdFx0ICAgZm9yKDsgeDxicGw7IHgrKykgZGF0YVtpK3hdID0gKGRhdGFbZGkreF0gKyBwYWV0aChkYXRhW2kreC1icHBdLCBkYXRhW2kreC1icGxdLCBkYXRhW2kreC1icHAtYnBsXSkgKTsgIH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxuVVBORy5kZWNvZGUuX3BhZXRoID0gZnVuY3Rpb24oYSxiLGMpXG57XG5cdHZhciBwID0gYStiLWMsIHBhID0gKHAtYSksIHBiID0gKHAtYiksIHBjID0gKHAtYyk7XG5cdGlmIChwYSpwYSA8PSBwYipwYiAmJiBwYSpwYSA8PSBwYypwYykgIHJldHVybiBhO1xuXHRlbHNlIGlmIChwYipwYiA8PSBwYypwYykgIHJldHVybiBiO1xuXHRyZXR1cm4gYztcbn1cblxuVVBORy5kZWNvZGUuX0lIRFIgPSBmdW5jdGlvbihkYXRhLCBvZmZzZXQsIG91dClcbntcblx0dmFyIGJpbiA9IFVQTkcuX2Jpbjtcblx0b3V0LndpZHRoICA9IGJpbi5yZWFkVWludChkYXRhLCBvZmZzZXQpOyAgb2Zmc2V0ICs9IDQ7XG5cdG91dC5oZWlnaHQgPSBiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KTsgIG9mZnNldCArPSA0O1xuXHRvdXQuZGVwdGggICAgID0gZGF0YVtvZmZzZXRdOyAgb2Zmc2V0Kys7XG5cdG91dC5jdHlwZSAgICAgPSBkYXRhW29mZnNldF07ICBvZmZzZXQrKztcblx0b3V0LmNvbXByZXNzICA9IGRhdGFbb2Zmc2V0XTsgIG9mZnNldCsrO1xuXHRvdXQuZmlsdGVyICAgID0gZGF0YVtvZmZzZXRdOyAgb2Zmc2V0Kys7XG5cdG91dC5pbnRlcmxhY2UgPSBkYXRhW29mZnNldF07ICBvZmZzZXQrKztcbn1cblxuVVBORy5fYmluID0ge1xuXHRuZXh0WmVybyAgIDogZnVuY3Rpb24oZGF0YSxwKSAgeyAgd2hpbGUoZGF0YVtwXSE9MCkgcCsrOyAgcmV0dXJuIHA7ICB9LFxuXHRyZWFkVXNob3J0IDogZnVuY3Rpb24oYnVmZixwKSAgeyAgcmV0dXJuIChidWZmW3BdPDwgOCkgfCBidWZmW3ArMV07ICB9LFxuXHR3cml0ZVVzaG9ydDogZnVuY3Rpb24oYnVmZixwLG4peyAgYnVmZltwXSA9IChuPj44KSYyNTU7ICBidWZmW3ArMV0gPSBuJjI1NTsgIH0sXG5cdHJlYWRVaW50ICAgOiBmdW5jdGlvbihidWZmLHApICB7ICByZXR1cm4gKGJ1ZmZbcF0qKDI1NioyNTYqMjU2KSkgKyAoKGJ1ZmZbcCsxXTw8MTYpIHwgKGJ1ZmZbcCsyXTw8IDgpIHwgYnVmZltwKzNdKTsgIH0sXG5cdHdyaXRlVWludCAgOiBmdW5jdGlvbihidWZmLHAsbil7ICBidWZmW3BdPShuPj4yNCkmMjU1OyAgYnVmZltwKzFdPShuPj4xNikmMjU1OyAgYnVmZltwKzJdPShuPj44KSYyNTU7ICBidWZmW3ArM109biYyNTU7ICB9LFxuXHRyZWFkQVNDSUkgIDogZnVuY3Rpb24oYnVmZixwLGwpeyAgdmFyIHMgPSBcIlwiOyAgZm9yKHZhciBpPTA7IGk8bDsgaSsrKSBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmZltwK2ldKTsgIHJldHVybiBzOyAgICB9LFxuXHR3cml0ZUFTQ0lJIDogZnVuY3Rpb24oZGF0YSxwLHMpeyAgZm9yKHZhciBpPTA7IGk8cy5sZW5ndGg7IGkrKykgZGF0YVtwK2ldID0gcy5jaGFyQ29kZUF0KGkpOyAgfSxcblx0cmVhZEJ5dGVzICA6IGZ1bmN0aW9uKGJ1ZmYscCxsKXsgIHZhciBhcnIgPSBbXTsgICBmb3IodmFyIGk9MDsgaTxsOyBpKyspIGFyci5wdXNoKGJ1ZmZbcCtpXSk7ICAgcmV0dXJuIGFycjsgIH0sXG5cdHBhZCA6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4ubGVuZ3RoIDwgMiA/IFwiMFwiICsgbiA6IG47IH0sXG5cdHJlYWRVVEY4IDogZnVuY3Rpb24oYnVmZiwgcCwgbCkge1xuXHRcdHZhciBzID0gXCJcIiwgbnM7XG5cdFx0Zm9yKHZhciBpPTA7IGk8bDsgaSsrKSBzICs9IFwiJVwiICsgVVBORy5fYmluLnBhZChidWZmW3AraV0udG9TdHJpbmcoMTYpKTtcblx0XHR0cnkgeyAgbnMgPSBkZWNvZGVVUklDb21wb25lbnQocyk7IH1cblx0XHRjYXRjaChlKSB7ICByZXR1cm4gVVBORy5fYmluLnJlYWRBU0NJSShidWZmLCBwLCBsKTsgIH1cblx0XHRyZXR1cm4gIG5zO1xuXHR9XG59XG5VUE5HLl9jb3B5VGlsZSA9IGZ1bmN0aW9uKHNiLCBzdywgc2gsIHRiLCB0dywgdGgsIHhvZmYsIHlvZmYsIG1vZGUpXG57XG5cdHZhciB3ID0gTWF0aC5taW4oc3csdHcpLCBoID0gTWF0aC5taW4oc2gsdGgpO1xuXHR2YXIgc2k9MCwgdGk9MDtcblx0Zm9yKHZhciB5PTA7IHk8aDsgeSsrKVxuXHRcdGZvcih2YXIgeD0wOyB4PHc7IHgrKylcblx0XHR7XG5cdFx0XHRpZih4b2ZmPj0wICYmIHlvZmY+PTApIHsgIHNpID0gKHkqc3creCk8PDI7ICB0aSA9ICgoIHlvZmYreSkqdHcreG9mZit4KTw8MjsgIH1cblx0XHRcdGVsc2UgICAgICAgICAgICAgICAgICAgeyAgc2kgPSAoKC15b2ZmK3kpKnN3LXhvZmYreCk8PDI7ICB0aSA9ICh5KnR3K3gpPDwyOyAgfVxuXHRcdFx0XG5cdFx0XHRpZiAgICAgKG1vZGU9PTApIHsgIHRiW3RpXSA9IHNiW3NpXTsgIHRiW3RpKzFdID0gc2Jbc2krMV07ICB0Ylt0aSsyXSA9IHNiW3NpKzJdOyAgdGJbdGkrM10gPSBzYltzaSszXTsgIH1cblx0XHRcdGVsc2UgaWYobW9kZT09MSkge1xuXHRcdFx0XHR2YXIgZmEgPSBzYltzaSszXSooMS8yNTUpLCBmcj1zYltzaV0qZmEsIGZnPXNiW3NpKzFdKmZhLCBmYj1zYltzaSsyXSpmYTsgXG5cdFx0XHRcdHZhciBiYSA9IHRiW3RpKzNdKigxLzI1NSksIGJyPXRiW3RpXSpiYSwgYmc9dGJbdGkrMV0qYmEsIGJiPXRiW3RpKzJdKmJhOyBcblx0XHRcdFx0XG5cdFx0XHRcdHZhciBpZmE9MS1mYSwgb2EgPSBmYStiYSppZmEsIGlvYSA9IChvYT09MD8wOjEvb2EpO1xuXHRcdFx0XHR0Ylt0aSszXSA9IDI1NSpvYTsgIFxuXHRcdFx0XHR0Ylt0aSswXSA9IChmciticippZmEpKmlvYTsgIFxuXHRcdFx0XHR0Ylt0aSsxXSA9IChmZytiZyppZmEpKmlvYTsgICBcblx0XHRcdFx0dGJbdGkrMl0gPSAoZmIrYmIqaWZhKSppb2E7ICBcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYobW9kZT09Mil7XHQvLyBjb3B5IG9ubHkgZGlmZmVyZW5jZXMsIG90aGVyd2lzZSB6ZXJvXG5cdFx0XHRcdHZhciBmYSA9IHNiW3NpKzNdLCBmcj1zYltzaV0sIGZnPXNiW3NpKzFdLCBmYj1zYltzaSsyXTsgXG5cdFx0XHRcdHZhciBiYSA9IHRiW3RpKzNdLCBicj10Ylt0aV0sIGJnPXRiW3RpKzFdLCBiYj10Ylt0aSsyXTsgXG5cdFx0XHRcdGlmKGZhPT1iYSAmJiBmcj09YnIgJiYgZmc9PWJnICYmIGZiPT1iYikgeyAgdGJbdGldPTA7ICB0Ylt0aSsxXT0wOyAgdGJbdGkrMl09MDsgIHRiW3RpKzNdPTA7ICB9XG5cdFx0XHRcdGVsc2UgeyAgdGJbdGldPWZyOyAgdGJbdGkrMV09Zmc7ICB0Ylt0aSsyXT1mYjsgIHRiW3RpKzNdPWZhOyAgfVxuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZihtb2RlPT0zKXtcdC8vIGNoZWNrIGlmIGNhbiBiZSBibGVuZGVkXG5cdFx0XHRcdHZhciBmYSA9IHNiW3NpKzNdLCBmcj1zYltzaV0sIGZnPXNiW3NpKzFdLCBmYj1zYltzaSsyXTsgXG5cdFx0XHRcdHZhciBiYSA9IHRiW3RpKzNdLCBicj10Ylt0aV0sIGJnPXRiW3RpKzFdLCBiYj10Ylt0aSsyXTsgXG5cdFx0XHRcdGlmKGZhPT1iYSAmJiBmcj09YnIgJiYgZmc9PWJnICYmIGZiPT1iYikgY29udGludWU7XG5cdFx0XHRcdC8vaWYoZmEhPTI1NSAmJiBiYSE9MCkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRpZihmYTwyMjAgJiYgYmE+MjApIHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5cblxuXG5VUE5HLmVuY29kZSA9IGZ1bmN0aW9uKGJ1ZnMsIHcsIGgsIHBzLCBkZWxzLCB0YWJzLCBmb3JiaWRQbHRlKVxue1xuXHRpZihwcz09bnVsbCkgcHM9MDtcblx0aWYoZm9yYmlkUGx0ZT09bnVsbCkgZm9yYmlkUGx0ZSA9IGZhbHNlO1xuXG5cdHZhciBuaW1nID0gVVBORy5lbmNvZGUuY29tcHJlc3MoYnVmcywgdywgaCwgcHMsIFtmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBmb3JiaWRQbHRlXSk7XG5cdFVQTkcuZW5jb2RlLmNvbXByZXNzUE5HKG5pbWcsIC0xKTtcblx0XG5cdHJldHVybiBVUE5HLmVuY29kZS5fbWFpbihuaW1nLCB3LCBoLCBkZWxzLCB0YWJzKTtcbn1cblxuVVBORy5lbmNvZGVMTCA9IGZ1bmN0aW9uKGJ1ZnMsIHcsIGgsIGNjLCBhYywgZGVwdGgsIGRlbHMsIHRhYnMpIHtcblx0dmFyIG5pbWcgPSB7ICBjdHlwZTogMCArIChjYz09MSA/IDAgOiAyKSArIChhYz09MCA/IDAgOiA0KSwgICAgICBkZXB0aDogZGVwdGgsICBmcmFtZXM6IFtdICB9O1xuXHRcblx0dmFyIHRpbWUgPSBEYXRlLm5vdygpO1xuXHR2YXIgYmlwcCA9IChjYythYykqZGVwdGgsIGJpcGwgPSBiaXBwICogdztcblx0Zm9yKHZhciBpPTA7IGk8YnVmcy5sZW5ndGg7IGkrKylcblx0XHRuaW1nLmZyYW1lcy5wdXNoKHsgIHJlY3Q6e3g6MCx5OjAsd2lkdGg6dyxoZWlnaHQ6aH0sICBpbWc6bmV3IFVpbnQ4QXJyYXkoYnVmc1tpXSksIGJsZW5kOjAsIGRpc3Bvc2U6MSwgYnBwOk1hdGguY2VpbChiaXBwLzgpLCBicGw6TWF0aC5jZWlsKGJpcGwvOCkgIH0pO1xuXHRcblx0VVBORy5lbmNvZGUuY29tcHJlc3NQTkcobmltZywgMCwgdHJ1ZSk7XG5cdFxuXHR2YXIgb3V0ID0gVVBORy5lbmNvZGUuX21haW4obmltZywgdywgaCwgZGVscywgdGFicyk7XG5cdHJldHVybiBvdXQ7XG59XG5cblVQTkcuZW5jb2RlLl9tYWluID0gZnVuY3Rpb24obmltZywgdywgaCwgZGVscywgdGFicykge1xuXHRpZih0YWJzPT1udWxsKSB0YWJzPXt9O1xuXHR2YXIgY3JjID0gVVBORy5jcmMuY3JjLCB3VWkgPSBVUE5HLl9iaW4ud3JpdGVVaW50LCB3VXMgPSBVUE5HLl9iaW4ud3JpdGVVc2hvcnQsIHdBcyA9IFVQTkcuX2Jpbi53cml0ZUFTQ0lJO1xuXHR2YXIgb2Zmc2V0ID0gOCwgYW5pbSA9IG5pbWcuZnJhbWVzLmxlbmd0aD4xLCBwbHRBbHBoYSA9IGZhbHNlO1xuXHRcblx0dmFyIGxlbmcgPSA4ICsgKDE2KzUrNCkgLyorICg5KzQpKi8gKyAoYW5pbSA/IDIwIDogMCk7XG5cdGlmKHRhYnNbXCJzUkdCXCJdIT1udWxsKSBsZW5nICs9IDgrMSs0O1xuXHRpZih0YWJzW1wicEhZc1wiXSE9bnVsbCkgbGVuZyArPSA4KzkrNDtcblx0aWYobmltZy5jdHlwZT09Mykge1xuXHRcdHZhciBkbCA9IG5pbWcucGx0ZS5sZW5ndGg7XG5cdFx0Zm9yKHZhciBpPTA7IGk8ZGw7IGkrKykgaWYoKG5pbWcucGx0ZVtpXT4+PjI0KSE9MjU1KSBwbHRBbHBoYSA9IHRydWU7XG5cdFx0bGVuZyArPSAoOCArIGRsKjMgKyA0KSArIChwbHRBbHBoYSA/ICg4ICsgZGwqMSArIDQpIDogMCk7XG5cdH1cblx0Zm9yKHZhciBqPTA7IGo8bmltZy5mcmFtZXMubGVuZ3RoOyBqKyspXG5cdHtcblx0XHR2YXIgZnIgPSBuaW1nLmZyYW1lc1tqXTtcblx0XHRpZihhbmltKSBsZW5nICs9IDM4O1xuXHRcdGxlbmcgKz0gZnIuY2ltZy5sZW5ndGggKyAxMjtcblx0XHRpZihqIT0wKSBsZW5nKz00O1xuXHR9XG5cdGxlbmcgKz0gMTI7IFxuXHRcblx0dmFyIGRhdGEgPSBuZXcgVWludDhBcnJheShsZW5nKTtcblx0dmFyIHdyPVsweDg5LCAweDUwLCAweDRlLCAweDQ3LCAweDBkLCAweDBhLCAweDFhLCAweDBhXTtcblx0Zm9yKHZhciBpPTA7IGk8ODsgaSsrKSBkYXRhW2ldPXdyW2ldO1xuXHRcblx0d1VpKGRhdGEsb2Zmc2V0LCAxMyk7ICAgICBvZmZzZXQrPTQ7XG5cdHdBcyhkYXRhLG9mZnNldCxcIklIRFJcIik7ICBvZmZzZXQrPTQ7XG5cdHdVaShkYXRhLG9mZnNldCx3KTsgIG9mZnNldCs9NDtcblx0d1VpKGRhdGEsb2Zmc2V0LGgpOyAgb2Zmc2V0Kz00O1xuXHRkYXRhW29mZnNldF0gPSBuaW1nLmRlcHRoOyAgb2Zmc2V0Kys7ICAvLyBkZXB0aFxuXHRkYXRhW29mZnNldF0gPSBuaW1nLmN0eXBlOyAgb2Zmc2V0Kys7ICAvLyBjdHlwZVxuXHRkYXRhW29mZnNldF0gPSAwOyAgb2Zmc2V0Kys7ICAvLyBjb21wcmVzc1xuXHRkYXRhW29mZnNldF0gPSAwOyAgb2Zmc2V0Kys7ICAvLyBmaWx0ZXJcblx0ZGF0YVtvZmZzZXRdID0gMDsgIG9mZnNldCsrOyAgLy8gaW50ZXJsYWNlXG5cdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtMTcsMTcpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cblx0Ly8gMTMgYnl0ZXMgdG8gc2F5LCB0aGF0IGl0IGlzIHNSR0Jcblx0aWYodGFic1tcInNSR0JcIl0hPW51bGwpIHtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIDEpOyAgICAgIG9mZnNldCs9NDtcblx0XHR3QXMoZGF0YSxvZmZzZXQsXCJzUkdCXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdGRhdGFbb2Zmc2V0XSA9IHRhYnNbXCJzUkdCXCJdOyAgb2Zmc2V0Kys7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC01LDUpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cdH1cblx0aWYodGFic1tcInBIWXNcIl0hPW51bGwpIHtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIDkpOyAgICAgIG9mZnNldCs9NDtcblx0XHR3QXMoZGF0YSxvZmZzZXQsXCJwSFlzXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdHdVaShkYXRhLG9mZnNldCwgdGFic1tcInBIWXNcIl1bMF0pOyAgICAgIG9mZnNldCs9NDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIHRhYnNbXCJwSFlzXCJdWzFdKTsgICAgICBvZmZzZXQrPTQ7XG5cdFx0ZGF0YVtvZmZzZXRdPXRhYnNbXCJwSFlzXCJdWzJdO1x0XHRcdG9mZnNldCsrO1xuXHRcdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtMTMsMTMpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cdH1cblxuXHRpZihhbmltKSB7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCA4KTsgICAgICBvZmZzZXQrPTQ7XG5cdFx0d0FzKGRhdGEsb2Zmc2V0LFwiYWNUTFwiKTsgIG9mZnNldCs9NDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIG5pbWcuZnJhbWVzLmxlbmd0aCk7ICAgICBvZmZzZXQrPTQ7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCB0YWJzW1wibG9vcFwiXSE9bnVsbD90YWJzW1wibG9vcFwiXTowKTsgICAgICBvZmZzZXQrPTQ7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC0xMiwxMikpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblx0fVxuXG5cdGlmKG5pbWcuY3R5cGU9PTMpIHtcblx0XHR2YXIgZGwgPSBuaW1nLnBsdGUubGVuZ3RoO1xuXHRcdHdVaShkYXRhLG9mZnNldCwgZGwqMyk7ICBvZmZzZXQrPTQ7XG5cdFx0d0FzKGRhdGEsb2Zmc2V0LFwiUExURVwiKTsgIG9mZnNldCs9NDtcblx0XHRmb3IodmFyIGk9MDsgaTxkbDsgaSsrKXtcblx0XHRcdHZhciB0aT1pKjMsIGM9bmltZy5wbHRlW2ldLCByPShjKSYyNTUsIGc9KGM+Pj44KSYyNTUsIGI9KGM+Pj4xNikmMjU1O1xuXHRcdFx0ZGF0YVtvZmZzZXQrdGkrMF09cjsgIGRhdGFbb2Zmc2V0K3RpKzFdPWc7ICBkYXRhW29mZnNldCt0aSsyXT1iO1xuXHRcdH1cblx0XHRvZmZzZXQrPWRsKjM7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC1kbCozLTQsZGwqMys0KSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXG5cdFx0aWYocGx0QWxwaGEpIHtcblx0XHRcdHdVaShkYXRhLG9mZnNldCwgZGwpOyAgb2Zmc2V0Kz00O1xuXHRcdFx0d0FzKGRhdGEsb2Zmc2V0LFwidFJOU1wiKTsgIG9mZnNldCs9NDtcblx0XHRcdGZvcih2YXIgaT0wOyBpPGRsOyBpKyspICBkYXRhW29mZnNldCtpXT0obmltZy5wbHRlW2ldPj4+MjQpJjI1NTtcblx0XHRcdG9mZnNldCs9ZGw7XG5cdFx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LWRsLTQsZGwrNCkpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblx0XHR9XG5cdH1cblx0XG5cdHZhciBmaSA9IDA7XG5cdGZvcih2YXIgaj0wOyBqPG5pbWcuZnJhbWVzLmxlbmd0aDsgaisrKVxuXHR7XG5cdFx0dmFyIGZyID0gbmltZy5mcmFtZXNbal07XG5cdFx0aWYoYW5pbSkge1xuXHRcdFx0d1VpKGRhdGEsIG9mZnNldCwgMjYpOyAgICAgb2Zmc2V0Kz00O1xuXHRcdFx0d0FzKGRhdGEsIG9mZnNldCxcImZjVExcIik7ICBvZmZzZXQrPTQ7XG5cdFx0XHR3VWkoZGF0YSwgb2Zmc2V0LCBmaSsrKTsgICBvZmZzZXQrPTQ7XG5cdFx0XHR3VWkoZGF0YSwgb2Zmc2V0LCBmci5yZWN0LndpZHRoICk7ICAgb2Zmc2V0Kz00O1xuXHRcdFx0d1VpKGRhdGEsIG9mZnNldCwgZnIucmVjdC5oZWlnaHQpOyAgIG9mZnNldCs9NDtcblx0XHRcdHdVaShkYXRhLCBvZmZzZXQsIGZyLnJlY3QueCk7ICAgb2Zmc2V0Kz00O1xuXHRcdFx0d1VpKGRhdGEsIG9mZnNldCwgZnIucmVjdC55KTsgICBvZmZzZXQrPTQ7XG5cdFx0XHR3VXMoZGF0YSwgb2Zmc2V0LCBkZWxzW2pdKTsgICBvZmZzZXQrPTI7XG5cdFx0XHR3VXMoZGF0YSwgb2Zmc2V0LCAgMTAwMCk7ICAgb2Zmc2V0Kz0yO1xuXHRcdFx0ZGF0YVtvZmZzZXRdID0gZnIuZGlzcG9zZTsgIG9mZnNldCsrO1x0Ly8gZGlzcG9zZVxuXHRcdFx0ZGF0YVtvZmZzZXRdID0gZnIuYmxlbmQgIDsgIG9mZnNldCsrO1x0Ly8gYmxlbmRcblx0XHRcdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtMzAsMzApKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cdFx0fVxuXHRcdFx0XHRcblx0XHR2YXIgaW1nZCA9IGZyLmNpbWcsIGRsID0gaW1nZC5sZW5ndGg7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCBkbCsoaj09MD8wOjQpKTsgICAgIG9mZnNldCs9NDtcblx0XHR2YXIgaW9mZiA9IG9mZnNldDtcblx0XHR3QXMoZGF0YSxvZmZzZXQsKGo9PTApP1wiSURBVFwiOlwiZmRBVFwiKTsgIG9mZnNldCs9NDtcblx0XHRpZihqIT0wKSB7ICB3VWkoZGF0YSwgb2Zmc2V0LCBmaSsrKTsgIG9mZnNldCs9NDsgIH1cblx0XHRkYXRhLnNldChpbWdkLG9mZnNldCk7XG5cdFx0b2Zmc2V0ICs9IGRsO1xuXHRcdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxpb2ZmLG9mZnNldC1pb2ZmKSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXHR9XG5cblx0d1VpKGRhdGEsb2Zmc2V0LCAwKTsgICAgIG9mZnNldCs9NDtcblx0d0FzKGRhdGEsb2Zmc2V0LFwiSUVORFwiKTsgIG9mZnNldCs9NDtcblx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC00LDQpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cblx0cmV0dXJuIGRhdGEuYnVmZmVyO1xufVxuXG5VUE5HLmVuY29kZS5jb21wcmVzc1BORyA9IGZ1bmN0aW9uKG91dCwgZmlsdGVyLCBsZXZlbFplcm8pIHtcblx0Zm9yKHZhciBpPTA7IGk8b3V0LmZyYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBmcm0gPSBvdXQuZnJhbWVzW2ldLCBudz1mcm0ucmVjdC53aWR0aCwgbmg9ZnJtLnJlY3QuaGVpZ2h0O1xuXHRcdHZhciBmZGF0YSA9IG5ldyBVaW50OEFycmF5KG5oKmZybS5icGwrbmgpO1xuXHRcdGZybS5jaW1nID0gVVBORy5lbmNvZGUuX2ZpbHRlclplcm8oZnJtLmltZyxuaCxmcm0uYnBwLGZybS5icGwsZmRhdGEsIGZpbHRlciwgbGV2ZWxaZXJvKTtcblx0fVxufVxuXG5cblxuVVBORy5lbmNvZGUuY29tcHJlc3MgPSBmdW5jdGlvbihidWZzLCB3LCBoLCBwcywgcHJtcykgLy8gcHJtczogIG9ubHlCbGVuZCwgbWluQml0cywgZm9yYmlkUGx0ZVxue1xuXHQvL3ZhciB0aW1lID0gRGF0ZS5ub3coKTtcblx0dmFyIG9ubHlCbGVuZCA9IHBybXNbMF0sIGV2ZW5DcmQgPSBwcm1zWzFdLCBmb3JiaWRQcmV2ID0gcHJtc1syXSwgbWluQml0cyA9IHBybXNbM10sIGZvcmJpZFBsdGUgPSBwcm1zWzRdO1xuXHRcblx0dmFyIGN0eXBlID0gNiwgZGVwdGggPSA4LCBhbHBoYUFuZD0yNTVcblx0XG5cdGZvcih2YXIgaj0wOyBqPGJ1ZnMubGVuZ3RoOyBqKyspICB7ICAvLyB3aGVuIG5vdCBxdWFudGl6ZWQsIG90aGVyIGZyYW1lcyBjYW4gY29udGFpbiBjb2xvcnMsIHRoYXQgYXJlIG5vdCBpbiBhbiBpbml0aWFsIGZyYW1lXG5cdFx0dmFyIGltZyA9IG5ldyBVaW50OEFycmF5KGJ1ZnNbal0pLCBpbGVuID0gaW1nLmxlbmd0aDtcblx0XHRmb3IodmFyIGk9MDsgaTxpbGVuOyBpKz00KSBhbHBoYUFuZCAmPSBpbWdbaSszXTtcblx0fVxuXHR2YXIgZ290QWxwaGEgPSAoYWxwaGFBbmQhPTI1NSk7XG5cdFxuXHQvL2NvbnNvbGUubG9nKFwiYWxwaGEgY2hlY2tcIiwgRGF0ZS5ub3coKS10aW1lKTsgIHRpbWUgPSBEYXRlLm5vdygpO1xuXHRcblx0Ly92YXIgYnJ1dGUgPSBnb3RBbHBoYSAmJiBmb3JHSUY7XHRcdC8vIGJydXRlIDogZnJhbWVzIGNhbiBvbmx5IGJlIGNvcGllZCwgbm90IFwiYmxlbmRlZFwiXG5cdHZhciBmcm1zID0gVVBORy5lbmNvZGUuZnJhbWl6ZShidWZzLCB3LCBoLCBvbmx5QmxlbmQsIGV2ZW5DcmQsIGZvcmJpZFByZXYpO1xuXHQvL2NvbnNvbGUubG9nKFwiZnJhbWl6ZVwiLCBEYXRlLm5vdygpLXRpbWUpOyAgdGltZSA9IERhdGUubm93KCk7XG5cdFxuXHR2YXIgY21hcD17fSwgcGx0ZT1bXSwgaW5kcz1bXTsgIFxuXHRcblx0aWYocHMhPTApIHtcblx0XHR2YXIgbmJ1ZnMgPSBbXTsgIGZvcih2YXIgaT0wOyBpPGZybXMubGVuZ3RoOyBpKyspIG5idWZzLnB1c2goZnJtc1tpXS5pbWcuYnVmZmVyKTtcblx0XHRcblx0XHR2YXIgYWJ1ZiA9IFVQTkcuZW5jb2RlLmNvbmNhdFJHQkEobmJ1ZnMpLCBxcmVzID0gVVBORy5xdWFudGl6ZShhYnVmLCBwcyk7ICBcblx0XHR2YXIgY29mID0gMCwgYmIgPSBuZXcgVWludDhBcnJheShxcmVzLmFidWYpO1xuXHRcdGZvcih2YXIgaT0wOyBpPGZybXMubGVuZ3RoOyBpKyspIHsgIHZhciB0aT1mcm1zW2ldLmltZywgYmxuPXRpLmxlbmd0aDsgIGluZHMucHVzaChuZXcgVWludDhBcnJheShxcmVzLmluZHMuYnVmZmVyLCBjb2Y+PjIsIGJsbj4+MikpO1xuXHRcdFx0Zm9yKHZhciBqPTA7IGo8YmxuOyBqKz00KSB7ICB0aVtqXT1iYltjb2Yral07ICB0aVtqKzFdPWJiW2NvZitqKzFdOyAgdGlbaisyXT1iYltjb2YraisyXTsgIHRpW2orM109YmJbY29mK2orM107ICB9ICAgIGNvZis9YmxuOyAgfVxuXHRcdFxuXHRcdGZvcih2YXIgaT0wOyBpPHFyZXMucGx0ZS5sZW5ndGg7IGkrKykgcGx0ZS5wdXNoKHFyZXMucGx0ZVtpXS5lc3QucmdiYSk7XG5cdFx0Ly9jb25zb2xlLmxvZyhcInF1YW50aXplXCIsIERhdGUubm93KCktdGltZSk7ICB0aW1lID0gRGF0ZS5ub3coKTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyB3aGF0IGlmIHBzPT0wLCBidXQgdGhlcmUgYXJlIDw9MjU2IGNvbG9ycz8gIHdlIHN0aWxsIG5lZWQgdG8gZGV0ZWN0LCBpZiB0aGUgcGFsZXR0ZSBjb3VsZCBiZSB1c2VkXG5cdFx0Zm9yKHZhciBqPTA7IGo8ZnJtcy5sZW5ndGg7IGorKykgIHsgIC8vIHdoZW4gbm90IHF1YW50aXplZCwgb3RoZXIgZnJhbWVzIGNhbiBjb250YWluIGNvbG9ycywgdGhhdCBhcmUgbm90IGluIGFuIGluaXRpYWwgZnJhbWVcblx0XHRcdHZhciBmcm0gPSBmcm1zW2pdLCBpbWczMiA9IG5ldyBVaW50MzJBcnJheShmcm0uaW1nLmJ1ZmZlciksIG53PWZybS5yZWN0LndpZHRoLCBpbGVuID0gaW1nMzIubGVuZ3RoO1xuXHRcdFx0dmFyIGluZCA9IG5ldyBVaW50OEFycmF5KGlsZW4pOyAgaW5kcy5wdXNoKGluZCk7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTxpbGVuOyBpKyspIHtcblx0XHRcdFx0dmFyIGMgPSBpbWczMltpXTtcblx0XHRcdFx0aWYgICAgIChpIT0wICYmIGM9PWltZzMyW2ktIDFdKSBpbmRbaV09aW5kW2ktMV07XG5cdFx0XHRcdGVsc2UgaWYoaT5udyAmJiBjPT1pbWczMltpLW53XSkgaW5kW2ldPWluZFtpLW53XTtcblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0dmFyIGNtYyA9IGNtYXBbY107XG5cdFx0XHRcdFx0aWYoY21jPT1udWxsKSB7ICBjbWFwW2NdPWNtYz1wbHRlLmxlbmd0aDsgIHBsdGUucHVzaChjKTsgIGlmKHBsdGUubGVuZ3RoPj0zMDApIGJyZWFrOyAgfVxuXHRcdFx0XHRcdGluZFtpXT1jbWM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly9jb25zb2xlLmxvZyhcIm1ha2UgcGFsZXR0ZVwiLCBEYXRlLm5vdygpLXRpbWUpOyAgdGltZSA9IERhdGUubm93KCk7XG5cdH1cblx0XG5cdHZhciBjYz1wbHRlLmxlbmd0aDsgLy9jb25zb2xlLmxvZyhcImNvbG9yczpcIixjYyk7XG5cdGlmKGNjPD0yNTYgJiYgZm9yYmlkUGx0ZT09ZmFsc2UpIHtcblx0XHRpZihjYzw9IDIpIGRlcHRoPTE7ICBlbHNlIGlmKGNjPD0gNCkgZGVwdGg9MjsgIGVsc2UgaWYoY2M8PTE2KSBkZXB0aD00OyAgZWxzZSBkZXB0aD04O1xuXHRcdGRlcHRoID0gIE1hdGgubWF4KGRlcHRoLCBtaW5CaXRzKTtcblx0fVxuXHRcblx0Zm9yKHZhciBqPTA7IGo8ZnJtcy5sZW5ndGg7IGorKylcblx0e1xuXHRcdHZhciBmcm0gPSBmcm1zW2pdLCBueD1mcm0ucmVjdC54LCBueT1mcm0ucmVjdC55LCBudz1mcm0ucmVjdC53aWR0aCwgbmg9ZnJtLnJlY3QuaGVpZ2h0O1xuXHRcdHZhciBjaW1nID0gZnJtLmltZywgY2ltZzMyID0gbmV3IFVpbnQzMkFycmF5KGNpbWcuYnVmZmVyKTtcblx0XHR2YXIgYnBsID0gNCpudywgYnBwPTQ7XG5cdFx0aWYoY2M8PTI1NiAmJiBmb3JiaWRQbHRlPT1mYWxzZSkge1xuXHRcdFx0YnBsID0gTWF0aC5jZWlsKGRlcHRoKm53LzgpO1xuXHRcdFx0dmFyIG5pbWcgPSBuZXcgVWludDhBcnJheShicGwqbmgpO1xuXHRcdFx0dmFyIGluaiA9IGluZHNbal07XG5cdFx0XHRmb3IodmFyIHk9MDsgeTxuaDsgeSsrKSB7ICB2YXIgaT15KmJwbCwgaWk9eSpudztcblx0XHRcdFx0aWYgICAgIChkZXB0aD09OCkgZm9yKHZhciB4PTA7IHg8bnc7IHgrKykgbmltZ1tpKyh4KSAgIF0gICA9ICAoaW5qW2lpK3hdICAgICAgICAgICAgICk7XG5cdFx0XHRcdGVsc2UgaWYoZGVwdGg9PTQpIGZvcih2YXIgeD0wOyB4PG53OyB4KyspIG5pbWdbaSsoeD4+MSldICB8PSAgKGlualtpaSt4XTw8KDQtKHgmMSkqNCkpO1xuXHRcdFx0XHRlbHNlIGlmKGRlcHRoPT0yKSBmb3IodmFyIHg9MDsgeDxudzsgeCsrKSBuaW1nW2krKHg+PjIpXSAgfD0gIChpbmpbaWkreF08PCg2LSh4JjMpKjIpKTtcblx0XHRcdFx0ZWxzZSBpZihkZXB0aD09MSkgZm9yKHZhciB4PTA7IHg8bnc7IHgrKykgbmltZ1tpKyh4Pj4zKV0gIHw9ICAoaW5qW2lpK3hdPDwoNy0oeCY3KSoxKSk7XG5cdFx0XHR9XG5cdFx0XHRjaW1nPW5pbWc7ICBjdHlwZT0zOyAgYnBwPTE7XG5cdFx0fVxuXHRcdGVsc2UgaWYoZ290QWxwaGE9PWZhbHNlICYmIGZybXMubGVuZ3RoPT0xKSB7XHQvLyBzb21lIG5leHQgXCJyZWR1Y2VkXCIgZnJhbWVzIG1heSBjb250YWluIGFscGhhIGZvciBibGVuZGluZ1xuXHRcdFx0dmFyIG5pbWcgPSBuZXcgVWludDhBcnJheShudypuaCozKSwgYXJlYT1udypuaDtcblx0XHRcdGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyB2YXIgdGk9aSozLCBxaT1pKjQ7ICBuaW1nW3RpXT1jaW1nW3FpXTsgIG5pbWdbdGkrMV09Y2ltZ1txaSsxXTsgIG5pbWdbdGkrMl09Y2ltZ1txaSsyXTsgIH1cblx0XHRcdGNpbWc9bmltZzsgIGN0eXBlPTI7ICBicHA9MzsgIGJwbD0zKm53O1xuXHRcdH1cblx0XHRmcm0uaW1nPWNpbWc7ICBmcm0uYnBsPWJwbDsgIGZybS5icHA9YnBwO1xuXHR9XG5cdC8vY29uc29sZS5sb2coXCJjb2xvcnMgPT4gcGFsZXR0ZSBpbmRpY2VzXCIsIERhdGUubm93KCktdGltZSk7ICB0aW1lID0gRGF0ZS5ub3coKTtcblx0XG5cdHJldHVybiB7Y3R5cGU6Y3R5cGUsIGRlcHRoOmRlcHRoLCBwbHRlOnBsdGUsIGZyYW1lczpmcm1zICB9O1xufVxuVVBORy5lbmNvZGUuZnJhbWl6ZSA9IGZ1bmN0aW9uKGJ1ZnMsdyxoLGFsd2F5c0JsZW5kLGV2ZW5DcmQsZm9yYmlkUHJldikge1xuXHQvKiAgRElTUE9TRVxuXHQgICAgLSAwIDogbm8gY2hhbmdlXG5cdFx0LSAxIDogY2xlYXIgdG8gdHJhbnNwYXJlbnRcblx0XHQtIDIgOiByZXRzdG9yZSB0byBjb250ZW50IGJlZm9yZSByZW5kZXJpbmcgKHByZXZpb3VzIGZyYW1lIGRpc3Bvc2VkKVxuXHRcdEJMRU5EXG5cdFx0LSAwIDogcmVwbGFjZVxuXHRcdC0gMSA6IGJsZW5kXG5cdCovXG5cdHZhciBmcm1zID0gW107XG5cdGZvcih2YXIgaj0wOyBqPGJ1ZnMubGVuZ3RoOyBqKyspIHtcblx0XHR2YXIgY2ltZyA9IG5ldyBVaW50OEFycmF5KGJ1ZnNbal0pLCBjaW1nMzIgPSBuZXcgVWludDMyQXJyYXkoY2ltZy5idWZmZXIpO1xuXHRcdHZhciBuaW1nO1xuXHRcdFxuXHRcdHZhciBueD0wLCBueT0wLCBudz13LCBuaD1oLCBibGVuZD1hbHdheXNCbGVuZD8xOjA7XG5cdFx0aWYoaiE9MCkge1xuXHRcdFx0dmFyIHRsaW0gPSAoZm9yYmlkUHJldiB8fCBhbHdheXNCbGVuZCB8fCBqPT0xIHx8IGZybXNbai0yXS5kaXNwb3NlIT0wKT8xOjIsIHRzdHAgPSAwLCB0YXJlYSA9IDFlOTtcblx0XHRcdGZvcih2YXIgaXQ9MDsgaXQ8dGxpbTsgaXQrKylcblx0XHRcdHtcblx0XHRcdFx0dmFyIHBpbWcgPSBuZXcgVWludDhBcnJheShidWZzW2otMS1pdF0pLCBwMzIgPSBuZXcgVWludDMyQXJyYXkoYnVmc1tqLTEtaXRdKTtcblx0XHRcdFx0dmFyIG1peD13LG1peT1oLG1heD0tMSxtYXk9LTE7XG5cdFx0XHRcdGZvcih2YXIgeT0wOyB5PGg7IHkrKykgZm9yKHZhciB4PTA7IHg8dzsgeCsrKSB7XG5cdFx0XHRcdFx0dmFyIGkgPSB5KncreDtcblx0XHRcdFx0XHRpZihjaW1nMzJbaV0hPXAzMltpXSkge1xuXHRcdFx0XHRcdFx0aWYoeDxtaXgpIG1peD14OyAgaWYoeD5tYXgpIG1heD14O1xuXHRcdFx0XHRcdFx0aWYoeTxtaXkpIG1peT15OyAgaWYoeT5tYXkpIG1heT15O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZihtYXg9PS0xKSBtaXg9bWl5PW1heD1tYXk9MDtcblx0XHRcdFx0aWYoZXZlbkNyZCkgeyAgaWYoKG1peCYxKT09MSltaXgtLTsgIGlmKChtaXkmMSk9PTEpbWl5LS07ICB9XG5cdFx0XHRcdHZhciBzYXJlYSA9IChtYXgtbWl4KzEpKihtYXktbWl5KzEpO1xuXHRcdFx0XHRpZihzYXJlYTx0YXJlYSkge1xuXHRcdFx0XHRcdHRhcmVhID0gc2FyZWE7ICB0c3RwID0gaXQ7XG5cdFx0XHRcdFx0bnggPSBtaXg7IG55ID0gbWl5OyBudyA9IG1heC1taXgrMTsgbmggPSBtYXktbWl5KzE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0Ly8gYWx3YXlzQmxlbmQ6IHBva3VkIHpqaXN0w61tLCDFvmUgYmxlbmRpdCBuZWx6ZSwgbmFzdGF2w61tIHDFmWVkY2hvesOtbXUgc27DrW1rdSBkaXNwb3NlPTEuIFphamlzdMOtbSwgYWJ5IG9ic2Fob3ZhbCBtxa9qIG9iZMOpbG7DrWsuXG5cdFx0XHR2YXIgcGltZyA9IG5ldyBVaW50OEFycmF5KGJ1ZnNbai0xLXRzdHBdKTtcblx0XHRcdGlmKHRzdHA9PTEpIGZybXNbai0xXS5kaXNwb3NlID0gMjtcblx0XHRcdFxuXHRcdFx0bmltZyA9IG5ldyBVaW50OEFycmF5KG53Km5oKjQpO1xuXHRcdFx0VVBORy5fY29weVRpbGUocGltZyx3LGgsIG5pbWcsbncsbmgsIC1ueCwtbnksIDApO1xuXHRcdFx0XG5cdFx0XHRibGVuZCA9ICBVUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgbmltZyxudyxuaCwgLW54LC1ueSwgMykgPyAxIDogMDtcblx0XHRcdGlmKGJsZW5kPT0xKSBVUE5HLmVuY29kZS5fcHJlcGFyZURpZmYoY2ltZyx3LGgsbmltZyx7eDpueCx5Om55LHdpZHRoOm53LGhlaWdodDpuaH0pO1xuXHRcdFx0ZWxzZSAgICAgICAgIFVQTkcuX2NvcHlUaWxlKGNpbWcsdyxoLCBuaW1nLG53LG5oLCAtbngsLW55LCAwKTtcblx0XHRcdC8vVVBORy5fY29weVRpbGUoY2ltZyx3LGgsIG5pbWcsbncsbmgsIC1ueCwtbnksIGJsZW5kPT0xPzI6MCk7XG5cdFx0fVxuXHRcdGVsc2UgbmltZyA9IGNpbWcuc2xpY2UoMCk7XHQvLyBpbWcgbWF5IGJlIHJld3JpdHRlbiBmdXJ0aGVyIC4uLiBkb24ndCByZXdyaXRlIGlucHV0XG5cdFx0XG5cdFx0ZnJtcy5wdXNoKHtyZWN0Ont4Om54LHk6bnksd2lkdGg6bncsaGVpZ2h0Om5ofSwgaW1nOm5pbWcsIGJsZW5kOmJsZW5kLCBkaXNwb3NlOjB9KTtcblx0fVxuXHRcblx0XG5cdGlmKGFsd2F5c0JsZW5kKSBmb3IodmFyIGo9MDsgajxmcm1zLmxlbmd0aDsgaisrKSB7XG5cdFx0dmFyIGZybSA9IGZybXNbal07ICBpZihmcm0uYmxlbmQ9PTEpIGNvbnRpbnVlO1xuXHRcdHZhciByMCA9IGZybS5yZWN0LCByMSA9IGZybXNbai0xXS5yZWN0XG5cdFx0dmFyIG1pWCA9IE1hdGgubWluKHIwLngsIHIxLngpLCBtaVkgPSBNYXRoLm1pbihyMC55LCByMS55KTtcblx0XHR2YXIgbWFYID0gTWF0aC5tYXgocjAueCtyMC53aWR0aCwgcjEueCtyMS53aWR0aCksIG1hWSA9IE1hdGgubWF4KHIwLnkrcjAuaGVpZ2h0LCByMS55K3IxLmhlaWdodCk7XG5cdFx0dmFyIHIgPSB7eDptaVgsIHk6bWlZLCB3aWR0aDptYVgtbWlYLCBoZWlnaHQ6bWFZLW1pWX07XG5cdFx0XG5cdFx0ZnJtc1tqLTFdLmRpc3Bvc2UgPSAxO1xuXHRcdGlmKGotMSE9MCkgXG5cdFx0VVBORy5lbmNvZGUuX3VwZGF0ZUZyYW1lKGJ1ZnMsIHcsaCxmcm1zLCBqLTEsciwgZXZlbkNyZCk7XG5cdFx0VVBORy5lbmNvZGUuX3VwZGF0ZUZyYW1lKGJ1ZnMsIHcsaCxmcm1zLCBqICAsciwgZXZlbkNyZCk7XG5cdH1cblx0dmFyIGFyZWEgPSAwO1xuXHRpZihidWZzLmxlbmd0aCE9MSkgZm9yKHZhciBpPTA7IGk8ZnJtcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBmcm0gPSBmcm1zW2ldO1xuXHRcdGFyZWEgKz0gZnJtLnJlY3Qud2lkdGgqZnJtLnJlY3QuaGVpZ2h0O1xuXHRcdC8vaWYoaT09MCB8fCBmcm0uYmxlbmQhPTEpIGNvbnRpbnVlO1xuXHRcdC8vdmFyIG9iID0gbmV3IFVpbnQ4QXJyYXkoXG5cdFx0Ly9jb25zb2xlLmxvZyhmcm0uYmxlbmQsIGZybS5kaXNwb3NlLCBmcm0ucmVjdCk7XG5cdH1cblx0Ly9pZihhcmVhIT0wKSBjb25zb2xlLmxvZyhhcmVhKTtcblx0cmV0dXJuIGZybXM7XG59XG5VUE5HLmVuY29kZS5fdXBkYXRlRnJhbWUgPSBmdW5jdGlvbihidWZzLCB3LGgsIGZybXMsIGksIHIsIGV2ZW5DcmQpIHtcblx0dmFyIFU4ID0gVWludDhBcnJheSwgVTMyID0gVWludDMyQXJyYXk7XG5cdHZhciBwaW1nID0gbmV3IFU4KGJ1ZnNbaS0xXSksIHBpbWczMiA9IG5ldyBVMzIoYnVmc1tpLTFdKSwgbmltZyA9IGkrMTxidWZzLmxlbmd0aCA/IG5ldyBVOChidWZzW2krMV0pOm51bGw7XG5cdHZhciBjaW1nID0gbmV3IFU4KGJ1ZnNbaV0pLCBjaW1nMzIgPSBuZXcgVTMyKGNpbWcuYnVmZmVyKTtcblx0XG5cdHZhciBtaXg9dyxtaXk9aCxtYXg9LTEsbWF5PS0xO1xuXHRmb3IodmFyIHk9MDsgeTxyLmhlaWdodDsgeSsrKSBmb3IodmFyIHg9MDsgeDxyLndpZHRoOyB4KyspIHtcblx0XHR2YXIgY3ggPSByLngreCwgY3kgPSByLnkreTtcblx0XHR2YXIgaiA9IGN5KncrY3gsIGNjID0gY2ltZzMyW2pdO1xuXHRcdC8vIG5vIG5lZWQgdG8gZHJhdyB0cmFuc3BhcmVuY3ksIG9yIHRvIGRpc3Bvc2UgaXQuIE9yLCBpZiB3cml0aW5nIHRoZSBzYW1lIGNvbG9yIGFuZCB0aGUgbmV4dCBvbmUgZG9lcyBub3QgbmVlZCB0cmFuc3BhcmVuY3kuXG5cdFx0aWYoY2M9PTAgfHwgKGZybXNbaS0xXS5kaXNwb3NlPT0wICYmIHBpbWczMltqXT09Y2MgJiYgKG5pbWc9PW51bGwgfHwgbmltZ1tqKjQrM10hPTApKS8qKi8pIHt9XG5cdFx0ZWxzZSB7XG5cdFx0XHRpZihjeDxtaXgpIG1peD1jeDsgIGlmKGN4Pm1heCkgbWF4PWN4O1xuXHRcdFx0aWYoY3k8bWl5KSBtaXk9Y3k7ICBpZihjeT5tYXkpIG1heT1jeTtcblx0XHR9XG5cdH1cblx0aWYobWF4PT0tMSkgbWl4PW1peT1tYXg9bWF5PTA7XG5cdGlmKGV2ZW5DcmQpIHsgIGlmKChtaXgmMSk9PTEpbWl4LS07ICBpZigobWl5JjEpPT0xKW1peS0tOyAgfVxuXHRyID0ge3g6bWl4LCB5Om1peSwgd2lkdGg6bWF4LW1peCsxLCBoZWlnaHQ6bWF5LW1peSsxfTtcblx0XG5cdHZhciBmciA9IGZybXNbaV07ICBmci5yZWN0ID0gcjsgIGZyLmJsZW5kID0gMTsgIGZyLmltZyA9IG5ldyBVaW50OEFycmF5KHIud2lkdGgqci5oZWlnaHQqNCk7XG5cdGlmKGZybXNbaS0xXS5kaXNwb3NlPT0wKSB7XG5cdFx0VVBORy5fY29weVRpbGUocGltZyx3LGgsIGZyLmltZyxyLndpZHRoLHIuaGVpZ2h0LCAtci54LC1yLnksIDApO1xuXHRcdFVQTkcuZW5jb2RlLl9wcmVwYXJlRGlmZihjaW1nLHcsaCxmci5pbWcscik7XG5cdFx0Ly9VUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgZnIuaW1nLHIud2lkdGgsci5oZWlnaHQsIC1yLngsLXIueSwgMik7XG5cdH1cblx0ZWxzZVxuXHRcdFVQTkcuX2NvcHlUaWxlKGNpbWcsdyxoLCBmci5pbWcsci53aWR0aCxyLmhlaWdodCwgLXIueCwtci55LCAwKTtcbn1cblVQTkcuZW5jb2RlLl9wcmVwYXJlRGlmZiA9IGZ1bmN0aW9uKGNpbWcsIHcsaCwgbmltZywgcmVjKSB7XG5cdFVQTkcuX2NvcHlUaWxlKGNpbWcsdyxoLCBuaW1nLHJlYy53aWR0aCxyZWMuaGVpZ2h0LCAtcmVjLngsLXJlYy55LCAyKTtcblx0Lypcblx0dmFyIG4zMiA9IG5ldyBVaW50MzJBcnJheShuaW1nLmJ1ZmZlcik7XG5cdHZhciBvZyA9IG5ldyBVaW50OEFycmF5KHJlYy53aWR0aCpyZWMuaGVpZ2h0KjQpLCBvMzIgPSBuZXcgVWludDMyQXJyYXkob2cuYnVmZmVyKTtcblx0VVBORy5fY29weVRpbGUoY2ltZyx3LGgsIG9nLHJlYy53aWR0aCxyZWMuaGVpZ2h0LCAtcmVjLngsLXJlYy55LCAwKTtcblx0Zm9yKHZhciBpPTQ7IGk8bmltZy5sZW5ndGg7IGkrPTQpIHtcblx0XHRpZihuaW1nW2ktMV0hPTAgJiYgbmltZ1tpKzNdPT0wICYmIG8zMltpPj4+Ml09PW8zMlsoaT4+PjIpLTFdKSB7XG5cdFx0XHRuMzJbaT4+PjJdPW8zMltpPj4+Ml07XG5cdFx0XHQvL3ZhciBqID0gaSwgYz1wMzJbKGk+Pj4yKS0xXTtcblx0XHRcdC8vd2hpbGUocDMyW2o+Pj4yXT09YykgeyAgbjMyW2o+Pj4yXT1jOyAgais9NDsgIH1cblx0XHR9XG5cdH1cblx0Zm9yKHZhciBpPW5pbWcubGVuZ3RoLTg7IGk+MDsgaS09NCkge1xuXHRcdGlmKG5pbWdbaSs3XSE9MCAmJiBuaW1nW2krM109PTAgJiYgbzMyW2k+Pj4yXT09bzMyWyhpPj4+MikrMV0pIHtcblx0XHRcdG4zMltpPj4+Ml09bzMyW2k+Pj4yXTtcblx0XHRcdC8vdmFyIGogPSBpLCBjPXAzMlsoaT4+PjIpLTFdO1xuXHRcdFx0Ly93aGlsZShwMzJbaj4+PjJdPT1jKSB7ICBuMzJbaj4+PjJdPWM7ICBqKz00OyAgfVxuXHRcdH1cblx0fSovXG59XG5cblVQTkcuZW5jb2RlLl9maWx0ZXJaZXJvID0gZnVuY3Rpb24oaW1nLGgsYnBwLGJwbCxkYXRhLCBmaWx0ZXIsIGxldmVsWmVybylcbntcblx0dmFyIGZscyA9IFtdLCBmdHJ5PVswLDEsMiwzLDRdO1xuXHRpZiAgICAgKGZpbHRlciE9LTEpICAgICAgICAgICAgIGZ0cnk9W2ZpbHRlcl07XG5cdGVsc2UgaWYoaCpicGw+NTAwMDAwIHx8IGJwcD09MSkgZnRyeT1bMF07XG5cdHZhciBvcHRzOyAgaWYobGV2ZWxaZXJvKSBvcHRzPXtsZXZlbDowfTtcblx0XG5cdHZhciBDTVBSID0gKGxldmVsWmVybyAmJiBVWklQIT1udWxsKSA/IFVaSVAgOiBwYWtvO1xuXHRcblx0Zm9yKHZhciBpPTA7IGk8ZnRyeS5sZW5ndGg7IGkrKykge1xuXHRcdGZvcih2YXIgeT0wOyB5PGg7IHkrKykgVVBORy5lbmNvZGUuX2ZpbHRlckxpbmUoZGF0YSwgaW1nLCB5LCBicGwsIGJwcCwgZnRyeVtpXSk7XG5cdFx0Ly92YXIgbmltZyA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoKTtcblx0XHQvL3ZhciBzeiA9IFVaSVAuRi5kZWZsYXRlKGRhdGEsIG5pbWcpOyAgZmxzLnB1c2gobmltZy5zbGljZSgwLHN6KSk7XG5cdFx0Ly92YXIgZGZsID0gcGFrb1tcImRlZmxhdGVcIl0oZGF0YSksIGRsPWRmbC5sZW5ndGgtNDtcblx0XHQvL3ZhciBjcmMgPSAoZGZsW2RsKzNdPDwyNCl8KGRmbFtkbCsyXTw8MTYpfChkZmxbZGwrMV08PDgpfChkZmxbZGwrMF08PDApO1xuXHRcdC8vY29uc29sZS5sb2coY3JjLCBVWklQLmFkbGVyKGRhdGEsMixkYXRhLmxlbmd0aC02KSk7XG5cdFx0ZmxzLnB1c2goQ01QUltcImRlZmxhdGVcIl0oZGF0YSxvcHRzKSk7XG5cdH1cblx0dmFyIHRpLCB0c2l6ZT0xZTk7XG5cdGZvcih2YXIgaT0wOyBpPGZscy5sZW5ndGg7IGkrKykgaWYoZmxzW2ldLmxlbmd0aDx0c2l6ZSkgeyAgdGk9aTsgIHRzaXplPWZsc1tpXS5sZW5ndGg7ICB9XG5cdHJldHVybiBmbHNbdGldO1xufVxuVVBORy5lbmNvZGUuX2ZpbHRlckxpbmUgPSBmdW5jdGlvbihkYXRhLCBpbWcsIHksIGJwbCwgYnBwLCB0eXBlKVxue1xuXHR2YXIgaSA9IHkqYnBsLCBkaSA9IGkreSwgcGFldGggPSBVUE5HLmRlY29kZS5fcGFldGhcblx0ZGF0YVtkaV09dHlwZTsgIGRpKys7XG5cblx0aWYodHlwZT09MCkge1xuXHRcdGlmKGJwbDw1MDApIGZvcih2YXIgeD0wOyB4PGJwbDsgeCsrKSBkYXRhW2RpK3hdID0gaW1nW2kreF07XG5cdFx0ZWxzZSBkYXRhLnNldChuZXcgVWludDhBcnJheShpbWcuYnVmZmVyLGksYnBsKSxkaSk7XG5cdH1cblx0ZWxzZSBpZih0eXBlPT0xKSB7XG5cdFx0Zm9yKHZhciB4PSAgMDsgeDxicHA7IHgrKykgZGF0YVtkaSt4XSA9ICBpbWdbaSt4XTtcblx0XHRmb3IodmFyIHg9YnBwOyB4PGJwbDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdLWltZ1tpK3gtYnBwXSsyNTYpJjI1NTtcblx0fVxuXHRlbHNlIGlmKHk9PTApIHtcblx0XHRmb3IodmFyIHg9ICAwOyB4PGJwcDsgeCsrKSBkYXRhW2RpK3hdID0gaW1nW2kreF07XG5cblx0XHRpZih0eXBlPT0yKSBmb3IodmFyIHg9YnBwOyB4PGJwbDsgeCsrKSBkYXRhW2RpK3hdID0gaW1nW2kreF07XG5cdFx0aWYodHlwZT09MykgZm9yKHZhciB4PWJwcDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XSAtIChpbWdbaSt4LWJwcF0+PjEpICsyNTYpJjI1NTtcblx0XHRpZih0eXBlPT00KSBmb3IodmFyIHg9YnBwOyB4PGJwbDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdIC0gcGFldGgoaW1nW2kreC1icHBdLCAwLCAwKSArMjU2KSYyNTU7XG5cdH1cblx0ZWxzZSB7XG5cdFx0aWYodHlwZT09MikgeyBmb3IodmFyIHg9ICAwOyB4PGJwbDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdKzI1NiAtIGltZ1tpK3gtYnBsXSkmMjU1OyAgfVxuXHRcdGlmKHR5cGU9PTMpIHsgZm9yKHZhciB4PSAgMDsgeDxicHA7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XSsyNTYgLSAoaW1nW2kreC1icGxdPj4xKSkmMjU1O1xuXHRcdFx0XHRcdCAgZm9yKHZhciB4PWJwcDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XSsyNTYgLSAoKGltZ1tpK3gtYnBsXStpbWdbaSt4LWJwcF0pPj4xKSkmMjU1OyAgfVxuXHRcdGlmKHR5cGU9PTQpIHsgZm9yKHZhciB4PSAgMDsgeDxicHA7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XSsyNTYgLSBwYWV0aCgwLCBpbWdbaSt4LWJwbF0sIDApKSYyNTU7XG5cdFx0XHRcdFx0ICBmb3IodmFyIHg9YnBwOyB4PGJwbDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdKzI1NiAtIHBhZXRoKGltZ1tpK3gtYnBwXSwgaW1nW2kreC1icGxdLCBpbWdbaSt4LWJwcC1icGxdKSkmMjU1OyAgfVxuXHR9XG59XG5cblVQTkcuY3JjID0ge1xuXHR0YWJsZSA6ICggZnVuY3Rpb24oKSB7XG5cdCAgIHZhciB0YWIgPSBuZXcgVWludDMyQXJyYXkoMjU2KTtcblx0ICAgZm9yICh2YXIgbj0wOyBuPDI1NjsgbisrKSB7XG5cdFx0XHR2YXIgYyA9IG47XG5cdFx0XHRmb3IgKHZhciBrPTA7IGs8ODsgaysrKSB7XG5cdFx0XHRcdGlmIChjICYgMSkgIGMgPSAweGVkYjg4MzIwIF4gKGMgPj4+IDEpO1xuXHRcdFx0XHRlbHNlICAgICAgICBjID0gYyA+Pj4gMTtcblx0XHRcdH1cblx0XHRcdHRhYltuXSA9IGM7ICB9XG5cdFx0cmV0dXJuIHRhYjsgIH0pKCksXG5cdHVwZGF0ZSA6IGZ1bmN0aW9uKGMsIGJ1Ziwgb2ZmLCBsZW4pIHtcblx0XHRmb3IgKHZhciBpPTA7IGk8bGVuOyBpKyspICBjID0gVVBORy5jcmMudGFibGVbKGMgXiBidWZbb2ZmK2ldKSAmIDB4ZmZdIF4gKGMgPj4+IDgpO1xuXHRcdHJldHVybiBjO1xuXHR9LFxuXHRjcmMgOiBmdW5jdGlvbihiLG8sbCkgIHsgIHJldHVybiBVUE5HLmNyYy51cGRhdGUoMHhmZmZmZmZmZixiLG8sbCkgXiAweGZmZmZmZmZmOyAgfVxufVxuXG5cblVQTkcucXVhbnRpemUgPSBmdW5jdGlvbihhYnVmLCBwcylcbntcdFxuXHR2YXIgb2ltZyA9IG5ldyBVaW50OEFycmF5KGFidWYpLCBuaW1nID0gb2ltZy5zbGljZSgwKSwgbmltZzMyID0gbmV3IFVpbnQzMkFycmF5KG5pbWcuYnVmZmVyKTtcblx0XG5cdHZhciBLRCA9IFVQTkcucXVhbnRpemUuZ2V0S0R0cmVlKG5pbWcsIHBzKTtcblx0dmFyIHJvb3QgPSBLRFswXSwgbGVhZnMgPSBLRFsxXTtcblx0XG5cdHZhciBwbGFuZURzdCA9IFVQTkcucXVhbnRpemUucGxhbmVEc3Q7XG5cdHZhciBzYiA9IG9pbWcsIHRiID0gbmltZzMyLCBsZW49c2IubGVuZ3RoO1xuXHRcdFxuXHR2YXIgaW5kcyA9IG5ldyBVaW50OEFycmF5KG9pbWcubGVuZ3RoPj4yKTtcblx0Zm9yKHZhciBpPTA7IGk8bGVuOyBpKz00KSB7XG5cdFx0dmFyIHI9c2JbaV0qKDEvMjU1KSwgZz1zYltpKzFdKigxLzI1NSksIGI9c2JbaSsyXSooMS8yNTUpLCBhPXNiW2krM10qKDEvMjU1KTtcblx0XHRcblx0XHQvLyAgZXhhY3QsIGJ1dCB0b28gc2xvdyA6KFxuXHRcdHZhciBuZCA9IFVQTkcucXVhbnRpemUuZ2V0TmVhcmVzdChyb290LCByLCBnLCBiLCBhKTtcblx0XHQvL3ZhciBuZCA9IHJvb3Q7XG5cdFx0Ly93aGlsZShuZC5sZWZ0KSBuZCA9IChwbGFuZURzdChuZC5lc3QscixnLGIsYSk8PTApID8gbmQubGVmdCA6IG5kLnJpZ2h0O1xuXHRcdFxuXHRcdGluZHNbaT4+Ml0gPSBuZC5pbmQ7XG5cdFx0dGJbaT4+Ml0gPSBuZC5lc3QucmdiYTtcblx0fVxuXHRyZXR1cm4geyAgYWJ1ZjpuaW1nLmJ1ZmZlciwgaW5kczppbmRzLCBwbHRlOmxlYWZzICB9O1xufVxuXG5VUE5HLnF1YW50aXplLmdldEtEdHJlZSA9IGZ1bmN0aW9uKG5pbWcsIHBzLCBlcnIpIHtcblx0aWYoZXJyPT1udWxsKSBlcnIgPSAwLjAwMDE7XG5cdHZhciBuaW1nMzIgPSBuZXcgVWludDMyQXJyYXkobmltZy5idWZmZXIpO1xuXHRcblx0dmFyIHJvb3QgPSB7aTA6MCwgaTE6bmltZy5sZW5ndGgsIGJzdDpudWxsLCBlc3Q6bnVsbCwgdGRzdDowLCBsZWZ0Om51bGwsIHJpZ2h0Om51bGwgfTsgIC8vIGJhc2ljIHN0YXRpc3RpYywgZXh0cmEgc3RhdGlzdGljXG5cdHJvb3QuYnN0ID0gVVBORy5xdWFudGl6ZS5zdGF0cyggIG5pbWcscm9vdC5pMCwgcm9vdC5pMSAgKTsgIHJvb3QuZXN0ID0gVVBORy5xdWFudGl6ZS5lc3RhdHMoIHJvb3QuYnN0ICk7XG5cdHZhciBsZWFmcyA9IFtyb290XTtcblx0XG5cdHdoaWxlKGxlYWZzLmxlbmd0aDxwcylcblx0e1xuXHRcdHZhciBtYXhMID0gMCwgbWk9MDtcblx0XHRmb3IodmFyIGk9MDsgaTxsZWFmcy5sZW5ndGg7IGkrKykgaWYobGVhZnNbaV0uZXN0LkwgPiBtYXhMKSB7ICBtYXhMPWxlYWZzW2ldLmVzdC5MOyAgbWk9aTsgIH1cblx0XHRpZihtYXhMPGVycikgYnJlYWs7XG5cdFx0dmFyIG5vZGUgPSBsZWFmc1ttaV07XG5cdFx0XG5cdFx0dmFyIHMwID0gVVBORy5xdWFudGl6ZS5zcGxpdFBpeGVscyhuaW1nLG5pbWczMiwgbm9kZS5pMCwgbm9kZS5pMSwgbm9kZS5lc3QuZSwgbm9kZS5lc3QuZU1xMjU1KTtcblx0XHR2YXIgczB3cm9uZyA9IChub2RlLmkwPj1zMCB8fCBub2RlLmkxPD1zMCk7XG5cdFx0Ly9jb25zb2xlLmxvZyhtYXhMLCBsZWFmcy5sZW5ndGgsIG1pKTtcblx0XHRpZihzMHdyb25nKSB7ICBub2RlLmVzdC5MPTA7ICBjb250aW51ZTsgIH1cblx0XHRcblx0XHRcblx0XHR2YXIgbG4gPSB7aTA6bm9kZS5pMCwgaTE6czAsIGJzdDpudWxsLCBlc3Q6bnVsbCwgdGRzdDowLCBsZWZ0Om51bGwsIHJpZ2h0Om51bGwgfTsgIGxuLmJzdCA9IFVQTkcucXVhbnRpemUuc3RhdHMoIG5pbWcsIGxuLmkwLCBsbi5pMSApOyAgXG5cdFx0bG4uZXN0ID0gVVBORy5xdWFudGl6ZS5lc3RhdHMoIGxuLmJzdCApO1xuXHRcdHZhciBybiA9IHtpMDpzMCwgaTE6bm9kZS5pMSwgYnN0Om51bGwsIGVzdDpudWxsLCB0ZHN0OjAsIGxlZnQ6bnVsbCwgcmlnaHQ6bnVsbCB9OyAgcm4uYnN0ID0ge1I6W10sIG06W10sIE46bm9kZS5ic3QuTi1sbi5ic3QuTn07XG5cdFx0Zm9yKHZhciBpPTA7IGk8MTY7IGkrKykgcm4uYnN0LlJbaV0gPSBub2RlLmJzdC5SW2ldLWxuLmJzdC5SW2ldO1xuXHRcdGZvcih2YXIgaT0wOyBpPCA0OyBpKyspIHJuLmJzdC5tW2ldID0gbm9kZS5ic3QubVtpXS1sbi5ic3QubVtpXTtcblx0XHRybi5lc3QgPSBVUE5HLnF1YW50aXplLmVzdGF0cyggcm4uYnN0ICk7XG5cdFx0XG5cdFx0bm9kZS5sZWZ0ID0gbG47ICBub2RlLnJpZ2h0ID0gcm47XG5cdFx0bGVhZnNbbWldPWxuOyAgbGVhZnMucHVzaChybik7XG5cdH1cblx0bGVhZnMuc29ydChmdW5jdGlvbihhLGIpIHsgIHJldHVybiBiLmJzdC5OLWEuYnN0Lk47ICB9KTtcblx0Zm9yKHZhciBpPTA7IGk8bGVhZnMubGVuZ3RoOyBpKyspIGxlYWZzW2ldLmluZD1pO1xuXHRyZXR1cm4gW3Jvb3QsIGxlYWZzXTtcbn1cblxuVVBORy5xdWFudGl6ZS5nZXROZWFyZXN0ID0gZnVuY3Rpb24obmQsIHIsZyxiLGEpXG57XG5cdGlmKG5kLmxlZnQ9PW51bGwpIHsgIG5kLnRkc3QgPSBVUE5HLnF1YW50aXplLmRpc3QobmQuZXN0LnEscixnLGIsYSk7ICByZXR1cm4gbmQ7ICB9XG5cdHZhciBwbGFuZURzdCA9IFVQTkcucXVhbnRpemUucGxhbmVEc3QobmQuZXN0LHIsZyxiLGEpO1xuXHRcblx0dmFyIG5vZGUwID0gbmQubGVmdCwgbm9kZTEgPSBuZC5yaWdodDtcblx0aWYocGxhbmVEc3Q+MCkgeyAgbm9kZTA9bmQucmlnaHQ7ICBub2RlMT1uZC5sZWZ0OyAgfVxuXHRcblx0dmFyIGxuID0gVVBORy5xdWFudGl6ZS5nZXROZWFyZXN0KG5vZGUwLCByLGcsYixhKTtcblx0aWYobG4udGRzdDw9cGxhbmVEc3QqcGxhbmVEc3QpIHJldHVybiBsbjtcblx0dmFyIHJuID0gVVBORy5xdWFudGl6ZS5nZXROZWFyZXN0KG5vZGUxLCByLGcsYixhKTtcblx0cmV0dXJuIHJuLnRkc3Q8bG4udGRzdCA/IHJuIDogbG47XG59XG5VUE5HLnF1YW50aXplLnBsYW5lRHN0ID0gZnVuY3Rpb24oZXN0LCByLGcsYixhKSB7ICB2YXIgZSA9IGVzdC5lOyAgcmV0dXJuIGVbMF0qciArIGVbMV0qZyArIGVbMl0qYiArIGVbM10qYSAtIGVzdC5lTXE7ICB9XG5VUE5HLnF1YW50aXplLmRpc3QgICAgID0gZnVuY3Rpb24ocSwgICByLGcsYixhKSB7ICB2YXIgZDA9ci1xWzBdLCBkMT1nLXFbMV0sIGQyPWItcVsyXSwgZDM9YS1xWzNdOyAgcmV0dXJuIGQwKmQwK2QxKmQxK2QyKmQyK2QzKmQzOyAgfVxuXG5VUE5HLnF1YW50aXplLnNwbGl0UGl4ZWxzID0gZnVuY3Rpb24obmltZywgbmltZzMyLCBpMCwgaTEsIGUsIGVNcSlcbntcblx0dmFyIHZlY0RvdCA9IFVQTkcucXVhbnRpemUudmVjRG90O1xuXHRpMS09NDtcblx0dmFyIHNoZnMgPSAwO1xuXHR3aGlsZShpMDxpMSlcblx0e1xuXHRcdHdoaWxlKHZlY0RvdChuaW1nLCBpMCwgZSk8PWVNcSkgaTArPTQ7XG5cdFx0d2hpbGUodmVjRG90KG5pbWcsIGkxLCBlKT4gZU1xKSBpMS09NDtcblx0XHRpZihpMD49aTEpIGJyZWFrO1xuXHRcdFxuXHRcdHZhciB0ID0gbmltZzMyW2kwPj4yXTsgIG5pbWczMltpMD4+Ml0gPSBuaW1nMzJbaTE+PjJdOyAgbmltZzMyW2kxPj4yXT10O1xuXHRcdFxuXHRcdGkwKz00OyAgaTEtPTQ7XG5cdH1cblx0d2hpbGUodmVjRG90KG5pbWcsIGkwLCBlKT5lTXEpIGkwLT00O1xuXHRyZXR1cm4gaTArNDtcbn1cblVQTkcucXVhbnRpemUudmVjRG90ID0gZnVuY3Rpb24obmltZywgaSwgZSlcbntcblx0cmV0dXJuIG5pbWdbaV0qZVswXSArIG5pbWdbaSsxXSplWzFdICsgbmltZ1tpKzJdKmVbMl0gKyBuaW1nW2krM10qZVszXTtcbn1cblVQTkcucXVhbnRpemUuc3RhdHMgPSBmdW5jdGlvbihuaW1nLCBpMCwgaTEpe1xuXHR2YXIgUiA9IFswLDAsMCwwLCAgMCwwLDAsMCwgIDAsMCwwLDAsICAwLDAsMCwwXTtcblx0dmFyIG0gPSBbMCwwLDAsMF07XG5cdHZhciBOID0gKGkxLWkwKT4+Mjtcblx0Zm9yKHZhciBpPWkwOyBpPGkxOyBpKz00KVxuXHR7XG5cdFx0dmFyIHIgPSBuaW1nW2ldKigxLzI1NSksIGcgPSBuaW1nW2krMV0qKDEvMjU1KSwgYiA9IG5pbWdbaSsyXSooMS8yNTUpLCBhID0gbmltZ1tpKzNdKigxLzI1NSk7XG5cdFx0Ly92YXIgciA9IG5pbWdbaV0sIGcgPSBuaW1nW2krMV0sIGIgPSBuaW1nW2krMl0sIGEgPSBuaW1nW2krM107XG5cdFx0bVswXSs9cjsgIG1bMV0rPWc7ICBtWzJdKz1iOyAgbVszXSs9YTtcblx0XHRcblx0XHRSWyAwXSArPSByKnI7ICBSWyAxXSArPSByKmc7ICBSWyAyXSArPSByKmI7ICBSWyAzXSArPSByKmE7ICBcblx0XHQgICAgICAgICAgICAgICBSWyA1XSArPSBnKmc7ICBSWyA2XSArPSBnKmI7ICBSWyA3XSArPSBnKmE7IFxuXHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJbMTBdICs9IGIqYjsgIFJbMTFdICs9IGIqYTsgIFxuXHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJbMTVdICs9IGEqYTsgIFxuXHR9XG5cdFJbNF09UlsxXTsgIFJbOF09UlsyXTsgIFJbOV09Uls2XTsgIFJbMTJdPVJbM107ICBSWzEzXT1SWzddOyAgUlsxNF09UlsxMV07XG5cdFxuXHRyZXR1cm4ge1I6UiwgbTptLCBOOk59O1xufVxuVVBORy5xdWFudGl6ZS5lc3RhdHMgPSBmdW5jdGlvbihzdGF0cyl7XG5cdHZhciBSID0gc3RhdHMuUiwgbSA9IHN0YXRzLm0sIE4gPSBzdGF0cy5OO1xuXHRcblx0Ly8gd2hlbiBhbGwgc2FtcGxlcyBhcmUgZXF1YWwsIGJ1dCBOIGlzIGxhcmdlIChtaWxsaW9ucyksIHRoZSBSaiBjYW4gYmUgbm9uLXplcm8gKCAwLjAwMDMuLi4uIC0gcHJlY2lzc2lvbiBlcnJvcilcblx0dmFyIG0wID0gbVswXSwgbTEgPSBtWzFdLCBtMiA9IG1bMl0sIG0zID0gbVszXSwgaU4gPSAoTj09MCA/IDAgOiAxL04pO1xuXHR2YXIgUmogPSBbXG5cdFx0UlsgMF0gLSBtMCptMCppTiwgIFJbIDFdIC0gbTAqbTEqaU4sICBSWyAyXSAtIG0wKm0yKmlOLCAgUlsgM10gLSBtMCptMyppTiwgIFxuXHRcdFJbIDRdIC0gbTEqbTAqaU4sICBSWyA1XSAtIG0xKm0xKmlOLCAgUlsgNl0gLSBtMSptMippTiwgIFJbIDddIC0gbTEqbTMqaU4sXG5cdFx0UlsgOF0gLSBtMiptMCppTiwgIFJbIDldIC0gbTIqbTEqaU4sICBSWzEwXSAtIG0yKm0yKmlOLCAgUlsxMV0gLSBtMiptMyppTiwgIFxuXHRcdFJbMTJdIC0gbTMqbTAqaU4sICBSWzEzXSAtIG0zKm0xKmlOLCAgUlsxNF0gLSBtMyptMippTiwgIFJbMTVdIC0gbTMqbTMqaU4gXG5cdF07XG5cdFxuXHR2YXIgQSA9IFJqLCBNID0gVVBORy5NNDtcblx0dmFyIGIgPSBbMC41LDAuNSwwLjUsMC41XSwgbWkgPSAwLCB0bWkgPSAwO1xuXHRcblx0aWYoTiE9MClcblx0Zm9yKHZhciBpPTA7IGk8MTA7IGkrKykge1xuXHRcdGIgPSBNLm11bHRWZWMoQSwgYik7ICB0bWkgPSBNYXRoLnNxcnQoTS5kb3QoYixiKSk7ICBiID0gTS5zbWwoMS90bWksICBiKTtcblx0XHRpZihNYXRoLmFicyh0bWktbWkpPDFlLTkpIGJyZWFrOyAgbWkgPSB0bWk7XG5cdH1cdFxuXHQvL2IgPSBbMCwwLDEsMF07ICBtaT1OO1xuXHR2YXIgcSA9IFttMCppTiwgbTEqaU4sIG0yKmlOLCBtMyppTl07XG5cdHZhciBlTXEyNTUgPSBNLmRvdChNLnNtbCgyNTUscSksYik7XG5cdFxuXHRyZXR1cm4geyAgQ292OlJqLCBxOnEsIGU6YiwgTDptaSwgIGVNcTI1NTplTXEyNTUsIGVNcSA6IE0uZG90KGIscSksXG5cdFx0XHRcdHJnYmE6ICgoKE1hdGgucm91bmQoMjU1KnFbM10pPDwyNCkgfCAoTWF0aC5yb3VuZCgyNTUqcVsyXSk8PDE2KSB8ICAoTWF0aC5yb3VuZCgyNTUqcVsxXSk8PDgpIHwgKE1hdGgucm91bmQoMjU1KnFbMF0pPDwwKSk+Pj4wKSAgfTtcbn1cblVQTkcuTTQgPSB7XG5cdG11bHRWZWMgOiBmdW5jdGlvbihtLHYpIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdG1bIDBdKnZbMF0gKyBtWyAxXSp2WzFdICsgbVsgMl0qdlsyXSArIG1bIDNdKnZbM10sXG5cdFx0XHRcdG1bIDRdKnZbMF0gKyBtWyA1XSp2WzFdICsgbVsgNl0qdlsyXSArIG1bIDddKnZbM10sXG5cdFx0XHRcdG1bIDhdKnZbMF0gKyBtWyA5XSp2WzFdICsgbVsxMF0qdlsyXSArIG1bMTFdKnZbM10sXG5cdFx0XHRcdG1bMTJdKnZbMF0gKyBtWzEzXSp2WzFdICsgbVsxNF0qdlsyXSArIG1bMTVdKnZbM11cblx0XHRcdF07XG5cdH0sXG5cdGRvdCA6IGZ1bmN0aW9uKHgseSkgeyAgcmV0dXJuICB4WzBdKnlbMF0reFsxXSp5WzFdK3hbMl0qeVsyXSt4WzNdKnlbM107ICB9LFxuXHRzbWwgOiBmdW5jdGlvbihhLHkpIHsgIHJldHVybiBbYSp5WzBdLGEqeVsxXSxhKnlbMl0sYSp5WzNdXTsgIH1cbn1cblxuVVBORy5lbmNvZGUuY29uY2F0UkdCQSA9IGZ1bmN0aW9uKGJ1ZnMpIHtcblx0dmFyIHRsZW4gPSAwO1xuXHRmb3IodmFyIGk9MDsgaTxidWZzLmxlbmd0aDsgaSsrKSB0bGVuICs9IGJ1ZnNbaV0uYnl0ZUxlbmd0aDtcblx0dmFyIG5pbWcgPSBuZXcgVWludDhBcnJheSh0bGVuKSwgbm9mZj0wO1xuXHRmb3IodmFyIGk9MDsgaTxidWZzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGltZyA9IG5ldyBVaW50OEFycmF5KGJ1ZnNbaV0pLCBpbCA9IGltZy5sZW5ndGg7XG5cdFx0Zm9yKHZhciBqPTA7IGo8aWw7IGorPTQpIHsgIFxuXHRcdFx0dmFyIHI9aW1nW2pdLCBnPWltZ1tqKzFdLCBiPWltZ1tqKzJdLCBhID0gaW1nW2orM107XG5cdFx0XHRpZihhPT0wKSByPWc9Yj0wO1xuXHRcdFx0bmltZ1tub2ZmK2pdPXI7ICBuaW1nW25vZmYraisxXT1nOyAgbmltZ1tub2ZmK2orMl09YjsgIG5pbWdbbm9mZitqKzNdPWE7ICB9XG5cdFx0bm9mZiArPSBpbDtcblx0fVxuXHRyZXR1cm4gbmltZy5idWZmZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVQTkc7XG5cbiIsInZhciBnZXREZWZhdWx0UGFyZW50ID0gZnVuY3Rpb24gKG9yaWdpbmFsVGFyZ2V0KSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBzYW1wbGVUYXJnZXQgPSBBcnJheS5pc0FycmF5KG9yaWdpbmFsVGFyZ2V0KSA/IG9yaWdpbmFsVGFyZ2V0WzBdIDogb3JpZ2luYWxUYXJnZXQ7XG4gICAgcmV0dXJuIHNhbXBsZVRhcmdldC5vd25lckRvY3VtZW50LmJvZHk7XG59O1xudmFyIGNvdW50ZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xudmFyIHVuY29udHJvbGxlZE5vZGVzID0gbmV3IFdlYWtNYXAoKTtcbnZhciBtYXJrZXJNYXAgPSB7fTtcbnZhciBsb2NrQ291bnQgPSAwO1xudmFyIHVud3JhcEhvc3QgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlICYmIChub2RlLmhvc3QgfHwgdW53cmFwSG9zdChub2RlLnBhcmVudE5vZGUpKTtcbn07XG52YXIgY29ycmVjdFRhcmdldHMgPSBmdW5jdGlvbiAocGFyZW50LCB0YXJnZXRzKSB7XG4gICAgcmV0dXJuIHRhcmdldHNcbiAgICAgICAgLm1hcChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGlmIChwYXJlbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29ycmVjdGVkVGFyZ2V0ID0gdW53cmFwSG9zdCh0YXJnZXQpO1xuICAgICAgICBpZiAoY29ycmVjdGVkVGFyZ2V0ICYmIHBhcmVudC5jb250YWlucyhjb3JyZWN0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ycmVjdGVkVGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2FyaWEtaGlkZGVuJywgdGFyZ2V0LCAnaW4gbm90IGNvbnRhaW5lZCBpbnNpZGUnLCBwYXJlbnQsICcuIERvaW5nIG5vdGhpbmcnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4gQm9vbGVhbih4KTsgfSk7XG59O1xuLyoqXG4gKiBNYXJrcyBldmVyeXRoaW5nIGV4Y2VwdCBnaXZlbiBub2RlKG9yIG5vZGVzKSBhcyBhcmlhLWhpZGRlblxuICogQHBhcmFtIHtFbGVtZW50IHwgRWxlbWVudFtdfSBvcmlnaW5hbFRhcmdldCAtIGVsZW1lbnRzIHRvIGtlZXAgb24gdGhlIHBhZ2VcbiAqIEBwYXJhbSBbcGFyZW50Tm9kZV0gLSB0b3AgZWxlbWVudCwgZGVmYXVsdHMgdG8gZG9jdW1lbnQuYm9keVxuICogQHBhcmFtIHtTdHJpbmd9IFttYXJrZXJOYW1lXSAtIGEgc3BlY2lhbCBhdHRyaWJ1dGUgdG8gbWFyayBldmVyeSBub2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gW2NvbnRyb2xBdHRyaWJ1dGVdIC0gaHRtbCBBdHRyaWJ1dGUgdG8gY29udHJvbFxuICogQHJldHVybiB7VW5kb30gdW5kbyBjb21tYW5kXG4gKi9cbnZhciBhcHBseUF0dHJpYnV0ZVRvT3RoZXJzID0gZnVuY3Rpb24gKG9yaWdpbmFsVGFyZ2V0LCBwYXJlbnROb2RlLCBtYXJrZXJOYW1lLCBjb250cm9sQXR0cmlidXRlKSB7XG4gICAgdmFyIHRhcmdldHMgPSBjb3JyZWN0VGFyZ2V0cyhwYXJlbnROb2RlLCBBcnJheS5pc0FycmF5KG9yaWdpbmFsVGFyZ2V0KSA/IG9yaWdpbmFsVGFyZ2V0IDogW29yaWdpbmFsVGFyZ2V0XSk7XG4gICAgaWYgKCFtYXJrZXJNYXBbbWFya2VyTmFtZV0pIHtcbiAgICAgICAgbWFya2VyTWFwW21hcmtlck5hbWVdID0gbmV3IFdlYWtNYXAoKTtcbiAgICB9XG4gICAgdmFyIG1hcmtlckNvdW50ZXIgPSBtYXJrZXJNYXBbbWFya2VyTmFtZV07XG4gICAgdmFyIGhpZGRlbk5vZGVzID0gW107XG4gICAgdmFyIGVsZW1lbnRzVG9LZWVwID0gbmV3IFNldCgpO1xuICAgIHZhciBlbGVtZW50c1RvU3RvcCA9IG5ldyBTZXQodGFyZ2V0cyk7XG4gICAgdmFyIGtlZXAgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgaWYgKCFlbCB8fCBlbGVtZW50c1RvS2VlcC5oYXMoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHNUb0tlZXAuYWRkKGVsKTtcbiAgICAgICAga2VlcChlbC5wYXJlbnROb2RlKTtcbiAgICB9O1xuICAgIHRhcmdldHMuZm9yRWFjaChrZWVwKTtcbiAgICB2YXIgZGVlcCA9IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKCFwYXJlbnQgfHwgZWxlbWVudHNUb1N0b3AuaGFzKHBhcmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHBhcmVudC5jaGlsZHJlbiwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50c1RvS2VlcC5oYXMobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBkZWVwKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHIgPSBub2RlLmdldEF0dHJpYnV0ZShjb250cm9sQXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFscmVhZHlIaWRkZW4gPSBhdHRyICE9PSBudWxsICYmIGF0dHIgIT09ICdmYWxzZSc7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb3VudGVyVmFsdWUgPSAoY291bnRlck1hcC5nZXQobm9kZSkgfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWFya2VyVmFsdWUgPSAobWFya2VyQ291bnRlci5nZXQobm9kZSkgfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyTWFwLnNldChub2RlLCBjb3VudGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb3VudGVyLnNldChub2RlLCBtYXJrZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyVmFsdWUgPT09IDEgJiYgYWxyZWFkeUhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5jb250cm9sbGVkTm9kZXMuc2V0KG5vZGUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZXJWYWx1ZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobWFya2VyTmFtZSwgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGNvbnRyb2xBdHRyaWJ1dGUsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignYXJpYS1oaWRkZW46IGNhbm5vdCBvcGVyYXRlIG9uICcsIG5vZGUsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBkZWVwKHBhcmVudE5vZGUpO1xuICAgIGVsZW1lbnRzVG9LZWVwLmNsZWFyKCk7XG4gICAgbG9ja0NvdW50Kys7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaGlkZGVuTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgdmFyIGNvdW50ZXJWYWx1ZSA9IGNvdW50ZXJNYXAuZ2V0KG5vZGUpIC0gMTtcbiAgICAgICAgICAgIHZhciBtYXJrZXJWYWx1ZSA9IG1hcmtlckNvdW50ZXIuZ2V0KG5vZGUpIC0gMTtcbiAgICAgICAgICAgIGNvdW50ZXJNYXAuc2V0KG5vZGUsIGNvdW50ZXJWYWx1ZSk7XG4gICAgICAgICAgICBtYXJrZXJDb3VudGVyLnNldChub2RlLCBtYXJrZXJWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWNvdW50ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghdW5jb250cm9sbGVkTm9kZXMuaGFzKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGNvbnRyb2xBdHRyaWJ1dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1bmNvbnRyb2xsZWROb2Rlcy5kZWxldGUobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1hcmtlclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobWFya2VyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsb2NrQ291bnQtLTtcbiAgICAgICAgaWYgKCFsb2NrQ291bnQpIHtcbiAgICAgICAgICAgIC8vIGNsZWFyXG4gICAgICAgICAgICBjb3VudGVyTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgICAgIGNvdW50ZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAgICAgdW5jb250cm9sbGVkTm9kZXMgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAgICAgbWFya2VyTWFwID0ge307XG4gICAgICAgIH1cbiAgICB9O1xufTtcbi8qKlxuICogTWFya3MgZXZlcnl0aGluZyBleGNlcHQgZ2l2ZW4gbm9kZShvciBub2RlcykgYXMgYXJpYS1oaWRkZW5cbiAqIEBwYXJhbSB7RWxlbWVudCB8IEVsZW1lbnRbXX0gb3JpZ2luYWxUYXJnZXQgLSBlbGVtZW50cyB0byBrZWVwIG9uIHRoZSBwYWdlXG4gKiBAcGFyYW0gW3BhcmVudE5vZGVdIC0gdG9wIGVsZW1lbnQsIGRlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBbbWFya2VyTmFtZV0gLSBhIHNwZWNpYWwgYXR0cmlidXRlIHRvIG1hcmsgZXZlcnkgbm9kZVxuICogQHJldHVybiB7VW5kb30gdW5kbyBjb21tYW5kXG4gKi9cbmV4cG9ydCB2YXIgaGlkZU90aGVycyA9IGZ1bmN0aW9uIChvcmlnaW5hbFRhcmdldCwgcGFyZW50Tm9kZSwgbWFya2VyTmFtZSkge1xuICAgIGlmIChtYXJrZXJOYW1lID09PSB2b2lkIDApIHsgbWFya2VyTmFtZSA9ICdkYXRhLWFyaWEtaGlkZGVuJzsgfVxuICAgIHZhciB0YXJnZXRzID0gQXJyYXkuZnJvbShBcnJheS5pc0FycmF5KG9yaWdpbmFsVGFyZ2V0KSA/IG9yaWdpbmFsVGFyZ2V0IDogW29yaWdpbmFsVGFyZ2V0XSk7XG4gICAgdmFyIGFjdGl2ZVBhcmVudE5vZGUgPSBwYXJlbnROb2RlIHx8IGdldERlZmF1bHRQYXJlbnQob3JpZ2luYWxUYXJnZXQpO1xuICAgIGlmICghYWN0aXZlUGFyZW50Tm9kZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICB9XG4gICAgLy8gd2Ugc2hvdWxkIG5vdCBoaWRlIGFyaWFMaXZlIGVsZW1lbnRzIC0gaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS9hcmlhLWhpZGRlbi9pc3N1ZXMvMTBcbiAgICB0YXJnZXRzLnB1c2guYXBwbHkodGFyZ2V0cywgQXJyYXkuZnJvbShhY3RpdmVQYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1thcmlhLWxpdmVdJykpKTtcbiAgICByZXR1cm4gYXBwbHlBdHRyaWJ1dGVUb090aGVycyh0YXJnZXRzLCBhY3RpdmVQYXJlbnROb2RlLCBtYXJrZXJOYW1lLCAnYXJpYS1oaWRkZW4nKTtcbn07XG4vKipcbiAqIE1hcmtzIGV2ZXJ5dGhpbmcgZXhjZXB0IGdpdmVuIG5vZGUob3Igbm9kZXMpIGFzIGluZXJ0XG4gKiBAcGFyYW0ge0VsZW1lbnQgfCBFbGVtZW50W119IG9yaWdpbmFsVGFyZ2V0IC0gZWxlbWVudHMgdG8ga2VlcCBvbiB0aGUgcGFnZVxuICogQHBhcmFtIFtwYXJlbnROb2RlXSAtIHRvcCBlbGVtZW50LCBkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5XG4gKiBAcGFyYW0ge1N0cmluZ30gW21hcmtlck5hbWVdIC0gYSBzcGVjaWFsIGF0dHJpYnV0ZSB0byBtYXJrIGV2ZXJ5IG5vZGVcbiAqIEByZXR1cm4ge1VuZG99IHVuZG8gY29tbWFuZFxuICovXG5leHBvcnQgdmFyIGluZXJ0T3RoZXJzID0gZnVuY3Rpb24gKG9yaWdpbmFsVGFyZ2V0LCBwYXJlbnROb2RlLCBtYXJrZXJOYW1lKSB7XG4gICAgaWYgKG1hcmtlck5hbWUgPT09IHZvaWQgMCkgeyBtYXJrZXJOYW1lID0gJ2RhdGEtaW5lcnQtZWQnOyB9XG4gICAgdmFyIGFjdGl2ZVBhcmVudE5vZGUgPSBwYXJlbnROb2RlIHx8IGdldERlZmF1bHRQYXJlbnQob3JpZ2luYWxUYXJnZXQpO1xuICAgIGlmICghYWN0aXZlUGFyZW50Tm9kZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcGx5QXR0cmlidXRlVG9PdGhlcnMob3JpZ2luYWxUYXJnZXQsIGFjdGl2ZVBhcmVudE5vZGUsIG1hcmtlck5hbWUsICdpbmVydCcpO1xufTtcbi8qKlxuICogQHJldHVybnMgaWYgY3VycmVudCBicm93c2VyIHN1cHBvcnRzIGluZXJ0XG4gKi9cbmV4cG9ydCB2YXIgc3VwcG9ydHNJbmVydCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBIVE1MRWxlbWVudC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoJ2luZXJ0Jyk7XG59O1xuLyoqXG4gKiBBdXRvbWF0aWMgZnVuY3Rpb24gdG8gXCJzdXBwcmVzc1wiIERPTSBlbGVtZW50cyAtIF9oaWRlXyBvciBfaW5lcnRfIGluIHRoZSBiZXN0IHBvc3NpYmxlIHdheVxuICogQHBhcmFtIHtFbGVtZW50IHwgRWxlbWVudFtdfSBvcmlnaW5hbFRhcmdldCAtIGVsZW1lbnRzIHRvIGtlZXAgb24gdGhlIHBhZ2VcbiAqIEBwYXJhbSBbcGFyZW50Tm9kZV0gLSB0b3AgZWxlbWVudCwgZGVmYXVsdHMgdG8gZG9jdW1lbnQuYm9keVxuICogQHBhcmFtIHtTdHJpbmd9IFttYXJrZXJOYW1lXSAtIGEgc3BlY2lhbCBhdHRyaWJ1dGUgdG8gbWFyayBldmVyeSBub2RlXG4gKiBAcmV0dXJuIHtVbmRvfSB1bmRvIGNvbW1hbmRcbiAqL1xuZXhwb3J0IHZhciBzdXBwcmVzc090aGVycyA9IGZ1bmN0aW9uIChvcmlnaW5hbFRhcmdldCwgcGFyZW50Tm9kZSwgbWFya2VyTmFtZSkge1xuICAgIGlmIChtYXJrZXJOYW1lID09PSB2b2lkIDApIHsgbWFya2VyTmFtZSA9ICdkYXRhLXN1cHByZXNzZWQnOyB9XG4gICAgcmV0dXJuIChzdXBwb3J0c0luZXJ0KCkgPyBpbmVydE90aGVycyA6IGhpZGVPdGhlcnMpKG9yaWdpbmFsVGFyZ2V0LCBwYXJlbnROb2RlLCBtYXJrZXJOYW1lKTtcbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCB7IEhlbG1ldCB9IGZyb20gXCJyZWFjdC1oZWxtZXRcIjtcclxuXHJcbmZ1bmN0aW9uIFRpdGxlKHsgdGl0bGUsIGRyaXZlIH0pIHtcclxuICByZXR1cm4gKFxyXG4gICAgPEhlbG1ldD5cclxuICAgICAgPHRpdGxlPntkcml2ZSA/IHRpdGxlIDogYCR7dGl0bGV9IC0gT3BlblNpZ27ihKJgfTwvdGl0bGU+XHJcbiAgICAgIDxtZXRhIG5hbWU9XCJkZXNjcmlwdGlvblwiIGNvbnRlbnQ9e2Ake3RpdGxlfSAtIE9wZW5TaWdu4oSiYH0gLz5cclxuICAgICAgPGxpbmtcclxuICAgICAgICByZWw9XCJpY29uXCJcclxuICAgICAgICB0eXBlPVwiaW1hZ2UvcG5nXCJcclxuICAgICAgICBocmVmPXtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImZldl9JY29uXCIpfVxyXG4gICAgICAgIHNpemVzPVwiNDB4NDBcIlxyXG4gICAgICAvPlxyXG4gICAgPC9IZWxtZXQ+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVGl0bGU7XHJcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuZnVuY3Rpb24gQm9yZGVyUmVzaXplKHsgcmlnaHQsIHRvcCB9KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtgJHtyaWdodCA/IGAtcmlnaHQtWzEycHhdYCA6IFwiLXJpZ2h0LVsxcHhdXCJ9ICR7XG4gICAgICAgIHRvcCA/IGAtYm90dG9tLVsxMXB4XWAgOiBcIi1ib3R0b20tWzFweF1cIlxuICAgICAgfSBhYnNvbHV0ZSBpbmxpbmUtYmxvY2sgdy1bMTRweF0gaC1bMTRweF0gaG92ZXI6Y3Vyc29yLXN3LXJlc2l6ZSBib3JkZXItci1bM3B4XSBib3JkZXItYi1bM3B4XSBib3JkZXItWyMxODhhZTJdYH1cbiAgICA+PC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJvcmRlclJlc2l6ZTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcbmZ1bmN0aW9uIERlZmF1bHRTaWduYXR1cmUoeyBkZWZhdWx0U2lnbkltZywgeHlQb3N0aW9uLCBzZXREZWZhdWx0U2lnbkFsZXJ0IH0pIHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xuXG4gIGNvbnN0IGNvbmZpcm1Ub2FkZERlZmF1bHRTaWduID0gKCkgPT4ge1xuICAgIGlmICh4eVBvc3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgc2V0RGVmYXVsdFNpZ25BbGVydCh7XG4gICAgICAgIGlzU2hvdzogdHJ1ZSxcbiAgICAgICAgYWxlcnRNZXNzYWdlOiB0KFwiZGVmYXVsdC1zaWduLWFsZXJ0XCIpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RGVmYXVsdFNpZ25BbGVydCh7XG4gICAgICAgIGlzU2hvdzogdHJ1ZSxcbiAgICAgICAgYWxlcnRNZXNzYWdlOiB0KFwicGxlYXNlLXNlbGVjdC1wb3NpdGlvbiFcIilcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgZGF0YS10dXQ9XCJyZWFjdG91clRoaXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LTIgcHItMiBwdC0yIHBiLTEgdGV4dC1bMTVweF0gdGV4dC1iYXNlLWNvbnRlbnQgZm9udC1zZW1pYm9sZCBib3JkZXItYi1bMXB4XSBib3JkZXItYmFzZS0zMDBcIj5cbiAgICAgICAge3QoXCJzaWduYXR1cmVcIil9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgbXQtWzEwcHhdIGZvbnQtc2VtaWJvbGRcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1iYXNlLWNvbnRlbnRcIj57dChcIllvdXItU2lnbmF0dXJlXCIpfTwvcD5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvcC1jYXJkIHNoYWRvdy1tZCBoLVsxMTFweF0gdy1bOTAlXSBwLTJcIj5cbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICBhbHQ9XCJzaWduYXR1cmVcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbCBvYmplY3QtY29udGFpblwiXG4gICAgICAgICAgICBzcmM9e2RlZmF1bHRTaWduSW1nfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1zbSBtdC1bMTBweF1cIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGNvbmZpcm1Ub2FkZERlZmF1bHRTaWduKCl9XG4gICAgICAgID5cbiAgICAgICAgICB7dChcImF1dG8tc2lnbi1hbGxcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IERlZmF1bHRTaWduYXR1cmU7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcmV2TmV4dCBmcm9tIFwiLi9QcmV2TmV4dFwiO1xuaW1wb3J0IHtcbiAgaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZSxcbiAgaGFuZGxlRG93bmxvYWRQZGYsXG4gIGhhbmRsZVRvUHJpbnRcbn0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L1V0aWxzXCI7XG5pbXBvcnQgXCIuLi8uLi9zdHlsZXMvc2lnbmF0dXJlLmNzc1wiO1xuaW1wb3J0ICogYXMgRHJvcGRvd25NZW51IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtZHJvcGRvd24tbWVudVwiO1xuaW1wb3J0IE1vZGFsVWkgZnJvbSBcIi4uLy4uL3ByaW1pdGl2ZXMvTW9kYWxVaVwiO1xuaW1wb3J0IExvYWRlciBmcm9tIFwiLi4vLi4vcHJpbWl0aXZlcy9Mb2FkZXJcIjtcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcblxuZnVuY3Rpb24gSGVhZGVyKHtcbiAgaXNQZGZSZXF1ZXN0RmlsZXMsXG4gIGlzUGxhY2Vob2xkZXIsXG4gIHNldElzRGVjbGluZSxcbiAgcGFnZU51bWJlcixcbiAgYWxsUGFnZXMsXG4gIGNoYW5nZVBhZ2UsXG4gIHBkZlVybCxcbiAgZW1iZWRXaWRnZXRzRGF0YSxcbiAgcGRmRGV0YWlscyxcbiAgc2lnbmVyUG9zLFxuICBzaWduZXJzZGF0YSxcbiAgaXNNYWlsU2VuZCxcbiAgYWxlcnRTZW5kRW1haWwsXG4gIGlzQ29tcGxldGVkLFxuICBpc1Nob3dIZWFkZXIsXG4gIGRlY2xpbmUsXG4gIGN1cnJlbnRTaWduZXIsXG4gIGFscmVhZHlTaWduLFxuICBpc1NpZ25Zb3Vyc2VsZixcbiAgc2V0SXNFbWFpbCxcbiAgY29tcGxldGVCdG5UaXRsZSxcbiAgc2V0SXNFZGl0VGVtcGxhdGUsXG4gIGlzUHVibGljVGVtcGxhdGUsXG4gIGNsaWNrT25ab29tSW4sXG4gIGNsaWNrT25ab29tT3V0LFxuICBoYW5kbGVSb3RhdGlvbkZ1bixcbiAgaXNEaXNhYmxlUm90YXRlXG59KSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgZmlsdGVyUHJlZmlsbCA9XG4gICAgc2lnbmVyUG9zICYmIHNpZ25lclBvcz8uZmlsdGVyKChkYXRhKSA9PiBkYXRhLlJvbGUgIT09IFwicHJlZmlsbFwiKTtcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDc2NztcbiAgY29uc3QgW2lzRG93bmxvYWRpbmcsIHNldElzRG93bmxvYWRpbmddID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IGlzR3Vlc3RTaWduZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImlzR3Vlc3RTaWduZXJcIik7XG5cbiAgLy9mdW5jdGlvbiBmb3Igc2hvdyBkZWNsaW5lIGFsZXJ0XG4gIGNvbnN0IGhhbmRsZURlY2xpbmVQZGZBbGVydCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50RGVjbGluZSA9IHsgY3Vycm50OiBcIlN1cmVcIiwgaXNEZWNsaW5lZDogdHJ1ZSB9O1xuICAgIHNldElzRGVjbGluZShjdXJyZW50RGVjbGluZSk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggcHktWzVweF1cIj5cbiAgICAgIHtpc01vYmlsZSAmJiBpc1Nob3dIZWFkZXIgPyAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBpZD1cIm5hdmJhclwiXG4gICAgICAgICAgY2xhc3NOYW1lPXtpc0d1ZXN0U2lnbmVyID8gXCJzdGlja3lTaWduZXJIZWFkXCIgOiBcInN0aWNreUhlYWRcIn1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgd2lkdGg6IGlzR3Vlc3RTaWduZXJcbiAgICAgICAgICAgICAgPyB3aW5kb3cuaW5uZXJXaWR0aFxuICAgICAgICAgICAgICA6IHdpbmRvdy5pbm5lcldpZHRoIC0gMzAgKyBcInB4XCJcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgcHktWzVweF0gcHgtWzEwcHhdIFwiPlxuICAgICAgICAgICAgPGRpdiBvbkNsaWNrPXsoKSA9PiB3aW5kb3cuaGlzdG9yeS5nbygtMil9PlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWFycm93LWxlZnQgdGV4dC1iYXNlLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxQcmV2TmV4dFxuICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxuICAgICAgICAgICAgICBhbGxQYWdlcz17YWxsUGFnZXN9XG4gICAgICAgICAgICAgIGNoYW5nZVBhZ2U9e2NoYW5nZVBhZ2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge2lzQ29tcGxldGVkICYmIGFscmVhZHlTaWduID8gKFxuICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlJvb3Q+XG4gICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5UcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm9wLWxpbmsgb3AtbGluay1wcmltYXJ5IG5vLXVuZGVybGluZSB0ZXh0LVsxNnB4XSBmb250LXNlbWlib2xkIHByLVszcHhdIHBsLVs1cHhdXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZWxsaXBzaXMtdlwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Qb3J0YWw+XG4gICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LkNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51Q29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgIHNpZGVPZmZzZXQ9ezV9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIkRyb3Bkb3duTWVudUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZFBkZihwZGZEZXRhaWxzLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hcnJvdy1kb3duIG1yLVszcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dChcImRvd25sb2FkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxuICAgICAgICAgICAgICAgICAgICB7aXNDb21wbGV0ZWQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItbm9uZSBiZy1bI2ZmZl1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hd2FyZCBtci1bM3B4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJjZXJ0aWZpY2F0ZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIHtpc1NpZ25Zb3Vyc2VsZiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJEcm9wZG93bk1lbnVJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRW1haWwodHJ1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZW52ZWxvcGUgbXItWzNweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwibWFpbFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIkRyb3Bkb3duTWVudUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9QcmludChlLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1wcmludCBtci1bM3B4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJwcmludFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuSXRlbT5cbiAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuUG9ydGFsPlxuICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Sb290PlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYXJvdW5kIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIHsvKiBjdXJyZW50IHNpZ25lciBpcyBjaGVja2luZyB1c2VyIHNlbmQgcmVxdWVzdCBhbmQgY2hlY2sgc3RhdHVzIG9mIHBkZiBzaWduIHRoYW4gaWYgY3VycmVudCBcbiAgICAgICAgICAgICAgICB1c2VyIGV4aXN0IHRoYW4gc2hvdyBmaW5pc2ggYnV0dG9uIGVsc2Ugbm9cbiAgICAgICAgICAgICAgICAqL31cbiAgICAgICAgICAgICAgICB7Y3VycmVudFNpZ25lciAmJiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyXCIgZGF0YS10dXQ9XCJyZWFjdG91ckZpZnRoXCI+XG4gICAgICAgICAgICAgICAgICAgIHtkZWNsaW5lICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVEZWNsaW5lUGRmQWxlcnQoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtW3JlZF0gYm9yZGVyLW5vbmUgZm9udC1bNjUwXSB0ZXh0LVsxNHB4XSBtci0yXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dChcImRlY2xpbmVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIHtpc1BsYWNlaG9sZGVyID8gKFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc01haWxTZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnRTZW5kRW1haWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWFpbFNlbmQgPyBcIlwiIDogXCJvcC1saW5rLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBvcC1saW5rIG5vLXVuZGVybGluZSBmb250LVs2NTBdIHRleHQtWzE0cHhdYH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwiaGVhZGVyQXJlYVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbXBsZXRlQnRuVGl0bGUgPyBjb21wbGV0ZUJ0blRpdGxlIDogdChcInNlbmRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10dXQ9XCJyZWFjdG91clRoaXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGVtYmVkV2lkZ2V0c0RhdGEoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlci1ub25lIGZvbnQtWzY1MF0gdGV4dC1bMTRweF0gb3AtbGluayBvcC1saW5rLXByaW1hcnkgbm8tdW5kZXJsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dChcImZpbmlzaFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Sb290PlxuICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuVHJpZ2dlciBhc0NoaWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb250LVs2NTBdIHRleHQtWzE4cHhdIHB4LTIgbWwtWzRweF0gdGV4dC1iYXNlLWNvbnRlbnQgbm8tdW5kZXJsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZWxsaXBzaXMtdlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Qb3J0YWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LkNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctd2hpdGUgc2hhZG93LW1kIHJvdW5kZWQtbWQgcHgtMyBweS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZU9mZnNldD17NX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgdGV4dC1bMTNweF0gZm9jdXM6b3V0bGluZS1ub25lIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRQZGYoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHNbMF0/LlVSTCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hcnJvdy1kb3duIG1yLVszcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LVs1MDBdXCI+e3QoXCJkb3dubG9hZFwiKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHshaXNEaXNhYmxlUm90YXRlICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHRleHQtWzEzcHhdIGZvY3VzOm91dGxpbmUtbm9uZSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVJvdGF0aW9uRnVuKDkwKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtcm90YXRlLXJpZ2h0IHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdIG1yLVszcHhdXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LVs1MDBdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJyb3RhdGUtcmlnaHRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51Lkl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgdGV4dC1bMTNweF0gZm9jdXM6b3V0bGluZS1ub25lIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlUm90YXRpb25GdW4oLTkwKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtcm90YXRlLWxlZnQgdGV4dC1ncmF5LTUwMCAyeGw6dGV4dC1bMzBweF0gbXItWzNweF1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtWzUwMF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInJvdGF0ZS1sZWZ0XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHRleHQtWzEzcHhdIGZvY3VzOm91dGxpbmUtbm9uZSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gY2xpY2tPblpvb21JbigpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtbWFnbmlmeWluZy1nbGFzcy1wbHVzIHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtWzUwMF1cIj57dChcInpvb20taW5cIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51Lkl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciB0ZXh0LVsxM3B4XSBmb2N1czpvdXRsaW5lLW5vbmUgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGNsaWNrT25ab29tT3V0KCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1tYWduaWZ5aW5nLWdsYXNzLW1pbnVzIHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtWzUwMF1cIj57dChcInpvb20tb3V0XCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuUG9ydGFsPlxuICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Sb290PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciB3LWZ1bGwgZ2FwLXktMSBtbC0xXCI+XG4gICAgICAgICAgPFByZXZOZXh0XG4gICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxuICAgICAgICAgICAgYWxsUGFnZXM9e2FsbFBhZ2VzfVxuICAgICAgICAgICAgY2hhbmdlUGFnZT17Y2hhbmdlUGFnZX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHtpc1BsYWNlaG9sZGVyID8gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG14LVsxMDBweF0gbGc6bXgtMCBvcmRlci1sYXN0IGxnOm9yZGVyLW5vbmVcIj5cbiAgICAgICAgICAgICAgICB7IWlzTWFpbFNlbmQgJiZcbiAgICAgICAgICAgICAgICAgIHNpZ25lcnNkYXRhLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgIHNpZ25lcnNkYXRhLmxlbmd0aCAhPT0gZmlsdGVyUHJlZmlsbC5sZW5ndGggJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIHtmaWx0ZXJQcmVmaWxsLmxlbmd0aCA9PT0gMCA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzEzcHhdIHRleHQtWyNmNTQwNWVdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiYWRkXCIpfSB7c2lnbmVyc2RhdGEubGVuZ3RoIC0gZmlsdGVyUHJlZmlsbC5sZW5ndGh9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInJlY2lwaWVudHNcIil9IHt0KFwid2lkZ2V0cy1uYW1lLnNpZ25hdHVyZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1bI2Y1NDA1ZV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJhZGRcIil9IHtzaWduZXJzZGF0YS5sZW5ndGggLSBmaWx0ZXJQcmVmaWxsLmxlbmd0aH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwibW9yZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJyZWNpcGllbnRzXCIpfSB7dChcIndpZGdldHMtbmFtZS5zaWduYXR1cmVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAge3NldElzRWRpdFRlbXBsYXRlICYmIChcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNFZGl0VGVtcGxhdGUodHJ1ZSl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm91dGxpbmUtbm9uZSBib3JkZXItbm9uZSB0ZXh0LWNlbnRlciBtci1bM3B4XVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWdlYXIgZmEtbGdcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHdpbmRvdy5oaXN0b3J5LmdvKC0yKX1cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdCBvcC1idG4tc20gbXItWzNweF1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt0KFwiYmFja1wiKX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNNYWlsU2VuZCAmJiB0cnVlfVxuICAgICAgICAgICAgICAgICAgZGF0YS10dXQ9XCJoZWFkZXJBcmVhXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gbXItWzNweF1cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gYWxlcnRTZW5kRW1haWwoKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7Y29tcGxldGVCdG5UaXRsZVxuICAgICAgICAgICAgICAgICAgICA/IGNvbXBsZXRlQnRuVGl0bGVcbiAgICAgICAgICAgICAgICAgICAgOiBpc01haWxTZW5kXG4gICAgICAgICAgICAgICAgICAgICAgPyB0KFwic2VudFwiKVxuICAgICAgICAgICAgICAgICAgICAgIDogdChcInNlbmRcIil9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKSA6IGlzUGRmUmVxdWVzdEZpbGVzID8gKFxuICAgICAgICAgICAgYWxyZWFkeVNpZ24gPyAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBoYW5kbGVUb1ByaW50KGUsIHBkZlVybCwgc2V0SXNEb3dubG9hZGluZyl9XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tbmV1dHJhbCBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1wcmludCBweS1bM3B4XVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+e3QoXCJwcmludFwiKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAge2lzQ29tcGxldGVkICYmIChcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZShwZGZEZXRhaWxzLCBzZXRJc0Rvd25sb2FkaW5nKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tc2Vjb25kYXJ5IG9wLWJ0bi1zbSBtci1bM3B4XSBzaGFkb3dcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWF3YXJkIHB5LVszcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj57dChcImNlcnRpZmljYXRlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnkgb3AtYnRuLXNtIG1yLVszcHhdIHNoYWRvd1wiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZFBkZihwZGZEZXRhaWxzLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZG93bmxvYWQgcHktWzNweF1cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPnt0KFwiZG93bmxvYWRcIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleFwiIGRhdGEtdHV0PVwicmVhY3RvdXJGaWZ0aFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHdpbmRvdy5oaXN0b3J5LmdvKC0yKX1cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdCBvcC1idG4tc20gbXItWzNweF1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt0KFwiYmFja1wiKX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB7Y3VycmVudFNpZ25lciAmJiAoXG4gICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnkgb3AtYnRuLXNtIG1yLVszcHhdIHNoYWRvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVjbGluZVBkZkFsZXJ0KCl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7dChcImRlY2xpbmVcIil9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1zbSBtci1bM3B4XSBzaGFkb3dcIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGVtYmVkV2lkZ2V0c0RhdGEoKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt0KFwiZmluaXNoXCIpfVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tbmV1dHJhbCBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRQZGYocGRmRGV0YWlscywgcGRmVXJsLCBzZXRJc0Rvd25sb2FkaW5nKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWFycm93LWRvd24gZm9udC1zZW1pYm9sZCBsZzpoaWRkZW5cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+e3QoXCJkb3dubG9hZFwiKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSA6IGlzQ29tcGxldGVkID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgIHtpc0NvbXBsZXRlZCAmJiAoXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlKHBkZkRldGFpbHMsIHNldElzRG93bmxvYWRpbmcpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXNlY29uZGFyeSBvcC1idG4tc20gZ2FwLTAgZm9udC1tZWRpdW0gdGV4dC1bMTJweF0gbXItWzNweF0gc2hhZG93XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hd2FyZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9jayBtbC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIHt0KFwiY2VydGlmaWNhdGVcIil9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gaGFuZGxlVG9QcmludChlLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpfVxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tbmV1dHJhbCBvcC1idG4tc20gZ2FwLTAgZm9udC1tZWRpdW0gdGV4dC1bMTJweF0gbXItWzNweF0gc2hhZG93XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXByaW50XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9jayBtbC0xXCI+e3QoXCJwcmludFwiKX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1zbSBnYXAtMCBmb250LW1lZGl1bSB0ZXh0LVsxMnB4XSBtci1bM3B4XSBzaGFkb3dcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZFBkZihwZGZEZXRhaWxzLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZG93bmxvYWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrIG1sLTFcIj57dChcImRvd25sb2FkXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWluZm8gb3AtYnRuLXNtIGdhcC0wIGZvbnQtbWVkaXVtIHRleHQtWzEycHhdIG1yLVszcHhdIHNoYWRvd1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNFbWFpbCh0cnVlKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWVudmVsb3BlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9jayBtbC0xXCI+e3QoXCJtYWlsXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogaXNQdWJsaWNUZW1wbGF0ZSA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1zbSAgc2hhZG93XCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBlbWJlZFdpZGdldHNEYXRhKCl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7dChcInNpZ24tbm93XCIpfVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXhcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHdpbmRvdy5oaXN0b3J5LmdvKC0yKX1cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0IG9wLWJ0bi1zbSBtci1bM3B4XVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7dChcImJhY2tcIil9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1zbSBtci1bM3B4XVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZW1iZWRXaWRnZXRzRGF0YSgpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3QoXCJmaW5pc2hcIil9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgICAge2lzRG93bmxvYWRpbmcgPT09IFwicGRmXCIgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIHotWzIwMF0gaW5zZXQtMCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBiZy1ibGFjayBiZy1vcGFjaXR5LTMwXCI+XG4gICAgICAgICAgPExvYWRlciAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICA8TW9kYWxVaVxuICAgICAgICBpc09wZW49e2lzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIn1cbiAgICAgICAgdGl0bGU9e1xuICAgICAgICAgIGlzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIlxuICAgICAgICAgICAgPyB0KFwiZ2VuZXJhdGluZy1jZXJ0aWZpY2F0ZVwiKVxuICAgICAgICAgICAgOiB0KFwicGRmLWRvd25sb2FkXCIpXG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHNldElzRG93bmxvYWRpbmcoXCJcIil9XG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC0zIG1kOnAtNSB0ZXh0LVsxM3B4XSBtZDp0ZXh0LWJhc2UgdGV4dC1jZW50ZXIgdGV4dC1iYXNlLWNvbnRlbnRcIj5cbiAgICAgICAgICB7aXNEb3dubG9hZGluZyA9PT0gXCJjZXJ0aWZpY2F0ZVwifXtcIiBcIn1cbiAgICAgICAgICA8cD57dChcImdlbmVyYXRlLWNlcnRpZmljYXRlLWFsZXJ0XCIpfTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L01vZGFsVWk+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcblxuZnVuY3Rpb24gUGRmWm9vbShwcm9wcykge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG5cbiAgcmV0dXJuIChcbiAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6ZmxleCBmbGV4LWNvbCBnYXAtMSB0ZXh0LWNlbnRlciBtZDp3LVs1JV0gbXQtWzQzcHhdIDJ4bDptdC1bNjNweF1cIj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzTmFtZT1cImJnLWdyYXktNTAgcHgtWzRweF0gMnhsOnB4LVsxNXB4XSAyeGw6cHktWzEwcHhdIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgb25DbGljaz17KCkgPT4gcHJvcHMuY2xpY2tPblpvb21JbigpfVxuICAgICAgICB0aXRsZT17dChcInpvb20taW5cIil9XG4gICAgICA+XG4gICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLW1hZ25pZnlpbmctZ2xhc3MtcGx1cyB0ZXh0LWdyYXktNTAwIDJ4bDp0ZXh0LVszMHB4XVwiPjwvaT5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIHshcHJvcHM/LmlzRGlzYWJsZVJvdGF0ZSAmJiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLWdyYXktNTAgcHgtWzRweF0gMnhsOnB4LVsxNXB4XSAyeGw6cHktWzEwcHhdIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHByb3BzLmhhbmRsZVJvdGF0aW9uRnVuKDkwKX1cbiAgICAgICAgICAgIHRpdGxlPXt0KFwicm90YXRlLXJpZ2h0XCIpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXJvdGF0ZS1yaWdodCB0ZXh0LWdyYXktNTAwIDJ4bDp0ZXh0LVszMHB4XVwiPjwvaT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLWdyYXktNTAgcHgtWzRweF0gMnhsOnB4LVsxNXB4XSAyeGw6cHktWzEwcHhdIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgIHRpdGxlPXt0KFwicm90YXRlLWxlZnRcIil9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5oYW5kbGVSb3RhdGlvbkZ1bigtOTApfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXJvdGF0ZS1sZWZ0IHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdXCI+PC9pPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC8+XG4gICAgICApfVxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3NOYW1lPVwiYmctZ3JheS01MCBweC1bNHB4XSAyeGw6cHgtWzE1cHhdIDJ4bDpweS1bMTBweF1cIlxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5jbGlja09uWm9vbU91dCgpfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGN1cnNvcjogcHJvcHMuem9vbVBlcmNlbnQgPiAwID8gXCJwb2ludGVyXCIgOiBcImRlZmF1bHRcIlxuICAgICAgICB9fVxuICAgICAgICB0aXRsZT17dChcInpvb20tb3V0XCIpfVxuICAgICAgPlxuICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1tYWduaWZ5aW5nLWdsYXNzLW1pbnVzIHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdXCI+PC9pPlxuICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGRmWm9vbTtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgQm9yZGVyUmVzaXplIGZyb20gXCIuL0JvcmRlclJlc2l6ZVwiO1xuaW1wb3J0IFBsYWNlaG9sZGVyQm9yZGVyIGZyb20gXCIuL1BsYWNlaG9sZGVyQm9yZGVyXCI7XG5pbXBvcnQgeyBSbmQgfSBmcm9tIFwicmVhY3Qtcm5kXCI7XG5pbXBvcnQge1xuICBkZWZhdWx0V2lkdGhIZWlnaHQsXG4gIGZvbnRDb2xvckFycixcbiAgZm9udHNpemVBcnIsXG4gIGdldENvbnRhaW5lclNjYWxlLFxuICBoYW5kbGVDb3B5TmV4dFRvV2lkZ2V0LFxuICBpc1RhYkFuZE1vYmlsZSxcbiAgb25DaGFuZ2VJbnB1dCxcbiAgcmFkaW9CdXR0b25XaWRnZXQsXG4gIHRleHRJbnB1dFdpZGdldCxcbiAgdGV4dFdpZGdldFxufSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcbmltcG9ydCBQbGFjZWhvbGRlclR5cGUgZnJvbSBcIi4vUGxhY2Vob2xkZXJUeXBlXCI7XG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcbmltcG9ydCBcIi4uLy4uL3N0eWxlcy9vcGVuc2lnbmRyaXZlLmNzc1wiO1xuaW1wb3J0IE1vZGFsVWkgZnJvbSBcIi4uLy4uL3ByaW1pdGl2ZXMvTW9kYWxVaVwiO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xuXG5jb25zdCBzZWxlY3RGb3JtYXQgPSAoZGF0YSkgPT4ge1xuICBzd2l0Y2ggKGRhdGEpIHtcbiAgICBjYXNlIFwiTFwiOlxuICAgICAgcmV0dXJuIFwiTU0vZGQveXl5eVwiO1xuICAgIGNhc2UgXCJERC1NTS1ZWVlZXCI6XG4gICAgICByZXR1cm4gXCJkZC1NTS15eXl5XCI7XG4gICAgY2FzZSBcIkREL01NL1lZWVlcIjpcbiAgICAgIHJldHVybiBcImRkL01NL3l5eXlcIjtcbiAgICBjYXNlIFwiTExcIjpcbiAgICAgIHJldHVybiBcIk1NTU0gZGQsIHl5eXlcIjtcbiAgICBjYXNlIFwiREQgTU1NLCBZWVlZXCI6XG4gICAgICByZXR1cm4gXCJkZCBNTU0sIHl5eXlcIjtcbiAgICBjYXNlIFwiWVlZWS1NTS1ERFwiOlxuICAgICAgcmV0dXJuIFwieXl5eS1NTS1kZFwiO1xuICAgIGNhc2UgXCJNTS1ERC1ZWVlZXCI6XG4gICAgICByZXR1cm4gXCJNTS1kZC15eXl5XCI7XG4gICAgY2FzZSBcIk1NLkRELllZWVlcIjpcbiAgICAgIHJldHVybiBcIk1NLmRkLnl5eXlcIjtcbiAgICBjYXNlIFwiTU1NIERELCBZWVlZXCI6XG4gICAgICByZXR1cm4gXCJNTU0gZGQsIHl5eXlcIjtcbiAgICBjYXNlIFwiREQgTU1NTSwgWVlZWVwiOlxuICAgICAgcmV0dXJuIFwiZGQgTU1NTSwgeXl5eVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJNTS9kZC95eXl5XCI7XG4gIH1cbn07XG5cbmNvbnN0IGNoYW5nZURhdGVUb01vbWVudEZvcm1hdCA9IChmb3JtYXQpID0+IHtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwiTU0vZGQveXl5eVwiOlxuICAgICAgcmV0dXJuIFwiTFwiO1xuICAgIGNhc2UgXCJkZC1NTS15eXl5XCI6XG4gICAgICByZXR1cm4gXCJERC1NTS1ZWVlZXCI7XG4gICAgY2FzZSBcImRkL01NL3l5eXlcIjpcbiAgICAgIHJldHVybiBcIkREL01NL1lZWVlcIjtcbiAgICBjYXNlIFwiTU1NTSBkZCwgeXl5eVwiOlxuICAgICAgcmV0dXJuIFwiTExcIjtcbiAgICBjYXNlIFwiZGQgTU1NLCB5eXl5XCI6XG4gICAgICByZXR1cm4gXCJERCBNTU0sIFlZWVlcIjtcbiAgICBjYXNlIFwieXl5eS1NTS1kZFwiOlxuICAgICAgcmV0dXJuIFwiWVlZWS1NTS1ERFwiO1xuICAgIGNhc2UgXCJNTS1kZC15eXl5XCI6XG4gICAgICByZXR1cm4gXCJNTS1ERC1ZWVlZXCI7XG4gICAgY2FzZSBcIk1NLmRkLnl5eXlcIjpcbiAgICAgIHJldHVybiBcIk1NLkRELllZWVlcIjtcbiAgICBjYXNlIFwiTU1NIGRkLCB5eXl5XCI6XG4gICAgICByZXR1cm4gXCJNTU0gREQsIFlZWVlcIjtcbiAgICBjYXNlIFwiZGQgTU1NTSwgeXl5eVwiOlxuICAgICAgcmV0dXJuIFwiREQgTU1NTSwgWVlZWVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJMXCI7XG4gIH1cbn07XG5cbi8vZnVuY3Rpb24gdG8gZ2V0IGRlZmF1bHQgZGF0ZVxuY29uc3QgZ2V0RGVmYXVsdGRhdGUgPSAoc2VsZWN0ZWREYXRlLCBmb3JtYXQgPSBcImRkLU1NLXl5eXlcIikgPT4ge1xuICBsZXQgZGF0ZTtcbiAgaWYgKGZvcm1hdCAmJiBmb3JtYXQgPT09IFwiZGQtTU0teXl5eVwiKSB7XG4gICAgY29uc3QgbmV3ZGF0ZSA9IHNlbGVjdGVkRGF0ZVxuICAgICAgPyBzZWxlY3RlZERhdGVcbiAgICAgIDogbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdChjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQoZm9ybWF0KSk7XG4gICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gbmV3ZGF0ZS5zcGxpdChcIi1cIik7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWApO1xuICB9IGVsc2Uge1xuICAgIGRhdGUgPSBuZXcgRGF0ZShzZWxlY3RlZERhdGUpO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gZGF0ZTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcbi8vZnVuY3Rpb24gdG8gZ2V0IGRlZmF1bHQgZm9ybWF0XG5jb25zdCBnZXREZWZhdWx0Rm9ybWF0ID0gKGRhdGVGb3JtYXQpID0+IGRhdGVGb3JtYXQgfHwgXCJNTS9kZC95eXl5XCI7XG5cbmZ1bmN0aW9uIFBsYWNlaG9sZGVyKHByb3BzKSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW3BsYWNlaG9sZGVyQm9yZGVyLCBzZXRQbGFjZWhvbGRlckJvcmRlcl0gPSB1c2VTdGF0ZSh7IHc6IDAsIGg6IDAgfSk7XG4gIGNvbnN0IFtpc0RyYWdnaW5nRW5hYmxlZCwgc2V0RHJhZ2dpbmdFbmFibGVkXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCBbaXNEYXRlTW9kYWwsIHNldElzRGF0ZU1vZGFsXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2NvbnRhaW5lclNjYWxlLCBzZXRDb250YWluZXJTY2FsZV0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBbc2VsZWN0RGF0ZSwgc2V0U2VsZWN0RGF0ZV0gPSB1c2VTdGF0ZSh7XG4gICAgZGF0ZTpcbiAgICAgIHByb3BzLnBvcy50eXBlID09PSBcImRhdGVcIlxuICAgICAgICA/IG1vbWVudChcbiAgICAgICAgICAgIGdldERlZmF1bHRkYXRlKFxuICAgICAgICAgICAgICBwcm9wcz8ucG9zPy5vcHRpb25zPy5yZXNwb25zZSxcbiAgICAgICAgICAgICAgcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXRcbiAgICAgICAgICAgICkuZ2V0VGltZSgpXG4gICAgICAgICAgKS5mb3JtYXQoXG4gICAgICAgICAgICBjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXQpXG4gICAgICAgICAgKVxuICAgICAgICA6IFwiXCIsXG4gICAgZm9ybWF0OlxuICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiZGF0ZVwiXG4gICAgICAgID8gZ2V0RGVmYXVsdEZvcm1hdChwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LmZvcm1hdClcbiAgICAgICAgOiBcIlwiXG4gIH0pO1xuICBjb25zdCBbZGF0ZUZvcm1hdCwgc2V0RGF0ZUZvcm1hdF0gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtzdGFydERhdGUsIHNldFN0YXJ0RGF0ZV0gPSB1c2VTdGF0ZShcbiAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJkYXRlXCIgJiZcbiAgICAgIGdldERlZmF1bHRkYXRlKFxuICAgICAgICBwcm9wcz8ucG9zPy5vcHRpb25zPy5yZXNwb25zZSxcbiAgICAgICAgcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXRcbiAgICAgIClcbiAgKTtcbiAgY29uc3QgW2dldENoZWNrYm94UmVuZGVyV2lkdGgsIHNldEdldENoZWNrYm94UmVuZGVyV2lkdGhdID0gdXNlU3RhdGUoe1xuICAgIHdpZHRoOiBudWxsLFxuICAgIGhlaWdodDogbnVsbFxuICB9KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGdldFBkZlBhZ2VXaWR0aCA9IHByb3BzLnBkZk9yaWdpbmFsV0guZmluZChcbiAgICAgIChkYXRhKSA9PiBkYXRhLnBhZ2VOdW1iZXIgPT09IHByb3BzLnBhZ2VOdW1iZXJcbiAgICApO1xuICAgIHNldENvbnRhaW5lclNjYWxlKHByb3BzLmNvbnRhaW5lcldILndpZHRoIC8gZ2V0UGRmUGFnZVdpZHRoLndpZHRoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtwcm9wcy5jb250YWluZXJXSC53aWR0aCwgcHJvcHMucGRmT3JpZ2luYWxXSF0pO1xuICBjb25zdCBkYXRlRm9ybWF0QXJyID0gW1xuICAgIFwiTFwiLFxuICAgIFwiREQtTU0tWVlZWVwiLFxuICAgIFwiWVlZWS1NTS1ERFwiLFxuICAgIFwiTU0uREQuWVlZWVwiLFxuICAgIFwiTU0tREQtWVlZWVwiLFxuICAgIFwiTU1NIERELCBZWVlZXCIsXG4gICAgXCJMTFwiLFxuICAgIFwiREQgTU1NLCBZWVlZXCIsXG4gICAgXCJERCBNTU1NLCBZWVlZXCJcbiAgXTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZVdpZHRoID0gKCkgPT4ge1xuICAgICAgY29uc3Qgcm5kRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByb3BzLnBvcy5rZXkpO1xuICAgICAgaWYgKHJuZEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBybmRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBzZXRHZXRDaGVja2JveFJlbmRlcldpZHRoKHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRGVsYXkgdG8gZW5zdXJlIHJlbmRlcmluZyBpcyBjb21wbGV0ZVxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCh1cGRhdGVXaWR0aCwgMCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfSwgW3Byb3BzLnBvc10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY2xvc2VNZW51T25PdXRzaWRlQ2xpY2sgPSAoZSkgPT4ge1xuICAgICAgaWYgKCFpc0RyYWdnaW5nRW5hYmxlZCAmJiAhZS50YXJnZXQuY2xvc2VzdChcIiNjaGFuZ2VJc0RyYWdnaW5nXCIpKSB7XG4gICAgICAgIHNldERyYWdnaW5nRW5hYmxlZCh0cnVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGNsb3NlTWVudU9uT3V0c2lkZUNsaWNrKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAvLyBDbGVhbnVwIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBjbG9zZU1lbnVPbk91dHNpZGVDbGljayk7XG4gICAgfTtcbiAgfSwgW2lzRHJhZ2dpbmdFbmFibGVkXSk7XG4gIC8vZnVuY3Rpb24gY2hhbmdlIGZvcm1hdCBhcnJheSBsaXN0IHdpdGggc2VsZWN0ZWQgZGF0ZSBhbmQgZm9ybWF0XG4gIGNvbnN0IGNoYW5nZURhdGVGb3JtYXQgPSAoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlRGF0ZSA9IFtdO1xuICAgIGRhdGVGb3JtYXRBcnIubWFwKChkYXRhKSA9PiB7XG4gICAgICBsZXQgZGF0ZTtcbiAgICAgIGlmIChzZWxlY3REYXRlICYmIHNlbGVjdERhdGUuZm9ybWF0ID09PSBcImRkLU1NLXl5eXlcIikge1xuICAgICAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSBzZWxlY3REYXRlLmRhdGUuc3BsaXQoXCItXCIpO1xuICAgICAgICBkYXRlID0gbmV3IERhdGUoYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRlID0gbmV3IERhdGUoc2VsZWN0RGF0ZT8uZGF0ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSBtb21lbnQobWlsbGlzZWNvbmRzKS5mb3JtYXQoZGF0YSk7XG4gICAgICBjb25zdCBkYXRlT2JqID0ge1xuICAgICAgICBkYXRlOiBuZXdEYXRlLFxuICAgICAgICBmb3JtYXQ6IHNlbGVjdEZvcm1hdChkYXRhKVxuICAgICAgfTtcbiAgICAgIHVwZGF0ZURhdGUucHVzaChkYXRlT2JqKTtcbiAgICB9KTtcbiAgICBzZXREYXRlRm9ybWF0KHVwZGF0ZURhdGUpO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHByb3BzLmlzUGxhY2Vob2xkZXIgfHwgcHJvcHMuaXNTaWduWW91cnNlbGYpIHtcbiAgICAgIHNlbGVjdERhdGUgJiYgY2hhbmdlRGF0ZUZvcm1hdCgpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtzZWxlY3REYXRlXSk7XG5cbiAgLy9gaGFuZGxlV2lkZ2V0SWRhbmRQb3B1cGAgaXMgdXNlZCB0byBzZXQgY3VycmVudCB3aWRnZXQgaWQgYW5kIG9wZW4gcmVsYXRpdmUgcG9wdXBcbiAgY29uc3QgaGFuZGxlV2lkZ2V0SWRhbmRQb3B1cCA9ICgpID0+IHtcbiAgICBpZiAocHJvcHMuc2V0U2VsZWN0V2lkZ2V0SWQpIHtcbiAgICAgIHByb3BzLnNldFNlbGVjdFdpZGdldElkKHByb3BzLnBvcy5rZXkpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZGdldFR5cGVFeGlzdCA9IFtcbiAgICAgIHRleHRJbnB1dFdpZGdldCxcbiAgICAgIFwiY2hlY2tib3hcIixcbiAgICAgIFwibmFtZVwiLFxuICAgICAgXCJjb21wYW55XCIsXG4gICAgICBcImpvYiB0aXRsZVwiLFxuICAgICAgXCJkYXRlXCIsXG4gICAgICBcImVtYWlsXCIsXG4gICAgICB0ZXh0V2lkZ2V0XG4gICAgXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSk7XG5cbiAgICBpZiAod2lkZ2V0VHlwZUV4aXN0KSB7XG4gICAgICBzZXREcmFnZ2luZ0VuYWJsZWQoZmFsc2UpO1xuICAgIH1cbiAgICBpZiAoKHByb3BzLmlzTmVlZFNpZ24gfHwgcHJvcHMuaXNTaWduWW91cnNlbGYpICYmICFwcm9wcy5pc0RyYWdnaW5nKSB7XG4gICAgICBpZiAocHJvcHM/LmlzcHVibGljVGVtcGxhdGUpIHtcbiAgICAgICAgcHJvcHMuaGFuZGxlVXNlckRldGFpbHMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9wcy5wb3MudHlwZSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcInNpZ25hdHVyZVwiIHx8XG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJzdGFtcFwiIHx8XG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJpbWFnZVwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcm9wcy5zZXRJc1NpZ25QYWQodHJ1ZSk7XG4gICAgICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xuICAgICAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChwcm9wcy5wb3MuaXNTdGFtcCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5wb3MudHlwZSA9PT0gXCJpbml0aWFsc1wiKSB7XG4gICAgICAgICAgICBwcm9wcy5zZXRJc1NpZ25QYWQodHJ1ZSk7XG4gICAgICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xuICAgICAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChwcm9wcy5wb3MuaXNTdGFtcCk7XG4gICAgICAgICAgICBwcm9wcy5zZXRJc0luaXRpYWwodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzLnNldElzU2lnblBhZCh0cnVlKTtcbiAgICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xuICAgICAgICAgIHByb3BzLnNldElzU3RhbXAocHJvcHMucG9zPy5pc1N0YW1wID8gcHJvcHMucG9zLmlzU3RhbXAgOiBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgcHJvcHMuaXNQbGFjZWhvbGRlciAmJlxuICAgICAgIXByb3BzLmlzRHJhZ2dpbmcgJiZcbiAgICAgIHByb3BzLnBvcy50eXBlICE9PSB0ZXh0V2lkZ2V0XG4gICAgKSB7XG4gICAgICBpZiAocHJvcHMucG9zLmtleSA9PT0gcHJvcHMuc2VsZWN0V2lkZ2V0SWQpIHtcbiAgICAgICAgcHJvcHMuaGFuZGxlTGlua1VzZXIocHJvcHMuZGF0YS5JZCk7XG4gICAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzLmRhdGEuSWQpO1xuICAgICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcbiAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxuICAgICAgICApO1xuICAgICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghcHJvcHMucG9zLnR5cGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXByb3BzLnBvcy50eXBlICYmXG4gICAgICAgIHByb3BzLmlzTmVlZFNpZ24gJiZcbiAgICAgICAgcHJvcHMuZGF0YS5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWRcbiAgICAgICkge1xuICAgICAgICBwcm9wcy5zZXRJc1NpZ25QYWQodHJ1ZSk7XG4gICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XG4gICAgICAgIHByb3BzLnNldElzU3RhbXAocHJvcHMucG9zLmlzU3RhbXApO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMucG9zLnR5cGUgPT09IFwic2lnbmF0dXJlXCIpIHx8XG4gICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcInN0YW1wXCJcbiAgICAgICkge1xuICAgICAgICBwcm9wcy5zZXRJc1NpZ25QYWQodHJ1ZSk7XG4gICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XG4gICAgICAgIHByb3BzLnNldElzU3RhbXAocHJvcHMucG9zLmlzU3RhbXApO1xuICAgICAgfSBlbHNlIGlmIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLnBvcy50eXBlID09PSBcImRyb3Bkb3duXCIpIHtcbiAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGhhbmRsZU9uQ2xpY2tQbGFjZWhvbGRlciA9ICgpID0+IHtcbiAgICBwcm9wcy5zZXRDdXJyV2lkZ2V0c0RldGFpbHMgJiYgcHJvcHMuc2V0Q3VycldpZGdldHNEZXRhaWxzKHByb3BzLnBvcyk7XG4gICAgaWYgKCFwcm9wcy5pc05lZWRTaWduKSB7XG4gICAgICBwcm9wcy5zZXRXaWRnZXRUeXBlKHByb3BzLnBvcy50eXBlKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSB7XG4gICAgICBoYW5kbGVXaWRnZXRJZGFuZFBvcHVwKCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHByb3BzPy5pc05lZWRTaWduICYmXG4gICAgICBwcm9wcz8udW5pcXVlSWQgJiZcbiAgICAgIHByb3BzLmRhdGE/LklkID09PSBwcm9wcz8udW5pcXVlSWRcbiAgICApIHtcbiAgICAgIGhhbmRsZVdpZGdldElkYW5kUG9wdXAoKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLmlzUGxhY2Vob2xkZXIgfHwgcHJvcHMuaXNTaWduWW91cnNlbGYpIHtcbiAgICAgIGhhbmRsZVdpZGdldElkYW5kUG9wdXAoKTtcbiAgICB9XG4gIH07XG4gIC8vYGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbmAgaXMgdXNlZCBzZXQgY3VycmVudCB3aWRnZXQgZGV0YWlscyBhbmQgb3BlbiBzZXR0aW5nIG9mIGl0XG4gIGNvbnN0IGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbiA9ICgpID0+IHtcbiAgICBpZiAocHJvcHMucG9zLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0KSB7XG4gICAgICBwcm9wcy5zZXRJc1JhZGlvKHRydWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcHMucG9zLnR5cGUgPT09IFwiZHJvcGRvd25cIikge1xuICAgICAgcHJvcHM/LnNldFNob3dEcm9wZG93bih0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLnBvcy50eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgIHByb3BzPy5zZXRJc0NoZWNrYm94KHRydWUpO1xuICAgIH1cbiAgICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgc2V0dGluZyBpY29uIGZvciBzaWdueW91ci1zZWxmIGZsb3cgZm9yIGFsbCB0eXBlIHRleHQgd2lkZ2V0c1xuICAgIGVsc2UgaWYgKFxuICAgICAgW1xuICAgICAgICB0ZXh0SW5wdXRXaWRnZXQsXG4gICAgICAgIHRleHRXaWRnZXQsXG4gICAgICAgIFwibmFtZVwiLFxuICAgICAgICBcImNvbXBhbnlcIixcbiAgICAgICAgXCJqb2IgdGl0bGVcIixcbiAgICAgICAgXCJlbWFpbFwiXG4gICAgICBdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKSAmJlxuICAgICAgcHJvcHMuaXNTaWduWW91cnNlbGZcbiAgICApIHtcbiAgICAgIHByb3BzLmhhbmRsZVRleHRTZXR0aW5nTW9kYWwodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3BzPy5oYW5kbGVOYW1lTW9kYWwgJiYgcHJvcHM/LmhhbmRsZU5hbWVNb2RhbCh0cnVlKTtcbiAgICB9XG5cbiAgICAvL2NvbmRpdGlvbiBmb3Igb25seSBwbGFjZWhvbGRlciBhbmQgdGVtcGxhdGUgZmxvd1xuICAgIGlmIChwcm9wcy5kYXRhICYmIHByb3BzPy5wb3M/LnR5cGUgIT09IHRleHRXaWRnZXQpIHtcbiAgICAgIHByb3BzLnNldFNpZ25lck9iaklkKHByb3BzPy5kYXRhPy5zaWduZXJPYmpJZCk7XG4gICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcz8uZGF0YT8uSWQpO1xuICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXG4gICAgICAgIChkYXRhKSA9PiBkYXRhLklkID09PSBwcm9wcy5kYXRhLklkXG4gICAgICApO1xuXG4gICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XG4gICAgfVxuICAgIC8vY29uZGl0aW9uIHRvIGhhbmRsZSBpbiBwbGFjZWhvbGRlciBhbmQgdGVtcGxhdGUgZmxvdyBmb3IgdGV4dCB3aWRnZXQgc2lnbmVySWQgZm9yIHRleHQgd2lkZ2V0cyBpIGhhdmUgdG8gc2V0IHVuaXF1ZUlkIGluIHRlbXBTaWduZXJJZCBiZWNhdXNlXG4gICAgLy9pdCBkb2VzIG5vdCBoYXZlIGFueSBzaWduZXIgdXNlciBhbmQgYW55IHNpZ25lcm9iaklkXG4gICAgZWxzZSBpZiAocHJvcHMuZGF0YSAmJiBwcm9wcy5wb3MudHlwZSA9PT0gdGV4dFdpZGdldCkge1xuICAgICAgcHJvcHMuc2V0VGVtcFNpZ25lcklkKHByb3BzLnVuaXF1ZUlkKTtcbiAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzPy5kYXRhPy5JZCk7XG4gICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcbiAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcbiAgICAgICk7XG4gICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XG4gICAgfVxuICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XG4gICAgcHJvcHMuc2V0V2lkZ2V0VHlwZShwcm9wcy5wb3MudHlwZSk7XG4gICAgcHJvcHMuc2V0Q3VycldpZGdldHNEZXRhaWxzKHByb3BzLnBvcyk7XG4gIH07XG4gIC8vZnVuY3Rpb24gdG8gc2V0IHJlcXVpcmVkIHN0YXRlIHZhbHVlIG9uY2xpY2sgb24gd2lkZ2V0J3MgY29weSBpY29uXG4gIGNvbnN0IGhhbmRsZUNvcHlQbGFjZWhvbGRlciA9IChlKSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgdGV4dCB3aWRnZXQgc2lnbmVyIG9iaiBpZCBhbmQgdW5pcXVlIGlkXG4gICAgLy93aGVuIHVzZXIgY2xpY2sgb24gY29weSBpY29uIG9mIHRleHQgd2lkZ2V0IGluIHRoYXQgY29uZGl0aW9uIHRleHQgd2lkZ2V0IGRvZXMgbm90IGhhdmUgYW55IHNpZ25lck9iaklkXG4gICAgLy9pbiB0aGF0IGNhc2UgaSBoYXZlIHRvIHNhdmUgaW4gdGVtcFNpZ25lcklkIGFzIGEgdW5pcXVlIGlkIG9mIHByZXZpb3VzIHNlbGVjdCBzaWduZXIncyB1bmlxdWUgaWRcbiAgICAvL2FuZCBvbiBzYXZlIG9yIGNhbmNlbCBidXR0b24gb2YgY29weSBhbGwgcGFnZSBwb3B1cCBpIGhhdmUgc2V0IHRoaXMgdGVtcCBzaWduZXIgSWQgaW4gdW5pcXVlIGlkXG5cbiAgICBpZiAocHJvcHMuZGF0YSAmJiBwcm9wcz8ucG9zPy50eXBlICE9PSB0ZXh0V2lkZ2V0KSB7XG4gICAgICBwcm9wcy5zZXRTaWduZXJPYmpJZChwcm9wcz8uZGF0YT8uc2lnbmVyT2JqSWQpO1xuICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHM/LmRhdGE/LklkKTtcbiAgICAgIGNvbnN0IGNoZWNrSW5kZXggPSBwcm9wcy54eVBvc3Rpb24uZmluZEluZGV4KFxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxuICAgICAgKTtcblxuICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuZGF0YSAmJiBwcm9wcy5wb3MudHlwZSA9PT0gdGV4dFdpZGdldCkge1xuICAgICAgcHJvcHMuc2V0VGVtcFNpZ25lcklkKHByb3BzLnVuaXF1ZUlkKTtcbiAgICAgIHByb3BzLnNldFNpZ25lck9iaklkKHByb3BzPy5kYXRhPy5zaWduZXJPYmpJZCk7XG4gICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcz8uZGF0YT8uSWQpO1xuICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXG4gICAgICAgIChkYXRhKSA9PiBkYXRhLklkID09PSBwcm9wcy5kYXRhLklkXG4gICAgICApO1xuICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xuICAgIH1cblxuICAgIC8vY2hlY2tpbmcgd2lkZ2V0J3MgdHlwZSBhbmQgb3BlbiB3aWRnZXQgY29weSBtb2RhbCBmb3IgcmVxdWlyZWQgd2lkZ2V0c1xuICAgIGlmIChcbiAgICAgIFtcInNpZ25hdHVyZVwiLCB0ZXh0V2lkZ2V0LCBcInN0YW1wXCIsIFwiaW5pdGlhbFwiXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSlcbiAgICApIHtcbiAgICAgIHByb3BzLnNldElzUGFnZUNvcHkodHJ1ZSk7XG4gICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL2Z1bmN0aW9uIHRvIGNyZWF0ZSBuZXcgd2lkZ2V0IG5leHQgdG8ganVzdCB3aWRnZXRcbiAgICAgIGhhbmRsZUNvcHlOZXh0VG9XaWRnZXQoXG4gICAgICAgIHByb3BzLnBvcyxcbiAgICAgICAgcHJvcHMucG9zLnR5cGUsXG4gICAgICAgIHByb3BzLnh5UG9zdGlvbixcbiAgICAgICAgcHJvcHMuaW5kZXgsXG4gICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcbiAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLy9mdW5jdGlvbiB0byBzYXZlIGRhdGUgYW5kIGZvcm1hdCBvbiBsb2NhbCBhcnJheSBvbmNoYW5nZSBkYXRlIGFuZCBvbmNsaWNrIGZvcm1hdFxuICBjb25zdCBoYW5kbGVTYXZlRGF0ZSA9IChkYXRhLCBpc0RhdGVDaGFuZ2UpID0+IHtcbiAgICBsZXQgdXBkYXRlRGF0ZSA9IGRhdGEuZGF0ZTtcbiAgICAvL2NoZWNrIGlmIGRhdGUgY2hhbmdlIGJ5IHVzZXJcbiAgICBpZiAoaXNEYXRlQ2hhbmdlKSB7XG4gICAgICAvL2BjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXRgIGlzIHVzZWQgdG8gY29udmVydCBkYXRlIGFzIHBlciByZXF1aXJlZCB0byBtb21lbnQgcGFja2FnZVxuICAgICAgdXBkYXRlRGF0ZSA9IG1vbWVudChkYXRhLmRhdGUpLmZvcm1hdChcbiAgICAgICAgY2hhbmdlRGF0ZVRvTW9tZW50Rm9ybWF0KGRhdGEuZm9ybWF0KVxuICAgICAgKTtcbiAgICB9XG4gICAgLy91c2luZyBtb21lbnQgcGFja2FnZSBpcyB1c2VkIHRvIGNoYW5nZSBkYXRlIGFzIHBlciB0aGUgZm9ybWF0IHByb3ZpZGVkIGluIHNlbGVjdERhdGUgb2JqIGUuZy4gLSBNTS9kZC95eXl5IC0+IDAzLzEyLzIwMjRcbiAgICAvL2BnZXREZWZhdWx0ZGF0ZWAgaXMgdXNlZCB0byBjb252ZXJ0IHVwZGF0ZSBkYXRlIGluIG5ldyBEYXRlKCkgZm9ybWF0XG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudChcbiAgICAgIGdldERlZmF1bHRkYXRlKHVwZGF0ZURhdGUsIGRhdGE/LmZvcm1hdCkuZ2V0VGltZSgpXG4gICAgKS5mb3JtYXQoY2hhbmdlRGF0ZVRvTW9tZW50Rm9ybWF0KGRhdGE/LmZvcm1hdCkpO1xuXG4gICAgLy9gb25DaGFuZ2VJbnB1dGAgaXMgdXNlZCB0byBzYXZlIGRhdGEgcmVsYXRlZCB0byBkYXRlIGluIGEgcGxhY2Vob2xkZXIgZmllbGRcbiAgICBvbkNoYW5nZUlucHV0KFxuICAgICAgZGF0ZSxcbiAgICAgIHByb3BzLnBvcy5rZXksXG4gICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICBwcm9wcy5pbmRleCxcbiAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcbiAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YS5JZCxcbiAgICAgIGZhbHNlLFxuICAgICAgZGF0YT8uZm9ybWF0LFxuICAgICAgbnVsbCxcbiAgICAgIG51bGwsXG4gICAgICBwcm9wcy5mb250U2l6ZSB8fCBwcm9wcy5wb3M/Lm9wdGlvbnM/LmZvbnRTaXplIHx8IFwiMTJcIixcbiAgICAgIHByb3BzLmZvbnRDb2xvciB8fCBwcm9wcy5wb3M/Lm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCJcbiAgICApO1xuICAgIHNldFNlbGVjdERhdGUoeyBkYXRlOiBkYXRlLCBmb3JtYXQ6IGRhdGE/LmZvcm1hdCB9KTtcbiAgfTtcbiAgY29uc3QgUGxhY2Vob2xkZXJJY29uID0gKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBwcm9wcy5pc1Nob3dCb3JkZXIgJiYgKFxuICAgICAgICA8PlxuICAgICAgICAgIHsocHJvcHMuaXNQbGFjZWhvbGRlciB8fCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZikgJiYgKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgey8qIGNvbmRpdGlvbiB0byBhZGQgc2V0dGluZyBpY29uIGZvciBzaWdueW91ci1zZWxmIGZsb3cgZm9yIHBhcnRpY3VsYXIgdGV4dCB3aWRnZXRzXG4gICAgICAgICAgICBhbmQgYWxzbyBpdCBoYXZlIGRpZmZyZW50IHBvc2l0aW9uIFxuICAgICAgICAgICAgKi99XG4gICAgICAgICAgICAgIHtbXG4gICAgICAgICAgICAgICAgXCJjaGVja2JveFwiLFxuICAgICAgICAgICAgICAgIHRleHRJbnB1dFdpZGdldCxcbiAgICAgICAgICAgICAgICB0ZXh0V2lkZ2V0LFxuICAgICAgICAgICAgICAgIFwibmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY29tcGFueVwiLFxuICAgICAgICAgICAgICAgIFwiam9iIHRpdGxlXCIsXG4gICAgICAgICAgICAgICAgXCJlbWFpbFwiXG4gICAgICAgICAgICAgIF0uaW5jbHVkZXMocHJvcHMucG9zLnR5cGUpICYmIHByb3BzLmlzU2lnbllvdXJzZWxmID8gKFxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbkNsaWNrU2V0dGluZ0ljb24oKTtcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBvblRvdWNoRW5kPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbkNsaWNrU2V0dGluZ0ljb24oKTtcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1nZWFyIGljb25cIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwiIzE4OGFlMlwiLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogXCIyOXB4XCIsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogXCItMTlweFwiXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgLyogY29uZGl0aW9uIHRvIGFkZCBzZXR0aW5nIGljb24gZm9yIHBsYWNlaG9sZGVyICYgdGVtcGxhdGUgZmxvdyBmb3IgYWxsIHdpZGdldHMgZXhjZXB0IHNpZ25hdHVyZSBhbmQgZGF0ZSAqL1xuICAgICAgICAgICAgICAgICgoIXByb3BzPy5wb3M/LnR5cGUgJiYgcHJvcHMucG9zLmlzU3RhbXApIHx8XG4gICAgICAgICAgICAgICAgICAocHJvcHM/LnBvcz8udHlwZSAmJlxuICAgICAgICAgICAgICAgICAgICAhW1wiZGF0ZVwiLCBcInNpZ25hdHVyZVwiXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgIXByb3BzLmlzU2lnbllvdXJzZWxmKSkgJiYgKFxuICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbigpO1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBvblRvdWNoRW5kPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25DbGlja1NldHRpbmdJY29uKCk7XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWdlYXIgaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwiIzE4OGFlMlwiLFxuICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBwcm9wcz8ucG9zPy50eXBlID09PSB0ZXh0V2lkZ2V0ID8gXCIzMnB4XCIgOiBcIjQ3cHhcIixcbiAgICAgICAgICAgICAgICAgICAgICB0b3A6IFwiLTE5cHhcIlxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIHsvKiBjb25kaXRpb24gZm9yIHVzZXJpY29uIGZvciBhbGwgd2lkZ2V0cyBleGNlcHQgdGV4dCB3aWRnZXRzIGFuZCBzaWdueW91ci1zZWxmIGZsb3cgKi99XG4gICAgICAgICAgICAgIHtwcm9wcy5wb3MudHlwZSAhPT0gdGV4dFdpZGdldCAmJiAhcHJvcHMuaXNTaWduWW91cnNlbGYgJiYgKFxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBkYXRhLXR1dD1cImFzc2lnblNpZ25lclwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS11c2VyIGljb25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaGFuZGxlTGlua1VzZXIocHJvcHMuZGF0YS5JZCk7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzLmRhdGEuSWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaGFuZGxlTGlua1VzZXIocHJvcHMuZGF0YS5JZCk7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzLmRhdGEuSWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6IFwiIzE4OGFlMlwiLCByaWdodDogXCIzMnB4XCIsIHRvcDogXCItMThweFwiIH19XG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgICAgey8qIHNldHRpbmcgaWNvbiBvbmx5IGZvciBkYXRlIHdpZGdldHMgKi99XG4gICAgICAgICAge3Byb3BzLnBvcy50eXBlID09PSBcImRhdGVcIiAmJiBzZWxlY3REYXRlICYmIChcbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgcHJvcHMuc2V0Q3VycldpZGdldHNEZXRhaWxzKHByb3BzLnBvcyk7XG4gICAgICAgICAgICAgICAgc2V0SXNEYXRlTW9kYWwoIWlzRGF0ZU1vZGFsKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xuICAgICAgICAgICAgICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHMuZGF0YS5JZCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBvblRvdWNoRW5kPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHByb3BzLnNldEN1cnJXaWRnZXRzRGV0YWlscyhwcm9wcy5wb3MpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgc2V0SXNEYXRlTW9kYWwoIWlzRGF0ZU1vZGFsKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcHMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcbiAgICAgICAgICAgICAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzLmRhdGEuSWQpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLklkID09PSBwcm9wcy5kYXRhLklkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICB6SW5kZXg6IFwiOTlcIixcbiAgICAgICAgICAgICAgICB0b3A6IFwiLTE4cHhcIixcbiAgICAgICAgICAgICAgICByaWdodDogcHJvcHMuaXNQbGFjZWhvbGRlciA/IFwiNTBweFwiIDogXCIzMHB4XCIsXG4gICAgICAgICAgICAgICAgY29sb3I6IFwiIzE4OGFlMlwiLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiBcIjE0cHhcIlxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1nZWFyIGljb25cIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICApfVxuICAgICAgICAgIHsvKiBjb3B5IGljb24gZm9yIGFsbCB3aWRnZXRzICovfVxuICAgICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1jb3B5IGljb25cIlxuICAgICAgICAgICAgb25DbGljaz17KGUpID0+IGhhbmRsZUNvcHlQbGFjZWhvbGRlcihlKX1cbiAgICAgICAgICAgIG9uVG91Y2hFbmQ9eyhlKSA9PiBoYW5kbGVDb3B5UGxhY2Vob2xkZXIoZSl9XG4gICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogXCIjMTg4YWUyXCIsIHJpZ2h0OiBcIjEycHhcIiwgdG9wOiBcIi0xOHB4XCIgfX1cbiAgICAgICAgICA+PC9pPlxuICAgICAgICAgIHsvKiBkZWxldGUgaWNvbiBmb3IgYWxsIHdpZGdldHMgKi99XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWNpcmNsZS14bWFyayBpY29uXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIGZvciB0ZW1wbGF0ZSBhbmQgcGxhY2Vob2xkZXIgZmxvd1xuICAgICAgICAgICAgICBpZiAocHJvcHMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHByb3BzLmhhbmRsZURlbGV0ZVNpZ24ocHJvcHMucG9zLmtleSwgcHJvcHMuZGF0YS5JZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9jb25kaXRpb24gZm9yIHNpZ255b3VyLXNlbGYgZmxvd1xuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVEZWxldGVTaWduKHByb3BzLnBvcy5rZXkpO1xuICAgICAgICAgICAgICAgIHByb3BzLnNldElzU3RhbXAoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgLy9mb3IgbW9iaWxlIGFuZCB0YWJsZXQgdG91Y2ggZXZlbnRcbiAgICAgICAgICAgIG9uVG91Y2hFbmQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIGZvciB0ZW1wbGF0ZSBhbmQgcGxhY2Vob2xkZXIgZmxvd1xuICAgICAgICAgICAgICBpZiAocHJvcHMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHByb3BzLmhhbmRsZURlbGV0ZVNpZ24ocHJvcHMucG9zLmtleSwgcHJvcHMuZGF0YT8uSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIGZvciBzaWdueW91ci1zZWxmIGZsb3dcbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJvcHMuaGFuZGxlRGVsZXRlU2lnbihwcm9wcy5wb3Mua2V5KTtcbiAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1N0YW1wKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiBcIiMxODhhZTJcIiwgcmlnaHQ6IFwiLThweFwiLCB0b3A6IFwiLTE4cHhcIiB9fVxuICAgICAgICAgID48L2k+XG4gICAgICAgIDwvPlxuICAgICAgKVxuICAgICk7XG4gIH07XG4gIGNvbnN0IHhQb3MgPSAocG9zLCBzaWduWW91cnNlbGYpID0+IHtcbiAgICBjb25zdCBjb250YWluZXJTY2FsZSA9IGdldENvbnRhaW5lclNjYWxlKFxuICAgICAgcHJvcHMucGRmT3JpZ2luYWxXSCxcbiAgICAgIHByb3BzLnBhZ2VOdW1iZXIsXG4gICAgICBwcm9wcy5jb250YWluZXJXSFxuICAgICk7XG4gICAgY29uc3QgcmVzaXplUG9zID0gcG9zLnhQb3NpdGlvbjtcbiAgICBpZiAoc2lnbllvdXJzZWxmKSB7XG4gICAgICByZXR1cm4gcmVzaXplUG9zICogY29udGFpbmVyU2NhbGUgKiBwcm9wcy5zY2FsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9jaGVja2luZyBib3RoIGNvbmRpdGlvbiBtb2JpbGUgYW5kIGRlc2t0b3Agdmlld1xuICAgICAgaWYgKHBvcy5pc01vYmlsZSAmJiBwb3Muc2NhbGUpIHtcbiAgICAgICAgaWYgKHByb3BzLnNjYWxlID4gMSkge1xuICAgICAgICAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgKHBvcy5zY2FsZSA9PT0gY29udGFpbmVyU2NhbGUpIHtcbiAgICAgICAgLy8gICByZXR1cm4gcmVzaXplUG9zICogcG9zLnNjYWxlICogcHJvcHMuc2NhbGU7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXNpemVQb3MgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xuICAgICAgICAvLyB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCB5UG9zID0gKHBvcywgc2lnbllvdXJzZWxmKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyU2NhbGUgPSBnZXRDb250YWluZXJTY2FsZShcbiAgICAgIHByb3BzLnBkZk9yaWdpbmFsV0gsXG4gICAgICBwcm9wcy5wYWdlTnVtYmVyLFxuICAgICAgcHJvcHMuY29udGFpbmVyV0hcbiAgICApO1xuICAgIGNvbnN0IHJlc2l6ZVBvcyA9IHBvcy55UG9zaXRpb247XG5cbiAgICBpZiAoc2lnbllvdXJzZWxmKSB7XG4gICAgICByZXR1cm4gcmVzaXplUG9zICogY29udGFpbmVyU2NhbGUgKiBwcm9wcy5zY2FsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9jaGVja2luZyBib3RoIGNvbmRpdGlvbiBtb2JpbGUgYW5kIGRlc2t0b3Agdmlld1xuICAgICAgaWYgKHBvcy5pc01vYmlsZSAmJiBwb3Muc2NhbGUpIHtcbiAgICAgICAgaWYgKHByb3BzLnNjYWxlID4gMSkge1xuICAgICAgICAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gZWxzZSBpZiAocG9zLnNjYWxlID09PSBjb250YWluZXJTY2FsZSkge1xuICAgICAgLy8gICBpZiAocHJvcHMuc2NhbGUgPiAxKSB7XG4gICAgICAvLyAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZSAqIHByb3BzLnNjYWxlO1xuICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgLy8gICAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGU7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzaXplUG9zICogY29udGFpbmVyU2NhbGUgKiBwcm9wcy5zY2FsZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0Q3Vyc29yID0gKCkgPT4ge1xuICAgIGlmIChwcm9wcy5kYXRhICYmIHByb3BzLmlzTmVlZFNpZ24pIHtcbiAgICAgIGlmIChwcm9wcz8uc2lnbmVyT2JqSWQgJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSB7XG4gICAgICAgIHJldHVybiBcInBvaW50ZXJcIjtcbiAgICAgIH0gZWxzZSBpZiAocHJvcHM/LnVuaXF1ZUlkICYmIHByb3BzLmRhdGE/LklkID09PSBwcm9wcy51bmlxdWVJZCkge1xuICAgICAgICByZXR1cm4gXCJwb2ludGVyXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gXCJub3QtYWxsb3dlZFwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJhbGwtc2Nyb2xsXCI7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxSbmRcbiAgICAgICAgaWQ9e3Byb3BzLnBvcy5rZXl9XG4gICAgICAgIGRhdGEtdHV0PXtwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy51blNpZ25lZFdpZGdldElkID8gXCJJc1NpZ25lZFwiIDogXCJcIn1cbiAgICAgICAga2V5PXtwcm9wcy5wb3Mua2V5fVxuICAgICAgICBsb2NrQXNwZWN0UmF0aW89e1xuICAgICAgICAgICFbXG4gICAgICAgICAgICB0ZXh0V2lkZ2V0LFxuICAgICAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgICAgICBcImNvbXBhbnlcIixcbiAgICAgICAgICAgIFwiam9iIHRpdGxlXCIsXG4gICAgICAgICAgICB0ZXh0SW5wdXRXaWRnZXRcbiAgICAgICAgICBdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKSAmJlxuICAgICAgICAgIChwcm9wcy5wb3MuV2lkdGhcbiAgICAgICAgICAgID8gcHJvcHMucG9zLldpZHRoIC8gcHJvcHMucG9zLkhlaWdodFxuICAgICAgICAgICAgOiBkZWZhdWx0V2lkdGhIZWlnaHQocHJvcHMucG9zLnR5cGUpLndpZHRoIC9cbiAgICAgICAgICAgICAgZGVmYXVsdFdpZHRoSGVpZ2h0KHByb3BzLnBvcy50eXBlKS5oZWlnaHQpXG4gICAgICAgIH1cbiAgICAgICAgZW5hYmxlUmVzaXppbmc9e3tcbiAgICAgICAgICB0b3A6IGZhbHNlLFxuICAgICAgICAgIHJpZ2h0OiBmYWxzZSxcbiAgICAgICAgICBib3R0b206IGZhbHNlLFxuICAgICAgICAgIGxlZnQ6IGZhbHNlLFxuICAgICAgICAgIHRvcFJpZ2h0OiBmYWxzZSxcbiAgICAgICAgICBib3R0b21SaWdodDpcbiAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuaXNOZWVkU2lnblxuICAgICAgICAgICAgICA/IHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCAmJlxuICAgICAgICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgJiZcbiAgICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gcmFkaW9CdXR0b25XaWRnZXRcbiAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgICAgIDogcHJvcHMucG9zLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXG4gICAgICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IFwiY2hlY2tib3hcIiAmJlxuICAgICAgICAgICAgICAgIHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkICYmXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICBib3R0b21MZWZ0OiBmYWxzZSxcbiAgICAgICAgICB0b3BMZWZ0OiBmYWxzZVxuICAgICAgICB9fVxuICAgICAgICBib3VuZHM9XCJwYXJlbnRcIlxuICAgICAgICBjbGFzc05hbWU9XCJzaWduWW91cnNlbGZCbG9ja1wiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjMDA3YmZmXCIsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxuICAgICAgICAgIHRleHRBbGlnbjpcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcIm5hbWVcIiAmJlxuICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IFwiY29tcGFueVwiICYmXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJqb2IgdGl0bGVcIiAmJlxuICAgICAgICAgICAgXCJjZW50ZXJcIixcbiAgICAgICAgICBjdXJzb3I6IGdldEN1cnNvcigpLFxuICAgICAgICAgIHpJbmRleDpcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcImRhdGVcIlxuICAgICAgICAgICAgICA/IHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkXG4gICAgICAgICAgICAgICAgPyA5OSArIDFcbiAgICAgICAgICAgICAgICA6IDk5XG4gICAgICAgICAgICAgIDogcHJvcHM/LnBvcz8uekluZGV4XG4gICAgICAgICAgICAgICAgPyBwcm9wcy5wb3MuekluZGV4XG4gICAgICAgICAgICAgICAgOiBcIjVcIixcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBwcm9wcy5kYXRhID8gcHJvcHMuZGF0YS5ibG9ja0NvbG9yIDogXCJyZ2IoMjAzIDIzMyAyMzcpXCJcbiAgICAgICAgfX1cbiAgICAgICAgb25EcmFnPXsoKSA9PiB7XG4gICAgICAgICAgc2V0RHJhZ2dpbmdFbmFibGVkKHRydWUpO1xuICAgICAgICAgIHByb3BzLmhhbmRsZVRhYkRyYWcgJiYgcHJvcHMuaGFuZGxlVGFiRHJhZyhwcm9wcy5wb3Mua2V5KTtcbiAgICAgICAgfX1cbiAgICAgICAgc2l6ZT17e1xuICAgICAgICAgIHdpZHRoOlxuICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0IHx8XG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiXG4gICAgICAgICAgICAgID8gXCJhdXRvXCJcbiAgICAgICAgICAgICAgOiBwcm9wcy5wb3NXaWR0aChwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKSxcbiAgICAgICAgICBoZWlnaHQ6XG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQgfHxcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgPyBcImF1dG9cIlxuICAgICAgICAgICAgICA6IHByb3BzLnBvc0hlaWdodChwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKVxuICAgICAgICB9fVxuICAgICAgICBvblJlc2l6ZVN0YXJ0PXsoKSA9PiB7XG4gICAgICAgICAgc2V0RHJhZ2dpbmdFbmFibGVkKHRydWUpO1xuICAgICAgICAgIHByb3BzLnNldElzUmVzaXplICYmIHByb3BzLnNldElzUmVzaXplKHRydWUpO1xuICAgICAgICB9fVxuICAgICAgICBvblJlc2l6ZVN0b3A9eyhlLCBkaXJlY3Rpb24sIHJlZikgPT4ge1xuICAgICAgICAgIHByb3BzLnNldElzUmVzaXplICYmIHByb3BzLnNldElzUmVzaXplKGZhbHNlKTtcbiAgICAgICAgICBwcm9wcy5oYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZSAmJlxuICAgICAgICAgICAgcHJvcHMuaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemUoXG4gICAgICAgICAgICAgIHJlZixcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxuICAgICAgICAgICAgICBjb250YWluZXJTY2FsZSxcbiAgICAgICAgICAgICAgcHJvcHMuc2NhbGUsXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YS5JZCxcbiAgICAgICAgICAgICAgcHJvcHMuaXNSZXNpemVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH19XG4gICAgICAgIGRpc2FibGVEcmFnZ2luZz17XG4gICAgICAgICAgcHJvcHMuaXNOZWVkU2lnblxuICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICA6IHByb3BzLmlzUGxhY2Vob2xkZXIgJiYgIVt0ZXh0V2lkZ2V0XS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSlcbiAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICA6ICFpc0RyYWdnaW5nRW5hYmxlZFxuICAgICAgICB9XG4gICAgICAgIG9uRHJhZ1N0b3A9eyhldmVudCwgZHJhZ0VsZW1lbnQpID0+XG4gICAgICAgICAgcHJvcHMuaGFuZGxlU3RvcCAmJlxuICAgICAgICAgIHByb3BzLmhhbmRsZVN0b3AoZXZlbnQsIGRyYWdFbGVtZW50LCBwcm9wcy5kYXRhPy5JZCwgcHJvcHMucG9zPy5rZXkpXG4gICAgICAgIH1cbiAgICAgICAgcG9zaXRpb249e3tcbiAgICAgICAgICB4OiB4UG9zKHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpLFxuICAgICAgICAgIHk6IHlQb3MocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZilcbiAgICAgICAgfX1cbiAgICAgICAgb25SZXNpemU9eyhlLCBkaXJlY3Rpb24sIHJlZikgPT4ge1xuICAgICAgICAgIHNldFBsYWNlaG9sZGVyQm9yZGVyKHtcbiAgICAgICAgICAgIHc6IHJlZi5vZmZzZXRXaWR0aCAvIChwcm9wcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlKSxcbiAgICAgICAgICAgIGg6IHJlZi5vZmZzZXRIZWlnaHQgLyAocHJvcHMuc2NhbGUgKiBjb250YWluZXJTY2FsZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfX1cbiAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlT25DbGlja1BsYWNlaG9sZGVyKCl9XG4gICAgICA+XG4gICAgICAgIHtwcm9wcy5pc1Nob3dCb3JkZXIgJiZcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXG4gICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgJiZcbiAgICAgICAgcHJvcHMucG9zLmtleSA9PT0gcHJvcHMuc2VsZWN0V2lkZ2V0SWQgPyAoXG4gICAgICAgICAgPEJvcmRlclJlc2l6ZSByaWdodD17LTEyfSB0b3A9ey0xMX0gLz5cbiAgICAgICAgKSA6IHByb3BzLmRhdGEgJiYgcHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5wb3MudHlwZSAhPT0gXCJjaGVja2JveFwiID8gKFxuICAgICAgICAgIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCAmJlxuICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSByYWRpb0J1dHRvbldpZGdldCAmJlxuICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgPyAoXG4gICAgICAgICAgICA8Qm9yZGVyUmVzaXplIC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+PC8+XG4gICAgICAgICAgKVxuICAgICAgICApIDogKFxuICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSByYWRpb0J1dHRvbldpZGdldCAmJlxuICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgJiZcbiAgICAgICAgICBwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJiA8Qm9yZGVyUmVzaXplIC8+XG4gICAgICAgICl9XG5cbiAgICAgICAge3Byb3BzLmlzU2hvd0JvcmRlciAmJiBwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJiAoXG4gICAgICAgICAgPFBsYWNlaG9sZGVyQm9yZGVyXG4gICAgICAgICAgICBzZXREcmFnZ2luZ0VuYWJsZWQ9e3NldERyYWdnaW5nRW5hYmxlZH1cbiAgICAgICAgICAgIHBvcz17cHJvcHMucG9zfVxuICAgICAgICAgICAgaXNQbGFjZWhvbGRlcj17cHJvcHMuaXNQbGFjZWhvbGRlcn1cbiAgICAgICAgICAgIGdldENoZWNrYm94UmVuZGVyV2lkdGg9e2dldENoZWNrYm94UmVuZGVyV2lkdGh9XG4gICAgICAgICAgICBzY2FsZT17cHJvcHMuc2NhbGV9XG4gICAgICAgICAgICBjb250YWluZXJTY2FsZT17Y29udGFpbmVyU2NhbGV9XG4gICAgICAgICAgICBwbGFjZWhvbGRlckJvcmRlcj17cGxhY2Vob2xkZXJCb3JkZXJ9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge2lzVGFiQW5kTW9iaWxlID8gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RyZXRjaFwiXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBsZWZ0OiB4UG9zKHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpLFxuICAgICAgICAgICAgICB0b3A6IHlQb3MocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiksXG4gICAgICAgICAgICAgIHdpZHRoOlxuICAgICAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCB8fFxuICAgICAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgID8gXCJhdXRvXCJcbiAgICAgICAgICAgICAgICAgIDogcHJvcHMucG9zV2lkdGgocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiksXG4gICAgICAgICAgICAgIGhlaWdodDpcbiAgICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQgfHxcbiAgICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICA/IFwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICA6IHByb3BzLnBvc0hlaWdodChwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKSxcbiAgICAgICAgICAgICAgekluZGV4OiBcIjEwXCJcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBvblRvdWNoRW5kPXsoKSA9PiBoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIoKX1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZU9uQ2xpY2tQbGFjZWhvbGRlcigpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJiA8UGxhY2Vob2xkZXJJY29uIC8+fVxuXG4gICAgICAgICAgICA8UGxhY2Vob2xkZXJUeXBlXG4gICAgICAgICAgICAgIHBvcz17cHJvcHMucG9zfVxuICAgICAgICAgICAgICB4eVBvc3Rpb249e3Byb3BzLnh5UG9zdGlvbn1cbiAgICAgICAgICAgICAgaW5kZXg9e3Byb3BzLmluZGV4fVxuICAgICAgICAgICAgICBzZXRYeVBvc3Rpb249e3Byb3BzLnNldFh5UG9zdGlvbn1cbiAgICAgICAgICAgICAgZGF0YT17cHJvcHMuZGF0YX1cbiAgICAgICAgICAgICAgc2V0U2lnbktleT17cHJvcHMuc2V0U2lnbktleX1cbiAgICAgICAgICAgICAgaXNTaG93RHJvcGRvd249e3Byb3BzPy5pc1Nob3dEcm9wZG93bn1cbiAgICAgICAgICAgICAgaXNQbGFjZWhvbGRlcj17cHJvcHMuaXNQbGFjZWhvbGRlcn1cbiAgICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e3Byb3BzLmlzU2lnbllvdXJzZWxmfVxuICAgICAgICAgICAgICBzaWduZXJPYmpJZD17cHJvcHMuc2lnbmVyT2JqSWR9XG4gICAgICAgICAgICAgIGhhbmRsZVVzZXJOYW1lPXtwcm9wcy5oYW5kbGVVc2VyTmFtZX1cbiAgICAgICAgICAgICAgc2V0RHJhZ2dpbmdFbmFibGVkPXtzZXREcmFnZ2luZ0VuYWJsZWR9XG4gICAgICAgICAgICAgIHBkZkRldGFpbHM9e3Byb3BzPy5wZGZEZXRhaWxzICYmIHByb3BzPy5wZGZEZXRhaWxzWzBdfVxuICAgICAgICAgICAgICBpc05lZWRTaWduPXtwcm9wcy5pc05lZWRTaWdufVxuICAgICAgICAgICAgICBzZXRTZWxlY3REYXRlPXtzZXRTZWxlY3REYXRlfVxuICAgICAgICAgICAgICBzZWxlY3REYXRlPXtzZWxlY3REYXRlfVxuICAgICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0PXtwcm9wcy5zZXRWYWxpZGF0ZUFsZXJ0fVxuICAgICAgICAgICAgICBzZXRTdGFydERhdGU9e3NldFN0YXJ0RGF0ZX1cbiAgICAgICAgICAgICAgc3RhcnREYXRlPXtzdGFydERhdGV9XG4gICAgICAgICAgICAgIGhhbmRsZVNhdmVEYXRlPXtoYW5kbGVTYXZlRGF0ZX1cbiAgICAgICAgICAgICAgeFBvcz17cHJvcHMueFBvc31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIHtwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJiA8UGxhY2Vob2xkZXJJY29uIC8+fVxuICAgICAgICAgICAgPFBsYWNlaG9sZGVyVHlwZVxuICAgICAgICAgICAgICBwb3M9e3Byb3BzLnBvc31cbiAgICAgICAgICAgICAgeHlQb3N0aW9uPXtwcm9wcy54eVBvc3Rpb259XG4gICAgICAgICAgICAgIGluZGV4PXtwcm9wcy5pbmRleH1cbiAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtwcm9wcy5zZXRYeVBvc3Rpb259XG4gICAgICAgICAgICAgIGRhdGE9e3Byb3BzLmRhdGF9XG4gICAgICAgICAgICAgIHNldFNpZ25LZXk9e3Byb3BzLnNldFNpZ25LZXl9XG4gICAgICAgICAgICAgIGlzU2hvd0Ryb3Bkb3duPXtwcm9wcz8uaXNTaG93RHJvcGRvd259XG4gICAgICAgICAgICAgIGlzUGxhY2Vob2xkZXI9e3Byb3BzLmlzUGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXtwcm9wcy5pc1NpZ25Zb3Vyc2VsZn1cbiAgICAgICAgICAgICAgc2lnbmVyT2JqSWQ9e3Byb3BzLnNpZ25lck9iaklkfVxuICAgICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17cHJvcHMuaGFuZGxlVXNlck5hbWV9XG4gICAgICAgICAgICAgIHNldERyYWdnaW5nRW5hYmxlZD17c2V0RHJhZ2dpbmdFbmFibGVkfVxuICAgICAgICAgICAgICBwZGZEZXRhaWxzPXtwcm9wcz8ucGRmRGV0YWlscyAmJiBwcm9wcz8ucGRmRGV0YWlsc1swXX1cbiAgICAgICAgICAgICAgaXNOZWVkU2lnbj17cHJvcHMuaXNOZWVkU2lnbn1cbiAgICAgICAgICAgICAgc2V0U2VsZWN0RGF0ZT17c2V0U2VsZWN0RGF0ZX1cbiAgICAgICAgICAgICAgc2VsZWN0RGF0ZT17c2VsZWN0RGF0ZX1cbiAgICAgICAgICAgICAgc2V0VmFsaWRhdGVBbGVydD17cHJvcHMuc2V0VmFsaWRhdGVBbGVydH1cbiAgICAgICAgICAgICAgc2V0U3RhcnREYXRlPXtzZXRTdGFydERhdGV9XG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZT17c3RhcnREYXRlfVxuICAgICAgICAgICAgICBoYW5kbGVTYXZlRGF0ZT17aGFuZGxlU2F2ZURhdGV9XG4gICAgICAgICAgICAgIHhQb3M9e3Byb3BzLnhQb3N9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvPlxuICAgICAgICApfVxuICAgICAgPC9SbmQ+XG4gICAgICA8TW9kYWxVaSBpc09wZW49e2lzRGF0ZU1vZGFsfSB0aXRsZT17dChcIndpZGdldC1pbmZvXCIpfSBzaG93Q2xvc2U9e2ZhbHNlfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLVsxMDAlXSBwLVsyMHB4XVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuPnt0KFwiZm9ybWF0XCIpfSA6IDwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleFwiPlxuICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWwtWzdweF0gb3Atc2VsZWN0IG9wLXNlbGVjdC1ib3JkZXJlZCBvcC1zZWxlY3Qtc20gZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlPXtcIlwifVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgIHNldFNlbGVjdERhdGUoZGF0ZUZvcm1hdFtzZWxlY3RlZEluZGV4XSk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgIHt0KFwic2VsZWN0LWRhdGUtZm9ybWF0XCIpfVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIHtkYXRlRm9ybWF0Lm1hcCgoZGF0YSwgaW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGNsYXNzTmFtZT1cInRleHQtWzEzcHhdXCIgdmFsdWU9e2luZH0ga2V5PXtpbmR9PlxuICAgICAgICAgICAgICAgICAgICAgIHtkYXRhPy5kYXRlID8gZGF0YT8uZGF0ZSA6IFwibm9kYXRhXCJ9XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1ncmF5LTQwMCBtbC0xXCI+XG4gICAgICAgICAgICAgIHtzZWxlY3REYXRlLmZvcm1hdH1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIG10LTQgbWQ6bXQtMlwiPlxuICAgICAgICAgICAgPHNwYW4+e3QoXCJmb250LXNpemVcIil9IDo8L3NwYW4+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1sLVszcHhdIG1kOm1sOls3cHhdIG9wLXNlbGVjdCBvcC1zZWxlY3QtYm9yZGVyZWQgb3Atc2VsZWN0LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBob3Zlcjpib3JkZXItYmFzZS1jb250ZW50IHRleHQteHNcIlxuICAgICAgICAgICAgICB2YWx1ZT17XG4gICAgICAgICAgICAgICAgcHJvcHMuZm9udFNpemUgfHxcbiAgICAgICAgICAgICAgICBwcm9wcy5jdXJyV2lkZ2V0c0RldGFpbHM/Lm9wdGlvbnM/LmZvbnRTaXplIHx8XG4gICAgICAgICAgICAgICAgXCIxMlwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBwcm9wcy5zZXRGb250U2l6ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtmb250c2l6ZUFyci5tYXAoKHNpemUsIGluZCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIGNsYXNzTmFtZT1cInRleHQtWzEzcHhdXCIgdmFsdWU9e3NpemV9IGtleT17aW5kfT5cbiAgICAgICAgICAgICAgICAgICAge3NpemV9XG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlciBtbC0yIG1kOm1sLTQgXCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt0KFwiY29sb3JcIil9OiA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICB2YWx1ZT17XG4gICAgICAgICAgICAgICAgICBwcm9wcy5mb250Q29sb3IgfHwgcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBwcm9wcy5zZXRGb250Q29sb3IoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1sLVs0cHhdIG1kOm1sWzdweF0gb3Atc2VsZWN0IG9wLXNlbGVjdC1ib3JkZXJlZCBvcC1zZWxlY3Qtc20gZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdGV4dC14c1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7Zm9udENvbG9yQXJyLm1hcCgoY29sb3IsIGluZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT17Y29sb3J9IGtleT17aW5kfT5cbiAgICAgICAgICAgICAgICAgICAgICB7dChgY29sb3ItdHlwZS4ke2NvbG9yfWApfVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOlxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5mb250Q29sb3IgfHwgcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCJcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNSBoLVsxOXB4XSBtbC0xXCJcbiAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLVsxcHhdIHctZnVsbCBteS1bMTVweF0gYmctWyM5ZjlmOWZdXCI+PC9kaXY+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICBzZXRJc0RhdGVNb2RhbChmYWxzZSk7XG4gICAgICAgICAgICAgIGhhbmRsZVNhdmVEYXRlKHNlbGVjdERhdGUpO1xuICAgICAgICAgICAgICBwcm9wcy5zZXRGb250Q29sb3IoXCJcIik7XG4gICAgICAgICAgICAgIHByb3BzLnNldEZvbnRTaXplKFwiXCIpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dChcInNhdmVcIil9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Nb2RhbFVpPlxuICAgIDwvPlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBQbGFjZWhvbGRlcjtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgdGhlbWVDb2xvciB9IGZyb20gXCIuLi8uLi9jb25zdGFudC9jb25zdFwiO1xyXG5pbXBvcnQge1xyXG4gIGRlZmF1bHRXaWR0aEhlaWdodCxcclxuICBpc01vYmlsZSxcclxuICByYWRpb0J1dHRvbldpZGdldCxcclxuICByZXNpemVCb3JkZXJFeHRyYVdpZHRoLFxyXG4gIHRleHRXaWRnZXRcclxufSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcclxuZnVuY3Rpb24gUGxhY2Vob2xkZXJCb3JkZXIocHJvcHMpIHtcclxuICBjb25zdCBnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoID0gcmVzaXplQm9yZGVyRXh0cmFXaWR0aCgpO1xyXG4gIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGRlZmF1bHRXaWR0aEhlaWdodChwcm9wcy5wb3MudHlwZSkud2lkdGg7XHJcbiAgY29uc3QgZGVmYXVsdEhlaWdodCA9IGRlZmF1bHRXaWR0aEhlaWdodChwcm9wcy5wb3MudHlwZSkuaGVpZ2h0O1xyXG4gIGNvbnN0IHdpZHRoID0gKCkgPT4ge1xyXG4gICAgY29uc3QgZ2V0V2lkdGggPVxyXG4gICAgICBwcm9wcy5wbGFjZWhvbGRlckJvcmRlci53IHx8IHByb3BzLnBvcy5XaWR0aCB8fCBkZWZhdWx0V2lkdGg7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBnZXRXaWR0aCAqIHByb3BzLnNjYWxlICogcHJvcHMuY29udGFpbmVyU2NhbGUgKyBnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoXHJcbiAgICApO1xyXG4gIH07XHJcbiAgY29uc3QgaGVpZ2h0ID0gKCkgPT4ge1xyXG4gICAgY29uc3QgZ2V0SGVpZ2h0ID1cclxuICAgICAgcHJvcHMucGxhY2Vob2xkZXJCb3JkZXIuaCB8fCBwcm9wcy5wb3MuSGVpZ2h0IHx8IGRlZmF1bHRIZWlnaHQ7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgZ2V0SGVpZ2h0ICogcHJvcHMuc2NhbGUgKiBwcm9wcy5jb250YWluZXJTY2FsZSArIGdldFJlc2l6ZUJvcmRlckV4dHJhV2lkdGhcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTWluV2lkdGggPSAoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQpIHtcclxuICAgICAgcmV0dXJuIHByb3BzLmdldENoZWNrYm94UmVuZGVyV2lkdGgud2lkdGggKyBnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHdpZHRoKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBoYW5kbGVNaW5IZWlnaHQgPSAoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQpIHtcclxuICAgICAgcmV0dXJuIHByb3BzLmdldENoZWNrYm94UmVuZGVyV2lkdGguaGVpZ2h0ICsgZ2V0UmVzaXplQm9yZGVyRXh0cmFXaWR0aDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBoZWlnaHQoKTtcclxuICAgIH1cclxuICB9O1xyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2XHJcbiAgICAgIG9uTW91c2VFbnRlcj17KCkgPT4gIWlzTW9iaWxlICYmIHByb3BzPy5zZXREcmFnZ2luZ0VuYWJsZWQodHJ1ZSl9XHJcbiAgICAgIG9uVG91Y2hFbmQ9eygpID0+XHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IHRleHRXaWRnZXQgJiYgcHJvcHM/LnNldERyYWdnaW5nRW5hYmxlZCh0cnVlKVxyXG4gICAgICB9XHJcbiAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGlubGluZS1ibG9jayB3LVsxNHB4XSBoLVsxNHB4XSAgYm9yZGVyLVswLjJweF0gb3ZlcmZsb3ctaGlkZGVuIGJvcmRlci1kYXNoZWRcIlxyXG4gICAgICBzdHlsZT17e1xyXG4gICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZUNvbG9yLFxyXG4gICAgICAgIG1pbldpZHRoOiBoYW5kbGVNaW5XaWR0aCgpIHx8IDAsXHJcbiAgICAgICAgbWluSGVpZ2h0OiBoYW5kbGVNaW5IZWlnaHQoKSB8fCAwXHJcbiAgICAgIH19XHJcbiAgICA+PC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXJCb3JkZXI7XHJcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCBmb3J3YXJkUmVmLCB1c2VSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIGdldE1vbnRoLFxuICBnZXRZZWFyLFxuICBvbkNoYW5nZUhlaWdodE9mVGV4dEFyZWEsXG4gIG9uQ2hhbmdlSW5wdXQsXG4gIHJhZGlvQnV0dG9uV2lkZ2V0LFxuICByYW5nZSxcbiAgdGV4dElucHV0V2lkZ2V0LFxuICB0ZXh0V2lkZ2V0XG59IGZyb20gXCIuLi8uLi9jb25zdGFudC9VdGlsc1wiO1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSBcInJlYWN0LWRhdGVwaWNrZXJcIjtcbmltcG9ydCBcInJlYWN0LWRhdGVwaWNrZXIvZGlzdC9yZWFjdC1kYXRlcGlja2VyLmNzc1wiO1xuaW1wb3J0IFwiLi4vLi4vc3R5bGVzL3NpZ25hdHVyZS5jc3NcIjtcbmltcG9ydCBSZWdleFBhcnNlciBmcm9tIFwicmVnZXgtcGFyc2VyXCI7XG5pbXBvcnQgeyBlbWFpbFJlZ2V4IH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L2NvbnN0XCI7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XG5jb25zdCB0ZXh0V2lkZ2V0Q2xzID1cbiAgXCJ3LWZ1bGwgaC1mdWxsIG1kOm1pbi13LWZ1bGwgbWQ6bWluLWgtZnVsbCB6LVs5OTldIHRleHQtWzEycHhdIHJvdW5kZWQtWzJweF0gYm9yZGVyLVsxcHhdIGJvcmRlci1bIzAwN2JmZl0gb3ZlcmZsb3ctaGlkZGVuIHJlc2l6ZS1ub25lIG91dGxpbmUtbm9uZSB0ZXh0LWJhc2UtY29udGVudCBpdGVtLWNlbnRlciB3aGl0ZXNwYWNlLXByZS13cmFwIGJnLXdoaXRlXCI7XG5jb25zdCBzZWxlY3RXaWRnZXRDbHMgPVxuICBcInctZnVsbCBoLWZ1bGwgYWJzb2x1dGUgbGVmdC0wIHRvcC0wIGJvcmRlci1bMXB4XSBib3JkZXItWyMwMDdiZmZdIHJvdW5kZWQtWzJweF0gZm9jdXM6b3V0bGluZS1ub25lIHRleHQtYmFzZS1jb250ZW50XCI7XG5mdW5jdGlvbiBQbGFjZWhvbGRlclR5cGUocHJvcHMpIHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xuICBjb25zdCB0eXBlID0gcHJvcHM/LnBvcz8udHlwZTtcbiAgY29uc3Qgd2lkZ2V0VHlwZVRyYXNsYXRpb24gPSB0KGB3aWRnZXRzLW5hbWUuJHtwcm9wcz8ucG9zPy50eXBlfWApO1xuICBjb25zdCBbc2VsZWN0T3B0aW9uLCBzZXRTZWxlY3RPcHRpb25dID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFt2YWxpZGF0ZVBsYWNlaG9sZGVyLCBzZXRWYWxpZGF0ZVBsYWNlaG9sZGVyXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgW3RleHRWYWx1ZSwgc2V0VGV4dFZhbHVlXSA9IHVzZVN0YXRlKCk7XG4gIGNvbnN0IFtzZWxlY3RlZENoZWNrYm94LCBzZXRTZWxlY3RlZENoZWNrYm94XSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgeWVhcnMgPSByYW5nZSgxOTkwLCBnZXRZZWFyKG5ldyBEYXRlKCkpICsgMTYsIDEpO1xuICBjb25zdCBmb250U2l6ZSA9IChwcm9wcy5wb3Mub3B0aW9ucz8uZm9udFNpemUgfHwgXCIxMlwiKSArIFwicHhcIjtcbiAgY29uc3QgZm9udENvbG9yID0gcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCI7XG4gIGNvbnN0IG1vbnRocyA9IFtcbiAgICBcIkphbnVhcnlcIixcbiAgICBcIkZlYnJ1YXJ5XCIsXG4gICAgXCJNYXJjaFwiLFxuICAgIFwiQXByaWxcIixcbiAgICBcIk1heVwiLFxuICAgIFwiSnVuZVwiLFxuICAgIFwiSnVseVwiLFxuICAgIFwiQXVndXN0XCIsXG4gICAgXCJTZXB0ZW1iZXJcIixcbiAgICBcIk9jdG9iZXJcIixcbiAgICBcIk5vdmVtYmVyXCIsXG4gICAgXCJEZWNlbWJlclwiXG4gIF07XG4gIGNvbnN0IHZhbGlkYXRlRXhwcmVzc2lvbiA9IChyZWdleFZhbGlkYXRpb24pID0+IHtcbiAgICBpZiAodGV4dFZhbHVlICYmIHJlZ2V4VmFsaWRhdGlvbikge1xuICAgICAgbGV0IHJlZ2V4T2JqZWN0ID0gcmVnZXhWYWxpZGF0aW9uO1xuICAgICAgaWYgKHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8udHlwZSA9PT0gXCJyZWdleFwiKSB7XG4gICAgICAgIHJlZ2V4T2JqZWN0ID0gUmVnZXhQYXJzZXIocmVnZXhWYWxpZGF0aW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIG5ldyBSZWdFeHAocmVnZXhWYWxpZGF0aW9uKTtcbiAgICAgIGxldCBpc1ZhbGlkYXRlID0gcmVnZXhPYmplY3QudGVzdCh0ZXh0VmFsdWUpO1xuICAgICAgaWYgKCFpc1ZhbGlkYXRlKSB7XG4gICAgICAgIHByb3BzPy5zZXRWYWxpZGF0ZUFsZXJ0KHRydWUpO1xuICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0Qmx1ciA9ICgpID0+IHtcbiAgICBwcm9wcy5zZXREcmFnZ2luZ0VuYWJsZWQodHJ1ZSk7XG4gICAgY29uc3QgdmFsaWRhdGVUeXBlID0gcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy50eXBlO1xuICAgIGxldCByZWdleFZhbGlkYXRpb247XG4gICAgaWYgKHZhbGlkYXRlVHlwZSAmJiB2YWxpZGF0ZVR5cGUgIT09IFwidGV4dFwiKSB7XG4gICAgICBzd2l0Y2ggKHZhbGlkYXRlVHlwZSkge1xuICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICByZWdleFZhbGlkYXRpb24gPSBlbWFpbFJlZ2V4O1xuICAgICAgICAgIHZhbGlkYXRlRXhwcmVzc2lvbihyZWdleFZhbGlkYXRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgcmVnZXhWYWxpZGF0aW9uID0gL15bMC05XFxzXSokLztcbiAgICAgICAgICB2YWxpZGF0ZUV4cHJlc3Npb24ocmVnZXhWYWxpZGF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZWdleFZhbGlkYXRpb24gPSBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LnBhdHRlcm4gfHwgXCJcIjtcbiAgICAgICAgICB2YWxpZGF0ZUV4cHJlc3Npb24ocmVnZXhWYWxpZGF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlVGV4dFZhbGlkID0gKGUpID0+IHtcbiAgICBjb25zdCB0ZXh0SW5wdXQgPSBlLnRhcmdldC52YWx1ZTtcbiAgICBzZXRUZXh0VmFsdWUodGV4dElucHV0KTtcbiAgfTtcbiAgZnVuY3Rpb24gY2hlY2tSZWd1bGFyRXhwcmVzcyh2YWxpZGF0ZVR5cGUpIHtcbiAgICBzd2l0Y2ggKHZhbGlkYXRlVHlwZSkge1xuICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgIHNldFZhbGlkYXRlUGxhY2Vob2xkZXIoXCJkZW1vQGdtYWlsLmNvbVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIHNldFZhbGlkYXRlUGxhY2Vob2xkZXIoXCIxMjM0NVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICBzZXRWYWxpZGF0ZVBsYWNlaG9sZGVyKFwicGxlYXNlIGVudGVyIHRleHRcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcihcInBsZWFzZSBlbnRlciB2YWx1ZVwiKTtcbiAgICB9XG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlICYmIHR5cGUgPT09IFwiY2hlY2tib3hcIiAmJiBwcm9wcy5pc05lZWRTaWduKSB7XG4gICAgICBjb25zdCBpc0RlZmF1bHRWYWx1ZSA9IHByb3BzLnBvcy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoaXNEZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgc2V0U2VsZWN0ZWRDaGVja2JveChpc0RlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wcy5wb3M/Lm9wdGlvbnM/LmhpbnQpIHtcbiAgICAgIHNldFZhbGlkYXRlUGxhY2Vob2xkZXIocHJvcHMucG9zPy5vcHRpb25zLmhpbnQpO1xuICAgIH0gZWxzZSBpZiAocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy50eXBlKSB7XG4gICAgICBjaGVja1JlZ3VsYXJFeHByZXNzKHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8udHlwZSk7XG4gICAgfVxuICAgIHNldFRleHRWYWx1ZShcbiAgICAgIHByb3BzLnBvcz8ub3B0aW9ucz8ucmVzcG9uc2VcbiAgICAgICAgPyBwcm9wcy5wb3M/Lm9wdGlvbnM/LnJlc3BvbnNlXG4gICAgICAgIDogcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWVcbiAgICAgICAgICA/IHByb3BzLnBvcz8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlXG4gICAgICAgICAgOiBcIlwiXG4gICAgKTtcbiAgICBzZXRTZWxlY3RPcHRpb24oXG4gICAgICBwcm9wcy5wb3M/Lm9wdGlvbnM/LnJlc3BvbnNlXG4gICAgICAgID8gcHJvcHMucG9zPy5vcHRpb25zPy5yZXNwb25zZVxuICAgICAgICA6IHByb3BzLnBvcz8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlXG4gICAgICAgICAgPyBwcm9wcy5wb3M/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZVxuICAgICAgICAgIDogXCJcIlxuICAgICk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoXG4gICAgICBbXCJuYW1lXCIsIFwiZW1haWxcIiwgXCJqb2IgdGl0bGVcIiwgXCJjb21wYW55XCJdLmluY2x1ZGVzKHByb3BzLnBvcz8udHlwZSkgJiZcbiAgICAgIHByb3BzLmlzTmVlZFNpZ24gJiZcbiAgICAgIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcz8uc2lnbmVyT2JqSWRcbiAgICApIHtcbiAgICAgIGNvbnN0IGRlZmF1bHREYXRhID0gcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoZGVmYXVsdERhdGEpIHtcbiAgICAgICAgc2V0VGV4dFZhbHVlKGRlZmF1bHREYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWVdKTtcblxuICBjb25zdCBFeGFtcGxlQ3VzdG9tSW5wdXQgPSBmb3J3YXJkUmVmKCh7IHZhbHVlLCBvbkNsaWNrIH0sIHJlZikgPT4gKFxuICAgIDxkaXZcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgY29sb3I6IGZvbnRDb2xvcixcbiAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiXG4gICAgICB9fVxuICAgICAgY2xhc3NOYW1lPXtgJHtzZWxlY3RXaWRnZXRDbHN9IG92ZXJmbG93LWhpZGRlbmB9XG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgcmVmPXtyZWZ9XG4gICAgPlxuICAgICAge3ZhbHVlfVxuICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtY2FsZW5kYXIgIG1sLVs1cHhdXCI+PC9pPlxuICAgIDwvZGl2PlxuICApKTtcbiAgRXhhbXBsZUN1c3RvbUlucHV0LmRpc3BsYXlOYW1lID0gXCJFeGFtcGxlQ3VzdG9tSW5wdXRcIjtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgIFtcIm5hbWVcIiwgXCJlbWFpbFwiLCBcImpvYiB0aXRsZVwiLCBcImNvbXBhbnlcIl0uaW5jbHVkZXModHlwZSkgJiZcbiAgICAgIHByb3BzLmlzTmVlZFNpZ24gJiZcbiAgICAgIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZFxuICAgICkge1xuICAgICAgY29uc3QgaXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHNlbmRlclVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgRXh0YW5kX0NsYXNzYCk7XG4gICAgICBjb25zdCBqc29uU2VuZGVyID0gSlNPTi5wYXJzZShzZW5kZXJVc2VyKTtcbiAgICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICAgIGpzb25TZW5kZXIgJiYganNvblNlbmRlclswXSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICBudWxsLFxuICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgIHByb3BzLmRhdGEuSWQsXG4gICAgICAgIGlzRGVmYXVsdFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbdHlwZV0pO1xuICAvL2Z1bmN0aW9uIGZvciBzaG93IGNoZWNrZWQgY2hlY2tib3hcbiAgY29uc3Qgc2VsZWN0Q2hlY2tib3ggPSAoaW5kKSA9PiB7XG4gICAgY29uc3QgcmVzID0gcHJvcHMucG9zLm9wdGlvbnM/LnJlc3BvbnNlO1xuICAgIGNvbnN0IGRlZmF1bHRDaGVjayA9IHByb3BzLnBvcy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XG4gICAgaWYgKHJlcyAmJiByZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlzU2VsZWN0SW5kZXggPSByZXMuaW5kZXhPZihpbmQpO1xuICAgICAgaWYgKGlzU2VsZWN0SW5kZXggPiAtMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIH1cbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRDaGVjaykge1xuICAgICAgY29uc3QgaXNTZWxlY3RJbmRleCA9IGRlZmF1bHRDaGVjay5pbmRleE9mKGluZCk7XG4gICAgICBpZiAoaXNTZWxlY3RJbmRleCA+IC0xKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVJhZGlvQ2hlY2sgPSAoZGF0YSkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHREYXRhID0gcHJvcHMucG9zLm9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcbiAgICBpZiAodGV4dFZhbHVlID09PSBkYXRhKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHREYXRhID09PSBkYXRhKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvL2Z1bmN0aW9uIGZvciBzZXQgY2hlY2tlZCBhbmQgdW5jaGVja2VkIHZhbHVlIG9mIGNoZWNrYm94XG4gIGNvbnN0IGhhbmRsZUNoZWNrYm94VmFsdWUgPSAoaXNDaGVja2VkLCBpbmQpID0+IHtcbiAgICBsZXQgdXBkYXRlU2VsZWN0ZWRDaGVja2JveCA9IFtdLFxuICAgICAgY2hlY2tlZExpc3Q7XG4gICAgbGV0IGlzRGVmYXVsdFZhbHVlLCBpc0RlZmF1bHRFbXB0eTtcbiAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICB1cGRhdGVTZWxlY3RlZENoZWNrYm94ID0gc2VsZWN0ZWRDaGVja2JveCA/IHNlbGVjdGVkQ2hlY2tib3ggOiBbXTtcblxuICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICB1cGRhdGVTZWxlY3RlZENoZWNrYm94LnB1c2goaW5kKTtcbiAgICAgICAgc2V0U2VsZWN0ZWRDaGVja2JveCh1cGRhdGVTZWxlY3RlZENoZWNrYm94KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrZWRMaXN0ID0gc2VsZWN0ZWRDaGVja2JveC5maWx0ZXIoKGRhdGEpID0+IGRhdGEgIT09IGluZCk7XG4gICAgICAgIHNldFNlbGVjdGVkQ2hlY2tib3goY2hlY2tlZExpc3QpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmlzTmVlZFNpZ24pIHtcbiAgICAgICAgaXNEZWZhdWx0VmFsdWUgPSBwcm9wcy5wb3Mub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGVmYXVsdFZhbHVlICYmIGlzRGVmYXVsdFZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNEZWZhdWx0RW1wdHkgPSB0cnVlO1xuICAgICAgfVxuICAgICAgb25DaGFuZ2VJbnB1dChcbiAgICAgICAgY2hlY2tlZExpc3QgPyBjaGVja2VkTGlzdCA6IHVwZGF0ZVNlbGVjdGVkQ2hlY2tib3gsXG4gICAgICAgIHByb3BzLnBvcy5rZXksXG4gICAgICAgIHByb3BzLnh5UG9zdGlvbixcbiAgICAgICAgcHJvcHMuaW5kZXgsXG4gICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcbiAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhLklkLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgaXNEZWZhdWx0RW1wdHlcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIC8vZnVuY3Rpb24gdG8gaGFuZGxlIHNlbGVjdCByYWRpbyB3aWRnZXQgYW5kIHNldCB2YWx1ZSBzZWxldGNlZCBieSB1c2VyXG4gIGNvbnN0IGhhbmRsZUNoZWNrUmFkaW8gPSAoaXNDaGVja2VkLCBkYXRhKSA9PiB7XG4gICAgbGV0IGlzRGVmYXVsdFZhbHVlLFxuICAgICAgaXNEZWZhdWx0RW1wdHksXG4gICAgICBpc1JhZGlvID0gdHJ1ZTtcbiAgICBpZiAocHJvcHMuaXNOZWVkU2lnbikge1xuICAgICAgaXNEZWZhdWx0VmFsdWUgPSBwcm9wcy5wb3Mub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNEZWZhdWx0VmFsdWUpIHtcbiAgICAgIGlzRGVmYXVsdEVtcHR5ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgc2V0VGV4dFZhbHVlKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUZXh0VmFsdWUoXCJcIik7XG4gICAgfVxuICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICBkYXRhLFxuICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgIHByb3BzLnh5UG9zdGlvbixcbiAgICAgIHByb3BzLmluZGV4LFxuICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhLklkLFxuICAgICAgZmFsc2UsXG4gICAgICBudWxsLFxuICAgICAgaXNEZWZhdWx0RW1wdHksXG4gICAgICBpc1JhZGlvXG4gICAgKTtcbiAgfTtcbiAgLy9mdW5jdGlvbiB0byBzZXQgb25jaGFuZ2UgZGF0ZVxuICBjb25zdCBoYW5kbGVPbkRhdGVDaGFuZ2UgPSAoZGF0ZSkgPT4ge1xuICAgIHByb3BzLnNldFN0YXJ0RGF0ZShkYXRlKTtcbiAgICBjb25zdCBpc0RhdGVDaGFuZ2UgPSB0cnVlO1xuICAgIGNvbnN0IGRhdGVPYmogPSB7XG4gICAgICBkYXRlOiBkYXRlLFxuICAgICAgZm9ybWF0OiBwcm9wcy5zZWxlY3REYXRlLmZvcm1hdFxuICAgIH07XG4gICAgcHJvcHMuaGFuZGxlU2F2ZURhdGUoZGF0ZU9iaiwgaXNEYXRlQ2hhbmdlKTtcbiAgfTtcbiAgLy9oYW5kbGUgaGVpZ2h0IG9uIGVudGVyIHByZXNzIGluIHRleHQgYXJlYVxuICBjb25zdCBoYW5kbGVFbnRlclByZXNzID0gKGUpID0+IHtcbiAgICBjb25zdCBoZWlnaHQgPSAxODtcbiAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikge1xuICAgICAgLy9mdW5jdGlvbiB0byBzYXZlIGhlaWdodCBvZiB0ZXh0IGFyZWFcbiAgICAgIG9uQ2hhbmdlSGVpZ2h0T2ZUZXh0QXJlYShcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBwcm9wcy5wb3MudHlwZSxcbiAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcInNpZ25hdHVyZVwiOlxuICAgICAgcmV0dXJuIHByb3BzLnBvcy5TaWduVXJsID8gKFxuICAgICAgICA8aW1nXG4gICAgICAgICAgYWx0PVwic2lnbmF0dXJlXCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgc3JjPXtwcm9wcy5wb3MuU2lnblVybH1cbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIFwiXG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIHtwcm9wcz8uaGFuZGxlVXNlck5hbWUgJiZcbiAgICAgICAgICAgIHByb3BzPy5oYW5kbGVVc2VyTmFtZShcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LklkLFxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uUm9sZSxcbiAgICAgICAgICAgICAgd2lkZ2V0VHlwZVRyYXNsYXRpb25cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwic3RhbXBcIjpcbiAgICAgIHJldHVybiBwcm9wcy5wb3MuU2lnblVybCA/IChcbiAgICAgICAgPGltZ1xuICAgICAgICAgIGFsdD1cInN0YW1wXCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgc3JjPXtwcm9wcy5wb3MuU2lnblVybH1cbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsXCJcbiAgICAgICAgLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gdy1mdWxsIGgtZnVsbCB0ZXh0LWJsYWNrIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxuICAgICAgICAgICAgcHJvcHM/LmhhbmRsZVVzZXJOYW1lKFxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uSWQsXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5Sb2xlLFxuICAgICAgICAgICAgICB3aWRnZXRUeXBlVHJhc2xhdGlvblxuICAgICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBzdHlsZT17eyB6SW5kZXg6IHByb3BzLmlzU2lnbllvdXJzZWxmICYmIFwiOTlcIiB9fT5cbiAgICAgICAgICB7cHJvcHMucG9zLm9wdGlvbnM/LnZhbHVlcz8ubWFwKChkYXRhLCBpbmQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxkaXYga2V5PXtpbmR9IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtY2VudGVyIGdhcC0wLjVcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBmb250U2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBmb250U2l6ZVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICAgICAgICAgIGluZCA9PT0gMCA/IFwibXQtMFwiIDogXCJtdC1bNXB4XVwiXG4gICAgICAgICAgICAgICAgICB9IGZsZXgganVzdGlmeS1jZW50ZXIgb3AtY2hlY2tib3ggcm91bmRlZC1bMXB4XSBgfVxuICAgICAgICAgICAgICAgICAgb25CbHVyPXtoYW5kbGVJbnB1dEJsdXJ9XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmlzTmVlZFNpZ24gJiZcbiAgICAgICAgICAgICAgICAgICAgKHByb3BzLnBvcy5vcHRpb25zPy5pc1JlYWRPbmx5IHx8XG4gICAgICAgICAgICAgICAgICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgIT09IHByb3BzLnNpZ25lck9iaklkKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdENoZWNrYm94KGluZCl9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3BzLmlzUGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFJlcXVpcmVkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMucG9zLm9wdGlvbnM/LnZhbGlkYXRpb24/Lm1heFJlcXVpcmVkQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhDb3VudEludCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlcXVpcmVkICYmIHBhcnNlSW50KG1heFJlcXVpcmVkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heENvdW50SW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaGVja2JveCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hlY2tib3g/Lmxlbmd0aCA8PSBtYXhDb3VudEludCAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tib3hWYWx1ZShlLnRhcmdldC5jaGVja2VkLCBpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDaGVja2JveFZhbHVlKGUudGFyZ2V0LmNoZWNrZWQsIGluZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoZWNrYm94VmFsdWUoZS50YXJnZXQuY2hlY2tlZCwgaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIHshcHJvcHMucG9zLm9wdGlvbnM/LmlzSGlkZUxhYmVsICYmIChcbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZm9udENvbG9yXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQteHMgbWItMCB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtkYXRhfVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIHRleHRJbnB1dFdpZGdldDpcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxuICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXt2YWxpZGF0ZVBsYWNlaG9sZGVyIHx8IFwicGxlYXNlIGVudGVyIHZhbHVlXCJ9XG4gICAgICAgICAgcm93cz17MX1cbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XG4gICAgICAgICAgdmFsdWU9e3RleHRWYWx1ZX1cbiAgICAgICAgICBvbkJsdXI9e2hhbmRsZUlucHV0Qmx1cn1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgIHNldFRleHRWYWx1ZShlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxuICAgICAgICAgIH19XG4gICAgICAgICAgY29scz1cIjUwXCJcbiAgICAgICAgLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvcixcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuPnt3aWRnZXRUeXBlVHJhc2xhdGlvbn08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwiZHJvcGRvd25cIjpcbiAgICAgIHJldHVybiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQgPyAoXG4gICAgICAgIDxzZWxlY3RcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxuICAgICAgICAgIH19XG4gICAgICAgICAgY2xhc3NOYW1lPXtgJHtzZWxlY3RXaWRnZXRDbHN9IHRleHQtWzEycHhdIGJnLWluaGVyaXRgfVxuICAgICAgICAgIGlkPVwibXlEcm9wZG93blwiXG4gICAgICAgICAgdmFsdWU9e3NlbGVjdE9wdGlvbn1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgIHNldFNlbGVjdE9wdGlvbihlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgey8qIERlZmF1bHQvVGl0bGUgb3B0aW9uICovfVxuICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHZhbHVlPVwiXCJcbiAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgICAgICBoaWRkZW5cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7cHJvcHM/LnBvcz8ub3B0aW9ucz8ubmFtZX1cbiAgICAgICAgICA8L29wdGlvbj5cblxuICAgICAgICAgIHtwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbHVlcz8ubWFwKChkYXRhLCBpbmQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAga2V5PXtpbmR9XG4gICAgICAgICAgICAgICAgdmFsdWU9e2RhdGF9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ZGF0YX1cbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pfVxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxuICAgICAgICAgIH19XG4gICAgICAgICAgY2xhc3NOYW1lPVwiIG92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgID5cbiAgICAgICAgICB7cHJvcHMucG9zPy5vcHRpb25zPy5uYW1lXG4gICAgICAgICAgICA/IHByb3BzLnBvcy5vcHRpb25zLm5hbWVcbiAgICAgICAgICAgIDogd2lkZ2V0VHlwZVRyYXNsYXRpb259XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwiaW5pdGlhbHNcIjpcbiAgICAgIHJldHVybiBwcm9wcy5wb3MuU2lnblVybCA/IChcbiAgICAgICAgPGltZ1xuICAgICAgICAgIGFsdD1cImluaXRpYWxzXCJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgc3JjPXtwcm9wcy5wb3MuU2lnblVybH1cbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsXCJcbiAgICAgICAgLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gdy1mdWxsIGgtZnVsbCB0ZXh0LWJsYWNrIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxuICAgICAgICAgICAgcHJvcHM/LmhhbmRsZVVzZXJOYW1lKFxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uSWQsXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5Sb2xlLFxuICAgICAgICAgICAgICB3aWRnZXRUeXBlVHJhc2xhdGlvblxuICAgICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgXCJuYW1lXCI6XG4gICAgICByZXR1cm4gcHJvcHMuaXNTaWduWW91cnNlbGYgfHxcbiAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSA/IChcbiAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgcmVmPXtpbnB1dFJlZn1cbiAgICAgICAgICBwbGFjZWhvbGRlcj17XCJuYW1lXCJ9XG4gICAgICAgICAgcm93cz17MX1cbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XG4gICAgICAgICAgdmFsdWU9e3RleHRWYWx1ZX1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICAgICAgaGFuZGxlVGV4dFZhbGlkKGUpO1xuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcbiAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgIHByb3BzLnBvcy5rZXksXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcbiAgICAgICAgICAgICAgcHJvcHMuaW5kZXgsXG4gICAgICAgICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcbiAgICAgICAgICAgICAgaXNEZWZhdWx0XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH19XG4gICAgICAgICAgY2xhc3NOYW1lPXt0ZXh0V2lkZ2V0Q2xzfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjb2xzPVwiNTBcIlxuICAgICAgICAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yLFxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4+e3dpZGdldFR5cGVUcmFzbGF0aW9ufTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgXCJjb21wYW55XCI6XG4gICAgICByZXR1cm4gcHJvcHMuaXNTaWduWW91cnNlbGYgfHxcbiAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSA/IChcbiAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgcmVmPXtpbnB1dFJlZn1cbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHRleHRcIlxuICAgICAgICAgIHJvd3M9ezF9XG4gICAgICAgICAgb25LZXlEb3duPXtoYW5kbGVFbnRlclByZXNzfVxuICAgICAgICAgIHZhbHVlPXt0ZXh0VmFsdWV9XG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICBoYW5kbGVUZXh0VmFsaWQoZSk7XG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxuICAgICAgICAgIH19XG4gICAgICAgICAgY29scz1cIjUwXCJcbiAgICAgICAgLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvcixcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuPnt3aWRnZXRUeXBlVHJhc2xhdGlvbn08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwiam9iIHRpdGxlXCI6XG4gICAgICByZXR1cm4gcHJvcHMuaXNTaWduWW91cnNlbGYgfHxcbiAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSA/IChcbiAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgcmVmPXtpbnB1dFJlZn1cbiAgICAgICAgICBwbGFjZWhvbGRlcj17XCJqb2IgdGl0bGVcIn1cbiAgICAgICAgICByb3dzPXsxfVxuICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlRW50ZXJQcmVzc31cbiAgICAgICAgICB2YWx1ZT17dGV4dFZhbHVlfVxuICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgaGFuZGxlVGV4dFZhbGlkKGUpO1xuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcbiAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgIHByb3BzLnBvcy5rZXksXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcbiAgICAgICAgICAgICAgcHJvcHMuaW5kZXgsXG4gICAgICAgICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcbiAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfX1cbiAgICAgICAgICBjbGFzc05hbWU9e3RleHRXaWRnZXRDbHN9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3JcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNvbHM9XCI1MFwiXG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3IsXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj57d2lkZ2V0VHlwZVRyYXNsYXRpb259PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxEYXRlUGlja2VyXG4gICAgICAgICAgICByZW5kZXJDdXN0b21IZWFkZXI9eyh7IGRhdGUsIGNoYW5nZVllYXIsIGNoYW5nZU1vbnRoIH0pID0+IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktc3RhcnQgbWwtMiBcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJiZy10cmFuc3BhcmVudCBvdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9e21vbnRoc1tnZXRNb250aChkYXRlKV19XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHsgdGFyZ2V0OiB7IHZhbHVlIH0gfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlTW9udGgobW9udGhzLmluZGV4T2YodmFsdWUpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHttb250aHMubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e29wdGlvbn0gdmFsdWU9e29wdGlvbn0+XG4gICAgICAgICAgICAgICAgICAgICAge29wdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJiZy10cmFuc3BhcmVudCBvdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9e2dldFllYXIoZGF0ZSl9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHsgdGFyZ2V0OiB7IHZhbHVlIH0gfSkgPT4gY2hhbmdlWWVhcih2YWx1ZSl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3llYXJzLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtvcHRpb259IHZhbHVlPXtvcHRpb259PlxuICAgICAgICAgICAgICAgICAgICAgIHtvcHRpb259XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIGRpc2FibGVkPXtcbiAgICAgICAgICAgICAgcHJvcHMuaXNQbGFjZWhvbGRlciB8fFxuICAgICAgICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJlxuICAgICAgICAgICAgICAgIHByb3BzLmRhdGE/LnNpZ25lck9iaklkICE9PSBwcm9wcy5zaWduZXJPYmpJZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9uQmx1cj17aGFuZGxlSW5wdXRCbHVyfVxuICAgICAgICAgICAgY2xvc2VPblNjcm9sbD17dHJ1ZX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7c2VsZWN0V2lkZ2V0Q2xzfSBvdXRsaW5lLVsjMDA3YmZmXWB9XG4gICAgICAgICAgICBzZWxlY3RlZD17XG4gICAgICAgICAgICAgIHByb3BzPy5zdGFydERhdGVcbiAgICAgICAgICAgICAgICA/IHByb3BzPy5zdGFydERhdGVcbiAgICAgICAgICAgICAgICA6IHByb3BzLnBvcy5vcHRpb25zPy5yZXNwb25zZSAmJlxuICAgICAgICAgICAgICAgICAgbmV3IERhdGUocHJvcHMucG9zLm9wdGlvbnMucmVzcG9uc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvbkNoYW5nZT17KGRhdGUpID0+IGhhbmRsZU9uRGF0ZUNoYW5nZShkYXRlKX1cbiAgICAgICAgICAgIHBvcHBlclBsYWNlbWVudD1cInRvcC1lbmRcIlxuICAgICAgICAgICAgY3VzdG9tSW5wdXQ9ezxFeGFtcGxlQ3VzdG9tSW5wdXQgLz59XG4gICAgICAgICAgICBkYXRlRm9ybWF0PXtcbiAgICAgICAgICAgICAgcHJvcHMuc2VsZWN0RGF0ZVxuICAgICAgICAgICAgICAgID8gcHJvcHMuc2VsZWN0RGF0ZT8uZm9ybWF0XG4gICAgICAgICAgICAgICAgOiBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LmZvcm1hdFxuICAgICAgICAgICAgICAgICAgPyBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LmZvcm1hdFxuICAgICAgICAgICAgICAgICAgOiBcIk1NL2RkL3l5eXlcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yLFxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJpdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAge3Byb3BzLnNlbGVjdERhdGVcbiAgICAgICAgICAgICAgPyBwcm9wcy5zZWxlY3REYXRlPy5mb3JtYXRcbiAgICAgICAgICAgICAgOiBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LmZvcm1hdFxuICAgICAgICAgICAgICAgID8gcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXRcbiAgICAgICAgICAgICAgICA6IFwiTU0vZGQveXl5eVwifVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgICAgcmV0dXJuIHByb3BzLnBvcy5TaWduVXJsID8gKFxuICAgICAgICA8aW1nXG4gICAgICAgICAgYWx0PVwiaW1hZ2VcIlxuICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICBzcmM9e3Byb3BzLnBvcy5TaWduVXJsfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGxcIlxuICAgICAgICAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSB3LWZ1bGwgaC1mdWxsIHRleHQtYmxhY2sgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICB7cHJvcHM/LmhhbmRsZVVzZXJOYW1lICYmXG4gICAgICAgICAgICBwcm9wcz8uaGFuZGxlVXNlck5hbWUoXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5JZCxcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LlJvbGUsXG4gICAgICAgICAgICAgIHdpZGdldFR5cGVUcmFzbGF0aW9uXG4gICAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICByZXR1cm4gcHJvcHMuaXNTaWduWW91cnNlbGYgfHxcbiAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSA/IChcbiAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgcmVmPXtpbnB1dFJlZn1cbiAgICAgICAgICBwbGFjZWhvbGRlcj17XCJlbnRlciBlbWFpbFwifVxuICAgICAgICAgIHJvd3M9ezF9XG4gICAgICAgICAgb25LZXlEb3duPXtoYW5kbGVFbnRlclByZXNzfVxuICAgICAgICAgIHZhbHVlPXt0ZXh0VmFsdWV9XG4gICAgICAgICAgb25CbHVyPXtoYW5kbGVJbnB1dEJsdXJ9XG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICBoYW5kbGVUZXh0VmFsaWQoZSk7XG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvcixcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWwsIHNhbnMtc2VyaWZcIlxuICAgICAgICAgIH19XG4gICAgICAgICAgY29scz1cIjUwXCJcbiAgICAgICAgLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvcixcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWwsIHNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuPnt3aWRnZXRUeXBlVHJhc2xhdGlvbn08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIHJhZGlvQnV0dG9uV2lkZ2V0OlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICB7cHJvcHMucG9zLm9wdGlvbnM/LnZhbHVlcy5tYXAoKGRhdGEsIGluZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPGRpdiBrZXk9e2luZH0gY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXIgZ2FwLTAuNVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IGluZCA+IDAgPyBcIjEwcHhcIiA6IFwiMHB4XCJcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BmbGV4IGp1c3RpZnktY2VudGVyIG9wLXJhZGlvYH1cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmlzTmVlZFNpZ24gJiZcbiAgICAgICAgICAgICAgICAgICAgKHByb3BzLnBvcy5vcHRpb25zPy5pc1JlYWRPbmx5IHx8XG4gICAgICAgICAgICAgICAgICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgIT09IHByb3BzLnNpZ25lck9iaklkKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aGFuZGxlUmFkaW9DaGVjayhkYXRhKX1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3BzLmlzUGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDaGVja1JhZGlvKGUudGFyZ2V0LmNoZWNrZWQsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgeyFwcm9wcy5wb3Mub3B0aW9ucz8uaXNIaWRlTGFiZWwgJiYgKFxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3JcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyBtYi0wXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge2RhdGF9XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgdGV4dFdpZGdldDpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgdGV4dFwiXG4gICAgICAgICAgcm93cz17MX1cbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XG4gICAgICAgICAgdmFsdWU9e3RleHRWYWx1ZX1cbiAgICAgICAgICBvbkJsdXI9e2hhbmRsZUlucHV0Qmx1cn1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgIHNldFRleHRWYWx1ZShlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxuICAgICAgICAgIH19XG4gICAgICAgICAgY29scz1cIjUwXCJcbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBwcm9wcy5wb3MuU2lnblVybCA/IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lXCI+XG4gICAgICAgICAgPGltZ1xuICAgICAgICAgICAgYWx0PVwiaW1hZ2VcIlxuICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgc3JjPXtwcm9wcy5wb3MuU2lnblVybH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGxcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSB3LWZ1bGwgaC1mdWxsIHRleHQtYmxhY2sgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICB7cHJvcHMucG9zLmlzU3RhbXAgPyA8ZGl2PnN0YW1wPC9kaXY+IDogPGRpdj5zaWduYXR1cmU8L2Rpdj59XG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxuICAgICAgICAgICAgcHJvcHM/LmhhbmRsZVVzZXJOYW1lKHByb3BzPy5kYXRhPy5JZCwgcHJvcHM/LmRhdGE/LlJvbGUpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXJUeXBlO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xuXG5mdW5jdGlvbiBQcmV2TmV4dCh7IHBhZ2VOdW1iZXIsIGFsbFBhZ2VzLCBjaGFuZ2VQYWdlIH0pIHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xuICAvL2ZvciBnbyB0byBwcmV2aW91cyBwYWdlXG4gIGZ1bmN0aW9uIHByZXZpb3VzUGFnZSgpIHtcbiAgICBjaGFuZ2VQYWdlKC0xKTtcbiAgfVxuICAvL2ZvciBnbyB0byBuZXh0IHBhZ2VcbiAgZnVuY3Rpb24gbmV4dFBhZ2UoKSB7XG4gICAgY2hhbmdlUGFnZSgxKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLW5ldXRyYWwgb3AtYnRuLXhzIG1kOm9wLWJ0bi1zbSBmb250LXNlbWlib2xkIHRleHQteHNcIlxuICAgICAgICBkaXNhYmxlZD17cGFnZU51bWJlciA8PSAxfVxuICAgICAgICBvbkNsaWNrPXtwcmV2aW91c1BhZ2V9XG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJsb2NrXCI+XG4gICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYmFja3dhcmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LWJhc2UtY29udGVudCBmb250LW1lZGl1bSBteC0yIDJ4bDp0ZXh0LVszMHB4XVwiPlxuICAgICAgICB7cGFnZU51bWJlciB8fCAoYWxsUGFnZXMgPyAxIDogXCItLVwiKX0ge3QoXCJvZlwiKX0ge2FsbFBhZ2VzIHx8IFwiLS1cIn1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1uZXV0cmFsIG9wLWJ0bi14cyBtZDpvcC1idG4tc20gZm9udC1zZW1pYm9sZCB0ZXh0LXhzXCJcbiAgICAgICAgZGlzYWJsZWQ9e3BhZ2VOdW1iZXIgPj0gYWxsUGFnZXN9XG4gICAgICAgIG9uQ2xpY2s9e25leHRQYWdlfVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJibG9ja1wiPlxuICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWZvcndhcmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBQcmV2TmV4dDtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcbmltcG9ydCB7IERvY3VtZW50LCBQYWdlIH0gZnJvbSBcInJlYWN0LXBkZlwiO1xuaW1wb3J0IHsgdXNlU2VsZWN0b3IgfSBmcm9tIFwicmVhY3QtcmVkdXhcIjtcblxuZnVuY3Rpb24gUmVuZGVyQWxsUGRmUGFnZSh7XG4gIHNpZ25QZGZVcmwsXG4gIGFsbFBhZ2VzLFxuICBzZXRBbGxQYWdlcyxcbiAgc2V0UGFnZU51bWJlcixcbiAgc2V0U2lnbkJ0blBvc2l0aW9uLFxuICBwYWdlTnVtYmVyLFxuICBzaWduZXJQb3MsXG4gIHNpZ25lck9iamVjdElkLFxuICBjb250YWluZXJXSCxcbiAgcGRmUm90YXRlQmFzZTY0XG59KSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW3NpZ25QYWdlTnVtYmVyLCBzZXRTaWduUGFnZU51bWJlcl0gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtib29rbWFya0NvbG9yLCBzZXRCb29rbWFya0NvbG9yXSA9IHVzZVN0YXRlKFwiXCIpO1xuICAvL3NldCBhbGwgbnVtYmVyIG9mIHBhZ2VzIGFmdGVyIGxvYWQgcGRmXG4gIGZ1bmN0aW9uIG9uRG9jdW1lbnRMb2FkKHsgbnVtUGFnZXMgfSkge1xuICAgIHNldEFsbFBhZ2VzKG51bVBhZ2VzKTtcbiAgICAvL2NoZWNrIGlmIHNpZ25lclBvcyBhcnJheSBleGlzdCB0aGVuIHNhdmUgcGFnZSBudW1iZXIgZXhpc3QgaW4gc2lnbmVyUG9zIGFycmF5IHRvIHNob3cgYm9va21hcmsgaWNvblxuICAgIGlmIChzaWduZXJQb3MpIHtcbiAgICAgIGNvbnN0IGNoZWNrVXNlciA9IHNpZ25lclBvcy5maWx0ZXIoXG4gICAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZFxuICAgICAgKTtcbiAgICAgIHNldEJvb2ttYXJrQ29sb3IoY2hlY2tVc2VyWzBdPy5ibG9ja0NvbG9yKTtcbiAgICAgIGxldCBwYWdlTnVtYmVyQXJyID0gW107XG4gICAgICBpZiAoY2hlY2tVc2VyPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNoZWNrVXNlclswXT8ucGxhY2VIb2xkZXI/Lm1hcCgoZGF0YSkgPT4ge1xuICAgICAgICAgIHBhZ2VOdW1iZXJBcnIucHVzaChkYXRhPy5wYWdlTnVtYmVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0U2lnblBhZ2VOdW1iZXIocGFnZU51bWJlckFycik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHBhZ2VDb250YWluZXIgPSB1c2VSZWYoKTtcbiAgY29uc3QgaXNIZWFkZXIgPSB1c2VTZWxlY3Rvcigoc3RhdGUpID0+IHN0YXRlLnNob3dIZWFkZXIpO1xuICBjb25zdCBbcGFnZVdpZHRoLCBzZXRQYWdlV2lkdGhdID0gdXNlU3RhdGUoXCJcIik7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVTaXplID0gKCkgPT4ge1xuICAgICAgaWYgKHBhZ2VDb250YWluZXIuY3VycmVudCkge1xuICAgICAgICBzZXRQYWdlV2lkdGgocGFnZUNvbnRhaW5lci5jdXJyZW50Lm9mZnNldFdpZHRoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gd2FpdCBmb3IgdGhlIHRyYW5zaXRpb24gdG8gY29tcGxldGVcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQodXBkYXRlU2l6ZSwgMTAwKTsgLy8gbWF0Y2ggdGhlIHRyYW5zaXRpb24gZHVyYXRpb25cblxuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9LCBbaXNIZWFkZXIsIHBhZ2VDb250YWluZXIsIGNvbnRhaW5lcldIXSk7XG4gIC8vJ2Z1bmN0aW9uIGBhZGRTaWduYXR1cmVCb29rbWFya2AgaXMgdXNlZCB0byBkaXNwbGF5IHRoZSBwYWdlIHdoZXJlIHRoZSB1c2VyJ3Mgc2lnbmF0dXJlIGlzIGxvY2F0ZWQuXG4gIGNvbnN0IGFkZFNpZ25hdHVyZUJvb2ttYXJrID0gKGluZGV4KSA9PiB7XG4gICAgY29uc3QgaXNwYWdlTnVtYmVyID0gc2lnblBhZ2VOdW1iZXIuaW5jbHVkZXMoaW5kZXggKyAxKTtcbiAgICByZXR1cm4gKFxuICAgICAgaXNwYWdlTnVtYmVyICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSB6LTIwIHRvcC1bMXB4XSAtcmlnaHQtWzEzcHhdIC10cmFuc2xhdGUteC0xLzIgLXRyYW5zbGF0ZS15LTEvMlwiPlxuICAgICAgICAgIDxpXG4gICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogYm9va21hcmtDb2xvciB8fCBcInJlZFwiIH19XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1zb2xpZCBmYS1ib29rbWFya1wiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICApXG4gICAgKTtcbiAgfTtcbiAgY29uc3QgcGRmRGF0YUJhc2U2NCA9IGBkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsJHtwZGZSb3RhdGVCYXNlNjR9YDtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IHJlZj17cGFnZUNvbnRhaW5lcn0gY2xhc3NOYW1lPVwiaGlkZGVuIHctWzIwJV0gYmctYmFzZS0xMDAgbWQ6YmxvY2tcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtMiBwci0yIHB0LTIgcGItMSB0ZXh0LVsxNXB4XSB0ZXh0LWJhc2UtY29udGVudCBmb250LXNlbWlib2xkIGJvcmRlci1iLVsxcHhdIGJvcmRlci1iYXNlLTMwMFwiPlxuICAgICAgICB7dChcInBhZ2VzXCIpfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17YGZsZXggaC1bOTAlXSBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgbS0yICBcbiAgICAgICAgIGF1dG9TaWduU2Nyb2xsIGhpZGUtc2Nyb2xsYmFyIG1heC1oLVsxMDB2aF0gYH1cbiAgICAgID5cbiAgICAgICAgPERvY3VtZW50XG4gICAgICAgICAgbG9hZGluZz17dChcImxvYWRpbmctZG9jXCIpfVxuICAgICAgICAgIG9uTG9hZFN1Y2Nlc3M9e29uRG9jdW1lbnRMb2FkfVxuICAgICAgICAgIGZpbGU9eyhwZGZSb3RhdGVCYXNlNjQgJiYgcGRmRGF0YUJhc2U2NCkgfHwgc2lnblBkZlVybH1cbiAgICAgICAgPlxuICAgICAgICAgIHtBcnJheS5mcm9tKG5ldyBBcnJheShhbGxQYWdlcyksIChlbCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcbiAgICAgICAgICAgICAgICBwYWdlTnVtYmVyIC0gMSA9PT0gaW5kZXggPyBcImJvcmRlci1bcmVkXVwiIDogXCJib3JkZXItWyM4Nzg3ODddXCJcbiAgICAgICAgICAgICAgfSBib3JkZXItMiAgIG0tWzEwcHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHJlbGF0aXZlYH1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldFBhZ2VOdW1iZXIoaW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAoc2V0U2lnbkJ0blBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICBzZXRTaWduQnRuUG9zaXRpb24oW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3NpZ25lclBvcyAmJiBhZGRTaWduYXR1cmVCb29rbWFyayhpbmRleCl9XG5cbiAgICAgICAgICAgICAgey8qIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgei1bMV0gb3ZlcmZsb3ctaGlkZGVuXCI+ICovfVxuICAgICAgICAgICAgICA8UGFnZVxuICAgICAgICAgICAgICAgIGtleT17YHBhZ2VfJHtpbmRleCArIDF9YH1cbiAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtpbmRleCArIDF9XG4gICAgICAgICAgICAgICAgd2lkdGg9e3BhZ2VXaWR0aCAtIDYwfVxuICAgICAgICAgICAgICAgIHNjYWxlPXsxfVxuICAgICAgICAgICAgICAgIHJlbmRlckFubm90YXRpb25MYXllcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgcmVuZGVyVGV4dExheWVyPXtmYWxzZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgey8qIDwvZGl2PiAqL31cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L0RvY3VtZW50PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlbmRlckFsbFBkZlBhZ2U7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUlNDIGZyb20gXCJyZWFjdC1zY3JvbGxiYXJzLWN1c3RvbVwiO1xuaW1wb3J0IHsgRG9jdW1lbnQsIFBhZ2UgfSBmcm9tIFwicmVhY3QtcGRmXCI7XG5pbXBvcnQge1xuICBkZWZhdWx0V2lkdGhIZWlnaHQsXG4gIGdldENvbnRhaW5lclNjYWxlLFxuICBoYW5kbGVJbWFnZVJlc2l6ZSxcbiAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemVcbn0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L1V0aWxzXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcIi4vUGxhY2Vob2xkZXJcIjtcbmltcG9ydCBBbGVydCBmcm9tIFwiLi4vLi4vcHJpbWl0aXZlcy9BbGVydFwiO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xuXG5mdW5jdGlvbiBSZW5kZXJQZGYoe1xuICBwYWdlTnVtYmVyLFxuICBkcm9wLFxuICBzaWduZXJQb3MsXG4gIHN1Y2Nlc3NFbWFpbCxcbiAgaGFuZGxlVGFiRHJhZyxcbiAgaGFuZGxlU3RvcCxcbiAgaXNEcmFnZ2luZyxcbiAgc2V0SXNTaWduUGFkLFxuICBzZXRJc1N0YW1wLFxuICBoYW5kbGVEZWxldGVTaWduLFxuICBzZXRTaWduS2V5LFxuICBwZGZEZXRhaWxzLFxuICB4eVBvc3Rpb24sXG4gIHBhZ2VEZXRhaWxzLFxuICBwZGZSZXF1ZXN0LFxuICBzaWduZXJPYmplY3RJZCxcbiAgc2lnbmVkU2lnbmVycyxcbiAgcGRmTG9hZCxcbiAgc2V0UGRmTG9hZCxcbiAgcGxhY2Vob2xkZXIsXG4gIHNldFNpZ25lclBvcyxcbiAgc2V0WHlQb3N0aW9uLFxuICBpbmRleCxcbiAgY29udGFpbmVyV0gsXG4gIHNldElzUmVzaXplLFxuICBoYW5kbGVMaW5rVXNlcixcbiAgc2V0VW5pcXVlSWQsXG4gIHNpZ25lcnNkYXRhLFxuICBzZXRJc1BhZ2VDb3B5LFxuICBzZXRTaWduZXJPYmpJZCxcbiAgc2V0U2hvd0Ryb3Bkb3duLFxuICBzZXRJc0luaXRpYWwsXG4gIHNldElzVmFsaWRhdGUsXG4gIHNldFdpZGdldFR5cGUsXG4gIHNldFZhbGlkYXRlQWxlcnQsXG4gIHNldElzUmFkaW8sXG4gIHNldEN1cnJXaWRnZXRzRGV0YWlscyxcbiAgc2V0U2VsZWN0V2lkZ2V0SWQsXG4gIHNlbGVjdFdpZGdldElkLFxuICB1blNpZ25lZFdpZGdldElkLFxuICBzZXRJc0NoZWNrYm94LFxuICBoYW5kbGVOYW1lTW9kYWwsXG4gIGhhbmRsZVRleHRTZXR0aW5nTW9kYWwsXG4gIHNldFRlbXBTaWduZXJJZCxcbiAgdW5pcXVlSWQsXG4gIHBkZk9yaWdpbmFsV0gsXG4gIHNjYWxlLFxuICBzZXRJc1NlbGVjdElkLFxuICBpc3B1YmxpY1RlbXBsYXRlLFxuICBoYW5kbGVVc2VyRGV0YWlscyxcbiAgcGRmUm90YXRlQmFzZTY0LFxuICBmb250U2l6ZSxcbiAgc2V0Rm9udFNpemUsXG4gIGZvbnRDb2xvcixcbiAgc2V0Rm9udENvbG9yXG59KSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDc2NztcblxuICAvL2NoZWNrIGlzR3Vlc3RTaWduZXIgaXMgcHJlc2VudCBpbiBsb2NhbCBpZiB5ZXMgdGhhbiBoYW5kbGUgbG9naW4gZmxvdyBoZWFkZXIgaW4gbW9iaWxlIHZpZXdcbiAgY29uc3QgaXNHdWVzdFNpZ25lciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNHdWVzdFNpZ25lclwiKTtcblxuICAvLyBoYW5kbGUgc2lnbmF0dXJlIGJsb2NrIHdpZHRoIGFuZCBoZWlnaHQgYWNjb3JkaW5nIHRvIHNjcmVlblxuICBjb25zdCBwb3NXaWR0aCA9IChwb3MsIHNpZ25Zb3Vyc2VsZikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lclNjYWxlID0gZ2V0Q29udGFpbmVyU2NhbGUoXG4gICAgICBwZGZPcmlnaW5hbFdILFxuICAgICAgcGFnZU51bWJlcixcbiAgICAgIGNvbnRhaW5lcldIXG4gICAgKTtcbiAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBkZWZhdWx0V2lkdGhIZWlnaHQocG9zLnR5cGUpLndpZHRoO1xuICAgIGNvbnN0IHBvc1dpZHRoID0gcG9zLldpZHRoID8gcG9zLldpZHRoIDogZGVmYXVsdFdpZHRoO1xuICAgIGlmIChzaWduWW91cnNlbGYpIHtcbiAgICAgIHJldHVybiBwb3NXaWR0aCAqIHNjYWxlICogY29udGFpbmVyU2NhbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwb3MuaXNNb2JpbGUgJiYgcG9zLnNjYWxlKSB7XG4gICAgICAgIGlmIChwb3MuSXNSZXNpemUpIHtcbiAgICAgICAgICBpZiAoc2NhbGUgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zV2lkdGggKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZSAqIHNjYWxlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zV2lkdGggKiBjb250YWluZXJTY2FsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNjYWxlID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHBvc1dpZHRoICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGUgKiBzY2FsZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHBvc1dpZHRoICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcG9zV2lkdGggKiBzY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcG9zSGVpZ2h0ID0gKHBvcywgc2lnbllvdXJzZWxmKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyU2NhbGUgPSBnZXRDb250YWluZXJTY2FsZShcbiAgICAgIHBkZk9yaWdpbmFsV0gsXG4gICAgICBwYWdlTnVtYmVyLFxuICAgICAgY29udGFpbmVyV0hcbiAgICApO1xuICAgIGNvbnN0IHBvc0hlaWdodCA9IHBvcy5IZWlnaHQgfHwgZGVmYXVsdFdpZHRoSGVpZ2h0KHBvcy50eXBlKS5oZWlnaHQ7XG4gICAgaWYgKHNpZ25Zb3Vyc2VsZikge1xuICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIHNjYWxlICogY29udGFpbmVyU2NhbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwb3MuaXNNb2JpbGUgJiYgcG9zLnNjYWxlKSB7XG4gICAgICAgIGlmIChwb3MuSXNSZXNpemUpIHtcbiAgICAgICAgICBpZiAoc2NhbGUgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zSGVpZ2h0ICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGUgKiBzY2FsZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIGNvbnRhaW5lclNjYWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc2NhbGUgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zSGVpZ2h0ICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGUgKiBzY2FsZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIHNjYWxlICogY29udGFpbmVyU2NhbGU7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vZnVuY3Rpb24gZm9yIHJlbmRlciBwbGFjZWhvbGRlciBibG9jayBvdmVyIHBkZiBkb2N1bWVudFxuICBjb25zdCBjaGVja1NpZ25lZFNpZ25lcnMgPSAoZGF0YSkgPT4ge1xuICAgIGxldCBjaGVja1NpZ24gPSBbXTtcbiAgICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgcXVpY2sgc2VuZCBmbG93IGFuZCB1c2luZyBub3JtYWwgcmVxdWVzdCBzaWduIGZsb3dcbiAgICBjaGVja1NpZ24gPSBzaWduZWRTaWduZXJzXG4gICAgICA/IHNpZ25lZFNpZ25lcnM/LmZpbHRlcihcbiAgICAgICAgICAoc2lnbikgPT5cbiAgICAgICAgICAgIHNpZ24/LklkID09PSBkYXRhPy5JZCB8fCBzaWduPy5vYmplY3RJZCA9PT0gZGF0YT8uc2lnbmVyT2JqSWRcbiAgICAgICAgKVxuICAgICAgOiBbXTtcbiAgICBjb25zdCBoYW5kbGVBbGxVc2VyTmFtZSA9IChJZCwgUm9sZSwgdHlwZSkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ibGFjayB0ZXh0LVs4cHhdIGZvbnQtYm9sZFwiPlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwZGZEZXRhaWxzWzBdLlNpZ25lcnM/LmZpbmQoXG4gICAgICAgICAgICAgICAgKHNpZ25lcikgPT4gc2lnbmVyLm9iamVjdElkID09PSBkYXRhLnNpZ25lck9iaklkXG4gICAgICAgICAgICAgICk/Lk5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7dHlwZSAmJiA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIGZvbnQtYm9sZFwiPnt0eXBlfTwvZGl2Pn1cbiAgICAgICAgICB7Um9sZSAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtYmxhY2sgdGV4dC1bOHB4XSBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICB7YCgke1JvbGV9KWB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgKTtcbiAgICB9O1xuICAgIHJldHVybiAoXG4gICAgICBjaGVja1NpZ24ubGVuZ3RoID09PSAwICYmXG4gICAgICBkYXRhLnBsYWNlSG9sZGVyLm1hcCgocGxhY2VEYXRhLCBrZXkpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtrZXl9PlxuICAgICAgICAgICAge3BsYWNlRGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyICYmXG4gICAgICAgICAgICAgIHBsYWNlRGF0YS5wb3MubWFwKChwb3MpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgcG9zICYmIChcbiAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17cG9zLmtleX0+XG4gICAgICAgICAgICAgICAgICAgICAgPFBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3M9e3Bvc31cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZT17aGFuZGxlSW1hZ2VSZXNpemV9XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17cGFnZU51bWJlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17c2lnbmVyUG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtzZXRTaWduZXJQb3N9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXtkYXRhfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNSZXNpemU9e3NldElzUmVzaXplfVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93Qm9yZGVyPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lck9iaklkPXtzaWduZXJPYmplY3RJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0Ryb3Bkb3duPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNOZWVkU2lnbj17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc1dpZHRoPXtwb3NXaWR0aH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc0hlaWdodD17cG9zSGVpZ2h0fVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e2hhbmRsZUFsbFVzZXJOYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNEcmFnZ2luZz17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzPXtwZGZEZXRhaWxzfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0PXtzZXRWYWxpZGF0ZUFsZXJ0fVxuICAgICAgICAgICAgICAgICAgICAgICAgdW5TaWduZWRXaWRnZXRJZD17dW5TaWduZWRXaWRnZXRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFdpZGdldElkPXtzZWxlY3RXaWRnZXRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17c2V0Q3VycldpZGdldHNEZXRhaWxzfVxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQ9e3VuaXF1ZUlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9e3NjYWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSD17cGRmT3JpZ2luYWxXSH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICBpc3B1YmxpY1RlbXBsYXRlPXtpc3B1YmxpY1RlbXBsYXRlfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlckRldGFpbHM9e2hhbmRsZVVzZXJEZXRhaWxzfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfTtcbiAgLy9mdW5jdGlvbiBmb3IgcmVuZGVyIHBsYWNlaG9sZGVyIGJsb2NrIG92ZXIgcGRmIGRvY3VtZW50XG5cbiAgY29uc3QgaGFuZGxlVXNlck5hbWUgPSAoSWQsIFJvbGUsIHR5cGUpID0+IHtcbiAgICBpZiAoSWQpIHtcbiAgICAgIGNvbnN0IGNoZWNrU2lnbiA9IHNpZ25lcnNkYXRhLmZpbmQoKHNpZ24pID0+IHNpZ24uSWQgPT09IElkKTtcbiAgICAgIGlmIChjaGVja1NpZ24/Lk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWJsYWNrIHRleHQtWzhweF0gZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAge2NoZWNrU2lnbj8uTmFtZX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAge3R5cGUgJiYgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSBmb250LWJvbGRcIj57dHlwZX08L2Rpdj59XG4gICAgICAgICAgICB7Um9sZSAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ibGFjayB0ZXh0LVs4cHhdIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAge2AoJHtSb2xlfSlgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC8+XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDw+XG4gICAgICAgICAgICB7dHlwZSAmJiA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIGZvbnQtYm9sZFwiPnt0eXBlfTwvZGl2Pn1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ibGFjayB0ZXh0LVs4cHhdIGZvbnQtbWVkaXVtXCI+e1JvbGV9PC9kaXY+XG4gICAgICAgICAgPC8+XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAge3R5cGUgJiYgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSBmb250LWJvbGRcIj57dHlwZX08L2Rpdj59XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWJsYWNrIHRleHQtWzhweF0gZm9udC1tZWRpdW1cIj57Um9sZX08L2Rpdj5cbiAgICAgICAgPC8+XG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGRmRGF0YUJhc2U2NCA9IGBkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsJHtwZGZSb3RhdGVCYXNlNjR9YDtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7c3VjY2Vzc0VtYWlsICYmIChcbiAgICAgICAgPEFsZXJ0IHR5cGU9e1wic3VjY2Vzc1wifT57dChcInN1Y2Nlc3MtZW1haWwtYWxlcnRcIil9PC9BbGVydD5cbiAgICAgICl9XG4gICAgICB7aXNNb2JpbGUgPyAoXG4gICAgICAgIDxSU0NcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgICAgICAgICAgIGJveFNoYWRvdzogXCJyZ2JhKDE3LCAxMiwgNDYsIDAuMTUpIDBweCA0OHB4IDEwMHB4IDBweFwiLFxuICAgICAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSAyMDAsXG4gICAgICAgICAgICB6SW5kZXg6IDBcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNsYXNzTmFtZT1cImgtZnVsbFwiXG4gICAgICAgICAgbm9TY3JvbGxZPXtmYWxzZX1cbiAgICAgICAgICBub1Njcm9sbFg9e3NjYWxlID09PSAxID8gdHJ1ZSA6IGZhbHNlfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgZGF0YS10dXQ9XCJyZWFjdG91ckZvcnRoXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICAgIGlzR3Vlc3RTaWduZXIgPyBcIjMwcHhcIiA6IFwiXCJcbiAgICAgICAgICAgIH0gYm9yZGVyLVswLjFweF0gYm9yZGVyLVsjZWJlOGU4XSBvdmVyZmxvdy14LWF1dG9gfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgd2lkdGg6IGNvbnRhaW5lcldIPy53aWR0aCAmJiBjb250YWluZXJXSD8ud2lkdGggKiBzY2FsZVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHJlZj17ZHJvcH1cbiAgICAgICAgICAgIGlkPVwiY29udGFpbmVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7Y29udGFpbmVyV0g/LndpZHRoICYmXG4gICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0gubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAocGRmUmVxdWVzdFxuICAgICAgICAgICAgICAgID8gc2lnbmVyUG9zLm1hcCgoZGF0YSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17a2V5fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjaGVja1NpZ25lZFNpZ25lcnMoZGF0YSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBwbGFjZWhvbGRlciAvLyBwbGFjZWhvbGRlciBtb2JpbGVcbiAgICAgICAgICAgICAgICAgID8gc2lnbmVyUG9zLm1hcCgoZGF0YSwgaW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2luZH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhLnBsYWNlSG9sZGVyLm1hcCgocGxhY2VEYXRhLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmRleH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwbGFjZURhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlRGF0YS5wb3MubWFwKChwb3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e3Bvcy5rZXl9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zPXtwb3N9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1BhZ2VDb3B5PXtzZXRJc1BhZ2VDb3B5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbktleT17c2V0U2lnbktleX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURlbGV0ZVNpZ249e2hhbmRsZURlbGV0ZVNpZ259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0YW1wPXtzZXRJc1N0YW1wfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGFiRHJhZz17aGFuZGxlVGFiRHJhZ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVN0b3A9e2hhbmRsZVN0b3B9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZT17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUltYWdlUmVzaXplXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17cGFnZU51bWJlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17c2lnbmVyUG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtzZXRTaWduZXJQb3N9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduZXJPYmpJZD17c2V0U2lnbmVyT2JqSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXtkYXRhfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNSZXNpemU9e3NldElzUmVzaXplfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hvd0Ryb3Bkb3duPXtzZXRTaG93RHJvcGRvd259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Nob3dCb3JkZXI9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BsYWNlaG9sZGVyPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VW5pcXVlSWQ9e3NldFVuaXF1ZUlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTGlua1VzZXI9e2hhbmRsZUxpbmtVc2VyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e2hhbmRsZVVzZXJOYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zV2lkdGg9e3Bvc1dpZHRofVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zSGVpZ2h0PXtwb3NIZWlnaHR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RyYWdnaW5nPXtpc0RyYWdnaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNWYWxpZGF0ZT17c2V0SXNWYWxpZGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZGdldFR5cGU9e3NldFdpZGdldFR5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1JhZGlvPXtzZXRJc1JhZGlvfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNDaGVja2JveD17c2V0SXNDaGVja2JveH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQ9e3NldFNlbGVjdFdpZGdldElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmFtZU1vZGFsPXtoYW5kbGVOYW1lTW9kYWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUZW1wU2lnbmVySWQ9e3NldFRlbXBTaWduZXJJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkPXt1bmlxdWVJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWw9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXh0U2V0dGluZ01vZGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJXSD17Y29udGFpbmVyV0h9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU2VsZWN0SWQ9e3NldElzU2VsZWN0SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb250U2l6ZT17c2V0Rm9udFNpemV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250Q29sb3I9e2ZvbnRDb2xvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvbnRDb2xvcj17c2V0Rm9udENvbG9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIDogeHlQb3N0aW9uLm1hcCgoZGF0YSwgaW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2luZH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBvcy5tYXAoKHBvcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcz17cG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNQYWdlQ29weT17c2V0SXNQYWdlQ29weX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWxldGVTaWduPXtoYW5kbGVEZWxldGVTaWdufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcD17c2V0SXNTdGFtcH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRhYkRyYWc9e2hhbmRsZVRhYkRyYWd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdG9wPXtoYW5kbGVTdG9wfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemU9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHlQb3N0aW9uPXt4eVBvc3Rpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRYeVBvc3Rpb249e3NldFh5UG9zdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU2lnblBhZD17c2V0SXNTaWduUGFkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93Qm9yZGVyPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NXaWR0aD17cG9zV2lkdGh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NIZWlnaHQ9e3Bvc0hlaWdodH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM9e3BkZkRldGFpbHNbMF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RyYWdnaW5nPXtpc0RyYWdnaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWRnZXRUeXBlPXtzZXRXaWRnZXRUeXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQ9e3NldFNlbGVjdFdpZGdldElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e2hhbmRsZVVzZXJOYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNDaGVja2JveD17c2V0SXNDaGVja2JveH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlQWxlcnQ9e3NldFZhbGlkYXRlQWxlcnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWw9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXh0U2V0dGluZ01vZGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvbnRTaXplPXtzZXRGb250U2l6ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRDb2xvcj17Zm9udENvbG9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9udENvbG9yPXtzZXRGb250Q29sb3J9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpfVxuXG4gICAgICAgICAgICA8RG9jdW1lbnRcbiAgICAgICAgICAgICAgb25Mb2FkRXJyb3I9eygpID0+IHNldFBkZkxvYWQoZmFsc2UpfVxuICAgICAgICAgICAgICBsb2FkaW5nPXt0KFwibG9hZGluZy1kb2NcIil9XG4gICAgICAgICAgICAgIG9uTG9hZFN1Y2Nlc3M9e3BhZ2VEZXRhaWxzfVxuICAgICAgICAgICAgICAvLyByZWY9e3BkZlJlZn0nXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0U2VsZWN0V2lkZ2V0SWQpIHtcbiAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgZmlsZT17XG4gICAgICAgICAgICAgICAgKHBkZlJvdGF0ZUJhc2U2NCAmJiBwZGZEYXRhQmFzZTY0KSB8fFxuICAgICAgICAgICAgICAgIHBkZkRldGFpbHNbMF0/LlNpZ25lZFVybCB8fFxuICAgICAgICAgICAgICAgIHBkZkRldGFpbHNbMF0uVVJMXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFBhZ2VcbiAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGUgfHwgMX1cbiAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XG4gICAgICAgICAgICAgICAgd2lkdGg9e2NvbnRhaW5lcldILndpZHRofVxuICAgICAgICAgICAgICAgIHJlbmRlckFubm90YXRpb25MYXllcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgcmVuZGVyVGV4dExheWVyPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBvbkdldEFubm90YXRpb25zRXJyb3I9eyhlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJhbm5vdGF0aW9uIGVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9Eb2N1bWVudD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9SU0M+XG4gICAgICApIDogKFxuICAgICAgICA8UlNDXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICAgICAgICBib3hTaGFkb3c6IFwicmdiYSgxNywgMTIsIDQ2LCAwLjE1KSAwcHggNDhweCAxMDBweCAwcHhcIixcbiAgICAgICAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0ICsgXCJweFwiLFxuICAgICAgICAgICAgekluZGV4OiAwXG4gICAgICAgICAgfX1cbiAgICAgICAgICBub1Njcm9sbFk9e2ZhbHNlfVxuICAgICAgICAgIG5vU2Nyb2xsWD17c2NhbGUgPT09IDEgPyB0cnVlIDogZmFsc2V9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICB3aWR0aDogY29udGFpbmVyV0g/LndpZHRoICYmIGNvbnRhaW5lcldIPy53aWR0aCAqIHNjYWxlXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgcmVmPXtkcm9wfVxuICAgICAgICAgICAgaWQ9XCJjb250YWluZXJcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtwZGZMb2FkICYmXG4gICAgICAgICAgICAgIGNvbnRhaW5lcldIPy53aWR0aCAmJlxuICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdILmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgKHBkZlJlcXVlc3QgLy9wZGYgcmVxdWVzdCBzaWduIGZsb3dcbiAgICAgICAgICAgICAgICA/IHNpZ25lclBvcz8ubWFwKChkYXRhLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtrZXl9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2NoZWNrU2lnbmVkU2lnbmVycyhkYXRhKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IHBsYWNlaG9sZGVyIC8vcGxhY2Vob2xkZXIgYW5kIHRlbXBsYXRlIGZsb3dcbiAgICAgICAgICAgICAgICAgID8gc2lnbmVyUG9zLm1hcCgoZGF0YSwgaW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2luZH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhLnBsYWNlSG9sZGVyLm1hcCgocGxhY2VEYXRhLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmRleH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwbGFjZURhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlRGF0YS5wb3MubWFwKChwb3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e3Bvcy5rZXl9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zPXtwb3N9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1BhZ2VDb3B5PXtzZXRJc1BhZ2VDb3B5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbktleT17c2V0U2lnbktleX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURlbGV0ZVNpZ249e2hhbmRsZURlbGV0ZVNpZ259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0YW1wPXtzZXRJc1N0YW1wfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGFiRHJhZz17aGFuZGxlVGFiRHJhZ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVN0b3A9e2hhbmRsZVN0b3B9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZT17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUltYWdlUmVzaXplXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17cGFnZU51bWJlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17c2lnbmVyUG9zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtzZXRTaWduZXJQb3N9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduZXJPYmpJZD17c2V0U2lnbmVyT2JqSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXtkYXRhfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNSZXNpemU9e3NldElzUmVzaXplfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hvd0Ryb3Bkb3duPXtzZXRTaG93RHJvcGRvd259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Nob3dCb3JkZXI9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BsYWNlaG9sZGVyPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VW5pcXVlSWQ9e3NldFVuaXF1ZUlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTGlua1VzZXI9e2hhbmRsZUxpbmtVc2VyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e2hhbmRsZVVzZXJOYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zV2lkdGg9e3Bvc1dpZHRofVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zSGVpZ2h0PXtwb3NIZWlnaHR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RyYWdnaW5nPXtpc0RyYWdnaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNWYWxpZGF0ZT17c2V0SXNWYWxpZGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZGdldFR5cGU9e3NldFdpZGdldFR5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1JhZGlvPXtzZXRJc1JhZGlvfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNDaGVja2JveD17c2V0SXNDaGVja2JveH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQ9e3NldFNlbGVjdFdpZGdldElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmFtZU1vZGFsPXtoYW5kbGVOYW1lTW9kYWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUZW1wU2lnbmVySWQ9e3NldFRlbXBTaWduZXJJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkPXt1bmlxdWVJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWw9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXh0U2V0dGluZ01vZGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJXSD17Y29udGFpbmVyV0h9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU2VsZWN0SWQ9e3NldElzU2VsZWN0SWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb250U2l6ZT17c2V0Rm9udFNpemV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250Q29sb3I9e2ZvbnRDb2xvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvbnRDb2xvcj17c2V0Rm9udENvbG9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIDogeHlQb3N0aW9uPy5tYXAoKGRhdGEsIGluZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ255b3Vyc2VsZiBmbG93XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2luZH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBvcy5tYXAoKHBvcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17cG9zLmtleX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M9e3Bvc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUGFnZUNvcHk9e3NldElzUGFnZUNvcHl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduS2V5PXtzZXRTaWduS2V5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVsZXRlU2lnbj17aGFuZGxlRGVsZXRlU2lnbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUYWJEcmFnPXtoYW5kbGVUYWJEcmFnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RvcD17KGV2ZW50LCBkcmFnRWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RvcChldmVudCwgZHJhZ0VsZW1lbnQsIHBvcy50eXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemU9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHlQb3N0aW9uPXt4eVBvc3Rpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRYeVBvc3Rpb249e3NldFh5UG9zdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU2lnblBhZD17c2V0SXNTaWduUGFkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93Qm9yZGVyPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NXaWR0aD17cG9zV2lkdGh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NIZWlnaHQ9e3Bvc0hlaWdodH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM9e3BkZkRldGFpbHNbMF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RyYWdnaW5nPXtpc0RyYWdnaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWRnZXRUeXBlPXtzZXRXaWRnZXRUeXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQ9e3NldFNlbGVjdFdpZGdldElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e2hhbmRsZVVzZXJOYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNDaGVja2JveD17c2V0SXNDaGVja2JveH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlQWxlcnQ9e3NldFZhbGlkYXRlQWxlcnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWw9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXh0U2V0dGluZ01vZGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJXSD17Y29udGFpbmVyV0h9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvbnRTaXplPXtzZXRGb250U2l6ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRDb2xvcj17Zm9udENvbG9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9udENvbG9yPXtzZXRGb250Q29sb3J9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pKX1cblxuICAgICAgICAgICAgey8qIHRoaXMgY29tcG9uZW50IGZvciByZW5kZXIgcGRmIGRvY3VtZW50IGlzIGluIG1pZGRsZSBvZiB0aGUgY29tcG9uZW50ICovfVxuICAgICAgICAgICAgPERvY3VtZW50XG4gICAgICAgICAgICAgIG9uTG9hZEVycm9yPXsoKSA9PiBzZXRQZGZMb2FkKGZhbHNlKX1cbiAgICAgICAgICAgICAgbG9hZGluZz17dChcImxvYWRpbmctZG9jXCIpfVxuICAgICAgICAgICAgICBvbkxvYWRTdWNjZXNzPXtwYWdlRGV0YWlsc31cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzZXRTZWxlY3RXaWRnZXRJZCkge1xuICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvLyByZWY9e3BkZlJlZn1cbiAgICAgICAgICAgICAgZmlsZT17XG4gICAgICAgICAgICAgICAgKHBkZlJvdGF0ZUJhc2U2NCAmJiBwZGZEYXRhQmFzZTY0KSB8fFxuICAgICAgICAgICAgICAgIHBkZkRldGFpbHNbMF0/LlNpZ25lZFVybCB8fFxuICAgICAgICAgICAgICAgIHBkZkRldGFpbHNbMF0uVVJMXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFBhZ2VcbiAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgIHdpZHRoPXtjb250YWluZXJXSC53aWR0aH1cbiAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGUgfHwgMX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e1wiLXotWzFdXCJ9IC8vIHdoZW4gdXNlciB6b29tLWluIGluIHRhYmxldCB3aWRnZXRzIG1vdmUgYmFja3dhcmQgdGhhdCdzIHdoeSBwYXNzIC16LVsxXVxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XG4gICAgICAgICAgICAgICAgcmVuZGVyQW5ub3RhdGlvbkxheWVyPXtmYWxzZX1cbiAgICAgICAgICAgICAgICByZW5kZXJUZXh0TGF5ZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIG9uR2V0QW5ub3RhdGlvbnNFcnJvcj17KGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImFubm90YXRpb24gZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L0RvY3VtZW50PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L1JTQz5cbiAgICAgICl9XG4gICAgPC8+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlbmRlclBkZjtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcbmltcG9ydCBTaWduYXR1cmVDYW52YXMgZnJvbSBcInJlYWN0LXNpZ25hdHVyZS1jYW52YXNcIjtcbmZ1bmN0aW9uIFNpZ25QYWQoe1xuICBpc1NpZ25QYWQsXG4gIGlzU3RhbXAsXG4gIHNldElzSW1hZ2VTZWxlY3QsXG4gIG9uU2F2ZVNpZ24sXG4gIHNldElzU2lnblBhZCxcbiAgc2V0SW1hZ2UsXG4gIGlzSW1hZ2VTZWxlY3QsXG4gIGltYWdlUmVmLFxuICBvbkltYWdlQ2hhbmdlLFxuICBvblNhdmVJbWFnZSxcbiAgaW1hZ2UsXG4gIGRlZmF1bHRTaWduLFxuICBzZXRTaWduYXR1cmUsXG4gIG15SW5pdGlhbCxcbiAgaXNJbml0aWFsLFxuICBzZXRJc0luaXRpYWwsXG4gIHNldElzU3RhbXAsXG4gIHdpZGdldFR5cGUsXG4gIGN1cnJXaWRnZXRzRGV0YWlscyxcbiAgc2V0Q3VycldpZGdldHNEZXRhaWxzXG59KSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW3BlbkNvbG9yLCBzZXRQZW5Db2xvcl0gPSB1c2VTdGF0ZShcImJsdWVcIik7XG4gIGNvbnN0IGFsbENvbG9yID0gW1wiYmx1ZVwiLCBcInJlZFwiLCBcImJsYWNrXCJdO1xuICBjb25zdCBjYW52YXNSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IFtpc0RlZmF1bHRTaWduLCBzZXRJc0RlZmF1bHRTaWduXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2lzVGFiLCBzZXRJc1RhYl0gPSB1c2VTdGF0ZShcImRyYXdcIik7XG4gIGNvbnN0IFtpc1NpZ25JbWcsIHNldElzU2lnbkltZ10gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW3NpZ25WYWx1ZSwgc2V0U2lnblZhbHVlXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbdGV4dFdpZHRoLCBzZXRUZXh0V2lkdGhdID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFt0ZXh0SGVpZ2h0LCBzZXRUZXh0SGVpZ2h0XSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbc2lnbmF0dXJlVHlwZSwgc2V0U2lnbmF0dXJlVHlwZV0gPSB1c2VTdGF0ZShcImRyYXdcIik7XG4gIGNvbnN0IGZvbnRPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6IFwiRmFzdGhhbmRcIiB9LFxuICAgIHsgdmFsdWU6IFwiRGFuY2luZyBTY3JpcHRcIiB9LFxuICAgIHsgdmFsdWU6IFwiQ2VkYXJ2aWxsZSBDdXJzaXZlXCIgfSxcbiAgICB7IHZhbHVlOiBcIkRlbGljaW91cyBIYW5kcmF3blwiIH1cbiAgICAvLyBBZGQgbW9yZSBmb250IG9wdGlvbnMgYXMgbmVlZGVkXG4gIF07XG4gIGNvbnN0IFtmb250U2VsZWN0LCBzZXRGb250U2VsZWN0XSA9IHVzZVN0YXRlKGZvbnRPcHRpb25zWzBdLnZhbHVlKTtcblxuICBjb25zdCBzZW5kZXJVc2VyID1cbiAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgIGBQYXJzZS8ke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKX0vY3VycmVudFVzZXJgXG4gICAgKSAmJlxuICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgYFBhcnNlLyR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpfS9jdXJyZW50VXNlcmBcbiAgICApO1xuICBjb25zdCBqc29uU2VuZGVyID0gSlNPTi5wYXJzZShzZW5kZXJVc2VyKTtcbiAgY29uc3QgY3VycmVudFVzZXJOYW1lID0ganNvblNlbmRlciAmJiBqc29uU2VuZGVyLm5hbWU7XG5cbiAgLy9mdW5jdGlvbiBmb3IgY2xlYXIgc2lnbmF0dXJlIGltYWdlXG4gIGNvbnN0IGhhbmRsZUNsZWFyID0gKCkgPT4ge1xuICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscyh7fSk7XG4gICAgaWYgKGlzVGFiID09PSBcImRyYXdcIikge1xuICAgICAgaWYgKGNhbnZhc1JlZi5jdXJyZW50KSB7XG4gICAgICAgIGNhbnZhc1JlZi5jdXJyZW50LmNsZWFyKCk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3RhbXApIHtcbiAgICAgICAgc2V0SW1hZ2UoXCJcIik7XG4gICAgICB9XG4gICAgICBzZXRJc1NpZ25JbWcoXCJcIik7XG4gICAgfSBlbHNlIGlmIChpc1RhYiA9PT0gXCJ1cGxvYWRJbWFnZVwiKSB7XG4gICAgICBzZXRJbWFnZShcIlwiKTtcbiAgICB9XG4gICAgLy8gc2V0SXNJbml0aWFsKGZhbHNlKTtcbiAgfTtcbiAgLy9mdW5jdGlvbiBmb3Igc2V0IHNpZ25hdHVyZSB1cmxcbiAgY29uc3QgaGFuZGxlU2lnbmF0dXJlQ2hhbmdlID0gKGRhdGEpID0+IHtcbiAgICBzZXRTaWduYXR1cmUoZGF0YSk7XG4gICAgc2V0SXNTaWduSW1nKGRhdGEpO1xuICB9O1xuICAvL3NhdmUgYnV0dG9uIGNvbXBvbmVudFxuICBjb25zdCBTYXZlQnRuID0gKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICB7KGlzVGFiID09PSBcImRyYXdcIiB8fCBpc1RhYiA9PT0gXCJ1cGxvYWRJbWFnZVwiKSAmJiAoXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0IG1yLTEgbXQtWzJweF1cIlxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlQ2xlYXIoKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dChcImNsZWFyXCIpfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICApfVxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzKHt9KTtcbiAgICAgICAgICAgIGlmICghaW1hZ2UpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVGFiID09PSBcIm15c2lnbmF0dXJlXCIpIHtcbiAgICAgICAgICAgICAgICBzZXRJc1NpZ25JbWcoXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlzSW5pdGlhbCkge1xuICAgICAgICAgICAgICAgICAgb25TYXZlU2lnbihzaWduYXR1cmVUeXBlLCBcImluaXRpYWxzXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvblNhdmVTaWduKG51bGwsIFwiZGVmYXVsdFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzVGFiID09PSBcInR5cGVcIikge1xuICAgICAgICAgICAgICAgICAgc2V0SXNTaWduSW1nKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgb25TYXZlU2lnbihcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICFpc0luaXRpYWwgJiYgdGV4dFdpZHRoID4gMTUwID8gMTUwIDogdGV4dFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAhaXNJbml0aWFsICYmIHRleHRIZWlnaHQgPiAzNSA/IDM1IDogdGV4dEhlaWdodFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc2V0SXNTaWduSW1nKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgY2FudmFzUmVmLmN1cnJlbnQuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgIG9uU2F2ZVNpZ24oc2lnbmF0dXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2V0UGVuQ29sb3IoXCJibHVlXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2V0SXNTaWduSW1nKFwiXCIpO1xuICAgICAgICAgICAgICBvblNhdmVJbWFnZShzaWduYXR1cmVUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldElzU2lnblBhZChmYWxzZSk7XG4gICAgICAgICAgICBzZXRJc0luaXRpYWwoZmFsc2UpO1xuICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XG4gICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKGZhbHNlKTtcbiAgICAgICAgICAgIHNldEltYWdlKCk7XG4gICAgICAgICAgICBzZXRJc1RhYihcImRyYXdcIik7XG4gICAgICAgICAgICBzZXRTaWduVmFsdWUoXCJcIik7XG4gICAgICAgICAgICBzZXRJc1N0YW1wKGZhbHNlKTtcbiAgICAgICAgICB9fVxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICBpc1NpZ25JbWcgfHwgaW1hZ2UgfHwgaXNEZWZhdWx0U2lnbiB8fCB0ZXh0V2lkdGhcbiAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgIDogXCJwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgICB9IG9wLWJ0biBvcC1idG4tcHJpbWFyeSBzaGFkb3ctbGdgfVxuICAgICAgICAgIGRpc2FibGVkPXtcbiAgICAgICAgICAgIChpc1RhYiA9PT0gXCJkcmF3XCIgJiYgaXNTaWduSW1nKSB8fFxuICAgICAgICAgICAgKGlzVGFiID09PSBcImltYWdlXCIgJiYgaW1hZ2UpIHx8XG4gICAgICAgICAgICAoaXNUYWIgPT09IFwibXlzaWduYXR1cmVcIiAmJiBpc0RlZmF1bHRTaWduKSB8fFxuICAgICAgICAgICAgKGlzVGFiID09PSBcInR5cGVcIiAmJiB0ZXh0V2lkdGgpXG4gICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgOiBpbWFnZVxuICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICA6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgID5cbiAgICAgICAgICB7dChcInNhdmVcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfTtcbiAgLy91c2VFZmZlY3QgZm9yIHNldCBhbHJlYWR5IGRyYXcgb3Igc2F2ZSBzaWduYXR1cmUgdXJsL3RleHQgdXJsIG9mIHNpZ25hdHVyZSB0ZXh0IHR5cGUgYW5kIGRyYXcgdHlwZSBmb3IgaW5pdGlhbCB0eXBlIGFuZCBzaWduYXR1cmUgdHlwZSB3aWRnZXRzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGN1cnJXaWRnZXRzRGV0YWlscyAmJiBjYW52YXNSZWYuY3VycmVudCkge1xuICAgICAgY29uc3QgaXNXaWRnZXRUeXBlID0gY3VycldpZGdldHNEZXRhaWxzPy50eXBlO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlVHlwZSA9IGN1cnJXaWRnZXRzRGV0YWlscz8uc2lnbmF0dXJlVHlwZTtcbiAgICAgIGNvbnN0IHVybCA9IGN1cnJXaWRnZXRzRGV0YWlscz8uU2lnblVybDtcbiAgICAgIC8vY2hlY2tpbmcgd2lkZ2V0IHR5cGUgYW5kIGRyYXcgdHlwZSBzaWduYXR1cmUgdXJsXG4gICAgICBpZiAoaXNJbml0aWFsKSB7XG4gICAgICAgIGlmIChpc1dpZGdldFR5cGUgPT09IFwiaW5pdGlhbHNcIiAmJiBzaWduYXR1cmVUeXBlID09PSBcImRyYXdcIiAmJiB1cmwpIHtcbiAgICAgICAgICBjYW52YXNSZWYuY3VycmVudC5mcm9tRGF0YVVSTCh1cmwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpc1dpZGdldFR5cGUgPT09IFwic2lnbmF0dXJlXCIgJiZcbiAgICAgICAgc2lnbmF0dXJlVHlwZSA9PT0gXCJkcmF3XCIgJiZcbiAgICAgICAgdXJsXG4gICAgICApIHtcbiAgICAgICAgY2FudmFzUmVmLmN1cnJlbnQuZnJvbURhdGFVUkwodXJsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0cmltbWVkTmFtZSA9IGN1cnJlbnRVc2VyTmFtZSAmJiBjdXJyZW50VXNlck5hbWUudHJpbSgpO1xuICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gdHJpbW1lZE5hbWU/LmNoYXJBdCgwKTtcbiAgICBjb25zdCB1c2VyTmFtZSA9IGlzSW5pdGlhbCA/IGZpcnN0Q2hhcmFjdGVyIDogY3VycmVudFVzZXJOYW1lO1xuICAgIHNldFNpZ25WYWx1ZSh1c2VyTmFtZSk7XG4gICAgc2V0Rm9udFNlbGVjdChcIkZhc3RoYW5kXCIpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbaXNTaWduUGFkXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbG9hZEZvbnQgPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBkb2N1bWVudC5mb250cy5sb2FkKGAyMHB4ICR7Zm9udFNlbGVjdH1gKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0Rm9udFNUeWxlID0gZm9udE9wdGlvbnMuZmluZChcbiAgICAgICAgICAoZm9udCkgPT4gZm9udC52YWx1ZSA9PT0gZm9udFNlbGVjdFxuICAgICAgICApO1xuICAgICAgICBzZXRGb250U2VsZWN0KHNlbGVjdEZvbnRTVHlsZT8udmFsdWUgfHwgZm9udE9wdGlvbnNbMF0udmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGxvYWRpbmcgZm9udDpcIiwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsb2FkRm9udCgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2ZvbnRTZWxlY3RdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIExvYWQgdGhlIGRlZmF1bHQgc2lnbmF0dXJlIGFmdGVyIHRoZSBjb21wb25lbnQgbW91bnRzXG4gICAgaWYgKGNhbnZhc1JlZi5jdXJyZW50KSB7XG4gICAgICBjYW52YXNSZWYuY3VycmVudC5mcm9tRGF0YVVSTChpc1NpZ25JbWcpO1xuICAgIH1cbiAgICBpZiAoaXNUYWIgPT09IFwidHlwZVwiKSB7XG4gICAgICBjb25zdCB0cmltbWVkTmFtZSA9IHNpZ25WYWx1ZSA/IHNpZ25WYWx1ZS50cmltKCkgOiBjdXJyZW50VXNlck5hbWUudHJpbSgpO1xuICAgICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSB0cmltbWVkTmFtZS5jaGFyQXQoMCk7XG4gICAgICBjb25zdCB1c2VyTmFtZSA9IGlzSW5pdGlhbCA/IGZpcnN0Q2hhcmFjdGVyIDogc2lnblZhbHVlO1xuICAgICAgc2V0U2lnblZhbHVlKHVzZXJOYW1lKTtcbiAgICAgIGNvbnZlcnRUb0ltZyhmb250U2VsZWN0LCB1c2VyTmFtZSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2lzVGFiXSk7XG4gIC8vZnVuY3Rpb24gZm9yIGNvbnZlcnQgaW5wdXQgdGV4dCB2YWx1ZSBpbiBpbWFnZVxuICBjb25zdCBjb252ZXJ0VG9JbWcgPSBhc3luYyAoZm9udFN0eWxlLCB0ZXh0LCBjb2xvcikgPT4ge1xuICAgIC8vZ2V0IHRleHQgY29udGVudCB0byBjb252ZXJ0IGluIGltYWdlXG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIGNvbnN0IGZvbnRmYW1pbHkgPSBmb250U3R5bGVcbiAgICAgID8gZm9udFN0eWxlXG4gICAgICA6IGZvbnRTZWxlY3RcbiAgICAgICAgPyBmb250U2VsZWN0XG4gICAgICAgIDogXCJGYXN0aGFuZFwiO1xuICAgIGNvbnN0IGZvbnRTaXplVmFsdWUgPSBcIjQwcHhcIjtcbiAgICAvL2NyZWF0aW5nIHNwYW4gZm9yIGdldHRpbmcgdGV4dCBjb250ZW50IHdpZHRoXG4gICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIHNwYW4udGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcbiAgICBzcGFuLnN0eWxlLmZvbnQgPSBgJHtmb250U2l6ZVZhbHVlfSAke2ZvbnRmYW1pbHl9YDsgLy8gaGVyZSBwdXQgeW91ciB0ZXh0IHNpemUgYW5kIGZvbnQgZmFtaWx5XG4gICAgc3Bhbi5zdHlsZS5jb2xvciA9IGNvbG9yID8gY29sb3IgOiBwZW5Db2xvcjtcbiAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImhpZGRlblwiO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7IC8vIFJlcGxhY2UgJ2NvbnRhaW5lcicgd2l0aCB0aGUgSUQgb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50XG5cbiAgICAvL2NyZWF0ZSBjYW52YXMgdG8gcmVuZGVyIHRleHQgaW4gY2FudmFzIGFuZCBjb252ZXJ0IGluIGltYWdlXG4gICAgY29uc3QgY2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgLy8gRHJhdyB0aGUgdGV4dCBjb250ZW50IG9uIHRoZSBjYW52YXNcbiAgICBjb25zdCBjdHggPSBjYW52YXNFbGVtZW50LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb25zdCBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgICBjb25zdCBhZGRFeHRyYVdpZHRoID0gaXNJbml0aWFsID8gMTAgOiA1MDtcbiAgICBjb25zdCB3aWR0aCA9IHNwYW4ub2Zmc2V0V2lkdGggKyBhZGRFeHRyYVdpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHNwYW4ub2Zmc2V0SGVpZ2h0O1xuICAgIHNldFRleHRXaWR0aCh3aWR0aCk7XG4gICAgc2V0VGV4dEhlaWdodChoZWlnaHQpO1xuICAgIGNvbnN0IGZvbnQgPSBzcGFuLnN0eWxlW1wiZm9udFwiXTtcbiAgICAvLyBTZXQgdGhlIGNhbnZhcyBkaW1lbnNpb25zIHRvIG1hdGNoIHRoZSBzcGFuXG4gICAgY2FudmFzRWxlbWVudC53aWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcbiAgICBjYW52YXNFbGVtZW50LmhlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XG5cbiAgICAvLyBZb3UgY2FuIGN1c3RvbWl6ZSB0ZXh0IHN0eWxlcyBpZiBuZWVkZWRcbiAgICBjdHguZm9udCA9IGZvbnQ7XG4gICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yID8gY29sb3IgOiBwZW5Db2xvcjsgLy8gU2V0IHRoZSB0ZXh0IGNvbG9yXG4gICAgY3R4LnRleHRBbGlnbiA9IFwiY2VudGVyXCI7XG4gICAgY3R4LnRleHRCYXNlbGluZSA9IFwibWlkZGxlXCI7XG4gICAgY3R4LnNjYWxlKHBpeGVsUmF0aW8sIHBpeGVsUmF0aW8pO1xuICAgIC8vIERyYXcgdGhlIGNvbnRlbnQgb2YgdGhlIHNwYW4gb250byB0aGUgY2FudmFzXG4gICAgY3R4LmZpbGxUZXh0KHNwYW4udGV4dENvbnRlbnQsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7IC8vIEFkanVzdCB0aGUgeCx5LWNvb3JkaW5hdGUgYXMgbmVlZGVkXG4gICAgLy9yZW1vdmUgc3BhbiB0YWdcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgIC8vIENvbnZlcnQgdGhlIGNhbnZhcyB0byBpbWFnZSBkYXRhXG4gICAgY29uc3QgZGF0YVVybCA9IGNhbnZhc0VsZW1lbnQudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpO1xuICAgIHNldFNpZ25hdHVyZShkYXRhVXJsKTtcbiAgfTtcblxuICBjb25zdCBQZW5Db2xvckNvbXBvbmVudCA9IChwcm9wcykgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgaXRlbXMtc3RhcnRcIj5cbiAgICAgICAge2FsbENvbG9yLm1hcCgoZGF0YSwga2V5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiBcIjVweFwiLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBkYXRhLFxuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTpcbiAgICAgICAgICAgICAgICAgIGtleSA9PT0gMCAmJiBwZW5Db2xvciA9PT0gXCJibHVlXCJcbiAgICAgICAgICAgICAgICAgICAgPyBcIjJweCBzb2xpZCBibHVlXCJcbiAgICAgICAgICAgICAgICAgICAgOiBrZXkgPT09IDEgJiYgcGVuQ29sb3IgPT09IFwicmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiMnB4IHNvbGlkIHJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBrZXkgPT09IDIgJiYgcGVuQ29sb3IgPT09IFwiYmxhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIjJweCBzb2xpZCBibGFja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiMnB4IHNvbGlkIHdoaXRlXCJcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIHByb3BzPy5jb252ZXJ0VG9JbWcgJiZcbiAgICAgICAgICAgICAgICAgIHByb3BzPy5jb252ZXJ0VG9JbWcoZm9udFNlbGVjdCwgc2lnblZhbHVlLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBzZXRQZW5Db2xvcihcImJsdWVcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgIHNldFBlbkNvbG9yKFwicmVkXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICBzZXRQZW5Db2xvcihcImJsYWNrXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXBlbi1uaWJcIlxuICAgICAgICAgICAgICB3aWR0aD17MjB9XG4gICAgICAgICAgICAgIGhlaWdodD17MjB9XG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICk7XG4gICAgICAgIH0pfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2PlxuICAgICAge2lzU2lnblBhZCAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbW9kYWwgb3AtbW9kYWwtb3BlblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbW9kYWwtYm94IHB4LVsxM3B4XSBwdC0yIHBiLTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gdGV4dC1iYXNlLWNvbnRlbnQgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMS4ycmVtXVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtWzNweF1cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gZ2FwLVs1cHhdIG1kOmdhcC1bOHB4XSB0ZXh0LVsxMXB4XSBtZDp0ZXh0LWJhc2VcIj5cbiAgICAgICAgICAgICAgICAgICAge2lzU3RhbXAgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1iYXNlLWNvbnRlbnQgZm9udC1ib2xkIHRleHQtbGdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt3aWRnZXRUeXBlID09PSBcImltYWdlXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJXaWRnZXRzRGV0YWlscz8udHlwZSA9PT0gXCJpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gdChcInVwbG9hZC1pbWFnZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHQoXCJ1cGxvYWQtc3RhbXAtaW1hZ2VcIil9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1RhYihcImRyYXdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2lnbkltZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmUoaXNTaWduSW1nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhYiA9PT0gXCJkcmF3XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIm9wLWxpbmstcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJuby11bmRlcmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayB1bmRlcmxpbmUtb2Zmc2V0LTggbWwtWzJweF1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJkcmF3XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEZWZhdWx0U2lnbihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNUYWIoXCJ1cGxvYWRJbWFnZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZVR5cGUoXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWIgPT09IFwidXBsb2FkSW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwib3AtbGluay1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIm5vLXVuZGVybGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBvcC1saW5rIHVuZGVybGluZS1vZmZzZXQtOCBtbC1bMnB4XWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInVwbG9hZC1pbWFnZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1RhYihcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmVUeXBlKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhYiA9PT0gXCJ0eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIm9wLWxpbmstcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJuby11bmRlcmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayB1bmRlcmxpbmUtb2Zmc2V0LTggbWwtWzJweF1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJ0eXBlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHshaXNJbml0aWFsICYmIGRlZmF1bHRTaWduID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24odHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW1hZ2VTZWxlY3QodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwibXlzaWduYXR1cmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZVR5cGUoXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEltYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWIgPT09IFwibXlzaWduYXR1cmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJuby11bmRlcmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBvcC1saW5rIHVuZGVybGluZS1vZmZzZXQtOCBtbC1bMnB4XWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJteS1zaWduYXR1cmVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBteUluaXRpYWwgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEZWZhdWx0U2lnbih0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwibXlzaWduYXR1cmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlVHlwZShcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFiID09PSBcIm15c2lnbmF0dXJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIm5vLXVuZGVybGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayB1bmRlcmxpbmUtb2Zmc2V0LTggbWwtWzJweF1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcIm15LWluaXRpYWxzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMS41cmVtXSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc2V0UGVuQ29sb3IoXCJibHVlXCIpO1xuICAgICAgICAgICAgICAgICAgc2V0SXNTaWduUGFkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIHNldElzSW5pdGlhbChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgc2V0SW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwiZHJhd1wiKTtcbiAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZVR5cGUoXCJkcmF3XCIpO1xuICAgICAgICAgICAgICAgICAgc2V0U2lnblZhbHVlKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICZ0aW1lcztcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC1bMjBweF0gaC1mdWxsXCI+XG4gICAgICAgICAgICAgIHtpc0RlZmF1bHRTaWduID8gKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwiMS4zcHggc29saWQgIzAwN2JmZlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tOiA2LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbCA/IFwiaW50aWFsU2lnbmF0dXJlQ2FudmFzXCIgOiBcInNpZ25hdHVyZUNhbnZhc1wiXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwic3RhbXAgaW1nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgb2JqZWN0LWNvbnRhaW4gYmctd2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3JjPXtpc0luaXRpYWwgPyBteUluaXRpYWwgOiBkZWZhdWx0U2lnbn1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxTYXZlQnRuIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgKSA6IGlzSW1hZ2VTZWxlY3QgfHwgaXNTdGFtcCA/IChcbiAgICAgICAgICAgICAgICAhaW1hZ2UgPyAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwiMS4zcHggc29saWQgIzAwN2JmZlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tOiA2LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbCA/IFwiaW50aWFsU2lnbmF0dXJlQ2FudmFzXCIgOiBcInNpZ25hdHVyZUNhbnZhc1wiXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGltYWdlUmVmLmN1cnJlbnQuY2xpY2soKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uSW1hZ2VDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmaWxldHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCJpbWFnZS9wbmcsaW1hZ2UvanBlZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9e2ltYWdlUmVmfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1jbG91ZC11cGxvYWQtYWx0IHVwbG9hZEltZ0xvZ29cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMHB4XVwiPnt0KFwidXBsb2FkXCIpfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwiMS4zcHggc29saWQgIzAwN2JmZlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMnB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiaW50aWFsU2lnbmF0dXJlQ2FudmFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwic2lnbmF0dXJlQ2FudmFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInByaW50IGltZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj17aW1hZ2VSZWZ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz17aW1hZ2Uuc3JjfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIiBvYmplY3QtY29udGFpbiBoLWZ1bGwgdy1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2F2ZUJ0biAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSA6IGlzVGFiID09PSBcInR5cGVcIiA/IChcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXItWzVweF0gdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICB7aXNJbml0aWFsID8gdChcImluaXRpYWwtdGViXCIpIDogdChcInNpZ25hdHVyZS10YWJcIil9OlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aD17aXNJbml0aWFsID8gMyA6IDMwfVxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGZvbnRGYW1pbHk6IGZvbnRTZWxlY3QsIGNvbG9yOiBwZW5Db2xvciB9fVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtbC0xIG9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkIG9wLWlucHV0LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBob3Zlcjpib3JkZXItYmFzZS1jb250ZW50IHctZnVsbCB0ZXh0LVsyMHB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJZb3VyIHNpZ25hdHVyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NpZ25WYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25WYWx1ZShlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9JbWcoZm9udFNlbGVjdCwgZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9yZGVyLVsxcHhdIGJvcmRlci1bI2Q2ZDNkM10gbXQtWzEwcHhdIG1sLVs1cHhdXCI+XG4gICAgICAgICAgICAgICAgICAgIHtmb250T3B0aW9ucy5tYXAoKGZvbnQsIGluZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aW5kfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogZm9udC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2VsZWN0ID09PSBmb250LnZhbHVlICYmIFwicmdiKDIwNiAyMjUgMjQ3KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb250U2VsZWN0KGZvbnQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb0ltZyhmb250LnZhbHVlLCBzaWduVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiNXB4IDEwcHggNXB4IDEwcHhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBcIjIwcHhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBwZW5Db2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2lnblZhbHVlID8gc2lnblZhbHVlIDogXCJZb3VyIHNpZ25hdHVyZVwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtWzEwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgIDxQZW5Db2xvckNvbXBvbmVudCBjb252ZXJ0VG9JbWc9e2NvbnZlcnRUb0ltZ30gLz5cbiAgICAgICAgICAgICAgICAgICAgPFNhdmVCdG4gLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPFNpZ25hdHVyZUNhbnZhc1xuICAgICAgICAgICAgICAgICAgICAgIHJlZj17Y2FudmFzUmVmfVxuICAgICAgICAgICAgICAgICAgICAgIHBlbkNvbG9yPXtwZW5Db2xvcn1cbiAgICAgICAgICAgICAgICAgICAgICBjYW52YXNQcm9wcz17e1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBpc0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImludGlhbFNpZ25hdHVyZUNhbnZhc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJzaWduYXR1cmVDYW52YXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogXCIxLjZweCBzb2xpZCAjMDA3YmZmXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCIycHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yPVwicmdiKDI1NSwgMjU1LCAyNTUpXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkVuZD17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25hdHVyZUNoYW5nZShjYW52YXNSZWYuY3VycmVudD8udG9EYXRhVVJMKCkpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGRvdFNpemU9ezF9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtWzEwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgIDxQZW5Db2xvckNvbXBvbmVudCAvPlxuICAgICAgICAgICAgICAgICAgICA8U2F2ZUJ0biAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBTaWduUGFkO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyBkYXJrZW5Db2xvciwgZ2V0Rmlyc3RMZXR0ZXIgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcclxuXHJcbmZ1bmN0aW9uIFNpZ25lckxpc3RDb21wb25lbnQocHJvcHMpIHtcclxuICBjb25zdCBjaGVja1NpZ25lckJhY2tDb2xvciA9IChvYmopID0+IHtcclxuICAgIGlmIChvYmopIHtcclxuICAgICAgbGV0IGRhdGEgPSBcIlwiO1xyXG4gICAgICBpZiAob2JqPy5JZCkge1xyXG4gICAgICAgIGRhdGEgPSBwcm9wcy5zaWduZXJQb3MuZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSBvYmouSWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRhdGEgPSBwcm9wcy5zaWduZXJQb3MuZmlsdGVyKFxyXG4gICAgICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IG9iai5vYmplY3RJZFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwICYmIGRhdGFbMF0uYmxvY2tDb2xvcjtcclxuICAgIH1cclxuICB9O1xyXG4gIGNvbnN0IGNoZWNrVXNlck5hbWVDb2xvciA9IChvYmopID0+IHtcclxuICAgIGNvbnN0IGdldEJhY2tDb2xvciA9IGNoZWNrU2lnbmVyQmFja0NvbG9yKG9iaik7XHJcbiAgICBpZiAoZ2V0QmFja0NvbG9yKSB7XHJcbiAgICAgIGNvbnN0IGNvbG9yID0gZGFya2VuQ29sb3IoZ2V0QmFja0NvbG9yLCAwLjQpO1xyXG4gICAgICByZXR1cm4gY29sb3I7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCIjYWJkMWQwXCI7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXZcclxuICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC14bCBteC0xIGZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIHB5LVsxMHB4XSBtdC0xXCJcclxuICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZDogY2hlY2tTaWduZXJCYWNrQ29sb3IocHJvcHMub2JqKSB9fVxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZDogY2hlY2tVc2VyTmFtZUNvbG9yKHByb3BzLm9iaikgfX1cclxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IHctWzMwcHhdIGgtWzMwcHhdIHJvdW5kZWQtZnVsbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgbXgtMVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxMnB4XSB0ZXh0LWNlbnRlciBmb250LWJvbGQgdGV4dC1ibGFjayB1cHBlcmNhc2VcIj5cclxuICAgICAgICAgIHtnZXRGaXJzdExldHRlcihcclxuICAgICAgICAgICAgcHJvcHMub2JqPy5OYW1lIHx8IHByb3BzLm9iaj8uZW1haWwgfHwgcHJvcHMub2JqPy5Sb2xlXHJcbiAgICAgICAgICApfVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzEycHhdIGZvbnQtYm9sZCB0ZXh0LVsjNDI0MjQyXSB3LVsxMDBweF0gd2hpdGVzcGFjZS1ub3dyYXAgb3ZlcmZsb3ctaGlkZGVuIHRleHQtZWxsaXBzaXNcIj5cclxuICAgICAgICAgIHtwcm9wcy5vYmo/Lk5hbWUgfHwgcHJvcHM/Lm9iaj8uUm9sZX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTBweF0gZm9udC1tZWRpdW0gdGV4dC1bIzQyNDI0Ml0gdy1bMTAwcHhdIHdoaXRlc3BhY2Utbm93cmFwIG92ZXJmbG93LWhpZGRlbiB0ZXh0LWVsbGlwc2lzXCI+XHJcbiAgICAgICAgICB7cHJvcHMub2JqPy5FbWFpbCB8fCBwcm9wcy5vYmo/LmVtYWlsfVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaWduZXJMaXN0Q29tcG9uZW50O1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTG9hZGVyIGZyb20gXCIuLi8uLi9wcmltaXRpdmVzL0xvYWRlclwiO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xuXG5mdW5jdGlvbiBWZXJpZnlFbWFpbChwcm9wcykge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG4gIHJldHVybiAoXG4gICAgPGRpYWxvZyBjbGFzc05hbWU9XCJvcC1tb2RhbCBvcC1tb2RhbC1vcGVuIGFic29sdXRlIHotWzE5OTldXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1kOnctWzQwJV0gdy1bODAlXSBvcC1tb2RhbC1ib3ggcC0wIG92ZXJmbG93LXktYXV0byBoaWRlLXNjcm9sbGJhciB0ZXh0LXNtXCI+XG4gICAgICAgIDxoMyBjbGFzc05hbWU9XCJmb250LWJvbGQgdGV4dC1sZyBwdC1bMTVweF0gcHgtWzIwcHhdIHRleHQtYmFzZS1jb250ZW50XCI+XG4gICAgICAgICAge3QoXCJvdHAtdmVyaWZpY2F0aW9uXCIpfVxuICAgICAgICA8L2gzPlxuICAgICAgICB7cHJvcHMuaXNWZXJpZnlNb2RhbCA/IChcbiAgICAgICAgICA8Zm9ybVxuICAgICAgICAgICAgb25TdWJtaXQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgIHByb3BzLnNldElzVmVyaWZ5TW9kYWwoZmFsc2UpO1xuICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVWZXJpZnlFbWFpbChlKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC02IHB5LTMgdGV4dC1iYXNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cIm1iLTJcIj57dChcImVudGVyLW90cFwiKX08L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBvbkludmFsaWQ9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0Q3VzdG9tVmFsaWRpdHkodChcImlucHV0LXJlcXVpcmVkXCIpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvbklucHV0PXsoZSkgPT4gZS50YXJnZXQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIil9XG4gICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGVsXCJcbiAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV17NH1cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBvcC1pbnB1dCBvcC1pbnB1dC1ib3JkZXJlZCBvcC1pbnB1dC1zbSBmb2N1czpvdXRsaW5lLW5vbmUgaG92ZXI6Ym9yZGVyLWJhc2UtY29udGVudCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dChcIm90cC1wbGFjZWhvbGRlclwiKX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17cHJvcHMub3RwfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gcHJvcHMuc2V0T3RwKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC02IG15LTNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAge3QoXCJ2ZXJpZnlcIil9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnkgbWwtMlwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHByb3BzLmhhbmRsZVJlc2VuZChlKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt0KFwicmVzZW5kXCIpfVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgKSA6IHByb3BzLm90cExvYWRlciA/IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtWzE1MHB4XSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgPExvYWRlciAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtNiBweS0zIHRleHQtYmFzZS1jb250ZW50XCI+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtYi0yIHRleHQtc21cIj57dChcInZlcmlmeS1lbWFpbFwiKX08L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTAgbXQtM1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5oYW5kbGVWZXJpZnlCdG4oKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt0KFwic2VuZC1vdHBcIil9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2RpYWxvZz5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVyaWZ5RW1haWw7XG4iLCJpbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFBERkRvY3VtZW50LCByZ2IsIGRlZ3JlZXMgfSBmcm9tIFwicGRmLWxpYlwiO1xuaW1wb3J0IFBhcnNlIGZyb20gXCJwYXJzZVwiO1xuaW1wb3J0IHsgYXBwSW5mbyB9IGZyb20gXCIuL2FwcGluZm9cIjtcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gXCJmaWxlLXNhdmVyXCI7XG5pbXBvcnQgcHJpbnRNb2R1bGUgZnJvbSBcInByaW50LWpzXCI7XG5pbXBvcnQgeyB2YWxpZHBsYW4gfSBmcm9tIFwiLi4vanNvbi9wbGFuc0FyclwiO1xuaW1wb3J0IGZvbnRraXQgZnJvbSBcIkBwZGYtbGliL2ZvbnRraXRcIjtcblxuZXhwb3J0IGNvbnN0IGZvbnRzaXplQXJyID0gWzIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4XTtcbmV4cG9ydCBjb25zdCBmb250Q29sb3JBcnIgPSBbXCJyZWRcIiwgXCJibGFja1wiLCBcImJsdWVcIiwgXCJ5ZWxsb3dcIl07XG5leHBvcnQgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDc2NztcbmV4cG9ydCBjb25zdCBpc1RhYkFuZE1vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgMTAyMztcbmV4cG9ydCBjb25zdCB0ZXh0SW5wdXRXaWRnZXQgPSBcInRleHQgaW5wdXRcIjtcbmV4cG9ydCBjb25zdCB0ZXh0V2lkZ2V0ID0gXCJ0ZXh0XCI7XG5leHBvcnQgY29uc3QgcmFkaW9CdXR0b25XaWRnZXQgPSBcInJhZGlvIGJ1dHRvblwiO1xuZXhwb3J0IGNvbnN0IGZpbGVhc2J5dGVzID0gYXN5bmMgKGZpbGVwYXRoKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmlsZXBhdGgpOyAvLyBBZGp1c3QgdGhlIHBhdGggYWNjb3JkaW5nbHlcbiAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xufTtcblxuZXhwb3J0IGNvbnN0IG9wZW5Jbk5ld1RhYiA9ICh1cmwsIHRhcmdldCkgPT4ge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgd2luZG93Lm9wZW4odXJsLCB0YXJnZXQsIFwibm9vcGVuZXIsbm9yZWZlcnJlclwiKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cub3Blbih1cmwsIFwiX2JsYW5rXCIsIFwibm9vcGVuZXIsbm9yZWZlcnJlclwiKTtcbiAgfVxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoU3Vic2NyaXB0aW9uKFxuICBleHRVc2VySWQsXG4gIGNvbnRhY3RPYmpJZCxcbiAgaXNHdWVzdFNpZ24gPSBmYWxzZVxuKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgRXh0YW5kX0NsYXNzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJFeHRhbmRfQ2xhc3NcIik7XG4gICAgY29uc3QgZXh0Q2xhc3MgPSBFeHRhbmRfQ2xhc3MgJiYgSlNPTi5wYXJzZShFeHRhbmRfQ2xhc3MpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiZXh0Q2xhc3MgXCIsIGV4dENsYXNzKTtcbiAgICBsZXQgZXh0VXNlcjtcbiAgICBpZiAoZXh0Q2xhc3MgJiYgZXh0Q2xhc3MubGVuZ3RoID4gMCkge1xuICAgICAgZXh0VXNlciA9IGV4dENsYXNzWzBdLm9iamVjdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHRVc2VyID0gZXh0VXNlcklkO1xuICAgIH1cbiAgICBjb25zdCBiYXNlVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpO1xuICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVUkx9ZnVuY3Rpb25zL2dldHN1YnNjcmlwdGlvbnNgO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICBzZXNzaW9uVG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICB9O1xuICAgIGNvbnN0IHBhcmFtcyA9IGlzR3Vlc3RTaWduXG4gICAgICA/IHsgY29udGFjdElkOiBjb250YWN0T2JqSWQgfVxuICAgICAgOiB7IGV4dFVzZXJJZDogZXh0VXNlciB9O1xuICAgIGNvbnN0IHRlbmF0UmVzID0gYXdhaXQgYXhpb3MucG9zdCh1cmwsIHBhcmFtcywgeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xuICAgIGxldCBwbGFuLCBzdGF0dXMsIGJpbGxpbmdEYXRlO1xuICAgIGlmIChpc0d1ZXN0U2lnbikge1xuICAgICAgcGxhbiA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5wbGFuO1xuICAgICAgc3RhdHVzID0gdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/LmlzU3Vic2NyaWJlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcGxhbiA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5QbGFuQ29kZTtcbiAgICAgIGJpbGxpbmdEYXRlID0gdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/Lk5leHRfYmlsbGluZ19kYXRlPy5pc287XG4gICAgICBjb25zdCBhbGxvd2VkVXNlcnMgPSB0ZW5hdFJlcy5kYXRhPy5yZXN1bHQ/LnJlc3VsdD8uQWxsb3dlZFVzZXJzIHx8IDA7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImFsbG93ZWRVc2Vyc1wiLCBhbGxvd2VkVXNlcnMpO1xuICAgIH1cbiAgICByZXR1cm4geyBwbGFuLCBiaWxsaW5nRGF0ZSwgc3RhdHVzIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGZldGNoIHN1YnNjcmlwdGlvblwiLCBlcnIpO1xuICAgIHJldHVybiB7IHBsYW46IFwiXCIsIGJpbGxpbmdEYXRlOiBcIlwiIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoU3Vic2NyaXB0aW9uSW5mbygpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBFeHRhbmRfQ2xhc3MgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkV4dGFuZF9DbGFzc1wiKTtcbiAgICBjb25zdCBleHRDbGFzcyA9IEV4dGFuZF9DbGFzcyAmJiBKU09OLnBhcnNlKEV4dGFuZF9DbGFzcyk7XG4gICAgLy8gY29uc29sZS5sb2coXCJleHRDbGFzcyBcIiwgZXh0Q2xhc3MpO1xuICAgIGlmIChleHRDbGFzcyAmJiBleHRDbGFzcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleHRVc2VyID0gZXh0Q2xhc3NbMF0ub2JqZWN0SWQ7XG4gICAgICBjb25zdCBiYXNlVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpO1xuICAgICAgY29uc3QgdXJsID0gYCR7YmFzZVVSTH1mdW5jdGlvbnMvZ2V0c3Vic2NyaXB0aW9uc2A7XG4gICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgICB9O1xuICAgICAgY29uc3QgcGFyYW1zID0geyBleHRVc2VySWQ6IGV4dFVzZXIgfTtcbiAgICAgIGNvbnN0IHRlbmF0UmVzID0gYXdhaXQgYXhpb3MucG9zdCh1cmwsIHBhcmFtcywgeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xuXG4gICAgICBjb25zdCBwcmljZSA9XG4gICAgICAgIHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5TdWJzY3JpcHRpb25EZXRhaWxzPy5kYXRhPy5zdWJzY3JpcHRpb25cbiAgICAgICAgICA/LnBsYW4/LnByaWNlO1xuICAgICAgY29uc3QgdG90YWxQcmljZSA9XG4gICAgICAgIHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5TdWJzY3JpcHRpb25EZXRhaWxzPy5kYXRhPy5zdWJzY3JpcHRpb25cbiAgICAgICAgICA/LmFtb3VudDtcbiAgICAgIGNvbnN0IHBsYW5JZCA9XG4gICAgICAgIHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5TdWJzY3JpcHRpb25EZXRhaWxzPy5kYXRhPy5zdWJzY3JpcHRpb25cbiAgICAgICAgICA/LnN1YnNjcmlwdGlvbl9pZDtcbiAgICAgIGNvbnN0IHBsYW5fY29kZSA9XG4gICAgICAgIHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5TdWJzY3JpcHRpb25EZXRhaWxzPy5kYXRhPy5zdWJzY3JpcHRpb25cbiAgICAgICAgICA/LnBsYW4/LnBsYW5fY29kZTtcbiAgICAgIGNvbnN0IHRvdGFsQWxsb3dlZFVzZXIgPSB0ZW5hdFJlcy5kYXRhPy5yZXN1bHQ/LnJlc3VsdD8uQWxsb3dlZFVzZXJzIHx8IDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICBwcmljZTogcHJpY2UsXG4gICAgICAgIHRvdGFsUHJpY2U6IHRvdGFsUHJpY2UsXG4gICAgICAgIHBsYW5JZDogcGxhbklkLFxuICAgICAgICBwbGFuX2NvZGU6IHBsYW5fY29kZSxcbiAgICAgICAgdG90YWxBbGxvd2VkVXNlcjogdG90YWxBbGxvd2VkVXNlclxuICAgICAgfTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGZldGNoIHN1YnNjcmlwdGlvblwiLCBlcnIpO1xuICAgIHJldHVybiB7IHN0YXR1czogXCJlcnJvclwiLCBlcnJvcjogZXJyIH07XG4gIH1cbn1cbi8vZnVuY3Rpb24gdG8gZ2V0IHN1YmNyaXBpdGlvbiBkZXRhaWxzIGZyb20gc3Vic2NyaXB0aW9uIGNsYXNzXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tJc1N1YnNjcmliZWQoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hTdWJzY3JpcHRpb24oKTtcbiAgICBpZiAocmVzLnBsYW4gPT09IFwiZnJlZXBsYW5cIikge1xuICAgICAgcmV0dXJuIHsgcGxhbjogcmVzLnBsYW4sIGlzVmFsaWQ6IGZhbHNlIH07XG4gICAgfSBlbHNlIGlmIChyZXMuYmlsbGluZ0RhdGUpIHtcbiAgICAgIGNvbnN0IHBsYW4gPSB2YWxpZHBsYW5bcmVzLnBsYW5dIHx8IGZhbHNlO1xuICAgICAgaWYgKHBsYW4gJiYgbmV3IERhdGUocmVzLmJpbGxpbmdEYXRlKSA+IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHsgcGxhbjogcmVzLnBsYW4sIGlzVmFsaWQ6IHRydWUgfTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IERhdGUocmVzLmJpbGxpbmdEYXRlKSA+IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHsgcGxhbjogcmVzLnBsYW4sIGlzVmFsaWQ6IHRydWUgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IHBsYW46IHJlcy5wbGFuLCBpc1ZhbGlkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geyBwbGFuOiByZXMucGxhbiwgaXNWYWxpZDogZmFsc2UgfTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGZldGNoIHN1YnNjcmlwdGlvblwiLCBlcnIpO1xuICAgIHJldHVybiB7IHBsYW46IFwibm8tcGxhblwiLCBpc1ZhbGlkOiBmYWxzZSB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjb2xvciA9IFtcbiAgXCIjOTNhM2RiXCIsXG4gIFwiI2U2YzNkYlwiLFxuICBcIiNjMGUzYmNcIixcbiAgXCIjYmNlM2RiXCIsXG4gIFwiI2I4Y2NkYlwiLFxuICBcIiNjZWI4ZGJcIixcbiAgXCIjZmZjY2ZmXCIsXG4gIFwiIzk5ZmZjY1wiLFxuICBcIiNjYzk5ZmZcIixcbiAgXCIjZmZjYzk5XCIsXG4gIFwiIzY2Y2NmZlwiLFxuICBcIiNmZmZmY2NcIlxuXTtcblxuZXhwb3J0IGNvbnN0IG5hbWVDb2xvciA9IFtcbiAgXCIjMzA0ZmJmXCIsXG4gIFwiIzdkNTI3MFwiLFxuICBcIiM1ZjgyNWJcIixcbiAgXCIjNTc4MDc3XCIsXG4gIFwiIzU3NmU4MFwiLFxuICBcIiM2ZDUyN2RcIixcbiAgXCIjY2MwMGNjXCIsXG4gIFwiIzAwNjY2NlwiLFxuICBcIiNjYzAwZmZcIixcbiAgXCIjZmY5OTAwXCIsXG4gIFwiIzMzNjY5OVwiLFxuICBcIiNjYzk5MDBcIlxuXTtcbmV4cG9ydCBjb25zdCB0b0RhdGFVcmwgPSAoZmlsZSkgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoZSkgPT4ge1xuICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuICAgIH07XG4gIH0pO1xufTtcblxuLy9mdW5jdGlvbiBmb3IgZ2V0dGluZyBkb2N1bWVudCBkZXRhaWxzIGZvciBnZXREcml2ZSBjbG91ZCBmdW5jdGlvblxuZXhwb3J0IGNvbnN0IGdldERyaXZlID0gYXN5bmMgKGRvY3VtZW50SWQsIHNraXAgPSAwLCBsaW1pdCA9IDEwMCkgPT4ge1xuICBjb25zdCBkYXRhID0ge1xuICAgIGRvY0lkOiBkb2N1bWVudElkICYmIGRvY3VtZW50SWQsXG4gICAgbGltaXQ6IGxpbWl0LFxuICAgIHNraXA6IHNraXBcbiAgfTtcbiAgY29uc3QgZHJpdmVEZWF0aWxzID0gYXdhaXQgYXhpb3NcbiAgICAucG9zdChgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2dldERyaXZlYCwgZGF0YSwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgc2Vzc2lvbnRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbigoTGlzdGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGpzb24gPSBMaXN0ZGF0YS5kYXRhO1xuXG4gICAgICBpZiAoanNvbiAmJiBqc29uLnJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgIH0gZWxzZSBpZiAoanNvbiAmJiBqc29uLnJlc3VsdCkge1xuICAgICAgICBjb25zdCBkYXRhID0ganNvbi5yZXN1bHQ7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGdldERyaXZlIGNsb3VkIGZ1bmN0aW9uXCIsIGVycik7XG4gICAgICByZXR1cm4gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCI7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGRyaXZlRGVhdGlscztcbn07XG5cbi8vIGBwZGZOZXdXaWR0aEZ1bmAgZnVuY3Rpb24gaXMgdXNlZCB0byBjYWxjdWxhdGUgcGRmIHdpZHRoIHRvIHJlbmRlciBpbiBtaWRkbGUgY29udGFpbmVyXG5leHBvcnQgY29uc3QgcGRmTmV3V2lkdGhGdW4gPSAoZGl2UmVmKSA9PiB7XG4gIGNvbnN0IHBkZldpZHRoID0gZGl2UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGg7XG4gIHJldHVybiBwZGZXaWR0aDtcbn07XG5cbi8vYGNvbnRyYWN0VXNlcnNgIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IGNvbnRyYWN0X1VzZXIgZGV0YWlsc1xuZXhwb3J0IGNvbnN0IGNvbnRyYWN0VXNlcnMgPSBhc3luYyAoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlckRldGFpbHMgPSBhd2FpdCBQYXJzZS5DbG91ZC5ydW4oXCJnZXRVc2VyRGV0YWlsc1wiKTtcbiAgICBsZXQgZGF0YSA9IFtdO1xuICAgIGlmICh1c2VyRGV0YWlscykge1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodXNlckRldGFpbHMpKTtcbiAgICAgIGRhdGEucHVzaChqc29uKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGdldFVzZXJEZXRhaWxzIGNsb3VkIGZ1bmN0aW9uXCIsIGVycik7XG4gICAgcmV0dXJuIFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiO1xuICB9XG59O1xuXG4vL2Z1bmN0aW9uIGZvciByZXNpemUgaW1hZ2UgYW5kIHVwZGF0ZSB3aWR0aCBhbmQgaGVpZ2h0IGZvciBtdWxpdGlzaWduZXJzXG5leHBvcnQgY29uc3QgaGFuZGxlSW1hZ2VSZXNpemUgPSAoXG4gIHJlZixcbiAga2V5LFxuICBzaWduZXJQb3MsXG4gIHNldFNpZ25lclBvcyxcbiAgcGFnZU51bWJlcixcbiAgY29udGFpbmVyU2NhbGUsXG4gIHNjYWxlLFxuICBzaWduZXJJZCxcbiAgc2hvd1Jlc2l6ZVxuKSA9PiB7XG4gIGNvbnN0IGZpbHRlclNpZ25lclBvcyA9IHNpZ25lclBvcy5maWx0ZXIoKGRhdGEpID0+IGRhdGEuSWQgPT09IHNpZ25lcklkKTtcbiAgaWYgKGZpbHRlclNpZ25lclBvcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZ2V0UGxhY2VIb2xkZXIgPSBmaWx0ZXJTaWduZXJQb3NbMF0ucGxhY2VIb2xkZXI7XG4gICAgY29uc3QgZ2V0UGFnZU51bWVyID0gZ2V0UGxhY2VIb2xkZXIuZmlsdGVyKFxuICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlclxuICAgICk7XG4gICAgaWYgKGdldFBhZ2VOdW1lci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBnZXRYWWRhdGEgPSBnZXRQYWdlTnVtZXJbMF0ucG9zO1xuICAgICAgY29uc3QgZ2V0UG9zRGF0YSA9IGdldFhZZGF0YTtcbiAgICAgIGNvbnN0IGFkZFNpZ25Qb3MgPSBnZXRQb3NEYXRhLm1hcCgodXJsKSA9PiB7XG4gICAgICAgIGlmICh1cmwua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udXJsLFxuICAgICAgICAgICAgV2lkdGg6IHJlZi5vZmZzZXRXaWR0aCAvIChjb250YWluZXJTY2FsZSAqIHNjYWxlKSxcbiAgICAgICAgICAgIEhlaWdodDogcmVmLm9mZnNldEhlaWdodCAvIChjb250YWluZXJTY2FsZSAqIHNjYWxlKSxcbiAgICAgICAgICAgIElzUmVzaXplOiBzaG93UmVzaXplID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25Qb3MgPSBnZXRQbGFjZUhvbGRlci5tYXAoKG9iaikgPT4ge1xuICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBvczogYWRkU2lnblBvcyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmV3VXBkYXRlU2lnbmVyID0gc2lnbmVyUG9zLm1hcCgob2JqKSA9PiB7XG4gICAgICAgIGlmIChvYmouSWQgPT09IHNpZ25lcklkKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwbGFjZUhvbGRlcjogbmV3VXBkYXRlU2lnblBvcyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9KTtcblxuICAgICAgc2V0U2lnbmVyUG9zKG5ld1VwZGF0ZVNpZ25lcik7XG4gICAgfVxuICB9XG59O1xuZXhwb3J0IGNvbnN0IHdpZGdldHMgPSBbXG4gIHtcbiAgICB0eXBlOiBcInNpZ25hdHVyZVwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtcGVuLW5pYlwiLFxuICAgIGljb25TaXplOiBcIjIwcHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogXCJzdGFtcFwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtc3RhbXBcIixcbiAgICBpY29uU2l6ZTogXCIxOXB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiaW5pdGlhbHNcIixcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXNpZ25hdHVyZVwiLFxuICAgIGljb25TaXplOiBcIjE1cHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogXCJuYW1lXCIsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS11c2VyXCIsXG4gICAgaWNvblNpemU6IFwiMjFweFwiXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcImpvYiB0aXRsZVwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtYWRkcmVzcy1jYXJkXCIsXG4gICAgaWNvblNpemU6IFwiMTdweFwiXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcImNvbXBhbnlcIixcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLWJ1aWxkaW5nXCIsXG4gICAgaWNvblNpemU6IFwiMjVweFwiXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcImRhdGVcIixcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLWNhbGVuZGFyLWRheXNcIixcbiAgICBpY29uU2l6ZTogXCIyMHB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IHRleHRXaWRnZXQsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS10ZXh0LXdpZHRoXCIsXG4gICAgaWNvblNpemU6IFwiMjBweFwiXG4gIH0sXG4gIHtcbiAgICB0eXBlOiB0ZXh0SW5wdXRXaWRnZXQsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1mb250XCIsXG4gICAgaWNvblNpemU6IFwiMjFweFwiXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcImNoZWNrYm94XCIsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1zcXVhcmUtY2hlY2tcIixcbiAgICBpY29uU2l6ZTogXCIyMnB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiZHJvcGRvd25cIixcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLWNpcmNsZS1jaGV2cm9uLWRvd25cIixcbiAgICBpY29uU2l6ZTogXCIxOXB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IHJhZGlvQnV0dG9uV2lkZ2V0LFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtY2lyY2xlLWRvdFwiLFxuICAgIGljb25TaXplOiBcIjIwcHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogXCJpbWFnZVwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtaW1hZ2VcIixcbiAgICBpY29uU2l6ZTogXCIyMHB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiZW1haWxcIixcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLWVudmVsb3BlXCIsXG4gICAgaWNvblNpemU6IFwiMjBweFwiXG4gIH1cbl07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRlID0gKCkgPT4ge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgY29uc3QgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRUaW1lKCk7XG4gIGNvbnN0IG5ld0RhdGUgPSBtb21lbnQobWlsbGlzZWNvbmRzKS5mb3JtYXQoXCJNTS9ERC9ZWVlZXCIpO1xuICByZXR1cm4gbmV3RGF0ZTtcbn07XG5leHBvcnQgY29uc3QgYWRkV2lkZ2V0T3B0aW9ucyA9ICh0eXBlKSA9PiB7XG4gIGNvbnN0IGRlZmF1bHRPcHQgPSB7XG4gICAgbmFtZTogdHlwZSxcbiAgICBzdGF0dXM6IFwicmVxdWlyZWRcIlxuICB9O1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic2lnbmF0dXJlXCI6XG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcbiAgICBjYXNlIFwic3RhbXBcIjpcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xuICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmYXVsdE9wdCxcbiAgICAgICAgb3B0aW9uczogeyBpc1JlYWRPbmx5OiBmYWxzZSwgaXNIaWRlTGFiZWw6IGZhbHNlIH1cbiAgICAgIH07XG4gICAgY2FzZSB0ZXh0SW5wdXRXaWRnZXQ6XG4gICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0IH07XG4gICAgY2FzZSBcImluaXRpYWxzXCI6XG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcbiAgICBjYXNlIFwibmFtZVwiOlxuICAgICAgcmV0dXJuIHsgLi4uZGVmYXVsdE9wdCB9O1xuICAgIGNhc2UgXCJjb21wYW55XCI6XG4gICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0IH07XG4gICAgY2FzZSBcImpvYiB0aXRsZVwiOlxuICAgICAgcmV0dXJuIHsgLi4uZGVmYXVsdE9wdCB9O1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWZhdWx0T3B0LFxuICAgICAgICByZXNwb25zZTogZ2V0RGF0ZSgpLFxuICAgICAgICB2YWxpZGF0aW9uOiB7IGZvcm1hdDogXCJNTS9kZC95eXl5XCIsIHR5cGU6IFwiZGF0ZS1mb3JtYXRcIiB9XG4gICAgICB9O1xuICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgICAgcmV0dXJuIGRlZmF1bHRPcHQ7XG4gICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0LCB2YWxpZGF0aW9uOiB7IHR5cGU6IFwiZW1haWxcIiwgcGF0dGVybjogXCJcIiB9IH07XG4gICAgY2FzZSBcImRyb3Bkb3duXCI6XG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcbiAgICBjYXNlIHJhZGlvQnV0dG9uV2lkZ2V0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmYXVsdE9wdCxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgaXNSZWFkT25seTogZmFsc2UsXG4gICAgICAgIGlzSGlkZUxhYmVsOiBmYWxzZVxuICAgICAgfTtcbiAgICBjYXNlIHRleHRXaWRnZXQ6XG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHt9O1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGdldFdpZGdldFR5cGUgPSAoaXRlbSwgd2lkZ2V0TmFtZSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtYnRuIHctZml0IG1kOnctWzEwMCVdIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1vdXRsaW5lIG9wLWJ0bi1zbSBmb2N1czpvdXRsaW5lLW5vbmUgb3V0bGluZSBvdXRsaW5lLVsxLjVweF0gbWwtWzZweF0gbWQ6bWwtMCBwLTAgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgZmxleCBtZDpqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LXN0YXJ0IGl0ZW1zLWNlbnRlciB0ZXh0LVsxM3B4XSBtbC0xXCI+XG4gICAgICAgICAgeyFpc01vYmlsZSAmJiA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1ncmlwLXZlcnRpY2FsIG1sLVszcHhdXCI+PC9pPn1cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtZDppbmxpbmUtYmxvY2sgdGV4dC1jZW50ZXIgdGV4dC1bMTVweF0gbWwtWzVweF0gZm9udC1zZW1pYm9sZCBwci0xIG1kOnByLTBcIj5cbiAgICAgICAgICAgIHt3aWRnZXROYW1lfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMjBweF0gb3AtYnRuIG9wLWJ0bi1wcmltYXJ5IHJvdW5kZWQtbm9uZSB3LVs0MHB4XSBoLWZ1bGwgZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8aSBjbGFzc05hbWU9e2l0ZW0uaWNvbn0+PC9pPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRXaWR0aEhlaWdodCA9ICh0eXBlKSA9PiB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJzaWduYXR1cmVcIjpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogNjAgfTtcbiAgICBjYXNlIFwic3RhbXBcIjpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogNjAgfTtcbiAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNSwgaGVpZ2h0OiAxNSB9O1xuICAgIGNhc2UgdGV4dElucHV0V2lkZ2V0OlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAyNSB9O1xuICAgIGNhc2UgXCJkcm9wZG93blwiOlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDEyMCwgaGVpZ2h0OiAyMiB9O1xuICAgIGNhc2UgXCJpbml0aWFsc1wiOlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDUwLCBoZWlnaHQ6IDUwIH07XG4gICAgY2FzZSBcIm5hbWVcIjpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogMjUgfTtcbiAgICBjYXNlIFwiY29tcGFueVwiOlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAyNSB9O1xuICAgIGNhc2UgXCJqb2IgdGl0bGVcIjpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogMjUgfTtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDEwMCwgaGVpZ2h0OiAyMCB9O1xuICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDcwLCBoZWlnaHQ6IDcwIH07XG4gICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDIwIH07XG4gICAgY2FzZSByYWRpb0J1dHRvbldpZGdldDpcbiAgICAgIHJldHVybiB7IHdpZHRoOiA1LCBoZWlnaHQ6IDEwIH07XG4gICAgY2FzZSB0ZXh0V2lkZ2V0OlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAyNSB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDYwIH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZXNpemVCb3JkZXJFeHRyYVdpZHRoID0gKCkgPT4ge1xuICByZXR1cm4gMjA7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QmFzZTY0RnJvbVVybCh1cmwsIGF1dG9zaWduKSB7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICBjb25zdCBibG9iID0gYXdhaXQgZGF0YS5ibG9iKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBkZkJhc2UgPSB0aGlzLnJlc3VsdDtcbiAgICAgIGlmIChhdXRvc2lnbikge1xuICAgICAgICByZXNvbHZlKHBkZkJhc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3VmZml4YmFzZTY0ID0gcGRmQmFzZS5zcGxpdChcIixcIikucG9wKCk7XG4gICAgICAgIHJlc29sdmUoc3VmZml4YmFzZTY0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhc2U2NEZyb21JTUcodXJsKSB7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICBjb25zdCBibG9iID0gYXdhaXQgZGF0YS5ibG9iKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBkZkJhc2UgPSB0aGlzLnJlc3VsdDtcblxuICAgICAgcmVzb2x2ZShwZGZCYXNlKTtcbiAgICB9O1xuICB9KTtcbn1cbi8vZnVuY3Rpb24gZm9yIGNvbnZlcnQgc2lnbmF0dXJlIHBuZyBiYXNlNjQgdXJsIHRvIGpwZWcgYmFzZTY0XG5leHBvcnQgY29uc3QgY29udmVydFBOR3RvSlBFRyA9IChiYXNlNjREYXRhKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcuc3JjID0gYmFzZTY0RGF0YTtcblxuICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcblxuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBcIiNmZmZmZmZcIjsgLy8gd2hpdGUgY29sb3JcbiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgLy8gQ29udmVydCB0byBKUEVHIGJ5IHVzaW5nIHRoZSBjYW52YXMudG9EYXRhVVJMKCkgbWV0aG9kXG4gICAgICBjb25zdCBqcGVnQmFzZTY0RGF0YSA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9qcGVnXCIpO1xuXG4gICAgICByZXNvbHZlKGpwZWdCYXNlNjREYXRhKTtcbiAgICB9O1xuXG4gICAgaW1nLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcbiAgfSk7XG59O1xuXG4vL2Z1bmN0aW9uIGZvciByZXNpemUgaW1hZ2UgYW5kIHVwZGF0ZSB3aWR0aCBhbmQgaGVpZ2h0IGZvciBzaWduLXlvdXJzZWxmXG5leHBvcnQgY29uc3QgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemUgPSAoXG4gIHJlZixcbiAga2V5LFxuICB4eVBvc3Rpb24sXG4gIHNldFh5UG9zdGlvbixcbiAgaW5kZXgsXG4gIGNvbnRhaW5lclNjYWxlLFxuICBzY2FsZVxuKSA9PiB7XG4gIGNvbnN0IGdldFhZZGF0YSA9IHh5UG9zdGlvbltpbmRleF0ucG9zO1xuICBjb25zdCBnZXRQb3NEYXRhID0gZ2V0WFlkYXRhO1xuICBjb25zdCBhZGRTaWduID0gZ2V0UG9zRGF0YS5tYXAoKHVybCkgPT4ge1xuICAgIGlmICh1cmwua2V5ID09PSBrZXkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnVybCxcbiAgICAgICAgV2lkdGg6IHJlZi5vZmZzZXRXaWR0aCAvIChzY2FsZSAqIGNvbnRhaW5lclNjYWxlKSxcbiAgICAgICAgSGVpZ2h0OiByZWYub2Zmc2V0SGVpZ2h0IC8gKHNjYWxlICogY29udGFpbmVyU2NhbGUpLFxuICAgICAgICBJc1Jlc2l6ZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbiAgfSk7XG5cbiAgY29uc3QgbmV3VXBkYXRlVXJsID0geHlQb3N0aW9uLm1hcCgob2JqLCBpbmQpID0+IHtcbiAgICBpZiAoaW5kID09PSBpbmRleCkge1xuICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IGFkZFNpZ24gfTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfSk7XG4gIHNldFh5UG9zdGlvbihuZXdVcGRhdGVVcmwpO1xufTtcblxuLy9mdW5jdGlvbiBmb3IgY2FsbCBjbG91ZCBmdW5jdGlvbiBzaWduUGRmIGFuZCBnZW5lcmF0ZSBkaWdpdGFsIHNpZ25hdHVyZVxuZXhwb3J0IGNvbnN0IHNpZ25QZGZGdW4gPSBhc3luYyAoXG4gIGJhc2U2NFVybCxcbiAgZG9jdW1lbnRJZCxcbiAgc2lnbmVyT2JqZWN0SWQsXG4gIG9iamVjdElkLFxuICBpc1N1YnNjcmliZWQsXG4gIGFjdGl2ZU1haWxBZGFwdGVyLFxuICB3aWRnZXRzXG4pID0+IHtcbiAgbGV0IGlzQ3VzdG9tQ29tcGxldGlvbk1haWwgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICAvL2dldCB0ZW5hbnQgZGV0YWlsc1xuICAgIGNvbnN0IHRlbmFudERldGFpbHMgPSBhd2FpdCBnZXRUZW5hbnREZXRhaWxzKG9iamVjdElkKTtcbiAgICBpZiAodGVuYW50RGV0YWlscyAmJiB0ZW5hbnREZXRhaWxzID09PSBcInVzZXIgZG9lcyBub3QgZXhpc3QhXCIpIHtcbiAgICAgIHJldHVybiB7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBcIlVzZXIgZG9lcyBub3QgZXhpc3QuXCIgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICB0ZW5hbnREZXRhaWxzPy5Db21wbGV0aW9uQm9keSAmJlxuICAgICAgICB0ZW5hbnREZXRhaWxzPy5Db21wbGV0aW9uU3ViamVjdCAmJlxuICAgICAgICBpc1N1YnNjcmliZWRcbiAgICAgICkge1xuICAgICAgICBpc0N1c3RvbUNvbXBsZXRpb25NYWlsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBiZWxvdyBmb3IgbG9vcCBpcyB1c2VkIHRvIGdldCBmaXJzdCBzaWduYXR1cmUgb2YgdXNlciB0byBzZW5kIGlmIHRvIHNpZ25wZGZcbiAgICAvLyBmb3IgYWRkaW5nIGl0IGluIGNvbXBsZXRpb24gY2VydGlmaWNhdGVcbiAgICBsZXQgZ2V0U2lnbmF0dXJlO1xuICAgIGZvciAobGV0IGl0ZW0gb2Ygd2lkZ2V0cykge1xuICAgICAgaWYgKCFnZXRTaWduYXR1cmUpIHtcbiAgICAgICAgY29uc3QgdHlwZUV4aXN0ID0gaXRlbS5wb3Muc29tZSgoZGF0YSkgPT4gZGF0YT8udHlwZSk7XG4gICAgICAgIGlmICh0eXBlRXhpc3QpIHtcbiAgICAgICAgICBnZXRTaWduYXR1cmUgPSBpdGVtLnBvcy5maW5kKChkYXRhKSA9PiBkYXRhPy50eXBlID09PSBcInNpZ25hdHVyZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnZXRTaWduYXR1cmUgPSBpdGVtLnBvcy5maW5kKChkYXRhKSA9PiAhZGF0YS5pc1N0YW1wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBiYXNlNjRTaWduID0gZ2V0U2lnbmF0dXJlLlNpZ25Vcmw7XG4gICAgLy9jaGVjayBodHRwcyB0eXBlIHNpZ25hdHVyZSAoZGVmYXVsdCBzaWduYXR1cmUgZXhpc3QpIHRoZW4gY29udmVydCBpbiBiYXNlNjRcbiAgICBjb25zdCBpc1VybCA9IGJhc2U2NFNpZ24uaW5jbHVkZXMoXCJodHRwc1wiKTtcbiAgICBpZiAoaXNVcmwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJhc2U2NFNpZ24gPSBhd2FpdCBmZXRjaEltYWdlQmFzZTY0KGJhc2U2NFNpZ24pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yXCIsIGUpO1xuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwiZXJyb3JcIiwgbWVzc2FnZTogXCJzb21ldGhpbmcgd2VudCB3cm9uZy5cIiB9O1xuICAgICAgfVxuICAgIH1cbiAgICAvL2NoYW5nZSBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0IHRvIDEwMC80MCBpbiBwbmcgYmFzZTY0XG4gICAgY29uc3QgZ2V0TmV3c2U2NCA9IGF3YWl0IGNoYW5nZUltYWdlV0goYmFzZTY0U2lnbik7XG4gICAgLy9yZW1vdmUgc3VmZmlpeCBvZiBiYXNlNjRcbiAgICBjb25zdCBzdWZmaXhiYXNlNjQgPSBnZXROZXdzZTY0ICYmIGdldE5ld3NlNjQuc3BsaXQoXCIsXCIpLnBvcCgpO1xuXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbWFpbFByb3ZpZGVyOiBhY3RpdmVNYWlsQWRhcHRlcixcbiAgICAgIHBkZkZpbGU6IGJhc2U2NFVybCxcbiAgICAgIGRvY0lkOiBkb2N1bWVudElkLFxuICAgICAgdXNlcklkOiBzaWduZXJPYmplY3RJZCxcbiAgICAgIGlzQ3VzdG9tQ29tcGxldGlvbk1haWw6IGlzQ3VzdG9tQ29tcGxldGlvbk1haWwsXG4gICAgICBzaWduYXR1cmU6IHN1ZmZpeGJhc2U2NFxuICAgIH07XG4gICAgY29uc3QgcmVzU2lnblBkZiA9IGF3YWl0IFBhcnNlLkNsb3VkLnJ1bihcInNpZ25QZGZcIiwgcGFyYW1zKTtcbiAgICBpZiAocmVzU2lnblBkZikge1xuICAgICAgY29uc3Qgc2lnbmVkUGRmID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNTaWduUGRmKSk7XG4gICAgICByZXR1cm4gc2lnbmVkUGRmO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIHNpZ25QZGYgY2xvdWQgZnVuY3Rpb24gXCIsIGUubWVzc2FnZSk7XG4gICAgaWYgKGUgJiYgZT8ubWVzc2FnZT8uaW5jbHVkZXMoXCJpcyBlbmNyeXB0ZWQuXCIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgbWVzc2FnZTogXCJDdXJyZW50bHkgZW5jcnlwdGVkIHBkZiBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZC5cIlxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZS5tZXNzYWdlID09PSBcIlBLQ1MjMTIgTUFDIGNvdWxkIG5vdCBiZSB2ZXJpZmllZC4gSW52YWxpZCBwYXNzd29yZD9cIlxuICAgICkge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcImVycm9yXCIsIG1lc3NhZ2U6IFwiUEZYIGZpbGUgcGFzc3dvcmQgaXMgaW52YWxpZC5cIiB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geyBzdGF0dXM6IFwiZXJyb3JcIiwgbWVzc2FnZTogXCJzb21ldGhpbmcgd2VudCB3cm9uZy5cIiB9O1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJhbmRvbUlkID0gKCkgPT4ge1xuICBjb25zdCByYW5kb21CeXRlcyA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQxNkFycmF5KDEpKTtcbiAgY29uc3QgcmFuZG9tVmFsdWUgPSByYW5kb21CeXRlc1swXTtcbiAgY29uc3QgcmFuZG9tRGlnaXQgPSAxMDAwICsgKHJhbmRvbVZhbHVlICUgOTAwMCk7XG4gIHJldHVybiByYW5kb21EaWdpdDtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVEb2N1bWVudCA9IGFzeW5jIChcbiAgdGVtcGxhdGUsXG4gIHBsYWNlaG9sZGVycyxcbiAgc2lnbmVyRGF0YSxcbiAgcGRmVXJsXG4pID0+IHtcbiAgaWYgKHRlbXBsYXRlICYmIHRlbXBsYXRlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBEb2MgPSB0ZW1wbGF0ZVswXTtcblxuICAgIGxldCBwbGFjZWhvbGRlcnNBcnIgPSBbXTtcbiAgICBpZiAocGxhY2Vob2xkZXJzPy5sZW5ndGggPiAwKSB7XG4gICAgICBwbGFjZWhvbGRlcnNBcnIgPSBwbGFjZWhvbGRlcnM7XG4gICAgfVxuICAgIGxldCBzaWduZXJzID0gW107XG4gICAgaWYgKHNpZ25lckRhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHNpZ25lckRhdGEuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICBpZiAoeC5vYmplY3RJZCkge1xuICAgICAgICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiY29udHJhY3RzX0NvbnRhY3Rib29rXCIsXG4gICAgICAgICAgICBvYmplY3RJZDogeC5vYmplY3RJZFxuICAgICAgICAgIH07XG4gICAgICAgICAgc2lnbmVycy5wdXNoKG9iaik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgTmFtZTogRG9jLk5hbWUsXG4gICAgICBVUkw6IHBkZlVybCxcbiAgICAgIFNpZ25lZFVybDogRG9jLlNpZ25lZFVybCxcbiAgICAgIFNlbnRUb090aGVyczogRG9jLlNlbnRUb090aGVycyxcbiAgICAgIERlc2NyaXB0aW9uOiBEb2MuRGVzY3JpcHRpb24sXG4gICAgICBOb3RlOiBEb2MuTm90ZSxcbiAgICAgIFBsYWNlaG9sZGVyczogcGxhY2Vob2xkZXJzQXJyLFxuICAgICAgRXh0VXNlclB0cjoge1xuICAgICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiY29udHJhY3RzX1VzZXJzXCIsXG4gICAgICAgIG9iamVjdElkOiBEb2MuRXh0VXNlclB0ci5vYmplY3RJZFxuICAgICAgfSxcbiAgICAgIENyZWF0ZWRCeToge1xuICAgICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiX1VzZXJcIixcbiAgICAgICAgb2JqZWN0SWQ6IERvYy5DcmVhdGVkQnkub2JqZWN0SWRcbiAgICAgIH0sXG4gICAgICBTaWduZXJzOiBzaWduZXJzLFxuICAgICAgU2VuZGluT3JkZXI6IERvYz8uU2VuZGluT3JkZXIgfHwgZmFsc2UsXG4gICAgICBBdXRvbWF0aWNSZW1pbmRlcnM6IERvYz8uQXV0b21hdGljUmVtaW5kZXJzIHx8IGZhbHNlLFxuICAgICAgUmVtaW5kT25jZUluRXZlcnk6IHBhcnNlSW50KERvYz8uUmVtaW5kT25jZUluRXZlcnkgfHwgNSlcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1jbGFzc2VzL2NvbnRyYWN0c19Eb2N1bWVudGAsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICAgICAgICBcIlgtUGFyc2UtU2Vzc2lvbi1Ub2tlblwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwic3VjY2Vzc1wiLCBpZDogcmVzLmRhdGEub2JqZWN0SWQgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiYXhvaXMgZXJyIFwiLCBlcnIpO1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcImVycm9yXCIsIGlkOiBcIlNvbWV0aGluZyBXZW50IFdyb25nIVwiIH07XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RMZXR0ZXIgPSAobmFtZSkgPT4ge1xuICBjb25zdCBmaXJzdExldHRlciA9IG5hbWU/LmNoYXJBdCgwKTtcbiAgcmV0dXJuIGZpcnN0TGV0dGVyO1xufTtcblxuZXhwb3J0IGNvbnN0IGRhcmtlbkNvbG9yID0gKGNvbG9yLCBmYWN0b3IpID0+IHtcbiAgLy8gUmVtb3ZlICcjJyBmcm9tIHRoZSBjb2xvciBjb2RlIGFuZCBwYXJzZSBpdCB0byBnZXQgUkdCIHZhbHVlc1xuICBjb25zdCBoZXggPSBjb2xvci5yZXBsYWNlKFwiI1wiLCBcIlwiKTtcbiAgY29uc3QgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcbiAgY29uc3QgZyA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMiwgNCksIDE2KTtcbiAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcblxuICAvLyBEYXJrZW4gdGhlIGNvbG9yIGJ5IHJlZHVjaW5nIGVhY2ggUkdCIGNvbXBvbmVudFxuICBjb25zdCBkYXJrZXJSID0gTWF0aC5mbG9vcihyICogKDEgLSBmYWN0b3IpKTtcbiAgY29uc3QgZGFya2VyRyA9IE1hdGguZmxvb3IoZyAqICgxIC0gZmFjdG9yKSk7XG4gIGNvbnN0IGRhcmtlckIgPSBNYXRoLmZsb29yKGIgKiAoMSAtIGZhY3RvcikpO1xuXG4gIC8vIENvbnZlcnQgdGhlIGRhcmtlbmVkIFJHQiBjb21wb25lbnRzIGJhY2sgdG8gaGV4XG4gIHJldHVybiBgIyR7KChkYXJrZXJSIDw8IDE2KSB8IChkYXJrZXJHIDw8IDgpIHwgZGFya2VyQilcbiAgICAudG9TdHJpbmcoMTYpXG4gICAgLnBhZFN0YXJ0KDYsIFwiMFwiKX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFpJbmRleCA9IChzaWduZXJQb3MsIGtleSwgc2V0WkluZGV4KSA9PiB7XG4gIHJldHVybiBzaWduZXJQb3MubWFwKChpdGVtKSA9PiB7XG4gICAgaWYgKGl0ZW0ucGxhY2VIb2xkZXIgJiYgaXRlbS5wbGFjZUhvbGRlci5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIG5lc3RlZCBhcnJheSwgcmVjdXJzaXZlbHkgYWRkIHRoZSBmaWVsZCB0byB0aGUgbGFzdCBvYmplY3RcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLml0ZW0sXG4gICAgICAgIHBsYWNlSG9sZGVyOiBhZGRaSW5kZXgoaXRlbS5wbGFjZUhvbGRlciwga2V5LCBzZXRaSW5kZXgpXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoaXRlbS5wb3MgJiYgaXRlbS5wb3MubGVuZ3RoID4gMCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbmVzdGVkIGFycmF5LCBhZGQgdGhlIG5ldyBmaWVsZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgcG9zOiBhZGRaSW5kZXgoaXRlbS5wb3MsIGtleSwgc2V0WkluZGV4KVxuICAgICAgICAvLyBBZGp1c3QgdGhpcyBsaW5lIHRvIGFkZCB0aGUgZGVzaXJlZCBmaWVsZFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGl0ZW0ua2V5ID09PSBrZXkpIHtcbiAgICAgICAgc2V0WkluZGV4KGl0ZW0uekluZGV4KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIHpJbmRleDogaXRlbS56SW5kZXggPyBpdGVtLnpJbmRleCArIDEgOiAxXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLml0ZW1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLy9mdW5jdGlvbiBmb3Igc2F2ZSB3aWRnZXRzIHZhbHVlIG9uIG9uY2hhbmdlIGZ1bmN0aW9uXG5leHBvcnQgY29uc3Qgb25DaGFuZ2VJbnB1dCA9IChcbiAgdmFsdWUsXG4gIHNpZ25LZXksXG4gIHh5UG9zdGlvbixcbiAgaW5kZXgsXG4gIHNldFh5UG9zdGlvbixcbiAgdXNlcklkLFxuICBpbml0aWFsLFxuICBkYXRlRm9ybWF0LFxuICBpc0RlZmF1bHRFbXB0eSxcbiAgaXNSYWRpbyxcbiAgZm9udFNpemUsXG4gIGZvbnRDb2xvclxuKSA9PiB7XG4gIGNvbnN0IGlzU2lnbmVycyA9IHh5UG9zdGlvbi5zb21lKChkYXRhKSA9PiBkYXRhLnNpZ25lclB0cik7XG4gIGxldCBmaWx0ZXJTaWduZXJQb3M7XG4gIGlmIChpc1NpZ25lcnMpIHtcbiAgICBpZiAodXNlcklkKSB7XG4gICAgICBmaWx0ZXJTaWduZXJQb3MgPSB4eVBvc3Rpb24uZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSB1c2VySWQpO1xuICAgIH1cbiAgICBjb25zdCBnZXRQbGFjZUhvbGRlciA9IGZpbHRlclNpZ25lclBvc1swXT8ucGxhY2VIb2xkZXI7XG4gICAgaWYgKGluaXRpYWwpIHtcbiAgICAgIGNvbnN0IHh5RGF0YSA9IGFkZEluaXRpYWxEYXRhKHh5UG9zdGlvbiwgc2V0WHlQb3N0aW9uLCB2YWx1ZSwgdXNlcklkKTtcbiAgICAgIHNldFh5UG9zdGlvbih4eURhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBnZXRQYWdlTnVtZXIgPSBnZXRQbGFjZUhvbGRlci5maWx0ZXIoXG4gICAgICAgIChkYXRhKSA9PiBkYXRhLnBhZ2VOdW1iZXIgPT09IGluZGV4XG4gICAgICApO1xuICAgICAgaWYgKGdldFBhZ2VOdW1lci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGdldFhZZGF0YSA9IGdldFBhZ2VOdW1lclswXS5wb3M7XG4gICAgICAgIGNvbnN0IGdldFBvc0RhdGEgPSBnZXRYWWRhdGE7XG4gICAgICAgIGNvbnN0IGFkZFNpZ25Qb3MgPSBnZXRQb3NEYXRhLm1hcCgocG9zaXRpb24pID0+IHtcbiAgICAgICAgICBpZiAocG9zaXRpb24ua2V5ID09PSBzaWduS2V5KSB7XG4gICAgICAgICAgICBpZiAoZGF0ZUZvcm1hdCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICBmb250Q29sb3I6IGZvbnRDb2xvcixcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkYXRlLWZvcm1hdFwiLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IGRhdGVGb3JtYXQgLy8gVGhpcyBpbmRpY2F0ZXMgdGhlIHJlcXVpcmVkIGRhdGUgZm9ybWF0IGV4cGxpY2l0bHkuXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0RlZmF1bHRFbXB0eSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGlzUmFkaW8gPyBcIlwiIDogW11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTogdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25Qb3MgPSBnZXRQbGFjZUhvbGRlci5tYXAoKG9iaikgPT4ge1xuICAgICAgICAgIGlmIChvYmoucGFnZU51bWJlciA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiBhZGRTaWduUG9zIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25lciA9IHh5UG9zdGlvbi5tYXAoKG9iaikgPT4ge1xuICAgICAgICAgIGlmIChvYmouSWQgPT09IHVzZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwbGFjZUhvbGRlcjogbmV3VXBkYXRlU2lnblBvcyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9KTtcblxuICAgICAgICBzZXRYeVBvc3Rpb24obmV3VXBkYXRlU2lnbmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGdldFhZZGF0YSA9IHh5UG9zdGlvbltpbmRleF0ucG9zO1xuICAgIGNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gZ2V0WFlkYXRhLm1hcCgocG9zaXRpb25EYXRhKSA9PiB7XG4gICAgICBpZiAocG9zaXRpb25EYXRhLmtleSA9PT0gc2lnbktleSkge1xuICAgICAgICBpZiAoZGF0ZUZvcm1hdCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wb3NpdGlvbkRhdGEsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgIC4uLnBvc2l0aW9uRGF0YS5vcHRpb25zLFxuICAgICAgICAgICAgICByZXNwb25zZTogdmFsdWUsXG4gICAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgICAgZm9udENvbG9yOiBmb250Q29sb3IsXG4gICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGUtZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBkYXRlRm9ybWF0IC8vIFRoaXMgaW5kaWNhdGVzIHRoZSByZXF1aXJlZCBkYXRlIGZvcm1hdCBleHBsaWNpdGx5LlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucG9zaXRpb25EYXRhLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAuLi5wb3NpdGlvbkRhdGEub3B0aW9ucyxcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBvc2l0aW9uRGF0YTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHVwZGF0ZVBsYWNlaG9sZGVyID0geHlQb3N0aW9uLm1hcCgob2JqLCBpbmQpID0+IHtcbiAgICAgIGlmIChpbmQgPT09IGluZGV4KSB7XG4gICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiB1cGRhdGVQb3NpdGlvbiB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9KTtcbiAgICBzZXRYeVBvc3Rpb24odXBkYXRlUGxhY2Vob2xkZXIpO1xuICB9XG59O1xuXG4vL2Z1bmN0aW9uIHRvIGluY3JlYXNlIGhlaWdodCBvZiB0ZXh0IGFyZWEgb24gcHJlc3MgZW50ZXJcbmV4cG9ydCBjb25zdCBvbkNoYW5nZUhlaWdodE9mVGV4dEFyZWEgPSAoXG4gIGhlaWdodCxcbiAgd2lkZ2V0VHlwZSxcbiAgc2lnbktleSxcbiAgeHlQb3N0aW9uLFxuICBpbmRleCxcbiAgc2V0WHlQb3N0aW9uLFxuICB1c2VySWRcbikgPT4ge1xuICBjb25zdCBpc1NpZ25lcnMgPSB4eVBvc3Rpb24uc29tZSgoZGF0YSkgPT4gZGF0YS5zaWduZXJQdHIpO1xuICBsZXQgZmlsdGVyU2lnbmVyUG9zO1xuICBpZiAoaXNTaWduZXJzKSB7XG4gICAgaWYgKHVzZXJJZCkge1xuICAgICAgZmlsdGVyU2lnbmVyUG9zID0geHlQb3N0aW9uLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5JZCA9PT0gdXNlcklkKTtcbiAgICB9XG4gICAgY29uc3QgZ2V0UGxhY2VIb2xkZXIgPSBmaWx0ZXJTaWduZXJQb3NbMF0/LnBsYWNlSG9sZGVyO1xuXG4gICAgY29uc3QgZ2V0UGFnZU51bWVyID0gZ2V0UGxhY2VIb2xkZXIuZmlsdGVyKFxuICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gaW5kZXhcbiAgICApO1xuICAgIGlmIChnZXRQYWdlTnVtZXIubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZ2V0WFlkYXRhID0gZ2V0UGFnZU51bWVyWzBdLnBvcztcbiAgICAgIGNvbnN0IGdldFBvc0RhdGEgPSBnZXRYWWRhdGE7XG4gICAgICBjb25zdCBhZGRTaWduUG9zID0gZ2V0UG9zRGF0YS5tYXAoKHBvc2l0aW9uKSA9PiB7XG4gICAgICAgIGlmIChwb3NpdGlvbi5rZXkgPT09IHNpZ25LZXkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgICAgICBIZWlnaHQ6IHBvc2l0aW9uLkhlaWdodFxuICAgICAgICAgICAgICA/IHBvc2l0aW9uLkhlaWdodCArIGhlaWdodFxuICAgICAgICAgICAgICA6IGRlZmF1bHRXaWR0aEhlaWdodCh3aWRnZXRUeXBlKS5oZWlnaHQgKyBoZWlnaHRcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV3VXBkYXRlU2lnblBvcyA9IGdldFBsYWNlSG9sZGVyLm1hcCgob2JqKSA9PiB7XG4gICAgICAgIGlmIChvYmoucGFnZU51bWJlciA9PT0gaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBvczogYWRkU2lnblBvcyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmV3VXBkYXRlU2lnbmVyID0geHlQb3N0aW9uLm1hcCgob2JqKSA9PiB7XG4gICAgICAgIGlmIChvYmouSWQgPT09IHVzZXJJZCkge1xuICAgICAgICAgIHJldHVybiB7IC4uLm9iaiwgcGxhY2VIb2xkZXI6IG5ld1VwZGF0ZVNpZ25Qb3MgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSk7XG5cbiAgICAgIHNldFh5UG9zdGlvbihuZXdVcGRhdGVTaWduZXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XG5cbiAgICBjb25zdCB1cGRhdGVQb3NpdGlvbiA9IGdldFhZZGF0YS5tYXAoKHBvc2l0aW9uKSA9PiB7XG4gICAgICBpZiAocG9zaXRpb24ua2V5ID09PSBzaWduS2V5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgICAgSGVpZ2h0OiBwb3NpdGlvbi5IZWlnaHRcbiAgICAgICAgICAgID8gcG9zaXRpb24uSGVpZ2h0ICsgaGVpZ2h0XG4gICAgICAgICAgICA6IGRlZmF1bHRXaWR0aEhlaWdodCh3aWRnZXRUeXBlKS5oZWlnaHQgKyBoZWlnaHRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9KTtcblxuICAgIGNvbnN0IHVwZGF0ZVBsYWNlaG9sZGVyID0geHlQb3N0aW9uLm1hcCgob2JqLCBpbmQpID0+IHtcbiAgICAgIGlmIChpbmQgPT09IGluZGV4KSB7XG4gICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiB1cGRhdGVQb3NpdGlvbiB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9KTtcbiAgICBzZXRYeVBvc3Rpb24odXBkYXRlUGxhY2Vob2xkZXIpO1xuICB9XG59O1xuLy9jYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodFxuZXhwb3J0IGNvbnN0IGNhbGN1bGF0ZUluaXRpYWxXaWR0aEhlaWdodCA9ICh3aWRnZXREYXRhKSA9PiB7XG4gIGNvbnN0IGludGlhbFRleHQgPSB3aWRnZXREYXRhO1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHNwYW4udGV4dENvbnRlbnQgPSBpbnRpYWxUZXh0O1xuICBzcGFuLnN0eWxlLmZvbnQgPSBgMTRweGA7IC8vIGhlcmUgcHV0IHlvdXIgdGV4dCBzaXplIGFuZCBmb250IGZhbWlseVxuICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImhpZGRlblwiO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICBjb25zdCB3aWR0aCA9IHNwYW4ub2Zmc2V0V2lkdGg7XG4gIGNvbnN0IGhlaWdodCA9IHNwYW4ub2Zmc2V0SGVpZ2h0O1xuXG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gIHJldHVybiB7XG4gICAgZ2V0V2lkdGg6IHdpZHRoLFxuICAgIGdldEhlaWdodDogaGVpZ2h0XG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IGFkZEluaXRpYWxEYXRhID0gKHNpZ25lclBvcywgc2V0WHlQb3N0aW9uLCB2YWx1ZSwgdXNlcklkKSA9PiB7XG4gIGZ1bmN0aW9uIHdpZGdldERhdGFWYWx1ZSh0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwibmFtZVwiOlxuICAgICAgICByZXR1cm4gdmFsdWU/Lk5hbWU7XG4gICAgICBjYXNlIFwiY29tcGFueVwiOlxuICAgICAgICByZXR1cm4gdmFsdWU/LkNvbXBhbnk7XG4gICAgICBjYXNlIFwiam9iIHRpdGxlXCI6XG4gICAgICAgIHJldHVybiB2YWx1ZT8uSm9iVGl0bGU7XG4gICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgcmV0dXJuIHZhbHVlPy5FbWFpbDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmVyUG9zLm1hcCgoaXRlbSkgPT4ge1xuICAgIGlmIChpdGVtLnBsYWNlSG9sZGVyICYmIGl0ZW0ucGxhY2VIb2xkZXIubGVuZ3RoID4gMCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXN0ZWQgYXJyYXksIHJlY3Vyc2l2ZWx5IGFkZCB0aGUgZmllbGQgdG8gdGhlIGxhc3Qgb2JqZWN0XG4gICAgICBpZiAoaXRlbS5JZCA9PT0gdXNlcklkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBwbGFjZUhvbGRlcjogYWRkSW5pdGlhbERhdGEoXG4gICAgICAgICAgICBpdGVtLnBsYWNlSG9sZGVyLFxuICAgICAgICAgICAgc2V0WHlQb3N0aW9uLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB1c2VySWRcbiAgICAgICAgICApXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLml0ZW1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGl0ZW0ucG9zICYmIGl0ZW0ucG9zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG5lc3RlZCBhcnJheSwgYWRkIHRoZSBuZXcgZmllbGRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLml0ZW0sXG4gICAgICAgIHBvczogYWRkSW5pdGlhbERhdGEoaXRlbS5wb3MsIHNldFh5UG9zdGlvbiwgdmFsdWUsIHVzZXJJZClcbiAgICAgICAgLy8gQWRqdXN0IHRoaXMgbGluZSB0byBhZGQgdGhlIGRlc2lyZWQgZmllbGRcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHdpZGdldERhdGEgPSB3aWRnZXREYXRhVmFsdWUoaXRlbS50eXBlKTtcbiAgICAgIGlmIChbXCJuYW1lXCIsIFwiY29tcGFueVwiLCBcImpvYiB0aXRsZVwiLCBcImVtYWlsXCJdLmluY2x1ZGVzKGl0ZW0udHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIC4uLml0ZW0ub3B0aW9ucyxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogd2lkZ2V0RGF0YVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBXaWR0aDpcbiAgICAgICAgICAvLyAgIGNhbGN1bGF0ZUluaXRpYWxXaWR0aEhlaWdodChpdGVtLnR5cGUsIHdpZGdldERhdGEpLmdldFdpZHRoIHx8XG4gICAgICAgICAgLy8gICBpdGVtPy5XaWR0aCxcbiAgICAgICAgICAvLyBIZWlnaHQ6XG4gICAgICAgICAgLy8gICBjYWxjdWxhdGVJbml0aWFsV2lkdGhIZWlnaHQoaXRlbS50eXBlLCB3aWRnZXREYXRhKS5nZXRIZWlnaHQgfHxcbiAgICAgICAgICAvLyAgIGl0ZW0/LkhlaWdodFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pdGVtXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbi8vZnVuY3Rpb24gZm9yIGVtYmVkIGRvY3VtZW50IGlkXG5leHBvcnQgY29uc3QgZW1iZWREb2NJZCA9IGFzeW5jIChwZGZEb2MsIGRvY3VtZW50SWQsIGFsbFBhZ2VzKSA9PiB7XG4gIC8vIGBmb250Qnl0ZXNgIGlzIHVzZWQgdG8gZW1iZWQgY3VzdG9tIGZvbnQgaW4gcGRmXG4gIGNvbnN0IGZvbnRCeXRlcyA9IGF3YWl0IGZpbGVhc2J5dGVzKFxuICAgIFwiaHR0cHM6Ly9jZG4ub3BlbnNpZ25sYWJzLmNvbS93ZWJmb250cy90aW1lcy50dGZcIlxuICApO1xuICBwZGZEb2MucmVnaXN0ZXJGb250a2l0KGZvbnRraXQpO1xuICBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChmb250Qnl0ZXMsIHsgc3Vic2V0OiB0cnVlIH0pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFBhZ2VzOyBpKyspIHtcbiAgICBjb25zdCBmb250U2l6ZSA9IDEwO1xuICAgIGNvbnN0IHRleHRDb250ZW50ID0gZG9jdW1lbnRJZCAmJiBgT3BlblNpZ27ihKIgRG9jdW1lbnRJZDogJHtkb2N1bWVudElkfSBgO1xuICAgIGNvbnN0IHBhZ2VzID0gcGRmRG9jLmdldFBhZ2VzKCk7XG4gICAgY29uc3QgcGFnZSA9IHBhZ2VzW2ldO1xuICAgIGNvbnN0IGdldE9iaiA9IGNvbXBlbnNhdGVSb3RhdGlvbihcbiAgICAgIHBhZ2UuZ2V0Um90YXRpb24oKS5hbmdsZSxcbiAgICAgIDEwLFxuICAgICAgNSxcbiAgICAgIDEsXG4gICAgICBwYWdlLmdldFNpemUoKSxcbiAgICAgIGZvbnRTaXplLFxuICAgICAgcmdiKDAuNSwgMC41LCAwLjUpLFxuICAgICAgZm9udCxcbiAgICAgIHBhZ2VcbiAgICApO1xuICAgIHBhZ2UuZHJhd1RleHQodGV4dENvbnRlbnQsIGdldE9iaik7XG4gIH1cbn07XG5cbi8vZnVuY3Rpb24gZm9yIHNhdmUgYnV0dG9uIHRvIHNhdmUgc2lnbmF0dXJlIG9yIGltYWdlIHVybFxuZXhwb3J0IGZ1bmN0aW9uIG9uU2F2ZVNpZ24oXG4gIHR5cGUsXG4gIHh5UG9zdGlvbixcbiAgaW5kZXgsXG4gIHNpZ25LZXksXG4gIHNpZ25hdHVyZUltZyxcbiAgaW1nV0gsXG4gIGlzRGVmYXVsdFNpZ24sXG4gIGlzVHlwZVRleHRcbikge1xuICBsZXQgZ2V0SU1HV0g7XG4gIGxldCBnZXRYWWRhdGEgPSB4eVBvc3Rpb25baW5kZXhdLnBvcztcbiAgY29uc3QgdXBkYXRlWFlEYXRhID0gZ2V0WFlkYXRhLm1hcCgocG9zaXRpb24pID0+IHtcbiAgICBpZiAocG9zaXRpb24ua2V5ID09PSBzaWduS2V5KSB7XG4gICAgICBpZiAoaXNEZWZhdWx0U2lnbiA9PT0gXCJpbml0aWFsc1wiKSB7XG4gICAgICAgIGxldCBpbWdXSCA9IHsgd2lkdGg6IHBvc2l0aW9uLldpZHRoLCBoZWlnaHQ6IHBvc2l0aW9uLkhlaWdodCB9O1xuICAgICAgICBnZXRJTUdXSCA9IGNhbGN1bGF0ZUltZ0FzcGVjdFJhdGlvKGltZ1dILCBwb3NpdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmYXVsdFNpZ24gPT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIGdldElNR1dIID0gY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8oaW1nV0gsIHBvc2l0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNUeXBlVGV4dCkge1xuICAgICAgICBnZXRJTUdXSCA9IHsgbmV3V2lkdGg6IGltZ1dILndpZHRoLCBuZXdIZWlnaHQ6IGltZ1dILmhlaWdodCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gZGVmYXVsdFdpZHRoSGVpZ2h0KHBvc2l0aW9uPy50eXBlKS53aWR0aDtcbiAgICAgICAgY29uc3QgZGVmYXVsdEhlaWdodCA9IGRlZmF1bHRXaWR0aEhlaWdodChwb3NpdGlvbj8udHlwZSkuaGVpZ2h0O1xuXG4gICAgICAgIGdldElNR1dIID0gY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8oXG4gICAgICAgICAge1xuICAgICAgICAgICAgd2lkdGg6IGRlZmF1bHRXaWR0aCA/IGRlZmF1bHRXaWR0aCA6IDE1MCxcbiAgICAgICAgICAgIGhlaWdodDogZGVmYXVsdEhlaWdodCA/IGRlZmF1bHRIZWlnaHQgOiA2MFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcG9zaXRpb25cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcG9zV2lkdGggPSBnZXRJTUdXSCA/IGdldElNR1dILm5ld1dpZHRoIDogMTUwO1xuICAgICAgY29uc3QgcG9zSGVpZ2h0ID0gZ2V0SU1HV0ggPyBnZXRJTUdXSC5uZXdIZWlnaHQgOiA2MDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgIFdpZHRoOiBwb3NXaWR0aCxcbiAgICAgICAgSGVpZ2h0OiBwb3NIZWlnaHQsXG4gICAgICAgIFNpZ25Vcmw6IHNpZ25hdHVyZUltZyxcbiAgICAgICAgc2lnbmF0dXJlVHlwZTogdHlwZSAmJiB0eXBlLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcbiAgICAgICAgICByZXNwb25zZTogc2lnbmF0dXJlSW1nXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSk7XG5cbiAgY29uc3QgdXBkYXRlWFlwb3NpdGlvbiA9IHh5UG9zdGlvbi5tYXAoKG9iaiwgaW5kKSA9PiB7XG4gICAgaWYgKGluZCA9PT0gaW5kZXgpIHtcbiAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiB1cGRhdGVYWURhdGEgfTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfSk7XG4gIHJldHVybiB1cGRhdGVYWXBvc2l0aW9uO1xufVxuXG5leHBvcnQgY29uc3QgY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8gPSAoaW1nV0gsIHBvcykgPT4ge1xuICBsZXQgbmV3V2lkdGgsIG5ld0hlaWdodDtcblxuICBjb25zdCBwbGFjZWhvbGRlckhlaWdodCA9IHBvcyAmJiBwb3MuSGVpZ2h0ID8gcG9zLkhlaWdodCA6IDYwO1xuICBjb25zdCBhc3BlY3RSYXRpbyA9IGltZ1dILndpZHRoIC8gaW1nV0guaGVpZ2h0O1xuICBuZXdXaWR0aCA9IGFzcGVjdFJhdGlvICogcGxhY2Vob2xkZXJIZWlnaHQ7XG4gIG5ld0hlaWdodCA9IHBsYWNlaG9sZGVySGVpZ2h0O1xuXG4gIHJldHVybiB7IG5ld0hlaWdodCwgbmV3V2lkdGggfTtcbn07XG5cbi8vZnVuY3Rpb24gZm9yIHVwbG9hZCBzdGFtcCBvciBpbWFnZVxuZXhwb3J0IGZ1bmN0aW9uIG9uU2F2ZUltYWdlKHh5UG9zdGlvbiwgaW5kZXgsIHNpZ25LZXksIGltZ1dILCBpbWFnZSkge1xuICBsZXQgZ2V0SU1HV0g7XG5cbiAgLy9nZXQgY3VycmVudCBwYWdlIHBvc2l0aW9uXG4gIGNvbnN0IGdldFhZRGF0YSA9IHh5UG9zdGlvbltpbmRleF0ucG9zO1xuICBjb25zdCB1cGRhdGVYWURhdGEgPSBnZXRYWURhdGEubWFwKChwb3NpdGlvbikgPT4ge1xuICAgIGlmIChwb3NpdGlvbi5rZXkgPT09IHNpZ25LZXkpIHtcbiAgICAgIGdldElNR1dIID0gY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8oaW1nV0gsIHBvc2l0aW9uKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgIFdpZHRoOiBnZXRJTUdXSC5uZXdXaWR0aCxcbiAgICAgICAgSGVpZ2h0OiBnZXRJTUdXSC5uZXdIZWlnaHQsXG4gICAgICAgIFNpZ25Vcmw6IGltYWdlLnNyYyxcbiAgICAgICAgSW1hZ2VUeXBlOiBpbWFnZS5pbWdUeXBlLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcbiAgICAgICAgICByZXNwb25zZTogaW1hZ2Uuc3JjXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSk7XG5cbiAgY29uc3QgdXBkYXRlWFlwb3NpdGlvbiA9IHh5UG9zdGlvbi5tYXAoKG9iaiwgaW5kKSA9PiB7XG4gICAgaWYgKGluZCA9PT0gaW5kZXgpIHtcbiAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiB1cGRhdGVYWURhdGEgfTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfSk7XG4gIHJldHVybiB1cGRhdGVYWXBvc2l0aW9uO1xufVxuXG4vL2Z1bmN0aW9uIGZvciBzZWxlY3QgaW1hZ2UgYW5kIHVwbG9hZCBpbWFnZVxuZXhwb3J0IGNvbnN0IG9uSW1hZ2VTZWxlY3QgPSAoZXZlbnQsIHNldEltZ1dILCBzZXRJbWFnZSkgPT4ge1xuICBjb25zdCBpbWFnZVR5cGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF0udHlwZTtcbiAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZXZlbnQudGFyZ2V0LmZpbGVzWzBdKTtcbiAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgbGV0IHdpZHRoLCBoZWlnaHQ7XG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcblxuICAgIGltYWdlLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3aWR0aCA9IGltYWdlLndpZHRoO1xuICAgICAgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPSA0NjAgLyAxODQ7XG4gICAgICBjb25zdCBpbWdSID0gd2lkdGggLyBoZWlnaHQ7XG5cbiAgICAgIGlmIChpbWdSID4gYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgd2lkdGggPSA0NjA7XG4gICAgICAgIGhlaWdodCA9IDQ2MCAvIGltZ1I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aWR0aCA9IDE4NCAqIGltZ1I7XG4gICAgICAgIGhlaWdodCA9IDE4NDtcbiAgICAgIH1cbiAgICAgIHNldEltZ1dIKHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9KTtcbiAgICB9O1xuXG4gICAgaW1hZ2Uuc3JjID0gcmVhZGVyLnJlc3VsdDtcblxuICAgIHNldEltYWdlKHsgc3JjOiBpbWFnZS5zcmMsIGltZ1R5cGU6IGltYWdlVHlwZSB9KTtcbiAgfTtcbn07XG4vL2NvbnZlcnQgaHR0cHMgdXJsIHRvIGJhc2U2NFxuZXhwb3J0IGNvbnN0IGZldGNoSW1hZ2VCYXNlNjQgPSBhc3luYyAoaW1hZ2VVcmwpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGltYWdlVXJsKTtcbiAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzcG9uc2UuYmxvYigpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2U2NGRhdGEgPSByZWFkZXIucmVzdWx0O1xuICAgICAgICByZXNvbHZlKGJhc2U2NGRhdGEpO1xuICAgICAgfTtcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGNvbnZlcnRpbmcgVVJMIHRvIGJhc2U2NDpcIiwgZXJyb3IpO1xuICB9XG59O1xuLy9mdW5jdGlvbiBmb3Igc2VsZWN0IGltYWdlIGFuZCB1cGxvYWQgaW1hZ2VcbmV4cG9ydCBjb25zdCBjaGFuZ2VJbWFnZVdIID0gYXN5bmMgKGJhc2U2NEltYWdlKSA9PiB7XG4gIGNvbnN0IG5ld1dpZHRoID0gMzAwO1xuICBjb25zdCBuZXdIZWlnaHQgPSAxMjA7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgaW1nLnNyYyA9IGJhc2U2NEltYWdlO1xuICAgIGltZy5vbmxvYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgY2FudmFzLmhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgIGNvbnN0IHJlc2l6ZWRCYXNlNjQgPSBjYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIsIDEuMCk7XG4gICAgICByZXNvbHZlKHJlc2l6ZWRCYXNlNjQpO1xuICAgIH07XG4gICAgaW1nLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcbiAgfSk7XG59O1xuXG4vL2Z1bmN0aW9uIHRvIGNhbGN1bGF0ZSBmb250IHNpemUgb2YgdGV4dCBhcmVhIHdpZGdldHNcbmNvbnN0IGNhbGN1bGF0ZUZvbnRTaXplID0gKHBvc2l0aW9uLCBjb250YWluZXJTY2FsZSwgc2lnbnlvdXJzZWxmKSA9PiB7XG4gIGNvbnN0IGZvbnQgPSBwb3NpdGlvbj8ub3B0aW9ucz8uZm9udFNpemUgfHwgMTI7XG4gIGlmICghc2lnbnlvdXJzZWxmICYmIHBvc2l0aW9uPy5pc01vYmlsZSAmJiBwb3NpdGlvbj8uc2NhbGUpIHtcbiAgICByZXR1cm4gZm9udCAvIHBvc2l0aW9uPy5zY2FsZSAvIGNvbnRhaW5lclNjYWxlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmb250IC8gY29udGFpbmVyU2NhbGU7XG4gIH1cbn07XG5cbmNvbnN0IGdldFdpZGdldHNGb250Q29sb3IgPSAodHlwZSkgPT4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwicmVkXCI6XG4gICAgICByZXR1cm4gcmdiKDEsIDAsIDApO1xuICAgIGNhc2UgXCJibGFja1wiOlxuICAgICAgcmV0dXJuIHJnYigwLCAwLCAwKTtcbiAgICBjYXNlIFwiYmx1ZVwiOlxuICAgICAgcmV0dXJuIHJnYigwLCAwLCAxKTtcbiAgICBjYXNlIFwieWVsbG93XCI6XG4gICAgICByZXR1cm4gcmdiKDAuOSwgMSwgMCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiByZ2IoMCwgMCwgMCk7XG4gIH1cbn07XG4vL2Z1bmN0aW9uIGZvciBlbWJlZCBtdWx0aXBsZSBzaWduYXR1cmUgdXNpbmcgcGRmLWxpYlxuZXhwb3J0IGNvbnN0IG11bHRpU2lnbkVtYmVkID0gYXN5bmMgKFxuICB3aWRnZXRzLFxuICBwZGZEb2MsXG4gIHNpZ255b3Vyc2VsZixcbiAgc2NhbGUsXG4gIHBkZk9yaWdpbmFsV0gsXG4gIGNvbnRhaW5lcldIXG4pID0+IHtcbiAgLy8gYGZvbnRCeXRlc2AgaXMgdXNlZCB0byBlbWJlZCBjdXN0b20gZm9udCBpbiBwZGZcbiAgY29uc3QgZm9udEJ5dGVzID0gYXdhaXQgZmlsZWFzYnl0ZXMoXG4gICAgXCJodHRwczovL2Nkbi5vcGVuc2lnbmxhYnMuY29tL3dlYmZvbnRzL3RpbWVzLnR0ZlwiXG4gICk7XG4gIHBkZkRvYy5yZWdpc3RlckZvbnRraXQoZm9udGtpdCk7XG4gIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KGZvbnRCeXRlcywgeyBzdWJzZXQ6IHRydWUgfSk7XG4gIGZvciAobGV0IGl0ZW0gb2Ygd2lkZ2V0cykge1xuICAgIGNvbnN0IGNvbnRhaW5lclNjYWxlID0gZ2V0Q29udGFpbmVyU2NhbGUoXG4gICAgICBwZGZPcmlnaW5hbFdILFxuICAgICAgaXRlbT8ucGFnZU51bWJlcixcbiAgICAgIGNvbnRhaW5lcldIXG4gICAgKTtcbiAgICBjb25zdCB0eXBlRXhpc3QgPSBpdGVtLnBvcy5zb21lKChkYXRhKSA9PiBkYXRhPy50eXBlKTtcbiAgICBsZXQgdXBkYXRlSXRlbTtcblxuICAgIGlmICh0eXBlRXhpc3QpIHtcbiAgICAgIGlmIChzaWdueW91cnNlbGYpIHtcbiAgICAgICAgdXBkYXRlSXRlbSA9IGl0ZW0ucG9zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXBkYXRlSXRlbSA9IGl0ZW0ucG9zLmZpbHRlcihcbiAgICAgICAgICAoZGF0YSkgPT4gZGF0YT8ub3B0aW9ucz8uc3RhdHVzID09PSBcInJlcXVpcmVkXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlSXRlbSA9IGl0ZW0ucG9zO1xuICAgIH1cbiAgICBjb25zdCBwYWdlTm8gPSBpdGVtLnBhZ2VOdW1iZXI7XG4gICAgY29uc3Qgd2lkZ2V0c1Bvc2l0aW9uQXJyID0gdXBkYXRlSXRlbTtcbiAgICBjb25zdCBwYWdlcyA9IHBkZkRvYy5nZXRQYWdlcygpO1xuICAgIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpO1xuICAgIGNvbnN0IHBhZ2UgPSBwYWdlc1twYWdlTm8gLSAxXTtcbiAgICBjb25zdCBpbWFnZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHdpZGdldHNQb3NpdGlvbkFyci5tYXAoYXN5bmMgKHVybCkgPT4ge1xuICAgICAgICBsZXQgc2lnblVybCA9IHVybC5TaWduVXJsICYmIHVybC5TaWduVXJsO1xuICAgICAgICBpZiAoc2lnblVybCkge1xuICAgICAgICAgIGlmICh1cmwuSW1hZ2VUeXBlID09PSBcImltYWdlL3BuZ1wiKSB7XG4gICAgICAgICAgICAvL2Z1bmN0aW9uIGZvciBjb252ZXJ0IHNpZ25hdHVyZSBwbmcgYmFzZTY0IHVybCB0byBqcGVnIGJhc2U2NFxuICAgICAgICAgICAgY29uc3QgbmV3VXJsID0gYXdhaXQgY29udmVydFBOR3RvSlBFRyhzaWduVXJsKTtcbiAgICAgICAgICAgIHNpZ25VcmwgPSBuZXdVcmw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHNpZ25VcmwpO1xuICAgICAgICAgIHJldHVybiByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgd2lkZ2V0c1Bvc2l0aW9uQXJyLmZvckVhY2goYXN5bmMgKHBvc2l0aW9uLCBpZCkgPT4ge1xuICAgICAgbGV0IGltZztcbiAgICAgIGlmIChbXCJzaWduYXR1cmVcIiwgXCJzdGFtcFwiLCBcImluaXRpYWxzXCIsIFwiaW1hZ2VcIl0uaW5jbHVkZXMocG9zaXRpb24udHlwZSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwb3NpdGlvbi5JbWFnZVR5cGUgJiYgcG9zaXRpb24uSW1hZ2VUeXBlID09PSBcImltYWdlL3BuZ1wiKSB8fFxuICAgICAgICAgIHBvc2l0aW9uLkltYWdlVHlwZSA9PT0gXCJpbWFnZS9qcGVnXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgaW1nID0gYXdhaXQgcGRmRG9jLmVtYmVkSnBnKGltYWdlc1tpZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGltZyA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZyhpbWFnZXNbaWRdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghcG9zaXRpb24udHlwZSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHBvc2l0aW9uLkltYWdlVHlwZSAmJiBwb3NpdGlvbi5JbWFnZVR5cGUgPT09IFwiaW1hZ2UvcG5nXCIpIHx8XG4gICAgICAgICAgcG9zaXRpb24uSW1hZ2VUeXBlID09PSBcImltYWdlL2pwZWdcIlxuICAgICAgICApIHtcbiAgICAgICAgICBpbWcgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcoaW1hZ2VzW2lkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW1nID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKGltYWdlc1tpZF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgd2lkZ2V0V2lkdGgsIHdpZGdldEhlaWdodDtcbiAgICAgIHdpZGdldFdpZHRoID0gcGxhY2Vob2xkZXJXaWR0aChwb3NpdGlvbik7XG4gICAgICB3aWRnZXRIZWlnaHQgPSBwbGFjZWhvbGRlckhlaWdodChwb3NpdGlvbik7XG4gICAgICBjb25zdCB4UG9zID0gKHBvc2l0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZVBvcyA9IHBvc2l0aW9uLnhQb3NpdGlvbjtcbiAgICAgICAgLy9maXJzdCB0d28gY29uZGl0aW9uIGhhbmRsZSB0byBvbGQgZGF0YSBhbHJlYWR5IHNhdmVkIGZyb20gbW9iaWxlIHZpZXcgd2hpY2ggc2NhbGUgcG9pbnQgZGlmZnJlbnRcbiAgICAgICAgaWYgKGlzTW9iaWxlICYmIHBvc2l0aW9uLmlzTW9iaWxlKSB7XG4gICAgICAgICAgLy9pZiBwb3MuaXNNb2JpbGUgZmFsc2UgLS0gcGxhY2Vob2xkZXIgc2F2ZWQgZnJvbSBkZXNrdG9wIHZpZXcgdGhlbiBoYW5kbGUgcG9zaXRpb24gaW4gbW9iaWxlIHZpZXcgZGl2aWRlZCBieSBzY2FsZVxuICAgICAgICAgIGNvbnN0IHggPSByZXNpemVQb3MgKiAocG9zaXRpb24uc2NhbGUgLyBzY2FsZSk7XG4gICAgICAgICAgcmV0dXJuIHggKiBzY2FsZTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbi5pc01vYmlsZSAmJiBwb3NpdGlvbi5zY2FsZSkge1xuICAgICAgICAgIGNvbnN0IHggPSByZXNpemVQb3MgKiBwb3NpdGlvbi5zY2FsZTtcbiAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzaXplUG9zO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgeVBvcyA9IChwb3NpdGlvbikgPT4ge1xuICAgICAgICBjb25zdCByZXNpemVQb3MgPSBwb3NpdGlvbi55UG9zaXRpb247XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uLmlzTW9iaWxlICYmIHBvc2l0aW9uLnNjYWxlKSB7XG4gICAgICAgICAgaWYgKHBvc2l0aW9uLklzUmVzaXplKSB7XG4gICAgICAgICAgICBjb25zdCB5ID0gcmVzaXplUG9zICogcG9zaXRpb24uc2NhbGU7XG4gICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeSA9IHJlc2l6ZVBvcyAqIHBvc2l0aW9uLnNjYWxlO1xuICAgICAgICAgICAgcmV0dXJuIHk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXNpemVQb3M7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjb2xvciA9IHBvc2l0aW9uPy5vcHRpb25zPy5mb250Q29sb3I7XG4gICAgICBjb25zdCB1cGRhdGVDb2xvckluUmdiID0gZ2V0V2lkZ2V0c0ZvbnRDb2xvcihjb2xvcik7XG4gICAgICBjb25zdCBmb250U2l6ZSA9IHBhcnNlSW50KHBvc2l0aW9uPy5vcHRpb25zPy5mb250U2l6ZSk7XG4gICAgICBjb25zdCB3aWRnZXRUeXBlRXhpc3QgPSBbXG4gICAgICAgIHRleHRXaWRnZXQsXG4gICAgICAgIHRleHRJbnB1dFdpZGdldCxcbiAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgIFwiY29tcGFueVwiLFxuICAgICAgICBcImpvYiB0aXRsZVwiLFxuICAgICAgICBcImRhdGVcIixcbiAgICAgICAgXCJlbWFpbFwiXG4gICAgICBdLmluY2x1ZGVzKHBvc2l0aW9uLnR5cGUpO1xuICAgICAgaWYgKHBvc2l0aW9uLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgICBsZXQgY2hlY2tib3hHYXBGcm9tVG9wLCBpc0NoZWNrO1xuICAgICAgICBsZXQgeSA9IHlQb3MocG9zaXRpb24pO1xuICAgICAgICBjb25zdCBvcHRpb25zRm9udFNpemUgPSBmb250U2l6ZSB8fCAxMztcbiAgICAgICAgY29uc3QgY2hlY2tib3hTaXplID0gZm9udFNpemU7XG4gICAgICAgIGNvbnN0IGNoZWNrYm94VGV4dEdhcEZyb21MZWZ0ID0gZm9udFNpemUgKyA1IHx8IDIyO1xuICAgICAgICBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcG9zaXRpb24/Lm9wdGlvbnM/LnZhbHVlcy5mb3JFYWNoKChpdGVtLCBpbmQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94UmFuZG9tSWQgPSBcImNoZWNrYm94XCIgKyByYW5kb21JZCgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHBvc2l0aW9uPy5vcHRpb25zPy5yZXNwb25zZSAmJlxuICAgICAgICAgICAgICBwb3NpdGlvbj8ub3B0aW9ucz8ucmVzcG9uc2U/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpc0NoZWNrID0gcG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlPy5pbmNsdWRlcyhpbmQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICAgIGlzQ2hlY2sgPSBwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlPy5pbmNsdWRlcyhpbmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjaGVja2JveCA9IGZvcm0uY3JlYXRlQ2hlY2tCb3goY2hlY2tib3hSYW5kb21JZCk7XG5cbiAgICAgICAgICAgIGlmIChpbmQgPiAwKSB7XG4gICAgICAgICAgICAgIHkgPSB5ICsgY2hlY2tib3hHYXBGcm9tVG9wO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2hlY2tib3hHYXBGcm9tVG9wID0gZm9udFNpemUgKyA1IHx8IDI2O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXBvc2l0aW9uPy5vcHRpb25zPy5pc0hpZGVMYWJlbCkge1xuICAgICAgICAgICAgICAvLyBiZWxvdyBsaW5lIG9mIGNvZGUgaXMgdXNlZCB0byBlbWJlZCBsYWJlbCB3aXRoIHJhZGlvIGJ1dHRvbiBpbiBwZGZcbiAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uc1Bvc2l0aW9uID0gY29tcGVuc2F0ZVJvdGF0aW9uKFxuICAgICAgICAgICAgICAgIHBhZ2UuZ2V0Um90YXRpb24oKS5hbmdsZSxcbiAgICAgICAgICAgICAgICB4UG9zKHBvc2l0aW9uKSArIGNoZWNrYm94VGV4dEdhcEZyb21MZWZ0LFxuICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICBwYWdlLmdldFNpemUoKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zRm9udFNpemUsXG4gICAgICAgICAgICAgICAgdXBkYXRlQ29sb3JJblJnYixcbiAgICAgICAgICAgICAgICBmb250LFxuICAgICAgICAgICAgICAgIHBhZ2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcGFnZS5kcmF3VGV4dChpdGVtLCBvcHRpb25zUG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNoZWNrYm94T2JqID0ge1xuICAgICAgICAgICAgICB4OiB4UG9zKHBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgeTogeSxcbiAgICAgICAgICAgICAgd2lkdGg6IGNoZWNrYm94U2l6ZSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBjaGVja2JveFNpemVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjaGVja2JveE9iaiA9IGdldFdpZGdldFBvc2l0aW9uKHBhZ2UsIGNoZWNrYm94T2JqLCAxKTtcbiAgICAgICAgICAgIGNoZWNrYm94LmFkZFRvUGFnZShwYWdlLCBjaGVja2JveE9iaik7XG5cbiAgICAgICAgICAgIC8vYXBwbGllZCB3aGljaCBjaGVja2JveCBzaG91bGQgYmUgY2hlY2tlZFxuICAgICAgICAgICAgaWYgKGlzQ2hlY2spIHtcbiAgICAgICAgICAgICAgY2hlY2tib3guY2hlY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNoZWNrYm94LnVuY2hlY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoZWNrYm94LmVuYWJsZVJlYWRPbmx5KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAod2lkZ2V0VHlwZUV4aXN0KSB7XG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gY2FsY3VsYXRlRm9udFNpemUoXG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgY29udGFpbmVyU2NhbGUsXG4gICAgICAgICAgc2lnbnlvdXJzZWxmXG4gICAgICAgICk7XG4gICAgICAgIHBhcnNlSW50KGZvbnRTaXplKTtcbiAgICAgICAgbGV0IHRleHRDb250ZW50O1xuICAgICAgICBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlKSB7XG4gICAgICAgICAgdGV4dENvbnRlbnQgPSBwb3NpdGlvbi5vcHRpb25zPy5yZXNwb25zZTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgdGV4dENvbnRlbnQgPSBwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpeGVkV2lkdGggPSB3aWRnZXRXaWR0aDsgLy8gU2V0IHlvdXIgZml4ZWQgd2lkdGhcbiAgICAgICAgY29uc3QgaXNOZXdPbkVudGVyTGluZUV4aXN0ID0gdGV4dENvbnRlbnQuaW5jbHVkZXMoXCJcXG5cIik7XG5cbiAgICAgICAgLy8gRnVuY3Rpb24gdG8gYnJlYWsgdGV4dCBpbnRvIGxpbmVzIGJhc2VkIG9uIHRoZSBmaXhlZCB3aWR0aFxuICAgICAgICBjb25zdCBOZXdicmVha1RleHRJbnRvTGluZXMgPSAodGV4dENvbnRlbnQsIHdpZHRoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAgICAgICBsZXQgY3VycmVudExpbmUgPSBcIlwiO1xuXG4gICAgICAgICAgZm9yIChjb25zdCB3b3JkIG9mIHRleHRDb250ZW50LnNwbGl0KFwiIFwiKSkge1xuICAgICAgICAgICAgLy9nZXQgdGV4dCBsaW5lIHdpZHRoXG4gICAgICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKFxuICAgICAgICAgICAgICBgJHtjdXJyZW50TGluZX0gJHt3b3JkfWAsXG4gICAgICAgICAgICAgIGZvbnRTaXplXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy9jaGVjayB0ZXh0IGNvbnRlbnQgbGluZSB3aWR0aCBpcyBsZXNzIG9yIGVxdWFsIHRvIGNvbnRhaW5lciB3aWR0aFxuICAgICAgICAgICAgaWYgKGxpbmVXaWR0aCA8PSB3aWR0aCkge1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSArPSBgICR7d29yZH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZS50cmltKCkpO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IGAke3dvcmR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZS50cmltKCkpO1xuICAgICAgICAgIHJldHVybiBsaW5lcztcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBGdW5jdGlvbiB0byBicmVhayB0ZXh0IGludG8gbGluZXMgYmFzZWQgb24gd2hlbiB1c2VyIGdvIG5leHQgbGluZSBvbiBwcmVzcyBlbnRlciBidXR0b25cbiAgICAgICAgY29uc3QgYnJlYWtUZXh0SW50b0xpbmVzID0gKHRleHRDb250ZW50LCB3aWR0aCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxpbmVzID0gW107XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHdvcmQgb2YgdGV4dENvbnRlbnQuc3BsaXQoXCJcXG5cIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUoYCR7d29yZH1gLCBmb250U2l6ZSk7XG4gICAgICAgICAgICAvL2NoZWNraW5nIHN0cmluZyBsZW5ndGggdG8gY29udGFpbmVyIHdpZHRoXG4gICAgICAgICAgICAvL2lmIHN0cmluZyBsZW5ndGggaXMgbGVzcyB0aGVuIGNvbnRhaW5lciB3aWR0aCBpdCBtZWFucyB1c2VyIHByZXNzIGVudGVyIGJ1dHRvblxuICAgICAgICAgICAgaWYgKGxpbmVXaWR0aCA8PSB3aWR0aCkge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKHdvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9lbHNlIGFkanVzdCB0ZXh0IGNvbnRlbnQgYWNjb3JkaW5nIHRvIHdpZHRoIGFuZCBzZW5kIGl0IGluIG5ldyBsaW5lXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3TGluZSA9IE5ld2JyZWFrVGV4dEludG9MaW5lcyh3b3JkLCB3aWR0aCk7XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goLi4ubmV3TGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGxpbmVzO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vY2hlY2sgaWYgdGV4dCBjb250ZW50IGhhdmUgYFxcbmAgc3RyaW5nIGl0IG1lYW5zIHVzZXIgcHJlc3MgZW50ZXIgdG8gZ28gbmV4dCBsaW5lIGFuZCBoYW5kbGUgY29uZGl0aW9uXG4gICAgICAgIC8vZWxzZSBhdXRvIGFkanVzdCB0ZXh0IGNvbnRlbnQgYWNjb3JkaW5nIHRvIGNvbnRhaW5lciB3aWR0aFxuICAgICAgICBjb25zdCBsaW5lcyA9IGlzTmV3T25FbnRlckxpbmVFeGlzdFxuICAgICAgICAgID8gYnJlYWtUZXh0SW50b0xpbmVzKHRleHRDb250ZW50LCBmaXhlZFdpZHRoKVxuICAgICAgICAgIDogTmV3YnJlYWtUZXh0SW50b0xpbmVzKHRleHRDb250ZW50LCBmaXhlZFdpZHRoKTtcbiAgICAgICAgLy8gU2V0IGluaXRpYWwgeS1jb29yZGluYXRlIGZvciB0aGUgZmlyc3QgbGluZVxuICAgICAgICBsZXQgeCA9IHhQb3MocG9zaXRpb24pO1xuICAgICAgICBsZXQgeSA9IHlQb3MocG9zaXRpb24pO1xuICAgICAgICAvLyBFbWJlZCBlYWNoIGxpbmUgb24gdGhlIHBhZ2VcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgY29uc3QgdGV4dFBvc2l0aW9uID0gY29tcGVuc2F0ZVJvdGF0aW9uKFxuICAgICAgICAgICAgcGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlLFxuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIHksXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgcGFnZS5nZXRTaXplKCksXG4gICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgIHVwZGF0ZUNvbG9ySW5SZ2IsXG4gICAgICAgICAgICBmb250LFxuICAgICAgICAgICAgcGFnZVxuICAgICAgICAgICk7XG4gICAgICAgICAgcGFnZS5kcmF3VGV4dChsaW5lLCB0ZXh0UG9zaXRpb24pO1xuICAgICAgICAgIHkgKz0gMTg7IC8vIEFkanVzdCB0aGUgbGluZSBoZWlnaHQgYXMgbmVlZGVkXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24udHlwZSA9PT0gXCJkcm9wZG93blwiKSB7XG4gICAgICAgIGNvbnN0IGZvbnRzaXplID0gcGFyc2VJbnQocG9zaXRpb24/Lm9wdGlvbnM/LmZvbnRTaXplKSB8fCAxMjtcblxuICAgICAgICBjb25zdCBkcm9wZG93blJhbmRvbUlkID0gXCJkcm9wZG93blwiICsgcmFuZG9tSWQoKTtcbiAgICAgICAgY29uc3QgZHJvcGRvd24gPSBmb3JtLmNyZWF0ZURyb3Bkb3duKGRyb3Bkb3duUmFuZG9tSWQpO1xuICAgICAgICBkcm9wZG93bi5hZGRPcHRpb25zKHBvc2l0aW9uPy5vcHRpb25zPy52YWx1ZXMpO1xuICAgICAgICBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlKSB7XG4gICAgICAgICAgZHJvcGRvd24uc2VsZWN0KHBvc2l0aW9uLm9wdGlvbnM/LnJlc3BvbnNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgZHJvcGRvd24uc2VsZWN0KHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlZmluZSB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIHN0cmluZ1xuICAgICAgICAvLyBFeGFtcGxlIGZvcm1hdDogYC9Gb250TmFtZSBGb250U2l6ZSBUZiAwIGdgIHdoZXJlOlxuICAgICAgICAvLyAtIGAvRm9udE5hbWVgIGlzIHRoZSBuYW1lIG9mIHRoZSBmb250IChlLmcuLCBgL0hlbHZgIGZvciBIZWx2ZXRpY2EpXG4gICAgICAgIC8vIC0gYEZvbnRTaXplYCBpcyB0aGUgc2l6ZSB5b3Ugd2FudCB0byBzZXQgKGUuZy4sIDEyKVxuICAgICAgICAvLyAtIGBUZmAgc3BlY2lmaWVzIHRoZSBmb250IGFuZCBzaXplXG4gICAgICAgIC8vIC0gYDAgZ2Agc2V0cyB0aGUgdGV4dCBjb2xvciB0byBibGFja1xuICAgICAgICBjb25zdCBkZWZhdWx0QXBwZWFyYW5jZSA9IGAvSGVsdiAke2ZvbnRzaXplfSBUZiAwIGdgO1xuICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBmb3IgdGhlIGRyb3Bkb3duIGZpZWxkXG4gICAgICAgIGRyb3Bkb3duLmFjcm9GaWVsZC5zZXREZWZhdWx0QXBwZWFyYW5jZShkZWZhdWx0QXBwZWFyYW5jZSk7XG4gICAgICAgIGRyb3Bkb3duLnNldEZvbnRTaXplKGZvbnRzaXplKTtcbiAgICAgICAgY29uc3QgZHJvcGRvd25PYmogPSB7XG4gICAgICAgICAgeDogeFBvcyhwb3NpdGlvbiksXG4gICAgICAgICAgeTogeVBvcyhwb3NpdGlvbiksXG4gICAgICAgICAgd2lkdGg6IHdpZGdldFdpZHRoLFxuICAgICAgICAgIGhlaWdodDogd2lkZ2V0SGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRyb3Bkb3duT3B0aW9uID0gZ2V0V2lkZ2V0UG9zaXRpb24ocGFnZSwgZHJvcGRvd25PYmosIDEpO1xuICAgICAgICBjb25zdCBkcm9wZG93blNlbGVjdGVkID0geyAuLi5kcm9wZG93bk9wdGlvbiwgZm9udDogZm9udCB9O1xuICAgICAgICBkcm9wZG93bi5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoZm9udCk7XG4gICAgICAgIGRyb3Bkb3duLmFkZFRvUGFnZShwYWdlLCBkcm9wZG93blNlbGVjdGVkKTtcbiAgICAgICAgZHJvcGRvd24uZW5hYmxlUmVhZE9ubHkoKTtcbiAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24udHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQpIHtcbiAgICAgICAgY29uc3QgcmFkaW9SYW5kb21JZCA9IFwicmFkaW9cIiArIHJhbmRvbUlkKCk7XG4gICAgICAgIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmNyZWF0ZVJhZGlvR3JvdXAocmFkaW9SYW5kb21JZCk7XG4gICAgICAgIGxldCByYWRpb09wdGlvbkdhcEZyb21Ub3A7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGb250U2l6ZSA9IGZvbnRTaXplIHx8IDEzO1xuICAgICAgICBjb25zdCByYWRpb1RleHRHYXBGcm9tTGVmdCA9IGZvbnRTaXplICsgNSB8fCAyMDtcbiAgICAgICAgY29uc3QgcmFkaW9TaXplID0gZm9udFNpemU7XG4gICAgICAgIGxldCB5ID0geVBvcyhwb3NpdGlvbik7XG4gICAgICAgIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8udmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwb3NpdGlvbj8ub3B0aW9ucz8udmFsdWVzLmZvckVhY2goKGl0ZW0sIGluZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGluZCA+IDApIHtcbiAgICAgICAgICAgICAgeSA9IHkgKyByYWRpb09wdGlvbkdhcEZyb21Ub3A7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByYWRpb09wdGlvbkdhcEZyb21Ub3AgPSBmb250U2l6ZSArIDEwIHx8IDI1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwb3NpdGlvbj8ub3B0aW9ucz8uaXNIaWRlTGFiZWwpIHtcbiAgICAgICAgICAgICAgLy8gYmVsb3cgbGluZSBvZiBjb2RlIGlzIHVzZWQgdG8gZW1iZWQgbGFiZWwgd2l0aCByYWRpbyBidXR0b24gaW4gcGRmXG5cbiAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uc1Bvc2l0aW9uID0gY29tcGVuc2F0ZVJvdGF0aW9uKFxuICAgICAgICAgICAgICAgIHBhZ2UuZ2V0Um90YXRpb24oKS5hbmdsZSxcbiAgICAgICAgICAgICAgICB4UG9zKHBvc2l0aW9uKSArIHJhZGlvVGV4dEdhcEZyb21MZWZ0LFxuICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICBwYWdlLmdldFNpemUoKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zRm9udFNpemUsXG4gICAgICAgICAgICAgICAgdXBkYXRlQ29sb3JJblJnYixcbiAgICAgICAgICAgICAgICBmb250LFxuICAgICAgICAgICAgICAgIHBhZ2VcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBwYWdlLmRyYXdUZXh0KGl0ZW0sIG9wdGlvbnNQb3NpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmFkaW9PYmogPSB7XG4gICAgICAgICAgICAgIHg6IHhQb3MocG9zaXRpb24pLFxuICAgICAgICAgICAgICB5OiB5LFxuICAgICAgICAgICAgICB3aWR0aDogcmFkaW9TaXplLFxuICAgICAgICAgICAgICBoZWlnaHQ6IHJhZGlvU2l6ZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmFkaW9PYmogPSBnZXRXaWRnZXRQb3NpdGlvbihwYWdlLCByYWRpb09iaiwgMSk7XG4gICAgICAgICAgICByYWRpb0dyb3VwLmFkZE9wdGlvblRvUGFnZShpdGVtLCBwYWdlLCByYWRpb09iaik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5yZXNwb25zZSkge1xuICAgICAgICAgIHJhZGlvR3JvdXAuc2VsZWN0KHBvc2l0aW9uLm9wdGlvbnM/LnJlc3BvbnNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgcmFkaW9Hcm91cC5zZWxlY3QocG9zaXRpb24/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmFkaW9Hcm91cC5lbmFibGVSZWFkT25seSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0ge1xuICAgICAgICAgIHg6IHhQb3MocG9zaXRpb24pLFxuICAgICAgICAgIHk6IHlQb3MocG9zaXRpb24pLFxuICAgICAgICAgIHdpZHRoOiB3aWRnZXRXaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHdpZGdldEhlaWdodFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGltYWdlT3B0aW9ucyA9IGdldFdpZGdldFBvc2l0aW9uKHBhZ2UsIHNpZ25hdHVyZSwgMSk7XG4gICAgICAgIHBhZ2UuZHJhd0ltYWdlKGltZywgaW1hZ2VPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBjb25zdCBwZGZCeXRlcyA9IGF3YWl0IHBkZkRvYy5zYXZlQXNCYXNlNjQoeyB1c2VPYmplY3RTdHJlYW1zOiBmYWxzZSB9KTtcbiAgLy9jb25zb2xlLmxvZyhcInBkZlwiLCBwZGZCeXRlcyk7XG4gIHJldHVybiBwZGZCeXRlcztcbn07XG5cbi8vIGZ1bmN0aW9uIGZvciB2YWxpZGF0aW5nIFVSTHNcbmV4cG9ydCBmdW5jdGlvbiB1cmxWYWxpZGF0b3IodXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgbmV3VXJsID0gbmV3IFVSTCh1cmwpO1xuICAgIHJldHVybiBuZXdVcmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIiB8fCBuZXdVcmwucHJvdG9jb2wgPT09IFwiaHR0cHM6XCI7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLy9jYWxjdWxhdGUgcGxhY2Vob2xkZXIgd2lkdGggdG8gZW1iZWQgaW4gcGRmXG5leHBvcnQgY29uc3QgcGxhY2Vob2xkZXJXaWR0aCA9IChwb3MpID0+IHtcbiAgY29uc3QgZGVmYXVsdFdpZHRoID0gZGVmYXVsdFdpZHRoSGVpZ2h0KHBvcy50eXBlKS53aWR0aDtcbiAgY29uc3QgcG9zV2lkdGggPSBwb3MuV2lkdGggfHwgZGVmYXVsdFdpZHRoO1xuXG4gIC8vY29uZGl0aW9uIHRvIGhhbmRsZSBvbGQgZGF0YSBzYXZlZCBmcm9tIG1vYmlsZSB2aWV3IHRvIGdldCB3aWR0aGhcbiAgaWYgKHBvcy5pc01vYmlsZSAmJiBwb3Muc2NhbGUpIHtcbiAgICBpZiAocG9zLklzUmVzaXplKSB7XG4gICAgICByZXR1cm4gcG9zV2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwb3NXaWR0aCAqIHBvcy5zY2FsZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBvc1dpZHRoO1xuICB9XG59O1xuXG4vL2NhbGN1bGF0ZSBwbGFjZWhvbGRlciBoZWlnaHQgdG8gZW1iZWQgaW4gcGRmXG5leHBvcnQgY29uc3QgcGxhY2Vob2xkZXJIZWlnaHQgPSAocG9zKSA9PiB7XG4gIGNvbnN0IHBvc0hlaWdodCA9IHBvcy5IZWlnaHQ7XG4gIGNvbnN0IGRlZmF1bHRIZWlnaHQgPSBkZWZhdWx0V2lkdGhIZWlnaHQocG9zLnR5cGUpLmhlaWdodDtcbiAgY29uc3QgcG9zVXBkYXRlSGVpZ2h0ID0gcG9zSGVpZ2h0IHx8IGRlZmF1bHRIZWlnaHQ7XG5cbiAgLy9jb25kaXRpb24gdG8gaGFuZGxlIG9sZCBkYXRhIHNhdmVkIGZyb20gbW9iaWxlIHZpZXcgdG8gZ2V0IGhlaWdodFxuICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xuICAgIGlmIChwb3MuSXNSZXNpemUpIHtcbiAgICAgIHJldHVybiBwb3NVcGRhdGVIZWlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwb3NVcGRhdGVIZWlnaHQgKiBwb3Muc2NhbGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwb3NVcGRhdGVIZWlnaHQ7XG4gIH1cbn07XG5cbi8vZnVuY3Rpb24gZm9yIGdldHRpbmcgY29udHJhY3RzX2NvbnRhY3Rib29rIGRldGFpbHNcbmV4cG9ydCBjb25zdCBjb250YWN0Qm9vayA9IGFzeW5jIChvYmplY3RJZCkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBheGlvc1xuICAgIC5nZXQoXG4gICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgICAgXCJiYXNlVXJsXCJcbiAgICAgICl9Y2xhc3Nlcy9jb250cmFjdHNfQ29udGFjdGJvb2s/d2hlcmU9e1wib2JqZWN0SWRcIjpcIiR7b2JqZWN0SWR9XCJ9YCxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICAgIC50aGVuKChMaXN0ZGF0YSkgPT4ge1xuICAgICAgY29uc3QganNvbiA9IExpc3RkYXRhLmRhdGE7XG4gICAgICBjb25zdCByZXMgPSBqc29uLnJlc3VsdHM7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pXG5cbiAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJFcnIgaW4gY29udHJhY3RzX0NvbnRhY3Rib29rIGNsYXNzIFwiLCBlcnIpO1xuICAgICAgcmV0dXJuIFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiO1xuICAgIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy9mdW5jdGlvbiBmb3IgZ2V0dGluZyBkb2N1bWVudCBkZXRhaWxzIGZyb20gY29udHJhY3RfRG9jdW1lbnRzIGNsYXNzXG5leHBvcnQgY29uc3QgY29udHJhY3REb2N1bWVudCA9IGFzeW5jIChkb2N1bWVudElkKSA9PiB7XG4gIGNvbnN0IGRhdGEgPSB7XG4gICAgZG9jSWQ6IGRvY3VtZW50SWRcbiAgfTtcbiAgY29uc3QgZG9jdW1lbnREZWF0aWxzID0gYXdhaXQgYXhpb3NcbiAgICAucG9zdChgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2dldERvY3VtZW50YCwgZGF0YSwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbigoTGlzdGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGpzb24gPSBMaXN0ZGF0YS5kYXRhO1xuICAgICAgbGV0IGRhdGEgPSBbXTtcbiAgICAgIGlmIChqc29uICYmIGpzb24ucmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgICAgfSBlbHNlIGlmIChqc29uICYmIGpzb24ucmVzdWx0KSB7XG4gICAgICAgIGRhdGEucHVzaChqc29uLnJlc3VsdCk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGdldERvY3VtZW50IGNsb3VkIGZ1bmN0aW9uIFwiLCBlcnIpO1xuICAgICAgcmV0dXJuIFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiO1xuICAgIH0pO1xuXG4gIHJldHVybiBkb2N1bWVudERlYXRpbHM7XG59O1xuXG4vL2Z1bmN0aW9uIGZvciBhZGQgZGVmYXVsdCBzaWduYXR1cmUgb3IgaW1hZ2UgZm9yIGFsbCByZXF1ZXN0ZWQgbG9jYXRpb25cbmV4cG9ydCBjb25zdCBhZGREZWZhdWx0U2lnbmF0dXJlSW1nID0gKHh5UG9zdGlvbiwgZGVmYXVsdFNpZ25JbWcpID0+IHtcbiAgbGV0IGltZ1dIID0geyB3aWR0aDogXCJcIiwgaGVpZ2h0OiBcIlwiIH07XG4gIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICBpbWcuc3JjID0gZGVmYXVsdFNpZ25JbWc7XG4gIGlmIChpbWcuY29tcGxldGUpIHtcbiAgICBpbWdXSCA9IHtcbiAgICAgIHdpZHRoOiBpbWcud2lkdGgsXG4gICAgICBoZWlnaHQ6IGltZy5oZWlnaHRcbiAgICB9O1xuICB9XG5cbiAgbGV0IHh5RGVmYXVsdFBvcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHh5UG9zdGlvbi5sZW5ndGg7IGkrKykge1xuICAgIGxldCBnZXRJTUdXSDtcbiAgICBjb25zdCBnZXRYWWRhdGEgPSB4eVBvc3Rpb25baV0ucG9zO1xuICAgIGNvbnN0IGdldFBhZ2VObyA9IHh5UG9zdGlvbltpXS5wYWdlTnVtYmVyO1xuICAgIGNvbnN0IGdldFBvc0RhdGEgPSBnZXRYWWRhdGE7XG5cbiAgICBjb25zdCBhZGRTaWduID0gZ2V0UG9zRGF0YS5tYXAoKHBvc2l0aW9uKSA9PiB7XG4gICAgICBnZXRJTUdXSCA9IGNhbGN1bGF0ZUltZ0FzcGVjdFJhdGlvKGltZ1dILCBwb3NpdGlvbik7XG4gICAgICBpZiAocG9zaXRpb24udHlwZSkge1xuICAgICAgICBpZiAocG9zaXRpb24/LnR5cGUgPT09IFwic2lnbmF0dXJlXCIpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgICAgICBTaWduVXJsOiBkZWZhdWx0U2lnbkltZyxcbiAgICAgICAgICAgIFdpZHRoOiBnZXRJTUdXSC5uZXdXaWR0aCxcbiAgICAgICAgICAgIEhlaWdodDogZ2V0SU1HV0gubmV3SGVpZ2h0LFxuICAgICAgICAgICAgSW1hZ2VUeXBlOiBcImRlZmF1bHRcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IGRlZmF1bHRTaWduSW1nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiAmJiAhcG9zaXRpb24uaXNTdGFtcCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgIFNpZ25Vcmw6IGRlZmF1bHRTaWduSW1nLFxuICAgICAgICAgIFdpZHRoOiBnZXRJTUdXSC5uZXdXaWR0aCxcbiAgICAgICAgICBIZWlnaHQ6IGdldElNR1dILm5ld0hlaWdodCxcbiAgICAgICAgICBJbWFnZVR5cGU6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXG4gICAgICAgICAgICByZXNwb25zZTogZGVmYXVsdFNpZ25JbWdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfSk7XG5cbiAgICBjb25zdCBuZXdYeXBvcyA9IHtcbiAgICAgIHBhZ2VOdW1iZXI6IGdldFBhZ2VObyxcbiAgICAgIHBvczogYWRkU2lnblxuICAgIH07XG4gICAgeHlEZWZhdWx0UG9zLnB1c2gobmV3WHlwb3MpO1xuICB9XG4gIHJldHVybiB4eURlZmF1bHRQb3M7XG59O1xuXG4vL2Z1bmN0aW9uIGZvciBjcmVhdGUgbGlzdCBvZiB5ZWFyIGZvciBkYXRlIHdpZGdldFxuZXhwb3J0IGNvbnN0IHJhbmdlID0gKHN0YXJ0LCBlbmQsIHN0ZXApID0+IHtcbiAgY29uc3QgcmFuZ2UgPSBbXTtcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSArPSBzdGVwKSB7XG4gICAgcmFuZ2UucHVzaChpKTtcbiAgfVxuICByZXR1cm4gcmFuZ2U7XG59O1xuLy9mdW5jdGlvbiBmb3IgZ2V0IG1vbnRoXG5leHBvcnQgY29uc3QgZ2V0TW9udGggPSAoZGF0ZSkgPT4ge1xuICBjb25zdCBuZXdNb250aCA9IG5ldyBEYXRlKGRhdGUpLmdldE1vbnRoKCk7XG4gIHJldHVybiBuZXdNb250aDtcbn07XG5cbi8vZnVuY3Rpb24gZm9yIGdldCB5ZWFyXG5leHBvcnQgY29uc3QgZ2V0WWVhciA9IChkYXRlKSA9PiB7XG4gIGNvbnN0IG5ld1llYXIgPSBuZXcgRGF0ZShkYXRlKS5nZXRGdWxsWWVhcigpO1xuICByZXR1cm4gbmV3WWVhcjtcbn07XG5cbi8vZnVuY3Rpb24gdG8gY3JlYXRlL2NvcHkgd2lkZ2V0IG5leHQgdG8gYWxyZWFkeSBkcm9wcGVkIHdpZGdldFxuZXhwb3J0IGNvbnN0IGhhbmRsZUNvcHlOZXh0VG9XaWRnZXQgPSAoXG4gIHBvc2l0aW9uLFxuICB3aWRnZXRUeXBlLFxuICB4eVBvc3Rpb24sXG4gIGluZGV4LFxuICBzZXRYeVBvc3Rpb24sXG4gIHVzZXJJZFxuKSA9PiB7XG4gIGxldCBmaWx0ZXJTaWduZXJQb3M7XG4gIC8vZ2V0IHBvc2l0aW9uIG9mIHByZXZpb3VzIHdpZGdldCBhbmQgY3JlYXRlIG5ldyB3aWRnZXQgbmV4dCB0byB0aGF0IHdpZGdldCBvbiBzYW1lIGRhdGEgZXhjZXB0XG4gIC8vIHhQb3NpdGlvbiBhbmQga2V5XG4gIGxldCBuZXdwb3NpdGlvbiA9IHBvc2l0aW9uO1xuICBjb25zdCBjYWxjdWxhdGVYUG9zaXRpb24gPVxuICAgIHBhcnNlSW50KHBvc2l0aW9uLnhQb3NpdGlvbikgK1xuICAgIGRlZmF1bHRXaWR0aEhlaWdodCh3aWRnZXRUeXBlKS53aWR0aCArXG4gICAgcmVzaXplQm9yZGVyRXh0cmFXaWR0aCgpO1xuICBjb25zdCBuZXdJZCA9IHJhbmRvbUlkKCk7XG4gIG5ld3Bvc2l0aW9uID0geyAuLi5uZXdwb3NpdGlvbiwgeFBvc2l0aW9uOiBjYWxjdWxhdGVYUG9zaXRpb24sIGtleTogbmV3SWQgfTtcbiAgLy9pZiBjb25kaXRpb24gdG8gY3JlYXRlIHdpZGdldCBpbiByZXF1ZXN0LXNpZ24gZmxvd1xuICBpZiAodXNlcklkKSB7XG4gICAgZmlsdGVyU2lnbmVyUG9zID0geHlQb3N0aW9uLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5JZCA9PT0gdXNlcklkKTtcbiAgICBjb25zdCBnZXRQbGFjZUhvbGRlciA9IGZpbHRlclNpZ25lclBvcyAmJiBmaWx0ZXJTaWduZXJQb3NbMF0/LnBsYWNlSG9sZGVyO1xuICAgIGNvbnN0IGdldFBhZ2VOdW1lciA9IGdldFBsYWNlSG9sZGVyPy5maWx0ZXIoXG4gICAgICAoZGF0YSkgPT4gZGF0YS5wYWdlTnVtYmVyID09PSBpbmRleFxuICAgICk7XG4gICAgY29uc3QgZ2V0WFlkYXRhID0gZ2V0UGFnZU51bWVyICYmIGdldFBhZ2VOdW1lclswXT8ucG9zO1xuICAgIGdldFhZZGF0YS5wdXNoKG5ld3Bvc2l0aW9uKTtcbiAgICBpZiAoZ2V0UGFnZU51bWVyICYmIGdldFBhZ2VOdW1lci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdVcGRhdGVTaWduUG9zID0gZ2V0UGxhY2VIb2xkZXIubWFwKChvYmopID0+IHtcbiAgICAgICAgaWYgKG9iai5wYWdlTnVtYmVyID09PSBpbmRleCkge1xuICAgICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiBnZXRYWWRhdGEgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25lciA9IHh5UG9zdGlvbi5tYXAoKG9iaikgPT4ge1xuICAgICAgICBpZiAob2JqLklkID09PSB1c2VySWQpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBuZXdVcGRhdGVTaWduUG9zIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH0pO1xuXG4gICAgICBzZXRYeVBvc3Rpb24obmV3VXBkYXRlU2lnbmVyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGdldFhZZGF0YSA9IHh5UG9zdGlvbltpbmRleF0/LnBvcyB8fCBbXTtcbiAgICBnZXRYWWRhdGEucHVzaChuZXdwb3NpdGlvbik7XG4gICAgY29uc3QgdXBkYXRlUGxhY2Vob2xkZXIgPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xuICAgICAgaWYgKGluZCA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IGdldFhZZGF0YSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9KTtcblxuICAgIHNldFh5UG9zdGlvbih1cGRhdGVQbGFjZWhvbGRlcik7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlTmFtZSA9IChmaWxlVXJsKSA9PiB7XG4gIGlmIChmaWxlVXJsKSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChmaWxlVXJsKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHVybC5wYXRobmFtZS5zdWJzdHJpbmcodXJsLnBhdGhuYW1lLmluZGV4T2YoXCJfXCIpICsgMSk7XG4gICAgcmV0dXJuIGZpbGVuYW1lIHx8IFwiXCI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbn07XG5cbi8vZmV0Y2ggdGVuYW50IGFwcCBsb2dvIGZyb20gYHBhcnRuZXJzX1RlbmFudGAgY2xhc3MgYnkgZG9tYWluIG5hbWVcbmV4cG9ydCBjb25zdCBnZXRBcHBMb2dvID0gYXN5bmMgKCkgPT4ge1xuICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3QgPT09IFwiYXBwLm9wZW5zaWdubGFicy5jb21cIikge1xuICAgIHJldHVybiB7IGxvZ286IGFwcEluZm8uYXBwbG9nbywgdXNlcjogXCJleGlzdFwiIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZG9tYWluID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IFBhcnNlLkNsb3VkLnJ1bihcImdldGxvZ29ieWRvbWFpblwiLCB7XG4gICAgICAgIGRvbWFpbjogZG9tYWluXG4gICAgICB9KTtcbiAgICAgIGlmICh0ZW5hbnQpIHtcbiAgICAgICAgcmV0dXJuIHsgbG9nbzogdGVuYW50Py5sb2dvLCB1c2VyOiB0ZW5hbnQ/LnVzZXIgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGdldGxvZ28gXCIsIGVycik7XG4gICAgICByZXR1cm4geyBsb2dvOiBhcHBJbmZvLmFwcGxvZ28sIHVzZXI6IFwiZXhpc3RcIiB9O1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbmFudERldGFpbHMgPSBhc3luYyAob2JqZWN0SWQpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0ZW5hbnRDcmVkaXRzUXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJwYXJ0bmVyc19UZW5hbnRcIik7XG4gICAgdGVuYW50Q3JlZGl0c1F1ZXJ5LmVxdWFsVG8oXCJVc2VySWRcIiwge1xuICAgICAgX190eXBlOiBcIlBvaW50ZXJcIixcbiAgICAgIGNsYXNzTmFtZTogXCJfVXNlclwiLFxuICAgICAgb2JqZWN0SWQ6IG9iamVjdElkXG4gICAgfSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGVuYW50Q3JlZGl0c1F1ZXJ5LmZpcnN0KCk7XG4gICAgaWYgKHJlcykge1xuICAgICAgY29uc3QgdXBkYXRlUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZXM7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIFwidXNlciBkb2VzIG5vdCBleGlzdCFcIjtcbiAgfVxufTtcblxuLy9mdW5jdGlvbiB0byBjb252ZXJ0IHZhcmlhYmxlIHN0cmluZyBuYW1lIHRvIHZhcmlhYmxlIHZhbHVlIG9mIGVtYWlsIGJvZHkgYW5kIHN1YmplY3RcbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlTWFpbFZhcmlibGVzKHN1YmplY3QsIGJvZHksIHZhcmlhYmxlcykge1xuICBsZXQgcmVwbGFjZWRTdWJqZWN0ID0gc3ViamVjdDtcbiAgbGV0IHJlcGxhY2VkQm9keSA9IGJvZHk7XG5cbiAgZm9yIChjb25zdCB2YXJpYWJsZSBpbiB2YXJpYWJsZXMpIHtcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYHt7JHt2YXJpYWJsZX19fWAsIFwiZ1wiKTtcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgcmVwbGFjZWRTdWJqZWN0ID0gcmVwbGFjZWRTdWJqZWN0LnJlcGxhY2UocmVnZXgsIHZhcmlhYmxlc1t2YXJpYWJsZV0pO1xuICAgIH1cbiAgICBpZiAoYm9keSkge1xuICAgICAgcmVwbGFjZWRCb2R5ID0gcmVwbGFjZWRCb2R5LnJlcGxhY2UocmVnZXgsIHZhcmlhYmxlc1t2YXJpYWJsZV0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBzdWJqZWN0OiByZXBsYWNlZFN1YmplY3QsXG4gICAgYm9keTogcmVwbGFjZWRCb2R5XG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBjb3B5dG9EYXRhID0gKHVybCkgPT4ge1xuICAvLyBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KTtcbiAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQpIHtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh1cmwpO1xuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgbmF2aWdhdG9yLmNsaXBib2FyZFxuICAgIGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgIHRleHRBcmVhLnZhbHVlID0gdXJsO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dEFyZWEpO1xuICAgIHRleHRBcmVhLnNlbGVjdCgpO1xuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRleHRBcmVhKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRQZGZBcnJheUJ1ZmZlciA9IGFzeW5jICh1cmwpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsIChzdGF0dXMgMjAwKVxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVybiBcIkVycm9yXCI7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgdGhlIHJlc3BvbnNlIHRvIEFycmF5QnVmZmVyXG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgIHJldHVybiBhcnJheUJ1ZmZlcjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgZGF0YTpcIiwgZXJyb3IpO1xuICAgIHJldHVybiBcIkVycm9yXCI7XG4gIH1cbn07XG4vL2BoYW5kbGVTZW5kT1RQYCBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgb3RwIG9uIHVzZXIncyBlbWFpbCB1c2luZyBgU2VuZE9UUE1haWxWMWAgY2xvdWQgZnVuY3Rpb25cbmV4cG9ydCBjb25zdCBoYW5kbGVTZW5kT1RQID0gYXN5bmMgKGVtYWlsKSA9PiB7XG4gIHRyeSB7XG4gICAgbGV0IHVybCA9IGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvU2VuZE9UUE1haWxWMWA7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKVxuICAgIH07XG4gICAgY29uc3QgYm9keSA9IHsgZW1haWw6IGVtYWlsIH07XG4gICAgYXdhaXQgYXhpb3MucG9zdCh1cmwsIGJvZHksIHsgaGVhZGVyczogaGVhZGVycyB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhbGVydChlcnJvci5tZXNzYWdlKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCBmZXRjaFVybCA9IGFzeW5jICh1cmwsIHBkZk5hbWUpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgYWxlcnQoXCJzb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOZXR3b3JrIHJlc3BvbnNlIHdhcyBub3Qgb2tcIik7XG4gICAgfVxuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XG4gICAgc2F2ZUFzKGJsb2IsIGAke3Nhbml0aXplRmlsZU5hbWUocGRmTmFtZSl9X3NpZ25lZF9ieV9PcGVuU2lnbuKEoi5wZGZgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZG93bmxvYWRpbmcgdGhlIGZpbGU6XCIsIGVycm9yKTtcbiAgfVxufTtcbi8vaGFuZGxlIGRvd25sb2FkIHNpZ25lZCBwZGZcbmV4cG9ydCBjb25zdCBoYW5kbGVEb3dubG9hZFBkZiA9IGFzeW5jIChcbiAgcGRmRGV0YWlscyxcbiAgcGRmVXJsLFxuICBzZXRJc0Rvd25sb2FkaW5nXG4pID0+IHtcbiAgY29uc3QgcGRmTmFtZSA9IHBkZkRldGFpbHNbMF0gJiYgcGRmRGV0YWlsc1swXS5OYW1lO1xuICBzZXRJc0Rvd25sb2FkaW5nKFwicGRmXCIpO1xuICB0cnkge1xuICAgIC8vIGNvbnN0IHVybCA9IGF3YWl0IFBhcnNlLkNsb3VkLnJ1bihcImdldHNpZ25lZHVybFwiLCB7IHVybDogcGRmVXJsIH0pO1xuICAgIGNvbnN0IGF4aW9zUmVzID0gYXdhaXQgYXhpb3MucG9zdChcbiAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX0vZnVuY3Rpb25zL2dldHNpZ25lZHVybGAsXG4gICAgICB7IHVybDogcGRmVXJsIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcIkFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxuICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gICAgY29uc3QgdXJsID0gYXhpb3NSZXMuZGF0YS5yZXN1bHQ7XG4gICAgYXdhaXQgZmV0Y2hVcmwodXJsLCBwZGZOYW1lKTtcbiAgICBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmxvZyhcImVyciBpbiBnZXRzaWduZWR1cmxcIiwgZXJyKTtcbiAgICBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpO1xuICAgIGFsZXJ0KFwic29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCIpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2FuaXRpemVGaWxlTmFtZSA9IChwZGZOYW1lKSA9PiB7XG4gIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggdW5kZXJzY29yZVxuICByZXR1cm4gcGRmTmFtZS5yZXBsYWNlKC8gL2csIFwiX1wiKTtcbn07XG4vL2Z1bmN0aW9uIGZvciBwcmludCBkaWdpdGFsIHNpZ24gcGRmXG5leHBvcnQgY29uc3QgaGFuZGxlVG9QcmludCA9IGFzeW5jIChldmVudCwgcGRmVXJsLCBzZXRJc0Rvd25sb2FkaW5nKSA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIHNldElzRG93bmxvYWRpbmcoXCJwZGZcIik7XG4gIHRyeSB7XG4gICAgLy8gY29uc3QgdXJsID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwiZ2V0c2lnbmVkdXJsXCIsIHsgdXJsOiBwZGZVcmwgfSk7XG4gICAgLy9gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpYCBpcyBhbHNvIHVzZSBpbiBwdWJsaWMtcHJvZmlsZSBmbG93IGZvciBwdWJsaWMtc2lnblxuICAgIC8vaWYgd2UgZ2l2ZSB0aGlzIGBhcHBJbmZvLmJhc2VVcmxgIGFzIGEgYmFzZSB1cmwgdGhlbiBpbiBwdWJsaWMtcHJvZmlsZSBpdCB3aWxsIGNyZWF0ZSBiYXNlIHVybCBvZiBpdCdzIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gZXgtIG9wZW5zaWduLm1lIHdoaWNoIGlzIG5vdCBiYXNlIHVybFxuICAgIGNvbnN0IGF4aW9zUmVzID0gYXdhaXQgYXhpb3MucG9zdChcbiAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX0vZnVuY3Rpb25zL2dldHNpZ25lZHVybGAsXG4gICAgICB7IHVybDogcGRmVXJsIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcIkFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxuICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gICAgY29uc3QgdXJsID0gYXhpb3NSZXMuZGF0YS5yZXN1bHQ7XG4gICAgY29uc3QgcGRmID0gYXdhaXQgZ2V0QmFzZTY0RnJvbVVybCh1cmwpO1xuICAgIGNvbnN0IGlzQW5kcm9pZERldmljZSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSk7XG4gICAgY29uc3QgaXNBcHBsZURldmljZSA9XG4gICAgICAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKSB8fFxuICAgICAgICAobmF2aWdhdG9yLnBsYXRmb3JtID09PSBcIk1hY0ludGVsXCIgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMSkpICYmXG4gICAgICAhd2luZG93Lk1TU3RyZWFtO1xuICAgIGlmIChpc0FuZHJvaWREZXZpY2UgfHwgaXNBcHBsZURldmljZSkge1xuICAgICAgY29uc3QgYnl0ZUFycmF5ID0gVWludDhBcnJheS5mcm9tKFxuICAgICAgICBhdG9iKHBkZilcbiAgICAgICAgICAuc3BsaXQoXCJcIilcbiAgICAgICAgICAubWFwKChjaGFyKSA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpXG4gICAgICApO1xuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtieXRlQXJyYXldLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vcGRmXCIgfSk7XG4gICAgICBjb25zdCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIHdpbmRvdy5vcGVuKGJsb2JVcmwsIFwiX2JsYW5rXCIpO1xuICAgICAgc2V0SXNEb3dubG9hZGluZyhcIlwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJpbnRNb2R1bGUoeyBwcmludGFibGU6IHBkZiwgdHlwZTogXCJwZGZcIiwgYmFzZTY0OiB0cnVlIH0pO1xuICAgICAgc2V0SXNEb3dubG9hZGluZyhcIlwiKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XG4gICAgY29uc29sZS5sb2coXCJlcnIgaW4gZ2V0c2lnbmVkdXJsXCIsIGVycik7XG4gICAgYWxlcnQoXCJzb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIik7XG4gIH1cbn07XG5cbi8vaGFuZGxlIGRvd25sb2FkIHNpZ25lZCBwZGZcbmV4cG9ydCBjb25zdCBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlID0gYXN5bmMgKFxuICBwZGZEZXRhaWxzLFxuICBzZXRJc0Rvd25sb2FkaW5nXG4pID0+IHtcbiAgaWYgKHBkZkRldGFpbHM/Lmxlbmd0aCA+IDAgJiYgcGRmRGV0YWlsc1swXT8uQ2VydGlmaWNhdGVVcmwpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZmV0Y2gocGRmRGV0YWlsc1swXSAmJiBwZGZEZXRhaWxzWzBdPy5DZXJ0aWZpY2F0ZVVybCk7XG4gICAgICBjb25zdCBjZXJ0aWZpY2F0ZVVybCA9IHBkZkRldGFpbHNbMF0gJiYgcGRmRGV0YWlsc1swXT8uQ2VydGlmaWNhdGVVcmw7XG4gICAgICBzYXZlQXMoY2VydGlmaWNhdGVVcmwsIGBDZXJ0aWZpY2F0ZV9zaWduZWRfYnlfT3BlblNpZ27ihKIucGRmYCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImVyciBpbiBkb3dubG9hZCBpbiBjZXJ0aWZpY2F0ZVwiLCBlcnIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzZXRJc0Rvd25sb2FkaW5nKFwiY2VydGlmaWNhdGVcIik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIGRvY0lkOiBwZGZEZXRhaWxzWzBdPy5vYmplY3RJZFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGRvY0RldGFpbHMgPSBhd2FpdCBheGlvcy5wb3N0KFxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2dldERvY3VtZW50YCxcbiAgICAgICAgZGF0YSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgICAgIHNlc3Npb25Ub2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChkb2NEZXRhaWxzLmRhdGEgJiYgZG9jRGV0YWlscy5kYXRhLnJlc3VsdCkge1xuICAgICAgICBjb25zdCBkb2MgPSBkb2NEZXRhaWxzLmRhdGEucmVzdWx0O1xuICAgICAgICBpZiAoZG9jPy5DZXJ0aWZpY2F0ZVVybCkge1xuICAgICAgICAgIGF3YWl0IGZldGNoKGRvYz8uQ2VydGlmaWNhdGVVcmwpO1xuICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlVXJsID0gZG9jPy5DZXJ0aWZpY2F0ZVVybDtcbiAgICAgICAgICBzYXZlQXMoY2VydGlmaWNhdGVVcmwsIGBDZXJ0aWZpY2F0ZV9zaWduZWRfYnlfT3BlblNpZ27ihKIucGRmYCk7XG4gICAgICAgICAgc2V0SXNEb3dubG9hZGluZyhcIlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRJc0Rvd25sb2FkaW5nKFwiY2VydGlmaWNhdGVcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGRvd25sb2FkIGluIGNlcnRpZmljYXRlXCIsIGVycik7XG4gICAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcbiAgICB9XG4gIH1cbn07XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZENvbnRhY3QodmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IFBhcnNlLlVzZXIuY3VycmVudCgpO1xuICAgIGNvbnN0IGNvbnRhY3Rib29rID0gbmV3IFBhcnNlLlF1ZXJ5KFwiY29udHJhY3RzX0NvbnRhY3Rib29rXCIpO1xuICAgIGNvbnRhY3Rib29rLmVxdWFsVG8oXG4gICAgICBcIkNyZWF0ZWRCeVwiLFxuICAgICAgUGFyc2UuVXNlci5jcmVhdGVXaXRob3V0RGF0YShjdXJyZW50VXNlci5pZClcbiAgICApO1xuICAgIGNvbnRhY3Rib29rLm5vdEVxdWFsVG8oXCJJc0RlbGV0ZWRcIiwgdHJ1ZSk7XG4gICAgY29udGFjdGJvb2subWF0Y2hlcyhcIkVtYWlsXCIsIG5ldyBSZWdFeHAodmFsdWUsIFwiaVwiKSk7XG5cbiAgICBjb25zdCBjb250YWN0UmVzID0gYXdhaXQgY29udGFjdGJvb2suZmluZCgpO1xuICAgIGlmIChjb250YWN0UmVzKSB7XG4gICAgICBjb25zdCByZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbnRhY3RSZXMpKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBzdWdnZXN0aW9uczpcIiwgZXJyb3IpO1xuICB9XG59XG4vLyBgY29tcGVuc2F0ZVJvdGF0aW9uYCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB4IGFuZCB5IHBvc2l0aW9uIG9mIHdpZGdldCBvbiBwb3J0YWl0LCBsYW5kc2NhcGUgcGRmIGZvciBwZGYtbGliXG5mdW5jdGlvbiBjb21wZW5zYXRlUm90YXRpb24oXG4gIHBhZ2VSb3RhdGlvbixcbiAgeCxcbiAgeSxcbiAgc2NhbGUsXG4gIGRpbWVuc2lvbnMsXG4gIGZvbnRTaXplLFxuICB1cGRhdGVDb2xvckluUmdiLFxuICBmb250LFxuICBwYWdlXG4pIHtcbiAgLy8gRW5zdXJlIHBhZ2VSb3RhdGlvbiBpcyBiZXR3ZWVuIDAgYW5kIDM2MCBkZWdyZWVzXG4gIHBhZ2VSb3RhdGlvbiA9ICgocGFnZVJvdGF0aW9uICUgMzYwKSArIDM2MCkgJSAzNjA7XG4gIGxldCByb3RhdGlvblJhZHMgPSAocGFnZVJvdGF0aW9uICogTWF0aC5QSSkgLyAxODA7XG5cbiAgLy8gQ29vcmRpbmF0ZXMgYXJlIGZyb20gYm90dG9tLWxlZnRcbiAgbGV0IGNvb3Jkc0Zyb21Cb3R0b21MZWZ0ID0geyB4OiB4IC8gc2NhbGUgfTtcbiAgaWYgKHBhZ2VSb3RhdGlvbiA9PT0gOTAgfHwgcGFnZVJvdGF0aW9uID09PSAyNzApIHtcbiAgICBjb29yZHNGcm9tQm90dG9tTGVmdC55ID0gZGltZW5zaW9ucy53aWR0aCAtICh5ICsgZm9udFNpemUpIC8gc2NhbGU7XG4gIH0gZWxzZSB7XG4gICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSA9IGRpbWVuc2lvbnMuaGVpZ2h0IC0gKHkgKyBmb250U2l6ZSkgLyBzY2FsZTtcbiAgfVxuXG4gIGxldCBkcmF3WCA9IG51bGw7XG4gIGxldCBkcmF3WSA9IG51bGw7XG5cbiAgaWYgKHBhZ2VSb3RhdGlvbiA9PT0gOTApIHtcbiAgICBkcmF3WCA9XG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC54ICogTWF0aC5jb3Mocm90YXRpb25SYWRzKSAtXG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC55ICogTWF0aC5zaW4ocm90YXRpb25SYWRzKSArXG4gICAgICBkaW1lbnNpb25zLndpZHRoO1xuICAgIGRyYXdZID1cbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLnNpbihyb3RhdGlvblJhZHMpICtcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpO1xuICB9IGVsc2UgaWYgKHBhZ2VSb3RhdGlvbiA9PT0gMTgwKSB7XG4gICAgZHJhd1ggPVxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueCAqIE1hdGguY29zKHJvdGF0aW9uUmFkcykgLVxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguc2luKHJvdGF0aW9uUmFkcykgK1xuICAgICAgZGltZW5zaW9ucy53aWR0aDtcbiAgICBkcmF3WSA9XG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC54ICogTWF0aC5zaW4ocm90YXRpb25SYWRzKSArXG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC55ICogTWF0aC5jb3Mocm90YXRpb25SYWRzKSArXG4gICAgICBkaW1lbnNpb25zLmhlaWdodDtcbiAgfSBlbHNlIGlmIChwYWdlUm90YXRpb24gPT09IDI3MCkge1xuICAgIGRyYXdYID1cbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpIC1cbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLnNpbihyb3RhdGlvblJhZHMpO1xuICAgIGRyYXdZID1cbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLnNpbihyb3RhdGlvblJhZHMpICtcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpICtcbiAgICAgIGRpbWVuc2lvbnMuaGVpZ2h0O1xuICB9IGVsc2UgaWYgKHBhZ2VSb3RhdGlvbiA9PT0gMCB8fCBwYWdlUm90YXRpb24gPT09IDM2MCkge1xuICAgIC8vIE5vIHJvdGF0aW9uIG9yIGZ1bGwgcm90YXRpb25cbiAgICBkcmF3WCA9IGNvb3Jkc0Zyb21Cb3R0b21MZWZ0Lng7XG4gICAgZHJhd1kgPSBjb29yZHNGcm9tQm90dG9tTGVmdC55O1xuICB9XG4gIGlmIChmb250KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGRyYXdYLFxuICAgICAgeTogZHJhd1ksXG4gICAgICBmb250LFxuICAgICAgY29sb3I6IHVwZGF0ZUNvbG9ySW5SZ2IsXG4gICAgICBzaXplOiBmb250U2l6ZSxcbiAgICAgIHJvdGF0ZTogcGFnZS5nZXRSb3RhdGlvbigpXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyB4OiBkcmF3WCwgeTogZHJhd1kgfTtcbiAgfVxufVxuXG4vLyBgZ2V0V2lkZ2V0UG9zaXRpb25gIGlzIHVzZWQgdG8gY2FsdWxjYXRlIHBvc2l0aW9uIG9mIGltYWdlIHR5cGUgd2lkZ2V0IGxpa2UgeCwgeSwgd2lkdGgsIGhlaWdodCBmb3IgcGRmLWxpYlxuZnVuY3Rpb24gZ2V0V2lkZ2V0UG9zaXRpb24ocGFnZSwgaW1hZ2UsIHNpemVSYXRpbykge1xuICBsZXQgcGFnZVdpZHRoO1xuICAvLyBwYWdlSGVpZ2h0O1xuICBpZiAoWzkwLCAyNzBdLmluY2x1ZGVzKHBhZ2UuZ2V0Um90YXRpb24oKS5hbmdsZSkpIHtcbiAgICBwYWdlV2lkdGggPSBwYWdlLmdldEhlaWdodCgpO1xuICB9IGVsc2Uge1xuICAgIHBhZ2VXaWR0aCA9IHBhZ2UuZ2V0V2lkdGgoKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgaWYgKCFpbWFnZT8uaGFzT3duUHJvcGVydHkoXCJ2cFdpZHRoXCIpKSB7XG4gICAgaW1hZ2VbXCJ2cFdpZHRoXCJdID0gcGFnZVdpZHRoO1xuICB9XG5cbiAgY29uc3QgcGFnZVJhdGlvID0gcGFnZVdpZHRoIC8gKGltYWdlLnZwV2lkdGggKiBzaXplUmF0aW8pO1xuICBjb25zdCBpbWFnZVdpZHRoID0gaW1hZ2Uud2lkdGggKiBzaXplUmF0aW8gKiBwYWdlUmF0aW87XG4gIGNvbnN0IGltYWdlSGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0ICogc2l6ZVJhdGlvICogcGFnZVJhdGlvO1xuICBjb25zdCBpbWFnZVggPSBpbWFnZS54ICogc2l6ZVJhdGlvICogcGFnZVJhdGlvO1xuICBjb25zdCBpbWFnZVlGcm9tVG9wID0gaW1hZ2UueSAqIHNpemVSYXRpbyAqIHBhZ2VSYXRpbztcblxuICBjb25zdCBjb3JyZWN0aW9uID0gY29tcGVuc2F0ZVJvdGF0aW9uKFxuICAgIHBhZ2UuZ2V0Um90YXRpb24oKS5hbmdsZSxcbiAgICBpbWFnZVgsXG4gICAgaW1hZ2VZRnJvbVRvcCxcbiAgICAxLFxuICAgIHBhZ2UuZ2V0U2l6ZSgpLFxuICAgIGltYWdlSGVpZ2h0XG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogaW1hZ2VXaWR0aCxcbiAgICBoZWlnaHQ6IGltYWdlSGVpZ2h0LFxuICAgIHg6IGNvcnJlY3Rpb24ueCxcbiAgICB5OiBjb3JyZWN0aW9uLnksXG4gICAgcm90YXRlOiBwYWdlLmdldFJvdGF0aW9uKClcbiAgfTtcbn1cbi8vZnVuY3Rpb24gdG8gdXNlIGNhbGN1bGF0ZSBwZGYgcmVuZGVyaW5nIHNjYWxlIGluIHRoZSBjb250YWluZXJcbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJTY2FsZSA9IChwZGZPcmlnaW5hbFdILCBwYWdlTnVtYmVyLCBjb250YWluZXJXSCkgPT4ge1xuICBjb25zdCBnZXRQZGZQYWdlV2lkdGggPSBwZGZPcmlnaW5hbFdILmZpbmQoXG4gICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlclxuICApO1xuICBjb25zdCBjb250YWluZXJTY2FsZSA9IGNvbnRhaW5lcldIPy53aWR0aCAvIGdldFBkZlBhZ2VXaWR0aD8ud2lkdGggfHwgMTtcbiAgcmV0dXJuIGNvbnRhaW5lclNjYWxlO1xufTtcblxuLy9mdW5jdGlvbiB0byBnZXQgY3VycmVudCBsYWd1YWdlIGFuZCBzZXQgaXQgaW4gbG9jYWxcbmV4cG9ydCBjb25zdCBzYXZlTGFuZ3VhZ2VJbkxvY2FsID0gKGkxOG4pID0+IHtcbiAgY29uc3QgZGV0ZWN0ZWRMYW5ndWFnZSA9IGkxOG4ubGFuZ3VhZ2UgfHwgXCJlblwiO1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImkxOG5leHRMbmdcIiwgZGV0ZWN0ZWRMYW5ndWFnZSk7XG59O1xuLy9mdW5jdGlvbiB0byBnZXQgZGVmYXVsdCBzaWduYXR1ciBlb2YgY3VycmVudCB1c2VyIGZyb20gYGNvbnRyYWN0c19TaWduYXR1cmVgIGNsYXNzXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdFNpZ25hdHVyZSA9IGFzeW5jIChvYmplY3RJZCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiY29udHJhY3RzX1NpZ25hdHVyZVwiKTtcbiAgICBxdWVyeS5lcXVhbFRvKFwiVXNlcklkXCIsIHtcbiAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXG4gICAgICBjbGFzc05hbWU6IFwiX1VzZXJcIixcbiAgICAgIG9iamVjdElkOiBvYmplY3RJZFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcXVlcnkuZmlyc3QoKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBjb25zdCByZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xuICAgICAgY29uc3QgZGVmYXVsdFNpZ25hdHVyZSA9IHJlcz8uSW1hZ2VVUkxcbiAgICAgICAgPyBhd2FpdCBnZXRCYXNlNjRGcm9tVXJsKHJlcz8uSW1hZ2VVUkwsIHRydWUpXG4gICAgICAgIDogXCJcIjtcbiAgICAgIGNvbnN0IGRlZmF1bHRJbml0aWFsID0gcmVzPy5Jbml0aWFsc1xuICAgICAgICA/IGF3YWl0IGdldEJhc2U2NEZyb21VcmwocmVzPy5Jbml0aWFscywgdHJ1ZSlcbiAgICAgICAgOiBcIlwiO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICByZXM6IHtcbiAgICAgICAgICBkZWZhdWx0U2lnbmF0dXJlOiBkZWZhdWx0U2lnbmF0dXJlLFxuICAgICAgICAgIGRlZmF1bHRJbml0aWFsOiBkZWZhdWx0SW5pdGlhbFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coXCJFcnJvcjogZXJyb3IgaW4gZmV0Y2ggZGF0YSBpbiBjb250cmFjdHNfU2lnbmF0dXJlXCIsIGVycik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogXCJlcnJvclwiXG4gICAgfTtcbiAgfVxufTtcblxuLy9mdW5jdGlvbiB0byByb3RhdGUgcGRmIHBhZ2VcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByb3RhdGVQZGZQYWdlKFxuICB1cmwsXG4gIHJvdGF0ZURlZ3JlZSxcbiAgcGFnZU51bWJlcixcbiAgcGRmUm90YXRlQmFzZTY0XG4pIHtcbiAgbGV0IGZpbGU7XG5cbiAgLy9jb25kaXRpb24gdG8gaGFuZGxlIHBkZiBiYXNlNjQgaW4gYXJyYXlCdWZmZXIgZm9ybWF0XG4gIGlmIChwZGZSb3RhdGVCYXNlNjQpIHtcbiAgICBmaWxlID0gYmFzZTY0VG9BcnJheUJ1ZmZlcihwZGZSb3RhdGVCYXNlNjQpO1xuICB9IGVsc2Uge1xuICAgIC8vY29uZGl0aW9uIHRvIGhhbmRsZSBwZGYgdXJsIGluIGFycmF5QnVmZmVyIGZvcm1hdFxuICAgIGZpbGUgPSBhd2FpdCBjb252ZXJ0UGRmQXJyYXlCdWZmZXIodXJsKTtcbiAgfVxuICAvLyBMb2FkIHRoZSBleGlzdGluZyBQREZcbiAgY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZChmaWxlKTtcbiAgLy8gR2V0IHRoZSBwYWdlIGFjY29yZGluZyB0byBwYWdlIG51bWJlclxuICBjb25zdCBwYWdlID0gcGRmRG9jLmdldFBhZ2UocGFnZU51bWJlcik7XG4gIC8vZ2V0IGN1cnJlbnQgcGFnZSByb3RhdGlvbiBhbmdsZVxuICBjb25zdCBjdXJyZW50Um90YXRpb24gPSBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGU7XG4gIC8vIEFwcGx5IHRoZSByb3RhdGlvbiBpbiB0aGUgY291bnRlcmNsb2Nrd2lzZSBkaXJlY3Rpb25cbiAgbGV0IG5ld1JvdGF0aW9uID0gKGN1cnJlbnRSb3RhdGlvbiArIHJvdGF0ZURlZ3JlZSkgJSAzNjA7XG4gIC8vIEFkanVzdCBmb3IgbmVnYXRpdmUgYW5nbGVzIHRvIGtlZXAgd2l0aGluIDAtMzU5IHJhbmdlXG4gIGlmIChuZXdSb3RhdGlvbiA8IDApIHtcbiAgICBuZXdSb3RhdGlvbiArPSAzNjA7XG4gIH1cbiAgcGFnZS5zZXRSb3RhdGlvbihkZWdyZWVzKG5ld1JvdGF0aW9uKSk7XG4gIGNvbnN0IHBkZmJhc2U2NCA9IGF3YWl0IHBkZkRvYy5zYXZlQXNCYXNlNjQoeyB1c2VPYmplY3RTdHJlYW1zOiBmYWxzZSB9KTtcbiAgLy9jb252ZXJ0IGJhc2U2NCB0byBhcnJheWJ1ZmZlciBpcyB1c2VkIGluIHBkZi1saWJcbiAgLy9wZGZiYXNlNjQgaXMgdXNlZCB0byBzaG93IHBkZiByb3RhdGVkIGZvcm1hdFxuICBjb25zdCBhcnJheUJ1ZmZlciA9IGJhc2U2NFRvQXJyYXlCdWZmZXIocGRmYmFzZTY0KTtcbiAgLy9gYmFzZTY0YCBpcyB1c2VkIHRvIHNob3cgcGRmXG4gIHJldHVybiB7IGFycmF5QnVmZmVyOiBhcnJheUJ1ZmZlciwgYmFzZTY0OiBwZGZiYXNlNjQgfTtcbn1cbmZ1bmN0aW9uIGJhc2U2NFRvQXJyYXlCdWZmZXIoYmFzZTY0KSB7XG4gIC8vIERlY29kZSB0aGUgYmFzZTY0IHN0cmluZyB0byBhIGJpbmFyeSBzdHJpbmdcbiAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpO1xuICAvLyBDcmVhdGUgYSBuZXcgQXJyYXlCdWZmZXIgd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIGJpbmFyeSBzdHJpbmdcbiAgY29uc3QgbGVuID0gYmluYXJ5U3RyaW5nLmxlbmd0aDtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAvLyBDb252ZXJ0IHRoZSBiaW5hcnkgc3RyaW5nIHRvIGEgYnl0ZSBhcnJheVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYnl0ZXNbaV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgfVxuICAvLyBSZXR1cm4gdGhlIEFycmF5QnVmZmVyXG4gIHJldHVybiBieXRlcy5idWZmZXI7XG59XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0QmFzZTY0VG9GaWxlID0gYXN5bmMgKHBkZk5hbWUsIHBkZkJhc2U2NCkgPT4ge1xuICBjb25zdCBmaWxlTmFtZSA9IHNhbml0aXplRmlsZU5hbWUocGRmTmFtZSkgKyBcIi5wZGZcIjtcbiAgY29uc3QgcGRmRmlsZSA9IG5ldyBQYXJzZS5GaWxlKGZpbGVOYW1lLCB7IGJhc2U2NDogcGRmQmFzZTY0IH0pO1xuICAvLyBTYXZlIHRoZSBQYXJzZSBGaWxlIGlmIG5lZWRlZFxuICBjb25zdCBwZGZEYXRhID0gYXdhaXQgcGRmRmlsZS5zYXZlKCk7XG4gIGNvbnN0IHBkZlVybCA9IHBkZkRhdGEudXJsKCk7XG4gIHJldHVybiBwZGZVcmw7XG59O1xuZXhwb3J0IGNvbnN0IG9uQ2xpY2tab29tSW4gPSAoc2NhbGUsIHpvb21QZXJjZW50LCBzZXRTY2FsZSwgc2V0Wm9vbVBlcmNlbnQpID0+IHtcbiAgc2V0U2NhbGUoc2NhbGUgKyAwLjEgKiBzY2FsZSk7XG4gIHNldFpvb21QZXJjZW50KHpvb21QZXJjZW50ICsgMTApO1xufTtcbmV4cG9ydCBjb25zdCBvbkNsaWNrWm9vbU91dCA9IChcbiAgem9vbVBlcmNlbnQsXG4gIHNjYWxlLFxuICBzZXRab29tUGVyY2VudCxcbiAgc2V0U2NhbGVcbikgPT4ge1xuICBpZiAoem9vbVBlcmNlbnQgPiAwKSB7XG4gICAgaWYgKHpvb21QZXJjZW50ID09PSAxMCkge1xuICAgICAgc2V0U2NhbGUoMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNjYWxlKHNjYWxlIC0gMC4xICogc2NhbGUpO1xuICAgIH1cbiAgICBzZXRab29tUGVyY2VudCh6b29tUGVyY2VudCAtIDEwKTtcbiAgfVxufTtcblxuLy9mdW5jdGlvbiB0byB1c2UgcmVtb3ZlIHdpZGdldHMgZnJvbSBjdXJyZW50IHBhZ2Ugd2hlbiB1c2VyIHdhbnQgdG8gcm90YXRlIHBhZ2VcbmV4cG9ydCBjb25zdCBoYW5kbGVSZW1vdmVXaWRnZXRzID0gKFxuICBzZXRTaWduZXJQb3MsXG4gIHNpZ25lclBvcyxcbiAgcGFnZU51bWJlcixcbiAgc2V0SXNSb3RhdGVcbikgPT4ge1xuICBjb25zdCB1cGRhdGVkU2lnbmVyUG9zID0gc2lnbmVyUG9zLm1hcCgocGxhY2Vob2xkZXJPYmopID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucGxhY2Vob2xkZXJPYmosXG4gICAgICBwbGFjZUhvbGRlcjogcGxhY2Vob2xkZXJPYmo/LnBsYWNlSG9sZGVyPy5maWx0ZXIoXG4gICAgICAgIChkYXRhKSA9PiBkYXRhPy5wYWdlTnVtYmVyICE9PSBwYWdlTnVtYmVyXG4gICAgICApXG4gICAgfTtcbiAgfSk7XG4gIHNldFNpZ25lclBvcyh1cGRhdGVkU2lnbmVyUG9zKTtcbiAgc2V0SXNSb3RhdGUoe1xuICAgIHN0YXR1czogZmFsc2UsXG4gICAgZGVncmVlOiAwXG4gIH0pO1xufTtcbi8vZnVuY3Rpb24gdG8gc2hvdyB3YXJuaW5nIHdoZW4gdXNlciByb3RhdGUgcGFnZSBhbmQgdGhlcmUgYXJlIHNvbWUgYWxyZWFkeSB3aWRnZXRzIG9uIHRoYXQgcGFnZVxuZXhwb3J0IGNvbnN0IGhhbmRsZVJvdGF0ZVdhcm5pbmcgPSAoc2lnbmVyUG9zLCBwYWdlTnVtYmVyKSA9PiB7XG4gIGNvbnN0IHBsYWNlaG9sZGVyRXhpc3QgPSBzaWduZXJQb3M/LnNvbWUoKHBsYWNlaG9sZGVyT2JqKSA9PlxuICAgIHBsYWNlaG9sZGVyT2JqPy5wbGFjZUhvbGRlcj8uc29tZSgoZGF0YSkgPT4gZGF0YT8ucGFnZU51bWJlciA9PT0gcGFnZU51bWJlcilcbiAgKTtcbiAgaWYgKHBsYWNlaG9sZGVyRXhpc3QpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG4iLCJpbXBvcnQgbG9nbyBmcm9tIFwiLi4vYXNzZXRzL2ltYWdlcy9sb2dvLnBuZ1wiO1xuaW1wb3J0IHsgaXNFbmFibGVTdWJzY3JpcHRpb24gfSBmcm9tIFwiLi9jb25zdFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VydmVyVXJsX2ZuKCkge1xuICBsZXQgYmFzZVVybDtcbiAgaWYgKGlzRW5hYmxlU3Vic2NyaXB0aW9uKSB7XG4gICAgYmFzZVVybCA9IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9TRVJWRVJVUkxcbiAgICAgID8gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NFUlZFUlVSTFxuICAgICAgOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvYXBpL2FwcFwiO1xuICB9IGVsc2Uge1xuICAgIGJhc2VVcmwgPSBwcm9jZXNzLmVudi5SRUFDVF9BUFBfU0VSVkVSVVJMXG4gICAgICA/IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9TRVJWRVJVUkxcbiAgICAgIDogd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIFwiL2FwcFwiO1xuICB9XG4gIHJldHVybiBiYXNlVXJsO1xufVxuZXhwb3J0IGNvbnN0IGFwcEluZm8gPSB7XG4gIGFwcGxvZ286IGxvZ28sXG4gIGFwcElkOiBwcm9jZXNzLmVudi5SRUFDVF9BUFBfQVBQSUQgPyBwcm9jZXNzLmVudi5SRUFDVF9BUFBfQVBQSUQgOiBcIm9wZW5zaWduXCIsXG4gIGJhc2VVcmw6IHNlcnZlclVybF9mbigpLFxuICBkZWZhdWx0Um9sZTogXCJjb250cmFjdHNfVXNlclwiLFxuICBmYkFwcElkOiBwcm9jZXNzLmVudi5SRUFDVF9BUFBfRkJBUFBJRFxuICAgID8gYCR7cHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0ZCQVBQSUR9YFxuICAgIDogXCJcIixcbiAgZmV2X0ljb246XG4gICAgXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdDQVlBQUFCWEF2bUhBQUFBQVhOU1IwSUFyczRjNlFBQUFMbEpSRUZVYUVQdG1OME53akFNQnBOeFlES1lpTTFZcDkwZzkzQ0tTdEgxTmJJZGZ6OTIxRGtlcjJQYytKczFjREY3TVhBeEFTTUdZa0FpZ0JJNnZoOVp3b1hQNTN1Wm9BWWN2aHdkQTNtQVZiSTJhU2IrOXpGS1U0SVVSQjZqL0hvUFVJRWEyRzNpR0lBaFFRRGxBVUlvRTJkaWFiSWtsSVNTME5vRlBlYm83N1JGNk9lbkVGM1FudE9tMTI4aGUwR0tyd0h5QUNGb3oyTWdCcVNHa3BBRWNIczQ3b0h0TjVBRmFrQUNxTU5qUUVNb0U4U0FCRkNIbjRIRTJ6R0hTTGVFQUFBQUFFbEZUa1N1UW1DQ1wiLFxuICBnb29nbGVDbGlldElkOiBwcm9jZXNzLmVudi5SRUFDVF9BUFBfR09PR0xFQ0xJRU5USURcbiAgICA/IGAke3Byb2Nlc3MuZW52LlJFQUNUX0FQUF9HT09HTEVDTElFTlRJRH1gXG4gICAgOiBcIlwiLFxuICBtZXRhRGVzY3JpcHRpb246XG4gICAgXCJUaGUgZmFzdGVzdCB3YXkgdG8gc2lnbiBQREZzICYgcmVxdWVzdCBzaWduYXR1cmVzIGZyb20gb3RoZXJzLlwiLFxuICBzZXR0aW5nczogW1xuICAgIHtcbiAgICAgIHJvbGU6IFwiY29udHJhY3RzX0FkbWluXCIsXG4gICAgICBtZW51SWQ6IFwiVlBoOTFoMFpIa1wiLFxuICAgICAgcGFnZVR5cGU6IFwiZGFzaGJvYXJkXCIsXG4gICAgICBwYWdlSWQ6IFwiMzVLQm9TZ29BS1wiLFxuICAgICAgZXh0ZW5kZWRfY2xhc3M6IFwiY29udHJhY3RzX1VzZXJzXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIHJvbGU6IFwiY29udHJhY3RzX09yZ0FkbWluXCIsXG4gICAgICBtZW51SWQ6IFwiVlBoOTFoMFpIa1wiLFxuICAgICAgcGFnZVR5cGU6IFwiZGFzaGJvYXJkXCIsXG4gICAgICBwYWdlSWQ6IFwiMzVLQm9TZ29BS1wiLFxuICAgICAgZXh0ZW5kZWRfY2xhc3M6IFwiY29udHJhY3RzX1VzZXJzXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIHJvbGU6IFwiY29udHJhY3RzX0VkaXRvclwiLFxuICAgICAgbWVudUlkOiBcIkg5dlJmRVlLaFRcIixcbiAgICAgIHBhZ2VUeXBlOiBcImRhc2hib2FyZFwiLFxuICAgICAgcGFnZUlkOiBcIjM1S0JvU2dvQUtcIixcbiAgICAgIGV4dGVuZGVkX2NsYXNzOiBcImNvbnRyYWN0c19Vc2Vyc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICByb2xlOiBcImNvbnRyYWN0c19Vc2VyXCIsXG4gICAgICBtZW51SWQ6IFwiSDl2UmZFWUtoVFwiLFxuICAgICAgcGFnZVR5cGU6IFwiZGFzaGJvYXJkXCIsXG4gICAgICBwYWdlSWQ6IFwiMzVLQm9TZ29BS1wiLFxuICAgICAgZXh0ZW5kZWRfY2xhc3M6IFwiY29udHJhY3RzX1VzZXJzXCJcbiAgICB9XG4gIF1cbn07XG4iLCJleHBvcnQgY29uc3QgY29udGFjdENscyA9IFwiY29udHJhY3RzX0NvbnRhY3Rib29rXCI7XG5leHBvcnQgY29uc3QgdGVtcGxhdGVDbHMgPSBcImNvbnRyYWN0c19UZW1wbGF0ZVwiO1xuZXhwb3J0IGNvbnN0IGRvY3VtZW50Q2xzID0gXCJjb250cmFjdHNfRG9jdW1lbnRcIjtcbmV4cG9ydCBjb25zdCB0aGVtZUNvbG9yID0gXCIjNDdhM2FkXCI7XG5leHBvcnQgY29uc3QgaWNvbkNvbG9yID0gXCIjNjg2OTY4XCI7XG5leHBvcnQgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcbmV4cG9ydCBjb25zdCBpc0VuYWJsZVN1YnNjcmlwdGlvbiA9XG4gIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9FTkFCTEVfU1VCU0NSSVBUSU9OICYmXG4gIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9FTkFCTEVfU1VCU0NSSVBUSU9OPy50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIlxuICAgID8gdHJ1ZVxuICAgIDogZmFsc2U7XG5leHBvcnQgY29uc3QgaXNTdGFnaW5nID1cbiAgd2luZG93LmxvY2F0aW9uLm9yaWdpbiA9PT0gXCJodHRwczovL3N0YWdpbmctYXBwLm9wZW5zaWdubGFicy5jb21cIjtcbmV4cG9ydCBjb25zdCBpc1B1YmxpY1N0YWdpbmcgPVxuICB3aW5kb3cubG9jYXRpb24ub3JpZ2luID09PSBcImh0dHBzOi8vc3RhZ2luZy5vcGVuc2lnbi5tZVwiO1xuIiwiaW1wb3J0IHsgaXNTdGFnaW5nIH0gZnJvbSBcIi4uL2NvbnN0YW50L2NvbnN0XCI7XG5cbmNvbnN0IHBsYW5zID0gW1xuICB7XG4gICAgcGxhbk5hbWU6IFwiT1BFTlNJR07ihKIgRlJFRVwiLFxuICAgIGNvZGU6IHsgbW9udGhseTogXCJmcmVlcGxhblwiLCB5ZWFybHk6IFwiZnJlZXBsYW5cIiB9LFxuICAgIGltZzogXCJmcmVlLnBuZ1wiLFxuICAgIGN1cnJlbmN5OiBcIlwiLFxuICAgIG1vbnRobHlQcmljZTogXCJGcmVlXCIsXG4gICAgeWVhcmx5UHJpY2U6IFwiRnJlZVwiLFxuICAgIHN1YnRpdGxlOiBcIkZyZWUgVW5saW1pdGVkIEUtc2lnbmF0dXJlcywgRm9yZXZlci5cIixcbiAgICBidG46IHsgdGV4dDogXCJTdWJzY3JpYmVcIiwgY29sb3I6IFwib3AtYnRuLXByaW1hcnlcIiB9LFxuICAgIHVybDogXCJcIixcbiAgICB0YXJnZXQ6IFwiX2JsYW5rXCIsXG4gICAgYmVuZWZpdHM6IFtcbiAgICAgIFwiVW5saW1pdGVkIGVudmVsb3Blc1wiLFxuICAgICAgXCJTaWduIGRvY3VtZW50cyB5b3Vyc2VsZlwiLFxuICAgICAgXCJSZXF1ZXN0IHNpZ25hdHVyZXMgZnJvbSBvdGhlcnNcIixcbiAgICAgIFwiMTQgZmllbGQgdHlwZXNcIixcbiAgICAgIFwiQXV0b21hdGljIGUtc2lnbmF0dXJlc1wiLFxuICAgICAgXCJDb21wbGV0aW9uIGNlcnRpZmljYXRlc1wiLFxuICAgICAgXCJTZW5kIGluIG9yZGVyXCIsXG4gICAgICBcIkRvY3VtZW50IHRlbXBsYXRlc1wiLFxuICAgICAgXCJJbXBvcnQgZnJvbSBEcm9wYm94XCIsXG4gICAgICBcIkNvbnRhY3QgYm9va1wiLFxuICAgICAgXCJEb2N1bWVudCBleHBpcnkgc3VwcG9ydFwiLFxuICAgICAgXCJEZWNsaW5lIGRvY3VtZW50IHN1cHBvcnRcIixcbiAgICAgIFwiRW1haWwgbm90aWZpY2F0aW9uc1wiLFxuICAgICAgXCJSZWNpcGllbnQgYXV0aGVudGljYXRpb24gdXNpbmcgT1RQXCIsXG4gICAgICBcIkJ1bGsgc2VuZCAodXB0byA1IGRvY3MpXCIsXG4gICAgICBcIlB1YmxpYyBwcm9maWxlc1wiLFxuICAgICAgXCJBbmQgbXVjaCBtb3JlXCJcbiAgICBdLFxuICAgIHllYXJseUJlbmVmaXRzOiBbXG4gICAgICBcIlVubGltaXRlZCBlbnZlbG9wZXNcIixcbiAgICAgIFwiU2lnbiBkb2N1bWVudHMgeW91cnNlbGZcIixcbiAgICAgIFwiUmVxdWVzdCBzaWduYXR1cmVzIGZyb20gb3RoZXJzXCIsXG4gICAgICBcIjE0IGZpZWxkIHR5cGVzXCIsXG4gICAgICBcIkF1dG9tYXRpYyBlLXNpZ25hdHVyZXNcIixcbiAgICAgIFwiQ29tcGxldGlvbiBjZXJ0aWZpY2F0ZXNcIixcbiAgICAgIFwiU2VuZCBpbiBvcmRlclwiLFxuICAgICAgXCJEb2N1bWVudCB0ZW1wbGF0ZXNcIixcbiAgICAgIFwiSW1wb3J0IGZyb20gRHJvcGJveFwiLFxuICAgICAgXCJDb250YWN0IGJvb2tcIixcbiAgICAgIFwiRG9jdW1lbnQgZXhwaXJ5IHN1cHBvcnRcIixcbiAgICAgIFwiRGVjbGluZSBkb2N1bWVudCBzdXBwb3J0XCIsXG4gICAgICBcIkVtYWlsIG5vdGlmaWNhdGlvbnNcIixcbiAgICAgIFwiUmVjaXBpZW50IGF1dGhlbnRpY2F0aW9uIHVzaW5nIE9UUFwiLFxuICAgICAgXCJCdWxrIHNlbmQgKHVwdG8gNSBkb2NzKVwiLFxuICAgICAgXCJQdWJsaWMgcHJvZmlsZXNcIixcbiAgICAgIFwiQW5kIG11Y2ggbW9yZVwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgcGxhbk5hbWU6IFwiT1BFTlNJR07ihKIgUFJPRkVTU0lPTkFMXCIsXG4gICAgY29kZTogaXNTdGFnaW5nXG4gICAgICA/IHsgbW9udGhseTogXCJwcm8td2Vla2x5XCIsIHllYXJseTogXCJwcm8teWVhcmx5XCIgfVxuICAgICAgOiB7IG1vbnRobHk6IFwicHJvZmVzc2lvbmFsLW1vbnRobHlcIiwgeWVhcmx5OiBcInByb2Zlc3Npb25hbC15ZWFybHlcIiB9LFxuICAgIGltZzogXCJwcm9mZXNzaW9uYWwucG5nXCIsXG4gICAgY3VycmVuY3k6IFwiJFwiLFxuICAgIG1vbnRobHlQcmljZTogXCIyOS45OVwiLFxuICAgIHllYXJseVByaWNlOiBgOS45OTxzdXAgc3R5bGU9XCJmb250LXNpemU6IDE3cHg7XCI+L21vbnRoPC9zdXA+YCxcbiAgICBzdWJ0aXRsZTogXCJFeGNsdXNpdmUgQWNjZXNzIHRvIGFkdmFuY2VkIGZlYXR1cmVzLlwiLFxuICAgIGJ0bjogeyB0ZXh0OiBcIlN1YnNjcmliZVwiLCBjb2xvcjogXCJvcC1idG4tcHJpbWFyeVwiIH0sXG4gICAgdXJsOiBpc1N0YWdpbmdcbiAgICAgID8gXCJodHRwczovL2JpbGxpbmcuem9oby5pbi9zdWJzY3JpYmUvOTYyN2Y2MmEwOWRmMWM4Y2U1MDBmMmY0ZGM4MzI4ZGQ4NGVjZGEyMGVlYWUxMzg3OGNlNTgxZDYwMjQwZjIwNi9wcm8td2Vla2x5XCJcbiAgICAgIDogXCJodHRwczovL2JpbGxpbmcub3BlbnNpZ25sYWJzLmNvbS9zdWJzY3JpYmUvZWY3OTg0ODZlNmEwYTExZWE2NWYyYmFlOGYyYWY5MDFkMWEwOWRmYTgwODU1ODVjZGQ0ZWM0ZDdmMzIxMzdmMy9wcm9mZXNzaW9uYWwtbW9udGhseVwiLFxuICAgIHllYXJseVVybDogaXNTdGFnaW5nXG4gICAgICA/IFwiaHR0cHM6Ly9iaWxsaW5nLnpvaG8uaW4vc3Vic2NyaWJlLzk2MjdmNjJhMDlkZjFjOGNlNTAwZjJmNGRjODMyOGRkYzE4NDQxMTEyOTIyNGYxZjI5ZWQ4NGY2Y2VmM2I4NjIvcHJvLXllYXJseVwiXG4gICAgICA6IFwiaHR0cHM6Ly9iaWxsaW5nLm9wZW5zaWdubGFicy5jb20vc3Vic2NyaWJlL2VmNzk4NDg2ZTZhMGExMWVhNjVmMmJhZThmMmFmOTAxZDhhZDExMzUxOTBkZmY5NTEzMzAzNjBlNDc1ODVhNzEvcHJvZmVzc2lvbmFsLXllYXJseVwiLFxuICAgIHRhcmdldDogXCJfc2VsZlwiLFxuICAgIGJlbmVmaXRzOiBbXG4gICAgICBcIkV2ZXJ5dGhpbmcgaW4gT3BlblNpZ27ihKIgZnJlZVwiLFxuICAgICAgXCJGaWVsZCB2YWxpZGF0aW9uc1wiLFxuICAgICAgXCJSZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGlvbnNcIixcbiAgICAgIFwiT3JnYW5pemUgZG9jcyBpbiBPcGVuU2lnbuKEoiBEcml2ZVwiLFxuICAgICAgXCJXZWJob29rc1wiLFxuICAgICAgXCJaYXBpZXIgaW50ZWdyYXRpb25cIixcbiAgICAgIFwiQVBJIEFjY2Vzc1wiLFxuICAgICAgXCIxMDAgQVBJIHNpZ25hdHVyZXMgaW5jbHVkZWRcIixcbiAgICAgIFwiQ3VzdG9tIGVtYWlsIHRlbXBsYXRlc1wiLFxuICAgICAgXCJBdXRvIHJlbWluZGVyc1wiLFxuICAgICAgXCJCdWxrIHNlbmQgKHVwdG8gMjAgZG9jcylcIixcbiAgICAgIFwiUHJlbWl1bSBQdWJsaWMgcHJvZmlsZSB1c2VybmFtZXNcIixcbiAgICAgIFwiRW1iZWRkaW5nIChjb21pbmcgc29vbilcIlxuICAgIF0sXG4gICAgeWVhcmx5QmVuZWZpdHM6IFtcbiAgICAgIFwiRXZlcnl0aGluZyBpbiBPcGVuU2lnbuKEoiBmcmVlXCIsXG4gICAgICBcIkZpZWxkIHZhbGlkYXRpb25zXCIsXG4gICAgICBcIlJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0aW9uc1wiLFxuICAgICAgXCJPcmdhbml6ZSBkb2NzIGluIE9wZW5TaWdu4oSiIERyaXZlXCIsXG4gICAgICBcIldlYmhvb2tzXCIsXG4gICAgICBcIlphcGllciBpbnRlZ3JhdGlvblwiLFxuICAgICAgXCJBUEkgQWNjZXNzXCIsXG4gICAgICBcIjI0MCBBUEkgc2lnbmF0dXJlcyBpbmNsdWRlZFwiLFxuICAgICAgXCJDdXN0b20gZW1haWwgdGVtcGxhdGVzXCIsXG4gICAgICBcIkF1dG8gcmVtaW5kZXJzXCIsXG4gICAgICBcIkJ1bGsgc2VuZCAodXB0byAyMCBkb2NzKVwiLFxuICAgICAgXCJQcmVtaXVtIFB1YmxpYyBwcm9maWxlIHVzZXJuYW1lc1wiLFxuICAgICAgXCJFbWJlZGRpbmcgKGNvbWluZyBzb29uKVwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgcGxhbk5hbWU6IFwiT1BFTlNJR07ihKIgVEVBTVNcIixcbiAgICBjb2RlOiB7IG1vbnRobHk6IFwidGVhbXMtbW9udGhseVwiLCB5ZWFybHk6IFwidGVhbXMteWVhcmx5XCIgfSxcbiAgICBpbWc6IFwidGVhbXMucG5nXCIsXG4gICAgY3VycmVuY3k6IFwiJFwiLFxuICAgIG1vbnRobHlQcmljZTogYDM5Ljk5PHN1cCBzdHlsZT1cImZvbnQtc2l6ZTogMTdweDtcIj4vdXNlcjwvc3VwPmAsXG4gICAgeWVhcmx5UHJpY2U6IGAxOS45OTxzdXAgc3R5bGU9XCJmb250LXNpemU6IDE3cHg7XCI+L3VzZXIvbW9udGg8L3N1cD5gLFxuICAgIHN1YnRpdGxlOiBcIkV4Y2x1c2l2ZSBBY2Nlc3MgdG8gYWR2YW5jZWQgZmVhdHVyZXMuXCIsXG4gICAgYnRuOiB7IHRleHQ6IFwiU3Vic2NyaWJlXCIsIGNvbG9yOiBcIm9wLWJ0bi1hY2NlbnRcIiB9LFxuICAgIHVybDogaXNTdGFnaW5nXG4gICAgICA/IFwiaHR0cHM6Ly9iaWxsaW5nLnpvaG8uaW4vc3Vic2NyaWJlL2VkODA5NzI3M2E4MmI2YmYzOTg5MmMxMWEzYmIzYzM4MWViMjcwNTczNjAxNGNmYmRiZGUxY2NmMWM3YTE4OWQvdGVhbXMtbW9udGhseVwiXG4gICAgICA6IFwiaHR0cHM6Ly9iaWxsaW5nLm9wZW5zaWdubGFicy5jb20vc3Vic2NyaWJlL2VmNzk4NDg2ZTZhMGExMWVhNjVmMmJhZThmMmFmOTAxMjM3ZDA3MDJiZmFhOTU5NDA2MzA2NjM1ZDgwZjEzOGMvdGVhbXMtbW9udGhseVwiLFxuICAgIHllYXJseVVybDogaXNTdGFnaW5nXG4gICAgICA/IFwiaHR0cHM6Ly9iaWxsaW5nLnpvaG8uaW4vc3Vic2NyaWJlL2VkODA5NzI3M2E4MmI2YmYzOTg5MmMxMWEzYmIzYzM4MWViMjcwNTczNjAxNGNmYmRiZGUxY2NmMWM3YTE4OWQvdGVhbXMteWVhcmx5XCJcbiAgICAgIDogXCJodHRwczovL2JpbGxpbmcub3BlbnNpZ25sYWJzLmNvbS9zdWJzY3JpYmUvZWY3OTg0ODZlNmEwYTExZWE2NWYyYmFlOGYyYWY5MDExYTg2NDk5NGJiZWVlYzcxZmNmMTA2MTg4NjMwMTk5ZC90ZWFtcy15ZWFybHlcIixcbiAgICB0YXJnZXQ6IFwiX3NlbGZcIixcbiAgICBiZW5lZml0czogW1xuICAgICAgXCJFdmVyeXRoaW5nIGluIE9wZW5TaWdu4oSiIHByb2Zlc3Npb25hbFwiLFxuICAgICAgXCIxMDAgQVBJIHNpZ25hdHVyZXMgaW5jbHVkZWRcIixcbiAgICAgIFwiVGVhbXMgYW5kIE9yZ2FuaXphdGlvbnNcIixcbiAgICAgIFwiU2hhcmUgVGVtcGxhdGVzIHdpdGggdGVhbXNcIixcbiAgICAgIFwiU2hhcmUgVGVtcGxhdGVzIHdpdGggaW5kaXZpZHVhbHNcIixcbiAgICAgIFwiRG9jdW1lbnRJZCByZW1vdmFsIGZyb20gc2lnbmVkIGRvY3NcIixcbiAgICAgIFwiQnVsayBzZW5kICh1cHRvIDUwIGRvY3MpXCIsXG4gICAgICBcIlJlcXVlc3QgUGF5bWVudHMgKGNvbWluZyBzb29uKVwiLFxuICAgICAgXCJNb2JpbGUgYXBwIChjb21pbmcgc29vbilcIlxuICAgIF0sXG4gICAgeWVhcmx5QmVuZWZpdHM6IFtcbiAgICAgIFwiRXZlcnl0aGluZyBpbiBPcGVuU2lnbuKEoiBwcm9mZXNzaW9uYWxcIixcbiAgICAgIFwiNTAwIEFQSSBzaWduYXR1cmVzIGluY2x1ZGVkXCIsXG4gICAgICBcIlRlYW1zIGFuZCBPcmdhbml6YXRpb25zXCIsXG4gICAgICBcIlNoYXJlIFRlbXBsYXRlcyB3aXRoIHRlYW1zXCIsXG4gICAgICBcIlNoYXJlIFRlbXBsYXRlcyB3aXRoIGluZGl2aWR1YWxzXCIsXG4gICAgICBcIkRvY3VtZW50SWQgcmVtb3ZhbCBmcm9tIHNpZ25lZCBkb2NzXCIsXG4gICAgICBcIkJ1bGsgc2VuZCAodXB0byA1MCBkb2NzKVwiLFxuICAgICAgXCJSZXF1ZXN0IFBheW1lbnRzIChjb21pbmcgc29vbilcIixcbiAgICAgIFwiTW9iaWxlIGFwcCAoY29taW5nIHNvb24pXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBwbGFuTmFtZTogXCJPUEVOU0lHTuKEoiBFTlRFUlBSSVNFXCIsXG4gICAgaW1nOiBcImVudGVycHJpc2UucG5nXCIsXG4gICAgY3VycmVuY3k6IFwiXCIsXG4gICAgbW9udGhseVByaWNlOiBgPHAgc3R5bGU9XCJmb250LXNpemU6IDIycHg7XCI+UmVxdWVzdCBQcmljZTwvcD5gLFxuICAgIHllYXJseVByaWNlOiBgPHAgc3R5bGU9XCJmb250LXNpemU6IDIycHg7XCI+UmVxdWVzdCBQcmljZTwvcD5gLFxuICAgIHN1YnRpdGxlOiBcIlNjYWxhYmxlIEZlYXR1cmVzIHdpdGggcHJpb3JpdHkgc3VwcG9ydC5cIixcbiAgICBidG46IHsgdGV4dDogXCJDb250YWN0IHVzXCIsIGNvbG9yOiBcIm9wLWJ0bi1wcmltYXJ5XCIgfSxcbiAgICB1cmw6IFwiaHR0cHM6Ly93d3cub3BlbnNpZ25sYWJzLmNvbS9jb250YWN0LXVzXCIsXG4gICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgIGJlbmVmaXRzOiBbXG4gICAgICBcIkFsbCBmZWF0dXJlc1wiLFxuICAgICAgXCJDdXN0b20gZG9tYWluXCIsXG4gICAgICBcIkN1c3RvbSBicmFuZGluZ1wiLFxuICAgICAgXCJVcHRpbWUgU0xBXCIsXG4gICAgICBcIlNTTyBzdXBwb3J0XCIsXG4gICAgICBcIlByaW9yaXR5IHN1cHBvcnRcIlxuICAgIF0sXG4gICAgeWVhcmx5QmVuZWZpdHM6IFtcbiAgICAgIFwiQWxsIGZlYXR1cmVzXCIsXG4gICAgICBcIkN1c3RvbSBkb21haW5cIixcbiAgICAgIFwiQ3VzdG9tIGJyYW5kaW5nXCIsXG4gICAgICBcIlVwdGltZSBTTEFcIixcbiAgICAgIFwiU1NPIHN1cHBvcnRcIixcbiAgICAgIFwiUHJpb3JpdHkgc3VwcG9ydFwiXG4gICAgXVxuICB9XG5dO1xuXG5leHBvcnQgY29uc3QgdmFsaWRwbGFuID0ge1xuICBcInRlYW0td2Vla2x5XCI6IHRydWUsXG4gIFwidGVhbS15ZWFybHlcIjogdHJ1ZSxcbiAgXCJ0ZWFtcy1tb250aGx5XCI6IHRydWUsXG4gIFwidGVhbXMteWVhcmx5XCI6IHRydWUsXG4gIFwiZW50ZXJwcmlzZS1tb250aGx5XCI6IHRydWUsXG4gIFwiZW50ZXJwcmlzZS15ZWFybHlcIjogdHJ1ZVxufTtcbmV4cG9ydCBjb25zdCBwYWlkVXJsID0gKHBsYW4pID0+IHtcbiAgY29uc3QgdGVhbXBlcmlvZCA9IHtcbiAgICBcInRlYW0td2Vla2x5XCI6IFwibW9udGhseVwiLFxuICAgIFwidGVhbS15ZWFybHlcIjogXCJ5ZWFybHlcIixcbiAgICBcInRlYW1zLW1vbnRobHlcIjogXCJtb250aGx5XCIsXG4gICAgXCJ0ZWFtcy15ZWFybHlcIjogXCJ5ZWFybHlcIlxuICB9O1xuICBjb25zdCBwZXJpb2QgPSB0ZWFtcGVyaW9kW3BsYW5dIHx8IFwiXCI7XG4gIGlmIChwZXJpb2QpIHtcbiAgICBjb25zdCBleHRVc2VyID1cbiAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiRXh0YW5kX0NsYXNzXCIpICYmXG4gICAgICBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiRXh0YW5kX0NsYXNzXCIpKT8uWzBdO1xuICAgIGNvbnN0IHVzZXIgPSB7XG4gICAgICBuYW1lOiBleHRVc2VyPy5OYW1lLFxuICAgICAgZW1haWw6IGV4dFVzZXI/LkVtYWlsLFxuICAgICAgY29tcGFueTogZXh0VXNlcj8uQ29tcGFueSxcbiAgICAgIHBob25lOiBleHRVc2VyPy5QaG9uZVxuICAgIH07XG4gICAgLy8gY29uc29sZS5sb2coXCJ1c2VyRGV0YWlscyBcIiwgdXNlckRldGFpbHMpO1xuICAgIGNvbnN0IGZ1bGxuYW1lID0gdXNlciAmJiB1c2VyLm5hbWUgPyB1c2VyLm5hbWUuc3BsaXQoXCIgXCIpIDogXCJcIjtcbiAgICBjb25zdCBmaXJzdG5hbWUgPSBmdWxsbmFtZT8uWzBdXG4gICAgICA/IFwiZmlyc3RfbmFtZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChmdWxsbmFtZT8uWzBdKVxuICAgICAgOiBcIlwiO1xuICAgIGNvbnN0IGxhc3RuYW1lID0gZnVsbG5hbWU/LlsxXVxuICAgICAgPyBcIiZsYXN0X25hbWU9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoZnVsbG5hbWU/LlsxXSlcbiAgICAgIDogXCJcIjtcbiAgICBjb25zdCBuYW1lID0gZmlyc3RuYW1lID8gZmlyc3RuYW1lICsgbGFzdG5hbWUgOiBcIlwiO1xuICAgIGNvbnN0IGVtYWlsID1cbiAgICAgIHVzZXIgJiYgdXNlci5lbWFpbCA/IFwiJmVtYWlsPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuZW1haWwpIDogXCJcIjtcbiAgICBjb25zdCBjb21wYW55ID1cbiAgICAgIHVzZXIgJiYgdXNlci5jb21wYW55XG4gICAgICAgID8gXCImY29tcGFueV9uYW1lPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuY29tcGFueSlcbiAgICAgICAgOiBcIlwiO1xuICAgIGNvbnN0IHBob25lID1cbiAgICAgIHVzZXIgJiYgdXNlci5waG9uZSA/IFwiJm1vYmlsZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh1c2VyLnBob25lKSA6IFwiXCI7XG4gICAgY29uc3QgYWxsb3dlZFVzZXJzID1cbiAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWxsb3dlZFVzZXJzXCIpICYmXG4gICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFsbG93ZWRVc2Vyc1wiKSA+IDBcbiAgICAgICAgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFsbG93ZWRVc2Vyc1wiKSAtIDFcbiAgICAgICAgOiBcIlwiO1xuICAgIGNvbnN0IHF1YW50aXR5ID0gYWxsb3dlZFVzZXJzXG4gICAgICA/IGBhZGRvbl9jb2RlJTVCMCU1RD1leHRyYS10ZWFtcy11c2Vycy0ke3BlcmlvZH0mYWRkb25fcXVhbnRpdHklNUIwJTVEPSR7YWxsb3dlZFVzZXJzfSZgXG4gICAgICA6IFwiXCI7XG5cbiAgICBjb25zdCBkZXRhaWxzID1cbiAgICAgIFwiP3NoaXBwaW5nX2NvdW50cnlfY29kZT1VUyZiaWxsaW5nX2NvdW50cnlfY29kZT1VUyZiaWxsaW5nX3N0YXRlX2NvZGU9Q0EmXCIgK1xuICAgICAgcXVhbnRpdHkgK1xuICAgICAgbmFtZSArXG4gICAgICBlbWFpbCArXG4gICAgICBjb21wYW55ICtcbiAgICAgIHBob25lO1xuXG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidXNlckRldGFpbHNcIiwgSlNPTi5zdHJpbmdpZnkodXNlcikpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB7XG4gICAgICBtb250aGx5OiBpc1N0YWdpbmdcbiAgICAgICAgPyBcImh0dHBzOi8vYmlsbGluZy56b2hvLmluL3N1YnNjcmliZS9lZDgwOTcyNzNhODJiNmJmMzk4OTJjMTFhM2JiM2MzODFlYjI3MDU3MzYwMTRjZmJkYmRlMWNjZjFjN2ExODlkL3RlYW1zLW1vbnRobHlcIlxuICAgICAgICA6IFwiaHR0cHM6Ly9iaWxsaW5nLm9wZW5zaWdubGFicy5jb20vc3Vic2NyaWJlL2VmNzk4NDg2ZTZhMGExMWVhNjVmMmJhZThmMmFmOTAxMjM3ZDA3MDJiZmFhOTU5NDA2MzA2NjM1ZDgwZjEzOGMvdGVhbXMtbW9udGhseVwiLFxuICAgICAgeWVhcmx5OiBpc1N0YWdpbmdcbiAgICAgICAgPyBcImh0dHBzOi8vYmlsbGluZy56b2hvLmluL3N1YnNjcmliZS9lZDgwOTcyNzNhODJiNmJmMzk4OTJjMTFhM2JiM2MzODFlYjI3MDU3MzYwMTRjZmJkYmRlMWNjZjFjN2ExODlkL3RlYW1zLXllYXJseVwiXG4gICAgICAgIDogXCJodHRwczovL2JpbGxpbmcub3BlbnNpZ25sYWJzLmNvbS9zdWJzY3JpYmUvZWY3OTg0ODZlNmEwYTExZWE2NWYyYmFlOGYyYWY5MDExYTg2NDk5NGJiZWVlYzcxZmNmMTA2MTg4NjMwMTk5ZC90ZWFtcy15ZWFybHlcIlxuICAgIH07XG5cbiAgICBjb25zdCBwbGFudXJsID0gdXJsW3BlcmlvZF0gKyBkZXRhaWxzO1xuICAgIHJldHVybiBwbGFudXJsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIi9zdWJzY3JpcHRpb25cIjtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHBsYW5zO1xuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyBpc0VuYWJsZVN1YnNjcmlwdGlvbiwgaXNTdGFnaW5nLCB0aGVtZUNvbG9yIH0gZnJvbSBcIi4uL2NvbnN0YW50L2NvbnN0XCI7XHJcbmltcG9ydCB7IFBERkRvY3VtZW50IH0gZnJvbSBcInBkZi1saWJcIjtcclxuaW1wb3J0IFwiLi4vc3R5bGVzL3NpZ25hdHVyZS5jc3NcIjtcclxuaW1wb3J0IFBhcnNlIGZyb20gXCJwYXJzZVwiO1xyXG5pbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XHJcbmltcG9ydCB7IERuZFByb3ZpZGVyIH0gZnJvbSBcInJlYWN0LWRuZFwiO1xyXG5pbXBvcnQgeyBIVE1MNUJhY2tlbmQgfSBmcm9tIFwicmVhY3QtZG5kLWh0bWw1LWJhY2tlbmRcIjtcclxuaW1wb3J0IFNpZ25QYWQgZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL1NpZ25QYWRcIjtcclxuaW1wb3J0IFJlbmRlckFsbFBkZlBhZ2UgZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL1JlbmRlckFsbFBkZlBhZ2VcIjtcclxuaW1wb3J0IFRvdXIgZnJvbSBcInJlYWN0b3VyXCI7XHJcbmltcG9ydCBDb25mZXR0aSBmcm9tIFwicmVhY3QtY29uZmV0dGlcIjtcclxuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCB7XHJcbiAgY29udHJhY3REb2N1bWVudCxcclxuICBtdWx0aVNpZ25FbWJlZCxcclxuICBlbWJlZERvY0lkLFxyXG4gIHBkZk5ld1dpZHRoRnVuLFxyXG4gIHNpZ25QZGZGdW4sXHJcbiAgb25JbWFnZVNlbGVjdCxcclxuICBvblNhdmVTaWduLFxyXG4gIG9uU2F2ZUltYWdlLFxyXG4gIGFkZERlZmF1bHRTaWduYXR1cmVJbWcsXHJcbiAgcmFkaW9CdXR0b25XaWRnZXQsXHJcbiAgcmVwbGFjZU1haWxWYXJpYmxlcyxcclxuICBmZXRjaFN1YnNjcmlwdGlvbixcclxuICBjb252ZXJ0UGRmQXJyYXlCdWZmZXIsXHJcbiAgY29udHJhY3RVc2VycyxcclxuICBoYW5kbGVTZW5kT1RQLFxyXG4gIGNvbnRhY3RCb29rLFxyXG4gIGhhbmRsZURvd25sb2FkUGRmLFxyXG4gIGhhbmRsZVRvUHJpbnQsXHJcbiAgaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZSxcclxuICBnZXREZWZhdWx0U2lnbmF0dXJlLFxyXG4gIG9uQ2xpY2tab29tSW4sXHJcbiAgb25DbGlja1pvb21PdXQsXHJcbiAgZmV0Y2hVcmxcclxufSBmcm9tIFwiLi4vY29uc3RhbnQvVXRpbHNcIjtcclxuaW1wb3J0IExvYWRlcldpdGhNc2cgZnJvbSBcIi4uL3ByaW1pdGl2ZXMvTG9hZGVyV2l0aE1zZ1wiO1xyXG5pbXBvcnQgSGFuZGxlRXJyb3IgZnJvbSBcIi4uL3ByaW1pdGl2ZXMvSGFuZGxlRXJyb3JcIjtcclxuaW1wb3J0IEhlYWRlciBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvUGRmSGVhZGVyXCI7XHJcbmltcG9ydCBSZW5kZXJQZGYgZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL1JlbmRlclBkZlwiO1xyXG5pbXBvcnQgUGRmRGVjbGluZU1vZGFsIGZyb20gXCIuLi9wcmltaXRpdmVzL1BkZkRlY2xpbmVNb2RhbFwiO1xyXG5pbXBvcnQgVGl0bGUgZnJvbSBcIi4uL2NvbXBvbmVudHMvVGl0bGVcIjtcclxuaW1wb3J0IERlZmF1bHRTaWduYXR1cmUgZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL0RlZmF1bHRTaWduYXR1cmVcIjtcclxuaW1wb3J0IE1vZGFsVWkgZnJvbSBcIi4uL3ByaW1pdGl2ZXMvTW9kYWxVaVwiO1xyXG5pbXBvcnQgVG91ckNvbnRlbnRXaXRoQnRuIGZyb20gXCIuLi9wcmltaXRpdmVzL1RvdXJDb250ZW50V2l0aEJ0blwiO1xyXG5pbXBvcnQgTG9hZGVyIGZyb20gXCIuLi9wcmltaXRpdmVzL0xvYWRlclwiO1xyXG5pbXBvcnQgeyB1c2VTZWxlY3RvciB9IGZyb20gXCJyZWFjdC1yZWR1eFwiO1xyXG5pbXBvcnQgU2lnbmVyTGlzdENvbXBvbmVudCBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvU2lnbmVyTGlzdENvbXBvbmVudFwiO1xyXG5pbXBvcnQgVmVyaWZ5RW1haWwgZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL1ZlcmlmeUVtYWlsXCI7XHJcbmltcG9ydCBQZGZab29tIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9QZGZab29tXCI7XHJcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcclxuXHJcbmZ1bmN0aW9uIFBkZlJlcXVlc3RGaWxlcyhwcm9wcykge1xyXG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcclxuICBjb25zdCBbcGRmRGV0YWlscywgc2V0UGRmRGV0YWlsc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgY29uc3QgW3NpZ25lZFNpZ25lcnMsIHNldFNpZ25lZFNpZ25lcnNdID0gdXNlU3RhdGUoW10pO1xyXG4gIGNvbnN0IFt1bnNpZ25lZFNpZ25lcnMsIHNldFVuU2lnbmVkU2lnbmVyc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgY29uc3QgW2lzU2lnblBhZCwgc2V0SXNTaWduUGFkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbcGRmVXJsLCBzZXRQZGZVcmxdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbYWxsUGFnZXMsIHNldEFsbFBhZ2VzXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gIGNvbnN0IG51bVBhZ2VzID0gMTtcclxuICBjb25zdCBbcGFnZU51bWJlciwgc2V0UGFnZU51bWJlcl0gPSB1c2VTdGF0ZSgxKTtcclxuICBjb25zdCBbaW1hZ2UsIHNldEltYWdlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gIGNvbnN0IFtpc0ltYWdlU2VsZWN0LCBzZXRJc0ltYWdlU2VsZWN0XSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbc2lnbmF0dXJlLCBzZXRTaWduYXR1cmVdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbaXNTdGFtcCwgc2V0SXNTdGFtcF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3NpZ25LZXksIHNldFNpZ25LZXldID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbaW1nV0gsIHNldEltZ1dIXSA9IHVzZVN0YXRlKHt9KTtcclxuICBjb25zdCBpbWFnZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICBjb25zdCBbaGFuZGxlRXJyb3IsIHNldEhhbmRsZUVycm9yXSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW3NlbGVjdFdpZGdldElkLCBzZXRTZWxlY3RXaWRnZXRJZF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbb3RwTG9hZGVyLCBzZXRPdHBMb2FkZXJdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc0NlbGVicmF0aW9uLCBzZXRJc0NlbGVicmF0aW9uXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbcmVxdWVzdFNpZ25Ub3VyLCBzZXRSZXF1ZXN0U2lnblRvdXJdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFt0b3VyU3RhdHVzLCBzZXRUb3VyU3RhdHVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoe1xyXG4gICAgaXNMb2FkOiB0cnVlLFxyXG4gICAgbWVzc2FnZTogdChcImxvYWRpbmctbXNzZ1wiKVxyXG4gIH0pO1xyXG4gIGNvbnN0IFtkZWZhdWx0U2lnbkltZywgc2V0RGVmYXVsdFNpZ25JbWddID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbaXNEb2NJZCwgc2V0SXNEb2NJZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3BkZk5ld1dpZHRoLCBzZXRQZGZOZXdXaWR0aF0gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFtwZGZPcmlnaW5hbFdILCBzZXRQZGZPcmlnaW5hbFdIXSA9IHVzZVN0YXRlKFtdKTtcclxuICBjb25zdCBbc2lnbmVyUG9zLCBzZXRTaWduZXJQb3NdID0gdXNlU3RhdGUoW10pO1xyXG4gIGNvbnN0IFtzaWduZXJPYmplY3RJZCwgc2V0U2lnbmVyT2JqZWN0SWRdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbaXNVaUxvYWRpbmcsIHNldElzVWlMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNEZWNsaW5lLCBzZXRJc0RlY2xpbmVdID0gdXNlU3RhdGUoeyBpc0RlY2xpbmVkOiBmYWxzZSB9KTtcclxuICBjb25zdCBbY3VycmVudFNpZ25lciwgc2V0Q3VycmVudFNpZ25lcl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzQWxlcnQsIHNldElzQWxlcnRdID0gdXNlU3RhdGUoeyBpc1Nob3c6IGZhbHNlLCBhbGVydE1lc3NhZ2U6IFwiXCIgfSk7XHJcbiAgY29uc3QgW3VuU2lnbmVkV2lkZ2V0SWQsIHNldFVuU2lnbmVkV2lkZ2V0SWRdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2V4cGlyZWREYXRlLCBzZXRFeHBpcmVkRGF0ZV0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbaXNSZXNpemUsIHNldElzUmVzaXplXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbc2lnbmVyVXNlcklkLCBzZXRTaWduZXJVc2VySWRdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbaXNEb250U2hvdywgc2V0SXNEb250U2hvd10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzRG93bmxvYWRpbmcsIHNldElzRG93bmxvYWRpbmddID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2RlZmF1bHRTaWduQWxlcnQsIHNldERlZmF1bHRTaWduQWxlcnRdID0gdXNlU3RhdGUoe1xyXG4gICAgaXNTaG93OiBmYWxzZSxcclxuICAgIGFsZXJ0TWVzc2FnZTogXCJcIlxyXG4gIH0pO1xyXG4gIGNvbnN0IFtpc1N1YnNjcmliZWQsIHNldElzU3Vic2NyaWJlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzQ29tcGxldGVkLCBzZXRJc0NvbXBsZXRlZF0gPSB1c2VTdGF0ZSh7XHJcbiAgICBpc0NlcnRpZmljYXRlOiBmYWxzZSxcclxuICAgIGlzTW9kYWw6IGZhbHNlXHJcbiAgfSk7XHJcbiAgY29uc3QgW215SW5pdGlhbCwgc2V0TXlJbml0aWFsXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtpc0luaXRpYWwsIHNldElzSW5pdGlhbF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3BkZkxvYWQsIHNldFBkZkxvYWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc1NpZ25lZCwgc2V0SXNTaWduZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc0V4cGlyZWQsIHNldElzRXhwaXJlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2FscmVhZHlTaWduLCBzZXRBbHJlYWR5U2lnbl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2NvbnRhaW5lcldILCBzZXRDb250YWluZXJXSF0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgY29uc3QgW3ZhbGlkYXRlQWxlcnQsIHNldFZhbGlkYXRlQWxlcnRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFt3aWRnZXRzVG91ciwgc2V0V2lkZ2V0c1RvdXJdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFttaW5SZXF1aXJlZENvdW50LCBzZXRtaW5SZXF1aXJlZENvdW50XSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW3NlbmRJbk9yZGVyLCBzZXRTZW5kSW5PcmRlcl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2N1cnJXaWRnZXRzRGV0YWlscywgc2V0Q3VycldpZGdldHNEZXRhaWxzXSA9IHVzZVN0YXRlKHt9KTtcclxuICBjb25zdCBbaXNTdWJzY3JpcHRpb25FeHBpcmVkLCBzZXRJc1N1YnNjcmlwdGlvbkV4cGlyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtleHRVc2VySWQsIHNldEV4dFVzZXJJZF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbaXNFbWFpbFZlcmlmaWVkLCBzZXRJc0VtYWlsVmVyaWZpZWRdID0gdXNlU3RhdGUodHJ1ZSk7XHJcbiAgY29uc3QgW2lzVmVyaWZ5TW9kYWwsIHNldElzVmVyaWZ5TW9kYWxdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtvdHAsIHNldE90cF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbY29udHJhY3ROYW1lLCBzZXRDb250cmFjdE5hbWVdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW3pvb21QZXJjZW50LCBzZXRab29tUGVyY2VudF0gPSB1c2VTdGF0ZSgwKTtcclxuICBjb25zdCBbc2NhbGUsIHNldFNjYWxlXSA9IHVzZVN0YXRlKDEpO1xyXG4gIGNvbnN0IFt1bmlxdWVJZCwgc2V0VW5pcXVlSWRdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2lzUHVibGljVGVtcGxhdGUsIHNldElzUHVibGljVGVtcGxhdGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtjb250YWN0LCBzZXRDb250YWN0XSA9IHVzZVN0YXRlKHsgbmFtZTogXCJcIiwgcGhvbmU6IFwiXCIsIGVtYWlsOiBcIlwiIH0pO1xyXG4gIGNvbnN0IFtpc090cCwgc2V0SXNPdHBdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbcmVzLCBzZXRSZXNdID0gdXNlU3RhdGUoe30pO1xyXG4gIGNvbnN0IFtkb2N1bWVudElkLCBzZXREb2N1bWVudElkXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtpc1B1YmxpY0NvbnRhY3QsIHNldElzUHVibGljQ29udGFjdF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3BkZkFycmF5QnVmZmVyLCBzZXRQZGZBcnJheUJ1ZmZlcl0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBpc0hlYWRlciA9IHVzZVNlbGVjdG9yKChzdGF0ZSkgPT4gc3RhdGUuc2hvd0hlYWRlcik7XHJcbiAgY29uc3QgZGl2UmVmID0gdXNlUmVmKG51bGwpO1xyXG5cclxuICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNzY3O1xyXG5cclxuICBsZXQgaXNHdWVzdFNpZ25GbG93ID0gZmFsc2U7XHJcbiAgbGV0IHNlbmRtYWlsO1xyXG4gIGxldCBnZXREb2NJZCA9IFwiXCI7XHJcbiAgY29uc3Qgcm91dGUgPSAhcHJvcHMudGVtcGxhdGVJZCAmJiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7IC8vJy9sb2FkL3JlY2lwaWVudFNpZ25QZGYvVE9BVnVoWGJmdy9mUEFLZEsxcWdYJ1xyXG4gIC8vd2luZG93LmxvY2F0aW9uLnNlYXJjaCA9ID9zZW5kbWFpbD1mYWxzZVxyXG4gIGNvbnN0IGdldFF1ZXJ5ID1cclxuICAgICFwcm9wcy50ZW1wbGF0ZUlkICYmXHJcbiAgICB3aW5kb3cubG9jYXRpb24/LnNlYXJjaCAmJlxyXG4gICAgd2luZG93LmxvY2F0aW9uPy5zZWFyY2g/LnNwbGl0KFwiP1wiKTsgLy9bJycsJ3NlbmRtYWlsPWZhbHNlJ11cclxuXHJcbiAgLy8nc2VuZG1haWw9ZmFsc2UnXHJcbiAgaWYgKGdldFF1ZXJ5KSB7XHJcbiAgICBzZW5kbWFpbCA9IGdldFF1ZXJ5WzFdLnNwbGl0KFwiPVwiKVsxXTsgLy9mYWxzZVxyXG4gIH1cclxuICBjb25zdCBjaGVja1NwbGl0ID0gcm91dGUgJiYgcm91dGU/LnNwbGl0KFwiL1wiKTsgLy8gWycnLCAnbG9hZCcsICdyZWNpcGllbnRTaWduUGRmJywgJ1RPQVZ1aFhiZncnLCAnZlBBS2RLMXFnWCddXHJcbiAgaWYgKGNoZWNrU3BsaXQgJiYgY2hlY2tTcGxpdC5sZW5ndGggPiA0KSB7XHJcbiAgICBpc0d1ZXN0U2lnbkZsb3cgPSB0cnVlO1xyXG4gICAgZ2V0RG9jSWQgPSBjaGVja1NwbGl0WzNdO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBnZXREb2NJZCA9IGNoZWNrU3BsaXRbMl07XHJcbiAgfVxyXG4gIGxldCBnZXREb2N1bWVudElkID0gZ2V0RG9jSWQgfHwgZG9jdW1lbnRJZDtcclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKGdldERvY3VtZW50SWQpIHtcclxuICAgICAgc2V0RG9jdW1lbnRJZChnZXREb2N1bWVudElkKTtcclxuICAgICAgZ2V0RG9jdW1lbnREZXRhaWxzKGdldERvY3VtZW50SWQpO1xyXG4gICAgfSBlbHNlIGlmIChwcm9wcy50ZW1wbGF0ZUlkKSB7XHJcbiAgICAgIGdldFRlbXBsYXRlRGV0YWlscygpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtwcm9wcy50ZW1wbGF0ZUlkLCBnZXREb2N1bWVudElkXSk7XHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IHVwZGF0ZVNpemUgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChkaXZSZWYuY3VycmVudCkge1xyXG4gICAgICAgIGNvbnN0IHBkZldpZHRoID0gcGRmTmV3V2lkdGhGdW4oZGl2UmVmKTtcclxuICAgICAgICBzZXRQZGZOZXdXaWR0aChwZGZXaWR0aCk7XHJcbiAgICAgICAgc2V0Q29udGFpbmVyV0goe1xyXG4gICAgICAgICAgd2lkdGg6IGRpdlJlZi5jdXJyZW50Lm9mZnNldFdpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBkaXZSZWYuY3VycmVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBVc2Ugc2V0VGltZW91dCB0byB3YWl0IGZvciB0aGUgdHJhbnNpdGlvbiB0byBjb21wbGV0ZVxyXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KHVwZGF0ZVNpemUsIDEwMCk7IC8vIG1hdGNoIHRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uXHJcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbZGl2UmVmLmN1cnJlbnQsIGlzSGVhZGVyXSk7XHJcbiAgLy9mdW5jdGlvbiB0byB1c2UgcmVzZW5kIG90cCBmb3IgZW1haWwgdmVyaWZpY2F0aW9uXHJcbiAgY29uc3QgaGFuZGxlUmVzZW5kID0gYXN5bmMgKGUpID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHNldE90cExvYWRlcih0cnVlKTtcclxuICAgIGNvbnN0IGxvY2FsdXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShsb2NhbHVzZXIpO1xyXG4gICAgYXdhaXQgaGFuZGxlU2VuZE9UUChjdXJyZW50VXNlcj8uZW1haWwpO1xyXG4gICAgc2V0T3RwTG9hZGVyKGZhbHNlKTtcclxuICAgIGFsZXJ0KHQoXCJvdHAtc2VudC1hbGVydFwiKSk7XHJcbiAgfTtcclxuICAvL2BoYW5kbGVWZXJpZnlFbWFpbGAgZnVuY3Rpb24gaXMgdXNlZCB0byB2ZXJpZnkgZW1haWwgd2l0aCBvdHBcclxuICBjb25zdCBoYW5kbGVWZXJpZnlFbWFpbCA9IGFzeW5jIChlKSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBzZXRPdHBMb2FkZXIodHJ1ZSk7XHJcbiAgICBjb25zdCBsb2NhbHVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgYFBhcnNlLyR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpfS9jdXJyZW50VXNlcmBcclxuICAgICk7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IEpTT04ucGFyc2UobG9jYWx1c2VyKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc0VtYWlsID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwidmVyaWZ5ZW1haWxcIiwge1xyXG4gICAgICAgIG90cDogb3RwLFxyXG4gICAgICAgIGVtYWlsOiBjdXJyZW50VXNlcj8uZW1haWxcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChyZXNFbWFpbD8ubWVzc2FnZSA9PT0gXCJFbWFpbCBpcyB2ZXJpZmllZC5cIikge1xyXG4gICAgICAgIHNldElzRW1haWxWZXJpZmllZCh0cnVlKTtcclxuICAgICAgICBhbGVydCh0KFwiRW1haWwtdmVyaWZpZWQtYWxlcnQtMVwiKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzRW1haWw/Lm1lc3NhZ2UgPT09IFwiRW1haWwgaXMgYWxyZWFkeSB2ZXJpZmllZC5cIikge1xyXG4gICAgICAgIHNldElzRW1haWxWZXJpZmllZCh0cnVlKTtcclxuICAgICAgICBhbGVydCh0KFwiRW1haWwtdmVyaWZpZWQtYWxlcnQtMlwiKSk7XHJcbiAgICAgIH1cclxuICAgICAgc2V0T3RwKFwiXCIpO1xyXG4gICAgICBzZXRJc1ZlcmlmeU1vZGFsKGZhbHNlKTtcclxuICAgICAgLy9oYW5kbGVSZWNpcGllbnRTaWduKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBhbGVydChlcnJvci5tZXNzYWdlKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHNldE90cExvYWRlcihmYWxzZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuICAvL2BoYW5kbGVWZXJpZnlCdG5gIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBvdHAgb24gdXNlciBtYWlsXHJcbiAgY29uc3QgaGFuZGxlVmVyaWZ5QnRuID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgc2V0SXNWZXJpZnlNb2RhbCh0cnVlKTtcclxuICAgIGNvbnN0IGxvY2FsdXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShsb2NhbHVzZXIpO1xyXG4gICAgYXdhaXQgaGFuZGxlU2VuZE9UUChjdXJyZW50VXNlcj8uZW1haWwpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZU5hdmlnYXRpb24gPSAoKSA9PiB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL3N1YnNjcmlwdGlvblwiO1xyXG4gIH07XHJcbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tJc1N1YnNjcmliZWQoZXh0VXNlcklkLCBjb250YWN0SWQpIHtcclxuICAgIGNvbnN0IGlzR3Vlc3RTaWduID0gaXNHdWVzdFNpZ25GbG93IHx8IGZhbHNlO1xyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hTdWJzY3JpcHRpb24oZXh0VXNlcklkLCBjb250YWN0SWQsIGlzR3Vlc3RTaWduKTtcclxuICAgIGNvbnN0IHBsYW4gPSByZXMucGxhbjtcclxuICAgIGNvbnN0IGJpbGxpbmdEYXRlID0gcmVzPy5iaWxsaW5nRGF0ZTtcclxuICAgIGNvbnN0IHN0YXR1cyA9IHJlcz8uc3RhdHVzO1xyXG4gICAgaWYgKHBsYW4gPT09IFwiZnJlZXBsYW5cIikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAoYmlsbGluZ0RhdGUpIHtcclxuICAgICAgaWYgKG5ldyBEYXRlKGJpbGxpbmdEYXRlKSA+IG5ldyBEYXRlKCkpIHtcclxuICAgICAgICBzZXRJc1N1YnNjcmliZWQodHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGlzR3Vlc3RTaWduKSB7XHJcbiAgICAgICAgICBzZXRJc1N1YnNjcmlwdGlvbkV4cGlyZWQodHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGhhbmRsZU5hdmlnYXRpb24ocGxhbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGlzR3Vlc3RTaWduKSB7XHJcbiAgICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgICBzZXRJc1N1YnNjcmliZWQodHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0SXNTdWJzY3JpcHRpb25FeHBpcmVkKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaXNHdWVzdFNpZ24pIHtcclxuICAgICAgICBzZXRJc1N1YnNjcmlwdGlvbkV4cGlyZWQodHJ1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaGFuZGxlTmF2aWdhdGlvbihyZXMucGxhbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLy9mdW5jdGlvbiBmb3IgZ2V0IGRvY3VtZW50IGRldGFpbHMgZm9yIHBlcnRpY3VsYXIgc2lnbmVyIHdpdGggc2lnbmVyJ29iamVjdCBpZFxyXG4gIGNvbnN0IGdldFRlbXBsYXRlRGV0YWlscyA9IGFzeW5jICgpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgdGVtcGxhdGVJZDogcHJvcHMudGVtcGxhdGVJZCwgaXNwdWJsaWM6IHRydWUgfTtcclxuICAgICAgY29uc3QgdGVtcGxhdGVEZWF0aWxzID0gYXdhaXQgYXhpb3MucG9zdChcclxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2dldFRlbXBsYXRlYCxcclxuICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgICAgc2Vzc2lvbnRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBkb2N1bWVudERhdGEgPVxyXG4gICAgICAgIHRlbXBsYXRlRGVhdGlscy5kYXRhICYmIHRlbXBsYXRlRGVhdGlscy5kYXRhLnJlc3VsdFxyXG4gICAgICAgICAgPyBbdGVtcGxhdGVEZWF0aWxzLmRhdGEucmVzdWx0XVxyXG4gICAgICAgICAgOiBbXTtcclxuICAgICAgaWYgKGRvY3VtZW50RGF0YSAmJiBkb2N1bWVudERhdGFbMF0/LmVycm9yKSB7XHJcbiAgICAgICAgcHJvcHM/LnNldFRlbXBsYXRlU3RhdHVzKHtcclxuICAgICAgICAgIHN0YXR1czogXCJJbnZhbGlkXCJcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmIChkb2N1bWVudERhdGEgJiYgZG9jdW1lbnREYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAoZG9jdW1lbnREYXRhWzBdPy5Jc1B1YmxpYykge1xyXG4gICAgICAgICAgcHJvcHM/LnNldFRlbXBsYXRlU3RhdHVzKHtcclxuICAgICAgICAgICAgc3RhdHVzOiBcIlN1Y2Nlc3NcIlxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCB1cmwgPVxyXG4gICAgICAgICAgICBkb2N1bWVudERhdGFbMF0gJiZcclxuICAgICAgICAgICAgKGRvY3VtZW50RGF0YVswXT8uU2lnbmVkVXJsIHx8IGRvY3VtZW50RGF0YVswXT8uVVJMKTtcclxuICAgICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgLy9jb252ZXJ0IGRvY3VtZW50IHVybCBpbiBhcnJheSBidWZmZXIgZm9ybWF0IHRvIHVzZSBlbWJlZCB3aWRnZXRzIGluIHBkZiB1c2luZyBwZGYtbGliXHJcbiAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgY29udmVydFBkZkFycmF5QnVmZmVyKHVybCk7XHJcbiAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlciA9PT0gXCJFcnJvclwiKSB7XHJcbiAgICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHNldFBkZkFycmF5QnVmZmVyKGFycmF5QnVmZmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2V0SXNQdWJsaWNUZW1wbGF0ZSh0cnVlKTtcclxuICAgICAgICAgIGNvbnN0IGdldFB1YmxpY1JvbGUgPSBkb2N1bWVudERhdGFbMF0/LlB1YmxpY1JvbGVbMF07XHJcbiAgICAgICAgICBjb25zdCBnZXRVbmlxdWVJZERldGFpbHMgPSBkb2N1bWVudERhdGFbMF0/LlBsYWNlaG9sZGVycy5maW5kKFxyXG4gICAgICAgICAgICAoeCkgPT4geC5Sb2xlID09PSBnZXRQdWJsaWNSb2xlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKGdldFVuaXF1ZUlkRGV0YWlscykge1xyXG4gICAgICAgICAgICBzZXRVbmlxdWVJZChnZXRVbmlxdWVJZERldGFpbHMuSWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2V0U2lnbmVyUG9zKGRvY3VtZW50RGF0YVswXT8uUGxhY2Vob2xkZXJzKTtcclxuICAgICAgICAgIGxldCBwbGFjZWhvbGRlcnNPclNpZ25lcnMgPSBbXTtcclxuICAgICAgICAgIC8vIGNvbnN0IHBsYWNlaG9sZGVyID0gZG9jdW1lbnREYXRhWzBdPy5QbGFjZWhvbGRlcnM7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsYWNlaG9sZGVyIG9mIGRvY3VtZW50RGF0YVswXS5QbGFjZWhvbGRlcnMpIHtcclxuICAgICAgICAgICAgLy9gZW1haWxFeGlzdGAgdmFyaWFibGUgdG8gaGFuZGxlIGNvbmRpdGlvbiBmb3IgcXVpY2sgc2VuZCBmbG93IGFuZCBzaG93IHVuc2lnbmVkIHNpZ25lcnMgbGlzdFxyXG4gICAgICAgICAgICBjb25zdCBzaWduZXJJZEV4aXN0ID0gcGxhY2Vob2xkZXI/LnNpZ25lck9iaklkO1xyXG4gICAgICAgICAgICBpZiAoc2lnbmVySWRFeGlzdCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGdldFNpZ25lckRhdGEgPSBkb2N1bWVudERhdGFbMF0uU2lnbmVycy5maW5kKFxyXG4gICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEub2JqZWN0SWQgPT09IHBsYWNlaG9sZGVyPy5zaWduZXJPYmpJZFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzT3JTaWduZXJzLnB1c2goZ2V0U2lnbmVyRGF0YSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzT3JTaWduZXJzLnB1c2gocGxhY2Vob2xkZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzZXRVblNpZ25lZFNpZ25lcnMocGxhY2Vob2xkZXJzT3JTaWduZXJzKTtcclxuICAgICAgICAgIHNldFBkZkRldGFpbHMoZG9jdW1lbnREYXRhKTtcclxuICAgICAgICAgIHNldElzTG9hZGluZyh7XHJcbiAgICAgICAgICAgIGlzTG9hZDogZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwcm9wcz8uc2V0VGVtcGxhdGVTdGF0dXMoe1xyXG4gICAgICAgICAgICBzdGF0dXM6IFwiUHJpdmF0ZVwiXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJvcHM/LnNldFRlbXBsYXRlU3RhdHVzKHtcclxuICAgICAgICAgIHN0YXR1czogXCJJbnZhbGlkXCJcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGdldCB0ZW1wbGF0ZSBkZXRhaWxzIFwiLCBlcnIpO1xyXG4gICAgICBpZiAoZXJyPy5yZXNwb25zZT8uZGF0YT8uY29kZSA9PT0gMTAxKSB7XHJcbiAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcImVycm9yLXRlbXBsYXRlXCIpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIGdldCBkb2N1bWVudCBkZXRhaWxzIGZvciBwZXJ0aWN1bGFyIHNpZ25lciB3aXRoIHNpZ25lcidvYmplY3QgaWRcclxuICBjb25zdCBnZXREb2N1bWVudERldGFpbHMgPSBhc3luYyAoZG9jSWQsIGlzTmV4dFVzZXIpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHNlbmRlclVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBqc29uU2VuZGVyID0gSlNPTi5wYXJzZShzZW5kZXJVc2VyKTtcclxuICAgICAgbGV0IGN1cnJVc2VySWQ7XHJcbiAgICAgIC8vZ2V0dGluZyBkb2N1bWVudCBkZXRhaWxzXHJcbiAgICAgIGNvbnN0IGRvY3VtZW50RGF0YSA9IGF3YWl0IGNvbnRyYWN0RG9jdW1lbnQoZG9jdW1lbnRJZCB8fCBkb2NJZCk7XHJcbiAgICAgIGlmIChkb2N1bWVudERhdGEgJiYgZG9jdW1lbnREYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCB1cmwgPVxyXG4gICAgICAgICAgZG9jdW1lbnREYXRhWzBdICYmXHJcbiAgICAgICAgICAoZG9jdW1lbnREYXRhWzBdPy5TaWduZWRVcmwgfHwgZG9jdW1lbnREYXRhWzBdPy5VUkwpO1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgIC8vY29udmVydCBkb2N1bWVudCB1cmwgaW4gYXJyYXkgYnVmZmVyIGZvcm1hdCB0byB1c2UgZW1iZWQgd2lkZ2V0cyBpbiBwZGYgdXNpbmcgcGRmLWxpYlxyXG4gICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBjb252ZXJ0UGRmQXJyYXlCdWZmZXIodXJsKTtcclxuICAgICAgICAgIGlmIChhcnJheUJ1ZmZlciA9PT0gXCJFcnJvclwiKSB7XHJcbiAgICAgICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldFBkZkFycmF5QnVmZmVyKGFycmF5QnVmZmVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFeHRVc2VySWQoZG9jdW1lbnREYXRhWzBdPy5FeHRVc2VyUHRyPy5vYmplY3RJZCk7XHJcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPVxyXG4gICAgICAgICAgZG9jdW1lbnREYXRhWzBdLklzQ29tcGxldGVkICYmIGRvY3VtZW50RGF0YVswXS5Jc0NvbXBsZXRlZDtcclxuICAgICAgICBjb25zdCBleHBpcmVEYXRlID0gZG9jdW1lbnREYXRhWzBdLkV4cGlyeURhdGUuaXNvO1xyXG4gICAgICAgIGNvbnN0IGRlY2xpbmVkID1cclxuICAgICAgICAgIGRvY3VtZW50RGF0YVswXS5Jc0RlY2xpbmVkICYmIGRvY3VtZW50RGF0YVswXS5Jc0RlY2xpbmVkO1xyXG4gICAgICAgIGNvbnN0IGV4cGlyZVVwZGF0ZURhdGUgPSBuZXcgRGF0ZShleHBpcmVEYXRlKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgY29uc3QgY3VyckRhdGUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICBjb25zdCBnZXRTaWduZXJzID0gZG9jdW1lbnREYXRhWzBdLlNpZ25lcnM7XHJcbiAgICAgICAgY29uc3QgZ2V0Q3VycmVudFNpZ25lciA9XHJcbiAgICAgICAgICBnZXRTaWduZXJzICYmXHJcbiAgICAgICAgICBnZXRTaWduZXJzLmZpbHRlcihcclxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEuVXNlcklkLm9iamVjdElkID09PSBqc29uU2VuZGVyPy5vYmplY3RJZFxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY3VyclVzZXJJZCA9IGdldEN1cnJlbnRTaWduZXJbMF0gPyBnZXRDdXJyZW50U2lnbmVyWzBdLm9iamVjdElkIDogXCJcIjtcclxuICAgICAgICBpZiAoaXNFbmFibGVTdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgIGF3YWl0IGNoZWNrSXNTdWJzY3JpYmVkKFxyXG4gICAgICAgICAgICBkb2N1bWVudERhdGFbMF0/LkV4dFVzZXJQdHI/Lm9iamVjdElkLFxyXG4gICAgICAgICAgICBjdXJyVXNlcklkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VyclVzZXJJZCkge1xyXG4gICAgICAgICAgc2V0U2lnbmVyT2JqZWN0SWQoY3VyclVzZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkb2N1bWVudERhdGFbMF0uU2lnbmVkVXJsKSB7XHJcbiAgICAgICAgICBzZXRQZGZVcmwoZG9jdW1lbnREYXRhWzBdLlNpZ25lZFVybCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNldFBkZlVybChkb2N1bWVudERhdGFbMF0uVVJMKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzQ29tcGxldGVkKSB7XHJcbiAgICAgICAgICBzZXRJc1NpZ25lZCh0cnVlKTtcclxuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IGlzQ2VydGlmaWNhdGU6IHRydWUsIGlzTW9kYWw6IHRydWUgfTtcclxuICAgICAgICAgIHNldEFscmVhZHlTaWduKHRydWUpO1xyXG4gICAgICAgICAgc2V0SXNDb21wbGV0ZWQoZGF0YSk7XHJcbiAgICAgICAgICBzZXRJc0NlbGVicmF0aW9uKHRydWUpO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBzZXRJc0NlbGVicmF0aW9uKGZhbHNlKSwgNTAwMCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkZWNsaW5lZCkge1xyXG4gICAgICAgICAgY29uc3QgY3VycmVudERlY2xpbmUgPSB7XHJcbiAgICAgICAgICAgIGN1cnJudDogXCJhbm90aGVyXCIsXHJcbiAgICAgICAgICAgIGlzRGVjbGluZWQ6IHRydWVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBzZXRJc0RlY2xpbmUoY3VycmVudERlY2xpbmUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY3VyckRhdGUgPiBleHBpcmVVcGRhdGVEYXRlKSB7XHJcbiAgICAgICAgICBjb25zdCBleHBpcmVEYXRlRm9ybWF0ID0gbW9tZW50KG5ldyBEYXRlKGV4cGlyZURhdGUpKS5mb3JtYXQoXHJcbiAgICAgICAgICAgIFwiTU1NIERELCBZWVlZXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBzZXRJc0V4cGlyZWQodHJ1ZSk7XHJcbiAgICAgICAgICBzZXRFeHBpcmVkRGF0ZShleHBpcmVEYXRlRm9ybWF0KTtcclxuICAgICAgICB9IC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHNpZ25lciBpcyBub3QgYSBsYXN0IHNpZ25lciBhbmQgaGFuZGxlIHRoZSBjb21wbGV0ZSBtZXNzYWdlLlxyXG4gICAgICAgIGVsc2UgaWYgKGlzTmV4dFVzZXIpIHtcclxuICAgICAgICAgIHNldElzQ2VsZWJyYXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHNldElzQ2VsZWJyYXRpb24oZmFsc2UpLCA1MDAwKTtcclxuICAgICAgICAgIHNldElzQ29tcGxldGVkKHtcclxuICAgICAgICAgICAgaXNNb2RhbDogdHJ1ZSxcclxuICAgICAgICAgICAgbWVzc2FnZTogdChcImRvY3VtZW50LXNpZ25lZC1hbGVydC0xXCIpXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGN1cnJVc2VySWQpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJyZW50VXNlciA9IGRvY3VtZW50RGF0YVswXS5QbGFjZWhvbGRlcnMuZmluZChcclxuICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YT8uc2lnbmVyT2JqSWQgPT09IGN1cnJVc2VySWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKGNoZWNrQ3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgICBzZXRDdXJyZW50U2lnbmVyKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGF1ZGl0dHJhaWxEYXRhID1cclxuICAgICAgICAgIGRvY3VtZW50RGF0YVswXS5BdWRpdFRyYWlsICYmXHJcbiAgICAgICAgICBkb2N1bWVudERhdGFbMF0uQXVkaXRUcmFpbC5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICBkb2N1bWVudERhdGFbMF0uQXVkaXRUcmFpbC5maWx0ZXIoXHJcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLkFjdGl2aXR5ID09PSBcIlNpZ25lZFwiXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBjaGVja0FscmVhZHlTaWduID1cclxuICAgICAgICAgIGRvY3VtZW50RGF0YVswXS5BdWRpdFRyYWlsICYmXHJcbiAgICAgICAgICBkb2N1bWVudERhdGFbMF0uQXVkaXRUcmFpbC5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICBkb2N1bWVudERhdGFbMF0uQXVkaXRUcmFpbC5maWx0ZXIoXHJcbiAgICAgICAgICAgIChkYXRhKSA9PlxyXG4gICAgICAgICAgICAgIGRhdGEuVXNlclB0cj8ub2JqZWN0SWQgPT09IGN1cnJVc2VySWQgJiZcclxuICAgICAgICAgICAgICBkYXRhLkFjdGl2aXR5ID09PSBcIlNpZ25lZFwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNoZWNrQWxyZWFkeVNpZ24gJiZcclxuICAgICAgICAgIGNoZWNrQWxyZWFkeVNpZ25bMF0gJiZcclxuICAgICAgICAgIGNoZWNrQWxyZWFkeVNpZ24ubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2V0QWxyZWFkeVNpZ24odHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9iaiA9IGRvY3VtZW50RGF0YT8uWzBdO1xyXG4gICAgICAgICAgc2V0U2VuZEluT3JkZXIob2JqPy5TZW5kaW5PcmRlciB8fCBmYWxzZSk7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIG9iaiAmJlxyXG4gICAgICAgICAgICBvYmouU2lnbmVycyAmJlxyXG4gICAgICAgICAgICBvYmouU2lnbmVycy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgIG9iai5QbGFjZWhvbGRlcnMgJiZcclxuICAgICAgICAgICAgb2JqLlBsYWNlaG9sZGVycy5sZW5ndGggPiAwXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICAgIGV2ZW50OiBcInZpZXdlZFwiLFxyXG4gICAgICAgICAgICAgIGNvbnRhY3RJZDogY3VyclVzZXJJZCxcclxuICAgICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogZG9jdW1lbnREYXRhPy5bMF0ub2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBmaWxlOiBkb2N1bWVudERhdGE/LlswXT8uU2lnbmVkVXJsIHx8IGRvY3VtZW50RGF0YT8uWzBdPy5VUkwsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBkb2N1bWVudERhdGE/LlswXS5OYW1lLFxyXG4gICAgICAgICAgICAgICAgbm90ZTogZG9jdW1lbnREYXRhPy5bMF0uTm90ZSB8fCBcIlwiLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRvY3VtZW50RGF0YT8uWzBdLkRlc2NyaXB0aW9uIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBzaWduZXJzOiBkb2N1bWVudERhdGE/LlswXS5TaWduZXJzPy5tYXAoKHgpID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHg/Lk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiB4Py5FbWFpbCxcclxuICAgICAgICAgICAgICAgICAgcGhvbmU6IHg/LlBob25lXHJcbiAgICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgICAgICB2aWV3ZWRCeToganNvblNlbmRlci5lbWFpbCxcclxuICAgICAgICAgICAgICAgIHZpZXdlZEF0OiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBkb2N1bWVudERhdGE/LlswXS5jcmVhdGVkQXRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IGF4aW9zLnBvc3QoXHJcbiAgICAgICAgICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2NhbGx3ZWJob29rYCxcclxuICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb250b2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnIgXCIsIGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzaWduZXJzID0gW107XHJcbiAgICAgICAgbGV0IHVuU2lnbmVkU2lnbmVyID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyc09yU2lnbmVycyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgcGxhY2Vob2xkZXIgb2YgZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycykge1xyXG4gICAgICAgICAgLy9gZW1haWxFeGlzdGAgdmFyaWFibGUgdG8gaGFuZGxlIGNvbmRpdGlvbiBmb3IgcXVpY2sgc2VuZCBmbG93IGFuZCBzaG93IHVuc2lnbmVkIHNpZ25lcnMgbGlzdFxyXG4gICAgICAgICAgY29uc3Qgc2lnbmVySWRFeGlzdCA9IHBsYWNlaG9sZGVyPy5zaWduZXJPYmpJZDtcclxuICAgICAgICAgIGlmIChzaWduZXJJZEV4aXN0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdldFNpZ25lckRhdGEgPSBkb2N1bWVudERhdGFbMF0uU2lnbmVycy5maW5kKFxyXG4gICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLm9iamVjdElkID09PSBwbGFjZWhvbGRlcj8uc2lnbmVyT2JqSWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXJzT3JTaWduZXJzLnB1c2goZ2V0U2lnbmVyRGF0YSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcnNPclNpZ25lcnMucHVzaChwbGFjZWhvbGRlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIGFscmVhZHkgc2lnbmVkIGRvY3VtZW50IGJ5IHNvbWVvbmVcclxuICAgICAgICBpZiAoYXVkaXR0cmFpbERhdGEgJiYgYXVkaXR0cmFpbERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgc2V0SXNEb2NJZCh0cnVlKTtcclxuXHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGxhY2Vob2xkZXJzT3JTaWduZXJzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrRW1haWwgPSBpdGVtPy5lbWFpbDtcclxuICAgICAgICAgICAgLy9pZiBlbWFpbCBleGlzdCB0aGVuIGNvbXBhcmUgdXNlciBzaWduZWQgYnkgdXNpbmcgZW1haWwgZWxzZSBzaWduZXJzIG9iamVjdElkXHJcbiAgICAgICAgICAgIGNvbnN0IGVtYWlsT3JJZCA9IGNoZWNrRW1haWwgPyBpdGVtLmVtYWlsIDogaXRlbT8ub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgIC8vYGlzU2lnbmVkU2lnbmF0dXJlYCB2YXJpYWJsZSB0byBoYW5kbGUgYnJlYWsgbG9vcCB3aGVuZXZlciBpdCBnZXQgdHJ1ZVxyXG4gICAgICAgICAgICBsZXQgaXNTaWduZWRTaWduYXR1cmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy9jaGVja2luZyB0aGUgc2lnbmVyIHdobyBzaWduZWQgdGhlIGRvY3VtZW50IGJ5IHVzaW5nIGF1ZGl0IHRyYWlsIGRldGFpbHMuXHJcbiAgICAgICAgICAgIC8vYW5kIHNhdmUgc2lnbmVkU2lnbmVycyBhbmQgdW5zaWduZWRTaWduZXJzIGRldGFpbHNcclxuICAgICAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgYXVkaXR0cmFpbERhdGEpIHtcclxuICAgICAgICAgICAgICBjb25zdCBzaWduZWRFeGlzdCA9IGNoZWNrRW1haWxcclxuICAgICAgICAgICAgICAgID8gZG9jPy5Vc2VyUHRyPy5FbWFpbFxyXG4gICAgICAgICAgICAgICAgOiBkb2M/LlVzZXJQdHI/Lm9iamVjdElkO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZW1haWxPcklkID09PSBzaWduZWRFeGlzdCkge1xyXG4gICAgICAgICAgICAgICAgc2lnbmVycy5wdXNoKHsgLi4uaXRlbSB9KTtcclxuICAgICAgICAgICAgICAgIGlzU2lnbmVkU2lnbmF0dXJlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWlzU2lnbmVkU2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICAgICAgdW5TaWduZWRTaWduZXIucHVzaCh7IC4uLml0ZW0gfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNldFNpZ25lZFNpZ25lcnMoc2lnbmVycyk7XHJcbiAgICAgICAgICBzZXRVblNpZ25lZFNpZ25lcnModW5TaWduZWRTaWduZXIpO1xyXG4gICAgICAgICAgc2V0U2lnbmVyUG9zKGRvY3VtZW50RGF0YVswXS5QbGFjZWhvbGRlcnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIGlzIHNob3cgdGhlcmUgYXJlIG5vIGRldGFpbHMgaW4gYXVkaXQgdHJhaWwgdGhlbiBkaXJlY3QgcHVzaCBhbGwgc2lnbmVycyBkZXRhaWxzXHJcbiAgICAgICAgICAvL2luIHVuc2lnbmVkc2lnbmVycyBhcnJheVxyXG4gICAgICAgICAgc2V0VW5TaWduZWRTaWduZXJzKHBsYWNlaG9sZGVyc09yU2lnbmVycyk7XHJcbiAgICAgICAgICBzZXRTaWduZXJQb3MoZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFBkZkRldGFpbHMoZG9jdW1lbnREYXRhKTtcclxuICAgICAgICAvL2NoZWNraW5nIGlmIGNvbmRpdGlvbiBjdXJyZW50IHVzZXIgYWxyZWFkeSBzaWduIG9yIG93bmVyIGRvZXMgbm90IGV4aXN0IGFzIGEgc2lnbmVyIG9yIGRvY3VtZW50IGhhcyBiZWVuIGRlY2xpbmVkIGJ5IHNvbWVvbmUgb3IgZG9jdW1lbnQgaGFzIGJlZW4gZXhwaXJlZFxyXG4gICAgICAgIC8vdGhlbiBzdG9wIHRvIGRpc3BsYXkgdG91ciBtZXNzYWdlXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgKGNoZWNrQWxyZWFkeVNpZ24gJiZcclxuICAgICAgICAgICAgY2hlY2tBbHJlYWR5U2lnblswXSAmJlxyXG4gICAgICAgICAgICBjaGVja0FscmVhZHlTaWduLmxlbmd0aCA+IDApIHx8XHJcbiAgICAgICAgICAhY3VyclVzZXJJZCB8fFxyXG4gICAgICAgICAgZGVjbGluZWQgfHxcclxuICAgICAgICAgIGN1cnJEYXRlID4gZXhwaXJlVXBkYXRlRGF0ZVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2V0UmVxdWVzdFNpZ25Ub3VyKHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIHRvIGNoZWNrIGN1cnJlbnQgdXNlciBleGlzdCBpbiBjb250cmFjdHNfVXNlcnMgY2xhc3MgYW5kIGNoZWNrIHRvdXIgbWVzc2FnZSBzdGF0dXNcclxuICAgICAgICAgIC8vaWYgbm90IHRoZW4gY2hlY2sgdXNlciBleGlzdCBpbiBjb250cmFjdHNfQ29udGFjdGJvb2sgY2xhc3MgYW5kIGNoZWNrIHRvdXIgbWVzc2FnZSBzdGF0dVxyXG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY29udHJhY3RVc2VycygpO1xyXG4gICAgICAgICAgaWYgKHJlcyA9PT0gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpIHtcclxuICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChyZXNbMF0gJiYgcmVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgc2V0Q29udHJhY3ROYW1lKFwiX1VzZXJzXCIpO1xyXG4gICAgICAgICAgICBjdXJyVXNlcklkID0gcmVzWzBdLm9iamVjdElkO1xyXG4gICAgICAgICAgICBzZXRTaWduZXJVc2VySWQoY3VyclVzZXJJZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvdXJEYXRhID0gcmVzWzBdLlRvdXJTdGF0dXMgJiYgcmVzWzBdLlRvdXJTdGF0dXM7XHJcbiAgICAgICAgICAgIGlmICh0b3VyRGF0YSAmJiB0b3VyRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tUb3VyUmVxdWVzdCA9IHRvdXJEYXRhLmZpbHRlcihcclxuICAgICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhPy5yZXF1ZXN0U2lnblxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgc2V0VG91clN0YXR1cyh0b3VyRGF0YSk7XHJcbiAgICAgICAgICAgICAgc2V0UmVxdWVzdFNpZ25Ub3VyKGNoZWNrVG91clJlcXVlc3RbMF0/LnJlcXVlc3RTaWduIHx8IGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmIChyZXM/Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjb250YWN0Qm9vayhjdXJyVXNlcklkKTtcclxuICAgICAgICAgICAgaWYgKHJlcyA9PT0gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpIHtcclxuICAgICAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzWzBdICYmIHJlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICBzZXRDb250cmFjdE5hbWUoXCJfQ29udGFjdGJvb2tcIik7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSByZXNbMF0ub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgICAgc2V0U2lnbmVyVXNlcklkKG9iamVjdElkKTtcclxuICAgICAgICAgICAgICBjb25zdCB0b3VyRGF0YSA9IHJlc1swXS5Ub3VyU3RhdHVzICYmIHJlc1swXS5Ub3VyU3RhdHVzO1xyXG4gICAgICAgICAgICAgIGlmICh0b3VyRGF0YSAmJiB0b3VyRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja1RvdXJSZXF1ZXN0ID0gdG91ckRhdGEuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YT8ucmVxdWVzdFNpZ25cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBzZXRUb3VyU3RhdHVzKHRvdXJEYXRhKTtcclxuICAgICAgICAgICAgICAgIHNldFJlcXVlc3RTaWduVG91cihjaGVja1RvdXJSZXF1ZXN0WzBdPy5yZXF1ZXN0U2lnbiB8fCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwidXNlci1ub3QtZXhpc3RcIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzVWlMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICBkb2N1bWVudERhdGEgPT09IFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiIHx8XHJcbiAgICAgICAgKGRvY3VtZW50RGF0YS5yZXN1bHQgJiYgZG9jdW1lbnREYXRhLnJlc3VsdC5lcnJvcilcclxuICAgICAgKSB7XHJcbiAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgIHNldElzTG9hZGluZyh7IGlzTG9hZDogZmFsc2UgfSk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gIGdldERvY3VtZW50IGNsb3VkIGZ1bmN0aW9uIFwiKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwibm8tZGF0YVwiKSk7XHJcbiAgICAgICAgc2V0SXNVaUxvYWRpbmcoeyBpc0xvYWQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vZnVuY3Rpb24gdG8gZ2V0IGRlZmF1bHQgc2lnbmF0dXIgZW9mIGN1cnJlbnQgdXNlciBmcm9tIGBjb250cmFjdHNfU2lnbmF0dXJlYCBjbGFzc1xyXG4gICAgICBjb25zdCBkZWZhdWx0U2lnblJlcyA9IGF3YWl0IGdldERlZmF1bHRTaWduYXR1cmUoanNvblNlbmRlci5vYmplY3RJZCk7XHJcbiAgICAgIGlmIChkZWZhdWx0U2lnblJlcz8uc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgIHNldERlZmF1bHRTaWduSW1nKGRlZmF1bHRTaWduUmVzPy5yZXM/LmRlZmF1bHRTaWduYXR1cmUpO1xyXG4gICAgICAgIHNldE15SW5pdGlhbChkZWZhdWx0U2lnblJlcz8ucmVzPy5kZWZhdWx0SW5pdGlhbCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdFNpZ25SZXM/LnN0YXR1cyA9PT0gXCJlcnJvclwiKSB7XHJcbiAgICAgICAgc2V0SGFuZGxlRXJyb3IoXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHNldElzTG9hZGluZyh7IGlzTG9hZDogZmFsc2UgfSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJFcnJvcjogZXJyb3IgaW4gZ2V0RG9jdW1lbnREZXRhaWxzXCIsIGVycik7XHJcbiAgICAgIHNldEhhbmRsZUVycm9yKFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiKTtcclxuICAgICAgc2V0SXNMb2FkaW5nKHsgaXNMb2FkOiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIGVtYmVkIHNpZ25hdHVyZSBvciBpbWFnZSB1cmwgaW4gcGRmXHJcbiAgYXN5bmMgZnVuY3Rpb24gZW1iZWRXaWRnZXRzRGF0YSgpIHtcclxuICAgIC8vZm9yIGVtYWlsVmVyaWZpZWQgZGF0YSBjaGVja2luZyBmaXJzdCBpbiBsb2NhbHN0b3JhZ2VcclxuICAgIGNvbnN0IGxvY2FsdXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGxldCBjdXJyZW50VXNlciA9IEpTT04ucGFyc2UobG9jYWx1c2VyKTtcclxuICAgIC8vaWYgZW1haWxWZXJpZmllZCBkYXRhIGlzIG5vdCBwcmVzZW50IGluIGxvY2FsIHVzZXIgZGV0YWlscyB0aGVuIGZldGNoIGFnYWluIGluIF9Vc2VyIGNsYXNzXHJcbiAgICBpZiAoIWN1cnJlbnRVc2VyPy5lbWFpbFZlcmlmaWVkKSB7XHJcbiAgICAgIGNvbnN0IHVzZXJRdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShQYXJzZS5Vc2VyKTtcclxuICAgICAgY29uc3QgZ2V0VXNlciA9IGF3YWl0IHVzZXJRdWVyeS5nZXQoY3VycmVudFVzZXI/Lm9iamVjdElkLCB7XHJcbiAgICAgICAgc2Vzc2lvblRva2VuOiBjdXJyZW50VXNlcj8uc2Vzc2lvblRva2VuXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoZ2V0VXNlcikge1xyXG4gICAgICAgIGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnZXRVc2VyKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBpc0VtYWlsVmVyaWZpZWQgPSBjdXJyZW50VXNlcj8uZW1haWxWZXJpZmllZDtcclxuICAgIC8vY2hlY2sgaWYgaXNFbWFpbFZlcmlmaWVkIHRoZW4gZ28gb24gbmV4dCBzdGVwXHJcbiAgICBpZiAoaXNFbWFpbFZlcmlmaWVkKSB7XHJcbiAgICAgIHNldElzRW1haWxWZXJpZmllZChpc0VtYWlsVmVyaWZpZWQpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrVXNlciA9IHNpZ25lclBvcy5maWx0ZXIoXHJcbiAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChjaGVja1VzZXIgJiYgY2hlY2tVc2VyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBjaGVja2JveEV4aXN0LFxyXG4gICAgICAgICAgICByZXF1aXJlZFJhZGlvLFxyXG4gICAgICAgICAgICBzaG93QWxlcnQgPSBmYWxzZSxcclxuICAgICAgICAgICAgd2lkZ2V0S2V5LFxyXG4gICAgICAgICAgICByYWRpb0V4aXN0LFxyXG4gICAgICAgICAgICByZXF1aXJlZENoZWNrYm94LFxyXG4gICAgICAgICAgICBUb3VyUGFnZU51bWJlcjsgLy8gYHBhZ2VOdW1iZXJgIGlzIHVzZWQgdG8gY2hlY2sgb24gd2hpY2ggcGFnZSB1c2VyIGRpZCBub3QgZmlsbCB3aWRnZXQncyBkYXRhIHRoZW4gY2hhbmdlIGN1cnJlbnQgcGFnZU51bWJlciBhbmQgc2hvdyB0b3VyIG1lc3NhZ2Ugb24gdGhhdCBwYWdlXHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgLy9nZXQgY3VycmVudCBwYWdlXHJcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlUGFnZSA9IGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXT8ucGFnZU51bWJlcjtcclxuICAgICAgICAgICAgICAvL2NoZWNraW5nIGNoZWNib3ggdHlwZSB3aWRnZXRcclxuICAgICAgICAgICAgICBjaGVja2JveEV4aXN0ID1cclxuICAgICAgICAgICAgICAgIGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXS5wb3Nbal0udHlwZSA9PT0gXCJjaGVja2JveFwiO1xyXG4gICAgICAgICAgICAgIC8vY2hlY2tpbmcgcmFkaW8gYnV0dG9uIHR5cGUgd2lkZ2V0XHJcbiAgICAgICAgICAgICAgcmFkaW9FeGlzdCA9XHJcbiAgICAgICAgICAgICAgICBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zW2pdLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0O1xyXG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIGNoZWNrYm94IHdpZGdldCBleGlzdCBvciBub3RcclxuICAgICAgICAgICAgICBpZiAoY2hlY2tib3hFeGlzdCkge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgYWxsIHJlcXVpcmVkIHR5cGUgY2hlY2tib3hcclxuICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2hlY2tib3ggPSBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICFwb3NpdGlvbi5vcHRpb25zPy5pc1JlYWRPbmx5ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24udHlwZSA9PT0gXCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgLy9pZiByZXF1aXJlZCB0eXBlIGNoZWNrYm94IGRhdGEgZXhpdCB0aGVuIGNoZWNrIHVzZXIgY2hlY2tlZCBhbGwgY2hlY2tib3ggb3Igc29tZSBjaGVja2JveCByZW1haW4gdG8gY2hlY2tcclxuICAgICAgICAgICAgICAgIC8vYWxzbyB2YWxpZGF0ZSB0byBtaW5pbXVtIGFuZCBtYXhpbXVtIHJlcXVpcmVkIGNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRDaGVja2JveCAmJiByZXF1aXJlZENoZWNrYm94Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1aXJlZENoZWNrYm94Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgbWluaW11bSByZXF1aXJlZCBjb3VudCBpZiAgZXhpdFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbkNvdW50ID1cclxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2hlY2tib3hbaV0ub3B0aW9ucz8udmFsaWRhdGlvbj8ubWluUmVxdWlyZWRDb3VudDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZU1pbiA9IG1pbkNvdW50ICYmIHBhcnNlSW50KG1pbkNvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAvL2dldCBtYXhpbXVtIHJlcXVpcmVkIGNvdW50IGlmICBleGl0XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4Q291bnQgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRDaGVja2JveFtpXS5vcHRpb25zPy52YWxpZGF0aW9uPy5tYXhSZXF1aXJlZENvdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlTWF4ID0gbWF4Q291bnQgJiYgcGFyc2VJbnQobWF4Q291bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vaW4gYHJlc3BvbnNlYCB2YXJpYWJsZSBpcyB1c2VkIHRvIGdldCBob3cgbWFueSBjaGVja2JveCBjaGVja2VkIGJ5IHVzZXJcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZENoZWNrYm94W2ldLm9wdGlvbnM/LnJlc3BvbnNlPy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9pbiBgZGVmYXVsdFZhbHVlYCB2YXJpYWJsZSBpcyB1c2VkIHRvIGdldCBob3cgbWFueSBjaGVja2JveCBjaGVja2VkIGJ5IGRlZmF1bHRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRDaGVja2JveFtpXS5vcHRpb25zPy5kZWZhdWx0VmFsdWU/Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbmRpdGlvbiB0byBjaGVjayAgcGFyc2VNaW4gIGFuZCBwYXJzZU1heCBncmVhdGVyIHRoYW4gMCAgdGhlbiBjb25zaWRlciBpdCBhcyBhIHJlcXVpcmVkIGNoZWNrIGJveFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTWluID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFyc2VNYXggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAhcmVzcG9uc2UgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICFkZWZhdWx0VmFsdWUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICFzaG93QWxlcnRcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHNob3dBbGVydCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRLZXkgPSByZXF1aXJlZENoZWNrYm94W2ldLmtleTtcclxuICAgICAgICAgICAgICAgICAgICAgIFRvdXJQYWdlTnVtYmVyID0gdXBkYXRlUGFnZTtcclxuICAgICAgICAgICAgICAgICAgICAgIHNldG1pblJlcXVpcmVkQ291bnQocGFyc2VNaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIHRvIHZhbGlkYXRlIG1pbmltdW0gcmVxdWlyZWQgY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTWluID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgKHBhcnNlTWluID4gcmVzcG9uc2UgfHwgIXJlc3BvbnNlKVxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93QWxlcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FsZXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0S2V5ID0gcmVxdWlyZWRDaGVja2JveFtpXS5rZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRvdXJQYWdlTnVtYmVyID0gdXBkYXRlUGFnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0bWluUmVxdWlyZWRDb3VudChwYXJzZU1pbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIHJhZGlvIHdpZGdldCBleGlzdCBvciBub3RcclxuICAgICAgICAgICAgICBlbHNlIGlmIChyYWRpb0V4aXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBhbGwgcmVxdWlyZWQgdHlwZSByYWRpbyBidXR0b25cclxuICAgICAgICAgICAgICAgIHJlcXVpcmVkUmFkaW8gPSBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICFwb3NpdGlvbi5vcHRpb25zPy5pc1JlYWRPbmx5ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24udHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAvL2lmIHJlcXVpcmVkIHR5cGUgcmFkaW8gZGF0YSBleGl0IHRoZW4gY2hlY2sgdXNlciBjaGVja2VkIGFsbCByYWRpbyBidXR0b24gb3Igc29tZSByYWRpbyByZW1haW4gdG8gY2hlY2tcclxuICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFJhZGlvICYmIHJlcXVpcmVkUmFkaW8/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrU2lnbmVkO1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVpcmVkUmFkaW8/Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTaWduZWQgPSByZXF1aXJlZFJhZGlvW2ldPy5vcHRpb25zPy5yZXNwb25zZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrU2lnbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tEZWZhdWx0U2lnbmVkID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRSYWRpb1tpXT8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0RlZmF1bHRTaWduZWQgJiYgIXNob3dBbGVydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QWxlcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRLZXkgPSByZXF1aXJlZFJhZGlvW2ldLmtleTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVG91clBhZ2VOdW1iZXIgPSB1cGRhdGVQYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRtaW5SZXF1aXJlZENvdW50KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIHRvIGNoZWNrIGFsbCB0eXBlIHdpZGdldCBkYXRhIGZpbGwgb3Igbm90IGV4Y2VwdCBjaGVja2JveCBhbmQgcmFkaW8gYnV0dG9uXHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBhbGwgcmVxdWlyZWQgdHlwZSB3aWRnZXRzIGV4Y2VwdCBjaGVja2JveCBhbmQgcmFkaW9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkV2lkZ2V0cyA9IGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXS5wb3MuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAocG9zaXRpb24pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24ub3B0aW9ucz8uc3RhdHVzID09PSBcInJlcXVpcmVkXCIgJiZcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi50eXBlICE9PSByYWRpb0J1dHRvbldpZGdldCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnR5cGUgIT09IFwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFdpZGdldHMgJiYgcmVxdWlyZWRXaWRnZXRzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjaGVja1NpZ25lZDtcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1aXJlZFdpZGdldHM/Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTaWduZWQgPSByZXF1aXJlZFdpZGdldHNbaV0/Lm9wdGlvbnM/LnJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tTaWduZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrU2lnblVybCA9IHJlcXVpcmVkV2lkZ2V0c1tpXT8ucG9zPy5TaWduVXJsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja1NpZ25VcmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrRGVmYXVsdFNpZ25lZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRXaWRnZXRzW2ldPy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tEZWZhdWx0U2lnbmVkICYmICFzaG93QWxlcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWxlcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldEtleSA9IHJlcXVpcmVkV2lkZ2V0c1tpXS5rZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVG91clBhZ2VOdW1iZXIgPSB1cGRhdGVQYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldG1pblJlcXVpcmVkQ291bnQobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy93aGVuIHNob3dBbGVydCBpcyB0cnVlIHRoZW4gYnJlYWsgdGhlIGxvb3AgYW5kIHNob3cgYWxlcnQgdG8gZmlsbCByZXF1aXJlZCBkYXRhIGluIHdpZGdldHNcclxuICAgICAgICAgICAgaWYgKHNob3dBbGVydCkge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoY2hlY2tib3hFeGlzdCAmJiByZXF1aXJlZENoZWNrYm94ICYmIHNob3dBbGVydCkge1xyXG4gICAgICAgICAgICBzZXRVblNpZ25lZFdpZGdldElkKHdpZGdldEtleSk7XHJcbiAgICAgICAgICAgIHNldFBhZ2VOdW1iZXIoVG91clBhZ2VOdW1iZXIpO1xyXG4gICAgICAgICAgICBzZXRXaWRnZXRzVG91cih0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAocmFkaW9FeGlzdCAmJiBzaG93QWxlcnQpIHtcclxuICAgICAgICAgICAgc2V0VW5TaWduZWRXaWRnZXRJZCh3aWRnZXRLZXkpO1xyXG4gICAgICAgICAgICBzZXRQYWdlTnVtYmVyKFRvdXJQYWdlTnVtYmVyKTtcclxuICAgICAgICAgICAgc2V0V2lkZ2V0c1RvdXIodHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHNob3dBbGVydCkge1xyXG4gICAgICAgICAgICBzZXRVblNpZ25lZFdpZGdldElkKHdpZGdldEtleSk7XHJcbiAgICAgICAgICAgIHNldFBhZ2VOdW1iZXIoVG91clBhZ2VOdW1iZXIpO1xyXG4gICAgICAgICAgICBzZXRXaWRnZXRzVG91cih0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldElzVWlMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICAvLyBgd2lkZ2V0c2AgaXMgVXNlZCB0byByZXR1cm4gd2lkZ2V0cyBkZXRhaWxzIHdpdGggcGFnZSBudW1iZXIgb2YgY3VycmVudCB1c2VyXHJcbiAgICAgICAgICAgIGNvbnN0IHdpZGdldHMgPSBjaGVja1VzZXI/LlswXT8ucGxhY2VIb2xkZXI7XHJcblxyXG4gICAgICAgICAgICAvLyBMb2FkIGEgUERGRG9jdW1lbnQgZnJvbSB0aGUgZXhpc3RpbmcgUERGIGJ5dGVzXHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUGRmQnl0ZXMgPSBwZGZBcnJheUJ1ZmZlcjtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKGV4aXN0aW5nUGRmQnl0ZXMpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGlzU2lnbllvdXJTZWxmRmxvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGV4dFVzZXJQdHIgPSBwZGZEZXRhaWxzWzBdLkV4dFVzZXJQdHI7XHJcbiAgICAgICAgICAgICAgY29uc3QgSGVhZGVyRG9jSWQgPSBleHRVc2VyUHRyPy5IZWFkZXJEb2NJZDtcclxuICAgICAgICAgICAgICAvL2VtYmVkIGRvY3VtZW50J3Mgb2JqZWN0IGlkIHRvIGFsbCBwYWdlcyBpbiBwZGYgZG9jdW1lbnRcclxuICAgICAgICAgICAgICBpZiAoIUhlYWRlckRvY0lkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzRG9jSWQpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZW1iZWREb2NJZChwZGZEb2MsIGRvY3VtZW50SWQsIGFsbFBhZ2VzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy9lbWJlZCBtdWx0aSBzaWduYXR1cmUgaW4gcGRmXHJcbiAgICAgICAgICAgICAgY29uc3QgcGRmQnl0ZXMgPSBhd2FpdCBtdWx0aVNpZ25FbWJlZChcclxuICAgICAgICAgICAgICAgIHdpZGdldHMsXHJcbiAgICAgICAgICAgICAgICBwZGZEb2MsXHJcbiAgICAgICAgICAgICAgICBpc1NpZ25Zb3VyU2VsZkZsb3csXHJcbiAgICAgICAgICAgICAgICBzY2FsZSxcclxuICAgICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0gsXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJXSFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJwZGZ0ZVwiLCBwZGZCeXRlcyk7XHJcbiAgICAgICAgICAgICAgLy9nZXQgRXhpc3RVc2VyUHRyIG9iamVjdCBpZCBvZiB1c2VyIGNsYXNzIHRvIGdldCB0ZW5hbnREZXRhaWxzXHJcbiAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSBwZGZEZXRhaWxzPy5bMF0/LkV4dFVzZXJQdHI/LlVzZXJJZD8ub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgICAgLy9nZXQgRXhpc3RVc2VyUHRyIGVtYWlsIHRvIGdldCB1c2VyRGV0YWlsc1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvbnRyYWN0VXNlcnMoKTtcclxuICAgICAgICAgICAgICBsZXQgYWN0aXZlTWFpbEFkYXB0ZXIgPSBcIlwiO1xyXG4gICAgICAgICAgICAgIGlmIChyZXMgPT09IFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgICAgICAgICAgICBzZXRJc0xvYWRpbmcoeyBpc0xvYWQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlcyB8fCByZXM/Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlTWFpbEFkYXB0ZXIgPSBcIlwiO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzWzBdICYmIHJlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZU1haWxBZGFwdGVyID0gcmVzWzBdPy5hY3RpdmVfbWFpbF9hZGFwdGVyO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL2Z1bmN0aW9uIGZvciBjYWxsIHRvIGVtYmVkIHNpZ25hdHVyZSBpbiBwZGYgYW5kIGdldCBkaWdpdGFsIHNpZ25hdHVyZSBwZGZcclxuICAgICAgICAgICAgICBjb25zdCByZXNTaWduID0gYXdhaXQgc2lnblBkZkZ1bihcclxuICAgICAgICAgICAgICAgIHBkZkJ5dGVzLFxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRJZCxcclxuICAgICAgICAgICAgICAgIHNpZ25lck9iamVjdElkLFxyXG4gICAgICAgICAgICAgICAgb2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBpc1N1YnNjcmliZWQsXHJcbiAgICAgICAgICAgICAgICBhY3RpdmVNYWlsQWRhcHRlcixcclxuICAgICAgICAgICAgICAgIHdpZGdldHNcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGlmIChyZXNTaWduICYmIHJlc1NpZ24uc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgICAgICAgc2V0UGRmVXJsKHJlcy5kYXRhKTtcclxuICAgICAgICAgICAgICAgIHNldElzU2lnbmVkKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2V0U2lnbmVkU2lnbmVycyhbXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRVblNpZ25lZFNpZ25lcnMoW10pO1xyXG4gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnREZXRhaWxzKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwZGZEZXRhaWxzPy5bMF0uU2lnbmVycy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgICAgICh4KSA9PiB4LkVtYWlsID09PSBjdXJyZW50VXNlcj8uZW1haWxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdJbmRleCA9IGluZGV4ICsgMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJtYWlsID0ge1xyXG4gICAgICAgICAgICAgICAgICBFbWFpbDogcGRmRGV0YWlscz8uWzBdPy5QbGFjZWhvbGRlcnNbbmV3SW5kZXhdPy5lbWFpbCB8fCBcIlwiXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IHVzZXJtYWlsPy5FbWFpbFxyXG4gICAgICAgICAgICAgICAgICA/IHVzZXJtYWlsXHJcbiAgICAgICAgICAgICAgICAgIDogcGRmRGV0YWlscz8uWzBdPy5TaWduZXJzW25ld0luZGV4XTtcclxuICAgICAgICAgICAgICAgIGlmIChzZW5kbWFpbCAhPT0gXCJmYWxzZVwiICYmIHNlbmRJbk9yZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcGRmRGV0YWlscz8uWzBdPy5SZXF1ZXN0Qm9keTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN1YmplY3QgPSBwZGZEZXRhaWxzPy5bMF0/LlJlcXVlc3RTdWJqZWN0O1xyXG4gICAgICAgICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGlyZURhdGUgPSBwZGZEZXRhaWxzPy5bMF0uRXhwaXJ5RGF0ZS5pc287XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGV4cGlyZURhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsRXhwaXJlRGF0ZSA9IG5ld0RhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJlbi1VU1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXk6IFwibnVtZXJpY1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb250aDogXCJsb25nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHllYXI6IFwibnVtZXJpY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VuZGVyRW1haWwgPSBwZGZEZXRhaWxzPy5bMF0uRXh0VXNlclB0ci5FbWFpbDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VuZGVyUGhvbmUgPSBwZGZEZXRhaWxzPy5bMF0/LkV4dFVzZXJQdHI/LlBob25lO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbmRlck5hbWUgPSBgJHtwZGZEZXRhaWxzPy5bMF0uRXh0VXNlclB0ci5OYW1lfWA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWdQbmcgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImh0dHBzOi8vcWlraW5ub3ZhdGlvbi5hbXMzLmRpZ2l0YWxvY2VhbnNwYWNlcy5jb20vbG9nby5wbmdcIjtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJiYXNlVXJsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICl9ZnVuY3Rpb25zL3NlbmRtYWlsdjNgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSB1c2VyPy5vYmplY3RJZDtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RVcmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy9lbmNvZGUgdGhpcyB1cmwgdmFsdWUgYCR7cGRmRGV0YWlscz8uWzBdLm9iamVjdElkfS8ke3VzZXIuRW1haWx9LyR7b2JqZWN0SWR9YCB0byBiYXNlNjQgdXNpbmcgYGJ0b2FgIGZ1bmN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RlQmFzZTY0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUJhc2U2NCA9IGJ0b2EoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGRmRGV0YWlscz8uWzBdLm9iamVjdElkfS8ke3VzZXIuRW1haWx9LyR7b2JqZWN0SWR9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlQmFzZTY0ID0gYnRvYShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwZGZEZXRhaWxzPy5bMF0ub2JqZWN0SWR9LyR7dXNlci5FbWFpbH1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0UHVibGljVXJsID0gaXNTdGFnaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJodHRwczovL3N0YWdpbmctYXBwLm9wZW5zaWdubGFicy5jb21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiaHR0cHM6Ly9hcHAub3BlbnNpZ25sYWJzLmNvbVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHNpZ25QZGYgPSBwcm9wcz8udGVtcGxhdGVJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAke2hvc3RQdWJsaWNVcmx9L2xvZ2luLyR7ZW5jb2RlQmFzZTY0fWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgJHtob3N0VXJsfS9sb2dpbi8ke2VuY29kZUJhc2U2NH1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlblNpZ25VcmwgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImh0dHBzOi8vd3d3Lm9wZW5zaWdubGFicy5jb20vY29udGFjdC11c1wiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JnTmFtZSA9IHBkZkRldGFpbHNbMF0/LkV4dFVzZXJQdHIuQ29tcGFueVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHBkZkRldGFpbHNbMF0uRXh0VXNlclB0ci5Db21wYW55XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoZW1lQkdjb2xvciA9IHRoZW1lQ29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZVZhcjtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0Qm9keSAmJiByZXF1ZXN0U3ViamVjdCAmJiBpc1N1YnNjcmliZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZWRSZXF1ZXN0Qm9keSA9IHJlcXVlc3RCb2R5LnJlcGxhY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgL1wiL2csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaHRtbFJlcUJvZHkgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0nQ29udGVudC1UeXBlJyBjb250ZW50PSd0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnIC8+PC9oZWFkPjxib2R5PlwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFJlcXVlc3RCb2R5ICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvYm9keT4gPC9odG1sPlwiO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFibGVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50X3RpdGxlOiBwZGZEZXRhaWxzPy5bMF0uTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXJfbmFtZTogc2VuZGVyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXJfbWFpbDogc2VuZGVyRW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyX3Bob25lOiBzZW5kZXJQaG9uZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcl9uYW1lOiB1c2VyLk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJfZW1haWw6IHVzZXIuRW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJfcGhvbmU6IHVzZXIuUGhvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJ5X2RhdGU6IGxvY2FsRXhwaXJlRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYW55X25hbWU6IG9yZ05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmluZ191cmw6IGA8YSBocmVmPSR7c2lnblBkZn0+U2lnbiBoZXJlPC9hPmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVZhciA9IHJlcGxhY2VNYWlsVmFyaWJsZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN1YmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbFJlcUJvZHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbFByb3ZpZGVyOiBhY3RpdmVNYWlsQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0VXNlcklkOiBleHRVc2VySWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudDogdXNlci5FbWFpbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdDogcmVxdWVzdFN1YmplY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlcGxhY2VWYXI/LnN1YmplY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGAke3BkZkRldGFpbHM/LlswXS5FeHRVc2VyUHRyLk5hbWV9IGhhcyByZXF1ZXN0ZWQgeW91IHRvIHNpZ24gXCIke3BkZkRldGFpbHM/LlswXS5OYW1lfVwiYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTogc2VuZGVyRW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWw6IHJlcXVlc3RCb2R5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZXBsYWNlVmFyPy5ib2R5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9J0NvbnRlbnQtVHlwZScgY29udGVudD0ndGV4dC9odG1sOyBjaGFyc2V0PVVURi04JyAvPiA8L2hlYWQ+ICAgPGJvZHk+IDxkaXYgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7IHBhZGRpbmc6IDIwcHgnPT4gPGRpdiAgIHN0eWxlPScgYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjEpIDBweCA0cHggMTJweDtiYWNrZ3JvdW5kOiB3aGl0ZTtwYWRkaW5nLWJvdHRvbTogMjBweDsnPiA8ZGl2IHN0eWxlPSdwYWRkaW5nOjEwcHggMTBweCAwIDEwcHgnPjxpbWcgc3JjPVwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1BuZyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBoZWlnaHQ9JzUwJyBzdHlsZT0ncGFkZGluZzogMjBweCx3aWR0aDoxNzBweCxoZWlnaHQ6NDBweCcgLz48L2Rpdj4gIDxkaXYgIHN0eWxlPScgcGFkZGluZzogMnB4O2ZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7YmFja2dyb3VuZC1jb2xvcjpcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZUJHY29sb3IgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI7Jz48cCBzdHlsZT0nZm9udC1zaXplOiAyMHB4O2ZvbnQtd2VpZ2h0OiA0MDA7Y29sb3I6IHdoaXRlO3BhZGRpbmctbGVmdDogMjBweDsnID4gRGlnaXRhbCBTaWduYXR1cmUgUmVxdWVzdDwvcD48L2Rpdj48ZGl2PjxwIHN0eWxlPSdwYWRkaW5nOiAyMHB4O2ZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7Zm9udC1zaXplOiAxNHB4OyAgIG1hcmdpbi1ib3R0b206IDEwcHg7Jz4gXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz8uWzBdLkV4dFVzZXJQdHIuTmFtZSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBoYXMgcmVxdWVzdGVkIHlvdSB0byByZXZpZXcgYW5kIHNpZ24gPHN0cm9uZz4gXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz8uWzBdLk5hbWUgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L3N0cm9uZz4uPC9wPjxkaXYgc3R5bGU9J3BhZGRpbmc6IDVweCAwcHggNXB4IDI1cHg7ZGlzcGxheTogZmxleDtmbGV4LWRpcmVjdGlvbjogcm93O2p1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOyc+PHRhYmxlPiA8dHI+IDx0ZCBzdHlsZT0nZm9udC13ZWlnaHQ6Ym9sZDtmb250LWZhbWlseTpzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4Jz5TZW5kZXI8L3RkPiA8dGQ+IDwvdGQ+IDx0ZCAgc3R5bGU9J2NvbG9yOiM2MjYzNjM7Zm9udC13ZWlnaHQ6Ym9sZCc+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyRW1haWwgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0nZm9udC13ZWlnaHQ6Ym9sZDtmb250LWZhbWlseTpzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4Jz5Pcmdhbml6YXRpb248L3RkPiA8dGQ+IDwvdGQ+PHRkIHN0eWxlPSdjb2xvcjojNjI2MzYzO2ZvbnQtd2VpZ2h0OmJvbGQnPiBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmdOYW1lICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPC90ZD48L3RyPiA8dHI+IDx0ZCBzdHlsZT0nZm9udC13ZWlnaHQ6Ym9sZDtmb250LWZhbWlseTpzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4Jz5FeHBpcmVzIG9uPC90ZD48dGQ+IDwvdGQ+IDx0ZCBzdHlsZT0nY29sb3I6IzYyNjM2Mztmb250LXdlaWdodDpib2xkJz5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEV4cGlyZURhdGUgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L3RkPjwvdHI+PHRyPiA8dGQ+PC90ZD4gPHRkPiA8L3RkPjwvdHI+PC90YWJsZT4gPC9kaXY+IDxkaXYgc3R5bGU9J21hcmdpbi1sZWZ0OjcwcHgnPjxhIGhyZWY9XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnblBkZiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj4gPGJ1dHRvbiBzdHlsZT0ncGFkZGluZzogMTJweCAxMnB4IDEycHggMTJweDtiYWNrZ3JvdW5kLWNvbG9yOiAjZDQ2YjBmO2NvbG9yOiB3aGl0ZTsgIGJvcmRlcjogMHB4O2JveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4wNSkgMHB4IDZweCAyNHB4IDBweCxyZ2JhKDAsIDAsIDAsIDAuMDgpIDBweCAwcHggMHB4IDFweDtmb250LXdlaWdodDpib2xkO21hcmdpbi10b3A6MzBweCc+U2lnbiBoZXJlPC9idXR0b24+PC9hPiA8L2Rpdj4gPGRpdiBzdHlsZT0nZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7bWFyZ2luLXRvcDogMTBweDsnPiA8L2Rpdj48L2Rpdj48L2Rpdj48ZGl2PjxwPiBUaGlzIGlzIGFuIGF1dG9tYXRlZCBlbWFpbCBmcm9tIE9wZW5TaWdu4oSiLiBGb3IgYW55IHF1ZXJpZXMgcmVnYXJkaW5nIHRoaXMgZW1haWwsIHBsZWFzZSBjb250YWN0IHRoZSBzZW5kZXIgXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyRW1haWwgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgZGlyZWN0bHkuSWYgeW91IHRoaW5rIHRoaXMgZW1haWwgaXMgaW5hcHByb3ByaWF0ZSBvciBzcGFtLCB5b3UgbWF5IGZpbGUgYSBjb21wbGFpbnQgd2l0aCBPcGVuU2lnbuKEoiAgIDxhIGhyZWY9IFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5TaWduVXJsICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHRhcmdldD1fYmxhbms+aGVyZTwvYT4uPC9wPiA8L2Rpdj48L2Rpdj48L2JvZHk+IDwvaHRtbD5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF4aW9zLnBvc3QodXJsLCBwYXJhbXMsIHsgaGVhZGVyczogaGVhZGVycyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJlcnJvclwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldElzVWlMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHNldElzQWxlcnQoeyBpc1Nob3c6IHRydWUsIGFsZXJ0TWVzc2FnZTogcmVzU2lnbi5tZXNzYWdlIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgc2V0SXNVaUxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoXCJpcyBlbmNyeXB0ZWQuXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRJc0FsZXJ0KHtcclxuICAgICAgICAgICAgICAgICAgaXNTaG93OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICBhbGVydE1lc3NhZ2U6IHQoXCJlbmNyeXB0ZWQtcGRmLW5vdC1zdXBwb3J0XCIpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gcmVxdWVzdCBzaWduaW5nXCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICBzZXRJc0FsZXJ0KHtcclxuICAgICAgICAgICAgICAgICAgaXNTaG93OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICBhbGVydE1lc3NhZ2U6IHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNldElzU2lnblBhZChmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNldElzQWxlcnQoe1xyXG4gICAgICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgICAgIGFsZXJ0TWVzc2FnZTogdChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIilcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gZW1iZWRzaWduXCIsIGVycik7XHJcbiAgICAgICAgc2V0SXNVaUxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgIHNldElzQWxlcnQoe1xyXG4gICAgICAgICAgaXNTaG93OiB0cnVlLFxyXG4gICAgICAgICAgYWxlcnRNZXNzYWdlOiB0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL2Vsc2UgdmVyaWZ5IHVzZXJzIGVtYWlsXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgdXNlclF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFBhcnNlLlVzZXIpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VyUXVlcnkuZ2V0KGN1cnJlbnRVc2VyPy5vYmplY3RJZCwge1xyXG4gICAgICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgIGlzRW1haWxWZXJpZmllZCA9IHVzZXI/LmdldChcImVtYWlsVmVyaWZpZWRcIik7XHJcbiAgICAgICAgICBzZXRJc0VtYWlsVmVyaWZpZWQoaXNFbWFpbFZlcmlmaWVkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIHNhdmUgdXNlcidzIGVtYWlsVmVyaWZpZWQgaW4gdXNlciBjbGFzc1wiKTtcclxuICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vZnVuY3Rpb24gZm9yIHVwZGF0ZSBUb3VyU3RhdHVzXHJcbiAgY29uc3QgY2xvc2VUb3VyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgc2V0V2lkZ2V0c1RvdXIoZmFsc2UpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IHRvdXJDb25maWcgPSBbXHJcbiAgICB7XHJcbiAgICAgIHNlbGVjdG9yOiAnW2RhdGEtdHV0PVwiSXNTaWduZWRcIl0nLFxyXG4gICAgICBjb250ZW50OiBtaW5SZXF1aXJlZENvdW50XHJcbiAgICAgICAgPyB0KFwic2lnbmF0dXJlLXZhbGlkYXRlLWFsZXJ0XCIsIHsgbWluUmVxdWlyZWRDb3VudCB9KVxyXG4gICAgICAgIDogdChcInNpZ25hdHVyZS12YWxpZGF0ZS1hbGVydC0yXCIpLFxyXG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIixcclxuICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cclxuICAgIH1cclxuICBdO1xyXG4gIC8vZnVuY3Rpb24gZm9yIGdldCBwZGYgcGFnZSBkZXRhaWxzXHJcbiAgY29uc3QgcGFnZURldGFpbHMgPSBhc3luYyAocGRmKSA9PiB7XHJcbiAgICBsZXQgcGRmV0hPYmogPSBbXTtcclxuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBwZGYubnVtUGFnZXM7IC8vIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG90YWxQYWdlczsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBnZXRQYWdlID0gYXdhaXQgcGRmLmdldFBhZ2UoaW5kZXggKyAxKTtcclxuICAgICAgY29uc3Qgc2NhbGUgPSAxO1xyXG4gICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldFBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZSB9KTtcclxuICAgICAgcGRmV0hPYmoucHVzaCh7IHBhZ2VOdW1iZXI6IGluZGV4ICsgMSwgd2lkdGgsIGhlaWdodCB9KTtcclxuICAgIH1cclxuICAgIHNldFBkZk9yaWdpbmFsV0gocGRmV0hPYmopO1xyXG4gICAgc2V0UGRmTG9hZCh0cnVlKTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIGNoYW5nZSBwYWdlXHJcbiAgZnVuY3Rpb24gY2hhbmdlUGFnZShvZmZzZXQpIHtcclxuICAgIHNldFBhZ2VOdW1iZXIoKHByZXZQYWdlTnVtYmVyKSA9PiBwcmV2UGFnZU51bWJlciArIG9mZnNldCk7XHJcbiAgfVxyXG5cclxuICAvL2Z1bmN0aW9uIGZvciBpbWFnZSB1cGxvYWQgb3IgdXBkYXRlXHJcbiAgY29uc3Qgb25JbWFnZUNoYW5nZSA9IChldmVudCkgPT4ge1xyXG4gICAgaWYgKGV2ZW50LnRhcmdldC5maWxlcyAmJiBldmVudC50YXJnZXQuZmlsZXNbMF0pIHtcclxuICAgICAgb25JbWFnZVNlbGVjdChldmVudCwgc2V0SW1nV0gsIHNldEltYWdlKTtcclxuICAgIH1cclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIHVwbG9hZCBzdGFtcCBpbWFnZVxyXG4gIGNvbnN0IHNhdmVJbWFnZSA9ICgpID0+IHtcclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXHJcbiAgICBjb25zdCBjdXJyZW50U2lnbmVyID0gc2lnbmVyUG9zLmZpbHRlcihcclxuICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkXHJcbiAgICApO1xyXG4gICAgLy9nZXQgY3VycmVudCBwYWdlbnVtYmVyIHBsYWNlaG9sZGVyIGluZGV4XHJcbiAgICBjb25zdCBnZXRJbmRleCA9IGN1cnJlbnRTaWduZXJbMF0ucGxhY2VIb2xkZXIuZmluZEluZGV4KChvYmplY3QpID0+IHtcclxuICAgICAgcmV0dXJuIG9iamVjdC5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyO1xyXG4gICAgfSk7XHJcbiAgICAvL2dldCBjdXJyZW50IHNpZ25lciBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXHJcbiAgICBjb25zdCBwbGFjZWhvbGRlclBvc2l0aW9uID0gY3VycmVudFNpZ25lclswXS5wbGFjZUhvbGRlcjtcclxuICAgIC8vZnVuY3Rpb24gb2Ygc2F2ZSBpbWFnZSBhbmQgZ2V0IHVwZGF0ZWQgcG9zaXRpb24gd2l0aCBpbWFnZSB1cmxcclxuICAgIGNvbnN0IGdldFVwZGF0ZVBvc2l0aW9uID0gb25TYXZlSW1hZ2UoXHJcbiAgICAgIHBsYWNlaG9sZGVyUG9zaXRpb24sXHJcbiAgICAgIGdldEluZGV4LFxyXG4gICAgICBzaWduS2V5LFxyXG4gICAgICBpbWdXSCxcclxuICAgICAgaW1hZ2VcclxuICAgICk7XHJcblxyXG4gICAgLy9yZXBsYWNlIHVwZGF0ZWQgcGxhY2Vob2xkZXIgcG9zaXRpb24gd2l0aCBvbGQgZGF0YVxyXG4gICAgcGxhY2Vob2xkZXJQb3NpdGlvbi5zcGxpY2UoXHJcbiAgICAgIDAsXHJcbiAgICAgIHBsYWNlaG9sZGVyUG9zaXRpb24ubGVuZ3RoLFxyXG4gICAgICAuLi5nZXRVcGRhdGVQb3NpdGlvblxyXG4gICAgKTtcclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhIGluZGV4IG51bWJlciBpbiBhcnJheVxyXG4gICAgY29uc3QgaW5kZXhvZlNpZ25lciA9IHNpZ25lclBvcy5maW5kSW5kZXgoKG9iamVjdCkgPT4ge1xyXG4gICAgICByZXR1cm4gb2JqZWN0LnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZDtcclxuICAgIH0pO1xyXG4gICAgLy91cGRhdGUgY3VycmVudCBzaWduZXJzIGRhdGEgd2l0aCBuZXcgcGxhY2Vob2xkZXIgcG9zaXRpb24gYXJyYXkgZGF0YVxyXG4gICAgc2V0U2lnbmVyUG9zKChwcmV2U3RhdGUpID0+IHtcclxuICAgICAgY29uc3QgbmV3U3RhdGUgPSBbLi4ucHJldlN0YXRlXTsgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgc3RhdGVcclxuICAgICAgbmV3U3RhdGUuc3BsaWNlKGluZGV4b2ZTaWduZXIsIDEsIC4uLmN1cnJlbnRTaWduZXIpOyAvLyBNb2RpZnkgdGhlIGNvcHlcclxuICAgICAgcmV0dXJuIG5ld1N0YXRlOyAvLyBVcGRhdGUgdGhlIHN0YXRlIHdpdGggdGhlIG1vZGlmaWVkIGNvcHlcclxuICAgIH0pO1xyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiBmb3Igc2F2ZSBidXR0b24gdG8gc2F2ZSBzaWduYXR1cmUgb3IgaW1hZ2UgdXJsXHJcbiAgY29uc3Qgc2F2ZVNpZ24gPSAodHlwZSwgaXNEZWZhdWx0U2lnbiwgd2lkdGgsIGhlaWdodCkgPT4ge1xyXG4gICAgY29uc3QgaXNUeXBlVGV4dCA9IHdpZHRoICYmIGhlaWdodCA/IHRydWUgOiBmYWxzZTtcclxuICAgIGNvbnN0IHNpZ25hdHVyZUltZyA9IGlzRGVmYXVsdFNpZ25cclxuICAgICAgPyBpc0RlZmF1bHRTaWduID09PSBcImluaXRpYWxzXCJcclxuICAgICAgICA/IG15SW5pdGlhbFxyXG4gICAgICAgIDogZGVmYXVsdFNpZ25JbWdcclxuICAgICAgOiBzaWduYXR1cmU7XHJcbiAgICBsZXQgaW1nV0ggPSB7IHdpZHRoOiB3aWR0aCA/IHdpZHRoIDogXCJcIiwgaGVpZ2h0OiBoZWlnaHQgPyBoZWlnaHQgOiBcIlwiIH07XHJcbiAgICBzZXRJc1NpZ25QYWQoZmFsc2UpO1xyXG4gICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XHJcbiAgICBzZXRJbWFnZSgpO1xyXG5cclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXHJcbiAgICBjb25zdCBjdXJyZW50U2lnbmVyID0gc2lnbmVyUG9zLmZpbHRlcihcclxuICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkXHJcbiAgICApO1xyXG4gICAgLy9nZXQgY3VycmVudCBwYWdlbnVtYmVyIHBsYWNlaG9sZGVyIGluZGV4XHJcbiAgICBjb25zdCBnZXRJbmRleCA9IGN1cnJlbnRTaWduZXJbMF0ucGxhY2VIb2xkZXIuZmluZEluZGV4KChvYmplY3QpID0+IHtcclxuICAgICAgcmV0dXJuIG9iamVjdC5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9zZXQgZGVmYXVsdCBzaWduYXR1cmUgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodFxyXG4gICAgaWYgKGlzRGVmYXVsdFNpZ24pIHtcclxuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltZy5zcmMgPSBkZWZhdWx0U2lnbkltZztcclxuICAgICAgaWYgKGltZy5jb21wbGV0ZSkge1xyXG4gICAgICAgIGltZ1dIID0geyB3aWR0aDogaW1nLndpZHRoLCBoZWlnaHQ6IGltZy5oZWlnaHQgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9nZXQgY3VycmVudCBzaWduZXIgcGxhY2Vob2xkZXIgcG9zaXRpb24gZGF0YVxyXG4gICAgY29uc3QgcGxhY2Vob2xkZXJQb3NpdGlvbiA9IGN1cnJlbnRTaWduZXJbMF0ucGxhY2VIb2xkZXI7XHJcbiAgICAvL2Z1bmN0aW9uIG9mIHNhdmUgc2lnbmF0dXJlIGltYWdlIGFuZCBnZXQgdXBkYXRlZCBwb3NpdGlvbiB3aXRoIHNpZ25hdHVyZSBpbWFnZSB1cmxcclxuICAgIGNvbnN0IGdldFVwZGF0ZVBvc2l0aW9uID0gb25TYXZlU2lnbihcclxuICAgICAgdHlwZSxcclxuICAgICAgcGxhY2Vob2xkZXJQb3NpdGlvbixcclxuICAgICAgZ2V0SW5kZXgsXHJcbiAgICAgIHNpZ25LZXksXHJcbiAgICAgIHNpZ25hdHVyZUltZyxcclxuICAgICAgaW1nV0gsXHJcbiAgICAgIGlzRGVmYXVsdFNpZ24sXHJcbiAgICAgIGlzVHlwZVRleHRcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlU2lnbmVyRGF0YSA9IGN1cnJlbnRTaWduZXIubWFwKChvYmopID0+IHtcclxuICAgICAgaWYgKG9iai5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWQpIHtcclxuICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBnZXRVcGRhdGVQb3NpdGlvbiB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBpbmRleCA9IHNpZ25lclBvcy5maW5kSW5kZXgoXHJcbiAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZFxyXG4gICAgKTtcclxuICAgIHNldFNpZ25lclBvcygocHJldlN0YXRlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld1N0YXRlID0gWy4uLnByZXZTdGF0ZV07XHJcbiAgICAgIG5ld1N0YXRlLnNwbGljZShpbmRleCwgMSwgLi4udXBkYXRlU2lnbmVyRGF0YSk7XHJcbiAgICAgIHJldHVybiBuZXdTdGF0ZTtcclxuICAgIH0pO1xyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiBmb3Igc2V0IGRlY2xpbmUgdHJ1ZSBvbiBwcmVzcyBkZWNsaW5lIGJ1dHRvblxyXG4gIGNvbnN0IGRlY2xpbmVEb2MgPSBhc3luYyAocmVhc29uKSA9PiB7XHJcbiAgICBjb25zdCBzZW5kZXJVc2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgIGBQYXJzZS8ke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKX0vY3VycmVudFVzZXJgXHJcbiAgICApO1xyXG4gICAgY29uc3QganNvblNlbmRlciA9IEpTT04ucGFyc2Uoc2VuZGVyVXNlcik7XHJcbiAgICBzZXRJc0RlY2xpbmUoeyBpc0RlY2xpbmVkOiBmYWxzZSB9KTtcclxuICAgIGNvbnN0IGRhdGEgPSB7IElzRGVjbGluZWQ6IHRydWUsIERlY2xpbmVSZWFzb246IHJlYXNvbiB9O1xyXG4gICAgc2V0SXNVaUxvYWRpbmcodHJ1ZSk7XHJcblxyXG4gICAgYXdhaXQgYXhpb3NcclxuICAgICAgLnB1dChcclxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgIFwiYmFzZVVybFwiXHJcbiAgICAgICAgKX1jbGFzc2VzL2NvbnRyYWN0c19Eb2N1bWVudC8ke2RvY3VtZW50SWR9YCxcclxuICAgICAgICBkYXRhLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXHJcbiAgICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IHJlc3VsdC5kYXRhO1xyXG4gICAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAgIGNvbnN0IGN1cnJlbnREZWNsaW5lID0geyBjdXJybnQ6IFwiWW91RGVjbGluZWRcIiwgaXNEZWNsaW5lZDogdHJ1ZSB9O1xyXG4gICAgICAgICAgc2V0SXNEZWNsaW5lKGN1cnJlbnREZWNsaW5lKTtcclxuICAgICAgICAgIHNldElzVWlMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgZXZlbnQ6IFwiZGVjbGluZWRcIixcclxuICAgICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICAgIG9iamVjdElkOiBwZGZEZXRhaWxzPy5bMF0ub2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgZmlsZTogcGRmRGV0YWlscz8uWzBdPy5TaWduZWRVcmwgfHwgcGRmRGV0YWlscz8uWzBdPy5VUkwsXHJcbiAgICAgICAgICAgICAgbmFtZTogcGRmRGV0YWlscz8uWzBdLk5hbWUsXHJcbiAgICAgICAgICAgICAgbm90ZTogcGRmRGV0YWlscz8uWzBdLk5vdGUgfHwgXCJcIixcclxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcGRmRGV0YWlscz8uWzBdLkRlc2NyaXB0aW9uIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgc2lnbmVyczogcGRmRGV0YWlscz8uWzBdLlNpZ25lcnM/Lm1hcCgoeCkgPT4gKHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IHg/Lk5hbWUsXHJcbiAgICAgICAgICAgICAgICBlbWFpbDogeD8uRW1haWwsXHJcbiAgICAgICAgICAgICAgICBwaG9uZTogeD8uUGhvbmVcclxuICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgICAgZGVjbGluZWRCeToganNvblNlbmRlci5lbWFpbCxcclxuICAgICAgICAgICAgICBkZWNsaW5lZEF0OiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogcGRmRGV0YWlscz8uWzBdLmNyZWF0ZWRBdFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGF4aW9zLnBvc3QoXHJcbiAgICAgICAgICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfWZ1bmN0aW9ucy9jYWxsd2ViaG9va2AsXHJcbiAgICAgICAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXHJcbiAgICAgICAgICAgICAgICAgIHNlc3Npb250b2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVyciBcIiwgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvciB1cGRhdGluZyBmaWVsZCBpcyBkZWNsaW5lIFwiLCBlcnIpO1xyXG4gICAgICB9KTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gdG8gYWRkIGRlZmF1bHQgc2lnbmF0dXJlIGZvciBhbGwgcmVxdWVzdGVkIHBsYWNlaG9sZGVyIG9mIHNpZ25cclxuICBjb25zdCBhZGREZWZhdWx0U2lnbmF0dXJlID0gKCkgPT4ge1xyXG4gICAgLy9nZXQgY3VycmVudCBzaWduZXJzIHBsYWNlaG9sZGVyIHBvc2l0aW9uIGRhdGFcclxuICAgIGNvbnN0IGN1cnJlbnRTaWduZXJQb3NpdGlvbiA9IHNpZ25lclBvcy5maWx0ZXIoXHJcbiAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZFxyXG4gICAgKTtcclxuICAgIC8vZnVuY3Rpb24gZm9yIHNhdmUgZGVmYXVsdCBzaWduYXR1cmUgdXJsIGZvciBhbGwgcGxhY2Vob2xkZXIgcG9zaXRpb25cclxuICAgIGNvbnN0IHVwZGF0ZVBsYWNlID0gYWRkRGVmYXVsdFNpZ25hdHVyZUltZyhcclxuICAgICAgY3VycmVudFNpZ25lclBvc2l0aW9uWzBdLnBsYWNlSG9sZGVyLFxyXG4gICAgICBkZWZhdWx0U2lnbkltZ1xyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVzaWduZXJQb3MgPSBzaWduZXJQb3MubWFwKCh4KSA9PlxyXG4gICAgICB4LnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZCA/IHsgLi4ueCwgcGxhY2VIb2xkZXI6IHVwZGF0ZVBsYWNlIH0gOiB4XHJcbiAgICApO1xyXG4gICAgc2V0U2lnbmVyUG9zKHVwZGF0ZXNpZ25lclBvcyk7XHJcbiAgICBzZXREZWZhdWx0U2lnbkFsZXJ0KHsgaXNTaG93OiBmYWxzZSwgYWxlcnRNZXNzYWdlOiBcIlwiIH0pO1xyXG4gIH07XHJcbiAgY29uc3QgaGFuZGxlRG9udFNob3cgPSAoaXNDaGVja2VkKSA9PiB7XHJcbiAgICBzZXRJc0RvbnRTaG93KGlzQ2hlY2tlZCk7XHJcbiAgfTtcclxuICAvL2Z1bmN0aW9uIHRvIGNsb3NlIHRvdXIgYW5kIHNhdmUgdG91ciBzdGF0dXNcclxuICBjb25zdCBjbG9zZVJlcXVlc3RTaWduVG91ciA9IGFzeW5jICgpID0+IHtcclxuICAgIHNldFJlcXVlc3RTaWduVG91cih0cnVlKTtcclxuICAgIGlmIChpc0RvbnRTaG93KSB7XHJcbiAgICAgIGxldCB1cGRhdGVkVG91clN0YXR1cyA9IFtdO1xyXG4gICAgICBpZiAodG91clN0YXR1cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdXBkYXRlZFRvdXJTdGF0dXMgPSBbLi4udG91clN0YXR1c107XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdFNpZ25JbmRleCA9IHRvdXJTdGF0dXMuZmluZEluZGV4KFxyXG4gICAgICAgICAgKG9iaikgPT4gb2JqW1wicmVxdWVzdFNpZ25cIl0gPT09IGZhbHNlIHx8IG9ialtcInJlcXVlc3RTaWduXCJdID09PSB0cnVlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAocmVxdWVzdFNpZ25JbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgIHVwZGF0ZWRUb3VyU3RhdHVzW3JlcXVlc3RTaWduSW5kZXhdID0geyByZXF1ZXN0U2lnbjogdHJ1ZSB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB1cGRhdGVkVG91clN0YXR1cy5wdXNoKHsgcmVxdWVzdFNpZ246IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHVwZGF0ZWRUb3VyU3RhdHVzID0gW3sgcmVxdWVzdFNpZ246IHRydWUgfV07XHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCBheGlvcy5wdXQoXHJcbiAgICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgICAgXCJiYXNlVXJsXCJcclxuICAgICAgICAgICl9Y2xhc3Nlcy9jb250cmFjdHMke2NvbnRyYWN0TmFtZX0vJHtzaWduZXJVc2VySWR9YCxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgVG91clN0YXR1czogdXBkYXRlZFRvdXJTdGF0dXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInVwZGF0ZSB0b3VyIG1lc3NhZ2VzIGVycm9yXCIsIGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCByZXF1ZXN0U2lnblRvdXJGdW5jdGlvbiA9ICgpID0+IHtcclxuICAgIGNvbnN0IHRvdXJDb25maWcgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICBzZWxlY3RvcjogJ1tkYXRhLXR1dD1cInJlYWN0b3VyRmlyc3RcIl0nLFxyXG4gICAgICAgIGNvbnRlbnQ6ICgpID0+IChcclxuICAgICAgICAgIDxUb3VyQ29udGVudFdpdGhCdG5cclxuICAgICAgICAgICAgbWVzc2FnZT17dChcInRvdXItbXNzZy5wZGYtcmVxdWVzdC1maWxlLTFcIil9XHJcbiAgICAgICAgICAgIGlzQ2hlY2tlZD17aGFuZGxlRG9udFNob3d9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICksXHJcbiAgICAgICAgcG9zaXRpb246IFwidG9wXCIsXHJcbiAgICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHNlbGVjdG9yOiAnW2RhdGEtdHV0PVwicGRmQXJlYVwiXScsXHJcbiAgICAgICAgY29udGVudDogKCkgPT4gKFxyXG4gICAgICAgICAgPFRvdXJDb250ZW50V2l0aEJ0blxyXG4gICAgICAgICAgICBtZXNzYWdlPXt0KFwidG91ci1tc3NnLnBkZi1yZXF1ZXN0LWZpbGUtMlwiKX1cclxuICAgICAgICAgICAgaXNDaGVja2VkPXtoYW5kbGVEb250U2hvd31cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKSxcclxuICAgICAgICBwb3NpdGlvbjogXCJ0b3BcIixcclxuICAgICAgICBzdHlsZTogeyBmb250U2l6ZTogXCIxM3B4XCIgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgc2VsZWN0b3I6ICdbZGF0YS10dXQ9XCJyZWFjdG91ckZpZnRoXCJdJyxcclxuICAgICAgICBjb250ZW50OiAoKSA9PiAoXHJcbiAgICAgICAgICA8VG91ckNvbnRlbnRXaXRoQnRuXHJcbiAgICAgICAgICAgIG1lc3NhZ2U9e3QoXCJ0b3VyLW1zc2cucGRmLXJlcXVlc3QtZmlsZS0zXCIpfVxyXG4gICAgICAgICAgICBpc0NoZWNrZWQ9e2hhbmRsZURvbnRTaG93fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApLFxyXG4gICAgICAgIHBvc2l0aW9uOiBcInRvcFwiLFxyXG4gICAgICAgIHN0eWxlOiB7IGZvbnRTaXplOiBcIjEzcHhcIiB9XHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgICBjb25zdCBzaWduZWRCeVN0ZXAgPSB7XHJcbiAgICAgIHNlbGVjdG9yOiAnW2RhdGEtdHV0PVwicmVhY3RvdXJTZWNvbmRcIl0nLFxyXG4gICAgICBjb250ZW50OiAoKSA9PiAoXHJcbiAgICAgICAgPFRvdXJDb250ZW50V2l0aEJ0blxyXG4gICAgICAgICAgbWVzc2FnZT17dChcInRvdXItbXNzZy5wZGYtcmVxdWVzdC1maWxlLTRcIil9XHJcbiAgICAgICAgICBpc0NoZWNrZWQ9e2hhbmRsZURvbnRTaG93fVxyXG4gICAgICAgIC8+XHJcbiAgICAgICksXHJcbiAgICAgIHBvc2l0aW9uOiBcInRvcFwiLFxyXG4gICAgICBzdHlsZTogeyBmb250U2l6ZTogXCIxM3B4XCIgfVxyXG4gICAgfTtcclxuICAgIC8vY2hlY2tpbmcgaWYgc2lnbmVkIGJ5IHVzZXIgY29tcG9uZW50IGV4aXN0IHRoZW4gYWRkIHNpZ25lZCBzdGVwXHJcbiAgICBjb25zdCBzaWduZWRCeSA9XHJcbiAgICAgIHNpZ25lZFNpZ25lcnMubGVuZ3RoID4gMFxyXG4gICAgICAgID8gWy4uLnRvdXJDb25maWcuc2xpY2UoMCwgMCksIHNpZ25lZEJ5U3RlcCwgLi4udG91ckNvbmZpZy5zbGljZSgwKV1cclxuICAgICAgICA6IHRvdXJDb25maWc7XHJcblxyXG4gICAgLy9jaGVja2luZyBpZiBkZWZhdWx0IHNpZ25hdHVyZSBjb21wb25lbnQgZXhpc3QgdGhlbiBhZGQgZGVmYXVsdFNpZ24gc3RlcFxyXG4gICAgY29uc3QgZGVmYXVsdFNpZ25TdGVwID0ge1xyXG4gICAgICBzZWxlY3RvcjogJ1tkYXRhLXR1dD1cInJlYWN0b3VyVGhpcmRcIl0nLFxyXG4gICAgICBjb250ZW50OiAoKSA9PiAoXHJcbiAgICAgICAgPFRvdXJDb250ZW50V2l0aEJ0blxyXG4gICAgICAgICAgbWVzc2FnZT17dChcInRvdXItbXNzZy5wZGYtcmVxdWVzdC1maWxlLTVcIil9XHJcbiAgICAgICAgICBpc0NoZWNrZWQ9e2hhbmRsZURvbnRTaG93fVxyXG4gICAgICAgIC8+XHJcbiAgICAgICksXHJcbiAgICAgIHBvc2l0aW9uOiBcInRvcFwiLFxyXG4gICAgICBzdHlsZTogeyBmb250U2l6ZTogXCIxM3B4XCIgfVxyXG4gICAgfTtcclxuICAgIC8vaW5kZXggaXMgaGFuZGxlIGlzIHNpZ25lZCBieSBleGlzdCB0aGVuIDIgZWxzZSAxIHRvIGFkZCB0b3VyIHN0ZXBcclxuICAgIGNvbnN0IGluZGV4ID0gc2lnbmVkU2lnbmVycy5sZW5ndGggPiAwID8gMiA6IDE7XHJcbiAgICBjb25zdCBkZWZhdWx0U2lnblRvdXIgPSBkZWZhdWx0U2lnbkltZ1xyXG4gICAgICA/IFsuLi5zaWduZWRCeS5zbGljZSgwLCBpbmRleCksIGRlZmF1bHRTaWduU3RlcCwgLi4uc2lnbmVkQnkuc2xpY2UoaW5kZXgpXVxyXG4gICAgICA6IHNpZ25lZEJ5O1xyXG5cclxuICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICB0b3VyQ29uZmlnLnNoaWZ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgPFRvdXJcclxuICAgICAgICBvblJlcXVlc3RDbG9zZT17Y2xvc2VSZXF1ZXN0U2lnblRvdXJ9XHJcbiAgICAgICAgc3RlcHM9e2lzTW9iaWxlID8gdG91ckNvbmZpZyA6IGRlZmF1bHRTaWduVG91cn1cclxuICAgICAgICBpc09wZW49e3RydWV9XHJcbiAgICAgICAgY2xvc2VXaXRoTWFzaz17ZmFsc2V9XHJcbiAgICAgICAgcm91bmRlZD17NX1cclxuICAgICAgLz5cclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlVXNlckRldGFpbHMgPSAoKSA9PiB7XHJcbiAgICBzZXRJc1B1YmxpY0NvbnRhY3QodHJ1ZSk7XHJcbiAgfTtcclxuXHJcbiAgLy9gaGFuZGxlUHVibGljVXNlcmAgZnVuY3Rpb24gdG8gdXNlIGNyZWF0ZSB1c2VyIGZyb20gcHVibGljIHJvbGUgYW5kIGNyZWF0ZSBkb2N1bWVudCBmcm9tIHB1YmxpYyB0ZW1wbGF0ZVxyXG4gIGNvbnN0IGhhbmRsZVB1YmxpY1VzZXIgPSBhc3luYyAoZSkgPT4ge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAuLi5jb250YWN0LFxyXG4gICAgICAgIHRlbXBsYXRlaWQ6IHBkZkRldGFpbHNbMF0/Lm9iamVjdElkLFxyXG4gICAgICAgIHJvbGU6IHBkZkRldGFpbHNbMF0/LlB1YmxpY1JvbGVbMF1cclxuICAgICAgfTtcclxuICAgICAgY29uc3QgdXNlclJlcyA9IGF3YWl0IGF4aW9zLnBvc3QoXHJcbiAgICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgICAgICBcImJhc2VVcmxcIlxyXG4gICAgICAgICl9L2Z1bmN0aW9ucy9wdWJsaWN1c2VybGlua2NvbnRhY3R0b2RvY2AsXHJcbiAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAodXNlclJlcz8uZGF0YT8ucmVzdWx0KSB7XHJcbiAgICAgICAgc2V0UmVzKHVzZXJSZXMuZGF0YS5yZXN1bHQpO1xyXG4gICAgICAgIGF3YWl0IFNlbmRPdHAoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIHB1YmxpYy1zaWduIHRvIGNyZWF0ZSB1c2VyIGRldGFpbHNcIik7XHJcbiAgICAgICAgYWxlcnQodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZVwiLCBlKTtcclxuICAgICAgLy8gICBzZXRJc0xvYWRlcihmYWxzZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSAoZSkgPT4ge1xyXG4gICAgbGV0IHsgbmFtZSwgdmFsdWUgfSA9IGUudGFyZ2V0O1xyXG4gICAgaWYgKG5hbWUgPT09IFwiZW1haWxcIikge1xyXG4gICAgICB2YWx1ZSA9IHZhbHVlPy50b0xvd2VyQ2FzZSgpPy5yZXBsYWNlKC9cXHMvZywgXCJcIik7XHJcbiAgICB9XHJcbiAgICBzZXRDb250YWN0KHsgLi4uY29udGFjdCwgW25hbWVdOiB2YWx1ZSB9KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBTZW5kT3RwID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFyYW1zID0geyBlbWFpbDogY29udGFjdC5lbWFpbCwgZG9jSWQ6IHJlcy5kb2NJZCB9O1xyXG4gICAgICBjb25zdCBPdHAgPSBhd2FpdCBheGlvcy5wb3N0KFxyXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX0vZnVuY3Rpb25zL1NlbmRPVFBNYWlsVjFgLFxyXG4gICAgICAgIHBhcmFtcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKE90cCkge1xyXG4gICAgICAgIHNldElzT3RwKHRydWUpO1xyXG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIHZlcmlmeSBvdHAgaW4gcHVibGljLXNpZ25cIiwgZXJyb3IpO1xyXG4gICAgICBhbGVydCh0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLy92ZXJpZnkgT1RQIHNlbmQgb24gdmlhIGVtYWlsXHJcbiAgY29uc3QgVmVyaWZ5T1RQID0gYXN5bmMgKGUpID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHNldExvYWRpbmcodHJ1ZSk7XHJcbiAgICBjb25zdCBzZXJ2ZXJVcmwgPVxyXG4gICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIikgJiYgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpO1xyXG4gICAgY29uc3QgcGFyc2VJZCA9XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIik7XHJcbiAgICBpZiAob3RwKSB7XHJcbiAgICAgIC8vIHNldExvYWRpbmcodHJ1ZSk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHVybCA9IGAke3NlcnZlclVybH0vZnVuY3Rpb25zL0F1dGhMb2dpbkFzTWFpbC9gO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBwYXJzZUlkXHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgYm9keSA9IHsgZW1haWw6IGNvbnRhY3QuZW1haWwsIG90cDogb3RwIH07XHJcbiAgICAgICAgbGV0IHVzZXIgPSBhd2FpdCBheGlvcy5wb3N0KHVybCwgYm9keSwgeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xyXG4gICAgICAgIGlmICh1c2VyLmRhdGEucmVzdWx0ID09PSBcIkludmFsaWQgT3RwXCIpIHtcclxuICAgICAgICAgIGFsZXJ0KHQoXCJpbnZhbGlkLW90cFwiKSk7XHJcbiAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHVzZXIuZGF0YS5yZXN1bHQgPT09IFwidXNlciBub3QgZm91bmQhXCIpIHtcclxuICAgICAgICAgIGFsZXJ0KHQoXCJ1c2VyLW5vdC1mb3VuZFwiKSk7XHJcbiAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IF91c2VyID0gdXNlci5kYXRhLnJlc3VsdDtcclxuICAgICAgICAgIGNvbnN0IHBhcnNlSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIik7XHJcbiAgICAgICAgICBhd2FpdCBQYXJzZS5Vc2VyLmJlY29tZShfdXNlci5zZXNzaW9uVG9rZW4pO1xyXG4gICAgICAgICAgY29uc3QgY29udHJhY3RVc2VyRGV0YWlscyA9IGF3YWl0IGNvbnRyYWN0VXNlcnMoKTtcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiVXNlckluZm9ybWF0aW9uXCIsIEpTT04uc3RyaW5naWZ5KF91c2VyKSk7XHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICAgICAgYFBhcnNlLyR7cGFyc2VJZH0vY3VycmVudFVzZXJgLFxyXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShfdXNlcilcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoY29udHJhY3RVc2VyRGV0YWlscyAmJiBjb250cmFjdFVzZXJEZXRhaWxzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgICAgXCJFeHRhbmRfQ2xhc3NcIixcclxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjb250cmFjdFVzZXJEZXRhaWxzKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidXNlcm5hbWVcIiwgX3VzZXIubmFtZSk7XHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImFjY2Vzc3Rva2VuXCIsIF91c2VyLnNlc3Npb25Ub2tlbik7XHJcbiAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgIC8vIG5hdmlnYXRlKGAvbG9hZC9yZWNpcGllbnRTaWduUGRmLyR7cmVzPy5kb2NJZH0vJHtyZXM/LmNvbnRhY3RJZH1gKTtcclxuICAgICAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibXlfbW9kYWxcIikuY2xvc2UoKTtcclxuICAgICAgICAgIHNldElzUHVibGljQ29udGFjdChmYWxzZSk7XHJcbiAgICAgICAgICBzZXRJc1B1YmxpY1RlbXBsYXRlKGZhbHNlKTtcclxuICAgICAgICAgIHNldElzTG9hZGluZyh7IGlzTG9hZDogZmFsc2UgfSk7XHJcbiAgICAgICAgICBzZXREb2N1bWVudElkKHJlcz8uZG9jSWQpO1xyXG4gICAgICAgICAgZ2V0RG9jdW1lbnREZXRhaWxzKHJlcz8uZG9jSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVyciBcIiwgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhbGVydCh0KFwiZW50ZXItb3RwLWFsZXJ0XCIpKTtcclxuICAgIH1cclxuICB9O1xyXG4gIGNvbnN0IGhhbmRsZUNsb3NlT3RwID0gKCkgPT4ge1xyXG4gICAgc2V0SXNQdWJsaWNDb250YWN0KGZhbHNlKTtcclxuICAgIHNldExvYWRpbmcoZmFsc2UpO1xyXG4gICAgc2V0SXNPdHAoZmFsc2UpO1xyXG4gICAgc2V0T3RwKCk7XHJcbiAgICBzZXRDb250YWN0KHsgbmFtZTogXCJcIiwgZW1haWw6IFwiXCIsIHBob25lOiBcIlwiIH0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGNsaWNrT25ab29tSW4gPSAoKSA9PiB7XHJcbiAgICBvbkNsaWNrWm9vbUluKHNjYWxlLCB6b29tUGVyY2VudCwgc2V0U2NhbGUsIHNldFpvb21QZXJjZW50KTtcclxuICB9O1xyXG4gIGNvbnN0IGNsaWNrT25ab29tT3V0ID0gKCkgPT4ge1xyXG4gICAgb25DbGlja1pvb21PdXQoem9vbVBlcmNlbnQsIHNjYWxlLCBzZXRab29tUGVyY2VudCwgc2V0U2NhbGUpO1xyXG4gIH07XHJcbiAgY29uc3QgaGFuZGxlRG93bmxvYWRCdG4gPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCB1cmwgPSBwZGZEZXRhaWxzPy5bMF0/LlNpZ25lZFVybCB8fCBwZGZEZXRhaWxzPy5bMF0/LlVSTDtcclxuICAgIGNvbnN0IG5hbWUgPSBwZGZEZXRhaWxzPy5bMF0/Lk5hbWU7XHJcbiAgICBhd2FpdCBmZXRjaFVybCh1cmwsIG5hbWUpO1xyXG4gIH07XHJcbiAgcmV0dXJuIChcclxuICAgIDxEbmRQcm92aWRlciBiYWNrZW5kPXtIVE1MNUJhY2tlbmR9PlxyXG4gICAgICA8VGl0bGUgdGl0bGU9e3Byb3BzLnRlbXBsYXRlSWQgPyBcIlB1YmxpYyBTaWduXCIgOiBcIlJlcXVlc3QgU2lnblwifSAvPlxyXG4gICAgICB7aXNTdWJzY3JpcHRpb25FeHBpcmVkID8gKFxyXG4gICAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgICB0aXRsZT17dChcInN1YnNjcmlwdGlvbi1leHBpcmVkXCIpfVxyXG4gICAgICAgICAgaXNPcGVuPXtpc1N1YnNjcmlwdGlvbkV4cGlyZWR9XHJcbiAgICAgICAgICBzaG93Q2xvc2U9e2ZhbHNlfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgcHktNCBtZDpweS01IGdhcC01XCI+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gbWQ6dGV4dC1sZyBmb250LW5vcm1hbFwiPlxyXG4gICAgICAgICAgICAgIHt0KFwib3duZXItc3Vic2NyaXB0aW9uLWV4cGlyZWRcIil9XHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvTW9kYWxVaT5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8PlxyXG4gICAgICAgICAge2lzTG9hZGluZy5pc0xvYWQgPyAoXHJcbiAgICAgICAgICAgIDxMb2FkZXJXaXRoTXNnIGlzTG9hZGluZz17aXNMb2FkaW5nfSAvPlxyXG4gICAgICAgICAgKSA6IGhhbmRsZUVycm9yID8gKFxyXG4gICAgICAgICAgICA8SGFuZGxlRXJyb3IgaGFuZGxlRXJyb3I9e2hhbmRsZUVycm9yfSAvPlxyXG4gICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICB7aXNVaUxvYWRpbmcgJiYgKFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBoLVsxMDB2aF0gdy1mdWxsIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHotWzk5OV0gYmctWyNlNmYyZjJdIGJnLW9wYWNpdHktODBcIj5cclxuICAgICAgICAgICAgICAgICAgPExvYWRlciAvPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxM3B4XSB0ZXh0LWJhc2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt0KFwibG9hZGluZy1tc3NnXCIpfVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgIHtpc0NlbGVicmF0aW9uICYmIChcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgei1bMTAwMF1cIj5cclxuICAgICAgICAgICAgICAgICAgPENvbmZldHRpXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9e3dpbmRvdy5pbm5lcldpZHRofVxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD17d2luZG93LmlubmVySGVpZ2h0fVxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOlxyXG4gICAgICAgICAgICAgICAgICAgIGlzRXhwaXJlZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChpc0RlY2xpbmUuaXNEZWNsaW5lZCAmJiBpc0RlY2xpbmUuY3Vycm50ID09PSBcImFub3RoZXJcIilcclxuICAgICAgICAgICAgICAgICAgICAgID8gXCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgIDogXCJhdXRvXCJcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBvcC1jYXJkIG92ZXJmbG93LWhpZGRlbiBmbGV4IGZsZXgtY29sIG1kOmZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBiZy1iYXNlLTMwMFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgeyFyZXF1ZXN0U2lnblRvdXIgJiZcclxuICAgICAgICAgICAgICAgICAgc2lnbmVyT2JqZWN0SWQgJiZcclxuICAgICAgICAgICAgICAgICAgcmVxdWVzdFNpZ25Ub3VyRnVuY3Rpb24oKX1cclxuICAgICAgICAgICAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgICAgICAgICAgIGlzT3Blbj17aXNBbGVydC5pc1Nob3d9XHJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPXt0KFwiYWxlcnQtbWVzc2FnZVwiKX1cclxuICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7IGlzU2hvdzogZmFsc2UsIGFsZXJ0TWVzc2FnZTogXCJcIiB9KVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIHAtWzIwcHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+e2lzQWxlcnQuYWxlcnRNZXNzYWdlfTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0FsZXJ0KHsgaXNTaG93OiBmYWxzZSwgYWxlcnRNZXNzYWdlOiBcIlwiIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBtdC0zIHB4LTRcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIHt0KFwib2tcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9Nb2RhbFVpPlxyXG5cclxuICAgICAgICAgICAgICAgIDxUb3VyXHJcbiAgICAgICAgICAgICAgICAgIHNob3dOdW1iZXI9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgICBzaG93TmF2aWdhdGlvbj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICAgIHNob3dOYXZpZ2F0aW9uTnVtYmVyPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgb25SZXF1ZXN0Q2xvc2U9e2Nsb3NlVG91cn1cclxuICAgICAgICAgICAgICAgICAgc3RlcHM9e3RvdXJDb25maWd9XHJcbiAgICAgICAgICAgICAgICAgIGlzT3Blbj17d2lkZ2V0c1RvdXJ9XHJcbiAgICAgICAgICAgICAgICAgIHJvdW5kZWQ9ezV9XHJcbiAgICAgICAgICAgICAgICAgIGNsb3NlV2l0aE1hc2s9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICAgICAgICB7LyogdGhpcyBtb2RhbCBpcyB1c2VkIHRvIHNob3cgZGVjbGluZSBhbGVydCAqL31cclxuICAgICAgICAgICAgICAgIDxQZGZEZWNsaW5lTW9kYWxcclxuICAgICAgICAgICAgICAgICAgc2hvdz17aXNEZWNsaW5lLmlzRGVjbGluZWR9XHJcbiAgICAgICAgICAgICAgICAgIGhlYWRNc2c9e3QoXCJkb2N1bWVudC1kZWNsaW5lXCIpfVxyXG4gICAgICAgICAgICAgICAgICBib2R5TXNzZz17XHJcbiAgICAgICAgICAgICAgICAgICAgaXNEZWNsaW5lLmN1cnJudCA9PT0gXCJTdXJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgID8gdChcImRlY2xpbmUtYWxlcnQtMVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgOiBpc0RlY2xpbmUuY3Vycm50ID09PSBcIllvdURlY2xpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0KFwiZGVjbGluZS1hbGVydC0yXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXNEZWNsaW5lLmN1cnJudCA9PT0gXCJhbm90aGVyXCIgJiYgdChcImRlY2xpbmUtYWxlcnQtM1wiKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGZvb3Rlck1lc3NhZ2U9e2lzRGVjbGluZS5jdXJybnQgPT09IFwiU3VyZVwifVxyXG4gICAgICAgICAgICAgICAgICBkZWNsaW5lRG9jPXtkZWNsaW5lRG9jfVxyXG4gICAgICAgICAgICAgICAgICBzZXRJc0RlY2xpbmU9e3NldElzRGVjbGluZX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICB7LyogdGhpcyBtb2RhbCBpcyB1c2VkIGZvciBzaG93IGV4cGlyZWQgYWxlcnQgKi99XHJcbiAgICAgICAgICAgICAgICA8UGRmRGVjbGluZU1vZGFsXHJcbiAgICAgICAgICAgICAgICAgIHNob3c9e2lzRXhwaXJlZH1cclxuICAgICAgICAgICAgICAgICAgaGVhZE1zZz17dChcImV4cGlyZWQtZG9jLXRpdGxlXCIpfVxyXG4gICAgICAgICAgICAgICAgICBib2R5TXNzZz17dChcImV4cGlyZWQtb24tbXNzZ1wiLCB7IGV4cGlyZWREYXRlIH0pfVxyXG4gICAgICAgICAgICAgICAgICBpc0Rvd25sb2FkQnRuPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZEJ0bj17aGFuZGxlRG93bmxvYWRCdG59XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgeyFpc0VtYWlsVmVyaWZpZWQgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8VmVyaWZ5RW1haWxcclxuICAgICAgICAgICAgICAgICAgICBpc1ZlcmlmeU1vZGFsPXtpc1ZlcmlmeU1vZGFsfVxyXG4gICAgICAgICAgICAgICAgICAgIHNldElzVmVyaWZ5TW9kYWw9e3NldElzVmVyaWZ5TW9kYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVmVyaWZ5RW1haWw9e2hhbmRsZVZlcmlmeUVtYWlsfVxyXG4gICAgICAgICAgICAgICAgICAgIHNldE90cD17c2V0T3RwfVxyXG4gICAgICAgICAgICAgICAgICAgIG90cD17b3RwfVxyXG4gICAgICAgICAgICAgICAgICAgIG90cExvYWRlcj17b3RwTG9hZGVyfVxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVZlcmlmeUJ0bj17aGFuZGxlVmVyaWZ5QnRufVxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVJlc2VuZD17aGFuZGxlUmVzZW5kfVxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgICAgICAgICAgIGlzT3Blbj17aXNQdWJsaWNDb250YWN0fVxyXG4gICAgICAgICAgICAgICAgICB0aXRsZT17aXNPdHAgPyB0KFwidmVyaWZ5LWVtYWlsLTFcIikgOiB0KFwiY29udGFjdC1kZXRhaWxzXCIpfVxyXG4gICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZT17KCkgPT4gaGFuZGxlQ2xvc2VPdHAoKX1cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLWZ1bGwgcC1bMjBweF1cIj5cclxuICAgICAgICAgICAgICAgICAgICB7aXNPdHAgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBvblN1Ym1pdD17VmVyaWZ5T1RQfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3QoXCJnZXQtb3RwLWFsZXJ0XCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwib3AtaW5wdXQgb3AtaW5wdXQtYm9yZGVyZWQgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJvdHBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJncm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3QoXCJvdHAtcGxhY2Vob2xkZXJcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW52YWxpZD17KGUpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0Q3VzdG9tVmFsaWRpdHkodChcImlucHV0LXJlcXVpcmVkXCIpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5wdXQ9eyhlKSA9PiBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eShcIlwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e290cH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRPdHAoZS50YXJnZXQudmFsdWUpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17bG9hZGluZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbW9kYWwtYWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tZ2hvc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVDbG9zZU90cCgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImNhbmNlbFwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17bG9hZGluZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyB0KFwibG9hZGluZ1wiKSA6IHQoXCJ2ZXJpZnlcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVQdWJsaWNVc2VyfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cIm9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkICBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNCBoLTQgb3BhY2l0eS03MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCA4YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNlpNMTIuNzM1IDE0Yy42MTggMCAxLjA5My0uNTYxLjg3Mi0xLjEzOWE2LjAwMiA2LjAwMiAwIDAgMC0xMS4yMTUgMGMtLjIyLjU3OC4yNTQgMS4xMzkuODcyIDEuMTM5aDkuNDdaXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ3Jvd1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJuYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbnRhY3QubmFtZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dChcIm5hbWVcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW52YWxpZD17KGUpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0Q3VzdG9tVmFsaWRpdHkodChcImlucHV0LXJlcXVpcmVkXCIpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5wdXQ9eyhlKSA9PiBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eShcIlwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cIm9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00IG9wYWNpdHktNzBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIuNSAzQTEuNSAxLjUgMCAwIDAgMSA0LjV2Ljc5M2MuMDI2LjAwOS4wNTEuMDIuMDc2LjAzMkw3LjY3NCA4LjUxYy4yMDYuMS40NDYuMS42NTIgMGw2LjU5OC0zLjE4NUEuNzU1Ljc1NSAwIDAgMSAxNSA1LjI5M1Y0LjVBMS41IDEuNSAwIDAgMCAxMy41IDNoLTExWlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUgNi45NTQgOC45NzggOS44NmEyLjI1IDIuMjUgMCAwIDEtMS45NTYgMEwxIDYuOTU0VjExLjVBMS41IDEuNSAwIDAgMCAyLjUgMTNoMTFhMS41IDEuNSAwIDAgMCAxLjUtMS41VjYuOTU0WlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJncm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImVtYWlsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbnRhY3QuZW1haWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3QoXCJlbWFpbFwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25JbnZhbGlkPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eSh0KFwiaW5wdXQtcmVxdWlyZWRcIikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25JbnB1dD17KGUpID0+IGUudGFyZ2V0LnNldEN1c3RvbVZhbGlkaXR5KFwiXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17bG9hZGluZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cIm9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00IG9wYWNpdHktNzBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggOGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZaTTEyLjczNSAxNGMuNjE4IDAgMS4wOTMtLjU2MS44NzItMS4xMzlhNi4wMDIgNi4wMDIgMCAwIDAtMTEuMjE1IDBjLS4yMi41NzguMjU0IDEuMTM5Ljg3MiAxLjEzOWg5LjQ3WlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29udGFjdC5waG9uZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwaG9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dChcInBob25lXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17bG9hZGluZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbW9kYWwtYWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tZ2hvc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVDbG9zZU90cCgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImNsb3NlXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bG9hZGluZyA/IHQoXCJsb2FkaW5nXCIpIDogdChcInN1Ym1pdFwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvTW9kYWxVaT5cclxuICAgICAgICAgICAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgICAgICAgICAgIGlzT3Blbj17ZGVmYXVsdFNpZ25BbGVydC5pc1Nob3d9XHJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPXt0KFwiYXV0by1zaWduLWFsbFwiKX1cclxuICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RGVmYXVsdFNpZ25BbGVydCh7IGlzU2hvdzogZmFsc2UsIGFsZXJ0TWVzc2FnZTogXCJcIiB9KVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIHAtWzIwcHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+e2RlZmF1bHRTaWduQWxlcnQuYWxlcnRNZXNzYWdlfTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtWzFweF0gdy1mdWxsIG15LVsxNXB4XSBiZy1bIzlmOWY5Zl1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB7ZGVmYXVsdFNpZ25JbWcgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gYWRkRGVmYXVsdFNpZ25hdHVyZSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInllc1wiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGVmYXVsdFNpZ25BbGVydCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvdzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0TWVzc2FnZTogXCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJjbG9zZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzQWxlcnQoeyBpc1Nob3c6IGZhbHNlLCBhbGVydE1lc3NhZ2U6IFwiXCIgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJva1wiKX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9Nb2RhbFVpPlxyXG4gICAgICAgICAgICAgICAgey8qIHRoaXMgY29tcG9uZW50IHVzZWQgdG8gcmVuZGVyIGFsbCBwZGYgcGFnZXMgaW4gbGVmdCBzaWRlICovfVxyXG4gICAgICAgICAgICAgICAgPFJlbmRlckFsbFBkZlBhZ2VcclxuICAgICAgICAgICAgICAgICAgc2lnbmVyUG9zPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgIHNpZ25lck9iamVjdElkPXtzaWduZXJPYmplY3RJZH1cclxuICAgICAgICAgICAgICAgICAgc2lnblBkZlVybD17XHJcbiAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlsc1swXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIChwZGZEZXRhaWxzWzBdPy5TaWduZWRVcmwgfHwgcGRmRGV0YWlsc1swXT8uVVJMKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGFsbFBhZ2VzPXthbGxQYWdlc31cclxuICAgICAgICAgICAgICAgICAgc2V0QWxsUGFnZXM9e3NldEFsbFBhZ2VzfVxyXG4gICAgICAgICAgICAgICAgICBzZXRQYWdlTnVtYmVyPXtzZXRQYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICBjb250YWluZXJXSD17Y29udGFpbmVyV0h9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgey8qIHBkZiByZW5kZXIgdmlldyAqL31cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiIHctZnVsbCBtZDp3LVs1NyVdIGZsZXggbXItNFwiPlxyXG4gICAgICAgICAgICAgICAgICA8UGRmWm9vbVxyXG4gICAgICAgICAgICAgICAgICAgIGNsaWNrT25ab29tSW49e2NsaWNrT25ab29tSW59XHJcbiAgICAgICAgICAgICAgICAgICAgY2xpY2tPblpvb21PdXQ9e2NsaWNrT25ab29tT3V0fVxyXG4gICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZVJvdGF0ZT17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCIgdy1mdWxsIG1kOnctWzk1JV0gXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgey8qIHRoaXMgbW9kYWwgaXMgdXNlZCBzaG93IHRoaXMgZG9jdW1lbnQgaXMgYWxyZWFkeSBzaWduICovfVxyXG4gICAgICAgICAgICAgICAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc09wZW49e2lzQ29tcGxldGVkLmlzTW9kYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17dChcImRvY3VtZW50LXNpZ25lZFwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0NvbXBsZXRlZCgocHJldikgPT4gKHsgLi4ucHJldiwgaXNNb2RhbDogZmFsc2UgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VXaWR0aD17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICFpc0NvbXBsZXRlZD8ubWVzc2FnZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm1kOm1pbi13LVs0NDBweF0gbWQ6bWF4LXctWzQwMHB4XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLWZ1bGwgcC1bMjBweF0gdGV4dC1iYXNlLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge2lzQ29tcGxldGVkPy5tZXNzYWdlID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwPntpc0NvbXBsZXRlZD8ubWVzc2FnZX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC1bMTVweF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt0KFwiZG9jdW1lbnQtc2lnbmVkLWFsZXJ0LTRcIil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IWlzQ29tcGxldGVkPy5tZXNzYWdlICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggbXQtNCBnYXAtMSBweC1bMTVweF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9QcmludChlLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvbnQtWzUwMF0gdGV4dC1bMTNweF0gbXItWzVweF0gb3AtYnRuIG9wLWJ0bi1uZXV0cmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1wcmludFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJwcmludFwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkQ2VydGlmaWNhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb250LVs1MDBdIHRleHQtWzEzcHhdIG1yLVs1cHhdIG9wLWJ0biBvcC1idG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hd2FyZCBteC1bM3B4XSBsZzpteC0wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImNlcnRpZmljYXRlXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZvbnQtWzUwMF0gdGV4dC1bMTNweF0gbXItWzVweF0gb3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZFBkZihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0Rvd25sb2FkaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZG93bmxvYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiZG93bmxvYWRcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Nb2RhbFVpPlxyXG4gICAgICAgICAgICAgICAgICAgIHtpc0Rvd25sb2FkaW5nID09PSBcInBkZlwiICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZml4ZWQgei1bMTAwMF0gaW5zZXQtMCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBiZy1ibGFjayBiZy1vcGFjaXR5LTMwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxMb2FkZXIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgPE1vZGFsVWlcclxuICAgICAgICAgICAgICAgICAgICAgIGlzT3Blbj17aXNEb3dubG9hZGluZyA9PT0gXCJjZXJ0aWZpY2F0ZVwifVxyXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0Rvd25sb2FkaW5nID09PSBcImNlcnRpZmljYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHQoXCJnZW5lcmF0aW5nLWNlcnRpZmljYXRlXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0KFwicGRmLWRvd25sb2FkXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZT17KCkgPT4gc2V0SXNEb3dubG9hZGluZyhcIlwiKX1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtMyBtZDpwLTUgdGV4dC1bMTNweF0gbWQ6dGV4dC1iYXNlIHRleHQtY2VudGVyIHRleHQtYmFzZS1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc0Rvd25sb2FkaW5nID09PSBcImNlcnRpZmljYXRlXCJ9e1wiIFwifVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD57dChcImdlbmVyYXRlLWNlcnRpZmljYXRlLWFsZXJ0XCIpfTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvTW9kYWxVaT5cclxuICAgICAgICAgICAgICAgICAgICB7LyogdGhpcyBjb21wb25lbnQgaXMgdXNlZCBmb3Igc2lnbmF0dXJlIHBhZCBtb2RhbCAqL31cclxuICAgICAgICAgICAgICAgICAgICA8U2lnblBhZFxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNTaWduUGFkPXtpc1NpZ25QYWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpc1N0YW1wPXtpc1N0YW1wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdD17c2V0SXNJbWFnZVNlbGVjdH1cclxuICAgICAgICAgICAgICAgICAgICAgIHNldElzU2lnblBhZD17c2V0SXNTaWduUGFkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2U9e3NldEltYWdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNJbWFnZVNlbGVjdD17aXNJbWFnZVNlbGVjdH1cclxuICAgICAgICAgICAgICAgICAgICAgIGltYWdlUmVmPXtpbWFnZVJlZn1cclxuICAgICAgICAgICAgICAgICAgICAgIG9uSW1hZ2VDaGFuZ2U9e29uSW1hZ2VDaGFuZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmU9e3NldFNpZ25hdHVyZX1cclxuICAgICAgICAgICAgICAgICAgICAgIGltYWdlPXtpbWFnZX1cclxuICAgICAgICAgICAgICAgICAgICAgIG9uU2F2ZUltYWdlPXtzYXZlSW1hZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICBvblNhdmVTaWduPXtzYXZlU2lnbn1cclxuICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTaWduPXtkZWZhdWx0U2lnbkltZ31cclxuICAgICAgICAgICAgICAgICAgICAgIG15SW5pdGlhbD17bXlJbml0aWFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNJbml0aWFsPXtpc0luaXRpYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luaXRpYWw9e3NldElzSW5pdGlhbH1cclxuICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyV2lkZ2V0c0RldGFpbHM9e2N1cnJXaWRnZXRzRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17c2V0Q3VycldpZGdldHNEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgey8qIHBkZiBoZWFkZXIgd2hpY2ggY29udGFpbiBmdW5pc2ggYmFjayBidXR0b24gKi99XHJcbiAgICAgICAgICAgICAgICAgICAgPEhlYWRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNQZGZSZXF1ZXN0RmlsZXM9e2lzUHVibGljVGVtcGxhdGUgPyBmYWxzZSA6IHRydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgYWxsUGFnZXM9e2FsbFBhZ2VzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2hhbmdlUGFnZT17Y2hhbmdlUGFnZX1cclxuICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM9e3BkZkRldGFpbHN9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzaWduZXJQb3M9e3NpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgICAgIGlzU2lnbmVkPXtpc1NpZ25lZH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGxldGVkPXtpc0NvbXBsZXRlZC5pc0NlcnRpZmljYXRlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgZW1iZWRXaWRnZXRzRGF0YT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzUHVibGljVGVtcGxhdGUgPyBoYW5kbGVVc2VyRGV0YWlscyA6IGVtYmVkV2lkZ2V0c0RhdGFcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0hlYWRlcj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVjbGluZT17c2V0SXNEZWNsaW5lfVxyXG4gICAgICAgICAgICAgICAgICAgICAgZGVjbGluZT17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTaWduZXI9e2N1cnJlbnRTaWduZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICBwZGZVcmw9e3BkZlVybH1cclxuICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlTaWduPXthbHJlYWR5U2lnbn1cclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlzUHVibGljVGVtcGxhdGU9e2lzUHVibGljVGVtcGxhdGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGlja09uWm9vbUluPXtjbGlja09uWm9vbUlufVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2tPblpvb21PdXQ9e2NsaWNrT25ab29tT3V0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNEaXNhYmxlUm90YXRlPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgcmVmPXtkaXZSZWZ9IGRhdGEtdHV0PVwicGRmQXJlYVwiIGNsYXNzTmFtZT1cImgtWzk1JV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHtjb250YWluZXJXSCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxSZW5kZXJQZGZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0g9e3BkZk9yaWdpbmFsV0h9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmTmV3V2lkdGg9e3BkZk5ld1dpZHRofVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU2lnblBhZD17c2V0SXNTaWduUGFkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbktleT17c2V0U2lnbktleX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzPXtwZGZEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lclBvcz17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NFbWFpbD17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmVXJsPXtwZGZVcmx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUGFnZXM9e251bVBhZ2VzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VEZXRhaWxzPXtwYWdlRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZSZXF1ZXN0PXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lck9iamVjdElkPXtzaWduZXJPYmplY3RJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWRTaWduZXJzPXtzaWduZWRTaWduZXJzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBkZkxvYWQ9e3NldFBkZkxvYWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmTG9hZD17cGRmTG9hZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduZXJQb3M9e3NldFNpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJXSD17Y29udGFpbmVyV0h9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsaWRhdGVBbGVydD17c2V0VmFsaWRhdGVBbGVydH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB1blNpZ25lZFdpZGdldElkPXt1blNpZ25lZFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RXaWRnZXRJZD17c2VsZWN0V2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzPXtzZXRDdXJyV2lkZ2V0c0RldGFpbHN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2UmVmPXtkaXZSZWZ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNSZXNpemU9e3NldElzUmVzaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVzaXplPXtpc1Jlc2l6ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTY2FsZT17c2V0U2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9e3NjYWxlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkPXt1bmlxdWVJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc3B1YmxpY1RlbXBsYXRlPXtpc1B1YmxpY1RlbXBsYXRlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVzZXJEZXRhaWxzPXtoYW5kbGVVc2VyRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgbWQ6dy1bMjMlXSBiZy1iYXNlLTEwMCBvdmVyZmxvdy15LWF1dG8gaGlkZS1zY3JvbGxiYXIgaGlkZGVuIG1kOmlubGluZS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YG1heC1oLXNjcmVlbmB9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzaWduZWRTaWduZXJzLmxlbmd0aCA+IDAgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwicmVhY3RvdXJTZWNvbmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14LTIgcHItMiBwdC0yIHBiLTEgdGV4dC1bMTVweF0gdGV4dC1iYXNlLWNvbnRlbnQgZm9udC1zZW1pYm9sZCBib3JkZXItYi1bMXB4XSBib3JkZXItYmFzZS0zMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3QoXCJzaWduZWQtYnlcIil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC1bMnB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtzaWduZWRTaWduZXJzLm1hcCgob2JqLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtpbmR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTaWduZXJMaXN0Q29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmQ9e2luZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaj17b2JqfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNZW51PXtpc0hlYWRlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lclBvcz17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB7dW5zaWduZWRTaWduZXJzLmxlbmd0aCA+IDAgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwicmVhY3RvdXJGaXJzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXgtMiBwci0yIHB0LTIgcGItMSB0ZXh0LVsxNXB4XSB0ZXh0LWJhc2UtY29udGVudCBmb250LXNlbWlib2xkIGJvcmRlci1iLVsxcHhdIGJvcmRlci1iYXNlLTMwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57dChcInlldC10by1zaWduXCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtWzVweF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dW5zaWduZWRTaWduZXJzLm1hcCgob2JqLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtpbmR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTaWduZXJMaXN0Q29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmQ9e2luZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaj17b2JqfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNZW51PXtpc0hlYWRlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lclBvcz17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgIHtkZWZhdWx0U2lnbkltZyAmJiAhYWxyZWFkeVNpZ24gJiYgY3VycmVudFNpZ25lciAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8RGVmYXVsdFNpZ25hdHVyZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2lnbkltZz17ZGVmYXVsdFNpZ25JbWd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJPYmplY3RJZD17c2lnbmVyT2JqZWN0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzTG9hZGluZz17c2V0SXNMb2FkaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4eVBvc3Rpb249e3NpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGVmYXVsdFNpZ25BbGVydD17c2V0RGVmYXVsdFNpZ25BbGVydH1cclxuICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICApfVxyXG4gICAgICAgICAgPE1vZGFsVWlcclxuICAgICAgICAgICAgaXNPcGVuPXt2YWxpZGF0ZUFsZXJ0fVxyXG4gICAgICAgICAgICB0aXRsZT17dChcInZhbGlkYXRpb24tYWxlcnRcIil9XHJcbiAgICAgICAgICAgIGhhbmRsZUNsb3NlPXsoKSA9PiBzZXRWYWxpZGF0ZUFsZXJ0KGZhbHNlKX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLVsxMDAlXSBwLVsyMHB4XVwiPlxyXG4gICAgICAgICAgICAgIDxwPnt0KFwidmFsaWRhdGlvbi1hbGVydC0xXCIpfTwvcD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtWzFweF0gYmctWyM5ZjlmOWZdIHctZnVsbCBteS1bMTVweF1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWYWxpZGF0ZUFsZXJ0KGZhbHNlKX1cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3QoXCJjbG9zZVwiKX1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L01vZGFsVWk+XHJcbiAgICAgICAgPC8+XHJcbiAgICAgICl9XHJcbiAgICA8L0RuZFByb3ZpZGVyPlxyXG4gICk7XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgUGRmUmVxdWVzdEZpbGVzO1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmNvbnN0IEFsZXJ0ID0gKHsgY2hpbGRyZW4sIHR5cGUsIGNsYXNzTmFtZSB9KSA9PiB7XG4gIGNvbnN0IHRleHRjb2xvciA9IHR5cGUgPyB0aGVtZSh0eXBlKSA6IHRoZW1lKCk7XG4gIGZ1bmN0aW9uIHRoZW1lKGNvbG9yKSB7XG4gICAgc3dpdGNoIChjb2xvcikge1xuICAgICAgY2FzZSBcInN1Y2Nlc3NcIjpcbiAgICAgICAgcmV0dXJuIFwib3AtYWxlcnQtc3VjY2Vzc1wiO1xuICAgICAgY2FzZSBcImluZm9cIjpcbiAgICAgICAgcmV0dXJuIFwib3AtYWxlcnQtaW5mb1wiO1xuICAgICAgY2FzZSBcImRhbmdlclwiOlxuICAgICAgICByZXR1cm4gXCJvcC1hbGVydC1lcnJvclwiO1xuICAgICAgY2FzZSBcIndhcm5pbmdcIjpcbiAgICAgICAgcmV0dXJuIFwib3AtYWxlcnQtd2FybmluZ1wiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9XG4gIHJldHVybiAoXG4gICAgY2hpbGRyZW4gJiYgKFxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgIGNsYXNzTmFtZVxuICAgICAgICAgICAgPyBjbGFzc05hbWVcbiAgICAgICAgICAgIDogXCJ6LVsxMDAwXSBmaXhlZCB0b3AtMjAgbGVmdC0xLzIgdHJhbnNmb3JtIC10cmFuc2xhdGUteC0xLzIgdGV4dC1zbVwiXG4gICAgICAgIH0gIGB9XG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgb3AtYWxlcnQgJHt0ZXh0Y29sb3J9YH0+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWwtM1wiPntjaGlsZHJlbn08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWxlcnQ7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcblxyXG5mdW5jdGlvbiBIYW5kbGVFcnJvcih7IGhhbmRsZUVycm9yIH0pIHtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBoLVsxMDB2aF1cIj5cclxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMjBweF0gdGV4dC1bZ3JheV1cIj57aGFuZGxlRXJyb3J9PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSGFuZGxlRXJyb3I7XHJcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuY29uc3QgTG9hZGVyID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbG9hZGluZyBvcC1sb2FkaW5nLWluZmluaXR5IHctWzRyZW1dIHRleHQtbmV1dHJhbFwiPjwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTG9hZGVyO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExvYWRlciBmcm9tIFwiLi9Mb2FkZXJcIjtcblxuZnVuY3Rpb24gTG9hZGVyV2l0aE1zZyh7IGlzTG9hZGluZyB9KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBoLVsxMDB2aF1cIj5cbiAgICAgIDxMb2FkZXIgLz5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzEzcHhdIHRleHQtYmFzZS1jb3RlbnRcIj57aXNMb2FkaW5nLm1lc3NhZ2V9PC9zcGFuPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBMb2FkZXJXaXRoTXNnO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG5jb25zdCBNb2RhbFVpID0gKHtcbiAgY2hpbGRyZW4sXG4gIHRpdGxlLFxuICBpc09wZW4sXG4gIGhhbmRsZUNsb3NlLFxuICBzaG93SGVhZGVyID0gdHJ1ZSxcbiAgc2hvd0Nsb3NlID0gdHJ1ZSxcbiAgcmVkdWNlV2lkdGhcbn0pID0+IHtcbiAgY29uc3Qgd2lkdGggPSByZWR1Y2VXaWR0aDtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAge2lzT3BlbiAmJiAoXG4gICAgICAgIDxkaWFsb2cgY2xhc3NOYW1lPVwib3AtbW9kYWwgb3AtbW9kYWwtb3BlblwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICAgIHdpZHRoIHx8IFwibWQ6bWluLXctWzUwMHB4XVwiXG4gICAgICAgICAgICB9IG9wLW1vZGFsLWJveCBwLTAgbWF4LWgtOTAgb3ZlcmZsb3cteS1hdXRvIGhpZGUtc2Nyb2xsYmFyIHRleHQtc21gfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtzaG93SGVhZGVyICYmIChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1iYXNlLWNvbnRlbnQgZm9udC1ib2xkIHRleHQtbGcgcHQtWzE1cHhdIHB4LVsyMHB4XVwiPlxuICAgICAgICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAge3Nob3dDbG9zZSAmJiAoXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tc20gb3AtYnRuLWNpcmNsZSBvcC1idG4tZ2hvc3QgdGV4dC1iYXNlLWNvbnRlbnQgYWJzb2x1dGUgcmlnaHQtMiB0b3AtMlwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUNsb3NlICYmIGhhbmRsZUNsb3NlKCl9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIOKclVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPGRpdj57Y2hpbGRyZW59PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGlhbG9nPlxuICAgICAgKX1cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1vZGFsVWk7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBcIi4uL3N0eWxlcy9zaWduYXR1cmUuY3NzXCI7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XG5cbmZ1bmN0aW9uIEN1c3RvbU1vZGFsKHByb3BzKSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW3JlYXNvbiwgc2V0UmVhc29uXSA9IHVzZVN0YXRlKFwiXCIpO1xuICByZXR1cm4gKFxuICAgIHByb3BzLnNob3cgJiYgKFxuICAgICAgPGRpYWxvZyBjbGFzc05hbWU9XCJvcC1tb2RhbCBvcC1tb2RhbC1vcGVuIGFic29sdXRlIHotWzQ0OF1cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LVs5NSVdIG1kOnctWzYwJV0gbGc6dy1bNDAlXSBvcC1tb2RhbC1ib3ggcC0wIG92ZXJmbG93LXktYXV0byBoaWRlLXNjcm9sbGJhciB0ZXh0LXNtXCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtYmFzZS1jb250ZW50IGZvbnQtYm9sZCB0ZXh0LWxnIHB0LVsxNXB4XSBweC1bMjBweF1cIj5cbiAgICAgICAgICAgIHtwcm9wcz8uaGVhZE1zZyAmJiBwcm9wcz8uaGVhZE1zZ31cbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC1bMTBweF0gcHgtWzIwcHhdXCI+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LVsxNXB4XVwiPntwcm9wcy5ib2R5TXNzZyAmJiBwcm9wcy5ib2R5TXNzZ308L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge3Byb3BzLmlzRG93bmxvYWRCdG4gJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktc3RhcnQgdy1mdWxsIG1sLVsyMHB4XSBtYi0zIG10LTFcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHByb3BzLmhhbmRsZURvd25sb2FkQnRuKCl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBEb3dubG9hZFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge3Byb3BzLmZvb3Rlck1lc3NhZ2UgJiYgKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC0zXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICByb3dzPXszfVxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJSZWFzb24gKG9wdGlvbmFsKVwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJweC00IG9wLXRleHRhcmVhIG9wLXRleHRhcmVhLWJvcmRlcmVkIGZvY3VzOm91dGxpbmUtbm9uZSBob3Zlcjpib3JkZXItYmFzZS1jb250ZW50IHctZnVsbCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXtyZWFzb259XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFJlYXNvbihlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm0tWzE1cHhdXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG1yLTIgcHgtNlwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UmVhc29uKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICBwcm9wcy5kZWNsaW5lRG9jKHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt0KFwieWVzXCIpfVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRSZWFzb24oXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldElzRGVjbGluZSh7IGlzRGVjbGluZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7dChcImNsb3NlXCIpfVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaWFsb2c+XG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDdXN0b21Nb2RhbDtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVG91ckNvbnRlbnRXaXRoQnRuKHsgbWVzc2FnZSwgaXNDaGVja2VkIH0pIHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xuICBjb25zdCBbaXNDaGVjaywgc2V0SXNDaGVja10gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hlY2sgPSAoKSA9PiB7XG4gICAgc2V0SXNDaGVjayghaXNDaGVjayk7XG4gICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgaXNDaGVja2VkKCFpc0NoZWNrKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAoXG4gICAgPGRpdj5cbiAgICAgIDxwPnttZXNzYWdlfTwvcD5cbiAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtYi0wXCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwib3AtY2hlY2tib3ggb3AtY2hlY2tib3gteHMgbXItMVwiXG4gICAgICAgICAgY2hlY2tlZD17aXNDaGVja31cbiAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hlY2t9XG4gICAgICAgIC8+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIiM3ODc4NzggdGV4dC1bMTJweF1cIj57dChcInRvdXItY29udGVudFwiKX08L3NwYW4+XG4gICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuICApO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UgfSBmcm9tIFwiQHJlZHV4anMvdG9vbGtpdFwiO1xyXG5cclxuY29uc3Qgc2hvd1RlbmFudFNsaWNlID0gY3JlYXRlU2xpY2Uoe1xyXG4gIG5hbWU6IFwic2hvd1RlbmFudFwiLFxyXG4gIGluaXRpYWxTdGF0ZTogXCJcIixcclxuICByZWR1Y2Vyczoge1xyXG4gICAgc2hvd1RlbmFudDogKHN0YXRlLCBhY3Rpb24pID0+IHtcclxuICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xyXG4gICAgfSxcclxuICB9LFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCB7IHNob3dUZW5hbnQgfSA9IHNob3dUZW5hbnRTbGljZS5hY3Rpb25zO1xyXG5leHBvcnQgZGVmYXVsdCBzaG93VGVuYW50U2xpY2UucmVkdWNlcjsiLCJpbXBvcnQgeyBjcmVhdGVTbGljZSB9IGZyb20gXCJAcmVkdXhqcy90b29sa2l0XCI7XHJcblxyXG5jb25zdCB0b3VyU3RlcFNsaWNlID0gY3JlYXRlU2xpY2Uoe1xyXG4gIG5hbWU6IFwidG91clN0ZXBcIixcclxuICBpbml0aWFsU3RhdGU6IFtdLFxyXG4gIHJlZHVjZXJzOiB7XHJcbiAgICBzYXZlVG91clN0ZXBzOiAoc3RhdGUsIGFjdGlvbikgPT4ge1xyXG4gICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XHJcbiAgICB9LFxyXG4gICAgcmVtb3ZlVG91clN0ZXBzOiAoKSA9PiB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHsgc2F2ZVRvdXJTdGVwcywgcmVtb3ZlVG91clN0ZXBzIH0gPSB0b3VyU3RlcFNsaWNlLmFjdGlvbnM7XHJcbmV4cG9ydCBkZWZhdWx0IHRvdXJTdGVwU2xpY2UucmVkdWNlcjtcclxuIiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UgfSBmcm9tIFwiQHJlZHV4anMvdG9vbGtpdFwiO1xuaW1wb3J0IHsgYXBwSW5mbyB9IGZyb20gXCIuLi8uLi9jb25zdGFudC9hcHBpbmZvXCI7XG5cbmNvbnN0IGluZm9TbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgbmFtZTogXCJpbmZvXCIsXG4gIGluaXRpYWxTdGF0ZToge30sXG4gIHJlZHVjZXJzOiB7XG4gICAgZmV0Y2hBcHBJbmZvOiAoKSA9PiB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImJhc2VVcmxcIiwgYCR7YXBwSW5mby5iYXNlVXJsfS9gKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwicGFyc2VBcHBJZFwiLCBhcHBJbmZvLmFwcElkKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYXBwTG9nb1wiLCBhcHBJbmZvLmFwcGxvZ28pO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJ1c2VyU2V0dGluZ3NcIik7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInVzZXJTZXR0aW5nc1wiLCBKU09OLnN0cmluZ2lmeShhcHBJbmZvLnNldHRpbmdzKSk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImZldl9JY29uXCIsIGFwcEluZm8uZmV2X0ljb24pO1xuICAgICAgcmV0dXJuIGFwcEluZm87XG4gICAgfVxuICB9XG59KTtcbmV4cG9ydCBjb25zdCB7IGZldGNoQXBwSW5mbyB9ID0gaW5mb1NsaWNlLmFjdGlvbnM7XG5leHBvcnQgZGVmYXVsdCBpbmZvU2xpY2UucmVkdWNlcjtcbiIsImltcG9ydCB7IGNyZWF0ZVNsaWNlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcclxuXHJcbmNvbnN0IHNob3dIZWFkZXJTbGljZSA9IGNyZWF0ZVNsaWNlKHtcclxuICBuYW1lOiBcInNob3dUZW5hbnRcIixcclxuICBpbml0aWFsU3RhdGU6IFwiXCIsXHJcbiAgcmVkdWNlcnM6IHtcclxuICAgIHNob3dIZWFkZXI6IChzdGF0ZSwgYWN0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHsgc2hvd0hlYWRlciB9ID0gc2hvd0hlYWRlclNsaWNlLmFjdGlvbnM7XHJcbmV4cG9ydCBkZWZhdWx0IHNob3dIZWFkZXJTbGljZS5yZWR1Y2VyO1xyXG4iLCIvLyBpbXBvcnQgeyBjcmVhdGVTdG9yZSwgYXBwbHlNaWRkbGV3YXJlIH0gZnJvbSBcInJlZHV4XCI7XHJcbi8vIGltcG9ydCB0aHVuayBmcm9tIFwicmVkdXgtdGh1bmtcIjtcclxuLy8gaW1wb3J0IHJlZHVjZXJzIGZyb20gXCIuL3JlZHVjZXJzXCI7XHJcblxyXG4vLyBleHBvcnQgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShyZWR1Y2VycywgYXBwbHlNaWRkbGV3YXJlKHRodW5rKSk7XHJcbmltcG9ydCB7IGNvbmZpZ3VyZVN0b3JlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcclxuaW1wb3J0IGluZm9SZWR1Y2VyIGZyb20gXCIuL3JlZHVjZXJzL2luZm9SZWR1Y2VyXCI7XHJcbmltcG9ydCBTaG93VGVuYW50IGZyb20gXCIuL3JlZHVjZXJzL1Nob3dUZW5hbnRcIjtcclxuaW1wb3J0IFRvdXJTdGVwc1JlZHVjZXIgZnJvbSBcIi4vcmVkdWNlcnMvVG91clN0ZXBzUmVkdWNlclwiO1xyXG5pbXBvcnQgc2hvd0hlYWRlciBmcm9tIFwiLi9yZWR1Y2Vycy9zaG93SGVhZGVyXCI7XHJcbmV4cG9ydCBjb25zdCBzdG9yZSA9IGNvbmZpZ3VyZVN0b3JlKHtcclxuICByZWR1Y2VyOiB7XHJcbiAgICBhcHBJbmZvOiBpbmZvUmVkdWNlcixcclxuICAgIFRvdXJTdGVwczogVG91clN0ZXBzUmVkdWNlcixcclxuICAgIFNob3dUZW5hbnQsXHJcbiAgICBzaG93SGVhZGVyXHJcbiAgfVxyXG59KTtcclxuIiwiaW1wb3J0IGkxOG4gZnJvbSBcImkxOG5leHRcIjtcbmltcG9ydCB7IGluaXRSZWFjdEkxOG5leHQgfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xuaW1wb3J0IExhbmd1YWdlRGV0ZWN0b3IgZnJvbSBcImkxOG5leHQtYnJvd3Nlci1sYW5ndWFnZWRldGVjdG9yXCI7XG5pbXBvcnQgZW4gZnJvbSBcIi4vbG9jYWxlcy9lbi90cmFuc2xhdGlvbi5qc29uXCI7XG5pbXBvcnQgZnIgZnJvbSBcIi4vbG9jYWxlcy9mci90cmFuc2xhdGlvbi5qc29uXCI7XG5cbmkxOG5cbiAgLnVzZShMYW5ndWFnZURldGVjdG9yKVxuICAudXNlKGluaXRSZWFjdEkxOG5leHQpXG4gIC5pbml0KHtcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIGVuOiB7XG4gICAgICAgIHRyYW5zbGF0aW9uOiBlblxuICAgICAgfSxcbiAgICAgIGZyOiB7XG4gICAgICAgIHRyYW5zbGF0aW9uOiBmclxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmYWxsYmFja0xuZzogXCJlblwiLCAvLyBmYWxsYmFjayBsYW5ndWFnZVxuICAgIGRldGVjdGlvbjoge1xuICAgICAgLy8gU3BlY2lmaWVzIHRoZSBkZWZhdWx0IGxhbmd1YWdlIHRvIGZhbGwgYmFjayB0byBpZiB0aGUgZGV0ZWN0ZWQgbGFuZ3VhZ2UgaXMgbm90IGF2YWlsYWJsZS5cbiAgICAgIG9yZGVyOiBbXCJsb2NhbFN0b3JhZ2VcIiwgXCJuYXZpZ2F0b3JcIl1cbiAgICAgIC8vIERlZmluZXMgd2hlcmUgdGhlIGRldGVjdGVkIGxhbmd1YWdlIHNob3VsZCBiZSBjYWNoZWQuXG4gICAgfSxcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgZXNjYXBlVmFsdWU6IGZhbHNlIC8vIFJlYWN0IGFscmVhZHkgZG9lcyBlc2NhcGluZ1xuICAgIH0sXG4gICAgd2hpdGVsaXN0OiBbXCJlblwiLCBcImZyXCJdIC8vIExpc3Qgb2YgYWxsb3dlZCBsYW5ndWFnZXNcbiAgfSk7XG5cbmV4cG9ydCBkZWZhdWx0IGkxOG47XG4iLCJmdW5jdGlvbiByKGUpe3ZhciBvLHQsZj1cIlwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZSlmKz1lO2Vsc2UgaWYoXCJvYmplY3RcIj09dHlwZW9mIGUpaWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIG49ZS5sZW5ndGg7Zm9yKG89MDtvPG47bysrKWVbb10mJih0PXIoZVtvXSkpJiYoZiYmKGYrPVwiIFwiKSxmKz10KX1lbHNlIGZvcih0IGluIGUpZVt0XSYmKGYmJihmKz1cIiBcIiksZis9dCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgZSxvLHQ9MCxmPVwiXCIsbj1hcmd1bWVudHMubGVuZ3RoO3Q8bjt0KyspKGU9YXJndW1lbnRzW3RdKSYmKG89cihlKSkmJihmJiYoZis9XCIgXCIpLGYrPW8pO3JldHVybiBmfW1vZHVsZS5leHBvcnRzPWUsbW9kdWxlLmV4cG9ydHMuY2xzeD1lOyIsInZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciB0b0NsYXNzTmFtZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKVxuICAgICAgICBzdHIgKz0gdmFsO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHZhciB0bXAgPSB2b2lkIDA7XG4gICAgICAgIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIHZhciBsID0gdmFsLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICAgICAgICAgIHRtcCA9IHRvQ2xhc3NOYW1lKHZhbFtpKytdKTtcbiAgICAgICAgICAgICAgICBpZiAodG1wKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IHRtcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgICAgICAgICBmb3IgKHRtcCBpbiB2YWwpIHtcbiAgICAgICAgICAgICAgICBpZiAodG1wICYmIHZhbFt0bXBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IHRtcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn07XG5leHBvcnQgZnVuY3Rpb24gY25iKCkge1xuICAgIHZhciBsID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIG47XG4gICAgdmFyIHRtcDtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgd2hpbGUgKGkgPCBsKSB7XG4gICAgICAgIG4gPSBhcmd1bWVudHNbaSsrXTtcbiAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgIHRtcCA9IHRvQ2xhc3NOYW1lKG4pO1xuICAgICAgICAgICAgaWYgKHRtcCkge1xuICAgICAgICAgICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyICs9IHRtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuIiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2VuYy1iYXNlNjRcIiksIHJlcXVpcmUoXCIuL21kNVwiKSwgcmVxdWlyZShcIi4vZXZwa2RmXCIpLCByZXF1aXJlKFwiLi9jaXBoZXItY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9lbmMtYmFzZTY0XCIsIFwiLi9tZDVcIiwgXCIuL2V2cGtkZlwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCbG9ja0NpcGhlciA9IENfbGliLkJsb2NrQ2lwaGVyO1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgLy8gTG9va3VwIHRhYmxlc1xuXHQgICAgdmFyIFNCT1ggPSBbXTtcblx0ICAgIHZhciBJTlZfU0JPWCA9IFtdO1xuXHQgICAgdmFyIFNVQl9NSVhfMCA9IFtdO1xuXHQgICAgdmFyIFNVQl9NSVhfMSA9IFtdO1xuXHQgICAgdmFyIFNVQl9NSVhfMiA9IFtdO1xuXHQgICAgdmFyIFNVQl9NSVhfMyA9IFtdO1xuXHQgICAgdmFyIElOVl9TVUJfTUlYXzAgPSBbXTtcblx0ICAgIHZhciBJTlZfU1VCX01JWF8xID0gW107XG5cdCAgICB2YXIgSU5WX1NVQl9NSVhfMiA9IFtdO1xuXHQgICAgdmFyIElOVl9TVUJfTUlYXzMgPSBbXTtcblxuXHQgICAgLy8gQ29tcHV0ZSBsb29rdXAgdGFibGVzXG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8vIENvbXB1dGUgZG91YmxlIHRhYmxlXG5cdCAgICAgICAgdmFyIGQgPSBbXTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG5cdCAgICAgICAgICAgIGlmIChpIDwgMTI4KSB7XG5cdCAgICAgICAgICAgICAgICBkW2ldID0gaSA8PCAxO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgZFtpXSA9IChpIDw8IDEpIF4gMHgxMWI7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBXYWxrIEdGKDJeOClcblx0ICAgICAgICB2YXIgeCA9IDA7XG5cdCAgICAgICAgdmFyIHhpID0gMDtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgc2JveFxuXHQgICAgICAgICAgICB2YXIgc3ggPSB4aSBeICh4aSA8PCAxKSBeICh4aSA8PCAyKSBeICh4aSA8PCAzKSBeICh4aSA8PCA0KTtcblx0ICAgICAgICAgICAgc3ggPSAoc3ggPj4+IDgpIF4gKHN4ICYgMHhmZikgXiAweDYzO1xuXHQgICAgICAgICAgICBTQk9YW3hdID0gc3g7XG5cdCAgICAgICAgICAgIElOVl9TQk9YW3N4XSA9IHg7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBtdWx0aXBsaWNhdGlvblxuXHQgICAgICAgICAgICB2YXIgeDIgPSBkW3hdO1xuXHQgICAgICAgICAgICB2YXIgeDQgPSBkW3gyXTtcblx0ICAgICAgICAgICAgdmFyIHg4ID0gZFt4NF07XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBzdWIgYnl0ZXMsIG1peCBjb2x1bW5zIHRhYmxlc1xuXHQgICAgICAgICAgICB2YXIgdCA9IChkW3N4XSAqIDB4MTAxKSBeIChzeCAqIDB4MTAxMDEwMCk7XG5cdCAgICAgICAgICAgIFNVQl9NSVhfMFt4XSA9ICh0IDw8IDI0KSB8ICh0ID4+PiA4KTtcblx0ICAgICAgICAgICAgU1VCX01JWF8xW3hdID0gKHQgPDwgMTYpIHwgKHQgPj4+IDE2KTtcblx0ICAgICAgICAgICAgU1VCX01JWF8yW3hdID0gKHQgPDwgOCkgIHwgKHQgPj4+IDI0KTtcblx0ICAgICAgICAgICAgU1VCX01JWF8zW3hdID0gdDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIGludiBzdWIgYnl0ZXMsIGludiBtaXggY29sdW1ucyB0YWJsZXNcblx0ICAgICAgICAgICAgdmFyIHQgPSAoeDggKiAweDEwMTAxMDEpIF4gKHg0ICogMHgxMDAwMSkgXiAoeDIgKiAweDEwMSkgXiAoeCAqIDB4MTAxMDEwMCk7XG5cdCAgICAgICAgICAgIElOVl9TVUJfTUlYXzBbc3hdID0gKHQgPDwgMjQpIHwgKHQgPj4+IDgpO1xuXHQgICAgICAgICAgICBJTlZfU1VCX01JWF8xW3N4XSA9ICh0IDw8IDE2KSB8ICh0ID4+PiAxNik7XG5cdCAgICAgICAgICAgIElOVl9TVUJfTUlYXzJbc3hdID0gKHQgPDwgOCkgIHwgKHQgPj4+IDI0KTtcblx0ICAgICAgICAgICAgSU5WX1NVQl9NSVhfM1tzeF0gPSB0O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgbmV4dCBjb3VudGVyXG5cdCAgICAgICAgICAgIGlmICgheCkge1xuXHQgICAgICAgICAgICAgICAgeCA9IHhpID0gMTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHggPSB4MiBeIGRbZFtkW3g4IF4geDJdXV07XG5cdCAgICAgICAgICAgICAgICB4aSBePSBkW2RbeGldXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0oKSk7XG5cblx0ICAgIC8vIFByZWNvbXB1dGVkIFJjb24gbG9va3VwXG5cdCAgICB2YXIgUkNPTiA9IFsweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweDFiLCAweDM2XTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBRVMgYmxvY2sgY2lwaGVyIGFsZ29yaXRobS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEFFUyA9IENfYWxnby5BRVMgPSBCbG9ja0NpcGhlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciB0O1xuXG5cdCAgICAgICAgICAgIC8vIFNraXAgcmVzZXQgb2YgblJvdW5kcyBoYXMgYmVlbiBzZXQgYmVmb3JlIGFuZCBrZXkgZGlkIG5vdCBjaGFuZ2Vcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX25Sb3VuZHMgJiYgdGhpcy5fa2V5UHJpb3JSZXNldCA9PT0gdGhpcy5fa2V5KSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGtleSA9IHRoaXMuX2tleVByaW9yUmVzZXQgPSB0aGlzLl9rZXk7XG5cdCAgICAgICAgICAgIHZhciBrZXlXb3JkcyA9IGtleS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIGtleVNpemUgPSBrZXkuc2lnQnl0ZXMgLyA0O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgbnVtYmVyIG9mIHJvdW5kc1xuXHQgICAgICAgICAgICB2YXIgblJvdW5kcyA9IHRoaXMuX25Sb3VuZHMgPSBrZXlTaXplICsgNjtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIG51bWJlciBvZiBrZXkgc2NoZWR1bGUgcm93c1xuXHQgICAgICAgICAgICB2YXIga3NSb3dzID0gKG5Sb3VuZHMgKyAxKSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBrZXkgc2NoZWR1bGVcblx0ICAgICAgICAgICAgdmFyIGtleVNjaGVkdWxlID0gdGhpcy5fa2V5U2NoZWR1bGUgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIga3NSb3cgPSAwOyBrc1JvdyA8IGtzUm93czsga3NSb3crKykge1xuXHQgICAgICAgICAgICAgICAgaWYgKGtzUm93IDwga2V5U2l6ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGtleVNjaGVkdWxlW2tzUm93XSA9IGtleVdvcmRzW2tzUm93XTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCA9IGtleVNjaGVkdWxlW2tzUm93IC0gMV07XG5cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIShrc1JvdyAlIGtleVNpemUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJvdCB3b3JkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAodCA8PCA4KSB8ICh0ID4+PiAyNCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ViIHdvcmRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdCA9IChTQk9YW3QgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsodCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHQgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3QgJiAweGZmXTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXggUmNvblxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0IF49IFJDT05bKGtzUm93IC8ga2V5U2l6ZSkgfCAwXSA8PCAyNDtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleVNpemUgPiA2ICYmIGtzUm93ICUga2V5U2l6ZSA9PSA0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YiB3b3JkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoU0JPWFt0ID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHQgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyh0ID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFt0ICYgMHhmZl07XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAga2V5U2NoZWR1bGVba3NSb3ddID0ga2V5U2NoZWR1bGVba3NSb3cgLSBrZXlTaXplXSBeIHQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIGludiBrZXkgc2NoZWR1bGVcblx0ICAgICAgICAgICAgdmFyIGludktleVNjaGVkdWxlID0gdGhpcy5faW52S2V5U2NoZWR1bGUgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaW52S3NSb3cgPSAwOyBpbnZLc1JvdyA8IGtzUm93czsgaW52S3NSb3crKykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtzUm93ID0ga3NSb3dzIC0gaW52S3NSb3c7XG5cblx0ICAgICAgICAgICAgICAgIGlmIChpbnZLc1JvdyAlIDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGtleVNjaGVkdWxlW2tzUm93XTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBrZXlTY2hlZHVsZVtrc1JvdyAtIDRdO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBpZiAoaW52S3NSb3cgPCA0IHx8IGtzUm93IDw9IDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpbnZLZXlTY2hlZHVsZVtpbnZLc1Jvd10gPSB0O1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBpbnZLZXlTY2hlZHVsZVtpbnZLc1Jvd10gPSBJTlZfU1VCX01JWF8wW1NCT1hbdCA+Pj4gMjRdXSBeIElOVl9TVUJfTUlYXzFbU0JPWFsodCA+Pj4gMTYpICYgMHhmZl1dIF5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZfU1VCX01JWF8yW1NCT1hbKHQgPj4+IDgpICYgMHhmZl1dIF4gSU5WX1NVQl9NSVhfM1tTQk9YW3QgJiAweGZmXV07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZW5jcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2RvQ3J5cHRCbG9jayhNLCBvZmZzZXQsIHRoaXMuX2tleVNjaGVkdWxlLCBTVUJfTUlYXzAsIFNVQl9NSVhfMSwgU1VCX01JWF8yLCBTVUJfTUlYXzMsIFNCT1gpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBkZWNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU3dhcCAybmQgYW5kIDR0aCByb3dzXG5cdCAgICAgICAgICAgIHZhciB0ID0gTVtvZmZzZXQgKyAxXTtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAxXSA9IE1bb2Zmc2V0ICsgM107XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgM10gPSB0O1xuXG5cdCAgICAgICAgICAgIHRoaXMuX2RvQ3J5cHRCbG9jayhNLCBvZmZzZXQsIHRoaXMuX2ludktleVNjaGVkdWxlLCBJTlZfU1VCX01JWF8wLCBJTlZfU1VCX01JWF8xLCBJTlZfU1VCX01JWF8yLCBJTlZfU1VCX01JWF8zLCBJTlZfU0JPWCk7XG5cblx0ICAgICAgICAgICAgLy8gSW52IHN3YXAgMm5kIGFuZCA0dGggcm93c1xuXHQgICAgICAgICAgICB2YXIgdCA9IE1bb2Zmc2V0ICsgMV07XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMV0gPSBNW29mZnNldCArIDNdO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDNdID0gdDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvQ3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCwga2V5U2NoZWR1bGUsIFNVQl9NSVhfMCwgU1VCX01JWF8xLCBTVUJfTUlYXzIsIFNVQl9NSVhfMywgU0JPWCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgblJvdW5kcyA9IHRoaXMuX25Sb3VuZHM7XG5cblx0ICAgICAgICAgICAgLy8gR2V0IGlucHV0LCBhZGQgcm91bmQga2V5XG5cdCAgICAgICAgICAgIHZhciBzMCA9IE1bb2Zmc2V0XSAgICAgXiBrZXlTY2hlZHVsZVswXTtcblx0ICAgICAgICAgICAgdmFyIHMxID0gTVtvZmZzZXQgKyAxXSBeIGtleVNjaGVkdWxlWzFdO1xuXHQgICAgICAgICAgICB2YXIgczIgPSBNW29mZnNldCArIDJdIF4ga2V5U2NoZWR1bGVbMl07XG5cdCAgICAgICAgICAgIHZhciBzMyA9IE1bb2Zmc2V0ICsgM10gXiBrZXlTY2hlZHVsZVszXTtcblxuXHQgICAgICAgICAgICAvLyBLZXkgc2NoZWR1bGUgcm93IGNvdW50ZXJcblx0ICAgICAgICAgICAgdmFyIGtzUm93ID0gNDtcblxuXHQgICAgICAgICAgICAvLyBSb3VuZHNcblx0ICAgICAgICAgICAgZm9yICh2YXIgcm91bmQgPSAxOyByb3VuZCA8IG5Sb3VuZHM7IHJvdW5kKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNoaWZ0IHJvd3MsIHN1YiBieXRlcywgbWl4IGNvbHVtbnMsIGFkZCByb3VuZCBrZXlcblx0ICAgICAgICAgICAgICAgIHZhciB0MCA9IFNVQl9NSVhfMFtzMCA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMSA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMyID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MzICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MSA9IFNVQl9NSVhfMFtzMSA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMiA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMzID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MwICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MiA9IFNVQl9NSVhfMFtzMiA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMyA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMwID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MxICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MyA9IFNVQl9NSVhfMFtzMyA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMCA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMxID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MyICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblxuXHQgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHN0YXRlXG5cdCAgICAgICAgICAgICAgICBzMCA9IHQwO1xuXHQgICAgICAgICAgICAgICAgczEgPSB0MTtcblx0ICAgICAgICAgICAgICAgIHMyID0gdDI7XG5cdCAgICAgICAgICAgICAgICBzMyA9IHQzO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gU2hpZnQgcm93cywgc3ViIGJ5dGVzLCBhZGQgcm91bmQga2V5XG5cdCAgICAgICAgICAgIHZhciB0MCA9ICgoU0JPWFtzMCA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMSA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMyID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMyAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICB2YXIgdDEgPSAoKFNCT1hbczEgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczIgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMyA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczAgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgdmFyIHQyID0gKChTQk9YW3MyID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMzID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczAgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MxICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgIHZhciB0MyA9ICgoU0JPWFtzMyA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMxID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMiAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXG5cdCAgICAgICAgICAgIC8vIFNldCBvdXRwdXRcblx0ICAgICAgICAgICAgTVtvZmZzZXRdICAgICA9IHQwO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDFdID0gdDE7XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMl0gPSB0Mjtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAzXSA9IHQzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBrZXlTaXplOiAyNTYvMzJcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgY2lwaGVydGV4dCA9IENyeXB0b0pTLkFFUy5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTtcblx0ICAgICAqICAgICB2YXIgcGxhaW50ZXh0ICA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KGNpcGhlcnRleHQsIGtleSwgY2ZnKTtcblx0ICAgICAqL1xuXHQgICAgQy5BRVMgPSBCbG9ja0NpcGhlci5fY3JlYXRlSGVscGVyKEFFUyk7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuQUVTO1xuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2V2cGtkZlwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9ldnBrZGZcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKlxuXHQgKiBDaXBoZXIgY29yZSBjb21wb25lbnRzLlxuXHQgKi9cblx0Q3J5cHRvSlMubGliLkNpcGhlciB8fCAoZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBDX2xpYi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtO1xuXHQgICAgdmFyIENfZW5jID0gQy5lbmM7XG5cdCAgICB2YXIgVXRmOCA9IENfZW5jLlV0Zjg7XG5cdCAgICB2YXIgQmFzZTY0ID0gQ19lbmMuQmFzZTY0O1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblx0ICAgIHZhciBFdnBLREYgPSBDX2FsZ28uRXZwS0RGO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJhc2UgY2lwaGVyIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBrZXlTaXplIFRoaXMgY2lwaGVyJ3Mga2V5IHNpemUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGl2U2l6ZSBUaGlzIGNpcGhlcidzIElWIHNpemUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IF9FTkNfWEZPUk1fTU9ERSBBIGNvbnN0YW50IHJlcHJlc2VudGluZyBlbmNyeXB0aW9uIG1vZGUuXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX0RFQ19YRk9STV9NT0RFIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGRlY3J5cHRpb24gbW9kZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENpcGhlciA9IENfbGliLkNpcGhlciA9IEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gaXYgVGhlIElWIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCgpLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyB0aGlzIGNpcGhlciBpbiBlbmNyeXB0aW9uIG1vZGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlcn0gQSBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXIgPSBDcnlwdG9KUy5hbGdvLkFFUy5jcmVhdGVFbmNyeXB0b3Ioa2V5V29yZEFycmF5LCB7IGl2OiBpdldvcmRBcnJheSB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjcmVhdGVFbmNyeXB0b3I6IGZ1bmN0aW9uIChrZXksIGNmZykge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fRU5DX1hGT1JNX01PREUsIGtleSwgY2ZnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyB0aGlzIGNpcGhlciBpbiBkZWNyeXB0aW9uIG1vZGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlcn0gQSBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXIgPSBDcnlwdG9KUy5hbGdvLkFFUy5jcmVhdGVEZWNyeXB0b3Ioa2V5V29yZEFycmF5LCB7IGl2OiBpdldvcmRBcnJheSB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjcmVhdGVEZWNyeXB0b3I6IGZ1bmN0aW9uIChrZXksIGNmZykge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fREVDX1hGT1JNX01PREUsIGtleSwgY2ZnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGNpcGhlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4Zm9ybU1vZGUgRWl0aGVyIHRoZSBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24gdHJhbnNvcm1hdGlvbiBtb2RlIGNvbnN0YW50LlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVyID0gQ3J5cHRvSlMuYWxnby5BRVMuY3JlYXRlKENyeXB0b0pTLmFsZ28uQUVTLl9FTkNfWEZPUk1fTU9ERSwga2V5V29yZEFycmF5LCB7IGl2OiBpdldvcmRBcnJheSB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAoeGZvcm1Nb2RlLCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBTdG9yZSB0cmFuc2Zvcm0gbW9kZSBhbmQga2V5XG5cdCAgICAgICAgICAgIHRoaXMuX3hmb3JtTW9kZSA9IHhmb3JtTW9kZTtcblx0ICAgICAgICAgICAgdGhpcy5fa2V5ID0ga2V5O1xuXG5cdCAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIGNpcGhlciB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgY2lwaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gUmVzZXQgZGF0YSBidWZmZXJcblx0ICAgICAgICAgICAgQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5yZXNldC5jYWxsKHRoaXMpO1xuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtY2lwaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHRoaXMuX2RvUmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWRkcyBkYXRhIHRvIGJlIGVuY3J5cHRlZCBvciBkZWNyeXB0ZWQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGRhdGFVcGRhdGUgVGhlIGRhdGEgdG8gZW5jcnlwdCBvciBkZWNyeXB0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGF0YSBhZnRlciBwcm9jZXNzaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLnByb2Nlc3MoJ2RhdGEnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5wcm9jZXNzKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gKGRhdGFVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gQXBwZW5kXG5cdCAgICAgICAgICAgIHRoaXMuX2FwcGVuZChkYXRhVXBkYXRlKTtcblxuXHQgICAgICAgICAgICAvLyBQcm9jZXNzIGF2YWlsYWJsZSBibG9ja3Ncblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3MoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRmluYWxpemVzIHRoZSBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24gcHJvY2Vzcy5cblx0ICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIGZpbmFsaXplIG9wZXJhdGlvbiBpcyBlZmZlY3RpdmVseSBhIGRlc3RydWN0aXZlLCByZWFkLW9uY2Ugb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBkYXRhVXBkYXRlIFRoZSBmaW5hbCBkYXRhIHRvIGVuY3J5cHQgb3IgZGVjcnlwdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRhdGEgYWZ0ZXIgZmluYWwgcHJvY2Vzc2luZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5maW5hbGl6ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLmZpbmFsaXplKCdkYXRhJyk7XG5cdCAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIuZmluYWxpemUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKGRhdGFVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gRmluYWwgZGF0YSB1cGRhdGVcblx0ICAgICAgICAgICAgaWYgKGRhdGFVcGRhdGUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZChkYXRhVXBkYXRlKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtY2lwaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHZhciBmaW5hbFByb2Nlc3NlZERhdGEgPSB0aGlzLl9kb0ZpbmFsaXplKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZpbmFsUHJvY2Vzc2VkRGF0YTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAga2V5U2l6ZTogMTI4LzMyLFxuXG5cdCAgICAgICAgaXZTaXplOiAxMjgvMzIsXG5cblx0ICAgICAgICBfRU5DX1hGT1JNX01PREU6IDEsXG5cblx0ICAgICAgICBfREVDX1hGT1JNX01PREU6IDIsXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHNob3J0Y3V0IGZ1bmN0aW9ucyB0byBhIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgdG8gY3JlYXRlIGEgaGVscGVyIGZvci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IHdpdGggZW5jcnlwdCBhbmQgZGVjcnlwdCBzaG9ydGN1dCBmdW5jdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBBRVMgPSBDcnlwdG9KUy5saWIuQ2lwaGVyLl9jcmVhdGVIZWxwZXIoQ3J5cHRvSlMuYWxnby5BRVMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9jcmVhdGVIZWxwZXI6IChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIHNlbGVjdENpcGhlclN0cmF0ZWd5KGtleSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFzc3dvcmRCYXNlZENpcGhlcjtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlcmlhbGl6YWJsZUNpcGhlcjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoY2lwaGVyKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uIChtZXNzYWdlLCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KS5lbmNyeXB0KGNpcGhlciwgbWVzc2FnZSwga2V5LCBjZmcpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgICAgICAgICBkZWNyeXB0OiBmdW5jdGlvbiAoY2lwaGVydGV4dCwga2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdENpcGhlclN0cmF0ZWd5KGtleSkuZGVjcnlwdChjaXBoZXIsIGNpcGhlcnRleHQsIGtleSwgY2ZnKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH0oKSlcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJhc2Ugc3RyZWFtIGNpcGhlciB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgY2lwaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiAxICgzMiBiaXRzKVxuXHQgICAgICovXG5cdCAgICB2YXIgU3RyZWFtQ2lwaGVyID0gQ19saWIuU3RyZWFtQ2lwaGVyID0gQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gUHJvY2VzcyBwYXJ0aWFsIGJsb2Nrc1xuXHQgICAgICAgICAgICB2YXIgZmluYWxQcm9jZXNzZWRCbG9ja3MgPSB0aGlzLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZpbmFsUHJvY2Vzc2VkQmxvY2tzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDFcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIE1vZGUgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19tb2RlID0gQy5tb2RlID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBibG9jayBjaXBoZXIgbW9kZSB0ZW1wbGF0ZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEJsb2NrQ2lwaGVyTW9kZSA9IENfbGliLkJsb2NrQ2lwaGVyTW9kZSA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHRoaXMgbW9kZSBmb3IgZW5jcnlwdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgQSBibG9jayBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gaXYgVGhlIElWIHdvcmRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgbW9kZSA9IENyeXB0b0pTLm1vZGUuQ0JDLmNyZWF0ZUVuY3J5cHRvcihjaXBoZXIsIGl2LndvcmRzKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjcmVhdGVFbmNyeXB0b3I6IGZ1bmN0aW9uIChjaXBoZXIsIGl2KSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLkVuY3J5cHRvci5jcmVhdGUoY2lwaGVyLCBpdik7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgdGhpcyBtb2RlIGZvciBkZWNyeXB0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBBIGJsb2NrIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBpdiBUaGUgSVYgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBtb2RlID0gQ3J5cHRvSlMubW9kZS5DQkMuY3JlYXRlRGVjcnlwdG9yKGNpcGhlciwgaXYud29yZHMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZURlY3J5cHRvcjogZnVuY3Rpb24gKGNpcGhlciwgaXYpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGVjcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIG1vZGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIEEgYmxvY2sgY2lwaGVyIGluc3RhbmNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGl2IFRoZSBJViB3b3Jkcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG1vZGUgPSBDcnlwdG9KUy5tb2RlLkNCQy5FbmNyeXB0b3IuY3JlYXRlKGNpcGhlciwgaXYud29yZHMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjaXBoZXIsIGl2KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2NpcGhlciA9IGNpcGhlcjtcblx0ICAgICAgICAgICAgdGhpcy5faXYgPSBpdjtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENCQyA9IENfbW9kZS5DQkMgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEFic3RyYWN0IGJhc2UgQ0JDIG1vZGUuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdmFyIENCQyA9IEJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTtcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENCQyBlbmNyeXB0b3IuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgQ0JDLkVuY3J5cHRvciA9IENCQy5leHRlbmQoe1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogUHJvY2Vzc2VzIHRoZSBkYXRhIGJsb2NrIGF0IG9mZnNldC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgVGhlIGRhdGEgd29yZHMgdG8gb3BlcmF0ZSBvbi5cblx0ICAgICAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCBUaGUgb2Zmc2V0IHdoZXJlIHRoZSBibG9jayBzdGFydHMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICBtb2RlLnByb2Nlc3NCbG9jayhkYXRhLndvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICB2YXIgY2lwaGVyID0gdGhpcy5fY2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFhPUiBhbmQgZW5jcnlwdFxuXHQgICAgICAgICAgICAgICAgeG9yQmxvY2suY2FsbCh0aGlzLCB3b3Jkcywgb2Zmc2V0LCBibG9ja1NpemUpO1xuXHQgICAgICAgICAgICAgICAgY2lwaGVyLmVuY3J5cHRCbG9jayh3b3Jkcywgb2Zmc2V0KTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBibG9jayB0byB1c2Ugd2l0aCBuZXh0IGJsb2NrXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9wcmV2QmxvY2sgPSB3b3Jkcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGJsb2NrU2l6ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENCQyBkZWNyeXB0b3IuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgQ0JDLkRlY3J5cHRvciA9IENCQy5leHRlbmQoe1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogUHJvY2Vzc2VzIHRoZSBkYXRhIGJsb2NrIGF0IG9mZnNldC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgVGhlIGRhdGEgd29yZHMgdG8gb3BlcmF0ZSBvbi5cblx0ICAgICAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCBUaGUgb2Zmc2V0IHdoZXJlIHRoZSBibG9jayBzdGFydHMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICBtb2RlLnByb2Nlc3NCbG9jayhkYXRhLndvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICB2YXIgY2lwaGVyID0gdGhpcy5fY2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgYmxvY2sgdG8gdXNlIHdpdGggbmV4dCBibG9ja1xuXHQgICAgICAgICAgICAgICAgdmFyIHRoaXNCbG9jayA9IHdvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmxvY2tTaXplKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gRGVjcnlwdCBhbmQgWE9SXG5cdCAgICAgICAgICAgICAgICBjaXBoZXIuZGVjcnlwdEJsb2NrKHdvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICAgICAgeG9yQmxvY2suY2FsbCh0aGlzLCB3b3Jkcywgb2Zmc2V0LCBibG9ja1NpemUpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBUaGlzIGJsb2NrIGJlY29tZXMgdGhlIHByZXZpb3VzIGJsb2NrXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9wcmV2QmxvY2sgPSB0aGlzQmxvY2s7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIGZ1bmN0aW9uIHhvckJsb2NrKHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSkge1xuXHQgICAgICAgICAgICB2YXIgYmxvY2s7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGl2ID0gdGhpcy5faXY7XG5cblx0ICAgICAgICAgICAgLy8gQ2hvb3NlIG1peGluZyBibG9ja1xuXHQgICAgICAgICAgICBpZiAoaXYpIHtcblx0ICAgICAgICAgICAgICAgIGJsb2NrID0gaXY7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBJViBmb3Igc3Vic2VxdWVudCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIHRoaXMuX2l2ID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYmxvY2sgPSB0aGlzLl9wcmV2QmxvY2s7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBYT1IgYmxvY2tzXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tTaXplOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzW29mZnNldCArIGldIF49IGJsb2NrW2ldO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIENCQztcblx0ICAgIH0oKSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogUGFkZGluZyBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX3BhZCA9IEMucGFkID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogUEtDUyAjNS83IHBhZGRpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBQa2NzNyA9IENfcGFkLlBrY3M3ID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFBhZHMgZGF0YSB1c2luZyB0aGUgYWxnb3JpdGhtIGRlZmluZWQgaW4gUEtDUyAjNS83LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGRhdGEgVGhlIGRhdGEgdG8gcGFkLlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG11bHRpcGxlIHRoYXQgdGhlIGRhdGEgc2hvdWxkIGJlIHBhZGRlZCB0by5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgQ3J5cHRvSlMucGFkLlBrY3M3LnBhZCh3b3JkQXJyYXksIDQpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhZDogZnVuY3Rpb24gKGRhdGEsIGJsb2NrU2l6ZSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplQnl0ZXMgPSBibG9ja1NpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIENvdW50IHBhZGRpbmcgYnl0ZXNcblx0ICAgICAgICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBibG9ja1NpemVCeXRlcyAtIGRhdGEuc2lnQnl0ZXMgJSBibG9ja1NpemVCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDcmVhdGUgcGFkZGluZyB3b3JkXG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nV29yZCA9IChuUGFkZGluZ0J5dGVzIDw8IDI0KSB8IChuUGFkZGluZ0J5dGVzIDw8IDE2KSB8IChuUGFkZGluZ0J5dGVzIDw8IDgpIHwgblBhZGRpbmdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDcmVhdGUgcGFkZGluZ1xuXHQgICAgICAgICAgICB2YXIgcGFkZGluZ1dvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgblBhZGRpbmdCeXRlczsgaSArPSA0KSB7XG5cdCAgICAgICAgICAgICAgICBwYWRkaW5nV29yZHMucHVzaChwYWRkaW5nV29yZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmcgPSBXb3JkQXJyYXkuY3JlYXRlKHBhZGRpbmdXb3JkcywgblBhZGRpbmdCeXRlcyk7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmdcblx0ICAgICAgICAgICAgZGF0YS5jb25jYXQocGFkZGluZyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFVucGFkcyBkYXRhIHRoYXQgaGFkIGJlZW4gcGFkZGVkIHVzaW5nIHRoZSBhbGdvcml0aG0gZGVmaW5lZCBpbiBQS0NTICM1LzcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gZGF0YSBUaGUgZGF0YSB0byB1bnBhZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgQ3J5cHRvSlMucGFkLlBrY3M3LnVucGFkKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdW5wYWQ6IGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICAgIC8vIEdldCBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBmcm9tIGxhc3QgYnl0ZVxuXHQgICAgICAgICAgICB2YXIgblBhZGRpbmdCeXRlcyA9IGRhdGEud29yZHNbKGRhdGEuc2lnQnl0ZXMgLSAxKSA+Pj4gMl0gJiAweGZmO1xuXG5cdCAgICAgICAgICAgIC8vIFJlbW92ZSBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgLT0gblBhZGRpbmdCeXRlcztcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJhc2UgYmxvY2sgY2lwaGVyIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgdGhpcyBjaXBoZXIgb3BlcmF0ZXMgb24uIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICovXG5cdCAgICB2YXIgQmxvY2tDaXBoZXIgPSBDX2xpYi5CbG9ja0NpcGhlciA9IENpcGhlci5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7TW9kZX0gbW9kZSBUaGUgYmxvY2sgbW9kZSB0byB1c2UuIERlZmF1bHQ6IENCQ1xuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7UGFkZGluZ30gcGFkZGluZyBUaGUgcGFkZGluZyBzdHJhdGVneSB0byB1c2UuIERlZmF1bHQ6IFBrY3M3XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBDaXBoZXIuY2ZnLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIG1vZGU6IENCQyxcblx0ICAgICAgICAgICAgcGFkZGluZzogUGtjczdcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBtb2RlQ3JlYXRvcjtcblxuXHQgICAgICAgICAgICAvLyBSZXNldCBjaXBoZXJcblx0ICAgICAgICAgICAgQ2lwaGVyLnJlc2V0LmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBjZmcgPSB0aGlzLmNmZztcblx0ICAgICAgICAgICAgdmFyIGl2ID0gY2ZnLml2O1xuXHQgICAgICAgICAgICB2YXIgbW9kZSA9IGNmZy5tb2RlO1xuXG5cdCAgICAgICAgICAgIC8vIFJlc2V0IGJsb2NrIG1vZGVcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9FTkNfWEZPUk1fTU9ERSkge1xuXHQgICAgICAgICAgICAgICAgbW9kZUNyZWF0b3IgPSBtb2RlLmNyZWF0ZUVuY3J5cHRvcjtcblx0ICAgICAgICAgICAgfSBlbHNlIC8qIGlmICh0aGlzLl94Zm9ybU1vZGUgPT0gdGhpcy5fREVDX1hGT1JNX01PREUpICovIHtcblx0ICAgICAgICAgICAgICAgIG1vZGVDcmVhdG9yID0gbW9kZS5jcmVhdGVEZWNyeXB0b3I7XG5cdCAgICAgICAgICAgICAgICAvLyBLZWVwIGF0IGxlYXN0IG9uZSBibG9jayBpbiB0aGUgYnVmZmVyIGZvciB1bnBhZGRpbmdcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21pbkJ1ZmZlclNpemUgPSAxO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYgKHRoaXMuX21vZGUgJiYgdGhpcy5fbW9kZS5fX2NyZWF0b3IgPT0gbW9kZUNyZWF0b3IpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21vZGUuaW5pdCh0aGlzLCBpdiAmJiBpdi53b3Jkcyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9tb2RlID0gbW9kZUNyZWF0b3IuY2FsbChtb2RlLCB0aGlzLCBpdiAmJiBpdi53b3Jkcyk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9tb2RlLl9fY3JlYXRvciA9IG1vZGVDcmVhdG9yO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbW9kZS5wcm9jZXNzQmxvY2sod29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBmaW5hbFByb2Nlc3NlZEJsb2NrcztcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgcGFkZGluZyA9IHRoaXMuY2ZnLnBhZGRpbmc7XG5cblx0ICAgICAgICAgICAgLy8gRmluYWxpemVcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9FTkNfWEZPUk1fTU9ERSkge1xuXHQgICAgICAgICAgICAgICAgLy8gUGFkIGRhdGFcblx0ICAgICAgICAgICAgICAgIHBhZGRpbmcucGFkKHRoaXMuX2RhdGEsIHRoaXMuYmxvY2tTaXplKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBmaW5hbCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpO1xuXHQgICAgICAgICAgICB9IGVsc2UgLyogaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9ERUNfWEZPUk1fTU9ERSkgKi8ge1xuXHQgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBmaW5hbCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBVbnBhZCBkYXRhXG5cdCAgICAgICAgICAgICAgICBwYWRkaW5nLnVucGFkKGZpbmFsUHJvY2Vzc2VkQmxvY2tzKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBmaW5hbFByb2Nlc3NlZEJsb2Nrcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgYmxvY2tTaXplOiAxMjgvMzJcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEEgY29sbGVjdGlvbiBvZiBjaXBoZXIgcGFyYW1ldGVycy5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gY2lwaGVydGV4dCBUaGUgcmF3IGNpcGhlcnRleHQuXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkgdG8gdGhpcyBjaXBoZXJ0ZXh0LlxuXHQgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IGl2IFRoZSBJViB1c2VkIGluIHRoZSBjaXBoZXJpbmcgb3BlcmF0aW9uLlxuXHQgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IHNhbHQgVGhlIHNhbHQgdXNlZCB3aXRoIGEga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge0NpcGhlcn0gYWxnb3JpdGhtIFRoZSBjaXBoZXIgYWxnb3JpdGhtLlxuXHQgICAgICogQHByb3BlcnR5IHtNb2RlfSBtb2RlIFRoZSBibG9jayBtb2RlIHVzZWQgaW4gdGhlIGNpcGhlcmluZyBvcGVyYXRpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge1BhZGRpbmd9IHBhZGRpbmcgVGhlIHBhZGRpbmcgc2NoZW1lIHVzZWQgaW4gdGhlIGNpcGhlcmluZyBvcGVyYXRpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBibG9jayBzaXplIG9mIHRoZSBjaXBoZXIuXG5cdCAgICAgKiBAcHJvcGVydHkge0Zvcm1hdH0gZm9ybWF0dGVyIFRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gY29udmVydCB0aGlzIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGEgc3RyaW5nLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ2lwaGVyUGFyYW1zID0gQ19saWIuQ2lwaGVyUGFyYW1zID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaXBoZXJQYXJhbXMgQW4gb2JqZWN0IHdpdGggYW55IG9mIHRoZSBwb3NzaWJsZSBjaXBoZXIgcGFyYW1ldGVycy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlclBhcmFtcyA9IENyeXB0b0pTLmxpYi5DaXBoZXJQYXJhbXMuY3JlYXRlKHtcblx0ICAgICAgICAgKiAgICAgICAgIGNpcGhlcnRleHQ6IGNpcGhlcnRleHRXb3JkQXJyYXksXG5cdCAgICAgICAgICogICAgICAgICBrZXk6IGtleVdvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIGl2OiBpdldvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIHNhbHQ6IHNhbHRXb3JkQXJyYXksXG5cdCAgICAgICAgICogICAgICAgICBhbGdvcml0aG06IENyeXB0b0pTLmFsZ28uQUVTLFxuXHQgICAgICAgICAqICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5DQkMsXG5cdCAgICAgICAgICogICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUEtDUzcsXG5cdCAgICAgICAgICogICAgICAgICBibG9ja1NpemU6IDQsXG5cdCAgICAgICAgICogICAgICAgICBmb3JtYXR0ZXI6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMXG5cdCAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjaXBoZXJQYXJhbXMpIHtcblx0ICAgICAgICAgICAgdGhpcy5taXhJbihjaXBoZXJQYXJhbXMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyB0aGlzIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtGb3JtYXR9IGZvcm1hdHRlciAoT3B0aW9uYWwpIFRoZSBmb3JtYXR0aW5nIHN0cmF0ZWd5IHRvIHVzZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN0cmluZ2lmaWVkIGNpcGhlciBwYXJhbXMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAdGhyb3dzIEVycm9yIElmIG5laXRoZXIgdGhlIGZvcm1hdHRlciBub3IgdGhlIGRlZmF1bHQgZm9ybWF0dGVyIGlzIHNldC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IGNpcGhlclBhcmFtcyArICcnO1xuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gY2lwaGVyUGFyYW1zLnRvU3RyaW5nKCk7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSBjaXBoZXJQYXJhbXMudG9TdHJpbmcoQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoZm9ybWF0dGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoZm9ybWF0dGVyIHx8IHRoaXMuZm9ybWF0dGVyKS5zdHJpbmdpZnkodGhpcyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogRm9ybWF0IG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfZm9ybWF0ID0gQy5mb3JtYXQgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBPcGVuU1NMIGZvcm1hdHRpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBPcGVuU1NMRm9ybWF0dGVyID0gQ19mb3JtYXQuT3BlblNTTCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGFuIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc30gY2lwaGVyUGFyYW1zIFRoZSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBvcGVuU1NMU3RyaW5nID0gQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wuc3RyaW5naWZ5KGNpcGhlclBhcmFtcyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAoY2lwaGVyUGFyYW1zKSB7XG5cdCAgICAgICAgICAgIHZhciB3b3JkQXJyYXk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gY2lwaGVyUGFyYW1zLmNpcGhlcnRleHQ7XG5cdCAgICAgICAgICAgIHZhciBzYWx0ID0gY2lwaGVyUGFyYW1zLnNhbHQ7XG5cblx0ICAgICAgICAgICAgLy8gRm9ybWF0XG5cdCAgICAgICAgICAgIGlmIChzYWx0KSB7XG5cdCAgICAgICAgICAgICAgICB3b3JkQXJyYXkgPSBXb3JkQXJyYXkuY3JlYXRlKFsweDUzNjE2Yzc0LCAweDY1NjQ1ZjVmXSkuY29uY2F0KHNhbHQpLmNvbmNhdChjaXBoZXJ0ZXh0KTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRBcnJheSA9IGNpcGhlcnRleHQ7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gd29yZEFycmF5LnRvU3RyaW5nKEJhc2U2NCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGFuIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcgdG8gYSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVuU1NMU3RyIFRoZSBPcGVuU1NMLWNvbXBhdGlibGUgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBUaGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJQYXJhbXMgPSBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTC5wYXJzZShvcGVuU1NMU3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKG9wZW5TU0xTdHIpIHtcblx0ICAgICAgICAgICAgdmFyIHNhbHQ7XG5cblx0ICAgICAgICAgICAgLy8gUGFyc2UgYmFzZTY0XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gQmFzZTY0LnBhcnNlKG9wZW5TU0xTdHIpO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0V29yZHMgPSBjaXBoZXJ0ZXh0LndvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFRlc3QgZm9yIHNhbHRcblx0ICAgICAgICAgICAgaWYgKGNpcGhlcnRleHRXb3Jkc1swXSA9PSAweDUzNjE2Yzc0ICYmIGNpcGhlcnRleHRXb3Jkc1sxXSA9PSAweDY1NjQ1ZjVmKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHNhbHRcblx0ICAgICAgICAgICAgICAgIHNhbHQgPSBXb3JkQXJyYXkuY3JlYXRlKGNpcGhlcnRleHRXb3Jkcy5zbGljZSgyLCA0KSk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzYWx0IGZyb20gY2lwaGVydGV4dFxuXHQgICAgICAgICAgICAgICAgY2lwaGVydGV4dFdvcmRzLnNwbGljZSgwLCA0KTtcblx0ICAgICAgICAgICAgICAgIGNpcGhlcnRleHQuc2lnQnl0ZXMgLT0gMTY7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7IGNpcGhlcnRleHQ6IGNpcGhlcnRleHQsIHNhbHQ6IHNhbHQgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBIGNpcGhlciB3cmFwcGVyIHRoYXQgcmV0dXJucyBjaXBoZXJ0ZXh0IGFzIGEgc2VyaWFsaXphYmxlIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICovXG5cdCAgICB2YXIgU2VyaWFsaXphYmxlQ2lwaGVyID0gQ19saWIuU2VyaWFsaXphYmxlQ2lwaGVyID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7Rm9ybWF0dGVyfSBmb3JtYXQgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gY29udmVydCBjaXBoZXIgcGFyYW0gb2JqZWN0cyB0byBhbmQgZnJvbSBhIHN0cmluZy4gRGVmYXVsdDogT3BlblNTTFxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQmFzZS5leHRlbmQoe1xuXHQgICAgICAgICAgICBmb3JtYXQ6IE9wZW5TU0xGb3JtYXR0ZXJcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEVuY3J5cHRzIGEgbWVzc2FnZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciBhbGdvcml0aG0gdG8gdXNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBlbmNyeXB0LlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwga2V5KTtcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsIGtleSwgeyBpdjogaXYgfSk7XG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCBrZXksIHsgaXY6IGl2LCBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXIsIG1lc3NhZ2UsIGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBFbmNyeXB0XG5cdCAgICAgICAgICAgIHZhciBlbmNyeXB0b3IgPSBjaXBoZXIuY3JlYXRlRW5jcnlwdG9yKGtleSwgY2ZnKTtcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBlbmNyeXB0b3IuZmluYWxpemUobWVzc2FnZSk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGNpcGhlckNmZyA9IGVuY3J5cHRvci5jZmc7XG5cblx0ICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gc2VyaWFsaXphYmxlIGNpcGhlciBwYXJhbXNcblx0ICAgICAgICAgICAgcmV0dXJuIENpcGhlclBhcmFtcy5jcmVhdGUoe1xuXHQgICAgICAgICAgICAgICAgY2lwaGVydGV4dDogY2lwaGVydGV4dCxcblx0ICAgICAgICAgICAgICAgIGtleToga2V5LFxuXHQgICAgICAgICAgICAgICAgaXY6IGNpcGhlckNmZy5pdixcblx0ICAgICAgICAgICAgICAgIGFsZ29yaXRobTogY2lwaGVyLFxuXHQgICAgICAgICAgICAgICAgbW9kZTogY2lwaGVyQ2ZnLm1vZGUsXG5cdCAgICAgICAgICAgICAgICBwYWRkaW5nOiBjaXBoZXJDZmcucGFkZGluZyxcblx0ICAgICAgICAgICAgICAgIGJsb2NrU2l6ZTogY2lwaGVyLmJsb2NrU2l6ZSxcblx0ICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogY2ZnLmZvcm1hdFxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRGVjcnlwdHMgc2VyaWFsaXplZCBjaXBoZXJ0ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN8c3RyaW5nfSBjaXBoZXJ0ZXh0IFRoZSBjaXBoZXJ0ZXh0IHRvIGRlY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGtleSBUaGUga2V5LlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBwbGFpbnRleHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBwbGFpbnRleHQgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmRlY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIGZvcm1hdHRlZENpcGhlcnRleHQsIGtleSwgeyBpdjogaXYsIGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICogICAgIHZhciBwbGFpbnRleHQgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmRlY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIGNpcGhlcnRleHRQYXJhbXMsIGtleSwgeyBpdjogaXYsIGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZGVjcnlwdDogZnVuY3Rpb24gKGNpcGhlciwgY2lwaGVydGV4dCwga2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIENpcGhlclBhcmFtc1xuXHQgICAgICAgICAgICBjaXBoZXJ0ZXh0ID0gdGhpcy5fcGFyc2UoY2lwaGVydGV4dCwgY2ZnLmZvcm1hdCk7XG5cblx0ICAgICAgICAgICAgLy8gRGVjcnlwdFxuXHQgICAgICAgICAgICB2YXIgcGxhaW50ZXh0ID0gY2lwaGVyLmNyZWF0ZURlY3J5cHRvcihrZXksIGNmZykuZmluYWxpemUoY2lwaGVydGV4dC5jaXBoZXJ0ZXh0KTtcblxuXHQgICAgICAgICAgICByZXR1cm4gcGxhaW50ZXh0O1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBzZXJpYWxpemVkIGNpcGhlcnRleHQgdG8gQ2lwaGVyUGFyYW1zLFxuXHQgICAgICAgICAqIGVsc2UgYXNzdW1lZCBDaXBoZXJQYXJhbXMgYWxyZWFkeSBhbmQgcmV0dXJucyBjaXBoZXJ0ZXh0IHVuY2hhbmdlZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfHN0cmluZ30gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dC5cblx0ICAgICAgICAgKiBAcGFyYW0ge0Zvcm1hdHRlcn0gZm9ybWF0IFRoZSBmb3JtYXR0aW5nIHN0cmF0ZWd5IHRvIHVzZSB0byBwYXJzZSBzZXJpYWxpemVkIGNpcGhlcnRleHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IFRoZSB1bnNlcmlhbGl6ZWQgY2lwaGVydGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLl9wYXJzZShjaXBoZXJ0ZXh0U3RyaW5nT3JQYXJhbXMsIGZvcm1hdCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX3BhcnNlOiBmdW5jdGlvbiAoY2lwaGVydGV4dCwgZm9ybWF0KSB7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY2lwaGVydGV4dCA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdC5wYXJzZShjaXBoZXJ0ZXh0LCB0aGlzKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBjaXBoZXJ0ZXh0O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogS2V5IGRlcml2YXRpb24gZnVuY3Rpb24gbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19rZGYgPSBDLmtkZiA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIE9wZW5TU0wga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uXG5cdCAgICAgKi9cblx0ICAgIHZhciBPcGVuU1NMS2RmID0gQ19rZGYuT3BlblNTTCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBEZXJpdmVzIGEga2V5IGFuZCBJViBmcm9tIGEgcGFzc3dvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGRlcml2ZSBmcm9tLlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrZXlTaXplIFRoZSBzaXplIGluIHdvcmRzIG9mIHRoZSBrZXkgdG8gZ2VuZXJhdGUuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGl2U2l6ZSBUaGUgc2l6ZSBpbiB3b3JkcyBvZiB0aGUgSVYgdG8gZ2VuZXJhdGUuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBzYWx0IChPcHRpb25hbCkgQSA2NC1iaXQgc2FsdCB0byB1c2UuIElmIG9taXR0ZWQsIGEgc2FsdCB3aWxsIGJlIGdlbmVyYXRlZCByYW5kb21seS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gQSBjaXBoZXIgcGFyYW1zIG9iamVjdCB3aXRoIHRoZSBrZXksIElWLCBhbmQgc2FsdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGRlcml2ZWRQYXJhbXMgPSBDcnlwdG9KUy5rZGYuT3BlblNTTC5leGVjdXRlKCdQYXNzd29yZCcsIDI1Ni8zMiwgMTI4LzMyKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGRlcml2ZWRQYXJhbXMgPSBDcnlwdG9KUy5rZGYuT3BlblNTTC5leGVjdXRlKCdQYXNzd29yZCcsIDI1Ni8zMiwgMTI4LzMyLCAnc2FsdHNhbHQnKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBleGVjdXRlOiBmdW5jdGlvbiAocGFzc3dvcmQsIGtleVNpemUsIGl2U2l6ZSwgc2FsdCwgaGFzaGVyKSB7XG5cdCAgICAgICAgICAgIC8vIEdlbmVyYXRlIHJhbmRvbSBzYWx0XG5cdCAgICAgICAgICAgIGlmICghc2FsdCkge1xuXHQgICAgICAgICAgICAgICAgc2FsdCA9IFdvcmRBcnJheS5yYW5kb20oNjQvOCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBEZXJpdmUga2V5IGFuZCBJVlxuXHQgICAgICAgICAgICBpZiAoIWhhc2hlcikge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtleSA9IEV2cEtERi5jcmVhdGUoeyBrZXlTaXplOiBrZXlTaXplICsgaXZTaXplIH0pLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtleSA9IEV2cEtERi5jcmVhdGUoeyBrZXlTaXplOiBrZXlTaXplICsgaXZTaXplLCBoYXNoZXI6IGhhc2hlciB9KS5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTtcblx0ICAgICAgICAgICAgfVxuXG5cblx0ICAgICAgICAgICAgLy8gU2VwYXJhdGUga2V5IGFuZCBJVlxuXHQgICAgICAgICAgICB2YXIgaXYgPSBXb3JkQXJyYXkuY3JlYXRlKGtleS53b3Jkcy5zbGljZShrZXlTaXplKSwgaXZTaXplICogNCk7XG5cdCAgICAgICAgICAgIGtleS5zaWdCeXRlcyA9IGtleVNpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIFJldHVybiBwYXJhbXNcblx0ICAgICAgICAgICAgcmV0dXJuIENpcGhlclBhcmFtcy5jcmVhdGUoeyBrZXk6IGtleSwgaXY6IGl2LCBzYWx0OiBzYWx0IH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQSBzZXJpYWxpemFibGUgY2lwaGVyIHdyYXBwZXIgdGhhdCBkZXJpdmVzIHRoZSBrZXkgZnJvbSBhIHBhc3N3b3JkLFxuXHQgICAgICogYW5kIHJldHVybnMgY2lwaGVydGV4dCBhcyBhIHNlcmlhbGl6YWJsZSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAqL1xuXHQgICAgdmFyIFBhc3N3b3JkQmFzZWRDaXBoZXIgPSBDX2xpYi5QYXNzd29yZEJhc2VkQ2lwaGVyID0gU2VyaWFsaXphYmxlQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtLREZ9IGtkZiBUaGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gdG8gdXNlIHRvIGdlbmVyYXRlIGEga2V5IGFuZCBJViBmcm9tIGEgcGFzc3dvcmQuIERlZmF1bHQ6IE9wZW5TU0xcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IFNlcmlhbGl6YWJsZUNpcGhlci5jZmcuZXh0ZW5kKHtcblx0ICAgICAgICAgICAga2RmOiBPcGVuU1NMS2RmXG5cdCAgICAgICAgfSksXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBFbmNyeXB0cyBhIG1lc3NhZ2UgdXNpbmcgYSBwYXNzd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciBhbGdvcml0aG0gdG8gdXNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBlbmNyeXB0LlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gQSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuUGFzc3dvcmRCYXNlZENpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCAncGFzc3dvcmQnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuUGFzc3dvcmRCYXNlZENpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCAncGFzc3dvcmQnLCB7IGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZW5jcnlwdDogZnVuY3Rpb24gKGNpcGhlciwgbWVzc2FnZSwgcGFzc3dvcmQsIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gRGVyaXZlIGtleSBhbmQgb3RoZXIgcGFyYW1zXG5cdCAgICAgICAgICAgIHZhciBkZXJpdmVkUGFyYW1zID0gY2ZnLmtkZi5leGVjdXRlKHBhc3N3b3JkLCBjaXBoZXIua2V5U2l6ZSwgY2lwaGVyLml2U2l6ZSwgY2ZnLnNhbHQsIGNmZy5oYXNoZXIpO1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBJViB0byBjb25maWdcblx0ICAgICAgICAgICAgY2ZnLml2ID0gZGVyaXZlZFBhcmFtcy5pdjtcblxuXHQgICAgICAgICAgICAvLyBFbmNyeXB0XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gU2VyaWFsaXphYmxlQ2lwaGVyLmVuY3J5cHQuY2FsbCh0aGlzLCBjaXBoZXIsIG1lc3NhZ2UsIGRlcml2ZWRQYXJhbXMua2V5LCBjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIE1peCBpbiBkZXJpdmVkIHBhcmFtc1xuXHQgICAgICAgICAgICBjaXBoZXJ0ZXh0Lm1peEluKGRlcml2ZWRQYXJhbXMpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjaXBoZXJ0ZXh0O1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBEZWNyeXB0cyBzZXJpYWxpemVkIGNpcGhlcnRleHQgdXNpbmcgYSBwYXNzd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciBhbGdvcml0aG0gdG8gdXNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfHN0cmluZ30gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dCB0byBkZWNyeXB0LlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHBsYWludGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmRlY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIGZvcm1hdHRlZENpcGhlcnRleHQsICdwYXNzd29yZCcsIHsgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmRlY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIGNpcGhlcnRleHRQYXJhbXMsICdwYXNzd29yZCcsIHsgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBkZWNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBjaXBoZXJ0ZXh0LCBwYXNzd29yZCwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBDaXBoZXJQYXJhbXNcblx0ICAgICAgICAgICAgY2lwaGVydGV4dCA9IHRoaXMuX3BhcnNlKGNpcGhlcnRleHQsIGNmZy5mb3JtYXQpO1xuXG5cdCAgICAgICAgICAgIC8vIERlcml2ZSBrZXkgYW5kIG90aGVyIHBhcmFtc1xuXHQgICAgICAgICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IGNmZy5rZGYuZXhlY3V0ZShwYXNzd29yZCwgY2lwaGVyLmtleVNpemUsIGNpcGhlci5pdlNpemUsIGNpcGhlcnRleHQuc2FsdCwgY2ZnLmhhc2hlcik7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIElWIHRvIGNvbmZpZ1xuXHQgICAgICAgICAgICBjZmcuaXYgPSBkZXJpdmVkUGFyYW1zLml2O1xuXG5cdCAgICAgICAgICAgIC8vIERlY3J5cHRcblx0ICAgICAgICAgICAgdmFyIHBsYWludGV4dCA9IFNlcmlhbGl6YWJsZUNpcGhlci5kZWNyeXB0LmNhbGwodGhpcywgY2lwaGVyLCBjaXBoZXJ0ZXh0LCBkZXJpdmVkUGFyYW1zLmtleSwgY2ZnKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gcGxhaW50ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9KCkpO1xuXG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeSgpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0cm9vdC5DcnlwdG9KUyA9IGZhY3RvcnkoKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG5cblx0LypnbG9iYWxzIHdpbmRvdywgZ2xvYmFsLCByZXF1aXJlKi9cblxuXHQvKipcblx0ICogQ3J5cHRvSlMgY29yZSBjb21wb25lbnRzLlxuXHQgKi9cblx0dmFyIENyeXB0b0pTID0gQ3J5cHRvSlMgfHwgKGZ1bmN0aW9uIChNYXRoLCB1bmRlZmluZWQpIHtcblxuXHQgICAgdmFyIGNyeXB0bztcblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBmcm9tIHdpbmRvdyAoQnJvd3Nlcilcblx0ICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gd2luZG93LmNyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBpbiB3ZWIgd29ya2VyIChCcm93c2VyKVxuXHQgICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IHNlbGYuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGZyb20gd29ya2VyXG5cdCAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gZ2xvYmFsVGhpcy5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSAoZXhwZXJpbWVudGFsIElFIDExKSBjcnlwdG8gZnJvbSB3aW5kb3cgKEJyb3dzZXIpXG5cdCAgICBpZiAoIWNyeXB0byAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubXNDcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSB3aW5kb3cubXNDcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gZnJvbSBnbG9iYWwgKE5vZGVKUylcblx0ICAgIGlmICghY3J5cHRvICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbC5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSBnbG9iYWwuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGltcG9ydCB2aWEgcmVxdWlyZSAoTm9kZUpTKVxuXHQgICAgaWYgKCFjcnlwdG8gJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblx0ICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cdCAgICB9XG5cblx0ICAgIC8qXG5cdCAgICAgKiBDcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcHNldWRvcmFuZG9tIG51bWJlciBnZW5lcmF0b3Jcblx0ICAgICAqXG5cdCAgICAgKiBBcyBNYXRoLnJhbmRvbSgpIGlzIGNyeXB0b2dyYXBoaWNhbGx5IG5vdCBzYWZlIHRvIHVzZVxuXHQgICAgICovXG5cdCAgICB2YXIgY3J5cHRvU2VjdXJlUmFuZG9tSW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmIChjcnlwdG8pIHtcblx0ICAgICAgICAgICAgLy8gVXNlIGdldFJhbmRvbVZhbHVlcyBtZXRob2QgKEJyb3dzZXIpXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkoMSkpWzBdO1xuXHQgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gVXNlIHJhbmRvbUJ5dGVzIG1ldGhvZCAoTm9kZUpTKVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0by5yYW5kb21CeXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKDQpLnJlYWRJbnQzMkxFKCk7XG5cdCAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdGl2ZSBjcnlwdG8gbW9kdWxlIGNvdWxkIG5vdCBiZSB1c2VkIHRvIGdldCBzZWN1cmUgcmFuZG9tIG51bWJlci4nKTtcblx0ICAgIH07XG5cblx0ICAgIC8qXG5cdCAgICAgKiBMb2NhbCBwb2x5ZmlsbCBvZiBPYmplY3QuY3JlYXRlXG5cblx0ICAgICAqL1xuXHQgICAgdmFyIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBmdW5jdGlvbiBGKCkge31cblxuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqKSB7XG5cdCAgICAgICAgICAgIHZhciBzdWJ0eXBlO1xuXG5cdCAgICAgICAgICAgIEYucHJvdG90eXBlID0gb2JqO1xuXG5cdCAgICAgICAgICAgIHN1YnR5cGUgPSBuZXcgRigpO1xuXG5cdCAgICAgICAgICAgIEYucHJvdG90eXBlID0gbnVsbDtcblxuXHQgICAgICAgICAgICByZXR1cm4gc3VidHlwZTtcblx0ICAgICAgICB9O1xuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDcnlwdG9KUyBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogTGlicmFyeSBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2xpYiA9IEMubGliID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogQmFzZSBvYmplY3QgZm9yIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZSA9IChmdW5jdGlvbiAoKSB7XG5cblxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdmVycmlkZXMgUHJvcGVydGllcyB0byBjb3B5IGludG8gdGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBNeVR5cGUgPSBDcnlwdG9KUy5saWIuQmFzZS5leHRlbmQoe1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgICAgIG1ldGhvZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIH1cblx0ICAgICAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgZXh0ZW5kOiBmdW5jdGlvbiAob3ZlcnJpZGVzKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTcGF3blxuXHQgICAgICAgICAgICAgICAgdmFyIHN1YnR5cGUgPSBjcmVhdGUodGhpcyk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEF1Z21lbnRcblx0ICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLm1peEluKG92ZXJyaWRlcyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBkZWZhdWx0IGluaXRpYWxpemVyXG5cdCAgICAgICAgICAgICAgICBpZiAoIXN1YnR5cGUuaGFzT3duUHJvcGVydHkoJ2luaXQnKSB8fCB0aGlzLmluaXQgPT09IHN1YnR5cGUuaW5pdCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZS4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemVyJ3MgcHJvdG90eXBlIGlzIHRoZSBzdWJ0eXBlIG9iamVjdFxuXHQgICAgICAgICAgICAgICAgc3VidHlwZS5pbml0LnByb3RvdHlwZSA9IHN1YnR5cGU7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBzdXBlcnR5cGVcblx0ICAgICAgICAgICAgICAgIHN1YnR5cGUuJHN1cGVyID0gdGhpcztcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGU7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEV4dGVuZHMgdGhpcyBvYmplY3QgYW5kIHJ1bnMgdGhlIGluaXQgbWV0aG9kLlxuXHQgICAgICAgICAgICAgKiBBcmd1bWVudHMgdG8gY3JlYXRlKCkgd2lsbCBiZSBwYXNzZWQgdG8gaW5pdCgpLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgaW5zdGFuY2UgPSBNeVR5cGUuY3JlYXRlKCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZXh0ZW5kKCk7XG5cdCAgICAgICAgICAgICAgICBpbnN0YW5jZS5pbml0LmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG5cdCAgICAgICAgICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCBzb21lIGxvZ2ljIHdoZW4geW91ciBvYmplY3RzIGFyZSBjcmVhdGVkLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIE15VHlwZSA9IENyeXB0b0pTLmxpYi5CYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgKiAgICAgICAgICAgICAvLyAuLi5cblx0ICAgICAgICAgICAgICogICAgICAgICB9XG5cdCAgICAgICAgICAgICAqICAgICB9KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQ29waWVzIHByb3BlcnRpZXMgaW50byB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gbWl4IGluLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgTXlUeXBlLm1peEluKHtcblx0ICAgICAgICAgICAgICogICAgICAgICBmaWVsZDogJ3ZhbHVlJ1xuXHQgICAgICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBtaXhJbjogZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBJRSB3b24ndCBjb3B5IHRvU3RyaW5nIHVzaW5nIHRoZSBsb29wIGFib3ZlXG5cdCAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgndG9TdHJpbmcnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9TdHJpbmcgPSBwcm9wZXJ0aWVzLnRvU3RyaW5nO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSBpbnN0YW5jZS5jbG9uZSgpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge0FycmF5fSB3b3JkcyBUaGUgYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNpZ0J5dGVzIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICovXG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5ID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgKE9wdGlvbmFsKSBBbiBhcnJheSBvZiAzMi1iaXQgd29yZHMuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpZ0J5dGVzIChPcHRpb25hbCkgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGUgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAwMTAyMDMsIDB4MDQwNTA2MDddKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwMDEwMjAzLCAweDA0MDUwNjA3XSwgNik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKHdvcmRzLCBzaWdCeXRlcykge1xuXHQgICAgICAgICAgICB3b3JkcyA9IHRoaXMud29yZHMgPSB3b3JkcyB8fCBbXTtcblxuXHQgICAgICAgICAgICBpZiAoc2lnQnl0ZXMgIT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gd29yZHMubGVuZ3RoICogNDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyB0aGlzIHdvcmQgYXJyYXkgdG8gYSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0VuY29kZXJ9IGVuY29kZXIgKE9wdGlvbmFsKSBUaGUgZW5jb2Rpbmcgc3RyYXRlZ3kgdG8gdXNlLiBEZWZhdWx0OiBDcnlwdG9KUy5lbmMuSGV4XG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmdpZmllZCB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5ICsgJyc7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSB3b3JkQXJyYXkudG9TdHJpbmcoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IHdvcmRBcnJheS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIChlbmNvZGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoZW5jb2RlciB8fCBIZXgpLnN0cmluZ2lmeSh0aGlzKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uY2F0ZW5hdGVzIGEgd29yZCBhcnJheSB0byB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5IHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB3b3JkQXJyYXkxLmNvbmNhdCh3b3JkQXJyYXkyKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjb25jYXQ6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB0aGlzV29yZHMgPSB0aGlzLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgdGhhdFdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgdGhpc1NpZ0J5dGVzID0gdGhpcy5zaWdCeXRlcztcblx0ICAgICAgICAgICAgdmFyIHRoYXRTaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDbGFtcCBleGNlc3MgYml0c1xuXHQgICAgICAgICAgICB0aGlzLmNsYW1wKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ29uY2F0XG5cdCAgICAgICAgICAgIGlmICh0aGlzU2lnQnl0ZXMgJSA0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBDb3B5IG9uZSBieXRlIGF0IGEgdGltZVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGF0U2lnQnl0ZXM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0aGF0Qnl0ZSA9ICh0aGF0V29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXNXb3Jkc1sodGhpc1NpZ0J5dGVzICsgaSkgPj4+IDJdIHw9IHRoYXRCeXRlIDw8ICgyNCAtICgodGhpc1NpZ0J5dGVzICsgaSkgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gQ29weSBvbmUgd29yZCBhdCBhIHRpbWVcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhhdFNpZ0J5dGVzOyBqICs9IDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzV29yZHNbKHRoaXNTaWdCeXRlcyArIGopID4+PiAyXSA9IHRoYXRXb3Jkc1tqID4+PiAyXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzICs9IHRoYXRTaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDaGFpbmFibGVcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlbW92ZXMgaW5zaWduaWZpY2FudCBiaXRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB3b3JkQXJyYXkuY2xhbXAoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbGFtcDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gdGhpcy53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gdGhpcy5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDbGFtcFxuXHQgICAgICAgICAgICB3b3Jkc1tzaWdCeXRlcyA+Pj4gMl0gJj0gMHhmZmZmZmZmZiA8PCAoMzIgLSAoc2lnQnl0ZXMgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICB3b3Jkcy5sZW5ndGggPSBNYXRoLmNlaWwoc2lnQnl0ZXMgLyA0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjbG9uZSA9IHdvcmRBcnJheS5jbG9uZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEJhc2UuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUud29yZHMgPSB0aGlzLndvcmRzLnNsaWNlKDApO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHdvcmQgYXJyYXkgZmlsbGVkIHdpdGggcmFuZG9tIGJ5dGVzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG5CeXRlcyBUaGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBnZW5lcmF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHJhbmRvbSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oMTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJhbmRvbTogZnVuY3Rpb24gKG5CeXRlcykge1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5CeXRlczsgaSArPSA0KSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkcy5wdXNoKGNyeXB0b1NlY3VyZVJhbmRvbUludCgpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQod29yZHMsIG5CeXRlcyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogRW5jb2RlciBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogSGV4IGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgSGV4ID0gQ19lbmMuSGV4ID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGV4IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhleFN0cmluZyA9IENyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciBoZXhDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBiaXRlID0gKHdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIGhleENoYXJzLnB1c2goKGJpdGUgPj4+IDQpLnRvU3RyaW5nKDE2KSk7XG5cdCAgICAgICAgICAgICAgICBoZXhDaGFycy5wdXNoKChiaXRlICYgMHgwZikudG9TdHJpbmcoMTYpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBoZXhDaGFycy5qb2luKCcnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBoZXggc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBoZXhTdHIgVGhlIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkhleC5wYXJzZShoZXhTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoaGV4U3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBoZXhTdHJMZW5ndGggPSBoZXhTdHIubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGV4U3RyTGVuZ3RoOyBpICs9IDIpIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDNdIHw9IHBhcnNlSW50KGhleFN0ci5zdWJzdHIoaSwgMiksIDE2KSA8PCAoMjQgLSAoaSAlIDgpICogNCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBoZXhTdHJMZW5ndGggLyAyKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIExhdGluMSBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIExhdGluMSA9IENfZW5jLkxhdGluMSA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBMYXRpbjEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIExhdGluMSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBsYXRpbjFTdHJpbmcgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgbGF0aW4xQ2hhcnMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYml0ZSA9ICh3b3Jkc1tpID4+PiAyXSA+Pj4gKDI0IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICBsYXRpbjFDaGFycy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYml0ZSkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGxhdGluMUNoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIExhdGluMSBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGxhdGluMVN0ciBUaGUgTGF0aW4xIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnBhcnNlKGxhdGluMVN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChsYXRpbjFTdHIpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGxhdGluMVN0ckxlbmd0aCA9IGxhdGluMVN0ci5sZW5ndGg7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXRpbjFTdHJMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbaSA+Pj4gMl0gfD0gKGxhdGluMVN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZikgPDwgKDI0IC0gKGkgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgbGF0aW4xU3RyTGVuZ3RoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFVURi04IGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgVXRmOCA9IENfZW5jLlV0ZjggPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgVVRGLTggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHV0ZjhTdHJpbmcgPSBDcnlwdG9KUy5lbmMuVXRmOC5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKExhdGluMS5zdHJpbmdpZnkod29yZEFycmF5KSkpO1xuXHQgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbGZvcm1lZCBVVEYtOCBkYXRhJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBVVEYtOCBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHV0ZjhTdHIgVGhlIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh1dGY4U3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHV0ZjhTdHIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIExhdGluMS5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodXRmOFN0cikpKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJ1ZmZlcmVkIGJsb2NrIGFsZ29yaXRobSB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBUaGUgcHJvcGVydHkgYmxvY2tTaXplIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBjb25jcmV0ZSBzdWJ0eXBlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBfbWluQnVmZmVyU2l6ZSBUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHNob3VsZCBiZSBrZXB0IHVucHJvY2Vzc2VkIGluIHRoZSBidWZmZXIuIERlZmF1bHQ6IDBcblx0ICAgICAqL1xuXHQgICAgdmFyIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBDX2xpYi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIGJsb2NrIGFsZ29yaXRobSdzIGRhdGEgYnVmZmVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5fZGF0YSA9IG5ldyBXb3JkQXJyYXkuaW5pdCgpO1xuXHQgICAgICAgICAgICB0aGlzLl9uRGF0YUJ5dGVzID0gMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWRkcyBuZXcgZGF0YSB0byB0aGlzIGJsb2NrIGFsZ29yaXRobSdzIGJ1ZmZlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBhcHBlbmQuIFN0cmluZ3MgYXJlIGNvbnZlcnRlZCB0byBhIFdvcmRBcnJheSB1c2luZyBVVEYtOC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fYXBwZW5kKCdkYXRhJyk7XG5cdCAgICAgICAgICogICAgIGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX2FwcGVuZCh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9hcHBlbmQ6IGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIFdvcmRBcnJheSwgZWxzZSBhc3N1bWUgV29yZEFycmF5IGFscmVhZHlcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICBkYXRhID0gVXRmOC5wYXJzZShkYXRhKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIEFwcGVuZFxuXHQgICAgICAgICAgICB0aGlzLl9kYXRhLmNvbmNhdChkYXRhKTtcblx0ICAgICAgICAgICAgdGhpcy5fbkRhdGFCeXRlcyArPSBkYXRhLnNpZ0J5dGVzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBQcm9jZXNzZXMgYXZhaWxhYmxlIGRhdGEgYmxvY2tzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBfZG9Qcm9jZXNzQmxvY2sob2Zmc2V0KSwgd2hpY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIGNvbmNyZXRlIHN1YnR5cGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRvRmx1c2ggV2hldGhlciBhbGwgYmxvY2tzIGFuZCBwYXJ0aWFsIGJsb2NrcyBzaG91bGQgYmUgcHJvY2Vzc2VkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcHJvY2Vzc2VkIGRhdGEuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBwcm9jZXNzZWREYXRhID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fcHJvY2VzcygpO1xuXHQgICAgICAgICAqICAgICB2YXIgcHJvY2Vzc2VkRGF0YSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX3Byb2Nlc3MoISEnZmx1c2gnKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfcHJvY2VzczogZnVuY3Rpb24gKGRvRmx1c2gpIHtcblx0ICAgICAgICAgICAgdmFyIHByb2Nlc3NlZFdvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cdCAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgZGF0YVNpZ0J5dGVzID0gZGF0YS5zaWdCeXRlcztcblx0ICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IHRoaXMuYmxvY2tTaXplO1xuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplQnl0ZXMgPSBibG9ja1NpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIENvdW50IGJsb2NrcyByZWFkeVxuXHQgICAgICAgICAgICB2YXIgbkJsb2Nrc1JlYWR5ID0gZGF0YVNpZ0J5dGVzIC8gYmxvY2tTaXplQnl0ZXM7XG5cdCAgICAgICAgICAgIGlmIChkb0ZsdXNoKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBSb3VuZCB1cCB0byBpbmNsdWRlIHBhcnRpYWwgYmxvY2tzXG5cdCAgICAgICAgICAgICAgICBuQmxvY2tzUmVhZHkgPSBNYXRoLmNlaWwobkJsb2Nrc1JlYWR5KTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIFJvdW5kIGRvd24gdG8gaW5jbHVkZSBvbmx5IGZ1bGwgYmxvY2tzLFxuXHQgICAgICAgICAgICAgICAgLy8gbGVzcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IG11c3QgcmVtYWluIGluIHRoZSBidWZmZXJcblx0ICAgICAgICAgICAgICAgIG5CbG9ja3NSZWFkeSA9IE1hdGgubWF4KChuQmxvY2tzUmVhZHkgfCAwKSAtIHRoaXMuX21pbkJ1ZmZlclNpemUsIDApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgd29yZHMgcmVhZHlcblx0ICAgICAgICAgICAgdmFyIG5Xb3Jkc1JlYWR5ID0gbkJsb2Nrc1JlYWR5ICogYmxvY2tTaXplO1xuXG5cdCAgICAgICAgICAgIC8vIENvdW50IGJ5dGVzIHJlYWR5XG5cdCAgICAgICAgICAgIHZhciBuQnl0ZXNSZWFkeSA9IE1hdGgubWluKG5Xb3Jkc1JlYWR5ICogNCwgZGF0YVNpZ0J5dGVzKTtcblxuXHQgICAgICAgICAgICAvLyBQcm9jZXNzIGJsb2Nrc1xuXHQgICAgICAgICAgICBpZiAobldvcmRzUmVhZHkpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IG5Xb3Jkc1JlYWR5OyBvZmZzZXQgKz0gYmxvY2tTaXplKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1hbGdvcml0aG0gbG9naWNcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb1Byb2Nlc3NCbG9jayhkYXRhV29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBwcm9jZXNzZWQgd29yZHNcblx0ICAgICAgICAgICAgICAgIHByb2Nlc3NlZFdvcmRzID0gZGF0YVdvcmRzLnNwbGljZSgwLCBuV29yZHNSZWFkeSk7XG5cdCAgICAgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzIC09IG5CeXRlc1JlYWR5O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIHByb2Nlc3NlZCB3b3Jkc1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHByb2Nlc3NlZFdvcmRzLCBuQnl0ZXNSZWFkeSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjbG9uZSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uY2xvbmUoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBCYXNlLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9kYXRhID0gdGhpcy5fZGF0YS5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX21pbkJ1ZmZlclNpemU6IDBcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGhhc2hlciB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgaGFzaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiAxNiAoNTEyIGJpdHMpXG5cdCAgICAgKi9cblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXIgPSBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQmFzZS5leHRlbmQoKSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBoYXNoZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgaGFzaCBjb21wdXRhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2hlciA9IENyeXB0b0pTLmFsZ28uU0hBMjU2LmNyZWF0ZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIHRoaXMuY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgaGFzaGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBSZXNldCBkYXRhIGJ1ZmZlclxuXHQgICAgICAgICAgICBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0LmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1oYXNoZXIgbG9naWNcblx0ICAgICAgICAgICAgdGhpcy5fZG9SZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBVcGRhdGVzIHRoaXMgaGFzaGVyIHdpdGggYSBtZXNzYWdlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIFRoZSBtZXNzYWdlIHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0hhc2hlcn0gVGhpcyBoYXNoZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhhc2hlci51cGRhdGUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgaGFzaGVyLnVwZGF0ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gQXBwZW5kXG5cdCAgICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTtcblxuXHQgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGhhc2hcblx0ICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG5cdCAgICAgICAgICAgIC8vIENoYWluYWJsZVxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRmluYWxpemVzIHRoZSBoYXNoIGNvbXB1dGF0aW9uLlxuXHQgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgKE9wdGlvbmFsKSBBIGZpbmFsIG1lc3NhZ2UgdXBkYXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gRmluYWwgbWVzc2FnZSB1cGRhdGVcblx0ICAgICAgICAgICAgaWYgKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtaGFzaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHZhciBoYXNoID0gdGhpcy5fZG9GaW5hbGl6ZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBoYXNoO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDUxMi8zMixcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBzaG9ydGN1dCBmdW5jdGlvbiB0byBhIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoZXIgdG8gY3JlYXRlIGEgaGVscGVyIGZvci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgc2hvcnRjdXQgZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBTSEEyNTYgPSBDcnlwdG9KUy5saWIuSGFzaGVyLl9jcmVhdGVIZWxwZXIoQ3J5cHRvSlMuYWxnby5TSEEyNTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9jcmVhdGVIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlLCBjZmcpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaGFzaGVyLmluaXQoY2ZnKS5maW5hbGl6ZShtZXNzYWdlKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2hlciB0byB1c2UgaW4gdGhpcyBITUFDIGhlbHBlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgc2hvcnRjdXQgZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBIbWFjU0hBMjU2ID0gQ3J5cHRvSlMubGliLkhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihDcnlwdG9KUy5hbGdvLlNIQTI1Nik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2NyZWF0ZUhtYWNIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlLCBrZXkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ19hbGdvLkhNQUMuaW5pdChoYXNoZXIsIGtleSkuZmluYWxpemUobWVzc2FnZSk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWxnb3JpdGhtIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbyA9IHt9O1xuXG5cdCAgICByZXR1cm4gQztcblx0fShNYXRoKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlM7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYztcblxuXHQgICAgLyoqXG5cdCAgICAgKiBCYXNlNjQgZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBCYXNlNjQgPSBDX2VuYy5CYXNlNjQgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgQmFzZTY0IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBCYXNlNjQgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgYmFzZTY0U3RyaW5nID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IHdvcmRBcnJheS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzO1xuXHQgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwO1xuXG5cdCAgICAgICAgICAgIC8vIENsYW1wIGV4Y2VzcyBiaXRzXG5cdCAgICAgICAgICAgIHdvcmRBcnJheS5jbGFtcCgpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIGJhc2U2NENoYXJzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2lnQnl0ZXM7IGkgKz0gMykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGJ5dGUxID0gKHdvcmRzW2kgPj4+IDJdICAgICAgID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICAgICAgICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIHZhciBieXRlMiA9ICh3b3Jkc1soaSArIDEpID4+PiAyXSA+Pj4gKDI0IC0gKChpICsgMSkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICB2YXIgYnl0ZTMgPSAod29yZHNbKGkgKyAyKSA+Pj4gMl0gPj4+ICgyNCAtICgoaSArIDIpICUgNCkgKiA4KSkgJiAweGZmO1xuXG5cdCAgICAgICAgICAgICAgICB2YXIgdHJpcGxldCA9IChieXRlMSA8PCAxNikgfCAoYnl0ZTIgPDwgOCkgfCBieXRlMztcblxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IChqIDwgNCkgJiYgKGkgKyBqICogMC43NSA8IHNpZ0J5dGVzKTsgaisrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYmFzZTY0Q2hhcnMucHVzaChtYXAuY2hhckF0KCh0cmlwbGV0ID4+PiAoNiAqICgzIC0gaikpKSAmIDB4M2YpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nQ2hhciA9IG1hcC5jaGFyQXQoNjQpO1xuXHQgICAgICAgICAgICBpZiAocGFkZGluZ0NoYXIpIHtcblx0ICAgICAgICAgICAgICAgIHdoaWxlIChiYXNlNjRDaGFycy5sZW5ndGggJSA0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYmFzZTY0Q2hhcnMucHVzaChwYWRkaW5nQ2hhcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gYmFzZTY0Q2hhcnMuam9pbignJyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgQmFzZTY0IHN0cmluZyB0byBhIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0U3RyIFRoZSBCYXNlNjQgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2UoYmFzZTY0U3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGJhc2U2NFN0cikge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGJhc2U2NFN0ckxlbmd0aCA9IGJhc2U2NFN0ci5sZW5ndGg7XG5cdCAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cdCAgICAgICAgICAgIHZhciByZXZlcnNlTWFwID0gdGhpcy5fcmV2ZXJzZU1hcDtcblxuXHQgICAgICAgICAgICBpZiAoIXJldmVyc2VNYXApIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXZlcnNlTWFwID0gdGhpcy5fcmV2ZXJzZU1hcCA9IFtdO1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbWFwLmxlbmd0aDsgaisrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VNYXBbbWFwLmNoYXJDb2RlQXQoaildID0gajtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBJZ25vcmUgcGFkZGluZ1xuXHQgICAgICAgICAgICB2YXIgcGFkZGluZ0NoYXIgPSBtYXAuY2hhckF0KDY0KTtcblx0ICAgICAgICAgICAgaWYgKHBhZGRpbmdDaGFyKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcGFkZGluZ0luZGV4ID0gYmFzZTY0U3RyLmluZGV4T2YocGFkZGluZ0NoYXIpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHBhZGRpbmdJbmRleCAhPT0gLTEpIHtcblx0ICAgICAgICAgICAgICAgICAgICBiYXNlNjRTdHJMZW5ndGggPSBwYWRkaW5nSW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHJldHVybiBwYXJzZUxvb3AoYmFzZTY0U3RyLCBiYXNlNjRTdHJMZW5ndGgsIHJldmVyc2VNYXApO1xuXG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9tYXA6ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSdcblx0ICAgIH07XG5cblx0ICAgIGZ1bmN0aW9uIHBhcnNlTG9vcChiYXNlNjRTdHIsIGJhc2U2NFN0ckxlbmd0aCwgcmV2ZXJzZU1hcCkge1xuXHQgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgdmFyIG5CeXRlcyA9IDA7XG5cdCAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZTY0U3RyTGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgIGlmIChpICUgNCkge1xuXHQgICAgICAgICAgICAgIHZhciBiaXRzMSA9IHJldmVyc2VNYXBbYmFzZTY0U3RyLmNoYXJDb2RlQXQoaSAtIDEpXSA8PCAoKGkgJSA0KSAqIDIpO1xuXHQgICAgICAgICAgICAgIHZhciBiaXRzMiA9IHJldmVyc2VNYXBbYmFzZTY0U3RyLmNoYXJDb2RlQXQoaSldID4+PiAoNiAtIChpICUgNCkgKiAyKTtcblx0ICAgICAgICAgICAgICB2YXIgYml0c0NvbWJpbmVkID0gYml0czEgfCBiaXRzMjtcblx0ICAgICAgICAgICAgICB3b3Jkc1tuQnl0ZXMgPj4+IDJdIHw9IGJpdHNDb21iaW5lZCA8PCAoMjQgLSAobkJ5dGVzICUgNCkgKiA4KTtcblx0ICAgICAgICAgICAgICBuQnl0ZXMrKztcblx0ICAgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gV29yZEFycmF5LmNyZWF0ZSh3b3JkcywgbkJ5dGVzKTtcblx0ICAgIH1cblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5lbmMuQmFzZTY0O1xuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHRyZXR1cm4gQ3J5cHRvSlMuZW5jLlV0Zjg7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vc2hhMVwiKSwgcmVxdWlyZShcIi4vaG1hY1wiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9zaGExXCIsIFwiLi9obWFjXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblx0ICAgIHZhciBNRDUgPSBDX2FsZ28uTUQ1O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFRoaXMga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gaXMgbWVhbnQgdG8gY29uZm9ybSB3aXRoIEVWUF9CeXRlc1RvS2V5LlxuXHQgICAgICogd3d3Lm9wZW5zc2wub3JnL2RvY3MvY3J5cHRvL0VWUF9CeXRlc1RvS2V5Lmh0bWxcblx0ICAgICAqL1xuXHQgICAgdmFyIEV2cEtERiA9IENfYWxnby5FdnBLREYgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGtleVNpemUgVGhlIGtleSBzaXplIGluIHdvcmRzIHRvIGdlbmVyYXRlLiBEZWZhdWx0OiA0ICgxMjggYml0cylcblx0ICAgICAgICAgKiBAcHJvcGVydHkge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoIGFsZ29yaXRobSB0byB1c2UuIERlZmF1bHQ6IE1ENVxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpdGVyYXRpb25zIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtLiBEZWZhdWx0OiAxXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIGtleVNpemU6IDEyOC8zMixcblx0ICAgICAgICAgICAgaGFzaGVyOiBNRDUsXG5cdCAgICAgICAgICAgIGl0ZXJhdGlvbnM6IDFcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIGRlcml2YXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLkV2cEtERi5jcmVhdGUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IDggfSk7XG5cdCAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLkV2cEtERi5jcmVhdGUoeyBrZXlTaXplOiA4LCBpdGVyYXRpb25zOiAxMDAwIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjZmcpIHtcblx0ICAgICAgICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRGVyaXZlcyBhIGtleSBmcm9tIGEgcGFzc3dvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgQSBzYWx0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGVyaXZlZCBrZXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBrZXkgPSBrZGYuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY29tcHV0ZTogZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0KSB7XG5cdCAgICAgICAgICAgIHZhciBibG9jaztcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgY2ZnID0gdGhpcy5jZmc7XG5cblx0ICAgICAgICAgICAgLy8gSW5pdCBoYXNoZXJcblx0ICAgICAgICAgICAgdmFyIGhhc2hlciA9IGNmZy5oYXNoZXIuY3JlYXRlKCk7XG5cblx0ICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRLZXkgPSBXb3JkQXJyYXkuY3JlYXRlKCk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkZXJpdmVkS2V5V29yZHMgPSBkZXJpdmVkS2V5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIga2V5U2l6ZSA9IGNmZy5rZXlTaXplO1xuXHQgICAgICAgICAgICB2YXIgaXRlcmF0aW9ucyA9IGNmZy5pdGVyYXRpb25zO1xuXG5cdCAgICAgICAgICAgIC8vIEdlbmVyYXRlIGtleVxuXHQgICAgICAgICAgICB3aGlsZSAoZGVyaXZlZEtleVdvcmRzLmxlbmd0aCA8IGtleVNpemUpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChibG9jaykge1xuXHQgICAgICAgICAgICAgICAgICAgIGhhc2hlci51cGRhdGUoYmxvY2spO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYmxvY2sgPSBoYXNoZXIudXBkYXRlKHBhc3N3b3JkKS5maW5hbGl6ZShzYWx0KTtcblx0ICAgICAgICAgICAgICAgIGhhc2hlci5yZXNldCgpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBJdGVyYXRpb25zXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gaGFzaGVyLmZpbmFsaXplKGJsb2NrKTtcblx0ICAgICAgICAgICAgICAgICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgZGVyaXZlZEtleS5jb25jYXQoYmxvY2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGRlcml2ZWRLZXkuc2lnQnl0ZXMgPSBrZXlTaXplICogNDtcblxuXHQgICAgICAgICAgICByZXR1cm4gZGVyaXZlZEtleTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBEZXJpdmVzIGEga2V5IGZyb20gYSBwYXNzd29yZC5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gc2FsdCBBIHNhbHQuXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgY29tcHV0YXRpb24uXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGVyaXZlZCBrZXkuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5FdnBLREYocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5FdnBLREYocGFzc3dvcmQsIHNhbHQsIHsga2V5U2l6ZTogOCB9KTtcblx0ICAgICAqICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuRXZwS0RGKHBhc3N3b3JkLCBzYWx0LCB7IGtleVNpemU6IDgsIGl0ZXJhdGlvbnM6IDEwMDAgfSk7XG5cdCAgICAgKi9cblx0ICAgIEMuRXZwS0RGID0gZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0LCBjZmcpIHtcblx0ICAgICAgICByZXR1cm4gRXZwS0RGLmNyZWF0ZShjZmcpLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgfTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5FdnBLREY7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTtcblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jO1xuXHQgICAgdmFyIFV0ZjggPSBDX2VuYy5VdGY4O1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgLyoqXG5cdCAgICAgKiBITUFDIGFsZ29yaXRobS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEhNQUMgPSBDX2FsZ28uSE1BQyA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgSE1BQy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhtYWNIYXNoZXIgPSBDcnlwdG9KUy5hbGdvLkhNQUMuY3JlYXRlKENyeXB0b0pTLmFsZ28uU0hBMjU2LCBrZXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChoYXNoZXIsIGtleSkge1xuXHQgICAgICAgICAgICAvLyBJbml0IGhhc2hlclxuXHQgICAgICAgICAgICBoYXNoZXIgPSB0aGlzLl9oYXNoZXIgPSBuZXcgaGFzaGVyLmluaXQoKTtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBXb3JkQXJyYXksIGVsc2UgYXNzdW1lIFdvcmRBcnJheSBhbHJlYWR5XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSBVdGY4LnBhcnNlKGtleSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGhhc2hlckJsb2NrU2l6ZSA9IGhhc2hlci5ibG9ja1NpemU7XG5cdCAgICAgICAgICAgIHZhciBoYXNoZXJCbG9ja1NpemVCeXRlcyA9IGhhc2hlckJsb2NrU2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQWxsb3cgYXJiaXRyYXJ5IGxlbmd0aCBrZXlzXG5cdCAgICAgICAgICAgIGlmIChrZXkuc2lnQnl0ZXMgPiBoYXNoZXJCbG9ja1NpemVCeXRlcykge1xuXHQgICAgICAgICAgICAgICAga2V5ID0gaGFzaGVyLmZpbmFsaXplKGtleSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDbGFtcCBleGNlc3MgYml0c1xuXHQgICAgICAgICAgICBrZXkuY2xhbXAoKTtcblxuXHQgICAgICAgICAgICAvLyBDbG9uZSBrZXkgZm9yIGlubmVyIGFuZCBvdXRlciBwYWRzXG5cdCAgICAgICAgICAgIHZhciBvS2V5ID0gdGhpcy5fb0tleSA9IGtleS5jbG9uZSgpO1xuXHQgICAgICAgICAgICB2YXIgaUtleSA9IHRoaXMuX2lLZXkgPSBrZXkuY2xvbmUoKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIG9LZXlXb3JkcyA9IG9LZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBpS2V5V29yZHMgPSBpS2V5LndvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFhPUiBrZXlzIHdpdGggcGFkIGNvbnN0YW50c1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhc2hlckJsb2NrU2l6ZTsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBvS2V5V29yZHNbaV0gXj0gMHg1YzVjNWM1Yztcblx0ICAgICAgICAgICAgICAgIGlLZXlXb3Jkc1tpXSBePSAweDM2MzYzNjM2O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIG9LZXkuc2lnQnl0ZXMgPSBpS2V5LnNpZ0J5dGVzID0gaGFzaGVyQmxvY2tTaXplQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgSE1BQyB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgaG1hY0hhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBoYXNoZXIgPSB0aGlzLl9oYXNoZXI7XG5cblx0ICAgICAgICAgICAgLy8gUmVzZXRcblx0ICAgICAgICAgICAgaGFzaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICAgIGhhc2hlci51cGRhdGUodGhpcy5faUtleSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFVwZGF0ZXMgdGhpcyBITUFDIHdpdGggYSBtZXNzYWdlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIFRoZSBtZXNzYWdlIHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0hNQUN9IFRoaXMgSE1BQyBpbnN0YW5jZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgaG1hY0hhc2hlci51cGRhdGUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgaG1hY0hhc2hlci51cGRhdGUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2hhc2hlci51cGRhdGUobWVzc2FnZVVwZGF0ZSk7XG5cblx0ICAgICAgICAgICAgLy8gQ2hhaW5hYmxlXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBGaW5hbGl6ZXMgdGhlIEhNQUMgY29tcHV0YXRpb24uXG5cdCAgICAgICAgICogTm90ZSB0aGF0IHRoZSBmaW5hbGl6ZSBvcGVyYXRpb24gaXMgZWZmZWN0aXZlbHkgYSBkZXN0cnVjdGl2ZSwgcmVhZC1vbmNlIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSAoT3B0aW9uYWwpIEEgZmluYWwgbWVzc2FnZSB1cGRhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaG1hYyA9IGhtYWNIYXNoZXIuZmluYWxpemUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhtYWMgPSBobWFjSGFzaGVyLmZpbmFsaXplKCdtZXNzYWdlJyk7XG5cdCAgICAgICAgICogICAgIHZhciBobWFjID0gaG1hY0hhc2hlci5maW5hbGl6ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgaGFzaGVyID0gdGhpcy5faGFzaGVyO1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgSE1BQ1xuXHQgICAgICAgICAgICB2YXIgaW5uZXJIYXNoID0gaGFzaGVyLmZpbmFsaXplKG1lc3NhZ2VVcGRhdGUpO1xuXHQgICAgICAgICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgICAgdmFyIGhtYWMgPSBoYXNoZXIuZmluYWxpemUodGhpcy5fb0tleS5jbG9uZSgpLmNvbmNhdChpbm5lckhhc2gpKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gaG1hYztcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0fSgpKTtcblxuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKE1hdGgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBDb25zdGFudHMgdGFibGVcblx0ICAgIHZhciBUID0gW107XG5cblx0ICAgIC8vIENvbXB1dGUgY29uc3RhbnRzXG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuXHQgICAgICAgICAgICBUW2ldID0gKE1hdGguYWJzKE1hdGguc2luKGkgKyAxKSkgKiAweDEwMDAwMDAwMCkgfCAwO1xuXHQgICAgICAgIH1cblx0ICAgIH0oKSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogTUQ1IGhhc2ggYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgTUQ1ID0gQ19hbGdvLk1ENSA9IEhhc2hlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2hhc2ggPSBuZXcgV29yZEFycmF5LmluaXQoW1xuXHQgICAgICAgICAgICAgICAgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSxcblx0ICAgICAgICAgICAgICAgIDB4OThiYWRjZmUsIDB4MTAzMjU0NzZcblx0ICAgICAgICAgICAgXSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTd2FwIGVuZGlhblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICAgICAgdmFyIG9mZnNldF9pID0gb2Zmc2V0ICsgaTtcblx0ICAgICAgICAgICAgICAgIHZhciBNX29mZnNldF9pID0gTVtvZmZzZXRfaV07XG5cblx0ICAgICAgICAgICAgICAgIE1bb2Zmc2V0X2ldID0gKFxuXHQgICAgICAgICAgICAgICAgICAgICgoKE1fb2Zmc2V0X2kgPDwgOCkgIHwgKE1fb2Zmc2V0X2kgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAgICAgKCgoTV9vZmZzZXRfaSA8PCAyNCkgfCAoTV9vZmZzZXRfaSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApXG5cdCAgICAgICAgICAgICAgICApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBIID0gdGhpcy5faGFzaC53b3JkcztcblxuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMCAgPSBNW29mZnNldCArIDBdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMSAgPSBNW29mZnNldCArIDFdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMiAgPSBNW29mZnNldCArIDJdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMyAgPSBNW29mZnNldCArIDNdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfNCAgPSBNW29mZnNldCArIDRdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfNSAgPSBNW29mZnNldCArIDVdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfNiAgPSBNW29mZnNldCArIDZdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfNyAgPSBNW29mZnNldCArIDddO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfOCAgPSBNW29mZnNldCArIDhdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfOSAgPSBNW29mZnNldCArIDldO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTAgPSBNW29mZnNldCArIDEwXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzExID0gTVtvZmZzZXQgKyAxMV07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xMiA9IE1bb2Zmc2V0ICsgMTJdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTMgPSBNW29mZnNldCArIDEzXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzE0ID0gTVtvZmZzZXQgKyAxNF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xNSA9IE1bb2Zmc2V0ICsgMTVdO1xuXG5cdCAgICAgICAgICAgIC8vIFdvcmtpbmcgdmFyaWFibGVzXG5cdCAgICAgICAgICAgIHZhciBhID0gSFswXTtcblx0ICAgICAgICAgICAgdmFyIGIgPSBIWzFdO1xuXHQgICAgICAgICAgICB2YXIgYyA9IEhbMl07XG5cdCAgICAgICAgICAgIHZhciBkID0gSFszXTtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRhdGlvblxuXHQgICAgICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgTV9vZmZzZXRfMCwgIDcsICBUWzBdKTtcblx0ICAgICAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzEsICAxMiwgVFsxXSk7XG5cdCAgICAgICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF8yLCAgMTcsIFRbMl0pO1xuXHQgICAgICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfMywgIDIyLCBUWzNdKTtcblx0ICAgICAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzQsICA3LCAgVFs0XSk7XG5cdCAgICAgICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCBNX29mZnNldF81LCAgMTIsIFRbNV0pO1xuXHQgICAgICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgTV9vZmZzZXRfNiwgIDE3LCBUWzZdKTtcblx0ICAgICAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzcsICAyMiwgVFs3XSk7XG5cdCAgICAgICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCBNX29mZnNldF84LCAgNywgIFRbOF0pO1xuXHQgICAgICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfOSwgIDEyLCBUWzldKTtcblx0ICAgICAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzEwLCAxNywgVFsxMF0pO1xuXHQgICAgICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTEsIDIyLCBUWzExXSk7XG5cdCAgICAgICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCBNX29mZnNldF8xMiwgNywgIFRbMTJdKTtcblx0ICAgICAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzEzLCAxMiwgVFsxM10pO1xuXHQgICAgICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTQsIDE3LCBUWzE0XSk7XG5cdCAgICAgICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCBNX29mZnNldF8xNSwgMjIsIFRbMTVdKTtcblxuXHQgICAgICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgTV9vZmZzZXRfMSwgIDUsICBUWzE2XSk7XG5cdCAgICAgICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBNX29mZnNldF82LCAgOSwgIFRbMTddKTtcblx0ICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzExLCAxNCwgVFsxOF0pO1xuXHQgICAgICAgICAgICBiID0gR0coYiwgYywgZCwgYSwgTV9vZmZzZXRfMCwgIDIwLCBUWzE5XSk7XG5cdCAgICAgICAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCBNX29mZnNldF81LCAgNSwgIFRbMjBdKTtcblx0ICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzEwLCA5LCAgVFsyMV0pO1xuXHQgICAgICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgTV9vZmZzZXRfMTUsIDE0LCBUWzIyXSk7XG5cdCAgICAgICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBNX29mZnNldF80LCAgMjAsIFRbMjNdKTtcblx0ICAgICAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzksICA1LCAgVFsyNF0pO1xuXHQgICAgICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgTV9vZmZzZXRfMTQsIDksICBUWzI1XSk7XG5cdCAgICAgICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBNX29mZnNldF8zLCAgMTQsIFRbMjZdKTtcblx0ICAgICAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzgsICAyMCwgVFsyN10pO1xuXHQgICAgICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgTV9vZmZzZXRfMTMsIDUsICBUWzI4XSk7XG5cdCAgICAgICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBNX29mZnNldF8yLCAgOSwgIFRbMjldKTtcblx0ICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzcsICAxNCwgVFszMF0pO1xuXHQgICAgICAgICAgICBiID0gR0coYiwgYywgZCwgYSwgTV9vZmZzZXRfMTIsIDIwLCBUWzMxXSk7XG5cblx0ICAgICAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzUsICA0LCAgVFszMl0pO1xuXHQgICAgICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgTV9vZmZzZXRfOCwgIDExLCBUWzMzXSk7XG5cdCAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF8xMSwgMTYsIFRbMzRdKTtcblx0ICAgICAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzE0LCAyMywgVFszNV0pO1xuXHQgICAgICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfMSwgIDQsICBUWzM2XSk7XG5cdCAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF80LCAgMTEsIFRbMzddKTtcblx0ICAgICAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzcsICAxNiwgVFszOF0pO1xuXHQgICAgICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTAsIDIzLCBUWzM5XSk7XG5cdCAgICAgICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF8xMywgNCwgIFRbNDBdKTtcblx0ICAgICAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzAsICAxMSwgVFs0MV0pO1xuXHQgICAgICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgTV9vZmZzZXRfMywgIDE2LCBUWzQyXSk7XG5cdCAgICAgICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF82LCAgMjMsIFRbNDNdKTtcblx0ICAgICAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzksICA0LCAgVFs0NF0pO1xuXHQgICAgICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTIsIDExLCBUWzQ1XSk7XG5cdCAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF8xNSwgMTYsIFRbNDZdKTtcblx0ICAgICAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzIsICAyMywgVFs0N10pO1xuXG5cdCAgICAgICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCBNX29mZnNldF8wLCAgNiwgIFRbNDhdKTtcblx0ICAgICAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzcsICAxMCwgVFs0OV0pO1xuXHQgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTQsIDE1LCBUWzUwXSk7XG5cdCAgICAgICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCBNX29mZnNldF81LCAgMjEsIFRbNTFdKTtcblx0ICAgICAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEyLCA2LCAgVFs1Ml0pO1xuXHQgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfMywgIDEwLCBUWzUzXSk7XG5cdCAgICAgICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCBNX29mZnNldF8xMCwgMTUsIFRbNTRdKTtcblx0ICAgICAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzEsICAyMSwgVFs1NV0pO1xuXHQgICAgICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfOCwgIDYsICBUWzU2XSk7XG5cdCAgICAgICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCBNX29mZnNldF8xNSwgMTAsIFRbNTddKTtcblx0ICAgICAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzYsICAxNSwgVFs1OF0pO1xuXHQgICAgICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTMsIDIxLCBUWzU5XSk7XG5cdCAgICAgICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCBNX29mZnNldF80LCAgNiwgIFRbNjBdKTtcblx0ICAgICAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzExLCAxMCwgVFs2MV0pO1xuXHQgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfMiwgIDE1LCBUWzYyXSk7XG5cdCAgICAgICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCBNX29mZnNldF85LCAgMjEsIFRbNjNdKTtcblxuXHQgICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZVxuXHQgICAgICAgICAgICBIWzBdID0gKEhbMF0gKyBhKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMV0gPSAoSFsxXSArIGIpIHwgMDtcblx0ICAgICAgICAgICAgSFsyXSA9IChIWzJdICsgYykgfCAwO1xuXHQgICAgICAgICAgICBIWzNdID0gKEhbM10gKyBkKSB8IDA7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cdCAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsID0gdGhpcy5fbkRhdGFCeXRlcyAqIDg7XG5cdCAgICAgICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODtcblxuXHQgICAgICAgICAgICAvLyBBZGQgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8ICgyNCAtIG5CaXRzTGVmdCAlIDMyKTtcblxuXHQgICAgICAgICAgICB2YXIgbkJpdHNUb3RhbEggPSBNYXRoLmZsb29yKG5CaXRzVG90YWwgLyAweDEwMDAwMDAwMCk7XG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsTCA9IG5CaXRzVG90YWw7XG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTVdID0gKFxuXHQgICAgICAgICAgICAgICAgKCgobkJpdHNUb3RhbEggPDwgOCkgIHwgKG5CaXRzVG90YWxIID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgKCgobkJpdHNUb3RhbEggPDwgMjQpIHwgKG5CaXRzVG90YWxIID4+PiA4KSkgICYgMHhmZjAwZmYwMClcblx0ICAgICAgICAgICAgKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNF0gPSAoXG5cdCAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsTCA8PCA4KSAgfCAobkJpdHNUb3RhbEwgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsTCA8PCAyNCkgfCAobkJpdHNUb3RhbEwgPj4+IDgpKSAgJiAweGZmMDBmZjAwKVxuXHQgICAgICAgICAgICApO1xuXG5cdCAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSAoZGF0YVdvcmRzLmxlbmd0aCArIDEpICogNDtcblxuXHQgICAgICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBoYXNoID0gdGhpcy5faGFzaDtcblx0ICAgICAgICAgICAgdmFyIEggPSBoYXNoLndvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICAgICAgdmFyIEhfaSA9IEhbaV07XG5cblx0ICAgICAgICAgICAgICAgIEhbaV0gPSAoKChIX2kgPDwgOCkgIHwgKEhfaSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAoKChIX2kgPDwgMjQpIHwgKEhfaSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIGZpbmFsIGNvbXB1dGVkIGhhc2hcblx0ICAgICAgICAgICAgcmV0dXJuIGhhc2g7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICBjbG9uZS5faGFzaCA9IHRoaXMuX2hhc2guY2xvbmUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIGZ1bmN0aW9uIEZGKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcblx0ICAgICAgICB2YXIgbiA9IGEgKyAoKGIgJiBjKSB8ICh+YiAmIGQpKSArIHggKyB0O1xuXHQgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7XG5cdCAgICB9XG5cblx0ICAgIGZ1bmN0aW9uIEdHKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcblx0ICAgICAgICB2YXIgbiA9IGEgKyAoKGIgJiBkKSB8IChjICYgfmQpKSArIHggKyB0O1xuXHQgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7XG5cdCAgICB9XG5cblx0ICAgIGZ1bmN0aW9uIEhIKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcblx0ICAgICAgICB2YXIgbiA9IGEgKyAoYiBeIGMgXiBkKSArIHggKyB0O1xuXHQgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7XG5cdCAgICB9XG5cblx0ICAgIGZ1bmN0aW9uIElJKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcblx0ICAgICAgICB2YXIgbiA9IGEgKyAoYyBeIChiIHwgfmQpKSArIHggKyB0O1xuXHQgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7XG5cdCAgICB9XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5NRDUoJ21lc3NhZ2UnKTtcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLk1ENSh3b3JkQXJyYXkpO1xuXHQgICAgICovXG5cdCAgICBDLk1ENSA9IEhhc2hlci5fY3JlYXRlSGVscGVyKE1ENSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjTUQ1KG1lc3NhZ2UsIGtleSk7XG5cdCAgICAgKi9cblx0ICAgIEMuSG1hY01ENSA9IEhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihNRDUpO1xuXHR9KE1hdGgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5NRDU7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgSGFzaGVyID0gQ19saWIuSGFzaGVyO1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgLy8gUmV1c2FibGUgb2JqZWN0XG5cdCAgICB2YXIgVyA9IFtdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNIQS0xIGhhc2ggYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgU0hBMSA9IENfYWxnby5TSEExID0gSGFzaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBXb3JkQXJyYXkuaW5pdChbXG5cdCAgICAgICAgICAgICAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LFxuXHQgICAgICAgICAgICAgICAgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3Nixcblx0ICAgICAgICAgICAgICAgIDB4YzNkMmUxZjBcblx0ICAgICAgICAgICAgXSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgSCA9IHRoaXMuX2hhc2gud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWJsZXNcblx0ICAgICAgICAgICAgdmFyIGEgPSBIWzBdO1xuXHQgICAgICAgICAgICB2YXIgYiA9IEhbMV07XG5cdCAgICAgICAgICAgIHZhciBjID0gSFsyXTtcblx0ICAgICAgICAgICAgdmFyIGQgPSBIWzNdO1xuXHQgICAgICAgICAgICB2YXIgZSA9IEhbNF07XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0YXRpb25cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4MDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoaSA8IDE2KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgV1tpXSA9IE1bb2Zmc2V0ICsgaV0gfCAwO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl07XG5cdCAgICAgICAgICAgICAgICAgICAgV1tpXSA9IChuIDw8IDEpIHwgKG4gPj4+IDMxKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgdmFyIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGUgKyBXW2ldO1xuXHQgICAgICAgICAgICAgICAgaWYgKGkgPCAyMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgKz0gKChiICYgYykgfCAofmIgJiBkKSkgKyAweDVhODI3OTk5O1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgNDApIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ICs9IChiIF4gYyBeIGQpICsgMHg2ZWQ5ZWJhMTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDYwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCArPSAoKGIgJiBjKSB8IChiICYgZCkgfCAoYyAmIGQpKSAtIDB4NzBlNDQzMjQ7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgLyogaWYgKGkgPCA4MCkgKi8ge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgKz0gKGIgXiBjIF4gZCkgLSAweDM1OWQzZTJhO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBlID0gZDtcblx0ICAgICAgICAgICAgICAgIGQgPSBjO1xuXHQgICAgICAgICAgICAgICAgYyA9IChiIDw8IDMwKSB8IChiID4+PiAyKTtcblx0ICAgICAgICAgICAgICAgIGIgPSBhO1xuXHQgICAgICAgICAgICAgICAgYSA9IHQ7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZVxuXHQgICAgICAgICAgICBIWzBdID0gKEhbMF0gKyBhKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMV0gPSAoSFsxXSArIGIpIHwgMDtcblx0ICAgICAgICAgICAgSFsyXSA9IChIWzJdICsgYykgfCAwO1xuXHQgICAgICAgICAgICBIWzNdID0gKEhbM10gKyBkKSB8IDA7XG5cdCAgICAgICAgICAgIEhbNF0gPSAoSFs0XSArIGUpIHwgMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4O1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IE1hdGguZmxvb3IobkJpdHNUb3RhbCAvIDB4MTAwMDAwMDAwKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNV0gPSBuQml0c1RvdGFsO1xuXHQgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzID0gZGF0YVdvcmRzLmxlbmd0aCAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gSGFzaCBmaW5hbCBibG9ja3Ncblx0ICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG5cdCAgICAgICAgICAgIC8vIFJldHVybiBmaW5hbCBjb21wdXRlZCBoYXNoXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNoO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBIYXNoZXIuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUuX2hhc2ggPSB0aGlzLl9oYXNoLmNsb25lKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMSgnbWVzc2FnZScpO1xuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMSh3b3JkQXJyYXkpO1xuXHQgICAgICovXG5cdCAgICBDLlNIQTEgPSBIYXNoZXIuX2NyZWF0ZUhlbHBlcihTSEExKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNTSEExKG1lc3NhZ2UsIGtleSk7XG5cdCAgICAgKi9cblx0ICAgIEMuSG1hY1NIQTEgPSBIYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoU0hBMSk7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuU0hBMTtcblxufSkpOyIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3Qge1xuICAtLWJsYWNrLWExOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICAtLWJsYWNrLWEyOiByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIC0tYmxhY2stYTM6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIC0tYmxhY2stYTQ6IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgLS1ibGFjay1hNTogcmdiYSgwLCAwLCAwLCAwLjMpO1xuICAtLWJsYWNrLWE2OiByZ2JhKDAsIDAsIDAsIDAuNCk7XG4gIC0tYmxhY2stYTc6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgLS1ibGFjay1hODogcmdiYSgwLCAwLCAwLCAwLjYpO1xuICAtLWJsYWNrLWE5OiByZ2JhKDAsIDAsIDAsIDAuNyk7XG4gIC0tYmxhY2stYTEwOiByZ2JhKDAsIDAsIDAsIDAuOCk7XG4gIC0tYmxhY2stYTExOiByZ2JhKDAsIDAsIDAsIDAuOSk7XG4gIC0tYmxhY2stYTEyOiByZ2JhKDAsIDAsIDAsIDAuOTUpO1xufVxuXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSkge1xuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xuICAgIDpyb290IHtcbiAgICAgIC0tYmxhY2stYTE6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjA1KTtcbiAgICAgIC0tYmxhY2stYTI6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjEpO1xuICAgICAgLS1ibGFjay1hMzogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMTUpO1xuICAgICAgLS1ibGFjay1hNDogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMik7XG4gICAgICAtLWJsYWNrLWE1OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4zKTtcbiAgICAgIC0tYmxhY2stYTY6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjQpO1xuICAgICAgLS1ibGFjay1hNzogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuNSk7XG4gICAgICAtLWJsYWNrLWE4OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC42KTtcbiAgICAgIC0tYmxhY2stYTk6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjcpO1xuICAgICAgLS1ibGFjay1hMTA6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjgpO1xuICAgICAgLS1ibGFjay1hMTE6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjkpO1xuICAgICAgLS1ibGFjay1hMTI6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjk1KTtcbiAgICB9XG4gIH1cbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL2JsYWNrLWFscGhhLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtFQUNFLCtCQUErQjtFQUMvQiw4QkFBOEI7RUFDOUIsK0JBQStCO0VBQy9CLDhCQUE4QjtFQUM5Qiw4QkFBOEI7RUFDOUIsOEJBQThCO0VBQzlCLDhCQUE4QjtFQUM5Qiw4QkFBOEI7RUFDOUIsOEJBQThCO0VBQzlCLCtCQUErQjtFQUMvQiwrQkFBK0I7RUFDL0IsZ0NBQWdDO0FBQ2xDOztBQUVBO0VBQ0U7SUFDRTtNQUNFLDBDQUEwQztNQUMxQyx5Q0FBeUM7TUFDekMsMENBQTBDO01BQzFDLHlDQUF5QztNQUN6Qyx5Q0FBeUM7TUFDekMseUNBQXlDO01BQ3pDLHlDQUF5QztNQUN6Qyx5Q0FBeUM7TUFDekMseUNBQXlDO01BQ3pDLDBDQUEwQztNQUMxQywwQ0FBMEM7TUFDMUMsMkNBQTJDO0lBQzdDO0VBQ0Y7QUFDRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI6cm9vdCB7XFxuICAtLWJsYWNrLWExOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xcbiAgLS1ibGFjay1hMjogcmdiYSgwLCAwLCAwLCAwLjEpO1xcbiAgLS1ibGFjay1hMzogcmdiYSgwLCAwLCAwLCAwLjE1KTtcXG4gIC0tYmxhY2stYTQ6IHJnYmEoMCwgMCwgMCwgMC4yKTtcXG4gIC0tYmxhY2stYTU6IHJnYmEoMCwgMCwgMCwgMC4zKTtcXG4gIC0tYmxhY2stYTY6IHJnYmEoMCwgMCwgMCwgMC40KTtcXG4gIC0tYmxhY2stYTc6IHJnYmEoMCwgMCwgMCwgMC41KTtcXG4gIC0tYmxhY2stYTg6IHJnYmEoMCwgMCwgMCwgMC42KTtcXG4gIC0tYmxhY2stYTk6IHJnYmEoMCwgMCwgMCwgMC43KTtcXG4gIC0tYmxhY2stYTEwOiByZ2JhKDAsIDAsIDAsIDAuOCk7XFxuICAtLWJsYWNrLWExMTogcmdiYSgwLCAwLCAwLCAwLjkpO1xcbiAgLS1ibGFjay1hMTI6IHJnYmEoMCwgMCwgMCwgMC45NSk7XFxufVxcblxcbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yKGRpc3BsYXktcDMgMSAxIDEpKSB7XFxuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xcbiAgICA6cm9vdCB7XFxuICAgICAgLS1ibGFjay1hMTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMDUpO1xcbiAgICAgIC0tYmxhY2stYTI6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjEpO1xcbiAgICAgIC0tYmxhY2stYTM6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjE1KTtcXG4gICAgICAtLWJsYWNrLWE0OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4yKTtcXG4gICAgICAtLWJsYWNrLWE1OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4zKTtcXG4gICAgICAtLWJsYWNrLWE2OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC40KTtcXG4gICAgICAtLWJsYWNrLWE3OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC41KTtcXG4gICAgICAtLWJsYWNrLWE4OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC42KTtcXG4gICAgICAtLWJsYWNrLWE5OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC43KTtcXG4gICAgICAtLWJsYWNrLWExMDogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuOCk7XFxuICAgICAgLS1ibGFjay1hMTE6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjkpO1xcbiAgICAgIC0tYmxhY2stYTEyOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC45NSk7XFxuICAgIH1cXG4gIH1cXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcbiAgLS1tYXV2ZS0xOiAjZmRmY2ZkO1xuICAtLW1hdXZlLTI6ICNmYWY5ZmI7XG4gIC0tbWF1dmUtMzogI2YyZWZmMztcbiAgLS1tYXV2ZS00OiAjZWFlN2VjO1xuICAtLW1hdXZlLTU6ICNlM2RmZTY7XG4gIC0tbWF1dmUtNjogI2RiZDhlMDtcbiAgLS1tYXV2ZS03OiAjZDBjZGQ3O1xuICAtLW1hdXZlLTg6ICNiY2JhYzc7XG4gIC0tbWF1dmUtOTogIzhlOGM5OTtcbiAgLS1tYXV2ZS0xMDogIzg0ODI4ZTtcbiAgLS1tYXV2ZS0xMTogIzY1NjM2ZDtcbiAgLS1tYXV2ZS0xMjogIzIxMWYyNjtcbn1cblxuQHN1cHBvcnRzIChjb2xvcjogY29sb3IoZGlzcGxheS1wMyAxIDEgMSkpIHtcbiAgQG1lZGlhIChjb2xvci1nYW11dDogcDMpIHtcbiAgICA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xuICAgICAgLS1tYXV2ZS0xOiBjb2xvcihkaXNwbGF5LXAzIDAuOTkxIDAuOTg4IDAuOTkyKTtcbiAgICAgIC0tbWF1dmUtMjogY29sb3IoZGlzcGxheS1wMyAwLjk4IDAuOTc2IDAuOTg0KTtcbiAgICAgIC0tbWF1dmUtMzogY29sb3IoZGlzcGxheS1wMyAwLjk0NiAwLjkzOCAwLjk1Mik7XG4gICAgICAtLW1hdXZlLTQ6IGNvbG9yKGRpc3BsYXktcDMgMC45MTUgMC45MDYgMC45MjUpO1xuICAgICAgLS1tYXV2ZS01OiBjb2xvcihkaXNwbGF5LXAzIDAuODg2IDAuODc2IDAuOTAxKTtcbiAgICAgIC0tbWF1dmUtNjogY29sb3IoZGlzcGxheS1wMyAwLjg1NiAwLjg0NiAwLjg3NSk7XG4gICAgICAtLW1hdXZlLTc6IGNvbG9yKGRpc3BsYXktcDMgMC44MTQgMC44MDQgMC44NCk7XG4gICAgICAtLW1hdXZlLTg6IGNvbG9yKGRpc3BsYXktcDMgMC43MzUgMC43MjggMC43NzcpO1xuICAgICAgLS1tYXV2ZS05OiBjb2xvcihkaXNwbGF5LXAzIDAuNTU1IDAuNTQ5IDAuNTk2KTtcbiAgICAgIC0tbWF1dmUtMTA6IGNvbG9yKGRpc3BsYXktcDMgMC41MTQgMC41MDggMC41NTIpO1xuICAgICAgLS1tYXV2ZS0xMTogY29sb3IoZGlzcGxheS1wMyAwLjM5NSAwLjM4OCAwLjQyNCk7XG4gICAgICAtLW1hdXZlLTEyOiBjb2xvcihkaXNwbGF5LXAzIDAuMTI4IDAuMTIyIDAuMTQ3KTtcbiAgICB9XG4gIH1cbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL21hdXZlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtFQUNFLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0U7SUFDRTtNQUNFLDhDQUE4QztNQUM5Qyw2Q0FBNkM7TUFDN0MsOENBQThDO01BQzlDLDhDQUE4QztNQUM5Qyw4Q0FBOEM7TUFDOUMsOENBQThDO01BQzlDLDZDQUE2QztNQUM3Qyw4Q0FBOEM7TUFDOUMsOENBQThDO01BQzlDLCtDQUErQztNQUMvQywrQ0FBK0M7TUFDL0MsK0NBQStDO0lBQ2pEO0VBQ0Y7QUFDRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xcbiAgLS1tYXV2ZS0xOiAjZmRmY2ZkO1xcbiAgLS1tYXV2ZS0yOiAjZmFmOWZiO1xcbiAgLS1tYXV2ZS0zOiAjZjJlZmYzO1xcbiAgLS1tYXV2ZS00OiAjZWFlN2VjO1xcbiAgLS1tYXV2ZS01OiAjZTNkZmU2O1xcbiAgLS1tYXV2ZS02OiAjZGJkOGUwO1xcbiAgLS1tYXV2ZS03OiAjZDBjZGQ3O1xcbiAgLS1tYXV2ZS04OiAjYmNiYWM3O1xcbiAgLS1tYXV2ZS05OiAjOGU4Yzk5O1xcbiAgLS1tYXV2ZS0xMDogIzg0ODI4ZTtcXG4gIC0tbWF1dmUtMTE6ICM2NTYzNmQ7XFxuICAtLW1hdXZlLTEyOiAjMjExZjI2O1xcbn1cXG5cXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSkge1xcbiAgQG1lZGlhIChjb2xvci1nYW11dDogcDMpIHtcXG4gICAgOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcXG4gICAgICAtLW1hdXZlLTE6IGNvbG9yKGRpc3BsYXktcDMgMC45OTEgMC45ODggMC45OTIpO1xcbiAgICAgIC0tbWF1dmUtMjogY29sb3IoZGlzcGxheS1wMyAwLjk4IDAuOTc2IDAuOTg0KTtcXG4gICAgICAtLW1hdXZlLTM6IGNvbG9yKGRpc3BsYXktcDMgMC45NDYgMC45MzggMC45NTIpO1xcbiAgICAgIC0tbWF1dmUtNDogY29sb3IoZGlzcGxheS1wMyAwLjkxNSAwLjkwNiAwLjkyNSk7XFxuICAgICAgLS1tYXV2ZS01OiBjb2xvcihkaXNwbGF5LXAzIDAuODg2IDAuODc2IDAuOTAxKTtcXG4gICAgICAtLW1hdXZlLTY6IGNvbG9yKGRpc3BsYXktcDMgMC44NTYgMC44NDYgMC44NzUpO1xcbiAgICAgIC0tbWF1dmUtNzogY29sb3IoZGlzcGxheS1wMyAwLjgxNCAwLjgwNCAwLjg0KTtcXG4gICAgICAtLW1hdXZlLTg6IGNvbG9yKGRpc3BsYXktcDMgMC43MzUgMC43MjggMC43NzcpO1xcbiAgICAgIC0tbWF1dmUtOTogY29sb3IoZGlzcGxheS1wMyAwLjU1NSAwLjU0OSAwLjU5Nik7XFxuICAgICAgLS1tYXV2ZS0xMDogY29sb3IoZGlzcGxheS1wMyAwLjUxNCAwLjUwOCAwLjU1Mik7XFxuICAgICAgLS1tYXV2ZS0xMTogY29sb3IoZGlzcGxheS1wMyAwLjM5NSAwLjM4OCAwLjQyNCk7XFxuICAgICAgLS1tYXV2ZS0xMjogY29sb3IoZGlzcGxheS1wMyAwLjEyOCAwLjEyMiAwLjE0Nyk7XFxuICAgIH1cXG4gIH1cXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcbiAgLS12aW9sZXQtMTogI2ZkZmNmZTtcbiAgLS12aW9sZXQtMjogI2ZhZjhmZjtcbiAgLS12aW9sZXQtMzogI2Y0ZjBmZTtcbiAgLS12aW9sZXQtNDogI2ViZTRmZjtcbiAgLS12aW9sZXQtNTogI2UxZDlmZjtcbiAgLS12aW9sZXQtNjogI2Q0Y2FmZTtcbiAgLS12aW9sZXQtNzogI2MyYjVmNTtcbiAgLS12aW9sZXQtODogI2FhOTllYztcbiAgLS12aW9sZXQtOTogIzZlNTZjZjtcbiAgLS12aW9sZXQtMTA6ICM2NTRkYzQ7XG4gIC0tdmlvbGV0LTExOiAjNjU1MGI5O1xuICAtLXZpb2xldC0xMjogIzJmMjY1Zjtcbn1cblxuQHN1cHBvcnRzIChjb2xvcjogY29sb3IoZGlzcGxheS1wMyAxIDEgMSkpIHtcbiAgQG1lZGlhIChjb2xvci1nYW11dDogcDMpIHtcbiAgICA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xuICAgICAgLS12aW9sZXQtMTogY29sb3IoZGlzcGxheS1wMyAwLjk5MSAwLjk4OCAwLjk5NSk7XG4gICAgICAtLXZpb2xldC0yOiBjb2xvcihkaXNwbGF5LXAzIDAuOTc4IDAuOTc0IDAuOTk4KTtcbiAgICAgIC0tdmlvbGV0LTM6IGNvbG9yKGRpc3BsYXktcDMgMC45NTMgMC45NDMgMC45OTMpO1xuICAgICAgLS12aW9sZXQtNDogY29sb3IoZGlzcGxheS1wMyAwLjkxNiAwLjg5NyAxKTtcbiAgICAgIC0tdmlvbGV0LTU6IGNvbG9yKGRpc3BsYXktcDMgMC44NzYgMC44NTEgMSk7XG4gICAgICAtLXZpb2xldC02OiBjb2xvcihkaXNwbGF5LXAzIDAuODI1IDAuNzkzIDAuOTgxKTtcbiAgICAgIC0tdmlvbGV0LTc6IGNvbG9yKGRpc3BsYXktcDMgMC43NTIgMC43MTIgMC45NDMpO1xuICAgICAgLS12aW9sZXQtODogY29sb3IoZGlzcGxheS1wMyAwLjY1NCAwLjYwMiAwLjkwMik7XG4gICAgICAtLXZpb2xldC05OiBjb2xvcihkaXNwbGF5LXAzIDAuNDE3IDAuMzQxIDAuNzg0KTtcbiAgICAgIC0tdmlvbGV0LTEwOiBjb2xvcihkaXNwbGF5LXAzIDAuMzgxIDAuMzA2IDAuNzQxKTtcbiAgICAgIC0tdmlvbGV0LTExOiBjb2xvcihkaXNwbGF5LXAzIDAuMzgzIDAuMzE3IDAuNzAyKTtcbiAgICAgIC0tdmlvbGV0LTEyOiBjb2xvcihkaXNwbGF5LXAzIDAuMTc5IDAuMTUgMC4zNTkpO1xuICAgIH1cbiAgfVxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvdmlvbGV0LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtFQUNFLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG9CQUFvQjtFQUNwQixvQkFBb0I7RUFDcEIsb0JBQW9CO0FBQ3RCOztBQUVBO0VBQ0U7SUFDRTtNQUNFLCtDQUErQztNQUMvQywrQ0FBK0M7TUFDL0MsK0NBQStDO01BQy9DLDJDQUEyQztNQUMzQywyQ0FBMkM7TUFDM0MsK0NBQStDO01BQy9DLCtDQUErQztNQUMvQywrQ0FBK0M7TUFDL0MsK0NBQStDO01BQy9DLGdEQUFnRDtNQUNoRCxnREFBZ0Q7TUFDaEQsK0NBQStDO0lBQ2pEO0VBQ0Y7QUFDRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xcbiAgLS12aW9sZXQtMTogI2ZkZmNmZTtcXG4gIC0tdmlvbGV0LTI6ICNmYWY4ZmY7XFxuICAtLXZpb2xldC0zOiAjZjRmMGZlO1xcbiAgLS12aW9sZXQtNDogI2ViZTRmZjtcXG4gIC0tdmlvbGV0LTU6ICNlMWQ5ZmY7XFxuICAtLXZpb2xldC02OiAjZDRjYWZlO1xcbiAgLS12aW9sZXQtNzogI2MyYjVmNTtcXG4gIC0tdmlvbGV0LTg6ICNhYTk5ZWM7XFxuICAtLXZpb2xldC05OiAjNmU1NmNmO1xcbiAgLS12aW9sZXQtMTA6ICM2NTRkYzQ7XFxuICAtLXZpb2xldC0xMTogIzY1NTBiOTtcXG4gIC0tdmlvbGV0LTEyOiAjMmYyNjVmO1xcbn1cXG5cXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSkge1xcbiAgQG1lZGlhIChjb2xvci1nYW11dDogcDMpIHtcXG4gICAgOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcXG4gICAgICAtLXZpb2xldC0xOiBjb2xvcihkaXNwbGF5LXAzIDAuOTkxIDAuOTg4IDAuOTk1KTtcXG4gICAgICAtLXZpb2xldC0yOiBjb2xvcihkaXNwbGF5LXAzIDAuOTc4IDAuOTc0IDAuOTk4KTtcXG4gICAgICAtLXZpb2xldC0zOiBjb2xvcihkaXNwbGF5LXAzIDAuOTUzIDAuOTQzIDAuOTkzKTtcXG4gICAgICAtLXZpb2xldC00OiBjb2xvcihkaXNwbGF5LXAzIDAuOTE2IDAuODk3IDEpO1xcbiAgICAgIC0tdmlvbGV0LTU6IGNvbG9yKGRpc3BsYXktcDMgMC44NzYgMC44NTEgMSk7XFxuICAgICAgLS12aW9sZXQtNjogY29sb3IoZGlzcGxheS1wMyAwLjgyNSAwLjc5MyAwLjk4MSk7XFxuICAgICAgLS12aW9sZXQtNzogY29sb3IoZGlzcGxheS1wMyAwLjc1MiAwLjcxMiAwLjk0Myk7XFxuICAgICAgLS12aW9sZXQtODogY29sb3IoZGlzcGxheS1wMyAwLjY1NCAwLjYwMiAwLjkwMik7XFxuICAgICAgLS12aW9sZXQtOTogY29sb3IoZGlzcGxheS1wMyAwLjQxNyAwLjM0MSAwLjc4NCk7XFxuICAgICAgLS12aW9sZXQtMTA6IGNvbG9yKGRpc3BsYXktcDMgMC4zODEgMC4zMDYgMC43NDEpO1xcbiAgICAgIC0tdmlvbGV0LTExOiBjb2xvcihkaXNwbGF5LXAzIDAuMzgzIDAuMzE3IDAuNzAyKTtcXG4gICAgICAtLXZpb2xldC0xMjogY29sb3IoZGlzcGxheS1wMyAwLjE3OSAwLjE1IDAuMzU5KTtcXG4gICAgfVxcbiAgfVxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGBAY2hhcnNldCBcIlVURi04XCI7XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3LS1kb3duLWFycm93LCAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uOjpiZWZvcmUge1xuICBib3JkZXItY29sb3I6ICNjY2M7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIGJvcmRlci13aWR0aDogM3B4IDNweCAwIDA7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDlweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDZweDtcbiAgd2lkdGg6IDlweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyLXdyYXBwZXIge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogMDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXIge1xuICBmb250LWZhbWlseTogXCJIZWx2ZXRpY2EgTmV1ZVwiLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDAuOHJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY29sb3I6ICMwMDA7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNhZWFlYWU7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGxpbmUtaGVpZ2h0OiBpbml0aWFsO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5IC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciB7XG4gIGJvcmRlci1sZWZ0OiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXItLXRpbWUtb25seSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSxcbi5yZWFjdC1kYXRlcGlja2VyLS10aW1lLW9ubHkgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMC4zcmVtO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXIge1xuICB6LWluZGV4OiAxO1xuICBsaW5lLWhlaWdodDogMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlciAucmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGUge1xuICBzdHJva2U6ICNhZWFlYWU7XG59XG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXJbZGF0YS1wbGFjZW1lbnRePWJvdHRvbV0gLnJlYWN0LWRhdGVwaWNrZXJfX3RyaWFuZ2xlIHtcbiAgZmlsbDogI2YwZjBmMDtcbiAgY29sb3I6ICNmMGYwZjA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXJbZGF0YS1wbGFjZW1lbnRePXRvcF0gLnJlYWN0LWRhdGVwaWNrZXJfX3RyaWFuZ2xlIHtcbiAgZmlsbDogI2ZmZjtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWVhZWFlO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwLjNyZW07XG4gIHBhZGRpbmc6IDhweCAwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lIHtcbiAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgcGFkZGluZy1sZWZ0OiA1cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWU6bm90KC5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWUtLW9ubHkpIHtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXI6bm90KC5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLWhhcy10aW1lLXNlbGVjdCkge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi1jb250YWluZXItLXNlbGVjdCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi1jb250YWluZXItLXNlbGVjdCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2VsZWN0LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tY29udGFpbmVyLS1zY3JvbGwsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tY29udGFpbmVyLS1zY3JvbGwsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXItLXNjcm9sbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luOiAwIDE1cHg7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLFxuLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyLFxuLnJlYWN0LWRhdGVwaWNrZXIteWVhci1oZWFkZXIge1xuICBtYXJnaW4tdG9wOiAwO1xuICBjb2xvcjogIzAwMDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGZvbnQtc2l6ZTogMC45NDRyZW07XG59XG5cbmgyLnJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlciB7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbiB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDJweDtcbiAgcGFkZGluZzogMDtcbiAgYm9yZGVyOiBub25lO1xuICB6LWluZGV4OiAxO1xuICBoZWlnaHQ6IDMycHg7XG4gIHdpZHRoOiAzMnB4O1xuICB0ZXh0LWluZGVudDogLTk5OWVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXByZXZpb3VzIHtcbiAgbGVmdDogMnB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQge1xuICByaWdodDogMnB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLXdpdGgtdGltZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLXdpdGgtdG9kYXktYnV0dG9uKSB7XG4gIHJpZ2h0OiA4NXB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IDA7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzIHtcbiAgdG9wOiA0cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcge1xuICB0b3A6IC00cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbjpob3ZlciAqOjpiZWZvcmUge1xuICBib3JkZXItY29sb3I6ICNhNmE2YTY7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogLTFweDtcbiAgZm9udC1zaXplOiAyMHB4O1xuICB3aWR0aDogMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLW5leHQge1xuICBsZWZ0OiAtMnB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tbmV4dDo6YmVmb3JlIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICBsZWZ0OiAtN3B4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tcHJldmlvdXMge1xuICByaWdodDogLTJweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLXByZXZpb3VzOjpiZWZvcmUge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgyMjVkZWcpO1xuICByaWdodDogLTdweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWNvbnRhaW5lciB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhciB7XG4gIG1hcmdpbjogMC40cmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBtYXgtd2lkdGg6IDE4MHB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDRyZW07XG4gIG1hcmdpbjogMnB4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgge1xuICBtYXJnaW46IDAuNHJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoIC5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiA0cmVtO1xuICBtYXJnaW46IDJweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIHtcbiAgY2xlYXI6IGJvdGg7XG4gIHdpZHRoOiAxMDAlO1xuICBmbG9hdDogbGVmdDtcbiAgbWFyZ2luOiA1cHggMCAxMHB4IDE1cHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9fY2FwdGlvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4tbGVmdDogMTBweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXQge1xuICB3aWR0aDogYXV0bztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXRbdHlwZT10aW1lXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXRbdHlwZT10aW1lXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgbWFyZ2luOiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dFt0eXBlPXRpbWVdIHtcbiAgLW1vei1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2RlbGltaXRlciB7XG4gIG1hcmdpbi1sZWZ0OiA1cHg7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIHtcbiAgZmxvYXQ6IHJpZ2h0O1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNhZWFlYWU7XG4gIHdpZHRoOiA4NXB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyLS13aXRoLXRvZGF5LWJ1dHRvbiB7XG4gIGRpc3BsYXk6IGlubGluZTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2FlYWVhZTtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiAtODdweDtcbiAgdG9wOiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuM3JlbTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3gge1xuICB3aWR0aDogODVweDtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICBtYXJnaW46IDAgYXV0bztcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3Qge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBtYXJnaW46IDA7XG4gIGhlaWdodDogY2FsYygxOTVweCArIDEuN3JlbSAvIDIpO1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gIHBhZGRpbmctcmlnaHQ6IDA7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0ge1xuICBoZWlnaHQ6IDMwcHg7XG4gIHBhZGRpbmc6IDVweCAxMHB4O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW06aG92ZXIge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tc2VsZWN0ZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xuICBjb2xvcjogd2hpdGU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLXNlbGVjdGVkOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1kaXNhYmxlZCB7XG4gIGNvbG9yOiAjY2NjO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLWRpc2FibGVkOmhvdmVyIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyIHtcbiAgY29sb3I6ICNjY2M7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDEuN3JlbTtcbiAgbGluZS1oZWlnaHQ6IDEuN3JlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBtYXJnaW46IDAuMTY2cmVtO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1jbGlja2FibGUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXIucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWNsaWNrYWJsZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0ta2V5Ym9hcmQtc2VsZWN0ZWQpOmhvdmVyIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcbiAgY29sb3I6ICNmZmY7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0ta2V5Ym9hcmQtc2VsZWN0ZWQge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICMyYTg3ZDA7XG4gIGNvbG9yOiAjZmZmO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZXMge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBtYXJnaW4tYm90dG9tOiAtOHB4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2VlayB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZSxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1uYW1lIHtcbiAgY29sb3I6ICMwMDA7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDEuN3JlbTtcbiAgbGluZS1oZWlnaHQ6IDEuN3JlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBtYXJnaW46IDAuMTY2cmVtO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dCB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXk6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0OmhvdmVyIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tdG9kYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tdG9kYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS10b2RheSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXRvZGF5IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICMzZGNjNGE7XG4gIGNvbG9yOiAjZmZmO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMyYmUzZjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkLWN1c3RvbS0xLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0xLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMSB7XG4gIGNvbG9yOiBtYWdlbnRhO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0yIHtcbiAgY29sb3I6IGdyZWVuO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXMsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXMsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5cyxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjY4MDM7XG4gIGNvbG9yOiAjZmZmO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXMgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXMgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5cyAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzIC5vdmVybGF5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDEwMCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xuICBjb2xvcjogI2ZmZjtcbiAgcGFkZGluZzogNHB4O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwcywgb3BhY2l0eSAwLjNzIGVhc2UtaW4tb3V0O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXM6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXM6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5czpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NmNTMwMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1ob2xpZGF5czpob3ZlciAub3ZlcmxheSB7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIG9wYWNpdHk6IDE7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RlZCwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcbiAgY29sb3I6ICNmZmY7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RlZDpob3ZlciwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2U6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1zZWxlY3RlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1rZXlib2FyZC1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNiYWQ5ZjE7XG4gIGNvbG9yOiByZ2IoMCwgMCwgMCk7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1rZXlib2FyZC1zZWxlY3RlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMzMsIDEwNywgMTY1LCAwLjUpO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLCAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcbiAgY29sb3I6ICMwMDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWQge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIGNvbG9yOiAjY2NjO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tZGlzYWJsZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1kaXNhYmxlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZCAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZCAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWQgLm92ZXJsYXkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogNzAlO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcbiAgY29sb3I6ICNmZmY7XG4gIHBhZGRpbmc6IDRweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMHMsIG9wYWNpdHkgMC4zcyBlYXNlLWluLW91dDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMTAwJTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX2NhbGVuZGFyLWljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHBhZGRpbmc6IDAuNXJlbTtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX192aWV3LWNhbGVuZGFyLWljb24gaW5wdXQge1xuICBwYWRkaW5nOiA2cHggMTBweCA1cHggMjVweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldyB7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldzpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXc6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXc6aG92ZXIge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyB7XG4gIGJvcmRlci10b3AtY29sb3I6ICNiM2IzYjM7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3LS1kb3duLWFycm93IHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTtcbiAgcmlnaHQ6IC0xNnB4O1xuICB0b3A6IDA7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiA1MCU7XG4gIGxlZnQ6IDI1JTtcbiAgdG9wOiAzMHB4O1xuICB6LWluZGV4OiAxO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2FlYWVhZTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd246aG92ZXIge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi0tc2Nyb2xsYWJsZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi0tc2Nyb2xsYWJsZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLS1zY3JvbGxhYmxlIHtcbiAgaGVpZ2h0OiAxNTBweDtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb24sXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uIHtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpmaXJzdC1vZi10eXBlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpmaXJzdC1vZi10eXBlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmZpcnN0LW9mLXR5cGUge1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwLjNyZW07XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwLjNyZW07XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246bGFzdC1vZi10eXBlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpsYXN0LW9mLXR5cGUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246bGFzdC1vZi10eXBlIHtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAuM3JlbTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuM3JlbTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyB7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiM2IzYjM7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2IzYjNiMztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbi0tc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbi0tc2VsZWN0ZWQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDE1cHg7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiAwO1xuICBvdXRsaW5lOiAwO1xuICBwYWRkaW5nOiAwIDZweCAwIDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb246OmFmdGVyIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xuICBjb2xvcjogI2ZmZjtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBoZWlnaHQ6IDE2cHg7XG4gIHdpZHRoOiAxNnB4O1xuICBwYWRkaW5nOiAycHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgY29udGVudDogXCLDl1wiO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb24tLWRpc2FibGVkIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb24tLWRpc2FibGVkOjphZnRlciB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYztcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3RvZGF5LWJ1dHRvbiB7XG4gIGJhY2tncm91bmQ6ICNmMGYwZjA7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYWVhZWFlO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHBhZGRpbmc6IDVweCAwO1xuICBjbGVhcjogbGVmdDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgd2lkdGg6IDEwMHZ3O1xuICBoZWlnaHQ6IDEwMHZoO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHotaW5kZXg6IDIxNDc0ODM2NDc7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZSxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbmFtZSB7XG4gIHdpZHRoOiAzcmVtO1xuICBsaW5lLWhlaWdodDogM3JlbTtcbn1cbkBtZWRpYSAobWF4LXdpZHRoOiA0MDBweCksIChtYXgtaGVpZ2h0OiA1NTBweCkge1xuICAucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZSxcbiAgLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxuICAucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLW5hbWUge1xuICAgIHdpZHRoOiAycmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAycmVtO1xuICB9XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19oZWFkZXIge1xuICBmb250LXNpemU6IDEuNDRyZW07XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19jaGlsZHJlbi1jb250YWluZXIge1xuICB3aWR0aDogMTMuOHJlbTtcbiAgbWFyZ2luOiAwLjRyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuMnJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwLjJyZW07XG4gIGhlaWdodDogYXV0bztcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2FyaWEtbGl2ZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgY2xpcC1wYXRoOiBjaXJjbGUoMCk7XG4gIGJvcmRlcjogMDtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMDtcbiAgd2lkdGg6IDFweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2NhbGVuZGFyLWljb24ge1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtO1xufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9kaXN0L3JlYWN0LWRhdGVwaWNrZXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLGdCQUFnQjtBQUNoQjs7O0VBR0Usa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQix5QkFBeUI7RUFDekIsV0FBVztFQUNYLGNBQWM7RUFDZCxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLFFBQVE7RUFDUixVQUFVO0FBQ1o7QUFDQTtFQUNFLHFCQUFxQjtFQUNyQixVQUFVO0VBQ1YsU0FBUztBQUNYOztBQUVBO0VBQ0UsMkRBQTJEO0VBQzNELGlCQUFpQjtFQUNqQixzQkFBc0I7RUFDdEIsV0FBVztFQUNYLHlCQUF5QjtFQUN6QixxQkFBcUI7RUFDckIscUJBQXFCO0VBQ3JCLGtCQUFrQjtFQUNsQixvQkFBb0I7QUFDdEI7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCO0FBQ0E7O0VBRUUsaUNBQWlDO0VBQ2pDLGtDQUFrQztBQUNwQzs7QUFFQTtFQUNFLFVBQVU7RUFDVixjQUFjO0FBQ2hCO0FBQ0E7RUFDRSxlQUFlO0FBQ2pCO0FBQ0E7RUFDRSxhQUFhO0VBQ2IsY0FBYztBQUNoQjtBQUNBO0VBQ0UsVUFBVTtFQUNWLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQix5QkFBeUI7RUFDekIsZ0NBQWdDO0VBQ2hDLDhCQUE4QjtFQUM5QixjQUFjO0VBQ2Qsa0JBQWtCO0FBQ3BCO0FBQ0E7RUFDRSxtQkFBbUI7RUFDbkIsaUJBQWlCO0VBQ2pCLGtCQUFrQjtBQUNwQjtBQUNBO0VBQ0UseUJBQXlCO0FBQzNCO0FBQ0E7RUFDRSwrQkFBK0I7QUFDakM7O0FBRUE7Ozs7OztFQU1FLHFCQUFxQjtFQUNyQixjQUFjO0FBQ2hCOztBQUVBOzs7RUFHRSxhQUFhO0VBQ2IsV0FBVztFQUNYLGlCQUFpQjtFQUNqQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxVQUFVO0VBQ1YsU0FBUztBQUNYOztBQUVBO0VBQ0UsdUJBQXVCO0VBQ3ZCLG1CQUFtQjtFQUNuQixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxtQkFBbUI7RUFDbkIsZ0JBQWdCO0VBQ2hCLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsa0JBQWtCO0VBQ2xCLGVBQWU7RUFDZixrQkFBa0I7RUFDbEIsUUFBUTtFQUNSLFVBQVU7RUFDVixZQUFZO0VBQ1osVUFBVTtFQUNWLFlBQVk7RUFDWixXQUFXO0VBQ1gsbUJBQW1CO0VBQ25CLGdCQUFnQjtBQUNsQjtBQUNBO0VBQ0UsU0FBUztBQUNYO0FBQ0E7RUFDRSxVQUFVO0FBQ1o7QUFDQTtFQUNFLFdBQVc7QUFDYjtBQUNBO0VBQ0Usa0JBQWtCO0VBQ2xCLE1BQU07RUFDTixjQUFjO0VBQ2QsaUJBQWlCO0VBQ2pCLGtCQUFrQjtBQUNwQjtBQUNBO0VBQ0UsUUFBUTtBQUNWO0FBQ0E7RUFDRSxTQUFTO0FBQ1g7QUFDQTtFQUNFLHFCQUFxQjtBQUN2Qjs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixTQUFTO0VBQ1QsZUFBZTtFQUNmLFFBQVE7QUFDVjtBQUNBO0VBQ0UsVUFBVTtBQUNaO0FBQ0E7RUFDRSx3QkFBd0I7RUFDeEIsVUFBVTtBQUNaO0FBQ0E7RUFDRSxXQUFXO0FBQ2I7QUFDQTtFQUNFLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxXQUFXO0FBQ2I7O0FBRUE7RUFDRSxjQUFjO0VBQ2Qsa0JBQWtCO0FBQ3BCO0FBQ0E7RUFDRSxhQUFhO0VBQ2IsZUFBZTtFQUNmLGdCQUFnQjtBQUNsQjtBQUNBO0VBQ0UscUJBQXFCO0VBQ3JCLFdBQVc7RUFDWCxXQUFXO0FBQ2I7O0FBRUE7RUFDRSxjQUFjO0VBQ2Qsa0JBQWtCO0FBQ3BCO0FBQ0E7O0VBRUUscUJBQXFCO0VBQ3JCLFdBQVc7RUFDWCxXQUFXO0FBQ2I7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsV0FBVztFQUNYLFdBQVc7RUFDWCx1QkFBdUI7RUFDdkIsZ0JBQWdCO0FBQ2xCO0FBQ0E7RUFDRSxxQkFBcUI7QUFDdkI7QUFDQTtFQUNFLHFCQUFxQjtBQUN2QjtBQUNBO0VBQ0UscUJBQXFCO0VBQ3JCLGlCQUFpQjtBQUNuQjtBQUNBO0VBQ0UsV0FBVztBQUNiO0FBQ0E7O0VBRUUsd0JBQXdCO0VBQ3hCLFNBQVM7QUFDWDtBQUNBO0VBQ0UsMEJBQTBCO0FBQzVCO0FBQ0E7RUFDRSxnQkFBZ0I7RUFDaEIscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0UsWUFBWTtFQUNaLDhCQUE4QjtFQUM5QixXQUFXO0FBQ2I7QUFDQTtFQUNFLGVBQWU7RUFDZix5QkFBeUI7RUFDekIscUJBQXFCO0VBQ3JCLGtCQUFrQjtFQUNsQixZQUFZO0VBQ1osTUFBTTtBQUNSO0FBQ0E7RUFDRSxrQkFBa0I7RUFDbEIsaUJBQWlCO0VBQ2pCLGtDQUFrQztBQUNwQztBQUNBO0VBQ0UsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixjQUFjO0VBQ2Qsa0JBQWtCO0VBQ2xCLGtDQUFrQztBQUNwQztBQUNBO0VBQ0UsZ0JBQWdCO0VBQ2hCLFNBQVM7RUFDVCxnQ0FBZ0M7RUFDaEMsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQixlQUFlO0VBQ2YsV0FBVztFQUNYLHVCQUF1QjtBQUN6QjtBQUNBO0VBQ0UsWUFBWTtFQUNaLGlCQUFpQjtFQUNqQixtQkFBbUI7QUFDckI7QUFDQTtFQUNFLGVBQWU7RUFDZix5QkFBeUI7QUFDM0I7QUFDQTtFQUNFLHlCQUF5QjtFQUN6QixZQUFZO0VBQ1osaUJBQWlCO0FBQ25CO0FBQ0E7RUFDRSx5QkFBeUI7QUFDM0I7QUFDQTtFQUNFLFdBQVc7QUFDYjtBQUNBO0VBQ0UsZUFBZTtFQUNmLDZCQUE2QjtBQUMvQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxxQkFBcUI7RUFDckIsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIsZ0JBQWdCO0FBQ2xCO0FBQ0E7RUFDRSxlQUFlO0FBQ2pCO0FBQ0E7O0VBRUUscUJBQXFCO0VBQ3JCLHlCQUF5QjtBQUMzQjtBQUNBO0VBQ0UscUJBQXFCO0VBQ3JCLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7QUFDQTtFQUNFLHlCQUF5QjtBQUMzQjtBQUNBO0VBQ0UscUJBQXFCO0VBQ3JCLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7QUFDQTtFQUNFLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxtQkFBbUI7QUFDckI7O0FBRUE7OztFQUdFLFdBQVc7RUFDWCxxQkFBcUI7RUFDckIsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIsZ0JBQWdCO0FBQ2xCOztBQUVBOzs7O0VBSUUsZUFBZTtBQUNqQjtBQUNBOzs7O0VBSUUscUJBQXFCO0VBQ3JCLHlCQUF5QjtBQUMzQjtBQUNBOzs7O0VBSUUsaUJBQWlCO0FBQ25CO0FBQ0E7Ozs7RUFJRSxxQkFBcUI7RUFDckIseUJBQXlCO0VBQ3pCLFdBQVc7QUFDYjtBQUNBOzs7O0VBSUUseUJBQXlCO0FBQzNCO0FBQ0E7Ozs7RUFJRSxjQUFjO0FBQ2hCO0FBQ0E7Ozs7RUFJRSxZQUFZO0FBQ2Q7QUFDQTs7OztFQUlFLGtCQUFrQjtFQUNsQixxQkFBcUI7RUFDckIseUJBQXlCO0VBQ3pCLFdBQVc7QUFDYjtBQUNBOzs7O0VBSUUsa0JBQWtCO0VBQ2xCLFlBQVk7RUFDWixTQUFTO0VBQ1QsMkJBQTJCO0VBQzNCLHNCQUFzQjtFQUN0QixXQUFXO0VBQ1gsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLFVBQVU7RUFDVixtREFBbUQ7QUFDckQ7QUFDQTs7OztFQUlFLHlCQUF5QjtBQUMzQjtBQUNBOzs7O0VBSUUsbUJBQW1CO0VBQ25CLFVBQVU7QUFDWjtBQUNBOzs7Ozs7Ozs7O0VBVUUscUJBQXFCO0VBQ3JCLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7QUFDQTs7Ozs7Ozs7OztFQVVFLHlCQUF5QjtBQUMzQjtBQUNBOzs7O0VBSUUscUJBQXFCO0VBQ3JCLHlCQUF5QjtFQUN6QixtQkFBbUI7QUFDckI7QUFDQTs7OztFQUlFLHlCQUF5QjtBQUMzQjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0VBZ0JFLHlDQUF5QztBQUMzQztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBK0JFLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7QUFDQTs7OztFQUlFLGVBQWU7RUFDZixXQUFXO0FBQ2I7QUFDQTs7OztFQUlFLDZCQUE2QjtBQUMvQjtBQUNBOzs7O0VBSUUsa0JBQWtCO0VBQ2xCLFdBQVc7RUFDWCxTQUFTO0VBQ1QsMkJBQTJCO0VBQzNCLHNCQUFzQjtFQUN0QixXQUFXO0VBQ1gsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLFVBQVU7RUFDVixtREFBbUQ7QUFDckQ7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIscUJBQXFCO0VBQ3JCLFdBQVc7QUFDYjtBQUNBO0VBQ0Usa0JBQWtCO0VBQ2xCLGVBQWU7RUFDZix1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSwwQkFBMEI7QUFDNUI7O0FBRUE7OztFQUdFLDZCQUE2QjtFQUM3QixxQkFBcUI7RUFDckIsa0JBQWtCO0FBQ3BCO0FBQ0E7OztFQUdFLGVBQWU7QUFDakI7QUFDQTs7Ozs7O0VBTUUseUJBQXlCO0FBQzNCO0FBQ0E7OztFQUdFLHlCQUF5QjtFQUN6QixZQUFZO0VBQ1osTUFBTTtBQUNSOztBQUVBOzs7RUFHRSx5QkFBeUI7RUFDekIsa0JBQWtCO0VBQ2xCLFVBQVU7RUFDVixTQUFTO0VBQ1QsU0FBUztFQUNULFVBQVU7RUFDVixrQkFBa0I7RUFDbEIscUJBQXFCO0VBQ3JCLHlCQUF5QjtBQUMzQjtBQUNBOzs7RUFHRSxlQUFlO0FBQ2pCO0FBQ0E7OztFQUdFLGFBQWE7RUFDYixrQkFBa0I7QUFDcEI7O0FBRUE7OztFQUdFLGlCQUFpQjtFQUNqQixXQUFXO0VBQ1gsY0FBYztFQUNkLGlCQUFpQjtFQUNqQixrQkFBa0I7QUFDcEI7QUFDQTs7O0VBR0UsOEJBQThCO0VBQzlCLCtCQUErQjtBQUNqQztBQUNBOzs7RUFHRSx5QkFBeUI7RUFHekIsaUJBQWlCO0VBQ2pCLGlDQUFpQztFQUNqQyxrQ0FBa0M7QUFDcEM7QUFDQTs7O0VBR0Usc0JBQXNCO0FBQ3hCO0FBQ0E7OztFQUdFLDRCQUE0QjtBQUM5QjtBQUNBOzs7RUFHRSx5QkFBeUI7QUFDM0I7QUFDQTs7O0VBR0Usa0JBQWtCO0VBQ2xCLFVBQVU7QUFDWjs7QUFFQTtFQUNFLGVBQWU7RUFDZiw2QkFBNkI7RUFDN0IsU0FBUztFQUNULFVBQVU7RUFDVixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLE1BQU07RUFDTixRQUFRO0VBQ1IsWUFBWTtFQUNaLG1CQUFtQjtFQUNuQixzQkFBc0I7QUFDeEI7QUFDQTtFQUNFLGVBQWU7RUFDZix5QkFBeUI7RUFDekIsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixZQUFZO0VBQ1osV0FBVztFQUNYLFlBQVk7RUFDWixlQUFlO0VBQ2YsY0FBYztFQUNkLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsc0JBQXNCO0VBQ3RCLFlBQVk7QUFDZDtBQUNBO0VBQ0UsZUFBZTtBQUNqQjtBQUNBO0VBQ0UsZUFBZTtFQUNmLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQiw2QkFBNkI7RUFDN0IsZUFBZTtFQUNmLGtCQUFrQjtFQUNsQixpQkFBaUI7RUFDakIsY0FBYztFQUNkLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGVBQWU7RUFDZixZQUFZO0VBQ1osYUFBYTtFQUNiLG9DQUFvQztFQUNwQyxPQUFPO0VBQ1AsTUFBTTtFQUNOLHVCQUF1QjtFQUN2QixtQkFBbUI7RUFDbkIsYUFBYTtFQUNiLG1CQUFtQjtBQUNyQjtBQUNBOzs7RUFHRSxXQUFXO0VBQ1gsaUJBQWlCO0FBQ25CO0FBQ0E7RUFDRTs7O0lBR0UsV0FBVztJQUNYLGlCQUFpQjtFQUNuQjtBQUNGO0FBQ0E7O0VBRUUsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsY0FBYztFQUNkLGNBQWM7RUFDZCxxQkFBcUI7RUFDckIsb0JBQW9CO0VBQ3BCLFlBQVk7QUFDZDs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixvQkFBb0I7RUFDcEIsU0FBUztFQUNULFdBQVc7RUFDWCxZQUFZO0VBQ1osZ0JBQWdCO0VBQ2hCLFVBQVU7RUFDVixVQUFVO0VBQ1YsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsVUFBVTtFQUNWLFdBQVc7RUFDWCx3QkFBd0I7QUFDMUJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiQGNoYXJzZXQgXFxcIlVURi04XFxcIjtcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb246OmJlZm9yZSB7XFxuICBib3JkZXItY29sb3I6ICNjY2M7XFxuICBib3JkZXItc3R5bGU6IHNvbGlkO1xcbiAgYm9yZGVyLXdpZHRoOiAzcHggM3B4IDAgMDtcXG4gIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBoZWlnaHQ6IDlweDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogNnB4O1xcbiAgd2lkdGg6IDlweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXItd3JhcHBlciB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBwYWRkaW5nOiAwO1xcbiAgYm9yZGVyOiAwO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlciB7XFxuICBmb250LWZhbWlseTogXFxcIkhlbHZldGljYSBOZXVlXFxcIiwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc2l6ZTogMC44cmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgYm9yZGVyOiAxcHggc29saWQgI2FlYWVhZTtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGxpbmUtaGVpZ2h0OiBpbml0aWFsO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5IC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciB7XFxuICBib3JkZXItbGVmdDogMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXItLXRpbWUtb25seSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSxcXG4ucmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5IC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB7XFxuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwLjNyZW07XFxuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXIge1xcbiAgei1pbmRleDogMTtcXG4gIGxpbmUtaGVpZ2h0OiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RyaWFuZ2xlIHtcXG4gIHN0cm9rZTogI2FlYWVhZTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXItcG9wcGVyW2RhdGEtcGxhY2VtZW50Xj1ib3R0b21dIC5yZWFjdC1kYXRlcGlja2VyX190cmlhbmdsZSB7XFxuICBmaWxsOiAjZjBmMGYwO1xcbiAgY29sb3I6ICNmMGYwZjA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlcltkYXRhLXBsYWNlbWVudF49dG9wXSAucmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGUge1xcbiAgZmlsbDogI2ZmZjtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2FlYWVhZTtcXG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuM3JlbTtcXG4gIHBhZGRpbmc6IDhweCAwO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lIHtcXG4gIHBhZGRpbmctYm90dG9tOiA4cHg7XFxuICBwYWRkaW5nLWxlZnQ6IDVweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZS0tb25seSkge1xcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlcjpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0taGFzLXRpbWUtc2VsZWN0KSB7XFxuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi1jb250YWluZXItLXNlbGVjdCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tY29udGFpbmVyLS1zZWxlY3QsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tY29udGFpbmVyLS1zZWxlY3QsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tY29udGFpbmVyLS1zY3JvbGwsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLWNvbnRhaW5lci0tc2Nyb2xsLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2Nyb2xsIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIG1hcmdpbjogMCAxNXB4O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aCxcXG4ucmVhY3QtZGF0ZXBpY2tlci10aW1lX19oZWFkZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXIteWVhci1oZWFkZXIge1xcbiAgbWFyZ2luLXRvcDogMDtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICBmb250LXNpemU6IDAuOTQ0cmVtO1xcbn1cXG5cXG5oMi5yZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoIHtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlciB7XFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbiB7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMnB4O1xcbiAgcGFkZGluZzogMDtcXG4gIGJvcmRlcjogbm9uZTtcXG4gIHotaW5kZXg6IDE7XFxuICBoZWlnaHQ6IDMycHg7XFxuICB3aWR0aDogMzJweDtcXG4gIHRleHQtaW5kZW50OiAtOTk5ZW07XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tcHJldmlvdXMge1xcbiAgbGVmdDogMnB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dCB7XFxuICByaWdodDogMnB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10aW1lOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10b2RheS1idXR0b24pIHtcXG4gIHJpZ2h0OiA4NXB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgdG9wOiAwO1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzIHtcXG4gIHRvcDogNHB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcge1xcbiAgdG9wOiAtNHB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbjpob3ZlciAqOjpiZWZvcmUge1xcbiAgYm9yZGVyLWNvbG9yOiAjYTZhNmE2O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHRvcDogLTFweDtcXG4gIGZvbnQtc2l6ZTogMjBweDtcXG4gIHdpZHRoOiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1uZXh0IHtcXG4gIGxlZnQ6IC0ycHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLW5leHQ6OmJlZm9yZSB7XFxuICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XFxuICBsZWZ0OiAtN3B4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1wcmV2aW91cyB7XFxuICByaWdodDogLTJweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tcHJldmlvdXM6OmJlZm9yZSB7XFxuICB0cmFuc2Zvcm06IHJvdGF0ZSgyMjVkZWcpO1xcbiAgcmlnaHQ6IC03cHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1jb250YWluZXIge1xcbiAgZmxvYXQ6IGxlZnQ7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyIHtcXG4gIG1hcmdpbjogMC40cmVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci13cmFwcGVyIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmbGV4LXdyYXA6IHdyYXA7XFxuICBtYXgtd2lkdGg6IDE4MHB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0IHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdpZHRoOiA0cmVtO1xcbiAgbWFyZ2luOiAycHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aCB7XFxuICBtYXJnaW46IDAuNHJlbTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aCAucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0IHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdpZHRoOiA0cmVtO1xcbiAgbWFyZ2luOiAycHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciB7XFxuICBjbGVhcjogYm90aDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgZmxvYXQ6IGxlZnQ7XFxuICBtYXJnaW46IDVweCAwIDEwcHggMTVweDtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19jYXB0aW9uIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXQge1xcbiAgd2lkdGg6IGF1dG87XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXRbdHlwZT10aW1lXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IGlucHV0W3R5cGU9dGltZV06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgbWFyZ2luOiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IGlucHV0W3R5cGU9dGltZV0ge1xcbiAgLW1vei1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9fZGVsaW1pdGVyIHtcXG4gIG1hcmdpbi1sZWZ0OiA1cHg7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciB7XFxuICBmbG9hdDogcmlnaHQ7XFxuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNhZWFlYWU7XFxuICB3aWR0aDogODVweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyLS13aXRoLXRvZGF5LWJ1dHRvbiB7XFxuICBkaXNwbGF5OiBpbmxpbmU7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjYWVhZWFlO1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IC04N3B4O1xcbiAgdG9wOiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgYmFja2dyb3VuZDogd2hpdGU7XFxuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHtcXG4gIHdpZHRoOiA4NXB4O1xcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xcbiAgbWFyZ2luOiAwIGF1dG87XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCB7XFxuICBsaXN0LXN0eWxlOiBub25lO1xcbiAgbWFyZ2luOiAwO1xcbiAgaGVpZ2h0OiBjYWxjKDE5NXB4ICsgMS43cmVtIC8gMik7XFxuICBvdmVyZmxvdy15OiBzY3JvbGw7XFxuICBwYWRkaW5nLXJpZ2h0OiAwO1xcbiAgcGFkZGluZy1sZWZ0OiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0ge1xcbiAgaGVpZ2h0OiAzMHB4O1xcbiAgcGFkZGluZzogNXB4IDEwcHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbTpob3ZlciB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tc2VsZWN0ZWQge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcXG4gIGNvbG9yOiB3aGl0ZTtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLWRpc2FibGVkIHtcXG4gIGNvbG9yOiAjY2NjO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tZGlzYWJsZWQ6aG92ZXIge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlciB7XFxuICBjb2xvcjogI2NjYztcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdpZHRoOiAxLjdyZW07XFxuICBsaW5lLWhlaWdodDogMS43cmVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgbWFyZ2luOiAwLjE2NnJlbTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1jbGlja2FibGUge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXIucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWNsaWNrYWJsZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkKTpob3ZlciB7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZDpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyYTg3ZDA7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZDpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWVzIHtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBtYXJnaW4tYm90dG9tOiAtOHB4O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2VlayB7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1uYW1lIHtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgd2lkdGg6IDEuN3JlbTtcXG4gIGxpbmUtaGVpZ2h0OiAxLjdyZW07XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBtYXJnaW46IDAuMTY2cmVtO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dCB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXk6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0OmhvdmVyIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLXRvZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS10b2RheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS10b2RheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS10b2RheSB7XFxuICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzZGNjNGE7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzMmJlM2Y7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkLWN1c3RvbS0xLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMSB7XFxuICBjb2xvcjogbWFnZW50YTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0yLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0yLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0yIHtcXG4gIGNvbG9yOiBncmVlbjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXMsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjY4MDM7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXMgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzIC5vdmVybGF5IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJvdHRvbTogMTAwJTtcXG4gIGxlZnQ6IDUwJTtcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XFxuICBjb2xvcjogI2ZmZjtcXG4gIHBhZGRpbmc6IDRweDtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICB2aXNpYmlsaXR5OiBoaWRkZW47XFxuICBvcGFjaXR5OiAwO1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwcywgb3BhY2l0eSAwLjNzIGVhc2UtaW4tb3V0O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5czpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXM6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXM6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXM6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NmNTMwMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5IHtcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RlZCwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSB7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xcbiAgY29sb3I6ICNmZmY7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkOmhvdmVyLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZTpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1zZWxlY3RlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2U6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWtleWJvYXJkLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZCB7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmFkOWYxO1xcbiAgY29sb3I6IHJnYigwLCAwLCAwKTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSkge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgzMywgMTA3LCAxNjUsIDAuNSk7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSwgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xcbiAgY29sb3I6ICMwMDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1kaXNhYmxlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1kaXNhYmxlZCB7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxuICBjb2xvcjogI2NjYztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZCAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tZGlzYWJsZWQgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tZGlzYWJsZWQgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWQgLm92ZXJsYXkge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm90dG9tOiA3MCU7XFxuICBsZWZ0OiA1MCU7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xcbiAgY29sb3I6ICNmZmY7XFxuICBwYWRkaW5nOiA0cHg7XFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgb3BhY2l0eTogMDtcXG4gIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMHMsIG9wYWNpdHkgMC4zcyBlYXNlLWluLW91dDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lciB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogMTAwJTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fY2FsZW5kYXItaWNvbiB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBwYWRkaW5nOiAwLjVyZW07XFxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3ZpZXctY2FsZW5kYXItaWNvbiBpbnB1dCB7XFxuICBwYWRkaW5nOiA2cHggMTBweCA1cHggMjVweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXcsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3IHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXc6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldzpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXc6aG92ZXIge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93IHtcXG4gIGJvcmRlci10b3AtY29sb3I6ICNiM2IzYjM7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyB7XFxuICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpO1xcbiAgcmlnaHQ6IC0xNnB4O1xcbiAgdG9wOiAwO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24sXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHdpZHRoOiA1MCU7XFxuICBsZWZ0OiAyNSU7XFxuICB0b3A6IDMwcHg7XFxuICB6LWluZGV4OiAxO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYm9yZGVyOiAxcHggc29saWQgI2FlYWVhZTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd246aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duOmhvdmVyIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tLXNjcm9sbGFibGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLS1zY3JvbGxhYmxlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLS1zY3JvbGxhYmxlIHtcXG4gIGhlaWdodDogMTUwcHg7XFxuICBvdmVyZmxvdy15OiBzY3JvbGw7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbiB7XFxuICBsaW5lLWhlaWdodDogMjBweDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmZpcnN0LW9mLXR5cGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpmaXJzdC1vZi10eXBlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpmaXJzdC1vZi10eXBlIHtcXG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuM3JlbTtcXG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwLjNyZW07XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpsYXN0LW9mLXR5cGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpsYXN0LW9mLXR5cGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmxhc3Qtb2YtdHlwZSB7XFxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcbiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcXG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMC4zcmVtO1xcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuM3JlbTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyB7XFxuICBib3JkZXItYm90dG9tLWNvbG9yOiAjYjNiM2IzO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMge1xcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2IzYjNiMztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLS1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLS1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb24tLXNlbGVjdGVkIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDE1cHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyOiAwO1xcbiAgb3V0bGluZTogMDtcXG4gIHBhZGRpbmc6IDAgNnB4IDAgMDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMDtcXG4gIHJpZ2h0OiAwO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uOjphZnRlciB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xcbiAgY29sb3I6ICNmZmY7XFxuICBib3JkZXItcmFkaXVzOiA1MCU7XFxuICBoZWlnaHQ6IDE2cHg7XFxuICB3aWR0aDogMTZweDtcXG4gIHBhZGRpbmc6IDJweDtcXG4gIGZvbnQtc2l6ZTogMTJweDtcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBjb250ZW50OiBcXFwiw5dcXFwiO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbi0tZGlzYWJsZWQge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbi0tZGlzYWJsZWQ6OmFmdGVyIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX190b2RheS1idXR0b24ge1xcbiAgYmFja2dyb3VuZDogI2YwZjBmMDtcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYWVhZWFlO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICBwYWRkaW5nOiA1cHggMDtcXG4gIGNsZWFyOiBsZWZ0O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIHtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIHdpZHRoOiAxMDB2dztcXG4gIGhlaWdodDogMTAwdmg7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiAwO1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgZGlzcGxheTogZmxleDtcXG4gIHotaW5kZXg6IDIxNDc0ODM2NDc7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lLFxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLW5hbWUge1xcbiAgd2lkdGg6IDNyZW07XFxuICBsaW5lLWhlaWdodDogM3JlbTtcXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDQwMHB4KSwgKG1heC1oZWlnaHQ6IDU1MHB4KSB7XFxuICAucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZSxcXG4gIC5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcXG4gIC5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbmFtZSB7XFxuICAgIHdpZHRoOiAycmVtO1xcbiAgICBsaW5lLWhlaWdodDogMnJlbTtcXG4gIH1cXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlciB7XFxuICBmb250LXNpemU6IDEuNDRyZW07XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19jaGlsZHJlbi1jb250YWluZXIge1xcbiAgd2lkdGg6IDEzLjhyZW07XFxuICBtYXJnaW46IDAuNHJlbTtcXG4gIHBhZGRpbmctcmlnaHQ6IDAuMnJlbTtcXG4gIHBhZGRpbmctbGVmdDogMC4ycmVtO1xcbiAgaGVpZ2h0OiBhdXRvO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fYXJpYS1saXZlIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGNsaXAtcGF0aDogY2lyY2xlKDApO1xcbiAgYm9yZGVyOiAwO1xcbiAgaGVpZ2h0OiAxcHg7XFxuICBtYXJnaW46IC0xcHg7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgcGFkZGluZzogMDtcXG4gIHdpZHRoOiAxcHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2FsZW5kYXItaWNvbiB7XFxuICB3aWR0aDogMWVtO1xcbiAgaGVpZ2h0OiAxZW07XFxuICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTI1ZW07XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fIGZyb20gXCIuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzBfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0lMjcyNCUyNyBoZWlnaHQ9JTI3MjQlMjcgc3Ryb2tlPSUyNyUyMzAwMCUyNyB2aWV3Qm94PSUyNzAgMCAyNCAyNCUyNyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyUzRSUzQ3N0eWxlJTNFLnNwaW5uZXJfVjhtMSU3QnRyYW5zZm9ybS1vcmlnaW46Y2VudGVyO2FuaW1hdGlvbjpzcGlubmVyX3pLb2EgMnMgbGluZWFyIGluZmluaXRlJTdELnNwaW5uZXJfVjhtMSBjaXJjbGUlN0JzdHJva2UtbGluZWNhcDpyb3VuZDthbmltYXRpb246c3Bpbm5lcl9ZcFpTIDEuNXMgZWFzZS1vdXQgaW5maW5pdGUlN0QlNDBrZXlmcmFtZXMgc3Bpbm5lcl96S29hJTdCMTAwJTI1JTdCdHJhbnNmb3JtOnJvdGF0ZSUyODM2MGRlZyUyOSU3RCU3RCU0MGtleWZyYW1lcyBzcGlubmVyX1lwWlMlN0IwJTI1JTdCc3Ryb2tlLWRhc2hhcnJheTowIDE1MDtzdHJva2UtZGFzaG9mZnNldDowJTdENDcuNSUyNSU3QnN0cm9rZS1kYXNoYXJyYXk6NDIgMTUwO3N0cm9rZS1kYXNob2Zmc2V0Oi0xNiU3RDk1JTI1JTJDMTAwJTI1JTdCc3Ryb2tlLWRhc2hhcnJheTo0MiAxNTA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTU5JTdEJTdEJTNDJTJGc3R5bGUlM0UlM0NnIGNsYXNzPSUyN3NwaW5uZXJfVjhtMSUyNyUzRSUzQ2NpcmNsZSBjeD0lMjcxMiUyNyBjeT0lMjcxMiUyNyByPSUyNzkuNSUyNyBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjclM0UlM0MlMkZjaXJjbGUlM0UlM0MlMkZnJTNFJTNDJTJGc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB4bWxuczp4bGluaz0lMjdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJTI3IHN0eWxlPSUyN3NoYXBlLXJlbmRlcmluZzogYXV0bzslMjcgd2lkdGg9JTI3MjAwcHglMjcgaGVpZ2h0PSUyNzIwMHB4JTI3IHZpZXdCb3g9JTI3MCAwIDEwMCAxMDAlMjcgcHJlc2VydmVBc3BlY3RSYXRpbz0lMjd4TWlkWU1pZCUyNyUzRSUzQ3BhdGggZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjMwYTBhMGElMjcgc3Ryb2tlLXdpZHRoPSUyNzEwJTI3IHN0cm9rZS1kYXNoYXJyYXk9JTI3MjA1LjI3MTE0MjU3ODEyNSA1MS4zMTc3ODU2NDQ1MzEyNTYlMjcgZD0lMjdNMjQuMyAzMEMxMS40IDMwIDUgNDMuMyA1IDUwczYuNCAyMCAxOS4zIDIwYzE5LjMgMCAzMi4xLTQwIDUxLjQtNDAgQzg4LjYgMzAgOTUgNDMuMyA5NSA1MHMtNi40IDIwLTE5LjMgMjBDNTYuNCA3MCA0My42IDMwIDI0LjMgMzB6JTI3IHN0cm9rZS1saW5lY2FwPSUyN3JvdW5kJTI3IHN0eWxlPSUyN3RyYW5zZm9ybTpzY2FsZSUyODAuOCUyOTt0cmFuc2Zvcm0tb3JpZ2luOjUwcHggNTBweCUyNyUzRSUzQ2FuaW1hdGUgYXR0cmlidXRlTmFtZT0lMjdzdHJva2UtZGFzaG9mZnNldCUyNyByZXBlYXRDb3VudD0lMjdpbmRlZmluaXRlJTI3IGR1cj0lMjcycyUyNyBrZXlUaW1lcz0lMjcwOzElMjcgdmFsdWVzPSUyNzA7MjU2LjU4ODkyODIyMjY1NjI1JTI3JTNFJTNDL2FuaW1hdGUlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMl9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQVNFbEVRVlI0bkdOZ3dBTWtKU1VicEtTa092Q3BJYVQ1UHhTVGJvZ1VRak1ZTXd4ZUlJWG1WRkl4QThVR0REeVFHZzBEbklEaTZKS1VsQ3hITXFDZVpBT2doalNBTUQ1RkFLZmVhVVJkVUZ4Q0FBQUFBRWxGVGtTdVFtQ0NcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzJfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLypcbiEgdGFpbHdpbmRjc3MgdjMuNC4xMCB8IE1JVCBMaWNlbnNlIHwgaHR0cHM6Ly90YWlsd2luZGNzcy5jb21cbiovLypcbjEuIFByZXZlbnQgcGFkZGluZyBhbmQgYm9yZGVyIGZyb20gYWZmZWN0aW5nIGVsZW1lbnQgd2lkdGguIChodHRwczovL2dpdGh1Yi5jb20vbW96ZGV2cy9jc3NyZW1lZHkvaXNzdWVzLzQpXG4yLiBBbGxvdyBhZGRpbmcgYSBib3JkZXIgdG8gYW4gZWxlbWVudCBieSBqdXN0IGFkZGluZyBhIGJvcmRlci13aWR0aC4gKGh0dHBzOi8vZ2l0aHViLmNvbS90YWlsd2luZGNzcy90YWlsd2luZGNzcy9wdWxsLzExNilcbiovXG5cbiosXG46OmJlZm9yZSxcbjo6YWZ0ZXIge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94OyAvKiAxICovXG4gIGJvcmRlci13aWR0aDogMDsgLyogMiAqL1xuICBib3JkZXItc3R5bGU6IHNvbGlkOyAvKiAyICovXG4gIGJvcmRlci1jb2xvcjogI2U1ZTdlYjsgLyogMiAqL1xufVxuXG46OmJlZm9yZSxcbjo6YWZ0ZXIge1xuICAtLXR3LWNvbnRlbnQ6ICcnO1xufVxuXG4vKlxuMS4gVXNlIGEgY29uc2lzdGVudCBzZW5zaWJsZSBsaW5lLWhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXG4yLiBQcmV2ZW50IGFkanVzdG1lbnRzIG9mIGZvbnQgc2l6ZSBhZnRlciBvcmllbnRhdGlvbiBjaGFuZ2VzIGluIGlPUy5cbjMuIFVzZSBhIG1vcmUgcmVhZGFibGUgdGFiIHNpemUuXG40LiBVc2UgdGhlIHVzZXIncyBjb25maWd1cmVkIFxcYHNhbnNcXGAgZm9udC1mYW1pbHkgYnkgZGVmYXVsdC5cbjUuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgc2Fuc1xcYCBmb250LWZlYXR1cmUtc2V0dGluZ3MgYnkgZGVmYXVsdC5cbjYuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgc2Fuc1xcYCBmb250LXZhcmlhdGlvbi1zZXR0aW5ncyBieSBkZWZhdWx0LlxuNy4gRGlzYWJsZSB0YXAgaGlnaGxpZ2h0cyBvbiBpT1NcbiovXG5cbmh0bWwsXG46aG9zdCB7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7IC8qIDEgKi9cbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovIC8qIDMgKi9cbiAgdGFiLXNpemU6IDQ7IC8qIDMgKi9cbiAgZm9udC1mYW1pbHk6IHVpLXNhbnMtc2VyaWYsIHN5c3RlbS11aSwgc2Fucy1zZXJpZiwgXCJBcHBsZSBDb2xvciBFbW9qaVwiLCBcIlNlZ29lIFVJIEVtb2ppXCIsIFwiU2Vnb2UgVUkgU3ltYm9sXCIsIFwiTm90byBDb2xvciBFbW9qaVwiOyAvKiA0ICovXG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogbm9ybWFsOyAvKiA1ICovXG4gIGZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOiBub3JtYWw7IC8qIDYgKi9cbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsgLyogNyAqL1xufVxuXG4vKlxuMS4gUmVtb3ZlIHRoZSBtYXJnaW4gaW4gYWxsIGJyb3dzZXJzLlxuMi4gSW5oZXJpdCBsaW5lLWhlaWdodCBmcm9tIFxcYGh0bWxcXGAgc28gdXNlcnMgY2FuIHNldCB0aGVtIGFzIGEgY2xhc3MgZGlyZWN0bHkgb24gdGhlIFxcYGh0bWxcXGAgZWxlbWVudC5cbiovXG5cbmJvZHkge1xuICBtYXJnaW46IDA7IC8qIDEgKi9cbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IC8qIDIgKi9cbn1cblxuLypcbjEuIEFkZCB0aGUgY29ycmVjdCBoZWlnaHQgaW4gRmlyZWZveC5cbjIuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIG9mIGJvcmRlciBjb2xvciBpbiBGaXJlZm94LiAoaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTkwNjU1KVxuMy4gRW5zdXJlIGhvcml6b250YWwgcnVsZXMgYXJlIHZpc2libGUgYnkgZGVmYXVsdC5cbiovXG5cbmhyIHtcbiAgaGVpZ2h0OiAwOyAvKiAxICovXG4gIGNvbG9yOiBpbmhlcml0OyAvKiAyICovXG4gIGJvcmRlci10b3Atd2lkdGg6IDFweDsgLyogMyAqL1xufVxuXG4vKlxuQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkuXG4qL1xuXG5hYmJyOndoZXJlKFt0aXRsZV0pIHtcbiAgLXdlYmtpdC10ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBkb3R0ZWQ7XG4gICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xufVxuXG4vKlxuUmVtb3ZlIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBhbmQgd2VpZ2h0IGZvciBoZWFkaW5ncy5cbiovXG5cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7XG59XG5cbi8qXG5SZXNldCBsaW5rcyB0byBvcHRpbWl6ZSBmb3Igb3B0LWluIHN0eWxpbmcgaW5zdGVhZCBvZiBvcHQtb3V0LlxuKi9cblxuYSB7XG4gIGNvbG9yOiBpbmhlcml0O1xuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XG59XG5cbi8qXG5BZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gRWRnZSBhbmQgU2FmYXJpLlxuKi9cblxuYixcbnN0cm9uZyB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkZXI7XG59XG5cbi8qXG4xLiBVc2UgdGhlIHVzZXIncyBjb25maWd1cmVkIFxcYG1vbm9cXGAgZm9udC1mYW1pbHkgYnkgZGVmYXVsdC5cbjIuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgbW9ub1xcYCBmb250LWZlYXR1cmUtc2V0dGluZ3MgYnkgZGVmYXVsdC5cbjMuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgbW9ub1xcYCBmb250LXZhcmlhdGlvbi1zZXR0aW5ncyBieSBkZWZhdWx0LlxuNC4gQ29ycmVjdCB0aGUgb2RkIFxcYGVtXFxgIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiovXG5cbmNvZGUsXG5rYmQsXG5zYW1wLFxucHJlIHtcbiAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkxpYmVyYXRpb24gTW9ub1wiLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZTsgLyogMSAqL1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6IG5vcm1hbDsgLyogMiAqL1xuICBmb250LXZhcmlhdGlvbi1zZXR0aW5nczogbm9ybWFsOyAvKiAzICovXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiA0ICovXG59XG5cbi8qXG5BZGQgdGhlIGNvcnJlY3QgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiovXG5cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG5cbi8qXG5QcmV2ZW50IFxcYHN1YlxcYCBhbmQgXFxgc3VwXFxgIGVsZW1lbnRzIGZyb20gYWZmZWN0aW5nIHRoZSBsaW5lIGhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXG4qL1xuXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07XG59XG5cbnN1cCB7XG4gIHRvcDogLTAuNWVtO1xufVxuXG4vKlxuMS4gUmVtb3ZlIHRleHQgaW5kZW50YXRpb24gZnJvbSB0YWJsZSBjb250ZW50cyBpbiBDaHJvbWUgYW5kIFNhZmFyaS4gKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTk5OTA4OCwgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMTI5NylcbjIuIENvcnJlY3QgdGFibGUgYm9yZGVyIGNvbG9yIGluaGVyaXRhbmNlIGluIGFsbCBDaHJvbWUgYW5kIFNhZmFyaS4gKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTkzNTcyOSwgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5NTAxNilcbjMuIFJlbW92ZSBnYXBzIGJldHdlZW4gdGFibGUgYm9yZGVycyBieSBkZWZhdWx0LlxuKi9cblxudGFibGUge1xuICB0ZXh0LWluZGVudDogMDsgLyogMSAqL1xuICBib3JkZXItY29sb3I6IGluaGVyaXQ7IC8qIDIgKi9cbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgLyogMyAqL1xufVxuXG4vKlxuMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXG4yLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXG4zLiBSZW1vdmUgZGVmYXVsdCBwYWRkaW5nIGluIGFsbCBicm93c2Vycy5cbiovXG5cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0OyAvKiAxICovXG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogaW5oZXJpdDsgLyogMSAqL1xuICBmb250LXZhcmlhdGlvbi1zZXR0aW5nczogaW5oZXJpdDsgLyogMSAqL1xuICBmb250LXNpemU6IDEwMCU7IC8qIDEgKi9cbiAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7IC8qIDEgKi9cbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IC8qIDEgKi9cbiAgbGV0dGVyLXNwYWNpbmc6IGluaGVyaXQ7IC8qIDEgKi9cbiAgY29sb3I6IGluaGVyaXQ7IC8qIDEgKi9cbiAgbWFyZ2luOiAwOyAvKiAyICovXG4gIHBhZGRpbmc6IDA7IC8qIDMgKi9cbn1cblxuLypcblJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSBhbmQgRmlyZWZveC5cbiovXG5cbmJ1dHRvbixcbnNlbGVjdCB7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4vKlxuMS4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cbjIuIFJlbW92ZSBkZWZhdWx0IGJ1dHRvbiBzdHlsZXMuXG4qL1xuXG5idXR0b24sXG5pbnB1dDp3aGVyZShbdHlwZT0nYnV0dG9uJ10pLFxuaW5wdXQ6d2hlcmUoW3R5cGU9J3Jlc2V0J10pLFxuaW5wdXQ6d2hlcmUoW3R5cGU9J3N1Ym1pdCddKSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvKiAxICovXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyAvKiAyICovXG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8qIDIgKi9cbn1cblxuLypcblVzZSB0aGUgbW9kZXJuIEZpcmVmb3ggZm9jdXMgc3R5bGUgZm9yIGFsbCBmb2N1c2FibGUgZWxlbWVudHMuXG4qL1xuXG46LW1vei1mb2N1c3Jpbmcge1xuICBvdXRsaW5lOiBhdXRvO1xufVxuXG4vKlxuUmVtb3ZlIHRoZSBhZGRpdGlvbmFsIFxcYDppbnZhbGlkXFxgIHN0eWxlcyBpbiBGaXJlZm94LiAoaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ2Vja28tZGV2L2Jsb2IvMmY5ZWFjZDlkM2Q5OTVjOTM3YjQyNTFhNTU1N2Q5NWQ0OTRjOWJlMS9sYXlvdXQvc3R5bGUvcmVzL2Zvcm1zLmNzcyNMNzI4LUw3MzcpXG4qL1xuXG46LW1vei11aS1pbnZhbGlkIHtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cblxuLypcbkFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lIGFuZCBGaXJlZm94LlxuKi9cblxucHJvZ3Jlc3Mge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbi8qXG5Db3JyZWN0IHRoZSBjdXJzb3Igc3R5bGUgb2YgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYnV0dG9ucyBpbiBTYWZhcmkuXG4qL1xuXG46Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG46Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi8qXG4xLiBDb3JyZWN0IHRoZSBvZGQgYXBwZWFyYW5jZSBpbiBDaHJvbWUgYW5kIFNhZmFyaS5cbjIuIENvcnJlY3QgdGhlIG91dGxpbmUgc3R5bGUgaW4gU2FmYXJpLlxuKi9cblxuW3R5cGU9J3NlYXJjaCddIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7IC8qIDEgKi9cbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IC8qIDIgKi9cbn1cblxuLypcblJlbW92ZSB0aGUgaW5uZXIgcGFkZGluZyBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBtYWNPUy5cbiovXG5cbjo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLypcbjEuIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXG4yLiBDaGFuZ2UgZm9udCBwcm9wZXJ0aWVzIHRvIFxcYGluaGVyaXRcXGAgaW4gU2FmYXJpLlxuKi9cblxuOjotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvKiAxICovXG4gIGZvbnQ6IGluaGVyaXQ7IC8qIDIgKi9cbn1cblxuLypcbkFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIENocm9tZSBhbmQgU2FmYXJpLlxuKi9cblxuc3VtbWFyeSB7XG4gIGRpc3BsYXk6IGxpc3QtaXRlbTtcbn1cblxuLypcblJlbW92ZXMgdGhlIGRlZmF1bHQgc3BhY2luZyBhbmQgYm9yZGVyIGZvciBhcHByb3ByaWF0ZSBlbGVtZW50cy5cbiovXG5cbmJsb2NrcXVvdGUsXG5kbCxcbmRkLFxuaDEsXG5oMixcbmgzLFxuaDQsXG5oNSxcbmg2LFxuaHIsXG5maWd1cmUsXG5wLFxucHJlIHtcbiAgbWFyZ2luOiAwO1xufVxuXG5maWVsZHNldCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxubGVnZW5kIHtcbiAgcGFkZGluZzogMDtcbn1cblxub2wsXG51bCxcbm1lbnUge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi8qXG5SZXNldCBkZWZhdWx0IHN0eWxpbmcgZm9yIGRpYWxvZ3MuXG4qL1xuZGlhbG9nIHtcbiAgcGFkZGluZzogMDtcbn1cblxuLypcblByZXZlbnQgcmVzaXppbmcgdGV4dGFyZWFzIGhvcml6b250YWxseSBieSBkZWZhdWx0LlxuKi9cblxudGV4dGFyZWEge1xuICByZXNpemU6IHZlcnRpY2FsO1xufVxuXG4vKlxuMS4gUmVzZXQgdGhlIGRlZmF1bHQgcGxhY2Vob2xkZXIgb3BhY2l0eSBpbiBGaXJlZm94LiAoaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy9pc3N1ZXMvMzMwMClcbjIuIFNldCB0aGUgZGVmYXVsdCBwbGFjZWhvbGRlciBjb2xvciB0byB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgZ3JheSA0MDAgY29sb3IuXG4qL1xuXG5pbnB1dDo6cGxhY2Vob2xkZXIsXG50ZXh0YXJlYTo6cGxhY2Vob2xkZXIge1xuICBvcGFjaXR5OiAxOyAvKiAxICovXG4gIGNvbG9yOiAjOWNhM2FmOyAvKiAyICovXG59XG5cbi8qXG5TZXQgdGhlIGRlZmF1bHQgY3Vyc29yIGZvciBidXR0b25zLlxuKi9cblxuYnV0dG9uLFxuW3JvbGU9XCJidXR0b25cIl0ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi8qXG5NYWtlIHN1cmUgZGlzYWJsZWQgYnV0dG9ucyBkb24ndCBnZXQgdGhlIHBvaW50ZXIgY3Vyc29yLlxuKi9cbjpkaXNhYmxlZCB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLypcbjEuIE1ha2UgcmVwbGFjZWQgZWxlbWVudHMgXFxgZGlzcGxheTogYmxvY2tcXGAgYnkgZGVmYXVsdC4gKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3pkZXZzL2Nzc3JlbWVkeS9pc3N1ZXMvMTQpXG4yLiBBZGQgXFxgdmVydGljYWwtYWxpZ246IG1pZGRsZVxcYCB0byBhbGlnbiByZXBsYWNlZCBlbGVtZW50cyBtb3JlIHNlbnNpYmx5IGJ5IGRlZmF1bHQuIChodHRwczovL2dpdGh1Yi5jb20vamVuc2ltbW9ucy9jc3NyZW1lZHkvaXNzdWVzLzE0I2lzc3VlY29tbWVudC02MzQ5MzQyMTApXG4gICBUaGlzIGNhbiB0cmlnZ2VyIGEgcG9vcmx5IGNvbnNpZGVyZWQgbGludCBlcnJvciBpbiBzb21lIHRvb2xzIGJ1dCBpcyBpbmNsdWRlZCBieSBkZXNpZ24uXG4qL1xuXG5pbWcsXG5zdmcsXG52aWRlbyxcbmNhbnZhcyxcbmF1ZGlvLFxuaWZyYW1lLFxuZW1iZWQsXG5vYmplY3Qge1xuICBkaXNwbGF5OiBibG9jazsgLyogMSAqL1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyAvKiAyICovXG59XG5cbi8qXG5Db25zdHJhaW4gaW1hZ2VzIGFuZCB2aWRlb3MgdG8gdGhlIHBhcmVudCB3aWR0aCBhbmQgcHJlc2VydmUgdGhlaXIgaW50cmluc2ljIGFzcGVjdCByYXRpby4gKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3pkZXZzL2Nzc3JlbWVkeS9pc3N1ZXMvMTQpXG4qL1xuXG5pbWcsXG52aWRlbyB7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vKiBNYWtlIGVsZW1lbnRzIHdpdGggdGhlIEhUTUwgaGlkZGVuIGF0dHJpYnV0ZSBzdGF5IGhpZGRlbiBieSBkZWZhdWx0ICovXG5baGlkZGVuXSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbjpyb290LFxuW2RhdGEtdGhlbWVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8xKSk7XG59XG5cbkBzdXBwb3J0cyBub3QgKGNvbG9yOiBva2xjaCgwJSAwIDApKSB7XG5cbiAgOnJvb3Qge1xuICAgIGNvbG9yLXNjaGVtZTogbGlnaHQ7XG4gICAgLS1mYWxsYmFjay1wOiAjNDkxZWZmO1xuICAgIC0tZmFsbGJhY2stcGM6ICNkNGRiZmY7XG4gICAgLS1mYWxsYmFjay1zOiAjZmY0MWM3O1xuICAgIC0tZmFsbGJhY2stc2M6ICNmZmY5ZmM7XG4gICAgLS1mYWxsYmFjay1hOiAjMDBjZmJkO1xuICAgIC0tZmFsbGJhY2stYWM6ICMwMDEwMGQ7XG4gICAgLS1mYWxsYmFjay1uOiAjMmIzNDQwO1xuICAgIC0tZmFsbGJhY2stbmM6ICNkN2RkZTQ7XG4gICAgLS1mYWxsYmFjay1iMTogI2ZmZmZmZjtcbiAgICAtLWZhbGxiYWNrLWIyOiAjZTVlNmU2O1xuICAgIC0tZmFsbGJhY2stYjM6ICNlNWU2ZTY7XG4gICAgLS1mYWxsYmFjay1iYzogIzFmMjkzNztcbiAgICAtLWZhbGxiYWNrLWluOiAjMDBiM2YwO1xuICAgIC0tZmFsbGJhY2staW5jOiAjMDAwMDAwO1xuICAgIC0tZmFsbGJhY2stc3U6ICMwMGNhOTI7XG4gICAgLS1mYWxsYmFjay1zdWM6ICMwMDAwMDA7XG4gICAgLS1mYWxsYmFjay13YTogI2ZmYzIyZDtcbiAgICAtLWZhbGxiYWNrLXdhYzogIzAwMDAwMDtcbiAgICAtLWZhbGxiYWNrLWVyOiAjZmY2ZjcwO1xuICAgIC0tZmFsbGJhY2stZXJjOiAjMDAwMDAwO1xuICB9XG5cbiAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xuXG4gICAgOnJvb3Qge1xuICAgICAgY29sb3Itc2NoZW1lOiBkYXJrO1xuICAgICAgLS1mYWxsYmFjay1wOiAjNzU4MmZmO1xuICAgICAgLS1mYWxsYmFjay1wYzogIzA1MDYxNztcbiAgICAgIC0tZmFsbGJhY2stczogI2ZmNzFjZjtcbiAgICAgIC0tZmFsbGJhY2stc2M6ICMxOTAyMTE7XG4gICAgICAtLWZhbGxiYWNrLWE6ICMwMGM3YjU7XG4gICAgICAtLWZhbGxiYWNrLWFjOiAjMDAwZTBjO1xuICAgICAgLS1mYWxsYmFjay1uOiAjMmEzMjNjO1xuICAgICAgLS1mYWxsYmFjay1uYzogI2E2YWRiYjtcbiAgICAgIC0tZmFsbGJhY2stYjE6ICMxZDIzMmE7XG4gICAgICAtLWZhbGxiYWNrLWIyOiAjMTkxZTI0O1xuICAgICAgLS1mYWxsYmFjay1iMzogIzE1MTkxZTtcbiAgICAgIC0tZmFsbGJhY2stYmM6ICNhNmFkYmI7XG4gICAgICAtLWZhbGxiYWNrLWluOiAjMDBiM2YwO1xuICAgICAgLS1mYWxsYmFjay1pbmM6ICMwMDAwMDA7XG4gICAgICAtLWZhbGxiYWNrLXN1OiAjMDBjYTkyO1xuICAgICAgLS1mYWxsYmFjay1zdWM6ICMwMDAwMDA7XG4gICAgICAtLWZhbGxiYWNrLXdhOiAjZmZjMjJkO1xuICAgICAgLS1mYWxsYmFjay13YWM6ICMwMDAwMDA7XG4gICAgICAtLWZhbGxiYWNrLWVyOiAjZmY2ZjcwO1xuICAgICAgLS1mYWxsYmFjay1lcmM6ICMwMDAwMDA7XG4gICAgfVxuICB9XG59XG5cbmh0bWwge1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4qIHtcbiAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsY2gsIGN1cnJlbnRDb2xvciAzNSUsIHRyYW5zcGFyZW50KSB0cmFuc3BhcmVudDtcbn1cblxuKjpob3ZlciB7XG4gIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGNoLCBjdXJyZW50Q29sb3IgNjAlLCB0cmFuc3BhcmVudCkgdHJhbnNwYXJlbnQ7XG59XG5cbjpyb290IHtcbiAgY29sb3Itc2NoZW1lOiBkYXJrO1xuICAtLWluOiA3Mi4wNiUgMC4xOTEgMjMxLjY7XG4gIC0tc3U6IDY0LjglIDAuMTUwIDE2MDtcbiAgLS13YTogODQuNzElIDAuMTk5IDgzLjg3O1xuICAtLWVyOiA3MS43NiUgMC4yMjEgMjIuMTg7XG4gIC0tcGM6IDEzLjEzOCUgMC4wMzkyIDI3NS43NTtcbiAgLS1zYzogMTQuOTYlIDAuMDUyIDM0Mi41NTtcbiAgLS1hYzogMTQuOTAyJSAwLjAzMzQgMTgzLjYxO1xuICAtLWluYzogMCUgMCAwO1xuICAtLXN1YzogMCUgMCAwO1xuICAtLXdhYzogMCUgMCAwO1xuICAtLWVyYzogMCUgMCAwO1xuICAtLXJvdW5kZWQtYm94OiAxcmVtO1xuICAtLXJvdW5kZWQtYnRuOiAwLjVyZW07XG4gIC0tcm91bmRlZC1iYWRnZTogMS45cmVtO1xuICAtLWFuaW1hdGlvbi1idG46IDAuMjVzO1xuICAtLWFuaW1hdGlvbi1pbnB1dDogLjJzO1xuICAtLWJ0bi1mb2N1cy1zY2FsZTogMC45NTtcbiAgLS1ib3JkZXItYnRuOiAxcHg7XG4gIC0tdGFiLWJvcmRlcjogMXB4O1xuICAtLXRhYi1yYWRpdXM6IDAuNXJlbTtcbiAgLS1wOiA2NS42OSUgMC4xOTYgMjc1Ljc1O1xuICAtLXM6IDc0LjglIDAuMjYgMzQyLjU1O1xuICAtLWE6IDc0LjUxJSAwLjE2NyAxODMuNjE7XG4gIC0tbjogMzEuMzgxNSUgMC4wMjExMDggMjU0LjEzOTE3NTtcbiAgLS1uYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG4gIC0tYjE6IDI1LjMyNjclIDAuMDE1ODk2IDI1Mi40MTc1Njg7XG4gIC0tYjI6IDIzLjI2MDclIDAuMDEzODA3IDI1My4xMDA2NzU7XG4gIC0tYjM6IDIxLjE0ODQlIDAuMDExNjUgMjU0LjA4NzkzOTtcbiAgLS1iYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG59XG5cbltkYXRhLXRoZW1lPWRhcmtdIHtcbiAgY29sb3Itc2NoZW1lOiBkYXJrO1xuICAtLWluOiA3Mi4wNiUgMC4xOTEgMjMxLjY7XG4gIC0tc3U6IDY0LjglIDAuMTUwIDE2MDtcbiAgLS13YTogODQuNzElIDAuMTk5IDgzLjg3O1xuICAtLWVyOiA3MS43NiUgMC4yMjEgMjIuMTg7XG4gIC0tcGM6IDEzLjEzOCUgMC4wMzkyIDI3NS43NTtcbiAgLS1zYzogMTQuOTYlIDAuMDUyIDM0Mi41NTtcbiAgLS1hYzogMTQuOTAyJSAwLjAzMzQgMTgzLjYxO1xuICAtLWluYzogMCUgMCAwO1xuICAtLXN1YzogMCUgMCAwO1xuICAtLXdhYzogMCUgMCAwO1xuICAtLWVyYzogMCUgMCAwO1xuICAtLXJvdW5kZWQtYm94OiAxcmVtO1xuICAtLXJvdW5kZWQtYnRuOiAwLjVyZW07XG4gIC0tcm91bmRlZC1iYWRnZTogMS45cmVtO1xuICAtLWFuaW1hdGlvbi1idG46IDAuMjVzO1xuICAtLWFuaW1hdGlvbi1pbnB1dDogLjJzO1xuICAtLWJ0bi1mb2N1cy1zY2FsZTogMC45NTtcbiAgLS1ib3JkZXItYnRuOiAxcHg7XG4gIC0tdGFiLWJvcmRlcjogMXB4O1xuICAtLXRhYi1yYWRpdXM6IDAuNXJlbTtcbiAgLS1wOiA2NS42OSUgMC4xOTYgMjc1Ljc1O1xuICAtLXM6IDc0LjglIDAuMjYgMzQyLjU1O1xuICAtLWE6IDc0LjUxJSAwLjE2NyAxODMuNjE7XG4gIC0tbjogMzEuMzgxNSUgMC4wMjExMDggMjU0LjEzOTE3NTtcbiAgLS1uYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG4gIC0tYjE6IDI1LjMyNjclIDAuMDE1ODk2IDI1Mi40MTc1Njg7XG4gIC0tYjI6IDIzLjI2MDclIDAuMDEzODA3IDI1My4xMDA2NzU7XG4gIC0tYjM6IDIxLjE0ODQlIDAuMDExNjUgMjU0LjA4NzkzOTtcbiAgLS1iYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG59XG5cbltkYXRhLXRoZW1lPW9wZW5zaWduY3NzXSB7XG4gIC0tcDogMjkuNDY1MyUgMC4xMTQ1NDggMjU5LjA2MDEyOTtcbiAgLS1yb3VuZGVkLWJveDogMXJlbTtcbiAgLS1yb3VuZGVkLWJhZGdlOiAxLjlyZW07XG4gIC0tYW5pbWF0aW9uLWJ0bjogMC4yNXM7XG4gIC0tYW5pbWF0aW9uLWlucHV0OiAuMnM7XG4gIC0tYnRuLWZvY3VzLXNjYWxlOiAwLjk1O1xuICAtLWJvcmRlci1idG46IDFweDtcbiAgLS1wYzogODQuNDUzMSUgMC4wMDQ3MDIgMjU4LjMyNjc5MTtcbiAgLS1zOiAzMi43ODM3JSAwLjA0MDg4NSAyNjEuMzQ2ODc7XG4gIC0tc2M6IDg1LjgzMzklIDAuMDIzMDA2IDI2MC43MTk0NDI7XG4gIC0tYTogNTcuNDQzOCUgMC4yMzE0OTEgMjIuMTc5OTA5O1xuICAtLWFjOiA5MS40MjQ3JSAwLjA0MzkzNSAyMy4xNzk1Nzk7XG4gIC0tbjogODQuMTM3MyUgMC4wMjQxNTcgMjU2LjExNDE7XG4gIC0tbmM6IDE4LjQwODElIDAuMDAzNzU4IDE2NC41OTc2NTQ7XG4gIC0tYjE6IDEwMCUgMCAwO1xuICAtLWIyOiA5MC4wNjAxJSAwIDA7XG4gIC0tYjM6IDgwLjE1MTclIDAgMDtcbiAgLS1iYzogMjAuMDE5MyUgMCAwO1xuICAtLWluOiA3My40NTkyJSAwLjE1ODg3NCAyMzYuMzU3NTE0O1xuICAtLWluYzogOTYuOTg3MSUgMC4wMDEzMjQgMTA2LjQyMzgyMTtcbiAgLS1zdTogNjQuODE1OSUgMC4xNDc0MDUgMTU5LjY3MjY2NjtcbiAgLS1zdWM6IDk2Ljk4NzElIDAuMDAxMzI0IDEwNi40MjM4MjE7XG4gIC0td2E6IDgzLjgzOTglIDAuMTcyMjA5IDgzLjU3Mzk2NztcbiAgLS13YWM6IDg4LjAwMDUlIDAuMDI1MDQgMjUxLjkxNjk4O1xuICAtLWVyOiA4MC40OTAyJSAwLjExMjAxNyAxNS43Mjc1MjI7XG4gIC0tZXJjOiAxNS45OTclIDAuMDIzMjg0IDE0Ljg5ODUxNztcbiAgLS1yb3VuZGVkLWJ0bjogMS45cmVtO1xuICAtLXRhYi1ib3JkZXI6IDJweDtcbiAgLS10YWItcmFkaXVzOiAwLjdyZW07XG59XG5cbiosIDo6YmVmb3JlLCA6OmFmdGVyIHtcbiAgLS10dy1ib3JkZXItc3BhY2luZy14OiAwO1xuICAtLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7XG4gIC0tdHctdHJhbnNsYXRlLXg6IDA7XG4gIC0tdHctdHJhbnNsYXRlLXk6IDA7XG4gIC0tdHctcm90YXRlOiAwO1xuICAtLXR3LXNrZXcteDogMDtcbiAgLS10dy1za2V3LXk6IDA7XG4gIC0tdHctc2NhbGUteDogMTtcbiAgLS10dy1zY2FsZS15OiAxO1xuICAtLXR3LXBhbi14OiAgO1xuICAtLXR3LXBhbi15OiAgO1xuICAtLXR3LXBpbmNoLXpvb206ICA7XG4gIC0tdHctc2Nyb2xsLXNuYXAtc3RyaWN0bmVzczogcHJveGltaXR5O1xuICAtLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246ICA7XG4gIC0tdHctZ3JhZGllbnQtdmlhLXBvc2l0aW9uOiAgO1xuICAtLXR3LWdyYWRpZW50LXRvLXBvc2l0aW9uOiAgO1xuICAtLXR3LW9yZGluYWw6ICA7XG4gIC0tdHctc2xhc2hlZC16ZXJvOiAgO1xuICAtLXR3LW51bWVyaWMtZmlndXJlOiAgO1xuICAtLXR3LW51bWVyaWMtc3BhY2luZzogIDtcbiAgLS10dy1udW1lcmljLWZyYWN0aW9uOiAgO1xuICAtLXR3LXJpbmctaW5zZXQ6ICA7XG4gIC0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDtcbiAgLS10dy1yaW5nLW9mZnNldC1jb2xvcjogI2ZmZjtcbiAgLS10dy1yaW5nLWNvbG9yOiByZ2IoNTkgMTMwIDI0NiAvIDAuNSk7XG4gIC0tdHctcmluZy1vZmZzZXQtc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctcmluZy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwO1xuICAtLXR3LWJsdXI6ICA7XG4gIC0tdHctYnJpZ2h0bmVzczogIDtcbiAgLS10dy1jb250cmFzdDogIDtcbiAgLS10dy1ncmF5c2NhbGU6ICA7XG4gIC0tdHctaHVlLXJvdGF0ZTogIDtcbiAgLS10dy1pbnZlcnQ6ICA7XG4gIC0tdHctc2F0dXJhdGU6ICA7XG4gIC0tdHctc2VwaWE6ICA7XG4gIC0tdHctZHJvcC1zaGFkb3c6ICA7XG4gIC0tdHctYmFja2Ryb3AtYmx1cjogIDtcbiAgLS10dy1iYWNrZHJvcC1icmlnaHRuZXNzOiAgO1xuICAtLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiAgO1xuICAtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZTogIDtcbiAgLS10dy1iYWNrZHJvcC1odWUtcm90YXRlOiAgO1xuICAtLXR3LWJhY2tkcm9wLWludmVydDogIDtcbiAgLS10dy1iYWNrZHJvcC1vcGFjaXR5OiAgO1xuICAtLXR3LWJhY2tkcm9wLXNhdHVyYXRlOiAgO1xuICAtLXR3LWJhY2tkcm9wLXNlcGlhOiAgO1xuICAtLXR3LWNvbnRhaW4tc2l6ZTogIDtcbiAgLS10dy1jb250YWluLWxheW91dDogIDtcbiAgLS10dy1jb250YWluLXBhaW50OiAgO1xuICAtLXR3LWNvbnRhaW4tc3R5bGU6ICA7XG59XG5cbjo6YmFja2Ryb3Age1xuICAtLXR3LWJvcmRlci1zcGFjaW5nLXg6IDA7XG4gIC0tdHctYm9yZGVyLXNwYWNpbmcteTogMDtcbiAgLS10dy10cmFuc2xhdGUteDogMDtcbiAgLS10dy10cmFuc2xhdGUteTogMDtcbiAgLS10dy1yb3RhdGU6IDA7XG4gIC0tdHctc2tldy14OiAwO1xuICAtLXR3LXNrZXcteTogMDtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIC0tdHctcGFuLXg6ICA7XG4gIC0tdHctcGFuLXk6ICA7XG4gIC0tdHctcGluY2gtem9vbTogIDtcbiAgLS10dy1zY3JvbGwtc25hcC1zdHJpY3RuZXNzOiBwcm94aW1pdHk7XG4gIC0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbjogIDtcbiAgLS10dy1ncmFkaWVudC12aWEtcG9zaXRpb246ICA7XG4gIC0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246ICA7XG4gIC0tdHctb3JkaW5hbDogIDtcbiAgLS10dy1zbGFzaGVkLXplcm86ICA7XG4gIC0tdHctbnVtZXJpYy1maWd1cmU6ICA7XG4gIC0tdHctbnVtZXJpYy1zcGFjaW5nOiAgO1xuICAtLXR3LW51bWVyaWMtZnJhY3Rpb246ICA7XG4gIC0tdHctcmluZy1pbnNldDogIDtcbiAgLS10dy1yaW5nLW9mZnNldC13aWR0aDogMHB4O1xuICAtLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmO1xuICAtLXR3LXJpbmctY29sb3I6IHJnYig1OSAxMzAgMjQ2IC8gMC41KTtcbiAgLS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1yaW5nLXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7XG4gIC0tdHctYmx1cjogIDtcbiAgLS10dy1icmlnaHRuZXNzOiAgO1xuICAtLXR3LWNvbnRyYXN0OiAgO1xuICAtLXR3LWdyYXlzY2FsZTogIDtcbiAgLS10dy1odWUtcm90YXRlOiAgO1xuICAtLXR3LWludmVydDogIDtcbiAgLS10dy1zYXR1cmF0ZTogIDtcbiAgLS10dy1zZXBpYTogIDtcbiAgLS10dy1kcm9wLXNoYWRvdzogIDtcbiAgLS10dy1iYWNrZHJvcC1ibHVyOiAgO1xuICAtLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6ICA7XG4gIC0tdHctYmFja2Ryb3AtY29udHJhc3Q6ICA7XG4gIC0tdHctYmFja2Ryb3AtZ3JheXNjYWxlOiAgO1xuICAtLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6ICA7XG4gIC0tdHctYmFja2Ryb3AtaW52ZXJ0OiAgO1xuICAtLXR3LWJhY2tkcm9wLW9wYWNpdHk6ICA7XG4gIC0tdHctYmFja2Ryb3Atc2F0dXJhdGU6ICA7XG4gIC0tdHctYmFja2Ryb3Atc2VwaWE6ICA7XG4gIC0tdHctY29udGFpbi1zaXplOiAgO1xuICAtLXR3LWNvbnRhaW4tbGF5b3V0OiAgO1xuICAtLXR3LWNvbnRhaW4tcGFpbnQ6ICA7XG4gIC0tdHctY29udGFpbi1zdHlsZTogIDtcbn1cclxuLmNvbnRhaW5lciB7XG4gIHdpZHRoOiAxMDAlO1xufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogNjQwcHgpIHtcblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDY0MHB4O1xuICB9XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuXG4gIC5jb250YWluZXIge1xuICAgIG1heC13aWR0aDogNzY4cHg7XG4gIH1cbn1cclxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuXG4gIC5jb250YWluZXIge1xuICAgIG1heC13aWR0aDogMTAyNHB4O1xuICB9XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiAxMjgwcHgpIHtcblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDEyODBweDtcbiAgfVxufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogMTUzNnB4KSB7XG5cbiAgLmNvbnRhaW5lciB7XG4gICAgbWF4LXdpZHRoOiAxNTM2cHg7XG4gIH1cbn1cclxuLm9wLWFsZXJ0IHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgd2lkdGg6IDEwMCU7XG4gIGdyaWQtYXV0by1mbG93OiByb3c7XG4gIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktaXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAxcmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICBwYWRkaW5nOiAxcmVtO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tYWxlcnQtYmc6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS8xKSk7XG4gIC0tYWxlcnQtYmctbWl4OiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hbGVydC1iZyk7XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiA2NDBweCkge1xuXG4gIC5vcC1hbGVydCB7XG4gICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gbWlubWF4KGF1dG8sMWZyKTtcbiAgICBqdXN0aWZ5LWl0ZW1zOiBzdGFydDtcbiAgICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgfVxufVxyXG4ub3AtYmFkZ2Uge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICBoZWlnaHQ6IDEuMjVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gIHBhZGRpbmctbGVmdDogMC41NjNyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNTYzcmVtO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJhZGdlLCAxLjlyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuQG1lZGlhIChob3Zlcjpob3Zlcikge1xuXG4gIC5vcC1tZW51IGxpID4gKjpub3QodWwsIC5vcC1tZW51LXRpdGxlLCBkZXRhaWxzLCAub3AtYnRuKTphY3RpdmUsXG4ub3AtbWVudSBsaSA+ICo6bm90KHVsLCAub3AtbWVudS10aXRsZSwgZGV0YWlscywgLm9wLWJ0bikub3AtYWN0aXZlLFxuLm9wLW1lbnUgbGkgPiBkZXRhaWxzID4gc3VtbWFyeTphY3RpdmUge1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW5jLG9rbGNoKHZhcigtLW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICAub3AtdGFiOmhvdmVyIHtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgfVxuXG4gIC5vcC10YWJzLWJveGVkIDppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmhvdmVyLCAub3AtdGFicy1ib3hlZCA6aXMoaW5wdXQ6Y2hlY2tlZCk6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgLm9wLXRhYmxlIHRyLm9wLWhvdmVyOmhvdmVyLFxuICAub3AtdGFibGUgdHIub3AtaG92ZXI6bnRoLWNoaWxkKGV2ZW4pOmhvdmVyIHtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIH1cbn1cclxuLm9wLWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBoZWlnaHQ6IDNyZW07XG4gIG1pbi1oZWlnaHQ6IDNyZW07XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItY29sb3I6IG9rbGNoKHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tYjIpKSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMWVtO1xuICBnYXA6IDAuNXJlbTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIGJvcmRlci13aWR0aDogdmFyKC0tYm9yZGVyLWJ0biwgMXB4KTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctc2hhZG93OiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjA1KTtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAxcHggMnB4IDAgdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMikpIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG59XHJcbi5vcC1idG4tZGlzYWJsZWQsXG4gIC5vcC1idG5bZGlzYWJsZWRdLFxuICAub3AtYnRuOmRpc2FibGVkIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XHJcbi5vcC1idG4tc3F1YXJlIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICB3aWR0aDogM3JlbTtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLWNpcmNsZSB7XG4gIGhlaWdodDogM3JlbTtcbiAgd2lkdGg6IDNyZW07XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgcGFkZGluZzogMHB4O1xufVxyXG46d2hlcmUoLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0pKSxcbjp3aGVyZSgub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJyYWRpb1wiXSkpIHtcbiAgd2lkdGg6IGF1dG87XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xufVxyXG4ub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSk6YWZ0ZXIsXG4ub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJyYWRpb1wiXSk6YWZ0ZXIge1xuICAtLXR3LWNvbnRlbnQ6IGF0dHIoYXJpYS1sYWJlbCk7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xufVxyXG4ub3AtY2FyZCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xufVxyXG4ub3AtY2FyZDpmb2N1cyB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWNhcmQtYm9keSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nLWNhcmQsIDJyZW0pO1xuICBnYXA6IDAuNXJlbTtcbn1cclxuLm9wLWNhcmQtYm9keSA6d2hlcmUocCkge1xuICBmbGV4LWdyb3c6IDE7XG59XHJcbi5vcC1jYXJkLWFjdGlvbnMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICBnYXA6IDAuNXJlbTtcbn1cclxuLm9wLWNhcmQgZmlndXJlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGwge1xuICBkaXNwbGF5OiBncmlkO1xufVxyXG4ub3AtY2FyZC5vcC1pbWFnZS1mdWxsOmJlZm9yZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgY29udGVudDogXCJcIjtcbiAgei1pbmRleDogMTA7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuNzU7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGw6YmVmb3JlLFxuICAgIC5vcC1jYXJkLm9wLWltYWdlLWZ1bGwgPiAqIHtcbiAgZ3JpZC1jb2x1bW4tc3RhcnQ6IDE7XG4gIGdyaWQtcm93LXN0YXJ0OiAxO1xufVxyXG4ub3AtY2FyZC5vcC1pbWFnZS1mdWxsID4gZmlndXJlIGltZyB7XG4gIGhlaWdodDogMTAwJTtcbiAgb2JqZWN0LWZpdDogY292ZXI7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGwgPiAub3AtY2FyZC1ib2R5IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyMDtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1uYyxva2xjaCh2YXIoLS1uYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtY2hlY2tib3gge1xuICBmbGV4LXNocmluazogMDtcbiAgLS1jaGtiZzogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbiAgLS1jaGtmZzogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHdpZHRoOiAxLjVyZW07XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWRpdmlkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBtYXJnaW4tdG9wOiAxcmVtO1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xuICBoZWlnaHQ6IDFyZW07XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XHJcbi5vcC1kaXZpZGVyOmJlZm9yZSxcbiAgLm9wLWRpdmlkZXI6YWZ0ZXIge1xuICBoZWlnaHQ6IDAuMTI1cmVtO1xuICB3aWR0aDogMTAwJTtcbiAgZmxleC1ncm93OiAxO1xuICAtLXR3LWNvbnRlbnQ6ICcnO1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMSkpO1xufVxyXG4ub3AtZHJvcGRvd24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cclxuLm9wLWRyb3Bkb3duID4gKjpub3Qoc3VtbWFyeSk6Zm9jdXMge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1kcm9wZG93biAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cclxuLm9wLWRyb3Bkb3duOmlzKDpub3QoZGV0YWlscykpIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3A7XG4gIC0tdHctc2NhbGUteDogLjk1O1xuICAtLXR3LXNjYWxlLXk6IC45NTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xufVxyXG4ub3AtZHJvcGRvd24tZW5kIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgaW5zZXQtaW5saW5lLWVuZDogMHB4O1xufVxyXG4ub3AtZHJvcGRvd24tbGVmdCAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogYXV0bztcbiAgaW5zZXQtaW5saW5lLWVuZDogMTAwJTtcbiAgdG9wOiAwcHg7XG4gIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0O1xufVxyXG4ub3AtZHJvcGRvd24tcmlnaHQgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICBib3R0b206IGF1dG87XG4gIGluc2V0LWlubGluZS1zdGFydDogMTAwJTtcbiAgdG9wOiAwcHg7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQ7XG59XHJcbi5vcC1kcm9wZG93bi1ib3R0b20gLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICBib3R0b206IGF1dG87XG4gIHRvcDogMTAwJTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wO1xufVxyXG4ub3AtZHJvcGRvd24tdG9wIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgYm90dG9tOiAxMDAlO1xuICB0b3A6IGF1dG87XG4gIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbTtcbn1cclxuLm9wLWRyb3Bkb3duLWVuZC5vcC1kcm9wZG93bi1yaWdodCAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogMHB4O1xuICB0b3A6IGF1dG87XG59XHJcbi5vcC1kcm9wZG93bi1lbmQub3AtZHJvcGRvd24tbGVmdCAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogMHB4O1xuICB0b3A6IGF1dG87XG59XHJcbi5vcC1kcm9wZG93bi5vcC1kcm9wZG93bi1vcGVuIC5vcC1kcm9wZG93bi1jb250ZW50LFxuLm9wLWRyb3Bkb3duOm5vdCgub3AtZHJvcGRvd24taG92ZXIpOmZvY3VzIC5vcC1kcm9wZG93bi1jb250ZW50LFxuLm9wLWRyb3Bkb3duOmZvY3VzLXdpdGhpbiAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIG9wYWNpdHk6IDE7XG59XHJcbkBtZWRpYSAoaG92ZXI6IGhvdmVyKSB7XG5cbiAgLm9wLWRyb3Bkb3duLm9wLWRyb3Bkb3duLWhvdmVyOmhvdmVyIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICAub3AtYnRuOmhvdmVyIHtcbiAgICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMyxva2xjaCh2YXIoLS1iMykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoXG4gICAgICAgICAgICBpbiBva2xhYixcbiAgICAgICAgICAgIG9rbGNoKHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tYjIpKSAvIHZhcigtLXR3LWJnLW9wYWNpdHksIDEpKSA5MCUsXG4gICAgICAgICAgICBibGFja1xuICAgICAgICAgICk7XG4gICAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChcbiAgICAgICAgICAgIGluIG9rbGFiLFxuICAgICAgICAgICAgb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMikpIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHksIDEpKSA5MCUsXG4gICAgICAgICAgICBibGFja1xuICAgICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQHN1cHBvcnRzIG5vdCAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAgIC5vcC1idG46aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1mYWxsYmFjay1iMikpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idG4tY29sb3IsIHZhcigtLWZhbGxiYWNrLWIyKSk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi5vcC1nbGFzczpob3ZlciB7XG4gICAgLS1nbGFzcy1vcGFjaXR5OiAyNSU7XG4gICAgLS1nbGFzcy1ib3JkZXItb3BhY2l0eTogMTUlO1xuICB9XG5cbiAgLm9wLWJ0bi1naG9zdDpob3ZlciB7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAgIC5vcC1idG4tZ2hvc3Q6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZTpob3ZlciB7XG4gICAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnk6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnk6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICB9XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXNlY29uZGFyeTpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXNjLG9rbGNoKHZhcigtLXNjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG4tb3V0bGluZS5vcC1idG4tc2Vjb25kYXJ5OmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSkgOTAlLCBibGFjayk7XG4gICAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1hY2NlbnQ6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1hYyxva2xjaCh2YXIoLS1hYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tc3VjY2Vzczpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1Yyxva2xjaCh2YXIoLS1zdWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zdWNjZXNzOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zdSxva2xjaCh2YXIoLS1zdSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4taW5mbzpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWluYyxva2xjaCh2YXIoLS1pbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1pbmZvOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4td2FybmluZzpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhYyxva2xjaCh2YXIoLS13YWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi13YXJuaW5nOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3I6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcmMsb2tsY2godmFyKC0tZXJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3I6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1kaXNhYmxlZDpob3ZlcixcbiAgICAub3AtYnRuW2Rpc2FibGVkXTpob3ZlcixcbiAgICAub3AtYnRuOmRpc2FibGVkOmhvdmVyIHtcbiAgICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDAuMjtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMC4yO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpjaGVja2VkKTpob3ZlciwgLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl06Y2hlY2tlZCk6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICB9XG4gIH1cblxuICAub3AtZHJvcGRvd24ub3AtZHJvcGRvd24taG92ZXI6aG92ZXIgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICAgIC0tdHctc2NhbGUteDogMTtcbiAgICAtLXR3LXNjYWxlLXk6IDE7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIH1cblxuICA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBva2xjaCgwJSAwIDApKSB7XG5cbiAgICA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjEpKTtcbiAgICB9XG4gIH1cblxuICAub3AtdGFiW2Rpc2FibGVkXSxcbiAgICAub3AtdGFiW2Rpc2FibGVkXTpob3ZlciB7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMC4yO1xuICB9XG59XHJcbi5vcC1kcm9wZG93bjppcyhkZXRhaWxzKSBzdW1tYXJ5Ojotd2Via2l0LWRldGFpbHMtbWFya2VyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cclxuLm9wLWZpbGUtaW5wdXQge1xuICBoZWlnaHQ6IDNyZW07XG4gIGZsZXgtc2hyaW5rOiAxO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IDFyZW07XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDA7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC1maWxlLWlucHV0OjpmaWxlLXNlbGVjdG9yLWJ1dHRvbiB7XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiAxcmVtO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmbGV4LXNocmluazogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDFyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxZW07XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBmb250LXdlaWdodDogNjAwO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW5jLG9rbGNoKHZhcigtLW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiBub25lO1xuICBib3JkZXItd2lkdGg6IHZhcigtLWJvcmRlci1idG4sIDFweCk7XG4gIGFuaW1hdGlvbjogYnV0dG9uLXBvcCB2YXIoLS1hbmltYXRpb24tYnRuLCAwLjI1cykgZWFzZS1vdXQ7XG59XHJcbi5vcC1mb290ZXIge1xuICBkaXNwbGF5OiBncmlkO1xuICB3aWR0aDogMTAwJTtcbiAgZ3JpZC1hdXRvLWZsb3c6IHJvdztcbiAgcGxhY2UtaXRlbXM6IHN0YXJ0O1xuICBjb2x1bW4tZ2FwOiAxcmVtO1xuICByb3ctZ2FwOiAyLjVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xufVxyXG4ub3AtZm9vdGVyID4gKiB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIHBsYWNlLWl0ZW1zOiBzdGFydDtcbiAgZ2FwOiAwLjVyZW07XG59XHJcbi5vcC1mb290ZXItY2VudGVyIHtcbiAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxyXG4ub3AtZm9vdGVyLWNlbnRlciA+ICoge1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogNDhyZW0pIHtcblxuICAub3AtZm9vdGVyIHtcbiAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICB9XG5cbiAgLm9wLWZvb3Rlci1jZW50ZXIge1xuICAgIGdyaWQtYXV0by1mbG93OiByb3cgZGVuc2U7XG4gIH1cbn1cclxuLm9wLWlucHV0IHtcbiAgZmxleC1zaHJpbms6IDE7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICBoZWlnaHQ6IDNyZW07XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgbGluZS1oZWlnaHQ6IDEuNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtaW5wdXRbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbi5vcC1pbnB1dC1tZFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcbiAgbWFyZ2luLXRvcDogLTFyZW07XG4gIG1hcmdpbi1ib3R0b206IC0xcmVtO1xuICBtYXJnaW4taW5saW5lLWVuZDogLTFyZW07XG59XHJcbi5vcC1pbnB1dC14c1t0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcbiAgbWFyZ2luLXRvcDogLTAuMjVyZW07XG4gIG1hcmdpbi1ib3R0b206IC0wLjI1cmVtO1xuICBtYXJnaW4taW5saW5lLWVuZDogLTBweDtcbn1cclxuLm9wLWlucHV0LXNtW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xuICBtYXJnaW4tdG9wOiAwcHg7XG4gIG1hcmdpbi1ib3R0b206IDBweDtcbiAgbWFyZ2luLWlubGluZS1lbmQ6IC0wcHg7XG59XHJcbi5vcC1qb2luIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbn1cclxuLm9wLWpvaW4gOndoZXJlKC5vcC1qb2luLWl0ZW0pIHtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IDA7XG59XHJcbi5vcC1qb2luIC5vcC1qb2luLWl0ZW06bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSxcbiAgLm9wLWpvaW4gKjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogMDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogMDtcbn1cclxuLm9wLWpvaW4gLm9wLWpvaW4taXRlbTpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpLFxuICAub3Atam9pbiAqOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IDA7XG59XHJcbi5vcC1qb2luIC5vcC1kcm9wZG93biAub3Atam9pbi1pdGVtOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCksXG4gIC5vcC1qb2luICo6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSAub3AtZHJvcGRvd24gLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbi5vcC1qb2luIDp3aGVyZSgub3Atam9pbi1pdGVtOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkpLFxuICAub3Atam9pbiA6d2hlcmUoKjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0pIHtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbi5vcC1qb2luIC5vcC1qb2luLWl0ZW06bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSxcbiAgLm9wLWpvaW4gKjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogMDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogMDtcbn1cclxuLm9wLWpvaW4gOndoZXJlKC5vcC1qb2luLWl0ZW06bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSksXG4gIC5vcC1qb2luIDp3aGVyZSgqOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSkge1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG5Ac3VwcG9ydHMgbm90IHNlbGVjdG9yKDpoYXMoKikpIHtcblxuICA6d2hlcmUoLm9wLWpvaW4gKikge1xuICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG4gIH1cbn1cclxuQHN1cHBvcnRzIHNlbGVjdG9yKDpoYXMoKikpIHtcblxuICA6d2hlcmUoLm9wLWpvaW4gKjpoYXMoLm9wLWpvaW4taXRlbSkpIHtcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICB9XG59XHJcbi5vcC1saW5rIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lO1xufVxyXG4ub3AtbWVudSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIHBhZGRpbmc6IDAuNXJlbTtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpIHVsKSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogMXJlbTtcbiAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IDAuNXJlbTtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUsIC5vcC1idG4pKSwgLm9wLW1lbnUgOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKSB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC41cmVtO1xuICBncmlkLWF1dG8tY29sdW1uczogbWlubWF4KGF1dG8sIG1heC1jb250ZW50KSBhdXRvIG1heC1jb250ZW50O1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxyXG4ub3AtbWVudSBsaS5vcC1kaXNhYmxlZCB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4zKSk7XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaSA+IC5vcC1tZW51LWRyb3Bkb3duOm5vdCgub3AtbWVudS1kcm9wZG93bi1zaG93KSkge1xuICBkaXNwbGF5OiBub25lO1xufVxyXG46d2hlcmUoLm9wLW1lbnUgbGkpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXNocmluazogMDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbn1cclxuOndoZXJlKC5vcC1tZW51IGxpKSAub3AtYmFkZ2Uge1xuICBqdXN0aWZ5LXNlbGY6IGVuZDtcbn1cclxuLm9wLW1vZGFsIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgaW5zZXQ6IDBweDtcbiAgbWFyZ2luOiAwcHg7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGhlaWdodDogMTAwJTtcbiAgbWF4LWhlaWdodDogbm9uZTtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogbm9uZTtcbiAganVzdGlmeS1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nOiAwcHg7XG4gIG9wYWNpdHk6IDA7XG4gIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47XG4gIHotaW5kZXg6IDk5OTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiBpbmhlcml0O1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAyMDBtcztcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHksIHZpc2liaWxpdHk7XG4gIG92ZXJmbG93LXk6IGhpZGRlbjtcbn1cclxuOndoZXJlKC5vcC1tb2RhbCkge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxyXG4ub3AtbW9kYWwtYm94IHtcbiAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDVlbSk7XG4gIGdyaWQtY29sdW1uLXN0YXJ0OiAxO1xuICBncmlkLXJvdy1zdGFydDogMTtcbiAgd2lkdGg6IDkxLjY2NjY2NyU7XG4gIG1heC13aWR0aDogMzJyZW07XG4gIC0tdHctc2NhbGUteDogLjk7XG4gIC0tdHctc2NhbGUteTogLjk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgcGFkZGluZzogMS41cmVtO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAyMDBtcztcbiAgYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjI1KSAwcHggMjVweCA1MHB4IC0xMnB4O1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluO1xufVxyXG4ub3AtbW9kYWwtb3Blbixcbi5vcC1tb2RhbDp0YXJnZXQsXG4ub3AtbW9kYWwtdG9nZ2xlOmNoZWNrZWQgKyAub3AtbW9kYWwsXG4ub3AtbW9kYWxbb3Blbl0ge1xuICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgb3BhY2l0eTogMTtcbn1cclxuLm9wLW1vZGFsLWFjdGlvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG1hcmdpbi10b3A6IDEuNXJlbTtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbn1cclxuOnJvb3Q6aGFzKDppcygub3AtbW9kYWwtb3BlbiwgLm9wLW1vZGFsOnRhcmdldCwgLm9wLW1vZGFsLXRvZ2dsZTpjaGVja2VkICsgLm9wLW1vZGFsLCAub3AtbW9kYWxbb3Blbl0pKSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHNjcm9sbGJhci1ndXR0ZXI6IHN0YWJsZTtcbn1cclxuLm9wLW5hdmJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IHZhcigtLW5hdmJhci1wYWRkaW5nLCAwLjVyZW0pO1xuICBtaW4taGVpZ2h0OiA0cmVtO1xuICB3aWR0aDogMTAwJTtcbn1cclxuOndoZXJlKC5vcC1uYXZiYXIgPiAqOm5vdChzY3JpcHQsIHN0eWxlKSkge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cclxuLm9wLXJhZGlvIHtcbiAgZmxleC1zaHJpbms6IDA7XG4gIC0tY2hrYmc6IHZhcigtLWJjKTtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHdpZHRoOiAxLjVyZW07XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1zZWxlY3Qge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgaGVpZ2h0OiAzcmVtO1xuICBtaW4taGVpZ2h0OiAzcmVtO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogMXJlbTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiAyLjVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHRyYW5zcGFyZW50IDUwJSwgY3VycmVudENvbG9yIDUwJSksXG4gICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgY3VycmVudENvbG9yIDUwJSwgdHJhbnNwYXJlbnQgNTAlKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2FsYygxMDAlIC0gMjBweCkgY2FsYygxcHggKyA1MCUpLFxuICAgIGNhbGMoMTAwJSAtIDE2LjFweCkgY2FsYygxcHggKyA1MCUpO1xuICBiYWNrZ3JvdW5kLXNpemU6IDRweCA0cHgsXG4gICAgNHB4IDRweDtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbn1cclxuLm9wLXNlbGVjdFttdWx0aXBsZV0ge1xuICBoZWlnaHQ6IGF1dG87XG59XHJcbi5vcC10YWJzIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xufVxyXG4ub3AtdGFicy1saWZ0ZWQ6aGFzKC5vcC10YWItY29udGVudFtjbGFzc149XCJvcC1yb3VuZGVkLVwiXSlcbiAgICAub3AtdGFiOmZpcnN0LWNoaWxkOm5vdCg6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkpLCAub3AtdGFicy1saWZ0ZWQ6aGFzKC5vcC10YWItY29udGVudFtjbGFzcyo9XCIgb3Atcm91bmRlZC1cIl0pXG4gICAgLm9wLXRhYjpmaXJzdC1jaGlsZDpub3QoOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pKSB7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50O1xufVxyXG4ub3AtdGFiIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBncmlkLXJvdy1zdGFydDogMTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGhlaWdodDogMnJlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIC0tdGFiLXBhZGRpbmc6IDFyZW07XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjU7XG4gIC0tdGFiLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpO1xuICAtLXRhYi1iZzogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgLS10YWItYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMyxva2xjaCh2YXIoLS1iMykvMSkpO1xuICBjb2xvcjogdmFyKC0tdGFiLWNvbG9yKTtcbiAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS10YWItcGFkZGluZywgMXJlbSk7XG59XHJcbi5vcC10YWI6aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdKSB7XG4gIHdpZHRoOiBhdXRvO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMHB4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwcHg7XG59XHJcbi5vcC10YWI6aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdKTphZnRlciB7XG4gIC0tdHctY29udGVudDogYXR0cihhcmlhLWxhYmVsKTtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG59XHJcbi5vcC10YWI6bm90KGlucHV0KTplbXB0eSB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgZ3JpZC1jb2x1bW4tc3RhcnQ6IHNwYW4gOTk5OTtcbn1cclxuOmNoZWNrZWQgKyAub3AtdGFiLWNvbnRlbnQ6bnRoLWNoaWxkKDIpLFxuICA6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkgKyAub3AtdGFiLWNvbnRlbnQ6bnRoLWNoaWxkKDIpIHtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogMHB4O1xufVxyXG5pbnB1dC5vcC10YWI6Y2hlY2tlZCArIC5vcC10YWItY29udGVudCxcbjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSArIC5vcC10YWItY29udGVudCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxyXG4ub3AtdGFibGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKC5vcC10YWJsZS1waW4tcm93cyB0aGVhZCB0cikge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICB0b3A6IDBweDtcbiAgei1pbmRleDogMTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRhYmxlIDp3aGVyZSgub3AtdGFibGUtcGluLXJvd3MgdGZvb3QgdHIpIHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgYm90dG9tOiAwcHg7XG4gIHotaW5kZXg6IDE7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC10YWJsZSA6d2hlcmUoLm9wLXRhYmxlLXBpbi1jb2xzIHRyIHRoKSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIGxlZnQ6IDBweDtcbiAgcmlnaHQ6IDBweDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHRhcmVhIHtcbiAgbWluLWhlaWdodDogM3JlbTtcbiAgZmxleC1zaHJpbms6IDE7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgcGFkZGluZy10b3A6IDAuNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC10b2dnbGUge1xuICBmbGV4LXNocmluazogMDtcbiAgLS10Z2xiZzogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgLS1oYW5kbGVvZmZzZXQ6IDEuNXJlbTtcbiAgLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yOiBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgKiAtMSk7XG4gIC0tdG9nZ2xlaGFuZGxlYm9yZGVyOiAwIDA7XG4gIGhlaWdodDogMS41cmVtO1xuICB3aWR0aDogM3JlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1iYWRnZSwgMS45cmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogY3VycmVudENvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC41KSk7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQsXG4gICAgYm94LXNoYWRvdyB2YXIoLS1hbmltYXRpb24taW5wdXQsIDAuMnMpIGVhc2Utb3V0O1xuICBib3gtc2hhZG93OiB2YXIoLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yKSAwIDAgMnB4IHZhcigtLXRnbGJnKSBpbnNldCxcbiAgICAwIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgIHZhcigtLXRvZ2dsZWhhbmRsZWJvcmRlcik7XG59XHJcbi5vcC1hbGVydC1pbmZvIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMC4yKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW5jLG9rbGNoKHZhcigtLWluYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLWFsZXJ0LWJnOiB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpO1xuICAtLWFsZXJ0LWJnLW1peDogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbn1cclxuLm9wLWFsZXJ0LXN1Y2Nlc3Mge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8wLjIpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zdWMsb2tsY2godmFyKC0tc3VjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tYWxlcnQtYmc6IHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8xKSk7XG4gIC0tYWxlcnQtYmctbWl4OiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xufVxyXG4ub3AtYWxlcnQtd2FybmluZyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzAuMikpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhYyxva2xjaCh2YXIoLS13YWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS1hbGVydC1iZzogdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKTtcbiAgLS1hbGVydC1iZy1taXg6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSk7XG59XHJcbi5vcC1hbGVydC1lcnJvciB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stZXIsb2tsY2godmFyKC0tZXIpLzAuMikpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyYyxva2xjaCh2YXIoLS1lcmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS1hbGVydC1iZzogdmFyKC0tZmFsbGJhY2stZXIsb2tsY2godmFyKC0tZXIpLzEpKTtcbiAgLS1hbGVydC1iZy1taXg6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSk7XG59XHJcbi5vcC1iYWRnZS1wcmltYXJ5IHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYmFkZ2Utb3V0bGluZS5vcC1iYWRnZS1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiBuby1wcmVmZXJlbmNlKSB7XG5cbiAgLm9wLWJ0biB7XG4gICAgYW5pbWF0aW9uOiBidXR0b24tcG9wIHZhcigtLWFuaW1hdGlvbi1idG4sIDAuMjVzKSBlYXNlLW91dDtcbiAgfVxufVxyXG4ub3AtYnRuOmFjdGl2ZTpob3ZlcixcbiAgLm9wLWJ0bjphY3RpdmU6Zm9jdXMge1xuICBhbmltYXRpb246IGJ1dHRvbi1wb3AgMHMgZWFzZS1vdXQ7XG4gIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tYnRuLWZvY3VzLXNjYWxlLCAwLjk3KSk7XG59XHJcbkBzdXBwb3J0cyBub3QgKGNvbG9yOiBva2xjaCgwJSAwIDApKSB7XG5cbiAgLm9wLWJ0biB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1mYWxsYmFjay1iMikpO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1mYWxsYmFjay1iMikpO1xuICB9XG5cbiAgLm9wLWJ0bi1wcmltYXJ5IHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCk7XG4gIH1cblxuICAub3AtYnRuLXNlY29uZGFyeSB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWZhbGxiYWNrLXMpO1xuICB9XG5cbiAgLm9wLWJ0bi1hY2NlbnQge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1hKTtcbiAgfVxuXG4gIC5vcC1idG4tbmV1dHJhbCB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWZhbGxiYWNrLW4pO1xuICB9XG5cbiAgLm9wLWJ0bi1pbmZvIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2staW4pO1xuICB9XG5cbiAgLm9wLWJ0bi1lcnJvciB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyKTtcbiAgfVxufVxyXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KFxuICAgICAgICAgIGluIG9rbGFiLFxuICAgICAgICAgIG9rbGNoKHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tYjMpKSAvIHZhcigtLXR3LWJnLW9wYWNpdHksIDEpKSA5MCUsXG4gICAgICAgICAgYmxhY2tcbiAgICAgICAgKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChcbiAgICAgICAgICBpbiBva2xhYixcbiAgICAgICAgICBva2xjaCh2YXIoLS1idG4tY29sb3IsIHZhcigtLWIzKSkgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSwgMSkpIDkwJSxcbiAgICAgICAgICBibGFja1xuICAgICAgICApO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1wcmltYXJ5Lm9wLWJ0bi1hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDkwJSwgYmxhY2spO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zZWNvbmRhcnkub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSkgOTAlLCBibGFjayk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudC5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1hLG9rbGNoKHZhcigtLWEpLzEpKSA5MCUsIGJsYWNrKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tc3VjY2Vzcy5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8xKSkgOTAlLCBibGFjayk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWluZm8ub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpIDkwJSwgYmxhY2spO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi13YXJuaW5nLm9wLWJ0bi1hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKSA5MCUsIGJsYWNrKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3Iub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpIDkwJSwgYmxhY2spO1xuICB9XG59XHJcbi5vcC1idG46Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1idG4tcHJpbWFyeSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcGMsb2tsY2godmFyKC0tcGMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS8xKSk7XG59XHJcbkBzdXBwb3J0cyAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAub3AtYnRuLXByaW1hcnkge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1wKTtcbiAgfVxuXG4gIC5vcC1idG4tc2Vjb25kYXJ5IHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tcyk7XG4gIH1cblxuICAub3AtYnRuLWFjY2VudCB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWEpO1xuICB9XG5cbiAgLm9wLWJ0bi1uZXV0cmFsIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tbik7XG4gIH1cblxuICAub3AtYnRuLWluZm8ge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1pbik7XG4gIH1cblxuICAub3AtYnRuLWVycm9yIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZXIpO1xuICB9XG59XHJcbi5vcC1idG4tc2Vjb25kYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zYyxva2xjaCh2YXIoLS1zYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKTtcbn1cclxuLm9wLWJ0bi1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWFjLG9rbGNoKHZhcigtLWFjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpO1xufVxyXG4ub3AtYnRuLW5ldXRyYWwge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW5jLG9rbGNoKHZhcigtLW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvMSkpO1xufVxyXG4ub3AtYnRuLWluZm8ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWluYyxva2xjaCh2YXIoLS1pbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pLzEpKTtcbn1cclxuLm9wLWJ0bi1lcnJvciB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stZXJjLG9rbGNoKHZhcigtLWVyYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpO1xufVxyXG4ub3AtYnRuLm9wLWdsYXNzIHtcbiAgLS10dy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xuICBvdXRsaW5lLWNvbG9yOiBjdXJyZW50Q29sb3I7XG59XHJcbi5vcC1idG4ub3AtZ2xhc3Mub3AtYnRuLWFjdGl2ZSB7XG4gIC0tZ2xhc3Mtb3BhY2l0eTogMjUlO1xuICAtLWdsYXNzLWJvcmRlci1vcGFjaXR5OiAxNSU7XG59XHJcbi5vcC1idG4tZ2hvc3Qge1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIC0tdHctc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMCAjMDAwMDtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbiAgb3V0bGluZS1jb2xvcjogY3VycmVudENvbG9yO1xufVxyXG4ub3AtYnRuLWdob3N0Lm9wLWJ0bi1hY3RpdmUge1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC1idG4tbGluay5vcC1idG4tYWN0aXZlIHtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiB1bmRlcmxpbmU7XG59XHJcbi5vcC1idG4tb3V0bGluZSB7XG4gIGJvcmRlci1jb2xvcjogY3VycmVudENvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLXR3LXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXNoYWRvdyk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1wcmltYXJ5Lm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tc2Vjb25kYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zZWNvbmRhcnkub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc2Msb2tsY2godmFyKC0tc2MpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudC5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1hYyxva2xjaCh2YXIoLS1hYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXN1Y2Nlc3Mge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tc3VjY2Vzcy5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zdWMsb2tsY2godmFyKC0tc3VjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4taW5mbyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1pbmZvLm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWluYyxva2xjaCh2YXIoLS1pbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi13YXJuaW5nIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXdhcm5pbmcub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2std2FjLG9rbGNoKHZhcigtLXdhYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWVycm9yIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWVycm9yLm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyYyxva2xjaCh2YXIoLS1lcmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi5vcC1idG4tZGlzYWJsZWQsXG4gIC5vcC1idG5bZGlzYWJsZWRdLFxuICAub3AtYnRuOmRpc2FibGVkIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuMjtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1idG46aXMoaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQpLFxuLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl06Y2hlY2tlZCkge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG46aXMoaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQpOmZvY3VzLXZpc2libGUsIC5vcC1idG46aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdOmNoZWNrZWQpOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKTtcbn1cclxuQGtleWZyYW1lcyBidXR0b24tcG9wIHtcblxuICAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1idG4tZm9jdXMtc2NhbGUsIDAuOTgpKTtcbiAgfVxuXG4gIDQwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTtcbiAgfVxuXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbn1cclxuLm9wLWNhcmQgOndoZXJlKGZpZ3VyZTpmaXJzdC1jaGlsZCkge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IHVuc2V0O1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IHVuc2V0O1xufVxyXG4ub3AtY2FyZCA6d2hlcmUoZmlndXJlOmxhc3QtY2hpbGQpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogdW5zZXQ7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiB1bnNldDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWNhcmQ6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1jYXJkLm9wLWJvcmRlcmVkIHtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4ub3AtY2FyZC5vcC1jb21wYWN0IC5vcC1jYXJkLWJvZHkge1xuICBwYWRkaW5nOiAxcmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbn1cclxuLm9wLWNhcmQtdGl0bGUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuNXJlbTtcbiAgZm9udC1zaXplOiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbn1cclxuLm9wLWNhcmQub3AtaW1hZ2UtZnVsbCA6d2hlcmUoZmlndXJlKSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbi5vcC1jaGVja2JveDpmb2N1cyB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XHJcbi5vcC1jaGVja2JveDpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbn1cclxuLm9wLWNoZWNrYm94OmRpc2FibGVkIHtcbiAgYm9yZGVyLXdpZHRoOiAwcHg7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWNoZWNrYm94OmNoZWNrZWQsXG4gIC5vcC1jaGVja2JveFthcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdIHtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYW5pbWF0aW9uOiBjaGVja21hcmsgdmFyKC0tYW5pbWF0aW9uLWlucHV0LCAwLjJzKSBlYXNlLW91dDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2hrYmcpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoLTQ1ZGVnLCB0cmFuc3BhcmVudCA2NSUsIHZhcigtLWNoa2JnKSA2NS45OSUpLFxuICAgICAgbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCB0cmFuc3BhcmVudCA3NSUsIHZhcigtLWNoa2JnKSA3NS45OSUpLFxuICAgICAgbGluZWFyLWdyYWRpZW50KC00NWRlZywgdmFyKC0tY2hrYmcpIDQwJSwgdHJhbnNwYXJlbnQgNDAuOTklKSxcbiAgICAgIGxpbmVhci1ncmFkaWVudChcbiAgICAgICAgNDVkZWcsXG4gICAgICAgIHZhcigtLWNoa2JnKSAzMCUsXG4gICAgICAgIHZhcigtLWNoa2ZnKSAzMC45OSUsXG4gICAgICAgIHZhcigtLWNoa2ZnKSA0MCUsXG4gICAgICAgIHRyYW5zcGFyZW50IDQwLjk5JVxuICAgICAgKSxcbiAgICAgIGxpbmVhci1ncmFkaWVudCgtNDVkZWcsIHZhcigtLWNoa2ZnKSA1MCUsIHZhcigtLWNoa2JnKSA1MC45OSUpO1xufVxyXG4ub3AtY2hlY2tib3g6aW5kZXRlcm1pbmF0ZSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGFuaW1hdGlvbjogY2hlY2ttYXJrIHZhcigtLWFuaW1hdGlvbi1pbnB1dCwgMC4ycykgZWFzZS1vdXQ7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQgODAlLCB2YXIoLS1jaGtiZykgODAlKSxcbiAgICAgIGxpbmVhci1ncmFkaWVudCgtOTBkZWcsIHRyYW5zcGFyZW50IDgwJSwgdmFyKC0tY2hrYmcpIDgwJSksXG4gICAgICBsaW5lYXItZ3JhZGllbnQoMGRlZywgdmFyKC0tY2hrYmcpIDQzJSwgdmFyKC0tY2hrZmcpIDQzJSwgdmFyKC0tY2hrZmcpIDU3JSwgdmFyKC0tY2hrYmcpIDU3JSk7XG59XHJcbkBrZXlmcmFtZXMgY2hlY2ttYXJrIHtcblxuICAwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbi15OiA1cHg7XG4gIH1cblxuICA1MCUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb24teTogLTJweDtcbiAgfVxuXG4gIDEwMCUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb24teTogMDtcbiAgfVxufVxyXG4ub3AtZGl2aWRlcjpub3QoOmVtcHR5KSB7XG4gIGdhcDogMXJlbTtcbn1cclxuLm9wLWRyb3Bkb3duLm9wLWRyb3Bkb3duLW9wZW4gLm9wLWRyb3Bkb3duLWNvbnRlbnQsXG4ub3AtZHJvcGRvd246Zm9jdXMgLm9wLWRyb3Bkb3duLWNvbnRlbnQsXG4ub3AtZHJvcGRvd246Zm9jdXMtd2l0aGluIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4ub3AtZmlsZS1pbnB1dC1ib3JkZXJlZCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWZpbGUtaW5wdXQ6Zm9jdXMge1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC1maWxlLWlucHV0LWRpc2FibGVkLFxuICAub3AtZmlsZS1pbnB1dFtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWZpbGUtaW5wdXQtZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3AtZmlsZS1pbnB1dFtkaXNhYmxlZF06OnBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5KSkpO1xuICAtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWZpbGUtaW5wdXQtZGlzYWJsZWQ6OmZpbGUtc2VsZWN0b3ItYnV0dG9uLCAub3AtZmlsZS1pbnB1dFtkaXNhYmxlZF06OmZpbGUtc2VsZWN0b3ItYnV0dG9uIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuMjtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1pbnB1dCBpbnB1dCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cclxuLm9wLWlucHV0IGlucHV0OmZvY3VzIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3AtaW5wdXRbbGlzdF06Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvciB7XG4gIGxpbmUtaGVpZ2h0OiAxZW07XG59XHJcbi5vcC1pbnB1dC1ib3JkZXJlZCB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3AtaW5wdXQ6Zm9jdXMsXG4gIC5vcC1pbnB1dDpmb2N1cy13aXRoaW4ge1xuICBib3gtc2hhZG93OiBub25lO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3AtaW5wdXQ6aGFzKD4gaW5wdXRbZGlzYWJsZWRdKSxcbiAgLm9wLWlucHV0LWRpc2FibGVkLFxuICAub3AtaW5wdXQ6ZGlzYWJsZWQsXG4gIC5vcC1pbnB1dFtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjQpKTtcbn1cclxuLm9wLWlucHV0Omhhcyg+IGlucHV0W2Rpc2FibGVkXSk6OnBsYWNlaG9sZGVyLFxuICAub3AtaW5wdXQtZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3AtaW5wdXQ6ZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3AtaW5wdXRbZGlzYWJsZWRdOjpwbGFjZWhvbGRlciB7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1pbnB1dDpoYXMoPiBpbnB1dFtkaXNhYmxlZF0pID4gaW5wdXRbZGlzYWJsZWRdIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cclxuLm9wLWlucHV0Ojotd2Via2l0LWRhdGUtYW5kLXRpbWUtdmFsdWUge1xuICB0ZXh0LWFsaWduOiBpbmhlcml0O1xufVxyXG4ub3Atam9pbiA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKSB7XG4gIG1hcmdpbi10b3A6IDBweDtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiAtMXB4O1xufVxyXG4ub3Atam9pbiA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKTppcygub3AtYnRuKSB7XG4gIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IGNhbGModmFyKC0tYm9yZGVyLWJ0bikgKiAtMSk7XG59XHJcbi5vcC1qb2luLWl0ZW06Zm9jdXMge1xuICBpc29sYXRpb246IGlzb2xhdGU7XG59XHJcbi5vcC1saW5rLXByaW1hcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBva2xhYixibGFjayxibGFjaykpIHtcblxuICBAbWVkaWEgKGhvdmVyOmhvdmVyKSB7XG5cbiAgICAub3AtbGluay1wcmltYXJ5OmhvdmVyIHtcbiAgICAgIGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS8xKSkgODAlLGJsYWNrKTtcbiAgICB9XG5cbiAgICAub3AtbGluay1zZWNvbmRhcnk6aG92ZXIge1xuICAgICAgY29sb3I6IGNvbG9yLW1peChpbiBva2xhYix2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA4MCUsYmxhY2spO1xuICAgIH1cblxuICAgIC5vcC1saW5rLWFjY2VudDpob3ZlciB7XG4gICAgICBjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDgwJSxibGFjayk7XG4gICAgfVxuICB9XG59XHJcbi5vcC1saW5rLXNlY29uZGFyeSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1saW5rLWFjY2VudCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1saW5rOmZvY3VzIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3AtbGluazpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWxvYWRpbmcge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBhc3BlY3QtcmF0aW86IDEgLyAxO1xuICB3aWR0aDogMS41cmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIC13ZWJraXQtbWFzay1zaXplOiAxMDAlO1xuICAgICAgICAgIG1hc2stc2l6ZTogMTAwJTtcbiAgLXdlYmtpdC1tYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICAgIG1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gIC13ZWJraXQtbWFzay1wb3NpdGlvbjogY2VudGVyO1xuICAgICAgICAgIG1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19ffSk7XG4gICAgICAgICAgbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xufVxyXG4ub3AtbG9hZGluZy1pbmZpbml0eSB7XG4gIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xuICAgICAgICAgIG1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX199KTtcbn1cclxuOndoZXJlKC5vcC1tZW51IGxpOmVtcHR5KSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuMTtcbiAgbWFyZ2luOiAwLjVyZW0gMXJlbTtcbiAgaGVpZ2h0OiAxcHg7XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaSB1bCk6YmVmb3JlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDAuNzVyZW07XG4gIGluc2V0LWlubGluZS1zdGFydDogMHB4O1xuICB0b3A6IDAuNzVyZW07XG4gIHdpZHRoOiAxcHg7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuMTtcbiAgY29udGVudDogXCJcIjtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUsIC5vcC1idG4pKSxcbi5vcC1tZW51IDp3aGVyZShsaTpub3QoLm9wLW1lbnUtdGl0bGUpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSkge1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xuICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMjAwbXM7XG4gIHRleHQtd3JhcDogYmFsYW5jZTtcbn1cclxuOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSkpOm5vdChzdW1tYXJ5LCAub3AtYWN0aXZlLCAub3AtYnRuKS5vcC1mb2N1cywgOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSkpOm5vdChzdW1tYXJ5LCAub3AtYWN0aXZlLCAub3AtYnRuKTpmb2N1cywgOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSkpOmlzKHN1bW1hcnkpOm5vdCgub3AtYWN0aXZlLCAub3AtYnRuKTpmb2N1cy12aXNpYmxlLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KHN1bW1hcnksIC5vcC1hY3RpdmUsIC5vcC1idG4pLm9wLWZvY3VzLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KHN1bW1hcnksIC5vcC1hY3RpdmUsIC5vcC1idG4pOmZvY3VzLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6aXMoc3VtbWFyeSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmZvY3VzLXZpc2libGUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjEpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1tZW51IGxpID4gKjpub3QodWwsIC5vcC1tZW51LXRpdGxlLCBkZXRhaWxzLCAub3AtYnRuKTphY3RpdmUsXG4ub3AtbWVudSBsaSA+ICo6bm90KHVsLCAub3AtbWVudS10aXRsZSwgZGV0YWlscywgLm9wLWJ0bikub3AtYWN0aXZlLFxuLm9wLW1lbnUgbGkgPiBkZXRhaWxzID4gc3VtbWFyeTphY3RpdmUge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1uYyxva2xjaCh2YXIoLS1uYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGkgPiBkZXRhaWxzID4gc3VtbWFyeSk6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuICBkaXNwbGF5OiBub25lO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGkgPiBkZXRhaWxzID4gc3VtbWFyeSk6YWZ0ZXIsXG4ub3AtbWVudSA6d2hlcmUobGkgPiAub3AtbWVudS1kcm9wZG93bi10b2dnbGUpOmFmdGVyIHtcbiAganVzdGlmeS1zZWxmOiBlbmQ7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tdG9wOiAtMC41cmVtO1xuICBoZWlnaHQ6IDAuNXJlbTtcbiAgd2lkdGg6IDAuNXJlbTtcbiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG1hcmdpbi10b3A7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICBjb250ZW50OiBcIlwiO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiA3NSUgNzUlO1xuICBib3gtc2hhZG93OiAycHggMnB4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpID4gZGV0YWlsc1tvcGVuXSA+IHN1bW1hcnkpOmFmdGVyLFxuLm9wLW1lbnUgOndoZXJlKGxpID4gLm9wLW1lbnUtZHJvcGRvd24tdG9nZ2xlLm9wLW1lbnUtZHJvcGRvd24tc2hvdyk6YWZ0ZXIge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgyMjVkZWcpO1xuICBtYXJnaW4tdG9wOiAwO1xufVxyXG4ub3AtbW9ja3VwLWJyb3dzZXIgLm9wLW1vY2t1cC1icm93c2VyLXRvb2xiYXIgLm9wLWlucHV0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiAxLjc1cmVtO1xuICB3aWR0aDogMjRyZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBwYWRkaW5nLWxlZnQ6IDJyZW07XG4gIGRpcmVjdGlvbjogbHRyO1xufVxyXG4ub3AtbW9ja3VwLWJyb3dzZXIgLm9wLW1vY2t1cC1icm93c2VyLXRvb2xiYXIgLm9wLWlucHV0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMC41cmVtO1xuICB0b3A6IDUwJTtcbiAgYXNwZWN0LXJhdGlvOiAxIC8gMTtcbiAgaGVpZ2h0OiAwLjc1cmVtO1xuICAtLXR3LXRyYW5zbGF0ZS15OiAtNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBib3JkZXItd2lkdGg6IDJweDtcbiAgYm9yZGVyLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIG9wYWNpdHk6IDAuNjtcbn1cclxuLm9wLW1vY2t1cC1icm93c2VyIC5vcC1tb2NrdXAtYnJvd3Nlci10b29sYmFyIC5vcC1pbnB1dDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMS4yNXJlbTtcbiAgdG9wOiA1MCU7XG4gIGhlaWdodDogMC41cmVtO1xuICAtLXR3LXRyYW5zbGF0ZS15OiAyNSU7XG4gIC0tdHctcm90YXRlOiAtNDVkZWc7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgb3BhY2l0eTogMC42O1xufVxyXG4ub3AtbW9kYWw6bm90KGRpYWxvZzpub3QoLm9wLW1vZGFsLW9wZW4pKSxcbiAgLm9wLW1vZGFsOjpiYWNrZHJvcCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA2O1xuICBhbmltYXRpb246IG1vZGFsLXBvcCAwLjJzIGVhc2Utb3V0O1xufVxyXG4ub3AtbW9kYWwtb3BlbiAub3AtbW9kYWwtYm94LFxuLm9wLW1vZGFsLXRvZ2dsZTpjaGVja2VkICsgLm9wLW1vZGFsIC5vcC1tb2RhbC1ib3gsXG4ub3AtbW9kYWw6dGFyZ2V0IC5vcC1tb2RhbC1ib3gsXG4ub3AtbW9kYWxbb3Blbl0gLm9wLW1vZGFsLWJveCB7XG4gIC0tdHctdHJhbnNsYXRlLXk6IDBweDtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4ub3AtbW9kYWwtYWN0aW9uID4gOm5vdChbaGlkZGVuXSkgfiA6bm90KFtoaWRkZW5dKSB7XG4gIC0tdHctc3BhY2UteC1yZXZlcnNlOiAwO1xuICBtYXJnaW4tcmlnaHQ6IGNhbGMoMC41cmVtICogdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSk7XG4gIG1hcmdpbi1sZWZ0OiBjYWxjKDAuNXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpKTtcbn1cclxuQGtleWZyYW1lcyBtb2RhbC1wb3Age1xuXG4gIDAlIHtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG59XHJcbkBrZXlmcmFtZXMgcHJvZ3Jlc3MtbG9hZGluZyB7XG5cbiAgNTAlIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uLXg6IC0xMTUlO1xuICB9XG59XHJcbi5vcC1yYWRpbzpmb2N1cyB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XHJcbi5vcC1yYWRpbzpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbn1cclxuLm9wLXJhZGlvOmNoZWNrZWQsXG4gIC5vcC1yYWRpb1thcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgYW5pbWF0aW9uOiByYWRpb21hcmsgdmFyKC0tYW5pbWF0aW9uLWlucHV0LCAwLjJzKSBlYXNlLW91dDtcbiAgYm94LXNoYWRvdzogMCAwIDAgNHB4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQsXG4gICAgICAwIDAgMCA0cHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldDtcbn1cclxuLm9wLXJhZGlvOmRpc2FibGVkIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgb3BhY2l0eTogMC4yO1xufVxyXG5Aa2V5ZnJhbWVzIHJhZGlvbWFyayB7XG5cbiAgMCUge1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDEycHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldCxcbiAgICAgIDAgMCAwIDEycHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldDtcbiAgfVxuXG4gIDUwJSB7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQsXG4gICAgICAwIDAgMCAzcHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldDtcbiAgfVxuXG4gIDEwMCUge1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDRweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0LFxuICAgICAgMCAwIDAgNHB4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQ7XG4gIH1cbn1cclxuQGtleWZyYW1lcyByYXRpbmctcG9wIHtcblxuICAwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0wLjEyNWVtKTtcbiAgfVxuXG4gIDQwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0wLjEyNWVtKTtcbiAgfVxuXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgfVxufVxyXG4ub3Atc2VsZWN0LWJvcmRlcmVkIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC1zZWxlY3Q6Zm9jdXMge1xuICBib3gtc2hhZG93OiBub25lO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3Atc2VsZWN0LWRpc2FibGVkLFxuICAub3Atc2VsZWN0OmRpc2FibGVkLFxuICAub3Atc2VsZWN0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuNCkpO1xufVxyXG4ub3Atc2VsZWN0LWRpc2FibGVkOjpwbGFjZWhvbGRlcixcbiAgLm9wLXNlbGVjdDpkaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC1zZWxlY3RbZGlzYWJsZWRdOjpwbGFjZWhvbGRlciB7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1zZWxlY3QtbXVsdGlwbGUsXG4gIC5vcC1zZWxlY3RbbXVsdGlwbGVdLFxuICAub3Atc2VsZWN0W3NpemVdLm9wLXNlbGVjdDpub3QoW3NpemU9XCIxXCJdKSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIHBhZGRpbmctcmlnaHQ6IDFyZW07XG59XHJcbltkaXI9XCJydGxcIl0gLm9wLXNlbGVjdCB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNhbGMoMCUgKyAxMnB4KSBjYWxjKDFweCArIDUwJSksXG4gICAgY2FsYygwJSArIDE2cHgpIGNhbGMoMXB4ICsgNTAlKTtcbn1cclxuQGtleWZyYW1lcyBza2VsZXRvbiB7XG5cbiAgZnJvbSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTUwJTtcbiAgfVxuXG4gIHRvIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTAlO1xuICB9XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6Zm9jdXMtdmlzaWJsZSB7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IDA7XG59XHJcbi5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKSwgLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKSB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbn1cclxuLm9wLXRhYjpmb2N1cyB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLXRhYjpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgb3V0bGluZS1vZmZzZXQ6IC01cHg7XG59XHJcbi5vcC10YWItZGlzYWJsZWQsXG4gIC5vcC10YWJbZGlzYWJsZWRdIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC10YWJzLWJvcmRlcmVkID4gLm9wLXRhYiB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwLjI7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGModmFyKC0tdGFiLWJvcmRlciwgMXB4KSArIDFweCk7XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWIge1xuICBib3JkZXI6IHZhcigtLXRhYi1ib3JkZXIsIDFweCkgc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci13aWR0aDogMCAwIHZhcigtLXRhYi1ib3JkZXIsIDFweCkgMDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogdmFyKC0tdGFiLXJhZGl1cywgMC41cmVtKTtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IHZhcigtLXRhYi1yYWRpdXMsIDAuNXJlbSk7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0tdGFiLXBhZGRpbmcsIDFyZW0pO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKTtcbiAgcGFkZGluZy10b3A6IHZhcigtLXRhYi1ib3JkZXIsIDFweCk7XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKSwgLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRhYi1iZyk7XG4gIGJvcmRlci13aWR0aDogdmFyKC0tdGFiLWJvcmRlciwgMXB4KSB2YXIoLS10YWItYm9yZGVyLCAxcHgpIDAgdmFyKC0tdGFiLWJvcmRlciwgMXB4KTtcbiAgYm9yZGVyLWlubGluZS1zdGFydC1jb2xvcjogdmFyKC0tdGFiLWJvcmRlci1jb2xvcik7XG4gIGJvcmRlci1pbmxpbmUtZW5kLWNvbG9yOiB2YXIoLS10YWItYm9yZGVyLWNvbG9yKTtcbiAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tdGFiLWJvcmRlci1jb2xvcik7XG4gIHBhZGRpbmctaW5saW5lLXN0YXJ0OiBjYWxjKHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKSAtIHZhcigtLXRhYi1ib3JkZXIsIDFweCkpO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IGNhbGModmFyKC0tdGFiLXBhZGRpbmcsIDFyZW0pIC0gdmFyKC0tdGFiLWJvcmRlciwgMXB4KSk7XG4gIHBhZGRpbmctYm90dG9tOiB2YXIoLS10YWItYm9yZGVyLCAxcHgpO1xuICBwYWRkaW5nLXRvcDogMDtcbn1cclxuLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmJlZm9yZSwgLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKTpiZWZvcmUge1xuICB6LWluZGV4OiAxO1xuICBjb250ZW50OiBcIlwiO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogY2FsYygxMDAlICsgdmFyKC0tdGFiLXJhZGl1cywgMC41cmVtKSAqIDIpO1xuICBoZWlnaHQ6IHZhcigtLXRhYi1yYWRpdXMsIDAuNXJlbSk7XG4gIGJvdHRvbTogMDtcbiAgYmFja2dyb3VuZC1zaXplOiB2YXIoLS10YWItcmFkaXVzLCAwLjVyZW0pO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdCxcbiAgICAgICAgdG9wIHJpZ2h0O1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAtLXRhYi1ncmFkOiBjYWxjKDY5JSAtIHZhcigtLXRhYi1ib3JkZXIsIDFweCkpO1xuICAtLXJhZGl1cy1zdGFydDogcmFkaWFsLWdyYWRpZW50KFxuICAgICAgICBjaXJjbGUgYXQgdG9wIGxlZnQsXG4gICAgICAgIHRyYW5zcGFyZW50IHZhcigtLXRhYi1ncmFkKSxcbiAgICAgICAgdmFyKC0tdGFiLWJvcmRlci1jb2xvcikgY2FsYyh2YXIoLS10YWItZ3JhZCkgKyAwLjI1cHgpLFxuICAgICAgICB2YXIoLS10YWItYm9yZGVyLWNvbG9yKSBjYWxjKHZhcigtLXRhYi1ncmFkKSArIHZhcigtLXRhYi1ib3JkZXIsIDFweCkpLFxuICAgICAgICB2YXIoLS10YWItYmcpIGNhbGModmFyKC0tdGFiLWdyYWQpICsgdmFyKC0tdGFiLWJvcmRlciwgMXB4KSArIDAuMjVweClcbiAgICAgICk7XG4gIC0tcmFkaXVzLWVuZDogcmFkaWFsLWdyYWRpZW50KFxuICAgICAgICBjaXJjbGUgYXQgdG9wIHJpZ2h0LFxuICAgICAgICB0cmFuc3BhcmVudCB2YXIoLS10YWItZ3JhZCksXG4gICAgICAgIHZhcigtLXRhYi1ib3JkZXItY29sb3IpIGNhbGModmFyKC0tdGFiLWdyYWQpICsgMC4yNXB4KSxcbiAgICAgICAgdmFyKC0tdGFiLWJvcmRlci1jb2xvcikgY2FsYyh2YXIoLS10YWItZ3JhZCkgKyB2YXIoLS10YWItYm9yZGVyLCAxcHgpKSxcbiAgICAgICAgdmFyKC0tdGFiLWJnKSBjYWxjKHZhcigtLXRhYi1ncmFkKSArIHZhcigtLXRhYi1ib3JkZXIsIDFweCkgKyAwLjI1cHgpXG4gICAgICApO1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yYWRpdXMtc3RhcnQpLCB2YXIoLS1yYWRpdXMtZW5kKTtcbn1cclxuLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmZpcnN0LWNoaWxkOmJlZm9yZSwgLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKTpmaXJzdC1jaGlsZDpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yYWRpdXMtZW5kKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIHJpZ2h0O1xufVxyXG5bZGlyPVwicnRsXCJdIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpmaXJzdC1jaGlsZDpiZWZvcmUsIFtkaXI9XCJydGxcIl0gLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKTpmaXJzdC1jaGlsZDpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yYWRpdXMtc3RhcnQpO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDtcbn1cclxuLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmxhc3QtY2hpbGQ6YmVmb3JlLCAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpOmxhc3QtY2hpbGQ6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLXN0YXJ0KTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIGxlZnQ7XG59XHJcbltkaXI9XCJydGxcIl0gLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmxhc3QtY2hpbGQ6YmVmb3JlLCBbZGlyPVwicnRsXCJdIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCk6bGFzdC1jaGlsZDpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yYWRpdXMtZW5kKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIHJpZ2h0O1xufVxyXG4ub3AtdGFicy1saWZ0ZWRcbiAgPiA6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKVxuICArIC5vcC10YWJzLWxpZnRlZFxuICA6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpiZWZvcmUsIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCkgKyAub3AtdGFicy1saWZ0ZWQgLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKTpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yYWRpdXMtZW5kKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIHJpZ2h0O1xufVxyXG4ub3AtdGFicy1ib3hlZCB7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBwYWRkaW5nOiAwLjI1cmVtO1xufVxyXG4ub3AtdGFicy1ib3hlZCAub3AtdGFiIHtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG59XHJcbi5vcC10YWJzLWJveGVkIDppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pLCAub3AtdGFicy1ib3hlZCA6aXMoaW5wdXQ6Y2hlY2tlZCkge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGFibGU6d2hlcmUoW2Rpcj1cInJ0bFwiXSwgW2Rpcj1cInJ0bFwiXSAqKSB7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxyXG4ub3AtdGFibGUgOndoZXJlKHRoLCB0ZCkge1xuICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDFyZW07XG4gIHBhZGRpbmctdG9wOiAwLjc1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC43NXJlbTtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cclxuLm9wLXRhYmxlIHRyLm9wLWFjdGl2ZSxcbiAgLm9wLXRhYmxlIHRyLm9wLWFjdGl2ZTpudGgtY2hpbGQoZXZlbiksXG4gIC5vcC10YWJsZS16ZWJyYSB0Ym9keSB0cjpudGgtY2hpbGQoZXZlbikge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKHRoZWFkIHRyLCB0Ym9keSB0cjpub3QoOmxhc3QtY2hpbGQpLCB0Ym9keSB0cjpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkKSB7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDFweDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKHRoZWFkLCB0Zm9vdCkge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxcmVtO1xuICBmb250LXdlaWdodDogNzAwO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuNikpO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKHRmb290KSB7XG4gIGJvcmRlci10b3Atd2lkdGg6IDFweDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGV4dGFyZWEtYm9yZGVyZWQge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLXRleHRhcmVhOmZvY3VzIHtcbiAgYm94LXNoYWRvdzogbm9uZTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLXRleHRhcmVhLWRpc2FibGVkLFxuICAub3AtdGV4dGFyZWE6ZGlzYWJsZWQsXG4gIC5vcC10ZXh0YXJlYVtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjQpKTtcbn1cclxuLm9wLXRleHRhcmVhLWRpc2FibGVkOjpwbGFjZWhvbGRlcixcbiAgLm9wLXRleHRhcmVhOmRpc2FibGVkOjpwbGFjZWhvbGRlcixcbiAgLm9wLXRleHRhcmVhW2Rpc2FibGVkXTo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eTogMC4yO1xufVxyXG5Aa2V5ZnJhbWVzIHRvYXN0LXBvcCB7XG5cbiAgMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC45KTtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG5cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XHJcbltkaXI9XCJydGxcIl0gLm9wLXRvZ2dsZSB7XG4gIC0taGFuZGxlb2Zmc2V0Y2FsY3VsYXRvcjogY2FsYyh2YXIoLS1oYW5kbGVvZmZzZXQpICogMSk7XG59XHJcbi5vcC10b2dnbGU6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLXRvZ2dsZTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cclxuLm9wLXRvZ2dsZTpjaGVja2VkLFxuICAub3AtdG9nZ2xlW2FyaWEtY2hlY2tlZD1cInRydWVcIl0ge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAtLWhhbmRsZW9mZnNldGNhbGN1bGF0b3I6IHZhcigtLWhhbmRsZW9mZnNldCk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuW2Rpcj1cInJ0bFwiXSAub3AtdG9nZ2xlOmNoZWNrZWQsIFtkaXI9XCJydGxcIl0gLm9wLXRvZ2dsZVthcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdIHtcbiAgLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yOiBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgKiAtMSk7XG59XHJcbi5vcC10b2dnbGU6aW5kZXRlcm1pbmF0ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgYm94LXNoYWRvdzogY2FsYyh2YXIoLS1oYW5kbGVvZmZzZXQpIC8gMikgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQsXG4gICAgICBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgLyAtMikgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQsXG4gICAgICAwIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0O1xufVxyXG5bZGlyPVwicnRsXCJdIC5vcC10b2dnbGU6aW5kZXRlcm1pbmF0ZSB7XG4gIGJveC1zaGFkb3c6IGNhbGModmFyKC0taGFuZGxlb2Zmc2V0KSAvIDIpIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgICAgICBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgLyAtMikgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQsXG4gICAgICAgIDAgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQ7XG59XHJcbi5vcC10b2dnbGUtc2Vjb25kYXJ5OmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKTtcbn1cclxuLm9wLXRvZ2dsZS1zZWNvbmRhcnk6Y2hlY2tlZCxcbiAgICAub3AtdG9nZ2xlLXNlY29uZGFyeVthcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwLjE7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXNjLG9rbGNoKHZhcigtLXNjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC10b2dnbGU6ZGlzYWJsZWQge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIG9wYWNpdHk6IDAuMztcbiAgLS10b2dnbGVoYW5kbGVib3JkZXI6IDAgMCAwIDNweCB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpIGluc2V0LFxuICAgICAgdmFyKC0taGFuZGxlb2Zmc2V0Y2FsY3VsYXRvcikgMCAwIDNweCB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpIGluc2V0O1xufVxyXG4ubm8tYW5pbWF0aW9uIHtcbiAgLS1idG4tZm9jdXMtc2NhbGU6IDE7XG4gIC0tYW5pbWF0aW9uLWJ0bjogMDtcbiAgLS1hbmltYXRpb24taW5wdXQ6IDA7XG59XHJcbi5vcC1idG4teHMge1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgbWluLWhlaWdodDogMS41cmVtO1xuICBwYWRkaW5nLWxlZnQ6IDAuNXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC41cmVtO1xuICBmb250LXNpemU6IDAuNzVyZW07XG59XHJcbi5vcC1idG4tc20ge1xuICBoZWlnaHQ6IDJyZW07XG4gIG1pbi1oZWlnaHQ6IDJyZW07XG4gIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbn1cclxuLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm9wLWJ0bi14cykge1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgd2lkdGg6IDEuNXJlbTtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLXNxdWFyZTp3aGVyZSgub3AtYnRuLXNtKSB7XG4gIGhlaWdodDogMnJlbTtcbiAgd2lkdGg6IDJyZW07XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm9wLWJ0bi1tZCkge1xuICBoZWlnaHQ6IDNyZW07XG4gIHdpZHRoOiAzcmVtO1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tc3F1YXJlOndoZXJlKC5vcC1idG4tbGcpIHtcbiAgaGVpZ2h0OiA0cmVtO1xuICB3aWR0aDogNHJlbTtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLWNpcmNsZTp3aGVyZSgub3AtYnRuLXhzKSB7XG4gIGhlaWdodDogMS41cmVtO1xuICB3aWR0aDogMS41cmVtO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm9wLWJ0bi1zbSkge1xuICBoZWlnaHQ6IDJyZW07XG4gIHdpZHRoOiAycmVtO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm9wLWJ0bi1tZCkge1xuICBoZWlnaHQ6IDNyZW07XG4gIHdpZHRoOiAzcmVtO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm9wLWJ0bi1sZykge1xuICBoZWlnaHQ6IDRyZW07XG4gIHdpZHRoOiA0cmVtO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuW3R5cGU9XCJjaGVja2JveFwiXS5vcC1jaGVja2JveC14cyB7XG4gIGhlaWdodDogMXJlbTtcbiAgd2lkdGg6IDFyZW07XG59XHJcblt0eXBlPVwiY2hlY2tib3hcIl0ub3AtY2hlY2tib3gtc20ge1xuICBoZWlnaHQ6IDEuMjVyZW07XG4gIHdpZHRoOiAxLjI1cmVtO1xufVxyXG4ub3AtZmlsZS1pbnB1dC1zbSB7XG4gIGhlaWdodDogMnJlbTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiAwLjc1cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG59XHJcbi5vcC1maWxlLWlucHV0LXNtOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbiB7XG4gIG1hcmdpbi1yaWdodDogMC43NXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbn1cclxuLm9wLWlucHV0LXhzIHtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHBhZGRpbmctbGVmdDogMC41cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVyZW07XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDFyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjYyNTtcbn1cclxuLm9wLWlucHV0LXNtIHtcbiAgaGVpZ2h0OiAycmVtO1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAycmVtO1xufVxyXG4ub3Atam9pbi5vcC1qb2luLXZlcnRpY2FsIHtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCAub3Atam9pbi1pdGVtOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCksXG4gIC5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwgKjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCAub3Atam9pbi1pdGVtOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksXG4gIC5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwgKjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsIHtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbn1cclxuLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsIC5vcC1qb2luLWl0ZW06Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSxcbiAgLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsICo6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbi5vcC1qb2luLm9wLWpvaW4taG9yaXpvbnRhbCAub3Atam9pbi1pdGVtOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksXG4gIC5vcC1qb2luLm9wLWpvaW4taG9yaXpvbnRhbCAqOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG5bdHlwZT1cInJhZGlvXCJdLm9wLXJhZGlvLXhzIHtcbiAgaGVpZ2h0OiAxcmVtO1xuICB3aWR0aDogMXJlbTtcbn1cclxuLm9wLXNlbGVjdC1zbSB7XG4gIGhlaWdodDogMnJlbTtcbiAgbWluLWhlaWdodDogMnJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAycmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMnJlbTtcbn1cclxuW2Rpcj1cInJ0bFwiXSAub3Atc2VsZWN0LXNtIHtcbiAgcGFkZGluZy1sZWZ0OiAycmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjc1cmVtO1xufVxyXG4ub3AtdGFicy1tZCA6d2hlcmUoLm9wLXRhYikge1xuICBoZWlnaHQ6IDJyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgLS10YWItcGFkZGluZzogMXJlbTtcbn1cclxuLm9wLXRhYnMtbGcgOndoZXJlKC5vcC10YWIpIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICBmb250LXNpemU6IDEuMTI1cmVtO1xuICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIC0tdGFiLXBhZGRpbmc6IDEuMjVyZW07XG59XHJcbi5vcC10YWJzLXNtIDp3aGVyZSgub3AtdGFiKSB7XG4gIGhlaWdodDogMS41cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogLjc1cmVtO1xuICAtLXRhYi1wYWRkaW5nOiAwLjc1cmVtO1xufVxyXG4ub3AtdGFicy14cyA6d2hlcmUoLm9wLXRhYikge1xuICBoZWlnaHQ6IDEuMjVyZW07XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgbGluZS1oZWlnaHQ6IC43NXJlbTtcbiAgLS10YWItcGFkZGluZzogMC41cmVtO1xufVxyXG4ub3AtY2FyZC1jb21wYWN0IC5vcC1jYXJkLWJvZHkge1xuICBwYWRkaW5nOiAxcmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbn1cclxuLm9wLWNhcmQtY29tcGFjdCAub3AtY2FyZC10aXRsZSB7XG4gIG1hcmdpbi1ib3R0b206IDAuMjVyZW07XG59XHJcbi5vcC1jYXJkLW5vcm1hbCAub3AtY2FyZC1ib2R5IHtcbiAgcGFkZGluZzogdmFyKC0tcGFkZGluZy1jYXJkLCAycmVtKTtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMS41cmVtO1xufVxyXG4ub3AtY2FyZC1ub3JtYWwgLm9wLWNhcmQtdGl0bGUge1xuICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtO1xufVxyXG4ub3Atam9pbi5vcC1qb2luLXZlcnRpY2FsID4gOndoZXJlKCo6bm90KDpmaXJzdC1jaGlsZCkpIHtcbiAgbWFyZ2luLWxlZnQ6IDBweDtcbiAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIG1hcmdpbi10b3A6IC0xcHg7XG59XHJcbi5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwgPiA6d2hlcmUoKjpub3QoOmZpcnN0LWNoaWxkKSk6aXMoLm9wLWJ0bikge1xuICBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWJvcmRlci1idG4pICogLTEpO1xufVxyXG4ub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwgPiA6d2hlcmUoKjpub3QoOmZpcnN0LWNoaWxkKSkge1xuICBtYXJnaW4tdG9wOiAwcHg7XG4gIG1hcmdpbi1ib3R0b206IDBweDtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogLTFweDtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsID4gOndoZXJlKCo6bm90KDpmaXJzdC1jaGlsZCkpOmlzKC5vcC1idG4pIHtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogY2FsYyh2YXIoLS1ib3JkZXItYnRuKSAqIC0xKTtcbn1cclxuLm9wLW1lbnUtc20gOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUpKSwgLm9wLW1lbnUtc20gOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKSB7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gIHBhZGRpbmctdG9wOiAwLjI1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC4yNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG59XHJcbi5vcC1tZW51LXNtIC5vcC1tZW51LXRpdGxlIHtcbiAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xufVxyXG4ub3AtbW9kYWwtdG9wIDp3aGVyZSgub3AtbW9kYWwtYm94KSB7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IG5vbmU7XG4gIC0tdHctdHJhbnNsYXRlLXk6IC0yLjVyZW07XG4gIC0tdHctc2NhbGUteDogMTtcbiAgLS10dy1zY2FsZS15OiAxO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7XG59XHJcbi5vcC1tb2RhbC1taWRkbGUgOndoZXJlKC5vcC1tb2RhbC1ib3gpIHtcbiAgd2lkdGg6IDkxLjY2NjY2NyU7XG4gIG1heC13aWR0aDogMzJyZW07XG4gIC0tdHctdHJhbnNsYXRlLXk6IDBweDtcbiAgLS10dy1zY2FsZS14OiAuOTtcbiAgLS10dy1zY2FsZS15OiAuOTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xufVxyXG4ub3AtbW9kYWwtYm90dG9tIDp3aGVyZSgub3AtbW9kYWwtYm94KSB7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IG5vbmU7XG4gIC0tdHctdHJhbnNsYXRlLXk6IDIuNXJlbTtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDBweDtcbn1cclxuLnNyLW9ubHkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG4gIGhlaWdodDogMXB4O1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IC0xcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGJvcmRlci13aWR0aDogMDtcbn1cclxuLnBvaW50ZXItZXZlbnRzLW5vbmUge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cclxuLnZpc2libGUge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xufVxyXG4uZml4ZWQge1xuICBwb3NpdGlvbjogZml4ZWQ7XG59XHJcbi5hYnNvbHV0ZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cclxuLnJlbGF0aXZlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxyXG4uc3RpY2t5IHtcbiAgcG9zaXRpb246IHN0aWNreTtcbn1cclxuLmluc2V0LTAge1xuICBpbnNldDogMHB4O1xufVxyXG4uLWJvdHRvbS1cXFxcWzExcHhcXFxcXSB7XG4gIGJvdHRvbTogLTExcHg7XG59XHJcbi4tYm90dG9tLVxcXFxbMXB4XFxcXF0ge1xuICBib3R0b206IC0xcHg7XG59XHJcbi4tcmlnaHQtMSB7XG4gIHJpZ2h0OiAtMC4yNXJlbTtcbn1cclxuLi1yaWdodC1cXFxcWzEycHhcXFxcXSB7XG4gIHJpZ2h0OiAtMTJweDtcbn1cclxuLi1yaWdodC1cXFxcWzEzcHhcXFxcXSB7XG4gIHJpZ2h0OiAtMTNweDtcbn1cclxuLi1yaWdodC1cXFxcWzFweFxcXFxdIHtcbiAgcmlnaHQ6IC0xcHg7XG59XHJcbi5ib3R0b20tMCB7XG4gIGJvdHRvbTogMHB4O1xufVxyXG4uYm90dG9tLTQge1xuICBib3R0b206IDFyZW07XG59XHJcbi5sZWZ0LTAge1xuICBsZWZ0OiAwcHg7XG59XHJcbi5sZWZ0LTFcXFxcLzIge1xuICBsZWZ0OiA1MCU7XG59XHJcbi5yaWdodC0wIHtcbiAgcmlnaHQ6IDBweDtcbn1cclxuLnJpZ2h0LTEge1xuICByaWdodDogMC4yNXJlbTtcbn1cclxuLnJpZ2h0LTIge1xuICByaWdodDogMC41cmVtO1xufVxyXG4ucmlnaHQtMyB7XG4gIHJpZ2h0OiAwLjc1cmVtO1xufVxyXG4ucmlnaHQtNCB7XG4gIHJpZ2h0OiAxcmVtO1xufVxyXG4ucmlnaHQtNSB7XG4gIHJpZ2h0OiAxLjI1cmVtO1xufVxyXG4ucmlnaHQtXFxcXFsxMHB4XFxcXF0ge1xuICByaWdodDogMTBweDtcbn1cclxuLnRvcC0wIHtcbiAgdG9wOiAwcHg7XG59XHJcbi50b3AtMSB7XG4gIHRvcDogMC4yNXJlbTtcbn1cclxuLnRvcC0yIHtcbiAgdG9wOiAwLjVyZW07XG59XHJcbi50b3AtMjAge1xuICB0b3A6IDVyZW07XG59XHJcbi50b3AtMyB7XG4gIHRvcDogMC43NXJlbTtcbn1cclxuLnRvcC1cXFxcWzEwXFxcXCVcXFxcXSB7XG4gIHRvcDogMTAlO1xufVxyXG4udG9wLVxcXFxbMXB4XFxcXF0ge1xuICB0b3A6IDFweDtcbn1cclxuLnRvcC1cXFxcWzJcXFxcLjU1cmVtXFxcXF0ge1xuICB0b3A6IDIuNTVyZW07XG59XHJcbi50b3AtXFxcXFs1MFxcXFwlXFxcXF0ge1xuICB0b3A6IDUwJTtcbn1cclxuLnRvcC1hdXRvIHtcbiAgdG9wOiBhdXRvO1xufVxyXG4uLXotXFxcXFsxXFxcXF0ge1xuICB6LWluZGV4OiAtMTtcbn1cclxuLnotMTAge1xuICB6LWluZGV4OiAxMDtcbn1cclxuLnotMjAge1xuICB6LWluZGV4OiAyMDtcbn1cclxuLnotMzAge1xuICB6LWluZGV4OiAzMDtcbn1cclxuLnotNDAge1xuICB6LWluZGV4OiA0MDtcbn1cclxuLnotNTAge1xuICB6LWluZGV4OiA1MDtcbn1cclxuLnotXFxcXFsxMDAwXFxcXF0ge1xuICB6LWluZGV4OiAxMDAwO1xufVxyXG4uei1cXFxcWzEwMFxcXFxdIHtcbiAgei1pbmRleDogMTAwO1xufVxyXG4uei1cXFxcWzEzMDBcXFxcXSB7XG4gIHotaW5kZXg6IDEzMDA7XG59XHJcbi56LVxcXFxbMTk5OVxcXFxdIHtcbiAgei1pbmRleDogMTk5OTtcbn1cclxuLnotXFxcXFsxXFxcXF0ge1xuICB6LWluZGV4OiAxO1xufVxyXG4uei1cXFxcWzIwMFxcXFxdIHtcbiAgei1pbmRleDogMjAwO1xufVxyXG4uei1cXFxcWzIwXFxcXF0ge1xuICB6LWluZGV4OiAyMDtcbn1cclxuLnotXFxcXFszMFxcXFxdIHtcbiAgei1pbmRleDogMzA7XG59XHJcbi56LVxcXFxbNDQ4XFxcXF0ge1xuICB6LWluZGV4OiA0NDg7XG59XHJcbi56LVxcXFxbNTAwXFxcXF0ge1xuICB6LWluZGV4OiA1MDA7XG59XHJcbi56LVxcXFxbNTAxXFxcXF0ge1xuICB6LWluZGV4OiA1MDE7XG59XHJcbi56LVxcXFxbNzBcXFxcXSB7XG4gIHotaW5kZXg6IDcwO1xufVxyXG4uei1cXFxcWzk5OVxcXFxdIHtcbiAgei1pbmRleDogOTk5O1xufVxyXG4uei1cXFxcWzk5XFxcXF0ge1xuICB6LWluZGV4OiA5OTtcbn1cclxuLm9yZGVyLWxhc3Qge1xuICBvcmRlcjogOTk5OTtcbn1cclxuLmNvbC1zcGFuLTEyIHtcbiAgZ3JpZC1jb2x1bW46IHNwYW4gMTIgLyBzcGFuIDEyO1xufVxyXG4ubS0xIHtcbiAgbWFyZ2luOiAwLjI1cmVtO1xufVxyXG4ubS0yIHtcbiAgbWFyZ2luOiAwLjVyZW07XG59XHJcbi5tLVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luOiAxMHB4O1xufVxyXG4ubS1cXFxcWzE1cHhcXFxcXSB7XG4gIG1hcmdpbjogMTVweDtcbn1cclxuLm0tXFxcXFsyMHB4XFxcXF0ge1xuICBtYXJnaW46IDIwcHg7XG59XHJcbi5tLVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW46IDJweDtcbn1cclxuLm0tXFxcXFs0cHhcXFxcXSB7XG4gIG1hcmdpbjogNHB4O1xufVxyXG4ubXgtMSB7XG4gIG1hcmdpbi1sZWZ0OiAwLjI1cmVtO1xuICBtYXJnaW4tcmlnaHQ6IDAuMjVyZW07XG59XHJcbi5teC0yIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNXJlbTtcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG59XHJcbi5teC0zIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNzVyZW07XG4gIG1hcmdpbi1yaWdodDogMC43NXJlbTtcbn1cclxuLm14LTQge1xuICBtYXJnaW4tbGVmdDogMXJlbTtcbiAgbWFyZ2luLXJpZ2h0OiAxcmVtO1xufVxyXG4ubXgtXFxcXFsxMDBweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDEwMHB4O1xuICBtYXJnaW4tcmlnaHQ6IDEwMHB4O1xufVxyXG4ubXgtXFxcXFsyNVxcXFwlXFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMjUlO1xuICBtYXJnaW4tcmlnaHQ6IDI1JTtcbn1cclxuLm14LVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMnB4O1xuICBtYXJnaW4tcmlnaHQ6IDJweDtcbn1cclxuLm14LVxcXFxbM3B4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogM3B4O1xuICBtYXJnaW4tcmlnaHQ6IDNweDtcbn1cclxuLm14LVxcXFxbNHB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogNHB4O1xuICBtYXJnaW4tcmlnaHQ6IDRweDtcbn1cclxuLm14LVxcXFxbNXB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogNXB4O1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cclxuLm14LWF1dG8ge1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xufVxyXG4ubXktMFxcXFwuNSB7XG4gIG1hcmdpbi10b3A6IDAuMTI1cmVtO1xuICBtYXJnaW4tYm90dG9tOiAwLjEyNXJlbTtcbn1cclxuLm15LTEge1xuICBtYXJnaW4tdG9wOiAwLjI1cmVtO1xuICBtYXJnaW4tYm90dG9tOiAwLjI1cmVtO1xufVxyXG4ubXktMiB7XG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xufVxyXG4ubXktMyB7XG4gIG1hcmdpbi10b3A6IDAuNzVyZW07XG4gIG1hcmdpbi1ib3R0b206IDAuNzVyZW07XG59XHJcbi5teS00IHtcbiAgbWFyZ2luLXRvcDogMXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbn1cclxuLm15LVxcXFxbMTVweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMTVweDtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cclxuLm15LVxcXFxbMXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxcHg7XG4gIG1hcmdpbi1ib3R0b206IDFweDtcbn1cclxuLm15LVxcXFxbMjBweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cclxuLm15LVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAycHg7XG4gIG1hcmdpbi1ib3R0b206IDJweDtcbn1cclxuLm15LVxcXFxbNXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cclxuLm1iLTAge1xuICBtYXJnaW4tYm90dG9tOiAwcHg7XG59XHJcbi5tYi0wXFxcXC41IHtcbiAgbWFyZ2luLWJvdHRvbTogMC4xMjVyZW07XG59XHJcbi5tYi0xIHtcbiAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTtcbn1cclxuLm1iLTExIHtcbiAgbWFyZ2luLWJvdHRvbTogMi43NXJlbTtcbn1cclxuLm1iLTIge1xuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG59XHJcbi5tYi0yXFxcXC41IHtcbiAgbWFyZ2luLWJvdHRvbTogMC42MjVyZW07XG59XHJcbi5tYi0zIHtcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLm1iLTQge1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xufVxyXG4ubWItXFxcXFswXFxcXC4zNXJlbVxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMC4zNXJlbTtcbn1cclxuLm1iLVxcXFxbMFxcXFwuNXJlbVxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xufVxyXG4ubWItXFxcXFswXFxcXC43NXJlbVxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLm1iLVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cclxuLm1iLVxcXFxbMTVweFxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cclxuLm1iLVxcXFxbMTZweFxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMTZweDtcbn1cclxuLm1iLVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tYm90dG9tOiAycHg7XG59XHJcbi5tYi1cXFxcWzVweFxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxyXG4ubWwtMFxcXFwuNSB7XG4gIG1hcmdpbi1sZWZ0OiAwLjEyNXJlbTtcbn1cclxuLm1sLTEge1xuICBtYXJnaW4tbGVmdDogMC4yNXJlbTtcbn1cclxuLm1sLTFcXFxcLjUge1xuICBtYXJnaW4tbGVmdDogMC4zNzVyZW07XG59XHJcbi5tbC0yIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNXJlbTtcbn1cclxuLm1sLTMge1xuICBtYXJnaW4tbGVmdDogMC43NXJlbTtcbn1cclxuLm1sLTQge1xuICBtYXJnaW4tbGVmdDogMXJlbTtcbn1cclxuLm1sLVxcXFxbMFxcXFwuNXJlbVxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNXJlbTtcbn1cclxuLm1sLVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG59XHJcbi5tbC1cXFxcWzEzcHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAxM3B4O1xufVxyXG4ubWwtXFxcXFsyMHB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMjBweDtcbn1cclxuLm1sLVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMnB4O1xufVxyXG4ubWwtXFxcXFszcHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAzcHg7XG59XHJcbi5tbC1cXFxcWzRweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDRweDtcbn1cclxuLm1sLVxcXFxbNXB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogNXB4O1xufVxyXG4ubWwtXFxcXFs2cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA2cHg7XG59XHJcbi5tbC1cXFxcWzdweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDdweDtcbn1cclxuLm1sLVxcXFxbOHB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogOHB4O1xufVxyXG4ubXItMSB7XG4gIG1hcmdpbi1yaWdodDogMC4yNXJlbTtcbn1cclxuLm1yLTFcXFxcLjUge1xuICBtYXJnaW4tcmlnaHQ6IDAuMzc1cmVtO1xufVxyXG4ubXItMiB7XG4gIG1hcmdpbi1yaWdodDogMC41cmVtO1xufVxyXG4ubXItNCB7XG4gIG1hcmdpbi1yaWdodDogMXJlbTtcbn1cclxuLm1yLVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xufVxyXG4ubXItXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbi1yaWdodDogMnB4O1xufVxyXG4ubXItXFxcXFszcHhcXFxcXSB7XG4gIG1hcmdpbi1yaWdodDogM3B4O1xufVxyXG4ubXItXFxcXFs0cHhcXFxcXSB7XG4gIG1hcmdpbi1yaWdodDogNHB4O1xufVxyXG4ubXItXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xufVxyXG4ubXItXFxcXFs4cHhcXFxcXSB7XG4gIG1hcmdpbi1yaWdodDogOHB4O1xufVxyXG4ubXQtMCB7XG4gIG1hcmdpbi10b3A6IDBweDtcbn1cclxuLm10LTBcXFxcLjUge1xuICBtYXJnaW4tdG9wOiAwLjEyNXJlbTtcbn1cclxuLm10LTEge1xuICBtYXJnaW4tdG9wOiAwLjI1cmVtO1xufVxyXG4ubXQtMiB7XG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcbn1cclxuLm10LTJcXFxcLjUge1xuICBtYXJnaW4tdG9wOiAwLjYyNXJlbTtcbn1cclxuLm10LTMge1xuICBtYXJnaW4tdG9wOiAwLjc1cmVtO1xufVxyXG4ubXQtNCB7XG4gIG1hcmdpbi10b3A6IDFyZW07XG59XHJcbi5tdC02IHtcbiAgbWFyZ2luLXRvcDogMS41cmVtO1xufVxyXG4ubXQtXFxcXFswXFxcXC40cmVtXFxcXF0ge1xuICBtYXJnaW4tdG9wOiAwLjRyZW07XG59XHJcbi5tdC1cXFxcWzBcXFxcLjVyZW1cXFxcXSB7XG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcbn1cclxuLm10LVxcXFxbMFxcXFwuNzUwcmVtXFxcXF0ge1xuICBtYXJnaW4tdG9wOiAwLjc1MHJlbTtcbn1cclxuLm10LVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMTBweDtcbn1cclxuLm10LVxcXFxbMTRweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMTRweDtcbn1cclxuLm10LVxcXFxbMTVweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMTVweDtcbn1cclxuLm10LVxcXFxbMXJlbVxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMXJlbTtcbn1cclxuLm10LVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAycHg7XG59XHJcbi5tdC1cXFxcWzNweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogM3B4O1xufVxyXG4ubXQtXFxcXFs0M3B4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiA0M3B4O1xufVxyXG4ubXQtXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cclxuLm10LVxcXFxbNnB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiA2cHg7XG59XHJcbi5tdC1cXFxcWzhweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogOHB4O1xufVxyXG4uYmxvY2sge1xuICBkaXNwbGF5OiBibG9jaztcbn1cclxuLmlubGluZS1ibG9jayB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cclxuLmlubGluZSB7XG4gIGRpc3BsYXk6IGlubGluZTtcbn1cclxuLmZsZXgge1xuICBkaXNwbGF5OiBmbGV4O1xufVxyXG4uaW5saW5lLWZsZXgge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbn1cclxuLnRhYmxlIHtcbiAgZGlzcGxheTogdGFibGU7XG59XHJcbi5ncmlkIHtcbiAgZGlzcGxheTogZ3JpZDtcbn1cclxuLmNvbnRlbnRzIHtcbiAgZGlzcGxheTogY29udGVudHM7XG59XHJcbi5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxyXG4uaC0yIHtcbiAgaGVpZ2h0OiAwLjVyZW07XG59XHJcbi5oLTQge1xuICBoZWlnaHQ6IDFyZW07XG59XHJcbi5oLTUge1xuICBoZWlnaHQ6IDEuMjVyZW07XG59XHJcbi5oLVxcXFxbMFxcXFwuNXB4XFxcXF0ge1xuICBoZWlnaHQ6IDAuNXB4O1xufVxyXG4uaC1cXFxcWzFcXFxcLjRyZW1cXFxcXSB7XG4gIGhlaWdodDogMS40cmVtO1xufVxyXG4uaC1cXFxcWzFcXFxcLjdyZW1cXFxcXSB7XG4gIGhlaWdodDogMS43cmVtO1xufVxyXG4uaC1cXFxcWzEwMFxcXFwlXFxcXF0ge1xuICBoZWlnaHQ6IDEwMCU7XG59XHJcbi5oLVxcXFxbMTAwcHhcXFxcXSB7XG4gIGhlaWdodDogMTAwcHg7XG59XHJcbi5oLVxcXFxbMTAwdmhcXFxcXSB7XG4gIGhlaWdodDogMTAwdmg7XG59XHJcbi5oLVxcXFxbMTExcHhcXFxcXSB7XG4gIGhlaWdodDogMTExcHg7XG59XHJcbi5oLVxcXFxbMTIwcHhcXFxcXSB7XG4gIGhlaWdodDogMTIwcHg7XG59XHJcbi5oLVxcXFxbMTMwcHhcXFxcXSB7XG4gIGhlaWdodDogMTMwcHg7XG59XHJcbi5oLVxcXFxbMTQwcHhcXFxcXSB7XG4gIGhlaWdodDogMTQwcHg7XG59XHJcbi5oLVxcXFxbMTRweFxcXFxdIHtcbiAgaGVpZ2h0OiAxNHB4O1xufVxyXG4uaC1cXFxcWzE1MHB4XFxcXF0ge1xuICBoZWlnaHQ6IDE1MHB4O1xufVxyXG4uaC1cXFxcWzE5cHhcXFxcXSB7XG4gIGhlaWdodDogMTlweDtcbn1cclxuLmgtXFxcXFsxcHhcXFxcXSB7XG4gIGhlaWdodDogMXB4O1xufVxyXG4uaC1cXFxcWzIwMHB4XFxcXF0ge1xuICBoZWlnaHQ6IDIwMHB4O1xufVxyXG4uaC1cXFxcWzIwcHhcXFxcXSB7XG4gIGhlaWdodDogMjBweDtcbn1cclxuLmgtXFxcXFsyNTBweFxcXFxdIHtcbiAgaGVpZ2h0OiAyNTBweDtcbn1cclxuLmgtXFxcXFsyNXB4XFxcXF0ge1xuICBoZWlnaHQ6IDI1cHg7XG59XHJcbi5oLVxcXFxbMjZweFxcXFxdIHtcbiAgaGVpZ2h0OiAyNnB4O1xufVxyXG4uaC1cXFxcWzMwMHB4XFxcXF0ge1xuICBoZWlnaHQ6IDMwMHB4O1xufVxyXG4uaC1cXFxcWzMwcHhcXFxcXSB7XG4gIGhlaWdodDogMzBweDtcbn1cclxuLmgtXFxcXFszMTdweFxcXFxdIHtcbiAgaGVpZ2h0OiAzMTdweDtcbn1cclxuLmgtXFxcXFszMnB4XFxcXF0ge1xuICBoZWlnaHQ6IDMycHg7XG59XHJcbi5oLVxcXFxbMzVweFxcXFxdIHtcbiAgaGVpZ2h0OiAzNXB4O1xufVxyXG4uaC1cXFxcWzM4cHhcXFxcXSB7XG4gIGhlaWdodDogMzhweDtcbn1cclxuLmgtXFxcXFs0MHB4XFxcXF0ge1xuICBoZWlnaHQ6IDQwcHg7XG59XHJcbi5oLVxcXFxbNTAwcHhcXFxcXSB7XG4gIGhlaWdodDogNTAwcHg7XG59XHJcbi5oLVxcXFxbNTB2aFxcXFxdIHtcbiAgaGVpZ2h0OiA1MHZoO1xufVxyXG4uaC1cXFxcWzYwcHhcXFxcXSB7XG4gIGhlaWdodDogNjBweDtcbn1cclxuLmgtXFxcXFs2NnB4XFxcXF0ge1xuICBoZWlnaHQ6IDY2cHg7XG59XHJcbi5oLVxcXFxbNzBweFxcXFxdIHtcbiAgaGVpZ2h0OiA3MHB4O1xufVxyXG4uaC1cXFxcWzc1cHhcXFxcXSB7XG4gIGhlaWdodDogNzVweDtcbn1cclxuLmgtXFxcXFs5MFxcXFwlXFxcXF0ge1xuICBoZWlnaHQ6IDkwJTtcbn1cclxuLmgtXFxcXFs5NVxcXFwlXFxcXF0ge1xuICBoZWlnaHQ6IDk1JTtcbn1cclxuLmgtZnVsbCB7XG4gIGhlaWdodDogMTAwJTtcbn1cclxuLmgtc2NyZWVuIHtcbiAgaGVpZ2h0OiAxMDB2aDtcbn1cclxuLm1heC1oLTk2IHtcbiAgbWF4LWhlaWdodDogMjRyZW07XG59XHJcbi5tYXgtaC1cXFxcWzEwMHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAxMDBweDtcbn1cclxuLm1heC1oLVxcXFxbMTAwdmhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDEwMHZoO1xufVxyXG4ubWF4LWgtXFxcXFsxODBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMTgwcHg7XG59XHJcbi5tYXgtaC1cXFxcWzIxMHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAyMTBweDtcbn1cclxuLm1heC1oLVxcXFxbMjUwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDI1MHB4O1xufVxyXG4ubWF4LWgtXFxcXFszMDBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMzAwcHg7XG59XHJcbi5tYXgtaC1cXFxcWzMxMHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAzMTBweDtcbn1cclxuLm1heC1oLVxcXFxbMzQwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDM0MHB4O1xufVxyXG4ubWF4LWgtXFxcXFszNXB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAzNXB4O1xufVxyXG4ubWF4LWgtXFxcXFszOHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAzOHB4O1xufVxyXG4ubWF4LWgtXFxcXFs2MDBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogNjAwcHg7XG59XHJcbi5tYXgtaC1mdWxsIHtcbiAgbWF4LWhlaWdodDogMTAwJTtcbn1cclxuLm1heC1oLXNjcmVlbiB7XG4gIG1heC1oZWlnaHQ6IDEwMHZoO1xufVxyXG4ubWluLWgtbWF4IHtcbiAgbWluLWhlaWdodDogbWF4LWNvbnRlbnQ7XG59XHJcbi5taW4taC1zY3JlZW4ge1xuICBtaW4taGVpZ2h0OiAxMDB2aDtcbn1cclxuLnctMCB7XG4gIHdpZHRoOiAwcHg7XG59XHJcbi53LTFcXFxcLzQge1xuICB3aWR0aDogMjUlO1xufVxyXG4udy0yOCB7XG4gIHdpZHRoOiA3cmVtO1xufVxyXG4udy00IHtcbiAgd2lkdGg6IDFyZW07XG59XHJcbi53LTUge1xuICB3aWR0aDogMS4yNXJlbTtcbn1cclxuLnctNTIge1xuICB3aWR0aDogMTNyZW07XG59XHJcbi53LTkge1xuICB3aWR0aDogMi4yNXJlbTtcbn1cclxuLnctXFxcXFsxXFxcXC40cmVtXFxcXF0ge1xuICB3aWR0aDogMS40cmVtO1xufVxyXG4udy1cXFxcWzFcXFxcLjdyZW1cXFxcXSB7XG4gIHdpZHRoOiAxLjdyZW07XG59XHJcbi53LVxcXFxbMTAwcHhcXFxcXSB7XG4gIHdpZHRoOiAxMDBweDtcbn1cclxuLnctXFxcXFsxMHB4XFxcXF0ge1xuICB3aWR0aDogMTBweDtcbn1cclxuLnctXFxcXFsxMjBweFxcXFxdIHtcbiAgd2lkdGg6IDEyMHB4O1xufVxyXG4udy1cXFxcWzE0cHhcXFxcXSB7XG4gIHdpZHRoOiAxNHB4O1xufVxyXG4udy1cXFxcWzE1MHB4XFxcXF0ge1xuICB3aWR0aDogMTUwcHg7XG59XHJcbi53LVxcXFxbMThcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDE4JTtcbn1cclxuLnctXFxcXFsxODBweFxcXFxdIHtcbiAgd2lkdGg6IDE4MHB4O1xufVxyXG4udy1cXFxcWzE4M3B4XFxcXF0ge1xuICB3aWR0aDogMTgzcHg7XG59XHJcbi53LVxcXFxbMjBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDIwJTtcbn1cclxuLnctXFxcXFsyMDBweFxcXFxdIHtcbiAgd2lkdGg6IDIwMHB4O1xufVxyXG4udy1cXFxcWzIyMHB4XFxcXF0ge1xuICB3aWR0aDogMjIwcHg7XG59XHJcbi53LVxcXFxbMjNcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDIzJTtcbn1cclxuLnctXFxcXFsyM3B4XFxcXF0ge1xuICB3aWR0aDogMjNweDtcbn1cclxuLnctXFxcXFsyNTBweFxcXFxdIHtcbiAgd2lkdGg6IDI1MHB4O1xufVxyXG4udy1cXFxcWzI1cHhcXFxcXSB7XG4gIHdpZHRoOiAyNXB4O1xufVxyXG4udy1cXFxcWzI2cHhcXFxcXSB7XG4gIHdpZHRoOiAyNnB4O1xufVxyXG4udy1cXFxcWzI4MHB4XFxcXF0ge1xuICB3aWR0aDogMjgwcHg7XG59XHJcbi53LVxcXFxbMzBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDMwJTtcbn1cclxuLnctXFxcXFszMHB4XFxcXF0ge1xuICB3aWR0aDogMzBweDtcbn1cclxuLnctXFxcXFszNXB4XFxcXF0ge1xuICB3aWR0aDogMzVweDtcbn1cclxuLnctXFxcXFs0MHB4XFxcXF0ge1xuICB3aWR0aDogNDBweDtcbn1cclxuLnctXFxcXFs0NTBweFxcXFxdIHtcbiAgd2lkdGg6IDQ1MHB4O1xufVxyXG4udy1cXFxcWzRyZW1cXFxcXSB7XG4gIHdpZHRoOiA0cmVtO1xufVxyXG4udy1cXFxcWzUwXFxcXCVcXFxcXSB7XG4gIHdpZHRoOiA1MCU7XG59XHJcbi53LVxcXFxbNTBweFxcXFxdIHtcbiAgd2lkdGg6IDUwcHg7XG59XHJcbi53LVxcXFxbNjBweFxcXFxdIHtcbiAgd2lkdGg6IDYwcHg7XG59XHJcbi53LVxcXFxbNjVweFxcXFxdIHtcbiAgd2lkdGg6IDY1cHg7XG59XHJcbi53LVxcXFxbNzBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDcwJTtcbn1cclxuLnctXFxcXFs3NXB4XFxcXF0ge1xuICB3aWR0aDogNzVweDtcbn1cclxuLnctXFxcXFs4MFxcXFwlXFxcXF0ge1xuICB3aWR0aDogODAlO1xufVxyXG4udy1cXFxcWzg3XFxcXCVcXFxcXSB7XG4gIHdpZHRoOiA4NyU7XG59XHJcbi53LVxcXFxbOTBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDkwJTtcbn1cclxuLnctXFxcXFs5MHB4XFxcXF0ge1xuICB3aWR0aDogOTBweDtcbn1cclxuLnctXFxcXFs5NVxcXFwlXFxcXF0ge1xuICB3aWR0aDogOTUlO1xufVxyXG4udy1hdXRvIHtcbiAgd2lkdGg6IGF1dG87XG59XHJcbi53LWZpdCB7XG4gIHdpZHRoOiBmaXQtY29udGVudDtcbn1cclxuLnctZnVsbCB7XG4gIHdpZHRoOiAxMDAlO1xufVxyXG4udy1tYXgge1xuICB3aWR0aDogbWF4LWNvbnRlbnQ7XG59XHJcbi53LVxcXFxbMTg1cHhcXFxcXSB7XG4gIHdpZHRoOiAxODVweDtcbn1cclxuLnctXFxcXFsxOTBweFxcXFxdIHtcbiAgd2lkdGg6IDE5MHB4O1xufVxyXG4udy1cXFxcWzE5NXB4XFxcXF0ge1xuICB3aWR0aDogMTk1cHg7XG59XHJcbi5taW4tdy01NiB7XG4gIG1pbi13aWR0aDogMTRyZW07XG59XHJcbi5taW4tdy1cXFxcWzMwMHB4XFxcXF0ge1xuICBtaW4td2lkdGg6IDMwMHB4O1xufVxyXG4ubWluLXctXFxcXFs0OHB4XFxcXF0ge1xuICBtaW4td2lkdGg6IDQ4cHg7XG59XHJcbi5taW4tdy1cXFxcWzkwXFxcXCVcXFxcXSB7XG4gIG1pbi13aWR0aDogOTAlO1xufVxyXG4ubWF4LXctNTYge1xuICBtYXgtd2lkdGg6IDE0cmVtO1xufVxyXG4ubWF4LXctXFxcXFsyMDBweFxcXFxdIHtcbiAgbWF4LXdpZHRoOiAyMDBweDtcbn1cclxuLm1heC13LVxcXFxbMjUwcHhcXFxcXSB7XG4gIG1heC13aWR0aDogMjUwcHg7XG59XHJcbi5tYXgtdy1cXFxcWzI3MHB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDI3MHB4O1xufVxyXG4ubWF4LXctXFxcXFszNTBweFxcXFxdIHtcbiAgbWF4LXdpZHRoOiAzNTBweDtcbn1cclxuLm1heC13LVxcXFxbNDUwcHhcXFxcXSB7XG4gIG1heC13aWR0aDogNDUwcHg7XG59XHJcbi5tYXgtdy1cXFxcWzQ1cHhcXFxcXSB7XG4gIG1heC13aWR0aDogNDVweDtcbn1cclxuLm1heC13LVxcXFxbNTAwcHhcXFxcXSB7XG4gIG1heC13aWR0aDogNTAwcHg7XG59XHJcbi5tYXgtdy1zbSB7XG4gIG1heC13aWR0aDogMjRyZW07XG59XHJcbi5mbGV4LTEge1xuICBmbGV4OiAxIDEgMCU7XG59XHJcbi5mbGV4LW5vbmUge1xuICBmbGV4OiBub25lO1xufVxyXG4uZ3JvdyB7XG4gIGZsZXgtZ3JvdzogMTtcbn1cclxuLmJvcmRlci1jb2xsYXBzZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG59XHJcbi4tdHJhbnNsYXRlLXgtMVxcXFwvMiB7XG4gIC0tdHctdHJhbnNsYXRlLXg6IC01MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4uLXRyYW5zbGF0ZS15LTFcXFxcLzIge1xuICAtLXR3LXRyYW5zbGF0ZS15OiAtNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbn1cclxuLi10cmFuc2xhdGUteS1cXFxcWzUwXFxcXCVcXFxcXSB7XG4gIC0tdHctdHJhbnNsYXRlLXk6IC01MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4udHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcbi5jdXJzb3ItXFxcXFt1cmxcXFxcKFxcXFwnZGF0YVxcXFw6aW1hZ2VcXFxcL3BuZ1xcXFw7YmFzZTY0XFxcXDJjIGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4XFxcXC85aEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBU0VsRVFWUjRuR05nd0FNa0pTVWJwS1NrT3ZDcElhVDVQeFNUYm9nVVFqTVlNd3hlSUlYbVZGSXhBOFVHRER5UUdnMERuSURpNkpLVWxDeEhNcUNlWkFPZ2hqU0FNRDVGQUtmZWFVUmRVRnhDQUFBQUFFbEZUa1N1UW1DQ1xcXFwnXFxcXClcXFxcMmMgX3BvaW50ZXJcXFxcXSB7XG4gIGN1cnNvcjogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pLCBwb2ludGVyO1xufVxyXG4uY3Vyc29yLWFsbC1zY3JvbGwge1xuICBjdXJzb3I6IGFsbC1zY3JvbGw7XG59XHJcbi5jdXJzb3ItY3Jvc3NoYWlyIHtcbiAgY3Vyc29yOiBjcm9zc2hhaXI7XG59XHJcbi5jdXJzb3ItZGVmYXVsdCB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cclxuLmN1cnNvci1wb2ludGVyIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxyXG4uY3Vyc29yLXByb2dyZXNzIHtcbiAgY3Vyc29yOiBwcm9ncmVzcztcbn1cclxuLnNlbGVjdC1ub25lIHtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cclxuLnJlc2l6ZS1ub25lIHtcbiAgcmVzaXplOiBub25lO1xufVxyXG4ucmVzaXplIHtcbiAgcmVzaXplOiBib3RoO1xufVxyXG4ubGlzdC1kaXNjIHtcbiAgbGlzdC1zdHlsZS10eXBlOiBkaXNjO1xufVxyXG4ubGlzdC1ub25lIHtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xufVxyXG4uZ3JpZC1jb2xzLTEge1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgxLCBtaW5tYXgoMCwgMWZyKSk7XG59XHJcbi5ncmlkLWNvbHMtMTIge1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgxMiwgbWlubWF4KDAsIDFmcikpO1xufVxyXG4uZ3JpZC1jb2xzLTIge1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoMCwgMWZyKSk7XG59XHJcbi5mbGV4LXJvdyB7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG59XHJcbi5mbGV4LWNvbCB7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XHJcbi5mbGV4LXdyYXAge1xuICBmbGV4LXdyYXA6IHdyYXA7XG59XHJcbi5pdGVtcy1zdGFydCB7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xufVxyXG4uaXRlbXMtY2VudGVyIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cclxuLml0ZW1zLXN0cmV0Y2gge1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbn1cclxuLmp1c3RpZnktc3RhcnQge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG59XHJcbi5qdXN0aWZ5LWVuZCB7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG59XHJcbi5qdXN0aWZ5LWNlbnRlciB7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxyXG4uanVzdGlmeS1iZXR3ZWVuIHtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxyXG4uanVzdGlmeS1hcm91bmQge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbn1cclxuLmdhcC0wIHtcbiAgZ2FwOiAwcHg7XG59XHJcbi5nYXAtMFxcXFwuNSB7XG4gIGdhcDogMC4xMjVyZW07XG59XHJcbi5nYXAtMSB7XG4gIGdhcDogMC4yNXJlbTtcbn1cclxuLmdhcC0yIHtcbiAgZ2FwOiAwLjVyZW07XG59XHJcbi5nYXAtMyB7XG4gIGdhcDogMC43NXJlbTtcbn1cclxuLmdhcC00IHtcbiAgZ2FwOiAxcmVtO1xufVxyXG4uZ2FwLTUge1xuICBnYXA6IDEuMjVyZW07XG59XHJcbi5nYXAtOCB7XG4gIGdhcDogMnJlbTtcbn1cclxuLmdhcC1cXFxcWzEwcHhcXFxcXSB7XG4gIGdhcDogMTBweDtcbn1cclxuLmdhcC1cXFxcWzVweFxcXFxdIHtcbiAgZ2FwOiA1cHg7XG59XHJcbi5nYXAtXFxcXFs4cHhcXFxcXSB7XG4gIGdhcDogOHB4O1xufVxyXG4uZ2FwLXgtMiB7XG4gIGNvbHVtbi1nYXA6IDAuNXJlbTtcbn1cclxuLmdhcC14LTQge1xuICBjb2x1bW4tZ2FwOiAxcmVtO1xufVxyXG4uZ2FwLXgtNSB7XG4gIGNvbHVtbi1nYXA6IDEuMjVyZW07XG59XHJcbi5nYXAteC1cXFxcWzJweFxcXFxdIHtcbiAgY29sdW1uLWdhcDogMnB4O1xufVxyXG4uZ2FwLXgtXFxcXFs1cHhcXFxcXSB7XG4gIGNvbHVtbi1nYXA6IDVweDtcbn1cclxuLmdhcC15LTEge1xuICByb3ctZ2FwOiAwLjI1cmVtO1xufVxyXG4uZ2FwLXktMiB7XG4gIHJvdy1nYXA6IDAuNXJlbTtcbn1cclxuLmdhcC15LTMge1xuICByb3ctZ2FwOiAwLjc1cmVtO1xufVxyXG4uZ2FwLXktXFxcXFsycHhcXFxcXSB7XG4gIHJvdy1nYXA6IDJweDtcbn1cclxuLnBsYWNlLXNlbGYtY2VudGVyIHtcbiAgcGxhY2Utc2VsZjogY2VudGVyO1xufVxyXG4uc2VsZi1zdGFydCB7XG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG59XHJcbi5zZWxmLWNlbnRlciB7XG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcbn1cclxuLm92ZXJmbG93LWF1dG8ge1xuICBvdmVyZmxvdzogYXV0bztcbn1cclxuLm92ZXJmbG93LWhpZGRlbiB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XHJcbi5vdmVyZmxvdy14LWF1dG8ge1xuICBvdmVyZmxvdy14OiBhdXRvO1xufVxyXG4ub3ZlcmZsb3cteS1hdXRvIHtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cclxuLm92ZXJmbG93LXgtc2Nyb2xsIHtcbiAgb3ZlcmZsb3cteDogc2Nyb2xsO1xufVxyXG4ub3ZlcmZsb3cteS1zY3JvbGwge1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XHJcbi50ZXh0LWVsbGlwc2lzIHtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XHJcbi53aGl0ZXNwYWNlLW5vd3JhcCB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XHJcbi53aGl0ZXNwYWNlLXByZS13cmFwIHtcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xufVxyXG4uYnJlYWstd29yZHMge1xuICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xufVxyXG4uYnJlYWstYWxsIHtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxyXG4ucm91bmRlZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XG59XHJcbi5yb3VuZGVkLVxcXFxbMXB4XFxcXF0ge1xuICBib3JkZXItcmFkaXVzOiAxcHg7XG59XHJcbi5yb3VuZGVkLVxcXFxbMnB4XFxcXF0ge1xuICBib3JkZXItcmFkaXVzOiAycHg7XG59XHJcbi5yb3VuZGVkLWJveCB7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbn1cclxuLnJvdW5kZWQtZnVsbCB7XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbn1cclxuLnJvdW5kZWQtbGcge1xuICBib3JkZXItcmFkaXVzOiAwLjVyZW07XG59XHJcbi5yb3VuZGVkLW1kIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zNzVyZW07XG59XHJcbi5yb3VuZGVkLW5vbmUge1xuICBib3JkZXItcmFkaXVzOiAwcHg7XG59XHJcbi5yb3VuZGVkLXNtIHtcbiAgYm9yZGVyLXJhZGl1czogMC4xMjVyZW07XG59XHJcbi5yb3VuZGVkLXhsIHtcbiAgYm9yZGVyLXJhZGl1czogMC43NXJlbTtcbn1cclxuLnJvdW5kZWQtci1ub25lIHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDBweDtcbn1cclxuLmJvcmRlciB7XG4gIGJvcmRlci13aWR0aDogMXB4O1xufVxyXG4uYm9yZGVyLTIge1xuICBib3JkZXItd2lkdGg6IDJweDtcbn1cclxuLmJvcmRlci1cXFxcWzBcXFxcLjFweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAwLjFweDtcbn1cclxuLmJvcmRlci1cXFxcWzBcXFxcLjJweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAwLjJweDtcbn1cclxuLmJvcmRlci1cXFxcWzFcXFxcLjVweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAxLjVweDtcbn1cclxuLmJvcmRlci1cXFxcWzFweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG59XHJcbi5ib3JkZXItXFxcXFsycHhcXFxcXSB7XG4gIGJvcmRlci13aWR0aDogMnB4O1xufVxyXG4uYm9yZGVyLXktXFxcXFsxcHhcXFxcXSB7XG4gIGJvcmRlci10b3Atd2lkdGg6IDFweDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4O1xufVxyXG4uYm9yZGVyLWItXFxcXFsxcHhcXFxcXSB7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDFweDtcbn1cclxuLmJvcmRlci1iLVxcXFxbM3B4XFxcXF0ge1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAzcHg7XG59XHJcbi5ib3JkZXItci1cXFxcWzNweFxcXFxdIHtcbiAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAzcHg7XG59XHJcbi5ib3JkZXItdC1cXFxcWzFweFxcXFxdIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMXB4O1xufVxyXG4uYm9yZGVyLWRhc2hlZCB7XG4gIGJvcmRlci1zdHlsZTogZGFzaGVkO1xufVxyXG4uYm9yZGVyLW5vbmUge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcIzAwN2JmZlxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMCAxMjMgMjU1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjMTg4YWUyXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyNCAxMzggMjI2IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjMzNiYmZmXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYig1MSAxODcgMjU1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjODc4Nzg3XFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigxMzUgMTM1IDEzNSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcIzg4OFxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMTM2IDEzNiAxMzYgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCM4YThhOGFcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDEzOCAxMzggMTM4IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjY2VjZWNlXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyMDYgMjA2IDIwNiAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcI2Q2ZDNkM1xcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjE0IDIxMSAyMTEgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCNlYmU4ZThcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDIzNSAyMzIgMjMyIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW2dyYXlcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDEyOCAxMjggMTI4IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW3JlZFxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjU1IDAgMCAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItYmFzZS0yMDAge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuLmJvcmRlci1iYXNlLTMwMCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4uYm9yZGVyLWJhc2UtY29udGVudCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4uYm9yZGVyLWJsYWNrIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMCAwIDAgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLWdyYXktMzAwIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLWdyYXktNDAwIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMTU2IDE2MyAxNzUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLWluZGlnby04MDAge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYig1NSA0OCAxNjMgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLXQtcHJpbWFyeSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci10b3AtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjMmVkOGI2XFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYig0NiAyMTYgMTgyIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcIzU3NjA4MVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoODcgOTYgMTI5IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcIzhhOGE4YVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTM4IDEzOCAxMzggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjOTNhM2RiXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigxNDcgMTYzIDIxOSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCM5ZjlmOWZcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1OSAxNTkgMTU5IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcI0NBRTRGQVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjAyIDIyOCAyNTAgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjYjdiM2IzXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigxODMgMTc5IDE3OSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNjY2NcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCAyMDQgMjA0IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcI2UzZTJlMVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI3IDIyNiAyMjUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjZTZmMmYyXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzAgMjQyIDI0MiAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNlNmYyZjJcXFxcXVxcXFwvNzAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjMwIDI0MiAyNDIgLyAwLjcpO1xufVxyXG4uYmctXFxcXFtcXFxcI2ZmZlxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1iYXNlLTEwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5iZy1iYXNlLTIwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5iZy1iYXNlLTMwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5iZy1iYXNlLWNvbnRlbnQge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4uYmctYmFzZS1jb250ZW50XFxcXC8zMCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjMpKTtcbn1cclxuLmJnLWJsYWNrIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMCAwIDAgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1ibGFja1xcXFwvMzAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMCAwIDAgLyAwLjMpO1xufVxyXG4uYmctYmx1ZS01MDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYig1OSAxMzAgMjQ2IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctZ3JheS0yMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjkgMjMxIDIzNSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLWdyYXktMzAwIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1ncmF5LTQwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1NiAxNjMgMTc1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctZ3JheS01MCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0OSAyNTAgMjUxIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctaW5oZXJpdCB7XG4gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XG59XHJcbi5iZy10cmFuc3BhcmVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxyXG4uYmctd2hpdGUge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLXdoaXRlXFxcXC8yMCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIDAuMik7XG59XHJcbi5iZy1vcGFjaXR5LTIwIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAwLjI7XG59XHJcbi5iZy1vcGFjaXR5LTI1IHtcbiAgLS10dy1iZy1vcGFjaXR5OiAwLjI1O1xufVxyXG4uYmctb3BhY2l0eS0zMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMC4zO1xufVxyXG4uYmctb3BhY2l0eS01MCB7XG4gIC0tdHctYmctb3BhY2l0eTogMC41O1xufVxyXG4uYmctb3BhY2l0eS04MCB7XG4gIC0tdHctYmctb3BhY2l0eTogMC44O1xufVxyXG4uZmlsbC1jdXJyZW50IHtcbiAgZmlsbDogY3VycmVudENvbG9yO1xufVxyXG4ub2JqZWN0LWNvbnRhaW4ge1xuICBvYmplY3QtZml0OiBjb250YWluO1xufVxyXG4ucC0wIHtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ucC0xIHtcbiAgcGFkZGluZzogMC4yNXJlbTtcbn1cclxuLnAtMTQge1xuICBwYWRkaW5nOiAzLjVyZW07XG59XHJcbi5wLTIge1xuICBwYWRkaW5nOiAwLjVyZW07XG59XHJcbi5wLTMge1xuICBwYWRkaW5nOiAwLjc1cmVtO1xufVxyXG4ucC00IHtcbiAgcGFkZGluZzogMXJlbTtcbn1cclxuLnAtXFxcXFsxMHB4XFxcXF0ge1xuICBwYWRkaW5nOiAxMHB4O1xufVxyXG4ucC1cXFxcWzE1cHhcXFxcXSB7XG4gIHBhZGRpbmc6IDE1cHg7XG59XHJcbi5wLVxcXFxbMTZweFxcXFxdIHtcbiAgcGFkZGluZzogMTZweDtcbn1cclxuLnAtXFxcXFsxcHhcXFxcXSB7XG4gIHBhZGRpbmc6IDFweDtcbn1cclxuLnAtXFxcXFsyMHB4XFxcXF0ge1xuICBwYWRkaW5nOiAyMHB4O1xufVxyXG4ucC1cXFxcWzJweFxcXFxdIHtcbiAgcGFkZGluZzogMnB4O1xufVxyXG4ucC1cXFxcWzMwcHhcXFxcXSB7XG4gIHBhZGRpbmc6IDMwcHg7XG59XHJcbi5wLVxcXFxbM3B4XFxcXF0ge1xuICBwYWRkaW5nOiAzcHg7XG59XHJcbi5wLVxcXFxbNXB4XFxcXF0ge1xuICBwYWRkaW5nOiA1cHg7XG59XHJcbi5wLVxcXFxbOHB4XFxcXF0ge1xuICBwYWRkaW5nOiA4cHg7XG59XHJcbi5weC0wIHtcbiAgcGFkZGluZy1sZWZ0OiAwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDBweDtcbn1cclxuLnB4LTEge1xuICBwYWRkaW5nLWxlZnQ6IDAuMjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuMjVyZW07XG59XHJcbi5weC0yIHtcbiAgcGFkZGluZy1sZWZ0OiAwLjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNXJlbTtcbn1cclxuLnB4LTMge1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG59XHJcbi5weC00IHtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xufVxyXG4ucHgtNiB7XG4gIHBhZGRpbmctbGVmdDogMS41cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxLjVyZW07XG59XHJcbi5weC03IHtcbiAgcGFkZGluZy1sZWZ0OiAxLjc1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxLjc1cmVtO1xufVxyXG4ucHgtOCB7XG4gIHBhZGRpbmctbGVmdDogMnJlbTtcbiAgcGFkZGluZy1yaWdodDogMnJlbTtcbn1cclxuLnB4LVxcXFxbMVxcXFwuMjVyZW1cXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMS4yNXJlbTtcbiAgcGFkZGluZy1yaWdodDogMS4yNXJlbTtcbn1cclxuLnB4LVxcXFxbMTBweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xuICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xufVxyXG4ucHgtXFxcXFsxMnB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDEycHg7XG4gIHBhZGRpbmctcmlnaHQ6IDEycHg7XG59XHJcbi5weC1cXFxcWzEzcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMTNweDtcbiAgcGFkZGluZy1yaWdodDogMTNweDtcbn1cclxuLnB4LVxcXFxbMTVweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAxNXB4O1xuICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xufVxyXG4ucHgtXFxcXFsyMHB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDIwcHg7XG59XHJcbi5weC1cXFxcWzI1cHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMjVweDtcbiAgcGFkZGluZy1yaWdodDogMjVweDtcbn1cclxuLnB4LVxcXFxbM3B4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDNweDtcbiAgcGFkZGluZy1yaWdodDogM3B4O1xufVxyXG4ucHgtXFxcXFs0MHB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDQwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDQwcHg7XG59XHJcbi5weC1cXFxcWzRweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDRweDtcbn1cclxuLnB5LTEge1xuICBwYWRkaW5nLXRvcDogMC4yNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuMjVyZW07XG59XHJcbi5weS0xXFxcXC41IHtcbiAgcGFkZGluZy10b3A6IDAuMzc1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC4zNzVyZW07XG59XHJcbi5weS0xMCB7XG4gIHBhZGRpbmctdG9wOiAyLjVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAyLjVyZW07XG59XHJcbi5weS0yIHtcbiAgcGFkZGluZy10b3A6IDAuNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbn1cclxuLnB5LTMge1xuICBwYWRkaW5nLXRvcDogMC43NXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuNzVyZW07XG59XHJcbi5weS00IHtcbiAgcGFkZGluZy10b3A6IDFyZW07XG4gIHBhZGRpbmctYm90dG9tOiAxcmVtO1xufVxyXG4ucHktXFxcXFtcXFxcLjc1cmVtXFxcXF0ge1xuICBwYWRkaW5nLXRvcDogLjc1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogLjc1cmVtO1xufVxyXG4ucHktXFxcXFsxXFxcXC41cHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAxLjVweDtcbiAgcGFkZGluZy1ib3R0b206IDEuNXB4O1xufVxyXG4ucHktXFxcXFsxMHB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMTBweDtcbiAgcGFkZGluZy1ib3R0b206IDEwcHg7XG59XHJcbi5weS1cXFxcWzFweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDFweDtcbiAgcGFkZGluZy1ib3R0b206IDFweDtcbn1cclxuLnB5LVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG4gIHBhZGRpbmctYm90dG9tOiAyMHB4O1xufVxyXG4ucHktXFxcXFszcHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAzcHg7XG4gIHBhZGRpbmctYm90dG9tOiAzcHg7XG59XHJcbi5weS1cXFxcWzVweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDVweDtcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbn1cclxuLnB5LVxcXFxbOHB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogOHB4O1xuICBwYWRkaW5nLWJvdHRvbTogOHB4O1xufVxyXG4ucGItMCB7XG4gIHBhZGRpbmctYm90dG9tOiAwcHg7XG59XHJcbi5wYi0xIHtcbiAgcGFkZGluZy1ib3R0b206IDAuMjVyZW07XG59XHJcbi5wYi0yIHtcbiAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbn1cclxuLnBiLTMge1xuICBwYWRkaW5nLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLnBiLVxcXFxbMTVweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDE1cHg7XG59XHJcbi5wYi1cXFxcWzFweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDFweDtcbn1cclxuLnBiLVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XG59XHJcbi5wYi1cXFxcWzVweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbn1cclxuLnBsLTMge1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG59XHJcbi5wbC02IHtcbiAgcGFkZGluZy1sZWZ0OiAxLjVyZW07XG59XHJcbi5wbC1cXFxcWzEwcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbn1cclxuLnBsLVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xufVxyXG4ucGwtXFxcXFs1cHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogNXB4O1xufVxyXG4ucHItMSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuMjVyZW07XG59XHJcbi5wci0yIHtcbiAgcGFkZGluZy1yaWdodDogMC41cmVtO1xufVxyXG4ucHItXFxcXFszcHhcXFxcXSB7XG4gIHBhZGRpbmctcmlnaHQ6IDNweDtcbn1cclxuLnByLVxcXFxbNXB4XFxcXF0ge1xuICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG59XHJcbi5wdC0wIHtcbiAgcGFkZGluZy10b3A6IDBweDtcbn1cclxuLnB0LTEge1xuICBwYWRkaW5nLXRvcDogMC4yNXJlbTtcbn1cclxuLnB0LTIge1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xufVxyXG4ucHQtMyB7XG4gIHBhZGRpbmctdG9wOiAwLjc1cmVtO1xufVxyXG4ucHQtNCB7XG4gIHBhZGRpbmctdG9wOiAxcmVtO1xufVxyXG4ucHQtXFxcXFsxMHB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMTBweDtcbn1cclxuLnB0LVxcXFxbMTVweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDE1cHg7XG59XHJcbi5wdC1cXFxcWzIwcHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAyMHB4O1xufVxyXG4udGV4dC1sZWZ0IHtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cclxuLnRleHQtY2VudGVyIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxyXG4uYWxpZ24tYmFzZWxpbmUge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XHJcbi50ZXh0LTJ4bCB7XG4gIGZvbnQtc2l6ZTogMS41cmVtO1xuICBsaW5lLWhlaWdodDogMnJlbTtcbn1cclxuLnRleHQtM3hsIHtcbiAgZm9udC1zaXplOiAxLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDIuMjVyZW07XG59XHJcbi50ZXh0LVxcXFxbMVxcXFwuMnJlbVxcXFxdIHtcbiAgZm9udC1zaXplOiAxLjJyZW07XG59XHJcbi50ZXh0LVxcXFxbMVxcXFwuNXJlbVxcXFxdIHtcbiAgZm9udC1zaXplOiAxLjVyZW07XG59XHJcbi50ZXh0LVxcXFxbMTBweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxMHB4O1xufVxyXG4udGV4dC1cXFxcWzExcHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMTFweDtcbn1cclxuLnRleHQtXFxcXFsxMnB4XFxcXF0ge1xuICBmb250LXNpemU6IDEycHg7XG59XHJcbi50ZXh0LVxcXFxbMTNweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxyXG4udGV4dC1cXFxcWzE0cHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cclxuLnRleHQtXFxcXFsxNXB4XFxcXF0ge1xuICBmb250LXNpemU6IDE1cHg7XG59XHJcbi50ZXh0LVxcXFxbMTZweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxNnB4O1xufVxyXG4udGV4dC1cXFxcWzE4cHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMThweDtcbn1cclxuLnRleHQtXFxcXFsyMHB4XFxcXF0ge1xuICBmb250LXNpemU6IDIwcHg7XG59XHJcbi50ZXh0LVxcXFxbMjVweFxcXFxdIHtcbiAgZm9udC1zaXplOiAyNXB4O1xufVxyXG4udGV4dC1cXFxcWzMwcHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMzBweDtcbn1cclxuLnRleHQtXFxcXFs0MHB4XFxcXF0ge1xuICBmb250LXNpemU6IDQwcHg7XG59XHJcbi50ZXh0LVxcXFxbNjBweFxcXFxdIHtcbiAgZm9udC1zaXplOiA2MHB4O1xufVxyXG4udGV4dC1cXFxcWzhweFxcXFxdIHtcbiAgZm9udC1zaXplOiA4cHg7XG59XHJcbi50ZXh0LWJhc2Uge1xuICBmb250LXNpemU6IDFyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG59XHJcbi50ZXh0LWxnIHtcbiAgZm9udC1zaXplOiAxLjEyNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XG59XHJcbi50ZXh0LXNtIHtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG59XHJcbi50ZXh0LXhsIHtcbiAgZm9udC1zaXplOiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMS43NXJlbTtcbn1cclxuLnRleHQteHMge1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxcmVtO1xufVxyXG4uZm9udC1cXFxcWzQwMFxcXFxdIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbn1cclxuLmZvbnQtXFxcXFs1MDBcXFxcXSB7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XHJcbi5mb250LVxcXFxbNjUwXFxcXF0ge1xuICBmb250LXdlaWdodDogNjUwO1xufVxyXG4uZm9udC1cXFxcWzcwMFxcXFxdIHtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbn1cclxuLmZvbnQtYm9sZCB7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG59XHJcbi5mb250LWV4dHJhbGlnaHQge1xuICBmb250LXdlaWdodDogMjAwO1xufVxyXG4uZm9udC1saWdodCB7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG59XHJcbi5mb250LW1lZGl1bSB7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XHJcbi5mb250LW5vcm1hbCB7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG59XHJcbi5mb250LXNlbWlib2xkIHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbn1cclxuLnVwcGVyY2FzZSB7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG59XHJcbi5sb3dlcmNhc2Uge1xuICB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlO1xufVxyXG4uY2FwaXRhbGl6ZSB7XG4gIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xufVxyXG4uaXRhbGljIHtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjMDAyODYyXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigwIDQwIDk4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbXFxcXCMzM2JiZmZcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDUxIDE4NyAyNTUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcIzQyNDI0MlxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoNjYgNjYgNjYgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcIzg3ODc4N1xcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMTM1IDEzNSAxMzUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcI2E2NGI0ZVxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMTY2IDc1IDc4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbXFxcXCNhYzQ4NDhcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDE3MiA3MiA3MiAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjZjU0MDVlXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyNDUgNjQgOTQgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcI2ZhYjAwNVxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjUwIDE3NiA1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbYmx1ZVxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMCAwIDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW2dyYXlcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDEyOCAxMjggMTI4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbZ3JlZW5cXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDAgMTI4IDAgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtncmV5XFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxMjggMTI4IDEyOCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW3JlZFxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjU1IDAgMCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1iYXNlLTEwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLnRleHQtYmFzZS1jb250ZW50IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1ibGFjayB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDAgMCAwIC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWJsdWUtNjAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMzcgOTkgMjM1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWJsdWUtODAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMzAgNjQgMTc1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWdyYXktMzAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtZ3JheS00MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxNTYgMTYzIDE3NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1ncmF5LTUwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDEwNyAxMTQgMTI4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWdyYXktNzAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoNTUgNjUgODEgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtZ3JlZW4tNjAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjIgMTYzIDc0IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LW5ldXRyYWwge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1wcmltYXJ5LWNvbnRlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi50ZXh0LXJlZC01MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyMzkgNjggNjggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtcmVkLTYwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDIyMCAzOCAzOCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC10cmFuc3BhcmVudCB7XG4gIGNvbG9yOiB0cmFuc3BhcmVudDtcbn1cclxuLnRleHQtd2hpdGUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udW5kZXJsaW5lIHtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTtcbn1cclxuLm5vLXVuZGVybGluZSB7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiBub25lO1xufVxyXG4udW5kZXJsaW5lLW9mZnNldC0xIHtcbiAgdGV4dC11bmRlcmxpbmUtb2Zmc2V0OiAxcHg7XG59XHJcbi51bmRlcmxpbmUtb2Zmc2V0LTIge1xuICB0ZXh0LXVuZGVybGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLnVuZGVybGluZS1vZmZzZXQtOCB7XG4gIHRleHQtdW5kZXJsaW5lLW9mZnNldDogOHB4O1xufVxyXG4ub3BhY2l0eS01MCB7XG4gIG9wYWNpdHk6IDAuNTtcbn1cclxuLm9wYWNpdHktNzAge1xuICBvcGFjaXR5OiAwLjc7XG59XHJcbi5zaGFkb3cge1xuICAtLXR3LXNoYWRvdzogMCAxcHggM3B4IDAgcmdiKDAgMCAwIC8gMC4xKSwgMCAxcHggMnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKTtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAxcHggM3B4IDAgdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCAxcHggMnB4IC0xcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuLnNoYWRvdy1sZyB7XG4gIC0tdHctc2hhZG93OiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIDAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIDAuMSk7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMTBweCAxNXB4IC0zcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCA0cHggNnB4IC00cHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuLnNoYWRvdy1tZCB7XG4gIC0tdHctc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAwLjEpO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDRweCA2cHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDJweCA0cHggLTJweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xufVxyXG4ub3V0bGluZS1ub25lIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3V0bGluZSB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xufVxyXG4ub3V0bGluZS0xIHtcbiAgb3V0bGluZS13aWR0aDogMXB4O1xufVxyXG4ub3V0bGluZS1cXFxcWzFcXFxcLjVweFxcXFxdIHtcbiAgb3V0bGluZS13aWR0aDogMS41cHg7XG59XHJcbi5vdXRsaW5lLVxcXFxbXFxcXCMwMDdiZmZcXFxcXSB7XG4gIG91dGxpbmUtY29sb3I6ICMwMDdiZmY7XG59XHJcbi5vdXRsaW5lLXNsYXRlLTMwMFxcXFwvNTAge1xuICBvdXRsaW5lLWNvbG9yOiByZ2IoMjAzIDIxMyAyMjUgLyAwLjUpO1xufVxyXG4ucmluZy1cXFxcWzFweFxcXFxdIHtcbiAgLS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7XG4gIC0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMXB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSwgdmFyKC0tdHctcmluZy1zaGFkb3cpLCB2YXIoLS10dy1zaGFkb3csIDAgMCAjMDAwMCk7XG59XHJcbi5yaW5nLVxcXFxbMnB4XFxcXF0ge1xuICAtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpIHZhcigtLXR3LXJpbmctb2Zmc2V0LWNvbG9yKTtcbiAgLS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygycHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKTtcbn1cclxuLnJpbmctXFxcXFtcXFxcIzAwMjg2MlxcXFxdIHtcbiAgLS10dy1yaW5nLW9wYWNpdHk6IDE7XG4gIC0tdHctcmluZy1jb2xvcjogcmdiKDAgNDAgOTggLyB2YXIoLS10dy1yaW5nLW9wYWNpdHkpKTtcbn1cclxuLnJpbmctZ3JheS00MDAge1xuICAtLXR3LXJpbmctb3BhY2l0eTogMTtcbiAgLS10dy1yaW5nLWNvbG9yOiByZ2IoMTU2IDE2MyAxNzUgLyB2YXIoLS10dy1yaW5nLW9wYWNpdHkpKTtcbn1cclxuLnJpbmctb2Zmc2V0LTIge1xuICAtLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAycHg7XG59XHJcbi5ibHVyIHtcbiAgLS10dy1ibHVyOiBibHVyKDhweCk7XG4gIGZpbHRlcjogdmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KTtcbn1cclxuLmZpbHRlciB7XG4gIGZpbHRlcjogdmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KTtcbn1cclxuLnRyYW5zaXRpb24ge1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMTUwbXM7XG59XHJcbi50cmFuc2l0aW9uLWFsbCB7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGFsbDtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDE1MG1zO1xufVxyXG5cclxuYm9keSB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi8qIEN1c3RvbSBDU1MgdG8gaGlkZSBzY3JvbGxiYXIgKi9cclxuLmhpZGUtc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLmhpZGUtc2Nyb2xsYmFyIHtcclxuICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7IC8qIElFIGFuZCBFZGdlICovXHJcbiAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOyAvKiBGaXJlZm94ICovXHJcbn1cclxuXHJcbi8qIGJlbG93IGNzcyBjbGFzcyByZXBsYWNlIGJvb3RzdHJhcCBiYWNrZ3JvdW5kIGNvbG9yIHdpdGggZGFpc3kgKi9cclxuLm9wLWJnLXByaW1hcnkge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJnLXNlY29uZGFyeSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYmctaW5mbyB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC1iZy1zdWNjZXNzIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zdSxva2xjaCh2YXIoLS1zdSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJnLXdhcm5pbmcge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhLG9rbGNoKHZhcigtLXdhKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLyogYmVsb3cgY3NzIGNsYXNzIHJlcGxhY2UgYm9vdHN0cmFwIHRleHQgY29sb3Igd2l0aCBkYWlzeSAqL1xyXG4ub3AtdGV4dC1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtc2Vjb25kYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtaW5mbyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtYWNjZW50IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1hLG9rbGNoKHZhcigtLWEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtc3VjY2VzcyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHQtd2FybmluZyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJvcmRlci1wcmltYXJ5IHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4vKiBDU1MgZm9yIHNjcm9sbGJhciBjdXN0b21pemF0aW9uICovXHJcbioge1xyXG4gIHNjcm9sbGJhci13aWR0aDogdGhpbjsgLyogRm9yIEZpcmVmb3ggKi9cclxuICBzY3JvbGxiYXItY29sb3I6IGdyYXk7IC8qIEZvciBGaXJlZm94ICovXHJcbn1cclxuXHJcbi8qIEZvciB3ZWJraXQtYmFzZWQgYnJvd3NlcnMgbGlrZSBDaHJvbWUsIFNhZmFyaSAqL1xyXG4qOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgd2lkdGg6IDVweDtcclxufVxyXG5cclxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG59XHJcblxyXG4qOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcclxuICBib3JkZXItcmFkaXVzOiAxMHB4O1xyXG59XHJcblxyXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcblxuICAubWRcXFxcOm9wLWJ0bi1zbSB7XG4gICAgaGVpZ2h0OiAycmVtO1xuICAgIG1pbi1oZWlnaHQ6IDJyZW07XG4gICAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICAgIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6b3AtYnRuLW1kIHtcbiAgICBoZWlnaHQ6IDNyZW07XG4gICAgbWluLWhlaWdodDogM3JlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gICAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICB9XG5cbiAgLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm1kXFxcXDpvcC1idG4tc20pIHtcbiAgICBoZWlnaHQ6IDJyZW07XG4gICAgd2lkdGg6IDJyZW07XG4gICAgcGFkZGluZzogMHB4O1xuICB9XG5cbiAgLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm1kXFxcXDpvcC1idG4tbWQpIHtcbiAgICBoZWlnaHQ6IDNyZW07XG4gICAgd2lkdGg6IDNyZW07XG4gICAgcGFkZGluZzogMHB4O1xuICB9XG5cbiAgLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm1kXFxcXDpvcC1idG4tc20pIHtcbiAgICBoZWlnaHQ6IDJyZW07XG4gICAgd2lkdGg6IDJyZW07XG4gICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIHBhZGRpbmc6IDBweDtcbiAgfVxuXG4gIC5vcC1idG4tY2lyY2xlOndoZXJlKC5tZFxcXFw6b3AtYnRuLW1kKSB7XG4gICAgaGVpZ2h0OiAzcmVtO1xuICAgIHdpZHRoOiAzcmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICBwYWRkaW5nOiAwcHg7XG4gIH1cbn1cclxuXHJcbi5hZnRlclxcXFw6YWJzb2x1dGU6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cclxuXHJcbi5hZnRlclxcXFw6c3RhcnQtXFxcXFsycHhcXFxcXTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgaW5zZXQtaW5saW5lLXN0YXJ0OiAycHg7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOnRvcC1cXFxcWzJweFxcXFxdOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICB0b3A6IDJweDtcbn1cclxuXHJcbi5hZnRlclxcXFw6aC00OjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICBoZWlnaHQ6IDFyZW07XG59XHJcblxyXG4uYWZ0ZXJcXFxcOnctNDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgd2lkdGg6IDFyZW07XG59XHJcblxyXG4uYWZ0ZXJcXFxcOnJvdW5kZWQtZnVsbDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xufVxyXG5cclxuLmFmdGVyXFxcXDpib3JkZXI6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xufVxyXG5cclxuLmFmdGVyXFxcXDpib3JkZXItZ3JheS0zMDA6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDIwOSAyMTMgMjE5IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuXHJcbi5hZnRlclxcXFw6Ymctd2hpdGU6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG5cclxuLmFmdGVyXFxcXDp0cmFuc2l0aW9uLWFsbDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogYWxsO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMTUwbXM7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOmNvbnRlbnQtXFxcXFtcXFxcJ1xcXFwnXFxcXF06OmFmdGVyIHtcbiAgLS10dy1jb250ZW50OiAnJztcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG59XHJcblxyXG4ubGFzdFxcXFw6bWItMFxcXFwuNTpsYXN0LWNoaWxkIHtcbiAgbWFyZ2luLWJvdHRvbTogMC4xMjVyZW07XG59XHJcblxyXG4uY2hlY2tlZFxcXFw6Ymctd2hpdGU6Y2hlY2tlZCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG5cclxuLmNoZWNrZWRcXFxcOlxcXFxbLS10Z2xiZ1xcXFw6XFxcXCMzMzY4ZmZcXFxcXTpjaGVja2VkIHtcbiAgLS10Z2xiZzogIzMzNjhmZjtcbn1cclxuXHJcbi5ob3ZlclxcXFw6Y3Vyc29yLXN3LXJlc2l6ZTpob3ZlciB7XG4gIGN1cnNvcjogc3ctcmVzaXplO1xufVxyXG5cclxuLmhvdmVyXFxcXDpib3JkZXItXFxcXFtcXFxcI2QyZTNmY1xcXFxdOmhvdmVyIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjEwIDIyNyAyNTIgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG5cclxuLmhvdmVyXFxcXDpib3JkZXItYmFzZS1jb250ZW50OmhvdmVyIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcblxyXG4uaG92ZXJcXFxcOmJnLVxcXFxbXFxcXCNlY2YzZmViN1xcXFxdOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjZjNmZWI3O1xufVxyXG5cclxuLmhvdmVyXFxcXDpiZy1iYXNlLTMwMDpob3ZlciB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcblxyXG4uaG92ZXJcXFxcOmJnLXRyYW5zcGFyZW50OmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XHJcblxyXG4uaG92ZXJcXFxcOnRleHQtYmFzZS1jb250ZW50OmhvdmVyIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5cclxuLmhvdmVyXFxcXDp0ZXh0LWJsdWUtODAwOmhvdmVyIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMzAgNjQgMTc1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcblxyXG4uaG92ZXJcXFxcOnRleHQtd2hpdGU6aG92ZXIge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG5cclxuLmhvdmVyXFxcXDp1bmRlcmxpbmU6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lO1xufVxyXG5cclxuLmhvdmVyXFxcXDpuby11bmRlcmxpbmU6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb24tbGluZTogbm9uZTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6c2hhZG93LWxnOmhvdmVyIHtcbiAgLS10dy1zaGFkb3c6IDAgMTBweCAxNXB4IC0zcHggcmdiKDAgMCAwIC8gMC4xKSwgMCA0cHggNnB4IC00cHggcmdiKDAgMCAwIC8gMC4xKTtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAxMHB4IDE1cHggLTNweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDRweCA2cHggLTRweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xufVxyXG5cclxuLmZvY3VzXFxcXDpiZy1iYXNlLTMwMDpmb2N1cyB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcblxyXG4uZm9jdXNcXFxcOm91dGxpbmUtbm9uZTpmb2N1cyB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuXHJcbi5kaXNhYmxlZFxcXFw6dGV4dC1cXFxcW1xcXFwjNWM1YzVjXFxcXF06ZGlzYWJsZWQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYig5MiA5MiA5MiAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG5cclxuLmdyb3VwOmhvdmVyIC5ncm91cC1ob3ZlclxcXFw6Ym9yZGVyLWJhc2UtY29udGVudCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG5cclxuLnBlZXI6Y2hlY2tlZCB+IC5wZWVyLWNoZWNrZWRcXFxcOmJnLWJsdWUtNjAwIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMzcgOTkgMjM1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG5cclxuLnBlZXI6Y2hlY2tlZCB+IC5wZWVyLWNoZWNrZWRcXFxcOmFmdGVyXFxcXDp0cmFuc2xhdGUteC1mdWxsOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICAtLXR3LXRyYW5zbGF0ZS14OiAxMDAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbn1cclxuXHJcbi5wZWVyOmNoZWNrZWQgfiAucGVlci1jaGVja2VkXFxcXDphZnRlclxcXFw6Ym9yZGVyLXdoaXRlOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcblxyXG4ucGVlcjpmb2N1cyB+IC5wZWVyLWZvY3VzXFxcXDpvdXRsaW5lLW5vbmUge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcblxyXG4ucGVlcjpmb2N1cyB+IC5wZWVyLWZvY3VzXFxcXDpyaW5nLTEge1xuICAtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpIHZhcigtLXR3LXJpbmctb2Zmc2V0LWNvbG9yKTtcbiAgLS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygxcHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKTtcbn1cclxuXHJcbi5wZWVyOmZvY3VzIH4gLnBlZXItZm9jdXNcXFxcOnJpbmctYmxhY2sge1xuICAtLXR3LXJpbmctb3BhY2l0eTogMTtcbiAgLS10dy1yaW5nLWNvbG9yOiByZ2IoMCAwIDAgLyB2YXIoLS10dy1yaW5nLW9wYWNpdHkpKTtcbn1cclxuXHJcbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuXG4gIC5tZFxcXFw6Y29sLXNwYW4tMTIge1xuICAgIGdyaWQtY29sdW1uOiBzcGFuIDEyIC8gc3BhbiAxMjtcbiAgfVxuXG4gIC5tZFxcXFw6Y29sLXNwYW4tNiB7XG4gICAgZ3JpZC1jb2x1bW46IHNwYW4gNiAvIHNwYW4gNjtcbiAgfVxuXG4gIC5tZFxcXFw6bS0wIHtcbiAgICBtYXJnaW46IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bS0xMCB7XG4gICAgbWFyZ2luOiAyLjVyZW07XG4gIH1cblxuICAubWRcXFxcOm0tMiB7XG4gICAgbWFyZ2luOiAwLjVyZW07XG4gIH1cblxuICAubWRcXFxcOm0tXFxcXFsyMHB4XFxcXF0ge1xuICAgIG1hcmdpbjogMjBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bXgtMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDBweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWItMCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDptYi0zIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDptbC0wIHtcbiAgICBtYXJnaW4tbGVmdDogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDptbC00IHtcbiAgICBtYXJnaW4tbGVmdDogMXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6bXItMCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubWRcXFxcOm10LTIge1xuICAgIG1hcmdpbi10b3A6IDAuNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6YmxvY2sge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgLm1kXFxcXDppbmxpbmUtYmxvY2sge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgfVxuXG4gIC5tZFxcXFw6ZmxleCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuXG4gIC5tZFxcXFw6aC1cXFxcWzIwMHB4XFxcXF0ge1xuICAgIGhlaWdodDogMjAwcHg7XG4gIH1cblxuICAubWRcXFxcOmgtXFxcXFs0MDBweFxcXFxdIHtcbiAgICBoZWlnaHQ6IDQwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpoLVxcXFxbNDBweFxcXFxdIHtcbiAgICBoZWlnaHQ6IDQwcHg7XG4gIH1cblxuICAubWRcXFxcOmgtXFxcXFs2NnB4XFxcXF0ge1xuICAgIGhlaWdodDogNjZweDtcbiAgfVxuXG4gIC5tZFxcXFw6aC1cXFxcWzk1XFxcXCVcXFxcXSB7XG4gICAgaGVpZ2h0OiA5NSU7XG4gIH1cblxuICAubWRcXFxcOm1heC1oLVxcXFxbNDAwcHhcXFxcXSB7XG4gICAgbWF4LWhlaWdodDogNDAwcHg7XG4gIH1cblxuICAubWRcXFxcOm1pbi1oLWZ1bGwge1xuICAgIG1pbi1oZWlnaHQ6IDEwMCU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFsxMDBcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzE1XFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDE1JTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzE1MHB4XFxcXF0ge1xuICAgIHdpZHRoOiAxNTBweDtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzIwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiAyMDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzIzXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDIzJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzI1MHB4XFxcXF0ge1xuICAgIHdpZHRoOiAyNTBweDtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzMwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiAzMDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzM1MHB4XFxcXF0ge1xuICAgIHdpZHRoOiAzNTBweDtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzQwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDQwJTtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzQwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA0MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6dy1cXFxcWzVcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNSU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs1MFxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA1MCU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs1MDBweFxcXFxdIHtcbiAgICB3aWR0aDogNTAwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs1NVxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA1NSU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs1N1xcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA1NyU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs2MFxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA2MCU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs3MFxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA3MCU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs5MlxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA5MiU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs5NVxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA5NSU7XG4gIH1cblxuICAubWRcXFxcOnctYXV0byB7XG4gICAgd2lkdGg6IGF1dG87XG4gIH1cblxuICAubWRcXFxcOm1pbi13LVxcXFxbNDQwcHhcXFxcXSB7XG4gICAgbWluLXdpZHRoOiA0NDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWluLXctXFxcXFs1MDBweFxcXFxdIHtcbiAgICBtaW4td2lkdGg6IDUwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDptaW4tdy1mdWxsIHtcbiAgICBtaW4td2lkdGg6IDEwMCU7XG4gIH1cblxuICAubWRcXFxcOm1heC13LVxcXFxbNDAwcHhcXFxcXSB7XG4gICAgbWF4LXdpZHRoOiA0MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWF4LXctXFxcXFs0NTBweFxcXFxdIHtcbiAgICBtYXgtd2lkdGg6IDQ1MHB4O1xuICB9XG5cbiAgLm1kXFxcXDptYXgtdy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIG1heC13aWR0aDogNTAwcHg7XG4gIH1cblxuICAubWRcXFxcOmdyaWQtY29scy0yIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoMCwgMWZyKSk7XG4gIH1cblxuICAubWRcXFxcOmZsZXgtcm93IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICB9XG5cbiAgLm1kXFxcXDppdGVtcy1jZW50ZXIge1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cblxuICAubWRcXFxcOmp1c3RpZnktc3RhcnQge1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgfVxuXG4gIC5tZFxcXFw6anVzdGlmeS1iZXR3ZWVuIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIH1cblxuICAubWRcXFxcOmdhcC0xIHtcbiAgICBnYXA6IDAuMjVyZW07XG4gIH1cblxuICAubWRcXFxcOmdhcC02IHtcbiAgICBnYXA6IDEuNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6Z2FwLVxcXFxbMTJweFxcXFxdIHtcbiAgICBnYXA6IDEycHg7XG4gIH1cblxuICAubWRcXFxcOmdhcC1cXFxcWzhweFxcXFxdIHtcbiAgICBnYXA6IDhweDtcbiAgfVxuXG4gIC5tZFxcXFw6Z2FwLXktMCB7XG4gICAgcm93LWdhcDogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpwLTEwIHtcbiAgICBwYWRkaW5nOiAyLjVyZW07XG4gIH1cblxuICAubWRcXFxcOnAtNCB7XG4gICAgcGFkZGluZzogMXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cC01IHtcbiAgICBwYWRkaW5nOiAxLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpweS0wIHtcbiAgICBwYWRkaW5nLXRvcDogMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAwcHg7XG4gIH1cblxuICAubWRcXFxcOnB5LTUge1xuICAgIHBhZGRpbmctdG9wOiAxLjI1cmVtO1xuICAgIHBhZGRpbmctYm90dG9tOiAxLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpwYi0wIHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpwYi00IHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cGwtOCB7XG4gICAgcGFkZGluZy1sZWZ0OiAycmVtO1xuICB9XG5cbiAgLm1kXFxcXDpwci0wIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubWRcXFxcOnB0LTMge1xuICAgIHBhZGRpbmctdG9wOiAwLjc1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LWVuZCB7XG4gICAgdGV4dC1hbGlnbjogZW5kO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LTJ4bCB7XG4gICAgZm9udC1zaXplOiAxLjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDJyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQtM3hsIHtcbiAgICBmb250LXNpemU6IDEuODc1cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAyLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LVxcXFxbMTNweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDEzcHg7XG4gIH1cblxuICAubWRcXFxcOnRleHQtXFxcXFsxNXB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgfVxuXG4gIC5tZFxcXFw6dGV4dC1cXFxcWzIzcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAyM3B4O1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDMwcHg7XG4gIH1cblxuICAubWRcXFxcOnRleHQtYmFzZSB7XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQtbGcge1xuICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQtc20ge1xuICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQteGwge1xuICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgfVxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuXG4gIC5sZ1xcXFw6cmVsYXRpdmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxuXG4gIC5sZ1xcXFw6b3JkZXItbm9uZSB7XG4gICAgb3JkZXI6IDA7XG4gIH1cblxuICAubGdcXFxcOmNvbC1zcGFuLTEyIHtcbiAgICBncmlkLWNvbHVtbjogc3BhbiAxMiAvIHNwYW4gMTI7XG4gIH1cblxuICAubGdcXFxcOmNvbC1zcGFuLTYge1xuICAgIGdyaWQtY29sdW1uOiBzcGFuIDYgLyBzcGFuIDY7XG4gIH1cblxuICAubGdcXFxcOm14LTAge1xuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubGdcXFxcOm1sLTQge1xuICAgIG1hcmdpbi1sZWZ0OiAxcmVtO1xuICB9XG5cbiAgLmxnXFxcXDpibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICAubGdcXFxcOmhpZGRlbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzQwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDQwJTtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzQwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA0MDBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA1MDBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6cC0xMCB7XG4gICAgcGFkZGluZzogMi41cmVtO1xuICB9XG5cbiAgLmxnXFxcXDpwLTE2IHtcbiAgICBwYWRkaW5nOiA0cmVtO1xuICB9XG5cbiAgLmxnXFxcXDpwLTQge1xuICAgIHBhZGRpbmc6IDFyZW07XG4gIH1cblxuICAubGdcXFxcOnRleHQtXFxcXFsxMjBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDEyMHB4O1xuICB9XG5cbiAgLmxnXFxcXDp0ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDMwcHg7XG4gIH1cblxuICAubGdcXFxcOnRleHQtXFxcXFs1MHB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogNTBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6dGV4dC1sZyB7XG4gICAgZm9udC1zaXplOiAxLjEyNXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgfVxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDEyODBweCkge1xuXG4gIC54bFxcXFw6dy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA1MDBweDtcbiAgfVxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDE1MzZweCkge1xuXG4gIC5cXFxcMzJ4bFxcXFw6bS01IHtcbiAgICBtYXJnaW46IDEuMjVyZW07XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOm10LVxcXFxbNjNweFxcXFxdIHtcbiAgICBtYXJnaW4tdG9wOiA2M3B4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDptYXgtdy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIG1heC13aWR0aDogNTAwcHg7XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOnAtMyB7XG4gICAgcGFkZGluZzogMC43NXJlbTtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6cHgtXFxcXFsxNXB4XFxcXF0ge1xuICAgIHBhZGRpbmctbGVmdDogMTVweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDpweS1cXFxcWzEwcHhcXFxcXSB7XG4gICAgcGFkZGluZy10b3A6IDEwcHg7XG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOnRleHQtXFxcXFsyMHB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6dGV4dC1cXFxcWzI1cHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAyNXB4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDp0ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDMwcHg7XG4gIH1cbn1cclxuXHJcbi5wZWVyOmNoZWNrZWQgfiAucnRsXFxcXDpwZWVyLWNoZWNrZWRcXFxcOmFmdGVyXFxcXDotdHJhbnNsYXRlLXgtZnVsbDp3aGVyZShbZGlyPVwicnRsXCJdLCBbZGlyPVwicnRsXCJdICopOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICAtLXR3LXRyYW5zbGF0ZS14OiAtMTAwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcblxyXG5AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7XG5cbiAgLmRhcmtcXFxcOmJvcmRlci1ibGFjayB7XG4gICAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgICBib3JkZXItY29sb3I6IHJnYigwIDAgMCAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG4gIH1cblxuICAuZGFya1xcXFw6YmctZ3JheS03MDAge1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNTUgNjUgODEgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG4gIH1cbn1cclxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvaW5kZXguY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBOztDQUFjLENBQWQ7OztDQUFjOztBQUFkOzs7RUFBQSxzQkFBYyxF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ZDtFQUFBLFVBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGdCQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkOztFQUFBLFVBQWMsRUFBZCxNQUFjO0VBQWQsY0FBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7RUFBQSxlQUFjO0FBQUE7O0FBQWQ7O0NBQWM7QUFBZDtFQUFBLGVBQWM7QUFBQTs7QUFBZDs7OztDQUFjOztBQUFkOzs7Ozs7OztFQUFBLGNBQWMsRUFBZCxNQUFjO0VBQWQsc0JBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7O0VBQUEsZUFBYztFQUFkLFlBQWM7QUFBQTs7QUFBZCx3RUFBYztBQUFkO0VBQUEsYUFBYztBQUFBOztBQUFkOztFQUFBLHVEQUFjO0VBQWQ7QUFBYzs7QUFBZDs7RUFBQTtJQUFBLG1CQUFjO0lBQWQscUJBQWM7SUFBZCxzQkFBYztJQUFkLHFCQUFjO0lBQWQsc0JBQWM7SUFBZCxxQkFBYztJQUFkLHNCQUFjO0lBQWQscUJBQWM7SUFBZCxzQkFBYztJQUFkLHNCQUFjO0lBQWQsc0JBQWM7SUFBZCxzQkFBYztJQUFkLHNCQUFjO0lBQWQsc0JBQWM7SUFBZCx1QkFBYztJQUFkLHNCQUFjO0lBQWQsdUJBQWM7SUFBZCxzQkFBYztJQUFkLHVCQUFjO0lBQWQsc0JBQWM7SUFBZDtFQUFjOztFQUFkOztJQUFBO01BQUEsa0JBQWM7TUFBZCxxQkFBYztNQUFkLHNCQUFjO01BQWQscUJBQWM7TUFBZCxzQkFBYztNQUFkLHFCQUFjO01BQWQsc0JBQWM7TUFBZCxxQkFBYztNQUFkLHNCQUFjO01BQWQsc0JBQWM7TUFBZCxzQkFBYztNQUFkLHNCQUFjO01BQWQsc0JBQWM7TUFBZCxzQkFBYztNQUFkLHVCQUFjO01BQWQsc0JBQWM7TUFBZCx1QkFBYztNQUFkLHNCQUFjO01BQWQsdUJBQWM7TUFBZCxzQkFBYztNQUFkO0lBQWM7RUFBQTtBQUFBOztBQUFkO0VBQUE7QUFBYzs7QUFBZDtFQUFBO0FBQWM7O0FBQWQ7RUFBQTtBQUFj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b0I7RUFBcEIsaURBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsc0JBQW9CO0VBQXBCLHdFQUFvQjtFQUFwQixrQkFBb0I7RUFBcEIsd0VBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBLG9CQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjs7RUFBQTtJQUFBO0VBQW9CO0FBQUE7QUFBcEI7O0VBQUEsaUNBQW9CO0VBQXBCO0FBQW9CO0FBQXBCOztFQUFBO0lBQUEsc0RBQW9CO0lBQXBCO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9CO0FBQUE7QUFBcEI7O0VBQUE7SUFBQTs7OztTQUFvQjtJQUFwQjs7Ozs7RUFBb0I7O0VBQXBCO0lBQUEscUZBQW9CO0lBQXBCO0VBQW9COztFQUFwQjtJQUFBLHFGQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7SUFBQSxxRkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCO0lBQUEsdUZBQW9CO0lBQXBCO0VBQW9COztFQUFwQjtJQUFBLHVGQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7SUFBQSx1RkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCO0lBQUEsdUZBQW9CO0lBQXBCO0VBQW9CO0FBQUE7QUFBcEI7RUFBQSxvQkFBb0I7RUFBcEIsa0JBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsb0JBQW9CO0VBQXBCLGlFQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjs7RUFBQTtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9CO0FBQUE7QUFBcEI7RUFBQSxvQkFBb0I7RUFBcEIsaUVBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsb0JBQW9CO0VBQXBCLGlFQUFvQjtFQUFwQjtBQUFv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QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxlQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSx5QkFBbUI7VUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsNEJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxzQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLGVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtB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QTRFQTs7QUE1RUE7RUFBQSwwQkE0RUE7RUE1RUE7QUE0RUE7O0FBNUVBO0VBQUEsMEJBNEVBO0VBNUVBO0FBNEVBOztBQTVFQTtFQUFBLDBCQTRFQTtFQTVFQTtBQTRFQTs7QUE1RUE7RUFBQSwwQkE0RUE7RUE1RUE7QUE0RUE7O0FBNUVBO0VBQUEsMEJBNEVBO0VBNUVBO0FBNEVBOztBQTVFQTtFQUFBLDBCQTRFQTtFQTVFQTtBQTRFQTs7QUE1RUE7RUFBQSwwQkE0RUE7RUE1RUEsc0JBNEVBO0VBNUVBO0FBNEVBOztBQTVFQTtFQUFBLDBCQTRFQTtFQTVFQSxrQkE0RUE7RUE1RUE7QUE0RUE7O0FBNUVBO0VBQUEsMEJBNEVBO0VBNUVBLHdCQTRFQTtFQTVFQSx3REE0RUE7RUE1RUE7QUE0RUE7O0FBNUVBO0VBQUEsZ0JBNEVBO0VBNUVBO0FBNEVBOztBQTVFQTtFQUFBO0FBNEVBOztBQTVFQTtFQUFBLGtCQTRFQTtFQTVFQTtBQTRFQTs7QUE1RUE7RUFBQTtBQTRFQTs7QUE1RUE7RUFBQTtBQTRFQTs7QUE1RUE7RUFBQSxzQkE0RUE7RUE1RUE7QUE0RUE7O0FBNUVBO0VBQUEsc0JBNEVBO0VBNUVBO0FBNEVBOztBQTVFQTtFQUFBO0FBNEVBOztBQTVFQTtFQUFBLGtCQTRFQTtFQTVFQTtBQTRFQTs7QUE1RUE7RUFBQTtBQTRFQTs7QUE1RUE7RUFBQSxvQkE0RUE7RUE1RUE7QUE0RUE7O0FBNUVBO0VBQUEsb0JBNEVBO0VBNUVBO0FBNEVBOztBQTVFQTtFQUFBLG9CQTRFQTtFQTVFQTtBQTRFQTs7QUE1RUE7RUFBQTtBQTRFQTs7QUE1RUE7RUFBQTtBQTRFQTs7QUE1RUE7RUFBQSwrRUE0RUE7RUE1RUEsbUdBNEVBO0VBNUVBO0FBNEVBOztBQTVFQTtFQUFBLGtCQTRFQTtFQTVFQTtBQTRFQTs7QUE1RUE7RUFBQSw4QkE0RUE7RUE1RUE7QUE0RUE7O0FBNUVBO0VBQUEsb0JBNEVBO0VBNUVBO0FBNEVBOztBQTVFQTtFQUFBLHNCQTRFQTtFQTVFQTtBQTRFQTs7QUE1RUE7RUFBQSxrQkE0RUE7RUE1RUE7QUE0RUE7O0FBNUVBO0VBQUEsMEJBNEVBO0VBNUVBLHNCQTRFQTtFQTVFQTtBQTRFQTs7QUE1RUE7RUFBQSwwQkE0RUE7RUE1RUEsc0JBNEVBO0VBNUVBO0FBNEVBOztBQTVFQTtFQUFBLDhCQTRFQTtFQTVFQTtBQTRFQTs7QUE1RUE7RUFBQSwyR0E0RUE7RUE1RUEseUdBNEVBO0VBNUVBO0FBNEVBOztBQTVFQTtFQUFBLG9CQTRFQTtFQTVFQTtBQTRFQTs7QUE1RUE7O0VBQUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQSxnQkE0RUE7SUE1RUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUEsZ0JBNEVBO0lBNUVBO0VBNEVBOztFQTVFQTtJQUFBLG9CQTRFQTtJQTVFQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQSxpQkE0RUE7SUE1RUE7RUE0RUE7O0VBNUVBO0lBQUEsbUJBNEVBO0lBNUVBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBLGVBNEVBO0lBNUVBO0VBNEVBOztFQTVFQTtJQUFBLG1CQTRFQTtJQTVFQTtFQTRFQTs7RUE1RUE7SUFBQSxtQkE0RUE7SUE1RUE7RUE0RUE7O0VBNUVBO0lBQUEsa0JBNEVBO0lBNUVBO0VBNEVBO0FBQUE7O0FBNUVBOztFQUFBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUEsZ0JBNEVBO0lBNUVBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBO0VBNEVBOztFQTVFQTtJQUFBLG1CQTRFQTtJQTVFQTtFQTRFQTtBQUFBOztBQTVFQTs7RUFBQTtJQUFBO0VBNEVBO0FBQUE7O0FBNUVBOztFQUFBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUE7RUE0RUE7O0VBNUVBO0lBQUEsa0JBNEVBO0lBNUVBO0VBNEVBOztFQTVFQTtJQUFBLGlCQTRFQTtJQTVFQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTs7RUE1RUE7SUFBQTtFQTRFQTtBQUFBOztBQTVFQTtFQUFBLDBCQTRFQTtFQTVFQSx1QkE0RUE7RUE1RUE7QUE0RUE7O0FBNUVBOztFQUFBO0lBQUEsc0JBNEVBO0lBNUVBO0VBNEVBOztFQTVFQTtJQUFBLGtCQTRFQTtJQTVFQTtFQTRFQTtBQUFBXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIkB0YWlsd2luZCBiYXNlO1xcclxcbkB0YWlsd2luZCBjb21wb25lbnRzO1xcclxcbkB0YWlsd2luZCB1dGlsaXRpZXM7XFxyXFxuXFxyXFxuYm9keSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogQ3VzdG9tIENTUyB0byBoaWRlIHNjcm9sbGJhciAqL1xcclxcbi5oaWRlLXNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIge1xcclxcbiAgZGlzcGxheTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLmhpZGUtc2Nyb2xsYmFyIHtcXHJcXG4gIC1tcy1vdmVyZmxvdy1zdHlsZTogbm9uZTsgLyogSUUgYW5kIEVkZ2UgKi9cXHJcXG4gIHNjcm9sbGJhci13aWR0aDogbm9uZTsgLyogRmlyZWZveCAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBiZWxvdyBjc3MgY2xhc3MgcmVwbGFjZSBib290c3RyYXAgYmFja2dyb3VuZCBjb2xvciB3aXRoIGRhaXN5ICovXFxyXFxuLm9wLWJnLXByaW1hcnkge1xcclxcbiAgQGFwcGx5IGJnLXByaW1hcnk7XFxyXFxufVxcclxcbi5vcC1iZy1zZWNvbmRhcnkge1xcclxcbiAgQGFwcGx5IGJnLXNlY29uZGFyeTtcXHJcXG59XFxyXFxuLm9wLWJnLWluZm8ge1xcclxcbiAgQGFwcGx5IGJnLWluZm87XFxyXFxufVxcclxcbi5vcC1iZy1zdWNjZXNzIHtcXHJcXG4gIEBhcHBseSBiZy1zdWNjZXNzO1xcclxcbn1cXHJcXG4ub3AtYmctd2FybmluZyB7XFxyXFxuICBAYXBwbHkgYmctd2FybmluZztcXHJcXG59XFxyXFxuXFxyXFxuLyogYmVsb3cgY3NzIGNsYXNzIHJlcGxhY2UgYm9vdHN0cmFwIHRleHQgY29sb3Igd2l0aCBkYWlzeSAqL1xcclxcbi5vcC10ZXh0LXByaW1hcnkge1xcclxcbiAgQGFwcGx5IHRleHQtcHJpbWFyeTtcXHJcXG59XFxyXFxuLm9wLXRleHQtc2Vjb25kYXJ5IHtcXHJcXG4gIEBhcHBseSB0ZXh0LXNlY29uZGFyeTtcXHJcXG59XFxyXFxuLm9wLXRleHQtaW5mbyB7XFxyXFxuICBAYXBwbHkgdGV4dC1pbmZvO1xcclxcbn1cXHJcXG4ub3AtdGV4dC1hY2NlbnQge1xcclxcbiAgQGFwcGx5IHRleHQtYWNjZW50O1xcclxcbn1cXHJcXG4ub3AtdGV4dC1zdWNjZXNzIHtcXHJcXG4gIEBhcHBseSB0ZXh0LXN1Y2Nlc3M7XFxyXFxufVxcclxcbi5vcC10ZXh0LXdhcm5pbmcge1xcclxcbiAgQGFwcGx5IHRleHQtd2FybmluZztcXHJcXG59XFxyXFxuLm9wLWJvcmRlci1wcmltYXJ5IHtcXHJcXG4gIEBhcHBseSBib3JkZXItcHJpbWFyeTtcXHJcXG59XFxyXFxuLyogQ1NTIGZvciBzY3JvbGxiYXIgY3VzdG9taXphdGlvbiAqL1xcclxcbioge1xcclxcbiAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOyAvKiBGb3IgRmlyZWZveCAqL1xcclxcbiAgc2Nyb2xsYmFyLWNvbG9yOiBncmF5OyAvKiBGb3IgRmlyZWZveCAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBGb3Igd2Via2l0LWJhc2VkIGJyb3dzZXJzIGxpa2UgQ2hyb21lLCBTYWZhcmkgKi9cXHJcXG4qOjotd2Via2l0LXNjcm9sbGJhciB7XFxyXFxuICB3aWR0aDogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4qOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXHJcXG59XFxyXFxuXFxyXFxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxyXFxufVxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzBfX18gZnJvbSBcIi0hLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvYmxhY2stYWxwaGEuY3NzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8xX19fIGZyb20gXCItIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL21hdXZlLmNzc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMl9fXyBmcm9tIFwiLSEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy92aW9sZXQuY3NzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMF9fXyk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMV9fXyk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMl9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5Db250ZXh0TWVudUNvbnRlbnQsXHJcbi5Db250ZXh0TWVudVN1YkNvbnRlbnQge1xyXG4gIG1pbi13aWR0aDogMTM1cHg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgcGFkZGluZzogNXB4O1xyXG4gIGJveC1zaGFkb3c6XHJcbiAgICAwcHggMTBweCAzOHB4IC0xMHB4IHJnYmEoMjIsIDIzLCAyNCwgMC4zNSksXHJcbiAgICAwcHggMTBweCAyMHB4IC0xNXB4IHJnYmEoMjIsIDIzLCAyNCwgMC4yKTtcclxuICB6LWluZGV4OiA5OTtcclxufVxyXG5cclxuLkNvbnRleHRNZW51SXRlbSxcclxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtLFxyXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW0sXHJcbi5Db250ZXh0TWVudVN1YlRyaWdnZXIge1xyXG4gIGZvbnQtc2l6ZTogMTNweDtcclxuICBsaW5lLWhlaWdodDogMTtcclxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcclxuICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGhlaWdodDogMjVweDtcclxuICBwYWRkaW5nOiAwIDVweDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgcGFkZGluZy1sZWZ0OiAxNXB4O1xyXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyW2RhdGEtc3RhdGU9XCJvcGVuXCJdIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xyXG59XHJcblxyXG4uQ29udGV4dE1lbnVJdGVtW2RhdGEtZGlzYWJsZWRdLFxyXG4uQ29udGV4dE1lbnVDaGVja2JveEl0ZW1bZGF0YS1kaXNhYmxlZF0sXHJcbi5Db250ZXh0TWVudVJhZGlvSXRlbVtkYXRhLWRpc2FibGVkXSxcclxuLkNvbnRleHRNZW51U3ViVHJpZ2dlcltkYXRhLWRpc2FibGVkXSB7XHJcbiAgY29sb3I6IHZhcigtLW1hdXZlLTgpO1xyXG4gIHBvaW50ZXItZXZlbnRzOiBcIm5vbmVcIjtcclxufVxyXG5cclxuLkNvbnRleHRNZW51SXRlbVtkYXRhLWhpZ2hsaWdodGVkXSxcclxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdLFxyXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW1bZGF0YS1oaWdobGlnaHRlZF0sXHJcbi5Db250ZXh0TWVudVN1YlRyaWdnZXJbZGF0YS1oaWdobGlnaHRlZF0ge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNkYWQ5ZGI7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XHJcbn1cclxuXHJcbi5Db250ZXh0TWVudUxhYmVsIHtcclxuICBwYWRkaW5nLWxlZnQ6IDI1cHg7XHJcbiAgZm9udC1zaXplOiAxMnB4O1xyXG4gIGxpbmUtaGVpZ2h0OiAyNXB4O1xyXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS0xMSk7XHJcbn1cclxuXHJcbi5Db250ZXh0TWVudUl0ZW1JbmRpY2F0b3Ige1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBsZWZ0OiAwO1xyXG4gIHdpZHRoOiAyNXB4O1xyXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbn1cclxuXHJcbi5SaWdodFNsb3Qge1xyXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xyXG4gIHBhZGRpbmctbGVmdDogMjBweDtcclxuICBjb2xvcjogdmFyKC0tbWF1dmUtMTEpO1xyXG59XHJcblxyXG5bZGF0YS1oaWdobGlnaHRlZF0gPiAuUmlnaHRTbG90IHtcclxuICBjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbltkYXRhLWRpc2FibGVkXSAuUmlnaHRTbG90IHtcclxuICBjb2xvcjogdmFyKC0tbWF1dmUtOCk7XHJcbn1cclxuXHJcbi5kcm9wZG93bi1tZW51IHtcclxuICBtaW4td2lkdGg6IDEwcmVtO1xyXG59XHJcblxyXG4uZHJvcGRvd24taXRlbSB7XHJcbiAgZGlzcGxheTogYmxvY2s7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgcGFkZGluZzogMC4zcmVtIDEuMnJlbTtcclxuICBjbGVhcjogYm90aDtcclxuICBmb250LXdlaWdodDogNDAwO1xyXG4gIGNvbG9yOiAjMzkzYTM5O1xyXG4gIHRleHQtYWxpZ246IGluaGVyaXQ7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcclxuICBib3JkZXI6IDA7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4uZHJvcGRvd24taXRlbTpob3ZlciB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RhZDlkYjtcclxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcclxufVxyXG5cclxuLm1vZGFsIHtcclxuICBtYXJnaW4tdG9wOiA1MHB4O1xyXG59XHJcbi5wZGZOYW1lIHtcclxuICBmb250LXNpemU6IDEwcHg7XHJcbiAgZm9udC13ZWlnaHQ6IDYwMDtcclxufVxyXG5cclxuXHJcbi5oclN0eWxlIHtcclxuICBtYXJnaW4tdG9wOiAwcmVtICFpbXBvcnRhbnQ7XHJcbiAgbWFyZ2luLWJvdHRvbTogMHJlbSAhaW1wb3J0YW50O1xyXG4gIGJvcmRlcjogMDtcclxuICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpO1xyXG59XHJcblxyXG4uc3RhdHVzLWJhZGdlIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgdG9wOiAwO1xyXG4gIHJpZ2h0OiAwO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XHJcbiAgd2lkdGg6IDI0cHg7XHJcbiAgaGVpZ2h0OiAyNHB4O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcclxufVxyXG5cclxuLnN0YXR1cy1iYWRnZSBpIHtcclxuICBmb250LXNpemU6IDEycHg7XHJcbn1cclxuXHJcbi8qIFN0YXR1cy1zcGVjaWZpYyBjb2xvcnMgKi9cclxuLmNvbXBsZXRlZCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzRjYWY1MDtcclxuICBjb2xvcjogI2ZmZjtcclxufVxyXG5cclxuLmluLXByb2dyZXNzIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZjMTA3O1xyXG4gIGNvbG9yOiAjZmZmO1xyXG59XHJcblxyXG4uZGVjbGluZWQge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcbi5leHBpcmVkIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOWU5ZTllO1xyXG4gIGNvbG9yOiAjZmZmO1xyXG59XHJcblxyXG4uZHJhZnQge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICMwNzljZGM7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcblxyXG4uc29ydCB7XHJcbiAgcGFkZGluZzogOHB4IDE1cHg7XHJcbiAgbWFyZ2luOiA1cHg7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLnNvcnQ6aG92ZXIge1xyXG4gIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDE2OCwgMjA0LCAyMDYsIDAuMSk7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWF1dmUtMyk7XHJcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xyXG59XHJcblxyXG4uZmlsZU5hbWUge1xyXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICB3aWR0aDogMTAwcHg7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbiAgZm9udC1zaXplOiAxMXB4O1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICBmb250LXdlaWdodDogNDgwO1xyXG59XHJcblxyXG5hIHtcclxuICBhbGw6IHVuc2V0O1xyXG59XHJcblxyXG4uSG92ZXJDYXJkQ29udGVudCB7XHJcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xyXG4gIHBhZGRpbmc6IDVweCAxMHB4O1xyXG4gIHdpZHRoOiAxNzBweDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICBib3gtc2hhZG93OlxyXG4gICAgaHNsKDIwNiAyMiUgNyUgLyAzNSUpIDBweCAxMHB4IDM4cHggLTEwcHgsXHJcbiAgICBoc2woMjA2IDIyJSA3JSAvIDIwJSkgMHB4IDEwcHggMjBweCAtMTVweDtcclxuICBhbmltYXRpb24tZHVyYXRpb246IDQwMG1zO1xyXG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xyXG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cInRvcFwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlRG93bkFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cInJpZ2h0XCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVMZWZ0QW5kRmFkZTtcclxufVxyXG5cclxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVwiYm90dG9tXCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVVcEFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cImxlZnRcIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVJpZ2h0QW5kRmFkZTtcclxufVxyXG5cclxuLkhvdmVyQ2FyZEFycm93IHtcclxuICBmaWxsOiB3aGl0ZTtcclxufVxyXG5cclxuQGtleWZyYW1lcyBzbGlkZVVwQW5kRmFkZSB7XHJcbiAgMCUge1xyXG4gICAgb3BhY2l0eTogMDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgycHgpO1xyXG4gIH1cclxuXHJcbiAgMTAwJSB7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xyXG4gIH1cclxufVxyXG5cclxuQGtleWZyYW1lcyBzbGlkZVJpZ2h0QW5kRmFkZSB7XHJcbiAgMCUge1xyXG4gICAgb3BhY2l0eTogMDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMnB4KTtcclxuICB9XHJcblxyXG4gIDEwMCUge1xyXG4gICAgb3BhY2l0eTogMTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcclxuICB9XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgc2xpZGVEb3duQW5kRmFkZSB7XHJcbiAgMCUge1xyXG4gICAgb3BhY2l0eTogMDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcclxuICB9XHJcblxyXG4gIDEwMCUge1xyXG4gICAgb3BhY2l0eTogMTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcclxuICB9XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgc2xpZGVMZWZ0QW5kRmFkZSB7XHJcbiAgMCUge1xyXG4gICAgb3BhY2l0eTogMDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgycHgpO1xyXG4gIH1cclxuXHJcbiAgMTAwJSB7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDMxMHB4KSBhbmQgKG1heC13aWR0aDogNTUwcHgpIHtcclxuICAuc29ydCB7XHJcbiAgICBwYWRkaW5nOiAycHg7XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMDlweCkge1xyXG4gIC5zb3J0IHtcclxuICAgIHBhZGRpbmc6IDJweDtcclxuICB9XHJcbn1cclxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvc3R5bGVzL29wZW5zaWduZHJpdmUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUlBOztFQUVFLGdCQUFnQjtFQUNoQix1QkFBdUI7RUFDdkIsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQixZQUFZO0VBQ1o7OzZDQUUyQztFQUMzQyxXQUFXO0FBQ2I7O0FBRUE7Ozs7RUFJRSxlQUFlO0VBQ2YsY0FBYztFQUNkLHVCQUF1QjtFQUN2QixrQkFBa0I7RUFDbEIsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQixZQUFZO0VBQ1osY0FBYztFQUNkLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIseUJBQWlCO1VBQWpCLGlCQUFpQjtFQUNqQixhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsdUJBQXVCO0FBQ3pCOztBQUVBOzs7O0VBSUUscUJBQXFCO0VBQ3JCLHNCQUFzQjtBQUN4Qjs7QUFFQTs7OztFQUlFLHlCQUF5QjtFQUN6Qix1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsZUFBZTtFQUNmLGlCQUFpQjtFQUNqQixzQkFBc0I7QUFDeEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsT0FBTztFQUNQLFdBQVc7RUFDWCxvQkFBb0I7RUFDcEIsbUJBQW1CO0VBQ25CLHVCQUF1QjtBQUN6Qjs7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixrQkFBa0I7RUFDbEIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsWUFBWTtBQUNkOztBQUVBO0VBQ0UscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsY0FBYztFQUNkLFdBQVc7RUFDWCxzQkFBc0I7RUFDdEIsV0FBVztFQUNYLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQiw2QkFBNkI7RUFDN0IsU0FBUztFQUNULGVBQWU7QUFDakI7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCO0FBQ0E7RUFDRSxlQUFlO0VBQ2YsZ0JBQWdCO0FBQ2xCOzs7QUFHQTtFQUNFLDJCQUEyQjtFQUMzQiw4QkFBOEI7RUFDOUIsU0FBUztFQUNULHdDQUF3QztBQUMxQzs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixNQUFNO0VBQ04sUUFBUTtFQUNSLHNCQUFzQjtFQUN0QixXQUFXO0VBQ1gsWUFBWTtFQUNaLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsbUJBQW1CO0VBQ25CLGtCQUFrQjtFQUNsQix3Q0FBd0M7QUFDMUM7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBLDJCQUEyQjtBQUMzQjtFQUNFLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsV0FBVztBQUNiOztBQUVBO0VBQ0UseUJBQXlCO0VBQ3pCLFdBQVc7QUFDYjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsV0FBVztBQUNiOzs7QUFHQTtFQUNFLGlCQUFpQjtFQUNqQixXQUFXO0VBQ1gsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQix1QkFBdUI7RUFDdkIsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLDhDQUE4QztFQUM5QyxnQ0FBZ0M7RUFDaEMsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLFlBQVk7RUFDWixtQkFBbUI7RUFDbkIsMkJBQTJCO0VBQzNCLHVCQUF1QjtFQUN2QixlQUFlO0VBQ2Ysa0JBQWtCO0VBQ2xCLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLFVBQVU7QUFDWjs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixpQkFBaUI7RUFDakIsWUFBWTtFQUNaLHVCQUF1QjtFQUN2Qjs7NkNBRTJDO0VBQzNDLHlCQUF5QjtFQUN6Qix3REFBd0Q7RUFDeEQsK0JBQStCO0VBQy9CLGtCQUFrQjtFQUNsQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxnQ0FBZ0M7QUFDbEM7O0FBRUE7RUFDRSxnQ0FBZ0M7QUFDbEM7O0FBRUE7RUFDRSw4QkFBOEI7QUFDaEM7O0FBRUE7RUFDRSxpQ0FBaUM7QUFDbkM7O0FBRUE7RUFDRSxXQUFXO0FBQ2I7O0FBRUE7RUFDRTtJQUNFLFVBQVU7SUFDViwwQkFBMEI7RUFDNUI7O0VBRUE7SUFDRSxVQUFVO0lBQ1Ysd0JBQXdCO0VBQzFCO0FBQ0Y7O0FBRUE7RUFDRTtJQUNFLFVBQVU7SUFDViwyQkFBMkI7RUFDN0I7O0VBRUE7SUFDRSxVQUFVO0lBQ1Ysd0JBQXdCO0VBQzFCO0FBQ0Y7O0FBRUE7RUFDRTtJQUNFLFVBQVU7SUFDViwyQkFBMkI7RUFDN0I7O0VBRUE7SUFDRSxVQUFVO0lBQ1Ysd0JBQXdCO0VBQzFCO0FBQ0Y7O0FBRUE7RUFDRTtJQUNFLFVBQVU7SUFDViwwQkFBMEI7RUFDNUI7O0VBRUE7SUFDRSxVQUFVO0lBQ1Ysd0JBQXdCO0VBQzFCO0FBQ0Y7O0FBRUE7RUFDRTtJQUNFLFlBQVk7RUFDZDtBQUNGOztBQUVBO0VBQ0U7SUFDRSxZQUFZO0VBQ2Q7QUFDRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJAaW1wb3J0IFxcXCJAcmFkaXgtdWkvY29sb3JzL2JsYWNrLWFscGhhLmNzc1xcXCI7XFxyXFxuQGltcG9ydCBcXFwiQHJhZGl4LXVpL2NvbG9ycy9tYXV2ZS5jc3NcXFwiO1xcclxcbkBpbXBvcnQgXFxcIkByYWRpeC11aS9jb2xvcnMvdmlvbGV0LmNzc1xcXCI7XFxyXFxuXFxyXFxuLkNvbnRleHRNZW51Q29udGVudCxcXHJcXG4uQ29udGV4dE1lbnVTdWJDb250ZW50IHtcXHJcXG4gIG1pbi13aWR0aDogMTM1cHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBwYWRkaW5nOiA1cHg7XFxyXFxuICBib3gtc2hhZG93OlxcclxcbiAgICAwcHggMTBweCAzOHB4IC0xMHB4IHJnYmEoMjIsIDIzLCAyNCwgMC4zNSksXFxyXFxuICAgIDBweCAxMHB4IDIwcHggLTE1cHggcmdiYSgyMiwgMjMsIDI0LCAwLjIpO1xcclxcbiAgei1pbmRleDogOTk7XFxyXFxufVxcclxcblxcclxcbi5Db250ZXh0TWVudUl0ZW0sXFxyXFxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtLFxcclxcbi5Db250ZXh0TWVudVJhZGlvSXRlbSxcXHJcXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTNweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGhlaWdodDogMjVweDtcXHJcXG4gIHBhZGRpbmc6IDAgNXB4O1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxNXB4O1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyW2RhdGEtc3RhdGU9XFxcIm9wZW5cXFwiXSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxufVxcclxcblxcclxcbi5Db250ZXh0TWVudUl0ZW1bZGF0YS1kaXNhYmxlZF0sXFxyXFxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtW2RhdGEtZGlzYWJsZWRdLFxcclxcbi5Db250ZXh0TWVudVJhZGlvSXRlbVtkYXRhLWRpc2FibGVkXSxcXHJcXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyW2RhdGEtZGlzYWJsZWRdIHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS04KTtcXHJcXG4gIHBvaW50ZXItZXZlbnRzOiBcXFwibm9uZVxcXCI7XFxyXFxufVxcclxcblxcclxcbi5Db250ZXh0TWVudUl0ZW1bZGF0YS1oaWdobGlnaHRlZF0sXFxyXFxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdLFxcclxcbi5Db250ZXh0TWVudVJhZGlvSXRlbVtkYXRhLWhpZ2hsaWdodGVkXSxcXHJcXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyW2RhdGEtaGlnaGxpZ2h0ZWRdIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkYWQ5ZGI7XFxyXFxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcXHJcXG59XFxyXFxuXFxyXFxuLkNvbnRleHRNZW51TGFiZWwge1xcclxcbiAgcGFkZGluZy1sZWZ0OiAyNXB4O1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI1cHg7XFxyXFxuICBjb2xvcjogdmFyKC0tbWF1dmUtMTEpO1xcclxcbn1cXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVJdGVtSW5kaWNhdG9yIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB3aWR0aDogMjVweDtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uUmlnaHRTbG90IHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xcclxcbiAgY29sb3I6IHZhcigtLW1hdXZlLTExKTtcXHJcXG59XFxyXFxuXFxyXFxuW2RhdGEtaGlnaGxpZ2h0ZWRdID4gLlJpZ2h0U2xvdCB7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbltkYXRhLWRpc2FibGVkXSAuUmlnaHRTbG90IHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS04KTtcXHJcXG59XFxyXFxuXFxyXFxuLmRyb3Bkb3duLW1lbnUge1xcclxcbiAgbWluLXdpZHRoOiAxMHJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLmRyb3Bkb3duLWl0ZW0ge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHBhZGRpbmc6IDAuM3JlbSAxLjJyZW07XFxyXFxuICBjbGVhcjogYm90aDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxyXFxuICBjb2xvcjogIzM5M2EzOTtcXHJcXG4gIHRleHQtYWxpZ246IGluaGVyaXQ7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5kcm9wZG93bi1pdGVtOmhvdmVyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkYWQ5ZGI7XFxyXFxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcXHJcXG59XFxyXFxuXFxyXFxuLm1vZGFsIHtcXHJcXG4gIG1hcmdpbi10b3A6IDUwcHg7XFxyXFxufVxcclxcbi5wZGZOYW1lIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTBweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XFxyXFxufVxcclxcblxcclxcblxcclxcbi5oclN0eWxlIHtcXHJcXG4gIG1hcmdpbi10b3A6IDByZW0gIWltcG9ydGFudDtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDByZW0gIWltcG9ydGFudDtcXHJcXG4gIGJvcmRlcjogMDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxufVxcclxcblxcclxcbi5zdGF0dXMtYmFkZ2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcclxcbiAgd2lkdGg6IDI0cHg7XFxyXFxuICBoZWlnaHQ6IDI0cHg7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xcclxcbiAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcXHJcXG59XFxyXFxuXFxyXFxuLnN0YXR1cy1iYWRnZSBpIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogU3RhdHVzLXNwZWNpZmljIGNvbG9ycyAqL1xcclxcbi5jb21wbGV0ZWQge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzRjYWY1MDtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG4uaW4tcHJvZ3Jlc3Mge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYzEwNztcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG4uZGVjbGluZWQge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG4uZXhwaXJlZCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjOWU5ZTllO1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcblxcclxcbi5kcmFmdCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDc5Y2RjO1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcblxcclxcblxcclxcbi5zb3J0IHtcXHJcXG4gIHBhZGRpbmc6IDhweCAxNXB4O1xcclxcbiAgbWFyZ2luOiA1cHg7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uc29ydDpob3ZlciB7XFxyXFxuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgxNjgsIDIwNCwgMjA2LCAwLjEpO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWF1dmUtMyk7XFxyXFxuICBib3JkZXItcmFkaXVzOiAycHg7XFxyXFxufVxcclxcblxcclxcbi5maWxlTmFtZSB7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICB3aWR0aDogMTAwcHg7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxuICBmb250LXNpemU6IDExcHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBmb250LXdlaWdodDogNDgwO1xcclxcbn1cXHJcXG5cXHJcXG5hIHtcXHJcXG4gIGFsbDogdW5zZXQ7XFxyXFxufVxcclxcblxcclxcbi5Ib3ZlckNhcmRDb250ZW50IHtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcXHJcXG4gIHBhZGRpbmc6IDVweCAxMHB4O1xcclxcbiAgd2lkdGg6IDE3MHB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBib3gtc2hhZG93OlxcclxcbiAgICBoc2woMjA2IDIyJSA3JSAvIDM1JSkgMHB4IDEwcHggMzhweCAtMTBweCxcXHJcXG4gICAgaHNsKDIwNiAyMiUgNyUgLyAyMCUpIDBweCAxMHB4IDIwcHggLTE1cHg7XFxyXFxuICBhbmltYXRpb24tZHVyYXRpb246IDQwMG1zO1xcclxcbiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSk7XFxyXFxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVxcXCJ0b3BcXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVEb3duQW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVxcXCJyaWdodFxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZUxlZnRBbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XFxcImJvdHRvbVxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVVwQW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVxcXCJsZWZ0XFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlUmlnaHRBbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uSG92ZXJDYXJkQXJyb3cge1xcclxcbiAgZmlsbDogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbkBrZXlmcmFtZXMgc2xpZGVVcEFuZEZhZGUge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbkBrZXlmcmFtZXMgc2xpZGVSaWdodEFuZEZhZGUge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTJweCk7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAxMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlRG93bkFuZEZhZGUge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAxMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlTGVmdEFuZEZhZGUge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMnB4KTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSAobWluLXdpZHRoOiAzMTBweCkgYW5kIChtYXgtd2lkdGg6IDU1MHB4KSB7XFxyXFxuICAuc29ydCB7XFxyXFxuICAgIHBhZGRpbmc6IDJweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzA5cHgpIHtcXHJcXG4gIC5zb3J0IHtcXHJcXG4gICAgcGFkZGluZzogMnB4O1xcclxcbiAgfVxcclxcbn1cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1GYXN0aGFuZCZkaXNwbGF5PXN3YXApO1wiXSk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1EYW5jaW5nK1NjcmlwdCZkaXNwbGF5PXN3YXApO1wiXSk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1EZWxpY2lvdXMrSGFuZHJhd24mZGlzcGxheT1zd2FwKTtcIl0pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIkBpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9Q2VkYXJ2aWxsZStDdXJzaXZlJmRpc3BsYXk9c3dhcCk7XCJdKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lciB7XHJcbiAgcG9zaXRpb246IGluaXRpYWwgIWltcG9ydGFudDtcclxufVxyXG5cclxuLndpZGdldHMge1xyXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgLyogRGlzYWJsZSB0ZXh0IHNlbGVjdGlvbiBpbiBXZWJLaXQgYnJvd3NlcnMgKi9cclxuICB1c2VyLXNlbGVjdDogbm9uZTtcclxufVxyXG5cclxuLnJhZGlvQnV0dG9uIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIGxlZnQ6IDBweDtcclxuICB0b3A6IDBweDtcclxuICBmb250LXNpemU6IDEycHg7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgIzAwN2JmZjtcclxuICBib3JkZXItcmFkaXVzOiA1MHB4O1xyXG59XHJcblxyXG4uc2lnbmF0dXJlQ2FudmFzIHtcclxuICBib3JkZXI6IDJweCBzb2xpZCAjODg4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcclxuICB3aWR0aDogNDYwcHg7XHJcbiAgaGVpZ2h0OiAxODRweDtcclxufVxyXG5cclxuLmludGlhbFNpZ25hdHVyZUNhbnZhcyB7XHJcbiAgYm9yZGVyOiAycHggc29saWQgIzg4ODtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XHJcbiAgd2lkdGg6IDE1MHB4O1xyXG4gIGhlaWdodDogMTUwcHg7XHJcbn1cclxuXHJcbi5pbnRpYWxTaWduYXR1cmUge1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4ODg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xyXG4gIHdpZHRoOiAxODNweDtcclxuICBoZWlnaHQ6IDE4M3B4O1xyXG59XHJcblxyXG4ucGVuQ29udGFpbmVyRGVmYXVsdCB7XHJcbiAgd2lkdGg6IDQ2MHB4O1xyXG59XHJcblxyXG4uaWNvbiB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIGZvbnQtc2l6ZTogMTRweDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgei1pbmRleDogMjtcclxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxufVxyXG5cclxuLlNjcm9sbGJhcnNDdXN0b20tVHJhY2tZIHtcclxuICB3aWR0aDogNHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuLlNjcm9sbGJhcnNDdXN0b20tVHJhY2tYIHtcclxuICBoZWlnaHQ6IDRweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uc2lnbllvdXJzZWxmQmxvY2sge1xyXG4gIHBhZGRpbmc6IDBweDtcclxuICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXIgIWltcG9ydGFudDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5zZW5kTWFpbCB7XHJcbiAgYm94LXNoYWRvdzpcclxuICAgIDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSksXHJcbiAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE4KTtcclxuICBwYWRkaW5nOiAzcHggMzBweDtcclxuICBjb2xvcjogd2hpdGU7XHJcbiAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xyXG4gIGZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50O1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBtYXJnaW4tbGVmdDogMTBweDtcclxufVxyXG5cclxuLnVzZXIge1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG59XHJcbi5kaXNhYmxlZCB7XHJcbiAgb3BhY2l0eTogMC41O1xyXG4gIC8qIEV4YW1wbGU6IHJlZHVjZSBvcGFjaXR5IHRvIHZpc3VhbGx5IGluZGljYXRlIGRpc2FibGVkIHN0YXRlICovXHJcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XHJcbiAgLyogUHJldmVudHMgbW91c2UgY2xpY2tzIGFuZCBvdGhlciBldmVudHMgKi9cclxuICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiAjODg4OyAqL1xyXG59XHJcblxyXG4uc2lnblRhYiB7XHJcbiAgY3Vyc29yOiBwb2ludGVyICFpbXBvcnRhbnQ7XHJcbiAgZm9udC13ZWlnaHQ6IDQwMCAhaW1wb3J0YW50O1xyXG4gIG1hcmdpbjogN3B4ICFpbXBvcnRhbnQ7XHJcbiAgZm9udC1zaXplOiAxNXB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5zaWduZXJDb21wb25lbnQge1xyXG4gIC8qIGJveC1zaGFkb3c6IHJnYmEoMTcsIDEyLCA0NiwgMC4xNSkgMHB4IDQ4cHggMTAwcHggMHB4OyAqL1xyXG4gIC8qIHdpZHRoOiAxODBweDsgKi9cclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLnVwbG9hZEltZ0xvZ28ge1xyXG4gIGZvbnQtc2l6ZTogNTBweDtcclxufVxyXG5cclxuLkRyb3Bkb3duTWVudUNvbnRlbnQsXHJcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50IHtcclxuICBtaW4td2lkdGg6IDEzMHB4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XHJcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE1KTtcclxuICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xyXG4gIHBhZGRpbmc6IDVweDtcclxuICBhbmltYXRpb24tZHVyYXRpb246IDQwMG1zO1xyXG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xyXG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7XHJcbiAgei1pbmRleDogMzAgIWltcG9ydGFudDtcclxufVxyXG5cclxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVwidG9wXCJdLFxyXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XCJ0b3BcIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZURvd25BbmRGYWRlO1xyXG59XHJcblxyXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XCJyaWdodFwiXSxcclxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVwicmlnaHRcIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZUxlZnRBbmRGYWRlO1xyXG59XHJcblxyXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XCJib3R0b21cIl0sXHJcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cImJvdHRvbVwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlVXBBbmRGYWRlO1xyXG59XHJcblxyXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XCJsZWZ0XCJdLFxyXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XCJsZWZ0XCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVSaWdodEFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ecm9wZG93bk1lbnVJdGVtIHtcclxuICBmb250LXNpemU6IDEzcHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE7XHJcbiAgY29sb3I6IGJsYWNrO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGhlaWdodDogMjVweDtcclxuICBwYWRkaW5nOiAwIDVweDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xyXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG4gIGJvcmRlcjogbm9uZTtcclxufVxyXG5cclxuLlNlbGVjdFRyaWdnZXIge1xyXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gIHBhZGRpbmc6IDAgNzBweDtcclxuICBmb250LXNpemU6IDEzcHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE7XHJcbiAgaGVpZ2h0OiAzNXB4O1xyXG4gIGdhcDogNXB4O1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjODg3YWJmO1xyXG4gIHdpZHRoOiAxMDBweDtcclxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcclxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxufVxyXG5cclxuLnNlbGVjdEVtYWlsIHtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBwYWRkaW5nOiAwIDE1cHg7XHJcbiAgZm9udC1zaXplOiAxM3B4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxO1xyXG4gIGhlaWdodDogMzVweDtcclxuICBnYXA6IDVweDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzg4N2FiZjtcclxuICB3aWR0aDogMjAwcHg7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbn1cclxuXHJcbm9wdGlvbiB7XHJcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xyXG59XHJcblxyXG4uU2VsZWN0VHJpZ2dlcjpob3ZlciB7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbn1cclxuXHJcbi5zZWxlY3RFbWFpbDpob3ZlciB7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbn1cclxuXHJcbi5TZWxlY3RUcmlnZ2VyOmZvY3VzIHtcclxuICAvKiBib3gtc2hhZG93OiAwIDAgMCAycHggYmxhY2s7ICovXHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbn1cclxuXHJcbi5zZWxlY3RFbWFpbDpmb2N1cyB7XHJcbiAgLyogYm94LXNoYWRvdzogMCAwIDAgMnB4IGJsYWNrOyAqL1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4uU2VsZWN0VHJpZ2dlcltkYXRhLXBsYWNlaG9sZGVyXSB7XHJcbiAgY29sb3I6IGJsYWNrO1xyXG59XHJcblxyXG4uU2VsZWN0SWNvbiB7XHJcbiAgY29sb3I6IFZhcigtLXZpb2xldC0xMSk7XHJcbn1cclxuXHJcbi5TZWxlY3RDb250ZW50IHtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcclxuICBib3gtc2hhZG93OlxyXG4gICAgMHB4IDEwcHggMzhweCAtMTBweCByZ2JhKDIyLCAyMywgMjQsIDAuMzUpLFxyXG4gICAgMHB4IDEwcHggMjBweCAtMTVweCByZ2JhKDIyLCAyMywgMjQsIDAuMik7XHJcbn1cclxuXHJcbi5TZWxlY3RWaWV3cG9ydCB7XHJcbiAgcGFkZGluZzogNXB4O1xyXG59XHJcblxyXG4uU2VsZWN0SXRlbSB7XHJcbiAgZm9udC1zaXplOiAxM3B4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxO1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgaGVpZ2h0OiAyNXB4O1xyXG4gIHBhZGRpbmc6IDAgMzVweCAwIDI1cHg7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcclxuICB6LWluZGV4OiAxMCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uU2VsZWN0SXRlbVtkYXRhLWRpc2FibGVkXSB7XHJcbiAgY29sb3I6IHZhcigtLW1hdXZlLTgpO1xyXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xyXG59XHJcblxyXG4uU2VsZWN0SXRlbVtkYXRhLWhpZ2hsaWdodGVkXSB7XHJcbiAgb3V0bGluZTogbm9uZTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS12aW9sZXQtOSk7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xKTtcclxufVxyXG5cclxuLlNlbGVjdExhYmVsIHtcclxuICBwYWRkaW5nOiAwIDI1cHg7XHJcbiAgZm9udC1zaXplOiAxMnB4O1xyXG4gIGxpbmUtaGVpZ2h0OiAyNXB4O1xyXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS0xMSk7XHJcbn1cclxuXHJcbi5TZWxlY3RTZXBhcmF0b3Ige1xyXG4gIGhlaWdodDogMXB4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXZpb2xldC02KTtcclxuICBtYXJnaW46IDVweDtcclxufVxyXG5cclxuLlNlbGVjdEl0ZW1JbmRpY2F0b3Ige1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBsZWZ0OiAwO1xyXG4gIHdpZHRoOiAyNXB4O1xyXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbn1cclxuXHJcbi5TZWxlY3RTY3JvbGxCdXR0b24ge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBoZWlnaHQ6IDI1cHg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XHJcbiAgY3Vyc29yOiBkZWZhdWx0O1xyXG59XHJcblxyXG4uZHJvcERvd25TdHlsZSB7XHJcbiAgd2lkdGg6IGF1dG87XHJcbn1cclxuXHJcbi5hdXRvU2lnblNjcm9sbCB7XHJcbiAgb3ZlcmZsb3cteTogYXV0bztcclxufVxyXG5cclxuLmF1dG9TaWduU2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLnZhbGlkYXRlSW5wdXRUZXh0IHtcclxuICB3aWR0aDogNzYlO1xyXG59XHJcblxyXG4ucmFkaW9Hcm91cElucHV0IHtcclxuICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLnJhZGlvR3JvdXAge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XHJcbn1cclxuXHJcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2NnB4KSB7XHJcbiAgLnZhbGlkYXRlSW5wdXRUZXh0IHtcclxuICAgIHdpZHRoOiA5MyU7XHJcbiAgfVxyXG5cclxuICAuZHJvcGRvd24tbWVudSB7XHJcbiAgICBtaW4td2lkdGg6IDByZW0gIWltcG9ydGFudDtcclxuICB9XHJcblxyXG4gICNuYXZiYXIge1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHotaW5kZXg6IDQ5O1xyXG4gIH1cclxuXHJcbiAgLyogTmF2YmFyIGxpbmtzICovXHJcbiAgI25hdmJhciBhIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBjb2xvcjogI2YyZjJmMjtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIHBhZGRpbmc6IDE0cHg7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgfVxyXG5cclxuICAjbmF2YmFyIGEuYWN0aXZlIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0Y2FmNTA7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgfVxyXG5cclxuICAvKiBQYWdlIGNvbnRlbnQgKi9cclxuICAuY29udGVudCB7XHJcbiAgICBwYWRkaW5nOiAxNnB4O1xyXG4gIH1cclxuXHJcbiAgLyogVGhlIHN0aWNreSBjbGFzcyBpcyBhZGRlZCB0byB0aGUgbmF2YmFyXHJcbiAgd2l0aCBKUyB3aGVuIGl0IHJlYWNoZXMgaXRzIHNjcm9sbCBwb3NpdGlvbiAqL1xyXG4gIC5zdGlja3lIZWFkIHtcclxuICAgIHRvcDogNTBweDtcclxuICAgIGxlZnQ6IDAuOXJlbTtcclxuICB9XHJcblxyXG4gIC5zdGlja3lTaWduZXJIZWFkIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICB9XHJcblxyXG4gIC8qIEFkZCBzb21lIHRvcCBwYWRkaW5nIHRvIHRoZSBwYWdlIGNvbnRlbnRcclxuICB0byBwcmV2ZW50IHN1ZGRlbiBxdWljayBtb3ZlbWVudCAoYXMgdGhlXHJcbiAgbmF2aWdhdGlvbiBiYXIgZ2V0cyBhIG5ldyBwb3NpdGlvbiBhdCB0aGUgdG9wIG9mIHRoZVxyXG4gIHBhZ2UgKHBvc2l0aW9uOmZpeGVkIGFuZCB0b3A6MCkgKi9cclxuICAuc3RpY2t5SGVhZCArIC5jb250ZW50IHtcclxuICAgIHBhZGRpbmctdG9wOiA2MHB4O1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDg3cHgpIGFuZCAobWluLXdpZHRoOiAzNTFweCkge1xyXG4gIC5zaWduYXR1cmVDYW52YXMge1xyXG4gICAgd2lkdGg6IDMwMHB4O1xyXG4gICAgaGVpZ2h0OiAxMjBweDtcclxuICB9XHJcblxyXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcclxuICAgIHdpZHRoOiAzMDBweDtcclxuICB9XHJcblxyXG4gIC51cGxvYWRJbWdMb2dvIHtcclxuICAgIGZvbnQtc2l6ZTogMzBweDtcclxuICB9XHJcblxyXG4gIC5zaWduVGFiIHtcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcclxuICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xyXG4gIH1cclxufVxyXG5cclxuLnNjcm9sbC1oaWRlOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzNTBweCkgYW5kIChtaW4td2lkdGg6IDMxMXB4KSB7XHJcbiAgLnNpZ25hdHVyZUNhbnZhcyB7XHJcbiAgICB3aWR0aDogMjgwcHg7XHJcbiAgICBoZWlnaHQ6IDExMnB4O1xyXG4gIH1cclxuXHJcbiAgLnBlbkNvbnRhaW5lckRlZmF1bHQge1xyXG4gICAgd2lkdGg6IDI4MHB4O1xyXG4gIH1cclxuXHJcbiAgLnNpZ25UYWIge1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xyXG5cclxuICAgIGZvbnQtc2l6ZTogMTBweCAhaW1wb3J0YW50O1xyXG4gIH1cclxuXHJcbiAgLnVwbG9hZEltZ0xvZ28ge1xyXG4gICAgZm9udC1zaXplOiAyNXB4O1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzEwcHgpIHtcclxuICAuc2lnbmF0dXJlQ2FudmFzIHtcclxuICAgIHdpZHRoOiAyMzBweDtcclxuICAgIGhlaWdodDogOTJweDtcclxuICB9XHJcblxyXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcclxuICAgIHdpZHRoOiAyMzBweDtcclxuICB9XHJcblxyXG4gIC5zaWduVGFiIHtcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcclxuICAgIGZvbnQtc2l6ZTogOHB4ICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG5cclxuICAudXBsb2FkSW1nTG9nbyB7XHJcbiAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgfVxyXG59XHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL3N0eWxlcy9zaWduYXR1cmUuY3NzXCJdLFwi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RUE7SUFDRSxnQkFBZ0I7SUFDaEIsV0FBVztFQUNiOztFQUVBLGlCQUFpQjtFQUNqQjtJQUNFLFdBQVc7SUFDWCxjQUFjO0lBQ2QsY0FBYztJQUNkLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IscUJBQXFCO0VBQ3ZCOztFQUVBO0lBQ0UseUJBQXlCO0lBQ3pCLFlBQVk7RUFDZDs7RUFFQSxpQkFBaUI7RUFDakI7SUFDRSxhQUFhO0VBQ2Y7O0VBRUE7K0NBQzZDO0VBQzdDO0lBQ0UsU0FBUztJQUNULFlBQVk7RUFDZDs7RUFFQTtJQUNFLGVBQWU7RUFDakI7O0VBRUE7OzttQ0FHaUM7RUFDakM7SUFDRSxpQkFBaUI7RUFDbkI7QUFDRjs7QUFFQTtFQUNFO0lBQ0UsWUFBWTtJQUNaLGFBQWE7RUFDZjs7RUFFQTtJQUNFLFlBQVk7RUFDZDs7RUFFQTtJQUNFLGVBQWU7RUFDakI7O0VBRUE7SUFDRSwyQkFBMkI7SUFDM0IsMEJBQTBCO0VBQzVCO0FBQ0Y7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7QUFDQTtFQUNFO0lBQ0UsWUFBWTtJQUNaLGFBQWE7RUFDZjs7RUFFQTtJQUNFLFlBQVk7RUFDZDs7RUFFQTtJQUNFLDJCQUEyQjs7SUFFM0IsMEJBQTBCO0VBQzVCOztFQUVBO0lBQ0UsZUFBZTtFQUNqQjtBQUNGOztBQUVBO0VBQ0U7SUFDRSxZQUFZO0lBQ1osWUFBWTtFQUNkOztFQUVBO0lBQ0UsWUFBWTtFQUNkOztFQUVBO0lBQ0UsMkJBQTJCO0lBQzNCLHlCQUF5QjtFQUMzQjs7RUFFQTtJQUNFLGVBQWU7RUFDakI7QUFDRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJAaW1wb3J0IHVybChcXFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1GYXN0aGFuZCZkaXNwbGF5PXN3YXBcXFwiKTtcXHJcXG5AaW1wb3J0IHVybChcXFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1EYW5jaW5nK1NjcmlwdCZkaXNwbGF5PXN3YXBcXFwiKTtcXHJcXG5AaW1wb3J0IHVybChcXFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1EZWxpY2lvdXMrSGFuZHJhd24mZGlzcGxheT1zd2FwXFxcIik7XFxyXFxuQGltcG9ydCB1cmwoXFxcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9Q2VkYXJ2aWxsZStDdXJzaXZlJmRpc3BsYXk9c3dhcFxcXCIpO1xcclxcblxcclxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXIge1xcclxcbiAgcG9zaXRpb246IGluaXRpYWwgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLndpZGdldHMge1xcclxcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIC8qIERpc2FibGUgdGV4dCBzZWxlY3Rpb24gaW4gV2ViS2l0IGJyb3dzZXJzICovXFxyXFxuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5yYWRpb0J1dHRvbiB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGhlaWdodDogMTAwJTtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGxlZnQ6IDBweDtcXHJcXG4gIHRvcDogMHB4O1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzAwN2JmZjtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwcHg7XFxyXFxufVxcclxcblxcclxcbi5zaWduYXR1cmVDYW52YXMge1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgIzg4ODtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXHJcXG4gIHdpZHRoOiA0NjBweDtcXHJcXG4gIGhlaWdodDogMTg0cHg7XFxyXFxufVxcclxcblxcclxcbi5pbnRpYWxTaWduYXR1cmVDYW52YXMge1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgIzg4ODtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXHJcXG4gIHdpZHRoOiAxNTBweDtcXHJcXG4gIGhlaWdodDogMTUwcHg7XFxyXFxufVxcclxcblxcclxcbi5pbnRpYWxTaWduYXR1cmUge1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgIzg4ODtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXHJcXG4gIHdpZHRoOiAxODNweDtcXHJcXG4gIGhlaWdodDogMTgzcHg7XFxyXFxufVxcclxcblxcclxcbi5wZW5Db250YWluZXJEZWZhdWx0IHtcXHJcXG4gIHdpZHRoOiA0NjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgZm9udC1zaXplOiAxNHB4O1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4uU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1kge1xcclxcbiAgd2lkdGg6IDRweCAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG4uU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1gge1xcclxcbiAgaGVpZ2h0OiA0cHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLnNpZ25Zb3Vyc2VsZkJsb2NrIHtcXHJcXG4gIHBhZGRpbmc6IDBweDtcXHJcXG4gIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyICFpbXBvcnRhbnQ7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5zZW5kTWFpbCB7XFxyXFxuICBib3gtc2hhZG93OlxcclxcbiAgICAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpLFxcclxcbiAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE4KTtcXHJcXG4gIHBhZGRpbmc6IDNweCAzMHB4O1xcclxcbiAgY29sb3I6IHdoaXRlO1xcclxcbiAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xcclxcbiAgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBtYXJnaW4tbGVmdDogMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLnVzZXIge1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbn1cXHJcXG4uZGlzYWJsZWQge1xcclxcbiAgb3BhY2l0eTogMC41O1xcclxcbiAgLyogRXhhbXBsZTogcmVkdWNlIG9wYWNpdHkgdG8gdmlzdWFsbHkgaW5kaWNhdGUgZGlzYWJsZWQgc3RhdGUgKi9cXHJcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcclxcbiAgLyogUHJldmVudHMgbW91c2UgY2xpY2tzIGFuZCBvdGhlciBldmVudHMgKi9cXHJcXG4gIC8qIGJhY2tncm91bmQtY29sb3I6ICM4ODg7ICovXFxyXFxufVxcclxcblxcclxcbi5zaWduVGFiIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50O1xcclxcbiAgZm9udC13ZWlnaHQ6IDQwMCAhaW1wb3J0YW50O1xcclxcbiAgbWFyZ2luOiA3cHggIWltcG9ydGFudDtcXHJcXG4gIGZvbnQtc2l6ZTogMTVweCAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uc2lnbmVyQ29tcG9uZW50IHtcXHJcXG4gIC8qIGJveC1zaGFkb3c6IHJnYmEoMTcsIDEyLCA0NiwgMC4xNSkgMHB4IDQ4cHggMTAwcHggMHB4OyAqL1xcclxcbiAgLyogd2lkdGg6IDE4MHB4OyAqL1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi51cGxvYWRJbWdMb2dvIHtcXHJcXG4gIGZvbnQtc2l6ZTogNTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLkRyb3Bkb3duTWVudUNvbnRlbnQsXFxyXFxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnQge1xcclxcbiAgbWluLXdpZHRoOiAxMzBweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcXHJcXG4gIHBhZGRpbmc6IDVweDtcXHJcXG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogNDAwbXM7XFxyXFxuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcXHJcXG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7XFxyXFxuICB6LWluZGV4OiAzMCAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XFxcInRvcFxcXCJdLFxcclxcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cXFwidG9wXFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlRG93bkFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cXFwicmlnaHRcXFwiXSxcXHJcXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XFxcInJpZ2h0XFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlTGVmdEFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cXFwiYm90dG9tXFxcIl0sXFxyXFxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVxcXCJib3R0b21cXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVVcEFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cXFwibGVmdFxcXCJdLFxcclxcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cXFwibGVmdFxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVJpZ2h0QW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkRyb3Bkb3duTWVudUl0ZW0ge1xcclxcbiAgZm9udC1zaXplOiAxM3B4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDE7XFxyXFxuICBjb2xvcjogYmxhY2s7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBoZWlnaHQ6IDI1cHg7XFxyXFxuICBwYWRkaW5nOiAwIDVweDtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmctbGVmdDogMjBweDtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFRyaWdnZXIge1xcclxcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBwYWRkaW5nOiAwIDcwcHg7XFxyXFxuICBmb250LXNpemU6IDEzcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMTtcXHJcXG4gIGhlaWdodDogMzVweDtcXHJcXG4gIGdhcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzg4N2FiZjtcXHJcXG4gIHdpZHRoOiAxMDBweDtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG59XFxyXFxuXFxyXFxuLnNlbGVjdEVtYWlsIHtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gIHBhZGRpbmc6IDAgMTVweDtcXHJcXG4gIGZvbnQtc2l6ZTogMTNweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcclxcbiAgaGVpZ2h0OiAzNXB4O1xcclxcbiAgZ2FwOiA1cHg7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjODg3YWJmO1xcclxcbiAgd2lkdGg6IDIwMHB4O1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbn1cXHJcXG5cXHJcXG5vcHRpb24ge1xcclxcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0VHJpZ2dlcjpob3ZlciB7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uc2VsZWN0RW1haWw6aG92ZXIge1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFRyaWdnZXI6Zm9jdXMge1xcclxcbiAgLyogYm94LXNoYWRvdzogMCAwIDAgMnB4IGJsYWNrOyAqL1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLnNlbGVjdEVtYWlsOmZvY3VzIHtcXHJcXG4gIC8qIGJveC1zaGFkb3c6IDAgMCAwIDJweCBibGFjazsgKi9cXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RUcmlnZ2VyW2RhdGEtcGxhY2Vob2xkZXJdIHtcXHJcXG4gIGNvbG9yOiBibGFjaztcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdEljb24ge1xcclxcbiAgY29sb3I6IFZhcigtLXZpb2xldC0xMSk7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RDb250ZW50IHtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcXHJcXG4gIGJveC1zaGFkb3c6XFxyXFxuICAgIDBweCAxMHB4IDM4cHggLTEwcHggcmdiYSgyMiwgMjMsIDI0LCAwLjM1KSxcXHJcXG4gICAgMHB4IDEwcHggMjBweCAtMTVweCByZ2JhKDIyLCAyMywgMjQsIDAuMik7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RWaWV3cG9ydCB7XFxyXFxuICBwYWRkaW5nOiA1cHg7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RJdGVtIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTNweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGhlaWdodDogMjVweDtcXHJcXG4gIHBhZGRpbmc6IDAgMzVweCAwIDI1cHg7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RJdGVtW2RhdGEtZGlzYWJsZWRdIHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS04KTtcXHJcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0SXRlbVtkYXRhLWhpZ2hsaWdodGVkXSB7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdmlvbGV0LTkpO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xKTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdExhYmVsIHtcXHJcXG4gIHBhZGRpbmc6IDAgMjVweDtcXHJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyNXB4O1xcclxcbiAgY29sb3I6IHZhcigtLW1hdXZlLTExKTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFNlcGFyYXRvciB7XFxyXFxuICBoZWlnaHQ6IDFweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXZpb2xldC02KTtcXHJcXG4gIG1hcmdpbjogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0SXRlbUluZGljYXRvciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgd2lkdGg6IDI1cHg7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFNjcm9sbEJ1dHRvbiB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgaGVpZ2h0OiAyNXB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcXHJcXG4gIGN1cnNvcjogZGVmYXVsdDtcXHJcXG59XFxyXFxuXFxyXFxuLmRyb3BEb3duU3R5bGUge1xcclxcbiAgd2lkdGg6IGF1dG87XFxyXFxufVxcclxcblxcclxcbi5hdXRvU2lnblNjcm9sbCB7XFxyXFxuICBvdmVyZmxvdy15OiBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG4uYXV0b1NpZ25TY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcXHJcXG4gIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi52YWxpZGF0ZUlucHV0VGV4dCB7XFxyXFxuICB3aWR0aDogNzYlO1xcclxcbn1cXHJcXG5cXHJcXG4ucmFkaW9Hcm91cElucHV0IHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4ucmFkaW9Hcm91cCB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcXHJcXG59XFxyXFxuXFxyXFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY2cHgpIHtcXHJcXG4gIC52YWxpZGF0ZUlucHV0VGV4dCB7XFxyXFxuICAgIHdpZHRoOiA5MyU7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAuZHJvcGRvd24tbWVudSB7XFxyXFxuICAgIG1pbi13aWR0aDogMHJlbSAhaW1wb3J0YW50O1xcclxcbiAgfVxcclxcblxcclxcbiAgI25hdmJhciB7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICAgIHotaW5kZXg6IDQ5O1xcclxcbiAgfVxcclxcblxcclxcbiAgLyogTmF2YmFyIGxpbmtzICovXFxyXFxuICAjbmF2YmFyIGEge1xcclxcbiAgICBmbG9hdDogbGVmdDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIGNvbG9yOiAjZjJmMmYyO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIHBhZGRpbmc6IDE0cHg7XFxyXFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gICNuYXZiYXIgYS5hY3RpdmUge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGNhZjUwO1xcclxcbiAgICBjb2xvcjogd2hpdGU7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAvKiBQYWdlIGNvbnRlbnQgKi9cXHJcXG4gIC5jb250ZW50IHtcXHJcXG4gICAgcGFkZGluZzogMTZweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC8qIFRoZSBzdGlja3kgY2xhc3MgaXMgYWRkZWQgdG8gdGhlIG5hdmJhclxcclxcbiAgd2l0aCBKUyB3aGVuIGl0IHJlYWNoZXMgaXRzIHNjcm9sbCBwb3NpdGlvbiAqL1xcclxcbiAgLnN0aWNreUhlYWQge1xcclxcbiAgICB0b3A6IDUwcHg7XFxyXFxuICAgIGxlZnQ6IDAuOXJlbTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5zdGlja3lTaWduZXJIZWFkIHtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgfVxcclxcblxcclxcbiAgLyogQWRkIHNvbWUgdG9wIHBhZGRpbmcgdG8gdGhlIHBhZ2UgY29udGVudFxcclxcbiAgdG8gcHJldmVudCBzdWRkZW4gcXVpY2sgbW92ZW1lbnQgKGFzIHRoZVxcclxcbiAgbmF2aWdhdGlvbiBiYXIgZ2V0cyBhIG5ldyBwb3NpdGlvbiBhdCB0aGUgdG9wIG9mIHRoZVxcclxcbiAgcGFnZSAocG9zaXRpb246Zml4ZWQgYW5kIHRvcDowKSAqL1xcclxcbiAgLnN0aWNreUhlYWQgKyAuY29udGVudCB7XFxyXFxuICAgIHBhZGRpbmctdG9wOiA2MHB4O1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODdweCkgYW5kIChtaW4td2lkdGg6IDM1MXB4KSB7XFxyXFxuICAuc2lnbmF0dXJlQ2FudmFzIHtcXHJcXG4gICAgd2lkdGg6IDMwMHB4O1xcclxcbiAgICBoZWlnaHQ6IDEyMHB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnBlbkNvbnRhaW5lckRlZmF1bHQge1xcclxcbiAgICB3aWR0aDogMzAwcHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAudXBsb2FkSW1nTG9nbyB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMzBweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5zaWduVGFiIHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xcclxcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuLnNjcm9sbC1oaWRlOjotd2Via2l0LXNjcm9sbGJhciB7XFxyXFxuICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzNTBweCkgYW5kIChtaW4td2lkdGg6IDMxMXB4KSB7XFxyXFxuICAuc2lnbmF0dXJlQ2FudmFzIHtcXHJcXG4gICAgd2lkdGg6IDI4MHB4O1xcclxcbiAgICBoZWlnaHQ6IDExMnB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnBlbkNvbnRhaW5lckRlZmF1bHQge1xcclxcbiAgICB3aWR0aDogMjgwcHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAuc2lnblRhYiB7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcXHJcXG5cXHJcXG4gICAgZm9udC1zaXplOiAxMHB4ICFpbXBvcnRhbnQ7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAudXBsb2FkSW1nTG9nbyB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMjVweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzEwcHgpIHtcXHJcXG4gIC5zaWduYXR1cmVDYW52YXMge1xcclxcbiAgICB3aWR0aDogMjMwcHg7XFxyXFxuICAgIGhlaWdodDogOTJweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcXHJcXG4gICAgd2lkdGg6IDIzMHB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnNpZ25UYWIge1xcclxcbiAgICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XFxyXFxuICAgIGZvbnQtc2l6ZTogOHB4ICFpbXBvcnRhbnQ7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAudXBsb2FkSW1nTG9nbyB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMjBweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IFN0cmluZyh1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsKTtcblxuICAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cbiAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gdXJsLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfVxuXG4gIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgLy8gU2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcbiAgaWYgKC9bXCInKCkgXFx0XFxuXXwoJTIwKS8udGVzdCh1cmwpIHx8IG9wdGlvbnMubmVlZFF1b3Rlcykge1xuICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQodXJsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKSwgXCJcXFwiXCIpO1xuICB9XG4gIHJldHVybiB1cmw7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMic7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIFJlYWN0OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2hhcmVkL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UuanNcbiAqXG4gKiBEbyBub3QgcmVxdWlyZSB0aGlzIG1vZHVsZSBkaXJlY3RseSEgVXNlIG5vcm1hbCB0aHJvdyBlcnJvciBjYWxscy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVycm9yIGNvZGVzXG4gKiBkdXJpbmcgYnVpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIFwiTWluaWZpZWQgUmVkdXggZXJyb3IgI1wiICsgY29kZSArIFwiOyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT1cIiArIGNvZGUgKyBcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciBcIiArICd1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiAnO1xufVxuXG4vLyBJbmxpbmVkIHZlcnNpb24gb2YgdGhlIGBzeW1ib2wtb2JzZXJ2YWJsZWAgcG9seWZpbGxcbnZhciAkJG9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0pKCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgcmFuZG9tU3RyaW5nID0gZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG59O1xuXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IFwiQEByZWR1eC9JTklUXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUkVQTEFDRTogXCJAQHJlZHV4L1JFUExBQ0VcIiArIHJhbmRvbVN0cmluZygpLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogZnVuY3Rpb24gUFJPQkVfVU5LTk9XTl9BQ1RJT04oKSB7XG4gICAgcmV0dXJuIFwiQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTlwiICsgcmFuZG9tU3RyaW5nKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBvYmo7XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vLyBJbmxpbmVkIC8gc2hvcnRlbmVkIHZlcnNpb24gb2YgYGtpbmRPZmAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9raW5kLW9mXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG5cbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH0gLy8gb3RoZXJcblxuXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIHZhciB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICpcbiAqICoqV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgY29uZmlndXJlU3RvcmVgIG1ldGhvZFxuICogb2YgdGhlIGBAcmVkdXhqcy90b29sa2l0YCBwYWNrYWdlKiosIHdoaWNoIHJlcGxhY2VzIGBjcmVhdGVTdG9yZWAuXG4gKlxuICogUmVkdXggVG9vbGtpdCBpcyBvdXIgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIHdyaXRpbmcgUmVkdXggbG9naWMgdG9kYXksXG4gKiBpbmNsdWRpbmcgc3RvcmUgc2V0dXAsIHJlZHVjZXJzLCBkYXRhIGZldGNoaW5nLCBhbmQgbW9yZS5cbiAqXG4gKiAqKkZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSByZWFkIHRoaXMgUmVkdXggZG9jcyBwYWdlOioqXG4gKiAqKmh0dHBzOi8vcmVkdXguanMub3JnL2ludHJvZHVjdGlvbi93aHktcnRrLWlzLXJlZHV4LXRvZGF5KipcbiAqXG4gKiBgY29uZmlndXJlU3RvcmVgIGZyb20gUmVkdXggVG9vbGtpdCBpcyBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTdG9yZWAgdGhhdFxuICogc2ltcGxpZmllcyBzZXR1cCBhbmQgaGVscHMgYXZvaWQgY29tbW9uIGJ1Z3MuXG4gKlxuICogWW91IHNob3VsZCBub3QgYmUgdXNpbmcgdGhlIGByZWR1eGAgY29yZSBwYWNrYWdlIGJ5IGl0c2VsZiB0b2RheSwgZXhjZXB0IGZvciBsZWFybmluZyBwdXJwb3Nlcy5cbiAqIFRoZSBgY3JlYXRlU3RvcmVgIG1ldGhvZCBmcm9tIHRoZSBjb3JlIGByZWR1eGAgcGFja2FnZSB3aWxsIG5vdCBiZSByZW1vdmVkLCBidXQgd2UgZW5jb3VyYWdlXG4gKiBhbGwgdXNlcnMgdG8gbWlncmF0ZSB0byB1c2luZyBSZWR1eCBUb29sa2l0IGZvciBhbGwgUmVkdXggY29kZS5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgYGNyZWF0ZVN0b3JlYCB3aXRob3V0IHRoaXMgdmlzdWFsIGRlcHJlY2F0aW9uIHdhcm5pbmcsIHVzZVxuICogdGhlIGBsZWdhY3lfY3JlYXRlU3RvcmVgIGltcG9ydCBpbnN0ZWFkOlxuICpcbiAqIGBpbXBvcnQgeyBsZWdhY3lfY3JlYXRlU3RvcmUgYXMgY3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4J2BcbiAqXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZW5oYW5jZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogJ0l0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvICcgKyAnY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gJyArICd0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoZW5oYW5jZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcIkV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihyZWR1Y2VyKSArIFwiJ1wiKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICB2YXIgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhpcyBtYWtlcyBhIHNoYWxsb3cgY29weSBvZiBjdXJyZW50TGlzdGVuZXJzIHNvIHdlIGNhbiB1c2VcbiAgICogbmV4dExpc3RlbmVycyBhcyBhIHRlbXBvcmFyeSBsaXN0IHdoaWxlIGRpc3BhdGNoaW5nLlxuICAgKlxuICAgKiBUaGlzIHByZXZlbnRzIGFueSBidWdzIGFyb3VuZCBjb25zdW1lcnMgY2FsbGluZ1xuICAgKiBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLlxuICAgKi9cblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiAnWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuICcgKyAnUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG5cblxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobGlzdGVuZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogXCJBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJ1wiICsga2luZE9mKGFjdGlvbikgKyBcIicuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLlwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBcIkV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG5leHRSZWR1Y2VyKSk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjsgLy8gVGhpcyBhY3Rpb24gaGFzIGEgc2ltaWxpYXIgZWZmZWN0IHRvIEFjdGlvblR5cGVzLklOSVQuXG4gICAgLy8gQW55IHJlZHVjZXJzIHRoYXQgZXhpc3RlZCBpbiBib3RoIHRoZSBuZXcgYW5kIG9sZCByb290UmVkdWNlclxuICAgIC8vIHdpbGwgcmVjZWl2ZSB0aGUgcHJldmlvdXMgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gICAgLy8gdGhlIG5ldyBzdGF0ZSB0cmVlIHdpdGggYW55IHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgb2xkIG9uZS5cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihvYnNlcnZlcikgKyBcIidcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgX3JlZlskJG9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX3JlZjtcbiAgfSAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cblxuXG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gIH0pO1xuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqXG4gKiAqKldlIHJlY29tbWVuZCB1c2luZyBgY29uZmlndXJlU3RvcmVgIGZyb20gdGhlXG4gKiBgQHJlZHV4anMvdG9vbGtpdGAgcGFja2FnZSoqLCB3aGljaCByZXBsYWNlcyBgY3JlYXRlU3RvcmVgOlxuICogKipodHRwczovL3JlZHV4LmpzLm9yZy9pbnRyb2R1Y3Rpb24vd2h5LXJ0ay1pcy1yZWR1eC10b2RheSoqXG4gKlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtlbmhhbmNlcl0gVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5cbnZhciBsZWdhY3lfY3JlYXRlU3RvcmUgPSBjcmVhdGVTdG9yZTtcblxuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuXG59XG5cbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuSU5JVCA/ICdwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmUnIDogJ3ByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyJztcblxuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgJyArICd0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuJztcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBcIlRoZSBcIiArIGFyZ3VtZW50TmFtZSArIFwiIGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXFxcIlwiICsga2luZE9mKGlucHV0U3RhdGUpICsgXCJcXFwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIFwiICsgKFwia2V5czogXFxcIlwiICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCJcIik7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5SRVBMQUNFKSByZXR1cm47XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gXCJVbmV4cGVjdGVkIFwiICsgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyAna2V5cycgOiAna2V5JykgKyBcIiBcIiArIChcIlxcXCJcIiArIHVuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiIGZvdW5kIGluIFwiICsgYXJndW1lbnROYW1lICsgXCIuIFwiKSArIFwiRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiArIChcIlxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBcIiArIFwiSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IFwiICsgXCJleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IFwiICsgXCJub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCBcIiArIFwieW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBcIiArIChcIkRvbid0IHRyeSB0byBoYW5kbGUgJ1wiICsgQWN0aW9uVHlwZXMuSU5JVCArIFwiJyBvciBvdGhlciBhY3Rpb25zIGluIFxcXCJyZWR1eC8qXFxcIiBcIikgKyBcIm5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIFwiICsgXCJjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBcIiArIFwiaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIFwiICsgXCJhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5cIik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBmaW5hbFJlZHVjZXJzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoXCJObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpOyAvLyBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHdhcm4gYWJvdXQgdGhlIHNhbWVcbiAgLy8ga2V5cyBtdWx0aXBsZSB0aW1lcy5cblxuICB2YXIgdW5leHBlY3RlZEtleUNhY2hlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2hhcGVBc3NlcnRpb25FcnJvcjtcblxuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuXG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfa2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tfaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNbX2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW19rZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBcIldoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgXCIgKyAoYWN0aW9uVHlwZSA/IFwiXFxcIlwiICsgU3RyaW5nKGFjdGlvblR5cGUpICsgXCJcXFwiXCIgOiAnKHVua25vd24gdHlwZSknKSArIFwiLCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIF9rZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBcIiArIFwiVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBcIiArIFwiSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBuZXh0U3RhdGVbX2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuXG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uIGNyZWF0b3JzLCBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZVxuICogc2FtZSBrZXlzLCBidXQgd2l0aCBldmVyeSBmdW5jdGlvbiB3cmFwcGVkIGludG8gYSBgZGlzcGF0Y2hgIGNhbGwgc28gdGhleVxuICogbWF5IGJlIGludm9rZWQgZGlyZWN0bHkuIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCwgYXMgeW91IGNhbiBjYWxsXG4gKiBgc3RvcmUuZGlzcGF0Y2goTXlBY3Rpb25DcmVhdG9ycy5kb1NvbWV0aGluZygpKWAgeW91cnNlbGYganVzdCBmaW5lLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYW4gYWN0aW9uIGNyZWF0b3IgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIGdldCBhIGRpc3BhdGNoIHdyYXBwZWQgZnVuY3Rpb24gaW4gcmV0dXJuLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBhY3Rpb25DcmVhdG9ycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb25cbiAqIGNyZWF0b3IgZnVuY3Rpb25zLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpbiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhc2BcbiAqIHN5bnRheC4gWW91IG1heSBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcGF0Y2ggVGhlIGBkaXNwYXRjaGAgZnVuY3Rpb24gYXZhaWxhYmxlIG9uIHlvdXIgUmVkdXhcbiAqIHN0b3JlLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFRoZSBvYmplY3QgbWltaWNraW5nIHRoZSBvcmlnaW5hbCBvYmplY3QsIGJ1dCB3aXRoXG4gKiBldmVyeSBhY3Rpb24gY3JlYXRvciB3cmFwcGVkIGludG8gdGhlIGBkaXNwYXRjaGAgY2FsbC4gSWYgeW91IHBhc3NlZCBhXG4gKiBmdW5jdGlvbiBhcyBgYWN0aW9uQ3JlYXRvcnNgLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWxzbyBiZSBhIHNpbmdsZVxuICogZnVuY3Rpb24uXG4gKi9cblxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09ICdvYmplY3QnIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoYWN0aW9uQ3JlYXRvcnMpICsgXCInLiBcIiArIFwiRGlkIHlvdSB3cml0ZSBcXFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiIGluc3RlYWQgb2YgXFxcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiP1wiKTtcbiAgfVxuXG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgdmFyIGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaWRkbGV3YXJlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuXG4gICAgICB2YXIgX2Rpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6ICdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh2b2lkIDAsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdG9yZSksIHt9LCB7XG4gICAgICAgIGRpc3BhdGNoOiBfZGlzcGF0Y2hcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlLCBsZWdhY3lfY3JlYXRlU3RvcmUgfTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cy5vbmNlID0gb25jZTtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHNDb3VudCA9IDA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsICdkZWZhdWx0TWF4TGlzdGVuZXJzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwIHx8IE51bWJlcklzTmFOKGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7XG4gICAgfVxuICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7XG4gIH1cbn0pO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gIGlmICh0aGlzLl9ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgTnVtYmVySXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTtcbiAgfVxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuIF9nZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PT0gdW5kZWZpbmVkKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMClcbiAgICAgIGVyID0gYXJnc1swXTtcbiAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgLy8gTm90ZTogVGhlIGNvbW1lbnRzIG9uIHRoZSBgdGhyb3dgIGxpbmVzIGFyZSBpbnRlbnRpb25hbCwgdGhleSBzaG93XG4gICAgICAvLyB1cCBpbiBOb2RlJ3Mgb3V0cHV0IGlmIHRoaXMgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLlxuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfVxuICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmhhbmRsZWQgZXJyb3IuJyArIChlciA/ICcgKCcgKyBlci5tZXNzYWdlICsgJyknIDogJycpKTtcbiAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgIHRocm93IGVycjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFJlZmxlY3RBcHBseShoYW5kbGVyLCB0aGlzLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpXSwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPVxuICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHtcbiAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIG0gPSBfZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG4gICAgaWYgKG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0gJiYgIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGVycm9yIGNvZGUgZm9yIHRoaXMgc2luY2UgaXQgaXMgYSBXYXJuaW5nXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyBTdHJpbmcodHlwZSkgKyAnIGxpc3RlbmVycyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY3JlYXNlIGxpbWl0Jyk7XG4gICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgIHcudHlwZSA9IHR5cGU7XG4gICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgUHJvY2Vzc0VtaXRXYXJuaW5nKHcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfTtcblxuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGxpc3QgPSBldmVudHNbdHlwZV07XG4gICAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cywgaTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuZnVuY3Rpb24gX2xpc3RlbmVycyh0YXJnZXQsIHR5cGUsIHVud3JhcCkge1xuICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKGV2bGlzdGVuZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB1bndyYXAgPyBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXSA6IFtldmxpc3RlbmVyXTtcblxuICByZXR1cm4gdW53cmFwID9cbiAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCB0cnVlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0T3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKDsgaW5kZXggKyAxIDwgbGlzdC5sZW5ndGg7IGluZGV4KyspXG4gICAgbGlzdFtpbmRleF0gPSBsaXN0W2luZGV4ICsgMV07XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVyKCkge1xuICAgICAgaWYgKHR5cGVvZiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCByZXNvbHZlciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGlmIChuYW1lICE9PSAnZXJyb3InKSB7XG4gICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgaGFuZGxlciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsICdlcnJvcicsIGhhbmRsZXIsIGZsYWdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlXG4gICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS5cbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZVxuICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS5cbiAgICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgbGlzdGVuZXIoYXJnKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlbWl0dGVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEV2ZW50RW1pdHRlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGVtaXR0ZXIpO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwiYXNzZXRzL2ltYWdlcy9sb2dvLjJhN2JmZjBjMTE4OTE4M2ZhZmU3MWQ3ZDViOTRlMGNkLnBuZ1wiOyIsIihmdW5jdGlvbihhLGIpe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sYik7ZWxzZSBpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgZXhwb3J0cyliKCk7ZWxzZXtiKCksYS5GaWxlU2F2ZXI9e2V4cG9ydHM6e319LmV4cG9ydHN9fSkodGhpcyxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYSxiKXtyZXR1cm5cInVuZGVmaW5lZFwiPT10eXBlb2YgYj9iPXthdXRvQm9tOiExfTpcIm9iamVjdFwiIT10eXBlb2YgYiYmKGNvbnNvbGUud2FybihcIkRlcHJlY2F0ZWQ6IEV4cGVjdGVkIHRoaXJkIGFyZ3VtZW50IHRvIGJlIGEgb2JqZWN0XCIpLGI9e2F1dG9Cb206IWJ9KSxiLmF1dG9Cb20mJi9eXFxzKig/OnRleHRcXC9cXFMqfGFwcGxpY2F0aW9uXFwveG1sfFxcUypcXC9cXFMqXFwreG1sKVxccyo7LipjaGFyc2V0XFxzKj1cXHMqdXRmLTgvaS50ZXN0KGEudHlwZSk/bmV3IEJsb2IoW1wiXFx1RkVGRlwiLGFdLHt0eXBlOmEudHlwZX0pOmF9ZnVuY3Rpb24gYyhhLGIsYyl7dmFyIGQ9bmV3IFhNTEh0dHBSZXF1ZXN0O2Qub3BlbihcIkdFVFwiLGEpLGQucmVzcG9uc2VUeXBlPVwiYmxvYlwiLGQub25sb2FkPWZ1bmN0aW9uKCl7ZyhkLnJlc3BvbnNlLGIsYyl9LGQub25lcnJvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoXCJjb3VsZCBub3QgZG93bmxvYWQgZmlsZVwiKX0sZC5zZW5kKCl9ZnVuY3Rpb24gZChhKXt2YXIgYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yi5vcGVuKFwiSEVBRFwiLGEsITEpO3RyeXtiLnNlbmQoKX1jYXRjaChhKXt9cmV0dXJuIDIwMDw9Yi5zdGF0dXMmJjI5OT49Yi5zdGF0dXN9ZnVuY3Rpb24gZShhKXt0cnl7YS5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KFwiY2xpY2tcIikpfWNhdGNoKGMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiTW91c2VFdmVudHNcIik7Yi5pbml0TW91c2VFdmVudChcImNsaWNrXCIsITAsITAsd2luZG93LDAsMCwwLDgwLDIwLCExLCExLCExLCExLDAsbnVsbCksYS5kaXNwYXRjaEV2ZW50KGIpfX12YXIgZj1cIm9iamVjdFwiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cud2luZG93PT09d2luZG93P3dpbmRvdzpcIm9iamVjdFwiPT10eXBlb2Ygc2VsZiYmc2VsZi5zZWxmPT09c2VsZj9zZWxmOlwib2JqZWN0XCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbC5nbG9iYWw9PT1nbG9iYWw/Z2xvYmFsOnZvaWQgMCxhPWYubmF2aWdhdG9yJiYvTWFjaW50b3NoLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYvQXBwbGVXZWJLaXQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGc9Zi5zYXZlQXN8fChcIm9iamVjdFwiIT10eXBlb2Ygd2luZG93fHx3aW5kb3chPT1mP2Z1bmN0aW9uKCl7fTpcImRvd25sb2FkXCJpbiBIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGUmJiFhP2Z1bmN0aW9uKGIsZyxoKXt2YXIgaT1mLlVSTHx8Zi53ZWJraXRVUkwsaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtnPWd8fGIubmFtZXx8XCJkb3dubG9hZFwiLGouZG93bmxvYWQ9ZyxqLnJlbD1cIm5vb3BlbmVyXCIsXCJzdHJpbmdcIj09dHlwZW9mIGI/KGouaHJlZj1iLGoub3JpZ2luPT09bG9jYXRpb24ub3JpZ2luP2Uoaik6ZChqLmhyZWYpP2MoYixnLGgpOmUoaixqLnRhcmdldD1cIl9ibGFua1wiKSk6KGouaHJlZj1pLmNyZWF0ZU9iamVjdFVSTChiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5yZXZva2VPYmplY3RVUkwoai5ocmVmKX0sNEU0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZShqKX0sMCkpfTpcIm1zU2F2ZU9yT3BlbkJsb2JcImluIG5hdmlnYXRvcj9mdW5jdGlvbihmLGcsaCl7aWYoZz1nfHxmLm5hbWV8fFwiZG93bmxvYWRcIixcInN0cmluZ1wiIT10eXBlb2YgZiluYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihiKGYsaCksZyk7ZWxzZSBpZihkKGYpKWMoZixnLGgpO2Vsc2V7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7aS5ocmVmPWYsaS50YXJnZXQ9XCJfYmxhbmtcIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZShpKX0pfX06ZnVuY3Rpb24oYixkLGUsZyl7aWYoZz1nfHxvcGVuKFwiXCIsXCJfYmxhbmtcIiksZyYmKGcuZG9jdW1lbnQudGl0bGU9Zy5kb2N1bWVudC5ib2R5LmlubmVyVGV4dD1cImRvd25sb2FkaW5nLi4uXCIpLFwic3RyaW5nXCI9PXR5cGVvZiBiKXJldHVybiBjKGIsZCxlKTt2YXIgaD1cImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiPT09Yi50eXBlLGk9L2NvbnN0cnVjdG9yL2kudGVzdChmLkhUTUxFbGVtZW50KXx8Zi5zYWZhcmksaj0vQ3JpT1NcXC9bXFxkXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoKGp8fGgmJml8fGEpJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgRmlsZVJlYWRlcil7dmFyIGs9bmV3IEZpbGVSZWFkZXI7ay5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXt2YXIgYT1rLnJlc3VsdDthPWo/YTphLnJlcGxhY2UoL15kYXRhOlteO10qOy8sXCJkYXRhOmF0dGFjaG1lbnQvZmlsZTtcIiksZz9nLmxvY2F0aW9uLmhyZWY9YTpsb2NhdGlvbj1hLGc9bnVsbH0say5yZWFkQXNEYXRhVVJMKGIpfWVsc2V7dmFyIGw9Zi5VUkx8fGYud2Via2l0VVJMLG09bC5jcmVhdGVPYmplY3RVUkwoYik7Zz9nLmxvY2F0aW9uPW06bG9jYXRpb24uaHJlZj1tLGc9bnVsbCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bC5yZXZva2VPYmplY3RVUkwobSl9LDRFNCl9fSk7Zi5zYXZlQXM9Zy5zYXZlQXM9ZyxcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlJiYobW9kdWxlLmV4cG9ydHM9Zyl9KTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZVNhdmVyLm1pbi5qcy5tYXAiLCJleHBvcnQgdmFyIGZvY3VzT24gPSBmdW5jdGlvbiAodGFyZ2V0LCBmb2N1c09wdGlvbnMpIHtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAvLyBub3QgY2xlYXIgaG93LCBidXQgaXMgcG9zc2libGUgaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS9mb2N1cy1sb2NrL2lzc3Vlcy81M1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgnZm9jdXMnIGluIHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuZm9jdXMoZm9jdXNPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKCdjb250ZW50V2luZG93JyBpbiB0YXJnZXQgJiYgdGFyZ2V0LmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgdGFyZ2V0LmNvbnRlbnRXaW5kb3cuZm9jdXMoKTtcbiAgICB9XG59O1xuIiwiLyoqXG4gKiBkZWZpbmVzIGEgZm9jdXMgZ3JvdXBcbiAqL1xuZXhwb3J0IHZhciBGT0NVU19HUk9VUCA9ICdkYXRhLWZvY3VzLWxvY2snO1xuLyoqXG4gKiBkaXNhYmxlcyBlbGVtZW50IGRpc2NvdmVyeSBpbnNpZGUgYSBncm91cCBtYXJrZWQgYnkga2V5XG4gKi9cbmV4cG9ydCB2YXIgRk9DVVNfRElTQUJMRUQgPSAnZGF0YS1mb2N1cy1sb2NrLWRpc2FibGVkJztcbi8qKlxuICogYWxsb3dzIHVuY29udHJvbGxlZCBmb2N1cyB3aXRoaW4gdGhlIG1hcmtlZCBhcmVhLCBlZmZlY3RpdmVseSBkaXNhYmxpbmcgZm9jdXMgbG9jayBmb3IgaXQncyBjb250ZW50XG4gKi9cbmV4cG9ydCB2YXIgRk9DVVNfQUxMT1cgPSAnZGF0YS1uby1mb2N1cy1sb2NrJztcbi8qKlxuICogaW5zdHJ1Y3RzIGF1dG9mb2N1cyBlbmdpbmUgdG8gcGljayBkZWZhdWx0IGF1dG9mb2N1cyBpbnNpZGUgYSBnaXZlbiBub2RlXG4gKiBjYW4gYmUgc2V0IG9uIHRoZSBlbGVtZW50IG9yIGNvbnRhaW5lclxuICovXG5leHBvcnQgdmFyIEZPQ1VTX0FVVE8gPSAnZGF0YS1hdXRvZm9jdXMtaW5zaWRlJztcbi8qKlxuICogaW5zdHJ1Y3RzIGF1dG9mb2N1cyB0byBpZ25vcmUgZWxlbWVudHMgd2l0aGluIGEgZ2l2ZW4gbm9kZVxuICogY2FuIGJlIHNldCBvbiB0aGUgZWxlbWVudCBvciBjb250YWluZXJcbiAqL1xuZXhwb3J0IHZhciBGT0NVU19OT19BVVRPRk9DVVMgPSAnZGF0YS1uby1hdXRvZm9jdXMnO1xuIiwiaW1wb3J0IHsgY29udGFpbnMgfSBmcm9tICcuL3V0aWxzL0RPTXV0aWxzJztcbmltcG9ydCB7IGdldEFsbEFmZmVjdGVkTm9kZXMgfSBmcm9tICcuL3V0aWxzL2FsbC1hZmZlY3RlZCc7XG5pbXBvcnQgeyBnZXRGaXJzdCwgdG9BcnJheSB9IGZyb20gJy4vdXRpbHMvYXJyYXknO1xuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudCB9IGZyb20gJy4vdXRpbHMvZ2V0QWN0aXZlRWxlbWVudCc7XG52YXIgZm9jdXNJbkZyYW1lID0gZnVuY3Rpb24gKGZyYW1lLCBhY3RpdmVFbGVtZW50KSB7IHJldHVybiBmcmFtZSA9PT0gYWN0aXZlRWxlbWVudDsgfTtcbnZhciBmb2N1c0luc2lkZUlmcmFtZSA9IGZ1bmN0aW9uICh0b3BOb2RlLCBhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odG9BcnJheSh0b3BOb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpKS5zb21lKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBmb2N1c0luRnJhbWUobm9kZSwgYWN0aXZlRWxlbWVudCk7IH0pKTtcbn07XG4vKipcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlLCBpZiB0aGUgY3VycmVudCBmb2N1cyBpcyBpbnNpZGUgZ2l2ZW4gbm9kZSBvciBub2Rlcy5cbiAqIFN1cHBvcnRzIG5vZGVzIGhpZGRlbiBpbnNpZGUgc2hhZG93RG9tXG4gKi9cbmV4cG9ydCB2YXIgZm9jdXNJbnNpZGUgPSBmdW5jdGlvbiAodG9wTm9kZSwgYWN0aXZlRWxlbWVudCkge1xuICAgIC8vIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudCAmJiBnZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgaWYgKGFjdGl2ZUVsZW1lbnQgPT09IHZvaWQgMCkgeyBhY3RpdmVFbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudChnZXRGaXJzdCh0b3BOb2RlKS5vd25lckRvY3VtZW50KTsgfVxuICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAoYWN0aXZlRWxlbWVudC5kYXRhc2V0ICYmIGFjdGl2ZUVsZW1lbnQuZGF0YXNldC5mb2N1c0d1YXJkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBnZXRBbGxBZmZlY3RlZE5vZGVzKHRvcE5vZGUpLnNvbWUoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG5vZGUsIGFjdGl2ZUVsZW1lbnQpIHx8IGZvY3VzSW5zaWRlSWZyYW1lKG5vZGUsIGFjdGl2ZUVsZW1lbnQpO1xuICAgIH0pO1xufTtcbiIsImltcG9ydCB7IEZPQ1VTX0FMTE9XIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgY29udGFpbnMgfSBmcm9tICcuL3V0aWxzL0RPTXV0aWxzJztcbmltcG9ydCB7IHRvQXJyYXkgfSBmcm9tICcuL3V0aWxzL2FycmF5JztcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnQgfSBmcm9tICcuL3V0aWxzL2dldEFjdGl2ZUVsZW1lbnQnO1xuLyoqXG4gKiBjaGVja3MgaWYgZm9jdXMgaXMgaGlkZGVuIEZST00gdGhlIGZvY3VzLWxvY2tcbiAqIGllIGNvbnRhaW5lZCBpbnNpZGUgYSBub2RlIGZvY3VzLWxvY2sgc2hhbGwgaWdub3JlXG4gKlxuICogVGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gY291cGxlZCB3aXRoIHtAbGluayBGT0NVU19BTExPV30gY29uc3RhbnRcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gZm9jdXMgaXMgY3VycmVudGx5IGlzIGluIFwiYWxsb3dcIiBhcmVhXG4gKi9cbmV4cG9ydCB2YXIgZm9jdXNJc0hpZGRlbiA9IGZ1bmN0aW9uIChpbkRvY3VtZW50KSB7XG4gICAgaWYgKGluRG9jdW1lbnQgPT09IHZvaWQgMCkgeyBpbkRvY3VtZW50ID0gZG9jdW1lbnQ7IH1cbiAgICB2YXIgYWN0aXZlRWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoaW5Eb2N1bWVudCk7XG4gICAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gdGhpcyBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgRk9DVVNfQUxMT1cgd2l0aGluIHNoYWRvdyBkb21cbiAgICByZXR1cm4gdG9BcnJheShpbkRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIuY29uY2F0KEZPQ1VTX0FMTE9XLCBcIl1cIikpKS5zb21lKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBjb250YWlucyhub2RlLCBhY3RpdmVFbGVtZW50KTsgfSk7XG59O1xuIiwiaW1wb3J0IHsgTkVXX0ZPQ1VTLCBuZXdGb2N1cyB9IGZyb20gJy4vc29sdmVyJztcbmltcG9ydCB7IGdldEZvY3VzYWJsZU5vZGVzIH0gZnJvbSAnLi91dGlscy9ET011dGlscyc7XG5pbXBvcnQgeyBnZXRBbGxBZmZlY3RlZE5vZGVzIH0gZnJvbSAnLi91dGlscy9hbGwtYWZmZWN0ZWQnO1xuaW1wb3J0IHsgYXNBcnJheSwgZ2V0Rmlyc3QgfSBmcm9tICcuL3V0aWxzL2FycmF5JztcbmltcG9ydCB7IHBpY2tBdXRvZm9jdXMgfSBmcm9tICcuL3V0aWxzL2F1dG8tZm9jdXMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudCB9IGZyb20gJy4vdXRpbHMvZ2V0QWN0aXZlRWxlbWVudCc7XG5pbXBvcnQgeyBpc0RlZmluZWQsIGlzTm90QUd1YXJkIH0gZnJvbSAnLi91dGlscy9pcyc7XG5pbXBvcnQgeyBhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcywgZ2V0VG9wQ29tbW9uUGFyZW50IH0gZnJvbSAnLi91dGlscy9wYXJlbnRpbmcnO1xudmFyIHJlb3JkZXJOb2RlcyA9IGZ1bmN0aW9uIChzcmNOb2RlcywgZHN0Tm9kZXMpIHtcbiAgICB2YXIgcmVtYXAgPSBuZXcgTWFwKCk7XG4gICAgLy8gbm8gU2V0KGRzdE5vZGVzKSBmb3IgSUUxMSA6KFxuICAgIGRzdE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkgeyByZXR1cm4gcmVtYXAuc2V0KGVudGl0eS5ub2RlLCBlbnRpdHkpOyB9KTtcbiAgICAvLyByZW1hcCB0byBkc3ROb2Rlc1xuICAgIHJldHVybiBzcmNOb2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHJlbWFwLmdldChub2RlKTsgfSkuZmlsdGVyKGlzRGVmaW5lZCk7XG59O1xuLyoqXG4gKiBjb250YWlucyB0aGUgbWFpbiBsb2dpYyBvZiB0aGUgYGZvY3VzLWxvY2tgIHBhY2thZ2UuXG4gKlxuICogISB5b3UgcHJvYmFibHkgZG9udCBuZWVkIHRoaXMgZnVuY3Rpb24gIVxuICpcbiAqIGdpdmVuIHRvcCBub2RlKHMpIGFuZCB0aGUgbGFzdCBhY3RpdmUgZWxlbWVudCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGJlIGZvY3VzZWQgbmV4dFxuICogQHJldHVybnMgZWxlbWVudCB3aGljaCBzaG91bGQgYmUgZm9jdXNlZCB0byBtb3ZlIGZvY3VzIGluc2lkZVxuICogQHBhcmFtIHRvcE5vZGVcbiAqIEBwYXJhbSBsYXN0Tm9kZVxuICovXG5leHBvcnQgdmFyIGZvY3VzU29sdmVyID0gZnVuY3Rpb24gKHRvcE5vZGUsIGxhc3ROb2RlKSB7XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KGFzQXJyYXkodG9wTm9kZSkubGVuZ3RoID4gMCA/IGRvY3VtZW50IDogZ2V0Rmlyc3QodG9wTm9kZSkub3duZXJEb2N1bWVudCk7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRBbGxBZmZlY3RlZE5vZGVzKHRvcE5vZGUpLmZpbHRlcihpc05vdEFHdWFyZCk7XG4gICAgdmFyIGNvbW1vblBhcmVudCA9IGdldFRvcENvbW1vblBhcmVudChhY3RpdmVFbGVtZW50IHx8IHRvcE5vZGUsIHRvcE5vZGUsIGVudHJpZXMpO1xuICAgIHZhciB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgdmFyIGFueUZvY3VzYWJsZSA9IGdldEZvY3VzYWJsZU5vZGVzKGVudHJpZXMsIHZpc2liaWxpdHlDYWNoZSk7XG4gICAgdmFyIGlubmVyRWxlbWVudHMgPSBhbnlGb2N1c2FibGUuZmlsdGVyKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBpc05vdEFHdWFyZChub2RlKTtcbiAgICB9KTtcbiAgICBpZiAoIWlubmVyRWxlbWVudHNbMF0pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIG91dGVyTm9kZXMgPSBnZXRGb2N1c2FibGVOb2RlcyhbY29tbW9uUGFyZW50XSwgdmlzaWJpbGl0eUNhY2hlKS5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSk7XG4gICAgdmFyIG9yZGVyZWRJbm5lckVsZW1lbnRzID0gcmVvcmRlck5vZGVzKG91dGVyTm9kZXMsIGlubmVyRWxlbWVudHMpO1xuICAgIC8vIGNvbGxlY3QgaW5uZXIgZm9jdXNhYmxlIGFuZCBzZXBhcmF0ZWx5IHRhYmJhYmxlc1xuICAgIHZhciBpbm5lckZvY3VzYWJsZXMgPSBvcmRlcmVkSW5uZXJFbGVtZW50cy5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSk7XG4gICAgdmFyIGlubmVyVGFiYmFibGUgPSBvcmRlcmVkSW5uZXJFbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciB0YWJJbmRleCA9IF9hLnRhYkluZGV4O1xuICAgICAgICByZXR1cm4gdGFiSW5kZXggPj0gMDtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSk7XG4gICAgdmFyIG5ld0lkID0gbmV3Rm9jdXMoaW5uZXJGb2N1c2FibGVzLCBpbm5lclRhYmJhYmxlLCBvdXRlck5vZGVzLCBhY3RpdmVFbGVtZW50LCBsYXN0Tm9kZSk7XG4gICAgaWYgKG5ld0lkID09PSBORVdfRk9DVVMpIHtcbiAgICAgICAgdmFyIGZvY3VzTm9kZSA9IFxuICAgICAgICAvLyBmaXJzdCB0cnkgb25seSB0YWJiYWJsZSwgYW5kIHRoZSBmYWxsYmFjayB0byBhbGwgZm9jdXNhYmxlLCBhcyBsb25nIGFzIGF0IGxlYXN0IG9uZSBlbGVtZW50IHNob3VsZCBiZSBwaWNrZWQgZm9yIGZvY3VzXG4gICAgICAgIHBpY2tBdXRvZm9jdXMoYW55Rm9jdXNhYmxlLCBpbm5lclRhYmJhYmxlLCBhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcyhlbnRyaWVzLCB2aXNpYmlsaXR5Q2FjaGUpKSB8fFxuICAgICAgICAgICAgcGlja0F1dG9mb2N1cyhhbnlGb2N1c2FibGUsIGlubmVyRm9jdXNhYmxlcywgYWxsUGFyZW50QXV0b2ZvY3VzYWJsZXMoZW50cmllcywgdmlzaWJpbGl0eUNhY2hlKSk7XG4gICAgICAgIGlmIChmb2N1c05vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IGZvY3VzTm9kZSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdmb2N1cy1sb2NrOiBjYW5ub3QgZmluZCBhbnkgbm9kZSB0byBtb3ZlIGZvY3VzIGludG8nKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5ld0lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ld0lkO1xuICAgIH1cbiAgICByZXR1cm4gb3JkZXJlZElubmVyRWxlbWVudHNbbmV3SWRdO1xufTtcbiIsImltcG9ydCB7IGdldEFsbEFmZmVjdGVkTm9kZXMgfSBmcm9tICcuL3V0aWxzL2FsbC1hZmZlY3RlZCc7XG5pbXBvcnQgeyBpc0d1YXJkLCBpc05vdEFHdWFyZCB9IGZyb20gJy4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgZ2V0VG9wQ29tbW9uUGFyZW50IH0gZnJvbSAnLi91dGlscy9wYXJlbnRpbmcnO1xuaW1wb3J0IHsgb3JkZXJCeVRhYkluZGV4IH0gZnJvbSAnLi91dGlscy90YWJPcmRlcic7XG5pbXBvcnQgeyBnZXRGb2N1c2FibGVzIH0gZnJvbSAnLi91dGlscy90YWJVdGlscyc7XG4vKipcbiAqIHRyYXZlcnNlcyBhbGwgcmVsYXRlZCBub2RlcyAoaW5jbHVkaW5nIGdyb3VwcykgcmV0dXJuaW5nIGEgbGlzdCBvZiBhbGwgbm9kZXMob3V0ZXIgYW5kIGludGVybmFsKSB3aXRoIG1ldGEgaW5mb3JtYXRpb25cbiAqIFRoaXMgaXMgbG93LWxldmVsIEFQSSFcbiAqIEByZXR1cm5zIGxpc3Qgb2YgZm9jdXNhYmxlIGVsZW1lbnRzIGluc2lkZSBhIGdpdmVuIHRvcCghKSBub2RlLlxuICogQHNlZSB7QGxpbmsgZ2V0Rm9jdXNhYmxlTm9kZXN9IHByb3ZpZGluZyBhIHNpbXBsZXIgQVBJXG4gKi9cbmV4cG9ydCB2YXIgZXhwYW5kRm9jdXNhYmxlTm9kZXMgPSBmdW5jdGlvbiAodG9wTm9kZSkge1xuICAgIHZhciBlbnRyaWVzID0gZ2V0QWxsQWZmZWN0ZWROb2Rlcyh0b3BOb2RlKS5maWx0ZXIoaXNOb3RBR3VhcmQpO1xuICAgIHZhciBjb21tb25QYXJlbnQgPSBnZXRUb3BDb21tb25QYXJlbnQodG9wTm9kZSwgdG9wTm9kZSwgZW50cmllcyk7XG4gICAgdmFyIG91dGVyTm9kZXMgPSBvcmRlckJ5VGFiSW5kZXgoZ2V0Rm9jdXNhYmxlcyhbY29tbW9uUGFyZW50XSwgdHJ1ZSksIHRydWUsIHRydWUpO1xuICAgIHZhciBpbm5lckVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlcyhlbnRyaWVzLCBmYWxzZSk7XG4gICAgcmV0dXJuIG91dGVyTm9kZXMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGUsIGluZGV4ID0gX2EuaW5kZXg7XG4gICAgICAgIHJldHVybiAoe1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIGxvY2tJdGVtOiBpbm5lckVsZW1lbnRzLmluZGV4T2Yobm9kZSkgPj0gMCxcbiAgICAgICAgICAgIGd1YXJkOiBpc0d1YXJkKG5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyBmb2N1c09uIH0gZnJvbSAnLi9jb21tYW5kcyc7XG5pbXBvcnQgeyBmb2N1c1NvbHZlciB9IGZyb20gJy4vZm9jdXNTb2x2ZXInO1xudmFyIGd1YXJkQ291bnQgPSAwO1xudmFyIGxvY2tEaXNhYmxlZCA9IGZhbHNlO1xuLyoqXG4gKiBUaGUgbWFpbiBmdW5jdGlvbmFsaXR5IG9mIHRoZSBmb2N1cy1sb2NrIHBhY2thZ2VcbiAqXG4gKiBDb250YWlucyBmb2N1cyBhdCBhIGdpdmVuIG5vZGUuXG4gKiBUaGUgbGFzdCBmb2N1c2VkIGVsZW1lbnQgd2lsbCBoZWxwIHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50KGZpcnN0IG9yIGxhc3QpIHNob3VsZCBiZSBmb2N1c2VkLlxuICogVGhlIGZvdW5kIGVsZW1lbnQgd2lsbCBiZSBmb2N1c2VkLlxuICpcbiAqIFRoaXMgaXMgb25lIHRpbWUgYWN0aW9uIChtb3ZlKSwgbm90IGEgcGVyc2lzdGVudCBmb2N1cy1sb2NrXG4gKlxuICogSFRNTCBtYXJrZXJzIChzZWUge0BsaW5rIGltcG9ydCgnLi9jb25zdGFudHMnKS5GT0NVU19BVVRPfSBjb25zdGFudHMpIGNhbiBjb250cm9sIGF1dG9mb2N1c1xuICogQHNlZSB7QGxpbmsgZm9jdXNTb2x2ZXJ9IGZvciB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYXV0b2ZvY3VzXG4gKi9cbmV4cG9ydCB2YXIgbW92ZUZvY3VzSW5zaWRlID0gZnVuY3Rpb24gKHRvcE5vZGUsIGxhc3ROb2RlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgZm9jdXNhYmxlID0gZm9jdXNTb2x2ZXIodG9wTm9kZSwgbGFzdE5vZGUpO1xuICAgIC8vIGdsb2JhbCBsb2NhbCBzaWRlIGVmZmVjdCB0byBjb3VudGFpbiByZWN1cnNpdmUgbG9jayBhY3RpdmF0aW9uIGFuZCByZXNvbHZlIGZvY3VzLWZpZ2h0aW5nXG4gICAgaWYgKGxvY2tEaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChmb2N1c2FibGUpIHtcbiAgICAgICAgLyoqICtGT0NVUy1GSUdIVElORyBwcmV2ZW50aW9uICoqL1xuICAgICAgICBpZiAoZ3VhcmRDb3VudCA+IDIpIHtcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgcmVjdXJzaXZlIGVudGVyZWQgYmFjayB0aGUgbG9jayBhY3RpdmF0aW9uXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGb2N1c0xvY2s6IGZvY3VzLWZpZ2h0aW5nIGRldGVjdGVkLiBPbmx5IG9uZSBmb2N1cyBtYW5hZ2VtZW50IHN5c3RlbSBjb3VsZCBiZSBhY3RpdmUuICcgK1xuICAgICAgICAgICAgICAgICdTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS9mb2N1cy1sb2NrLyNmb2N1cy1maWdodGluZycpO1xuICAgICAgICAgICAgbG9ja0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxvY2tEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ3VhcmRDb3VudCsrO1xuICAgICAgICBmb2N1c09uKGZvY3VzYWJsZS5ub2RlLCBvcHRpb25zLmZvY3VzT3B0aW9ucyk7XG4gICAgICAgIGd1YXJkQ291bnQtLTtcbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgZ2V0VGFiYmFibGVOb2RlcyB9IGZyb20gJy4vdXRpbHMvRE9NdXRpbHMnO1xuZnVuY3Rpb24gd2Vha1JlZih2YWx1ZSkge1xuICAgIGlmICghdmFsdWUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIC8vICM2OCBTYWZhcmkgMTQuMSBkb250IGhhdmUgaXQgeWV0XG4gICAgLy8gRklYTUU6IHJlbW92ZSBpbiAyMDI1XG4gICAgaWYgKHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWUgfHwgbnVsbDsgfTtcbiAgICB9XG4gICAgdmFyIHcgPSB2YWx1ZSA/IG5ldyBXZWFrUmVmKHZhbHVlKSA6IG51bGw7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuICh3ID09PSBudWxsIHx8IHcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHcuZGVyZWYoKSkgfHwgbnVsbDsgfTtcbn1cbmV4cG9ydCB2YXIgcmVjb3JkRWxlbWVudExvY2F0aW9uID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgY3VycmVudDogd2Vha1JlZihjdXJyZW50RWxlbWVudCksXG4gICAgICAgICAgICBwYXJlbnQ6IHdlYWtSZWYoY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudCksXG4gICAgICAgICAgICBsZWZ0OiB3ZWFrUmVmKGN1cnJlbnRFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpLFxuICAgICAgICAgICAgcmlnaHQ6IHdlYWtSZWYoY3VycmVudEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudDogd2Vha1JlZihlbGVtZW50KSxcbiAgICAgICAgc3RhY2s6IHN0YWNrLFxuICAgICAgICBvd25lckRvY3VtZW50OiBlbGVtZW50Lm93bmVyRG9jdW1lbnQsXG4gICAgfTtcbn07XG52YXIgcmVzdG9yZUZvY3VzVG8gPSBmdW5jdGlvbiAobG9jYXRpb24pIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIHN0YWNrID0gbG9jYXRpb24uc3RhY2ssIG93bmVyRG9jdW1lbnQgPSBsb2NhdGlvbi5vd25lckRvY3VtZW50O1xuICAgIHZhciB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBzdGFja18xID0gc3RhY2s7IF9pIDwgc3RhY2tfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBzdGFja18xW19pXTtcbiAgICAgICAgdmFyIHBhcmVudF8xID0gKF9hID0gbGluZS5wYXJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGxpbmUpO1xuICAgICAgICAvLyBpcyBpdCBzdGlsbCBoZXJlP1xuICAgICAgICBpZiAocGFyZW50XzEgJiYgb3duZXJEb2N1bWVudC5jb250YWlucyhwYXJlbnRfMSkpIHtcbiAgICAgICAgICAgIHZhciBsZWZ0ID0gKF9iID0gbGluZS5sZWZ0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChsaW5lKTtcbiAgICAgICAgICAgIHZhciBzYXZlZEN1cnJlbnQgPSBsaW5lLmN1cnJlbnQoKTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gcGFyZW50XzEuY29udGFpbnMoc2F2ZWRDdXJyZW50KSA/IHNhdmVkQ3VycmVudCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZhciByaWdodCA9IChfYyA9IGxpbmUucmlnaHQpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5jYWxsKGxpbmUpO1xuICAgICAgICAgICAgdmFyIGZvY3VzYWJsZXMgPSBnZXRUYWJiYWJsZU5vZGVzKFtwYXJlbnRfMV0sIHZpc2liaWxpdHlDYWNoZSk7XG4gICAgICAgICAgICB2YXIgYWltID0gXG4gICAgICAgICAgICAvLyB0aGF0IGlzIGVsZW1lbnQgaXRzZWxmXG4gICAgICAgICAgICAoX2UgPSAoX2QgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQgIT09IHZvaWQgMCA/IGN1cnJlbnQgOiBcbiAgICAgICAgICAgIC8vIG9yIHNvbWV0aGluZyBpbiBpdCdzIHBsYWNlXG4gICAgICAgICAgICBsZWZ0ID09PSBudWxsIHx8IGxlZnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxlZnQubmV4dEVsZW1lbnRTaWJsaW5nKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBcbiAgICAgICAgICAgIC8vIG9yIHNvbWVib2R5IHRvIHRoZSByaWdodCwgc3RpbGwgY2xvc2UgZW5vdWdoXG4gICAgICAgICAgICByaWdodCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogXG4gICAgICAgICAgICAvLyBvciBzb21lYm9keSB0byB0aGUgbGVmdCwgc29tZXRoaW5nP1xuICAgICAgICAgICAgbGVmdDtcbiAgICAgICAgICAgIHdoaWxlIChhaW0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfZiA9IDAsIGZvY3VzYWJsZXNfMSA9IGZvY3VzYWJsZXM7IF9mIDwgZm9jdXNhYmxlc18xLmxlbmd0aDsgX2YrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm9jdXNhYmxlID0gZm9jdXNhYmxlc18xW19mXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFpbSA9PT0gbnVsbCB8fCBhaW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFpbS5jb250YWlucyhmb2N1c2FibGUubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2FibGUubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhaW0gPSBhaW0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvY3VzYWJsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgcGFyZW50IGNvbnRhaW5zIGEgZm9jdXNhYmxlIC0gbW92ZSB0aGVyZVxuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2FibGVzWzBdLm5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbm90aGluZyBtYXRjaGVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4vKipcbiAqIENhcHR1cmVzIHRoZSBjdXJyZW50IGZvY3VzZWQgZWxlbWVudCB0byByZXN0b3JlIGZvY3VzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIGluIHRoZSBmdXR1cmVcbiAqIEhhbmRsZXMgc2l0dWF0aW9ucyB3aGVyZSB0aGUgZm9jdXNlZCBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NIG9yIG5vIGxvbmdlciBmb2N1c2FibGVcbiAqIG1vdmluZyBmb2N1cyB0byB0aGUgY2xvc2VzdCBmb2N1c2FibGUgZWxlbWVudFxuICogQHBhcmFtIHRhcmdldEVsZW1lbnQgLSBlbGVtZW50IHdoZXJlIGZvY3VzIHNob3VsZCBiZSByZXN0b3JlZFxuICogQHJldHVybnMgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBuZXcgZWxlbWVudCB0byBmb2N1c1xuICovXG5leHBvcnQgdmFyIGNhcHR1cmVGb2N1c1Jlc3RvcmUgPSBmdW5jdGlvbiAodGFyZ2V0RWxlbWVudCkge1xuICAgIHZhciBsb2NhdGlvbiA9IHJlY29yZEVsZW1lbnRMb2NhdGlvbih0YXJnZXRFbGVtZW50KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcmVzdG9yZUZvY3VzVG8obG9jYXRpb24pO1xuICAgIH07XG59O1xuIiwiaW1wb3J0IHsgZm9jdXNPbiB9IGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IHsgZ2V0VGFiYmFibGVOb2RlcywgY29udGFpbnMsIGdldEZvY3VzYWJsZU5vZGVzIH0gZnJvbSAnLi91dGlscy9ET011dGlscyc7XG5pbXBvcnQgeyBhc0FycmF5IH0gZnJvbSAnLi91dGlscy9hcnJheSc7XG4vKipcbiAqIGZvciBhIGdpdmVuIGBlbGVtZW50YCBpbiBhIGdpdmVuIGBzY29wZWAgcmV0dXJucyBmb2N1c2FibGUgc2libGluZ3NcbiAqIEBwYXJhbSBlbGVtZW50IC0gYmFzZSBlbGVtZW50XG4gKiBAcGFyYW0gc2NvcGUgLSBjb21tb24gcGFyZW50LiBDYW4gYmUgZG9jdW1lbnQsIGJ1dCBiZXR0ZXIgdG8gbmFycm93IGl0IGRvd24gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcbiAqIEByZXR1cm5zIHtwcmV2LG5leHR9IC0gcmVmZXJlbmNlcyB0byBhIGZvY3VzYWJsZSBlbGVtZW50IGJlZm9yZSBhbmQgYWZ0ZXJcbiAqIEByZXR1cm5zIHVuZGVmaW5lZCAtIGlmIG9wZXJhdGlvbiBpcyBub3QgYXBwbGljYWJsZVxuICovXG5leHBvcnQgdmFyIGdldFJlbGF0aXZlRm9jdXNhYmxlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHNjb3BlLCB1c2VUYWJiYWJsZXMpIHtcbiAgICBpZiAoIWVsZW1lbnQgfHwgIXNjb3BlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ25vIGVsZW1lbnQgb3Igc2NvcGUgZ2l2ZW4nKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICB2YXIgc2hhcmRzID0gYXNBcnJheShzY29wZSk7XG4gICAgaWYgKHNoYXJkcy5ldmVyeShmdW5jdGlvbiAoc2hhcmQpIHsgcmV0dXJuICFjb250YWlucyhzaGFyZCwgZWxlbWVudCk7IH0pKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZSBlbGVtZW50IGlzIG5vdCBjb250YWluZWQgaW4gdGhlIHNjb3BlJyk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgdmFyIGZvY3VzYWJsZXMgPSB1c2VUYWJiYWJsZXNcbiAgICAgICAgPyBnZXRUYWJiYWJsZU5vZGVzKHNoYXJkcywgbmV3IE1hcCgpKVxuICAgICAgICA6IGdldEZvY3VzYWJsZU5vZGVzKHNoYXJkcywgbmV3IE1hcCgpKTtcbiAgICB2YXIgY3VycmVudCA9IGZvY3VzYWJsZXMuZmluZEluZGV4KGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBub2RlID09PSBlbGVtZW50O1xuICAgIH0pO1xuICAgIGlmIChjdXJyZW50ID09PSAtMSkge1xuICAgICAgICAvLyBhbiBlZGdlIGNhc2UsIHdoZW4gYW5jaG9yIGVsZW1lbnQgaXMgbm90IGZvdW5kXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHByZXY6IGZvY3VzYWJsZXNbY3VycmVudCAtIDFdLFxuICAgICAgICBuZXh0OiBmb2N1c2FibGVzW2N1cnJlbnQgKyAxXSxcbiAgICAgICAgZmlyc3Q6IGZvY3VzYWJsZXNbMF0sXG4gICAgICAgIGxhc3Q6IGZvY3VzYWJsZXNbZm9jdXNhYmxlcy5sZW5ndGggLSAxXSxcbiAgICB9O1xufTtcbnZhciBnZXRCb3VuZGFyeSA9IGZ1bmN0aW9uIChzaGFyZHMsIHVzZVRhYmJhYmxlcykge1xuICAgIHZhciBzZXQgPSB1c2VUYWJiYWJsZXNcbiAgICAgICAgPyBnZXRUYWJiYWJsZU5vZGVzKGFzQXJyYXkoc2hhcmRzKSwgbmV3IE1hcCgpKVxuICAgICAgICA6IGdldEZvY3VzYWJsZU5vZGVzKGFzQXJyYXkoc2hhcmRzKSwgbmV3IE1hcCgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmaXJzdDogc2V0WzBdLFxuICAgICAgICBsYXN0OiBzZXRbc2V0Lmxlbmd0aCAtIDFdLFxuICAgIH07XG59O1xudmFyIGRlZmF1bHRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHNjb3BlOiBkb2N1bWVudC5ib2R5LFxuICAgICAgICBjeWNsZTogdHJ1ZSxcbiAgICAgICAgb25seVRhYmJhYmxlOiB0cnVlLFxuICAgIH0sIG9wdGlvbnMpO1xufTtcbnZhciBtb3ZlRm9jdXMgPSBmdW5jdGlvbiAoZnJvbUVsZW1lbnQsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgbmV3T3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zKG9wdGlvbnMpO1xuICAgIHZhciBzb2x1dGlvbiA9IGdldFJlbGF0aXZlRm9jdXNhYmxlKGZyb21FbGVtZW50LCBuZXdPcHRpb25zLnNjb3BlLCBuZXdPcHRpb25zLm9ubHlUYWJiYWJsZSk7XG4gICAgaWYgKCFzb2x1dGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0YXJnZXQgPSBjYihzb2x1dGlvbiwgbmV3T3B0aW9ucy5jeWNsZSk7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgICBmb2N1c09uKHRhcmdldC5ub2RlLCBuZXdPcHRpb25zLmZvY3VzT3B0aW9ucyk7XG4gICAgfVxufTtcbi8qKlxuICogZm9jdXNlcyBuZXh0IGVsZW1lbnQgaW4gdGhlIHRhYi1vcmRlclxuICogQHBhcmFtIGZyb21FbGVtZW50IC0gY29tbW9uIHBhcmVudCB0byBzY29wZSBhY3RpdmUgZWxlbWVudCBzZWFyY2ggb3IgdGFiIGN5Y2xlIG9yZGVyXG4gKiBAcGFyYW0ge0ZvY3VzTmV4dE9wdGlvbnN9IFtvcHRpb25zXSAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c05leHRFbGVtZW50ID0gZnVuY3Rpb24gKGZyb21FbGVtZW50LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBtb3ZlRm9jdXMoZnJvbUVsZW1lbnQsIG9wdGlvbnMsIGZ1bmN0aW9uIChfYSwgY3ljbGUpIHtcbiAgICAgICAgdmFyIG5leHQgPSBfYS5uZXh0LCBmaXJzdCA9IF9hLmZpcnN0O1xuICAgICAgICByZXR1cm4gbmV4dCB8fCAoY3ljbGUgJiYgZmlyc3QpO1xuICAgIH0pO1xufTtcbi8qKlxuICogZm9jdXNlcyBwcmV2IGVsZW1lbnQgaW4gdGhlIHRhYiBvcmRlclxuICogQHBhcmFtIGZyb21FbGVtZW50IC0gY29tbW9uIHBhcmVudCB0byBzY29wZSBhY3RpdmUgZWxlbWVudCBzZWFyY2ggb3IgdGFiIGN5Y2xlIG9yZGVyXG4gKiBAcGFyYW0ge0ZvY3VzTmV4dE9wdGlvbnN9IFtvcHRpb25zXSAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c1ByZXZFbGVtZW50ID0gZnVuY3Rpb24gKGZyb21FbGVtZW50LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBtb3ZlRm9jdXMoZnJvbUVsZW1lbnQsIG9wdGlvbnMsIGZ1bmN0aW9uIChfYSwgY3ljbGUpIHtcbiAgICAgICAgdmFyIHByZXYgPSBfYS5wcmV2LCBsYXN0ID0gX2EubGFzdDtcbiAgICAgICAgcmV0dXJuIHByZXYgfHwgKGN5Y2xlICYmIGxhc3QpO1xuICAgIH0pO1xufTtcbnZhciBwaWNrQm91bmRhcnkgPSBmdW5jdGlvbiAoc2NvcGUsIG9wdGlvbnMsIHdoYXQpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGJvdW5kYXJ5ID0gZ2V0Qm91bmRhcnkoc2NvcGUsIChfYSA9IG9wdGlvbnMub25seVRhYmJhYmxlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlKTtcbiAgICB2YXIgbm9kZSA9IGJvdW5kYXJ5W3doYXRdO1xuICAgIGlmIChub2RlKSB7XG4gICAgICAgIGZvY3VzT24obm9kZS5ub2RlLCBvcHRpb25zLmZvY3VzT3B0aW9ucyk7XG4gICAgfVxufTtcbi8qKlxuICogZm9jdXNlcyBmaXJzdCBlbGVtZW50IGluIHRoZSB0YWItb3JkZXJcbiAqIEBwYXJhbSB7Rm9jdXNOZXh0T3B0aW9uc30gb3B0aW9ucyAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c0ZpcnN0RWxlbWVudCA9IGZ1bmN0aW9uIChzY29wZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgcGlja0JvdW5kYXJ5KHNjb3BlLCBvcHRpb25zLCAnZmlyc3QnKTtcbn07XG4vKipcbiAqIGZvY3VzZXMgbGFzdCBlbGVtZW50IGluIHRoZSB0YWIgb3JkZXJcbiAqIEBwYXJhbSB7Rm9jdXNOZXh0T3B0aW9uc30gb3B0aW9ucyAtIGZvY3VzIG9wdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBmb2N1c0xhc3RFbGVtZW50ID0gZnVuY3Rpb24gKHNjb3BlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBwaWNrQm91bmRhcnkoc2NvcGUsIG9wdGlvbnMsICdsYXN0Jyk7XG59O1xuIiwiaW1wb3J0IHsgY29ycmVjdE5vZGVzIH0gZnJvbSAnLi91dGlscy9jb3JyZWN0Rm9jdXMnO1xuaW1wb3J0IHsgcGlja0ZvY3VzYWJsZSB9IGZyb20gJy4vdXRpbHMvZmlyc3RGb2N1cyc7XG5pbXBvcnQgeyBpc0d1YXJkIH0gZnJvbSAnLi91dGlscy9pcyc7XG5leHBvcnQgdmFyIE5FV19GT0NVUyA9ICdORVdfRk9DVVMnO1xuLyoqXG4gKiBNYWluIHNvbHZlciBmb3IgdGhlIFwiZmluZCBuZXh0IGZvY3VzXCIgcXVlc3Rpb25cbiAqIEBwYXJhbSBpbm5lck5vZGVzIC0gdXNlZCB0byBjb250cm9sIFwicmV0dXJuIGZvY3VzXCJcbiAqIEBwYXJhbSBpbm5lclRhYmJhYmxlcyAtIHVzZWQgdG8gY29udHJvbCBcImF1dG9mb2N1c1wiXG4gKiBAcGFyYW0gb3V0ZXJOb2Rlc1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnRcbiAqIEBwYXJhbSBsYXN0Tm9kZVxuICogQHJldHVybnMge251bWJlcnxzdHJpbmd8dW5kZWZpbmVkfCp9XG4gKi9cbmV4cG9ydCB2YXIgbmV3Rm9jdXMgPSBmdW5jdGlvbiAoaW5uZXJOb2RlcywgaW5uZXJUYWJiYWJsZXMsIG91dGVyTm9kZXMsIGFjdGl2ZUVsZW1lbnQsIGxhc3ROb2RlKSB7XG4gICAgdmFyIGNudCA9IGlubmVyTm9kZXMubGVuZ3RoO1xuICAgIHZhciBmaXJzdEZvY3VzID0gaW5uZXJOb2Rlc1swXTtcbiAgICB2YXIgbGFzdEZvY3VzID0gaW5uZXJOb2Rlc1tjbnQgLSAxXTtcbiAgICB2YXIgaXNPbkd1YXJkID0gaXNHdWFyZChhY3RpdmVFbGVtZW50KTtcbiAgICAvLyBmb2N1cyBpcyBpbnNpZGVcbiAgICBpZiAoYWN0aXZlRWxlbWVudCAmJiBpbm5lck5vZGVzLmluZGV4T2YoYWN0aXZlRWxlbWVudCkgPj0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgYWN0aXZlSW5kZXggPSBhY3RpdmVFbGVtZW50ICE9PSB1bmRlZmluZWQgPyBvdXRlck5vZGVzLmluZGV4T2YoYWN0aXZlRWxlbWVudCkgOiAtMTtcbiAgICB2YXIgbGFzdEluZGV4ID0gbGFzdE5vZGUgPyBvdXRlck5vZGVzLmluZGV4T2YobGFzdE5vZGUpIDogYWN0aXZlSW5kZXg7XG4gICAgdmFyIGxhc3ROb2RlSW5zaWRlID0gbGFzdE5vZGUgPyBpbm5lck5vZGVzLmluZGV4T2YobGFzdE5vZGUpIDogLTE7XG4gICAgLy8gbm8gYWN0aXZlIGZvY3VzIChvciBmb2N1cyBpcyBvbiB0aGUgYm9keSlcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIC8vIGtub3duIGZhbGxiYWNrXG4gICAgICAgIGlmIChsYXN0Tm9kZUluc2lkZSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTkVXX0ZPQ1VTO1xuICAgIH1cbiAgICAvLyBuZXcgZm9jdXMsIG5vdGhpbmcgdG8gY2FsY3VsYXRlXG4gICAgaWYgKGxhc3ROb2RlSW5zaWRlID09PSAtMSkge1xuICAgICAgICByZXR1cm4gTkVXX0ZPQ1VTO1xuICAgIH1cbiAgICB2YXIgaW5kZXhEaWZmID0gYWN0aXZlSW5kZXggLSBsYXN0SW5kZXg7XG4gICAgdmFyIGZpcnN0Tm9kZUluZGV4ID0gb3V0ZXJOb2Rlcy5pbmRleE9mKGZpcnN0Rm9jdXMpO1xuICAgIHZhciBsYXN0Tm9kZUluZGV4ID0gb3V0ZXJOb2Rlcy5pbmRleE9mKGxhc3RGb2N1cyk7XG4gICAgdmFyIGNvcnJlY3RlZE5vZGVzID0gY29ycmVjdE5vZGVzKG91dGVyTm9kZXMpO1xuICAgIHZhciBjb3JyZWN0ZWRJbmRleCA9IGFjdGl2ZUVsZW1lbnQgIT09IHVuZGVmaW5lZCA/IGNvcnJlY3RlZE5vZGVzLmluZGV4T2YoYWN0aXZlRWxlbWVudCkgOiAtMTtcbiAgICB2YXIgY29ycmVjdGVkSW5kZXhEaWZmID0gY29ycmVjdGVkSW5kZXggLSAobGFzdE5vZGUgPyBjb3JyZWN0ZWROb2Rlcy5pbmRleE9mKGxhc3ROb2RlKSA6IGFjdGl2ZUluZGV4KTtcbiAgICAvLyBvbGQgZm9jdXNcbiAgICBpZiAoIWluZGV4RGlmZiAmJiBsYXN0Tm9kZUluc2lkZSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICB9XG4gICAgLy8gbm8gdGFiYmFibGUgZWxlbWVudHMsIGF1dG9mb2N1cyBpcyBub3QgcG9zc2libGVcbiAgICBpZiAoaW5uZXJUYWJiYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGFuIGVkZ2UgY2FzZSB3aXRoIG5vIHRhYmJhYmxlIGVsZW1lbnRzXG4gICAgICAgIC8vIHJldHVybiB0aGUgbGFzdCBmb2N1c2FibGUgb25lXG4gICAgICAgIC8vIHdpdGggc29tZSBwcm9iYWJpbGl0eSB0aGlzIHdpbGwgcHJldmVudCBmb2N1cyBmcm9tIGN5Y2xpbmcgYWNyb3NzIHRoZSBsb2NrLCBidXQgdGhlcmUgaXMgbm8gdGFiYmFsZSBlbGVtZW50cyB0byBjeWNsZSB0b1xuICAgICAgICByZXR1cm4gbGFzdE5vZGVJbnNpZGU7XG4gICAgfVxuICAgIHZhciByZXR1cm5GaXJzdE5vZGUgPSBwaWNrRm9jdXNhYmxlKGlubmVyTm9kZXMsIGlubmVyVGFiYmFibGVzWzBdKTtcbiAgICB2YXIgcmV0dXJuTGFzdE5vZGUgPSBwaWNrRm9jdXNhYmxlKGlubmVyTm9kZXMsIGlubmVyVGFiYmFibGVzW2lubmVyVGFiYmFibGVzLmxlbmd0aCAtIDFdKTtcbiAgICAvLyBmaXJzdCBlbGVtZW50XG4gICAgaWYgKGFjdGl2ZUluZGV4IDw9IGZpcnN0Tm9kZUluZGV4ICYmIGlzT25HdWFyZCAmJiBNYXRoLmFicyhpbmRleERpZmYpID4gMSkge1xuICAgICAgICByZXR1cm4gcmV0dXJuTGFzdE5vZGU7XG4gICAgfVxuICAgIC8vIGxhc3QgZWxlbWVudFxuICAgIGlmIChhY3RpdmVJbmRleCA+PSBsYXN0Tm9kZUluZGV4ICYmIGlzT25HdWFyZCAmJiBNYXRoLmFicyhpbmRleERpZmYpID4gMSkge1xuICAgICAgICByZXR1cm4gcmV0dXJuRmlyc3ROb2RlO1xuICAgIH1cbiAgICAvLyBqdW1wIG91dCwgYnV0IG5vdCBvbiB0aGUgZ3VhcmRcbiAgICBpZiAoaW5kZXhEaWZmICYmIE1hdGguYWJzKGNvcnJlY3RlZEluZGV4RGlmZikgPiAxKSB7XG4gICAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICB9XG4gICAgLy8gZm9jdXMgYWJvdmUgbG9ja1xuICAgIGlmIChhY3RpdmVJbmRleCA8PSBmaXJzdE5vZGVJbmRleCkge1xuICAgICAgICByZXR1cm4gcmV0dXJuTGFzdE5vZGU7XG4gICAgfVxuICAgIC8vIGZvY3VzIGJlbG93IGxvY2tcbiAgICBpZiAoYWN0aXZlSW5kZXggPiBsYXN0Tm9kZUluZGV4KSB7XG4gICAgICAgIHJldHVybiByZXR1cm5GaXJzdE5vZGU7XG4gICAgfVxuICAgIC8vIGluZGV4IGlzIGluc2lkZSB0YWIgb3JkZXIsIGJ1dCBvdXRzaWRlIExvY2tcbiAgICBpZiAoaW5kZXhEaWZmKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhpbmRleERpZmYpID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3ROb2RlSW5zaWRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY250ICsgbGFzdE5vZGVJbnNpZGUgKyBpbmRleERpZmYpICUgY250O1xuICAgIH1cbiAgICAvLyBkbyBub3RoaW5nXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCJpbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5pbXBvcnQgeyBpc0F1dG9Gb2N1c0FsbG93ZWRDYWNoZWQsIGlzVmlzaWJsZUNhY2hlZCwgbm90SGlkZGVuSW5wdXQgfSBmcm9tICcuL2lzJztcbmltcG9ydCB7IG9yZGVyQnlUYWJJbmRleCB9IGZyb20gJy4vdGFiT3JkZXInO1xuaW1wb3J0IHsgZ2V0Rm9jdXNhYmxlcywgZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXMgfSBmcm9tICcuL3RhYlV0aWxzJztcbi8qKlxuICogZ2l2ZW4gbGlzdCBvZiBmb2N1c2FibGUgZWxlbWVudHMga2VlcHMgdGhlIG9uZXMgdXNlciBjYW4gaW50ZXJhY3Qgd2l0aFxuICogQHBhcmFtIG5vZGVzXG4gKiBAcGFyYW0gdmlzaWJpbGl0eUNhY2hlXG4gKi9cbmV4cG9ydCB2YXIgZmlsdGVyRm9jdXNhYmxlID0gZnVuY3Rpb24gKG5vZGVzLCB2aXNpYmlsaXR5Q2FjaGUpIHtcbiAgICByZXR1cm4gdG9BcnJheShub2RlcylcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gaXNWaXNpYmxlQ2FjaGVkKHZpc2liaWxpdHlDYWNoZSwgbm9kZSk7IH0pXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vdEhpZGRlbklucHV0KG5vZGUpOyB9KTtcbn07XG5leHBvcnQgdmFyIGZpbHRlckF1dG9Gb2N1c2FibGUgPSBmdW5jdGlvbiAobm9kZXMsIGNhY2hlKSB7XG4gICAgaWYgKGNhY2hlID09PSB2b2lkIDApIHsgY2FjaGUgPSBuZXcgTWFwKCk7IH1cbiAgICByZXR1cm4gdG9BcnJheShub2RlcykuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBpc0F1dG9Gb2N1c0FsbG93ZWRDYWNoZWQoY2FjaGUsIG5vZGUpOyB9KTtcbn07XG4vKipcbiAqICFfX1dBUk5JTkdfXyEgTG93IGxldmVsIEFQSS5cbiAqIEByZXR1cm5zIGFsbCB0YWJiYWJsZSBub2Rlc1xuICpcbiAqIEBzZWUge0BsaW5rIGdldEZvY3VzYWJsZU5vZGVzfSB0byBnZXQgYW55IGZvY3VzYWJsZSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHRvcE5vZGVzIC0gYXJyYXkgb2YgdG9wIGxldmVsIEhUTUxFbGVtZW50cyB0byBzZWFyY2ggaW5zaWRlXG4gKiBAcGFyYW0gdmlzaWJpbGl0eUNhY2hlIC0gYW4gY2FjaGUgdG8gc3RvcmUgaW50ZXJtZWRpYXRlIG1lYXN1cmVtZW50cy4gRXhwZWN0ZWQgdG8gYmUgYSBmcmVzaCBgbmV3IE1hcGAgb24gZXZlcnkgY2FsbFxuICovXG5leHBvcnQgdmFyIGdldFRhYmJhYmxlTm9kZXMgPSBmdW5jdGlvbiAodG9wTm9kZXMsIHZpc2liaWxpdHlDYWNoZSwgd2l0aEd1YXJkcykge1xuICAgIHJldHVybiBvcmRlckJ5VGFiSW5kZXgoZmlsdGVyRm9jdXNhYmxlKGdldEZvY3VzYWJsZXModG9wTm9kZXMsIHdpdGhHdWFyZHMpLCB2aXNpYmlsaXR5Q2FjaGUpLCB0cnVlLCB3aXRoR3VhcmRzKTtcbn07XG4vKipcbiAqICFfX1dBUk5JTkdfXyEgTG93IGxldmVsIEFQSS5cbiAqXG4gKiBAcmV0dXJucyBhbnl0aGluZyBcImZvY3VzYWJsZVwiLCBub3Qgb25seSB0YWJiYWJsZS4gVGhlIGRpZmZlcmVuY2UgaXMgaW4gYHRhYkluZGV4PS0xYFxuICogKHdpdGhvdXQgZ3VhcmRzLCBhcyBsb25nIGFzIHRoZXkgYXJlIG5vdCBleHBlY3RlZCB0byBiZSBldmVyIGZvY3VzZWQpXG4gKlxuICogQHNlZSB7QGxpbmsgZ2V0VGFiYmFibGVOb2Rlc30gdG8gZ2V0IG9ubHkgdGFiYmxlIG5vZGVzIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gdG9wTm9kZXMgLSBhcnJheSBvZiB0b3AgbGV2ZWwgSFRNTEVsZW1lbnRzIHRvIHNlYXJjaCBpbnNpZGVcbiAqIEBwYXJhbSB2aXNpYmlsaXR5Q2FjaGUgLSBhbiBjYWNoZSB0byBzdG9yZSBpbnRlcm1lZGlhdGUgbWVhc3VyZW1lbnRzLiBFeHBlY3RlZCB0byBiZSBhIGZyZXNoIGBuZXcgTWFwYCBvbiBldmVyeSBjYWxsXG4gKi9cbmV4cG9ydCB2YXIgZ2V0Rm9jdXNhYmxlTm9kZXMgPSBmdW5jdGlvbiAodG9wTm9kZXMsIHZpc2liaWxpdHlDYWNoZSkge1xuICAgIHJldHVybiBvcmRlckJ5VGFiSW5kZXgoZmlsdGVyRm9jdXNhYmxlKGdldEZvY3VzYWJsZXModG9wTm9kZXMpLCB2aXNpYmlsaXR5Q2FjaGUpLCBmYWxzZSk7XG59O1xuLyoqXG4gKiByZXR1cm4gbGlzdCBvZiBub2RlcyB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gYmUgYXV0by1mb2N1c2VkXG4gKiBAcGFyYW0gdG9wTm9kZVxuICogQHBhcmFtIHZpc2liaWxpdHlDYWNoZVxuICovXG5leHBvcnQgdmFyIHBhcmVudEF1dG9mb2N1c2FibGVzID0gZnVuY3Rpb24gKHRvcE5vZGUsIHZpc2liaWxpdHlDYWNoZSkge1xuICAgIHJldHVybiBmaWx0ZXJGb2N1c2FibGUoZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXModG9wTm9kZSksIHZpc2liaWxpdHlDYWNoZSk7XG59O1xuLypcbiAqIERldGVybWluZXMgaWYgZWxlbWVudCBpcyBjb250YWluZWQgaW4gc2NvcGUsIGluY2x1ZGluZyBuZXN0ZWQgc2hhZG93IERPTXNcbiAqL1xuZXhwb3J0IHZhciBjb250YWlucyA9IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCkge1xuICAgIGlmIChzY29wZS5zaGFkb3dSb290KSB7XG4gICAgICAgIHJldHVybiBjb250YWlucyhzY29wZS5zaGFkb3dSb290LCBlbGVtZW50KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc2NvcGUpLmNvbnRhaW5zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihzY29wZSkuY29udGFpbnMuY2FsbChzY29wZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b0FycmF5KHNjb3BlLmNoaWxkcmVuKS5zb21lKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaWZyYW1lQm9keSA9IChfYSA9IGNoaWxkLmNvbnRlbnREb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJvZHk7XG4gICAgICAgICAgICAgICAgaWYgKGlmcmFtZUJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKGlmcmFtZUJvZHksIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbnMoY2hpbGQsIGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgRk9DVVNfRElTQUJMRUQsIEZPQ1VTX0dST1VQIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGFzQXJyYXksIHRvQXJyYXkgfSBmcm9tICcuL2FycmF5Jztcbi8qKlxuICogaW4gY2FzZSBvZiBtdWx0aXBsZSBub2RlcyBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXJcbiAqIGtlZXBzIG9ubHkgdG9wIG9uZXNcbiAqIHRoaXMgaXMgTyhubG9nbilcbiAqIEBwYXJhbSBub2Rlc1xuICogQHJldHVybnMgeyp9XG4gKi9cbnZhciBmaWx0ZXJOZXN0ZWQgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICB2YXIgY29udGFpbmVkID0gbmV3IFNldCgpO1xuICAgIHZhciBsID0gbm9kZXMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSArPSAxKSB7XG4gICAgICAgIGZvciAodmFyIGogPSBpICsgMTsgaiA8IGw7IGogKz0gMSkge1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gbm9kZXNbaV0uY29tcGFyZURvY3VtZW50UG9zaXRpb24obm9kZXNbal0pO1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuICAgICAgICAgICAgaWYgKChwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSA+IDApIHtcbiAgICAgICAgICAgICAgICBjb250YWluZWQuYWRkKGopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTlMpID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lZC5hZGQoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzLmZpbHRlcihmdW5jdGlvbiAoXywgaW5kZXgpIHsgcmV0dXJuICFjb250YWluZWQuaGFzKGluZGV4KTsgfSk7XG59O1xuLyoqXG4gKiBmaW5kcyB0b3AgbW9zdCBwYXJlbnQgZm9yIGEgbm9kZVxuICogQHBhcmFtIG5vZGVcbiAqIEByZXR1cm5zIHsqfVxuICovXG52YXIgZ2V0VG9wUGFyZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlID8gZ2V0VG9wUGFyZW50KG5vZGUucGFyZW50Tm9kZSkgOiBub2RlO1xufTtcbi8qKlxuICogcmV0dXJucyBhbGwgXCJmb2N1cyBjb250YWluZXJzXCIgaW5zaWRlIGEgZ2l2ZW4gbm9kZVxuICogQHBhcmFtIG5vZGUgLSBub2RlIG9yIG5vZGVzIHRvIGxvb2sgaW5zaWRlXG4gKiBAcmV0dXJucyBFbGVtZW50W11cbiAqL1xuZXhwb3J0IHZhciBnZXRBbGxBZmZlY3RlZE5vZGVzID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgbm9kZXMgPSBhc0FycmF5KG5vZGUpO1xuICAgIHJldHVybiBub2Rlcy5maWx0ZXIoQm9vbGVhbikucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGN1cnJlbnROb2RlKSB7XG4gICAgICAgIHZhciBncm91cCA9IGN1cnJlbnROb2RlLmdldEF0dHJpYnV0ZShGT0NVU19HUk9VUCk7XG4gICAgICAgIGFjYy5wdXNoLmFwcGx5KGFjYywgKGdyb3VwXG4gICAgICAgICAgICA/IGZpbHRlck5lc3RlZCh0b0FycmF5KGdldFRvcFBhcmVudChjdXJyZW50Tm9kZSkucXVlcnlTZWxlY3RvckFsbChcIltcIi5jb25jYXQoRk9DVVNfR1JPVVAsIFwiPVxcXCJcIikuY29uY2F0KGdyb3VwLCBcIlxcXCJdOm5vdChbXCIpLmNvbmNhdChGT0NVU19ESVNBQkxFRCwgXCI9XFxcImRpc2FibGVkXFxcIl0pXCIpKSkpXG4gICAgICAgICAgICA6IFtjdXJyZW50Tm9kZV0pKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG59O1xuIiwiLypcbklFMTEgc3VwcG9ydFxuICovXG5leHBvcnQgdmFyIHRvQXJyYXkgPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciByZXQgPSBBcnJheShhLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHJldFtpXSA9IGFbaV07XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59O1xuZXhwb3J0IHZhciBhc0FycmF5ID0gZnVuY3Rpb24gKGEpIHsgcmV0dXJuIChBcnJheS5pc0FycmF5KGEpID8gYSA6IFthXSk7IH07XG5leHBvcnQgdmFyIGdldEZpcnN0ID0gZnVuY3Rpb24gKGEpIHsgcmV0dXJuIChBcnJheS5pc0FycmF5KGEpID8gYVswXSA6IGEpOyB9O1xuIiwiaW1wb3J0IHsgZmlsdGVyQXV0b0ZvY3VzYWJsZSB9IGZyb20gJy4vRE9NdXRpbHMnO1xuaW1wb3J0IHsgcGlja0ZpcnN0Rm9jdXMgfSBmcm9tICcuL2ZpcnN0Rm9jdXMnO1xuaW1wb3J0IHsgZ2V0RGF0YXNldCB9IGZyb20gJy4vaXMnO1xudmFyIGZpbmRBdXRvRm9jdXNlZCA9IGZ1bmN0aW9uIChhdXRvRm9jdXNhYmxlcykge1xuICAgIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBhdXRvZm9jdXMgPSAoX2EgPSBnZXREYXRhc2V0KG5vZGUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXV0b2ZvY3VzO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIG5vZGUuYXV0b2ZvY3VzIHx8XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgKGF1dG9mb2N1cyAhPT0gdW5kZWZpbmVkICYmIGF1dG9mb2N1cyAhPT0gJ2ZhbHNlJykgfHxcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBhdXRvRm9jdXNhYmxlcy5pbmRleE9mKG5vZGUpID49IDApO1xuICAgIH07XG59O1xuZXhwb3J0IHZhciBwaWNrQXV0b2ZvY3VzID0gZnVuY3Rpb24gKG5vZGVzSW5kZXhlcywgb3JkZXJlZE5vZGVzLCBncm91cHMpIHtcbiAgICB2YXIgbm9kZXMgPSBub2Rlc0luZGV4ZXMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuICAgIHZhciBhdXRvRm9jdXNhYmxlID0gZmlsdGVyQXV0b0ZvY3VzYWJsZShub2Rlcy5maWx0ZXIoZmluZEF1dG9Gb2N1c2VkKGdyb3VwcykpKTtcbiAgICBpZiAoYXV0b0ZvY3VzYWJsZSAmJiBhdXRvRm9jdXNhYmxlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcGlja0ZpcnN0Rm9jdXMoYXV0b0ZvY3VzYWJsZSk7XG4gICAgfVxuICAgIHJldHVybiBwaWNrRmlyc3RGb2N1cyhmaWx0ZXJBdXRvRm9jdXNhYmxlKG9yZGVyZWROb2RlcykpO1xufTtcbiIsImltcG9ydCB7IGlzUmFkaW9FbGVtZW50IH0gZnJvbSAnLi9pcyc7XG52YXIgZmluZFNlbGVjdGVkUmFkaW8gPSBmdW5jdGlvbiAobm9kZSwgbm9kZXMpIHtcbiAgICByZXR1cm4gbm9kZXNcbiAgICAgICAgLmZpbHRlcihpc1JhZGlvRWxlbWVudClcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLm5hbWUgPT09IG5vZGUubmFtZTsgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLmNoZWNrZWQ7IH0pWzBdIHx8IG5vZGU7XG59O1xuZXhwb3J0IHZhciBjb3JyZWN0Tm9kZSA9IGZ1bmN0aW9uIChub2RlLCBub2Rlcykge1xuICAgIGlmIChpc1JhZGlvRWxlbWVudChub2RlKSAmJiBub2RlLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRTZWxlY3RlZFJhZGlvKG5vZGUsIG5vZGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59O1xuLyoqXG4gKiBnaXZpbmcgYSBzZXQgb2YgcmFkaW8gaW5wdXRzIGtlZXBzIG9ubHkgc2VsZWN0ZWQgKHRhYmJhYmxlKSBvbmVzXG4gKiBAcGFyYW0gbm9kZXNcbiAqL1xuZXhwb3J0IHZhciBjb3JyZWN0Tm9kZXMgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICAvLyBJRTExIGhhcyBubyBTZXQoYXJyYXkpIGNvbnN0cnVjdG9yXG4gICAgdmFyIHJlc3VsdFNldCA9IG5ldyBTZXQoKTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiByZXN1bHRTZXQuYWRkKGNvcnJlY3ROb2RlKG5vZGUsIG5vZGVzKSk7IH0pO1xuICAgIC8vIHVzaW5nIGZpbHRlciB0byBzdXBwb3J0IElFMTFcbiAgICByZXR1cm4gbm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiByZXN1bHRTZXQuaGFzKG5vZGUpOyB9KTtcbn07XG4iLCJpbXBvcnQgeyBjb3JyZWN0Tm9kZSB9IGZyb20gJy4vY29ycmVjdEZvY3VzJztcbmV4cG9ydCB2YXIgcGlja0ZpcnN0Rm9jdXMgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICBpZiAobm9kZXNbMF0gJiYgbm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gY29ycmVjdE5vZGUobm9kZXNbMF0sIG5vZGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzWzBdO1xufTtcbmV4cG9ydCB2YXIgcGlja0ZvY3VzYWJsZSA9IGZ1bmN0aW9uIChub2Rlcywgbm9kZSkge1xuICAgIHJldHVybiBub2Rlcy5pbmRleE9mKGNvcnJlY3ROb2RlKG5vZGUsIG5vZGVzKSk7XG59O1xuIiwiLyoqXG4gKiByZXR1cm5zIGFjdGl2ZSBlbGVtZW50IGZyb20gZG9jdW1lbnQgb3IgZnJvbSBuZXN0ZWQgc2hhZG93ZG9tc1xuICovXG5pbXBvcnQgeyBzYWZlUHJvYmUgfSBmcm9tICcuL3NhZmUnO1xuLyoqXG4gKiByZXR1cm5zIGN1cnJlbnQgYWN0aXZlIGVsZW1lbnQuIElmIHRoZSBhY3RpdmUgZWxlbWVudCBpcyBhIFwiY29udGFpbmVyXCIgaXRzZWxmKHNoYWRvd1Jvb3Qgb3IgaWZyYW1lKSByZXR1cm5zIGFjdGl2ZSBlbGVtZW50IGluc2lkZSBpdFxuICogQHBhcmFtIFtpbkRvY3VtZW50XVxuICovXG5leHBvcnQgdmFyIGdldEFjdGl2ZUVsZW1lbnQgPSBmdW5jdGlvbiAoaW5Eb2N1bWVudCkge1xuICAgIGlmIChpbkRvY3VtZW50ID09PSB2b2lkIDApIHsgaW5Eb2N1bWVudCA9IGRvY3VtZW50OyB9XG4gICAgaWYgKCFpbkRvY3VtZW50IHx8ICFpbkRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBpbkRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuIChhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3RcbiAgICAgICAgPyBnZXRBY3RpdmVFbGVtZW50KGFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdClcbiAgICAgICAgOiBhY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQgJiYgc2FmZVByb2JlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFjdGl2ZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudDsgfSlcbiAgICAgICAgICAgID8gZ2V0QWN0aXZlRWxlbWVudChhY3RpdmVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpXG4gICAgICAgICAgICA6IGFjdGl2ZUVsZW1lbnQpO1xufTtcbiIsImltcG9ydCB7IEZPQ1VTX05PX0FVVE9GT0NVUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG52YXIgaXNFbGVtZW50SGlkZGVuID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyB3ZSBjYW4gbWVhc3VyZSBvbmx5IFwiZWxlbWVudHNcIlxuICAgIC8vIGNvbnNpZGVyIG90aGVycyBhcyBcInZpc2libGVcIlxuICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgaWYgKCFjb21wdXRlZFN0eWxlIHx8ICFjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpID09PSAnbm9uZScgfHwgY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICdoaWRkZW4nKTtcbn07XG52YXIgZ2V0UGFyZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSBjYW4gYWxzbyBwb2ludCBvbiBTaGFkb3dSb290LiBJbiB0aGlzIGNhc2UgLmhvc3Qgd2lsbCBwb2ludCBvbiB0aGUgbmV4dCBub2RlXG4gICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZSAmJiBub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERVxuICAgICAgICA/IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBub2RlLnBhcmVudE5vZGUuaG9zdFxuICAgICAgICA6IG5vZGUucGFyZW50Tm9kZTtcbn07XG52YXIgaXNUb3BOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIG5vZGUgPT09IGRvY3VtZW50IHx8IChub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSk7XG59O1xudmFyIGlzSW5lcnQgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5oYXNBdHRyaWJ1dGUoJ2luZXJ0Jyk7IH07XG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Rlc3RpbmctbGlicmFyeS9qZXN0LWRvbS9ibG9iL21haW4vc3JjL3RvLWJlLXZpc2libGUuanNcbiAqL1xudmFyIGlzVmlzaWJsZVVuY2FjaGVkID0gZnVuY3Rpb24gKG5vZGUsIGNoZWNrUGFyZW50KSB7XG4gICAgcmV0dXJuICFub2RlIHx8IGlzVG9wTm9kZShub2RlKSB8fCAoIWlzRWxlbWVudEhpZGRlbihub2RlKSAmJiAhaXNJbmVydChub2RlKSAmJiBjaGVja1BhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKSk7XG59O1xuZXhwb3J0IHZhciBpc1Zpc2libGVDYWNoZWQgPSBmdW5jdGlvbiAodmlzaWJpbGl0eUNhY2hlLCBub2RlKSB7XG4gICAgdmFyIGNhY2hlZCA9IHZpc2liaWxpdHlDYWNoZS5nZXQobm9kZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBpc1Zpc2libGVVbmNhY2hlZChub2RlLCBpc1Zpc2libGVDYWNoZWQuYmluZCh1bmRlZmluZWQsIHZpc2liaWxpdHlDYWNoZSkpO1xuICAgIHZpc2liaWxpdHlDYWNoZS5zZXQobm9kZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBpc0F1dG9Gb2N1c0FsbG93ZWRVbmNhY2hlZCA9IGZ1bmN0aW9uIChub2RlLCBjaGVja1BhcmVudCkge1xuICAgIHJldHVybiBub2RlICYmICFpc1RvcE5vZGUobm9kZSkgPyAoaXNBdXRvRm9jdXNBbGxvd2VkKG5vZGUpID8gY2hlY2tQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSkgOiBmYWxzZSkgOiB0cnVlO1xufTtcbmV4cG9ydCB2YXIgaXNBdXRvRm9jdXNBbGxvd2VkQ2FjaGVkID0gZnVuY3Rpb24gKGNhY2hlLCBub2RlKSB7XG4gICAgdmFyIGNhY2hlZCA9IGNhY2hlLmdldChub2RlKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGlzQXV0b0ZvY3VzQWxsb3dlZFVuY2FjaGVkKG5vZGUsIGlzQXV0b0ZvY3VzQWxsb3dlZENhY2hlZC5iaW5kKHVuZGVmaW5lZCwgY2FjaGUpKTtcbiAgICBjYWNoZS5zZXQobm9kZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCB2YXIgZ2V0RGF0YXNldCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBub2RlLmRhdGFzZXQ7XG59O1xuZXhwb3J0IHZhciBpc0hUTUxCdXR0b25FbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ0JVVFRPTic7IH07XG5leHBvcnQgdmFyIGlzSFRNTElucHV0RWxlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdJTlBVVCc7IH07XG5leHBvcnQgdmFyIGlzUmFkaW9FbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gaXNIVE1MSW5wdXRFbGVtZW50KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ3JhZGlvJztcbn07XG5leHBvcnQgdmFyIG5vdEhpZGRlbklucHV0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gISgoaXNIVE1MSW5wdXRFbGVtZW50KG5vZGUpIHx8IGlzSFRNTEJ1dHRvbkVsZW1lbnQobm9kZSkpICYmIChub2RlLnR5cGUgPT09ICdoaWRkZW4nIHx8IG5vZGUuZGlzYWJsZWQpKTtcbn07XG5leHBvcnQgdmFyIGlzQXV0b0ZvY3VzQWxsb3dlZCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIGF0dHJpYnV0ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKEZPQ1VTX05PX0FVVE9GT0NVUyk7XG4gICAgcmV0dXJuICFbdHJ1ZSwgJ3RydWUnLCAnJ10uaW5jbHVkZXMoYXR0cmlidXRlKTtcbn07XG5leHBvcnQgdmFyIGlzR3VhcmQgPSBmdW5jdGlvbiAobm9kZSkgeyB2YXIgX2E7IHJldHVybiBCb29sZWFuKG5vZGUgJiYgKChfYSA9IGdldERhdGFzZXQobm9kZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb2N1c0d1YXJkKSk7IH07XG5leHBvcnQgdmFyIGlzTm90QUd1YXJkID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuICFpc0d1YXJkKG5vZGUpOyB9O1xuZXhwb3J0IHZhciBpc0RlZmluZWQgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4gQm9vbGVhbih4KTsgfTtcbiIsImltcG9ydCB7IHBhcmVudEF1dG9mb2N1c2FibGVzIH0gZnJvbSAnLi9ET011dGlscyc7XG5pbXBvcnQgeyBjb250YWlucyB9IGZyb20gJy4vRE9NdXRpbHMnO1xuaW1wb3J0IHsgYXNBcnJheSB9IGZyb20gJy4vYXJyYXknO1xudmFyIGdldFBhcmVudHMgPSBmdW5jdGlvbiAobm9kZSwgcGFyZW50cykge1xuICAgIGlmIChwYXJlbnRzID09PSB2b2lkIDApIHsgcGFyZW50cyA9IFtdOyB9XG4gICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgZ2V0UGFyZW50cyhub2RlLnBhcmVudE5vZGUuaG9zdCB8fCBub2RlLnBhcmVudE5vZGUsIHBhcmVudHMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50cztcbn07XG4vKipcbiAqIGZpbmRzIGEgcGFyZW50IGZvciBib3RoIG5vZGVBIGFuZCBub2RlQlxuICogQHBhcmFtIG5vZGVBXG4gKiBAcGFyYW0gbm9kZUJcbiAqIEByZXR1cm5zIHtib29sZWFufCp9XG4gKi9cbmV4cG9ydCB2YXIgZ2V0Q29tbW9uUGFyZW50ID0gZnVuY3Rpb24gKG5vZGVBLCBub2RlQikge1xuICAgIHZhciBwYXJlbnRzQSA9IGdldFBhcmVudHMobm9kZUEpO1xuICAgIHZhciBwYXJlbnRzQiA9IGdldFBhcmVudHMobm9kZUIpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRzQS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgY3VycmVudFBhcmVudCA9IHBhcmVudHNBW2ldO1xuICAgICAgICBpZiAocGFyZW50c0IuaW5kZXhPZihjdXJyZW50UGFyZW50KSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZXhwb3J0IHZhciBnZXRUb3BDb21tb25QYXJlbnQgPSBmdW5jdGlvbiAoYmFzZUFjdGl2ZUVsZW1lbnQsIGxlZnRFbnRyeSwgcmlnaHRFbnRyaWVzKSB7XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnRzID0gYXNBcnJheShiYXNlQWN0aXZlRWxlbWVudCk7XG4gICAgdmFyIGxlZnRFbnRyaWVzID0gYXNBcnJheShsZWZ0RW50cnkpO1xuICAgIHZhciBhY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudHNbMF07XG4gICAgdmFyIHRvcENvbW1vbiA9IGZhbHNlO1xuICAgIGxlZnRFbnRyaWVzLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICB0b3BDb21tb24gPSBnZXRDb21tb25QYXJlbnQodG9wQ29tbW9uIHx8IGVudHJ5LCBlbnRyeSkgfHwgdG9wQ29tbW9uO1xuICAgICAgICByaWdodEVudHJpZXMuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKHN1YkVudHJ5KSB7XG4gICAgICAgICAgICB2YXIgY29tbW9uID0gZ2V0Q29tbW9uUGFyZW50KGFjdGl2ZUVsZW1lbnQsIHN1YkVudHJ5KTtcbiAgICAgICAgICAgIGlmIChjb21tb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRvcENvbW1vbiB8fCBjb250YWlucyhjb21tb24sIHRvcENvbW1vbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9wQ29tbW9uID0gY29tbW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9wQ29tbW9uID0gZ2V0Q29tbW9uUGFyZW50KGNvbW1vbiwgdG9wQ29tbW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIFRPRE86IGFkZCBhc3NlcnQgaGVyZT9cbiAgICByZXR1cm4gdG9wQ29tbW9uO1xufTtcbi8qKlxuICogcmV0dXJuIGxpc3Qgb2Ygbm9kZXMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvIGJlIGF1dG9mb2N1c2VkIGluc2lkZSBhIGdpdmVuIHRvcCBub2Rlc1xuICogQHBhcmFtIGVudHJpZXNcbiAqIEBwYXJhbSB2aXNpYmlsaXR5Q2FjaGVcbiAqL1xuZXhwb3J0IHZhciBhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcyA9IGZ1bmN0aW9uIChlbnRyaWVzLCB2aXNpYmlsaXR5Q2FjaGUpIHtcbiAgICByZXR1cm4gZW50cmllcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgbm9kZSkgeyByZXR1cm4gYWNjLmNvbmNhdChwYXJlbnRBdXRvZm9jdXNhYmxlcyhub2RlLCB2aXNpYmlsaXR5Q2FjaGUpKTsgfSwgW10pO1xufTtcbiIsImV4cG9ydCB2YXIgc2FmZVByb2JlID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufTtcbiIsImltcG9ydCB7IHRvQXJyYXkgfSBmcm9tICcuL2FycmF5JztcbmV4cG9ydCB2YXIgdGFiU29ydCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGFUYWIgPSBNYXRoLm1heCgwLCBhLnRhYkluZGV4KTtcbiAgICB2YXIgYlRhYiA9IE1hdGgubWF4KDAsIGIudGFiSW5kZXgpO1xuICAgIHZhciB0YWJEaWZmID0gYVRhYiAtIGJUYWI7XG4gICAgdmFyIGluZGV4RGlmZiA9IGEuaW5kZXggLSBiLmluZGV4O1xuICAgIGlmICh0YWJEaWZmKSB7XG4gICAgICAgIGlmICghYVRhYikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFiVGFiKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhYkRpZmYgfHwgaW5kZXhEaWZmO1xufTtcbnZhciBnZXRUYWJJbmRleCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKG5vZGUudGFiSW5kZXggPCAwKSB7XG4gICAgICAgIC8vIGFsbCBcImZvY3VzYWJsZVwiIGVsZW1lbnRzIGFyZSBhbHJlYWR5IHByZXNlbGVjdGVkXG4gICAgICAgIC8vIGJ1dCBzb21lIG1pZ2h0IGhhdmUgaW1wbGljaXQgbmVnYXRpdmUgdGFiSW5kZXhcbiAgICAgICAgLy8gcmV0dXJuIDAgZm9yIDxhdWRpbyB3aXRob3V0IHRhYkluZGV4IGF0dHJpYnV0ZSAtIGl0IGlzIFwidGFiYmFibGVcIlxuICAgICAgICBpZiAoIW5vZGUuaGFzQXR0cmlidXRlKCd0YWJpbmRleCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZS50YWJJbmRleDtcbn07XG5leHBvcnQgdmFyIG9yZGVyQnlUYWJJbmRleCA9IGZ1bmN0aW9uIChub2RlcywgZmlsdGVyTmVnYXRpdmUsIGtlZXBHdWFyZHMpIHtcbiAgICByZXR1cm4gdG9BcnJheShub2RlcylcbiAgICAgICAgLm1hcChmdW5jdGlvbiAobm9kZSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHRhYkluZGV4ID0gZ2V0VGFiSW5kZXgobm9kZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgdGFiSW5kZXg6IGtlZXBHdWFyZHMgJiYgdGFiSW5kZXggPT09IC0xID8gKChub2RlLmRhdGFzZXQgfHwge30pLmZvY3VzR3VhcmQgPyAwIDogLTEpIDogdGFiSW5kZXgsXG4gICAgICAgIH07XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gIWZpbHRlck5lZ2F0aXZlIHx8IGRhdGEudGFiSW5kZXggPj0gMDsgfSlcbiAgICAgICAgLnNvcnQodGFiU29ydCk7XG59O1xuIiwiaW1wb3J0IHsgRk9DVVNfQVVUTyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5pbXBvcnQgeyB0YWJiYWJsZXMgfSBmcm9tICcuL3RhYmJhYmxlcyc7XG52YXIgcXVlcnlUYWJiYWJsZXMgPSB0YWJiYWJsZXMuam9pbignLCcpO1xudmFyIHF1ZXJ5R3VhcmRUYWJiYWJsZXMgPSBcIlwiLmNvbmNhdChxdWVyeVRhYmJhYmxlcywgXCIsIFtkYXRhLWZvY3VzLWd1YXJkXVwiKTtcbnZhciBnZXRGb2N1c2FibGVzV2l0aFNoYWRvd0RvbSA9IGZ1bmN0aW9uIChwYXJlbnQsIHdpdGhHdWFyZHMpIHtcbiAgICByZXR1cm4gdG9BcnJheSgocGFyZW50LnNoYWRvd1Jvb3QgfHwgcGFyZW50KS5jaGlsZHJlbikucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBhY2MuY29uY2F0KGNoaWxkLm1hdGNoZXMod2l0aEd1YXJkcyA/IHF1ZXJ5R3VhcmRUYWJiYWJsZXMgOiBxdWVyeVRhYmJhYmxlcykgPyBbY2hpbGRdIDogW10sIGdldEZvY3VzYWJsZXNXaXRoU2hhZG93RG9tKGNoaWxkKSk7XG4gICAgfSwgW10pO1xufTtcbnZhciBnZXRGb2N1c2FibGVzV2l0aElGcmFtZSA9IGZ1bmN0aW9uIChwYXJlbnQsIHdpdGhHdWFyZHMpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gY29udGVudERvY3VtZW50IG9mIGlmcmFtZSB3aWxsIGJlIG51bGwgaWYgY3VycmVudCBvcmlnaW4gY2Fubm90IGFjY2VzcyBpdFxuICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCAmJiAoKF9hID0gcGFyZW50LmNvbnRlbnREb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJvZHkpKSB7XG4gICAgICAgIHJldHVybiBnZXRGb2N1c2FibGVzKFtwYXJlbnQuY29udGVudERvY3VtZW50LmJvZHldLCB3aXRoR3VhcmRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFtwYXJlbnRdO1xufTtcbmV4cG9ydCB2YXIgZ2V0Rm9jdXNhYmxlcyA9IGZ1bmN0aW9uIChwYXJlbnRzLCB3aXRoR3VhcmRzKSB7XG4gICAgcmV0dXJuIHBhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBhcmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBmb2N1c2FibGVXaXRoU2hhZG93RG9tID0gZ2V0Rm9jdXNhYmxlc1dpdGhTaGFkb3dEb20ocGFyZW50LCB3aXRoR3VhcmRzKTtcbiAgICAgICAgdmFyIGZvY3VzYWJsZVdpdGhJZnJhbWVzID0gKF9hID0gW10pLmNvbmNhdC5hcHBseShfYSwgZm9jdXNhYmxlV2l0aFNoYWRvd0RvbS5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGdldEZvY3VzYWJsZXNXaXRoSUZyYW1lKG5vZGUsIHdpdGhHdWFyZHMpOyB9KSk7XG4gICAgICAgIHJldHVybiBhY2MuY29uY2F0KFxuICAgICAgICAvLyBhZGQgYWxsIHRhYmJhYmxlcyBpbnNpZGUgYW5kIHdpdGhpbiBzaGFkb3cgRE9NcyBpbiBET00gb3JkZXJcbiAgICAgICAgZm9jdXNhYmxlV2l0aElmcmFtZXMsIFxuICAgICAgICAvLyBhZGQgaWYgbm9kZSBpcyB0YWJiYWJsZSBpdHNlbGZcbiAgICAgICAgcGFyZW50LnBhcmVudE5vZGVcbiAgICAgICAgICAgID8gdG9BcnJheShwYXJlbnQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5VGFiYmFibGVzKSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlID09PSBwYXJlbnQ7IH0pXG4gICAgICAgICAgICA6IFtdKTtcbiAgICB9LCBbXSk7XG59O1xuLyoqXG4gKiByZXR1cm4gYSBsaXN0IG9mIGZvY3VzYWJsZSBub2RlcyB3aXRoaW4gYW4gYXJlYSBtYXJrZWQgYXMgXCJhdXRvLWZvY3VzYWJsZVwiXG4gKiBAcGFyYW0gcGFyZW50XG4gKi9cbmV4cG9ydCB2YXIgZ2V0UGFyZW50QXV0b2ZvY3VzYWJsZXMgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgdmFyIHBhcmVudEZvY3VzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIuY29uY2F0KEZPQ1VTX0FVVE8sIFwiXVwiKSk7XG4gICAgcmV0dXJuIHRvQXJyYXkocGFyZW50Rm9jdXMpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGdldEZvY3VzYWJsZXMoW25vZGVdKTsgfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBub2RlcykgeyByZXR1cm4gYWNjLmNvbmNhdChub2Rlcyk7IH0sIFtdKTtcbn07XG4iLCIvKipcbiAqIGxpc3Qgb2YgdGhlIG9iamVjdCB0byBiZSBjb25zaWRlcmVkIGFzIGZvY3VzYWJsZVxuICovXG5leHBvcnQgdmFyIHRhYmJhYmxlcyA9IFtcbiAgICAnYnV0dG9uOmVuYWJsZWQnLFxuICAgICdzZWxlY3Q6ZW5hYmxlZCcsXG4gICAgJ3RleHRhcmVhOmVuYWJsZWQnLFxuICAgICdpbnB1dDplbmFibGVkJyxcbiAgICAvLyBlbGVtZW50cyB3aXRoIGV4cGxpY2l0IHJvbGVzIHdpbGwgYWxzbyB1c2UgZXhwbGljaXQgdGFiaW5kZXhcbiAgICAvLyAnW3JvbGU9XCJidXR0b25cIl0nLFxuICAgICdhW2hyZWZdJyxcbiAgICAnYXJlYVtocmVmXScsXG4gICAgJ3N1bW1hcnknLFxuICAgICdpZnJhbWUnLFxuICAgICdvYmplY3QnLFxuICAgICdlbWJlZCcsXG4gICAgJ2F1ZGlvW2NvbnRyb2xzXScsXG4gICAgJ3ZpZGVvW2NvbnRyb2xzXScsXG4gICAgJ1t0YWJpbmRleF0nLFxuICAgICdbY29udGVudGVkaXRhYmxlXScsXG4gICAgJ1thdXRvZm9jdXNdJyxcbl07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMsIFZsYWRpbWlycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuXG5cbi8qKlxuICogZm9jdXMtb3V0bGluZS1tYW5hZ2VyXG4gKlxuICogV2F0Y2ggdXNlcnMga2V5Ym9hcmQgaW5wdXQgYW5kIG1hbmFnZSB0aGUgZm9jdXMgb3V0bGluZSB2aXNpYmlsaXR5XG4gKi9cblxuLyoqXG4gKiBUaGUgY2xhc3MgbmFtZSB0byBzZXQgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQuXG4gKiBAY29uc3RcbiAqL1xudmFyIENMQVNTX05BTUUgPSAnZm9jdXMtb3V0bGluZS1oaWRkZW4nO1xuXG4vKipcbiAqIFRoaXMgY2xhc3Mgc2V0cyBhIENTUyBjbGFzcyBuYW1lIG9uIHRoZSBIVE1MIGVsZW1lbnQgd2hlbiBhIHVzZXIgcHJlc3NlcyB0aGVcbiAqIHRhYiBrZXkuIEl0IHJlbW92ZXMgdGhlIGNsYXNzIG5hbWUgd2hlbiB0aGUgdXNlciBjbGlja3MgYW55d2hlcmUuXG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIENTUyBsaWtlIHRoaXM6XG4gKlxuICogaHRtbC5mb2N1cy1vdXRsaW5lLWhpZGRlbiAqOmZvY3VzIHtcbiAqICAgICBvdXRsaW5lOiBub25lO1xuICogfVxuICpcbiAqIEFuZCB0aGUgb3V0bGluZSB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIHVzZXIgdXNlcyB0aGUga2V5Ym9hcmQgdG8gZ2V0IHRvIGl0LlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBGb2N1c091dGxpbmVNYW5hZ2VyICgpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5mb2N1c0J5S2V5Ym9hcmQgPSB0cnVlO1xuICAgIH0sIHRydWUpO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5mb2N1c0J5S2V5Ym9hcmQgPSBmYWxzZTtcbiAgICB9LCB0cnVlKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IG9ubHkgd2hlbiBmb2N1cyBpcyBhY3R1YWxseSBjaGFuZ2VkLlxuICAgICAgICB0aGF0LnVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICB9LCB0cnVlKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuaGFzRm9jdXMoKSkge1xuICAgICAgICAgICAgICAgIHRoYXQuZm9jdXNCeUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGF0LnVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHkoKTtcbn1cblxuRm9jdXNPdXRsaW5lTWFuYWdlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBmb2N1cyBjaGFuZ2UgaXMgdHJpZ2dlcmVkIGJ5IFRBQiBrZXkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmb2N1c0J5S2V5Ym9hcmQ6IHRydWUsXG5cbiAgICB1cGRhdGVWaXNpYmlsaXR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaGlkZGVuID0gIXRoaXMuZm9jdXNCeUtleWJvYXJkO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBmb2N1cyBvdXRsaW5lIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgc2V0IGhpZGRlbihoaWRkZW4pIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRSwgaGlkZGVuKTtcbiAgICB9LFxuXG4gICAgZ2V0IGhpZGRlbigpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRSk7XG4gICAgfVxufTtcblxubmV3IEZvY3VzT3V0bGluZU1hbmFnZXIoKTtcbiIsInZhciBjdXJyZW50Tm9uY2U7XG5leHBvcnQgdmFyIHNldE5vbmNlID0gZnVuY3Rpb24gKG5vbmNlKSB7XG4gICAgY3VycmVudE5vbmNlID0gbm9uY2U7XG59O1xuZXhwb3J0IHZhciBnZXROb25jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY3VycmVudE5vbmNlKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9uY2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBfX3dlYnBhY2tfbm9uY2VfXztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuLyoqXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28hIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xudmFyIFJFQUNUX1NUQVRJQ1MgPSB7XG4gIGNoaWxkQ29udGV4dFR5cGVzOiB0cnVlLFxuICBjb250ZXh0VHlwZTogdHJ1ZSxcbiAgY29udGV4dFR5cGVzOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBnZXREZWZhdWx0UHJvcHM6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiB0cnVlLFxuICBtaXhpbnM6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBLTk9XTl9TVEFUSUNTID0ge1xuICBuYW1lOiB0cnVlLFxuICBsZW5ndGg6IHRydWUsXG4gIHByb3RvdHlwZTogdHJ1ZSxcbiAgY2FsbGVyOiB0cnVlLFxuICBjYWxsZWU6IHRydWUsXG4gIGFyZ3VtZW50czogdHJ1ZSxcbiAgYXJpdHk6IHRydWVcbn07XG52YXIgRk9SV0FSRF9SRUZfU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgcmVuZGVyOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWVcbn07XG52YXIgTUVNT19TVEFUSUNTID0ge1xuICAnJCR0eXBlb2YnOiB0cnVlLFxuICBjb21wYXJlOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgVFlQRV9TVEFUSUNTID0ge307XG5UWVBFX1NUQVRJQ1NbcmVhY3RJcy5Gb3J3YXJkUmVmXSA9IEZPUldBUkRfUkVGX1NUQVRJQ1M7XG5UWVBFX1NUQVRJQ1NbcmVhY3RJcy5NZW1vXSA9IE1FTU9fU1RBVElDUztcblxuZnVuY3Rpb24gZ2V0U3RhdGljcyhjb21wb25lbnQpIHtcbiAgLy8gUmVhY3QgdjE2LjExIGFuZCBiZWxvd1xuICBpZiAocmVhY3RJcy5pc01lbW8oY29tcG9uZW50KSkge1xuICAgIHJldHVybiBNRU1PX1NUQVRJQ1M7XG4gIH0gLy8gUmVhY3QgdjE2LjEyIGFuZCBhYm92ZVxuXG5cbiAgcmV0dXJuIFRZUEVfU1RBVElDU1tjb21wb25lbnRbJyQkdHlwZW9mJ11dIHx8IFJFQUNUX1NUQVRJQ1M7XG59XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xudmFyIG9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5mdW5jdGlvbiBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIHNvdXJjZUNvbXBvbmVudCwgYmxhY2tsaXN0KSB7XG4gIGlmICh0eXBlb2Ygc291cmNlQ29tcG9uZW50ICE9PSAnc3RyaW5nJykge1xuICAgIC8vIGRvbid0IGhvaXN0IG92ZXIgc3RyaW5nIChodG1sKSBjb21wb25lbnRzXG4gICAgaWYgKG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgdmFyIGluaGVyaXRlZENvbXBvbmVudCA9IGdldFByb3RvdHlwZU9mKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICAgIGlmIChpbmhlcml0ZWRDb21wb25lbnQgJiYgaW5oZXJpdGVkQ29tcG9uZW50ICE9PSBvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgICAgaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBpbmhlcml0ZWRDb21wb25lbnQsIGJsYWNrbGlzdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICBpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICBrZXlzID0ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZUNvbXBvbmVudCkpO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXRTdGF0aWNzID0gZ2V0U3RhdGljcyh0YXJnZXRDb21wb25lbnQpO1xuICAgIHZhciBzb3VyY2VTdGF0aWNzID0gZ2V0U3RhdGljcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKCFLTk9XTl9TVEFUSUNTW2tleV0gJiYgIShibGFja2xpc3QgJiYgYmxhY2tsaXN0W2tleV0pICYmICEoc291cmNlU3RhdGljcyAmJiBzb3VyY2VTdGF0aWNzW2tleV0pICYmICEodGFyZ2V0U3RhdGljcyAmJiB0YXJnZXRTdGF0aWNzW2tleV0pKSB7XG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZUNvbXBvbmVudCwga2V5KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEF2b2lkIGZhaWx1cmVzIGZyb20gcmVhZC1vbmx5IHByb3BlcnRpZXNcbiAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXRDb21wb25lbnQsIGtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldENvbXBvbmVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBob2lzdE5vblJlYWN0U3RhdGljcztcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQgZSBmcm9tXCJ2b2lkLWVsZW1lbnRzXCI7dmFyIHQ9L1xccyhbXidcIi9cXHM+PF0rPylbXFxzLz5dfChbXlxccz1dKyk9XFxzPyhcIi4qP1wifCcuKj8nKS9nO2Z1bmN0aW9uIG4obil7dmFyIHI9e3R5cGU6XCJ0YWdcIixuYW1lOlwiXCIsdm9pZEVsZW1lbnQ6ITEsYXR0cnM6e30sY2hpbGRyZW46W119LGk9bi5tYXRjaCgvPFxcLz8oW15cXHNdKz8pWy9cXHM+XS8pO2lmKGkmJihyLm5hbWU9aVsxXSwoZVtpWzFdXXx8XCIvXCI9PT1uLmNoYXJBdChuLmxlbmd0aC0yKSkmJihyLnZvaWRFbGVtZW50PSEwKSxyLm5hbWUuc3RhcnRzV2l0aChcIiEtLVwiKSkpe3ZhciBzPW4uaW5kZXhPZihcIi0tXFx4M2VcIik7cmV0dXJue3R5cGU6XCJjb21tZW50XCIsY29tbWVudDotMSE9PXM/bi5zbGljZSg0LHMpOlwiXCJ9fWZvcih2YXIgYT1uZXcgUmVnRXhwKHQpLGM9bnVsbDtudWxsIT09KGM9YS5leGVjKG4pKTspaWYoY1swXS50cmltKCkpaWYoY1sxXSl7dmFyIG89Y1sxXS50cmltKCksbD1bbyxcIlwiXTtvLmluZGV4T2YoXCI9XCIpPi0xJiYobD1vLnNwbGl0KFwiPVwiKSksci5hdHRyc1tsWzBdXT1sWzFdLGEubGFzdEluZGV4LS19ZWxzZSBjWzJdJiYoci5hdHRyc1tjWzJdXT1jWzNdLnRyaW0oKS5zdWJzdHJpbmcoMSxjWzNdLmxlbmd0aC0xKSk7cmV0dXJuIHJ9dmFyIHI9LzxbYS16QS1aMC05XFwtXFwhXFwvXSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXidcIj5dKSo+L2csaT0vXlxccyokLyxzPU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gYShlLHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2VcInRleHRcIjpyZXR1cm4gZSt0LmNvbnRlbnQ7Y2FzZVwidGFnXCI6cmV0dXJuIGUrPVwiPFwiK3QubmFtZSsodC5hdHRycz9mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gZSl0LnB1c2gobisnPVwiJytlW25dKydcIicpO3JldHVybiB0Lmxlbmd0aD9cIiBcIit0LmpvaW4oXCIgXCIpOlwiXCJ9KHQuYXR0cnMpOlwiXCIpKyh0LnZvaWRFbGVtZW50P1wiLz5cIjpcIj5cIiksdC52b2lkRWxlbWVudD9lOmUrdC5jaGlsZHJlbi5yZWR1Y2UoYSxcIlwiKStcIjwvXCIrdC5uYW1lK1wiPlwiO2Nhc2VcImNvbW1lbnRcIjpyZXR1cm4gZStcIlxceDNjIS0tXCIrdC5jb21tZW50K1wiLS1cXHgzZVwifX12YXIgYz17cGFyc2U6ZnVuY3Rpb24oZSx0KXt0fHwodD17fSksdC5jb21wb25lbnRzfHwodC5jb21wb25lbnRzPXMpO3ZhciBhLGM9W10sbz1bXSxsPS0xLG09ITE7aWYoMCE9PWUuaW5kZXhPZihcIjxcIikpe3ZhciB1PWUuaW5kZXhPZihcIjxcIik7Yy5wdXNoKHt0eXBlOlwidGV4dFwiLGNvbnRlbnQ6LTE9PT11P2U6ZS5zdWJzdHJpbmcoMCx1KX0pfXJldHVybiBlLnJlcGxhY2UocixmdW5jdGlvbihyLHMpe2lmKG0pe2lmKHIhPT1cIjwvXCIrYS5uYW1lK1wiPlwiKXJldHVybjttPSExfXZhciB1LGY9XCIvXCIhPT1yLmNoYXJBdCgxKSxoPXIuc3RhcnRzV2l0aChcIlxceDNjIS0tXCIpLHA9cytyLmxlbmd0aCxkPWUuY2hhckF0KHApO2lmKGgpe3ZhciB2PW4ocik7cmV0dXJuIGw8MD8oYy5wdXNoKHYpLGMpOigodT1vW2xdKS5jaGlsZHJlbi5wdXNoKHYpLGMpfWlmKGYmJihsKyssXCJ0YWdcIj09PShhPW4ocikpLnR5cGUmJnQuY29tcG9uZW50c1thLm5hbWVdJiYoYS50eXBlPVwiY29tcG9uZW50XCIsbT0hMCksYS52b2lkRWxlbWVudHx8bXx8IWR8fFwiPFwiPT09ZHx8YS5jaGlsZHJlbi5wdXNoKHt0eXBlOlwidGV4dFwiLGNvbnRlbnQ6ZS5zbGljZShwLGUuaW5kZXhPZihcIjxcIixwKSl9KSwwPT09bCYmYy5wdXNoKGEpLCh1PW9bbC0xXSkmJnUuY2hpbGRyZW4ucHVzaChhKSxvW2xdPWEpLCghZnx8YS52b2lkRWxlbWVudCkmJihsPi0xJiYoYS52b2lkRWxlbWVudHx8YS5uYW1lPT09ci5zbGljZSgyLC0xKSkmJihsLS0sYT0tMT09PWw/YzpvW2xdKSwhbSYmXCI8XCIhPT1kJiZkKSl7dT0tMT09PWw/YzpvW2xdLmNoaWxkcmVuO3ZhciB4PWUuaW5kZXhPZihcIjxcIixwKSxnPWUuc2xpY2UocCwtMT09PXg/dm9pZCAwOngpO2kudGVzdChnKSYmKGc9XCIgXCIpLCh4Pi0xJiZsK3UubGVuZ3RoPj0wfHxcIiBcIiE9PWcpJiZ1LnB1c2goe3R5cGU6XCJ0ZXh0XCIsY29udGVudDpnfSl9fSksY30sc3RyaW5naWZ5OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlK2EoXCJcIix0KX0sXCJcIil9fTtleHBvcnQgZGVmYXVsdCBjO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHRtbC1wYXJzZS1zdHJpbmdpZnkubW9kdWxlLmpzLm1hcFxuIiwiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICByZXN1bHQgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nID8gbmF0aXZlTWluKHJlc3VsdCwgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFmcmlrYWFucyBbYWZdXG4vLyEgYXV0aG9yIDogV2VybmVyIE1vbGxlbnR6ZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS93ZXJuZXJtXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgYWYgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhZicsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyaWVfRmVicnVhcmllX01hYXJ0X0FwcmlsX01laV9KdW5pZV9KdWxpZV9BdWd1c3R1c19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01ydF9BcHJfTWVpX0p1bl9KdWxfQXVnX1NlcF9Pa3RfTm92X0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTb25kYWdfTWFhbmRhZ19EaW5zZGFnX1dvZW5zZGFnX0RvbmRlcmRhZ19WcnlkYWdfU2F0ZXJkYWcnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTb25fTWFhX0Rpbl9Xb2VfRG9uX1ZyeV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTWFfRGlfV29fRG9fVnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC92bXxubS9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXm5tJC9pLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3ZtJyA6ICdWTSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ25tJyA6ICdOTSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVmFuZGFnIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW03DtHJlIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0dpc3RlciBvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFhc10gZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb29yICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBnZWxlZGUnLFxuICAgICAgICAgICAgczogXCInbiBwYWFyIHNla29uZGVzXCIsXG4gICAgICAgICAgICBzczogJyVkIHNla29uZGVzJyxcbiAgICAgICAgICAgIG06IFwiJ24gbWludXV0XCIsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZScsXG4gICAgICAgICAgICBoOiBcIiduIHV1clwiLFxuICAgICAgICAgICAgaGg6ICclZCB1cmUnLFxuICAgICAgICAgICAgZDogXCInbiBkYWdcIixcbiAgICAgICAgICAgIGRkOiAnJWQgZGFlJyxcbiAgICAgICAgICAgIE06IFwiJ24gbWFhbmRcIixcbiAgICAgICAgICAgIE1NOiAnJWQgbWFhbmRlJyxcbiAgICAgICAgICAgIHk6IFwiJ24gamFhclwiLFxuICAgICAgICAgICAgeXk6ICclZCBqYWFyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0ZXxkZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIG51bWJlciArXG4gICAgICAgICAgICAgICAgKG51bWJlciA9PT0gMSB8fCBudW1iZXIgPT09IDggfHwgbnVtYmVyID49IDIwID8gJ3N0ZScgOiAnZGUnKVxuICAgICAgICAgICAgKTsgLy8gVGhhbmtzIHRvIEpvcmlzIFLDtmxpbmcgOiBodHRwczovL2dpdGh1Yi5jb20vamp1cGl0ZXJcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNYWFuZGFnIGlzIGRpZSBlZXJzdGUgZGFnIHZhbiBkaWUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gRGllIHdlZWsgd2F0IGRpZSA0ZGUgSmFudWFyaWUgYmV2YXQgaXMgZGllIGVlcnN0ZSB3ZWVrIHZhbiBkaWUgamFhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhZjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKEFsZ2VyaWEpIFthci1kel1cbi8vISBhdXRob3IgOiBBbWluZSBSb3VraDogaHR0cHM6Ly9naXRodWIuY29tL0FtaW5lMjdcbi8vISBhdXRob3IgOiBBYmRlbCBTYWlkOiBodHRwczovL2dpdGh1Yi5jb20vYWJkZWxzYWlkXG4vLyEgYXV0aG9yIDogQWhtZWQgRWxraGF0aWJcbi8vISBhdXRob3IgOiBmb3JhYmkgaHR0cHM6Ly9naXRodWIuY29tL2ZvcmFiaVxuLy8hIGF1dGhvciA6IE5vdXJlZGRpbmUgTE9VQUhFREogOiBodHRwczovL2dpdGh1Yi5jb20vbm91cmVkZGluZW1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBwbHVyYWxGb3JtID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIHJldHVybiBuID09PSAwXG4gICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgOiBuID09PSAxXG4gICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgIDogbiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMFxuICAgICAgICAgICAgICAgICAgICAgID8gM1xuICAgICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAxMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyA0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IDU7XG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbHMgPSB7XG4gICAgICAgICAgICBzOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICfYq9in2YbZitipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2KvYp9mG2YrYqtin2YYnLCAn2KvYp9mG2YrYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KvZiNin2YYnLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAn2K/ZgtmK2YLYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iv2YLZitmC2KrYp9mGJywgJ9iv2YLZitmC2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJ9iz2KfYudipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2LPYp9i52KrYp9mGJywgJ9iz2KfYudiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDZitmI2YUnLFxuICAgICAgICAgICAgICAgICfZitmI2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2YrZiNmF2KfZhicsICfZitmI2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgTTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYtNmH2LEnLFxuICAgICAgICAgICAgICAgICfYtNmH2LEg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LTZh9ix2KfZhicsICfYtNmH2LHZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ix2KcnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LEnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHk6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LnYp9mFJyxcbiAgICAgICAgICAgICAgICAn2LnYp9mFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i52KfZhdin2YYnLCAn2LnYp9mF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i52YjYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxpemUgPSBmdW5jdGlvbiAodSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IHBsdXJhbEZvcm0obnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcGx1cmFsc1t1XVtwbHVyYWxGb3JtKG51bWJlcildO1xuICAgICAgICAgICAgICAgIGlmIChmID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0clt3aXRob3V0U3VmZml4ID8gMCA6IDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBtb250aHMgPSBbXG4gICAgICAgICAgICAn2KzYp9mG2YHZiicsXG4gICAgICAgICAgICAn2YHZitmB2LHZiicsXG4gICAgICAgICAgICAn2YXYp9ix2LMnLFxuICAgICAgICAgICAgJ9ij2YHYsdmK2YQnLFxuICAgICAgICAgICAgJ9mF2KfZiicsXG4gICAgICAgICAgICAn2KzZiNin2YYnLFxuICAgICAgICAgICAgJ9is2YjZitmE2YrYqScsXG4gICAgICAgICAgICAn2KPZiNiqJyxcbiAgICAgICAgICAgICfYs9io2KrZhdio2LEnLFxuICAgICAgICAgICAgJ9ij2YPYqtmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmB2YXYqNixJyxcbiAgICAgICAgICAgICfYr9mK2LPZhdio2LEnLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGFyRHogPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1keicsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QvXFx1MjAwRk0vXFx1MjAwRllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/Zi9inINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9io2LnYryAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgc3M6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBtbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGhoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgZGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICBNTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICB5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgICAgIHl5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJEejtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKEt1d2FpdCkgW2FyLWt3XVxuLy8hIGF1dGhvciA6IE51c3JldCBQYXJsYWs6IGh0dHBzOi8vZ2l0aHViLmNvbS9udXNyZXRwYXJsYWtcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBhckt3ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXIta3cnLCB7XG4gICAgICAgIG1vbnRoczogJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mKX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiNiyX9i62LTYql/YtNiq2YbYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YbYqNixX9iv2KzZhtio2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mKX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiNiyX9i62LTYql/YtNiq2YbYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YbYqNixX9iv2KzZhtio2LEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdiq2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYp9it2K9f2KfYqtmG2YrZhl/Yq9mE2KfYq9in2KFf2KfYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/YpyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogJ9ir2YjYp9mGJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTTogJ9i02YfYsScsXG4gICAgICAgICAgICBNTTogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHk6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXk6ICclZCDYs9mG2YjYp9iqJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJLdztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKExpYnlhKSBbYXItbHldXG4vLyEgYXV0aG9yIDogQWxpIEhtZXI6IGh0dHBzOi8vZ2l0aHViLmNvbS9raWtvYW5pc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICcxJyxcbiAgICAgICAgICAgIDI6ICcyJyxcbiAgICAgICAgICAgIDM6ICczJyxcbiAgICAgICAgICAgIDQ6ICc0JyxcbiAgICAgICAgICAgIDU6ICc1JyxcbiAgICAgICAgICAgIDY6ICc2JyxcbiAgICAgICAgICAgIDc6ICc3JyxcbiAgICAgICAgICAgIDg6ICc4JyxcbiAgICAgICAgICAgIDk6ICc5JyxcbiAgICAgICAgICAgIDA6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFsRm9ybSA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gbiA9PT0gMFxuICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgIDogbiA9PT0gMVxuICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICA6IG4gPT09IDJcbiAgICAgICAgICAgICAgICAgICAgPyAyXG4gICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAzICYmIG4gJSAxMDAgPD0gMTBcbiAgICAgICAgICAgICAgICAgICAgICA/IDNcbiAgICAgICAgICAgICAgICAgICAgICA6IG4gJSAxMDAgPj0gMTFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gNFxuICAgICAgICAgICAgICAgICAgICAgICAgOiA1O1xuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxzID0ge1xuICAgICAgICAgICAgczogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAn2KvYp9mG2YrYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9ir2KfZhtmK2KrYp9mGJywgJ9ir2KfZhtmK2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINir2YjYp9mGJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICAgICAgJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJ9iv2YLZitmC2Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYr9mC2YrZgtiq2KfZhicsICfYr9mC2YrZgtiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJyVkINiv2YLZitmC2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGg6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICfYs9in2LnYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iz2KfYudiq2KfZhicsICfYs9in2LnYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudipJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGQ6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2YrZiNmFJyxcbiAgICAgICAgICAgICAgICAn2YrZiNmFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9mK2YjZhdin2YYnLCAn2YrZiNmF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDZitmI2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIE06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAn2LTZh9ixINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i02YfYsdin2YYnLCAn2LTZh9ix2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICAgICAgJyVkINi02YfYsdinJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ixJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB5OiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINi52KfZhScsXG4gICAgICAgICAgICAgICAgJ9i52KfZhSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfYudin2YXYp9mGJywgJ9i52KfZhdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPYudmI2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDYudin2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFsaXplID0gZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGYgPSBwbHVyYWxGb3JtKG51bWJlciksXG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHBsdXJhbHNbdV1bcGx1cmFsRm9ybShudW1iZXIpXTtcbiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHJbd2l0aG91dFN1ZmZpeCA/IDAgOiAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9mK2YbYp9mK2LEnLFxuICAgICAgICAgICAgJ9mB2KjYsdin2YrYsScsXG4gICAgICAgICAgICAn2YXYp9ix2LMnLFxuICAgICAgICAgICAgJ9ij2KjYsdmK2YQnLFxuICAgICAgICAgICAgJ9mF2KfZitmIJyxcbiAgICAgICAgICAgICfZitmI2YbZitmIJyxcbiAgICAgICAgICAgICfZitmI2YTZitmIJyxcbiAgICAgICAgICAgICfYo9i62LPYt9izJyxcbiAgICAgICAgICAgICfYs9io2KrZhdio2LEnLFxuICAgICAgICAgICAgJ9ij2YPYqtmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmB2YXYqNixJyxcbiAgICAgICAgICAgICfYr9mK2LPZhdio2LEnLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGFyTHkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1seScsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QvXFx1MjAwRk0vXFx1MjAwRllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/Zi9inINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9io2LnYryAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgc3M6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBtbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGhoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgZGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICBNTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICB5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgICAgIHl5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJMeTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKE1vcm9jY28pIFthci1tYV1cbi8vISBhdXRob3IgOiBFbEZhZGlsaSBZYXNzaW5lIDogaHR0cHM6Ly9naXRodWIuY29tL0VsRmFkaWxpWVxuLy8hIGF1dGhvciA6IEFiZGVsIFNhaWQgOiBodHRwczovL2dpdGh1Yi5jb20vYWJkZWxzYWlkXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgYXJNYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLW1hJywge1xuICAgICAgICBtb250aHM6ICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZil/ZitmI2YbZitmIX9mK2YjZhNmK2YjYsl/Yuti02Kpf2LTYqtmG2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmG2KjYsV/Yr9is2YbYqNixJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZil/ZitmI2YbZitmIX9mK2YjZhNmK2YjYsl/Yuti02Kpf2LTYqtmG2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmG2KjYsV/Yr9is2YbYqNixJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KfYrdivX9in2KvZhtmK2YZf2KvZhNin2KvYp9ihX9in2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2Kcg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2YHZiiAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6ICfYq9mI2KfZhicsXG4gICAgICAgICAgICBzczogJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgbTogJ9iv2YLZitmC2KknLFxuICAgICAgICAgICAgbW06ICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgIGg6ICfYs9in2LnYqScsXG4gICAgICAgICAgICBoaDogJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgZDogJ9mK2YjZhScsXG4gICAgICAgICAgICBkZDogJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgIE06ICfYtNmH2LEnLFxuICAgICAgICAgICAgTU06ICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICB5OiAn2LPZhtipJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPZhtmI2KfYqicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhck1hO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoUGFsZXN0aW5lKSBbYXItcHNdXG4vLyEgYXV0aG9yIDogTWFqZCBBbC1TaGloYWJpIDogaHR0cHM6Ly9naXRodWIuY29tL21hamRhbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfZoScsXG4gICAgICAgICAgICAyOiAn2aInLFxuICAgICAgICAgICAgMzogJ9mjJyxcbiAgICAgICAgICAgIDQ6ICfZpCcsXG4gICAgICAgICAgICA1OiAn2aUnLFxuICAgICAgICAgICAgNjogJ9mmJyxcbiAgICAgICAgICAgIDc6ICfZpycsXG4gICAgICAgICAgICA4OiAn2agnLFxuICAgICAgICAgICAgOTogJ9mpJyxcbiAgICAgICAgICAgIDA6ICfZoCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfZoSc6ICcxJyxcbiAgICAgICAgICAgICfZoic6ICcyJyxcbiAgICAgICAgICAgICfZoyc6ICczJyxcbiAgICAgICAgICAgICfZpCc6ICc0JyxcbiAgICAgICAgICAgICfZpSc6ICc1JyxcbiAgICAgICAgICAgICfZpic6ICc2JyxcbiAgICAgICAgICAgICfZpyc6ICc3JyxcbiAgICAgICAgICAgICfZqCc6ICc4JyxcbiAgICAgICAgICAgICfZqSc6ICc5JyxcbiAgICAgICAgICAgICfZoCc6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBhclBzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXItcHMnLCB7XG4gICAgICAgIG1vbnRoczogJ9mD2KfZhtmI2YYg2KfZhNir2KfZhtmKX9i02KjYp9i3X9ii2LDYp9ixX9mG2YrYs9in2YZf2KPZitmR2KfYsV/Yrdiy2YrYsdin2YZf2KrZhdmR2YjYsl/YotioX9ij2YrZhNmI2YRf2KrYtNix2Yog2KfZhNij2YjZkdmEX9iq2LTYsdmK2YYg2KfZhNir2KfZhtmKX9mD2KfZhtmI2YYg2KfZhNij2YjZkdmEJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfZg9miX9i02KjYp9i3X9ii2LDYp9ixX9mG2YrYs9in2YZf2KPZitmR2KfYsV/Yrdiy2YrYsdin2YZf2KrZhdmR2YjYsl/YotioX9ij2YrZhNmI2YRf2KrZoV/YqtmiX9mD2aEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/YpyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogJ9ir2YjYp9mGJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTTogJ9i02YfYsScsXG4gICAgICAgICAgICBNTTogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHk6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXk6ICclZCDYs9mG2YjYp9iqJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9mj2aTZpdmm2afZqNmp2aBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnJykgLy8gcmV2ZXJzZWQgc2luY2UgbmVnYXRpdmUgbG9va2JlaGluZCBub3Qgc3VwcG9ydGVkIGV2ZXJ5d2hlcmVcbiAgICAgICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1vZodmiXSg/IVtcXHUwNjJhXFx1MDY0M10pL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJQcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKFNhdWRpIEFyYWJpYSkgW2FyLXNhXVxuLy8hIGF1dGhvciA6IFN1aGFpbCBBbGtvd2FpbGVldCA6IGh0dHBzOi8vZ2l0aHViLmNvbS94c29oXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ9mhJyxcbiAgICAgICAgICAgIDI6ICfZoicsXG4gICAgICAgICAgICAzOiAn2aMnLFxuICAgICAgICAgICAgNDogJ9mkJyxcbiAgICAgICAgICAgIDU6ICfZpScsXG4gICAgICAgICAgICA2OiAn2aYnLFxuICAgICAgICAgICAgNzogJ9mnJyxcbiAgICAgICAgICAgIDg6ICfZqCcsXG4gICAgICAgICAgICA5OiAn2aknLFxuICAgICAgICAgICAgMDogJ9mgJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAgICAgJ9miJzogJzInLFxuICAgICAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAgICAgJ9mlJzogJzUnLFxuICAgICAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAgICAgJ9moJzogJzgnLFxuICAgICAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAgICAgJ9mgJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGFyU2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1zYScsIHtcbiAgICAgICAgbW9udGhzOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2YrZiF/ZitmI2YbZitmIX9mK2YjZhNmK2Yhf2KPYutiz2LfYs1/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mK2Yhf2YrZiNmG2YrZiF/ZitmI2YTZitmIX9ij2LrYs9i32LNf2LPYqNiq2YXYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YHZhdio2LFf2K/Zitiz2YXYqNixJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/YpyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogJ9ir2YjYp9mGJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTTogJ9i02YfYsScsXG4gICAgICAgICAgICBNTTogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHk6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXk6ICclZCDYs9mG2YjYp9iqJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9mh2aLZo9mk2aXZptmn2ajZqdmgXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhclNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSAgOiAgQXJhYmljIChUdW5pc2lhKSBbYXItdG5dXG4vLyEgYXV0aG9yIDogTmFkZXIgVG91a2FicmkgOiBodHRwczovL2dpdGh1Yi5jb20vbmFkZXJpb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGFyVG4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci10bicsIHtcbiAgICAgICAgbW9udGhzOiAn2KzYp9mG2YHZil/ZgdmK2YHYsdmKX9mF2KfYsdizX9ij2YHYsdmK2YRf2YXYp9mKX9is2YjYp9mGX9is2YjZitmE2YrYqV/Yo9mI2Kpf2LPYqNiq2YXYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YHZhdio2LFf2K/Zitiz2YXYqNixJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfYrNin2YbZgdmKX9mB2YrZgdix2Ypf2YXYp9ix2LNf2KPZgdix2YrZhF/Zhdin2Ypf2KzZiNin2YZf2KzZiNmK2YTZitipX9ij2YjYql/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/YpyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogJ9ir2YjYp9mGJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTTogJ9i02YfYsScsXG4gICAgICAgICAgICBNTTogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHk6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXk6ICclZCDYs9mG2YjYp9iqJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyVG47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJhYmljIFthcl1cbi8vISBhdXRob3IgOiBBYmRlbCBTYWlkOiBodHRwczovL2dpdGh1Yi5jb20vYWJkZWxzYWlkXG4vLyEgYXV0aG9yIDogQWhtZWQgRWxraGF0aWJcbi8vISBhdXRob3IgOiBmb3JhYmkgaHR0cHM6Ly9naXRodWIuY29tL2ZvcmFiaVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfZoScsXG4gICAgICAgICAgICAyOiAn2aInLFxuICAgICAgICAgICAgMzogJ9mjJyxcbiAgICAgICAgICAgIDQ6ICfZpCcsXG4gICAgICAgICAgICA1OiAn2aUnLFxuICAgICAgICAgICAgNjogJ9mmJyxcbiAgICAgICAgICAgIDc6ICfZpycsXG4gICAgICAgICAgICA4OiAn2agnLFxuICAgICAgICAgICAgOTogJ9mpJyxcbiAgICAgICAgICAgIDA6ICfZoCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfZoSc6ICcxJyxcbiAgICAgICAgICAgICfZoic6ICcyJyxcbiAgICAgICAgICAgICfZoyc6ICczJyxcbiAgICAgICAgICAgICfZpCc6ICc0JyxcbiAgICAgICAgICAgICfZpSc6ICc1JyxcbiAgICAgICAgICAgICfZpic6ICc2JyxcbiAgICAgICAgICAgICfZpyc6ICc3JyxcbiAgICAgICAgICAgICfZqCc6ICc4JyxcbiAgICAgICAgICAgICfZqSc6ICc5JyxcbiAgICAgICAgICAgICfZoCc6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFsRm9ybSA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gbiA9PT0gMFxuICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgIDogbiA9PT0gMVxuICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICA6IG4gPT09IDJcbiAgICAgICAgICAgICAgICAgICAgPyAyXG4gICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAzICYmIG4gJSAxMDAgPD0gMTBcbiAgICAgICAgICAgICAgICAgICAgICA/IDNcbiAgICAgICAgICAgICAgICAgICAgICA6IG4gJSAxMDAgPj0gMTFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gNFxuICAgICAgICAgICAgICAgICAgICAgICAgOiA1O1xuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxzID0ge1xuICAgICAgICAgICAgczogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAn2KvYp9mG2YrYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9ir2KfZhtmK2KrYp9mGJywgJ9ir2KfZhtmK2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINir2YjYp9mGJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICAgICAgJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJ9iv2YLZitmC2Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYr9mC2YrZgtiq2KfZhicsICfYr9mC2YrZgtiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJyVkINiv2YLZitmC2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGg6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICfYs9in2LnYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iz2KfYudiq2KfZhicsICfYs9in2LnYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudipJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGQ6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2YrZiNmFJyxcbiAgICAgICAgICAgICAgICAn2YrZiNmFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9mK2YjZhdin2YYnLCAn2YrZiNmF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDZitmI2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIE06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAn2LTZh9ixINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i02YfYsdin2YYnLCAn2LTZh9ix2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICAgICAgJyVkINi02YfYsdinJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ixJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB5OiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINi52KfZhScsXG4gICAgICAgICAgICAgICAgJ9i52KfZhSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfYudin2YXYp9mGJywgJ9i52KfZhdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPYudmI2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDYudin2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFsaXplID0gZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGYgPSBwbHVyYWxGb3JtKG51bWJlciksXG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHBsdXJhbHNbdV1bcGx1cmFsRm9ybShudW1iZXIpXTtcbiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHJbd2l0aG91dFN1ZmZpeCA/IDAgOiAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9mK2YbYp9mK2LEnLFxuICAgICAgICAgICAgJ9mB2KjYsdin2YrYsScsXG4gICAgICAgICAgICAn2YXYp9ix2LMnLFxuICAgICAgICAgICAgJ9ij2KjYsdmK2YQnLFxuICAgICAgICAgICAgJ9mF2KfZitmIJyxcbiAgICAgICAgICAgICfZitmI2YbZitmIJyxcbiAgICAgICAgICAgICfZitmI2YTZitmIJyxcbiAgICAgICAgICAgICfYo9i62LPYt9izJyxcbiAgICAgICAgICAgICfYs9io2KrZhdio2LEnLFxuICAgICAgICAgICAgJ9ij2YPYqtmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmB2YXYqNixJyxcbiAgICAgICAgICAgICfYr9mK2LPZhdio2LEnLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGFyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXInLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9ij2K3Yr1/Ypdir2YbZitmGX9ir2YTYp9ir2KfYoV/Yo9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdEL1xcdTIwMEZNL1xcdTIwMEZZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LV82YUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i1JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZhSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2YvYpyDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfYqNi52K8gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiBwbHVyYWxpemUoJ3MnKSxcbiAgICAgICAgICAgIHNzOiBwbHVyYWxpemUoJ3MnKSxcbiAgICAgICAgICAgIG06IHBsdXJhbGl6ZSgnbScpLFxuICAgICAgICAgICAgbW06IHBsdXJhbGl6ZSgnbScpLFxuICAgICAgICAgICAgaDogcGx1cmFsaXplKCdoJyksXG4gICAgICAgICAgICBoaDogcGx1cmFsaXplKCdoJyksXG4gICAgICAgICAgICBkOiBwbHVyYWxpemUoJ2QnKSxcbiAgICAgICAgICAgIGRkOiBwbHVyYWxpemUoJ2QnKSxcbiAgICAgICAgICAgIE06IHBsdXJhbGl6ZSgnTScpLFxuICAgICAgICAgICAgTU06IHBsdXJhbGl6ZSgnTScpLFxuICAgICAgICAgICAgeTogcGx1cmFsaXplKCd5JyksXG4gICAgICAgICAgICB5eTogcGx1cmFsaXplKCd5JyksXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1vZodmi2aPZpNml2abZp9mo2anZoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDEyLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxMnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEF6ZXJiYWlqYW5pIFthel1cbi8vISBhdXRob3IgOiB0b3BjaGl5ZXYgOiBodHRwczovL2dpdGh1Yi5jb20vdG9wY2hpeWV2XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDE6ICctaW5jaScsXG4gICAgICAgIDU6ICctaW5jaScsXG4gICAgICAgIDg6ICctaW5jaScsXG4gICAgICAgIDcwOiAnLWluY2knLFxuICAgICAgICA4MDogJy1pbmNpJyxcbiAgICAgICAgMjogJy1uY2knLFxuICAgICAgICA3OiAnLW5jaScsXG4gICAgICAgIDIwOiAnLW5jaScsXG4gICAgICAgIDUwOiAnLW5jaScsXG4gICAgICAgIDM6ICctw7xuY8O8JyxcbiAgICAgICAgNDogJy3DvG5jw7wnLFxuICAgICAgICAxMDA6ICctw7xuY8O8JyxcbiAgICAgICAgNjogJy1uY8SxJyxcbiAgICAgICAgOTogJy11bmN1JyxcbiAgICAgICAgMTA6ICctdW5jdScsXG4gICAgICAgIDMwOiAnLXVuY3UnLFxuICAgICAgICA2MDogJy3EsW5jxLEnLFxuICAgICAgICA5MDogJy3EsW5jxLEnLFxuICAgIH07XG5cbiAgICB2YXIgYXogPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdheicsIHtcbiAgICAgICAgbW9udGhzOiAneWFudmFyX2ZldnJhbF9tYXJ0X2FwcmVsX21heV9peXVuX2l5dWxfYXZxdXN0X3NlbnR5YWJyX29rdHlhYnJfbm95YWJyX2Rla2Ficicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICd5YW5fZmV2X21hcl9hcHJfbWF5X2l5bl9peWxfYXZxX3Nlbl9va3Rfbm95X2Rlaycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnQmF6YXJfQmF6YXIgZXJ0yZlzaV/Dh8mZcsWfyZluYsmZIGF4xZ9hbcSxX8OHyZlyxZ/JmW5iyZlfQ8O8bcmZIGF4xZ9hbcSxX0PDvG3JmV/FnsmZbmLJmScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQmF6X0J6RV/Dh0F4X8OHyZlyX0NBeF9Dw7xtX8WeyZluJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0J6X0JFX8OHQV/Dh8mZX0NBX0PDvF/FnsmZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbYnVnw7xuIHNhYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc2FiYWggc2FhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbZ8mZbMmZbiBoyZlmdMmZXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2TDvG7JmW5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2tlw6fJmW4gaMmZZnTJmV0gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBzb25yYScsXG4gICAgICAgICAgICBwYXN0OiAnJXMgyZl2dsmZbCcsXG4gICAgICAgICAgICBzOiAnYmlyIG5lw6fJmSBzYW5pecmZJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2FuaXnJmScsXG4gICAgICAgICAgICBtOiAnYmlyIGTJmXFpccmZJyxcbiAgICAgICAgICAgIG1tOiAnJWQgZMmZcWlxyZknLFxuICAgICAgICAgICAgaDogJ2JpciBzYWF0JyxcbiAgICAgICAgICAgIGhoOiAnJWQgc2FhdCcsXG4gICAgICAgICAgICBkOiAnYmlyIGfDvG4nLFxuICAgICAgICAgICAgZGQ6ICclZCBnw7xuJyxcbiAgICAgICAgICAgIE06ICdiaXIgYXknLFxuICAgICAgICAgICAgTU06ICclZCBheScsXG4gICAgICAgICAgICB5OiAnYmlyIGlsJyxcbiAgICAgICAgICAgIHl5OiAnJWQgaWwnLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvZ2VjyZl8c8mZaMmZcnxnw7xuZMO8enxheMWfYW0vLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXihnw7xuZMO8enxheMWfYW0pJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2dlY8mZJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzyZloyZlyJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdnw7xuZMO8eic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnYXjFn2FtJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjEsW5jxLF8aW5jaXxuY2l8w7xuY8O8fG5jxLF8dW5jdSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB6ZXJvXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICctxLFuY8SxJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgYiA9IChudW1iZXIgJSAxMDApIC0gYSxcbiAgICAgICAgICAgICAgICBjID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdIHx8IHN1ZmZpeGVzW2NdKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF6O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJlbGFydXNpYW4gW2JlXVxuLy8hIGF1dGhvciA6IERtaXRyeSBEZW1pZG92IDogaHR0cHM6Ly9naXRodWIuY29tL2RlbWlkb3Y5MVxuLy8hIGF1dGhvcjogUHJhbGVza2E6IGh0dHA6Ly9wcmFsZXNrYS5wcm8vXG4vLyEgQXV0aG9yIDogTWVuZWxpb24gRWxlbnPDumxlIDogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHBsdXJhbCh3b3JkLCBudW0pIHtcbiAgICAgICAgdmFyIGZvcm1zID0gd29yZC5zcGxpdCgnXycpO1xuICAgICAgICByZXR1cm4gbnVtICUgMTAgPT09IDEgJiYgbnVtICUgMTAwICE9PSAxMVxuICAgICAgICAgICAgPyBmb3Jtc1swXVxuICAgICAgICAgICAgOiBudW0gJSAxMCA+PSAyICYmIG51bSAlIDEwIDw9IDQgJiYgKG51bSAlIDEwMCA8IDEwIHx8IG51bSAlIDEwMCA+PSAyMClcbiAgICAgICAgICAgICAgPyBmb3Jtc1sxXVxuICAgICAgICAgICAgICA6IGZvcm1zWzJdO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzczogd2l0aG91dFN1ZmZpeCA/ICfRgdC10LrRg9C90LTQsF/RgdC10LrRg9C90LTRi1/RgdC10LrRg9C90LQnIDogJ9GB0LXQutGD0L3QtNGDX9GB0LXQutGD0L3QtNGLX9GB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtbTogd2l0aG91dFN1ZmZpeCA/ICfRhdCy0ZbQu9GW0L3QsF/RhdCy0ZbQu9GW0L3Ri1/RhdCy0ZbQu9GW0L0nIDogJ9GF0LLRltC70ZbQvdGDX9GF0LLRltC70ZbQvdGLX9GF0LLRltC70ZbQvScsXG4gICAgICAgICAgICBoaDogd2l0aG91dFN1ZmZpeCA/ICfQs9Cw0LTQt9GW0L3QsF/Qs9Cw0LTQt9GW0L3Ri1/Qs9Cw0LTQt9GW0L0nIDogJ9Cz0LDQtNC30ZbQvdGDX9Cz0LDQtNC30ZbQvdGLX9Cz0LDQtNC30ZbQvScsXG4gICAgICAgICAgICBkZDogJ9C00LfQtdC90Yxf0LTQvdGWX9C00LfRkdC9JyxcbiAgICAgICAgICAgIE1NOiAn0LzQtdGB0Y/Rhl/QvNC10YHRj9GG0Ytf0LzQtdGB0Y/RhtCw0Z4nLFxuICAgICAgICAgICAgeXk6ICfQs9C+0LRf0LPQsNC00Ytf0LPQsNC00L7RnicsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChrZXkgPT09ICdtJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0YXQstGW0LvRltC90LAnIDogJ9GF0LLRltC70ZbQvdGDJztcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdoJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0LPQsNC00LfRltC90LAnIDogJ9Cz0LDQtNC30ZbQvdGDJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBwbHVyYWwoZm9ybWF0W2tleV0sICtudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYmUnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAn0YHRgtGD0LTQt9C10L3Rj1/Qu9GO0YLQsNCz0LBf0YHQsNC60LDQstGW0LrQsF/QutGA0LDRgdCw0LLRltC60LBf0YLRgNCw0Z7QvdGPX9GH0Y3RgNCy0LXQvdGPX9C70ZbQv9C10L3Rj1/QttC90ZbRntC90Y9f0LLQtdGA0LDRgdC90Y9f0LrQsNGB0YLRgNGL0YfQvdGW0LrQsF/Qu9GW0YHRgtCw0L/QsNC00LBf0YHQvdC10LbQvdGPJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfRgdGC0YPQtNC30LXQvdGMX9C70Y7RgtGLX9GB0LDQutCw0LLRltC6X9C60YDQsNGB0LDQstGW0Lpf0YLRgNCw0LLQtdC90Yxf0YfRjdGA0LLQtdC90Yxf0LvRltC/0LXQvdGMX9C20L3RltCy0LXQvdGMX9Cy0LXRgNCw0YHQtdC90Yxf0LrQsNGB0YLRgNGL0YfQvdGW0Lpf0LvRltGB0YLQsNC/0LDQtF/RgdC90LXQttCw0L3RjCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9GB0YLRg9C0X9C70Y7Rgl/RgdCw0Lpf0LrRgNCw0YFf0YLRgNCw0LJf0YfRjdGA0LJf0LvRltC/X9C20L3RltCyX9Cy0LXRgF/QutCw0YHRgl/Qu9GW0YHRgl/RgdC90LXQticuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9C90Y/QtNC30LXQu9GOX9C/0LDQvdGP0LTQt9C10LvQsNC6X9Cw0Z7RgtC+0YDQsNC6X9GB0LXRgNCw0LTRg1/Rh9Cw0YbQstC10YBf0L/Rj9GC0L3RltGG0YNf0YHRg9Cx0L7RgtGDJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfQvdGP0LTQt9C10LvRj1/Qv9Cw0L3Rj9C00LfQtdC70LDQul/QsNGe0YLQvtGA0LDQul/RgdC10YDQsNC00LBf0YfQsNGG0LLQtdGAX9C/0Y/RgtC90ZbRhtCwX9GB0YPQsdC+0YLQsCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL1xcWyA/W9Cj0YPRnl0gPyg/OtC80ZbQvdGD0LvRg9GOfNC90LDRgdGC0YPQv9C90YPRjik/ID9cXF0gP2RkZGQvLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0L3QtF/Qv9C9X9Cw0YJf0YHRgF/Rh9GGX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvdC0X9C/0L1f0LDRgl/RgdGAX9GH0YZf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZINCzLicsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDQsy4sIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSDQsy4sIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0KHRkdC90L3RjyDRnl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQl9Cw0Z7RgtGA0LAg0Z5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0KPRh9C+0YDQsCDRnl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1vQo10gZGRkZCBb0Z5dIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQoyDQvNGW0L3Rg9C70YPRjl0gZGRkZCBb0Z5dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CjINC80ZbQvdGD0LvRi10gZGRkZCBb0Z5dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQv9GA0LDQtyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0YLQsNC80YMnLFxuICAgICAgICAgICAgczogJ9C90LXQutCw0LvRjNC60ZYg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQ6ICfQtNC30LXQvdGMJyxcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgTTogJ9C80LXRgdGP0YYnLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5OiAn0LPQvtC0JyxcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0L3QvtGH0Yt80YDQsNC90ZbRhtGLfNC00L3Rj3zQstC10YfQsNGA0LAvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijQtNC90Y980LLQtdGH0LDRgNCwKSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQvdC+0YfRiyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YDQsNC90ZbRhtGLJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQtNC90Y8nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Cy0LXRh9Cw0YDQsCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0ZZ80Yt80LPQsCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChudW1iZXIgJSAxMCA9PT0gMiB8fCBudW1iZXIgJSAxMCA9PT0gMykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciAlIDEwMCAhPT0gMTIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciAlIDEwMCAhPT0gMTNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbnVtYmVyICsgJy3RlidcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVtYmVyICsgJy3Riyc7XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCz0LAnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBiZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCdWxnYXJpYW4gW2JnXVxuLy8hIGF1dGhvciA6IEtyYXNlbiBCb3Jpc292IDogaHR0cHM6Ly9naXRodWIuY29tL2tyYXpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBiZyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JnJywge1xuICAgICAgICBtb250aHM6ICfRj9C90YPQsNGA0Lhf0YTQtdCy0YDRg9Cw0YDQuF/QvNCw0YDRgl/QsNC/0YDQuNC7X9C80LDQuV/RjtC90Lhf0Y7Qu9C4X9Cw0LLQs9GD0YHRgl/RgdC10L/RgtC10LzQstGA0Lhf0L7QutGC0L7QvNCy0YDQuF/QvdC+0LXQvNCy0YDQuF/QtNC10LrQtdC80LLRgNC4Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9GP0L3Rg1/RhNC10LJf0LzQsNGAX9Cw0L/RgF/QvNCw0Llf0Y7QvdC4X9GO0LvQuF/QsNCy0LNf0YHQtdC/X9C+0LrRgl/QvdC+0LVf0LTQtdC6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9C90LXQtNC10LvRj1/Qv9C+0L3QtdC00LXQu9C90LjQul/QstGC0L7RgNC90LjQul/RgdGA0Y/QtNCwX9GH0LXRgtCy0YrRgNGC0YrQul/Qv9C10YLRitC6X9GB0YrQsdC+0YLQsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C90LXQtF/Qv9C+0L1f0LLRgtC+X9GB0YDRj1/Rh9C10YJf0L/QtdGCX9GB0YrQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvdC0X9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQlNC90LXRgSDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQo9GC0YDQtSDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvQsl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQktGH0LXRgNCwINCyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JzQuNC90LDQu9Cw0YLQsF0gZGRkZCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JzQuNC90LDQu9C40Y9dIGRkZGQgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0YHQu9C10LQgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9C/0YDQtdC00LggJXMnLFxuICAgICAgICAgICAgczogJ9C90Y/QutC+0LvQutC+INGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgbTogJ9C80LjQvdGD0YLQsCcsXG4gICAgICAgICAgICBtbTogJyVkINC80LjQvdGD0YLQuCcsXG4gICAgICAgICAgICBoOiAn0YfQsNGBJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YfQsNGB0LAnLFxuICAgICAgICAgICAgZDogJ9C00LXQvScsXG4gICAgICAgICAgICBkZDogJyVkINC00LXQvdCwJyxcbiAgICAgICAgICAgIHc6ICfRgdC10LTQvNC40YbQsCcsXG4gICAgICAgICAgICB3dzogJyVkINGB0LXQtNC80LjRhtC4JyxcbiAgICAgICAgICAgIE06ICfQvNC10YHQtdGGJyxcbiAgICAgICAgICAgIE1NOiAnJWQg0LzQtdGB0LXRhtCwJyxcbiAgICAgICAgICAgIHk6ICfQs9C+0LTQuNC90LAnLFxuICAgICAgICAgICAgeXk6ICclZCDQs9C+0LTQuNC90LgnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNC10LJ80LXQvXzRgtC4fNCy0Lh80YDQuHzQvNC4KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBsYXN0RGlnaXQgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBsYXN0MkRpZ2l0cyA9IG51bWJlciAlIDEwMDtcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QtdCyJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdDJEaWdpdHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QtdC9JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdDJEaWdpdHMgPiAxMCAmJiBsYXN0MkRpZ2l0cyA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0YLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCy0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgNC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSA3IHx8IGxhc3REaWdpdCA9PT0gOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC80LgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJnO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJhbWJhcmEgW2JtXVxuLy8hIGF1dGhvciA6IEVzdGVsbGUgQ29tbWVudCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9lc3RlbGxlY29tbWVudFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGJtID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYm0nLCB7XG4gICAgICAgIG1vbnRoczogJ1phbnd1eWVrYWxvX0Zld3VydXlla2Fsb19NYXJpc2lrYWxvX0F3aXJpbGlrYWxvX03Jm2thbG9fWnV3yZtua2Fsb19adWx1eWVrYWxvX1V0aWthbG9fU8mbdGFuYnVydWthbG9fyZRrdXTJlGJ1cnVrYWxvX05vd2FuYnVydWthbG9fRGVzYW5idXJ1a2Fsbycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdaYW5fRmV3X01hcl9Bd2lfTcmbX1p1d19adWxfVXRpX1PJm3RfyZRrdV9Ob3dfRGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0thcmlfTnTJm27Jm25fVGFyYXRhX0FyYWJhX0FsYW1pc2FfSnVtYV9TaWJpcmknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdLYXJfTnTJm19UYXJfQXJhX0FsYV9KdW1fU2liJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0thX050X1RhX0FyX0FsX0p1X1NpJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ01NTU0gW3RpbGVdIEQgW3Nhbl0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIFt0aWxlXSBEIFtzYW5dIFlZWVkgW2zJm3LJm10gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgTU1NTSBbdGlsZV0gRCBbc2FuXSBZWVlZIFtsyZtyyZtdIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQmkgbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1NpbmkgbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2RvbiBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS3VudSBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbdMmbbcmbbmVuIGzJm3LJm10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBryZRuyZQnLFxuICAgICAgICAgICAgcGFzdDogJ2EgYsmbICVzIGLJlCcsXG4gICAgICAgICAgICBzOiAnc2FuZ2EgZGFtYSBkYW1hJyxcbiAgICAgICAgICAgIHNzOiAnc2Vrb25kaSAlZCcsXG4gICAgICAgICAgICBtOiAnbWluaXRpIGtlbGVuJyxcbiAgICAgICAgICAgIG1tOiAnbWluaXRpICVkJyxcbiAgICAgICAgICAgIGg6ICdsyZtyyZsga2VsZW4nLFxuICAgICAgICAgICAgaGg6ICdsyZtyyZsgJWQnLFxuICAgICAgICAgICAgZDogJ3RpbGUga2VsZW4nLFxuICAgICAgICAgICAgZGQ6ICd0aWxlICVkJyxcbiAgICAgICAgICAgIE06ICdrYWxvIGtlbGVuJyxcbiAgICAgICAgICAgIE1NOiAna2FsbyAlZCcsXG4gICAgICAgICAgICB5OiAnc2FuIGtlbGVuJyxcbiAgICAgICAgICAgIHl5OiAnc2FuICVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJtO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJlbmdhbGkgKEJhbmdsYWRlc2gpIFtibi1iZF1cbi8vISBhdXRob3IgOiBBc3JhZiBIb3NzYWluIFBhdG9hcnkgOiBodHRwczovL2dpdGh1Yi5jb20vYXNod29vbGZvcmRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KenJyxcbiAgICAgICAgICAgIDI6ICfgp6gnLFxuICAgICAgICAgICAgMzogJ+CnqScsXG4gICAgICAgICAgICA0OiAn4KeqJyxcbiAgICAgICAgICAgIDU6ICfgp6snLFxuICAgICAgICAgICAgNjogJ+CnrCcsXG4gICAgICAgICAgICA3OiAn4KetJyxcbiAgICAgICAgICAgIDg6ICfgp64nLFxuICAgICAgICAgICAgOTogJ+CnrycsXG4gICAgICAgICAgICAwOiAn4KemJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Cnpyc6ICcxJyxcbiAgICAgICAgICAgICfgp6gnOiAnMicsXG4gICAgICAgICAgICAn4KepJzogJzMnLFxuICAgICAgICAgICAgJ+Cnqic6ICc0JyxcbiAgICAgICAgICAgICfgp6snOiAnNScsXG4gICAgICAgICAgICAn4KesJzogJzYnLFxuICAgICAgICAgICAgJ+CnrSc6ICc3JyxcbiAgICAgICAgICAgICfgp64nOiAnOCcsXG4gICAgICAgICAgICAn4KevJzogJzknLFxuICAgICAgICAgICAgJ+Cnpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBibkJkID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYm4tYmQnLCB7XG4gICAgICAgIG1vbnRoczogJ+CmnOCmvuCmqOCngeCnn+CmvuCmsOCmv1/gpqvgp4fgpqzgp43gprDgp4Hgp5/gpr7gprDgpr9f4Kau4Ka+4Kaw4KeN4KaaX+Cmj+CmquCnjeCmsOCmv+Cmsl/gpq7gp4df4Kac4KeB4KaoX+CmnOCngeCmsuCmvuCmh1/gpobgppfgprjgp43gpp9f4Ka44KeH4Kaq4KeN4Kaf4KeH4Kau4KeN4Kas4KawX+CmheCmleCnjeCmn+Cni+CmrOCmsF/gpqjgpq3gp4fgpq7gp43gpqzgprBf4Kah4Ka/4Ka44KeH4Kau4KeN4Kas4KawJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgppzgpr7gpqjgp4Ff4Kar4KeH4Kas4KeN4Kaw4KeBX+CmruCmvuCmsOCnjeCmml/gpo/gpqrgp43gprDgpr/gprJf4Kau4KeHX+CmnOCngeCmqF/gppzgp4HgprLgpr7gpodf4KaG4KaX4Ka44KeN4KafX+CmuOCnh+CmquCnjeCmn1/gpoXgppXgp43gpp/gp4tf4Kao4Kat4KeHX+CmoeCmv+CmuOCnhycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+CmsOCmrOCmv+CmrOCmvuCmsF/gprjgp4vgpq7gpqzgpr7gprBf4Kau4KaZ4KeN4KaX4Kay4Kas4Ka+4KawX+CmrOCngeCmp+CmrOCmvuCmsF/gpqzgp4Pgprngprjgp43gpqrgpqTgpr/gpqzgpr7gprBf4Ka24KeB4KaV4KeN4Kaw4Kas4Ka+4KawX+CmtuCmqOCmv+CmrOCmvuCmsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CmsOCmrOCmv1/gprjgp4vgpq5f4Kau4KaZ4KeN4KaX4KayX+CmrOCngeCmp1/gpqzgp4Pgprngprjgp43gpqrgpqTgpr9f4Ka24KeB4KaV4KeN4KawX+CmtuCmqOCmvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgprDgpqzgpr9f4Ka44KeL4KauX+CmruCmmeCnjeCml+Cmsl/gpqzgp4Hgpqdf4Kas4KeD4Ka5X+CmtuCngeCmleCnjeCmsF/gprbgpqjgpr8nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgprjgpq7gp58nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CmhuCmnF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpobgppfgpr7gpq7gp4DgppXgpr7gprJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgppfgpqTgppXgpr7gprJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+Cml+CmpF0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgpqrgprDgp4cnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCmhuCml+CnhycsXG4gICAgICAgICAgICBzOiAn4KaV4Kef4KeH4KaVIOCmuOCnh+CmleCnh+CmqOCnjeCmoScsXG4gICAgICAgICAgICBzczogJyVkIOCmuOCnh+CmleCnh+CmqOCnjeCmoScsXG4gICAgICAgICAgICBtOiAn4KaP4KaVIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBtbTogJyVkIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBoOiAn4KaP4KaVIOCmmOCmqOCnjeCmn+CmvicsXG4gICAgICAgICAgICBoaDogJyVkIOCmmOCmqOCnjeCmn+CmvicsXG4gICAgICAgICAgICBkOiAn4KaP4KaVIOCmpuCmv+CmqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCmpuCmv+CmqCcsXG4gICAgICAgICAgICBNOiAn4KaP4KaVIOCmruCmvuCmuCcsXG4gICAgICAgICAgICBNTTogJyVkIOCmruCmvuCmuCcsXG4gICAgICAgICAgICB5OiAn4KaP4KaVIOCmrOCmm+CmsCcsXG4gICAgICAgICAgICB5eTogJyVkIOCmrOCmm+CmsCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgp6fgp6jgp6ngp6rgp6vgp6zgp63gp67gp6/gp6ZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CmsOCmvuCmpHzgpq3gp4vgprB84Ka44KaV4Ka+4KayfOCmpuCngeCmquCngeCmsHzgpqzgpr/gppXgpr7gprJ84Ka44Kao4KeN4Kan4KeN4Kav4Ka+fOCmsOCmvuCmpC8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CmsOCmvuCmpCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CmreCni+CmsCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgprjgppXgpr7gprInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kam4KeB4Kaq4KeB4KawJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDMgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CmrOCmv+CmleCmvuCmsicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CmuOCmqOCnjeCmp+CnjeCmr+CmvicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmsOCmvuCmpCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCA2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpq3gp4vgprAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmuOCmleCmvuCmsic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kam4KeB4Kaq4KeB4KawJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpqzgpr/gppXgpr7gprInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmuOCmqOCnjeCmp+CnjeCmr+Cmvic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kaw4Ka+4KakJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJuQmQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQmVuZ2FsaSBbYm5dXG4vLyEgYXV0aG9yIDogS2F1c2hpayBHYW5kaGkgOiBodHRwczovL2dpdGh1Yi5jb20va2F1c2hpa2dhbmRoaVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgp6cnLFxuICAgICAgICAgICAgMjogJ+CnqCcsXG4gICAgICAgICAgICAzOiAn4KepJyxcbiAgICAgICAgICAgIDQ6ICfgp6onLFxuICAgICAgICAgICAgNTogJ+CnqycsXG4gICAgICAgICAgICA2OiAn4KesJyxcbiAgICAgICAgICAgIDc6ICfgp60nLFxuICAgICAgICAgICAgODogJ+CnricsXG4gICAgICAgICAgICA5OiAn4KevJyxcbiAgICAgICAgICAgIDA6ICfgp6YnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KenJzogJzEnLFxuICAgICAgICAgICAgJ+CnqCc6ICcyJyxcbiAgICAgICAgICAgICfgp6knOiAnMycsXG4gICAgICAgICAgICAn4KeqJzogJzQnLFxuICAgICAgICAgICAgJ+Cnqyc6ICc1JyxcbiAgICAgICAgICAgICfgp6wnOiAnNicsXG4gICAgICAgICAgICAn4KetJzogJzcnLFxuICAgICAgICAgICAgJ+Cnric6ICc4JyxcbiAgICAgICAgICAgICfgp68nOiAnOScsXG4gICAgICAgICAgICAn4KemJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGJuID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYm4nLCB7XG4gICAgICAgIG1vbnRoczogJ+CmnOCmvuCmqOCngeCnn+CmvuCmsOCmv1/gpqvgp4fgpqzgp43gprDgp4Hgp5/gpr7gprDgpr9f4Kau4Ka+4Kaw4KeN4KaaX+Cmj+CmquCnjeCmsOCmv+Cmsl/gpq7gp4df4Kac4KeB4KaoX+CmnOCngeCmsuCmvuCmh1/gpobgppfgprjgp43gpp9f4Ka44KeH4Kaq4KeN4Kaf4KeH4Kau4KeN4Kas4KawX+CmheCmleCnjeCmn+Cni+CmrOCmsF/gpqjgpq3gp4fgpq7gp43gpqzgprBf4Kah4Ka/4Ka44KeH4Kau4KeN4Kas4KawJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgppzgpr7gpqjgp4Ff4Kar4KeH4Kas4KeN4Kaw4KeBX+CmruCmvuCmsOCnjeCmml/gpo/gpqrgp43gprDgpr/gprJf4Kau4KeHX+CmnOCngeCmqF/gppzgp4HgprLgpr7gpodf4KaG4KaX4Ka44KeN4KafX+CmuOCnh+CmquCnjeCmn1/gpoXgppXgp43gpp/gp4tf4Kao4Kat4KeHX+CmoeCmv+CmuOCnhycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+CmsOCmrOCmv+CmrOCmvuCmsF/gprjgp4vgpq7gpqzgpr7gprBf4Kau4KaZ4KeN4KaX4Kay4Kas4Ka+4KawX+CmrOCngeCmp+CmrOCmvuCmsF/gpqzgp4Pgprngprjgp43gpqrgpqTgpr/gpqzgpr7gprBf4Ka24KeB4KaV4KeN4Kaw4Kas4Ka+4KawX+CmtuCmqOCmv+CmrOCmvuCmsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CmsOCmrOCmv1/gprjgp4vgpq5f4Kau4KaZ4KeN4KaX4KayX+CmrOCngeCmp1/gpqzgp4Pgprngprjgp43gpqrgpqTgpr9f4Ka24KeB4KaV4KeN4KawX+CmtuCmqOCmvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgprDgpqzgpr9f4Ka44KeL4KauX+CmruCmmeCnjeCml+Cmsl/gpqzgp4Hgpqdf4Kas4KeD4Ka5X+CmtuCngeCmleCnjeCmsF/gprbgpqjgpr8nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgprjgpq7gp58nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CmhuCmnF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpobgppfgpr7gpq7gp4DgppXgpr7gprJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgppfgpqTgppXgpr7gprJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+Cml+CmpF0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgpqrgprDgp4cnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCmhuCml+CnhycsXG4gICAgICAgICAgICBzOiAn4KaV4Kef4KeH4KaVIOCmuOCnh+CmleCnh+CmqOCnjeCmoScsXG4gICAgICAgICAgICBzczogJyVkIOCmuOCnh+CmleCnh+CmqOCnjeCmoScsXG4gICAgICAgICAgICBtOiAn4KaP4KaVIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBtbTogJyVkIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBoOiAn4KaP4KaVIOCmmOCmqOCnjeCmn+CmvicsXG4gICAgICAgICAgICBoaDogJyVkIOCmmOCmqOCnjeCmn+CmvicsXG4gICAgICAgICAgICBkOiAn4KaP4KaVIOCmpuCmv+CmqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCmpuCmv+CmqCcsXG4gICAgICAgICAgICBNOiAn4KaP4KaVIOCmruCmvuCmuCcsXG4gICAgICAgICAgICBNTTogJyVkIOCmruCmvuCmuCcsXG4gICAgICAgICAgICB5OiAn4KaP4KaVIOCmrOCmm+CmsCcsXG4gICAgICAgICAgICB5eTogJyVkIOCmrOCmm+CmsCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgp6fgp6jgp6ngp6rgp6vgp6zgp63gp67gp6/gp6ZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gprDgpr7gpqR84Ka44KaV4Ka+4KayfOCmpuCngeCmquCngeCmsHzgpqzgpr/gppXgpr7gprJ84Kaw4Ka+4KakLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+CmsOCmvuCmpCcgJiYgaG91ciA+PSA0KSB8fFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+CmpuCngeCmquCngeCmsCcgJiYgaG91ciA8IDUpIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgpqzgpr/gppXgpr7gprInXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kaw4Ka+4KakJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprjgppXgpr7gprInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmpuCngeCmquCngeCmsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kas4Ka/4KaV4Ka+4KayJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprDgpr7gpqQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYm47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGliZXRhbiBbYm9dXG4vLyEgYXV0aG9yIDogVGh1cHRlbiBOLiBDaGFrcmlzaGFyIDogaHR0cHM6Ly9naXRodWIuY29tL3ZhanJhZG9nXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+C8oScsXG4gICAgICAgICAgICAyOiAn4LyiJyxcbiAgICAgICAgICAgIDM6ICfgvKMnLFxuICAgICAgICAgICAgNDogJ+C8pCcsXG4gICAgICAgICAgICA1OiAn4LylJyxcbiAgICAgICAgICAgIDY6ICfgvKYnLFxuICAgICAgICAgICAgNzogJ+C8pycsXG4gICAgICAgICAgICA4OiAn4LyoJyxcbiAgICAgICAgICAgIDk6ICfgvKknLFxuICAgICAgICAgICAgMDogJ+C8oCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgvKEnOiAnMScsXG4gICAgICAgICAgICAn4LyiJzogJzInLFxuICAgICAgICAgICAgJ+C8oyc6ICczJyxcbiAgICAgICAgICAgICfgvKQnOiAnNCcsXG4gICAgICAgICAgICAn4LylJzogJzUnLFxuICAgICAgICAgICAgJ+C8pic6ICc2JyxcbiAgICAgICAgICAgICfgvKcnOiAnNycsXG4gICAgICAgICAgICAn4LyoJzogJzgnLFxuICAgICAgICAgICAgJ+C8qSc6ICc5JyxcbiAgICAgICAgICAgICfgvKAnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgYm8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdibycsIHtcbiAgICAgICAgbW9udGhzOiAn4L2f4L6z4LyL4L2W4LyL4L2R4L2E4LyL4L2U4L28X+C9n+C+s+C8i+C9luC8i+C9guC9ieC9suC9puC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvYLgvabgvbTgvZjgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2e4L2y4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9o+C+lOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZHgvrLgvbTgvYLgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2R4L204L2T4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9ouC+kuC+seC9keC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZHgvYLgvbTgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2F4L204LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9heC9tOC8i+C9guC9heC9suC9guC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvYXgvbTgvIvgvYLgvYngvbLgvabgvIvgvZQnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+C9n+C+s+C8izFf4L2f4L6z4LyLMl/gvZ/gvrPgvIszX+C9n+C+s+C8izRf4L2f4L6z4LyLNV/gvZ/gvrPgvIs2X+C9n+C+s+C8izdf4L2f4L6z4LyLOF/gvZ/gvrPgvIs5X+C9n+C+s+C8izEwX+C9n+C+s+C8izExX+C9n+C+s+C8izEyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IC9eKOC9n+C+s+C8i1xcZHsxLDJ9KS8sXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ+C9guC9n+C9oOC8i+C9ieC9suC8i+C9mOC8i1/gvYLgvZ/gvaDgvIvgvZ/gvrPgvIvgvZbgvItf4L2C4L2f4L2g4LyL4L2Y4L2y4L2C4LyL4L2R4L2Y4L2i4LyLX+C9guC9n+C9oOC8i+C9o+C+t+C9guC8i+C9lOC8i1/gvYLgvZ/gvaDgvIvgvZXgvbTgvaLgvIvgvZbgvbRf4L2C4L2f4L2g4LyL4L2U4LyL4L2m4L2E4L2m4LyLX+C9guC9n+C9oOC8i+C9puC+pOC9uuC9k+C8i+C9lOC8iycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4L2J4L2y4LyL4L2Y4LyLX+C9n+C+s+C8i+C9luC8i1/gvZjgvbLgvYLgvIvgvZHgvZjgvaLgvItf4L2j4L634L2C4LyL4L2U4LyLX+C9leC9tOC9ouC8i+C9luC9tF/gvZTgvIvgvabgvYTgvabgvItf4L2m4L6k4L264L2T4LyL4L2U4LyLJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+C9ieC9sl/gvZ/gvrNf4L2Y4L2y4L2CX+C9o+C+t+C9gl/gvZXgvbTgvaJf4L2m4L2E4L2mX+C9puC+pOC9uuC9kycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgvZHgvbLgvIvgvaLgvbLgvYRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4L2m4L2E4LyL4L2J4L2y4L2TXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vgvZbgvZHgvbTgvZPgvIvgvZXgvrLgvYLgvIvgvaLgvpfgvbrgvabgvIvgvZhdLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C9geC8i+C9puC9hF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4L2W4L2R4L204L2T4LyL4L2V4L6y4L2C4LyL4L2Y4L2Q4L2g4LyL4L2YXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOC9o+C8iycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4L2m4L6U4L2T4LyL4L2jJyxcbiAgICAgICAgICAgIHM6ICfgvaPgvZjgvIvgvabgvYQnLFxuICAgICAgICAgICAgc3M6ICclZCDgvabgvpDgvaLgvIvgvYbgvI0nLFxuICAgICAgICAgICAgbTogJ+C9puC+kOC9ouC8i+C9mOC8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICBtbTogJyVkIOC9puC+kOC9ouC8i+C9mCcsXG4gICAgICAgICAgICBoOiAn4L2G4L204LyL4L2a4L284L2R4LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4L2G4L204LyL4L2a4L284L2RJyxcbiAgICAgICAgICAgIGQ6ICfgvYngvbLgvZPgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgZGQ6ICclZCDgvYngvbLgvZPgvIsnLFxuICAgICAgICAgICAgTTogJ+C9n+C+s+C8i+C9luC8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICBNTTogJyVkIOC9n+C+s+C8i+C9licsXG4gICAgICAgICAgICB5OiAn4L2j4L284LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4L2j4L28JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+C8oeC8ouC8o+C8pOC8peC8puC8p+C8qOC8qeC8oF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C9mOC9muC9k+C8i+C9mOC9vHzgvZ7gvbzgvYLgvabgvIvgvYDgvaZ84L2J4L2y4L2T4LyL4L2C4L204L2EfOC9keC9guC9vOC9hOC8i+C9keC9gnzgvZjgvZrgvZPgvIvgvZjgvbwvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKG1lcmlkaWVtID09PSAn4L2Y4L2a4L2T4LyL4L2Y4L28JyAmJiBob3VyID49IDQpIHx8XG4gICAgICAgICAgICAgICAgKG1lcmlkaWVtID09PSAn4L2J4L2y4L2T4LyL4L2C4L204L2EJyAmJiBob3VyIDwgNSkgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+C9keC9guC9vOC9hOC8i+C9keC9gidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvZjgvZrgvZPgvIvgvZjgvbwnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9nuC9vOC9guC9puC8i+C9gOC9pic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2J4L2y4L2T4LyL4L2C4L204L2EJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvZHgvYLgvbzgvYTgvIvgvZHgvYInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9mOC9muC9k+C8i+C9mOC9vCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBibztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCcmV0b24gW2JyXVxuLy8hIGF1dGhvciA6IEplYW4tQmFwdGlzdGUgTGUgRHVpZ291IDogaHR0cHM6Ly9naXRodWIuY29tL2pibGVkdWlnb3VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbihudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgbW06ICdtdW51dGVubicsXG4gICAgICAgICAgICBNTTogJ21peicsXG4gICAgICAgICAgICBkZDogJ2RldmV6aCcsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBtdXRhdGlvbihmb3JtYXRba2V5XSwgbnVtYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3BlY2lhbE11dGF0aW9uRm9yWWVhcnMobnVtYmVyKSB7XG4gICAgICAgIHN3aXRjaCAobGFzdE51bWJlcihudW1iZXIpKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgYmxvYXonO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyB2bG9heic7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbGFzdE51bWJlcihudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA+IDkpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXN0TnVtYmVyKG51bWJlciAlIDEwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtdXRhdGlvbih0ZXh0LCBudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIHNvZnRNdXRhdGlvbih0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgZnVuY3Rpb24gc29mdE11dGF0aW9uKHRleHQpIHtcbiAgICAgICAgdmFyIG11dGF0aW9uVGFibGUgPSB7XG4gICAgICAgICAgICBtOiAndicsXG4gICAgICAgICAgICBiOiAndicsXG4gICAgICAgICAgICBkOiAneicsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChtdXRhdGlvblRhYmxlW3RleHQuY2hhckF0KDApXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXV0YXRpb25UYWJsZVt0ZXh0LmNoYXJBdCgwKV0gKyB0ZXh0LnN1YnN0cmluZygxKTtcbiAgICB9XG5cbiAgICB2YXIgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmdlbi9pLFxuICAgICAgICAgICAgL15jW8q8XFwnXWh3ZS9pLFxuICAgICAgICAgICAgL15tZXUvaSxcbiAgICAgICAgICAgIC9eZWJyL2ksXG4gICAgICAgICAgICAvXm1hZS9pLFxuICAgICAgICAgICAgL14obWV6fGV2ZSkvaSxcbiAgICAgICAgICAgIC9eZ291L2ksXG4gICAgICAgICAgICAvXmVvcy9pLFxuICAgICAgICAgICAgL15nd2UvaSxcbiAgICAgICAgICAgIC9eaGVyL2ksXG4gICAgICAgICAgICAvXmR1L2ksXG4gICAgICAgICAgICAvXmtlci9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihnZW52ZXJ8Y1vKvFxcJ11od2V2cmVyfG1ldXJ6aHxlYnJlbHxtYWV8bWV6aGV2ZW58Z291ZXJlfGVvc3R8Z3dlbmdvbG98aGVyZXxkdXxrZXJ6dXxnZW58Y1vKvFxcJ11od2V8bWV1fGVicnxtYWV8ZXZlfGdvdXxlb3N8Z3dlfGhlcnxkdXxrZXIpL2ksXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4ID1cbiAgICAgICAgICAgIC9eKGdlbnZlcnxjW8q8XFwnXWh3ZXZyZXJ8bWV1cnpofGVicmVsfG1hZXxtZXpoZXZlbnxnb3VlcmV8ZW9zdHxnd2VuZ29sb3xoZXJlfGR1fGtlcnp1KS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4ID1cbiAgICAgICAgICAgIC9eKGdlbnxjW8q8XFwnXWh3ZXxtZXV8ZWJyfG1hZXxldmV8Z291fGVvc3xnd2V8aGVyfGR1fGtlcikvaSxcbiAgICAgICAgZnVsbFdlZWtkYXlzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXnN1bC9pLFxuICAgICAgICAgICAgL15sdW4vaSxcbiAgICAgICAgICAgIC9ebWV1cnpoL2ksXG4gICAgICAgICAgICAvXm1lcmNbyrxcXCddaGVyL2ksXG4gICAgICAgICAgICAvXnlhb3UvaSxcbiAgICAgICAgICAgIC9eZ3dlbmVyL2ksXG4gICAgICAgICAgICAvXnNhZG9ybi9pLFxuICAgICAgICBdLFxuICAgICAgICBzaG9ydFdlZWtkYXlzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXlN1bC9pLFxuICAgICAgICAgICAgL15MdW4vaSxcbiAgICAgICAgICAgIC9eTWV1L2ksXG4gICAgICAgICAgICAvXk1lci9pLFxuICAgICAgICAgICAgL15ZYW8vaSxcbiAgICAgICAgICAgIC9eR3dlL2ksXG4gICAgICAgICAgICAvXlNhZC9pLFxuICAgICAgICBdLFxuICAgICAgICBtaW5XZWVrZGF5c1BhcnNlID0gW1xuICAgICAgICAgICAgL15TdS9pLFxuICAgICAgICAgICAgL15MdS9pLFxuICAgICAgICAgICAgL15NZShbXnJdfCQpL2ksXG4gICAgICAgICAgICAvXk1lci9pLFxuICAgICAgICAgICAgL15ZYS9pLFxuICAgICAgICAgICAgL15Hdy9pLFxuICAgICAgICAgICAgL15TYS9pLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGJyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYnInLCB7XG4gICAgICAgIG1vbnRoczogJ0dlbnZlcl9Dyrxod2V2cmVyX01ldXJ6aF9FYnJlbF9NYWVfTWV6aGV2ZW5fR291ZXJlX0Vvc3RfR3dlbmdvbG9fSGVyZV9EdV9LZXJ6dScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdHZW5fQ8q8aHdlX01ldV9FYnJfTWFlX0V2ZV9Hb3VfRW9zX0d3ZV9IZXJfRHVfS2VyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bF9MdW5fTWV1cnpoX01lcmPKvGhlcl9ZYW91X0d3ZW5lcl9TYWRvcm4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdWxfTHVuX01ldV9NZXJfWWFvX0d3ZV9TYWQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTHVfTWVfTWVyX1lhX0d3X1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlOiBtaW5XZWVrZGF5c1BhcnNlLFxuICAgICAgICBmdWxsV2Vla2RheXNQYXJzZTogZnVsbFdlZWtkYXlzUGFyc2UsXG4gICAgICAgIHNob3J0V2Vla2RheXNQYXJzZTogc2hvcnRXZWVrZGF5c1BhcnNlLFxuICAgICAgICBtaW5XZWVrZGF5c1BhcnNlOiBtaW5XZWVrZGF5c1BhcnNlLFxuXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OiBtb250aHNTdHJpY3RSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDogbW9udGhzU2hvcnRTdHJpY3RSZWdleCxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcblxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2Egdml6XSBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbYSB2aXpdIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbYSB2aXpdIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hpeml2IGRhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1dhcmPKvGhvYXpoIGRhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2RhXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0RlY8q8aCBkYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtwYXNldCBkYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdhLWJlbm4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMq8em8nLFxuICAgICAgICAgICAgczogJ3VuIG5lYmV1ZCBzZWdvbmRlbm5vw7knLFxuICAgICAgICAgICAgc3M6ICclZCBlaWxlbm4nLFxuICAgICAgICAgICAgbTogJ3VyIHZ1bnV0ZW5uJyxcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoTXV0YXRpb24sXG4gICAgICAgICAgICBoOiAndW4gZXVyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgZXVyJyxcbiAgICAgICAgICAgIGQ6ICd1biBkZXZlemgnLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbixcbiAgICAgICAgICAgIE06ICd1ciBtaXonLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbixcbiAgICAgICAgICAgIHk6ICd1ciBibG9heicsXG4gICAgICAgICAgICB5eTogc3BlY2lhbE11dGF0aW9uRm9yWWVhcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShhw7F8dmV0KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSBudW1iZXIgPT09IDEgPyAnYcOxJyA6ICd2ZXQnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvYS5tLnxnLm0uLywgLy8gZ291ZGUgbWVyZW5uIHwgYS1yYW9rIG1lcmVublxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbiA9PT0gJ2cubS4nO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCAxMiA/ICdhLm0uJyA6ICdnLm0uJztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBicjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCb3NuaWFuIFtic11cbi8vISBhdXRob3IgOiBOZWRpbSBDaG9saWNoIDogaHR0cHM6Ly9naXRodWIuY29tL2Zyb250eWFyZFxuLy8hIGF1dGhvciA6IFJhc2lkIFJlZHppYyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXNpZHJlXG4vLyEgYmFzZWQgb24gKGhyKSB0cmFuc2xhdGlvbiBieSBCb2phbiBNYXJrb3ZpxIdcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeFxuICAgICAgICAgICAgICAgICAgICA/ICdqZWRuYSBtaW51dGEnXG4gICAgICAgICAgICAgICAgICAgIDogaXNGdXR1cmVcbiAgICAgICAgICAgICAgICAgICAgICA/ICdqZWRudSBtaW51dHUnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnamVkbmUgbWludXRlJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0YSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdqZWRhbiBzYXQnIDogJ2plZGFuIHNhdCc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0aSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2Rhbic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdkYW5hJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5lJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluYSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYnMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdicycsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFydF9hcHJpbF9tYWpfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iYXJfb2t0b2Jhcl9ub3ZlbWJhcl9kZWNlbWJhcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hci5fYXByLl9tYWouX2p1bi5fanVsLl9hdWcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWRqZWxqYV9wb25lZGplbGpha191dG9yYWtfc3JpamVkYV/EjWV0dnJ0YWtfcGV0YWtfc3Vib3RhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVkLl9wb24uX3V0by5fc3JpLl/EjWV0Ll9wZXQuX3N1Yi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdXRfc3JfxI1lX3BlX3N1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3N1dHJhIHVdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRqZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3NyaWplZHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzdWJvdHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdcSNZXIgdV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWx1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbGVdIFtzdWJvdGVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbGldIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJpamUgJXMnLFxuICAgICAgICAgICAgczogJ3BhciBzZWt1bmRpJyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiAnZGFuJyxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiAnbWplc2VjJyxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiAnZ29kaW51JyxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYnM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2F0YWxhbiBbY2FdXG4vLyEgYXV0aG9yIDogSnVhbiBHLiBIdXJ0YWRvIDogaHR0cHM6Ly9naXRodWIuY29tL2p1YW5naHVydGFkb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGNhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnY2EnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnZ2VuZXJfZmVicmVyX21hcsOnX2FicmlsX21haWdfanVueV9qdWxpb2xfYWdvc3Rfc2V0ZW1icmVfb2N0dWJyZV9ub3ZlbWJyZV9kZXNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6IFwiZGUgZ2VuZXJfZGUgZmVicmVyX2RlIG1hcsOnX2QnYWJyaWxfZGUgbWFpZ19kZSBqdW55X2RlIGp1bGlvbF9kJ2Fnb3N0X2RlIHNldGVtYnJlX2Qnb2N0dWJyZV9kZSBub3ZlbWJyZV9kZSBkZXNlbWJyZVwiLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvRFtvRF0/KFxccykrTU1NTS8sXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2dlbi5fZmVici5fbWFyw6dfYWJyLl9tYWlnX2p1bnlfanVsLl9hZy5fc2V0Ll9vY3QuX25vdi5fZGVzLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdkaXVtZW5nZV9kaWxsdW5zX2RpbWFydHNfZGltZWNyZXNfZGlqb3VzX2RpdmVuZHJlc19kaXNzYWJ0ZScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGcuX2RsLl9kdC5fZGMuX2RqLl9kdi5fZHMuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RnX2RsX2R0X2RjX2RqX2R2X2RzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgbGw6ICdEIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBbZGVdIFlZWVkgW2EgbGVzXSBIOm1tJyxcbiAgICAgICAgICAgIGxsbDogJ0QgTU1NIFlZWVksIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFtkZV0gWVlZWSBbYSBsZXNdIEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCBEIE1NTSBZWVlZLCBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1thdnVpIGEgJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnbGVzJyA6ICdsYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tkZW3DoCBhICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2FoaXIgYSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW2VsXSBkZGRkIFtwYXNzYXQgYSAnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgK1xuICAgICAgICAgICAgICAgICAgICAnXSBMVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBcImQnYXF1w60gJXNcIixcbiAgICAgICAgICAgIHBhc3Q6ICdmYSAlcycsXG4gICAgICAgICAgICBzOiAndW5zIHNlZ29ucycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ29ucycsXG4gICAgICAgICAgICBtOiAndW4gbWludXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHMnLFxuICAgICAgICAgICAgaDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yZXMnLFxuICAgICAgICAgICAgZDogJ3VuIGRpYScsXG4gICAgICAgICAgICBkZDogJyVkIGRpZXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc29zJyxcbiAgICAgICAgICAgIHk6ICd1biBhbnknLFxuICAgICAgICAgICAgeXk6ICclZCBhbnlzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHJ8bnx0fMOofGEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICBudW1iZXIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgPyAncidcbiAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICA/ICduJ1xuICAgICAgICAgICAgICAgICAgICAgIDogbnVtYmVyID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnw6gnO1xuICAgICAgICAgICAgaWYgKHBlcmlvZCA9PT0gJ3cnIHx8IHBlcmlvZCA9PT0gJ1cnKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2EnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEN6ZWNoIFtjc11cbi8vISBhdXRob3IgOiBwZXRyYmVsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRyYmVsYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ2xlZGVuX8O6bm9yX2LFmWV6ZW5fZHViZW5fa3bEm3Rlbl/EjWVydmVuX8SNZXJ2ZW5lY19zcnBlbl96w6HFmcOtX8WZw61qZW5fbGlzdG9wYWRfcHJvc2luZWMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiAnbGVkbmFfw7pub3JhX2LFmWV6bmFfZHVibmFfa3bEm3RuYV/EjWVydm5hX8SNZXJ2ZW5jZV9zcnBuYV96w6HFmcOtX8WZw61qbmFfbGlzdG9wYWR1X3Byb3NpbmNlJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL0REP1tvLl0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NLyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnbGVkX8O6bm9fYsWZZV9kdWJfa3bEm1/EjXZuX8SNdmNfc3JwX3rDocWZX8WZw61qX2xpc19wcm8nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15sZWQvaSxcbiAgICAgICAgICAgIC9ew7puby9pLFxuICAgICAgICAgICAgL15ixZllL2ksXG4gICAgICAgICAgICAvXmR1Yi9pLFxuICAgICAgICAgICAgL15rdsSbL2ksXG4gICAgICAgICAgICAvXijEjXZufMSNZXJ2ZW4kfMSNZXJ2bmEpL2ksXG4gICAgICAgICAgICAvXijEjXZjfMSNZXJ2ZW5lY3zEjWVydmVuY2UpL2ksXG4gICAgICAgICAgICAvXnNycC9pLFxuICAgICAgICAgICAgL156w6HFmS9pLFxuICAgICAgICAgICAgL17FmcOtai9pLFxuICAgICAgICAgICAgL15saXMvaSxcbiAgICAgICAgICAgIC9ecHJvL2ksXG4gICAgICAgIF0sXG4gICAgICAgIC8vIE5PVEU6ICfEjWVydmVuJyBpcyBzdWJzdHJpbmcgb2YgJ8SNZXJ2ZW5lYyc7IHRoZXJlZm9yZSAnxI1lcnZlbmVjJyBtdXN0IHByZWNlZGUgJ8SNZXJ2ZW4nIGluIHRoZSByZWdleCB0byBiZSBmdWxseSBtYXRjaGVkLlxuICAgICAgICAvLyBPdGhlcndpc2UgcGFyc2VyIG1hdGNoZXMgJzEuIMSNZXJ2ZW5lYycgYXMgJzEuIMSNZXJ2ZW4nICsgJ2VjJy5cbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14obGVkZW58w7pub3J8YsWZZXplbnxkdWJlbnxrdsSbdGVufMSNZXJ2ZW5lY3zEjWVydmVuY2V8xI1lcnZlbnzEjWVydm5hfHNycGVufHrDocWZw618xZnDrWplbnxsaXN0b3BhZHxwcm9zaW5lY3xsZWR8w7pub3xixZllfGR1YnxrdsSbfMSNdm58xI12Y3xzcnB8esOhxZl8xZnDrWp8bGlzfHBybykvaTtcblxuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIHJldHVybiBuID4gMSAmJiBuIDwgNSAmJiB+fihuIC8gMTApICE9PSAxO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzogLy8gYSBmZXcgc2Vjb25kcyAvIGluIGEgZmV3IHNlY29uZHMgLyBhIGZldyBzZWNvbmRzIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3DDoXIgc2VrdW5kJyA6ICdww6FyIHNla3VuZGFtaSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6IC8vIDkgc2Vjb25kcyAvIGluIDkgc2Vjb25kcyAvIDkgc2Vjb25kcyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Nla3VuZHknIDogJ3Nla3VuZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnc2VrdW5kYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtJzogLy8gYSBtaW51dGUgLyBpbiBhIG1pbnV0ZSAvIGEgbWludXRlIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ21pbnV0YScgOiBpc0Z1dHVyZSA/ICdtaW51dHUnIDogJ21pbnV0b3UnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOiAvLyA5IG1pbnV0ZXMgLyBpbiA5IG1pbnV0ZXMgLyA5IG1pbnV0ZXMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtaW51dHknIDogJ21pbnV0Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtaW51dGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnaCc6IC8vIGFuIGhvdXIgLyBpbiBhbiBob3VyIC8gYW4gaG91ciBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdob2RpbmEnIDogaXNGdXR1cmUgPyAnaG9kaW51JyA6ICdob2Rpbm91JztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzogLy8gOSBob3VycyAvIGluIDkgaG91cnMgLyA5IGhvdXJzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnaG9kaW55JyA6ICdob2RpbicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnaG9kaW5hbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2QnOiAvLyBhIGRheSAvIGluIGEgZGF5IC8gYSBkYXkgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZGVuJyA6ICdkbmVtJztcbiAgICAgICAgICAgIGNhc2UgJ2RkJzogLy8gOSBkYXlzIC8gaW4gOSBkYXlzIC8gOSBkYXlzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnZG55JyA6ICdkbsOtJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkbnknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ00nOiAvLyBhIG1vbnRoIC8gaW4gYSBtb250aCAvIGEgbW9udGggYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbcSbc8OtYycgOiAnbcSbc8OtY2VtJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzogLy8gOSBtb250aHMgLyBpbiA5IG1vbnRocyAvIDkgbW9udGhzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbcSbc8OtY2UnIDogJ23Em3PDrWPFrycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcSbc8OtY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ3knOiAvLyBhIHllYXIgLyBpbiBhIHllYXIgLyBhIHllYXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAncm9rJyA6ICdyb2tlbSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6IC8vIDkgeWVhcnMgLyBpbiA5IHllYXJzIC8gOSB5ZWFycyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Jva3knIDogJ2xldCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbGV0eSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnY3MnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzU2hvcnQsXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIC8vIE5PVEU6ICfEjWVydmVuJyBpcyBzdWJzdHJpbmcgb2YgJ8SNZXJ2ZW5lYyc7IHRoZXJlZm9yZSAnxI1lcnZlbmVjJyBtdXN0IHByZWNlZGUgJ8SNZXJ2ZW4nIGluIHRoZSByZWdleCB0byBiZSBmdWxseSBtYXRjaGVkLlxuICAgICAgICAvLyBPdGhlcndpc2UgcGFyc2VyIG1hdGNoZXMgJzEuIMSNZXJ2ZW5lYycgYXMgJzEuIMSNZXJ2ZW4nICsgJ2VjJy5cbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihsZWRlbnxsZWRuYXzDum5vcmF8w7pub3J8YsWZZXplbnxixZllem5hfGR1YmVufGR1Ym5hfGt2xJt0ZW58a3bEm3RuYXzEjWVydmVuZWN8xI1lcnZlbmNlfMSNZXJ2ZW58xI1lcnZuYXxzcnBlbnxzcnBuYXx6w6HFmcOtfMWZw61qZW58xZnDrWpuYXxsaXN0b3BhZHV8bGlzdG9wYWR8cHJvc2luZWN8cHJvc2luY2UpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihsZWR8w7pub3xixZllfGR1YnxrdsSbfMSNdm58xI12Y3xzcnB8esOhxZl8xZnDrWp8bGlzfHBybykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWTEm2xlX3BvbmTEm2zDrV/DunRlcsO9X3N0xZllZGFfxI10dnJ0ZWtfcMOhdGVrX3NvYm90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lX3BvX8O6dF9zdF/EjXRfcMOhX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX8O6dF9zdF/EjXRfcMOhX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgbDogJ0QuIE0uIFlZWVknLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkbmVzIHZdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbesOtdHJhIHZdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgbmVkxJtsaSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gZGRkZCBbdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2ZSBzdMWZZWR1IHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdmUgxI10dnJ0ZWsgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHDDoXRlayB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Ygc29ib3R1IHZdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1t2xI1lcmEgdl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWxvdSBuZWTEm2xpIHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMOpXSBkZGRkIFt2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsb3Ugc3TFmWVkdSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDvV0gZGRkZCBbdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bG91IHNvYm90dSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3DFmWVkICVzJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaHV2YXNoIFtjdl1cbi8vISBhdXRob3IgOiBBbmF0b2x5IE1pcm9ub3YgOiBodHRwczovL2dpdGh1Yi5jb20vbWlyb250b2xpXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgY3YgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdjdicsIHtcbiAgICAgICAgbW9udGhzOiAn0LrTkdGA0LvQsNGHX9C90LDRgNOR0YFf0L/Rg9GIX9Cw0LrQsF/QvNCw0Llf0qvTl9GA0YLQvNC1X9GD0YLTkV/Sq9GD0YDQu9CwX9Cw0LLTkdC9X9GO0L/QsF/Rh9Oz0Lpf0YDQsNGI0YLQsNCyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9C605HRgF/QvdCw0YBf0L/Rg9GIX9Cw0LrQsF/QvNCw0Llf0qvTl9GAX9GD0YLTkV/Sq9GD0YBf0LDQstC9X9GO0L/QsF/Rh9Oz0Lpf0YDQsNGIJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfQstGL0YDRgdCw0YDQvdC40LrRg9C9X9GC0YPQvdGC0LjQutGD0L1f0YvRgtC70LDRgNC40LrRg9C9X9GO0L3QutGD0L1f0LrTl9Kr0L3QtdGA0L3QuNC60YPQvV/RjdGA0L3QtdC60YPQvV/RiNOR0LzQsNGC0LrRg9C9Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQstGL0YBf0YLRg9C9X9GL0YLQu1/RjtC9X9C605fSq1/RjdGA0L1f0YjTkdC8Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9Cy0YBf0YLQvV/Ri9GCX9GO0L1f0LrSq1/RjdGAX9GI0LwnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnWVlZWSBb0qvRg9C70YXQuF0gTU1NTSBb0YPQudOR0YXTl9C9XSBEWy3QvNOX0YjTl10nLFxuICAgICAgICAgICAgTExMOiAnWVlZWSBb0qvRg9C70YXQuF0gTU1NTSBb0YPQudOR0YXTl9C9XSBEWy3QvNOX0YjTl10sIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBZWVlZIFvSq9GD0LvRhdC4XSBNTU1NIFvRg9C505HRhdOX0L1dIERbLdC805fRiNOXXSwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQn9Cw0Y/QvV0gTFQgW9GB0LXRhdC10YLRgNC1XScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Cr0YDQsNC9XSBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb05bQvdC10YBdIExUIFvRgdC10YXQtdGC0YDQtV0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb0qrQuNGC0LXRgV0gZGRkZCBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9CY0YDRgtC905ddIGRkZGQgTFQgW9GB0LXRhdC10YLRgNC1XScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICAgICAgICAgIHZhciBhZmZpeCA9IC/RgdC10YXQtdGCJC9pLmV4ZWMob3V0cHV0KVxuICAgICAgICAgICAgICAgICAgICA/ICfRgNC10L0nXG4gICAgICAgICAgICAgICAgICAgIDogL9Kr0YPQuyQvaS5leGVjKG91dHB1dClcbiAgICAgICAgICAgICAgICAgICAgICA/ICfRgtCw0L0nXG4gICAgICAgICAgICAgICAgICAgICAgOiAn0YDQsNC9JztcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0ICsgYWZmaXg7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdDogJyVzINC60LDRj9C70LvQsCcsXG4gICAgICAgICAgICBzOiAn0L/Tl9GALdC40Log0qvQtdC60LrRg9C90YInLFxuICAgICAgICAgICAgc3M6ICclZCDSq9C10LrQutGD0L3RgicsXG4gICAgICAgICAgICBtOiAn0L/Tl9GAINC80LjQvdGD0YInLFxuICAgICAgICAgICAgbW06ICclZCDQvNC40L3Rg9GCJyxcbiAgICAgICAgICAgIGg6ICfQv9OX0YAg0YHQtdGF0LXRgicsXG4gICAgICAgICAgICBoaDogJyVkINGB0LXRhdC10YInLFxuICAgICAgICAgICAgZDogJ9C/05fRgCDQutGD0L0nLFxuICAgICAgICAgICAgZGQ6ICclZCDQutGD0L0nLFxuICAgICAgICAgICAgTTogJ9C/05fRgCDRg9C505HRhScsXG4gICAgICAgICAgICBNTTogJyVkINGD0LnTkdGFJyxcbiAgICAgICAgICAgIHk6ICfQv9OX0YAg0qvRg9C7JyxcbiAgICAgICAgICAgIHl5OiAnJWQg0qvRg9C7JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LdC805fRiC8sXG4gICAgICAgIG9yZGluYWw6ICclZC3QvNOX0YgnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3Y7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogV2Vsc2ggW2N5XVxuLy8hIGF1dGhvciA6IFJvYmVydCBBbGxlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JnYWxsZW5cbi8vISBhdXRob3IgOiBodHRwczovL2dpdGh1Yi5jb20vcnlhbmdyZWF2ZXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBjeSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2N5Jywge1xuICAgICAgICBtb250aHM6ICdJb25hd3JfQ2h3ZWZyb3JfTWF3cnRoX0VicmlsbF9NYWlfTWVoZWZpbl9Hb3JmZmVubmFmX0F3c3RfTWVkaV9IeWRyZWZfVGFjaHdlZGRfUmhhZ2Z5cicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdJb25fQ2h3ZV9NYXdfRWJyX01haV9NZWhfR29yX0F3c19NZWRfSHlkX1RhY2hfUmhhZycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnRHlkZCBTdWxfRHlkZCBMbHVuX0R5ZGQgTWF3cnRoX0R5ZGQgTWVyY2hlcl9EeWRkIElhdV9EeWRkIEd3ZW5lcl9EeWRkIFNhZHdybicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VsX0xsdW5fTWF3X01lcl9JYXVfR3dlX1NhZCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9MbF9NYV9NZV9JYV9Hd19TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICAvLyB0aW1lIGZvcm1hdHMgYXJlIHRoZSBzYW1lIGFzIGVuLWdiXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGVkZGl3IGFtXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1lmb3J5IGFtXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2FtXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0Rkb2UgYW1dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZGl3ZXRoYWYgYW1dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnbWV3biAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgeW4gw7RsJyxcbiAgICAgICAgICAgIHM6ICd5Y2h5ZGlnIGVpbGlhZGF1JyxcbiAgICAgICAgICAgIHNzOiAnJWQgZWlsaWFkJyxcbiAgICAgICAgICAgIG06ICdtdW51ZCcsXG4gICAgICAgICAgICBtbTogJyVkIG11bnVkJyxcbiAgICAgICAgICAgIGg6ICdhd3InLFxuICAgICAgICAgICAgaGg6ICclZCBhd3InLFxuICAgICAgICAgICAgZDogJ2Rpd3Jub2QnLFxuICAgICAgICAgICAgZGQ6ICclZCBkaXdybm9kJyxcbiAgICAgICAgICAgIE06ICdtaXMnLFxuICAgICAgICAgICAgTU06ICclZCBtaXMnLFxuICAgICAgICAgICAgeTogJ2Jsd3lkZHluJyxcbiAgICAgICAgICAgIHl5OiAnJWQgZmx5bmVkZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShmZWR8YWlufGFmfGlsfHlkZHxlZHxlZykvLFxuICAgICAgICAvLyB0cmFkaXRpb25hbCBvcmRpbmFsIG51bWJlcnMgYWJvdmUgMzEgYXJlIG5vdCBjb21tb25seSB1c2VkIGluIGNvbGxvcXVpYWwgV2Vsc2hcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gJycsXG4gICAgICAgICAgICAgICAgbG9va3VwID0gW1xuICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FmJyxcbiAgICAgICAgICAgICAgICAgICAgJ2lsJyxcbiAgICAgICAgICAgICAgICAgICAgJ3lkZCcsXG4gICAgICAgICAgICAgICAgICAgICd5ZGQnLFxuICAgICAgICAgICAgICAgICAgICAnZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLCAvLyAxYWYgdG8gMTBmZWRcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsIC8vIDExZWcgdG8gMjBmZWRcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGIgPiAyMCkge1xuICAgICAgICAgICAgICAgIGlmIChiID09PSA0MCB8fCBiID09PSA1MCB8fCBiID09PSA2MCB8fCBiID09PSA4MCB8fCBiID09PSAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2ZlZCc7IC8vIG5vdCAzMGFpbiwgNzBhaW4gb3IgOTBhaW5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnYWluJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGIgPiAwKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbG9va3VwW2JdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGN5O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IERhbmlzaCBbZGFdXG4vLyEgYXV0aG9yIDogVWxyaWsgTmllbHNlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tcmJhc2VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBkYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2RhJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJ0c19hcHJpbF9tYWpfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcl9hcHJfbWFqX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdzw7huZGFnX21hbmRhZ190aXJzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sw7hyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc8O4bl9tYW5fdGlyX29uc190b3JfZnJlX2zDuHInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc8O4X21hX3RpX29uX3RvX2ZyX2zDuCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIFtkLl0gRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaSBkYWcga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2kgbW9yZ2VuIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdww6UgZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2kgZ8OlciBrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2ldIGRkZGRbcyBrbC5dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb20gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHNpZGVuJyxcbiAgICAgICAgICAgIHM6ICdmw6Ugc2VrdW5kZXInLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmRlcicsXG4gICAgICAgICAgICBtOiAnZXQgbWludXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHRlcicsXG4gICAgICAgICAgICBoOiAnZW4gdGltZScsXG4gICAgICAgICAgICBoaDogJyVkIHRpbWVyJyxcbiAgICAgICAgICAgIGQ6ICdlbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdlJyxcbiAgICAgICAgICAgIE06ICdlbiBtw6VuZWQnLFxuICAgICAgICAgICAgTU06ICclZCBtw6VuZWRlcicsXG4gICAgICAgICAgICB5OiAnZXQgw6VyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw6VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHZXJtYW4gKEF1c3RyaWEpIFtkZS1hdF1cbi8vISBhdXRob3IgOiBsbHVjaHMgOiBodHRwczovL2dpdGh1Yi5jb20vbGx1Y2hzXG4vLyEgYXV0aG9yOiBNZW5lbGlvbiBFbGVuc8O6bGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlXG4vLyEgYXV0aG9yIDogTWFydGluIEdyb2xsZXIgOiBodHRwczovL2dpdGh1Yi5jb20vTWFkTUdcbi8vISBhdXRob3IgOiBNaWtvbGFqIERhZGVsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWswMWFqXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgbTogWydlaW5lIE1pbnV0ZScsICdlaW5lciBNaW51dGUnXSxcbiAgICAgICAgICAgIGg6IFsnZWluZSBTdHVuZGUnLCAnZWluZXIgU3R1bmRlJ10sXG4gICAgICAgICAgICBkOiBbJ2VpbiBUYWcnLCAnZWluZW0gVGFnJ10sXG4gICAgICAgICAgICBkZDogW251bWJlciArICcgVGFnZScsIG51bWJlciArICcgVGFnZW4nXSxcbiAgICAgICAgICAgIHc6IFsnZWluZSBXb2NoZScsICdlaW5lciBXb2NoZSddLFxuICAgICAgICAgICAgTTogWydlaW4gTW9uYXQnLCAnZWluZW0gTW9uYXQnXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyBNb25hdGUnLCBudW1iZXIgKyAnIE1vbmF0ZW4nXSxcbiAgICAgICAgICAgIHk6IFsnZWluIEphaHInLCAnZWluZW0gSmFociddLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIEphaHJlJywgbnVtYmVyICsgJyBKYWhyZW4nXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBkZUF0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZGUtYXQnLCB7XG4gICAgICAgIG1vbnRoczogJ0rDpG5uZXJfRmVicnVhcl9Nw6Ryel9BcHJpbF9NYWlfSnVuaV9KdWxpX0F1Z3VzdF9TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXplbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnSsOkbi5fRmViLl9Nw6Ryel9BcHIuX01haV9KdW5pX0p1bGlfQXVnLl9TZXAuX09rdC5fTm92Ll9EZXouJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdTb25udGFnX01vbnRhZ19EaWVuc3RhZ19NaXR0d29jaF9Eb25uZXJzdGFnX0ZyZWl0YWdfU2Ftc3RhZycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU28uX01vLl9EaS5fTWkuX0RvLl9Gci5fU2EuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NvX01vX0RpX01pX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaGV1dGUgdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vcmdlbiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tnZXN0ZXJuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tsZXR6dGVuXSBkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICd2b3IgJXMnLFxuICAgICAgICAgICAgczogJ2VpbiBwYWFyIFNla3VuZGVuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgU2VrdW5kZW4nLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiAnJWQgTWludXRlbicsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6ICclZCBTdHVuZGVuJyxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHc6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3dzogJyVkIFdvY2hlbicsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGVBdDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHZXJtYW4gKFN3aXR6ZXJsYW5kKSBbZGUtY2hdXG4vLyEgYXV0aG9yIDogc3NjaHVlbGxlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zc2NodWVsbGVyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgbTogWydlaW5lIE1pbnV0ZScsICdlaW5lciBNaW51dGUnXSxcbiAgICAgICAgICAgIGg6IFsnZWluZSBTdHVuZGUnLCAnZWluZXIgU3R1bmRlJ10sXG4gICAgICAgICAgICBkOiBbJ2VpbiBUYWcnLCAnZWluZW0gVGFnJ10sXG4gICAgICAgICAgICBkZDogW251bWJlciArICcgVGFnZScsIG51bWJlciArICcgVGFnZW4nXSxcbiAgICAgICAgICAgIHc6IFsnZWluZSBXb2NoZScsICdlaW5lciBXb2NoZSddLFxuICAgICAgICAgICAgTTogWydlaW4gTW9uYXQnLCAnZWluZW0gTW9uYXQnXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyBNb25hdGUnLCBudW1iZXIgKyAnIE1vbmF0ZW4nXSxcbiAgICAgICAgICAgIHk6IFsnZWluIEphaHInLCAnZWluZW0gSmFociddLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIEphaHJlJywgbnVtYmVyICsgJyBKYWhyZW4nXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBkZUNoID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZGUtY2gnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcl9GZWJydWFyX03DpHJ6X0FwcmlsX01haV9KdW5pX0p1bGlfQXVndXN0X1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0RlemVtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKYW4uX0ZlYi5fTcOkcnpfQXByLl9NYWlfSnVuaV9KdWxpX0F1Zy5fU2VwLl9Pa3QuX05vdi5fRGV6Licuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnU29ubnRhZ19Nb250YWdfRGllbnN0YWdfTWl0dHdvY2hfRG9ubmVyc3RhZ19GcmVpdGFnX1NhbXN0YWcnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1NvX01vX0RpX01pX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NvX01vX0RpX01pX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaGV1dGUgdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vcmdlbiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tnZXN0ZXJuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tsZXR6dGVuXSBkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICd2b3IgJXMnLFxuICAgICAgICAgICAgczogJ2VpbiBwYWFyIFNla3VuZGVuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgU2VrdW5kZW4nLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiAnJWQgTWludXRlbicsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6ICclZCBTdHVuZGVuJyxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHc6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3dzogJyVkIFdvY2hlbicsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGVDaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHZXJtYW4gW2RlXVxuLy8hIGF1dGhvciA6IGxsdWNocyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9sbHVjaHNcbi8vISBhdXRob3I6IE1lbmVsaW9uIEVsZW5zw7psZTogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcbi8vISBhdXRob3IgOiBNaWtvbGFqIERhZGVsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWswMWFqXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgbTogWydlaW5lIE1pbnV0ZScsICdlaW5lciBNaW51dGUnXSxcbiAgICAgICAgICAgIGg6IFsnZWluZSBTdHVuZGUnLCAnZWluZXIgU3R1bmRlJ10sXG4gICAgICAgICAgICBkOiBbJ2VpbiBUYWcnLCAnZWluZW0gVGFnJ10sXG4gICAgICAgICAgICBkZDogW251bWJlciArICcgVGFnZScsIG51bWJlciArICcgVGFnZW4nXSxcbiAgICAgICAgICAgIHc6IFsnZWluZSBXb2NoZScsICdlaW5lciBXb2NoZSddLFxuICAgICAgICAgICAgTTogWydlaW4gTW9uYXQnLCAnZWluZW0gTW9uYXQnXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyBNb25hdGUnLCBudW1iZXIgKyAnIE1vbmF0ZW4nXSxcbiAgICAgICAgICAgIHk6IFsnZWluIEphaHInLCAnZWluZW0gSmFociddLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIEphaHJlJywgbnVtYmVyICsgJyBKYWhyZW4nXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBkZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2RlJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJfRmVicnVhcl9Nw6Ryel9BcHJpbF9NYWlfSnVuaV9KdWxpX0F1Z3VzdF9TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXplbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnSmFuLl9GZWIuX03DpHJ6X0Fwci5fTWFpX0p1bmlfSnVsaV9BdWcuX1NlcC5fT2t0Ll9Ob3YuX0Rlei4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1Nvbm50YWdfTW9udGFnX0RpZW5zdGFnX01pdHR3b2NoX0Rvbm5lcnN0YWdfRnJlaXRhZ19TYW1zdGFnJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTby5fTW8uX0RpLl9NaS5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toZXV0ZSB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dlc3Rlcm4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2xldHp0ZW5dIGRkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzOiAnZWluIHBhYXIgU2VrdW5kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBTZWt1bmRlbicsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06ICclZCBNaW51dGVuJyxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgdzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHd3OiAnJWQgV29jaGVuJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWxkaXZpYW4gW2R2XVxuLy8hIGF1dGhvciA6IEphd2lzaCBIYW1lZWQgOiBodHRwczovL2dpdGh1Yi5jb20vamF3aXNoXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ96W3qzegt6q3ofept6D3qknLFxuICAgICAgICAgICAgJ96K3qzehN6w3oPeqt6H3qbeg96pJyxcbiAgICAgICAgICAgICfeid6n3oPeqN6X3qonLFxuICAgICAgICAgICAgJ96H3q3eld6w3oPeqd6N3qonLFxuICAgICAgICAgICAgJ96J3q0nLFxuICAgICAgICAgICAgJ96W3qvegt6wJyxcbiAgICAgICAgICAgICfelt6q3o3ept6H3qgnLFxuICAgICAgICAgICAgJ96H3q/ejt6m3pDesN6T3qonLFxuICAgICAgICAgICAgJ96Q3qzeld6w3pPerN6J3rDehN6m3oPeqicsXG4gICAgICAgICAgICAn3ofert6G3rDek96v3oTept6D3qonLFxuICAgICAgICAgICAgJ96C3q7eiN6s3onesN6E3qbeg96qJyxcbiAgICAgICAgICAgICfekd6o3pDerN6J3rDehN6m3oPeqicsXG4gICAgICAgIF0sXG4gICAgICAgIHdlZWtkYXlzID0gW1xuICAgICAgICAgICAgJ96H3qfei96o3ofesN6M3qYnLFxuICAgICAgICAgICAgJ96A3q/eid6mJyxcbiAgICAgICAgICAgICfeh96m3oLesN6O3qfeg96mJyxcbiAgICAgICAgICAgICfehN6q3ovepicsXG4gICAgICAgICAgICAn3oTeqt6D3qfekN6w3orept6M3qgnLFxuICAgICAgICAgICAgJ96A3qreht6q3oPeqicsXG4gICAgICAgICAgICAn3oDert6C3qjegN6o3oPeqicsXG4gICAgICAgIF07XG5cbiAgICB2YXIgZHYgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkdicsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogd2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiAn3ofep96L3qhf3oDer96J3qZf3ofept6C3rBf3oTeqt6L3qZf3oTeqt6D3qdf3oDeqt6G3qpf3oDert6C3qgnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdEL00vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL96J3oZ83oneii8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfeid6KJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfeid6GJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfeid6KJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb3oneqN6H3qbei96qXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW96J3qfei96m3onep10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb3ofeqN6H3rDelN6sXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1veit6n3ofeqN6M3qreiN6oXSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn3ozerN6D3q3ejt6m3ofeqCAlcycsXG4gICAgICAgICAgICBwYXN0OiAn3obeqt6D3qjegt6wICVzJyxcbiAgICAgICAgICAgIHM6ICfekN6o3obeqt6C3rDejN6q3obert6F3qzeh96wJyxcbiAgICAgICAgICAgIHNzOiAnZCUg3pDeqN6G3qregt6w3ozeqicsXG4gICAgICAgICAgICBtOiAn3oneqN6C3qjek96s3ofesCcsXG4gICAgICAgICAgICBtbTogJ96J3qjegt6o3pPeqiAlZCcsXG4gICAgICAgICAgICBoOiAn3o7ept6R3qjeh96o3oPerN6H3rAnLFxuICAgICAgICAgICAgaGg6ICfejt6m3pHeqN6H3qjeg96qICVkJyxcbiAgICAgICAgICAgIGQ6ICfei96q3ojept6A3qzeh96wJyxcbiAgICAgICAgICAgIGRkOiAn3oveqt6I3qbekN6wICVkJyxcbiAgICAgICAgICAgIE06ICfeid6m3oDerN6H3rAnLFxuICAgICAgICAgICAgTU06ICfeid6m3pDesCAlZCcsXG4gICAgICAgICAgICB5OiAn3ofept6A3qbeg96s3ofesCcsXG4gICAgICAgICAgICB5eTogJ96H3qbegN6m3oPeqiAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA3LCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZHY7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR3JlZWsgW2VsXVxuLy8hIGF1dGhvciA6IEFnZ2Vsb3MgS2FyYWxpYXMgOiBodHRwczovL2dpdGh1Yi5jb20vbWVoaWVsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodHlwZW9mIEZ1bmN0aW9uICE9PSAndW5kZWZpbmVkJyAmJiBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBlbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VsJywge1xuICAgICAgICBtb250aHNOb21pbmF0aXZlRWw6XG4gICAgICAgICAgICAnzpnOsc69zr/Phc6sz4HOuc6/z4JfzqbOtc6yz4HOv8+FzqzPgc65zr/Pgl/OnM6sz4HPhM65zr/Pgl/Okc+Az4HOr867zrnOv8+CX86czqzOuc6/z4JfzpnOv8+Nzr3Ouc6/z4JfzpnOv8+NzrvOuc6/z4JfzpHPjc6zzr/Phc+Dz4TOv8+CX86jzrXPgM+Ezq3OvM6yz4HOuc6/z4Jfzp/Ous+Ez47Oss+BzrnOv8+CX86dzr/Orc68zrLPgc65zr/Pgl/OlM61zrrOrc68zrLPgc65zr/Pgicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNHZW5pdGl2ZUVsOlxuICAgICAgICAgICAgJ86ZzrHOvc6/z4XOsc+Bzq/Ov8+FX86mzrXOss+Bzr/Phc6xz4HOr86/z4VfzpzOsc+Bz4TOr86/z4VfzpHPgM+BzrnOu86vzr/PhV/OnM6xzpDOv8+FX86Zzr/Phc69zq/Ov8+FX86Zzr/Phc67zq/Ov8+FX86Rz4XOs86/z43Pg8+Ezr/PhV/Oo861z4DPhM61zrzOss+Bzq/Ov8+FX86fzrrPhM+JzrLPgc6vzr/PhV/Onc6/zrXOvM6yz4HOr86/z4VfzpTOtc66zrXOvM6yz4HOr86/z4UnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzOiBmdW5jdGlvbiAobW9tZW50VG9Gb3JtYXQsIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtb21lbnRUb0Zvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNOb21pbmF0aXZlRWw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgL0QvLnRlc3QoZm9ybWF0LnN1YnN0cmluZygwLCBmb3JtYXQuaW5kZXhPZignTU1NTScpKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgZGF5IG51bWJlciBiZWZvcmUgJ01NTU0nXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc0dlbml0aXZlRWxbbW9tZW50VG9Gb3JtYXQubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNOb21pbmF0aXZlRWxbbW9tZW50VG9Gb3JtYXQubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnzpnOsc69X86mzrXOsl/OnM6xz4FfzpHPgM+BX86czrHPil/Omc6/z4XOvV/Omc6/z4XOu1/Okc+FzrNfzqPOtc+AX86fzrrPhF/Onc6/zrVfzpTOtc66Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ86az4XPgc65zrHOus6uX86UzrXPhc+Ezq3Pgc6xX86kz4HOr8+EzrdfzqTOtc+EzqzPgc+EzrdfzqDOrc68z4DPhM63X86gzrHPgc6xz4POus61z4XOrl/Oo86szrLOss6xz4TOvycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ86az4XPgV/OlM61z4VfzqTPgc65X86kzrXPhF/OoM61zrxfzqDOsc+BX86jzrHOsicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfOms+FX86UzrVfzqTPgV/OpM61X86gzrVfzqDOsV/Oo86xJy5zcGxpdCgnXycpLFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ868zrwnIDogJ86czpwnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfPgM68JyA6ICfOoM6cJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gKGlucHV0ICsgJycpLnRvTG93ZXJDYXNlKClbMF0gPT09ICfOvCc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9bzqDOnF1cXC4/zpw/XFwuPy9pLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhckVsOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW86jzq7OvM61z4HOsSB7fV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vOkc+Nz4HOuc6/IHt9XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3t9XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW86nzrjOtc+CIHt9XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vPhM6/IM+Az4HOv863zrPOv8+NzrzOtc69zr9dIGRkZGQgW3t9XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vPhM63zr0gz4DPgc6/zrfOs86/z43OvM61zr3Ot10gZGRkZCBbe31dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IGZ1bmN0aW9uIChrZXksIG1vbSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX2NhbGVuZGFyRWxba2V5XSxcbiAgICAgICAgICAgICAgICBob3VycyA9IG1vbSAmJiBtb20uaG91cnMoKTtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKG91dHB1dCkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQuYXBwbHkobW9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQucmVwbGFjZSgne30nLCBob3VycyAlIDEyID09PSAxID8gJ8+Dz4TOtycgOiAnz4PPhM65z4InKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfPg861ICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDPgM+BzrnOvScsXG4gICAgICAgICAgICBzOiAnzrvOr86zzrEgzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xJyxcbiAgICAgICAgICAgIHNzOiAnJWQgzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xJyxcbiAgICAgICAgICAgIG06ICfOrc69zrEgzrvOtc+Az4TPjCcsXG4gICAgICAgICAgICBtbTogJyVkIM67zrXPgM+EzqwnLFxuICAgICAgICAgICAgaDogJ868zq/OsSDPjs+BzrEnLFxuICAgICAgICAgICAgaGg6ICclZCDPjs+BzrXPgicsXG4gICAgICAgICAgICBkOiAnzrzOr86xIM68zq3Pgc6xJyxcbiAgICAgICAgICAgIGRkOiAnJWQgzrzOrc+BzrXPgicsXG4gICAgICAgICAgICBNOiAnzq3Ovc6xz4IgzrzOrs69zrHPgicsXG4gICAgICAgICAgICBNTTogJyVkIM68zq7Ovc61z4InLFxuICAgICAgICAgICAgeTogJ86tzr3Osc+CIM+Hz4HPjM69zr/PgicsXG4gICAgICAgICAgICB5eTogJyVkIM+Hz4HPjM69zrnOsScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfc63LyxcbiAgICAgICAgb3JkaW5hbDogJyVkzrcnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0c3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoQXVzdHJhbGlhKSBbZW4tYXVdXG4vLyEgYXV0aG9yIDogSmFyZWQgTW9yc2UgOiBodHRwczovL2dpdGh1Yi5jb20vamFyY29hbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuQXUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1hdScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5BdTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChDYW5hZGEpIFtlbi1jYV1cbi8vISBhdXRob3IgOiBKb25hdGhhbiBBYm91cmJpaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb25iY2FcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbkNhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4tY2EnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbkNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKFVuaXRlZCBLaW5nZG9tKSBbZW4tZ2JdXG4vLyEgYXV0aG9yIDogQ2hyaXMgR2VkcmltIDogaHR0cHM6Ly9naXRodWIuY29tL2NocmlzZ2VkcmltXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5HYiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWdiJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuR2I7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoSXJlbGFuZCkgW2VuLWllXVxuLy8hIGF1dGhvciA6IENocmlzIENhcnRsaWRnZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc2NhcnRsaWRnZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuSWUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1pZScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuSWU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoSXNyYWVsKSBbZW4taWxdXG4vLyEgYXV0aG9yIDogQ2hyaXMgR2VkcmltIDogaHR0cHM6Ly9naXRodWIuY29tL2NocmlzZ2VkcmltXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5JbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWlsJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbklsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKEluZGlhKSBbZW4taW5dXG4vLyEgYXV0aG9yIDogSmF0aW4gQWdyYXdhbCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYXRpbmFnMjJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbkluID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4taW4nLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuSW47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoTmV3IFplYWxhbmQpIFtlbi1uel1cbi8vISBhdXRob3IgOiBMdWtlIE1jR3JlZ29yIDogaHR0cHM6Ly9naXRodWIuY29tL2x1a2VtY2dyZWdvclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuTnogPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1ueicsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5OejtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChTaW5nYXBvcmUpIFtlbi1zZ11cbi8vISBhdXRob3IgOiBNYXR0aGV3IENhc3RyaWxsb24tTWFkcmlnYWwgOiBodHRwczovL2dpdGh1Yi5jb20vdGVjaGRpbWVuc2lvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuU2cgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1zZycsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlblNnO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVzcGVyYW50byBbZW9dXG4vLyEgYXV0aG9yIDogQ29saW4gRGVhbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jb2xpbmRlYW5cbi8vISBhdXRob3IgOiBNaWEgTm9yZGVudG9mdCBJbXBlcmF0b3JpIDogaHR0cHM6Ly9naXRodWIuY29tL21pZXN0YXNtaWFcbi8vISBjb21tZW50IDogbWllc3Rhc21pYSBjb3JyZWN0ZWQgdGhlIHRyYW5zbGF0aW9uIGJ5IGNvbGluZGVhblxuLy8hIGNvbW1lbnQgOiBWaXZha3ZvIGNvcnJlY3RlZCB0aGUgdHJhbnNsYXRpb24gYnkgY29saW5kZWFuIGFuZCBtaWVzdGFzbWlhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbycsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyb19mZWJydWFyb19tYXJ0b19hcHJpbG9fbWFqb19qdW5pb19qdWxpb19hxa1ndXN0b19zZXB0ZW1icm9fb2t0b2Jyb19ub3ZlbWJyb19kZWNlbWJybycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcnRfYXByX21hal9qdW5fanVsX2HFrWdfc2VwdF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdkaW1hbsSJb19sdW5kb19tYXJkb19tZXJrcmVkb1/EtWHFrWRvX3ZlbmRyZWRvX3NhYmF0bycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RpbV9sdW5fbWFyZF9tZXJrX8S1YcWtX3Zlbl9zYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGlfbHVfbWFfbWVfxLVhX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1tsYV0gRFstYW4gZGVdIE1NTU0sIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnW2xhXSBEWy1hbiBkZV0gTU1NTSwgWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZFtuXSwgW2xhXSBEWy1hbiBkZV0gTU1NTSwgWVlZWSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBbbGFdIERbLWFuIGRlXSBNTU0sIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvW2FwXVxcLnRcXC5tL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpID09PSAncCc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAncC50Lm0uJyA6ICdQLlQuTS4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdhLnQubS4nIDogJ0EuVC5NLic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hvZGlhxa0gamVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbTW9yZ2HFrSBqZV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkW24gamVdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSGllcmHFrSBqZV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbcGFzaW50YW5dIGRkZGRbbiBqZV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdwb3N0ICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdhbnRhxa0gJXMnLFxuICAgICAgICAgICAgczogJ2tlbGthaiBzZWt1bmRvaicsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZG9qJyxcbiAgICAgICAgICAgIG06ICd1bnUgbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvaicsXG4gICAgICAgICAgICBoOiAndW51IGhvcm8nLFxuICAgICAgICAgICAgaGg6ICclZCBob3JvaicsXG4gICAgICAgICAgICBkOiAndW51IHRhZ28nLCAvL25lICdkaXVybm8nLCDEiWFyIGVzdGFzIHV6aXRhIHBvciBwcm9rc2ltdW1vXG4gICAgICAgICAgICBkZDogJyVkIHRhZ29qJyxcbiAgICAgICAgICAgIE06ICd1bnUgbW9uYXRvJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9uYXRvaicsXG4gICAgICAgICAgICB5OiAndW51IGphcm8nLFxuICAgICAgICAgICAgeXk6ICclZCBqYXJvaicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfWEvLFxuICAgICAgICBvcmRpbmFsOiAnJWRhJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNwYW5pc2ggKERvbWluaWNhbiBSZXB1YmxpYykgW2VzLWRvXVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0RG90ID1cbiAgICAgICAgICAgICdlbmUuX2ZlYi5fbWFyLl9hYnIuX21heS5fanVuLl9qdWwuX2Fnby5fc2VwLl9vY3QuX25vdi5fZGljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdlbmVfZmViX21hcl9hYnJfbWF5X2p1bl9qdWxfYWdvX3NlcF9vY3Rfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmVuZS9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9ebWFyL2ksXG4gICAgICAgICAgICAvXmFici9pLFxuICAgICAgICAgICAgL15tYXkvaSxcbiAgICAgICAgICAgIC9eanVuL2ksXG4gICAgICAgICAgICAvXmp1bC9pLFxuICAgICAgICAgICAgL15hZ28vaSxcbiAgICAgICAgICAgIC9ec2VwL2ksXG4gICAgICAgICAgICAvXm9jdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZGljL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmV8ZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2k7XG5cbiAgICB2YXIgZXNEbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VzLWRvJywge1xuICAgICAgICBtb250aHM6ICdlbmVyb19mZWJyZXJvX21hcnpvX2FicmlsX21heW9fanVuaW9fanVsaW9fYWdvc3RvX3NlcHRpZW1icmVfb2N0dWJyZV9ub3ZpZW1icmVfZGljaWVtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3RbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOiAnZG9taW5nb19sdW5lc19tYXJ0ZXNfbWnDqXJjb2xlc19qdWV2ZXNfdmllcm5lc19zw6FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tLl9sdW4uX21hci5fbWnDqS5fanVlLl92aWUuX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX21pX2p1X3ZpX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2hveSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7FhbmEgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F5ZXIgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tlbF0gZGRkZCBbcGFzYWRvIGEgbGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaGFjZSAlcycsXG4gICAgICAgICAgICBzOiAndW5vcyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bmEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgdzogJ3VuYSBzZW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZW1hbmFzJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYcOxbycsXG4gICAgICAgICAgICB5eTogJyVkIGHDsW9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlc0RvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNwYW5pc2ggKE1leGljbykgW2VzLW14XVxuLy8hIGF1dGhvciA6IEpDIEZyYW5jbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qY2ZyYW5jb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0RG90ID1cbiAgICAgICAgICAgICdlbmUuX2ZlYi5fbWFyLl9hYnIuX21heS5fanVuLl9qdWwuX2Fnby5fc2VwLl9vY3QuX25vdi5fZGljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdlbmVfZmViX21hcl9hYnJfbWF5X2p1bl9qdWxfYWdvX3NlcF9vY3Rfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmVuZS9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9ebWFyL2ksXG4gICAgICAgICAgICAvXmFici9pLFxuICAgICAgICAgICAgL15tYXkvaSxcbiAgICAgICAgICAgIC9eanVuL2ksXG4gICAgICAgICAgICAvXmp1bC9pLFxuICAgICAgICAgICAgL15hZ28vaSxcbiAgICAgICAgICAgIC9ec2VwL2ksXG4gICAgICAgICAgICAvXm9jdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZGljL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmV8ZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2k7XG5cbiAgICB2YXIgZXNNeCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VzLW14Jywge1xuICAgICAgICBtb250aHM6ICdlbmVyb19mZWJyZXJvX21hcnpvX2FicmlsX21heW9fanVuaW9fanVsaW9fYWdvc3RvX3NlcHRpZW1icmVfb2N0dWJyZV9ub3ZpZW1icmVfZGljaWVtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3RbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOiAnZG9taW5nb19sdW5lc19tYXJ0ZXNfbWnDqXJjb2xlc19qdWV2ZXNfdmllcm5lc19zw6FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tLl9sdW4uX21hci5fbWnDqS5fanVlLl92aWUuX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX21pX2p1X3ZpX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tob3kgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1ttYcOxYW5hIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1theWVyIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbZWxdIGRkZGQgW3Bhc2FkbyBhIGxhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnXSBMVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2hhY2UgJXMnLFxuICAgICAgICAgICAgczogJ3Vub3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW5hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW4gZMOtYScsXG4gICAgICAgICAgICBkZDogJyVkIGTDrWFzJyxcbiAgICAgICAgICAgIHc6ICd1bmEgc2VtYW5hJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2VtYW5hcycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VuIGHDsW8nLFxuICAgICAgICAgICAgeXk6ICclZCBhw7FvcycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgICAgIGludmFsaWREYXRlOiAnRmVjaGEgaW52w6FsaWRhJyxcbiAgICB9KTtcblxuICAgIHJldHVybiBlc014O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNwYW5pc2ggKFVuaXRlZCBTdGF0ZXMpIFtlcy11c11cbi8vISBhdXRob3IgOiBidXN0dGEgOiBodHRwczovL2dpdGh1Yi5jb20vYnVzdHRhXG4vLyEgYXV0aG9yIDogY2hyaXNyb2R6IDogaHR0cHM6Ly9naXRodWIuY29tL2Nocmlzcm9kelxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0RG90ID1cbiAgICAgICAgICAgICdlbmUuX2ZlYi5fbWFyLl9hYnIuX21heS5fanVuLl9qdWwuX2Fnby5fc2VwLl9vY3QuX25vdi5fZGljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdlbmVfZmViX21hcl9hYnJfbWF5X2p1bl9qdWxfYWdvX3NlcF9vY3Rfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmVuZS9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9ebWFyL2ksXG4gICAgICAgICAgICAvXmFici9pLFxuICAgICAgICAgICAgL15tYXkvaSxcbiAgICAgICAgICAgIC9eanVuL2ksXG4gICAgICAgICAgICAvXmp1bC9pLFxuICAgICAgICAgICAgL15hZ28vaSxcbiAgICAgICAgICAgIC9ec2VwL2ksXG4gICAgICAgICAgICAvXm9jdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZGljL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmV8ZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2k7XG5cbiAgICB2YXIgZXNVcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VzLXVzJywge1xuICAgICAgICBtb250aHM6ICdlbmVyb19mZWJyZXJvX21hcnpvX2FicmlsX21heW9fanVuaW9fanVsaW9fYWdvc3RvX3NlcHRpZW1icmVfb2N0dWJyZV9ub3ZpZW1icmVfZGljaWVtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3RbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOiAnZG9taW5nb19sdW5lc19tYXJ0ZXNfbWnDqXJjb2xlc19qdWV2ZXNfdmllcm5lc19zw6FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tLl9sdW4uX21hci5fbWnDqS5fanVlLl92aWUuX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX21pX2p1X3ZpX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2hveSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7FhbmEgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F5ZXIgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tlbF0gZGRkZCBbcGFzYWRvIGEgbGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaGFjZSAlcycsXG4gICAgICAgICAgICBzOiAndW5vcyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bmEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgdzogJ3VuYSBzZW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZW1hbmFzJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYcOxbycsXG4gICAgICAgICAgICB5eTogJyVkIGHDsW9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlc1VzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNwYW5pc2ggW2VzXVxuLy8hIGF1dGhvciA6IEp1bGlvIE5hcHVyw60gOiBodHRwczovL2dpdGh1Yi5jb20vanVsaW9uY1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0RG90ID1cbiAgICAgICAgICAgICdlbmUuX2ZlYi5fbWFyLl9hYnIuX21heS5fanVuLl9qdWwuX2Fnby5fc2VwLl9vY3QuX25vdi5fZGljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdlbmVfZmViX21hcl9hYnJfbWF5X2p1bl9qdWxfYWdvX3NlcF9vY3Rfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmVuZS9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9ebWFyL2ksXG4gICAgICAgICAgICAvXmFici9pLFxuICAgICAgICAgICAgL15tYXkvaSxcbiAgICAgICAgICAgIC9eanVuL2ksXG4gICAgICAgICAgICAvXmp1bC9pLFxuICAgICAgICAgICAgL15hZ28vaSxcbiAgICAgICAgICAgIC9ec2VwL2ksXG4gICAgICAgICAgICAvXm9jdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZGljL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmV8ZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2k7XG5cbiAgICB2YXIgZXMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlcycsIHtcbiAgICAgICAgbW9udGhzOiAnZW5lcm9fZmVicmVyb19tYXJ6b19hYnJpbF9tYXlvX2p1bmlvX2p1bGlvX2Fnb3N0b19zZXB0aWVtYnJlX29jdHVicmVfbm92aWVtYnJlX2RpY2llbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGZ1bmN0aW9uIChtLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90W20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWluZ29fbHVuZXNfbWFydGVzX21pw6lyY29sZXNfanVldmVzX3ZpZXJuZXNfc8OhYmFkbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbS5fbHVuLl9tYXIuX21pw6kuX2p1ZS5fdmllLl9zw6FiLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb19sdV9tYV9taV9qdV92aV9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG95IGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbWHDsWFuYSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW2EgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYXllciBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW2VsXSBkZGRkIFtwYXNhZG8gYSBsYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ10gTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VuICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdoYWNlICVzJyxcbiAgICAgICAgICAgIHM6ICd1bm9zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGTDrWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkw61hcycsXG4gICAgICAgICAgICB3OiAndW5hIHNlbWFuYScsXG4gICAgICAgICAgICB3dzogJyVkIHNlbWFuYXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1biBhw7FvJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYcOxb3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgICAgICBpbnZhbGlkRGF0ZTogJ0ZlY2hhIGludsOhbGlkYScsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRXN0b25pYW4gW2V0XVxuLy8hIGF1dGhvciA6IEhlbnJ5IEtlaGxtYW5uIDogaHR0cHM6Ly9naXRodWIuY29tL21hZGhlbnJ5XG4vLyEgaW1wcm92ZW1lbnRzIDogSWxsaW1hciBUYW1iZWsgOiBodHRwczovL2dpdGh1Yi5jb20vcmFndWxrYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHM6IFsnbcO1bmUgc2VrdW5kaScsICdtw7VuaSBzZWt1bmQnLCAncGFhciBzZWt1bmRpdCddLFxuICAgICAgICAgICAgc3M6IFtudW1iZXIgKyAnc2VrdW5kaScsIG51bWJlciArICdzZWt1bmRpdCddLFxuICAgICAgICAgICAgbTogWyfDvGhlIG1pbnV0aScsICfDvGtzIG1pbnV0J10sXG4gICAgICAgICAgICBtbTogW251bWJlciArICcgbWludXRpJywgbnVtYmVyICsgJyBtaW51dGl0J10sXG4gICAgICAgICAgICBoOiBbJ8O8aGUgdHVubmknLCAndHVuZCBhZWdhJywgJ8O8a3MgdHVuZCddLFxuICAgICAgICAgICAgaGg6IFtudW1iZXIgKyAnIHR1bm5pJywgbnVtYmVyICsgJyB0dW5kaSddLFxuICAgICAgICAgICAgZDogWyfDvGhlIHDDpGV2YScsICfDvGtzIHDDpGV2J10sXG4gICAgICAgICAgICBNOiBbJ2t1dSBhamEnLCAna3V1IGFlZ2EnLCAnw7xrcyBrdXUnXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyBrdXUnLCBudW1iZXIgKyAnIGt1dWQnXSxcbiAgICAgICAgICAgIHk6IFsnw7xoZSBhYXN0YScsICdhYXN0YScsICfDvGtzIGFhc3RhJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgYWFzdGEnLCBudW1iZXIgKyAnIGFhc3RhdCddLFxuICAgICAgICB9O1xuICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFtrZXldWzJdID8gZm9ybWF0W2tleV1bMl0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBldCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2V0Jywge1xuICAgICAgICBtb250aHM6ICdqYWFudWFyX3ZlZWJydWFyX23DpHJ0c19hcHJpbGxfbWFpX2p1dW5pX2p1dWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b29iZXJfbm92ZW1iZXJfZGV0c2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYWFuX3ZlZWJyX23DpHJ0c19hcHJfbWFpX2p1dW5pX2p1dWxpX2F1Z19zZXB0X29rdF9ub3ZfZGV0cycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAncMO8aGFww6Rldl9lc21hc3DDpGV2X3RlaXNpcMOkZXZfa29sbWFww6Rldl9uZWxqYXDDpGV2X3JlZWRlX2xhdXDDpGV2Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdQX0VfVF9LX05fUl9MJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1BfRV9UX0tfTl9SX0wnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUw6RuYSxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbSG9tbWUsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tKw6RyZ21pbmVdIGRkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tFaWxlLF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbRWVsbWluZV0gZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHDDpHJhc3QnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHRhZ2FzaScsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6ICclZCBww6RldmEnLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGV0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJhc3F1ZSBbZXVdXG4vLyEgYXV0aG9yIDogRW5la28gSWxsYXJyYW1lbmRpIDogaHR0cHM6Ly9naXRodWIuY29tL2VpbGxhcnJhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZXUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdldScsIHtcbiAgICAgICAgbW9udGhzOiAndXJ0YXJyaWxhX290c2FpbGFfbWFydHhvYV9hcGlyaWxhX21haWF0emFfZWthaW5hX3V6dGFpbGFfYWJ1enR1YV9pcmFpbGFfdXJyaWFfYXphcm9hX2FiZW5kdWEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ3VydC5fb3RzLl9tYXIuX2FwaS5fbWFpLl9la2EuX3V6dC5fYWJ1Ll9pcmEuX3Vyci5fYXphLl9hYmUuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ2lnYW5kZWFfYXN0ZWxlaGVuYV9hc3RlYXJ0ZWFfYXN0ZWF6a2VuYV9vc3RlZ3VuYV9vc3RpcmFsYV9sYXJ1bmJhdGEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2lnLl9hbC5fYXIuX2F6Ll9vZy5fb2wuX2xyLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdpZ19hbF9hcl9hel9vZ19vbF9scicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVlba29dIE1NTU1bcmVuXSBEW2FdJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVlba29dIE1NTU1bcmVuXSBEW2FdIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBZWVlZW2tvXSBNTU1NW3Jlbl0gRFthXSBISDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS1NLUQnLFxuICAgICAgICAgICAgbGw6ICdZWVlZW2tvXSBNTU0gRFthXScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZW2tvXSBNTU0gRFthXSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBZWVlZW2tvXSBNTU0gRFthXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2dhdXJdIExUW2V0YW5dJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbYmloYXJdIExUW2V0YW5dJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVFtldGFuXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2F0em9dIExUW2V0YW5dJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2F1cnJla29dIGRkZGQgTFRbZXRhbl0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBiYXJydScsXG4gICAgICAgICAgICBwYXN0OiAnZHVlbGEgJXMnLFxuICAgICAgICAgICAgczogJ3NlZ3VuZG8gYmF0enVrJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kbycsXG4gICAgICAgICAgICBtOiAnbWludXR1IGJhdCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0dScsXG4gICAgICAgICAgICBoOiAnb3JkdSBiYXQnLFxuICAgICAgICAgICAgaGg6ICclZCBvcmR1JyxcbiAgICAgICAgICAgIGQ6ICdlZ3VuIGJhdCcsXG4gICAgICAgICAgICBkZDogJyVkIGVndW4nLFxuICAgICAgICAgICAgTTogJ2hpbGFiZXRlIGJhdCcsXG4gICAgICAgICAgICBNTTogJyVkIGhpbGFiZXRlJyxcbiAgICAgICAgICAgIHk6ICd1cnRlIGJhdCcsXG4gICAgICAgICAgICB5eTogJyVkIHVydGUnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGV1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFBlcnNpYW4gW2ZhXVxuLy8hIGF1dGhvciA6IEVicmFoaW0gQnlhZ293aSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9lYnJhbWluaW9cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn27EnLFxuICAgICAgICAgICAgMjogJ9uyJyxcbiAgICAgICAgICAgIDM6ICfbsycsXG4gICAgICAgICAgICA0OiAn27QnLFxuICAgICAgICAgICAgNTogJ9u1JyxcbiAgICAgICAgICAgIDY6ICfbticsXG4gICAgICAgICAgICA3OiAn27cnLFxuICAgICAgICAgICAgODogJ9u4JyxcbiAgICAgICAgICAgIDk6ICfbuScsXG4gICAgICAgICAgICAwOiAn27AnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn27EnOiAnMScsXG4gICAgICAgICAgICAn27InOiAnMicsXG4gICAgICAgICAgICAn27MnOiAnMycsXG4gICAgICAgICAgICAn27QnOiAnNCcsXG4gICAgICAgICAgICAn27UnOiAnNScsXG4gICAgICAgICAgICAn27YnOiAnNicsXG4gICAgICAgICAgICAn27cnOiAnNycsXG4gICAgICAgICAgICAn27gnOiAnOCcsXG4gICAgICAgICAgICAn27knOiAnOScsXG4gICAgICAgICAgICAn27AnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgZmEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmYScsIHtcbiAgICAgICAgbW9udGhzOiAn2pjYp9mG2YjbjNmHX9mB2YjYsduM2Ydf2YXYp9ix2LNf2KLZiNix24zZhF/ZhdmHX9qY2YjYptmGX9qY2YjYptuM2Ydf2KfZiNiqX9iz2b7Yqtin2YXYqNixX9in2qnYqtio2LFf2YbZiNin2YXYqNixX9iv2LPYp9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2pjYp9mG2YjbjNmHX9mB2YjYsduM2Ydf2YXYp9ix2LNf2KLZiNix24zZhF/ZhdmHX9qY2YjYptmGX9qY2YjYptuM2Ydf2KfZiNiqX9iz2b7Yqtin2YXYqNixX9in2qnYqtio2LFf2YbZiNin2YXYqNixX9iv2LPYp9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfbjNqpXFx1MjAwY9i02YbYqNmHX9iv2YjYtNmG2KjZh1/Ys9mHXFx1MjAwY9i02YbYqNmHX9qG2YfYp9ix2LTZhtio2Ydf2b7ZhtisXFx1MjAwY9i02YbYqNmHX9is2YXYudmHX9i02YbYqNmHJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6XG4gICAgICAgICAgICAn24zaqVxcdTIwMGPYtNmG2KjZh1/Yr9mI2LTZhtio2Ydf2LPZh1xcdTIwMGPYtNmG2KjZh1/ahtmH2KfYsdi02YbYqNmHX9m+2YbYrFxcdTIwMGPYtNmG2KjZh1/YrNmF2LnZh1/YtNmG2KjZhycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9uMX9ivX9izX9qGX9m+X9isX9i0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9mC2KjZhCDYp9iyINi42YfYsXzYqNi52K8g2KfYsiDYuNmH2LEvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAv2KjYudivINin2LIg2LjZh9ixLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mC2KjZhCDYp9iyINi42YfYsSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2KjYudivINin2LIg2LjZh9ixJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhdix2YjYsiDYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vZgdix2K/YpyDYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYr9uM2LHZiNiyINiz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9m+24zYtF0gW9iz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9iv2LEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzINm+24zYtCcsXG4gICAgICAgICAgICBzOiAn2obZhtivINir2KfZhtuM2YcnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbbjNmHJyxcbiAgICAgICAgICAgIG06ICfbjNqpINiv2YLbjNmC2YcnLFxuICAgICAgICAgICAgbW06ICclZCDYr9mC24zZgtmHJyxcbiAgICAgICAgICAgIGg6ICfbjNqpINiz2KfYudiqJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KonLFxuICAgICAgICAgICAgZDogJ9uM2qkg2LHZiNiyJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2LHZiNiyJyxcbiAgICAgICAgICAgIE06ICfbjNqpINmF2KfZhycsXG4gICAgICAgICAgICBNTTogJyVkINmF2KfZhycsXG4gICAgICAgICAgICB5OiAn24zaqSDYs9in2YQnLFxuICAgICAgICAgICAgeXk6ICclZCDYs9in2YQnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b27At27ldL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ92YUvLFxuICAgICAgICBvcmRpbmFsOiAnJWTZhScsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRmlubmlzaCBbZmldXG4vLyEgYXV0aG9yIDogVGFybW8gQWlkYW50YXVzdGEgOiBodHRwczovL2dpdGh1Yi5jb20vYmxlYWRvZlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG51bWJlcnNQYXN0ID1cbiAgICAgICAgICAgICdub2xsYSB5a3NpIGtha3NpIGtvbG1lIG5lbGrDpCB2aWlzaSBrdXVzaSBzZWl0c2Vtw6RuIGthaGRla3NhbiB5aGRla3PDpG4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICcgJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbnVtYmVyc0Z1dHVyZSA9IFtcbiAgICAgICAgICAgICdub2xsYScsXG4gICAgICAgICAgICAneWhkZW4nLFxuICAgICAgICAgICAgJ2thaGRlbicsXG4gICAgICAgICAgICAna29sbWVuJyxcbiAgICAgICAgICAgICduZWxqw6RuJyxcbiAgICAgICAgICAgICd2aWlkZW4nLFxuICAgICAgICAgICAgJ2t1dWRlbicsXG4gICAgICAgICAgICBudW1iZXJzUGFzdFs3XSxcbiAgICAgICAgICAgIG51bWJlcnNQYXN0WzhdLFxuICAgICAgICAgICAgbnVtYmVyc1Bhc3RbOV0sXG4gICAgICAgIF07XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAnbXV1dGFtYW4gc2VrdW5uaW4nIDogJ211dXRhbWEgc2VrdW50aSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAnc2VrdW5uaW4nIDogJ3Nla3VudGlhJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdtaW51dXRpbicgOiAnbWludXV0dGknO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ21pbnV1dGluJyA6ICdtaW51dXR0aWEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ3R1bm5pbicgOiAndHVudGknO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ3R1bm5pbicgOiAndHVudGlhJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdww6RpdsOkbicgOiAncMOkaXbDpCc7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAncMOkaXbDpG4nIDogJ3DDpGl2w6TDpCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAna3V1a2F1ZGVuJyA6ICdrdXVrYXVzaSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAna3V1a2F1ZGVuJyA6ICdrdXVrYXV0dGEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ3Z1b2RlbicgOiAndnVvc2knO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ3Z1b2RlbicgOiAndnVvdHRhJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB2ZXJiYWxOdW1iZXIobnVtYmVyLCBpc0Z1dHVyZSkgKyAnICcgKyByZXN1bHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZlcmJhbE51bWJlcihudW1iZXIsIGlzRnV0dXJlKSB7XG4gICAgICAgIHJldHVybiBudW1iZXIgPCAxMFxuICAgICAgICAgICAgPyBpc0Z1dHVyZVxuICAgICAgICAgICAgICAgID8gbnVtYmVyc0Z1dHVyZVtudW1iZXJdXG4gICAgICAgICAgICAgICAgOiBudW1iZXJzUGFzdFtudW1iZXJdXG4gICAgICAgICAgICA6IG51bWJlcjtcbiAgICB9XG5cbiAgICB2YXIgZmkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmaScsIHtcbiAgICAgICAgbW9udGhzOiAndGFtbWlrdXVfaGVsbWlrdXVfbWFhbGlza3V1X2h1aHRpa3V1X3RvdWtva3V1X2tlc8Oka3V1X2hlaW7DpGt1dV9lbG9rdXVfc3l5c2t1dV9sb2tha3V1X21hcnJhc2t1dV9qb3VsdWt1dScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAndGFtbWlfaGVsbWlfbWFhbGlzX2h1aHRpX3RvdWtvX2tlc8OkX2hlaW7DpF9lbG9fc3l5c19sb2thX21hcnJhc19qb3VsdScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdzdW5udW50YWlfbWFhbmFudGFpX3RpaXN0YWlfa2Vza2l2aWlra29fdG9yc3RhaV9wZXJqYW50YWlfbGF1YW50YWknLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3N1X21hX3RpX2tlX3RvX3BlX2xhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3N1X21hX3RpX2tlX3RvX3BlX2xhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0RvIE1NTU1bdGFdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRG8gTU1NTVt0YV0gWVlZWSwgW2tsb10gSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIERvIE1NTU1bdGFdIFlZWVksIFtrbG9dIEhILm1tJyxcbiAgICAgICAgICAgIGw6ICdELk0uWVlZWScsXG4gICAgICAgICAgICBsbDogJ0RvIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIGxsbDogJ0RvIE1NTSBZWVlZLCBba2xvXSBISC5tbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBEbyBNTU0gWVlZWSwgW2tsb10gSEgubW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1t0w6Ruw6TDpG5dIFtrbG9dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbaHVvbWVubmFdIFtrbG9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBba2xvXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2VpbGVuXSBba2xvXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1t2aWltZV0gZGRkZFtuYV0gW2tsb10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBww6TDpHN0w6QnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHNpdHRlbicsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRmlsaXBpbm8gW2ZpbF1cbi8vISBhdXRob3IgOiBEYW4gSGFnbWFuIDogaHR0cHM6Ly9naXRodWIuY29tL2hhZ21hbmRhblxuLy8hIGF1dGhvciA6IE1hdHRoZXcgQ28gOiBodHRwczovL2dpdGh1Yi5jb20vbWF0dGhld2RlZWNvXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZmlsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZmlsJywge1xuICAgICAgICBtb250aHM6ICdFbmVyb19QZWJyZXJvX01hcnNvX0FicmlsX01heW9fSHVueW9fSHVseW9fQWdvc3RvX1NldHllbWJyZV9Pa3R1YnJlX05vYnllbWJyZV9EaXN5ZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnRW5lX1BlYl9NYXJfQWJyX01heV9IdW5fSHVsX0Fnb19TZXRfT2t0X05vYl9EaXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnTGluZ2dvX0x1bmVzX01hcnRlc19NaXllcmt1bGVzX0h1d2ViZXNfQml5ZXJuZXNfU2FiYWRvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnTGluX0x1bl9NYXJfTWl5X0h1d19CaXlfU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0xpX0x1X01hX01pX0h1X0JpX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ01NL0QvWVlZWScsXG4gICAgICAgICAgICBMTDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIEQsIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gREQsIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ0xUIFtuZ2F5b25nIGFyYXddJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQnVrYXMgbmddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnTFQgW3NhIHN1c3Vub2QgbmFdIGRkZGQnLFxuICAgICAgICAgICAgbGFzdERheTogJ0xUIFtrYWhhcG9uXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ0xUIFtub29uZyBuYWthcmFhbmddIGRkZGQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdzYSBsb29iIG5nICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhbmcgbmFrYWxpcGFzJyxcbiAgICAgICAgICAgIHM6ICdpbGFuZyBzZWd1bmRvJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kbycsXG4gICAgICAgICAgICBtOiAnaXNhbmcgbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvJyxcbiAgICAgICAgICAgIGg6ICdpc2FuZyBvcmFzJyxcbiAgICAgICAgICAgIGhoOiAnJWQgb3JhcycsXG4gICAgICAgICAgICBkOiAnaXNhbmcgYXJhdycsXG4gICAgICAgICAgICBkZDogJyVkIGFyYXcnLFxuICAgICAgICAgICAgTTogJ2lzYW5nIGJ1d2FuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgYnV3YW4nLFxuICAgICAgICAgICAgeTogJ2lzYW5nIHRhb24nLFxuICAgICAgICAgICAgeXk6ICclZCB0YW9uJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGYXJvZXNlIFtmb11cbi8vISBhdXRob3IgOiBSYWduYXIgSm9oYW5uZXNlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYWduYXIxMjNcbi8vISBhdXRob3IgOiBLcmlzdGlhbiBTYWthcmlzc29uIDogaHR0cHM6Ly9naXRodWIuY29tL3Nha2FyaXNzb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBmbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZvJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJzX2FwcsOtbF9tYWlfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcl9hcHJfbWFpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnc3VubnVkYWd1cl9tw6FuYWRhZ3VyX3TDvXNkYWd1cl9taWt1ZGFndXJfaMOzc2RhZ3VyX2Zyw61nZ2phZGFndXJfbGV5Z2FyZGFndXInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3N1bl9tw6FuX3TDvXNfbWlrX2jDs3NfZnLDrV9sZXknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc3VfbcOhX3TDvV9taV9ow7NfZnJfbGUnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSwgWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW8ONIGRhZyBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbw40gbW9yZ2luIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbw40gZ2rDoXIga2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tzw63DsHN0dV0gZGRkZCBba2xdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAndW0gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHPDrcOwYW5pJyxcbiAgICAgICAgICAgIHM6ICdmw6Egc2VrdW5kJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kaXInLFxuICAgICAgICAgICAgbTogJ2VpbiBtaW51dHR1cicsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0dGlyJyxcbiAgICAgICAgICAgIGg6ICdlaW4gdMOtbWknLFxuICAgICAgICAgICAgaGg6ICclZCB0w61tYXInLFxuICAgICAgICAgICAgZDogJ2VpbiBkYWd1cicsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2FyJyxcbiAgICAgICAgICAgIE06ICdlaW4gbcOhbmHDsHVyJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOhbmHDsGlyJyxcbiAgICAgICAgICAgIHk6ICdlaXR0IMOhcicsXG4gICAgICAgICAgICB5eTogJyVkIMOhcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZm87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRnJlbmNoIChDYW5hZGEpIFtmci1jYV1cbi8vISBhdXRob3IgOiBKb25hdGhhbiBBYm91cmJpaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb25iY2FcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBmckNhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZnItY2EnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnZpZXJfZsOpdnJpZXJfbWFyc19hdnJpbF9tYWlfanVpbl9qdWlsbGV0X2Fvw7t0X3NlcHRlbWJyZV9vY3RvYnJlX25vdmVtYnJlX2TDqWNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFudi5fZsOpdnIuX21hcnNfYXZyLl9tYWlfanVpbl9qdWlsLl9hb8O7dF9zZXB0Ll9vY3QuX25vdi5fZMOpYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdkaW1hbmNoZV9sdW5kaV9tYXJkaV9tZXJjcmVkaV9qZXVkaV92ZW5kcmVkaV9zYW1lZGknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkaW0uX2x1bi5fbWFyLl9tZXIuX2pldS5fdmVuLl9zYW0uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RpX2x1X21hX21lX2plX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tBdWpvdXJk4oCZaHVpIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0RlbWFpbiDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2Rlcm5pZXIgw6BdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFucyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaWwgeSBhICVzJyxcbiAgICAgICAgICAgIHM6ICdxdWVscXVlcyBzZWNvbmRlcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGVzJyxcbiAgICAgICAgICAgIG06ICd1bmUgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAndW5lIGhldXJlJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaGV1cmVzJyxcbiAgICAgICAgICAgIGQ6ICd1biBqb3VyJyxcbiAgICAgICAgICAgIGRkOiAnJWQgam91cnMnLFxuICAgICAgICAgICAgTTogJ3VuIG1vaXMnLFxuICAgICAgICAgICAgTU06ICclZCBtb2lzJyxcbiAgICAgICAgICAgIHk6ICd1biBhbicsXG4gICAgICAgICAgICB5eTogJyVkIGFucycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShlcnxlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIG1hc2N1bGluZSBncmFtbWF0aWNhbCBnZW5kZXI6IG1vaXMsIHRyaW1lc3RyZSwgam91clxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJ2UnKTtcblxuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggZmVtaW5pbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBzZW1haW5lXG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ3JlJyA6ICdlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnJDYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGcmVuY2ggKFN3aXR6ZXJsYW5kKSBbZnItY2hdXG4vLyEgYXV0aG9yIDogR2FzcGFyZCBCdWNoZXIgOiBodHRwczovL2dpdGh1Yi5jb20vZ2FzcGFyZFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGZyQ2ggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmci1jaCcsIHtcbiAgICAgICAgbW9udGhzOiAnamFudmllcl9mw6l2cmllcl9tYXJzX2F2cmlsX21haV9qdWluX2p1aWxsZXRfYW/Du3Rfc2VwdGVtYnJlX29jdG9icmVfbm92ZW1icmVfZMOpY2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW52Ll9mw6l2ci5fbWFyc19hdnIuX21haV9qdWluX2p1aWwuX2Fvw7t0X3NlcHQuX29jdC5fbm92Ll9kw6ljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2RpbWFuY2hlX2x1bmRpX21hcmRpX21lcmNyZWRpX2pldWRpX3ZlbmRyZWRpX3NhbWVkaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RpbS5fbHVuLl9tYXIuX21lci5famV1Ll92ZW4uX3NhbS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGlfbHVfbWFfbWVfamVfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0F1am91cmTigJlodWkgw6BdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRGVtYWluIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8OgXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0hpZXIgw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZGVybmllciDDoF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkYW5zICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdpbCB5IGEgJXMnLFxuICAgICAgICAgICAgczogJ3F1ZWxxdWVzIHNlY29uZGVzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kZXMnLFxuICAgICAgICAgICAgbTogJ3VuZSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICd1bmUgaGV1cmUnLFxuICAgICAgICAgICAgaGg6ICclZCBoZXVyZXMnLFxuICAgICAgICAgICAgZDogJ3VuIGpvdXInLFxuICAgICAgICAgICAgZGQ6ICclZCBqb3VycycsXG4gICAgICAgICAgICBNOiAndW4gbW9pcycsXG4gICAgICAgICAgICBNTTogJyVkIG1vaXMnLFxuICAgICAgICAgICAgeTogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGVyfGUpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggbWFzY3VsaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogbW9pcywgdHJpbWVzdHJlLCBqb3VyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdlcicgOiAnZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBmZW1pbmluZSBncmFtbWF0aWNhbCBnZW5kZXI6IHNlbWFpbmVcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAncmUnIDogJ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZyQ2g7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRnJlbmNoIFtmcl1cbi8vISBhdXRob3IgOiBKb2huIEZpc2NoZXIgOiBodHRwczovL2dpdGh1Yi5jb20vamZyb2ZmaWNlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU3RyaWN0UmVnZXggPVxuICAgICAgICAgICAgL14oamFudmllcnxmw6l2cmllcnxtYXJzfGF2cmlsfG1haXxqdWlufGp1aWxsZXR8YW/Du3R8c2VwdGVtYnJlfG9jdG9icmV8bm92ZW1icmV8ZMOpY2VtYnJlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4ID1cbiAgICAgICAgICAgIC8oamFudlxcLj98ZsOpdnJcXC4/fG1hcnN8YXZyXFwuP3xtYWl8anVpbnxqdWlsXFwuP3xhb8O7dHxzZXB0XFwuP3xvY3RcXC4/fG5vdlxcLj98ZMOpY1xcLj8pL2ksXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC8oamFudlxcLj98ZsOpdnJcXC4/fG1hcnN8YXZyXFwuP3xtYWl8anVpbnxqdWlsXFwuP3xhb8O7dHxzZXB0XFwuP3xvY3RcXC4/fG5vdlxcLj98ZMOpY1xcLj98amFudmllcnxmw6l2cmllcnxtYXJzfGF2cmlsfG1haXxqdWlufGp1aWxsZXR8YW/Du3R8c2VwdGVtYnJlfG9jdG9icmV8bm92ZW1icmV8ZMOpY2VtYnJlKS9pLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eamFudi9pLFxuICAgICAgICAgICAgL15mw6l2ci9pLFxuICAgICAgICAgICAgL15tYXJzL2ksXG4gICAgICAgICAgICAvXmF2ci9pLFxuICAgICAgICAgICAgL15tYWkvaSxcbiAgICAgICAgICAgIC9eanVpbi9pLFxuICAgICAgICAgICAgL15qdWlsL2ksXG4gICAgICAgICAgICAvXmFvw7t0L2ksXG4gICAgICAgICAgICAvXnNlcHQvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kw6ljL2ksXG4gICAgICAgIF07XG5cbiAgICB2YXIgZnIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmcicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudmllcl9mw6l2cmllcl9tYXJzX2F2cmlsX21haV9qdWluX2p1aWxsZXRfYW/Du3Rfc2VwdGVtYnJlX29jdG9icmVfbm92ZW1icmVfZMOpY2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW52Ll9mw6l2ci5fbWFyc19hdnIuX21haV9qdWluX2p1aWwuX2Fvw7t0X3NlcHQuX29jdC5fbm92Ll9kw6ljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDogbW9udGhzU3RyaWN0UmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6IG1vbnRoc1Nob3J0U3RyaWN0UmVnZXgsXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOiAnZGltYW5jaGVfbHVuZGlfbWFyZGlfbWVyY3JlZGlfamV1ZGlfdmVuZHJlZGlfc2FtZWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGltLl9sdW4uX21hci5fbWVyLl9qZXUuX3Zlbi5fc2FtLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkaV9sdV9tYV9tZV9qZV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQXVqb3VyZOKAmWh1aSDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tEZW1haW4gw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSGllciDDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtkZXJuaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhbnMgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2lsIHkgYSAlcycsXG4gICAgICAgICAgICBzOiAncXVlbHF1ZXMgc2Vjb25kZXMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRlcycsXG4gICAgICAgICAgICBtOiAndW5lIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ3VuZSBoZXVyZScsXG4gICAgICAgICAgICBoaDogJyVkIGhldXJlcycsXG4gICAgICAgICAgICBkOiAndW4gam91cicsXG4gICAgICAgICAgICBkZDogJyVkIGpvdXJzJyxcbiAgICAgICAgICAgIHc6ICd1bmUgc2VtYWluZScsXG4gICAgICAgICAgICB3dzogJyVkIHNlbWFpbmVzJyxcbiAgICAgICAgICAgIE06ICd1biBtb2lzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9pcycsXG4gICAgICAgICAgICB5OiAndW4gYW4nLFxuICAgICAgICAgICAgeXk6ICclZCBhbnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZXJ8KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXR1cm4gJ2UnIHdoZW4gZGF5IG9mIG1vbnRoID4gMS4gTW92ZSB0aGlzIGNhc2UgaW5zaWRlXG4gICAgICAgICAgICAgICAgLy8gYmxvY2sgZm9yIG1hc2N1bGluZSB3b3JkcyBiZWxvdy5cbiAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzMzNzVcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJycpO1xuXG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBtYXNjdWxpbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBtb2lzLCB0cmltZXN0cmUsIGpvdXJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ2VyJyA6ICdlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIGZlbWluaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogc2VtYWluZVxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdyZScgOiAnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRnJpc2lhbiBbZnldXG4vLyEgYXV0aG9yIDogUm9iaW4gdmFuIGRlciBWbGlldCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JpbjB2YW4wZGVyMHZcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTaG9ydFdpdGhEb3RzID1cbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbXJ0Ll9hcHIuX21haV9qdW4uX2p1bC5fYXVnLl9zZXAuX29rdC5fbm92Ll9kZXMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydFdpdGhvdXREb3RzID1cbiAgICAgICAgICAgICdqYW5fZmViX21ydF9hcHJfbWFpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2Rlcycuc3BsaXQoJ18nKTtcblxuICAgIHZhciBmeSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2Z5Jywge1xuICAgICAgICBtb250aHM6ICdqYW5uZXdhcmlzX2ZlYnJld2FyaXNfbWFhcnRfYXByaWxfbWFhaWVfanVueV9qdWx5X2F1Z3VzdHVzX3NlcHRpbWJlcl9va3RvYmVyX25vdmltYmVyX2Rlc2ltYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aG91dERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdzbmVpbl9tb2FuZGVpX3RpaXNkZWlfd29hbnNkZWlfdG9uZ2Vyc2RlaV9mcmVlZF9zbmVvbicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3NpLl9tby5fdGkuX3dvLl90by5fZnIuX3NvLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTaV9Nb19UaV9Xb19Ub19Gcl9Tbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQtTU0tWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaGpvZWQgb21dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9hcm4gb21dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbanVzdGVyIG9tXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vDtGZyw7tuZV0gZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb2VyICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBseW4nLFxuICAgICAgICAgICAgczogJ2luIHBlYXIgc2Vrb25kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBzZWtvbmRlbicsXG4gICAgICAgICAgICBtOiAnaWVuIG1pbsO6dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZW4nLFxuICAgICAgICAgICAgaDogJ2llbiBvZXJlJyxcbiAgICAgICAgICAgIGhoOiAnJWQgb2VyZW4nLFxuICAgICAgICAgICAgZDogJ2llbiBkZWknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdlbicsXG4gICAgICAgICAgICBNOiAnaWVuIG1vYW5uZScsXG4gICAgICAgICAgICBNTTogJyVkIG1vYW5uZW4nLFxuICAgICAgICAgICAgeTogJ2llbiBqaWVyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgamllcnJlbicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdGV8ZGUpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBudW1iZXIgK1xuICAgICAgICAgICAgICAgIChudW1iZXIgPT09IDEgfHwgbnVtYmVyID09PSA4IHx8IG51bWJlciA+PSAyMCA/ICdzdGUnIDogJ2RlJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmeTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBJcmlzaCBvciBJcmlzaCBHYWVsaWMgW2dhXVxuLy8hIGF1dGhvciA6IEFuZHLDqSBTaWx2YSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hc2twdFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9IFtcbiAgICAgICAgICAgICdFYW7DoWlyJyxcbiAgICAgICAgICAgICdGZWFiaHJhJyxcbiAgICAgICAgICAgICdNw6FydGEnLFxuICAgICAgICAgICAgJ0FpYnJlw6FuJyxcbiAgICAgICAgICAgICdCZWFsdGFpbmUnLFxuICAgICAgICAgICAgJ01laXRoZWFtaCcsXG4gICAgICAgICAgICAnScO6aWwnLFxuICAgICAgICAgICAgJ0zDum5hc2EnLFxuICAgICAgICAgICAgJ01lw6FuIEbDs21oYWlyJyxcbiAgICAgICAgICAgICdEZWlyZWFkaCBGw7NtaGFpcicsXG4gICAgICAgICAgICAnU2FtaGFpbicsXG4gICAgICAgICAgICAnTm9sbGFpZycsXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gW1xuICAgICAgICAgICAgJ0VhbicsXG4gICAgICAgICAgICAnRmVhYmgnLFxuICAgICAgICAgICAgJ03DoXJ0JyxcbiAgICAgICAgICAgICdBaWInLFxuICAgICAgICAgICAgJ0JlYWwnLFxuICAgICAgICAgICAgJ01laXRoJyxcbiAgICAgICAgICAgICdJw7ppbCcsXG4gICAgICAgICAgICAnTMO6bicsXG4gICAgICAgICAgICAnTS5GLicsXG4gICAgICAgICAgICAnRC5GLicsXG4gICAgICAgICAgICAnU2FtaCcsXG4gICAgICAgICAgICAnTm9sbCcsXG4gICAgICAgIF0sXG4gICAgICAgIHdlZWtkYXlzID0gW1xuICAgICAgICAgICAgJ0TDqSBEb21obmFpZ2gnLFxuICAgICAgICAgICAgJ0TDqSBMdWFpbicsXG4gICAgICAgICAgICAnRMOpIE3DoWlydCcsXG4gICAgICAgICAgICAnRMOpIEPDqWFkYW9pbicsXG4gICAgICAgICAgICAnRMOpYXJkYW9pbicsXG4gICAgICAgICAgICAnRMOpIGhBb2luZScsXG4gICAgICAgICAgICAnRMOpIFNhdGhhaXJuJyxcbiAgICAgICAgXSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA9IFsnRG9taCcsICdMdWFuJywgJ03DoWlydCcsICdDw6lhZCcsICdEw6lhcicsICdBb2luZScsICdTYXRoJ10sXG4gICAgICAgIHdlZWtkYXlzTWluID0gWydEbycsICdMdScsICdNw6EnLCAnQ8OpJywgJ0TDqScsICdBJywgJ1NhJ107XG5cbiAgICB2YXIgZ2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdnYScsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHNTaG9ydCxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6IHdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiB3ZWVrZGF5c1Nob3J0LFxuICAgICAgICB3ZWVrZGF5c01pbjogd2Vla2RheXNNaW4sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSW5uaXUgYWddIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQW3DoXJhY2ggYWddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYWddIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSW5uw6kgYWddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbc2VvIGNhaXRlXSBbYWddIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgw7Mgc2hpbicsXG4gICAgICAgICAgICBzOiAnY8O6cGxhIHNvaWNpbmQnLFxuICAgICAgICAgICAgc3M6ICclZCBzb2ljaW5kJyxcbiAgICAgICAgICAgIG06ICduw7NpbcOpYWQnLFxuICAgICAgICAgICAgbW06ICclZCBuw7NpbcOpYWQnLFxuICAgICAgICAgICAgaDogJ3VhaXIgYW4gY2hsb2lnJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdWFpciBhbiBjaGxvaWcnLFxuICAgICAgICAgICAgZDogJ2zDoScsXG4gICAgICAgICAgICBkZDogJyVkIGzDoScsXG4gICAgICAgICAgICBNOiAnbcOtJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOtb25uYScsXG4gICAgICAgICAgICB5OiAnYmxpYWluJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYmxpYWluJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGR8bmF8bWgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IG51bWJlciA9PT0gMSA/ICdkJyA6IG51bWJlciAlIDEwID09PSAyID8gJ25hJyA6ICdtaCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ2E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2NvdHRpc2ggR2FlbGljIFtnZF1cbi8vISBhdXRob3IgOiBKb24gQXNoZG93biA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb25hc2hkb3duXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ0FtIEZhb2lsbGVhY2gnLFxuICAgICAgICAgICAgJ0FuIEdlYXJyYW4nLFxuICAgICAgICAgICAgJ0FtIE3DoHJ0JyxcbiAgICAgICAgICAgICdBbiBHaWJsZWFuJyxcbiAgICAgICAgICAgICdBbiBDw6hpdGVhbicsXG4gICAgICAgICAgICAnQW4gdC3DkmdtaGlvcycsXG4gICAgICAgICAgICAnQW4gdC1JdWNoYXInLFxuICAgICAgICAgICAgJ0FuIEzDuW5hc3RhbCcsXG4gICAgICAgICAgICAnQW4gdC1TdWx0YWluJyxcbiAgICAgICAgICAgICdBbiBEw6BtaGFpcicsXG4gICAgICAgICAgICAnQW4gdC1TYW1oYWluJyxcbiAgICAgICAgICAgICdBbiBEw7liaGxhY2hkJyxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSBbXG4gICAgICAgICAgICAnRmFvaScsXG4gICAgICAgICAgICAnR2VhcicsXG4gICAgICAgICAgICAnTcOgcnQnLFxuICAgICAgICAgICAgJ0dpYmwnLFxuICAgICAgICAgICAgJ0PDqGl0JyxcbiAgICAgICAgICAgICfDkmdtaCcsXG4gICAgICAgICAgICAnSXVjaCcsXG4gICAgICAgICAgICAnTMO5bicsXG4gICAgICAgICAgICAnU3VsdCcsXG4gICAgICAgICAgICAnRMOgbWgnLFxuICAgICAgICAgICAgJ1NhbWgnLFxuICAgICAgICAgICAgJ0TDuWJoJyxcbiAgICAgICAgXSxcbiAgICAgICAgd2Vla2RheXMgPSBbXG4gICAgICAgICAgICAnRGlkw7JtaG5haWNoJyxcbiAgICAgICAgICAgICdEaWx1YWluJyxcbiAgICAgICAgICAgICdEaW3DoGlydCcsXG4gICAgICAgICAgICAnRGljaWFkYWluJyxcbiAgICAgICAgICAgICdEaWFyZGFvaW4nLFxuICAgICAgICAgICAgJ0RpaGFvaW5lJyxcbiAgICAgICAgICAgICdEaXNhdGhhaXJuZScsXG4gICAgICAgIF0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgPSBbJ0RpZCcsICdEaWwnLCAnRGltJywgJ0RpYycsICdEaWEnLCAnRGloJywgJ0RpcyddLFxuICAgICAgICB3ZWVrZGF5c01pbiA9IFsnRMOyJywgJ0x1JywgJ03DoCcsICdDaScsICdBcicsICdIYScsICdTYSddO1xuXG4gICAgdmFyIGdkID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ2QnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzU2hvcnQsXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogd2Vla2RheXNTaG9ydCxcbiAgICAgICAgd2Vla2RheXNNaW46IHdlZWtkYXlzTWluLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0FuLWRpdWdoIGFpZ10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBLW3DoGlyZWFjaCBhaWddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYWlnXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0FuLWTDqCBhaWddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbc2VvIGNoYWlkaF0gW2FpZ10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdhbm4gYW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2JobyBjaGlvbm4gJXMnLFxuICAgICAgICAgICAgczogJ2JlYWdhbiBkaW9nYW4nLFxuICAgICAgICAgICAgc3M6ICclZCBkaW9nYW4nLFxuICAgICAgICAgICAgbTogJ21pb25haWQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW9uYWlkZWFuJyxcbiAgICAgICAgICAgIGg6ICd1YWlyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdWFpcmVhbicsXG4gICAgICAgICAgICBkOiAnbGF0aGEnLFxuICAgICAgICAgICAgZGQ6ICclZCBsYXRoYScsXG4gICAgICAgICAgICBNOiAnbcOsb3MnLFxuICAgICAgICAgICAgTU06ICclZCBtw6xvc2FuJyxcbiAgICAgICAgICAgIHk6ICdibGlhZGhuYScsXG4gICAgICAgICAgICB5eTogJyVkIGJsaWFkaG5hJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGR8bmF8bWgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IG51bWJlciA9PT0gMSA/ICdkJyA6IG51bWJlciAlIDEwID09PSAyID8gJ25hJyA6ICdtaCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ2Q7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR2FsaWNpYW4gW2dsXVxuLy8hIGF1dGhvciA6IEp1YW4gRy4gSHVydGFkbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qdWFuZ2h1cnRhZG9cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBnbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2dsJywge1xuICAgICAgICBtb250aHM6ICd4YW5laXJvX2ZlYnJlaXJvX21hcnpvX2FicmlsX21haW9feHXDsW9feHVsbG9fYWdvc3RvX3NldGVtYnJvX291dHVicm9fbm92ZW1icm9fZGVjZW1icm8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ3hhbi5fZmViLl9tYXIuX2Fici5fbWFpLl94dcOxLl94dWwuX2Fnby5fc2V0Ll9vdXQuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWluZ29fbHVuc19tYXJ0ZXNfbcOpcmNvcmVzX3hvdmVzX3ZlbnJlc19zw6FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tLl9sdW4uX21hci5fbcOpci5feG92Ll92ZW4uX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX23DqV94b192ZV9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG94ZSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICfDoXMnIDogJ8OhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7HDoSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICfDoXMnIDogJ8OhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgWycgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ8OhcycgOiAnYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tvbnRlICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ8OhJyA6ICdhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW29dIGRkZGQgW3Bhc2FkbyAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICfDoXMnIDogJ2EnKSArICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ3VuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICduJyArIHN0cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlbiAnICsgc3RyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3Q6ICdoYWkgJXMnLFxuICAgICAgICAgICAgczogJ3VucyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bmhhIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW4gZMOtYScsXG4gICAgICAgICAgICBkZDogJyVkIGTDrWFzJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYW5vJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5vcycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ2w7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS29ua2FuaSBEZXZhbmFnYXJpIHNjcmlwdCBbZ29tLWRldmFdXG4vLyEgYXV0aG9yIDogVGhlIERpc2NvdmVyZXIgOiBodHRwczovL2dpdGh1Yi5jb20vV2lraURpc2NvdmVyZXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzOiBbJ+CkpeCli+CkoeCkr+CkviDgpLjgpYXgpJXgpILgpKHgpL7gpILgpKjgpYAnLCAn4KSl4KWL4KSh4KWHIOCkuOClheCkleCkguCkoSddLFxuICAgICAgICAgICAgc3M6IFtudW1iZXIgKyAnIOCkuOClheCkleCkguCkoeCkvuCkguCkqOClgCcsIG51bWJlciArICcg4KS44KWF4KSV4KSC4KShJ10sXG4gICAgICAgICAgICBtOiBbJ+Ckj+CkleCkviDgpK7gpL/gpKPgpJ/gpL7gpKgnLCAn4KSP4KSVIOCkruCkv+CkqOClguCknyddLFxuICAgICAgICAgICAgbW06IFtudW1iZXIgKyAnIOCkruCkv+Cko+Ckn+CkvuCkguCkqOClgCcsIG51bWJlciArICcg4KSu4KS/4KSj4KSf4KS+4KSCJ10sXG4gICAgICAgICAgICBoOiBbJ+Ckj+CkleCkviDgpLXgpLDgpL7gpKgnLCAn4KSP4KSVIOCkteCksCddLFxuICAgICAgICAgICAgaGg6IFtudW1iZXIgKyAnIOCkteCksOCkvuCkguCkqOClgCcsIG51bWJlciArICcg4KS14KSw4KS+4KSCJ10sXG4gICAgICAgICAgICBkOiBbJ+Ckj+CkleCkviDgpKbgpL/gpLjgpL7gpKgnLCAn4KSP4KSVIOCkpuClgOCkuCddLFxuICAgICAgICAgICAgZGQ6IFtudW1iZXIgKyAnIOCkpuCkv+CkuOCkvuCkguCkqOClgCcsIG51bWJlciArICcg4KSm4KWA4KS4J10sXG4gICAgICAgICAgICBNOiBbJ+Ckj+CkleCkviDgpK7gpY3gpLngpK/gpKjgpY3gpK/gpL7gpKgnLCAn4KSP4KSVIOCkruCljeCkueCkr+CkqOCliyddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIOCkruCljeCkueCkr+CkqOCljeCkr+CkvuCkqOClgCcsIG51bWJlciArICcg4KSu4KWN4KS54KSv4KSo4KWHJ10sXG4gICAgICAgICAgICB5OiBbJ+Ckj+CkleCkviDgpLXgpLDgpY3gpLjgpL7gpKgnLCAn4KSP4KSVIOCkteCksOCljeCkuCddLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIOCkteCksOCljeCkuOCkvuCkguCkqOClgCcsIG51bWJlciArICcg4KS14KSw4KWN4KS44KS+4KSCJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc0Z1dHVyZSA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGdvbURldmEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdnb20tZGV2YScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfgpJzgpL7gpKjgpYfgpLXgpL7gpLDgpYBf4KSr4KWH4KSs4KWN4KSw4KWB4KS14KS+4KSw4KWAX+CkruCkvuCksOCljeCkml/gpI/gpKrgpY3gpLDgpYDgpLJf4KSu4KWHX+CknOClguCkqF/gpJzgpYHgpLLgpK9f4KSR4KSX4KS44KWN4KSfX+CkuOCkquCljeCkn+Clh+CkguCkrOCksF/gpJHgpJXgpY3gpJ/gpYvgpKzgpLBf4KSo4KWL4KS14KWN4KS54KWH4KSC4KSs4KSwX+CkoeCkv+CkuOClh+CkguCkrOCksCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6ICfgpJzgpL7gpKjgpYfgpLXgpL7gpLDgpYDgpJrgpY3gpK/gpL5f4KSr4KWH4KSs4KWN4KSw4KWB4KS14KS+4KSw4KWA4KSa4KWN4KSv4KS+X+CkruCkvuCksOCljeCkmuCkvuCkmuCljeCkr+Ckvl/gpI/gpKrgpY3gpLDgpYDgpLLgpL7gpJrgpY3gpK/gpL5f4KSu4KWH4KSv4KS+4KSa4KWN4KSv4KS+X+CknOClguCkqOCkvuCkmuCljeCkr+Ckvl/gpJzgpYHgpLLgpK/gpL7gpJrgpY3gpK/gpL5f4KSR4KSX4KS44KWN4KSf4KS+4KSa4KWN4KSv4KS+X+CkuOCkquCljeCkn+Clh+CkguCkrOCksOCkvuCkmuCljeCkr+Ckvl/gpJHgpJXgpY3gpJ/gpYvgpKzgpLDgpL7gpJrgpY3gpK/gpL5f4KSo4KWL4KS14KWN4KS54KWH4KSC4KSs4KSw4KS+4KSa4KWN4KSv4KS+X+CkoeCkv+CkuOClh+CkguCkrOCksOCkvuCkmuCljeCkr+Ckvicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9NTU1NKFxccykrRFtvRF0/LyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4KSc4KS+4KSo4KWHLl/gpKvgpYfgpKzgpY3gpLDgpYEuX+CkruCkvuCksOCljeCkml/gpI/gpKrgpY3gpLDgpYAuX+CkruClh1/gpJzgpYLgpKhf4KSc4KWB4KSyLl/gpJHgpJcuX+CkuOCkquCljeCkn+Clh+Ckgi5f4KSR4KSV4KWN4KSf4KWLLl/gpKjgpYvgpLXgpY3gpLngpYfgpIIuX+CkoeCkv+CkuOClh+Ckgi4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfgpIbgpK/gpKTgpL7gpLBf4KS44KWL4KSu4KS+4KSwX+CkruCkguCkl+Cks+CkvuCksF/gpKzgpYHgpKfgpLXgpL7gpLBf4KSs4KS/4KSw4KWH4KS44KWN4KSk4KS+4KSwX+CkuOClgeCkleCljeCksOCkvuCksF/gpLbgpYfgpKjgpLXgpL7gpLAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgpIbgpK/gpKQuX+CkuOCli+Ckri5f4KSu4KSC4KSX4KSzLl/gpKzgpYHgpKcuX+CkrOCljeCksOClh+CkuOCljeCkpC5f4KS44KWB4KSV4KWN4KSwLl/gpLbgpYfgpKguJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+Ckhl/gpLjgpYtf4KSu4KSCX+CkrOClgV/gpKzgpY3gpLDgpYdf4KS44KWBX+CktuClhycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0gW+CkteCkvuCknOCkpOCkvuCkgl0nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIFvgpLXgpL7gpJzgpKTgpL7gpIJdJyxcbiAgICAgICAgICAgIEw6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgQSBoOm1tIFvgpLXgpL7gpJzgpKTgpL7gpIJdJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIERvLCBZWVlZLCBBIGg6bW0gW+CkteCkvuCknOCkpOCkvuCkgl0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCwgRCBNTU0gWVlZWSwgQSBoOm1tIFvgpLXgpL7gpJzgpKTgpL7gpIJdJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KSG4KSv4KScXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+Ckq+CkvuCksuCljeCkr+CkvuCkgl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4KSr4KWB4KSh4KSy4KWLXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KSV4KS+4KSyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgpKvgpL7gpJ/gpLLgpYtdIGRkZGRbLF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4KSG4KSm4KWA4KSCJyxcbiAgICAgICAgICAgIHM6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBzczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOCkteClh+CksCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIG9yZGluYWwgJ+CkteClh+CksCcgb25seSBhcHBsaWVzIHRvIGRheSBvZiB0aGUgbW9udGhcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfgpLXgpYfgpLAnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vla1xuICAgICAgICAgICAgZG95OiAzLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIgKDcgKyAwIC0gNClcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CksOCkvuCkpOClgHzgpLjgpJXgpL7gpLPgpYDgpIJ84KSm4KSo4KSq4KS+4KSw4KS+4KSCfOCkuOCkvuCkguCknOClhy8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CksOCkvuCkpOClgCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkleCkvuCks+ClgOCkgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKbgpKjgpKrgpL7gpLDgpL7gpIInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPiAxMiA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KS44KS+4KSC4KSc4KWHJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOClgCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KSV4KS+4KSz4KWA4KSCJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKbgpKjgpKrgpL7gpLDgpL7gpIInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOCkvuCkguCknOClhyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSk4KWAJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBnb21EZXZhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEtvbmthbmkgTGF0aW4gc2NyaXB0IFtnb20tbGF0bl1cbi8vISBhdXRob3IgOiBUaGUgRGlzY292ZXJlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9XaWtpRGlzY292ZXJlclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHM6IFsndGhvZGRlYSBzZWtvbmRhbW5pJywgJ3Rob2RkZSBzZWtvbmQnXSxcbiAgICAgICAgICAgIHNzOiBbbnVtYmVyICsgJyBzZWtvbmRhbW5pJywgbnVtYmVyICsgJyBzZWtvbmQnXSxcbiAgICAgICAgICAgIG06IFsnZWthIG1pbnRhbicsICdlayBtaW51dCddLFxuICAgICAgICAgICAgbW06IFtudW1iZXIgKyAnIG1pbnRhbW5pJywgbnVtYmVyICsgJyBtaW50YW0nXSxcbiAgICAgICAgICAgIGg6IFsnZWthIHZvcmFuJywgJ2VrIHZvciddLFxuICAgICAgICAgICAgaGg6IFtudW1iZXIgKyAnIHZvcmFtbmknLCBudW1iZXIgKyAnIHZvcmFtJ10sXG4gICAgICAgICAgICBkOiBbJ2VrYSBkaXNhbicsICdlayBkaXMnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyBkaXNhbW5pJywgbnVtYmVyICsgJyBkaXMnXSxcbiAgICAgICAgICAgIE06IFsnZWthIG1ob2luZWFuJywgJ2VrIG1ob2lubyddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIG1ob2luZWFtbmknLCBudW1iZXIgKyAnIG1ob2luZSddLFxuICAgICAgICAgICAgeTogWydla2Egdm9yc2FuJywgJ2VrIHZvcm9zJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgdm9yc2FtbmknLCBudW1iZXIgKyAnIHZvcnNhbSddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBnb21MYXRuID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ29tLWxhdG4nLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnSmFuZXJfRmVicmVyX01hcnNfQWJyaWxfTWFpX0p1bl9KdWxhaV9BZ29zdF9TZXRlbWJyX090dWJyX05vdmVtYnJfRGV6ZW1icicuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6ICdKYW5lcmFjaGVhX0ZlYnJlcmFjaGVhX01hcnNhY2hlYV9BYnJpbGFjaGVhX01haWFjaGVhX0p1bmFjaGVhX0p1bGFpYWNoZWFfQWdvc3RhY2hlYV9TZXRlbWJyYWNoZWFfT3R1YnJhY2hlYV9Ob3ZlbWJyYWNoZWFfRGV6ZW1icmFjaGVhJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL01NTU0oXFxzKStEW29EXT8vLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKYW4uX0ZlYi5fTWFyc19BYnIuX01haV9KdW5fSnVsLl9BZ28uX1NldC5fT3R1Ll9Ob3YuX0Rlei4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiBcIkFpdGFyX1NvbWFyX01vbmdsbGFyX0J1ZGh2YXJfQmlyZXN0YXJfU3VrcmFyX1Nvbid2YXJcIi5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQWl0Ll9Tb20uX01vbi5fQnVkLl9CcmUuX1N1ay5fU29uLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdBaV9TbV9Nb19CdV9Ccl9TdV9Tbicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0gW3ZhenRhXScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MgW3ZhenRhXScsXG4gICAgICAgICAgICBMOiAnREQtTU0tWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEEgaDptbSBbdmF6dGFdJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIERvLCBZWVlZLCBBIGg6bW0gW3ZhenRhXScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBEIE1NTSBZWVlZLCBBIGg6bW0gW3ZhenRhXScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0Fpel0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tGYWxlYW1dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW0Z1ZGRsb10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0thbF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbRmF0dGxvXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFkaW0nLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZXIpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRpbmFsICdlcicgb25seSBhcHBsaWVzIHRvIGRheSBvZiB0aGUgbW9udGhcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICdlcic7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrXG4gICAgICAgICAgICBkb3k6IDMsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhciAoNyArIDAgLSA0KVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvcmF0aXxzb2thbGxpbXxkb25wYXJhbXxzYW5qZS8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ3JhdGknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzb2thbGxpbScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdkb25wYXJhbScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+IDEyID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzYW5qZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyYXRpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzb2thbGxpbSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZG9ucGFyYW0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NhbmplJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyYXRpJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBnb21MYXRuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEd1amFyYXRpIFtndV1cbi8vISBhdXRob3IgOiBLYXVzaGlrIFRoYW5raSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9LYXVzaGlrMTk4N1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgq6cnLFxuICAgICAgICAgICAgMjogJ+CrqCcsXG4gICAgICAgICAgICAzOiAn4KupJyxcbiAgICAgICAgICAgIDQ6ICfgq6onLFxuICAgICAgICAgICAgNTogJ+CrqycsXG4gICAgICAgICAgICA2OiAn4KusJyxcbiAgICAgICAgICAgIDc6ICfgq60nLFxuICAgICAgICAgICAgODogJ+CrricsXG4gICAgICAgICAgICA5OiAn4KuvJyxcbiAgICAgICAgICAgIDA6ICfgq6YnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KunJzogJzEnLFxuICAgICAgICAgICAgJ+CrqCc6ICcyJyxcbiAgICAgICAgICAgICfgq6knOiAnMycsXG4gICAgICAgICAgICAn4KuqJzogJzQnLFxuICAgICAgICAgICAgJ+Crqyc6ICc1JyxcbiAgICAgICAgICAgICfgq6wnOiAnNicsXG4gICAgICAgICAgICAn4KutJzogJzcnLFxuICAgICAgICAgICAgJ+Crric6ICc4JyxcbiAgICAgICAgICAgICfgq68nOiAnOScsXG4gICAgICAgICAgICAn4KumJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGd1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ3UnLCB7XG4gICAgICAgIG1vbnRoczogJ+CqnOCqvuCqqOCrjeCqr+CrgeCqhuCqsOCrgF/gqqvgq4fgqqzgq43gqrDgq4HgqobgqrDgq4Bf4Kqu4Kq+4Kqw4KuN4KqaX+Cqj+CqquCrjeCqsOCqv+Cqsl/gqq7gq4df4Kqc4KuC4KqoX+CqnOCrgeCqsuCqvuCqiF/gqpHgqpfgqrjgq43gqp9f4Kq44Kqq4KuN4Kqf4KuH4Kqu4KuN4Kqs4KqwX+CqkeCqleCrjeCqn+CrjeCqrOCqsF/gqqjgqrXgq4fgqq7gq43gqqzgqrBf4Kqh4Kq/4Kq44KuH4Kqu4KuN4Kqs4KqwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgqpzgqr7gqqjgq43gqq/gq4EuX+Cqq+Crh+CqrOCrjeCqsOCrgS5f4Kqu4Kq+4Kqw4KuN4KqaX+Cqj+CqquCrjeCqsOCqvy5f4Kqu4KuHX+CqnOCrguCqqF/gqpzgq4HgqrLgqr4uX+CqkeCqly5f4Kq44Kqq4KuN4Kqf4KuHLl/gqpHgqpXgq43gqp/gq40uX+CqqOCqteCrhy5f4Kqh4Kq/4Kq44KuHLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+CqsOCqteCqv+CqteCqvuCqsF/gqrjgq4vgqq7gqrXgqr7gqrBf4Kqu4KqC4KqX4Kqz4Kq14Kq+4KqwX+CqrOCrgeCqp+CrjeCqteCqvuCqsF/gqpfgq4HgqrDgq4HgqrXgqr7gqrBf4Kq24KuB4KqV4KuN4Kqw4Kq14Kq+4KqwX+CqtuCqqOCqv+CqteCqvuCqsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CqsOCqteCqv1/gqrjgq4vgqq5f4Kqu4KqC4KqX4KqzX+CqrOCrgeCqp+CrjV/gqpfgq4HgqrDgq4Ff4Kq24KuB4KqV4KuN4KqwX+CqtuCqqOCqvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgqrBf4Kq44KuLX+CqruCqgl/gqqzgq4Ff4KqX4KuBX+CqtuCrgV/gqrYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgqrXgqr7gqpfgq43gqq/gq4cnLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCqteCqvuCql+CrjeCqr+CrhycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4Kq14Kq+4KqX4KuN4Kqv4KuHJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCqteCqvuCql+CrjeCqr+CrhycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CqhuCqnF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgqpXgqr7gqrLgq4ddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgqpfgqofgqpXgqr7gqrLgq4ddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CqquCqvuCqm+CqsuCqvl0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgqq7gqr4nLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCqquCqueCrh+CqsuCqvicsXG4gICAgICAgICAgICBzOiAn4KqF4Kqu4KuB4KqVIOCqquCqs+CriycsXG4gICAgICAgICAgICBzczogJyVkIOCquOCrh+CqleCqguCqoScsXG4gICAgICAgICAgICBtOiAn4KqP4KqVIOCqruCqv+CqqOCqv+CqnycsXG4gICAgICAgICAgICBtbTogJyVkIOCqruCqv+CqqOCqv+CqnycsXG4gICAgICAgICAgICBoOiAn4KqP4KqVIOCqleCqsuCqvuCqlScsXG4gICAgICAgICAgICBoaDogJyVkIOCqleCqsuCqvuCqlScsXG4gICAgICAgICAgICBkOiAn4KqP4KqVIOCqpuCqv+CqteCquCcsXG4gICAgICAgICAgICBkZDogJyVkIOCqpuCqv+CqteCquCcsXG4gICAgICAgICAgICBNOiAn4KqP4KqVIOCqruCqueCqv+CqqOCriycsXG4gICAgICAgICAgICBNTTogJyVkIOCqruCqueCqv+CqqOCriycsXG4gICAgICAgICAgICB5OiAn4KqP4KqVIOCqteCqsOCrjeCqtycsXG4gICAgICAgICAgICB5eTogJyVkIOCqteCqsOCrjeCqtycsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgq6fgq6jgq6ngq6rgq6vgq6zgq63gq67gq6/gq6ZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIEd1amFyYXRpIG5vdGF0aW9uIGZvciBtZXJpZGllbXMgYXJlIHF1aXRlIGZ1enp5IGluIHByYWN0aWNlLiBXaGlsZSB0aGVyZSBleGlzdHNcbiAgICAgICAgLy8gYSByaWdpZCBub3Rpb24gb2YgYSAnUGFoYXInIGl0IGlzIG5vdCB1c2VkIGFzIHJpZ2lkbHkgaW4gbW9kZXJuIEd1amFyYXRpLlxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4Kqw4Kq+4KqkfOCqrOCqquCri+CqsHzgqrjgqrXgqr7gqrB84Kq44Kq+4KqC4KqcLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4Kqw4Kq+4KqkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kq44Kq14Kq+4KqwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CqrOCqquCri+CqsCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kq44Kq+4KqC4KqcJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CqsOCqvuCqpCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kq44Kq14Kq+4KqwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqqzgqqrgq4vgqrAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CquOCqvuCqguCqnCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kqw4Kq+4KqkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGd1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEhlYnJldyBbaGVdXG4vLyEgYXV0aG9yIDogVG9tZXIgQ29oZW4gOiBodHRwczovL2dpdGh1Yi5jb20vdG9tZXJcbi8vISBhdXRob3IgOiBNb3NoZSBTaW1hbnRvdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9EZXZlbG9wbWVudElMXG4vLyEgYXV0aG9yIDogVGFsIEF0ZXIgOiBodHRwczovL2dpdGh1Yi5jb20vVGFsQXRlclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGhlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaGUnLCB7XG4gICAgICAgIG1vbnRoczogJ9eZ16DXldeQ16hf16TXkdeo15XXkNeoX9ee16jXpV/XkNek16jXmdecX9ee15DXmV/XmdeV16DXmV/XmdeV15zXmV/XkNeV15LXldeh15hf16HXpNeY157XkdeoX9eQ15XXp9eY15XXkdeoX9eg15XXkdee15HXqF/Xk9em157XkdeoJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfXmdeg15XXs1/XpNeR16jXs1/Xnteo16Vf15DXpNeo17Nf157XkNeZX9eZ15XXoNeZX9eZ15XXnNeZX9eQ15XXktezX9eh16TXmNezX9eQ15XXp9ezX9eg15XXkdezX9eT16bXntezJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9eo15DXqdeV159f16nXoNeZX9ep15zXmdep15lf16jXkdeZ16LXmV/Xl9ee15nXqdeZX9ep15nXqdeZX9ep15HXqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9eQ17Nf15HXs1/XktezX9eT17Nf15TXs1/XldezX9ep17MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn15Bf15Ff15Jf15Nf15Rf15Vf16knLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBb15FdTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW9eRXU1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBb15FdTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdEL00vWVlZWScsXG4gICAgICAgICAgICBsbDogJ0QgTU1NIFlZWVknLFxuICAgICAgICAgICAgbGxsOiAnRCBNTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb15TXmdeV150g15HWvl1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9ee15fXqCDXkda+XUxUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb15HXqdei15RdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb15DXqtee15XXnCDXkda+XUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9eR15nXldedXSBkZGRkIFvXlNeQ15fXqNeV158g15HXqdei15RdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn15HXoteV15MgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9ec16TXoNeZICVzJyxcbiAgICAgICAgICAgIHM6ICfXnteh16TXqCDXqdeg15nXldeqJyxcbiAgICAgICAgICAgIHNzOiAnJWQg16nXoNeZ15XXqicsXG4gICAgICAgICAgICBtOiAn15PXp9eUJyxcbiAgICAgICAgICAgIG1tOiAnJWQg15PXp9eV16onLFxuICAgICAgICAgICAgaDogJ9ep16LXlCcsXG4gICAgICAgICAgICBoaDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfXqdei16rXmdeZ150nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDXqdei15XXqic7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZDogJ9eZ15XXnScsXG4gICAgICAgICAgICBkZDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfXmdeV157XmdeZ150nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDXmdee15nXnSc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgTTogJ9eX15XXk9epJyxcbiAgICAgICAgICAgIE1NOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9eX15XXk9ep15nXmdedJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg15fXldeT16nXmdedJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5OiAn16nXoNeUJyxcbiAgICAgICAgICAgIHl5OiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9ep16DXqteZ15nXnSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgJSAxMCA9PT0gMCAmJiBudW1iZXIgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINep16DXlCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINep16DXmdedJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6XG4gICAgICAgICAgICAv15DXl9eUXCLXpnzXnNek16DXlFwi16Z815DXl9eo15kg15TXpteU16jXmdeZ151815zXpNeg15kg15TXpteU16jXmdeZ151815zXpNeg15XXqiDXkdeV16fXqHzXkdeR15XXp9eofNeR16LXqNeRL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNeQ15fXlFwi16Z815DXl9eo15kg15TXpteU16jXmdeZ151815HXoteo15EpJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9ec16TXoNeV16og15HXlden16gnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9eR15HXlden16gnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfXnNek16DXlFwi16YnIDogJ9ec16TXoNeZINeU16bXlNeo15nXmdedJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAn15DXl9eUXCLXpicgOiAn15DXl9eo15kg15TXpteU16jXmdeZ150nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9eR16LXqNeRJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBoZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBIaW5kaSBbaGldXG4vLyEgYXV0aG9yIDogTWF5YW5rIFNpbmdoYWwgOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YW5rc2luZ2hhbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgpacnLFxuICAgICAgICAgICAgMjogJ+ClqCcsXG4gICAgICAgICAgICAzOiAn4KWpJyxcbiAgICAgICAgICAgIDQ6ICfgpaonLFxuICAgICAgICAgICAgNTogJ+ClqycsXG4gICAgICAgICAgICA2OiAn4KWsJyxcbiAgICAgICAgICAgIDc6ICfgpa0nLFxuICAgICAgICAgICAgODogJ+ClricsXG4gICAgICAgICAgICA5OiAn4KWvJyxcbiAgICAgICAgICAgIDA6ICfgpaYnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KWnJzogJzEnLFxuICAgICAgICAgICAgJ+ClqCc6ICcyJyxcbiAgICAgICAgICAgICfgpaknOiAnMycsXG4gICAgICAgICAgICAn4KWqJzogJzQnLFxuICAgICAgICAgICAgJ+Clqyc6ICc1JyxcbiAgICAgICAgICAgICfgpawnOiAnNicsXG4gICAgICAgICAgICAn4KWtJzogJzcnLFxuICAgICAgICAgICAgJ+Clric6ICc4JyxcbiAgICAgICAgICAgICfgpa8nOiAnOScsXG4gICAgICAgICAgICAn4KWmJzogJzAnLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9e4KSc4KSoL2ksXG4gICAgICAgICAgICAvXuCkq+CkvOCksHzgpKvgpLAvaSxcbiAgICAgICAgICAgIC9e4KSu4KS+4KSw4KWN4KSaL2ksXG4gICAgICAgICAgICAvXuCkheCkquCljeCksOCliC9pLFxuICAgICAgICAgICAgL17gpK7gpIgvaSxcbiAgICAgICAgICAgIC9e4KSc4KWC4KSoL2ksXG4gICAgICAgICAgICAvXuCknOClgeCksi9pLFxuICAgICAgICAgICAgL17gpIXgpJcvaSxcbiAgICAgICAgICAgIC9e4KS44KS/4KSk4KSCfOCkuOCkv+CkpC9pLFxuICAgICAgICAgICAgL17gpIXgpJXgpY3gpJ/gpYIvaSxcbiAgICAgICAgICAgIC9e4KSo4KS1fOCkqOCkteCkgi9pLFxuICAgICAgICAgICAgL17gpKbgpL/gpLjgpIJ84KSm4KS/4KS4L2ksXG4gICAgICAgIF0sXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXuCknOCkqC9pLFxuICAgICAgICAgICAgL17gpKvgpLzgpLAvaSxcbiAgICAgICAgICAgIC9e4KSu4KS+4KSw4KWN4KSaL2ksXG4gICAgICAgICAgICAvXuCkheCkquCljeCksOCliC9pLFxuICAgICAgICAgICAgL17gpK7gpIgvaSxcbiAgICAgICAgICAgIC9e4KSc4KWC4KSoL2ksXG4gICAgICAgICAgICAvXuCknOClgeCksi9pLFxuICAgICAgICAgICAgL17gpIXgpJcvaSxcbiAgICAgICAgICAgIC9e4KS44KS/4KSkL2ksXG4gICAgICAgICAgICAvXuCkheCkleCljeCkn+Clgi9pLFxuICAgICAgICAgICAgL17gpKjgpLUvaSxcbiAgICAgICAgICAgIC9e4KSm4KS/4KS4L2ksXG4gICAgICAgIF07XG5cbiAgICB2YXIgaGkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdoaScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfgpJzgpKjgpLXgpLDgpYBf4KSr4KS84KSw4KS14KSw4KWAX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpYjgpLJf4KSu4KSIX+CknOClguCkqF/gpJzgpYHgpLLgpL7gpIhf4KSF4KSX4KS44KWN4KSkX+CkuOCkv+CkpOCkruCljeCkrOCksF/gpIXgpJXgpY3gpJ/gpYLgpKzgpLBf4KSo4KS14KSu4KWN4KSs4KSwX+CkpuCkv+CkuOCkruCljeCkrOCksCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn4KSc4KSo4KS14KSw4KWAX+Ckq+CksOCkteCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KWI4KSyX+CkruCkiF/gpJzgpYLgpKhf4KSc4KWB4KSy4KS+4KSIX+CkheCkl+CkuOCljeCkpF/gpLjgpL/gpKTgpILgpKzgpLBf4KSF4KSV4KWN4KSf4KWC4KSs4KSwX+CkqOCkteCkguCkrOCksF/gpKbgpL/gpLjgpILgpKzgpLAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgpJzgpKguX+Ckq+CkvOCksC5f4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCliC5f4KSu4KSIX+CknOClguCkqF/gpJzgpYHgpLIuX+CkheCkly5f4KS44KS/4KSkLl/gpIXgpJXgpY3gpJ/gpYIuX+CkqOCktS5f4KSm4KS/4KS4Licuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfgpLDgpLXgpL/gpLXgpL7gpLBf4KS44KWL4KSu4KS14KS+4KSwX+CkruCkguCkl+CksuCkteCkvuCksF/gpKzgpYHgpKfgpLXgpL7gpLBf4KSX4KWB4KSw4KWC4KS14KS+4KSwX+CktuClgeCkleCljeCksOCkteCkvuCksF/gpLbgpKjgpL/gpLXgpL7gpLAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgpLDgpLXgpL9f4KS44KWL4KSuX+CkruCkguCkl+Cksl/gpKzgpYHgpKdf4KSX4KWB4KSw4KWCX+CktuClgeCkleCljeCksF/gpLbgpKjgpL8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4KSwX+CkuOCli1/gpK7gpIJf4KSs4KWBX+Ckl+ClgV/gpLbgpYFf4KS2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCkrOCknOClhycsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICB9LFxuXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogc2hvcnRNb250aHNQYXJzZSxcblxuICAgICAgICBtb250aHNSZWdleDpcbiAgICAgICAgICAgIC9eKOCknOCkqOCkteCksOClgHzgpJzgpKhcXC4/fOCkq+CkvOCksOCkteCksOClgHzgpKvgpLDgpLXgpLDgpYB84KSr4KS84KSwXFwuP3zgpK7gpL7gpLDgpY3gpJo/fOCkheCkquCljeCksOCliOCksnzgpIXgpKrgpY3gpLDgpYhcXC4/fOCkruCkiD984KSc4KWC4KSoP3zgpJzgpYHgpLLgpL7gpIh84KSc4KWB4KSyXFwuP3zgpIXgpJfgpLjgpY3gpKR84KSF4KSXXFwuP3zgpLjgpL/gpKTgpK7gpY3gpKzgpLB84KS44KS/4KSk4KSC4KSs4KSwfOCkuOCkv+CkpFxcLj984KSF4KSV4KWN4KSf4KWC4KSs4KSwfOCkheCkleCljeCkn+ClglxcLj984KSo4KS14KSu4KWN4KSs4KSwfOCkqOCkteCkguCkrOCksHzgpKjgpLVcXC4/fOCkpuCkv+CkuOCkruCljeCkrOCksHzgpKbgpL/gpLjgpILgpKzgpLB84KSm4KS/4KS4XFwuPykvaSxcblxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OlxuICAgICAgICAgICAgL14o4KSc4KSo4KS14KSw4KWAfOCknOCkqFxcLj984KSr4KS84KSw4KS14KSw4KWAfOCkq+CksOCkteCksOClgHzgpKvgpLzgpLBcXC4/fOCkruCkvuCksOCljeCkmj984KSF4KSq4KWN4KSw4KWI4KSyfOCkheCkquCljeCksOCliFxcLj984KSu4KSIP3zgpJzgpYLgpKg/fOCknOClgeCksuCkvuCkiHzgpJzgpYHgpLJcXC4/fOCkheCkl+CkuOCljeCkpHzgpIXgpJdcXC4/fOCkuOCkv+CkpOCkruCljeCkrOCksHzgpLjgpL/gpKTgpILgpKzgpLB84KS44KS/4KSkXFwuP3zgpIXgpJXgpY3gpJ/gpYLgpKzgpLB84KSF4KSV4KWN4KSf4KWCXFwuP3zgpKjgpLXgpK7gpY3gpKzgpLB84KSo4KS14KSC4KSs4KSwfOCkqOCktVxcLj984KSm4KS/4KS44KSu4KWN4KSs4KSwfOCkpuCkv+CkuOCkguCkrOCksHzgpKbgpL/gpLhcXC4/KS9pLFxuXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14o4KSc4KSo4KS14KSw4KWAP3zgpKvgpLzgpLDgpLXgpLDgpYB84KSr4KSw4KS14KSw4KWAP3zgpK7gpL7gpLDgpY3gpJo/fOCkheCkquCljeCksOCliOCksj984KSu4KSIP3zgpJzgpYLgpKg/fOCknOClgeCksuCkvuCkiD984KSF4KSX4KS44KWN4KSkP3zgpLjgpL/gpKTgpK7gpY3gpKzgpLB84KS44KS/4KSk4KSC4KSs4KSwfOCkuOCkv+CkpD9cXC4/fOCkheCkleCljeCkn+ClguCkrOCksHzgpIXgpJXgpY3gpJ/gpYJcXC4/fOCkqOCkteCkruCljeCkrOCksHzgpKjgpLXgpILgpKzgpLA/fOCkpuCkv+CkuOCkruCljeCkrOCksHzgpKbgpL/gpLjgpILgpKzgpLA/KS9pLFxuXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXijgpJzgpKhcXC4/fOCkq+CkvOCksFxcLj984KSu4KS+4KSw4KWN4KSaP3zgpIXgpKrgpY3gpLDgpYhcXC4/fOCkruCkiD984KSc4KWC4KSoP3zgpJzgpYHgpLJcXC4/fOCkheCkl1xcLj984KS44KS/4KSkXFwuP3zgpIXgpJXgpY3gpJ/gpYJcXC4/fOCkqOCktVxcLj984KSm4KS/4KS4XFwuPykvaSxcblxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgpIbgpJxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KSV4KSyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KSV4KSyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgpKrgpL/gpJvgpLLgpYddIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4KSu4KWH4KSCJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgpKrgpLngpLLgpYcnLFxuICAgICAgICAgICAgczogJ+CkleClgeCkmyDgpLngpYAg4KSV4KWN4KS34KSjJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4KS44KWH4KSV4KSC4KShJyxcbiAgICAgICAgICAgIG06ICfgpI/gpJUg4KSu4KS/4KSo4KSfJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4KSu4KS/4KSo4KSfJyxcbiAgICAgICAgICAgIGg6ICfgpI/gpJUg4KSY4KSC4KSf4KS+JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KSY4KSC4KSf4KWHJyxcbiAgICAgICAgICAgIGQ6ICfgpI/gpJUg4KSm4KS/4KSoJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4KSm4KS/4KSoJyxcbiAgICAgICAgICAgIE06ICfgpI/gpJUg4KSu4KS54KWA4KSo4KWHJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4KSu4KS54KWA4KSo4KWHJyxcbiAgICAgICAgICAgIHk6ICfgpI/gpJUg4KS14KSw4KWN4KS3JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4KS14KSw4KWN4KS3JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Clp+ClqOClqeClquClq+ClrOClreClruClr+Clpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gSGluZGkgbm90YXRpb24gZm9yIG1lcmlkaWVtcyBhcmUgcXVpdGUgZnV6enkgaW4gcHJhY3RpY2UuIFdoaWxlIHRoZXJlIGV4aXN0c1xuICAgICAgICAvLyBhIHJpZ2lkIG5vdGlvbiBvZiBhICdQYWhhcicgaXQgaXMgbm90IHVzZWQgYXMgcmlnaWRseSBpbiBtb2Rlcm4gSGluZGkuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gpLDgpL7gpKR84KS44KWB4KSs4KS5fOCkpuCli+CkquCkueCksHzgpLbgpL7gpK4vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgpLDgpL7gpKQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLjgpYHgpKzgpLknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KSm4KWL4KSq4KS54KSwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLbgpL7gpK4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSkJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpYHgpKzgpLknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkpuCli+CkquCkueCksCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS24KS+4KSuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ3JvYXRpYW4gW2hyXVxuLy8hIGF1dGhvciA6IEJvamFuIE1hcmtvdmnEhyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ibWFya292aWNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2plZG5hIG1pbnV0YScgOiAnamVkbmUgbWludXRlJztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0YSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdqZWRhbiBzYXQnIDogJ2plZG5vZyBzYXRhJztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0YSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2RhbmEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWMnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNhJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBociA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2hyJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ3NpamXEjW5qYV92ZWxqYcSNZV9vxb51amthX3RyYXZuamFfc3ZpYm5qYV9saXBuamFfc3JwbmphX2tvbG92b3phX3J1am5hX2xpc3RvcGFkYV9zdHVkZW5vZ2FfcHJvc2luY2EnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ3NpamXEjWFual92ZWxqYcSNYV9vxb51amFrX3RyYXZhbmpfc3ZpYmFual9saXBhbmpfc3JwYW5qX2tvbG92b3pfcnVqYW5fbGlzdG9wYWRfc3R1ZGVuaV9wcm9zaW5hYycuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ3Npai5fdmVsai5fb8W+dS5fdHJhLl9zdmkuX2xpcC5fc3JwLl9rb2wuX3J1ai5fbGlzLl9zdHUuX3Byby4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWRqZWxqYV9wb25lZGplbGpha191dG9yYWtfc3JpamVkYV/EjWV0dnJ0YWtfcGV0YWtfc3Vib3RhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVkLl9wb24uX3V0by5fc3JpLl/EjWV0Ll9wZXQuX3N1Yi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdXRfc3JfxI1lX3BlX3N1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0RvIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEbyBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRG8gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3N1dHJhIHVdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRqZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3NyaWplZHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzdWJvdHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdcSNZXIgdV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsdV0gW25lZGplbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWx1XSBbc3JpamVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsZV0gW3N1Ym90ZV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsaV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmlqZSAlcycsXG4gICAgICAgICAgICBzOiAncGFyIHNla3VuZGknLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogJ2RhbicsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogJ21qZXNlYycsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogJ2dvZGludScsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEh1bmdhcmlhbiBbaHVdXG4vLyEgYXV0aG9yIDogQWRhbSBCcnVubmVyIDogaHR0cHM6Ly9naXRodWIuY29tL2FkYW1icnVubmVyXG4vLyEgYXV0aG9yIDogUGV0ZXIgVmlzenQgIDogaHR0cHM6Ly9naXRodWIuY29tL3Bhc3NhdGd0XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgd2Vla0VuZGluZ3MgPVxuICAgICAgICAndmFzw6FybmFwIGjDqXRmxZFuIGtlZGRlbiBzemVyZMOhbiBjc8O8dMO2cnTDtmvDtm4gcMOpbnRla2VuIHN6b21iYXRvbicuc3BsaXQoJyAnKTtcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBudW0gPSBudW1iZXI7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeFxuICAgICAgICAgICAgICAgICAgICA/ICduw6low6FueSBtw6Fzb2RwZXJjJ1xuICAgICAgICAgICAgICAgICAgICA6ICduw6low6FueSBtw6Fzb2RwZXJjZSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4KVxuICAgICAgICAgICAgICAgICAgICA/ICcgbcOhc29kcGVyYydcbiAgICAgICAgICAgICAgICAgICAgOiAnIG3DoXNvZHBlcmNlJztcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBwZXJjJyA6ICcgcGVyY2UnKTtcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIHBlcmMnIDogJyBwZXJjZScpO1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIMOzcmEnIDogJyDDs3LDoWphJyk7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyDDs3JhJyA6ICcgw7Nyw6FqYScpO1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIG5hcCcgOiAnIG5hcGphJyk7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBuYXAnIDogJyBuYXBqYScpO1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIGjDs25hcCcgOiAnIGjDs25hcGphJyk7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBow7NuYXAnIDogJyBow7NuYXBqYScpO1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIMOpdicgOiAnIMOpdmUnKTtcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIMOpdicgOiAnIMOpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdlZWsoaXNGdXR1cmUpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChpc0Z1dHVyZSA/ICcnIDogJ1ttw7psdF0gJykgK1xuICAgICAgICAgICAgJ1snICtcbiAgICAgICAgICAgIHdlZWtFbmRpbmdzW3RoaXMuZGF5KCldICtcbiAgICAgICAgICAgICddIExUWy1rb3JdJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBodSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2h1Jywge1xuICAgICAgICBtb250aHM6ICdqYW51w6FyX2ZlYnJ1w6FyX23DoXJjaXVzX8OhcHJpbGlzX23DoWp1c19qw7puaXVzX2rDumxpdXNfYXVndXN6dHVzX3N6ZXB0ZW1iZXJfb2t0w7NiZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tw6FyYy5fw6Fwci5fbcOhai5fasO6bi5fasO6bC5fYXVnLl9zemVwdC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICd2YXPDoXJuYXBfaMOpdGbFkV9rZWRkX3N6ZXJkYV9jc8O8dMO2cnTDtmtfcMOpbnRla19zem9tYmF0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAndmFzX2jDqXRfa2VkZF9zemVfY3PDvHRfcMOpbl9zem8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAndl9oX2tfc3plX2NzX3Bfc3pvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkuTU0uREQuJyxcbiAgICAgICAgICAgIExMOiAnWVlZWS4gTU1NTSBELicsXG4gICAgICAgICAgICBMTEw6ICdZWVlZLiBNTU1NIEQuIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVkuIE1NTU0gRC4sIGRkZGQgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9kZXxkdS9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5jaGFyQXQoMSkudG9Mb3dlckNhc2UoKSA9PT0gJ3UnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID09PSB0cnVlID8gJ2RlJyA6ICdERSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID09PSB0cnVlID8gJ2R1JyA6ICdEVSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW21hXSBMVFsta29yXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2hvbG5hcF0gTFRbLWtvcl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2Vlay5jYWxsKHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbdGVnbmFwXSBMVFsta29yXScsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3ZWVrLmNhbGwodGhpcywgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgbcO6bHZhJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcycsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJtZW5pYW4gW2h5LWFtXVxuLy8hIGF1dGhvciA6IEFybWVuZGFyYWJ5YW4gOiBodHRwczovL2dpdGh1Yi5jb20vYXJtZW5kYXJhYnlhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGh5QW0gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdoeS1hbScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfVsNW41oLVttW+1aHWgNWrX9aD1aXVv9aA1b7VodaA1atf1bTVodaA1b/Vq1/VodW61oDVq9Ws1atf1bTVodW11avVvdWrX9Ww1bjWgtW21avVvdWrX9Ww1bjWgtWs1avVvdWrX9aF1aPVuNW91b/VuNW91atf1b3VpdW61b/VpdW01aLVpdaA1atf1bDVuNWv1b/VpdW01aLVpdaA1atf1bbVuNW11aXVtNWi1aXWgNWrX9Wk1aXVr9W/1aXVtNWi1aXWgNWrJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfVsNW41oLVttW+1aHWgF/Wg9Wl1b/WgNW+1aHWgF/VtNWh1oDVv1/VodW61oDVq9WsX9W01aHVtdWr1b1f1bDVuNaC1bbVq9W9X9Ww1bjWgtWs1avVvV/WhdWj1bjVvdW/1bjVvV/VvdWl1brVv9Wl1bTVotWl1oBf1bDVuNWv1b/VpdW01aLVpdaAX9W21bjVtdWl1bTVotWl1oBf1aTVpdWv1b/VpdW01aLVpdaAJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfVsNW21b5f1oPVv9aAX9W01oDVv1/VodW61oBf1bTVtdW9X9Ww1bbVvV/VsNWs1b1f1oXVo9W9X9W91brVv1/VsNWv1b9f1bbVtNWiX9Wk1a/Vvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn1a/Vq9aA1aHVr9WrX9Wl1oDVr9W41oLVt9Wh1aLVqdWrX9Wl1oDVpdaE1bfVodWi1anVq1/VudW41oDVpdaE1bfVodWi1anVq1/VsNWr1bbVo9W31aHVotWp1atf1bjWgtaA1aLVodWpX9W31aHVotWh1aknLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9Wv1oDVr1/VpdaA1a9f1aXWgNaEX9W51oDWhF/VsNW21aNf1bjWgtaA1aJf1bfVotWpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9Wv1oDVr1/VpdaA1a9f1aXWgNaEX9W51oDWhF/VsNW21aNf1bjWgtaA1aJf1bfVotWpJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZINWpLicsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDVqS4sIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSDVqS4sIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb1aHVtdW91oXWgF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vVvtWh1bLVqF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vVpdaA1aXVr10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW9aF1oDVqCDVqtWh1bTVqF0gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdb1aHVttaB1aHVrl0gZGRkZCBb1oXWgNWoINWq1aHVtNWoXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDVsNWl1b/VuCcsXG4gICAgICAgICAgICBwYXN0OiAnJXMg1aHVvNWh1bsnLFxuICAgICAgICAgICAgczogJ9W01asg1oTVodW21asg1b7VodW11oDVr9W11aHVticsXG4gICAgICAgICAgICBzczogJyVkINW+1aHVtdaA1a/VtdWh1bYnLFxuICAgICAgICAgICAgbTogJ9aA1bjVutWlJyxcbiAgICAgICAgICAgIG1tOiAnJWQg1oDVuNW61aUnLFxuICAgICAgICAgICAgaDogJ9Wq1aHVtCcsXG4gICAgICAgICAgICBoaDogJyVkINWq1aHVtCcsXG4gICAgICAgICAgICBkOiAn1oXWgCcsXG4gICAgICAgICAgICBkZDogJyVkINaF1oAnLFxuICAgICAgICAgICAgTTogJ9Wh1bTVq9W9JyxcbiAgICAgICAgICAgIE1NOiAnJWQg1aHVtNWr1b0nLFxuICAgICAgICAgICAgeTogJ9W/1aHWgNWrJyxcbiAgICAgICAgICAgIHl5OiAnJWQg1b/VodaA1asnLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv1aPVq9W31aXWgNW+1aF81aHVvNWh1b7VuNW/1b7VoXzWgdWl1oDVpdWv1b7VoXzVpdaA1aXVr9W41bXVodW2LyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o1oHVpdaA1aXVr9W+1aF81aXWgNWl1a/VuNW11aHVtikkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Wj1avVt9Wl1oDVvtWhJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfVodW81aHVvtW41b/VvtWhJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfWgdWl1oDVpdWv1b7VoSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1aXWgNWl1a/VuNW11aHVtic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfXxcXGR7MSwyfS0o1avVtnzWgNWkKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERG8nOlxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Vq9W2JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3WgNWkJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHlBbTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBJbmRvbmVzaWFuIFtpZF1cbi8vISBhdXRob3IgOiBNb2hhbW1hZCBTYXRyaW8gVXRvbW8gOiBodHRwczovL2dpdGh1Yi5jb20vdHlva1xuLy8hIHJlZmVyZW5jZTogaHR0cDovL2lkLndpa2lzb3VyY2Uub3JnL3dpa2kvUGVkb21hbl9VbXVtX0VqYWFuX0JhaGFzYV9JbmRvbmVzaWFfeWFuZ19EaXNlbXB1cm5ha2FuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgaWQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdpZCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyaV9GZWJydWFyaV9NYXJldF9BcHJpbF9NZWlfSnVuaV9KdWxpX0FndXN0dXNfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGVzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01laV9KdW5fSnVsX0FndF9TZXBfT2t0X05vdl9EZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnTWluZ2d1X1NlbmluX1NlbGFzYV9SYWJ1X0thbWlzX0p1bWF0X1NhYnR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnTWluX1Nlbl9TZWxfUmFiX0thbV9KdW1fU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ01nX1NuX1NsX1JiX0ttX0ptX1NiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvcGFnaXxzaWFuZ3xzb3JlfG1hbGFtLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAncGFnaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzaWFuZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnc29yZScgfHwgbWVyaWRpZW0gPT09ICdtYWxhbScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGFnaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NpYW5nJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc29yZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbWFsYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIYXJpIGluaSBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tCZXNvayBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tLZW1hcmluIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2xhbHUgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFsYW0gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHlhbmcgbGFsdScsXG4gICAgICAgICAgICBzOiAnYmViZXJhcGEgZGV0aWsnLFxuICAgICAgICAgICAgc3M6ICclZCBkZXRpaycsXG4gICAgICAgICAgICBtOiAnc2VtZW5pdCcsXG4gICAgICAgICAgICBtbTogJyVkIG1lbml0JyxcbiAgICAgICAgICAgIGg6ICdzZWphbScsXG4gICAgICAgICAgICBoaDogJyVkIGphbScsXG4gICAgICAgICAgICBkOiAnc2VoYXJpJyxcbiAgICAgICAgICAgIGRkOiAnJWQgaGFyaScsXG4gICAgICAgICAgICBNOiAnc2VidWxhbicsXG4gICAgICAgICAgICBNTTogJyVkIGJ1bGFuJyxcbiAgICAgICAgICAgIHk6ICdzZXRhaHVuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGFodW4nLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSWNlbGFuZGljIFtpc11cbi8vISBhdXRob3IgOiBIaW5yaWsgw5ZybiBTaWd1csOwc3NvbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oaW5yaWtcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIGlmIChuICUgMTAwID09PSAxMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobiAlIDEwID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlXG4gICAgICAgICAgICAgICAgICAgID8gJ25va2tyYXIgc2Vrw7puZHVyJ1xuICAgICAgICAgICAgICAgICAgICA6ICdub2trcnVtIHNla8O6bmR1bSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnc2Vrw7puZHVyJyA6ICdzZWvDum5kdW0nKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ3Nla8O6bmRhJztcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ23DrW7DunRhJyA6ICdtw61uw7p0dSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKyAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtw61uw7p0dXInIDogJ23DrW7DunR1bScpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcOtbsO6dGEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ23DrW7DunR1JztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArXG4gICAgICAgICAgICAgICAgICAgICAgICAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2tsdWtrdXN0dW5kaXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAna2x1a2t1c3R1bmR1bScpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAna2x1a2t1c3R1bmQnO1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkYWd1cic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdkYWcnIDogJ2RlZ2knO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIGlmIChwbHVyYWwobnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkYWdhcic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdkYWdhJyA6ICdkw7ZndW0nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkYWd1cic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoaXNGdXR1cmUgPyAnZGFnJyA6ICdkZWdpJyk7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ23DoW51w7B1cic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdtw6FudcOwJyA6ICdtw6FudcOwaSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ23DoW51w7Bpcic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdtw6FudcOwaScgOiAnbcOhbnXDsHVtJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcOhbnXDsHVyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdtw6FudcOwJyA6ICdtw6FudcOwaScpO1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnw6FyJyA6ICfDoXJpJztcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ8OhcicgOiAnw6FydW0nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ8OhcicgOiAnw6FyaScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaXMnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbsO6YXJfZmVicsO6YXJfbWFyc19hcHLDrWxfbWHDrV9qw7puw61fasO6bMOtX8OhZ8O6c3Rfc2VwdGVtYmVyX29rdMOzYmVyX27Ds3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcl9hcHJfbWHDrV9qw7puX2rDumxfw6Fnw7pfc2VwX29rdF9uw7N2X2Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnc3VubnVkYWd1cl9tw6FudWRhZ3VyX8O+cmnDsGp1ZGFndXJfbWnDsHZpa3VkYWd1cl9maW1tdHVkYWd1cl9mw7ZzdHVkYWd1cl9sYXVnYXJkYWd1cicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc3VuX23DoW5fw75yaV9tacOwX2ZpbV9mw7ZzX2xhdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nw6Ffw55yX01pX0ZpX0bDtl9MYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBba2wuXSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgW2tsLl0gSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW8OtIGRhZyBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbw6EgbW9yZ3VuIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbw60gZ8OmciBrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3PDrcOwYXN0YV0gZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VmdGlyICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdmeXJpciAlcyBzw63DsGFuJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogJ2tsdWtrdXN0dW5kJyxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSXRhbGlhbiAoU3dpdHplcmxhbmQpIFtpdC1jaF1cbi8vISBhdXRob3IgOiB4ZmggOiBodHRwczovL2dpdGh1Yi5jb20veGZoXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgaXRDaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2l0LWNoJywge1xuICAgICAgICBtb250aHM6ICdnZW5uYWlvX2ZlYmJyYWlvX21hcnpvX2FwcmlsZV9tYWdnaW9fZ2l1Z25vX2x1Z2xpb19hZ29zdG9fc2V0dGVtYnJlX290dG9icmVfbm92ZW1icmVfZGljZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnZ2VuX2ZlYl9tYXJfYXByX21hZ19naXVfbHVnX2Fnb19zZXRfb3R0X25vdl9kaWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnZG9tZW5pY2FfbHVuZWTDrF9tYXJ0ZWTDrF9tZXJjb2xlZMOsX2dpb3ZlZMOsX3ZlbmVyZMOsX3NhYmF0bycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbV9sdW5fbWFyX21lcl9naW9fdmVuX3NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb19sdV9tYV9tZV9naV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW09nZ2kgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tEb21hbmkgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthbGxlXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0llcmkgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbGEgc2NvcnNhXSBkZGRkIFthbGxlXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tsbyBzY29yc29dIGRkZGQgW2FsbGVdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgvXlswLTldLiskLy50ZXN0KHMpID8gJ3RyYScgOiAnaW4nKSArICcgJyArIHM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdDogJyVzIGZhJyxcbiAgICAgICAgICAgIHM6ICdhbGN1bmkgc2Vjb25kaScsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGknLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0aScsXG4gICAgICAgICAgICBoOiBcInVuJ29yYVwiLFxuICAgICAgICAgICAgaGg6ICclZCBvcmUnLFxuICAgICAgICAgICAgZDogJ3VuIGdpb3JubycsXG4gICAgICAgICAgICBkZDogJyVkIGdpb3JuaScsXG4gICAgICAgICAgICBNOiAndW4gbWVzZScsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2knLFxuICAgICAgICAgICAgeTogJ3VuIGFubm8nLFxuICAgICAgICAgICAgeXk6ICclZCBhbm5pJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpdENoO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEl0YWxpYW4gW2l0XVxuLy8hIGF1dGhvciA6IExvcmVuem8gOiBodHRwczovL2dpdGh1Yi5jb20vYWxpZW1cbi8vISBhdXRob3I6IE1hdHRpYSBMYXJlbnRpczogaHR0cHM6Ly9naXRodWIuY29tL25vc3RhbGdpYXpcbi8vISBhdXRob3I6IE1hcmNvIDogaHR0cHM6Ly9naXRodWIuY29tL01hbmZyZTk4XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgaXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdpdCcsIHtcbiAgICAgICAgbW9udGhzOiAnZ2VubmFpb19mZWJicmFpb19tYXJ6b19hcHJpbGVfbWFnZ2lvX2dpdWdub19sdWdsaW9fYWdvc3RvX3NldHRlbWJyZV9vdHRvYnJlX25vdmVtYnJlX2RpY2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2dlbl9mZWJfbWFyX2Fwcl9tYWdfZ2l1X2x1Z19hZ29fc2V0X290dF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWVuaWNhX2x1bmVkw6xfbWFydGVkw6xfbWVyY29sZWTDrF9naW92ZWTDrF92ZW5lcmTDrF9zYWJhdG8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb21fbHVuX21hcl9tZXJfZ2lvX3Zlbl9zYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWVfZ2lfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbT2dnaSBhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgPiAxID8gJ2xsZSAnIDogdGhpcy5ob3VycygpID09PSAwID8gJyAnIDogXCJsbCdcIikgK1xuICAgICAgICAgICAgICAgICAgICAnXUxUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbRG9tYW5pIGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSA+IDEgPyAnbGxlICcgOiB0aGlzLmhvdXJzKCkgPT09IDAgPyAnICcgOiBcImxsJ1wiKSArXG4gICAgICAgICAgICAgICAgICAgICddTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdkZGRkIFthJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgPiAxID8gJ2xsZSAnIDogdGhpcy5ob3VycygpID09PSAwID8gJyAnIDogXCJsbCdcIikgK1xuICAgICAgICAgICAgICAgICAgICAnXUxUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbSWVyaSBhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgPiAxID8gJ2xsZSAnIDogdGhpcy5ob3VycygpID09PSAwID8gJyAnIDogXCJsbCdcIikgK1xuICAgICAgICAgICAgICAgICAgICAnXUxUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW0xhIHNjb3JzYV0gZGRkZCBbYScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2xsZSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5ob3VycygpID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwibGwnXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXUxUJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1tMbyBzY29yc29dIGRkZGQgW2EnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpID4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdsbGUgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuaG91cnMoKSA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJyAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImxsJ1wiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ11MVCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAndHJhICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBmYScsXG4gICAgICAgICAgICBzOiAnYWxjdW5pIHNlY29uZGknLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRpJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGknLFxuICAgICAgICAgICAgaDogXCJ1bidvcmFcIixcbiAgICAgICAgICAgIGhoOiAnJWQgb3JlJyxcbiAgICAgICAgICAgIGQ6ICd1biBnaW9ybm8nLFxuICAgICAgICAgICAgZGQ6ICclZCBnaW9ybmknLFxuICAgICAgICAgICAgdzogJ3VuYSBzZXR0aW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZXR0aW1hbmUnLFxuICAgICAgICAgICAgTTogJ3VuIG1lc2UnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNpJyxcbiAgICAgICAgICAgIHk6ICd1biBhbm5vJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5uaScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSmFwYW5lc2UgW2phXVxuLy8hIGF1dGhvciA6IExJIExvbmcgOiBodHRwczovL2dpdGh1Yi5jb20vYmFyeW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgamEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdqYScsIHtcbiAgICAgICAgZXJhczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMjAxOS0wNS0wMScsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICfku6TlkownLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ+OLvycsXG4gICAgICAgICAgICAgICAgYWJicjogJ1InLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzE5ODktMDEtMDgnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAnMjAxOS0wNC0zMCcsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICflubPmiJAnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ+ONuycsXG4gICAgICAgICAgICAgICAgYWJicjogJ0gnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzE5MjYtMTItMjUnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAnMTk4OS0wMS0wNycsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICfmmK3lkownLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ+ONvCcsXG4gICAgICAgICAgICAgICAgYWJicjogJ1MnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzE5MTItMDctMzAnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAnMTkyNi0xMi0yNCcsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICflpKfmraMnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ+ONvScsXG4gICAgICAgICAgICAgICAgYWJicjogJ1QnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzE4NzMtMDEtMDEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAnMTkxMi0wNy0yOScsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiA2LFxuICAgICAgICAgICAgICAgIG5hbWU6ICfmmI7msrsnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ+ONvicsXG4gICAgICAgICAgICAgICAgYWJicjogJ00nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzAwMDEtMDEtMDEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAnMTg3My0xMi0zMScsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICfopb/mmqYnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ0FEJyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnQUQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzAwMDAtMTItMzEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAtSW5maW5pdHksXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICfntIDlhYPliY0nLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ0JDJyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnQkMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZXJhWWVhck9yZGluYWxSZWdleDogLyjlhYN8XFxkKynlubQvLFxuICAgICAgICBlcmFZZWFyT3JkaW5hbFBhcnNlOiBmdW5jdGlvbiAoaW5wdXQsIG1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV0gPT09ICflhYMnID8gMSA6IHBhcnNlSW50KG1hdGNoWzFdIHx8IGlucHV0LCAxMCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoczogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aXpeabnOaXpV/mnIjmm5zml6Vf54Gr5puc5pelX+awtOabnOaXpV/mnKjmm5zml6Vf6YeR5puc5pelX+Wcn+abnOaXpScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+aXpV/mnIhf54GrX+awtF/mnKhf6YeRX+Wcnycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5pyIX+eBq1/msLRf5pyoX+mHkV/lnJ8nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelIGRkZGQgSEg6bW0nLFxuICAgICAgICAgICAgbDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6UoZGRkKSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/ljYjliY185Y2I5b6ML2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn5Y2I5b6MJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WNiOWJjSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Y2I5b6MJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb5LuK5pelXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+aYjuaXpV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93LndlZWsoKSAhPT0gdGhpcy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5p2l6YCxXWRkZGQgTFQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5pelXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLndlZWsoKSAhPT0gbm93LndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vlhYjpgLFdZGRkZCBMVCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ95pelLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyID09PSAxID8gJ+WFg+W5tCcgOiBudW1iZXIgKyAn5bm0JztcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+W+jCcsXG4gICAgICAgICAgICBwYXN0OiAnJXPliY0nLFxuICAgICAgICAgICAgczogJ+aVsOenkicsXG4gICAgICAgICAgICBzczogJyVk56eSJyxcbiAgICAgICAgICAgIG06ICcx5YiGJyxcbiAgICAgICAgICAgIG1tOiAnJWTliIYnLFxuICAgICAgICAgICAgaDogJzHmmYLplpMnLFxuICAgICAgICAgICAgaGg6ICclZOaZgumWkycsXG4gICAgICAgICAgICBkOiAnMeaXpScsXG4gICAgICAgICAgICBkZDogJyVk5pelJyxcbiAgICAgICAgICAgIE06ICcx44O25pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWTjg7bmnIgnLFxuICAgICAgICAgICAgeTogJzHlubQnLFxuICAgICAgICAgICAgeXk6ICclZOW5tCcsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gamE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSmF2YW5lc2UgW2p2XVxuLy8hIGF1dGhvciA6IFJvbnkgTGFudGlwIDogaHR0cHM6Ly9naXRodWIuY29tL2xhbnRpcFxuLy8hIHJlZmVyZW5jZTogaHR0cDovL2p2Lndpa2lwZWRpYS5vcmcvd2lraS9CYXNhX0phd2FcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBqdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2p2Jywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpX0ZlYnJ1YXJpX01hcmV0X0FwcmlsX01laV9KdW5pX0p1bGlfQWd1c3R1c19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3BlbWJlcl9EZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWVpX0p1bl9KdWxfQWdzX1NlcF9Pa3RfTm9wX0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdNaW5nZ3VfU2VuZW5fU2Vsb3NvX1JlYnVfS2VtaXNfSmVtdXdhaF9TZXB0dScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ01pbl9TZW5fU2VsX1JlYl9LZW1fSmVtX1NlcCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdNZ19Tbl9TbF9SYl9LbV9KbV9TcCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEgubW0nLFxuICAgICAgICAgICAgTFRTOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2VuamluZ3xzaXlhbmd8c29udGVufG5kYWx1LyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAnZW5qaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NpeWFuZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnc29udGVuJyB8fCBtZXJpZGllbSA9PT0gJ25kYWx1Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlbmppbmcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzaXlhbmcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzb250ZW4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25kYWx1JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbRGludGVuIHB1bmlrbyBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tNYmVuamFuZyBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tLYWxhIHdpbmdpIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2tlcGVuZ2tlciBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd3b250ZW4gaW5nICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBpbmdrYW5nIGtlcGVuZ2tlcicsXG4gICAgICAgICAgICBzOiAnc2F3ZXRhd2lzIGRldGlrJyxcbiAgICAgICAgICAgIHNzOiAnJWQgZGV0aWsnLFxuICAgICAgICAgICAgbTogJ3NldHVuZ2dhbCBtZW5pdCcsXG4gICAgICAgICAgICBtbTogJyVkIG1lbml0JyxcbiAgICAgICAgICAgIGg6ICdzZXR1bmdnYWwgamFtJyxcbiAgICAgICAgICAgIGhoOiAnJWQgamFtJyxcbiAgICAgICAgICAgIGQ6ICdzZWRpbnRlbicsXG4gICAgICAgICAgICBkZDogJyVkIGRpbnRlbicsXG4gICAgICAgICAgICBNOiAnc2V3dWxhbicsXG4gICAgICAgICAgICBNTTogJyVkIHd1bGFuJyxcbiAgICAgICAgICAgIHk6ICdzZXRhdW4nLFxuICAgICAgICAgICAgeXk6ICclZCB0YXVuJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGp2O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdlb3JnaWFuIFtrYV1cbi8vISBhdXRob3IgOiBJcmFrbGkgSmFuaWFzaHZpbGkgOiBodHRwczovL2dpdGh1Yi5jb20vSXJha2xpSmFuaVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGthID0gbW9tZW50LmRlZmluZUxvY2FsZSgna2EnLCB7XG4gICAgICAgIG1vbnRoczogJ+GDmOGDkOGDnOGDleGDkOGDoOGDmF/hg5fhg5Thg5Hhg5Thg6Dhg5Xhg5Dhg5rhg5hf4YOb4YOQ4YOg4YOi4YOYX+GDkOGDnuGDoOGDmOGDmuGDmF/hg5vhg5Dhg5jhg6Hhg5hf4YOY4YOV4YOc4YOY4YOh4YOYX+GDmOGDleGDmuGDmOGDoeGDmF/hg5Dhg5Lhg5Xhg5jhg6Hhg6Lhg51f4YOh4YOU4YOl4YOi4YOU4YOb4YOR4YOU4YOg4YOYX+GDneGDpeGDouGDneGDm+GDkeGDlOGDoOGDmF/hg5zhg53hg5Thg5vhg5Hhg5Thg6Dhg5hf4YOT4YOU4YOZ4YOU4YOb4YOR4YOU4YOg4YOYJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ+GDmOGDkOGDnF/hg5fhg5Thg5Ff4YOb4YOQ4YOgX+GDkOGDnuGDoF/hg5vhg5Dhg5hf4YOY4YOV4YOcX+GDmOGDleGDml/hg5Dhg5Lhg5Vf4YOh4YOU4YOlX+GDneGDpeGDol/hg5zhg53hg5Rf4YOT4YOU4YOZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn4YOZ4YOV4YOY4YOg4YOQX+GDneGDoOGDqOGDkOGDkeGDkOGDl+GDmF/hg6Hhg5Dhg5vhg6jhg5Dhg5Hhg5Dhg5fhg5hf4YOd4YOX4YOu4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDruGDo+GDl+GDqOGDkOGDkeGDkOGDl+GDmF/hg57hg5Dhg6Dhg5Dhg6Hhg5nhg5Thg5Xhg5hf4YOo4YOQ4YOR4YOQ4YOX4YOYJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ+GDmeGDleGDmOGDoOGDkOGDoV/hg53hg6Dhg6jhg5Dhg5Hhg5Dhg5fhg6Ff4YOh4YOQ4YOb4YOo4YOQ4YOR4YOQ4YOX4YOhX+GDneGDl+GDruGDqOGDkOGDkeGDkOGDl+GDoV/hg67hg6Phg5fhg6jhg5Dhg5Hhg5Dhg5fhg6Ff4YOe4YOQ4YOg4YOQ4YOh4YOZ4YOU4YOV4YOhX+GDqOGDkOGDkeGDkOGDl+GDoScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC8o4YOs4YOY4YOc4YOQfOGDqOGDlOGDm+GDk+GDlOGDkikvLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4YOZ4YOV4YOYX+GDneGDoOGDqF/hg6Hhg5Dhg5tf4YOd4YOX4YOuX+GDruGDo+GDl1/hg57hg5Dhg6Bf4YOo4YOQ4YORJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+GDmeGDlV/hg53hg6Bf4YOh4YOQX+GDneGDl1/hg67hg6Nf4YOe4YOQX+GDqOGDkCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vhg5Phg6bhg5Thg6FdIExUWy3hg5bhg5RdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4YOu4YOV4YOQ4YOaXSBMVFst4YOW4YOUXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+GDkuGDo+GDqOGDmOGDnF0gTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4YOo4YOU4YOb4YOT4YOU4YOSXSBkZGRkIExUWy3hg5bhg5RdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+GDrOGDmOGDnOGDkF0gZGRkZCBMVC3hg5bhg5QnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgLyjhg6zhg5Dhg5t84YOs4YOj4YOXfOGDoeGDkOGDkOGDl3zhg6zhg5Thg5p84YOT4YOmfOGDl+GDlSko4YOYfOGDlCkvLFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoJDAsICQxLCAkMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQyID09PSAn4YOYJyA/ICQxICsgJ+GDqOGDmCcgOiAkMSArICQyICsgJ+GDqOGDmCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3Q6IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgaWYgKC8o4YOs4YOQ4YOb4YOYfOGDrOGDo+GDl+GDmHzhg6Hhg5Dhg5Dhg5fhg5h84YOT4YOm4YOUfOGDl+GDleGDlCkvLnRlc3QocykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvKOGDmHzhg5QpJC8sICfhg5jhg6Eg4YOs4YOY4YOcJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgv4YOs4YOU4YOa4YOYLy50ZXN0KHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoL+GDrOGDlOGDmuGDmCQvLCAn4YOs4YOa4YOY4YOhIOGDrOGDmOGDnCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzOiAn4YOg4YOQ4YOb4YOT4YOU4YOc4YOY4YOb4YOUIOGDrOGDkOGDm+GDmCcsXG4gICAgICAgICAgICBzczogJyVkIOGDrOGDkOGDm+GDmCcsXG4gICAgICAgICAgICBtOiAn4YOs4YOj4YOX4YOYJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4YOs4YOj4YOX4YOYJyxcbiAgICAgICAgICAgIGg6ICfhg6Hhg5Dhg5Dhg5fhg5gnLFxuICAgICAgICAgICAgaGg6ICclZCDhg6Hhg5Dhg5Dhg5fhg5gnLFxuICAgICAgICAgICAgZDogJ+GDk+GDpuGDlCcsXG4gICAgICAgICAgICBkZDogJyVkIOGDk+GDpuGDlCcsXG4gICAgICAgICAgICBNOiAn4YOX4YOV4YOUJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4YOX4YOV4YOUJyxcbiAgICAgICAgICAgIHk6ICfhg6zhg5Thg5rhg5gnLFxuICAgICAgICAgICAgeXk6ICclZCDhg6zhg5Thg5rhg5gnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvMHwxLeGDmuGDmHzhg5vhg5QtXFxkezEsMn18XFxkezEsMn0t4YOULyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct4YOa4YOYJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBudW1iZXIgPCAyMCB8fFxuICAgICAgICAgICAgICAgIChudW1iZXIgPD0gMTAwICYmIG51bWJlciAlIDIwID09PSAwKSB8fFxuICAgICAgICAgICAgICAgIG51bWJlciAlIDEwMCA9PT0gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfhg5vhg5QtJyArIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLeGDlCc7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSxcbiAgICAgICAgICAgIGRveTogNyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBrYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLYXpha2ggW2trXVxuLy8hIGF1dGhvcnMgOiBOdXJsYW4gUmFraGltemhhbm92IDogaHR0cHM6Ly9naXRodWIuY29tL251cmxhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN1ZmZpeGVzID0ge1xuICAgICAgICAwOiAnLdGI0ZYnLFxuICAgICAgICAxOiAnLdGI0ZYnLFxuICAgICAgICAyOiAnLdGI0ZYnLFxuICAgICAgICAzOiAnLdGI0ZYnLFxuICAgICAgICA0OiAnLdGI0ZYnLFxuICAgICAgICA1OiAnLdGI0ZYnLFxuICAgICAgICA2OiAnLdGI0YsnLFxuICAgICAgICA3OiAnLdGI0ZYnLFxuICAgICAgICA4OiAnLdGI0ZYnLFxuICAgICAgICA5OiAnLdGI0YsnLFxuICAgICAgICAxMDogJy3RiNGLJyxcbiAgICAgICAgMjA6ICct0YjRiycsXG4gICAgICAgIDMwOiAnLdGI0YsnLFxuICAgICAgICA0MDogJy3RiNGLJyxcbiAgICAgICAgNTA6ICct0YjRlicsXG4gICAgICAgIDYwOiAnLdGI0YsnLFxuICAgICAgICA3MDogJy3RiNGWJyxcbiAgICAgICAgODA6ICct0YjRlicsXG4gICAgICAgIDkwOiAnLdGI0YsnLFxuICAgICAgICAxMDA6ICct0YjRlicsXG4gICAgfTtcblxuICAgIHZhciBrayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2trJywge1xuICAgICAgICBtb250aHM6ICfSm9Cw0qPRgtCw0YBf0LDSm9C/0LDQvV/QvdCw0YPRgNGL0Ldf0YHTmdGD0ZbRgF/QvNCw0LzRi9GAX9C80LDRg9GB0YvQvF/RiNGW0LvQtNC1X9GC0LDQvNGL0Ldf0pvRi9GA0LrSr9C50LXQul/Sm9Cw0LfQsNC9X9Kb0LDRgNCw0YjQsF/QttC10LvRgtC+0pvRgdCw0L0nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0pvQsNKjX9Cw0pvQv1/QvdCw0YNf0YHTmdGDX9C80LDQvF/QvNCw0YNf0YjRltC7X9GC0LDQvF/Sm9GL0YBf0pvQsNC3X9Kb0LDRgF/QttC10LsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn0LbQtdC60YHQtdC90LHRll/QtNKv0LnRgdC10L3QsdGWX9GB0LXQudGB0LXQvdCx0ZZf0YHTmdGA0YHQtdC90LHRll/QsdC10LnRgdC10L3QsdGWX9C20rHQvNCwX9GB0LXQvdCx0ZYnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQttC10Lpf0LTSr9C5X9GB0LXQuV/RgdOZ0YBf0LHQtdC5X9C20rHQvF/RgdC10L0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0LbQul/QtNC5X9GB0Llf0YHRgF/QsdC5X9C20Lxf0YHQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQkdKv0LPRltC9INGB0LDSk9Cw0YJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0JXRgNGC0LXSoyDRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9GB0LDSk9Cw0YJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0JrQtdGI0LUg0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb06jRgtC60LXQvSDQsNC/0YLQsNC90YvSo10gZGRkZCBb0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDRltGI0ZbQvdC00LUnLFxuICAgICAgICAgICAgcGFzdDogJyVzINCx0rHRgNGL0L0nLFxuICAgICAgICAgICAgczogJ9Cx0ZbRgNC90LXRiNC1INGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBzczogJyVkINGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtOiAn0LHRltGAINC80LjQvdGD0YInLFxuICAgICAgICAgICAgbW06ICclZCDQvNC40L3Rg9GCJyxcbiAgICAgICAgICAgIGg6ICfQsdGW0YAg0YHQsNKT0LDRgicsXG4gICAgICAgICAgICBoaDogJyVkINGB0LDSk9Cw0YInLFxuICAgICAgICAgICAgZDogJ9Cx0ZbRgCDQutKv0L0nLFxuICAgICAgICAgICAgZGQ6ICclZCDQutKv0L0nLFxuICAgICAgICAgICAgTTogJ9Cx0ZbRgCDQsNC5JyxcbiAgICAgICAgICAgIE1NOiAnJWQg0LDQuScsXG4gICAgICAgICAgICB5OiAn0LHRltGAINC20YvQuycsXG4gICAgICAgICAgICB5eTogJyVkINC20YvQuycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0YjRlnzRiNGLKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgYiA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChzdWZmaXhlc1tudW1iZXJdIHx8IHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGtrO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENhbWJvZGlhbiBba21dXG4vLyEgYXV0aG9yIDogS3J1eSBWYW5uYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rcnV5dmFubmFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4Z+hJyxcbiAgICAgICAgICAgIDI6ICfhn6InLFxuICAgICAgICAgICAgMzogJ+GfoycsXG4gICAgICAgICAgICA0OiAn4Z+kJyxcbiAgICAgICAgICAgIDU6ICfhn6UnLFxuICAgICAgICAgICAgNjogJ+GfpicsXG4gICAgICAgICAgICA3OiAn4Z+nJyxcbiAgICAgICAgICAgIDg6ICfhn6gnLFxuICAgICAgICAgICAgOTogJ+GfqScsXG4gICAgICAgICAgICAwOiAn4Z+gJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+GfoSc6ICcxJyxcbiAgICAgICAgICAgICfhn6InOiAnMicsXG4gICAgICAgICAgICAn4Z+jJzogJzMnLFxuICAgICAgICAgICAgJ+GfpCc6ICc0JyxcbiAgICAgICAgICAgICfhn6UnOiAnNScsXG4gICAgICAgICAgICAn4Z+mJzogJzYnLFxuICAgICAgICAgICAgJ+Gfpyc6ICc3JyxcbiAgICAgICAgICAgICfhn6gnOiAnOCcsXG4gICAgICAgICAgICAn4Z+pJzogJzknLFxuICAgICAgICAgICAgJ+GfoCc6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBrbSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ttJywge1xuICAgICAgICBtb250aHM6ICfhnpjhnoDhnprhnrZf4Z6A4Z674Z6Y4Z+S4Z6X4Z+IX+GemOGeuOGek+Getl/hnpjhn4Hhnp/hnrZf4Z6n4Z6f4Z6X4Z62X+GemOGet+GekOGeu+Gek+Getl/hnoDhnoDhn5LhnoDhnorhnrZf4Z6f4Z644Z6g4Z62X+GegOGeieGfkuGeieGetl/hno/hnrvhnpvhnrZf4Z6c4Z634Z6F4Z+S4Z6G4Z634Z6A4Z62X+GekuGfkuGek+GevCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4Z6Y4Z6A4Z6a4Z62X+GegOGeu+GemOGfkuGel+GfiF/hnpjhnrjhnpPhnrZf4Z6Y4Z+B4Z6f4Z62X+Gep+Gen+Gel+Getl/hnpjhnrfhnpDhnrvhnpPhnrZf4Z6A4Z6A4Z+S4Z6A4Z6K4Z62X+Gen+GeuOGeoOGetl/hnoDhnonhn5LhnonhnrZf4Z6P4Z674Z6b4Z62X+GenOGet+GeheGfkuGehuGet+GegOGetl/hnpLhn5LhnpPhnrwnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfhnqLhnrbhnpHhnrfhno/hn5Lhnplf4Z6F4Z+Q4Z6T4Z+S4Z6RX+GeouGehOGfkuGeguGetuGeml/hnpbhnrvhnpJf4Z6W4Z+S4Z6a4Z6g4Z6f4Z+S4Z6U4Z6P4Z634Z+NX+Gen+Geu+GegOGfkuGeml/hnp/hn4Xhnprhn40nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfhnqLhnrZf4Z6FX+Geol/hnpZf4Z6W4Z+S4Z6aX+Gen+Geu1/hnp8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4Z6i4Z62X+GehV/hnqJf4Z6WX+GeluGfkuGeml/hnp/hnrtf4Z6fJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+GeluGfkuGemuGeueGegHzhnpvhn5LhnoThnrbhnoUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+Gem+GfkuGehOGetuGehSc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfhnpbhn5LhnprhnrnhnoAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+Gem+GfkuGehOGetuGehSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+GekOGfkuGehOGfg+Gek+GfgeGfhyDhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4Z6f4Z+S4Z6i4Z+C4Z6AIOGemOGfieGfhOGehF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4Z6Y4Z+S4Z6f4Z634Z6b4Z6Y4Z634Z6JIOGemOGfieGfhOGehF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvhnp/hnpThn5Lhno/hnrbhnqDhn43hnpjhnrvhnpNdIFvhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPhnpHhn4Dhno8nLFxuICAgICAgICAgICAgcGFzdDogJyVz4Z6Y4Z674Z6TJyxcbiAgICAgICAgICAgIHM6ICfhnpThn4nhnrvhnpPhn5LhnpjhnrbhnpPhnpzhnrfhnpPhnrbhnpHhnrgnLFxuICAgICAgICAgICAgc3M6ICclZCDhnpzhnrfhnpPhnrbhnpHhnrgnLFxuICAgICAgICAgICAgbTogJ+GemOGeveGemeGek+GetuGekeGeuCcsXG4gICAgICAgICAgICBtbTogJyVkIOGek+GetuGekeGeuCcsXG4gICAgICAgICAgICBoOiAn4Z6Y4Z694Z6Z4Z6Y4Z+J4Z+E4Z6EJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4Z6Y4Z+J4Z+E4Z6EJyxcbiAgICAgICAgICAgIGQ6ICfhnpjhnr3hnpnhnpDhn5LhnoThn4MnLFxuICAgICAgICAgICAgZGQ6ICclZCDhnpDhn5LhnoThn4MnLFxuICAgICAgICAgICAgTTogJ+GemOGeveGemeGegeGfgicsXG4gICAgICAgICAgICBNTTogJyVkIOGegeGfgicsXG4gICAgICAgICAgICB5OiAn4Z6Y4Z694Z6Z4Z6G4Z+S4Z6T4Z624Z+GJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Z6G4Z+S4Z6T4Z624Z+GJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL+GekeGeuFxcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogJ+GekeGeuCVkJyxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+GfoeGfouGfo+GfpOGfpeGfpuGfp+GfqOGfqeGfoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGttO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEthbm5hZGEgW2tuXVxuLy8hIGF1dGhvciA6IFJhamVldiBOYWlrIDogaHR0cHM6Ly9naXRodWIuY29tL3JhamVldm5haWt0ZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgs6cnLFxuICAgICAgICAgICAgMjogJ+CzqCcsXG4gICAgICAgICAgICAzOiAn4LOpJyxcbiAgICAgICAgICAgIDQ6ICfgs6onLFxuICAgICAgICAgICAgNTogJ+CzqycsXG4gICAgICAgICAgICA2OiAn4LOsJyxcbiAgICAgICAgICAgIDc6ICfgs60nLFxuICAgICAgICAgICAgODogJ+CzricsXG4gICAgICAgICAgICA5OiAn4LOvJyxcbiAgICAgICAgICAgIDA6ICfgs6YnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4LOnJzogJzEnLFxuICAgICAgICAgICAgJ+CzqCc6ICcyJyxcbiAgICAgICAgICAgICfgs6knOiAnMycsXG4gICAgICAgICAgICAn4LOqJzogJzQnLFxuICAgICAgICAgICAgJ+Czqyc6ICc1JyxcbiAgICAgICAgICAgICfgs6wnOiAnNicsXG4gICAgICAgICAgICAn4LOtJzogJzcnLFxuICAgICAgICAgICAgJ+Czric6ICc4JyxcbiAgICAgICAgICAgICfgs68nOiAnOScsXG4gICAgICAgICAgICAn4LOmJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGtuID0gbW9tZW50LmRlZmluZUxvY2FsZSgna24nLCB7XG4gICAgICAgIG1vbnRoczogJ+CynOCyqOCyteCysOCyv1/gsqvgs4bgsqzgs43gsrDgsrXgsrDgsr9f4LKu4LK+4LKw4LON4LKa4LONX+Cyj+CyquCzjeCysOCyv+CysuCzjV/gsq7gs4bgs5Vf4LKc4LOC4LKo4LONX+CynOCzgeCysuCzhuCzll/gsobgspfgsrjgs43gsp/gs41f4LK44LOG4LKq4LON4LKf4LOG4LKC4LKs4LKw4LONX+CyheCyleCzjeCyn+CzhuCzguCzleCyrOCysOCzjV/gsqjgsrXgs4bgsoLgsqzgsrDgs41f4LKh4LK/4LK44LOG4LKC4LKs4LKw4LONJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgspzgsqhf4LKr4LOG4LKs4LON4LKwX+CyruCyvuCysOCzjeCymuCzjV/gso/gsqrgs43gsrDgsr/gsrLgs41f4LKu4LOG4LOVX+CynOCzguCyqOCzjV/gspzgs4HgsrLgs4bgs5Zf4LKG4LKX4LK44LON4LKf4LONX+CyuOCzhuCyquCzjeCyn+CzhuCygl/gsoXgspXgs43gsp/gs4bgs4Lgs5Vf4LKo4LK14LOG4LKCX+CyoeCyv+CyuOCzhuCygicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+CyreCyvuCyqOCzgeCyteCyvuCysF/gsrjgs4bgs4Lgs5Xgsq7gsrXgsr7gsrBf4LKu4LKC4LKX4LKz4LK14LK+4LKwX+CyrOCzgeCyp+CyteCyvuCysF/gspfgs4HgsrDgs4HgsrXgsr7gsrBf4LK24LOB4LKV4LON4LKw4LK14LK+4LKwX+CytuCyqOCyv+CyteCyvuCysCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CyreCyvuCyqOCzgV/gsrjgs4bgs4Lgs5Xgsq5f4LKu4LKC4LKX4LKzX+CyrOCzgeCyp1/gspfgs4HgsrDgs4Ff4LK24LOB4LKV4LON4LKwX+CytuCyqOCyvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgsq3gsr5f4LK44LOG4LOC4LOVX+CyruCygl/gsqzgs4Ff4LKX4LOBX+CytuCzgV/gsrYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4LKH4LKC4LKm4LOBXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CyqOCyvuCys+Czhl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CyqOCyv+CyqOCzjeCyqOCzhl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4LKV4LOG4LOC4LKo4LOG4LKvXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCyqOCyguCypOCysCcsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4LK54LK/4LKC4LKm4LOGJyxcbiAgICAgICAgICAgIHM6ICfgspXgs4bgsrLgsrXgs4Eg4LKV4LON4LK34LKj4LKX4LKz4LOBJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4LK44LOG4LKV4LOG4LKC4LKh4LOB4LKX4LKz4LOBJyxcbiAgICAgICAgICAgIG06ICfgspLgsoLgsqbgs4Eg4LKo4LK/4LKu4LK/4LK3JyxcbiAgICAgICAgICAgIG1tOiAnJWQg4LKo4LK/4LKu4LK/4LK3JyxcbiAgICAgICAgICAgIGg6ICfgspLgsoLgsqbgs4Eg4LKX4LKC4LKf4LOGJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4LKX4LKC4LKf4LOGJyxcbiAgICAgICAgICAgIGQ6ICfgspLgsoLgsqbgs4Eg4LKm4LK/4LKoJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4LKm4LK/4LKoJyxcbiAgICAgICAgICAgIE06ICfgspLgsoLgsqbgs4Eg4LKk4LK/4LKC4LKX4LKz4LOBJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4LKk4LK/4LKC4LKX4LKz4LOBJyxcbiAgICAgICAgICAgIHk6ICfgspLgsoLgsqbgs4Eg4LK14LKw4LON4LK3JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4LK14LKw4LON4LK3JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Czp+CzqOCzqeCzquCzq+CzrOCzreCzruCzr+Czpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CysOCyvuCypOCzjeCysOCyv3zgsqzgs4bgsrPgsr/gspfgs43gspfgs4Z84LKu4LKn4LON4LKv4LK+4LK54LON4LKofOCyuOCyguCynOCzhi8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CysOCyvuCypOCzjeCysOCyvycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CyrOCzhuCys+Cyv+Cyl+CzjeCyl+CzhicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsq7gsqfgs43gsq/gsr7gsrngs43gsqgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CyuOCyguCynOCzhicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsrDgsr7gsqTgs43gsrDgsr8nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CyrOCzhuCys+Cyv+Cyl+CzjeCyl+Czhic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LKu4LKn4LON4LKv4LK+4LK54LON4LKoJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsrjgsoLgspzgs4YnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CysOCyvuCypOCzjeCysOCyvyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjgsqjgs4bgs5UpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfgsqjgs4bgs5UnO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga247XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS29yZWFuIFtrb11cbi8vISBhdXRob3IgOiBLeXVuZ3dvb2ssIFBhcmsgOiBodHRwczovL2dpdGh1Yi5jb20va3l1bmd3MDBrXG4vLyEgYXV0aG9yIDogSmVlZXl1bCBMZWUgPGplZWV5dWxAZ21haWwuY29tPlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGtvID0gbW9tZW50LmRlZmluZUxvY2FsZSgna28nLCB7XG4gICAgICAgIG1vbnRoczogJzHsm5RfMuyblF8z7JuUXzTsm5RfNeyblF827JuUXzfsm5RfOOyblF857JuUXzEw7JuUXzEx7JuUXzEy7JuUJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydDogJzHsm5RfMuyblF8z7JuUXzTsm5RfNeyblF827JuUXzfsm5RfOOyblF857JuUXzEw7JuUXzEx7JuUXzEy7JuUJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+ydvOyalOydvF/sm5TsmpTsnbxf7ZmU7JqU7J28X+yImOyalOydvF/rqqnsmpTsnbxf6riI7JqU7J28X+2GoOyalOydvCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+ydvF/sm5Rf7ZmUX+yImF/rqqlf6riIX+2GoCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfsnbxf7JuUX+2ZlF/siJhf66qpX+q4iF/thqAnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkuTU0uREQuJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeuFhCBNTU1NIETsnbwnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeuFhCBNTU1NIETsnbwgQSBoOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ64WEIE1NTU0gROydvCBkZGRkIEEgaDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS5NTS5ERC4nLFxuICAgICAgICAgICAgbGw6ICdZWVlZ64WEIE1NTU0gROydvCcsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ64WEIE1NTU0gROydvCBBIGg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnrhYQgTU1NTSBE7J28IGRkZGQgQSBoOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICfsmKTripggTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ+uCtOydvCBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ+yWtOygnCBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ+yngOuCnOyjvCBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg7ZuEJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDsoIQnLFxuICAgICAgICAgICAgczogJ+uqhyDstIgnLFxuICAgICAgICAgICAgc3M6ICclZOy0iCcsXG4gICAgICAgICAgICBtOiAnMeu2hCcsXG4gICAgICAgICAgICBtbTogJyVk67aEJyxcbiAgICAgICAgICAgIGg6ICftlZwg7Iuc6rCEJyxcbiAgICAgICAgICAgIGhoOiAnJWTsi5zqsIQnLFxuICAgICAgICAgICAgZDogJ+2VmOujqCcsXG4gICAgICAgICAgICBkZDogJyVk7J28JyxcbiAgICAgICAgICAgIE06ICftlZwg64usJyxcbiAgICAgICAgICAgIE1NOiAnJWTri6wnLFxuICAgICAgICAgICAgeTogJ+ydvCDrhYQnLFxuICAgICAgICAgICAgeXk6ICclZOuFhCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjsnbx87JuUfOyjvCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfsnbwnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+yblCc7XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn7KO8JztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv7Jik7KCEfOyYpO2bhC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuID09PSAn7Jik7ZuEJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzVXBwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBob3VyIDwgMTIgPyAn7Jik7KCEJyA6ICfsmKTtm4QnO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGtvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE5vcnRoZXJuIEt1cmRpc2ggW2t1LWttcl1cbi8vISBhdXRob3JzIDogTWF6bHVtIMOWemRvZ2FuIDogaHR0cHM6Ly9naXRodWIuY29tL21lcmdlaGV6XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bSwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgczogWyfDp2VuZCBzYW7DrnllJywgJ8OnZW5kIHNhbsOueWV5YW4nXSxcbiAgICAgICAgICAgIHNzOiBbbnVtICsgJyBzYW7DrnllJywgbnVtICsgJyBzYW7DrnlleWFuJ10sXG4gICAgICAgICAgICBtOiBbJ2RlccOucWV5ZWsnLCAnZGVxw65xZXlla8OqJ10sXG4gICAgICAgICAgICBtbTogW251bSArICcgZGVxw65xZScsIG51bSArICcgZGVxw65xZXlhbiddLFxuICAgICAgICAgICAgaDogWydzYWV0ZWsnLCAnc2FldGVrw6onXSxcbiAgICAgICAgICAgIGhoOiBbbnVtICsgJyBzYWV0JywgbnVtICsgJyBzYWV0YW4nXSxcbiAgICAgICAgICAgIGQ6IFsncm9qZWsnLCAncm9qZWvDqiddLFxuICAgICAgICAgICAgZGQ6IFtudW0gKyAnIHJvaicsIG51bSArICcgcm9qYW4nXSxcbiAgICAgICAgICAgIHc6IFsnaGVmdGV5ZWsnLCAnaGVmdGV5ZWvDqiddLFxuICAgICAgICAgICAgd3c6IFtudW0gKyAnIGhlZnRlJywgbnVtICsgJyBoZWZ0ZXlhbiddLFxuICAgICAgICAgICAgTTogWydtZWhlaycsICdtZWhla8OqJ10sXG4gICAgICAgICAgICBNTTogW251bSArICcgbWVoJywgbnVtICsgJyBtZWhhbiddLFxuICAgICAgICAgICAgeTogWydzYWxlaycsICdzYWxla8OqJ10sXG4gICAgICAgICAgICB5eTogW251bSArICcgc2FsJywgbnVtICsgJyBzYWxhbiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuICAgIC8vIGZ1bmN0aW9uIG9ibGlxdWVOdW1TdWZmaXgobnVtKSB7XG4gICAgLy8gICAgIGlmKG51bS5pbmNsdWRlcygnOicpKVxuICAgIC8vICAgICAgICAgbnVtID0gcGFyc2VJbnQobnVtLnNwbGl0KCc6JylbMF0pO1xuICAgIC8vICAgICBlbHNlXG4gICAgLy8gICAgICAgICBudW0gPSBwYXJzZUludChudW0pO1xuICAgIC8vICAgICByZXR1cm4gbnVtID09IDAgfHwgbnVtICUgMTAgPT0gMSA/ICfDqidcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICA6IChudW0gPiAxMCAmJiBudW0gJSAxMCA9PSAwID8gJ8OuJyA6ICdhbicpO1xuICAgIC8vIH1cbiAgICBmdW5jdGlvbiBlemFmZU51bVN1ZmZpeChudW0pIHtcbiAgICAgICAgbnVtID0gJycgKyBudW07XG4gICAgICAgIHZhciBsID0gbnVtLnN1YnN0cmluZyhudW0ubGVuZ3RoIC0gMSksXG4gICAgICAgICAgICBsbCA9IG51bS5sZW5ndGggPiAxID8gbnVtLnN1YnN0cmluZyhudW0ubGVuZ3RoIC0gMikgOiAnJztcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIShsbCA9PSAxMiB8fCBsbCA9PSAxMykgJiZcbiAgICAgICAgICAgIChsID09ICcyJyB8fCBsID09ICczJyB8fCBsbCA9PSAnNTAnIHx8IGwgPT0gJzcwJyB8fCBsID09ICc4MCcpXG4gICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiAnecOqJztcbiAgICAgICAgcmV0dXJuICfDqic7XG4gICAgfVxuXG4gICAgdmFyIGt1S21yID0gbW9tZW50LmRlZmluZUxvY2FsZSgna3Uta21yJywge1xuICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWxsaW5nIHJ1bGVzIGRlZmluZWQgYnkgdGhlIHdvcmsgZ3JvdXAgb2YgV2VxZmEgTWV6b3BvdGFteWF5w6ogKE1lc29wb3RhbWlhIEZvdW5kYXRpb24pXG4gICAgICAgIC8vIHRoaXMgc2hvdWxkIGJlOiAnS2Fuw7tuYSBQYcWfw65uX1NpYmF0X0FkYXJfTsOuc2FuX0d1bGFuX0hlesOucmFuX1TDrnJtZWhfVGViYXhfw45sb25fw4dpcsOueWEgUMOqxZ/Drm5fw4dpcsOueWEgUGHFn8Oubl9LYW7Du25hIFDDqsWfw65uJ1xuICAgICAgICAvLyBCdXQgdGhlIG5hbWVzIGJlbG93IGFyZSBtb3JlIHdlbGwga25vd24gYW5kIGhhbmR5XG4gICAgICAgIG1vbnRoczogJ1LDqmJlbmRhbl9TaWJhdF9BZGFyX07DrnNhbl9HdWxhbl9IZXrDrnJhbl9Uw65ybWVoX1RlYmF4X8OObG9uX0NvdG1laF9NaWpkYXJfQmVyZmFuYmFyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ1LDqmJfU2liX0FkYV9Ow65zX0d1bF9IZXpfVMOucl9UZWJfw45sb19Db3RfTWlqX0Jlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdZZWvFn2VtX0R1xZ9lbV9Tw6rFn2VtX8OHYXLFn2VtX1DDqm5jxZ9lbV/Djm5fxZ5lbcOuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnWWVrX0R1X1PDql/Dh2FyX1DDqm5fw45uX8WeZW0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnWWVfRHVfU8OqX8OHYV9Qw6pfw45uX8WeZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdibicgOiAnQk4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbicgOiAnUE4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvYm58Qk58cG58UE4vLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0RvIE1NTU1bYV0gWVlZWVthbl0nLFxuICAgICAgICAgICAgTExMOiAnRG8gTU1NTVthXSBZWVlZW2FuXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRG8gTU1NTVthXSBZWVlZW2FuXSBISDptbScsXG4gICAgICAgICAgICBsbDogJ0RvIE1NTVsuXSBZWVlZW2FuXScsXG4gICAgICAgICAgICBsbGw6ICdEbyBNTU1bLl0gWVlZWVthbl0gSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZFsuXSwgRG8gTU1NWy5dIFlZWVlbYW5dIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbw45ybyBkaSBzYWV0XSBMVCBbZGVdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbU2liw6ogZGkgc2FldF0gTFQgW2RlXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2RpIHNhZXRdIExUIFtkZV0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tEdWggZGkgc2FldF0gTFQgW2RlXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGRbYSBib3LDriBkaSBzYWV0XSBMVCBbZGVdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGkgJXMgZGUnLFxuICAgICAgICAgICAgcGFzdDogJ2JlcsOuICVzJyxcbiAgICAgICAgICAgIHM6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBzczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHc6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3dzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KD86ecOqfMOqfFxcLikvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBwID0gcGVyaW9kLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAocC5pbmNsdWRlcygndycpIHx8IHAuaW5jbHVkZXMoJ20nKSkgcmV0dXJuIG51bSArICcuJztcblxuICAgICAgICAgICAgcmV0dXJuIG51bSArIGV6YWZlTnVtU3VmZml4KG51bSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBrdUttcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLdXJkaXNoIFtrdV1cbi8vISBhdXRob3IgOiBTaGFocmFtIE1lYmFzaGFyIDogaHR0cHM6Ly9naXRodWIuY29tL1NoYWhyYW1NZWJhc2hhclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfZoScsXG4gICAgICAgICAgICAyOiAn2aInLFxuICAgICAgICAgICAgMzogJ9mjJyxcbiAgICAgICAgICAgIDQ6ICfZpCcsXG4gICAgICAgICAgICA1OiAn2aUnLFxuICAgICAgICAgICAgNjogJ9mmJyxcbiAgICAgICAgICAgIDc6ICfZpycsXG4gICAgICAgICAgICA4OiAn2agnLFxuICAgICAgICAgICAgOTogJ9mpJyxcbiAgICAgICAgICAgIDA6ICfZoCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfZoSc6ICcxJyxcbiAgICAgICAgICAgICfZoic6ICcyJyxcbiAgICAgICAgICAgICfZoyc6ICczJyxcbiAgICAgICAgICAgICfZpCc6ICc0JyxcbiAgICAgICAgICAgICfZpSc6ICc1JyxcbiAgICAgICAgICAgICfZpic6ICc2JyxcbiAgICAgICAgICAgICfZpyc6ICc3JyxcbiAgICAgICAgICAgICfZqCc6ICc4JyxcbiAgICAgICAgICAgICfZqSc6ICc5JyxcbiAgICAgICAgICAgICfZoCc6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9qp2KfZhtmI2YbbjCDYr9mI2YjbldmFJyxcbiAgICAgICAgICAgICfYtNmI2KjYp9iqJyxcbiAgICAgICAgICAgICfYptin2LLYp9ixJyxcbiAgICAgICAgICAgICfZhtuM2LPYp9mGJyxcbiAgICAgICAgICAgICfYptin24zYp9ixJyxcbiAgICAgICAgICAgICfYrdmI2LLblduM2LHYp9mGJyxcbiAgICAgICAgICAgICfYqtuV2YXZhdmI2LInLFxuICAgICAgICAgICAgJ9im2KfYqCcsXG4gICAgICAgICAgICAn2KbblduM2YTZiNmI2YQnLFxuICAgICAgICAgICAgJ9iq2LTYsduM2YbbjCDbjNuV2YPbldmFJyxcbiAgICAgICAgICAgICfYqti02LHbjNmG24wg2K/ZiNmI25XZhScsXG4gICAgICAgICAgICAn2YPYp9mG2YjZhtuMINuM25XaqduV2YUnLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGt1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgna3UnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfbjNmH4oCM2YPYtNmH4oCM2YXZhdmH4oCMX9iv2YjZiNi02YfigIzZhdmF2YfigIxf2LPbjti02YfigIzZhdmF2YfigIxf2obZiNin2LHYtNmH4oCM2YXZhdmH4oCMX9m+247Zhtis2LTZh+KAjNmF2YXZh+KAjF/Zh9mH4oCM24zZhtuMX9i02YfigIzZhdmF2YfigIwnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDpcbiAgICAgICAgICAgICfbjNmH4oCM2YPYtNmH4oCM2YVf2K/ZiNmI2LTZh+KAjNmFX9iz247YtNmH4oCM2YVf2obZiNin2LHYtNmH4oCM2YVf2b7bjtmG2KzYtNmH4oCM2YVf2YfZh+KAjNuM2YbbjF/YtNmH4oCM2YXZhdmH4oCMJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9uMX9ivX9izX9qGX9m+X9mHX9i0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9im247ZiNin2LHZh+KAjHzYqNmH4oCM24zYp9mG24wvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAv2KbbjtmI2KfYsdmH4oCMLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9io2YfigIzbjNin2YbbjCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2KbbjtmI2KfYsdmH4oCMJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KbZh+KAjNmF2LHbhiDZg9in2KramNmF247YsV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYqNmH4oCM24zYp9mG24wg2YPYp9iq2pjZhduO2LFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2YPYp9iq2pjZhduO2LFdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2K/ZiNuO2YbbjiDZg9in2KramNmF247YsV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvZg9in2KramNmF247YsV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZhNmH4oCMICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcycsXG4gICAgICAgICAgICBzOiAn2obZh+KAjNmG2K8g2obYsdmD2YfigIzbjNmH4oCM2YMnLFxuICAgICAgICAgICAgc3M6ICfahtix2YPZh+KAjCAlZCcsXG4gICAgICAgICAgICBtOiAn24zZh+KAjNmDINiu2YjZhNmH4oCM2YMnLFxuICAgICAgICAgICAgbW06ICclZCDYrtmI2YTZh+KAjNmDJyxcbiAgICAgICAgICAgIGg6ICfbjNmH4oCM2YMg2YPYp9iq2pjZhduO2LEnLFxuICAgICAgICAgICAgaGg6ICclZCDZg9in2KramNmF247YsScsXG4gICAgICAgICAgICBkOiAn24zZh+KAjNmDINqV24bamCcsXG4gICAgICAgICAgICBkZDogJyVkINqV24bamCcsXG4gICAgICAgICAgICBNOiAn24zZh+KAjNmDINmF2KfZhtqvJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2YXYp9mG2q8nLFxuICAgICAgICAgICAgeTogJ9uM2YfigIzZgyDYs9in2rUnLFxuICAgICAgICAgICAgeXk6ICclZCDYs9in2rUnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b2aHZotmj2aTZpdmm2afZqNmp2aBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBrdTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLeXJneXogW2t5XVxuLy8hIGF1dGhvciA6IENoeW5neXogQXJ5c3RhbiB1dWx1IDogaHR0cHM6Ly9naXRodWIuY29tL2NoeW5neXpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMDogJy3Rh9KvJyxcbiAgICAgICAgMTogJy3Rh9C4JyxcbiAgICAgICAgMjogJy3Rh9C4JyxcbiAgICAgICAgMzogJy3Rh9KvJyxcbiAgICAgICAgNDogJy3Rh9KvJyxcbiAgICAgICAgNTogJy3Rh9C4JyxcbiAgICAgICAgNjogJy3Rh9GLJyxcbiAgICAgICAgNzogJy3Rh9C4JyxcbiAgICAgICAgODogJy3Rh9C4JyxcbiAgICAgICAgOTogJy3Rh9GDJyxcbiAgICAgICAgMTA6ICct0YfRgycsXG4gICAgICAgIDIwOiAnLdGH0YsnLFxuICAgICAgICAzMDogJy3Rh9GDJyxcbiAgICAgICAgNDA6ICct0YfRiycsXG4gICAgICAgIDUwOiAnLdGH0q8nLFxuICAgICAgICA2MDogJy3Rh9GLJyxcbiAgICAgICAgNzA6ICct0YfQuCcsXG4gICAgICAgIDgwOiAnLdGH0LgnLFxuICAgICAgICA5MDogJy3Rh9GDJyxcbiAgICAgICAgMTAwOiAnLdGH0q8nLFxuICAgIH07XG5cbiAgICB2YXIga3kgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdreScsIHtcbiAgICAgICAgbW9udGhzOiAn0Y/QvdCy0LDRgNGMX9GE0LXQstGA0LDQu9GMX9C80LDRgNGCX9Cw0L/RgNC10LvRjF/QvNCw0Llf0LjRjtC90Yxf0LjRjtC70Yxf0LDQstCz0YPRgdGCX9GB0LXQvdGC0Y/QsdGA0Yxf0L7QutGC0Y/QsdGA0Yxf0L3QvtGP0LHRgNGMX9C00LXQutCw0LHRgNGMJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9GP0L3Qsl/RhNC10LJf0LzQsNGA0YJf0LDQv9GAX9C80LDQuV/QuNGO0L3RjF/QuNGO0LvRjF/QsNCy0LNf0YHQtdC9X9C+0LrRgl/QvdC+0Y9f0LTQtdC6Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9CW0LXQutGI0LXQvNCx0Lhf0JTSr9C50YjTqdC80LHSr1/QqNC10LnRiNC10LzQsdC4X9Co0LDRgNGI0LXQvNCx0Lhf0JHQtdC50YjQtdC80LHQuF/QltGD0LzQsF/QmNGI0LXQvNCx0LgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQltC10Lpf0JTSr9C5X9Co0LXQuV/QqNCw0YBf0JHQtdC5X9CW0YPQvF/QmNGI0LUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0JbQul/QlNC5X9Co0Llf0KjRgF/QkdC5X9CW0Lxf0JjRiCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQkdKv0LPSr9C9INGB0LDQsNGCXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Ct0YDRgtC10qMg0YHQsNCw0YJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb0YHQsNCw0YJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0JrQtdGH0Y3RjSDRgdCw0LDRgl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb06jRgtC606nQvSDQsNC/0YLQsNC90YvQvV0gZGRkZCBb0LrSr9C90q9dIFvRgdCw0LDRgl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDQuNGH0LjQvdC00LUnLFxuICAgICAgICAgICAgcGFzdDogJyVzINC80YPRgNGD0L0nLFxuICAgICAgICAgICAgczogJ9Cx0LjRgNC90LXRh9C1INGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBzczogJyVkINGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtOiAn0LHQuNGAINC80q/QvdOp0YInLFxuICAgICAgICAgICAgbW06ICclZCDQvNKv0L3TqdGCJyxcbiAgICAgICAgICAgIGg6ICfQsdC40YAg0YHQsNCw0YInLFxuICAgICAgICAgICAgaGg6ICclZCDRgdCw0LDRgicsXG4gICAgICAgICAgICBkOiAn0LHQuNGAINC60q/QvScsXG4gICAgICAgICAgICBkZDogJyVkINC60q/QvScsXG4gICAgICAgICAgICBNOiAn0LHQuNGAINCw0LknLFxuICAgICAgICAgICAgTU06ICclZCDQsNC5JyxcbiAgICAgICAgICAgIHk6ICfQsdC40YAg0LbRi9C7JyxcbiAgICAgICAgICAgIHl5OiAnJWQg0LbRi9C7JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjRh9C4fNGH0Yt80YfSr3zRh9GDKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgYiA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChzdWZmaXhlc1tudW1iZXJdIHx8IHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGt5O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEx1eGVtYm91cmdpc2ggW2xiXVxuLy8hIGF1dGhvciA6IG13ZWltZXJza2lyY2ggOiBodHRwczovL2dpdGh1Yi5jb20vbXdlaW1lcnNraXJjaFxuLy8hIGF1dGhvciA6IERhdmlkIFJhaXNvbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rd2lzYXR6XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgbTogWydlbmcgTWludXR0JywgJ2VuZ2VyIE1pbnV0dCddLFxuICAgICAgICAgICAgaDogWydlbmcgU3Rvbm4nLCAnZW5nZXIgU3Rvbm4nXSxcbiAgICAgICAgICAgIGQ6IFsnZWVuIERhZycsICdlbmdlbSBEYWcnXSxcbiAgICAgICAgICAgIE06IFsnZWUgTW91bnQnLCAnZW5nZW0gTW91bnQnXSxcbiAgICAgICAgICAgIHk6IFsnZWUgSm9lcicsICdlbmdlbSBKb2VyJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvY2Vzc0Z1dHVyZVRpbWUoc3RyaW5nKSB7XG4gICAgICAgIHZhciBudW1iZXIgPSBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5pbmRleE9mKCcgJykpO1xuICAgICAgICBpZiAoZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcikpIHtcbiAgICAgICAgICAgIHJldHVybiAnYSAnICsgc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnYW4gJyArIHN0cmluZztcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvY2Vzc1Bhc3RUaW1lKHN0cmluZykge1xuICAgICAgICB2YXIgbnVtYmVyID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZignICcpKTtcbiAgICAgICAgaWYgKGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihudW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3ZpcnUgJyArIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ3ZpcnVuICcgKyBzdHJpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd29yZCBiZWZvcmUgdGhlIGdpdmVuIG51bWJlciBsb3NlcyB0aGUgJy1uJyBlbmRpbmcuXG4gICAgICogZS5nLiAnYW4gMTAgRGVlZycgYnV0ICdhIDUgRGVlZydcbiAgICAgKlxuICAgICAqIEBwYXJhbSBudW1iZXIge2ludGVnZXJ9XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZnVuY3Rpb24gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcikge1xuICAgICAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIsIDEwKTtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgLy8gTmVnYXRpdmUgTnVtYmVyIC0tPiBhbHdheXMgdHJ1ZVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMTApIHtcbiAgICAgICAgICAgIC8vIE9ubHkgMSBkaWdpdFxuICAgICAgICAgICAgaWYgKDQgPD0gbnVtYmVyICYmIG51bWJlciA8PSA3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMTAwKSB7XG4gICAgICAgICAgICAvLyAyIGRpZ2l0c1xuICAgICAgICAgICAgdmFyIGxhc3REaWdpdCA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGZpcnN0RGlnaXQgPSBudW1iZXIgLyAxMDtcbiAgICAgICAgICAgIGlmIChsYXN0RGlnaXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKGZpcnN0RGlnaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihsYXN0RGlnaXQpO1xuICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDEwMDAwKSB7XG4gICAgICAgICAgICAvLyAzIG9yIDQgZGlnaXRzIC0tPiByZWN1cnNpdmVseSBjaGVjayBmaXJzdCBkaWdpdFxuICAgICAgICAgICAgd2hpbGUgKG51bWJlciA+PSAxMCkge1xuICAgICAgICAgICAgICAgIG51bWJlciA9IG51bWJlciAvIDEwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQW55dGhpbmcgbGFyZ2VyIHRoYW4gNCBkaWdpdHM6IHJlY3Vyc2l2ZWx5IGNoZWNrIGZpcnN0IG4tMyBkaWdpdHNcbiAgICAgICAgICAgIG51bWJlciA9IG51bWJlciAvIDEwMDA7XG4gICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdsYicsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyX0ZlYnJ1YXJfTcOkZXJ6X0FicsOrbGxfTWVlX0p1bmlfSnVsaV9BdWd1c3RfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGV6ZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0phbi5fRmVici5fTXJ6Ll9BYnIuX01lZV9KdW4uX0p1bC5fQXVnLl9TZXB0Ll9Pa3QuX05vdi5fRGV6Licuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdTb25uZGVnX03DqWluZGVnX0TDq25zY2hkZWdfTcOrdHR3b2NoX0Rvbm5lc2NoZGVnX0ZyZWlkZWdfU2Ftc2NoZGVnJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTby5fTcOpLl9Ew6suX03Dqy5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTcOpX0TDq19Nw6tfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbSBbQXVlcl0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcyBbQXVlcl0nLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0gW0F1ZXJdJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbSBbQXVlcl0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIYXV0IHVtXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tNdWVyIHVtXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0fDq3NjaHRlciB1bV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBEaWZmZXJlbnQgZGF0ZSBzdHJpbmcgZm9yICdEw6tuc2NoZGVnJyAoVHVlc2RheSkgYW5kICdEb25uZXNjaGRlZycgKFRodXJzZGF5KSBkdWUgdG8gcGhvbm9sb2dpY2FsIHJ1bGVcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tMZXNjaHRlbl0gZGRkZCBbdW1dIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW0xlc2NodGVdIGRkZGQgW3VtXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IHByb2Nlc3NGdXR1cmVUaW1lLFxuICAgICAgICAgICAgcGFzdDogcHJvY2Vzc1Bhc3RUaW1lLFxuICAgICAgICAgICAgczogJ2UgcHVlciBTZWtvbm5lbicsXG4gICAgICAgICAgICBzczogJyVkIFNla29ubmVuJyxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogJyVkIE1pbnV0dGVuJyxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogJyVkIFN0b25uZW4nLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiAnJWQgRGVlZycsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06ICclZCBNw6lpbnQnLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiAnJWQgSm9lcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTGFvIFtsb11cbi8vISBhdXRob3IgOiBSeWFuIEhhcnQgOiBodHRwczovL2dpdGh1Yi5jb20vcnlhbmhhcnQyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbG8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdsbycsIHtcbiAgICAgICAgbW9udGhzOiAn4Lqh4Lqx4LqH4LqB4Lqt4LqZX+C6geC6uOC6oeC6nuC6sl/guqHgurXgupngurJf4LuA4Lqh4Lqq4LqyX+C6nuC6tuC6lOC6quC6sOC6nuC6sl/guqHgurTgupbgurjgupngurJf4LqB4LuN4Lql4Lqw4LqB4Lq74LqUX+C6quC6tOC6h+C6q+C6sl/guoHgurHgupnguo3gurJf4LqV4Lq44Lql4LqyX+C6nuC6sOC6iOC6tOC6gV/gupfgurHgupnguqfgurInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+C6oeC6seC6h+C6geC6reC6mV/guoHgurjguqHgup7gurJf4Lqh4Lq14LqZ4LqyX+C7gOC6oeC6quC6sl/gup7gurbgupTguqrgurDgup7gurJf4Lqh4Lq04LqW4Lq44LqZ4LqyX+C6geC7jeC6peC6sOC6geC6u+C6lF/guqrgurTguofguqvgurJf4LqB4Lqx4LqZ4LqN4LqyX+C6leC6uOC6peC6sl/gup7gurDguojgurTguoFf4LqX4Lqx4LqZ4Lqn4LqyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn4Lqt4Lqy4LqX4Lq04LqUX+C6iOC6seC6mV/guq3gurHguofguoTgurLguplf4Lqe4Lq44LqUX+C6nuC6sOC6q+C6seC6lF/guqrgurjguoFf4LuA4Lqq4Lq74LqyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4LqX4Lq04LqUX+C6iOC6seC6mV/guq3gurHguofguoTgurLguplf4Lqe4Lq44LqUX+C6nuC6sOC6q+C6seC6lF/guqrgurjguoFf4LuA4Lqq4Lq74LqyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+C6l1/guohf4Lqt4LqEX+C6nl/gup7guqtf4Lqq4LqBX+C6qicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICfguqfgurHguplkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C6leC6reC6meC7gOC6iuC6u+C7ieC6snzgupXguq3gupngu4HguqXguocvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+C6leC6reC6meC7geC6peC6hyc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgupXguq3gupngu4Dguorgurvgu4ngurInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C6leC6reC6meC7geC6peC6hyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+C6oeC6t+C7ieC6meC6teC7ieC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vguqHgurfgu4nguq3gurfgu4jgupngu4DguqfguqXgurJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+C6p+C6seC6mV1kZGRkW+C7nOC7ieC6suC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vguqHgurfgu4nguqfgurLgupngupngurXgu4ngu4DguqfguqXgurJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+C6p+C6seC6mV1kZGRkW+C7geC6peC7ieC6p+C6meC6teC7ieC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfguq3gurXguoEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVz4Lqc4LuI4Lqy4LqZ4Lqh4LqyJyxcbiAgICAgICAgICAgIHM6ICfguprgu43gu4jgu4Dgupfgurvgu4jgurLgu4PgupTguqfgurTgupngurLgupfgurUnLFxuICAgICAgICAgICAgc3M6ICclZCDguqfgurTgupngurLgupfgurUnLFxuICAgICAgICAgICAgbTogJzEg4LqZ4Lqy4LqX4Lq1JyxcbiAgICAgICAgICAgIG1tOiAnJWQg4LqZ4Lqy4LqX4Lq1JyxcbiAgICAgICAgICAgIGg6ICcxIOC6iuC6u+C7iOC6p+C7guC6oeC6hycsXG4gICAgICAgICAgICBoaDogJyVkIOC6iuC6u+C7iOC6p+C7guC6oeC6hycsXG4gICAgICAgICAgICBkOiAnMSDguqHgurfgu4knLFxuICAgICAgICAgICAgZGQ6ICclZCDguqHgurfgu4knLFxuICAgICAgICAgICAgTTogJzEg4LuA4LqU4Lq34Lqt4LqZJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4LuA4LqU4Lq34Lqt4LqZJyxcbiAgICAgICAgICAgIHk6ICcxIOC6m+C6tScsXG4gICAgICAgICAgICB5eTogJyVkIOC6m+C6tScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC8o4LqX4Lq14LuIKVxcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuICfgupfgurXgu4gnICsgbnVtYmVyO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IExpdGh1YW5pYW4gW2x0XVxuLy8hIGF1dGhvciA6IE1pbmRhdWdhcyBNb3rFq3JhcyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tbW96dXJhc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHVuaXRzID0ge1xuICAgICAgICBzczogJ3Nla3VuZMSXX3Nla3VuZMW+acWzX3Nla3VuZGVzJyxcbiAgICAgICAgbTogJ21pbnV0xJdfbWludXTEl3NfbWludXTEmScsXG4gICAgICAgIG1tOiAnbWludXTEl3NfbWludcSNacWzX21pbnV0ZXMnLFxuICAgICAgICBoOiAndmFsYW5kYV92YWxhbmRvc192YWxhbmTEhScsXG4gICAgICAgIGhoOiAndmFsYW5kb3NfdmFsYW5kxbNfdmFsYW5kYXMnLFxuICAgICAgICBkOiAnZGllbmFfZGllbm9zX2RpZW7EhScsXG4gICAgICAgIGRkOiAnZGllbm9zX2RpZW7Fs19kaWVuYXMnLFxuICAgICAgICBNOiAnbcSXbnVvX23El25lc2lvX23El25lc8SvJyxcbiAgICAgICAgTU06ICdtxJduZXNpYWlfbcSXbmVzacWzX23El25lc2l1cycsXG4gICAgICAgIHk6ICdtZXRhaV9tZXTFs19tZXR1cycsXG4gICAgICAgIHl5OiAnbWV0YWlfbWV0xbNfbWV0dXMnLFxuICAgIH07XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlU2Vjb25kcyhudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiAna2VsaW9zIHNla3VuZMSXcyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAna2VsacWzIHNla3VuZMW+acWzJyA6ICdrZWxpYXMgc2VrdW5kZXMnO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVNpbmd1bGFyKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeFxuICAgICAgICAgICAgPyBmb3JtcyhrZXkpWzBdXG4gICAgICAgICAgICA6IGlzRnV0dXJlXG4gICAgICAgICAgICAgID8gZm9ybXMoa2V5KVsxXVxuICAgICAgICAgICAgICA6IGZvcm1zKGtleSlbMl07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNwZWNpYWwobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMCB8fCAobnVtYmVyID4gMTAgJiYgbnVtYmVyIDwgMjApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmb3JtcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIHVuaXRzW2tleV0uc3BsaXQoJ18nKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHJlc3VsdCArIHRyYW5zbGF0ZVNpbmd1bGFyKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5WzBdLCBpc0Z1dHVyZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChzcGVjaWFsKG51bWJlcikgPyBmb3JtcyhrZXkpWzFdIDogZm9ybXMoa2V5KVswXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgZm9ybXMoa2V5KVsxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChzcGVjaWFsKG51bWJlcikgPyBmb3JtcyhrZXkpWzFdIDogZm9ybXMoa2V5KVsyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGx0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbHQnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAnc2F1c2lvX3Zhc2FyaW9fa292b19iYWxhbmTFvmlvX2dlZ3XFvsSXc19iaXLFvmVsaW9fbGllcG9zX3J1Z3BqxavEjWlvX3J1Z3PEl2pvX3NwYWxpb19sYXBrcmnEjWlvX2dydW9kxb5pbycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnc2F1c2lzX3Zhc2FyaXNfa292YXNfYmFsYW5kaXNfZ2VndcW+xJdfYmlyxb5lbGlzX2xpZXBhX3J1Z3Bqxat0aXNfcnVnc8SXamlzX3NwYWxpc19sYXBrcml0aXNfZ3J1b2Rpcycuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL0Rbb0RdPyhcXFtbXlxcW1xcXV0qXFxdfFxccykrTU1NTT98TU1NTT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK0Rbb0RdPy8sXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnc2F1X3Zhc19rb3ZfYmFsX2dlZ19iaXJfbGllX3JncF9yZ3Nfc3BhX2xhcF9ncmQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdzZWttYWRpZW7Er19waXJtYWRpZW7Er19hbnRyYWRpZW7Er190cmXEjWlhZGllbsSvX2tldHZpcnRhZGllbsSvX3Blbmt0YWRpZW7Er1/FoWXFoXRhZGllbsSvJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdzZWttYWRpZW5pc19waXJtYWRpZW5pc19hbnRyYWRpZW5pc190cmXEjWlhZGllbmlzX2tldHZpcnRhZGllbmlzX3Blbmt0YWRpZW5pc1/FoWXFoXRhZGllbmlzJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvZGRkZCBISDptbS8sXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTZWtfUGlyX0FudF9UcmVfS2V0X1Blbl/FoGXFoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTX1BfQV9UX0tfUG5fxaAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0nLFxuICAgICAgICAgICAgTExMOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBISDptbSBbdmFsLl0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXSwgZGRkZCwgSEg6bW0gW3ZhbC5dJyxcbiAgICAgICAgICAgIGw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dJyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXSwgSEg6bW0gW3ZhbC5dJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0sIGRkZCwgSEg6bW0gW3ZhbC5dJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbxaBpYW5kaWVuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1J5dG9qXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tWYWthcl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbUHJhxJdqdXPEr10gZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3BvICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmllxaEgJXMnLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlU2Vjb25kcyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS1vamkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy1vamknO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbHQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTGF0dmlhbiBbbHZdXG4vLyEgYXV0aG9yIDogS3Jpc3RhcHMgS2FybHNvbnMgOiBodHRwczovL2dpdGh1Yi5jb20vc2tha3JpXG4vLyEgYXV0aG9yIDogSsSBbmlzIEVsbWVyaXMgOiBodHRwczovL2dpdGh1Yi5jb20vSmFuaXNFXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdW5pdHMgPSB7XG4gICAgICAgIHNzOiAnc2VrdW5kZXNfc2VrdW5kxJNtX3Nla3VuZGVfc2VrdW5kZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIG06ICdtaW7Fq3Rlc19taW7Fq3TEk21fbWluxat0ZV9taW7Fq3Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW06ICdtaW7Fq3Rlc19taW7Fq3TEk21fbWluxat0ZV9taW7Fq3Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgaDogJ3N0dW5kYXNfc3R1bmTEgW1fc3R1bmRhX3N0dW5kYXMnLnNwbGl0KCdfJyksXG4gICAgICAgIGhoOiAnc3R1bmRhc19zdHVuZMSBbV9zdHVuZGFfc3R1bmRhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgZDogJ2RpZW5hc19kaWVuxIFtX2RpZW5hX2RpZW5hcycuc3BsaXQoJ18nKSxcbiAgICAgICAgZGQ6ICdkaWVuYXNfZGllbsSBbV9kaWVuYV9kaWVuYXMnLnNwbGl0KCdfJyksXG4gICAgICAgIE06ICdtxJNuZcWhYV9txJNuZcWhaWVtX23Ek25lc2lzX23Ek25lxaFpJy5zcGxpdCgnXycpLFxuICAgICAgICBNTTogJ23Ek25lxaFhX23Ek25lxaFpZW1fbcSTbmVzaXNfbcSTbmXFoWknLnNwbGl0KCdfJyksXG4gICAgICAgIHk6ICdnYWRhX2dhZGllbV9nYWRzX2dhZGknLnNwbGl0KCdfJyksXG4gICAgICAgIHl5OiAnZ2FkYV9nYWRpZW1fZ2Fkc19nYWRpJy5zcGxpdCgnXycpLFxuICAgIH07XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHdpdGhvdXRTdWZmaXggYm9vbGVhbiB0cnVlID0gYSBsZW5ndGggb2YgdGltZTsgZmFsc2UgPSBiZWZvcmUvYWZ0ZXIgYSBwZXJpb2Qgb2YgdGltZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JtYXQoZm9ybXMsIG51bWJlciwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgLy8gRS5nLiBcIjIxIG1pbsWrdGVcIiwgXCIzIG1pbsWrdGVzXCIuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICUgMTAgPT09IDEgJiYgbnVtYmVyICUgMTAwICE9PSAxMSA/IGZvcm1zWzJdIDogZm9ybXNbM107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBFLmcuIFwiMjEgbWluxat0ZXNcIiBhcyBpbiBcInDEk2MgMjEgbWluxat0ZXNcIi5cbiAgICAgICAgICAgIC8vIEUuZy4gXCIzIG1pbsWrdMSTbVwiIGFzIGluIFwicMSTYyAzIG1pbsWrdMSTbVwiLlxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAxICYmIG51bWJlciAlIDEwMCAhPT0gMTEgPyBmb3Jtc1swXSA6IGZvcm1zWzFdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIGZvcm1hdCh1bml0c1trZXldLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh1bml0c1trZXldLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVNlY29uZHMobnVtYmVyLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2Rhxb5hcyBzZWt1bmRlcycgOiAnZGHFvsSBbSBzZWt1bmTEk20nO1xuICAgIH1cblxuICAgIHZhciBsdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2x2Jywge1xuICAgICAgICBtb250aHM6ICdqYW52xIFyaXNfZmVicnXEgXJpc19tYXJ0c19hcHLEq2xpc19tYWlqc19qxatuaWpzX2rFq2xpanNfYXVndXN0c19zZXB0ZW1icmlzX29rdG9icmlzX25vdmVtYnJpc19kZWNlbWJyaXMnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnamFuX2ZlYl9tYXJfYXByX21haV9qxatuX2rFq2xfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnc3bEk3RkaWVuYV9waXJtZGllbmFfb3RyZGllbmFfdHJlxaFkaWVuYV9jZXR1cnRkaWVuYV9waWVrdGRpZW5hX3Nlc3RkaWVuYScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3ZfUF9PX1RfQ19Qa19TJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N2X1BfT19UX0NfUGtfUycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWS4nLFxuICAgICAgICAgICAgTEw6ICdZWVlZLiBbZ2FkYV0gRC4gTU1NTScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZLiBbZ2FkYV0gRC4gTU1NTSwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVkuIFtnYWRhXSBELiBNTU1NLCBkZGRkLCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW8Wgb2RpZW4gcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbUsSrdCBwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tWYWthciBwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbUGFnxIFqdcWhxIFdIGRkZGQgW3B1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3DEk2MgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3Bpcm1zICVzJyxcbiAgICAgICAgICAgIHM6IHJlbGF0aXZlU2Vjb25kcyxcbiAgICAgICAgICAgIHNzOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbTogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoOiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQ6IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgTTogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5OiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBsdjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNb250ZW5lZ3JpbiBbbWVdXG4vLyEgYXV0aG9yIDogTWlvZHJhZyBOaWthxI0gPG1pb2RyYWdAcmVzdGFydGl0Lm1lPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taW9kcmFnbmlrYWNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0cmFuc2xhdG9yID0ge1xuICAgICAgICB3b3Jkczoge1xuICAgICAgICAgICAgLy9EaWZmZXJlbnQgZ3JhbW1hdGljYWwgY2FzZXNcbiAgICAgICAgICAgIHNzOiBbJ3Nla3VuZCcsICdzZWt1bmRhJywgJ3Nla3VuZGknXSxcbiAgICAgICAgICAgIG06IFsnamVkYW4gbWludXQnLCAnamVkbm9nIG1pbnV0YSddLFxuICAgICAgICAgICAgbW06IFsnbWludXQnLCAnbWludXRhJywgJ21pbnV0YSddLFxuICAgICAgICAgICAgaDogWydqZWRhbiBzYXQnLCAnamVkbm9nIHNhdGEnXSxcbiAgICAgICAgICAgIGhoOiBbJ3NhdCcsICdzYXRhJywgJ3NhdGknXSxcbiAgICAgICAgICAgIGRkOiBbJ2RhbicsICdkYW5hJywgJ2RhbmEnXSxcbiAgICAgICAgICAgIE1NOiBbJ21qZXNlYycsICdtamVzZWNhJywgJ21qZXNlY2knXSxcbiAgICAgICAgICAgIHl5OiBbJ2dvZGluYScsICdnb2RpbmUnLCAnZ29kaW5hJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGNvcnJlY3RHcmFtbWF0aWNhbENhc2U6IGZ1bmN0aW9uIChudW1iZXIsIHdvcmRLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgPT09IDFcbiAgICAgICAgICAgICAgICA/IHdvcmRLZXlbMF1cbiAgICAgICAgICAgICAgICA6IG51bWJlciA+PSAyICYmIG51bWJlciA8PSA0XG4gICAgICAgICAgICAgICAgICA/IHdvcmRLZXlbMV1cbiAgICAgICAgICAgICAgICAgIDogd29yZEtleVsyXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgICAgIHZhciB3b3JkS2V5ID0gdHJhbnNsYXRvci53b3Jkc1trZXldO1xuICAgICAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdG9yLmNvcnJlY3RHcmFtbWF0aWNhbENhc2UobnVtYmVyLCB3b3JkS2V5KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHZhciBtZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21lJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJ0X2FwcmlsX21hal9qdW5fanVsX2F2Z3VzdF9zZXB0ZW1iYXJfb2t0b2Jhcl9ub3ZlbWJhcl9kZWNlbWJhcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hci5fYXByLl9tYWpfanVuX2p1bF9hdmcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkamVsamFfcG9uZWRqZWxqYWtfdXRvcmFrX3NyaWplZGFfxI1ldHZydGFrX3BldGFrX3N1Ym90YScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lZC5fcG9uLl91dG8uX3NyaS5fxI1ldC5fcGV0Ll9zdWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3V0X3NyX8SNZV9wZV9zdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZGFuYXMgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tzanV0cmEgdV0gTFQnLFxuXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbbmVkamVsanVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzcmlqZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3Vib3R1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbanXEjWUgdV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdFdlZWtEYXlzID0gW1xuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtuZWRqZWxqZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3BvbmVkamVsamthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbdXRvcmthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtzcmlqZWRlXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbxI1ldHZydGthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbcGV0a2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW3N1Ym90ZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXN0V2Vla0RheXNbdGhpcy5kYXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJpamUgJXMnLFxuICAgICAgICAgICAgczogJ25la29saWtvIHNla3VuZGknLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICdkYW4nLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogJ21qZXNlYycsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiAnZ29kaW51JyxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYW9yaSBbbWldXG4vLyEgYXV0aG9yIDogSm9obiBDb3JyaWdhbiA8cm9iYmllY2xvc2V0QGdtYWlsLmNvbT4gOiBodHRwczovL2dpdGh1Yi5jb20vam9obmlkZWFsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbWkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtaScsIHtcbiAgICAgICAgbW9udGhzOiAnS29oaS10xIF0ZV9IdWktdGFuZ3VydV9Qb3V0xastdGUtcmFuZ2lfUGFlbmdhLXdoxIF3aMSBX0hhcmF0dWFfUGlwaXJpX0jFjW5nb2luZ29pX0hlcmUtdHVyaS1rxY1rxIFfTWFodXJ1X1doaXJpbmdhLcSBLW51a3VfV2hpcmluZ2EtxIEtcmFuZ2lfSGFraWhlYScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnS29oaV9IdWlfUG91X1BhZV9IYXJhX1BpcGlfSMWNbmdvaV9IZXJlX01haHVfV2hpLW51X1doaS1yYV9IYWtpJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1JlZ2V4OiAvKD86WydhLXpcXHUwMTAxXFx1MDE0RFxcdTAxNkJdK1xcLT8pezEsM30vaSxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6IC8oPzpbJ2EtelxcdTAxMDFcXHUwMTREXFx1MDE2Ql0rXFwtPyl7MSwzfS9pLFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiAvKD86WydhLXpcXHUwMTAxXFx1MDE0RFxcdTAxNkJdK1xcLT8pezEsM30vaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDogLyg/OlsnYS16XFx1MDEwMVxcdTAxNERcXHUwMTZCXStcXC0/KXsxLDJ9L2ksXG4gICAgICAgIHdlZWtkYXlzOiAnUsSBdGFwdV9NYW5lX1TFq3JlaV9XZW5lcmVpX1TEgWl0ZV9QYXJhaXJlX0jEgXRhcmVpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnVGFfTWFfVMWrX1dlX1TEgWlfUGFfSMSBJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1RhX01hX1TFq19XZV9UxIFpX1BhX0jEgScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBbaV0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtpXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2kgdGVpZSBtYWhhbmEsIGldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbYXBvcG8gaV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtpXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2luYW5haGkgaV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFt3aGFrYW11dHVuZ2EgaV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpIHJvdG8gaSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgaSBtdWEnLFxuICAgICAgICAgICAgczogJ3RlIGjEk2tvbmEgcnVhcnVhJyxcbiAgICAgICAgICAgIHNzOiAnJWQgaMSTa29uYScsXG4gICAgICAgICAgICBtOiAnaGUgbWVuZXRpJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWVuZXRpJyxcbiAgICAgICAgICAgIGg6ICd0ZSBoYW9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhhb3JhJyxcbiAgICAgICAgICAgIGQ6ICdoZSByYScsXG4gICAgICAgICAgICBkZDogJyVkIHJhJyxcbiAgICAgICAgICAgIE06ICdoZSBtYXJhbWEnLFxuICAgICAgICAgICAgTU06ICclZCBtYXJhbWEnLFxuICAgICAgICAgICAgeTogJ2hlIHRhdScsXG4gICAgICAgICAgICB5eTogJyVkIHRhdScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFjZWRvbmlhbiBbbWtdXG4vLyEgYXV0aG9yIDogQm9yaXNsYXYgTWlja292IDogaHR0cHM6Ly9naXRodWIuY29tL0IwazBcbi8vISBhdXRob3IgOiBTYXNoa28gVG9kb3JvdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ia3ljZWhcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21rJywge1xuICAgICAgICBtb250aHM6ICfRmNCw0L3Rg9Cw0YDQuF/RhNC10LLRgNGD0LDRgNC4X9C80LDRgNGCX9Cw0L/RgNC40Ltf0LzQsNGYX9GY0YPQvdC4X9GY0YPQu9C4X9Cw0LLQs9GD0YHRgl/RgdC10L/RgtC10LzQstGA0Lhf0L7QutGC0L7QvNCy0YDQuF/QvdC+0LXQvNCy0YDQuF/QtNC10LrQtdC80LLRgNC4Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9GY0LDQvV/RhNC10LJf0LzQsNGAX9Cw0L/RgF/QvNCw0Zhf0ZjRg9C9X9GY0YPQu1/QsNCy0LNf0YHQtdC/X9C+0LrRgl/QvdC+0LVf0LTQtdC6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9C90LXQtNC10LvQsF/Qv9C+0L3QtdC00LXQu9C90LjQul/QstGC0L7RgNC90LjQul/RgdGA0LXQtNCwX9GH0LXRgtCy0YDRgtC+0Lpf0L/QtdGC0L7Qul/RgdCw0LHQvtGC0LAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQvdC10LRf0L/QvtC9X9Cy0YLQvl/RgdGA0LVf0YfQtdGCX9C/0LXRgl/RgdCw0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0L1lX9C/b1/QstGCX9GB0YBf0YfQtV/Qv9C1X9GBYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0JTQtdC90LXRgSDQstC+XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Cj0YLRgNC1INCy0L5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW9CS0L5dIGRkZGQgW9Cy0L5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0JLRh9C10YDQsCDQstC+XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JjQt9C80LjQvdCw0YLQsNGC0LBdIGRkZGQgW9Cy0L5dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JjQt9C80LjQvdCw0YLQuNC+0YJdIGRkZGQgW9Cy0L5dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQt9CwICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfQv9GA0LXQtCAlcycsXG4gICAgICAgICAgICBzOiAn0L3QtdC60L7Qu9C60YMg0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgc3M6ICclZCDRgdC10LrRg9C90LTQuCcsXG4gICAgICAgICAgICBtOiAn0LXQtNC90LAg0LzQuNC90YPRgtCwJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LzQuNC90YPRgtC4JyxcbiAgICAgICAgICAgIGg6ICfQtdC00LXQvSDRh9Cw0YEnLFxuICAgICAgICAgICAgaGg6ICclZCDRh9Cw0YHQsCcsXG4gICAgICAgICAgICBkOiAn0LXQtNC10L0g0LTQtdC9JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0LTQtdC90LAnLFxuICAgICAgICAgICAgTTogJ9C10LTQtdC9INC80LXRgdC10YYnLFxuICAgICAgICAgICAgTU06ICclZCDQvNC10YHQtdGG0LgnLFxuICAgICAgICAgICAgeTogJ9C10LTQvdCwINCz0L7QtNC40L3QsCcsXG4gICAgICAgICAgICB5eTogJyVkINCz0L7QtNC40L3QuCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0LXQsnzQtdC9fNGC0Lh80LLQuHzRgNC4fNC80LgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGxhc3REaWdpdCA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGxhc3QyRGlnaXRzID0gbnVtYmVyICUgMTAwO1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10LInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10L0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA+IDEwICYmIGxhc3QyRGlnaXRzIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGA0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDcgfHwgbGFzdERpZ2l0ID09PSA4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LzQuCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGC0LgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWs7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFsYXlhbGFtIFttbF1cbi8vISBhdXRob3IgOiBGbG95ZCBQaW5rIDogaHR0cHM6Ly9naXRodWIuY29tL2Zsb3lkcGlua1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1sID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbWwnLCB7XG4gICAgICAgIG1vbnRoczogJ+C0nOC0qOC1geC0teC0sOC0v1/gtKvgtYbgtKzgtY3gtLDgtYHgtLXgtLDgtL9f4LSu4LS+4LW84LSa4LWN4LSa4LWNX+C0j+C0quC1jeC0sOC0v+C1vV/gtK7gtYfgtK/gtY1f4LSc4LWC4LW6X+C0nOC1guC0suC1iF/gtJPgtJfgtLjgtY3gtLHgtY3gtLHgtY1f4LS44LWG4LSq4LWN4LSx4LWN4LSx4LSC4LSs4LW8X+C0kuC0leC1jeC0n+C1i+C0rOC1vF/gtKjgtLXgtILgtKzgtbxf4LSh4LS/4LS44LSC4LSs4LW8Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgtJzgtKjgtYEuX+C0q+C1huC0rOC1jeC0sOC1gS5f4LSu4LS+4LW8Ll/gtI/gtKrgtY3gtLDgtL8uX+C0ruC1h+C0r+C1jV/gtJzgtYLgtbpf4LSc4LWC4LSy4LWILl/gtJPgtJcuX+C0uOC1huC0quC1jeC0seC1jeC0sS5f4LSS4LSV4LWN4LSf4LWLLl/gtKjgtLXgtIIuX+C0oeC0v+C0uOC0gi4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn4LSe4LS+4LSv4LSx4LS+4LS04LWN4LSaX+C0pOC0v+C0meC1jeC0leC0s+C0vuC0tOC1jeC0ml/gtJrgtYrgtLXgtY3gtLXgtL7gtLTgtY3gtJpf4LSs4LWB4LSn4LSo4LS+4LS04LWN4LSaX+C0teC1jeC0r+C0vuC0tOC0vuC0tOC1jeC0ml/gtLXgtYbgtLPgtY3gtLPgtL/gtK/gtL7gtLTgtY3gtJpf4LS24LSo4LS/4LSv4LS+4LS04LWN4LSaJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgtJ7gtL7gtK/gtbxf4LSk4LS/4LSZ4LWN4LSV4LW+X+C0muC1iuC0teC1jeC0tV/gtKzgtYHgtKfgtbtf4LS14LWN4LSv4LS+4LS04LSCX+C0teC1huC0s+C1jeC0s+C0v1/gtLbgtKjgtL8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4LSe4LS+X+C0pOC0v1/gtJrgtYpf4LSs4LWBX+C0teC1jeC0r+C0vl/gtLXgtYZf4LS2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0gLeC0qOC1gScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MgLeC0qOC1gScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0gLeC0qOC1gScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSAt4LSo4LWBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4LSH4LSo4LWN4LSo4LWNXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C0qOC0vuC0s+C1hl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C0h+C0qOC1jeC0qOC0suC1hl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4LSV4LS04LS/4LSe4LWN4LSeXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOC0leC0tOC0v+C0nuC1jeC0nuC1jScsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4LSu4LWB4LW74LSq4LWNJyxcbiAgICAgICAgICAgIHM6ICfgtIXgtb3gtKog4LSo4LS/4LSu4LS/4LS34LSZ4LWN4LSZ4LW+JyxcbiAgICAgICAgICAgIHNzOiAnJWQg4LS44LWG4LSV4LWN4LSV4LW74LSh4LWNJyxcbiAgICAgICAgICAgIG06ICfgtJLgtLDgtYEg4LSu4LS/4LSo4LS/4LSx4LWN4LSx4LWNJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4LSu4LS/4LSo4LS/4LSx4LWN4LSx4LWNJyxcbiAgICAgICAgICAgIGg6ICfgtJLgtLDgtYEg4LSu4LSj4LS/4LSV4LWN4LSV4LWC4LW8JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4LSu4LSj4LS/4LSV4LWN4LSV4LWC4LW8JyxcbiAgICAgICAgICAgIGQ6ICfgtJLgtLDgtYEg4LSm4LS/4LS14LS44LSCJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4LSm4LS/4LS14LS44LSCJyxcbiAgICAgICAgICAgIE06ICfgtJLgtLDgtYEg4LSu4LS+4LS44LSCJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4LSu4LS+4LS44LSCJyxcbiAgICAgICAgICAgIHk6ICfgtJLgtLDgtYEg4LS14LW84LS34LSCJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4LS14LW84LS34LSCJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C0sOC0vuC0pOC1jeC0sOC0v3zgtLDgtL7gtLXgtL/gtLLgtYZ84LSJ4LSa4LWN4LSaIOC0leC0tOC0v+C0nuC1jeC0nuC1jXzgtLXgtYjgtJXgtYHgtKjgtY3gtKjgtYfgtLDgtIJ84LSw4LS+4LSk4LWN4LSw4LS/L2ksXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobWVyaWRpZW0gPT09ICfgtLDgtL7gtKTgtY3gtLDgtL8nICYmIGhvdXIgPj0gNCkgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+C0ieC0muC1jeC0miDgtJXgtLTgtL/gtJ7gtY3gtJ7gtY0nIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgtLXgtYjgtJXgtYHgtKjgtY3gtKjgtYfgtLDgtIInXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LSw4LS+4LSk4LWN4LSw4LS/JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtLDgtL7gtLXgtL/gtLLgtYYnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C0ieC0muC1jeC0miDgtJXgtLTgtL/gtJ7gtY3gtJ7gtY0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C0teC1iOC0leC1geC0qOC1jeC0qOC1h+C0sOC0gic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LSw4LS+4LSk4LWN4LSw4LS/JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNb25nb2xpYW4gW21uXVxuLy8hIGF1dGhvciA6IEphdmtobGFudHVncyBOeWFtZG9yaiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZraGFhbmo3XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfRhdGN0LTRhdGN0L0g0YHQtdC60YPQvdC0JyA6ICfRhdGN0LTRhdGN0L0g0YHQtdC60YPQvdC00YvQvSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDRgdC10LrRg9C90LQnIDogJyDRgdC10LrRg9C90LTRi9C9Jyk7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINC80LjQvdGD0YInIDogJyDQvNC40L3Rg9GC0YvQvScpO1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDRhtCw0LMnIDogJyDRhtCw0LPQuNC50L0nKTtcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg06nQtNOp0YAnIDogJyDTqdC00YDQuNC50L0nKTtcbiAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg0YHQsNGAJyA6ICcg0YHQsNGA0YvQvScpO1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDQttC40LsnIDogJyDQttC40LvQuNC50L0nKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21uJywge1xuICAgICAgICBtb250aHM6ICfQndGN0LPQtNKv0LPRjdGN0YAg0YHQsNGAX9Cl0L7RkdGA0LTRg9Cz0LDQsNGAINGB0LDRgF/Qk9GD0YDQsNCy0LTRg9Cz0LDQsNGAINGB0LDRgF/QlNOp0YDTqdCy0LTSr9Cz0Y3RjdGAINGB0LDRgF/QotCw0LLQtNGD0LPQsNCw0YAg0YHQsNGAX9CX0YPRgNCz0LDQtNGD0LPQsNCw0YAg0YHQsNGAX9CU0L7Qu9C00YPQs9Cw0LDRgCDRgdCw0YBf0J3QsNC50LzQtNGD0LPQsNCw0YAg0YHQsNGAX9CV0YHQtNKv0LPRjdGN0YAg0YHQsNGAX9CQ0YDQsNCy0LTRg9Cz0LDQsNGAINGB0LDRgF/QkNGA0LLQsNC9INC90Y3Qs9C00q/Qs9GN0Y3RgCDRgdCw0YBf0JDRgNCy0LDQvSDRhdC+0ZHRgNC00YPQs9Cw0LDRgCDRgdCw0YAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJzEg0YHQsNGAXzIg0YHQsNGAXzMg0YHQsNGAXzQg0YHQsNGAXzUg0YHQsNGAXzYg0YHQsNGAXzcg0YHQsNGAXzgg0YHQsNGAXzkg0YHQsNGAXzEwINGB0LDRgF8xMSDRgdCw0YBfMTIg0YHQsNGAJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn0J3Rj9C8X9CU0LDQstCw0LBf0JzRj9Cz0LzQsNGAX9Cb0YXQsNCz0LLQsF/Qn9Kv0YDRjdCyX9CR0LDQsNGB0LDQvV/QkdGP0LzQsdCwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0J3Rj9C8X9CU0LDQsl/QnNGP0LNf0JvRhdCwX9Cf0q/RgF/QkdCw0LBf0JHRj9C8Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9Cd0Y9f0JTQsF/QnNGPX9Cb0YVf0J/Sr1/QkdCwX9CR0Y8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZINC+0L3RiyBNTU1N0YvQvSBEJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkg0L7QvdGLIE1NTU3Ri9C9IEQgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIFlZWVkg0L7QvdGLIE1NTU3Ri9C9IEQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0q7TqHzSrtClL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn0q7QpSc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfSrtOoJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfSrtClJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb06jQvdOp06nQtNOp0YBdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0JzQsNGA0LPQsNCw0YhdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW9CY0YDRjdGFXSBkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb06jRh9C40LPQtNOp0YBdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9Oo0L3Qs9Op0YDRgdOp0L1dIGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDQtNCw0YDQsNCwJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDTqdC80L3TqScsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSDTqdC006nRgC8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDTqdC006nRgCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYXJhdGhpIFttcl1cbi8vISBhdXRob3IgOiBIYXJzaGFkIEthbGUgOiBodHRwczovL2dpdGh1Yi5jb20va2FsZWh2XG4vLyEgYXV0aG9yIDogVml2ZWsgQXRoYWx5ZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS92bmF0aGFseWVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KWnJyxcbiAgICAgICAgICAgIDI6ICfgpagnLFxuICAgICAgICAgICAgMzogJ+ClqScsXG4gICAgICAgICAgICA0OiAn4KWqJyxcbiAgICAgICAgICAgIDU6ICfgpasnLFxuICAgICAgICAgICAgNjogJ+ClrCcsXG4gICAgICAgICAgICA3OiAn4KWtJyxcbiAgICAgICAgICAgIDg6ICfgpa4nLFxuICAgICAgICAgICAgOTogJ+ClrycsXG4gICAgICAgICAgICAwOiAn4KWmJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Clpyc6ICcxJyxcbiAgICAgICAgICAgICfgpagnOiAnMicsXG4gICAgICAgICAgICAn4KWpJzogJzMnLFxuICAgICAgICAgICAgJ+Clqic6ICc0JyxcbiAgICAgICAgICAgICfgpasnOiAnNScsXG4gICAgICAgICAgICAn4KWsJzogJzYnLFxuICAgICAgICAgICAgJ+ClrSc6ICc3JyxcbiAgICAgICAgICAgICfgpa4nOiAnOCcsXG4gICAgICAgICAgICAn4KWvJzogJzknLFxuICAgICAgICAgICAgJ+Clpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZU1yKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gJyc7XG4gICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHN0cmluZykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSV4KS+4KS54KWAIOCkuOClh+CkleCkguCkpic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkuOClh+CkleCkguCkpic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSVIOCkruCkv+CkqOCkv+Cknyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkruCkv+CkqOCkv+Ckn+Clhyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSVIOCkpOCkvuCkuCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkpOCkvuCkuCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSVIOCkpuCkv+CkteCkuCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkpuCkv+CkteCkuCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSVIOCkruCkueCkv+CkqOCkvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkruCkueCkv+CkqOClhyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSVIOCkteCksOCljeCktyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkteCksOCljeCkt+Clhyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoIChzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+CkleCkvuCkueClgCDgpLjgpYfgpJXgpILgpKbgpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpLjgpYfgpJXgpILgpKbgpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CkleCkviDgpK7gpL/gpKjgpL/gpJ/gpL4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpK7gpL/gpKjgpL/gpJ/gpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CkleCkviDgpKTgpL7gpLjgpL4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpKTgpL7gpLjgpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CkleCkviDgpKbgpL/gpLXgpLjgpL4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpKbgpL/gpLXgpLjgpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CkleCkviDgpK7gpLngpL/gpKjgpY3gpK/gpL4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpK7gpLngpL/gpKjgpY3gpK/gpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CkleCkviDgpLXgpLDgpY3gpLfgpL4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpLXgpLDgpY3gpLfgpL7gpIInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgfVxuXG4gICAgdmFyIG1yID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbXInLCB7XG4gICAgICAgIG1vbnRoczogJ+CknOCkvuCkqOClh+CkteCkvuCksOClgF/gpKvgpYfgpKzgpY3gpLDgpYHgpLXgpL7gpLDgpYBf4KSu4KS+4KSw4KWN4KSaX+Ckj+CkquCljeCksOCkv+Cksl/gpK7gpYdf4KSc4KWC4KSoX+CknOClgeCksuCliF/gpJHgpJfgpLjgpY3gpJ9f4KS44KSq4KWN4KSf4KWH4KSC4KSs4KSwX+CkkeCkleCljeCkn+Cli+CkrOCksF/gpKjgpYvgpLXgpY3gpLngpYfgpILgpKzgpLBf4KSh4KS/4KS44KWH4KSC4KSs4KSwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgpJzgpL7gpKjgpYcuX+Ckq+Clh+CkrOCljeCksOClgS5f4KSu4KS+4KSw4KWN4KSaLl/gpI/gpKrgpY3gpLDgpL8uX+CkruClhy5f4KSc4KWC4KSoLl/gpJzgpYHgpLLgpYguX+CkkeCkly5f4KS44KSq4KWN4KSf4KWH4KSCLl/gpJHgpJXgpY3gpJ/gpYsuX+CkqOCli+CkteCljeCkueClh+Ckgi5f4KSh4KS/4KS44KWH4KSCLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+CksOCkteCkv+CkteCkvuCksF/gpLjgpYvgpK7gpLXgpL7gpLBf4KSu4KSC4KSX4KSz4KS14KS+4KSwX+CkrOClgeCkp+CkteCkvuCksF/gpJfgpYHgpLDgpYLgpLXgpL7gpLBf4KS24KWB4KSV4KWN4KSw4KS14KS+4KSwX+CktuCkqOCkv+CkteCkvuCksCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CksOCkteCkv1/gpLjgpYvgpK5f4KSu4KSC4KSX4KSzX+CkrOClgeCkp1/gpJfgpYHgpLDgpYJf4KS24KWB4KSV4KWN4KSwX+CktuCkqOCkvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgpLBf4KS44KWLX+CkruCkgl/gpKzgpYFf4KSX4KWBX+CktuClgV/gpLYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgpLXgpL7gpJzgpKTgpL4nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCkteCkvuCknOCkpOCkvicsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4KS14KS+4KSc4KSk4KS+JyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCkteCkvuCknOCkpOCkvicsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpIngpKbgpY3gpK/gpL5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgpJXgpL7gpLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CkruCkvuCkl+ClgOCksl0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+CkruCkp+CljeCkr+ClhycsXG4gICAgICAgICAgICBwYXN0OiAnJXPgpKrgpYLgpLDgpY3gpLXgpYAnLFxuICAgICAgICAgICAgczogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBzczogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBtOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIGg6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgaGg6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgZDogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBNOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIE1NOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIHk6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgeXk6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4KWn4KWo4KWp4KWq4KWr4KWs4KWt4KWu4KWv4KWmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4KSq4KS54KS+4KSf4KWHfOCkuOCkleCkvuCks+ClgHzgpKbgpYHgpKrgpL7gpLDgpYB84KS44KS+4KSv4KSC4KSV4KS+4KSz4KWAfOCksOCkvuCkpOCljeCksOClgC8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CkquCkueCkvuCkn+ClhycgfHwgbWVyaWRpZW0gPT09ICfgpLjgpJXgpL7gpLPgpYAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4KSm4KWB4KSq4KS+4KSw4KWAJyB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4KS44KS+4KSv4KSC4KSV4KS+4KSz4KWAJyB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4KSw4KS+4KSk4KWN4KSw4KWAJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTIgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPj0gMCAmJiBob3VyIDwgNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSq4KS54KS+4KSf4KWHJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpJXgpL7gpLPgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkpuClgeCkquCkvuCksOClgCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KS+4KSv4KSC4KSV4KS+4KSz4KWAJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpY3gpLDgpYAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbXI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFsYXkgW21zLW15XVxuLy8hIG5vdGUgOiBERVBSRUNBVEVELCB0aGUgY29ycmVjdCBvbmUgaXMgW21zXVxuLy8hIGF1dGhvciA6IFdlbGRhbiBKYW1pbGkgOiBodHRwczovL2dpdGh1Yi5jb20vd2VsZGFuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbXNNeSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21zLW15Jywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpX0ZlYnJ1YXJpX01hY19BcHJpbF9NZWlfSnVuX0p1bGFpX09nb3NfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGlzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYWNfQXByX01laV9KdW5fSnVsX09nc19TZXBfT2t0X05vdl9EaXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnQWhhZF9Jc25pbl9TZWxhc2FfUmFidV9LaGFtaXNfSnVtYWF0X1NhYnR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQWhkX0lzbl9TZWxfUmFiX0toYV9KdW1fU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0FoX0lzX1NsX1JiX0ttX0ptX1NiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvcGFnaXx0ZW5nYWhhcml8cGV0YW5nfG1hbGFtLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAncGFnaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICd0ZW5nYWhhcmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3BldGFuZycgfHwgbWVyaWRpZW0gPT09ICdtYWxhbScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGFnaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RlbmdhaGFyaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BldGFuZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbWFsYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIYXJpIGluaSBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tFc29rIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3B1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0tlbG1hcmluIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2xlcGFzIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhbGFtICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB5YW5nIGxlcGFzJyxcbiAgICAgICAgICAgIHM6ICdiZWJlcmFwYSBzYWF0JyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2FhdCcsXG4gICAgICAgICAgICBtOiAnc2VtaW5pdCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbml0JyxcbiAgICAgICAgICAgIGg6ICdzZWphbScsXG4gICAgICAgICAgICBoaDogJyVkIGphbScsXG4gICAgICAgICAgICBkOiAnc2VoYXJpJyxcbiAgICAgICAgICAgIGRkOiAnJWQgaGFyaScsXG4gICAgICAgICAgICBNOiAnc2VidWxhbicsXG4gICAgICAgICAgICBNTTogJyVkIGJ1bGFuJyxcbiAgICAgICAgICAgIHk6ICdzZXRhaHVuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGFodW4nLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbXNNeTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWxheSBbbXNdXG4vLyEgYXV0aG9yIDogV2VsZGFuIEphbWlsaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS93ZWxkYW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21zJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpX0ZlYnJ1YXJpX01hY19BcHJpbF9NZWlfSnVuX0p1bGFpX09nb3NfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGlzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYWNfQXByX01laV9KdW5fSnVsX09nc19TZXBfT2t0X05vdl9EaXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnQWhhZF9Jc25pbl9TZWxhc2FfUmFidV9LaGFtaXNfSnVtYWF0X1NhYnR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQWhkX0lzbl9TZWxfUmFiX0toYV9KdW1fU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0FoX0lzX1NsX1JiX0ttX0ptX1NiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvcGFnaXx0ZW5nYWhhcml8cGV0YW5nfG1hbGFtLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAncGFnaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICd0ZW5nYWhhcmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3BldGFuZycgfHwgbWVyaWRpZW0gPT09ICdtYWxhbScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGFnaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RlbmdhaGFyaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BldGFuZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbWFsYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIYXJpIGluaSBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tFc29rIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3B1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0tlbG1hcmluIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2xlcGFzIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhbGFtICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB5YW5nIGxlcGFzJyxcbiAgICAgICAgICAgIHM6ICdiZWJlcmFwYSBzYWF0JyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2FhdCcsXG4gICAgICAgICAgICBtOiAnc2VtaW5pdCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbml0JyxcbiAgICAgICAgICAgIGg6ICdzZWphbScsXG4gICAgICAgICAgICBoaDogJyVkIGphbScsXG4gICAgICAgICAgICBkOiAnc2VoYXJpJyxcbiAgICAgICAgICAgIGRkOiAnJWQgaGFyaScsXG4gICAgICAgICAgICBNOiAnc2VidWxhbicsXG4gICAgICAgICAgICBNTTogJyVkIGJ1bGFuJyxcbiAgICAgICAgICAgIHk6ICdzZXRhaHVuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGFodW4nLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbXM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFsdGVzZSAoTWFsdGEpIFttdF1cbi8vISBhdXRob3IgOiBBbGVzc2FuZHJvIE1hcnVjY2lhIDogaHR0cHM6Ly9naXRodWIuY29tL2FsZXNtYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG10ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbXQnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbm5hcl9GcmFyX01hcnp1X0FwcmlsX01lamp1X8SgdW5qdV9MdWxqdV9Bd3dpc3N1X1NldHRlbWJydV9PdHR1YnJ1X05vdmVtYnJ1X0RpxItlbWJydScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRnJhX01hcl9BcHJfTWVqX8SgdW5fTHVsX0F3d19TZXRfT3R0X05vdl9EacSLJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdJbC3EpmFkZF9JdC1UbmVqbl9JdC1UbGlldGFfTC1FcmJnxKdhX0lsLcSmYW1pc19JbC3EoGltZ8SnYV9Jcy1TaWJ0Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfEpmFkX1RuZV9UbGlfRXJiX8SmYW1fxKBpbV9TaWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnxKZhX1RuX1RsX0VyX8SmYV/EoGlfU2knLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSWxsdW0gZmlsLV1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0fEp2FkYSBmaWwtXUxUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbZmlsLV1MVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0lsLWJpZXJhxKcgZmlsLV1MVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2xpIGfEp2FkZGFdIFtmaWwtXUxUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZuKAmSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgaWx1JyxcbiAgICAgICAgICAgIHM6ICdmdGl0IHNla29uZGknLFxuICAgICAgICAgICAgc3M6ICclZCBzZWtvbmRpJyxcbiAgICAgICAgICAgIG06ICdtaW51dGEnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGknLFxuICAgICAgICAgICAgaDogJ3NpZWfEp2EnLFxuICAgICAgICAgICAgaGg6ICclZCBzaWVnxKdhdCcsXG4gICAgICAgICAgICBkOiAnxKF1cm5hdGEnLFxuICAgICAgICAgICAgZGQ6ICclZCDEoXJhbmV0JyxcbiAgICAgICAgICAgIE06ICd4YWhhcicsXG4gICAgICAgICAgICBNTTogJyVkIHhodXInLFxuICAgICAgICAgICAgeTogJ3NlbmEnLFxuICAgICAgICAgICAgeXk6ICclZCBzbmknLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG10O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJ1cm1lc2UgW215XVxuLy8hIGF1dGhvciA6IFNxdWFyIHRlYW0sIG15c3F1YXIuY29tXG4vLyEgYXV0aG9yIDogRGF2aWQgUm9zc2VsbGF0IDogaHR0cHM6Ly9naXRodWIuY29tL2dob2xhZHJcbi8vISBhdXRob3IgOiBUaW4gQXVuZyBMaW4gOiBodHRwczovL2dpdGh1Yi5jb20vdGhhbnlhd3ppbm1pblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfhgYEnLFxuICAgICAgICAgICAgMjogJ+GBgicsXG4gICAgICAgICAgICAzOiAn4YGDJyxcbiAgICAgICAgICAgIDQ6ICfhgYQnLFxuICAgICAgICAgICAgNTogJ+GBhScsXG4gICAgICAgICAgICA2OiAn4YGGJyxcbiAgICAgICAgICAgIDc6ICfhgYcnLFxuICAgICAgICAgICAgODogJ+GBiCcsXG4gICAgICAgICAgICA5OiAn4YGJJyxcbiAgICAgICAgICAgIDA6ICfhgYAnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4YGBJzogJzEnLFxuICAgICAgICAgICAgJ+GBgic6ICcyJyxcbiAgICAgICAgICAgICfhgYMnOiAnMycsXG4gICAgICAgICAgICAn4YGEJzogJzQnLFxuICAgICAgICAgICAgJ+GBhSc6ICc1JyxcbiAgICAgICAgICAgICfhgYYnOiAnNicsXG4gICAgICAgICAgICAn4YGHJzogJzcnLFxuICAgICAgICAgICAgJ+GBiCc6ICc4JyxcbiAgICAgICAgICAgICfhgYknOiAnOScsXG4gICAgICAgICAgICAn4YGAJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIG15ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbXknLCB7XG4gICAgICAgIG1vbnRoczogJ+GAh+GAlOGAuuGAlOGAneGAq+GAm+GArl/hgJbhgLHhgJbhgLHhgKzhgLrhgJ3hgKvhgJvhgK5f4YCZ4YCQ4YC6X+GAp+GAleGAvOGArl/hgJnhgLFf4YCH4YC94YCU4YC6X+GAh+GAsOGAnOGAreGAr+GAhOGAul/hgJ7hgLzhgILhgK/hgJDhgLpf4YCF4YCA4YC64YCQ4YCE4YC64YCY4YCsX+GAoeGAseGArOGAgOGAuuGAkOGAreGAr+GAmOGArF/hgJThgK3hgK/hgJ3hgIThgLrhgJjhgKxf4YCS4YCu4YCH4YCE4YC64YCY4YCsJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ+GAh+GAlOGAul/hgJbhgLFf4YCZ4YCQ4YC6X+GAleGAvOGArl/hgJnhgLFf4YCH4YC94YCU4YC6X+GAnOGAreGAr+GAhOGAul/hgJ7hgLxf4YCF4YCA4YC6X+GAoeGAseGArOGAgOGAul/hgJThgK3hgK9f4YCS4YCuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ+GAkOGAlOGAhOGAuuGAueGAguGAlOGAveGAsV/hgJDhgJThgIThgLrhgLnhgJzhgKxf4YCh4YCE4YC64YC54YCC4YCrX+GAl+GAr+GAkuGAueGAk+GAn+GAsOGAuF/hgIDhgLzhgKzhgJ7hgJXhgJDhgLHhgLhf4YCe4YCx4YCs4YCA4YC84YCsX+GAheGAlOGAsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+GAlOGAveGAsV/hgJzhgKxf4YCC4YCrX+GAn+GAsOGAuF/hgIDhgLzhgKxf4YCe4YCx4YCsX+GAlOGAsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfhgJThgL3hgLFf4YCc4YCsX+GAguGAq1/hgJ/hgLDhgLhf4YCA4YC84YCsX+GAnuGAseGArF/hgJThgLEnLnNwbGl0KCdfJyksXG5cbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+GAmuGAlOGAsS5dIExUIFvhgJnhgL7hgKxdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4YCZ4YCU4YCA4YC64YCW4YC84YCU4YC6XSBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vhgJnhgJThgLEu4YCAXSBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vhgJXhgLzhgK7hgLjhgIHhgLLhgLfhgJ7hgLHhgKxdIGRkZGQgTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfhgJzhgKzhgJnhgIrhgLrhgLcgJXMg4YCZ4YC+4YCsJyxcbiAgICAgICAgICAgIHBhc3Q6ICfhgJzhgL3hgJThgLrhgIHhgLLhgLfhgJ7hgLHhgKwgJXMg4YCAJyxcbiAgICAgICAgICAgIHM6ICfhgIXhgIDhgLnhgIDhgJThgLou4YCh4YCU4YCK4YC64YC44YCE4YCa4YC6JyxcbiAgICAgICAgICAgIHNzOiAnJWQg4YCF4YCA4YC54YCA4YCU4YC34YC6JyxcbiAgICAgICAgICAgIG06ICfhgJDhgIXhgLrhgJnhgK3hgJThgIXhgLonLFxuICAgICAgICAgICAgbW06ICclZCDhgJnhgK3hgJThgIXhgLonLFxuICAgICAgICAgICAgaDogJ+GAkOGAheGAuuGAlOGArOGAm+GAricsXG4gICAgICAgICAgICBoaDogJyVkIOGAlOGArOGAm+GAricsXG4gICAgICAgICAgICBkOiAn4YCQ4YCF4YC64YCb4YCA4YC6JyxcbiAgICAgICAgICAgIGRkOiAnJWQg4YCb4YCA4YC6JyxcbiAgICAgICAgICAgIE06ICfhgJDhgIXhgLrhgJwnLFxuICAgICAgICAgICAgTU06ICclZCDhgJwnLFxuICAgICAgICAgICAgeTogJ+GAkOGAheGAuuGAlOGAvuGAheGAuicsXG4gICAgICAgICAgICB5eTogJyVkIOGAlOGAvuGAheGAuicsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vhgYHhgYLhgYPhgYThgYXhgYbhgYfhgYjhgYnhgYBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBteTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBOb3J3ZWdpYW4gQm9rbcOlbCBbbmJdXG4vLyEgYXV0aG9ycyA6IEVzcGVuIEhvdmxhbmRzZGFsIDogaHR0cHM6Ly9naXRodWIuY29tL3JleHhhcnNcbi8vISAgICAgICAgICAgU2lndXJkIEdhcnRtYW5uIDogaHR0cHM6Ly9naXRodWIuY29tL3NpZ3VyZGdhXG4vLyEgICAgICAgICAgIFN0ZXBoZW4gUmFtdGh1biA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdGVwaGVucmFtdGh1blxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG5iID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbmInLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnNfYXByaWxfbWFpX2p1bmlfanVsaV9hdWd1c3Rfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tYXJzX2Fwci5fbWFpX2p1bmlfanVsaV9hdWcuX3NlcC5fb2t0Ll9ub3YuX2Rlcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnc8O4bmRhZ19tYW5kYWdfdGlyc2RhZ19vbnNkYWdfdG9yc2RhZ19mcmVkYWdfbMO4cmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3PDuC5fbWEuX3RpLl9vbi5fdG8uX2ZyLl9sw7guJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3PDuF9tYV90aV9vbl90b19mcl9sw7gnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQuIE1NTU0gWVlZWSBba2wuXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2kgZGFnIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tpIG1vcmdlbiBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2kgZ8OlciBrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2ZvcnJpZ2VdIGRkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgc2lkZW4nLFxuICAgICAgICAgICAgczogJ25vZW4gc2VrdW5kZXInLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmRlcicsXG4gICAgICAgICAgICBtOiAnZXR0IG1pbnV0dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0dGVyJyxcbiAgICAgICAgICAgIGg6ICfDqW4gdGltZScsXG4gICAgICAgICAgICBoaDogJyVkIHRpbWVyJyxcbiAgICAgICAgICAgIGQ6ICfDqW4gZGFnJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnZXInLFxuICAgICAgICAgICAgdzogJ8OpbiB1a2UnLFxuICAgICAgICAgICAgd3c6ICclZCB1a2VyJyxcbiAgICAgICAgICAgIE06ICfDqW4gbcOlbmVkJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOlbmVkZXInLFxuICAgICAgICAgICAgeTogJ2V0dCDDpXInLFxuICAgICAgICAgICAgeXk6ICclZCDDpXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5iO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE5lcGFsZXNlIFtuZV1cbi8vISBhdXRob3IgOiBzdXZhc2ggOiBodHRwczovL2dpdGh1Yi5jb20vc3V2YXNoXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+ClpycsXG4gICAgICAgICAgICAyOiAn4KWoJyxcbiAgICAgICAgICAgIDM6ICfgpaknLFxuICAgICAgICAgICAgNDogJ+ClqicsXG4gICAgICAgICAgICA1OiAn4KWrJyxcbiAgICAgICAgICAgIDY6ICfgpawnLFxuICAgICAgICAgICAgNzogJ+ClrScsXG4gICAgICAgICAgICA4OiAn4KWuJyxcbiAgICAgICAgICAgIDk6ICfgpa8nLFxuICAgICAgICAgICAgMDogJ+ClpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgpacnOiAnMScsXG4gICAgICAgICAgICAn4KWoJzogJzInLFxuICAgICAgICAgICAgJ+ClqSc6ICczJyxcbiAgICAgICAgICAgICfgpaonOiAnNCcsXG4gICAgICAgICAgICAn4KWrJzogJzUnLFxuICAgICAgICAgICAgJ+ClrCc6ICc2JyxcbiAgICAgICAgICAgICfgpa0nOiAnNycsXG4gICAgICAgICAgICAn4KWuJzogJzgnLFxuICAgICAgICAgICAgJ+Clryc6ICc5JyxcbiAgICAgICAgICAgICfgpaYnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgbmUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCduZScsIHtcbiAgICAgICAgbW9udGhzOiAn4KSc4KSo4KS14KSw4KWAX+Ckq+Clh+CkrOCljeCksOClgeCkteCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KS/4KSyX+CkruCkiF/gpJzgpYHgpKhf4KSc4KWB4KSy4KS+4KSIX+CkheCkl+Ckt+CljeCkn1/gpLjgpYfgpKrgpY3gpJ/gpYfgpK7gpY3gpKzgpLBf4KSF4KSV4KWN4KSf4KWL4KSs4KSwX+CkqOCli+CkreClh+CkruCljeCkrOCksF/gpKHgpL/gpLjgpYfgpK7gpY3gpKzgpLAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CknOCkqC5f4KSr4KWH4KSs4KWN4KSw4KWBLl/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KS/Ll/gpK7gpIhf4KSc4KWB4KSoX+CknOClgeCksuCkvuCkiC5f4KSF4KSXLl/gpLjgpYfgpKrgpY3gpJ8uX+CkheCkleCljeCkn+Cliy5f4KSo4KWL4KSt4KWHLl/gpKHgpL/gpLjgpYcuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn4KSG4KSH4KSk4KSs4KS+4KSwX+CkuOCli+CkruCkrOCkvuCksF/gpK7gpJngpY3gpJfgpLLgpKzgpL7gpLBf4KSs4KWB4KSn4KSs4KS+4KSwX+CkrOCkv+CkueCkv+CkrOCkvuCksF/gpLbgpYHgpJXgpY3gpLDgpKzgpL7gpLBf4KS24KSo4KS/4KSs4KS+4KSwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4KSG4KSH4KSkLl/gpLjgpYvgpK4uX+CkruCkmeCljeCkl+Cksi5f4KSs4KWB4KSnLl/gpKzgpL/gpLngpL8uX+CktuClgeCkleCljeCksC5f4KS24KSo4KS/Licuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgpIYuX+CkuOCliy5f4KSu4KSCLl/gpKzgpYEuX+CkrOCkvy5f4KS24KWBLl/gpLYuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0HgpJXgpYsgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTFRTOiAnQeCkleCliyBoOm1tOnNzIOCkrOCknOClhycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBB4KSV4KWLIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQeCkleCliyBoOm1tIOCkrOCknOClhycsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgpafgpajgpangpargpavgpazgpa3gpa7gpa/gpaZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gpLDgpL7gpKTgpL984KSs4KS/4KS54KS+4KSofOCkpuCkv+CkieCkgeCkuOCli3zgpLjgpL7gpIHgpJ0vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgpLDgpL7gpKTgpL8nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKzgpL/gpLngpL7gpKgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KSm4KS/4KSJ4KSB4KS44KWLJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLjgpL7gpIHgpJ0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSk4KS/JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKzgpL/gpLngpL7gpKgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkpuCkv+CkieCkgeCkuOCliyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KS+4KSB4KSdJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpL8nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgpIbgpJxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KSt4KWL4KSy4KS/XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vgpIbgpIngpIHgpKbgpYtdIGRkZGRbLF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgpLngpL/gpJzgpYtdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+Ckl+Ckj+CkleCli10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz4KSu4KS+JyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgpIXgpJfgpL7gpKHgpL8nLFxuICAgICAgICAgICAgczogJ+CkleClh+CkueClgCDgpJXgpY3gpLfgpKMnLFxuICAgICAgICAgICAgc3M6ICclZCDgpLjgpYfgpJXgpYfgpKPgpY3gpKEnLFxuICAgICAgICAgICAgbTogJ+Ckj+CklSDgpK7gpL/gpKjgpYfgpJ8nLFxuICAgICAgICAgICAgbW06ICclZCDgpK7gpL/gpKjgpYfgpJ8nLFxuICAgICAgICAgICAgaDogJ+Ckj+CklSDgpJjgpKPgpY3gpJ/gpL4nLFxuICAgICAgICAgICAgaGg6ICclZCDgpJjgpKPgpY3gpJ/gpL4nLFxuICAgICAgICAgICAgZDogJ+Ckj+CklSDgpKbgpL/gpKgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgpKbgpL/gpKgnLFxuICAgICAgICAgICAgTTogJ+Ckj+CklSDgpK7gpLngpL/gpKjgpL4nLFxuICAgICAgICAgICAgTU06ICclZCDgpK7gpLngpL/gpKjgpL4nLFxuICAgICAgICAgICAgeTogJ+Ckj+CklSDgpKzgpLDgpY3gpLcnLFxuICAgICAgICAgICAgeXk6ICclZCDgpKzgpLDgpY3gpLcnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRHV0Y2ggKEJlbGdpdW0pIFtubC1iZV1cbi8vISBhdXRob3IgOiBKb3JpcyBSw7ZsaW5nIDogaHR0cHM6Ly9naXRodWIuY29tL2pvcmlzcm9saW5nXG4vLyEgYXV0aG9yIDogSmFjb2IgTWlkZGFnIDogaHR0cHM6Ly9naXRodWIuY29tL21pZGRhZ2pcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTaG9ydFdpdGhEb3RzID1cbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbXJ0Ll9hcHIuX21laV9qdW4uX2p1bC5fYXVnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydFdpdGhvdXREb3RzID1cbiAgICAgICAgICAgICdqYW5fZmViX21ydF9hcHJfbWVpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmphbi9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9eKG1hYXJ0fG1ydFxcLj8pJC9pLFxuICAgICAgICAgICAgL15hcHIvaSxcbiAgICAgICAgICAgIC9ebWVpJC9pLFxuICAgICAgICAgICAgL15qdW5baS5dPyQvaSxcbiAgICAgICAgICAgIC9eanVsW2kuXT8kL2ksXG4gICAgICAgICAgICAvXmF1Zy9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2t0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kZWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oamFudWFyaXxmZWJydWFyaXxtYWFydHxhcHJpbHxtZWl8anVbbmxdaXxhdWd1c3R1c3xzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcnxqYW5cXC4/fGZlYlxcLj98bXJ0XFwuP3xhcHJcXC4/fGp1W25sXVxcLj98YXVnXFwuP3xzZXBcXC4/fG9rdFxcLj98bm92XFwuP3xkZWNcXC4/KS9pO1xuXG4gICAgdmFyIG5sQmUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdubC1iZScsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyaV9mZWJydWFyaV9tYWFydF9hcHJpbF9tZWlfanVuaV9qdWxpX2F1Z3VzdHVzX3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aG91dERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGphbnVhcml8ZmVicnVhcml8bWFhcnR8YXByaWx8bWVpfGp1W25sXWl8YXVndXN0dXN8c2VwdGVtYmVyfG9rdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihqYW5cXC4/fGZlYlxcLj98bXJ0XFwuP3xhcHJcXC4/fG1laXxqdVtubF1cXC4/fGF1Z1xcLj98c2VwXFwuP3xva3RcXC4/fG5vdlxcLj98ZGVjXFwuPykvaSxcblxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3pvbmRhZ19tYWFuZGFnX2RpbnNkYWdfd29lbnNkYWdfZG9uZGVyZGFnX3ZyaWpkYWdfemF0ZXJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICd6by5fbWEuX2RpLl93by5fZG8uX3ZyLl96YS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnem9fbWFfZGlfd29fZG9fdnJfemEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW3ZhbmRhYWcgb21dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dpc3RlcmVuIG9tXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1thZmdlbG9wZW5dIGRkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ292ZXIgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGdlbGVkZW4nLFxuICAgICAgICAgICAgczogJ2VlbiBwYWFyIHNlY29uZGVuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kZW4nLFxuICAgICAgICAgICAgbTogJ8Opw6luIG1pbnV1dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZW4nLFxuICAgICAgICAgICAgaDogJ8Opw6luIHV1cicsXG4gICAgICAgICAgICBoaDogJyVkIHV1cicsXG4gICAgICAgICAgICBkOiAnw6nDqW4gZGFnJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnZW4nLFxuICAgICAgICAgICAgTTogJ8Opw6luIG1hYW5kJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWFhbmRlbicsXG4gICAgICAgICAgICB5OiAnw6nDqW4gamFhcicsXG4gICAgICAgICAgICB5eTogJyVkIGphYXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3RlfGRlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICtcbiAgICAgICAgICAgICAgICAobnVtYmVyID09PSAxIHx8IG51bWJlciA9PT0gOCB8fCBudW1iZXIgPj0gMjAgPyAnc3RlJyA6ICdkZScpXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmxCZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBEdXRjaCBbbmxdXG4vLyEgYXV0aG9yIDogSm9yaXMgUsO2bGluZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3Jpc3JvbGluZ1xuLy8hIGF1dGhvciA6IEphY29iIE1pZGRhZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWRkYWdqXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnRXaXRoRG90cyA9XG4gICAgICAgICAgICAnamFuLl9mZWIuX21ydC5fYXByLl9tZWlfanVuLl9qdWwuX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnRXaXRob3V0RG90cyA9XG4gICAgICAgICAgICAnamFuX2ZlYl9tcnRfYXByX21laV9qdW5fanVsX2F1Z19zZXBfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15qYW4vaSxcbiAgICAgICAgICAgIC9eZmViL2ksXG4gICAgICAgICAgICAvXihtYWFydHxtcnRcXC4/KSQvaSxcbiAgICAgICAgICAgIC9eYXByL2ksXG4gICAgICAgICAgICAvXm1laSQvaSxcbiAgICAgICAgICAgIC9eanVuW2kuXT8kL2ksXG4gICAgICAgICAgICAvXmp1bFtpLl0/JC9pLFxuICAgICAgICAgICAgL15hdWcvaSxcbiAgICAgICAgICAgIC9ec2VwL2ksXG4gICAgICAgICAgICAvXm9rdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZGVjL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGphbnVhcml8ZmVicnVhcml8bWFhcnR8YXByaWx8bWVpfGp1W25sXWl8YXVndXN0dXN8c2VwdGVtYmVyfG9rdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXJ8amFuXFwuP3xmZWJcXC4/fG1ydFxcLj98YXByXFwuP3xqdVtubF1cXC4/fGF1Z1xcLj98c2VwXFwuP3xva3RcXC4/fG5vdlxcLj98ZGVjXFwuPykvaTtcblxuICAgIHZhciBubCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ25sJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJpX2ZlYnJ1YXJpX21hYXJ0X2FwcmlsX21laV9qdW5pX2p1bGlfYXVndXN0dXNfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRob3V0RG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oamFudWFyaXxmZWJydWFyaXxtYWFydHxhcHJpbHxtZWl8anVbbmxdaXxhdWd1c3R1c3xzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcikvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGphblxcLj98ZmViXFwuP3xtcnRcXC4/fGFwclxcLj98bWVpfGp1W25sXVxcLj98YXVnXFwuP3xzZXBcXC4/fG9rdFxcLj98bm92XFwuP3xkZWNcXC4/KS9pLFxuXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG5cbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnem9uZGFnX21hYW5kYWdfZGluc2RhZ193b2Vuc2RhZ19kb25kZXJkYWdfdnJpamRhZ196YXRlcmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3pvLl9tYS5fZGkuX3dvLl9kby5fdnIuX3phLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICd6b19tYV9kaV93b19kb192cl96YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQtTU0tWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbdmFuZGFhZyBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb3JnZW4gb21dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZ2lzdGVyZW4gb21dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2FmZ2Vsb3Blbl0gZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb3ZlciAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgZ2VsZWRlbicsXG4gICAgICAgICAgICBzOiAnZWVuIHBhYXIgc2Vjb25kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRlbicsXG4gICAgICAgICAgICBtOiAnw6nDqW4gbWludXV0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlbicsXG4gICAgICAgICAgICBoOiAnw6nDqW4gdXVyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdXVyJyxcbiAgICAgICAgICAgIGQ6ICfDqcOpbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdlbicsXG4gICAgICAgICAgICB3OiAnw6nDqW4gd2VlaycsXG4gICAgICAgICAgICB3dzogJyVkIHdla2VuJyxcbiAgICAgICAgICAgIE06ICfDqcOpbiBtYWFuZCcsXG4gICAgICAgICAgICBNTTogJyVkIG1hYW5kZW4nLFxuICAgICAgICAgICAgeTogJ8Opw6luIGphYXInLFxuICAgICAgICAgICAgeXk6ICclZCBqYWFyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0ZXxkZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIG51bWJlciArXG4gICAgICAgICAgICAgICAgKG51bWJlciA9PT0gMSB8fCBudW1iZXIgPT09IDggfHwgbnVtYmVyID49IDIwID8gJ3N0ZScgOiAnZGUnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5sO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE55bm9yc2sgW25uXVxuLy8hIGF1dGhvcnMgOiBodHRwczovL2dpdGh1Yi5jb20vbWVjaHV3aW5kXG4vLyEgICAgICAgICAgIFN0ZXBoZW4gUmFtdGh1biA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdGVwaGVucmFtdGh1blxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG5uID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbm4nLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnNfYXByaWxfbWFpX2p1bmlfanVsaV9hdWd1c3Rfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tYXJzX2Fwci5fbWFpX2p1bmlfanVsaV9hdWcuX3NlcC5fb2t0Ll9ub3YuX2Rlcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnc3VuZGFnX23DpW5kYWdfdHlzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sYXVyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc3UuX23DpS5fdHkuX29uLl90by5fZnIuX2xhdS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc3VfbcOlX3R5X29uX3RvX2ZyX2xhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBba2wuXSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQuIE1NTU0gWVlZWSBba2wuXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0kgZGFnIGtsb2trYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tJIG1vcmdvbiBrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBba2xva2thXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0kgZ8OlciBrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0bDuHJlZ8OlYW5kZV0gZGRkZCBba2xva2thXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ29tICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBzaWRhbicsXG4gICAgICAgICAgICBzOiAnbm9rcmUgc2VrdW5kJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kJyxcbiAgICAgICAgICAgIG06ICdlaXQgbWludXR0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXR0JyxcbiAgICAgICAgICAgIGg6ICdlaW4gdGltZScsXG4gICAgICAgICAgICBoaDogJyVkIHRpbWFyJyxcbiAgICAgICAgICAgIGQ6ICdlaW4gZGFnJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnYXInLFxuICAgICAgICAgICAgdzogJ2VpIHZla2UnLFxuICAgICAgICAgICAgd3c6ICclZCB2ZWtlcicsXG4gICAgICAgICAgICBNOiAnZWluIG3DpW5hZCcsXG4gICAgICAgICAgICBNTTogJyVkIG3DpW5hZGVyJyxcbiAgICAgICAgICAgIHk6ICdlaXQgw6VyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw6VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBubjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBPY2NpdGFuLCBsZW5nYWRvY2lhbiBkaWFsZWN0ZSBbb2MtbG5jXVxuLy8hIGF1dGhvciA6IFF1ZW50aW4gUEFHw4hTIDogaHR0cHM6Ly9naXRodWIuY29tL1F1ZW50eTMxXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgb2NMbmMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdvYy1sbmMnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnZ2VuacOocl9mZWJyacOocl9tYXLDp19hYnJpbF9tYWlfanVuaF9qdWxoZXRfYWdvc3Rfc2V0ZW1icmVfb2N0w7JicmVfbm92ZW1icmVfZGVjZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiBcImRlIGdlbmnDqHJfZGUgZmVicmnDqHJfZGUgbWFyw6dfZCdhYnJpbF9kZSBtYWlfZGUganVuaF9kZSBqdWxoZXRfZCdhZ29zdF9kZSBzZXRlbWJyZV9kJ29jdMOyYnJlX2RlIG5vdmVtYnJlX2RlIGRlY2VtYnJlXCIuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9EW29EXT8oXFxzKStNTU1NLyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnZ2VuLl9mZWJyLl9tYXLDp19hYnIuX21haV9qdW5oX2p1bGguX2Fnby5fc2V0Ll9vY3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2RpbWVuZ2VfZGlsdW5zX2RpbWFyc19kaW3DqGNyZXNfZGlqw7J1c19kaXZlbmRyZXNfZGlzc2FidGUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkZy5fZGwuX2RtLl9kYy5fZGouX2R2Ll9kcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGdfZGxfZG1fZGNfZGpfZHZfZHMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBsbDogJ0QgTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFtkZV0gWVlZWSBbYV0gSDptbScsXG4gICAgICAgICAgICBsbGw6ICdEIE1NTSBZWVlZLCBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBbZGVdIFlZWVkgW2FdIEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCBEIE1NTSBZWVlZLCBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbdcOoaSBhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2RlbWFuIGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpw6hyIGFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbcGFzc2F0IGFdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBcImQnYXF1w60gJXNcIixcbiAgICAgICAgICAgIHBhc3Q6ICdmYSAlcycsXG4gICAgICAgICAgICBzOiAndW5hcyBzZWdvbmRhcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ29uZGFzJyxcbiAgICAgICAgICAgIG06ICd1bmEgbWludXRhJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRhcycsXG4gICAgICAgICAgICBoOiAndW5hIG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGpvcm4nLFxuICAgICAgICAgICAgZGQ6ICclZCBqb3JucycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHJ8bnx0fMOofGEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICBudW1iZXIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgPyAncidcbiAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICA/ICduJ1xuICAgICAgICAgICAgICAgICAgICAgIDogbnVtYmVyID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnw6gnO1xuICAgICAgICAgICAgaWYgKHBlcmlvZCA9PT0gJ3cnIHx8IHBlcmlvZCA9PT0gJ1cnKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2EnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBvY0xuYztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBQdW5qYWJpIChJbmRpYSkgW3BhLWluXVxuLy8hIGF1dGhvciA6IEhhcnByZWV0IFNpbmdoIDogaHR0cHM6Ly9naXRodWIuY29tL2hhcnByZWV0a2hhbHNhZ3RiaXRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KmnJyxcbiAgICAgICAgICAgIDI6ICfgqagnLFxuICAgICAgICAgICAgMzogJ+CpqScsXG4gICAgICAgICAgICA0OiAn4KmqJyxcbiAgICAgICAgICAgIDU6ICfgqasnLFxuICAgICAgICAgICAgNjogJ+CprCcsXG4gICAgICAgICAgICA3OiAn4KmtJyxcbiAgICAgICAgICAgIDg6ICfgqa4nLFxuICAgICAgICAgICAgOTogJ+CprycsXG4gICAgICAgICAgICAwOiAn4KmmJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Cppyc6ICcxJyxcbiAgICAgICAgICAgICfgqagnOiAnMicsXG4gICAgICAgICAgICAn4KmpJzogJzMnLFxuICAgICAgICAgICAgJ+Cpqic6ICc0JyxcbiAgICAgICAgICAgICfgqasnOiAnNScsXG4gICAgICAgICAgICAn4KmsJzogJzYnLFxuICAgICAgICAgICAgJ+CprSc6ICc3JyxcbiAgICAgICAgICAgICfgqa4nOiAnOCcsXG4gICAgICAgICAgICAn4KmvJzogJzknLFxuICAgICAgICAgICAgJ+Cppic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBwYUluID0gbW9tZW50LmRlZmluZUxvY2FsZSgncGEtaW4nLCB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBtb250aHMgbmFtZSBhcyBwZXIgTmFuYWtzaGFoaSBDYWxlbmRhciBidXQgdGhleSBhcmUgbm90IHVzZWQgYXMgcmlnaWRseSBpbiBtb2Rlcm4gUHVuamFiaS5cbiAgICAgICAgbW9udGhzOiAn4Kic4Kio4Ki14Kiw4KmAX+Coq+CovOCosOCoteCosOCpgF/gqK7gqL7gqLDgqJpf4KiF4Kiq4KmN4Kiw4KmI4KiyX+CoruCoiF/gqJzgqYLgqKhf4Kic4KmB4Kiy4Ki+4KiIX+CoheCol+CouOCopF/gqLjgqKTgqbDgqKzgqLBf4KiF4KiV4Kik4KmC4Kis4KiwX+CoqOCoteCpsOCorOCosF/gqKbgqLjgqbDgqKzgqLAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+ConOCoqOCoteCosOCpgF/gqKvgqLzgqLDgqLXgqLDgqYBf4Kiu4Ki+4Kiw4KiaX+CoheCoquCpjeCosOCpiOCosl/gqK7gqIhf4Kic4KmC4KioX+ConOCpgeCosuCovuCoiF/gqIXgqJfgqLjgqKRf4Ki44Kik4Kmw4Kis4KiwX+CoheColeCopOCpguCorOCosF/gqKjgqLXgqbDgqKzgqLBf4Kim4Ki44Kmw4Kis4KiwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn4KiQ4Kik4Ki14Ki+4KiwX+CouOCpi+CoruCoteCovuCosF/gqK7gqbDgqJfgqLLgqLXgqL7gqLBf4Kis4KmB4Kin4Ki14Ki+4KiwX+CoteCpgOCosOCoteCovuCosF/gqLjgqLzgqYHgqbHgqJXgqLDgqLXgqL7gqLBf4Ki44Ki84Kio4KmA4Kia4Kiw4Ki14Ki+4KiwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4KiQ4KikX+CouOCpi+Corl/gqK7gqbDgqJfgqLJf4Kis4KmB4KinX+CoteCpgOCosF/gqLjgqLzgqYHgqJXgqLBf4Ki44Ki84Kio4KmAJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CokOCopF/gqLjgqYvgqK5f4Kiu4Kmw4KiX4KiyX+CorOCpgeCop1/gqLXgqYDgqLBf4Ki44Ki84KmB4KiV4KiwX+CouOCovOCoqOCpgCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIOCoteConOCphycsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3Mg4Ki14Kic4KmHJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgqLXgqJzgqYcnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4Ki14Kic4KmHJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KiF4KicXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+ColeCosl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4KiF4KiX4Kiy4Ki+XSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+ColeCosl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4Kiq4Ki/4Kib4Kiy4KmHXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCoteCov+CpseComicsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4Kiq4Ki/4Kib4Kiy4KmHJyxcbiAgICAgICAgICAgIHM6ICfgqJXgqYHgqJ0g4Ki44KiV4Ki/4Kmw4KifJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Ki44KiV4Ki/4Kmw4KifJyxcbiAgICAgICAgICAgIG06ICfgqIfgqJUg4Kiu4Ki/4Kmw4KifJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4Kiu4Ki/4Kmw4KifJyxcbiAgICAgICAgICAgIGg6ICfgqIfgqbHgqJUg4KiY4Kmw4Kif4Ki+JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KiY4Kmw4Kif4KmHJyxcbiAgICAgICAgICAgIGQ6ICfgqIfgqbHgqJUg4Kim4Ki/4KioJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Kim4Ki/4KioJyxcbiAgICAgICAgICAgIE06ICfgqIfgqbHgqJUg4Kiu4Ki54KmA4Kio4Ki+JyxcbiAgICAgICAgICAgIE1NOiAnJWQg4Kiu4Ki54KmA4Kio4KmHJyxcbiAgICAgICAgICAgIHk6ICfgqIfgqbHgqJUg4Ki44Ki+4KiyJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Ki44Ki+4KiyJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Cpp+CpqOCpqeCpquCpq+CprOCpreCpruCpr+Cppl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gUHVuamFiaSBub3RhdGlvbiBmb3IgbWVyaWRpZW1zIGFyZSBxdWl0ZSBmdXp6eSBpbiBwcmFjdGljZS4gV2hpbGUgdGhlcmUgZXhpc3RzXG4gICAgICAgIC8vIGEgcmlnaWQgbm90aW9uIG9mIGEgJ1BhaGFyJyBpdCBpcyBub3QgdXNlZCBhcyByaWdpZGx5IGluIG1vZGVybiBQdW5qYWJpLlxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4Kiw4Ki+4KikfOCouOCoteCph+CosHzgqKbgqYHgqKrgqLngqL/gqLB84Ki44Ki84Ki+4KiuLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4Kiw4Ki+4KikJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Ki44Ki14KmH4KiwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CopuCpgeCoquCoueCov+CosCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Ki44Ki84Ki+4KiuJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CosOCovuCopCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Ki44Ki14KmH4KiwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqKbgqYHgqKrgqLngqL/gqLAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CouOCovOCovuCoric7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kiw4Ki+4KikJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhSW47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUG9saXNoIFtwbF1cbi8vISBhdXRob3IgOiBSYWZhbCBIaXJzeiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ldm9MXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzTm9taW5hdGl2ZSA9XG4gICAgICAgICAgICAnc3R5Y3plxYRfbHV0eV9tYXJ6ZWNfa3dpZWNpZcWEX21hal9jemVyd2llY19saXBpZWNfc2llcnBpZcWEX3dyemVzaWXFhF9wYcW6ZHppZXJuaWtfbGlzdG9wYWRfZ3J1ZHppZcWEJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1N1YmplY3RpdmUgPVxuICAgICAgICAgICAgJ3N0eWN6bmlhX2x1dGVnb19tYXJjYV9rd2lldG5pYV9tYWphX2N6ZXJ3Y2FfbGlwY2Ffc2llcnBuaWFfd3J6ZcWbbmlhX3Bhxbpkemllcm5pa2FfbGlzdG9wYWRhX2dydWRuaWEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXnN0eS9pLFxuICAgICAgICAgICAgL15sdXQvaSxcbiAgICAgICAgICAgIC9ebWFyL2ksXG4gICAgICAgICAgICAvXmt3aS9pLFxuICAgICAgICAgICAgL15tYWovaSxcbiAgICAgICAgICAgIC9eY3plL2ksXG4gICAgICAgICAgICAvXmxpcC9pLFxuICAgICAgICAgICAgL15zaWUvaSxcbiAgICAgICAgICAgIC9ed3J6L2ksXG4gICAgICAgICAgICAvXnBhxbovaSxcbiAgICAgICAgICAgIC9ebGlzL2ksXG4gICAgICAgICAgICAvXmdydS9pLFxuICAgICAgICBdO1xuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIHJldHVybiBuICUgMTAgPCA1ICYmIG4gJSAxMCA+IDEgJiYgfn4obiAvIDEwKSAlIDEwICE9PSAxO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Nla3VuZHknIDogJ3Nla3VuZCcpO1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnbWludXRhJyA6ICdtaW51dMSZJztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21pbnV0eScgOiAnbWludXQnKTtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2dvZHppbmEnIDogJ2dvZHppbsSZJztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2dvZHppbnknIDogJ2dvZHppbicpO1xuICAgICAgICAgICAgY2FzZSAnd3cnOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAndHlnb2RuaWUnIDogJ3R5Z29kbmknKTtcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21pZXNpxIVjZScgOiAnbWllc2nEmWN5Jyk7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdsYXRhJyA6ICdsYXQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3BsJywge1xuICAgICAgICBtb250aHM6IGZ1bmN0aW9uIChtb21lbnRUb0Zvcm1hdCwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudFRvRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc05vbWluYXRpdmU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9EIE1NTU0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTdWJqZWN0aXZlW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzTm9taW5hdGl2ZVttb21lbnRUb0Zvcm1hdC5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdzdHlfbHV0X21hcl9rd2lfbWFqX2N6ZV9saXBfc2llX3dyel9wYcW6X2xpc19ncnUnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ25pZWR6aWVsYV9wb25pZWR6aWHFgmVrX3d0b3Jla1/Fm3JvZGFfY3p3YXJ0ZWtfcGnEhXRla19zb2JvdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZHpfcG9uX3d0X8Wbcl9jendfcHRfc29iJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ05kX1BuX1d0X8Wacl9Del9QdF9Tbycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tEemnFmyBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0p1dHJvIG9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgbmllZHppZWzEmSBvXSBMVCc7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbV2Ugd3RvcmVrIG9dIExUJztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXIMWbcm9kxJkgb10gTFQnO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgc29ib3TEmSBvXSBMVCc7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1ddIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1tXY3pvcmFqIG9dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgemVzesWCxIUgbmllZHppZWzEmSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgemVzesWCxIUgxZtyb2TEmSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgemVzesWCxIUgc29ib3TEmSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXIHplc3rFgnldIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgdGVtdScsXG4gICAgICAgICAgICBzOiAna2lsa2Egc2VrdW5kJyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICcxIGR6aWXFhCcsXG4gICAgICAgICAgICBkZDogJyVkIGRuaScsXG4gICAgICAgICAgICB3OiAndHlkemllxYQnLFxuICAgICAgICAgICAgd3c6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06ICdtaWVzacSFYycsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogJ3JvaycsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFBvcnR1Z3Vlc2UgKEJyYXppbCkgW3B0LWJyXVxuLy8hIGF1dGhvciA6IENhaW8gUmliZWlybyBQZXJlaXJhIDogaHR0cHM6Ly9naXRodWIuY29tL2NhaW8tcmliZWlyby1wZXJlaXJhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgcHRCciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3B0LWJyJywge1xuICAgICAgICBtb250aHM6ICdqYW5laXJvX2ZldmVyZWlyb19tYXLDp29fYWJyaWxfbWFpb19qdW5ob19qdWxob19hZ29zdG9fc2V0ZW1icm9fb3V0dWJyb19ub3ZlbWJyb19kZXplbWJybycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmV2X21hcl9hYnJfbWFpX2p1bl9qdWxfYWdvX3NldF9vdXRfbm92X2Rleicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnZG9taW5nb19zZWd1bmRhLWZlaXJhX3RlcsOnYS1mZWlyYV9xdWFydGEtZmVpcmFfcXVpbnRhLWZlaXJhX3NleHRhLWZlaXJhX3PDoWJhZG8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbV9zZWdfdGVyX3F1YV9xdWlfc2V4X3PDoWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fMsKqXzPCql80wqpfNcKqXzbCql9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIFvDoHNdIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgW8Ogc10gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIb2plIMOgc10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBbWFuaMOjIMOgc10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbT250ZW0gw6BzXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpID09PSAwIHx8IHRoaXMuZGF5KCkgPT09IDZcbiAgICAgICAgICAgICAgICAgICAgPyAnW8OabHRpbW9dIGRkZGQgW8Ogc10gTFQnIC8vIFNhdHVyZGF5ICsgU3VuZGF5XG4gICAgICAgICAgICAgICAgICAgIDogJ1vDmmx0aW1hXSBkZGRkIFvDoHNdIExUJzsgLy8gTW9uZGF5IC0gRnJpZGF5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaMOhICVzJyxcbiAgICAgICAgICAgIHM6ICdwb3Vjb3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW0gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW1hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW0gZGlhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGlhcycsXG4gICAgICAgICAgICBNOiAndW0gbcOqcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1bSBhbm8nLFxuICAgICAgICAgICAgeXk6ICclZCBhbm9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIGludmFsaWREYXRlOiAnRGF0YSBpbnbDoWxpZGEnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHB0QnI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUG9ydHVndWVzZSBbcHRdXG4vLyEgYXV0aG9yIDogSmVmZmVyc29uIDogaHR0cHM6Ly9naXRodWIuY29tL2phbGV4NzlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBwdCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3B0Jywge1xuICAgICAgICBtb250aHM6ICdqYW5laXJvX2ZldmVyZWlyb19tYXLDp29fYWJyaWxfbWFpb19qdW5ob19qdWxob19hZ29zdG9fc2V0ZW1icm9fb3V0dWJyb19ub3ZlbWJyb19kZXplbWJybycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmV2X21hcl9hYnJfbWFpX2p1bl9qdWxfYWdvX3NldF9vdXRfbm92X2Rleicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnRG9taW5nb19TZWd1bmRhLWZlaXJhX1RlcsOnYS1mZWlyYV9RdWFydGEtZmVpcmFfUXVpbnRhLWZlaXJhX1NleHRhLWZlaXJhX1PDoWJhZG8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0RvbV9TZWdfVGVyX1F1YV9RdWlfU2V4X1PDoWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnRG9fMsKqXzPCql80wqpfNcKqXzbCql9Tw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIb2plIMOgc10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBbWFuaMOjIMOgc10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbT250ZW0gw6BzXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpID09PSAwIHx8IHRoaXMuZGF5KCkgPT09IDZcbiAgICAgICAgICAgICAgICAgICAgPyAnW8OabHRpbW9dIGRkZGQgW8Ogc10gTFQnIC8vIFNhdHVyZGF5ICsgU3VuZGF5XG4gICAgICAgICAgICAgICAgICAgIDogJ1vDmmx0aW1hXSBkZGRkIFvDoHNdIExUJzsgLy8gTW9uZGF5IC0gRnJpZGF5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaMOhICVzJyxcbiAgICAgICAgICAgIHM6ICdzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1bSBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bWEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1bSBkaWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkaWFzJyxcbiAgICAgICAgICAgIHc6ICd1bWEgc2VtYW5hJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2VtYW5hcycsXG4gICAgICAgICAgICBNOiAndW0gbcOqcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1bSBhbm8nLFxuICAgICAgICAgICAgeXk6ICclZCBhbm9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBwdDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBSb21hbmlhbiBbcm9dXG4vLyEgYXV0aG9yIDogVmxhZCBHdXJkaWdhIDogaHR0cHM6Ly9naXRodWIuY29tL2d1cmRpZ2Fcbi8vISBhdXRob3IgOiBWYWxlbnRpbiBBZ2FjaGkgOiBodHRwczovL2dpdGh1Yi5jb20vYXZhbHlcbi8vISBhdXRob3IgOiBFbWFudWVsIENlcG9pIDogaHR0cHM6Ly9naXRodWIuY29tL2NlcGVtXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICAgICAgc3M6ICdzZWN1bmRlJyxcbiAgICAgICAgICAgICAgICBtbTogJ21pbnV0ZScsXG4gICAgICAgICAgICAgICAgaGg6ICdvcmUnLFxuICAgICAgICAgICAgICAgIGRkOiAnemlsZScsXG4gICAgICAgICAgICAgICAgd3c6ICdzxINwdMSDbcOibmknLFxuICAgICAgICAgICAgICAgIE1NOiAnbHVuaScsXG4gICAgICAgICAgICAgICAgeXk6ICdhbmknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcGFyYXRvciA9ICcgJztcbiAgICAgICAgaWYgKG51bWJlciAlIDEwMCA+PSAyMCB8fCAobnVtYmVyID49IDEwMCAmJiBudW1iZXIgJSAxMDAgPT09IDApKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSAnIGRlICc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bWJlciArIHNlcGFyYXRvciArIGZvcm1hdFtrZXldO1xuICAgIH1cblxuICAgIHZhciBybyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3JvJywge1xuICAgICAgICBtb250aHM6ICdpYW51YXJpZV9mZWJydWFyaWVfbWFydGllX2FwcmlsaWVfbWFpX2l1bmllX2l1bGllX2F1Z3VzdF9zZXB0ZW1icmllX29jdG9tYnJpZV9ub2llbWJyaWVfZGVjZW1icmllJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdpYW4uX2ZlYi5fbWFydC5fYXByLl9tYWlfaXVuLl9pdWwuX2F1Zy5fc2VwdC5fb2N0Ll9ub3YuX2RlYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdkdW1pbmljxINfbHVuaV9tYXLIm2lfbWllcmN1cmlfam9pX3ZpbmVyaV9zw6JtYsSDdMSDJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnRHVtX0x1bl9NYXJfTWllX0pvaV9WaW5fU8OibScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdEdV9MdV9NYV9NaV9Kb19WaV9Tw6InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1themkgbGFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbcOiaW5lIGxhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2xhXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2llcmkgbGFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2Zvc3RhXSBkZGRkIFtsYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdwZXN0ZSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgw65uIHVybcSDJyxcbiAgICAgICAgICAgIHM6ICdjw6J0ZXZhIHNlY3VuZGUnLFxuICAgICAgICAgICAgc3M6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtOiAndW4gbWludXQnLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoOiAnbyBvcsSDJyxcbiAgICAgICAgICAgIGhoOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZDogJ28gemknLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB3OiAnbyBzxINwdMSDbcOibsSDJyxcbiAgICAgICAgICAgIHd3OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgTTogJ28gbHVuxIMnLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5OiAndW4gYW4nLFxuICAgICAgICAgICAgeXk6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBybztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBSdXNzaWFuIFtydV1cbi8vISBhdXRob3IgOiBWaWt0b3JtaW5hdG9yIDogaHR0cHM6Ly9naXRodWIuY29tL1Zpa3Rvcm1pbmF0b3Jcbi8vISBhdXRob3IgOiBNZW5lbGlvbiBFbGVuc8O6bGUgOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuLy8hIGF1dGhvciA6INCa0L7RgNC10L3QsdC10YDQsyDQnNCw0YDQuiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRwYWlyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwbHVyYWwod29yZCwgbnVtKSB7XG4gICAgICAgIHZhciBmb3JtcyA9IHdvcmQuc3BsaXQoJ18nKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDEwID09PSAxICYmIG51bSAlIDEwMCAhPT0gMTFcbiAgICAgICAgICAgID8gZm9ybXNbMF1cbiAgICAgICAgICAgIDogbnVtICUgMTAgPj0gMiAmJiBudW0gJSAxMCA8PSA0ICYmIChudW0gJSAxMDAgPCAxMCB8fCBudW0gJSAxMDAgPj0gMjApXG4gICAgICAgICAgICAgID8gZm9ybXNbMV1cbiAgICAgICAgICAgICAgOiBmb3Jtc1syXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFBsdXJhbChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgc3M6IHdpdGhvdXRTdWZmaXggPyAn0YHQtdC60YPQvdC00LBf0YHQtdC60YPQvdC00Ytf0YHQtdC60YPQvdC0JyA6ICfRgdC10LrRg9C90LTRg1/RgdC10LrRg9C90LTRi1/RgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbW06IHdpdGhvdXRTdWZmaXggPyAn0LzQuNC90YPRgtCwX9C80LjQvdGD0YLRi1/QvNC40L3Rg9GCJyA6ICfQvNC40L3Rg9GC0YNf0LzQuNC90YPRgtGLX9C80LjQvdGD0YInLFxuICAgICAgICAgICAgaGg6ICfRh9Cw0YFf0YfQsNGB0LBf0YfQsNGB0L7QsicsXG4gICAgICAgICAgICBkZDogJ9C00LXQvdGMX9C00L3Rj1/QtNC90LXQuScsXG4gICAgICAgICAgICB3dzogJ9C90LXQtNC10LvRj1/QvdC10LTQtdC70Lhf0L3QtdC00LXQu9GMJyxcbiAgICAgICAgICAgIE1NOiAn0LzQtdGB0Y/Rhl/QvNC10YHRj9GG0LBf0LzQtdGB0Y/RhtC10LInLFxuICAgICAgICAgICAgeXk6ICfQs9C+0LRf0LPQvtC00LBf0LvQtdGCJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ20nKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfQvNC40L3Rg9GC0LAnIDogJ9C80LjQvdGD0YLRgyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgcGx1cmFsKGZvcm1hdFtrZXldLCArbnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgIC9e0Y/QvdCyL2ksXG4gICAgICAgIC9e0YTQtdCyL2ksXG4gICAgICAgIC9e0LzQsNGAL2ksXG4gICAgICAgIC9e0LDQv9GAL2ksXG4gICAgICAgIC9e0LzQsFvQudGPXS9pLFxuICAgICAgICAvXtC40Y7QvS9pLFxuICAgICAgICAvXtC40Y7Quy9pLFxuICAgICAgICAvXtCw0LLQsy9pLFxuICAgICAgICAvXtGB0LXQvS9pLFxuICAgICAgICAvXtC+0LrRgi9pLFxuICAgICAgICAvXtC90L7Rjy9pLFxuICAgICAgICAvXtC00LXQui9pLFxuICAgIF07XG5cbiAgICAvLyBodHRwOi8vbmV3LmdyYW1vdGEucnUvc3ByYXZrYS9ydWxlcy8xMzktcHJvcCA6IMKnIDEwM1xuICAgIC8vINCh0L7QutGA0LDRidC10L3QuNGPINC80LXRgdGP0YbQtdCyOiBodHRwOi8vbmV3LmdyYW1vdGEucnUvc3ByYXZrYS9idXJvL3NlYXJjaC1hbnN3ZXI/cz0yNDI2MzdcbiAgICAvLyBDTERSIGRhdGE6ICAgICAgICAgIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2xkci9jaGFydHMvMjgvc3VtbWFyeS9ydS5odG1sIzE3NTNcbiAgICB2YXIgcnUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdydScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfRj9C90LLQsNGA0Y9f0YTQtdCy0YDQsNC70Y9f0LzQsNGA0YLQsF/QsNC/0YDQtdC70Y9f0LzQsNGPX9C40Y7QvdGPX9C40Y7Qu9GPX9Cw0LLQs9GD0YHRgtCwX9GB0LXQvdGC0Y/QsdGA0Y9f0L7QutGC0Y/QsdGA0Y9f0L3QvtGP0LHRgNGPX9C00LXQutCw0LHRgNGPJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfRj9C90LLQsNGA0Yxf0YTQtdCy0YDQsNC70Yxf0LzQsNGA0YJf0LDQv9GA0LXQu9GMX9C80LDQuV/QuNGO0L3RjF/QuNGO0LvRjF/QsNCy0LPRg9GB0YJf0YHQtdC90YLRj9Cx0YDRjF/QvtC60YLRj9Cx0YDRjF/QvdC+0Y/QsdGA0Yxf0LTQtdC60LDQsdGA0YwnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDoge1xuICAgICAgICAgICAgLy8g0L/QviBDTERSINC40LzQtdC90L3QviBcItC40Y7Quy5cIiDQuCBcItC40Y7QvS5cIiwg0L3QviDQutCw0LrQvtC5INGB0LzRi9GB0Lsg0LzQtdC90Y/RgtGMINCx0YPQutCy0YMg0L3QsCDRgtC+0YfQutGDP1xuICAgICAgICAgICAgZm9ybWF0OiAn0Y/QvdCyLl/RhNC10LLRgC5f0LzQsNGALl/QsNC/0YAuX9C80LDRj1/QuNGO0L3Rj1/QuNGO0LvRj1/QsNCy0LMuX9GB0LXQvdGCLl/QvtC60YIuX9C90L7Rj9CxLl/QtNC10LouJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfRj9C90LIuX9GE0LXQstGALl/QvNCw0YDRgl/QsNC/0YAuX9C80LDQuV/QuNGO0L3RjF/QuNGO0LvRjF/QsNCy0LMuX9GB0LXQvdGCLl/QvtC60YIuX9C90L7Rj9CxLl/QtNC10LouJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vla2RheXM6IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9Cy0L7RgdC60YDQtdGB0LXQvdGM0LVf0L/QvtC90LXQtNC10LvRjNC90LjQul/QstGC0L7RgNC90LjQul/RgdGA0LXQtNCwX9GH0LXRgtCy0LXRgNCzX9C/0Y/RgtC90LjRhtCwX9GB0YPQsdCx0L7RgtCwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ9Cy0L7RgdC60YDQtdGB0LXQvdGM0LVf0L/QvtC90LXQtNC10LvRjNC90LjQul/QstGC0L7RgNC90LjQul/RgdGA0LXQtNGDX9GH0LXRgtCy0LXRgNCzX9C/0Y/RgtC90LjRhtGDX9GB0YPQsdCx0L7RgtGDJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL1xcWyA/W9CS0LJdID8oPzrQv9GA0L7RiNC70YPRjnzRgdC70LXQtNGD0Y7RidGD0Y580Y3RgtGDKT8gP10gP2RkZGQvLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0LLRgV/Qv9C9X9Cy0YJf0YHRgF/Rh9GCX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQstGBX9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuXG4gICAgICAgIC8vINC/0L7Qu9C90YvQtSDQvdCw0LfQstCw0L3QuNGPINGBINC/0LDQtNC10LbQsNC80LgsINC/0L4g0YLRgNC4INCx0YPQutCy0YssINC00LvRjyDQvdC10LrQvtGC0L7RgNGL0YUsINC/0L4gNCDQsdGD0LrQstGLLCDRgdC+0LrRgNCw0YnQtdC90LjRjyDRgSDRgtC+0YfQutC+0Lkg0Lgg0LHQtdC3INGC0L7Rh9C60LhcbiAgICAgICAgbW9udGhzUmVnZXg6XG4gICAgICAgICAgICAvXijRj9C90LLQsNGAW9GM0Y9dfNGP0L3QslxcLj980YTQtdCy0YDQsNC7W9GM0Y9dfNGE0LXQstGAP1xcLj980LzQsNGA0YLQsD980LzQsNGAXFwuP3zQsNC/0YDQtdC7W9GM0Y9dfNCw0L/RgFxcLj980LzQsFvQudGPXXzQuNGO0L1b0YzRj1180LjRjtC9XFwuP3zQuNGO0Ltb0YzRj1180LjRjtC7XFwuP3zQsNCy0LPRg9GB0YLQsD980LDQstCzXFwuP3zRgdC10L3RgtGP0LHRgFvRjNGPXXzRgdC10L3Rgj9cXC4/fNC+0LrRgtGP0LHRgFvRjNGPXXzQvtC60YJcXC4/fNC90L7Rj9Cx0YBb0YzRj1180L3QvtGP0LE/XFwuP3zQtNC10LrQsNCx0YBb0YzRj1180LTQtdC6XFwuPykvaSxcblxuICAgICAgICAvLyDQutC+0L/QuNGPINC/0YDQtdC00YvQtNGD0YnQtdCz0L5cbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDpcbiAgICAgICAgICAgIC9eKNGP0L3QstCw0YBb0YzRj1180Y/QvdCyXFwuP3zRhNC10LLRgNCw0Ltb0YzRj1180YTQtdCy0YA/XFwuP3zQvNCw0YDRgtCwP3zQvNCw0YBcXC4/fNCw0L/RgNC10Ltb0YzRj1180LDQv9GAXFwuP3zQvNCwW9C50Y9dfNC40Y7QvVvRjNGPXXzQuNGO0L1cXC4/fNC40Y7Qu1vRjNGPXXzQuNGO0LtcXC4/fNCw0LLQs9GD0YHRgtCwP3zQsNCy0LNcXC4/fNGB0LXQvdGC0Y/QsdGAW9GM0Y9dfNGB0LXQvdGCP1xcLj980L7QutGC0Y/QsdGAW9GM0Y9dfNC+0LrRglxcLj980L3QvtGP0LHRgFvRjNGPXXzQvdC+0Y/QsT9cXC4/fNC00LXQutCw0LHRgFvRjNGPXXzQtNC10LpcXC4/KS9pLFxuXG4gICAgICAgIC8vINC/0L7Qu9C90YvQtSDQvdCw0LfQstCw0L3QuNGPINGBINC/0LDQtNC10LbQsNC80LhcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXijRj9C90LLQsNGAW9GP0YxdfNGE0LXQstGA0LDQu1vRj9GMXXzQvNCw0YDRgtCwP3zQsNC/0YDQtdC7W9GP0YxdfNC80LBb0Y/QuV180LjRjtC9W9GP0YxdfNC40Y7Qu1vRj9GMXXzQsNCy0LPRg9GB0YLQsD980YHQtdC90YLRj9Cx0YBb0Y/RjF180L7QutGC0Y/QsdGAW9GP0YxdfNC90L7Rj9Cx0YBb0Y/RjF180LTQtdC60LDQsdGAW9GP0YxdKS9pLFxuXG4gICAgICAgIC8vINCS0YvRgNCw0LbQtdC90LjQtSwg0LrQvtGC0L7RgNC+0LUg0YHQvtC+0YLQstC10YLRgdGC0LLRg9C10YIg0YLQvtC70YzQutC+INGB0L7QutGA0LDRidGR0L3QvdGL0Lwg0YTQvtGA0LzQsNC8XG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXijRj9C90LJcXC580YTQtdCy0YA/XFwufNC80LDRgFvRgi5dfNCw0L/RgFxcLnzQvNCwW9GP0LldfNC40Y7QvVvRjNGPLl180LjRjtC7W9GM0Y8uXXzQsNCy0LNcXC580YHQtdC90YI/XFwufNC+0LrRglxcLnzQvdC+0Y/QsT9cXC580LTQtdC6XFwuKS9pLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWSDQsy4nLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkg0LMuLCBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSDQsy4sIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQodC10LPQvtC00L3Rjywg0LJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0JfQsNCy0YLRgNCwLCDQsl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQktGH0LXRgNCwLCDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93LndlZWsoKSAhPT0gdGhpcy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0YHQu9C10LTRg9GO0YnQtdC1XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDRgdC70LXQtNGD0Y7RidC40LldIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINGB0LvQtdC00YPRjtGJ0YPRjl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXkoKSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JLQvl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93LndlZWsoKSAhPT0gdGhpcy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0L/RgNC+0YjQu9C+0LVdIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINC/0YDQvtGI0LvRi9C5XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDQv9GA0L7RiNC70YPRjl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXkoKSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JLQvl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkl0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfRh9C10YDQtdC3ICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDQvdCw0LfQsNC0JyxcbiAgICAgICAgICAgIHM6ICfQvdC10YHQutC+0LvRjNC60L4g0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIHNzOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaDogJ9GH0LDRgScsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQ6ICfQtNC10L3RjCcsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHc6ICfQvdC10LTQtdC70Y8nLFxuICAgICAgICAgICAgd3c6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNOiAn0LzQtdGB0Y/RhicsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHk6ICfQs9C+0LQnLFxuICAgICAgICAgICAgeXk6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/QvdC+0YfQuHzRg9GC0YDQsHzQtNC90Y980LLQtdGH0LXRgNCwL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNC00L3Rj3zQstC10YfQtdGA0LApJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C90L7Rh9C4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRg9GC0YDQsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LTQvdGPJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQstC10YfQtdGA0LAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNC5fNCz0L580Y8pLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC5JztcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LPQvic7XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGPJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcnU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2luZGhpIFtzZF1cbi8vISBhdXRob3IgOiBOYXJhaW4gU2FnYXIgOiBodHRwczovL2dpdGh1Yi5jb20vbmFyYWluc2FnYXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICAgICAn2KzZhtmI2LHZiicsXG4gICAgICAgICAgICAn2YHZitio2LHZiNix2YonLFxuICAgICAgICAgICAgJ9mF2KfYsdqGJyxcbiAgICAgICAgICAgICfYp9m+2LHZitmEJyxcbiAgICAgICAgICAgICfZhdim2YonLFxuICAgICAgICAgICAgJ9is2YjZhicsXG4gICAgICAgICAgICAn2KzZiNmE2KfYodmQJyxcbiAgICAgICAgICAgICfYotqv2LPZvScsXG4gICAgICAgICAgICAn2LPZitm+2b3Zhdio2LEnLFxuICAgICAgICAgICAgJ9ii2qrZvdmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmF2KjYsScsXG4gICAgICAgICAgICAn2orYs9mF2KjYsScsXG4gICAgICAgIF0sXG4gICAgICAgIGRheXMgPSBbJ9ii2obYsScsICfYs9mI2YXYsScsICfYp9qx2KfYsdmIJywgJ9in2LHYqNi5JywgJ9iu2YXZitizJywgJ9is2YXYuScsICfah9mG2ofYsSddO1xuXG4gICAgdmFyIHNkID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc2QnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5czogZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogZGF5cyxcbiAgICAgICAgd2Vla2RheXNNaW46IGRheXMsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGTYjCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/Ytdio2K182LTYp9mFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9i02KfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LXYqNitJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAn2LTYp9mFJztcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfahF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYs9qA2Kfau9mKXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9in2rPZitmGINmH2YHYqtmKINiq2YpdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2qrYp9mE2YfZh10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb2q/Ystix2YrZhCDZh9mB2KrZil0gZGRkZCBb2KrZil0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDZvtmI2KEnLFxuICAgICAgICAgICAgcGFzdDogJyVzINin2rMnLFxuICAgICAgICAgICAgczogJ9qG2YbYryDYs9mK2qrZhtqKJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2LPZitqq2YbaiicsXG4gICAgICAgICAgICBtOiAn2YfaqiDZhdmG2b0nLFxuICAgICAgICAgICAgbW06ICclZCDZhdmG2b0nLFxuICAgICAgICAgICAgaDogJ9mH2qog2qrZhNin2qonLFxuICAgICAgICAgICAgaGg6ICclZCDaqtmE2KfaqicsXG4gICAgICAgICAgICBkOiAn2YfaqiDaj9mK2YbZh9mGJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2o/ZitmG2YfZhicsXG4gICAgICAgICAgICBNOiAn2YfaqiDZhdmH2YrZhtmIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2YXZh9mK2YbYpycsXG4gICAgICAgICAgICB5OiAn2YfaqiDYs9in2YQnLFxuICAgICAgICAgICAgeXk6ICclZCDYs9in2YQnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzZDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBOb3J0aGVybiBTYW1pIFtzZV1cbi8vISBhdXRob3JzIDogQsOlcmQgUm9sc3RhZCBIZW5yaWtzZW4gOiBodHRwczovL2dpdGh1Yi5jb20va2FyYW1lbGxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NlJywge1xuICAgICAgICBtb250aHM6ICdvxJHEkWFqYWdlbcOhbm51X2d1b3Z2YW3DoW5udV9uanVrxI1hbcOhbm51X2N1b8WLb23DoW5udV9taWVzc2Vtw6FubnVfZ2Vhc3NlbcOhbm51X3N1b2lkbmVtw6FubnVfYm9yZ2Vtw6FubnVfxI1ha8SNYW3DoW5udV9nb2xnZ290bcOhbm51X3Nrw6FibWFtw6FubnVfanVvdmxhbcOhbm51Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdvxJHEkWpfZ3Vvdl9uanVrX2N1b19taWVzX2dlYXNfc3VvaV9ib3JnX8SNYWvEjV9nb2xnX3Nrw6FiX2p1b3YnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3NvdG5hYmVhaXZpX3Z1b3Nzw6FyZ2FfbWHFi8WLZWLDoXJnYV9nYXNrYXZhaGtrdV9kdW9yYXN0YXRfYmVhcmphZGF0X2zDoXZ2YXJkYXQnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3NvdG5fdnVvc19tYcWLX2dhc2tfZHVvcl9iZWFyX2zDoXYnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc192X21fZ19kX2JfTCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdNTU1NIEQuIFtiLl0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIEQuIFtiLl0gWVlZWSBbdGkuXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBELiBbYi5dIFlZWVkgW3RpLl0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tvdG5lIHRpXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2lodHRpbiB0aV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt0aV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpa3RlIHRpXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tvdmRkaXRdIGRkZGQgW3RpXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIGdlYcW+ZXMnLFxuICAgICAgICAgICAgcGFzdDogJ21hxYtpdCAlcycsXG4gICAgICAgICAgICBzOiAnbW9hZGRlIHNla3VuZGRhdCcsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZGRhdCcsXG4gICAgICAgICAgICBtOiAnb2t0YSBtaW51aHRhJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludWh0YXQnLFxuICAgICAgICAgICAgaDogJ29rdGEgZGlpbW11JyxcbiAgICAgICAgICAgIGhoOiAnJWQgZGlpbW11dCcsXG4gICAgICAgICAgICBkOiAnb2t0YSBiZWFpdmknLFxuICAgICAgICAgICAgZGQ6ICclZCBiZWFpdnZpdCcsXG4gICAgICAgICAgICBNOiAnb2t0YSBtw6FubnUnLFxuICAgICAgICAgICAgTU06ICclZCBtw6FudXQnLFxuICAgICAgICAgICAgeTogJ29rdGEgamFoa2knLFxuICAgICAgICAgICAgeXk6ICclZCBqYWdpdCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2U7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2luaGFsZXNlIFtzaV1cbi8vISBhdXRob3IgOiBTYW1wYXRoIFNpdGluYW1hbHV3YSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYW1wYXRoc3Jpc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgLypqc2hpbnQgLVcxMDAqL1xuICAgIHZhciBzaSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NpJywge1xuICAgICAgICBtb250aHM6ICfgtqLgtrHgt4Dgt4/gtrvgt5Jf4La04LeZ4La24La74LeA4LeP4La74LeSX+C2uOC3j+C2u+C3iuC2reC3lF/gtoXgtrTgt4rigI3gtrvgt5rgtr3gt4pf4La44LeQ4La64LeSX+C2ouC3luC2seC3kl/gtqLgt5bgtr3gt5Jf4LaF4Lac4Led4LeD4LeK4Lat4LeUX+C3g+C3kOC2tOC3iuC2reC3kOC2uOC3iuC2tuC2u+C3il/gtpTgtprgt4rgtq3gt53gtrbgtrvgt4pf4Lax4Lec4LeA4LeQ4La44LeK4La24La74LeKX+C2r+C3meC3g+C3kOC2uOC3iuC2tuC2u+C3iicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfgtqLgtrFf4La04LeZ4La2X+C2uOC3j+C2u+C3il/gtoXgtrTgt4pf4La44LeQ4La64LeSX+C2ouC3luC2seC3kl/gtqLgt5bgtr3gt5Jf4LaF4Lac4LedX+C3g+C3kOC2tOC3il/gtpTgtprgt4pf4Lax4Lec4LeA4LeQX+C2r+C3meC3g+C3kCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn4LaJ4La74LeS4Lav4LePX+C3g+C2s+C3lOC2r+C3j1/gtoXgtp/gt4Tgtrvgt5Tgt4Dgt4/gtq/gt49f4La24Lav4LeP4Lav4LePX+C2tuC3iuKAjeC2u+C3hOC3g+C3iuC2tOC2reC3kuC2seC3iuC2r+C3j1/gt4Pgt5Lgtprgt5Tgtrvgt4/gtq/gt49f4LeD4LeZ4Lax4LeD4LeU4La74LeP4Lav4LePJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgtongtrvgt5Jf4LeD4Laz4LeUX+C2heC2n1/gtrbgtq/gt49f4La24LeK4oCN4La74LeEX+C3g+C3kuC2muC3lF/gt4Pgt5ngtrEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4LaJX+C3g1/gtoVf4La2X+C2tuC3iuKAjeC2u1/gt4Pgt5Jf4LeD4LeZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2EgaDptbScsXG4gICAgICAgICAgICBMVFM6ICdhIGg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZIE1NTU0gRCcsXG4gICAgICAgICAgICBMTEw6ICdZWVlZIE1NTU0gRCwgYSBoOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZIE1NTU0gRCBb4LeA4LeQ4Lax4LeSXSBkZGRkLCBhIGg6bW06c3MnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgtoXgtq9dIExUW+C2p10nLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgt4Tgt5ngtqddIExUW+C2p10nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIExUW+C2p10nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgtorgtrrgt5pdIExUW+C2p10nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4La04LeD4LeU4Lac4LeS4La6XSBkZGRkIExUW+C2p10nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+C2muC3kuC2seC3iicsXG4gICAgICAgICAgICBwYXN0OiAnJXPgtprgtqcg4La04LeZ4La7JyxcbiAgICAgICAgICAgIHM6ICfgtq3gtq3gt4rgtrTgtrsg4Laa4LeS4LeE4LeS4La04La6JyxcbiAgICAgICAgICAgIHNzOiAn4Lat4Lat4LeK4La04La7ICVkJyxcbiAgICAgICAgICAgIG06ICfgtrjgt5LgtrHgt5Lgtq3gt4rgtq3gt5Tgt4AnLFxuICAgICAgICAgICAgbW06ICfgtrjgt5LgtrHgt5Lgtq3gt4rgtq3gt5QgJWQnLFxuICAgICAgICAgICAgaDogJ+C2tOC3kOC2uicsXG4gICAgICAgICAgICBoaDogJ+C2tOC3kOC2uiAlZCcsXG4gICAgICAgICAgICBkOiAn4Lav4LeS4Lax4La6JyxcbiAgICAgICAgICAgIGRkOiAn4Lav4LeS4LaxICVkJyxcbiAgICAgICAgICAgIE06ICfgtrjgt4/gt4PgtronLFxuICAgICAgICAgICAgTU06ICfgtrjgt4/gt4MgJWQnLFxuICAgICAgICAgICAgeTogJ+C3gOC3g+C2uycsXG4gICAgICAgICAgICB5eTogJ+C3gOC3g+C2uyAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSDgt4Dgt5DgtrHgt5IvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDgt4Dgt5DgtrHgt5InO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4La04LeZ4La7IOC3gOC2u+C3lHzgtrTgt4Pgt4og4LeA4La74LeUfOC2tOC3mS7gt4B84La0LuC3gC4vLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+C2tC7gt4AuJyB8fCBpbnB1dCA9PT0gJ+C2tOC3g+C3iiDgt4Dgtrvgt5QnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ+C2tC7gt4AuJyA6ICfgtrTgt4Pgt4og4LeA4La74LeUJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAn4La04LeZLuC3gC4nIDogJ+C2tOC3meC2uyDgt4Dgtrvgt5QnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNsb3ZhayBbc2tdXG4vLyEgYXV0aG9yIDogTWFydGluIE1pbmthIDogaHR0cHM6Ly9naXRodWIuY29tL2syc1xuLy8hIGJhc2VkIG9uIHdvcmsgb2YgcGV0cmJlbGEgOiBodHRwczovL2dpdGh1Yi5jb20vcGV0cmJlbGFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPVxuICAgICAgICAgICAgJ2phbnXDoXJfZmVicnXDoXJfbWFyZWNfYXByw61sX23DoWpfasO6bl9qw7psX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0w7NiZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnamFuX2ZlYl9tYXJfYXByX23DoWpfasO6bl9qw7psX2F1Z19zZXBfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gcGx1cmFsKG4pIHtcbiAgICAgICAgcmV0dXJuIG4gPiAxICYmIG4gPCA1O1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzogLy8gYSBmZXcgc2Vjb25kcyAvIGluIGEgZmV3IHNlY29uZHMgLyBhIGZldyBzZWNvbmRzIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3DDoXIgc2Vrw7puZCcgOiAncMOhciBzZWt1bmRhbWknO1xuICAgICAgICAgICAgY2FzZSAnc3MnOiAvLyA5IHNlY29uZHMgLyBpbiA5IHNlY29uZHMgLyA5IHNlY29uZHMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdzZWt1bmR5JyA6ICdzZWvDum5kJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdzZWt1bmRhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ20nOiAvLyBhIG1pbnV0ZSAvIGluIGEgbWludXRlIC8gYSBtaW51dGUgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnbWluw7p0YScgOiBpc0Z1dHVyZSA/ICdtaW7DunR1JyA6ICdtaW7DunRvdSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6IC8vIDkgbWludXRlcyAvIGluIDkgbWludXRlcyAvIDkgbWludXRlcyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21pbsO6dHknIDogJ21pbsO6dCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbWluw7p0YW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdoJzogLy8gYW4gaG91ciAvIGluIGFuIGhvdXIgLyBhbiBob3VyIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2hvZGluYScgOiBpc0Z1dHVyZSA/ICdob2RpbnUnIDogJ2hvZGlub3UnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOiAvLyA5IGhvdXJzIC8gaW4gOSBob3VycyAvIDkgaG91cnMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdob2RpbnknIDogJ2hvZMOtbicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnaG9kaW5hbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2QnOiAvLyBhIGRheSAvIGluIGEgZGF5IC8gYSBkYXkgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZGXFiCcgOiAnZMWIb20nO1xuICAgICAgICAgICAgY2FzZSAnZGQnOiAvLyA5IGRheXMgLyBpbiA5IGRheXMgLyA5IGRheXMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdkbmknIDogJ2Ruw60nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2TFiGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnTSc6IC8vIGEgbW9udGggLyBpbiBhIG1vbnRoIC8gYSBtb250aCBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNpYWMnIDogJ21lc2lhY29tJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzogLy8gOSBtb250aHMgLyBpbiA5IG1vbnRocyAvIDkgbW9udGhzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWVzaWFjZScgOiAnbWVzaWFjb3YnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ21lc2lhY21pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICd5JzogLy8gYSB5ZWFyIC8gaW4gYSB5ZWFyIC8gYSB5ZWFyIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3JvaycgOiAncm9rb20nO1xuICAgICAgICAgICAgY2FzZSAneXknOiAvLyA5IHllYXJzIC8gaW4gOSB5ZWFycyAvIDkgeWVhcnMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdyb2t5JyA6ICdyb2tvdicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAncm9rbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NrJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRoc1Nob3J0LFxuICAgICAgICB3ZWVrZGF5czogJ25lZGXEvmFfcG9uZGVsb2tfdXRvcm9rX3N0cmVkYV/FoXR2cnRva19waWF0b2tfc29ib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVfcG9fdXRfc3RfxaF0X3BpX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3V0X3N0X8WhdF9waV9zbycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZG5lcyBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3phanRyYSBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IG5lZGXEvnUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBzdHJlZHUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2byDFoXR2cnRvayBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgcGlhdG9rIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBzb2JvdHUgb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW3bEjWVyYSBvXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO6IG5lZGXEvnUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw71dIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDuiBzdHJlZHUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw71dIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDuiBzb2JvdHUgb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmVkICVzJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzaztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTbG92ZW5pYW4gW3NsXVxuLy8hIGF1dGhvciA6IFJvYmVydCBTZWRvdsWhZWsgOiBodHRwczovL2dpdGh1Yi5jb20vc2Vkb3ZzZWtcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZVxuICAgICAgICAgICAgICAgICAgICA/ICduZWthaiBzZWt1bmQnXG4gICAgICAgICAgICAgICAgICAgIDogJ25la2FqIHNla3VuZGFtaSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCA/ICdzZWt1bmRvJyA6ICdzZWt1bmRpJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdzZWt1bmRpJyA6ICdzZWt1bmRhaCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3Nla3VuZGUnIDogJ3Nla3VuZGFoJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdlbmEgbWludXRhJyA6ICdlbm8gbWludXRvJztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4ID8gJ21pbnV0YScgOiAnbWludXRvJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtaW51dGknIDogJ21pbnV0YW1hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWludXRlJyA6ICdtaW51dGFtaSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWludXQnIDogJ21pbnV0YW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2VuYSB1cmEnIDogJ2VubyB1cm8nO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggPyAndXJhJyA6ICd1cm8nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3VyaScgOiAndXJhbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICd1cmUnIDogJ3VyYW1pJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICd1cicgOiAndXJhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW4gZGFuJyA6ICdlbmltIGRuZW0nO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZGFuJyA6ICdkbmVtJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkbmknIDogJ2RuZXZvbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2RuaScgOiAnZG5ldmknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW4gbWVzZWMnIDogJ2VuaW0gbWVzZWNlbSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNlYycgOiAnbWVzZWNlbSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWVzZWNhJyA6ICdtZXNlY2VtYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2VjZScgOiAnbWVzZWNpJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNlY2V2JyA6ICdtZXNlY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW5vIGxldG8nIDogJ2VuaW0gbGV0b20nO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbGV0bycgOiAnbGV0b20nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldGknIDogJ2xldG9tYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldGEnIDogJ2xldGknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldCcgOiAnbGV0aSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2wgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzbCcsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFyZWNfYXByaWxfbWFqX2p1bmlqX2p1bGlqX2F2Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hci5fYXByLl9tYWouX2p1bi5fanVsLl9hdmcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWRlbGphX3BvbmVkZWxqZWtfdG9yZWtfc3JlZGFfxI1ldHJ0ZWtfcGV0ZWtfc29ib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVkLl9wb24uX3Rvci5fc3JlLl/EjWV0Ll9wZXQuX3NvYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdG9fc3JfxI1lX3BlX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuIE1NLiBZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmVzIG9iXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2p1dHJpIG9iXSBMVCcsXG5cbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIFtuZWRlbGpvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gW3NyZWRvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gW3NvYm90b10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIGRkZGQgW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbdsSNZXJhaiBvYl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlasWhbmpvXSBbbmVkZWxqb10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ByZWrFoW5qb10gW3NyZWRvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlasWhbmpvXSBbc29ib3RvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlasWhbmppXSBkZGRkIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ8SNZXogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByZWQgJXMnLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFsYmFuaWFuIFtzcV1cbi8vISBhdXRob3IgOiBGbGFrw6tyaW0gSXNtYW5pIDogaHR0cHM6Ly9naXRodWIuY29tL2ZsYWtlcmltaVxuLy8hIGF1dGhvciA6IE1lbmVsaW9uIEVsZW5zw7psZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlXG4vLyEgYXV0aG9yIDogT2VyZCBDdWthbGxhIDogaHR0cHM6Ly9naXRodWIuY29tL29lcmRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzcSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NxJywge1xuICAgICAgICBtb250aHM6ICdKYW5hcl9TaGt1cnRfTWFyc19QcmlsbF9NYWpfUWVyc2hvcl9Lb3JyaWtfR3VzaHRfU2h0YXRvcl9UZXRvcl9Ow6tudG9yX0RoamV0b3InLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX1Noa19NYXJfUHJpX01hal9RZXJfS29yX0d1c19TaHRfVGV0X07Dq25fRGhqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0UgRGllbF9FIEjDq27Dq19FIE1hcnTDq19FIE3Dq3JrdXLDq19FIEVuanRlX0UgUHJlbXRlX0UgU2h0dW7Dqycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0RpZV9Iw6tuX01hcl9Nw6tyX0Vual9QcmVfU2h0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0RfSF9NYV9Nw6tfRV9QX1NoJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9QRHxNRC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LmNoYXJBdCgwKSA9PT0gJ00nO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gaG91cnMgPCAxMiA/ICdQRCcgOiAnTUQnO1xuICAgICAgICB9LFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1NvdCBuw6tdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbTmVzw6tyIG7Dq10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtuw6tdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbRGplIG7Dq10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtlIGthbHVhciBuw6tdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnbsOrICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBtw6sgcGFyw6snLFxuICAgICAgICAgICAgczogJ2Rpc2Egc2Vrb25kYScsXG4gICAgICAgICAgICBzczogJyVkIHNla29uZGEnLFxuICAgICAgICAgICAgbTogJ25qw6sgbWludXTDqycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0YScsXG4gICAgICAgICAgICBoOiAnbmrDqyBvcsOrJyxcbiAgICAgICAgICAgIGhoOiAnJWQgb3LDqycsXG4gICAgICAgICAgICBkOiAnbmrDqyBkaXTDqycsXG4gICAgICAgICAgICBkZDogJyVkIGRpdMOrJyxcbiAgICAgICAgICAgIE06ICduasOrIG11YWonLFxuICAgICAgICAgICAgTU06ICclZCBtdWFqJyxcbiAgICAgICAgICAgIHk6ICduasOrIHZpdCcsXG4gICAgICAgICAgICB5eTogJyVkIHZpdGUnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNxO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNlcmJpYW4gQ3lyaWxsaWMgW3NyLWN5cmxdXG4vLyEgYXV0aG9yIDogTWlsYW4gSmFuYcSNa292acSHPG1pbGFuamFuYWNrb3ZpY0BnbWFpbC5jb20+IDogaHR0cHM6Ly9naXRodWIuY29tL21pbGFuLWpcbi8vISBhdXRob3IgOiBTdGVmYW4gQ3JuamFrb3ZpxIcgPHN0ZWZhbkBob3RtYWlsLnJzPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jcm5qYWtvdmljXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdHJhbnNsYXRvciA9IHtcbiAgICAgICAgd29yZHM6IHtcbiAgICAgICAgICAgIC8vRGlmZmVyZW50IGdyYW1tYXRpY2FsIGNhc2VzXG4gICAgICAgICAgICBzczogWyfRgdC10LrRg9C90LTQsCcsICfRgdC10LrRg9C90LTQtScsICfRgdC10LrRg9C90LTQuCddLFxuICAgICAgICAgICAgbTogWyfRmNC10LTQsNC9INC80LjQvdGD0YInLCAn0ZjQtdC00L3QvtCzINC80LjQvdGD0YLQsCddLFxuICAgICAgICAgICAgbW06IFsn0LzQuNC90YPRgicsICfQvNC40L3Rg9GC0LAnLCAn0LzQuNC90YPRgtCwJ10sXG4gICAgICAgICAgICBoOiBbJ9GY0LXQtNCw0L0g0YHQsNGCJywgJ9GY0LXQtNC90L7QsyDRgdCw0YLQsCddLFxuICAgICAgICAgICAgaGg6IFsn0YHQsNGCJywgJ9GB0LDRgtCwJywgJ9GB0LDRgtC4J10sXG4gICAgICAgICAgICBkOiBbJ9GY0LXQtNCw0L0g0LTQsNC9JywgJ9GY0LXQtNC90L7QsyDQtNCw0L3QsCddLFxuICAgICAgICAgICAgZGQ6IFsn0LTQsNC9JywgJ9C00LDQvdCwJywgJ9C00LDQvdCwJ10sXG4gICAgICAgICAgICBNOiBbJ9GY0LXQtNCw0L0g0LzQtdGB0LXRhicsICfRmNC10LTQvdC+0LMg0LzQtdGB0LXRhtCwJ10sXG4gICAgICAgICAgICBNTTogWyfQvNC10YHQtdGGJywgJ9C80LXRgdC10YbQsCcsICfQvNC10YHQtdGG0LgnXSxcbiAgICAgICAgICAgIHk6IFsn0ZjQtdC00L3RgyDQs9C+0LTQuNC90YMnLCAn0ZjQtdC00L3QtSDQs9C+0LTQuNC90LUnXSxcbiAgICAgICAgICAgIHl5OiBbJ9Cz0L7QtNC40L3RgycsICfQs9C+0LTQuNC90LUnLCAn0LPQvtC00LjQvdCwJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGNvcnJlY3RHcmFtbWF0aWNhbENhc2U6IGZ1bmN0aW9uIChudW1iZXIsIHdvcmRLZXkpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBudW1iZXIgJSAxMCA+PSAxICYmXG4gICAgICAgICAgICAgICAgbnVtYmVyICUgMTAgPD0gNCAmJlxuICAgICAgICAgICAgICAgIChudW1iZXIgJSAxMDAgPCAxMCB8fCBudW1iZXIgJSAxMDAgPj0gMjApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICUgMTAgPT09IDEgPyB3b3JkS2V5WzBdIDogd29yZEtleVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3JkS2V5WzJdO1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgIHZhciB3b3JkS2V5ID0gdHJhbnNsYXRvci53b3Jkc1trZXldLFxuICAgICAgICAgICAgICAgIHdvcmQ7XG5cbiAgICAgICAgICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gTm9taW5hdGl2XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3knICYmIHdpdGhvdXRTdWZmaXgpIHJldHVybiAn0ZjQtdC00L3QsCDQs9C+0LTQuNC90LAnO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gd29yZEtleVswXSA6IHdvcmRLZXlbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdvcmQgPSB0cmFuc2xhdG9yLmNvcnJlY3RHcmFtbWF0aWNhbENhc2UobnVtYmVyLCB3b3JkS2V5KTtcbiAgICAgICAgICAgIC8vIE5vbWluYXRpdlxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3l5JyAmJiB3aXRob3V0U3VmZml4ICYmIHdvcmQgPT09ICfQs9C+0LTQuNC90YMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg0LPQvtC00LjQvdCwJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIHdvcmQ7XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHZhciBzckN5cmwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzci1jeXJsJywge1xuICAgICAgICBtb250aHM6ICfRmNCw0L3Rg9Cw0YBf0YTQtdCx0YDRg9Cw0YBf0LzQsNGA0YJf0LDQv9GA0LjQu1/QvNCw0Zhf0ZjRg9C9X9GY0YPQu1/QsNCy0LPRg9GB0YJf0YHQtdC/0YLQtdC80LHQsNGAX9C+0LrRgtC+0LHQsNGAX9C90L7QstC10LzQsdCw0YBf0LTQtdGG0LXQvNCx0LDRgCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn0ZjQsNC9Ll/RhNC10LEuX9C80LDRgC5f0LDQv9GALl/QvNCw0Zhf0ZjRg9C9X9GY0YPQu1/QsNCy0LMuX9GB0LXQvy5f0L7QutGCLl/QvdC+0LIuX9C00LXRhi4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn0L3QtdC00LXRmdCwX9C/0L7QvdC10LTQtdGZ0LDQul/Rg9GC0L7RgNCw0Lpf0YHRgNC10LTQsF/Rh9C10YLQstGA0YLQsNC6X9C/0LXRgtCw0Lpf0YHRg9Cx0L7RgtCwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0L3QtdC0Ll/Qv9C+0L0uX9GD0YLQvi5f0YHRgNC1Ll/Rh9C10YIuX9C/0LXRgi5f0YHRg9CxLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvdC1X9C/0L5f0YPRgl/RgdGAX9GH0LVf0L/QtV/RgdGDJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC4gTS4gWVlZWS4nLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVkuJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWS4gSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZLiBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0LTQsNC90LDRgSDRg10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vRgdGD0YLRgNCwINGDXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gW9C90LXQtNC10ZnRg10gW9GDXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9GDXSBb0YHRgNC10LTRg10gW9GDXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9GDXSBb0YHRg9Cx0L7RgtGDXSBb0YNdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0YNdIGRkZGQgW9GDXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0ZjRg9GH0LUg0YNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RXZWVrRGF5cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70LVdIFvQvdC10LTQtdGZ0LVdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQvtCzXSBb0L/QvtC90LXQtNC10ZnQutCwXSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70L7Qs10gW9GD0YLQvtGA0LrQsF0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C1XSBb0YHRgNC10LTQtV0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C+0LNdIFvRh9C10YLQstGA0YLQutCwXSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70L7Qs10gW9C/0LXRgtC60LBdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQtV0gW9GB0YPQsdC+0YLQtV0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFdlZWtEYXlzW3RoaXMuZGF5KCldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0LfQsCAlcycsXG4gICAgICAgICAgICBwYXN0OiAn0L/RgNC1ICVzJyxcbiAgICAgICAgICAgIHM6ICfQvdC10LrQvtC70LjQutC+INGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3JDeXJsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNlcmJpYW4gW3NyXVxuLy8hIGF1dGhvciA6IE1pbGFuIEphbmHEjWtvdmnEhzxtaWxhbmphbmFja292aWNAZ21haWwuY29tPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWxhbi1qXG4vLyEgYXV0aG9yIDogU3RlZmFuIENybmpha292acSHIDxzdGVmYW5AaG90bWFpbC5ycz4gOiBodHRwczovL2dpdGh1Yi5jb20vY3JuamFrb3ZpY1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRyYW5zbGF0b3IgPSB7XG4gICAgICAgIHdvcmRzOiB7XG4gICAgICAgICAgICAvL0RpZmZlcmVudCBncmFtbWF0aWNhbCBjYXNlc1xuICAgICAgICAgICAgc3M6IFsnc2VrdW5kYScsICdzZWt1bmRlJywgJ3Nla3VuZGknXSxcbiAgICAgICAgICAgIG06IFsnamVkYW4gbWludXQnLCAnamVkbm9nIG1pbnV0YSddLFxuICAgICAgICAgICAgbW06IFsnbWludXQnLCAnbWludXRhJywgJ21pbnV0YSddLFxuICAgICAgICAgICAgaDogWydqZWRhbiBzYXQnLCAnamVkbm9nIHNhdGEnXSxcbiAgICAgICAgICAgIGhoOiBbJ3NhdCcsICdzYXRhJywgJ3NhdGknXSxcbiAgICAgICAgICAgIGQ6IFsnamVkYW4gZGFuJywgJ2plZG5vZyBkYW5hJ10sXG4gICAgICAgICAgICBkZDogWydkYW4nLCAnZGFuYScsICdkYW5hJ10sXG4gICAgICAgICAgICBNOiBbJ2plZGFuIG1lc2VjJywgJ2plZG5vZyBtZXNlY2EnXSxcbiAgICAgICAgICAgIE1NOiBbJ21lc2VjJywgJ21lc2VjYScsICdtZXNlY2knXSxcbiAgICAgICAgICAgIHk6IFsnamVkbnUgZ29kaW51JywgJ2plZG5lIGdvZGluZSddLFxuICAgICAgICAgICAgeXk6IFsnZ29kaW51JywgJ2dvZGluZScsICdnb2RpbmEnXSxcbiAgICAgICAgfSxcbiAgICAgICAgY29ycmVjdEdyYW1tYXRpY2FsQ2FzZTogZnVuY3Rpb24gKG51bWJlciwgd29yZEtleSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG51bWJlciAlIDEwID49IDEgJiZcbiAgICAgICAgICAgICAgICBudW1iZXIgJSAxMCA8PSA0ICYmXG4gICAgICAgICAgICAgICAgKG51bWJlciAlIDEwMCA8IDEwIHx8IG51bWJlciAlIDEwMCA+PSAyMClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMSA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdvcmRLZXlbMl07XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgdmFyIHdvcmRLZXkgPSB0cmFuc2xhdG9yLndvcmRzW2tleV0sXG4gICAgICAgICAgICAgICAgd29yZDtcblxuICAgICAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBOb21pbmF0aXZcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAneScgJiYgd2l0aG91dFN1ZmZpeCkgcmV0dXJuICdqZWRuYSBnb2RpbmEnO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gd29yZEtleVswXSA6IHdvcmRLZXlbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdvcmQgPSB0cmFuc2xhdG9yLmNvcnJlY3RHcmFtbWF0aWNhbENhc2UobnVtYmVyLCB3b3JkS2V5KTtcbiAgICAgICAgICAgIC8vIE5vbWluYXRpdlxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3l5JyAmJiB3aXRob3V0U3VmZml4ICYmIHdvcmQgPT09ICdnb2RpbnUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgZ29kaW5hJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIHdvcmQ7XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHZhciBzciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NyJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJ0X2FwcmlsX21hal9qdW5fanVsX2F2Z3VzdF9zZXB0ZW1iYXJfb2t0b2Jhcl9ub3ZlbWJhcl9kZWNlbWJhcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hci5fYXByLl9tYWpfanVuX2p1bF9hdmcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkZWxqYV9wb25lZGVsamFrX3V0b3Jha19zcmVkYV/EjWV0dnJ0YWtfcGV0YWtfc3Vib3RhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVkLl9wb24uX3V0by5fc3JlLl/EjWV0Ll9wZXQuX3N1Yi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdXRfc3JfxI1lX3BlX3N1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC4gTS4gWVlZWS4nLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVkuJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWS4gSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZLiBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZGFuYXMgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tzdXRyYSB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbbmVkZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3NyZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3Vib3R1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbanXEjWUgdV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdFdlZWtEYXlzID0gW1xuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtuZWRlbGplXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbcG9uZWRlbGprYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3V0b3JrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbc3JlZGVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFvEjWV0dnJ0a2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFtwZXRrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbc3Vib3RlXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RXZWVrRGF5c1t0aGlzLmRheSgpXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmUgJXMnLFxuICAgICAgICAgICAgczogJ25la29saWtvIHNla3VuZGknLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBzaVN3YXRpIFtzc11cbi8vISBhdXRob3IgOiBOaWNvbGFpIERhdmllczxtYWlsQG5pY29sYWkuaW8+IDogaHR0cHM6Ly9naXRodWIuY29tL25pY29sYWlkYXZpZXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NzJywge1xuICAgICAgICBtb250aHM6IFwiQmhpbWJpZHZ3YW5lX0luZGxvdmFuYV9JbmRsb3YnbGVua2h1bHVfTWFiYXNhX0lua2h3ZWtod2V0aV9JbmhsYWJhX0tob2x3YW5lX0luZ2NpX0lueW9uaV9JbXBoYWxhX0x3ZXRpX0luZ29uZ29uaVwiLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnQmhpX0luYV9JbnVfTWFiX0lua19JbmhfS2hvX0lnY19JbnlfSW1wX0x3ZV9JZ28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ0xpc29udGZvX1Vtc29tYnVsdWtvX0xlc2liaWxpX0xlc2l0c2F0ZnVfTGVzaW5lX0xlc2lobGFudV9VbWdjaWJlbG8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0xpc19VbWJfTHNiX0xlc19Mc2lfTHNoX1VtZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdMaV9Vc19MYl9MdF9Mc19MaF9VZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tOYW11aGxhIG5nYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tLdXNhc2EgbmdhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW25nYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJdG9sbyBuZ2FdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbbGVsaXBoZWxpbGVdIFtuZ2FdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnbmdhICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICd3ZW50ZWthIG5nYSAlcycsXG4gICAgICAgICAgICBzOiAnZW1penV6d2FuYSBsb21jYW5lJyxcbiAgICAgICAgICAgIHNzOiAnJWQgbXp1endhbmEnLFxuICAgICAgICAgICAgbTogJ3VtenV6dScsXG4gICAgICAgICAgICBtbTogJyVkIGVtaXp1enUnLFxuICAgICAgICAgICAgaDogJ2xpaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGVtYWhvcmEnLFxuICAgICAgICAgICAgZDogJ2xpbGFuZ2EnLFxuICAgICAgICAgICAgZGQ6ICclZCBlbWFsYW5nYScsXG4gICAgICAgICAgICBNOiAnaW55YW5nYScsXG4gICAgICAgICAgICBNTTogJyVkIHRpbnlhbmdhJyxcbiAgICAgICAgICAgIHk6ICd1bW55YWthJyxcbiAgICAgICAgICAgIHl5OiAnJWQgaW1pbnlha2EnLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvZWt1c2VuaXxlbWluaXxlbnRzYW1iYW1hfGVidXN1a3UvLFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZWt1c2VuaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VtaW5pJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZW50c2FtYmFtYSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZWJ1c3VrdSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ2VrdXNlbmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnZW1pbmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ2VudHNhbWJhbWEnIHx8IG1lcmlkaWVtID09PSAnZWJ1c3VrdScpIHtcbiAgICAgICAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogJyVkJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFN3ZWRpc2ggW3N2XVxuLy8hIGF1dGhvciA6IEplbnMgQWxtIDogaHR0cHM6Ly9naXRodWIuY29tL3VsbXVzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3YgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzdicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyaV9mZWJydWFyaV9tYXJzX2FwcmlsX21hal9qdW5pX2p1bGlfYXVndXN0aV9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcl9hcHJfbWFqX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdzw7ZuZGFnX23DpW5kYWdfdGlzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sw7ZyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc8O2bl9tw6VuX3Rpc19vbnNfdG9yX2ZyZV9sw7ZyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3PDtl9tw6VfdGlfb25fdG9fZnJfbMO2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbDogJ0QgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCBEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSWRhZ10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tJbW9yZ29uXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0lnw6VyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tQw6VdIGRkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbSV0gZGRkZFtzXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ29tICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdmw7ZyICVzIHNlZGFuJyxcbiAgICAgICAgICAgIHM6ICduw6VncmEgc2VrdW5kZXInLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmRlcicsXG4gICAgICAgICAgICBtOiAnZW4gbWludXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVyJyxcbiAgICAgICAgICAgIGg6ICdlbiB0aW1tZScsXG4gICAgICAgICAgICBoaDogJyVkIHRpbW1hcicsXG4gICAgICAgICAgICBkOiAnZW4gZGFnJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnYXInLFxuICAgICAgICAgICAgTTogJ2VuIG3DpW5hZCcsXG4gICAgICAgICAgICBNTTogJyVkIG3DpW5hZGVyJyxcbiAgICAgICAgICAgIHk6ICdldHQgw6VyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw6VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KFxcOmV8XFw6YSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICc6ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICc6YSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnOmEnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICc6ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJzplJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTd2FoaWxpIFtzd11cbi8vISBhdXRob3IgOiBGYWhhZCBLYXNzaW0gOiBodHRwczovL2dpdGh1Yi5jb20vZmFkc2VsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3cgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzdycsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyaV9GZWJydWFyaV9NYWNoaV9BcHJpbGlfTWVpX0p1bmlfSnVsYWlfQWdvc3RpX1NlcHRlbWJhX09rdG9iYV9Ob3ZlbWJhX0Rlc2VtYmEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYWNfQXByX01laV9KdW5fSnVsX0Fnb19TZXBfT2t0X05vdl9EZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ0p1bWFwaWxpX0p1bWF0YXR1X0p1bWFubmVfSnVtYXRhbm9fQWxoYW1pc2lfSWp1bWFhX0p1bWFtb3NpJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdKcGxfSnRhdF9Kbm5lX0p0YW5fQWxoX0lqbV9KbW9zJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0oyX0ozX0o0X0o1X0FsX0lqX0oxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2hoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tsZW8gc2FhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2tlc2hvIHNhYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbd2lraSBpamF5b10gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tqYW5hXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1t3aWtpIGlsaXlvcGl0YV0gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBiYWFkYXllJyxcbiAgICAgICAgICAgIHBhc3Q6ICd0b2tlYSAlcycsXG4gICAgICAgICAgICBzOiAnaGl2aSBwdW5kZScsXG4gICAgICAgICAgICBzczogJ3Nla3VuZGUgJWQnLFxuICAgICAgICAgICAgbTogJ2Rha2lrYSBtb2phJyxcbiAgICAgICAgICAgIG1tOiAnZGFraWthICVkJyxcbiAgICAgICAgICAgIGg6ICdzYWEgbGltb2phJyxcbiAgICAgICAgICAgIGhoOiAnbWFzYWEgJWQnLFxuICAgICAgICAgICAgZDogJ3Npa3UgbW9qYScsXG4gICAgICAgICAgICBkZDogJ3Npa3UgJWQnLFxuICAgICAgICAgICAgTTogJ213ZXppIG1tb2phJyxcbiAgICAgICAgICAgIE1NOiAnbWllemkgJWQnLFxuICAgICAgICAgICAgeTogJ213YWthIG1tb2phJyxcbiAgICAgICAgICAgIHl5OiAnbWlha2EgJWQnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3c7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGFtaWwgW3RhXVxuLy8hIGF1dGhvciA6IEFyanVua3VtYXIgS3Jpc2huYW1vb3J0aHkgOiBodHRwczovL2dpdGh1Yi5jb20vdGsxMjA0MDRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4K+nJyxcbiAgICAgICAgICAgIDI6ICfgr6gnLFxuICAgICAgICAgICAgMzogJ+CvqScsXG4gICAgICAgICAgICA0OiAn4K+qJyxcbiAgICAgICAgICAgIDU6ICfgr6snLFxuICAgICAgICAgICAgNjogJ+CvrCcsXG4gICAgICAgICAgICA3OiAn4K+tJyxcbiAgICAgICAgICAgIDg6ICfgr64nLFxuICAgICAgICAgICAgOTogJ+CvrycsXG4gICAgICAgICAgICAwOiAn4K+mJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Cvpyc6ICcxJyxcbiAgICAgICAgICAgICfgr6gnOiAnMicsXG4gICAgICAgICAgICAn4K+pJzogJzMnLFxuICAgICAgICAgICAgJ+Cvqic6ICc0JyxcbiAgICAgICAgICAgICfgr6snOiAnNScsXG4gICAgICAgICAgICAn4K+sJzogJzYnLFxuICAgICAgICAgICAgJ+CvrSc6ICc3JyxcbiAgICAgICAgICAgICfgr64nOiAnOCcsXG4gICAgICAgICAgICAn4K+vJzogJzknLFxuICAgICAgICAgICAgJ+Cvpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciB0YSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RhJywge1xuICAgICAgICBtb250aHM6ICfgrpzgrqngrrXgrrDgrr9f4K6q4K6/4K6q4K+N4K6w4K614K6w4K6/X+CuruCuvuCusOCvjeCumuCvjV/gro/grqrgr43grrDgrrLgr41f4K6u4K+HX+CunOCvguCuqeCvjV/grpzgr4LgrrLgr4hf4K6G4K6V4K644K+N4K6f4K+NX+CumuCvhuCuquCvjeCun+CvhuCuruCvjeCuquCusOCvjV/groXgrpXgr43grp/gr4fgrr7grqrgrrDgr41f4K6o4K614K6u4K+N4K6q4K6w4K+NX+Cun+Cuv+CumuCuruCvjeCuquCusOCvjScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4K6c4K6p4K614K6w4K6/X+CuquCuv+CuquCvjeCusOCuteCusOCuv1/grq7grr7grrDgr43grprgr41f4K6P4K6q4K+N4K6w4K6y4K+NX+CuruCvh1/grpzgr4Lgrqngr41f4K6c4K+C4K6y4K+IX+CuhuCuleCuuOCvjeCun+CvjV/grprgr4bgrqrgr43grp/gr4bgrq7gr43grqrgrrDgr41f4K6F4K6V4K+N4K6f4K+H4K6+4K6q4K6w4K+NX+CuqOCuteCuruCvjeCuquCusOCvjV/grp/grr/grprgrq7gr43grqrgrrDgr40nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn4K6e4K6+4K6v4K6/4K6x4K+N4K6x4K+B4K6V4K+N4K6V4K6/4K604K6u4K+IX+CupOCuv+CumeCvjeCuleCun+CvjeCuleCuv+CutOCuruCviF/grprgr4bgrrXgr43grrXgrr7grq/gr43grpXgrr/grrTgrq7gr4hf4K6q4K+B4K6k4K6p4K+N4K6V4K6/4K604K6u4K+IX+CuteCuv+Cur+CuvuCutOCuleCvjeCuleCuv+CutOCuruCviF/grrXgr4bgrrPgr43grrPgrr/grpXgr43grpXgrr/grrTgrq7gr4hf4K6a4K6p4K6/4K6V4K+N4K6V4K6/4K604K6u4K+IJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgrp7grr7grq/grr/grrHgr4Ff4K6k4K6/4K6Z4K+N4K6V4K6z4K+NX+CumuCvhuCuteCvjeCuteCuvuCur+CvjV/grqrgr4HgrqTgrqngr41f4K614K6/4K6v4K6+4K604K6p4K+NX+CuteCvhuCus+CvjeCus+Cuv1/grprgrqngrr8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4K6e4K6+X+CupOCuv1/grprgr4Zf4K6q4K+BX+CuteCuv1/grrXgr4Zf4K6aJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4K6H4K6p4K+N4K6x4K+BXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CuqOCuvuCus+CviF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CuqOCvh+CuseCvjeCuseCvgV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4K6V4K6f4K6o4K+N4K6kIOCuteCuvuCusOCuruCvjV0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgrofgrrLgr40nLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCuruCvgeCuqeCvjScsXG4gICAgICAgICAgICBzOiAn4K6S4K6w4K+BIOCumuCuv+CusiDgrrXgrr/grqjgrr7grp/grr/grpXgrrPgr40nLFxuICAgICAgICAgICAgc3M6ICclZCDgrrXgrr/grqjgrr7grp/grr/grpXgrrPgr40nLFxuICAgICAgICAgICAgbTogJ+CukuCusOCvgSDgrqjgrr/grq7grr/grp/grq7gr40nLFxuICAgICAgICAgICAgbW06ICclZCDgrqjgrr/grq7grr/grp/grpngr43grpXgrrPgr40nLFxuICAgICAgICAgICAgaDogJ+CukuCusOCvgSDgrq7grqPgrr8g4K6o4K+H4K6w4K6u4K+NJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4K6u4K6j4K6/IOCuqOCvh+CusOCuruCvjScsXG4gICAgICAgICAgICBkOiAn4K6S4K6w4K+BIOCuqOCuvuCus+CvjScsXG4gICAgICAgICAgICBkZDogJyVkIOCuqOCuvuCun+CvjeCuleCus+CvjScsXG4gICAgICAgICAgICBNOiAn4K6S4K6w4K+BIOCuruCuvuCupOCuruCvjScsXG4gICAgICAgICAgICBNTTogJyVkIOCuruCuvuCupOCumeCvjeCuleCus+CvjScsXG4gICAgICAgICAgICB5OiAn4K6S4K6w4K+BIOCuteCusOCvgeCun+CuruCvjScsXG4gICAgICAgICAgICB5eTogJyVkIOCuhuCuo+CvjeCun+CvgeCuleCus+CvjScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfeCuteCupOCvgS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn4K614K6k4K+BJztcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Cvp+CvqOCvqeCvquCvq+CvrOCvreCvruCvr+Cvpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gcmVmZXIgaHR0cDovL3RhLndpa2lwZWRpYS5vcmcvcy8xZXIxXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/grq/grr7grq7grq7gr4184K614K+I4K6V4K6x4K+IfOCuleCuvuCusuCviHzgrqjgrqPgr43grqrgrpXgrrLgr4184K6O4K6x4K+N4K6q4K6+4K6f4K+BfOCuruCuvuCusuCviC8sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrq/grr7grq7grq7gr40nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuteCviOCuleCuseCviCc7IC8vIOCuteCviOCuleCuseCviFxuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrpXgrr7grrLgr4gnOyAvLyDgrpXgrr7grrLgr4hcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6o4K6j4K+N4K6q4K6V4K6y4K+NJzsgLy8g4K6o4K6j4K+N4K6q4K6V4K6y4K+NXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCujuCuseCvjeCuquCuvuCun+CvgSc7IC8vIOCujuCuseCvjeCuquCuvuCun+CvgVxuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrq7grr7grrLgr4gnOyAvLyDgrq7grr7grrLgr4hcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6v4K6+4K6u4K6u4K+NJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4K6v4K6+4K6u4K6u4K+NJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgMiA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4K614K+I4K6V4K6x4K+IJyB8fCBtZXJpZGllbSA9PT0gJ+CuleCuvuCusuCviCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgrqjgrqPgr43grqrgrpXgrrLgr40nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGVsdWd1IFt0ZV1cbi8vISBhdXRob3IgOiBLcmlzaG5hIENoYWl0YW55YSBUaG90YSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rY3Rob3RhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdGUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0ZScsIHtcbiAgICAgICAgbW9udGhzOiAn4LCc4LCo4LC14LCw4LC/X+Cwq+Cwv+CwrOCxjeCwsOCwteCwsOCwv1/gsK7gsL7gsLDgsY3gsJrgsL9f4LCP4LCq4LGN4LCw4LC/4LCy4LGNX+CwruCxh1/gsJzgsYLgsKjgsY1f4LCc4LGB4LCy4LGIX+CwhuCwl+CwuOCxjeCwn+CxgV/gsLjgsYbgsKrgsY3gsJ/gsYbgsILgsKzgsLDgsY1f4LCF4LCV4LGN4LCf4LGL4LCs4LCw4LGNX+CwqOCwteCwguCwrOCwsOCxjV/gsKHgsL/gsLjgsYbgsILgsKzgsLDgsY0nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CwnOCwqC5f4LCr4LC/4LCs4LGN4LCwLl/gsK7gsL7gsLDgsY3gsJrgsL9f4LCP4LCq4LGN4LCw4LC/Ll/gsK7gsYdf4LCc4LGC4LCo4LGNX+CwnOCxgeCwsuCxiF/gsIbgsJcuX+CwuOCxhuCwquCxjS5f4LCF4LCV4LGN4LCf4LGLLl/gsKjgsLUuX+CwoeCwv+CwuOCxhi4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn4LCG4LCm4LC/4LC14LC+4LCw4LCCX+CwuOCxi+CwruCwteCwvuCwsOCwgl/gsK7gsILgsJfgsLPgsLXgsL7gsLDgsIJf4LCs4LGB4LCn4LC14LC+4LCw4LCCX+Cwl+CxgeCwsOCxgeCwteCwvuCwsOCwgl/gsLbgsYHgsJXgsY3gsLDgsLXgsL7gsLDgsIJf4LC24LCo4LC/4LC14LC+4LCw4LCCJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgsIbgsKbgsL9f4LC44LGL4LCuX+CwruCwguCwl+Cws1/gsKzgsYHgsKdf4LCX4LGB4LCw4LGBX+CwtuCxgeCwleCxjeCwsF/gsLbgsKjgsL8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4LCGX+CwuOCxi1/gsK7gsIJf4LCs4LGBX+Cwl+CxgV/gsLbgsYFf4LC2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CwqOCxh+CwoeCxgV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgsLDgsYfgsKrgsYFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgsKjgsL/gsKjgsY3gsKhdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+Cwl+CwpF0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgsLLgsYsnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCwleCxjeCwsOCwv+CwpOCwgicsXG4gICAgICAgICAgICBzOiAn4LCV4LGK4LCo4LGN4LCo4LC/IOCwleCxjeCwt+Cwo+CwvuCwsuCxgScsXG4gICAgICAgICAgICBzczogJyVkIOCwuOCxhuCwleCwqOCxjeCwsuCxgScsXG4gICAgICAgICAgICBtOiAn4LCS4LCVIOCwqOCwv+CwruCwv+Cwt+CwgicsXG4gICAgICAgICAgICBtbTogJyVkIOCwqOCwv+CwruCwv+Cwt+CwvuCwsuCxgScsXG4gICAgICAgICAgICBoOiAn4LCS4LCVIOCwl+CwguCwnycsXG4gICAgICAgICAgICBoaDogJyVkIOCwl+CwguCwn+CwsuCxgScsXG4gICAgICAgICAgICBkOiAn4LCS4LCVIOCwsOCxi+CwnOCxgScsXG4gICAgICAgICAgICBkZDogJyVkIOCwsOCxi+CwnOCxgeCwsuCxgScsXG4gICAgICAgICAgICBNOiAn4LCS4LCVIOCwqOCxhuCwsicsXG4gICAgICAgICAgICBNTTogJyVkIOCwqOCxhuCwsuCwsuCxgScsXG4gICAgICAgICAgICB5OiAn4LCS4LCVIOCwuOCwguCwteCwpOCxjeCwuOCwsOCwgicsXG4gICAgICAgICAgICB5eTogJyVkIOCwuOCwguCwteCwpOCxjeCwuOCwsOCwvuCwsuCxgScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfeCwtS8sXG4gICAgICAgIG9yZGluYWw6ICclZOCwtScsXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gsLDgsL7gsKTgsY3gsLDgsL984LCJ4LCm4LCv4LCCfOCwruCwp+CxjeCwr+CwvuCwueCxjeCwqOCwgnzgsLjgsL7gsK/gsILgsKTgsY3gsLDgsIIvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgsLDgsL7gsKTgsY3gsLDgsL8nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsIngsKbgsK/gsIInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LCu4LCn4LGN4LCv4LC+4LC54LGN4LCo4LCCJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsLjgsL7gsK/gsILgsKTgsY3gsLDgsIInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LCw4LC+4LCk4LGN4LCw4LC/JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsIngsKbgsK/gsIInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CwruCwp+CxjeCwr+CwvuCwueCxjeCwqOCwgic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LC44LC+4LCv4LCC4LCk4LGN4LCw4LCCJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsLDgsL7gsKTgsY3gsLDgsL8nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGV0dW4gRGlsaSAoRWFzdCBUaW1vcikgW3RldF1cbi8vISBhdXRob3IgOiBKb3NodWEgQnJvb2tzIDogaHR0cHM6Ly9naXRodWIuY29tL2pvc2hicm9va3Ncbi8vISBhdXRob3IgOiBPbm9yaW8gRGUgSi4gQWZvbnNvIDogaHR0cHM6Ly9naXRodWIuY29tL21hcm9ib1xuLy8hIGF1dGhvciA6IFNvbmlhIFNpbW9lcyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zb25pYXNpbW9lc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRldCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RldCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFuZWlydV9GZXZlcmVpcnVfTWFyc3VfQWJyaWxfTWFpdV9KdcOxdV9KdWxsdV9BZ3VzdHVfU2V0ZW1icnVfT3V0dWJydV9Ob3ZlbWJydV9EZXplbWJydScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmV2X01hcl9BYnJfTWFpX0p1bl9KdWxfQWdvX1NldF9PdXRfTm92X0Rleicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdEb21pbmd1X1NlZ3VuZGFfVGVyc2FfS3VhcnRhX0tpbnRhX1Nlc3RhX1NhYmFkdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0RvbV9TZWdfVGVyc19LdWFfS2ludF9TZXN0X1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdEb19TZWdfVGVfS3VfS2lfU2VzX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW09oaW4gaWhhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0FiYW4gaWhhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2loYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIb3Jpc2VpayBpaGFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbc2VtYW5hIGtvdHVrXSBbaWhhXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2loYSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgbGl1YmEnLFxuICAgICAgICAgICAgczogJ3NlZ3VuZHUgYmFsdW4nLFxuICAgICAgICAgICAgc3M6ICdzZWd1bmR1ICVkJyxcbiAgICAgICAgICAgIG06ICdtaW51dHUgaWRhJyxcbiAgICAgICAgICAgIG1tOiAnbWludXR1ICVkJyxcbiAgICAgICAgICAgIGg6ICdvcmFzIGlkYScsXG4gICAgICAgICAgICBoaDogJ29yYXMgJWQnLFxuICAgICAgICAgICAgZDogJ2xvcm9uIGlkYScsXG4gICAgICAgICAgICBkZDogJ2xvcm9uICVkJyxcbiAgICAgICAgICAgIE06ICdmdWxhbiBpZGEnLFxuICAgICAgICAgICAgTU06ICdmdWxhbiAlZCcsXG4gICAgICAgICAgICB5OiAndGluYW4gaWRhJyxcbiAgICAgICAgICAgIHl5OiAndGluYW4gJWQnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGV0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRhamlrIFt0Z11cbi8vISBhdXRob3IgOiBPcmlmIE4uIEpyLiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9vcmlmLWpyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDA6ICct0YPQvCcsXG4gICAgICAgIDE6ICct0YPQvCcsXG4gICAgICAgIDI6ICct0Y7QvCcsXG4gICAgICAgIDM6ICct0Y7QvCcsXG4gICAgICAgIDQ6ICct0YPQvCcsXG4gICAgICAgIDU6ICct0YPQvCcsXG4gICAgICAgIDY6ICct0YPQvCcsXG4gICAgICAgIDc6ICct0YPQvCcsXG4gICAgICAgIDg6ICct0YPQvCcsXG4gICAgICAgIDk6ICct0YPQvCcsXG4gICAgICAgIDEwOiAnLdGD0LwnLFxuICAgICAgICAxMjogJy3Rg9C8JyxcbiAgICAgICAgMTM6ICct0YPQvCcsXG4gICAgICAgIDIwOiAnLdGD0LwnLFxuICAgICAgICAzMDogJy3RjtC8JyxcbiAgICAgICAgNDA6ICct0YPQvCcsXG4gICAgICAgIDUwOiAnLdGD0LwnLFxuICAgICAgICA2MDogJy3Rg9C8JyxcbiAgICAgICAgNzA6ICct0YPQvCcsXG4gICAgICAgIDgwOiAnLdGD0LwnLFxuICAgICAgICA5MDogJy3Rg9C8JyxcbiAgICAgICAgMTAwOiAnLdGD0LwnLFxuICAgIH07XG5cbiAgICB2YXIgdGcgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0ZycsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfRj9C90LLQsNGA0Lhf0YTQtdCy0YDQsNC70Lhf0LzQsNGA0YLQuF/QsNC/0YDQtdC70Lhf0LzQsNC50Lhf0LjRjtC90Lhf0LjRjtC70Lhf0LDQstCz0YPRgdGC0Lhf0YHQtdC90YLRj9Cx0YDQuF/QvtC60YLRj9Cx0YDQuF/QvdC+0Y/QsdGA0Lhf0LTQtdC60LDQsdGA0LgnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9GP0L3QstCw0YBf0YTQtdCy0YDQsNC7X9C80LDRgNGCX9Cw0L/RgNC10Ltf0LzQsNC5X9C40Y7QvV/QuNGO0Ltf0LDQstCz0YPRgdGCX9GB0LXQvdGC0Y/QsdGAX9C+0LrRgtGP0LHRgF/QvdC+0Y/QsdGAX9C00LXQutCw0LHRgCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0Y/QvdCyX9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDQuV/QuNGO0L1f0LjRjtC7X9Cw0LLQs1/RgdC10L1f0L7QutGCX9C90L7Rj1/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn0Y/QutGI0LDQvdCx0LVf0LTRg9GI0LDQvdCx0LVf0YHQtdGI0LDQvdCx0LVf0YfQvtGA0YjQsNC90LHQtV/Qv9Cw0L3St9GI0LDQvdCx0LVf0rfRg9C80YrQsF/RiNCw0L3QsdC1Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0Y/RiNCxX9C00YjQsV/RgdGI0LFf0YfRiNCxX9C/0YjQsV/St9GD0Lxf0YjQvdCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9GP0Yhf0LTRiF/RgdGIX9GH0Yhf0L/RiF/St9C8X9GI0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0JjQvNGA06/QtyDRgdC+0LDRgtC4XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Ck0LDRgNC00L4g0YHQvtCw0YLQuF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQlNC40YDTr9C3INGB0L7QsNGC0LhdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZFvQuF0gW9Kz0LDRhNGC0LDQuCDQvtGP0L3QtNCwINGB0L7QsNGC0LhdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZFvQuF0gW9Kz0LDRhNGC0LDQuCDQs9GD0LfQsNGI0YLQsCDRgdC+0LDRgtC4XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9Cx0LDRitC00LggJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzINC/0LXRiCcsXG4gICAgICAgICAgICBzOiAn0Y/QutGH0LDQvdC0INGB0L7QvdC40Y8nLFxuICAgICAgICAgICAgbTogJ9GP0Log0LTQsNKb0LjSm9CwJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LTQsNKb0LjSm9CwJyxcbiAgICAgICAgICAgIGg6ICfRj9C6INGB0L7QsNGCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YHQvtCw0YInLFxuICAgICAgICAgICAgZDogJ9GP0Log0YDTr9C3JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0YDTr9C3JyxcbiAgICAgICAgICAgIE06ICfRj9C6INC80L7SsycsXG4gICAgICAgICAgICBNTTogJyVkINC80L7SsycsXG4gICAgICAgICAgICB5OiAn0Y/QuiDRgdC+0LsnLFxuICAgICAgICAgICAgeXk6ICclZCDRgdC+0LsnLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0YjQsNCxfNGB0YPQsdKzfNGA06/Qt3zQsdC10LPQvtKzLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn0YjQsNCxJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn0YHRg9Cx0rMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn0YDTr9C3Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfQsdC10LPQvtKzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GI0LDQsSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YHRg9Cx0rMnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GA06/Qtyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LHQtdCz0L7Ssyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YjQsNCxJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjRg9C8fNGO0LwpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBiID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW251bWJlcl0gfHwgc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxdGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGc7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGhhaSBbdGhdXG4vLyEgYXV0aG9yIDogS3JpZHNhZGEgVGhhbmFidWxwb25nIDogaHR0cHM6Ly9naXRodWIuY29tL3Npcm5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0aCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RoJywge1xuICAgICAgICBtb250aHM6ICfguKHguIHguKPguLLguITguKFf4LiB4Li44Lih4Lig4Liy4Lie4Lix4LiZ4LiY4LmMX+C4oeC4teC4meC4suC4hOC4oV/guYDguKHguKnguLLguKLguJlf4Lie4Lik4Lip4Lig4Liy4LiE4LihX+C4oeC4tOC4luC4uOC4meC4suC4ouC4mV/guIHguKPguIHguI7guLLguITguKFf4Liq4Li04LiH4Lir4Liy4LiE4LihX+C4geC4seC4meC4ouC4suC4ouC4mV/guJXguLjguKXguLLguITguKFf4Lie4Lik4Lio4LiI4Li04LiB4Liy4Lii4LiZX+C4mOC4seC4meC4p+C4suC4hOC4oScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4LihLuC4hC5f4LiBLuC4ni5f4Lih4Li1LuC4hC5f4LmA4LihLuC4oi5f4LieLuC4hC5f4Lih4Li0LuC4oi5f4LiBLuC4hC5f4LiqLuC4hC5f4LiBLuC4oi5f4LiVLuC4hC5f4LieLuC4oi5f4LiYLuC4hC4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfguK3guLLguJfguLTguJXguKLguYxf4LiI4Lix4LiZ4LiX4Lij4LmMX+C4reC4seC4h+C4hOC4suC4o1/guJ7guLjguJhf4Lie4Lik4Lir4Lix4Liq4Lia4LiU4Li1X+C4qOC4uOC4geC4o+C5jF/guYDguKrguLLguKPguYwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfguK3guLLguJfguLTguJXguKLguYxf4LiI4Lix4LiZ4LiX4Lij4LmMX+C4reC4seC4h+C4hOC4suC4o1/guJ7guLjguJhf4Lie4Lik4Lir4Lix4LiqX+C4qOC4uOC4geC4o+C5jF/guYDguKrguLLguKPguYwnLnNwbGl0KCdfJyksIC8vIHllcywgdGhyZWUgY2hhcmFjdGVycyBkaWZmZXJlbmNlXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4Lit4LiyLl/guIguX+C4rS5f4LieLl/guJ7guKQuX+C4qC5f4LiqLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDguYDguKfguKXguLIgSDptbScsXG4gICAgICAgICAgICBMTExMOiAn4Lin4Lix4LiZZGRkZOC4l+C4teC5iCBEIE1NTU0gWVlZWSDguYDguKfguKXguLIgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/guIHguYjguK3guJnguYDguJfguLXguYjguKLguId84Lir4Lil4Lix4LiH4LmA4LiX4Li14LmI4Lii4LiHLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LiB4LmI4Lit4LiZ4LmA4LiX4Li14LmI4Lii4LiHJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vguKfguLHguJnguJnguLXguYkg4LmA4Lin4Lil4LiyXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C4nuC4o+C4uOC5iOC4h+C4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZFvguKvguJnguYnguLIg4LmA4Lin4Lil4LiyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C5gOC4oeC4t+C5iOC4reC4p+C4suC4meC4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+C4p+C4seC4mV1kZGRkW+C4l+C4teC5iOC5geC4peC5ieC4pyDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn4Lit4Li14LiBICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+C4l+C4teC5iOC5geC4peC5ieC4pycsXG4gICAgICAgICAgICBzOiAn4LmE4Lih4LmI4LiB4Li14LmI4Lin4Li04LiZ4Liy4LiX4Li1JyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Lin4Li04LiZ4Liy4LiX4Li1JyxcbiAgICAgICAgICAgIG06ICcxIOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBtbTogJyVkIOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBoOiAnMSDguIrguLHguYjguKfguYLguKHguIcnLFxuICAgICAgICAgICAgaGg6ICclZCDguIrguLHguYjguKfguYLguKHguIcnLFxuICAgICAgICAgICAgZDogJzEg4Lin4Lix4LiZJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Lin4Lix4LiZJyxcbiAgICAgICAgICAgIHc6ICcxIOC4quC4seC4m+C4lOC4suC4q+C5jCcsXG4gICAgICAgICAgICB3dzogJyVkIOC4quC4seC4m+C4lOC4suC4q+C5jCcsXG4gICAgICAgICAgICBNOiAnMSDguYDguJTguLfguK3guJknLFxuICAgICAgICAgICAgTU06ICclZCDguYDguJTguLfguK3guJknLFxuICAgICAgICAgICAgeTogJzEg4Lib4Li1JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Lib4Li1JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUdXJrbWVuIFt0a11cbi8vISBhdXRob3IgOiBBdGFteXJhdCBBYmR5cmFobWFub3YgOiBodHRwczovL2dpdGh1Yi5jb20vYXRhbXlyYXRhYmR5XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDE6IFwiJ2luamlcIixcbiAgICAgICAgNTogXCInaW5qaVwiLFxuICAgICAgICA4OiBcIidpbmppXCIsXG4gICAgICAgIDcwOiBcIidpbmppXCIsXG4gICAgICAgIDgwOiBcIidpbmppXCIsXG4gICAgICAgIDI6IFwiJ25qaVwiLFxuICAgICAgICA3OiBcIiduamlcIixcbiAgICAgICAgMjA6IFwiJ25qaVwiLFxuICAgICAgICA1MDogXCInbmppXCIsXG4gICAgICAgIDM6IFwiJ8O8bmppXCIsXG4gICAgICAgIDQ6IFwiJ8O8bmppXCIsXG4gICAgICAgIDEwMDogXCInw7xuamlcIixcbiAgICAgICAgNjogXCInbmp5XCIsXG4gICAgICAgIDk6IFwiJ3VuanlcIixcbiAgICAgICAgMTA6IFwiJ3VuanlcIixcbiAgICAgICAgMzA6IFwiJ3VuanlcIixcbiAgICAgICAgNjA6IFwiJ3luanlcIixcbiAgICAgICAgOTA6IFwiJ3luanlcIixcbiAgICB9O1xuXG4gICAgdmFyIHRrID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGsnLCB7XG4gICAgICAgIG1vbnRoczogJ8OdYW53YXJfRmV3cmFsX01hcnRfQXByZWxfTWHDvV9Jw711bl9Jw711bF9Bd2d1c3RfU2VudMO9YWJyX09rdMO9YWJyX05vw71hYnJfRGVrYWJyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ8OdYW5fRmV3X01hcl9BcHJfTWHDvV9Jw71uX0nDvWxfQXdnX1Nlbl9Pa3RfTm/DvV9EZWsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnw51la8WfZW5iZV9EdcWfZW5iZV9TacWfZW5iZV/Dh2FyxZ9lbmJlX1BlbsWfZW5iZV9Bbm5hX8WeZW5iZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ8OdZWtfRHXFn19TacWfX8OHYXJfUGVuX0Fubl/FnmVuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ8Oda19ExZ9fU8WfX8OHcl9Qbl9Bbl/Fnm4nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbYnVnw7xuIHNhZ2F0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2VydGlyIHNhZ2F0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tpbmRpa2ldIGRkZGQgW3NhZ2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2TDvMO9bl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZ2XDp2VuXSBkZGRkIFtzYWdhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBzb8WIJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDDtsWIJyxcbiAgICAgICAgICAgIHM6ICdiaXJuw6TDp2Ugc2VrdW50JyxcbiAgICAgICAgICAgIG06ICdiaXIgbWludXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dCcsXG4gICAgICAgICAgICBoOiAnYmlyIHNhZ2F0JyxcbiAgICAgICAgICAgIGhoOiAnJWQgc2FnYXQnLFxuICAgICAgICAgICAgZDogJ2JpciBnw7xuJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZ8O8bicsXG4gICAgICAgICAgICBNOiAnYmlyIGHDvScsXG4gICAgICAgICAgICBNTTogJyVkIGHDvScsXG4gICAgICAgICAgICB5OiAnYmlyIMO9eWwnLFxuICAgICAgICAgICAgeXk6ICclZCDDvXlsJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RvJzpcbiAgICAgICAgICAgICAgICBjYXNlICdERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB6ZXJvXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgXCIndW5qeVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICBiID0gKG51bWJlciAlIDEwMCkgLSBhLFxuICAgICAgICAgICAgICAgICAgICAgICAgYyA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdIHx8IHN1ZmZpeGVzW2NdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRrO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRhZ2Fsb2cgKFBoaWxpcHBpbmVzKSBbdGwtcGhdXG4vLyEgYXV0aG9yIDogRGFuIEhhZ21hbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYWdtYW5kYW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0bFBoID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGwtcGgnLCB7XG4gICAgICAgIG1vbnRoczogJ0VuZXJvX1BlYnJlcm9fTWFyc29fQWJyaWxfTWF5b19IdW55b19IdWx5b19BZ29zdG9fU2V0eWVtYnJlX09rdHVicmVfTm9ieWVtYnJlX0Rpc3llbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdFbmVfUGViX01hcl9BYnJfTWF5X0h1bl9IdWxfQWdvX1NldF9Pa3RfTm9iX0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdMaW5nZ29fTHVuZXNfTWFydGVzX01peWVya3VsZXNfSHV3ZWJlc19CaXllcm5lc19TYWJhZG8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdMaW5fTHVuX01hcl9NaXlfSHV3X0JpeV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnTGlfTHVfTWFfTWlfSHVfQmlfU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnTU0vRC9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnTU1NTSBELCBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ01NTU0gRCwgWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBERCwgWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnTFQgW25nYXlvbmcgYXJhd10nLFxuICAgICAgICAgICAgbmV4dERheTogJ1tCdWthcyBuZ10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdMVCBbc2Egc3VzdW5vZCBuYV0gZGRkZCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnTFQgW2thaGFwb25dJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnTFQgW25vb25nIG5ha2FyYWFuZ10gZGRkZCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3NhIGxvb2IgbmcgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFuZyBuYWthbGlwYXMnLFxuICAgICAgICAgICAgczogJ2lsYW5nIHNlZ3VuZG8nLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvJyxcbiAgICAgICAgICAgIG06ICdpc2FuZyBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG8nLFxuICAgICAgICAgICAgaDogJ2lzYW5nIG9yYXMnLFxuICAgICAgICAgICAgaGg6ICclZCBvcmFzJyxcbiAgICAgICAgICAgIGQ6ICdpc2FuZyBhcmF3JyxcbiAgICAgICAgICAgIGRkOiAnJWQgYXJhdycsXG4gICAgICAgICAgICBNOiAnaXNhbmcgYnV3YW4nLFxuICAgICAgICAgICAgTU06ICclZCBidXdhbicsXG4gICAgICAgICAgICB5OiAnaXNhbmcgdGFvbicsXG4gICAgICAgICAgICB5eTogJyVkIHRhb24nLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGxQaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLbGluZ29uIFt0bGhdXG4vLyEgYXV0aG9yIDogRG9taW5pa2EgS3J1ayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbWFyYW50aHJvc2VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBudW1iZXJzTm91bnMgPSAncGFnaF93YeKAmV9jaGHigJlfd2VqX2xvU192YWdoX2phdl9Tb2NoX2Nob3JnaF9IdXQnLnNwbGl0KCdfJyk7XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVGdXR1cmUob3V0cHV0KSB7XG4gICAgICAgIHZhciB0aW1lID0gb3V0cHV0O1xuICAgICAgICB0aW1lID1cbiAgICAgICAgICAgIG91dHB1dC5pbmRleE9mKCdqYWonKSAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ2xlUydcbiAgICAgICAgICAgICAgICA6IG91dHB1dC5pbmRleE9mKCdqYXInKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnd2FRJ1xuICAgICAgICAgICAgICAgICAgOiBvdXRwdXQuaW5kZXhPZignRElTJykgIT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnbmVtJ1xuICAgICAgICAgICAgICAgICAgICA6IHRpbWUgKyAnIHBJcSc7XG4gICAgICAgIHJldHVybiB0aW1lO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVBhc3Qob3V0cHV0KSB7XG4gICAgICAgIHZhciB0aW1lID0gb3V0cHV0O1xuICAgICAgICB0aW1lID1cbiAgICAgICAgICAgIG91dHB1dC5pbmRleE9mKCdqYWonKSAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ0h14oCZJ1xuICAgICAgICAgICAgICAgIDogb3V0cHV0LmluZGV4T2YoJ2phcicpICE9PSAtMVxuICAgICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICd3ZW4nXG4gICAgICAgICAgICAgICAgICA6IG91dHB1dC5pbmRleE9mKCdESVMnKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICdiZW4nXG4gICAgICAgICAgICAgICAgICAgIDogdGltZSArICcgcmV0JztcbiAgICAgICAgcmV0dXJuIHRpbWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgbnVtYmVyTm91biA9IG51bWJlckFzTm91bihudW1iZXIpO1xuICAgICAgICBzd2l0Y2ggKHN0cmluZykge1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBsdXAnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyB0dXAnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyByZXAnO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBqYWonO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBqYXInO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBESVMnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbnVtYmVyQXNOb3VuKG51bWJlcikge1xuICAgICAgICB2YXIgaHVuZHJlZCA9IE1hdGguZmxvb3IoKG51bWJlciAlIDEwMDApIC8gMTAwKSxcbiAgICAgICAgICAgIHRlbiA9IE1hdGguZmxvb3IoKG51bWJlciAlIDEwMCkgLyAxMCksXG4gICAgICAgICAgICBvbmUgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgIHdvcmQgPSAnJztcbiAgICAgICAgaWYgKGh1bmRyZWQgPiAwKSB7XG4gICAgICAgICAgICB3b3JkICs9IG51bWJlcnNOb3Vuc1todW5kcmVkXSArICd2YXRsaCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlbiA+IDApIHtcbiAgICAgICAgICAgIHdvcmQgKz0gKHdvcmQgIT09ICcnID8gJyAnIDogJycpICsgbnVtYmVyc05vdW5zW3Rlbl0gKyAnbWFIJztcbiAgICAgICAgfVxuICAgICAgICBpZiAob25lID4gMCkge1xuICAgICAgICAgICAgd29yZCArPSAod29yZCAhPT0gJycgPyAnICcgOiAnJykgKyBudW1iZXJzTm91bnNbb25lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd29yZCA9PT0gJycgPyAncGFnaCcgOiB3b3JkO1xuICAgIH1cblxuICAgIHZhciB0bGggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0bGgnLCB7XG4gICAgICAgIG1vbnRoczogJ3RlcmHigJkgamFyIHdh4oCZX3RlcmHigJkgamFyIGNoYeKAmV90ZXJh4oCZIGphciB3ZWpfdGVyYeKAmSBqYXIgbG9TX3RlcmHigJkgamFyIHZhZ2hfdGVyYeKAmSBqYXIgamF2X3RlcmHigJkgamFyIFNvY2hfdGVyYeKAmSBqYXIgY2hvcmdoX3RlcmHigJkgamFyIEh1dF90ZXJh4oCZIGphciB3YeKAmW1hSF90ZXJh4oCZIGphciB3YeKAmW1hSCB3YeKAmV90ZXJh4oCZIGphciB3YeKAmW1hSCBjaGHigJknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phciB3YeKAmV9qYXIgY2hh4oCZX2phciB3ZWpfamFyIGxvU19qYXIgdmFnaF9qYXIgamF2X2phciBTb2NoX2phciBjaG9yZ2hfamFyIEh1dF9qYXIgd2HigJltYUhfamFyIHdh4oCZbWFIIHdh4oCZX2phciB3YeKAmW1hSCBjaGHigJknLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdsb2ptSXRqYWpfRGFTamFqX3Bvdmphal9naEl0bGhqYWpfbG9naGphal9idXFqYWpfZ2hJbmphaicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDpcbiAgICAgICAgICAgICdsb2ptSXRqYWpfRGFTamFqX3Bvdmphal9naEl0bGhqYWpfbG9naGphal9idXFqYWpfZ2hJbmphaicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46XG4gICAgICAgICAgICAnbG9qbUl0amFqX0RhU2phal9wb3ZqYWpfZ2hJdGxoamFqX2xvZ2hqYWpfYnVxamFqX2doSW5qYWonLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbRGFIamFqXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3dh4oCZbGVTXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ0xMTCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW3dh4oCZSHXigJldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnTExMJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiB0cmFuc2xhdGVGdXR1cmUsXG4gICAgICAgICAgICBwYXN0OiB0cmFuc2xhdGVQYXN0LFxuICAgICAgICAgICAgczogJ3B1UyBsdXAnLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06ICd3YeKAmSB0dXAnLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6ICd3YeKAmSByZXAnLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICd3YeKAmSBqYWonLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06ICd3YeKAmSBqYXInLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6ICd3YeKAmSBESVMnLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0bGg7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVHVya2lzaCBbdHJdXG4vLyEgYXV0aG9ycyA6IEVyaGFuIEd1bmRvZ2FuIDogaHR0cHM6Ly9naXRodWIuY29tL2VyaGFuZ3VuZG9nYW4sXG4vLyEgICAgICAgICAgIEJ1cmFrIFlpxJ9pdCBLYXlhOiBodHRwczovL2dpdGh1Yi5jb20vQllLXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDE6IFwiJ2luY2lcIixcbiAgICAgICAgNTogXCInaW5jaVwiLFxuICAgICAgICA4OiBcIidpbmNpXCIsXG4gICAgICAgIDcwOiBcIidpbmNpXCIsXG4gICAgICAgIDgwOiBcIidpbmNpXCIsXG4gICAgICAgIDI6IFwiJ25jaVwiLFxuICAgICAgICA3OiBcIiduY2lcIixcbiAgICAgICAgMjA6IFwiJ25jaVwiLFxuICAgICAgICA1MDogXCInbmNpXCIsXG4gICAgICAgIDM6IFwiJ8O8bmPDvFwiLFxuICAgICAgICA0OiBcIifDvG5jw7xcIixcbiAgICAgICAgMTAwOiBcIifDvG5jw7xcIixcbiAgICAgICAgNjogXCInbmPEsVwiLFxuICAgICAgICA5OiBcIid1bmN1XCIsXG4gICAgICAgIDEwOiBcIid1bmN1XCIsXG4gICAgICAgIDMwOiBcIid1bmN1XCIsXG4gICAgICAgIDYwOiBcIifEsW5jxLFcIixcbiAgICAgICAgOTA6IFwiJ8SxbmPEsVwiLFxuICAgIH07XG5cbiAgICB2YXIgdHIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0cicsIHtcbiAgICAgICAgbW9udGhzOiAnT2Nha1/FnnViYXRfTWFydF9OaXNhbl9NYXnEsXNfSGF6aXJhbl9UZW1tdXpfQcSfdXN0b3NfRXlsw7xsX0VraW1fS2FzxLFtX0FyYWzEsWsnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnT2NhX8WedWJfTWFyX05pc19NYXlfSGF6X1RlbV9BxJ91X0V5bF9Fa2lfS2FzX0FyYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdQYXphcl9QYXphcnRlc2lfU2FsxLFfw4dhcsWfYW1iYV9QZXLFn2VtYmVfQ3VtYV9DdW1hcnRlc2knLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdQYXpfUHp0X1NhbF/Dh2FyX1Blcl9DdW1fQ210Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1B6X1B0X1NhX8OHYV9QZV9DdV9DdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfDtsO2JyA6ICfDlsOWJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnw7ZzJyA6ICfDllMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvw7bDtnzDlsOWfMO2c3zDllMvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ8O2cycgfHwgaW5wdXQgPT09ICfDllMnO1xuICAgICAgICB9LFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2J1Z8O8biBzYWF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3lhcsSxbiBzYWF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tnZWxlY2VrXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2TDvG5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2dlw6dlbl0gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBzb25yYScsXG4gICAgICAgICAgICBwYXN0OiAnJXMgw7ZuY2UnLFxuICAgICAgICAgICAgczogJ2Jpcmthw6cgc2FuaXllJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2FuaXllJyxcbiAgICAgICAgICAgIG06ICdiaXIgZGFraWthJyxcbiAgICAgICAgICAgIG1tOiAnJWQgZGFraWthJyxcbiAgICAgICAgICAgIGg6ICdiaXIgc2FhdCcsXG4gICAgICAgICAgICBoaDogJyVkIHNhYXQnLFxuICAgICAgICAgICAgZDogJ2JpciBnw7xuJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZ8O8bicsXG4gICAgICAgICAgICB3OiAnYmlyIGhhZnRhJyxcbiAgICAgICAgICAgIHd3OiAnJWQgaGFmdGEnLFxuICAgICAgICAgICAgTTogJ2JpciBheScsXG4gICAgICAgICAgICBNTTogJyVkIGF5JyxcbiAgICAgICAgICAgIHk6ICdiaXIgecSxbCcsXG4gICAgICAgICAgICB5eTogJyVkIHnEsWwnLFxuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRG8nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0REJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHplcm9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBcIifEsW5jxLFcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChudW1iZXIgJSAxMDApIC0gYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBudW1iZXIgPj0gMTAwID8gMTAwIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChzdWZmaXhlc1thXSB8fCBzdWZmaXhlc1tiXSB8fCBzdWZmaXhlc1tjXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUYWxvc3NhbiBbdHpsXVxuLy8hIGF1dGhvciA6IFJvYmluIHZhbiBkZXIgVmxpZXQgOiBodHRwczovL2dpdGh1Yi5jb20vcm9iaW4wdmFuMGRlcjB2XG4vLyEgYXV0aG9yIDogSXVzdMOsIENhbnVuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICAvLyBBZnRlciB0aGUgeWVhciB0aGVyZSBzaG91bGQgYmUgYSBzbGFzaCBhbmQgdGhlIGFtb3VudCBvZiB5ZWFycyBzaW5jZSBEZWNlbWJlciAyNiwgMTk3OSBpbiBSb21hbiBudW1lcmFscy5cbiAgICAvLyBUaGlzIGlzIGN1cnJlbnRseSB0b28gZGlmZmljdWx0IChtYXliZSBldmVuIGltcG9zc2libGUpIHRvIGFkZC5cbiAgICB2YXIgdHpsID0gbW9tZW50LmRlZmluZUxvY2FsZSgndHpsJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJfRmV2cmFnbGhfTWFyw6dfQXZyw691X01haV9Hw7xuX0p1bGlhX0d1c2NodF9TZXRlbXZhcl9MaXN0b3DDpHRzX05vZW12YXJfWmVjZW12YXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0Zldl9NYXJfQXZyX01haV9Hw7xuX0p1bF9HdXNfU2V0X0xpc19Ob2VfWmVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1PDumxhZGlfTMO6bmXDp2lfTWFpdHppX03DoXJjdXJpX1how7phZGlfVmnDqW5lcsOnaV9Tw6F0dXJpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU8O6bF9Mw7puX01haV9Nw6FyX1how7pfVmnDqV9Tw6F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1PDul9Mw7pfTWFfTcOhX1hoX1ZpX1PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEgubW0nLFxuICAgICAgICAgICAgTFRTOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFtkYWxsYXNdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBbZGFsbGFzXSBZWVlZIEhILm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBbbGldIEQuIE1NTU0gW2RhbGxhc10gWVlZWSBISC5tbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9kXFwnb3xkXFwnYS9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBcImQnb1wiID09PSBpbnB1dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gXCJkJ29cIiA6IFwiRCdPXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gXCJkJ2FcIiA6IFwiRCdBXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW294aGkgw6BdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbZGVtw6Agw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaWVpcmkgw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3PDvHIgZWxdIGRkZGQgW2xhc3RldSDDoF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvc3ByZWkgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2phJXMnLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHM6IFsndmllbnNhcyBzZWN1bmRzJywgXCInaWVuc2FzIHNlY3VuZHNcIl0sXG4gICAgICAgICAgICBzczogW251bWJlciArICcgc2VjdW5kcycsICcnICsgbnVtYmVyICsgJyBzZWN1bmRzJ10sXG4gICAgICAgICAgICBtOiBbXCInbiBtw611dFwiLCBcIidpZW5zIG3DrXV0XCJdLFxuICAgICAgICAgICAgbW06IFtudW1iZXIgKyAnIG3DrXV0cycsICcnICsgbnVtYmVyICsgJyBtw611dHMnXSxcbiAgICAgICAgICAgIGg6IFtcIiduIMO+b3JhXCIsIFwiJ2llbnNhIMO+b3JhXCJdLFxuICAgICAgICAgICAgaGg6IFtudW1iZXIgKyAnIMO+b3JhcycsICcnICsgbnVtYmVyICsgJyDDvm9yYXMnXSxcbiAgICAgICAgICAgIGQ6IFtcIiduIHppdWFcIiwgXCInaWVuc2Egeml1YVwiXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyB6aXVhcycsICcnICsgbnVtYmVyICsgJyB6aXVhcyddLFxuICAgICAgICAgICAgTTogW1wiJ24gbWVzXCIsIFwiJ2llbnMgbWVzXCJdLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIG1lc2VuJywgJycgKyBudW1iZXIgKyAnIG1lc2VuJ10sXG4gICAgICAgICAgICB5OiBbXCInbiBhclwiLCBcIidpZW5zIGFyXCJdLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIGFycycsICcnICsgbnVtYmVyICsgJyBhcnMnXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGlzRnV0dXJlXG4gICAgICAgICAgICA/IGZvcm1hdFtrZXldWzBdXG4gICAgICAgICAgICA6IHdpdGhvdXRTdWZmaXhcbiAgICAgICAgICAgICAgPyBmb3JtYXRba2V5XVswXVxuICAgICAgICAgICAgICA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHJldHVybiB0emw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2VudHJhbCBBdGxhcyBUYW1hemlnaHQgTGF0aW4gW3R6bS1sYXRuXVxuLy8hIGF1dGhvciA6IEFiZGVsIFNhaWQgOiBodHRwczovL2dpdGh1Yi5jb20vYWJkZWxzYWlkXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdHptTGF0biA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3R6bS1sYXRuJywge1xuICAgICAgICBtb250aHM6ICdpbm5heXJfYnLLpGF5csukX21hcsukc8ukX2licmlyX21heXl3X3l3bnl3X3l3bHl3el/Jo3fFoXRfxaF3dGFuYmlyX2t0y6R3YnLLpF9ud3dhbmJpcl9kd2puYmlyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdpbm5heXJfYnLLpGF5csukX21hcsukc8ukX2licmlyX21heXl3X3l3bnl3X3l3bHl3el/Jo3fFoXRfxaF3dGFuYmlyX2t0y6R3YnLLpF9ud3dhbmJpcl9kd2puYmlyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAnYXNhbWFzX2F5bmFzX2FzaW5hc19ha3Jhc19ha3dhc19hc2ltd2FzX2FzaeG4jXlhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2FzYW1hc19heW5hc19hc2luYXNfYWtyYXNfYWt3YXNfYXNpbXdhc19hc2nhuI15YXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnYXNhbWFzX2F5bmFzX2FzaW5hc19ha3Jhc19ha3dhc19hc2ltd2FzX2FzaeG4jXlhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2FzZGtoIGddIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbYXNrYSBnXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2ddIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbYXNzYW50IGddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZ10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkYWRraCBzIHlhbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAneWFuICVzJyxcbiAgICAgICAgICAgIHM6ICdpbWlrJyxcbiAgICAgICAgICAgIHNzOiAnJWQgaW1paycsXG4gICAgICAgICAgICBtOiAnbWludeG4jScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnXhuI0nLFxuICAgICAgICAgICAgaDogJ3NhyZthJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGFzc2HJm2luJyxcbiAgICAgICAgICAgIGQ6ICdhc3MnLFxuICAgICAgICAgICAgZGQ6ICclZCBvc3NhbicsXG4gICAgICAgICAgICBNOiAnYXlvd3InLFxuICAgICAgICAgICAgTU06ICclZCBpeXlpcm4nLFxuICAgICAgICAgICAgeTogJ2FzZ2FzJyxcbiAgICAgICAgICAgIHl5OiAnJWQgaXNnYXNuJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0em1MYXRuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENlbnRyYWwgQXRsYXMgVGFtYXppZ2h0IFt0em1dXG4vLyEgYXV0aG9yIDogQWJkZWwgU2FpZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0em0gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0em0nLCB7XG4gICAgICAgIG1vbnRoczogJ+K1ieK1j+K1j+K0sOK1ouK1lF/itLHitZXitLDitaLitZVf4rWO4rSw4rWV4rWaX+K1ieK0seK1lOK1ieK1lF/itY7itLDitaLitaLitZNf4rWi4rWT4rWP4rWi4rWTX+K1ouK1k+K1jeK1ouK1k+K1o1/itZbitZPitZvitZxf4rWb4rWT4rWc4rSw4rWP4rSx4rWJ4rWUX+K0veK1n+K1k+K0seK1lV/itY/itZPitaHitLDitY/itLHitYnitZRf4rS34rWT4rWK4rWP4rSx4rWJ4rWUJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfitYnitY/itY/itLDitaLitZRf4rSx4rWV4rSw4rWi4rWVX+K1juK0sOK1leK1ml/itYnitLHitZTitYnitZRf4rWO4rSw4rWi4rWi4rWTX+K1ouK1k+K1j+K1ouK1k1/itaLitZPitY3itaLitZPitaNf4rWW4rWT4rWb4rWcX+K1m+K1k+K1nOK0sOK1j+K0seK1ieK1lF/itL3itZ/itZPitLHitZVf4rWP4rWT4rWh4rSw4rWP4rSx4rWJ4rWUX+K0t+K1k+K1iuK1j+K0seK1ieK1lCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+K0sOK1meK0sOK1juK0sOK1mV/itLDitaLitY/itLDitZlf4rSw4rWZ4rWJ4rWP4rSw4rWZX+K0sOK0veK1lOK0sOK1mV/itLDitL3itaHitLDitZlf4rSw4rWZ4rWJ4rWO4rWh4rSw4rWZX+K0sOK1meK1ieK0ueK1ouK0sOK1mScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+K0sOK1meK0sOK1juK0sOK1mV/itLDitaLitY/itLDitZlf4rSw4rWZ4rWJ4rWP4rSw4rWZX+K0sOK0veK1lOK0sOK1mV/itLDitL3itaHitLDitZlf4rSw4rWZ4rWJ4rWO4rWh4rSw4rWZX+K0sOK1meK1ieK0ueK1ouK0sOK1mScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfitLDitZnitLDitY7itLDitZlf4rSw4rWi4rWP4rSw4rWZX+K0sOK1meK1ieK1j+K0sOK1mV/itLDitL3itZTitLDitZlf4rSw4rS94rWh4rSw4rWZX+K0sOK1meK1ieK1juK1oeK0sOK1mV/itLDitZnitYnitLnitaLitLDitZknLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vitLDitZnitLfitYUg4rS0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+K0sOK1meK0veK0sCDitLRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb4rS0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+K0sOK1muK0sOK1j+K1nCDitLRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb4rS0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ+K0t+K0sOK0t+K1hSDitZkg4rWi4rSw4rWPICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfitaLitLDitY8gJXMnLFxuICAgICAgICAgICAgczogJ+K1ieK1juK1ieK0vScsXG4gICAgICAgICAgICBzczogJyVkIOK1ieK1juK1ieK0vScsXG4gICAgICAgICAgICBtOiAn4rWO4rWJ4rWP4rWT4rS6JyxcbiAgICAgICAgICAgIG1tOiAnJWQg4rWO4rWJ4rWP4rWT4rS6JyxcbiAgICAgICAgICAgIGg6ICfitZnitLDitYTitLAnLFxuICAgICAgICAgICAgaGg6ICclZCDitZzitLDitZnitZnitLDitYTitYnitY8nLFxuICAgICAgICAgICAgZDogJ+K0sOK1meK1mScsXG4gICAgICAgICAgICBkZDogJyVkIG/itZnitZnitLDitY8nLFxuICAgICAgICAgICAgTTogJ+K0sOK1om/itZPitZQnLFxuICAgICAgICAgICAgTU06ICclZCDitYnitaLitaLitYnitZTitY8nLFxuICAgICAgICAgICAgeTogJ+K0sOK1meK0s+K0sOK1mScsXG4gICAgICAgICAgICB5eTogJyVkIOK1ieK1meK0s+K0sOK1meK1jycsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHptO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFV5Z2h1ciAoQ2hpbmEpIFt1Zy1jbl1cbi8vISBhdXRob3I6IGJveWFxIDogaHR0cHM6Ly9naXRodWIuY29tL2JveWFxXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdWdDbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3VnLWNuJywge1xuICAgICAgICBtb250aHM6ICfZitin2Ybbi9in2LFf2YHbkNuL2LHYp9mEX9mF2KfYsdiqX9im2KfZvtix25DZhF/Zhdin2Ypf2KbZidmK24fZhl/YptmJ2Yrbh9mEX9im2Kfbi9i624fYs9iqX9iz25DZhtiq25XYqNmJ2LFf2KbbhtmD2Krbldio2YnYsV/ZhtmI2YrYp9io2YnYsV/Yr9uQ2YPYp9io2YnYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2YrYp9mG24vYp9ixX9mB25Dbi9ix2KfZhF/Zhdin2LHYql/Yptin2b7YsduQ2YRf2YXYp9mKX9im2YnZituH2YZf2KbZidmK24fZhF/Yptin24vYutuH2LPYql/Ys9uQ2YbYqtuV2KjZidixX9im24bZg9iq25XYqNmJ2LFf2YbZiNmK2KfYqNmJ2LFf2K/bkNmD2KfYqNmJ2LEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfZituV2YPYtNuV2YbYqNuVX9iv24jYtNuV2YbYqNuVX9iz25XZiti025XZhtio25Vf2obYp9ix2LTbldmG2KjblV/ZvtuV2YrYtNuV2YbYqNuVX9is24jZhduVX9i025XZhtio25UnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfZituVX9iv24hf2LPblV/ahtinX9m+25Vf2KzbiF/YtNuVJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9mK25Vf2K/biF/Ys9uVX9qG2Kdf2b7blV/YrNuIX9i025UnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnWVlZWS3ZitmJ2YTZiU0t2KbYp9mK2YbZidqtRC3Zg9uI2YbZiScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZLdmK2YnZhNmJTS3Yptin2YrZhtmJ2q1ELdmD24jZhtmJ2IwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGTYjCBZWVlZLdmK2YnZhNmJTS3Yptin2YrZhtmJ2q1ELdmD24jZhtmJ2IwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2YrbkNix2YnZhSDZg9uQ2obblXzYs9uV2r7bldixfNqG24jYtNiq2YnZhiDYqNuH2LHbh9mGfNqG24jYtHzahtuI2LTYqtmJ2YYg2YPbkNmK2YnZhnzZg9uV2oYvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfZituQ2LHZidmFINmD25DahtuVJyB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn2LPbldq+25XYsScgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ9qG24jYtNiq2YnZhiDYqNuH2LHbh9mGJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn2obbiNi02KrZidmGINmD25DZitmJ2YYnIHx8IG1lcmlkaWVtID09PSAn2YPbldqGJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mK25DYsdmJ2YUg2YPbkNqG25UnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LPbldq+25XYsSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTEzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2obbiNi02KrZidmGINio24fYsduH2YYnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9qG24jYtCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2obbiNi02KrZidmGINmD25DZitmJ2YYnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mD25Xahic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9io24jar9uI2YYg2LPYp9im25XYql0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYptuV2KrblSDYs9in2KbbldiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vZg9uQ2YTbldix2YPZiV0gZGRkZCBb2LPYp9im25XYql0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYqtuG2YbbiNqv24jZhl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb2KbYp9mE2K/ZidmG2YLZiV0gZGRkZCBb2LPYp9im25XYql0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDZg9uQ2YrZidmGJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDYqNuH2LHbh9mGJyxcbiAgICAgICAgICAgIHM6ICfZhtuV2obahtuVINiz25DZg9mI2YbYqicsXG4gICAgICAgICAgICBzczogJyVkINiz25DZg9mI2YbYqicsXG4gICAgICAgICAgICBtOiAn2KjZidixINmF2YnZhtuH2KonLFxuICAgICAgICAgICAgbW06ICclZCDZhdmJ2Ybbh9iqJyxcbiAgICAgICAgICAgIGg6ICfYqNmJ2LEg2LPYp9im25XYqicsXG4gICAgICAgICAgICBoaDogJyVkINiz2KfYptuV2KonLFxuICAgICAgICAgICAgZDogJ9io2YnYsSDZg9uI2YYnLFxuICAgICAgICAgICAgZGQ6ICclZCDZg9uI2YYnLFxuICAgICAgICAgICAgTTogJ9io2YnYsSDYptin2YonLFxuICAgICAgICAgICAgTU06ICclZCDYptin2YonLFxuICAgICAgICAgICAgeTogJ9io2YnYsSDZitmJ2YQnLFxuICAgICAgICAgICAgeXk6ICclZCDZitmJ2YQnLFxuICAgICAgICB9LFxuXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSgt2YPbiNmG2Yl8Ldim2KfZinwt2r7bldm+2KrblSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct2YPbiNmG2YknO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3avtuV2b7YqtuVJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIC8vIEdCL1QgNzQwOC0xOTk044CK5pWw5o2u5YWD5ZKM5Lqk5o2i5qC85byPwrfkv6Hmga/kuqTmjaLCt+aXpeacn+WSjOaXtumXtOihqOekuuazleOAi+S4jklTTyA4NjAxOjE5ODjnrYnmlYhcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB1Z0NuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFVrcmFpbmlhbiBbdWtdXG4vLyEgYXV0aG9yIDogemVtbGFuaW4gOiBodHRwczovL2dpdGh1Yi5jb20vemVtbGFuaW5cbi8vISBBdXRob3IgOiBNZW5lbGlvbiBFbGVuc8O6bGUgOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcGx1cmFsKHdvcmQsIG51bSkge1xuICAgICAgICB2YXIgZm9ybXMgPSB3b3JkLnNwbGl0KCdfJyk7XG4gICAgICAgIHJldHVybiBudW0gJSAxMCA9PT0gMSAmJiBudW0gJSAxMDAgIT09IDExXG4gICAgICAgICAgICA/IGZvcm1zWzBdXG4gICAgICAgICAgICA6IG51bSAlIDEwID49IDIgJiYgbnVtICUgMTAgPD0gNCAmJiAobnVtICUgMTAwIDwgMTAgfHwgbnVtICUgMTAwID49IDIwKVxuICAgICAgICAgICAgICA/IGZvcm1zWzFdXG4gICAgICAgICAgICAgIDogZm9ybXNbMl07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHNzOiB3aXRob3V0U3VmZml4ID8gJ9GB0LXQutGD0L3QtNCwX9GB0LXQutGD0L3QtNC4X9GB0LXQutGD0L3QtCcgOiAn0YHQtdC60YPQvdC00YNf0YHQtdC60YPQvdC00Lhf0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG1tOiB3aXRob3V0U3VmZml4ID8gJ9GF0LLQuNC70LjQvdCwX9GF0LLQuNC70LjQvdC4X9GF0LLQuNC70LjQvScgOiAn0YXQstC40LvQuNC90YNf0YXQstC40LvQuNC90Lhf0YXQstC40LvQuNC9JyxcbiAgICAgICAgICAgIGhoOiB3aXRob3V0U3VmZml4ID8gJ9Cz0L7QtNC40L3QsF/Qs9C+0LTQuNC90Lhf0LPQvtC00LjQvScgOiAn0LPQvtC00LjQvdGDX9Cz0L7QtNC40L3QuF/Qs9C+0LTQuNC9JyxcbiAgICAgICAgICAgIGRkOiAn0LTQtdC90Yxf0LTQvdGWX9C00L3RltCyJyxcbiAgICAgICAgICAgIE1NOiAn0LzRltGB0Y/RhtGMX9C80ZbRgdGP0YbRll/QvNGW0YHRj9GG0ZbQsicsXG4gICAgICAgICAgICB5eTogJ9GA0ZbQul/RgNC+0LrQuF/RgNC+0LrRltCyJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ20nKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfRhdCy0LjQu9C40L3QsCcgOiAn0YXQstC40LvQuNC90YMnO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2gnKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfQs9C+0LTQuNC90LAnIDogJ9Cz0L7QtNC40L3Rgyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgcGx1cmFsKGZvcm1hdFtrZXldLCArbnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c0Nhc2VSZXBsYWNlKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgd2Vla2RheXMgPSB7XG4gICAgICAgICAgICAgICAgbm9taW5hdGl2ZTpcbiAgICAgICAgICAgICAgICAgICAgJ9C90LXQtNGW0LvRj1/Qv9C+0L3QtdC00ZbQu9C+0Lpf0LLRltCy0YLQvtGA0L7Qul/RgdC10YDQtdC00LBf0YfQtdGC0LLQtdGAX9C/4oCZ0Y/RgtC90LjRhtGPX9GB0YPQsdC+0YLQsCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBhY2N1c2F0aXZlOlxuICAgICAgICAgICAgICAgICAgICAn0L3QtdC00ZbQu9GOX9C/0L7QvdC10LTRltC70L7Qul/QstGW0LLRgtC+0YDQvtC6X9GB0LXRgNC10LTRg1/Rh9C10YLQstC10YBf0L/igJnRj9GC0L3QuNGG0Y5f0YHRg9Cx0L7RgtGDJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGdlbml0aXZlOlxuICAgICAgICAgICAgICAgICAgICAn0L3QtdC00ZbQu9GWX9C/0L7QvdC10LTRltC70LrQsF/QstGW0LLRgtC+0YDQutCwX9GB0LXRgNC10LTQuF/Rh9C10YLQstC10YDQs9CwX9C/4oCZ0Y/RgtC90LjRhtGWX9GB0YPQsdC+0YLQuCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBub3VuQ2FzZTtcblxuICAgICAgICBpZiAobSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXlzWydub21pbmF0aXZlJ11cbiAgICAgICAgICAgICAgICAuc2xpY2UoMSwgNylcbiAgICAgICAgICAgICAgICAuY29uY2F0KHdlZWtkYXlzWydub21pbmF0aXZlJ10uc2xpY2UoMCwgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXlzWydub21pbmF0aXZlJ107XG4gICAgICAgIH1cblxuICAgICAgICBub3VuQ2FzZSA9IC8oXFxbW9CS0LLQo9GDXVxcXSkgP2RkZGQvLnRlc3QoZm9ybWF0KVxuICAgICAgICAgICAgPyAnYWNjdXNhdGl2ZSdcbiAgICAgICAgICAgIDogL1xcWz8oPzrQvNC40L3Rg9C70L7Rl3zQvdCw0YHRgtGD0L/QvdC+0ZcpPyA/XFxdID9kZGRkLy50ZXN0KGZvcm1hdClcbiAgICAgICAgICAgICAgPyAnZ2VuaXRpdmUnXG4gICAgICAgICAgICAgIDogJ25vbWluYXRpdmUnO1xuICAgICAgICByZXR1cm4gd2Vla2RheXNbbm91bkNhc2VdW20uZGF5KCldO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzSG91cnNGdW5jdGlvbihzdHIpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIgKyAn0L4nICsgKHRoaXMuaG91cnMoKSA9PT0gMTEgPyAn0LEnIDogJycpICsgJ10gTFQnO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciB1ayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3VrJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9GB0ZbRh9C90Y9f0LvRjtGC0L7Qs9C+X9Cx0LXRgNC10LfQvdGPX9C60LLRltGC0L3Rj1/RgtGA0LDQstC90Y9f0YfQtdGA0LLQvdGPX9C70LjQv9C90Y9f0YHQtdGA0L/QvdGPX9Cy0LXRgNC10YHQvdGPX9C20L7QstGC0L3Rj1/Qu9C40YHRgtC+0L/QsNC00LBf0LPRgNGD0LTQvdGPJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfRgdGW0YfQtdC90Yxf0LvRjtGC0LjQuV/QsdC10YDQtdC30LXQvdGMX9C60LLRltGC0LXQvdGMX9GC0YDQsNCy0LXQvdGMX9GH0LXRgNCy0LXQvdGMX9C70LjQv9C10L3RjF/RgdC10YDQv9C10L3RjF/QstC10YDQtdGB0LXQvdGMX9C20L7QstGC0LXQvdGMX9C70LjRgdGC0L7Qv9Cw0LRf0LPRgNGD0LTQtdC90YwnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDogJ9GB0ZbRh1/Qu9GO0YJf0LHQtdGAX9C60LLRltGCX9GC0YDQsNCyX9GH0LXRgNCyX9C70LjQv1/RgdC10YDQv1/QstC10YBf0LbQvtCy0YJf0LvQuNGB0YJf0LPRgNGD0LQnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiB3ZWVrZGF5c0Nhc2VSZXBsYWNlLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0L3QtF/Qv9C9X9Cy0YJf0YHRgF/Rh9GCX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvdC0X9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZINGALicsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDRgC4sIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSDRgC4sIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0KHRjNC+0LPQvtC00L3RliAnKSxcbiAgICAgICAgICAgIG5leHREYXk6IHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0JfQsNCy0YLRgNCwICcpLFxuICAgICAgICAgICAgbGFzdERheTogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQktGH0L7RgNCwICcpLFxuICAgICAgICAgICAgbmV4dFdlZWs6IHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0KNdIGRkZGQgWycpLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0JzQuNC90YPQu9C+0ZddIGRkZGQgWycpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQnNC40L3Rg9C70L7Qs9C+XSBkZGRkIFsnKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9C30LAgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzINGC0L7QvNGDJyxcbiAgICAgICAgICAgIHM6ICfQtNC10LrRltC70YzQutCwINGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBzczogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGg6ICfQs9C+0LTQuNC90YMnLFxuICAgICAgICAgICAgaGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkOiAn0LTQtdC90YwnLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNOiAn0LzRltGB0Y/RhtGMJyxcbiAgICAgICAgICAgIE1NOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeTogJ9GA0ZbQuicsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gTS4gRS46IHRob3NlIHR3byBhcmUgdmlydHVhbGx5IHVudXNlZCBidXQgYSB1c2VyIG1pZ2h0IHdhbnQgdG8gaW1wbGVtZW50IHRoZW0gZm9yIGhpcy9oZXIgd2Vic2l0ZSBmb3Igc29tZSByZWFzb25cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9C90L7Rh9GWfNGA0LDQvdC60YN80LTQvdGPfNCy0LXRh9C+0YDQsC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNC00L3Rj3zQstC10YfQvtGA0LApJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C90L7Rh9GWJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRgNCw0L3QutGDJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQtNC90Y8nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Cy0LXRh9C+0YDQsCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0Ll80LPQvikvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LknO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Qs9C+JztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdWs7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVXJkdSBbdXJdXG4vLyEgYXV0aG9yIDogU2F3b29kIEFsYW0gOiBodHRwczovL2dpdGh1Yi5jb20vaWJuZXNheWVlZFxuLy8hIGF1dGhvciA6IFphY2sgOiBodHRwczovL2dpdGh1Yi5jb20vWmFja1Zpc2lvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9IFtcbiAgICAgICAgICAgICfYrNmG2YjYsduMJyxcbiAgICAgICAgICAgICfZgdix2YjYsduMJyxcbiAgICAgICAgICAgICfZhdin2LHahicsXG4gICAgICAgICAgICAn2KfZvtix24zZhCcsXG4gICAgICAgICAgICAn2YXYptuMJyxcbiAgICAgICAgICAgICfYrNmI2YYnLFxuICAgICAgICAgICAgJ9is2YjZhNin2KbbjCcsXG4gICAgICAgICAgICAn2Kfar9iz2KonLFxuICAgICAgICAgICAgJ9iz2KrZhdio2LEnLFxuICAgICAgICAgICAgJ9in2qnYqtmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmF2KjYsScsXG4gICAgICAgICAgICAn2K/Ys9mF2KjYsScsXG4gICAgICAgIF0sXG4gICAgICAgIGRheXMgPSBbJ9in2KrZiNin2LEnLCAn2b7bjNixJywgJ9mF2Ybar9mEJywgJ9io2K/avicsICfYrNmF2LnYsdin2KonLCAn2KzZhdi524EnLCAn24HZgdiq24EnXTtcblxuICAgIHZhciB1ciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3VyJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6IGRheXMsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IGRheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiBkYXlzLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRk2IwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LXYqNitfNi02KfZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfYtNin2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i12KjYrSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ9i02KfZhSc7XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9ii2Kwg2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2qnZhCDYqNmI2YLYql0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYqNmI2YLYql0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1var9iw2LTYqtuBINix2YjYsiDYqNmI2YLYql0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb2q/YsNi02KrbgV0gZGRkZCBb2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg2KjYudivJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDZgtio2YQnLFxuICAgICAgICAgICAgczogJ9qG2YbYryDYs9uM2qnZhtqIJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2LPbjNqp2YbaiCcsXG4gICAgICAgICAgICBtOiAn2KfbjNqpINmF2YbZuScsXG4gICAgICAgICAgICBtbTogJyVkINmF2YbZuScsXG4gICAgICAgICAgICBoOiAn2KfbjNqpINqv2r7Zhtm524EnLFxuICAgICAgICAgICAgaGg6ICclZCDar9q+2YbZuduSJyxcbiAgICAgICAgICAgIGQ6ICfYp9uM2qkg2K/ZhicsXG4gICAgICAgICAgICBkZDogJyVkINiv2YYnLFxuICAgICAgICAgICAgTTogJ9in24zaqSDZhdin24EnLFxuICAgICAgICAgICAgTU06ICclZCDZhdin24EnLFxuICAgICAgICAgICAgeTogJ9in24zaqSDYs9in2YQnLFxuICAgICAgICAgICAgeXk6ICclZCDYs9in2YQnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB1cjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBVemJlayBMYXRpbiBbdXotbGF0bl1cbi8vISBhdXRob3IgOiBSYXN1bGJlayBNaXJ6YXlldiA6IGdpdGh1Yi5jb20vUmFzdWxiZWVla1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHV6TGF0biA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3V6LWxhdG4nLCB7XG4gICAgICAgIG1vbnRoczogJ1lhbnZhcl9GZXZyYWxfTWFydF9BcHJlbF9NYXlfSXl1bl9JeXVsX0F2Z3VzdF9TZW50YWJyX09rdGFicl9Ob3lhYnJfRGVrYWJyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ1lhbl9GZXZfTWFyX0Fwcl9NYXlfSXl1bl9JeXVsX0F2Z19TZW5fT2t0X05veV9EZWsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1lha3NoYW5iYV9EdXNoYW5iYV9TZXNoYW5iYV9DaG9yc2hhbmJhX1BheXNoYW5iYV9KdW1hX1NoYW5iYScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnWWFrX0R1c2hfU2VzaF9DaG9yX1BheV9KdW1fU2hhbicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdZYV9EdV9TZV9DaG9fUGFfSnVfU2hhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdEIE1NTU0gWVlZWSwgZGRkZCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0J1Z3VuIHNvYXRdIExUIFtkYV0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1tFcnRhZ2FdIExUIFtkYV0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrdW5pIHNvYXRdIExUIFtkYV0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tLZWNoYSBzb2F0XSBMVCBbZGFdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBcIltPJ3RnYW5dIGRkZGQgW2t1bmkgc29hdF0gTFQgW2RhXVwiLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdZYXFpbiAlcyBpY2hpZGEnLFxuICAgICAgICAgICAgcGFzdDogJ0JpciBuZWNoYSAlcyBvbGRpbicsXG4gICAgICAgICAgICBzOiAnc29uaXlhJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc29uaXlhJyxcbiAgICAgICAgICAgIG06ICdiaXIgZGFxaXFhJyxcbiAgICAgICAgICAgIG1tOiAnJWQgZGFxaXFhJyxcbiAgICAgICAgICAgIGg6ICdiaXIgc29hdCcsXG4gICAgICAgICAgICBoaDogJyVkIHNvYXQnLFxuICAgICAgICAgICAgZDogJ2JpciBrdW4nLFxuICAgICAgICAgICAgZGQ6ICclZCBrdW4nLFxuICAgICAgICAgICAgTTogJ2JpciBveScsXG4gICAgICAgICAgICBNTTogJyVkIG95JyxcbiAgICAgICAgICAgIHk6ICdiaXIgeWlsJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWlsJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHV6TGF0bjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBVemJlayBbdXpdXG4vLyEgYXV0aG9yIDogU2FyZG9yIE11bWlub3YgOiBodHRwczovL2dpdGh1Yi5jb20vbXVtaW5vZmZcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB1eiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3V6Jywge1xuICAgICAgICBtb250aHM6ICfRj9C90LLQsNGAX9GE0LXQstGA0LDQu1/QvNCw0YDRgl/QsNC/0YDQtdC7X9C80LDQuV/QuNGO0L1f0LjRjtC7X9Cw0LLQs9GD0YHRgl/RgdC10L3RgtGP0LHRgF/QvtC60YLRj9Cx0YBf0L3QvtGP0LHRgF/QtNC10LrQsNCx0YAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0Y/QvdCyX9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDQuV/QuNGO0L1f0LjRjtC7X9Cw0LLQs1/RgdC10L1f0L7QutGCX9C90L7Rj1/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn0K/QutGI0LDQvdCx0LBf0JTRg9GI0LDQvdCx0LBf0KHQtdGI0LDQvdCx0LBf0KfQvtGA0YjQsNC90LHQsF/Qn9Cw0LnRiNCw0L3QsdCwX9CW0YPQvNCwX9Co0LDQvdCx0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQr9C60Yhf0JTRg9GIX9Ch0LXRiF/Qp9C+0YBf0J/QsNC5X9CW0YPQvF/QqNCw0L0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0K/Qul/QlNGDX9Ch0LVf0KfQvl/Qn9CwX9CW0YNf0KjQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnRCBNTU1NIFlZWVksIGRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQkdGD0LPRg9C9INGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQrdGA0YLQsNCz0LBdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9C60YPQvdC4INGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQmtC10YfQsCDRgdC+0LDRgl0gTFQgW9C00LBdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9Cj0YLQs9Cw0L1dIGRkZGQgW9C60YPQvdC4INGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQr9C60LjQvSAlcyDQuNGH0LjQtNCwJyxcbiAgICAgICAgICAgIHBhc3Q6ICfQkdC40YAg0L3QtdGH0LAgJXMg0L7Qu9C00LjQvScsXG4gICAgICAgICAgICBzOiAn0YTRg9GA0YHQsNGCJyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YTRg9GA0YHQsNGCJyxcbiAgICAgICAgICAgIG06ICfQsdC40YAg0LTQsNC60LjQutCwJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LTQsNC60LjQutCwJyxcbiAgICAgICAgICAgIGg6ICfQsdC40YAg0YHQvtCw0YInLFxuICAgICAgICAgICAgaGg6ICclZCDRgdC+0LDRgicsXG4gICAgICAgICAgICBkOiAn0LHQuNGAINC60YPQvScsXG4gICAgICAgICAgICBkZDogJyVkINC60YPQvScsXG4gICAgICAgICAgICBNOiAn0LHQuNGAINC+0LknLFxuICAgICAgICAgICAgTU06ICclZCDQvtC5JyxcbiAgICAgICAgICAgIHk6ICfQsdC40YAg0LnQuNC7JyxcbiAgICAgICAgICAgIHl5OiAnJWQg0LnQuNC7JyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHV6O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFZpZXRuYW1lc2UgW3ZpXVxuLy8hIGF1dGhvciA6IEJhbmcgTmd1eWVuIDogaHR0cHM6Ly9naXRodWIuY29tL2Jhbmdua1xuLy8hIGF1dGhvciA6IENoaWVuIEtpcmEgOiBodHRwczovL2dpdGh1Yi5jb20vY2hpZW5raXJhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdmkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd2aScsIHtcbiAgICAgICAgbW9udGhzOiAndGjDoW5nIDFfdGjDoW5nIDJfdGjDoW5nIDNfdGjDoW5nIDRfdGjDoW5nIDVfdGjDoW5nIDZfdGjDoW5nIDdfdGjDoW5nIDhfdGjDoW5nIDlfdGjDoW5nIDEwX3Row6FuZyAxMV90aMOhbmcgMTInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ1RoZyAwMV9UaGcgMDJfVGhnIDAzX1RoZyAwNF9UaGcgMDVfVGhnIDA2X1RoZyAwN19UaGcgMDhfVGhnIDA5X1RoZyAxMF9UaGcgMTFfVGhnIDEyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnY2jhu6cgbmjhuq10X3Ro4bupIGhhaV90aOG7qSBiYV90aOG7qSB0xrBfdGjhu6kgbsSDbV90aOG7qSBzw6F1X3Ro4bupIGLhuqN5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQ05fVDJfVDNfVDRfVDVfVDZfVDcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnQ05fVDJfVDNfVDRfVDVfVDZfVDcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL3NhfGNoL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eY2gkL2kudGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnc2EnIDogJ1NBJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnY2gnIDogJ0NIJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gW27Eg21dIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFtuxINtXSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gW27Eg21dIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgbDogJ0REL00vWVlZWScsXG4gICAgICAgICAgICBsbDogJ0QgTU1NIFlZWVknLFxuICAgICAgICAgICAgbGxsOiAnRCBNTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSMO0bSBuYXkgbMO6Y10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tOZ8OgeSBtYWkgbMO6Y10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt0deG6p24gdOG7m2kgbMO6Y10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIw7RtIHF1YSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3R14bqnbiB0csaw4bubYyBsw7pjXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHThu5tpJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB0csaw4bubYycsXG4gICAgICAgICAgICBzOiAndsOgaSBnacOieScsXG4gICAgICAgICAgICBzczogJyVkIGdpw6J5JyxcbiAgICAgICAgICAgIG06ICdt4buZdCBwaMO6dCcsXG4gICAgICAgICAgICBtbTogJyVkIHBow7p0JyxcbiAgICAgICAgICAgIGg6ICdt4buZdCBnaeG7nScsXG4gICAgICAgICAgICBoaDogJyVkIGdp4budJyxcbiAgICAgICAgICAgIGQ6ICdt4buZdCBuZ8OgeScsXG4gICAgICAgICAgICBkZDogJyVkIG5nw6B5JyxcbiAgICAgICAgICAgIHc6ICdt4buZdCB0deG6p24nLFxuICAgICAgICAgICAgd3c6ICclZCB0deG6p24nLFxuICAgICAgICAgICAgTTogJ23hu5l0IHRow6FuZycsXG4gICAgICAgICAgICBNTTogJyVkIHRow6FuZycsXG4gICAgICAgICAgICB5OiAnbeG7mXQgbsSDbScsXG4gICAgICAgICAgICB5eTogJyVkIG7Eg20nLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUHNldWRvIFt4LXBzZXVkb11cbi8vISBhdXRob3IgOiBBbmRyZXcgSG9vZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXdob29kMTI1XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgeFBzZXVkbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3gtcHNldWRvJywge1xuICAgICAgICBtb250aHM6ICdKfsOhw7HDusOhfnLDvV9GfsOpYnLDun7DoXLDvV9+TcOhcmN+aF/DgXB+csOtbF9+TcOhw71ffkrDusOxw6l+X0rDumx+w71fw4HDun5nw7pzdH5fU8OpcH50w6ltYn7DqXJfw5N+Y3TDs2J+w6lyX8ORfsOzdsOpbX5iw6lyX35Ew6ljw6l+bWLDqXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0p+w6HDsV9+RsOpYl9+TcOhcl9+w4Fwcl9+TcOhw71ffkrDusOxX35Kw7psX37DgcO6Z19+U8OpcF9+w5NjdF9+w5HDs3ZffkTDqWMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnU37DusOxZMOhfsO9X03Ds37DsWTDocO9fl9Uw7rDqX5zZMOhw71+X1fDqWR+w7HDqXNkfsOhw71fVH5ow7pyc35kw6HDvV9+RnLDrWR+w6HDvV9TfsOhdMO6cn5kw6HDvScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU37DusOxX35Nw7PDsV9+VMO6w6lfflfDqWRfflRow7pffkZyw61fflPDoXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU37Dul9Nw7N+X1TDul9+V8OpX1R+aF9Gcn5fU8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVH7Ds2TDoX7DvSDDoXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVH7Ds23Ds35ycsOzfncgw6F0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8OhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vDnX7DqXN0fsOpcmTDoX7DvSDDoXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0x+w6FzdF0gZGRkZCBbw6F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ8OtfsOxICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDDoX5nw7MnLFxuICAgICAgICAgICAgczogJ8OhIH5mw6l3IH5zw6ljw7N+w7FkcycsXG4gICAgICAgICAgICBzczogJyVkIHN+w6ljw7PDsX5kcycsXG4gICAgICAgICAgICBtOiAnw6Egfm3DrcOxfsO6dMOpJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbX7DrcOxw7p+dMOpcycsXG4gICAgICAgICAgICBoOiAnw6F+w7EgaMOzfsO6cicsXG4gICAgICAgICAgICBoaDogJyVkIGh+w7PDunJzJyxcbiAgICAgICAgICAgIGQ6ICfDoSB+ZMOhw70nLFxuICAgICAgICAgICAgZGQ6ICclZCBkfsOhw71zJyxcbiAgICAgICAgICAgIE06ICfDoSB+bcOzw7F+dGgnLFxuICAgICAgICAgICAgTU06ICclZCBtfsOzw7F0fmhzJyxcbiAgICAgICAgICAgIHk6ICfDoSB+w73DqcOhcicsXG4gICAgICAgICAgICB5eTogJyVkIMO9fsOpw6FycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSh0aHxzdHxuZHxyZCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB4UHNldWRvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFlvcnViYSBOaWdlcmlhIFt5b11cbi8vISBhdXRob3IgOiBBdG9sYWdiZSBBYmlzb3llIDogaHR0cHM6Ly9naXRodWIuY29tL2FuZGVsYS1iYXRvbGFnYmVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB5byA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3lvJywge1xuICAgICAgICBtb250aHM6ICdT4bq5zIFy4bq5zIFfRcyAcmXMgGxlzIBf4bq4cuG6ucyAbmHMgF9JzIBnYmXMgV9FzIBiaWJpX0/MgGt1zIBkdV9BZ+G6uW1vX0/MgGd1zIFuX093ZXdlX+G7jMyAd2HMgHJhzIBfQmXMgWx1zIFf4buMzIBw4bq5zIDMgCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdT4bq5zIFyX0XMgHJsX+G6uHJuX0nMgGdiX0XMgGJpX0/MgGt1zIBfQWfhurlfT8yAZ3XMgV9Pd2Vf4buMzIB3YcyAX0JlzIFsX+G7jMyAcOG6ucyAzIAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnQcyAacyAa3XMgV9BamXMgV9JzIBz4bq5zIFndW5f4buMauG7jcyBcnXMgV/hu4xq4buNzIFi4buNX+G6uHRpzIBfQcyAYmHMgW3hurnMgXRhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnQcyAacyAa19BamXMgV9JzIBz4bq5zIFf4buManJf4buMamJf4bq4dGnMgF9BzIBiYcyBJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0HMgGnMgF9Bal9JzIBzX+G7jHJf4buMYl/hurh0X0HMgGInLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0/MgG5pzIAgbmldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4buMzIBsYSBuaV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IFwiZGRkZCBb4buMc+G6ucyAIHRvzIFuJ2Lhu41dIFtuaV0gTFRcIixcbiAgICAgICAgICAgIGxhc3REYXk6ICdbQcyAbmEgbmldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb4buMc+G6ucyAIHRvzIFs4buNzIFdIFtuaV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICduacyBICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBr4buNamHMgScsXG4gICAgICAgICAgICBzOiAnacyAc+G6uWp1zIEgYWF5YcyBIGRpZScsXG4gICAgICAgICAgICBzczogJ2FheWHMgSAlZCcsXG4gICAgICAgICAgICBtOiAnacyAc+G6uWp1zIEga2FuJyxcbiAgICAgICAgICAgIG1tOiAnacyAc+G6uWp1zIEgJWQnLFxuICAgICAgICAgICAgaDogJ3dhzIFrYXRpIGthbicsXG4gICAgICAgICAgICBoaDogJ3dhzIFrYXRpICVkJyxcbiAgICAgICAgICAgIGQ6ICfhu41q4buNzIEga2FuJyxcbiAgICAgICAgICAgIGRkOiAn4buNauG7jcyBICVkJyxcbiAgICAgICAgICAgIE06ICdvc3XMgCBrYW4nLFxuICAgICAgICAgICAgTU06ICdvc3XMgCAlZCcsXG4gICAgICAgICAgICB5OiAn4buNZHXMgW4ga2FuJyxcbiAgICAgICAgICAgIHl5OiAn4buNZHXMgW4gJWQnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAv4buNauG7jcyBXFxzXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiAn4buNauG7jcyBICVkJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHlvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENoaW5lc2UgKENoaW5hKSBbemgtY25dXG4vLyEgYXV0aG9yIDogc3V1cGljIDogaHR0cHM6Ly9naXRodWIuY29tL3N1dXBpY1xuLy8hIGF1dGhvciA6IFplbm8gWmVuZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS96ZW5vemVuZ1xuLy8hIGF1dGhvciA6IHV1MTA5IDogaHR0cHM6Ly9naXRodWIuY29tL3V1MTA5XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgemhDbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3poLWNuJywge1xuICAgICAgICBtb250aHM6ICfkuIDmnIhf5LqM5pyIX+S4ieaciF/lm5vmnIhf5LqU5pyIX+WFreaciF/kuIPmnIhf5YWr5pyIX+S5neaciF/ljYHmnIhf5Y2B5LiA5pyIX+WNgeS6jOaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICcx5pyIXzLmnIhfM+aciF805pyIXzXmnIhfNuaciF835pyIXzjmnIhfOeaciF8xMOaciF8xMeaciF8xMuaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfmmJ/mnJ/ml6Vf5pif5pyf5LiAX+aYn+acn+S6jF/mmJ/mnJ/kuIlf5pif5pyf5ZubX+aYn+acn+S6lF/mmJ/mnJ/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICflkajml6Vf5ZGo5LiAX+WRqOS6jF/lkajkuIlf5ZGo5ZubX+WRqOS6lF/lkajlha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn5pelX+S4gF/kuoxf5LiJX+Wbm1/kupRf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZ5bm0TeaciETml6VBaOeCuW1t5YiGJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ5bm0TeaciETml6VkZGRkQWjngrltbeWIhicsXG4gICAgICAgICAgICBsOiAnWVlZWS9NL0QnLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5YeM5pmoJyB8fCBtZXJpZGllbSA9PT0gJ+aXqeS4iicgfHwgbWVyaWRpZW0gPT09ICfkuIrljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5LiL5Y2IJyB8fCBtZXJpZGllbSA9PT0gJ+aZmuS4iicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAn5Lit5Y2IJ1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WHjOaZqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfml6nkuIonO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDExMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4iuWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+aYjuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmIChub3cud2VlaygpICE9PSB0aGlzLndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vkuItdZGRkTFQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+acrF1kZGRMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5aSpXUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMud2VlaygpICE9PSBub3cud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+S4il1kZGRMVCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5pysXWRkZExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOaXpXzmnIh85ZGoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pyIJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICflkagnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlkI4nLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICflh6Dnp5InLFxuICAgICAgICAgICAgc3M6ICclZCDnp5InLFxuICAgICAgICAgICAgbTogJzEg5YiG6ZKfJyxcbiAgICAgICAgICAgIG1tOiAnJWQg5YiG6ZKfJyxcbiAgICAgICAgICAgIGg6ICcxIOWwj+aXticsXG4gICAgICAgICAgICBoaDogJyVkIOWwj+aXticsXG4gICAgICAgICAgICBkOiAnMSDlpKknLFxuICAgICAgICAgICAgZGQ6ICclZCDlpKknLFxuICAgICAgICAgICAgdzogJzEg5ZGoJyxcbiAgICAgICAgICAgIHd3OiAnJWQg5ZGoJyxcbiAgICAgICAgICAgIE06ICcxIOS4quaciCcsXG4gICAgICAgICAgICBNTTogJyVkIOS4quaciCcsXG4gICAgICAgICAgICB5OiAnMSDlubQnLFxuICAgICAgICAgICAgeXk6ICclZCDlubQnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICAvLyBHQi9UIDc0MDgtMTk5NOOAiuaVsOaNruWFg+WSjOS6pOaNouagvOW8j8K35L+h5oGv5Lqk5o2iwrfml6XmnJ/lkozml7bpl7TooajnpLrms5XjgIvkuI5JU08gODYwMToxOTg4562J5pWIXG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gemhDbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaGluZXNlIChIb25nIEtvbmcpIFt6aC1oa11cbi8vISBhdXRob3IgOiBCZW4gOiBodHRwczovL2dpdGh1Yi5jb20vYmVuLWxpblxuLy8hIGF1dGhvciA6IENocmlzIExhbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oZWhhY2hyaXNcbi8vISBhdXRob3IgOiBLb25zdGFudGluIDogaHR0cHM6Ly9naXRodWIuY29tL3NrZmRcbi8vISBhdXRob3IgOiBBbnRob255IDogaHR0cHM6Ly9naXRodWIuY29tL2FudGhvbnlsYXVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB6aEhrID0gbW9tZW50LmRlZmluZUxvY2FsZSgnemgtaGsnLCB7XG4gICAgICAgIG1vbnRoczogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+mAseaXpV/pgLHkuIBf6YCx5LqMX+mAseS4iV/pgLHlm5tf6YCx5LqUX+mAseWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS9NL0QnLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5YeM5pmoJyB8fCBtZXJpZGllbSA9PT0gJ+aXqeS4iicgfHwgbWVyaWRpZW0gPT09ICfkuIrljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5Lit5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuIvljYgnIHx8IG1lcmlkaWVtID09PSAn5pma5LiKJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA9PT0gMTIwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+aYjuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vkuItdZGRkZExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5aSpXUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+S4il1kZGRkTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOaXpXzmnIh86YCxKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pyIJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfpgLEnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlvownLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICflub7np5InLFxuICAgICAgICAgICAgc3M6ICclZCDnp5InLFxuICAgICAgICAgICAgbTogJzEg5YiG6ZCYJyxcbiAgICAgICAgICAgIG1tOiAnJWQg5YiG6ZCYJyxcbiAgICAgICAgICAgIGg6ICcxIOWwj+aZgicsXG4gICAgICAgICAgICBoaDogJyVkIOWwj+aZgicsXG4gICAgICAgICAgICBkOiAnMSDlpKknLFxuICAgICAgICAgICAgZGQ6ICclZCDlpKknLFxuICAgICAgICAgICAgTTogJzEg5YCL5pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg5YCL5pyIJyxcbiAgICAgICAgICAgIHk6ICcxIOW5tCcsXG4gICAgICAgICAgICB5eTogJyVkIOW5tCcsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gemhIaztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaGluZXNlIChNYWNhdSkgW3poLW1vXVxuLy8hIGF1dGhvciA6IEJlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZW4tbGluXG4vLyEgYXV0aG9yIDogQ2hyaXMgTGFtIDogaHR0cHM6Ly9naXRodWIuY29tL2hlaGFjaHJpc1xuLy8hIGF1dGhvciA6IFRhbiBZdWFuaG9uZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9sZTB0YW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB6aE1vID0gbW9tZW50LmRlZmluZUxvY2FsZSgnemgtbW8nLCB7XG4gICAgICAgIG1vbnRoczogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+mAseaXpV/pgLHkuIBf6YCx5LqMX+mAseS4iV/pgLHlm5tf6YCx5LqUX+mAseWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgICAgICBsOiAnRC9NL1lZWVknLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5YeM5pmoJyB8fCBtZXJpZGllbSA9PT0gJ+aXqeS4iicgfHwgbWVyaWRpZW0gPT09ICfkuIrljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5Lit5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuIvljYgnIHx8IG1lcmlkaWVtID09PSAn5pma5LiKJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMTMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4reWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiL5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfmmZrkuIonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vku4rlpKldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb5piO5aSpXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vkuItdZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+aYqOWkqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb5LiKXWRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOaXpXzmnIh86YCxKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pyIJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfpgLEnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlhacnLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICflub7np5InLFxuICAgICAgICAgICAgc3M6ICclZCDnp5InLFxuICAgICAgICAgICAgbTogJzEg5YiG6ZCYJyxcbiAgICAgICAgICAgIG1tOiAnJWQg5YiG6ZCYJyxcbiAgICAgICAgICAgIGg6ICcxIOWwj+aZgicsXG4gICAgICAgICAgICBoaDogJyVkIOWwj+aZgicsXG4gICAgICAgICAgICBkOiAnMSDlpKknLFxuICAgICAgICAgICAgZGQ6ICclZCDlpKknLFxuICAgICAgICAgICAgTTogJzEg5YCL5pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg5YCL5pyIJyxcbiAgICAgICAgICAgIHk6ICcxIOW5tCcsXG4gICAgICAgICAgICB5eTogJyVkIOW5tCcsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gemhNbztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaGluZXNlIChUYWl3YW4pIFt6aC10d11cbi8vISBhdXRob3IgOiBCZW4gOiBodHRwczovL2dpdGh1Yi5jb20vYmVuLWxpblxuLy8hIGF1dGhvciA6IENocmlzIExhbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oZWhhY2hyaXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB6aFR3ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnemgtdHcnLCB7XG4gICAgICAgIG1vbnRoczogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+mAseaXpV/pgLHkuIBf6YCx5LqMX+mAseS4iV/pgLHlm5tf6YCx5LqUX+mAseWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS9NL0QnLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5YeM5pmoJyB8fCBtZXJpZGllbSA9PT0gJ+aXqeS4iicgfHwgbWVyaWRpZW0gPT09ICfkuIrljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5Lit5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuIvljYgnIHx8IG1lcmlkaWVtID09PSAn5pma5LiKJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMTMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4reWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiL5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfmmZrkuIonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vku4rlpKldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb5piO5aSpXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vkuItdZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+aYqOWkqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb5LiKXWRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOaXpXzmnIh86YCxKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pyIJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfpgLEnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlvownLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICflub7np5InLFxuICAgICAgICAgICAgc3M6ICclZCDnp5InLFxuICAgICAgICAgICAgbTogJzEg5YiG6ZCYJyxcbiAgICAgICAgICAgIG1tOiAnJWQg5YiG6ZCYJyxcbiAgICAgICAgICAgIGg6ICcxIOWwj+aZgicsXG4gICAgICAgICAgICBoaDogJyVkIOWwj+aZgicsXG4gICAgICAgICAgICBkOiAnMSDlpKknLFxuICAgICAgICAgICAgZGQ6ICclZCDlpKknLFxuICAgICAgICAgICAgTTogJzEg5YCL5pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg5YCL5pyIJyxcbiAgICAgICAgICAgIHk6ICcxIOW5tCcsXG4gICAgICAgICAgICB5eTogJyVkIOW5tCcsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gemhUdztcblxufSkpKTtcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9hZlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYWYuanNcIixcblx0XCIuL2FmLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hZi5qc1wiLFxuXHRcIi4vYXJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLmpzXCIsXG5cdFwiLi9hci1kelwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItZHouanNcIixcblx0XCIuL2FyLWR6LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1kei5qc1wiLFxuXHRcIi4vYXIta3dcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWt3LmpzXCIsXG5cdFwiLi9hci1rdy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIta3cuanNcIixcblx0XCIuL2FyLWx5XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1seS5qc1wiLFxuXHRcIi4vYXItbHkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWx5LmpzXCIsXG5cdFwiLi9hci1tYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItbWEuanNcIixcblx0XCIuL2FyLW1hLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1tYS5qc1wiLFxuXHRcIi4vYXItcHNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXBzLmpzXCIsXG5cdFwiLi9hci1wcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItcHMuanNcIixcblx0XCIuL2FyLXNhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1zYS5qc1wiLFxuXHRcIi4vYXItc2EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXNhLmpzXCIsXG5cdFwiLi9hci10blwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItdG4uanNcIixcblx0XCIuL2FyLXRuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci10bi5qc1wiLFxuXHRcIi4vYXIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLmpzXCIsXG5cdFwiLi9helwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXouanNcIixcblx0XCIuL2F6LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hei5qc1wiLFxuXHRcIi4vYmVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JlLmpzXCIsXG5cdFwiLi9iZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmUuanNcIixcblx0XCIuL2JnXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iZy5qc1wiLFxuXHRcIi4vYmcuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JnLmpzXCIsXG5cdFwiLi9ibVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm0uanNcIixcblx0XCIuL2JtLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibS5qc1wiLFxuXHRcIi4vYm5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLmpzXCIsXG5cdFwiLi9ibi1iZFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4tYmQuanNcIixcblx0XCIuL2JuLWJkLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibi1iZC5qc1wiLFxuXHRcIi4vYm4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLmpzXCIsXG5cdFwiLi9ib1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm8uanNcIixcblx0XCIuL2JvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iby5qc1wiLFxuXHRcIi4vYnJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JyLmpzXCIsXG5cdFwiLi9ici5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYnIuanNcIixcblx0XCIuL2JzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9icy5qc1wiLFxuXHRcIi4vYnMuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JzLmpzXCIsXG5cdFwiLi9jYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY2EuanNcIixcblx0XCIuL2NhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jYS5qc1wiLFxuXHRcIi4vY3NcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2NzLmpzXCIsXG5cdFwiLi9jcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3MuanNcIixcblx0XCIuL2N2XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jdi5qc1wiLFxuXHRcIi4vY3YuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2N2LmpzXCIsXG5cdFwiLi9jeVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3kuanNcIixcblx0XCIuL2N5LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jeS5qc1wiLFxuXHRcIi4vZGFcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RhLmpzXCIsXG5cdFwiLi9kYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGEuanNcIixcblx0XCIuL2RlXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS5qc1wiLFxuXHRcIi4vZGUtYXRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWF0LmpzXCIsXG5cdFwiLi9kZS1hdC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtYXQuanNcIixcblx0XCIuL2RlLWNoXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS1jaC5qc1wiLFxuXHRcIi4vZGUtY2guanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWNoLmpzXCIsXG5cdFwiLi9kZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUuanNcIixcblx0XCIuL2R2XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kdi5qc1wiLFxuXHRcIi4vZHYuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2R2LmpzXCIsXG5cdFwiLi9lbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZWwuanNcIixcblx0XCIuL2VsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbC5qc1wiLFxuXHRcIi4vZW4tYXVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWF1LmpzXCIsXG5cdFwiLi9lbi1hdS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tYXUuanNcIixcblx0XCIuL2VuLWNhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1jYS5qc1wiLFxuXHRcIi4vZW4tY2EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWNhLmpzXCIsXG5cdFwiLi9lbi1nYlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tZ2IuanNcIixcblx0XCIuL2VuLWdiLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1nYi5qc1wiLFxuXHRcIi4vZW4taWVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWllLmpzXCIsXG5cdFwiLi9lbi1pZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWUuanNcIixcblx0XCIuL2VuLWlsXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbC5qc1wiLFxuXHRcIi4vZW4taWwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWlsLmpzXCIsXG5cdFwiLi9lbi1pblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taW4uanNcIixcblx0XCIuL2VuLWluLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbi5qc1wiLFxuXHRcIi4vZW4tbnpcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLW56LmpzXCIsXG5cdFwiLi9lbi1uei5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tbnouanNcIixcblx0XCIuL2VuLXNnXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1zZy5qc1wiLFxuXHRcIi4vZW4tc2cuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLXNnLmpzXCIsXG5cdFwiLi9lb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW8uanNcIixcblx0XCIuL2VvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lby5qc1wiLFxuXHRcIi4vZXNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLmpzXCIsXG5cdFwiLi9lcy1kb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtZG8uanNcIixcblx0XCIuL2VzLWRvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy1kby5qc1wiLFxuXHRcIi4vZXMtbXhcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLW14LmpzXCIsXG5cdFwiLi9lcy1teC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtbXguanNcIixcblx0XCIuL2VzLXVzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy11cy5qc1wiLFxuXHRcIi4vZXMtdXMuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLXVzLmpzXCIsXG5cdFwiLi9lcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMuanNcIixcblx0XCIuL2V0XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldC5qc1wiLFxuXHRcIi4vZXQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2V0LmpzXCIsXG5cdFwiLi9ldVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXUuanNcIixcblx0XCIuL2V1LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldS5qc1wiLFxuXHRcIi4vZmFcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZhLmpzXCIsXG5cdFwiLi9mYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmEuanNcIixcblx0XCIuL2ZpXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9maS5qc1wiLFxuXHRcIi4vZmkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZpLmpzXCIsXG5cdFwiLi9maWxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZpbC5qc1wiLFxuXHRcIi4vZmlsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9maWwuanNcIixcblx0XCIuL2ZvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mby5qc1wiLFxuXHRcIi4vZm8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZvLmpzXCIsXG5cdFwiLi9mclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnIuanNcIixcblx0XCIuL2ZyLWNhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci1jYS5qc1wiLFxuXHRcIi4vZnItY2EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNhLmpzXCIsXG5cdFwiLi9mci1jaFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2guanNcIixcblx0XCIuL2ZyLWNoLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci1jaC5qc1wiLFxuXHRcIi4vZnIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLmpzXCIsXG5cdFwiLi9meVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnkuanNcIixcblx0XCIuL2Z5LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9meS5qc1wiLFxuXHRcIi4vZ2FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dhLmpzXCIsXG5cdFwiLi9nYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2EuanNcIixcblx0XCIuL2dkXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nZC5qc1wiLFxuXHRcIi4vZ2QuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dkLmpzXCIsXG5cdFwiLi9nbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2wuanNcIixcblx0XCIuL2dsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nbC5qc1wiLFxuXHRcIi4vZ29tLWRldmFcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dvbS1kZXZhLmpzXCIsXG5cdFwiLi9nb20tZGV2YS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWRldmEuanNcIixcblx0XCIuL2dvbS1sYXRuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nb20tbGF0bi5qc1wiLFxuXHRcIi4vZ29tLWxhdG4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dvbS1sYXRuLmpzXCIsXG5cdFwiLi9ndVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ3UuanNcIixcblx0XCIuL2d1LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ndS5qc1wiLFxuXHRcIi4vaGVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hlLmpzXCIsXG5cdFwiLi9oZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGUuanNcIixcblx0XCIuL2hpXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oaS5qc1wiLFxuXHRcIi4vaGkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hpLmpzXCIsXG5cdFwiLi9oclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHIuanNcIixcblx0XCIuL2hyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oci5qc1wiLFxuXHRcIi4vaHVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2h1LmpzXCIsXG5cdFwiLi9odS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHUuanNcIixcblx0XCIuL2h5LWFtXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oeS1hbS5qc1wiLFxuXHRcIi4vaHktYW0uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2h5LWFtLmpzXCIsXG5cdFwiLi9pZFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaWQuanNcIixcblx0XCIuL2lkLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pZC5qc1wiLFxuXHRcIi4vaXNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2lzLmpzXCIsXG5cdFwiLi9pcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXMuanNcIixcblx0XCIuL2l0XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC5qc1wiLFxuXHRcIi4vaXQtY2hcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LWNoLmpzXCIsXG5cdFwiLi9pdC1jaC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXQtY2guanNcIixcblx0XCIuL2l0LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC5qc1wiLFxuXHRcIi4vamFcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2phLmpzXCIsXG5cdFwiLi9qYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvamEuanNcIixcblx0XCIuL2p2XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9qdi5qc1wiLFxuXHRcIi4vanYuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2p2LmpzXCIsXG5cdFwiLi9rYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2EuanNcIixcblx0XCIuL2thLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rYS5qc1wiLFxuXHRcIi4va2tcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2trLmpzXCIsXG5cdFwiLi9ray5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2suanNcIixcblx0XCIuL2ttXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbS5qc1wiLFxuXHRcIi4va20uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ttLmpzXCIsXG5cdFwiLi9rblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva24uanNcIixcblx0XCIuL2tuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbi5qc1wiLFxuXHRcIi4va29cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2tvLmpzXCIsXG5cdFwiLi9rby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva28uanNcIixcblx0XCIuL2t1XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS5qc1wiLFxuXHRcIi4va3Uta21yXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS1rbXIuanNcIixcblx0XCIuL2t1LWttci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3Uta21yLmpzXCIsXG5cdFwiLi9rdS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3UuanNcIixcblx0XCIuL2t5XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9reS5qc1wiLFxuXHRcIi4va3kuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t5LmpzXCIsXG5cdFwiLi9sYlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbGIuanNcIixcblx0XCIuL2xiLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sYi5qc1wiLFxuXHRcIi4vbG9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2xvLmpzXCIsXG5cdFwiLi9sby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbG8uanNcIixcblx0XCIuL2x0XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sdC5qc1wiLFxuXHRcIi4vbHQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x0LmpzXCIsXG5cdFwiLi9sdlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbHYuanNcIixcblx0XCIuL2x2LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sdi5qc1wiLFxuXHRcIi4vbWVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21lLmpzXCIsXG5cdFwiLi9tZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWUuanNcIixcblx0XCIuL21pXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9taS5qc1wiLFxuXHRcIi4vbWkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21pLmpzXCIsXG5cdFwiLi9ta1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWsuanNcIixcblx0XCIuL21rLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tay5qc1wiLFxuXHRcIi4vbWxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21sLmpzXCIsXG5cdFwiLi9tbC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWwuanNcIixcblx0XCIuL21uXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tbi5qc1wiLFxuXHRcIi4vbW4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21uLmpzXCIsXG5cdFwiLi9tclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXIuanNcIixcblx0XCIuL21yLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tci5qc1wiLFxuXHRcIi4vbXNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21zLmpzXCIsXG5cdFwiLi9tcy1teVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXMtbXkuanNcIixcblx0XCIuL21zLW15LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tcy1teS5qc1wiLFxuXHRcIi4vbXMuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21zLmpzXCIsXG5cdFwiLi9tdFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXQuanNcIixcblx0XCIuL210LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tdC5qc1wiLFxuXHRcIi4vbXlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL215LmpzXCIsXG5cdFwiLi9teS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXkuanNcIixcblx0XCIuL25iXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9uYi5qc1wiLFxuXHRcIi4vbmIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25iLmpzXCIsXG5cdFwiLi9uZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmUuanNcIixcblx0XCIuL25lLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9uZS5qc1wiLFxuXHRcIi4vbmxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25sLmpzXCIsXG5cdFwiLi9ubC1iZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmwtYmUuanNcIixcblx0XCIuL25sLWJlLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC1iZS5qc1wiLFxuXHRcIi4vbmwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25sLmpzXCIsXG5cdFwiLi9ublwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbm4uanNcIixcblx0XCIuL25uLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubi5qc1wiLFxuXHRcIi4vb2MtbG5jXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9vYy1sbmMuanNcIixcblx0XCIuL29jLWxuYy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvb2MtbG5jLmpzXCIsXG5cdFwiLi9wYS1pblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcGEtaW4uanNcIixcblx0XCIuL3BhLWluLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wYS1pbi5qc1wiLFxuXHRcIi4vcGxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3BsLmpzXCIsXG5cdFwiLi9wbC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcGwuanNcIixcblx0XCIuL3B0XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wdC5qc1wiLFxuXHRcIi4vcHQtYnJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3B0LWJyLmpzXCIsXG5cdFwiLi9wdC1ici5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcHQtYnIuanNcIixcblx0XCIuL3B0LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wdC5qc1wiLFxuXHRcIi4vcm9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3JvLmpzXCIsXG5cdFwiLi9yby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcm8uanNcIixcblx0XCIuL3J1XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ydS5qc1wiLFxuXHRcIi4vcnUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3J1LmpzXCIsXG5cdFwiLi9zZFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2QuanNcIixcblx0XCIuL3NkLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZC5qc1wiLFxuXHRcIi4vc2VcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NlLmpzXCIsXG5cdFwiLi9zZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2UuanNcIixcblx0XCIuL3NpXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zaS5qc1wiLFxuXHRcIi4vc2kuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NpLmpzXCIsXG5cdFwiLi9za1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2suanNcIixcblx0XCIuL3NrLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zay5qc1wiLFxuXHRcIi4vc2xcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NsLmpzXCIsXG5cdFwiLi9zbC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2wuanNcIixcblx0XCIuL3NxXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zcS5qc1wiLFxuXHRcIi4vc3EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NxLmpzXCIsXG5cdFwiLi9zclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3IuanNcIixcblx0XCIuL3NyLWN5cmxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NyLWN5cmwuanNcIixcblx0XCIuL3NyLWN5cmwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NyLWN5cmwuanNcIixcblx0XCIuL3NyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zci5qc1wiLFxuXHRcIi4vc3NcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NzLmpzXCIsXG5cdFwiLi9zcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3MuanNcIixcblx0XCIuL3N2XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zdi5qc1wiLFxuXHRcIi4vc3YuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N2LmpzXCIsXG5cdFwiLi9zd1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3cuanNcIixcblx0XCIuL3N3LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zdy5qc1wiLFxuXHRcIi4vdGFcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RhLmpzXCIsXG5cdFwiLi90YS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGEuanNcIixcblx0XCIuL3RlXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ZS5qc1wiLFxuXHRcIi4vdGUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RlLmpzXCIsXG5cdFwiLi90ZXRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RldC5qc1wiLFxuXHRcIi4vdGV0LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ZXQuanNcIixcblx0XCIuL3RnXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90Zy5qc1wiLFxuXHRcIi4vdGcuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RnLmpzXCIsXG5cdFwiLi90aFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGguanNcIixcblx0XCIuL3RoLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90aC5qc1wiLFxuXHRcIi4vdGtcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RrLmpzXCIsXG5cdFwiLi90ay5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGsuanNcIixcblx0XCIuL3RsLXBoXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bC1waC5qc1wiLFxuXHRcIi4vdGwtcGguanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsLXBoLmpzXCIsXG5cdFwiLi90bGhcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsaC5qc1wiLFxuXHRcIi4vdGxoLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bGguanNcIixcblx0XCIuL3RyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ci5qc1wiLFxuXHRcIi4vdHIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RyLmpzXCIsXG5cdFwiLi90emxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bC5qc1wiLFxuXHRcIi4vdHpsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90emwuanNcIixcblx0XCIuL3R6bVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHptLmpzXCIsXG5cdFwiLi90em0tbGF0blwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHptLWxhdG4uanNcIixcblx0XCIuL3R6bS1sYXRuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90em0tbGF0bi5qc1wiLFxuXHRcIi4vdHptLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90em0uanNcIixcblx0XCIuL3VnLWNuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91Zy1jbi5qc1wiLFxuXHRcIi4vdWctY24uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VnLWNuLmpzXCIsXG5cdFwiLi91a1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdWsuanNcIixcblx0XCIuL3VrLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ay5qc1wiLFxuXHRcIi4vdXJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VyLmpzXCIsXG5cdFwiLi91ci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXIuanNcIixcblx0XCIuL3V6XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ei5qc1wiLFxuXHRcIi4vdXotbGF0blwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXotbGF0bi5qc1wiLFxuXHRcIi4vdXotbGF0bi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXotbGF0bi5qc1wiLFxuXHRcIi4vdXouanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3V6LmpzXCIsXG5cdFwiLi92aVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdmkuanNcIixcblx0XCIuL3ZpLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS92aS5qc1wiLFxuXHRcIi4veC1wc2V1ZG9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3gtcHNldWRvLmpzXCIsXG5cdFwiLi94LXBzZXVkby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUveC1wc2V1ZG8uanNcIixcblx0XCIuL3lvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS95by5qc1wiLFxuXHRcIi4veW8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3lvLmpzXCIsXG5cdFwiLi96aC1jblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtY24uanNcIixcblx0XCIuL3poLWNuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1jbi5qc1wiLFxuXHRcIi4vemgtaGtcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLWhrLmpzXCIsXG5cdFwiLi96aC1oay5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtaGsuanNcIixcblx0XCIuL3poLW1vXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1tby5qc1wiLFxuXHRcIi4vemgtbW8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLW1vLmpzXCIsXG5cdFwiLi96aC10d1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtdHcuanNcIixcblx0XCIuL3poLXR3LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC10dy5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLiokXCI7IiwiLy8hIG1vbWVudC5qc1xuLy8hIHZlcnNpb24gOiAyLjMwLjFcbi8vISBhdXRob3JzIDogVGltIFdvb2QsIElza3JlbiBDaGVybmV2LCBNb21lbnQuanMgY29udHJpYnV0b3JzXG4vLyEgbGljZW5zZSA6IE1JVFxuLy8hIG1vbWVudGpzLmNvbVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICBnbG9iYWwubW9tZW50ID0gZmFjdG9yeSgpXG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBob29rQ2FsbGJhY2s7XG5cbiAgICBmdW5jdGlvbiBob29rcygpIHtcbiAgICAgICAgcmV0dXJuIGhvb2tDYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byByZWdpc3RlciB0aGUgbWV0aG9kIGNhbGxlZCB3aXRoIG1vbWVudCgpXG4gICAgLy8gd2l0aG91dCBjcmVhdGluZyBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgZnVuY3Rpb24gc2V0SG9va0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICAgIGhvb2tDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgQXJyYXkgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdChpbnB1dCkge1xuICAgICAgICAvLyBJRTggd2lsbCB0cmVhdCB1bmRlZmluZWQgYW5kIG51bGwgYXMgb2JqZWN0IGlmIGl0IHdhc24ndCBmb3JcbiAgICAgICAgLy8gaW5wdXQgIT0gbnVsbFxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaW5wdXQgIT0gbnVsbCAmJlxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPd25Qcm9wKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdEVtcHR5KG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKG9iaiwgaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IE51bWJlcl0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IERhdGVdJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gICAgICAgIHZhciByZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBhcnJMZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyTGVuOyArK2kpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGZuKGFycltpXSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0ZW5kKGEsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBiKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChiLCBpKSkge1xuICAgICAgICAgICAgICAgIGFbaV0gPSBiW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3AoYiwgJ3RvU3RyaW5nJykpIHtcbiAgICAgICAgICAgIGEudG9TdHJpbmcgPSBiLnRvU3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3AoYiwgJ3ZhbHVlT2YnKSkge1xuICAgICAgICAgICAgYS52YWx1ZU9mID0gYi52YWx1ZU9mO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCB0cnVlKS51dGMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZhdWx0UGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZXAgY2xvbmUgdGhpcyBvYmplY3QuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbXB0eTogZmFsc2UsXG4gICAgICAgICAgICB1bnVzZWRUb2tlbnM6IFtdLFxuICAgICAgICAgICAgdW51c2VkSW5wdXQ6IFtdLFxuICAgICAgICAgICAgb3ZlcmZsb3c6IC0yLFxuICAgICAgICAgICAgY2hhcnNMZWZ0T3ZlcjogMCxcbiAgICAgICAgICAgIG51bGxJbnB1dDogZmFsc2UsXG4gICAgICAgICAgICBpbnZhbGlkRXJhOiBudWxsLFxuICAgICAgICAgICAgaW52YWxpZE1vbnRoOiBudWxsLFxuICAgICAgICAgICAgaW52YWxpZEZvcm1hdDogZmFsc2UsXG4gICAgICAgICAgICB1c2VySW52YWxpZGF0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNvOiBmYWxzZSxcbiAgICAgICAgICAgIHBhcnNlZERhdGVQYXJ0czogW10sXG4gICAgICAgICAgICBlcmE6IG51bGwsXG4gICAgICAgICAgICBtZXJpZGllbTogbnVsbCxcbiAgICAgICAgICAgIHJmYzI4MjI6IGZhbHNlLFxuICAgICAgICAgICAgd2Vla2RheU1pc21hdGNoOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQYXJzaW5nRmxhZ3MobSkge1xuICAgICAgICBpZiAobS5fcGYgPT0gbnVsbCkge1xuICAgICAgICAgICAgbS5fcGYgPSBkZWZhdWx0UGFyc2luZ0ZsYWdzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX3BmO1xuICAgIH1cblxuICAgIHZhciBzb21lO1xuICAgIGlmIChBcnJheS5wcm90b3R5cGUuc29tZSkge1xuICAgICAgICBzb21lID0gQXJyYXkucHJvdG90eXBlLnNvbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc29tZSA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0KHRoaXMpLFxuICAgICAgICAgICAgICAgIGxlbiA9IHQubGVuZ3RoID4+PiAwLFxuICAgICAgICAgICAgICAgIGk7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgICAgIHZhciBmbGFncyA9IG51bGwsXG4gICAgICAgICAgICBwYXJzZWRQYXJ0cyA9IGZhbHNlLFxuICAgICAgICAgICAgaXNOb3dWYWxpZCA9IG0uX2QgJiYgIWlzTmFOKG0uX2QuZ2V0VGltZSgpKTtcbiAgICAgICAgaWYgKGlzTm93VmFsaWQpIHtcbiAgICAgICAgICAgIGZsYWdzID0gZ2V0UGFyc2luZ0ZsYWdzKG0pO1xuICAgICAgICAgICAgcGFyc2VkUGFydHMgPSBzb21lLmNhbGwoZmxhZ3MucGFyc2VkRGF0ZVBhcnRzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpICE9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlzTm93VmFsaWQgPVxuICAgICAgICAgICAgICAgIGZsYWdzLm92ZXJmbG93IDwgMCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5lbXB0eSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkRXJhICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRNb250aCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkV2Vla2RheSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy53ZWVrZGF5TWlzbWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MubnVsbElucHV0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgKCFmbGFncy5tZXJpZGllbSB8fCAoZmxhZ3MubWVyaWRpZW0gJiYgcGFyc2VkUGFydHMpKTtcbiAgICAgICAgICAgIGlmIChtLl9zdHJpY3QpIHtcbiAgICAgICAgICAgICAgICBpc05vd1ZhbGlkID1cbiAgICAgICAgICAgICAgICAgICAgaXNOb3dWYWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5jaGFyc0xlZnRPdmVyID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLnVudXNlZFRva2Vucy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYmlnSG91ciA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4gPT0gbnVsbCB8fCAhT2JqZWN0LmlzRnJvemVuKG0pKSB7XG4gICAgICAgICAgICBtLl9pc1ZhbGlkID0gaXNOb3dWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc05vd1ZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQoZmxhZ3MpIHtcbiAgICAgICAgdmFyIG0gPSBjcmVhdGVVVEMoTmFOKTtcbiAgICAgICAgaWYgKGZsYWdzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGV4dGVuZChnZXRQYXJzaW5nRmxhZ3MobSksIGZsYWdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS51c2VySW52YWxpZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gUGx1Z2lucyB0aGF0IGFkZCBwcm9wZXJ0aWVzIHNob3VsZCBhbHNvIGFkZCB0aGUga2V5IGhlcmUgKG51bGwgdmFsdWUpLFxuICAgIC8vIHNvIHdlIGNhbiBwcm9wZXJseSBjbG9uZSBvdXJzZWx2ZXMuXG4gICAgdmFyIG1vbWVudFByb3BlcnRpZXMgPSAoaG9va3MubW9tZW50UHJvcGVydGllcyA9IFtdKSxcbiAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gY29weUNvbmZpZyh0bywgZnJvbSkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBtb21lbnRQcm9wZXJ0aWVzTGVuID0gbW9tZW50UHJvcGVydGllcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc0FNb21lbnRPYmplY3QpKSB7XG4gICAgICAgICAgICB0by5faXNBTW9tZW50T2JqZWN0ID0gZnJvbS5faXNBTW9tZW50T2JqZWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faSkpIHtcbiAgICAgICAgICAgIHRvLl9pID0gZnJvbS5faTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2YpKSB7XG4gICAgICAgICAgICB0by5fZiA9IGZyb20uX2Y7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sKSkge1xuICAgICAgICAgICAgdG8uX2wgPSBmcm9tLl9sO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fc3RyaWN0KSkge1xuICAgICAgICAgICAgdG8uX3N0cmljdCA9IGZyb20uX3N0cmljdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3R6bSkpIHtcbiAgICAgICAgICAgIHRvLl90em0gPSBmcm9tLl90em07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc1VUQykpIHtcbiAgICAgICAgICAgIHRvLl9pc1VUQyA9IGZyb20uX2lzVVRDO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fb2Zmc2V0KSkge1xuICAgICAgICAgICAgdG8uX29mZnNldCA9IGZyb20uX29mZnNldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3BmKSkge1xuICAgICAgICAgICAgdG8uX3BmID0gZ2V0UGFyc2luZ0ZsYWdzKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fbG9jYWxlKSkge1xuICAgICAgICAgICAgdG8uX2xvY2FsZSA9IGZyb20uX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb21lbnRQcm9wZXJ0aWVzTGVuID4gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXNMZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHByb3AgPSBtb21lbnRQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIHZhbCA9IGZyb21bcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvW3Byb3BdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0bztcbiAgICB9XG5cbiAgICAvLyBNb21lbnQgcHJvdG90eXBlIG9iamVjdFxuICAgIGZ1bmN0aW9uIE1vbWVudChjb25maWcpIHtcbiAgICAgICAgY29weUNvbmZpZyh0aGlzLCBjb25maWcpO1xuICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoY29uZmlnLl9kICE9IG51bGwgPyBjb25maWcuX2QuZ2V0VGltZSgpIDogTmFOKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wIGluIGNhc2UgdXBkYXRlT2Zmc2V0IGNyZWF0ZXMgbmV3IG1vbWVudFxuICAgICAgICAvLyBvYmplY3RzLlxuICAgICAgICBpZiAodXBkYXRlSW5Qcm9ncmVzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNNb21lbnQob2JqKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBvYmogaW5zdGFuY2VvZiBNb21lbnQgfHwgKG9iaiAhPSBudWxsICYmIG9iai5faXNBTW9tZW50T2JqZWN0ICE9IG51bGwpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaG9va3Muc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBjb25zb2xlLndhcm5cbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0RlcHJlY2F0aW9uIHdhcm5pbmc6ICcgKyBtc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVwcmVjYXRlKG1zZywgZm4pIHtcbiAgICAgICAgdmFyIGZpcnN0VGltZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobnVsbCwgbXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdFRpbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBhcmcsXG4gICAgICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgYXJnTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnICs9ICdcXG5bJyArIGkgKyAnXSAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gYXJndW1lbnRzWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093blByb3AoYXJndW1lbnRzWzBdLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSBrZXkgKyAnOiAnICsgYXJndW1lbnRzWzBdW2tleV0gKyAnLCAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgICAgICAgbXNnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcXG5Bcmd1bWVudHM6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVycm9yKCkuc3RhY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIGZuKTtcbiAgICB9XG5cbiAgICB2YXIgZGVwcmVjYXRpb25zID0ge307XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVTaW1wbGUobmFtZSwgbXNnKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPSBmYWxzZTtcbiAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHR5cGVvZiBGdW5jdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbikgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXQoY29uZmlnKSB7XG4gICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICBmb3IgKGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChjb25maWcsIGkpKSB7XG4gICAgICAgICAgICAgICAgcHJvcCA9IGNvbmZpZ1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW2ldID0gcHJvcDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIGldID0gcHJvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAvLyBMZW5pZW50IG9yZGluYWwgcGFyc2luZyBhY2NlcHRzIGp1c3QgYSBudW1iZXIgaW4gYWRkaXRpb24gdG9cbiAgICAgICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfZGF5T2ZNb250aE9yZGluYWxQYXJzZS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICB0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2UgfHwgdGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSkgK1xuICAgICAgICAgICAgICAgICd8JyArXG4gICAgICAgICAgICAgICAgL1xcZHsxLDJ9Ly5zb3VyY2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjaGlsZENvbmZpZykge1xuICAgICAgICB2YXIgcmVzID0gZXh0ZW5kKHt9LCBwYXJlbnRDb25maWcpLFxuICAgICAgICAgICAgcHJvcDtcbiAgICAgICAgZm9yIChwcm9wIGluIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChjaGlsZENvbmZpZywgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKSAmJiBpc09iamVjdChjaGlsZENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIHBhcmVudENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIGNoaWxkQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkQ29uZmlnW3Byb3BdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gY2hpbGRDb25maWdbcHJvcF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc1twcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChwcm9wIGluIHBhcmVudENvbmZpZykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGhhc093blByb3AocGFyZW50Q29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgICFoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgZG9uJ3QgbW9kaWZ5IHBhcmVudCBjb25maWdcbiAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSBleHRlbmQoe30sIHJlc1twcm9wXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMb2NhbGUoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXQoY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKSB7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cztcbiAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICAgICAgcmVzID0gW107XG4gICAgICAgICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3Aob2JqLCBpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0Q2FsZW5kYXIgPSB7XG4gICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNhbGVuZGFyKGtleSwgbW9tLCBub3cpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX2NhbGVuZGFyW2tleV0gfHwgdGhpcy5fY2FsZW5kYXJbJ3NhbWVFbHNlJ107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG91dHB1dCkgPyBvdXRwdXQuY2FsbChtb20sIG5vdykgOiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gemVyb0ZpbGwobnVtYmVyLCB0YXJnZXRMZW5ndGgsIGZvcmNlU2lnbikge1xuICAgICAgICB2YXIgYWJzTnVtYmVyID0gJycgKyBNYXRoLmFicyhudW1iZXIpLFxuICAgICAgICAgICAgemVyb3NUb0ZpbGwgPSB0YXJnZXRMZW5ndGggLSBhYnNOdW1iZXIubGVuZ3RoLFxuICAgICAgICAgICAgc2lnbiA9IG51bWJlciA+PSAwO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHNpZ24gPyAoZm9yY2VTaWduID8gJysnIDogJycpIDogJy0nKSArXG4gICAgICAgICAgICBNYXRoLnBvdygxMCwgTWF0aC5tYXgoMCwgemVyb3NUb0ZpbGwpKS50b1N0cmluZygpLnN1YnN0cigxKSArXG4gICAgICAgICAgICBhYnNOdW1iZXJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0dGluZ1Rva2VucyA9XG4gICAgICAgICAgICAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fE57MSw1fXxZWVlZWVl8WVlZWVl8WVlZWXxZWXx5ezIsNH18eW8/fGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nLFxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oTFRTfExUfExMP0w/TD98bHsxLDR9KS9nLFxuICAgICAgICBmb3JtYXRGdW5jdGlvbnMgPSB7fSxcbiAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7fTtcblxuICAgIC8vIHRva2VuOiAgICAnTSdcbiAgICAvLyBwYWRkZWQ6ICAgWydNTScsIDJdXG4gICAgLy8gb3JkaW5hbDogICdNbydcbiAgICAvLyBjYWxsYmFjazogZnVuY3Rpb24gKCkgeyB0aGlzLm1vbnRoKCkgKyAxIH1cbiAgICBmdW5jdGlvbiBhZGRGb3JtYXRUb2tlbih0b2tlbiwgcGFkZGVkLCBvcmRpbmFsLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tjYWxsYmFja10oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWRkZWQpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW3BhZGRlZFswXV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHplcm9GaWxsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgcGFkZGVkWzFdLCBwYWRkZWRbMl0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3JkaW5hbCkge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbb3JkaW5hbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwoXG4gICAgICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0Lm1hdGNoKC9cXFtbXFxzXFxTXS8pKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBmb3JtYXQubWF0Y2goZm9ybWF0dGluZ1Rva2VucyksXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbGVuZ3RoO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhhcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1vbSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9ICcnLFxuICAgICAgICAgICAgICAgIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gaXNGdW5jdGlvbihhcnJheVtpXSlcbiAgICAgICAgICAgICAgICAgICAgPyBhcnJheVtpXS5jYWxsKG1vbSwgZm9ybWF0KVxuICAgICAgICAgICAgICAgICAgICA6IGFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBmb3JtYXQgZGF0ZSB1c2luZyBuYXRpdmUgZGF0ZSBvYmplY3RcbiAgICBmdW5jdGlvbiBmb3JtYXRNb21lbnQobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBtLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZXhwYW5kRm9ybWF0KGZvcm1hdCwgbS5sb2NhbGVEYXRhKCkpO1xuICAgICAgICBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSA9XG4gICAgICAgICAgICBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSB8fCBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KTtcblxuICAgICAgICByZXR1cm4gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0obSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXhwYW5kRm9ybWF0KGZvcm1hdCwgbG9jYWxlKSB7XG4gICAgICAgIHZhciBpID0gNTtcblxuICAgICAgICBmdW5jdGlvbiByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubG9uZ0RhdGVGb3JtYXQoaW5wdXQpIHx8IGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChpID49IDAgJiYgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLFxuICAgICAgICAgICAgICAgIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2Vuc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvbmdEYXRlRm9ybWF0ID0ge1xuICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgIEw6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgTEw6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICBMTEw6ICdNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsb25nRGF0ZUZvcm1hdChrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0sXG4gICAgICAgICAgICBmb3JtYXRVcHBlciA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleS50b1VwcGVyQ2FzZSgpXTtcblxuICAgICAgICBpZiAoZm9ybWF0IHx8ICFmb3JtYXRVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBmb3JtYXRVcHBlclxuICAgICAgICAgICAgLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uICh0b2spIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ01NTU0nIHx8XG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ01NJyB8fFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdERCcgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnZGRkZCdcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvay5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvaztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRJbnZhbGlkRGF0ZSA9ICdJbnZhbGlkIGRhdGUnO1xuXG4gICAgZnVuY3Rpb24gaW52YWxpZERhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZhbGlkRGF0ZTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdE9yZGluYWwgPSAnJWQnLFxuICAgICAgICBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSA9IC9cXGR7MSwyfS87XG5cbiAgICBmdW5jdGlvbiBvcmRpbmFsKG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JkaW5hbC5yZXBsYWNlKCclZCcsIG51bWJlcik7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRSZWxhdGl2ZVRpbWUgPSB7XG4gICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgdzogJ2Egd2VlaycsXG4gICAgICAgIHd3OiAnJWQgd2Vla3MnLFxuICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbc3RyaW5nXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KVxuICAgICAgICAgICAgPyBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKVxuICAgICAgICAgICAgOiBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXN0RnV0dXJlKGRpZmYsIG91dHB1dCkge1xuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW2RpZmYgPiAwID8gJ2Z1dHVyZScgOiAncGFzdCddO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihmb3JtYXQpID8gZm9ybWF0KG91dHB1dCkgOiBmb3JtYXQucmVwbGFjZSgvJXMvaSwgb3V0cHV0KTtcbiAgICB9XG5cbiAgICB2YXIgYWxpYXNlcyA9IHtcbiAgICAgICAgRDogJ2RhdGUnLFxuICAgICAgICBkYXRlczogJ2RhdGUnLFxuICAgICAgICBkYXRlOiAnZGF0ZScsXG4gICAgICAgIGQ6ICdkYXknLFxuICAgICAgICBkYXlzOiAnZGF5JyxcbiAgICAgICAgZGF5OiAnZGF5JyxcbiAgICAgICAgZTogJ3dlZWtkYXknLFxuICAgICAgICB3ZWVrZGF5czogJ3dlZWtkYXknLFxuICAgICAgICB3ZWVrZGF5OiAnd2Vla2RheScsXG4gICAgICAgIEU6ICdpc29XZWVrZGF5JyxcbiAgICAgICAgaXNvd2Vla2RheXM6ICdpc29XZWVrZGF5JyxcbiAgICAgICAgaXNvd2Vla2RheTogJ2lzb1dlZWtkYXknLFxuICAgICAgICBEREQ6ICdkYXlPZlllYXInLFxuICAgICAgICBkYXlvZnllYXJzOiAnZGF5T2ZZZWFyJyxcbiAgICAgICAgZGF5b2Z5ZWFyOiAnZGF5T2ZZZWFyJyxcbiAgICAgICAgaDogJ2hvdXInLFxuICAgICAgICBob3VyczogJ2hvdXInLFxuICAgICAgICBob3VyOiAnaG91cicsXG4gICAgICAgIG1zOiAnbWlsbGlzZWNvbmQnLFxuICAgICAgICBtaWxsaXNlY29uZHM6ICdtaWxsaXNlY29uZCcsXG4gICAgICAgIG1pbGxpc2Vjb25kOiAnbWlsbGlzZWNvbmQnLFxuICAgICAgICBtOiAnbWludXRlJyxcbiAgICAgICAgbWludXRlczogJ21pbnV0ZScsXG4gICAgICAgIG1pbnV0ZTogJ21pbnV0ZScsXG4gICAgICAgIE06ICdtb250aCcsXG4gICAgICAgIG1vbnRoczogJ21vbnRoJyxcbiAgICAgICAgbW9udGg6ICdtb250aCcsXG4gICAgICAgIFE6ICdxdWFydGVyJyxcbiAgICAgICAgcXVhcnRlcnM6ICdxdWFydGVyJyxcbiAgICAgICAgcXVhcnRlcjogJ3F1YXJ0ZXInLFxuICAgICAgICBzOiAnc2Vjb25kJyxcbiAgICAgICAgc2Vjb25kczogJ3NlY29uZCcsXG4gICAgICAgIHNlY29uZDogJ3NlY29uZCcsXG4gICAgICAgIGdnOiAnd2Vla1llYXInLFxuICAgICAgICB3ZWVreWVhcnM6ICd3ZWVrWWVhcicsXG4gICAgICAgIHdlZWt5ZWFyOiAnd2Vla1llYXInLFxuICAgICAgICBHRzogJ2lzb1dlZWtZZWFyJyxcbiAgICAgICAgaXNvd2Vla3llYXJzOiAnaXNvV2Vla1llYXInLFxuICAgICAgICBpc293ZWVreWVhcjogJ2lzb1dlZWtZZWFyJyxcbiAgICAgICAgdzogJ3dlZWsnLFxuICAgICAgICB3ZWVrczogJ3dlZWsnLFxuICAgICAgICB3ZWVrOiAnd2VlaycsXG4gICAgICAgIFc6ICdpc29XZWVrJyxcbiAgICAgICAgaXNvd2Vla3M6ICdpc29XZWVrJyxcbiAgICAgICAgaXNvd2VlazogJ2lzb1dlZWsnLFxuICAgICAgICB5OiAneWVhcicsXG4gICAgICAgIHllYXJzOiAneWVhcicsXG4gICAgICAgIHllYXI6ICd5ZWFyJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplVW5pdHModW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB1bml0cyA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gYWxpYXNlc1t1bml0c10gfHwgYWxpYXNlc1t1bml0cy50b0xvd2VyQ2FzZSgpXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0VW5pdHMoaW5wdXRPYmplY3QpIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IHt9LFxuICAgICAgICAgICAgbm9ybWFsaXplZFByb3AsXG4gICAgICAgICAgICBwcm9wO1xuXG4gICAgICAgIGZvciAocHJvcCBpbiBpbnB1dE9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoaW5wdXRPYmplY3QsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZFByb3AgPSBub3JtYWxpemVVbml0cyhwcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZElucHV0W25vcm1hbGl6ZWRQcm9wXSA9IGlucHV0T2JqZWN0W3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub3JtYWxpemVkSW5wdXQ7XG4gICAgfVxuXG4gICAgdmFyIHByaW9yaXRpZXMgPSB7XG4gICAgICAgIGRhdGU6IDksXG4gICAgICAgIGRheTogMTEsXG4gICAgICAgIHdlZWtkYXk6IDExLFxuICAgICAgICBpc29XZWVrZGF5OiAxMSxcbiAgICAgICAgZGF5T2ZZZWFyOiA0LFxuICAgICAgICBob3VyOiAxMyxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IDE2LFxuICAgICAgICBtaW51dGU6IDE0LFxuICAgICAgICBtb250aDogOCxcbiAgICAgICAgcXVhcnRlcjogNyxcbiAgICAgICAgc2Vjb25kOiAxNSxcbiAgICAgICAgd2Vla1llYXI6IDEsXG4gICAgICAgIGlzb1dlZWtZZWFyOiAxLFxuICAgICAgICB3ZWVrOiA1LFxuICAgICAgICBpc29XZWVrOiA1LFxuICAgICAgICB5ZWFyOiAxLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzT2JqKSB7XG4gICAgICAgIHZhciB1bml0cyA9IFtdLFxuICAgICAgICAgICAgdTtcbiAgICAgICAgZm9yICh1IGluIHVuaXRzT2JqKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcCh1bml0c09iaiwgdSkpIHtcbiAgICAgICAgICAgICAgICB1bml0cy5wdXNoKHsgdW5pdDogdSwgcHJpb3JpdHk6IHByaW9yaXRpZXNbdV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXRzO1xuICAgIH1cblxuICAgIHZhciBtYXRjaDEgPSAvXFxkLywgLy8gICAgICAgMCAtIDlcbiAgICAgICAgbWF0Y2gyID0gL1xcZFxcZC8sIC8vICAgICAgMDAgLSA5OVxuICAgICAgICBtYXRjaDMgPSAvXFxkezN9LywgLy8gICAgIDAwMCAtIDk5OVxuICAgICAgICBtYXRjaDQgPSAvXFxkezR9LywgLy8gICAgMDAwMCAtIDk5OTlcbiAgICAgICAgbWF0Y2g2ID0gL1srLV0/XFxkezZ9LywgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaDF0bzIgPSAvXFxkXFxkPy8sIC8vICAgICAgIDAgLSA5OVxuICAgICAgICBtYXRjaDN0bzQgPSAvXFxkXFxkXFxkXFxkPy8sIC8vICAgICA5OTkgLSA5OTk5XG4gICAgICAgIG1hdGNoNXRvNiA9IC9cXGRcXGRcXGRcXGRcXGRcXGQ/LywgLy8gICA5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaDF0bzMgPSAvXFxkezEsM30vLCAvLyAgICAgICAwIC0gOTk5XG4gICAgICAgIG1hdGNoMXRvNCA9IC9cXGR7MSw0fS8sIC8vICAgICAgIDAgLSA5OTk5XG4gICAgICAgIG1hdGNoMXRvNiA9IC9bKy1dP1xcZHsxLDZ9LywgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaFVuc2lnbmVkID0gL1xcZCsvLCAvLyAgICAgICAwIC0gaW5mXG4gICAgICAgIG1hdGNoU2lnbmVkID0gL1srLV0/XFxkKy8sIC8vICAgIC1pbmYgLSBpbmZcbiAgICAgICAgbWF0Y2hPZmZzZXQgPSAvWnxbKy1dXFxkXFxkOj9cXGRcXGQvZ2ksIC8vICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuICAgICAgICBtYXRjaFNob3J0T2Zmc2V0ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vZ2ksIC8vICswMCAtMDAgKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgICAgIG1hdGNoVGltZXN0YW1wID0gL1srLV0/XFxkKyhcXC5cXGR7MSwzfSk/LywgLy8gMTIzNDU2Nzg5IDEyMzQ1Njc4OS4xMjNcbiAgICAgICAgLy8gYW55IHdvcmQgKG9yIHR3bykgY2hhcmFjdGVycyBvciBudW1iZXJzIGluY2x1ZGluZyB0d28vdGhyZWUgd29yZCBtb250aCBpbiBhcmFiaWMuXG4gICAgICAgIC8vIGluY2x1ZGVzIHNjb3R0aXNoIGdhZWxpYyB0d28gd29yZCBhbmQgaHlwaGVuYXRlZCBtb250aHNcbiAgICAgICAgbWF0Y2hXb3JkID1cbiAgICAgICAgICAgIC9bMC05XXswLDI1Nn1bJ2EtelxcdTAwQTAtXFx1MDVGRlxcdTA3MDAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkYwN1xcdUZGMTAtXFx1RkZFRl17MSwyNTZ9fFtcXHUwNjAwLVxcdTA2RkZcXC9dezEsMjU2fShcXHMqP1tcXHUwNjAwLVxcdTA2RkZdezEsMjU2fSl7MSwyfS9pLFxuICAgICAgICBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvID0gL15bMS05XVxcZD8vLCAvLyAgICAgICAgIDEtOTlcbiAgICAgICAgbWF0Y2gxdG8ySGFzWmVybyA9IC9eKFsxLTldXFxkfFxcZCkvLCAvLyAgICAgICAgICAgMC05OVxuICAgICAgICByZWdleGVzO1xuXG4gICAgcmVnZXhlcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkUmVnZXhUb2tlbih0b2tlbiwgcmVnZXgsIHN0cmljdFJlZ2V4KSB7XG4gICAgICAgIHJlZ2V4ZXNbdG9rZW5dID0gaXNGdW5jdGlvbihyZWdleClcbiAgICAgICAgICAgID8gcmVnZXhcbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaXNTdHJpY3QgJiYgc3RyaWN0UmVnZXggPyBzdHJpY3RSZWdleCA6IHJlZ2V4O1xuICAgICAgICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcmVnZXhFc2NhcGUoXG4gICAgICAgICAgICBzXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1xcXFwnLCAnJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZyxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDEgfHwgcDIgfHwgcDMgfHwgcDQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVnZXhFc2NhcGUocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNGbG9vcihudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIC0wIC0+IDBcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKSB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW50KGFyZ3VtZW50Rm9yQ29lcmNpb24pIHtcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcbiAgICAgICAgICAgIHZhbHVlID0gMDtcblxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBhYnNGbG9vcihjb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgdG9rZW5zID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRQYXJzZVRva2VuKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGZ1bmMgPSBjYWxsYmFjayxcbiAgICAgICAgICAgIHRva2VuTGVuO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdG9rZW4gPSBbdG9rZW5dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWJlcihjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbY2FsbGJhY2tdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbkxlbiA9IHRva2VuLmxlbmd0aDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2VuTGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbltpXV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1BhcnNlVG9rZW4odG9rZW4sIGNhbGxiYWNrKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgICAgIGNvbmZpZy5fdyA9IGNvbmZpZy5fdyB8fCB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGlucHV0LCBjb25maWcuX3csIGNvbmZpZywgdG9rZW4pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgaW5wdXQsIGNvbmZpZykge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBoYXNPd25Qcm9wKHRva2VucywgdG9rZW4pKSB7XG4gICAgICAgICAgICB0b2tlbnNbdG9rZW5dKGlucHV0LCBjb25maWcuX2EsIGNvbmZpZywgdG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gICAgICAgIHJldHVybiAoeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCkgfHwgeWVhciAlIDQwMCA9PT0gMDtcbiAgICB9XG5cbiAgICB2YXIgWUVBUiA9IDAsXG4gICAgICAgIE1PTlRIID0gMSxcbiAgICAgICAgREFURSA9IDIsXG4gICAgICAgIEhPVVIgPSAzLFxuICAgICAgICBNSU5VVEUgPSA0LFxuICAgICAgICBTRUNPTkQgPSA1LFxuICAgICAgICBNSUxMSVNFQ09ORCA9IDYsXG4gICAgICAgIFdFRUsgPSA3LFxuICAgICAgICBXRUVLREFZID0gODtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdZJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueWVhcigpO1xuICAgICAgICByZXR1cm4geSA8PSA5OTk5ID8gemVyb0ZpbGwoeSwgNCkgOiAnKycgKyB5O1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWScsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWScsIDRdLCAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVknLCA1XSwgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZWScsIDYsIHRydWVdLCAwLCAneWVhcicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWScsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZJywgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbignWVlZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPVxuICAgICAgICAgICAgaW5wdXQubGVuZ3RoID09PSAyID8gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpIDogdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1lZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICBmdW5jdGlvbiBkYXlzSW5ZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIoeWVhcikgPyAzNjYgOiAzNjU7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0b0ludChpbnB1dCkgKyAodG9JbnQoaW5wdXQpID4gNjggPyAxOTAwIDogMjAwMCk7XG4gICAgfTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRZZWFyID0gbWFrZUdldFNldCgnRnVsbFllYXInLCB0cnVlKTtcblxuICAgIGZ1bmN0aW9uIGdldElzTGVhcFllYXIoKSB7XG4gICAgICAgIHJldHVybiBpc0xlYXBZZWFyKHRoaXMueWVhcigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlR2V0U2V0KHVuaXQsIGtlZXBUaW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0JDEodGhpcywgdW5pdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCBrZWVwVGltZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0KG1vbSwgdW5pdCkge1xuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZCA9IG1vbS5fZCxcbiAgICAgICAgICAgIGlzVVRDID0gbW9tLl9pc1VUQztcblxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ01pbGxpc2Vjb25kcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENNaWxsaXNlY29uZHMoKSA6IGQuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgICAgICAgICBjYXNlICdTZWNvbmRzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ1NlY29uZHMoKSA6IGQuZ2V0U2Vjb25kcygpO1xuICAgICAgICAgICAgY2FzZSAnTWludXRlcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENNaW51dGVzKCkgOiBkLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgIGNhc2UgJ0hvdXJzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ0hvdXJzKCkgOiBkLmdldEhvdXJzKCk7XG4gICAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ0RhdGUoKSA6IGQuZ2V0RGF0ZSgpO1xuICAgICAgICAgICAgY2FzZSAnRGF5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ0RheSgpIDogZC5nZXREYXkoKTtcbiAgICAgICAgICAgIGNhc2UgJ01vbnRoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ01vbnRoKCkgOiBkLmdldE1vbnRoKCk7XG4gICAgICAgICAgICBjYXNlICdGdWxsWWVhcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENGdWxsWWVhcigpIDogZC5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gTmFOOyAvLyBKdXN0IGluIGNhc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCQxKG1vbSwgdW5pdCwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGQsIGlzVVRDLCB5ZWFyLCBtb250aCwgZGF0ZTtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkgfHwgaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkID0gbW9tLl9kO1xuICAgICAgICBpc1VUQyA9IG1vbS5faXNVVEM7XG5cbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdNaWxsaXNlY29uZHMnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChpc1VUQ1xuICAgICAgICAgICAgICAgICAgICA/IGQuc2V0VVRDTWlsbGlzZWNvbmRzKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA6IGQuc2V0TWlsbGlzZWNvbmRzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdTZWNvbmRzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ1NlY29uZHModmFsdWUpIDogZC5zZXRTZWNvbmRzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdNaW51dGVzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ01pbnV0ZXModmFsdWUpIDogZC5zZXRNaW51dGVzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdIb3Vycyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKGlzVVRDID8gZC5zZXRVVENIb3Vycyh2YWx1ZSkgOiBkLnNldEhvdXJzKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ0RhdGUodmFsdWUpIDogZC5zZXREYXRlKHZhbHVlKSk7XG4gICAgICAgICAgICAvLyBjYXNlICdEYXknOiAvLyBOb3QgcmVhbFxuICAgICAgICAgICAgLy8gICAgcmV0dXJuIHZvaWQgKGlzVVRDID8gZC5zZXRVVENEYXkodmFsdWUpIDogZC5zZXREYXkodmFsdWUpKTtcbiAgICAgICAgICAgIC8vIGNhc2UgJ01vbnRoJzogLy8gTm90IHVzZWQgYmVjYXVzZSB3ZSBuZWVkIHRvIHBhc3MgdHdvIHZhcmlhYmxlc1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB2b2lkIChpc1VUQyA/IGQuc2V0VVRDTW9udGgodmFsdWUpIDogZC5zZXRNb250aCh2YWx1ZSkpO1xuICAgICAgICAgICAgY2FzZSAnRnVsbFllYXInOlxuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBTZWUgYmVsb3cgLi4uXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSnVzdCBpbiBjYXNlXG4gICAgICAgIH1cblxuICAgICAgICB5ZWFyID0gdmFsdWU7XG4gICAgICAgIG1vbnRoID0gbW9tLm1vbnRoKCk7XG4gICAgICAgIGRhdGUgPSBtb20uZGF0ZSgpO1xuICAgICAgICBkYXRlID0gZGF0ZSA9PT0gMjkgJiYgbW9udGggPT09IDEgJiYgIWlzTGVhcFllYXIoeWVhcikgPyAyOCA6IGRhdGU7XG4gICAgICAgIHZvaWQgKGlzVVRDXG4gICAgICAgICAgICA/IGQuc2V0VVRDRnVsbFllYXIoeWVhciwgbW9udGgsIGRhdGUpXG4gICAgICAgICAgICA6IGQuc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIGRhdGUpKTtcbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzdHJpbmdHZXQodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RyaW5nU2V0KHVuaXRzLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHVuaXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVPYmplY3RVbml0cyh1bml0cyk7XG4gICAgICAgICAgICB2YXIgcHJpb3JpdGl6ZWQgPSBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzKSxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIHByaW9yaXRpemVkTGVuID0gcHJpb3JpdGl6ZWQubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHByaW9yaXRpemVkTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzW3ByaW9yaXRpemVkW2ldLnVuaXRdKHVuaXRzW3ByaW9yaXRpemVkW2ldLnVuaXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb2QobiwgeCkge1xuICAgICAgICByZXR1cm4gKChuICUgeCkgKyB4KSAlIHg7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4T2Y7XG5cbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgICAgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4T2YgPSBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgLy8gSSBrbm93XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1vZE1vbnRoID0gbW9kKG1vbnRoLCAxMik7XG4gICAgICAgIHllYXIgKz0gKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG4gICAgICAgIHJldHVybiBtb2RNb250aCA9PT0gMVxuICAgICAgICAgICAgPyBpc0xlYXBZZWFyKHllYXIpXG4gICAgICAgICAgICAgICAgPyAyOVxuICAgICAgICAgICAgICAgIDogMjhcbiAgICAgICAgICAgIDogMzEgLSAoKG1vZE1vbnRoICUgNykgJSAyKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignTScsIFsnTU0nLCAyXSwgJ01vJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aCgpICsgMTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ00nLCBtYXRjaDF0bzIsIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ00nLCAnTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSB0b0ludChpbnB1dCkgLSAxO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ01NTScsICdNTU1NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIG1vbnRoID0gY29uZmlnLl9sb2NhbGUubW9udGhzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgbW9udGggbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkLlxuICAgICAgICBpZiAobW9udGggIT0gbnVsbCkge1xuICAgICAgICAgICAgYXJyYXlbTU9OVEhdID0gbW9udGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkTW9udGggPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNb250aHMgPVxuICAgICAgICAgICAgJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0ID1cbiAgICAgICAgICAgICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgTU9OVEhTX0lOX0ZPUk1BVCA9IC9EW29EXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK01NTU0/LyxcbiAgICAgICAgZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXggPSBtYXRjaFdvcmQsXG4gICAgICAgIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRocyhtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHMpXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocylcbiAgICAgICAgICAgID8gdGhpcy5fbW9udGhzW20ubW9udGgoKV1cbiAgICAgICAgICAgIDogdGhpcy5fbW9udGhzW1xuICAgICAgICAgICAgICAgICAgKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgICA/ICdmb3JtYXQnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnc3RhbmRhbG9uZSdcbiAgICAgICAgICAgICAgXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0KG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRoc1Nob3J0KVxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU2hvcnRcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1Nob3J0WydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzU2hvcnQpXG4gICAgICAgICAgICA/IHRoaXMuX21vbnRoc1Nob3J0W20ubW9udGgoKV1cbiAgICAgICAgICAgIDogdGhpcy5fbW9udGhzU2hvcnRbXG4gICAgICAgICAgICAgICAgICBNT05USFNfSU5fRk9STUFULnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF1bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgaWksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBsbGMgPSBtb250aE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgdXNlZFxuICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gdGhpcy5tb250aHNTaG9ydChcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRocyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU3RyaWN0UGFyc2UuY2FsbCh0aGlzLCBtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IGFkZCBzb3J0aW5nXG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXJcbiAgICAgICAgLy8gc2VlIHNvcnRpbmcgaW4gY29tcHV0ZU1vbnRoc1BhcnNlXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdHJpY3QgJiYgIXRoaXMuX21vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKSArICd8XicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdNTU1NJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdNTU0nICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX21vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gc2V0TW9udGgobW9tLCB2YWx1ZSkge1xuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbW9udGggPSB2YWx1ZSxcbiAgICAgICAgICAgIGRhdGUgPSBtb20uZGF0ZSgpO1xuXG4gICAgICAgIGRhdGUgPSBkYXRlIDwgMjkgPyBkYXRlIDogTWF0aC5taW4oZGF0ZSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgbW9udGgpKTtcbiAgICAgICAgdm9pZCAobW9tLl9pc1VUQ1xuICAgICAgICAgICAgPyBtb20uX2Quc2V0VVRDTW9udGgobW9udGgsIGRhdGUpXG4gICAgICAgICAgICA6IG1vbS5fZC5zZXRNb250aChtb250aCwgZGF0ZSkpO1xuICAgICAgICByZXR1cm4gbW9tO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldE1vbnRoKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBzZXRNb250aCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgJ01vbnRoJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXlzSW5Nb250aCgpIHtcbiAgICAgICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1Nob3J0UmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1Nob3J0UmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSBkZWZhdWx0TW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1JlZ2V4ID0gZGVmYXVsdE1vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlTW9udGhzUGFyc2UoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaG9ydFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbG9uZ1BpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBzaG9ydFAsXG4gICAgICAgICAgICBsb25nUDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBzaG9ydFAgPSByZWdleEVzY2FwZSh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgICAgIGxvbmdQID0gcmVnZXhFc2NhcGUodGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgc2hvcnRQaWVjZXMucHVzaChzaG9ydFApO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKGxvbmdQKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobG9uZ1ApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydFApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG5cbiAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpIHtcbiAgICAgICAgLy8gY2FuJ3QganVzdCBhcHBseSgpIHRvIGNyZWF0ZSBhIGRhdGU6XG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8xODEzNDhcbiAgICAgICAgdmFyIGRhdGU7XG4gICAgICAgIC8vIHRoZSBkYXRlIGNvbnN0cnVjdG9yIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoeSArIDQwMCwgbSwgZCwgaCwgTSwgcywgbXMpO1xuICAgICAgICAgICAgaWYgKGlzRmluaXRlKGRhdGUuZ2V0RnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVUQ0RhdGUoeSkge1xuICAgICAgICB2YXIgZGF0ZSwgYXJncztcbiAgICAgICAgLy8gdGhlIERhdGUuVVRDIGZ1bmN0aW9uIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIGFyZ3NbMF0gPSB5ICsgNDAwO1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3MpKTtcbiAgICAgICAgICAgIGlmIChpc0Zpbml0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpKSB7XG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0LW9mLWZpcnN0LXdlZWsgLSBzdGFydC1vZi15ZWFyXG4gICAgZnVuY3Rpb24gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciAvLyBmaXJzdC13ZWVrIGRheSAtLSB3aGljaCBqYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayAoNCBmb3IgaXNvLCAxIGZvciBvdGhlcilcbiAgICAgICAgICAgIGZ3ZCA9IDcgKyBkb3cgLSBkb3ksXG4gICAgICAgICAgICAvLyBmaXJzdC13ZWVrIGRheSBsb2NhbCB3ZWVrZGF5IC0tIHdoaWNoIGxvY2FsIHdlZWtkYXkgaXMgZndkXG4gICAgICAgICAgICBmd2RsdyA9ICg3ICsgY3JlYXRlVVRDRGF0ZSh5ZWFyLCAwLCBmd2QpLmdldFVUQ0RheSgpIC0gZG93KSAlIDc7XG5cbiAgICAgICAgcmV0dXJuIC1md2RsdyArIGZ3ZCAtIDE7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZSNDYWxjdWxhdGluZ19hX2RhdGVfZ2l2ZW5fdGhlX3llYXIuMkNfd2Vla19udW1iZXJfYW5kX3dlZWtkYXlcbiAgICBmdW5jdGlvbiBkYXlPZlllYXJGcm9tV2Vla3MoeWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGxvY2FsV2Vla2RheSA9ICg3ICsgd2Vla2RheSAtIGRvdykgJSA3LFxuICAgICAgICAgICAgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXlPZlllYXIgPSAxICsgNyAqICh3ZWVrIC0gMSkgKyBsb2NhbFdlZWtkYXkgKyB3ZWVrT2Zmc2V0LFxuICAgICAgICAgICAgcmVzWWVhcixcbiAgICAgICAgICAgIHJlc0RheU9mWWVhcjtcblxuICAgICAgICBpZiAoZGF5T2ZZZWFyIDw9IDApIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyKSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgICAgICBkYXlPZlllYXI6IHJlc0RheU9mWWVhcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrT2ZZZWFyKG1vbSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQobW9tLnllYXIoKSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgd2VlayA9IE1hdGguZmxvb3IoKG1vbS5kYXlPZlllYXIoKSAtIHdlZWtPZmZzZXQgLSAxKSAvIDcpICsgMSxcbiAgICAgICAgICAgIHJlc1dlZWssXG4gICAgICAgICAgICByZXNZZWFyO1xuXG4gICAgICAgIGlmICh3ZWVrIDwgMSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgLSAxO1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgKyB3ZWVrc0luWWVhcihyZXNZZWFyLCBkb3csIGRveSk7XG4gICAgICAgIH0gZWxzZSBpZiAod2VlayA+IHdlZWtzSW5ZZWFyKG1vbS55ZWFyKCksIGRvdywgZG95KSkge1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgLSB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSk7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdlZWs6IHJlc1dlZWssXG4gICAgICAgICAgICB5ZWFyOiByZXNZZWFyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWtPZmZzZXROZXh0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIgKyAxLCBkb3csIGRveSk7XG4gICAgICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd3JywgWyd3dycsIDJdLCAnd28nLCAnd2VlaycpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdXJywgWydXVycsIDJdLCAnV28nLCAnaXNvV2VlaycpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigndycsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignd3cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignVycsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignV1cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihcbiAgICAgICAgWyd3JywgJ3d3JywgJ1cnLCAnV1cnXSxcbiAgICAgICAgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAxKV0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vlayhtb20pIHtcbiAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIobW9tLCB0aGlzLl93ZWVrLmRvdywgdGhpcy5fd2Vlay5kb3kpLndlZWs7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrID0ge1xuICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZldlZWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG95O1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWsoaW5wdXQpIHtcbiAgICAgICAgdmFyIHdlZWsgPSB0aGlzLmxvY2FsZURhdGEoKS53ZWVrKHRoaXMpO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2VlayhpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHdlZWtPZlllYXIodGhpcywgMSwgNCkud2VlaztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkJywgMCwgJ2RvJywgJ2RheScpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGRkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZScsIDAsIDAsICd3ZWVrZGF5Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ0UnLCAwLCAwLCAnaXNvV2Vla2RheScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignZCcsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZScsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignRScsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZGQnLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzTWluUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZCcsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNTaG9ydFJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdkZGRkJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZGQnLCAnZGRkJywgJ2RkZGQnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gY29uZmlnLl9sb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIHdlZWtkYXkgbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkXG4gICAgICAgIGlmICh3ZWVrZGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdlZWsuZCA9IHdlZWtkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkV2Vla2RheSA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2QnLCAnZScsICdFJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmFOKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dCA9IGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpICUgNyB8fCA3O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc05hTihpbnB1dCkgPyBudWxsIDogaW5wdXQ7XG4gICAgfVxuXG4gICAgLy8gTE9DQUxFU1xuICAgIGZ1bmN0aW9uIHNoaWZ0V2Vla2RheXMod3MsIG4pIHtcbiAgICAgICAgcmV0dXJuIHdzLnNsaWNlKG4sIDcpLmNvbmNhdCh3cy5zbGljZSgwLCBuKSk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5cyA9XG4gICAgICAgICAgICAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyksXG4gICAgICAgIGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0ID0gJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluID0gJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBkZWZhdWx0V2Vla2RheXNSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzTWluUmVnZXggPSBtYXRjaFdvcmQ7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5cyhtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIHdlZWtkYXlzID0gaXNBcnJheSh0aGlzLl93ZWVrZGF5cylcbiAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNcbiAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNbXG4gICAgICAgICAgICAgICAgICBtICYmIG0gIT09IHRydWUgJiYgdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChmb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgICAgPyAnZm9ybWF0J1xuICAgICAgICAgICAgICAgICAgICAgIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF07XG4gICAgICAgIHJldHVybiBtID09PSB0cnVlXG4gICAgICAgICAgICA/IHNoaWZ0V2Vla2RheXMod2Vla2RheXMsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICAgID8gd2Vla2RheXNbbS5kYXkoKV1cbiAgICAgICAgICAgICAgOiB3ZWVrZGF5cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1Nob3J0KG0pIHtcbiAgICAgICAgcmV0dXJuIG0gPT09IHRydWVcbiAgICAgICAgICAgID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c1Nob3J0LCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogbVxuICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzU2hvcnRbbS5kYXkoKV1cbiAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c1Nob3J0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzTWluKG0pIHtcbiAgICAgICAgcmV0dXJuIG0gPT09IHRydWVcbiAgICAgICAgICAgID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c01pbiwgdGhpcy5fd2Vlay5kb3cpXG4gICAgICAgICAgICA6IG1cbiAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c01pblttLmRheSgpXVxuICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzTWluO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVN0cmljdFBhcnNlJDEod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgaWksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBsbGMgPSB3ZWVrZGF5TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzTWluKFxuICAgICAgICAgICAgICAgICAgICBtb20sXG4gICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNTaG9ydChcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlJDEuY2FsbCh0aGlzLCB3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcblxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAnXicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzKG1vbSwgJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ3xeJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSArXG4gICAgICAgICAgICAgICAgICAgICd8XicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ2RkZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdkZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZXZWVrKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXkgPSBnZXQodGhpcywgJ0RheScpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaW5wdXQgPSBwYXJzZVdlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZChpbnB1dCAtIGRheSwgJ2QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRMb2NhbGVEYXlPZldlZWsoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gKHRoaXMuZGF5KCkgKyA3IC0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93KSAlIDc7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2Vla2RheSA6IHRoaXMuYWRkKGlucHV0IC0gd2Vla2RheSwgJ2QnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09EYXlPZldlZWsoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYmVoYXZlcyB0aGUgc2FtZSBhcyBtb21lbnQjZGF5IGV4Y2VwdFxuICAgICAgICAvLyBhcyBhIGdldHRlciwgcmV0dXJucyA3IGluc3RlYWQgb2YgMCAoMS03IHJhbmdlIGluc3RlYWQgb2YgMC02KVxuICAgICAgICAvLyBhcyBhIHNldHRlciwgc3VuZGF5IHNob3VsZCBiZWxvbmcgdG8gdGhlIHByZXZpb3VzIHdlZWsuXG5cbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciB3ZWVrZGF5ID0gcGFyc2VJc29XZWVrZGF5KGlucHV0LCB0aGlzLmxvY2FsZURhdGEoKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkodGhpcy5kYXkoKSAlIDcgPyB3ZWVrZGF5IDogd2Vla2RheSAtIDcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgfHwgNztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUmVnZXggPSBkZWZhdWx0V2Vla2RheXNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla2RheXNTaG9ydFJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c01pblJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c01pblJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVXZWVrZGF5c1BhcnNlKCkge1xuICAgICAgICBmdW5jdGlvbiBjbXBMZW5SZXYoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWluUGllY2VzID0gW10sXG4gICAgICAgICAgICBzaG9ydFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbG9uZ1BpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBtaW5wLFxuICAgICAgICAgICAgc2hvcnRwLFxuICAgICAgICAgICAgbG9uZ3A7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgbWlucCA9IHJlZ2V4RXNjYXBlKHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykpO1xuICAgICAgICAgICAgc2hvcnRwID0gcmVnZXhFc2NhcGUodGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgICAgIGxvbmdwID0gcmVnZXhFc2NhcGUodGhpcy53ZWVrZGF5cyhtb20sICcnKSk7XG4gICAgICAgICAgICBtaW5QaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSB3ZWVrZGF5IChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgbWluUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuXG4gICAgICAgIHRoaXMuX3dlZWtkYXlzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluUmVnZXggPSB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuXG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIG1pblBpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBmdW5jdGlvbiBoRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpICUgMTIgfHwgMTI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga0Zvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG91cnMoKSB8fCAyNDtcbiAgICB9XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSCcsIFsnSEgnLCAyXSwgMCwgJ2hvdXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignaCcsIFsnaGgnLCAyXSwgMCwgaEZvcm1hdCk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ2snLCBbJ2trJywgMl0sIDAsIGtGb3JtYXQpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgaEZvcm1hdC5hcHBseSh0aGlzKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdobW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICcnICtcbiAgICAgICAgICAgIGhGb3JtYXQuYXBwbHkodGhpcykgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0htbScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgJycgK1xuICAgICAgICAgICAgdGhpcy5ob3VycygpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLnNlY29uZHMoKSwgMilcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtKHRva2VuLCBsb3dlcmNhc2UpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tZXJpZGllbShcbiAgICAgICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICAgICAgbG93ZXJjYXNlXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBtZXJpZGllbSgnYScsIHRydWUpO1xuICAgIG1lcmlkaWVtKCdBJywgZmFsc2UpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgZnVuY3Rpb24gbWF0Y2hNZXJpZGllbShpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuX21lcmlkaWVtUGFyc2U7XG4gICAgfVxuXG4gICAgYWRkUmVnZXhUb2tlbignYScsIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0EnLCBtYXRjaE1lcmlkaWVtKTtcbiAgICBhZGRSZWdleFRva2VuKCdIJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJIYXNaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdoJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdrJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdISCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdoaCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdraycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbScsIG1hdGNoM3RvNCk7XG4gICAgYWRkUmVnZXhUb2tlbignaG1tc3MnLCBtYXRjaDV0bzYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbScsIG1hdGNoM3RvNCk7XG4gICAgYWRkUmVnZXhUb2tlbignSG1tc3MnLCBtYXRjaDV0bzYpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0gnLCAnSEgnXSwgSE9VUik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2snLCAna2snXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBrSW5wdXQgPSB0b0ludChpbnB1dCk7XG4gICAgICAgIGFycmF5W0hPVVJdID0ga0lucHV0ID09PSAyNCA/IDAgOiBrSW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2EnLCAnQSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9pc1BtID0gY29uZmlnLl9sb2NhbGUuaXNQTShpbnB1dCk7XG4gICAgICAgIGNvbmZpZy5fbWVyaWRpZW0gPSBpbnB1dDtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnaCcsICdoaCddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ2htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ2htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MxID0gaW5wdXQubGVuZ3RoIC0gNCxcbiAgICAgICAgICAgIHBvczIgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMSwgMikpO1xuICAgICAgICBhcnJheVtTRUNPTkRdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczIpKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MpKTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdIbW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQsXG4gICAgICAgICAgICBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgfSk7XG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICBmdW5jdGlvbiBsb2NhbGVJc1BNKGlucHV0KSB7XG4gICAgICAgIC8vIElFOCBRdWlya3MgTW9kZSAmIElFNyBTdGFuZGFyZHMgTW9kZSBkbyBub3QgYWxsb3cgYWNjZXNzaW5nIHN0cmluZ3MgbGlrZSBhcnJheXNcbiAgICAgICAgLy8gVXNpbmcgY2hhckF0IHNob3VsZCBiZSBtb3JlIGNvbXBhdGlibGUuXG4gICAgICAgIHJldHVybiAoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkgPT09ICdwJztcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1lcmlkaWVtUGFyc2UgPSAvW2FwXVxcLj9tP1xcLj8vaSxcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4gICAgICAgIC8vIHNwZWNpZmllZCB3aGljaCBob3VyIHRoZXkgd2FudC4gU28gdHJ5aW5nIHRvIG1haW50YWluIHRoZSBzYW1lIGhvdXIgKGluXG4gICAgICAgIC8vIGEgbmV3IHRpbWV6b25lKSBtYWtlcyBzZW5zZS4gQWRkaW5nL3N1YnRyYWN0aW5nIGhvdXJzIGRvZXMgbm90IGZvbGxvd1xuICAgICAgICAvLyB0aGlzIHJ1bGUuXG4gICAgICAgIGdldFNldEhvdXIgPSBtYWtlR2V0U2V0KCdIb3VycycsIHRydWUpO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlTWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3BtJyA6ICdQTSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdhbScgOiAnQU0nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJhc2VDb25maWcgPSB7XG4gICAgICAgIGNhbGVuZGFyOiBkZWZhdWx0Q2FsZW5kYXIsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQsXG4gICAgICAgIGludmFsaWREYXRlOiBkZWZhdWx0SW52YWxpZERhdGUsXG4gICAgICAgIG9yZGluYWw6IGRlZmF1bHRPcmRpbmFsLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiBkZWZhdWx0UmVsYXRpdmVUaW1lLFxuXG4gICAgICAgIG1vbnRoczogZGVmYXVsdExvY2FsZU1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCxcblxuICAgICAgICB3ZWVrOiBkZWZhdWx0TG9jYWxlV2VlayxcblxuICAgICAgICB3ZWVrZGF5czogZGVmYXVsdExvY2FsZVdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZSxcbiAgICB9O1xuXG4gICAgLy8gaW50ZXJuYWwgc3RvcmFnZSBmb3IgbG9jYWxlIGNvbmZpZyBmaWxlc1xuICAgIHZhciBsb2NhbGVzID0ge30sXG4gICAgICAgIGxvY2FsZUZhbWlsaWVzID0ge30sXG4gICAgICAgIGdsb2JhbExvY2FsZTtcblxuICAgIGZ1bmN0aW9uIGNvbW1vblByZWZpeChhcnIxLCBhcnIyKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbWlubCA9IE1hdGgubWluKGFycjEubGVuZ3RoLCBhcnIyLmxlbmd0aCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtaW5sOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChhcnIxW2ldICE9PSBhcnIyW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbmw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4gICAgLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAvLyBzdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICAgIGosXG4gICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgc3BsaXQ7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNwbGl0ID0gbm9ybWFsaXplTG9jYWxlKG5hbWVzW2ldKS5zcGxpdCgnLScpO1xuICAgICAgICAgICAgaiA9IHNwbGl0Lmxlbmd0aDtcbiAgICAgICAgICAgIG5leHQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaSArIDFdKTtcbiAgICAgICAgICAgIG5leHQgPSBuZXh0ID8gbmV4dC5zcGxpdCgnLScpIDogbnVsbDtcbiAgICAgICAgICAgIHdoaWxlIChqID4gMCkge1xuICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoc3BsaXQuc2xpY2UoMCwgaikuam9pbignLScpKTtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbmV4dCAmJlxuICAgICAgICAgICAgICAgICAgICBuZXh0Lmxlbmd0aCA+PSBqICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vblByZWZpeChzcGxpdCwgbmV4dCkgPj0gaiAtIDFcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy90aGUgbmV4dCBhcnJheSBpdGVtIGlzIGJldHRlciB0aGFuIGEgc2hhbGxvd2VyIHN1YnN0cmluZyBvZiB0aGlzIG9uZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMb2NhbGVOYW1lU2FuZShuYW1lKSB7XG4gICAgICAgIC8vIFByZXZlbnQgbmFtZXMgdGhhdCBsb29rIGxpa2UgZmlsZXN5c3RlbSBwYXRocywgaS5lIGNvbnRhaW4gJy8nIG9yICdcXCdcbiAgICAgICAgLy8gRW5zdXJlIG5hbWUgaXMgYXZhaWxhYmxlIGFuZCBmdW5jdGlvbiByZXR1cm5zIGJvb2xlYW5cbiAgICAgICAgcmV0dXJuICEhKG5hbWUgJiYgbmFtZS5tYXRjaCgnXlteL1xcXFxcXFxcXSokJykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvYWRMb2NhbGUobmFtZSkge1xuICAgICAgICB2YXIgb2xkTG9jYWxlID0gbnVsbCxcbiAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlO1xuICAgICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byByZWdpc3RlciBhbmQgbG9hZCBhbGwgdGhlIGxvY2FsZXMgaW4gTm9kZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBtb2R1bGUgJiZcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzICYmXG4gICAgICAgICAgICBpc0xvY2FsZU5hbWVTYW5lKG5hbWUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvbGRMb2NhbGUgPSBnbG9iYWxMb2NhbGUuX2FiYnI7XG4gICAgICAgICAgICAgICAgYWxpYXNlZFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyBub3QgZm91bmQgdG8gYXZvaWQgcmVwZWF0aW5nIGV4cGVuc2l2ZSBmaWxlIHJlcXVpcmUgY2FsbCBjYXVzaW5nIGhpZ2ggQ1BVXG4gICAgICAgICAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gZmluZCBlbi1VUywgZW5fVVMsIGVuLXVzIGZvciBldmVyeSBmb3JtYXQgY2FsbFxuICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBudWxsOyAvLyBudWxsIG1lYW5zIG5vdCBmb3VuZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBmdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUoa2V5LCB2YWx1ZXMpIHtcbiAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGdldExvY2FsZShrZXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGVmaW5lTG9jYWxlKGtleSwgdmFsdWVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBtb21lbnQuZHVyYXRpb24uX2xvY2FsZSA9IG1vbWVudC5fbG9jYWxlID0gZGF0YTtcbiAgICAgICAgICAgICAgICBnbG9iYWxMb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICAvL3dhcm4gdXNlciBpZiBhcmd1bWVudHMgYXJlIHBhc3NlZCBidXQgdGhlIGxvY2FsZSBjb3VsZCBub3QgYmUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICdMb2NhbGUgJyArIGtleSArICcgbm90IGZvdW5kLiBEaWQgeW91IGZvcmdldCB0byBsb2FkIGl0PydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmluZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSxcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZShcbiAgICAgICAgICAgICAgICAgICAgJ2RlZmluZUxvY2FsZU92ZXJyaWRlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3VzZSBtb21lbnQudXBkYXRlTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgdG8gY2hhbmdlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kZWZpbmUtbG9jYWxlLyBmb3IgbW9yZSBpbmZvLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShjb25maWcucGFyZW50TG9jYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbmV3IExvY2FsZShtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjb25maWcpKTtcblxuICAgICAgICAgICAgaWYgKGxvY2FsZUZhbWlsaWVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVMb2NhbGUoeC5uYW1lLCB4LmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIG5vdzogYWxzbyBzZXQgdGhlIGxvY2FsZVxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHNldCB0aGUgbG9jYWxlIEFGVEVSIGFsbCBjaGlsZCBsb2NhbGVzIGhhdmUgYmVlblxuICAgICAgICAgICAgLy8gY3JlYXRlZCwgc28gd2Ugd29uJ3QgZW5kIHVwIHdpdGggdGhlIGNoaWxkIGxvY2FsZSBzZXQuXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdXNlZnVsIGZvciB0ZXN0aW5nXG4gICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlTG9jYWxlKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUsXG4gICAgICAgICAgICAgICAgdG1wTG9jYWxlLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG5cbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwgJiYgbG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBjaGlsZCBsb2NhbGUgaW4tcGxhY2UgdG8gYXZvaWQgbWVtb3J5LWxlYWtzXG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXS5zZXQobWVyZ2VDb25maWdzKGxvY2FsZXNbbmFtZV0uX2NvbmZpZywgY29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1FUkdFXG4gICAgICAgICAgICAgICAgdG1wTG9jYWxlID0gbG9hZExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodG1wTG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gdG1wTG9jYWxlLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaWYgKHRtcExvY2FsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZUxvY2FsZSBpcyBjYWxsZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZVxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYWJiciBzbyBpdCB3aWxsIGhhdmUgYSBuYW1lIChnZXR0ZXJzIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQgb3RoZXJ3aXNlKS5cbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgbG9jYWxlLnBhcmVudExvY2FsZSA9IGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGdldFNldEdsb2JhbExvY2FsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGdldExvY2FsZShrZXkpIHtcbiAgICAgICAgdmFyIGxvY2FsZTtcblxuICAgICAgICBpZiAoa2V5ICYmIGtleS5fbG9jYWxlICYmIGtleS5fbG9jYWxlLl9hYmJyKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXkuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgIC8vc2hvcnQtY2lyY3VpdCBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5ID0gW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hvb3NlTG9jYWxlKGtleSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdExvY2FsZXMoKSB7XG4gICAgICAgIHJldHVybiBrZXlzKGxvY2FsZXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3cobSkge1xuICAgICAgICB2YXIgb3ZlcmZsb3csXG4gICAgICAgICAgICBhID0gbS5fYTtcblxuICAgICAgICBpZiAoYSAmJiBnZXRQYXJzaW5nRmxhZ3MobSkub3ZlcmZsb3cgPT09IC0yKSB7XG4gICAgICAgICAgICBvdmVyZmxvdyA9XG4gICAgICAgICAgICAgICAgYVtNT05USF0gPCAwIHx8IGFbTU9OVEhdID4gMTFcbiAgICAgICAgICAgICAgICAgICAgPyBNT05USFxuICAgICAgICAgICAgICAgICAgICA6IGFbREFURV0gPCAxIHx8IGFbREFURV0gPiBkYXlzSW5Nb250aChhW1lFQVJdLCBhW01PTlRIXSlcbiAgICAgICAgICAgICAgICAgICAgICA/IERBVEVcbiAgICAgICAgICAgICAgICAgICAgICA6IGFbSE9VUl0gPCAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFbSE9VUl0gPiAyNCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoYVtIT1VSXSA9PT0gMjQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhW01JTlVURV0gIT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW1NFQ09ORF0gIT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW01JTExJU0VDT05EXSAhPT0gMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IEhPVVJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYVtNSU5VVEVdIDwgMCB8fCBhW01JTlVURV0gPiA1OVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1JTlVURVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFbU0VDT05EXSA8IDAgfHwgYVtTRUNPTkRdID4gNTlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFQ09ORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYVtNSUxMSVNFQ09ORF0gPCAwIHx8IGFbTUlMTElTRUNPTkRdID4gOTk5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1JTExJU0VDT05EXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC0xO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd0RheU9mWWVhciAmJlxuICAgICAgICAgICAgICAgIChvdmVyZmxvdyA8IFlFQVIgfHwgb3ZlcmZsb3cgPiBEQVRFKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBEQVRFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dXZWVrcyAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtkYXkgJiYgb3ZlcmZsb3cgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLREFZO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkub3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIC8vIGlzbyA4NjAxIHJlZ2V4XG4gICAgLy8gMDAwMC0wMC0wMCAwMDAwLVcwMCBvciAwMDAwLVcwMC0wICsgVCArIDAwIG9yIDAwOjAwIG9yIDAwOjAwOjAwIG9yIDAwOjAwOjAwLjAwMCArICswMDowMCBvciArMDAwMCBvciArMDApXG4gICAgdmFyIGV4dGVuZGVkSXNvUmVnZXggPVxuICAgICAgICAgICAgL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoWystXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC8sXG4gICAgICAgIGJhc2ljSXNvUmVnZXggPVxuICAgICAgICAgICAgL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KSg/OlxcZFxcZFxcZFxcZHxXXFxkXFxkXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZHwpKSg/OihUfCApKFxcZFxcZCg/OlxcZFxcZCg/OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbKy1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLyxcbiAgICAgICAgdHpSZWdleCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/LyxcbiAgICAgICAgaXNvRGF0ZXMgPSBbXG4gICAgICAgICAgICBbJ1lZWVlZWS1NTS1ERCcsIC9bKy1dXFxkezZ9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgICAgIFsnWVlZWS1NTS1ERCcsIC9cXGR7NH0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICAgICAgWydHR0dHLVtXXVdXLUUnLCAvXFxkezR9LVdcXGRcXGQtXFxkL10sXG4gICAgICAgICAgICBbJ0dHR0ctW1ddV1cnLCAvXFxkezR9LVdcXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVktREREJywgL1xcZHs0fS1cXGR7M30vXSxcbiAgICAgICAgICAgIFsnWVlZWS1NTScsIC9cXGR7NH0tXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICAgICAgWydZWVlZWVlNTUREJywgL1srLV1cXGR7MTB9L10sXG4gICAgICAgICAgICBbJ1lZWVlNTUREJywgL1xcZHs4fS9dLFxuICAgICAgICAgICAgWydHR0dHW1ddV1dFJywgL1xcZHs0fVdcXGR7M30vXSxcbiAgICAgICAgICAgIFsnR0dHR1tXXVdXJywgL1xcZHs0fVdcXGR7Mn0vLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVlEREQnLCAvXFxkezd9L10sXG4gICAgICAgICAgICBbJ1lZWVlNTScsIC9cXGR7Nn0vLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVknLCAvXFxkezR9LywgZmFsc2VdLFxuICAgICAgICBdLFxuICAgICAgICAvLyBpc28gdGltZSBmb3JtYXRzIGFuZCByZWdleGVzXG4gICAgICAgIGlzb1RpbWVzID0gW1xuICAgICAgICAgICAgWydISDptbTpzcy5TU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICAgICAgWydISDptbTpzcyxTU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkLFxcZCsvXSxcbiAgICAgICAgICAgIFsnSEg6bW06c3MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEg6bW0nLCAvXFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICAgICAgWydISG1tc3MuU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgICAgICBbJ0hIbW1zcyxTU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZCxcXGQrL10sXG4gICAgICAgICAgICBbJ0hIbW1zcycsIC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEhtbScsIC9cXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEgnLCAvXFxkXFxkL10sXG4gICAgICAgIF0sXG4gICAgICAgIGFzcE5ldEpzb25SZWdleCA9IC9eXFwvP0RhdGVcXCgoLT9cXGQrKS9pLFxuICAgICAgICAvLyBSRkMgMjgyMiByZWdleDogRm9yIGRldGFpbHMgc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIyI3NlY3Rpb24tMy4zXG4gICAgICAgIHJmYzI4MjIgPVxuICAgICAgICAgICAgL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSw/XFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfChbKy1dXFxkezR9KSkkLyxcbiAgICAgICAgb2JzT2Zmc2V0cyA9IHtcbiAgICAgICAgICAgIFVUOiAwLFxuICAgICAgICAgICAgR01UOiAwLFxuICAgICAgICAgICAgRURUOiAtNCAqIDYwLFxuICAgICAgICAgICAgRVNUOiAtNSAqIDYwLFxuICAgICAgICAgICAgQ0RUOiAtNSAqIDYwLFxuICAgICAgICAgICAgQ1NUOiAtNiAqIDYwLFxuICAgICAgICAgICAgTURUOiAtNiAqIDYwLFxuICAgICAgICAgICAgTVNUOiAtNyAqIDYwLFxuICAgICAgICAgICAgUERUOiAtNyAqIDYwLFxuICAgICAgICAgICAgUFNUOiAtOCAqIDYwLFxuICAgICAgICB9O1xuXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSVNPKGNvbmZpZykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBzdHJpbmcgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBtYXRjaCA9IGV4dGVuZGVkSXNvUmVnZXguZXhlYyhzdHJpbmcpIHx8IGJhc2ljSXNvUmVnZXguZXhlYyhzdHJpbmcpLFxuICAgICAgICAgICAgYWxsb3dUaW1lLFxuICAgICAgICAgICAgZGF0ZUZvcm1hdCxcbiAgICAgICAgICAgIHRpbWVGb3JtYXQsXG4gICAgICAgICAgICB0ekZvcm1hdCxcbiAgICAgICAgICAgIGlzb0RhdGVzTGVuID0gaXNvRGF0ZXMubGVuZ3RoLFxuICAgICAgICAgICAgaXNvVGltZXNMZW4gPSBpc29UaW1lcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pc28gPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzTGVuOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzb0RhdGVzW2ldWzFdLmV4ZWMobWF0Y2hbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQgPSBpc29EYXRlc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dUaW1lID0gaXNvRGF0ZXNbaV1bMl0gIT09IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb1RpbWVzTGVuOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc29UaW1lc1tpXVsxXS5leGVjKG1hdGNoWzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hbMl0gc2hvdWxkIGJlICdUJyBvciBzcGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZUZvcm1hdCA9IChtYXRjaFsyXSB8fCAnICcpICsgaXNvVGltZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGltZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhbGxvd1RpbWUgJiYgdGltZUZvcm1hdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR6UmVnZXguZXhlYyhtYXRjaFs0XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHpGb3JtYXQgPSAnWic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maWcuX2YgPSBkYXRlRm9ybWF0ICsgKHRpbWVGb3JtYXQgfHwgJycpICsgKHR6Rm9ybWF0IHx8ICcnKTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyhcbiAgICAgICAgeWVhclN0cixcbiAgICAgICAgbW9udGhTdHIsXG4gICAgICAgIGRheVN0cixcbiAgICAgICAgaG91clN0cixcbiAgICAgICAgbWludXRlU3RyLFxuICAgICAgICBzZWNvbmRTdHJcbiAgICApIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtcbiAgICAgICAgICAgIHVudHJ1bmNhdGVZZWFyKHllYXJTdHIpLFxuICAgICAgICAgICAgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LmluZGV4T2YobW9udGhTdHIpLFxuICAgICAgICAgICAgcGFyc2VJbnQoZGF5U3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChob3VyU3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChtaW51dGVTdHIsIDEwKSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoc2Vjb25kU3RyKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChwYXJzZUludChzZWNvbmRTdHIsIDEwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVudHJ1bmNhdGVZZWFyKHllYXJTdHIpIHtcbiAgICAgICAgdmFyIHllYXIgPSBwYXJzZUludCh5ZWFyU3RyLCAxMCk7XG4gICAgICAgIGlmICh5ZWFyIDw9IDQ5KSB7XG4gICAgICAgICAgICByZXR1cm4gMjAwMCArIHllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoeWVhciA8PSA5OTkpIHtcbiAgICAgICAgICAgIHJldHVybiAxOTAwICsgeWVhcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWVhcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVwcm9jZXNzUkZDMjgyMihzKSB7XG4gICAgICAgIC8vIFJlbW92ZSBjb21tZW50cyBhbmQgZm9sZGluZyB3aGl0ZXNwYWNlIGFuZCByZXBsYWNlIG11bHRpcGxlLXNwYWNlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG4gICAgICAgIHJldHVybiBzXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwoW14oKV0qXFwpfFtcXG5cXHRdL2csICcgJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oXFxzXFxzKykvZywgJyAnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15cXHNcXHMqLywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzXFxzKiQvLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tXZWVrZGF5KHdlZWtkYXlTdHIsIHBhcnNlZElucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlcGxhY2UgdGhlIHZhbmlsbGEgSlMgRGF0ZSBvYmplY3Qgd2l0aCBhbiBpbmRlcGVuZGVudCBkYXktb2Ytd2VlayBjaGVjay5cbiAgICAgICAgICAgIHZhciB3ZWVrZGF5UHJvdmlkZWQgPSBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpLFxuICAgICAgICAgICAgICAgIHdlZWtkYXlBY3R1YWwgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSW5wdXRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZElucHV0WzFdLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRJbnB1dFsyXVxuICAgICAgICAgICAgICAgICkuZ2V0RGF5KCk7XG4gICAgICAgICAgICBpZiAod2Vla2RheVByb3ZpZGVkICE9PSB3ZWVrZGF5QWN0dWFsKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlT2Zmc2V0KG9ic09mZnNldCwgbWlsaXRhcnlPZmZzZXQsIG51bU9mZnNldCkge1xuICAgICAgICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbGl0YXJ5T2Zmc2V0KSB7XG4gICAgICAgICAgICAvLyB0aGUgb25seSBhbGxvd2VkIG1pbGl0YXJ5IHR6IGlzIFpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGhtID0gcGFyc2VJbnQobnVtT2Zmc2V0LCAxMCksXG4gICAgICAgICAgICAgICAgbSA9IGhtICUgMTAwLFxuICAgICAgICAgICAgICAgIGggPSAoaG0gLSBtKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBoICogNjAgKyBtO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBhbmQgdGltZSBmcm9tIHJlZiAyODIyIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2ggPSByZmMyODIyLmV4ZWMocHJlcHJvY2Vzc1JGQzI4MjIoY29uZmlnLl9pKSksXG4gICAgICAgICAgICBwYXJzZWRBcnJheTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBwYXJzZWRBcnJheSA9IGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MoXG4gICAgICAgICAgICAgICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbN11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWNoZWNrV2Vla2RheShtYXRjaFsxXSwgcGFyc2VkQXJyYXksIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IHBhcnNlZEFycmF5O1xuICAgICAgICAgICAgY29uZmlnLl90em0gPSBjYWxjdWxhdGVPZmZzZXQobWF0Y2hbOF0sIG1hdGNoWzldLCBtYXRjaFsxMF0pO1xuXG4gICAgICAgICAgICBjb25maWcuX2QgPSBjcmVhdGVVVENEYXRlLmFwcGx5KG51bGwsIGNvbmZpZy5fYSk7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5yZmMyODIyID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIDEpIEFTUC5ORVQsIDIpIElTTywgMykgUkZDIDI4MjIgZm9ybWF0cywgb3IgNCkgb3B0aW9uYWwgZmFsbGJhY2sgaWYgcGFyc2luZyBpc24ndCBzdHJpY3RcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2hlZCA9IGFzcE5ldEpzb25SZWdleC5leGVjKGNvbmZpZy5faSk7XG4gICAgICAgIGlmIChtYXRjaGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgrbWF0Y2hlZFsxXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9zdHJpY3QpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmluYWwgYXR0ZW1wdCwgdXNlIElucHV0IEZhbGxiYWNrXG4gICAgICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sgPSBkZXByZWNhdGUoXG4gICAgICAgICd2YWx1ZSBwcm92aWRlZCBpcyBub3QgaW4gYSByZWNvZ25pemVkIFJGQzI4MjIgb3IgSVNPIGZvcm1hdC4gbW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUoKSwgJyArXG4gICAgICAgICAgICAnd2hpY2ggaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBhbGwgYnJvd3NlcnMgYW5kIHZlcnNpb25zLiBOb24gUkZDMjgyMi9JU08gZGF0ZSBmb3JtYXRzIGFyZSAnICtcbiAgICAgICAgICAgICdkaXNjb3VyYWdlZC4gUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvanMtZGF0ZS8gZm9yIG1vcmUgaW5mby4nLFxuICAgICAgICBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShjb25maWcuX2kgKyAoY29uZmlnLl91c2VVVEMgPyAnIFVUQycgOiAnJykpO1xuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIFBpY2sgdGhlIGZpcnN0IGRlZmluZWQgb2YgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy5cbiAgICBmdW5jdGlvbiBkZWZhdWx0cyhhLCBiLCBjKSB7XG4gICAgICAgIGlmIChhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIC8vIGhvb2tzIGlzIGFjdHVhbGx5IHRoZSBleHBvcnRlZCBtb21lbnQgb2JqZWN0XG4gICAgICAgIHZhciBub3dWYWx1ZSA9IG5ldyBEYXRlKGhvb2tzLm5vdygpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIG5vd1ZhbHVlLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgbm93VmFsdWUuZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgICAgICAgICBub3dWYWx1ZS5nZXRVVENEYXRlKCksXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0RnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0TW9udGgoKSwgbm93VmFsdWUuZ2V0RGF0ZSgpXTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGFuIGFycmF5IHRvIGEgZGF0ZS5cbiAgICAvLyB0aGUgYXJyYXkgc2hvdWxkIG1pcnJvciB0aGUgcGFyYW1ldGVycyBiZWxvd1xuICAgIC8vIG5vdGU6IGFsbCB2YWx1ZXMgcGFzdCB0aGUgeWVhciBhcmUgb3B0aW9uYWwgYW5kIHdpbGwgZGVmYXVsdCB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxuICAgIC8vIFt5ZWFyLCBtb250aCwgZGF5ICwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXVxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21BcnJheShjb25maWcpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgaW5wdXQgPSBbXSxcbiAgICAgICAgICAgIGN1cnJlbnREYXRlLFxuICAgICAgICAgICAgZXhwZWN0ZWRXZWVrZGF5LFxuICAgICAgICAgICAgeWVhclRvVXNlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgZGF5IG9mIHRoZSB5ZWFyIGlzIHNldCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyVG9Vc2UpIHx8XG4gICAgICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPT09IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd0RheU9mWWVhciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKHllYXJUb1VzZSwgMCwgY29uZmlnLl9kYXlPZlllYXIpO1xuICAgICAgICAgICAgY29uZmlnLl9hW01PTlRIXSA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtEQVRFXSA9IGRhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IGRhdGUuXG4gICAgICAgIC8vICogaWYgbm8geWVhciwgbW9udGgsIGRheSBvZiBtb250aCBhcmUgZ2l2ZW4sIGRlZmF1bHQgdG8gdG9kYXlcbiAgICAgICAgLy8gKiBpZiBkYXkgb2YgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgbW9udGggYW5kIHllYXJcbiAgICAgICAgLy8gKiBpZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBvbmx5IHllYXJcbiAgICAgICAgLy8gKiBpZiB5ZWFyIGlzIGdpdmVuLCBkb24ndCBkZWZhdWx0IGFueXRoaW5nXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzICYmIGNvbmZpZy5fYVtpXSA9PSBudWxsOyArK2kpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID0gY3VycmVudERhdGVbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBaZXJvIG91dCB3aGF0ZXZlciB3YXMgbm90IGRlZmF1bHRlZCwgaW5jbHVkaW5nIHRpbWVcbiAgICAgICAgZm9yICg7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID1cbiAgICAgICAgICAgICAgICBjb25maWcuX2FbaV0gPT0gbnVsbCA/IChpID09PSAyID8gMSA6IDApIDogY29uZmlnLl9hW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIDI0OjAwOjAwLjAwMFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICBjb25maWcuX2FbTUlOVVRFXSA9PT0gMCAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW1NFQ09ORF0gPT09IDAgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25maWcuX25leHREYXkgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZy5fZCA9IChjb25maWcuX3VzZVVUQyA/IGNyZWF0ZVVUQ0RhdGUgOiBjcmVhdGVEYXRlKS5hcHBseShcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICApO1xuICAgICAgICBleHBlY3RlZFdlZWtkYXkgPSBjb25maWcuX3VzZVVUQ1xuICAgICAgICAgICAgPyBjb25maWcuX2QuZ2V0VVRDRGF5KClcbiAgICAgICAgICAgIDogY29uZmlnLl9kLmdldERheSgpO1xuXG4gICAgICAgIC8vIEFwcGx5IHRpbWV6b25lIG9mZnNldCBmcm9tIGlucHV0LiBUaGUgYWN0dWFsIHV0Y09mZnNldCBjYW4gYmUgY2hhbmdlZFxuICAgICAgICAvLyB3aXRoIHBhcnNlWm9uZS5cbiAgICAgICAgaWYgKGNvbmZpZy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGZvciBtaXNtYXRjaGluZyBkYXkgb2Ygd2Vla1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX3cgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25maWcuX3cuZCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fdy5kICE9PSBleHBlY3RlZFdlZWtkYXlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZykge1xuICAgICAgICB2YXIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3csIGN1cldlZWs7XG5cbiAgICAgICAgdyA9IGNvbmZpZy5fdztcbiAgICAgICAgaWYgKHcuR0cgIT0gbnVsbCB8fCB3LlcgIT0gbnVsbCB8fCB3LkUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZG93ID0gMTtcbiAgICAgICAgICAgIGRveSA9IDQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gdGFrZSB0aGUgY3VycmVudCBpc29XZWVrWWVhciwgYnV0IHRoYXQgZGVwZW5kcyBvblxuICAgICAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYSBub3cgdmVyc2lvbiBvZiBjdXJyZW50IGNvbmZpZyAodGFrZSBsb2NhbC91dGMvb2Zmc2V0IGZsYWdzLCBhbmRcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBub3cpLlxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyhcbiAgICAgICAgICAgICAgICB3LkdHLFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSxcbiAgICAgICAgICAgICAgICB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIDEsIDQpLnllYXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody5XLCAxKTtcbiAgICAgICAgICAgIHdlZWtkYXkgPSBkZWZhdWx0cyh3LkUsIDEpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvdyA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRvdztcbiAgICAgICAgICAgIGRveSA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRveTtcblxuICAgICAgICAgICAgY3VyV2VlayA9IHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgZG93LCBkb3kpO1xuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKHcuZ2csIGNvbmZpZy5fYVtZRUFSXSwgY3VyV2Vlay55ZWFyKTtcblxuICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IHdlZWsuXG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody53LCBjdXJXZWVrLndlZWspO1xuXG4gICAgICAgICAgICBpZiAody5kICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZWVrZGF5IC0tIGxvdyBkYXkgbnVtYmVycyBhcmUgY29uc2lkZXJlZCBuZXh0IHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gdy5kO1xuICAgICAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMCB8fCB3ZWVrZGF5ID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAody5lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2NhbCB3ZWVrZGF5IC0tIGNvdW50aW5nIHN0YXJ0cyBmcm9tIGJlZ2lubmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZSArIGRvdztcbiAgICAgICAgICAgICAgICBpZiAody5lIDwgMCB8fCB3LmUgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGJlZ2lubmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IGRvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2VlayA8IDEgfHwgd2VlayA+IHdlZWtzSW5ZZWFyKHdlZWtZZWFyLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrZGF5T3ZlcmZsb3cgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93V2Vla2RheSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZW1wID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgICAgICBjb25maWcuX2FbWUVBUl0gPSB0ZW1wLnllYXI7XG4gICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRlbXAuZGF5T2ZZZWFyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIElTTyBzdGFuZGFyZFxuICAgIGhvb2tzLklTT184NjAxID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgUkZDIDI4MjIgZm9ybVxuICAgIGhvb2tzLlJGQ18yODIyID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIGFub3RoZXIgcGFydCBvZiB0aGUgY3JlYXRpb24gZmxvdyB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcHNcbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuSVNPXzg2MDEpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5SRkNfMjgyMikge1xuICAgICAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25maWcuX2EgPSBbXTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSB0cnVlO1xuXG4gICAgICAgIC8vIFRoaXMgYXJyYXkgaXMgdXNlZCB0byBtYWtlIGEgRGF0ZSwgZWl0aGVyIHdpdGggYG5ldyBEYXRlYCBvciBgRGF0ZS5VVENgXG4gICAgICAgIHZhciBzdHJpbmcgPSAnJyArIGNvbmZpZy5faSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwYXJzZWRJbnB1dCxcbiAgICAgICAgICAgIHRva2VucyxcbiAgICAgICAgICAgIHRva2VuLFxuICAgICAgICAgICAgc2tpcHBlZCxcbiAgICAgICAgICAgIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoID0gMCxcbiAgICAgICAgICAgIGVyYSxcbiAgICAgICAgICAgIHRva2VuTGVuO1xuXG4gICAgICAgIHRva2VucyA9XG4gICAgICAgICAgICBleHBhbmRGb3JtYXQoY29uZmlnLl9mLCBjb25maWcuX2xvY2FsZSkubWF0Y2goZm9ybWF0dGluZ1Rva2VucykgfHwgW107XG4gICAgICAgIHRva2VuTGVuID0gdG9rZW5zLmxlbmd0aDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2VuTGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICAgICAgcGFyc2VkSW5wdXQgPSAoc3RyaW5nLm1hdGNoKGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSkgfHxcbiAgICAgICAgICAgICAgICBbXSlbMF07XG4gICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkpO1xuICAgICAgICAgICAgICAgIGlmIChza2lwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChza2lwcGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkgKyBwYXJzZWRJbnB1dC5sZW5ndGhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggKz0gcGFyc2VkSW5wdXQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZG9uJ3QgcGFyc2UgaWYgaXQncyBub3QgYSBrbm93biB0b2tlblxuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIHBhcnNlZElucHV0LCBjb25maWcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuX3N0cmljdCAmJiAhcGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgcmVtYWluaW5nIHVucGFyc2VkIGlucHV0IGxlbmd0aCB0byB0aGUgc3RyaW5nXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmNoYXJzTGVmdE92ZXIgPVxuICAgICAgICAgICAgc3RyaW5nTGVuZ3RoIC0gdG90YWxQYXJzZWRJbnB1dExlbmd0aDtcbiAgICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciBfMTJoIGZsYWcgaWYgaG91ciBpcyA8PSAxMlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPD0gMTIgJiZcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPT09IHRydWUgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucGFyc2VkRGF0ZVBhcnRzID0gY29uZmlnLl9hLnNsaWNlKDApO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5tZXJpZGllbSA9IGNvbmZpZy5fbWVyaWRpZW07XG4gICAgICAgIC8vIGhhbmRsZSBtZXJpZGllbVxuICAgICAgICBjb25maWcuX2FbSE9VUl0gPSBtZXJpZGllbUZpeFdyYXAoXG4gICAgICAgICAgICBjb25maWcuX2xvY2FsZSxcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSxcbiAgICAgICAgICAgIGNvbmZpZy5fbWVyaWRpZW1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBoYW5kbGUgZXJhXG4gICAgICAgIGVyYSA9IGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVyYTtcbiAgICAgICAgaWYgKGVyYSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gY29uZmlnLl9sb2NhbGUuZXJhc0NvbnZlcnRZZWFyKGVyYSwgY29uZmlnLl9hW1lFQVJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW1GaXhXcmFwKGxvY2FsZSwgaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgdmFyIGlzUG07XG5cbiAgICAgICAgaWYgKG1lcmlkaWVtID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbGUubWVyaWRpZW1Ib3VyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubWVyaWRpZW1Ib3VyKGhvdXIsIG1lcmlkaWVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbGUuaXNQTSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFja1xuICAgICAgICAgICAgaXNQbSA9IGxvY2FsZS5pc1BNKG1lcmlkaWVtKTtcbiAgICAgICAgICAgIGlmIChpc1BtICYmIGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgKz0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG0gJiYgaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGFycmF5IG9mIGZvcm1hdCBzdHJpbmdzXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZykge1xuICAgICAgICB2YXIgdGVtcENvbmZpZyxcbiAgICAgICAgICAgIGJlc3RNb21lbnQsXG4gICAgICAgICAgICBzY29yZVRvQmVhdCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBjdXJyZW50U2NvcmUsXG4gICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kLFxuICAgICAgICAgICAgYmVzdEZvcm1hdElzVmFsaWQgPSBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ2ZMZW4gPSBjb25maWcuX2YubGVuZ3RoO1xuXG4gICAgICAgIGlmIChjb25maWdmTGVuID09PSAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnZkxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgPSAwO1xuICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGVtcENvbmZpZyA9IGNvcHlDb25maWcoe30sIGNvbmZpZyk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbXBDb25maWcuX3VzZVVUQyA9IGNvbmZpZy5fdXNlVVRDO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGVtcENvbmZpZy5fZiA9IGNvbmZpZy5fZltpXTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQodGVtcENvbmZpZyk7XG5cbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKHRlbXBDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFueSBpbnB1dCB0aGF0IHdhcyBub3QgcGFyc2VkIGFkZCBhIHBlbmFsdHkgZm9yIHRoYXQgZm9ybWF0XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLmNoYXJzTGVmdE92ZXI7XG5cbiAgICAgICAgICAgIC8vb3IgdG9rZW5zXG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnVudXNlZFRva2Vucy5sZW5ndGggKiAxMDtcblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnNjb3JlID0gY3VycmVudFNjb3JlO1xuXG4gICAgICAgICAgICBpZiAoIWJlc3RGb3JtYXRJc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTY29yZSA8IHNjb3JlVG9CZWF0IHx8XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkRm9ybWF0Rm91bmRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPSBjdXJyZW50U2NvcmU7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRGb3JtYXRGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdEZvcm1hdElzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPSBjdXJyZW50U2NvcmU7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGV4dGVuZChjb25maWcsIGJlc3RNb21lbnQgfHwgdGVtcENvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbU9iamVjdChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSBub3JtYWxpemVPYmplY3RVbml0cyhjb25maWcuX2kpLFxuICAgICAgICAgICAgZGF5T3JEYXRlID0gaS5kYXkgPT09IHVuZGVmaW5lZCA/IGkuZGF0ZSA6IGkuZGF5O1xuICAgICAgICBjb25maWcuX2EgPSBtYXAoXG4gICAgICAgICAgICBbaS55ZWFyLCBpLm1vbnRoLCBkYXlPckRhdGUsIGkuaG91ciwgaS5taW51dGUsIGkuc2Vjb25kLCBpLm1pbGxpc2Vjb25kXSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqICYmIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZyb21Db25maWcoY29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3cocHJlcGFyZUNvbmZpZyhjb25maWcpKSk7XG4gICAgICAgIGlmIChyZXMuX25leHREYXkpIHtcbiAgICAgICAgICAgIC8vIEFkZGluZyBpcyBzbWFydCBlbm91Z2ggYXJvdW5kIERTVFxuICAgICAgICAgICAgcmVzLmFkZCgxLCAnZCcpO1xuICAgICAgICAgICAgcmVzLl9uZXh0RGF5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVwYXJlQ29uZmlnKGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBmb3JtYXQgPSBjb25maWcuX2Y7XG5cbiAgICAgICAgY29uZmlnLl9sb2NhbGUgPSBjb25maWcuX2xvY2FsZSB8fCBnZXRMb2NhbGUoY29uZmlnLl9sKTtcblxuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgKGZvcm1hdCA9PT0gdW5kZWZpbmVkICYmIGlucHV0ID09PSAnJykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKHsgbnVsbElucHV0OiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faSA9IGlucHV0ID0gY29uZmlnLl9sb2NhbGUucHJlcGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTW9tZW50KGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhpbnB1dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGlucHV0O1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZm9ybWF0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSW5wdXQoY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZChjb25maWcpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSW5wdXQoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0LnZhbHVlT2YoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZyhjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2EgPSBtYXAoaW5wdXQuc2xpY2UoMCksIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbU9iamVjdChjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgICAgICAgICAgLy8gZnJvbSBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBpc1VUQykge1xuICAgICAgICB2YXIgYyA9IHt9O1xuXG4gICAgICAgIGlmIChmb3JtYXQgPT09IHRydWUgfHwgZm9ybWF0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgc3RyaWN0ID0gZm9ybWF0O1xuICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvY2FsZSA9PT0gdHJ1ZSB8fCBsb2NhbGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBsb2NhbGU7XG4gICAgICAgICAgICBsb2NhbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoaXNPYmplY3QoaW5wdXQpICYmIGlzT2JqZWN0RW1wdHkoaW5wdXQpKSB8fFxuICAgICAgICAgICAgKGlzQXJyYXkoaW5wdXQpICYmIGlucHV0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgY29uc3RydWN0aW9uIG11c3QgYmUgZG9uZSB0aGlzIHdheS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE0MjNcbiAgICAgICAgYy5faXNBTW9tZW50T2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgYy5fdXNlVVRDID0gYy5faXNVVEMgPSBpc1VUQztcbiAgICAgICAgYy5fbCA9IGxvY2FsZTtcbiAgICAgICAgYy5faSA9IGlucHV0O1xuICAgICAgICBjLl9mID0gZm9ybWF0O1xuICAgICAgICBjLl9zdHJpY3QgPSBzdHJpY3Q7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21Db25maWcoYyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTG9jYWwoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG90eXBlTWluID0gZGVwcmVjYXRlKFxuICAgICAgICAgICAgJ21vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyIDwgdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgcHJvdG90eXBlTWF4ID0gZGVwcmVjYXRlKFxuICAgICAgICAgICAgJ21vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1pbiBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyID4gdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgIC8vIFBpY2sgYSBtb21lbnQgbSBmcm9tIG1vbWVudHMgc28gdGhhdCBtW2ZuXShvdGhlcikgaXMgdHJ1ZSBmb3IgYWxsXG4gICAgLy8gb3RoZXIuIFRoaXMgcmVsaWVzIG9uIHRoZSBmdW5jdGlvbiBmbiB0byBiZSB0cmFuc2l0aXZlLlxuICAgIC8vXG4gICAgLy8gbW9tZW50cyBzaG91bGQgZWl0aGVyIGJlIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzIG9yIGFuIGFycmF5LCB3aG9zZVxuICAgIC8vIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMuXG4gICAgZnVuY3Rpb24gcGlja0J5KGZuLCBtb21lbnRzKSB7XG4gICAgICAgIHZhciByZXMsIGk7XG4gICAgICAgIGlmIChtb21lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KG1vbWVudHNbMF0pKSB7XG4gICAgICAgICAgICBtb21lbnRzID0gbW9tZW50c1swXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXMgPSBtb21lbnRzWzBdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbW9tZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCFtb21lbnRzW2ldLmlzVmFsaWQoKSB8fCBtb21lbnRzW2ldW2ZuXShyZXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gbW9tZW50c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSBbXS5zb3J0IGluc3RlYWQ/XG4gICAgZnVuY3Rpb24gbWluKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0JlZm9yZScsIGFyZ3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1heCgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNBZnRlcicsIGFyZ3MpO1xuICAgIH1cblxuICAgIHZhciBub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdyA/IERhdGUubm93KCkgOiArbmV3IERhdGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIG9yZGVyaW5nID0gW1xuICAgICAgICAneWVhcicsXG4gICAgICAgICdxdWFydGVyJyxcbiAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgJ3dlZWsnLFxuICAgICAgICAnZGF5JyxcbiAgICAgICAgJ2hvdXInLFxuICAgICAgICAnbWludXRlJyxcbiAgICAgICAgJ3NlY29uZCcsXG4gICAgICAgICdtaWxsaXNlY29uZCcsXG4gICAgXTtcblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb25WYWxpZChtKSB7XG4gICAgICAgIHZhciBrZXksXG4gICAgICAgICAgICB1bml0SGFzRGVjaW1hbCA9IGZhbHNlLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG9yZGVyTGVuID0gb3JkZXJpbmcubGVuZ3RoO1xuICAgICAgICBmb3IgKGtleSBpbiBtKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaGFzT3duUHJvcChtLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhPZi5jYWxsKG9yZGVyaW5nLCBrZXkpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAobVtrZXldID09IG51bGwgfHwgIWlzTmFOKG1ba2V5XSkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyTGVuOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChtW29yZGVyaW5nW2ldXSkge1xuICAgICAgICAgICAgICAgIGlmICh1bml0SGFzRGVjaW1hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG9ubHkgYWxsb3cgbm9uLWludGVnZXJzIGZvciBzbWFsbGVzdCB1bml0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KG1bb3JkZXJpbmdbaV1dKSAhPT0gdG9JbnQobVtvcmRlcmluZ1tpXV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXRIYXNEZWNpbWFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKE5hTik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGR1cmF0aW9uKSxcbiAgICAgICAgICAgIHllYXJzID0gbm9ybWFsaXplZElucHV0LnllYXIgfHwgMCxcbiAgICAgICAgICAgIHF1YXJ0ZXJzID0gbm9ybWFsaXplZElucHV0LnF1YXJ0ZXIgfHwgMCxcbiAgICAgICAgICAgIG1vbnRocyA9IG5vcm1hbGl6ZWRJbnB1dC5tb250aCB8fCAwLFxuICAgICAgICAgICAgd2Vla3MgPSBub3JtYWxpemVkSW5wdXQud2VlayB8fCBub3JtYWxpemVkSW5wdXQuaXNvV2VlayB8fCAwLFxuICAgICAgICAgICAgZGF5cyA9IG5vcm1hbGl6ZWRJbnB1dC5kYXkgfHwgMCxcbiAgICAgICAgICAgIGhvdXJzID0gbm9ybWFsaXplZElucHV0LmhvdXIgfHwgMCxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBub3JtYWxpemVkSW5wdXQubWludXRlIHx8IDAsXG4gICAgICAgICAgICBzZWNvbmRzID0gbm9ybWFsaXplZElucHV0LnNlY29uZCB8fCAwLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gbm9ybWFsaXplZElucHV0Lm1pbGxpc2Vjb25kIHx8IDA7XG5cbiAgICAgICAgdGhpcy5faXNWYWxpZCA9IGlzRHVyYXRpb25WYWxpZChub3JtYWxpemVkSW5wdXQpO1xuXG4gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9XG4gICAgICAgICAgICArbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHNlY29uZHMgKiAxZTMgKyAvLyAxMDAwXG4gICAgICAgICAgICBtaW51dGVzICogNmU0ICsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBob3VycyAqIDEwMDAgKiA2MCAqIDYwOyAvL3VzaW5nIDEwMDAgKiA2MCAqIDYwIGluc3RlYWQgb2YgMzZlNSB0byBhdm9pZCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnMgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzI5NzhcbiAgICAgICAgLy8gQmVjYXVzZSBvZiBkYXRlQWRkUmVtb3ZlIHRyZWF0cyAyNCBob3VycyBhcyBkaWZmZXJlbnQgZnJvbSBhXG4gICAgICAgIC8vIGRheSB3aGVuIHdvcmtpbmcgYXJvdW5kIERTVCwgd2UgbmVlZCB0byBzdG9yZSB0aGVtIHNlcGFyYXRlbHlcbiAgICAgICAgdGhpcy5fZGF5cyA9ICtkYXlzICsgd2Vla3MgKiA3O1xuICAgICAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRvIHRyYW5zbGF0ZSBtb250aHMgaW50byBkYXlzIHdpdGhvdXQga25vd2luZ1xuICAgICAgICAvLyB3aGljaCBtb250aHMgeW91IGFyZSBhcmUgdGFsa2luZyBhYm91dCwgc28gd2UgaGF2ZSB0byBzdG9yZVxuICAgICAgICAvLyBpdCBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9tb250aHMgPSArbW9udGhzICsgcXVhcnRlcnMgKiAzICsgeWVhcnMgKiAxMjtcblxuICAgICAgICB0aGlzLl9kYXRhID0ge307XG5cbiAgICAgICAgdGhpcy5fbG9jYWxlID0gZ2V0TG9jYWxlKCk7XG5cbiAgICAgICAgdGhpcy5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIER1cmF0aW9uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic1JvdW5kKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoLTEgKiBudW1iZXIpICogLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29tcGFyZSB0d28gYXJyYXlzLCByZXR1cm4gdGhlIG51bWJlciBvZiBkaWZmZXJlbmNlc1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVBcnJheXMoYXJyYXkxLCBhcnJheTIsIGRvbnRDb252ZXJ0KSB7XG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGxlbmd0aERpZmYgPSBNYXRoLmFicyhhcnJheTEubGVuZ3RoIC0gYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBkaWZmcyA9IDAsXG4gICAgICAgICAgICBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoZG9udENvbnZlcnQgJiYgYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pIHx8XG4gICAgICAgICAgICAgICAgKCFkb250Q29udmVydCAmJiB0b0ludChhcnJheTFbaV0pICE9PSB0b0ludChhcnJheTJbaV0pKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIG9mZnNldCh0b2tlbiwgc2VwYXJhdG9yKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy51dGNPZmZzZXQoKSxcbiAgICAgICAgICAgICAgICBzaWduID0gJysnO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHNpZ24gPSAnLSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHNpZ24gK1xuICAgICAgICAgICAgICAgIHplcm9GaWxsKH5+KG9mZnNldCAvIDYwKSwgMikgK1xuICAgICAgICAgICAgICAgIHNlcGFyYXRvciArXG4gICAgICAgICAgICAgICAgemVyb0ZpbGwofn5vZmZzZXQgJSA2MCwgMilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9mZnNldCgnWicsICc6Jyk7XG4gICAgb2Zmc2V0KCdaWicsICcnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1onLCBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRSZWdleFRva2VuKCdaWicsIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydaJywgJ1paJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX3VzZVVUQyA9IHRydWU7XG4gICAgICAgIGNvbmZpZy5fdHptID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyB0aW1lem9uZSBjaHVua2VyXG4gICAgLy8gJysxMDowMCcgPiBbJzEwJywgICcwMCddXG4gICAgLy8gJy0xNTMwJyAgPiBbJy0xNScsICczMCddXG4gICAgdmFyIGNodW5rT2Zmc2V0ID0gLyhbXFwrXFwtXXxcXGRcXGQpL2dpO1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaGVyLCBzdHJpbmcpIHtcbiAgICAgICAgdmFyIG1hdGNoZXMgPSAoc3RyaW5nIHx8ICcnKS5tYXRjaChtYXRjaGVyKSxcbiAgICAgICAgICAgIGNodW5rLFxuICAgICAgICAgICAgcGFydHMsXG4gICAgICAgICAgICBtaW51dGVzO1xuXG4gICAgICAgIGlmIChtYXRjaGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNodW5rID0gbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdIHx8IFtdO1xuICAgICAgICBwYXJ0cyA9IChjaHVuayArICcnKS5tYXRjaChjaHVua09mZnNldCkgfHwgWyctJywgMCwgMF07XG4gICAgICAgIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgICAgIHJldHVybiBtaW51dGVzID09PSAwID8gMCA6IHBhcnRzWzBdID09PSAnKycgPyBtaW51dGVzIDogLW1pbnV0ZXM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGEgbW9tZW50IGZyb20gaW5wdXQsIHRoYXQgaXMgbG9jYWwvdXRjL3pvbmUgZXF1aXZhbGVudCB0byBtb2RlbC5cbiAgICBmdW5jdGlvbiBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIG1vZGVsKSB7XG4gICAgICAgIHZhciByZXMsIGRpZmY7XG4gICAgICAgIGlmIChtb2RlbC5faXNVVEMpIHtcbiAgICAgICAgICAgIHJlcyA9IG1vZGVsLmNsb25lKCk7XG4gICAgICAgICAgICBkaWZmID1cbiAgICAgICAgICAgICAgICAoaXNNb21lbnQoaW5wdXQpIHx8IGlzRGF0ZShpbnB1dClcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC52YWx1ZU9mKClcbiAgICAgICAgICAgICAgICAgICAgOiBjcmVhdGVMb2NhbChpbnB1dCkudmFsdWVPZigpKSAtIHJlcy52YWx1ZU9mKCk7XG4gICAgICAgICAgICAvLyBVc2UgbG93LWxldmVsIGFwaSwgYmVjYXVzZSB0aGlzIGZuIGlzIGxvdy1sZXZlbCBhcGkuXG4gICAgICAgICAgICByZXMuX2Quc2V0VGltZShyZXMuX2QudmFsdWVPZigpICsgZGlmZik7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQocmVzLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0KS5sb2NhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF0ZU9mZnNldChtKSB7XG4gICAgICAgIC8vIE9uIEZpcmVmb3guMjQgRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L3B1bGwvMTg3MVxuICAgICAgICByZXR1cm4gLU1hdGgucm91bmQobS5fZC5nZXRUaW1lem9uZU9mZnNldCgpKTtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG1vbWVudCBpcyBtdXRhdGVkLlxuICAgIC8vIEl0IGlzIGludGVuZGVkIHRvIGtlZXAgdGhlIG9mZnNldCBpbiBzeW5jIHdpdGggdGhlIHRpbWV6b25lLlxuICAgIGhvb2tzLnVwZGF0ZU9mZnNldCA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8ga2VlcExvY2FsVGltZSA9IHRydWUgbWVhbnMgb25seSBjaGFuZ2UgdGhlIHRpbWV6b25lLCB3aXRob3V0XG4gICAgLy8gYWZmZWN0aW5nIHRoZSBsb2NhbCBob3VyLiBTbyA1OjMxOjI2ICswMzAwIC0tW3V0Y09mZnNldCgyLCB0cnVlKV0tLT5cbiAgICAvLyA1OjMxOjI2ICswMjAwIEl0IGlzIHBvc3NpYmxlIHRoYXQgNTozMToyNiBkb2Vzbid0IGV4aXN0IHdpdGggb2Zmc2V0XG4gICAgLy8gKzAyMDAsIHNvIHdlIGFkanVzdCB0aGUgdGltZSBhcyBuZWVkZWQsIHRvIGJlIHZhbGlkLlxuICAgIC8vXG4gICAgLy8gS2VlcGluZyB0aGUgdGltZSBhY3R1YWxseSBhZGRzL3N1YnRyYWN0cyAob25lIGhvdXIpXG4gICAgLy8gZnJvbSB0aGUgYWN0dWFsIHJlcHJlc2VudGVkIHRpbWUuIFRoYXQgaXMgd2h5IHdlIGNhbGwgdXBkYXRlT2Zmc2V0XG4gICAgLy8gYSBzZWNvbmQgdGltZS4gSW4gY2FzZSBpdCB3YW50cyB1cyB0byBjaGFuZ2UgdGhlIG9mZnNldCBhZ2FpblxuICAgIC8vIF9jaGFuZ2VJblByb2dyZXNzID09IHRydWUgY2FzZSwgdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCwgYmVjYXVzZVxuICAgIC8vIHRoZXJlIGlzIG5vIHN1Y2ggdGltZSBpbiB0aGUgZ2l2ZW4gdGltZXpvbmUuXG4gICAgZnVuY3Rpb24gZ2V0U2V0T2Zmc2V0KGlucHV0LCBrZWVwTG9jYWxUaW1lLCBrZWVwTWludXRlcykge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0IHx8IDAsXG4gICAgICAgICAgICBsb2NhbEFkanVzdDtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoaW5wdXQpIDwgMTYgJiYgIWtlZXBNaW51dGVzKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dCAqIDYwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1VUQyAmJiBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxBZGp1c3QgPSBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gaW5wdXQ7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IHRydWU7XG4gICAgICAgICAgICBpZiAobG9jYWxBZGp1c3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKGxvY2FsQWRqdXN0LCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWtlZXBMb2NhbFRpbWUgfHwgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBhZGRTdWJ0cmFjdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEdXJhdGlvbihpbnB1dCAtIG9mZnNldCwgJ20nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyBvZmZzZXQgOiBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0Wm9uZShpbnB1dCwga2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IC1pbnB1dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoaW5wdXQsIGtlZXBMb2NhbFRpbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAtdGhpcy51dGNPZmZzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvVVRDKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvTG9jYWwoa2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAodGhpcy5faXNVVEMpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnRyYWN0KGdldERhdGVPZmZzZXQodGhpcyksICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodGhpcy5fdHptLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2kgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YXIgdFpvbmUgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoT2Zmc2V0LCB0aGlzLl9pKTtcbiAgICAgICAgICAgIGlmICh0Wm9uZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodFpvbmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNBbGlnbmVkSG91ck9mZnNldChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSBpbnB1dCA/IGNyZWF0ZUxvY2FsKGlucHV0KS51dGNPZmZzZXQoKSA6IDA7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLnV0Y09mZnNldCgpIC0gaW5wdXQpICUgNjAgPT09IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWUoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpIHx8XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkKCkge1xuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX2lzRFNUU2hpZnRlZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYyA9IHt9LFxuICAgICAgICAgICAgb3RoZXI7XG5cbiAgICAgICAgY29weUNvbmZpZyhjLCB0aGlzKTtcbiAgICAgICAgYyA9IHByZXBhcmVDb25maWcoYyk7XG5cbiAgICAgICAgaWYgKGMuX2EpIHtcbiAgICAgICAgICAgIG90aGVyID0gYy5faXNVVEMgPyBjcmVhdGVVVEMoYy5fYSkgOiBjcmVhdGVMb2NhbChjLl9hKTtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1ZhbGlkKCkgJiYgY29tcGFyZUFycmF5cyhjLl9hLCBvdGhlci50b0FycmF5KCkpID4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xvY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyAhdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0Y09mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0YygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgJiYgdGhpcy5fb2Zmc2V0ID09PSAwIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQVNQLk5FVCBqc29uIGRhdGUgZm9ybWF0IHJlZ2V4XG4gICAgdmFyIGFzcE5ldFJlZ2V4ID0gL14oLXxcXCspPyg/OihcXGQqKVsuIF0pPyhcXGQrKTooXFxkKykoPzo6KFxcZCspKFxcLlxcZCopPyk/JC8sXG4gICAgICAgIC8vIGZyb20gaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9jbG9zdXJlX2dvb2dfZGF0ZV9kYXRlLmpzLnNvdXJjZS5odG1sXG4gICAgICAgIC8vIHNvbWV3aGF0IG1vcmUgaW4gbGluZSB3aXRoIDQuNC4zLjIgMjAwNCBzcGVjLCBidXQgYWxsb3dzIGRlY2ltYWwgYW55d2hlcmVcbiAgICAgICAgLy8gYW5kIGZ1cnRoZXIgbW9kaWZpZWQgdG8gYWxsb3cgZm9yIHN0cmluZ3MgY29udGFpbmluZyBib3RoIHdlZWsgYW5kIGRheVxuICAgICAgICBpc29SZWdleCA9XG4gICAgICAgICAgICAvXigtfFxcKyk/UCg/OihbLStdP1swLTksLl0qKVkpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVcpPyg/OihbLStdP1swLTksLl0qKUQpPyg/OlQoPzooWy0rXT9bMC05LC5dKilIKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilTKT8pPyQvO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRHVyYXRpb24oaW5wdXQsIGtleSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBpbnB1dCxcbiAgICAgICAgICAgIC8vIG1hdGNoaW5nIGFnYWluc3QgcmVnZXhwIGlzIGV4cGVuc2l2ZSwgZG8gaXQgb24gZGVtYW5kXG4gICAgICAgICAgICBtYXRjaCA9IG51bGwsXG4gICAgICAgICAgICBzaWduLFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAgZGlmZlJlcztcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG1zOiBpbnB1dC5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgICAgIGQ6IGlucHV0Ll9kYXlzLFxuICAgICAgICAgICAgICAgIE06IGlucHV0Ll9tb250aHMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSB8fCAhaXNOYU4oK2lucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gK2lucHV0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbi5taWxsaXNlY29uZHMgPSAraW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKG1hdGNoID0gYXNwTmV0UmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gbWF0Y2hbMV0gPT09ICctJyA/IC0xIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgZDogdG9JbnQobWF0Y2hbREFURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBoOiB0b0ludChtYXRjaFtIT1VSXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIG06IHRvSW50KG1hdGNoW01JTlVURV0pICogc2lnbixcbiAgICAgICAgICAgICAgICBzOiB0b0ludChtYXRjaFtTRUNPTkRdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbXM6IHRvSW50KGFic1JvdW5kKG1hdGNoW01JTExJU0VDT05EXSAqIDEwMDApKSAqIHNpZ24sIC8vIHRoZSBtaWxsaXNlY29uZCBkZWNpbWFsIHBvaW50IGlzIGluY2x1ZGVkIGluIHRoZSBtYXRjaFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICgobWF0Y2ggPSBpc29SZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSBtYXRjaFsxXSA9PT0gJy0nID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeTogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIE06IHBhcnNlSXNvKG1hdGNoWzNdLCBzaWduKSxcbiAgICAgICAgICAgICAgICB3OiBwYXJzZUlzbyhtYXRjaFs0XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgZDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGg6IHBhcnNlSXNvKG1hdGNoWzZdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBtOiBwYXJzZUlzbyhtYXRjaFs3XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgczogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGR1cmF0aW9uID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRpZmZSZXMgPSBtb21lbnRzRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbChkdXJhdGlvbi5mcm9tKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbChkdXJhdGlvbi50bylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBkdXJhdGlvbi5tcyA9IGRpZmZSZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgZHVyYXRpb24uTSA9IGRpZmZSZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkgJiYgaGFzT3duUHJvcChpbnB1dCwgJ19sb2NhbGUnKSkge1xuICAgICAgICAgICAgcmV0Ll9sb2NhbGUgPSBpbnB1dC5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfaXNWYWxpZCcpKSB7XG4gICAgICAgICAgICByZXQuX2lzVmFsaWQgPSBpbnB1dC5faXNWYWxpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG4gICAgY3JlYXRlRHVyYXRpb24uaW52YWxpZCA9IGNyZWF0ZUludmFsaWQkMTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvKGlucCwgc2lnbikge1xuICAgICAgICAvLyBXZSdkIG5vcm1hbGx5IHVzZSB+fmlucCBmb3IgdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgYWxzb1xuICAgICAgICAvLyBjb252ZXJ0cyBmbG9hdHMgdG8gaW50cy5cbiAgICAgICAgLy8gaW5wIG1heSBiZSB1bmRlZmluZWQsIHNvIGNhcmVmdWwgY2FsbGluZyByZXBsYWNlIG9uIGl0LlxuICAgICAgICB2YXIgcmVzID0gaW5wICYmIHBhcnNlRmxvYXQoaW5wLnJlcGxhY2UoJywnLCAnLicpKTtcbiAgICAgICAgLy8gYXBwbHkgc2lnbiB3aGlsZSB3ZSdyZSBhdCBpdFxuICAgICAgICByZXR1cm4gKGlzTmFOKHJlcykgPyAwIDogcmVzKSAqIHNpZ247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzID0ge307XG5cbiAgICAgICAgcmVzLm1vbnRocyA9XG4gICAgICAgICAgICBvdGhlci5tb250aCgpIC0gYmFzZS5tb250aCgpICsgKG90aGVyLnllYXIoKSAtIGJhc2UueWVhcigpKSAqIDEyO1xuICAgICAgICBpZiAoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpLmlzQWZ0ZXIob3RoZXIpKSB7XG4gICAgICAgICAgICAtLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gK290aGVyIC0gK2Jhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIGlmICghKGJhc2UuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlciA9IGNsb25lV2l0aE9mZnNldChvdGhlciwgYmFzZSk7XG4gICAgICAgIGlmIChiYXNlLmlzQmVmb3JlKG90aGVyKSkge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKG90aGVyLCBiYXNlKTtcbiAgICAgICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSAtcmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHJlcy5tb250aHMgPSAtcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlICduYW1lJyBhcmcgYWZ0ZXIgZGVwcmVjYXRpb24gaXMgcmVtb3ZlZFxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFkZGVyKGRpcmVjdGlvbiwgbmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgZHVyLCB0bXA7XG4gICAgICAgICAgICAvL2ludmVydCB0aGUgYXJndW1lbnRzLCBidXQgY29tcGxhaW4gYWJvdXQgaXRcbiAgICAgICAgICAgIGlmIChwZXJpb2QgIT09IG51bGwgJiYgIWlzTmFOKCtwZXJpb2QpKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAnbW9tZW50KCkuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcobnVtYmVyLCBwZXJpb2QpLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9hZGQtaW52ZXJ0ZWQtcGFyYW0vIGZvciBtb3JlIGluZm8uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdG1wID0gdmFsO1xuICAgICAgICAgICAgICAgIHZhbCA9IHBlcmlvZDtcbiAgICAgICAgICAgICAgICBwZXJpb2QgPSB0bXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGR1ciA9IGNyZWF0ZUR1cmF0aW9uKHZhbCwgcGVyaW9kKTtcbiAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGR1ciwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0KG1vbSwgZHVyYXRpb24sIGlzQWRkaW5nLCB1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gYWJzUm91bmQoZHVyYXRpb24uX2RheXMpLFxuICAgICAgICAgICAgbW9udGhzID0gYWJzUm91bmQoZHVyYXRpb24uX21vbnRocyk7XG5cbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBObyBvcFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlT2Zmc2V0ID0gdXBkYXRlT2Zmc2V0ID09IG51bGwgPyB0cnVlIDogdXBkYXRlT2Zmc2V0O1xuXG4gICAgICAgIGlmIChtb250aHMpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG1vbSwgZ2V0KG1vbSwgJ01vbnRoJykgKyBtb250aHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheXMpIHtcbiAgICAgICAgICAgIHNldCQxKG1vbSwgJ0RhdGUnLCBnZXQobW9tLCAnRGF0ZScpICsgZGF5cyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICBtb20uX2Quc2V0VGltZShtb20uX2QudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChtb20sIGRheXMgfHwgbW9udGhzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhZGQgPSBjcmVhdGVBZGRlcigxLCAnYWRkJyksXG4gICAgICAgIHN1YnRyYWN0ID0gY3JlYXRlQWRkZXIoLTEsICdzdWJ0cmFjdCcpO1xuXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gdHlwZSBNb21lbnRJbnB1dCA9IE1vbWVudCB8IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgTW9tZW50SW5wdXRPYmplY3QgfCB2b2lkOyAvLyBudWxsIHwgdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaXNNb21lbnRJbnB1dChpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNNb21lbnQoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc0RhdGUoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc1N0cmluZyhpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzTnVtYmVyKGlucHV0KSB8fFxuICAgICAgICAgICAgaXNOdW1iZXJPclN0cmluZ0FycmF5KGlucHV0KSB8fFxuICAgICAgICAgICAgaXNNb21lbnRJbnB1dE9iamVjdChpbnB1dCkgfHxcbiAgICAgICAgICAgIGlucHV0ID09PSBudWxsIHx8XG4gICAgICAgICAgICBpbnB1dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNNb21lbnRJbnB1dE9iamVjdChpbnB1dCkge1xuICAgICAgICB2YXIgb2JqZWN0VGVzdCA9IGlzT2JqZWN0KGlucHV0KSAmJiAhaXNPYmplY3RFbXB0eShpbnB1dCksXG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAgICAgJ3llYXJzJyxcbiAgICAgICAgICAgICAgICAneWVhcicsXG4gICAgICAgICAgICAgICAgJ3knLFxuICAgICAgICAgICAgICAgICdtb250aHMnLFxuICAgICAgICAgICAgICAgICdtb250aCcsXG4gICAgICAgICAgICAgICAgJ00nLFxuICAgICAgICAgICAgICAgICdkYXlzJyxcbiAgICAgICAgICAgICAgICAnZGF5JyxcbiAgICAgICAgICAgICAgICAnZCcsXG4gICAgICAgICAgICAgICAgJ2RhdGVzJyxcbiAgICAgICAgICAgICAgICAnZGF0ZScsXG4gICAgICAgICAgICAgICAgJ0QnLFxuICAgICAgICAgICAgICAgICdob3VycycsXG4gICAgICAgICAgICAgICAgJ2hvdXInLFxuICAgICAgICAgICAgICAgICdoJyxcbiAgICAgICAgICAgICAgICAnbWludXRlcycsXG4gICAgICAgICAgICAgICAgJ21pbnV0ZScsXG4gICAgICAgICAgICAgICAgJ20nLFxuICAgICAgICAgICAgICAgICdzZWNvbmRzJyxcbiAgICAgICAgICAgICAgICAnc2Vjb25kJyxcbiAgICAgICAgICAgICAgICAncycsXG4gICAgICAgICAgICAgICAgJ21pbGxpc2Vjb25kcycsXG4gICAgICAgICAgICAgICAgJ21pbGxpc2Vjb25kJyxcbiAgICAgICAgICAgICAgICAnbXMnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHByb3BlcnR5TGVuID0gcHJvcGVydGllcy5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHByb3BlcnR5TGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgIHByb3BlcnR5VGVzdCA9IHByb3BlcnR5VGVzdCB8fCBoYXNPd25Qcm9wKGlucHV0LCBwcm9wZXJ0eSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2JqZWN0VGVzdCAmJiBwcm9wZXJ0eVRlc3Q7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXJPclN0cmluZ0FycmF5KGlucHV0KSB7XG4gICAgICAgIHZhciBhcnJheVRlc3QgPSBpc0FycmF5KGlucHV0KSxcbiAgICAgICAgICAgIGRhdGFUeXBlVGVzdCA9IGZhbHNlO1xuICAgICAgICBpZiAoYXJyYXlUZXN0KSB7XG4gICAgICAgICAgICBkYXRhVHlwZVRlc3QgPVxuICAgICAgICAgICAgICAgIGlucHV0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzTnVtYmVyKGl0ZW0pICYmIGlzU3RyaW5nKGlucHV0KTtcbiAgICAgICAgICAgICAgICB9KS5sZW5ndGggPT09IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5VGVzdCAmJiBkYXRhVHlwZVRlc3Q7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNDYWxlbmRhclNwZWMoaW5wdXQpIHtcbiAgICAgICAgdmFyIG9iamVjdFRlc3QgPSBpc09iamVjdChpbnB1dCkgJiYgIWlzT2JqZWN0RW1wdHkoaW5wdXQpLFxuICAgICAgICAgICAgcHJvcGVydHlUZXN0ID0gZmFsc2UsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0gW1xuICAgICAgICAgICAgICAgICdzYW1lRGF5JyxcbiAgICAgICAgICAgICAgICAnbmV4dERheScsXG4gICAgICAgICAgICAgICAgJ2xhc3REYXknLFxuICAgICAgICAgICAgICAgICduZXh0V2VlaycsXG4gICAgICAgICAgICAgICAgJ2xhc3RXZWVrJyxcbiAgICAgICAgICAgICAgICAnc2FtZUVsc2UnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwcm9wZXJ0eTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgcHJvcGVydHlUZXN0ID0gcHJvcGVydHlUZXN0IHx8IGhhc093blByb3AoaW5wdXQsIHByb3BlcnR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYmplY3RUZXN0ICYmIHByb3BlcnR5VGVzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDYWxlbmRhckZvcm1hdChteU1vbWVudCwgbm93KSB7XG4gICAgICAgIHZhciBkaWZmID0gbXlNb21lbnQuZGlmZihub3csICdkYXlzJywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBkaWZmIDwgLTZcbiAgICAgICAgICAgID8gJ3NhbWVFbHNlJ1xuICAgICAgICAgICAgOiBkaWZmIDwgLTFcbiAgICAgICAgICAgICAgPyAnbGFzdFdlZWsnXG4gICAgICAgICAgICAgIDogZGlmZiA8IDBcbiAgICAgICAgICAgICAgICA/ICdsYXN0RGF5J1xuICAgICAgICAgICAgICAgIDogZGlmZiA8IDFcbiAgICAgICAgICAgICAgICAgID8gJ3NhbWVEYXknXG4gICAgICAgICAgICAgICAgICA6IGRpZmYgPCAyXG4gICAgICAgICAgICAgICAgICAgID8gJ25leHREYXknXG4gICAgICAgICAgICAgICAgICAgIDogZGlmZiA8IDdcbiAgICAgICAgICAgICAgICAgICAgICA/ICduZXh0V2VlaydcbiAgICAgICAgICAgICAgICAgICAgICA6ICdzYW1lRWxzZSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsZW5kYXIkMSh0aW1lLCBmb3JtYXRzKSB7XG4gICAgICAgIC8vIFN1cHBvcnQgZm9yIHNpbmdsZSBwYXJhbWV0ZXIsIGZvcm1hdHMgb25seSBvdmVybG9hZCB0byB0aGUgY2FsZW5kYXIgZnVuY3Rpb25cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmICghYXJndW1lbnRzWzBdKSB7XG4gICAgICAgICAgICAgICAgdGltZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3JtYXRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc01vbWVudElucHV0KGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgICAgICAgICB0aW1lID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIGZvcm1hdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQ2FsZW5kYXJTcGVjKGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgICAgICAgICBmb3JtYXRzID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgIHRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2Ugd2FudCB0byBjb21wYXJlIHRoZSBzdGFydCBvZiB0b2RheSwgdnMgdGhpcy5cbiAgICAgICAgLy8gR2V0dGluZyBzdGFydC1vZi10b2RheSBkZXBlbmRzIG9uIHdoZXRoZXIgd2UncmUgbG9jYWwvdXRjL29mZnNldCBvciBub3QuXG4gICAgICAgIHZhciBub3cgPSB0aW1lIHx8IGNyZWF0ZUxvY2FsKCksXG4gICAgICAgICAgICBzb2QgPSBjbG9uZVdpdGhPZmZzZXQobm93LCB0aGlzKS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGhvb2tzLmNhbGVuZGFyRm9ybWF0KHRoaXMsIHNvZCkgfHwgJ3NhbWVFbHNlJyxcbiAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgZm9ybWF0cyAmJlxuICAgICAgICAgICAgICAgIChpc0Z1bmN0aW9uKGZvcm1hdHNbZm9ybWF0XSlcbiAgICAgICAgICAgICAgICAgICAgPyBmb3JtYXRzW2Zvcm1hdF0uY2FsbCh0aGlzLCBub3cpXG4gICAgICAgICAgICAgICAgICAgIDogZm9ybWF0c1tmb3JtYXRdKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQoXG4gICAgICAgICAgICBvdXRwdXQgfHwgdGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIoZm9ybWF0LCB0aGlzLCBjcmVhdGVMb2NhbChub3cpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IE1vbWVudCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FmdGVyKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB8fCAnbWlsbGlzZWNvbmQnO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA+IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsSW5wdXQudmFsdWVPZigpIDwgdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmVmb3JlKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB8fCAnbWlsbGlzZWNvbmQnO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA8IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0JldHdlZW4oZnJvbSwgdG8sIHVuaXRzLCBpbmNsdXNpdml0eSkge1xuICAgICAgICB2YXIgbG9jYWxGcm9tID0gaXNNb21lbnQoZnJvbSkgPyBmcm9tIDogY3JlYXRlTG9jYWwoZnJvbSksXG4gICAgICAgICAgICBsb2NhbFRvID0gaXNNb21lbnQodG8pID8gdG8gOiBjcmVhdGVMb2NhbCh0byk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsRnJvbS5pc1ZhbGlkKCkgJiYgbG9jYWxUby5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5jbHVzaXZpdHkgPSBpbmNsdXNpdml0eSB8fCAnKCknO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGluY2x1c2l2aXR5WzBdID09PSAnKCdcbiAgICAgICAgICAgICAgICA/IHRoaXMuaXNBZnRlcihsb2NhbEZyb20sIHVuaXRzKVxuICAgICAgICAgICAgICAgIDogIXRoaXMuaXNCZWZvcmUobG9jYWxGcm9tLCB1bml0cykpICYmXG4gICAgICAgICAgICAoaW5jbHVzaXZpdHlbMV0gPT09ICcpJ1xuICAgICAgICAgICAgICAgID8gdGhpcy5pc0JlZm9yZShsb2NhbFRvLCB1bml0cylcbiAgICAgICAgICAgICAgICA6ICF0aGlzLmlzQWZ0ZXIobG9jYWxUbywgdW5pdHMpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZShpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KSxcbiAgICAgICAgICAgIGlucHV0TXM7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID09PSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0TXMgPSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKSA8PSBpbnB1dE1zICYmXG4gICAgICAgICAgICAgICAgaW5wdXRNcyA8PSB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZU9yQWZ0ZXIoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNBZnRlcihpbnB1dCwgdW5pdHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZU9yQmVmb3JlKGlucHV0LCB1bml0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NhbWUoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQmVmb3JlKGlucHV0LCB1bml0cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlmZihpbnB1dCwgdW5pdHMsIGFzRmxvYXQpIHtcbiAgICAgICAgdmFyIHRoYXQsIHpvbmVEZWx0YSwgb3V0cHV0O1xuXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB0aGF0ID0gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCB0aGlzKTtcblxuICAgICAgICBpZiAoIXRoYXQuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgem9uZURlbHRhID0gKHRoYXQudXRjT2Zmc2V0KCkgLSB0aGlzLnV0Y09mZnNldCgpKSAqIDZlNDtcblxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAxMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMWUzO1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDM2ZTU7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwXG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA4NjRlNTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCwgbmVnYXRlIGRzdFxuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0IC0gem9uZURlbHRhKSAvIDYwNDhlNTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gdGhpcyAtIHRoYXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXNGbG9hdCA/IG91dHB1dCA6IGFic0Zsb29yKG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhEaWZmKGEsIGIpIHtcbiAgICAgICAgaWYgKGEuZGF0ZSgpIDwgYi5kYXRlKCkpIHtcbiAgICAgICAgICAgIC8vIGVuZC1vZi1tb250aCBjYWxjdWxhdGlvbnMgd29yayBjb3JyZWN0IHdoZW4gdGhlIHN0YXJ0IG1vbnRoIGhhcyBtb3JlXG4gICAgICAgICAgICAvLyBkYXlzIHRoYW4gdGhlIGVuZCBtb250aC5cbiAgICAgICAgICAgIHJldHVybiAtbW9udGhEaWZmKGIsIGEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpZmZlcmVuY2UgaW4gbW9udGhzXG4gICAgICAgIHZhciB3aG9sZU1vbnRoRGlmZiA9IChiLnllYXIoKSAtIGEueWVhcigpKSAqIDEyICsgKGIubW9udGgoKSAtIGEubW9udGgoKSksXG4gICAgICAgICAgICAvLyBiIGlzIGluIChhbmNob3IgLSAxIG1vbnRoLCBhbmNob3IgKyAxIG1vbnRoKVxuICAgICAgICAgICAgYW5jaG9yID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiwgJ21vbnRocycpLFxuICAgICAgICAgICAgYW5jaG9yMixcbiAgICAgICAgICAgIGFkanVzdDtcblxuICAgICAgICBpZiAoYiAtIGFuY2hvciA8IDApIHtcbiAgICAgICAgICAgIGFuY2hvcjIgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmIC0gMSwgJ21vbnRocycpO1xuICAgICAgICAgICAgLy8gbGluZWFyIGFjcm9zcyB0aGUgbW9udGhcbiAgICAgICAgICAgIGFkanVzdCA9IChiIC0gYW5jaG9yKSAvIChhbmNob3IgLSBhbmNob3IyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFuY2hvcjIgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmICsgMSwgJ21vbnRocycpO1xuICAgICAgICAgICAgLy8gbGluZWFyIGFjcm9zcyB0aGUgbW9udGhcbiAgICAgICAgICAgIGFkanVzdCA9IChiIC0gYW5jaG9yKSAvIChhbmNob3IyIC0gYW5jaG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgZm9yIG5lZ2F0aXZlIHplcm8sIHJldHVybiB6ZXJvIGlmIG5lZ2F0aXZlIHplcm9cbiAgICAgICAgcmV0dXJuIC0od2hvbGVNb250aERpZmYgKyBhZGp1c3QpIHx8IDA7XG4gICAgfVxuXG4gICAgaG9va3MuZGVmYXVsdEZvcm1hdCA9ICdZWVlZLU1NLUREVEhIOm1tOnNzWic7XG4gICAgaG9va3MuZGVmYXVsdEZvcm1hdFV0YyA9ICdZWVlZLU1NLUREVEhIOm1tOnNzW1pdJztcblxuICAgIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgnZW4nKS5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmcoa2VlcE9mZnNldCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXRjID0ga2VlcE9mZnNldCAhPT0gdHJ1ZSxcbiAgICAgICAgICAgIG0gPSB1dGMgPyB0aGlzLmNsb25lKCkudXRjKCkgOiB0aGlzO1xuICAgICAgICBpZiAobS55ZWFyKCkgPCAwIHx8IG0ueWVhcigpID4gOTk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChcbiAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgIHV0Y1xuICAgICAgICAgICAgICAgICAgICA/ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nXG4gICAgICAgICAgICAgICAgICAgIDogJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1onXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKSkge1xuICAgICAgICAgICAgLy8gbmF0aXZlIGltcGxlbWVudGF0aW9uIGlzIH41MHggZmFzdGVyLCB1c2UgaXQgd2hlbiB3ZSBjYW5cbiAgICAgICAgICAgIGlmICh1dGMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b0RhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkgKyB0aGlzLnV0Y09mZnNldCgpICogNjAgKiAxMDAwKVxuICAgICAgICAgICAgICAgICAgICAudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnWicsIGZvcm1hdE1vbWVudChtLCAnWicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KFxuICAgICAgICAgICAgbSxcbiAgICAgICAgICAgIHV0YyA/ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBodW1hbiByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhIG1vbWVudCB0aGF0IGNhblxuICAgICAqIGFsc28gYmUgZXZhbHVhdGVkIHRvIGdldCBhIG5ldyBtb21lbnQgd2hpY2ggaXMgdGhlIHNhbWVcbiAgICAgKlxuICAgICAqIEBsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9kaXN0L2xhdGVzdC9kb2NzL2FwaS91dGlsLmh0bWwjdXRpbF9jdXN0b21faW5zcGVjdF9mdW5jdGlvbl9vbl9vYmplY3RzXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuICdtb21lbnQuaW52YWxpZCgvKiAnICsgdGhpcy5faSArICcgKi8pJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnVuYyA9ICdtb21lbnQnLFxuICAgICAgICAgICAgem9uZSA9ICcnLFxuICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgeWVhcixcbiAgICAgICAgICAgIGRhdGV0aW1lLFxuICAgICAgICAgICAgc3VmZml4O1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2NhbCgpKSB7XG4gICAgICAgICAgICBmdW5jID0gdGhpcy51dGNPZmZzZXQoKSA9PT0gMCA/ICdtb21lbnQudXRjJyA6ICdtb21lbnQucGFyc2Vab25lJztcbiAgICAgICAgICAgIHpvbmUgPSAnWic7XG4gICAgICAgIH1cbiAgICAgICAgcHJlZml4ID0gJ1snICsgZnVuYyArICcoXCJdJztcbiAgICAgICAgeWVhciA9IDAgPD0gdGhpcy55ZWFyKCkgJiYgdGhpcy55ZWFyKCkgPD0gOTk5OSA/ICdZWVlZJyA6ICdZWVlZWVknO1xuICAgICAgICBkYXRldGltZSA9ICctTU0tRERbVF1ISDptbTpzcy5TU1MnO1xuICAgICAgICBzdWZmaXggPSB6b25lICsgJ1tcIildJztcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQocHJlZml4ICsgeWVhciArIGRhdGV0aW1lICsgc3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQoaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgaWYgKCFpbnB1dFN0cmluZykge1xuICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSB0aGlzLmlzVXRjKClcbiAgICAgICAgICAgICAgICA/IGhvb2tzLmRlZmF1bHRGb3JtYXRVdGNcbiAgICAgICAgICAgICAgICA6IGhvb2tzLmRlZmF1bHRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdE1vbWVudCh0aGlzLCBpbnB1dFN0cmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbSh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fCBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHsgdG86IHRoaXMsIGZyb206IHRpbWUgfSlcbiAgICAgICAgICAgICAgICAubG9jYWxlKHRoaXMubG9jYWxlKCkpXG4gICAgICAgICAgICAgICAgLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbU5vdyh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb20oY3JlYXRlTG9jYWwoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG8odGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgKChpc01vbWVudCh0aW1lKSAmJiB0aW1lLmlzVmFsaWQoKSkgfHwgY3JlYXRlTG9jYWwodGltZSkuaXNWYWxpZCgpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7IGZyb206IHRoaXMsIHRvOiB0aW1lIH0pXG4gICAgICAgICAgICAgICAgLmxvY2FsZSh0aGlzLmxvY2FsZSgpKVxuICAgICAgICAgICAgICAgIC5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvTm93KHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG8oY3JlYXRlTG9jYWwoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuXG4gICAgLy8gSWYgcGFzc2VkIGEgbG9jYWxlIGtleSwgaXQgd2lsbCBzZXQgdGhlIGxvY2FsZSBmb3IgdGhpc1xuICAgIC8vIGluc3RhbmNlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHJldHVybiB0aGUgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbiAgICAvLyB2YXJpYWJsZXMgZm9yIHRoaXMgaW5zdGFuY2UuXG4gICAgZnVuY3Rpb24gbG9jYWxlKGtleSkge1xuICAgICAgICB2YXIgbmV3TG9jYWxlRGF0YTtcblxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMb2NhbGVEYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobmV3TG9jYWxlRGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gbmV3TG9jYWxlRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLicsXG4gICAgICAgIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICB2YXIgTVNfUEVSX1NFQ09ORCA9IDEwMDAsXG4gICAgICAgIE1TX1BFUl9NSU5VVEUgPSA2MCAqIE1TX1BFUl9TRUNPTkQsXG4gICAgICAgIE1TX1BFUl9IT1VSID0gNjAgKiBNU19QRVJfTUlOVVRFLFxuICAgICAgICBNU19QRVJfNDAwX1lFQVJTID0gKDM2NSAqIDQwMCArIDk3KSAqIDI0ICogTVNfUEVSX0hPVVI7XG5cbiAgICAvLyBhY3R1YWwgbW9kdWxvIC0gaGFuZGxlcyBuZWdhdGl2ZSBudW1iZXJzIChmb3IgZGF0ZXMgYmVmb3JlIDE5NzApOlxuICAgIGZ1bmN0aW9uIG1vZCQxKGRpdmlkZW5kLCBkaXZpc29yKSB7XG4gICAgICAgIHJldHVybiAoKGRpdmlkZW5kICUgZGl2aXNvcikgKyBkaXZpc29yKSAlIGRpdmlzb3I7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxTdGFydE9mRGF0ZSh5LCBtLCBkKSB7XG4gICAgICAgIC8vIHRoZSBkYXRlIGNvbnN0cnVjdG9yIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSArIDQwMCwgbSwgZCkgLSBNU19QRVJfNDAwX1lFQVJTO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHksIG0sIGQpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHV0Y1N0YXJ0T2ZEYXRlKHksIG0sIGQpIHtcbiAgICAgICAgLy8gRGF0ZS5VVEMgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIHJldHVybiBEYXRlLlVUQyh5ICsgNDAwLCBtLCBkKSAtIE1TX1BFUl80MDBfWUVBUlM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gRGF0ZS5VVEMoeSwgbSwgZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGFydE9mKHVuaXRzKSB7XG4gICAgICAgIHZhciB0aW1lLCBzdGFydE9mRGF0ZTtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnIHx8ICF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE9mRGF0ZSA9IHRoaXMuX2lzVVRDID8gdXRjU3RhcnRPZkRhdGUgOiBsb2NhbFN0YXJ0T2ZEYXRlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCkgLSAodGhpcy5tb250aCgpICUgMyksXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSB0aGlzLndlZWtkYXkoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpc29XZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gKHRoaXMuaXNvV2Vla2RheSgpIC0gMSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSAtPSBtb2QkMShcbiAgICAgICAgICAgICAgICAgICAgdGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksXG4gICAgICAgICAgICAgICAgICAgIE1TX1BFUl9IT1VSXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEodGltZSwgTVNfUEVSX01JTlVURSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKHRpbWUsIE1TX1BFUl9TRUNPTkQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZC5zZXRUaW1lKHRpbWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZE9mKHVuaXRzKSB7XG4gICAgICAgIHZhciB0aW1lLCBzdGFydE9mRGF0ZTtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnIHx8ICF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE9mRGF0ZSA9IHRoaXMuX2lzVVRDID8gdXRjU3RhcnRPZkRhdGUgOiBsb2NhbFN0YXJ0T2ZEYXRlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSArIDEsIDAsIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgICAgICAgICBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpIC0gKHRoaXMubW9udGgoKSAlIDMpICsgMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkgKyAxLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gdGhpcy53ZWVrZGF5KCkgKyA3XG4gICAgICAgICAgICAgICAgICAgICkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaXNvV2Vlayc6XG4gICAgICAgICAgICAgICAgdGltZSA9XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpICsgN1xuICAgICAgICAgICAgICAgICAgICApIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCkgKyAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSArPVxuICAgICAgICAgICAgICAgICAgICBNU19QRVJfSE9VUiAtXG4gICAgICAgICAgICAgICAgICAgIG1vZCQxKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksXG4gICAgICAgICAgICAgICAgICAgICAgICBNU19QRVJfSE9VUlxuICAgICAgICAgICAgICAgICAgICApIC1cbiAgICAgICAgICAgICAgICAgICAgMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgKz0gTVNfUEVSX01JTlVURSAtIG1vZCQxKHRpbWUsIE1TX1BFUl9NSU5VVEUpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgKz0gTVNfUEVSX1NFQ09ORCAtIG1vZCQxKHRpbWUsIE1TX1BFUl9TRUNPTkQpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Quc2V0VGltZSh0aW1lKTtcbiAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZC52YWx1ZU9mKCkgLSAodGhpcy5fb2Zmc2V0IHx8IDApICogNjAwMDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5peCgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy52YWx1ZU9mKCkgLyAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0RhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbS55ZWFyKCksXG4gICAgICAgICAgICBtLm1vbnRoKCksXG4gICAgICAgICAgICBtLmRhdGUoKSxcbiAgICAgICAgICAgIG0uaG91cigpLFxuICAgICAgICAgICAgbS5taW51dGUoKSxcbiAgICAgICAgICAgIG0uc2Vjb25kKCksXG4gICAgICAgICAgICBtLm1pbGxpc2Vjb25kKCksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9PYmplY3QoKSB7XG4gICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXJzOiBtLnllYXIoKSxcbiAgICAgICAgICAgIG1vbnRoczogbS5tb250aCgpLFxuICAgICAgICAgICAgZGF0ZTogbS5kYXRlKCksXG4gICAgICAgICAgICBob3VyczogbS5ob3VycygpLFxuICAgICAgICAgICAgbWludXRlczogbS5taW51dGVzKCksXG4gICAgICAgICAgICBzZWNvbmRzOiBtLnNlY29uZHMoKSxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kczogbS5taWxsaXNlY29uZHMoKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICAgIC8vIG5ldyBEYXRlKE5hTikudG9KU09OKCkgPT09IG51bGxcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy50b0lTT1N0cmluZygpIDogbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDIoKSB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkKHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNpbmdGbGFncygpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkQXQoKSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJzaW5nRmxhZ3ModGhpcykub3ZlcmZsb3c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRpb25EYXRhKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5wdXQ6IHRoaXMuX2ksXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuX2YsXG4gICAgICAgICAgICBsb2NhbGU6IHRoaXMuX2xvY2FsZSxcbiAgICAgICAgICAgIGlzVVRDOiB0aGlzLl9pc1VUQyxcbiAgICAgICAgICAgIHN0cmljdDogdGhpcy5fc3RyaWN0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdOJywgMCwgMCwgJ2VyYUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignTk4nLCAwLCAwLCAnZXJhQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTk4nLCAwLCAwLCAnZXJhQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTk5OJywgMCwgMCwgJ2VyYU5hbWUnKTtcbiAgICBhZGRGb3JtYXRUb2tlbignTk5OTk4nLCAwLCAwLCAnZXJhTmFycm93Jyk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigneScsIFsneScsIDFdLCAneW8nLCAnZXJhWWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5eScsIDJdLCAwLCAnZXJhWWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5eXknLCAzXSwgMCwgJ2VyYVllYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigneScsIFsneXl5eScsIDRdLCAwLCAnZXJhWWVhcicpO1xuXG4gICAgYWRkUmVnZXhUb2tlbignTicsIG1hdGNoRXJhQWJicik7XG4gICAgYWRkUmVnZXhUb2tlbignTk4nLCBtYXRjaEVyYUFiYnIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ05OTicsIG1hdGNoRXJhQWJicik7XG4gICAgYWRkUmVnZXhUb2tlbignTk5OTicsIG1hdGNoRXJhTmFtZSk7XG4gICAgYWRkUmVnZXhUb2tlbignTk5OTk4nLCBtYXRjaEVyYU5hcnJvdyk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFxuICAgICAgICBbJ04nLCAnTk4nLCAnTk5OJywgJ05OTk4nLCAnTk5OTk4nXSxcbiAgICAgICAgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICAgICAgdmFyIGVyYSA9IGNvbmZpZy5fbG9jYWxlLmVyYXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgICAgIGlmIChlcmEpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lcmEgPSBlcmE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRFcmEgPSBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBhZGRSZWdleFRva2VuKCd5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneXknLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5eXknLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5eXl5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneW8nLCBtYXRjaEVyYVllYXJPcmRpbmFsKTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWyd5JywgJ3l5JywgJ3l5eScsICd5eXl5J10sIFlFQVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWyd5byddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciBtYXRjaDtcbiAgICAgICAgaWYgKGNvbmZpZy5fbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4KSB7XG4gICAgICAgICAgICBtYXRjaCA9IGlucHV0Lm1hdGNoKGNvbmZpZy5fbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX2xvY2FsZS5lcmFZZWFyT3JkaW5hbFBhcnNlKSB7XG4gICAgICAgICAgICBhcnJheVtZRUFSXSA9IGNvbmZpZy5fbG9jYWxlLmVyYVllYXJPcmRpbmFsUGFyc2UoaW5wdXQsIG1hdGNoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRXJhcyhtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLl9lcmFzIHx8IGdldExvY2FsZSgnZW4nKS5fZXJhcztcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gaG9va3MoZXJhc1tpXS5zaW5jZSkuc3RhcnRPZignZGF5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0uc2luY2UgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLnVudGlsID0gK0luZmluaXR5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICAgICAgICAgIGRhdGUgPSBob29rcyhlcmFzW2ldLnVudGlsKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0udW50aWwgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVyYXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlRXJhc1BhcnNlKGVyYU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmVyYXMoKSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBhYmJyLFxuICAgICAgICAgICAgbmFycm93O1xuICAgICAgICBlcmFOYW1lID0gZXJhTmFtZS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgbmFtZSA9IGVyYXNbaV0ubmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgYWJiciA9IGVyYXNbaV0uYWJici50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgbmFycm93ID0gZXJhc1tpXS5uYXJyb3cudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ04nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OTic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJiciA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk5OTic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk5OTk4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hcnJvdyA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChbbmFtZSwgYWJiciwgbmFycm93XS5pbmRleE9mKGVyYU5hbWUpID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUVyYXNDb252ZXJ0WWVhcihlcmEsIHllYXIpIHtcbiAgICAgICAgdmFyIGRpciA9IGVyYS5zaW5jZSA8PSBlcmEudW50aWwgPyArMSA6IC0xO1xuICAgICAgICBpZiAoeWVhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaG9va3MoZXJhLnNpbmNlKS55ZWFyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaG9va3MoZXJhLnNpbmNlKS55ZWFyKCkgKyAoeWVhciAtIGVyYS5vZmZzZXQpICogZGlyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhTmFtZSgpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoZXJhc1tpXS5zaW5jZSA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFcmFOYXJyb3coKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFycm93O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFycm93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYUFiYnIoKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0uYWJicjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLmFiYnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhWWVhcigpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZGlyLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBkaXIgPSBlcmFzW2ldLnNpbmNlIDw9IGVyYXNbaV0udW50aWwgPyArMSA6IC0xO1xuXG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB8fFxuICAgICAgICAgICAgICAgIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnllYXIoKSAtIGhvb2tzKGVyYXNbaV0uc2luY2UpLnllYXIoKSkgKiBkaXIgK1xuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLm9mZnNldFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy55ZWFyKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJhc05hbWVSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19lcmFzTmFtZVJlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVFcmFzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgPyB0aGlzLl9lcmFzTmFtZVJlZ2V4IDogdGhpcy5fZXJhc1JlZ2V4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVyYXNBYmJyUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfZXJhc0FiYnJSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlRXJhc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID8gdGhpcy5fZXJhc0FiYnJSZWdleCA6IHRoaXMuX2VyYXNSZWdleDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcmFzTmFycm93UmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfZXJhc05hcnJvd1JlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVFcmFzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgPyB0aGlzLl9lcmFzTmFycm93UmVnZXggOiB0aGlzLl9lcmFzUmVnZXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hFcmFBYmJyKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5lcmFzQWJiclJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYU5hbWUoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmVyYXNOYW1lUmVnZXgoaXNTdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhTmFycm93KGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5lcmFzTmFycm93UmVnZXgoaXNTdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhWWVhck9yZGluYWwoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4IHx8IG1hdGNoVW5zaWduZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZUVyYXNQYXJzZSgpIHtcbiAgICAgICAgdmFyIGFiYnJQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG5hbWVQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG5hcnJvd1BpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZXJhc05hbWUsXG4gICAgICAgICAgICBlcmFzQWJicixcbiAgICAgICAgICAgIGVyYXNOYXJyb3csXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5lcmFzKCk7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBlcmFzTmFtZSA9IHJlZ2V4RXNjYXBlKGVyYXNbaV0ubmFtZSk7XG4gICAgICAgICAgICBlcmFzQWJiciA9IHJlZ2V4RXNjYXBlKGVyYXNbaV0uYWJicik7XG4gICAgICAgICAgICBlcmFzTmFycm93ID0gcmVnZXhFc2NhcGUoZXJhc1tpXS5uYXJyb3cpO1xuXG4gICAgICAgICAgICBuYW1lUGllY2VzLnB1c2goZXJhc05hbWUpO1xuICAgICAgICAgICAgYWJiclBpZWNlcy5wdXNoKGVyYXNBYmJyKTtcbiAgICAgICAgICAgIG5hcnJvd1BpZWNlcy5wdXNoKGVyYXNOYXJyb3cpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChlcmFzTmFtZSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGVyYXNBYmJyKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2goZXJhc05hcnJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lcmFzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX2VyYXNOYW1lUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBuYW1lUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fZXJhc0FiYnJSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGFiYnJQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9lcmFzTmFycm93UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIG5hcnJvd1BpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ2dnJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnR0cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1llYXJGb3JtYXRUb2tlbih0b2tlbiwgZ2V0dGVyKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKDAsIFt0b2tlbiwgdG9rZW4ubGVuZ3RoXSwgMCwgZ2V0dGVyKTtcbiAgICB9XG5cbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnJywgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZ2cnLCAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHR0cnLCAnaXNvV2Vla1llYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0cnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignZycsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdHRycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdnZycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHJywgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2cnLCBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHR0cnLCBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZ2cnLCBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihcbiAgICAgICAgWydnZ2dnJywgJ2dnZ2dnJywgJ0dHR0cnLCAnR0dHR0cnXSxcbiAgICAgICAgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAyKV0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydnZycsICdHRyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHRoaXMud2VlaygpLFxuICAgICAgICAgICAgdGhpcy53ZWVrZGF5KCkgKyB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3csXG4gICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3csXG4gICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3lcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrWWVhcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHRoaXMuaXNvV2VlaygpLFxuICAgICAgICAgICAgdGhpcy5pc29XZWVrZGF5KCksXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgNFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldElTT1dlZWtzSW5ZZWFyKCkge1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIDEsIDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldElTT1dlZWtzSW5JU09XZWVrWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMuaXNvV2Vla1llYXIoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0V2Vla3NJblllYXIoKSB7XG4gICAgICAgIHZhciB3ZWVrSW5mbyA9IHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrO1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIHdlZWtJbmZvLmRvdywgd2Vla0luZm8uZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRXZWVrc0luV2Vla1llYXIoKSB7XG4gICAgICAgIHZhciB3ZWVrSW5mbyA9IHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrO1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy53ZWVrWWVhcigpLCB3ZWVrSW5mby5kb3csIHdlZWtJbmZvLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXJIZWxwZXIoaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrc1RhcmdldDtcbiAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKHRoaXMsIGRvdywgZG95KS55ZWFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2Vla3NUYXJnZXQgPSB3ZWVrc0luWWVhcihpbnB1dCwgZG93LCBkb3kpO1xuICAgICAgICAgICAgaWYgKHdlZWsgPiB3ZWVrc1RhcmdldCkge1xuICAgICAgICAgICAgICAgIHdlZWsgPSB3ZWVrc1RhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZXRXZWVrQWxsLmNhbGwodGhpcywgaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFdlZWtBbGwod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXJEYXRhID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZShkYXlPZlllYXJEYXRhLnllYXIsIDAsIGRheU9mWWVhckRhdGEuZGF5T2ZZZWFyKTtcblxuICAgICAgICB0aGlzLnllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpKTtcbiAgICAgICAgdGhpcy5tb250aChkYXRlLmdldFVUQ01vbnRoKCkpO1xuICAgICAgICB0aGlzLmRhdGUoZGF0ZS5nZXRVVENEYXRlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUScsIDAsICdRbycsICdxdWFydGVyJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdRJywgbWF0Y2gxKTtcbiAgICBhZGRQYXJzZVRva2VuKCdRJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSAodG9JbnQoaW5wdXQpIC0gMSkgKiAzO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0UXVhcnRlcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbFxuICAgICAgICAgICAgPyBNYXRoLmNlaWwoKHRoaXMubW9udGgoKSArIDEpIC8gMylcbiAgICAgICAgICAgIDogdGhpcy5tb250aCgoaW5wdXQgLSAxKSAqIDMgKyAodGhpcy5tb250aCgpICUgMykpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEJywgWydERCcsIDJdLCAnRG8nLCAnZGF0ZScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRCcsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignREQnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignRG8nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHJldHVybiBpc1N0cmljdFxuICAgICAgICAgICAgPyBsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2UgfHwgbG9jYWxlLl9vcmRpbmFsUGFyc2VcbiAgICAgICAgICAgIDogbG9jYWxlLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudDtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydEJywgJ0REJ10sIERBVEUpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtEQVRFXSA9IHRvSW50KGlucHV0Lm1hdGNoKG1hdGNoMXRvMilbMF0pO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldERheU9mTW9udGggPSBtYWtlR2V0U2V0KCdEYXRlJywgdHJ1ZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignREREJywgWydEREREJywgM10sICdERERvJywgJ2RheU9mWWVhcicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignREREJywgbWF0Y2gxdG8zKTtcbiAgICBhZGRSZWdleFRva2VuKCdEREREJywgbWF0Y2gzKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnREREJywgJ0REREQnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZZZWFyKGlucHV0KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXIgPVxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAodGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpIC0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ3llYXInKSkgLyA4NjRlNVxuICAgICAgICAgICAgKSArIDE7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gZGF5T2ZZZWFyIDogdGhpcy5hZGQoaW5wdXQgLSBkYXlPZlllYXIsICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ20nLCBbJ21tJywgMl0sIDAsICdtaW51dGUnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ20nLCBtYXRjaDF0bzIsIG1hdGNoMXRvMkhhc1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ21tJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydtJywgJ21tJ10sIE1JTlVURSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0TWludXRlID0gbWFrZUdldFNldCgnTWludXRlcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdzJywgWydzcycsIDJdLCAwLCAnc2Vjb25kJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdzJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJIYXNaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdzcycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsncycsICdzcyddLCBTRUNPTkQpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFNlY29uZCA9IG1ha2VHZXRTZXQoJ1NlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTJywgM10sIDAsICdtaWxsaXNlY29uZCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTUycsIDRdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTJywgNV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTUycsIDZdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTUycsIDddLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTJywgOF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTUycsIDldLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDAwO1xuICAgIH0pO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUycsIG1hdGNoMXRvMywgbWF0Y2gxKTtcbiAgICBhZGRSZWdleFRva2VuKCdTUycsIG1hdGNoMXRvMywgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdTU1MnLCBtYXRjaDF0bzMsIG1hdGNoMyk7XG5cbiAgICB2YXIgdG9rZW4sIGdldFNldE1pbGxpc2Vjb25kO1xuICAgIGZvciAodG9rZW4gPSAnU1NTUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUmVnZXhUb2tlbih0b2tlbiwgbWF0Y2hVbnNpZ25lZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VNcyhpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTUlMTElTRUNPTkRdID0gdG9JbnQoKCcwLicgKyBpbnB1dCkgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmb3IgKHRva2VuID0gJ1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIHBhcnNlTXMpO1xuICAgIH1cblxuICAgIGdldFNldE1pbGxpc2Vjb25kID0gbWFrZUdldFNldCgnTWlsbGlzZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3onLCAwLCAwLCAnem9uZUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignenonLCAwLCAwLCAnem9uZU5hbWUnKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFpvbmVBYmJyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFpvbmVOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUnIDogJyc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gTW9tZW50LnByb3RvdHlwZTtcblxuICAgIHByb3RvLmFkZCA9IGFkZDtcbiAgICBwcm90by5jYWxlbmRhciA9IGNhbGVuZGFyJDE7XG4gICAgcHJvdG8uY2xvbmUgPSBjbG9uZTtcbiAgICBwcm90by5kaWZmID0gZGlmZjtcbiAgICBwcm90by5lbmRPZiA9IGVuZE9mO1xuICAgIHByb3RvLmZvcm1hdCA9IGZvcm1hdDtcbiAgICBwcm90by5mcm9tID0gZnJvbTtcbiAgICBwcm90by5mcm9tTm93ID0gZnJvbU5vdztcbiAgICBwcm90by50byA9IHRvO1xuICAgIHByb3RvLnRvTm93ID0gdG9Ob3c7XG4gICAgcHJvdG8uZ2V0ID0gc3RyaW5nR2V0O1xuICAgIHByb3RvLmludmFsaWRBdCA9IGludmFsaWRBdDtcbiAgICBwcm90by5pc0FmdGVyID0gaXNBZnRlcjtcbiAgICBwcm90by5pc0JlZm9yZSA9IGlzQmVmb3JlO1xuICAgIHByb3RvLmlzQmV0d2VlbiA9IGlzQmV0d2VlbjtcbiAgICBwcm90by5pc1NhbWUgPSBpc1NhbWU7XG4gICAgcHJvdG8uaXNTYW1lT3JBZnRlciA9IGlzU2FtZU9yQWZ0ZXI7XG4gICAgcHJvdG8uaXNTYW1lT3JCZWZvcmUgPSBpc1NhbWVPckJlZm9yZTtcbiAgICBwcm90by5pc1ZhbGlkID0gaXNWYWxpZCQyO1xuICAgIHByb3RvLmxhbmcgPSBsYW5nO1xuICAgIHByb3RvLmxvY2FsZSA9IGxvY2FsZTtcbiAgICBwcm90by5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcbiAgICBwcm90by5tYXggPSBwcm90b3R5cGVNYXg7XG4gICAgcHJvdG8ubWluID0gcHJvdG90eXBlTWluO1xuICAgIHByb3RvLnBhcnNpbmdGbGFncyA9IHBhcnNpbmdGbGFncztcbiAgICBwcm90by5zZXQgPSBzdHJpbmdTZXQ7XG4gICAgcHJvdG8uc3RhcnRPZiA9IHN0YXJ0T2Y7XG4gICAgcHJvdG8uc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICBwcm90by50b0FycmF5ID0gdG9BcnJheTtcbiAgICBwcm90by50b09iamVjdCA9IHRvT2JqZWN0O1xuICAgIHByb3RvLnRvRGF0ZSA9IHRvRGF0ZTtcbiAgICBwcm90by50b0lTT1N0cmluZyA9IHRvSVNPU3RyaW5nO1xuICAgIHByb3RvLmluc3BlY3QgPSBpbnNwZWN0O1xuICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuZm9yICE9IG51bGwpIHtcbiAgICAgICAgcHJvdG9bU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ01vbWVudDwnICsgdGhpcy5mb3JtYXQoKSArICc+JztcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHJvdG8udG9KU09OID0gdG9KU09OO1xuICAgIHByb3RvLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgcHJvdG8udW5peCA9IHVuaXg7XG4gICAgcHJvdG8udmFsdWVPZiA9IHZhbHVlT2Y7XG4gICAgcHJvdG8uY3JlYXRpb25EYXRhID0gY3JlYXRpb25EYXRhO1xuICAgIHByb3RvLmVyYU5hbWUgPSBnZXRFcmFOYW1lO1xuICAgIHByb3RvLmVyYU5hcnJvdyA9IGdldEVyYU5hcnJvdztcbiAgICBwcm90by5lcmFBYmJyID0gZ2V0RXJhQWJicjtcbiAgICBwcm90by5lcmFZZWFyID0gZ2V0RXJhWWVhcjtcbiAgICBwcm90by55ZWFyID0gZ2V0U2V0WWVhcjtcbiAgICBwcm90by5pc0xlYXBZZWFyID0gZ2V0SXNMZWFwWWVhcjtcbiAgICBwcm90by53ZWVrWWVhciA9IGdldFNldFdlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtZZWFyID0gZ2V0U2V0SVNPV2Vla1llYXI7XG4gICAgcHJvdG8ucXVhcnRlciA9IHByb3RvLnF1YXJ0ZXJzID0gZ2V0U2V0UXVhcnRlcjtcbiAgICBwcm90by5tb250aCA9IGdldFNldE1vbnRoO1xuICAgIHByb3RvLmRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGg7XG4gICAgcHJvdG8ud2VlayA9IHByb3RvLndlZWtzID0gZ2V0U2V0V2VlaztcbiAgICBwcm90by5pc29XZWVrID0gcHJvdG8uaXNvV2Vla3MgPSBnZXRTZXRJU09XZWVrO1xuICAgIHByb3RvLndlZWtzSW5ZZWFyID0gZ2V0V2Vla3NJblllYXI7XG4gICAgcHJvdG8ud2Vla3NJbldlZWtZZWFyID0gZ2V0V2Vla3NJbldlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtzSW5ZZWFyID0gZ2V0SVNPV2Vla3NJblllYXI7XG4gICAgcHJvdG8uaXNvV2Vla3NJbklTT1dlZWtZZWFyID0gZ2V0SVNPV2Vla3NJbklTT1dlZWtZZWFyO1xuICAgIHByb3RvLmRhdGUgPSBnZXRTZXREYXlPZk1vbnRoO1xuICAgIHByb3RvLmRheSA9IHByb3RvLmRheXMgPSBnZXRTZXREYXlPZldlZWs7XG4gICAgcHJvdG8ud2Vla2RheSA9IGdldFNldExvY2FsZURheU9mV2VlaztcbiAgICBwcm90by5pc29XZWVrZGF5ID0gZ2V0U2V0SVNPRGF5T2ZXZWVrO1xuICAgIHByb3RvLmRheU9mWWVhciA9IGdldFNldERheU9mWWVhcjtcbiAgICBwcm90by5ob3VyID0gcHJvdG8uaG91cnMgPSBnZXRTZXRIb3VyO1xuICAgIHByb3RvLm1pbnV0ZSA9IHByb3RvLm1pbnV0ZXMgPSBnZXRTZXRNaW51dGU7XG4gICAgcHJvdG8uc2Vjb25kID0gcHJvdG8uc2Vjb25kcyA9IGdldFNldFNlY29uZDtcbiAgICBwcm90by5taWxsaXNlY29uZCA9IHByb3RvLm1pbGxpc2Vjb25kcyA9IGdldFNldE1pbGxpc2Vjb25kO1xuICAgIHByb3RvLnV0Y09mZnNldCA9IGdldFNldE9mZnNldDtcbiAgICBwcm90by51dGMgPSBzZXRPZmZzZXRUb1VUQztcbiAgICBwcm90by5sb2NhbCA9IHNldE9mZnNldFRvTG9jYWw7XG4gICAgcHJvdG8ucGFyc2Vab25lID0gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQ7XG4gICAgcHJvdG8uaGFzQWxpZ25lZEhvdXJPZmZzZXQgPSBoYXNBbGlnbmVkSG91ck9mZnNldDtcbiAgICBwcm90by5pc0RTVCA9IGlzRGF5bGlnaHRTYXZpbmdUaW1lO1xuICAgIHByb3RvLmlzTG9jYWwgPSBpc0xvY2FsO1xuICAgIHByb3RvLmlzVXRjT2Zmc2V0ID0gaXNVdGNPZmZzZXQ7XG4gICAgcHJvdG8uaXNVdGMgPSBpc1V0YztcbiAgICBwcm90by5pc1VUQyA9IGlzVXRjO1xuICAgIHByb3RvLnpvbmVBYmJyID0gZ2V0Wm9uZUFiYnI7XG4gICAgcHJvdG8uem9uZU5hbWUgPSBnZXRab25lTmFtZTtcbiAgICBwcm90by5kYXRlcyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ2RhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0U2V0RGF5T2ZNb250aFxuICAgICk7XG4gICAgcHJvdG8ubW9udGhzID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9udGhzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb250aCBpbnN0ZWFkJyxcbiAgICAgICAgZ2V0U2V0TW9udGhcbiAgICApO1xuICAgIHByb3RvLnllYXJzID0gZGVwcmVjYXRlKFxuICAgICAgICAneWVhcnMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIHllYXIgaW5zdGVhZCcsXG4gICAgICAgIGdldFNldFllYXJcbiAgICApO1xuICAgIHByb3RvLnpvbmUgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy96b25lLycsXG4gICAgICAgIGdldFNldFpvbmVcbiAgICApO1xuICAgIHByb3RvLmlzRFNUU2hpZnRlZCA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ2lzRFNUU2hpZnRlZCBpcyBkZXByZWNhdGVkLiBTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kc3Qtc2hpZnRlZC8gZm9yIG1vcmUgaW5mb3JtYXRpb24nLFxuICAgICAgICBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWRcbiAgICApO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlVW5peChpbnB1dCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJblpvbmUoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpLnBhcnNlWm9uZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZVBhcnNlUG9zdEZvcm1hdChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMSA9IExvY2FsZS5wcm90b3R5cGU7XG5cbiAgICBwcm90byQxLmNhbGVuZGFyID0gY2FsZW5kYXI7XG4gICAgcHJvdG8kMS5sb25nRGF0ZUZvcm1hdCA9IGxvbmdEYXRlRm9ybWF0O1xuICAgIHByb3RvJDEuaW52YWxpZERhdGUgPSBpbnZhbGlkRGF0ZTtcbiAgICBwcm90byQxLm9yZGluYWwgPSBvcmRpbmFsO1xuICAgIHByb3RvJDEucHJlcGFyc2UgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5wb3N0Zm9ybWF0ID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucmVsYXRpdmVUaW1lID0gcmVsYXRpdmVUaW1lO1xuICAgIHByb3RvJDEucGFzdEZ1dHVyZSA9IHBhc3RGdXR1cmU7XG4gICAgcHJvdG8kMS5zZXQgPSBzZXQ7XG4gICAgcHJvdG8kMS5lcmFzID0gbG9jYWxlRXJhcztcbiAgICBwcm90byQxLmVyYXNQYXJzZSA9IGxvY2FsZUVyYXNQYXJzZTtcbiAgICBwcm90byQxLmVyYXNDb252ZXJ0WWVhciA9IGxvY2FsZUVyYXNDb252ZXJ0WWVhcjtcbiAgICBwcm90byQxLmVyYXNBYmJyUmVnZXggPSBlcmFzQWJiclJlZ2V4O1xuICAgIHByb3RvJDEuZXJhc05hbWVSZWdleCA9IGVyYXNOYW1lUmVnZXg7XG4gICAgcHJvdG8kMS5lcmFzTmFycm93UmVnZXggPSBlcmFzTmFycm93UmVnZXg7XG5cbiAgICBwcm90byQxLm1vbnRocyA9IGxvY2FsZU1vbnRocztcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0ID0gbG9jYWxlTW9udGhzU2hvcnQ7XG4gICAgcHJvdG8kMS5tb250aHNQYXJzZSA9IGxvY2FsZU1vbnRoc1BhcnNlO1xuICAgIHByb3RvJDEubW9udGhzUmVnZXggPSBtb250aHNSZWdleDtcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0UmVnZXggPSBtb250aHNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2VlayA9IGxvY2FsZVdlZWs7XG4gICAgcHJvdG8kMS5maXJzdERheU9mWWVhciA9IGxvY2FsZUZpcnN0RGF5T2ZZZWFyO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZldlZWsgPSBsb2NhbGVGaXJzdERheU9mV2VlaztcblxuICAgIHByb3RvJDEud2Vla2RheXMgPSBsb2NhbGVXZWVrZGF5cztcbiAgICBwcm90byQxLndlZWtkYXlzTWluID0gbG9jYWxlV2Vla2RheXNNaW47XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0ID0gbG9jYWxlV2Vla2RheXNTaG9ydDtcbiAgICBwcm90byQxLndlZWtkYXlzUGFyc2UgPSBsb2NhbGVXZWVrZGF5c1BhcnNlO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5c1JlZ2V4ID0gd2Vla2RheXNSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnRSZWdleCA9IHdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzTWluUmVnZXggPSB3ZWVrZGF5c01pblJlZ2V4O1xuXG4gICAgcHJvdG8kMS5pc1BNID0gbG9jYWxlSXNQTTtcbiAgICBwcm90byQxLm1lcmlkaWVtID0gbG9jYWxlTWVyaWRpZW07XG5cbiAgICBmdW5jdGlvbiBnZXQkMShmb3JtYXQsIGluZGV4LCBmaWVsZCwgc2V0dGVyKSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHV0YyA9IGNyZWF0ZVVUQygpLnNldChzZXR0ZXIsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGxvY2FsZVtmaWVsZF0odXRjLCBmb3JtYXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIGksIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIC8vICgpXG4gICAgLy8gKDUpXG4gICAgLy8gKGZtdCwgNSlcbiAgICAvLyAoZm10KVxuICAgIC8vICh0cnVlKVxuICAgIC8vICh0cnVlLCA1KVxuICAgIC8vICh0cnVlLCBmbXQsIDUpXG4gICAgLy8gKHRydWUsIGZtdClcbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGVTb3J0ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGxvY2FsZVNvcnRlZDtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgbG9jYWxlU29ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9jYWxlID0gZ2V0TG9jYWxlKCksXG4gICAgICAgICAgICBzaGlmdCA9IGxvY2FsZVNvcnRlZCA/IGxvY2FsZS5fd2Vlay5kb3cgOiAwLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG91dCA9IFtdO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCAoaW5kZXggKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCAoaSArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzU2hvcnQoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRoc1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5cycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c1Nob3J0KGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzTWluKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c01pbicpO1xuICAgIH1cblxuICAgIGdldFNldEdsb2JhbExvY2FsZSgnZW4nLCB7XG4gICAgICAgIGVyYXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzAwMDEtMDEtMDEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiArSW5maW5pdHksXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdBbm5vIERvbWluaScsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQUQnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdBRCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMC0xMi0zMScsXG4gICAgICAgICAgICAgICAgdW50aWw6IC1JbmZpbml0eSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0JlZm9yZSBDaHJpc3QnLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ0JDJyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnQkMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHRofHN0fG5kfHJkKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgdG9JbnQoKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuICAgIGhvb2tzLmxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQubGFuZyBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZSBpbnN0ZWFkLicsXG4gICAgICAgIGdldFNldEdsb2JhbExvY2FsZVxuICAgICk7XG4gICAgaG9va3MubGFuZ0RhdGEgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQubGFuZ0RhdGEgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGVEYXRhIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0TG9jYWxlXG4gICAgKTtcblxuICAgIHZhciBtYXRoQWJzID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBhYnMoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPSBtYXRoQWJzKHRoaXMuX21pbGxpc2Vjb25kcyk7XG4gICAgICAgIHRoaXMuX2RheXMgPSBtYXRoQWJzKHRoaXMuX2RheXMpO1xuICAgICAgICB0aGlzLl9tb250aHMgPSBtYXRoQWJzKHRoaXMuX21vbnRocyk7XG5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtYXRoQWJzKGRhdGEubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzID0gbWF0aEFicyhkYXRhLnNlY29uZHMpO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgPSBtYXRoQWJzKGRhdGEubWludXRlcyk7XG4gICAgICAgIGRhdGEuaG91cnMgPSBtYXRoQWJzKGRhdGEuaG91cnMpO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1hdGhBYnMoZGF0YS5tb250aHMpO1xuICAgICAgICBkYXRhLnllYXJzID0gbWF0aEFicyhkYXRhLnllYXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdCQxKGR1cmF0aW9uLCBpbnB1dCwgdmFsdWUsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdmFsdWUpO1xuXG4gICAgICAgIGR1cmF0aW9uLl9taWxsaXNlY29uZHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgZHVyYXRpb24uX2RheXMgKz0gZGlyZWN0aW9uICogb3RoZXIuX2RheXM7XG4gICAgICAgIGR1cmF0aW9uLl9tb250aHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21vbnRocztcblxuICAgICAgICByZXR1cm4gZHVyYXRpb24uX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIGFkZCgxLCAncycpIG9yIGFkZChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBhZGQkMShpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAxKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBzdWJ0cmFjdCgxLCAncycpIG9yIHN1YnRyYWN0KGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIHN1YnRyYWN0JDEoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgLTEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0NlaWwobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnViYmxlKCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMsXG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMsXG4gICAgICAgICAgICBkYXRhID0gdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIHNlY29uZHMsXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICB5ZWFycyxcbiAgICAgICAgICAgIG1vbnRoc0Zyb21EYXlzO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBtaXggb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcywgYnViYmxlIGRvd24gZmlyc3RcbiAgICAgICAgLy8gY2hlY2s6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yMTY2XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA+PSAwICYmIGRheXMgPj0gMCAmJiBtb250aHMgPj0gMCkgfHxcbiAgICAgICAgICAgICAgICAobWlsbGlzZWNvbmRzIDw9IDAgJiYgZGF5cyA8PSAwICYmIG1vbnRocyA8PSAwKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyArPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHMpICsgZGF5cykgKiA4NjRlNTtcbiAgICAgICAgICAgIGRheXMgPSAwO1xuICAgICAgICAgICAgbW9udGhzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBidWJibGVzIHVwIHZhbHVlcywgc2VlIHRoZSB0ZXN0cyBmb3JcbiAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAlIDEwMDA7XG5cbiAgICAgICAgc2Vjb25kcyA9IGFic0Zsb29yKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICAgICAgICBkYXRhLnNlY29uZHMgPSBzZWNvbmRzICUgNjA7XG5cbiAgICAgICAgbWludXRlcyA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGRhdGEubWludXRlcyA9IG1pbnV0ZXMgJSA2MDtcblxuICAgICAgICBob3VycyA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIGRhdGEuaG91cnMgPSBob3VycyAlIDI0O1xuXG4gICAgICAgIGRheXMgKz0gYWJzRmxvb3IoaG91cnMgLyAyNCk7XG5cbiAgICAgICAgLy8gY29udmVydCBkYXlzIHRvIG1vbnRoc1xuICAgICAgICBtb250aHNGcm9tRGF5cyA9IGFic0Zsb29yKGRheXNUb01vbnRocyhkYXlzKSk7XG4gICAgICAgIG1vbnRocyArPSBtb250aHNGcm9tRGF5cztcbiAgICAgICAgZGF5cyAtPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHNGcm9tRGF5cykpO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuICAgICAgICBkYXRhLmRheXMgPSBkYXlzO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1vbnRocztcbiAgICAgICAgZGF0YS55ZWFycyA9IHllYXJzO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNUb01vbnRocyhkYXlzKSB7XG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDE0NjA5NyBkYXlzICh0YWtpbmcgaW50byBhY2NvdW50IGxlYXAgeWVhciBydWxlcylcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTIgbW9udGhzID09PSA0ODAwXG4gICAgICAgIHJldHVybiAoZGF5cyAqIDQ4MDApIC8gMTQ2MDk3O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1RvRGF5cyhtb250aHMpIHtcbiAgICAgICAgLy8gdGhlIHJldmVyc2Ugb2YgZGF5c1RvTW9udGhzXG4gICAgICAgIHJldHVybiAobW9udGhzICogMTQ2MDk3KSAvIDQ4MDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXModW5pdHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5cyxcbiAgICAgICAgICAgIG1vbnRocyxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcztcblxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICBpZiAodW5pdHMgPT09ICdtb250aCcgfHwgdW5pdHMgPT09ICdxdWFydGVyJyB8fCB1bml0cyA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzICsgZGF5c1RvTW9udGhzKGRheXMpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocztcbiAgICAgICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocyAvIDM7XG4gICAgICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb250aHMgLyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBtaWxsaXNlY29uZHMgc2VwYXJhdGVseSBiZWNhdXNlIG9mIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIChpc3N1ZSAjMTg2NylcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgTWF0aC5yb3VuZChtb250aHNUb0RheXModGhpcy5fbW9udGhzKSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzIC8gNyArIG1pbGxpc2Vjb25kcyAvIDYwNDhlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDI0ICsgbWlsbGlzZWNvbmRzIC8gMzZlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDE0NDAgKyBtaWxsaXNlY29uZHMgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheXMgKiA4NjQwMCArIG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gICAgICAgICAgICAgICAgLy8gTWF0aC5mbG9vciBwcmV2ZW50cyBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyBoZXJlXG4gICAgICAgICAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihkYXlzICogODY0ZTUpICsgbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biB1bml0ICcgKyB1bml0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlQXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFzKGFsaWFzKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgYXNNaWxsaXNlY29uZHMgPSBtYWtlQXMoJ21zJyksXG4gICAgICAgIGFzU2Vjb25kcyA9IG1ha2VBcygncycpLFxuICAgICAgICBhc01pbnV0ZXMgPSBtYWtlQXMoJ20nKSxcbiAgICAgICAgYXNIb3VycyA9IG1ha2VBcygnaCcpLFxuICAgICAgICBhc0RheXMgPSBtYWtlQXMoJ2QnKSxcbiAgICAgICAgYXNXZWVrcyA9IG1ha2VBcygndycpLFxuICAgICAgICBhc01vbnRocyA9IG1ha2VBcygnTScpLFxuICAgICAgICBhc1F1YXJ0ZXJzID0gbWFrZUFzKCdRJyksXG4gICAgICAgIGFzWWVhcnMgPSBtYWtlQXMoJ3knKSxcbiAgICAgICAgdmFsdWVPZiQxID0gYXNNaWxsaXNlY29uZHM7XG5cbiAgICBmdW5jdGlvbiBjbG9uZSQxKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24odGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0JDIodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXNbdW5pdHMgKyAncyddKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldHRlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9kYXRhW25hbWVdIDogTmFOO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtYWtlR2V0dGVyKCdtaWxsaXNlY29uZHMnKSxcbiAgICAgICAgc2Vjb25kcyA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKSxcbiAgICAgICAgbWludXRlcyA9IG1ha2VHZXR0ZXIoJ21pbnV0ZXMnKSxcbiAgICAgICAgaG91cnMgPSBtYWtlR2V0dGVyKCdob3VycycpLFxuICAgICAgICBkYXlzID0gbWFrZUdldHRlcignZGF5cycpLFxuICAgICAgICBtb250aHMgPSBtYWtlR2V0dGVyKCdtb250aHMnKSxcbiAgICAgICAgeWVhcnMgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG4gICAgZnVuY3Rpb24gd2Vla3MoKSB7XG4gICAgICAgIHJldHVybiBhYnNGbG9vcih0aGlzLmRheXMoKSAvIDcpO1xuICAgIH1cblxuICAgIHZhciByb3VuZCA9IE1hdGgucm91bmQsXG4gICAgICAgIHRocmVzaG9sZHMgPSB7XG4gICAgICAgICAgICBzczogNDQsIC8vIGEgZmV3IHNlY29uZHMgdG8gc2Vjb25kc1xuICAgICAgICAgICAgczogNDUsIC8vIHNlY29uZHMgdG8gbWludXRlXG4gICAgICAgICAgICBtOiA0NSwgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgICAgICBoOiAyMiwgLy8gaG91cnMgdG8gZGF5XG4gICAgICAgICAgICBkOiAyNiwgLy8gZGF5cyB0byBtb250aC93ZWVrXG4gICAgICAgICAgICB3OiBudWxsLCAvLyB3ZWVrcyB0byBtb250aFxuICAgICAgICAgICAgTTogMTEsIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgICAgIH07XG5cbiAgICAvLyBoZWxwZXIgZnVuY3Rpb24gZm9yIG1vbWVudC5mbi5mcm9tLCBtb21lbnQuZm4uZnJvbU5vdywgYW5kIG1vbWVudC5kdXJhdGlvbi5mbi5odW1hbml6ZVxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGVUaW1lQWdvKHN0cmluZywgbnVtYmVyLCB3aXRob3V0U3VmZml4LCBpc0Z1dHVyZSwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUucmVsYXRpdmVUaW1lKG51bWJlciB8fCAxLCAhIXdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZSQxKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCB0aHJlc2hvbGRzLCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpLFxuICAgICAgICAgICAgc2Vjb25kcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdzJykpLFxuICAgICAgICAgICAgbWludXRlcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdtJykpLFxuICAgICAgICAgICAgaG91cnMgPSByb3VuZChkdXJhdGlvbi5hcygnaCcpKSxcbiAgICAgICAgICAgIGRheXMgPSByb3VuZChkdXJhdGlvbi5hcygnZCcpKSxcbiAgICAgICAgICAgIG1vbnRocyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdNJykpLFxuICAgICAgICAgICAgd2Vla3MgPSByb3VuZChkdXJhdGlvbi5hcygndycpKSxcbiAgICAgICAgICAgIHllYXJzID0gcm91bmQoZHVyYXRpb24uYXMoJ3knKSksXG4gICAgICAgICAgICBhID1cbiAgICAgICAgICAgICAgICAoc2Vjb25kcyA8PSB0aHJlc2hvbGRzLnNzICYmIFsncycsIHNlY29uZHNdKSB8fFxuICAgICAgICAgICAgICAgIChzZWNvbmRzIDwgdGhyZXNob2xkcy5zICYmIFsnc3MnLCBzZWNvbmRzXSkgfHxcbiAgICAgICAgICAgICAgICAobWludXRlcyA8PSAxICYmIFsnbSddKSB8fFxuICAgICAgICAgICAgICAgIChtaW51dGVzIDwgdGhyZXNob2xkcy5tICYmIFsnbW0nLCBtaW51dGVzXSkgfHxcbiAgICAgICAgICAgICAgICAoaG91cnMgPD0gMSAmJiBbJ2gnXSkgfHxcbiAgICAgICAgICAgICAgICAoaG91cnMgPCB0aHJlc2hvbGRzLmggJiYgWydoaCcsIGhvdXJzXSkgfHxcbiAgICAgICAgICAgICAgICAoZGF5cyA8PSAxICYmIFsnZCddKSB8fFxuICAgICAgICAgICAgICAgIChkYXlzIDwgdGhyZXNob2xkcy5kICYmIFsnZGQnLCBkYXlzXSk7XG5cbiAgICAgICAgaWYgKHRocmVzaG9sZHMudyAhPSBudWxsKSB7XG4gICAgICAgICAgICBhID1cbiAgICAgICAgICAgICAgICBhIHx8XG4gICAgICAgICAgICAgICAgKHdlZWtzIDw9IDEgJiYgWyd3J10pIHx8XG4gICAgICAgICAgICAgICAgKHdlZWtzIDwgdGhyZXNob2xkcy53ICYmIFsnd3cnLCB3ZWVrc10pO1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhIHx8XG4gICAgICAgICAgICAobW9udGhzIDw9IDEgJiYgWydNJ10pIHx8XG4gICAgICAgICAgICAobW9udGhzIDwgdGhyZXNob2xkcy5NICYmIFsnTU0nLCBtb250aHNdKSB8fFxuICAgICAgICAgICAgKHllYXJzIDw9IDEgJiYgWyd5J10pIHx8IFsneXknLCB5ZWFyc107XG5cbiAgICAgICAgYVsyXSA9IHdpdGhvdXRTdWZmaXg7XG4gICAgICAgIGFbM10gPSArcG9zTmVnRHVyYXRpb24gPiAwO1xuICAgICAgICBhWzRdID0gbG9jYWxlO1xuICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZVRpbWVBZ28uYXBwbHkobnVsbCwgYSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCB0aGUgcm91bmRpbmcgZnVuY3Rpb24gZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHJvdW5kaW5nRnVuY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygcm91bmRpbmdGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcm91bmQgPSByb3VuZGluZ0Z1bmN0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYSB0aHJlc2hvbGQgZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZCh0aHJlc2hvbGQsIGxpbWl0KSB7XG4gICAgICAgIGlmICh0aHJlc2hvbGRzW3RocmVzaG9sZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyZXNob2xkc1t0aHJlc2hvbGRdO1xuICAgICAgICB9XG4gICAgICAgIHRocmVzaG9sZHNbdGhyZXNob2xkXSA9IGxpbWl0O1xuICAgICAgICBpZiAodGhyZXNob2xkID09PSAncycpIHtcbiAgICAgICAgICAgIHRocmVzaG9sZHMuc3MgPSBsaW1pdCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaHVtYW5pemUoYXJnV2l0aFN1ZmZpeCwgYXJnVGhyZXNob2xkcykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3aXRoU3VmZml4ID0gZmFsc2UsXG4gICAgICAgICAgICB0aCA9IHRocmVzaG9sZHMsXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdXaXRoU3VmZml4ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgYXJnVGhyZXNob2xkcyA9IGFyZ1dpdGhTdWZmaXg7XG4gICAgICAgICAgICBhcmdXaXRoU3VmZml4ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdXaXRoU3VmZml4ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHdpdGhTdWZmaXggPSBhcmdXaXRoU3VmZml4O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnVGhyZXNob2xkcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoID0gT2JqZWN0LmFzc2lnbih7fSwgdGhyZXNob2xkcywgYXJnVGhyZXNob2xkcyk7XG4gICAgICAgICAgICBpZiAoYXJnVGhyZXNob2xkcy5zICE9IG51bGwgJiYgYXJnVGhyZXNob2xkcy5zcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGguc3MgPSBhcmdUaHJlc2hvbGRzLnMgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxlID0gdGhpcy5sb2NhbGVEYXRhKCk7XG4gICAgICAgIG91dHB1dCA9IHJlbGF0aXZlVGltZSQxKHRoaXMsICF3aXRoU3VmZml4LCB0aCwgbG9jYWxlKTtcblxuICAgICAgICBpZiAod2l0aFN1ZmZpeCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gbG9jYWxlLnBhc3RGdXR1cmUoK3RoaXMsIG91dHB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG9jYWxlLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICB2YXIgYWJzJDEgPSBNYXRoLmFicztcblxuICAgIGZ1bmN0aW9uIHNpZ24oeCkge1xuICAgICAgICByZXR1cm4gKHggPiAwKSAtICh4IDwgMCkgfHwgK3g7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmckMSgpIHtcbiAgICAgICAgLy8gZm9yIElTTyBzdHJpbmdzIHdlIGRvIG5vdCB1c2UgdGhlIG5vcm1hbCBidWJibGluZyBydWxlczpcbiAgICAgICAgLy8gICogbWlsbGlzZWNvbmRzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSBob3Vyc1xuICAgICAgICAvLyAgKiBkYXlzIGRvIG5vdCBidWJibGUgYXQgYWxsXG4gICAgICAgIC8vICAqIG1vbnRocyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgeWVhcnNcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbnRleHQtZnJlZSBjb252ZXJzaW9uIGJldHdlZW4gaG91cnMgYW5kIGRheXNcbiAgICAgICAgLy8gKHRoaW5rIG9mIGNsb2NrIGNoYW5nZXMpXG4gICAgICAgIC8vIGFuZCBhbHNvIG5vdCBiZXR3ZWVuIGRheXMgYW5kIG1vbnRocyAoMjgtMzEgZGF5cyBwZXIgbW9udGgpXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlY29uZHMgPSBhYnMkMSh0aGlzLl9taWxsaXNlY29uZHMpIC8gMTAwMCxcbiAgICAgICAgICAgIGRheXMgPSBhYnMkMSh0aGlzLl9kYXlzKSxcbiAgICAgICAgICAgIG1vbnRocyA9IGFicyQxKHRoaXMuX21vbnRocyksXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICB5ZWFycyxcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCksXG4gICAgICAgICAgICB0b3RhbFNpZ24sXG4gICAgICAgICAgICB5bVNpZ24sXG4gICAgICAgICAgICBkYXlzU2lnbixcbiAgICAgICAgICAgIGhtc1NpZ247XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgICAgIG1pbnV0ZXMgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBob3VycyA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIHNlY29uZHMgJT0gNjA7XG4gICAgICAgIG1pbnV0ZXMgJT0gNjA7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIC8vIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9kb3JkaWxsZS9tb21lbnQtaXNvZHVyYXRpb24vYmxvYi9tYXN0ZXIvbW9tZW50Lmlzb2R1cmF0aW9uLmpzXG4gICAgICAgIHMgPSBzZWNvbmRzID8gc2Vjb25kcy50b0ZpeGVkKDMpLnJlcGxhY2UoL1xcLj8wKyQvLCAnJykgOiAnJztcblxuICAgICAgICB0b3RhbFNpZ24gPSB0b3RhbCA8IDAgPyAnLScgOiAnJztcbiAgICAgICAgeW1TaWduID0gc2lnbih0aGlzLl9tb250aHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICBkYXlzU2lnbiA9IHNpZ24odGhpcy5fZGF5cykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIGhtc1NpZ24gPSBzaWduKHRoaXMuX21pbGxpc2Vjb25kcykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRvdGFsU2lnbiArXG4gICAgICAgICAgICAnUCcgK1xuICAgICAgICAgICAgKHllYXJzID8geW1TaWduICsgeWVhcnMgKyAnWScgOiAnJykgK1xuICAgICAgICAgICAgKG1vbnRocyA/IHltU2lnbiArIG1vbnRocyArICdNJyA6ICcnKSArXG4gICAgICAgICAgICAoZGF5cyA/IGRheXNTaWduICsgZGF5cyArICdEJyA6ICcnKSArXG4gICAgICAgICAgICAoaG91cnMgfHwgbWludXRlcyB8fCBzZWNvbmRzID8gJ1QnIDogJycpICtcbiAgICAgICAgICAgIChob3VycyA/IGhtc1NpZ24gKyBob3VycyArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobWludXRlcyA/IGhtc1NpZ24gKyBtaW51dGVzICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChzZWNvbmRzID8gaG1zU2lnbiArIHMgKyAnUycgOiAnJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMiA9IER1cmF0aW9uLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDIuaXNWYWxpZCA9IGlzVmFsaWQkMTtcbiAgICBwcm90byQyLmFicyA9IGFicztcbiAgICBwcm90byQyLmFkZCA9IGFkZCQxO1xuICAgIHByb3RvJDIuc3VidHJhY3QgPSBzdWJ0cmFjdCQxO1xuICAgIHByb3RvJDIuYXMgPSBhcztcbiAgICBwcm90byQyLmFzTWlsbGlzZWNvbmRzID0gYXNNaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5hc1NlY29uZHMgPSBhc1NlY29uZHM7XG4gICAgcHJvdG8kMi5hc01pbnV0ZXMgPSBhc01pbnV0ZXM7XG4gICAgcHJvdG8kMi5hc0hvdXJzID0gYXNIb3VycztcbiAgICBwcm90byQyLmFzRGF5cyA9IGFzRGF5cztcbiAgICBwcm90byQyLmFzV2Vla3MgPSBhc1dlZWtzO1xuICAgIHByb3RvJDIuYXNNb250aHMgPSBhc01vbnRocztcbiAgICBwcm90byQyLmFzUXVhcnRlcnMgPSBhc1F1YXJ0ZXJzO1xuICAgIHByb3RvJDIuYXNZZWFycyA9IGFzWWVhcnM7XG4gICAgcHJvdG8kMi52YWx1ZU9mID0gdmFsdWVPZiQxO1xuICAgIHByb3RvJDIuX2J1YmJsZSA9IGJ1YmJsZTtcbiAgICBwcm90byQyLmNsb25lID0gY2xvbmUkMTtcbiAgICBwcm90byQyLmdldCA9IGdldCQyO1xuICAgIHByb3RvJDIubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzO1xuICAgIHByb3RvJDIuc2Vjb25kcyA9IHNlY29uZHM7XG4gICAgcHJvdG8kMi5taW51dGVzID0gbWludXRlcztcbiAgICBwcm90byQyLmhvdXJzID0gaG91cnM7XG4gICAgcHJvdG8kMi5kYXlzID0gZGF5cztcbiAgICBwcm90byQyLndlZWtzID0gd2Vla3M7XG4gICAgcHJvdG8kMi5tb250aHMgPSBtb250aHM7XG4gICAgcHJvdG8kMi55ZWFycyA9IHllYXJzO1xuICAgIHByb3RvJDIuaHVtYW5pemUgPSBodW1hbml6ZTtcbiAgICBwcm90byQyLnRvSVNPU3RyaW5nID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvU3RyaW5nID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvSlNPTiA9IHRvSVNPU3RyaW5nJDE7XG4gICAgcHJvdG8kMi5sb2NhbGUgPSBsb2NhbGU7XG4gICAgcHJvdG8kMi5sb2NhbGVEYXRhID0gbG9jYWxlRGF0YTtcblxuICAgIHByb3RvJDIudG9Jc29TdHJpbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICd0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKScsXG4gICAgICAgIHRvSVNPU3RyaW5nJDFcbiAgICApO1xuICAgIHByb3RvJDIubGFuZyA9IGxhbmc7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWCcsIDAsIDAsICd1bml4Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3gnLCAwLCAwLCAndmFsdWVPZicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigneCcsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdYJywgbWF0Y2hUaW1lc3RhbXApO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUocGFyc2VGbG9hdChpbnB1dCkgKiAxMDAwKTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCd4JywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHRvSW50KGlucHV0KSk7XG4gICAgfSk7XG5cbiAgICAvLyEgbW9tZW50LmpzXG5cbiAgICBob29rcy52ZXJzaW9uID0gJzIuMzAuMSc7XG5cbiAgICBzZXRIb29rQ2FsbGJhY2soY3JlYXRlTG9jYWwpO1xuXG4gICAgaG9va3MuZm4gPSBwcm90bztcbiAgICBob29rcy5taW4gPSBtaW47XG4gICAgaG9va3MubWF4ID0gbWF4O1xuICAgIGhvb2tzLm5vdyA9IG5vdztcbiAgICBob29rcy51dGMgPSBjcmVhdGVVVEM7XG4gICAgaG9va3MudW5peCA9IGNyZWF0ZVVuaXg7XG4gICAgaG9va3MubW9udGhzID0gbGlzdE1vbnRocztcbiAgICBob29rcy5pc0RhdGUgPSBpc0RhdGU7XG4gICAgaG9va3MubG9jYWxlID0gZ2V0U2V0R2xvYmFsTG9jYWxlO1xuICAgIGhvb2tzLmludmFsaWQgPSBjcmVhdGVJbnZhbGlkO1xuICAgIGhvb2tzLmR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb247XG4gICAgaG9va3MuaXNNb21lbnQgPSBpc01vbWVudDtcbiAgICBob29rcy53ZWVrZGF5cyA9IGxpc3RXZWVrZGF5cztcbiAgICBob29rcy5wYXJzZVpvbmUgPSBjcmVhdGVJblpvbmU7XG4gICAgaG9va3MubG9jYWxlRGF0YSA9IGdldExvY2FsZTtcbiAgICBob29rcy5pc0R1cmF0aW9uID0gaXNEdXJhdGlvbjtcbiAgICBob29rcy5tb250aHNTaG9ydCA9IGxpc3RNb250aHNTaG9ydDtcbiAgICBob29rcy53ZWVrZGF5c01pbiA9IGxpc3RXZWVrZGF5c01pbjtcbiAgICBob29rcy5kZWZpbmVMb2NhbGUgPSBkZWZpbmVMb2NhbGU7XG4gICAgaG9va3MudXBkYXRlTG9jYWxlID0gdXBkYXRlTG9jYWxlO1xuICAgIGhvb2tzLmxvY2FsZXMgPSBsaXN0TG9jYWxlcztcbiAgICBob29rcy53ZWVrZGF5c1Nob3J0ID0gbGlzdFdlZWtkYXlzU2hvcnQ7XG4gICAgaG9va3Mubm9ybWFsaXplVW5pdHMgPSBub3JtYWxpemVVbml0cztcbiAgICBob29rcy5yZWxhdGl2ZVRpbWVSb3VuZGluZyA9IGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVRocmVzaG9sZCA9IGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZDtcbiAgICBob29rcy5jYWxlbmRhckZvcm1hdCA9IGdldENhbGVuZGFyRm9ybWF0O1xuICAgIGhvb2tzLnByb3RvdHlwZSA9IHByb3RvO1xuXG4gICAgLy8gY3VycmVudGx5IEhUTUw1IGlucHV0IHR5cGUgb25seSBzdXBwb3J0cyAyNC1ob3VyIGZvcm1hdHNcbiAgICBob29rcy5IVE1MNV9GTVQgPSB7XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMOiAnWVlZWS1NTS1ERFRISDptbScsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9TRUNPTkRTOiAnWVlZWS1NTS1ERFRISDptbTpzcycsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdGVwPVwiMVwiIC8+XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMX01TOiAnWVlZWS1NTS1ERFRISDptbTpzcy5TU1MnLCAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgREFURTogJ1lZWVktTU0tREQnLCAvLyA8aW5wdXQgdHlwZT1cImRhdGVcIiAvPlxuICAgICAgICBUSU1FOiAnSEg6bW0nLCAvLyA8aW5wdXQgdHlwZT1cInRpbWVcIiAvPlxuICAgICAgICBUSU1FX1NFQ09ORFM6ICdISDptbTpzcycsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgVElNRV9NUzogJ0hIOm1tOnNzLlNTUycsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIFdFRUs6ICdHR0dHLVtXXVdXJywgLy8gPGlucHV0IHR5cGU9XCJ3ZWVrXCIgLz5cbiAgICAgICAgTU9OVEg6ICdZWVlZLU1NJywgLy8gPGlucHV0IHR5cGU9XCJtb250aFwiIC8+XG4gICAgfTtcblxuICAgIHJldHVybiBob29rcztcblxufSkpKTtcbiIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCIvLyBUb3AgbGV2ZWwgZmlsZSBpcyBqdXN0IGEgbWl4aW4gb2Ygc3VibW9kdWxlcyAmIGNvbnN0YW50c1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzaWduICAgID0gcmVxdWlyZSgnLi9saWIvdXRpbHMvY29tbW9uJykuYXNzaWduO1xuXG52YXIgZGVmbGF0ZSAgID0gcmVxdWlyZSgnLi9saWIvZGVmbGF0ZScpO1xudmFyIGluZmxhdGUgICA9IHJlcXVpcmUoJy4vbGliL2luZmxhdGUnKTtcbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuL2xpYi96bGliL2NvbnN0YW50cycpO1xuXG52YXIgcGFrbyA9IHt9O1xuXG5hc3NpZ24ocGFrbywgZGVmbGF0ZSwgaW5mbGF0ZSwgY29uc3RhbnRzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYWtvO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2RlZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvZGVmbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgbXNnICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL21lc3NhZ2VzJyk7XG52YXIgWlN0cmVhbSAgICAgID0gcmVxdWlyZSgnLi96bGliL3pzdHJlYW0nKTtcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfRklOSVNIICAgICAgICA9IDQ7XG5cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcblxudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxudmFyIFpfREVGTEFURUQgID0gODtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vKipcbiAqIGNsYXNzIERlZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tkZWZsYXRlXV0sXG4gKiBbW2RlZmxhdGVSYXddXSBhbmQgW1tnemlwXV0uXG4gKiovXG5cbi8qIGludGVybmFsXG4gKiBEZWZsYXRlLmNodW5rcyAtPiBBcnJheVxuICpcbiAqIENodW5rcyBvZiBvdXRwdXQgZGF0YSwgaWYgW1tEZWZsYXRlI29uRGF0YV1dIG5vdCBvdmVycmlkZGVuLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXlcbiAqXG4gKiBDb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tEZWZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tEZWZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBkZWZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogWW91IHdpbGwgbm90IG5lZWQgaXQgaW4gcmVhbCBsaWZlLCBiZWNhdXNlIGRlZmxhdGUgZXJyb3JzXG4gKiBhcmUgcG9zc2libGUgb25seSBvbiB3cm9uZyBvcHRpb25zIG9yIGJhZCBgb25EYXRhYCAvIGBvbkVuZGBcbiAqIGN1c3RvbSBoYW5kbGVycy5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0RlZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IERlZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgZGVmbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGBsZXZlbGBcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBtZW1MZXZlbGBcbiAqIC0gYHN0cmF0ZWd5YFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgZGVmbGF0ZVxuICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlclxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqIC0gYGhlYWRlcmAgKE9iamVjdCkgLSBjdXN0b20gaGVhZGVyIGZvciBnemlwXG4gKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHRcbiAqICAgLSBgdGltZWAgKE51bWJlcikgLSBtb2RpZmljYXRpb24gdGltZSwgdW5peCB0aW1lc3RhbXBcbiAqICAgLSBgb3NgIChOdW1iZXIpIC0gb3BlcmF0aW9uIHN5c3RlbSBjb2RlXG4gKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2YgYnl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpXG4gKiAgIC0gYG5hbWVgIChTdHJpbmcpIC0gZmlsZSBuYW1lIChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBjb21tZW50YCAoU3RyaW5nKSAtIGNvbW1lbnQgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWRcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBkZWZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBkZWZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChkZWZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoZGVmbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coZGVmbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBEZWZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBsZXZlbDogWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICAgIG1ldGhvZDogWl9ERUZMQVRFRCxcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDE1LFxuICAgIG1lbUxldmVsOiA4LFxuICAgIHN0cmF0ZWd5OiBaX0RFRkFVTFRfU1RSQVRFR1ksXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKG9wdC5nemlwICYmIChvcHQud2luZG93Qml0cyA+IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC5sZXZlbCxcbiAgICBvcHQubWV0aG9kLFxuICAgIG9wdC53aW5kb3dCaXRzLFxuICAgIG9wdC5tZW1MZXZlbCxcbiAgICBvcHQuc3RyYXRlZ3lcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIGlmIChvcHQuaGVhZGVyKSB7XG4gICAgemxpYl9kZWZsYXRlLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLCBvcHQuaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIHZhciBkaWN0O1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGEuIFN0cmluZ3Mgd2lsbCBiZVxuICogICBjb252ZXJ0ZWQgdG8gdXRmOCBieXRlIHNlcXVlbmNlLlxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zIFpfRklOSVNILlxuICpcbiAqIFNlbmRzIGlucHV0IGRhdGEgdG8gZGVmbGF0ZSBwaXBlLCBnZW5lcmF0aW5nIFtbRGVmbGF0ZSNvbkRhdGFdXSBjYWxscyB3aXRoXG4gKiBuZXcgY29tcHJlc3NlZCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0RlZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0RlZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBhcnJheSBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuXG4gIGlmICh0aGlzLmVuZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IFpfRklOSVNIIDogWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRhdGEpO1xuICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICBzdHJtLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgc3RybS5pbnB1dCA9IGRhdGE7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmF2YWlsX2luID0gc3RybS5pbnB1dC5sZW5ndGg7XG5cbiAgZG8ge1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpO1xuICAgICAgc3RybS5uZXh0X291dCA9IDA7XG4gICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTtcbiAgICB9XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGUoc3RybSwgX21vZGUpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovXG5cbiAgICBpZiAoc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IChzdHJtLmF2YWlsX2luID09PSAwICYmIChfbW9kZSA9PT0gWl9GSU5JU0ggfHwgX21vZGUgPT09IFpfU1lOQ19GTFVTSCkpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLm9uRGF0YShzdHJpbmdzLmJ1ZjJiaW5zdHJpbmcodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EKTtcblxuICAvLyBGaW5hbGl6ZSBvbiB0aGUgbGFzdCBjaHVuay5cbiAgaWYgKF9tb2RlID09PSBaX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IFpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IFpfU1lOQ19GTFVTSCkge1xuICAgIHRoaXMub25FbmQoWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3V0cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGRlZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgZGVmbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBaX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogZGVmbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ29tcHJlc3MgYGRhdGFgIHdpdGggZGVmbGF0ZSBhbGdvcml0aG0gYW5kIGBvcHRpb25zYC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSBsZXZlbFxuICogLSB3aW5kb3dCaXRzXG4gKiAtIG1lbUxldmVsXG4gKiAtIHN0cmF0ZWd5XG4gKiAtIGRpY3Rpb25hcnlcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBkYXRhID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkZWZsYXRvciA9IG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnIHx8IG1zZ1tkZWZsYXRvci5lcnJdOyB9XG5cbiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGRlZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIGd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mXG4gKiBkZWZsYXRlIG9uZS5cbiAqKi9cbmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG5leHBvcnRzLkRlZmxhdGUgPSBEZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7XG5leHBvcnRzLmd6aXAgPSBnemlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2luZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvaW5mbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgYyAgICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL2NvbnN0YW50cycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG52YXIgR1poZWFkZXIgICAgID0gcmVxdWlyZSgnLi96bGliL2d6aGVhZGVyJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogY2xhc3MgSW5mbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2luZmxhdGVdXVxuICogYW5kIFtbaW5mbGF0ZVJhd11dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogaW5mbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbSW5mbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGRlbi5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICpcbiAqIFVuY29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbSW5mbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbSW5mbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBpbmZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogU2hvdWxkIGJlIGNoZWNrZWQgaWYgYnJva2VuIGRhdGEgcG9zc2libGUuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tJbmZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBJbmZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGluZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGluZmxhdGVcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICogQnkgZGVmYXVsdCwgd2hlbiBubyBvcHRpb25zIHNldCwgYXV0b2RldGVjdCBkZWZsYXRlL2d6aXAgZGF0YSBmb3JtYXQgdmlhXG4gKiB3cmFwcGVyIGhlYWRlci5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGluZmxhdGUgPSBuZXcgcGFrby5JbmZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBpbmZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBpbmZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChpbmZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoaW5mbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coaW5mbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBJbmZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKSByZXR1cm4gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDAsXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgLy8gRm9yY2Ugd2luZG93IHNpemUgZm9yIGByYXdgIGRhdGEsIGlmIG5vdCBzZXQgZGlyZWN0bHksXG4gIC8vIGJlY2F1c2Ugd2UgaGF2ZSBubyBoZWFkZXIgZm9yIGF1dG9kZXRlY3QuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgICBpZiAob3B0LndpbmRvd0JpdHMgPT09IDApIHsgb3B0LndpbmRvd0JpdHMgPSAtMTU7IH1cbiAgfVxuXG4gIC8vIElmIGB3aW5kb3dCaXRzYCBub3QgZGVmaW5lZCAoYW5kIG1vZGUgbm90IHJhdykgLSBzZXQgYXV0b2RldGVjdCBmbGFnIGZvciBnemlwL2RlZmxhdGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikgJiZcbiAgICAgICEob3B0aW9ucyAmJiBvcHRpb25zLndpbmRvd0JpdHMpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMzI7XG4gIH1cblxuICAvLyBHemlwIGhlYWRlciBoYXMgbm8gaW5mbyBhYm91dCB3aW5kb3dzIHNpemUsIHdlIGNhbiBkbyBhdXRvZGV0ZWN0IG9ubHlcbiAgLy8gZm9yIGRlZmxhdGUuIFNvLCBpZiB3aW5kb3cgc2l6ZSBub3Qgc2V0LCBmb3JjZSBpdCB0byBtYXggd2hlbiBnemlwIHBvc3NpYmxlXG4gIGlmICgob3B0LndpbmRvd0JpdHMgPiAxNSkgJiYgKG9wdC53aW5kb3dCaXRzIDwgNDgpKSB7XG4gICAgLy8gYml0IDMgKDE2KSAtPiBnemlwcGVkIGRhdGFcbiAgICAvLyBiaXQgNCAoMzIpIC0+IGF1dG9kZXRlY3QgZ3ppcC9kZWZsYXRlXG4gICAgaWYgKChvcHQud2luZG93Qml0cyAmIDE1KSA9PT0gMCkge1xuICAgICAgb3B0LndpbmRvd0JpdHMgfD0gMTU7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtICAgPSBuZXcgWlN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzICA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC53aW5kb3dCaXRzXG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIHRoaXMuaGVhZGVyID0gbmV3IEdaaGVhZGVyKCk7XG5cbiAgemxpYl9pbmZsYXRlLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLCB0aGlzLmhlYWRlcik7XG5cbiAgLy8gU2V0dXAgZGljdGlvbmFyeVxuICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdC5kaWN0aW9uYXJ5ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICBvcHQuZGljdGlvbmFyeSA9IG5ldyBVaW50OEFycmF5KG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9XG4gICAgaWYgKG9wdC5yYXcpIHsgLy9JbiByYXcgbW9kZSB3ZSBuZWVkIHRvIHNldCB0aGUgZGljdGlvbmFyeSBlYXJseVxuICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgb3B0LmRpY3Rpb25hcnkpO1xuICAgICAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW5mbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGFcbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFucyBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGluZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0luZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IG91dHB1dCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0luZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbSW5mbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIGRpY3Rpb25hcnkgPSB0aGlzLm9wdGlvbnMuZGljdGlvbmFyeTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG4gIHZhciBuZXh0X291dF91dGY4LCB0YWlsLCB1dGY4c3RyO1xuXG4gIC8vIEZsYWcgdG8gcHJvcGVybHkgcHJvY2VzcyBaX0JVRl9FUlJPUiBvbiB0ZXN0aW5nIGluZmxhdGUgY2FsbFxuICAvLyB3aGVuIHdlIGNoZWNrIHRoYXQgYWxsIG91dHB1dCBkYXRhIHdhcyBmbHVzaGVkLlxuICB2YXIgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLmVuZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuICBfbW9kZSA9IChtb2RlID09PSB+fm1vZGUpID8gbW9kZSA6ICgobW9kZSA9PT0gdHJ1ZSkgPyBjLlpfRklOSVNIIDogYy5aX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBPbmx5IGJpbmFyeSBzdHJpbmdzIGNhbiBiZSBkZWNvbXByZXNzZWQgb24gcHJhY3RpY2VcbiAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5iaW5zdHJpbmcyYnVmKGRhdGEpO1xuICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICBzdHJtLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgc3RybS5pbnB1dCA9IGRhdGE7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmF2YWlsX2luID0gc3RybS5pbnB1dC5sZW5ndGg7XG5cbiAgZG8ge1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpO1xuICAgICAgc3RybS5uZXh0X291dCA9IDA7XG4gICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZShzdHJtLCBjLlpfTk9fRkxVU0gpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovXG5cbiAgICBpZiAoc3RhdHVzID09PSBjLlpfTkVFRF9ESUNUICYmIGRpY3Rpb25hcnkpIHtcbiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3Rpb25hcnkpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9CVUZfRVJST1IgJiYgYWxsb3dCdWZFcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdHVzID0gYy5aX09LO1xuICAgICAgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RybS5uZXh0X291dCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBjLlpfRklOSVNIIHx8IF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkpKSB7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcblxuICAgICAgICAgIG5leHRfb3V0X3V0ZjggPSBzdHJpbmdzLnV0Zjhib3JkZXIoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpO1xuXG4gICAgICAgICAgdGFpbCA9IHN0cm0ubmV4dF9vdXQgLSBuZXh0X291dF91dGY4O1xuICAgICAgICAgIHV0ZjhzdHIgPSBzdHJpbmdzLmJ1ZjJzdHJpbmcoc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgpO1xuXG4gICAgICAgICAgLy8gbW92ZSB0YWlsXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHRhaWw7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemUgLSB0YWlsO1xuICAgICAgICAgIGlmICh0YWlsKSB7IHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCwgdGFpbCwgMCk7IH1cblxuICAgICAgICAgIHRoaXMub25EYXRhKHV0ZjhzdHIpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXaGVuIG5vIG1vcmUgaW5wdXQgZGF0YSwgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgaW50ZXJuYWwgaW5mbGF0ZSBidWZmZXJzXG4gICAgLy8gYXJlIGZsdXNoZWQuIFRoZSBvbmx5IHdheSB0byBkbyBpdCB3aGVuIGF2YWlsX291dCA9IDAgLSBydW4gb25lIG1vcmVcbiAgICAvLyBpbmZsYXRlIHBhc3MuIEJ1dCBpZiBvdXRwdXQgZGF0YSBub3QgZXhpc3RzLCBpbmZsYXRlIHJldHVybiBaX0JVRl9FUlJPUi5cbiAgICAvLyBIZXJlIHdlIHNldCBmbGFnIHRvIHByb2Nlc3MgdGhpcyBlcnJvciBwcm9wZXJseS5cbiAgICAvL1xuICAgIC8vIE5PVEUuIERlZmxhdGUgZG9lcyBub3QgcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSBhbmQgZG9lcyBub3QgbmVlZHMgc3VjaFxuICAgIC8vIGxvZ2ljLlxuICAgIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gdHJ1ZTtcbiAgICB9XG5cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EKTtcblxuICBpZiAoc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCkge1xuICAgIF9tb2RlID0gYy5aX0ZJTklTSDtcbiAgfVxuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IGMuWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBjLlpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChjLlpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91dHB1dCBkYXRhLiBUeXBlIG9mIGFycmF5IGRlcGVuZHNcbiAqICAgb24ganMgZW5naW5lIHN1cHBvcnQuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsIGVhY2ggY2h1bmtcbiAqICAgd2lsbCBiZSBzdHJpbmcuXG4gKlxuICogQnkgZGVmYXVsdCwgc3RvcmVzIGRhdGEgYmxvY2tzIGluIGBjaHVua3NbXWAgcHJvcGVydHkgYW5kIGdsdWVcbiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5cbi8qKlxuICogSW5mbGF0ZSNvbkVuZChzdGF0dXMpIC0+IFZvaWRcbiAqIC0gc3RhdHVzIChOdW1iZXIpOiBpbmZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcyxcbiAqICAgb3RoZXIgaWYgbm90LlxuICpcbiAqIENhbGxlZCBlaXRoZXIgYWZ0ZXIgeW91IHRlbGwgaW5mbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBjLlpfT0spIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gR2x1ZSAmIGNvbnZlcnQgaGVyZSwgdW50aWwgd2UgdGVhY2ggcGFrbyB0byBzZW5kXG4gICAgICAvLyB1dGY4IGFsaWduZWQgc3RyaW5ncyB0byBvbkRhdGFcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogaW5mbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBEZWNvbXByZXNzIGBkYXRhYCB3aXRoIGluZmxhdGUvdW5nemlwIGFuZCBgb3B0aW9uc2AuIEF1dG9kZXRlY3RcbiAqIGZvcm1hdCB2aWEgd3JhcHBlciBoZWFkZXIgYnkgZGVmYXVsdC4gVGhhdCdzIHdoeSB3ZSBkb24ndCBwcm92aWRlXG4gKiBzZXBhcmF0ZSBgdW5nemlwYCBtZXRob2QuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gd2luZG93Qml0c1xuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBpbnB1dCA9IHBha28uZGVmbGF0ZShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIG91dHB1dDtcbiAqXG4gKiB0cnkge1xuICogICBvdXRwdXQgPSBwYWtvLmluZmxhdGUoaW5wdXQpO1xuICogfSBjYXRjaCAoZXJyKVxuICogICBjb25zb2xlLmxvZyhlcnIpO1xuICogfVxuICogYGBgXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpO1xuXG4gIGluZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChpbmZsYXRvci5lcnIpIHsgdGhyb3cgaW5mbGF0b3IubXNnIHx8IG1zZ1tpbmZsYXRvci5lcnJdOyB9XG5cbiAgcmV0dXJuIGluZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGluZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tpbmZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogdW5nemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIEp1c3Qgc2hvcnRjdXQgdG8gW1tpbmZsYXRlXV0sIGJlY2F1c2UgaXQgYXV0b2RldGVjdHMgZm9ybWF0XG4gKiBieSBoZWFkZXIuY29udGVudC4gRG9uZSBmb3IgY29udmVuaWVuY2UuXG4gKiovXG5cblxuZXhwb3J0cy5JbmZsYXRlID0gSW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVSYXcgPSBpbmZsYXRlUmF3O1xuZXhwb3J0cy51bmd6aXAgID0gaW5mbGF0ZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgVFlQRURfT0sgPSAgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxuZnVuY3Rpb24gX2hhcyhvYmosIGtleSkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn1cblxuZXhwb3J0cy5hc3NpZ24gPSBmdW5jdGlvbiAob2JqIC8qZnJvbTEsIGZyb20yLCBmcm9tMywgLi4uKi8pIHtcbiAgdmFyIHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB3aGlsZSAoc291cmNlcy5sZW5ndGgpIHtcbiAgICB2YXIgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICAgIGlmICghc291cmNlKSB7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc291cmNlICsgJ211c3QgYmUgbm9uLW9iamVjdCcpO1xuICAgIH1cblxuICAgIGZvciAodmFyIHAgaW4gc291cmNlKSB7XG4gICAgICBpZiAoX2hhcyhzb3VyY2UsIHApKSB7XG4gICAgICAgIG9ialtwXSA9IHNvdXJjZVtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxuXG4vLyByZWR1Y2UgYnVmZmVyIHNpemUsIGF2b2lkaW5nIG1lbSBjb3B5XG5leHBvcnRzLnNocmlua0J1ZiA9IGZ1bmN0aW9uIChidWYsIHNpemUpIHtcbiAgaWYgKGJ1Zi5sZW5ndGggPT09IHNpemUpIHsgcmV0dXJuIGJ1ZjsgfVxuICBpZiAoYnVmLnN1YmFycmF5KSB7IHJldHVybiBidWYuc3ViYXJyYXkoMCwgc2l6ZSk7IH1cbiAgYnVmLmxlbmd0aCA9IHNpemU7XG4gIHJldHVybiBidWY7XG59O1xuXG5cbnZhciBmblR5cGVkID0ge1xuICBhcnJheVNldDogZnVuY3Rpb24gKGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbiwgZGVzdF9vZmZzKSB7XG4gICAgaWYgKHNyYy5zdWJhcnJheSAmJiBkZXN0LnN1YmFycmF5KSB7XG4gICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjX29mZnMsIHNyY19vZmZzICsgbGVuKSwgZGVzdF9vZmZzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gb3JkaW5hcnkgYXJyYXlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICB2YXIgaSwgbCwgbGVuLCBwb3MsIGNodW5rLCByZXN1bHQ7XG5cbiAgICAvLyBjYWxjdWxhdGUgZGF0YSBsZW5ndGhcbiAgICBsZW4gPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBsZW4gKz0gY2h1bmtzW2ldLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBqb2luIGNodW5rc1xuICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgcG9zID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY2h1bmsgPSBjaHVua3NbaV07XG4gICAgICByZXN1bHQuc2V0KGNodW5rLCBwb3MpO1xuICAgICAgcG9zICs9IGNodW5rLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG52YXIgZm5VbnR5cGVkID0ge1xuICBhcnJheVNldDogZnVuY3Rpb24gKGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbiwgZGVzdF9vZmZzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgY2h1bmtzKTtcbiAgfVxufTtcblxuXG4vLyBFbmFibGUvRGlzYWJsZSB0eXBlZCBhcnJheXMgdXNlLCBmb3IgdGVzdGluZ1xuLy9cbmV4cG9ydHMuc2V0VHlwZWQgPSBmdW5jdGlvbiAob24pIHtcbiAgaWYgKG9uKSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IFVpbnQ4QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IFVpbnQxNkFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBJbnQzMkFycmF5O1xuICAgIGV4cG9ydHMuYXNzaWduKGV4cG9ydHMsIGZuVHlwZWQpO1xuICB9IGVsc2Uge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEFycmF5O1xuICAgIGV4cG9ydHMuYXNzaWduKGV4cG9ydHMsIGZuVW50eXBlZCk7XG4gIH1cbn07XG5cbmV4cG9ydHMuc2V0VHlwZWQoVFlQRURfT0spO1xuIiwiLy8gU3RyaW5nIGVuY29kZS9kZWNvZGUgaGVscGVyc1xuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuLy8gUXVpY2sgY2hlY2sgaWYgd2UgY2FuIHVzZSBmYXN0IGFycmF5IHRvIGJpbiBzdHJpbmcgY29udmVyc2lvblxuLy9cbi8vIC0gYXBwbHkoQXJyYXkpIGNhbiBmYWlsIG9uIEFuZHJvaWQgMi4yXG4vLyAtIGFwcGx5KFVpbnQ4QXJyYXkpIGNhbiBmYWlsIG9uIGlPUyA1LjEgU2FmYXJpXG4vL1xudmFyIFNUUl9BUFBMWV9PSyA9IHRydWU7XG52YXIgU1RSX0FQUExZX1VJQV9PSyA9IHRydWU7XG5cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgWyAwIF0pOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfT0sgPSBmYWxzZTsgfVxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9VSUFfT0sgPSBmYWxzZTsgfVxuXG5cbi8vIFRhYmxlIHdpdGggdXRmOCBsZW5ndGhzIChjYWxjdWxhdGVkIGJ5IGZpcnN0IGJ5dGUgb2Ygc2VxdWVuY2UpXG4vLyBOb3RlLCB0aGF0IDUgJiA2LWJ5dGUgdmFsdWVzIGFuZCBzb21lIDQtYnl0ZSB2YWx1ZXMgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBpbiBKUyxcbi8vIGJlY2F1c2UgbWF4IHBvc3NpYmxlIGNvZGVwb2ludCBpcyAweDEwZmZmZlxudmFyIF91dGY4bGVuID0gbmV3IHV0aWxzLkJ1ZjgoMjU2KTtcbmZvciAodmFyIHEgPSAwOyBxIDwgMjU2OyBxKyspIHtcbiAgX3V0ZjhsZW5bcV0gPSAocSA+PSAyNTIgPyA2IDogcSA+PSAyNDggPyA1IDogcSA+PSAyNDAgPyA0IDogcSA+PSAyMjQgPyAzIDogcSA+PSAxOTIgPyAyIDogMSk7XG59XG5fdXRmOGxlblsyNTRdID0gX3V0ZjhsZW5bMjU0XSA9IDE7IC8vIEludmFsaWQgc2VxdWVuY2Ugc3RhcnRcblxuXG4vLyBjb252ZXJ0IHN0cmluZyB0byBhcnJheSAodHlwZWQsIHdoZW4gcG9zc2libGUpXG5leHBvcnRzLnN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBidWYsIGMsIGMyLCBtX3BvcywgaSwgc3RyX2xlbiA9IHN0ci5sZW5ndGgsIGJ1Zl9sZW4gPSAwO1xuXG4gIC8vIGNvdW50IGJpbmFyeSBzaXplXG4gIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGJ1Zl9sZW4gKz0gYyA8IDB4ODAgPyAxIDogYyA8IDB4ODAwID8gMiA6IGMgPCAweDEwMDAwID8gMyA6IDQ7XG4gIH1cblxuICAvLyBhbGxvY2F0ZSBidWZmZXJcbiAgYnVmID0gbmV3IHV0aWxzLkJ1ZjgoYnVmX2xlbik7XG5cbiAgLy8gY29udmVydFxuICBmb3IgKGkgPSAwLCBtX3BvcyA9IDA7IGkgPCBidWZfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgIC8qIG9uZSBieXRlICovXG4gICAgICBidWZbaSsrXSA9IGM7XG4gICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweEMwIHwgKGMgPj4+IDYpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2UgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAvKiB0aHJlZSBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweEUwIHwgKGMgPj4+IDEyKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBmb3VyIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4ZjAgfCAoYyA+Pj4gMTgpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDEyICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmO1xufTtcblxuLy8gSGVscGVyICh1c2VkIGluIDIgcGxhY2VzKVxuZnVuY3Rpb24gYnVmMmJpbnN0cmluZyhidWYsIGxlbikge1xuICAvLyBPbiBDaHJvbWUsIHRoZSBhcmd1bWVudHMgaW4gYSBmdW5jdGlvbiBjYWxsIHRoYXQgYXJlIGFsbG93ZWQgaXMgYDY1NTM0YC5cbiAgLy8gSWYgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbiB0aGF0LCB3ZSBjYW4gdXNlIHRoaXMgb3B0aW1pemF0aW9uLFxuICAvLyBvdGhlcndpc2Ugd2Ugd2lsbCB0YWtlIGEgc2xvd2VyIHBhdGguXG4gIGlmIChsZW4gPCA2NTUzNCkge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICByZXR1cm4gYnVmMmJpbnN0cmluZyhidWYsIGJ1Zi5sZW5ndGgpO1xufTtcblxuXG4vLyBDb252ZXJ0IGJpbmFyeSBzdHJpbmcgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gbmV3IHV0aWxzLkJ1Zjgoc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufTtcblxuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xuZXhwb3J0cy5idWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBpLCBvdXQsIGMsIGNfbGVuO1xuICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG5cbiAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpO1xuXG4gIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbmV4cG9ydHMudXRmOGJvcmRlciA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIFZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgYnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGlzbid0IHdvcnRoIGl0IHRvIG1ha2UgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGFzIGluIG9yaWdpbmFsLlxuLy8gU21hbGwgc2l6ZSBpcyBwcmVmZXJhYmxlLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MCxcbiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYgMHhmZmZmKSB8MCxcbiAgICAgIG4gPSAwO1xuXG4gIHdoaWxlIChsZW4gIT09IDApIHtcbiAgICAvLyBTZXQgbGltaXQgfiB0d2ljZSBsZXNzIHRoYW4gNTU1MiwgdG8ga2VlcFxuICAgIC8vIHMyIGluIDMxLWJpdHMsIGJlY2F1c2Ugd2UgZm9yY2Ugc2lnbmVkIGludHMuXG4gICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuXG4gICAgbiA9IGxlbiA+IDIwMDAgPyAyMDAwIDogbGVuO1xuICAgIGxlbiAtPSBuO1xuXG4gICAgZG8ge1xuICAgICAgczEgPSAoczEgKyBidWZbcG9zKytdKSB8MDtcbiAgICAgIHMyID0gKHMyICsgczEpIHwwO1xuICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICBzMSAlPSA2NTUyMTtcbiAgICBzMiAlPSA2NTUyMTtcbiAgfVxuXG4gIHJldHVybiAoczEgfCAoczIgPDwgMTYpKSB8MDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuICBaX05PX0ZMVVNIOiAgICAgICAgIDAsXG4gIFpfUEFSVElBTF9GTFVTSDogICAgMSxcbiAgWl9TWU5DX0ZMVVNIOiAgICAgICAyLFxuICBaX0ZVTExfRkxVU0g6ICAgICAgIDMsXG4gIFpfRklOSVNIOiAgICAgICAgICAgNCxcbiAgWl9CTE9DSzogICAgICAgICAgICA1LFxuICBaX1RSRUVTOiAgICAgICAgICAgIDYsXG5cbiAgLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAgKi9cbiAgWl9PSzogICAgICAgICAgICAgICAwLFxuICBaX1NUUkVBTV9FTkQ6ICAgICAgIDEsXG4gIFpfTkVFRF9ESUNUOiAgICAgICAgMixcbiAgWl9FUlJOTzogICAgICAgICAgIC0xLFxuICBaX1NUUkVBTV9FUlJPUjogICAgLTIsXG4gIFpfREFUQV9FUlJPUjogICAgICAtMyxcbiAgLy9aX01FTV9FUlJPUjogICAgIC00LFxuICBaX0JVRl9FUlJPUjogICAgICAgLTUsXG4gIC8vWl9WRVJTSU9OX0VSUk9SOiAtNixcblxuICAvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbiAgWl9OT19DT01QUkVTU0lPTjogICAgICAgICAwLFxuICBaX0JFU1RfU1BFRUQ6ICAgICAgICAgICAgIDEsXG4gIFpfQkVTVF9DT01QUkVTU0lPTjogICAgICAgOSxcbiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAgIC0xLFxuXG5cbiAgWl9GSUxURVJFRDogICAgICAgICAgICAgICAxLFxuICBaX0hVRkZNQU5fT05MWTogICAgICAgICAgIDIsXG4gIFpfUkxFOiAgICAgICAgICAgICAgICAgICAgMyxcbiAgWl9GSVhFRDogICAgICAgICAgICAgICAgICA0LFxuICBaX0RFRkFVTFRfU1RSQVRFR1k6ICAgICAgIDAsXG5cbiAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuICBaX0JJTkFSWTogICAgICAgICAgICAgICAgIDAsXG4gIFpfVEVYVDogICAgICAgICAgICAgICAgICAgMSxcbiAgLy9aX0FTQ0lJOiAgICAgICAgICAgICAgICAxLCAvLyA9IFpfVEVYVCAoZGVwcmVjYXRlZClcbiAgWl9VTktOT1dOOiAgICAgICAgICAgICAgICAyLFxuXG4gIC8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xuICBaX0RFRkxBVEVEOiAgICAgICAgICAgICAgIDhcbiAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5nIG9uIHZhciB0eXBlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiB3ZSBjYW4ndCBnZXQgc2lnbmlmaWNhbnQgc3BlZWQgYm9vc3QgaGVyZS5cbi8vIFNvIHdyaXRlIGNvZGUgdG8gbWluaW1pemUgc2l6ZSAtIG5vIHByZWdlbmVyYXRlZCB0YWJsZXNcbi8vIGFuZCBhcnJheSB0b29scyBkZXBlbmRlbmNpZXMuXG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgdmFyIGMsIHRhYmxlID0gW107XG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCAyNTY7IG4rKykge1xuICAgIGMgPSBuO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgODsgaysrKSB7XG4gICAgICBjID0gKChjICYgMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuICAgIH1cbiAgICB0YWJsZVtuXSA9IGM7XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG5cbi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uXG52YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTtcblxuXG5mdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHQgPSBjcmNUYWJsZSxcbiAgICAgIGVuZCA9IHBvcyArIGxlbjtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrKSB7XG4gICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gIH1cblxuICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyYzMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbnZhciB1dGlscyAgID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG52YXIgdHJlZXMgICA9IHJlcXVpcmUoJy4vdHJlZXMnKTtcbnZhciBhZGxlcjMyID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBtc2cgICAgID0gcmVxdWlyZSgnLi9tZXNzYWdlcycpO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovXG52YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbnZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbnZhciBaX0ZVTExfRkxVU0ggICAgPSAzO1xudmFyIFpfRklOSVNIICAgICAgICA9IDQ7XG52YXIgWl9CTE9DSyAgICAgICAgID0gNTtcbi8vdmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xuLy92YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xuLy92YXIgWl9NRU1fRVJST1IgICAgID0gLTQ7XG52YXIgWl9CVUZfRVJST1IgICAgID0gLTU7XG4vL3ZhciBaX1ZFUlNJT05fRVJST1IgPSAtNjtcblxuXG4vKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbi8vdmFyIFpfTk9fQ09NUFJFU1NJT04gICAgICA9IDA7XG4vL3ZhciBaX0JFU1RfU1BFRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9CRVNUX0NPTVBSRVNTSU9OICAgID0gOTtcbnZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSAtMTtcblxuXG52YXIgWl9GSUxURVJFRCAgICAgICAgICAgID0gMTtcbnZhciBaX0hVRkZNQU5fT05MWSAgICAgICAgPSAyO1xudmFyIFpfUkxFICAgICAgICAgICAgICAgICA9IDM7XG52YXIgWl9GSVhFRCAgICAgICAgICAgICAgID0gNDtcbnZhciBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwO1xuXG4vKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovXG4vL3ZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xuLy92YXIgWl9URVhUICAgICAgICAgICAgICAgID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgICA9IDE7IC8vID0gWl9URVhUXG52YXIgWl9VTktOT1dOICAgICAgICAgICAgID0gMjtcblxuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyIE1BWF9NRU1fTEVWRUwgPSA5O1xuLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfTUVNX0xFVkVMID0gODtcblxuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG52YXIgTElURVJBTFMgICAgICA9IDI1Njtcbi8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqL1xudmFyIExfQ09ERVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7XG4vKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi9cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cbnZhciBCTF9DT0RFUyAgICAgID0gMTk7XG4vKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi9cbnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cbnZhciBNQVhfQklUUyAgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgTUlOX01BVENIID0gMztcbnZhciBNQVhfTUFUQ0ggPSAyNTg7XG52YXIgTUlOX0xPT0tBSEVBRCA9IChNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKTtcblxudmFyIFBSRVNFVF9ESUNUID0gMHgyMDtcblxudmFyIElOSVRfU1RBVEUgPSA0MjtcbnZhciBFWFRSQV9TVEFURSA9IDY5O1xudmFyIE5BTUVfU1RBVEUgPSA3MztcbnZhciBDT01NRU5UX1NUQVRFID0gOTE7XG52YXIgSENSQ19TVEFURSA9IDEwMztcbnZhciBCVVNZX1NUQVRFID0gMTEzO1xudmFyIEZJTklTSF9TVEFURSA9IDY2NjtcblxudmFyIEJTX05FRURfTU9SRSAgICAgID0gMTsgLyogYmxvY2sgbm90IGNvbXBsZXRlZCwgbmVlZCBtb3JlIGlucHV0IG9yIG1vcmUgb3V0cHV0ICovXG52YXIgQlNfQkxPQ0tfRE9ORSAgICAgPSAyOyAvKiBibG9jayBmbHVzaCBwZXJmb3JtZWQgKi9cbnZhciBCU19GSU5JU0hfU1RBUlRFRCA9IDM7IC8qIGZpbmlzaCBzdGFydGVkLCBuZWVkIG9ubHkgbW9yZSBvdXRwdXQgYXQgbmV4dCBkZWZsYXRlICovXG52YXIgQlNfRklOSVNIX0RPTkUgICAgPSA0OyAvKiBmaW5pc2ggZG9uZSwgYWNjZXB0IG5vIG1vcmUgaW5wdXQgb3Igb3V0cHV0ICovXG5cbnZhciBPU19DT0RFID0gMHgwMzsgLy8gVW5peCA6KSAuIERvbid0IGRldGVjdCwgdXNlIHRoaXMgZGVmYXVsdC5cblxuZnVuY3Rpb24gZXJyKHN0cm0sIGVycm9yQ29kZSkge1xuICBzdHJtLm1zZyA9IG1zZ1tlcnJvckNvZGVdO1xuICByZXR1cm4gZXJyb3JDb2RlO1xufVxuXG5mdW5jdGlvbiByYW5rKGYpIHtcbiAgcmV0dXJuICgoZikgPDwgMSkgLSAoKGYpID4gNCA/IDkgOiAwKTtcbn1cblxuZnVuY3Rpb24gemVybyhidWYpIHsgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgtLWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfSB9XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZS4gQWxsIGRlZmxhdGUoKSBvdXRwdXQgZ29lc1xuICogdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdFxuICogdG8gYXZvaWQgYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPm91dHB1dCBidWZmZXIgYW5kIGNvcHlpbmcgaW50byBpdC5cbiAqIChTZWUgYWxzbyByZWFkX2J1ZigpKS5cbiAqL1xuZnVuY3Rpb24gZmx1c2hfcGVuZGluZyhzdHJtKSB7XG4gIHZhciBzID0gc3RybS5zdGF0ZTtcblxuICAvL190cl9mbHVzaF9iaXRzKHMpO1xuICB2YXIgbGVuID0gcy5wZW5kaW5nO1xuICBpZiAobGVuID4gc3RybS5hdmFpbF9vdXQpIHtcbiAgICBsZW4gPSBzdHJtLmF2YWlsX291dDtcbiAgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybjsgfVxuXG4gIHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmdfb3V0LCBsZW4sIHN0cm0ubmV4dF9vdXQpO1xuICBzdHJtLm5leHRfb3V0ICs9IGxlbjtcbiAgcy5wZW5kaW5nX291dCArPSBsZW47XG4gIHN0cm0udG90YWxfb3V0ICs9IGxlbjtcbiAgc3RybS5hdmFpbF9vdXQgLT0gbGVuO1xuICBzLnBlbmRpbmcgLT0gbGVuO1xuICBpZiAocy5wZW5kaW5nID09PSAwKSB7XG4gICAgcy5wZW5kaW5nX291dCA9IDA7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBmbHVzaF9ibG9ja19vbmx5KHMsIGxhc3QpIHtcbiAgdHJlZXMuX3RyX2ZsdXNoX2Jsb2NrKHMsIChzLmJsb2NrX3N0YXJ0ID49IDAgPyBzLmJsb2NrX3N0YXJ0IDogLTEpLCBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCwgbGFzdCk7XG4gIHMuYmxvY2tfc3RhcnQgPSBzLnN0cnN0YXJ0O1xuICBmbHVzaF9wZW5kaW5nKHMuc3RybSk7XG59XG5cblxuZnVuY3Rpb24gcHV0X2J5dGUocywgYikge1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGI7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUHV0IGEgc2hvcnQgaW4gdGhlIHBlbmRpbmcgYnVmZmVyLiBUaGUgMTYtYml0IHZhbHVlIGlzIHB1dCBpbiBNU0Igb3JkZXIuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gc3RhdGUgaXMgY29ycmVjdCBhbmQgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW5cbiAqIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBwdXRTaG9ydE1TQihzLCBiKSB7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgPj4gOCkpO1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiICYgMHhmZikpO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IChiID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYiAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgdXBkYXRlIHRoZSBhZGxlcjMyXG4gKiBhbmQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBBbGwgZGVmbGF0ZSgpIGlucHV0IGdvZXMgdGhyb3VnaFxuICogdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQgdG8gYXZvaWRcbiAqIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5pbnB1dCBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC5cbiAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLlxuICovXG5mdW5jdGlvbiByZWFkX2J1ZihzdHJtLCBidWYsIHN0YXJ0LCBzaXplKSB7XG4gIHZhciBsZW4gPSBzdHJtLmF2YWlsX2luO1xuXG4gIGlmIChsZW4gPiBzaXplKSB7IGxlbiA9IHNpemU7IH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm4gMDsgfVxuXG4gIHN0cm0uYXZhaWxfaW4gLT0gbGVuO1xuXG4gIC8vIHptZW1jcHkoYnVmLCBzdHJtLT5uZXh0X2luLCBsZW4pO1xuICB1dGlscy5hcnJheVNldChidWYsIHN0cm0uaW5wdXQsIHN0cm0ubmV4dF9pbiwgbGVuLCBzdGFydCk7XG4gIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDEpIHtcbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgZWxzZSBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAyKSB7XG4gICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gKz0gbGVuO1xuICBzdHJtLnRvdGFsX2luICs9IGxlbjtcblxuICByZXR1cm4gbGVuO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2V0IG1hdGNoX3N0YXJ0IHRvIHRoZSBsb25nZXN0IG1hdGNoIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdHJpbmcgYW5kXG4gKiByZXR1cm4gaXRzIGxlbmd0aC4gTWF0Y2hlcyBzaG9ydGVyIG9yIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFyZSBkaXNjYXJkZWQsXG4gKiBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gcHJldl9sZW5ndGggYW5kIG1hdGNoX3N0YXJ0IGlzXG4gKiBnYXJiYWdlLlxuICogSU4gYXNzZXJ0aW9uczogY3VyX21hdGNoIGlzIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluIGZvciB0aGUgY3VycmVudFxuICogICBzdHJpbmcgKHN0cnN0YXJ0KSBhbmQgaXRzIGRpc3RhbmNlIGlzIDw9IE1BWF9ESVNULCBhbmQgcHJldl9sZW5ndGggPj0gMVxuICogT1VUIGFzc2VydGlvbjogdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QgZ3JlYXRlciB0aGFuIHMtPmxvb2thaGVhZC5cbiAqL1xuZnVuY3Rpb24gbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpIHtcbiAgdmFyIGNoYWluX2xlbmd0aCA9IHMubWF4X2NoYWluX2xlbmd0aDsgICAgICAvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi9cbiAgdmFyIHNjYW4gPSBzLnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqL1xuICB2YXIgbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovXG4gIHZhciBiZXN0X2xlbiA9IHMucHJldl9sZW5ndGg7ICAgICAgICAgICAgICAvKiBiZXN0IG1hdGNoIGxlbmd0aCBzbyBmYXIgKi9cbiAgdmFyIG5pY2VfbWF0Y2ggPSBzLm5pY2VfbWF0Y2g7ICAgICAgICAgICAgIC8qIHN0b3AgaWYgbWF0Y2ggbG9uZyBlbm91Z2ggKi9cbiAgdmFyIGxpbWl0ID0gKHMuc3Ryc3RhcnQgPiAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkgP1xuICAgICAgcy5zdHJzdGFydCAtIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIDogMC8qTklMKi87XG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdzsgLy8gc2hvcnRjdXRcblxuICB2YXIgd21hc2sgPSBzLndfbWFzaztcbiAgdmFyIHByZXYgID0gcy5wcmV2O1xuXG4gIC8qIFN0b3Agd2hlbiBjdXJfbWF0Y2ggYmVjb21lcyA8PSBsaW1pdC4gVG8gc2ltcGxpZnkgdGhlIGNvZGUsXG4gICAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuXG4gICAqL1xuXG4gIHZhciBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICB2YXIgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gIHZhciBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuXG4gIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LlxuICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5LlxuICAgKi9cbiAgLy8gQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsIFwiQ29kZSB0b28gY2xldmVyXCIpO1xuXG4gIC8qIERvIG5vdCB3YXN0ZSB0b28gbXVjaCB0aW1lIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGdvb2QgbWF0Y2g6ICovXG4gIGlmIChzLnByZXZfbGVuZ3RoID49IHMuZ29vZF9tYXRjaCkge1xuICAgIGNoYWluX2xlbmd0aCA+Pj0gMjtcbiAgfVxuICAvKiBEbyBub3QgbG9vayBmb3IgbWF0Y2hlcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuIFRoaXMgaXMgbmVjZXNzYXJ5XG4gICAqIHRvIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgaWYgKG5pY2VfbWF0Y2ggPiBzLmxvb2thaGVhZCkgeyBuaWNlX21hdGNoID0gcy5sb29rYWhlYWQ7IH1cblxuICAvLyBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFELCBcIm5lZWQgbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICAvLyBBc3NlcnQoY3VyX21hdGNoIDwgcy0+c3Ryc3RhcnQsIFwibm8gZnV0dXJlXCIpO1xuICAgIG1hdGNoID0gY3VyX21hdGNoO1xuXG4gICAgLyogU2tpcCB0byBuZXh0IG1hdGNoIGlmIHRoZSBtYXRjaCBsZW5ndGggY2Fubm90IGluY3JlYXNlXG4gICAgICogb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMi4gIE5vdGUgdGhhdCB0aGUgY2hlY2tzIGJlbG93XG4gICAgICogZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBvY2N1ciBvY2Nhc2lvbmFsbHkgZm9yIHBlcmZvcm1hbmNlXG4gICAgICogcmVhc29ucy4gIFRoZXJlZm9yZSB1bmluaXRpYWxpemVkIG1lbW9yeSB3aWxsIGJlIGFjY2Vzc2VkLCBhbmRcbiAgICAgKiBjb25kaXRpb25hbCBqdW1wcyB3aWxsIGJlIG1hZGUgdGhhdCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzLlxuICAgICAqIEhvd2V2ZXIgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbGltaXRlZCB0byB0aGUgbG9va2FoZWFkLCBzb1xuICAgICAqIHRoZSBvdXRwdXQgb2YgZGVmbGF0ZSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLlxuICAgICAqL1xuXG4gICAgaWYgKF93aW5bbWF0Y2ggKyBiZXN0X2xlbl0gICAgICE9PSBzY2FuX2VuZCAgfHxcbiAgICAgICAgX3dpblttYXRjaCArIGJlc3RfbGVuIC0gMV0gIT09IHNjYW5fZW5kMSB8fFxuICAgICAgICBfd2luW21hdGNoXSAgICAgICAgICAgICAgICAhPT0gX3dpbltzY2FuXSB8fFxuICAgICAgICBfd2luWysrbWF0Y2hdICAgICAgICAgICAgICAhPT0gX3dpbltzY2FuICsgMV0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qIFRoZSBjaGVjayBhdCBiZXN0X2xlbi0xIGNhbiBiZSByZW1vdmVkIGJlY2F1c2UgaXQgd2lsbCBiZSBtYWRlXG4gICAgICogYWdhaW4gbGF0ZXIuIChUaGlzIGhldXJpc3RpYyBpcyBub3QgYWx3YXlzIGEgd2luLilcbiAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleVxuICAgICAqIGFyZSBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXRcbiAgICAgKiB0aGUgaGFzaCBrZXlzIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC5cbiAgICAgKi9cbiAgICBzY2FuICs9IDI7XG4gICAgbWF0Y2grKztcbiAgICAvLyBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCBcIm1hdGNoWzJdP1wiKTtcblxuICAgIC8qIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgZXZlcnkgOHRoIGNvbXBhcmlzb247XG4gICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguXG4gICAgICovXG4gICAgZG8ge1xuICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgfSB3aGlsZSAoX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuXG4gICAgLy8gQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1bnNpZ25lZCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuXG4gICAgbGVuID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgIHNjYW4gPSBzdHJlbmQgLSBNQVhfTUFUQ0g7XG5cbiAgICBpZiAobGVuID4gYmVzdF9sZW4pIHtcbiAgICAgIHMubWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7XG4gICAgICBiZXN0X2xlbiA9IGxlbjtcbiAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICAgICAgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcbiAgICB9XG4gIH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdCAmJiAtLWNoYWluX2xlbmd0aCAhPT0gMCk7XG5cbiAgaWYgKGJlc3RfbGVuIDw9IHMubG9va2FoZWFkKSB7XG4gICAgcmV0dXJuIGJlc3RfbGVuO1xuICB9XG4gIHJldHVybiBzLmxvb2thaGVhZDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZpbGwgdGhlIHdpbmRvdyB3aGVuIHRoZSBsb29rYWhlYWQgYmVjb21lcyBpbnN1ZmZpY2llbnQuXG4gKiBVcGRhdGVzIHN0cnN0YXJ0IGFuZCBsb29rYWhlYWQuXG4gKlxuICogSU4gYXNzZXJ0aW9uOiBsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEXG4gKiBPVVQgYXNzZXJ0aW9uczogc3Ryc3RhcnQgPD0gd2luZG93X3NpemUtTUlOX0xPT0tBSEVBRFxuICogICAgQXQgbGVhc3Qgb25lIGJ5dGUgaGFzIGJlZW4gcmVhZCwgb3IgYXZhaWxfaW4gPT0gMDsgcmVhZHMgYXJlXG4gKiAgICBwZXJmb3JtZWQgZm9yIGF0IGxlYXN0IHR3byBieXRlcyAocmVxdWlyZWQgZm9yIHRoZSB6aXAgdHJhbnNsYXRlX2VvbFxuICogICAgb3B0aW9uIC0tIG5vdCBzdXBwb3J0ZWQgaGVyZSkuXG4gKi9cbmZ1bmN0aW9uIGZpbGxfd2luZG93KHMpIHtcbiAgdmFyIF93X3NpemUgPSBzLndfc2l6ZTtcbiAgdmFyIHAsIG4sIG0sIG1vcmUsIHN0cjtcblxuICAvL0Fzc2VydChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFELCBcImFscmVhZHkgZW5vdWdoIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgbW9yZSA9IHMud2luZG93X3NpemUgLSBzLmxvb2thaGVhZCAtIHMuc3Ryc3RhcnQ7XG5cbiAgICAvLyBKUyBpbnRzIGhhdmUgMzIgYml0LCBibG9jayBiZWxvdyBub3QgbmVlZGVkXG4gICAgLyogRGVhbCB3aXRoICFAIyQlIDY0SyBsaW1pdDogKi9cbiAgICAvL2lmIChzaXplb2YoaW50KSA8PSAyKSB7XG4gICAgLy8gICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7XG4gICAgLy8gICAgICAgIG1vcmUgPSB3c2l6ZTtcbiAgICAvL1xuICAgIC8vICB9IGVsc2UgaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSgtMSkpIHtcbiAgICAvLyAgICAgICAgLyogVmVyeSB1bmxpa2VseSwgYnV0IHBvc3NpYmxlIG9uIDE2IGJpdCBtYWNoaW5lIGlmXG4gICAgLy8gICAgICAgICAqIHN0cnN0YXJ0ID09IDAgJiYgbG9va2FoZWFkID09IDEgKGlucHV0IGRvbmUgYSBieXRlIGF0IHRpbWUpXG4gICAgLy8gICAgICAgICAqL1xuICAgIC8vICAgICAgICBtb3JlLS07XG4gICAgLy8gICAgfVxuICAgIC8vfVxuXG5cbiAgICAvKiBJZiB0aGUgd2luZG93IGlzIGFsbW9zdCBmdWxsIGFuZCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLFxuICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgPj0gX3dfc2l6ZSArIChfd19zaXplIC0gTUlOX0xPT0tBSEVBRCkpIHtcblxuICAgICAgdXRpbHMuYXJyYXlTZXQocy53aW5kb3csIHMud2luZG93LCBfd19zaXplLCBfd19zaXplLCAwKTtcbiAgICAgIHMubWF0Y2hfc3RhcnQgLT0gX3dfc2l6ZTtcbiAgICAgIHMuc3Ryc3RhcnQgLT0gX3dfc2l6ZTtcbiAgICAgIC8qIHdlIG5vdyBoYXZlIHN0cnN0YXJ0ID49IE1BWF9ESVNUICovXG4gICAgICBzLmJsb2NrX3N0YXJ0IC09IF93X3NpemU7XG5cbiAgICAgIC8qIFNsaWRlIHRoZSBoYXNoIHRhYmxlIChjb3VsZCBiZSBhdm9pZGVkIHdpdGggMzIgYml0IHZhbHVlc1xuICAgICAgIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZSkuIFdlIHNsaWRlIGV2ZW4gd2hlbiBsZXZlbCA9PSAwXG4gICAgICAgdG8ga2VlcCB0aGUgaGFzaCB0YWJsZSBjb25zaXN0ZW50IGlmIHdlIHN3aXRjaCBiYWNrIHRvIGxldmVsID4gMFxuICAgICAgIGxhdGVyLiAoVXNpbmcgbGV2ZWwgMCBwZXJtYW5lbnRseSBpcyBub3QgYW4gb3B0aW1hbCB1c2FnZSBvZlxuICAgICAgIHpsaWIsIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBwYXRob2xvZ2ljYWwgY2FzZS4pXG4gICAgICAgKi9cblxuICAgICAgbiA9IHMuaGFzaF9zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLmhlYWRbLS1wXTtcbiAgICAgICAgcy5oZWFkW3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBuID0gX3dfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5wcmV2Wy0tcF07XG4gICAgICAgIHMucHJldltwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgICAvKiBJZiBuIGlzIG5vdCBvbiBhbnkgaGFzaCBjaGFpbiwgcHJldltuXSBpcyBnYXJiYWdlIGJ1dFxuICAgICAgICAgKiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLlxuICAgICAgICAgKi9cbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG1vcmUgKz0gX3dfc2l6ZTtcbiAgICB9XG4gICAgaWYgKHMuc3RybS5hdmFpbF9pbiA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLyogSWYgdGhlcmUgd2FzIG5vIHNsaWRpbmc6XG4gICAgICogICAgc3Ryc3RhcnQgPD0gV1NJWkUrTUFYX0RJU1QtMSAmJiBsb29rYWhlYWQgPD0gTUlOX0xPT0tBSEVBRCAtIDEgJiZcbiAgICAgKiAgICBtb3JlID09IHdpbmRvd19zaXplIC0gbG9va2FoZWFkIC0gc3Ryc3RhcnRcbiAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gKE1JTl9MT09LQUhFQUQtMSArIFdTSVpFICsgTUFYX0RJU1QtMSlcbiAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gMipXU0laRSArIDJcbiAgICAgKiBJbiB0aGUgQklHX01FTSBvciBNTUFQIGNhc2UgKG5vdCB5ZXQgc3VwcG9ydGVkKSxcbiAgICAgKiAgIHdpbmRvd19zaXplID09IGlucHV0X3NpemUgKyBNSU5fTE9PS0FIRUFEICAmJlxuICAgICAqICAgc3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgPD0gaW5wdXRfc2l6ZSA9PiBtb3JlID49IE1JTl9MT09LQUhFQUQuXG4gICAgICogT3RoZXJ3aXNlLCB3aW5kb3dfc2l6ZSA9PSAyKldTSVpFIHNvIG1vcmUgPj0gMi5cbiAgICAgKiBJZiB0aGVyZSB3YXMgc2xpZGluZywgbW9yZSA+PSBXU0laRS4gU28gaW4gYWxsIGNhc2VzLCBtb3JlID49IDIuXG4gICAgICovXG4gICAgLy9Bc3NlcnQobW9yZSA+PSAyLCBcIm1vcmUgPCAyXCIpO1xuICAgIG4gPSByZWFkX2J1ZihzLnN0cm0sIHMud2luZG93LCBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQsIG1vcmUpO1xuICAgIHMubG9va2FoZWFkICs9IG47XG5cbiAgICAvKiBJbml0aWFsaXplIHRoZSBoYXNoIHZhbHVlIG5vdyB0aGF0IHdlIGhhdmUgc29tZSBpbnB1dDogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIHN0ciA9IHMuc3Ryc3RhcnQgLSBzLmluc2VydDtcbiAgICAgIHMuaW5zX2ggPSBzLndpbmRvd1tzdHJdO1xuXG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIDFdKTsgKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIDFdKSAmIHMuaGFzaF9tYXNrO1xuLy8jaWYgTUlOX01BVENIICE9IDNcbi8vICAgICAgICBDYWxsIHVwZGF0ZV9oYXNoKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgIHdoaWxlIChzLmluc2VydCkge1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7ICovXG4gICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4gICAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgICAgc3RyKys7XG4gICAgICAgIHMuaW5zZXJ0LS07XG4gICAgICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0IDwgTUlOX01BVENIKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLyogSWYgdGhlIHdob2xlIGlucHV0IGhhcyBsZXNzIHRoYW4gTUlOX01BVENIIGJ5dGVzLCBpbnNfaCBpcyBnYXJiYWdlLFxuICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC5cbiAgICAgKi9cblxuICB9IHdoaWxlIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgcy5zdHJtLmF2YWlsX2luICE9PSAwKTtcblxuICAvKiBJZiB0aGUgV0lOX0lOSVQgYnl0ZXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBkYXRhIGhhdmUgbmV2ZXIgYmVlblxuICAgKiB3cml0dGVuLCB0aGVuIHplcm8gdGhvc2UgYnl0ZXMgaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHJlcG9ydHMgb2ZcbiAgICogdGhlIHVzZSBvZiB1bmluaXRpYWxpemVkIChvciB1bmluaXRpYWxpc2VkIGFzIEp1bGlhbiB3cml0ZXMpIGJ5dGVzIGJ5XG4gICAqIHRoZSBsb25nZXN0IG1hdGNoIHJvdXRpbmVzLiAgVXBkYXRlIHRoZSBoaWdoIHdhdGVyIG1hcmsgZm9yIHRoZSBuZXh0XG4gICAqIHRpbWUgdGhyb3VnaCBoZXJlLiAgV0lOX0lOSVQgaXMgc2V0IHRvIE1BWF9NQVRDSCBzaW5jZSB0aGUgbG9uZ2VzdCBtYXRjaFxuICAgKiByb3V0aW5lcyBhbGxvdyBzY2FubmluZyB0byBzdHJzdGFydCArIE1BWF9NQVRDSCwgaWdub3JpbmcgbG9va2FoZWFkLlxuICAgKi9cbi8vICBpZiAocy5oaWdoX3dhdGVyIDwgcy53aW5kb3dfc2l6ZSkge1xuLy8gICAgdmFyIGN1cnIgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQ7XG4vLyAgICB2YXIgaW5pdCA9IDA7XG4vL1xuLy8gICAgaWYgKHMuaGlnaF93YXRlciA8IGN1cnIpIHtcbi8vICAgICAgLyogUHJldmlvdXMgaGlnaCB3YXRlciBtYXJrIGJlbG93IGN1cnJlbnQgZGF0YSAtLSB6ZXJvIFdJTl9JTklUXG4vLyAgICAgICAqIGJ5dGVzIG9yIHVwIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9IHMud2luZG93X3NpemUgLSBjdXJyO1xuLy8gICAgICBpZiAoaW5pdCA+IFdJTl9JTklUKVxuLy8gICAgICAgIGluaXQgPSBXSU5fSU5JVDtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgY3VyciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyID0gY3VyciArIGluaXQ7XG4vLyAgICB9XG4vLyAgICBlbHNlIGlmIChzLT5oaWdoX3dhdGVyIDwgKHVsZyljdXJyICsgV0lOX0lOSVQpIHtcbi8vICAgICAgLyogSGlnaCB3YXRlciBtYXJrIGF0IG9yIGFib3ZlIGN1cnJlbnQgZGF0YSwgYnV0IGJlbG93IGN1cnJlbnQgZGF0YVxuLy8gICAgICAgKiBwbHVzIFdJTl9JTklUIC0tIHplcm8gb3V0IHRvIGN1cnJlbnQgZGF0YSBwbHVzIFdJTl9JTklULCBvciB1cFxuLy8gICAgICAgKiB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSAodWxnKWN1cnIgKyBXSU5fSU5JVCAtIHMtPmhpZ2hfd2F0ZXI7XG4vLyAgICAgIGlmIChpbml0ID4gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyKVxuLy8gICAgICAgIGluaXQgPSBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXI7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIHMtPmhpZ2hfd2F0ZXIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciArPSBpbml0O1xuLy8gICAgfVxuLy8gIH1cbi8vXG4vLyAgQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUgLSBNSU5fTE9PS0FIRUFELFxuLy8gICAgXCJub3QgZW5vdWdoIHJvb20gZm9yIHNlYXJjaFwiKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IHdpdGhvdXQgY29tcHJlc3Npb24gYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVyblxuICogdGhlIGN1cnJlbnQgYmxvY2sgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBzaW5jZVxuICogdW5jb21wcmVzc2libGUgZGF0YSBpcyBwcm9iYWJseSBub3QgdXNlZnVsLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWRcbiAqIG9ubHkgZm9yIHRoZSBsZXZlbD0wIGNvbXByZXNzaW9uIG9wdGlvbi5cbiAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb21cbiAqIHdpbmRvdyB0byBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zdG9yZWQocywgZmx1c2gpIHtcbiAgLyogU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXMsIHBlbmRpbmdfYnVmIGlzIGxpbWl0ZWRcbiAgICogdG8gcGVuZGluZ19idWZfc2l6ZSwgYW5kIGVhY2ggc3RvcmVkIGJsb2NrIGhhcyBhIDUgYnl0ZSBoZWFkZXI6XG4gICAqL1xuICB2YXIgbWF4X2Jsb2NrX3NpemUgPSAweGZmZmY7XG5cbiAgaWYgKG1heF9ibG9ja19zaXplID4gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNSkge1xuICAgIG1heF9ibG9ja19zaXplID0gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNTtcbiAgfVxuXG4gIC8qIENvcHkgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIGlucHV0IHRvIG91dHB1dDogKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIEZpbGwgdGhlIHdpbmRvdyBhcyBtdWNoIGFzIHBvc3NpYmxlOiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSAxKSB7XG5cbiAgICAgIC8vQXNzZXJ0KHMtPnN0cnN0YXJ0IDwgcy0+d19zaXplK01BWF9ESVNUKHMpIHx8XG4gICAgICAvLyAgcy0+YmxvY2tfc3RhcnQgPj0gKGxvbmcpcy0+d19zaXplLCBcInNsaWRlIHRvbyBsYXRlXCIpO1xuLy8gICAgICBpZiAoIShzLnN0cnN0YXJ0IDwgcy53X3NpemUgKyAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSB8fFxuLy8gICAgICAgIHMuYmxvY2tfc3RhcnQgPj0gcy53X3NpemUpKSB7XG4vLyAgICAgICAgdGhyb3cgIG5ldyBFcnJvcihcInNsaWRlIHRvbyBsYXRlXCIpO1xuLy8gICAgICB9XG5cbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuICAgIC8vQXNzZXJ0KHMtPmJsb2NrX3N0YXJ0ID49IDBMLCBcImJsb2NrIGdvbmVcIik7XG4vLyAgICBpZiAocy5ibG9ja19zdGFydCA8IDApIHRocm93IG5ldyBFcnJvcihcImJsb2NrIGdvbmVcIik7XG5cbiAgICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICAgIHMubG9va2FoZWFkID0gMDtcblxuICAgIC8qIEVtaXQgYSBzdG9yZWQgYmxvY2sgaWYgcGVuZGluZ19idWYgd2lsbCBiZSBmdWxsOiAqL1xuICAgIHZhciBtYXhfc3RhcnQgPSBzLmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7XG5cbiAgICBpZiAocy5zdHJzdGFydCA9PT0gMCB8fCBzLnN0cnN0YXJ0ID49IG1heF9zdGFydCkge1xuICAgICAgLyogc3Ryc3RhcnQgPT0gMCBpcyBwb3NzaWJsZSB3aGVuIHdyYXBhcm91bmQgb24gMTYtYml0IG1hY2hpbmUgKi9cbiAgICAgIHMubG9va2FoZWFkID0gcy5zdHJzdGFydCAtIG1heF9zdGFydDtcbiAgICAgIHMuc3Ryc3RhcnQgPSBtYXhfc3RhcnQ7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuXG5cbiAgICB9XG4gICAgLyogRmx1c2ggaWYgd2UgbWF5IGhhdmUgdG8gc2xpZGUsIG90aGVyd2lzZSBibG9ja19zdGFydCBtYXkgYmVjb21lXG4gICAgICogbmVnYXRpdmUgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZ29uZTpcbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQgPj0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG5cbiAgcy5pbnNlcnQgPSAwO1xuXG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuXG4gIGlmIChzLnN0cnN0YXJ0ID4gcy5ibG9ja19zdGFydCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuXG4gIHJldHVybiBCU19ORUVEX01PUkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHJlc3MgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybiB0aGUgY3VycmVudFxuICogYmxvY2sgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgYW5kIGluc2VydHNcbiAqIG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IG9ubHkgZm9yIHVubWF0Y2hlZCBzdHJpbmdzIG9yIGZvciBzaG9ydFxuICogbWF0Y2hlcy4gSXQgaXMgdXNlZCBvbmx5IGZvciB0aGUgZmFzdCBjb21wcmVzc2lvbiBvcHRpb25zLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX2Zhc3QocywgZmx1c2gpIHtcbiAgdmFyIGhhc2hfaGVhZDsgICAgICAgIC8qIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFsd2F5cyBtYXRjaF9sZW5ndGggPCBNSU5fTUFUQ0hcbiAgICAgKi9cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiAoKHMuc3Ryc3RhcnQgLSBoYXNoX2hlYWQpIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSkge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG4gICAgfVxuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vIGNoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMubWF0Y2hfc3RhcnQsIHMubWF0Y2hfbGVuZ3RoKTsgLy8gZm9yIGRlYnVnIG9ubHlcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG5cbiAgICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGhcbiAgICAgICAqIGlzIG5vdCB0b28gbGFyZ2UuIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uXG4gICAgICAgKi9cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSBzLm1heF9sYXp5X21hdGNoLyptYXhfaW5zZXJ0X2xlbmd0aCovICYmIHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgICBzLm1hdGNoX2xlbmd0aC0tOyAvKiBzdHJpbmcgYXQgc3Ryc3RhcnQgYWxyZWFkeSBpbiB0YWJsZSAqL1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAgICAgLyoqKi9cbiAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlXG4gICAgICAgICAgICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgfSB3aGlsZSAoLS1zLm1hdGNoX2xlbmd0aCAhPT0gMCk7XG4gICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIH0gZWxzZVxuICAgICAge1xuICAgICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgICAgIHMuaW5zX2ggPSBzLndpbmRvd1tzLnN0cnN0YXJ0XTtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy5pbnNfaCwgcy53aW5kb3dbcy5zdHJzdGFydCsxXSk7ICovXG4gICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyAxXSkgJiBzLmhhc2hfbWFzaztcblxuLy8jaWYgTUlOX01BVENIICE9IDNcbi8vICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdFxuICAgICAgICAgKiBtYXR0ZXIgc2luY2UgaXQgd2lsbCBiZSByZWNvbXB1dGVkIGF0IG5leHQgZGVmbGF0ZSBjYWxsLlxuICAgICAgICAgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pO1xuXG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgIH1cbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9ICgocy5zdHJzdGFydCA8IChNSU5fTUFUQ0ggLSAxKSkgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMSk7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTYW1lIGFzIGFib3ZlLCBidXQgYWNoaWV2ZXMgYmV0dGVyIGNvbXByZXNzaW9uLiBXZSB1c2UgYSBsYXp5XG4gKiBldmFsdWF0aW9uIGZvciBtYXRjaGVzOiBhIG1hdGNoIGlzIGZpbmFsbHkgYWRvcHRlZCBvbmx5IGlmIHRoZXJlIGlzXG4gKiBubyBiZXR0ZXIgbWF0Y2ggYXQgdGhlIG5leHQgd2luZG93IHBvc2l0aW9uLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3Nsb3cocywgZmx1c2gpIHtcbiAgdmFyIGhhc2hfaGVhZDsgICAgICAgICAgLyogaGVhZCBvZiBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICB2YXIgbWF4X2luc2VydDtcblxuICAvKiBQcm9jZXNzIHRoZSBpbnB1dCBibG9jay4gKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgeyBicmVhazsgfSAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqL1xuICAgIHMucHJldl9sZW5ndGggPSBzLm1hdGNoX2xlbmd0aDtcbiAgICBzLnByZXZfbWF0Y2ggPSBzLm1hdGNoX3N0YXJ0O1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcblxuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmIHMucHJldl9sZW5ndGggPCBzLm1heF9sYXp5X21hdGNoICYmXG4gICAgICAgIHMuc3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkvKk1BWF9ESVNUKHMpKi8pIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gNSAmJlxuICAgICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfRklMVEVSRUQgfHwgKHMubWF0Y2hfbGVuZ3RoID09PSBNSU5fTUFUQ0ggJiYgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQgPiA0MDk2LypUT09fRkFSKi8pKSkge1xuXG4gICAgICAgIC8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIG1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2VcbiAgICAgICAgICogYnV0IHdlIHdpbGwgaWdub3JlIHRoZSBjdXJyZW50IG1hdGNoIGFueXdheS5cbiAgICAgICAgICovXG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHN0ZXAgYW5kIHRoZSBjdXJyZW50XG4gICAgICogbWF0Y2ggaXMgbm90IGJldHRlciwgb3V0cHV0IHRoZSBwcmV2aW91cyBtYXRjaDpcbiAgICAgKi9cbiAgICBpZiAocy5wcmV2X2xlbmd0aCA+PSBNSU5fTUFUQ0ggJiYgcy5tYXRjaF9sZW5ndGggPD0gcy5wcmV2X2xlbmd0aCkge1xuICAgICAgbWF4X2luc2VydCA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCAtIE1JTl9NQVRDSDtcbiAgICAgIC8qIERvIG5vdCBpbnNlcnQgc3RyaW5ncyBpbiBoYXNoIHRhYmxlIGJleW9uZCB0aGlzLiAqL1xuXG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQtMSwgcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoKTtcblxuICAgICAgLyoqKl90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLFxuICAgICAgICAgICAgICAgICAgICAgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuICAgICAgLyogSW5zZXJ0IGluIGhhc2ggdGFibGUgYWxsIHN0cmluZ3MgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2guXG4gICAgICAgKiBzdHJzdGFydC0xIGFuZCBzdHJzdGFydCBhcmUgYWxyZWFkeSBpbnNlcnRlZC4gSWYgdGhlcmUgaXMgbm90XG4gICAgICAgKiBlbm91Z2ggbG9va2FoZWFkLCB0aGUgbGFzdCB0d28gc3RyaW5ncyBhcmUgbm90IGluc2VydGVkIGluXG4gICAgICAgKiB0aGUgaGFzaCB0YWJsZS5cbiAgICAgICAqL1xuICAgICAgcy5sb29rYWhlYWQgLT0gcy5wcmV2X2xlbmd0aCAtIDE7XG4gICAgICBzLnByZXZfbGVuZ3RoIC09IDI7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICgrK3Muc3Ryc3RhcnQgPD0gbWF4X2luc2VydCkge1xuICAgICAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAgICAgLyoqKi9cbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoLS1zLnByZXZfbGVuZ3RoICE9PSAwKTtcbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqKi9cbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBtYXRjaCBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb24sIG91dHB1dCBhXG4gICAgICAgKiBzaW5nbGUgbGl0ZXJhbC4gSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYnV0IHRoZSBjdXJyZW50IG1hdGNoXG4gICAgICAgKiBpcyBsb25nZXIsIHRydW5jYXRlIHRoZSBwcmV2aW91cyBtYXRjaCB0byBhIHNpbmdsZSBsaXRlcmFsLlxuICAgICAgICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnQtMV0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0tfT05MWShzLCAwKSAqKiovXG4gICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgICAvKioqL1xuICAgICAgfVxuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3JcbiAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgXCJubyBmbHVzaD9cIik7XG4gIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnQtMV0sIGJmbHVzaCk7ICoqKi9cbiAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgfVxuICBzLmluc2VydCA9IHMuc3Ryc3RhcnQgPCBNSU5fTUFUQ0ggLSAxID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDE7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuXG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfUkxFLCBzaW1wbHkgbG9vayBmb3IgcnVucyBvZiBieXRlcywgZ2VuZXJhdGUgbWF0Y2hlcyBvbmx5IG9mIGRpc3RhbmNlXG4gKiBvbmUuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLiAgKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2ZcbiAqIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIFpfUkxFLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9ybGUocywgZmx1c2gpIHtcbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cbiAgdmFyIHByZXY7ICAgICAgICAgICAgICAvKiBieXRlIGF0IGRpc3RhbmNlIG9uZSB0byBtYXRjaCAqL1xuICB2YXIgc2Nhbiwgc3RyZW5kOyAgICAgIC8qIHNjYW4gZ29lcyB1cCB0byBzdHJlbmQgZm9yIGxlbmd0aCBvZiBydW4gKi9cblxuICB2YXIgX3dpbiA9IHMud2luZG93O1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbG9uZ2VzdCBydW4sIHBsdXMgb25lIGZvciB0aGUgdW5yb2xsZWQgbG9vcC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0ggJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkgeyBicmVhazsgfSAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cblxuICAgIC8qIFNlZSBob3cgbWFueSB0aW1lcyB0aGUgcHJldmlvdXMgYnl0ZSByZXBlYXRzICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0ggJiYgcy5zdHJzdGFydCA+IDApIHtcbiAgICAgIHNjYW4gPSBzLnN0cnN0YXJ0IC0gMTtcbiAgICAgIHByZXYgPSBfd2luW3NjYW5dO1xuICAgICAgaWYgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dKSB7XG4gICAgICAgIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICAgICAgfSB3aGlsZSAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+IHMubG9va2FoZWFkKSB7XG4gICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBzLmxvb2thaGVhZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVJbnQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcbiAgICB9XG5cbiAgICAvKiBFbWl0IG1hdGNoIGlmIGhhdmUgcnVuIG9mIE1JTl9NQVRDSCBvciBsb25nZXIsIGVsc2UgZW1pdCBsaXRlcmFsICovXG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLnN0cnN0YXJ0IC0gMSwgcy5tYXRjaF9sZW5ndGgpO1xuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pO1xuXG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgIH1cbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9IVUZGTUFOX09OTFksIGRvIG5vdCBsb29rIGZvciBtYXRjaGVzLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS5cbiAqIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIEh1ZmZtYW4uKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX2h1ZmYocywgZmx1c2gpIHtcbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSBsaXRlcmFsIHRvIHdyaXRlLiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICBicmVhazsgICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIE91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pO1xuICAgIHMubG9va2FoZWFkLS07XG4gICAgcy5zdHJzdGFydCsrO1xuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiBWYWx1ZXMgZm9yIG1heF9sYXp5X21hdGNoLCBnb29kX21hdGNoIGFuZCBtYXhfY2hhaW5fbGVuZ3RoLCBkZXBlbmRpbmcgb25cbiAqIHRoZSBkZXNpcmVkIHBhY2sgbGV2ZWwgKDAuLjkpLiBUaGUgdmFsdWVzIGdpdmVuIGJlbG93IGhhdmUgYmVlbiB0dW5lZCB0b1xuICogZXhjbHVkZSB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIGZvciBwYXRob2xvZ2ljYWwgZmlsZXMuIEJldHRlciB2YWx1ZXMgbWF5IGJlXG4gKiBmb3VuZCBmb3Igc3BlY2lmaWMgZmlsZXMuXG4gKi9cbmZ1bmN0aW9uIENvbmZpZyhnb29kX2xlbmd0aCwgbWF4X2xhenksIG5pY2VfbGVuZ3RoLCBtYXhfY2hhaW4sIGZ1bmMpIHtcbiAgdGhpcy5nb29kX2xlbmd0aCA9IGdvb2RfbGVuZ3RoO1xuICB0aGlzLm1heF9sYXp5ID0gbWF4X2xhenk7XG4gIHRoaXMubmljZV9sZW5ndGggPSBuaWNlX2xlbmd0aDtcbiAgdGhpcy5tYXhfY2hhaW4gPSBtYXhfY2hhaW47XG4gIHRoaXMuZnVuYyA9IGZ1bmM7XG59XG5cbnZhciBjb25maWd1cmF0aW9uX3RhYmxlO1xuXG5jb25maWd1cmF0aW9uX3RhYmxlID0gW1xuICAvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovXG4gIG5ldyBDb25maWcoMCwgMCwgMCwgMCwgZGVmbGF0ZV9zdG9yZWQpLCAgICAgICAgICAvKiAwIHN0b3JlIG9ubHkgKi9cbiAgbmV3IENvbmZpZyg0LCA0LCA4LCA0LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgIC8qIDEgbWF4IHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi9cbiAgbmV3IENvbmZpZyg0LCA1LCAxNiwgOCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgIC8qIDIgKi9cbiAgbmV3IENvbmZpZyg0LCA2LCAzMiwgMzIsIGRlZmxhdGVfZmFzdCksICAgICAgICAgIC8qIDMgKi9cblxuICBuZXcgQ29uZmlnKDQsIDQsIDE2LCAxNiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAgLyogNCBsYXp5IG1hdGNoZXMgKi9cbiAgbmV3IENvbmZpZyg4LCAxNiwgMzIsIDMyLCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgIC8qIDUgKi9cbiAgbmV3IENvbmZpZyg4LCAxNiwgMTI4LCAxMjgsIGRlZmxhdGVfc2xvdyksICAgICAgIC8qIDYgKi9cbiAgbmV3IENvbmZpZyg4LCAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvdyksICAgICAgIC8qIDcgKi9cbiAgbmV3IENvbmZpZygzMiwgMTI4LCAyNTgsIDEwMjQsIGRlZmxhdGVfc2xvdyksICAgIC8qIDggKi9cbiAgbmV3IENvbmZpZygzMiwgMjU4LCAyNTgsIDQwOTYsIGRlZmxhdGVfc2xvdykgICAgIC8qIDkgbWF4IGNvbXByZXNzaW9uICovXG5dO1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgXCJsb25nZXN0IG1hdGNoXCIgcm91dGluZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtXG4gKi9cbmZ1bmN0aW9uIGxtX2luaXQocykge1xuICBzLndpbmRvd19zaXplID0gMiAqIHMud19zaXplO1xuXG4gIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqL1xuICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczpcbiAgICovXG4gIHMubWF4X2xhenlfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9sYXp5O1xuICBzLmdvb2RfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmdvb2RfbGVuZ3RoO1xuICBzLm5pY2VfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm5pY2VfbGVuZ3RoO1xuICBzLm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9jaGFpbjtcblxuICBzLnN0cnN0YXJ0ID0gMDtcbiAgcy5ibG9ja19zdGFydCA9IDA7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5pbnNlcnQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHMuaW5zX2ggPSAwO1xufVxuXG5cbmZ1bmN0aW9uIERlZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5zdHJtID0gbnVsbDsgICAgICAgICAgICAvKiBwb2ludGVyIGJhY2sgdG8gdGhpcyB6bGliIHN0cmVhbSAqL1xuICB0aGlzLnN0YXR1cyA9IDA7ICAgICAgICAgICAgLyogYXMgdGhlIG5hbWUgaW1wbGllcyAqL1xuICB0aGlzLnBlbmRpbmdfYnVmID0gbnVsbDsgICAgICAvKiBvdXRwdXQgc3RpbGwgcGVuZGluZyAqL1xuICB0aGlzLnBlbmRpbmdfYnVmX3NpemUgPSAwOyAgLyogc2l6ZSBvZiBwZW5kaW5nX2J1ZiAqL1xuICB0aGlzLnBlbmRpbmdfb3V0ID0gMDsgICAgICAgLyogbmV4dCBwZW5kaW5nIGJ5dGUgdG8gb3V0cHV0IHRvIHRoZSBzdHJlYW0gKi9cbiAgdGhpcy5wZW5kaW5nID0gMDsgICAgICAgICAgIC8qIG5iIG9mIGJ5dGVzIGluIHRoZSBwZW5kaW5nIGJ1ZmZlciAqL1xuICB0aGlzLndyYXAgPSAwOyAgICAgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqL1xuICB0aGlzLmd6aGVhZCA9IG51bGw7ICAgICAgICAgLyogZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gdG8gd3JpdGUgKi9cbiAgdGhpcy5nemluZGV4ID0gMDsgICAgICAgICAgIC8qIHdoZXJlIGluIGV4dHJhLCBuYW1lLCBvciBjb21tZW50ICovXG4gIHRoaXMubWV0aG9kID0gWl9ERUZMQVRFRDsgLyogY2FuIG9ubHkgYmUgREVGTEFURUQgKi9cbiAgdGhpcy5sYXN0X2ZsdXNoID0gLTE7ICAgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqL1xuXG4gIHRoaXMud19zaXplID0gMDsgIC8qIExaNzcgd2luZG93IHNpemUgKDMySyBieSBkZWZhdWx0KSAqL1xuICB0aGlzLndfYml0cyA9IDA7ICAvKiBsb2cyKHdfc2l6ZSkgICg4Li4xNikgKi9cbiAgdGhpcy53X21hc2sgPSAwOyAgLyogd19zaXplIC0gMSAqL1xuXG4gIHRoaXMud2luZG93ID0gbnVsbDtcbiAgLyogU2xpZGluZyB3aW5kb3cuIElucHV0IGJ5dGVzIGFyZSByZWFkIGludG8gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB3aW5kb3csXG4gICAqIGFuZCBtb3ZlIHRvIHRoZSBmaXJzdCBoYWxmIGxhdGVyIHRvIGtlZXAgYSBkaWN0aW9uYXJ5IG9mIGF0IGxlYXN0IHdTaXplXG4gICAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2ZcbiAgICogd1NpemUtTUFYX01BVENIIGJ5dGVzLCBidXQgdGhpcyBlbnN1cmVzIHRoYXQgSU8gaXMgYWx3YXlzXG4gICAqIHBlcmZvcm1lZCB3aXRoIGEgbGVuZ3RoIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLlxuICAgKi9cblxuICB0aGlzLndpbmRvd19zaXplID0gMDtcbiAgLyogQWN0dWFsIHNpemUgb2Ygd2luZG93OiAyKndTaXplLCBleGNlcHQgd2hlbiB0aGUgdXNlciBpbnB1dCBidWZmZXJcbiAgICogaXMgZGlyZWN0bHkgdXNlZCBhcyBzbGlkaW5nIHdpbmRvdy5cbiAgICovXG5cbiAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgLyogTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXNcbiAgICogYXJyYXkgdG8gNjRLLCB0aGlzIGxpbmsgaXMgbWFpbnRhaW5lZCBvbmx5IGZvciB0aGUgbGFzdCAzMksgc3RyaW5ncy5cbiAgICogQW4gaW5kZXggaW4gdGhpcyBhcnJheSBpcyB0aHVzIGEgd2luZG93IGluZGV4IG1vZHVsbyAzMksuXG4gICAqL1xuXG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgLyogSGVhZHMgb2YgdGhlIGhhc2ggY2hhaW5zIG9yIE5JTC4gKi9cblxuICB0aGlzLmluc19oID0gMDsgICAgICAgLyogaGFzaCBpbmRleCBvZiBzdHJpbmcgdG8gYmUgaW5zZXJ0ZWQgKi9cbiAgdGhpcy5oYXNoX3NpemUgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBoYXNoIHRhYmxlICovXG4gIHRoaXMuaGFzaF9iaXRzID0gMDsgICAvKiBsb2cyKGhhc2hfc2l6ZSkgKi9cbiAgdGhpcy5oYXNoX21hc2sgPSAwOyAgIC8qIGhhc2hfc2l6ZS0xICovXG5cbiAgdGhpcy5oYXNoX3NoaWZ0ID0gMDtcbiAgLyogTnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggaW5zX2ggbXVzdCBiZSBzaGlmdGVkIGF0IGVhY2ggaW5wdXRcbiAgICogc3RlcC4gSXQgbXVzdCBiZSBzdWNoIHRoYXQgYWZ0ZXIgTUlOX01BVENIIHN0ZXBzLCB0aGUgb2xkZXN0XG4gICAqIGJ5dGUgbm8gbG9uZ2VyIHRha2VzIHBhcnQgaW4gdGhlIGhhc2gga2V5LCB0aGF0IGlzOlxuICAgKiAgIGhhc2hfc2hpZnQgKiBNSU5fTUFUQ0ggPj0gaGFzaF9iaXRzXG4gICAqL1xuXG4gIHRoaXMuYmxvY2tfc3RhcnQgPSAwO1xuICAvKiBXaW5kb3cgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBvdXRwdXQgYmxvY2suIEdldHNcbiAgICogbmVnYXRpdmUgd2hlbiB0aGUgd2luZG93IGlzIG1vdmVkIGJhY2t3YXJkcy5cbiAgICovXG5cbiAgdGhpcy5tYXRjaF9sZW5ndGggPSAwOyAgICAgIC8qIGxlbmd0aCBvZiBiZXN0IG1hdGNoICovXG4gIHRoaXMucHJldl9tYXRjaCA9IDA7ICAgICAgICAvKiBwcmV2aW91cyBtYXRjaCAqL1xuICB0aGlzLm1hdGNoX2F2YWlsYWJsZSA9IDA7ICAgLyogc2V0IGlmIHByZXZpb3VzIG1hdGNoIGV4aXN0cyAqL1xuICB0aGlzLnN0cnN0YXJ0ID0gMDsgICAgICAgICAgLyogc3RhcnQgb2Ygc3RyaW5nIHRvIGluc2VydCAqL1xuICB0aGlzLm1hdGNoX3N0YXJ0ID0gMDsgICAgICAgLyogc3RhcnQgb2YgbWF0Y2hpbmcgc3RyaW5nICovXG4gIHRoaXMubG9va2FoZWFkID0gMDsgICAgICAgICAvKiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgYWhlYWQgaW4gd2luZG93ICovXG5cbiAgdGhpcy5wcmV2X2xlbmd0aCA9IDA7XG4gIC8qIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpc1xuICAgKiBhcmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbi5cbiAgICovXG5cbiAgdGhpcy5tYXhfY2hhaW5fbGVuZ3RoID0gMDtcbiAgLyogVG8gc3BlZWQgdXAgZGVmbGF0aW9uLCBoYXNoIGNoYWlucyBhcmUgbmV2ZXIgc2VhcmNoZWQgYmV5b25kIHRoaXNcbiAgICogbGVuZ3RoLiAgQSBoaWdoZXIgbGltaXQgaW1wcm92ZXMgY29tcHJlc3Npb24gcmF0aW8gYnV0IGRlZ3JhZGVzIHRoZVxuICAgKiBzcGVlZC5cbiAgICovXG5cbiAgdGhpcy5tYXhfbGF6eV9tYXRjaCA9IDA7XG4gIC8qIEF0dGVtcHQgdG8gZmluZCBhIGJldHRlciBtYXRjaCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2ggaXMgc3RyaWN0bHlcbiAgICogc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb25cbiAgICogbGV2ZWxzID49IDQuXG4gICAqL1xuICAvLyBUaGF0J3MgYWxpYXMgdG8gbWF4X2xhenlfbWF0Y2gsIGRvbid0IHVzZSBkaXJlY3RseVxuICAvL3RoaXMubWF4X2luc2VydF9sZW5ndGggPSAwO1xuICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdFxuICAgKiBncmVhdGVyIHRoYW4gdGhpcyBsZW5ndGguIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uXG4gICAqIG1heF9pbnNlcnRfbGVuZ3RoIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDw9IDMuXG4gICAqL1xuXG4gIHRoaXMubGV2ZWwgPSAwOyAgICAgLyogY29tcHJlc3Npb24gbGV2ZWwgKDEuLjkpICovXG4gIHRoaXMuc3RyYXRlZ3kgPSAwOyAgLyogZmF2b3Igb3IgZm9yY2UgSHVmZm1hbiBjb2RpbmcqL1xuXG4gIHRoaXMuZ29vZF9tYXRjaCA9IDA7XG4gIC8qIFVzZSBhIGZhc3RlciBzZWFyY2ggd2hlbiB0aGUgcHJldmlvdXMgbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhpcyAqL1xuXG4gIHRoaXMubmljZV9tYXRjaCA9IDA7IC8qIFN0b3Agc2VhcmNoaW5nIHdoZW4gY3VycmVudCBtYXRjaCBleGNlZWRzIHRoaXMgKi9cblxuICAgICAgICAgICAgICAvKiB1c2VkIGJ5IHRyZWVzLmM6ICovXG5cbiAgLyogRGlkbid0IHVzZSBjdF9kYXRhIHR5cGVkZWYgYmVsb3cgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZyAqL1xuXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2x0cmVlW0hFQVBfU0laRV07ICAgLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgYmxfdHJlZVsyKkJMX0NPREVTKzFdOyAgLyogSHVmZm1hbiB0cmVlIGZvciBiaXQgbGVuZ3RocyAqL1xuXG4gIC8vIFVzZSBmbGF0IGFycmF5IG9mIERPVUJMRSBzaXplLCB3aXRoIGludGVybGVhdmVkIGZhdGEsXG4gIC8vIGJlY2F1c2UgSlMgZG9lcyBub3Qgc3VwcG9ydCBlZmZlY3RpdmVcbiAgdGhpcy5keW5fbHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KEhFQVBfU0laRSAqIDIpO1xuICB0aGlzLmR5bl9kdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBEX0NPREVTICsgMSkgKiAyKTtcbiAgdGhpcy5ibF90cmVlICAgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogQkxfQ09ERVMgKyAxKSAqIDIpO1xuICB6ZXJvKHRoaXMuZHluX2x0cmVlKTtcbiAgemVybyh0aGlzLmR5bl9kdHJlZSk7XG4gIHplcm8odGhpcy5ibF90cmVlKTtcblxuICB0aGlzLmxfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgbGl0ZXJhbCB0cmVlICovXG4gIHRoaXMuZF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBkaXN0YW5jZSB0cmVlICovXG4gIHRoaXMuYmxfZGVzYyAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBiaXQgbGVuZ3RoIHRyZWUgKi9cblxuICAvL3VzaCBibF9jb3VudFtNQVhfQklUUysxXTtcbiAgdGhpcy5ibF9jb3VudCA9IG5ldyB1dGlscy5CdWYxNihNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvL2ludCBoZWFwWzIqTF9DT0RFUysxXTsgICAgICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi9cbiAgdGhpcy5oZWFwID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7ICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi9cbiAgemVybyh0aGlzLmhlYXApO1xuXG4gIHRoaXMuaGVhcF9sZW4gPSAwOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaGVhcCAqL1xuICB0aGlzLmhlYXBfbWF4ID0gMDsgICAgICAgICAgICAgICAvKiBlbGVtZW50IG9mIGxhcmdlc3QgZnJlcXVlbmN5ICovXG4gIC8qIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uIGhlYXBbMF0gaXMgbm90IHVzZWQuXG4gICAqIFRoZSBzYW1lIGhlYXAgYXJyYXkgaXMgdXNlZCB0byBidWlsZCBhbGwgdHJlZXMuXG4gICAqL1xuXG4gIHRoaXMuZGVwdGggPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgLy91Y2ggZGVwdGhbMipMX0NPREVTKzFdO1xuICB6ZXJvKHRoaXMuZGVwdGgpO1xuICAvKiBEZXB0aCBvZiBlYWNoIHN1YnRyZWUgdXNlZCBhcyB0aWUgYnJlYWtlciBmb3IgdHJlZXMgb2YgZXF1YWwgZnJlcXVlbmN5XG4gICAqL1xuXG4gIHRoaXMubF9idWYgPSAwOyAgICAgICAgICAvKiBidWZmZXIgaW5kZXggZm9yIGxpdGVyYWxzIG9yIGxlbmd0aHMgKi9cblxuICB0aGlzLmxpdF9idWZzaXplID0gMDtcbiAgLyogU2l6ZSBvZiBtYXRjaCBidWZmZXIgZm9yIGxpdGVyYWxzL2xlbmd0aHMuICBUaGVyZSBhcmUgNCByZWFzb25zIGZvclxuICAgKiBsaW1pdGluZyBsaXRfYnVmc2l6ZSB0byA2NEs6XG4gICAqICAgLSBmcmVxdWVuY2llcyBjYW4gYmUga2VwdCBpbiAxNiBiaXQgY291bnRlcnNcbiAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciB0aGUgZmlyc3QgYmxvY2ssIGFsbCBpbnB1dFxuICAgKiAgICAgZGF0YSBpcyBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW5cbiAgICogICAgIHdoZW4gaW5wdXQgY29tZXMgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yXG4gICAqICAgICBhbGwgYmxvY2tzIGlmIGxpdF9idWZzaXplIGlzIG5vdCBncmVhdGVyIHRoYW4gMzJLLilcbiAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuXG4gICAqICAgICBldmVuIGVtaXQgYSBzdG9yZWQgZmlsZSBpbnN0ZWFkIG9mIGEgc3RvcmVkIGJsb2NrIChzYXZpbmcgNSBieXRlcykuXG4gICAqICAgICBUaGlzIGlzIGFwcGxpY2FibGUgb25seSBmb3IgemlwIChub3QgZ3ppcCBvciB6bGliKS5cbiAgICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdFxuICAgKiAgICAgYWRhcHRhdGlvbiB0byBjaGFuZ2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvclxuICAgKiAgICAgZXhhbXBsZSBhIGJpbmFyeSBmaWxlIHdpdGggcG9vcmx5IGNvbXByZXNzaWJsZSBjb2RlIGZvbGxvd2VkIGJ5XG4gICAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZmZXIgc2l6ZXMgZ2l2ZVxuICAgKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nXG4gICAqICAgICB0cmVlcyBtb3JlIGZyZXF1ZW50bHkuXG4gICAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDRcbiAgICovXG5cbiAgdGhpcy5sYXN0X2xpdCA9IDA7ICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqL1xuXG4gIHRoaXMuZF9idWYgPSAwO1xuICAvKiBCdWZmZXIgaW5kZXggZm9yIGRpc3RhbmNlcy4gVG8gc2ltcGxpZnkgdGhlIGNvZGUsIGRfYnVmIGFuZCBsX2J1ZiBoYXZlXG4gICAqIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy4gVG8gdXNlIGRpZmZlcmVudCBsZW5ndGhzLCBhbiBleHRyYSBmbGFnXG4gICAqIGFycmF5IHdvdWxkIGJlIG5lY2Vzc2FyeS5cbiAgICovXG5cbiAgdGhpcy5vcHRfbGVuID0gMDsgICAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggb3B0aW1hbCB0cmVlcyAqL1xuICB0aGlzLnN0YXRpY19sZW4gPSAwOyAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBzdGF0aWMgdHJlZXMgKi9cbiAgdGhpcy5tYXRjaGVzID0gMDsgICAgICAgLyogbnVtYmVyIG9mIHN0cmluZyBtYXRjaGVzIGluIGN1cnJlbnQgYmxvY2sgKi9cbiAgdGhpcy5pbnNlcnQgPSAwOyAgICAgICAgLyogYnl0ZXMgYXQgZW5kIG9mIHdpbmRvdyBsZWZ0IHRvIGluc2VydCAqL1xuXG5cbiAgdGhpcy5iaV9idWYgPSAwO1xuICAvKiBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdFxuICAgKiBzaWduaWZpY2FudCBiaXRzKS5cbiAgICovXG4gIHRoaXMuYmlfdmFsaWQgPSAwO1xuICAvKiBOdW1iZXIgb2YgdmFsaWQgYml0cyBpbiBiaV9idWYuICBBbGwgYml0cyBhYm92ZSB0aGUgbGFzdCB2YWxpZCBiaXRcbiAgICogYXJlIGFsd2F5cyB6ZXJvLlxuICAgKi9cblxuICAvLyBVc2VkIGZvciB3aW5kb3cgbWVtb3J5IGluaXQuIFdlIHNhZmVseSBpZ25vcmUgaXQgZm9yIEpTLiBUaGF0IG1ha2VzXG4gIC8vIHNlbnNlIG9ubHkgZm9yIHBvaW50ZXJzIGFuZCBtZW1vcnkgY2hlY2sgdG9vbHMuXG4gIC8vdGhpcy5oaWdoX3dhdGVyID0gMDtcbiAgLyogSGlnaCB3YXRlciBtYXJrIG9mZnNldCBpbiB3aW5kb3cgZm9yIGluaXRpYWxpemVkIGJ5dGVzIC0tIGJ5dGVzIGFib3ZlXG4gICAqIHRoaXMgYXJlIHNldCB0byB6ZXJvIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayB3YXJuaW5ncyB3aGVuXG4gICAqIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMgYWNjZXNzIGJ5dGVzIHBhc3QgdGhlIGlucHV0LiAgVGhpcyBpcyB0aGVuXG4gICAqIHVwZGF0ZWQgdG8gdGhlIG5ldyBoaWdoIHdhdGVyIG1hcmsuXG4gICAqL1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldEtlZXAoc3RybSkge1xuICB2YXIgcztcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG4gIHN0cm0udG90YWxfaW4gPSBzdHJtLnRvdGFsX291dCA9IDA7XG4gIHN0cm0uZGF0YV90eXBlID0gWl9VTktOT1dOO1xuXG4gIHMgPSBzdHJtLnN0YXRlO1xuICBzLnBlbmRpbmcgPSAwO1xuICBzLnBlbmRpbmdfb3V0ID0gMDtcblxuICBpZiAocy53cmFwIDwgMCkge1xuICAgIHMud3JhcCA9IC1zLndyYXA7XG4gICAgLyogd2FzIG1hZGUgbmVnYXRpdmUgYnkgZGVmbGF0ZSguLi4sIFpfRklOSVNIKTsgKi9cbiAgfVxuICBzLnN0YXR1cyA9IChzLndyYXAgPyBJTklUX1NUQVRFIDogQlVTWV9TVEFURSk7XG4gIHN0cm0uYWRsZXIgPSAocy53cmFwID09PSAyKSA/XG4gICAgMCAgLy8gY3JjMzIoMCwgWl9OVUxMLCAwKVxuICA6XG4gICAgMTsgLy8gYWRsZXIzMigwLCBaX05VTEwsIDApXG4gIHMubGFzdF9mbHVzaCA9IFpfTk9fRkxVU0g7XG4gIHRyZWVzLl90cl9pbml0KHMpO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgcmV0ID0gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKTtcbiAgaWYgKHJldCA9PT0gWl9PSykge1xuICAgIGxtX2luaXQoc3RybS5zdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlU2V0SGVhZGVyKHN0cm0sIGhlYWQpIHtcbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBpZiAoc3RybS5zdGF0ZS53cmFwICE9PSAyKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdHJtLnN0YXRlLmd6aGVhZCA9IGhlYWQ7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpIHtcbiAgaWYgKCFzdHJtKSB7IC8vID09PSBaX05VTExcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cbiAgdmFyIHdyYXAgPSAxO1xuXG4gIGlmIChsZXZlbCA9PT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSB7XG4gICAgbGV2ZWwgPSA2O1xuICB9XG5cbiAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7IC8qIHN1cHByZXNzIHpsaWIgd3JhcHBlciAqL1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKHdpbmRvd0JpdHMgPiAxNSkge1xuICAgIHdyYXAgPSAyOyAgICAgICAgICAgLyogd3JpdGUgZ3ppcCB3cmFwcGVyIGluc3RlYWQgKi9cbiAgICB3aW5kb3dCaXRzIC09IDE2O1xuICB9XG5cblxuICBpZiAobWVtTGV2ZWwgPCAxIHx8IG1lbUxldmVsID4gTUFYX01FTV9MRVZFTCB8fCBtZXRob2QgIT09IFpfREVGTEFURUQgfHxcbiAgICB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUgfHwgbGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fFxuICAgIHN0cmF0ZWd5IDwgMCB8fCBzdHJhdGVneSA+IFpfRklYRUQpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG5cbiAgaWYgKHdpbmRvd0JpdHMgPT09IDgpIHtcbiAgICB3aW5kb3dCaXRzID0gOTtcbiAgfVxuICAvKiB1bnRpbCAyNTYtYnl0ZSB3aW5kb3cgYnVnIGZpeGVkICovXG5cbiAgdmFyIHMgPSBuZXcgRGVmbGF0ZVN0YXRlKCk7XG5cbiAgc3RybS5zdGF0ZSA9IHM7XG4gIHMuc3RybSA9IHN0cm07XG5cbiAgcy53cmFwID0gd3JhcDtcbiAgcy5nemhlYWQgPSBudWxsO1xuICBzLndfYml0cyA9IHdpbmRvd0JpdHM7XG4gIHMud19zaXplID0gMSA8PCBzLndfYml0cztcbiAgcy53X21hc2sgPSBzLndfc2l6ZSAtIDE7XG5cbiAgcy5oYXNoX2JpdHMgPSBtZW1MZXZlbCArIDc7XG4gIHMuaGFzaF9zaXplID0gMSA8PCBzLmhhc2hfYml0cztcbiAgcy5oYXNoX21hc2sgPSBzLmhhc2hfc2l6ZSAtIDE7XG4gIHMuaGFzaF9zaGlmdCA9IH5+KChzLmhhc2hfYml0cyArIE1JTl9NQVRDSCAtIDEpIC8gTUlOX01BVENIKTtcblxuICBzLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplICogMik7XG4gIHMuaGVhZCA9IG5ldyB1dGlscy5CdWYxNihzLmhhc2hfc2l6ZSk7XG4gIHMucHJldiA9IG5ldyB1dGlscy5CdWYxNihzLndfc2l6ZSk7XG5cbiAgLy8gRG9uJ3QgbmVlZCBtZW0gaW5pdCBtYWdpYyBmb3IgSlMuXG4gIC8vcy5oaWdoX3dhdGVyID0gMDsgIC8qIG5vdGhpbmcgd3JpdHRlbiB0byBzLT53aW5kb3cgeWV0ICovXG5cbiAgcy5saXRfYnVmc2l6ZSA9IDEgPDwgKG1lbUxldmVsICsgNik7IC8qIDE2SyBlbGVtZW50cyBieSBkZWZhdWx0ICovXG5cbiAgcy5wZW5kaW5nX2J1Zl9zaXplID0gcy5saXRfYnVmc2l6ZSAqIDQ7XG5cbiAgLy9vdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKHN0cm0sIHMtPmxpdF9idWZzaXplLCBzaXplb2YodXNoKSsyKTtcbiAgLy9zLT5wZW5kaW5nX2J1ZiA9ICh1Y2hmICopIG92ZXJsYXk7XG4gIHMucGVuZGluZ19idWYgPSBuZXcgdXRpbHMuQnVmOChzLnBlbmRpbmdfYnVmX3NpemUpO1xuXG4gIC8vIEl0IGlzIG9mZnNldCBmcm9tIGBzLnBlbmRpbmdfYnVmYCAoc2l6ZSBpcyBgcy5saXRfYnVmc2l6ZSAqIDJgKVxuICAvL3MtPmRfYnVmID0gb3ZlcmxheSArIHMtPmxpdF9idWZzaXplL3NpemVvZih1c2gpO1xuICBzLmRfYnVmID0gMSAqIHMubGl0X2J1ZnNpemU7XG5cbiAgLy9zLT5sX2J1ZiA9IHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKnMtPmxpdF9idWZzaXplO1xuICBzLmxfYnVmID0gKDEgKyAyKSAqIHMubGl0X2J1ZnNpemU7XG5cbiAgcy5sZXZlbCA9IGxldmVsO1xuICBzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gIHMubWV0aG9kID0gbWV0aG9kO1xuXG4gIHJldHVybiBkZWZsYXRlUmVzZXQoc3RybSk7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVJbml0KHN0cm0sIGxldmVsKSB7XG4gIHJldHVybiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIE1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZKTtcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBvbGRfZmx1c2gsIHM7XG4gIHZhciBiZWcsIHZhbDsgLy8gZm9yIGd6aXAgaGVhZGVyIHdyaXRlIG9ubHlcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHxcbiAgICBmbHVzaCA+IFpfQkxPQ0sgfHwgZmx1c2ggPCAwKSB7XG4gICAgcmV0dXJuIHN0cm0gPyBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpIDogWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzID0gc3RybS5zdGF0ZTtcblxuICBpZiAoIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkgfHxcbiAgICAgIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIGZsdXNoICE9PSBaX0ZJTklTSCkpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIChzdHJtLmF2YWlsX291dCA9PT0gMCkgPyBaX0JVRl9FUlJPUiA6IFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG4gIHMuc3RybSA9IHN0cm07IC8qIGp1c3QgaW4gY2FzZSAqL1xuICBvbGRfZmx1c2ggPSBzLmxhc3RfZmx1c2g7XG4gIHMubGFzdF9mbHVzaCA9IGZsdXNoO1xuXG4gIC8qIFdyaXRlIHRoZSBoZWFkZXIgKi9cbiAgaWYgKHMuc3RhdHVzID09PSBJTklUX1NUQVRFKSB7XG5cbiAgICBpZiAocy53cmFwID09PSAyKSB7IC8vIEdaSVAgaGVhZGVyXG4gICAgICBzdHJtLmFkbGVyID0gMDsgIC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICBwdXRfYnl0ZShzLCAzMSk7XG4gICAgICBwdXRfYnl0ZShzLCAxMzkpO1xuICAgICAgcHV0X2J5dGUocywgOCk7XG4gICAgICBpZiAoIXMuZ3poZWFkKSB7IC8vIHMtPmd6aGVhZCA9PSBaX05VTExcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID9cbiAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICAgIHB1dF9ieXRlKHMsIE9TX0NPREUpO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRleHQgPyAxIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAocy5nemhlYWQuaGNyYyA/IDIgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuZXh0cmEgPyAwIDogNCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLm5hbWUgPyAwIDogOCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmNvbW1lbnQgPyAwIDogMTYpXG4gICAgICAgICk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMTYpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDI0KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID9cbiAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLm9zICYgMHhmZik7XG4gICAgICAgIGlmIChzLmd6aGVhZC5leHRyYSAmJiBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmKTtcbiAgICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQuZXh0cmEubGVuZ3RoID4+IDgpICYgMHhmZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IEVYVFJBX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIC8vIERFRkxBVEUgaGVhZGVyXG4gICAge1xuICAgICAgdmFyIGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLndfYml0cyAtIDgpIDw8IDQpKSA8PCA4O1xuICAgICAgdmFyIGxldmVsX2ZsYWdzID0gLTE7XG5cbiAgICAgIGlmIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyKSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsID09PSA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMztcbiAgICAgIH1cbiAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7XG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgeyBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7IH1cbiAgICAgIGhlYWRlciArPSAzMSAtIChoZWFkZXIgJSAzMSk7XG5cbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7XG5cbiAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqL1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSAxOyAvLyBhZGxlcjMyKDBMLCBaX05VTEwsIDApO1xuICAgIH1cbiAgfVxuXG4vLyNpZmRlZiBHWklQXG4gIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuZXh0cmEvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuXG4gICAgICB3aGlsZSAocy5nemluZGV4IDwgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmZmZikpIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYVtzLmd6aW5kZXhdICYgMHhmZik7XG4gICAgICAgIHMuZ3ppbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAocy5nemluZGV4ID09PSBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBOQU1FX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLm5hbWUvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5uYW1lLmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IENPTU1FTlRfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuY29tbWVudC8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gSENSQ19TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgfVxuICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgc3RybS5hZGxlciA9IDA7IC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgfVxuICB9XG4vLyNlbmRpZlxuXG4gIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi9cbiAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAvKiBTaW5jZSBhdmFpbF9vdXQgaXMgMCwgZGVmbGF0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoXG4gICAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZFxuICAgICAgICogYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sXG4gICAgICAgKiBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3Igc2l0dWF0aW9uIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOlxuICAgICAgICovXG4gICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgIHJldHVybiBaX09LO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZVxuICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwXG4gICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLlxuICAgICAqL1xuICB9IGVsc2UgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgcmFuayhmbHVzaCkgPD0gcmFuayhvbGRfZmx1c2gpICYmXG4gICAgZmx1c2ggIT09IFpfRklOSVNIKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqL1xuICBpZiAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuXG4gICAqL1xuICBpZiAoc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLmxvb2thaGVhZCAhPT0gMCB8fFxuICAgIChmbHVzaCAhPT0gWl9OT19GTFVTSCAmJiBzLnN0YXR1cyAhPT0gRklOSVNIX1NUQVRFKSkge1xuICAgIHZhciBic3RhdGUgPSAocy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkpID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6XG4gICAgICAocy5zdHJhdGVneSA9PT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOlxuICAgICAgICBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpKTtcblxuICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHtcbiAgICAgIHMuc3RhdHVzID0gRklOSVNIX1NUQVRFO1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBaX09LO1xuICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbFxuICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmVcbiAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhblxuICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc29cbiAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdFxuICAgICAgICogb25lIGVtcHR5IGJsb2NrLlxuICAgICAgICovXG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHtcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9QQVJUSUFMX0ZMVVNIKSB7XG4gICAgICAgIHRyZWVzLl90cl9hbGlnbihzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGZsdXNoICE9PSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqL1xuXG4gICAgICAgIHRyZWVzLl90cl9zdG9yZWRfYmxvY2socywgMCwgMCwgZmFsc2UpO1xuICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZFxuICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0ZVTExfRkxVU0gpIHtcbiAgICAgICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi8gICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi9cbiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICAgICAgICBzLmluc2VydCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsIFwiYnVnMlwiKTtcbiAgLy9pZiAoc3RybS5hdmFpbF9vdXQgPD0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJidWcyXCIpO31cblxuICBpZiAoZmx1c2ggIT09IFpfRklOSVNIKSB7IHJldHVybiBaX09LOyB9XG4gIGlmIChzLndyYXAgPD0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRU5EOyB9XG5cbiAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi9cbiAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDI0KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgfVxuXG4gIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW5cbiAgICogdG8gZmx1c2ggdGhlIHJlc3QuXG4gICAqL1xuICBpZiAocy53cmFwID4gMCkgeyBzLndyYXAgPSAtcy53cmFwOyB9XG4gIC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi9cbiAgcmV0dXJuIHMucGVuZGluZyAhPT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkge1xuICB2YXIgc3RhdHVzO1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdHVzID0gc3RybS5zdGF0ZS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IElOSVRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBOQU1FX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBCVVNZX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBGSU5JU0hfU1RBVEVcbiAgKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnN0YXRlID0gbnVsbDtcblxuICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUikgOiBaX09LO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGVcbiAqIHNlcXVlbmNlIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzO1xuICB2YXIgc3RyLCBuO1xuICB2YXIgd3JhcDtcbiAgdmFyIGF2YWlsO1xuICB2YXIgbmV4dDtcbiAgdmFyIGlucHV0O1xuICB2YXIgdG1wRGljdDtcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuICB3cmFwID0gcy53cmFwO1xuXG4gIGlmICh3cmFwID09PSAyIHx8ICh3cmFwID09PSAxICYmIHMuc3RhdHVzICE9PSBJTklUX1NUQVRFKSB8fCBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIHdoZW4gdXNpbmcgemxpYiB3cmFwcGVycywgY29tcHV0ZSBBZGxlci0zMiBmb3IgcHJvdmlkZWQgZGljdGlvbmFyeSAqL1xuICBpZiAod3JhcCA9PT0gMSkge1xuICAgIC8qIGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICB9XG5cbiAgcy53cmFwID0gMDsgICAvKiBhdm9pZCBjb21wdXRpbmcgQWRsZXItMzIgaW4gcmVhZF9idWYgKi9cblxuICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi9cbiAgaWYgKGRpY3RMZW5ndGggPj0gcy53X3NpemUpIHtcbiAgICBpZiAod3JhcCA9PT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovXG4gICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcbiAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICBzLmluc2VydCA9IDA7XG4gICAgfVxuICAgIC8qIHVzZSB0aGUgdGFpbCAqL1xuICAgIC8vIGRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5LnNsaWNlKGRpY3RMZW5ndGggLSBzLndfc2l6ZSk7XG4gICAgdG1wRGljdCA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplKTtcbiAgICB1dGlscy5hcnJheVNldCh0bXBEaWN0LCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoIC0gcy53X3NpemUsIHMud19zaXplLCAwKTtcbiAgICBkaWN0aW9uYXJ5ID0gdG1wRGljdDtcbiAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7XG4gIH1cbiAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi9cbiAgYXZhaWwgPSBzdHJtLmF2YWlsX2luO1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBkaWN0TGVuZ3RoO1xuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmlucHV0ID0gZGljdGlvbmFyeTtcbiAgZmlsbF93aW5kb3cocyk7XG4gIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICBzdHIgPSBzLnN0cnN0YXJ0O1xuICAgIG4gPSBzLmxvb2thaGVhZCAtIChNSU5fTUFUQ0ggLSAxKTtcbiAgICBkbyB7XG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcblxuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgc3RyKys7XG4gICAgfSB3aGlsZSAoLS1uKTtcbiAgICBzLnN0cnN0YXJ0ID0gc3RyO1xuICAgIHMubG9va2FoZWFkID0gTUlOX01BVENIIC0gMTtcbiAgICBmaWxsX3dpbmRvdyhzKTtcbiAgfVxuICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgcy5pbnNlcnQgPSBzLmxvb2thaGVhZDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uaW5wdXQgPSBpbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGF2YWlsO1xuICBzLndyYXAgPSB3cmFwO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5leHBvcnRzLmRlZmxhdGVJbml0ID0gZGVmbGF0ZUluaXQ7XG5leHBvcnRzLmRlZmxhdGVJbml0MiA9IGRlZmxhdGVJbml0MjtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0ID0gZGVmbGF0ZVJlc2V0O1xuZXhwb3J0cy5kZWZsYXRlUmVzZXRLZWVwID0gZGVmbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuZGVmbGF0ZVNldEhlYWRlciA9IGRlZmxhdGVTZXRIZWFkZXI7XG5leHBvcnRzLmRlZmxhdGUgPSBkZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlRW5kID0gZGVmbGF0ZUVuZDtcbmV4cG9ydHMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuZGVmbGF0ZUluZm8gPSAncGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5kZWZsYXRlQm91bmQgPSBkZWZsYXRlQm91bmQ7XG5leHBvcnRzLmRlZmxhdGVDb3B5ID0gZGVmbGF0ZUNvcHk7XG5leHBvcnRzLmRlZmxhdGVQYXJhbXMgPSBkZWZsYXRlUGFyYW1zO1xuZXhwb3J0cy5kZWZsYXRlUGVuZGluZyA9IGRlZmxhdGVQZW5kaW5nO1xuZXhwb3J0cy5kZWZsYXRlUHJpbWUgPSBkZWZsYXRlUHJpbWU7XG5leHBvcnRzLmRlZmxhdGVUdW5lID0gZGVmbGF0ZVR1bmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIEdaaGVhZGVyKCkge1xuICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovXG4gIHRoaXMudGV4dCAgICAgICA9IDA7XG4gIC8qIG1vZGlmaWNhdGlvbiB0aW1lICovXG4gIHRoaXMudGltZSAgICAgICA9IDA7XG4gIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMueGZsYWdzICAgICA9IDA7XG4gIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi9cbiAgdGhpcy5vcyAgICAgICAgID0gMDtcbiAgLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqL1xuICB0aGlzLmV4dHJhICAgICAgPSBudWxsO1xuICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi9cbiAgdGhpcy5leHRyYV9sZW4gID0gMDsgLy8gQWN0dWFsbHksIHdlIGRvbid0IG5lZWQgaXQgaW4gSlMsXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSBmb3IgZmV3IGNvZGUgbW9kaWZpY2F0aW9uc1xuXG4gIC8vXG4gIC8vIFNldHVwIGxpbWl0cyBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnlcbiAgLy8gZm9yIGluZmxhdGUgdXNlIGNvbnN0YW50IGxpbWl0IGluIDY1NTM2IGJ5dGVzXG4gIC8vXG5cbiAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5leHRyYV9tYXggID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqL1xuICB0aGlzLm5hbWUgICAgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLm5hbWVfbWF4ICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqL1xuICB0aGlzLmNvbW1lbnQgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmNvbW1fbWF4ICAgPSAwO1xuICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqL1xuICB0aGlzLmhjcmMgICAgICAgPSAwO1xuICAvKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMuZG9uZSAgICAgICA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdaaGVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFNlZSBzdGF0ZSBkZWZzIGZyb20gaW5mbGF0ZS5qc1xudmFyIEJBRCA9IDMwOyAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cblxuLypcbiAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmdcbiAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpc1xuICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC5cbiAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3JcbiAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGVcbiAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLlxuXG4gICBFbnRyeSBhc3N1bXB0aW9uczpcblxuICAgICAgICBzdGF0ZS5tb2RlID09PSBMRU5cbiAgICAgICAgc3RybS5hdmFpbF9pbiA+PSA2XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID49IDI1OFxuICAgICAgICBzdGFydCA+PSBzdHJtLmF2YWlsX291dFxuICAgICAgICBzdGF0ZS5iaXRzIDwgOFxuXG4gICBPbiByZXR1cm4sIHN0YXRlLm1vZGUgaXMgb25lIG9mOlxuXG4gICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dFxuICAgICAgICBUWVBFIC0tIHJlYWNoZWQgZW5kIG9mIGJsb2NrIGNvZGUsIGluZmxhdGUoKSB0byBpbnRlcnByZXQgbmV4dCBibG9ja1xuICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YVxuXG4gICBOb3RlczpcblxuICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlXG4gICAgICBsZW5ndGggY29kZSwgNSBiaXRzIGZvciB0aGUgbGVuZ3RoIGV4dHJhLCAxNSBiaXRzIGZvciB0aGUgZGlzdGFuY2UgY29kZSxcbiAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuXG4gICAgICBUaGVyZWZvcmUgaWYgc3RybS5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZFxuICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy5cblxuICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OFxuICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpXG4gICAgICByZXF1aXJlcyBzdHJtLmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3JcbiAgICAgIG91dHB1dCBzcGFjZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgX2luOyAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5pbnB1dCAqL1xuICB2YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogaGF2ZSBlbm91Z2ggaW5wdXQgd2hpbGUgaW4gPCBsYXN0ICovXG4gIHZhciBfb3V0OyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgYmVnOyAgICAgICAgICAgICAgICAgICAgLyogaW5mbGF0ZSgpJ3MgaW5pdGlhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovXG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICB2YXIgZG1heDsgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovXG4vLyNlbmRpZlxuICB2YXIgd3NpemU7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHZhciB3aGF2ZTsgICAgICAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHZhciB3bmV4dDsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgLy8gVXNlIGBzX3dpbmRvd2AgaW5zdGVhZCBgd2luZG93YCwgYXZvaWQgY29uZmxpY3Qgd2l0aCBpbnN0cnVtZW50YXRpb24gdG9vbHNcbiAgdmFyIHNfd2luZG93OyAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5ob2xkICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmJpdHMgKi9cbiAgdmFyIGxjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ubGVuY29kZSAqL1xuICB2YXIgZGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5kaXN0Y29kZSAqL1xuICB2YXIgbG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovXG4gIHZhciBkbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuICB2YXIgaGVyZTsgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovXG4gIHZhciBvcDsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB3aW5kb3cgcG9zaXRpb24sIHdpbmRvdyBieXRlcyB0byBjb3B5ICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqL1xuICB2YXIgZGlzdDsgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG5cblxuICB2YXIgaW5wdXQsIG91dHB1dDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuXG4gIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovXG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgLy9oZXJlID0gc3RhdGUuaGVyZTtcbiAgX2luID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGxhc3QgPSBfaW4gKyAoc3RybS5hdmFpbF9pbiAtIDUpO1xuICBfb3V0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGJlZyA9IF9vdXQgLSAoc3RhcnQgLSBzdHJtLmF2YWlsX291dCk7XG4gIGVuZCA9IF9vdXQgKyAoc3RybS5hdmFpbF9vdXQgLSAyNTcpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgZG1heCA9IHN0YXRlLmRtYXg7XG4vLyNlbmRpZlxuICB3c2l6ZSA9IHN0YXRlLndzaXplO1xuICB3aGF2ZSA9IHN0YXRlLndoYXZlO1xuICB3bmV4dCA9IHN0YXRlLnduZXh0O1xuICBzX3dpbmRvdyA9IHN0YXRlLndpbmRvdztcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICBsY29kZSA9IHN0YXRlLmxlbmNvZGU7XG4gIGRjb2RlID0gc3RhdGUuZGlzdGNvZGU7XG4gIGxtYXNrID0gKDEgPDwgc3RhdGUubGVuYml0cykgLSAxO1xuICBkbWFzayA9ICgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDE7XG5cblxuICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2hcbiAgICAgaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgKi9cblxuICB0b3A6XG4gIGRvIHtcbiAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICB9XG5cbiAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTtcblxuICAgIGRvbGVuOlxuICAgIGZvciAoOzspIHsgLy8gR290byBlbXVsYXRpb25cbiAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgYml0cyAtPSBvcDtcbiAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcbiAgICAgIGlmIChvcCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgP1xuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxcblwiLCBoZXJlLnZhbCkpO1xuICAgICAgICBvdXRwdXRbX291dCsrXSA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi9cbiAgICAgICAgbGVuID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgaWYgKG9wKSB7XG4gICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgbGVuKSk7XG4gICAgICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTtcblxuICAgICAgICBkb2Rpc3Q6XG4gICAgICAgIGZvciAoOzspIHsgLy8gZ290byBlbXVsYXRpb25cbiAgICAgICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG5cbiAgICAgICAgICBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYXNlICovXG4gICAgICAgICAgICBkaXN0ID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICAgICAgICBpZiAoZGlzdCA+IGRtYXgpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgZGlzdCkpO1xuICAgICAgICAgICAgb3AgPSBfb3V0IC0gYmVnOyAgICAgICAgICAgICAgICAvKiBtYXggZGlzdGFuY2UgaW4gb3V0cHV0ICovXG4gICAgICAgICAgICBpZiAoZGlzdCA+IG9wKSB7ICAgICAgICAgICAgICAgIC8qIHNlZSBpZiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgIG9wID0gZGlzdCAtIG9wOyAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgIGlmIChvcCA+IHdoYXZlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICAgICAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTtcbi8vICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCA+IHdoYXZlKTtcbi8vICAgICAgICAgICAgICAgIGlmIChvcCA9PT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZnJvbSA9IDA7IC8vIHdpbmRvdyBpbmRleFxuICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IHNfd2luZG93O1xuICAgICAgICAgICAgICBpZiAod25leHQgPT09IDApIHsgICAgICAgICAgIC8qIHZlcnkgY29tbW9uIGNhc2UgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgb3AgLT0gd25leHQ7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gMDtcbiAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0O1xuICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi9cbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgICAgIGhlcmUgPSBkY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICAgICAgY29udGludWUgZG9kaXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGhlcmUgPSBsY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICBjb250aW51ZSBkb2xlbjtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMzIpIHsgICAgICAgICAgICAgICAgICAgICAvKiBlbmQtb2YtYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICB9XG4gIH0gd2hpbGUgKF9pbiA8IGxhc3QgJiYgX291dCA8IGVuZCk7XG5cbiAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovXG4gIGxlbiA9IGJpdHMgPj4gMztcbiAgX2luIC09IGxlbjtcbiAgYml0cyAtPSBsZW4gPDwgMztcbiAgaG9sZCAmPSAoMSA8PCBiaXRzKSAtIDE7XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi9cbiAgc3RybS5uZXh0X2luID0gX2luO1xuICBzdHJtLm5leHRfb3V0ID0gX291dDtcbiAgc3RybS5hdmFpbF9pbiA9IChfaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gX2luKSA6IDUgLSAoX2luIC0gbGFzdCkpO1xuICBzdHJtLmF2YWlsX291dCA9IChfb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIF9vdXQpIDogMjU3IC0gKF9vdXQgLSBlbmQpKTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICByZXR1cm47XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbnZhciB1dGlscyAgICAgICAgID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG52YXIgYWRsZXIzMiAgICAgICA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgICAgICAgPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgaW5mbGF0ZV9mYXN0ICA9IHJlcXVpcmUoJy4vaW5mZmFzdCcpO1xudmFyIGluZmxhdGVfdGFibGUgPSByZXF1aXJlKCcuL2luZnRyZWVzJyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovXG4vL3ZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xuLy92YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG4vL3ZhciBaX0ZVTExfRkxVU0ggICAgPSAzO1xudmFyIFpfRklOSVNIICAgICAgICA9IDQ7XG52YXIgWl9CTE9DSyAgICAgICAgID0gNTtcbnZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbnZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7XG52YXIgWl9EQVRBX0VSUk9SICAgID0gLTM7XG52YXIgWl9NRU1fRVJST1IgICAgID0gLTQ7XG52YXIgWl9CVUZfRVJST1IgICAgID0gLTU7XG4vL3ZhciBaX1ZFUlNJT05fRVJST1IgPSAtNjtcblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG5cbi8qIFNUQVRFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciAgICBIRUFEID0gMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbWFnaWMgaGVhZGVyICovXG52YXIgICAgRkxBR1MgPSAyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1ldGhvZCBhbmQgZmxhZ3MgKGd6aXApICovXG52YXIgICAgVElNRSA9IDM7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1vZGlmaWNhdGlvbiB0aW1lIChnemlwKSAqL1xudmFyICAgIE9TID0gNDsgICAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBmbGFncyBhbmQgb3BlcmF0aW5nIHN5c3RlbSAoZ3ppcCkgKi9cbnZhciAgICBFWExFTiA9IDU7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgbGVuZ3RoIChnemlwKSAqL1xudmFyICAgIEVYVFJBID0gNjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBieXRlcyAoZ3ppcCkgKi9cbnZhciAgICBOQU1FID0gNzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGZpbGUgbmFtZSAoZ3ppcCkgKi9cbnZhciAgICBDT01NRU5UID0gODsgICAgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGNvbW1lbnQgKGd6aXApICovXG52YXIgICAgSENSQyA9IDk7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGhlYWRlciBjcmMgKGd6aXApICovXG52YXIgICAgRElDVElEID0gMTA7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpY3Rpb25hcnkgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBESUNUID0gMTE7ICAgICAgLyogd2FpdGluZyBmb3IgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsICovXG52YXIgICAgICAgIFRZUEUgPSAxMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG52YXIgICAgICAgIFRZUEVETyA9IDEzOyAgICAvKiBpOiBzYW1lLCBidXQgc2tpcCBjaGVjayB0byBleGl0IGluZmxhdGUgb24gbmV3IGJsb2NrICovXG52YXIgICAgICAgIFNUT1JFRCA9IDE0OyAgICAvKiBpOiB3YWl0aW5nIGZvciBzdG9yZWQgc2l6ZSAobGVuZ3RoIGFuZCBjb21wbGVtZW50KSAqL1xudmFyICAgICAgICBDT1BZXyA9IDE1OyAgICAgLyogaS9vOiBzYW1lIGFzIENPUFkgYmVsb3csIGJ1dCBvbmx5IGZpcnN0IHRpbWUgaW4gKi9cbnZhciAgICAgICAgQ09QWSA9IDE2OyAgICAgIC8qIGkvbzogd2FpdGluZyBmb3IgaW5wdXQgb3Igb3V0cHV0IHRvIGNvcHkgc3RvcmVkIGJsb2NrICovXG52YXIgICAgICAgIFRBQkxFID0gMTc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciBkeW5hbWljIGJsb2NrIHRhYmxlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgTEVOTEVOUyA9IDE4OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBDT0RFTEVOUyA9IDE5OyAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgICAgICBMRU5fID0gMjA7ICAgICAgLyogaTogc2FtZSBhcyBMRU4gYmVsb3csIGJ1dCBvbmx5IGZpcnN0IHRpbWUgaW4gKi9cbnZhciAgICAgICAgICAgIExFTiA9IDIxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0L2VvYiBjb2RlICovXG52YXIgICAgICAgICAgICBMRU5FWFQgPSAyMjsgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIERJU1QgPSAyMzsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBjb2RlICovXG52YXIgICAgICAgICAgICBESVNURVhUID0gMjQ7ICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgTUFUQ0ggPSAyNTsgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byBjb3B5IHN0cmluZyAqL1xudmFyICAgICAgICAgICAgTElUID0gMjY7ICAgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byB3cml0ZSBsaXRlcmFsICovXG52YXIgICAgQ0hFQ0sgPSAyNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBjaGVjayB2YWx1ZSAqL1xudmFyICAgIExFTkdUSCA9IDI4OyAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgbGVuZ3RoIChnemlwKSAqL1xudmFyICAgIERPTkUgPSAyOTsgICAgICAvKiBmaW5pc2hlZCBjaGVjaywgZG9uZSAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIEJBRCA9IDMwOyAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgTUVNID0gMzE7ICAgICAgIC8qIGdvdCBhbiBpbmZsYXRlKCkgbWVtb3J5IGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgU1lOQyA9IDMyOyAgICAgIC8qIGxvb2tpbmcgZm9yIHN5bmNocm9uaXphdGlvbiBieXRlcyB0byByZXN0YXJ0IGluZmxhdGUoKSAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cblxudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9ICAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKTtcblxudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX1dCSVRTID0gTUFYX1dCSVRTO1xuXG5cbmZ1bmN0aW9uIHpzd2FwMzIocSkge1xuICByZXR1cm4gICgoKHEgPj4+IDI0KSAmIDB4ZmYpICtcbiAgICAgICAgICAoKHEgPj4+IDgpICYgMHhmZjAwKSArXG4gICAgICAgICAgKChxICYgMHhmZjAwKSA8PCA4KSArXG4gICAgICAgICAgKChxICYgMHhmZikgPDwgMjQpKTtcbn1cblxuXG5mdW5jdGlvbiBJbmZsYXRlU3RhdGUoKSB7XG4gIHRoaXMubW9kZSA9IDA7ICAgICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovXG4gIHRoaXMubGFzdCA9IGZhbHNlOyAgICAgICAgICAvKiB0cnVlIGlmIHByb2Nlc3NpbmcgbGFzdCBibG9jayAqL1xuICB0aGlzLndyYXAgPSAwOyAgICAgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqL1xuICB0aGlzLmhhdmVkaWN0ID0gZmFsc2U7ICAgICAgLyogdHJ1ZSBpZiBkaWN0aW9uYXJ5IHByb3ZpZGVkICovXG4gIHRoaXMuZmxhZ3MgPSAwOyAgICAgICAgICAgICAvKiBnemlwIGhlYWRlciBtZXRob2QgYW5kIGZsYWdzICgwIGlmIHpsaWIpICovXG4gIHRoaXMuZG1heCA9IDA7ICAgICAgICAgICAgICAvKiB6bGliIGhlYWRlciBtYXggZGlzdGFuY2UgKElORkxBVEVfU1RSSUNUKSAqL1xuICB0aGlzLmNoZWNrID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2YgY2hlY2sgdmFsdWUgKi9cbiAgdGhpcy50b3RhbCA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIG91dHB1dCBjb3VudCAqL1xuICAvLyBUT0RPOiBtYXkgYmUge31cbiAgdGhpcy5oZWFkID0gbnVsbDsgICAgICAgICAgIC8qIHdoZXJlIHRvIHNhdmUgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gKi9cblxuICAvKiBzbGlkaW5nIHdpbmRvdyAqL1xuICB0aGlzLndiaXRzID0gMDsgICAgICAgICAgICAgLyogbG9nIGJhc2UgMiBvZiByZXF1ZXN0ZWQgd2luZG93IHNpemUgKi9cbiAgdGhpcy53c2l6ZSA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqL1xuICB0aGlzLndoYXZlID0gMDsgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqL1xuICB0aGlzLnduZXh0ID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovXG4gIHRoaXMud2luZG93ID0gbnVsbDsgICAgICAgICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIG5lZWRlZCAqL1xuXG4gIC8qIGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmhvbGQgPSAwOyAgICAgICAgICAgICAgLyogaW5wdXQgYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuYml0cyA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBcImluXCIgKi9cblxuICAvKiBmb3Igc3RyaW5nIGFuZCBzdG9yZWQgYmxvY2sgY29weWluZyAqL1xuICB0aGlzLmxlbmd0aCA9IDA7ICAgICAgICAgICAgLyogbGl0ZXJhbCBvciBsZW5ndGggb2YgZGF0YSB0byBjb3B5ICovXG4gIHRoaXMub2Zmc2V0ID0gMDsgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIHRvIGNvcHkgc3RyaW5nIGZyb20gKi9cblxuICAvKiBmb3IgdGFibGUgYW5kIGNvZGUgZGVjb2RpbmcgKi9cbiAgdGhpcy5leHRyYSA9IDA7ICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgbmVlZGVkICovXG5cbiAgLyogZml4ZWQgYW5kIGR5bmFtaWMgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5jb2RlID0gbnVsbDsgICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzICovXG4gIHRoaXMuZGlzdGNvZGUgPSBudWxsOyAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAqL1xuICB0aGlzLmxlbmJpdHMgPSAwOyAgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgbGVuY29kZSAqL1xuICB0aGlzLmRpc3RiaXRzID0gMDsgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgZGlzdGNvZGUgKi9cblxuICAvKiBkeW5hbWljIHRhYmxlIGJ1aWxkaW5nICovXG4gIHRoaXMubmNvZGUgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmxlbiA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5kaXN0ID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLmhhdmUgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RocyBpbiBsZW5zW10gKi9cbiAgdGhpcy5uZXh0ID0gbnVsbDsgICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIGNvZGVzW10gKi9cblxuICB0aGlzLmxlbnMgPSBuZXcgdXRpbHMuQnVmMTYoMzIwKTsgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLndvcmsgPSBuZXcgdXRpbHMuQnVmMTYoMjg4KTsgLyogd29yayBhcmVhIGZvciBjb2RlIHRhYmxlIGJ1aWxkaW5nICovXG5cbiAgLypcbiAgIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBwb2ludGVycyBpbiBqcywgd2UgdXNlIGxlbmNvZGUgYW5kIGRpc3Rjb2RlIGRpcmVjdGx5XG4gICBhcyBidWZmZXJzIHNvIHdlIGRvbid0IG5lZWQgY29kZXNcbiAgKi9cbiAgLy90aGlzLmNvZGVzID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSCk7ICAgICAgIC8qIHNwYWNlIGZvciBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmR5biA9IG51bGw7ICAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuZGlzdGR5biA9IG51bGw7ICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5zYW5lID0gMDsgICAgICAgICAgICAgICAgICAgLyogaWYgZmFsc2UsIGFsbG93IGludmFsaWQgZGlzdGFuY2UgdG9vIGZhciAqL1xuICB0aGlzLmJhY2sgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBiaXRzIGJhY2sgb2YgbGFzdCB1bnByb2Nlc3NlZCBsZW5ndGgvbGl0ICovXG4gIHRoaXMud2FzID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWwgbGVuZ3RoIG9mIG1hdGNoICovXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldEtlZXAoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0cm0udG90YWxfaW4gPSBzdHJtLnRvdGFsX291dCA9IHN0YXRlLnRvdGFsID0gMDtcbiAgc3RybS5tc2cgPSAnJzsgLypaX05VTEwqL1xuICBpZiAoc3RhdGUud3JhcCkgeyAgICAgICAvKiB0byBzdXBwb3J0IGlsbC1jb25jZWl2ZWQgSmF2YSB0ZXN0IHN1aXRlICovXG4gICAgc3RybS5hZGxlciA9IHN0YXRlLndyYXAgJiAxO1xuICB9XG4gIHN0YXRlLm1vZGUgPSBIRUFEO1xuICBzdGF0ZS5sYXN0ID0gMDtcbiAgc3RhdGUuaGF2ZWRpY3QgPSAwO1xuICBzdGF0ZS5kbWF4ID0gMzI3Njg7XG4gIHN0YXRlLmhlYWQgPSBudWxsLypaX05VTEwqLztcbiAgc3RhdGUuaG9sZCA9IDA7XG4gIHN0YXRlLmJpdHMgPSAwO1xuICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQgPSBzdGF0ZS5jb2RlcztcbiAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5biA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0hfTEVOUyk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5biA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0hfRElTVFMpO1xuXG4gIHN0YXRlLnNhbmUgPSAxO1xuICBzdGF0ZS5iYWNrID0gLTE7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogcmVzZXRcXG5cIikpO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdGF0ZS53c2l6ZSA9IDA7XG4gIHN0YXRlLndoYXZlID0gMDtcbiAgc3RhdGUud25leHQgPSAwO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKTtcblxufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHdyYXA7XG4gIHZhciBzdGF0ZTtcblxuICAvKiBnZXQgdGhlIHN0YXRlICovXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIC8qIGV4dHJhY3Qgd3JhcCByZXF1ZXN0IGZyb20gd2luZG93Qml0cyBwYXJhbWV0ZXIgKi9cbiAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7XG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG4gIGVsc2Uge1xuICAgIHdyYXAgPSAod2luZG93Qml0cyA+PiA0KSArIDE7XG4gICAgaWYgKHdpbmRvd0JpdHMgPCA0OCkge1xuICAgICAgd2luZG93Qml0cyAmPSAxNTtcbiAgICB9XG4gIH1cblxuICAvKiBzZXQgbnVtYmVyIG9mIHdpbmRvdyBiaXRzLCBmcmVlIHdpbmRvdyBpZiBkaWZmZXJlbnQgKi9cbiAgaWYgKHdpbmRvd0JpdHMgJiYgKHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cbiAgaWYgKHN0YXRlLndpbmRvdyAhPT0gbnVsbCAmJiBzdGF0ZS53Yml0cyAhPT0gd2luZG93Qml0cykge1xuICAgIHN0YXRlLndpbmRvdyA9IG51bGw7XG4gIH1cblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJlc2V0IHRoZSByZXN0IG9mIGl0ICovXG4gIHN0YXRlLndyYXAgPSB3cmFwO1xuICBzdGF0ZS53Yml0cyA9IHdpbmRvd0JpdHM7XG4gIHJldHVybiBpbmZsYXRlUmVzZXQoc3RybSk7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVJbml0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciByZXQ7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0pIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIC8vc3RybS5tc2cgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHJldHVybiBhbiBlcnJvciAqL1xuXG4gIHN0YXRlID0gbmV3IEluZmxhdGVTdGF0ZSgpO1xuXG4gIC8vaWYgKHN0YXRlID09PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiBhbGxvY2F0ZWRcXG5cIikpO1xuICBzdHJtLnN0YXRlID0gc3RhdGU7XG4gIHN0YXRlLndpbmRvdyA9IG51bGwvKlpfTlVMTCovO1xuICByZXQgPSBpbmZsYXRlUmVzZXQyKHN0cm0sIHdpbmRvd0JpdHMpO1xuICBpZiAocmV0ICE9PSBaX09LKSB7XG4gICAgc3RybS5zdGF0ZSA9IG51bGwvKlpfTlVMTCovO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVJbml0KHN0cm0pIHtcbiAgcmV0dXJuIGluZmxhdGVJbml0MihzdHJtLCBERUZfV0JJVFMpO1xufVxuXG5cbi8qXG4gUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0b1xuIGZpeGVkIGNvZGUgZGVjb2RpbmcuICBOb3JtYWxseSB0aGlzIHJldHVybnMgZml4ZWQgdGFibGVzIGZyb20gaW5mZml4ZWQuaC5cbiBJZiBCVUlMREZJWEVEIGlzIGRlZmluZWQsIHRoZW4gaW5zdGVhZCB0aGlzIHJvdXRpbmUgYnVpbGRzIHRoZSB0YWJsZXMgdGhlXG4gZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVzIHRoZSBmaXJzdCB0aW1lIGFuZFxuIHRoZXJlYWZ0ZXIuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvZGUgYnkgYWJvdXQgMksgYnl0ZXMsIGluXG4gZXhjaGFuZ2UgZm9yIGEgbGl0dGxlIGV4ZWN1dGlvbiB0aW1lLiAgSG93ZXZlciwgQlVJTERGSVhFRCBzaG91bGQgbm90IGJlXG4gdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdpblxuIG1heSBub3QgYmUgdGhyZWFkLXNhZmUuXG4gKi9cbnZhciB2aXJnaW4gPSB0cnVlO1xuXG52YXIgbGVuZml4LCBkaXN0Zml4OyAvLyBXZSBoYXZlIG5vIHBvaW50ZXJzIGluIEpTLCBzbyBrZWVwIHRhYmxlcyBzZXBhcmF0ZVxuXG5mdW5jdGlvbiBmaXhlZHRhYmxlcyhzdGF0ZSkge1xuICAvKiBidWlsZCBmaXhlZCBodWZmbWFuIHRhYmxlcyBpZiBmaXJzdCBjYWxsIChtYXkgbm90IGJlIHRocmVhZCBzYWZlKSAqL1xuICBpZiAodmlyZ2luKSB7XG4gICAgdmFyIHN5bTtcblxuICAgIGxlbmZpeCA9IG5ldyB1dGlscy5CdWYzMig1MTIpO1xuICAgIGRpc3RmaXggPSBuZXcgdXRpbHMuQnVmMzIoMzIpO1xuXG4gICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAxNDQpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA4OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI1NikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDk7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjgwKSB7IHN0YXRlLmxlbnNbc3ltKytdID0gNzsgfVxuICAgIHdoaWxlIChzeW0gPCAyODgpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA4OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKExFTlMsICBzdGF0ZS5sZW5zLCAwLCAyODgsIGxlbmZpeCwgICAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDkgfSk7XG5cbiAgICAvKiBkaXN0YW5jZSB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDMyKSB7IHN0YXRlLmxlbnNbc3ltKytdID0gNTsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgMCwgMzIsICAgZGlzdGZpeCwgMCwgc3RhdGUud29yaywgeyBiaXRzOiA1IH0pO1xuXG4gICAgLyogZG8gdGhpcyBqdXN0IG9uY2UgKi9cbiAgICB2aXJnaW4gPSBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmxlbmNvZGUgPSBsZW5maXg7XG4gIHN0YXRlLmxlbmJpdHMgPSA5O1xuICBzdGF0ZS5kaXN0Y29kZSA9IGRpc3RmaXg7XG4gIHN0YXRlLmRpc3RiaXRzID0gNTtcbn1cblxuXG4vKlxuIFVwZGF0ZSB0aGUgd2luZG93IHdpdGggdGhlIGxhc3Qgd3NpemUgKG5vcm1hbGx5IDMySykgYnl0ZXMgd3JpdHRlbiBiZWZvcmVcbiByZXR1cm5pbmcuICBJZiB3aW5kb3cgZG9lcyBub3QgZXhpc3QgeWV0LCBjcmVhdGUgaXQuICBUaGlzIGlzIG9ubHkgY2FsbGVkXG4gd2hlbiBhIHdpbmRvdyBpcyBhbHJlYWR5IGluIHVzZSwgb3Igd2hlbiBvdXRwdXQgaGFzIGJlZW4gd3JpdHRlbiBkdXJpbmcgdGhpc1xuIGluZmxhdGUgY2FsbCwgYnV0IHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgc3RyZWFtIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC5cbiBJdCBpcyBhbHNvIGNhbGxlZCB0byBjcmVhdGUgYSB3aW5kb3cgZm9yIGRpY3Rpb25hcnkgZGF0YSB3aGVuIGEgZGljdGlvbmFyeVxuIGlzIGxvYWRlZC5cblxuIFByb3ZpZGluZyBvdXRwdXQgYnVmZmVycyBsYXJnZXIgdGhhbiAzMksgdG8gaW5mbGF0ZSgpIHNob3VsZCBwcm92aWRlIGEgc3BlZWRcbiBhZHZhbnRhZ2UsIHNpbmNlIG9ubHkgdGhlIGxhc3QgMzJLIG9mIG91dHB1dCBpcyBjb3BpZWQgdG8gdGhlIHNsaWRpbmcgd2luZG93XG4gdXBvbiByZXR1cm4gZnJvbSBpbmZsYXRlKCksIGFuZCBzaW5jZSBhbGwgZGlzdGFuY2VzIGFmdGVyIHRoZSBmaXJzdCAzMksgb2ZcbiBvdXRwdXQgd2lsbCBmYWxsIGluIHRoZSBvdXRwdXQgZGF0YSwgbWFraW5nIG1hdGNoIGNvcGllcyBzaW1wbGVyIGFuZCBmYXN0ZXIuXG4gVGhlIGFkdmFudGFnZSBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZSBzaXplIG9mIHRoZSBwcm9jZXNzb3IncyBkYXRhIGNhY2hlcy5cbiAqL1xuZnVuY3Rpb24gdXBkYXRld2luZG93KHN0cm0sIHNyYywgZW5kLCBjb3B5KSB7XG4gIHZhciBkaXN0O1xuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIC8qIGlmIGl0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeSwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB3aW5kb3cgKi9cbiAgaWYgKHN0YXRlLndpbmRvdyA9PT0gbnVsbCkge1xuICAgIHN0YXRlLndzaXplID0gMSA8PCBzdGF0ZS53Yml0cztcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSAwO1xuXG4gICAgc3RhdGUud2luZG93ID0gbmV3IHV0aWxzLkJ1Zjgoc3RhdGUud3NpemUpO1xuICB9XG5cbiAgLyogY29weSBzdGF0ZS0+d3NpemUgb3IgbGVzcyBvdXRwdXQgYnl0ZXMgaW50byB0aGUgY2lyY3VsYXIgd2luZG93ICovXG4gIGlmIChjb3B5ID49IHN0YXRlLndzaXplKSB7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIHN0YXRlLndzaXplLCBzdGF0ZS53c2l6ZSwgMCk7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gIH1cbiAgZWxzZSB7XG4gICAgZGlzdCA9IHN0YXRlLndzaXplIC0gc3RhdGUud25leHQ7XG4gICAgaWYgKGRpc3QgPiBjb3B5KSB7XG4gICAgICBkaXN0ID0gY29weTtcbiAgICB9XG4gICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d25leHQsIGVuZCAtIGNvcHksIGRpc3QpO1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBkaXN0LCBzdGF0ZS53bmV4dCk7XG4gICAgY29weSAtPSBkaXN0O1xuICAgIGlmIChjb3B5KSB7XG4gICAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdywgZW5kIC0gY29weSwgY29weSk7XG4gICAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgY29weSwgMCk7XG4gICAgICBzdGF0ZS53bmV4dCA9IGNvcHk7XG4gICAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN0YXRlLnduZXh0ICs9IGRpc3Q7XG4gICAgICBpZiAoc3RhdGUud25leHQgPT09IHN0YXRlLndzaXplKSB7IHN0YXRlLnduZXh0ID0gMDsgfVxuICAgICAgaWYgKHN0YXRlLndoYXZlIDwgc3RhdGUud3NpemUpIHsgc3RhdGUud2hhdmUgKz0gZGlzdDsgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBpbnB1dCwgb3V0cHV0OyAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQgYnVmZmVyc1xuICB2YXIgbmV4dDsgICAgICAgICAgICAgICAgICAgLyogbmV4dCBpbnB1dCBJTkRFWCAqL1xuICB2YXIgcHV0OyAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBvdXRwdXQgSU5ERVggKi9cbiAgdmFyIGhhdmUsIGxlZnQ7ICAgICAgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi9cbiAgdmFyIF9pbiwgX291dDsgICAgICAgICAgICAgIC8qIHNhdmUgc3RhcnRpbmcgYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGNvcHk7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcbiAgdmFyIGhlcmUgPSAwOyAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi9cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7IC8vIHBha2VkIFwiaGVyZVwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIC8vdmFyIGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YWJsZSBlbnRyeSAqL1xuICB2YXIgbGFzdF9iaXRzLCBsYXN0X29wLCBsYXN0X3ZhbDsgLy8gcGFrZWQgXCJsYXN0XCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi9cbiAgdmFyIHJldDsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovXG4gIHZhciBoYnVmID0gbmV3IHV0aWxzLkJ1ZjgoNCk7ICAgIC8qIGJ1ZmZlciBmb3IgZ3ppcCBoZWFkZXIgY3JjIGNhbGN1bGF0aW9uICovXG4gIHZhciBvcHRzO1xuXG4gIHZhciBuOyAvLyB0ZW1wb3JhcnkgdmFyIGZvciBORUVEX0JJVFNcblxuICB2YXIgb3JkZXIgPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi9cbiAgICBbIDE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTUgXTtcblxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fCAhc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHsgc3RhdGUubW9kZSA9IFRZUEVETzsgfSAgICAvKiBza2lwIGNoZWNrICovXG5cblxuICAvLy0tLSBMT0FEKCkgLS0tXG4gIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gIG5leHQgPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgLy8tLS1cblxuICBfaW4gPSBoYXZlO1xuICBfb3V0ID0gbGVmdDtcbiAgcmV0ID0gWl9PSztcblxuICBpbmZfbGVhdmU6IC8vIGdvdG8gZW11bGF0aW9uXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKHN0YXRlLm1vZGUpIHtcbiAgICAgIGNhc2UgSEVBRDpcbiAgICAgICAgaWYgKHN0YXRlLndyYXAgPT09IDApIHtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRURPO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoKHN0YXRlLndyYXAgJiAyKSAmJiBob2xkID09PSAweDhiMWYpIHsgIC8qIGd6aXAgaGVhZGVyICovXG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSAwLypjcmMzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG5cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5tb2RlID0gRkxBR1M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZmxhZ3MgPSAwOyAgICAgICAgICAgLyogZXhwZWN0IHpsaWIgaGVhZGVyICovXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5kb25lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoc3RhdGUud3JhcCAmIDEpIHx8ICAgLyogY2hlY2sgaWYgemxpYiBoZWFkZXIgYWxsb3dlZCAqL1xuICAgICAgICAgICgoKGhvbGQgJiAweGZmKS8qQklUUyg4KSovIDw8IDgpICsgKGhvbGQgPj4gOCkpICUgMzEpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgaGVhZGVyIGNoZWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNDtcbiAgICAgICAgYml0cyAtPSA0O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGxlbiA9IChob2xkICYgMHgwZikvKkJJVFMoNCkqLyArIDg7XG4gICAgICAgIGlmIChzdGF0ZS53Yml0cyA9PT0gMCkge1xuICAgICAgICAgIHN0YXRlLndiaXRzID0gbGVuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxlbiA+IHN0YXRlLndiaXRzKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCB3aW5kb3cgc2l6ZSc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5kbWF4ID0gMSA8PCBsZW47XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICB6bGliIGhlYWRlciBva1xcblwiKSk7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgc3RhdGUubW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRkxBR1M6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5mbGFncyA9IGhvbGQ7XG4gICAgICAgIGlmICgoc3RhdGUuZmxhZ3MgJiAweGZmKSAhPT0gWl9ERUZMQVRFRCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4ZTAwMCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gaGVhZGVyIGZsYWdzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQudGV4dCA9ICgoaG9sZCA+PiA4KSAmIDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBUSU1FO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIFRJTUU6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQudGltZSA9IGhvbGQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gQ1JDNChzdGF0ZS5jaGVjaywgaG9sZClcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsyXSA9IChob2xkID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhidWZbM10gPSAoaG9sZCA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCA0LCAwKTtcbiAgICAgICAgICAvLz09PVxuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gT1M7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgT1M6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQueGZsYWdzID0gKGhvbGQgJiAweGZmKTtcbiAgICAgICAgICBzdGF0ZS5oZWFkLm9zID0gKGhvbGQgPj4gOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IEVYTEVOO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIEVYTEVOOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA0MDApIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQ7XG4gICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbGVuID0gaG9sZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbC8qWl9OVUxMKi87XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IEVYVFJBO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIEVYVFJBOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA0MDApIHtcbiAgICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS5oZWFkLmV4dHJhX2xlbiAtIHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5oZWFkLmV4dHJhKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHVudHlwZWQgYXJyYXkgZm9yIG1vcmUgY29udmVuaWVudCBwcm9jZXNzaW5nIGxhdGVyXG4gICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG5ldyBBcnJheShzdGF0ZS5oZWFkLmV4dHJhX2xlbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdXRpbHMuYXJyYXlTZXQoXG4gICAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSxcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGlzIGxpbWl0ZWQgdG8gNjU1MzYgYnl0ZXNcbiAgICAgICAgICAgICAgICAvLyAtIG5vIG5lZWQgZm9yIGFkZGl0aW9uYWwgc2l6ZSBjaGVja1xuICAgICAgICAgICAgICAgIGNvcHksXG4gICAgICAgICAgICAgICAgLypsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gPyBzdGF0ZS5oZWFkLmV4dHJhX21heCA6IGNvcHksKi9cbiAgICAgICAgICAgICAgICBsZW5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy96bWVtY3B5KHN0YXRlLmhlYWQuZXh0cmEgKyBsZW4sIG5leHQsXG4gICAgICAgICAgICAgIC8vICAgICAgICBsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggP1xuICAgICAgICAgICAgICAvLyAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTkFNRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBOQU1FOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA4MDApIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBjb3B5ID0gMDtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAvLyBUT0RPOiAyIG9yIDEgYnl0ZXM/XG4gICAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLm5hbWVfbWF4Ki8pKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGlmIChsZW4pIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IENPTU1FTlQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgxMDAwKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgY29weSA9IDA7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5jb21tX21heCovKSkge1xuICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gSENSQztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBIQ1JDOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUuY2hlY2sgJiAweGZmZmYpKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdoZWFkZXIgY3JjIG1pc21hdGNoJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmhjcmMgPSAoKHN0YXRlLmZsYWdzID4+IDkpICYgMSk7XG4gICAgICAgICAgc3RhdGUuaGVhZC5kb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJQ1RJRDpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHpzd2FwMzIoaG9sZCk7XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElDVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESUNUOlxuICAgICAgICBpZiAoc3RhdGUuaGF2ZWRpY3QgPT09IDApIHtcbiAgICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgICAvLy0tLVxuICAgICAgICAgIHJldHVybiBaX05FRURfRElDVDtcbiAgICAgICAgfVxuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxLyphZGxlcjMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIFRZUEU6XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9CTE9DSyB8fCBmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUWVBFRE86XG4gICAgICAgIGlmIChzdGF0ZS5sYXN0KSB7XG4gICAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQ0hFQ0s7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sYXN0ID0gKGhvbGQgJiAweDAxKS8qQklUUygxKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUygxKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMTtcbiAgICAgICAgYml0cyAtPSAxO1xuICAgICAgICAvLy0tLS8vXG5cbiAgICAgICAgc3dpdGNoICgoaG9sZCAmIDB4MDMpLypCSVRTKDIpKi8pIHtcbiAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZWQgYmxvY2sgKi9cbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXFxuXCIsXG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IFNUT1JFRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkIGJsb2NrICovXG4gICAgICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7XG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IExFTl87ICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqL1xuICAgICAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBibG9jayAqL1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IFRBQkxFO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBibG9jayB0eXBlJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU1RPUkVEOlxuICAgICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi9cbiAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9PSAoKGhvbGQgPj4+IDE2KSBeIDB4ZmZmZikpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQgJiAweGZmZmY7XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWV87XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT1BZXzpcbiAgICAgICAgc3RhdGUubW9kZSA9IENPUFk7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09QWTpcbiAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgICBpZiAoY29weSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAvLy0tLSB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7IC0tLVxuICAgICAgICAgIHV0aWxzLmFycmF5U2V0KG91dHB1dCwgaW5wdXQsIG5leHQsIGNvcHksIHB1dCk7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgICAgIHB1dCArPSBjb3B5O1xuICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVEFCTEU6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE0KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5ubGVuID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMjU3O1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg1KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNTtcbiAgICAgICAgYml0cyAtPSA1O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm5kaXN0ID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMTtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDU7XG4gICAgICAgIGJpdHMgLT0gNTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5uY29kZSA9IChob2xkICYgMHgwZikvKkJJVFMoNCkqLyArIDQ7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgICBiaXRzIC09IDQ7XG4gICAgICAgIC8vLS0tLy9cbi8vI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORFxuICAgICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkxFTlM7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOTEVOUzpcbiAgICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5uY29kZSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDMpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCAxOSkge1xuICAgICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAgIC8vc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICAgICAgICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuICAgICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgICAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5bjtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IDc7XG5cbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUubGVuYml0cyB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS5sZW5zLCAwLCAxOSwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSBsZW5ndGhzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09ERUxFTlM6XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsvKkJJVFMoc3RhdGUubGVuYml0cykqL1xuICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGVyZV92YWwgPCAxNikge1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gaGVyZV92YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAyKTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDI7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUgLSAxXTtcbiAgICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDMpOy8vQklUUygyKTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGVyZV92YWwgPT09IDE3KSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDMpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMztcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgbGVuID0gMDtcbiAgICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDcpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgNztcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgbGVuID0gMDtcbiAgICAgICAgICAgICAgY29weSA9IDExICsgKGhvbGQgJiAweDdmKTsvL0JJVFMoNyk7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDcpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSA3O1xuICAgICAgICAgICAgICBiaXRzIC09IDc7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weSA+IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoY29weS0tKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBCQUQpIHsgYnJlYWs7IH1cblxuICAgICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi9cbiAgICAgICAgaWYgKHN0YXRlLmxlbnNbMjU2XSA9PT0gMCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzIC0tIG5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIGxlbmJpdHMgb3IgZGlzdGJpdHNcbiAgICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgICAgICAgICBjb25jZXJuaW5nIHRoZSBFTk9VR0ggY29uc3RhbnRzLCB3aGljaCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzICovXG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSA5O1xuXG4gICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS5sZW5zLCAwLCBzdGF0ZS5ubGVuLCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAgIC8vIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5kaXN0Yml0cyA9IDY7XG4gICAgICAgIC8vc3RhdGUuZGlzdGNvZGUuY29weShzdGF0ZS5jb2Rlcyk7XG4gICAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW47XG4gICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmRpc3RiaXRzIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIHN0YXRlLm5sZW4sIHN0YXRlLm5kaXN0LCBzdGF0ZS5kaXN0Y29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgICBzdGF0ZS5kaXN0Yml0cyA9IG9wdHMuYml0cztcbiAgICAgICAgLy8gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlcyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgJ2luZmxhdGU6ICAgICAgIGNvZGVzIG9rXFxuJykpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXztcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTl86XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOOlxuICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7XG4gICAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gICAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgICAgLy8tLS1cbiAgICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgX291dCk7XG4gICAgICAgICAgLy8tLS0gTE9BRCgpIC0tLVxuICAgICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gICAgICAgICAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gICAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICAgICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47XG4gICAgICAgICAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICAgICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICAgICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICAgICAgICAgIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAgICAgICAgIC8vLS0tXG5cbiAgICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkge1xuICAgICAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5iYWNrID0gMDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07ICAvKkJJVFMoc3RhdGUubGVuYml0cykqL1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiYgKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsO1xuICAgICAgICBpZiAoaGVyZV9vcCA9PT0gMCkge1xuICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxcblwiLCBoZXJlLnZhbCkpO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiAzMikge1xuICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5leHRyYSA9IGhlcmVfb3AgJiAxNTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkVYVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5FWFQ6XG4gICAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgc3RhdGUubW9kZSA9IERJU1Q7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElTVDpcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDEpXTsvKkJJVFMoc3RhdGUuZGlzdGJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDtcbiAgICAgICAgc3RhdGUuZXh0cmEgPSAoaGVyZV9vcCkgJiAxNTtcbiAgICAgICAgc3RhdGUubW9kZSA9IERJU1RFWFQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElTVEVYVDpcbiAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5vZmZzZXQgKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgfVxuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBzdGF0ZS5vZmZzZXQpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IE1BVENIO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE1BVENIOlxuICAgICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IF9vdXQgLSBsZWZ0O1xuICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICBjb3B5ID0gc3RhdGUub2Zmc2V0IC0gY29weTtcbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLndoYXZlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhdWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgVHJhY2UoKHN0ZGVyciwgXCJpbmZsYXRlLmMgdG9vIGZhclxcblwiKSk7XG4vLyAgICAgICAgICBjb3B5IC09IHN0YXRlLndoYXZlO1xuLy8gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuLy8gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4vLyAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4vLyAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbi8vICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IDA7XG4vLyAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuLy8gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4vLyAgICAgICAgICBicmVhaztcbi8vI2VuZGlmXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud25leHQpIHtcbiAgICAgICAgICAgIGNvcHkgLT0gc3RhdGUud25leHQ7XG4gICAgICAgICAgICBmcm9tID0gc3RhdGUud3NpemUgLSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZyb20gPSBzdGF0ZS53bmV4dCAtIGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbiAgICAgICAgICBmcm9tX3NvdXJjZSA9IHN0YXRlLndpbmRvdztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLm9mZnNldDtcbiAgICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4gICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTElUOlxuICAgICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgb3V0cHV0W3B1dCsrXSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgbGVmdC0tO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ0hFQ0s6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgLy8gVXNlICd8JyBpbnN0ZWFkIG9mICcrJyB0byBtYWtlIHN1cmUgdGhhdCByZXN1bHQgaXMgc2lnbmVkXG4gICAgICAgICAgICBob2xkIHw9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIF9vdXQgLT0gbGVmdDtcbiAgICAgICAgICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICAgICAgICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gICAgICAgICAgaWYgKF9vdXQpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9XG4gICAgICAgICAgICAgICAgLypVUERBVEUoc3RhdGUuY2hlY2ssIHB1dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAgICAgICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpKTtcblxuICAgICAgICAgIH1cbiAgICAgICAgICBfb3V0ID0gbGVmdDtcbiAgICAgICAgICAvLyBOQjogY3JjMzIgc3RvcmVkIGFzIHNpZ25lZCAzMi1iaXQgaW50LCB6c3dhcDMyIHJldHVybnMgc2lnbmVkIHRvb1xuICAgICAgICAgIGlmICgoc3RhdGUuZmxhZ3MgPyBob2xkIDogenN3YXAzMihob2xkKSkgIT09IHN0YXRlLmNoZWNrKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgZGF0YSBjaGVjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBjaGVjayBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5HVEg7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOR1RIOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCAmJiBzdGF0ZS5mbGFncykge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS50b3RhbCAmIDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBET05FO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERPTkU6XG4gICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDtcbiAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgY2FzZSBCQUQ6XG4gICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjtcbiAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgY2FzZSBNRU06XG4gICAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICAgIGNhc2UgU1lOQzpcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICAgIH1cbiAgfVxuXG4gIC8vIGluZl9sZWF2ZSA8LSBoZXJlIGlzIHJlYWwgcGxhY2UgZm9yIFwiZ290byBpbmZfbGVhdmVcIiwgZW11bGF0ZWQgdmlhIFwiYnJlYWsgaW5mX2xlYXZlXCJcblxuICAvKlxuICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS5cbiAgICAgSWYgdGhlcmUgd2FzIG5vIHByb2dyZXNzIGR1cmluZyB0aGUgaW5mbGF0ZSgpIGNhbGwsIHJldHVybiBhIGJ1ZmZlclxuICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS5cbiAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLlxuICAgKi9cblxuICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgLy8tLS1cblxuICBpZiAoc3RhdGUud3NpemUgfHwgKF9vdXQgIT09IHN0cm0uYXZhaWxfb3V0ICYmIHN0YXRlLm1vZGUgPCBCQUQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA8IENIRUNLIHx8IGZsdXNoICE9PSBaX0ZJTklTSCkpKSB7XG4gICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCwgX291dCAtIHN0cm0uYXZhaWxfb3V0KSkge1xuICAgICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgX2luIC09IHN0cm0uYXZhaWxfaW47XG4gIF9vdXQgLT0gc3RybS5hdmFpbF9vdXQ7XG4gIHN0cm0udG90YWxfaW4gKz0gX2luO1xuICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICBpZiAoc3RhdGUud3JhcCAmJiBfb3V0KSB7XG4gICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gLypVUERBVEUoc3RhdGUuY2hlY2ssIHN0cm0ubmV4dF9vdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkpO1xuICB9XG4gIHN0cm0uZGF0YV90eXBlID0gc3RhdGUuYml0cyArIChzdGF0ZS5sYXN0ID8gNjQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBUWVBFID8gMTI4IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gTEVOXyB8fCBzdGF0ZS5tb2RlID09PSBDT1BZXyA/IDI1NiA6IDApO1xuICBpZiAoKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCkgfHwgZmx1c2ggPT09IFpfRklOSVNIKSAmJiByZXQgPT09IFpfT0spIHtcbiAgICByZXQgPSBaX0JVRl9FUlJPUjtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlRW5kKHN0cm0pIHtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgLyp8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTAqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS53aW5kb3cpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIHZhciBzdGF0ZTtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG5cbiAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovXG4gIHN0YXRlLmhlYWQgPSBoZWFkO1xuICBoZWFkLmRvbmUgPSBmYWxzZTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgc3RhdGU7XG4gIHZhciBkaWN0aWQ7XG4gIHZhciByZXQ7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIC8qID09IFpfTlVMTCAqLyB8fCAhc3RybS5zdGF0ZSAvKiA9PSBaX05VTEwgKi8pIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICBpZiAoc3RhdGUud3JhcCAhPT0gMCAmJiBzdGF0ZS5tb2RlICE9PSBESUNUKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZGVudGlmaWVyICovXG4gIGlmIChzdGF0ZS5tb2RlID09PSBESUNUKSB7XG4gICAgZGljdGlkID0gMTsgLyogYWRsZXIzMigwLCBudWxsLCAwKSovXG4gICAgLyogZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgICBpZiAoZGljdGlkICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGVcbiAgIGV4aXN0aW5nIGRpY3Rpb25hcnkgaWYgYXBwcm9wcmlhdGUgKi9cbiAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpO1xuICBpZiAocmV0KSB7XG4gICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gIH1cbiAgc3RhdGUuaGF2ZWRpY3QgPSAxO1xuICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmV4cG9ydHMuaW5mbGF0ZVJlc2V0ID0gaW5mbGF0ZVJlc2V0O1xuZXhwb3J0cy5pbmZsYXRlUmVzZXQyID0gaW5mbGF0ZVJlc2V0MjtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0S2VlcCA9IGluZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmluZmxhdGVJbml0ID0gaW5mbGF0ZUluaXQ7XG5leHBvcnRzLmluZmxhdGVJbml0MiA9IGluZmxhdGVJbml0MjtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVFbmQgPSBpbmZsYXRlRW5kO1xuZXhwb3J0cy5pbmZsYXRlR2V0SGVhZGVyID0gaW5mbGF0ZUdldEhlYWRlcjtcbmV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnkgPSBpbmZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZUluZm8gPSAncGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5pbmZsYXRlQ29weSA9IGluZmxhdGVDb3B5O1xuZXhwb3J0cy5pbmZsYXRlR2V0RGljdGlvbmFyeSA9IGluZmxhdGVHZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlTWFyayA9IGluZmxhdGVNYXJrO1xuZXhwb3J0cy5pbmZsYXRlUHJpbWUgPSBpbmZsYXRlUHJpbWU7XG5leHBvcnRzLmluZmxhdGVTeW5jID0gaW5mbGF0ZVN5bmM7XG5leHBvcnRzLmluZmxhdGVTeW5jUG9pbnQgPSBpbmZsYXRlU3luY1BvaW50O1xuZXhwb3J0cy5pbmZsYXRlVW5kZXJtaW5lID0gaW5mbGF0ZVVuZGVybWluZTtcbiovXG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbnZhciBNQVhCSVRTID0gMTU7XG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG52YXIgbGJhc2UgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovXG4gIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsXG4gIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwXG5dO1xuXG52YXIgbGV4dCA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LFxuICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzIsIDc4XG5dO1xuXG52YXIgZGJhc2UgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi9cbiAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLFxuICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsXG4gIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDBcbl07XG5cbnZhciBkZXh0ID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMixcbiAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsXG4gIDI4LCAyOCwgMjksIDI5LCA2NCwgNjRcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKVxue1xuICB2YXIgYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgdmFyIGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi9cbiAgdmFyIHN5bSA9IDA7ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIHZhciBtaW4gPSAwLCBtYXggPSAwOyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqL1xuICB2YXIgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICB2YXIgY3VyciA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICB2YXIgZHJvcCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovXG4gIHZhciBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi9cbiAgdmFyIHVzZWQgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgdmFyIGh1ZmYgPSAwOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovXG4gIHZhciBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqL1xuICB2YXIgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIHZhciBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuICB2YXIgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgdmFyIG5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIHZhciBiYXNlID0gbnVsbDsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4gIHZhciBiYXNlX2luZGV4ID0gMDtcbi8vICB2YXIgc2hvZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqL1xuICB2YXIgY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cbiAgdmFyIG9mZnMgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi9cbiAgdmFyIGV4dHJhID0gbnVsbDtcbiAgdmFyIGV4dHJhX2luZGV4ID0gMDtcblxuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDtcblxuICAvKlxuICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZVxuICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlXG4gICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZVxuICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXJcbiAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHNcbiAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyXG4gICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aFxuICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkc1xuICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXNcbiAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuXG5cbiAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluXG4gICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLlxuICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXRcbiAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuXG5cbiAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCxcbiAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZVxuICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkXG4gICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnlcbiAgIHRoZSBjYWxsZXIuXG5cbiAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmdcbiAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueVxuICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWRcbiAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzLlxuICAgKi9cblxuICAvKiBhY2N1bXVsYXRlIGxlbmd0aHMgZm9yIGNvZGVzIChhc3N1bWVzIGxlbnNbXSBhbGwgaW4gMC4uTUFYQklUUykgKi9cbiAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBjb3VudFtsZW5dID0gMDtcbiAgfVxuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7XG4gIH1cblxuICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqL1xuICByb290ID0gYml0cztcbiAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pIHtcbiAgICBpZiAoY291bnRbbWF4XSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290ID4gbWF4KSB7XG4gICAgcm9vdCA9IG1heDtcbiAgfVxuICBpZiAobWF4ID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqL1xuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDsgIC8vaGVyZS5vcCA9ICh2YXIgY2hhcik2NDsgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7ICAgLy9oZXJlLmJpdHMgPSAodmFyIGNoYXIpMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDsgICAvL2hlcmUudmFsID0gKHZhciBzaG9ydCkwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cblxuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDtcbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cbiAgICBvcHRzLmJpdHMgPSAxO1xuICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqL1xuICB9XG4gIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykge1xuICAgIGlmIChjb3VudFttaW5dICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPCBtaW4pIHtcbiAgICByb290ID0gbWluO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovXG4gIGxlZnQgPSAxO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGxlZnQgPDw9IDE7XG4gICAgbGVmdCAtPSBjb3VudFtsZW5dO1xuICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqL1xuICB9XG4gIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PT0gQ09ERVMgfHwgbWF4ICE9PSAxKSkge1xuICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi9cbiAgfVxuXG4gIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovXG4gIG9mZnNbMV0gPSAwO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07XG4gIH1cblxuICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovXG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgaWYgKGxlbnNbbGVuc19pbmRleCArIHN5bV0gIT09IDApIHtcbiAgICAgIHdvcmtbb2Zmc1tsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrXSA9IHN5bTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nXG4gICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZlxuICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wXG4gICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsXG4gICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvXG4gICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy5cblxuICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkc1xuICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXhcbiAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhXG4gICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXNcbiAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC5cblxuICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGVcbiAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoXG4gICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZVxuICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLlxuXG4gICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZVxuICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCBmb3IgTEVOUyBhbmQgRElTVCB0YWJsZXMgYWdhaW5zdFxuICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpblxuICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbiAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW5cbiAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXNcbiAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVzLCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHNcbiAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy5cbiAgICovXG5cbiAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi9cbiAgLy8gcG9vciBtYW4gb3B0aW1pemF0aW9uIC0gdXNlIGlmLWVsc2UgaW5zdGVhZCBvZiBzd2l0Y2gsXG4gIC8vIHRvIGF2b2lkIGRlb3B0cyBpbiBvbGQgdjhcbiAgaWYgKHR5cGUgPT09IENPREVTKSB7XG4gICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovXG4gICAgZW5kID0gMTk7XG5cbiAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TKSB7XG4gICAgYmFzZSA9IGxiYXNlO1xuICAgIGJhc2VfaW5kZXggLT0gMjU3O1xuICAgIGV4dHJhID0gbGV4dDtcbiAgICBleHRyYV9pbmRleCAtPSAyNTc7XG4gICAgZW5kID0gMjU2O1xuXG4gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBESVNUUyAqL1xuICAgIGJhc2UgPSBkYmFzZTtcbiAgICBleHRyYSA9IGRleHQ7XG4gICAgZW5kID0gLTE7XG4gIH1cblxuICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi9cbiAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi9cbiAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqL1xuICBuZXh0ID0gdGFibGVfaW5kZXg7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovXG5cbiAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovXG4gIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi9cbiAgICBoZXJlX2JpdHMgPSBsZW4gLSBkcm9wO1xuICAgIGlmICh3b3JrW3N5bV0gPCBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSAwO1xuICAgICAgaGVyZV92YWwgPSB3b3JrW3N5bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHdvcmtbc3ltXSA+IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICAgIGhlcmVfdmFsID0gYmFzZVtiYXNlX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoZXJlX29wID0gMzIgKyA2NDsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi9cbiAgICAgIGhlcmVfdmFsID0gMDtcbiAgICB9XG5cbiAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSBkcm9wKTtcbiAgICBmaWxsID0gMSA8PCBjdXJyO1xuICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovXG4gICAgZG8ge1xuICAgICAgZmlsbCAtPSBpbmNyO1xuICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSAoaGVyZV9iaXRzIDw8IDI0KSB8IChoZXJlX29wIDw8IDE2KSB8IGhlcmVfdmFsIHwwO1xuICAgIH0gd2hpbGUgKGZpbGwgIT09IDApO1xuXG4gICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gMSk7XG4gICAgd2hpbGUgKGh1ZmYgJiBpbmNyKSB7XG4gICAgICBpbmNyID4+PSAxO1xuICAgIH1cbiAgICBpZiAoaW5jciAhPT0gMCkge1xuICAgICAgaHVmZiAmPSBpbmNyIC0gMTtcbiAgICAgIGh1ZmYgKz0gaW5jcjtcbiAgICB9IGVsc2Uge1xuICAgICAgaHVmZiA9IDA7XG4gICAgfVxuXG4gICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovXG4gICAgc3ltKys7XG4gICAgaWYgKC0tY291bnRbbGVuXSA9PT0gMCkge1xuICAgICAgaWYgKGxlbiA9PT0gbWF4KSB7IGJyZWFrOyB9XG4gICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cblxuICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqL1xuICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT09IGxvdykge1xuICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovXG4gICAgICBpZiAoZHJvcCA9PT0gMCkge1xuICAgICAgICBkcm9wID0gcm9vdDtcbiAgICAgIH1cblxuICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqL1xuICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovXG5cbiAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqL1xuICAgICAgY3VyciA9IGxlbiAtIGRyb3A7XG4gICAgICBsZWZ0ID0gMSA8PCBjdXJyO1xuICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7XG4gICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdO1xuICAgICAgICBpZiAobGVmdCA8PSAwKSB7IGJyZWFrOyB9XG4gICAgICAgIGN1cnIrKztcbiAgICAgICAgbGVmdCA8PD0gMTtcbiAgICAgIH1cblxuICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqL1xuICAgICAgdXNlZCArPSAxIDw8IGN1cnI7XG4gICAgICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovXG4gICAgICBsb3cgPSBodWZmICYgbWFzaztcbiAgICAgIC8qdGFibGUub3BbbG93XSA9IGN1cnI7XG4gICAgICB0YWJsZS5iaXRzW2xvd10gPSByb290O1xuICAgICAgdGFibGUudmFsW2xvd10gPSBuZXh0IC0gb3B0cy50YWJsZV9pbmRleDsqL1xuICAgICAgdGFibGVbbG93XSA9IChyb290IDw8IDI0KSB8IChjdXJyIDw8IDE2KSB8IChuZXh0IC0gdGFibGVfaW5kZXgpIHwwO1xuICAgIH1cbiAgfVxuXG4gIC8qIGZpbGwgaW4gcmVtYWluaW5nIHRhYmxlIGVudHJ5IGlmIGNvZGUgaXMgaW5jb21wbGV0ZSAoZ3VhcmFudGVlZCB0byBoYXZlXG4gICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZVxuICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqL1xuICBpZiAoaHVmZiAhPT0gMCkge1xuICAgIC8vdGFibGUub3BbbmV4dCArIGh1ZmZdID0gNjQ7ICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tuZXh0ICsgaHVmZl0gPSBsZW4gLSBkcm9wO1xuICAgIC8vdGFibGUudmFsW25leHQgKyBodWZmXSA9IDA7XG4gICAgdGFibGVbbmV4dCArIGh1ZmZdID0gKChsZW4gLSBkcm9wKSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwwO1xuICB9XG5cbiAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovXG4gIC8vb3B0cy50YWJsZV9pbmRleCArPSB1c2VkO1xuICBvcHRzLmJpdHMgPSByb290O1xuICByZXR1cm4gMDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIDI6ICAgICAgJ25lZWQgZGljdGlvbmFyeScsICAgICAvKiBaX05FRURfRElDVCAgICAgICAyICAqL1xuICAxOiAgICAgICdzdHJlYW0gZW5kJywgICAgICAgICAgLyogWl9TVFJFQU1fRU5EICAgICAgMSAgKi9cbiAgMDogICAgICAnJywgICAgICAgICAgICAgICAgICAgIC8qIFpfT0sgICAgICAgICAgICAgIDAgICovXG4gICctMSc6ICAgJ2ZpbGUgZXJyb3InLCAgICAgICAgICAvKiBaX0VSUk5PICAgICAgICAgKC0xKSAqL1xuICAnLTInOiAgICdzdHJlYW0gZXJyb3InLCAgICAgICAgLyogWl9TVFJFQU1fRVJST1IgICgtMikgKi9cbiAgJy0zJzogICAnZGF0YSBlcnJvcicsICAgICAgICAgIC8qIFpfREFUQV9FUlJPUiAgICAoLTMpICovXG4gICctNCc6ICAgJ2luc3VmZmljaWVudCBtZW1vcnknLCAvKiBaX01FTV9FUlJPUiAgICAgKC00KSAqL1xuICAnLTUnOiAgICdidWZmZXIgZXJyb3InLCAgICAgICAgLyogWl9CVUZfRVJST1IgICAgICgtNSkgKi9cbiAgJy02JzogICAnaW5jb21wYXRpYmxlIHZlcnNpb24nIC8qIFpfVkVSU0lPTl9FUlJPUiAoLTYpICovXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8qIGVzbGludC1kaXNhYmxlIHNwYWNlLXVuYXJ5LW9wcyAqL1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLy92YXIgWl9GSUxURVJFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0hVRkZNQU5fT05MWSAgICAgID0gMjtcbi8vdmFyIFpfUkxFICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG4vL3ZhciBaX0RFRkFVTFRfU1RSQVRFR1kgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xudmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG52YXIgWl9URVhUICAgICAgICAgICAgICAgID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuZnVuY3Rpb24gemVybyhidWYpIHsgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgtLWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfSB9XG5cbi8vIEZyb20genV0aWwuaFxuXG52YXIgU1RPUkVEX0JMT0NLID0gMDtcbnZhciBTVEFUSUNfVFJFRVMgPSAxO1xudmFyIERZTl9UUkVFUyAgICA9IDI7XG4vKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqL1xuXG52YXIgTUlOX01BVENIICAgID0gMztcbnZhciBNQVhfTUFUQ0ggICAgPSAyNTg7XG4vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovXG5cbi8vIEZyb20gZGVmbGF0ZS5oXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLlxuICovXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cblxudmFyIExfQ09ERVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7XG4vKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG5cbnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cblxudmFyIE1BWF9CSVRTICAgICAgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgQnVmX3NpemUgICAgICA9IDE2O1xuLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqL1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RhbnRzXG4gKi9cblxudmFyIE1BWF9CTF9CSVRTID0gNztcbi8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi9cblxudmFyIEVORF9CTE9DSyAgID0gMjU2O1xuLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqL1xuXG52YXIgUkVQXzNfNiAgICAgPSAxNjtcbi8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfM18xMCAgID0gMTc7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfMTFfMTM4ID0gMTg7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xudmFyIGV4dHJhX2xiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdO1xuXG52YXIgZXh0cmFfZGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqL1xuICBbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM107XG5cbnZhciBleHRyYV9ibGJpdHMgPSAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi9cbiAgWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddO1xuXG52YXIgYmxfb3JkZXIgPVxuICBbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07XG4vKiBlc2xpbnQtZW5hYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG5cbi8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmdcbiAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLlxuICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS5cbiAqL1xuXG4vLyBXZSBwcmUtZmlsbCBhcnJheXMgd2l0aCAwIHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgZ2Fwc1xuXG52YXIgRElTVF9DT0RFX0xFTiA9IDUxMjsgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovXG5cbi8vICEhISEgVXNlIGZsYXQgYXJyYXkgaW5zdGVhZCBvZiBzdHJ1Y3R1cmUsIEZyZXEgPSBpKjIsIExlbiA9IGkqMisxXG52YXIgc3RhdGljX2x0cmVlICA9IG5ldyBBcnJheSgoTF9DT0RFUyArIDIpICogMik7XG56ZXJvKHN0YXRpY19sdHJlZSk7XG4vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBub1xuICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXJcbiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdFxuICogYmVsb3cpLlxuICovXG5cbnZhciBzdGF0aWNfZHRyZWUgID0gbmV3IEFycmF5KERfQ09ERVMgKiAyKTtcbnplcm8oc3RhdGljX2R0cmVlKTtcbi8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2VcbiAqIDUgYml0cy4pXG4gKi9cblxudmFyIF9kaXN0X2NvZGUgICAgPSBuZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7XG56ZXJvKF9kaXN0X2NvZGUpO1xuLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlc1xuICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZlxuICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuXG4gKi9cblxudmFyIF9sZW5ndGhfY29kZSAgPSBuZXcgQXJyYXkoTUFYX01BVENIIC0gTUlOX01BVENIICsgMSk7XG56ZXJvKF9sZW5ndGhfY29kZSk7XG4vKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2xlbmd0aCAgID0gbmV3IEFycmF5KExFTkdUSF9DT0RFUyk7XG56ZXJvKGJhc2VfbGVuZ3RoKTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2Rpc3QgICAgID0gbmV3IEFycmF5KERfQ09ERVMpO1xuemVybyhiYXNlX2Rpc3QpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi9cblxuXG5mdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHtcblxuICB0aGlzLnN0YXRpY190cmVlICA9IHN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2JpdHMgICA9IGV4dHJhX2JpdHM7ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iYXNlICAgPSBleHRyYV9iYXNlOyAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi9cbiAgdGhpcy5lbGVtcyAgICAgICAgPSBlbGVtczsgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi9cbiAgdGhpcy5tYXhfbGVuZ3RoICAgPSBtYXhfbGVuZ3RoOyAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi9cblxuICAvLyBzaG93IGlmIGBzdGF0aWNfdHJlZWAgaGFzIGRhdGEgb3IgZHVtbXkgLSBuZWVkZWQgZm9yIG1vbm9tb3JwaGljIG9iamVjdHNcbiAgdGhpcy5oYXNfc3RyZWUgICAgPSBzdGF0aWNfdHJlZSAmJiBzdGF0aWNfdHJlZS5sZW5ndGg7XG59XG5cblxudmFyIHN0YXRpY19sX2Rlc2M7XG52YXIgc3RhdGljX2RfZGVzYztcbnZhciBzdGF0aWNfYmxfZGVzYztcblxuXG5mdW5jdGlvbiBUcmVlRGVzYyhkeW5fdHJlZSwgc3RhdF9kZXNjKSB7XG4gIHRoaXMuZHluX3RyZWUgPSBkeW5fdHJlZTsgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi9cbiAgdGhpcy5tYXhfY29kZSA9IDA7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHRoaXMuc3RhdF9kZXNjID0gc3RhdF9kZXNjOyAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovXG59XG5cblxuXG5mdW5jdGlvbiBkX2NvZGUoZGlzdCkge1xuICByZXR1cm4gZGlzdCA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NiArIChkaXN0ID4+PiA3KV07XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS5cbiAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0X3Nob3J0KHMsIHcpIHtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodykgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy5cbiAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLlxuICovXG5mdW5jdGlvbiBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkge1xuICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7XG4gIH0gZWxzZSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHtcbiAgc2VuZF9iaXRzKHMsIHRyZWVbYyAqIDJdLyouQ29kZSovLCB0cmVlW2MgKiAyICsgMV0vKi5MZW4qLyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlclxuICogbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKVxuICogSU4gYXNzZXJ0aW9uOiAxIDw9IGxlbiA8PSAxNVxuICovXG5mdW5jdGlvbiBiaV9yZXZlcnNlKGNvZGUsIGxlbikge1xuICB2YXIgcmVzID0gMDtcbiAgZG8ge1xuICAgIHJlcyB8PSBjb2RlICYgMTtcbiAgICBjb2RlID4+Pj0gMTtcbiAgICByZXMgPDw9IDE7XG4gIH0gd2hpbGUgKC0tbGVuID4gMCk7XG4gIHJldHVybiByZXMgPj4+IDE7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC5cbiAqL1xuZnVuY3Rpb24gYmlfZmx1c2gocykge1xuICBpZiAocy5iaV92YWxpZCA9PT0gMTYpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gMDtcbiAgICBzLmJpX3ZhbGlkID0gMDtcblxuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPj0gOCkge1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWYgJiAweGZmO1xuICAgIHMuYmlfYnVmID4+PSA4O1xuICAgIHMuYmlfdmFsaWQgLT0gODtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGhcbiAqIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kXG4gKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZVxuICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLlxuICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpc1xuICogICAgIG5vdCBudWxsLlxuICovXG5mdW5jdGlvbiBnZW5fYml0bGVuKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICAgICAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgbWF4X2NvZGUgICAgICAgID0gZGVzYy5tYXhfY29kZTtcbiAgdmFyIHN0cmVlICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZXh0cmEgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYml0cztcbiAgdmFyIGJhc2UgICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2U7XG4gIHZhciBtYXhfbGVuZ3RoICAgICAgPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoO1xuICB2YXIgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi9cbiAgdmFyIG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoICovXG4gIHZhciB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqL1xuICB2YXIgZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqL1xuICB2YXIgb3ZlcmZsb3cgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovXG5cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heVxuICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS5cbiAgICovXG4gIHRyZWVbcy5oZWFwW3MuaGVhcF9tYXhdICogMiArIDFdLyouTGVuKi8gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovXG5cbiAgZm9yIChoID0gcy5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykge1xuICAgIG4gPSBzLmhlYXBbaF07XG4gICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdLyouRGFkKi8gKiAyICsgMV0vKi5MZW4qLyArIDE7XG4gICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSB7XG4gICAgICBiaXRzID0gbWF4X2xlbmd0aDtcbiAgICAgIG92ZXJmbG93Kys7XG4gICAgfVxuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqL1xuXG4gICAgaWYgKG4gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfSAvKiBub3QgYSBsZWFmIG5vZGUgKi9cblxuICAgIHMuYmxfY291bnRbYml0c10rKztcbiAgICB4Yml0cyA9IDA7XG4gICAgaWYgKG4gPj0gYmFzZSkge1xuICAgICAgeGJpdHMgPSBleHRyYVtuIC0gYmFzZV07XG4gICAgfVxuICAgIGYgPSB0cmVlW24gKiAyXS8qLkZyZXEqLztcbiAgICBzLm9wdF9sZW4gKz0gZiAqIChiaXRzICsgeGJpdHMpO1xuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiArPSBmICogKHN0cmVlW24gKiAyICsgMV0vKi5MZW4qLyArIHhiaXRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKG92ZXJmbG93ID09PSAwKSB7IHJldHVybjsgfVxuXG4gIC8vIFRyYWNlKChzdGRlcnIsXCJcXG5iaXQgbGVuZ3RoIG92ZXJmbG93XFxuXCIpKTtcbiAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi9cblxuICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqL1xuICBkbyB7XG4gICAgYml0cyA9IG1heF9sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzLmJsX2NvdW50W2JpdHNdID09PSAwKSB7IGJpdHMtLTsgfVxuICAgIHMuYmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi9cbiAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovXG4gICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tO1xuICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsXG4gICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdXG4gICAgICovXG4gICAgb3ZlcmZsb3cgLT0gMjtcbiAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTtcblxuICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGxcbiAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW5cbiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pXG4gICAqL1xuICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9PSAwOyBiaXRzLS0pIHtcbiAgICBuID0gcy5ibF9jb3VudFtiaXRzXTtcbiAgICB3aGlsZSAobiAhPT0gMCkge1xuICAgICAgbSA9IHMuaGVhcFstLWhdO1xuICAgICAgaWYgKG0gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfVxuICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovICE9PSBiaXRzKSB7XG4gICAgICAgIC8vIFRyYWNlKChzdGRlcnIsXCJjb2RlICVkIGJpdHMgJWQtPiVkXFxuXCIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7XG4gICAgICAgIHMub3B0X2xlbiArPSAoYml0cyAtIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovKSAqIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgICAgICB0cmVlW20gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgICB9XG4gICAgICBuLS07XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmVcbiAqIG9wdGltYWwpLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3JcbiAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vblxuICogICAgIHplcm8gY29kZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpXG4vLyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4vLyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovXG57XG4gIHZhciBuZXh0X2NvZGUgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi9cbiAgdmFyIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqL1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovXG5cbiAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzXG4gICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLlxuICAgKi9cbiAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cyAtIDFdKSA8PCAxO1xuICB9XG4gIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGVcbiAgICogbXVzdCBiZSBhbGwgb25lcy5cbiAgICovXG4gIC8vQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLFxuICAvLyAgICAgICAgXCJpbmNvbnNpc3RlbnQgYml0IGNvdW50c1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgXCIsIG1heF9jb2RlKSk7XG5cbiAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIHZhciBsZW4gPSB0cmVlW24gKiAyICsgMV0vKi5MZW4qLztcbiAgICBpZiAobGVuID09PSAwKSB7IGNvbnRpbnVlOyB9XG4gICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi9cbiAgICB0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTtcblxuICAgIC8vVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVycixcIlxcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgXCIsXG4gICAgLy8gICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuXG4gKi9cbmZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkge1xuICB2YXIgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovXG4gIHZhciBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovXG4gIHZhciBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqL1xuICB2YXIgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovXG4gIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvLyBkbyBjaGVjayBpbiBfdHJfaW5pdCgpXG4gIC8vaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjtcblxuICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovXG4vKiNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSU1xuICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlO1xuICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0cztcbiAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTtcbiAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7XG4gIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7XG4jZW5kaWYqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi9cbiAgbGVuZ3RoID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyAtIDE7IGNvZGUrKykge1xuICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoO1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9sYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChsZW5ndGggPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2XCIpO1xuICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZFxuICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZVxuICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6XG4gICAqL1xuICBfbGVuZ3RoX2NvZGVbbGVuZ3RoIC0gMV0gPSBjb2RlO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqL1xuICBkaXN0ID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IDE2OyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NlwiKTtcbiAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovXG4gIGZvciAoOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCAoZXh0cmFfZGJpdHNbY29kZV0gLSA3KSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTJcIik7XG5cbiAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqL1xuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICBuID0gMDtcbiAgd2hpbGUgKG4gPD0gMTQzKSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjU1KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDk7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzldKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjc5KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDc7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzddKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjg3KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlXG4gICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZVxuICAgKiBhbGwgb25lcylcbiAgICovXG4gIGdlbl9jb2RlcyhzdGF0aWNfbHRyZWUsIExfQ09ERVMgKyAxLCBibF9jb3VudCk7XG5cbiAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovXG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gNTtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuLCA1KTtcbiAgfVxuXG4gIC8vIE5vdyBkYXRhIHJlYWR5IGFuZCB3ZSBjYW4gaW5pdCBzdGF0aWMgdHJlZXNcbiAgc3RhdGljX2xfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUyArIDEsIExfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2RfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfZHRyZWUsIGV4dHJhX2RiaXRzLCAwLCAgICAgICAgICBEX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19ibF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKG5ldyBBcnJheSgwKSwgZXh0cmFfYmxiaXRzLCAwLCAgICAgICAgIEJMX0NPREVTLCBNQVhfQkxfQklUUyk7XG5cbiAgLy9zdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGluaXRfYmxvY2socykge1xuICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovXG4gIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSB7IHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7ICBuKyspIHsgcy5keW5fZHRyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgeyBzLmJsX3RyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuXG4gIHMuZHluX2x0cmVlW0VORF9CTE9DSyAqIDJdLyouRnJlcSovID0gMTtcbiAgcy5vcHRfbGVuID0gcy5zdGF0aWNfbGVuID0gMDtcbiAgcy5sYXN0X2xpdCA9IHMubWF0Y2hlcyA9IDA7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciBhbmQgYWxpZ24gdGhlIG91dHB1dCBvbiBhIGJ5dGUgYm91bmRhcnlcbiAqL1xuZnVuY3Rpb24gYmlfd2luZHVwKHMpXG57XG4gIGlmIChzLmJpX3ZhbGlkID4gOCkge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHtcbiAgICAvL3B1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjtcbiAgfVxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgYSBzdG9yZWQgYmxvY2ssIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzXG4gKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovXG4vL3Vuc2lnbmVkIGxlbjsgICAgIC8qIGl0cyBsZW5ndGggKi9cbi8vaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovXG57XG4gIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi9cblxuICBpZiAoaGVhZGVyKSB7XG4gICAgcHV0X3Nob3J0KHMsIGxlbik7XG4gICAgcHV0X3Nob3J0KHMsIH5sZW4pO1xuICB9XG4vLyAgd2hpbGUgKGxlbi0tKSB7XG4vLyAgICBwdXRfYnl0ZShzLCAqYnVmKyspO1xuLy8gIH1cbiAgdXRpbHMuYXJyYXlTZXQocy5wZW5kaW5nX2J1Ziwgcy53aW5kb3csIGJ1ZiwgbGVuLCBzLnBlbmRpbmcpO1xuICBzLnBlbmRpbmcgKz0gbGVuO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuXG4gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc21hbGxlcih0cmVlLCBuLCBtLCBkZXB0aCkge1xuICB2YXIgX24yID0gbiAqIDI7XG4gIHZhciBfbTIgPSBtICogMjtcbiAgcmV0dXJuICh0cmVlW19uMl0vKi5GcmVxKi8gPCB0cmVlW19tMl0vKi5GcmVxKi8gfHxcbiAgICAgICAgICh0cmVlW19uMl0vKi5GcmVxKi8gPT09IHRyZWVbX20yXS8qLkZyZXEqLyAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLFxuICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmdcbiAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHNcbiAqIHR3byBzb25zKS5cbiAqL1xuZnVuY3Rpb24gcHFkb3duaGVhcChzLCB0cmVlLCBrKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovXG4vLyAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqL1xue1xuICB2YXIgdiA9IHMuaGVhcFtrXTtcbiAgdmFyIGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovXG4gIHdoaWxlIChqIDw9IHMuaGVhcF9sZW4pIHtcbiAgICAvKiBTZXQgaiB0byB0aGUgc21hbGxlc3Qgb2YgdGhlIHR3byBzb25zOiAqL1xuICAgIGlmIChqIDwgcy5oZWFwX2xlbiAmJlxuICAgICAgc21hbGxlcih0cmVlLCBzLmhlYXBbaiArIDFdLCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7XG4gICAgICBqKys7XG4gICAgfVxuICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovXG4gICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgcy5oZWFwW2pdLCBzLmRlcHRoKSkgeyBicmVhazsgfVxuXG4gICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi9cbiAgICBzLmhlYXBba10gPSBzLmhlYXBbal07XG4gICAgayA9IGo7XG5cbiAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovXG4gICAgaiA8PD0gMTtcbiAgfVxuICBzLmhlYXBba10gPSB2O1xufVxuXG5cbi8vIGlubGluZWQgbWFudWFsbHlcbi8vIHZhciBTTUFMTEVTVCA9IDE7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzX2Jsb2NrKHMsIGx0cmVlLCBkdHJlZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjb25zdCBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovXG4vLyAgICBjb25zdCBjdF9kYXRhICpkdHJlZTsgLyogZGlzdGFuY2UgdHJlZSAqL1xue1xuICB2YXIgZGlzdDsgICAgICAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovXG4gIHZhciBseCA9IDA7ICAgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqL1xuICB2YXIgY29kZTsgICAgICAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi9cbiAgdmFyIGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovXG5cbiAgaWYgKHMubGFzdF9saXQgIT09IDApIHtcbiAgICBkbyB7XG4gICAgICBkaXN0ID0gKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMl0gPDwgOCkgfCAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyICsgMV0pO1xuICAgICAgbGMgPSBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBseF07XG4gICAgICBseCsrO1xuXG4gICAgICBpZiAoZGlzdCA9PT0gMCkge1xuICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgICAvL1RyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsXCIgJyVjJyBcIiwgbGMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107XG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlICsgTElURVJBTFMgKyAxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOyAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqL1xuICAgICAgICB9XG4gICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpO1xuICAgICAgICAvL0Fzc2VydCAoY29kZSA8IERfQ09ERVMsIFwiYmFkIGRfY29kZVwiKTtcblxuICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqL1xuICAgICAgICB9XG4gICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovXG5cbiAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovXG4gICAgICAvL0Fzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsXG4gICAgICAvLyAgICAgICBcInBlbmRpbmdCdWYgb3ZlcmZsb3dcIik7XG5cbiAgICB9IHdoaWxlIChseCA8IHMubGFzdF9saXQpO1xuICB9XG5cbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgbHRyZWUpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuXG4gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aFxuICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzXG4gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LlxuICovXG5mdW5jdGlvbiBidWlsZF90cmVlKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBzdHJlZSAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZWxlbXMgICAgPSBkZXNjLnN0YXRfZGVzYy5lbGVtcztcbiAgdmFyIG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovXG4gIHZhciBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdmFyIG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi9cblxuICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluXG4gICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLlxuICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcy5oZWFwX2xlbiA9IDA7XG4gIHMuaGVhcF9tYXggPSBIRUFQX1NJWkU7XG5cbiAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHtcbiAgICBpZiAodHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuO1xuICAgICAgcy5kZXB0aFtuXSA9IDA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsXG4gICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZVxuICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdFxuICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LlxuICAgKi9cbiAgd2hpbGUgKHMuaGVhcF9sZW4gPCAyKSB7XG4gICAgbm9kZSA9IHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTtcbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IDE7XG4gICAgcy5kZXB0aFtub2RlXSA9IDA7XG4gICAgcy5vcHRfbGVuLS07XG5cbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZSAqIDIgKyAxXS8qLkxlbiovO1xuICAgIH1cbiAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi9cbiAgfVxuICBkZXNjLm1heF9jb2RlID0gbWF4X2NvZGU7XG5cbiAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLFxuICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczpcbiAgICovXG4gIGZvciAobiA9IChzLmhlYXBfbGVuID4+IDEvKmludCAvMiovKTsgbiA+PSAxOyBuLS0pIHsgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsgfVxuXG4gIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d29cbiAgICogZnJlcXVlbnQgbm9kZXMuXG4gICAqL1xuICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi9cbiAgZG8ge1xuICAgIC8vcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi9cbiAgICAvKioqIHBxcmVtb3ZlICoqKi9cbiAgICBuID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IHMuaGVhcFtzLmhlYXBfbGVuLS1dO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG4gICAgLyoqKi9cblxuICAgIG0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovXG5cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi9cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07XG5cbiAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqL1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gdHJlZVtuICogMl0vKi5GcmVxKi8gKyB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICBzLmRlcHRoW25vZGVdID0gKHMuZGVwdGhbbl0gPj0gcy5kZXB0aFttXSA/IHMuZGVwdGhbbl0gOiBzLmRlcHRoW21dKSArIDE7XG4gICAgdHJlZVtuICogMiArIDFdLyouRGFkKi8gPSB0cmVlW20gKiAyICsgMV0vKi5EYWQqLyA9IG5vZGU7XG5cbiAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqL1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IG5vZGUrKztcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuXG4gIH0gd2hpbGUgKHMuaGVhcF9sZW4gPj0gMik7XG5cbiAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG5cbiAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vd1xuICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuXG4gICAqL1xuICBnZW5fYml0bGVuKHMsIGRlc2MpO1xuXG4gIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi9cbiAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXNcbiAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHNjYW5fdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0vKi5MZW4qLzsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cbiAgdHJlZVsobWF4X2NvZGUgKyAxKSAqIDIgKyAxXS8qLkxlbiovID0gMHhmZmZmOyAvKiBndWFyZCAqL1xuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLyArPSBjb3VudDtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG5cbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHsgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovKys7IH1cbiAgICAgIHMuYmxfdHJlZVtSRVBfM182ICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzNfMTAgKiAyXS8qLkZyZXEqLysrO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzExXzEzOCAqIDJdLyouRnJlcSovKys7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG5cbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW5cbiAqIGJsX3RyZWUuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi9cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPT0gMCk7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgICBjb3VudC0tO1xuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCBcIiAzXzY/XCIpO1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAyKTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8xMV8xMzgsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluXG4gKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7XG4gIHZhciBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gIHNjYW5fdHJlZShzLCBzLmR5bl9sdHJlZSwgcy5sX2Rlc2MubWF4X2NvZGUpO1xuICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTtcblxuICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqL1xuICBidWlsZF90cmVlKHMsIHMuYmxfZGVzYyk7XG4gIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHRcbiAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy5cbiAgICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0XG4gICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzXG4gICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LilcbiAgICovXG4gIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyAtIDE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHtcbiAgICBpZiAocy5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XSAqIDIgKyAxXS8qLkxlbiovICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi9cbiAgcy5vcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkXCIsXG4gIC8vICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgcmV0dXJuIG1heF9ibGluZGV4O1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlXG4gKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS5cbiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC5cbiAqL1xuZnVuY3Rpb24gc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgaW50IGxjb2RlcywgZGNvZGVzLCBibGNvZGVzOyAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqL1xue1xuICB2YXIgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovXG5cbiAgLy9Bc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCBcIm5vdCBlbm91Z2ggY29kZXNcIik7XG4gIC8vQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLFxuICAvLyAgICAgICAgXCJ0b28gbWFueSBjb2Rlc1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb3VudHM6IFwiKSk7XG4gIHNlbmRfYml0cyhzLCBsY29kZXMgLSAyNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgc2VuZF9iaXRzKHMsIGRjb2RlcyAtIDEsICAgNSk7XG4gIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHtcbiAgICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvZGUgJTJkIFwiLCBibF9vcmRlcltyYW5rXSkpO1xuICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFua10gKiAyICsgMV0vKi5MZW4qLywgMyk7XG4gIH1cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fbHRyZWUsIGxjb2RlcyAtIDEpOyAvKiBsaXRlcmFsIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2R0cmVlLCBkY29kZXMgLSAxKTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTpcbiAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDpcbiAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwiYmxhY2sgbGlzdFwiICgwLi42LCAxNC4uMjUsIDI4Li4zMSkuXG4gKiAgICBiKSBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgcHJpbnRhYmxlIGNoYXJhY3RlciBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcIndoaXRlIGxpc3RcIiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuXG4gKiAtIEJJTkFSWSBvdGhlcndpc2UuXG4gKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGFcbiAqICAgXCJncmF5IGxpc3RcIiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOlxuICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdF9kYXRhX3R5cGUocykge1xuICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXNcbiAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxXG4gICAqIDB4ZjNmZmMwN2YgPSBiaW5hcnkgMTExMTAwMTExMTExMTExMTExMDAwMDAwMDExMTExMTFcbiAgICovXG4gIHZhciBibGFja19tYXNrID0gMHhmM2ZmYzA3ZjtcbiAgdmFyIG47XG5cbiAgLyogQ2hlY2sgZm9yIG5vbi10ZXh0dWFsIChcImJsYWNrLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkge1xuICAgIGlmICgoYmxhY2tfbWFzayAmIDEpICYmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApKSB7XG4gICAgICByZXR1cm4gWl9CSU5BUlk7XG4gICAgfVxuICB9XG5cbiAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKFwid2hpdGUtbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBpZiAocy5keW5fbHRyZWVbOSAqIDJdLyouRnJlcSovICE9PSAwIHx8IHMuZHluX2x0cmVlWzEwICogMl0vKi5GcmVxKi8gIT09IDAgfHxcbiAgICAgIHMuZHluX2x0cmVlWzEzICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICByZXR1cm4gWl9URVhUO1xuICB9XG4gIGZvciAobiA9IDMyOyBuIDwgTElURVJBTFM7IG4rKykge1xuICAgIGlmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHJldHVybiBaX1RFWFQ7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlcmUgYXJlIG5vIFwiYmxhY2stbGlzdGVkXCIgb3IgXCJ3aGl0ZS1saXN0ZWRcIiBieXRlczpcbiAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKFwiZ3JheS1saXN0ZWRcIikgYnl0ZXMgb25seS5cbiAgICovXG4gIHJldHVybiBaX0JJTkFSWTtcbn1cblxuXG52YXIgc3RhdGljX2luaXRfZG9uZSA9IGZhbHNlO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gX3RyX2luaXQocylcbntcblxuICBpZiAoIXN0YXRpY19pbml0X2RvbmUpIHtcbiAgICB0cl9zdGF0aWNfaW5pdCgpO1xuICAgIHN0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xuICB9XG5cbiAgcy5sX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2x0cmVlLCBzdGF0aWNfbF9kZXNjKTtcbiAgcy5kX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2R0cmVlLCBzdGF0aWNfZF9kZXNjKTtcbiAgcy5ibF9kZXNjID0gbmV3IFRyZWVEZXNjKHMuYmxfdHJlZSwgc3RhdGljX2JsX2Rlc2MpO1xuXG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovXG4gIGluaXRfYmxvY2socyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgc3RvcmVkIGJsb2NrXG4gKi9cbmZ1bmN0aW9uIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi9cbiAgY29weV9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIHRydWUpOyAvKiB3aXRoIGhlYWRlciAqL1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS5cbiAqIFRoaXMgdGFrZXMgMTAgYml0cywgb2Ygd2hpY2ggNyBtYXkgcmVtYWluIGluIHRoZSBiaXQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBfdHJfYWxpZ24ocykge1xuICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTIDw8IDEsIDMpO1xuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpO1xuICBiaV9mbHVzaChzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpY1xuICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLlxuICovXG5mdW5jdGlvbiBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgdmFyIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgIC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi9cbiAgdmFyIG1heF9ibGluZGV4ID0gMDsgICAgICAgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovXG4gIGlmIChzLmxldmVsID4gMCkge1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi9cbiAgICBpZiAocy5zdHJtLmRhdGFfdHlwZSA9PT0gWl9VTktOT1dOKSB7XG4gICAgICBzLnN0cm0uZGF0YV90eXBlID0gZGV0ZWN0X2RhdGFfdHlwZShzKTtcbiAgICB9XG5cbiAgICAvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gICAgYnVpbGRfdHJlZShzLCBzLmxfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcblxuICAgIGJ1aWxkX3RyZWUocywgcy5kX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZlxuICAgICAqIHRoZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEsIGV4Y2x1ZGluZyB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMuXG4gICAgICovXG5cbiAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleFxuICAgICAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLlxuICAgICAqL1xuICAgIG1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTtcblxuICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSB0aGUgYmxvY2sgbGVuZ3RocyBpbiBieXRlcy4gKi9cbiAgICBvcHRfbGVuYiA9IChzLm9wdF9sZW4gKyAzICsgNykgPj4+IDM7XG4gICAgc3RhdGljX2xlbmIgPSAocy5zdGF0aWNfbGVuICsgMyArIDcpID4+PiAzO1xuXG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgXCIsXG4gICAgLy8gICAgICAgIG9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgcy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbixcbiAgICAvLyAgICAgICAgcy0+bGFzdF9saXQpKTtcblxuICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgeyBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOyB9XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBBc3NlcnQoYnVmICE9IChjaGFyKikwLCBcImxvc3QgYnVmXCIpO1xuICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxvY2sgKi9cbiAgfVxuXG4gIGlmICgoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIpICYmIChidWYgIT09IC0xKSkge1xuICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi9cblxuICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuXG4gICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZVxuICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlblxuICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0b1xuICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suXG4gICAgICovXG4gICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpO1xuXG4gIH0gZWxzZSBpZiAocy5zdHJhdGVneSA9PT0gWl9GSVhFRCB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHtcblxuICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTtcblxuICB9IGVsc2Uge1xuICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMubF9kZXNjLm1heF9jb2RlICsgMSwgcy5kX2Rlc2MubWF4X2NvZGUgKyAxLCBtYXhfYmxpbmRleCArIDEpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHMuZHluX2x0cmVlLCBzLmR5bl9kdHJlZSk7XG4gIH1cbiAgLy8gQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsIFwiYmFkIGNvbXByZXNzZWQgc2l6ZVwiKTtcbiAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUJcbiAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuXG4gICAqL1xuICBpbml0X2Jsb2NrKHMpO1xuXG4gIGlmIChsYXN0KSB7XG4gICAgYmlfd2luZHVwKHMpO1xuICB9XG4gIC8vIFRyYWNldigoc3RkZXJyLFwiXFxuY29tcHJsZW4gJWx1KCVsdSkgXCIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLFxuICAvLyAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWZcbiAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gX3RyX3RhbGx5KHMsIGRpc3QsIGxjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuLy8gICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovXG57XG4gIC8vdmFyIG91dF9sZW5ndGgsIGluX2xlbmd0aCwgZGNvZGU7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdICAgICA9IChkaXN0ID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMHhmZjtcblxuICBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBzLmxhc3RfbGl0XSA9IGxjICYgMHhmZjtcbiAgcy5sYXN0X2xpdCsrO1xuXG4gIGlmIChkaXN0ID09PSAwKSB7XG4gICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovXG4gICAgcy5keW5fbHRyZWVbbGMgKiAyXS8qLkZyZXEqLysrO1xuICB9IGVsc2Uge1xuICAgIHMubWF0Y2hlcysrO1xuICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICBkaXN0LS07ICAgICAgICAgICAgIC8qIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAvL0Fzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmXG4gICAgLy8gICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJlxuICAgIC8vICAgICAgICh1c2gpZF9jb2RlKGRpc3QpIDwgKHVzaClEX0NPREVTLCAgXCJfdHJfdGFsbHk6IGJhZCBtYXRjaFwiKTtcblxuICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdICsgTElURVJBTFMgKyAxKSAqIDJdLyouRnJlcSovKys7XG4gICAgcy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpICogMl0vKi5GcmVxKi8rKztcbiAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuXG4vLyNpZmRlZiBUUlVOQ0FURV9CTE9DS1xuLy8gIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqL1xuLy8gIGlmICgocy5sYXN0X2xpdCAmIDB4MWZmZikgPT09IDAgJiYgcy5sZXZlbCA+IDIpIHtcbi8vICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqL1xuLy8gICAgb3V0X2xlbmd0aCA9IHMubGFzdF9saXQqODtcbi8vICAgIGluX2xlbmd0aCA9IHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0O1xuLy9cbi8vICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHtcbi8vICAgICAgb3V0X2xlbmd0aCArPSBzLmR5bl9kdHJlZVtkY29kZSoyXS8qLkZyZXEqLyAqICg1ICsgZXh0cmFfZGJpdHNbZGNvZGVdKTtcbi8vICAgIH1cbi8vICAgIG91dF9sZW5ndGggPj4+PSAzO1xuLy8gICAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSBcIixcbi8vICAgIC8vICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsXG4vLyAgICAvLyAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpO1xuLy8gICAgaWYgKHMubWF0Y2hlcyA8IChzLmxhc3RfbGl0Pj4xKS8qaW50IC8yKi8gJiYgb3V0X2xlbmd0aCA8IChpbl9sZW5ndGg+PjEpLyppbnQgLzIqLykge1xuLy8gICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgIH1cbi8vICB9XG4vLyNlbmRpZlxuXG4gIHJldHVybiAocy5sYXN0X2xpdCA9PT0gcy5saXRfYnVmc2l6ZSAtIDEpO1xuICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEtcbiAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG9cbiAgICogNjRLLTEgYnl0ZXMuXG4gICAqL1xufVxuXG5leHBvcnRzLl90cl9pbml0ICA9IF90cl9pbml0O1xuZXhwb3J0cy5fdHJfc3RvcmVkX2Jsb2NrID0gX3RyX3N0b3JlZF9ibG9jaztcbmV4cG9ydHMuX3RyX2ZsdXNoX2Jsb2NrICA9IF90cl9mbHVzaF9ibG9jaztcbmV4cG9ydHMuX3RyX3RhbGx5ID0gX3RyX3RhbGx5O1xuZXhwb3J0cy5fdHJfYWxpZ24gPSBfdHJfYWxpZ247XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gWlN0cmVhbSgpIHtcbiAgLyogbmV4dCBpbnB1dCBieXRlICovXG4gIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9pbiA9IDA7XG4gIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgaW5wdXQgKi9cbiAgdGhpcy5hdmFpbF9pbiA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX2luID0gMDtcbiAgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovXG4gIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfb3V0ID0gMDtcbiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovXG4gIHRoaXMuYXZhaWxfb3V0ID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9vdXQgPSAwO1xuICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi9cbiAgdGhpcy5tc2cgPSAnJy8qWl9OVUxMKi87XG4gIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqL1xuICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqL1xuICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovO1xuICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqL1xuICB0aGlzLmFkbGVyID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBaU3RyZWFtO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9icm93c2VyL1BhcnNlLmpzJyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy50cmFjayA9IHRyYWNrO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuLyoqXG4gKiBQYXJzZS5BbmFseXRpY3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIFBhcnNlJ3MgbG9nZ2luZyBhbmQgYW5hbHl0aWNzXG4gKiBiYWNrZW5kLlxuICpcbiAqIEBjbGFzcyBQYXJzZS5BbmFseXRpY3NcbiAqIEBzdGF0aWNcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqL1xuXG4vKipcbiAqIFRyYWNrcyB0aGUgb2NjdXJyZW5jZSBvZiBhIGN1c3RvbSBldmVudCB3aXRoIGFkZGl0aW9uYWwgZGltZW5zaW9ucy5cbiAqIFBhcnNlIHdpbGwgc3RvcmUgYSBkYXRhIHBvaW50IGF0IHRoZSB0aW1lIG9mIGludm9jYXRpb24gd2l0aCB0aGUgZ2l2ZW5cbiAqIGV2ZW50IG5hbWUuXG4gKlxuICogRGltZW5zaW9ucyB3aWxsIGFsbG93IHNlZ21lbnRhdGlvbiBvZiB0aGUgb2NjdXJyZW5jZXMgb2YgdGhpcyBjdXN0b21cbiAqIGV2ZW50LiBLZXlzIGFuZCB2YWx1ZXMgc2hvdWxkIGJlIHtAY29kZSBTdHJpbmd9cywgYW5kIHdpbGwgdGhyb3dcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBUbyB0cmFjayBhIHVzZXIgc2lnbnVwIGFsb25nIHdpdGggYWRkaXRpb25hbCBtZXRhZGF0YSwgY29uc2lkZXIgdGhlXG4gKiBmb2xsb3dpbmc6XG4gKiA8cHJlPlxuICogdmFyIGRpbWVuc2lvbnMgPSB7XG4gKiAgZ2VuZGVyOiAnbScsXG4gKiAgc291cmNlOiAnd2ViJyxcbiAqICBkYXlUeXBlOiAnd2Vla2VuZCdcbiAqIH07XG4gKiBQYXJzZS5BbmFseXRpY3MudHJhY2soJ3NpZ251cCcsIGRpbWVuc2lvbnMpO1xuICogPC9wcmU+XG4gKlxuICogVGhlcmUgaXMgYSBkZWZhdWx0IGxpbWl0IG9mIDggZGltZW5zaW9ucyBwZXIgZXZlbnQgdHJhY2tlZC5cbiAqXG4gKiBAZnVuY3Rpb24gdHJhY2tcbiAqIEBuYW1lIFBhcnNlLkFuYWx5dGljcy50cmFja1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBldmVudCB0byByZXBvcnQgdG8gUGFyc2UgYXNcbiAqIGhhdmluZyBoYXBwZW5lZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBkaW1lbnNpb25zIFRoZSBkaWN0aW9uYXJ5IG9mIGluZm9ybWF0aW9uIGJ5IHdoaWNoIHRvXG4gKiBzZWdtZW50IHRoaXMgZXZlbnQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgcm91bmQtdHJpcFxuICogdG8gdGhlIHNlcnZlciBjb21wbGV0ZXMuXG4gKi9cbmZ1bmN0aW9uIHRyYWNrKG5hbWUsIGRpbWVuc2lvbnMpIHtcbiAgbmFtZSA9IG5hbWUgfHwgJyc7XG4gIG5hbWUgPSBuYW1lLnJlcGxhY2UoL15cXHMqLywgJycpO1xuICBuYW1lID0gbmFtZS5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbiAgaWYgKG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBuYW1lIGZvciB0aGUgY3VzdG9tIGV2ZW50IG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBkaW1lbnNpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkaW1lbnNpb25zW2tleV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0cmFjaygpIGRpbWVuc2lvbnMgZXhwZWN0cyBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBcInN0cmluZ1wiLicpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QW5hbHl0aWNzQ29udHJvbGxlcigpLnRyYWNrKG5hbWUsIGRpbWVuc2lvbnMpO1xufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIHRyYWNrKG5hbWUsIGRpbWVuc2lvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnZXZlbnRzLycgKyBuYW1lLCB7XG4gICAgICBkaW1lbnNpb25zXG4gICAgfSk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRBbmFseXRpY3NDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9QYXJzZVVzZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlVXNlclwiKSk7XG52YXIgX3V1aWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V1aWRcIikpO1xubGV0IHJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBQcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIEFub255bW91c2x5IGxvZ2dlZC1pbiB1c2Vycy4gPGJyIC8+XG4gKiBBbm9ueW1vdXMgdXNlcnMgaGF2ZSBzb21lIHVuaXF1ZSBjaGFyYWN0ZXJpc3RpY3M6XG4gKiA8dWw+XG4gKiAgPGxpPkFub255bW91cyB1c2VycyBkb24ndCBuZWVkIGEgdXNlciBuYW1lIG9yIHBhc3N3b3JkLjwvbGk+XG4gKiAgPHVsPlxuICogICAgPGxpPk9uY2UgbG9nZ2VkIG91dCwgYW4gYW5vbnltb3VzIHVzZXIgY2Fubm90IGJlIHJlY292ZXJlZC48L2xpPlxuICogIDwvdWw+XG4gKiAgPGxpPnNpZ25VcCBjb252ZXJ0cyBhbiBhbm9ueW1vdXMgdXNlciB0byBhIHN0YW5kYXJkIHVzZXIgd2l0aCB0aGUgZ2l2ZW4gdXNlcm5hbWUgYW5kIHBhc3N3b3JkLjwvbGk+XG4gKiAgPHVsPlxuICogICAgPGxpPkRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbm9ueW1vdXMgdXNlciBpcyByZXRhaW5lZC48L2xpPlxuICogIDwvdWw+XG4gKiAgPGxpPmxvZ0luIHN3aXRjaGVzIHVzZXJzIHdpdGhvdXQgY29udmVydGluZyB0aGUgYW5vbnltb3VzIHVzZXIuPC9saT5cbiAqICA8dWw+XG4gKiAgICA8bGk+RGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFub255bW91cyB1c2VyIHdpbGwgYmUgbG9zdC48L2xpPlxuICogIDwvdWw+XG4gKiAgPGxpPlNlcnZpY2UgbG9nSW4gKGUuZy4gRmFjZWJvb2ssIFR3aXR0ZXIpIHdpbGwgYXR0ZW1wdCB0byBjb252ZXJ0XG4gKiAgdGhlIGFub255bW91cyB1c2VyIGludG8gYSBzdGFuZGFyZCB1c2VyIGJ5IGxpbmtpbmcgaXQgdG8gdGhlIHNlcnZpY2UuPC9saT5cbiAqICA8dWw+XG4gKiAgICA8bGk+SWYgYSB1c2VyIGFscmVhZHkgZXhpc3RzIHRoYXQgaXMgbGlua2VkIHRvIHRoZSBzZXJ2aWNlLCBpdCB3aWxsIGluc3RlYWQgc3dpdGNoIHRvIHRoZSBleGlzdGluZyB1c2VyLjwvbGk+XG4gKiAgPC91bD5cbiAqICA8bGk+U2VydmljZSBsaW5raW5nIChlLmcuIEZhY2Vib29rLCBUd2l0dGVyKSB3aWxsIGNvbnZlcnQgdGhlIGFub255bW91cyB1c2VyXG4gKiAgaW50byBhIHN0YW5kYXJkIHVzZXIgYnkgbGlua2luZyBpdCB0byB0aGUgc2VydmljZS48L2xpPlxuICogPC91bD5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuQW5vbnltb3VzVXRpbHNcbiAqIEBzdGF0aWNcbiAqL1xuY29uc3QgQW5vbnltb3VzVXRpbHMgPSB7XG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZWlyIGFjY291bnQgbGlua2VkIHRvIGFub255bW91cyB1c2VyLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gaXNMaW5rZWRcbiAgICogQG5hbWUgUGFyc2UuQW5vbnltb3VzVXRpbHMuaXNMaW5rZWRcbiAgICogQHBhcmFtIHtQYXJzZS5Vc2VyfSB1c2VyIFVzZXIgdG8gY2hlY2sgZm9yLlxuICAgKiAgICAgVGhlIHVzZXIgbXVzdCBiZSBsb2dnZWQgaW4gb24gdGhpcyBkZXZpY2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBoYXMgdGhlaXIgYWNjb3VudFxuICAgKiAgICAgbGlua2VkIHRvIGFuIGFub255bW91cyB1c2VyLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBpc0xpbmtlZCh1c2VyKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLl9nZXRBdXRoUHJvdmlkZXIoKTtcbiAgICByZXR1cm4gdXNlci5faXNMaW5rZWQocHJvdmlkZXIuZ2V0QXV0aFR5cGUoKSk7XG4gIH0sXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciBBbm9ueW1vdXNseS5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGxvZ0luXG4gICAqIEBuYW1lIFBhcnNlLkFub255bW91c1V0aWxzLmxvZ0luXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE1hc3RlcktleSAvIFNlc3Npb25Ub2tlbi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IExvZ2dlZCBpbiB1c2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGxvZ0luKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuX2dldEF1dGhQcm92aWRlcigpO1xuICAgIHJldHVybiBfUGFyc2VVc2VyLmRlZmF1bHQubG9nSW5XaXRoKHByb3ZpZGVyLmdldEF1dGhUeXBlKCksIHByb3ZpZGVyLmdldEF1dGhEYXRhKCksIG9wdGlvbnMpO1xuICB9LFxuICAvKipcbiAgICogTGlua3MgQW5vbnltb3VzIFVzZXIgdG8gYW4gZXhpc3RpbmcgUEZVc2VyLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbGlua1xuICAgKiBAbmFtZSBQYXJzZS5Bbm9ueW1vdXNVdGlscy5saW5rXG4gICAqIEBwYXJhbSB7UGFyc2UuVXNlcn0gdXNlciBVc2VyIHRvIGxpbmsuIFRoaXMgbXVzdCBiZSB0aGUgY3VycmVudCB1c2VyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBNYXN0ZXJLZXkgLyBTZXNzaW9uVG9rZW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBMaW5rZWQgd2l0aCBVc2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGxpbmsodXNlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5fZ2V0QXV0aFByb3ZpZGVyKCk7XG4gICAgcmV0dXJuIHVzZXIubGlua1dpdGgocHJvdmlkZXIuZ2V0QXV0aFR5cGUoKSwgcHJvdmlkZXIuZ2V0QXV0aERhdGEoKSwgb3B0aW9ucyk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgQXV0aGVudGljYXRpb24gUHJvdmlkZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCBmb3IgdXNlLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gaXNSZWdpc3RlcmVkXG4gICAqIEBuYW1lIFBhcnNlLkFub255bW91c1V0aWxzLmlzUmVnaXN0ZXJlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgaXNSZWdpc3RlcmVkKCkge1xuICAgIHJldHVybiByZWdpc3RlcmVkO1xuICB9LFxuICBfZ2V0QXV0aFByb3ZpZGVyKCkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0ge1xuICAgICAgcmVzdG9yZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBnZXRBdXRoVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuICdhbm9ueW1vdXMnO1xuICAgICAgfSxcbiAgICAgIGdldEF1dGhEYXRhKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGF1dGhEYXRhOiB7XG4gICAgICAgICAgICBpZDogKDAsIF91dWlkLmRlZmF1bHQpKClcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoIXJlZ2lzdGVyZWQpIHtcbiAgICAgIF9QYXJzZVVzZXIuZGVmYXVsdC5fcmVnaXN0ZXJBdXRoZW50aWNhdGlvblByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICAgIHJlZ2lzdGVyZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcHJvdmlkZXI7XG4gIH1cbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBBbm9ueW1vdXNVdGlsczsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRKb2JTdGF0dXMgPSBnZXRKb2JTdGF0dXM7XG5leHBvcnRzLmdldEpvYnNEYXRhID0gZ2V0Sm9ic0RhdGE7XG5leHBvcnRzLnJ1biA9IHJ1bjtcbmV4cG9ydHMuc3RhcnRKb2IgPSBzdGFydEpvYjtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfZGVjb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9lbmNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVF1ZXJ5XCIpKTtcbi8qKlxuICogQ29udGFpbnMgZnVuY3Rpb25zIGZvciBjYWxsaW5nIGFuZCBkZWNsYXJpbmdcbiAqIDxhIGhyZWY9XCIvZG9jcy9jbG91ZF9jb2RlX2d1aWRlI2Z1bmN0aW9uc1wiPmNsb3VkIGZ1bmN0aW9uczwvYT4uXG4gKiA8cD48c3Ryb25nPjxlbT5cbiAqICAgU29tZSBmdW5jdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGZyb20gQ2xvdWQgQ29kZS5cbiAqIDwvZW0+PC9zdHJvbmc+PC9wPlxuICpcbiAqIEBjbGFzcyBQYXJzZS5DbG91ZFxuICogQHN0YXRpY1xuICogQGhpZGVjb25zdHJ1Y3RvclxuICovXG5cbi8qKlxuICogTWFrZXMgYSBjYWxsIHRvIGEgY2xvdWQgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIHJ1blxuICogQG5hbWUgUGFyc2UuQ2xvdWQucnVuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVuY3Rpb24gbmFtZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIFRoZSBwYXJhbWV0ZXJzIHRvIHNlbmQgdG8gdGhlIGNsb3VkIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdFxuICogb2YgdGhlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBydW4obmFtZSwgZGF0YSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nsb3VkIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgfVxuICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHt9O1xuICBpZiAob3B0aW9ucy51c2VNYXN0ZXJLZXkpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgfVxuICBpZiAob3B0aW9ucy5zZXNzaW9uVG9rZW4pIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgfVxuICBpZiAob3B0aW9ucy5pbnN0YWxsYXRpb25JZCkge1xuICAgIHJlcXVlc3RPcHRpb25zLmluc3RhbGxhdGlvbklkID0gb3B0aW9ucy5pbnN0YWxsYXRpb25JZDtcbiAgfVxuICBpZiAob3B0aW9ucy5jb250ZXh0ICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgfVxuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q2xvdWRDb250cm9sbGVyKCkucnVuKG5hbWUsIGRhdGEsIHJlcXVlc3RPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBHZXRzIGRhdGEgZm9yIHRoZSBjdXJyZW50IHNldCBvZiBjbG91ZCBqb2JzLlxuICpcbiAqIEBmdW5jdGlvbiBnZXRKb2JzRGF0YVxuICogQG5hbWUgUGFyc2UuQ2xvdWQuZ2V0Sm9ic0RhdGFcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdFxuICogb2YgdGhlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBnZXRKb2JzRGF0YSgpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENsb3VkQ29udHJvbGxlcigpLmdldEpvYnNEYXRhKHtcbiAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgfSk7XG59XG5cbi8qKlxuICogU3RhcnRzIGEgZ2l2ZW4gY2xvdWQgam9iLCB3aGljaCB3aWxsIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQGZ1bmN0aW9uIHN0YXJ0Sm9iXG4gKiBAbmFtZSBQYXJzZS5DbG91ZC5zdGFydEpvYlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIGZ1bmN0aW9uIG5hbWUuXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YSBUaGUgcGFyYW1ldGVycyB0byBzZW5kIHRvIHRoZSBjbG91ZCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIGpvYlN0YXR1c0lkXG4gKiBvZiB0aGUgam9iLlxuICovXG5mdW5jdGlvbiBzdGFydEpvYihuYW1lLCBkYXRhKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDbG91ZCBqb2IgbmFtZSBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICB9XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDbG91ZENvbnRyb2xsZXIoKS5zdGFydEpvYihuYW1lLCBkYXRhLCB7XG4gICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldHMgam9iIHN0YXR1cyBieSBJZFxuICpcbiAqIEBmdW5jdGlvbiBnZXRKb2JTdGF0dXNcbiAqIEBuYW1lIFBhcnNlLkNsb3VkLmdldEpvYlN0YXR1c1xuICogQHBhcmFtIHtzdHJpbmd9IGpvYlN0YXR1c0lkIFRoZSBJZCBvZiBKb2IgU3RhdHVzLlxuICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gU3RhdHVzIG9mIEpvYi5cbiAqL1xuZnVuY3Rpb24gZ2V0Sm9iU3RhdHVzKGpvYlN0YXR1c0lkKSB7XG4gIGNvbnN0IHF1ZXJ5ID0gbmV3IF9QYXJzZVF1ZXJ5LmRlZmF1bHQoJ19Kb2JTdGF0dXMnKTtcbiAgcmV0dXJuIHF1ZXJ5LmdldChqb2JTdGF0dXNJZCwge1xuICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICB9KTtcbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBydW4obmFtZSwgZGF0YSwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwYXlsb2FkID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkoZGF0YSwgdHJ1ZSk7XG4gICAgY29uc3QgcmVxdWVzdCA9IFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnZnVuY3Rpb25zLycgKyBuYW1lLCBwYXlsb2FkLCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmVxdWVzdC50aGVuKHJlcyA9PiB7XG4gICAgICBpZiAodHlwZW9mIHJlcyA9PT0gJ29iamVjdCcgJiYgKDAsIF9rZXlzLmRlZmF1bHQpKHJlcykubGVuZ3RoID4gMCAmJiAhcmVzLmhhc093blByb3BlcnR5KCdyZXN1bHQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfSlNPTiwgJ1RoZSBzZXJ2ZXIgcmV0dXJuZWQgYW4gaW52YWxpZCByZXNwb25zZS4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY29kZWQgPSAoMCwgX2RlY29kZS5kZWZhdWx0KShyZXMpO1xuICAgICAgaWYgKGRlY29kZWQgJiYgZGVjb2RlZC5oYXNPd25Qcm9wZXJ0eSgncmVzdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShkZWNvZGVkLnJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH0sXG4gIGdldEpvYnNEYXRhKG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICdjbG91ZF9jb2RlL2pvYnMvZGF0YScsIG51bGwsIG9wdGlvbnMpO1xuICB9LFxuICBhc3luYyBzdGFydEpvYihuYW1lLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBheWxvYWQgPSAoMCwgX2VuY29kZS5kZWZhdWx0KShkYXRhLCB0cnVlKTtcbiAgICBvcHRpb25zLnJldHVyblN0YXR1cyA9IHRydWU7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2pvYnMvJyArIG5hbWUsIHBheWxvYWQsIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXNwb25zZS5faGVhZGVycz8uWydYLVBhcnNlLUpvYi1TdGF0dXMtSWQnXTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldENsb3VkQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xuLyoqIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1uYXRpdmUtYXN5bmMtc3RvcmFnZS9hc3luYy1zdG9yYWdlL2Jsb2IvbWFpbi9wYWNrYWdlcy9kZWZhdWx0LXN0b3JhZ2UtYmFja2VuZC9zcmMvdHlwZXMudHMgKi9cblxuY29uc3QgY29uZmlnID0ge1xuICBJU19OT0RFOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgISFwcm9jZXNzLnZlcnNpb25zICYmICEhcHJvY2Vzcy52ZXJzaW9ucy5ub2RlICYmICFwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uLFxuICBSRVFVRVNUX0FUVEVNUFRfTElNSVQ6IDUsXG4gIFJFUVVFU1RfQkFUQ0hfU0laRTogMjAsXG4gIFJFUVVFU1RfSEVBREVSUzoge30sXG4gIFNFUlZFUl9VUkw6ICdodHRwczovL2FwaS5wYXJzZS5jb20vMScsXG4gIFNFUlZFUl9BVVRIX1RZUEU6IG51bGwsXG4gIFNFUlZFUl9BVVRIX1RPS0VOOiBudWxsLFxuICBMSVZFUVVFUllfU0VSVkVSX1VSTDogbnVsbCxcbiAgRU5DUllQVEVEX0tFWTogbnVsbCxcbiAgVkVSU0lPTjogJ2pzJyArIFwiNS4zLjBcIixcbiAgQVBQTElDQVRJT05fSUQ6IG51bGwsXG4gIEpBVkFTQ1JJUFRfS0VZOiBudWxsLFxuICBNQVNURVJfS0VZOiBudWxsLFxuICBVU0VfTUFTVEVSX0tFWTogZmFsc2UsXG4gIFBFUkZPUk1fVVNFUl9SRVdSSVRFOiB0cnVlLFxuICBGT1JDRV9SRVZPQ0FCTEVfU0VTU0lPTjogZmFsc2UsXG4gIEVOQ1JZUFRFRF9VU0VSOiBmYWxzZSxcbiAgSURFTVBPVEVOQ1k6IGZhbHNlLFxuICBBTExPV19DVVNUT01fT0JKRUNUX0lEOiBmYWxzZSxcbiAgUEFSU0VfRVJST1JTOiBbXVxufTtcbmZ1bmN0aW9uIHJlcXVpcmVNZXRob2RzKG5hbWUsIG1ldGhvZHMsIGNvbnRyb2xsZXIpIHtcbiAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKG1ldGhvZHMpLmNhbGwobWV0aG9kcywgZnVuYyA9PiB7XG4gICAgaWYgKHR5cGVvZiBjb250cm9sbGVyW2Z1bmNdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX0gbXVzdCBpbXBsZW1lbnQgJHtmdW5jfSgpYCk7XG4gICAgfVxuICB9KTtcbn1cbmNvbnN0IENvcmVNYW5hZ2VyID0ge1xuICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHJldHVybiBjb25maWdba2V5XTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb25maWd1cmF0aW9uIGtleSBub3QgZm91bmQ6ICcgKyBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgY29uZmlnW2tleV0gPSB2YWx1ZTtcbiAgfSxcbiAgc2V0SWZOZWVkZWQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgaWYgKCFjb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgY29uZmlnW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZ1trZXldO1xuICB9LFxuICAvKiBTcGVjaWFsaXplZCBDb250cm9sbGVyIFNldHRlcnMvR2V0dGVycyAqL1xuXG4gIHNldEFuYWx5dGljc0NvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdBbmFseXRpY3NDb250cm9sbGVyJywgWyd0cmFjayddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0FuYWx5dGljc0NvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldEFuYWx5dGljc0NvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snQW5hbHl0aWNzQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRDbG91ZENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdDbG91ZENvbnRyb2xsZXInLCBbJ3J1bicsICdnZXRKb2JzRGF0YScsICdzdGFydEpvYiddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0Nsb3VkQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0Q2xvdWRDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0Nsb3VkQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRDb25maWdDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnQ29uZmlnQ29udHJvbGxlcicsIFsnY3VycmVudCcsICdnZXQnLCAnc2F2ZSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0NvbmZpZ0NvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldENvbmZpZ0NvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snQ29uZmlnQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRDcnlwdG9Db250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnQ3J5cHRvQ29udHJvbGxlcicsIFsnZW5jcnlwdCcsICdkZWNyeXB0J10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snQ3J5cHRvQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0Q3J5cHRvQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydDcnlwdG9Db250cm9sbGVyJ107XG4gIH0sXG4gIHNldEV2ZW50RW1pdHRlcihldmVudEVtaXR0ZXIpIHtcbiAgICBjb25maWdbJ0V2ZW50RW1pdHRlciddID0gZXZlbnRFbWl0dGVyO1xuICB9LFxuICBnZXRFdmVudEVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snRXZlbnRFbWl0dGVyJ107XG4gIH0sXG4gIHNldEZpbGVDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnRmlsZUNvbnRyb2xsZXInLCBbJ3NhdmVGaWxlJywgJ3NhdmVCYXNlNjQnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydGaWxlQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgc2V0RXZlbnR1YWxseVF1ZXVlKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnRXZlbnR1YWxseVF1ZXVlJywgWydwb2xsJywgJ3NhdmUnLCAnZGVzdHJveSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0V2ZW50dWFsbHlRdWV1ZSddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0RXZlbnR1YWxseVF1ZXVlKCkge1xuICAgIHJldHVybiBjb25maWdbJ0V2ZW50dWFsbHlRdWV1ZSddO1xuICB9LFxuICBnZXRGaWxlQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydGaWxlQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnSW5zdGFsbGF0aW9uQ29udHJvbGxlcicsIFsnY3VycmVudEluc3RhbGxhdGlvbklkJywgJ2N1cnJlbnRJbnN0YWxsYXRpb24nLCAndXBkYXRlSW5zdGFsbGF0aW9uT25EaXNrJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snSW5zdGFsbGF0aW9uQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydJbnN0YWxsYXRpb25Db250cm9sbGVyJ107XG4gIH0sXG4gIHNldExpdmVRdWVyeShsaXZlUXVlcnkpIHtcbiAgICBjb25maWdbJ0xpdmVRdWVyeSddID0gbGl2ZVF1ZXJ5O1xuICB9LFxuICBnZXRMaXZlUXVlcnkoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snTGl2ZVF1ZXJ5J107XG4gIH0sXG4gIHNldE9iamVjdENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdPYmplY3RDb250cm9sbGVyJywgWydzYXZlJywgJ2ZldGNoJywgJ2Rlc3Ryb3knXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydPYmplY3RDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRPYmplY3RDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ09iamVjdENvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnT2JqZWN0U3RhdGVDb250cm9sbGVyJywgWydnZXRTdGF0ZScsICdpbml0aWFsaXplU3RhdGUnLCAncmVtb3ZlU3RhdGUnLCAnZ2V0U2VydmVyRGF0YScsICdzZXRTZXJ2ZXJEYXRhJywgJ2dldFBlbmRpbmdPcHMnLCAnc2V0UGVuZGluZ09wJywgJ3B1c2hQZW5kaW5nU3RhdGUnLCAncG9wUGVuZGluZ1N0YXRlJywgJ21lcmdlRmlyc3RQZW5kaW5nU3RhdGUnLCAnZ2V0T2JqZWN0Q2FjaGUnLCAnZXN0aW1hdGVBdHRyaWJ1dGUnLCAnZXN0aW1hdGVBdHRyaWJ1dGVzJywgJ2NvbW1pdFNlcnZlckNoYW5nZXMnLCAnZW5xdWV1ZVRhc2snLCAnY2xlYXJBbGxTdGF0ZSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ09iamVjdFN0YXRlQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ09iamVjdFN0YXRlQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRQdXNoQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1B1c2hDb250cm9sbGVyJywgWydzZW5kJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snUHVzaENvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFB1c2hDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1B1c2hDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldFF1ZXJ5Q29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1F1ZXJ5Q29udHJvbGxlcicsIFsnZmluZCcsICdhZ2dyZWdhdGUnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydRdWVyeUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFF1ZXJ5Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydRdWVyeUNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0UkVTVENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdSRVNUQ29udHJvbGxlcicsIFsncmVxdWVzdCcsICdhamF4J10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snUkVTVENvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFJFU1RDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1JFU1RDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldFNjaGVtYUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdTY2hlbWFDb250cm9sbGVyJywgWydnZXQnLCAnY3JlYXRlJywgJ3VwZGF0ZScsICdkZWxldGUnLCAnc2VuZCcsICdwdXJnZSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ1NjaGVtYUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFNjaGVtYUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snU2NoZW1hQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRTZXNzaW9uQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1Nlc3Npb25Db250cm9sbGVyJywgWydnZXRTZXNzaW9uJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snU2Vzc2lvbkNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFNlc3Npb25Db250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1Nlc3Npb25Db250cm9sbGVyJ107XG4gIH0sXG4gIHNldFN0b3JhZ2VDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYykge1xuICAgICAgcmVxdWlyZU1ldGhvZHMoJ0FuIGFzeW5jIFN0b3JhZ2VDb250cm9sbGVyJywgWydnZXRJdGVtQXN5bmMnLCAnc2V0SXRlbUFzeW5jJywgJ3JlbW92ZUl0ZW1Bc3luYycsICdnZXRBbGxLZXlzQXN5bmMnXSwgY29udHJvbGxlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVpcmVNZXRob2RzKCdBIHN5bmNocm9ub3VzIFN0b3JhZ2VDb250cm9sbGVyJywgWydnZXRJdGVtJywgJ3NldEl0ZW0nLCAncmVtb3ZlSXRlbScsICdnZXRBbGxLZXlzJ10sIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBjb25maWdbJ1N0b3JhZ2VDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBzZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXInLCBbJ3BpbldpdGhOYW1lJywgJ2Zyb21QaW5XaXRoTmFtZScsICd1blBpbldpdGhOYW1lJywgJ2dldEFsbENvbnRlbnRzJywgJ2NsZWFyJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldExvY2FsRGF0YXN0b3JlKHN0b3JlKSB7XG4gICAgY29uZmlnWydMb2NhbERhdGFzdG9yZSddID0gc3RvcmU7XG4gIH0sXG4gIGdldExvY2FsRGF0YXN0b3JlKCkge1xuICAgIHJldHVybiBjb25maWdbJ0xvY2FsRGF0YXN0b3JlJ107XG4gIH0sXG4gIGdldFN0b3JhZ2VDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1N0b3JhZ2VDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldEFzeW5jU3RvcmFnZShzdG9yYWdlKSB7XG4gICAgY29uZmlnWydBc3luY1N0b3JhZ2UnXSA9IHN0b3JhZ2U7XG4gIH0sXG4gIGdldEFzeW5jU3RvcmFnZSgpIHtcbiAgICByZXR1cm4gY29uZmlnWydBc3luY1N0b3JhZ2UnXTtcbiAgfSxcbiAgc2V0V2ViU29ja2V0Q29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgY29uZmlnWydXZWJTb2NrZXRDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRXZWJTb2NrZXRDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1dlYlNvY2tldENvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0VXNlckNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdVc2VyQ29udHJvbGxlcicsIFsnc2V0Q3VycmVudFVzZXInLCAnY3VycmVudFVzZXInLCAnY3VycmVudFVzZXJBc3luYycsICdzaWduVXAnLCAnbG9nSW4nLCAnYmVjb21lJywgJ2xvZ091dCcsICdtZScsICdyZXF1ZXN0UGFzc3dvcmRSZXNldCcsICd1cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uJywgJ3JlcXVlc3RFbWFpbFZlcmlmaWNhdGlvbicsICd2ZXJpZnlQYXNzd29yZCcsICdsaW5rV2l0aCddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ1VzZXJDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRVc2VyQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydVc2VyQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRMaXZlUXVlcnlDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnTGl2ZVF1ZXJ5Q29udHJvbGxlcicsIFsnc2V0RGVmYXVsdExpdmVRdWVyeUNsaWVudCcsICdnZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50JywgJ19jbGVhckNhY2hlZERlZmF1bHRDbGllbnQnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydMaXZlUXVlcnlDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRMaXZlUXVlcnlDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0xpdmVRdWVyeUNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0SG9va3NDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnSG9va3NDb250cm9sbGVyJywgWydjcmVhdGUnLCAnZ2V0JywgJ3VwZGF0ZScsICdyZW1vdmUnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydIb29rc0NvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldEhvb2tzQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydIb29rc0NvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0UGFyc2VPcChvcCkge1xuICAgIGNvbmZpZ1snUGFyc2VPcCddID0gb3A7XG4gIH0sXG4gIGdldFBhcnNlT3AoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUGFyc2VPcCddO1xuICB9LFxuICBzZXRQYXJzZU9iamVjdChvYmplY3QpIHtcbiAgICBjb25maWdbJ1BhcnNlT2JqZWN0J10gPSBvYmplY3Q7XG4gIH0sXG4gIGdldFBhcnNlT2JqZWN0KCkge1xuICAgIHJldHVybiBjb25maWdbJ1BhcnNlT2JqZWN0J107XG4gIH0sXG4gIHNldFBhcnNlUXVlcnkocXVlcnkpIHtcbiAgICBjb25maWdbJ1BhcnNlUXVlcnknXSA9IHF1ZXJ5O1xuICB9LFxuICBnZXRQYXJzZVF1ZXJ5KCkge1xuICAgIHJldHVybiBjb25maWdbJ1BhcnNlUXVlcnknXTtcbiAgfSxcbiAgc2V0UGFyc2VSb2xlKHJvbGUpIHtcbiAgICBjb25maWdbJ1BhcnNlUm9sZSddID0gcm9sZTtcbiAgfSxcbiAgZ2V0UGFyc2VSb2xlKCkge1xuICAgIHJldHVybiBjb25maWdbJ1BhcnNlUm9sZSddO1xuICB9LFxuICBzZXRQYXJzZVVzZXIodXNlcikge1xuICAgIGNvbmZpZ1snUGFyc2VVc2VyJ10gPSB1c2VyO1xuICB9LFxuICBnZXRQYXJzZVVzZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUGFyc2VVc2VyJ107XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IENvcmVNYW5hZ2VyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gQ29yZU1hbmFnZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG5sZXQgQUVTO1xubGV0IEVOQztcbkFFUyA9IHJlcXVpcmUoJ2NyeXB0by1qcy9hZXMnKTtcbkVOQyA9IHJlcXVpcmUoJ2NyeXB0by1qcy9lbmMtdXRmOCcpO1xuY29uc3QgQ3J5cHRvQ29udHJvbGxlciA9IHtcbiAgZW5jcnlwdChvYmosIHNlY3JldEtleSkge1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IEFFUy5lbmNyeXB0KCgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKG9iaiksIHNlY3JldEtleSk7XG4gICAgcmV0dXJuIGVuY3J5cHRlZC50b1N0cmluZygpO1xuICB9LFxuICBkZWNyeXB0KGVuY3J5cHRlZFRleHQsIHNlY3JldEtleSkge1xuICAgIGNvbnN0IGRlY3J5cHRlZFN0ciA9IEFFUy5kZWNyeXB0KGVuY3J5cHRlZFRleHQsIHNlY3JldEtleSkudG9TdHJpbmcoRU5DKTtcbiAgICByZXR1cm4gZGVjcnlwdGVkU3RyO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBDcnlwdG9Db250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gQ3J5cHRvQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vKipcbiAqIFRoaXMgaXMgYSBzaW1wbGUgd3JhcHBlciB0byB1bmlmeSBFdmVudEVtaXR0ZXIgaW1wbGVtZW50YXRpb25zIGFjcm9zcyBwbGF0Zm9ybXMuXG4gKi9cblxubGV0IEV2ZW50RW1pdHRlcjtcbnRyeSB7XG4gIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbn0gY2F0Y2ggKF8pIHtcbiAgLy8gRXZlbnRFbWl0dGVyIHVuYXZhaWxhYmxlXG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEV2ZW50RW1pdHRlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfc3BsaWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zcGxpY2VcIikpO1xudmFyIF9maW5kSW5kZXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbmQtaW5kZXhcIikpO1xudmFyIF9zZXRJbnRlcnZhbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC1pbnRlcnZhbFwiKSk7XG52YXIgX2ZpbmQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbmRcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBfUGFyc2VRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VRdWVyeVwiKSk7XG52YXIgX1N0b3JhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VcIikpO1xuY29uc3QgUVVFVUVfS0VZID0gJ1BhcnNlL0V2ZW50dWFsbHkvUXVldWUnO1xubGV0IHF1ZXVlQ2FjaGUgPSBbXTtcbmxldCBkaXJ0eUNhY2hlID0gdHJ1ZTtcbmxldCBwb2xsaW5nID0gdW5kZWZpbmVkO1xuXG4vKipcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIHF1ZXVlIG9iamVjdHMgdGhhdCB3aWxsIGJlXG4gKiBzYXZlZCB0byB0aGUgc2VydmVyIGF0IGEgbGF0ZXIgZGF0ZS5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuRXZlbnR1YWxseVF1ZXVlXG4gKiBAc3RhdGljXG4gKi9cbmNvbnN0IEV2ZW50dWFsbHlRdWV1ZSA9IHtcbiAgLyoqXG4gICAqIEFkZCBvYmplY3QgdG8gcXVldWUgd2l0aCBzYXZlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGZ1bmN0aW9uIHNhdmVcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLnNhdmVcbiAgICogQHBhcmFtIHtQYXJzZU9iamVjdH0gb2JqZWN0IFBhcnNlLk9iamVjdCB0byBiZSBzYXZlZCBldmVudHVhbGx5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbc2VydmVyT3B0aW9uc10gU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLk9iamVjdC5odG1sI3NhdmUgUGFyc2UuT2JqZWN0LnNhdmV9IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgaWYgb2JqZWN0IGlzIGFkZGVkIHRvIHF1ZXVlLlxuICAgKiBAc3RhdGljXG4gICAqIEBzZWUgUGFyc2UuT2JqZWN0I3NhdmVFdmVudHVhbGx5XG4gICAqL1xuICBzYXZlKG9iamVjdCkge1xuICAgIGxldCBzZXJ2ZXJPcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlKCdzYXZlJywgb2JqZWN0LCBzZXJ2ZXJPcHRpb25zKTtcbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBvYmplY3QgdG8gcXVldWUgd2l0aCBzYXZlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGRlc3Ryb3lcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLmRlc3Ryb3lcbiAgICogQHBhcmFtIHtQYXJzZU9iamVjdH0gb2JqZWN0IFBhcnNlLk9iamVjdCB0byBiZSBkZXN0cm95ZWQgZXZlbnR1YWxseVxuICAgKiBAcGFyYW0ge29iamVjdH0gW3NlcnZlck9wdGlvbnNdIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5PYmplY3QuaHRtbCNkZXN0cm95IFBhcnNlLk9iamVjdC5kZXN0cm95fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgaWYgb2JqZWN0IGlzIGFkZGVkIHRvIHF1ZXVlLlxuICAgKiBAc3RhdGljXG4gICAqIEBzZWUgUGFyc2UuT2JqZWN0I2Rlc3Ryb3lFdmVudHVhbGx5XG4gICAqL1xuICBkZXN0cm95KG9iamVjdCkge1xuICAgIGxldCBzZXJ2ZXJPcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlKCdkZXN0cm95Jywgb2JqZWN0LCBzZXJ2ZXJPcHRpb25zKTtcbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlIHVuaXF1ZSBpZGVudGlmaWVyIHRvIGF2b2lkIGR1cGxpY2F0ZXMgYW5kIG1haW50YWluIHByZXZpb3VzIHN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIHNhdmUgLyBkZXN0cm95XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgUGFyc2UuT2JqZWN0IHRvIGJlIHF1ZXVlZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKiBAc3RhdGljXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdlbmVyYXRlUXVldWVJZChhY3Rpb24sIG9iamVjdCkge1xuICAgIG9iamVjdC5fZ2V0SWQoKTtcbiAgICBjb25zdCB7XG4gICAgICBjbGFzc05hbWUsXG4gICAgICBpZCxcbiAgICAgIF9sb2NhbElkXG4gICAgfSA9IG9iamVjdDtcbiAgICBjb25zdCB1bmlxdWVJZCA9IG9iamVjdC5nZXQoJ2hhc2gnKSB8fCBfbG9jYWxJZDtcbiAgICByZXR1cm4gW2FjdGlvbiwgY2xhc3NOYW1lLCBpZCwgdW5pcXVlSWRdLmpvaW4oJ18nKTtcbiAgfSxcbiAgLyoqXG4gICAqIEJ1aWxkIHF1ZXVlIG9iamVjdCBhbmQgYWRkIHRvIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIHNhdmUgLyBkZXN0cm95XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgUGFyc2UuT2JqZWN0IHRvIGJlIHF1ZXVlZFxuICAgKiBAcGFyYW0ge29iamVjdH0gW3NlcnZlck9wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgaWYgb2JqZWN0IGlzIGFkZGVkIHRvIHF1ZXVlLlxuICAgKiBAc3RhdGljXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGFzeW5jIGVucXVldWUoYWN0aW9uLCBvYmplY3QsIHNlcnZlck9wdGlvbnMpIHtcbiAgICBjb25zdCBxdWV1ZURhdGEgPSBhd2FpdCB0aGlzLmdldFF1ZXVlKCk7XG4gICAgY29uc3QgcXVldWVJZCA9IHRoaXMuZ2VuZXJhdGVRdWV1ZUlkKGFjdGlvbiwgb2JqZWN0KTtcbiAgICBsZXQgaW5kZXggPSB0aGlzLnF1ZXVlSXRlbUV4aXN0cyhxdWV1ZURhdGEsIHF1ZXVlSWQpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAvLyBBZGQgY2FjaGVkIHZhbHVlcyB0byBuZXcgb2JqZWN0IGlmIHRoZXkgZG9uJ3QgZXhpc3RcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBxdWV1ZURhdGFbaW5kZXhdLm9iamVjdCkge1xuICAgICAgICBpZiAodHlwZW9mIG9iamVjdC5nZXQocHJvcCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgb2JqZWN0LnNldChwcm9wLCBxdWV1ZURhdGFbaW5kZXhdLm9iamVjdFtwcm9wXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXggPSBxdWV1ZURhdGEubGVuZ3RoO1xuICAgIH1cbiAgICBxdWV1ZURhdGFbaW5kZXhdID0ge1xuICAgICAgcXVldWVJZCxcbiAgICAgIGFjdGlvbixcbiAgICAgIG9iamVjdDogb2JqZWN0LnRvSlNPTigpLFxuICAgICAgc2VydmVyT3B0aW9ucyxcbiAgICAgIGlkOiBvYmplY3QuaWQsXG4gICAgICBjbGFzc05hbWU6IG9iamVjdC5jbGFzc05hbWUsXG4gICAgICBoYXNoOiBvYmplY3QuZ2V0KCdoYXNoJyksXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKClcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNldFF1ZXVlKHF1ZXVlRGF0YSk7XG4gIH0sXG4gIHN0b3JlKGRhdGEpIHtcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMoUVVFVUVfS0VZLCAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShkYXRhKSk7XG4gIH0sXG4gIGxvYWQoKSB7XG4gICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKFFVRVVFX0tFWSk7XG4gIH0sXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbi1tZW1vcnkgcXVldWUgZnJvbSBsb2NhbCBzdG9yYWdlIGFuZCByZXR1cm5zLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0UXVldWVcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLmdldFF1ZXVlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFF1ZXVlT2JqZWN0W10+fVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBhc3luYyBnZXRRdWV1ZSgpIHtcbiAgICBpZiAoZGlydHlDYWNoZSkge1xuICAgICAgcXVldWVDYWNoZSA9IEpTT04ucGFyc2UoKGF3YWl0IHRoaXMubG9hZCgpKSB8fCAnW10nKTtcbiAgICAgIGRpcnR5Q2FjaGUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXVlQ2FjaGU7XG4gIH0sXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgcXVldWUgdG8gbG9jYWwgc3RvcmFnZVxuICAgKlxuICAgKiBAcGFyYW0ge1F1ZXVlfSBxdWV1ZSBRdWV1ZSBjb250YWluaW5nIFBhcnNlLk9iamVjdCBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gcXVldWUgaXMgc3RvcmVkLlxuICAgKiBAc3RhdGljXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHNldFF1ZXVlKHF1ZXVlKSB7XG4gICAgcXVldWVDYWNoZSA9IHF1ZXVlO1xuICAgIHJldHVybiB0aGlzLnN0b3JlKHF1ZXVlQ2FjaGUpO1xuICB9LFxuICAvKipcbiAgICogUmVtb3ZlcyBQYXJzZS5PYmplY3QgZGF0YSBmcm9tIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVldWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgUGFyc2UuT2JqZWN0IGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiBxdWV1ZSBpcyBzdG9yZWQuXG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlKHF1ZXVlSWQpIHtcbiAgICBjb25zdCBxdWV1ZURhdGEgPSBhd2FpdCB0aGlzLmdldFF1ZXVlKCk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnF1ZXVlSXRlbUV4aXN0cyhxdWV1ZURhdGEsIHF1ZXVlSWQpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAoMCwgX3NwbGljZS5kZWZhdWx0KShxdWV1ZURhdGEpLmNhbGwocXVldWVEYXRhLCBpbmRleCwgMSk7XG4gICAgICBhd2FpdCB0aGlzLnNldFF1ZXVlKHF1ZXVlRGF0YSk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIHF1ZXVlLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gY2xlYXJcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLmNsZWFyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiBxdWV1ZSBpcyBjbGVhcmVkLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBxdWV1ZUNhY2hlID0gW107XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUoW10pO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJuIHRoZSBpbmRleCBvZiBhIHF1ZXVlSWQgaW4gdGhlIHF1ZXVlLiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZC5cbiAgICpcbiAgICogQHBhcmFtIHtRdWV1ZX0gcXVldWUgUXVldWUgY29udGFpbmluZyBQYXJzZS5PYmplY3QgZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIFBhcnNlLk9iamVjdCBkYXRhLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKiBAc3RhdGljXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHF1ZXVlSXRlbUV4aXN0cyhxdWV1ZSwgcXVldWVJZCkge1xuICAgIHJldHVybiAoMCwgX2ZpbmRJbmRleC5kZWZhdWx0KShxdWV1ZSkuY2FsbChxdWV1ZSwgZGF0YSA9PiBkYXRhLnF1ZXVlSWQgPT09IHF1ZXVlSWQpO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgcXVldWUuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBsZW5ndGhcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLmxlbmd0aFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBhc3luYyBsZW5ndGgoKSB7XG4gICAgY29uc3QgcXVldWVEYXRhID0gYXdhaXQgdGhpcy5nZXRRdWV1ZSgpO1xuICAgIHJldHVybiBxdWV1ZURhdGEubGVuZ3RoO1xuICB9LFxuICAvKipcbiAgICogU2VuZHMgdGhlIHF1ZXVlIHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBzZW5kUXVldWVcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLnNlbmRRdWV1ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gUmV0dXJucyB0cnVlIGlmIHF1ZXVlIHdhcyBzZW50IHN1Y2Nlc3NmdWxseS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgYXN5bmMgc2VuZFF1ZXVlKCkge1xuICAgIGNvbnN0IHF1ZXVlID0gYXdhaXQgdGhpcy5nZXRRdWV1ZSgpO1xuICAgIGNvbnN0IHF1ZXVlRGF0YSA9IFsuLi5xdWV1ZV07XG4gICAgaWYgKHF1ZXVlRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZURhdGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHF1ZXVlT2JqZWN0ID0gcXVldWVEYXRhW2ldO1xuICAgICAgY29uc3Qge1xuICAgICAgICBpZCxcbiAgICAgICAgaGFzaCxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICB9ID0gcXVldWVPYmplY3Q7XG4gICAgICBjb25zdCBPYmplY3RUeXBlID0gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZXh0ZW5kKGNsYXNzTmFtZSk7XG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzLmJ5SWQoT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpO1xuICAgICAgfSBlbHNlIGlmIChoYXNoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzcy5ieUhhc2goT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzLmNyZWF0ZShPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogQnVpbGQgcXVldWUgb2JqZWN0IGFuZCBhZGQgdG8gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2VPYmplY3R9IG9iamVjdCBQYXJzZS5PYmplY3QgdG8gYmUgcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7UXVldWVPYmplY3R9IHF1ZXVlT2JqZWN0IFBhcnNlLk9iamVjdCBkYXRhIGZyb20gdGhlIHF1ZXVlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLlxuICAgKiBAc3RhdGljXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGFzeW5jIHNlbmRRdWV1ZUNhbGxiYWNrKG9iamVjdCwgcXVldWVPYmplY3QpIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlKHF1ZXVlT2JqZWN0LnF1ZXVlSWQpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHF1ZXVlT2JqZWN0LmFjdGlvbikge1xuICAgICAgY2FzZSAnc2F2ZSc6XG4gICAgICAgIC8vIFF1ZXVlZCB1cGRhdGUgd2FzIG92ZXJ3cml0dGVuIGJ5IG90aGVyIHJlcXVlc3QuIERvIG5vdCBzYXZlXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0LnVwZGF0ZWRBdCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqZWN0LnVwZGF0ZWRBdCA+IG5ldyBEYXRlKHF1ZXVlT2JqZWN0Lm9iamVjdC5jcmVhdGVkQXQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlKHF1ZXVlT2JqZWN0LnF1ZXVlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb2JqZWN0LnNhdmUocXVldWVPYmplY3Qub2JqZWN0LCBxdWV1ZU9iamVjdC5zZXJ2ZXJPcHRpb25zKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZShxdWV1ZU9iamVjdC5xdWV1ZUlkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlLmNvZGUgIT09IF9QYXJzZUVycm9yLmRlZmF1bHQuQ09OTkVDVElPTl9GQUlMRUQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlKHF1ZXVlT2JqZWN0LnF1ZXVlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rlc3Ryb3knOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9iamVjdC5kZXN0cm95KHF1ZXVlT2JqZWN0LnNlcnZlck9wdGlvbnMpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlKHF1ZXVlT2JqZWN0LnF1ZXVlSWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUuY29kZSAhPT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5DT05ORUNUSU9OX0ZBSUxFRCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUocXVldWVPYmplY3QucXVldWVJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFN0YXJ0IHBvbGxpbmcgc2VydmVyIGZvciBuZXR3b3JrIGNvbm5lY3Rpb24uXG4gICAqIFdpbGwgc2VuZCBxdWV1ZSBpZiBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gcG9sbFxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUucG9sbFxuICAgKiBAcGFyYW0gW21zXSBNaWxsaXNlY29uZHMgdG8gcGluZyB0aGUgc2VydmVyLiBEZWZhdWx0IDIwMDBtc1xuICAgKiBAc3RhdGljXG4gICAqL1xuICBwb2xsKCkge1xuICAgIGxldCBtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMjAwMDtcbiAgICBpZiAocG9sbGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwb2xsaW5nID0gKDAsIF9zZXRJbnRlcnZhbDIuZGVmYXVsdCkoKCkgPT4ge1xuICAgICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgICAgUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2hlYWx0aCcpLnRoZW4oX3JlZiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgc3RhdHVzXG4gICAgICAgIH0gPSBfcmVmO1xuICAgICAgICBpZiAoc3RhdHVzID09PSAnb2snKSB7XG4gICAgICAgICAgdGhpcy5zdG9wUG9sbCgpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICB9KS5jYXRjaChlID0+IGUpO1xuICAgIH0sIG1zKTtcbiAgfSxcbiAgLyoqXG4gICAqIFR1cm5zIG9mZiBwb2xsaW5nLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gc3RvcFBvbGxcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLnN0b3BQb2xsXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0b3BQb2xsKCkge1xuICAgIGNsZWFySW50ZXJ2YWwocG9sbGluZyk7XG4gICAgcG9sbGluZyA9IHVuZGVmaW5lZDtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybiB0cnVlIGlmIHBpbmdpbmcgdGhlIHNlcnZlci5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGlzUG9sbGluZ1xuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuaXNQb2xsaW5nXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBpc1BvbGxpbmcoKSB7XG4gICAgcmV0dXJuICEhcG9sbGluZztcbiAgfSxcbiAgX3NldFBvbGxpbmcoZmxhZykge1xuICAgIHBvbGxpbmcgPSBmbGFnO1xuICB9LFxuICBwcm9jZXNzOiB7XG4gICAgY3JlYXRlKE9iamVjdFR5cGUsIHF1ZXVlT2JqZWN0KSB7XG4gICAgICBjb25zdCBvYmplY3QgPSBuZXcgT2JqZWN0VHlwZSgpO1xuICAgICAgcmV0dXJuIEV2ZW50dWFsbHlRdWV1ZS5zZW5kUXVldWVDYWxsYmFjayhvYmplY3QsIHF1ZXVlT2JqZWN0KTtcbiAgICB9LFxuICAgIGFzeW5jIGJ5SWQoT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2Vzc2lvblRva2VuXG4gICAgICB9ID0gcXVldWVPYmplY3Quc2VydmVyT3B0aW9ucztcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IF9QYXJzZVF1ZXJ5LmRlZmF1bHQoT2JqZWN0VHlwZSk7XG4gICAgICBxdWVyeS5lcXVhbFRvKCdvYmplY3RJZCcsIHF1ZXVlT2JqZWN0LmlkKTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCAoMCwgX2ZpbmQuZGVmYXVsdCkocXVlcnkpLmNhbGwocXVlcnksIHtcbiAgICAgICAgc2Vzc2lvblRva2VuXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBFdmVudHVhbGx5UXVldWUuc2VuZFF1ZXVlQ2FsbGJhY2socmVzdWx0c1swXSwgcXVldWVPYmplY3QpO1xuICAgIH0sXG4gICAgYXN5bmMgYnlIYXNoKE9iamVjdFR5cGUsIHF1ZXVlT2JqZWN0KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHNlc3Npb25Ub2tlblxuICAgICAgfSA9IHF1ZXVlT2JqZWN0LnNlcnZlck9wdGlvbnM7XG4gICAgICBjb25zdCBxdWVyeSA9IG5ldyBfUGFyc2VRdWVyeS5kZWZhdWx0KE9iamVjdFR5cGUpO1xuICAgICAgcXVlcnkuZXF1YWxUbygnaGFzaCcsIHF1ZXVlT2JqZWN0Lmhhc2gpO1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0ICgwLCBfZmluZC5kZWZhdWx0KShxdWVyeSkuY2FsbChxdWVyeSwge1xuICAgICAgICBzZXNzaW9uVG9rZW5cbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gRXZlbnR1YWxseVF1ZXVlLnNlbmRRdWV1ZUNhbGxiYWNrKHJlc3VsdHNbMF0sIHF1ZXVlT2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBFdmVudHVhbGx5UXVldWUucHJvY2Vzcy5jcmVhdGUoT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpO1xuICAgIH1cbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gRXZlbnR1YWxseVF1ZXVlO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gRXZlbnR1YWxseVF1ZXVlOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX1BhcnNlVXNlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VVc2VyXCIpKTtcbi8qIGdsb2JhbCBGQiAqL1xuXG5sZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbmxldCByZXF1ZXN0ZWRQZXJtaXNzaW9ucztcbmxldCBpbml0T3B0aW9ucztcbmNvbnN0IHByb3ZpZGVyID0ge1xuICBhdXRoZW50aWNhdGUob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgRkIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRpb25zLmVycm9yKHRoaXMsICdGYWNlYm9vayBTREsgbm90IGZvdW5kLicpO1xuICAgIH1cbiAgICBGQi5sb2dpbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UuYXV0aFJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBvcHRpb25zLnN1Y2Nlc3ModGhpcywge1xuICAgICAgICAgICAgaWQ6IHJlc3BvbnNlLmF1dGhSZXNwb25zZS51c2VySUQsXG4gICAgICAgICAgICBhY2Nlc3NfdG9rZW46IHJlc3BvbnNlLmF1dGhSZXNwb25zZS5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIGV4cGlyYXRpb25fZGF0ZTogbmV3IERhdGUocmVzcG9uc2UuYXV0aFJlc3BvbnNlLmV4cGlyZXNJbiAqIDEwMDAgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSkudG9KU09OKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXJyb3IpIHtcbiAgICAgICAgICBvcHRpb25zLmVycm9yKHRoaXMsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIHNjb3BlOiByZXF1ZXN0ZWRQZXJtaXNzaW9uc1xuICAgIH0pO1xuICB9LFxuICByZXN0b3JlQXV0aGVudGljYXRpb24oYXV0aERhdGEpIHtcbiAgICBpZiAoYXV0aERhdGEpIHtcbiAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7fTtcbiAgICAgIGlmIChpbml0T3B0aW9ucykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBpbml0T3B0aW9ucykge1xuICAgICAgICAgIG5ld09wdGlvbnNba2V5XSA9IGluaXRPcHRpb25zW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFN1cHByZXNzIGNoZWNrcyBmb3IgbG9naW4gc3RhdHVzIGZyb20gdGhlIGJyb3dzZXIuXG4gICAgICBuZXdPcHRpb25zLnN0YXR1cyA9IGZhbHNlO1xuXG4gICAgICAvLyBJZiB0aGUgdXNlciBkb2Vzbid0IG1hdGNoIHRoZSBvbmUga25vd24gYnkgdGhlIEZCIFNESywgbG9nIG91dC5cbiAgICAgIC8vIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZSB1c2VycyB3aWxsIG1hdGNoIC0tIGl0J3Mgb25seSBpbiBjYXNlcyB3aGVyZVxuICAgICAgLy8gdGhlIEZCIFNESyBrbm93cyBvZiBhIGRpZmZlcmVudCB1c2VyIHRoYW4gdGhlIG9uZSBiZWluZyByZXN0b3JlZFxuICAgICAgLy8gZnJvbSBhIFBhcnNlIFVzZXIgdGhhdCBsb2dnZWQgaW4gd2l0aCB1c2VybmFtZS9wYXNzd29yZC5cbiAgICAgIGNvbnN0IGV4aXN0aW5nUmVzcG9uc2UgPSBGQi5nZXRBdXRoUmVzcG9uc2UoKTtcbiAgICAgIGlmIChleGlzdGluZ1Jlc3BvbnNlICYmIGV4aXN0aW5nUmVzcG9uc2UudXNlcklEICE9PSBhdXRoRGF0YS5pZCkge1xuICAgICAgICBGQi5sb2dvdXQoKTtcbiAgICAgIH1cbiAgICAgIEZCLmluaXQobmV3T3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBnZXRBdXRoVHlwZSgpIHtcbiAgICByZXR1cm4gJ2ZhY2Vib29rJztcbiAgfSxcbiAgZGVhdXRoZW50aWNhdGUoKSB7XG4gICAgdGhpcy5yZXN0b3JlQXV0aGVudGljYXRpb24obnVsbCk7XG4gIH1cbn07XG5cbi8qKlxuICogUHJvdmlkZXMgYSBzZXQgb2YgdXRpbGl0aWVzIGZvciB1c2luZyBQYXJzZSB3aXRoIEZhY2Vib29rLlxuICpcbiAqIEBjbGFzcyBQYXJzZS5GYWNlYm9va1V0aWxzXG4gKiBAc3RhdGljXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKi9cbmNvbnN0IEZhY2Vib29rVXRpbHMgPSB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBQYXJzZSBGYWNlYm9vayBpbnRlZ3JhdGlvbi4gIENhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciB5b3VcbiAgICogaGF2ZSBsb2FkZWQgdGhlIEZhY2Vib29rIEphdmFzY3JpcHQgU0RLIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVyc1xuICAgKiBhcyB5b3Ugd291bGQgcGFzcyB0bzxjb2RlPlxuICAgKiA8YSBocmVmPVxuICAgKiBcImh0dHBzOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9GQi5pbml0L1wiPlxuICAgKiBGQi5pbml0KCk8L2E+PC9jb2RlPi4gIFBhcnNlLkZhY2Vib29rVXRpbHMgd2lsbCBpbnZva2UgRkIuaW5pdCgpIGZvciB5b3VcbiAgICogd2l0aCB0aGVzZSBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBpbml0XG4gICAqIEBuYW1lIFBhcnNlLkZhY2Vib29rVXRpbHMuaW5pdFxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBGYWNlYm9vayBvcHRpb25zIGFyZ3VtZW50IGFzIGRlc2NyaWJlZCBoZXJlOlxuICAgKiAgIDxhIGhyZWY9XG4gICAqICAgXCJodHRwczovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvRkIuaW5pdC9cIj5cbiAgICogICBGQi5pbml0KCk8L2E+LiBUaGUgc3RhdHVzIGZsYWcgd2lsbCBiZSBjb2VyY2VkIHRvICdmYWxzZScgYmVjYXVzZSBpdFxuICAgKiAgIGludGVyZmVyZXMgd2l0aCBQYXJzZSBGYWNlYm9vayBpbnRlZ3JhdGlvbi4gQ2FsbCBGQi5nZXRMb2dpblN0YXR1cygpXG4gICAqICAgZXhwbGljaXRseSBpZiB0aGlzIGJlaGF2aW9yIGlzIHJlcXVpcmVkIGJ5IHlvdXIgYXBwbGljYXRpb24uXG4gICAqL1xuICBpbml0KG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIEZCID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgRmFjZWJvb2sgSmF2YVNjcmlwdCBTREsgbXVzdCBiZSBsb2FkZWQgYmVmb3JlIGNhbGxpbmcgaW5pdC4nKTtcbiAgICB9XG4gICAgaW5pdE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucykge1xuICAgICAgICBpbml0T3B0aW9uc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5pdE9wdGlvbnMuc3RhdHVzICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3Qgd2FybiA9IGNvbnNvbGUud2FybiB8fCBjb25zb2xlLmxvZyB8fCBmdW5jdGlvbiAoKSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICB3YXJuLmNhbGwoY29uc29sZSwgJ1RoZSBcInN0YXR1c1wiIGZsYWcgcGFzc2VkIGludG8nICsgJyBGQi5pbml0LCB3aGVuIHNldCB0byB0cnVlLCBjYW4gaW50ZXJmZXJlIHdpdGggUGFyc2UgRmFjZWJvb2snICsgJyBpbnRlZ3JhdGlvbiwgc28gaXQgaGFzIGJlZW4gc3VwcHJlc3NlZC4gUGxlYXNlIGNhbGwnICsgJyBGQi5nZXRMb2dpblN0YXR1cygpIGV4cGxpY2l0bHkgaWYgeW91IHJlcXVpcmUgdGhpcyBiZWhhdmlvci4nKTtcbiAgICB9XG4gICAgaW5pdE9wdGlvbnMuc3RhdHVzID0gZmFsc2U7XG4gICAgRkIuaW5pdChpbml0T3B0aW9ucyk7XG4gICAgX1BhcnNlVXNlci5kZWZhdWx0Ll9yZWdpc3RlckF1dGhlbnRpY2F0aW9uUHJvdmlkZXIocHJvdmlkZXIpO1xuICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgdXNlciBoYXMgdGhlaXIgYWNjb3VudCBsaW5rZWQgdG8gRmFjZWJvb2suXG4gICAqXG4gICAqIEBmdW5jdGlvbiBpc0xpbmtlZFxuICAgKiBAbmFtZSBQYXJzZS5GYWNlYm9va1V0aWxzLmlzTGlua2VkXG4gICAqIEBwYXJhbSB7UGFyc2UuVXNlcn0gdXNlciBVc2VyIHRvIGNoZWNrIGZvciBhIGZhY2Vib29rIGxpbmsuXG4gICAqICAgICBUaGUgdXNlciBtdXN0IGJlIGxvZ2dlZCBpbiBvbiB0aGlzIGRldmljZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIGhhcyB0aGVpciBhY2NvdW50XG4gICAqICAgICBsaW5rZWQgdG8gRmFjZWJvb2suXG4gICAqL1xuICBpc0xpbmtlZCh1c2VyKSB7XG4gICAgcmV0dXJuIHVzZXIuX2lzTGlua2VkKCdmYWNlYm9vaycpO1xuICB9LFxuICAvKipcbiAgICogTG9ncyBpbiBhIHVzZXIgdXNpbmcgRmFjZWJvb2suIFRoaXMgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGUgRmFjZWJvb2tcbiAgICogU0RLIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciwgYW5kIHRoZW4gYXV0b21hdGljYWxseSBsb2dzIGluIChvclxuICAgKiBjcmVhdGVzLCBpbiB0aGUgY2FzZSB3aGVyZSBpdCBpcyBhIG5ldyB1c2VyKSBhIFBhcnNlLlVzZXIuXG4gICAqXG4gICAqIFN0YW5kYXJkIEFQSTpcbiAgICpcbiAgICogPGNvZGU+bG9nSW4ocGVybWlzc2lvbjogc3RyaW5nLCBhdXRoRGF0YTogT2JqZWN0KTs8L2NvZGU+XG4gICAqXG4gICAqIEFkdmFuY2VkIEFQSTogVXNlZCBmb3IgaGFuZGxpbmcgeW91ciBvd24gb0F1dGggdG9rZW5zXG4gICAqIHtAbGluayBodHRwczovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvcmVzdC9ndWlkZS8jbGlua2luZy11c2Vyc31cbiAgICpcbiAgICogPGNvZGU+bG9nSW4oYXV0aERhdGE6IE9iamVjdCwgb3B0aW9ucz86IE9iamVjdCk7PC9jb2RlPlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbG9nSW5cbiAgICogQG5hbWUgUGFyc2UuRmFjZWJvb2tVdGlscy5sb2dJblxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBvYmplY3QpfSBwZXJtaXNzaW9ucyBUaGUgcGVybWlzc2lvbnMgcmVxdWlyZWQgZm9yIEZhY2Vib29rXG4gICAqICAgIGxvZyBpbi4gIFRoaXMgaXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIG9mIHBlcm1pc3Npb25zLlxuICAgKiAgICBBbHRlcm5hdGl2ZWx5LCBzdXBwbHkgYSBGYWNlYm9vayBhdXRoRGF0YSBvYmplY3QgYXMgZGVzY3JpYmVkIGluIG91clxuICAgKiAgICBSRVNUIEFQSSBkb2NzIGlmIHlvdSB3YW50IHRvIGhhbmRsZSBnZXR0aW5nIGZhY2Vib29rIGF1dGggdG9rZW5zXG4gICAqICAgIHlvdXJzZWxmLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBNYXN0ZXJLZXkgLyBTZXNzaW9uVG9rZW4uIEFsdGVybmF0aXZlbHkgY2FuIGJlIHVzZWQgZm9yIGF1dGhEYXRhIGlmIHBlcm1pc3Npb25zIGlzIGEgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgbG9nSW4ocGVybWlzc2lvbnMsIG9wdGlvbnMpIHtcbiAgICBpZiAoIXBlcm1pc3Npb25zIHx8IHR5cGVvZiBwZXJtaXNzaW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBpbml0aWFsaXplIEZhY2Vib29rVXRpbHMgYmVmb3JlIGNhbGxpbmcgbG9nSW4uJyk7XG4gICAgICB9XG4gICAgICByZXF1ZXN0ZWRQZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xuICAgICAgcmV0dXJuIF9QYXJzZVVzZXIuZGVmYXVsdC5sb2dJbldpdGgoJ2ZhY2Vib29rJywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBfUGFyc2VVc2VyLmRlZmF1bHQubG9nSW5XaXRoKCdmYWNlYm9vaycsIHtcbiAgICAgIGF1dGhEYXRhOiBwZXJtaXNzaW9uc1xuICAgIH0sIG9wdGlvbnMpO1xuICB9LFxuICAvKipcbiAgICogTGlua3MgRmFjZWJvb2sgdG8gYW4gZXhpc3RpbmcgUEZVc2VyLiBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhlXG4gICAqIEZhY2Vib29rIFNESyB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIsIGFuZCB0aGVuIGF1dG9tYXRpY2FsbHkgbGlua3NcbiAgICogdGhlIGFjY291bnQgdG8gdGhlIFBhcnNlLlVzZXIuXG4gICAqXG4gICAqIFN0YW5kYXJkIEFQSTpcbiAgICpcbiAgICogPGNvZGU+bGluayh1c2VyOiBQYXJzZS5Vc2VyLCBwZXJtaXNzaW9uOiBzdHJpbmcsIGF1dGhEYXRhPzogT2JqZWN0KTs8L2NvZGU+XG4gICAqXG4gICAqIEFkdmFuY2VkIEFQSTogVXNlZCBmb3IgaGFuZGxpbmcgeW91ciBvd24gb0F1dGggdG9rZW5zXG4gICAqIHtAbGluayBodHRwczovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvcmVzdC9ndWlkZS8jbGlua2luZy11c2Vyc31cbiAgICpcbiAgICogPGNvZGU+bGluayh1c2VyOiBQYXJzZS5Vc2VyLCBhdXRoRGF0YTogT2JqZWN0LCBvcHRpb25zPzogRnVsbE9wdGlvbnMpOzwvY29kZT5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGxpbmtcbiAgICogQG5hbWUgUGFyc2UuRmFjZWJvb2tVdGlscy5saW5rXG4gICAqIEBwYXJhbSB7UGFyc2UuVXNlcn0gdXNlciBVc2VyIHRvIGxpbmsgdG8gRmFjZWJvb2suIFRoaXMgbXVzdCBiZSB0aGVcbiAgICogICAgIGN1cnJlbnQgdXNlci5cbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgb2JqZWN0KX0gcGVybWlzc2lvbnMgVGhlIHBlcm1pc3Npb25zIHJlcXVpcmVkIGZvciBGYWNlYm9va1xuICAgKiAgICBsb2cgaW4uICBUaGlzIGlzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyBvZiBwZXJtaXNzaW9ucy5cbiAgICogICAgQWx0ZXJuYXRpdmVseSwgc3VwcGx5IGEgRmFjZWJvb2sgYXV0aERhdGEgb2JqZWN0IGFzIGRlc2NyaWJlZCBpbiBvdXJcbiAgICogICAgUkVTVCBBUEkgZG9jcyBpZiB5b3Ugd2FudCB0byBoYW5kbGUgZ2V0dGluZyBmYWNlYm9vayBhdXRoIHRva2Vuc1xuICAgKiAgICB5b3Vyc2VsZi5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgTWFzdGVyS2V5IC8gU2Vzc2lvblRva2VuLiBBbHRlcm5hdGl2ZWx5IGNhbiBiZSB1c2VkIGZvciBhdXRoRGF0YSBpZiBwZXJtaXNzaW9ucyBpcyBhIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIGxpbmsodXNlciwgcGVybWlzc2lvbnMsIG9wdGlvbnMpIHtcbiAgICBpZiAoIXBlcm1pc3Npb25zIHx8IHR5cGVvZiBwZXJtaXNzaW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBpbml0aWFsaXplIEZhY2Vib29rVXRpbHMgYmVmb3JlIGNhbGxpbmcgbGluay4nKTtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3RlZFBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7XG4gICAgICByZXR1cm4gdXNlci5saW5rV2l0aCgnZmFjZWJvb2snLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXIubGlua1dpdGgoJ2ZhY2Vib29rJywge1xuICAgICAgYXV0aERhdGE6IHBlcm1pc3Npb25zXG4gICAgfSwgb3B0aW9ucyk7XG4gIH0sXG4gIC8qKlxuICAgKiBVbmxpbmtzIHRoZSBQYXJzZS5Vc2VyIGZyb20gYSBGYWNlYm9vayBhY2NvdW50LlxuICAgKlxuICAgKiBAZnVuY3Rpb24gdW5saW5rXG4gICAqIEBuYW1lIFBhcnNlLkZhY2Vib29rVXRpbHMudW5saW5rXG4gICAqIEBwYXJhbSB7UGFyc2UuVXNlcn0gdXNlciBVc2VyIHRvIHVubGluayBmcm9tIEZhY2Vib29rLiBUaGlzIG11c3QgYmUgdGhlXG4gICAqICAgICBjdXJyZW50IHVzZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFN0YW5kYXJkIG9wdGlvbnMgb2JqZWN0IHdpdGggc3VjY2VzcyBhbmQgZXJyb3JcbiAgICogICAgY2FsbGJhY2tzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHVubGluazogZnVuY3Rpb24gKHVzZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAoIWluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IGluaXRpYWxpemUgRmFjZWJvb2tVdGlscyBiZWZvcmUgY2FsbGluZyB1bmxpbmsuJyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyLl91bmxpbmtGcm9tKCdmYWNlYm9vaycsIG9wdGlvbnMpO1xuICB9LFxuICAvLyBVc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzXG4gIF9nZXRBdXRoUHJvdmlkZXIoKSB7XG4gICAgcmV0dXJuIHByb3ZpZGVyO1xuICB9XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gRmFjZWJvb2tVdGlsczsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9rZXlzSW5zdGFuY2VQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2tleXNcIik7XG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaWRiS2V5dmFsID0gcmVxdWlyZShcImlkYi1rZXl2YWxcIik7XG4vKiBnbG9iYWwgd2luZG93ICovXG5cbmxldCBJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlcjtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaW5kZXhlZERCKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgUGFyc2VTdG9yZSA9ICgwLCBfaWRiS2V5dmFsLmNyZWF0ZVN0b3JlKSgncGFyc2VEQicsICdwYXJzZVN0b3JlJyk7XG4gICAgSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIgPSB7XG4gICAgICBhc3luYzogMSxcbiAgICAgIGdldEl0ZW1Bc3luYyhwYXRoKSB7XG4gICAgICAgIHJldHVybiAoMCwgX2lkYktleXZhbC5nZXQpKHBhdGgsIFBhcnNlU3RvcmUpO1xuICAgICAgfSxcbiAgICAgIHNldEl0ZW1Bc3luYyhwYXRoLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKDAsIF9pZGJLZXl2YWwuc2V0KShwYXRoLCB2YWx1ZSwgUGFyc2VTdG9yZSk7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlSXRlbUFzeW5jKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaWRiS2V5dmFsLmRlbCkocGF0aCwgUGFyc2VTdG9yZSk7XG4gICAgICB9LFxuICAgICAgZ2V0QWxsS2V5c0FzeW5jKCkge1xuICAgICAgICByZXR1cm4gKDAsIF9rZXlzSW5zdGFuY2VQcm9wZXJ0eShfaWRiS2V5dmFsKSkoUGFyc2VTdG9yZSk7XG4gICAgICB9LFxuICAgICAgY2xlYXIoKSB7XG4gICAgICAgIHJldHVybiAoMCwgX2lkYktleXZhbC5jbGVhcikoUGFyc2VTdG9yZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSBjYXRjaCAoXykge1xuICAgIC8vIEluZGV4ZWREQiBub3QgYWNjZXNzaWJsZVxuICAgIEluZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyID0gdW5kZWZpbmVkO1xuICB9XG59IGVsc2Uge1xuICAvLyBJbmRleGVkREIgbm90IHN1cHBvcnRlZFxuICBJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfU3RvcmFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZVwiKSk7XG52YXIgX1BhcnNlSW5zdGFsbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUluc3RhbGxhdGlvblwiKSk7XG52YXIgX3V1aWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V1aWRcIikpO1xuY29uc3QgQ1VSUkVOVF9JTlNUQUxMQVRJT05fS0VZID0gJ2N1cnJlbnRJbnN0YWxsYXRpb24nO1xuY29uc3QgQ1VSUkVOVF9JTlNUQUxMQVRJT05fSURfS0VZID0gJ2N1cnJlbnRJbnN0YWxsYXRpb25JZCc7XG5sZXQgaWlkQ2FjaGUgPSBudWxsO1xubGV0IGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZSA9IG51bGw7XG5sZXQgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlTWF0Y2hlc0Rpc2sgPSBmYWxzZTtcbmNvbnN0IEluc3RhbGxhdGlvbkNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jIHVwZGF0ZUluc3RhbGxhdGlvbk9uRGlzayhpbnN0YWxsYXRpb24pIHtcbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9JTlNUQUxMQVRJT05fS0VZKTtcbiAgICBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhwYXRoLCAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShpbnN0YWxsYXRpb24udG9KU09OKCkpKTtcbiAgICB0aGlzLl9zZXRDdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUoaW5zdGFsbGF0aW9uKTtcbiAgfSxcbiAgYXN5bmMgY3VycmVudEluc3RhbGxhdGlvbklkKCkge1xuICAgIGlmICh0eXBlb2YgaWlkQ2FjaGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gaWlkQ2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX0lOU1RBTExBVElPTl9JRF9LRVkpO1xuICAgIGxldCBpaWQgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhwYXRoKTtcbiAgICBpZiAoIWlpZCkge1xuICAgICAgaWlkID0gKDAsIF91dWlkLmRlZmF1bHQpKCk7XG4gICAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMocGF0aCwgaWlkKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWlkQ2FjaGUgPSBpaWQ7XG4gICAgICAgIHJldHVybiBpaWQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWlkQ2FjaGUgPSBpaWQ7XG4gICAgcmV0dXJuIGlpZDtcbiAgfSxcbiAgYXN5bmMgY3VycmVudEluc3RhbGxhdGlvbigpIHtcbiAgICBpZiAoY3VycmVudEluc3RhbGxhdGlvbkNhY2hlKSB7XG4gICAgICByZXR1cm4gY3VycmVudEluc3RhbGxhdGlvbkNhY2hlO1xuICAgIH1cbiAgICBpZiAoY3VycmVudEluc3RhbGxhdGlvbkNhY2hlTWF0Y2hlc0Rpc2spIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9JTlNUQUxMQVRJT05fS0VZKTtcbiAgICBsZXQgaW5zdGFsbGF0aW9uRGF0YSA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKHBhdGgpO1xuICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZU1hdGNoZXNEaXNrID0gdHJ1ZTtcbiAgICBpZiAoaW5zdGFsbGF0aW9uRGF0YSkge1xuICAgICAgaW5zdGFsbGF0aW9uRGF0YSA9IEpTT04ucGFyc2UoaW5zdGFsbGF0aW9uRGF0YSk7XG4gICAgICBpbnN0YWxsYXRpb25EYXRhLmNsYXNzTmFtZSA9ICdfSW5zdGFsbGF0aW9uJztcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBfUGFyc2VJbnN0YWxsYXRpb24uZGVmYXVsdC5mcm9tSlNPTihpbnN0YWxsYXRpb25EYXRhKTtcbiAgICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZSA9IGN1cnJlbnQ7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFsbGF0aW9uSWQgPSBhd2FpdCB0aGlzLmN1cnJlbnRJbnN0YWxsYXRpb25JZCgpO1xuICAgIGNvbnN0IGluc3RhbGxhdGlvbiA9IG5ldyBfUGFyc2VJbnN0YWxsYXRpb24uZGVmYXVsdCgpO1xuICAgIGluc3RhbGxhdGlvbi5zZXQoJ2RldmljZVR5cGUnLCBfUGFyc2VJbnN0YWxsYXRpb24uZGVmYXVsdC5ERVZJQ0VfVFlQRVMuV0VCKTtcbiAgICBpbnN0YWxsYXRpb24uc2V0KCdpbnN0YWxsYXRpb25JZCcsIGluc3RhbGxhdGlvbklkKTtcbiAgICBpbnN0YWxsYXRpb24uc2V0KCdwYXJzZVZlcnNpb24nLCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1ZFUlNJT04nKSk7XG4gICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlID0gaW5zdGFsbGF0aW9uO1xuICAgIGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuc2V0SXRlbUFzeW5jKHBhdGgsICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKGluc3RhbGxhdGlvbi50b0pTT04oKSkpO1xuICAgIHJldHVybiBpbnN0YWxsYXRpb247XG4gIH0sXG4gIF9jbGVhckNhY2hlKCkge1xuICAgIGlpZENhY2hlID0gbnVsbDtcbiAgICBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUgPSBudWxsO1xuICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZU1hdGNoZXNEaXNrID0gZmFsc2U7XG4gIH0sXG4gIF9zZXRJbnN0YWxsYXRpb25JZENhY2hlKGlpZCkge1xuICAgIGlpZENhY2hlID0gaWlkO1xuICB9LFxuICBfc2V0Q3VycmVudEluc3RhbGxhdGlvbkNhY2hlKGluc3RhbGxhdGlvbikge1xuICAgIGxldCBtYXRjaGVzRGlzayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUgPSBpbnN0YWxsYXRpb247XG4gICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlTWF0Y2hlc0Rpc2sgPSBtYXRjaGVzRGlzaztcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gSW5zdGFsbGF0aW9uQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEluc3RhbGxhdGlvbkNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL21hcFwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2tleXNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF92YWx1ZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3ZhbHVlc1wiKSk7XG52YXIgX3NldFRpbWVvdXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXQtdGltZW91dFwiKSk7XG52YXIgX2JpbmQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2JpbmRcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xudmFyIF9MaXZlUXVlcnlTdWJzY3JpcHRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xpdmVRdWVyeVN1YnNjcmlwdGlvblwiKSk7XG52YXIgX3Byb21pc2VVdGlscyA9IHJlcXVpcmUoXCIuL3Byb21pc2VVdGlsc1wiKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG4vLyBUaGUgTGl2ZVF1ZXJ5IGNsaWVudCBpbm5lciBzdGF0ZVxuY29uc3QgQ0xJRU5UX1NUQVRFID0ge1xuICBJTklUSUFMSVpFRDogJ2luaXRpYWxpemVkJyxcbiAgQ09OTkVDVElORzogJ2Nvbm5lY3RpbmcnLFxuICBDT05ORUNURUQ6ICdjb25uZWN0ZWQnLFxuICBDTE9TRUQ6ICdjbG9zZWQnLFxuICBSRUNPTk5FQ1RJTkc6ICdyZWNvbm5lY3RpbmcnLFxuICBESVNDT05ORUNURUQ6ICdkaXNjb25uZWN0ZWQnXG59O1xuXG4vLyBUaGUgZXZlbnQgdHlwZSB0aGUgTGl2ZVF1ZXJ5IGNsaWVudCBzaG91bGQgc2VudCB0byBzZXJ2ZXJcbmNvbnN0IE9QX1RZUEVTID0ge1xuICBDT05ORUNUOiAnY29ubmVjdCcsXG4gIFNVQlNDUklCRTogJ3N1YnNjcmliZScsXG4gIFVOU1VCU0NSSUJFOiAndW5zdWJzY3JpYmUnLFxuICBFUlJPUjogJ2Vycm9yJ1xufTtcblxuLy8gVGhlIGV2ZW50IHdlIGdldCBiYWNrIGZyb20gTGl2ZVF1ZXJ5IHNlcnZlclxuY29uc3QgT1BfRVZFTlRTID0ge1xuICBDT05ORUNURUQ6ICdjb25uZWN0ZWQnLFxuICBTVUJTQ1JJQkVEOiAnc3Vic2NyaWJlZCcsXG4gIFVOU1VCU0NSSUJFRDogJ3Vuc3Vic2NyaWJlZCcsXG4gIEVSUk9SOiAnZXJyb3InLFxuICBDUkVBVEU6ICdjcmVhdGUnLFxuICBVUERBVEU6ICd1cGRhdGUnLFxuICBFTlRFUjogJ2VudGVyJyxcbiAgTEVBVkU6ICdsZWF2ZScsXG4gIERFTEVURTogJ2RlbGV0ZSdcbn07XG5cbi8vIFRoZSBldmVudCB0aGUgTGl2ZVF1ZXJ5IGNsaWVudCBzaG91bGQgZW1pdFxuY29uc3QgQ0xJRU5UX0VNTUlURVJfVFlQRVMgPSB7XG4gIENMT1NFOiAnY2xvc2UnLFxuICBFUlJPUjogJ2Vycm9yJyxcbiAgT1BFTjogJ29wZW4nXG59O1xuXG4vLyBUaGUgZXZlbnQgdGhlIExpdmVRdWVyeSBzdWJzY3JpcHRpb24gc2hvdWxkIGVtaXRcbmNvbnN0IFNVQlNDUklQVElPTl9FTU1JVEVSX1RZUEVTID0ge1xuICBPUEVOOiAnb3BlbicsXG4gIENMT1NFOiAnY2xvc2UnLFxuICBFUlJPUjogJ2Vycm9yJyxcbiAgQ1JFQVRFOiAnY3JlYXRlJyxcbiAgVVBEQVRFOiAndXBkYXRlJyxcbiAgRU5URVI6ICdlbnRlcicsXG4gIExFQVZFOiAnbGVhdmUnLFxuICBERUxFVEU6ICdkZWxldGUnXG59O1xuXG4vLyBFeHBvbmVudGlhbGx5LWdyb3dpbmcgcmFuZG9tIGRlbGF5XG5jb25zdCBnZW5lcmF0ZUludGVydmFsID0gayA9PiB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpICogTWF0aC5taW4oMzAsIE1hdGgucG93KDIsIGspIC0gMSkgKiAxMDAwO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IExpdmVRdWVyeUNsaWVudC5cbiAqIDxhIGhyZWY9XCJodHRwczovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sI2V2ZW50c19jbGFzc19ldmVudGVtaXR0ZXJcIj5jbG91ZCBmdW5jdGlvbnM8L2E+LlxuICpcbiAqIEEgd3JhcHBlciBvZiBhIHN0YW5kYXJkIFdlYlNvY2tldCBjbGllbnQuIFdlIGFkZCBzZXZlcmFsIHVzZWZ1bCBtZXRob2RzIHRvXG4gKiBoZWxwIHlvdSBjb25uZWN0L2Rpc2Nvbm5lY3QgdG8gTGl2ZVF1ZXJ5U2VydmVyLCBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgYSBQYXJzZVF1ZXJ5IGVhc2lseS5cbiAqXG4gKiBqYXZhc2NyaXB0S2V5IGFuZCBtYXN0ZXJLZXkgYXJlIHVzZWQgZm9yIHZlcmlmeWluZyB0aGUgTGl2ZVF1ZXJ5Q2xpZW50IHdoZW4gaXQgdHJpZXNcbiAqIHRvIGNvbm5lY3QgdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXJcbiAqXG4gKiBXZSBleHBvc2UgdGhyZWUgZXZlbnRzIHRvIGhlbHAgeW91IG1vbml0b3IgdGhlIHN0YXR1cyBvZiB0aGUgTGl2ZVF1ZXJ5Q2xpZW50LlxuICpcbiAqIDxwcmU+XG4gKiBjb25zdCBMaXZlUXVlcnlDbGllbnQgPSBQYXJzZS5MaXZlUXVlcnlDbGllbnQ7XG4gKiBjb25zdCBjbGllbnQgPSBuZXcgTGl2ZVF1ZXJ5Q2xpZW50KHtcbiAqICAgYXBwbGljYXRpb25JZDogJycsXG4gKiAgIHNlcnZlclVSTDogJycsXG4gKiAgIGphdmFzY3JpcHRLZXk6ICcnLFxuICogICBtYXN0ZXJLZXk6ICcnXG4gKiAgfSk7XG4gKiA8L3ByZT5cbiAqXG4gKiBPcGVuIC0gV2hlbiB3ZSBlc3RhYmxpc2ggdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuXG4gKiA8cHJlPlxuICogY2xpZW50Lm9uKCdvcGVuJywgKCkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPlxuICpcbiAqIENsb3NlIC0gV2hlbiB3ZSBsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciwgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICogPHByZT5cbiAqIGNsaWVudC5vbignY2xvc2UnLCAoKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+XG4gKlxuICogRXJyb3IgLSBXaGVuIHNvbWUgbmV0d29yayBlcnJvciBvciBMaXZlUXVlcnkgc2VydmVyIGVycm9yIGhhcHBlbnMsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqIDxwcmU+XG4gKiBjbGllbnQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+XG4gKlxuICogQGFsaWFzIFBhcnNlLkxpdmVRdWVyeUNsaWVudFxuICovXG5jbGFzcyBMaXZlUXVlcnlDbGllbnQge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuYXBwbGljYXRpb25JZCAtIGFwcGxpY2F0aW9uSWQgb2YgeW91ciBQYXJzZSBhcHBcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuc2VydmVyVVJMIC0gPGI+dGhlIFVSTCBvZiB5b3VyIExpdmVRdWVyeSBzZXJ2ZXI8L2I+XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmphdmFzY3JpcHRLZXkgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5tYXN0ZXJLZXkgKG9wdGlvbmFsKSBZb3VyIFBhcnNlIE1hc3RlciBLZXkuIChOb2RlLmpzIG9ubHkhKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zZXNzaW9uVG9rZW4gKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5pbnN0YWxsYXRpb25JZCAob3B0aW9uYWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfcmVmKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBsZXQge1xuICAgICAgYXBwbGljYXRpb25JZCxcbiAgICAgIHNlcnZlclVSTCxcbiAgICAgIGphdmFzY3JpcHRLZXksXG4gICAgICBtYXN0ZXJLZXksXG4gICAgICBzZXNzaW9uVG9rZW4sXG4gICAgICBpbnN0YWxsYXRpb25JZFxuICAgIH0gPSBfcmVmO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiYXR0ZW1wdHNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImlkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZXF1ZXN0SWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImFwcGxpY2F0aW9uSWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInNlcnZlclVSTFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiamF2YXNjcmlwdEtleVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwibWFzdGVyS2V5XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzZXNzaW9uVG9rZW5cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImluc3RhbGxhdGlvbklkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiY29ubmVjdFByb21pc2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInN1YnNjcmlwdGlvbnNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInNvY2tldFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic3RhdGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlY29ubmVjdEhhbmRsZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiZW1pdHRlclwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImVtaXRcIiwgdm9pZCAwKTtcbiAgICBpZiAoIXNlcnZlclVSTCB8fCAoMCwgX2luZGV4T2YuZGVmYXVsdCkoc2VydmVyVVJMKS5jYWxsKHNlcnZlclVSTCwgJ3dzJykgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gc2V0IGEgcHJvcGVyIFBhcnNlIExpdmVRdWVyeSBzZXJ2ZXIgdXJsIGJlZm9yZSB1c2luZyBMaXZlUXVlcnlDbGllbnQnKTtcbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RIYW5kbGUgPSBudWxsO1xuICAgIHRoaXMuYXR0ZW1wdHMgPSAxO1xuICAgIHRoaXMuaWQgPSAwO1xuICAgIHRoaXMucmVxdWVzdElkID0gMTtcbiAgICB0aGlzLnNlcnZlclVSTCA9IHNlcnZlclVSTDtcbiAgICB0aGlzLmFwcGxpY2F0aW9uSWQgPSBhcHBsaWNhdGlvbklkO1xuICAgIHRoaXMuamF2YXNjcmlwdEtleSA9IGphdmFzY3JpcHRLZXkgfHwgdW5kZWZpbmVkO1xuICAgIHRoaXMubWFzdGVyS2V5ID0gbWFzdGVyS2V5IHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlc3Npb25Ub2tlbiA9IHNlc3Npb25Ub2tlbiB8fCB1bmRlZmluZWQ7XG4gICAgdGhpcy5pbnN0YWxsYXRpb25JZCA9IGluc3RhbGxhdGlvbklkIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZTtcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgX21hcC5kZWZhdWx0KCk7XG4gICAgdGhpcy5zdGF0ZSA9IENMSUVOVF9TVEFURS5JTklUSUFMSVpFRDtcbiAgICBjb25zdCBFdmVudEVtaXR0ZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5vbiA9IChldmVudE5hbWUsIGxpc3RlbmVyKSA9PiB0aGlzLmVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGhpcy5lbWl0dGVyLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTtcbiAgICB9O1xuICAgIC8vIGFkZGluZyBsaXN0ZW5lciBzbyBwcm9jZXNzIGRvZXMgbm90IGNyYXNoXG4gICAgLy8gYmVzdCBwcmFjdGljZSBpcyBmb3IgZGV2ZWxvcGVyIHRvIHJlZ2lzdGVyIHRoZWlyIG93biBsaXN0ZW5lclxuICAgIHRoaXMub24oJ2Vycm9yJywgKCkgPT4ge30pO1xuICB9XG4gIHNob3VsZE9wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5JTklUSUFMSVpFRCB8fCB0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuRElTQ09OTkVDVEVEO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gYSBQYXJzZVF1ZXJ5XG4gICAqXG4gICAqIElmIHlvdSBwcm92aWRlIHRoZSBzZXNzaW9uVG9rZW4sIHdoZW4gdGhlIExpdmVRdWVyeSBzZXJ2ZXIgZ2V0cyBQYXJzZU9iamVjdCdzXG4gICAqIHVwZGF0ZXMgZnJvbSBwYXJzZSBzZXJ2ZXIsIGl0J2xsIHRyeSB0byBjaGVjayB3aGV0aGVyIHRoZSBzZXNzaW9uVG9rZW4gZnVsZmlsbHNcbiAgICogdGhlIFBhcnNlT2JqZWN0J3MgQUNMLiBUaGUgTGl2ZVF1ZXJ5IHNlcnZlciB3aWxsIG9ubHkgc2VuZCB1cGRhdGVzIHRvIGNsaWVudHMgd2hvc2VcbiAgICogc2Vzc2lvblRva2VuIGlzIGZpdCBmb3IgdGhlIFBhcnNlT2JqZWN0J3MgQUNMLiBZb3UgY2FuIGNoZWNrIHRoZSBMaXZlUXVlcnkgcHJvdG9jb2xcbiAgICogPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9wYXJzZS1jb21tdW5pdHkvcGFyc2Utc2VydmVyL3dpa2kvUGFyc2UtTGl2ZVF1ZXJ5LVByb3RvY29sLVNwZWNpZmljYXRpb25cIj5oZXJlPC9hPiBmb3IgbW9yZSBkZXRhaWxzLiBUaGUgc3Vic2NyaXB0aW9uIHlvdSBnZXQgaXMgdGhlIHNhbWUgc3Vic2NyaXB0aW9uIHlvdSBnZXRcbiAgICogZnJvbSBvdXIgU3RhbmRhcmQgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlUXVlcnl9IHF1ZXJ5IC0gdGhlIFBhcnNlUXVlcnkgeW91IHdhbnQgdG8gc3Vic2NyaWJlIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uVG9rZW4gKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyB7TGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgc3Vic2NyaWJlKHF1ZXJ5LCBzZXNzaW9uVG9rZW4pIHtcbiAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICBjb25zdCBxdWVyeUpTT04gPSBxdWVyeS50b0pTT04oKTtcbiAgICBjb25zdCB3aGVyZSA9IHF1ZXJ5SlNPTi53aGVyZTtcbiAgICBjb25zdCBrZXlzID0gKDAsIF9rZXlzLmRlZmF1bHQpKHF1ZXJ5SlNPTik/LnNwbGl0KCcsJyk7XG4gICAgY29uc3Qgd2F0Y2ggPSBxdWVyeUpTT04ud2F0Y2g/LnNwbGl0KCcsJyk7XG4gICAgY29uc3Qgc3Vic2NyaWJlUmVxdWVzdCA9IHtcbiAgICAgIG9wOiBPUF9UWVBFUy5TVUJTQ1JJQkUsXG4gICAgICByZXF1ZXN0SWQ6IHRoaXMucmVxdWVzdElkLFxuICAgICAgcXVlcnk6IHtcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICB3aGVyZSxcbiAgICAgICAga2V5cyxcbiAgICAgICAgd2F0Y2hcbiAgICAgIH0sXG4gICAgICBzZXNzaW9uVG9rZW46IHVuZGVmaW5lZFxuICAgIH07XG4gICAgaWYgKHNlc3Npb25Ub2tlbikge1xuICAgICAgc3Vic2NyaWJlUmVxdWVzdC5zZXNzaW9uVG9rZW4gPSBzZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG5ldyBfTGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uLmRlZmF1bHQodGhpcy5yZXF1ZXN0SWQsIHF1ZXJ5LCBzZXNzaW9uVG9rZW4pO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5zZXQodGhpcy5yZXF1ZXN0SWQsIHN1YnNjcmlwdGlvbik7XG4gICAgdGhpcy5yZXF1ZXN0SWQgKz0gMTtcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZCgoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShzdWJzY3JpYmVSZXF1ZXN0KSk7XG4gICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9uLnN1YnNjcmliZVByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEFmdGVyIGNhbGxpbmcgdW5zdWJzY3JpYmUgeW91J2xsIHN0b3AgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIHRoZSBzdWJzY3JpcHRpb24gb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gc3Vic2NyaXB0aW9uIC0gc3Vic2NyaXB0aW9uIHlvdSB3b3VsZCBsaWtlIHRvIHVuc3Vic2NyaWJlIGZyb20uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgYXN5bmMgdW5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uKSB7XG4gICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdW5zdWJzY3JpYmVSZXF1ZXN0ID0ge1xuICAgICAgb3A6IE9QX1RZUEVTLlVOU1VCU0NSSUJFLFxuICAgICAgcmVxdWVzdElkOiBzdWJzY3JpcHRpb24uaWRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3RQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuc29ja2V0LnNlbmQoKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkodW5zdWJzY3JpYmVSZXF1ZXN0KSk7XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlUHJvbWlzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZnRlciBvcGVuIGlzIGNhbGxlZCwgdGhlIExpdmVRdWVyeUNsaWVudCB3aWxsIHRyeSB0byBzZW5kIGEgY29ubmVjdCByZXF1ZXN0XG4gICAqIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLlxuICAgKlxuICAgKi9cbiAgb3BlbigpIHtcbiAgICBjb25zdCBXZWJTb2NrZXRJbXBsZW1lbnRhdGlvbiA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFdlYlNvY2tldENvbnRyb2xsZXIoKTtcbiAgICBpZiAoIVdlYlNvY2tldEltcGxlbWVudGF0aW9uKSB7XG4gICAgICB0aGlzLmVtaXQoQ0xJRU5UX0VNTUlURVJfVFlQRVMuRVJST1IsICdDYW4gbm90IGZpbmQgV2ViU29ja2V0IGltcGxlbWVudGF0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlICE9PSBDTElFTlRfU1RBVEUuUkVDT05ORUNUSU5HKSB7XG4gICAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLkNPTk5FQ1RJTkc7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldEltcGxlbWVudGF0aW9uKHRoaXMuc2VydmVyVVJMKTtcbiAgICB0aGlzLnNvY2tldC5jbG9zaW5nUHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG5cbiAgICAvLyBCaW5kIFdlYlNvY2tldCBjYWxsYmFja3NcbiAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICB0aGlzLl9oYW5kbGVXZWJTb2NrZXRPcGVuKCk7XG4gICAgfTtcbiAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSBldmVudCA9PiB7XG4gICAgICB0aGlzLl9oYW5kbGVXZWJTb2NrZXRNZXNzYWdlKGV2ZW50KTtcbiAgICB9O1xuICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSBldmVudCA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5jbG9zaW5nUHJvbWlzZT8ucmVzb2x2ZShldmVudCk7XG4gICAgICB0aGlzLl9oYW5kbGVXZWJTb2NrZXRDbG9zZSgpO1xuICAgIH07XG4gICAgdGhpcy5zb2NrZXQub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgIHRoaXMuX2hhbmRsZVdlYlNvY2tldEVycm9yKGVycm9yKTtcbiAgICB9O1xuICB9XG4gIHJlc3Vic2NyaWJlKCkge1xuICAgIHZhciBfY29udGV4dDtcbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQgPSB0aGlzLnN1YnNjcmlwdGlvbnMpLmNhbGwoX2NvbnRleHQsIChzdWJzY3JpcHRpb24sIHJlcXVlc3RJZCkgPT4ge1xuICAgICAgY29uc3QgcXVlcnkgPSBzdWJzY3JpcHRpb24ucXVlcnk7XG4gICAgICBjb25zdCBxdWVyeUpTT04gPSBxdWVyeS50b0pTT04oKTtcbiAgICAgIGNvbnN0IHdoZXJlID0gcXVlcnlKU09OLndoZXJlO1xuICAgICAgY29uc3Qga2V5cyA9ICgwLCBfa2V5cy5kZWZhdWx0KShxdWVyeUpTT04pPy5zcGxpdCgnLCcpO1xuICAgICAgY29uc3Qgd2F0Y2ggPSBxdWVyeUpTT04ud2F0Y2g/LnNwbGl0KCcsJyk7XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBxdWVyeS5jbGFzc05hbWU7XG4gICAgICBjb25zdCBzZXNzaW9uVG9rZW4gPSBzdWJzY3JpcHRpb24uc2Vzc2lvblRva2VuO1xuICAgICAgY29uc3Qgc3Vic2NyaWJlUmVxdWVzdCA9IHtcbiAgICAgICAgb3A6IE9QX1RZUEVTLlNVQlNDUklCRSxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBxdWVyeToge1xuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICB3aGVyZSxcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIHdhdGNoXG4gICAgICAgIH0sXG4gICAgICAgIHNlc3Npb25Ub2tlbjogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgICAgaWYgKHNlc3Npb25Ub2tlbikge1xuICAgICAgICBzdWJzY3JpYmVSZXF1ZXN0LnNlc3Npb25Ub2tlbiA9IHNlc3Npb25Ub2tlbjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29ubmVjdFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuc29ja2V0LnNlbmQoKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoc3Vic2NyaWJlUmVxdWVzdCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBjbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhpcyBMaXZlUXVlcnlDbGllbnQsXG4gICAqIGNhbmNlbCB0aGUgYXV0byByZWNvbm5lY3QgYW5kIHVuc3Vic2NyaWJlIGFsbCBzdWJzY3JpcHRpb25zIGJhc2VkIG9uIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZSB8IHVuZGVmaW5lZH0gQ2xvc2VFdmVudCB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYlNvY2tldC9jbG9zZV9ldmVudH1cbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuSU5JVElBTElaRUQgfHwgdGhpcy5zdGF0ZSA9PT0gQ0xJRU5UX1NUQVRFLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLkRJU0NPTk5FQ1RFRDtcbiAgICB0aGlzLnNvY2tldD8uY2xvc2UoKTtcbiAgICAvLyBOb3RpZnkgZWFjaCBzdWJzY3JpcHRpb24gYWJvdXQgdGhlIGNsb3NlXG4gICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgKDAsIF92YWx1ZXMuZGVmYXVsdCkoX2NvbnRleHQyID0gdGhpcy5zdWJzY3JpcHRpb25zKS5jYWxsKF9jb250ZXh0MikpIHtcbiAgICAgIHZhciBfY29udGV4dDI7XG4gICAgICBzdWJzY3JpcHRpb24uc3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgc3Vic2NyaXB0aW9uLmVtaXQoU1VCU0NSSVBUSU9OX0VNTUlURVJfVFlQRVMuQ0xPU0UpO1xuICAgIH1cbiAgICB0aGlzLl9oYW5kbGVSZXNldCgpO1xuICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5DTE9TRSk7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5jbG9zaW5nUHJvbWlzZTtcbiAgfVxuXG4gIC8vIGVuc3VyZSB3ZSBzdGFydCB3aXRoIHZhbGlkIHN0YXRlIGlmIGNvbm5lY3QgaXMgY2FsbGVkIGFnYWluIGFmdGVyIGNsb3NlXG4gIF9oYW5kbGVSZXNldCgpIHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMTtcbiAgICB0aGlzLmlkID0gMDtcbiAgICB0aGlzLnJlcXVlc3RJZCA9IDE7XG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gbmV3IF9tYXAuZGVmYXVsdCgpO1xuICB9XG4gIF9oYW5kbGVXZWJTb2NrZXRPcGVuKCkge1xuICAgIGNvbnN0IGNvbm5lY3RSZXF1ZXN0ID0ge1xuICAgICAgb3A6IE9QX1RZUEVTLkNPTk5FQ1QsXG4gICAgICBhcHBsaWNhdGlvbklkOiB0aGlzLmFwcGxpY2F0aW9uSWQsXG4gICAgICBqYXZhc2NyaXB0S2V5OiB0aGlzLmphdmFzY3JpcHRLZXksXG4gICAgICBtYXN0ZXJLZXk6IHRoaXMubWFzdGVyS2V5LFxuICAgICAgc2Vzc2lvblRva2VuOiB0aGlzLnNlc3Npb25Ub2tlbixcbiAgICAgIGluc3RhbGxhdGlvbklkOiB1bmRlZmluZWRcbiAgICB9O1xuICAgIGlmICh0aGlzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKSB7XG4gICAgICBjb25uZWN0UmVxdWVzdC5pbnN0YWxsYXRpb25JZCA9IHRoaXMuaW5zdGFsbGF0aW9uSWQ7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0LnNlbmQoKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoY29ubmVjdFJlcXVlc3QpKTtcbiAgfVxuICBfaGFuZGxlV2ViU29ja2V0TWVzc2FnZShldmVudCkge1xuICAgIGxldCBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICB9XG4gICAgbGV0IHN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgaWYgKGRhdGEucmVxdWVzdElkKSB7XG4gICAgICBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KGRhdGEucmVxdWVzdElkKSB8fCBudWxsO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgIGNsaWVudElkOiBkYXRhLmNsaWVudElkLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IGRhdGEuaW5zdGFsbGF0aW9uSWRcbiAgICB9O1xuICAgIHN3aXRjaCAoZGF0YS5vcCkge1xuICAgICAgY2FzZSBPUF9FVkVOVFMuQ09OTkVDVEVEOlxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQ0xJRU5UX1NUQVRFLlJFQ09OTkVDVElORykge1xuICAgICAgICAgIHRoaXMucmVzdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoQ0xJRU5UX0VNTUlURVJfVFlQRVMuT1BFTik7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmNsaWVudElkO1xuICAgICAgICB0aGlzLmNvbm5lY3RQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENMSUVOVF9TVEFURS5DT05ORUNURUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPUF9FVkVOVFMuU1VCU0NSSUJFRDpcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgIHRoaXMuYXR0ZW1wdHMgPSAxO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgICBzdWJzY3JpcHRpb24uc3Vic2NyaWJlUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgKDAsIF9zZXRUaW1lb3V0Mi5kZWZhdWx0KSgoKSA9PiBzdWJzY3JpcHRpb24uZW1pdChTVUJTQ1JJUFRJT05fRU1NSVRFUl9UWVBFUy5PUEVOLCByZXNwb25zZSksIDIwMCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9QX0VWRU5UUy5FUlJPUjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHBhcnNlRXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChkYXRhLmNvZGUsIGRhdGEuZXJyb3IpO1xuICAgICAgICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZS5yZWplY3QocGFyc2VFcnJvcik7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLkRJU0NPTk5FQ1RFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRhdGEucmVxdWVzdElkKSB7XG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVQcm9taXNlLnJlamVjdChwYXJzZUVycm9yKTtcbiAgICAgICAgICAgICAgKDAsIF9zZXRUaW1lb3V0Mi5kZWZhdWx0KSgoKSA9PiBzdWJzY3JpcHRpb24uZW1pdChTVUJTQ1JJUFRJT05fRU1NSVRFUl9UWVBFUy5FUlJPUiwgZGF0YS5lcnJvciksIDIwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5FUlJPUiwgZGF0YS5lcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLmVycm9yID09PSAnQWRkaXRpb25hbCBwcm9wZXJ0aWVzIG5vdCBhbGxvd2VkJykge1xuICAgICAgICAgICAgdGhpcy5hZGRpdGlvbmFsUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGF0YS5yZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVJlY29ubmVjdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSBPUF9FVkVOVFMuVU5TVUJTQ1JJQkVEOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShkYXRhLnJlcXVlc3RJZCk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uc3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gY3JlYXRlLCB1cGRhdGUsIGVudGVyLCBsZWF2ZSwgZGVsZXRlIGNhc2VzXG4gICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgb3ZlcnJpZGUgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoZGF0YS5vcmlnaW5hbCkge1xuICAgICAgICAgICAgb3ZlcnJpZGUgPSB0cnVlO1xuICAgICAgICAgICAgZGVsZXRlIGRhdGEub3JpZ2luYWwuX190eXBlO1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHJlbW92ZWQgZmllbGRzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIGRhdGEub3JpZ2luYWwpIHtcbiAgICAgICAgICAgICAgaWYgKCEoZmllbGQgaW4gZGF0YS5vYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5vYmplY3RbZmllbGRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLm9yaWdpbmFsID0gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04oZGF0YS5vcmlnaW5hbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgZGF0YS5vYmplY3QuX190eXBlO1xuICAgICAgICAgIGNvbnN0IHBhcnNlT2JqZWN0ID0gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04oZGF0YS5vYmplY3QsICEoc3Vic2NyaXB0aW9uLnF1ZXJ5ICYmIHN1YnNjcmlwdGlvbi5xdWVyeS5fc2VsZWN0KSA/IG92ZXJyaWRlIDogZmFsc2UpO1xuICAgICAgICAgIGlmIChkYXRhLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uZW1pdChkYXRhLm9wLCBwYXJzZU9iamVjdCwgZGF0YS5vcmlnaW5hbCwgcmVzcG9uc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uZW1pdChkYXRhLm9wLCBwYXJzZU9iamVjdCwgcmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgICAgICAgaWYgKG92ZXJyaWRlICYmIGxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgICAgICAgbG9jYWxEYXRhc3RvcmUuX3VwZGF0ZU9iamVjdElmUGlubmVkKHBhcnNlT2JqZWN0KS50aGVuKCgpID0+IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2hhbmRsZVdlYlNvY2tldENsb3NlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuRElTQ09OTkVDVEVEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSBDTElFTlRfU1RBVEUuQ0xPU0VEO1xuICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5DTE9TRSk7XG4gICAgLy8gTm90aWZ5IGVhY2ggc3Vic2NyaXB0aW9uIGFib3V0IHRoZSBjbG9zZVxuICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mICgwLCBfdmFsdWVzLmRlZmF1bHQpKF9jb250ZXh0MyA9IHRoaXMuc3Vic2NyaXB0aW9ucykuY2FsbChfY29udGV4dDMpKSB7XG4gICAgICB2YXIgX2NvbnRleHQzO1xuICAgICAgc3Vic2NyaXB0aW9uLmVtaXQoU1VCU0NSSVBUSU9OX0VNTUlURVJfVFlQRVMuQ0xPU0UpO1xuICAgIH1cbiAgICB0aGlzLl9oYW5kbGVSZWNvbm5lY3QoKTtcbiAgfVxuICBfaGFuZGxlV2ViU29ja2V0RXJyb3IoZXJyb3IpIHtcbiAgICB0aGlzLmVtaXQoQ0xJRU5UX0VNTUlURVJfVFlQRVMuRVJST1IsIGVycm9yKTtcbiAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiAoMCwgX3ZhbHVlcy5kZWZhdWx0KShfY29udGV4dDQgPSB0aGlzLnN1YnNjcmlwdGlvbnMpLmNhbGwoX2NvbnRleHQ0KSkge1xuICAgICAgdmFyIF9jb250ZXh0NDtcbiAgICAgIHN1YnNjcmlwdGlvbi5lbWl0KFNVQlNDUklQVElPTl9FTU1JVEVSX1RZUEVTLkVSUk9SLCBlcnJvcik7XG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZVJlY29ubmVjdCgpO1xuICB9XG4gIF9oYW5kbGVSZWNvbm5lY3QoKSB7XG4gICAgdmFyIF9jb250ZXh0NTtcbiAgICAvLyBpZiBjbG9zZWQgb3IgY3VycmVudGx5IHJlY29ubmVjdGluZyB3ZSBzdG9wIGF0dGVtcHRpbmcgdG8gcmVjb25uZWN0XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5ESVNDT05ORUNURUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IENMSUVOVF9TVEFURS5SRUNPTk5FQ1RJTkc7XG4gICAgY29uc3QgdGltZSA9IGdlbmVyYXRlSW50ZXJ2YWwodGhpcy5hdHRlbXB0cyk7XG5cbiAgICAvLyBoYW5kbGUgY2FzZSB3aGVuIGJvdGggY2xvc2UvZXJyb3Igb2NjdXIgYXQgZnJlcXVlbnQgcmF0ZXMgd2UgZW5zdXJlIHdlIGRvIG5vdCByZWNvbm5lY3QgdW5uZWNlc3NhcmlseS5cbiAgICAvLyB3ZSdyZSB1bmFibGUgdG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IGJldHdlZW4gY2xvc2UvZXJyb3Igd2hlbiB3ZSdyZSB1bmFibGUgdG8gcmVjb25uZWN0IHRoZXJlZm9yZVxuICAgIC8vIHdlIHRyeSB0byByZWNvbm5lY3QgaW4gYm90aCBjYXNlc1xuICAgIC8vIHNlcnZlciBzaWRlIHdzIGFuZCBicm93c2VyIFdlYlNvY2tldCBiZWhhdmUgZGlmZmVyZW50bHkgaW4gd2hlbiBjbG9zZS9lcnJvciBnZXQgdHJpZ2dlcmVkXG4gICAgaWYgKHRoaXMucmVjb25uZWN0SGFuZGxlKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RIYW5kbGUpO1xuICAgIH1cbiAgICB0aGlzLnJlY29ubmVjdEhhbmRsZSA9ICgwLCBfc2V0VGltZW91dDIuZGVmYXVsdCkoKDAsIF9iaW5kLmRlZmF1bHQpKF9jb250ZXh0NSA9ICgpID0+IHtcbiAgICAgIHRoaXMuYXR0ZW1wdHMrKztcbiAgICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfSkuY2FsbChfY29udGV4dDUsIHRoaXMpLCB0aW1lKTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gTGl2ZVF1ZXJ5Q2xpZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX3Byb21pc2VVdGlscyA9IHJlcXVpcmUoXCIuL3Byb21pc2VVdGlsc1wiKTtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBMaXZlUXVlcnkgU3Vic2NyaXB0aW9uLlxuICogPGEgaHJlZj1cImh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZXZlbnRzLmh0bWwjZXZlbnRzX2NsYXNzX2V2ZW50ZW1pdHRlclwiPmNsb3VkIGZ1bmN0aW9uczwvYT4uXG4gKlxuICogPHA+UmVzcG9uc2UgT2JqZWN0IC0gQ29udGFpbnMgZGF0YSBmcm9tIHRoZSBjbGllbnQgdGhhdCBtYWRlIHRoZSByZXF1ZXN0XG4gKiA8dWw+XG4gKiA8bGk+Y2xpZW50SWQ8L2xpPlxuICogPGxpPmluc3RhbGxhdGlvbklkIC0gcmVxdWlyZXMgUGFyc2UgU2VydmVyIDQuMC4wKzwvbGk+XG4gKiA8L3VsPlxuICogPC9wPlxuICpcbiAqIDxwPk9wZW4gRXZlbnQgLSBXaGVuIHlvdSBjYWxsIHF1ZXJ5LnN1YnNjcmliZSgpLCB3ZSBzZW5kIGEgc3Vic2NyaWJlIHJlcXVlc3QgdG9cbiAqIHRoZSBMaXZlUXVlcnkgc2VydmVyLCB3aGVuIHdlIGdldCB0aGUgY29uZmlybWF0aW9uIGZyb20gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsXG4gKiB0aGlzIGV2ZW50IHdpbGwgYmUgZW1pdHRlZC4gV2hlbiB0aGUgY2xpZW50IGxvc2VzIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZVxuICogTGl2ZVF1ZXJ5IHNlcnZlciwgd2Ugd2lsbCB0cnkgdG8gYXV0byByZWNvbm5lY3QgdGhlIExpdmVRdWVyeSBzZXJ2ZXIuIElmIHdlXG4gKiByZWNvbm5lY3QgdGhlIExpdmVRdWVyeSBzZXJ2ZXIgYW5kIHN1Y2Nlc3NmdWxseSByZXN1YnNjcmliZSB0aGUgUGFyc2VRdWVyeSxcbiAqIHlvdSdsbCBhbHNvIGdldCB0aGlzIGV2ZW50LlxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ29wZW4nLCAocmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+Q3JlYXRlIEV2ZW50IC0gV2hlbiBhIG5ldyBQYXJzZU9iamVjdCBpcyBjcmVhdGVkIGFuZCBpdCBmdWxmaWxscyB0aGUgUGFyc2VRdWVyeSB5b3Ugc3Vic2NyaWJlLFxuICogeW91J2xsIGdldCB0aGlzIGV2ZW50LiBUaGUgb2JqZWN0IGlzIHRoZSBQYXJzZU9iamVjdCB3aGljaCBpcyBjcmVhdGVkLlxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ2NyZWF0ZScsIChvYmplY3QsIHJlc3BvbnNlKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIDxwPlVwZGF0ZSBFdmVudCAtIFdoZW4gYW4gZXhpc3RpbmcgUGFyc2VPYmplY3QgKG9yaWdpbmFsKSB3aGljaCBmdWxmaWxscyB0aGUgUGFyc2VRdWVyeSB5b3Ugc3Vic2NyaWJlXG4gKiBpcyB1cGRhdGVkIChUaGUgUGFyc2VPYmplY3QgZnVsZmlsbHMgdGhlIFBhcnNlUXVlcnkgYmVmb3JlIGFuZCBhZnRlciBjaGFuZ2VzKSxcbiAqIHlvdSdsbCBnZXQgdGhpcyBldmVudC4gVGhlIG9iamVjdCBpcyB0aGUgUGFyc2VPYmplY3Qgd2hpY2ggaXMgdXBkYXRlZC5cbiAqIEl0cyBjb250ZW50IGlzIHRoZSBsYXRlc3QgdmFsdWUgb2YgdGhlIFBhcnNlT2JqZWN0LlxuICpcbiAqIFBhcnNlLVNlcnZlciAzLjEuMysgUmVxdWlyZWQgZm9yIG9yaWdpbmFsIG9iamVjdCBwYXJhbWV0ZXJcbiAqXG4gKiA8cHJlPlxuICogc3Vic2NyaXB0aW9uLm9uKCd1cGRhdGUnLCAob2JqZWN0LCBvcmlnaW5hbCwgcmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+RW50ZXIgRXZlbnQgLSBXaGVuIGFuIGV4aXN0aW5nIFBhcnNlT2JqZWN0J3MgKG9yaWdpbmFsKSBvbGQgdmFsdWUgZG9lc24ndCBmdWxmaWxsIHRoZSBQYXJzZVF1ZXJ5XG4gKiBidXQgaXRzIG5ldyB2YWx1ZSBmdWxmaWxscyB0aGUgUGFyc2VRdWVyeSwgeW91J2xsIGdldCB0aGlzIGV2ZW50LiBUaGUgb2JqZWN0IGlzIHRoZVxuICogUGFyc2VPYmplY3Qgd2hpY2ggZW50ZXJzIHRoZSBQYXJzZVF1ZXJ5LiBJdHMgY29udGVudCBpcyB0aGUgbGF0ZXN0IHZhbHVlIG9mIHRoZSBQYXJzZU9iamVjdC5cbiAqXG4gKiBQYXJzZS1TZXJ2ZXIgMy4xLjMrIFJlcXVpcmVkIGZvciBvcmlnaW5hbCBvYmplY3QgcGFyYW1ldGVyXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbignZW50ZXInLCAob2JqZWN0LCBvcmlnaW5hbCwgcmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICpcbiAqIDxwPlVwZGF0ZSBFdmVudCAtIFdoZW4gYW4gZXhpc3RpbmcgUGFyc2VPYmplY3QncyBvbGQgdmFsdWUgZnVsZmlsbHMgdGhlIFBhcnNlUXVlcnkgYnV0IGl0cyBuZXcgdmFsdWVcbiAqIGRvZXNuJ3QgZnVsZmlsbCB0aGUgUGFyc2VRdWVyeSwgeW91J2xsIGdldCB0aGlzIGV2ZW50LiBUaGUgb2JqZWN0IGlzIHRoZSBQYXJzZU9iamVjdFxuICogd2hpY2ggbGVhdmVzIHRoZSBQYXJzZVF1ZXJ5LiBJdHMgY29udGVudCBpcyB0aGUgbGF0ZXN0IHZhbHVlIG9mIHRoZSBQYXJzZU9iamVjdC5cbiAqXG4gKiA8cHJlPlxuICogc3Vic2NyaXB0aW9uLm9uKCdsZWF2ZScsIChvYmplY3QsIHJlc3BvbnNlKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqXG4gKiA8cD5EZWxldGUgRXZlbnQgLSBXaGVuIGFuIGV4aXN0aW5nIFBhcnNlT2JqZWN0IHdoaWNoIGZ1bGZpbGxzIHRoZSBQYXJzZVF1ZXJ5IGlzIGRlbGV0ZWQsIHlvdSdsbFxuICogZ2V0IHRoaXMgZXZlbnQuIFRoZSBvYmplY3QgaXMgdGhlIFBhcnNlT2JqZWN0IHdoaWNoIGlzIGRlbGV0ZWQuXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbignZGVsZXRlJywgKG9iamVjdCwgcmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICpcbiAqIDxwPkNsb3NlIEV2ZW50IC0gV2hlbiB0aGUgY2xpZW50IGxvc2VzIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5XG4gKiBzZXJ2ZXIgYW5kIHdlIHN0b3AgcmVjZWl2aW5nIGV2ZW50cywgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqL1xuY2xhc3MgU3Vic2NyaXB0aW9uIHtcbiAgLypcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gc3Vic2NyaXB0aW9uIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSAtIHF1ZXJ5IHRvIHN1YnNjcmliZSB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblRva2VuIC0gb3B0aW9uYWwgc2Vzc2lvbiB0b2tlblxuICAgKi9cbiAgY29uc3RydWN0b3IoaWQsIHF1ZXJ5LCBzZXNzaW9uVG9rZW4pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiaWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInF1ZXJ5XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzZXNzaW9uVG9rZW5cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInN1YnNjcmliZVByb21pc2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInVuc3Vic2NyaWJlUHJvbWlzZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic3Vic2NyaWJlZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiZW1pdHRlclwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImVtaXRcIiwgdm9pZCAwKTtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMuc2Vzc2lvblRva2VuID0gc2Vzc2lvblRva2VuO1xuICAgIHRoaXMuc3Vic2NyaWJlUHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZVByb21pc2UgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgIHRoaXMuc3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgIGNvbnN0IEV2ZW50RW1pdHRlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLm9uID0gKGV2ZW50TmFtZSwgbGlzdGVuZXIpID0+IHRoaXMuZW1pdHRlci5vbihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90aGlzLmVtaXR0ZXIuZW1pdChldmVudE5hbWUsIC4uLmFyZ3MpO1xuICAgIH07XG4gICAgLy8gYWRkaW5nIGxpc3RlbmVyIHNvIHByb2Nlc3MgZG9lcyBub3QgY3Jhc2hcbiAgICAvLyBiZXN0IHByYWN0aWNlIGlzIGZvciBkZXZlbG9wZXIgdG8gcmVnaXN0ZXIgdGhlaXIgb3duIGxpc3RlbmVyXG4gICAgdGhpcy5vbignZXJyb3InLCAoKSA9PiB7fSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIHN1YnNjcmlwdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHVuc3Vic2NyaWJlKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMaXZlUXVlcnlDb250cm9sbGVyKCkuZ2V0RGVmYXVsdExpdmVRdWVyeUNsaWVudCgpLnRoZW4obGl2ZVF1ZXJ5Q2xpZW50ID0+IHtcbiAgICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgICAgIHJldHVybiBsaXZlUXVlcnlDbGllbnQudW5zdWJzY3JpYmUodGhpcyk7XG4gICAgfSk7XG4gIH1cbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN1YnNjcmlwdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfc2V0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXRcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX2ZpbHRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmlsdGVyXCIpKTtcbnZhciBfaW5jbHVkZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpKTtcbnZhciBfc3RhcnRzV2l0aCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGhcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfY29uY2F0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXRcIikpO1xudmFyIF9mcm9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9mcm9tXCIpKTtcbnZhciBfZmluZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyXCIpKTtcbnZhciBfUGFyc2VRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VRdWVyeVwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlVXRpbHMgPSByZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZVV0aWxzXCIpO1xuLyoqXG4gKiBQcm92aWRlcyBhIGxvY2FsIGRhdGFzdG9yZSB3aGljaCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi4gPGJyIC8+XG4gKiBUbyBlbmFibGUgdGhpcyBmdW5jdGlvbmFsaXR5LCBjYWxsIDxjb2RlPlBhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+LlxuICpcbiAqIFBpbiBvYmplY3QgdG8gYWRkIHRvIGxvY2FsIGRhdGFzdG9yZVxuICpcbiAqIDxwcmU+YXdhaXQgb2JqZWN0LnBpbigpOzwvcHJlPlxuICogPHByZT5hd2FpdCBvYmplY3QucGluV2l0aE5hbWUoJ3Bpbk5hbWUnKTs8L3ByZT5cbiAqXG4gKiBRdWVyeSBwaW5uZWQgb2JqZWN0c1xuICpcbiAqIDxwcmU+cXVlcnkuZnJvbUxvY2FsRGF0YXN0b3JlKCk7PC9wcmU+XG4gKiA8cHJlPnF1ZXJ5LmZyb21QaW4oKTs8L3ByZT5cbiAqIDxwcmU+cXVlcnkuZnJvbVBpbldpdGhOYW1lKCk7PC9wcmU+XG4gKlxuICogPHByZT5jb25zdCBsb2NhbE9iamVjdHMgPSBhd2FpdCBxdWVyeS5maW5kKCk7PC9wcmU+XG4gKlxuICogQGNsYXNzIFBhcnNlLkxvY2FsRGF0YXN0b3JlXG4gKiBAc3RhdGljXG4gKi9cbmNvbnN0IExvY2FsRGF0YXN0b3JlID0ge1xuICBpc0VuYWJsZWQ6IGZhbHNlLFxuICBpc1N5bmNpbmc6IGZhbHNlLFxuICBmcm9tUGluV2l0aE5hbWUobmFtZSkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5mcm9tUGluV2l0aE5hbWUobmFtZSk7XG4gIH0sXG4gIGFzeW5jIHBpbldpdGhOYW1lKG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnBpbldpdGhOYW1lKG5hbWUsIHZhbHVlKTtcbiAgfSxcbiAgYXN5bmMgdW5QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnVuUGluV2l0aE5hbWUobmFtZSk7XG4gIH0sXG4gIF9nZXRBbGxDb250ZW50cygpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0QWxsQ29udGVudHMoKTtcbiAgfSxcbiAgLy8gVXNlIGZvciB0ZXN0aW5nXG4gIGFzeW5jIF9nZXRSYXdTdG9yYWdlKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5nZXRSYXdTdG9yYWdlKCk7XG4gIH0sXG4gIGFzeW5jIF9jbGVhcigpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuY2xlYXIoKTtcbiAgfSxcbiAgLy8gUGluIHRoZSBvYmplY3QgYW5kIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5XG4gIC8vIFNhdmVzIHRoZSBvYmplY3QgYW5kIGNoaWxkcmVuIGtleSB0byBQaW4gTmFtZVxuICBhc3luYyBfaGFuZGxlUGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cykge1xuICAgIGNvbnN0IHBpbk5hbWUgPSB0aGlzLmdldFBpbk5hbWUobmFtZSk7XG4gICAgY29uc3QgdG9QaW5Qcm9taXNlcyA9IFtdO1xuICAgIGNvbnN0IG9iamVjdEtleXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBvYmplY3RzKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldENoaWxkcmVuKHBhcmVudCk7XG4gICAgICBjb25zdCBwYXJlbnRLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChwYXJlbnQpO1xuICAgICAgY29uc3QganNvbiA9IHBhcmVudC5fdG9GdWxsSlNPTih1bmRlZmluZWQsIHRydWUpO1xuICAgICAgaWYgKHBhcmVudC5fbG9jYWxJZCkge1xuICAgICAgICBqc29uLl9sb2NhbElkID0gcGFyZW50Ll9sb2NhbElkO1xuICAgICAgfVxuICAgICAgY2hpbGRyZW5bcGFyZW50S2V5XSA9IGpzb247XG4gICAgICBmb3IgKGNvbnN0IG9iamVjdEtleSBpbiBjaGlsZHJlbikge1xuICAgICAgICBvYmplY3RLZXlzLnB1c2gob2JqZWN0S2V5KTtcbiAgICAgICAgdG9QaW5Qcm9taXNlcy5wdXNoKHRoaXMucGluV2l0aE5hbWUob2JqZWN0S2V5LCBbY2hpbGRyZW5bb2JqZWN0S2V5XV0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZnJvbVBpblByb21pc2UgPSB0aGlzLmZyb21QaW5XaXRoTmFtZShwaW5OYW1lKTtcbiAgICBjb25zdCBbcGlubmVkXSA9IGF3YWl0IF9wcm9taXNlLmRlZmF1bHQuYWxsKFtmcm9tUGluUHJvbWlzZSwgdG9QaW5Qcm9taXNlc10pO1xuICAgIGNvbnN0IHRvUGluID0gWy4uLm5ldyBfc2V0LmRlZmF1bHQoWy4uLihwaW5uZWQgfHwgW10pLCAuLi5vYmplY3RLZXlzXSldO1xuICAgIHJldHVybiB0aGlzLnBpbldpdGhOYW1lKHBpbk5hbWUsIHRvUGluKTtcbiAgfSxcbiAgLy8gUmVtb3ZlcyBvYmplY3QgYW5kIGNoaWxkcmVuIGtleXMgZnJvbSBwaW4gbmFtZVxuICAvLyBLZWVwcyB0aGUgb2JqZWN0IGFuZCBjaGlsZHJlbiBwaW5uZWRcbiAgYXN5bmMgX2hhbmRsZVVuUGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cykge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gYXdhaXQgdGhpcy5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICBjb25zdCBwaW5OYW1lID0gdGhpcy5nZXRQaW5OYW1lKG5hbWUpO1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgbGV0IG9iamVjdEtleXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBvYmplY3RzKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldENoaWxkcmVuKHBhcmVudCk7XG4gICAgICBjb25zdCBwYXJlbnRLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChwYXJlbnQpO1xuICAgICAgb2JqZWN0S2V5cy5wdXNoKHBhcmVudEtleSwgLi4uKDAsIF9rZXlzLmRlZmF1bHQpKGNoaWxkcmVuKSk7XG4gICAgfVxuICAgIG9iamVjdEtleXMgPSBbLi4ubmV3IF9zZXQuZGVmYXVsdChvYmplY3RLZXlzKV07XG4gICAgbGV0IHBpbm5lZCA9IGxvY2FsRGF0YXN0b3JlW3Bpbk5hbWVdIHx8IFtdO1xuICAgIHBpbm5lZCA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKHBpbm5lZCkuY2FsbChwaW5uZWQsIGl0ZW0gPT4gISgwLCBfaW5jbHVkZXMuZGVmYXVsdCkob2JqZWN0S2V5cykuY2FsbChvYmplY3RLZXlzLCBpdGVtKSk7XG4gICAgaWYgKHBpbm5lZC5sZW5ndGggPT0gMCkge1xuICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnVuUGluV2l0aE5hbWUocGluTmFtZSkpO1xuICAgICAgZGVsZXRlIGxvY2FsRGF0YXN0b3JlW3Bpbk5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHRoaXMucGluV2l0aE5hbWUocGluTmFtZSwgcGlubmVkKSk7XG4gICAgICBsb2NhbERhdGFzdG9yZVtwaW5OYW1lXSA9IHBpbm5lZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvYmplY3RLZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgICAgbGV0IGhhc1JlZmVyZW5jZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4gfHwgKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIF9Mb2NhbERhdGFzdG9yZVV0aWxzLlBJTl9QUkVGSVgpKSB7XG4gICAgICAgICAgY29uc3QgcGlubmVkT2JqZWN0cyA9IGxvY2FsRGF0YXN0b3JlW2tleV0gfHwgW107XG4gICAgICAgICAgaWYgKCgwLCBfaW5jbHVkZXMuZGVmYXVsdCkocGlubmVkT2JqZWN0cykuY2FsbChwaW5uZWRPYmplY3RzLCBvYmplY3RLZXkpKSB7XG4gICAgICAgICAgICBoYXNSZWZlcmVuY2UgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWhhc1JlZmVyZW5jZSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMudW5QaW5XaXRoTmFtZShvYmplY3RLZXkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQuYWxsKHByb21pc2VzKTtcbiAgfSxcbiAgLy8gUmV0cmlldmUgYWxsIHBvaW50ZXIgZmllbGRzIGZyb20gb2JqZWN0IHJlY3Vyc2l2ZWx5XG4gIF9nZXRDaGlsZHJlbihvYmplY3QpIHtcbiAgICBjb25zdCBlbmNvdW50ZXJlZCA9IHt9O1xuICAgIGNvbnN0IGpzb24gPSBvYmplY3QuX3RvRnVsbEpTT04odW5kZWZpbmVkLCB0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICBpZiAoanNvbltrZXldICYmIGpzb25ba2V5XS5fX3R5cGUgJiYganNvbltrZXldLl9fdHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICAgICAgdGhpcy5fdHJhdmVyc2UoanNvbltrZXldLCBlbmNvdW50ZXJlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbmNvdW50ZXJlZDtcbiAgfSxcbiAgX3RyYXZlcnNlKG9iamVjdCwgZW5jb3VudGVyZWQpIHtcbiAgICBpZiAoIW9iamVjdC5vYmplY3RJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChvYmplY3QpO1xuICAgICAgaWYgKGVuY291bnRlcmVkW29iamVjdEtleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZW5jb3VudGVyZWRbb2JqZWN0S2V5XSA9IG9iamVjdDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBsZXQganNvbiA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKCFvYmplY3Rba2V5XSkge1xuICAgICAgICBqc29uID0gb2JqZWN0O1xuICAgICAgfVxuICAgICAgaWYgKGpzb24uX190eXBlICYmIGpzb24uX190eXBlID09PSAnT2JqZWN0Jykge1xuICAgICAgICB0aGlzLl90cmF2ZXJzZShqc29uLCBlbmNvdW50ZXJlZCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyBUcmFuc2Zvcm0ga2V5cyBpbiBwaW4gbmFtZSB0byBvYmplY3RzXG4gIGFzeW5jIF9zZXJpYWxpemVPYmplY3RzRnJvbVBpbk5hbWUobmFtZSkge1xuICAgIHZhciBfY29udGV4dDtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IGF3YWl0IHRoaXMuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgY29uc3QgYWxsT2JqZWN0cyA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsRGF0YXN0b3JlKSB7XG4gICAgICBpZiAoKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIF9Mb2NhbERhdGFzdG9yZVV0aWxzLk9CSkVDVF9QUkVGSVgpKSB7XG4gICAgICAgIGFsbE9iamVjdHMucHVzaChsb2NhbERhdGFzdG9yZVtrZXldWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm4gYWxsT2JqZWN0cztcbiAgICB9XG4gICAgY29uc3QgcGluTmFtZSA9IHRoaXMuZ2V0UGluTmFtZShuYW1lKTtcbiAgICBjb25zdCBwaW5uZWQgPSBsb2NhbERhdGFzdG9yZVtwaW5OYW1lXTtcbiAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KShwaW5uZWQpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VzID0gKDAsIF9tYXAuZGVmYXVsdCkocGlubmVkKS5jYWxsKHBpbm5lZCwgb2JqZWN0S2V5ID0+IHRoaXMuZnJvbVBpbldpdGhOYW1lKG9iamVjdEtleSkpO1xuICAgIGxldCBvYmplY3RzID0gYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMpO1xuICAgIG9iamVjdHMgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dCA9IFtdKS5jYWxsKF9jb250ZXh0LCAuLi5vYmplY3RzKTtcbiAgICByZXR1cm4gKDAsIF9maWx0ZXIuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCBvYmplY3QgPT4gb2JqZWN0ICE9IG51bGwpO1xuICB9LFxuICAvLyBSZXBsYWNlcyBvYmplY3QgcG9pbnRlcnMgd2l0aCBwaW5uZWQgcG9pbnRlcnNcbiAgLy8gVGhlIG9iamVjdCBwb2ludGVycyBtYXkgY29udGFpbiBvbGQgZGF0YVxuICAvLyBVc2VzIEJyZWFkdGggRmlyc3QgU2VhcmNoIEFsZ29yaXRobVxuICBhc3luYyBfc2VyaWFsaXplT2JqZWN0KG9iamVjdEtleSwgbG9jYWxEYXRhc3RvcmUpIHtcbiAgICBsZXQgTERTID0gbG9jYWxEYXRhc3RvcmU7XG4gICAgaWYgKCFMRFMpIHtcbiAgICAgIExEUyA9IGF3YWl0IHRoaXMuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgfVxuICAgIGlmICghTERTW29iamVjdEtleV0gfHwgTERTW29iamVjdEtleV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgcm9vdCA9IExEU1tvYmplY3RLZXldWzBdO1xuICAgIGNvbnN0IHF1ZXVlID0gW107XG4gICAgY29uc3QgbWV0YSA9IHt9O1xuICAgIGxldCB1bmlxdWVJZCA9IDA7XG4gICAgbWV0YVt1bmlxdWVJZF0gPSByb290O1xuICAgIHF1ZXVlLnB1c2godW5pcXVlSWQpO1xuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnN0IG5vZGVJZCA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICBjb25zdCBzdWJUcmVlUm9vdCA9IG1ldGFbbm9kZUlkXTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gc3ViVHJlZVJvb3QpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdWJUcmVlUm9vdFtmaWVsZF07XG4gICAgICAgIGlmICh2YWx1ZS5fX3R5cGUgJiYgdmFsdWUuX190eXBlID09PSAnT2JqZWN0Jykge1xuICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICBpZiAoTERTW2tleV0gJiYgTERTW2tleV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRlciA9IExEU1trZXldWzBdO1xuICAgICAgICAgICAgdW5pcXVlSWQrKztcbiAgICAgICAgICAgIG1ldGFbdW5pcXVlSWRdID0gcG9pbnRlcjtcbiAgICAgICAgICAgIHN1YlRyZWVSb290W2ZpZWxkXSA9IHBvaW50ZXI7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKHVuaXF1ZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0sXG4gIC8vIENhbGxlZCB3aGVuIGFuIG9iamVjdCBpcyBzYXZlIC8gZmV0Y2hlZFxuICAvLyBVcGRhdGUgb2JqZWN0IHBpbiB2YWx1ZVxuICBhc3luYyBfdXBkYXRlT2JqZWN0SWZQaW5uZWQob2JqZWN0KSB7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChvYmplY3QpO1xuICAgIGNvbnN0IHBpbm5lZCA9IGF3YWl0IHRoaXMuZnJvbVBpbldpdGhOYW1lKG9iamVjdEtleSk7XG4gICAgaWYgKCFwaW5uZWQgfHwgcGlubmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5waW5XaXRoTmFtZShvYmplY3RLZXksIFtvYmplY3QuX3RvRnVsbEpTT04oKV0pO1xuICB9LFxuICAvLyBDYWxsZWQgd2hlbiBvYmplY3QgaXMgZGVzdHJveWVkXG4gIC8vIFVucGluIG9iamVjdCBhbmQgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIGZyb20gcGluIG5hbWVzXG4gIC8vIFRPRE86IERlc3Ryb3kgY2hpbGRyZW4/XG4gIGFzeW5jIF9kZXN0cm95T2JqZWN0SWZQaW5uZWQob2JqZWN0KSB7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IGF3YWl0IHRoaXMuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0KTtcbiAgICBjb25zdCBwaW4gPSBsb2NhbERhdGFzdG9yZVtvYmplY3RLZXldO1xuICAgIGlmICghcGluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VzID0gW3RoaXMudW5QaW5XaXRoTmFtZShvYmplY3RLZXkpXTtcbiAgICBkZWxldGUgbG9jYWxEYXRhc3RvcmVbb2JqZWN0S2V5XTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbERhdGFzdG9yZSkge1xuICAgICAgaWYgKGtleSA9PT0gX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4gfHwgKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIF9Mb2NhbERhdGFzdG9yZVV0aWxzLlBJTl9QUkVGSVgpKSB7XG4gICAgICAgIGxldCBwaW5uZWQgPSBsb2NhbERhdGFzdG9yZVtrZXldIHx8IFtdO1xuICAgICAgICBpZiAoKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShwaW5uZWQpLmNhbGwocGlubmVkLCBvYmplY3RLZXkpKSB7XG4gICAgICAgICAgcGlubmVkID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkocGlubmVkKS5jYWxsKHBpbm5lZCwgaXRlbSA9PiBpdGVtICE9PSBvYmplY3RLZXkpO1xuICAgICAgICAgIGlmIChwaW5uZWQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy51blBpbldpdGhOYW1lKGtleSkpO1xuICAgICAgICAgICAgZGVsZXRlIGxvY2FsRGF0YXN0b3JlW2tleV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5waW5XaXRoTmFtZShrZXksIHBpbm5lZCkpO1xuICAgICAgICAgICAgbG9jYWxEYXRhc3RvcmVba2V5XSA9IHBpbm5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQuYWxsKHByb21pc2VzKTtcbiAgfSxcbiAgLy8gVXBkYXRlIHBpbiBhbmQgcmVmZXJlbmNlcyBvZiB0aGUgdW5zYXZlZCBvYmplY3RcbiAgYXN5bmMgX3VwZGF0ZUxvY2FsSWRGb3JPYmplY3QobG9jYWxJZCwgb2JqZWN0KSB7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2NhbEtleSA9IGAke19Mb2NhbERhdGFzdG9yZVV0aWxzLk9CSkVDVF9QUkVGSVh9JHtvYmplY3QuY2xhc3NOYW1lfV8ke2xvY2FsSWR9YDtcbiAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChvYmplY3QpO1xuICAgIGNvbnN0IHVuc2F2ZWQgPSBhd2FpdCB0aGlzLmZyb21QaW5XaXRoTmFtZShsb2NhbEtleSk7XG4gICAgaWYgKCF1bnNhdmVkIHx8IHVuc2F2ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VzID0gW3RoaXMudW5QaW5XaXRoTmFtZShsb2NhbEtleSksIHRoaXMucGluV2l0aE5hbWUob2JqZWN0S2V5LCB1bnNhdmVkKV07XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBhd2FpdCB0aGlzLl9nZXRBbGxDb250ZW50cygpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsRGF0YXN0b3JlKSB7XG4gICAgICBpZiAoa2V5ID09PSBfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiB8fCAoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuUElOX1BSRUZJWCkpIHtcbiAgICAgICAgbGV0IHBpbm5lZCA9IGxvY2FsRGF0YXN0b3JlW2tleV0gfHwgW107XG4gICAgICAgIGlmICgoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKHBpbm5lZCkuY2FsbChwaW5uZWQsIGxvY2FsS2V5KSkge1xuICAgICAgICAgIHBpbm5lZCA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKHBpbm5lZCkuY2FsbChwaW5uZWQsIGl0ZW0gPT4gaXRlbSAhPT0gbG9jYWxLZXkpO1xuICAgICAgICAgIHBpbm5lZC5wdXNoKG9iamVjdEtleSk7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnBpbldpdGhOYW1lKGtleSwgcGlubmVkKSk7XG4gICAgICAgICAgbG9jYWxEYXRhc3RvcmVba2V5XSA9IHBpbm5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMpO1xuICB9LFxuICAvKipcbiAgICogVXBkYXRlcyBMb2NhbCBEYXRhc3RvcmUgZnJvbSBTZXJ2ZXJcbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuTG9jYWxEYXRhc3RvcmUudXBkYXRlRnJvbVNlcnZlcigpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQGZ1bmN0aW9uIHVwZGF0ZUZyb21TZXJ2ZXJcbiAgICogQG5hbWUgUGFyc2UuTG9jYWxEYXRhc3RvcmUudXBkYXRlRnJvbVNlcnZlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICBhc3luYyB1cGRhdGVGcm9tU2VydmVyKCkge1xuICAgIHZhciBfY29udGV4dDI7XG4gICAgaWYgKCF0aGlzLmNoZWNrSWZFbmFibGVkKCkgfHwgdGhpcy5pc1N5bmNpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBhd2FpdCB0aGlzLl9nZXRBbGxDb250ZW50cygpO1xuICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbERhdGFzdG9yZSkge1xuICAgICAgaWYgKCgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCBfTG9jYWxEYXRhc3RvcmVVdGlscy5PQkpFQ1RfUFJFRklYKSkge1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNTeW5jaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwb2ludGVyc0hhc2ggPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAvLyBJZ25vcmUgdGhlIE9CSkVDVF9QUkVGSVhcbiAgICAgIGxldCBbLCwgY2xhc3NOYW1lLCBvYmplY3RJZF0gPSBrZXkuc3BsaXQoJ18nKTtcblxuICAgICAgLy8gVXNlciBrZXkgaXMgc3BsaXQgaW50byBbICdQYXJzZScsICdMRFMnLCAnJywgJ1VzZXInLCAnb2JqZWN0SWQnIF1cbiAgICAgIGlmIChrZXkuc3BsaXQoJ18nKS5sZW5ndGggPT09IDUgJiYga2V5LnNwbGl0KCdfJylbM10gPT09ICdVc2VyJykge1xuICAgICAgICBjbGFzc05hbWUgPSAnX1VzZXInO1xuICAgICAgICBvYmplY3RJZCA9IGtleS5zcGxpdCgnXycpWzRdO1xuICAgICAgfVxuICAgICAgaWYgKCgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShvYmplY3RJZCkuY2FsbChvYmplY3RJZCwgJ2xvY2FsJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIShjbGFzc05hbWUgaW4gcG9pbnRlcnNIYXNoKSkge1xuICAgICAgICBwb2ludGVyc0hhc2hbY2xhc3NOYW1lXSA9IG5ldyBfc2V0LmRlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIHBvaW50ZXJzSGFzaFtjbGFzc05hbWVdLmFkZChvYmplY3RJZCk7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5UHJvbWlzZXMgPSAoMCwgX21hcC5kZWZhdWx0KShfY29udGV4dDIgPSAoMCwgX2tleXMuZGVmYXVsdCkocG9pbnRlcnNIYXNoKSkuY2FsbChfY29udGV4dDIsIGNsYXNzTmFtZSA9PiB7XG4gICAgICBjb25zdCBvYmplY3RJZHMgPSAoMCwgX2Zyb20uZGVmYXVsdCkocG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0pO1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgX1BhcnNlUXVlcnkuZGVmYXVsdChjbGFzc05hbWUpO1xuICAgICAgcXVlcnkubGltaXQob2JqZWN0SWRzLmxlbmd0aCk7XG4gICAgICBpZiAob2JqZWN0SWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBxdWVyeS5lcXVhbFRvKCdvYmplY3RJZCcsIG9iamVjdElkc1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS5jb250YWluZWRJbignb2JqZWN0SWQnLCBvYmplY3RJZHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICgwLCBfZmluZC5kZWZhdWx0KShxdWVyeSkuY2FsbChxdWVyeSk7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IF9wcm9taXNlLmRlZmF1bHQuYWxsKHF1ZXJ5UHJvbWlzZXMpO1xuICAgICAgY29uc3Qgb2JqZWN0cyA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKFtdKS5hcHBseShbXSwgcmVzcG9uc2VzKTtcbiAgICAgIGNvbnN0IHBpblByb21pc2VzID0gKDAsIF9tYXAuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCBvYmplY3QgPT4ge1xuICAgICAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChvYmplY3QpO1xuICAgICAgICByZXR1cm4gdGhpcy5waW5XaXRoTmFtZShvYmplY3RLZXksIG9iamVjdC5fdG9GdWxsSlNPTigpKTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwocGluUHJvbWlzZXMpO1xuICAgICAgdGhpcy5pc1N5bmNpbmcgPSBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3luY2luZyBMb2NhbERhdGFzdG9yZTogJywgZXJyb3IpO1xuICAgICAgdGhpcy5pc1N5bmNpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIGdldEtleUZvck9iamVjdChvYmplY3QpIHtcbiAgICBjb25zdCBvYmplY3RJZCA9IG9iamVjdC5vYmplY3RJZCB8fCBvYmplY3QuX2dldElkKCk7XG4gICAgcmV0dXJuIGAke19Mb2NhbERhdGFzdG9yZVV0aWxzLk9CSkVDVF9QUkVGSVh9JHtvYmplY3QuY2xhc3NOYW1lfV8ke29iamVjdElkfWA7XG4gIH0sXG4gIGdldFBpbk5hbWUocGluTmFtZSkge1xuICAgIGlmICghcGluTmFtZSB8fCBwaW5OYW1lID09PSBfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTikge1xuICAgICAgcmV0dXJuIF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOO1xuICAgIH1cbiAgICByZXR1cm4gX0xvY2FsRGF0YXN0b3JlVXRpbHMuUElOX1BSRUZJWCArIHBpbk5hbWU7XG4gIH0sXG4gIGNoZWNrSWZFbmFibGVkKCkge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNFbmFibGVkO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBMb2NhbERhdGFzdG9yZTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IExvY2FsRGF0YXN0b3JlO1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKF9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIuZGVmYXVsdCk7XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRMb2NhbERhdGFzdG9yZShMb2NhbERhdGFzdG9yZSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX3JlZHVjZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvcmVkdWNlXCIpKTtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVVdGlscyA9IHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlVXRpbHNcIik7XG52YXIgX1N0b3JhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VcIikpO1xuY29uc3QgTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyID0ge1xuICBhc3luYyBmcm9tUGluV2l0aE5hbWUobmFtZSkge1xuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKG5hbWUpO1xuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdHMgPSBKU09OLnBhcnNlKHZhbHVlcyk7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH0sXG4gIHBpbldpdGhOYW1lKG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3QgdmFsdWVzID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkodmFsdWUpO1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhuYW1lLCB2YWx1ZXMpO1xuICB9LFxuICB1blBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5yZW1vdmVJdGVtQXN5bmMobmFtZSk7XG4gIH0sXG4gIGFzeW5jIGdldEFsbENvbnRlbnRzKCkge1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIHJldHVybiAoMCwgX3JlZHVjZS5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGFzeW5jIChwcmV2aW91c1Byb21pc2UsIGtleSkgPT4ge1xuICAgICAgY29uc3QgTERTID0gYXdhaXQgcHJldmlvdXNQcm9taXNlO1xuICAgICAgaWYgKCgwLCBfTG9jYWxEYXRhc3RvcmVVdGlscy5pc0xvY2FsRGF0YXN0b3JlS2V5KShrZXkpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMoa2V5KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBMRFNba2V5XSA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdldEFsbENvbnRlbnRzOiAnLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBMRFM7XG4gICAgfSwgX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHt9KSk7XG4gIH0sXG4gIC8vIFVzZWQgZm9yIHRlc3RpbmdcbiAgYXN5bmMgZ2V0UmF3U3RvcmFnZSgpIHtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICByZXR1cm4gKDAsIF9yZWR1Y2UuZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBhc3luYyAocHJldmlvdXNQcm9taXNlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IExEUyA9IGF3YWl0IHByZXZpb3VzUHJvbWlzZTtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMoa2V5KTtcbiAgICAgIExEU1trZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gTERTO1xuICAgIH0sIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh7fSkpO1xuICB9LFxuICBhc3luYyBjbGVhcigpIHtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmICgoMCwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuaXNMb2NhbERhdGFzdG9yZUtleSkoa2V5KSkge1xuICAgICAgICB0b1JlbW92ZS5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VzID0gKDAsIF9tYXAuZGVmYXVsdCkodG9SZW1vdmUpLmNhbGwodG9SZW1vdmUsIHRoaXMudW5QaW5XaXRoTmFtZSk7XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQuYWxsKHByb21pc2VzKTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyLnJlYWN0LW5hdGl2ZVwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5kZWZhdWx0XCIpKTtcbmxldCBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIgPSBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyMi5kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMgPSBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9Mb2NhbERhdGFzdG9yZVV0aWxzID0gcmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVVdGlsc1wiKTtcbnZhciBfU3RvcmFnZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VDb250cm9sbGVyLnJlYWN0LW5hdGl2ZVwiKSk7XG5jb25zdCBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jIGZyb21QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKG5hbWUpO1xuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdHMgPSBKU09OLnBhcnNlKHZhbHVlcyk7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH0sXG4gIGFzeW5jIHBpbldpdGhOYW1lKG5hbWUsIHZhbHVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHZhbHVlKTtcbiAgICAgIGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LnNldEl0ZW1Bc3luYyhuYW1lLCB2YWx1ZXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFF1b3RhIGV4Y2VlZGVkLCBwb3NzaWJseSBkdWUgdG8gU2FmYXJpIFByaXZhdGUgQnJvd3NpbmcgbW9kZVxuICAgICAgY29uc29sZS5lcnJvcihlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfSxcbiAgdW5QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LnJlbW92ZUl0ZW1Bc3luYyhuYW1lKTtcbiAgfSxcbiAgYXN5bmMgZ2V0QWxsQ29udGVudHMoKSB7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIGNvbnN0IGJhdGNoID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKCgwLCBfTG9jYWxEYXRhc3RvcmVVdGlscy5pc0xvY2FsRGF0YXN0b3JlS2V5KShrZXkpKSB7XG4gICAgICAgIGJhdGNoLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgTERTID0ge307XG4gICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0cyA9IGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0Lm11bHRpR2V0KGJhdGNoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0QWxsQ29udGVudHM6ICcsIGVycm9yKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHJlc3VsdHMpLmNhbGwocmVzdWx0cywgcGFpciA9PiB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBwYWlyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgTERTW2tleV0gPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIExEU1trZXldID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gTERTO1xuICB9LFxuICAvLyBVc2VkIGZvciB0ZXN0aW5nXG4gIGFzeW5jIGdldFJhd1N0b3JhZ2UoKSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICBjb25zdCBzdG9yYWdlID0ge307XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0Lm11bHRpR2V0KGtleXMpO1xuICAgICgwLCBfbWFwLmRlZmF1bHQpKF9jb250ZXh0ID0gcmVzdWx0cykuY2FsbChfY29udGV4dCwgcGFpciA9PiB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBwYWlyO1xuICAgICAgc3RvcmFnZVtrZXldID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0b3JhZ2U7XG4gIH0sXG4gIGFzeW5jIGNsZWFyKCkge1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICBjb25zdCBiYXRjaCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmICgoMCwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuaXNMb2NhbERhdGFzdG9yZUtleSkoa2V5KSkge1xuICAgICAgICBiYXRjaC5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0Lm11bHRpUmVtb3ZlKGJhdGNoKS5jYXRjaChlcnJvciA9PiBjb25zb2xlLmVycm9yKCdFcnJvciBjbGVhcmluZyBsb2NhbCBkYXRhc3RvcmU6ICcsIGVycm9yKSk7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5QSU5fUFJFRklYID0gZXhwb3J0cy5PQkpFQ1RfUFJFRklYID0gZXhwb3J0cy5ERUZBVUxUX1BJTiA9IHZvaWQgMDtcbmV4cG9ydHMuaXNMb2NhbERhdGFzdG9yZUtleSA9IGlzTG9jYWxEYXRhc3RvcmVLZXk7XG52YXIgX3N0YXJ0c1dpdGggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3N0YXJ0cy13aXRoXCIpKTtcbmNvbnN0IERFRkFVTFRfUElOID0gZXhwb3J0cy5ERUZBVUxUX1BJTiA9ICdfZGVmYXVsdCc7XG5jb25zdCBQSU5fUFJFRklYID0gZXhwb3J0cy5QSU5fUFJFRklYID0gJ3BhcnNlUGluXyc7XG5jb25zdCBPQkpFQ1RfUFJFRklYID0gZXhwb3J0cy5PQkpFQ1RfUFJFRklYID0gJ1BhcnNlX0xEU18nO1xuZnVuY3Rpb24gaXNMb2NhbERhdGFzdG9yZUtleShrZXkpIHtcbiAgcmV0dXJuICEhKGtleSAmJiAoa2V5ID09PSBERUZBVUxUX1BJTiB8fCAoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgUElOX1BSRUZJWCkgfHwgKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIE9CSkVDVF9QUkVGSVgpKSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY29tbWl0U2VydmVyQ2hhbmdlcyA9IGNvbW1pdFNlcnZlckNoYW5nZXM7XG5leHBvcnRzLmRlZmF1bHRTdGF0ZSA9IGRlZmF1bHRTdGF0ZTtcbmV4cG9ydHMuZXN0aW1hdGVBdHRyaWJ1dGUgPSBlc3RpbWF0ZUF0dHJpYnV0ZTtcbmV4cG9ydHMuZXN0aW1hdGVBdHRyaWJ1dGVzID0gZXN0aW1hdGVBdHRyaWJ1dGVzO1xuZXhwb3J0cy5tZXJnZUZpcnN0UGVuZGluZ1N0YXRlID0gbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucG9wUGVuZGluZ1N0YXRlID0gcG9wUGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5wdXNoUGVuZGluZ1N0YXRlID0gcHVzaFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMuc2V0UGVuZGluZ09wID0gc2V0UGVuZGluZ09wO1xuZXhwb3J0cy5zZXRTZXJ2ZXJEYXRhID0gc2V0U2VydmVyRGF0YTtcbnZhciBfaW5jbHVkZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfZW5jb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lbmNvZGVcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xudmFyIF9UYXNrUXVldWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1Rhc2tRdWV1ZVwiKSk7XG52YXIgX1BhcnNlT3AgPSByZXF1aXJlKFwiLi9QYXJzZU9wXCIpO1xuZnVuY3Rpb24gZGVmYXVsdFN0YXRlKCkge1xuICByZXR1cm4ge1xuICAgIHNlcnZlckRhdGE6IHt9LFxuICAgIHBlbmRpbmdPcHM6IFt7fV0sXG4gICAgb2JqZWN0Q2FjaGU6IHt9LFxuICAgIHRhc2tzOiBuZXcgX1Rhc2tRdWV1ZS5kZWZhdWx0KCksXG4gICAgZXhpc3RlZDogZmFsc2VcbiAgfTtcbn1cbmZ1bmN0aW9uIHNldFNlcnZlckRhdGEoc2VydmVyRGF0YSwgYXR0cmlidXRlcykge1xuICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlc1thdHRyXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHNlcnZlckRhdGFbYXR0cl0gPSBhdHRyaWJ1dGVzW2F0dHJdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgc2VydmVyRGF0YVthdHRyXTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFBlbmRpbmdPcChwZW5kaW5nT3BzLCBhdHRyLCBvcCkge1xuICBjb25zdCBsYXN0ID0gcGVuZGluZ09wcy5sZW5ndGggLSAxO1xuICBpZiAob3ApIHtcbiAgICBwZW5kaW5nT3BzW2xhc3RdW2F0dHJdID0gb3A7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIHBlbmRpbmdPcHNbbGFzdF1bYXR0cl07XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQZW5kaW5nU3RhdGUocGVuZGluZ09wcykge1xuICBwZW5kaW5nT3BzLnB1c2goe30pO1xufVxuZnVuY3Rpb24gcG9wUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpIHtcbiAgY29uc3QgZmlyc3QgPSBwZW5kaW5nT3BzLnNoaWZ0KCk7XG4gIGlmICghcGVuZGluZ09wcy5sZW5ndGgpIHtcbiAgICBwZW5kaW5nT3BzWzBdID0ge307XG4gIH1cbiAgcmV0dXJuIGZpcnN0O1xufVxuZnVuY3Rpb24gbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKSB7XG4gIGNvbnN0IGZpcnN0ID0gcG9wUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xuICBjb25zdCBuZXh0ID0gcGVuZGluZ09wc1swXTtcbiAgZm9yIChjb25zdCBhdHRyIGluIGZpcnN0KSB7XG4gICAgaWYgKG5leHRbYXR0cl0gJiYgZmlyc3RbYXR0cl0pIHtcbiAgICAgIGNvbnN0IG1lcmdlZCA9IG5leHRbYXR0cl0ubWVyZ2VXaXRoKGZpcnN0W2F0dHJdKTtcbiAgICAgIGlmIChtZXJnZWQpIHtcbiAgICAgICAgbmV4dFthdHRyXSA9IG1lcmdlZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFthdHRyXSA9IGZpcnN0W2F0dHJdO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXN0aW1hdGVBdHRyaWJ1dGUoc2VydmVyRGF0YSwgcGVuZGluZ09wcywgb2JqZWN0LCBhdHRyKSB7XG4gIGxldCB2YWx1ZSA9IHNlcnZlckRhdGFbYXR0cl07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZ09wcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChwZW5kaW5nT3BzW2ldW2F0dHJdKSB7XG4gICAgICBpZiAocGVuZGluZ09wc1tpXVthdHRyXSBpbnN0YW5jZW9mIF9QYXJzZU9wLlJlbGF0aW9uT3ApIHtcbiAgICAgICAgaWYgKG9iamVjdC5pZCkge1xuICAgICAgICAgIHZhbHVlID0gcGVuZGluZ09wc1tpXVthdHRyXS5hcHBseVRvKHZhbHVlLCBvYmplY3QsIGF0dHIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHBlbmRpbmdPcHNbaV1bYXR0cl0uYXBwbHlUbyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGVzdGltYXRlQXR0cmlidXRlcyhzZXJ2ZXJEYXRhLCBwZW5kaW5nT3BzLCBvYmplY3QpIHtcbiAgY29uc3QgZGF0YSA9IHt9O1xuICBmb3IgKHZhciBhdHRyIGluIHNlcnZlckRhdGEpIHtcbiAgICBkYXRhW2F0dHJdID0gc2VydmVyRGF0YVthdHRyXTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmdPcHMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGF0dHIgaW4gcGVuZGluZ09wc1tpXSkge1xuICAgICAgaWYgKHBlbmRpbmdPcHNbaV1bYXR0cl0gaW5zdGFuY2VvZiBfUGFyc2VPcC5SZWxhdGlvbk9wKSB7XG4gICAgICAgIGlmIChvYmplY3QuaWQpIHtcbiAgICAgICAgICBkYXRhW2F0dHJdID0gcGVuZGluZ09wc1tpXVthdHRyXS5hcHBseVRvKGRhdGFbYXR0cl0sIG9iamVjdCwgYXR0cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKGF0dHIpLmNhbGwoYXR0ciwgJy4nKSkge1xuICAgICAgICAgIC8vIHNpbWlsYXIgdG8gbmVzdGVkU2V0IGZ1bmN0aW9uXG4gICAgICAgICAgY29uc3QgZmllbGRzID0gYXR0ci5zcGxpdCgnLicpO1xuICAgICAgICAgIGNvbnN0IGxhc3QgPSBmaWVsZHNbZmllbGRzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGxldCBvYmplY3QgPSBkYXRhO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgaWYgKCEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV4dEtleSA9IGZpZWxkc1tpICsgMV07XG4gICAgICAgICAgICAgIGlmICghaXNOYU4obmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IFtdO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0ge307XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkob2JqZWN0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSBbLi4ub2JqZWN0W2tleV1dO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0ge1xuICAgICAgICAgICAgICAgICAgLi4ub2JqZWN0W2tleV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0W2xhc3RdID0gcGVuZGluZ09wc1tpXVthdHRyXS5hcHBseVRvKG9iamVjdFtsYXN0XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YVthdHRyXSA9IHBlbmRpbmdPcHNbaV1bYXR0cl0uYXBwbHlUbyhkYXRhW2F0dHJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBBbGxvd3Mgc2V0dGluZyBwcm9wZXJ0aWVzL3ZhcmlhYmxlcyBkZWVwIGluIGFuIG9iamVjdC5cbiAqIENvbnZlcnRzIGEuYiBpbnRvIHsgYTogeyBiOiB2YWx1ZSB9IH0gZm9yIGRvdCBub3RhdGlvbiBvbiBPYmplY3RzXG4gKiBDb252ZXJ0cyBhLjAuYiBpbnRvIHsgYTogW3sgYjogdmFsdWUgfV0gfSBmb3IgZG90IG5vdGF0aW9uIG9uIEFycmF5c1xuICpcbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBhc3NpZ24gdGhlIHZhbHVlIHRvXG4gKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gYXNzaWduLiBJZiBpdCdzIGluIGEgZGVlcGVyIHBhdGgsIHRoZW4gdXNlIGRvdCBub3RhdGlvbiAoYHByb3AxLnByb3AyLnByb3AzYClcbiAqIE5vdGUgdGhhdCBpbnRlcm1lZGlhdGUgb2JqZWN0KHMpIGluIHRoZSBuZXN0ZWQgcGF0aCBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGlmIHRoZXkgZG9uJ3QgZXhpc3QuXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi4gSWYgaXQncyBhbiBgdW5kZWZpbmVkYCB0aGVuIHRoZSBrZXkgaXMgZGVsZXRlZC5cbiAqL1xuZnVuY3Rpb24gbmVzdGVkU2V0KG9iaiwga2V5LCB2YWx1ZSkge1xuICBjb25zdCBwYXRocyA9IGtleS5zcGxpdCgnLicpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHBhdGggPSBwYXRoc1tpXTtcbiAgICBpZiAoIShwYXRoIGluIG9iaikpIHtcbiAgICAgIGNvbnN0IG5leHRQYXRoID0gcGF0aHNbaSArIDFdO1xuICAgICAgaWYgKCFpc05hTihuZXh0UGF0aCkpIHtcbiAgICAgICAgb2JqW3BhdGhdID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpbcGF0aF0gPSB7fTtcbiAgICAgIH1cbiAgICB9XG4gICAgb2JqID0gb2JqW3BhdGhdO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZGVsZXRlIG9ialtwYXRoc1twYXRocy5sZW5ndGggLSAxXV07XG4gIH0gZWxzZSB7XG4gICAgb2JqW3BhdGhzW3BhdGhzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBjb21taXRTZXJ2ZXJDaGFuZ2VzKHNlcnZlckRhdGEsIG9iamVjdENhY2hlLCBjaGFuZ2VzKSB7XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgZm9yIChjb25zdCBhdHRyIGluIGNoYW5nZXMpIHtcbiAgICBjb25zdCB2YWwgPSBjaGFuZ2VzW2F0dHJdO1xuICAgIG5lc3RlZFNldChzZXJ2ZXJEYXRhLCBhdHRyLCB2YWwpO1xuICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgISh2YWwgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkgJiYgISh2YWwgaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQpICYmICEodmFsIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkpIHtcbiAgICAgIGNvbnN0IGpzb24gPSAoMCwgX2VuY29kZS5kZWZhdWx0KSh2YWwsIGZhbHNlLCB0cnVlKTtcbiAgICAgIG9iamVjdENhY2hlW2F0dHJdID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoanNvbik7XG4gICAgfVxuICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2ZpbHRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmlsdGVyXCIpKTtcbnZhciBfc2xpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NsaWNlXCIpKTtcbnZhciBfaXNJbnRlZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9udW1iZXIvaXMtaW50ZWdlclwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX2VxdWFscyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZXF1YWxzXCIpKTtcbnZhciBfZGVjb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VQb2x5Z29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVBvbHlnb25cIikpO1xudmFyIF9QYXJzZUdlb1BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUdlb1BvaW50XCIpKTtcbi8qKlxuICogY29udGFpbnMgLS0gRGV0ZXJtaW5lcyBpZiBhbiBvYmplY3QgaXMgY29udGFpbmVkIGluIGEgbGlzdCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFBhcnNlIHBvaW50ZXJzLlxuICpcbiAqIEBwYXJhbSBoYXlzdGFja1xuICogQHBhcmFtIG5lZWRsZVxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjb250YWlucyhoYXlzdGFjaywgbmVlZGxlKSB7XG4gIGlmIChuZWVkbGUgJiYgbmVlZGxlLl9fdHlwZSAmJiAobmVlZGxlLl9fdHlwZSA9PT0gJ1BvaW50ZXInIHx8IG5lZWRsZS5fX3R5cGUgPT09ICdPYmplY3QnKSkge1xuICAgIGZvciAoY29uc3QgaSBpbiBoYXlzdGFjaykge1xuICAgICAgY29uc3QgcHRyID0gaGF5c3RhY2tbaV07XG4gICAgICBpZiAodHlwZW9mIHB0ciA9PT0gJ3N0cmluZycgJiYgcHRyID09PSBuZWVkbGUub2JqZWN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHRyLmNsYXNzTmFtZSA9PT0gbmVlZGxlLmNsYXNzTmFtZSAmJiBwdHIub2JqZWN0SWQgPT09IG5lZWRsZS5vYmplY3RJZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkobmVlZGxlKSkge1xuICAgIGZvciAoY29uc3QgbmVlZCBvZiBuZWVkbGUpIHtcbiAgICAgIGlmIChjb250YWlucyhoYXlzdGFjaywgbmVlZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAoMCwgX2luZGV4T2YuZGVmYXVsdCkoaGF5c3RhY2spLmNhbGwoaGF5c3RhY2ssIG5lZWRsZSkgPiAtMTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybU9iamVjdChvYmplY3QpIHtcbiAgaWYgKG9iamVjdC5fdG9GdWxsSlNPTikge1xuICAgIHJldHVybiBvYmplY3QuX3RvRnVsbEpTT04oKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG4vKipcbiAqIG1hdGNoZXNRdWVyeSAtLSBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCB3b3VsZCBiZSByZXR1cm5lZCBieSBhIFBhcnNlIFF1ZXJ5XG4gKiBJdCdzIGEgbGlnaHR3ZWlnaHQsIHdoZXJlLWNsYXVzZSBvbmx5IGltcGxlbWVudGF0aW9uIG9mIGEgZnVsbCBxdWVyeSBlbmdpbmUuXG4gKiBTaW5jZSB3ZSBmaW5kIHF1ZXJpZXMgdGhhdCBtYXRjaCBvYmplY3RzLCByYXRoZXIgdGhhbiBvYmplY3RzIHRoYXQgbWF0Y2hcbiAqIHF1ZXJpZXMsIHdlIGNhbiBhdm9pZCBidWlsZGluZyBhIGZ1bGwtYmxvd24gcXVlcnkgdG9vbC5cbiAqXG4gKiBAcGFyYW0gY2xhc3NOYW1lXG4gKiBAcGFyYW0gb2JqZWN0XG4gKiBAcGFyYW0gb2JqZWN0c1xuICogQHBhcmFtIHF1ZXJ5XG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNRdWVyeShjbGFzc05hbWUsIG9iamVjdCwgb2JqZWN0cywgcXVlcnkpIHtcbiAgaWYgKG9iamVjdC5jbGFzc05hbWUgIT09IGNsYXNzTmFtZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBsZXQgb2JqID0gb2JqZWN0O1xuICBsZXQgcSA9IHF1ZXJ5O1xuICBpZiAob2JqZWN0LnRvSlNPTikge1xuICAgIG9iaiA9IG9iamVjdC50b0pTT04oKTtcbiAgfVxuICBpZiAocXVlcnkudG9KU09OKSB7XG4gICAgcSA9IHF1ZXJ5LnRvSlNPTigpLndoZXJlO1xuICB9XG4gIG9iai5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gIGZvciAoY29uc3QgZmllbGQgaW4gcSkge1xuICAgIGlmICghbWF0Y2hlc0tleUNvbnN0cmFpbnRzKGNsYXNzTmFtZSwgb2JqLCBvYmplY3RzLCBmaWVsZCwgcVtmaWVsZF0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZXF1YWxPYmplY3RzR2VuZXJpYyhvYmosIGNvbXBhcmVUbywgZXFsRm4pIHtcbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShvYmopKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlcWxGbihvYmpbaV0sIGNvbXBhcmVUbykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZXFsRm4ob2JqLCBjb21wYXJlVG8pO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIFJlbGF0aXZlVGltZVRvRGF0ZVJlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0YXR1cyBUaGUgY29udmVyc2lvbiBzdGF0dXMsIGBlcnJvcmAgaWYgY29udmVyc2lvbiBmYWlsZWQgb3JcbiAqIGBzdWNjZXNzYCBpZiBjb252ZXJzaW9uIHN1Y2NlZWRlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbmZvIFRoZSBlcnJvciBtZXNzYWdlIGlmIGNvbnZlcnNpb24gZmFpbGVkLCBvciB0aGUgcmVsYXRpdmVcbiAqIHRpbWUgaW5kaWNhdGlvbiAoYHBhc3RgLCBgcHJlc2VudGAsIGBmdXR1cmVgKSBpZiBjb252ZXJzaW9uIHN1Y2NlZWRlZC5cbiAqIEBwcm9wZXJ0eSB7RGF0ZXx1bmRlZmluZWR9IHJlc3VsdCBUaGUgY29udmVydGVkIGRhdGUsIG9yIGB1bmRlZmluZWRgIGlmIGNvbnZlcnNpb25cbiAqIGZhaWxlZC5cbiAqL1xuLyoqXG4gKiBDb252ZXJ0cyBodW1hbiByZWFkYWJsZSByZWxhdGl2ZSBkYXRlIHN0cmluZywgZm9yIGV4YW1wbGUsICdpbiAxMCBkYXlzJyB0byBhIGRhdGVcbiAqIHJlbGF0aXZlIHRvIG5vdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUaGUgdGV4dCB0byBjb252ZXJ0LlxuICogQHBhcmFtIHtEYXRlfSBbbm93XSBUaGUgZGF0ZSBmcm9tIHdoaWNoIGFkZCBvciBzdWJ0cmFjdC4gRGVmYXVsdCBpcyBub3cuXG4gKiBAcmV0dXJucyB7UmVsYXRpdmVUaW1lVG9EYXRlUmVzdWx0fVxuICovXG5mdW5jdGlvbiByZWxhdGl2ZVRpbWVUb0RhdGUodGV4dCkge1xuICBsZXQgbm93ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBuZXcgRGF0ZSgpO1xuICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBsZXQgcGFydHMgPSB0ZXh0LnNwbGl0KCcgJyk7XG5cbiAgLy8gRmlsdGVyIG91dCB3aGl0ZXNwYWNlXG4gIHBhcnRzID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkocGFydHMpLmNhbGwocGFydHMsIHBhcnQgPT4gcGFydCAhPT0gJycpO1xuICBjb25zdCBmdXR1cmUgPSBwYXJ0c1swXSA9PT0gJ2luJztcbiAgY29uc3QgcGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdID09PSAnYWdvJztcbiAgaWYgKCFmdXR1cmUgJiYgIXBhc3QgJiYgdGV4dCAhPT0gJ25vdycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgaW5mbzogXCJUaW1lIHNob3VsZCBlaXRoZXIgc3RhcnQgd2l0aCAnaW4nIG9yIGVuZCB3aXRoICdhZ28nXCJcbiAgICB9O1xuICB9XG4gIGlmIChmdXR1cmUgJiYgcGFzdCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBpbmZvOiBcIlRpbWUgY2Fubm90IGhhdmUgYm90aCAnaW4nIGFuZCAnYWdvJ1wiXG4gICAgfTtcbiAgfVxuXG4gIC8vIHN0cmlwIHRoZSAnYWdvJyBvciAnaW4nXG4gIGlmIChmdXR1cmUpIHtcbiAgICBwYXJ0cyA9ICgwLCBfc2xpY2UuZGVmYXVsdCkocGFydHMpLmNhbGwocGFydHMsIDEpO1xuICB9IGVsc2Uge1xuICAgIC8vIHBhc3RcbiAgICBwYXJ0cyA9ICgwLCBfc2xpY2UuZGVmYXVsdCkocGFydHMpLmNhbGwocGFydHMsIDAsIHBhcnRzLmxlbmd0aCAtIDEpO1xuICB9XG4gIGlmIChwYXJ0cy5sZW5ndGggJSAyICE9PSAwICYmIHRleHQgIT09ICdub3cnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIGluZm86ICdJbnZhbGlkIHRpbWUgc3RyaW5nLiBEYW5nbGluZyB1bml0IG9yIG51bWJlci4nXG4gICAgfTtcbiAgfVxuICBjb25zdCBwYWlycyA9IFtdO1xuICB3aGlsZSAocGFydHMubGVuZ3RoKSB7XG4gICAgcGFpcnMucHVzaChbcGFydHMuc2hpZnQoKSwgcGFydHMuc2hpZnQoKV0pO1xuICB9XG4gIGxldCBzZWNvbmRzID0gMDtcbiAgZm9yIChjb25zdCBbbnVtLCBpbnRlcnZhbF0gb2YgcGFpcnMpIHtcbiAgICBjb25zdCB2YWwgPSBOdW1iZXIobnVtKTtcbiAgICBpZiAoISgwLCBfaXNJbnRlZ2VyLmRlZmF1bHQpKHZhbCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgaW5mbzogYCcke251bX0nIGlzIG5vdCBhbiBpbnRlZ2VyLmBcbiAgICAgIH07XG4gICAgfVxuICAgIHN3aXRjaCAoaW50ZXJ2YWwpIHtcbiAgICAgIGNhc2UgJ3lyJzpcbiAgICAgIGNhc2UgJ3lycyc6XG4gICAgICBjYXNlICd5ZWFyJzpcbiAgICAgIGNhc2UgJ3llYXJzJzpcbiAgICAgICAgc2Vjb25kcyArPSB2YWwgKiAzMTUzNjAwMDsgLy8gMzY1ICogMjQgKiA2MCAqIDYwXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2snOlxuICAgICAgY2FzZSAnd2tzJzpcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgICBzZWNvbmRzICs9IHZhbCAqIDYwNDgwMDsgLy8gNyAqIDI0ICogNjAgKiA2MFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2QnOlxuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgIGNhc2UgJ2RheXMnOlxuICAgICAgICBzZWNvbmRzICs9IHZhbCAqIDg2NDAwOyAvLyAyNCAqIDYwICogNjBcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdocic6XG4gICAgICBjYXNlICdocnMnOlxuICAgICAgY2FzZSAnaG91cic6XG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIHNlY29uZHMgKz0gdmFsICogMzYwMDsgLy8gNjAgKiA2MFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbic6XG4gICAgICBjYXNlICdtaW5zJzpcbiAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgc2Vjb25kcyArPSB2YWwgKiA2MDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWMnOlxuICAgICAgY2FzZSAnc2Vjcyc6XG4gICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIHNlY29uZHMgKz0gdmFsO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgIGluZm86IGBJbnZhbGlkIGludGVydmFsOiAnJHtpbnRlcnZhbH0nYFxuICAgICAgICB9O1xuICAgIH1cbiAgfVxuICBjb25zdCBtaWxsaXNlY29uZHMgPSBzZWNvbmRzICogMTAwMDtcbiAgaWYgKGZ1dHVyZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgIGluZm86ICdmdXR1cmUnLFxuICAgICAgcmVzdWx0OiBuZXcgRGF0ZShub3cudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzKVxuICAgIH07XG4gIH0gZWxzZSBpZiAocGFzdCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgIGluZm86ICdwYXN0JyxcbiAgICAgIHJlc3VsdDogbmV3IERhdGUobm93LnZhbHVlT2YoKSAtIG1pbGxpc2Vjb25kcylcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgIGluZm86ICdwcmVzZW50JyxcbiAgICAgIHJlc3VsdDogbmV3IERhdGUobm93LnZhbHVlT2YoKSlcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9iamVjdCBtYXRjaGVzIGEgc2luZ2xlIGtleSdzIGNvbnN0cmFpbnRzXG4gKlxuICogQHBhcmFtIGNsYXNzTmFtZVxuICogQHBhcmFtIG9iamVjdFxuICogQHBhcmFtIG9iamVjdHNcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBjb25zdHJhaW50c1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBtYXRjaGVzS2V5Q29uc3RyYWludHMoY2xhc3NOYW1lLCBvYmplY3QsIG9iamVjdHMsIGtleSwgY29uc3RyYWludHMpIHtcbiAgaWYgKGNvbnN0cmFpbnRzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgJy4nKSA+PSAwKSB7XG4gICAgLy8gS2V5IHJlZmVyZW5jZXMgYSBzdWJvYmplY3RcbiAgICBjb25zdCBrZXlDb21wb25lbnRzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgY29uc3Qgc3ViT2JqZWN0S2V5ID0ga2V5Q29tcG9uZW50c1swXTtcbiAgICBjb25zdCBrZXlSZW1haW5kZXIgPSAoMCwgX3NsaWNlLmRlZmF1bHQpKGtleUNvbXBvbmVudHMpLmNhbGwoa2V5Q29tcG9uZW50cywgMSkuam9pbignLicpO1xuICAgIHJldHVybiBtYXRjaGVzS2V5Q29uc3RyYWludHMoY2xhc3NOYW1lLCBvYmplY3Rbc3ViT2JqZWN0S2V5XSB8fCB7fSwgb2JqZWN0cywga2V5UmVtYWluZGVyLCBjb25zdHJhaW50cyk7XG4gIH1cbiAgbGV0IGk7XG4gIGlmIChrZXkgPT09ICckb3InKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobWF0Y2hlc1F1ZXJ5KGNsYXNzTmFtZSwgb2JqZWN0LCBvYmplY3RzLCBjb25zdHJhaW50c1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSAnJGFuZCcpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghbWF0Y2hlc1F1ZXJ5KGNsYXNzTmFtZSwgb2JqZWN0LCBvYmplY3RzLCBjb25zdHJhaW50c1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoa2V5ID09PSAnJG5vcicpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChtYXRjaGVzUXVlcnkoY2xhc3NOYW1lLCBvYmplY3QsIG9iamVjdHMsIGNvbnN0cmFpbnRzW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChrZXkgPT09ICckcmVsYXRlZFRvJykge1xuICAgIC8vIEJhaWwhIFdlIGNhbid0IGhhbmRsZSByZWxhdGlvbmFsIHF1ZXJpZXMgbG9jYWxseVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIS9eW0EtWmEtel1bMC05QS1aYS16X10qJC8udGVzdChrZXkpKSB7XG4gICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0tFWV9OQU1FLCBgSW52YWxpZCBLZXk6ICR7a2V5fWApO1xuICB9XG4gIC8vIEVxdWFsaXR5IChvciBBcnJheSBjb250YWlucykgY2FzZXNcbiAgaWYgKHR5cGVvZiBjb25zdHJhaW50cyAhPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9iamVjdFtrZXldKSkge1xuICAgICAgdmFyIF9jb250ZXh0O1xuICAgICAgcmV0dXJuICgwLCBfaW5kZXhPZi5kZWZhdWx0KShfY29udGV4dCA9IG9iamVjdFtrZXldKS5jYWxsKF9jb250ZXh0LCBjb25zdHJhaW50cykgPiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBjb25zdHJhaW50cztcbiAgfVxuICBsZXQgY29tcGFyZVRvO1xuICBpZiAoY29uc3RyYWludHMuX190eXBlKSB7XG4gICAgaWYgKGNvbnN0cmFpbnRzLl9fdHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICByZXR1cm4gZXF1YWxPYmplY3RzR2VuZXJpYyhvYmplY3Rba2V5XSwgY29uc3RyYWludHMsIGZ1bmN0aW9uIChvYmosIHB0cikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiAhPT0gJ3VuZGVmaW5lZCcgJiYgcHRyLmNsYXNzTmFtZSA9PT0gb2JqLmNsYXNzTmFtZSAmJiBwdHIub2JqZWN0SWQgPT09IG9iai5vYmplY3RJZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZXF1YWxPYmplY3RzR2VuZXJpYygoMCwgX2RlY29kZS5kZWZhdWx0KShvYmplY3Rba2V5XSksICgwLCBfZGVjb2RlLmRlZmF1bHQpKGNvbnN0cmFpbnRzKSwgX2VxdWFscy5kZWZhdWx0KTtcbiAgfVxuICAvLyBNb3JlIGNvbXBsZXggY2FzZXNcbiAgZm9yIChjb25zdCBjb25kaXRpb24gaW4gY29uc3RyYWludHMpIHtcbiAgICBjb21wYXJlVG8gPSBjb25zdHJhaW50c1tjb25kaXRpb25dO1xuICAgIGlmIChjb21wYXJlVG8/Ll9fdHlwZSkge1xuICAgICAgY29tcGFyZVRvID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkoY29tcGFyZVRvKTtcbiAgICB9XG4gICAgLy8gaXMgaXQgYSAkcmVsYXRpdmVUaW1lPyBjb252ZXJ0IHRvIGRhdGVcbiAgICBpZiAoY29tcGFyZVRvPy5bJyRyZWxhdGl2ZVRpbWUnXSkge1xuICAgICAgY29uc3QgcGFyc2VyUmVzdWx0ID0gcmVsYXRpdmVUaW1lVG9EYXRlKGNvbXBhcmVUb1snJHJlbGF0aXZlVGltZSddKTtcbiAgICAgIGlmIChwYXJzZXJSZXN1bHQuc3RhdHVzICE9PSAnc3VjY2VzcycpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0pTT04sIGBiYWQgJHJlbGF0aXZlVGltZSAoJHtrZXl9KSB2YWx1ZS4gJHtwYXJzZXJSZXN1bHQuaW5mb31gKTtcbiAgICAgIH1cbiAgICAgIGNvbXBhcmVUbyA9IHBhcnNlclJlc3VsdC5yZXN1bHQ7XG4gICAgfVxuICAgIC8vIENvbXBhcmUgRGF0ZSBPYmplY3Qgb3IgRGF0ZSBTdHJpbmdcbiAgICBpZiAodG9TdHJpbmcuY2FsbChjb21wYXJlVG8pID09PSAnW29iamVjdCBEYXRlXScgfHwgdHlwZW9mIGNvbXBhcmVUbyA9PT0gJ3N0cmluZycgJiZcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbmV3IERhdGUoY29tcGFyZVRvKSAhPT0gJ0ludmFsaWQgRGF0ZScgJiZcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgIWlzTmFOKG5ldyBEYXRlKGNvbXBhcmVUbykpKSB7XG4gICAgICBvYmplY3Rba2V5XSA9IG5ldyBEYXRlKG9iamVjdFtrZXldLmlzbyA/IG9iamVjdFtrZXldLmlzbyA6IG9iamVjdFtrZXldKTtcbiAgICB9XG4gICAgc3dpdGNoIChjb25kaXRpb24pIHtcbiAgICAgIGNhc2UgJyRsdCc6XG4gICAgICAgIGlmIChvYmplY3Rba2V5XSA+PSBjb21wYXJlVG8pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckbHRlJzpcbiAgICAgICAgaWYgKG9iamVjdFtrZXldID4gY29tcGFyZVRvKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGd0JzpcbiAgICAgICAgaWYgKG9iamVjdFtrZXldIDw9IGNvbXBhcmVUbykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRndGUnOlxuICAgICAgICBpZiAob2JqZWN0W2tleV0gPCBjb21wYXJlVG8pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckbmUnOlxuICAgICAgICBpZiAoKDAsIF9lcXVhbHMuZGVmYXVsdCkob2JqZWN0W2tleV0sIGNvbXBhcmVUbykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckaW4nOlxuICAgICAgICBpZiAoIWNvbnRhaW5zKGNvbXBhcmVUbywgb2JqZWN0W2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJG5pbic6XG4gICAgICAgIGlmIChjb250YWlucyhjb21wYXJlVG8sIG9iamVjdFtrZXldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRhbGwnOlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcGFyZVRvLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9jb250ZXh0MjtcbiAgICAgICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKF9jb250ZXh0MiA9IG9iamVjdFtrZXldKS5jYWxsKF9jb250ZXh0MiwgY29tcGFyZVRvW2ldKSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckZXhpc3RzJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5RXhpc3RzID0gdHlwZW9mIG9iamVjdFtrZXldICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgICBjb25zdCBleGlzdGVuY2VJc1JlcXVpcmVkID0gY29uc3RyYWludHNbJyRleGlzdHMnXTtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbnN0cmFpbnRzWyckZXhpc3RzJ10gIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgLy8gVGhlIFNESyB3aWxsIG5ldmVyIHN1Ym1pdCBhIG5vbi1ib29sZWFuIGZvciAkZXhpc3RzLCBidXQgaWYgc29tZW9uZVxuICAgICAgICAgICAgLy8gdHJpZXMgdG8gc3VibWl0IGEgbm9uLWJvb2xlYW4gZm9yICRleGl0cyBvdXRzaWRlIHRoZSBTREtzLCBqdXN0IGlnbm9yZSBpdC5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXByb3BlcnR5RXhpc3RzICYmIGV4aXN0ZW5jZUlzUmVxdWlyZWQgfHwgcHJvcGVydHlFeGlzdHMgJiYgIWV4aXN0ZW5jZUlzUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRyZWdleCc6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbXBhcmVUbyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlVG8udGVzdChvYmplY3Rba2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEpTIGRvZXNuJ3Qgc3VwcG9ydCBwZXJsLXN0eWxlIGVzY2FwaW5nXG4gICAgICAgICAgbGV0IGV4cFN0cmluZyA9ICcnO1xuICAgICAgICAgIGxldCBlc2NhcGVFbmQgPSAtMjtcbiAgICAgICAgICBsZXQgZXNjYXBlU3RhcnQgPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkoY29tcGFyZVRvKS5jYWxsKGNvbXBhcmVUbywgJ1xcXFxRJyk7XG4gICAgICAgICAgd2hpbGUgKGVzY2FwZVN0YXJ0ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIEFkZCB0aGUgdW5lc2NhcGVkIHBvcnRpb25cbiAgICAgICAgICAgIGV4cFN0cmluZyArPSBjb21wYXJlVG8uc3Vic3RyaW5nKGVzY2FwZUVuZCArIDIsIGVzY2FwZVN0YXJ0KTtcbiAgICAgICAgICAgIGVzY2FwZUVuZCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShjb21wYXJlVG8pLmNhbGwoY29tcGFyZVRvLCAnXFxcXEUnLCBlc2NhcGVTdGFydCk7XG4gICAgICAgICAgICBpZiAoZXNjYXBlRW5kID4gLTEpIHtcbiAgICAgICAgICAgICAgZXhwU3RyaW5nICs9IGNvbXBhcmVUby5zdWJzdHJpbmcoZXNjYXBlU3RhcnQgKyAyLCBlc2NhcGVFbmQpLnJlcGxhY2UoL1xcXFxcXFxcXFxcXFxcXFxFL2csICdcXFxcRScpLnJlcGxhY2UoL1xcVy9nLCAnXFxcXCQmJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlc2NhcGVTdGFydCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShjb21wYXJlVG8pLmNhbGwoY29tcGFyZVRvLCAnXFxcXFEnLCBlc2NhcGVFbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBleHBTdHJpbmcgKz0gY29tcGFyZVRvLnN1YnN0cmluZyhNYXRoLm1heChlc2NhcGVTdGFydCwgZXNjYXBlRW5kICsgMikpO1xuICAgICAgICAgIGxldCBtb2RpZmllcnMgPSBjb25zdHJhaW50cy4kb3B0aW9ucyB8fCAnJztcbiAgICAgICAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMucmVwbGFjZSgneCcsICcnKS5yZXBsYWNlKCdzJywgJycpO1xuICAgICAgICAgIC8vIFBhcnNlIFNlcnZlciAvIE1vbmdvIHN1cHBvcnQgeCBhbmQgcyBtb2RpZmllcnMgYnV0IEpTIFJlZ0V4cCBkb2Vzbid0XG4gICAgICAgICAgY29uc3QgZXhwID0gbmV3IFJlZ0V4cChleHBTdHJpbmcsIG1vZGlmaWVycyk7XG4gICAgICAgICAgaWYgKCFleHAudGVzdChvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRuZWFyU3BoZXJlJzpcbiAgICAgICAge1xuICAgICAgICAgIGlmICghY29tcGFyZVRvIHx8ICFvYmplY3Rba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGNvbXBhcmVUby5yYWRpYW5zVG8ob2JqZWN0W2tleV0pO1xuICAgICAgICAgIGNvbnN0IG1heCA9IGNvbnN0cmFpbnRzLiRtYXhEaXN0YW5jZSB8fCBJbmZpbml0eTtcbiAgICAgICAgICByZXR1cm4gZGlzdGFuY2UgPD0gbWF4O1xuICAgICAgICB9XG4gICAgICBjYXNlICckd2l0aGluJzpcbiAgICAgICAge1xuICAgICAgICAgIGlmICghY29tcGFyZVRvIHx8ICFvYmplY3Rba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzb3V0aFdlc3QgPSBjb21wYXJlVG8uJGJveFswXTtcbiAgICAgICAgICBjb25zdCBub3J0aEVhc3QgPSBjb21wYXJlVG8uJGJveFsxXTtcbiAgICAgICAgICBpZiAoc291dGhXZXN0LmxhdGl0dWRlID4gbm9ydGhFYXN0LmxhdGl0dWRlIHx8IHNvdXRoV2VzdC5sb25naXR1ZGUgPiBub3J0aEVhc3QubG9uZ2l0dWRlKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGJveCwgY3Jvc3NlcyB0aGUgZGF0ZSBsaW5lXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvYmplY3Rba2V5XS5sYXRpdHVkZSA+IHNvdXRoV2VzdC5sYXRpdHVkZSAmJiBvYmplY3Rba2V5XS5sYXRpdHVkZSA8IG5vcnRoRWFzdC5sYXRpdHVkZSAmJiBvYmplY3Rba2V5XS5sb25naXR1ZGUgPiBzb3V0aFdlc3QubG9uZ2l0dWRlICYmIG9iamVjdFtrZXldLmxvbmdpdHVkZSA8IG5vcnRoRWFzdC5sb25naXR1ZGU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRvcHRpb25zJzpcbiAgICAgICAgLy8gTm90IGEgcXVlcnkgdHlwZSwgYnV0IGEgd2F5IHRvIGFkZCBvcHRpb25zIHRvICRyZWdleC4gSWdub3JlIGFuZFxuICAgICAgICAvLyBhdm9pZCB0aGUgZGVmYXVsdFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRtYXhEaXN0YW5jZSc6XG4gICAgICAgIC8vIE5vdCBhIHF1ZXJ5IHR5cGUsIGJ1dCBhIHdheSB0byBhZGQgYSBjYXAgdG8gJG5lYXJTcGhlcmUuIElnbm9yZSBhbmRcbiAgICAgICAgLy8gYXZvaWQgdGhlIGRlZmF1bHRcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckc2VsZWN0JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHN1YlF1ZXJ5T2JqZWN0cyA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgKG9iaiwgaW5kZXgsIGFycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNRdWVyeShjb21wYXJlVG8ucXVlcnkuY2xhc3NOYW1lLCBvYmosIGFyciwgY29tcGFyZVRvLnF1ZXJ5LndoZXJlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YlF1ZXJ5T2JqZWN0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViT2JqZWN0ID0gdHJhbnNmb3JtT2JqZWN0KHN1YlF1ZXJ5T2JqZWN0c1tpXSk7XG4gICAgICAgICAgICByZXR1cm4gKDAsIF9lcXVhbHMuZGVmYXVsdCkob2JqZWN0W2tleV0sIHN1Yk9iamVjdFtjb21wYXJlVG8ua2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJGRvbnRTZWxlY3QnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qgc3ViUXVlcnlPYmplY3RzID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCAob2JqLCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1F1ZXJ5KGNvbXBhcmVUby5xdWVyeS5jbGFzc05hbWUsIG9iaiwgYXJyLCBjb21wYXJlVG8ucXVlcnkud2hlcmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUXVlcnlPYmplY3RzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJPYmplY3QgPSB0cmFuc2Zvcm1PYmplY3Qoc3ViUXVlcnlPYmplY3RzW2ldKTtcbiAgICAgICAgICAgIHJldHVybiAhKDAsIF9lcXVhbHMuZGVmYXVsdCkob2JqZWN0W2tleV0sIHN1Yk9iamVjdFtjb21wYXJlVG8ua2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJGluUXVlcnknOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qgc3ViUXVlcnlPYmplY3RzID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCAob2JqLCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1F1ZXJ5KGNvbXBhcmVUby5jbGFzc05hbWUsIG9iaiwgYXJyLCBjb21wYXJlVG8ud2hlcmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUXVlcnlPYmplY3RzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJPYmplY3QgPSB0cmFuc2Zvcm1PYmplY3Qoc3ViUXVlcnlPYmplY3RzW2ldKTtcbiAgICAgICAgICAgIGlmIChvYmplY3Rba2V5XS5jbGFzc05hbWUgPT09IHN1Yk9iamVjdC5jbGFzc05hbWUgJiYgb2JqZWN0W2tleV0ub2JqZWN0SWQgPT09IHN1Yk9iamVjdC5vYmplY3RJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICBjYXNlICckbm90SW5RdWVyeSc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBzdWJRdWVyeU9iamVjdHMgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIChvYmosIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzUXVlcnkoY29tcGFyZVRvLmNsYXNzTmFtZSwgb2JqLCBhcnIsIGNvbXBhcmVUby53aGVyZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJRdWVyeU9iamVjdHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Yk9iamVjdCA9IHRyYW5zZm9ybU9iamVjdChzdWJRdWVyeU9iamVjdHNbaV0pO1xuICAgICAgICAgICAgaWYgKG9iamVjdFtrZXldLmNsYXNzTmFtZSA9PT0gc3ViT2JqZWN0LmNsYXNzTmFtZSAmJiBvYmplY3Rba2V5XS5vYmplY3RJZCA9PT0gc3ViT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRjb250YWluZWRCeSc6XG4gICAgICAgIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zKGNvbXBhcmVUbywgdmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRnZW9XaXRoaW4nOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVUby4kcG9seWdvbikge1xuICAgICAgICAgICAgdmFyIF9jb250ZXh0MztcbiAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9ICgwLCBfbWFwLmRlZmF1bHQpKF9jb250ZXh0MyA9IGNvbXBhcmVUby4kcG9seWdvbikuY2FsbChfY29udGV4dDMsIGdlb1BvaW50ID0+IFtnZW9Qb2ludC5sYXRpdHVkZSwgZ2VvUG9pbnQubG9uZ2l0dWRlXSk7XG4gICAgICAgICAgICBjb25zdCBwb2x5Z29uID0gbmV3IF9QYXJzZVBvbHlnb24uZGVmYXVsdChwb2ludHMpO1xuICAgICAgICAgICAgcmV0dXJuIHBvbHlnb24uY29udGFpbnNQb2ludChvYmplY3Rba2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb21wYXJlVG8uJGNlbnRlclNwaGVyZSkge1xuICAgICAgICAgICAgY29uc3QgW1dHUzg0UG9pbnQsIG1heERpc3RhbmNlXSA9IGNvbXBhcmVUby4kY2VudGVyU3BoZXJlO1xuICAgICAgICAgICAgY29uc3QgY2VudGVyUG9pbnQgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCh7XG4gICAgICAgICAgICAgIGxhdGl0dWRlOiBXR1M4NFBvaW50WzFdLFxuICAgICAgICAgICAgICBsb25naXR1ZGU6IFdHUzg0UG9pbnRbMF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdChvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHBvaW50LnJhZGlhbnNUbyhjZW50ZXJQb2ludCk7XG4gICAgICAgICAgICByZXR1cm4gZGlzdGFuY2UgPD0gbWF4RGlzdGFuY2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJGdlb0ludGVyc2VjdHMnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcG9seWdvbiA9IG5ldyBfUGFyc2VQb2x5Z29uLmRlZmF1bHQob2JqZWN0W2tleV0uY29vcmRpbmF0ZXMpO1xuICAgICAgICAgIGNvbnN0IHBvaW50ID0gbmV3IF9QYXJzZUdlb1BvaW50LmRlZmF1bHQoY29tcGFyZVRvLiRwb2ludCk7XG4gICAgICAgICAgcmV0dXJuIHBvbHlnb24uY29udGFpbnNQb2ludChwb2ludCk7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVF1ZXJ5KHF1ZXJ5KSB7XG4gIHZhciBfY29udGV4dDQ7XG4gIGxldCBxID0gcXVlcnk7XG4gIGlmIChxdWVyeS50b0pTT04pIHtcbiAgICBxID0gcXVlcnkudG9KU09OKCkud2hlcmU7XG4gIH1cbiAgY29uc3Qgc3BlY2lhbFF1ZXJ5a2V5cyA9IFsnJGFuZCcsICckb3InLCAnJG5vcicsICdfcnBlcm0nLCAnX3dwZXJtJywgJ19wZXJpc2hhYmxlX3Rva2VuJywgJ19lbWFpbF92ZXJpZnlfdG9rZW4nLCAnX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0JywgJ19hY2NvdW50X2xvY2tvdXRfZXhwaXJlc19hdCcsICdfZmFpbGVkX2xvZ2luX2NvdW50J107XG4gICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDQgPSAoMCwgX2tleXMuZGVmYXVsdCkocSkpLmNhbGwoX2NvbnRleHQ0LCBrZXkgPT4ge1xuICAgIGlmIChxICYmIHFba2V5XSAmJiBxW2tleV0uJHJlZ2V4KSB7XG4gICAgICBpZiAodHlwZW9mIHFba2V5XS4kb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKCFxW2tleV0uJG9wdGlvbnMubWF0Y2goL15baW14c10rJC8pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX1FVRVJZLCBgQmFkICRvcHRpb25zIHZhbHVlIGZvciBxdWVyeTogJHtxW2tleV0uJG9wdGlvbnN9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShzcGVjaWFsUXVlcnlrZXlzKS5jYWxsKHNwZWNpYWxRdWVyeWtleXMsIGtleSkgPCAwICYmICFrZXkubWF0Y2goL15bYS16QS1aXVthLXpBLVowLTlfXFwuXSokLykpIHtcbiAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9LRVlfTkFNRSwgYEludmFsaWQga2V5IG5hbWU6ICR7a2V5fWApO1xuICAgIH1cbiAgfSk7XG59XG5jb25zdCBPZmZsaW5lUXVlcnkgPSB7XG4gIG1hdGNoZXNRdWVyeTogbWF0Y2hlc1F1ZXJ5LFxuICB2YWxpZGF0ZVF1ZXJ5OiB2YWxpZGF0ZVF1ZXJ5XG59O1xubW9kdWxlLmV4cG9ydHMgPSBPZmZsaW5lUXVlcnk7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBPZmZsaW5lUXVlcnk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfV2Vha01hcCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3dlYWstbWFwXCIpO1xudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2RlY29kZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX2VuY29kZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX0NyeXB0b0NvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NyeXB0b0NvbnRyb2xsZXJcIikpO1xudmFyIF9FdmVudHVhbGx5UXVldWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0V2ZW50dWFsbHlRdWV1ZVwiKSk7XG52YXIgX0luZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9JbmRleGVkREJTdG9yYWdlQ29udHJvbGxlclwiKSk7XG52YXIgX0luc3RhbGxhdGlvbkNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0luc3RhbGxhdGlvbkNvbnRyb2xsZXJcIikpO1xudmFyIFBhcnNlT3AgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9QYXJzZU9wXCIpKTtcbnZhciBfUkVTVENvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1JFU1RDb250cm9sbGVyXCIpKTtcbnZhciBfUGFyc2VBQ0wgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQUNMXCIpKTtcbnZhciBBbmFseXRpY3MgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9BbmFseXRpY3NcIikpO1xudmFyIF9Bbm9ueW1vdXNVdGlscyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQW5vbnltb3VzVXRpbHNcIikpO1xudmFyIENsb3VkID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vQ2xvdWRcIikpO1xudmFyIF9QYXJzZUNMUCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VDTFBcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9FdmVudEVtaXR0ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0V2ZW50RW1pdHRlclwiKSk7XG52YXIgX1BhcnNlQ29uZmlnID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUNvbmZpZ1wiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9GYWNlYm9va1V0aWxzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9GYWNlYm9va1V0aWxzXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIEhvb2tzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vUGFyc2VIb29rc1wiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xudmFyIF9QYXJzZVBvbHlnb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUG9seWdvblwiKSk7XG52YXIgX1BhcnNlSW5zdGFsbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUluc3RhbGxhdGlvblwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZVwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgUHVzaCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL1B1c2hcIikpO1xudmFyIF9QYXJzZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVF1ZXJ5XCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG52YXIgX1BhcnNlUm9sZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSb2xlXCIpKTtcbnZhciBfUGFyc2VTY2hlbWEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlU2NoZW1hXCIpKTtcbnZhciBfUGFyc2VTZXNzaW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVNlc3Npb25cIikpO1xudmFyIF9TdG9yYWdlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlXCIpKTtcbnZhciBfUGFyc2VVc2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVVzZXJcIikpO1xudmFyIF9QYXJzZUxpdmVRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VMaXZlUXVlcnlcIikpO1xudmFyIF9MaXZlUXVlcnlDbGllbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xpdmVRdWVyeUNsaWVudFwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyXCIpKTtcbnZhciBfU3RvcmFnZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VDb250cm9sbGVyXCIpKTtcbnZhciBfV2ViU29ja2V0Q29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vV2ViU29ja2V0Q29udHJvbGxlclwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoZSkge1xuICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBfV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gIHZhciByID0gbmV3IF9XZWFrTWFwKCksXG4gICAgdCA9IG5ldyBfV2Vha01hcCgpO1xuICByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGUgPyB0IDogcjtcbiAgfSkoZSk7XG59XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChlLCByKSB7XG4gIGlmICghciAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgIGRlZmF1bHQ6IGVcbiAgfTtcbiAgdmFyIHQgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUocik7XG4gIGlmICh0ICYmIHQuaGFzKGUpKSByZXR1cm4gdC5nZXQoZSk7XG4gIHZhciBuID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbFxuICB9O1xuICBmb3IgKHZhciB1IGluIGUpIGlmIChcImRlZmF1bHRcIiAhPT0gdSAmJiB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHUpKSB7XG4gICAgdmFyIGkgPSBfT2JqZWN0JGRlZmluZVByb3BlcnR5ICYmIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID8gX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdSkgOiBudWxsO1xuICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IF9PYmplY3QkZGVmaW5lUHJvcGVydHkobiwgdSwgaSkgOiBuW3VdID0gZVt1XTtcbiAgfVxuICByZXR1cm4gbi5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCBuKSwgbjtcbn1cbi8qKlxuICogQ29udGFpbnMgYWxsIFBhcnNlIEFQSSBjbGFzc2VzIGFuZCBmdW5jdGlvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQGdsb2JhbFxuICogQGNsYXNzXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKi9cblxuY29uc3QgUGFyc2UgPSB7XG4gIEFDTDogX1BhcnNlQUNMLmRlZmF1bHQsXG4gIEFuYWx5dGljczogQW5hbHl0aWNzLFxuICBBbm9ueW1vdXNVdGlsczogX0Fub255bW91c1V0aWxzLmRlZmF1bHQsXG4gIENsb3VkOiBDbG91ZCxcbiAgQ0xQOiBfUGFyc2VDTFAuZGVmYXVsdCxcbiAgQ29yZU1hbmFnZXI6IF9Db3JlTWFuYWdlci5kZWZhdWx0LFxuICBDb25maWc6IF9QYXJzZUNvbmZpZy5kZWZhdWx0LFxuICBFcnJvcjogX1BhcnNlRXJyb3IuZGVmYXVsdCxcbiAgRmFjZWJvb2tVdGlsczogX0ZhY2Vib29rVXRpbHMuZGVmYXVsdCxcbiAgRmlsZTogX1BhcnNlRmlsZS5kZWZhdWx0LFxuICBHZW9Qb2ludDogX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCxcbiAgUG9seWdvbjogX1BhcnNlUG9seWdvbi5kZWZhdWx0LFxuICBJbnN0YWxsYXRpb246IF9QYXJzZUluc3RhbGxhdGlvbi5kZWZhdWx0LFxuICBMb2NhbERhdGFzdG9yZTogX0xvY2FsRGF0YXN0b3JlLmRlZmF1bHQsXG4gIE9iamVjdDogX1BhcnNlT2JqZWN0LmRlZmF1bHQsXG4gIE9wOiB7XG4gICAgU2V0OiBQYXJzZU9wLlNldE9wLFxuICAgIFVuc2V0OiBQYXJzZU9wLlVuc2V0T3AsXG4gICAgSW5jcmVtZW50OiBQYXJzZU9wLkluY3JlbWVudE9wLFxuICAgIEFkZDogUGFyc2VPcC5BZGRPcCxcbiAgICBSZW1vdmU6IFBhcnNlT3AuUmVtb3ZlT3AsXG4gICAgQWRkVW5pcXVlOiBQYXJzZU9wLkFkZFVuaXF1ZU9wLFxuICAgIFJlbGF0aW9uOiBQYXJzZU9wLlJlbGF0aW9uT3BcbiAgfSxcbiAgUHVzaDogUHVzaCxcbiAgUXVlcnk6IF9QYXJzZVF1ZXJ5LmRlZmF1bHQsXG4gIFJlbGF0aW9uOiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0LFxuICBSb2xlOiBfUGFyc2VSb2xlLmRlZmF1bHQsXG4gIFNjaGVtYTogX1BhcnNlU2NoZW1hLmRlZmF1bHQsXG4gIFNlc3Npb246IF9QYXJzZVNlc3Npb24uZGVmYXVsdCxcbiAgU3RvcmFnZTogX1N0b3JhZ2UuZGVmYXVsdCxcbiAgVXNlcjogX1BhcnNlVXNlci5kZWZhdWx0LFxuICBMaXZlUXVlcnlDbGllbnQ6IF9MaXZlUXVlcnlDbGllbnQuZGVmYXVsdCxcbiAgSW5kZXhlZERCOiB1bmRlZmluZWQsXG4gIEhvb2tzOiB1bmRlZmluZWQsXG4gIFBhcnNlOiB1bmRlZmluZWQsXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtFdmVudHVhbGx5UXVldWV9IFBhcnNlLkV2ZW50dWFsbHlRdWV1ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgRXZlbnR1YWxseVF1ZXVlKHF1ZXVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0RXZlbnR1YWxseVF1ZXVlKHF1ZXVlKTtcbiAgfSxcbiAgZ2V0IEV2ZW50dWFsbHlRdWV1ZSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnR1YWxseVF1ZXVlKCk7XG4gIH0sXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgbWV0aG9kIGZpcnN0IHRvIHNldCB1cCB5b3VyIGF1dGhlbnRpY2F0aW9uIHRva2VucyBmb3IgUGFyc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBsaWNhdGlvbklkIFlvdXIgUGFyc2UgQXBwbGljYXRpb24gSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbamF2YVNjcmlwdEtleV0gWW91ciBQYXJzZSBKYXZhU2NyaXB0IEtleSAoTm90IG5lZWRlZCBmb3IgcGFyc2Utc2VydmVyKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21hc3RlcktleV0gWW91ciBQYXJzZSBNYXN0ZXIgS2V5LiAoTm9kZS5qcyBvbmx5ISlcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgaW5pdGlhbGl6ZShhcHBsaWNhdGlvbklkLCBqYXZhU2NyaXB0S2V5KSB7XG4gICAgaWYgKFwiYnJvd3NlclwiID09PSAnYnJvd3NlcicgJiYgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJU19OT0RFJykgJiYgIXByb2Nlc3MuZW52LlNFUlZFUl9SRU5ERVJJTkcpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICAgIGNvbnNvbGUubG9nKFwiSXQgbG9va3MgbGlrZSB5b3UncmUgdXNpbmcgdGhlIGJyb3dzZXIgdmVyc2lvbiBvZiB0aGUgU0RLIGluIGEgXCIgKyBcIm5vZGUuanMgZW52aXJvbm1lbnQuIFlvdSBzaG91bGQgcmVxdWlyZSgncGFyc2Uvbm9kZScpIGluc3RlYWQuXCIpO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gICAgfVxuICAgIFBhcnNlLl9pbml0aWFsaXplKGFwcGxpY2F0aW9uSWQsIGphdmFTY3JpcHRLZXkpO1xuICB9LFxuICBfaW5pdGlhbGl6ZShhcHBsaWNhdGlvbklkLCBqYXZhU2NyaXB0S2V5LCBtYXN0ZXJLZXkpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0FQUExJQ0FUSU9OX0lEJywgYXBwbGljYXRpb25JZCk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdKQVZBU0NSSVBUX0tFWScsIGphdmFTY3JpcHRLZXkpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnTUFTVEVSX0tFWScsIG1hc3RlcktleSk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdVU0VfTUFTVEVSX0tFWScsIGZhbHNlKTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnRXZlbnRFbWl0dGVyJywgX0V2ZW50RW1pdHRlci5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnTGl2ZVF1ZXJ5JywgbmV3IF9QYXJzZUxpdmVRdWVyeS5kZWZhdWx0KCkpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdDcnlwdG9Db250cm9sbGVyJywgX0NyeXB0b0NvbnRyb2xsZXIuZGVmYXVsdCk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ0V2ZW50dWFsbHlRdWV1ZScsIF9FdmVudHVhbGx5UXVldWUuZGVmYXVsdCk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ0luc3RhbGxhdGlvbkNvbnRyb2xsZXInLCBfSW5zdGFsbGF0aW9uQ29udHJvbGxlci5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyJywgX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnU3RvcmFnZUNvbnRyb2xsZXInLCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdCk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ1dlYlNvY2tldENvbnRyb2xsZXInLCBfV2ViU29ja2V0Q29udHJvbGxlci5kZWZhdWx0KTtcbiAgICBQYXJzZS5JbmRleGVkREIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXInLCBfSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdCk7XG4gIH0sXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIHNldCB5b3VyIEFzeW5jU3RvcmFnZSBlbmdpbmVcbiAgICogU3RhcnRpbmcgUGFyc2VAMS4xMSwgdGhlIFBhcnNlU0RLIGRvIG5vdCBwcm92aWRlIGEgUmVhY3QgQXN5bmNTdG9yYWdlIGFzIHRoZSBSZWFjdE5hdGl2ZSBtb2R1bGVcbiAgICogaXMgbm90IHByb3ZpZGVkIGF0IGEgc3RhYmxlIHBhdGggYW5kIGNoYW5nZXMgb3ZlciB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtBc3luY1N0b3JhZ2V9IHN0b3JhZ2UgYSByZWFjdCBuYXRpdmUgYXN5bmMgc3RvcmFnZS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0QXN5bmNTdG9yYWdlKHN0b3JhZ2UpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRBc3luY1N0b3JhZ2Uoc3RvcmFnZSk7XG4gIH0sXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIHNldCB5b3VyIExvY2FsRGF0YXN0b3JlU3RvcmFnZSBlbmdpbmVcbiAgICogSWYgdXNpbmcgUmVhY3QtTmF0aXZlIHVzZSB7QGxpbmsgUGFyc2Uuc2V0QXN5bmNTdG9yYWdlIFBhcnNlLnNldEFzeW5jU3RvcmFnZSgpfVxuICAgKlxuICAgKiBAcGFyYW0ge0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlcn0gY29udHJvbGxlciBhIGRhdGEgc3RvcmFnZS5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoY29udHJvbGxlcik7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgY3VycmVudCBzZXJ2ZXIncyBoZWFsdGhcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGdldFNlcnZlckhlYWx0aCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5yZXF1ZXN0KCdHRVQnLCAnaGVhbHRoJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLmFwcGxpY2F0aW9uSWRcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IGFwcGxpY2F0aW9uSWQodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0FQUExJQ0FUSU9OX0lEJywgdmFsdWUpO1xuICB9LFxuICBnZXQgYXBwbGljYXRpb25JZCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBUFBMSUNBVElPTl9JRCcpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5qYXZhU2NyaXB0S2V5XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBqYXZhU2NyaXB0S2V5KHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdKQVZBU0NSSVBUX0tFWScsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IGphdmFTY3JpcHRLZXkoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSkFWQVNDUklQVF9LRVknKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge3N0cmluZ30gUGFyc2UubWFzdGVyS2V5XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBtYXN0ZXJLZXkodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ01BU1RFUl9LRVknLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBtYXN0ZXJLZXkoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTUFTVEVSX0tFWScpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5zZXJ2ZXJVUkxcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IHNlcnZlclVSTCh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnU0VSVkVSX1VSTCcsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IHNlcnZlclVSTCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfVVJMJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLnNlcnZlckF1dGhUb2tlblxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgc2VydmVyQXV0aFRva2VuKHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdTRVJWRVJfQVVUSF9UT0tFTicsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IHNlcnZlckF1dGhUb2tlbigpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfQVVUSF9UT0tFTicpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5zZXJ2ZXJBdXRoVHlwZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgc2VydmVyQXV0aFR5cGUodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ1NFUlZFUl9BVVRIX1RZUEUnLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBzZXJ2ZXJBdXRoVHlwZSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfQVVUSF9UWVBFJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtQYXJzZUxpdmVRdWVyeX0gUGFyc2UuTGl2ZVF1ZXJ5XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBMaXZlUXVlcnkobGl2ZVF1ZXJ5KSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0TGl2ZVF1ZXJ5KGxpdmVRdWVyeSk7XG4gIH0sXG4gIGdldCBMaXZlUXVlcnkoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExpdmVRdWVyeSgpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5saXZlUXVlcnlTZXJ2ZXJVUkxcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IGxpdmVRdWVyeVNlcnZlclVSTCh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnTElWRVFVRVJZX1NFUlZFUl9VUkwnLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBsaXZlUXVlcnlTZXJ2ZXJVUkwoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTElWRVFVRVJZX1NFUlZFUl9VUkwnKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge2Jvb2xlYW59IFBhcnNlLmVuY3J5cHRlZFVzZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IGVuY3J5cHRlZFVzZXIodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0VOQ1JZUFRFRF9VU0VSJywgdmFsdWUpO1xuICB9LFxuICBnZXQgZW5jcnlwdGVkVXNlcigpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfVVNFUicpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5zZWNyZXRcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IHNlY3JldCh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnRU5DUllQVEVEX0tFWScsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IHNlY3JldCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfS0VZJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtib29sZWFufSBQYXJzZS5pZGVtcG90ZW5jeVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgaWRlbXBvdGVuY3kodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0lERU1QT1RFTkNZJywgdmFsdWUpO1xuICB9LFxuICBnZXQgaWRlbXBvdGVuY3koKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSURFTVBPVEVOQ1knKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge2Jvb2xlYW59IFBhcnNlLmFsbG93Q3VzdG9tT2JqZWN0SWRcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IGFsbG93Q3VzdG9tT2JqZWN0SWQodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0FMTE9XX0NVU1RPTV9PQkpFQ1RfSUQnLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBhbGxvd0N1c3RvbU9iamVjdElkKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FMTE9XX0NVU1RPTV9PQkpFQ1RfSUQnKTtcbiAgfSxcbiAgX3JlcXVlc3QoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5yZXF1ZXN0LmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9LFxuICBfYWpheCgpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkuYWpheC5hcHBseShudWxsLCBhcmdzKTtcbiAgfSxcbiAgLy8gV2UgYXR0ZW1wdCB0byBtYXRjaCB0aGUgc2lnbmF0dXJlcyBvZiB0aGUgbGVnYWN5IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHNcbiAgX2RlY29kZShfLCB2YWx1ZSkge1xuICAgIHJldHVybiAoMCwgX2RlY29kZTIuZGVmYXVsdCkodmFsdWUpO1xuICB9LFxuICBfZW5jb2RlKHZhbHVlLCBfLCBkaXNhbGxvd09iamVjdHMpIHtcbiAgICByZXR1cm4gKDAsIF9lbmNvZGUyLmRlZmF1bHQpKHZhbHVlLCBkaXNhbGxvd09iamVjdHMpO1xuICB9LFxuICBfZ2V0SW5zdGFsbGF0aW9uSWQoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoKS5jdXJyZW50SW5zdGFsbGF0aW9uSWQoKTtcbiAgfSxcbiAgLyoqXG4gICAqIEVuYWJsZSBwaW5uaW5nIGluIHlvdXIgYXBwbGljYXRpb24uXG4gICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYFBhcnNlLmluaXRpYWxpemVgIGluIHlvdXIgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBbcG9sbGluZ10gQWxsb3cgcGluZ2luZyB0aGUgc2VydmVyIC9oZWFsdGggZW5kcG9pbnQuIERlZmF1bHQgdHJ1ZVxuICAgKiBAcGFyYW0gW21zXSBNaWxsaXNlY29uZHMgdG8gcGluZyB0aGUgc2VydmVyLiBEZWZhdWx0IDIwMDBtc1xuICAgKiBAc3RhdGljXG4gICAqL1xuICBlbmFibGVMb2NhbERhdGFzdG9yZSgpIHtcbiAgICBsZXQgcG9sbGluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgICBsZXQgbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDIwMDA7XG4gICAgaWYgKCF0aGlzLmFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiJ2VuYWJsZUxvY2FsRGF0YVN0b3JlJyBtdXN0IGJlIGNhbGxlZCBhZnRlciAnaW5pdGlhbGl6ZSdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5Mb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuTG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgIGlmIChwb2xsaW5nKSB7XG4gICAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50dWFsbHlRdWV1ZSgpLnBvbGwobXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBMb2NhbCBEYXRhc3RvcmUgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzTG9jYWxEYXRhc3RvcmVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLkxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZDtcbiAgfSxcbiAgLyoqXG4gICAqIEdldHMgYWxsIGNvbnRlbnRzIGZyb20gTG9jYWwgRGF0YXN0b3JlXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLmR1bXBMb2NhbERhdGFzdG9yZSgpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgZHVtcExvY2FsRGF0YXN0b3JlKCkge1xuICAgIGlmICghdGhpcy5Mb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQYXJzZS5Mb2NhbERhdGFzdG9yZS5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBFbmFibGUgdGhlIGN1cnJlbnQgdXNlciBlbmNyeXB0aW9uLlxuICAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBsb2dpbiBhbnkgdXNlci5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgZW5hYmxlRW5jcnlwdGVkVXNlcigpIHtcbiAgICB0aGlzLmVuY3J5cHRlZFVzZXIgPSB0cnVlO1xuICB9LFxuICAvKipcbiAgICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIEVuY3J5cHRlZCBVc2VyIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0VuY3J5cHRlZFVzZXJFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmVuY3J5cHRlZFVzZXI7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRSRVNUQ29udHJvbGxlcihfUkVTVENvbnRyb2xsZXIuZGVmYXVsdCk7XG4vLyBGb3IgbGVnYWN5IHJlcXVpcmVzLCBvZiB0aGUgZm9ybSBgdmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2UnKS5QYXJzZWBcblBhcnNlLlBhcnNlID0gUGFyc2U7XG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2U7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuY29uc3QgUFVCTElDX0tFWSA9ICcqJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEFDTC5cbiAqIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgQUNMIGhhcyBubyBwZXJtaXNzaW9ucyBmb3IgYW55b25lLlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgUGFyc2UuVXNlciwgdGhlIEFDTCB3aWxsIGhhdmUgcmVhZCBhbmQgd3JpdGVcbiAqICAgcGVybWlzc2lvbiBmb3Igb25seSB0aGF0IHVzZXIuXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW55IG90aGVyIEpTT04gb2JqZWN0LCB0aGF0IG9iamVjdCB3aWxsIGJlIGludGVycHJldHRlZFxuICogICBhcyBhIHNlcmlhbGl6ZWQgQUNMIGNyZWF0ZWQgd2l0aCB0b0pTT04oKS5cbiAqXG4gKiA8cD5BbiBBQ0wsIG9yIEFjY2VzcyBDb250cm9sIExpc3QgY2FuIGJlIGFkZGVkIHRvIGFueVxuICogPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPiB0byByZXN0cmljdCBhY2Nlc3MgdG8gb25seSBhIHN1YnNldCBvZiB1c2Vyc1xuICogb2YgeW91ciBhcHBsaWNhdGlvbi48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLkFDTFxuICovXG5jbGFzcyBQYXJzZUFDTCB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyhQYXJzZS5Vc2VyIHwgb2JqZWN0KX0gYXJnMSBUaGUgdXNlciB0byBpbml0aWFsaXplIHRoZSBBQ0wgZm9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhcmcxKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJwZXJtaXNzaW9uc0J5SWRcIiwgdm9pZCAwKTtcbiAgICB0aGlzLnBlcm1pc3Npb25zQnlJZCA9IHt9O1xuICAgIGlmIChhcmcxICYmIHR5cGVvZiBhcmcxID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgUGFyc2VVc2VyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VVc2VyKCk7XG4gICAgICBpZiAoYXJnMSBpbnN0YW5jZW9mIFBhcnNlVXNlcikge1xuICAgICAgICB0aGlzLnNldFJlYWRBY2Nlc3MoYXJnMSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0V3JpdGVBY2Nlc3MoYXJnMSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiBhcmcxKSB7XG4gICAgICAgICAgY29uc3QgYWNjZXNzTGlzdCA9IGFyZzFbdXNlcklkXTtcbiAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIGluIGFjY2Vzc0xpc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSBhY2Nlc3NMaXN0W3Blcm1pc3Npb25dO1xuICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24gIT09ICdyZWFkJyAmJiBwZXJtaXNzaW9uICE9PSAnd3JpdGUnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIGNyZWF0ZSBhbiBBQ0wgd2l0aCBhbiBpbnZhbGlkIHBlcm1pc3Npb24gdHlwZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWxsb3dlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIGNyZWF0ZSBhbiBBQ0wgd2l0aCBhbiBpbnZhbGlkIHBlcm1pc3Npb24gdmFsdWUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdW3Blcm1pc3Npb25dID0gYWxsb3dlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcxID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXJzZUFDTCBjb25zdHJ1Y3RlZCB3aXRoIGEgZnVuY3Rpb24uIERpZCB5b3UgZm9yZ2V0ICgpPycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTi1lbmNvZGVkIHZlcnNpb24gb2YgdGhlIEFDTC5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHt9O1xuICAgIGZvciAoY29uc3QgcCBpbiB0aGlzLnBlcm1pc3Npb25zQnlJZCkge1xuICAgICAgcGVybWlzc2lvbnNbcF0gPSB0aGlzLnBlcm1pc3Npb25zQnlJZFtwXTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEFDTCBpcyBlcXVhbCB0byBhbm90aGVyIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlQUNMfSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0J3MgQUNMIHRvIGNvbXBhcmUgdG9cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFBhcnNlQUNMKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB1c2VycyA9ICgwLCBfa2V5cy5kZWZhdWx0KSh0aGlzLnBlcm1pc3Npb25zQnlJZCk7XG4gICAgY29uc3Qgb3RoZXJVc2VycyA9ICgwLCBfa2V5cy5kZWZhdWx0KShvdGhlci5wZXJtaXNzaW9uc0J5SWQpO1xuICAgIGlmICh1c2Vycy5sZW5ndGggIT09IG90aGVyVXNlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdSBpbiB0aGlzLnBlcm1pc3Npb25zQnlJZCkge1xuICAgICAgaWYgKCFvdGhlci5wZXJtaXNzaW9uc0J5SWRbdV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGVybWlzc2lvbnNCeUlkW3VdLnJlYWQgIT09IG90aGVyLnBlcm1pc3Npb25zQnlJZFt1XS5yZWFkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25zQnlJZFt1XS53cml0ZSAhPT0gb3RoZXIucGVybWlzc2lvbnNCeUlkW3VdLndyaXRlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgX3NldEFjY2VzcyhhY2Nlc3NUeXBlLCB1c2VySWQsIGFsbG93ZWQpIHtcbiAgICBjb25zdCBQYXJzZVJvbGUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVJvbGUoKTtcbiAgICBjb25zdCBQYXJzZVVzZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVVzZXIoKTtcbiAgICBpZiAodXNlcklkIGluc3RhbmNlb2YgUGFyc2VVc2VyKSB7XG4gICAgICB1c2VySWQgPSB1c2VySWQuaWQ7XG4gICAgfSBlbHNlIGlmICh1c2VySWQgaW5zdGFuY2VvZiBQYXJzZVJvbGUpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB1c2VySWQuZ2V0TmFtZSgpO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JvbGUgbXVzdCBoYXZlIGEgbmFtZScpO1xuICAgICAgfVxuICAgICAgdXNlcklkID0gJ3JvbGU6JyArIG5hbWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndXNlcklkIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWxsb3dlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhbGxvd2VkIG11c3QgYmUgZWl0aGVyIHRydWUgb3IgZmFsc2UuJyk7XG4gICAgfVxuICAgIGxldCBwZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF07XG4gICAgaWYgKCFwZXJtaXNzaW9ucykge1xuICAgICAgaWYgKCFhbGxvd2VkKSB7XG4gICAgICAgIC8vIFRoZSB1c2VyIGFscmVhZHkgZG9lc24ndCBoYXZlIHRoaXMgcGVybWlzc2lvbiwgc28gbm8gYWN0aW9uIGlzIG5lZWRlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXJtaXNzaW9ucyA9IHt9O1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdID0gcGVybWlzc2lvbnM7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxvd2VkKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdW2FjY2Vzc1R5cGVdID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHBlcm1pc3Npb25zW2FjY2Vzc1R5cGVdO1xuICAgICAgaWYgKCgwLCBfa2V5cy5kZWZhdWx0KShwZXJtaXNzaW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfZ2V0QWNjZXNzKGFjY2Vzc1R5cGUsIHVzZXJJZCkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGNvbnN0IFBhcnNlVXNlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlVXNlcigpO1xuICAgIGlmICh1c2VySWQgaW5zdGFuY2VvZiBQYXJzZVVzZXIpIHtcbiAgICAgIHVzZXJJZCA9IHVzZXJJZC5pZDtcbiAgICAgIGlmICghdXNlcklkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBhY2Nlc3MgZm9yIGEgUGFyc2VVc2VyIHdpdGhvdXQgYW4gSUQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIFBhcnNlUm9sZSkge1xuICAgICAgY29uc3QgbmFtZSA9IHVzZXJJZC5nZXROYW1lKCk7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUm9sZSBtdXN0IGhhdmUgYSBuYW1lJyk7XG4gICAgICB9XG4gICAgICB1c2VySWQgPSAncm9sZTonICsgbmFtZTtcbiAgICB9XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdO1xuICAgIGlmICghcGVybWlzc2lvbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhcGVybWlzc2lvbnNbYWNjZXNzVHlwZV07XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlzIGFsbG93ZWQgdG8gcmVhZCB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhhdCB1c2VyIHNob3VsZCBoYXZlIHJlYWQgYWNjZXNzLlxuICAgKi9cbiAgc2V0UmVhZEFjY2Vzcyh1c2VySWQsIGFsbG93ZWQpIHtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ3JlYWQnLCB1c2VySWQsIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlkIGlzICpleHBsaWNpdGx5KiBhbGxvd2VkIHRvIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgdXNlciBtYXkgc3RpbGwgYmUgYWJsZSB0byBhY2Nlc3MgaXQgaWZcbiAgICogZ2V0UHVibGljUmVhZEFjY2VzcyByZXR1cm5zIHRydWUgb3IgYSByb2xlIHRoYXQgdGhlIHVzZXIgYmVsb25ncyB0byBoYXNcbiAgICogd3JpdGUgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0UmVhZEFjY2Vzcyh1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKCdyZWFkJywgdXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaWQgaXMgYWxsb3dlZCB0byB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZCwgb3IgYSBQYXJzZS5Sb2xlLi5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhhdCB1c2VyIHNob3VsZCBoYXZlIHdyaXRlIGFjY2Vzcy5cbiAgICovXG4gIHNldFdyaXRlQWNjZXNzKHVzZXJJZCwgYWxsb3dlZCkge1xuICAgIHRoaXMuX3NldEFjY2Vzcygnd3JpdGUnLCB1c2VySWQsIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpZCBpcyAqZXhwbGljaXRseSogYWxsb3dlZCB0byB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICogRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB1c2VyIG1heSBzdGlsbCBiZSBhYmxlIHRvIHdyaXRlIGl0IGlmXG4gICAqIGdldFB1YmxpY1dyaXRlQWNjZXNzIHJldHVybnMgdHJ1ZSBvciBhIHJvbGUgdGhhdCB0aGUgdXNlciBiZWxvbmdzIHRvIGhhc1xuICAgKiB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRXcml0ZUFjY2Vzcyh1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKCd3cml0ZScsIHVzZXJJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byByZWFkIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWRcbiAgICovXG4gIHNldFB1YmxpY1JlYWRBY2Nlc3MoYWxsb3dlZCkge1xuICAgIHRoaXMuc2V0UmVhZEFjY2VzcyhQVUJMSUNfS0VZLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0UHVibGljUmVhZEFjY2VzcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZWFkQWNjZXNzKFBVQkxJQ19LRVkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gd3JpdGUgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZFxuICAgKi9cbiAgc2V0UHVibGljV3JpdGVBY2Nlc3MoYWxsb3dlZCkge1xuICAgIHRoaXMuc2V0V3JpdGVBY2Nlc3MoUFVCTElDX0tFWSwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRQdWJsaWNXcml0ZUFjY2VzcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRXcml0ZUFjY2VzcyhQVUJMSUNfS0VZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHJlYWQgdGhpcyBvYmplY3QuIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgcm9sZSBtYXlcbiAgICogc3RpbGwgYmUgYWJsZSB0byB3cml0ZSBpdCBpZiBhIHBhcmVudCByb2xlIGhhcyByZWFkIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSByb2xlIGhhcyByZWFkIGFjY2Vzcy4gZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgZ2V0Um9sZVJlYWRBY2Nlc3Mocm9sZSkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGlmIChyb2xlIGluc3RhbmNlb2YgUGFyc2VSb2xlKSB7XG4gICAgICAvLyBOb3JtYWxpemUgdG8gdGhlIFN0cmluZyBuYW1lXG4gICAgICByb2xlID0gcm9sZS5nZXROYW1lKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygcm9sZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JvbGUgbXVzdCBiZSBhIFBhcnNlUm9sZSBvciBhIFN0cmluZycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRSZWFkQWNjZXNzKCdyb2xlOicgKyByb2xlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHdyaXRlIHRoaXMgb2JqZWN0LiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvbGUgbWF5XG4gICAqIHN0aWxsIGJlIGFibGUgdG8gd3JpdGUgaXQgaWYgYSBwYXJlbnQgcm9sZSBoYXMgd3JpdGUgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHJvbGUgaGFzIHdyaXRlIGFjY2Vzcy4gZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgZ2V0Um9sZVdyaXRlQWNjZXNzKHJvbGUpIHtcbiAgICBjb25zdCBQYXJzZVJvbGUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVJvbGUoKTtcbiAgICBpZiAocm9sZSBpbnN0YW5jZW9mIFBhcnNlUm9sZSkge1xuICAgICAgLy8gTm9ybWFsaXplIHRvIHRoZSBTdHJpbmcgbmFtZVxuICAgICAgcm9sZSA9IHJvbGUuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJvbGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyb2xlIG11c3QgYmUgYSBQYXJzZVJvbGUgb3IgYSBTdHJpbmcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0V3JpdGVBY2Nlc3MoJ3JvbGU6JyArIHJvbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gcmVhZCB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCBXaGV0aGVyIHRoZSBnaXZlbiByb2xlIGNhbiByZWFkIHRoaXMgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgc2V0Um9sZVJlYWRBY2Nlc3Mocm9sZSwgYWxsb3dlZCkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGlmIChyb2xlIGluc3RhbmNlb2YgUGFyc2VSb2xlKSB7XG4gICAgICAvLyBOb3JtYWxpemUgdG8gdGhlIFN0cmluZyBuYW1lXG4gICAgICByb2xlID0gcm9sZS5nZXROYW1lKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygcm9sZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JvbGUgbXVzdCBiZSBhIFBhcnNlUm9sZSBvciBhIFN0cmluZycpO1xuICAgIH1cbiAgICB0aGlzLnNldFJlYWRBY2Nlc3MoJ3JvbGU6JyArIHJvbGUsIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gd3JpdGUgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGUgZ2l2ZW4gcm9sZSBjYW4gd3JpdGUgdGhpcyBvYmplY3QuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBzZXRSb2xlV3JpdGVBY2Nlc3Mocm9sZSwgYWxsb3dlZCkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGlmIChyb2xlIGluc3RhbmNlb2YgUGFyc2VSb2xlKSB7XG4gICAgICAvLyBOb3JtYWxpemUgdG8gdGhlIFN0cmluZyBuYW1lXG4gICAgICByb2xlID0gcm9sZS5nZXROYW1lKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygcm9sZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JvbGUgbXVzdCBiZSBhIFBhcnNlUm9sZSBvciBhIFN0cmluZycpO1xuICAgIH1cbiAgICB0aGlzLnNldFdyaXRlQWNjZXNzKCdyb2xlOicgKyByb2xlLCBhbGxvd2VkKTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VBQ0w7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9tYXBcIikpO1xudmFyIF9lbnRyaWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9lbnRyaWVzXCIpKTtcbnZhciBfYXNzaWduID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvYXNzaWduXCIpKTtcbnZhciBfc2xpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NsaWNlXCIpKTtcbnZhciBfaW5jbHVkZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpKTtcbnZhciBfZXZlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2V2ZXJ5XCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX1BhcnNlUm9sZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSb2xlXCIpKTtcbnZhciBfUGFyc2VVc2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVVzZXJcIikpO1xuY29uc3QgUFVCTElDX0tFWSA9ICcqJztcbmNvbnN0IFZBTElEX1BFUk1JU1NJT05TID0gbmV3IF9tYXAuZGVmYXVsdCgpO1xuVkFMSURfUEVSTUlTU0lPTlMuc2V0KCdnZXQnLCB7fSk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ2ZpbmQnLCB7fSk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ2NvdW50Jywge30pO1xuVkFMSURfUEVSTUlTU0lPTlMuc2V0KCdjcmVhdGUnLCB7fSk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ3VwZGF0ZScsIHt9KTtcblZBTElEX1BFUk1JU1NJT05TLnNldCgnZGVsZXRlJywge30pO1xuVkFMSURfUEVSTUlTU0lPTlMuc2V0KCdhZGRGaWVsZCcsIHt9KTtcbmNvbnN0IFZBTElEX1BFUk1JU1NJT05TX0VYVEVOREVEID0gbmV3IF9tYXAuZGVmYXVsdCgpO1xuVkFMSURfUEVSTUlTU0lPTlNfRVhURU5ERUQuc2V0KCdwcm90ZWN0ZWRGaWVsZHMnLCB7fSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBDTFAuXG4gKiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIENMUCBoYXMgbm8gcGVybWlzc2lvbnMgZm9yIGFueW9uZS5cbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIFBhcnNlLlVzZXIgb3IgUGFyc2UuUm9sZSwgdGhlIENMUCB3aWxsIGhhdmUgcmVhZCBhbmQgd3JpdGVcbiAqICAgcGVybWlzc2lvbiBmb3Igb25seSB0aGF0IHVzZXIgb3Igcm9sZS5cbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbnkgb3RoZXIgSlNPTiBvYmplY3QsIHRoYXQgb2JqZWN0IHdpbGwgYmUgaW50ZXJwcmV0dGVkXG4gKiAgIGFzIGEgc2VyaWFsaXplZCBDTFAgY3JlYXRlZCB3aXRoIHRvSlNPTigpLlxuICpcbiAqIDxwPkEgQ0xQLCBvciBDbGFzcyBMZXZlbCBQZXJtaXNzaW9ucyBjYW4gYmUgYWRkZWQgdG8gYW55XG4gKiA8Y29kZT5QYXJzZS5TY2hlbWE8L2NvZGU+IHRvIHJlc3RyaWN0IGFjY2VzcyB0byBvbmx5IGEgc3Vic2V0IG9mIHVzZXJzXG4gKiBvZiB5b3VyIGFwcGxpY2F0aW9uLjwvcD5cbiAqXG4gKiA8cD5cbiAqIEZvciBnZXQvY291bnQvZmluZC9jcmVhdGUvdXBkYXRlL2RlbGV0ZS9hZGRGaWVsZCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczpcbiAqXG4gKiBFbnRpdHkgaXMgdHlwZSBQYXJzZS5Vc2VyIG9yIFBhcnNlLlJvbGUgb3Igc3RyaW5nXG4gKiBSb2xlIGlzIHR5cGUgUGFyc2UuUm9sZSBvciBOYW1lIG9mIFBhcnNlLlJvbGVcbiAqXG4gKiBnZXRHZXRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldEdldFJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldEdldFBvaW50ZXJGaWVsZHMoKVxuICogc2V0R2V0UG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldEdldEFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldEdldEFjY2VzcyhlbnRpdHk6IEVudGl0eSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFB1YmxpY0dldEFjY2VzcygpXG4gKiBzZXRQdWJsaWNHZXRBY2Nlc3MoYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFJvbGVHZXRBY2Nlc3Mocm9sZTogUm9sZSlcbiAqIHNldFJvbGVHZXRBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldEZpbmRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldEZpbmRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRGaW5kUG9pbnRlckZpZWxkcygpXG4gKiBzZXRGaW5kUG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldEZpbmRBY2Nlc3MoZW50aXR5OiBFbnRpdHkpXG4gKiBzZXRGaW5kQWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljRmluZEFjY2VzcygpXG4gKiBzZXRQdWJsaWNGaW5kQWNjZXNzKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRSb2xlRmluZEFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZUZpbmRBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldENvdW50UmVxdWlyZXNBdXRoZW50aWNhdGlvbigpXG4gKiBzZXRDb3VudFJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldENvdW50UG9pbnRlckZpZWxkcygpXG4gKiBzZXRDb3VudFBvaW50ZXJGaWVsZHMocG9pbnRlckZpZWxkczogc3RyaW5nW10pXG4gKiBnZXRDb3VudEFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldENvdW50QWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljQ291bnRBY2Nlc3MoKVxuICogc2V0UHVibGljQ291bnRBY2Nlc3MoYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFJvbGVDb3VudEFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZUNvdW50QWNjZXNzKHJvbGU6IFJvbGUsIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRDcmVhdGVSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldENyZWF0ZVJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldENyZWF0ZVBvaW50ZXJGaWVsZHMoKVxuICogc2V0Q3JlYXRlUG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldENyZWF0ZUFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldENyZWF0ZUFjY2VzcyhlbnRpdHk6IEVudGl0eSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFB1YmxpY0NyZWF0ZUFjY2VzcygpXG4gKiBzZXRQdWJsaWNDcmVhdGVBY2Nlc3MoYWxsb3dlZDogQm9vbGVhbilcbiAqIGdldFJvbGVDcmVhdGVBY2Nlc3Mocm9sZTogUm9sZSlcbiAqIHNldFJvbGVDcmVhdGVBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFVwZGF0ZVJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0VXBkYXRlUmVxdWlyZXNBdXRoZW50aWNhdGlvbihhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0VXBkYXRlUG9pbnRlckZpZWxkcygpXG4gKiBzZXRVcGRhdGVQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0VXBkYXRlQWNjZXNzKGVudGl0eTogRW50aXR5KVxuICogc2V0VXBkYXRlQWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljVXBkYXRlQWNjZXNzKClcbiAqIHNldFB1YmxpY1VwZGF0ZUFjY2VzcyhhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Um9sZVVwZGF0ZUFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZVVwZGF0ZUFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0RGVsZXRlUmVxdWlyZXNBdXRoZW50aWNhdGlvbigpXG4gKiBzZXREZWxldGVSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXREZWxldGVQb2ludGVyRmllbGRzKClcbiAqIHNldERlbGV0ZVBvaW50ZXJGaWVsZHMocG9pbnRlckZpZWxkczogc3RyaW5nW10pXG4gKiBnZXREZWxldGVBY2Nlc3MoZW50aXR5OiBFbnRpdHkpXG4gKiBzZXREZWxldGVBY2Nlc3MoZW50aXR5OiBFbnRpdHksIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRQdWJsaWNEZWxldGVBY2Nlc3MoKVxuICogc2V0UHVibGljRGVsZXRlQWNjZXNzKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRSb2xlRGVsZXRlQWNjZXNzKHJvbGU6IFJvbGUpXG4gKiBzZXRSb2xlRGVsZXRlQWNjZXNzKHJvbGU6IFJvbGUsIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRBZGRGaWVsZFJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0QWRkRmllbGRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRBZGRGaWVsZFBvaW50ZXJGaWVsZHMoKVxuICogc2V0QWRkRmllbGRQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0QWRkRmllbGRBY2Nlc3MoZW50aXR5OiBFbnRpdHkpXG4gKiBzZXRBZGRGaWVsZEFjY2VzcyhlbnRpdHk6IEVudGl0eSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFB1YmxpY0FkZEZpZWxkQWNjZXNzKClcbiAqIHNldFB1YmxpY0FkZEZpZWxkQWNjZXNzKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRSb2xlQWRkRmllbGRBY2Nlc3Mocm9sZTogUm9sZSlcbiAqIHNldFJvbGVBZGRGaWVsZEFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5DTFBcbiAqL1xuY2xhc3MgUGFyc2VDTFAge1xuICAvKipcbiAgICogQHBhcmFtIHsoUGFyc2UuVXNlciB8IFBhcnNlLlJvbGUgfCBvYmplY3QpfSB1c2VySWQgVGhlIHVzZXIgdG8gaW5pdGlhbGl6ZSB0aGUgQ0xQIGZvclxuICAgKi9cbiAgY29uc3RydWN0b3IodXNlcklkKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJwZXJtaXNzaW9uc01hcFwiLCB2b2lkIDApO1xuICAgIHRoaXMucGVybWlzc2lvbnNNYXAgPSB7fTtcbiAgICAvLyBJbml0aWFsaXplIHBlcm1pc3Npb25zIE1hcCB3aXRoIGRlZmF1bHQgcGVybWlzc2lvbnNcbiAgICBmb3IgKGNvbnN0IFtvcGVyYXRpb24sIGdyb3VwXSBvZiAoMCwgX2VudHJpZXMuZGVmYXVsdCkoVkFMSURfUEVSTUlTU0lPTlMpLmNhbGwoVkFMSURfUEVSTUlTU0lPTlMpKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl0gPSAoMCwgX2Fzc2lnbi5kZWZhdWx0KSh7fSwgZ3JvdXApO1xuICAgICAgY29uc3QgYWN0aW9uID0gb3BlcmF0aW9uLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgKDAsIF9zbGljZS5kZWZhdWx0KShvcGVyYXRpb24pLmNhbGwob3BlcmF0aW9uLCAxKTtcbiAgICAgIHRoaXNbYGdldCR7YWN0aW9ufVJlcXVpcmVzQXV0aGVudGljYXRpb25gXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcyhvcGVyYXRpb24sICdyZXF1aXJlc0F1dGhlbnRpY2F0aW9uJyk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgc2V0JHthY3Rpb259UmVxdWlyZXNBdXRoZW50aWNhdGlvbmBdID0gZnVuY3Rpb24gKGFsbG93ZWQpIHtcbiAgICAgICAgdGhpcy5fc2V0QWNjZXNzKG9wZXJhdGlvbiwgJ3JlcXVpcmVzQXV0aGVudGljYXRpb24nLCBhbGxvd2VkKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BnZXQke2FjdGlvbn1Qb2ludGVyRmllbGRzYF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3Mob3BlcmF0aW9uLCAncG9pbnRlckZpZWxkcycsIGZhbHNlKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BzZXQke2FjdGlvbn1Qb2ludGVyRmllbGRzYF0gPSBmdW5jdGlvbiAocG9pbnRlckZpZWxkcykge1xuICAgICAgICB0aGlzLl9zZXRBcnJheUFjY2VzcyhvcGVyYXRpb24sICdwb2ludGVyRmllbGRzJywgcG9pbnRlckZpZWxkcyk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgZ2V0JHthY3Rpb259QWNjZXNzYF0gPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3Mob3BlcmF0aW9uLCBlbnRpdHkpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYHNldCR7YWN0aW9ufUFjY2Vzc2BdID0gZnVuY3Rpb24gKGVudGl0eSwgYWxsb3dlZCkge1xuICAgICAgICB0aGlzLl9zZXRBY2Nlc3Mob3BlcmF0aW9uLCBlbnRpdHksIGFsbG93ZWQpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYGdldFB1YmxpYyR7YWN0aW9ufUFjY2Vzc2BdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tgZ2V0JHthY3Rpb259QWNjZXNzYF0oUFVCTElDX0tFWSk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgc2V0UHVibGljJHthY3Rpb259QWNjZXNzYF0gPSBmdW5jdGlvbiAoYWxsb3dlZCkge1xuICAgICAgICB0aGlzW2BzZXQke2FjdGlvbn1BY2Nlc3NgXShQVUJMSUNfS0VZLCBhbGxvd2VkKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BnZXRSb2xlJHthY3Rpb259QWNjZXNzYF0gPSBmdW5jdGlvbiAocm9sZSkge1xuICAgICAgICByZXR1cm4gdGhpc1tgZ2V0JHthY3Rpb259QWNjZXNzYF0odGhpcy5fZ2V0Um9sZU5hbWUocm9sZSkpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYHNldFJvbGUke2FjdGlvbn1BY2Nlc3NgXSA9IGZ1bmN0aW9uIChyb2xlLCBhbGxvd2VkKSB7XG4gICAgICAgIHRoaXNbYHNldCR7YWN0aW9ufUFjY2Vzc2BdKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpLCBhbGxvd2VkKTtcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgcGVybWlzc2lvbnMgTWFwIHdpdGggZGVmYXVsdCBleHRlbmRlZCBwZXJtaXNzaW9uc1xuICAgIGZvciAoY29uc3QgW29wZXJhdGlvbiwgZ3JvdXBdIG9mICgwLCBfZW50cmllcy5kZWZhdWx0KShWQUxJRF9QRVJNSVNTSU9OU19FWFRFTkRFRCkuY2FsbChWQUxJRF9QRVJNSVNTSU9OU19FWFRFTkRFRCkpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXSA9ICgwLCBfYXNzaWduLmRlZmF1bHQpKHt9LCBncm91cCk7XG4gICAgfVxuICAgIGlmICh1c2VySWQgJiYgdHlwZW9mIHVzZXJJZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh1c2VySWQgaW5zdGFuY2VvZiBfUGFyc2VVc2VyLmRlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5zZXRSZWFkQWNjZXNzKHVzZXJJZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0V3JpdGVBY2Nlc3ModXNlcklkLCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAodXNlcklkIGluc3RhbmNlb2YgX1BhcnNlUm9sZS5kZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuc2V0Um9sZVJlYWRBY2Nlc3ModXNlcklkLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRSb2xlV3JpdGVBY2Nlc3ModXNlcklkLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBpbiB1c2VySWQpIHtcbiAgICAgICAgICB2YXIgX2NvbnRleHQ7XG4gICAgICAgICAgY29uc3QgdXNlcnMgPSB1c2VySWRbcGVybWlzc2lvbl07XG4gICAgICAgICAgY29uc3QgaXNWYWxpZFBlcm1pc3Npb24gPSAhIVZBTElEX1BFUk1JU1NJT05TLmdldChwZXJtaXNzaW9uKTtcbiAgICAgICAgICBjb25zdCBpc1ZhbGlkUGVybWlzc2lvbkV4dGVuZGVkID0gISFWQUxJRF9QRVJNSVNTSU9OU19FWFRFTkRFRC5nZXQocGVybWlzc2lvbik7XG4gICAgICAgICAgY29uc3QgaXNWYWxpZEdyb3VwUGVybWlzc2lvbiA9ICgwLCBfaW5jbHVkZXMuZGVmYXVsdCkoX2NvbnRleHQgPSBbJ3JlYWRVc2VyRmllbGRzJywgJ3dyaXRlVXNlckZpZWxkcyddKS5jYWxsKF9jb250ZXh0LCBwZXJtaXNzaW9uKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHBlcm1pc3Npb24gIT09ICdzdHJpbmcnIHx8ICEoaXNWYWxpZFBlcm1pc3Npb24gfHwgaXNWYWxpZFBlcm1pc3Npb25FeHRlbmRlZCB8fCBpc1ZhbGlkR3JvdXBQZXJtaXNzaW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gY3JlYXRlIGFuIENMUCB3aXRoIGFuIGludmFsaWQgcGVybWlzc2lvbiB0eXBlLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNWYWxpZEdyb3VwUGVybWlzc2lvbikge1xuICAgICAgICAgICAgaWYgKCgwLCBfZXZlcnkuZGVmYXVsdCkodXNlcnMpLmNhbGwodXNlcnMsIHBvaW50ZXIgPT4gdHlwZW9mIHBvaW50ZXIgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dID0gdXNlcnM7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gY3JlYXRlIGFuIENMUCB3aXRoIGFuIGludmFsaWQgcGVybWlzc2lvbiB2YWx1ZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCB1c2VyIGluIHVzZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkID0gdXNlcnNbdXNlcl07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFsbG93ZWQgIT09ICdib29sZWFuJyAmJiAhaXNWYWxpZFBlcm1pc3Npb25FeHRlbmRlZCAmJiB1c2VyICE9PSAncG9pbnRlckZpZWxkcycpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gY3JlYXRlIGFuIENMUCB3aXRoIGFuIGludmFsaWQgcGVybWlzc2lvbiB2YWx1ZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcl0gPSBhbGxvd2VkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGFyc2VDTFAgY29uc3RydWN0ZWQgd2l0aCBhIGZ1bmN0aW9uLiBEaWQgeW91IGZvcmdldCAoKT8nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04tZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBDTFAuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMucGVybWlzc2lvbnNNYXBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIENMUCBpcyBlcXVhbCB0byBhbm90aGVyIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlIHRvXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBQYXJzZUNMUCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSAoMCwgX2tleXMuZGVmYXVsdCkodGhpcy5wZXJtaXNzaW9uc01hcCk7XG4gICAgY29uc3Qgb3RoZXJQZXJtaXNzaW9ucyA9ICgwLCBfa2V5cy5kZWZhdWx0KShvdGhlci5wZXJtaXNzaW9uc01hcCk7XG4gICAgaWYgKHBlcm1pc3Npb25zLmxlbmd0aCAhPT0gb3RoZXJQZXJtaXNzaW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIGluIHRoaXMucGVybWlzc2lvbnNNYXApIHtcbiAgICAgIGlmICghb3RoZXIucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlcnMgPSAoMCwgX2tleXMuZGVmYXVsdCkodGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXSk7XG4gICAgICBjb25zdCBvdGhlclVzZXJzID0gKDAsIF9rZXlzLmRlZmF1bHQpKG90aGVyLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dKTtcbiAgICAgIGlmICh1c2Vycy5sZW5ndGggIT09IG90aGVyVXNlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdXNlciBpbiB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dKSB7XG4gICAgICAgIGlmICghb3RoZXIucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcl0pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcl0gIT09IG90aGVyLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJdKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIF9nZXRSb2xlTmFtZShyb2xlKSB7XG4gICAgbGV0IG5hbWUgPSByb2xlO1xuICAgIGlmIChyb2xlIGluc3RhbmNlb2YgX1BhcnNlUm9sZS5kZWZhdWx0KSB7XG4gICAgICAvLyBOb3JtYWxpemUgdG8gdGhlIFN0cmluZyBuYW1lXG4gICAgICBuYW1lID0gcm9sZS5nZXROYW1lKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JvbGUgbXVzdCBiZSBhIFBhcnNlLlJvbGUgb3IgYSBTdHJpbmcnKTtcbiAgICB9XG4gICAgcmV0dXJuIGByb2xlOiR7bmFtZX1gO1xuICB9XG4gIF9wYXJzZUVudGl0eShlbnRpdHkpIHtcbiAgICBsZXQgdXNlcklkID0gZW50aXR5O1xuICAgIGlmICh1c2VySWQgaW5zdGFuY2VvZiBfUGFyc2VVc2VyLmRlZmF1bHQpIHtcbiAgICAgIHVzZXJJZCA9IHVzZXJJZC5pZDtcbiAgICAgIGlmICghdXNlcklkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBhY2Nlc3MgZm9yIGEgUGFyc2UuVXNlciB3aXRob3V0IGFuIGlkLicpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodXNlcklkIGluc3RhbmNlb2YgX1BhcnNlUm9sZS5kZWZhdWx0KSB7XG4gICAgICB1c2VySWQgPSB0aGlzLl9nZXRSb2xlTmFtZSh1c2VySWQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHVzZXJJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VzZXJJZCBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlcklkO1xuICB9XG4gIF9zZXRBY2Nlc3MocGVybWlzc2lvbiwgdXNlcklkLCBhbGxvd2VkKSB7XG4gICAgdXNlcklkID0gdGhpcy5fcGFyc2VFbnRpdHkodXNlcklkKTtcbiAgICBpZiAodHlwZW9mIGFsbG93ZWQgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYWxsb3dlZCBtdXN0IGJlIGVpdGhlciB0cnVlIG9yIGZhbHNlLicpO1xuICAgIH1cbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXTtcbiAgICBpZiAoIXBlcm1pc3Npb25zKSB7XG4gICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgLy8gVGhlIHVzZXIgYWxyZWFkeSBkb2Vzbid0IGhhdmUgdGhpcyBwZXJtaXNzaW9uLCBzbyBubyBhY3Rpb24gaXMgbmVlZGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXSA9IHt9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsb3dlZCkge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXTtcbiAgICB9XG4gIH1cbiAgX2dldEFjY2VzcyhwZXJtaXNzaW9uLCB1c2VySWQpIHtcbiAgICBsZXQgcmV0dXJuQm9vbGVhbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgICB1c2VySWQgPSB0aGlzLl9wYXJzZUVudGl0eSh1c2VySWQpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdO1xuICAgIGlmIChyZXR1cm5Cb29sZWFuKSB7XG4gICAgICBpZiAoIXBlcm1pc3Npb25zKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIXRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG4gIF9zZXRBcnJheUFjY2VzcyhwZXJtaXNzaW9uLCB1c2VySWQsIGZpZWxkcykge1xuICAgIHVzZXJJZCA9IHRoaXMuX3BhcnNlRW50aXR5KHVzZXJJZCk7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF07XG4gICAgaWYgKCFwZXJtaXNzaW9ucykge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdID0gW107XG4gICAgfVxuICAgIGlmICghZmllbGRzIHx8ICgwLCBfaXNBcnJheS5kZWZhdWx0KShmaWVsZHMpICYmIGZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF07XG4gICAgfSBlbHNlIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoZmllbGRzKSAmJiAoMCwgX2V2ZXJ5LmRlZmF1bHQpKGZpZWxkcykuY2FsbChmaWVsZHMsIGZpZWxkID0+IHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF0gPSBmaWVsZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpZWxkcyBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3Mgb3IgdW5kZWZpbmVkLicpO1xuICAgIH1cbiAgfVxuICBfc2V0R3JvdXBQb2ludGVyUGVybWlzc2lvbihvcGVyYXRpb24sIHBvaW50ZXJGaWVsZHMpIHtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl07XG4gICAgaWYgKCFmaWVsZHMpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXBvaW50ZXJGaWVsZHMgfHwgKDAsIF9pc0FycmF5LmRlZmF1bHQpKHBvaW50ZXJGaWVsZHMpICYmIHBvaW50ZXJGaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgdGhpcy5wZXJtaXNzaW9uc01hcFtvcGVyYXRpb25dO1xuICAgIH0gZWxzZSBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHBvaW50ZXJGaWVsZHMpICYmICgwLCBfZXZlcnkuZGVmYXVsdCkocG9pbnRlckZpZWxkcykuY2FsbChwb2ludGVyRmllbGRzLCBmaWVsZCA9PiB0eXBlb2YgZmllbGQgPT09ICdzdHJpbmcnKSkge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtvcGVyYXRpb25dID0gcG9pbnRlckZpZWxkcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtvcGVyYXRpb259LnBvaW50ZXJGaWVsZHMgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIG9yIHVuZGVmaW5lZC5gKTtcbiAgICB9XG4gIH1cbiAgX2dldEdyb3VwUG9pbnRlclBlcm1pc3Npb25zKG9wZXJhdGlvbikge1xuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl0gfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1c2VyIHBvaW50ZXIgZmllbGRzIHRvIGFsbG93IHBlcm1pc3Npb24gZm9yIGdldC9jb3VudC9maW5kIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBvaW50ZXJGaWVsZHMgVXNlciBwb2ludGVyIGZpZWxkc1xuICAgKi9cbiAgc2V0UmVhZFVzZXJGaWVsZHMocG9pbnRlckZpZWxkcykge1xuICAgIHRoaXMuX3NldEdyb3VwUG9pbnRlclBlcm1pc3Npb24oJ3JlYWRVc2VyRmllbGRzJywgcG9pbnRlckZpZWxkcyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBVc2VyIHBvaW50ZXIgZmllbGRzXG4gICAqL1xuICBnZXRSZWFkVXNlckZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0R3JvdXBQb2ludGVyUGVybWlzc2lvbnMoJ3JlYWRVc2VyRmllbGRzJykgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1c2VyIHBvaW50ZXIgZmllbGRzIHRvIGFsbG93IHBlcm1pc3Npb24gZm9yIGNyZWF0ZS9kZWxldGUvdXBkYXRlL2FkZEZpZWxkIG9wZXJhdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcG9pbnRlckZpZWxkcyBVc2VyIHBvaW50ZXIgZmllbGRzXG4gICAqL1xuICBzZXRXcml0ZVVzZXJGaWVsZHMocG9pbnRlckZpZWxkcykge1xuICAgIHRoaXMuX3NldEdyb3VwUG9pbnRlclBlcm1pc3Npb24oJ3dyaXRlVXNlckZpZWxkcycsIHBvaW50ZXJGaWVsZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVXNlciBwb2ludGVyIGZpZWxkc1xuICAgKi9cbiAgZ2V0V3JpdGVVc2VyRmllbGRzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRHcm91cFBvaW50ZXJQZXJtaXNzaW9ucygnd3JpdGVVc2VyRmllbGRzJykgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlzIGFsbG93ZWQgdG8gcmV0cmlldmUgZmllbGRzIGZyb20gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gZmllbGRzIGZpZWxkcyB0byBiZSBwcm90ZWN0ZWRcbiAgICovXG4gIHNldFByb3RlY3RlZEZpZWxkcyh1c2VySWQsIGZpZWxkcykge1xuICAgIHRoaXMuX3NldEFycmF5QWNjZXNzKCdwcm90ZWN0ZWRGaWVsZHMnLCB1c2VySWQsIGZpZWxkcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhcnJheSBvZiBmaWVsZHMgYXJlIGFjY2Vzc2FibGUgdG8gdGhpcyB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGdldFByb3RlY3RlZEZpZWxkcyh1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKCdwcm90ZWN0ZWRGaWVsZHMnLCB1c2VySWQsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaXMgYWxsb3dlZCB0byByZWFkIGZyb20gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIHdoZXRoZXIgdGhhdCB1c2VyIHNob3VsZCBoYXZlIHJlYWQgYWNjZXNzLlxuICAgKi9cbiAgc2V0UmVhZEFjY2Vzcyh1c2VySWQsIGFsbG93ZWQpIHtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ2ZpbmQnLCB1c2VySWQsIGFsbG93ZWQpO1xuICAgIHRoaXMuX3NldEFjY2VzcygnZ2V0JywgdXNlcklkLCBhbGxvd2VkKTtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ2NvdW50JywgdXNlcklkLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpZCBpcyAqZXhwbGljaXRseSogYWxsb3dlZCB0byByZWFkIGZyb20gdGhpcyBjbGFzcy5cbiAgICogRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB1c2VyIG1heSBzdGlsbCBiZSBhYmxlIHRvIGFjY2VzcyBpdCBpZlxuICAgKiBnZXRQdWJsaWNSZWFkQWNjZXNzIHJldHVybnMgdHJ1ZSBvciBhIHJvbGUgdGhhdCB0aGUgdXNlciBiZWxvbmdzIHRvIGhhc1xuICAgKiB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRSZWFkQWNjZXNzKHVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3MoJ2ZpbmQnLCB1c2VySWQpICYmIHRoaXMuX2dldEFjY2VzcygnZ2V0JywgdXNlcklkKSAmJiB0aGlzLl9nZXRBY2Nlc3MoJ2NvdW50JywgdXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaWQgaXMgYWxsb3dlZCB0byB3cml0ZSB0byB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGF0IHVzZXIgc2hvdWxkIGhhdmUgd3JpdGUgYWNjZXNzLlxuICAgKi9cbiAgc2V0V3JpdGVBY2Nlc3ModXNlcklkLCBhbGxvd2VkKSB7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCdjcmVhdGUnLCB1c2VySWQsIGFsbG93ZWQpO1xuICAgIHRoaXMuX3NldEFjY2VzcygndXBkYXRlJywgdXNlcklkLCBhbGxvd2VkKTtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ2RlbGV0ZScsIHVzZXJJZCwgYWxsb3dlZCk7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCdhZGRGaWVsZCcsIHVzZXJJZCwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlkIGlzICpleHBsaWNpdGx5KiBhbGxvd2VkIHRvIHdyaXRlIHRvIHRoaXMgY2xhc3MuXG4gICAqIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgdXNlciBtYXkgc3RpbGwgYmUgYWJsZSB0byB3cml0ZSBpdCBpZlxuICAgKiBnZXRQdWJsaWNXcml0ZUFjY2VzcyByZXR1cm5zIHRydWUgb3IgYSByb2xlIHRoYXQgdGhlIHVzZXIgYmVsb25ncyB0byBoYXNcbiAgICogd3JpdGUgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0V3JpdGVBY2Nlc3ModXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcygnY3JlYXRlJywgdXNlcklkKSAmJiB0aGlzLl9nZXRBY2Nlc3MoJ3VwZGF0ZScsIHVzZXJJZCkgJiYgdGhpcy5fZ2V0QWNjZXNzKCdkZWxldGUnLCB1c2VySWQpICYmIHRoaXMuX2dldEFjY2VzcygnYWRkRmllbGQnLCB1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gcmVhZCBmcm9tIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZFxuICAgKi9cbiAgc2V0UHVibGljUmVhZEFjY2VzcyhhbGxvd2VkKSB7XG4gICAgdGhpcy5zZXRSZWFkQWNjZXNzKFBVQkxJQ19LRVksIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gcmVhZCBmcm9tIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0UHVibGljUmVhZEFjY2VzcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZWFkQWNjZXNzKFBVQkxJQ19LRVkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gd3JpdGUgdG8gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkXG4gICAqL1xuICBzZXRQdWJsaWNXcml0ZUFjY2VzcyhhbGxvd2VkKSB7XG4gICAgdGhpcy5zZXRXcml0ZUFjY2VzcyhQVUJMSUNfS0VZLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHdyaXRlIHRvIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0UHVibGljV3JpdGVBY2Nlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V3JpdGVBY2Nlc3MoUFVCTElDX0tFWSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byBwcm90ZWN0IGZpZWxkcyBpbiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBmaWVsZHNcbiAgICovXG4gIHNldFB1YmxpY1Byb3RlY3RlZEZpZWxkcyhmaWVsZHMpIHtcbiAgICB0aGlzLnNldFByb3RlY3RlZEZpZWxkcyhQVUJMSUNfS0VZLCBmaWVsZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gcmVhZCBmaWVsZHMgZnJvbSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBnZXRQdWJsaWNQcm90ZWN0ZWRGaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvdGVjdGVkRmllbGRzKFBVQkxJQ19LRVkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gcmVhZCBmcm9tIHRoaXMgY2xhc3MuIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgcm9sZSBtYXlcbiAgICogc3RpbGwgYmUgYWJsZSB0byB3cml0ZSBpdCBpZiBhIHBhcmVudCByb2xlIGhhcyByZWFkIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSByb2xlIGhhcyByZWFkIGFjY2Vzcy4gZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgZ2V0Um9sZVJlYWRBY2Nlc3Mocm9sZSkge1xuICAgIHJldHVybiB0aGlzLmdldFJlYWRBY2Nlc3ModGhpcy5fZ2V0Um9sZU5hbWUocm9sZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gd3JpdGUgdG8gdGhpcyB1c2VyLiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvbGUgbWF5XG4gICAqIHN0aWxsIGJlIGFibGUgdG8gd3JpdGUgaXQgaWYgYSBwYXJlbnQgcm9sZSBoYXMgd3JpdGUgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHJvbGUgaGFzIHdyaXRlIGFjY2Vzcy4gZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgZ2V0Um9sZVdyaXRlQWNjZXNzKHJvbGUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRXcml0ZUFjY2Vzcyh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byByZWFkIGZyb20gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCBXaGV0aGVyIHRoZSBnaXZlbiByb2xlIGNhbiByZWFkIHRoaXMgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgc2V0Um9sZVJlYWRBY2Nlc3Mocm9sZSwgYWxsb3dlZCkge1xuICAgIHRoaXMuc2V0UmVhZEFjY2Vzcyh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byB3cml0ZSB0byB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhlIGdpdmVuIHJvbGUgY2FuIHdyaXRlIHRoaXMgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgc2V0Um9sZVdyaXRlQWNjZXNzKHJvbGUsIGFsbG93ZWQpIHtcbiAgICB0aGlzLnNldFdyaXRlQWNjZXNzKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIGNvdW50IHRvIHRoaXMgdXNlci4gRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSByb2xlIG1heVxuICAgKiBzdGlsbCBiZSBhYmxlIHRvIGNvdW50IGl0IGlmIGEgcGFyZW50IHJvbGUgaGFzIGNvdW50IGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIGdldFJvbGVQcm90ZWN0ZWRGaWVsZHMocm9sZSkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3RlY3RlZEZpZWxkcyh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byBzZXQgYWNjZXNzIGZpZWxkIGluIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBmaWVsZHMgRmllbGRzIHRvIGJlIHByb3RlY3RlZCBieSBSb2xlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgc2V0Um9sZVByb3RlY3RlZEZpZWxkcyhyb2xlLCBmaWVsZHMpIHtcbiAgICB0aGlzLnNldFByb3RlY3RlZEZpZWxkcyh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSwgZmllbGRzKTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VDTFA7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX2VuY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfZXNjYXBlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lc2NhcGVcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfU3RvcmFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZVwiKSk7XG4vKipcbiAqIFBhcnNlLkNvbmZpZyBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGNvbmZpZ3VyYXRpb24gZGF0YSB0aGF0XG4gKiBjYW4gYmUgc2V0IGZyb20gdGhlIFBhcnNlIGRhc2hib2FyZC5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuQ29uZmlnXG4gKi9cbmNsYXNzIFBhcnNlQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJhdHRyaWJ1dGVzXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfZXNjYXBlZEF0dHJpYnV0ZXNcIiwgdm9pZCAwKTtcbiAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICB0aGlzLl9lc2NhcGVkQXR0cmlidXRlcyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGdldChhdHRyKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlc1thdHRyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBIVE1MLWVzY2FwZWQgdmFsdWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlc2NhcGUoYXR0cikge1xuICAgIGNvbnN0IGh0bWwgPSB0aGlzLl9lc2NhcGVkQXR0cmlidXRlc1thdHRyXTtcbiAgICBpZiAoaHRtbCkge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICAgIGNvbnN0IHZhbCA9IHRoaXMuYXR0cmlidXRlc1thdHRyXTtcbiAgICBsZXQgZXNjYXBlZCA9ICcnO1xuICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgZXNjYXBlZCA9ICgwLCBfZXNjYXBlLmRlZmF1bHQpKHZhbC50b1N0cmluZygpKTtcbiAgICB9XG4gICAgdGhpcy5fZXNjYXBlZEF0dHJpYnV0ZXNbYXR0cl0gPSBlc2NhcGVkO1xuICAgIHJldHVybiBlc2NhcGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgbW9zdCByZWNlbnRseS1mZXRjaGVkIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBlaXRoZXIgZnJvbVxuICAgKiBtZW1vcnkgb3IgZnJvbSBsb2NhbCBzdG9yYWdlIGlmIG5lY2Vzc2FyeS5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuQ29uZmlnfSBUaGUgbW9zdCByZWNlbnRseS1mZXRjaGVkIFBhcnNlLkNvbmZpZyBpZiBpdFxuICAgKiAgICAgZXhpc3RzLCBlbHNlIGFuIGVtcHR5IFBhcnNlLkNvbmZpZy5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDb25maWdDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuY3VycmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBuZXcgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhIG5ld2x5LWNyZWF0ZWRcbiAgICogICAgIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdoZW4gdGhlIGdldCBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgZ2V0KCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q29uZmlnQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmdldChvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHZhbHVlIGtleXMgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cnMgVGhlIGNvbmZpZyBwYXJhbWV0ZXJzIGFuZCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtYXN0ZXJLZXlPbmx5RmxhZ3MgVGhlIGZsYWdzIHRoYXQgZGVmaW5lIHdoZXRoZXIgY29uZmlnIHBhcmFtZXRlcnMgbGlzdGVkXG4gICAqIGluIGBhdHRyc2Agc2hvdWxkIGJlIHJldHJpZXZhYmxlIG9ubHkgYnkgdXNpbmcgdGhlIG1hc3RlciBrZXkuXG4gICAqIEZvciBleGFtcGxlOiBgcGFyYW0xOiB0cnVlYCBtYWtlcyBgcGFyYW0xYCBvbmx5IHJldHJpZXZhYmxlIGJ5IHVzaW5nIHRoZSBtYXN0ZXIga2V5LlxuICAgKiBJZiBhIHBhcmFtZXRlciBpcyBub3QgcHJvdmlkZWQgb3Igc2V0IHRvIGBmYWxzZWAsIGl0IGNhbiBiZSByZXRyaWV2ZWQgd2l0aG91dFxuICAgKiB1c2luZyB0aGUgbWFzdGVyIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYSBuZXdseS1jcmVhdGVkXG4gICAqICAgICBjb25maWd1cmF0aW9uIG9iamVjdCBvciB3aXRoIHRoZSBjdXJyZW50IHdpdGggdGhlIHVwZGF0ZS5cbiAgICovXG4gIHN0YXRpYyBzYXZlKGF0dHJzLCBtYXN0ZXJLZXlPbmx5RmxhZ3MpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q29uZmlnQ29udHJvbGxlcigpO1xuICAgIC8vVG8gYXZvaWQgYSBtaXNtYXRjaCB3aXRoIHRoZSBsb2NhbCBhbmQgdGhlIGNsb3VkIGNvbmZpZyB3ZSBnZXQgYSBuZXcgdmVyc2lvblxuICAgIHJldHVybiBjb250cm9sbGVyLnNhdmUoYXR0cnMsIG1hc3RlcktleU9ubHlGbGFncykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5nZXQoe1xuICAgICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICAgIH0pO1xuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBmb3IgdGVzdGluZ1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIF9jbGVhckNhY2hlKCkge1xuICAgIGN1cnJlbnRDb25maWcgPSBudWxsO1xuICB9XG59XG5sZXQgY3VycmVudENvbmZpZyA9IG51bGw7XG5jb25zdCBDVVJSRU5UX0NPTkZJR19LRVkgPSAnY3VycmVudENvbmZpZyc7XG5mdW5jdGlvbiBkZWNvZGVQYXlsb2FkKGRhdGEpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICBpZiAoanNvbiAmJiB0eXBlb2YganNvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiAoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIGN1cnJlbnQoKSB7XG4gICAgaWYgKGN1cnJlbnRDb25maWcpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Q29uZmlnO1xuICAgIH1cbiAgICBjb25zdCBjb25maWcgPSBuZXcgUGFyc2VDb25maWcoKTtcbiAgICBjb25zdCBzdG9yYWdlUGF0aCA9IF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfQ09ORklHX0tFWSk7XG4gICAgaWYgKCFfU3RvcmFnZS5kZWZhdWx0LmFzeW5jKCkpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ0RhdGEgPSBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW0oc3RvcmFnZVBhdGgpO1xuICAgICAgaWYgKGNvbmZpZ0RhdGEpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGRlY29kZVBheWxvYWQoY29uZmlnRGF0YSk7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgY29uZmlnLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgICAgICAgIGN1cnJlbnRDb25maWcgPSBjb25maWc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIC8vIFJldHVybiBhIHByb21pc2UgZm9yIGFzeW5jIHN0b3JhZ2UgY29udHJvbGxlcnNcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMoc3RvcmFnZVBhdGgpLnRoZW4oY29uZmlnRGF0YSA9PiB7XG4gICAgICBpZiAoY29uZmlnRGF0YSkge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGVjb2RlUGF5bG9hZChjb25maWdEYXRhKTtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBjb25maWcuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgICAgY3VycmVudENvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9KTtcbiAgfSxcbiAgZ2V0KCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICdjb25maWcnLCB7fSwgb3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5wYXJhbXMpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfSlNPTiwgJ0NvbmZpZyBKU09OIHJlc3BvbnNlIGludmFsaWQuJyk7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgICBjb25zdCBjb25maWcgPSBuZXcgUGFyc2VDb25maWcoKTtcbiAgICAgIGNvbmZpZy5hdHRyaWJ1dGVzID0ge307XG4gICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gcmVzcG9uc2UucGFyYW1zKSB7XG4gICAgICAgIGNvbmZpZy5hdHRyaWJ1dGVzW2F0dHJdID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkocmVzcG9uc2UucGFyYW1zW2F0dHJdKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRDb25maWcgPSBjb25maWc7XG4gICAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMoX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9DT05GSUdfS0VZKSwgKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkocmVzcG9uc2UucGFyYW1zKSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgc2F2ZShhdHRycywgbWFzdGVyS2V5T25seUZsYWdzKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IGVuY29kZWRBdHRycyA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgICBlbmNvZGVkQXR0cnNba2V5XSA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKGF0dHJzW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUFVUJywgJ2NvbmZpZycsIHtcbiAgICAgIHBhcmFtczogZW5jb2RlZEF0dHJzLFxuICAgICAgbWFzdGVyS2V5T25seTogbWFzdGVyS2V5T25seUZsYWdzXG4gICAgfSwge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UucmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlRFUk5BTF9TRVJWRVJfRVJST1IsICdFcnJvciBvY2N1cmVkIHVwZGF0aW5nIENvbmZpZy4nKTtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldENvbmZpZ0NvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VDb25maWc7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5MiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG4vKipcbiAqIENvbnN0cnVjdHMgYSBuZXcgUGFyc2UuRXJyb3Igb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNvZGUgYW5kIG1lc3NhZ2UuXG4gKlxuICogUGFyc2UuQ29yZU1hbmFnZXIuc2V0KCdQQVJTRV9FUlJPUlMnLCBbeyBjb2RlLCBtZXNzYWdlIH1dKSBjYW4gYmUgdXNlIHRvIG92ZXJyaWRlIGVycm9yIG1lc3NhZ2VzLlxuICpcbiAqIEBhbGlhcyBQYXJzZS5FcnJvclxuICovXG5jbGFzcyBQYXJzZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGUgQW4gZXJyb3IgY29kZSBjb25zdGFudCBmcm9tIDxjb2RlPlBhcnNlLkVycm9yPC9jb2RlPi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgQSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb2RlLCBtZXNzYWdlKSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKHRoaXMsIFwiY29kZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKHRoaXMsIFwibWVzc2FnZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKHRoaXMsIFwib2JqZWN0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkodGhpcywgXCJlcnJvcnNcIiwgdm9pZCAwKTtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIGxldCBjdXN0b21NZXNzYWdlID0gbWVzc2FnZTtcbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1BBUlNFX0VSUk9SUycpKS5jYWxsKF9jb250ZXh0LCBlcnJvciA9PiB7XG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gY29kZSAmJiBlcnJvci5jb2RlKSB7XG4gICAgICAgIGN1c3RvbU1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgfVxuICAgIH0pO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsICdtZXNzYWdlJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBjdXN0b21NZXNzYWdlXG4gICAgfSk7XG4gIH1cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICdQYXJzZUVycm9yOiAnICsgdGhpcy5jb2RlICsgJyAnICsgdGhpcy5tZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBzb21lIGVycm9yIG90aGVyIHRoYW4gdGhvc2UgZW51bWVyYXRlZCBoZXJlLlxuICAgKlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gT1RIRVJfQ0FVU0VcbiAgICogQHN0YXRpY1xuICAgKi9cbn1cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiT1RIRVJfQ0FVU0VcIiwgLTEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBzb21ldGhpbmcgaGFzIGdvbmUgd3Jvbmcgd2l0aCB0aGUgc2VydmVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlRFUk5BTF9TRVJWRVJfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlRFUk5BTF9TRVJWRVJfRVJST1JcIiwgMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGUgY29ubmVjdGlvbiB0byB0aGUgUGFyc2Ugc2VydmVycyBmYWlsZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IENPTk5FQ1RJT05fRkFJTEVEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiQ09OTkVDVElPTl9GQUlMRURcIiwgMTAwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGRvZXNuJ3QgZXhpc3QuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE9CSkVDVF9OT1RfRk9VTkRcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJPQkpFQ1RfTk9UX0ZPVU5EXCIsIDEwMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB5b3UgdHJpZWQgdG8gcXVlcnkgd2l0aCBhIGRhdGF0eXBlIHRoYXQgZG9lc24ndFxuICogc3VwcG9ydCBpdCwgbGlrZSBleGFjdCBtYXRjaGluZyBhbiBhcnJheSBvciBvYmplY3QuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfUVVFUllcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1FVRVJZXCIsIDEwMik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhIG1pc3Npbmcgb3IgaW52YWxpZCBjbGFzc25hbWUuIENsYXNzbmFtZXMgYXJlXG4gKiBjYXNlLXNlbnNpdGl2ZS4gVGhleSBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGFuZCBhLXpBLVowLTlfIGFyZSB0aGVcbiAqIG9ubHkgdmFsaWQgY2hhcmFjdGVycy5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9DTEFTU19OQU1FXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9DTEFTU19OQU1FXCIsIDEwMyk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiB1bnNwZWNpZmllZCBvYmplY3QgaWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE1JU1NJTkdfT0JKRUNUX0lEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTUlTU0lOR19PQkpFQ1RfSURcIiwgMTA0KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQga2V5IG5hbWUuIEtleXMgYXJlIGNhc2Utc2Vuc2l0aXZlLiBUaGV5XG4gKiBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGFuZCBhLXpBLVowLTlfIGFyZSB0aGUgb25seSB2YWxpZCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0tFWV9OQU1FXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9LRVlfTkFNRVwiLCAxMDUpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYSBtYWxmb3JtZWQgcG9pbnRlci4gWW91IHNob3VsZCBub3Qgc2VlIHRoaXMgdW5sZXNzXG4gKiB5b3UgaGF2ZSBiZWVuIG11Y2tpbmcgYWJvdXQgY2hhbmdpbmcgaW50ZXJuYWwgUGFyc2UgY29kZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9QT0lOVEVSXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9QT0lOVEVSXCIsIDEwNik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGJhZGx5IGZvcm1lZCBKU09OIHdhcyByZWNlaXZlZCB1cHN0cmVhbS4gVGhpc1xuICogZWl0aGVyIGluZGljYXRlcyB5b3UgaGF2ZSBkb25lIHNvbWV0aGluZyB1bnVzdWFsIHdpdGggbW9kaWZ5aW5nIGhvd1xuICogdGhpbmdzIGVuY29kZSB0byBKU09OLCBvciB0aGUgbmV0d29yayBpcyBmYWlsaW5nIGJhZGx5LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0pTT05cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0pTT05cIiwgMTA3KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGZlYXR1cmUgeW91IHRyaWVkIHRvIGFjY2VzcyBpcyBvbmx5XG4gKiBhdmFpbGFibGUgaW50ZXJuYWxseSBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gQ09NTUFORF9VTkFWQUlMQUJMRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkNPTU1BTkRfVU5BVkFJTEFCTEVcIiwgMTA4KTtcbi8qKlxuICogWW91IG11c3QgY2FsbCBQYXJzZS5pbml0aWFsaXplIGJlZm9yZSB1c2luZyB0aGUgUGFyc2UgbGlicmFyeS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTk9UX0lOSVRJQUxJWkVEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTk9UX0lOSVRJQUxJWkVEXCIsIDEwOSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgZmllbGQgd2FzIHNldCB0byBhbiBpbmNvbnNpc3RlbnQgdHlwZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5DT1JSRUNUX1RZUEVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTkNPUlJFQ1RfVFlQRVwiLCAxMTEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBjaGFubmVsIG5hbWUuIEEgY2hhbm5lbCBuYW1lIGlzIGVpdGhlclxuICogYW4gZW1wdHkgc3RyaW5nICh0aGUgYnJvYWRjYXN0IGNoYW5uZWwpIG9yIGNvbnRhaW5zIG9ubHkgYS16QS1aMC05X1xuICogY2hhcmFjdGVycyBhbmQgc3RhcnRzIHdpdGggYSBsZXR0ZXIuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfQ0hBTk5FTF9OQU1FXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9DSEFOTkVMX05BTUVcIiwgMTEyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgcHVzaCBpcyBtaXNjb25maWd1cmVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBQVVNIX01JU0NPTkZJR1VSRURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJQVVNIX01JU0NPTkZJR1VSRURcIiwgMTE1KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIG9iamVjdCBpcyB0b28gbGFyZ2UuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE9CSkVDVF9UT09fTEFSR0VcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJPQkpFQ1RfVE9PX0xBUkdFXCIsIDExNik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBvcGVyYXRpb24gaXNuJ3QgYWxsb3dlZCBmb3IgY2xpZW50cy5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gT1BFUkFUSU9OX0ZPUkJJRERFTlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk9QRVJBVElPTl9GT1JCSURERU5cIiwgMTE5KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSByZXN1bHQgd2FzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IENBQ0hFX01JU1NcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJDQUNIRV9NSVNTXCIsIDEyMCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGFuIGludmFsaWQga2V5IHdhcyB1c2VkIGluIGEgbmVzdGVkXG4gKiBKU09OT2JqZWN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX05FU1RFRF9LRVlcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX05FU1RFRF9LRVlcIiwgMTIxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYW4gaW52YWxpZCBmaWxlbmFtZSB3YXMgdXNlZCBmb3IgUGFyc2VGaWxlLlxuICogQSB2YWxpZCBmaWxlIG5hbWUgY29udGFpbnMgb25seSBhLXpBLVowLTlfLiBjaGFyYWN0ZXJzIGFuZCBpcyBiZXR3ZWVuIDFcbiAqIGFuZCAxMjggY2hhcmFjdGVycy5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9GSUxFX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0ZJTEVfTkFNRVwiLCAxMjIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBBQ0wgd2FzIHByb3ZpZGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0FDTFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfQUNMXCIsIDEyMyk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0IHRpbWVkIG91dCBvbiB0aGUgc2VydmVyLiBUeXBpY2FsbHlcbiAqIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3QgaXMgdG9vIGV4cGVuc2l2ZSB0byBydW4uXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFRJTUVPVVRcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJUSU1FT1VUXCIsIDEyNCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBlbWFpbCBhZGRyZXNzIHdhcyBpbnZhbGlkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0VNQUlMX0FERFJFU1NcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0VNQUlMX0FERFJFU1NcIiwgMTI1KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgbWlzc2luZyBjb250ZW50IHR5cGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE1JU1NJTkdfQ09OVEVOVF9UWVBFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTUlTU0lOR19DT05URU5UX1RZUEVcIiwgMTI2KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgbWlzc2luZyBjb250ZW50IGxlbmd0aC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTUlTU0lOR19DT05URU5UX0xFTkdUSFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk1JU1NJTkdfQ09OVEVOVF9MRU5HVEhcIiwgMTI3KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQgY29udGVudCBsZW5ndGguXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfQ09OVEVOVF9MRU5HVEhcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0NPTlRFTlRfTEVOR1RIXCIsIDEyOCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhIGZpbGUgdGhhdCB3YXMgdG9vIGxhcmdlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGSUxFX1RPT19MQVJHRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkZJTEVfVE9PX0xBUkdFXCIsIDEyOSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBlcnJvciBzYXZpbmcgYSBmaWxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGSUxFX1NBVkVfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJGSUxFX1NBVkVfRVJST1JcIiwgMTMwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB1bmlxdWUgZmllbGQgd2FzIGdpdmVuIGEgdmFsdWUgdGhhdCBpc1xuICogYWxyZWFkeSB0YWtlbi5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRFVQTElDQVRFX1ZBTFVFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRFVQTElDQVRFX1ZBTFVFXCIsIDEzNyk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgcm9sZSdzIG5hbWUgaXMgaW52YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9ST0xFX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1JPTEVfTkFNRVwiLCAxMzkpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhbiBhcHBsaWNhdGlvbiBxdW90YSB3YXMgZXhjZWVkZWQuICBVcGdyYWRlIHRvXG4gKiByZXNvbHZlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBFWENFRURFRF9RVU9UQVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkVYQ0VFREVEX1FVT1RBXCIsIDE0MCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgQ2xvdWQgQ29kZSBzY3JpcHQgZmFpbGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBTQ1JJUFRfRkFJTEVEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiU0NSSVBUX0ZBSUxFRFwiLCAxNDEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIENsb3VkIENvZGUgdmFsaWRhdGlvbiBmYWlsZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFZBTElEQVRJT05fRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJWQUxJREFUSU9OX0VSUk9SXCIsIDE0Mik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGludmFsaWQgaW1hZ2UgZGF0YSB3YXMgcHJvdmlkZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfSU1BR0VfREFUQVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfSU1BR0VfREFUQVwiLCAxNDMpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gdW5zYXZlZCBmaWxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBVTlNBVkVEX0ZJTEVfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJVTlNBVkVEX0ZJTEVfRVJST1JcIiwgMTUxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQgcHVzaCB0aW1lLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX1BVU0hfVElNRV9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfUFVTSF9USU1FX0VSUk9SXCIsIDE1Mik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBlcnJvciBkZWxldGluZyBhIGZpbGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZJTEVfREVMRVRFX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRklMRV9ERUxFVEVfRVJST1JcIiwgMTUzKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGVycm9yIGRlbGV0aW5nIGFuIHVubmFtZWQgZmlsZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRklMRV9ERUxFVEVfVU5OQU1FRF9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkZJTEVfREVMRVRFX1VOTkFNRURfRVJST1JcIiwgMTYxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGhhcyBleGNlZWRlZCBpdHMgcmVxdWVzdFxuICogbGltaXQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFJFUVVFU1RfTElNSVRfRVhDRUVERURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJSRVFVRVNUX0xJTUlUX0VYQ0VFREVEXCIsIDE1NSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0IHdhcyBhIGR1cGxpY2F0ZSBhbmQgaGFzIGJlZW4gZGlzY2FyZGVkIGR1ZSB0b1xuICogaWRlbXBvdGVuY3kgcnVsZXMuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IERVUExJQ0FURV9SRVFVRVNUXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRFVQTElDQVRFX1JFUVVFU1RcIiwgMTU5KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9FVkVOVF9OQU1FXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9FVkVOVF9OQU1FXCIsIDE2MCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgZmllbGQgaGFkIGFuIGludmFsaWQgdmFsdWUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfVkFMVUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1ZBTFVFXCIsIDE2Mik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VybmFtZSBpcyBtaXNzaW5nIG9yIGVtcHR5LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBVU0VSTkFNRV9NSVNTSU5HXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiVVNFUk5BTUVfTUlTU0lOR1wiLCAyMDApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgcGFzc3dvcmQgaXMgbWlzc2luZyBvciBlbXB0eS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gUEFTU1dPUkRfTUlTU0lOR1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlBBU1NXT1JEX01JU1NJTkdcIiwgMjAxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXJuYW1lIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4uXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFVTRVJOQU1FX1RBS0VOXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiVVNFUk5BTUVfVEFLRU5cIiwgMjAyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGVtYWlsIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4uXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEVNQUlMX1RBS0VOXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRU1BSUxfVEFLRU5cIiwgMjAzKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGVtYWlsIGlzIG1pc3NpbmcsIGJ1dCBtdXN0IGJlIHNwZWNpZmllZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRU1BSUxfTUlTU0lOR1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkVNQUlMX01JU1NJTkdcIiwgMjA0KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB1c2VyIHdpdGggdGhlIHNwZWNpZmllZCBlbWFpbCB3YXMgbm90IGZvdW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBFTUFJTF9OT1RfRk9VTkRcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJFTUFJTF9OT1RfRk9VTkRcIiwgMjA1KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB1c2VyIG9iamVjdCB3aXRob3V0IGEgdmFsaWQgc2Vzc2lvbiBjb3VsZFxuICogbm90IGJlIGFsdGVyZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNFU1NJT05fTUlTU0lOR1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlNFU1NJT05fTUlTU0lOR1wiLCAyMDYpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHVzZXIgY2FuIG9ubHkgYmUgY3JlYXRlZCB0aHJvdWdoIHNpZ251cC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTVVTVF9DUkVBVEVfVVNFUl9USFJPVUdIX1NJR05VUFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk1VU1RfQ1JFQVRFX1VTRVJfVEhST1VHSF9TSUdOVVBcIiwgMjA3KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYW4gYW4gYWNjb3VudCBiZWluZyBsaW5rZWQgaXMgYWxyZWFkeSBsaW5rZWRcbiAqIHRvIGFub3RoZXIgdXNlci5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gQUNDT1VOVF9BTFJFQURZX0xJTktFRFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkFDQ09VTlRfQUxSRUFEWV9MSU5LRURcIiwgMjA4KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGN1cnJlbnQgc2Vzc2lvbiB0b2tlbiBpcyBpbnZhbGlkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX1NFU1NJT05fVE9LRU5cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1NFU1NJT05fVE9LRU5cIiwgMjA5KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGVycm9yIGVuYWJsaW5nIG9yIHZlcmlmeWluZyBNRkFcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTUZBX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTUZBX0VSUk9SXCIsIDIxMCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgdmFsaWQgTUZBIHRva2VuIG11c3QgYmUgcHJvdmlkZWRcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTUZBX1RPS0VOX1JFUVVJUkVEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTUZBX1RPS0VOX1JFUVVJUkVEXCIsIDIxMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgdXNlciBjYW5ub3QgYmUgbGlua2VkIHRvIGFuIGFjY291bnQgYmVjYXVzZVxuICogdGhhdCBhY2NvdW50J3MgaWQgY291bGQgbm90IGJlIGZvdW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBMSU5LRURfSURfTUlTU0lOR1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkxJTktFRF9JRF9NSVNTSU5HXCIsIDI1MCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgdXNlciB3aXRoIGEgbGlua2VkIChlLmcuIEZhY2Vib29rKSBhY2NvdW50XG4gKiBoYXMgYW4gaW52YWxpZCBzZXNzaW9uLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0xJTktFRF9TRVNTSU9OXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9MSU5LRURfU0VTU0lPTlwiLCAyNTEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZpY2UgYmVpbmcgbGlua2VkIChlLmcuIEZhY2Vib29rIG9yXG4gKiBUd2l0dGVyKSBpcyB1bnN1cHBvcnRlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gVU5TVVBQT1JURURfU0VSVklDRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlVOU1VQUE9SVEVEX1NFUlZJQ0VcIiwgMjUyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQgb3BlcmF0aW9uIG9jY3VyZWQgb24gc2NoZW1hXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfU0NIRU1BX09QRVJBVElPTlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfU0NIRU1BX09QRVJBVElPTlwiLCAyNTUpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGVyZSB3ZXJlIG11bHRpcGxlIGVycm9ycy4gQWdncmVnYXRlIGVycm9yc1xuICogaGF2ZSBhbiBcImVycm9yc1wiIHByb3BlcnR5LCB3aGljaCBpcyBhbiBhcnJheSBvZiBlcnJvciBvYmplY3RzIHdpdGggbW9yZVxuICogZGV0YWlsIGFib3V0IGVhY2ggZXJyb3IgdGhhdCBvY2N1cnJlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gQUdHUkVHQVRFX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiQUdHUkVHQVRFX0VSUk9SXCIsIDYwMCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGUgY2xpZW50IHdhcyB1bmFibGUgdG8gcmVhZCBhbiBpbnB1dCBmaWxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGSUxFX1JFQURfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJGSUxFX1JFQURfRVJST1JcIiwgNjAxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgcmVhbCBlcnJvciBjb2RlIGlzIHVuYXZhaWxhYmxlIGJlY2F1c2VcbiAqIHdlIGhhZCB0byB1c2UgYW4gWERvbWFpblJlcXVlc3Qgb2JqZWN0IHRvIGFsbG93IENPUlMgcmVxdWVzdHMgaW5cbiAqIEludGVybmV0IEV4cGxvcmVyLCB3aGljaCBzdHJpcHMgdGhlIGJvZHkgZnJvbSBIVFRQIHJlc3BvbnNlcyB0aGF0IGhhdmVcbiAqIGEgbm9uLTJYWCBzdGF0dXMgY29kZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gWF9ET01BSU5fUkVRVUVTVFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlhfRE9NQUlOX1JFUVVFU1RcIiwgNjAyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlRXJyb3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9zbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc2xpY2VcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1hociA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vWGhyLndlYXBwXCIpKTtcbi8qIGdsb2JhbCBYTUxIdHRwUmVxdWVzdCwgQmxvYiAqL1xuXG5sZXQgWEhSID0gbnVsbDtcbmlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gIFhIUiA9IFhNTEh0dHBSZXF1ZXN0O1xufVxuZnVuY3Rpb24gYjY0RGlnaXQobnVtYmVyKSB7XG4gIGlmIChudW1iZXIgPCAyNikge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgbnVtYmVyKTtcbiAgfVxuICBpZiAobnVtYmVyIDwgNTIpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg5NyArIChudW1iZXIgLSAyNikpO1xuICB9XG4gIGlmIChudW1iZXIgPCA2Mikge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDQ4ICsgKG51bWJlciAtIDUyKSk7XG4gIH1cbiAgaWYgKG51bWJlciA9PT0gNjIpIHtcbiAgICByZXR1cm4gJysnO1xuICB9XG4gIGlmIChudW1iZXIgPT09IDYzKSB7XG4gICAgcmV0dXJuICcvJztcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBlbmNvZGUgbGFyZ2UgZGlnaXQgJyArIG51bWJlciArICcgaW4gYmFzZTY0LicpO1xufVxuXG4vKipcbiAqIEEgUGFyc2UuRmlsZSBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZSB0aGF0IGlzIHNhdmVkIHRvIHRoZSBQYXJzZVxuICogY2xvdWQuXG4gKlxuICogQGFsaWFzIFBhcnNlLkZpbGVcbiAqL1xuY2xhc3MgUGFyc2VGaWxlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBuYW1lIHtTdHJpbmd9IFRoZSBmaWxlJ3MgbmFtZS4gVGhpcyB3aWxsIGJlIHByZWZpeGVkIGJ5IGEgdW5pcXVlXG4gICAqICAgICB2YWx1ZSBvbmNlIHRoZSBmaWxlIGhhcyBmaW5pc2hlZCBzYXZpbmcuIFRoZSBmaWxlIG5hbWUgbXVzdCBiZWdpbiB3aXRoXG4gICAqICAgICBhbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVyLCBhbmQgY29uc2lzdCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyxcbiAgICogICAgIHBlcmlvZHMsIHNwYWNlcywgdW5kZXJzY29yZXMsIG9yIGRhc2hlcy5cbiAgICogQHBhcmFtIGRhdGEge0FycmF5fSBUaGUgZGF0YSBmb3IgdGhlIGZpbGUsIGFzIGVpdGhlcjpcbiAgICogICAgIDEuIGFuIEFycmF5IG9mIGJ5dGUgdmFsdWUgTnVtYmVycywgb3JcbiAgICogICAgIDIuIGFuIE9iamVjdCBsaWtlIHsgYmFzZTY0OiBcIi4uLlwiIH0gd2l0aCBhIGJhc2U2NC1lbmNvZGVkIFN0cmluZy5cbiAgICogICAgIDMuIGFuIE9iamVjdCBsaWtlIHsgdXJpOiBcIi4uLlwiIH0gd2l0aCBhIHVyaSBTdHJpbmcuXG4gICAqICAgICA0LiBhIEZpbGUgb2JqZWN0IHNlbGVjdGVkIHdpdGggYSBmaWxlIHVwbG9hZCBjb250cm9sLiAoMykgb25seSB3b3Jrc1xuICAgKiAgICAgICAgaW4gRmlyZWZveCAzLjYrLCBTYWZhcmkgNi4wLjIrLCBDaHJvbWUgNyssIGFuZCBJRSAxMCsuXG4gICAqICAgICAgICBGb3IgZXhhbXBsZTpcbiAgICogPHByZT5cbiAgICogdmFyIGZpbGVVcGxvYWRDb250cm9sID0gJChcIiNwcm9maWxlUGhvdG9GaWxlVXBsb2FkXCIpWzBdO1xuICAgKiBpZiAoZmlsZVVwbG9hZENvbnRyb2wuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgKiAgIHZhciBmaWxlID0gZmlsZVVwbG9hZENvbnRyb2wuZmlsZXNbMF07XG4gICAqICAgdmFyIG5hbWUgPSBcInBob3RvLmpwZ1wiO1xuICAgKiAgIHZhciBwYXJzZUZpbGUgPSBuZXcgUGFyc2UuRmlsZShuYW1lLCBmaWxlKTtcbiAgICogICBwYXJzZUZpbGUuc2F2ZSgpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAqICAgICAvLyBUaGUgZmlsZSBoYXMgYmVlbiBzYXZlZCB0byBQYXJzZS5cbiAgICogICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgKiAgICAgLy8gVGhlIGZpbGUgZWl0aGVyIGNvdWxkIG5vdCBiZSByZWFkLCBvciBjb3VsZCBub3QgYmUgc2F2ZWQgdG8gUGFyc2UuXG4gICAqICAgfSk7XG4gICAqIH08L3ByZT5cbiAgICogQHBhcmFtIHR5cGUge1N0cmluZ30gT3B0aW9uYWwgQ29udGVudC1UeXBlIGhlYWRlciB0byB1c2UgZm9yIHRoZSBmaWxlLiBJZlxuICAgKiAgICAgdGhpcyBpcyBvbWl0dGVkLCB0aGUgY29udGVudCB0eXBlIHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgbmFtZSdzXG4gICAqICAgICBleHRlbnNpb24uXG4gICAqIEBwYXJhbSBtZXRhZGF0YSB7b2JqZWN0fSBPcHRpb25hbCBrZXkgdmFsdWUgcGFpcnMgdG8gYmUgc3RvcmVkIHdpdGggZmlsZSBvYmplY3RcbiAgICogQHBhcmFtIHRhZ3Mge29iamVjdH0gT3B0aW9uYWwga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHN0b3JlZCB3aXRoIGZpbGUgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBkYXRhLCB0eXBlLCBtZXRhZGF0YSwgdGFncykge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX25hbWVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl91cmxcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9zb3VyY2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9wcmV2aW91c1NhdmVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9kYXRhXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfcmVxdWVzdFRhc2tcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9tZXRhZGF0YVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3RhZ3NcIiwgdm9pZCAwKTtcbiAgICBjb25zdCBzcGVjaWZpZWRUeXBlID0gdHlwZSB8fCAnJztcbiAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgICB0aGlzLl9tZXRhZGF0YSA9IG1ldGFkYXRhIHx8IHt9O1xuICAgIHRoaXMuX3RhZ3MgPSB0YWdzIHx8IHt9O1xuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoZGF0YSkpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IFBhcnNlRmlsZS5lbmNvZGVCYXNlNjQoZGF0YSk7XG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHtcbiAgICAgICAgICBmb3JtYXQ6ICdiYXNlNjQnLFxuICAgICAgICAgIGJhc2U2NDogdGhpcy5fZGF0YSxcbiAgICAgICAgICB0eXBlOiBzcGVjaWZpZWRUeXBlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBkYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICB0aGlzLl9zb3VyY2UgPSB7XG4gICAgICAgICAgZm9ybWF0OiAnZmlsZScsXG4gICAgICAgICAgZmlsZTogZGF0YSxcbiAgICAgICAgICB0eXBlOiBzcGVjaWZpZWRUeXBlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEudXJpID09PSAnc3RyaW5nJyAmJiBkYXRhLnVyaSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHtcbiAgICAgICAgICBmb3JtYXQ6ICd1cmknLFxuICAgICAgICAgIHVyaTogZGF0YS51cmksXG4gICAgICAgICAgdHlwZTogc3BlY2lmaWVkVHlwZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhLmJhc2U2NCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0LCBfY29udGV4dDIsIF9jb250ZXh0MztcbiAgICAgICAgY29uc3QgYmFzZTY0ID0gKDAsIF9zbGljZS5kZWZhdWx0KShfY29udGV4dCA9IGRhdGEuYmFzZTY0LnNwbGl0KCcsJykpLmNhbGwoX2NvbnRleHQsIC0xKVswXTtcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSBzcGVjaWZpZWRUeXBlIHx8ICgwLCBfc2xpY2UuZGVmYXVsdCkoX2NvbnRleHQyID0gKDAsIF9zbGljZS5kZWZhdWx0KShfY29udGV4dDMgPSBkYXRhLmJhc2U2NC5zcGxpdCgnOycpKS5jYWxsKF9jb250ZXh0MywgMCwgMSlbMF0uc3BsaXQoJzonKSkuY2FsbChfY29udGV4dDIsIDEsIDIpWzBdIHx8ICd0ZXh0L3BsYWluJztcbiAgICAgICAgdGhpcy5fZGF0YSA9IGJhc2U2NDtcbiAgICAgICAgdGhpcy5fc291cmNlID0ge1xuICAgICAgICAgIGZvcm1hdDogJ2Jhc2U2NCcsXG4gICAgICAgICAgYmFzZTY0LFxuICAgICAgICAgIHR5cGU6IGRhdGFUeXBlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY3JlYXRlIGEgUGFyc2UuRmlsZSB3aXRoIHRoYXQgZGF0YS4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgZmlsZSwgZG93bmxvYWRpbmcgaXQgaWYgbm90IGFscmVhZHkgcHJlc2VudC5cbiAgICogRGF0YSBpcyBwcmVzZW50IGlmIGluaXRpYWxpemVkIHdpdGggQnl0ZSBBcnJheSwgQmFzZTY0IG9yIFNhdmVkIHdpdGggVXJpLlxuICAgKiBEYXRhIGlzIGNsZWFyZWQgaWYgc2F2ZWQgd2l0aCBGaWxlIG9iamVjdCBzZWxlY3RlZCB3aXRoIGEgZmlsZSB1cGxvYWQgY29udHJvbFxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmUgd2l0aCBiYXNlNjQgZGF0YVxuICAgKi9cbiAgYXN5bmMgZ2V0RGF0YSgpIHtcbiAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIGlmICghdGhpcy5fdXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBkYXRhIGZvciB1bnNhdmVkIFBhcnNlRmlsZS4nKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEZpbGVDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udHJvbGxlci5kb3dubG9hZCh0aGlzLl91cmwsIHtcbiAgICAgIHJlcXVlc3RUYXNrOiB0YXNrID0+IHRoaXMuX3JlcXVlc3RUYXNrID0gdGFza1xuICAgIH0pO1xuICAgIHRoaXMuX2RhdGEgPSByZXN1bHQuYmFzZTY0O1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuIEJlZm9yZSBzYXZlIGlzIGNhbGxlZCwgdGhpcyBpcyB0aGUgZmlsZW5hbWVcbiAgICogZ2l2ZW4gYnkgdGhlIHVzZXIuIEFmdGVyIHNhdmUgaXMgY2FsbGVkLCB0aGF0IG5hbWUgZ2V0cyBwcmVmaXhlZCB3aXRoIGFcbiAgICogdW5pcXVlIGlkZW50aWZpZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVybCBvZiB0aGUgZmlsZS4gSXQgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgeW91IHNhdmUgdGhlIGZpbGUgb3JcbiAgICogYWZ0ZXIgeW91IGdldCB0aGUgZmlsZSBmcm9tIGEgUGFyc2UuT2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBBbiBvYmplY3QgdG8gc3BlY2lmeSB1cmwgb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZvcmNlU2VjdXJlXSBmb3JjZSB0aGUgdXJsIHRvIGJlIHNlY3VyZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgdXJsKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIXRoaXMuX3VybCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5mb3JjZVNlY3VyZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3VybC5yZXBsYWNlKC9eaHR0cDpcXC9cXC8vaSwgJ2h0dHBzOi8vJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl91cmw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG1ldGFkYXRhIG9mIHRoZSBmaWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRhZ3Mgb2YgdGhlIGZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICB0YWdzKCkge1xuICAgIHJldHVybiB0aGlzLl90YWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBmaWxlIHRvIHRoZSBQYXJzZSBjbG91ZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5wcm9ncmVzczogSW4gQnJvd3NlciBvbmx5LCBjYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzLiBGb3IgZXhhbXBsZTpcbiAgICogPHByZT5cbiAgICogbGV0IHBhcnNlRmlsZSA9IG5ldyBQYXJzZS5GaWxlKG5hbWUsIGZpbGUpO1xuICAgKiBwYXJzZUZpbGUuc2F2ZSh7XG4gICAqICAgcHJvZ3Jlc3M6IChwcm9ncmVzc1ZhbHVlLCBsb2FkZWQsIHRvdGFsLCB7IHR5cGUgfSkgPT4ge1xuICAgKiAgICAgaWYgKHR5cGUgPT09IFwidXBsb2FkXCIgJiYgcHJvZ3Jlc3NWYWx1ZSAhPT0gbnVsbCkge1xuICAgKiAgICAgICAvLyBVcGRhdGUgdGhlIFVJIHVzaW5nIHByb2dyZXNzVmFsdWVcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqIH0pO1xuICAgKiA8L3ByZT5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2UgfCB1bmRlZmluZWR9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBzYXZlIGZpbmlzaGVzLlxuICAgKi9cbiAgc2F2ZShvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5yZXF1ZXN0VGFzayA9IHRhc2sgPT4gdGhpcy5fcmVxdWVzdFRhc2sgPSB0YXNrO1xuICAgIG9wdGlvbnMubWV0YWRhdGEgPSB0aGlzLl9tZXRhZGF0YTtcbiAgICBvcHRpb25zLnRhZ3MgPSB0aGlzLl90YWdzO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRGaWxlQ29udHJvbGxlcigpO1xuICAgIGlmICghdGhpcy5fcHJldmlvdXNTYXZlKSB7XG4gICAgICBpZiAodGhpcy5fc291cmNlLmZvcm1hdCA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU2F2ZSA9IGNvbnRyb2xsZXIuc2F2ZUZpbGUodGhpcy5fbmFtZSwgdGhpcy5fc291cmNlLCBvcHRpb25zKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5fbmFtZSA9IHJlcy5uYW1lO1xuICAgICAgICAgIHRoaXMuX3VybCA9IHJlcy51cmw7XG4gICAgICAgICAgdGhpcy5fZGF0YSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc291cmNlLmZvcm1hdCA9PT0gJ3VyaScpIHtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTYXZlID0gY29udHJvbGxlci5kb3dubG9hZCh0aGlzLl9zb3VyY2UudXJpLCBvcHRpb25zKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKCEocmVzdWx0ICYmIHJlc3VsdC5iYXNlNjQpKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG5ld1NvdXJjZSA9IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ2Jhc2U2NCcsXG4gICAgICAgICAgICBiYXNlNjQ6IHJlc3VsdC5iYXNlNjQsXG4gICAgICAgICAgICB0eXBlOiByZXN1bHQuY29udGVudFR5cGVcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX2RhdGEgPSByZXN1bHQuYmFzZTY0O1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gY29udHJvbGxlci5zYXZlQmFzZTY0KHRoaXMuX25hbWUsIG5ld1NvdXJjZSwgb3B0aW9ucyk7XG4gICAgICAgIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLl9uYW1lID0gcmVzLm5hbWU7XG4gICAgICAgICAgdGhpcy5fdXJsID0gcmVzLnVybDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTYXZlID0gY29udHJvbGxlci5zYXZlQmFzZTY0KHRoaXMuX25hbWUsIHRoaXMuX3NvdXJjZSwgb3B0aW9ucykudGhlbihyZXMgPT4ge1xuICAgICAgICAgIHRoaXMuX25hbWUgPSByZXMubmFtZTtcbiAgICAgICAgICB0aGlzLl91cmwgPSByZXMudXJsO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9wcmV2aW91c1NhdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcmV2aW91c1NhdmU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0cyB0aGUgcmVxdWVzdCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHNlbnQuXG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMuX3JlcXVlc3RUYXNrICYmIHR5cGVvZiB0aGlzLl9yZXF1ZXN0VGFzay5hYm9ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fcmVxdWVzdFRhc2suX2Fib3J0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fcmVxdWVzdFRhc2suYWJvcnQoKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIGZpbGUgZnJvbSB0aGUgUGFyc2UgY2xvdWQuXG4gICAqIEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSB3aXRoIE1hc3RlciBLZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiA8cHJlPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIGRlbGV0ZSBmaW5pc2hlcy5cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGlmICghdGhpcy5fbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5GSUxFX0RFTEVURV9VTk5BTUVEX0VSUk9SLCAnQ2Fubm90IGRlbGV0ZSBhbiB1bm5hbWVkIGZpbGUuJyk7XG4gICAgfVxuICAgIGNvbnN0IGRlc3Ryb3lPcHRpb25zID0ge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLnVzZU1hc3RlcktleSA9ICEhb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRGaWxlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmRlbGV0ZUZpbGUodGhpcy5fbmFtZSwgZGVzdHJveU9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0pO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnRmlsZScsXG4gICAgICBuYW1lOiB0aGlzLl9uYW1lLFxuICAgICAgdXJsOiB0aGlzLl91cmxcbiAgICB9O1xuICB9XG4gIGVxdWFscyhvdGhlcikge1xuICAgIGlmICh0aGlzID09PSBvdGhlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIFVuc2F2ZWQgRmlsZXMgYXJlIG5ldmVyIGVxdWFsLCBzaW5jZSB0aGV5IHdpbGwgYmUgc2F2ZWQgdG8gZGlmZmVyZW50IFVSTHNcbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBQYXJzZUZpbGUgJiYgdGhpcy5uYW1lKCkgPT09IG90aGVyLm5hbWUoKSAmJiB0aGlzLnVybCgpID09PSBvdGhlci51cmwoKSAmJiB0eXBlb2YgdGhpcy51cmwoKSAhPT0gJ3VuZGVmaW5lZCc7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBtZXRhZGF0YSB0byBiZSBzYXZlZCB3aXRoIGZpbGUgb2JqZWN0LiBPdmVyd3JpdGVzIGV4aXN0aW5nIG1ldGFkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhZGF0YSBLZXkgdmFsdWUgcGFpcnMgdG8gYmUgc3RvcmVkIHdpdGggZmlsZSBvYmplY3RcbiAgICovXG4gIHNldE1ldGFkYXRhKG1ldGFkYXRhKSB7XG4gICAgaWYgKG1ldGFkYXRhICYmIHR5cGVvZiBtZXRhZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBfY29udGV4dDQ7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ0ID0gKDAsIF9rZXlzLmRlZmF1bHQpKG1ldGFkYXRhKSkuY2FsbChfY29udGV4dDQsIGtleSA9PiB7XG4gICAgICAgIHRoaXMuYWRkTWV0YWRhdGEoa2V5LCBtZXRhZGF0YVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIG1ldGFkYXRhIHRvIGJlIHNhdmVkIHdpdGggZmlsZSBvYmplY3QuIEFkZHMgdG8gZXhpc3RpbmcgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkga2V5IHRvIHN0b3JlIHRoZSBtZXRhZGF0YVxuICAgKiBAcGFyYW0geyp9IHZhbHVlIG1ldGFkYXRhXG4gICAqL1xuICBhZGRNZXRhZGF0YShrZXksIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9tZXRhZGF0YVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGFncyB0byBiZSBzYXZlZCB3aXRoIGZpbGUgb2JqZWN0LiBPdmVyd3JpdGVzIGV4aXN0aW5nIHRhZ3NcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHRhZ3MgS2V5IHZhbHVlIHBhaXJzIHRvIGJlIHN0b3JlZCB3aXRoIGZpbGUgb2JqZWN0XG4gICAqL1xuICBzZXRUYWdzKHRhZ3MpIHtcbiAgICBpZiAodGFncyAmJiB0eXBlb2YgdGFncyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBfY29udGV4dDU7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ1ID0gKDAsIF9rZXlzLmRlZmF1bHQpKHRhZ3MpKS5jYWxsKF9jb250ZXh0NSwga2V5ID0+IHtcbiAgICAgICAgdGhpcy5hZGRUYWcoa2V5LCB0YWdzW2tleV0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGFncyB0byBiZSBzYXZlZCB3aXRoIGZpbGUgb2JqZWN0LiBBZGRzIHRvIGV4aXN0aW5nIHRhZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkga2V5IHRvIHN0b3JlIHRhZ3NcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSB0YWdcbiAgICovXG4gIGFkZFRhZyhrZXksIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl90YWdzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGZyb21KU09OKG9iaikge1xuICAgIGlmIChvYmouX190eXBlICE9PSAnRmlsZScpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0pTT04gb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhIFBhcnNlRmlsZScpO1xuICAgIH1cbiAgICBjb25zdCBmaWxlID0gbmV3IFBhcnNlRmlsZShvYmoubmFtZSk7XG4gICAgZmlsZS5fdXJsID0gb2JqLnVybDtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuICBzdGF0aWMgZW5jb2RlQmFzZTY0KGJ5dGVzKSB7XG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgY2h1bmtzLmxlbmd0aCA9IE1hdGguY2VpbChieXRlcy5sZW5ndGggLyAzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYjEgPSBieXRlc1tpICogM107XG4gICAgICBjb25zdCBiMiA9IGJ5dGVzW2kgKiAzICsgMV0gfHwgMDtcbiAgICAgIGNvbnN0IGIzID0gYnl0ZXNbaSAqIDMgKyAyXSB8fCAwO1xuICAgICAgY29uc3QgaGFzMiA9IGkgKiAzICsgMSA8IGJ5dGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGhhczMgPSBpICogMyArIDIgPCBieXRlcy5sZW5ndGg7XG4gICAgICBjaHVua3NbaV0gPSBbYjY0RGlnaXQoYjEgPj4gMiAmIDB4M2YpLCBiNjREaWdpdChiMSA8PCA0ICYgMHgzMCB8IGIyID4+IDQgJiAweDBmKSwgaGFzMiA/IGI2NERpZ2l0KGIyIDw8IDIgJiAweDNjIHwgYjMgPj4gNiAmIDB4MDMpIDogJz0nLCBoYXMzID8gYjY0RGlnaXQoYjMgJiAweDNmKSA6ICc9J10uam9pbignJyk7XG4gICAgfVxuICAgIHJldHVybiBjaHVua3Muam9pbignJyk7XG4gIH1cbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBzYXZlRmlsZTogYXN5bmMgZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgIGlmIChzb3VyY2UuZm9ybWF0ICE9PSAnZmlsZScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2F2ZUZpbGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZpbGUtdHlwZSBzb3VyY2VzLicpO1xuICAgIH1cbiAgICBjb25zdCBiYXNlNjREYXRhID0gYXdhaXQgbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlcywgcmVqKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4gcmVzKHJlYWRlci5yZXN1bHQpO1xuICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWooZXJyb3IpO1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoc291cmNlLmZpbGUpO1xuICAgIH0pO1xuICAgIC8vIHdlIG9ubHkgd2FudCB0aGUgZGF0YSBhZnRlciB0aGUgY29tbWFcbiAgICAvLyBGb3IgZXhhbXBsZTogXCJkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsSlZCRVJpMHhMalFLSi4uLlwiIHdlIHdvdWxkIG9ubHkgd2FudCBcIkpWQkVSaTB4TGpRS0ouLi5cIlxuICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IGJhc2U2NERhdGEuc3BsaXQoJywnKTtcbiAgICAvLyBpbiB0aGUgZXZlbnQgdGhlcmUgaXMgbm8gJ2RhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCwnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJhc2U2NCBzdHJpbmdcbiAgICAvLyB1c2UgdGhlIGVudGlyZSBzdHJpbmcgaW5zdGVhZFxuICAgIGNvbnN0IGRhdGEgPSBzZWNvbmQgPyBzZWNvbmQgOiBmaXJzdDtcbiAgICBjb25zdCBuZXdTb3VyY2UgPSB7XG4gICAgICBmb3JtYXQ6ICdiYXNlNjQnLFxuICAgICAgYmFzZTY0OiBkYXRhLFxuICAgICAgdHlwZTogc291cmNlLnR5cGUgfHwgKHNvdXJjZS5maWxlID8gc291cmNlLmZpbGUudHlwZSA6IHVuZGVmaW5lZClcbiAgICB9O1xuICAgIHJldHVybiBhd2FpdCBEZWZhdWx0Q29udHJvbGxlci5zYXZlQmFzZTY0KG5hbWUsIG5ld1NvdXJjZSwgb3B0aW9ucyk7XG4gIH0sXG4gIHNhdmVCYXNlNjQ6IGZ1bmN0aW9uIChuYW1lLCBzb3VyY2UpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgaWYgKHNvdXJjZS5mb3JtYXQgIT09ICdiYXNlNjQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NhdmVCYXNlNjQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhc2U2NC10eXBlIHNvdXJjZXMuJyk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBiYXNlNjQ6IHNvdXJjZS5iYXNlNjQsXG4gICAgICBmaWxlRGF0YToge1xuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIC4uLm9wdGlvbnMubWV0YWRhdGFcbiAgICAgICAgfSxcbiAgICAgICAgdGFnczoge1xuICAgICAgICAgIC4uLm9wdGlvbnMudGFnc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBkZWxldGUgb3B0aW9ucy5tZXRhZGF0YTtcbiAgICBkZWxldGUgb3B0aW9ucy50YWdzO1xuICAgIGlmIChzb3VyY2UudHlwZSkge1xuICAgICAgZGF0YS5fQ29udGVudFR5cGUgPSBzb3VyY2UudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkucmVxdWVzdCgnUE9TVCcsICdmaWxlcy8nICsgbmFtZSwgZGF0YSwgb3B0aW9ucyk7XG4gIH0sXG4gIGRvd25sb2FkOiBmdW5jdGlvbiAodXJpLCBvcHRpb25zKSB7XG4gICAgaWYgKFhIUikge1xuICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRBamF4KHVyaSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnQ2Fubm90IG1ha2UgYSByZXF1ZXN0OiBObyBkZWZpbml0aW9uIG9mIFhNTEh0dHBSZXF1ZXN0IHdhcyBmb3VuZC4nKTtcbiAgICB9XG4gIH0sXG4gIGRvd25sb2FkQWpheDogZnVuY3Rpb24gKHVyaSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB4aHIgPSBuZXcgWEhSKCk7XG4gICAgICB4aHIub3BlbignR0VUJywgdXJpLCB0cnVlKTtcbiAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9O1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSB4aHIuRE9ORSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgYmFzZTY0OiBQYXJzZUZpbGUuZW5jb2RlQmFzZTY0KGJ5dGVzKSxcbiAgICAgICAgICBjb250ZW50VHlwZTogeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdjb250ZW50LXR5cGUnKVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBvcHRpb25zLnJlcXVlc3RUYXNrKHhocik7XG4gICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xuICB9LFxuICBkZWxldGVGaWxlOiBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnWC1QYXJzZS1BcHBsaWNhdGlvbi1JRCc6IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQVBQTElDQVRJT05fSUQnKVxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMudXNlTWFzdGVyS2V5KSB7XG4gICAgICBoZWFkZXJzWydYLVBhcnNlLU1hc3Rlci1LZXknXSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTUFTVEVSX0tFWScpO1xuICAgIH1cbiAgICBsZXQgdXJsID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfVVJMJyk7XG4gICAgaWYgKHVybFt1cmwubGVuZ3RoIC0gMV0gIT09ICcvJykge1xuICAgICAgdXJsICs9ICcvJztcbiAgICB9XG4gICAgdXJsICs9ICdmaWxlcy8nICsgbmFtZTtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5hamF4KCdERUxFVEUnLCB1cmwsICcnLCBoZWFkZXJzKS5jYXRjaChyZXNwb25zZSA9PiB7XG4gICAgICAvLyBUT0RPOiByZXR1cm4gSlNPTiBvYmplY3QgaW4gc2VydmVyXG4gICAgICBpZiAoIXJlc3BvbnNlIHx8IHJlc3BvbnNlID09PSAnU3ludGF4RXJyb3I6IFVuZXhwZWN0ZWQgZW5kIG9mIEpTT04gaW5wdXQnKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLmhhbmRsZUVycm9yKHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgX3NldFhIUih4aHIpIHtcbiAgICBYSFIgPSB4aHI7XG4gIH0sXG4gIF9nZXRYSFIoKSB7XG4gICAgcmV0dXJuIFhIUjtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldEZpbGVDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlRmlsZTtcbmV4cG9ydHMuYjY0RGlnaXQgPSBiNjREaWdpdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEdlb1BvaW50IHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6PGJyPlxuICogICA8cHJlPlxuICogICBuZXcgR2VvUG9pbnQob3RoZXJHZW9Qb2ludClcbiAqICAgbmV3IEdlb1BvaW50KDMwLCAzMClcbiAqICAgbmV3IEdlb1BvaW50KFszMCwgMzBdKVxuICogICBuZXcgR2VvUG9pbnQoe2xhdGl0dWRlOiAzMCwgbG9uZ2l0dWRlOiAzMH0pXG4gKiAgIG5ldyBHZW9Qb2ludCgpICAvLyBkZWZhdWx0cyB0byAoMCwgMClcbiAqICAgPC9wcmU+XG4gKiA8cD5SZXByZXNlbnRzIGEgbGF0aXR1ZGUgLyBsb25naXR1ZGUgcG9pbnQgdGhhdCBtYXkgYmUgYXNzb2NpYXRlZFxuICogd2l0aCBhIGtleSBpbiBhIFBhcnNlT2JqZWN0IG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgcG9pbnQgZm9yIGdlbyBxdWVyaWVzLlxuICogVGhpcyBhbGxvd3MgcHJveGltaXR5LWJhc2VkIHF1ZXJpZXMgb24gdGhlIGtleS48L3A+XG4gKlxuICogPHA+T25seSBvbmUga2V5IGluIGEgY2xhc3MgbWF5IGNvbnRhaW4gYSBHZW9Qb2ludC48L3A+XG4gKlxuICogPHA+RXhhbXBsZTo8cHJlPlxuICogICB2YXIgcG9pbnQgPSBuZXcgUGFyc2UuR2VvUG9pbnQoMzAuMCwgLTIwLjApO1xuICogICB2YXIgb2JqZWN0ID0gbmV3IFBhcnNlLk9iamVjdChcIlBsYWNlT2JqZWN0XCIpO1xuICogICBvYmplY3Quc2V0KFwibG9jYXRpb25cIiwgcG9pbnQpO1xuICogICBvYmplY3Quc2F2ZSgpOzwvcHJlPjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuR2VvUG9pbnRcbiAqL1xuLyogZ2xvYmFsIG5hdmlnYXRvciAqL1xuY2xhc3MgUGFyc2VHZW9Qb2ludCB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyhudW1iZXJbXSB8IG9iamVjdCB8IG51bWJlcil9IGFyZzEgRWl0aGVyIGEgbGlzdCBvZiBjb29yZGluYXRlIHBhaXJzLCBhbiBvYmplY3Qgd2l0aCBgbGF0aXR1ZGVgLCBgbG9uZ2l0dWRlYCwgb3IgdGhlIGxhdGl0dWRlIG9yIHRoZSBwb2ludC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZzIgVGhlIGxvbmdpdHVkZSBvZiB0aGUgR2VvUG9pbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZzEsIGFyZzIpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9sYXRpdHVkZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2xvbmdpdHVkZVwiLCB2b2lkIDApO1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoYXJnMSkpIHtcbiAgICAgIFBhcnNlR2VvUG9pbnQuX3ZhbGlkYXRlKGFyZzFbMF0sIGFyZzFbMV0pO1xuICAgICAgdGhpcy5fbGF0aXR1ZGUgPSBhcmcxWzBdO1xuICAgICAgdGhpcy5fbG9uZ2l0dWRlID0gYXJnMVsxXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcxID09PSAnb2JqZWN0Jykge1xuICAgICAgUGFyc2VHZW9Qb2ludC5fdmFsaWRhdGUoYXJnMS5sYXRpdHVkZSwgYXJnMS5sb25naXR1ZGUpO1xuICAgICAgdGhpcy5fbGF0aXR1ZGUgPSBhcmcxLmxhdGl0dWRlO1xuICAgICAgdGhpcy5fbG9uZ2l0dWRlID0gYXJnMS5sb25naXR1ZGU7XG4gICAgfSBlbHNlIGlmIChhcmcxICE9PSB1bmRlZmluZWQgJiYgYXJnMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBQYXJzZUdlb1BvaW50Ll92YWxpZGF0ZShhcmcxLCBhcmcyKTtcbiAgICAgIHRoaXMuX2xhdGl0dWRlID0gYXJnMTtcbiAgICAgIHRoaXMuX2xvbmdpdHVkZSA9IGFyZzI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xhdGl0dWRlID0gMDtcbiAgICAgIHRoaXMuX2xvbmdpdHVkZSA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcnRoLXNvdXRoIHBvcnRpb24gb2YgdGhlIGNvb3JkaW5hdGUsIGluIHJhbmdlIFstOTAsIDkwXS5cbiAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBzZXQgb3V0IG9mIHJhbmdlIGluIGEgbW9kZXJuIGJyb3dzZXIuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsYXRpdHVkZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGxhdGl0dWRlKCkge1xuICAgIHJldHVybiB0aGlzLl9sYXRpdHVkZTtcbiAgfVxuICBzZXQgbGF0aXR1ZGUodmFsKSB7XG4gICAgUGFyc2VHZW9Qb2ludC5fdmFsaWRhdGUodmFsLCB0aGlzLmxvbmdpdHVkZSk7XG4gICAgdGhpcy5fbGF0aXR1ZGUgPSB2YWw7XG4gIH1cblxuICAvKipcbiAgICogRWFzdC13ZXN0IHBvcnRpb24gb2YgdGhlIGNvb3JkaW5hdGUsIGluIHJhbmdlIFstMTgwLCAxODBdLlxuICAgKiBUaHJvd3MgaWYgc2V0IG91dCBvZiByYW5nZSBpbiBhIG1vZGVybiBicm93c2VyLlxuICAgKlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gbG9uZ2l0dWRlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbG9uZ2l0dWRlKCkge1xuICAgIHJldHVybiB0aGlzLl9sb25naXR1ZGU7XG4gIH1cbiAgc2V0IGxvbmdpdHVkZSh2YWwpIHtcbiAgICBQYXJzZUdlb1BvaW50Ll92YWxpZGF0ZSh0aGlzLmxhdGl0dWRlLCB2YWwpO1xuICAgIHRoaXMuX2xvbmdpdHVkZSA9IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgR2VvUG9pbnQsIHN1aXRhYmxlIGZvciBQYXJzZS5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICBQYXJzZUdlb1BvaW50Ll92YWxpZGF0ZSh0aGlzLl9sYXRpdHVkZSwgdGhpcy5fbG9uZ2l0dWRlKTtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnR2VvUG9pbnQnLFxuICAgICAgbGF0aXR1ZGU6IHRoaXMuX2xhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlOiB0aGlzLl9sb25naXR1ZGVcbiAgICB9O1xuICB9XG4gIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFBhcnNlR2VvUG9pbnQgJiYgdGhpcy5sYXRpdHVkZSA9PT0gb3RoZXIubGF0aXR1ZGUgJiYgdGhpcy5sb25naXR1ZGUgPT09IG90aGVyLmxvbmdpdHVkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgR2VvUG9pbnQgdG8gYW5vdGhlciBpbiByYWRpYW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCB0aGUgb3RoZXIgUGFyc2UuR2VvUG9pbnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICByYWRpYW5zVG8ocG9pbnQpIHtcbiAgICBjb25zdCBkMnIgPSBNYXRoLlBJIC8gMTgwLjA7XG4gICAgY29uc3QgbGF0MXJhZCA9IHRoaXMubGF0aXR1ZGUgKiBkMnI7XG4gICAgY29uc3QgbG9uZzFyYWQgPSB0aGlzLmxvbmdpdHVkZSAqIGQycjtcbiAgICBjb25zdCBsYXQycmFkID0gcG9pbnQubGF0aXR1ZGUgKiBkMnI7XG4gICAgY29uc3QgbG9uZzJyYWQgPSBwb2ludC5sb25naXR1ZGUgKiBkMnI7XG4gICAgY29uc3Qgc2luRGVsdGFMYXREaXYyID0gTWF0aC5zaW4oKGxhdDFyYWQgLSBsYXQycmFkKSAvIDIpO1xuICAgIGNvbnN0IHNpbkRlbHRhTG9uZ0RpdjIgPSBNYXRoLnNpbigobG9uZzFyYWQgLSBsb25nMnJhZCkgLyAyKTtcbiAgICAvLyBTcXVhcmUgb2YgaGFsZiB0aGUgc3RyYWlnaHQgbGluZSBjaG9yZCBkaXN0YW5jZSBiZXR3ZWVuIGJvdGggcG9pbnRzLlxuICAgIGxldCBhID0gc2luRGVsdGFMYXREaXYyICogc2luRGVsdGFMYXREaXYyICsgTWF0aC5jb3MobGF0MXJhZCkgKiBNYXRoLmNvcyhsYXQycmFkKSAqIHNpbkRlbHRhTG9uZ0RpdjIgKiBzaW5EZWx0YUxvbmdEaXYyO1xuICAgIGEgPSBNYXRoLm1pbigxLjAsIGEpO1xuICAgIHJldHVybiAyICogTWF0aC5hc2luKE1hdGguc3FydChhKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIEdlb1BvaW50IHRvIGFub3RoZXIgaW4ga2lsb21ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgdGhlIG90aGVyIFBhcnNlLkdlb1BvaW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAga2lsb21ldGVyc1RvKHBvaW50KSB7XG4gICAgcmV0dXJuIHRoaXMucmFkaWFuc1RvKHBvaW50KSAqIDYzNzEuMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgR2VvUG9pbnQgdG8gYW5vdGhlciBpbiBtaWxlcy5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgdGhlIG90aGVyIFBhcnNlLkdlb1BvaW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgbWlsZXNUbyhwb2ludCkge1xuICAgIHJldHVybiB0aGlzLnJhZGlhbnNUbyhwb2ludCkgKiAzOTU4Ljg7XG4gIH1cblxuICAvKlxuICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBsYXQtbG9uZyBpcyBvdXQgb2YgYm91bmRzLlxuICAgKi9cbiAgc3RhdGljIF92YWxpZGF0ZShsYXRpdHVkZSwgbG9uZ2l0dWRlKSB7XG4gICAgaWYgKGlzTmFOKGxhdGl0dWRlKSB8fCBpc05hTihsb25naXR1ZGUpIHx8IHR5cGVvZiBsYXRpdHVkZSAhPT0gJ251bWJlcicgfHwgdHlwZW9mIGxvbmdpdHVkZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlb1BvaW50IGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgbXVzdCBiZSB2YWxpZCBudW1iZXJzJyk7XG4gICAgfVxuICAgIGlmIChsYXRpdHVkZSA8IC05MC4wKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW9Qb2ludCBsYXRpdHVkZSBvdXQgb2YgYm91bmRzOiAnICsgbGF0aXR1ZGUgKyAnIDwgLTkwLjAuJyk7XG4gICAgfVxuICAgIGlmIChsYXRpdHVkZSA+IDkwLjApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlb1BvaW50IGxhdGl0dWRlIG91dCBvZiBib3VuZHM6ICcgKyBsYXRpdHVkZSArICcgPiA5MC4wLicpO1xuICAgIH1cbiAgICBpZiAobG9uZ2l0dWRlIDwgLTE4MC4wKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW9Qb2ludCBsb25naXR1ZGUgb3V0IG9mIGJvdW5kczogJyArIGxvbmdpdHVkZSArICcgPCAtMTgwLjAuJyk7XG4gICAgfVxuICAgIGlmIChsb25naXR1ZGUgPiAxODAuMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VvUG9pbnQgbG9uZ2l0dWRlIG91dCBvZiBib3VuZHM6ICcgKyBsb25naXR1ZGUgKyAnID4gMTgwLjAuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBHZW9Qb2ludCB3aXRoIHRoZSB1c2VyJ3MgY3VycmVudCBsb2NhdGlvbiwgaWYgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5lbmFibGVIaWdoQWNjdXJhY3ldIEEgYm9vbGVhbiB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUgYXBwbGljYXRpb24gd291bGQgbGlrZSB0byByZWNlaXZlIHRoZSBiZXN0IHBvc3NpYmxlIHJlc3VsdHMuXG4gICAqICBJZiB0cnVlIGFuZCBpZiB0aGUgZGV2aWNlIGlzIGFibGUgdG8gcHJvdmlkZSBhIG1vcmUgYWNjdXJhdGUgcG9zaXRpb24sIGl0IHdpbGwgZG8gc28uXG4gICAqICBOb3RlIHRoYXQgdGhpcyBjYW4gcmVzdWx0IGluIHNsb3dlciByZXNwb25zZSB0aW1lcyBvciBpbmNyZWFzZWQgcG93ZXIgY29uc3VtcHRpb24gKHdpdGggYSBHUFMgY2hpcCBvbiBhIG1vYmlsZSBkZXZpY2UgZm9yIGV4YW1wbGUpLlxuICAgKiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIGZhbHNlLCB0aGUgZGV2aWNlIGNhbiB0YWtlIHRoZSBsaWJlcnR5IHRvIHNhdmUgcmVzb3VyY2VzIGJ5IHJlc3BvbmRpbmcgbW9yZSBxdWlja2x5IGFuZC9vciB1c2luZyBsZXNzIHBvd2VyLiBEZWZhdWx0OiBmYWxzZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnRpbWVvdXRdIEEgcG9zaXRpdmUgbG9uZyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlIGRldmljZSBpcyBhbGxvd2VkIHRvIHRha2UgaW4gb3JkZXIgdG8gcmV0dXJuIGEgcG9zaXRpb24uXG4gICAqICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBJbmZpbml0eSwgbWVhbmluZyB0aGF0IGdldEN1cnJlbnRQb3NpdGlvbigpIHdvbid0IHJldHVybiB1bnRpbCB0aGUgcG9zaXRpb24gaXMgYXZhaWxhYmxlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4aW11bUFnZV0gQSBwb3NpdGl2ZSBsb25nIHZhbHVlIGluZGljYXRpbmcgdGhlIG1heGltdW0gYWdlIGluIG1pbGxpc2Vjb25kcyBvZiBhIHBvc3NpYmxlIGNhY2hlZCBwb3NpdGlvbiB0aGF0IGlzIGFjY2VwdGFibGUgdG8gcmV0dXJuLlxuICAgKiAgSWYgc2V0IHRvIDAsIGl0IG1lYW5zIHRoYXQgdGhlIGRldmljZSBjYW5ub3QgdXNlIGEgY2FjaGVkIHBvc2l0aW9uIGFuZCBtdXN0IGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIHJlYWwgY3VycmVudCBwb3NpdGlvbi5cbiAgICogIElmIHNldCB0byBJbmZpbml0eSB0aGUgZGV2aWNlIG11c3QgcmV0dXJuIGEgY2FjaGVkIHBvc2l0aW9uIHJlZ2FyZGxlc3Mgb2YgaXRzIGFnZS4gRGVmYXVsdDogMC5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQYXJzZS5HZW9Qb2ludD59IFVzZXIncyBjdXJyZW50IGxvY2F0aW9uXG4gICAqL1xuICBzdGF0aWMgY3VycmVudChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obG9jYXRpb24gPT4ge1xuICAgICAgICByZXNvbHZlKG5ldyBQYXJzZUdlb1BvaW50KGxvY2F0aW9uLmNvb3Jkcy5sYXRpdHVkZSwgbG9jYXRpb24uY29vcmRzLmxvbmdpdHVkZSkpO1xuICAgICAgfSwgcmVqZWN0LCBvcHRpb25zKTtcbiAgICB9KTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VHZW9Qb2ludDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jcmVhdGUgPSBjcmVhdGU7XG5leHBvcnRzLmNyZWF0ZUZ1bmN0aW9uID0gY3JlYXRlRnVuY3Rpb247XG5leHBvcnRzLmNyZWF0ZVRyaWdnZXIgPSBjcmVhdGVUcmlnZ2VyO1xuZXhwb3J0cy5nZXRGdW5jdGlvbiA9IGdldEZ1bmN0aW9uO1xuZXhwb3J0cy5nZXRGdW5jdGlvbnMgPSBnZXRGdW5jdGlvbnM7XG5leHBvcnRzLmdldFRyaWdnZXIgPSBnZXRUcmlnZ2VyO1xuZXhwb3J0cy5nZXRUcmlnZ2VycyA9IGdldFRyaWdnZXJzO1xuZXhwb3J0cy5yZW1vdmUgPSByZW1vdmU7XG5leHBvcnRzLnJlbW92ZUZ1bmN0aW9uID0gcmVtb3ZlRnVuY3Rpb247XG5leHBvcnRzLnJlbW92ZVRyaWdnZXIgPSByZW1vdmVUcmlnZ2VyO1xuZXhwb3J0cy51cGRhdGUgPSB1cGRhdGU7XG5leHBvcnRzLnVwZGF0ZUZ1bmN0aW9uID0gdXBkYXRlRnVuY3Rpb247XG5leHBvcnRzLnVwZGF0ZVRyaWdnZXIgPSB1cGRhdGVUcmlnZ2VyO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfZGVjb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbmZ1bmN0aW9uIGdldEZ1bmN0aW9ucygpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLmdldCgnZnVuY3Rpb25zJyk7XG59XG5mdW5jdGlvbiBnZXRUcmlnZ2VycygpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLmdldCgndHJpZ2dlcnMnKTtcbn1cbmZ1bmN0aW9uIGdldEZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLmdldCgnZnVuY3Rpb25zJywgbmFtZSk7XG59XG5mdW5jdGlvbiBnZXRUcmlnZ2VyKGNsYXNzTmFtZSwgdHJpZ2dlck5hbWUpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLmdldCgndHJpZ2dlcnMnLCBjbGFzc05hbWUsIHRyaWdnZXJOYW1lKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSwgdXJsKSB7XG4gIHJldHVybiBjcmVhdGUoe1xuICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgIHVybDogdXJsXG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlVHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJOYW1lLCB1cmwpIHtcbiAgcmV0dXJuIGNyZWF0ZSh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lLFxuICAgIHVybDogdXJsXG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlKGhvb2spIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLmNyZWF0ZShob29rKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSwgdXJsKSB7XG4gIHJldHVybiB1cGRhdGUoe1xuICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgIHVybDogdXJsXG4gIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlVHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJOYW1lLCB1cmwpIHtcbiAgcmV0dXJuIHVwZGF0ZSh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lLFxuICAgIHVybDogdXJsXG4gIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlKGhvb2spIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLnVwZGF0ZShob29rKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSkge1xuICByZXR1cm4gcmVtb3ZlKHtcbiAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZVxuICB9KTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyaWdnZXIoY2xhc3NOYW1lLCB0cmlnZ2VyTmFtZSkge1xuICByZXR1cm4gcmVtb3ZlKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWVcbiAgfSk7XG59XG5mdW5jdGlvbiByZW1vdmUoaG9vaykge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkucmVtb3ZlKGhvb2spO1xufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIGdldCh0eXBlLCBmdW5jdGlvbk5hbWUsIHRyaWdnZXJOYW1lKSB7XG4gICAgbGV0IHVybCA9ICcvaG9va3MvJyArIHR5cGU7XG4gICAgaWYgKGZ1bmN0aW9uTmFtZSkge1xuICAgICAgdXJsICs9ICcvJyArIGZ1bmN0aW9uTmFtZTtcbiAgICAgIGlmICh0cmlnZ2VyTmFtZSkge1xuICAgICAgICB1cmwgKz0gJy8nICsgdHJpZ2dlck5hbWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0KCdHRVQnLCB1cmwpO1xuICB9LFxuICBjcmVhdGUoaG9vaykge1xuICAgIGxldCB1cmw7XG4gICAgaWYgKGhvb2suZnVuY3Rpb25OYW1lICYmIGhvb2sudXJsKSB7XG4gICAgICB1cmwgPSAnL2hvb2tzL2Z1bmN0aW9ucyc7XG4gICAgfSBlbHNlIGlmIChob29rLmNsYXNzTmFtZSAmJiBob29rLnRyaWdnZXJOYW1lICYmIGhvb2sudXJsKSB7XG4gICAgICB1cmwgPSAnL2hvb2tzL3RyaWdnZXJzJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KHtcbiAgICAgICAgZXJyb3I6ICdpbnZhbGlkIGhvb2sgZGVjbGFyYXRpb24nLFxuICAgICAgICBjb2RlOiAxNDNcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdCgnUE9TVCcsIHVybCwgaG9vayk7XG4gIH0sXG4gIHJlbW92ZShob29rKSB7XG4gICAgbGV0IHVybDtcbiAgICBpZiAoaG9vay5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvZnVuY3Rpb25zLycgKyBob29rLmZ1bmN0aW9uTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLmZ1bmN0aW9uTmFtZTtcbiAgICB9IGVsc2UgaWYgKGhvb2suY2xhc3NOYW1lICYmIGhvb2sudHJpZ2dlck5hbWUpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvdHJpZ2dlcnMvJyArIGhvb2suY2xhc3NOYW1lICsgJy8nICsgaG9vay50cmlnZ2VyTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLmNsYXNzTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLnRyaWdnZXJOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3Qoe1xuICAgICAgICBlcnJvcjogJ2ludmFsaWQgaG9vayBkZWNsYXJhdGlvbicsXG4gICAgICAgIGNvZGU6IDE0M1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0KCdQVVQnLCB1cmwsIHtcbiAgICAgIF9fb3A6ICdEZWxldGUnXG4gICAgfSk7XG4gIH0sXG4gIHVwZGF0ZShob29rKSB7XG4gICAgbGV0IHVybDtcbiAgICBpZiAoaG9vay5mdW5jdGlvbk5hbWUgJiYgaG9vay51cmwpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvZnVuY3Rpb25zLycgKyBob29rLmZ1bmN0aW9uTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLmZ1bmN0aW9uTmFtZTtcbiAgICB9IGVsc2UgaWYgKGhvb2suY2xhc3NOYW1lICYmIGhvb2sudHJpZ2dlck5hbWUgJiYgaG9vay51cmwpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvdHJpZ2dlcnMvJyArIGhvb2suY2xhc3NOYW1lICsgJy8nICsgaG9vay50cmlnZ2VyTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLmNsYXNzTmFtZTtcbiAgICAgIGRlbGV0ZSBob29rLnRyaWdnZXJOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3Qoe1xuICAgICAgICBlcnJvcjogJ2ludmFsaWQgaG9vayBkZWNsYXJhdGlvbicsXG4gICAgICAgIGNvZGU6IDE0M1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0KCdQVVQnLCB1cmwsIGhvb2spO1xuICB9LFxuICBzZW5kUmVxdWVzdChtZXRob2QsIHVybCwgYm9keSkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLnJlcXVlc3QobWV0aG9kLCB1cmwsIGJvZHksIHtcbiAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSAoMCwgX2RlY29kZS5kZWZhdWx0KShyZXMpO1xuICAgICAgaWYgKGRlY29kZWQpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShkZWNvZGVkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfSlNPTiwgJ1RoZSBzZXJ2ZXIgcmV0dXJuZWQgYW4gaW52YWxpZCByZXNwb25zZS4nKSk7XG4gICAgfSk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRIb29rc0NvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2VudHJpZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9lbnRyaWVzXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG5jb25zdCBERVZJQ0VfVFlQRVMgPSB7XG4gIElPUzogJ2lvcycsXG4gIE1BQ09TOiAnbWFjb3MnLFxuICBUVk9TOiAndHZvcycsXG4gIEZDTTogJ2ZjbScsXG4gIEFORFJPSUQ6ICdhbmRyb2lkJyxcbiAgV0VCOiAnd2ViJ1xufTtcblxuLyoqXG4gKiBQYXJzZS5JbnN0YWxsYXRpb24gaXMgYSBsb2NhbCByZXByZXNlbnRhdGlvbiBvZiBpbnN0YWxsYXRpb24gZGF0YSB0aGF0IGNhbiBiZSBzYXZlZCBhbmQgcmV0cmlldmVkIGZyb20gdGhlIFBhcnNlIGNsb3VkLlxuICogVGhpcyBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIGEgUGFyc2UuT2JqZWN0LCBhbmQgcmV0YWlucyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IG9mIGEgUGFyc2UuT2JqZWN0LCBidXQgYWxzbyBleHRlbmRzIGl0IHdpdGggaW5zdGFsbGF0aW9uLXNwZWNpZmljIGZlYXR1cmVzLlxuICpcbiAqIDxwPkEgdmFsaWQgUGFyc2UuSW5zdGFsbGF0aW9uIGNhbiBvbmx5IGJlIGluc3RhbnRpYXRlZCB2aWEgPGNvZGU+UGFyc2UuSW5zdGFsbGF0aW9uLmN1cnJlbnRJbnN0YWxsYXRpb24oKTwvY29kZT5cbiAqXG4gKiBQYXJzZS5JbnN0YWxsYXRpb24gb2JqZWN0cyB3aGljaCBoYXZlIGEgdmFsaWQgPGNvZGU+ZGV2aWNlVG9rZW48L2NvZGU+IGFuZCBhcmUgc2F2ZWQgdG8gdGhlIFBhcnNlIGNsb3VkIGNhbiBiZSB1c2VkIHRvIHRhcmdldCBwdXNoIG5vdGlmaWNhdGlvbnMuXG4gKiA8L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLkluc3RhbGxhdGlvblxuICovXG5jbGFzcyBQYXJzZUluc3RhbGxhdGlvbiBleHRlbmRzIF9QYXJzZU9iamVjdC5kZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIFRoZSBpbml0aWFsIHNldCBvZiBkYXRhIHRvIHN0b3JlIGluIHRoZSBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7XG4gICAgc3VwZXIoJ19JbnN0YWxsYXRpb24nKTtcbiAgICBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICghdGhpcy5zZXQoYXR0cmlidXRlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIGFuIGludmFsaWQgSW5zdGFsbGF0aW9uXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbGxhdGlvbuKAmXMgY2xpZW50IGFwcGxpY2F0aW9uLiBJbiBpT1MsIHRoaXMgaXMgdGhlIEJ1bmRsZSBJZGVudGlmaWVyLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXBwSWRlbnRpZmllclxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgYXBwSWRlbnRpZmllcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2FwcElkZW50aWZpZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiB0byB3aGljaCB0aGlzIGluc3RhbGxhdGlvbiBiZWxvbmdzLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXBwVmVyc2lvblxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgYXBwVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2FwcFZlcnNpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjbGllbnQgYXBwbGljYXRpb24gdG8gd2hpY2ggdGhpcyBpbnN0YWxsYXRpb24gYmVsb25ncy5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcE5hbWVcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGFwcE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdhcHBOYW1lJyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGljb24gYmFkZ2UgZm9yIGlPUyBhcHBzLlxuICAgKiBDaGFuZ2VzIHRvIHRoaXMgdmFsdWUgb24gdGhlIHNlcnZlciB3aWxsIGJlIHVzZWRcbiAgICogZm9yIGZ1dHVyZSBiYWRnZS1pbmNyZW1lbnQgcHVzaCBub3RpZmljYXRpb25zLlxuICAgKlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gYmFkZ2VcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGJhZGdlKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnYmFkZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiB0aGUgY2hhbm5lbHMgdG8gd2hpY2ggYSBkZXZpY2UgaXMgY3VycmVudGx5IHN1YnNjcmliZWQuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGNoYW5uZWxzXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZ2V0IGNoYW5uZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnY2hhbm5lbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2tlbiB1c2VkIHRvIGRlbGl2ZXIgcHVzaCBub3RpZmljYXRpb25zIHRvIHRoZSBkZXZpY2UuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXZpY2VUb2tlblxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZGV2aWNlVG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdkZXZpY2VUb2tlbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGRldmljZSwg4oCcaW9z4oCdLCDigJxhbmRyb2lk4oCdLCDigJx3ZWLigJ0sIGV0Yy5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGRldmljZVR5cGVcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGRldmljZVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdkZXZpY2VUeXBlJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgR0NNIHNlbmRlciBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbGxhdGlvblxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gR0NNU2VuZGVySWRcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IEdDTVNlbmRlcklkKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnR0NNU2VuZGVySWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllciAoVVVJRCkgZm9yIHRoZSBkZXZpY2UgdXNlZCBieSBQYXJzZS4gSXQgbXVzdCBiZSB1bmlxdWUgYWNyb3NzIGFsbCBvZiBhbiBhcHDigJlzIGluc3RhbGxhdGlvbnMuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsYXRpb25JZFxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW5zdGFsbGF0aW9uSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdpbnN0YWxsYXRpb25JZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxvY2FsIGlkZW50aWZpZXIgZm9yIHRoaXMgaW5zdGFsbGF0aW9uXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsb2NhbGVJZGVudGlmaWVyXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBsb2NhbGVJZGVudGlmaWVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnbG9jYWxlSWRlbnRpZmllcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBhcnNlIHNlcnZlciB2ZXJzaW9uIGZvciB0aGlzIGluc3RhbGxhdGlvblxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcGFyc2VWZXJzaW9uXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBwYXJzZVZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdwYXJzZVZlcnNpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkIGZvciBkaXJlY3RpbmcgUGFyc2UgdG8gdGhlIHB1c2ggZGVsaXZlcnkgbmV0d29yayB0byBiZSB1c2VkLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcHVzaFR5cGVcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHB1c2hUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgncHVzaFR5cGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgZm9yIHRoaXMgaW5zdGFsbGF0aW9uXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lWm9uZVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGltZVpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCd0aW1lWm9uZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRldmljZSB0eXBlcyBmb3IgdXNlZCBmb3IgUHVzaCBOb3RpZmljYXRpb25zLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBQYXJzZS5JbnN0YWxsYXRpb24uREVWSUNFX1RZUEVTLklPU1xuICAgKiBQYXJzZS5JbnN0YWxsYXRpb24uREVWSUNFX1RZUEVTLk1BQ09TXG4gICAqIFBhcnNlLkluc3RhbGxhdGlvbi5ERVZJQ0VfVFlQRVMuVFZPU1xuICAgKiBQYXJzZS5JbnN0YWxsYXRpb24uREVWSUNFX1RZUEVTLkZDTVxuICAgKiBQYXJzZS5JbnN0YWxsYXRpb24uREVWSUNFX1RZUEVTLkFORFJPSURcbiAgICogUGFyc2UuSW5zdGFsbGF0aW9uLkRFVklDRV9UWVBFUy5XRUJcbiAgICogPC9wcmVcbiAgICpcbiAgICogQHByb3BlcnR5IHtvYmplY3R9IERFVklDRV9UWVBFU1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERFVklDRV9UWVBFUygpIHtcbiAgICByZXR1cm4gREVWSUNFX1RZUEVTO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGRlZmF1bHQgZmV0Y2ggYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRvIHVwZGF0ZSBsb2NhbCBzdG9yYWdlLlxuICAgKiBJZiB0aGUgaW5zdGFsbGF0aW9uIGlzIGRlbGV0ZWQgb24gdGhlIHNlcnZlciwgcmV0cnkgdGhlIGZldGNoIGFzIGEgc2F2ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgYXN5bmMgZmV0Y2goKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuZmV0Y2guYXBwbHkodGhpcywgYXJncyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSAhPT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5PQkpFQ1RfTk9UX0ZPVU5EKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5zdGFsbGF0aW9uIHdhcyBkZWxldGVkIGZyb20gdGhlIHNlcnZlci5cbiAgICAgIC8vIFdlIGFsd2F5cyB3YW50IGZldGNoIHRvIHN1Y2NlZWQuXG4gICAgICBkZWxldGUgdGhpcy5pZDtcbiAgICAgIHRoaXMuX2dldElkKCk7IC8vIEdlbmVyYXRlIGxvY2FsSWRcbiAgICAgIHRoaXMuX21hcmtBbGxGaWVsZHNEaXJ0eSgpO1xuICAgICAgYXdhaXQgc3VwZXIuc2F2ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gICAgYXdhaXQgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcigpLnVwZGF0ZUluc3RhbGxhdGlvbk9uRGlzayh0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBkZWZhdWx0IHNhdmUgYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRvIHVwZGF0ZSB0aGUgbG9jYWwgc3RvcmFnZS5cbiAgICogSWYgdGhlIGluc3RhbGxhdGlvbiBpcyBkZWxldGVkIG9uIHRoZSBzZXJ2ZXIsIHJldHJ5IHNhdmluZyBhIG5ldyBpbnN0YWxsYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLnNhdmUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSAhPT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5PQkpFQ1RfTk9UX0ZPVU5EKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5zdGFsbGF0aW9uIHdhcyBkZWxldGVkIGZyb20gdGhlIHNlcnZlci5cbiAgICAgIC8vIFdlIGFsd2F5cyB3YW50IHNhdmUgdG8gc3VjY2VlZC5cbiAgICAgIGRlbGV0ZSB0aGlzLmlkO1xuICAgICAgdGhpcy5fZ2V0SWQoKTsgLy8gR2VuZXJhdGUgbG9jYWxJZFxuICAgICAgdGhpcy5fbWFya0FsbEZpZWxkc0RpcnR5KCk7XG4gICAgICBhd2FpdCBzdXBlci5zYXZlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgICBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCkudXBkYXRlSW5zdGFsbGF0aW9uT25EaXNrKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIF9tYXJrQWxsRmllbGRzRGlydHkoKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgKDAsIF9lbnRyaWVzLmRlZmF1bHQpKHRoaXMuYXR0cmlidXRlcykpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgUGFyc2UuSW5zdGFsbGF0aW9uIGZyb20gZGlzay4gSWYgZG9lc24ndCBleGlzdHMsIGNyZWF0ZSBhbiBuZXcgaW5zdGFsbGF0aW9uLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBjb25zdCBpbnN0YWxsYXRpb24gPSBhd2FpdCBQYXJzZS5JbnN0YWxsYXRpb24uY3VycmVudEluc3RhbGxhdGlvbigpO1xuICAgKiBpbnN0YWxsYXRpb24uc2V0KCdkZXZpY2VUb2tlbicsICcxMjMnKTtcbiAgICogYXdhaXQgaW5zdGFsbGF0aW9uLnNhdmUoKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbG9jYWwgaW5zdGFsbGF0aW9uIG9iamVjdC5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50SW5zdGFsbGF0aW9uKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCkuY3VycmVudEluc3RhbGxhdGlvbigpO1xuICB9XG59XG5fUGFyc2VPYmplY3QuZGVmYXVsdC5yZWdpc3RlclN1YmNsYXNzKCdfSW5zdGFsbGF0aW9uJywgUGFyc2VJbnN0YWxsYXRpb24pO1xubW9kdWxlLmV4cG9ydHMgPSBQYXJzZUluc3RhbGxhdGlvbjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlSW5zdGFsbGF0aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0xpdmVRdWVyeUNsaWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTGl2ZVF1ZXJ5Q2xpZW50XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbmZ1bmN0aW9uIGdldExpdmVRdWVyeUNsaWVudCgpIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExpdmVRdWVyeUNvbnRyb2xsZXIoKS5nZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50KCk7XG59XG5cbi8qKlxuICogV2UgZXhwb3NlIHRocmVlIGV2ZW50cyB0byBoZWxwIHlvdSBtb25pdG9yIHRoZSBzdGF0dXMgb2YgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uOlxuICpcbiAqIDxwPk9wZW4gLSBXaGVuIHdlIGVzdGFibGlzaCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqXG4gKiA8cHJlPlxuICogUGFyc2UuTGl2ZVF1ZXJ5Lm9uKCdvcGVuJywgKCkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiA8cD5DbG9zZSAtIFdoZW4gd2UgbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqXG4gKiA8cHJlPlxuICogUGFyc2UuTGl2ZVF1ZXJ5Lm9uKCdjbG9zZScsICgpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+RXJyb3IgLSBXaGVuIHNvbWUgbmV0d29yayBlcnJvciBvciBMaXZlUXVlcnkgc2VydmVyIGVycm9yIGhhcHBlbnMsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqXG4gKiA8cHJlPlxuICogUGFyc2UuTGl2ZVF1ZXJ5Lm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuTGl2ZVF1ZXJ5XG4gKiBAc3RhdGljXG4gKi9cbmNsYXNzIExpdmVRdWVyeSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJlbWl0dGVyXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiZW1pdFwiLCB2b2lkIDApO1xuICAgIGNvbnN0IEV2ZW50RW1pdHRlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLm9uID0gKGV2ZW50TmFtZSwgbGlzdGVuZXIpID0+IHRoaXMuZW1pdHRlci5vbihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90aGlzLmVtaXR0ZXIuZW1pdChldmVudE5hbWUsIC4uLmFyZ3MpO1xuICAgIH07XG4gICAgLy8gYWRkaW5nIGxpc3RlbmVyIHNvIHByb2Nlc3MgZG9lcyBub3QgY3Jhc2hcbiAgICAvLyBiZXN0IHByYWN0aWNlIGlzIGZvciBkZXZlbG9wZXIgdG8gcmVnaXN0ZXIgdGhlaXIgb3duIGxpc3RlbmVyXG4gICAgdGhpcy5vbignZXJyb3InLCAoKSA9PiB7fSk7XG4gIH1cblxuICAvKipcbiAgICogQWZ0ZXIgb3BlbiBpcyBjYWxsZWQsIHRoZSBMaXZlUXVlcnkgd2lsbCB0cnkgdG8gc2VuZCBhIGNvbm5lY3QgcmVxdWVzdFxuICAgKiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlci5cbiAgICovXG4gIGFzeW5jIG9wZW4oKSB7XG4gICAgY29uc3QgbGl2ZVF1ZXJ5Q2xpZW50ID0gYXdhaXQgZ2V0TGl2ZVF1ZXJ5Q2xpZW50KCk7XG4gICAgbGl2ZVF1ZXJ5Q2xpZW50Lm9wZW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHlvdSdyZSBkb25lIHVzaW5nIExpdmVRdWVyeSwgeW91IGNhbiBjYWxsIFBhcnNlLkxpdmVRdWVyeS5jbG9zZSgpLlxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLFxuICAgKiBjYW5jZWwgdGhlIGF1dG8gcmVjb25uZWN0LCBhbmQgdW5zdWJzY3JpYmUgYWxsIHN1YnNjcmlwdGlvbnMgYmFzZWQgb24gaXQuXG4gICAqIElmIHlvdSBjYWxsIHF1ZXJ5LnN1YnNjcmliZSgpIGFmdGVyIHRoaXMsIHdlJ2xsIGNyZWF0ZSBhIG5ldyBXZWJTb2NrZXRcbiAgICogY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlci5cbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGNvbnN0IGxpdmVRdWVyeUNsaWVudCA9IGF3YWl0IGdldExpdmVRdWVyeUNsaWVudCgpO1xuICAgIGxpdmVRdWVyeUNsaWVudC5jbG9zZSgpO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBMaXZlUXVlcnk7XG5sZXQgZGVmYXVsdExpdmVRdWVyeUNsaWVudDtcbmNvbnN0IERlZmF1bHRMaXZlUXVlcnlDb250cm9sbGVyID0ge1xuICBzZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50KGxpdmVRdWVyeUNsaWVudCkge1xuICAgIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQgPSBsaXZlUXVlcnlDbGllbnQ7XG4gIH0sXG4gIGFzeW5jIGdldERlZmF1bHRMaXZlUXVlcnlDbGllbnQoKSB7XG4gICAgaWYgKGRlZmF1bHRMaXZlUXVlcnlDbGllbnQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50O1xuICAgIH1cbiAgICBjb25zdCBbY3VycmVudFVzZXIsIGluc3RhbGxhdGlvbklkXSA9IGF3YWl0IF9wcm9taXNlLmRlZmF1bHQuYWxsKFtfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpLmN1cnJlbnRVc2VyQXN5bmMoKSwgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcigpLmN1cnJlbnRJbnN0YWxsYXRpb25JZCgpXSk7XG4gICAgY29uc3Qgc2Vzc2lvblRva2VuID0gY3VycmVudFVzZXIgPyBjdXJyZW50VXNlci5nZXRTZXNzaW9uVG9rZW4oKSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgbGl2ZVF1ZXJ5U2VydmVyVVJMID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdMSVZFUVVFUllfU0VSVkVSX1VSTCcpO1xuICAgIGlmIChsaXZlUXVlcnlTZXJ2ZXJVUkwgJiYgKDAsIF9pbmRleE9mLmRlZmF1bHQpKGxpdmVRdWVyeVNlcnZlclVSTCkuY2FsbChsaXZlUXVlcnlTZXJ2ZXJVUkwsICd3cycpICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHNldCBhIHByb3BlciBQYXJzZSBMaXZlUXVlcnkgc2VydmVyIHVybCBiZWZvcmUgdXNpbmcgTGl2ZVF1ZXJ5Q2xpZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgY2FuIG5vdCBmaW5kIFBhcnNlLmxpdmVRdWVyeVNlcnZlclVSTCwgd2UgdHJ5IHRvIGV4dHJhY3QgaXQgZnJvbSBQYXJzZS5zZXJ2ZXJVUkxcbiAgICBpZiAoIWxpdmVRdWVyeVNlcnZlclVSTCkge1xuICAgICAgY29uc3Qgc2VydmVyVVJMID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfVVJMJyk7XG4gICAgICBjb25zdCBwcm90b2NvbCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShzZXJ2ZXJVUkwpLmNhbGwoc2VydmVyVVJMLCAnaHR0cHMnKSA9PT0gMCA/ICd3c3M6Ly8nIDogJ3dzOi8vJztcbiAgICAgIGNvbnN0IGhvc3QgPSBzZXJ2ZXJVUkwucmVwbGFjZSgvXmh0dHBzPzpcXC9cXC8vLCAnJyk7XG4gICAgICBsaXZlUXVlcnlTZXJ2ZXJVUkwgPSBwcm90b2NvbCArIGhvc3Q7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0xJVkVRVUVSWV9TRVJWRVJfVVJMJywgbGl2ZVF1ZXJ5U2VydmVyVVJMKTtcbiAgICB9XG4gICAgY29uc3QgYXBwbGljYXRpb25JZCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQVBQTElDQVRJT05fSUQnKTtcbiAgICBjb25zdCBqYXZhc2NyaXB0S2V5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdKQVZBU0NSSVBUX0tFWScpO1xuICAgIGNvbnN0IG1hc3RlcktleSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTUFTVEVSX0tFWScpO1xuICAgIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQgPSBuZXcgX0xpdmVRdWVyeUNsaWVudC5kZWZhdWx0KHtcbiAgICAgIGFwcGxpY2F0aW9uSWQsXG4gICAgICBzZXJ2ZXJVUkw6IGxpdmVRdWVyeVNlcnZlclVSTCxcbiAgICAgIGphdmFzY3JpcHRLZXksXG4gICAgICBtYXN0ZXJLZXksXG4gICAgICBzZXNzaW9uVG9rZW4sXG4gICAgICBpbnN0YWxsYXRpb25JZFxuICAgIH0pO1xuICAgIGNvbnN0IExpdmVRdWVyeSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExpdmVRdWVyeSgpO1xuICAgIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xuICAgICAgTGl2ZVF1ZXJ5LmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgIH0pO1xuICAgIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQub24oJ29wZW4nLCAoKSA9PiB7XG4gICAgICBMaXZlUXVlcnkuZW1pdCgnb3BlbicpO1xuICAgIH0pO1xuICAgIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgTGl2ZVF1ZXJ5LmVtaXQoJ2Nsb3NlJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQ7XG4gIH0sXG4gIF9jbGVhckNhY2hlZERlZmF1bHRDbGllbnQoKSB7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudCA9IG51bGw7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRMaXZlUXVlcnlDb250cm9sbGVyKERlZmF1bHRMaXZlUXVlcnlDb250cm9sbGVyKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9XZWFrTWFwID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXBcIik7XG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5MihleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfZnJlZXplID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZnJlZXplXCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9nZXRQcm90b3R5cGVPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1wcm90b3R5cGUtb2ZcIikpO1xudmFyIF9jb25jYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2NyZWF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2NyZWF0ZVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKSk7XG52YXIgX2ZpbmQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbmRcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2NhbkJlU2VyaWFsaXplZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vY2FuQmVTZXJpYWxpemVkXCIpKTtcbnZhciBfZGVjb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9lbmNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX2VzY2FwZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZXNjYXBlXCIpKTtcbnZhciBfUGFyc2VBQ0wgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQUNMXCIpKTtcbnZhciBfcGFyc2VEYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZURhdGVcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9wcm9taXNlVXRpbHMgPSByZXF1aXJlKFwiLi9wcm9taXNlVXRpbHNcIik7XG52YXIgX0xvY2FsRGF0YXN0b3JlVXRpbHMgPSByZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZVV0aWxzXCIpO1xudmFyIF91dWlkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dWlkXCIpKTtcbnZhciBfUGFyc2VPcCA9IHJlcXVpcmUoXCIuL1BhcnNlT3BcIik7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xudmFyIFNpbmdsZUluc3RhbmNlU3RhdGVDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vU2luZ2xlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXJcIikpO1xudmFyIF91bmlxdWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VuaXF1ZVwiKSk7XG52YXIgVW5pcXVlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9VbmlxdWVJbnN0YW5jZVN0YXRlQ29udHJvbGxlclwiKSk7XG52YXIgX3Vuc2F2ZWRDaGlsZHJlbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdW5zYXZlZENoaWxkcmVuXCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIF9XZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgdmFyIHIgPSBuZXcgX1dlYWtNYXAoKSxcbiAgICB0ID0gbmV3IF9XZWFrTWFwKCk7XG4gIHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZSA/IHQgOiByO1xuICB9KShlKTtcbn1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKGUsIHIpIHtcbiAgaWYgKCFyICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgZGVmYXVsdDogZVxuICB9O1xuICB2YXIgdCA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShyKTtcbiAgaWYgKHQgJiYgdC5oYXMoZSkpIHJldHVybiB0LmdldChlKTtcbiAgdmFyIG4gPSB7XG4gICAgX19wcm90b19fOiBudWxsXG4gIH07XG4gIGZvciAodmFyIHUgaW4gZSkgaWYgKFwiZGVmYXVsdFwiICE9PSB1ICYmIHt9Lmhhc093blByb3BlcnR5LmNhbGwoZSwgdSkpIHtcbiAgICB2YXIgaSA9IF9PYmplY3QkZGVmaW5lUHJvcGVydHkyICYmIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID8gX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdSkgOiBudWxsO1xuICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IF9PYmplY3QkZGVmaW5lUHJvcGVydHkyKG4sIHUsIGkpIDogblt1XSA9IGVbdV07XG4gIH1cbiAgcmV0dXJuIG4uZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgbiksIG47XG59XG4vLyBNYXBwaW5nIG9mIGNsYXNzIG5hbWVzIHRvIGNvbnN0cnVjdG9ycywgc28gd2UgY2FuIHBvcHVsYXRlIG9iamVjdHMgZnJvbSB0aGVcbi8vIHNlcnZlciB3aXRoIGFwcHJvcHJpYXRlIHN1YmNsYXNzZXMgb2YgUGFyc2VPYmplY3RcbmNvbnN0IGNsYXNzTWFwID0ge307XG5cbi8vIEdsb2JhbCBjb3VudGVyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBJZHMgZm9yIG5vbi1zaW5nbGUtaW5zdGFuY2Ugb2JqZWN0c1xubGV0IG9iamVjdENvdW50ID0gMDtcbi8vIE9uIHdlYiBjbGllbnRzLCBvYmplY3RzIGFyZSBzaW5nbGUtaW5zdGFuY2U6IGFueSB0d28gb2JqZWN0cyB3aXRoIHRoZSBzYW1lIElkXG4vLyB3aWxsIGhhdmUgdGhlIHNhbWUgYXR0cmlidXRlcy4gSG93ZXZlciwgdGhpcyBtYXkgYmUgZGFuZ2Vyb3VzIGRlZmF1bHRcbi8vIGJlaGF2aW9yIGluIGEgc2VydmVyIHNjZW5hcmlvXG5sZXQgc2luZ2xlSW5zdGFuY2UgPSAhX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJU19OT0RFJyk7XG5pZiAoc2luZ2xlSW5zdGFuY2UpIHtcbiAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKFNpbmdsZUluc3RhbmNlU3RhdGVDb250cm9sbGVyKTtcbn0gZWxzZSB7XG4gIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldE9iamVjdFN0YXRlQ29udHJvbGxlcihVbmlxdWVJbnN0YW5jZVN0YXRlQ29udHJvbGxlcik7XG59XG5mdW5jdGlvbiBnZXRTZXJ2ZXJVcmxQYXRoKCkge1xuICBsZXQgc2VydmVyVXJsID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfVVJMJyk7XG4gIGlmIChzZXJ2ZXJVcmxbc2VydmVyVXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcbiAgICBzZXJ2ZXJVcmwgKz0gJy8nO1xuICB9XG4gIGNvbnN0IHVybCA9IHNlcnZlclVybC5yZXBsYWNlKC9odHRwcz86XFwvXFwvLywgJycpO1xuICByZXR1cm4gdXJsLnN1YnN0cigoMCwgX2luZGV4T2YuZGVmYXVsdCkodXJsKS5jYWxsKHVybCwgJy8nKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtb2RlbCB3aXRoIGRlZmluZWQgYXR0cmlidXRlcy5cbiAqXG4gKiA8cD5Zb3Ugd29uJ3Qgbm9ybWFsbHkgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXRcbiAqIHlvdSB1c2UgYSBzdWJjbGFzcyBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+IGluc3RlYWQsIGNyZWF0ZWQgYnkgY2FsbGluZ1xuICogPGNvZGU+ZXh0ZW5kPC9jb2RlPi48L3A+XG4gKlxuICogPHA+SG93ZXZlciwgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIGEgc3ViY2xhc3MsIG9yIGFyZW4ndCBzdXJlIHdoaWNoXG4gKiBzdWJjbGFzcyBpcyBhcHByb3ByaWF0ZSwgeW91IGNhbiB1c2UgdGhpcyBmb3JtOjxwcmU+XG4gKiAgICAgdmFyIG9iamVjdCA9IG5ldyBQYXJzZS5PYmplY3QoXCJDbGFzc05hbWVcIik7XG4gKiA8L3ByZT5cbiAqIFRoYXQgaXMgYmFzaWNhbGx5IGVxdWl2YWxlbnQgdG86PHByZT5cbiAqICAgICB2YXIgTXlDbGFzcyA9IFBhcnNlLk9iamVjdC5leHRlbmQoXCJDbGFzc05hbWVcIik7XG4gKiAgICAgdmFyIG9iamVjdCA9IG5ldyBNeUNsYXNzKCk7XG4gKiA8L3ByZT48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLk9iamVjdFxuICovXG5jbGFzcyBQYXJzZU9iamVjdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lIGZvciB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIFRoZSBpbml0aWFsIHNldCBvZiBkYXRhIHRvIHN0b3JlIGluIHRoZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciB0aGlzIG9iamVjdCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pZ25vcmVWYWxpZGF0aW9uXSBTZXQgdG8gYHRydWVgIGlnbm9yZSBhbnkgYXR0cmlidXRlIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY2xhc3NOYW1lLCBhdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoaXMgb2JqZWN0LCB1bmlxdWUgd2l0aGluIGl0cyBjbGFzcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZFxuICAgICAqL1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiaWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9sb2NhbElkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfb2JqQ291bnRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImNsYXNzTmFtZVwiLCB2b2lkIDApO1xuICAgIC8vIEVuYWJsZSBsZWdhY3kgaW5pdGlhbGl6ZXJzXG4gICAgaWYgKHR5cGVvZiB0aGlzLmluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBsZXQgdG9TZXQgPSBudWxsO1xuICAgIHRoaXMuX29iakNvdW50ID0gb2JqZWN0Q291bnQrKztcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgaWYgKGF0dHJpYnV0ZXMgJiYgdHlwZW9mIGF0dHJpYnV0ZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRvU2V0ID0gYXR0cmlidXRlcztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSAmJiB0eXBlb2YgY2xhc3NOYW1lID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWUuY2xhc3NOYW1lO1xuICAgICAgdG9TZXQgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBjbGFzc05hbWUpIHtcbiAgICAgICAgaWYgKGF0dHIgIT09ICdjbGFzc05hbWUnKSB7XG4gICAgICAgICAgdG9TZXRbYXR0cl0gPSBjbGFzc05hbWVbYXR0cl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRpb25zID0gYXR0cmlidXRlcztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRvU2V0ICYmICF0aGlzLnNldCh0b1NldCwgb3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSBhbiBpbnZhbGlkIFBhcnNlIE9iamVjdFwiKTtcbiAgICB9XG4gIH1cbiAgLyogUHJvdG90eXBlIGdldHRlcnMgLyBzZXR0ZXJzICovXG5cbiAgZ2V0IGF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuICgwLCBfZnJlZXplLmRlZmF1bHQpKHN0YXRlQ29udHJvbGxlci5lc3RpbWF0ZUF0dHJpYnV0ZXModGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgdGltZSB0aGlzIG9iamVjdCB3YXMgc2F2ZWQgb24gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHByb3BlcnR5IHtEYXRlfSBjcmVhdGVkQXRcbiAgICogQHJldHVybnMge0RhdGV9XG4gICAqL1xuICBnZXQgY3JlYXRlZEF0KCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRTZXJ2ZXJEYXRhKCkuY3JlYXRlZEF0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBsYXN0IHRpbWUgdGhpcyBvYmplY3Qgd2FzIHVwZGF0ZWQgb24gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHByb3BlcnR5IHtEYXRlfSB1cGRhdGVkQXRcbiAgICogQHJldHVybnMge0RhdGV9XG4gICAqL1xuICBnZXQgdXBkYXRlZEF0KCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRTZXJ2ZXJEYXRhKCkudXBkYXRlZEF0O1xuICB9XG5cbiAgLyogUHJpdmF0ZSBtZXRob2RzICovXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsb2NhbCBvciBzZXJ2ZXIgSWQgdXNlZCB1bmlxdWVseSBpZGVudGlmeSB0aGlzIG9iamVjdFxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgX2dldElkKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5pZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMuX2xvY2FsSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbG9jYWxJZDtcbiAgICB9XG4gICAgY29uc3QgbG9jYWxJZCA9ICdsb2NhbCcgKyAoMCwgX3V1aWQuZGVmYXVsdCkoKTtcbiAgICB0aGlzLl9sb2NhbElkID0gbG9jYWxJZDtcbiAgICByZXR1cm4gbG9jYWxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgdXNlZCB0byBwdWxsIGRhdGEgZnJvbSB0aGUgU3RhdGUgQ29udHJvbGxlci5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdHxvYmplY3R9XG4gICAqL1xuICBfZ2V0U3RhdGVJZGVudGlmaWVyKCkge1xuICAgIGlmIChzaW5nbGVJbnN0YW5jZSkge1xuICAgICAgbGV0IGlkID0gdGhpcy5pZDtcbiAgICAgIGlmICghaWQpIHtcbiAgICAgICAgaWQgPSB0aGlzLl9nZXRJZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1cbiAgX2dldFNlcnZlckRhdGEoKSB7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIHN0YXRlQ29udHJvbGxlci5nZXRTZXJ2ZXJEYXRhKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgfVxuICBfY2xlYXJTZXJ2ZXJEYXRhKCkge1xuICAgIGNvbnN0IHNlcnZlckRhdGEgPSB0aGlzLl9nZXRTZXJ2ZXJEYXRhKCk7XG4gICAgY29uc3QgdW5zZXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gc2VydmVyRGF0YSkge1xuICAgICAgdW5zZXRbYXR0cl0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIHN0YXRlQ29udHJvbGxlci5zZXRTZXJ2ZXJEYXRhKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpLCB1bnNldCk7XG4gIH1cbiAgX2dldFBlbmRpbmdPcHMoKSB7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIHN0YXRlQ29udHJvbGxlci5nZXRQZW5kaW5nT3BzKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtrZXlzVG9DbGVhcl0gLSBpZiBzcGVjaWZpZWQsIG9ubHkgb3BzIG1hdGNoaW5nXG4gICAqIHRoZXNlIGZpZWxkcyB3aWxsIGJlIGNsZWFyZWRcbiAgICovXG4gIF9jbGVhclBlbmRpbmdPcHMoa2V5c1RvQ2xlYXIpIHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGNvbnN0IGxhdGVzdCA9IHBlbmRpbmdbcGVuZGluZy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBrZXlzID0ga2V5c1RvQ2xlYXIgfHwgKDAsIF9rZXlzLmRlZmF1bHQpKGxhdGVzdCk7XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIGRlbGV0ZSBsYXRlc3Rba2V5XTtcbiAgICB9KTtcbiAgfVxuICBfZ2V0RGlydHlPYmplY3RBdHRyaWJ1dGVzKCkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgb2JqZWN0Q2FjaGUgPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0T2JqZWN0Q2FjaGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgIGNvbnN0IGRpcnR5ID0ge307XG4gICAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IGF0dHJpYnV0ZXNbYXR0cl07XG4gICAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICEodmFsIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpICYmICEodmFsIGluc3RhbmNlb2YgX1BhcnNlRmlsZS5kZWZhdWx0KSAmJiAhKHZhbCBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpKSB7XG4gICAgICAgIC8vIER1ZSB0byB0aGUgd2F5IGJyb3dzZXJzIGNvbnN0cnVjdCBtYXBzLCB0aGUga2V5IG9yZGVyIHdpbGwgbm90IGNoYW5nZVxuICAgICAgICAvLyB1bmxlc3MgdGhlIG9iamVjdCBpcyBjaGFuZ2VkXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QganNvbiA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHZhbCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoanNvbik7XG4gICAgICAgICAgaWYgKG9iamVjdENhY2hlW2F0dHJdICE9PSBzdHJpbmdpZmllZCkge1xuICAgICAgICAgICAgZGlydHlbYXR0cl0gPSB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gRXJyb3Igb2NjdXJyZWQsIHBvc3NpYmx5IGJ5IGEgbmVzdGVkIHVuc2F2ZWQgcG9pbnRlciBpbiBhIG11dGFibGUgY29udGFpbmVyXG4gICAgICAgICAgLy8gTm8gbWF0dGVyIGhvdyBpdCBoYXBwZW5lZCwgaXQgaW5kaWNhdGVzIGEgY2hhbmdlIGluIHRoZSBhdHRyaWJ1dGVcbiAgICAgICAgICBkaXJ0eVthdHRyXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlydHk7XG4gIH1cbiAgX3RvRnVsbEpTT04oc2Vlbiwgb2ZmbGluZSkge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTihzZWVuLCBvZmZsaW5lKTtcbiAgICBqc29uLl9fdHlwZSA9ICdPYmplY3QnO1xuICAgIGpzb24uY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWU7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgX2dldFNhdmVKU09OKCkge1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgY29uc3QgZGlydHlPYmplY3RzID0gdGhpcy5fZ2V0RGlydHlPYmplY3RBdHRyaWJ1dGVzKCk7XG4gICAgY29uc3QganNvbiA9IHt9O1xuICAgIGZvciAodmFyIGF0dHIgaW4gZGlydHlPYmplY3RzKSB7XG4gICAgICBsZXQgaXNEb3ROb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwZW5kaW5nLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gcGVuZGluZ1tpXSkge1xuICAgICAgICAgIC8vIERvdCBub3RhdGlvbiBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGxhdGVyXG4gICAgICAgICAgaWYgKCgwLCBfaW5jbHVkZXMuZGVmYXVsdCkoZmllbGQpLmNhbGwoZmllbGQsICcuJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGZpZWxkLnNwbGl0KCcuJylbMF07XG4gICAgICAgICAgICBpZiAoZmllbGROYW1lID09PSBhdHRyKSB7XG4gICAgICAgICAgICAgIGlzRG90Tm90YXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNEb3ROb3RhdGlvbikge1xuICAgICAgICBqc29uW2F0dHJdID0gbmV3IF9QYXJzZU9wLlNldE9wKGRpcnR5T2JqZWN0c1thdHRyXSkudG9KU09OKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoYXR0ciBpbiBwZW5kaW5nWzBdKSB7XG4gICAgICBqc29uW2F0dHJdID0gcGVuZGluZ1swXVthdHRyXS50b0pTT04oKTtcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgX2dldFNhdmVQYXJhbXMoKSB7XG4gICAgbGV0IG1ldGhvZCA9IHRoaXMuaWQgPyAnUFVUJyA6ICdQT1NUJztcbiAgICBjb25zdCBib2R5ID0gdGhpcy5fZ2V0U2F2ZUpTT04oKTtcbiAgICBsZXQgcGF0aCA9ICdjbGFzc2VzLycgKyB0aGlzLmNsYXNzTmFtZTtcbiAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBTExPV19DVVNUT01fT0JKRUNUX0lEJykpIHtcbiAgICAgIGlmICghdGhpcy5jcmVhdGVkQXQpIHtcbiAgICAgICAgbWV0aG9kID0gJ1BPU1QnO1xuICAgICAgICBib2R5Lm9iamVjdElkID0gdGhpcy5pZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGhvZCA9ICdQVVQnO1xuICAgICAgICBwYXRoICs9ICcvJyArIHRoaXMuaWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlkKSB7XG4gICAgICBwYXRoICs9ICcvJyArIHRoaXMuaWQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgICAgcGF0aCA9ICd1c2Vycyc7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBtZXRob2QsXG4gICAgICBib2R5LFxuICAgICAgcGF0aFxuICAgIH07XG4gIH1cbiAgX2ZpbmlzaEZldGNoKHNlcnZlckRhdGEpIHtcbiAgICBpZiAoIXRoaXMuaWQgJiYgc2VydmVyRGF0YS5vYmplY3RJZCkge1xuICAgICAgdGhpcy5pZCA9IHNlcnZlckRhdGEub2JqZWN0SWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIHN0YXRlQ29udHJvbGxlci5pbml0aWFsaXplU3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgIGNvbnN0IGRlY29kZWQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gc2VydmVyRGF0YSkge1xuICAgICAgaWYgKGF0dHIgPT09ICdBQ0wnKSB7XG4gICAgICAgIGRlY29kZWRbYXR0cl0gPSBuZXcgX1BhcnNlQUNMLmRlZmF1bHQoc2VydmVyRGF0YVthdHRyXSk7XG4gICAgICB9IGVsc2UgaWYgKGF0dHIgIT09ICdvYmplY3RJZCcpIHtcbiAgICAgICAgZGVjb2RlZFthdHRyXSA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKHNlcnZlckRhdGFbYXR0cl0pO1xuICAgICAgICBpZiAoZGVjb2RlZFthdHRyXSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICAgICAgICBkZWNvZGVkW2F0dHJdLl9lbnN1cmVQYXJlbnRBbmRLZXkodGhpcywgYXR0cik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlY29kZWQuY3JlYXRlZEF0ICYmIHR5cGVvZiBkZWNvZGVkLmNyZWF0ZWRBdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRlY29kZWQuY3JlYXRlZEF0ID0gKDAsIF9wYXJzZURhdGUuZGVmYXVsdCkoZGVjb2RlZC5jcmVhdGVkQXQpO1xuICAgIH1cbiAgICBpZiAoZGVjb2RlZC51cGRhdGVkQXQgJiYgdHlwZW9mIGRlY29kZWQudXBkYXRlZEF0ID09PSAnc3RyaW5nJykge1xuICAgICAgZGVjb2RlZC51cGRhdGVkQXQgPSAoMCwgX3BhcnNlRGF0ZS5kZWZhdWx0KShkZWNvZGVkLnVwZGF0ZWRBdCk7XG4gICAgfVxuICAgIGlmICghZGVjb2RlZC51cGRhdGVkQXQgJiYgZGVjb2RlZC5jcmVhdGVkQXQpIHtcbiAgICAgIGRlY29kZWQudXBkYXRlZEF0ID0gZGVjb2RlZC5jcmVhdGVkQXQ7XG4gICAgfVxuICAgIHN0YXRlQ29udHJvbGxlci5jb21taXRTZXJ2ZXJDaGFuZ2VzKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpLCBkZWNvZGVkKTtcbiAgfVxuICBfc2V0RXhpc3RlZChleGlzdGVkKSB7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgc3RhdGUgPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgc3RhdGUuZXhpc3RlZCA9IGV4aXN0ZWQ7XG4gICAgfVxuICB9XG4gIF9taWdyYXRlSWQoc2VydmVySWQpIHtcbiAgICBpZiAodGhpcy5fbG9jYWxJZCAmJiBzZXJ2ZXJJZCkge1xuICAgICAgaWYgKHNpbmdsZUluc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgICAgICBjb25zdCBvbGRTdGF0ZSA9IHN0YXRlQ29udHJvbGxlci5yZW1vdmVTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgICAgIHRoaXMuaWQgPSBzZXJ2ZXJJZDtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xvY2FsSWQ7XG4gICAgICAgIGlmIChvbGRTdGF0ZSkge1xuICAgICAgICAgIHN0YXRlQ29udHJvbGxlci5pbml0aWFsaXplU3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIG9sZFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pZCA9IHNlcnZlcklkO1xuICAgICAgICBkZWxldGUgdGhpcy5fbG9jYWxJZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2hhbmRsZVNhdmVSZXNwb25zZShyZXNwb25zZSwgc3RhdHVzKSB7XG4gICAgY29uc3QgY2hhbmdlcyA9IHt9O1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBlbmRpbmcgPSBzdGF0ZUNvbnRyb2xsZXIucG9wUGVuZGluZ1N0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICBmb3IgKHZhciBhdHRyIGluIHBlbmRpbmcpIHtcbiAgICAgIGlmIChwZW5kaW5nW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlT3AuUmVsYXRpb25PcCkge1xuICAgICAgICBjaGFuZ2VzW2F0dHJdID0gcGVuZGluZ1thdHRyXS5hcHBseVRvKHVuZGVmaW5lZCwgdGhpcywgYXR0cik7XG4gICAgICB9IGVsc2UgaWYgKCEoYXR0ciBpbiByZXNwb25zZSkpIHtcbiAgICAgICAgLy8gT25seSBTZXRPcHMgYW5kIFVuc2V0T3BzIHNob3VsZCBub3QgY29tZSBiYWNrIHdpdGggcmVzdWx0c1xuICAgICAgICBjaGFuZ2VzW2F0dHJdID0gcGVuZGluZ1thdHRyXS5hcHBseVRvKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoYXR0ciBpbiByZXNwb25zZSkge1xuICAgICAgaWYgKChhdHRyID09PSAnY3JlYXRlZEF0JyB8fCBhdHRyID09PSAndXBkYXRlZEF0JykgJiYgdHlwZW9mIHJlc3BvbnNlW2F0dHJdID09PSAnc3RyaW5nJykge1xuICAgICAgICBjaGFuZ2VzW2F0dHJdID0gKDAsIF9wYXJzZURhdGUuZGVmYXVsdCkocmVzcG9uc2VbYXR0cl0pO1xuICAgICAgfSBlbHNlIGlmIChhdHRyID09PSAnQUNMJykge1xuICAgICAgICBjaGFuZ2VzW2F0dHJdID0gbmV3IF9QYXJzZUFDTC5kZWZhdWx0KHJlc3BvbnNlW2F0dHJdKTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0ciAhPT0gJ29iamVjdElkJykge1xuICAgICAgICBjb25zdCB2YWwgPSAoMCwgX2RlY29kZS5kZWZhdWx0KShyZXNwb25zZVthdHRyXSk7XG4gICAgICAgIGlmICh2YWwgJiYgKDAsIF9nZXRQcm90b3R5cGVPZi5kZWZhdWx0KSh2YWwpID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgICAgY2hhbmdlc1thdHRyXSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuYXR0cmlidXRlc1thdHRyXSxcbiAgICAgICAgICAgIC4uLnZhbFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhbmdlc1thdHRyXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1thdHRyXSBpbnN0YW5jZW9mIF9QYXJzZU9wLlVuc2V0T3ApIHtcbiAgICAgICAgICBjaGFuZ2VzW2F0dHJdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmNyZWF0ZWRBdCAmJiAhY2hhbmdlcy51cGRhdGVkQXQpIHtcbiAgICAgIGNoYW5nZXMudXBkYXRlZEF0ID0gY2hhbmdlcy5jcmVhdGVkQXQ7XG4gICAgfVxuICAgIHRoaXMuX21pZ3JhdGVJZChyZXNwb25zZS5vYmplY3RJZCk7XG4gICAgaWYgKHN0YXR1cyAhPT0gMjAxKSB7XG4gICAgICB0aGlzLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgIH1cbiAgICBzdGF0ZUNvbnRyb2xsZXIuY29tbWl0U2VydmVyQ2hhbmdlcyh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgY2hhbmdlcyk7XG4gIH1cbiAgX2hhbmRsZVNhdmVFcnJvcigpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBzdGF0ZUNvbnRyb2xsZXIubWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gIH1cbiAgc3RhdGljIF9nZXRDbGFzc01hcCgpIHtcbiAgICByZXR1cm4gY2xhc3NNYXA7XG4gIH1cblxuICAvKiBQdWJsaWMgbWV0aG9kcyAqL1xuXG4gIGluaXRpYWxpemUoKSB7XG4gICAgLy8gTk9PUFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OIHZlcnNpb24gb2YgdGhlIG9iamVjdCBzdWl0YWJsZSBmb3Igc2F2aW5nIHRvIFBhcnNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2VlblxuICAgKiBAcGFyYW0gb2ZmbGluZVxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKHNlZW4sIG9mZmxpbmUpIHtcbiAgICBjb25zdCBzZWVuRW50cnkgPSB0aGlzLmlkID8gdGhpcy5jbGFzc05hbWUgKyAnOicgKyB0aGlzLmlkIDogdGhpcztcbiAgICBzZWVuID0gc2VlbiB8fCBbc2VlbkVudHJ5XTtcbiAgICBjb25zdCBqc29uID0ge307XG4gICAgY29uc3QgYXR0cnMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJzKSB7XG4gICAgICBpZiAoKGF0dHIgPT09ICdjcmVhdGVkQXQnIHx8IGF0dHIgPT09ICd1cGRhdGVkQXQnKSAmJiBhdHRyc1thdHRyXS50b0pTT04pIHtcbiAgICAgICAganNvblthdHRyXSA9IGF0dHJzW2F0dHJdLnRvSlNPTigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvblthdHRyXSA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKGF0dHJzW2F0dHJdLCBmYWxzZSwgZmFsc2UsIHNlZW4sIG9mZmxpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBwZW5kaW5nWzBdKSB7XG4gICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKGF0dHIpLmNhbGwoYXR0ciwgJy4nKSA8IDApIHtcbiAgICAgICAganNvblthdHRyXSA9IHBlbmRpbmdbMF1bYXR0cl0udG9KU09OKG9mZmxpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5pZCkge1xuICAgICAganNvbi5vYmplY3RJZCA9IHRoaXMuaWQ7XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGlzIFBhcnNlT2JqZWN0IGlzIGVxdWFsIHRvIGFub3RoZXIgUGFyc2VPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG90aGVyIC0gQW4gb3RoZXIgb2JqZWN0IG90IGNvbXBhcmVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAodGhpcyA9PT0gb3RoZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCAmJiB0aGlzLmNsYXNzTmFtZSA9PT0gb3RoZXIuY2xhc3NOYW1lICYmIHRoaXMuaWQgPT09IG90aGVyLmlkICYmIHR5cGVvZiB0aGlzLmlkICE9PSAndW5kZWZpbmVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGxhc3RcbiAgICogc2F2ZS9yZWZyZXNoLiAgSWYgYW4gYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgaXQgcmV0dXJucyB0cnVlIG9ubHkgaWYgdGhhdFxuICAgKiBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBzYXZlL3JlZnJlc2guXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIEFuIGF0dHJpYnV0ZSBuYW1lIChvcHRpb25hbCkuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZGlydHkoYXR0cikge1xuICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmdPcHMgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgY29uc3QgZGlydHlPYmplY3RzID0gdGhpcy5fZ2V0RGlydHlPYmplY3RBdHRyaWJ1dGVzKCk7XG4gICAgaWYgKGF0dHIpIHtcbiAgICAgIGlmIChkaXJ0eU9iamVjdHMuaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmdPcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBlbmRpbmdPcHNbaV0uaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoKDAsIF9rZXlzLmRlZmF1bHQpKHBlbmRpbmdPcHNbMF0pLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICgoMCwgX2tleXMuZGVmYXVsdCkoZGlydHlPYmplY3RzKS5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBrZXlzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGxhc3Qgc2F2ZS9yZWZyZXNoXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGRpcnR5S2V5cygpIHtcbiAgICBjb25zdCBwZW5kaW5nT3BzID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGNvbnN0IGtleXMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmdPcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBwZW5kaW5nT3BzW2ldKSB7XG4gICAgICAgIGtleXNbYXR0cl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaXJ0eU9iamVjdHMgPSB0aGlzLl9nZXREaXJ0eU9iamVjdEF0dHJpYnV0ZXMoKTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gZGlydHlPYmplY3RzKSB7XG4gICAgICBrZXlzW2F0dHJdID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBfa2V5cy5kZWZhdWx0KShrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBmZXRjaGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzRGF0YUF2YWlsYWJsZSgpIHtcbiAgICBjb25zdCBzZXJ2ZXJEYXRhID0gdGhpcy5fZ2V0U2VydmVyRGF0YSgpO1xuICAgIHJldHVybiAhISgwLCBfa2V5cy5kZWZhdWx0KShzZXJ2ZXJEYXRhKS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIFBvaW50ZXIgcmVmZXJlbmNpbmcgdGhpcyBPYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQb2ludGVyfVxuICAgKi9cbiAgdG9Qb2ludGVyKCkge1xuICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGEgcG9pbnRlciB0byBhbiB1bnNhdmVkIFBhcnNlT2JqZWN0Jyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogdGhpcy5pZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIFBvaW50ZXIgcmVmZXJlbmNpbmcgdGhpcyBPYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQb2ludGVyfVxuICAgKi9cbiAgdG9PZmZsaW5lUG9pbnRlcigpIHtcbiAgICBpZiAoIXRoaXMuX2xvY2FsSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBhIG9mZmxpbmUgcG9pbnRlciB0byBhIHNhdmVkIFBhcnNlT2JqZWN0Jyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdPYmplY3QnLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIF9sb2NhbElkOiB0aGlzLl9sb2NhbElkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBzdHJpbmcgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZ2V0KGF0dHIpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2F0dHJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWxhdGlvbiBvbiB0aGUgZ2l2ZW4gY2xhc3MgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBhdHRyaWJ1dGUgdG8gZ2V0IHRoZSByZWxhdGlvbiBmb3IuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5SZWxhdGlvbn1cbiAgICovXG4gIHJlbGF0aW9uKGF0dHIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KGF0dHIpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxlZCByZWxhdGlvbigpIG9uIG5vbi1yZWxhdGlvbiBmaWVsZCAnICsgYXR0cik7XG4gICAgICB9XG4gICAgICB2YWx1ZS5fZW5zdXJlUGFyZW50QW5kS2V5KHRoaXMsIGF0dHIpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQodGhpcywgYXR0cik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgSFRNTC1lc2NhcGVkIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIHN0cmluZyBuYW1lIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGVzY2FwZShhdHRyKSB7XG4gICAgbGV0IHZhbCA9IHRoaXMuYXR0cmlidXRlc1thdHRyXTtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbC50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICB2YWwgPSB2YWwudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBfZXNjYXBlLmRlZmF1bHQpKHZhbCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIGNvbnRhaW5zIGEgdmFsdWUgdGhhdCBpcyBub3RcbiAgICogbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGhhcyhhdHRyKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNbYXR0cl0gIT0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBoYXNoIG9mIG1vZGVsIGF0dHJpYnV0ZXMgb24gdGhlIG9iamVjdC5cbiAgICpcbiAgICogPHA+WW91IGNhbiBjYWxsIGl0IHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcga2V5cyBhbmQgdmFsdWVzLCB3aXRoIG9uZVxuICAgKiBrZXkgYW5kIHZhbHVlLCBvciBkb3Qgbm90YXRpb24uICBGb3IgZXhhbXBsZTo8cHJlPlxuICAgKiAgIGdhbWVUdXJuLnNldCh7XG4gICAqICAgICBwbGF5ZXI6IHBsYXllcjEsXG4gICAqICAgICBkaWNlUm9sbDogMlxuICAgKiAgIH0sIHtcbiAgICogICAgIGVycm9yOiBmdW5jdGlvbihnYW1lVHVybkFnYWluLCBlcnJvcikge1xuICAgKiAgICAgICAvLyBUaGUgc2V0IGZhaWxlZCB2YWxpZGF0aW9uLlxuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIGdhbWUuc2V0KFwiY3VycmVudFBsYXllclwiLCBwbGF5ZXIyLCB7XG4gICAqICAgICBlcnJvcjogZnVuY3Rpb24oZ2FtZVR1cm5BZ2FpbiwgZXJyb3IpIHtcbiAgICogICAgICAgLy8gVGhlIHNldCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICogICAgIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogICBnYW1lLnNldChcImZpbmlzaGVkXCIsIHRydWUpOzwvcHJlPjwvcD5cbiAgICpcbiAgICogICBnYW1lLnNldChcInBsYXllci5zY29yZVwiLCAxMCk7PC9wcmU+PC9wPlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8b2JqZWN0KX0ga2V5IFRoZSBrZXkgdG8gc2V0LlxuICAgKiBAcGFyYW0geyhzdHJpbmd8b2JqZWN0KX0gdmFsdWUgVGhlIHZhbHVlIHRvIGdpdmUgaXQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIEEgc2V0IG9mIG9wdGlvbnMgZm9yIHRoZSBzZXQuXG4gICAqICAgICBUaGUgb25seSBzdXBwb3J0ZWQgb3B0aW9uIGlzIDxjb2RlPmVycm9yPC9jb2RlPi5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdHxib29sZWFuKX0gdHJ1ZSBpZiB0aGUgc2V0IHN1Y2NlZWRlZC5cbiAgICovXG4gIHNldChrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgbGV0IGNoYW5nZXMgPSB7fTtcbiAgICBjb25zdCBuZXdPcHMgPSB7fTtcbiAgICBpZiAoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICBjaGFuZ2VzID0ga2V5O1xuICAgICAgb3B0aW9ucyA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNoYW5nZXNba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgbGV0IHJlYWRvbmx5ID0gW107XG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVhZG9ubHkgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShyZWFkb25seSkuY2FsbChyZWFkb25seSwgdGhpcy5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMoKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgayBpbiBjaGFuZ2VzKSB7XG4gICAgICBpZiAoayA9PT0gJ2NyZWF0ZWRBdCcgfHwgayA9PT0gJ3VwZGF0ZWRBdCcpIHtcbiAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBpcyByZWFkLW9ubHksIGJ1dCBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc2lsZW50bHlcbiAgICAgICAgLy8gaWdub3JlIGl0XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShyZWFkb25seSkuY2FsbChyZWFkb25seSwgaykgPiAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtb2RpZnkgcmVhZG9ubHkgYXR0cmlidXRlOiAnICsgayk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy51bnNldCkge1xuICAgICAgICBuZXdPcHNba10gPSBuZXcgX1BhcnNlT3AuVW5zZXRPcCgpO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzW2tdIGluc3RhbmNlb2YgX1BhcnNlT3AuT3ApIHtcbiAgICAgICAgbmV3T3BzW2tdID0gY2hhbmdlc1trXTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlc1trXSAmJiB0eXBlb2YgY2hhbmdlc1trXSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGNoYW5nZXNba10uX19vcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmV3T3BzW2tdID0gKDAsIF9QYXJzZU9wLm9wRnJvbUpTT04pKGNoYW5nZXNba10pO1xuICAgICAgfSBlbHNlIGlmIChrID09PSAnb2JqZWN0SWQnIHx8IGsgPT09ICdpZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGFuZ2VzW2tdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMuaWQgPSBjaGFuZ2VzW2tdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGsgPT09ICdBQ0wnICYmIHR5cGVvZiBjaGFuZ2VzW2tdID09PSAnb2JqZWN0JyAmJiAhKGNoYW5nZXNba10gaW5zdGFuY2VvZiBfUGFyc2VBQ0wuZGVmYXVsdCkpIHtcbiAgICAgICAgbmV3T3BzW2tdID0gbmV3IF9QYXJzZU9wLlNldE9wKG5ldyBfUGFyc2VBQ0wuZGVmYXVsdChjaGFuZ2VzW2tdKSk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXNba10gaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uID0gbmV3IF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQodGhpcywgayk7XG4gICAgICAgIHJlbGF0aW9uLnRhcmdldENsYXNzTmFtZSA9IGNoYW5nZXNba10udGFyZ2V0Q2xhc3NOYW1lO1xuICAgICAgICBuZXdPcHNba10gPSBuZXcgX1BhcnNlT3AuU2V0T3AocmVsYXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3T3BzW2tdID0gbmV3IF9QYXJzZU9wLlNldE9wKGNoYW5nZXNba10pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjdXJyZW50QXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgdmFsdWVzXG4gICAgY29uc3QgbmV3VmFsdWVzID0ge307XG4gICAgZm9yIChjb25zdCBhdHRyIGluIG5ld09wcykge1xuICAgICAgaWYgKG5ld09wc1thdHRyXSBpbnN0YW5jZW9mIF9QYXJzZU9wLlJlbGF0aW9uT3ApIHtcbiAgICAgICAgbmV3VmFsdWVzW2F0dHJdID0gbmV3T3BzW2F0dHJdLmFwcGx5VG8oY3VycmVudEF0dHJpYnV0ZXNbYXR0cl0sIHRoaXMsIGF0dHIpO1xuICAgICAgfSBlbHNlIGlmICghKG5ld09wc1thdHRyXSBpbnN0YW5jZW9mIF9QYXJzZU9wLlVuc2V0T3ApKSB7XG4gICAgICAgIG5ld1ZhbHVlc1thdHRyXSA9IG5ld09wc1thdHRyXS5hcHBseVRvKGN1cnJlbnRBdHRyaWJ1dGVzW2F0dHJdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjaGFuZ2VzXG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZVZhbGlkYXRpb24pIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlKG5ld1ZhbHVlcyk7XG4gICAgICBpZiAodmFsaWRhdGlvbikge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvcHRpb25zLmVycm9yKHRoaXMsIHZhbGlkYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb25zb2xpZGF0ZSBPcHNcbiAgICBjb25zdCBwZW5kaW5nT3BzID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGNvbnN0IGxhc3QgPSBwZW5kaW5nT3BzLmxlbmd0aCAtIDE7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgZm9yIChjb25zdCBhdHRyIGluIG5ld09wcykge1xuICAgICAgY29uc3QgbmV4dE9wID0gbmV3T3BzW2F0dHJdLm1lcmdlV2l0aChwZW5kaW5nT3BzW2xhc3RdW2F0dHJdKTtcbiAgICAgIHN0YXRlQ29udHJvbGxlci5zZXRQZW5kaW5nT3AodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIGF0dHIsIG5leHRPcCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgbW9kZWwuIFRoaXMgaXMgYSBub29wIGlmIHRoZSBhdHRyaWJ1dGUgZG9lc24ndFxuICAgKiBleGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIHN0cmluZyBuYW1lIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgdW5zZXQoYXR0ciwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMudW5zZXQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBudWxsLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdGhlIG5leHQgdGltZSB0aGVcbiAgICogb2JqZWN0IGlzIHNhdmVkLiBJZiBubyBhbW91bnQgaXMgc3BlY2lmaWVkLCAxIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGFtb3VudCB7TnVtYmVyfSBUaGUgYW1vdW50IHRvIGluY3JlbWVudCBieSAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0fGJvb2xlYW4pfVxuICAgKi9cbiAgaW5jcmVtZW50KGF0dHIsIGFtb3VudCkge1xuICAgIGlmICh0eXBlb2YgYW1vdW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgYW1vdW50ID0gMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbmNyZW1lbnQgYnkgYSBub24tbnVtZXJpYyBhbW91bnQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuSW5jcmVtZW50T3AoYW1vdW50KSk7XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSBkZWNyZW1lbnRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHRoZSBuZXh0IHRpbWUgdGhlXG4gICAqIG9iamVjdCBpcyBzYXZlZC4gSWYgbm8gYW1vdW50IGlzIHNwZWNpZmllZCwgMSBpcyB1c2VkIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBhbW91bnQge051bWJlcn0gVGhlIGFtb3VudCB0byBkZWNyZW1lbnQgYnkgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgZGVjcmVtZW50KGF0dHIsIGFtb3VudCkge1xuICAgIGlmICh0eXBlb2YgYW1vdW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgYW1vdW50ID0gMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBkZWNyZW1lbnQgYnkgYSBub24tbnVtZXJpYyBhbW91bnQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuSW5jcmVtZW50T3AoYW1vdW50ICogLTEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGFkZCBhbiBvYmplY3QgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW5cbiAgICoga2V5LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gaXRlbSB7fSBUaGUgaXRlbSB0byBhZGQuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIGFkZChhdHRyLCBpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5BZGRPcChbaXRlbV0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGFkZCB0aGUgb2JqZWN0cyB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICAgKiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBpdGVtcyB7T2JqZWN0W119IFRoZSBpdGVtcyB0byBhZGQuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIGFkZEFsbChhdHRyLCBpdGVtcykge1xuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuQWRkT3AoaXRlbXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGFkZCBhbiBvYmplY3QgdG8gdGhlIGFycmF5IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleSwgb25seVxuICAgKiBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBhcnJheS4gVGhlIHBvc2l0aW9uIG9mIHRoZSBpbnNlcnQgaXNcbiAgICogbm90IGd1YXJhbnRlZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBpdGVtIHt9IFRoZSBvYmplY3QgdG8gYWRkLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICBhZGRVbmlxdWUoYXR0ciwgaXRlbSkge1xuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuQWRkVW5pcXVlT3AoW2l0ZW1dKSk7XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSBhZGQgdGhlIG9iamVjdHMgdG8gdGhlIGFycmF5IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleSwgb25seVxuICAgKiBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBhcnJheS4gVGhlIHBvc2l0aW9uIG9mIHRoZSBpbnNlcnQgaXNcbiAgICogbm90IGd1YXJhbnRlZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBpdGVtcyB7T2JqZWN0W119IFRoZSBvYmplY3RzIHRvIGFkZC5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgYWRkQWxsVW5pcXVlKGF0dHIsIGl0ZW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5BZGRVbmlxdWVPcChpdGVtcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgcmVtb3ZlIGFsbCBpbnN0YW5jZXMgb2YgYW4gb2JqZWN0IGZyb20gdGhlIGFycmF5IGFzc29jaWF0ZWRcbiAgICogd2l0aCBhIGdpdmVuIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGl0ZW0ge30gVGhlIG9iamVjdCB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIHJlbW92ZShhdHRyLCBpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5SZW1vdmVPcChbaXRlbV0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IHJlbW92ZSBhbGwgaW5zdGFuY2VzIG9mIHRoZSBvYmplY3RzIGZyb20gdGhlIGFycmF5IGFzc29jaWF0ZWRcbiAgICogd2l0aCBhIGdpdmVuIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGl0ZW1zIHtPYmplY3RbXX0gVGhlIG9iamVjdCB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIHJlbW92ZUFsbChhdHRyLCBpdGVtcykge1xuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuUmVtb3ZlT3AoaXRlbXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgUGFyc2UuT3AgZGVzY3JpYmluZyB3aGF0IGtpbmQgb2ZcbiAgICogbW9kaWZpY2F0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZCBvbiB0aGlzIGZpZWxkIHNpbmNlIHRoZSBsYXN0IHRpbWUgaXQgd2FzXG4gICAqIHNhdmVkLiBGb3IgZXhhbXBsZSwgYWZ0ZXIgY2FsbGluZyBvYmplY3QuaW5jcmVtZW50KFwieFwiKSwgY2FsbGluZ1xuICAgKiBvYmplY3Qub3AoXCJ4XCIpIHdvdWxkIHJldHVybiBhbiBpbnN0YW5jZSBvZiBQYXJzZS5PcC5JbmNyZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PcCB8IHVuZGVmaW5lZH0gVGhlIG9wZXJhdGlvbiwgb3IgdW5kZWZpbmVkIGlmIG5vbmUuXG4gICAqL1xuICBvcChhdHRyKSB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMuX2dldFBlbmRpbmdPcHMoKTtcbiAgICBmb3IgKGxldCBpID0gcGVuZGluZy5sZW5ndGg7IGktLTspIHtcbiAgICAgIGlmIChwZW5kaW5nW2ldW2F0dHJdKSB7XG4gICAgICAgIHJldHVybiBwZW5kaW5nW2ldW2F0dHJdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IG1vZGVsIHdpdGggaWRlbnRpY2FsIGF0dHJpYnV0ZXMgdG8gdGhpcyBvbmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9XG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICBjb25zdCBjbG9uZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuY2xhc3NOYW1lKTtcbiAgICBsZXQgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uc3RydWN0b3IucmVhZE9ubHlBdHRyaWJ1dGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCByZWFkb25seSA9IHRoaXMuY29uc3RydWN0b3IucmVhZE9ubHlBdHRyaWJ1dGVzKCkgfHwgW107XG4gICAgICAvLyBBdHRyaWJ1dGVzIGFyZSBmcm96ZW4sIHNvIHdlIGhhdmUgdG8gcmVidWlsZCBhbiBvYmplY3QsXG4gICAgICAvLyByYXRoZXIgdGhhbiBkZWxldGUgcmVhZG9ubHkga2V5c1xuICAgICAgY29uc3QgY29weSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBhIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShyZWFkb25seSkuY2FsbChyZWFkb25seSwgYSkgPCAwKSB7XG4gICAgICAgICAgY29weVthXSA9IGF0dHJpYnV0ZXNbYV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF0dHJpYnV0ZXMgPSBjb3B5O1xuICAgIH1cbiAgICBpZiAoY2xvbmUuc2V0KSB7XG4gICAgICBjbG9uZS5zZXQoYXR0cmlidXRlcyk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgb2JqZWN0LiBOb3QgdG8gYmUgY29uZnVzZWQgd2l0aCBjbG9uZSgpXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9XG4gICAqL1xuICBuZXdJbnN0YW5jZSgpIHtcbiAgICBjb25zdCBjbG9uZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuY2xhc3NOYW1lKTtcbiAgICBjbG9uZS5pZCA9IHRoaXMuaWQ7XG4gICAgaWYgKHNpbmdsZUluc3RhbmNlKSB7XG4gICAgICAvLyBKdXN0IHJldHVybiBhbiBvYmplY3Qgd2l0aCB0aGUgcmlnaHQgaWRcbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgaWYgKHN0YXRlQ29udHJvbGxlcikge1xuICAgICAgc3RhdGVDb250cm9sbGVyLmR1cGxpY2F0ZVN0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpLCBjbG9uZS5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgb2JqZWN0IGhhcyBuZXZlciBiZWVuIHNhdmVkIHRvIFBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzTmV3KCkge1xuICAgIHJldHVybiAhdGhpcy5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQgYnkgdGhlIFBhcnNlIHNlcnZlciB3aGVuIHRoZVxuICAgKiBvYmplY3QgbWlnaHQgaGF2ZSBhbHJlYWR5IGJlZW4gdGhlcmUgKGUuZy4gaW4gdGhlIGNhc2Ugb2YgYSBGYWNlYm9va1xuICAgKiBsb2dpbilcbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBleGlzdGVkKCkge1xuICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgaWYgKHN0YXRlKSB7XG4gICAgICByZXR1cm4gc3RhdGUuZXhpc3RlZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9iamVjdCBleGlzdHMgb24gdGhlIFNlcnZlclxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgYm9vbGVhbiBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIGlmIG9iamVjdCBleGlzdHMuXG4gICAqL1xuICBhc3luYyBleGlzdHMob3B0aW9ucykge1xuICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgUGFyc2VRdWVyeSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUXVlcnkoKTtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkodGhpcy5jbGFzc05hbWUpO1xuICAgICAgYXdhaXQgcXVlcnkuZ2V0KHRoaXMuaWQsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5PQkpFQ1RfTk9UX0ZPVU5EKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgbW9kZWwgaXMgY3VycmVudGx5IGluIGEgdmFsaWQgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gIXRoaXMudmFsaWRhdGUodGhpcy5hdHRyaWJ1dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3Ugc2hvdWxkIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkgdW5sZXNzIHlvdSBzdWJjbGFzc1xuICAgKiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LCBpbiB3aGljaCBjYXNlIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2RcbiAgICogdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHZhbGlkYXRpb24gb24gPGNvZGU+c2V0PC9jb2RlPiBhbmRcbiAgICogPGNvZGU+c2F2ZTwvY29kZT4uICBZb3VyIGltcGxlbWVudGF0aW9uIHNob3VsZCByZXR1cm5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJzIFRoZSBjdXJyZW50IGRhdGEgdG8gdmFsaWRhdGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5FcnJvcnxib29sZWFufSBGYWxzZSBpZiB0aGUgZGF0YSBpcyB2YWxpZC4gIEFuIGVycm9yIG9iamVjdCBvdGhlcndpc2UuXG4gICAqIEBzZWUgUGFyc2UuT2JqZWN0I3NldFxuICAgKi9cbiAgdmFsaWRhdGUoYXR0cnMpIHtcbiAgICBpZiAoYXR0cnMuaGFzT3duUHJvcGVydHkoJ0FDTCcpICYmICEoYXR0cnMuQUNMIGluc3RhbmNlb2YgX1BhcnNlQUNMLmRlZmF1bHQpKSB7XG4gICAgICByZXR1cm4gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ0FDTCBtdXN0IGJlIGEgUGFyc2UgQUNMLicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgICAgaWYgKCEvXltBLVphLXpdWzAtOUEtWmEtel8uXSokLy50ZXN0KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9LRVlfTkFNRSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBBQ0wgZm9yIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuQUNMfG51bGx9IEFuIGluc3RhbmNlIG9mIFBhcnNlLkFDTC5cbiAgICogQHNlZSBQYXJzZS5PYmplY3QjZ2V0XG4gICAqL1xuICBnZXRBQ0woKSB7XG4gICAgY29uc3QgYWNsID0gdGhpcy5nZXQoJ0FDTCcpO1xuICAgIGlmIChhY2wgaW5zdGFuY2VvZiBfUGFyc2VBQ0wuZGVmYXVsdCkge1xuICAgICAgcmV0dXJuIGFjbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgQUNMIHRvIGJlIHVzZWQgZm9yIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlLkFDTH0gYWNsIEFuIGluc3RhbmNlIG9mIFBhcnNlLkFDTC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfSBXaGV0aGVyIHRoZSBzZXQgcGFzc2VkIHZhbGlkYXRpb24uXG4gICAqIEBzZWUgUGFyc2UuT2JqZWN0I3NldFxuICAgKi9cbiAgc2V0QUNMKGFjbCwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnNldCgnQUNMJywgYWNsLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYW55IChvciBzcGVjaWZpYykgY2hhbmdlcyB0byB0aGlzIG9iamVjdCBtYWRlIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gc2F2ZSgpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5c10gLSBzcGVjaWZ5IHdoaWNoIGZpZWxkcyB0byByZXZlcnRcbiAgICovXG4gIHJldmVydCgpIHtcbiAgICBsZXQga2V5c1RvUmV2ZXJ0O1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAga2V5c1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICBrZXlzVG9SZXZlcnQgPSBbXTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAga2V5c1RvUmV2ZXJ0LnB1c2goa2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlLk9iamVjdCNyZXZlcnQgZXhwZWN0cyBlaXRoZXIgbm8sIG9yIGEgbGlzdCBvZiBzdHJpbmcsIGFyZ3VtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9jbGVhclBlbmRpbmdPcHMoa2V5c1RvUmV2ZXJ0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIGF0dHJpYnV0ZXMgb24gYSBtb2RlbFxuICAgKlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgIGNvbnN0IGVyYXNhYmxlID0ge307XG4gICAgbGV0IHJlYWRvbmx5ID0gWydjcmVhdGVkQXQnLCAndXBkYXRlZEF0J107XG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVhZG9ubHkgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShyZWFkb25seSkuY2FsbChyZWFkb25seSwgdGhpcy5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMoKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHJlYWRvbmx5KS5jYWxsKHJlYWRvbmx5LCBhdHRyKSA8IDApIHtcbiAgICAgICAgZXJhc2FibGVbYXR0cl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXQoZXJhc2FibGUsIHtcbiAgICAgIHVuc2V0OiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIG1vZGVsIGZyb20gdGhlIHNlcnZlci4gSWYgdGhlIHNlcnZlcidzIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuICAgKiBtb2RlbCBkaWZmZXJzIGZyb20gaXRzIGN1cnJlbnQgYXR0cmlidXRlcywgdGhleSB3aWxsIGJlIG92ZXJyaWRlbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmluY2x1ZGU6IFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS4gQ2FuIGJlIGEgc3RyaW5nLCBhbiBhcnJheSBvZiBzdHJpbmdzLFxuICAgKiAgICAgICBvciBhbiBhcnJheSBvZiBhcnJheSBvZiBzdHJpbmdzLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZUZpbmRgIHRyaWdnZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgZmV0Y2hcbiAgICogICAgIGNvbXBsZXRlcy5cbiAgICovXG4gIGZldGNoKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGZldGNoT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBmZXRjaE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZldGNoT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaW5jbHVkZScpKSB7XG4gICAgICBmZXRjaE9wdGlvbnMuaW5jbHVkZSA9IFtdO1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShvcHRpb25zLmluY2x1ZGUpKSB7XG4gICAgICAgIHZhciBfY29udGV4dDtcbiAgICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0ID0gb3B0aW9ucy5pbmNsdWRlKS5jYWxsKF9jb250ZXh0LCBrZXkgPT4ge1xuICAgICAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICAgICAgdmFyIF9jb250ZXh0MjtcbiAgICAgICAgICAgIGZldGNoT3B0aW9ucy5pbmNsdWRlID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQyID0gZmV0Y2hPcHRpb25zLmluY2x1ZGUpLmNhbGwoX2NvbnRleHQyLCBrZXkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuaW5jbHVkZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZldGNoT3B0aW9ucy5pbmNsdWRlLnB1c2gob3B0aW9ucy5pbmNsdWRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5mZXRjaCh0aGlzLCB0cnVlLCBmZXRjaE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSBtb2RlbCBmcm9tIHRoZSBzZXJ2ZXIuIElmIHRoZSBzZXJ2ZXIncyByZXByZXNlbnRhdGlvbiBvZiB0aGVcbiAgICogbW9kZWwgZGlmZmVycyBmcm9tIGl0cyBjdXJyZW50IGF0dHJpYnV0ZXMsIHRoZXkgd2lsbCBiZSBvdmVycmlkZW4uXG4gICAqXG4gICAqIEluY2x1ZGVzIG5lc3RlZCBQYXJzZS5PYmplY3RzIGZvciB0aGUgcHJvdmlkZWQga2V5LiBZb3UgY2FuIHVzZSBkb3RcbiAgICogbm90YXRpb24gdG8gc3BlY2lmeSB3aGljaCBmaWVsZHMgaW4gdGhlIGluY2x1ZGVkIG9iamVjdCBhcmUgYWxzbyBmZXRjaGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IEFycmF5PHN0cmluZz4+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgZmV0Y2hcbiAgICogICAgIGNvbXBsZXRlcy5cbiAgICovXG4gIGZldGNoV2l0aEluY2x1ZGUoa2V5cywgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuaW5jbHVkZSA9IGtleXM7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2gob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhpcyBvYmplY3QgdG8gdGhlIHNlcnZlciBhdCBzb21lIHVuc3BlY2lmaWVkIHRpbWUgaW4gdGhlIGZ1dHVyZSxcbiAgICogZXZlbiBpZiBQYXJzZSBpcyBjdXJyZW50bHkgaW5hY2Nlc3NpYmxlLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIHlvdSBtYXkgbm90IGhhdmUgYSBzb2xpZCBuZXR3b3JrIGNvbm5lY3Rpb24sIGFuZCBkb24ndCBuZWVkIHRvIGtub3cgd2hlbiB0aGUgc2F2ZSBjb21wbGV0ZXMuXG4gICAqIElmIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSB3aXRoIHRoZSBvYmplY3Qgc3VjaCB0aGF0IGl0IGNhbid0IGJlIHNhdmVkLCBpdCB3aWxsIGJlIHNpbGVudGx5IGRpc2NhcmRlZC5cbiAgICpcbiAgICogT2JqZWN0cyBzYXZlZCB3aXRoIHRoaXMgbWV0aG9kIHdpbGwgYmUgc3RvcmVkIGxvY2FsbHkgaW4gYW4gb24tZGlzayBjYWNoZSB1bnRpbCB0aGV5IGNhbiBiZSBkZWxpdmVyZWQgdG8gUGFyc2UuXG4gICAqIFRoZXkgd2lsbCBiZSBzZW50IGltbWVkaWF0ZWx5IGlmIHBvc3NpYmxlLiBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSBzZW50IHRoZSBuZXh0IHRpbWUgYSBuZXR3b3JrIGNvbm5lY3Rpb24gaXNcbiAgICogYXZhaWxhYmxlLiBPYmplY3RzIHNhdmVkIHRoaXMgd2F5IHdpbGwgcGVyc2lzdCBldmVuIGFmdGVyIHRoZSBhcHAgaXMgY2xvc2VkLCBpbiB3aGljaCBjYXNlIHRoZXkgd2lsbCBiZSBzZW50IHRoZVxuICAgKiBuZXh0IHRpbWUgdGhlIGFwcCBpcyBvcGVuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICogVXNlZCB0byBwYXNzIG9wdGlvbiBwYXJhbWV0ZXJzIHRvIG1ldGhvZCBpZiBhcmcxIGFuZCBhcmcyIHdlcmUgYm90aCBwYXNzZWQgYXMgc3RyaW5ncy5cbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6XG4gICAqIDx1bD5cbiAgICogPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDxsaT5jYXNjYWRlU2F2ZTogSWYgYGZhbHNlYCwgbmVzdGVkIG9iamVjdHMgd2lsbCBub3QgYmUgc2F2ZWQgKGRlZmF1bHQgaXMgYHRydWVgKS5cbiAgICogPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlU2F2ZWAgYW5kIGBhZnRlclNhdmVgIHRyaWdnZXJzLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHNhdmVcbiAgICogY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgc2F2ZUV2ZW50dWFsbHkob3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmUobnVsbCwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5DT05ORUNUSU9OX0ZBSUxFRCkge1xuICAgICAgICBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudHVhbGx5UXVldWUoKS5zYXZlKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudHVhbGx5UXVldWUoKS5wb2xsKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGhhc2ggb2YgbW9kZWwgYXR0cmlidXRlcywgYW5kIHNhdmUgdGhlIG1vZGVsIHRvIHRoZSBzZXJ2ZXIuXG4gICAqIHVwZGF0ZWRBdCB3aWxsIGJlIHVwZGF0ZWQgd2hlbiB0aGUgcmVxdWVzdCByZXR1cm5zLlxuICAgKiBZb3UgY2FuIGVpdGhlciBjYWxsIGl0IGFzOjxwcmU+XG4gICAqIG9iamVjdC5zYXZlKCk7PC9wcmU+XG4gICAqIG9yPHByZT5cbiAgICogb2JqZWN0LnNhdmUoYXR0cnMpOzwvcHJlPlxuICAgKiBvcjxwcmU+XG4gICAqIG9iamVjdC5zYXZlKG51bGwsIG9wdGlvbnMpOzwvcHJlPlxuICAgKiBvcjxwcmU+XG4gICAqIG9iamVjdC5zYXZlKGF0dHJzLCBvcHRpb25zKTs8L3ByZT5cbiAgICogb3I8cHJlPlxuICAgKiBvYmplY3Quc2F2ZShrZXksIHZhbHVlKTs8L3ByZT5cbiAgICogb3I8cHJlPlxuICAgKiBvYmplY3Quc2F2ZShrZXksIHZhbHVlLCBvcHRpb25zKTs8L3ByZT5cbiAgICpcbiAgICogRXhhbXBsZSAxOiA8cHJlPlxuICAgKiBnYW1lVHVybi5zYXZlKHtcbiAgICogcGxheWVyOiBcIkpha2UgQ3V0dGVyXCIsXG4gICAqIGRpY2VSb2xsOiAyXG4gICAqIH0pLnRoZW4oZnVuY3Rpb24oZ2FtZVR1cm5BZ2Fpbikge1xuICAgKiAvLyBUaGUgc2F2ZSB3YXMgc3VjY2Vzc2Z1bC5cbiAgICogfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICogLy8gVGhlIHNhdmUgZmFpbGVkLiAgRXJyb3IgaXMgYW4gaW5zdGFuY2Ugb2YgUGFyc2UuRXJyb3IuXG4gICAqIH0pOzwvcHJlPlxuICAgKlxuICAgKiBFeGFtcGxlIDI6IDxwcmU+XG4gICAqIGdhbWVUdXJuLnNhdmUoXCJwbGF5ZXJcIiwgXCJKYWtlIEN1dHRlclwiKTs8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBvYmplY3QgfCBudWxsfSBbYXJnMV1cbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiA8bGk+YE9iamVjdGAgLSBLZXkvdmFsdWUgcGFpcnMgdG8gdXBkYXRlIG9uIHRoZSBvYmplY3QuPC9saT5cbiAgICogPGxpPmBTdHJpbmdgIEtleSAtIEtleSBvZiBhdHRyaWJ1dGUgdG8gdXBkYXRlIChyZXF1aXJlcyBhcmcyIHRvIGFsc28gYmUgc3RyaW5nKTwvbGk+XG4gICAqIDxsaT5gbnVsbGAgLSBQYXNzaW5nIG51bGwgZm9yIGFyZzEgYWxsb3dzIHlvdSB0byBzYXZlIHRoZSBvYmplY3Qgd2l0aCBvcHRpb25zIHBhc3NlZCBpbiBhcmcyLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgb2JqZWN0fSBbYXJnMl1cbiAgICogPHVsPlxuICAgKiA8bGk+YFN0cmluZ2AgVmFsdWUgLSBJZiBhcmcxIHdhcyBwYXNzZWQgYXMgYSBrZXksIGFyZzIgaXMgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHNldCBvbiB0aGF0IGtleS48L2xpPlxuICAgKiA8bGk+YE9iamVjdGAgT3B0aW9ucyAtIFZhbGlkIG9wdGlvbnMgYXJlOlxuICAgKiA8dWw+XG4gICAqIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDxsaT5jYXNjYWRlU2F2ZTogSWYgYGZhbHNlYCwgbmVzdGVkIG9iamVjdHMgd2lsbCBub3QgYmUgc2F2ZWQgKGRlZmF1bHQgaXMgYHRydWVgKS5cbiAgICogPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlU2F2ZWAgYW5kIGBhZnRlclNhdmVgIHRyaWdnZXJzLlxuICAgKiA8L3VsPlxuICAgKiA8L2xpPlxuICAgKiA8L3VsPlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZzNdXG4gICAqIFVzZWQgdG8gcGFzcyBvcHRpb24gcGFyYW1ldGVycyB0byBtZXRob2QgaWYgYXJnMSBhbmQgYXJnMiB3ZXJlIGJvdGggcGFzc2VkIGFzIHN0cmluZ3MuXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOlxuICAgKiA8dWw+XG4gICAqIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDxsaT5jYXNjYWRlU2F2ZTogSWYgYGZhbHNlYCwgbmVzdGVkIG9iamVjdHMgd2lsbCBub3QgYmUgc2F2ZWQgKGRlZmF1bHQgaXMgYHRydWVgKS5cbiAgICogPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlU2F2ZWAgYW5kIGBhZnRlclNhdmVgIHRyaWdnZXJzLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHNhdmVcbiAgICogY29tcGxldGVzLlxuICAgKi9cbiAgc2F2ZShhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgbGV0IGF0dHJzO1xuICAgIGxldCBvcHRpb25zO1xuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGFyZzEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBhdHRycyA9IGFyZzE7XG4gICAgICBpZiAodHlwZW9mIGFyZzIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdGlvbnMgPSBhcmcyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhdHRycyA9IHt9O1xuICAgICAgYXR0cnNbYXJnMV0gPSBhcmcyO1xuICAgICAgb3B0aW9ucyA9IGFyZzM7XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmIChhdHRycykge1xuICAgICAgbGV0IHZhbGlkYXRpb25FcnJvcjtcbiAgICAgIG9wdGlvbnMuZXJyb3IgPSAoXywgdmFsaWRhdGlvbikgPT4ge1xuICAgICAgICB2YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0aW9uO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnNldChhdHRycywgb3B0aW9ucyk7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KHZhbGlkYXRpb25FcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNhdmVPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBzYXZlT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSAhIW9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykgJiYgdHlwZW9mIG9wdGlvbnMuc2Vzc2lvblRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgc2F2ZU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdpbnN0YWxsYXRpb25JZCcpICYmIHR5cGVvZiBvcHRpb25zLmluc3RhbGxhdGlvbklkID09PSAnc3RyaW5nJykge1xuICAgICAgc2F2ZU9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPSBvcHRpb25zLmluc3RhbGxhdGlvbklkO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBzYXZlT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHVuc2F2ZWQgPSBvcHRpb25zLmNhc2NhZGVTYXZlICE9PSBmYWxzZSA/ICgwLCBfdW5zYXZlZENoaWxkcmVuLmRlZmF1bHQpKHRoaXMpIDogbnVsbDtcbiAgICByZXR1cm4gY29udHJvbGxlci5zYXZlKHVuc2F2ZWQsIHNhdmVPcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLnNhdmUodGhpcywgc2F2ZU9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhpcyBvYmplY3QgZnJvbSB0aGUgc2VydmVyIGF0IHNvbWUgdW5zcGVjaWZpZWQgdGltZSBpbiB0aGUgZnV0dXJlLFxuICAgKiBldmVuIGlmIFBhcnNlIGlzIGN1cnJlbnRseSBpbmFjY2Vzc2libGUuXG4gICAqXG4gICAqIFVzZSB0aGlzIHdoZW4geW91IG1heSBub3QgaGF2ZSBhIHNvbGlkIG5ldHdvcmsgY29ubmVjdGlvbixcbiAgICogYW5kIGRvbid0IG5lZWQgdG8ga25vdyB3aGVuIHRoZSBkZWxldGUgY29tcGxldGVzLiBJZiB0aGVyZSBpcyBzb21lIHByb2JsZW0gd2l0aCB0aGUgb2JqZWN0XG4gICAqIHN1Y2ggdGhhdCBpdCBjYW4ndCBiZSBkZWxldGVkLCB0aGUgcmVxdWVzdCB3aWxsIGJlIHNpbGVudGx5IGRpc2NhcmRlZC5cbiAgICpcbiAgICogRGVsZXRlIGluc3RydWN0aW9ucyBtYWRlIHdpdGggdGhpcyBtZXRob2Qgd2lsbCBiZSBzdG9yZWQgbG9jYWxseSBpbiBhbiBvbi1kaXNrIGNhY2hlIHVudGlsIHRoZXkgY2FuIGJlIHRyYW5zbWl0dGVkXG4gICAqIHRvIFBhcnNlLiBUaGV5IHdpbGwgYmUgc2VudCBpbW1lZGlhdGVseSBpZiBwb3NzaWJsZS4gT3RoZXJ3aXNlLCB0aGV5IHdpbGwgYmUgc2VudCB0aGUgbmV4dCB0aW1lIGEgbmV0d29yayBjb25uZWN0aW9uXG4gICAqIGlzIGF2YWlsYWJsZS4gRGVsZXRlIHJlcXVlc3RzIHdpbGwgcGVyc2lzdCBldmVuIGFmdGVyIHRoZSBhcHAgaXMgY2xvc2VkLCBpbiB3aGljaCBjYXNlIHRoZXkgd2lsbCBiZSBzZW50IHRoZVxuICAgKiBuZXh0IHRpbWUgdGhlIGFwcCBpcyBvcGVuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZURlbGV0ZWAgYW5kIGBhZnRlckRlbGV0ZWAgdHJpZ2dlcnMuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgZGVzdHJveVxuICAgKiAgICAgY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgZGVzdHJveUV2ZW50dWFsbHkob3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3kob3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5DT05ORUNUSU9OX0ZBSUxFRCkge1xuICAgICAgICBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudHVhbGx5UXVldWUoKS5kZXN0cm95KHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudHVhbGx5UXVldWUoKS5wb2xsKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhpcyBtb2RlbCBvbiB0aGUgc2VydmVyIGlmIGl0IHdhcyBhbHJlYWR5IHBlcnNpc3RlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRGVsZXRlYCBhbmQgYGFmdGVyRGVsZXRlYCB0cmlnZ2Vycy5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBkZXN0cm95XG4gICAqICAgICBjb21wbGV0ZXMuXG4gICAqL1xuICBkZXN0cm95KG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBkZXN0cm95T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZGVzdHJveU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZGVzdHJveU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpLmRlc3Ryb3kodGhpcywgZGVzdHJveU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHN0b3JlcyB0aGUgb2JqZWN0IGFuZCBldmVyeSBvYmplY3QgaXQgcG9pbnRzIHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsXG4gICAqIHJlY3Vyc2l2ZWx5LCB1c2luZyBhIGRlZmF1bHQgcGluIG5hbWU6IF9kZWZhdWx0LlxuICAgKlxuICAgKiBJZiB0aG9zZSBvdGhlciBvYmplY3RzIGhhdmUgbm90IGJlZW4gZmV0Y2hlZCBmcm9tIFBhcnNlLCB0aGV5IHdpbGwgbm90IGJlIHN0b3JlZC5cbiAgICogSG93ZXZlciwgaWYgdGhleSBoYXZlIGNoYW5nZWQgZGF0YSwgYWxsIHRoZSBjaGFuZ2VzIHdpbGwgYmUgcmV0YWluZWQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IG9iamVjdC5waW4oKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIFRvIHJldHJpZXZlIG9iamVjdDpcbiAgICogPGNvZGU+cXVlcnkuZnJvbUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+IG9yIDxjb2RlPnF1ZXJ5LmZyb21QaW4oKTwvY29kZT5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBwaW4gY29tcGxldGVzLlxuICAgKi9cbiAgcGluKCkge1xuICAgIHJldHVybiBQYXJzZU9iamVjdC5waW5BbGxXaXRoTmFtZShfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiwgW3RoaXNdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZW1vdmVzIHRoZSBvYmplY3QgYW5kIGV2ZXJ5IG9iamVjdCBpdCBwb2ludHMgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSxcbiAgICogcmVjdXJzaXZlbHksIHVzaW5nIGEgZGVmYXVsdCBwaW4gbmFtZTogX2RlZmF1bHQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IG9iamVjdC51blBpbigpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1blBpbiBjb21wbGV0ZXMuXG4gICAqL1xuICB1blBpbigpIHtcbiAgICByZXR1cm4gUGFyc2VPYmplY3QudW5QaW5BbGxXaXRoTmFtZShfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiwgW3RoaXNdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZXR1cm5zIGlmIHRoZSBvYmplY3QgaXMgcGlubmVkXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGNvbnN0IGlzUGlubmVkID0gYXdhaXQgb2JqZWN0LmlzUGlubmVkKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBib29sZWFuIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgaWYgb2JqZWN0IGlzIHBpbm5lZC5cbiAgICovXG4gIGFzeW5jIGlzUGlubmVkKCkge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdEtleSA9IGxvY2FsRGF0YXN0b3JlLmdldEtleUZvck9iamVjdCh0aGlzKTtcbiAgICBjb25zdCBwaW4gPSBhd2FpdCBsb2NhbERhdGFzdG9yZS5mcm9tUGluV2l0aE5hbWUob2JqZWN0S2V5KTtcbiAgICByZXR1cm4gcGluLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgc3RvcmVzIHRoZSBvYmplY3RzIGFuZCBldmVyeSBvYmplY3QgdGhleSBwb2ludCB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLCByZWN1cnNpdmVseS5cbiAgICpcbiAgICogSWYgdGhvc2Ugb3RoZXIgb2JqZWN0cyBoYXZlIG5vdCBiZWVuIGZldGNoZWQgZnJvbSBQYXJzZSwgdGhleSB3aWxsIG5vdCBiZSBzdG9yZWQuXG4gICAqIEhvd2V2ZXIsIGlmIHRoZXkgaGF2ZSBjaGFuZ2VkIGRhdGEsIGFsbCB0aGUgY2hhbmdlcyB3aWxsIGJlIHJldGFpbmVkLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBvYmplY3QucGluV2l0aE5hbWUobmFtZSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBUbyByZXRyaWV2ZSBvYmplY3Q6XG4gICAqIDxjb2RlPnF1ZXJ5LmZyb21Mb2NhbERhdGFzdG9yZSgpPC9jb2RlPiBvciA8Y29kZT5xdWVyeS5mcm9tUGluV2l0aE5hbWUobmFtZSk8L2NvZGU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgUGluLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHBpbiBjb21wbGV0ZXMuXG4gICAqL1xuICBwaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LnBpbkFsbFdpdGhOYW1lKG5hbWUsIFt0aGlzXSk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgcmVtb3ZlcyB0aGUgb2JqZWN0IGFuZCBldmVyeSBvYmplY3QgaXQgcG9pbnRzIHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsIHJlY3Vyc2l2ZWx5LlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBvYmplY3QudW5QaW5XaXRoTmFtZShuYW1lKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgUGluLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVuUGluIGNvbXBsZXRlcy5cbiAgICovXG4gIHVuUGluV2l0aE5hbWUobmFtZSkge1xuICAgIHJldHVybiBQYXJzZU9iamVjdC51blBpbkFsbFdpdGhOYW1lKG5hbWUsIFt0aGlzXSk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgbG9hZHMgZGF0YSBmcm9tIHRoZSBsb2NhbCBkYXRhc3RvcmUgaW50byB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgb2JqZWN0LmZldGNoRnJvbUxvY2FsRGF0YXN0b3JlKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBZb3UgY2FuIGNyZWF0ZSBhbiB1bmZldGNoZWQgcG9pbnRlciB3aXRoIDxjb2RlPlBhcnNlLk9iamVjdC5jcmVhdGVXaXRob3V0RGF0YSgpPC9jb2RlPlxuICAgKiBhbmQgdGhlbiBjYWxsIDxjb2RlPmZldGNoRnJvbUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+IG9uIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIGZldGNoIGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIGZldGNoRnJvbUxvY2FsRGF0YXN0b3JlKCkge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdEtleSA9IGxvY2FsRGF0YXN0b3JlLmdldEtleUZvck9iamVjdCh0aGlzKTtcbiAgICBjb25zdCBwaW5uZWQgPSBhd2FpdCBsb2NhbERhdGFzdG9yZS5fc2VyaWFsaXplT2JqZWN0KG9iamVjdEtleSk7XG4gICAgaWYgKCFwaW5uZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZldGNoIGFuIHVuc2F2ZWQgUGFyc2VPYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gUGFyc2VPYmplY3QuZnJvbUpTT04ocGlubmVkKTtcbiAgICB0aGlzLl9maW5pc2hGZXRjaChyZXN1bHQudG9KU09OKCkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyogU3RhdGljIG1ldGhvZHMgKi9cblxuICBzdGF0aWMgX2NsZWFyQWxsU3RhdGUoKSB7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgc3RhdGVDb250cm9sbGVyLmNsZWFyQWxsU3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIFBhcnNlLk9iamVjdC5cbiAgICogSWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkLCBzdG9wcyBhbmQgY2FsbHMgdGhlIGVycm9yIGhhbmRsZXIuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqICAgUGFyc2UuT2JqZWN0LmZldGNoQWxsKFtvYmplY3QxLCBvYmplY3QyLCAuLi5dKVxuICAgKiAgICAudGhlbigobGlzdCkgPT4ge1xuICAgKiAgICAgIC8vIEFsbCB0aGUgb2JqZWN0cyB3ZXJlIGZldGNoZWQuXG4gICAqICAgIH0sIChlcnJvcikgPT4ge1xuICAgKiAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGZldGNoaW5nIG9uZSBvZiB0aGUgb2JqZWN0cy5cbiAgICogICAgfSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBsaXN0IEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+aW5jbHVkZTogVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBpbmNsdWRlLiBDYW4gYmUgYSBzdHJpbmcsIGFuIGFycmF5IG9mIHN0cmluZ3MsXG4gICAqICAgICAgIG9yIGFuIGFycmF5IG9mIGFycmF5IG9mIHN0cmluZ3MuXG4gICAqIDwvdWw+XG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdFtdfVxuICAgKi9cbiAgc3RhdGljIGZldGNoQWxsKGxpc3QpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY29uc3QgcXVlcnlPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBxdWVyeU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgcXVlcnlPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaW5jbHVkZScpKSB7XG4gICAgICBxdWVyeU9wdGlvbnMuaW5jbHVkZSA9IFBhcnNlT2JqZWN0LmhhbmRsZUluY2x1ZGVPcHRpb25zKG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpLmZldGNoKGxpc3QsIHRydWUsIHF1ZXJ5T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgZ2l2ZW4gbGlzdCBvZiBQYXJzZS5PYmplY3QuXG4gICAqXG4gICAqIEluY2x1ZGVzIG5lc3RlZCBQYXJzZS5PYmplY3RzIGZvciB0aGUgcHJvdmlkZWQga2V5LiBZb3UgY2FuIHVzZSBkb3RcbiAgICogbm90YXRpb24gdG8gc3BlY2lmeSB3aGljaCBmaWVsZHMgaW4gdGhlIGluY2x1ZGVkIG9iamVjdCBhcmUgYWxzbyBmZXRjaGVkLlxuICAgKlxuICAgKiBJZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWQsIHN0b3BzIGFuZCBjYWxscyB0aGUgZXJyb3IgaGFuZGxlci5cbiAgICpcbiAgICogPHByZT5cbiAgICogICBQYXJzZS5PYmplY3QuZmV0Y2hBbGxXaXRoSW5jbHVkZShbb2JqZWN0MSwgb2JqZWN0MiwgLi4uXSwgW3BvaW50ZXIxLCBwb2ludGVyMiwgLi4uXSlcbiAgICogICAgLnRoZW4oKGxpc3QpID0+IHtcbiAgICogICAgICAvLyBBbGwgdGhlIG9iamVjdHMgd2VyZSBmZXRjaGVkLlxuICAgKiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICogICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBmZXRjaGluZyBvbmUgb2YgdGhlIG9iamVjdHMuXG4gICAqICAgIH0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gbGlzdCBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBBcnJheTxzdHJpbmc+Pn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3RbXX1cbiAgICovXG4gIHN0YXRpYyBmZXRjaEFsbFdpdGhJbmNsdWRlKGxpc3QsIGtleXMsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmluY2x1ZGUgPSBrZXlzO1xuICAgIHJldHVybiBQYXJzZU9iamVjdC5mZXRjaEFsbChsaXN0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIFBhcnNlLk9iamVjdCBpZiBuZWVkZWQuXG4gICAqIElmIGFueSBlcnJvciBpcyBlbmNvdW50ZXJlZCwgc3RvcHMgYW5kIGNhbGxzIHRoZSBlcnJvciBoYW5kbGVyLlxuICAgKlxuICAgKiBJbmNsdWRlcyBuZXN0ZWQgUGFyc2UuT2JqZWN0cyBmb3IgdGhlIHByb3ZpZGVkIGtleS4gWW91IGNhbiB1c2UgZG90XG4gICAqIG5vdGF0aW9uIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGluIHRoZSBpbmNsdWRlZCBvYmplY3QgYXJlIGFsc28gZmV0Y2hlZC5cbiAgICpcbiAgICogSWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkLCBzdG9wcyBhbmQgY2FsbHMgdGhlIGVycm9yIGhhbmRsZXIuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqICAgUGFyc2UuT2JqZWN0LmZldGNoQWxsSWZOZWVkZWRXaXRoSW5jbHVkZShbb2JqZWN0MSwgb2JqZWN0MiwgLi4uXSwgW3BvaW50ZXIxLCBwb2ludGVyMiwgLi4uXSlcbiAgICogICAgLnRoZW4oKGxpc3QpID0+IHtcbiAgICogICAgICAvLyBBbGwgdGhlIG9iamVjdHMgd2VyZSBmZXRjaGVkLlxuICAgKiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICogICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBmZXRjaGluZyBvbmUgb2YgdGhlIG9iamVjdHMuXG4gICAqICAgIH0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gbGlzdCBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBBcnJheTxzdHJpbmc+Pn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3RbXX1cbiAgICovXG4gIHN0YXRpYyBmZXRjaEFsbElmTmVlZGVkV2l0aEluY2x1ZGUobGlzdCwga2V5cywgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuaW5jbHVkZSA9IGtleXM7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LmZldGNoQWxsSWZOZWVkZWQobGlzdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgZ2l2ZW4gbGlzdCBvZiBQYXJzZS5PYmplY3QgaWYgbmVlZGVkLlxuICAgKiBJZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWQsIHN0b3BzIGFuZCBjYWxscyB0aGUgZXJyb3IgaGFuZGxlci5cbiAgICpcbiAgICogPHByZT5cbiAgICogICBQYXJzZS5PYmplY3QuZmV0Y2hBbGxJZk5lZWRlZChbb2JqZWN0MSwgLi4uXSlcbiAgICogICAgLnRoZW4oKGxpc3QpID0+IHtcbiAgICogICAgICAvLyBPYmplY3RzIHdlcmUgZmV0Y2hlZCBhbmQgdXBkYXRlZC5cbiAgICogICAgfSwgKGVycm9yKSA9PiB7XG4gICAqICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZmV0Y2hpbmcgb25lIG9mIHRoZSBvYmplY3RzLlxuICAgKiAgICB9KTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdFtdfVxuICAgKi9cbiAgc3RhdGljIGZldGNoQWxsSWZOZWVkZWQobGlzdCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHF1ZXJ5T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgcXVlcnlPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIHF1ZXJ5T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2luY2x1ZGUnKSkge1xuICAgICAgcXVlcnlPcHRpb25zLmluY2x1ZGUgPSBQYXJzZU9iamVjdC5oYW5kbGVJbmNsdWRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdENvbnRyb2xsZXIoKS5mZXRjaChsaXN0LCBmYWxzZSwgcXVlcnlPcHRpb25zKTtcbiAgfVxuICBzdGF0aWMgaGFuZGxlSW5jbHVkZU9wdGlvbnMob3B0aW9ucykge1xuICAgIGxldCBpbmNsdWRlID0gW107XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShvcHRpb25zLmluY2x1ZGUpKSB7XG4gICAgICB2YXIgX2NvbnRleHQzO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0MyA9IG9wdGlvbnMuaW5jbHVkZSkuY2FsbChfY29udGV4dDMsIGtleSA9PiB7XG4gICAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICAgIGluY2x1ZGUgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShpbmNsdWRlKS5jYWxsKGluY2x1ZGUsIGtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5jbHVkZS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmNsdWRlLnB1c2gob3B0aW9ucy5pbmNsdWRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGluY2x1ZGU7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgZ2l2ZW4gbGlzdCBvZiBtb2RlbHMgb24gdGhlIHNlcnZlciBpZiBpdCB3YXMgYWxyZWFkeSBwZXJzaXN0ZWQuXG4gICAqXG4gICAqIDxwPlVubGlrZSBzYXZlQWxsLCBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgYW4gaW5kaXZpZHVhbCBtb2RlbCxcbiAgICogdGhpcyBtZXRob2Qgd2lsbCBjb250aW51ZSB0cnlpbmcgdG8gZGVsZXRlIHRoZSByZXN0IG9mIHRoZSBtb2RlbHMgaWZcbiAgICogcG9zc2libGUsIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBhIGZhdGFsIGVycm9yIGxpa2UgYSBjb25uZWN0aW9uIGVycm9yLlxuICAgKlxuICAgKiA8cD5JbiBwYXJ0aWN1bGFyLCB0aGUgUGFyc2UuRXJyb3Igb2JqZWN0IHJldHVybmVkIGluIHRoZSBjYXNlIG9mIGVycm9yIG1heVxuICAgKiBiZSBvbmUgb2YgdHdvIHR5cGVzOlxuICAgKlxuICAgKiA8dWw+XG4gICAqIDxsaT5BIFBhcnNlLkVycm9yLkFHR1JFR0FURV9FUlJPUi4gVGhpcyBvYmplY3QncyBcImVycm9yc1wiIHByb3BlcnR5IGlzIGFuXG4gICAqIGFycmF5IG9mIG90aGVyIFBhcnNlLkVycm9yIG9iamVjdHMuIEVhY2ggZXJyb3Igb2JqZWN0IGluIHRoaXMgYXJyYXlcbiAgICogaGFzIGFuIFwib2JqZWN0XCIgcHJvcGVydHkgdGhhdCByZWZlcmVuY2VzIHRoZSBvYmplY3QgdGhhdCBjb3VsZCBub3QgYmVcbiAgICogZGVsZXRlZCAoZm9yIGluc3RhbmNlLCBiZWNhdXNlIHRoYXQgb2JqZWN0IGNvdWxkIG5vdCBiZSBmb3VuZCkuPC9saT5cbiAgICogPGxpPkEgbm9uLWFnZ3JlZ2F0ZSBQYXJzZS5FcnJvci4gVGhpcyBpbmRpY2F0ZXMgYSBzZXJpb3VzIGVycm9yIHRoYXRcbiAgICogY2F1c2VkIHRoZSBkZWxldGUgb3BlcmF0aW9uIHRvIGJlIGFib3J0ZWQgcGFydHdheSB0aHJvdWdoIChmb3JcbiAgICogaW5zdGFuY2UsIGEgY29ubmVjdGlvbiBmYWlsdXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIGRlbGV0ZSkuPC9saT5cbiAgICogPC91bD5cbiAgICpcbiAgICogPHByZT5cbiAgICogUGFyc2UuT2JqZWN0LmRlc3Ryb3lBbGwoW29iamVjdDEsIG9iamVjdDIsIC4uLl0pXG4gICAqIC50aGVuKChsaXN0KSA9PiB7XG4gICAqIC8vIEFsbCB0aGUgb2JqZWN0cyB3ZXJlIGRlbGV0ZWQuXG4gICAqIH0sIChlcnJvcikgPT4ge1xuICAgKiAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBkZWxldGluZyBvbmUgb3IgbW9yZSBvZiB0aGUgb2JqZWN0cy5cbiAgICogLy8gSWYgdGhpcyBpcyBhbiBhZ2dyZWdhdGUgZXJyb3IsIHRoZW4gd2UgY2FuIGluc3BlY3QgZWFjaCBlcnJvclxuICAgKiAvLyBvYmplY3QgaW5kaXZpZHVhbGx5IHRvIGRldGVybWluZSB0aGUgcmVhc29uIHdoeSBhIHBhcnRpY3VsYXJcbiAgICogLy8gb2JqZWN0IHdhcyBub3QgZGVsZXRlZC5cbiAgICogaWYgKGVycm9yLmNvZGUgPT09IFBhcnNlLkVycm9yLkFHR1JFR0FURV9FUlJPUikge1xuICAgKiBmb3IgKHZhciBpID0gMDsgaSA8IGVycm9yLmVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgKiBjb25zb2xlLmxvZyhcIkNvdWxkbid0IGRlbGV0ZSBcIiArIGVycm9yLmVycm9yc1tpXS5vYmplY3QuaWQgK1xuICAgKiBcImR1ZSB0byBcIiArIGVycm9yLmVycm9yc1tpXS5tZXNzYWdlKTtcbiAgICogfVxuICAgKiB9IGVsc2Uge1xuICAgKiBjb25zb2xlLmxvZyhcIkRlbGV0ZSBhYm9ydGVkIGJlY2F1c2Ugb2YgXCIgKyBlcnJvci5tZXNzYWdlKTtcbiAgICogfVxuICAgKiB9KTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBkZXN0cm95QWxsXG4gICAqIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBkZXN0cm95QWxsKGxpc3QpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY29uc3QgZGVzdHJveU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYmF0Y2hTaXplJykgJiYgdHlwZW9mIG9wdGlvbnMuYmF0Y2hTaXplID09PSAnbnVtYmVyJykge1xuICAgICAgZGVzdHJveU9wdGlvbnMuYmF0Y2hTaXplID0gb3B0aW9ucy5iYXRjaFNpemU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCkuZGVzdHJveShsaXN0LCBkZXN0cm95T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIGdpdmVuIGxpc3Qgb2YgUGFyc2UuT2JqZWN0LlxuICAgKiBJZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWQsIHN0b3BzIGFuZCBjYWxscyB0aGUgZXJyb3IgaGFuZGxlci5cbiAgICpcbiAgICogPHByZT5cbiAgICogUGFyc2UuT2JqZWN0LnNhdmVBbGwoW29iamVjdDEsIG9iamVjdDIsIC4uLl0pXG4gICAqIC50aGVuKChsaXN0KSA9PiB7XG4gICAqIC8vIEFsbCB0aGUgb2JqZWN0cyB3ZXJlIHNhdmVkLlxuICAgKiB9LCAoZXJyb3IpID0+IHtcbiAgICogLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2F2aW5nIG9uZSBvZiB0aGUgb2JqZWN0cy5cbiAgICogfSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBsaXN0IEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3RbXX1cbiAgICovXG4gIHN0YXRpYyBzYXZlQWxsKGxpc3QpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY29uc3Qgc2F2ZU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHNhdmVPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIHNhdmVPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYmF0Y2hTaXplJykgJiYgdHlwZW9mIG9wdGlvbnMuYmF0Y2hTaXplID09PSAnbnVtYmVyJykge1xuICAgICAgc2F2ZU9wdGlvbnMuYmF0Y2hTaXplID0gb3B0aW9ucy5iYXRjaFNpemU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHNhdmVPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCkuc2F2ZShsaXN0LCBzYXZlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlZmVyZW5jZSB0byBhIHN1YmNsYXNzIG9mIFBhcnNlLk9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZC4gVGhpc1xuICAgKiBkb2VzIG5vdCBleGlzdCBvbiBQYXJzZS5PYmplY3QsIG9ubHkgb24gc3ViY2xhc3Nlcy5cbiAgICpcbiAgICogPHA+QSBzaG9ydGN1dCBmb3I6IDxwcmU+XG4gICAqICB2YXIgRm9vID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIkZvb1wiKTtcbiAgICogIHZhciBwb2ludGVyVG9Gb28gPSBuZXcgRm9vKCk7XG4gICAqICBwb2ludGVyVG9Gb28uaWQgPSBcIm15T2JqZWN0SWRcIjtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIG9iamVjdCB0byBjcmVhdGUgYSByZWZlcmVuY2UgdG8uXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gQSBQYXJzZS5PYmplY3QgcmVmZXJlbmNlLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVdpdGhvdXREYXRhKGlkKSB7XG4gICAgY29uc3Qgb2JqID0gbmV3IHRoaXMoKTtcbiAgICBvYmouaWQgPSBpZDtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYSBQYXJzZSBPYmplY3QgZnJvbSBhIEpTT04gcmVwcmVzZW50YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uIFRoZSBKU09OIG1hcCBvZiB0aGUgT2JqZWN0J3MgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG92ZXJyaWRlIEluIHNpbmdsZSBpbnN0YW5jZSBtb2RlLCBhbGwgb2xkIHNlcnZlciBkYXRhXG4gICAqICAgaXMgb3ZlcndyaXR0ZW4gaWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRpcnR5IFdoZXRoZXIgdGhlIFBhcnNlLk9iamVjdCBzaG91bGQgc2V0IEpTT04ga2V5cyB0byBkaXJ0eVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9IEEgUGFyc2UuT2JqZWN0IHJlZmVyZW5jZVxuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIG92ZXJyaWRlLCBkaXJ0eSkge1xuICAgIGlmICghanNvbi5jbGFzc05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBhbiBvYmplY3Qgd2l0aG91dCBhIGNsYXNzTmFtZScpO1xuICAgIH1cbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGNsYXNzTWFwW2pzb24uY2xhc3NOYW1lXTtcbiAgICBjb25zdCBvID0gY29uc3RydWN0b3IgPyBuZXcgY29uc3RydWN0b3IoanNvbi5jbGFzc05hbWUpIDogbmV3IFBhcnNlT2JqZWN0KGpzb24uY2xhc3NOYW1lKTtcbiAgICBjb25zdCBvdGhlckF0dHJpYnV0ZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4ganNvbikge1xuICAgICAgaWYgKGF0dHIgIT09ICdjbGFzc05hbWUnICYmIGF0dHIgIT09ICdfX3R5cGUnKSB7XG4gICAgICAgIG90aGVyQXR0cmlidXRlc1thdHRyXSA9IGpzb25bYXR0cl07XG4gICAgICAgIGlmIChkaXJ0eSkge1xuICAgICAgICAgIG8uc2V0KGF0dHIsIGpzb25bYXR0cl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvdmVycmlkZSkge1xuICAgICAgLy8gaWQgbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSBjbGVhclNlcnZlckRhdGEgY2FuIHdvcmtcbiAgICAgIGlmIChvdGhlckF0dHJpYnV0ZXMub2JqZWN0SWQpIHtcbiAgICAgICAgby5pZCA9IG90aGVyQXR0cmlidXRlcy5vYmplY3RJZDtcbiAgICAgIH1cbiAgICAgIGxldCBwcmVzZXJ2ZWQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvLl9wcmVzZXJ2ZUZpZWxkc09uRmV0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJlc2VydmVkID0gby5fcHJlc2VydmVGaWVsZHNPbkZldGNoKCk7XG4gICAgICB9XG4gICAgICBvLl9jbGVhclNlcnZlckRhdGEoKTtcbiAgICAgIGlmIChwcmVzZXJ2ZWQpIHtcbiAgICAgICAgby5fZmluaXNoRmV0Y2gocHJlc2VydmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgby5fZmluaXNoRmV0Y2gob3RoZXJBdHRyaWJ1dGVzKTtcbiAgICBpZiAoanNvbi5vYmplY3RJZCkge1xuICAgICAgby5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG87XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgc3ViY2xhc3Mgb2YgUGFyc2UuT2JqZWN0IHdpdGggYSBzcGVjaWZpYyBjbGFzcyBuYW1lLlxuICAgKiBXaGVuIG9iamVjdHMgb2YgdGhhdCBjbGFzcyBhcmUgcmV0cmlldmVkIGZyb20gYSBxdWVyeSwgdGhleSB3aWxsIGJlXG4gICAqIGluc3RhbnRpYXRlZCB3aXRoIHRoaXMgc3ViY2xhc3MuXG4gICAqIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiB1c2luZyBFUzYgc3ViY2xhc3NpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIHN1YmNsYXNzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIFRoZSBzdWJjbGFzc1xuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyU3ViY2xhc3MoY2xhc3NOYW1lLCBjb25zdHJ1Y3Rvcikge1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCBjbGFzcyBuYW1lLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3Qgc3VwcGx5IGEgc3ViY2xhc3MgY29uc3RydWN0b3IuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHJlZ2lzdGVyIHRoZSBzdWJjbGFzcyBjb25zdHJ1Y3Rvci4gJyArICdEaWQgeW91IGF0dGVtcHQgdG8gcmVnaXN0ZXIgYW4gaW5zdGFuY2Ugb2YgdGhlIHN1YmNsYXNzPycpO1xuICAgIH1cbiAgICBjbGFzc01hcFtjbGFzc05hbWVdID0gY29uc3RydWN0b3I7XG4gICAgaWYgKCFjb25zdHJ1Y3Rvci5jbGFzc05hbWUpIHtcbiAgICAgIGNvbnN0cnVjdG9yLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5lZ2lzdGVycyBhIHN1YmNsYXNzIG9mIFBhcnNlLk9iamVjdCB3aXRoIGEgc3BlY2lmaWMgY2xhc3MgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgc3ViY2xhc3NcbiAgICovXG4gIHN0YXRpYyB1bnJlZ2lzdGVyU3ViY2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHZhbGlkIGNsYXNzIG5hbWUuJyk7XG4gICAgfVxuICAgIGRlbGV0ZSBjbGFzc01hcFtjbGFzc05hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgc3ViY2xhc3Mgb2YgUGFyc2UuT2JqZWN0IGZvciB0aGUgZ2l2ZW4gUGFyc2UgY2xhc3MgbmFtZS5cbiAgICpcbiAgICogPHA+RXZlcnkgZXh0ZW5zaW9uIG9mIGEgUGFyc2UgY2xhc3Mgd2lsbCBpbmhlcml0IGZyb20gdGhlIG1vc3QgcmVjZW50XG4gICAqIHByZXZpb3VzIGV4dGVuc2lvbiBvZiB0aGF0IGNsYXNzLiBXaGVuIGEgUGFyc2UuT2JqZWN0IGlzIGF1dG9tYXRpY2FsbHlcbiAgICogY3JlYXRlZCBieSBwYXJzaW5nIEpTT04sIGl0IHdpbGwgdXNlIHRoZSBtb3N0IHJlY2VudCBleHRlbnNpb24gb2YgdGhhdFxuICAgKiBjbGFzcy48L3A+XG4gICAqXG4gICAqIDxwPllvdSBzaG91bGQgY2FsbCBlaXRoZXI6PHByZT5cbiAgICogICAgIHZhciBNeUNsYXNzID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIk15Q2xhc3NcIiwge1xuICAgKiAgICAgICAgIDxpPkluc3RhbmNlIG1ldGhvZHM8L2k+LFxuICAgKiAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGF0dHJzLCBvcHRpb25zKSB7XG4gICAqICAgICAgICAgICAgIHRoaXMuc29tZUluc3RhbmNlUHJvcGVydHkgPSBbXSxcbiAgICogICAgICAgICAgICAgPGk+T3RoZXIgaW5zdGFuY2UgcHJvcGVydGllczwvaT5cbiAgICogICAgICAgICB9XG4gICAqICAgICB9LCB7XG4gICAqICAgICAgICAgPGk+Q2xhc3MgcHJvcGVydGllczwvaT5cbiAgICogICAgIH0pOzwvcHJlPlxuICAgKiBvciwgZm9yIEJhY2tib25lIGNvbXBhdGliaWxpdHk6PHByZT5cbiAgICogICAgIHZhciBNeUNsYXNzID0gUGFyc2UuT2JqZWN0LmV4dGVuZCh7XG4gICAqICAgICAgICAgY2xhc3NOYW1lOiBcIk15Q2xhc3NcIixcbiAgICogICAgICAgICA8aT5JbnN0YW5jZSBtZXRob2RzPC9pPixcbiAgICogICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihhdHRycywgb3B0aW9ucykge1xuICAgKiAgICAgICAgICAgICB0aGlzLnNvbWVJbnN0YW5jZVByb3BlcnR5ID0gW10sXG4gICAqICAgICAgICAgICAgIDxpPk90aGVyIGluc3RhbmNlIHByb3BlcnRpZXM8L2k+XG4gICAqICAgICAgICAgfVxuICAgKiAgICAgfSwge1xuICAgKiAgICAgICAgIDxpPkNsYXNzIHByb3BlcnRpZXM8L2k+XG4gICAqICAgICB9KTs8L3ByZT48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIFBhcnNlIGNsYXNzIGJhY2tpbmcgdGhpcyBtb2RlbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IFtwcm90b1Byb3BzXSBJbnN0YW5jZSBwcm9wZXJ0aWVzIHRvIGFkZCB0byBpbnN0YW5jZXMgb2YgdGhlXG4gICAqICAgICBjbGFzcyByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2NsYXNzUHJvcHNdIENsYXNzIHByb3BlcnRpZXMgdG8gYWRkIHRoZSBjbGFzcyByZXR1cm5lZCBmcm9tXG4gICAqICAgICB0aGlzIG1ldGhvZC5cbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gQSBuZXcgc3ViY2xhc3Mgb2YgUGFyc2UuT2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIGV4dGVuZChjbGFzc05hbWUsIHByb3RvUHJvcHMsIGNsYXNzUHJvcHMpIHtcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChjbGFzc05hbWUgJiYgdHlwZW9mIGNsYXNzTmFtZS5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBQYXJzZU9iamVjdC5leHRlbmQoY2xhc3NOYW1lLmNsYXNzTmFtZSwgY2xhc3NOYW1lLCBwcm90b1Byb3BzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhcnNlLk9iamVjdC5leHRlbmQncyBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGNsYXNzTmFtZS5cIik7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBhZGp1c3RlZENsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICBpZiAoYWRqdXN0ZWRDbGFzc05hbWUgPT09ICdVc2VyJyAmJiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1BFUkZPUk1fVVNFUl9SRVdSSVRFJykpIHtcbiAgICAgIGFkanVzdGVkQ2xhc3NOYW1lID0gJ19Vc2VyJztcbiAgICB9XG4gICAgbGV0IHBhcmVudFByb3RvID0gUGFyc2VPYmplY3QucHJvdG90eXBlO1xuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdfX3N1cGVyX18nKSAmJiB0aGlzLl9fc3VwZXJfXykge1xuICAgICAgcGFyZW50UHJvdG8gPSB0aGlzLnByb3RvdHlwZTtcbiAgICB9XG4gICAgbGV0IFBhcnNlT2JqZWN0U3ViY2xhc3MgPSBmdW5jdGlvbiAoYXR0cmlidXRlcywgb3B0aW9ucykge1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBhZGp1c3RlZENsYXNzTmFtZTtcbiAgICAgIHRoaXMuX29iakNvdW50ID0gb2JqZWN0Q291bnQrKztcbiAgICAgIC8vIEVuYWJsZSBsZWdhY3kgaW5pdGlhbGl6ZXJzXG4gICAgICBpZiAodHlwZW9mIHRoaXMuaW5pdGlhbGl6ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbml0aWFsaXplciBvZiB0aGlzLl9pbml0aWFsaXplcnMpIHtcbiAgICAgICAgICBpbml0aWFsaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNldChhdHRyaWJ1dGVzIHx8IHt9LCBvcHRpb25zKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSBhbiBpbnZhbGlkIFBhcnNlIE9iamVjdFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGNsYXNzTWFwW2FkanVzdGVkQ2xhc3NOYW1lXSkge1xuICAgICAgUGFyc2VPYmplY3RTdWJjbGFzcyA9IGNsYXNzTWFwW2FkanVzdGVkQ2xhc3NOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgUGFyc2VPYmplY3RTdWJjbGFzcy5leHRlbmQgPSBmdW5jdGlvbiAobmFtZSwgcHJvdG9Qcm9wcywgY2xhc3NQcm9wcykge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIFBhcnNlT2JqZWN0LmV4dGVuZC5jYWxsKFBhcnNlT2JqZWN0U3ViY2xhc3MsIG5hbWUsIHByb3RvUHJvcHMsIGNsYXNzUHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQYXJzZU9iamVjdC5leHRlbmQuY2FsbChQYXJzZU9iamVjdFN1YmNsYXNzLCBhZGp1c3RlZENsYXNzTmFtZSwgbmFtZSwgcHJvdG9Qcm9wcyk7XG4gICAgICB9O1xuICAgICAgUGFyc2VPYmplY3RTdWJjbGFzcy5jcmVhdGVXaXRob3V0RGF0YSA9IFBhcnNlT2JqZWN0LmNyZWF0ZVdpdGhvdXREYXRhO1xuICAgICAgUGFyc2VPYmplY3RTdWJjbGFzcy5jbGFzc05hbWUgPSBhZGp1c3RlZENsYXNzTmFtZTtcbiAgICAgIFBhcnNlT2JqZWN0U3ViY2xhc3MuX19zdXBlcl9fID0gcGFyZW50UHJvdG87XG4gICAgICBQYXJzZU9iamVjdFN1YmNsYXNzLnByb3RvdHlwZSA9ICgwLCBfY3JlYXRlLmRlZmF1bHQpKHBhcmVudFByb3RvLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IFBhcnNlT2JqZWN0U3ViY2xhc3MsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocHJvdG9Qcm9wcykge1xuICAgICAgZm9yIChjb25zdCBwcm9wIGluIHByb3RvUHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3AgPT09ICdpbml0aWFsaXplJykge1xuICAgICAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlT2JqZWN0U3ViY2xhc3MucHJvdG90eXBlLCAnX2luaXRpYWxpemVycycsIHtcbiAgICAgICAgICAgIHZhbHVlOiBbLi4uKFBhcnNlT2JqZWN0U3ViY2xhc3MucHJvdG90eXBlLl9pbml0aWFsaXplcnMgfHwgW10pLCBwcm90b1Byb3BzW3Byb3BdXSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcCAhPT0gJ2NsYXNzTmFtZScpIHtcbiAgICAgICAgICAoMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZU9iamVjdFN1YmNsYXNzLnByb3RvdHlwZSwgcHJvcCwge1xuICAgICAgICAgICAgdmFsdWU6IHByb3RvUHJvcHNbcHJvcF0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNsYXNzUHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBjbGFzc1Byb3BzKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY2xhc3NOYW1lJykge1xuICAgICAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlT2JqZWN0U3ViY2xhc3MsIHByb3AsIHtcbiAgICAgICAgICAgIHZhbHVlOiBjbGFzc1Byb3BzW3Byb3BdLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNsYXNzTWFwW2FkanVzdGVkQ2xhc3NOYW1lXSA9IFBhcnNlT2JqZWN0U3ViY2xhc3M7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0U3ViY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHNpbmdsZSBpbnN0YW5jZSBvYmplY3RzLCB3aGVyZSBhbnkgbG9jYWwgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIElkXG4gICAqIHNoYXJlIHRoZSBzYW1lIGF0dHJpYnV0ZXMsIGFuZCBzdGF5IHN5bmNocm9uaXplZCB3aXRoIGVhY2ggb3RoZXIuXG4gICAqIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBpbiBzZXJ2ZXIgZW52aXJvbm1lbnRzLCBzaW5jZSBpdCBjYW4gbGVhZCB0b1xuICAgKiBzZWN1cml0eSBpc3N1ZXMuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBlbmFibGVTaW5nbGVJbnN0YW5jZSgpIHtcbiAgICBzaW5nbGVJbnN0YW5jZSA9IHRydWU7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKFNpbmdsZUluc3RhbmNlU3RhdGVDb250cm9sbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHNpbmdsZSBpbnN0YW5jZSBvYmplY3RzLCB3aGVyZSBhbnkgbG9jYWwgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIElkXG4gICAqIHNoYXJlIHRoZSBzYW1lIGF0dHJpYnV0ZXMsIGFuZCBzdGF5IHN5bmNocm9uaXplZCB3aXRoIGVhY2ggb3RoZXIuXG4gICAqIFdoZW4gZGlzYWJsZWQsIHlvdSBjYW4gaGF2ZSB0d28gaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG9iamVjdCBpbiBtZW1vcnlcbiAgICogd2l0aG91dCB0aGVtIHNoYXJpbmcgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGRpc2FibGVTaW5nbGVJbnN0YW5jZSgpIHtcbiAgICBzaW5nbGVJbnN0YW5jZSA9IGZhbHNlO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldE9iamVjdFN0YXRlQ29udHJvbGxlcihVbmlxdWVJbnN0YW5jZVN0YXRlQ29udHJvbGxlcik7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgc3RvcmVzIHRoZSBvYmplY3RzIGFuZCBldmVyeSBvYmplY3QgdGhleSBwb2ludCB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLFxuICAgKiByZWN1cnNpdmVseSwgdXNpbmcgYSBkZWZhdWx0IHBpbiBuYW1lOiBfZGVmYXVsdC5cbiAgICpcbiAgICogSWYgdGhvc2Ugb3RoZXIgb2JqZWN0cyBoYXZlIG5vdCBiZWVuIGZldGNoZWQgZnJvbSBQYXJzZSwgdGhleSB3aWxsIG5vdCBiZSBzdG9yZWQuXG4gICAqIEhvd2V2ZXIsIGlmIHRoZXkgaGF2ZSBjaGFuZ2VkIGRhdGEsIGFsbCB0aGUgY2hhbmdlcyB3aWxsIGJlIHJldGFpbmVkLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5PYmplY3QucGluQWxsKFsuLi5dKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIFRvIHJldHJpZXZlIG9iamVjdDpcbiAgICogPGNvZGU+cXVlcnkuZnJvbUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+IG9yIDxjb2RlPnF1ZXJ5LmZyb21QaW4oKTwvY29kZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBwaW4gY29tcGxldGVzLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcGluQWxsKG9iamVjdHMpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gUGFyc2VPYmplY3QucGluQWxsV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4sIG9iamVjdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHN0b3JlcyB0aGUgb2JqZWN0cyBhbmQgZXZlcnkgb2JqZWN0IHRoZXkgcG9pbnQgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSwgcmVjdXJzaXZlbHkuXG4gICAqXG4gICAqIElmIHRob3NlIG90aGVyIG9iamVjdHMgaGF2ZSBub3QgYmVlbiBmZXRjaGVkIGZyb20gUGFyc2UsIHRoZXkgd2lsbCBub3QgYmUgc3RvcmVkLlxuICAgKiBIb3dldmVyLCBpZiB0aGV5IGhhdmUgY2hhbmdlZCBkYXRhLCBhbGwgdGhlIGNoYW5nZXMgd2lsbCBiZSByZXRhaW5lZC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuT2JqZWN0LnBpbkFsbFdpdGhOYW1lKG5hbWUsIFtvYmoxLCBvYmoyLCAuLi5dKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIFRvIHJldHJpZXZlIG9iamVjdDpcbiAgICogPGNvZGU+cXVlcnkuZnJvbUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+IG9yIDxjb2RlPnF1ZXJ5LmZyb21QaW5XaXRoTmFtZShuYW1lKTwvY29kZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBQaW4uXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9iamVjdHMgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgcGluIGNvbXBsZXRlcy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHBpbkFsbFdpdGhOYW1lKG5hbWUsIG9iamVjdHMpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxEYXRhc3RvcmUuX2hhbmRsZVBpbkFsbFdpdGhOYW1lKG5hbWUsIG9iamVjdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgdGhlIG9iamVjdHMgYW5kIGV2ZXJ5IG9iamVjdCB0aGV5IHBvaW50IHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsXG4gICAqIHJlY3Vyc2l2ZWx5LCB1c2luZyBhIGRlZmF1bHQgcGluIG5hbWU6IF9kZWZhdWx0LlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5PYmplY3QudW5QaW5BbGwoWy4uLl0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1blBpbiBjb21wbGV0ZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyB1blBpbkFsbChvYmplY3RzKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LnVuUGluQWxsV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4sIG9iamVjdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgdGhlIG9iamVjdHMgYW5kIGV2ZXJ5IG9iamVjdCB0aGV5IHBvaW50IHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsIHJlY3Vyc2l2ZWx5LlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5PYmplY3QudW5QaW5BbGxXaXRoTmFtZShuYW1lLCBbb2JqMSwgb2JqMiwgLi4uXSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIFBpbi5cbiAgICogQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1blBpbiBjb21wbGV0ZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyB1blBpbkFsbFdpdGhOYW1lKG5hbWUsIG9iamVjdHMpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxEYXRhc3RvcmUuX2hhbmRsZVVuUGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgcmVtb3ZlcyBhbGwgb2JqZWN0cyBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlIHVzaW5nIGEgZGVmYXVsdCBwaW4gbmFtZTogX2RlZmF1bHQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLk9iamVjdC51blBpbkFsbE9iamVjdHMoKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgdW5QaW4gY29tcGxldGVzLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgdW5QaW5BbGxPYmplY3RzKCkge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbERhdGFzdG9yZS51blBpbldpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZW1vdmVzIGFsbCBvYmplY3RzIHdpdGggdGhlIHNwZWNpZmllZCBwaW4gbmFtZS5cbiAgICogRGVsZXRlcyB0aGUgcGluIG5hbWUgYWxzby5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuT2JqZWN0LnVuUGluQWxsT2JqZWN0c1dpdGhOYW1lKG5hbWUpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBQaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgdW5QaW4gY29tcGxldGVzLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgdW5QaW5BbGxPYmplY3RzV2l0aE5hbWUobmFtZSkge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbERhdGFzdG9yZS51blBpbldpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLlBJTl9QUkVGSVggKyBuYW1lKTtcbiAgfVxufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIGZldGNoKHRhcmdldCwgZm9yY2VGZXRjaCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHRhcmdldCkpIHtcbiAgICAgIGlmICh0YXJnZXQubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKFtdKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ianMgPSBbXTtcbiAgICAgIGNvbnN0IGlkcyA9IFtdO1xuICAgICAgbGV0IGNsYXNzTmFtZSA9IG51bGw7XG4gICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHRhcmdldCkuY2FsbCh0YXJnZXQsIGVsID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2xhc3NOYW1lKSB7XG4gICAgICAgICAgY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjbGFzc05hbWUgIT09IGVsLmNsYXNzTmFtZSkge1xuICAgICAgICAgIGVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0NMQVNTX05BTUUsICdBbGwgb2JqZWN0cyBzaG91bGQgYmUgb2YgdGhlIHNhbWUgY2xhc3MnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVsLmlkKSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk1JU1NJTkdfT0JKRUNUX0lELCAnQWxsIG9iamVjdHMgbXVzdCBoYXZlIGFuIElEJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcmNlRmV0Y2ggfHwgIWVsLmlzRGF0YUF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgaWRzLnB1c2goZWwuaWQpO1xuICAgICAgICAgIG9ianMucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0cy5wdXNoKGVsKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgICBjb25zdCBQYXJzZVF1ZXJ5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VRdWVyeSgpO1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShjbGFzc05hbWUpO1xuICAgICAgcXVlcnkuY29udGFpbmVkSW4oJ29iamVjdElkJywgaWRzKTtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZSkge1xuICAgICAgICBxdWVyeS5pbmNsdWRlKG9wdGlvbnMuaW5jbHVkZSk7XG4gICAgICB9XG4gICAgICBxdWVyeS5fbGltaXQgPSBpZHMubGVuZ3RoO1xuICAgICAgcmV0dXJuICgwLCBfZmluZC5kZWZhdWx0KShxdWVyeSkuY2FsbChxdWVyeSwgb3B0aW9ucykudGhlbihhc3luYyBvYmplY3RzID0+IHtcbiAgICAgICAgY29uc3QgaWRNYXAgPSB7fTtcbiAgICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgbyA9PiB7XG4gICAgICAgICAgaWRNYXBbby5pZF0gPSBvO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb2JqID0gb2Jqc1tpXTtcbiAgICAgICAgICBpZiAoIW9iaiB8fCAhb2JqLmlkIHx8ICFpZE1hcFtvYmouaWRdKSB7XG4gICAgICAgICAgICBpZiAoZm9yY2VGZXRjaCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PQkpFQ1RfTk9UX0ZPVU5ELCAnQWxsIG9iamVjdHMgbXVzdCBleGlzdCBvbiB0aGUgc2VydmVyLicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaW5nbGVJbnN0YW5jZSkge1xuICAgICAgICAgIC8vIElmIHNpbmdsZSBpbnN0YW5jZSBvYmplY3RzIGFyZSBkaXNhYmxlZCwgd2UgbmVlZCB0byByZXBsYWNlIHRoZVxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgb2JqID0gcmVzdWx0c1tpXTtcbiAgICAgICAgICAgIGlmIChvYmogJiYgb2JqLmlkICYmIGlkTWFwW29iai5pZF0pIHtcbiAgICAgICAgICAgICAgY29uc3QgaWQgPSBvYmouaWQ7XG4gICAgICAgICAgICAgIG9iai5fZmluaXNoRmV0Y2goaWRNYXBbaWRdLnRvSlNPTigpKTtcbiAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IGlkTWFwW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgcmVzdWx0cykge1xuICAgICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl91cGRhdGVPYmplY3RJZlBpbm5lZChvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUocmVzdWx0cyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICBpZiAoIXRhcmdldC5pZCkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5NSVNTSU5HX09CSkVDVF9JRCwgJ09iamVjdCBkb2VzIG5vdCBoYXZlIGFuIElEJykpO1xuICAgICAgfVxuICAgICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgICAgcGFyYW1zLmluY2x1ZGUgPSBvcHRpb25zLmluY2x1ZGUuam9pbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICdjbGFzc2VzLycgKyB0YXJnZXQuY2xhc3NOYW1lICsgJy8nICsgdGFyZ2V0Ll9nZXRJZCgpLCBwYXJhbXMsIG9wdGlvbnMpLnRoZW4oYXN5bmMgcmVzcG9uc2UgPT4ge1xuICAgICAgICB0YXJnZXQuX2NsZWFyUGVuZGluZ09wcygpO1xuICAgICAgICB0YXJnZXQuX2NsZWFyU2VydmVyRGF0YSgpO1xuICAgICAgICB0YXJnZXQuX2ZpbmlzaEZldGNoKHJlc3BvbnNlKTtcbiAgICAgICAgYXdhaXQgbG9jYWxEYXRhc3RvcmUuX3VwZGF0ZU9iamVjdElmUGlubmVkKHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9LFxuICBhc3luYyBkZXN0cm95KHRhcmdldCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5iYXRjaFNpemUgPyBvcHRpb25zLmJhdGNoU2l6ZSA6IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnUkVRVUVTVF9CQVRDSF9TSVpFJyk7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHRhcmdldCkpIHtcbiAgICAgIGlmICh0YXJnZXQubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKFtdKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhdGNoZXMgPSBbW11dO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHRhcmdldCkuY2FsbCh0YXJnZXQsIG9iaiA9PiB7XG4gICAgICAgIGlmICghb2JqLmlkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGJhdGNoZXNbYmF0Y2hlcy5sZW5ndGggLSAxXS5wdXNoKG9iaik7XG4gICAgICAgIGlmIChiYXRjaGVzW2JhdGNoZXMubGVuZ3RoIC0gMV0ubGVuZ3RoID49IGJhdGNoU2l6ZSkge1xuICAgICAgICAgIGJhdGNoZXMucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGJhdGNoZXNbYmF0Y2hlcy5sZW5ndGggLSAxXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gSWYgdGhlIGxhc3QgYmF0Y2ggaXMgZW1wdHksIHJlbW92ZSBpdFxuICAgICAgICBiYXRjaGVzLnBvcCgpO1xuICAgICAgfVxuICAgICAgbGV0IGRlbGV0ZUNvbXBsZXRlZCA9IF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoYmF0Y2hlcykuY2FsbChiYXRjaGVzLCBiYXRjaCA9PiB7XG4gICAgICAgIGRlbGV0ZUNvbXBsZXRlZCA9IGRlbGV0ZUNvbXBsZXRlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdiYXRjaCcsIHtcbiAgICAgICAgICAgIHJlcXVlc3RzOiAoMCwgX21hcC5kZWZhdWx0KShiYXRjaCkuY2FsbChiYXRjaCwgb2JqID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgICAgICAgIHBhdGg6IGdldFNlcnZlclVybFBhdGgoKSArICdjbGFzc2VzLycgKyBvYmouY2xhc3NOYW1lICsgJy8nICsgb2JqLl9nZXRJZCgpLFxuICAgICAgICAgICAgICAgIGJvZHk6IHt9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sIG9wdGlvbnMpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdHNbaV0gJiYgcmVzdWx0c1tpXS5oYXNPd25Qcm9wZXJ0eSgnZXJyb3InKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KHJlc3VsdHNbaV0uZXJyb3IuY29kZSwgcmVzdWx0c1tpXS5lcnJvci5lcnJvcik7XG4gICAgICAgICAgICAgICAgZXJyLm9iamVjdCA9IGJhdGNoW2ldO1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBkZWxldGVDb21wbGV0ZWQudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgYWdncmVnYXRlID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5BR0dSRUdBVEVfRVJST1IpO1xuICAgICAgICAgIGFnZ3JlZ2F0ZS5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGFnZ3JlZ2F0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgdGFyZ2V0KSB7XG4gICAgICAgICAgYXdhaXQgbG9jYWxEYXRhc3RvcmUuX2Rlc3Ryb3lPYmplY3RJZlBpbm5lZChvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodGFyZ2V0KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdERUxFVEUnLCAnY2xhc3Nlcy8nICsgdGFyZ2V0LmNsYXNzTmFtZSArICcvJyArIHRhcmdldC5fZ2V0SWQoKSwge30sIG9wdGlvbnMpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fZGVzdHJveU9iamVjdElmUGlubmVkKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodGFyZ2V0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHRhcmdldCk7XG4gIH0sXG4gIHNhdmUodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gb3B0aW9ucyAmJiBvcHRpb25zLmJhdGNoU2l6ZSA/IG9wdGlvbnMuYmF0Y2hTaXplIDogX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdSRVFVRVNUX0JBVENIX1NJWkUnKTtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgY29uc3QgbWFwSWRGb3JQaW4gPSB7fTtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgY29uc3QgYWxsb3dDdXN0b21PYmplY3RJZCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQUxMT1dfQ1VTVE9NX09CSkVDVF9JRCcpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMucmV0dXJuU3RhdHVzID0gb3B0aW9ucy5yZXR1cm5TdGF0dXMgfHwgdHJ1ZTtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHRhcmdldCkpIHtcbiAgICAgIGlmICh0YXJnZXQubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKFtdKTtcbiAgICAgIH1cbiAgICAgIGxldCB1bnNhdmVkID0gKDAsIF9jb25jYXQuZGVmYXVsdCkodGFyZ2V0KS5jYWxsKHRhcmdldCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB0YXJnZXRfaSA9IHRhcmdldFtpXTtcbiAgICAgICAgaWYgKHRhcmdldF9pIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgICAgICB1bnNhdmVkID0gKDAsIF9jb25jYXQuZGVmYXVsdCkodW5zYXZlZCkuY2FsbCh1bnNhdmVkLCAoMCwgX3Vuc2F2ZWRDaGlsZHJlbi5kZWZhdWx0KSh0YXJnZXRfaSwgdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB1bnNhdmVkID0gKDAsIF91bmlxdWUuZGVmYXVsdCkodW5zYXZlZCk7XG4gICAgICBjb25zdCBmaWxlc1NhdmVkID0gW107XG4gICAgICBsZXQgcGVuZGluZyA9IFtdO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHVuc2F2ZWQpLmNhbGwodW5zYXZlZCwgZWwgPT4ge1xuICAgICAgICBpZiAoZWwgaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQpIHtcbiAgICAgICAgICBmaWxlc1NhdmVkLnB1c2goZWwuc2F2ZShvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWwgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgICAgIHBlbmRpbmcucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQuYWxsKGZpbGVzU2F2ZWQpLnRoZW4oKCkgPT4ge1xuICAgICAgICBsZXQgb2JqZWN0RXJyb3IgPSBudWxsO1xuICAgICAgICByZXR1cm4gKDAsIF9wcm9taXNlVXRpbHMuY29udGludWVXaGlsZSkoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBwZW5kaW5nLmxlbmd0aCA+IDA7XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICBjb25zdCBiYXRjaCA9IFtdO1xuICAgICAgICAgIGNvbnN0IG5leHRQZW5kaW5nID0gW107XG4gICAgICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHBlbmRpbmcpLmNhbGwocGVuZGluZywgZWwgPT4ge1xuICAgICAgICAgICAgaWYgKGFsbG93Q3VzdG9tT2JqZWN0SWQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVsLCAnaWQnKSAmJiAhZWwuaWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5NSVNTSU5HX09CSkVDVF9JRCwgJ29iamVjdElkIG11c3Qgbm90IGJlIGVtcHR5IG9yIG51bGwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYXRjaC5sZW5ndGggPCBiYXRjaFNpemUgJiYgKDAsIF9jYW5CZVNlcmlhbGl6ZWQuZGVmYXVsdCkoZWwpKSB7XG4gICAgICAgICAgICAgIGJhdGNoLnB1c2goZWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV4dFBlbmRpbmcucHVzaChlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcGVuZGluZyA9IG5leHRQZW5kaW5nO1xuICAgICAgICAgIGlmIChiYXRjaC5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ1RyaWVkIHRvIHNhdmUgYSBiYXRjaCB3aXRoIGEgY3ljbGUuJykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFF1ZXVlIHVwIHRhc2tzIGZvciBlYWNoIG9iamVjdCBpbiB0aGUgYmF0Y2guXG4gICAgICAgICAgLy8gV2hlbiBldmVyeSB0YXNrIGlzIHJlYWR5LCB0aGUgQVBJIHJlcXVlc3Qgd2lsbCBleGVjdXRlXG4gICAgICAgICAgY29uc3QgYmF0Y2hSZXR1cm5lZCA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgICAgICAgY29uc3QgYmF0Y2hSZWFkeSA9IFtdO1xuICAgICAgICAgIGNvbnN0IGJhdGNoVGFza3MgPSBbXTtcbiAgICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoYmF0Y2gpLmNhbGwoYmF0Y2gsIChvYmosIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWFkeSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgICAgICAgICBiYXRjaFJlYWR5LnB1c2gocmVhZHkpO1xuICAgICAgICAgICAgc3RhdGVDb250cm9sbGVyLnB1c2hQZW5kaW5nU3RhdGUob2JqLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgICAgICAgICBiYXRjaFRhc2tzLnB1c2goc3RhdGVDb250cm9sbGVyLmVucXVldWVUYXNrKG9iai5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVhZHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gYmF0Y2hSZXR1cm5lZC50aGVuKHJlc3BvbnNlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlc1tpbmRleF0uaGFzT3duUHJvcGVydHkoJ3N1Y2Nlc3MnKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSByZXNwb25zZXNbaW5kZXhdLnN1Y2Nlc3Mub2JqZWN0SWQ7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZXNbaW5kZXhdLl9zdGF0dXM7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2VzW2luZGV4XS5fc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3BvbnNlc1tpbmRleF0uX2hlYWRlcnM7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2VzW2luZGV4XS5feGhyO1xuICAgICAgICAgICAgICAgICAgbWFwSWRGb3JQaW5bb2JqZWN0SWRdID0gb2JqLl9sb2NhbElkO1xuICAgICAgICAgICAgICAgICAgb2JqLl9oYW5kbGVTYXZlUmVzcG9uc2UocmVzcG9uc2VzW2luZGV4XS5zdWNjZXNzLCBzdGF0dXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIW9iamVjdEVycm9yICYmIHJlc3BvbnNlc1tpbmRleF0uaGFzT3duUHJvcGVydHkoJ2Vycm9yJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVyRXJyb3IgPSByZXNwb25zZXNbaW5kZXhdLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICBvYmplY3RFcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KHNlcnZlckVycm9yLmNvZGUsIHNlcnZlckVycm9yLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSByZXN0IG9mIHRoZSBzYXZlXG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG9iai5faGFuZGxlU2F2ZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAoMCwgX3Byb21pc2VVdGlscy53aGVuKShiYXRjaFJlYWR5KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEtpY2sgb2ZmIHRoZSBiYXRjaCByZXF1ZXN0XG4gICAgICAgICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdiYXRjaCcsIHtcbiAgICAgICAgICAgICAgcmVxdWVzdHM6ICgwLCBfbWFwLmRlZmF1bHQpKGJhdGNoKS5jYWxsKGJhdGNoLCBvYmogPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IG9iai5fZ2V0U2F2ZVBhcmFtcygpO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5wYXRoID0gZ2V0U2VydmVyVXJsUGF0aCgpICsgcGFyYW1zLnBhdGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICAgIH0pLnRoZW4oYmF0Y2hSZXR1cm5lZC5yZXNvbHZlLCBlcnJvciA9PiB7XG4gICAgICAgICAgICBiYXRjaFJldHVybmVkLnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOQ09SUkVDVF9UWVBFLCBlcnJvci5tZXNzYWdlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuICgwLCBfcHJvbWlzZVV0aWxzLndoZW4pKGJhdGNoVGFza3MpO1xuICAgICAgICB9KS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAob2JqZWN0RXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChvYmplY3RFcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIHRhcmdldCkge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaXQgaXMgYSBQYXJzZU9iamVjdCBiZWZvcmUgdXBkYXRpbmcgaXQgaW50byB0aGUgbG9jYWxEYXRhU3RvcmVcbiAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fdXBkYXRlTG9jYWxJZEZvck9iamVjdChtYXBJZEZvclBpbltvYmplY3QuaWRdLCBvYmplY3QpO1xuICAgICAgICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fdXBkYXRlT2JqZWN0SWZQaW5uZWQob2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh0YXJnZXQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgIGlmIChhbGxvd0N1c3RvbU9iamVjdElkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsICdpZCcpICYmICF0YXJnZXQuaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5NSVNTSU5HX09CSkVDVF9JRCwgJ29iamVjdElkIG11c3Qgbm90IGJlIGVtcHR5IG9yIG51bGwnKTtcbiAgICAgIH1cbiAgICAgIC8vIGdlbmVyYXRlIF9sb2NhbElkIGluIGNhc2UgaWYgY2FzY2FkZVNhdmU9ZmFsc2VcbiAgICAgIHRhcmdldC5fZ2V0SWQoKTtcbiAgICAgIGNvbnN0IGxvY2FsSWQgPSB0YXJnZXQuX2xvY2FsSWQ7XG4gICAgICAvLyBjb3B5aW5nIHRhcmdldCBsZXRzIGd1YXJhbnRlZSB0aGUgcG9pbnRlciBpc24ndCBtb2RpZmllZCBlbHNld2hlcmVcbiAgICAgIGNvbnN0IHRhcmdldENvcHkgPSB0YXJnZXQ7XG4gICAgICBjb25zdCB0YXNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB0YXJnZXRDb3B5Ll9nZXRTYXZlUGFyYW1zKCk7XG4gICAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KHBhcmFtcy5tZXRob2QsIHBhcmFtcy5wYXRoLCBwYXJhbXMuYm9keSwgb3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2UuX3N0YXR1cztcbiAgICAgICAgICBkZWxldGUgcmVzcG9uc2UuX3N0YXR1cztcbiAgICAgICAgICBkZWxldGUgcmVzcG9uc2UuX2hlYWRlcnM7XG4gICAgICAgICAgZGVsZXRlIHJlc3BvbnNlLl94aHI7XG4gICAgICAgICAgdGFyZ2V0Q29weS5faGFuZGxlU2F2ZVJlc3BvbnNlKHJlc3BvbnNlLCBzdGF0dXMpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgdGFyZ2V0Q29weS5faGFuZGxlU2F2ZUVycm9yKCk7XG4gICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgc3RhdGVDb250cm9sbGVyLnB1c2hQZW5kaW5nU3RhdGUodGFyZ2V0Ll9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgICByZXR1cm4gc3RhdGVDb250cm9sbGVyLmVucXVldWVUYXNrKHRhcmdldC5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIHRhc2spLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fdXBkYXRlTG9jYWxJZEZvck9iamVjdChsb2NhbElkLCB0YXJnZXQpO1xuICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fdXBkYXRlT2JqZWN0SWZQaW5uZWQodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQYXJzZU9iamVjdChQYXJzZU9iamVjdCk7XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRPYmplY3RDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlT2JqZWN0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlVuc2V0T3AgPSBleHBvcnRzLlNldE9wID0gZXhwb3J0cy5SZW1vdmVPcCA9IGV4cG9ydHMuUmVsYXRpb25PcCA9IGV4cG9ydHMuT3AgPSBleHBvcnRzLkluY3JlbWVudE9wID0gZXhwb3J0cy5BZGRVbmlxdWVPcCA9IGV4cG9ydHMuQWRkT3AgPSB2b2lkIDA7XG5leHBvcnRzLm9wRnJvbUpTT04gPSBvcEZyb21KU09OO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2NvbmNhdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX3NwbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3BsaWNlXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9hcnJheUNvbnRhaW5zT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9hcnJheUNvbnRhaW5zT2JqZWN0XCIpKTtcbnZhciBfZGVjb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9lbmNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xudmFyIF91bmlxdWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VuaXF1ZVwiKSk7XG5mdW5jdGlvbiBvcEZyb21KU09OKGpzb24pIHtcbiAgaWYgKCFqc29uIHx8ICFqc29uLl9fb3ApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBzd2l0Y2ggKGpzb24uX19vcCkge1xuICAgIGNhc2UgJ0RlbGV0ZSc6XG4gICAgICByZXR1cm4gbmV3IFVuc2V0T3AoKTtcbiAgICBjYXNlICdJbmNyZW1lbnQnOlxuICAgICAgcmV0dXJuIG5ldyBJbmNyZW1lbnRPcChqc29uLmFtb3VudCk7XG4gICAgY2FzZSAnQWRkJzpcbiAgICAgIHJldHVybiBuZXcgQWRkT3AoKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbi5vYmplY3RzKSk7XG4gICAgY2FzZSAnQWRkVW5pcXVlJzpcbiAgICAgIHJldHVybiBuZXcgQWRkVW5pcXVlT3AoKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbi5vYmplY3RzKSk7XG4gICAgY2FzZSAnUmVtb3ZlJzpcbiAgICAgIHJldHVybiBuZXcgUmVtb3ZlT3AoKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbi5vYmplY3RzKSk7XG4gICAgY2FzZSAnQWRkUmVsYXRpb24nOlxuICAgICAge1xuICAgICAgICBjb25zdCB0b0FkZCA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24ub2JqZWN0cyk7XG4gICAgICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKHRvQWRkKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25PcChbXSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25PcCh0b0FkZCwgW10pO1xuICAgICAgfVxuICAgIGNhc2UgJ1JlbW92ZVJlbGF0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSAoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9iamVjdHMpO1xuICAgICAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KSh0b1JlbW92ZSkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uT3AoW10sIFtdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uT3AoW10sIHRvUmVtb3ZlKTtcbiAgICAgIH1cbiAgICBjYXNlICdCYXRjaCc6XG4gICAgICB7XG4gICAgICAgIGxldCB0b0FkZCA9IFtdO1xuICAgICAgICBsZXQgdG9SZW1vdmUgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBqc29uLm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChqc29uLm9wc1tpXS5fX29wID09PSAnQWRkUmVsYXRpb24nKSB7XG4gICAgICAgICAgICB0b0FkZCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHRvQWRkKS5jYWxsKHRvQWRkLCAoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9wc1tpXS5vYmplY3RzKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChqc29uLm9wc1tpXS5fX29wID09PSAnUmVtb3ZlUmVsYXRpb24nKSB7XG4gICAgICAgICAgICB0b1JlbW92ZSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHRvUmVtb3ZlKS5jYWxsKHRvUmVtb3ZlLCAoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9wc1tpXS5vYmplY3RzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25PcCh0b0FkZCwgdG9SZW1vdmUpO1xuICAgICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuY2xhc3MgT3Age1xuICAvLyBFbXB0eSBwYXJlbnQgY2xhc3NcbiAgYXBwbHlUbygpIHt9IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gIG1lcmdlV2l0aCgpIHt9IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gIHRvSlNPTigpIHt9IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG59XG5leHBvcnRzLk9wID0gT3A7XG5jbGFzcyBTZXRPcCBleHRlbmRzIE9wIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICBzdXBlcigpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3ZhbHVlXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBhcHBseVRvKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBtZXJnZVdpdGgoKSB7XG4gICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLl92YWx1ZSk7XG4gIH1cbiAgdG9KU09OKG9mZmxpbmUpIHtcbiAgICByZXR1cm4gKDAsIF9lbmNvZGUuZGVmYXVsdCkodGhpcy5fdmFsdWUsIGZhbHNlLCB0cnVlLCB1bmRlZmluZWQsIG9mZmxpbmUpO1xuICB9XG59XG5leHBvcnRzLlNldE9wID0gU2V0T3A7XG5jbGFzcyBVbnNldE9wIGV4dGVuZHMgT3Age1xuICBhcHBseVRvKCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbWVyZ2VXaXRoKCkge1xuICAgIHJldHVybiBuZXcgVW5zZXRPcCgpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19vcDogJ0RlbGV0ZSdcbiAgICB9O1xuICB9XG59XG5leHBvcnRzLlVuc2V0T3AgPSBVbnNldE9wO1xuY2xhc3MgSW5jcmVtZW50T3AgZXh0ZW5kcyBPcCB7XG4gIGNvbnN0cnVjdG9yKGFtb3VudCkge1xuICAgIHN1cGVyKCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfYW1vdW50XCIsIHZvaWQgMCk7XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbmNyZW1lbnQgT3AgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgbnVtZXJpYyBhbW91bnQuJyk7XG4gICAgfVxuICAgIHRoaXMuX2Ftb3VudCA9IGFtb3VudDtcbiAgfVxuICBhcHBseVRvKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hbW91bnQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgaW5jcmVtZW50IGEgbm9uLW51bWVyaWMgdmFsdWUuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hbW91bnQgKyB2YWx1ZTtcbiAgfVxuICBtZXJnZVdpdGgocHJldmlvdXMpIHtcbiAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgU2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl92YWx1ZSkpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBVbnNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuX2Ftb3VudCk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIEluY3JlbWVudE9wKSB7XG4gICAgICByZXR1cm4gbmV3IEluY3JlbWVudE9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fYW1vdW50KSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1lcmdlIEluY3JlbWVudCBPcCB3aXRoIHRoZSBwcmV2aW91cyBPcCcpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19vcDogJ0luY3JlbWVudCcsXG4gICAgICBhbW91bnQ6IHRoaXMuX2Ftb3VudFxuICAgIH07XG4gIH1cbn1cbmV4cG9ydHMuSW5jcmVtZW50T3AgPSBJbmNyZW1lbnRPcDtcbmNsYXNzIEFkZE9wIGV4dGVuZHMgT3Age1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHN1cGVyKCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdmFsdWVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLl92YWx1ZSA9ICgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gIH1cbiAgYXBwbHlUbyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gKDAsIF9jb25jYXQuZGVmYXVsdCkodmFsdWUpLmNhbGwodmFsdWUsIHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIGEgbm9uLWFycmF5IHZhbHVlJyk7XG4gIH1cbiAgbWVyZ2VXaXRoKHByZXZpb3VzKSB7XG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fdmFsdWUpKTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgVW5zZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIEFkZE9wKSB7XG4gICAgICByZXR1cm4gbmV3IEFkZE9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fdmFsdWUpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbWVyZ2UgQWRkIE9wIHdpdGggdGhlIHByZXZpb3VzIE9wJyk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX29wOiAnQWRkJyxcbiAgICAgIG9iamVjdHM6ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHRoaXMuX3ZhbHVlLCBmYWxzZSwgdHJ1ZSlcbiAgICB9O1xuICB9XG59XG5leHBvcnRzLkFkZE9wID0gQWRkT3A7XG5jbGFzcyBBZGRVbmlxdWVPcCBleHRlbmRzIE9wIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICBzdXBlcigpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3ZhbHVlXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5fdmFsdWUgPSAoMCwgX3VuaXF1ZS5kZWZhdWx0KSgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcbiAgfVxuICBhcHBseVRvKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZSB8fCBbXTtcbiAgICB9XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICAgIHZhciBfY29udGV4dDtcbiAgICAgIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgICAgIGNvbnN0IHRvQWRkID0gW107XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQgPSB0aGlzLl92YWx1ZSkuY2FsbChfY29udGV4dCwgdiA9PiB7XG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgICAgICBpZiAoISgwLCBfYXJyYXlDb250YWluc09iamVjdC5kZWZhdWx0KSh2YWx1ZSwgdikpIHtcbiAgICAgICAgICAgIHRvQWRkLnB1c2godik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkodmFsdWUpLmNhbGwodmFsdWUsIHYpIDwgMCkge1xuICAgICAgICAgICAgdG9BZGQucHVzaCh2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgwLCBfY29uY2F0LmRlZmF1bHQpKHZhbHVlKS5jYWxsKHZhbHVlLCB0b0FkZCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBlbGVtZW50cyB0byBhIG5vbi1hcnJheSB2YWx1ZScpO1xuICB9XG4gIG1lcmdlV2l0aChwcmV2aW91cykge1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBTZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLmFwcGx5VG8ocHJldmlvdXMuX3ZhbHVlKSk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFVuc2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBBZGRVbmlxdWVPcCkge1xuICAgICAgcmV0dXJuIG5ldyBBZGRVbmlxdWVPcCh0aGlzLmFwcGx5VG8ocHJldmlvdXMuX3ZhbHVlKSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1lcmdlIEFkZFVuaXF1ZSBPcCB3aXRoIHRoZSBwcmV2aW91cyBPcCcpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19vcDogJ0FkZFVuaXF1ZScsXG4gICAgICBvYmplY3RzOiAoMCwgX2VuY29kZS5kZWZhdWx0KSh0aGlzLl92YWx1ZSwgZmFsc2UsIHRydWUpXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0cy5BZGRVbmlxdWVPcCA9IEFkZFVuaXF1ZU9wO1xuY2xhc3MgUmVtb3ZlT3AgZXh0ZW5kcyBPcCB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgc3VwZXIoKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl92YWx1ZVwiLCB2b2lkIDApO1xuICAgIHRoaXMuX3ZhbHVlID0gKDAsIF91bmlxdWUuZGVmYXVsdCkoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSk7XG4gIH1cbiAgYXBwbHlUbyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gICAgICAvLyB2YXIgaSA9IHZhbHVlLmluZGV4T2YodGhpcy5fdmFsdWUpO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHZhbHVlKS5jYWxsKHZhbHVlLCBbXSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBpbmRleCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShyZW1vdmVkKS5jYWxsKHJlbW92ZWQsIHRoaXMuX3ZhbHVlW2ldKTtcbiAgICAgICAgd2hpbGUgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAoMCwgX3NwbGljZS5kZWZhdWx0KShyZW1vdmVkKS5jYWxsKHJlbW92ZWQsIGluZGV4LCAxKTtcbiAgICAgICAgICBpbmRleCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShyZW1vdmVkKS5jYWxsKHJlbW92ZWQsIHRoaXMuX3ZhbHVlW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdmFsdWVbaV0gaW5zdGFuY2VvZiBQYXJzZU9iamVjdCAmJiB0aGlzLl92YWx1ZVtpXS5pZCkge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVtb3ZlZC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHJlbW92ZWRbal0gaW5zdGFuY2VvZiBQYXJzZU9iamVjdCAmJiB0aGlzLl92YWx1ZVtpXS5pZCA9PT0gcmVtb3ZlZFtqXS5pZCkge1xuICAgICAgICAgICAgICAoMCwgX3NwbGljZS5kZWZhdWx0KShyZW1vdmVkKS5jYWxsKHJlbW92ZWQsIGosIDEpO1xuICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVtb3ZlZDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVtb3ZlIGVsZW1lbnRzIGZyb20gYSBub24tYXJyYXkgdmFsdWUnKTtcbiAgfVxuICBtZXJnZVdpdGgocHJldmlvdXMpIHtcbiAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgU2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl92YWx1ZSkpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBVbnNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFVuc2V0T3AoKTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgUmVtb3ZlT3ApIHtcbiAgICAgIHZhciBfY29udGV4dDI7XG4gICAgICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gICAgICBjb25zdCB1bmlxdWVzID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQyID0gcHJldmlvdXMuX3ZhbHVlKS5jYWxsKF9jb250ZXh0MiwgW10pO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl92YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5fdmFsdWVbaV0gaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgICAgIGlmICghKDAsIF9hcnJheUNvbnRhaW5zT2JqZWN0LmRlZmF1bHQpKHVuaXF1ZXMsIHRoaXMuX3ZhbHVlW2ldKSkge1xuICAgICAgICAgICAgdW5pcXVlcy5wdXNoKHRoaXMuX3ZhbHVlW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KSh1bmlxdWVzKS5jYWxsKHVuaXF1ZXMsIHRoaXMuX3ZhbHVlW2ldKSA8IDApIHtcbiAgICAgICAgICAgIHVuaXF1ZXMucHVzaCh0aGlzLl92YWx1ZVtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlbW92ZU9wKHVuaXF1ZXMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtZXJnZSBSZW1vdmUgT3Agd2l0aCB0aGUgcHJldmlvdXMgT3AnKTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fb3A6ICdSZW1vdmUnLFxuICAgICAgb2JqZWN0czogKDAsIF9lbmNvZGUuZGVmYXVsdCkodGhpcy5fdmFsdWUsIGZhbHNlLCB0cnVlKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydHMuUmVtb3ZlT3AgPSBSZW1vdmVPcDtcbmNsYXNzIFJlbGF0aW9uT3AgZXh0ZW5kcyBPcCB7XG4gIGNvbnN0cnVjdG9yKGFkZHMsIHJlbW92ZXMpIHtcbiAgICBzdXBlcigpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3RhcmdldENsYXNzTmFtZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVsYXRpb25zVG9BZGRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlbGF0aW9uc1RvUmVtb3ZlXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lID0gbnVsbDtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGFkZHMpKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uc1RvQWRkID0gKDAsIF91bmlxdWUuZGVmYXVsdCkoKDAsIF9tYXAuZGVmYXVsdCkoYWRkcykuY2FsbChhZGRzLCB0aGlzLl9leHRyYWN0SWQsIHRoaXMpKTtcbiAgICB9XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShyZW1vdmVzKSkge1xuICAgICAgdGhpcy5yZWxhdGlvbnNUb1JlbW92ZSA9ICgwLCBfdW5pcXVlLmRlZmF1bHQpKCgwLCBfbWFwLmRlZmF1bHQpKHJlbW92ZXMpLmNhbGwocmVtb3ZlcywgdGhpcy5fZXh0cmFjdElkLCB0aGlzKSk7XG4gICAgfVxuICB9XG4gIF9leHRyYWN0SWQob2JqKSB7XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBpZiAoIW9iai5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IGFkZCBvciByZW1vdmUgYW4gdW5zYXZlZCBQYXJzZSBPYmplY3QgZnJvbSBhIHJlbGF0aW9uJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICB0aGlzLl90YXJnZXRDbGFzc05hbWUgPSBvYmouY2xhc3NOYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGFyZ2V0Q2xhc3NOYW1lICE9PSBvYmouY2xhc3NOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIGNyZWF0ZSBhIFJlbGF0aW9uIHdpdGggMiBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzOiAnICsgdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lICsgJyBhbmQgJyArIG9iai5jbGFzc05hbWUgKyAnLicpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqLmlkO1xuICB9XG4gIGFwcGx5VG8odmFsdWUsIHBhcmVudCwga2V5KSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgaWYgKCFwYXJlbnQgfHwgIWtleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhcHBseSBhIFJlbGF0aW9uT3Agd2l0aG91dCBlaXRoZXIgYSBwcmV2aW91cyB2YWx1ZSwgb3IgYW4gb2JqZWN0IGFuZCBhIGtleScpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpb24gPSBuZXcgX1BhcnNlUmVsYXRpb24uZGVmYXVsdChwYXJlbnQsIGtleSk7XG4gICAgICByZWxhdGlvbi50YXJnZXRDbGFzc05hbWUgPSB0aGlzLl90YXJnZXRDbGFzc05hbWU7XG4gICAgICByZXR1cm4gcmVsYXRpb247XG4gICAgfVxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICAgIGlmICh0aGlzLl90YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlLnRhcmdldENsYXNzTmFtZSkge1xuICAgICAgICAgIGlmICh0aGlzLl90YXJnZXRDbGFzc05hbWUgIT09IHZhbHVlLnRhcmdldENsYXNzTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWxhdGVkIG9iamVjdCBtdXN0IGJlIGEgJyArIHZhbHVlLnRhcmdldENsYXNzTmFtZSArICcsIGJ1dCBhICcgKyB0aGlzLl90YXJnZXRDbGFzc05hbWUgKyAnIHdhcyBwYXNzZWQgaW4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlLnRhcmdldENsYXNzTmFtZSA9IHRoaXMuX3RhcmdldENsYXNzTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbGF0aW9uIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGEgbm9uLXJlbGF0aW9uIGZpZWxkJyk7XG4gICAgfVxuICB9XG4gIG1lcmdlV2l0aChwcmV2aW91cykge1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBVbnNldE9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgbW9kaWZ5IGEgcmVsYXRpb24gYWZ0ZXIgZGVsZXRpbmcgaXQuJyk7XG4gICAgfSBlbHNlIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFNldE9wICYmIHByZXZpb3VzLl92YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBSZWxhdGlvbk9wKSB7XG4gICAgICB2YXIgX2NvbnRleHQzLCBfY29udGV4dDQsIF9jb250ZXh0NSwgX2NvbnRleHQ2LCBfY29udGV4dDcsIF9jb250ZXh0ODtcbiAgICAgIGlmIChwcmV2aW91cy5fdGFyZ2V0Q2xhc3NOYW1lICYmIHByZXZpb3VzLl90YXJnZXRDbGFzc05hbWUgIT09IHRoaXMuX3RhcmdldENsYXNzTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbGF0ZWQgb2JqZWN0IG11c3QgYmUgb2YgY2xhc3MgJyArIHByZXZpb3VzLl90YXJnZXRDbGFzc05hbWUgKyAnLCBidXQgJyArICh0aGlzLl90YXJnZXRDbGFzc05hbWUgfHwgJ251bGwnKSArICcgd2FzIHBhc3NlZCBpbi4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0FkZCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0MyA9IHByZXZpb3VzLnJlbGF0aW9uc1RvQWRkKS5jYWxsKF9jb250ZXh0MywgW10pO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NCA9IHRoaXMucmVsYXRpb25zVG9SZW1vdmUpLmNhbGwoX2NvbnRleHQ0LCByID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkobmV3QWRkKS5jYWxsKG5ld0FkZCwgcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgKDAsIF9zcGxpY2UuZGVmYXVsdCkobmV3QWRkKS5jYWxsKG5ld0FkZCwgaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDUgPSB0aGlzLnJlbGF0aW9uc1RvQWRkKS5jYWxsKF9jb250ZXh0NSwgciA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKG5ld0FkZCkuY2FsbChuZXdBZGQsIHIpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgbmV3QWRkLnB1c2gocik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV3UmVtb3ZlID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQ2ID0gcHJldmlvdXMucmVsYXRpb25zVG9SZW1vdmUpLmNhbGwoX2NvbnRleHQ2LCBbXSk7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ3ID0gdGhpcy5yZWxhdGlvbnNUb0FkZCkuY2FsbChfY29udGV4dDcsIHIgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShuZXdSZW1vdmUpLmNhbGwobmV3UmVtb3ZlLCByKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAoMCwgX3NwbGljZS5kZWZhdWx0KShuZXdSZW1vdmUpLmNhbGwobmV3UmVtb3ZlLCBpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0OCA9IHRoaXMucmVsYXRpb25zVG9SZW1vdmUpLmNhbGwoX2NvbnRleHQ4LCByID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkobmV3UmVtb3ZlKS5jYWxsKG5ld1JlbW92ZSwgcik7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICBuZXdSZW1vdmUucHVzaChyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXdSZWxhdGlvbiA9IG5ldyBSZWxhdGlvbk9wKG5ld0FkZCwgbmV3UmVtb3ZlKTtcbiAgICAgIG5ld1JlbGF0aW9uLl90YXJnZXRDbGFzc05hbWUgPSB0aGlzLl90YXJnZXRDbGFzc05hbWU7XG4gICAgICByZXR1cm4gbmV3UmVsYXRpb247XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1lcmdlIFJlbGF0aW9uIE9wIHdpdGggdGhlIHByZXZpb3VzIE9wJyk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IGlkVG9Qb2ludGVyID0gaWQgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgIGNsYXNzTmFtZTogdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lLFxuICAgICAgICBvYmplY3RJZDogaWRcbiAgICAgIH07XG4gICAgfTtcbiAgICBsZXQgcG9pbnRlcnMgPSBudWxsO1xuICAgIGxldCBhZGRzID0gbnVsbDtcbiAgICBsZXQgcmVtb3ZlcyA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVsYXRpb25zVG9BZGQubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIF9jb250ZXh0OTtcbiAgICAgIHBvaW50ZXJzID0gKDAsIF9tYXAuZGVmYXVsdCkoX2NvbnRleHQ5ID0gdGhpcy5yZWxhdGlvbnNUb0FkZCkuY2FsbChfY29udGV4dDksIGlkVG9Qb2ludGVyKTtcbiAgICAgIGFkZHMgPSB7XG4gICAgICAgIF9fb3A6ICdBZGRSZWxhdGlvbicsXG4gICAgICAgIG9iamVjdHM6IHBvaW50ZXJzXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWxhdGlvbnNUb1JlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgX2NvbnRleHQxMDtcbiAgICAgIHBvaW50ZXJzID0gKDAsIF9tYXAuZGVmYXVsdCkoX2NvbnRleHQxMCA9IHRoaXMucmVsYXRpb25zVG9SZW1vdmUpLmNhbGwoX2NvbnRleHQxMCwgaWRUb1BvaW50ZXIpO1xuICAgICAgcmVtb3ZlcyA9IHtcbiAgICAgICAgX19vcDogJ1JlbW92ZVJlbGF0aW9uJyxcbiAgICAgICAgb2JqZWN0czogcG9pbnRlcnNcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChhZGRzICYmIHJlbW92ZXMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fb3A6ICdCYXRjaCcsXG4gICAgICAgIG9wczogW2FkZHMsIHJlbW92ZXNdXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYWRkcyB8fCByZW1vdmVzIHx8IHt9O1xuICB9XG59XG5leHBvcnRzLlJlbGF0aW9uT3AgPSBSZWxhdGlvbk9wO1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UGFyc2VPcCh7XG4gIE9wLFxuICBvcEZyb21KU09OLFxuICBTZXRPcCxcbiAgVW5zZXRPcCxcbiAgSW5jcmVtZW50T3AsXG4gIEFkZE9wLFxuICBSZWxhdGlvbk9wLFxuICBSZW1vdmVPcCxcbiAgQWRkVW5pcXVlT3Bcbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfUGFyc2VHZW9Qb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VHZW9Qb2ludFwiKSk7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgUG9seWdvbiB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOjxicj5cbiAqICAgPHByZT5cbiAqICAgbmV3IFBvbHlnb24oW1swLDBdLFswLDFdLFsxLDFdLFsxLDBdXSlcbiAqICAgbmV3IFBvbHlnb24oW0dlb1BvaW50LCBHZW9Qb2ludCwgR2VvUG9pbnRdKVxuICogICA8L3ByZT5cbiAqXG4gKiA8cD5SZXByZXNlbnRzIGEgY29vcmRpbmF0ZXMgdGhhdCBtYXkgYmUgYXNzb2NpYXRlZFxuICogd2l0aCBhIGtleSBpbiBhIFBhcnNlT2JqZWN0IG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgcG9pbnQgZm9yIGdlbyBxdWVyaWVzLlxuICogVGhpcyBhbGxvd3MgcHJveGltaXR5LWJhc2VkIHF1ZXJpZXMgb24gdGhlIGtleS48L3A+XG4gKlxuICogPHA+RXhhbXBsZTo8cHJlPlxuICogICB2YXIgcG9seWdvbiA9IG5ldyBQYXJzZS5Qb2x5Z29uKFtbMCwwXSxbMCwxXSxbMSwxXSxbMSwwXV0pO1xuICogICB2YXIgb2JqZWN0ID0gbmV3IFBhcnNlLk9iamVjdChcIlBsYWNlT2JqZWN0XCIpO1xuICogICBvYmplY3Quc2V0KFwiYXJlYVwiLCBwb2x5Z29uKTtcbiAqICAgb2JqZWN0LnNhdmUoKTs8L3ByZT48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLlBvbHlnb25cbiAqL1xuY2xhc3MgUGFyc2VQb2x5Z29uIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7KENvb3JkaW5hdGVzIHwgUGFyc2UuR2VvUG9pbnRbXSl9IGNvb3JkaW5hdGVzIEFuIEFycmF5IG9mIGNvb3JkaW5hdGUgcGFpcnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvb3JkaW5hdGVzKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfY29vcmRpbmF0ZXNcIiwgdm9pZCAwKTtcbiAgICB0aGlzLl9jb29yZGluYXRlcyA9IFBhcnNlUG9seWdvbi5fdmFsaWRhdGUoY29vcmRpbmF0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvb3JkaW5hdGVzIHZhbHVlIGZvciB0aGlzIFBvbHlnb24uXG4gICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgbm90IHZhbGlkIHR5cGUuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7KENvb3JkaW5hdGVzIHwgUGFyc2UuR2VvUG9pbnRbXSl9IGNvb3JkaW5hdGVzIGxpc3Qgb2YgY29vcmRpbmF0ZXNcbiAgICogQHJldHVybnMge0Nvb3JkaW5hdGVzfVxuICAgKi9cbiAgZ2V0IGNvb3JkaW5hdGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9jb29yZGluYXRlcztcbiAgfVxuICBzZXQgY29vcmRpbmF0ZXMoY29vcmRzKSB7XG4gICAgdGhpcy5fY29vcmRpbmF0ZXMgPSBQYXJzZVBvbHlnb24uX3ZhbGlkYXRlKGNvb3Jkcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIFBvbHlnb24sIHN1aXRhYmxlIGZvciBQYXJzZS5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICBQYXJzZVBvbHlnb24uX3ZhbGlkYXRlKHRoaXMuX2Nvb3JkaW5hdGVzKTtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnUG9seWdvbicsXG4gICAgICBjb29yZGluYXRlczogdGhpcy5fY29vcmRpbmF0ZXNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0d28gcG9seWdvbnMgYXJlIGVxdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7KFBhcnNlLlBvbHlnb24gfCBvYmplY3QpfSBvdGhlclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGVxdWFscyhvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgUGFyc2VQb2x5Z29uKSB8fCB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aCAhPT0gb3RoZXIuY29vcmRpbmF0ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBpc0VxdWFsID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodGhpcy5fY29vcmRpbmF0ZXNbaV1bMF0gIT0gb3RoZXIuY29vcmRpbmF0ZXNbaV1bMF0gfHwgdGhpcy5fY29vcmRpbmF0ZXNbaV1bMV0gIT0gb3RoZXIuY29vcmRpbmF0ZXNbaV1bMV0pIHtcbiAgICAgICAgaXNFcXVhbCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzRXF1YWw7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgaWYgdGhlIHBvaW50IGlzIGNvbnRhaW5lZCBpbiB0aGUgcG9seWdvblxuICAgKi9cbiAgY29udGFpbnNQb2ludChwb2ludCkge1xuICAgIGxldCBtaW5YID0gdGhpcy5fY29vcmRpbmF0ZXNbMF1bMF07XG4gICAgbGV0IG1heFggPSB0aGlzLl9jb29yZGluYXRlc1swXVswXTtcbiAgICBsZXQgbWluWSA9IHRoaXMuX2Nvb3JkaW5hdGVzWzBdWzFdO1xuICAgIGxldCBtYXhZID0gdGhpcy5fY29vcmRpbmF0ZXNbMF1bMV07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgcCA9IHRoaXMuX2Nvb3JkaW5hdGVzW2ldO1xuICAgICAgbWluWCA9IE1hdGgubWluKHBbMF0sIG1pblgpO1xuICAgICAgbWF4WCA9IE1hdGgubWF4KHBbMF0sIG1heFgpO1xuICAgICAgbWluWSA9IE1hdGgubWluKHBbMV0sIG1pblkpO1xuICAgICAgbWF4WSA9IE1hdGgubWF4KHBbMV0sIG1heFkpO1xuICAgIH1cbiAgICBjb25zdCBvdXRzaWRlID0gcG9pbnQubGF0aXR1ZGUgPCBtaW5YIHx8IHBvaW50LmxhdGl0dWRlID4gbWF4WCB8fCBwb2ludC5sb25naXR1ZGUgPCBtaW5ZIHx8IHBvaW50LmxvbmdpdHVkZSA+IG1heFk7XG4gICAgaWYgKG91dHNpZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoIC0gMTsgaSA8IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDsgaiA9IGkrKykge1xuICAgICAgY29uc3Qgc3RhcnRYID0gdGhpcy5fY29vcmRpbmF0ZXNbaV1bMF07XG4gICAgICBjb25zdCBzdGFydFkgPSB0aGlzLl9jb29yZGluYXRlc1tpXVsxXTtcbiAgICAgIGNvbnN0IGVuZFggPSB0aGlzLl9jb29yZGluYXRlc1tqXVswXTtcbiAgICAgIGNvbnN0IGVuZFkgPSB0aGlzLl9jb29yZGluYXRlc1tqXVsxXTtcbiAgICAgIGNvbnN0IGludGVyc2VjdCA9IHN0YXJ0WSA+IHBvaW50LmxvbmdpdHVkZSAhPSBlbmRZID4gcG9pbnQubG9uZ2l0dWRlICYmIHBvaW50LmxhdGl0dWRlIDwgKGVuZFggLSBzdGFydFgpICogKHBvaW50LmxvbmdpdHVkZSAtIHN0YXJ0WSkgLyAoZW5kWSAtIHN0YXJ0WSkgKyBzdGFydFg7XG4gICAgICBpZiAoaW50ZXJzZWN0KSB7XG4gICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnNpZGU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGxpc3Qgb2YgY29vcmRpbmF0ZXMgY2FuIGZvcm0gYSB2YWxpZCBwb2x5Z29uXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvb3JkcyB0aGUgbGlzdCBvZiBjb29yZGluYXRlcyB0byB2YWxpZGF0ZSBhcyBhIHBvbHlnb25cbiAgICogQHRocm93cyB7VHlwZUVycm9yfVxuICAgKiBAcmV0dXJucyB7bnVtYmVyW11bXX0gQXJyYXkgb2YgY29vcmRpbmF0ZXMgaWYgdmFsaWRhdGVkLlxuICAgKi9cbiAgc3RhdGljIF92YWxpZGF0ZShjb29yZHMpIHtcbiAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KShjb29yZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChjb29yZHMubGVuZ3RoIDwgMykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUG9seWdvbiBtdXN0IGhhdmUgYXQgbGVhc3QgMyBHZW9Qb2ludHMgb3IgUG9pbnRzJyk7XG4gICAgfVxuICAgIGNvbnN0IHBvaW50cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBjb29yZCA9IGNvb3Jkc1tpXTtcbiAgICAgIGxldCBnZW9Qb2ludDtcbiAgICAgIGlmIChjb29yZCBpbnN0YW5jZW9mIF9QYXJzZUdlb1BvaW50LmRlZmF1bHQpIHtcbiAgICAgICAgZ2VvUG9pbnQgPSBjb29yZDtcbiAgICAgIH0gZWxzZSBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGNvb3JkKSAmJiBjb29yZC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgZ2VvUG9pbnQgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdChjb29yZFswXSwgY29vcmRbMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSBvZiBHZW9Qb2ludHMgb3IgUG9pbnRzJyk7XG4gICAgICB9XG4gICAgICBwb2ludHMucHVzaChbZ2VvUG9pbnQubGF0aXR1ZGUsIGdlb1BvaW50LmxvbmdpdHVkZV0pO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZVBvbHlnb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfc2xpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NsaWNlXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9maWx0ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbHRlclwiKSk7XG52YXIgX2tleXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9rZXlzXCIpKTtcbnZhciBfY29uY2F0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXRcIikpO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9zb3J0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zb3J0XCIpKTtcbnZhciBfc3BsaWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zcGxpY2VcIikpO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfZmluZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZFwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfZW50cmllcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2VudHJpZXNcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9lbmNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX3Byb21pc2VVdGlscyA9IHJlcXVpcmUoXCIuL3Byb21pc2VVdGlsc1wiKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xudmFyIF9PZmZsaW5lUXVlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL09mZmxpbmVRdWVyeVwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlVXRpbHMgPSByZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZVV0aWxzXCIpO1xuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgcmVnZXggdGhhdCBtYXRjaGVzIGl0LlxuICogU3Vycm91bmRpbmcgd2l0aCBcXFEgLi4gXFxFIGRvZXMgdGhpcywgd2UganVzdCBuZWVkIHRvIGVzY2FwZSBhbnkgXFxFJ3MgaW5cbiAqIHRoZSB0ZXh0IHNlcGFyYXRlbHkuXG4gKlxuICogQHBhcmFtIHNcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBxdW90ZShzKSB7XG4gIHJldHVybiAnXFxcXFEnICsgcy5yZXBsYWNlKCdcXFxcRScsICdcXFxcRVxcXFxcXFxcRVxcXFxRJykgKyAnXFxcXEUnO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBjbGFzcyBuYW1lIGZyb20gcXVlcmllcy4gSWYgbm90IGFsbCBxdWVyaWVzIGhhdmUgdGhlIHNhbWVcbiAqIGNsYXNzIG5hbWUgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKlxuICogQHBhcmFtIHF1ZXJpZXNcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBfZ2V0Q2xhc3NOYW1lRnJvbVF1ZXJpZXMocXVlcmllcykge1xuICBsZXQgY2xhc3NOYW1lID0gbnVsbDtcbiAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHF1ZXJpZXMpLmNhbGwocXVlcmllcywgcSA9PiB7XG4gICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZSA9IHEuY2xhc3NOYW1lO1xuICAgIH1cbiAgICBpZiAoY2xhc3NOYW1lICE9PSBxLmNsYXNzTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGwgcXVlcmllcyBtdXN0IGJlIGZvciB0aGUgc2FtZSBjbGFzcy4nKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2xhc3NOYW1lO1xufVxuXG4vKlxuICogSGFuZGxlcyBwcmUtcG9wdWxhdGluZyB0aGUgcmVzdWx0IGRhdGEgb2YgYSBxdWVyeSB3aXRoIHNlbGVjdCBmaWVsZHMsXG4gKiBtYWtpbmcgc3VyZSB0aGF0IHRoZSBkYXRhIG9iamVjdCBjb250YWlucyBrZXlzIGZvciBhbGwgb2JqZWN0cyB0aGF0IGhhdmVcbiAqIGJlZW4gcmVxdWVzdGVkIHdpdGggYSBzZWxlY3QsIHNvIHRoYXQgb3VyIGNhY2hlZCBzdGF0ZSB1cGRhdGVzIGNvcnJlY3RseS5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlU2VsZWN0UmVzdWx0KGRhdGEsIHNlbGVjdCkge1xuICBjb25zdCBzZXJ2ZXJEYXRhTWFzayA9IHt9O1xuICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoc2VsZWN0KS5jYWxsKHNlbGVjdCwgZmllbGQgPT4ge1xuICAgIGNvbnN0IGhhc1N1Yk9iamVjdFNlbGVjdCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShmaWVsZCkuY2FsbChmaWVsZCwgJy4nKSAhPT0gLTE7XG4gICAgaWYgKCFoYXNTdWJPYmplY3RTZWxlY3QgJiYgIWRhdGEuaGFzT3duUHJvcGVydHkoZmllbGQpKSB7XG4gICAgICAvLyB0aGlzIGZpZWxkIHdhcyBzZWxlY3RlZCwgYnV0IGlzIG1pc3NpbmcgZnJvbSB0aGUgcmV0cmlldmVkIGRhdGFcbiAgICAgIGRhdGFbZmllbGRdID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoaGFzU3ViT2JqZWN0U2VsZWN0KSB7XG4gICAgICAvLyB0aGlzIGZpZWxkIHJlZmVyZW5jZXMgYSBzdWItb2JqZWN0LFxuICAgICAgLy8gc28gd2UgbmVlZCB0byB3YWxrIGRvd24gdGhlIHBhdGggY29tcG9uZW50c1xuICAgICAgY29uc3QgcGF0aENvbXBvbmVudHMgPSBmaWVsZC5zcGxpdCgnLicpO1xuICAgICAgbGV0IG9iaiA9IGRhdGE7XG4gICAgICBsZXQgc2VydmVyTWFzayA9IHNlcnZlckRhdGFNYXNrO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHBhdGhDb21wb25lbnRzKS5jYWxsKHBhdGhDb21wb25lbnRzLCAoY29tcG9uZW50LCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgIC8vIGFkZCBrZXlzIGlmIHRoZSBleHBlY3RlZCBkYXRhIGlzIG1pc3NpbmdcbiAgICAgICAgaWYgKG9iaiAmJiAhb2JqLmhhc093blByb3BlcnR5KGNvbXBvbmVudCkpIHtcbiAgICAgICAgICBvYmpbY29tcG9uZW50XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgb2JqID0gb2JqW2NvbXBvbmVudF07XG4gICAgICAgIH1cblxuICAgICAgICAvL2FkZCB0aGlzIHBhdGggY29tcG9uZW50IHRvIHRoZSBzZXJ2ZXIgbWFzayBzbyB3ZSBjYW4gZmlsbCBpdCBpbiBsYXRlciBpZiBuZWVkZWRcbiAgICAgICAgaWYgKGluZGV4IDwgYXJyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBpZiAoIXNlcnZlck1hc2tbY29tcG9uZW50XSkge1xuICAgICAgICAgICAgc2VydmVyTWFza1tjb21wb25lbnRdID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcnZlck1hc2sgPSBzZXJ2ZXJNYXNrW2NvbXBvbmVudF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIGlmICgoMCwgX2tleXMuZGVmYXVsdCkoc2VydmVyRGF0YU1hc2spLmxlbmd0aCA+IDApIHtcbiAgICAvLyBXaGVuIHNlbGVjdGluZyBmcm9tIHN1Yi1vYmplY3RzLCB3ZSBkb24ndCB3YW50IHRvIGJsb3cgYXdheSB0aGUgbWlzc2luZ1xuICAgIC8vIGluZm9ybWF0aW9uIHRoYXQgd2UgbWF5IGhhdmUgcmV0cmlldmVkIGJlZm9yZS4gV2UndmUgYWxyZWFkeSBhZGRlZCBhbnlcbiAgICAvLyBtaXNzaW5nIHNlbGVjdGVkIGtleXMgdG8gc3ViLW9iamVjdHMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGFkZCBpbiB0aGVcbiAgICAvLyBkYXRhIGZvciBhbnkgcHJldmlvdXNseSByZXRyaWV2ZWQgc3ViLW9iamVjdHMgdGhhdCB3ZXJlIG5vdCBzZWxlY3RlZC5cblxuICAgIGNvbnN0IHNlcnZlckRhdGEgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKS5nZXRTZXJ2ZXJEYXRhKHtcbiAgICAgIGlkOiBkYXRhLm9iamVjdElkLFxuICAgICAgY2xhc3NOYW1lOiBkYXRhLmNsYXNzTmFtZVxuICAgIH0pO1xuICAgIGNvcHlNaXNzaW5nRGF0YVdpdGhNYXNrKHNlcnZlckRhdGEsIGRhdGEsIHNlcnZlckRhdGFNYXNrLCBmYWxzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNvcHlNaXNzaW5nRGF0YVdpdGhNYXNrKHNyYywgZGVzdCwgbWFzaywgY29weVRoaXNMZXZlbCkge1xuICAvL2NvcHkgbWlzc2luZyBlbGVtZW50cyBhdCB0aGlzIGxldmVsXG4gIGlmIChjb3B5VGhpc0xldmVsKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3JjKSB7XG4gICAgICBpZiAoc3JjLmhhc093blByb3BlcnR5KGtleSkgJiYgIWRlc3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBkZXN0W2tleV0gPSBzcmNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gbWFzaykge1xuICAgIGlmIChkZXN0W2tleV0gIT09IHVuZGVmaW5lZCAmJiBkZXN0W2tleV0gIT09IG51bGwgJiYgc3JjICE9PSB1bmRlZmluZWQgJiYgc3JjICE9PSBudWxsKSB7XG4gICAgICAvL3RyYXZlcnNlIGludG8gb2JqZWN0cyBhcyBuZWVkZWRcbiAgICAgIGNvcHlNaXNzaW5nRGF0YVdpdGhNYXNrKHNyY1trZXldLCBkZXN0W2tleV0sIG1hc2tba2V5XSwgdHJ1ZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVPZmZsaW5lU29ydChhLCBiLCBzb3J0cykge1xuICBsZXQgb3JkZXIgPSBzb3J0c1swXTtcbiAgY29uc3Qgb3BlcmF0b3IgPSAoMCwgX3NsaWNlLmRlZmF1bHQpKG9yZGVyKS5jYWxsKG9yZGVyLCAwLCAxKTtcbiAgY29uc3QgaXNEZXNjZW5kaW5nID0gb3BlcmF0b3IgPT09ICctJztcbiAgaWYgKGlzRGVzY2VuZGluZykge1xuICAgIG9yZGVyID0gb3JkZXIuc3Vic3RyaW5nKDEpO1xuICB9XG4gIGlmIChvcmRlciA9PT0gJ19jcmVhdGVkX2F0Jykge1xuICAgIG9yZGVyID0gJ2NyZWF0ZWRBdCc7XG4gIH1cbiAgaWYgKG9yZGVyID09PSAnX3VwZGF0ZWRfYXQnKSB7XG4gICAgb3JkZXIgPSAndXBkYXRlZEF0JztcbiAgfVxuICBpZiAoIS9eW0EtWmEtel1bMC05QS1aYS16X10qJC8udGVzdChvcmRlcikgfHwgb3JkZXIgPT09ICdwYXNzd29yZCcpIHtcbiAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfS0VZX05BTUUsIGBJbnZhbGlkIEtleTogJHtvcmRlcn1gKTtcbiAgfVxuICBjb25zdCBmaWVsZDEgPSBhLmdldChvcmRlcik7XG4gIGNvbnN0IGZpZWxkMiA9IGIuZ2V0KG9yZGVyKTtcbiAgaWYgKGZpZWxkMSA8IGZpZWxkMikge1xuICAgIHJldHVybiBpc0Rlc2NlbmRpbmcgPyAxIDogLTE7XG4gIH1cbiAgaWYgKGZpZWxkMSA+IGZpZWxkMikge1xuICAgIHJldHVybiBpc0Rlc2NlbmRpbmcgPyAtMSA6IDE7XG4gIH1cbiAgaWYgKHNvcnRzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCByZW1haW5pbmdTb3J0cyA9ICgwLCBfc2xpY2UuZGVmYXVsdCkoc29ydHMpLmNhbGwoc29ydHMsIDEpO1xuICAgIHJldHVybiBoYW5kbGVPZmZsaW5lU29ydChhLCBiLCByZW1haW5pbmdTb3J0cyk7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcGFyc2UgUGFyc2UuUXVlcnkgZm9yIHRoZSBnaXZlbiBQYXJzZS5PYmplY3Qgc3ViY2xhc3MuXG4gKlxuICogPHA+UGFyc2UuUXVlcnkgZGVmaW5lcyBhIHF1ZXJ5IHRoYXQgaXMgdXNlZCB0byBmZXRjaCBQYXJzZS5PYmplY3RzLiBUaGVcbiAqIG1vc3QgY29tbW9uIHVzZSBjYXNlIGlzIGZpbmRpbmcgYWxsIG9iamVjdHMgdGhhdCBtYXRjaCBhIHF1ZXJ5IHRocm91Z2ggdGhlXG4gKiA8Y29kZT5maW5kPC9jb2RlPiBtZXRob2QuIGZvciBleGFtcGxlLCB0aGlzIHNhbXBsZSBjb2RlIGZldGNoZXMgYWxsIG9iamVjdHNcbiAqIG9mIGNsYXNzIDxjb2RlPm15Y2xhc3M8L2NvZGU+LiBpdCBjYWxscyBhIGRpZmZlcmVudCBmdW5jdGlvbiBkZXBlbmRpbmcgb25cbiAqIHdoZXRoZXIgdGhlIGZldGNoIHN1Y2NlZWRlZCBvciBub3QuXG4gKlxuICogPHByZT5cbiAqIHZhciBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShteWNsYXNzKTtcbiAqIHF1ZXJ5LmZpbmQoKS50aGVuKChyZXN1bHRzKSA9PiB7XG4gKiAgIC8vIHJlc3VsdHMgaXMgYW4gYXJyYXkgb2YgcGFyc2Uub2JqZWN0LlxuICogfSkuY2F0Y2goKGVycm9yKSA9PiAge1xuICogIC8vIGVycm9yIGlzIGFuIGluc3RhbmNlIG9mIHBhcnNlLmVycm9yLlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIDxwPmEgUGFyc2UuUXVlcnkgY2FuIGFsc28gYmUgdXNlZCB0byByZXRyaWV2ZSBhIHNpbmdsZSBvYmplY3Qgd2hvc2UgaWQgaXNcbiAqIGtub3duLCB0aHJvdWdoIHRoZSBnZXQgbWV0aG9kLiBmb3IgZXhhbXBsZSwgdGhpcyBzYW1wbGUgY29kZSBmZXRjaGVzIGFuXG4gKiBvYmplY3Qgb2YgY2xhc3MgPGNvZGU+bXljbGFzczwvY29kZT4gYW5kIGlkIDxjb2RlPm15aWQ8L2NvZGU+LiBpdCBjYWxscyBhXG4gKiBkaWZmZXJlbnQgZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGZldGNoIHN1Y2NlZWRlZCBvciBub3QuXG4gKlxuICogPHByZT5cbiAqIHZhciBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShteWNsYXNzKTtcbiAqIHF1ZXJ5LmdldChteWlkKS50aGVuKChvYmplY3QpID0+IHtcbiAqICAgICAvLyBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgcGFyc2Uub2JqZWN0LlxuICogfSkuY2F0Y2goKGVycm9yKSA9PiAge1xuICogIC8vIGVycm9yIGlzIGFuIGluc3RhbmNlIG9mIHBhcnNlLmVycm9yLlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIDxwPmEgUGFyc2UuUXVlcnkgY2FuIGFsc28gYmUgdXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIG9iamVjdHMgdGhhdCBtYXRjaFxuICogdGhlIHF1ZXJ5IHdpdGhvdXQgcmV0cmlldmluZyBhbGwgb2YgdGhvc2Ugb2JqZWN0cy4gZm9yIGV4YW1wbGUsIHRoaXNcbiAqIHNhbXBsZSBjb2RlIGNvdW50cyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgb2YgdGhlIGNsYXNzIDxjb2RlPm15Y2xhc3M8L2NvZGU+XG4gKiA8cHJlPlxuICogdmFyIHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KG15Y2xhc3MpO1xuICogcXVlcnkuY291bnQoKS50aGVuKChudW1iZXIpID0+IHtcbiAqICAgICAvLyB0aGVyZSBhcmUgbnVtYmVyIGluc3RhbmNlcyBvZiBteWNsYXNzLlxuICogfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gKiAgICAgLy8gZXJyb3IgaXMgYW4gaW5zdGFuY2Ugb2YgUGFyc2UuRXJyb3IuXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLlF1ZXJ5XG4gKi9cbmNsYXNzIFBhcnNlUXVlcnkge1xuICAvKipcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgUGFyc2UuT2JqZWN0KX0gb2JqZWN0Q2xhc3MgQW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBQYXJzZS5PYmplY3QsIG9yIGEgUGFyc2UgY2xhc3NOYW1lIHN0cmluZy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9iamVjdENsYXNzKSB7XG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNsYXNzTmFtZVxuICAgICAqL1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiY2xhc3NOYW1lXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfd2hlcmVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl93YXRjaFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2luY2x1ZGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9leGNsdWRlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfc2VsZWN0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfbGltaXRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9za2lwXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfY291bnRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9vcmRlclwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3JlYWRQcmVmZXJlbmNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfaW5jbHVkZVJlYWRQcmVmZXJlbmNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfc3VicXVlcnlSZWFkUHJlZmVyZW5jZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3F1ZXJpZXNMb2NhbERhdGFzdG9yZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2xvY2FsRGF0YXN0b3JlUGluTmFtZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2V4dHJhT3B0aW9uc1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2hpbnRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9leHBsYWluXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfeGhyUmVxdWVzdFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2NvbW1lbnRcIiwgdm9pZCAwKTtcbiAgICBpZiAodHlwZW9mIG9iamVjdENsYXNzID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKG9iamVjdENsYXNzID09PSAnVXNlcicgJiYgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdQRVJGT1JNX1VTRVJfUkVXUklURScpKSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gJ19Vc2VyJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gb2JqZWN0Q2xhc3M7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvYmplY3RDbGFzcyBpbnN0YW5jZW9mIF9QYXJzZU9iamVjdC5kZWZhdWx0KSB7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9IG9iamVjdENsYXNzLmNsYXNzTmFtZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3RDbGFzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgb2JqQ2xhc3MgPSBvYmplY3RDbGFzcztcbiAgICAgIGlmICh0eXBlb2Ygb2JqQ2xhc3MuY2xhc3NOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IG9iakNsYXNzLmNsYXNzTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IG5ldyBvYmpDbGFzcygpO1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IG9iai5jbGFzc05hbWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgUGFyc2VRdWVyeSBtdXN0IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBQYXJzZU9iamVjdCBvciBjbGFzcyBuYW1lLicpO1xuICAgIH1cbiAgICB0aGlzLl93aGVyZSA9IHt9O1xuICAgIHRoaXMuX3dhdGNoID0gW107XG4gICAgdGhpcy5faW5jbHVkZSA9IFtdO1xuICAgIHRoaXMuX2V4Y2x1ZGUgPSBbXTtcbiAgICB0aGlzLl9jb3VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2xpbWl0ID0gLTE7IC8vIG5lZ2F0aXZlIGxpbWl0IGlzIG5vdCBzZW50IGluIHRoZSBzZXJ2ZXIgcmVxdWVzdFxuICAgIHRoaXMuX3NraXAgPSAwO1xuICAgIHRoaXMuX3JlYWRQcmVmZXJlbmNlID0gbnVsbDtcbiAgICB0aGlzLl9pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSBudWxsO1xuICAgIHRoaXMuX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSBudWxsO1xuICAgIHRoaXMuX3F1ZXJpZXNMb2NhbERhdGFzdG9yZSA9IGZhbHNlO1xuICAgIHRoaXMuX2xvY2FsRGF0YXN0b3JlUGluTmFtZSA9IG51bGw7XG4gICAgdGhpcy5fZXh0cmFPcHRpb25zID0ge307XG4gICAgdGhpcy5feGhyUmVxdWVzdCA9IHtcbiAgICAgIHRhc2s6IG51bGwsXG4gICAgICBvbmNoYW5nZTogKCkgPT4ge31cbiAgICB9O1xuICAgIHRoaXMuX2NvbW1lbnQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY29uc3RyYWludCB0aGF0IGF0IGxlYXN0IG9uZSBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMgbWF0Y2hlcy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gcXVlcmllc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIF9vclF1ZXJ5KHF1ZXJpZXMpIHtcbiAgICBjb25zdCBxdWVyeUpTT04gPSAoMCwgX21hcC5kZWZhdWx0KShxdWVyaWVzKS5jYWxsKHF1ZXJpZXMsIHEgPT4ge1xuICAgICAgcmV0dXJuIHEudG9KU09OKCkud2hlcmU7XG4gICAgfSk7XG4gICAgdGhpcy5fd2hlcmUuJG9yID0gcXVlcnlKU09OO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY29uc3RyYWludCB0aGF0IGFsbCBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMgbWF0Y2guXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHF1ZXJpZXNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBfYW5kUXVlcnkocXVlcmllcykge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9ICgwLCBfbWFwLmRlZmF1bHQpKHF1ZXJpZXMpLmNhbGwocXVlcmllcywgcSA9PiB7XG4gICAgICByZXR1cm4gcS50b0pTT04oKS53aGVyZTtcbiAgICB9KTtcbiAgICB0aGlzLl93aGVyZS4kYW5kID0gcXVlcnlKU09OO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY29uc3RyYWludCB0aGF0IG5vbmUgb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzIG1hdGNoLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBxdWVyaWVzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgX25vclF1ZXJ5KHF1ZXJpZXMpIHtcbiAgICBjb25zdCBxdWVyeUpTT04gPSAoMCwgX21hcC5kZWZhdWx0KShxdWVyaWVzKS5jYWxsKHF1ZXJpZXMsIHEgPT4ge1xuICAgICAgcmV0dXJuIHEudG9KU09OKCkud2hlcmU7XG4gICAgfSk7XG4gICAgdGhpcy5fd2hlcmUuJG5vciA9IHF1ZXJ5SlNPTjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZm9yIGNvbmRpdGlvbiBxdWVyaWVzXG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIGNvbmRpdGlvblxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fVxuICAgKi9cbiAgX2FkZENvbmRpdGlvbihrZXksIGNvbmRpdGlvbiwgdmFsdWUpIHtcbiAgICBpZiAoIXRoaXMuX3doZXJlW2tleV0gfHwgdHlwZW9mIHRoaXMuX3doZXJlW2tleV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl93aGVyZVtrZXldID0ge307XG4gICAgfVxuICAgIHRoaXMuX3doZXJlW2tleV1bY29uZGl0aW9uXSA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHZhbHVlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgc3RyaW5nIGZvciByZWd1bGFyIGV4cHJlc3Npb24gYXQgdGhlIGJlZ2lubmluZ1xuICAgKlxuICAgKiBAcGFyYW0gc3RyaW5nXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBfcmVnZXhTdGFydFdpdGgoc3RyaW5nKSB7XG4gICAgcmV0dXJuICdeJyArIHF1b3RlKHN0cmluZyk7XG4gIH1cbiAgYXN5bmMgX2hhbmRsZU9mZmxpbmVRdWVyeShwYXJhbXMpIHtcbiAgICB2YXIgX2NvbnRleHQ7XG4gICAgX09mZmxpbmVRdWVyeS5kZWZhdWx0LnZhbGlkYXRlUXVlcnkodGhpcyk7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGNvbnN0IG9iamVjdHMgPSBhd2FpdCBsb2NhbERhdGFzdG9yZS5fc2VyaWFsaXplT2JqZWN0c0Zyb21QaW5OYW1lKHRoaXMuX2xvY2FsRGF0YXN0b3JlUGluTmFtZSk7XG4gICAgbGV0IHJlc3VsdHMgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShfY29udGV4dCA9ICgwLCBfbWFwLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgKGpzb24sIGluZGV4LCBhcnIpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdCA9IF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKGpzb24sIGZhbHNlKTtcbiAgICAgIGlmIChqc29uLl9sb2NhbElkICYmICFqc29uLm9iamVjdElkKSB7XG4gICAgICAgIG9iamVjdC5fbG9jYWxJZCA9IGpzb24uX2xvY2FsSWQ7XG4gICAgICB9XG4gICAgICBpZiAoIV9PZmZsaW5lUXVlcnkuZGVmYXVsdC5tYXRjaGVzUXVlcnkodGhpcy5jbGFzc05hbWUsIG9iamVjdCwgYXJyLCB0aGlzKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSkpLmNhbGwoX2NvbnRleHQsIG9iamVjdCA9PiBvYmplY3QgIT09IG51bGwpO1xuICAgIGlmICgoMCwgX2tleXMyLmRlZmF1bHQpKHBhcmFtcykpIHtcbiAgICAgIGxldCBrZXlzID0gKDAsIF9rZXlzMi5kZWZhdWx0KShwYXJhbXMpLnNwbGl0KCcsJyk7XG4gICAgICBrZXlzID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBbJ2NsYXNzTmFtZScsICdvYmplY3RJZCcsICdjcmVhdGVkQXQnLCAndXBkYXRlZEF0JywgJ0FDTCddKTtcbiAgICAgIHJlc3VsdHMgPSAoMCwgX21hcC5kZWZhdWx0KShyZXN1bHRzKS5jYWxsKHJlc3VsdHMsIG9iamVjdCA9PiB7XG4gICAgICAgIHZhciBfY29udGV4dDI7XG4gICAgICAgIGNvbnN0IGpzb24gPSBvYmplY3QuX3RvRnVsbEpTT04oKTtcbiAgICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0MiA9ICgwLCBfa2V5cy5kZWZhdWx0KShqc29uKSkuY2FsbChfY29udGV4dDIsIGtleSA9PiB7XG4gICAgICAgICAgaWYgKCEoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5KSkge1xuICAgICAgICAgICAgZGVsZXRlIGpzb25ba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04oanNvbiwgZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMub3JkZXIpIHtcbiAgICAgIGNvbnN0IHNvcnRzID0gcGFyYW1zLm9yZGVyLnNwbGl0KCcsJyk7XG4gICAgICAoMCwgX3NvcnQuZGVmYXVsdCkocmVzdWx0cykuY2FsbChyZXN1bHRzLCAoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gaGFuZGxlT2ZmbGluZVNvcnQoYSwgYiwgc29ydHMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBjb3VudDsgLy8gY291bnQgdG90YWwgYmVmb3JlIGFwcGx5aW5nIGxpbWl0L3NraXBcbiAgICBpZiAocGFyYW1zLmNvdW50KSB7XG4gICAgICBjb3VudCA9IHJlc3VsdHMubGVuZ3RoOyAvLyB0b3RhbCBjb3VudCBmcm9tIHJlc3BvbnNlXG4gICAgfVxuICAgIGlmIChwYXJhbXMuc2tpcCkge1xuICAgICAgaWYgKHBhcmFtcy5za2lwID49IHJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdHMgPSAoMCwgX3NwbGljZS5kZWZhdWx0KShyZXN1bHRzKS5jYWxsKHJlc3VsdHMsIHBhcmFtcy5za2lwLCByZXN1bHRzLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBsaW1pdCA9IHJlc3VsdHMubGVuZ3RoO1xuICAgIGlmIChwYXJhbXMubGltaXQgIT09IDAgJiYgcGFyYW1zLmxpbWl0IDwgcmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgIGxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cbiAgICByZXN1bHRzID0gKDAsIF9zcGxpY2UuZGVmYXVsdCkocmVzdWx0cykuY2FsbChyZXN1bHRzLCAwLCBsaW1pdCk7XG4gICAgaWYgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdHMsXG4gICAgICAgIGNvdW50XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcXVlcnkuXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgd2hlcmU6IHRoaXMuX3doZXJlXG4gICAgfTtcbiAgICBpZiAodGhpcy5fd2F0Y2gubGVuZ3RoKSB7XG4gICAgICBwYXJhbXMud2F0Y2ggPSB0aGlzLl93YXRjaC5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbmNsdWRlLmxlbmd0aCkge1xuICAgICAgcGFyYW1zLmluY2x1ZGUgPSB0aGlzLl9pbmNsdWRlLmpvaW4oJywnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V4Y2x1ZGUubGVuZ3RoKSB7XG4gICAgICBwYXJhbXMuZXhjbHVkZUtleXMgPSB0aGlzLl9leGNsdWRlLmpvaW4oJywnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NlbGVjdCkge1xuICAgICAgcGFyYW1zLmtleXMgPSB0aGlzLl9zZWxlY3Quam9pbignLCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY291bnQpIHtcbiAgICAgIHBhcmFtcy5jb3VudCA9IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLl9saW1pdCA+PSAwKSB7XG4gICAgICBwYXJhbXMubGltaXQgPSB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NraXAgPiAwKSB7XG4gICAgICBwYXJhbXMuc2tpcCA9IHRoaXMuX3NraXA7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcmRlcikge1xuICAgICAgcGFyYW1zLm9yZGVyID0gdGhpcy5fb3JkZXIuam9pbignLCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHBhcmFtcy5yZWFkUHJlZmVyZW5jZSA9IHRoaXMuX3JlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgICBwYXJhbXMuaW5jbHVkZVJlYWRQcmVmZXJlbmNlID0gdGhpcy5faW5jbHVkZVJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgICAgcGFyYW1zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5faGludCkge1xuICAgICAgcGFyYW1zLmhpbnQgPSB0aGlzLl9oaW50O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXhwbGFpbikge1xuICAgICAgcGFyYW1zLmV4cGxhaW4gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29tbWVudCkge1xuICAgICAgcGFyYW1zLmNvbW1lbnQgPSB0aGlzLl9jb21tZW50O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl9leHRyYU9wdGlvbnMpIHtcbiAgICAgIHBhcmFtc1trZXldID0gdGhpcy5fZXh0cmFPcHRpb25zW2tleV07XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgcXVlcnkgd2l0aCBjb25kaXRpb25zIGZyb20ganNvbiwgY2FuIGJlIHVzZWZ1bCB0byBzZW5kIHF1ZXJ5IGZyb20gc2VydmVyIHNpZGUgdG8gY2xpZW50XG4gICAqIE5vdCBzdGF0aWMsIGFsbCBxdWVyeSBjb25kaXRpb25zIHdhcyBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBiZSBkZWxldGVkLlxuICAgKiBGb3IgZXhhbXBsZSBvbiB0aGUgc2VydmVyIHNpZGUgd2UgaGF2ZVxuICAgKiB2YXIgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJjbGFzc05hbWVcIik7XG4gICAqIHF1ZXJ5LmVxdWFsVG8oa2V5OiB2YWx1ZSk7XG4gICAqIHF1ZXJ5LmxpbWl0KDEwMCk7XG4gICAqIC4uLiAob3RoZXJzIHF1ZXJpZXMpXG4gICAqIENyZWF0ZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIFF1ZXJ5IE9iamVjdFxuICAgKiB2YXIganNvbkZyb21TZXJ2ZXIgPSBxdWVyeS5mcm9tSlNPTigpO1xuICAgKlxuICAgKiBPbiBjbGllbnQgc2lkZSBnZXR0aW5nIHF1ZXJ5OlxuICAgKiB2YXIgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJjbGFzc05hbWVcIik7XG4gICAqIHF1ZXJ5LmZyb21KU09OKGpzb25Gcm9tU2VydmVyKTtcbiAgICpcbiAgICogYW5kIGNvbnRpbnVlIHRvIHF1ZXJ5Li4uXG4gICAqIHF1ZXJ5LnNraXAoMTAwKS5maW5kKCkudGhlbiguLi4pO1xuICAgKlxuICAgKiBAcGFyYW0ge1F1ZXJ5SlNPTn0ganNvbiBmcm9tIFBhcnNlLlF1ZXJ5LnRvSlNPTigpIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhKU09OKGpzb24pIHtcbiAgICBpZiAoanNvbi53aGVyZSkge1xuICAgICAgdGhpcy5fd2hlcmUgPSBqc29uLndoZXJlO1xuICAgIH1cbiAgICBpZiAoanNvbi53YXRjaCkge1xuICAgICAgdGhpcy5fd2F0Y2ggPSBqc29uLndhdGNoLnNwbGl0KCcsJyk7XG4gICAgfVxuICAgIGlmIChqc29uLmluY2x1ZGUpIHtcbiAgICAgIHRoaXMuX2luY2x1ZGUgPSBqc29uLmluY2x1ZGUuc3BsaXQoJywnKTtcbiAgICB9XG4gICAgaWYgKCgwLCBfa2V5czIuZGVmYXVsdCkoanNvbikpIHtcbiAgICAgIHRoaXMuX3NlbGVjdCA9ICgwLCBfa2V5czIuZGVmYXVsdCkoanNvbikuc3BsaXQoJywnKTtcbiAgICB9XG4gICAgaWYgKGpzb24uZXhjbHVkZUtleXMpIHtcbiAgICAgIHRoaXMuX2V4Y2x1ZGUgPSBqc29uLmV4Y2x1ZGVLZXlzLnNwbGl0KCcsJyk7XG4gICAgfVxuICAgIGlmIChqc29uLmNvdW50KSB7XG4gICAgICB0aGlzLl9jb3VudCA9IGpzb24uY291bnQgPT09IDE7XG4gICAgfVxuICAgIGlmIChqc29uLmxpbWl0KSB7XG4gICAgICB0aGlzLl9saW1pdCA9IGpzb24ubGltaXQ7XG4gICAgfVxuICAgIGlmIChqc29uLnNraXApIHtcbiAgICAgIHRoaXMuX3NraXAgPSBqc29uLnNraXA7XG4gICAgfVxuICAgIGlmIChqc29uLm9yZGVyKSB7XG4gICAgICB0aGlzLl9vcmRlciA9IGpzb24ub3JkZXIuc3BsaXQoJywnKTtcbiAgICB9XG4gICAgaWYgKGpzb24ucmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHRoaXMuX3JlYWRQcmVmZXJlbmNlID0ganNvbi5yZWFkUHJlZmVyZW5jZTtcbiAgICB9XG4gICAgaWYgKGpzb24uaW5jbHVkZVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgICB0aGlzLl9pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSBqc29uLmluY2x1ZGVSZWFkUHJlZmVyZW5jZTtcbiAgICB9XG4gICAgaWYgKGpzb24uc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgICAgdGhpcy5fc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IGpzb24uc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcbiAgICB9XG4gICAgaWYgKGpzb24uaGludCkge1xuICAgICAgdGhpcy5faGludCA9IGpzb24uaGludDtcbiAgICB9XG4gICAgaWYgKGpzb24uZXhwbGFpbikge1xuICAgICAgdGhpcy5fZXhwbGFpbiA9ICEhanNvbi5leHBsYWluO1xuICAgIH1cbiAgICBpZiAoanNvbi5jb21tZW50KSB7XG4gICAgICB0aGlzLl9jb21tZW50ID0ganNvbi5jb21tZW50O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICBpZiAoanNvbi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHZhciBfY29udGV4dDM7XG4gICAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoX2NvbnRleHQzID0gWyd3aGVyZScsICdpbmNsdWRlJywgJ2tleXMnLCAnY291bnQnLCAnbGltaXQnLCAnc2tpcCcsICdvcmRlcicsICdyZWFkUHJlZmVyZW5jZScsICdpbmNsdWRlUmVhZFByZWZlcmVuY2UnLCAnc3VicXVlcnlSZWFkUHJlZmVyZW5jZScsICdoaW50JywgJ2V4cGxhaW4nLCAnY29tbWVudCddKS5jYWxsKF9jb250ZXh0Mywga2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICB0aGlzLl9leHRyYU9wdGlvbnNba2V5XSA9IGpzb25ba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kIHRvIHJlc3RvcmUgUGFyc2UuUXVlcnkgYnkganNvbiByZXByZXNlbnRhdGlvblxuICAgKiBJbnRlcm5hbGx5IGNhbGxpbmcgUGFyc2UuUXVlcnkud2l0aEpTT05cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICAgKiBAcGFyYW0ge1F1ZXJ5SlNPTn0ganNvbiBmcm9tIFBhcnNlLlF1ZXJ5LnRvSlNPTigpIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IG5ldyBjcmVhdGVkIHF1ZXJ5XG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oY2xhc3NOYW1lLCBqc29uKSB7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShjbGFzc05hbWUpO1xuICAgIHJldHVybiBxdWVyeS53aXRoSlNPTihqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUGFyc2UuT2JqZWN0IHdob3NlIGlkIGlzIGFscmVhZHkga25vd24gYnkgZmV0Y2hpbmcgZGF0YSBmcm9tXG4gICAqIHRoZSBzZXJ2ZXIuIFVubGlrZSB0aGUgPGNvZGU+Zmlyc3Q8L2NvZGU+IG1ldGhvZCwgaXQgbmV2ZXIgcmV0dXJucyB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3RJZCBUaGUgaWQgb2YgdGhlIG9iamVjdCB0byBiZSBmZXRjaGVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVGaW5kYCB0cmlnZ2VyLlxuICAgKiAgIDxsaT5qc29uOiBSZXR1cm4gcmF3IGpzb24gd2l0aG91dCBjb252ZXJ0aW5nIHRvIFBhcnNlLk9iamVjdFxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGdldChvYmplY3RJZCwgb3B0aW9ucykge1xuICAgIHRoaXMuZXF1YWxUbygnb2JqZWN0SWQnLCBvYmplY3RJZCk7XG4gICAgY29uc3QgZmlyc3RPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGZpcnN0T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGZpcnN0T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBmaXJzdE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnanNvbicpKSB7XG4gICAgICBmaXJzdE9wdGlvbnMuanNvbiA9IG9wdGlvbnMuanNvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlyc3QoZmlyc3RPcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvck9iamVjdCA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT0JKRUNUX05PVF9GT1VORCwgJ09iamVjdCBub3QgZm91bmQuJyk7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3JPYmplY3QpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIGxpc3Qgb2YgUGFyc2VPYmplY3RzIHRoYXQgc2F0aXNmeSB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zXG4gICAqIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVGaW5kYCB0cmlnZ2VyLlxuICAgKiAgIDxsaT5qc29uOiBSZXR1cm4gcmF3IGpzb24gd2l0aG91dCBjb252ZXJ0aW5nIHRvIFBhcnNlLk9iamVjdFxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBmaW5kKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBmaW5kT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZmluZE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZmluZE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZpbmRPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIHRoaXMuX3NldFJlcXVlc3RUYXNrKGZpbmRPcHRpb25zKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UXVlcnlDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy5fc2VsZWN0O1xuICAgIGlmICh0aGlzLl9xdWVyaWVzTG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVPZmZsaW5lUXVlcnkodGhpcy50b0pTT04oKSk7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX2ZpbmQuZGVmYXVsdCkoY29udHJvbGxlcikuY2FsbChjb250cm9sbGVyLCB0aGlzLmNsYXNzTmFtZSwgdGhpcy50b0pTT04oKSwgZmluZE9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgLy8gUmV0dXJuIGdlbmVyaWMgb2JqZWN0IHdoZW4gZXhwbGFpbiBpcyB1c2VkXG4gICAgICBpZiAodGhpcy5fZXhwbGFpbikge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0cztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSByZXNwb25zZS5yZXN1bHRzPy5tYXAoZGF0YSA9PiB7XG4gICAgICAgIC8vIEluIGNhc2VzIG9mIHJlbGF0aW9ucywgdGhlIHNlcnZlciBtYXkgc2VuZCBiYWNrIGEgY2xhc3NOYW1lXG4gICAgICAgIC8vIG9uIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHBheWxvYWRcbiAgICAgICAgY29uc3Qgb3ZlcnJpZGUgPSByZXNwb25zZS5jbGFzc05hbWUgfHwgdGhpcy5jbGFzc05hbWU7XG4gICAgICAgIGlmICghZGF0YS5jbGFzc05hbWUpIHtcbiAgICAgICAgICBkYXRhLmNsYXNzTmFtZSA9IG92ZXJyaWRlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBkYXRhIG9iamVjdCBjb250YWlucyBrZXlzIGZvciBhbGwgb2JqZWN0cyB0aGF0XG4gICAgICAgIC8vIGhhdmUgYmVlbiByZXF1ZXN0ZWQgd2l0aCBhIHNlbGVjdCwgc28gdGhhdCBvdXIgY2FjaGVkIHN0YXRlXG4gICAgICAgIC8vIHVwZGF0ZXMgY29ycmVjdGx5LlxuICAgICAgICBpZiAoc2VsZWN0KSB7XG4gICAgICAgICAgaGFuZGxlU2VsZWN0UmVzdWx0KGRhdGEsIHNlbGVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTihkYXRhLCAhc2VsZWN0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBjb3VudCA9IHJlc3BvbnNlLmNvdW50O1xuICAgICAgaWYgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXN1bHRzLFxuICAgICAgICAgIGNvdW50XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBjb21wbGV0ZSBsaXN0IG9mIFBhcnNlT2JqZWN0cyB0aGF0IHNhdGlzZnkgdGhpcyBxdWVyeS5cbiAgICogVXNpbmcgYGVhY2hCYXRjaGAgdW5kZXIgdGhlIGhvb2QgdG8gZmV0Y2ggYWxsIHRoZSB2YWxpZCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPmJhdGNoU2l6ZTogSG93IG1hbnkgb2JqZWN0cyB0byB5aWVsZCBpbiBlYWNoIGJhdGNoIChkZWZhdWx0OiAxMDApXG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdHMgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgZmluZEFsbChvcHRpb25zKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGF3YWl0IHRoaXMuZWFjaEJhdGNoKG9iamVjdHMgPT4ge1xuICAgICAgcmVzdWx0ID0gWy4uLnJlc3VsdCwgLi4ub2JqZWN0c107XG4gICAgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudHMgdGhlIG51bWJlciBvZiBvYmplY3RzIHRoYXQgbWF0Y2ggdGhpcyBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy51c2VNYXN0ZXJLZXldXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zZXNzaW9uVG9rZW5dXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgY291bnQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgY291bnQob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGZpbmRPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBmaW5kT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBmaW5kT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgdGhpcy5fc2V0UmVxdWVzdFRhc2soZmluZE9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRRdWVyeUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnRvSlNPTigpO1xuICAgIHBhcmFtcy5saW1pdCA9IDA7XG4gICAgcGFyYW1zLmNvdW50ID0gMTtcbiAgICByZXR1cm4gKDAsIF9maW5kLmRlZmF1bHQpKGNvbnRyb2xsZXIpLmNhbGwoY29udHJvbGxlciwgdGhpcy5jbGFzc05hbWUsIHBhcmFtcywgZmluZE9wdGlvbnMpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgIHJldHVybiByZXN1bHQuY291bnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBkaXN0aW5jdCBxdWVyeSBhbmQgcmV0dXJucyB1bmlxdWUgdmFsdWVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQSBmaWVsZCB0byBmaW5kIGRpc3RpbmN0IHZhbHVlc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc2Vzc2lvblRva2VuXSBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb24gYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGRpc3RpbmN0KGtleSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGRpc3RpbmN0T3B0aW9ucyA9IHtcbiAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBkaXN0aW5jdE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIHRoaXMuX3NldFJlcXVlc3RUYXNrKGRpc3RpbmN0T3B0aW9ucyk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFF1ZXJ5Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIGRpc3RpbmN0OiBrZXksXG4gICAgICB3aGVyZTogdGhpcy5fd2hlcmUsXG4gICAgICBoaW50OiB0aGlzLl9oaW50XG4gICAgfTtcbiAgICByZXR1cm4gY29udHJvbGxlci5hZ2dyZWdhdGUodGhpcy5jbGFzc05hbWUsIHBhcmFtcywgZGlzdGluY3RPcHRpb25zKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBhZ2dyZWdhdGUgcXVlcnkgYW5kIHJldHVybnMgYWdncmVnYXRlIHJlc3VsdHNcbiAgICpcbiAgICogQHBhcmFtIHsoQXJyYXl8b2JqZWN0KX0gcGlwZWxpbmUgQXJyYXkgb3IgT2JqZWN0IG9mIHN0YWdlcyB0byBwcm9jZXNzIHF1ZXJ5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zZXNzaW9uVG9rZW5dIEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvbiBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgYWdncmVnYXRlKHBpcGVsaW5lLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgYWdncmVnYXRlT3B0aW9ucyA9IHtcbiAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBhZ2dyZWdhdGVPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRSZXF1ZXN0VGFzayhhZ2dyZWdhdGVPcHRpb25zKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UXVlcnlDb250cm9sbGVyKCk7XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkocGlwZWxpbmUpICYmIHR5cGVvZiBwaXBlbGluZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwaXBlbGluZSBtdXN0IGJlIEFycmF5IG9yIE9iamVjdCcpO1xuICAgIH1cbiAgICBpZiAoKDAsIF9rZXlzLmRlZmF1bHQpKHRoaXMuX3doZXJlIHx8IHt9KS5sZW5ndGgpIHtcbiAgICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKHBpcGVsaW5lKSkge1xuICAgICAgICBwaXBlbGluZSA9IFtwaXBlbGluZV07XG4gICAgICB9XG4gICAgICBwaXBlbGluZS51bnNoaWZ0KHtcbiAgICAgICAgJG1hdGNoOiB0aGlzLl93aGVyZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIHBpcGVsaW5lLFxuICAgICAgaGludDogdGhpcy5faGludCxcbiAgICAgIGV4cGxhaW46IHRoaXMuX2V4cGxhaW4sXG4gICAgICByZWFkUHJlZmVyZW5jZTogdGhpcy5fcmVhZFByZWZlcmVuY2VcbiAgICB9O1xuICAgIHJldHVybiBjb250cm9sbGVyLmFnZ3JlZ2F0ZSh0aGlzLmNsYXNzTmFtZSwgcGFyYW1zLCBhZ2dyZWdhdGVPcHRpb25zKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYXQgbW9zdCBvbmUgUGFyc2UuT2JqZWN0IHRoYXQgc2F0aXNmaWVzIHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIG9iamVjdCBpZiB0aGVyZSBpcyBvbmUsIG90aGVyd2lzZSB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZUZpbmRgIHRyaWdnZXIuXG4gICAqICAgPGxpPmpzb246IFJldHVybiByYXcganNvbiB3aXRob3V0IGNvbnZlcnRpbmcgdG8gUGFyc2UuT2JqZWN0XG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSBvYmplY3Qgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgZmlyc3QoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNvbnN0IGZpbmRPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBmaW5kT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBmaW5kT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZmluZE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgdGhpcy5fc2V0UmVxdWVzdFRhc2soZmluZE9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRRdWVyeUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnRvSlNPTigpO1xuICAgIHBhcmFtcy5saW1pdCA9IDE7XG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy5fc2VsZWN0O1xuICAgIGlmICh0aGlzLl9xdWVyaWVzTG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVPZmZsaW5lUXVlcnkocGFyYW1zKS50aGVuKG9iamVjdHMgPT4ge1xuICAgICAgICBpZiAoIW9iamVjdHNbMF0pIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3RzWzBdO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX2ZpbmQuZGVmYXVsdCkoY29udHJvbGxlcikuY2FsbChjb250cm9sbGVyLCB0aGlzLmNsYXNzTmFtZSwgcGFyYW1zLCBmaW5kT3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBjb25zdCBvYmplY3RzID0gcmVzcG9uc2UucmVzdWx0cztcbiAgICAgIGlmICghb2JqZWN0c1swXSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKCFvYmplY3RzWzBdLmNsYXNzTmFtZSkge1xuICAgICAgICBvYmplY3RzWzBdLmNsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5zIGtleXMgZm9yIGFsbCBvYmplY3RzIHRoYXRcbiAgICAgIC8vIGhhdmUgYmVlbiByZXF1ZXN0ZWQgd2l0aCBhIHNlbGVjdCwgc28gdGhhdCBvdXIgY2FjaGVkIHN0YXRlXG4gICAgICAvLyB1cGRhdGVzIGNvcnJlY3RseS5cbiAgICAgIGlmIChzZWxlY3QpIHtcbiAgICAgICAgaGFuZGxlU2VsZWN0UmVzdWx0KG9iamVjdHNbMF0sIHNlbGVjdCk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RzWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKG9iamVjdHNbMF0sICFzZWxlY3QpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgb2JqZWN0cyBtYXRjaGluZyBhIHF1ZXJ5LCBjYWxsaW5nIGEgY2FsbGJhY2sgZm9yIGVhY2ggYmF0Y2guXG4gICAqIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcHJvbWlzZSwgdGhlIGl0ZXJhdGlvbiB3aWxsIG5vdCBjb250aW51ZSB1bnRpbFxuICAgKiB0aGF0IHByb21pc2UgaGFzIGJlZW4gZnVsZmlsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHJlamVjdGVkXG4gICAqIHByb21pc2UsIHRoZW4gaXRlcmF0aW9uIHdpbGwgc3RvcCB3aXRoIHRoYXQgZXJyb3IuIFRoZSBpdGVtcyBhcmUgcHJvY2Vzc2VkXG4gICAqIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLiBUaGUgcXVlcnkgbWF5IG5vdCBoYXZlIGFueSBzb3J0IG9yZGVyLCBhbmQgbWF5XG4gICAqIG5vdCB1c2UgbGltaXQgb3Igc2tpcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGVhY2ggcmVzdWx0XG4gICAqICAgICBvZiB0aGUgcXVlcnkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+YmF0Y2hTaXplOiBIb3cgbWFueSBvYmplY3RzIHRvIHlpZWxkIGluIGVhY2ggYmF0Y2ggKGRlZmF1bHQ6IDEwMClcbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZUZpbmRgIHRyaWdnZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZVxuICAgKiAgICAgaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBlYWNoQmF0Y2goY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAodGhpcy5fb3JkZXIgfHwgdGhpcy5fc2tpcCB8fCB0aGlzLl9saW1pdCA+PSAwKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ0Nhbm5vdCBpdGVyYXRlIG9uIGEgcXVlcnkgd2l0aCBzb3J0LCBza2lwLCBvciBsaW1pdC4nKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeSh0aGlzLmNsYXNzTmFtZSk7XG4gICAgcXVlcnkuX2xpbWl0ID0gb3B0aW9ucy5iYXRjaFNpemUgfHwgMTAwO1xuICAgIHF1ZXJ5Ll9pbmNsdWRlID0gWy4uLnRoaXMuX2luY2x1ZGVdO1xuICAgIHF1ZXJ5Ll9leGNsdWRlID0gWy4uLnRoaXMuX2V4Y2x1ZGVdO1xuICAgIGlmICh0aGlzLl9zZWxlY3QpIHtcbiAgICAgIHF1ZXJ5Ll9zZWxlY3QgPSBbLi4udGhpcy5fc2VsZWN0XTtcbiAgICB9XG4gICAgcXVlcnkuX2hpbnQgPSB0aGlzLl9oaW50O1xuICAgIHF1ZXJ5Ll93aGVyZSA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiB0aGlzLl93aGVyZSkge1xuICAgICAgY29uc3QgdmFsID0gdGhpcy5fd2hlcmVbYXR0cl07XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbCkpIHtcbiAgICAgICAgcXVlcnkuX3doZXJlW2F0dHJdID0gKDAsIF9tYXAuZGVmYXVsdCkodmFsKS5jYWxsKHZhbCwgdiA9PiB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uTWFwID0ge307XG4gICAgICAgIHF1ZXJ5Ll93aGVyZVthdHRyXSA9IGNvbmRpdGlvbk1hcDtcbiAgICAgICAgZm9yIChjb25zdCBjb25kIGluIHZhbCkge1xuICAgICAgICAgIGNvbmRpdGlvbk1hcFtjb25kXSA9IHZhbFtjb25kXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkuX3doZXJlW2F0dHJdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICBxdWVyeS5hc2NlbmRpbmcoJ29iamVjdElkJyk7XG4gICAgY29uc3QgZmluZE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBmaW5kT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnanNvbicpKSB7XG4gICAgICBmaW5kT3B0aW9ucy5qc29uID0gb3B0aW9ucy5qc29uO1xuICAgIH1cbiAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICBsZXQgcHJldmlvdXNSZXN1bHRzID0gW107XG4gICAgcmV0dXJuICgwLCBfcHJvbWlzZVV0aWxzLmNvbnRpbnVlV2hpbGUpKCgpID0+IHtcbiAgICAgIHJldHVybiAhZmluaXNoZWQ7XG4gICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgW3Jlc3VsdHNdID0gYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwoWygwLCBfZmluZC5kZWZhdWx0KShxdWVyeSkuY2FsbChxdWVyeSwgZmluZE9wdGlvbnMpLCBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUocHJldmlvdXNSZXN1bHRzLmxlbmd0aCA+IDAgJiYgY2FsbGJhY2socHJldmlvdXNSZXN1bHRzKSldKTtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+PSBxdWVyeS5fbGltaXQpIHtcbiAgICAgICAgcXVlcnkuZ3JlYXRlclRoYW4oJ29iamVjdElkJywgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLmlkKTtcbiAgICAgICAgcHJldmlvdXNSZXN1bHRzID0gcmVzdWx0cztcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjYWxsYmFjayhyZXN1bHRzKSk7XG4gICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIGVhY2ggcmVzdWx0IG9mIGEgcXVlcnksIGNhbGxpbmcgYSBjYWxsYmFjayBmb3IgZWFjaCBvbmUuIElmXG4gICAqIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcHJvbWlzZSwgdGhlIGl0ZXJhdGlvbiB3aWxsIG5vdCBjb250aW51ZSB1bnRpbFxuICAgKiB0aGF0IHByb21pc2UgaGFzIGJlZW4gZnVsZmlsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHJlamVjdGVkXG4gICAqIHByb21pc2UsIHRoZW4gaXRlcmF0aW9uIHdpbGwgc3RvcCB3aXRoIHRoYXQgZXJyb3IuIFRoZSBpdGVtcyBhcmVcbiAgICogcHJvY2Vzc2VkIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLiBUaGUgcXVlcnkgbWF5IG5vdCBoYXZlIGFueSBzb3J0IG9yZGVyLFxuICAgKiBhbmQgbWF5IG5vdCB1c2UgbGltaXQgb3Igc2tpcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGVhY2ggcmVzdWx0XG4gICAqICAgICBvZiB0aGUgcXVlcnkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5qc29uOiBSZXR1cm4gcmF3IGpzb24gd2l0aG91dCBjb252ZXJ0aW5nIHRvIFBhcnNlLk9iamVjdFxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgb25jZSB0aGVcbiAgICogICAgIGl0ZXJhdGlvbiBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgZWFjaChjYWxsYmFjaywgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmVhY2hCYXRjaChyZXN1bHRzID0+IHtcbiAgICAgIGxldCBjYWxsYmFja3NEb25lID0gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKCk7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocmVzdWx0cykuY2FsbChyZXN1bHRzLCByZXN1bHQgPT4ge1xuICAgICAgICBjYWxsYmFja3NEb25lID0gY2FsbGJhY2tzRG9uZS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjYWxsYmFja3NEb25lO1xuICAgIH0sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBoaW50IHRvIGZvcmNlIGluZGV4IHNlbGVjdGlvbi4gKGh0dHBzOi8vZG9jcy5tb25nb2RiLmNvbS9tYW51YWwvcmVmZXJlbmNlL29wZXJhdG9yL21ldGEvaGludC8pXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSB2YWx1ZSBTdHJpbmcgb3IgT2JqZWN0IG9mIGluZGV4IHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBleGVjdXRpbmcgcXVlcnlcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBoaW50KHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9oaW50O1xuICAgIH1cbiAgICB0aGlzLl9oaW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW52ZXN0aWdhdGVzIHRoZSBxdWVyeSBleGVjdXRpb24gcGxhbi4gVXNlZnVsIGZvciBvcHRpbWl6aW5nIHF1ZXJpZXMuIChodHRwczovL2RvY3MubW9uZ29kYi5jb20vbWFudWFsL3JlZmVyZW5jZS9vcGVyYXRvci9tZXRhL2V4cGxhaW4vKVxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV4cGxhaW4gVXNlZCB0byB0b2dnbGUgdGhlIGluZm9ybWF0aW9uIG9uIHRoZSBxdWVyeSBwbGFuLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGV4cGxhaW4oKSB7XG4gICAgbGV0IGV4cGxhaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gICAgaWYgKHR5cGVvZiBleHBsYWluICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbiBvbmx5IHNldCBleHBsYWluIHRvIGEgYm9vbGVhbiB2YWx1ZScpO1xuICAgIH1cbiAgICB0aGlzLl9leHBsYWluID0gZXhwbGFpbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIGVhY2ggcmVzdWx0IG9mIGEgcXVlcnksIGNhbGxpbmcgYSBjYWxsYmFjayBmb3IgZWFjaCBvbmUuIElmXG4gICAqIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcHJvbWlzZSwgdGhlIGl0ZXJhdGlvbiB3aWxsIG5vdCBjb250aW51ZSB1bnRpbFxuICAgKiB0aGF0IHByb21pc2UgaGFzIGJlZW4gZnVsZmlsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHJlamVjdGVkXG4gICAqIHByb21pc2UsIHRoZW4gaXRlcmF0aW9uIHdpbGwgc3RvcCB3aXRoIHRoYXQgZXJyb3IuIFRoZSBpdGVtcyBhcmVcbiAgICogcHJvY2Vzc2VkIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLiBUaGUgcXVlcnkgbWF5IG5vdCBoYXZlIGFueSBzb3J0IG9yZGVyLFxuICAgKiBhbmQgbWF5IG5vdCB1c2UgbGltaXQgb3Igc2tpcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgPHVsPlxuICAgKiAgIDxsaT5jdXJyZW50T2JqZWN0OiBUaGUgY3VycmVudCBQYXJzZS5PYmplY3QgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBhcnJheS48L2xpPlxuICAgKiAgIDxsaT5pbmRleDogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IFBhcnNlLk9iamVjdCBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIGFycmF5LjwvbGk+XG4gICAqICAgPGxpPnF1ZXJ5OiBUaGUgcXVlcnkgbWFwIHdhcyBjYWxsZWQgdXBvbi48L2xpPlxuICAgKiA8L3VsPlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlXG4gICAqICAgICBpdGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIGFzeW5jIG1hcChjYWxsYmFjaywgb3B0aW9ucykge1xuICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBhd2FpdCB0aGlzLmVhY2gob2JqZWN0ID0+IHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY2FsbGJhY2sob2JqZWN0LCBpbmRleCwgdGhpcykpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgYXJyYXkucHVzaChyZXN1bHQpO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfSk7XG4gICAgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgZWFjaCByZXN1bHQgb2YgYSBxdWVyeSwgY2FsbGluZyBhIGNhbGxiYWNrIGZvciBlYWNoIG9uZS4gSWZcbiAgICogdGhlIGNhbGxiYWNrIHJldHVybnMgYSBwcm9taXNlLCB0aGUgaXRlcmF0aW9uIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsXG4gICAqIHRoYXQgcHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcmVqZWN0ZWRcbiAgICogcHJvbWlzZSwgdGhlbiBpdGVyYXRpb24gd2lsbCBzdG9wIHdpdGggdGhhdCBlcnJvci4gVGhlIGl0ZW1zIGFyZVxuICAgKiBwcm9jZXNzZWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIuIFRoZSBxdWVyeSBtYXkgbm90IGhhdmUgYW55IHNvcnQgb3JkZXIsXG4gICAqIGFuZCBtYXkgbm90IHVzZSBsaW1pdCBvciBza2lwLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayA8dWw+XG4gICAqICAgPGxpPmFjY3VtdWxhdG9yOiBUaGUgYWNjdW11bGF0b3IgYWNjdW11bGF0ZXMgdGhlIGNhbGxiYWNrJ3MgcmV0dXJuIHZhbHVlcy4gSXQgaXMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW4gdGhlIGxhc3QgaW52b2NhdGlvbiBvZiB0aGUgY2FsbGJhY2suPC9saT5cbiAgICogICA8bGk+Y3VycmVudE9iamVjdDogVGhlIGN1cnJlbnQgUGFyc2UuT2JqZWN0IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgYXJyYXkuPC9saT5cbiAgICogICA8bGk+aW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBQYXJzZS5PYmplY3QgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBhcnJheS48L2xpPlxuICAgKiA8L3VsPlxuICAgKiBAcGFyYW0geyp9IGluaXRpYWxWYWx1ZSBBIHZhbHVlIHRvIHVzZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGZpcnN0IGNhbGwgb2YgdGhlIGNhbGxiYWNrLiBJZiBubyBpbml0aWFsVmFsdWUgaXMgc3VwcGxpZWQsIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIHF1ZXJ5IHdpbGwgYmUgdXNlZCBhbmQgc2tpcHBlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZVxuICAgKiAgICAgaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBhc3luYyByZWR1Y2UoY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgb3B0aW9ucykge1xuICAgIGxldCBhY2N1bXVsYXRvciA9IGluaXRpYWxWYWx1ZTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGF3YWl0IHRoaXMuZWFjaChvYmplY3QgPT4ge1xuICAgICAgLy8gSWYgbm8gaW5pdGlhbCB2YWx1ZSB3YXMgZ2l2ZW4sIHdlIHRha2UgdGhlIGZpcnN0IG9iamVjdCBmcm9tIHRoZSBxdWVyeVxuICAgICAgLy8gYXMgdGhlIGluaXRpYWwgdmFsdWUgYW5kIGRvbid0IGNhbGwgdGhlIGNhbGxiYWNrIHdpdGggaXQuXG4gICAgICBpZiAoaW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWNjdW11bGF0b3IgPSBvYmplY3Q7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY2FsbGJhY2soYWNjdW11bGF0b3IsIG9iamVjdCwgaW5kZXgpKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGFjY3VtdWxhdG9yID0gcmVzdWx0O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfSk7XG4gICAgfSwgb3B0aW9ucyk7XG4gICAgaWYgKGluZGV4ID09PSAwICYmIGluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBNYXRjaCBBcnJheS5yZWR1Y2UgYmVoYXZpb3I6IFwiQ2FsbGluZyByZWR1Y2UoKSBvbiBhbiBlbXB0eSBhcnJheVxuICAgICAgLy8gd2l0aG91dCBhbiBpbml0aWFsVmFsdWUgd2lsbCB0aHJvdyBhIFR5cGVFcnJvclwiLlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVkdWNpbmcgZW1wdHkgcXVlcnkgcmVzdWx0IHNldCB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgZWFjaCByZXN1bHQgb2YgYSBxdWVyeSwgY2FsbGluZyBhIGNhbGxiYWNrIGZvciBlYWNoIG9uZS4gSWZcbiAgICogdGhlIGNhbGxiYWNrIHJldHVybnMgYSBwcm9taXNlLCB0aGUgaXRlcmF0aW9uIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsXG4gICAqIHRoYXQgcHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcmVqZWN0ZWRcbiAgICogcHJvbWlzZSwgdGhlbiBpdGVyYXRpb24gd2lsbCBzdG9wIHdpdGggdGhhdCBlcnJvci4gVGhlIGl0ZW1zIGFyZVxuICAgKiBwcm9jZXNzZWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIuIFRoZSBxdWVyeSBtYXkgbm90IGhhdmUgYW55IHNvcnQgb3JkZXIsXG4gICAqIGFuZCBtYXkgbm90IHVzZSBsaW1pdCBvciBza2lwLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayA8dWw+XG4gICAqICAgPGxpPmN1cnJlbnRPYmplY3Q6IFRoZSBjdXJyZW50IFBhcnNlLk9iamVjdCBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIGFycmF5LjwvbGk+XG4gICAqICAgPGxpPmluZGV4OiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgUGFyc2UuT2JqZWN0IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgYXJyYXkuPC9saT5cbiAgICogICA8bGk+cXVlcnk6IFRoZSBxdWVyeSBmaWx0ZXIgd2FzIGNhbGxlZCB1cG9uLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgb25jZSB0aGVcbiAgICogICAgIGl0ZXJhdGlvbiBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgYXN5bmMgZmlsdGVyKGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGF3YWl0IHRoaXMuZWFjaChvYmplY3QgPT4ge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjYWxsYmFjayhvYmplY3QsIGluZGV4LCB0aGlzKSkudGhlbihmbGFnID0+IHtcbiAgICAgICAgaWYgKGZsYWcpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH0pO1xuICAgIH0sIG9wdGlvbnMpO1xuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qIFF1ZXJ5IENvbmRpdGlvbnMgKi9cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGVxdWFsIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIFBhcnNlLk9iamVjdCBtdXN0IGNvbnRhaW4uXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZXF1YWxUbyhrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSAmJiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIF9jb250ZXh0NDtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDQgPSAoMCwgX2VudHJpZXMuZGVmYXVsdCkoa2V5KSkuY2FsbChfY29udGV4dDQsIF9yZWYgPT4ge1xuICAgICAgICBsZXQgW2ssIHZhbF0gPSBfcmVmO1xuICAgICAgICByZXR1cm4gdGhpcy5lcXVhbFRvKGssIHZhbCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuZG9lc05vdEV4aXN0KGtleSk7XG4gICAgfVxuICAgIHRoaXMuX3doZXJlW2tleV0gPSAoMCwgX2VuY29kZS5kZWZhdWx0KSh2YWx1ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBub3QgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCBtdXN0IG5vdCBiZSBlcXVhbGxlZC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBub3RFcXVhbFRvKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX2NvbnRleHQ1O1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NSA9ICgwLCBfZW50cmllcy5kZWZhdWx0KShrZXkpKS5jYWxsKF9jb250ZXh0NSwgX3JlZjIgPT4ge1xuICAgICAgICBsZXQgW2ssIHZhbF0gPSBfcmVmMjtcbiAgICAgICAgcmV0dXJuIHRoaXMubm90RXF1YWxUbyhrLCB2YWwpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckbmUnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGxlc3MgdGhhbiB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHByb3ZpZGVzIGFuIHVwcGVyIGJvdW5kLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGxlc3NUaGFuKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRsdCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgZ3JlYXRlciB0aGFuIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgcHJvdmlkZXMgYW4gbG93ZXIgYm91bmQuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZ3JlYXRlclRoYW4oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGd0JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCBwcm92aWRlcyBhbiB1cHBlciBib3VuZC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBsZXNzVGhhbk9yRXF1YWxUbyhrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckbHRlJywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgcHJvdmlkZXMgYW4gbG93ZXIgYm91bmQuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZ3JlYXRlclRoYW5PckVxdWFsVG8oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGd0ZScsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZCBsaXN0IG9mIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0ge0FycmF5PCo+fSB2YWx1ZSBUaGUgdmFsdWVzIHRoYXQgd2lsbCBtYXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjb250YWluZWRJbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckaW4nLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIG5vdCBiZSBjb250YWluZWQgaW4gdGhlIHByb3ZpZGVkIGxpc3Qgb2YgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB7QXJyYXk8Kj59IHZhbHVlIFRoZSB2YWx1ZXMgdGhhdCB3aWxsIG5vdCBtYXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBub3RDb250YWluZWRJbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckbmluJywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBjb250YWluZWQgYnkgdGhlIHByb3ZpZGVkIGxpc3Qgb2YgdmFsdWVzLiBHZXQgb2JqZWN0cyB3aGVyZSBhbGwgYXJyYXkgZWxlbWVudHMgbWF0Y2guXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdGhhdCB3aWxsIG1hdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNvbnRhaW5lZEJ5KGtleSwgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckY29udGFpbmVkQnknLCB2YWx1ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBjb250YWluIGVhY2ggb25lIG9mIHRoZSBwcm92aWRlZCBsaXN0IG9mIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLiAgVGhpcyBrZXkncyB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5LlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0aGF0IHdpbGwgbWF0Y2guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgY29udGFpbnNBbGwoa2V5LCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRhbGwnLCB2YWx1ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBjb250YWluIGVhY2ggb25lIG9mIHRoZSBwcm92aWRlZCBsaXN0IG9mIHZhbHVlcyBzdGFydGluZyB3aXRoIGdpdmVuIHN0cmluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay4gIFRoaXMga2V5J3MgdmFsdWUgbXVzdCBiZSBhbiBhcnJheS5cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSB2YWx1ZXMgVGhlIHN0cmluZyB2YWx1ZXMgdGhhdCB3aWxsIG1hdGNoIGFzIHN0YXJ0aW5nIHN0cmluZy5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjb250YWluc0FsbFN0YXJ0aW5nV2l0aChrZXksIHZhbHVlcykge1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlcykpIHtcbiAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdO1xuICAgIH1cbiAgICBjb25zdCByZWdleE9iamVjdCA9ICgwLCBfbWFwLmRlZmF1bHQpKHZhbHVlcykuY2FsbCh2YWx1ZXMsIHZhbHVlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICRyZWdleDogdGhpcy5fcmVnZXhTdGFydFdpdGgodmFsdWUpXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5zQWxsKGtleSwgcmVnZXhPYmplY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IGZvciBmaW5kaW5nIG9iamVjdHMgdGhhdCBjb250YWluIHRoZSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHNob3VsZCBleGlzdC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBleGlzdHMoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZXhpc3RzJywgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgb2JqZWN0cyB0aGF0IGRvIG5vdCBjb250YWluIGEgZ2l2ZW4ga2V5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCBzaG91bGQgbm90IGV4aXN0XG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZG9lc05vdEV4aXN0KGtleSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGV4aXN0cycsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVndWxhciBleHByZXNzaW9uIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgc3RyaW5nIHZhbHVlcyB0aGF0IG1hdGNoXG4gICAqIHRoZSBwcm92aWRlZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqIFRoaXMgbWF5IGJlIHNsb3cgZm9yIGxhcmdlIGRhdGFzZXRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgc3RyaW5nIHRvIG1hdGNoIGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtSZWdFeHAgfCBzdHJpbmd9IHJlZ2V4IFRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGlmaWVycyBUaGUgcmVndWxhciBleHByZXNzaW9uIG1vZGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbWF0Y2hlcyhrZXksIHJlZ2V4LCBtb2RpZmllcnMpIHtcbiAgICB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJHJlZ2V4JywgcmVnZXgpO1xuICAgIGlmICghbW9kaWZpZXJzKSB7XG4gICAgICBtb2RpZmllcnMgPSAnJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWdleCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChyZWdleC5pZ25vcmVDYXNlKSB7XG4gICAgICAgIG1vZGlmaWVycyArPSAnaSc7XG4gICAgICB9XG4gICAgICBpZiAocmVnZXgubXVsdGlsaW5lKSB7XG4gICAgICAgIG1vZGlmaWVycyArPSAnbSc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2RpZmllcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJG9wdGlvbnMnLCBtb2RpZmllcnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0aGF0IHJlcXVpcmVzIHRoYXQgYSBrZXkncyB2YWx1ZSBtYXRjaGVzIGEgUGFyc2UuUXVlcnlcbiAgICogY29uc3RyYWludC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIGNvbnRhaW5zIHRoZSBvYmplY3QgdG8gbWF0Y2ggdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgcXVlcnkuXG4gICAqIEBwYXJhbSB7UGFyc2UuUXVlcnl9IHF1ZXJ5IFRoZSBxdWVyeSB0aGF0IHNob3VsZCBtYXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBtYXRjaGVzUXVlcnkoa2V5LCBxdWVyeSkge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9IHF1ZXJ5LnRvSlNPTigpO1xuICAgIHF1ZXJ5SlNPTi5jbGFzc05hbWUgPSBxdWVyeS5jbGFzc05hbWU7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckaW5RdWVyeScsIHF1ZXJ5SlNPTik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdGhhdCByZXF1aXJlcyB0aGF0IGEga2V5J3MgdmFsdWUgbm90IG1hdGNoZXMgYVxuICAgKiBQYXJzZS5RdWVyeSBjb25zdHJhaW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgY29udGFpbnMgdGhlIG9iamVjdCB0byBtYXRjaCB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICBxdWVyeS5cbiAgICogQHBhcmFtIHtQYXJzZS5RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IHRoYXQgc2hvdWxkIG5vdCBtYXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBkb2VzTm90TWF0Y2hRdWVyeShrZXksIHF1ZXJ5KSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gcXVlcnkudG9KU09OKCk7XG4gICAgcXVlcnlKU09OLmNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRub3RJblF1ZXJ5JywgcXVlcnlKU09OKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0aGF0IHJlcXVpcmVzIHRoYXQgYSBrZXkncyB2YWx1ZSBtYXRjaGVzIGEgdmFsdWUgaW5cbiAgICogYW4gb2JqZWN0IHJldHVybmVkIGJ5IGEgZGlmZmVyZW50IFBhcnNlLlF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCBjb250YWlucyB0aGUgdmFsdWUgdGhhdCBpcyBiZWluZ1xuICAgKiAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeUtleSBUaGUga2V5IGluIHRoZSBvYmplY3RzIHJldHVybmVkIGJ5IHRoZSBxdWVyeSB0b1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIHtQYXJzZS5RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHJ1bi5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBtYXRjaGVzS2V5SW5RdWVyeShrZXksIHF1ZXJ5S2V5LCBxdWVyeSkge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9IHF1ZXJ5LnRvSlNPTigpO1xuICAgIHF1ZXJ5SlNPTi5jbGFzc05hbWUgPSBxdWVyeS5jbGFzc05hbWU7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckc2VsZWN0Jywge1xuICAgICAga2V5OiBxdWVyeUtleSxcbiAgICAgIHF1ZXJ5OiBxdWVyeUpTT05cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0aGF0IHJlcXVpcmVzIHRoYXQgYSBrZXkncyB2YWx1ZSBub3QgbWF0Y2ggYSB2YWx1ZSBpblxuICAgKiBhbiBvYmplY3QgcmV0dXJuZWQgYnkgYSBkaWZmZXJlbnQgUGFyc2UuUXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZSB0aGF0IGlzIGJlaW5nXG4gICAqICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeUtleSBUaGUga2V5IGluIHRoZSBvYmplY3RzIHJldHVybmVkIGJ5IHRoZSBxdWVyeSB0b1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggYWdhaW5zdC5cbiAgICogQHBhcmFtIHtQYXJzZS5RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHJ1bi5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBkb2VzTm90TWF0Y2hLZXlJblF1ZXJ5KGtleSwgcXVlcnlLZXksIHF1ZXJ5KSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gcXVlcnkudG9KU09OKCk7XG4gICAgcXVlcnlKU09OLmNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRkb250U2VsZWN0Jywge1xuICAgICAga2V5OiBxdWVyeUtleSxcbiAgICAgIHF1ZXJ5OiBxdWVyeUpTT05cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCBmb3IgZmluZGluZyBzdHJpbmcgdmFsdWVzIHRoYXQgY29udGFpbiBhIHByb3ZpZGVkXG4gICAqIHN0cmluZy4gIFRoaXMgbWF5IGJlIHNsb3cgZm9yIGxhcmdlIGRhdGFzZXRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgc3RyaW5nIHRvIG1hdGNoIGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnN0cmluZyBUaGUgc3Vic3RyaW5nIHRoYXQgdGhlIHZhbHVlIG11c3QgY29udGFpbi5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjb250YWlucyhrZXksIHN1YnN0cmluZykge1xuICAgIGlmICh0eXBlb2Ygc3Vic3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgYmVpbmcgc2VhcmNoZWQgZm9yIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJHJlZ2V4JywgcXVvdGUoc3Vic3RyaW5nKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgc3RyaW5nIHZhbHVlcyB0aGF0IGNvbnRhaW4gYSBwcm92aWRlZFxuICAgKiBzdHJpbmcuIFRoaXMgbWF5IGJlIHNsb3cgZm9yIGxhcmdlIGRhdGFzZXRzLiBSZXF1aXJlcyBQYXJzZS1TZXJ2ZXIgPiAyLjUuMFxuICAgKlxuICAgKiBJbiBvcmRlciB0byBzb3J0IHlvdSBtdXN0IHVzZSBzZWxlY3QgYW5kIGFzY2VuZGluZyAoJHNjb3JlIGlzIHJlcXVpcmVkKVxuICAgKiAgPHByZT5cbiAgICogICBxdWVyeS5mdWxsVGV4dCgnZmllbGQnLCAndGVybScpO1xuICAgKiAgIHF1ZXJ5LmFzY2VuZGluZygnJHNjb3JlJyk7XG4gICAqICAgcXVlcnkuc2VsZWN0KCckc2NvcmUnKTtcbiAgICogIDwvcHJlPlxuICAgKlxuICAgKiBUbyByZXRyaWV2ZSB0aGUgd2VpZ2h0IC8gcmFua1xuICAgKiAgPHByZT5cbiAgICogICBvYmplY3QtPmdldCgnc2NvcmUnKTtcbiAgICogIDwvcHJlPlxuICAgKlxuICAgKiBZb3UgY2FuIGRlZmluZSBvcHRpb25hbHMgYnkgcHJvdmlkaW5nIGFuIG9iamVjdCBhcyBhIHRoaXJkIHBhcmFtZXRlclxuICAgKiAgPHByZT5cbiAgICogICBxdWVyeS5mdWxsVGV4dCgnZmllbGQnLCAndGVybScsIHsgbGFuZ3VhZ2U6ICdlcycsIGRpYWNyaXRpY1NlbnNpdGl2ZTogdHJ1ZSB9KTtcbiAgICogIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgc3RyaW5nIHRvIG1hdGNoIGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFRoZSBzdHJpbmcgdG8gc2VhcmNoXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIChPcHRpb25hbClcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubGFuZ3VhZ2UgVGhlIGxhbmd1YWdlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgbGlzdCBvZiBzdG9wIHdvcmRzIGZvciB0aGUgc2VhcmNoIGFuZCB0aGUgcnVsZXMgZm9yIHRoZSBzdGVtbWVyIGFuZCB0b2tlbml6ZXIuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5jYXNlU2Vuc2l0aXZlIEEgYm9vbGVhbiBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIGNhc2Ugc2Vuc2l0aXZlIHNlYXJjaC5cbiAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmRpYWNyaXRpY1NlbnNpdGl2ZSBBIGJvb2xlYW4gZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBkaWFjcml0aWMgc2Vuc2l0aXZlIHNlYXJjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBmdWxsVGV4dChrZXksIHZhbHVlKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmICgha2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Ega2V5IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Egc2VhcmNoIHRlcm0gaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHZhbHVlIGJlaW5nIHNlYXJjaGVkIGZvciBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICBjb25zdCBmdWxsT3B0aW9ucyA9IHt9O1xuICAgIGZ1bGxPcHRpb25zLiR0ZXJtID0gdmFsdWU7XG4gICAgZm9yIChjb25zdCBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgY2FzZSAnbGFuZ3VhZ2UnOlxuICAgICAgICAgIGZ1bGxPcHRpb25zLiRsYW5ndWFnZSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2FzZVNlbnNpdGl2ZSc6XG4gICAgICAgICAgZnVsbE9wdGlvbnMuJGNhc2VTZW5zaXRpdmUgPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RpYWNyaXRpY1NlbnNpdGl2ZSc6XG4gICAgICAgICAgZnVsbE9wdGlvbnMuJGRpYWNyaXRpY1NlbnNpdGl2ZSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gb3B0aW9uOiAke29wdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckdGV4dCcsIHtcbiAgICAgICRzZWFyY2g6IGZ1bGxPcHRpb25zXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHNvcnQgdGhlIGZ1bGwgdGV4dCBzZWFyY2ggYnkgdGV4dCBzY29yZVxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHNvcnRCeVRleHRTY29yZSgpIHtcbiAgICB0aGlzLmFzY2VuZGluZygnJHNjb3JlJyk7XG4gICAgdGhpcy5zZWxlY3QoWyckc2NvcmUnXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgc3RyaW5nIHZhbHVlcyB0aGF0IHN0YXJ0IHdpdGggYSBwcm92aWRlZFxuICAgKiBzdHJpbmcuICBUaGlzIHF1ZXJ5IHdpbGwgdXNlIHRoZSBiYWNrZW5kIGluZGV4LCBzbyBpdCB3aWxsIGJlIGZhc3QgZXZlblxuICAgKiBmb3IgbGFyZ2UgZGF0YXNldHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IFRoZSBzdWJzdHJpbmcgdGhhdCB0aGUgdmFsdWUgbXVzdCBzdGFydCB3aXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kaWZpZXJzIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbW9kZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBzdGFydHNXaXRoKGtleSwgcHJlZml4LCBtb2RpZmllcnMpIHtcbiAgICBpZiAodHlwZW9mIHByZWZpeCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHZhbHVlIGJlaW5nIHNlYXJjaGVkIGZvciBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKGtleSwgdGhpcy5fcmVnZXhTdGFydFdpdGgocHJlZml4KSwgbW9kaWZpZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCBmb3IgZmluZGluZyBzdHJpbmcgdmFsdWVzIHRoYXQgZW5kIHdpdGggYSBwcm92aWRlZFxuICAgKiBzdHJpbmcuICBUaGlzIHdpbGwgYmUgc2xvdyBmb3IgbGFyZ2UgZGF0YXNldHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4IFRoZSBzdWJzdHJpbmcgdGhhdCB0aGUgdmFsdWUgbXVzdCBlbmQgd2l0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGlmaWVycyBUaGUgcmVndWxhciBleHByZXNzaW9uIG1vZGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZW5kc1dpdGgoa2V5LCBzdWZmaXgsIG1vZGlmaWVycykge1xuICAgIGlmICh0eXBlb2Ygc3VmZml4ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgYmVpbmcgc2VhcmNoZWQgZm9yIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hdGNoZXMoa2V5LCBxdW90ZShzdWZmaXgpICsgJyQnLCBtb2RpZmllcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwcm94aW1pdHkgYmFzZWQgY29uc3RyYWludCBmb3IgZmluZGluZyBvYmplY3RzIHdpdGgga2V5IHBvaW50XG4gICAqIHZhbHVlcyBuZWFyIHRoZSBwb2ludCBnaXZlbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIFBhcnNlLkdlb1BvaW50IGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgVGhlIHJlZmVyZW5jZSBQYXJzZS5HZW9Qb2ludCB0aGF0IGlzIHVzZWQuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbmVhcihrZXksIHBvaW50KSB7XG4gICAgaWYgKCEocG9pbnQgaW5zdGFuY2VvZiBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KSkge1xuICAgICAgLy8gVHJ5IHRvIGNhc3QgaXQgYXMgYSBHZW9Qb2ludFxuICAgICAgcG9pbnQgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdChwb2ludCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJG5lYXJTcGhlcmUnLCBwb2ludCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHByb3hpbWl0eSBiYXNlZCBjb25zdHJhaW50IGZvciBmaW5kaW5nIG9iamVjdHMgd2l0aCBrZXkgcG9pbnRcbiAgICogdmFsdWVzIG5lYXIgdGhlIHBvaW50IGdpdmVuIGFuZCB3aXRoaW4gdGhlIG1heGltdW0gZGlzdGFuY2UgZ2l2ZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBQYXJzZS5HZW9Qb2ludCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50IFRoZSByZWZlcmVuY2UgUGFyc2UuR2VvUG9pbnQgdGhhdCBpcyB1c2VkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4RGlzdGFuY2UgTWF4aW11bSBkaXN0YW5jZSAoaW4gcmFkaWFucykgb2YgcmVzdWx0cyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc29ydGVkIEEgQm9vbCB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgcmVzdWx0cyBzaG91bGQgYmVcbiAgICogc29ydGVkIGJ5IGRpc3RhbmNlIGFzY2VuZGluZywgZmFsc2UgaXMgbm8gc29ydGluZyBpcyByZXF1aXJlZCxcbiAgICogZGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3aXRoaW5SYWRpYW5zKGtleSwgcG9pbnQsIG1heERpc3RhbmNlLCBzb3J0ZWQpIHtcbiAgICBpZiAoc29ydGVkIHx8IHNvcnRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm5lYXIoa2V5LCBwb2ludCk7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRtYXhEaXN0YW5jZScsIG1heERpc3RhbmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZ2VvV2l0aGluJywge1xuICAgICAgICAkY2VudGVyU3BoZXJlOiBbW3BvaW50LmxvbmdpdHVkZSwgcG9pbnQubGF0aXR1ZGVdLCBtYXhEaXN0YW5jZV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcHJveGltaXR5IGJhc2VkIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgb2JqZWN0cyB3aXRoIGtleSBwb2ludFxuICAgKiB2YWx1ZXMgbmVhciB0aGUgcG9pbnQgZ2l2ZW4gYW5kIHdpdGhpbiB0aGUgbWF4aW11bSBkaXN0YW5jZSBnaXZlbi5cbiAgICogUmFkaXVzIG9mIGVhcnRoIHVzZWQgaXMgMzk1OC44IG1pbGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgUGFyc2UuR2VvUG9pbnQgaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCBUaGUgcmVmZXJlbmNlIFBhcnNlLkdlb1BvaW50IHRoYXQgaXMgdXNlZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heERpc3RhbmNlIE1heGltdW0gZGlzdGFuY2UgKGluIG1pbGVzKSBvZiByZXN1bHRzIHRvIHJldHVybi5cbiAgICogQHBhcmFtIHtib29sZWFufSBzb3J0ZWQgQSBCb29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiByZXN1bHRzIHNob3VsZCBiZVxuICAgKiBzb3J0ZWQgYnkgZGlzdGFuY2UgYXNjZW5kaW5nLCBmYWxzZSBpcyBubyBzb3J0aW5nIGlzIHJlcXVpcmVkLFxuICAgKiBkZWZhdWx0cyB0byB0cnVlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhpbk1pbGVzKGtleSwgcG9pbnQsIG1heERpc3RhbmNlLCBzb3J0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy53aXRoaW5SYWRpYW5zKGtleSwgcG9pbnQsIG1heERpc3RhbmNlIC8gMzk1OC44LCBzb3J0ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwcm94aW1pdHkgYmFzZWQgY29uc3RyYWludCBmb3IgZmluZGluZyBvYmplY3RzIHdpdGgga2V5IHBvaW50XG4gICAqIHZhbHVlcyBuZWFyIHRoZSBwb2ludCBnaXZlbiBhbmQgd2l0aGluIHRoZSBtYXhpbXVtIGRpc3RhbmNlIGdpdmVuLlxuICAgKiBSYWRpdXMgb2YgZWFydGggdXNlZCBpcyA2MzcxLjAga2lsb21ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIFBhcnNlLkdlb1BvaW50IGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgVGhlIHJlZmVyZW5jZSBQYXJzZS5HZW9Qb2ludCB0aGF0IGlzIHVzZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhEaXN0YW5jZSBNYXhpbXVtIGRpc3RhbmNlIChpbiBraWxvbWV0ZXJzKSBvZiByZXN1bHRzIHRvIHJldHVybi5cbiAgICogQHBhcmFtIHtib29sZWFufSBzb3J0ZWQgQSBCb29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiByZXN1bHRzIHNob3VsZCBiZVxuICAgKiBzb3J0ZWQgYnkgZGlzdGFuY2UgYXNjZW5kaW5nLCBmYWxzZSBpcyBubyBzb3J0aW5nIGlzIHJlcXVpcmVkLFxuICAgKiBkZWZhdWx0cyB0byB0cnVlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhpbktpbG9tZXRlcnMoa2V5LCBwb2ludCwgbWF4RGlzdGFuY2UsIHNvcnRlZCkge1xuICAgIHJldHVybiB0aGlzLndpdGhpblJhZGlhbnMoa2V5LCBwb2ludCwgbWF4RGlzdGFuY2UgLyA2MzcxLjAsIHNvcnRlZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzXG4gICAqIGNvb3JkaW5hdGVzIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBnaXZlbiByZWN0YW5ndWxhciBnZW9ncmFwaGljIGJvdW5kaW5nXG4gICAqIGJveC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGJlIGNvbnN0cmFpbmVkLlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBzb3V0aHdlc3RcbiAgICogICAgIFRoZSBsb3dlci1sZWZ0IGluY2x1c2l2ZSBjb3JuZXIgb2YgdGhlIGJveC5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gbm9ydGhlYXN0XG4gICAqICAgICBUaGUgdXBwZXItcmlnaHQgaW5jbHVzaXZlIGNvcm5lciBvZiB0aGUgYm94LlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhpbkdlb0JveChrZXksIHNvdXRod2VzdCwgbm9ydGhlYXN0KSB7XG4gICAgaWYgKCEoc291dGh3ZXN0IGluc3RhbmNlb2YgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCkpIHtcbiAgICAgIHNvdXRod2VzdCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KHNvdXRod2VzdCk7XG4gICAgfVxuICAgIGlmICghKG5vcnRoZWFzdCBpbnN0YW5jZW9mIF9QYXJzZUdlb1BvaW50LmRlZmF1bHQpKSB7XG4gICAgICBub3J0aGVhc3QgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdChub3J0aGVhc3QpO1xuICAgIH1cbiAgICB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJHdpdGhpbicsIHtcbiAgICAgICRib3g6IFtzb3V0aHdlc3QsIG5vcnRoZWFzdF1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3NcbiAgICogY29vcmRpbmF0ZXMgYmUgY29udGFpbmVkIHdpdGhpbiBhbmQgb24gdGhlIGJvdW5kcyBvZiBhIGdpdmVuIHBvbHlnb24uXG4gICAqIFN1cHBvcnRzIGNsb3NlZCBhbmQgb3BlbiAobGFzdCBwb2ludCBpcyBjb25uZWN0ZWQgdG8gZmlyc3QpIHBhdGhzXG4gICAqXG4gICAqIFBvbHlnb24gbXVzdCBoYXZlIGF0IGxlYXN0IDMgcG9pbnRzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBiZSBjb25zdHJhaW5lZC5cbiAgICogQHBhcmFtIHtBcnJheX0gcG9pbnRzIEFycmF5IG9mIENvb3JkaW5hdGVzIC8gR2VvUG9pbnRzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aGluUG9seWdvbihrZXksIHBvaW50cykge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGdlb1dpdGhpbicsIHtcbiAgICAgICRwb2x5Z29uOiBwb2ludHNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXknc1xuICAgKiBjb29yZGluYXRlcyB0aGF0IGNvbnRhaW5zIGEgUGFyc2VHZW9Qb2ludFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gYmUgY29uc3RyYWluZWQuXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50XG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgcG9seWdvbkNvbnRhaW5zKGtleSwgcG9pbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRnZW9JbnRlcnNlY3RzJywge1xuICAgICAgJHBvaW50OiBwb2ludFxuICAgIH0pO1xuICB9XG5cbiAgLyogUXVlcnkgT3JkZXJpbmdzICovXG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSByZXN1bHRzIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgZ2l2ZW4ga2V5LlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBrZXlzIFRoZSBrZXkgdG8gb3JkZXIgYnksIHdoaWNoIGlzIGFcbiAgICogc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMsIG9yIGFuIEFycmF5IG9mIGtleXMsIG9yIG11bHRpcGxlIGtleXMuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYXNjZW5kaW5nKCkge1xuICAgIHRoaXMuX29yZGVyID0gW107XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBrZXlzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hZGRBc2NlbmRpbmcuYXBwbHkodGhpcywga2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIHJlc3VsdHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBnaXZlbiBrZXksXG4gICAqIGJ1dCBjYW4gYWxzbyBhZGQgc2Vjb25kYXJ5IHNvcnQgZGVzY3JpcHRvcnMgd2l0aG91dCBvdmVyd3JpdGluZyBfb3JkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IGtleXMgVGhlIGtleSB0byBvcmRlciBieSwgd2hpY2ggaXMgYVxuICAgKiBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcywgb3IgYW4gQXJyYXkgb2Yga2V5cywgb3IgbXVsdGlwbGUga2V5cy5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRBc2NlbmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLl9vcmRlcikge1xuICAgICAgdGhpcy5fb3JkZXIgPSBbXTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBrZXlzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSA9PiB7XG4gICAgICB2YXIgX2NvbnRleHQ2O1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgIGtleSA9IGtleS5qb2luKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9vcmRlciA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0NiA9IHRoaXMuX29yZGVyKS5jYWxsKF9jb250ZXh0Niwga2V5LnJlcGxhY2UoL1xccy9nLCAnJykuc3BsaXQoJywnKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgZ2l2ZW4ga2V5LlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBrZXlzIFRoZSBrZXkgdG8gb3JkZXIgYnksIHdoaWNoIGlzIGFcbiAgICogc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMsIG9yIGFuIEFycmF5IG9mIGtleXMsIG9yIG11bHRpcGxlIGtleXMuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZGVzY2VuZGluZygpIHtcbiAgICB0aGlzLl9vcmRlciA9IFtdO1xuICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAga2V5c1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hZGREZXNjZW5kaW5nLmFwcGx5KHRoaXMsIGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGdpdmVuIGtleSxcbiAgICogYnV0IGNhbiBhbHNvIGFkZCBzZWNvbmRhcnkgc29ydCBkZXNjcmlwdG9ycyB3aXRob3V0IG92ZXJ3cml0aW5nIF9vcmRlci5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0ga2V5cyBUaGUga2V5IHRvIG9yZGVyIGJ5LCB3aGljaCBpcyBhXG4gICAqIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzLCBvciBhbiBBcnJheSBvZiBrZXlzLCBvciBtdWx0aXBsZSBrZXlzLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZERlc2NlbmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLl9vcmRlcikge1xuICAgICAgdGhpcy5fb3JkZXIgPSBbXTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICBrZXlzW19rZXk0XSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgfVxuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSA9PiB7XG4gICAgICB2YXIgX2NvbnRleHQ3LCBfY29udGV4dDg7XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAga2V5ID0ga2V5LmpvaW4oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX29yZGVyID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQ3ID0gdGhpcy5fb3JkZXIpLmNhbGwoX2NvbnRleHQ3LCAoMCwgX21hcC5kZWZhdWx0KShfY29udGV4dDggPSBrZXkucmVwbGFjZSgvXFxzL2csICcnKS5zcGxpdCgnLCcpKS5jYWxsKF9jb250ZXh0OCwgayA9PiB7XG4gICAgICAgIHJldHVybiAnLScgKyBrO1xuICAgICAgfSkpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyogUXVlcnkgT3B0aW9ucyAqL1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgcmVzdWx0cyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgYW55IHJlc3VsdHMuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBwYWdpbmF0aW9uLlxuICAgKiBEZWZhdWx0IGlzIHRvIHNraXAgemVybyByZXN1bHRzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbiB0aGUgbnVtYmVyIG9mIHJlc3VsdHMgdG8gc2tpcC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBza2lwKG4pIHtcbiAgICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW4gb25seSBza2lwIGJ5IGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gICAgfVxuICAgIHRoaXMuX3NraXAgPSBuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGxpbWl0IG9mIHRoZSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4uIFRoZSBkZWZhdWx0IGxpbWl0IGlzIDEwMC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gdGhlIG51bWJlciBvZiByZXN1bHRzIHRvIGxpbWl0IHRvLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGxpbWl0KG4pIHtcbiAgICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW4gb25seSBzZXQgdGhlIGxpbWl0IHRvIGEgbnVtZXJpYyB2YWx1ZScpO1xuICAgIH1cbiAgICB0aGlzLl9saW1pdCA9IG47XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZmxhZyB0byBpbmNsdWRlIHdpdGggcmVzcG9uc2UgdGhlIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIHNhdGlzZnlpbmcgdGhpcyBxdWVyeSxcbiAgICogZGVzcGl0ZSBsaW1pdHMvc2tpcC4gTWlnaHQgYmUgdXNlZnVsIGZvciBwYWdpbmF0aW9uLlxuICAgKiBOb3RlIHRoYXQgcmVzdWx0IG9mIHRoaXMgcXVlcnkgd2lsbCBiZSB3cmFwcGVkIGFzIGFuIG9iamVjdCB3aXRoXG4gICAqIGByZXN1bHRzYDogaG9sZGluZyB7UGFyc2VPYmplY3R9IGFycmF5IGFuZCBgY291bnRgOiBpbnRlZ2VyIGhvbGRpbmcgdG90YWwgbnVtYmVyXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUNvdW50IGZhbHNlIC0gZGlzYWJsZSwgdHJ1ZSAtIGVuYWJsZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3aXRoQ291bnQoKSB7XG4gICAgbGV0IGluY2x1ZGVDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGluY2x1ZGVDb3VudCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW4gb25seSBzZXQgd2l0aENvdW50IHRvIGEgYm9vbGVhbiB2YWx1ZScpO1xuICAgIH1cbiAgICB0aGlzLl9jb3VudCA9IGluY2x1ZGVDb3VudDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogSW5jbHVkZXMgbmVzdGVkIFBhcnNlLk9iamVjdHMgZm9yIHRoZSBwcm92aWRlZCBrZXkuICBZb3UgY2FuIHVzZSBkb3RcbiAgICogbm90YXRpb24gdG8gc3BlY2lmeSB3aGljaCBmaWVsZHMgaW4gdGhlIGluY2x1ZGVkIG9iamVjdCBhcmUgYWxzbyBmZXRjaGVkLlxuICAgKlxuICAgKiBZb3UgY2FuIGluY2x1ZGUgYWxsIG5lc3RlZCBQYXJzZS5PYmplY3RzIGJ5IHBhc3NpbmcgaW4gJyonLlxuICAgKiBSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgMy4wLjArXG4gICAqIDxwcmU+cXVlcnkuaW5jbHVkZSgnKicpOzwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0gey4uLnN0cmluZ3xBcnJheTxzdHJpbmc+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBpbmNsdWRlKCkge1xuICAgIGZvciAodmFyIF9sZW41ID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuNSksIF9rZXk1ID0gMDsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuICAgICAga2V5c1tfa2V5NV0gPSBhcmd1bWVudHNbX2tleTVdO1xuICAgIH1cbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkgPT4ge1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgIHZhciBfY29udGV4dDk7XG4gICAgICAgIHRoaXMuX2luY2x1ZGUgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDkgPSB0aGlzLl9pbmNsdWRlKS5jYWxsKF9jb250ZXh0OSwga2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2luY2x1ZGUucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluY2x1ZGVzIGFsbCBuZXN0ZWQgUGFyc2UuT2JqZWN0cyBvbmUgbGV2ZWwgZGVlcC5cbiAgICpcbiAgICogUmVxdWlyZXMgUGFyc2UgU2VydmVyIDMuMC4wK1xuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGluY2x1ZGVBbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5jbHVkZSgnKicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyaWN0cyB0aGUgZmllbGRzIG9mIHRoZSByZXR1cm5lZCBQYXJzZS5PYmplY3RzIHRvIGluY2x1ZGUgb25seSB0aGVcbiAgICogcHJvdmlkZWQga2V5cy4gIElmIHRoaXMgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCB0aGVuIGFsbCBvZiB0aGUga2V5c1xuICAgKiBzcGVjaWZpZWQgaW4gZWFjaCBvZiB0aGUgY2FsbHMgd2lsbCBiZSBpbmNsdWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5zdHJpbmd8QXJyYXk8c3RyaW5nPn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGluY2x1ZGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgc2VsZWN0KCkge1xuICAgIGlmICghdGhpcy5fc2VsZWN0KSB7XG4gICAgICB0aGlzLl9zZWxlY3QgPSBbXTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2xlbjYgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW42KSwgX2tleTYgPSAwOyBfa2V5NiA8IF9sZW42OyBfa2V5NisrKSB7XG4gICAgICBrZXlzW19rZXk2XSA9IGFyZ3VtZW50c1tfa2V5Nl07XG4gICAgfVxuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSA9PiB7XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0MTA7XG4gICAgICAgIHRoaXMuX3NlbGVjdCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0MTAgPSB0aGlzLl9zZWxlY3QpLmNhbGwoX2NvbnRleHQxMCwga2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdC5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVzdHJpY3RzIHRoZSBmaWVsZHMgb2YgdGhlIHJldHVybmVkIFBhcnNlLk9iamVjdHMgdG8gYWxsIGtleXMgZXhjZXB0IHRoZVxuICAgKiBwcm92aWRlZCBrZXlzLiBFeGNsdWRlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBzZWxlY3QgYW5kIGluY2x1ZGUuXG4gICAqXG4gICAqIFJlcXVpcmVzIFBhcnNlIFNlcnZlciAzLjYuMCtcbiAgICpcbiAgICogQHBhcmFtIHsuLi5zdHJpbmd8QXJyYXk8c3RyaW5nPn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGV4Y2x1ZGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZXhjbHVkZSgpIHtcbiAgICBmb3IgKHZhciBfbGVuNyA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjcpLCBfa2V5NyA9IDA7IF9rZXk3IDwgX2xlbjc7IF9rZXk3KyspIHtcbiAgICAgIGtleXNbX2tleTddID0gYXJndW1lbnRzW19rZXk3XTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICB2YXIgX2NvbnRleHQxMTtcbiAgICAgICAgdGhpcy5fZXhjbHVkZSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0MTEgPSB0aGlzLl9leGNsdWRlKS5jYWxsKF9jb250ZXh0MTEsIGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9leGNsdWRlLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0cmljdHMgbGl2ZSBxdWVyeSB0byB0cmlnZ2VyIG9ubHkgZm9yIHdhdGNoZWQgZmllbGRzLlxuICAgKlxuICAgKiBSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgNi4wLjArXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uc3RyaW5nfEFycmF5PHN0cmluZz59IGtleXMgVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byB3YXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3YXRjaCgpIHtcbiAgICBmb3IgKHZhciBfbGVuOCA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjgpLCBfa2V5OCA9IDA7IF9rZXk4IDwgX2xlbjg7IF9rZXk4KyspIHtcbiAgICAgIGtleXNbX2tleThdID0gYXJndW1lbnRzW19rZXk4XTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICB2YXIgX2NvbnRleHQxMjtcbiAgICAgICAgdGhpcy5fd2F0Y2ggPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDEyID0gdGhpcy5fd2F0Y2gpLmNhbGwoX2NvbnRleHQxMiwga2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3dhdGNoLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRoZSByZWFkIHByZWZlcmVuY2UgdGhhdCB0aGUgYmFja2VuZCB3aWxsIHVzZSB3aGVuIHBlcmZvcm1pbmcgdGhlIHF1ZXJ5IHRvIHRoZSBkYXRhYmFzZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYWRQcmVmZXJlbmNlIFRoZSByZWFkIHByZWZlcmVuY2UgZm9yIHRoZSBtYWluIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5jbHVkZVJlYWRQcmVmZXJlbmNlIFRoZSByZWFkIHByZWZlcmVuY2UgZm9yIHRoZSBxdWVyaWVzIHRvIGluY2x1ZGUgcG9pbnRlcnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlIFRoZSByZWFkIHByZWZlcmVuY2UgZm9yIHRoZSBzdWIgcXVlcmllcy5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICByZWFkUHJlZmVyZW5jZShyZWFkUHJlZmVyZW5jZSwgaW5jbHVkZVJlYWRQcmVmZXJlbmNlLCBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgdGhpcy5fcmVhZFByZWZlcmVuY2UgPSByZWFkUHJlZmVyZW5jZTtcbiAgICB0aGlzLl9pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSBpbmNsdWRlUmVhZFByZWZlcmVuY2UgfHwgbnVsbDtcbiAgICB0aGlzLl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0gc3VicXVlcnlSZWFkUHJlZmVyZW5jZSB8fCBudWxsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0aGlzIHF1ZXJ5IHRvIGdldCBsaXZlUXVlcnkgdXBkYXRlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblRva2VuIChvcHRpb25hbCkgRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnRVc2VyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExpdmVRdWVyeVN1YnNjcmlwdGlvbj59IFJldHVybnMgdGhlIGxpdmVRdWVyeVN1YnNjcmlwdGlvbiwgaXQncyBhbiBldmVudCBlbWl0dGVyXG4gICAqIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGdldCBsaXZlUXVlcnkgdXBkYXRlcy5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZShzZXNzaW9uVG9rZW4pIHtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCkuY3VycmVudFVzZXJBc3luYygpO1xuICAgIGlmICghc2Vzc2lvblRva2VuKSB7XG4gICAgICBzZXNzaW9uVG9rZW4gPSBjdXJyZW50VXNlciA/IGN1cnJlbnRVc2VyLmdldFNlc3Npb25Ub2tlbigpIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbGl2ZVF1ZXJ5Q2xpZW50ID0gYXdhaXQgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TGl2ZVF1ZXJ5Q29udHJvbGxlcigpLmdldERlZmF1bHRMaXZlUXVlcnlDbGllbnQoKTtcbiAgICBpZiAobGl2ZVF1ZXJ5Q2xpZW50LnNob3VsZE9wZW4oKSkge1xuICAgICAgbGl2ZVF1ZXJ5Q2xpZW50Lm9wZW4oKTtcbiAgICB9XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbGl2ZVF1ZXJ5Q2xpZW50LnN1YnNjcmliZSh0aGlzLCBzZXNzaW9uVG9rZW4pO1xuICAgIHJldHVybiBzdWJzY3JpcHRpb24uc3Vic2NyaWJlUHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFBhcnNlLlF1ZXJ5IHRoYXQgaXMgdGhlIE9SIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcy4gIEZvclxuICAgKiBleGFtcGxlOlxuICAgKiA8cHJlPnZhciBjb21wb3VuZFF1ZXJ5ID0gUGFyc2UuUXVlcnkub3IocXVlcnkxLCBxdWVyeTIsIHF1ZXJ5Myk7PC9wcmU+XG4gICAqXG4gICAqIHdpbGwgY3JlYXRlIGEgY29tcG91bmRRdWVyeSB0aGF0IGlzIGFuIG9yIG9mIHRoZSBxdWVyeTEsIHF1ZXJ5MiwgYW5kXG4gICAqIHF1ZXJ5My5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5QYXJzZS5RdWVyeX0gcXVlcmllcyBUaGUgbGlzdCBvZiBxdWVyaWVzIHRvIE9SLlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gVGhlIHF1ZXJ5IHRoYXQgaXMgdGhlIE9SIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcy5cbiAgICovXG4gIHN0YXRpYyBvcigpIHtcbiAgICBmb3IgKHZhciBfbGVuOSA9IGFyZ3VtZW50cy5sZW5ndGgsIHF1ZXJpZXMgPSBuZXcgQXJyYXkoX2xlbjkpLCBfa2V5OSA9IDA7IF9rZXk5IDwgX2xlbjk7IF9rZXk5KyspIHtcbiAgICAgIHF1ZXJpZXNbX2tleTldID0gYXJndW1lbnRzW19rZXk5XTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NOYW1lID0gX2dldENsYXNzTmFtZUZyb21RdWVyaWVzKHF1ZXJpZXMpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkoY2xhc3NOYW1lKTtcbiAgICBxdWVyeS5fb3JRdWVyeShxdWVyaWVzKTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFBhcnNlLlF1ZXJ5IHRoYXQgaXMgdGhlIEFORCBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMuICBGb3JcbiAgICogZXhhbXBsZTpcbiAgICogPHByZT52YXIgY29tcG91bmRRdWVyeSA9IFBhcnNlLlF1ZXJ5LmFuZChxdWVyeTEsIHF1ZXJ5MiwgcXVlcnkzKTs8L3ByZT5cbiAgICpcbiAgICogd2lsbCBjcmVhdGUgYSBjb21wb3VuZFF1ZXJ5IHRoYXQgaXMgYW4gYW5kIG9mIHRoZSBxdWVyeTEsIHF1ZXJ5MiwgYW5kXG4gICAqIHF1ZXJ5My5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5QYXJzZS5RdWVyeX0gcXVlcmllcyBUaGUgbGlzdCBvZiBxdWVyaWVzIHRvIEFORC5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFRoZSBxdWVyeSB0aGF0IGlzIHRoZSBBTkQgb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzLlxuICAgKi9cbiAgc3RhdGljIGFuZCgpIHtcbiAgICBmb3IgKHZhciBfbGVuMTAgPSBhcmd1bWVudHMubGVuZ3RoLCBxdWVyaWVzID0gbmV3IEFycmF5KF9sZW4xMCksIF9rZXkxMCA9IDA7IF9rZXkxMCA8IF9sZW4xMDsgX2tleTEwKyspIHtcbiAgICAgIHF1ZXJpZXNbX2tleTEwXSA9IGFyZ3VtZW50c1tfa2V5MTBdO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBfZ2V0Q2xhc3NOYW1lRnJvbVF1ZXJpZXMocXVlcmllcyk7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShjbGFzc05hbWUpO1xuICAgIHF1ZXJ5Ll9hbmRRdWVyeShxdWVyaWVzKTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFBhcnNlLlF1ZXJ5IHRoYXQgaXMgdGhlIE5PUiBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMuICBGb3JcbiAgICogZXhhbXBsZTpcbiAgICogPHByZT5jb25zdCBjb21wb3VuZFF1ZXJ5ID0gUGFyc2UuUXVlcnkubm9yKHF1ZXJ5MSwgcXVlcnkyLCBxdWVyeTMpOzwvcHJlPlxuICAgKlxuICAgKiB3aWxsIGNyZWF0ZSBhIGNvbXBvdW5kUXVlcnkgdGhhdCBpcyBhIG5vciBvZiB0aGUgcXVlcnkxLCBxdWVyeTIsIGFuZFxuICAgKiBxdWVyeTMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uUGFyc2UuUXVlcnl9IHF1ZXJpZXMgVGhlIGxpc3Qgb2YgcXVlcmllcyB0byBOT1IuXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBUaGUgcXVlcnkgdGhhdCBpcyB0aGUgTk9SIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcy5cbiAgICovXG4gIHN0YXRpYyBub3IoKSB7XG4gICAgZm9yICh2YXIgX2xlbjExID0gYXJndW1lbnRzLmxlbmd0aCwgcXVlcmllcyA9IG5ldyBBcnJheShfbGVuMTEpLCBfa2V5MTEgPSAwOyBfa2V5MTEgPCBfbGVuMTE7IF9rZXkxMSsrKSB7XG4gICAgICBxdWVyaWVzW19rZXkxMV0gPSBhcmd1bWVudHNbX2tleTExXTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NOYW1lID0gX2dldENsYXNzTmFtZUZyb21RdWVyaWVzKHF1ZXJpZXMpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkoY2xhc3NOYW1lKTtcbiAgICBxdWVyeS5fbm9yUXVlcnkocXVlcmllcyk7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgc291cmNlIG9mIHRoaXMgcXVlcnkgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBmcm9tTmV0d29yaygpIHtcbiAgICB0aGlzLl9xdWVyaWVzTG9jYWxEYXRhc3RvcmUgPSBmYWxzZTtcbiAgICB0aGlzLl9sb2NhbERhdGFzdG9yZVBpbk5hbWUgPSBudWxsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHNvdXJjZSBvZiB0aGlzIHF1ZXJ5IHRvIGFsbCBwaW5uZWQgb2JqZWN0cy5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBmcm9tTG9jYWxEYXRhc3RvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbVBpbldpdGhOYW1lKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHNvdXJjZSBvZiB0aGlzIHF1ZXJ5IHRvIHRoZSBkZWZhdWx0IGdyb3VwIG9mIHBpbm5lZCBvYmplY3RzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGZyb21QaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbVBpbldpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRoZSBzb3VyY2Ugb2YgdGhpcyBxdWVyeSB0byBhIHNwZWNpZmljIGdyb3VwIG9mIHBpbm5lZCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiBxdWVyeSBzb3VyY2UuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZnJvbVBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKGxvY2FsRGF0YXN0b3JlLmNoZWNrSWZFbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuX3F1ZXJpZXNMb2NhbERhdGFzdG9yZSA9IHRydWU7XG4gICAgICB0aGlzLl9sb2NhbERhdGFzdG9yZVBpbk5hbWUgPSBuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSBjdXJyZW50IG5ldHdvcmsgcmVxdWVzdCAoaWYgYW55IGlzIHJ1bm5pbmcpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICBpZiAodGhpcy5feGhyUmVxdWVzdC50YXNrICYmIHR5cGVvZiB0aGlzLl94aHJSZXF1ZXN0LnRhc2suYWJvcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX3hoclJlcXVlc3QudGFzay5fYWJvcnRlZCA9IHRydWU7XG4gICAgICB0aGlzLl94aHJSZXF1ZXN0LnRhc2suYWJvcnQoKTtcbiAgICAgIHRoaXMuX3hoclJlcXVlc3QudGFzayA9IG51bGw7XG4gICAgICB0aGlzLl94aHJSZXF1ZXN0Lm9uY2hhbmdlID0gKCkgPT4ge307XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5feGhyUmVxdWVzdC5vbmNoYW5nZSA9ICgpID0+IHRoaXMuY2FuY2VsKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgX3NldFJlcXVlc3RUYXNrKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnJlcXVlc3RUYXNrID0gdGFzayA9PiB7XG4gICAgICB0aGlzLl94aHJSZXF1ZXN0LnRhc2sgPSB0YXNrO1xuICAgICAgdGhpcy5feGhyUmVxdWVzdC5vbmNoYW5nZSgpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIGNvbW1lbnQgdG8gdGhlIHF1ZXJ5IHNvIHRoYXQgdGhlIHF1ZXJ5XG4gICAqIGNhbiBiZSBpZGVudGlmaWVkIHdoZW4gdXNpbmcgYSB0aGUgcHJvZmlsZXIgZm9yIE1vbmdvREIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBhIGNvbW1lbnQgY2FuIG1ha2UgeW91ciBwcm9maWxlIGRhdGEgZWFzaWVyIHRvIGludGVycHJldCBhbmQgdHJhY2UuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgY29tbWVudCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBkZWxldGUgdGhpcy5fY29tbWVudDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgb2YgYSBjb21tZW50IHRvIGJlIHNlbnQgd2l0aCB0aGlzIHF1ZXJ5IG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIHRoaXMuX2NvbW1lbnQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIGZpbmQoY2xhc3NOYW1lLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICdjbGFzc2VzLycgKyBjbGFzc05hbWUsIHBhcmFtcywgb3B0aW9ucyk7XG4gIH0sXG4gIGFnZ3JlZ2F0ZShjbGFzc05hbWUsIHBhcmFtcywgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2FnZ3JlZ2F0ZS8nICsgY2xhc3NOYW1lLCBwYXJhbXMsIG9wdGlvbnMpO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UGFyc2VRdWVyeShQYXJzZVF1ZXJ5KTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFF1ZXJ5Q29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZVF1ZXJ5OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBSZWxhdGlvbiBmb3IgdGhlIGdpdmVuIHBhcmVudCBvYmplY3QgYW5kIGtleS4gVGhpc1xuICogY29uc3RydWN0b3Igc2hvdWxkIHJhcmVseSBiZSB1c2VkIGRpcmVjdGx5LCBidXQgcmF0aGVyIGNyZWF0ZWQgYnlcbiAqIFBhcnNlLk9iamVjdC5yZWxhdGlvbi5cbiAqXG4gKiA8cD5cbiAqIEEgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGFjY2VzcyBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIGEgbWFueS10by1tYW55XG4gKiByZWxhdGlvbnNoaXAuICBFYWNoIGluc3RhbmNlIG9mIFBhcnNlLlJlbGF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhXG4gKiBwYXJ0aWN1bGFyIHBhcmVudCBvYmplY3QgYW5kIGtleS5cbiAqIDwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuUmVsYXRpb25cbiAqL1xuY2xhc3MgUGFyc2VSZWxhdGlvbiB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcnNlLk9iamVjdH0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhpcyByZWxhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IGZvciB0aGlzIHJlbGF0aW9uIG9uIHRoZSBwYXJlbnQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQsIGtleSkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicGFyZW50XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJrZXlcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInRhcmdldENsYXNzTmFtZVwiLCB2b2lkIDApO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMudGFyZ2V0Q2xhc3NOYW1lID0gbnVsbDtcbiAgfVxuXG4gIC8qXG4gICAqIE1ha2VzIHN1cmUgdGhhdCB0aGlzIHJlbGF0aW9uIGhhcyB0aGUgcmlnaHQgcGFyZW50IGFuZCBrZXkuXG4gICAqL1xuICBfZW5zdXJlUGFyZW50QW5kS2V5KHBhcmVudCwga2V5KSB7XG4gICAgdGhpcy5rZXkgPSB0aGlzLmtleSB8fCBrZXk7XG4gICAgaWYgKHRoaXMua2V5ICE9PSBrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgRXJyb3IuIFJlbGF0aW9uIHJldHJpZXZlZCBmcm9tIHR3byBkaWZmZXJlbnQga2V5cy4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQuY2xhc3NOYW1lICE9PSBwYXJlbnQuY2xhc3NOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgRXJyb3IuIFJlbGF0aW9uIHJldHJpZXZlZCBmcm9tIHR3byBkaWZmZXJlbnQgT2JqZWN0cy4nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBhcmVudC5pZCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQuaWQgIT09IHBhcmVudC5pZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgRXJyb3IuIFJlbGF0aW9uIHJldHJpZXZlZCBmcm9tIHR3byBkaWZmZXJlbnQgT2JqZWN0cy4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXJlbnQuaWQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgUGFyc2UuT2JqZWN0IG9yIGFuIGFycmF5IG9mIFBhcnNlLk9iamVjdHMgdG8gdGhlIHJlbGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0geyhQYXJzZS5PYmplY3R8QXJyYXkpfSBvYmplY3RzIFRoZSBpdGVtIG9yIGl0ZW1zIHRvIGFkZC5cbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gVGhlIHBhcmVudCBvZiB0aGUgcmVsYXRpb24uXG4gICAqL1xuICBhZGQob2JqZWN0cykge1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9iamVjdHMpKSB7XG4gICAgICBvYmplY3RzID0gW29iamVjdHNdO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBSZWxhdGlvbk9wXG4gICAgfSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT3AoKTtcbiAgICBjb25zdCBjaGFuZ2UgPSBuZXcgUmVsYXRpb25PcChvYmplY3RzLCBbXSk7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCB0byBhIFJlbGF0aW9uIHdpdGhvdXQgYSBwYXJlbnQnKTtcbiAgICB9XG4gICAgaWYgKG9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgICBwYXJlbnQuc2V0KHRoaXMua2V5LCBjaGFuZ2UpO1xuICAgIHRoaXMudGFyZ2V0Q2xhc3NOYW1lID0gY2hhbmdlLl90YXJnZXRDbGFzc05hbWU7XG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgUGFyc2UuT2JqZWN0IG9yIGFuIGFycmF5IG9mIFBhcnNlLk9iamVjdHMgZnJvbSB0aGlzIHJlbGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0geyhQYXJzZS5PYmplY3R8QXJyYXkpfSBvYmplY3RzIFRoZSBpdGVtIG9yIGl0ZW1zIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZShvYmplY3RzKSB7XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkob2JqZWN0cykpIHtcbiAgICAgIG9iamVjdHMgPSBbb2JqZWN0c107XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIFJlbGF0aW9uT3BcbiAgICB9ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPcCgpO1xuICAgIGNvbnN0IGNoYW5nZSA9IG5ldyBSZWxhdGlvbk9wKFtdLCBvYmplY3RzKTtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZW1vdmUgZnJvbSBhIFJlbGF0aW9uIHdpdGhvdXQgYSBwYXJlbnQnKTtcbiAgICB9XG4gICAgaWYgKG9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50LnNldCh0aGlzLmtleSwgY2hhbmdlKTtcbiAgICB0aGlzLnRhcmdldENsYXNzTmFtZSA9IGNoYW5nZS5fdGFyZ2V0Q2xhc3NOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OIHZlcnNpb24gb2YgdGhlIG9iamVjdCBzdWl0YWJsZSBmb3Igc2F2aW5nIHRvIGRpc2suXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IEpTT04gcmVwcmVzZW50YXRpb24gb2YgUmVsYXRpb25cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnUmVsYXRpb24nLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLnRhcmdldENsYXNzTmFtZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFBhcnNlLlF1ZXJ5IHRoYXQgaXMgbGltaXRlZCB0byBvYmplY3RzIGluIHRoaXNcbiAgICogcmVsYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmVsYXRpb24gUXVlcnlcbiAgICovXG4gIHF1ZXJ5KCkge1xuICAgIGxldCBxdWVyeTtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29uc3RydWN0IGEgcXVlcnkgZm9yIGEgUmVsYXRpb24gd2l0aG91dCBhIHBhcmVudCcpO1xuICAgIH1cbiAgICBjb25zdCBQYXJzZVF1ZXJ5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VRdWVyeSgpO1xuICAgIGlmICghdGhpcy50YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgIHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkocGFyZW50LmNsYXNzTmFtZSk7XG4gICAgICBxdWVyeS5fZXh0cmFPcHRpb25zLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5ID0gdGhpcy5rZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkodGhpcy50YXJnZXRDbGFzc05hbWUpO1xuICAgIH1cbiAgICBxdWVyeS5fYWRkQ29uZGl0aW9uKCckcmVsYXRlZFRvJywgJ29iamVjdCcsIHtcbiAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgY2xhc3NOYW1lOiBwYXJlbnQuY2xhc3NOYW1lLFxuICAgICAgb2JqZWN0SWQ6IHBhcmVudC5pZFxuICAgIH0pO1xuICAgIHF1ZXJ5Ll9hZGRDb25kaXRpb24oJyRyZWxhdGVkVG8nLCAna2V5JywgdGhpcy5rZXkpO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VSZWxhdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUFDTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VBQ0xcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbi8qKlxuICogUmVwcmVzZW50cyBhIFJvbGUgb24gdGhlIFBhcnNlIHNlcnZlci4gUm9sZXMgcmVwcmVzZW50IGdyb3VwaW5ncyBvZlxuICogVXNlcnMgZm9yIHRoZSBwdXJwb3NlcyBvZiBncmFudGluZyBwZXJtaXNzaW9ucyAoZS5nLiBzcGVjaWZ5aW5nIGFuIEFDTFxuICogZm9yIGFuIE9iamVjdCkuIFJvbGVzIGFyZSBzcGVjaWZpZWQgYnkgdGhlaXIgc2V0cyBvZiBjaGlsZCB1c2VycyBhbmRcbiAqIGNoaWxkIHJvbGVzLCBhbGwgb2Ygd2hpY2ggYXJlIGdyYW50ZWQgYW55IHBlcm1pc3Npb25zIHRoYXQgdGhlIHBhcmVudFxuICogcm9sZSBoYXMuXG4gKlxuICogPHA+Um9sZXMgbXVzdCBoYXZlIGEgbmFtZSAod2hpY2ggY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgY3JlYXRpb24gb2YgdGhlXG4gKiByb2xlKSwgYW5kIG11c3Qgc3BlY2lmeSBhbiBBQ0wuPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5Sb2xlXG4gKiBAYXVnbWVudHMgUGFyc2UuT2JqZWN0XG4gKi9cbmNsYXNzIFBhcnNlUm9sZSBleHRlbmRzIF9QYXJzZU9iamVjdC5kZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBSb2xlIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHtQYXJzZS5BQ0x9IGFjbCBUaGUgQUNMIGZvciB0aGlzIHJvbGUuIFJvbGVzIG11c3QgaGF2ZSBhbiBBQ0wuXG4gICAqIEEgUGFyc2UuUm9sZSBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgcm9sZSBwZXJzaXN0ZWQgdG8gdGhlIFBhcnNlXG4gICAqIGNsb3VkLlxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZSwgYWNsKSB7XG4gICAgc3VwZXIoJ19Sb2xlJyk7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiBhY2wgaW5zdGFuY2VvZiBfUGFyc2VBQ0wuZGVmYXVsdCkge1xuICAgICAgdGhpcy5zZXROYW1lKG5hbWUpO1xuICAgICAgdGhpcy5zZXRBQ0woYWNsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcm9sZS4gIFlvdSBjYW4gYWx0ZXJuYXRpdmVseSBjYWxsIHJvbGUuZ2V0KFwibmFtZVwiKVxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgbmFtZSBvZiB0aGUgcm9sZS5cbiAgICovXG4gIGdldE5hbWUoKSB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0KCduYW1lJyk7XG4gICAgaWYgKG5hbWUgPT0gbnVsbCB8fCB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmFtZSBmb3IgYSByb2xlLiBUaGlzIHZhbHVlIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgcm9sZSBoYXNcbiAgICogYmVlbiBzYXZlZCB0byB0aGUgc2VydmVyLCBhbmQgY2Fubm90IGJlIHNldCBvbmNlIHRoZSByb2xlIGhhcyBiZWVuXG4gICAqIHNhdmVkLlxuICAgKlxuICAgKiA8cD5cbiAgICogICBBIHJvbGUncyBuYW1lIGNhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIF8sIC0sIGFuZFxuICAgKiAgIHNwYWNlcy5cbiAgICogPC9wPlxuICAgKlxuICAgKiA8cD5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyByb2xlLnNldChcIm5hbWVcIiwgbmFtZSk8L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSByb2xlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTdGFuZGFyZCBvcHRpb25zIG9iamVjdCB3aXRoIHN1Y2Nlc3MgYW5kIGVycm9yXG4gICAqICAgICBjYWxsYmFja3MuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3R8Ym9vbGVhbil9IHRydWUgaWYgdGhlIHNldCBzdWNjZWVkZWQuXG4gICAqL1xuICBzZXROYW1lKG5hbWUsIG9wdGlvbnMpIHtcbiAgICB0aGlzLl92YWxpZGF0ZU5hbWUobmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuc2V0KCduYW1lJywgbmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgUGFyc2UuUmVsYXRpb24gZm9yIHRoZSBQYXJzZS5Vc2VycyB0aGF0IGFyZSBkaXJlY3RcbiAgICogY2hpbGRyZW4gb2YgdGhpcyByb2xlLiBUaGVzZSB1c2VycyBhcmUgZ3JhbnRlZCBhbnkgcHJpdmlsZWdlcyB0aGF0IHRoaXNcbiAgICogcm9sZSBoYXMgYmVlbiBncmFudGVkIChlLmcuIHJlYWQgb3Igd3JpdGUgYWNjZXNzIHRocm91Z2ggQUNMcykuIFlvdSBjYW5cbiAgICogYWRkIG9yIHJlbW92ZSB1c2VycyBmcm9tIHRoZSByb2xlIHRocm91Z2ggdGhpcyByZWxhdGlvbi5cbiAgICpcbiAgICogPHA+VGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgcm9sZS5yZWxhdGlvbihcInVzZXJzXCIpPC9wPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUmVsYXRpb259IHRoZSByZWxhdGlvbiBmb3IgdGhlIHVzZXJzIGJlbG9uZ2luZyB0byB0aGlzXG4gICAqICAgICByb2xlLlxuICAgKi9cbiAgZ2V0VXNlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVsYXRpb24oJ3VzZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgUGFyc2UuUmVsYXRpb24gZm9yIHRoZSBQYXJzZS5Sb2xlcyB0aGF0IGFyZSBkaXJlY3RcbiAgICogY2hpbGRyZW4gb2YgdGhpcyByb2xlLiBUaGVzZSByb2xlcycgdXNlcnMgYXJlIGdyYW50ZWQgYW55IHByaXZpbGVnZXMgdGhhdFxuICAgKiB0aGlzIHJvbGUgaGFzIGJlZW4gZ3JhbnRlZCAoZS5nLiByZWFkIG9yIHdyaXRlIGFjY2VzcyB0aHJvdWdoIEFDTHMpLiBZb3VcbiAgICogY2FuIGFkZCBvciByZW1vdmUgY2hpbGQgcm9sZXMgZnJvbSB0aGlzIHJvbGUgdGhyb3VnaCB0aGlzIHJlbGF0aW9uLlxuICAgKlxuICAgKiA8cD5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyByb2xlLnJlbGF0aW9uKFwicm9sZXNcIik8L3A+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5SZWxhdGlvbn0gdGhlIHJlbGF0aW9uIGZvciB0aGUgcm9sZXMgYmVsb25naW5nIHRvIHRoaXNcbiAgICogICAgIHJvbGUuXG4gICAqL1xuICBnZXRSb2xlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGlvbigncm9sZXMnKTtcbiAgfVxuICBfdmFsaWRhdGVOYW1lKG5ld05hbWUpIHtcbiAgICBpZiAodHlwZW9mIG5ld05hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCBcIkEgcm9sZSdzIG5hbWUgbXVzdCBiZSBhIFN0cmluZy5cIik7XG4gICAgfVxuICAgIGlmICghL15bMC05YS16QS1aXFwtXyBdKyQvLnRlc3QobmV3TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsIFwiQSByb2xlJ3MgbmFtZSBjYW4gYmUgb25seSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBfLCBcIiArICctLCBhbmQgc3BhY2VzLicpO1xuICAgIH1cbiAgfVxuICB2YWxpZGF0ZShhdHRycywgb3B0aW9ucykge1xuICAgIGNvbnN0IGlzSW52YWxpZCA9IHN1cGVyLnZhbGlkYXRlKGF0dHJzLCBvcHRpb25zKTtcbiAgICBpZiAoaXNJbnZhbGlkKSB7XG4gICAgICByZXR1cm4gaXNJbnZhbGlkO1xuICAgIH1cbiAgICBpZiAoJ25hbWUnIGluIGF0dHJzICYmIGF0dHJzLm5hbWUgIT09IHRoaXMuZ2V0TmFtZSgpKSB7XG4gICAgICBjb25zdCBuZXdOYW1lID0gYXR0cnMubmFtZTtcbiAgICAgIGlmICh0aGlzLmlkICYmIHRoaXMuaWQgIT09IGF0dHJzLm9iamVjdElkKSB7XG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgb2JqZWN0SWQgYmVpbmcgc2V0IG1hdGNoZXMgdGhpcy5pZFxuICAgICAgICAvLyBUaGlzIGhhcHBlbnMgZHVyaW5nIGEgZmV0Y2ggLS0gdGhlIGlkIGlzIHNldCBiZWZvcmUgY2FsbGluZyBmZXRjaFxuICAgICAgICAvLyBMZXQgdGhlIG5hbWUgYmUgc2V0IGluIHRoaXMgY2FzZVxuICAgICAgICByZXR1cm4gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgXCJBIHJvbGUncyBuYW1lIGNhbiBvbmx5IGJlIHNldCBiZWZvcmUgaXQgaGFzIGJlZW4gc2F2ZWQuXCIpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVOYW1lKG5ld05hbWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQYXJzZVJvbGUoUGFyc2VSb2xlKTtcbl9QYXJzZU9iamVjdC5kZWZhdWx0LnJlZ2lzdGVyU3ViY2xhc3MoJ19Sb2xlJywgUGFyc2VSb2xlKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlUm9sZTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgX1BhcnNlQ0xQID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUNMUFwiKSk7XG5jb25zdCBGSUVMRF9UWVBFUyA9IFsnU3RyaW5nJywgJ051bWJlcicsICdCb29sZWFuJywgJ0J5dGVzJywgJ0RhdGUnLCAnRmlsZScsICdHZW9Qb2ludCcsICdQb2x5Z29uJywgJ0FycmF5JywgJ09iamVjdCcsICdQb2ludGVyJywgJ1JlbGF0aW9uJ107XG4vKipcbiAqIEEgUGFyc2UuU2NoZW1hIG9iamVjdCBpcyBmb3IgaGFuZGxpbmcgc2NoZW1hIGRhdGEgZnJvbSBQYXJzZS5cbiAqIDxwPkFsbCB0aGUgc2NoZW1hcyBtZXRob2RzIHJlcXVpcmUgTWFzdGVyS2V5LlxuICpcbiAqIFdoZW4gYWRkaW5nIGZpZWxkcywgeW91IG1heSBzZXQgcmVxdWlyZWQgYW5kIGRlZmF1bHQgdmFsdWVzLiAoUmVxdWlyZXMgUGFyc2UgU2VydmVyIDMuNy4wKylcbiAqXG4gKiA8cHJlPlxuICogY29uc3Qgb3B0aW9ucyA9IHsgcmVxdWlyZWQ6IHRydWUsIGRlZmF1bHRWYWx1ZTogJ2hlbGxvIHdvcmxkJyB9O1xuICogY29uc3Qgc2NoZW1hID0gbmV3IFBhcnNlLlNjaGVtYSgnTXlDbGFzcycpO1xuICogc2NoZW1hLmFkZFN0cmluZygnZmllbGQnLCBvcHRpb25zKTtcbiAqIHNjaGVtYS5hZGRJbmRleCgnaW5kZXhfbmFtZScsIHsgJ2ZpZWxkJzogMSB9KTtcbiAqIHNjaGVtYS5zYXZlKCk7XG4gKiA8L3ByZT5cbiAqIDwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuU2NoZW1hXG4gKi9cbmNsYXNzIFBhcnNlU2NoZW1hIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgUGFyc2UgQ2xhc3Mgc3RyaW5nLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY2xhc3NOYW1lKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJjbGFzc05hbWVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9maWVsZHNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9pbmRleGVzXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfY2xwXCIsIHZvaWQgMCk7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoY2xhc3NOYW1lID09PSAnVXNlcicgJiYgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdQRVJGT1JNX1VTRVJfUkVXUklURScpKSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gJ19Vc2VyJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9maWVsZHMgPSB7fTtcbiAgICB0aGlzLl9pbmRleGVzID0ge307XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCB0byBnZXQgYWxsIHNjaGVtYXNcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgYWxsKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTY2hlbWFDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0KCcnKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5yZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjaGVtYSBub3QgZm91bmQuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFNjaGVtYSBmcm9tIFBhcnNlXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgZ2V0KCkge1xuICAgIHRoaXMuYXNzZXJ0Q2xhc3NOYW1lKCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNjaGVtYUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5nZXQodGhpcy5jbGFzc05hbWUpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjaGVtYSBub3QgZm91bmQuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IFNjaGVtYSBvbiBQYXJzZVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIHNhdmUoKSB7XG4gICAgdGhpcy5hc3NlcnRDbGFzc05hbWUoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U2NoZW1hQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICBmaWVsZHM6IHRoaXMuX2ZpZWxkcyxcbiAgICAgIGluZGV4ZXM6IHRoaXMuX2luZGV4ZXMsXG4gICAgICBjbGFzc0xldmVsUGVybWlzc2lvbnM6IHRoaXMuX2NscFxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuY3JlYXRlKHRoaXMuY2xhc3NOYW1lLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIFNjaGVtYSBvbiBQYXJzZVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIHVwZGF0ZSgpIHtcbiAgICB0aGlzLmFzc2VydENsYXNzTmFtZSgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTY2hlbWFDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIGZpZWxkczogdGhpcy5fZmllbGRzLFxuICAgICAgaW5kZXhlczogdGhpcy5faW5kZXhlcyxcbiAgICAgIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogdGhpcy5fY2xwXG4gICAgfTtcbiAgICB0aGlzLl9maWVsZHMgPSB7fTtcbiAgICB0aGlzLl9pbmRleGVzID0ge307XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIudXBkYXRlKHRoaXMuY2xhc3NOYW1lLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92aW5nIGEgU2NoZW1hIGZyb20gUGFyc2VcbiAgICogQ2FuIG9ubHkgYmUgdXNlZCBvbiBTY2hlbWEgd2l0aG91dCBvYmplY3RzXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgZGVsZXRlKCkge1xuICAgIHRoaXMuYXNzZXJ0Q2xhc3NOYW1lKCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNjaGVtYUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5kZWxldGUodGhpcy5jbGFzc05hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSBhIFNjaGVtYSAoY2xhc3MpIGluIFBhcnNlLlxuICAgKiBFWEVSQ0lTRSBDQVVUSU9OLCBydW5uaW5nIHRoaXMgd2lsbCBkZWxldGUgYWxsIG9iamVjdHMgZm9yIHRoaXMgc2NoZW1hIGFuZCBjYW5ub3QgYmUgcmV2ZXJzZWRcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBwdXJnZSgpIHtcbiAgICB0aGlzLmFzc2VydENsYXNzTmFtZSgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTY2hlbWFDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIucHVyZ2UodGhpcy5jbGFzc05hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VydCBpZiBDbGFzc05hbWUgaGFzIGJlZW4gZmlsbGVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhc3NlcnRDbGFzc05hbWUoKSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBzZXQgYSBDbGFzcyBOYW1lIGJlZm9yZSBtYWtpbmcgYW55IHJlcXVlc3QuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgQ2xhc3MgTGV2ZWwgUGVybWlzc2lvbnMgd2hlbiBjcmVhdGluZyAvIHVwZGF0aW5nIGEgU2NoZW1hLlxuICAgKiBFWEVSQ0lTRSBDQVVUSU9OLCBydW5uaW5nIHRoaXMgbWF5IG92ZXJyaWRlIENMUCBmb3IgdGhpcyBzY2hlbWEgYW5kIGNhbm5vdCBiZSByZXZlcnNlZFxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdCB8IFBhcnNlLkNMUH0gY2xwIENsYXNzIExldmVsIFBlcm1pc3Npb25zXG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBzZXRDTFAoY2xwKSB7XG4gICAgaWYgKGNscCBpbnN0YW5jZW9mIF9QYXJzZUNMUC5kZWZhdWx0KSB7XG4gICAgICB0aGlzLl9jbHAgPSBjbHAudG9KU09OKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NscCA9IGNscDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIGEgRmllbGQgdG8gQ3JlYXRlIC8gVXBkYXRlIGEgU2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIENhbiBiZSBhIChTdHJpbmd8TnVtYmVyfEJvb2xlYW58RGF0ZXxQYXJzZS5GaWxlfFBhcnNlLkdlb1BvaW50fEFycmF5fE9iamVjdHxQb2ludGVyfFBhcnNlLlJlbGF0aW9uKVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnJlcXVpcmVkOiBJZiBmaWVsZCBpcyBub3Qgc2V0LCBzYXZlIG9wZXJhdGlvbiBmYWlscyAoUmVxdWlyZXMgUGFyc2UgU2VydmVyIDMuNy4wKylcbiAgICogICA8bGk+ZGVmYXVsdFZhbHVlOiBJZiBmaWVsZCBpcyBub3Qgc2V0LCBhIGRlZmF1bHQgdmFsdWUgaXMgc2VsZWN0ZWQgKFJlcXVpcmVzIFBhcnNlIFNlcnZlciAzLjcuMCspXG4gICAqICAgPGxpPnRhcmdldENsYXNzOiBSZXF1aXJlZCBpZiB0eXBlIGlzIFBvaW50ZXIgb3IgUGFyc2UuUmVsYXRpb25cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZEZpZWxkKG5hbWUsIHR5cGUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdHlwZSA9IHR5cGUgfHwgJ1N0cmluZyc7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpZWxkIG5hbWUgbWF5IG5vdCBiZSBudWxsLicpO1xuICAgIH1cbiAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKEZJRUxEX1RZUEVTKS5jYWxsKEZJRUxEX1RZUEVTLCB0eXBlKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0eXBlfSBpcyBub3QgYSB2YWxpZCB0eXBlLmApO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRQb2ludGVyKG5hbWUsIG9wdGlvbnMudGFyZ2V0Q2xhc3MsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1JlbGF0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkUmVsYXRpb24obmFtZSwgb3B0aW9ucy50YXJnZXRDbGFzcyk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkT3B0aW9ucyA9IHtcbiAgICAgIHR5cGVcbiAgICB9O1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZXF1aXJlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBmaWVsZE9wdGlvbnMucmVxdWlyZWQgPSBvcHRpb25zLnJlcXVpcmVkO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmllbGRPcHRpb25zLmRlZmF1bHRWYWx1ZSA9IG9wdGlvbnMuZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ0RhdGUnKSB7XG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmaWVsZE9wdGlvbnMuZGVmYXVsdFZhbHVlID0ge1xuICAgICAgICAgIF9fdHlwZTogJ0RhdGUnLFxuICAgICAgICAgIGlzbzogbmV3IERhdGUob3B0aW9ucy5kZWZhdWx0VmFsdWUpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnQnl0ZXMnKSB7XG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmaWVsZE9wdGlvbnMuZGVmYXVsdFZhbHVlID0ge1xuICAgICAgICAgIF9fdHlwZTogJ0J5dGVzJyxcbiAgICAgICAgICBiYXNlNjQ6IG9wdGlvbnMuZGVmYXVsdFZhbHVlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2ZpZWxkc1tuYW1lXSA9IGZpZWxkT3B0aW9ucztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgYW4gSW5kZXggdG8gQ3JlYXRlIC8gVXBkYXRlIGEgU2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGluZGV4XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbmRleCB7IGZpZWxkOiB2YWx1ZSB9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIHNjaGVtYS5hZGRJbmRleCgnaW5kZXhfbmFtZScsIHsgJ2ZpZWxkJzogMSB9KTtcbiAgICogPC9wcmU+XG4gICAqL1xuICBhZGRJbmRleChuYW1lLCBpbmRleCkge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmRleCBuYW1lIG1heSBub3QgYmUgbnVsbC4nKTtcbiAgICB9XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmRleCBtYXkgbm90IGJlIG51bGwuJyk7XG4gICAgfVxuICAgIHRoaXMuX2luZGV4ZXNbbmFtZV0gPSBpbmRleDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgU3RyaW5nIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZFN0cmluZyhuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ1N0cmluZycsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBOdW1iZXIgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkTnVtYmVyKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnTnVtYmVyJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIEJvb2xlYW4gRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkQm9vbGVhbihuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ0Jvb2xlYW4nLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgQnl0ZXMgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkQnl0ZXMobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdCeXRlcycsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBEYXRlIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZERhdGUobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdEYXRlJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIEZpbGUgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkRmlsZShuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ0ZpbGUnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgR2VvUG9pbnQgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkR2VvUG9pbnQobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdHZW9Qb2ludCcsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBQb2x5Z29uIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZFBvbHlnb24obmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdQb2x5Z29uJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIEFycmF5IEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZEFycmF5KG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnQXJyYXknLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgT2JqZWN0IEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZE9iamVjdChuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ09iamVjdCcsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBQb2ludGVyIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRDbGFzcyBOYW1lIG9mIHRoZSB0YXJnZXQgUG9pbnRlciBDbGFzc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRQb2ludGVyKG5hbWUsIHRhcmdldENsYXNzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmaWVsZCBuYW1lIG1heSBub3QgYmUgbnVsbC4nKTtcbiAgICB9XG4gICAgaWYgKCF0YXJnZXRDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzZXQgdGhlIHRhcmdldENsYXNzIG9mIHRoZSBQb2ludGVyLicpO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZE9wdGlvbnMgPSB7XG4gICAgICB0eXBlOiAnUG9pbnRlcicsXG4gICAgICB0YXJnZXRDbGFzc1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlcXVpcmVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGZpZWxkT3B0aW9ucy5yZXF1aXJlZCA9IG9wdGlvbnMucmVxdWlyZWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWVsZE9wdGlvbnMuZGVmYXVsdFZhbHVlID0gb3B0aW9ucy5kZWZhdWx0VmFsdWU7XG4gICAgICBpZiAob3B0aW9ucy5kZWZhdWx0VmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VPYmplY3QuZGVmYXVsdCkge1xuICAgICAgICBmaWVsZE9wdGlvbnMuZGVmYXVsdFZhbHVlID0gb3B0aW9ucy5kZWZhdWx0VmFsdWUudG9Qb2ludGVyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2ZpZWxkc1tuYW1lXSA9IGZpZWxkT3B0aW9ucztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgUmVsYXRpb24gRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldENsYXNzIE5hbWUgb2YgdGhlIHRhcmdldCBQb2ludGVyIENsYXNzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRSZWxhdGlvbihuYW1lLCB0YXJnZXRDbGFzcykge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmaWVsZCBuYW1lIG1heSBub3QgYmUgbnVsbC4nKTtcbiAgICB9XG4gICAgaWYgKCF0YXJnZXRDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzZXQgdGhlIHRhcmdldENsYXNzIG9mIHRoZSBSZWxhdGlvbi4nKTtcbiAgICB9XG4gICAgdGhpcy5fZmllbGRzW25hbWVdID0ge1xuICAgICAgdHlwZTogJ1JlbGF0aW9uJyxcbiAgICAgIHRhcmdldENsYXNzXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGluZyBhIEZpZWxkIHRvIFVwZGF0ZSBvbiBhIFNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZFxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZGVsZXRlRmllbGQobmFtZSkge1xuICAgIHRoaXMuX2ZpZWxkc1tuYW1lXSA9IHtcbiAgICAgIF9fb3A6ICdEZWxldGUnXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGluZyBhbiBJbmRleCB0byBVcGRhdGUgb24gYSBTY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGRcbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGRlbGV0ZUluZGV4KG5hbWUpIHtcbiAgICB0aGlzLl9pbmRleGVzW25hbWVdID0ge1xuICAgICAgX19vcDogJ0RlbGV0ZSdcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgc2VuZChjbGFzc05hbWUsIG1ldGhvZCkge1xuICAgIGxldCBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdChtZXRob2QsIGBzY2hlbWFzLyR7Y2xhc3NOYW1lfWAsIHBhcmFtcywge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfSk7XG4gIH0sXG4gIGdldChjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kKGNsYXNzTmFtZSwgJ0dFVCcpO1xuICB9LFxuICBjcmVhdGUoY2xhc3NOYW1lLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kKGNsYXNzTmFtZSwgJ1BPU1QnLCBwYXJhbXMpO1xuICB9LFxuICB1cGRhdGUoY2xhc3NOYW1lLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kKGNsYXNzTmFtZSwgJ1BVVCcsIHBhcmFtcyk7XG4gIH0sXG4gIGRlbGV0ZShjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kKGNsYXNzTmFtZSwgJ0RFTEVURScpO1xuICB9LFxuICBwdXJnZShjbGFzc05hbWUpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0RFTEVURScsIGBwdXJnZS8ke2NsYXNzTmFtZX1gLCB7fSwge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfSk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRTY2hlbWFDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlU2NoZW1hOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9pc1Jldm9jYWJsZVNlc3Npb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2lzUmV2b2NhYmxlU2Vzc2lvblwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgX1BhcnNlVXNlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VVc2VyXCIpKTtcbi8qKlxuICogPHA+QSBQYXJzZS5TZXNzaW9uIG9iamVjdCBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgcmV2b2NhYmxlIHNlc3Npb24uXG4gKiBUaGlzIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgYSBQYXJzZS5PYmplY3QsIGFuZCByZXRhaW5zIHRoZSBzYW1lXG4gKiBmdW5jdGlvbmFsaXR5IG9mIGEgUGFyc2UuT2JqZWN0LjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuU2Vzc2lvblxuICogQGF1Z21lbnRzIFBhcnNlLk9iamVjdFxuICovXG5jbGFzcyBQYXJzZVNlc3Npb24gZXh0ZW5kcyBfUGFyc2VPYmplY3QuZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyBUaGUgaW5pdGlhbCBzZXQgb2YgZGF0YSB0byBzdG9yZSBpbiB0aGUgdXNlci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHtcbiAgICBzdXBlcignX1Nlc3Npb24nKTtcbiAgICBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICghdGhpcy5zZXQoYXR0cmlidXRlcyB8fCB7fSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIGFuIGludmFsaWQgU2Vzc2lvblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiB0b2tlbiBzdHJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRTZXNzaW9uVG9rZW4oKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldCgnc2Vzc2lvblRva2VuJyk7XG4gICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHN0YXRpYyByZWFkT25seUF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnY3JlYXRlZFdpdGgnLCAnZXhwaXJlc0F0JywgJ2luc3RhbGxhdGlvbklkJywgJ3Jlc3RyaWN0ZWQnLCAnc2Vzc2lvblRva2VuJywgJ3VzZXInXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIFNlc3Npb24gb2JqZWN0IGZvciB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiBzZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyB1c2VNYXN0ZXJLZXlcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgUGFyc2UuU2Vzc2lvblxuICAgKiBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gZmV0Y2hlZC4gSWYgdGhlcmUgaXMgbm8gY3VycmVudCB1c2VyLCB0aGVcbiAgICogcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkLlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTZXNzaW9uQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHNlc3Npb25PcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBzZXNzaW9uT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgcmV0dXJuIF9QYXJzZVVzZXIuZGVmYXVsdC5jdXJyZW50QXN5bmMoKS50aGVuKHVzZXIgPT4ge1xuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnVGhlcmUgaXMgbm8gY3VycmVudCB1c2VyLicpO1xuICAgICAgfVxuICAgICAgc2Vzc2lvbk9wdGlvbnMuc2Vzc2lvblRva2VuID0gdXNlci5nZXRTZXNzaW9uVG9rZW4oKTtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLmdldFNlc3Npb24oc2Vzc2lvbk9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzZXNzaW9uIHRva2VuIGlzIHJldm9jYWJsZS5cbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBtaWdyYXRpbmcgRXhwcmVzcy5qcyBvciBOb2RlLmpzIHdlYiBhcHBzIHRvXG4gICAqIHVzZSByZXZvY2FibGUgc2Vzc2lvbnMuIElmIHlvdSBhcmUgbWlncmF0aW5nIGFuIGFwcCB0aGF0IHVzZXMgdGhlIFBhcnNlXG4gICAqIFNESyBpbiB0aGUgYnJvd3NlciBvbmx5LCBwbGVhc2UgdXNlIFBhcnNlLlVzZXIuZW5hYmxlUmV2b2NhYmxlU2Vzc2lvbigpXG4gICAqIGluc3RlYWQsIHNvIHRoYXQgc2Vzc2lvbnMgY2FuIGJlIGF1dG9tYXRpY2FsbHkgdXBncmFkZWQuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNDdXJyZW50U2Vzc2lvblJldm9jYWJsZSgpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IF9QYXJzZVVzZXIuZGVmYXVsdC5jdXJyZW50KCk7XG4gICAgaWYgKGN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4gKDAsIF9pc1Jldm9jYWJsZVNlc3Npb24uZGVmYXVsdCkoY3VycmVudFVzZXIuZ2V0U2Vzc2lvblRva2VuKCkgfHwgJycpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbl9QYXJzZU9iamVjdC5kZWZhdWx0LnJlZ2lzdGVyU3ViY2xhc3MoJ19TZXNzaW9uJywgUGFyc2VTZXNzaW9uKTtcbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBnZXRTZXNzaW9uKG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBQYXJzZVNlc3Npb24oKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ3Nlc3Npb25zL21lJywge30sIG9wdGlvbnMpLnRoZW4oc2Vzc2lvbkRhdGEgPT4ge1xuICAgICAgc2Vzc2lvbi5fZmluaXNoRmV0Y2goc2Vzc2lvbkRhdGEpO1xuICAgICAgc2Vzc2lvbi5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH0pO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0U2Vzc2lvbkNvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VTZXNzaW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkyKGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2lzUmV2b2NhYmxlU2Vzc2lvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaXNSZXZvY2FibGVTZXNzaW9uXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgX1N0b3JhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VcIikpO1xuY29uc3QgQ1VSUkVOVF9VU0VSX0tFWSA9ICdjdXJyZW50VXNlcic7XG5sZXQgY2FuVXNlQ3VycmVudFVzZXIgPSAhX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJU19OT0RFJyk7XG5sZXQgY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrID0gZmFsc2U7XG5sZXQgY3VycmVudFVzZXJDYWNoZSA9IG51bGw7XG5jb25zdCBhdXRoUHJvdmlkZXJzID0ge307XG5cbi8qKlxuICogPHA+QSBQYXJzZS5Vc2VyIG9iamVjdCBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgdXNlciBwZXJzaXN0ZWQgdG8gdGhlXG4gKiBQYXJzZSBjbG91ZC4gVGhpcyBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIGEgUGFyc2UuT2JqZWN0LCBhbmQgcmV0YWlucyB0aGVcbiAqIHNhbWUgZnVuY3Rpb25hbGl0eSBvZiBhIFBhcnNlLk9iamVjdCwgYnV0IGFsc28gZXh0ZW5kcyBpdCB3aXRoIHZhcmlvdXNcbiAqIHVzZXIgc3BlY2lmaWMgbWV0aG9kcywgbGlrZSBhdXRoZW50aWNhdGlvbiwgc2lnbmluZyB1cCwgYW5kIHZhbGlkYXRpb24gb2ZcbiAqIHVuaXF1ZW5lc3MuPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5Vc2VyXG4gKiBAYXVnbWVudHMgUGFyc2UuT2JqZWN0XG4gKi9cbmNsYXNzIFBhcnNlVXNlciBleHRlbmRzIF9QYXJzZU9iamVjdC5kZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIFRoZSBpbml0aWFsIHNldCBvZiBkYXRhIHRvIHN0b3JlIGluIHRoZSB1c2VyLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykge1xuICAgIHN1cGVyKCdfVXNlcicpO1xuICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKCF0aGlzLnNldChhdHRyaWJ1dGVzIHx8IHt9KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgYW4gaW52YWxpZCBQYXJzZSBVc2VyXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgcmV2b2NhYmxlIHNlc3Npb24gdG9rZW4gdG8gcmVwbGFjZSB0aGUgb2xkZXIgc3R5bGUgb2YgdG9rZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSByZXBsYWNlbWVudFxuICAgKiAgIHRva2VuIGhhcyBiZWVuIGZldGNoZWQuXG4gICAqL1xuICBfdXBncmFkZVRvUmV2b2NhYmxlU2Vzc2lvbihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgdXBncmFkZU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHVwZ3JhZGVPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci51cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uKHRoaXMsIHVwZ3JhZGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbGxvd3MgeW91IHRvIGxpbmsgeW91ciB1c2VycyB3aXRoIHtAbGluayBodHRwczovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvcGFyc2Utc2VydmVyL2d1aWRlLyNvYXV0aC1hbmQtM3JkLXBhcnR5LWF1dGhlbnRpY2F0aW9uIDNyZCBwYXJ0eSBhdXRoZW50aWNhdGlvbn0sIGVuYWJsaW5nXG4gICAqIHlvdXIgdXNlcnMgdG8gc2lnbiB1cCBvciBsb2cgaW50byB5b3VyIGFwcGxpY2F0aW9uIHVzaW5nIHRoZWlyIGV4aXN0aW5nIGlkZW50aXRpZXMuXG4gICAqIFNpbmNlIDIuOS4wXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9qcy9ndWlkZS8jbGlua2luZy11c2VycyBMaW5raW5nIFVzZXJzfVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEF1dGhQcm92aWRlcn0gcHJvdmlkZXIgTmFtZSBvZiBhdXRoIHByb3ZpZGVyIG9yIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL0F1dGhQcm92aWRlci5odG1sIEF1dGhQcm92aWRlcn1cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLmF1dGhEYXRhXSBBdXRoRGF0YSB0byBsaW5rIHdpdGhcbiAgICogPHVsPlxuICAgKiAgIDxsaT5JZiBwcm92aWRlciBpcyBzdHJpbmcsIG9wdGlvbnMgaXMge0BsaW5rIGh0dHA6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL3BhcnNlLXNlcnZlci9ndWlkZS8jc3VwcG9ydGVkLTNyZC1wYXJ0eS1hdXRoZW50aWNhdGlvbnMgYXV0aERhdGF9XG4gICAqICAgPGxpPklmIHByb3ZpZGVyIGlzIEF1dGhQcm92aWRlciwgb3B0aW9ucyBpcyBzYXZlT3B0c1xuICAgKiA8L3VsPlxuICAgKiBAcGFyYW0ge29iamVjdH0gc2F2ZU9wdHMgdXNlTWFzdGVyS2V5IC8gc2Vzc2lvblRva2VuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciBpcyBsaW5rZWRcbiAgICovXG4gIGxpbmtXaXRoKHByb3ZpZGVyLCBvcHRpb25zKSB7XG4gICAgbGV0IHNhdmVPcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBzYXZlT3B0cy5zZXNzaW9uVG9rZW4gPSBzYXZlT3B0cy5zZXNzaW9uVG9rZW4gfHwgdGhpcy5nZXRTZXNzaW9uVG9rZW4oKSB8fCAnJztcbiAgICBsZXQgYXV0aFR5cGU7XG4gICAgaWYgKHR5cGVvZiBwcm92aWRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGF1dGhUeXBlID0gcHJvdmlkZXI7XG4gICAgICBpZiAoYXV0aFByb3ZpZGVyc1twcm92aWRlcl0pIHtcbiAgICAgICAgcHJvdmlkZXIgPSBhdXRoUHJvdmlkZXJzW3Byb3ZpZGVyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IHtcbiAgICAgICAgICByZXN0b3JlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldEF1dGhUeXBlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGF1dGhUeXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYXV0aFByb3ZpZGVyc1thdXRoUHJvdmlkZXIuZ2V0QXV0aFR5cGUoKV0gPSBhdXRoUHJvdmlkZXI7XG4gICAgICAgIHByb3ZpZGVyID0gYXV0aFByb3ZpZGVyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhdXRoVHlwZSA9IHByb3ZpZGVyLmdldEF1dGhUeXBlKCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2F1dGhEYXRhJykpIHtcbiAgICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJykgfHwge307XG4gICAgICBpZiAodHlwZW9mIGF1dGhEYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHlwZTogYXV0aERhdGEgZmllbGQgc2hvdWxkIGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgYXV0aERhdGFbYXV0aFR5cGVdID0gb3B0aW9ucy5hdXRoRGF0YTtcbiAgICAgIGNvbnN0IG9sZEFub255bW91c0RhdGEgPSBhdXRoRGF0YS5hbm9ueW1vdXM7XG4gICAgICB0aGlzLnN0cmlwQW5vbnltaXR5KCk7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLmxpbmtXaXRoKHRoaXMsIGF1dGhEYXRhLCBzYXZlT3B0cykuY2F0Y2goZSA9PiB7XG4gICAgICAgIGRlbGV0ZSBhdXRoRGF0YVthdXRoVHlwZV07XG4gICAgICAgIHRoaXMucmVzdG9yZUFub25pbWl0eShvbGRBbm9ueW1vdXNEYXRhKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBwcm92aWRlci5hdXRoZW50aWNhdGUoe1xuICAgICAgICAgIHN1Y2Nlc3M6IChwcm92aWRlciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0ge307XG4gICAgICAgICAgICBvcHRzLmF1dGhEYXRhID0gcmVzdWx0O1xuICAgICAgICAgICAgdGhpcy5saW5rV2l0aChwcm92aWRlciwgb3B0cywgc2F2ZU9wdHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKHByb3ZpZGVyLCBlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwcm92aWRlclxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuYXV0aERhdGFdXG4gICAqIEBwYXJhbSBzYXZlT3B0c1xuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjkuMCBzZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuVXNlci5odG1sI2xpbmtXaXRoIGxpbmtXaXRofVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIF9saW5rV2l0aChwcm92aWRlciwgb3B0aW9ucykge1xuICAgIGxldCBzYXZlT3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgcmV0dXJuIHRoaXMubGlua1dpdGgocHJvdmlkZXIsIG9wdGlvbnMsIHNhdmVPcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbml6ZXMgYXV0aCBkYXRhIGZvciBhIHByb3ZpZGVyIChlLmcuIHB1dHMgdGhlIGFjY2VzcyB0b2tlbiBpbiB0aGVcbiAgICogcmlnaHQgcGxhY2UgdG8gYmUgdXNlZCBieSB0aGUgRmFjZWJvb2sgU0RLKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyXG4gICAqL1xuICBfc3luY2hyb25pemVBdXRoRGF0YShwcm92aWRlcikge1xuICAgIGlmICghdGhpcy5pc0N1cnJlbnQoKSB8fCAhcHJvdmlkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGF1dGhUeXBlO1xuICAgIGlmICh0eXBlb2YgcHJvdmlkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBhdXRoVHlwZSA9IHByb3ZpZGVyO1xuICAgICAgcHJvdmlkZXIgPSBhdXRoUHJvdmlkZXJzW2F1dGhUeXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXV0aFR5cGUgPSBwcm92aWRlci5nZXRBdXRoVHlwZSgpO1xuICAgIH1cbiAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpO1xuICAgIGlmICghcHJvdmlkZXIgfHwgIWF1dGhEYXRhIHx8IHR5cGVvZiBhdXRoRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3VjY2VzcyA9IHByb3ZpZGVyLnJlc3RvcmVBdXRoZW50aWNhdGlvbihhdXRoRGF0YVthdXRoVHlwZV0pO1xuICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgdGhpcy5fdW5saW5rRnJvbShwcm92aWRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXplcyBhdXRoRGF0YSBmb3IgYWxsIHByb3ZpZGVycy5cbiAgICovXG4gIF9zeW5jaHJvbml6ZUFsbEF1dGhEYXRhKCkge1xuICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJyk7XG4gICAgaWYgKHR5cGVvZiBhdXRoRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXV0aERhdGEpIHtcbiAgICAgIHRoaXMuX3N5bmNocm9uaXplQXV0aERhdGEoa2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBudWxsIHZhbHVlcyBmcm9tIGF1dGhEYXRhICh3aGljaCBleGlzdCB0ZW1wb3JhcmlseSBmb3IgdW5saW5raW5nKVxuICAgKi9cbiAgX2NsZWFudXBBdXRoRGF0YSgpIHtcbiAgICBpZiAoIXRoaXMuaXNDdXJyZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKTtcbiAgICBpZiAodHlwZW9mIGF1dGhEYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdXRoRGF0YSkge1xuICAgICAgaWYgKCFhdXRoRGF0YVtrZXldKSB7XG4gICAgICAgIGRlbGV0ZSBhdXRoRGF0YVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxpbmtzIGEgdXNlciBmcm9tIGEgc2VydmljZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBdXRoUHJvdmlkZXJ9IHByb3ZpZGVyIE5hbWUgb2YgYXV0aCBwcm92aWRlciBvciB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9BdXRoUHJvdmlkZXIuaHRtbCBBdXRoUHJvdmlkZXJ9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE1hc3RlcktleSAvIFNlc3Npb25Ub2tlblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVubGlua2luZ1xuICAgKiAgICAgZmluaXNoZXMuXG4gICAqL1xuICBfdW5saW5rRnJvbShwcm92aWRlciwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmxpbmtXaXRoKHByb3ZpZGVyLCB7XG4gICAgICBhdXRoRGF0YTogbnVsbFxuICAgIH0sIG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fc3luY2hyb25pemVBdXRoRGF0YShwcm92aWRlcik7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHRoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgdXNlciBpcyBsaW5rZWQgdG8gYSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvdmlkZXIgc2VydmljZSB0byBsaW5rIHRvXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGxpbmsgd2FzIHN1Y2Nlc3NmdWxcbiAgICovXG4gIF9pc0xpbmtlZChwcm92aWRlcikge1xuICAgIGxldCBhdXRoVHlwZTtcbiAgICBpZiAodHlwZW9mIHByb3ZpZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgYXV0aFR5cGUgPSBwcm92aWRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgYXV0aFR5cGUgPSBwcm92aWRlci5nZXRBdXRoVHlwZSgpO1xuICAgIH1cbiAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpIHx8IHt9O1xuICAgIGlmICh0eXBlb2YgYXV0aERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIWF1dGhEYXRhW2F1dGhUeXBlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWF1dGhlbnRpY2F0ZXMgYWxsIHByb3ZpZGVycy5cbiAgICovXG4gIF9sb2dPdXRXaXRoQWxsKCkge1xuICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJyk7XG4gICAgaWYgKHR5cGVvZiBhdXRoRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXV0aERhdGEpIHtcbiAgICAgIHRoaXMuX2xvZ091dFdpdGgoa2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVhdXRoZW50aWNhdGVzIGEgc2luZ2xlIHByb3ZpZGVyIChlLmcuIHJlbW92aW5nIGFjY2VzcyB0b2tlbnMgZnJvbSB0aGVcbiAgICogRmFjZWJvb2sgU0RLKS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHByb3ZpZGVyIHNlcnZpY2UgdG8gbG9nb3V0IG9mXG4gICAqL1xuICBfbG9nT3V0V2l0aChwcm92aWRlcikge1xuICAgIGlmICghdGhpcy5pc0N1cnJlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb3ZpZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgcHJvdmlkZXIgPSBhdXRoUHJvdmlkZXJzW3Byb3ZpZGVyXTtcbiAgICB9XG4gICAgaWYgKHByb3ZpZGVyICYmIHByb3ZpZGVyLmRlYXV0aGVudGljYXRlKSB7XG4gICAgICBwcm92aWRlci5kZWF1dGhlbnRpY2F0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGFzcyBpbnN0YW5jZSBtZXRob2QgdXNlZCB0byBtYWludGFpbiBzcGVjaWZpYyBrZXlzIHdoZW4gYSBmZXRjaCBvY2N1cnMuXG4gICAqIFVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHNlc3Npb24gdG9rZW4gaXMgbm90IGxvc3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IHNlc3Npb25Ub2tlblxuICAgKi9cbiAgX3ByZXNlcnZlRmllbGRzT25GZXRjaCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Vzc2lvblRva2VuOiB0aGlzLmdldCgnc2Vzc2lvblRva2VuJylcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiA8Y29kZT5jdXJyZW50PC9jb2RlPiB3b3VsZCByZXR1cm4gdGhpcyB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB1c2VyIGlzIGNhY2hlZCBvbiBkaXNrXG4gICAqL1xuICBpc0N1cnJlbnQoKSB7XG4gICAgY29uc3QgY3VycmVudCA9IFBhcnNlVXNlci5jdXJyZW50KCk7XG4gICAgcmV0dXJuICEhY3VycmVudCAmJiBjdXJyZW50LmlkID09PSB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiA8Y29kZT5jdXJyZW50PC9jb2RlPiB3b3VsZCByZXR1cm4gdGhpcyB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gdHJ1ZSBpZiB1c2VyIGlzIGNhY2hlZCBvbiBkaXNrXG4gICAqL1xuICBhc3luYyBpc0N1cnJlbnRBc3luYygpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgUGFyc2VVc2VyLmN1cnJlbnRBc3luYygpO1xuICAgIHJldHVybiAhIWN1cnJlbnQgJiYgY3VycmVudC5pZCA9PT0gdGhpcy5pZDtcbiAgfVxuICBzdHJpcEFub255bWl0eSgpIHtcbiAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpO1xuICAgIGlmIChhdXRoRGF0YSAmJiB0eXBlb2YgYXV0aERhdGEgPT09ICdvYmplY3QnICYmIGF1dGhEYXRhLmhhc093blByb3BlcnR5KCdhbm9ueW1vdXMnKSkge1xuICAgICAgLy8gV2UgbmVlZCB0byBzZXQgYW5vbnltb3VzIHRvIG51bGwgaW5zdGVhZCBvZiBkZWxldGluZyBpdCBpbiBvcmRlciB0byByZW1vdmUgaXQgZnJvbSBQYXJzZS5cbiAgICAgIGF1dGhEYXRhLmFub255bW91cyA9IG51bGw7XG4gICAgfVxuICB9XG4gIHJlc3RvcmVBbm9uaW1pdHkoYW5vbnltb3VzRGF0YSkge1xuICAgIGlmIChhbm9ueW1vdXNEYXRhKSB7XG4gICAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpO1xuICAgICAgYXV0aERhdGEuYW5vbnltb3VzID0gYW5vbnltb3VzRGF0YTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBnZXQoXCJ1c2VybmFtZVwiKS5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFVzZXJuYW1lKCkge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5nZXQoJ3VzZXJuYW1lJyk7XG4gICAgaWYgKHVzZXJuYW1lID09IG51bGwgfHwgdHlwZW9mIHVzZXJuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHVzZXJuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgc2V0KFwidXNlcm5hbWVcIiwgdXNlcm5hbWUsIG9wdGlvbnMpIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZVxuICAgKi9cbiAgc2V0VXNlcm5hbWUodXNlcm5hbWUpIHtcbiAgICB0aGlzLnN0cmlwQW5vbnltaXR5KCk7XG4gICAgdGhpcy5zZXQoJ3VzZXJuYW1lJywgdXNlcm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHNldChcInBhc3N3b3JkXCIsIHBhc3N3b3JkLCBvcHRpb25zKSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVXNlcidzIFBhc3N3b3JkXG4gICAqL1xuICBzZXRQYXNzd29yZChwYXNzd29yZCkge1xuICAgIHRoaXMuc2V0KCdwYXNzd29yZCcsIHBhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGdldChcImVtYWlsXCIpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBVc2VyJ3MgRW1haWxcbiAgICovXG4gIGdldEVtYWlsKCkge1xuICAgIGNvbnN0IGVtYWlsID0gdGhpcy5nZXQoJ2VtYWlsJyk7XG4gICAgaWYgKGVtYWlsID09IG51bGwgfHwgdHlwZW9mIGVtYWlsID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVtYWlsO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgc2V0KFwiZW1haWxcIiwgZW1haWwpIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNldEVtYWlsKGVtYWlsKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KCdlbWFpbCcsIGVtYWlsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIHRva2VuIGZvciB0aGlzIHVzZXIsIGlmIHRoZSB1c2VyIGhhcyBiZWVuIGxvZ2dlZCBpbixcbiAgICogb3IgaWYgaXQgaXMgdGhlIHJlc3VsdCBvZiBhIHF1ZXJ5IHdpdGggdGhlIG1hc3RlciBrZXkuIE90aGVyd2lzZSwgcmV0dXJuc1xuICAgKiB1bmRlZmluZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBzZXNzaW9uIHRva2VuLCBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldFNlc3Npb25Ub2tlbigpIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0KCdzZXNzaW9uVG9rZW4nKTtcbiAgICBpZiAodG9rZW4gPT0gbnVsbCB8fCB0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIHVzZXIgaXMgdGhlIGN1cnJlbnQgdXNlciBhbmQgaGFzIGJlZW4gYXV0aGVudGljYXRlZC5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhpcyB1c2VyIGlzIHRoZSBjdXJyZW50IHVzZXIgYW5kIGlzIGxvZ2dlZCBpbi5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZWQoKSB7XG4gICAgY29uc3QgY3VycmVudCA9IFBhcnNlVXNlci5jdXJyZW50KCk7XG4gICAgcmV0dXJuICEhdGhpcy5nZXQoJ3Nlc3Npb25Ub2tlbicpICYmICEhY3VycmVudCAmJiBjdXJyZW50LmlkID09PSB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHVwIGEgbmV3IHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGluc3RlYWQgb2Ygc2F2ZSBmb3JcbiAgICogbmV3IFBhcnNlLlVzZXJzLiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IFBhcnNlLlVzZXIgb24gdGhlIHNlcnZlciwgYW5kXG4gICAqIGFsc28gcGVyc2lzdCB0aGUgc2Vzc2lvbiBvbiBkaXNrIHNvIHRoYXQgeW91IGNhbiBhY2Nlc3MgdGhlIHVzZXIgdXNpbmdcbiAgICogPGNvZGU+Y3VycmVudDwvY29kZT4uXG4gICAqXG4gICAqIDxwPkEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIHNpZ25VcC48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRycyBFeHRyYSBmaWVsZHMgdG8gc2V0IG9uIHRoZSBuZXcgdXNlciwgb3IgbnVsbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBzaWdudXBcbiAgICogICAgIGZpbmlzaGVzLlxuICAgKi9cbiAgc2lnblVwKGF0dHJzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3Qgc2lnbnVwT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgc2lnbnVwT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2luc3RhbGxhdGlvbklkJykpIHtcbiAgICAgIHNpZ251cE9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPSBvcHRpb25zLmluc3RhbGxhdGlvbklkO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvcHRpb25zLmNvbnRleHQpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgc2lnbnVwT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduVXAodGhpcywgYXR0cnMsIHNpZ251cE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW4gYSBQYXJzZS5Vc2VyLiBPbiBzdWNjZXNzLCB0aGlzIHNhdmVzIHRoZSBzZXNzaW9uIHRvIGRpc2ssXG4gICAqIHNvIHlvdSBjYW4gcmV0cmlldmUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlciB1c2luZ1xuICAgKiA8Y29kZT5jdXJyZW50PC9jb2RlPi5cbiAgICpcbiAgICogPHA+QSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgbG9nSW4uPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgbG9nSW4oKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGxvZ2luT3B0aW9ucyA9IHtcbiAgICAgIHVzZVBvc3Q6IHRydWVcbiAgICB9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgbG9naW5PcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaW5zdGFsbGF0aW9uSWQnKSkge1xuICAgICAgbG9naW5PcHRpb25zLmluc3RhbGxhdGlvbklkID0gb3B0aW9ucy5pbnN0YWxsYXRpb25JZDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZVBvc3QnKSkge1xuICAgICAgbG9naW5PcHRpb25zLnVzZVBvc3QgPSBvcHRpb25zLnVzZVBvc3Q7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9wdGlvbnMuY29udGV4dCkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICBsb2dpbk9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIubG9nSW4odGhpcywgbG9naW5PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBkZWZhdWx0IHNhdmUgYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRvIHNhdmUgdG8gbG9jYWxcbiAgICogc3RvcmFnZSBpZiB0aGlzIGlzIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBhc3luYyBzYXZlKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuc2F2ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5pc0N1cnJlbnRBc3luYygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKS51cGRhdGVVc2VyT25EaXNrKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBkZWZhdWx0IGRlc3Ryb3kgYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRoYXQgbG9ncyBvdXRcbiAgICogdGhlIGN1cnJlbnQgdXNlciB3aGVuIGl0IGlzIGRlc3Ryb3llZFxuICAgKlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuVXNlcn1cbiAgICovXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJncyk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuaXNDdXJyZW50QXN5bmMoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCkucmVtb3ZlVXNlckZyb21EaXNrKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGRlZmF1bHQgZmV0Y2ggYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRvIHNhdmUgdG8gbG9jYWxcbiAgICogc3RvcmFnZSBpZiB0aGlzIGlzIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1BhcnNlLlVzZXJ9XG4gICAqL1xuICBhc3luYyBmZXRjaCgpIHtcbiAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZmV0Y2guYXBwbHkodGhpcywgYXJncyk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuaXNDdXJyZW50QXN5bmMoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCkudXBkYXRlVXNlck9uRGlzayh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZGVmYXVsdCBmZXRjaFdpdGhJbmNsdWRlIGJlaGF2aW9yIHdpdGggZnVuY3Rpb25hbGl0eSB0byBzYXZlIHRvIGxvY2FsXG4gICAqIHN0b3JhZ2UgaWYgdGhpcyBpcyBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5Vc2VyfVxuICAgKi9cbiAgYXN5bmMgZmV0Y2hXaXRoSW5jbHVkZSgpIHtcbiAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZmV0Y2hXaXRoSW5jbHVkZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5pc0N1cnJlbnRBc3luYygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKS51cGRhdGVVc2VyT25EaXNrKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgd2hldGhlciBhIGdpdmVuIHBhc3N3b3JkIGlzIHRoZSBwYXNzd29yZCBvZiB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGJlIHZlcmlmaWVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pZ25vcmVFbWFpbFZlcmlmaWNhdGlvbl0gU2V0IHRvIGB0cnVlYCB0byBieXBhc3MgZW1haWwgdmVyaWZpY2F0aW9uIGFuZCB2ZXJpZnlcbiAgICogdGhlIHBhc3N3b3JkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZW1haWwgaGFzIGJlZW4gdmVyaWZpZWQuIFRoaXMgcmVxdWlyZXMgdGhlIG1hc3RlciBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhIHVzZXIgd2hlbiB0aGUgcGFzc3dvcmQgaXMgY29ycmVjdC5cbiAgICovXG4gIHZlcmlmeVBhc3N3b3JkKHBhc3N3b3JkLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLmdldFVzZXJuYW1lKCkgfHwgJyc7XG4gICAgcmV0dXJuIFBhcnNlVXNlci52ZXJpZnlQYXNzd29yZCh1c2VybmFtZSwgcGFzc3dvcmQsIG9wdGlvbnMpO1xuICB9XG4gIHN0YXRpYyByZWFkT25seUF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnc2Vzc2lvblRva2VuJ107XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBmdW5jdGlvbmFsaXR5IHRvIHRoZSBleGlzdGluZyBQYXJzZS5Vc2VyIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvdG9Qcm9wcyBBIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgcHJvdG90eXBlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjbGFzc1Byb3BzIEEgc2V0IG9mIHN0YXRpYyBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgY2xhc3NcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuVXNlcn0gVGhlIG5ld2x5IGV4dGVuZGVkIFBhcnNlLlVzZXIgY2xhc3NcbiAgICovXG4gIHN0YXRpYyBleHRlbmQocHJvdG9Qcm9wcywgY2xhc3NQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcHJvdG9Qcm9wcykge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2NsYXNzTmFtZScpIHtcbiAgICAgICAgICAoMCwgX2RlZmluZVByb3BlcnR5LmRlZmF1bHQpKFBhcnNlVXNlci5wcm90b3R5cGUsIHByb3AsIHtcbiAgICAgICAgICAgIHZhbHVlOiBwcm90b1Byb3BzW3Byb3BdLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjbGFzc1Byb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gY2xhc3NQcm9wcykge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2NsYXNzTmFtZScpIHtcbiAgICAgICAgICAoMCwgX2RlZmluZVByb3BlcnR5LmRlZmF1bHQpKFBhcnNlVXNlciwgcHJvcCwge1xuICAgICAgICAgICAgdmFsdWU6IGNsYXNzUHJvcHNbcHJvcF0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFBhcnNlVXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gUGFyc2VVc2VyIHdpdGggYSB2YWxpZCBzZXNzaW9uLFxuICAgKiBlaXRoZXIgZnJvbSBtZW1vcnkgb3IgbG9jYWxTdG9yYWdlLCBpZiBuZWNlc3NhcnkuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gVGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gUGFyc2UuVXNlci5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCkge1xuICAgIGlmICghY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5jdXJyZW50VXNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiBQYXJzZVVzZXIgZnJvbSBhc3luY2hyb25vdXMgU3RvcmFnZS5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgY3VycmVudGx5XG4gICAqICAgbG9nZ2VkIGluIFBhcnNlIFVzZXJcbiAgICovXG4gIHN0YXRpYyBjdXJyZW50QXN5bmMoKSB7XG4gICAgaWYgKCFjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuY3VycmVudFVzZXJBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHVwIGEgbmV3IHVzZXIgd2l0aCBhIHVzZXJuYW1lIChvciBlbWFpbCkgYW5kIHBhc3N3b3JkLlxuICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IFBhcnNlLlVzZXIgb24gdGhlIHNlcnZlciwgYW5kIGFsc28gcGVyc2lzdCB0aGVcbiAgICogc2Vzc2lvbiBpbiBsb2NhbFN0b3JhZ2Ugc28gdGhhdCB5b3UgY2FuIGFjY2VzcyB0aGUgdXNlciB1c2luZ1xuICAgKiB7QGxpbmsgI2N1cnJlbnR9LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIChvciBlbWFpbCkgdG8gc2lnbiB1cCB3aXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIHNpZ24gdXAgd2l0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJzIEV4dHJhIGZpZWxkcyB0byBzZXQgb24gdGhlIG5ldyB1c2VyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgc2lnbnVwIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBzaWduVXAodXNlcm5hbWUsIHBhc3N3b3JkLCBhdHRycywgb3B0aW9ucykge1xuICAgIGF0dHJzID0gYXR0cnMgfHwge307XG4gICAgYXR0cnMudXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICBhdHRycy5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcyhhdHRycyk7XG4gICAgcmV0dXJuIHVzZXIuc2lnblVwKHt9LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB3aXRoIGEgdXNlcm5hbWUgKG9yIGVtYWlsKSBhbmQgcGFzc3dvcmQuIE9uIHN1Y2Nlc3MsIHRoaXNcbiAgICogc2F2ZXMgdGhlIHNlc3Npb24gdG8gZGlzaywgc28geW91IGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudGx5IGxvZ2dlZCBpblxuICAgKiB1c2VyIHVzaW5nIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIChvciBlbWFpbCkgdG8gbG9nIGluIHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gbG9nIGluIHdpdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIHdoZW5cbiAgICogICAgIHRoZSBsb2dpbiBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgbG9nSW4odXNlcm5hbWUsIHBhc3N3b3JkLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnVXNlcm5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ1Bhc3N3b3JkIG11c3QgYmUgYSBzdHJpbmcuJykpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICB1c2VyLl9maW5pc2hGZXRjaCh7XG4gICAgICB1c2VybmFtZTogdXNlcm5hbWUsXG4gICAgICBwYXNzd29yZDogcGFzc3dvcmRcbiAgICB9KTtcbiAgICByZXR1cm4gdXNlci5sb2dJbihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB3aXRoIGEgdXNlcm5hbWUgKG9yIGVtYWlsKSBhbmQgcGFzc3dvcmQsIGFuZCBhdXRoRGF0YS4gT24gc3VjY2VzcywgdGhpc1xuICAgKiBzYXZlcyB0aGUgc2Vzc2lvbiB0byBkaXNrLCBzbyB5b3UgY2FuIHJldHJpZXZlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluXG4gICAqIHVzZXIgdXNpbmcgPGNvZGU+Y3VycmVudDwvY29kZT4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgKG9yIGVtYWlsKSB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGF1dGhEYXRhIFRoZSBhdXRoRGF0YSB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBsb2dJbldpdGhBZGRpdGlvbmFsQXV0aCh1c2VybmFtZSwgcGFzc3dvcmQsIGF1dGhEYXRhLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnVXNlcm5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ1Bhc3N3b3JkIG11c3QgYmUgYSBzdHJpbmcuJykpO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGF1dGhEYXRhKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnQXV0aCBtdXN0IGJlIGFuIG9iamVjdC4nKSk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHVzZXIuX2ZpbmlzaEZldGNoKHtcbiAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgIGF1dGhEYXRhXG4gICAgfSk7XG4gICAgcmV0dXJuIHVzZXIubG9nSW4ob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBpbiBhIHVzZXIgd2l0aCBhbiBvYmplY3RJZC4gT24gc3VjY2VzcywgdGhpcyBzYXZlcyB0aGUgc2Vzc2lvblxuICAgKiB0byBkaXNrLCBzbyB5b3UgY2FuIHJldHJpZXZlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgdXNpbmdcbiAgICogPGNvZGU+Y3VycmVudDwvY29kZT4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySWQgVGhlIG9iamVjdElkIGZvciB0aGUgdXNlci5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBsb2dpbkFzKHVzZXJJZCkge1xuICAgIGlmICghdXNlcklkKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LlVTRVJOQU1FX01JU1NJTkcsICdDYW5ub3QgbG9nIGluIGFzIHVzZXIgd2l0aCBhbiBlbXB0eSB1c2VyIGlkJyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmxvZ2luQXModXNlciwgdXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB3aXRoIGEgc2Vzc2lvbiB0b2tlbi4gT24gc3VjY2VzcywgdGhpcyBzYXZlcyB0aGUgc2Vzc2lvblxuICAgKiB0byBkaXNrLCBzbyB5b3UgY2FuIHJldHJpZXZlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgdXNpbmdcbiAgICogPGNvZGU+Y3VycmVudDwvY29kZT4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uVG9rZW4gVGhlIHNlc3Npb25Ub2tlbiB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBiZWNvbWUoc2Vzc2lvblRva2VuLCBvcHRpb25zKSB7XG4gICAgaWYgKCFjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJdCBpcyBub3QgbWVtb3J5LXNhZmUgdG8gYmVjb21lIGEgdXNlciBpbiBhIHNlcnZlciBlbnZpcm9ubWVudCcpO1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBiZWNvbWVPcHRpb25zID0ge1xuICAgICAgc2Vzc2lvblRva2VuOiBzZXNzaW9uVG9rZW5cbiAgICB9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgYmVjb21lT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuYmVjb21lKHVzZXIsIGJlY29tZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHVzZXIgd2l0aCBhIHNlc3Npb24gdG9rZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uVG9rZW4gVGhlIHNlc3Npb25Ub2tlbiB0byBnZXQgdXNlciB3aXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciBpcyBmZXRjaGVkLlxuICAgKi9cbiAgc3RhdGljIG1lKHNlc3Npb25Ub2tlbikge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBtZU9wdGlvbnMgPSB7XG4gICAgICBzZXNzaW9uVG9rZW46IHNlc3Npb25Ub2tlblxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMudXNlTWFzdGVyS2V5KSB7XG4gICAgICBtZU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHJldHVybiBjb250cm9sbGVyLm1lKHVzZXIsIG1lT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBpbiBhIHVzZXIgd2l0aCBhIHNlc3Npb24gdG9rZW4uIE9uIHN1Y2Nlc3MsIHRoaXMgc2F2ZXMgdGhlIHNlc3Npb25cbiAgICogdG8gZGlzaywgc28geW91IGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIHVzaW5nXG4gICAqIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LiBJZiB0aGVyZSBpcyBubyBzZXNzaW9uIHRva2VuIHRoZSB1c2VyIHdpbGwgbm90IGxvZ2dlZCBpbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHVzZXJKU09OIFRoZSBKU09OIG1hcCBvZiB0aGUgVXNlcidzIGRhdGFcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBoeWRyYXRlKHVzZXJKU09OKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuaHlkcmF0ZSh1c2VyLCB1c2VySlNPTik7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIHZlcnNpb24gb2Yge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuVXNlci5odG1sI2xpbmtXaXRoIGxpbmtXaXRofVxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLmF1dGhEYXRhXVxuICAgKiBAcGFyYW0gc2F2ZU9wdHNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHN0YXRpYyBsb2dJbldpdGgocHJvdmlkZXIsIG9wdGlvbnMsIHNhdmVPcHRzKSB7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIHVzZXIubGlua1dpdGgocHJvdmlkZXIsIG9wdGlvbnMsIHNhdmVPcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIG91dCB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIHNlc3Npb24uIFRoaXMgd2lsbCByZW1vdmUgdGhlXG4gICAqIHNlc3Npb24gZnJvbSBkaXNrLCBsb2cgb3V0IG9mIGxpbmtlZCBzZXJ2aWNlcywgYW5kIGZ1dHVyZSBjYWxscyB0b1xuICAgKiA8Y29kZT5jdXJyZW50PC9jb2RlPiB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgc2Vzc2lvbiBpc1xuICAgKiAgIGRlc3Ryb3llZCBvbiB0aGUgc2VydmVyLlxuICAgKi9cbiAgc3RhdGljIGxvZ091dCgpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIubG9nT3V0KG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGEgcGFzc3dvcmQgcmVzZXQgZW1haWwgdG8gYmUgc2VudCB0byB0aGUgc3BlY2lmaWVkIGVtYWlsIGFkZHJlc3NcbiAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIGFjY291bnQuIFRoaXMgZW1haWwgYWxsb3dzIHRoZSB1c2VyIHRvIHNlY3VyZWx5XG4gICAqIHJlc2V0IHRoZWlyIHBhc3N3b3JkIG9uIHRoZSBQYXJzZSBzaXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW1haWwgVGhlIGVtYWlsIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRoYXRcbiAgICogICAgIGZvcmdvdCB0aGVpciBwYXNzd29yZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHN0YXRpYyByZXF1ZXN0UGFzc3dvcmRSZXNldChlbWFpbCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICByZXF1ZXN0T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIucmVxdWVzdFBhc3N3b3JkUmVzZXQoZW1haWwsIHJlcXVlc3RPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGFuIGVtYWlsIHZlcmlmaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsIFRoZSBlbWFpbCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0aGF0XG4gICAqICAgICBuZWVkcyB0byB2ZXJpZnkgdGhlaXIgZW1haWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBzdGF0aWMgcmVxdWVzdEVtYWlsVmVyaWZpY2F0aW9uKGVtYWlsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5yZXF1ZXN0RW1haWxWZXJpZmljYXRpb24oZW1haWwsIHJlcXVlc3RPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgd2hldGhlciBhIGdpdmVuIHBhc3N3b3JkIGlzIHRoZSBwYXNzd29yZCBvZiB0aGUgY3VycmVudCB1c2VyLlxuICAgKiBAc3RhdGljXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZSAgVGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHdob3NlIHBhc3N3b3JkIHNob3VsZCBiZSB2ZXJpZmllZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBiZSB2ZXJpZmllZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVGhlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaWdub3JlRW1haWxWZXJpZmljYXRpb25dIFNldCB0byBgdHJ1ZWAgdG8gYnlwYXNzIGVtYWlsIHZlcmlmaWNhdGlvbiBhbmQgdmVyaWZ5XG4gICAqIHRoZSBwYXNzd29yZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGVtYWlsIGhhcyBiZWVuIHZlcmlmaWVkLiBUaGlzIHJlcXVpcmVzIHRoZSBtYXN0ZXIga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSB1c2VyIHdoZW4gdGhlIHBhc3N3b3JkIGlzIGNvcnJlY3QuXG4gICAqL1xuICBzdGF0aWMgdmVyaWZ5UGFzc3dvcmQodXNlcm5hbWUsIHBhc3N3b3JkLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnVXNlcm5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ1Bhc3N3b3JkIG11c3QgYmUgYSBzdHJpbmcuJykpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci52ZXJpZnlQYXNzd29yZCh1c2VybmFtZSwgcGFzc3dvcmQsIG9wdGlvbnMgfHwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHNvbWVvbmUgdG8gZGVmaW5lIGEgY3VzdG9tIFVzZXIgY2xhc3Mgd2l0aG91dCBjbGFzc05hbWVcbiAgICogYmVpbmcgcmV3cml0dGVuIHRvIF9Vc2VyLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXdyaXRlXG4gICAqIFVzZXIgdG8gX1VzZXIgZm9yIGxlZ2FjeSByZWFzb25zLiBUaGlzIGFsbG93cyBkZXZlbG9wZXJzIHRvXG4gICAqIG92ZXJyaWRlIHRoYXQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNBbGxvd2VkIFdoZXRoZXIgb3Igbm90IHRvIGFsbG93IGN1c3RvbSBVc2VyIGNsYXNzXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBhbGxvd0N1c3RvbVVzZXJDbGFzcyhpc0FsbG93ZWQpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ1BFUkZPUk1fVVNFUl9SRVdSSVRFJywgIWlzQWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGEgbGVnYWN5IGFwcGxpY2F0aW9uIHRvIHN0YXJ0IHVzaW5nIHJldm9jYWJsZSBzZXNzaW9ucy4gSWYgdGhlXG4gICAqIGN1cnJlbnQgc2Vzc2lvbiB0b2tlbiBpcyBub3QgcmV2b2NhYmxlLCBhIHJlcXVlc3Qgd2lsbCBiZSBtYWRlIGZvciBhIG5ldyxcbiAgICogcmV2b2NhYmxlIHNlc3Npb24uXG4gICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGNsb3VkIGNvZGUgdW5sZXNzIHlvdSBhcmVcbiAgICogaGFuZGxpbmcgdXNlciBzaWdudXAgb3IgbG9naW4gZnJvbSB0aGUgc2VydmVyIHNpZGUuIEluIGEgY2xvdWQgY29kZSBjYWxsLFxuICAgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGF0dGVtcHQgdG8gdXBncmFkZSB0aGUgY3VycmVudCB0b2tlbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgcHJvY2VzcyBoYXNcbiAgICogICBjb21wbGV0ZWQuIElmIGEgcmVwbGFjZW1lbnQgc2Vzc2lvbiB0b2tlbiBpcyByZXF1ZXN0ZWQsIHRoZSBwcm9taXNlXG4gICAqICAgd2lsbCBiZSByZXNvbHZlZCBhZnRlciBhIG5ldyB0b2tlbiBoYXMgYmVlbiBmZXRjaGVkLlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZVJldm9jYWJsZVNlc3Npb24ob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnRk9SQ0VfUkVWT0NBQkxFX1NFU1NJT04nLCB0cnVlKTtcbiAgICBpZiAoY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBQYXJzZVVzZXIuY3VycmVudCgpO1xuICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQuX3VwZ3JhZGVUb1Jldm9jYWJsZVNlc3Npb24ob3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSB1c2Ugb2YgYmVjb21lIG9yIHRoZSBjdXJyZW50IHVzZXIgaW4gYSBzZXJ2ZXJcbiAgICogZW52aXJvbm1lbnQuIFRoZXNlIGZlYXR1cmVzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LCBzaW5jZSB0aGV5IGRlcGVuZCBvblxuICAgKiBnbG9iYWwgb2JqZWN0cyB0aGF0IGFyZSBub3QgbWVtb3J5LXNhZmUgZm9yIG1vc3Qgc2VydmVycy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGVuYWJsZVVuc2FmZUN1cnJlbnRVc2VyKCkge1xuICAgIGNhblVzZUN1cnJlbnRVc2VyID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgdXNlIG9mIGJlY29tZSBvciB0aGUgY3VycmVudCB1c2VyIGluIGFueSBlbnZpcm9ubWVudC5cbiAgICogVGhlc2UgZmVhdHVyZXMgYXJlIGRpc2FibGVkIG9uIHNlcnZlcnMgYnkgZGVmYXVsdCwgc2luY2UgdGhleSBkZXBlbmQgb25cbiAgICogZ2xvYmFsIG9iamVjdHMgdGhhdCBhcmUgbm90IG1lbW9yeS1zYWZlIGZvciBtb3N0IHNlcnZlcnMuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBkaXNhYmxlVW5zYWZlQ3VycmVudFVzZXIoKSB7XG4gICAgY2FuVXNlQ3VycmVudFVzZXIgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHJlZ2lzdGVyaW5nIHVzZXJzIHdpdGgge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuVXNlci5odG1sI2xpbmtXaXRoIGxpbmtXaXRofSBhIGJhc2ljIGF1dGggcHJvdmlkZXJcbiAgICogaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciB5b3UuXG4gICAqXG4gICAqIEZvciBhZHZhbmNlZCBhdXRoZW50aWNhdGlvbiwgeW91IGNhbiByZWdpc3RlciBhbiBBdXRoIHByb3ZpZGVyIHRvXG4gICAqIGltcGxlbWVudCBjdXN0b20gYXV0aGVudGljYXRpb24sIGRlYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlclxuICAgKiBAc2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL0F1dGhQcm92aWRlci5odG1sIEF1dGhQcm92aWRlcn1cbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL2pzL2d1aWRlLyNjdXN0b20tYXV0aGVudGljYXRpb24tbW9kdWxlIEN1c3RvbSBBdXRoZW50aWNhdGlvbiBNb2R1bGV9XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBfcmVnaXN0ZXJBdXRoZW50aWNhdGlvblByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgYXV0aFByb3ZpZGVyc1twcm92aWRlci5nZXRBdXRoVHlwZSgpXSA9IHByb3ZpZGVyO1xuICAgIC8vIFN5bmNocm9uaXplIHRoZSBjdXJyZW50IHVzZXIgd2l0aCB0aGUgYXV0aCBwcm92aWRlci5cbiAgICBQYXJzZVVzZXIuY3VycmVudEFzeW5jKCkudGhlbihjdXJyZW50ID0+IHtcbiAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnQuX3N5bmNocm9uaXplQXV0aERhdGEocHJvdmlkZXIuZ2V0QXV0aFR5cGUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHByb3ZpZGVyXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy5hdXRoRGF0YV1cbiAgICogQHBhcmFtIHNhdmVPcHRzXG4gICAqIEBkZXByZWNhdGVkIHNpbmNlIDIuOS4wIHNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5Vc2VyLmh0bWwjbG9nSW5XaXRoIGxvZ0luV2l0aH1cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHN0YXRpYyBfbG9nSW5XaXRoKHByb3ZpZGVyLCBvcHRpb25zLCBzYXZlT3B0cykge1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHJldHVybiB1c2VyLmxpbmtXaXRoKHByb3ZpZGVyLCBvcHRpb25zLCBzYXZlT3B0cyk7XG4gIH1cbiAgc3RhdGljIF9jbGVhckNhY2hlKCkge1xuICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSBudWxsO1xuICAgIGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzayA9IGZhbHNlO1xuICB9XG4gIHN0YXRpYyBfc2V0Q3VycmVudFVzZXJDYWNoZSh1c2VyKSB7XG4gICAgY3VycmVudFVzZXJDYWNoZSA9IHVzZXI7XG4gIH1cbn1cbl9QYXJzZU9iamVjdC5kZWZhdWx0LnJlZ2lzdGVyU3ViY2xhc3MoJ19Vc2VyJywgUGFyc2VVc2VyKTtcbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICB1cGRhdGVVc2VyT25EaXNrKHVzZXIpIHtcbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9VU0VSX0tFWSk7XG4gICAgY29uc3QganNvbiA9IHVzZXIudG9KU09OKCk7XG4gICAgZGVsZXRlIGpzb24ucGFzc3dvcmQ7XG4gICAganNvbi5jbGFzc05hbWUgPSAnX1VzZXInO1xuICAgIGxldCB1c2VyRGF0YSA9ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKGpzb24pO1xuICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9VU0VSJykpIHtcbiAgICAgIGNvbnN0IGNyeXB0byA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENyeXB0b0NvbnRyb2xsZXIoKTtcbiAgICAgIHVzZXJEYXRhID0gY3J5cHRvLmVuY3J5cHQoanNvbiwgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfS0VZJykpO1xuICAgIH1cbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMocGF0aCwgdXNlckRhdGEpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfSk7XG4gIH0sXG4gIHJlbW92ZVVzZXJGcm9tRGlzaygpIHtcbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9VU0VSX0tFWSk7XG4gICAgY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrID0gdHJ1ZTtcbiAgICBjdXJyZW50VXNlckNhY2hlID0gbnVsbDtcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5yZW1vdmVJdGVtQXN5bmMocGF0aCk7XG4gIH0sXG4gIHNldEN1cnJlbnRVc2VyKHVzZXIpIHtcbiAgICBjdXJyZW50VXNlckNhY2hlID0gdXNlcjtcbiAgICB1c2VyLl9jbGVhbnVwQXV0aERhdGEoKTtcbiAgICB1c2VyLl9zeW5jaHJvbml6ZUFsbEF1dGhEYXRhKCk7XG4gICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnVwZGF0ZVVzZXJPbkRpc2sodXNlcik7XG4gIH0sXG4gIGN1cnJlbnRVc2VyKCkge1xuICAgIGlmIChjdXJyZW50VXNlckNhY2hlKSB7XG4gICAgICByZXR1cm4gY3VycmVudFVzZXJDYWNoZTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzaykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChfU3RvcmFnZS5kZWZhdWx0LmFzeW5jKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNhbGwgY3VycmVudFVzZXIoKSB3aGVuIHVzaW5nIGEgcGxhdGZvcm0gd2l0aCBhbiBhc3luYyAnICsgJ3N0b3JhZ2Ugc3lzdGVtLiBDYWxsIGN1cnJlbnRVc2VyQXN5bmMoKSBpbnN0ZWFkLicpO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9VU0VSX0tFWSk7XG4gICAgbGV0IHVzZXJEYXRhID0gX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtKHBhdGgpO1xuICAgIGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzayA9IHRydWU7XG4gICAgaWYgKCF1c2VyRGF0YSkge1xuICAgICAgY3VycmVudFVzZXJDYWNoZSA9IG51bGw7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRU5DUllQVEVEX1VTRVInKSkge1xuICAgICAgY29uc3QgY3J5cHRvID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q3J5cHRvQ29udHJvbGxlcigpO1xuICAgICAgdXNlckRhdGEgPSBjcnlwdG8uZGVjcnlwdCh1c2VyRGF0YSwgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfS0VZJykpO1xuICAgIH1cbiAgICB1c2VyRGF0YSA9IEpTT04ucGFyc2UodXNlckRhdGEpO1xuICAgIGlmICghdXNlckRhdGEuY2xhc3NOYW1lKSB7XG4gICAgICB1c2VyRGF0YS5jbGFzc05hbWUgPSAnX1VzZXInO1xuICAgIH1cbiAgICBpZiAodXNlckRhdGEuX2lkKSB7XG4gICAgICBpZiAodXNlckRhdGEub2JqZWN0SWQgIT09IHVzZXJEYXRhLl9pZCkge1xuICAgICAgICB1c2VyRGF0YS5vYmplY3RJZCA9IHVzZXJEYXRhLl9pZDtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB1c2VyRGF0YS5faWQ7XG4gICAgfVxuICAgIGlmICh1c2VyRGF0YS5fc2Vzc2lvblRva2VuKSB7XG4gICAgICB1c2VyRGF0YS5zZXNzaW9uVG9rZW4gPSB1c2VyRGF0YS5fc2Vzc2lvblRva2VuO1xuICAgICAgZGVsZXRlIHVzZXJEYXRhLl9zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnQgPSBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTih1c2VyRGF0YSk7XG4gICAgY3VycmVudFVzZXJDYWNoZSA9IGN1cnJlbnQ7XG4gICAgY3VycmVudC5fc3luY2hyb25pemVBbGxBdXRoRGF0YSgpO1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9LFxuICBjdXJyZW50VXNlckFzeW5jKCkge1xuICAgIGlmIChjdXJyZW50VXNlckNhY2hlKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGN1cnJlbnRVc2VyQ2FjaGUpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9VU0VSX0tFWSk7XG4gICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKHBhdGgpLnRoZW4odXNlckRhdGEgPT4ge1xuICAgICAgY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrID0gdHJ1ZTtcbiAgICAgIGlmICghdXNlckRhdGEpIHtcbiAgICAgICAgY3VycmVudFVzZXJDYWNoZSA9IG51bGw7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUobnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfVVNFUicpKSB7XG4gICAgICAgIGNvbnN0IGNyeXB0byA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENyeXB0b0NvbnRyb2xsZXIoKTtcbiAgICAgICAgdXNlckRhdGEgPSBjcnlwdG8uZGVjcnlwdCh1c2VyRGF0YS50b1N0cmluZygpLCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9LRVknKSk7XG4gICAgICB9XG4gICAgICB1c2VyRGF0YSA9IEpTT04ucGFyc2UodXNlckRhdGEpO1xuICAgICAgaWYgKCF1c2VyRGF0YS5jbGFzc05hbWUpIHtcbiAgICAgICAgdXNlckRhdGEuY2xhc3NOYW1lID0gJ19Vc2VyJztcbiAgICAgIH1cbiAgICAgIGlmICh1c2VyRGF0YS5faWQpIHtcbiAgICAgICAgaWYgKHVzZXJEYXRhLm9iamVjdElkICE9PSB1c2VyRGF0YS5faWQpIHtcbiAgICAgICAgICB1c2VyRGF0YS5vYmplY3RJZCA9IHVzZXJEYXRhLl9pZDtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdXNlckRhdGEuX2lkO1xuICAgICAgfVxuICAgICAgaWYgKHVzZXJEYXRhLl9zZXNzaW9uVG9rZW4pIHtcbiAgICAgICAgdXNlckRhdGEuc2Vzc2lvblRva2VuID0gdXNlckRhdGEuX3Nlc3Npb25Ub2tlbjtcbiAgICAgICAgZGVsZXRlIHVzZXJEYXRhLl9zZXNzaW9uVG9rZW47XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50ID0gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04odXNlckRhdGEpO1xuICAgICAgY3VycmVudFVzZXJDYWNoZSA9IGN1cnJlbnQ7XG4gICAgICBjdXJyZW50Ll9zeW5jaHJvbml6ZUFsbEF1dGhEYXRhKCk7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGN1cnJlbnQpO1xuICAgIH0pO1xuICB9LFxuICBzaWduVXAodXNlciwgYXR0cnMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IGF0dHJzICYmIGF0dHJzLnVzZXJuYW1lIHx8IHVzZXIuZ2V0KCd1c2VybmFtZScpO1xuICAgIGNvbnN0IHBhc3N3b3JkID0gYXR0cnMgJiYgYXR0cnMucGFzc3dvcmQgfHwgdXNlci5nZXQoJ3Bhc3N3b3JkJyk7XG4gICAgaWYgKCF1c2VybmFtZSB8fCAhdXNlcm5hbWUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ0Nhbm5vdCBzaWduIHVwIHVzZXIgd2l0aCBhbiBlbXB0eSB1c2VybmFtZS4nKSk7XG4gICAgfVxuICAgIGlmICghcGFzc3dvcmQgfHwgIXBhc3N3b3JkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdDYW5ub3Qgc2lnbiB1cCB1c2VyIHdpdGggYW4gZW1wdHkgcGFzc3dvcmQuJykpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlci5zYXZlKGF0dHJzLCBvcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgIC8vIENsZWFyIHRoZSBwYXNzd29yZCBmaWVsZFxuICAgICAgdXNlci5fZmluaXNoRmV0Y2goe1xuICAgICAgICBwYXNzd29yZDogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIGlmIChjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9KTtcbiAgfSxcbiAgbG9nSW4odXNlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBhdXRoID0ge1xuICAgICAgdXNlcm5hbWU6IHVzZXIuZ2V0KCd1c2VybmFtZScpLFxuICAgICAgcGFzc3dvcmQ6IHVzZXIuZ2V0KCdwYXNzd29yZCcpLFxuICAgICAgYXV0aERhdGE6IHVzZXIuZ2V0KCdhdXRoRGF0YScpXG4gICAgfTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdChvcHRpb25zLnVzZVBvc3QgPyAnUE9TVCcgOiAnR0VUJywgJ2xvZ2luJywgYXV0aCwgb3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICB1c2VyLl9taWdyYXRlSWQocmVzcG9uc2Uub2JqZWN0SWQpO1xuICAgICAgdXNlci5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICAgIHN0YXRlQ29udHJvbGxlci5zZXRQZW5kaW5nT3AodXNlci5fZ2V0U3RhdGVJZGVudGlmaWVyKCksICd1c2VybmFtZScsIHVuZGVmaW5lZCk7XG4gICAgICBzdGF0ZUNvbnRyb2xsZXIuc2V0UGVuZGluZ09wKHVzZXIuX2dldFN0YXRlSWRlbnRpZmllcigpLCAncGFzc3dvcmQnLCB1bmRlZmluZWQpO1xuICAgICAgcmVzcG9uc2UucGFzc3dvcmQgPSB1bmRlZmluZWQ7XG4gICAgICB1c2VyLl9maW5pc2hGZXRjaChyZXNwb25zZSk7XG4gICAgICBpZiAoIWNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICAgIC8vIFdlIGNhbid0IHNldCB0aGUgY3VycmVudCB1c2VyLCBzbyBqdXN0IHJldHVybiB0aGUgb25lIHdlIGxvZ2dlZCBpblxuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVzZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH0pO1xuICB9LFxuICBsb2dpbkFzKHVzZXIsIHVzZXJJZCkge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdsb2dpbkFzJywge1xuICAgICAgdXNlcklkXG4gICAgfSwge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICB1c2VyLl9maW5pc2hGZXRjaChyZXNwb25zZSk7XG4gICAgICB1c2VyLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgICAgaWYgKCFjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVzZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH0pO1xuICB9LFxuICBiZWNvbWUodXNlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ3VzZXJzL21lJywge30sIG9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgdXNlci5fZmluaXNoRmV0Y2gocmVzcG9uc2UpO1xuICAgICAgdXNlci5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgICB9KTtcbiAgfSxcbiAgaHlkcmF0ZSh1c2VyLCB1c2VySlNPTikge1xuICAgIHVzZXIuX2ZpbmlzaEZldGNoKHVzZXJKU09OKTtcbiAgICB1c2VyLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgIGlmICh1c2VySlNPTi5zZXNzaW9uVG9rZW4gJiYgY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh1c2VyKTtcbiAgICB9XG4gIH0sXG4gIG1lKHVzZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICd1c2Vycy9tZScsIHt9LCBvcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIHVzZXIuX2ZpbmlzaEZldGNoKHJlc3BvbnNlKTtcbiAgICAgIHVzZXIuX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9KTtcbiAgfSxcbiAgbG9nT3V0KG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgaWYgKG9wdGlvbnMuc2Vzc2lvblRva2VuKSB7XG4gICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdsb2dvdXQnLCB7fSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5jdXJyZW50VXNlckFzeW5jKCkudGhlbihjdXJyZW50VXNlciA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9VU0VSX0tFWSk7XG4gICAgICBsZXQgcHJvbWlzZSA9IF9TdG9yYWdlLmRlZmF1bHQucmVtb3ZlSXRlbUFzeW5jKHBhdGgpO1xuICAgICAgaWYgKGN1cnJlbnRVc2VyICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZXNzaW9uID0gY3VycmVudFVzZXIuZ2V0U2Vzc2lvblRva2VuKCk7XG4gICAgICAgIGlmIChjdXJyZW50U2Vzc2lvbiAmJiAoMCwgX2lzUmV2b2NhYmxlU2Vzc2lvbi5kZWZhdWx0KShjdXJyZW50U2Vzc2lvbikpIHtcbiAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2xvZ291dCcsIHt9LCB7XG4gICAgICAgICAgICAgIHNlc3Npb25Ub2tlbjogY3VycmVudFNlc3Npb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRVc2VyLl9sb2dPdXRXaXRoQWxsKCk7XG4gICAgICAgIGN1cnJlbnRVc2VyLl9maW5pc2hGZXRjaCh7XG4gICAgICAgICAgc2Vzc2lvblRva2VuOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2sgPSB0cnVlO1xuICAgICAgY3VycmVudFVzZXJDYWNoZSA9IG51bGw7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9KTtcbiAgfSxcbiAgcmVxdWVzdFBhc3N3b3JkUmVzZXQoZW1haWwsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAncmVxdWVzdFBhc3N3b3JkUmVzZXQnLCB7XG4gICAgICBlbWFpbDogZW1haWxcbiAgICB9LCBvcHRpb25zKTtcbiAgfSxcbiAgYXN5bmMgdXBncmFkZVRvUmV2b2NhYmxlU2Vzc2lvbih1c2VyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdG9rZW4gPSB1c2VyLmdldFNlc3Npb25Ub2tlbigpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LlNFU1NJT05fTUlTU0lORywgJ0Nhbm5vdCB1cGdyYWRlIGEgdXNlciB3aXRoIG5vIHNlc3Npb24gdG9rZW4nKSk7XG4gICAgfVxuICAgIG9wdGlvbnMuc2Vzc2lvblRva2VuID0gdG9rZW47XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAndXBncmFkZVRvUmV2b2NhYmxlU2Vzc2lvbicsIHt9LCBvcHRpb25zKTtcbiAgICB1c2VyLl9maW5pc2hGZXRjaCh7XG4gICAgICBzZXNzaW9uVG9rZW46IHJlc3VsdD8uc2Vzc2lvblRva2VuIHx8ICcnXG4gICAgfSk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHVzZXIuaXNDdXJyZW50QXN5bmMoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVzZXIpO1xuICB9LFxuICBsaW5rV2l0aCh1c2VyLCBhdXRoRGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiB1c2VyLnNhdmUoe1xuICAgICAgYXV0aERhdGFcbiAgICB9LCBvcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgIGlmIChjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9KTtcbiAgfSxcbiAgdmVyaWZ5UGFzc3dvcmQodXNlcm5hbWUsIHBhc3N3b3JkLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgLi4uKG9wdGlvbnMuaWdub3JlRW1haWxWZXJpZmljYXRpb24gIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGlnbm9yZUVtYWlsVmVyaWZpY2F0aW9uOiBvcHRpb25zLmlnbm9yZUVtYWlsVmVyaWZpY2F0aW9uXG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICd2ZXJpZnlQYXNzd29yZCcsIGRhdGEsIG9wdGlvbnMpO1xuICB9LFxuICByZXF1ZXN0RW1haWxWZXJpZmljYXRpb24oZW1haWwsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAndmVyaWZpY2F0aW9uRW1haWxSZXF1ZXN0Jywge1xuICAgICAgZW1haWw6IGVtYWlsXG4gICAgfSwgb3B0aW9ucyk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQYXJzZVVzZXIoUGFyc2VVc2VyKTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFVzZXJDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlVXNlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRQdXNoU3RhdHVzID0gZ2V0UHVzaFN0YXR1cztcbmV4cG9ydHMuc2VuZCA9IHNlbmQ7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlUXVlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUXVlcnlcIikpO1xuLyoqXG4gKiBDb250YWlucyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIFB1c2ggaW4gUGFyc2UuXG4gKlxuICogQGNsYXNzIFBhcnNlLlB1c2hcbiAqIEBzdGF0aWNcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqL1xuXG4vKipcbiAqIFNlbmRzIGEgcHVzaCBub3RpZmljYXRpb24uXG4gKiAqKkF2YWlsYWJsZSBpbiBDbG91ZCBDb2RlIG9ubHkuKipcbiAqXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9qcy9ndWlkZS8jcHVzaC1ub3RpZmljYXRpb25zIFB1c2ggTm90aWZpY2F0aW9uIEd1aWRlfVxuICpcbiAqIEBmdW5jdGlvbiBzZW5kXG4gKiBAbmFtZSBQYXJzZS5QdXNoLnNlbmRcbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gIFRoZSBkYXRhIG9mIHRoZSBwdXNoIG5vdGlmaWNhdGlvbi4gVmFsaWQgZmllbGRzXG4gKiBhcmU6XG4gKiAgIDxvbD5cbiAqICAgICA8bGk+Y2hhbm5lbHMgLSBBbiBBcnJheSBvZiBjaGFubmVscyB0byBwdXNoIHRvLjwvbGk+XG4gKiAgICAgPGxpPnB1c2hfdGltZSAtIEEgRGF0ZSBvYmplY3QgZm9yIHdoZW4gdG8gc2VuZCB0aGUgcHVzaC48L2xpPlxuICogICAgIDxsaT5leHBpcmF0aW9uX3RpbWUgLSAgQSBEYXRlIG9iamVjdCBmb3Igd2hlbiB0byBleHBpcmVcbiAqICAgICAgICAgdGhlIHB1c2guPC9saT5cbiAqICAgICA8bGk+ZXhwaXJhdGlvbl9pbnRlcnZhbCAtIFRoZSBzZWNvbmRzIGZyb20gbm93IHRvIGV4cGlyZSB0aGUgcHVzaC48L2xpPlxuICogICAgIDxsaT53aGVyZSAtIEEgUGFyc2UuUXVlcnkgb3ZlciBQYXJzZS5JbnN0YWxsYXRpb24gdGhhdCBpcyB1c2VkIHRvIG1hdGNoXG4gKiAgICAgICAgIGEgc2V0IG9mIGluc3RhbGxhdGlvbnMgdG8gcHVzaCB0by48L2xpPlxuICogICAgIDxsaT5kYXRhIC0gVGhlIGRhdGEgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSBwdXNoLjwvbGk+XG4gKiAgIDxvbD5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnNcbiAqIGFyZTo8dWw+XG4gKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICogPC91bD5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgcHVzaCByZXF1ZXN0XG4gKiAgICAgY29tcGxldGVzIGFuZCByZXR1cm5zIGBwdXNoU3RhdHVzSWRgLlxuICovXG5mdW5jdGlvbiBzZW5kKGRhdGEpIHtcbiAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICBpZiAoZGF0YS53aGVyZSAmJiBkYXRhLndoZXJlIGluc3RhbmNlb2YgX1BhcnNlUXVlcnkuZGVmYXVsdCkge1xuICAgIGRhdGEud2hlcmUgPSBkYXRhLndoZXJlLnRvSlNPTigpLndoZXJlO1xuICB9XG4gIGlmIChkYXRhLnB1c2hfdGltZSAmJiB0eXBlb2YgZGF0YS5wdXNoX3RpbWUgPT09ICdvYmplY3QnKSB7XG4gICAgZGF0YS5wdXNoX3RpbWUgPSBkYXRhLnB1c2hfdGltZS50b0pTT04oKTtcbiAgfVxuICBpZiAoZGF0YS5leHBpcmF0aW9uX3RpbWUgJiYgdHlwZW9mIGRhdGEuZXhwaXJhdGlvbl90aW1lID09PSAnb2JqZWN0Jykge1xuICAgIGRhdGEuZXhwaXJhdGlvbl90aW1lID0gZGF0YS5leHBpcmF0aW9uX3RpbWUudG9KU09OKCk7XG4gIH1cbiAgaWYgKGRhdGEuZXhwaXJhdGlvbl90aW1lICYmIGRhdGEuZXhwaXJhdGlvbl9pbnRlcnZhbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwaXJhdGlvbl90aW1lIGFuZCBleHBpcmF0aW9uX2ludGVydmFsIGNhbm5vdCBib3RoIGJlIHNldC4nKTtcbiAgfVxuICBjb25zdCBwdXNoT3B0aW9ucyA9IHtcbiAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgfTtcbiAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgcHVzaE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gIH1cbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFB1c2hDb250cm9sbGVyKCkuc2VuZChkYXRhLCBwdXNoT3B0aW9ucyk7XG59XG5cbi8qKlxuICogR2V0cyBwdXNoIHN0YXR1cyBieSBJZFxuICpcbiAqIEBmdW5jdGlvbiBnZXRQdXNoU3RhdHVzXG4gKiBAbmFtZSBQYXJzZS5QdXNoLmdldFB1c2hTdGF0dXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwdXNoU3RhdHVzSWQgVGhlIElkIG9mIFB1c2ggU3RhdHVzLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9uc1xuICogYXJlOjx1bD5cbiAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gKiA8L3VsPlxuICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gU3RhdHVzIG9mIFB1c2guXG4gKi9cbmZ1bmN0aW9uIGdldFB1c2hTdGF0dXMocHVzaFN0YXR1c0lkKSB7XG4gIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgY29uc3QgcHVzaE9wdGlvbnMgPSB7XG4gICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gIH07XG4gIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgIHB1c2hPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICB9XG4gIGNvbnN0IHF1ZXJ5ID0gbmV3IF9QYXJzZVF1ZXJ5LmRlZmF1bHQoJ19QdXNoU3RhdHVzJyk7XG4gIHJldHVybiBxdWVyeS5nZXQocHVzaFN0YXR1c0lkLCBwdXNoT3B0aW9ucyk7XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgYXN5bmMgc2VuZChkYXRhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5yZXR1cm5TdGF0dXMgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5yZXF1ZXN0KCdQT1NUJywgJ3B1c2gnLCBkYXRhLCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuX2hlYWRlcnM/LlsnWC1QYXJzZS1QdXNoLVN0YXR1cy1JZCddO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UHVzaENvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfaW5jbHVkZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX3NldFRpbWVvdXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXQtdGltZW91dFwiKSk7XG52YXIgX3V1aWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V1aWRcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfcHJvbWlzZVV0aWxzID0gcmVxdWlyZShcIi4vcHJvbWlzZVV0aWxzXCIpO1xudmFyIF9YaHIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1hoci53ZWFwcFwiKSk7XG4vKiBnbG9iYWwgWE1MSHR0cFJlcXVlc3QsIFhEb21haW5SZXF1ZXN0ICovXG5cbmxldCBYSFIgPSBudWxsO1xuaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgWEhSID0gWE1MSHR0cFJlcXVlc3Q7XG59XG5sZXQgdXNlWERvbWFpblJlcXVlc3QgPSBmYWxzZTtcbi8vIEB0cy1pZ25vcmVcbmlmICh0eXBlb2YgWERvbWFpblJlcXVlc3QgIT09ICd1bmRlZmluZWQnICYmICEoJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IFhNTEh0dHBSZXF1ZXN0KCkpKSB7XG4gIHVzZVhEb21haW5SZXF1ZXN0ID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGFqYXhJRTkobWV0aG9kLCB1cmwsIGRhdGEsIGhlYWRlcnMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgeGRyID0gbmV3IFhEb21haW5SZXF1ZXN0KCk7XG4gICAgeGRyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCByZXNwb25zZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZSh4ZHIucmVzcG9uc2VUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgeGRyLm9uZXJyb3IgPSB4ZHIub250aW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gTGV0J3MgZmFrZSBhIHJlYWwgZXJyb3IgbWVzc2FnZS5cbiAgICAgIGNvbnN0IGZha2VSZXNwb25zZSA9IHtcbiAgICAgICAgcmVzcG9uc2VUZXh0OiAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KSh7XG4gICAgICAgICAgY29kZTogX1BhcnNlRXJyb3IuZGVmYXVsdC5YX0RPTUFJTl9SRVFVRVNULFxuICAgICAgICAgIGVycm9yOiBcIklFJ3MgWERvbWFpblJlcXVlc3QgZG9lcyBub3Qgc3VwcGx5IGVycm9yIGluZm8uXCJcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgICByZWplY3QoZmFrZVJlc3BvbnNlKTtcbiAgICB9O1xuICAgIHhkci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3B0aW9ucy5wcm9ncmVzcyh4ZHIucmVzcG9uc2VUZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHhkci5vcGVuKG1ldGhvZCwgdXJsKTtcbiAgICB4ZHIuc2VuZChkYXRhKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucmVxdWVzdFRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG9wdGlvbnMucmVxdWVzdFRhc2soeGRyKTtcbiAgICB9XG4gIH0pO1xufVxuY29uc3QgUkVTVENvbnRyb2xsZXIgPSB7XG4gIGFqYXgobWV0aG9kLCB1cmwsIGRhdGEsIGhlYWRlcnMsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2NvbnRleHQ7XG4gICAgaWYgKHVzZVhEb21haW5SZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gYWpheElFOShtZXRob2QsIHVybCwgZGF0YSwgaGVhZGVycywgb3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgIGNvbnN0IGlzSWRlbXBvdGVudCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSURFTVBPVEVOQ1knKSAmJiAoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKF9jb250ZXh0ID0gWydQT1NUJywgJ1BVVCddKS5jYWxsKF9jb250ZXh0LCBtZXRob2QpO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IGlzSWRlbXBvdGVudCA/ICgwLCBfdXVpZC5kZWZhdWx0KSgpIDogJyc7XG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBjb25zdCBkaXNwYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChYSFIgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtYWtlIGEgcmVxdWVzdDogTm8gZGVmaW5pdGlvbiBvZiBYTUxIdHRwUmVxdWVzdCB3YXMgZm91bmQuJyk7XG4gICAgICB9XG4gICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgeGhyID0gbmV3IFhIUigpO1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSA0IHx8IGhhbmRsZWQgfHwgeGhyLl9hYm9ydGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlSGVhZGVycyA9IHR5cGVvZiB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzID09PSAnZnVuY3Rpb24nID8geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIDogJyc7XG4gICAgICAgICAgICBoZWFkZXJzID0ge307XG4gICAgICAgICAgICBpZiAodHlwZW9mIHhoci5nZXRSZXNwb25zZUhlYWRlciA9PT0gJ2Z1bmN0aW9uJyAmJiBhdmFpbGFibGVIZWFkZXJzPy5pbmRleE9mKCdhY2Nlc3MtY29udHJvbC1leHBvc2UtaGVhZGVycycpID49IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdhY2Nlc3MtY29udHJvbC1leHBvc2UtaGVhZGVycycpLnNwbGl0KCcsICcpO1xuICAgICAgICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocmVzcG9uc2VIZWFkZXJzKS5jYWxsKHJlc3BvbnNlSGVhZGVycywgaGVhZGVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKGF2YWlsYWJsZUhlYWRlcnMpLmNhbGwoYXZhaWxhYmxlSGVhZGVycywgaGVhZGVyLnRvTG93ZXJDYXNlKCkpID49IDApIHtcbiAgICAgICAgICAgICAgICAgIGhlYWRlcnNbaGVhZGVyXSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdChlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICBzdGF0dXM6IHhoci5zdGF0dXMsXG4gICAgICAgICAgICAgIHhoclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHhoci5zdGF0dXMgPj0gNTAwIHx8IHhoci5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgICAvLyByZXRyeSBvbiA1WFggb3Igbm9kZS14bWxodHRwcmVxdWVzdCBlcnJvclxuICAgICAgICAgIGlmICgrK2F0dGVtcHRzIDwgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdSRVFVRVNUX0FUVEVNUFRfTElNSVQnKSkge1xuICAgICAgICAgICAgLy8gRXhwb25lbnRpYWxseS1ncm93aW5nIHJhbmRvbSBkZWxheVxuICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxMjUgKiBNYXRoLnBvdygyLCBhdHRlbXB0cykpO1xuICAgICAgICAgICAgKDAsIF9zZXRUaW1lb3V0Mi5kZWZhdWx0KShkaXNwYXRjaCwgZGVsYXkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeGhyLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoJ1VuYWJsZSB0byBjb25uZWN0IHRvIHRoZSBQYXJzZSBBUEknKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlIHJldHJ5IGxpbWl0IGlzIHJlYWNoZWQsIGZhaWxcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KHhocik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb21pc2UucmVqZWN0KHhocik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBoZWFkZXJzID0gaGVhZGVycyB8fCB7fTtcbiAgICAgIGlmICh0eXBlb2YgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW4nOyAvLyBBdm9pZCBwcmUtZmxpZ2h0XG4gICAgICB9XG4gICAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJU19OT0RFJykpIHtcbiAgICAgICAgaGVhZGVyc1snVXNlci1BZ2VudCddID0gJ1BhcnNlLycgKyBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1ZFUlNJT04nKSArICcgKE5vZGVKUyAnICsgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlICsgJyknO1xuICAgICAgfVxuICAgICAgaWYgKGlzSWRlbXBvdGVudCkge1xuICAgICAgICBoZWFkZXJzWydYLVBhcnNlLVJlcXVlc3QtSWQnXSA9IHJlcXVlc3RJZDtcbiAgICAgIH1cbiAgICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RZUEUnKSAmJiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RPS0VOJykpIHtcbiAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfQVVUSF9UWVBFJykgKyAnICcgKyBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RPS0VOJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXN0b21IZWFkZXJzID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdSRVFVRVNUX0hFQURFUlMnKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGN1c3RvbUhlYWRlcnMpIHtcbiAgICAgICAgaGVhZGVyc1trZXldID0gY3VzdG9tSGVhZGVyc1trZXldO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlUHJvZ3Jlc3MgPSBmdW5jdGlvbiAodHlwZSwgZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5wcm9ncmVzcyhldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCwgZXZlbnQubG9hZGVkLCBldmVudC50b3RhbCwge1xuICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucy5wcm9ncmVzcyhudWxsLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSBldmVudCA9PiB7XG4gICAgICAgICAgaGFuZGxlUHJvZ3Jlc3MoJ2Rvd25sb2FkJywgZXZlbnQpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoeGhyLnVwbG9hZCkge1xuICAgICAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGhhbmRsZVByb2dyZXNzKCd1cGxvYWQnLCBldmVudCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgeGhyLm9wZW4obWV0aG9kLCB1cmwsIHRydWUpO1xuICAgICAgZm9yIChjb25zdCBoIGluIGhlYWRlcnMpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaCwgaGVhZGVyc1toXSk7XG4gICAgICB9XG4gICAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgcmVzdWx0czogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgICB4aHJcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgeGhyLnNlbmQoZGF0YSk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZXF1ZXN0VGFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG9wdGlvbnMucmVxdWVzdFRhc2soeGhyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGRpc3BhdGNoKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH0sXG4gIHJlcXVlc3QobWV0aG9kLCBwYXRoLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgbGV0IHVybCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX1VSTCcpO1xuICAgIGlmICh1cmxbdXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcbiAgICAgIHVybCArPSAnLyc7XG4gICAgfVxuICAgIHVybCArPSBwYXRoO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7fTtcbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAoY29uc3QgayBpbiBkYXRhKSB7XG4gICAgICAgIHBheWxvYWRba10gPSBkYXRhW2tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBjb250ZXh0XG4gICAgY29uc3QgY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICBpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICB9XG4gICAgaWYgKG1ldGhvZCAhPT0gJ1BPU1QnKSB7XG4gICAgICBwYXlsb2FkLl9tZXRob2QgPSBtZXRob2Q7XG4gICAgICBtZXRob2QgPSAnUE9TVCc7XG4gICAgfVxuICAgIHBheWxvYWQuX0FwcGxpY2F0aW9uSWQgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FQUExJQ0FUSU9OX0lEJyk7XG4gICAgY29uc3QganNLZXkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0pBVkFTQ1JJUFRfS0VZJyk7XG4gICAgaWYgKGpzS2V5KSB7XG4gICAgICBwYXlsb2FkLl9KYXZhU2NyaXB0S2V5ID0ganNLZXk7XG4gICAgfVxuICAgIHBheWxvYWQuX0NsaWVudFZlcnNpb24gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1ZFUlNJT04nKTtcbiAgICBsZXQgdXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgaWYgKHR5cGVvZiB1c2VNYXN0ZXJLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB1c2VNYXN0ZXJLZXkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1VTRV9NQVNURVJfS0VZJyk7XG4gICAgfVxuICAgIGlmICh1c2VNYXN0ZXJLZXkpIHtcbiAgICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ01BU1RFUl9LRVknKSkge1xuICAgICAgICBkZWxldGUgcGF5bG9hZC5fSmF2YVNjcmlwdEtleTtcbiAgICAgICAgcGF5bG9hZC5fTWFzdGVyS2V5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdNQVNURVJfS0VZJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgdGhlIE1hc3RlciBLZXksIGl0IGhhcyBub3QgYmVlbiBwcm92aWRlZC4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRk9SQ0VfUkVWT0NBQkxFX1NFU1NJT04nKSkge1xuICAgICAgcGF5bG9hZC5fUmV2b2NhYmxlU2Vzc2lvbiA9ICcxJztcbiAgICB9XG4gICAgY29uc3QgaW5zdGFsbGF0aW9uSWQgPSBvcHRpb25zLmluc3RhbGxhdGlvbklkO1xuICAgIGxldCBpbnN0YWxsYXRpb25JZFByb21pc2U7XG4gICAgaWYgKGluc3RhbGxhdGlvbklkICYmIHR5cGVvZiBpbnN0YWxsYXRpb25JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGluc3RhbGxhdGlvbklkUHJvbWlzZSA9IF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShpbnN0YWxsYXRpb25JZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluc3RhbGxhdGlvbkNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCk7XG4gICAgICBpbnN0YWxsYXRpb25JZFByb21pc2UgPSBpbnN0YWxsYXRpb25Db250cm9sbGVyLmN1cnJlbnRJbnN0YWxsYXRpb25JZCgpO1xuICAgIH1cbiAgICByZXR1cm4gaW5zdGFsbGF0aW9uSWRQcm9taXNlLnRoZW4oaWlkID0+IHtcbiAgICAgIHBheWxvYWQuX0luc3RhbGxhdGlvbklkID0gaWlkO1xuICAgICAgY29uc3QgdXNlckNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuc2Vzc2lvblRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKG9wdGlvbnMuc2Vzc2lvblRva2VuKTtcbiAgICAgIH0gZWxzZSBpZiAodXNlckNvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIHVzZXJDb250cm9sbGVyLmN1cnJlbnRVc2VyQXN5bmMoKS50aGVuKHVzZXIgPT4ge1xuICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVzZXIuZ2V0U2Vzc2lvblRva2VuKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUobnVsbCk7XG4gICAgfSkudGhlbih0b2tlbiA9PiB7XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgcGF5bG9hZC5fU2Vzc2lvblRva2VuID0gdG9rZW47XG4gICAgICB9XG4gICAgICBjb25zdCBwYXlsb2FkU3RyaW5nID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkocGF5bG9hZCk7XG4gICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIuYWpheChtZXRob2QsIHVybCwgcGF5bG9hZFN0cmluZywge30sIG9wdGlvbnMpLnRoZW4oX3JlZiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgeGhyXG4gICAgICAgIH0gPSBfcmVmO1xuICAgICAgICBpZiAob3B0aW9ucy5yZXR1cm5TdGF0dXMpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgICAgICBfc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgICBfaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIF94aHI6IHhoclxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KS5jYXRjaChSRVNUQ29udHJvbGxlci5oYW5kbGVFcnJvcik7XG4gIH0sXG4gIGhhbmRsZUVycm9yKHJlc3BvbnNlKSB7XG4gICAgLy8gVHJhbnNmb3JtIHRoZSBlcnJvciBpbnRvIGFuIGluc3RhbmNlIG9mIFBhcnNlRXJyb3IgYnkgdHJ5aW5nIHRvIHBhcnNlXG4gICAgLy8gdGhlIGVycm9yIHN0cmluZyBhcyBKU09OXG4gICAgbGV0IGVycm9yO1xuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXNwb25zZVRleHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVycm9ySlNPTiA9IEpTT04ucGFyc2UocmVzcG9uc2UucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChlcnJvckpTT04uY29kZSwgZXJyb3JKU09OLmVycm9yKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgd2UgZmFpbCB0byBwYXJzZSB0aGUgZXJyb3IgdGV4dCwgdGhhdCdzIG9rYXkuXG4gICAgICAgIGVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0pTT04sICdSZWNlaXZlZCBhbiBlcnJvciB3aXRoIGludmFsaWQgSlNPTiBmcm9tIFBhcnNlOiAnICsgcmVzcG9uc2UucmVzcG9uc2VUZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2UgPyByZXNwb25zZS5tZXNzYWdlIDogcmVzcG9uc2U7XG4gICAgICBlcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuQ09OTkVDVElPTl9GQUlMRUQsICdYTUxIdHRwUmVxdWVzdCBmYWlsZWQ6ICcgKyAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShtZXNzYWdlKSk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvcik7XG4gIH0sXG4gIF9zZXRYSFIoeGhyKSB7XG4gICAgWEhSID0geGhyO1xuICB9LFxuICBfZ2V0WEhSKCkge1xuICAgIHJldHVybiBYSFI7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFJFU1RDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUkVTVENvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfV2Vha01hcCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3dlYWstbWFwXCIpO1xudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jbGVhckFsbFN0YXRlID0gY2xlYXJBbGxTdGF0ZTtcbmV4cG9ydHMuY29tbWl0U2VydmVyQ2hhbmdlcyA9IGNvbW1pdFNlcnZlckNoYW5nZXM7XG5leHBvcnRzLmR1cGxpY2F0ZVN0YXRlID0gZHVwbGljYXRlU3RhdGU7XG5leHBvcnRzLmVucXVldWVUYXNrID0gZW5xdWV1ZVRhc2s7XG5leHBvcnRzLmVzdGltYXRlQXR0cmlidXRlID0gZXN0aW1hdGVBdHRyaWJ1dGU7XG5leHBvcnRzLmVzdGltYXRlQXR0cmlidXRlcyA9IGVzdGltYXRlQXR0cmlidXRlcztcbmV4cG9ydHMuZ2V0T2JqZWN0Q2FjaGUgPSBnZXRPYmplY3RDYWNoZTtcbmV4cG9ydHMuZ2V0UGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHM7XG5leHBvcnRzLmdldFNlcnZlckRhdGEgPSBnZXRTZXJ2ZXJEYXRhO1xuZXhwb3J0cy5nZXRTdGF0ZSA9IGdldFN0YXRlO1xuZXhwb3J0cy5pbml0aWFsaXplU3RhdGUgPSBpbml0aWFsaXplU3RhdGU7XG5leHBvcnRzLm1lcmdlRmlyc3RQZW5kaW5nU3RhdGUgPSBtZXJnZUZpcnN0UGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5wb3BQZW5kaW5nU3RhdGUgPSBwb3BQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnB1c2hQZW5kaW5nU3RhdGUgPSBwdXNoUGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5yZW1vdmVTdGF0ZSA9IHJlbW92ZVN0YXRlO1xuZXhwb3J0cy5zZXRQZW5kaW5nT3AgPSBzZXRQZW5kaW5nT3A7XG5leHBvcnRzLnNldFNlcnZlckRhdGEgPSBzZXRTZXJ2ZXJEYXRhO1xudmFyIE9iamVjdFN0YXRlTXV0YXRpb25zID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vT2JqZWN0U3RhdGVNdXRhdGlvbnNcIikpO1xuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgX1dlYWtNYXApIHJldHVybiBudWxsO1xuICB2YXIgciA9IG5ldyBfV2Vha01hcCgpLFxuICAgIHQgPSBuZXcgX1dlYWtNYXAoKTtcbiAgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBlID8gdCA6IHI7XG4gIH0pKGUpO1xufVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoZSwgcikge1xuICBpZiAoIXIgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICBkZWZhdWx0OiBlXG4gIH07XG4gIHZhciB0ID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKHIpO1xuICBpZiAodCAmJiB0LmhhcyhlKSkgcmV0dXJuIHQuZ2V0KGUpO1xuICB2YXIgbiA9IHtcbiAgICBfX3Byb3RvX186IG51bGxcbiAgfTtcbiAgZm9yICh2YXIgdSBpbiBlKSBpZiAoXCJkZWZhdWx0XCIgIT09IHUgJiYge30uaGFzT3duUHJvcGVydHkuY2FsbChlLCB1KSkge1xuICAgIHZhciBpID0gX09iamVjdCRkZWZpbmVQcm9wZXJ0eSAmJiBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA/IF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHUpIDogbnVsbDtcbiAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBfT2JqZWN0JGRlZmluZVByb3BlcnR5KG4sIHUsIGkpIDogblt1XSA9IGVbdV07XG4gIH1cbiAgcmV0dXJuIG4uZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgbiksIG47XG59XG5sZXQgb2JqZWN0U3RhdGUgPSB7fTtcbmZ1bmN0aW9uIGdldFN0YXRlKG9iaikge1xuICBjb25zdCBjbGFzc0RhdGEgPSBvYmplY3RTdGF0ZVtvYmouY2xhc3NOYW1lXTtcbiAgaWYgKGNsYXNzRGF0YSkge1xuICAgIHJldHVybiBjbGFzc0RhdGFbb2JqLmlkXSB8fCBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gaW5pdGlhbGl6ZVN0YXRlKG9iaiwgaW5pdGlhbCkge1xuICBsZXQgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKCFvYmplY3RTdGF0ZVtvYmouY2xhc3NOYW1lXSkge1xuICAgIG9iamVjdFN0YXRlW29iai5jbGFzc05hbWVdID0ge307XG4gIH1cbiAgaWYgKCFpbml0aWFsKSB7XG4gICAgaW5pdGlhbCA9IE9iamVjdFN0YXRlTXV0YXRpb25zLmRlZmF1bHRTdGF0ZSgpO1xuICB9XG4gIHN0YXRlID0gb2JqZWN0U3RhdGVbb2JqLmNsYXNzTmFtZV1bb2JqLmlkXSA9IGluaXRpYWw7XG4gIHJldHVybiBzdGF0ZTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0YXRlKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGRlbGV0ZSBvYmplY3RTdGF0ZVtvYmouY2xhc3NOYW1lXVtvYmouaWRdO1xuICByZXR1cm4gc3RhdGU7XG59XG5mdW5jdGlvbiBnZXRTZXJ2ZXJEYXRhKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5zZXJ2ZXJEYXRhO1xuICB9XG4gIHJldHVybiB7fTtcbn1cbmZ1bmN0aW9uIHNldFNlcnZlckRhdGEob2JqLCBhdHRyaWJ1dGVzKSB7XG4gIGNvbnN0IHNlcnZlckRhdGEgPSBpbml0aWFsaXplU3RhdGUob2JqKS5zZXJ2ZXJEYXRhO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5zZXRTZXJ2ZXJEYXRhKHNlcnZlckRhdGEsIGF0dHJpYnV0ZXMpO1xufVxuZnVuY3Rpb24gZ2V0UGVuZGluZ09wcyhvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUucGVuZGluZ09wcztcbiAgfVxuICByZXR1cm4gW3t9XTtcbn1cbmZ1bmN0aW9uIHNldFBlbmRpbmdPcChvYmosIGF0dHIsIG9wKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBpbml0aWFsaXplU3RhdGUob2JqKS5wZW5kaW5nT3BzO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5zZXRQZW5kaW5nT3AocGVuZGluZ09wcywgYXR0ciwgb3ApO1xufVxuZnVuY3Rpb24gcHVzaFBlbmRpbmdTdGF0ZShvYmopIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGluaXRpYWxpemVTdGF0ZShvYmopLnBlbmRpbmdPcHM7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLnB1c2hQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG59XG5mdW5jdGlvbiBwb3BQZW5kaW5nU3RhdGUob2JqKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBpbml0aWFsaXplU3RhdGUob2JqKS5wZW5kaW5nT3BzO1xuICByZXR1cm4gT2JqZWN0U3RhdGVNdXRhdGlvbnMucG9wUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xufVxuZnVuY3Rpb24gbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZShvYmopIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHMob2JqKTtcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMubWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKTtcbn1cbmZ1bmN0aW9uIGdldE9iamVjdENhY2hlKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5vYmplY3RDYWNoZTtcbiAgfVxuICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBlc3RpbWF0ZUF0dHJpYnV0ZShvYmosIGF0dHIpIHtcbiAgY29uc3Qgc2VydmVyRGF0YSA9IGdldFNlcnZlckRhdGEob2JqKTtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHMob2JqKTtcbiAgcmV0dXJuIE9iamVjdFN0YXRlTXV0YXRpb25zLmVzdGltYXRlQXR0cmlidXRlKHNlcnZlckRhdGEsIHBlbmRpbmdPcHMsIG9iaiwgYXR0cik7XG59XG5mdW5jdGlvbiBlc3RpbWF0ZUF0dHJpYnV0ZXMob2JqKSB7XG4gIGNvbnN0IHNlcnZlckRhdGEgPSBnZXRTZXJ2ZXJEYXRhKG9iaik7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzKG9iaik7XG4gIHJldHVybiBPYmplY3RTdGF0ZU11dGF0aW9ucy5lc3RpbWF0ZUF0dHJpYnV0ZXMoc2VydmVyRGF0YSwgcGVuZGluZ09wcywgb2JqKTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFNlcnZlckNoYW5nZXMob2JqLCBjaGFuZ2VzKSB7XG4gIGNvbnN0IHN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKG9iaik7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLmNvbW1pdFNlcnZlckNoYW5nZXMoc3RhdGUuc2VydmVyRGF0YSwgc3RhdGUub2JqZWN0Q2FjaGUsIGNoYW5nZXMpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVRhc2sob2JqLCB0YXNrKSB7XG4gIGNvbnN0IHN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKG9iaik7XG4gIHJldHVybiBzdGF0ZS50YXNrcy5lbnF1ZXVlKHRhc2spO1xufVxuZnVuY3Rpb24gY2xlYXJBbGxTdGF0ZSgpIHtcbiAgb2JqZWN0U3RhdGUgPSB7fTtcbn1cbmZ1bmN0aW9uIGR1cGxpY2F0ZVN0YXRlKHNvdXJjZSwgZGVzdCkge1xuICBkZXN0LmlkID0gc291cmNlLmlkO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5jbGFzcyBTb2NrZXRXZWFwcCB7XG4gIGNvbnN0cnVjdG9yKHNlcnZlclVSTCkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25vcGVuXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbm1lc3NhZ2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uY2xvc2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uZXJyb3JcIiwgdm9pZCAwKTtcbiAgICB0aGlzLm9ub3BlbiA9ICgpID0+IHt9O1xuICAgIHRoaXMub25tZXNzYWdlID0gKCkgPT4ge307XG4gICAgdGhpcy5vbmNsb3NlID0gKCkgPT4ge307XG4gICAgdGhpcy5vbmVycm9yID0gKCkgPT4ge307XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3gub25Tb2NrZXRPcGVuKCgpID0+IHtcbiAgICAgIHRoaXMub25vcGVuKCk7XG4gICAgfSk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3gub25Tb2NrZXRNZXNzYWdlKG1zZyA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm9ubWVzc2FnZShtc2cpO1xuICAgIH0pO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4Lm9uU29ja2V0Q2xvc2UoZXZlbnQgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5vbmNsb3NlKGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5vblNvY2tldEVycm9yKGVycm9yID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMub25lcnJvcihlcnJvcik7XG4gICAgfSk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3guY29ubmVjdFNvY2tldCh7XG4gICAgICB1cmw6IHNlcnZlclVSTFxuICAgIH0pO1xuICB9XG4gIHNlbmQoZGF0YSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5zZW5kU29ja2V0TWVzc2FnZSh7XG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cbiAgY2xvc2UoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4LmNsb3NlU29ja2V0KCk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gU29ja2V0V2VhcHA7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTb2NrZXRXZWFwcDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbmNvbnN0IFN0b3JhZ2UgPSB7XG4gIGFzeW5jKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiAhIWNvbnRyb2xsZXIuYXN5bmM7XG4gIH0sXG4gIGdldEl0ZW0ocGF0aCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIHN0b3JhZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBzdG9yYWdlIGNvbnRyb2xsZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0SXRlbShwYXRoKTtcbiAgfSxcbiAgZ2V0SXRlbUFzeW5jKHBhdGgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0SXRlbUFzeW5jKHBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNvbnRyb2xsZXIuZ2V0SXRlbShwYXRoKSk7XG4gIH0sXG4gIHNldEl0ZW0ocGF0aCwgdmFsdWUpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTeW5jaHJvbm91cyBzdG9yYWdlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgc3RvcmFnZSBjb250cm9sbGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLnNldEl0ZW0ocGF0aCwgdmFsdWUpO1xuICB9LFxuICBzZXRJdGVtQXN5bmMocGF0aCwgdmFsdWUpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuc2V0SXRlbUFzeW5jKHBhdGgsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjb250cm9sbGVyLnNldEl0ZW0ocGF0aCwgdmFsdWUpKTtcbiAgfSxcbiAgcmVtb3ZlSXRlbShwYXRoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3luY2hyb25vdXMgc3RvcmFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHN0b3JhZ2UgY29udHJvbGxlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5yZW1vdmVJdGVtKHBhdGgpO1xuICB9LFxuICByZW1vdmVJdGVtQXN5bmMocGF0aCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5yZW1vdmVJdGVtQXN5bmMocGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY29udHJvbGxlci5yZW1vdmVJdGVtKHBhdGgpKTtcbiAgfSxcbiAgZ2V0QWxsS2V5cygpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTeW5jaHJvbm91cyBzdG9yYWdlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgc3RvcmFnZSBjb250cm9sbGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLmdldEFsbEtleXMoKTtcbiAgfSxcbiAgZ2V0QWxsS2V5c0FzeW5jKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjb250cm9sbGVyLmdldEFsbEtleXMoKSk7XG4gIH0sXG4gIGdlbmVyYXRlUGF0aChwYXRoKSB7XG4gICAgaWYgKCFfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FQUExJQ0FUSU9OX0lEJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gY2FsbCBQYXJzZS5pbml0aWFsaXplIGJlZm9yZSB1c2luZyBQYXJzZS4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byBnZXQgYSBTdG9yYWdlIHBhdGggdGhhdCB3YXMgbm90IGEgU3RyaW5nLicpO1xuICAgIH1cbiAgICBpZiAocGF0aFswXSA9PT0gJy8nKSB7XG4gICAgICBwYXRoID0gcGF0aC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIHJldHVybiAnUGFyc2UvJyArIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQVBQTElDQVRJT05fSUQnKSArICcvJyArIHBhdGg7XG4gIH0sXG4gIF9jbGVhcigpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5oYXNPd25Qcm9wZXJ0eSgnY2xlYXInKSkge1xuICAgICAgY29udHJvbGxlci5jbGVhcigpO1xuICAgIH1cbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN0b3JhZ2U7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuLyogZ2xvYmFsIGxvY2FsU3RvcmFnZSAqL1xuXG5jb25zdCBTdG9yYWdlQ29udHJvbGxlciA9IHtcbiAgYXN5bmM6IDAsXG4gIGdldEl0ZW0ocGF0aCkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShwYXRoKTtcbiAgfSxcbiAgc2V0SXRlbShwYXRoLCB2YWx1ZSkge1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXRoLCB2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gUXVvdGEgZXhjZWVkZWQsIHBvc3NpYmx5IGR1ZSB0byBTYWZhcmkgUHJpdmF0ZSBCcm93c2luZyBtb2RlXG4gICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlSXRlbShwYXRoKSB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0ocGF0aCk7XG4gIH0sXG4gIGdldEFsbEtleXMoKSB7XG4gICAgY29uc3Qga2V5cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBrZXlzLnB1c2gobG9jYWxTdG9yYWdlLmtleShpKSk7XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xuICB9LFxuICBjbGVhcigpIHtcbiAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG4vLyBXaGVuIHRoZXJlIGlzIG5vIG5hdGl2ZSBzdG9yYWdlIGludGVyZmFjZSwgd2UgZGVmYXVsdCB0byBhbiBpbi1tZW1vcnkgbWFwXG5jb25zdCBtZW1NYXAgPSB7fTtcbmNvbnN0IFN0b3JhZ2VDb250cm9sbGVyID0ge1xuICBhc3luYzogMCxcbiAgZ2V0SXRlbShwYXRoKSB7XG4gICAgaWYgKG1lbU1hcC5oYXNPd25Qcm9wZXJ0eShwYXRoKSkge1xuICAgICAgcmV0dXJuIG1lbU1hcFtwYXRoXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIHNldEl0ZW0ocGF0aCwgdmFsdWUpIHtcbiAgICBtZW1NYXBbcGF0aF0gPSBTdHJpbmcodmFsdWUpO1xuICB9LFxuICByZW1vdmVJdGVtKHBhdGgpIHtcbiAgICBkZWxldGUgbWVtTWFwW3BhdGhdO1xuICB9LFxuICBnZXRBbGxLZXlzKCkge1xuICAgIHJldHVybiAoMCwgX2tleXMuZGVmYXVsdCkobWVtTWFwKTtcbiAgfSxcbiAgY2xlYXIoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWVtTWFwKSB7XG4gICAgICBpZiAobWVtTWFwLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgZGVsZXRlIG1lbU1hcFtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9TdG9yYWdlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlXCIpKTtcbnZhciBfU3RvcmFnZUNvbnRyb2xsZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlQ29udHJvbGxlci5icm93c2VyXCIpKTtcbnZhciBfU3RvcmFnZUNvbnRyb2xsZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlQ29udHJvbGxlci53ZWFwcFwiKSk7XG52YXIgX1N0b3JhZ2VDb250cm9sbGVyNCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdFwiKSk7XG5sZXQgU3RvcmFnZUNvbnRyb2xsZXIgPSBfU3RvcmFnZUNvbnRyb2xsZXI0LmRlZmF1bHQ7XG5TdG9yYWdlQ29udHJvbGxlciA9IF9TdG9yYWdlQ29udHJvbGxlcjIuZGVmYXVsdDtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbmNvbnN0IFN0b3JhZ2VDb250cm9sbGVyID0ge1xuICBhc3luYzogMSxcbiAgZ2V0SXRlbUFzeW5jKHBhdGgpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkuZ2V0SXRlbShwYXRoLCAoZXJyLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIHNldEl0ZW1Bc3luYyhwYXRoLCB2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBc3luY1N0b3JhZ2UoKS5zZXRJdGVtKHBhdGgsIHZhbHVlLCBlcnIgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgcmVtb3ZlSXRlbUFzeW5jKHBhdGgpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkucmVtb3ZlSXRlbShwYXRoLCBlcnIgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0QWxsS2V5c0FzeW5jKCkge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBc3luY1N0b3JhZ2UoKS5nZXRBbGxLZXlzKChlcnIsIGtleXMpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoa2V5cyB8fCBbXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBtdWx0aUdldChrZXlzKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLm11bHRpR2V0KGtleXMsIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBtdWx0aVJlbW92ZShrZXlzKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLm11bHRpUmVtb3ZlKGtleXMsIGVyciA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGtleXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgY2xlYXIoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLmNsZWFyKCk7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JhZ2VDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gU3RvcmFnZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uva2V5c1wiKSk7XG5jb25zdCBTdG9yYWdlQ29udHJvbGxlciA9IHtcbiAgYXN5bmM6IDAsXG4gIGdldEl0ZW0ocGF0aCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gd3guZ2V0U3RvcmFnZVN5bmMocGF0aCk7XG4gIH0sXG4gIHNldEl0ZW0ocGF0aCwgdmFsdWUpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgd3guc2V0U3RvcmFnZVN5bmMocGF0aCwgdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFF1b3RhIGV4Y2VlZGVkXG4gICAgfVxuICB9LFxuICByZW1vdmVJdGVtKHBhdGgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3gucmVtb3ZlU3RvcmFnZVN5bmMocGF0aCk7XG4gIH0sXG4gIGdldEFsbEtleXMoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHJlcyA9IHd4LmdldFN0b3JhZ2VJbmZvU3luYygpO1xuICAgIHJldHVybiAoMCwgX2tleXMuZGVmYXVsdCkocmVzKTtcbiAgfSxcbiAgY2xlYXIoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4LmNsZWFyU3RvcmFnZVN5bmMoKTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9wcm9taXNlVXRpbHMgPSByZXF1aXJlKFwiLi9wcm9taXNlVXRpbHNcIik7XG5jbGFzcyBUYXNrUXVldWUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInF1ZXVlXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5xdWV1ZSA9IFtdO1xuICB9XG4gIGVucXVldWUodGFzaykge1xuICAgIGNvbnN0IHRhc2tDb21wbGV0ZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgdGhpcy5xdWV1ZS5wdXNoKHtcbiAgICAgIHRhc2s6IHRhc2ssXG4gICAgICBfY29tcGxldGlvbjogdGFza0NvbXBsZXRlXG4gICAgfSk7XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID09PSAxKSB7XG4gICAgICB0YXNrKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RlcXVldWUoKTtcbiAgICAgICAgdGFza0NvbXBsZXRlLnJlc29sdmUoKTtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5fZGVxdWV1ZSgpO1xuICAgICAgICB0YXNrQ29tcGxldGUucmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFza0NvbXBsZXRlO1xuICB9XG4gIF9kZXF1ZXVlKCkge1xuICAgIHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnF1ZXVlWzBdO1xuICAgICAgbmV4dC50YXNrKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RlcXVldWUoKTtcbiAgICAgICAgbmV4dC5fY29tcGxldGlvbi5yZXNvbHZlKCk7XG4gICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgIHRoaXMuX2RlcXVldWUoKTtcbiAgICAgICAgbmV4dC5fY29tcGxldGlvbi5yZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IFRhc2tRdWV1ZTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFRhc2tRdWV1ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9XZWFrTWFwMiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3dlYWstbWFwXCIpO1xudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2xlYXJBbGxTdGF0ZSA9IGNsZWFyQWxsU3RhdGU7XG5leHBvcnRzLmNvbW1pdFNlcnZlckNoYW5nZXMgPSBjb21taXRTZXJ2ZXJDaGFuZ2VzO1xuZXhwb3J0cy5kdXBsaWNhdGVTdGF0ZSA9IGR1cGxpY2F0ZVN0YXRlO1xuZXhwb3J0cy5lbnF1ZXVlVGFzayA9IGVucXVldWVUYXNrO1xuZXhwb3J0cy5lc3RpbWF0ZUF0dHJpYnV0ZSA9IGVzdGltYXRlQXR0cmlidXRlO1xuZXhwb3J0cy5lc3RpbWF0ZUF0dHJpYnV0ZXMgPSBlc3RpbWF0ZUF0dHJpYnV0ZXM7XG5leHBvcnRzLmdldE9iamVjdENhY2hlID0gZ2V0T2JqZWN0Q2FjaGU7XG5leHBvcnRzLmdldFBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzO1xuZXhwb3J0cy5nZXRTZXJ2ZXJEYXRhID0gZ2V0U2VydmVyRGF0YTtcbmV4cG9ydHMuZ2V0U3RhdGUgPSBnZXRTdGF0ZTtcbmV4cG9ydHMuaW5pdGlhbGl6ZVN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlO1xuZXhwb3J0cy5tZXJnZUZpcnN0UGVuZGluZ1N0YXRlID0gbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucG9wUGVuZGluZ1N0YXRlID0gcG9wUGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5wdXNoUGVuZGluZ1N0YXRlID0gcHVzaFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucmVtb3ZlU3RhdGUgPSByZW1vdmVTdGF0ZTtcbmV4cG9ydHMuc2V0UGVuZGluZ09wID0gc2V0UGVuZGluZ09wO1xuZXhwb3J0cy5zZXRTZXJ2ZXJEYXRhID0gc2V0U2VydmVyRGF0YTtcbnZhciBfd2Vha01hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXBcIikpO1xudmFyIE9iamVjdFN0YXRlTXV0YXRpb25zID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vT2JqZWN0U3RhdGVNdXRhdGlvbnNcIikpO1xudmFyIF9UYXNrUXVldWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1Rhc2tRdWV1ZVwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoZSkge1xuICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBfV2Vha01hcDIpIHJldHVybiBudWxsO1xuICB2YXIgciA9IG5ldyBfV2Vha01hcDIoKSxcbiAgICB0ID0gbmV3IF9XZWFrTWFwMigpO1xuICByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGUgPyB0IDogcjtcbiAgfSkoZSk7XG59XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChlLCByKSB7XG4gIGlmICghciAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgIGRlZmF1bHQ6IGVcbiAgfTtcbiAgdmFyIHQgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUocik7XG4gIGlmICh0ICYmIHQuaGFzKGUpKSByZXR1cm4gdC5nZXQoZSk7XG4gIHZhciBuID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbFxuICB9O1xuICBmb3IgKHZhciB1IGluIGUpIGlmIChcImRlZmF1bHRcIiAhPT0gdSAmJiB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHUpKSB7XG4gICAgdmFyIGkgPSBfT2JqZWN0JGRlZmluZVByb3BlcnR5ICYmIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID8gX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdSkgOiBudWxsO1xuICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IF9PYmplY3QkZGVmaW5lUHJvcGVydHkobiwgdSwgaSkgOiBuW3VdID0gZVt1XTtcbiAgfVxuICByZXR1cm4gbi5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCBuKSwgbjtcbn1cbmxldCBvYmplY3RTdGF0ZSA9IG5ldyBfd2Vha01hcC5kZWZhdWx0KCk7XG5mdW5jdGlvbiBnZXRTdGF0ZShvYmopIHtcbiAgY29uc3QgY2xhc3NEYXRhID0gb2JqZWN0U3RhdGUuZ2V0KG9iaik7XG4gIHJldHVybiBjbGFzc0RhdGEgfHwgbnVsbDtcbn1cbmZ1bmN0aW9uIGluaXRpYWxpemVTdGF0ZShvYmosIGluaXRpYWwpIHtcbiAgbGV0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGlmICghaW5pdGlhbCkge1xuICAgIGluaXRpYWwgPSB7XG4gICAgICBzZXJ2ZXJEYXRhOiB7fSxcbiAgICAgIHBlbmRpbmdPcHM6IFt7fV0sXG4gICAgICBvYmplY3RDYWNoZToge30sXG4gICAgICB0YXNrczogbmV3IF9UYXNrUXVldWUuZGVmYXVsdCgpLFxuICAgICAgZXhpc3RlZDogZmFsc2VcbiAgICB9O1xuICB9XG4gIHN0YXRlID0gaW5pdGlhbDtcbiAgb2JqZWN0U3RhdGUuc2V0KG9iaiwgc3RhdGUpO1xuICByZXR1cm4gc3RhdGU7XG59XG5mdW5jdGlvbiByZW1vdmVTdGF0ZShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBvYmplY3RTdGF0ZS5kZWxldGUob2JqKTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gZ2V0U2VydmVyRGF0YShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuc2VydmVyRGF0YTtcbiAgfVxuICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBzZXRTZXJ2ZXJEYXRhKG9iaiwgYXR0cmlidXRlcykge1xuICBjb25zdCBzZXJ2ZXJEYXRhID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikuc2VydmVyRGF0YTtcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMuc2V0U2VydmVyRGF0YShzZXJ2ZXJEYXRhLCBhdHRyaWJ1dGVzKTtcbn1cbmZ1bmN0aW9uIGdldFBlbmRpbmdPcHMob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLnBlbmRpbmdPcHM7XG4gIH1cbiAgcmV0dXJuIFt7fV07XG59XG5mdW5jdGlvbiBzZXRQZW5kaW5nT3Aob2JqLCBhdHRyLCBvcCkge1xuICBjb25zdCBwZW5kaW5nT3BzID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikucGVuZGluZ09wcztcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMuc2V0UGVuZGluZ09wKHBlbmRpbmdPcHMsIGF0dHIsIG9wKTtcbn1cbmZ1bmN0aW9uIHB1c2hQZW5kaW5nU3RhdGUob2JqKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBpbml0aWFsaXplU3RhdGUob2JqKS5wZW5kaW5nT3BzO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5wdXNoUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xufVxuZnVuY3Rpb24gcG9wUGVuZGluZ1N0YXRlKG9iaikge1xuICBjb25zdCBwZW5kaW5nT3BzID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikucGVuZGluZ09wcztcbiAgcmV0dXJuIE9iamVjdFN0YXRlTXV0YXRpb25zLnBvcFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKTtcbn1cbmZ1bmN0aW9uIG1lcmdlRmlyc3RQZW5kaW5nU3RhdGUob2JqKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzKG9iaik7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLm1lcmdlRmlyc3RQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG59XG5mdW5jdGlvbiBnZXRPYmplY3RDYWNoZShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUub2JqZWN0Q2FjaGU7XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuZnVuY3Rpb24gZXN0aW1hdGVBdHRyaWJ1dGUob2JqLCBhdHRyKSB7XG4gIGNvbnN0IHNlcnZlckRhdGEgPSBnZXRTZXJ2ZXJEYXRhKG9iaik7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzKG9iaik7XG4gIHJldHVybiBPYmplY3RTdGF0ZU11dGF0aW9ucy5lc3RpbWF0ZUF0dHJpYnV0ZShzZXJ2ZXJEYXRhLCBwZW5kaW5nT3BzLCBvYmosIGF0dHIpO1xufVxuZnVuY3Rpb24gZXN0aW1hdGVBdHRyaWJ1dGVzKG9iaikge1xuICBjb25zdCBzZXJ2ZXJEYXRhID0gZ2V0U2VydmVyRGF0YShvYmopO1xuICBjb25zdCBwZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcyhvYmopO1xuICByZXR1cm4gT2JqZWN0U3RhdGVNdXRhdGlvbnMuZXN0aW1hdGVBdHRyaWJ1dGVzKHNlcnZlckRhdGEsIHBlbmRpbmdPcHMsIG9iaik7XG59XG5mdW5jdGlvbiBjb21taXRTZXJ2ZXJDaGFuZ2VzKG9iaiwgY2hhbmdlcykge1xuICBjb25zdCBzdGF0ZSA9IGluaXRpYWxpemVTdGF0ZShvYmopO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5jb21taXRTZXJ2ZXJDaGFuZ2VzKHN0YXRlLnNlcnZlckRhdGEsIHN0YXRlLm9iamVjdENhY2hlLCBjaGFuZ2VzKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVUYXNrKG9iaiwgdGFzaykge1xuICBjb25zdCBzdGF0ZSA9IGluaXRpYWxpemVTdGF0ZShvYmopO1xuICByZXR1cm4gc3RhdGUudGFza3MuZW5xdWV1ZSh0YXNrKTtcbn1cbmZ1bmN0aW9uIGR1cGxpY2F0ZVN0YXRlKHNvdXJjZSwgZGVzdCkge1xuICBjb25zdCBvbGRTdGF0ZSA9IGluaXRpYWxpemVTdGF0ZShzb3VyY2UpO1xuICBjb25zdCBuZXdTdGF0ZSA9IGluaXRpYWxpemVTdGF0ZShkZXN0KTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2xkU3RhdGUuc2VydmVyRGF0YSkge1xuICAgIG5ld1N0YXRlLnNlcnZlckRhdGFba2V5XSA9IG9sZFN0YXRlLnNlcnZlckRhdGFba2V5XTtcbiAgfVxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2xkU3RhdGUucGVuZGluZ09wcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRTdGF0ZS5wZW5kaW5nT3BzW2luZGV4XSkge1xuICAgICAgbmV3U3RhdGUucGVuZGluZ09wc1tpbmRleF1ba2V5XSA9IG9sZFN0YXRlLnBlbmRpbmdPcHNbaW5kZXhdW2tleV07XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG9sZFN0YXRlLm9iamVjdENhY2hlKSB7XG4gICAgbmV3U3RhdGUub2JqZWN0Q2FjaGVba2V5XSA9IG9sZFN0YXRlLm9iamVjdENhY2hlW2tleV07XG4gIH1cbiAgbmV3U3RhdGUuZXhpc3RlZCA9IG9sZFN0YXRlLmV4aXN0ZWQ7XG59XG5mdW5jdGlvbiBjbGVhckFsbFN0YXRlKCkge1xuICBvYmplY3RTdGF0ZSA9IG5ldyBfd2Vha01hcC5kZWZhdWx0KCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfd3MgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJ3c1wiKSk7XG52YXIgX1NvY2tldCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU29ja2V0LndlYXBwXCIpKTtcbi8qIGdsb2JhbCBXZWJTb2NrZXQgKi9cblxubGV0IFdlYlNvY2tldENvbnRyb2xsZXI7XG50cnkge1xuICBXZWJTb2NrZXRDb250cm9sbGVyID0gdHlwZW9mIFdlYlNvY2tldCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgV2ViU29ja2V0ID09PSAnb2JqZWN0JyA/IFdlYlNvY2tldCA6IG51bGw7XG59IGNhdGNoIChfKSB7XG4gIC8vIFdlYlNvY2tldCB1bmF2YWlsYWJsZVxufVxubW9kdWxlLmV4cG9ydHMgPSBXZWJTb2NrZXRDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gV2ViU29ja2V0Q29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbmNsYXNzIFhocldlYXBwIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJVTlNFTlRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIk9QRU5FRFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiSEVBREVSU19SRUNFSVZFRFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiTE9BRElOR1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiRE9ORVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiaGVhZGVyXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZWFkeVN0YXRlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzdGF0dXNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlc3BvbnNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZXNwb25zZVR5cGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlc3BvbnNlVGV4dFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVzcG9uc2VIZWFkZXJcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm1ldGhvZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwidXJsXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbmFib3J0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbnByb2dyZXNzXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbmVycm9yXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlcXVlc3RUYXNrXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5VTlNFTlQgPSAwO1xuICAgIHRoaXMuT1BFTkVEID0gMTtcbiAgICB0aGlzLkhFQURFUlNfUkVDRUlWRUQgPSAyO1xuICAgIHRoaXMuTE9BRElORyA9IDM7XG4gICAgdGhpcy5ET05FID0gNDtcbiAgICB0aGlzLmhlYWRlciA9IHt9O1xuICAgIHRoaXMucmVhZHlTdGF0ZSA9IHRoaXMuRE9ORTtcbiAgICB0aGlzLnN0YXR1cyA9IDA7XG4gICAgdGhpcy5yZXNwb25zZSA9ICcnO1xuICAgIHRoaXMucmVzcG9uc2VUeXBlID0gJyc7XG4gICAgdGhpcy5yZXNwb25zZVRleHQgPSAnJztcbiAgICB0aGlzLnJlc3BvbnNlSGVhZGVyID0ge307XG4gICAgdGhpcy5tZXRob2QgPSAnJztcbiAgICB0aGlzLnVybCA9ICcnO1xuICAgIHRoaXMub25hYm9ydCA9ICgpID0+IHt9O1xuICAgIHRoaXMub25wcm9ncmVzcyA9ICgpID0+IHt9O1xuICAgIHRoaXMub25lcnJvciA9ICgpID0+IHt9O1xuICAgIHRoaXMub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge307XG4gICAgdGhpcy5yZXF1ZXN0VGFzayA9IG51bGw7XG4gIH1cbiAgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkge1xuICAgIGxldCBoZWFkZXIgPSAnJztcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnJlc3BvbnNlSGVhZGVyKSB7XG4gICAgICBoZWFkZXIgKz0ga2V5ICsgJzonICsgdGhpcy5nZXRSZXNwb25zZUhlYWRlcihrZXkpICsgJ1xcclxcbic7XG4gICAgfVxuICAgIHJldHVybiBoZWFkZXI7XG4gIH1cbiAgZ2V0UmVzcG9uc2VIZWFkZXIoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VIZWFkZXJba2V5XTtcbiAgfVxuICBzZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpIHtcbiAgICB0aGlzLmhlYWRlcltrZXldID0gdmFsdWU7XG4gIH1cbiAgb3BlbihtZXRob2QsIHVybCkge1xuICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgIHRoaXMudXJsID0gdXJsO1xuICB9XG4gIGFib3J0KCkge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0VGFzaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlcXVlc3RUYXNrLmFib3J0KCk7XG4gICAgdGhpcy5zdGF0dXMgPSAwO1xuICAgIHRoaXMucmVzcG9uc2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vbmFib3J0KCk7XG4gICAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UoKTtcbiAgfVxuICBzZW5kKGRhdGEpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5yZXF1ZXN0VGFzayA9IHd4LnJlcXVlc3Qoe1xuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlcixcbiAgICAgIHJlc3BvbnNlVHlwZTogdGhpcy5yZXNwb25zZVR5cGUsXG4gICAgICBzdWNjZXNzOiByZXMgPT4ge1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHJlcy5zdGF0dXNDb2RlO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzLmRhdGE7XG4gICAgICAgIHRoaXMucmVzcG9uc2VIZWFkZXIgPSByZXMuaGVhZGVyO1xuICAgICAgICB0aGlzLnJlc3BvbnNlVGV4dCA9ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHJlcy5kYXRhKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgIHRoaXMub25yZWFkeXN0YXRlY2hhbmdlKCk7XG4gICAgICB9LFxuICAgICAgZmFpbDogZXJyID0+IHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5vbmVycm9yKGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZXF1ZXN0VGFzay5vblByb2dyZXNzVXBkYXRlKHJlcyA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogcmVzLnRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGUgIT09IDAsXG4gICAgICAgIGxvYWRlZDogcmVzLnRvdGFsQnl0ZXNXcml0dGVuLFxuICAgICAgICB0b3RhbDogcmVzLnRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGVcbiAgICAgIH07XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm9ucHJvZ3Jlc3MoZXZlbnQpO1xuICAgIH0pO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IFhocldlYXBwO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gWGhyV2VhcHA7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGFycmF5Q29udGFpbnNPYmplY3Q7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbmZ1bmN0aW9uIGFycmF5Q29udGFpbnNPYmplY3QoYXJyYXksIG9iamVjdCkge1xuICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKGFycmF5KS5jYWxsKGFycmF5LCBvYmplY3QpID4gLTEpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJyYXlbaV0gaW5zdGFuY2VvZiBQYXJzZU9iamVjdCAmJiBhcnJheVtpXS5jbGFzc05hbWUgPT09IG9iamVjdC5jbGFzc05hbWUgJiYgYXJyYXlbaV0uX2dldElkKCkgPT09IG9iamVjdC5fZ2V0SWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gY2FuQmVTZXJpYWxpemVkO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG5mdW5jdGlvbiBjYW5CZVNlcmlhbGl6ZWQob2JqKSB7XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgaWYgKCEob2JqIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgYXR0cmlidXRlcyA9IG9iai5hdHRyaWJ1dGVzO1xuICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgIGNvbnN0IHZhbCA9IGF0dHJpYnV0ZXNbYXR0cl07XG4gICAgaWYgKCFjYW5CZVNlcmlhbGl6ZWRIZWxwZXIodmFsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNhbkJlU2VyaWFsaXplZEhlbHBlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgcmV0dXJuICEhdmFsdWUuaWQ7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlRmlsZS5kZWZhdWx0KSB7XG4gICAgaWYgKHZhbHVlLnVybCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFjYW5CZVNlcmlhbGl6ZWRIZWxwZXIodmFsdWVbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XG4gICAgaWYgKCFjYW5CZVNlcmlhbGl6ZWRIZWxwZXIodmFsdWVba10pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBkZWNvZGU7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xudmFyIF9QYXJzZVBvbHlnb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUG9seWdvblwiKSk7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xuZnVuY3Rpb24gZGVjb2RlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSkge1xuICAgIGNvbnN0IGR1cCA9IFtdO1xuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KSh2YWx1ZSkuY2FsbCh2YWx1ZSwgKHYsIGkpID0+IHtcbiAgICAgIGR1cFtpXSA9IGRlY29kZSh2KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZHVwO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUuX19vcCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7XG4gICAgICBvcEZyb21KU09OXG4gICAgfSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT3AoKTtcbiAgICByZXR1cm4gb3BGcm9tSlNPTih2YWx1ZSk7XG4gIH1cbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBpZiAodmFsdWUuX190eXBlID09PSAnUG9pbnRlcicgJiYgdmFsdWUuY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LmZyb21KU09OKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWUuX190eXBlID09PSAnT2JqZWN0JyAmJiB2YWx1ZS5jbGFzc05hbWUpIHtcbiAgICByZXR1cm4gUGFyc2VPYmplY3QuZnJvbUpTT04odmFsdWUpO1xuICB9XG4gIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdSZWxhdGlvbicpIHtcbiAgICAvLyBUaGUgcGFyZW50IGFuZCBrZXkgZmllbGRzIHdpbGwgYmUgcG9wdWxhdGVkIGJ5IHRoZSBwYXJlbnRcbiAgICBjb25zdCByZWxhdGlvbiA9IG5ldyBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KG51bGwsIG51bGwpO1xuICAgIHJlbGF0aW9uLnRhcmdldENsYXNzTmFtZSA9IHZhbHVlLmNsYXNzTmFtZTtcbiAgICByZXR1cm4gcmVsYXRpb247XG4gIH1cbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ0RhdGUnKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLmlzbyk7XG4gIH1cbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ0ZpbGUnKSB7XG4gICAgcmV0dXJuIF9QYXJzZUZpbGUuZGVmYXVsdC5mcm9tSlNPTih2YWx1ZSk7XG4gIH1cbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ0dlb1BvaW50Jykge1xuICAgIHJldHVybiBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCh7XG4gICAgICBsYXRpdHVkZTogdmFsdWUubGF0aXR1ZGUsXG4gICAgICBsb25naXR1ZGU6IHZhbHVlLmxvbmdpdHVkZVxuICAgIH0pO1xuICB9XG4gIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdQb2x5Z29uJykge1xuICAgIHJldHVybiBuZXcgX1BhcnNlUG9seWdvbi5kZWZhdWx0KHZhbHVlLmNvb3JkaW5hdGVzKTtcbiAgfVxuICBjb25zdCBjb3B5ID0ge307XG4gIGZvciAoY29uc3QgayBpbiB2YWx1ZSkge1xuICAgIGNvcHlba10gPSBkZWNvZGUodmFsdWVba10pO1xuICB9XG4gIHJldHVybiBjb3B5O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX3N0YXJ0c1dpdGggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3N0YXJ0cy13aXRoXCIpKTtcbnZhciBfY29uY2F0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXRcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VBQ0wgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQUNMXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9QYXJzZUdlb1BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUdlb1BvaW50XCIpKTtcbnZhciBfUGFyc2VQb2x5Z29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVBvbHlnb25cIikpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbmZ1bmN0aW9uIGVuY29kZSh2YWx1ZSwgZGlzYWxsb3dPYmplY3RzLCBmb3JjZVBvaW50ZXJzLCBzZWVuLCBvZmZsaW5lKSB7XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICBpZiAoZGlzYWxsb3dPYmplY3RzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlIE9iamVjdHMgbm90IGFsbG93ZWQgaGVyZScpO1xuICAgIH1cbiAgICBjb25zdCBzZWVuRW50cnkgPSB2YWx1ZS5pZCA/IHZhbHVlLmNsYXNzTmFtZSArICc6JyArIHZhbHVlLmlkIDogdmFsdWU7XG4gICAgaWYgKGZvcmNlUG9pbnRlcnMgfHwgIXNlZW4gfHwgKDAsIF9pbmRleE9mLmRlZmF1bHQpKHNlZW4pLmNhbGwoc2Vlbiwgc2VlbkVudHJ5KSA+IC0xIHx8IHZhbHVlLmRpcnR5KCkgfHwgKDAsIF9rZXlzLmRlZmF1bHQpKHZhbHVlLl9nZXRTZXJ2ZXJEYXRhKCkpLmxlbmd0aCA8IDEpIHtcbiAgICAgIHZhciBfY29udGV4dDtcbiAgICAgIGlmIChvZmZsaW5lICYmICgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShfY29udGV4dCA9IHZhbHVlLl9nZXRJZCgpKS5jYWxsKF9jb250ZXh0LCAnbG9jYWwnKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9PZmZsaW5lUG9pbnRlcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLnRvUG9pbnRlcigpO1xuICAgIH1cbiAgICBzZWVuID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoc2VlbikuY2FsbChzZWVuLCBzZWVuRW50cnkpO1xuICAgIHJldHVybiB2YWx1ZS5fdG9GdWxsSlNPTihzZWVuLCBvZmZsaW5lKTtcbiAgfVxuICBjb25zdCB7XG4gICAgT3BcbiAgfSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT3AoKTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT3AgfHwgdmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VBQ0wuZGVmYXVsdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZUdlb1BvaW50LmRlZmF1bHQgfHwgdmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VQb2x5Z29uLmRlZmF1bHQgfHwgdmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvSlNPTigpO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCkge1xuICAgIGlmICghdmFsdWUudXJsKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gZW5jb2RlIGFuIHVuc2F2ZWQgZmlsZS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnRvSlNPTigpO1xuICB9XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIGVuY29kZSBhbiBpbnZhbGlkIGRhdGUuJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdEYXRlJyxcbiAgICAgIGlzbzogdmFsdWUudG9KU09OKClcbiAgICB9O1xuICB9XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBSZWdFeHBdJyAmJiB0eXBlb2YgdmFsdWUuc291cmNlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZS5zb3VyY2U7XG4gIH1cbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gKDAsIF9tYXAuZGVmYXVsdCkodmFsdWUpLmNhbGwodmFsdWUsIHYgPT4ge1xuICAgICAgcmV0dXJuIGVuY29kZSh2LCBkaXNhbGxvd09iamVjdHMsIGZvcmNlUG9pbnRlcnMsIHNlZW4sIG9mZmxpbmUpO1xuICAgIH0pO1xuICB9XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XG4gICAgICBvdXRwdXRba10gPSBlbmNvZGUodmFsdWVba10sIGRpc2FsbG93T2JqZWN0cywgZm9yY2VQb2ludGVycywgc2Vlbiwgb2ZmbGluZSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gX2RlZmF1bHQodmFsdWUsIGRpc2FsbG93T2JqZWN0cywgZm9yY2VQb2ludGVycywgc2Vlbiwgb2ZmbGluZSkge1xuICByZXR1cm4gZW5jb2RlKHZhbHVlLCAhIWRpc2FsbG93T2JqZWN0cywgISFmb3JjZVBvaW50ZXJzLCBzZWVuIHx8IFtdLCBvZmZsaW5lKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXF1YWxzO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VBQ0wgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQUNMXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9QYXJzZUdlb1BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUdlb1BvaW50XCIpKTtcbmZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIGNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgaWYgKHRvU3RyaW5nLmNhbGwoYSkgPT09ICdbb2JqZWN0IERhdGVdJyB8fCB0b1N0cmluZy5jYWxsKGIpID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICBjb25zdCBkYXRlQSA9IG5ldyBEYXRlKGEpO1xuICAgIGNvbnN0IGRhdGVCID0gbmV3IERhdGUoYik7XG4gICAgcmV0dXJuICtkYXRlQSA9PT0gK2RhdGVCO1xuICB9XG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCFhIHx8IHR5cGVvZiBhICE9PSAnb2JqZWN0Jykge1xuICAgIC8vIGEgaXMgYSBwcmltaXRpdmVcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgfVxuICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGEpIHx8ICgwLCBfaXNBcnJheS5kZWZhdWx0KShiKSkge1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKGEpIHx8ICEoMCwgX2lzQXJyYXkuZGVmYXVsdCkoYikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gYS5sZW5ndGg7IGktLTspIHtcbiAgICAgIGlmICghZXF1YWxzKGFbaV0sIGJbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBpZiAoYSBpbnN0YW5jZW9mIF9QYXJzZUFDTC5kZWZhdWx0IHx8IGEgaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQgfHwgYSBpbnN0YW5jZW9mIF9QYXJzZUdlb1BvaW50LmRlZmF1bHQgfHwgYSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgcmV0dXJuIGEuZXF1YWxzKGIpO1xuICB9XG4gIGlmIChiIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICBpZiAoYS5fX3R5cGUgPT09ICdPYmplY3QnIHx8IGEuX190eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgIHJldHVybiBhLm9iamVjdElkID09PSBiLmlkICYmIGEuY2xhc3NOYW1lID09PSBiLmNsYXNzTmFtZTtcbiAgICB9XG4gIH1cbiAgaWYgKCgwLCBfa2V5cy5kZWZhdWx0KShhKS5sZW5ndGggIT09ICgwLCBfa2V5cy5kZWZhdWx0KShiKS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBrIGluIGEpIHtcbiAgICBpZiAoIWVxdWFscyhhW2tdLCBiW2tdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBlc2NhcGU7XG5jb25zdCBlbmNvZGVkID0ge1xuICAnJic6ICcmYW1wOycsXG4gICc8JzogJyZsdDsnLFxuICAnPic6ICcmZ3Q7JyxcbiAgJy8nOiAnJiN4MkY7JyxcbiAgXCInXCI6ICcmI3gyNzsnLFxuICAnXCInOiAnJnF1b3Q7J1xufTtcbmZ1bmN0aW9uIGVzY2FwZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bJjw+XFwvJ1wiXS9nLCBmdW5jdGlvbiAoY2hhcikge1xuICAgIHJldHVybiBlbmNvZGVkW2NoYXJdO1xuICB9KTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gaXNSZXZvY2FibGVTZXNzaW9uO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG5mdW5jdGlvbiBpc1Jldm9jYWJsZVNlc3Npb24odG9rZW4pIHtcbiAgcmV0dXJuICgwLCBfaW5kZXhPZi5kZWZhdWx0KSh0b2tlbikuY2FsbCh0b2tlbiwgJ3I6JykgPiAtMTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gcGFyc2VEYXRlO1xudmFyIF9wYXJzZUludDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3BhcnNlLWludFwiKSk7XG5mdW5jdGlvbiBwYXJzZURhdGUoaXNvODYwMSkge1xuICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKCdeKFswLTldezEsNH0pLShbMC05XXsxLDJ9KS0oWzAtOV17MSwyfSknICsgJ1QnICsgJyhbMC05XXsxLDJ9KTooWzAtOV17MSwyfSk6KFswLTldezEsMn0pJyArICcoLihbMC05XSspKT8nICsgJ1okJyk7XG4gIGNvbnN0IG1hdGNoID0gcmVnZXhwLmV4ZWMoaXNvODYwMSk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB5ZWFyID0gKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbMV0pIHx8IDA7XG4gIGNvbnN0IG1vbnRoID0gKCgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzJdKSB8fCAxKSAtIDE7XG4gIGNvbnN0IGRheSA9ICgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzNdKSB8fCAwO1xuICBjb25zdCBob3VyID0gKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbNF0pIHx8IDA7XG4gIGNvbnN0IG1pbnV0ZSA9ICgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzVdKSB8fCAwO1xuICBjb25zdCBzZWNvbmQgPSAoMCwgX3BhcnNlSW50Mi5kZWZhdWx0KShtYXRjaFs2XSkgfHwgMDtcbiAgY29uc3QgbWlsbGkgPSAoMCwgX3BhcnNlSW50Mi5kZWZhdWx0KShtYXRjaFs4XSkgfHwgMDtcbiAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaSkpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNvbnRpbnVlV2hpbGUgPSBjb250aW51ZVdoaWxlO1xuZXhwb3J0cy5yZXNvbHZpbmdQcm9taXNlID0gcmVzb2x2aW5nUHJvbWlzZTtcbmV4cG9ydHMud2hlbiA9IHdoZW47XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG4vLyBDcmVhdGUgRGVmZXJyZWQgUHJvbWlzZVxuZnVuY3Rpb24gcmVzb2x2aW5nUHJvbWlzZSgpIHtcbiAgbGV0IHJlcztcbiAgbGV0IHJlajtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXMgPSByZXNvbHZlO1xuICAgIHJlaiA9IHJlamVjdDtcbiAgfSk7XG4gIGNvbnN0IGRlZmVyID0gcHJvbWlzZTtcbiAgZGVmZXIucmVzb2x2ZSA9IHJlcztcbiAgZGVmZXIucmVqZWN0ID0gcmVqO1xuICByZXR1cm4gZGVmZXI7XG59XG5mdW5jdGlvbiB3aGVuKHByb21pc2VzKSB7XG4gIGxldCBvYmplY3RzO1xuICBjb25zdCBhcnJheUFyZ3VtZW50ID0gKDAsIF9pc0FycmF5LmRlZmF1bHQpKHByb21pc2VzKTtcbiAgaWYgKGFycmF5QXJndW1lbnQpIHtcbiAgICBvYmplY3RzID0gcHJvbWlzZXM7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0cyA9IGFyZ3VtZW50cztcbiAgfVxuICBsZXQgdG90YWwgPSBvYmplY3RzLmxlbmd0aDtcbiAgbGV0IGhhZEVycm9yID0gZmFsc2U7XG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgY29uc3QgcmV0dXJuVmFsdWUgPSBhcnJheUFyZ3VtZW50ID8gW3Jlc3VsdHNdIDogcmVzdWx0cztcbiAgY29uc3QgZXJyb3JzID0gW107XG4gIHJlc3VsdHMubGVuZ3RoID0gb2JqZWN0cy5sZW5ndGg7XG4gIGVycm9ycy5sZW5ndGggPSBvYmplY3RzLmxlbmd0aDtcbiAgaWYgKHRvdGFsID09PSAwKSB7XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gIH1cbiAgY29uc3QgcHJvbWlzZSA9IHJlc29sdmluZ1Byb21pc2UoKTtcbiAgY29uc3QgcmVzb2x2ZU9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0b3RhbC0tO1xuICAgIGlmICh0b3RhbCA8PSAwKSB7XG4gICAgICBpZiAoaGFkRXJyb3IpIHtcbiAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3JzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb21pc2UucmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBjaGFpbiA9IGZ1bmN0aW9uIChvYmplY3QsIGluZGV4KSB7XG4gICAgaWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9iamVjdC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSByZXN1bHQ7XG4gICAgICAgIHJlc29sdmVPbmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBlcnJvcnNbaW5kZXhdID0gZXJyb3I7XG4gICAgICAgIGhhZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZU9uZSgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdHNbaW5kZXhdID0gb2JqZWN0O1xuICAgICAgcmVzb2x2ZU9uZSgpO1xuICAgIH1cbiAgfTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhaW4ob2JqZWN0c1tpXSwgaSk7XG4gIH1cbiAgcmV0dXJuIHByb21pc2U7XG59XG5mdW5jdGlvbiBjb250aW51ZVdoaWxlKHRlc3QsIGVtaXR0ZXIpIHtcbiAgaWYgKHRlc3QoKSkge1xuICAgIHJldHVybiBlbWl0dGVyKCkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gY29udGludWVXaGlsZSh0ZXN0LCBlbWl0dGVyKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVuaXF1ZTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2FycmF5Q29udGFpbnNPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2FycmF5Q29udGFpbnNPYmplY3RcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuZnVuY3Rpb24gdW5pcXVlKGFycikge1xuICBjb25zdCB1bmlxdWVzID0gW107XG4gICgwLCBfZm9yRWFjaC5kZWZhdWx0KShhcnIpLmNhbGwoYXJyLCB2YWx1ZSA9PiB7XG4gICAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICBpZiAoISgwLCBfYXJyYXlDb250YWluc09iamVjdC5kZWZhdWx0KSh1bmlxdWVzLCB2YWx1ZSkpIHtcbiAgICAgICAgdW5pcXVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KSh1bmlxdWVzKS5jYWxsKHVuaXF1ZXMsIHZhbHVlKSA8IDApIHtcbiAgICAgICAgdW5pcXVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdW5pcXVlcztcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdW5zYXZlZENoaWxkcmVuO1xudmFyIF9jb25jYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBvZiB1bnNhdmVkIGNoaWxkcmVuLCB3aGljaCBhcmUgZWl0aGVyIFBhcnNlIE9iamVjdHMgb3IgRmlsZXMuXG4gKiBJZiBpdCBlbmNvdW50ZXJzIGFueSBkaXJ0eSBPYmplY3RzIHdpdGhvdXQgSWRzLCBpdCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1BhcnNlLk9iamVjdH0gb2JqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93RGVlcFVuc2F2ZWRcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdW5zYXZlZENoaWxkcmVuKG9iaiwgYWxsb3dEZWVwVW5zYXZlZCkge1xuICBjb25zdCBlbmNvdW50ZXJlZCA9IHtcbiAgICBvYmplY3RzOiB7fSxcbiAgICBmaWxlczogW11cbiAgfTtcbiAgY29uc3QgaWRlbnRpZmllciA9IG9iai5jbGFzc05hbWUgKyAnOicgKyBvYmouX2dldElkKCk7XG4gIGVuY291bnRlcmVkLm9iamVjdHNbaWRlbnRpZmllcl0gPSBvYmouZGlydHkoKSA/IG9iaiA6IHRydWU7XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSBvYmouYXR0cmlidXRlcztcbiAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXNbYXR0cl0gPT09ICdvYmplY3QnKSB7XG4gICAgICB0cmF2ZXJzZShhdHRyaWJ1dGVzW2F0dHJdLCBlbmNvdW50ZXJlZCwgZmFsc2UsICEhYWxsb3dEZWVwVW5zYXZlZCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHVuc2F2ZWQgPSBbXTtcbiAgZm9yIChjb25zdCBpZCBpbiBlbmNvdW50ZXJlZC5vYmplY3RzKSB7XG4gICAgaWYgKGlkICE9PSBpZGVudGlmaWVyICYmIGVuY291bnRlcmVkLm9iamVjdHNbaWRdICE9PSB0cnVlKSB7XG4gICAgICB1bnNhdmVkLnB1c2goZW5jb3VudGVyZWQub2JqZWN0c1tpZF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKDAsIF9jb25jYXQuZGVmYXVsdCkodW5zYXZlZCkuY2FsbCh1bnNhdmVkLCBlbmNvdW50ZXJlZC5maWxlcyk7XG59XG5mdW5jdGlvbiB0cmF2ZXJzZShvYmosIGVuY291bnRlcmVkLCBzaG91bGRUaHJvdywgYWxsb3dEZWVwVW5zYXZlZCkge1xuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgIGlmICghb2JqLmlkICYmIHNob3VsZFRocm93KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBwb2ludGVyIHRvIGFuIHVuc2F2ZWQgT2JqZWN0LicpO1xuICAgIH1cbiAgICBjb25zdCBpZGVudGlmaWVyID0gb2JqLmNsYXNzTmFtZSArICc6JyArIG9iai5fZ2V0SWQoKTtcbiAgICBpZiAoIWVuY291bnRlcmVkLm9iamVjdHNbaWRlbnRpZmllcl0pIHtcbiAgICAgIGVuY291bnRlcmVkLm9iamVjdHNbaWRlbnRpZmllcl0gPSBvYmouZGlydHkoKSA/IG9iaiA6IHRydWU7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gb2JqLmF0dHJpYnV0ZXM7XG4gICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXNbYXR0cl0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdHJhdmVyc2UoYXR0cmlidXRlc1thdHRyXSwgZW5jb3VudGVyZWQsICFhbGxvd0RlZXBVbnNhdmVkLCBhbGxvd0RlZXBVbnNhdmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG9iaiBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCkge1xuICAgIHZhciBfY29udGV4dDtcbiAgICBpZiAoIW9iai51cmwoKSAmJiAoMCwgX2luZGV4T2YuZGVmYXVsdCkoX2NvbnRleHQgPSBlbmNvdW50ZXJlZC5maWxlcykuY2FsbChfY29udGV4dCwgb2JqKSA8IDApIHtcbiAgICAgIGVuY291bnRlcmVkLmZpbGVzLnB1c2gob2JqKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChvYmogaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkob2JqKSkge1xuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShvYmopLmNhbGwob2JqLCBlbCA9PiB7XG4gICAgICBpZiAodHlwZW9mIGVsID09PSAnb2JqZWN0Jykge1xuICAgICAgICB0cmF2ZXJzZShlbCwgZW5jb3VudGVyZWQsIHNob3VsZFRocm93LCBhbGxvd0RlZXBVbnNhdmVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgaWYgKHR5cGVvZiBvYmpba10gPT09ICdvYmplY3QnKSB7XG4gICAgICB0cmF2ZXJzZShvYmpba10sIGVuY291bnRlcmVkLCBzaG91bGRUaHJvdywgYWxsb3dEZWVwVW5zYXZlZCk7XG4gICAgfVxuICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF91dWlkID0gcmVxdWlyZShcInV1aWRcIik7XG5sZXQgdXVpZCA9IF91dWlkLnY0O1xubW9kdWxlLmV4cG9ydHMgPSB1dWlkO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdXVpZDsiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEVuY3J5cHRlZFBERkVycm9yLCBGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yLCBGb3JlaWduUGFnZUVycm9yLCBSZW1vdmVQYWdlRnJvbUVtcHR5RG9jdW1lbnRFcnJvciwgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCBQREZFbWJlZGRlZFBhZ2UgZnJvbSBcIi4vUERGRW1iZWRkZWRQYWdlXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi9QREZGb250XCI7XG5pbXBvcnQgUERGSW1hZ2UgZnJvbSBcIi4vUERGSW1hZ2VcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuL1BERlBhZ2VcIjtcbmltcG9ydCBQREZGb3JtIGZyb20gXCIuL2Zvcm0vUERGRm9ybVwiO1xuaW1wb3J0IHsgUGFnZVNpemVzIH0gZnJvbSBcIi4vc2l6ZXNcIjtcbmltcG9ydCB7IEN1c3RvbUZvbnRFbWJlZGRlciwgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLCBKcGVnRW1iZWRkZXIsIFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yLCBQREZDYXRhbG9nLCBQREZDb250ZXh0LCBQREZEaWN0LCBQREZIZXhTdHJpbmcsIFBERk5hbWUsIFBERk9iamVjdENvcGllciwgUERGUGFnZUVtYmVkZGVyLCBQREZQYWdlTGVhZiwgUERGUGFnZVRyZWUsIFBERlBhcnNlciwgUERGU3RyZWFtV3JpdGVyLCBQREZTdHJpbmcsIFBERldyaXRlciwgUG5nRW1iZWRkZXIsIFN0YW5kYXJkRm9udEVtYmVkZGVyLCBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yLCB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBQYXJzZVNwZWVkcywgfSBmcm9tIFwiLi9QREZEb2N1bWVudE9wdGlvbnNcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQsIGFzc2VydE9yVW5kZWZpbmVkLCBhc3NlcnRSYW5nZSwgQ2FjaGUsIGNhbkJlQ29udmVydGVkVG9VaW50OEFycmF5LCBlbmNvZGVUb0Jhc2U2NCwgaXNTdGFuZGFyZEZvbnQsIHBsdWNrSW5kaWNlcywgcmFuZ2UsIHRvVWludDhBcnJheSwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCBGaWxlRW1iZWRkZXIsIHsgQUZSZWxhdGlvbnNoaXAgfSBmcm9tIFwiLi4vY29yZS9lbWJlZGRlcnMvRmlsZUVtYmVkZGVyXCI7XG5pbXBvcnQgUERGRW1iZWRkZWRGaWxlIGZyb20gXCIuL1BERkVtYmVkZGVkRmlsZVwiO1xuaW1wb3J0IFBERkphdmFTY3JpcHQgZnJvbSBcIi4vUERGSmF2YVNjcmlwdFwiO1xuaW1wb3J0IEphdmFTY3JpcHRFbWJlZGRlciBmcm9tIFwiLi4vY29yZS9lbWJlZGRlcnMvSmF2YVNjcmlwdEVtYmVkZGVyXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBQREYgZG9jdW1lbnQuXG4gKi9cbnZhciBQREZEb2N1bWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZEb2N1bWVudChjb250ZXh0LCBpZ25vcmVFbmNyeXB0aW9uLCB1cGRhdGVNZXRhZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvKiogVGhlIGRlZmF1bHQgd29yZCBicmVha3MgdXNlZCBpbiBQREZQYWdlLmRyYXdUZXh0ICovXG4gICAgICAgIHRoaXMuZGVmYXVsdFdvcmRCcmVha3MgPSBbJyAnXTtcbiAgICAgICAgdGhpcy5jb21wdXRlUGFnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcGFnZXMgPSBbXTtcbiAgICAgICAgICAgIF90aGlzLmNhdGFsb2cuUGFnZXMoKS50cmF2ZXJzZShmdW5jdGlvbiAobm9kZSwgcmVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBQREZQYWdlTGVhZikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFnZSA9IF90aGlzLnBhZ2VNYXAuZ2V0KG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBQREZQYWdlLm9mKG5vZGUsIHJlZiwgX3RoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucGFnZU1hcC5zZXQobm9kZSwgcGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFnZXMucHVzaChwYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYWdlcztcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRPckNyZWF0ZUZvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYWNyb0Zvcm0gPSBfdGhpcy5jYXRhbG9nLmdldE9yQ3JlYXRlQWNyb0Zvcm0oKTtcbiAgICAgICAgICAgIHJldHVybiBQREZGb3JtLm9mKGFjcm9Gb3JtLCBfdGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIGFzc2VydElzKGNvbnRleHQsICdjb250ZXh0JywgW1tQREZDb250ZXh0LCAnUERGQ29udGV4dCddXSk7XG4gICAgICAgIGFzc2VydElzKGlnbm9yZUVuY3J5cHRpb24sICdpZ25vcmVFbmNyeXB0aW9uJywgWydib29sZWFuJ10pO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmNhdGFsb2cgPSBjb250ZXh0Lmxvb2t1cChjb250ZXh0LnRyYWlsZXJJbmZvLlJvb3QpO1xuICAgICAgICB0aGlzLmlzRW5jcnlwdGVkID0gISFjb250ZXh0Lmxvb2t1cChjb250ZXh0LnRyYWlsZXJJbmZvLkVuY3J5cHQpO1xuICAgICAgICB0aGlzLnBhZ2VDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KHRoaXMuY29tcHV0ZVBhZ2VzKTtcbiAgICAgICAgdGhpcy5wYWdlTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmZvcm1DYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KHRoaXMuZ2V0T3JDcmVhdGVGb3JtKTtcbiAgICAgICAgdGhpcy5mb250cyA9IFtdO1xuICAgICAgICB0aGlzLmltYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLmVtYmVkZGVkUGFnZXMgPSBbXTtcbiAgICAgICAgdGhpcy5lbWJlZGRlZEZpbGVzID0gW107XG4gICAgICAgIHRoaXMuamF2YVNjcmlwdHMgPSBbXTtcbiAgICAgICAgaWYgKCFpZ25vcmVFbmNyeXB0aW9uICYmIHRoaXMuaXNFbmNyeXB0ZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRW5jcnlwdGVkUERGRXJyb3IoKTtcbiAgICAgICAgaWYgKHVwZGF0ZU1ldGFkYXRhKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVJbmZvRGljdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkIGFuIGV4aXN0aW5nIFtbUERGRG9jdW1lbnRdXS4gVGhlIGlucHV0IGRhdGEgY2FuIGJlIHByb3ZpZGVkIGluXG4gICAgICogbXVsdGlwbGUgZm9ybWF0czpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICB8IENvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGBzdHJpbmdgICAgICAgfCBBIGJhc2U2NCBlbmNvZGVkIHN0cmluZyAob3IgZGF0YSBVUkkpIGNvbnRhaW5pbmcgYSBQREYgfFxuICAgICAqIHwgYFVpbnQ4QXJyYXlgICB8IFRoZSByYXcgYnl0ZXMgb2YgYSBQREYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgQXJyYXlCdWZmZXJgIHwgVGhlIHJhdyBieXRlcyBvZiBhIFBERiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogLy8gcGRmPXN0cmluZ1xuICAgICAqIGNvbnN0IGJhc2U2NCA9XG4gICAgICogICdKVkJFUmkweExqY0tKWUdCZ1lFS0NqVWdNQ0J2WW1vS1BEd0tMMFpwYkhSbGNpQXZSbXhoZEdWRVpXTnZaR1VLTDB4bGJtJyArXG4gICAgICogICdkMGFDQXhNRFFLUGo0S2MzUnlaV0Z0Q25pY2N3cmhNbEFBd2FKMExuMlAxSnl5MUpMTTVFUmRjME1qQ3dVakU0V1FOQzRRJyArXG4gICAgICogICc2Y05sQ0Zaa3FHQ3FZR1NxRUpMTFpXTnVZR1ppWm1ia1l1WnNabWxtWkdSZ1ptbHVEQ1FOemMzTlRNMk56ZHpNWE14TWpRJyArXG4gICAgICogICd6dEZFS3l1RUswdUZ4RHVBQU9FUmRWQ21WdVpITjBjbVZoYlFwbGJtUnZZbW9LQ2pZZ01DQnZZbW9LUER3S0wwWnBiSFJsJyArXG4gICAgICogICdjaUF2Um14aGRHVkVaV052WkdVS0wxUjVjR1VnTDA5aWFsTjBiUW92VGlBMENpOUdhWEp6ZENBeU1Bb3ZUR1Z1WjNSb0lEJyArXG4gICAgICogICdJeE5RbytQZ3B6ZEhKbFlXMEtlSnhWajlHcXdqQU1odS96RkhrQnpUbzNuQ0NDaWlLSUhQRUlDdUpGM2NLb1NDdTJFOC9iJyArXG4gICAgICogICcyMHdQSXIxcDh2OS84a1ZoZ2lsbUdmYXdYMkNHYVZyZ2NBaTAvYnN5MGxyWDdJR1dwdko0aUpZRU4zZ0VtcnJHQmxRd0dzJyArXG4gICAgICogICdISE85VkJYMXdOcnhBcU1YODdSQkQ1eHBKdWRkcXdkODJ0akFIeHpWMVU1TFBneTUyREtYV25yMUxoZWcrai9jL3B6R1ZyJyArXG4gICAgICogICdpcVYwVmx3WlBYR1BDSmpFbHcveWJrd1VtZW9XZ3hlc0RYR2hISkMvRC9paWtwMUF2ODBwdEtVMEZkQkVlMjVwUGloQU0xJyArXG4gICAgICogICd1Nnl0Z2FhV2ZzMkhyejM1Q0pUMStFV21BS1pXNWtjM1J5WldGdENtVnVaRzlpYWdvS055QXdJRzlpYWdvOFBBb3ZVMmw2JyArXG4gICAgICogICdaU0E0Q2k5U2IyOTBJRElnTUNCU0NpOUdhV3gwWlhJZ0wwWnNZWFJsUkdWamIyUmxDaTlVZVhCbElDOVlVbVZtQ2k5TVpXJyArXG4gICAgICogICc1bmRHZ2dNemdLTDFjZ1d5QXhJRElnTWlCZENpOUpibVJsZUNCYklEQWdPQ0JkQ2o0K0NuTjBjbVZoYlFwNG5CWEV3UkVBJyArXG4gICAgICogICdFQkFFc0N3ejN2cnZSbU9PeXlPb0doWmR1dEhOMk1UNTVmSUFWb2NEK0FwbGJtUnpkSEpsWVcwS1pXNWtiMkpxQ2dwemRHJyArXG4gICAgICogICdGeWRIaHlaV1lLTlRFd0NpVWxSVTlHJ1xuICAgICAqXG4gICAgICogY29uc3QgZGF0YVVyaSA9ICdkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsJyArIGJhc2U2NFxuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jMSA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoYmFzZTY0KVxuICAgICAqIGNvbnN0IHBkZkRvYzIgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKGRhdGFVcmkpXG4gICAgICpcbiAgICAgKiAvLyBwZGY9VWludDhBcnJheVxuICAgICAqIGltcG9ydCBmcyBmcm9tICdmcydcbiAgICAgKiBjb25zdCB1aW50OEFycmF5ID0gZnMucmVhZEZpbGVTeW5jKCd3aXRoX3VwZGF0ZV9zZWN0aW9ucy5wZGYnKVxuICAgICAqIGNvbnN0IHBkZkRvYzMgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKHVpbnQ4QXJyYXkpXG4gICAgICpcbiAgICAgKiAvLyBwZGY9QXJyYXlCdWZmZXJcbiAgICAgKiBjb25zdCB1cmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvd2l0aF91cGRhdGVfc2VjdGlvbnMucGRmJ1xuICAgICAqIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKHJlcyA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBjb25zdCBwZGZEb2M0ID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZChhcnJheUJ1ZmZlcilcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHBkZiBUaGUgaW5wdXQgZGF0YSBjb250YWluaW5nIGEgUERGIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBsb2FkaW5nIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIGEgZG9jdW1lbnQgbG9hZGVkIGZyb20gdGhlIGlucHV0LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LmxvYWQgPSBmdW5jdGlvbiAocGRmLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgaWdub3JlRW5jcnlwdGlvbiwgX2IsIHBhcnNlU3BlZWQsIF9jLCB0aHJvd09uSW52YWxpZE9iamVjdCwgX2QsIHVwZGF0ZU1ldGFkYXRhLCBfZSwgY2FwTnVtYmVycywgYnl0ZXMsIGNvbnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9mKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9wdGlvbnMuaWdub3JlRW5jcnlwdGlvbiwgaWdub3JlRW5jcnlwdGlvbiA9IF9hID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hLCBfYiA9IG9wdGlvbnMucGFyc2VTcGVlZCwgcGFyc2VTcGVlZCA9IF9iID09PSB2b2lkIDAgPyBQYXJzZVNwZWVkcy5TbG93IDogX2IsIF9jID0gb3B0aW9ucy50aHJvd09uSW52YWxpZE9iamVjdCwgdGhyb3dPbkludmFsaWRPYmplY3QgPSBfYyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYywgX2QgPSBvcHRpb25zLnVwZGF0ZU1ldGFkYXRhLCB1cGRhdGVNZXRhZGF0YSA9IF9kID09PSB2b2lkIDAgPyB0cnVlIDogX2QsIF9lID0gb3B0aW9ucy5jYXBOdW1iZXJzLCBjYXBOdW1iZXJzID0gX2UgPT09IHZvaWQgMCA/IGZhbHNlIDogX2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhwZGYsICdwZGYnLCBbJ3N0cmluZycsIFVpbnQ4QXJyYXksIEFycmF5QnVmZmVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhpZ25vcmVFbmNyeXB0aW9uLCAnaWdub3JlRW5jcnlwdGlvbicsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHBhcnNlU3BlZWQsICdwYXJzZVNwZWVkJywgWydudW1iZXInXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyh0aHJvd09uSW52YWxpZE9iamVjdCwgJ3Rocm93T25JbnZhbGlkT2JqZWN0JywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSB0b1VpbnQ4QXJyYXkocGRmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFBERlBhcnNlci5mb3JCeXRlc1dpdGhPcHRpb25zKGJ5dGVzLCBwYXJzZVNwZWVkLCB0aHJvd09uSW52YWxpZE9iamVjdCwgY2FwTnVtYmVycykucGFyc2VEb2N1bWVudCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IF9mLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUERGRG9jdW1lbnQoY29udGV4dCwgaWdub3JlRW5jcnlwdGlvbiwgdXBkYXRlTWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgW1tQREZEb2N1bWVudF1dLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQuY3JlYXRlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCB1cGRhdGVNZXRhZGF0YSwgY29udGV4dCwgcGFnZVRyZWUsIHBhZ2VUcmVlUmVmLCBjYXRhbG9nO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIF9hID0gb3B0aW9ucy51cGRhdGVNZXRhZGF0YSwgdXBkYXRlTWV0YWRhdGEgPSBfYSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hO1xuICAgICAgICAgICAgICAgIGNvbnRleHQgPSBQREZDb250ZXh0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgIHBhZ2VUcmVlID0gUERGUGFnZVRyZWUud2l0aENvbnRleHQoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgcGFnZVRyZWVSZWYgPSBjb250ZXh0LnJlZ2lzdGVyKHBhZ2VUcmVlKTtcbiAgICAgICAgICAgICAgICBjYXRhbG9nID0gUERGQ2F0YWxvZy53aXRoQ29udGV4dEFuZFBhZ2VzKGNvbnRleHQsIHBhZ2VUcmVlUmVmKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnRyYWlsZXJJbmZvLlJvb3QgPSBjb250ZXh0LnJlZ2lzdGVyKGNhdGFsb2cpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUERGRG9jdW1lbnQoY29udGV4dCwgZmFsc2UsIHVwZGF0ZU1ldGFkYXRhKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIGZvbnRraXQgaW5zdGFuY2UuIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBjdXN0b20gZm9udHMgY2FuXG4gICAgICogYmUgZW1iZWRkZWQuIFNlZSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL0hvcGRpbmcvcGRmLWxpYi90cmVlL21hc3RlciNmb250a2l0LWluc3RhbGxhdGlvbilcbiAgICAgKiBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBpbnN0YWxsIGFuZCByZWdpc3RlciBhIGZvbnRraXQgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiA+IFlvdSBkbyAqKm5vdCoqIG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCB0byBlbWJlZCBzdGFuZGFyZCBmb250cy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqIGltcG9ydCBmb250a2l0IGZyb20gJ0BwZGYtbGliL2ZvbnRraXQnXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIHBkZkRvYy5yZWdpc3RlckZvbnRraXQoZm9udGtpdClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb250a2l0IFRoZSBmb250a2l0IGluc3RhbmNlIHRvIGJlIHJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnJlZ2lzdGVyRm9udGtpdCA9IGZ1bmN0aW9uIChmb250a2l0KSB7XG4gICAgICAgIHRoaXMuZm9udGtpdCA9IGZvbnRraXQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIFtbUERGRm9ybV1dIGNvbnRhaW5pbmcgYWxsIGludGVyYWN0aXZlIGZpZWxkcyBmb3IgdGhpcyBkb2N1bWVudC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZmllbGRzID0gZm9ybS5nZXRGaWVsZHMoKVxuICAgICAqIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgKiAgIGNvbnN0IHR5cGUgPSBmaWVsZC5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICogICBjb25zdCBuYW1lID0gZmllbGQuZ2V0TmFtZSgpXG4gICAgICogICBjb25zb2xlLmxvZyhgJHt0eXBlfTogJHtuYW1lfWApXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgZm9ybSBmb3IgdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0Rm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZvcm0gPSB0aGlzLmZvcm1DYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgaWYgKGZvcm0uaGFzWEZBKCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVtb3ZpbmcgWEZBIGZvcm0gZGF0YSBhcyBwZGYtbGliIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBvciB3cml0aW5nIFhGQScpO1xuICAgICAgICAgICAgZm9ybS5kZWxldGVYRkEoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3MgdGl0bGUgbWV0YWRhdGEuIFRoZSB0aXRsZSBhcHBlYXJzIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0aXRsZSA9IHBkZkRvYy5nZXRUaXRsZSgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgdGl0bGUgb2YgdGhpcyBkb2N1bWVudCwgaWYgaXQgaGFzIG9uZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0VGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0aXRsZSA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5UaXRsZSk7XG4gICAgICAgIGlmICghdGl0bGUpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyh0aXRsZSk7XG4gICAgICAgIHJldHVybiB0aXRsZS5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBkb2N1bWVudCdzIGF1dGhvciBtZXRhZGF0YS4gVGhlIGF1dGhvciBhcHBlYXJzIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBhdXRob3IgPSBwZGZEb2MuZ2V0QXV0aG9yKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBhdXRob3Igb2YgdGhpcyBkb2N1bWVudCwgaWYgaXQgaGFzIG9uZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0QXV0aG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXV0aG9yID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLkF1dGhvcik7XG4gICAgICAgIGlmICghYXV0aG9yKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcoYXV0aG9yKTtcbiAgICAgICAgcmV0dXJuIGF1dGhvci5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBkb2N1bWVudCdzIHN1YmplY3QgbWV0YWRhdGEuIFRoZSBzdWJqZWN0IGFwcGVhcnMgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHN1YmplY3QgPSBwZGZEb2MuZ2V0U3ViamVjdCgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3ViamVjdCBvZiB0aGlzIGRvY3VtZW50LCBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRTdWJqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3ViamVjdCA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5TdWJqZWN0KTtcbiAgICAgICAgaWYgKCFzdWJqZWN0KVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcoc3ViamVjdCk7XG4gICAgICAgIHJldHVybiBzdWJqZWN0LmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3Mga2V5d29yZHMgbWV0YWRhdGEuIFRoZSBrZXl3b3JkcyBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGtleXdvcmRzID0gcGRmRG9jLmdldEtleXdvcmRzKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBrZXl3b3JkcyBvZiB0aGlzIGRvY3VtZW50LCBpZiBpdCBoYXMgYW55LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRLZXl3b3JkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGtleXdvcmRzID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLktleXdvcmRzKTtcbiAgICAgICAgaWYgKCFrZXl3b3JkcylcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKGtleXdvcmRzKTtcbiAgICAgICAgcmV0dXJuIGtleXdvcmRzLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3MgY3JlYXRvciBtZXRhZGF0YS4gVGhlIGNyZWF0b3IgYXBwZWFycyBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY3JlYXRvciA9IHBkZkRvYy5nZXRDcmVhdG9yKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjcmVhdG9yIG9mIHRoaXMgZG9jdW1lbnQsIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldENyZWF0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjcmVhdG9yID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLkNyZWF0b3IpO1xuICAgICAgICBpZiAoIWNyZWF0b3IpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhjcmVhdG9yKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0b3IuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBwcm9kdWNlciBtZXRhZGF0YS4gVGhlIHByb2R1Y2VyIGFwcGVhcnMgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHByb2R1Y2VyID0gcGRmRG9jLmdldFByb2R1Y2VyKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBwcm9kdWNlciBvZiB0aGlzIGRvY3VtZW50LCBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRQcm9kdWNlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByb2R1Y2VyID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLlByb2R1Y2VyKTtcbiAgICAgICAgaWYgKCFwcm9kdWNlcilcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKHByb2R1Y2VyKTtcbiAgICAgICAgcmV0dXJuIHByb2R1Y2VyLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3MgY3JlYXRpb24gZGF0ZSBtZXRhZGF0YS4gVGhlIGNyZWF0aW9uIGRhdGUgYXBwZWFycyBpblxuICAgICAqIHRoZSBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY3JlYXRpb25EYXRlID0gcGRmRG9jLmdldENyZWF0aW9uRGF0ZSgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQSBEYXRlIGNvbnRhaW5pbmcgdGhlIGNyZWF0aW9uIGRhdGUgb2YgdGhpcyBkb2N1bWVudCxcbiAgICAgKiAgICAgICAgICBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRDcmVhdGlvbkRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjcmVhdGlvbkRhdGUgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuQ3JlYXRpb25EYXRlKTtcbiAgICAgICAgaWYgKCFjcmVhdGlvbkRhdGUpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhjcmVhdGlvbkRhdGUpO1xuICAgICAgICByZXR1cm4gY3JlYXRpb25EYXRlLmRlY29kZURhdGUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3MgbW9kaWZpY2F0aW9uIGRhdGUgbWV0YWRhdGEuIFRoZSBtb2RpZmljYXRpb24gZGF0ZVxuICAgICAqIGFwcGVhcnMgaW4gdGhlIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG1vZGlmaWNhdGlvbiA9IHBkZkRvYy5nZXRNb2RpZmljYXRpb25EYXRlKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIERhdGUgY29udGFpbmluZyB0aGUgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhpcyBkb2N1bWVudCxcbiAgICAgKiAgICAgICAgICBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRNb2RpZmljYXRpb25EYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5Nb2REYXRlKTtcbiAgICAgICAgaWYgKCFtb2RpZmljYXRpb25EYXRlKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcobW9kaWZpY2F0aW9uRGF0ZSk7XG4gICAgICAgIHJldHVybiBtb2RpZmljYXRpb25EYXRlLmRlY29kZURhdGUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgdGl0bGUgbWV0YWRhdGEuIFRoZSB0aXRsZSB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldFRpdGxlKCfwn6WaIFRoZSBMaWZlIG9mIGFuIEVnZyDwn42zJylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRvIGRpc3BsYXkgdGhlIHRpdGxlIGluIHRoZSB3aW5kb3cncyB0aXRsZSBiYXIsIHNldCB0aGVcbiAgICAgKiBgc2hvd0luV2luZG93VGl0bGVCYXJgIG9wdGlvbiB0byBgdHJ1ZWAgKHdvcmtzIGZvciBfbW9zdF8gUERGIHJlYWRlcnMpLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldFRpdGxlKCfwn6WaIFRoZSBMaWZlIG9mIGFuIEVnZyDwn42zJywgeyBzaG93SW5XaW5kb3dUaXRsZUJhcjogdHJ1ZSB9KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSBvZiB0aGlzIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBzZXR0aW5nIHRoZSB0aXRsZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0VGl0bGUgPSBmdW5jdGlvbiAodGl0bGUsIG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0SXModGl0bGUsICd0aXRsZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignVGl0bGUnKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERkhleFN0cmluZy5mcm9tVGV4dCh0aXRsZSkpO1xuICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IHJlYWRlcnMgc2hvdWxkIGRpc3BsYXkgdGhlIHRpdGxlIHJhdGhlciB0aGFuIHRoZSBmaWxlbmFtZVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNob3dJbldpbmRvd1RpdGxlQmFyKSB7XG4gICAgICAgICAgICB2YXIgcHJlZnMgPSB0aGlzLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpO1xuICAgICAgICAgICAgcHJlZnMuc2V0RGlzcGxheURvY1RpdGxlKHRydWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIGF1dGhvciBtZXRhZGF0YS4gVGhlIGF1dGhvciB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldEF1dGhvcignSHVtcHR5IER1bXB0eScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGF1dGhvciBUaGUgYXV0aG9yIG9mIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldEF1dGhvciA9IGZ1bmN0aW9uIChhdXRob3IpIHtcbiAgICAgICAgYXNzZXJ0SXMoYXV0aG9yLCAnYXV0aG9yJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdBdXRob3InKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERkhleFN0cmluZy5mcm9tVGV4dChhdXRob3IpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3Mgc3ViamVjdCBtZXRhZGF0YS4gVGhlIHN1YmplY3Qgd2lsbCBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRTdWJqZWN0KCfwn5OYIEFuIEVwaWMgVGFsZSBvZiBXb2Ug8J+TlicpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHN1YmplY3QgVGhlIHN1YmplY3Qgb2YgdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0U3ViamVjdCA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgIGFzc2VydElzKHN1YmplY3QsICdhdXRob3InLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ1N1YmplY3QnKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERkhleFN0cmluZy5mcm9tVGV4dChzdWJqZWN0KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIGtleXdvcmQgbWV0YWRhdGEuIFRoZXNlIGtleXdvcmRzIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0S2V5d29yZHMoWydlZ2dzJywgJ3dhbGwnLCAnZmFsbCcsICdraW5nJywgJ2hvcnNlcycsICdtZW4nXSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0ga2V5d29yZHMgQW4gYXJyYXkgb2Yga2V5d29yZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldEtleXdvcmRzID0gZnVuY3Rpb24gKGtleXdvcmRzKSB7XG4gICAgICAgIGFzc2VydElzKGtleXdvcmRzLCAna2V5d29yZHMnLCBbQXJyYXldKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ0tleXdvcmRzJyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZIZXhTdHJpbmcuZnJvbVRleHQoa2V5d29yZHMuam9pbignICcpKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIGNyZWF0b3IgbWV0YWRhdGEuIFRoZSBjcmVhdG9yIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0Q3JlYXRvcignUERGIEFwcCA5MDAwIPCfpJYnKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjcmVhdG9yIFRoZSBjcmVhdG9yIG9mIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldENyZWF0b3IgPSBmdW5jdGlvbiAoY3JlYXRvcikge1xuICAgICAgICBhc3NlcnRJcyhjcmVhdG9yLCAnY3JlYXRvcicsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignQ3JlYXRvcicpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KGNyZWF0b3IpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgcHJvZHVjZXIgbWV0YWRhdGEuIFRoZSBwcm9kdWNlciB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldFByb2R1Y2VyKCdQREYgQXBwIDkwMDAg8J+klicpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHByb2R1Y2VyIFRoZSBwcm9kdWNlciBvZiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRQcm9kdWNlciA9IGZ1bmN0aW9uIChwcm9kdWNlcikge1xuICAgICAgICBhc3NlcnRJcyhwcm9kdWNlciwgJ2NyZWF0b3InLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ1Byb2R1Y2VyJyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZIZXhTdHJpbmcuZnJvbVRleHQocHJvZHVjZXIpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgbGFuZ3VhZ2UgbWV0YWRhdGEuIFRoZSBsYW5ndWFnZSB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIHNvbWUgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldExhbmd1YWdlKCdlbi11cycpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgQW4gUkZDIDMwNjYgX0xhbmd1YWdlLVRhZ18gZGVub3RpbmcgdGhlIGxhbmd1YWdlIG9mIHRoaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgZG9jdW1lbnQsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgbGFuZ3VhZ2UgaXMgdW5rbm93bi5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0TGFuZ3VhZ2UgPSBmdW5jdGlvbiAobGFuZ3VhZ2UpIHtcbiAgICAgICAgYXNzZXJ0SXMobGFuZ3VhZ2UsICdsYW5ndWFnZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignTGFuZycpO1xuICAgICAgICB0aGlzLmNhdGFsb2cuc2V0KGtleSwgUERGU3RyaW5nLm9mKGxhbmd1YWdlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIGNyZWF0aW9uIGRhdGUgbWV0YWRhdGEuIFRoZSBjcmVhdGlvbiBkYXRlIHdpbGwgYXBwZWFyXG4gICAgICogaW4gdGhlIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0Q3JlYXRpb25EYXRlKG5ldyBEYXRlKCkpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNyZWF0aW9uRGF0ZSBUaGUgZGF0ZSB0aGlzIGRvY3VtZW50IHdhcyBjcmVhdGVkLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRDcmVhdGlvbkRhdGUgPSBmdW5jdGlvbiAoY3JlYXRpb25EYXRlKSB7XG4gICAgICAgIGFzc2VydElzKGNyZWF0aW9uRGF0ZSwgJ2NyZWF0aW9uRGF0ZScsIFtbRGF0ZSwgJ0RhdGUnXV0pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignQ3JlYXRpb25EYXRlJyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZTdHJpbmcuZnJvbURhdGUoY3JlYXRpb25EYXRlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIG1vZGlmaWNhdGlvbiBkYXRlIG1ldGFkYXRhLiBUaGUgbW9kaWZpY2F0aW9uIGRhdGUgd2lsbFxuICAgICAqIGFwcGVhciBpbiB0aGUgXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3JcbiAgICAgKiBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldE1vZGlmaWNhdGlvbkRhdGUobmV3IERhdGUoKSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbW9kaWZpY2F0aW9uRGF0ZSBUaGUgZGF0ZSB0aGlzIGRvY3VtZW50IHdhcyBsYXN0IG1vZGlmaWVkLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRNb2RpZmljYXRpb25EYXRlID0gZnVuY3Rpb24gKG1vZGlmaWNhdGlvbkRhdGUpIHtcbiAgICAgICAgYXNzZXJ0SXMobW9kaWZpY2F0aW9uRGF0ZSwgJ21vZGlmaWNhdGlvbkRhdGUnLCBbW0RhdGUsICdEYXRlJ11dKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ01vZERhdGUnKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERlN0cmluZy5mcm9tRGF0ZShtb2RpZmljYXRpb25EYXRlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBwYWdlcyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0b3RhbFBhZ2VzID0gcGRmRG9jLmdldFBhZ2VDb3VudCgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRQYWdlQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2VDb3VudCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5wYWdlQ291bnQgPSB0aGlzLmdldFBhZ2VzKCkubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlQ291bnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgYW4gYXJyYXkgb2YgYWxsIHRoZSBwYWdlcyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4gVGhlIHBhZ2VzIGFyZVxuICAgICAqIHN0b3JlZCBpbiB0aGUgYXJyYXkgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IGFyZSByZW5kZXJlZCBpbiB0aGVcbiAgICAgKiBkb2N1bWVudC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwYWdlcyA9IHBkZkRvYy5nZXRQYWdlcygpXG4gICAgICogcGFnZXNbMF0gICAvLyBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBwYWdlc1syXSAgIC8vIFRoZSB0aGlyZCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBhZ2VzWzE5N10gLy8gVGhlIDE5OHRoIHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgYWxsIHRoZSBwYWdlcyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0UGFnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2VDYWNoZS5hY2Nlc3MoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcGFnZSByZW5kZXJlZCBhdCBhIHBhcnRpY3VsYXIgYGluZGV4YCBvZiB0aGUgZG9jdW1lbnQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLmdldFBhZ2UoMCkgICAvLyBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBwZGZEb2MuZ2V0UGFnZSgyKSAgIC8vIFRoZSB0aGlyZCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBkZkRvYy5nZXRQYWdlKDE5NykgLy8gVGhlIDE5OHRoIHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIFtbUERGUGFnZV1dIHJlbmRlcmVkIGF0IHRoZSBnaXZlbiBgaW5kZXhgIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0UGFnZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgcGFnZXMgPSB0aGlzLmdldFBhZ2VzKCk7XG4gICAgICAgIGFzc2VydFJhbmdlKGluZGV4LCAnaW5kZXgnLCAwLCBwYWdlcy5sZW5ndGggLSAxKTtcbiAgICAgICAgcmV0dXJuIHBhZ2VzW2luZGV4XTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhbiBhcnJheSBvZiBpbmRpY2VzIGZvciBhbGwgdGhlIHBhZ2VzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50LiBUaGVcbiAgICAgKiBhcnJheSB3aWxsIGNvbnRhaW4gYSByYW5nZSBvZiBpbnRlZ2VycyBmcm9tXG4gICAgICogYDAuLnBkZkRvYy5nZXRQYWdlQ291bnQoKSAtIDFgLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqIHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKiBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBpbmRpY2VzID0gcGRmRG9jLmdldFBhZ2VJbmRpY2VzKClcbiAgICAgKiBpbmRpY2VzIC8vID0+IFswLCAxLCAyXVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGluZGljZXMgZm9yIGFsbCBwYWdlcyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0UGFnZUluZGljZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiByYW5nZSgwLCB0aGlzLmdldFBhZ2VDb3VudCgpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgcGFnZSBhdCBhIGdpdmVuIGluZGV4IGZyb20gdGhpcyBkb2N1bWVudC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2MucmVtb3ZlUGFnZSgwKSAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBwZGZEb2MucmVtb3ZlUGFnZSgyKSAgIC8vIFJlbW92ZSB0aGUgdGhpcmQgcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBwZGZEb2MucmVtb3ZlUGFnZSgxOTcpIC8vIFJlbW92ZSB0aGUgMTk4dGggcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKiBPbmNlIGEgcGFnZSBoYXMgYmVlbiByZW1vdmVkLCBpdCB3aWxsIG5vIGxvbmdlciBiZSByZW5kZXJlZCBhdCB0aGF0IGluZGV4XG4gICAgICogaW4gdGhlIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHBhZ2UgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUucmVtb3ZlUGFnZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgcGFnZUNvdW50ID0gdGhpcy5nZXRQYWdlQ291bnQoKTtcbiAgICAgICAgaWYgKHRoaXMucGFnZUNvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yKCk7XG4gICAgICAgIGFzc2VydFJhbmdlKGluZGV4LCAnaW5kZXgnLCAwLCBwYWdlQ291bnQgLSAxKTtcbiAgICAgICAgdGhpcy5jYXRhbG9nLnJlbW92ZUxlYWZOb2RlKGluZGV4KTtcbiAgICAgICAgdGhpcy5wYWdlQ291bnQgPSBwYWdlQ291bnQgLSAxO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIGEgcGFnZSB0byB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgbWV0aG9kIGFjY2VwdHMgdGhyZWVcbiAgICAgKiBkaWZmZXJlbnQgdmFsdWUgdHlwZXMgZm9yIHRoZSBgcGFnZWAgcGFyYW1ldGVyOlxuICAgICAqXG4gICAgICogfCBUeXBlICAgICAgICAgICAgICAgfCBCZWhhdmlvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgdW5kZWZpbmVkYCAgICAgICAgfCBDcmVhdGUgYSBuZXcgcGFnZSBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhpcyBkb2N1bWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgW251bWJlciwgbnVtYmVyXWAgfCBDcmVhdGUgYSBuZXcgcGFnZSB3aXRoIHRoZSBnaXZlbiBkaW1lbnNpb25zIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGlzIGRvY3VtZW50ICB8XG4gICAgICogfCBgUERGUGFnZWAgICAgICAgICAgfCBBZGQgdGhlIGV4aXN0aW5nIHBhZ2UgdG8gdGhlIGVuZCBvZiB0aGlzIGRvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIHBhZ2U9dW5kZWZpbmVkXG4gICAgICogY29uc3QgbmV3UGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIC8vIHBhZ2U9W251bWJlciwgbnVtYmVyXVxuICAgICAqIGltcG9ydCB7IFBhZ2VTaXplcyB9IGZyb20gJ3BkZi1saWInXG4gICAgICogY29uc3QgbmV3UGFnZTEgPSBwZGZEb2MuYWRkUGFnZShQYWdlU2l6ZXMuQTcpXG4gICAgICogY29uc3QgbmV3UGFnZTIgPSBwZGZEb2MuYWRkUGFnZShQYWdlU2l6ZXMuTGV0dGVyKVxuICAgICAqIGNvbnN0IG5ld1BhZ2UzID0gcGRmRG9jLmFkZFBhZ2UoWzUwMCwgNzUwXSlcbiAgICAgKlxuICAgICAqIC8vIHBhZ2U9UERGUGFnZVxuICAgICAqIGNvbnN0IHBkZkRvYzEgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHBkZkRvYzIgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKC4uLilcbiAgICAgKiBjb25zdCBbZXhpc3RpbmdQYWdlXSA9IGF3YWl0IHBkZkRvYzEuY29weVBhZ2VzKHBkZkRvYzIsIFswXSlcbiAgICAgKiBwZGZEb2MxLmFkZFBhZ2UoZXhpc3RpbmdQYWdlKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHBhZ2UgT3B0aW9uYWxseSwgdGhlIGRlc2lyZWQgZGltZW5zaW9ucyBvciBleGlzdGluZyBwYWdlLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXdseSBjcmVhdGVkIChvciBleGlzdGluZykgcGFnZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuYWRkUGFnZSA9IGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgWyd1bmRlZmluZWQnLCBbUERGUGFnZSwgJ1BERlBhZ2UnXSwgQXJyYXldKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0UGFnZSh0aGlzLmdldFBhZ2VDb3VudCgpLCBwYWdlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydCBhIHBhZ2UgYXQgYSBnaXZlbiBpbmRleCB3aXRoaW4gdGhpcyBkb2N1bWVudC4gVGhpcyBtZXRob2QgYWNjZXB0c1xuICAgICAqIHRocmVlIGRpZmZlcmVudCB2YWx1ZSB0eXBlcyBmb3IgdGhlIGBwYWdlYCBwYXJhbWV0ZXI6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgICAgICB8IEJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgICAqIHwgYHVuZGVmaW5lZGAgICAgICAgIHwgQ3JlYXRlIGEgbmV3IHBhZ2UgYW5kIGluc2VydCBpdCBpbnRvIHRoaXMgZG9jdW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBbbnVtYmVyLCBudW1iZXJdYCB8IENyZWF0ZSBhIG5ldyBwYWdlIHdpdGggdGhlIGdpdmVuIGRpbWVuc2lvbnMgYW5kIGluc2VydCBpdCBpbnRvIHRoaXMgZG9jdW1lbnQgICB8XG4gICAgICogfCBgUERGUGFnZWAgICAgICAgICAgfCBJbnNlcnQgdGhlIGV4aXN0aW5nIHBhZ2UgaW50byB0aGlzIGRvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBwYWdlPXVuZGVmaW5lZFxuICAgICAqIGNvbnN0IG5ld1BhZ2UgPSBwZGZEb2MuaW5zZXJ0UGFnZSgyKVxuICAgICAqXG4gICAgICogLy8gcGFnZT1bbnVtYmVyLCBudW1iZXJdXG4gICAgICogaW1wb3J0IHsgUGFnZVNpemVzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKiBjb25zdCBuZXdQYWdlMSA9IHBkZkRvYy5pbnNlcnRQYWdlKDIsIFBhZ2VTaXplcy5BNylcbiAgICAgKiBjb25zdCBuZXdQYWdlMiA9IHBkZkRvYy5pbnNlcnRQYWdlKDAsIFBhZ2VTaXplcy5MZXR0ZXIpXG4gICAgICogY29uc3QgbmV3UGFnZTMgPSBwZGZEb2MuaW5zZXJ0UGFnZSgxOTgsIFs1MDAsIDc1MF0pXG4gICAgICpcbiAgICAgKiAvLyBwYWdlPVBERlBhZ2VcbiAgICAgKiBjb25zdCBwZGZEb2MxID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCBwZGZEb2MyID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZCguLi4pXG4gICAgICogY29uc3QgW2V4aXN0aW5nUGFnZV0gPSBhd2FpdCBwZGZEb2MxLmNvcHlQYWdlcyhwZGZEb2MyLCBbMF0pXG4gICAgICogcGRmRG9jMS5pbnNlcnRQYWdlKDAsIGV4aXN0aW5nUGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIHBhZ2Ugc2hvdWxkIGJlIGluc2VydGVkICh6ZXJvLWJhc2VkKS5cbiAgICAgKiBAcGFyYW0gcGFnZSBPcHRpb25hbGx5LCB0aGUgZGVzaXJlZCBkaW1lbnNpb25zIG9yIGV4aXN0aW5nIHBhZ2UuXG4gICAgICogQHJldHVybnMgVGhlIG5ld2x5IGNyZWF0ZWQgKG9yIGV4aXN0aW5nKSBwYWdlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5pbnNlcnRQYWdlID0gZnVuY3Rpb24gKGluZGV4LCBwYWdlKSB7XG4gICAgICAgIHZhciBwYWdlQ291bnQgPSB0aGlzLmdldFBhZ2VDb3VudCgpO1xuICAgICAgICBhc3NlcnRSYW5nZShpbmRleCwgJ2luZGV4JywgMCwgcGFnZUNvdW50KTtcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbJ3VuZGVmaW5lZCcsIFtQREZQYWdlLCAnUERGUGFnZSddLCBBcnJheV0pO1xuICAgICAgICBpZiAoIXBhZ2UgfHwgQXJyYXkuaXNBcnJheShwYWdlKSkge1xuICAgICAgICAgICAgdmFyIGRpbXMgPSBBcnJheS5pc0FycmF5KHBhZ2UpID8gcGFnZSA6IFBhZ2VTaXplcy5BNDtcbiAgICAgICAgICAgIHBhZ2UgPSBQREZQYWdlLmNyZWF0ZSh0aGlzKTtcbiAgICAgICAgICAgIHBhZ2Uuc2V0U2l6ZS5hcHBseShwYWdlLCBkaW1zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYWdlLmRvYyAhPT0gdGhpcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmVpZ25QYWdlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50UmVmID0gdGhpcy5jYXRhbG9nLmluc2VydExlYWZOb2RlKHBhZ2UucmVmLCBpbmRleCk7XG4gICAgICAgIHBhZ2Uubm9kZS5zZXRQYXJlbnQocGFyZW50UmVmKTtcbiAgICAgICAgdGhpcy5wYWdlTWFwLnNldChwYWdlLm5vZGUsIHBhZ2UpO1xuICAgICAgICB0aGlzLnBhZ2VDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMucGFnZUNvdW50ID0gcGFnZUNvdW50ICsgMTtcbiAgICAgICAgcmV0dXJuIHBhZ2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb3B5IHBhZ2VzIGZyb20gYSBzb3VyY2UgZG9jdW1lbnQgaW50byB0aGlzIGRvY3VtZW50LiBBbGxvd3MgcGFnZXMgdG8gYmVcbiAgICAgKiBjb3BpZWQgYmV0d2VlbiBkaWZmZXJlbnQgW1tQREZEb2N1bWVudF1dIGluc3RhbmNlcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHNyY0RvYyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoLi4uKVxuICAgICAqXG4gICAgICogY29uc3QgY29waWVkUGFnZXMgPSBhd2FpdCBwZGZEb2MuY29weVBhZ2VzKHNyY0RvYywgWzAsIDMsIDg5XSlcbiAgICAgKiBjb25zdCBbZmlyc3RQYWdlLCBmb3VydGhQYWdlLCBuaW5ldGlldGhQYWdlXSA9IGNvcGllZFBhZ2VzO1xuICAgICAqXG4gICAgICogcGRmRG9jLmFkZFBhZ2UoZm91cnRoUGFnZSlcbiAgICAgKiBwZGZEb2MuaW5zZXJ0UGFnZSgwLCBuaW5ldGlldGhQYWdlKVxuICAgICAqIHBkZkRvYy5hZGRQYWdlKGZpcnN0UGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gc3JjRG9jIFRoZSBkb2N1bWVudCBmcm9tIHdoaWNoIHBhZ2VzIHNob3VsZCBiZSBjb3BpZWQuXG4gICAgICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgb2YgdGhlIHBhZ2VzIHRoYXQgc2hvdWxkIGJlIGNvcGllZC5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHBhZ2VzIGNvcGllZCBpbnRvIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmNvcHlQYWdlcyA9IGZ1bmN0aW9uIChzcmNEb2MsIGluZGljZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvcGllciwgc3JjUGFnZXMsIGNvcGllZFBhZ2VzLCBpZHgsIGxlbiwgc3JjUGFnZSwgY29waWVkUGFnZSwgcmVmO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoc3JjRG9jLCAnc3JjRG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGluZGljZXMsICdpbmRpY2VzJywgW0FycmF5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBzcmNEb2MuZmx1c2goKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllciA9IFBERk9iamVjdENvcGllci5mb3Ioc3JjRG9jLmNvbnRleHQsIHRoaXMuY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmNQYWdlcyA9IHNyY0RvYy5nZXRQYWdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkUGFnZXMgPSBuZXcgQXJyYXkoaW5kaWNlcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpZHggPSAwLCBsZW4gPSBpbmRpY2VzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhZ2UgPSBzcmNQYWdlc1tpbmRpY2VzW2lkeF1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFBhZ2UgPSBjb3BpZXIuY29weShzcmNQYWdlLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMuY29udGV4dC5yZWdpc3Rlcihjb3BpZWRQYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRQYWdlc1tpZHhdID0gUERGUGFnZS5vZihjb3BpZWRQYWdlLCByZWYsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvcGllZFBhZ2VzXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgYSBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHNyY0RvYyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoLi4uKVxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IHNyY0RvYy5jb3B5KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqID4gKipOT1RFOioqICBUaGlzIG1ldGhvZCB3b24ndCBjb3B5IGFsbCBpbmZvcm1hdGlvbiBvdmVyIHRvIHRoZSBuZXdcbiAgICAgKiA+IGRvY3VtZW50IChhY3JvZm9ybXMsIG91dGxpbmVzLCBldGMuLi4pLlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCBhIGNvcHkgdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHBkZkNvcHksIGNvbnRlbnRQYWdlcywgaWR4LCBsZW47XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIFBERkRvY3VtZW50LmNyZWF0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHBkZkNvcHkuY29weVBhZ2VzKHRoaXMsIHRoaXMuZ2V0UGFnZUluZGljZXMoKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UGFnZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDAsIGxlbiA9IGNvbnRlbnRQYWdlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LmFkZFBhZ2UoY29udGVudFBhZ2VzW2lkeF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0QXV0aG9yKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0QXV0aG9yKHRoaXMuZ2V0QXV0aG9yKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q3JlYXRpb25EYXRlKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0Q3JlYXRpb25EYXRlKHRoaXMuZ2V0Q3JlYXRpb25EYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q3JlYXRvcigpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldENyZWF0b3IodGhpcy5nZXRDcmVhdG9yKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldE1vZGlmaWNhdGlvbkRhdGUodGhpcy5nZXRNb2RpZmljYXRpb25EYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UHJvZHVjZXIoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5zZXRQcm9kdWNlcih0aGlzLmdldFByb2R1Y2VyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U3ViamVjdCgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldFN1YmplY3QodGhpcy5nZXRTdWJqZWN0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0VGl0bGUoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5zZXRUaXRsZSh0aGlzLmdldFRpdGxlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5kZWZhdWx0V29yZEJyZWFrcyA9IHRoaXMuZGVmYXVsdFdvcmRCcmVha3M7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcGRmQ29weV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIEphdmFTY3JpcHQgdG8gdGhpcyBkb2N1bWVudC4gVGhlIHN1cHBsaWVkIGBzY3JpcHRgIGlzIGV4ZWN1dGVkIHdoZW4gdGhlXG4gICAgICogZG9jdW1lbnQgaXMgb3BlbmVkLiBUaGUgYHNjcmlwdGAgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBzb21lIG9wZXJhdGlvblxuICAgICAqIHdoZW4gdGhlIGRvY3VtZW50IGlzIG9wZW5lZCAoZS5nLiBsb2dnaW5nIHRvIHRoZSBjb25zb2xlKSwgb3IgaXQgY2FuIGJlXG4gICAgICogdXNlZCB0byBkZWZpbmUgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGxhdGVyIGluIGEgSmF2YVNjcmlwdFxuICAgICAqIGFjdGlvbi4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBTaG93IFwiSGVsbG8gV29ybGQhXCIgaW4gdGhlIGNvbnNvbGUgd2hlbiB0aGUgUERGIGlzIG9wZW5lZFxuICAgICAqIHBkZkRvYy5hZGRKYXZhU2NyaXB0KFxuICAgICAqICAgJ21haW4nLFxuICAgICAqICAgJ2NvbnNvbGUuc2hvdygpOyBjb25zb2xlLnByaW50bG4oXCJIZWxsbyBXb3JsZCFcIik7J1xuICAgICAqICk7XG4gICAgICpcbiAgICAgKiAvLyBEZWZpbmUgYSBmdW5jdGlvbiBuYW1lZCBcImZvb1wiIHRoYXQgY2FuIGJlIGNhbGxlZCBpbiBKYXZhU2NyaXB0IEFjdGlvbnNcbiAgICAgKiBwZGZEb2MuYWRkSmF2YVNjcmlwdChcbiAgICAgKiAgICdmb28nLFxuICAgICAqICAgJ2Z1bmN0aW9uIGZvbygpIHsgcmV0dXJuIFwiZm9vXCI7IH0nXG4gICAgICogKTtcbiAgICAgKiBgYGBcbiAgICAgKiBTZWUgdGhlIFtKYXZhU2NyaXB0IGZvciBBY3JvYmF0IEFQSSBSZWZlcmVuY2VdKGh0dHBzOi8vd3d3LmFkb2JlLmNvbS9jb250ZW50L2RhbS9hY29tL2VuL2Rldm5ldC9hY3JvYmF0L3BkZnMvanNfYXBpX3JlZmVyZW5jZS5wZGYpXG4gICAgICogZm9yIGRldGFpbHMuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHNjcmlwdC4gTXVzdCBiZSB1bmlxdWUgcGVyIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBzY3JpcHQgVGhlIEphdmFTY3JpcHQgdG8gZXhlY3V0ZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuYWRkSmF2YVNjcmlwdCA9IGZ1bmN0aW9uIChuYW1lLCBzY3JpcHQpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgYXNzZXJ0SXMoc2NyaXB0LCAnc2NyaXB0JywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBlbWJlZGRlciA9IEphdmFTY3JpcHRFbWJlZGRlci5mb3Ioc2NyaXB0LCBuYW1lKTtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgIHZhciBqYXZhU2NyaXB0ID0gUERGSmF2YVNjcmlwdC5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgdGhpcy5qYXZhU2NyaXB0cy5wdXNoKGphdmFTY3JpcHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIGFuIGF0dGFjaG1lbnQgdG8gdGhpcyBkb2N1bWVudC4gQXR0YWNobWVudHMgYXJlIHZpc2libGUgaW4gdGhlXG4gICAgICogXCJBdHRhY2htZW50c1wiIHBhbmVsIG9mIEFkb2JlIEFjcm9iYXQgYW5kIHNvbWUgb3RoZXIgUERGIHJlYWRlcnMuIEFueVxuICAgICAqIHR5cGUgb2YgZmlsZSBjYW4gYmUgYWRkZWQgYXMgYW4gYXR0YWNobWVudC4gVGhpcyBpbmNsdWRlcywgYnV0IGlzIG5vdFxuICAgICAqIGxpbWl0ZWQgdG8sIGAucG5nYCwgYC5qcGdgLCBgLnBkZmAsIGAuY3N2YCwgYC5kb2N4YCwgYW5kIGAueGxzeGAgZmlsZXMuXG4gICAgICpcbiAgICAgKiBUaGUgaW5wdXQgZGF0YSBjYW4gYmUgcHJvdmlkZWQgaW4gbXVsdGlwbGUgZm9ybWF0czpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICB8IENvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgc3RyaW5nYCAgICAgIHwgQSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgKG9yIGRhdGEgVVJJKSBjb250YWluaW5nIGFuIGF0dGFjaG1lbnQgfFxuICAgICAqIHwgYFVpbnQ4QXJyYXlgICB8IFRoZSByYXcgYnl0ZXMgb2YgYW4gYXR0YWNobWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBBcnJheUJ1ZmZlcmAgfCBUaGUgcmF3IGJ5dGVzIG9mIGFuIGF0dGFjaG1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIGF0dGFjaG1lbnQ9c3RyaW5nXG4gICAgICogYXdhaXQgcGRmRG9jLmF0dGFjaCgnLzlqLzRBQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3QkQuLi4nLCAnY2F0X3JpZGluZ191bmljb3JuLmpwZycsIHtcbiAgICAgKiAgIG1pbWVUeXBlOiAnaW1hZ2UvanBlZycsXG4gICAgICogICBkZXNjcmlwdGlvbjogJ0Nvb2wgY2F0IHJpZGluZyBhIHVuaWNvcm4hIPCfpoTwn5CI8J+Vtu+4jycsXG4gICAgICogICBjcmVhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDE5LzEyLzAxJyksXG4gICAgICogICBtb2RpZmljYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAyMC8wNC8xOScpLFxuICAgICAqIH0pXG4gICAgICogYXdhaXQgcGRmRG9jLmF0dGFjaCgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUS4uLicsICdjYXRfcmlkaW5nX3VuaWNvcm4uanBnJywge1xuICAgICAqICAgbWltZVR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICAgKiAgIGRlc2NyaXB0aW9uOiAnQ29vbCBjYXQgcmlkaW5nIGEgdW5pY29ybiEg8J+mhPCfkIjwn5W277iPJyxcbiAgICAgKiAgIGNyZWF0aW9uRGF0ZTogbmV3IERhdGUoJzIwMTkvMTIvMDEnKSxcbiAgICAgKiAgIG1vZGlmaWNhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDIwLzA0LzE5JyksXG4gICAgICogfSlcbiAgICAgKlxuICAgICAqIC8vIGF0dGFjaG1lbnQ9VWludDhBcnJheVxuICAgICAqIGltcG9ydCBmcyBmcm9tICdmcydcbiAgICAgKiBjb25zdCB1aW50OEFycmF5ID0gZnMucmVhZEZpbGVTeW5jKCdjYXRfcmlkaW5nX3VuaWNvcm4uanBnJylcbiAgICAgKiBhd2FpdCBwZGZEb2MuYXR0YWNoKHVpbnQ4QXJyYXksICdjYXRfcmlkaW5nX3VuaWNvcm4uanBnJywge1xuICAgICAqICAgbWltZVR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICAgKiAgIGRlc2NyaXB0aW9uOiAnQ29vbCBjYXQgcmlkaW5nIGEgdW5pY29ybiEg8J+mhPCfkIjwn5W277iPJyxcbiAgICAgKiAgIGNyZWF0aW9uRGF0ZTogbmV3IERhdGUoJzIwMTkvMTIvMDEnKSxcbiAgICAgKiAgIG1vZGlmaWNhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDIwLzA0LzE5JyksXG4gICAgICogfSlcbiAgICAgKlxuICAgICAqIC8vIGF0dGFjaG1lbnQ9QXJyYXlCdWZmZXJcbiAgICAgKiBjb25zdCB1cmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvY2F0X3JpZGluZ191bmljb3JuLmpwZydcbiAgICAgKiBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZldGNoKHVybCkudGhlbihyZXMgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICogYXdhaXQgcGRmRG9jLmF0dGFjaChhcnJheUJ1ZmZlciwgJ2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnLCB7XG4gICAgICogICBtaW1lVHlwZTogJ2ltYWdlL2pwZWcnLFxuICAgICAqICAgZGVzY3JpcHRpb246ICdDb29sIGNhdCByaWRpbmcgYSB1bmljb3JuISDwn6aE8J+QiPCflbbvuI8nLFxuICAgICAqICAgY3JlYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAxOS8xMi8wMScpLFxuICAgICAqICAgbW9kaWZpY2F0aW9uRGF0ZTogbmV3IERhdGUoJzIwMjAvMDQvMTknKSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgVGhlIGlucHV0IGRhdGEgY29udGFpbmluZyB0aGUgZmlsZSB0byBiZSBhdHRhY2hlZC5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBiZSBhdHRhY2hlZC5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aGVuIHRoZSBhdHRhY2htZW50IGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5hdHRhY2ggPSBmdW5jdGlvbiAoYXR0YWNobWVudCwgbmFtZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZXMsIGVtYmVkZGVyLCByZWYsIGVtYmVkZGVkRmlsZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnRJcyhhdHRhY2htZW50LCAnYXR0YWNobWVudCcsIFsnc3RyaW5nJywgVWludDhBcnJheSwgQXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICAgICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMubWltZVR5cGUsICdtaW1lVHlwZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICAgICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuZGVzY3JpcHRpb24sICdkZXNjcmlwdGlvbicsIFsnc3RyaW5nJ10pO1xuICAgICAgICAgICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuY3JlYXRpb25EYXRlLCAnb3B0aW9ucy5jcmVhdGlvbkRhdGUnLCBbRGF0ZV0pO1xuICAgICAgICAgICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMubW9kaWZpY2F0aW9uRGF0ZSwgJ29wdGlvbnMubW9kaWZpY2F0aW9uRGF0ZScsIFtcbiAgICAgICAgICAgICAgICAgICAgRGF0ZSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5hZlJlbGF0aW9uc2hpcCwgJ29wdGlvbnMuYWZSZWxhdGlvbnNoaXAnLCBBRlJlbGF0aW9uc2hpcCk7XG4gICAgICAgICAgICAgICAgYnl0ZXMgPSB0b1VpbnQ4QXJyYXkoYXR0YWNobWVudCk7XG4gICAgICAgICAgICAgICAgZW1iZWRkZXIgPSBGaWxlRW1iZWRkZXIuZm9yKGJ5dGVzLCBuYW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZWYgPSB0aGlzLmNvbnRleHQubmV4dFJlZigpO1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkRmlsZSA9IFBERkVtYmVkZGVkRmlsZS5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtYmVkZGVkRmlsZXMucHVzaChlbWJlZGRlZEZpbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIGEgZm9udCBpbnRvIHRoaXMgZG9jdW1lbnQuIFRoZSBpbnB1dCBkYXRhIGNhbiBiZSBwcm92aWRlZCBpbiBtdWx0aXBsZVxuICAgICAqIGZvcm1hdHM6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgICB8IENvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgU3RhbmRhcmRGb250c2AgfCBPbmUgb2YgdGhlIHN0YW5kYXJkIDE0IGZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBzdHJpbmdgICAgICAgICB8IEEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIChvciBkYXRhIFVSSSkgY29udGFpbmluZyBhIGZvbnQgfFxuICAgICAqIHwgYFVpbnQ4QXJyYXlgICAgIHwgVGhlIHJhdyBieXRlcyBvZiBhIGZvbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgQXJyYXlCdWZmZXJgICAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgZm9udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gZm9udD1TdGFuZGFyZEZvbnRzXG4gICAgICogaW1wb3J0IHsgU3RhbmRhcmRGb250cyB9IGZyb20gJ3BkZi1saWInXG4gICAgICogY29uc3QgZm9udDEgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqXG4gICAgICogLy8gZm9udD1zdHJpbmdcbiAgICAgKiBjb25zdCBmb250MiA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoJ0FBRUFBQUFWQVFBQUJBQlFSRk5KUngvdXBlLi4uJylcbiAgICAgKiBjb25zdCBmb250MyA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoJ2RhdGE6Zm9udC9vcGVudHlwZTtiYXNlNjQsQUFFQUFBLi4uJylcbiAgICAgKlxuICAgICAqIC8vIGZvbnQ9VWludDhBcnJheVxuICAgICAqIGltcG9ydCBmcyBmcm9tICdmcydcbiAgICAgKiBjb25zdCBmb250NCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoZnMucmVhZEZpbGVTeW5jKCdVYnVudHUtUi50dGYnKSlcbiAgICAgKlxuICAgICAqIC8vIGZvbnQ9QXJyYXlCdWZmZXJcbiAgICAgKiBjb25zdCB1cmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvdWJ1bnR1L1VidW50dS1SLnR0ZidcbiAgICAgKiBjb25zdCB1YnVudHVCeXRlcyA9IGF3YWl0IGZldGNoKHVybCkudGhlbihyZXMgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICogY29uc3QgZm9udDUgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KHVidW50dUJ5dGVzKVxuICAgICAqIGBgYFxuICAgICAqIFNlZSBhbHNvOiBbW3JlZ2lzdGVyRm9udGtpdF1dXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGlucHV0IGRhdGEgZm9yIGEgZm9udC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZW1iZWRkaW5nIHRoZSBmb250LlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggdGhlIGVtYmVkZGVkIGZvbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkRm9udCA9IGZ1bmN0aW9uIChmb250LCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgc3Vic2V0LCBjdXN0b21OYW1lLCBmZWF0dXJlcywgZW1iZWRkZXIsIGJ5dGVzLCBmb250a2l0LCBfYiwgcmVmLCBwZGZGb250O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBvcHRpb25zLnN1YnNldCwgc3Vic2V0ID0gX2EgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EsIGN1c3RvbU5hbWUgPSBvcHRpb25zLmN1c3RvbU5hbWUsIGZlYXR1cmVzID0gb3B0aW9ucy5mZWF0dXJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgWydzdHJpbmcnLCBVaW50OEFycmF5LCBBcnJheUJ1ZmZlcl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoc3Vic2V0LCAnc3Vic2V0JywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1N0YW5kYXJkRm9udChmb250KSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlciA9IFN0YW5kYXJkRm9udEVtYmVkZGVyLmZvcihmb250LCBjdXN0b21OYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbkJlQ29udmVydGVkVG9VaW50OEFycmF5KGZvbnQpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gdG9VaW50OEFycmF5KGZvbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udGtpdCA9IHRoaXMuYXNzZXJ0Rm9udGtpdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJzZXQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLmZvcihmb250a2l0LCBieXRlcywgY3VzdG9tTmFtZSwgZmVhdHVyZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzQgLyp5aWVsZCovLCBDdXN0b21Gb250RW1iZWRkZXIuZm9yKGZvbnRraXQsIGJ5dGVzLCBjdXN0b21OYW1lLCBmZWF0dXJlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZXIgPSBfYjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHRocm93IG5ldyBUeXBlRXJyb3IoJ2Bmb250YCBtdXN0IGJlIG9uZSBvZiBgU3RhbmRhcmRGb250cyB8IHN0cmluZyB8IFVpbnQ4QXJyYXkgfCBBcnJheUJ1ZmZlcmAnKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBkZkZvbnQgPSBQREZGb250Lm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb250cy5wdXNoKHBkZkZvbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHBkZkZvbnRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIGEgc3RhbmRhcmQgZm9udCBpbnRvIHRoaXMgZG9jdW1lbnQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBTdGFuZGFyZEZvbnRzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2FGb250ID0gcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgc3RhbmRhcmQgZm9udCB0byBiZSBlbWJlZGRlZC5cbiAgICAgKiBAcGFyYW0gY3VzdG9tTmFtZSBUaGUgbmFtZSB0byBiZSB1c2VkIHdoZW4gZW1iZWRkaW5nIHRoZSBmb250LlxuICAgICAqIEByZXR1cm5zIFRoZSBlbWJlZGRlZCBmb250LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZFN0YW5kYXJkRm9udCA9IGZ1bmN0aW9uIChmb250LCBjdXN0b21OYW1lKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgWydzdHJpbmcnXSk7XG4gICAgICAgIGlmICghaXNTdGFuZGFyZEZvbnQoZm9udCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Bmb250YCBtdXN0IGJlIG9uZSBvZiB0eXBlIGBTdGFuZGFyZEZvbnRzYCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbWJlZGRlciA9IFN0YW5kYXJkRm9udEVtYmVkZGVyLmZvcihmb250LCBjdXN0b21OYW1lKTtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgIHZhciBwZGZGb250ID0gUERGRm9udC5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgdGhpcy5mb250cy5wdXNoKHBkZkZvbnQpO1xuICAgICAgICByZXR1cm4gcGRmRm9udDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIGEgSlBFRyBpbWFnZSBpbnRvIHRoaXMgZG9jdW1lbnQuIFRoZSBpbnB1dCBkYXRhIGNhbiBiZSBwcm92aWRlZCBpblxuICAgICAqIG11bHRpcGxlIGZvcm1hdHM6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgfCBDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGBzdHJpbmdgICAgICAgfCBBIGJhc2U2NCBlbmNvZGVkIHN0cmluZyAob3IgZGF0YSBVUkkpIGNvbnRhaW5pbmcgYSBKUEVHIGltYWdlIHxcbiAgICAgKiB8IGBVaW50OEFycmF5YCAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgSlBFRyBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBBcnJheUJ1ZmZlcmAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgSlBFRyBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8ganBnPXN0cmluZ1xuICAgICAqIGNvbnN0IGltYWdlMSA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZygnLzlqLzRBQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3QkQuLi4nKVxuICAgICAqIGNvbnN0IGltYWdlMiA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZygnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUS4uLicpXG4gICAgICpcbiAgICAgKiAvLyBqcGc9VWludDhBcnJheVxuICAgICAqIGltcG9ydCBmcyBmcm9tICdmcydcbiAgICAgKiBjb25zdCB1aW50OEFycmF5ID0gZnMucmVhZEZpbGVTeW5jKCdjYXRfcmlkaW5nX3VuaWNvcm4uanBnJylcbiAgICAgKiBjb25zdCBpbWFnZTMgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcodWludDhBcnJheSlcbiAgICAgKlxuICAgICAqIC8vIGpwZz1BcnJheUJ1ZmZlclxuICAgICAqIGNvbnN0IHVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy9jYXRfcmlkaW5nX3VuaWNvcm4uanBnJ1xuICAgICAqIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKHJlcyA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBjb25zdCBpbWFnZTQgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcoYXJyYXlCdWZmZXIpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ganBnIFRoZSBpbnB1dCBkYXRhIGZvciBhIEpQRUcgaW1hZ2UuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCB0aGUgZW1iZWRkZWQgaW1hZ2UuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkSnBnID0gZnVuY3Rpb24gKGpwZykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZXMsIGVtYmVkZGVyLCByZWYsIHBkZkltYWdlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoanBnLCAnanBnJywgWydzdHJpbmcnLCBVaW50OEFycmF5LCBBcnJheUJ1ZmZlcl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSB0b1VpbnQ4QXJyYXkoanBnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIEpwZWdFbWJlZGRlci5mb3IoYnl0ZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZXIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSB0aGlzLmNvbnRleHQubmV4dFJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGRmSW1hZ2UgPSBQREZJbWFnZS5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VzLnB1c2gocGRmSW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHBkZkltYWdlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbWJlZCBhIFBORyBpbWFnZSBpbnRvIHRoaXMgZG9jdW1lbnQuIFRoZSBpbnB1dCBkYXRhIGNhbiBiZSBwcm92aWRlZCBpblxuICAgICAqIG11bHRpcGxlIGZvcm1hdHM6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgfCBDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgc3RyaW5nYCAgICAgIHwgQSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgKG9yIGRhdGEgVVJJKSBjb250YWluaW5nIGEgUE5HIGltYWdlIHxcbiAgICAgKiB8IGBVaW50OEFycmF5YCAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgUE5HIGltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYEFycmF5QnVmZmVyYCB8IFRoZSByYXcgYnl0ZXMgb2YgYSBQTkcgaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIHBuZz1zdHJpbmdcbiAgICAgKiBjb25zdCBpbWFnZTEgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcoJ2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFsZ0FBQUYzLi4uJylcbiAgICAgKiBjb25zdCBpbWFnZTIgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnLi4uJylcbiAgICAgKlxuICAgICAqIC8vIHBuZz1VaW50OEFycmF5XG4gICAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgICAqIGNvbnN0IHVpbnQ4QXJyYXkgPSBmcy5yZWFkRmlsZVN5bmMoJ3NtYWxsX21hcmlvLnBuZycpXG4gICAgICogY29uc3QgaW1hZ2UzID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKHVpbnQ4QXJyYXkpXG4gICAgICpcbiAgICAgKiAvLyBwbmc9QXJyYXlCdWZmZXJcbiAgICAgKiBjb25zdCB1cmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvc21hbGxfbWFyaW8ucG5nJ1xuICAgICAqIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKHJlcyA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBjb25zdCBpbWFnZTQgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcoYXJyYXlCdWZmZXIpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG5nIFRoZSBpbnB1dCBkYXRhIGZvciBhIFBORyBpbWFnZS5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIHRoZSBlbWJlZGRlZCBpbWFnZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRQbmcgPSBmdW5jdGlvbiAocG5nKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBieXRlcywgZW1iZWRkZXIsIHJlZiwgcGRmSW1hZ2U7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhwbmcsICdwbmcnLCBbJ3N0cmluZycsIFVpbnQ4QXJyYXksIEFycmF5QnVmZmVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IHRvVWludDhBcnJheShwbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUG5nRW1iZWRkZXIuZm9yKGJ5dGVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVyID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBkZkltYWdlID0gUERGSW1hZ2Uub2YocmVmLCB0aGlzLCBlbWJlZGRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlcy5wdXNoKHBkZkltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBwZGZJbWFnZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgb25lIG9yIG1vcmUgUERGIHBhZ2VzIGludG8gdGhpcyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHNvdXJjZVBkZlVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy93aXRoX2xhcmdlX3BhZ2VfY291bnQucGRmJ1xuICAgICAqIGNvbnN0IHNvdXJjZVBkZiA9IGF3YWl0IGZldGNoKHNvdXJjZVBkZlVybCkudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKlxuICAgICAqIC8vIEVtYmVkIHBhZ2UgNzQgb2YgYHNvdXJjZVBkZmAgaW50byBgcGRmRG9jYFxuICAgICAqIGNvbnN0IFtlbWJlZGRlZFBhZ2VdID0gYXdhaXQgcGRmRG9jLmVtYmVkUGRmKHNvdXJjZVBkZiwgWzczXSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBbW1BERkRvY3VtZW50LmxvYWRdXSBmb3IgZXhhbXBsZXMgb2YgdGhlIGFsbG93ZWQgaW5wdXQgZGF0YSBmb3JtYXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBkZiBUaGUgaW5wdXQgZGF0YSBjb250YWluaW5nIGEgUERGIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBpbmRpY2VzIFRoZSBpbmRpY2VzIG9mIHRoZSBwYWdlcyB0aGF0IHNob3VsZCBiZSBlbWJlZGRlZC5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSBlbWJlZGRlZCBwYWdlcy5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRQZGYgPSBmdW5jdGlvbiAocGRmLCBpbmRpY2VzKSB7XG4gICAgICAgIGlmIChpbmRpY2VzID09PSB2b2lkIDApIHsgaW5kaWNlcyA9IFswXTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3JjRG9jLCBfYSwgc3JjUGFnZXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhwZGYsICdwZGYnLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhpbmRpY2VzLCAnaW5kaWNlcycsIFtBcnJheV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocGRmIGluc3RhbmNlb2YgUERGRG9jdW1lbnQpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gcGRmO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgUERGRG9jdW1lbnQubG9hZChwZGYpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RvYyA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGFnZXMgPSBwbHVja0luZGljZXMoc3JjRG9jLmdldFBhZ2VzKCksIGluZGljZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuZW1iZWRQYWdlcyhzcmNQYWdlcyldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIGEgc2luZ2xlIFBERiBwYWdlIGludG8gdGhpcyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHNvdXJjZVBkZlVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy93aXRoX2xhcmdlX3BhZ2VfY291bnQucGRmJ1xuICAgICAqIGNvbnN0IHNvdXJjZUJ1ZmZlciA9IGF3YWl0IGZldGNoKHNvdXJjZVBkZlVybCkudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBjb25zdCBzb3VyY2VQZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKHNvdXJjZUJ1ZmZlcilcbiAgICAgKiBjb25zdCBzb3VyY2VQZGZQYWdlID0gc291cmNlUGRmRG9jLmdldFBhZ2VzKClbNzNdXG4gICAgICpcbiAgICAgKiBjb25zdCBlbWJlZGRlZFBhZ2UgPSBhd2FpdCBwZGZEb2MuZW1iZWRQYWdlKFxuICAgICAqICAgc291cmNlUGRmUGFnZSxcbiAgICAgKlxuICAgICAqICAgLy8gQ2xpcCBhIHNlY3Rpb24gb2YgdGhlIHNvdXJjZSBwYWdlIHNvIHRoYXQgd2Ugb25seSBlbWJlZCBwYXJ0IG9mIGl0XG4gICAgICogICB7IGxlZnQ6IDEwMCwgcmlnaHQ6IDQ1MCwgYm90dG9tOiAzMzAsIHRvcDogNTcwIH0sXG4gICAgICpcbiAgICAgKiAgIC8vIFRyYW5zbGF0ZSBhbGwgZHJhd2luZ3Mgb2YgdGhlIGVtYmVkZGVkIHBhZ2UgYnkgKDEwLCAyMDApIHVuaXRzXG4gICAgICogICBbMSwgMCwgMCwgMSwgMTAsIDIwMF0sXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gYmUgZW1iZWRkZWQuXG4gICAgICogQHBhcmFtIGJvdW5kaW5nQm94XG4gICAgICogT3B0aW9uYWxseSwgYW4gYXJlYSBvZiB0aGUgc291cmNlIHBhZ2UgdGhhdCBzaG91bGQgYmUgZW1iZWRkZWRcbiAgICAgKiAoZGVmYXVsdHMgdG8gZW50aXJlIHBhZ2UpLlxuICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbk1hdHJpeFxuICAgICAqIE9wdGlvbmFsbHksIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRoYXQgaXMgYWx3YXlzIGFwcGxpZWQgdG8gdGhlIGVtYmVkZGVkXG4gICAgICogcGFnZSBhbnl3aGVyZSBpdCBpcyBkcmF3bi5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIHRoZSBlbWJlZGRlZCBwZGYgcGFnZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRQYWdlID0gZnVuY3Rpb24gKHBhZ2UsIGJvdW5kaW5nQm94LCB0cmFuc2Zvcm1hdGlvbk1hdHJpeCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZW1iZWRkZWRQYWdlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbW1BERlBhZ2UsICdQREZQYWdlJ11dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRQYWdlcyhbcGFnZV0sIFtib3VuZGluZ0JveF0sIFt0cmFuc2Zvcm1hdGlvbk1hdHJpeF0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZWRQYWdlID0gKF9hLnNlbnQoKSlbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZW1iZWRkZWRQYWdlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbWJlZCBvbmUgb3IgbW9yZSBQREYgcGFnZXMgaW50byB0aGlzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqXG4gICAgICogY29uc3Qgc291cmNlUGRmVXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL3dpdGhfbGFyZ2VfcGFnZV9jb3VudC5wZGYnXG4gICAgICogY29uc3Qgc291cmNlQnVmZmVyID0gYXdhaXQgZmV0Y2goc291cmNlUGRmVXJsKS50aGVuKChyZXMpID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGNvbnN0IHNvdXJjZVBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoc291cmNlQnVmZmVyKVxuICAgICAqXG4gICAgICogY29uc3QgcGFnZTEgPSBzb3VyY2VQZGZEb2MuZ2V0UGFnZXMoKVswXVxuICAgICAqIGNvbnN0IHBhZ2UyID0gc291cmNlUGRmRG9jLmdldFBhZ2VzKClbNTJdXG4gICAgICogY29uc3QgcGFnZTMgPSBzb3VyY2VQZGZEb2MuZ2V0UGFnZXMoKVs3M11cbiAgICAgKlxuICAgICAqIGNvbnN0IGVtYmVkZGVkUGFnZXMgPSBhd2FpdCBwZGZEb2MuZW1iZWRQYWdlcyhbcGFnZTEsIHBhZ2UyLCBwYWdlM10pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZVxuICAgICAqIFRoZSBwYWdlcyB0byBiZSBlbWJlZGRlZCAodGhleSBtdXN0IGFsbCBzaGFyZSB0aGUgc2FtZSBjb250ZXh0KS5cbiAgICAgKiBAcGFyYW0gYm91bmRpbmdCb3hlc1xuICAgICAqIE9wdGlvbmFsbHksIGFuIGFycmF5IG9mIGNsaXBwaW5nIGJvdW5kYXJpZXMgLSBvbmUgZm9yIGVhY2ggcGFnZVxuICAgICAqIChkZWZhdWx0cyB0byBlbnRpcmV0eSBvZiBlYWNoIHBhZ2UpLlxuICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbk1hdHJpY2VzXG4gICAgICogT3B0aW9uYWxseSwgYW4gYXJyYXkgb2YgdHJhbnNmb3JtYXRpb24gbWF0cmljZXMgLSBvbmUgZm9yIGVhY2ggcGFnZVxuICAgICAqIChlYWNoIHBhZ2UncyB0cmFuc2Zvcm1hdGlvbiB3aWxsIGFwcGx5IGFueXdoZXJlIGl0IGlzIGRyYXduKS5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSBlbWJlZGRlZCBwZGYgcGFnZXMuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkUGFnZXMgPSBmdW5jdGlvbiAocGFnZXMsIGJvdW5kaW5nQm94ZXMsIHRyYW5zZm9ybWF0aW9uTWF0cmljZXMpIHtcbiAgICAgICAgaWYgKGJvdW5kaW5nQm94ZXMgPT09IHZvaWQgMCkgeyBib3VuZGluZ0JveGVzID0gW107IH1cbiAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9uTWF0cmljZXMgPT09IHZvaWQgMCkgeyB0cmFuc2Zvcm1hdGlvbk1hdHJpY2VzID0gW107IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGlkeCwgbGVuLCBjdXJyUGFnZSwgbmV4dFBhZ2UsIGNvbnRleHQsIG1heWJlQ29weVBhZ2UsIGVtYmVkZGVkUGFnZXMsIGlkeCwgbGVuLCBwYWdlLCBib3gsIG1hdHJpeCwgZW1iZWRkZXIsIHJlZjtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2VydCBhbGwgcGFnZXMgaGF2ZSB0aGUgc2FtZSBjb250ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDAsIGxlbiA9IHBhZ2VzLmxlbmd0aCAtIDE7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyUGFnZSA9IHBhZ2VzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFBhZ2UgPSBwYWdlc1tpZHggKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyclBhZ2Uubm9kZS5jb250ZXh0ICE9PSBuZXh0UGFnZS5ub2RlLmNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IHBhZ2VzWzBdLm5vZGUuY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlQ29weVBhZ2UgPSBjb250ZXh0ID09PSB0aGlzLmNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChwKSB7IHJldHVybiBwOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQREZPYmplY3RDb3BpZXIuZm9yKGNvbnRleHQsIHRoaXMuY29udGV4dCkuY29weTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkUGFnZXMgPSBuZXcgQXJyYXkocGFnZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IHBhZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gbWF5YmVDb3B5UGFnZShwYWdlc1tpZHhdLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm94ID0gYm91bmRpbmdCb3hlc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4ID0gdHJhbnNmb3JtYXRpb25NYXRyaWNlc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUERGUGFnZUVtYmVkZGVyLmZvcihwYWdlLCBib3gsIG1hdHJpeCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlciA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZFBhZ2VzW2lkeF0gPSBQREZFbWJlZGRlZFBhZ2Uub2YocmVmLCB0aGlzLCBlbWJlZGRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIChfYSA9IHRoaXMuZW1iZWRkZWRQYWdlcykucHVzaC5hcHBseShfYSwgZW1iZWRkZWRQYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZW1iZWRkZWRQYWdlc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHNob3VsZG4ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZSBbW3NhdmVdXVxuICAgICAqID4gYW5kIFtbc2F2ZUFzQmFzZTY0XV0gbWV0aG9kcyB3aWxsIGF1dG9tYXRpY2FsbHkgZW5zdXJlIHRoYXQgYWxsIGVtYmVkZGVkXG4gICAgICogPiBhc3NldHMgYXJlIGZsdXNoZWQgYmVmb3JlIHNlcmlhbGl6aW5nIHRoZSBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEZsdXNoIGFsbCBlbWJlZGRlZCBmb250cywgUERGIHBhZ2VzLCBhbmQgaW1hZ2VzIHRvIHRoaXMgZG9jdW1lbnQnc1xuICAgICAqIFtbY29udGV4dF1dLlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZmx1c2ggaXMgY29tcGxldGUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRBbGwodGhpcy5mb250cyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkQWxsKHRoaXMuaW1hZ2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRBbGwodGhpcy5lbWJlZGRlZFBhZ2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRBbGwodGhpcy5lbWJlZGRlZEZpbGVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRBbGwodGhpcy5qYXZhU2NyaXB0cyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIHRoaXMgZG9jdW1lbnQgdG8gYW4gYXJyYXkgb2YgYnl0ZXMgbWFraW5nIHVwIGEgUERGIGZpbGUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwZGZCeXRlcyA9IGF3YWl0IHBkZkRvYy5zYXZlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0aGluZ3MgeW91IGNhbiBkbyB3aXRoIHRoZSBzZXJpYWxpemVkIGRvY3VtZW50LFxuICAgICAqIGRlcGVuZGluZyBvbiB0aGUgSmF2YVNjcmlwdCBlbnZpcm9ubWVudCB5b3UncmUgcnVubmluZyBpbjpcbiAgICAgKiAqIFdyaXRlIGl0IHRvIGEgZmlsZSBpbiBOb2RlIG9yIFJlYWN0IE5hdGl2ZVxuICAgICAqICogRG93bmxvYWQgaXQgYXMgYSBCbG9iIGluIHRoZSBicm93c2VyXG4gICAgICogKiBSZW5kZXIgaXQgaW4gYW4gYGlmcmFtZWBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBzYXZpbmcgdGhlIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggdGhlIGJ5dGVzIG9mIHRoZSBzZXJpYWxpemVkIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCB1c2VPYmplY3RTdHJlYW1zLCBfYiwgYWRkRGVmYXVsdFBhZ2UsIF9jLCBvYmplY3RzUGVyVGljaywgX2QsIHVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMsIGZvcm0sIFdyaXRlcjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gb3B0aW9ucy51c2VPYmplY3RTdHJlYW1zLCB1c2VPYmplY3RTdHJlYW1zID0gX2EgPT09IHZvaWQgMCA/IHRydWUgOiBfYSwgX2IgPSBvcHRpb25zLmFkZERlZmF1bHRQYWdlLCBhZGREZWZhdWx0UGFnZSA9IF9iID09PSB2b2lkIDAgPyB0cnVlIDogX2IsIF9jID0gb3B0aW9ucy5vYmplY3RzUGVyVGljaywgb2JqZWN0c1BlclRpY2sgPSBfYyA9PT0gdm9pZCAwID8gNTAgOiBfYywgX2QgPSBvcHRpb25zLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMsIHVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMgPSBfZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9kO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXModXNlT2JqZWN0U3RyZWFtcywgJ3VzZU9iamVjdFN0cmVhbXMnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhhZGREZWZhdWx0UGFnZSwgJ2FkZERlZmF1bHRQYWdlJywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMob2JqZWN0c1BlclRpY2ssICdvYmplY3RzUGVyVGljaycsIFsnbnVtYmVyJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXModXBkYXRlRmllbGRBcHBlYXJhbmNlcywgJ3VwZGF0ZUZpZWxkQXBwZWFyYW5jZXMnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkRGVmYXVsdFBhZ2UgJiYgdGhpcy5nZXRQYWdlQ291bnQoKSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVGaWVsZEFwcGVhcmFuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSA9IHRoaXMuZm9ybUNhY2hlLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5mbHVzaCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVyID0gdXNlT2JqZWN0U3RyZWFtcyA/IFBERlN0cmVhbVdyaXRlciA6IFBERldyaXRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBXcml0ZXIuZm9yQ29udGV4dCh0aGlzLmNvbnRleHQsIG9iamVjdHNQZXJUaWNrKS5zZXJpYWxpemVUb0J1ZmZlcigpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgdGhpcyBkb2N1bWVudCB0byBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBvciBkYXRhIFVSSSBtYWtpbmcgdXAgYVxuICAgICAqIFBERiBmaWxlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGJhc2U2NFN0cmluZyA9IGF3YWl0IHBkZkRvYy5zYXZlQXNCYXNlNjQoKVxuICAgICAqIGJhc2U2NFN0cmluZyAvLyA9PiAnSlZCRVJpMHhMamNLSllHQmdZRUtDLi4uJ1xuICAgICAqXG4gICAgICogY29uc3QgYmFzZTY0RGF0YVVyaSA9IGF3YWl0IHBkZkRvYy5zYXZlQXNCYXNlNjQoeyBkYXRhVXJpOiB0cnVlIH0pXG4gICAgICogYmFzZTY0RGF0YVVyaSAvLyA9PiAnZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LEpWQkVSaTB4TGpjS0pZR0JnWUVLQy4uLidcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBzYXZpbmcgdGhlIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgb3IgZGF0YSBVUkkgb2YgdGhlXG4gICAgICogICAgICAgICAgc2VyaWFsaXplZCBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2F2ZUFzQmFzZTY0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBkYXRhVXJpLCBvdGhlck9wdGlvbnMsIGJ5dGVzLCBiYXNlNjQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9wdGlvbnMuZGF0YVVyaSwgZGF0YVVyaSA9IF9hID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hLCBvdGhlck9wdGlvbnMgPSBfX3Jlc3Qob3B0aW9ucywgW1wiZGF0YVVyaVwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhkYXRhVXJpLCAnZGF0YVVyaScsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc2F2ZShvdGhlck9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBlbmNvZGVUb0Jhc2U2NChieXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YVVyaSA/IFwiZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LFwiICsgYmFzZTY0IDogYmFzZTY0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZmluZFBhZ2VGb3JBbm5vdGF0aW9uUmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICB2YXIgcGFnZXMgPSB0aGlzLmdldFBhZ2VzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHBhZ2VzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHBhZ2UgPSBwYWdlc1tpZHhdO1xuICAgICAgICAgICAgdmFyIGFubm90YXRpb25zID0gcGFnZS5ub2RlLkFubm90cygpO1xuICAgICAgICAgICAgaWYgKChhbm5vdGF0aW9ucyA9PT0gbnVsbCB8fCBhbm5vdGF0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYW5ub3RhdGlvbnMuaW5kZXhPZihyZWYpKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZEFsbCA9IGZ1bmN0aW9uIChlbWJlZGRhYmxlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaWR4LCBsZW47XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAwLCBsZW4gPSBlbWJlZGRhYmxlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZW1iZWRkYWJsZXNbaWR4XS5lbWJlZCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUudXBkYXRlSW5mb0RpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwZGZMaWIgPSBcInBkZi1saWIgKGh0dHBzOi8vZ2l0aHViLmNvbS9Ib3BkaW5nL3BkZi1saWIpXCI7XG4gICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgaW5mbyA9IHRoaXMuZ2V0SW5mb0RpY3QoKTtcbiAgICAgICAgdGhpcy5zZXRQcm9kdWNlcihwZGZMaWIpO1xuICAgICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUobm93KTtcbiAgICAgICAgaWYgKCFpbmZvLmdldChQREZOYW1lLm9mKCdDcmVhdG9yJykpKVxuICAgICAgICAgICAgdGhpcy5zZXRDcmVhdG9yKHBkZkxpYik7XG4gICAgICAgIGlmICghaW5mby5nZXQoUERGTmFtZS5vZignQ3JlYXRpb25EYXRlJykpKVxuICAgICAgICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUobm93KTtcbiAgICB9O1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRJbmZvRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nSW5mbyA9IHRoaXMuY29udGV4dC5sb29rdXAodGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLkluZm8pO1xuICAgICAgICBpZiAoZXhpc3RpbmdJbmZvIGluc3RhbmNlb2YgUERGRGljdClcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0luZm87XG4gICAgICAgIHZhciBuZXdJbmZvID0gdGhpcy5jb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIHRoaXMuY29udGV4dC50cmFpbGVySW5mby5JbmZvID0gdGhpcy5jb250ZXh0LnJlZ2lzdGVyKG5ld0luZm8pO1xuICAgICAgICByZXR1cm4gbmV3SW5mbztcbiAgICB9O1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5hc3NlcnRGb250a2l0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuZm9udGtpdClcbiAgICAgICAgICAgIHRocm93IG5ldyBGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvbnRraXQ7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRG9jdW1lbnQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRG9jdW1lbnQ7XG4vKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgb25seS1hcnJvdy1mdW5jdGlvbnMgKi9cbmZ1bmN0aW9uIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKHBkZk9iamVjdCkge1xuICAgIGlmICghKHBkZk9iamVjdCBpbnN0YW5jZW9mIFBERkhleFN0cmluZykgJiZcbiAgICAgICAgIShwZGZPYmplY3QgaW5zdGFuY2VvZiBQREZTdHJpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yKFtQREZIZXhTdHJpbmcsIFBERlN0cmluZ10sIHBkZk9iamVjdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRG9jdW1lbnQuanMubWFwIiwiZXhwb3J0IHZhciBQYXJzZVNwZWVkcztcbihmdW5jdGlvbiAoUGFyc2VTcGVlZHMpIHtcbiAgICBQYXJzZVNwZWVkc1tQYXJzZVNwZWVkc1tcIkZhc3Rlc3RcIl0gPSBJbmZpbml0eV0gPSBcIkZhc3Rlc3RcIjtcbiAgICBQYXJzZVNwZWVkc1tQYXJzZVNwZWVkc1tcIkZhc3RcIl0gPSAxNTAwXSA9IFwiRmFzdFwiO1xuICAgIFBhcnNlU3BlZWRzW1BhcnNlU3BlZWRzW1wiTWVkaXVtXCJdID0gNTAwXSA9IFwiTWVkaXVtXCI7XG4gICAgUGFyc2VTcGVlZHNbUGFyc2VTcGVlZHNbXCJTbG93XCJdID0gMTAwXSA9IFwiU2xvd1wiO1xufSkoUGFyc2VTcGVlZHMgfHwgKFBhcnNlU3BlZWRzID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkRvY3VtZW50T3B0aW9ucy5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQREZOYW1lLCBQREZBcnJheSwgUERGRGljdCwgUERGSGV4U3RyaW5nIH0gZnJvbSBcIi4uL2NvcmVcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIGZpbGUgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqL1xudmFyIFBERkVtYmVkZGVkRmlsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZFbWJlZGRlZEZpbGUocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHRoaXMuYWxyZWFkeUVtYmVkZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5lbWJlZGRlciA9IGVtYmVkZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBUaGVcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuc2F2ZV1dIGFuZCBbW1BERkRvY3VtZW50LnNhdmVBc0Jhc2U2NF1dIG1ldGhvZHMgd2lsbFxuICAgICAqID4gYXV0b21hdGljYWxseSBlbnN1cmUgYWxsIGVtYmVkZGFibGUgZmlsZXMgZ2V0IGVtYmVkZGVkLlxuICAgICAqXG4gICAgICogRW1iZWQgdGhpcyBlbWJlZGRhYmxlIGZpbGUgaW4gaXRzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZW1iZWRkaW5nIGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkRmlsZS5wcm90b3R5cGUuZW1iZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZWYsIE5hbWVzLCBFbWJlZGRlZEZpbGVzLCBFRk5hbWVzLCBBRjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMuYWxyZWFkeUVtYmVkZGVkKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRkZXIuZW1iZWRJbnRvQ29udGV4dCh0aGlzLmRvYy5jb250ZXh0LCB0aGlzLnJlZildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZG9jLmNhdGFsb2cuaGFzKFBERk5hbWUub2YoJ05hbWVzJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2MuY2F0YWxvZy5zZXQoUERGTmFtZS5vZignTmFtZXMnKSwgdGhpcy5kb2MuY29udGV4dC5vYmooe30pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzID0gdGhpcy5kb2MuY2F0YWxvZy5sb29rdXAoUERGTmFtZS5vZignTmFtZXMnKSwgUERGRGljdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU5hbWVzLmhhcyhQREZOYW1lLm9mKCdFbWJlZGRlZEZpbGVzJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXMuc2V0KFBERk5hbWUub2YoJ0VtYmVkZGVkRmlsZXMnKSwgdGhpcy5kb2MuY29udGV4dC5vYmooe30pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkZGVkRmlsZXMgPSBOYW1lcy5sb29rdXAoUERGTmFtZS5vZignRW1iZWRkZWRGaWxlcycpLCBQREZEaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRW1iZWRkZWRGaWxlcy5oYXMoUERGTmFtZS5vZignTmFtZXMnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZEZpbGVzLnNldChQREZOYW1lLm9mKCdOYW1lcycpLCB0aGlzLmRvYy5jb250ZXh0Lm9iaihbXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgRUZOYW1lcyA9IEVtYmVkZGVkRmlsZXMubG9va3VwKFBERk5hbWUub2YoJ05hbWVzJyksIFBERkFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEVGTmFtZXMucHVzaChQREZIZXhTdHJpbmcuZnJvbVRleHQodGhpcy5lbWJlZGRlci5maWxlTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRUZOYW1lcy5wdXNoKHJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBBRi1UYWcgaXMgbmVlZGVkIHRvIGFjaGlldmUgUERGLUEzIGNvbXBsaWFuY2UgZm9yIGVtYmVkZGVkIGZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogVGhlIGZvbGxvd2luZyBkb2N1bWVudCBvdXRsaW5lcyB0aGUgdXNlcyBjYXNlcyBvZiB0aGUgYXNzb2NpYXRlZCBmaWxlcyAoQUYpIHRhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFNlZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vd3d3LnBkZmEub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE4LzEwL1BERjIwX0FOMDAyLUFGLnBkZlxuICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZG9jLmNhdGFsb2cuaGFzKFBERk5hbWUub2YoJ0FGJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2MuY2F0YWxvZy5zZXQoUERGTmFtZS5vZignQUYnKSwgdGhpcy5kb2MuY29udGV4dC5vYmooW10pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEFGID0gdGhpcy5kb2MuY2F0YWxvZy5sb29rdXAoUERGTmFtZS5vZignQUYnKSwgUERGQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgQUYucHVzaChyZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5RW1iZWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuYXR0YWNoXV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZVxuICAgICAqIGluc3RhbmNlcyBvZiBbW1BERkVtYmVkZGVkRmlsZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZFbWJlZGRlZEZpbGVdXSBmcm9tIGFuIGV4aXN0aW5nIHJlZiBhbmQgZW1iZWRkZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgZmlsZS5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgZmlsZSB3aWxsIGJlbG9uZy5cbiAgICAgKiBAcGFyYW0gZW1iZWRkZXIgVGhlIGVtYmVkZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVtYmVkIHRoZSBmaWxlLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkRmlsZS5vZiA9IGZ1bmN0aW9uIChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZFbWJlZGRlZEZpbGUocmVmLCBkb2MsIGVtYmVkZGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZFbWJlZGRlZEZpbGU7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRW1iZWRkZWRGaWxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRW1iZWRkZWRGaWxlLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEb2N1bWVudCBmcm9tIFwiLi9QREZEb2N1bWVudFwiO1xuaW1wb3J0IHsgUERGUGFnZUVtYmVkZGVyLCBQREZSZWYgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIFBERiBwYWdlIHRoYXQgaGFzIGJlZW4gZW1iZWRkZWQgaW4gYSBbW1BERkRvY3VtZW50XV0uXG4gKi9cbnZhciBQREZFbWJlZGRlZFBhZ2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGRW1iZWRkZWRQYWdlKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICB0aGlzLmFscmVhZHlFbWJlZGRlZCA9IGZhbHNlO1xuICAgICAgICBhc3NlcnRJcyhyZWYsICdyZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIGFzc2VydElzKGRvYywgJ2RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgIGFzc2VydElzKGVtYmVkZGVyLCAnZW1iZWRkZXInLCBbW1BERlBhZ2VFbWJlZGRlciwgJ1BERlBhZ2VFbWJlZGRlciddXSk7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy53aWR0aCA9IGVtYmVkZGVyLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGVtYmVkZGVyLmhlaWdodDtcbiAgICAgICAgdGhpcy5lbWJlZGRlciA9IGVtYmVkZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoaXMgcGFnZSBhZnRlciBiZWluZyBzY2FsZWQgYnkgdGhlXG4gICAgICogZ2l2ZW4gYGZhY3RvcmAuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogZW1iZWRkZWRQYWdlLndpZHRoICAvLyA9PiA1MDBcbiAgICAgKiBlbWJlZGRlZFBhZ2UuaGVpZ2h0IC8vID0+IDI1MFxuICAgICAqXG4gICAgICogY29uc3Qgc2NhbGVkID0gZW1iZWRkZWRQYWdlLnNjYWxlKDAuNSlcbiAgICAgKiBzY2FsZWQud2lkdGggIC8vID0+IDI1MFxuICAgICAqIHNjYWxlZC5oZWlnaHQgLy8gPT4gMTI1XG4gICAgICogYGBgXG4gICAgICogVGhpcyBvcGVyYXRpb24gaXMgb2Z0ZW4gdXNlZnVsIGJlZm9yZSBkcmF3aW5nIGEgcGFnZSB3aXRoXG4gICAgICogW1tQREZQYWdlLmRyYXdQYWdlXV0gdG8gY29tcHV0ZSB0aGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0gZmFjdG9yIFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhpcyBwYWdlIHNob3VsZCBiZSBzY2FsZWQuXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHBhZ2UgYWZ0ZXIgYmVpbmcgc2NhbGVkLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkUGFnZS5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAoZmFjdG9yKSB7XG4gICAgICAgIGFzc2VydElzKGZhY3RvciwgJ2ZhY3RvcicsIFsnbnVtYmVyJ10pO1xuICAgICAgICByZXR1cm4geyB3aWR0aDogdGhpcy53aWR0aCAqIGZhY3RvciwgaGVpZ2h0OiB0aGlzLmhlaWdodCAqIGZhY3RvciB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGVtYmVkZGVkUGFnZS5zaXplKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZFbWJlZGRlZFBhZ2UucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlKDEpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlXG4gICAgICogPiBbW1BERkRvY3VtZW50LnNhdmVdXSBhbmQgW1tQREZEb2N1bWVudC5zYXZlQXNCYXNlNjRdXSBtZXRob2RzIHdpbGxcbiAgICAgKiA+IGF1dG9tYXRpY2FsbHkgZW5zdXJlIGFsbCBlbWJlZGRhYmxlIHBhZ2VzIGdldCBlbWJlZGRlZC5cbiAgICAgKlxuICAgICAqIEVtYmVkIHRoaXMgZW1iZWRkYWJsZSBwYWdlIGluIGl0cyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gdGhlIGVtYmVkZGluZyBpcyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBQREZFbWJlZGRlZFBhZ2UucHJvdG90eXBlLmVtYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLmFscmVhZHlFbWJlZGRlZCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkZGVyLmVtYmVkSW50b0NvbnRleHQodGhpcy5kb2MuY29udGV4dCwgdGhpcy5yZWYpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5RW1iZWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuZW1iZWRQZGZdXSBhbmRcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuZW1iZWRQYWdlXV0gbWV0aG9kcywgd2hpY2ggd2lsbCBjcmVhdGUgaW5zdGFuY2VzIG9mXG4gICAgICogPiBbW1BERkVtYmVkZGVkUGFnZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZFbWJlZGRlZFBhZ2VdXSBmcm9tIGFuIGV4aXN0aW5nIHJlZiBhbmQgZW1iZWRkZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgZW1iZWRkZWQgcGFnZS5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgZW1iZWRkZWQgcGFnZSB3aWxsIGJlbG9uZy5cbiAgICAgKiBAcGFyYW0gZW1iZWRkZXIgVGhlIGVtYmVkZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVtYmVkIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkUGFnZS5vZiA9IGZ1bmN0aW9uIChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZFbWJlZGRlZFBhZ2UocmVmLCBkb2MsIGVtYmVkZGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZFbWJlZGRlZFBhZ2U7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRW1iZWRkZWRQYWdlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRW1iZWRkZWRQYWdlLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEb2N1bWVudCBmcm9tIFwiLi9QREZEb2N1bWVudFwiO1xuaW1wb3J0IHsgQ3VzdG9tRm9udEVtYmVkZGVyLCBQREZSZWYsIFN0YW5kYXJkRm9udEVtYmVkZGVyLCB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0T3JVbmRlZmluZWQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIGZvbnQgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqL1xudmFyIFBERkZvbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGRm9udChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgdGhpcy5tb2RpZmllZCA9IHRydWU7XG4gICAgICAgIGFzc2VydElzKHJlZiwgJ3JlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZW1iZWRkZXIsICdlbWJlZGRlcicsIFtcbiAgICAgICAgICAgIFtDdXN0b21Gb250RW1iZWRkZXIsICdDdXN0b21Gb250RW1iZWRkZXInXSxcbiAgICAgICAgICAgIFtTdGFuZGFyZEZvbnRFbWJlZGRlciwgJ1N0YW5kYXJkRm9udEVtYmVkZGVyJ10sXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMubmFtZSA9IGVtYmVkZGVyLmZvbnROYW1lO1xuICAgICAgICB0aGlzLmVtYmVkZGVyID0gZW1iZWRkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZVxuICAgICAqID4gW1tQREZQYWdlLmRyYXdUZXh0XV0gbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBlbmNvZGUgdGhlIHRleHQgaXQgaXNcbiAgICAgKiA+IGdpdmVuLlxuICAgICAqXG4gICAgICogRW5jb2RlcyBhIHN0cmluZyBvZiB0ZXh0IGluIHRoaXMgZm9udC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIGVuY29kZWQuXG4gICAgICogQHJldHVybnMgVGhlIGVuY29kZWQgdGV4dCBhcyBhIGhleCBzdHJpbmcuXG4gICAgICovXG4gICAgUERGRm9udC5wcm90b3R5cGUuZW5jb2RlVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIGFzc2VydElzKHRleHQsICd0ZXh0JywgWydzdHJpbmcnXSk7XG4gICAgICAgIHRoaXMubW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlci5lbmNvZGVUZXh0KHRleHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWVhc3VyZSB0aGUgd2lkdGggb2YgYSBzdHJpbmcgb2YgdGV4dCBkcmF3biBpbiB0aGlzIGZvbnQgYXQgYSBnaXZlbiBzaXplLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgd2lkdGggPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKCdGb28gQmFyIFF1eCBCYXonLCAzNilcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgc3RyaW5nIG9mIHRleHQgdG8gYmUgbWVhc3VyZWQuXG4gICAgICogQHBhcmFtIHNpemUgVGhlIGZvbnQgc2l6ZSB0byBiZSB1c2VkIGZvciB0aGlzIG1lYXN1cmVtZW50LlxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBvZiB0aGUgc3RyaW5nIG9mIHRleHQgd2hlbiBkcmF3biBpbiB0aGlzIGZvbnQgYXQgdGhlXG4gICAgICogICAgICAgICAgZ2l2ZW4gc2l6ZS5cbiAgICAgKi9cbiAgICBQREZGb250LnByb3RvdHlwZS53aWR0aE9mVGV4dEF0U2l6ZSA9IGZ1bmN0aW9uICh0ZXh0LCBzaXplKSB7XG4gICAgICAgIGFzc2VydElzKHRleHQsICd0ZXh0JywgWydzdHJpbmcnXSk7XG4gICAgICAgIGFzc2VydElzKHNpemUsICdzaXplJywgWydudW1iZXInXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVyLndpZHRoT2ZUZXh0QXRTaXplKHRleHQsIHNpemUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWVhc3VyZSB0aGUgaGVpZ2h0IG9mIHRoaXMgZm9udCBhdCBhIGdpdmVuIHNpemUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVpZ2h0ID0gZm9udC5oZWlnaHRBdFNpemUoMjQpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgYG9wdGlvbnMuZGVzY2VuZGVyYCB2YWx1ZSBjb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgZm9udCdzXG4gICAgICogZGVzY2VuZGVyIGlzIGluY2x1ZGVkIGluIHRoZSBoZWlnaHQgY2FsY3VsYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgZm9udCBzaXplIHRvIGJlIHVzZWQgZm9yIHRoaXMgbWVhc3VyZW1lbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbXB1dGluZyB0aGlzIG1lYXN1cmVtZW50LlxuICAgICAqIEByZXR1cm5zIFRoZSBoZWlnaHQgb2YgdGhpcyBmb250IGF0IHRoZSBnaXZlbiBzaXplLlxuICAgICAqL1xuICAgIFBERkZvbnQucHJvdG90eXBlLmhlaWdodEF0U2l6ZSA9IGZ1bmN0aW9uIChzaXplLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgYXNzZXJ0SXMoc2l6ZSwgJ3NpemUnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRlc2NlbmRlciwgJ29wdGlvbnMuZGVzY2VuZGVyJywgWydib29sZWFuJ10pO1xuICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlci5oZWlnaHRPZkZvbnRBdFNpemUoc2l6ZSwge1xuICAgICAgICAgICAgZGVzY2VuZGVyOiAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVzY2VuZGVyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbXB1dGUgdGhlIGZvbnQgc2l6ZSBhdCB3aGljaCB0aGlzIGZvbnQgaXMgYSBnaXZlbiBoZWlnaHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udFNpemUgPSBmb250LnNpemVBdEhlaWdodCgxMilcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgdG8gYmUgdXNlZCBmb3IgdGhpcyBjYWxjdWxhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBUaGUgZm9udCBzaXplIGF0IHdoaWNoIHRoaXMgZm9udCBpcyB0aGUgZ2l2ZW4gaGVpZ2h0LlxuICAgICAqL1xuICAgIFBERkZvbnQucHJvdG90eXBlLnNpemVBdEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVyLnNpemVPZkZvbnRBdEhlaWdodChoZWlnaHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZXQgb2YgdW5pY29kZSBjb2RlIHBvaW50cyB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBieSB0aGlzIGZvbnQuXG4gICAgICogQHJldHVybnMgVGhlIHNldCBvZiB1bmljb2RlIGNvZGUgcG9pbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZvbnQuXG4gICAgICovXG4gICAgUERGRm9udC5wcm90b3R5cGUuZ2V0Q2hhcmFjdGVyU2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5lbWJlZGRlciBpbnN0YW5jZW9mIFN0YW5kYXJkRm9udEVtYmVkZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlci5lbmNvZGluZy5zdXBwb3J0ZWRDb2RlUG9pbnRzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZXIuZm9udC5jaGFyYWN0ZXJTZXQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZVxuICAgICAqID4gW1tQREZEb2N1bWVudC5zYXZlXV0gYW5kIFtbUERGRG9jdW1lbnQuc2F2ZUFzQmFzZTY0XV0gbWV0aG9kcyB3aWxsXG4gICAgICogPiBhdXRvbWF0aWNhbGx5IGVuc3VyZSBhbGwgZm9udHMgZ2V0IGVtYmVkZGVkLlxuICAgICAqXG4gICAgICogRW1iZWQgdGhpcyBmb250IGluIGl0cyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gdGhlIGVtYmVkZGluZyBpcyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBQREZGb250LnByb3RvdHlwZS5lbWJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1vZGlmaWVkKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRkZXIuZW1iZWRJbnRvQ29udGV4dCh0aGlzLmRvYy5jb250ZXh0LCB0aGlzLnJlZildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5lbWJlZEZvbnRdXSBhbmRcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuZW1iZWRTdGFuZGFyZEZvbnRdXSBtZXRob2RzLCB3aGljaCB3aWxsIGNyZWF0ZSBpbnN0YW5jZXNcbiAgICAgKiA+IG9mIFtbUERGRm9udF1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZGb250XV0gZnJvbSBhbiBleGlzdGluZyByZWYgYW5kIGVtYmVkZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIGZvbnQuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhlIGZvbnQgd2lsbCBiZWxvbmcuXG4gICAgICogQHBhcmFtIGVtYmVkZGVyIFRoZSBlbWJlZGRlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBlbWJlZCB0aGUgZm9udC5cbiAgICAgKi9cbiAgICBQREZGb250Lm9mID0gZnVuY3Rpb24gKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkZvbnQocmVmLCBkb2MsIGVtYmVkZGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZGb250O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkZvbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZGb250LmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEb2N1bWVudCBmcm9tIFwiLi9QREZEb2N1bWVudFwiO1xuaW1wb3J0IHsgSnBlZ0VtYmVkZGVyLCBQREZSZWYsIFBuZ0VtYmVkZGVyIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1hZ2UgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqL1xudmFyIFBERkltYWdlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkltYWdlKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICBhc3NlcnRJcyhyZWYsICdyZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIGFzc2VydElzKGRvYywgJ2RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgIGFzc2VydElzKGVtYmVkZGVyLCAnZW1iZWRkZXInLCBbXG4gICAgICAgICAgICBbSnBlZ0VtYmVkZGVyLCAnSnBlZ0VtYmVkZGVyJ10sXG4gICAgICAgICAgICBbUG5nRW1iZWRkZXIsICdQbmdFbWJlZGRlciddLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLndpZHRoID0gZW1iZWRkZXIud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gZW1iZWRkZXIuaGVpZ2h0O1xuICAgICAgICB0aGlzLmVtYmVkZGVyID0gZW1iZWRkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhpcyBpbWFnZSBhZnRlciBiZWluZyBzY2FsZWQgYnkgdGhlXG4gICAgICogZ2l2ZW4gYGZhY3RvcmAuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1hZ2Uud2lkdGggIC8vID0+IDUwMFxuICAgICAqIGltYWdlLmhlaWdodCAvLyA9PiAyNTBcbiAgICAgKlxuICAgICAqIGNvbnN0IHNjYWxlZCA9IGltYWdlLnNjYWxlKDAuNSlcbiAgICAgKiBzY2FsZWQud2lkdGggIC8vID0+IDI1MFxuICAgICAqIHNjYWxlZC5oZWlnaHQgLy8gPT4gMTI1XG4gICAgICogYGBgXG4gICAgICogVGhpcyBvcGVyYXRpb24gaXMgb2Z0ZW4gdXNlZnVsIGJlZm9yZSBkcmF3aW5nIGFuIGltYWdlIHdpdGhcbiAgICAgKiBbW1BERlBhZ2UuZHJhd0ltYWdlXV0gdG8gY29tcHV0ZSB0aGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0gZmFjdG9yIFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhpcyBpbWFnZSBzaG91bGQgYmUgc2NhbGVkLlxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbWFnZSBhZnRlciBiZWluZyBzY2FsZWQuXG4gICAgICovXG4gICAgUERGSW1hZ2UucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24gKGZhY3Rvcikge1xuICAgICAgICBhc3NlcnRJcyhmYWN0b3IsICdmYWN0b3InLCBbJ251bWJlciddKTtcbiAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHRoaXMud2lkdGggKiBmYWN0b3IsIGhlaWdodDogdGhpcy5oZWlnaHQgKiBmYWN0b3IgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGlzIGltYWdlIGFmdGVyIHNjYWxpbmcgaXQgYXMgbGFyZ2UgYXNcbiAgICAgKiBwb3NzaWJsZSB3aGlsZSBtYWludGFpbmluZyBpdHMgYXNwZWN0IHJhdGlvIGFuZCBub3QgZXhjZWVkaW5nIHRoZVxuICAgICAqIHNwZWNpZmllZCBgd2lkdGhgIGFuZCBgaGVpZ2h0YC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBgXG4gICAgICogaW1hZ2Uud2lkdGggIC8vID0+IDUwMFxuICAgICAqIGltYWdlLmhlaWdodCAvLyA9PiAyNTBcbiAgICAgKlxuICAgICAqIGNvbnN0IHNjYWxlZCA9IGltYWdlLnNjYWxlVG9GaXQoNzUwLCAxMDAwKVxuICAgICAqIHNjYWxlZC53aWR0aCAgLy8gPT4gNzUwXG4gICAgICogc2NhbGVkLmhlaWdodCAvLyA9PiAzNzVcbiAgICAgKiBgYGBcbiAgICAgKiBUaGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgcGFyYW1ldGVycyBjYW4gYWxzbyBiZSB0aG91Z2h0IG9mIGFzIHRoZSB3aWR0aFxuICAgICAqIGFuZCBoZWlnaHQgb2YgYSBib3ggdGhhdCB0aGUgc2NhbGVkIGltYWdlIG11c3QgZml0IHdpdGhpbi5cbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIGJvdW5kaW5nIGJveCdzIHdpZHRoLlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGJvdW5kaW5nIGJveCdzIGhlaWdodC5cbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UgYWZ0ZXIgYmVpbmcgc2NhbGVkLlxuICAgICAqL1xuICAgIFBERkltYWdlLnByb3RvdHlwZS5zY2FsZVRvRml0ID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIGltZ1dpZHRoU2NhbGUgPSB3aWR0aCAvIHRoaXMud2lkdGg7XG4gICAgICAgIHZhciBpbWdIZWlnaHRTY2FsZSA9IGhlaWdodCAvIHRoaXMuaGVpZ2h0O1xuICAgICAgICB2YXIgc2NhbGUgPSBNYXRoLm1pbihpbWdXaWR0aFNjYWxlLCBpbWdIZWlnaHRTY2FsZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlKHNjYWxlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGlzIGltYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gaW1hZ2Uuc2l6ZSgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGltYWdlLlxuICAgICAqL1xuICAgIFBERkltYWdlLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSgxKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZVxuICAgICAqID4gW1tQREZEb2N1bWVudC5zYXZlXV0gYW5kIFtbUERGRG9jdW1lbnQuc2F2ZUFzQmFzZTY0XV0gbWV0aG9kcyB3aWxsXG4gICAgICogPiBhdXRvbWF0aWNhbGx5IGVuc3VyZSBhbGwgaW1hZ2VzIGdldCBlbWJlZGRlZC5cbiAgICAgKlxuICAgICAqIEVtYmVkIHRoaXMgaW1hZ2UgaW4gaXRzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZW1iZWRkaW5nIGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkltYWdlLnByb3RvdHlwZS5lbWJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBkb2MsIHJlZjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbWJlZGRlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaW1hZ2Ugc2hvdWxkIG9ubHkgYmUgZW1iZWRkZWQgb25jZS4gSWYgdGhlcmUncyBhIHBlbmRpbmcgZW1iZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdGlvbiB0aGVuIHdhaXQgb24gaXQuIE90aGVyd2lzZSB3ZSBuZWVkIHRvIHN0YXJ0IHRoZSBlbWJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbWJlZFRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMsIGRvYyA9IF9hLmRvYywgcmVmID0gX2EucmVmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRUYXNrID0gdGhpcy5lbWJlZGRlci5lbWJlZEludG9Db250ZXh0KGRvYy5jb250ZXh0LCByZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZFRhc2tdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjbGVhciBgdGhpcy5lbWJlZGRlcmAgc28gdGhhdCB0aGUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGltYWdlIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZCwgdGh1cyBhdm9pZGluZyBhIG1lbW9yeSBsZWFrLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Ib3BkaW5nL3BkZi1saWIvcHVsbC8xMDMyL2ZpbGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWJlZGRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuZW1iZWRQbmddXSBhbmQgW1tQREZEb2N1bWVudC5lbWJlZEpwZ11dXG4gICAgICogPiBtZXRob2RzLCB3aGljaCB3aWxsIGNyZWF0ZSBpbnN0YW5jZXMgb2YgW1tQREZJbWFnZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZJbWFnZV1dIGZyb20gYW4gZXhpc3RpbmcgcmVmIGFuZCBlbWJlZGRlclxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBpbWFnZS5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgaW1hZ2Ugd2lsbCBiZWxvbmcuXG4gICAgICogQHBhcmFtIGVtYmVkZGVyIFRoZSBlbWJlZGRlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBlbWJlZCB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgUERGSW1hZ2Uub2YgPSBmdW5jdGlvbiAocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGSW1hZ2UocmVmLCBkb2MsIGVtYmVkZGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZJbWFnZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZJbWFnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkltYWdlLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFBERk5hbWUsIFBERkFycmF5LCBQREZEaWN0LCBQREZIZXhTdHJpbmcgfSBmcm9tIFwiLi4vY29yZVwiO1xuLyoqXG4gKiBSZXByZXNlbnRzIEphdmFTY3JpcHQgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqL1xudmFyIFBERkphdmFTY3JpcHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGSmF2YVNjcmlwdChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgdGhpcy5hbHJlYWR5RW1iZWRkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmVtYmVkZGVyID0gZW1iZWRkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZVxuICAgICAqID4gW1tQREZEb2N1bWVudC5zYXZlXV0gYW5kIFtbUERGRG9jdW1lbnQuc2F2ZUFzQmFzZTY0XV0gbWV0aG9kcyB3aWxsXG4gICAgICogPiBhdXRvbWF0aWNhbGx5IGVuc3VyZSBhbGwgSmF2YVNjcmlwdHMgZ2V0IGVtYmVkZGVkLlxuICAgICAqXG4gICAgICogRW1iZWQgdGhpcyBKYXZhU2NyaXB0IGluIGl0cyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gdGhlIGVtYmVkZGluZyBpcyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBQREZKYXZhU2NyaXB0LnByb3RvdHlwZS5lbWJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBjYXRhbG9nLCBjb250ZXh0LCByZWYsIE5hbWVzLCBKYXZhc2NyaXB0LCBKU05hbWVzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5hbHJlYWR5RW1iZWRkZWQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzLmRvYywgY2F0YWxvZyA9IF9hLmNhdGFsb2csIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZGRlci5lbWJlZEludG9Db250ZXh0KHRoaXMuZG9jLmNvbnRleHQsIHRoaXMucmVmKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2F0YWxvZy5oYXMoUERGTmFtZS5vZignTmFtZXMnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLnNldChQREZOYW1lLm9mKCdOYW1lcycpLCBjb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXMgPSBjYXRhbG9nLmxvb2t1cChQREZOYW1lLm9mKCdOYW1lcycpLCBQREZEaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTmFtZXMuaGFzKFBERk5hbWUub2YoJ0phdmFTY3JpcHQnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lcy5zZXQoUERGTmFtZS5vZignSmF2YVNjcmlwdCcpLCBjb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgSmF2YXNjcmlwdCA9IE5hbWVzLmxvb2t1cChQREZOYW1lLm9mKCdKYXZhU2NyaXB0JyksIFBERkRpY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKYXZhc2NyaXB0LmhhcyhQREZOYW1lLm9mKCdOYW1lcycpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFzY3JpcHQuc2V0KFBERk5hbWUub2YoJ05hbWVzJyksIGNvbnRleHQub2JqKFtdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBKU05hbWVzID0gSmF2YXNjcmlwdC5sb29rdXAoUERGTmFtZS5vZignTmFtZXMnKSwgUERGQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSlNOYW1lcy5wdXNoKFBERkhleFN0cmluZy5mcm9tVGV4dCh0aGlzLmVtYmVkZGVyLnNjcmlwdE5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTTmFtZXMucHVzaChyZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5RW1iZWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuYWRkSmF2YVNjcmlwdF1dIG1ldGhvZCwgd2hpY2ggd2lsbFxuICAgICAqIGNyZWF0ZSBpbnN0YW5jZXMgb2YgW1tQREZKYXZhU2NyaXB0XV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkphdmFTY3JpcHRdXSBmcm9tIGFuIGV4aXN0aW5nIHJlZiBhbmQgc2NyaXB0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIHNjcmlwdC5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgc2NyaXB0IHdpbGwgYmVsb25nLlxuICAgICAqIEBwYXJhbSBlbWJlZGRlciBUaGUgZW1iZWRkZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZW1iZWQgdGhlIHNjcmlwdC5cbiAgICAgKi9cbiAgICBQREZKYXZhU2NyaXB0Lm9mID0gZnVuY3Rpb24gKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkphdmFTY3JpcHQocmVmLCBkb2MsIGVtYmVkZGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZKYXZhU2NyaXB0O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkphdmFTY3JpcHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZKYXZhU2NyaXB0LmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRyYXdJbWFnZSwgZHJhd0xpbmUsIGRyYXdMaW5lc09mVGV4dCwgZHJhd1BhZ2UsIGRyYXdSZWN0YW5nbGUsIGRyYXdTdmdQYXRoLCBkcmF3RWxsaXBzZSwgfSBmcm9tIFwiLi9vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBwb3BHcmFwaGljc1N0YXRlLCBwdXNoR3JhcGhpY3NTdGF0ZSwgdHJhbnNsYXRlLCBMaW5lQ2FwU3R5bGUsIHNjYWxlLCB9IGZyb20gXCIuL29wZXJhdG9yc1wiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuL1BERkRvY3VtZW50XCI7XG5pbXBvcnQgUERGRW1iZWRkZWRQYWdlIGZyb20gXCIuL1BERkVtYmVkZGVkUGFnZVwiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4vUERGRm9udFwiO1xuaW1wb3J0IFBERkltYWdlIGZyb20gXCIuL1BERkltYWdlXCI7XG5pbXBvcnQgeyBCbGVuZE1vZGUsIH0gZnJvbSBcIi4vUERGUGFnZU9wdGlvbnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMsIHRvRGVncmVlcyB9IGZyb20gXCIuL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgU3RhbmRhcmRGb250cyB9IGZyb20gXCIuL1N0YW5kYXJkRm9udHNcIjtcbmltcG9ydCB7IFBERkNvbnRlbnRTdHJlYW0sIFBERk5hbWUsIFBERk9wZXJhdG9yLCBQREZQYWdlTGVhZiwgUERGUmVmLCBQREZEaWN0LCBQREZBcnJheSwgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0RWFjaElzLCBhc3NlcnRJcywgYXNzZXJ0TXVsdGlwbGUsIGFzc2VydE9yVW5kZWZpbmVkLCBicmVha1RleHRJbnRvTGluZXMsIGNsZWFuVGV4dCwgcmVjdGFuZ2xlc0FyZUVxdWFsLCBsaW5lU3BsaXQsIGFzc2VydFJhbmdlT3JVbmRlZmluZWQsIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZCwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIHNpbmdsZSBwYWdlIG9mIGEgW1tQREZEb2N1bWVudF1dLlxuICovXG52YXIgUERGUGFnZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZQYWdlKGxlYWZOb2RlLCByZWYsIGRvYykge1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gMjQ7XG4gICAgICAgIHRoaXMuZm9udENvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICB0aGlzLmxpbmVIZWlnaHQgPSAyNDtcbiAgICAgICAgdGhpcy54ID0gMDtcbiAgICAgICAgdGhpcy55ID0gMDtcbiAgICAgICAgYXNzZXJ0SXMobGVhZk5vZGUsICdsZWFmTm9kZScsIFtbUERGUGFnZUxlYWYsICdQREZQYWdlTGVhZiddXSk7XG4gICAgICAgIGFzc2VydElzKHJlZiwgJ3JlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbGVhZk5vZGU7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUm90YXRlIHRoaXMgcGFnZSBieSBhIG11bHRpcGxlIG9mIDkwIGRlZ3JlZXMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMoLTkwKSlcbiAgICAgKiBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMoMCkpXG4gICAgICogcGFnZS5zZXRSb3RhdGlvbihkZWdyZWVzKDkwKSlcbiAgICAgKiBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMoMTgwKSlcbiAgICAgKiBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMoMjcwKSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gYW5nbGUgVGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGlzIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0Um90YXRpb24gPSBmdW5jdGlvbiAoYW5nbGUpIHtcbiAgICAgICAgdmFyIGRlZ3JlZXNBbmdsZSA9IHRvRGVncmVlcyhhbmdsZSk7XG4gICAgICAgIGFzc2VydE11bHRpcGxlKGRlZ3JlZXNBbmdsZSwgJ2RlZ3JlZXNBbmdsZScsIDkwKTtcbiAgICAgICAgdGhpcy5ub2RlLnNldChQREZOYW1lLm9mKCdSb3RhdGUnKSwgdGhpcy5kb2MuY29udGV4dC5vYmooZGVncmVlc0FuZ2xlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBwYWdlJ3Mgcm90YXRpb24gYW5nbGUgaW4gZGVncmVlcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByb3RhdGlvbkFuZ2xlID0gcGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlO1xuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgcGFnZSBpbiBkZWdyZWVzIChhbHdheXMgYSBtdWx0aXBsZSBvZlxuICAgICAqICAgICAgICAgIDkwIGRlZ3JlZXMpLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFJvdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgUm90YXRlID0gdGhpcy5ub2RlLlJvdGF0ZSgpO1xuICAgICAgICByZXR1cm4gZGVncmVlcyhSb3RhdGUgPyBSb3RhdGUuYXNOdW1iZXIoKSA6IDApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzaXplIHRoaXMgcGFnZSBieSBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgaXRzIHdpZHRoIGFuZCBoZWlnaHQuIEZvclxuICAgICAqIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLnNldFNpemUoMjUwLCA1MDApXG4gICAgICogcGFnZS5zZXRTaXplKHBhZ2UuZ2V0V2lkdGgoKSArIDUwLCBwYWdlLmdldEhlaWdodCgpICsgMTAwKVxuICAgICAqIHBhZ2Uuc2V0U2l6ZShwYWdlLmdldFdpZHRoKCkgLSA1MCwgcGFnZS5nZXRIZWlnaHQoKSAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGUgUERGIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgZm9yIHBhZ2VzIHRvIGhhdmUgZXhwbGljaXRcbiAgICAgKiB3aWR0aHMgYW5kIGhlaWdodHMuIEluc3RlYWQgaXQgZGVmaW5lcyB0aGUgXCJzaXplXCIgb2YgYSBwYWdlIGluIHRlcm1zIG9mXG4gICAgICogZml2ZSByZWN0YW5nbGVzOiB0aGUgTWVkaWFCb3gsIENyb3BCb3gsIEJsZWVkQm94LCBUcmltQm94LCBhbmQgQXJ0Qm94LiBBcyBhXG4gICAgICogcmVzdWx0LCB0aGlzIG1ldGhvZCBjYW5ub3QgZGlyZWN0bHkgY2hhbmdlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGEgcGFnZS5cbiAgICAgKiBJbnN0ZWFkLCBpdCB3b3JrcyBieSBhZGp1c3RpbmcgdGhlc2UgZml2ZSBib3hlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gICAgICogICAxLiBTZXQgd2lkdGggJiBoZWlnaHQgb2YgTWVkaWFCb3guXG4gICAgICogICAyLiBTZXQgd2lkdGggJiBoZWlnaHQgb2YgQ3JvcEJveCwgaWYgaXQgaGFzIHNhbWUgZGltZW5zaW9ucyBhcyBNZWRpYUJveC5cbiAgICAgKiAgIDMuIFNldCB3aWR0aCAmIGhlaWdodCBvZiBCbGVlZEJveCwgaWYgaXQgaGFzIHNhbWUgZGltZW5zaW9ucyBhcyBNZWRpYUJveC5cbiAgICAgKiAgIDQuIFNldCB3aWR0aCAmIGhlaWdodCBvZiBUcmltQm94LCBpZiBpdCBoYXMgc2FtZSBkaW1lbnNpb25zIGFzIE1lZGlhQm94LlxuICAgICAqICAgNS4gU2V0IHdpZHRoICYgaGVpZ2h0IG9mIEFydEJveCwgaWYgaXQgaGFzIHNhbWUgZGltZW5zaW9ucyBhcyBNZWRpYUJveC5cbiAgICAgKlxuICAgICAqIFRoaXMgYXBwcm9hY2ggd29ya3Mgd2VsbCBmb3IgbW9zdCBQREYgZG9jdW1lbnRzIGFzIGFsbCBQREYgcGFnZXMgbXVzdFxuICAgICAqIGhhdmUgYSBNZWRpYUJveCwgYnV0IHJlbGF0aXZlbHkgZmV3IGhhdmUgYSBDcm9wQm94LCBCbGVlZEJveCwgVHJpbUJveCwgb3JcbiAgICAgKiBBcnRCb3guIEFuZCB3aGVuIHRoZXkgZG8gaGF2ZSB0aGVzZSBhZGRpdGlvbmFsIGJveGVzLCB0aGV5IG9mdGVuIGhhdmUgdGhlXG4gICAgICogc2FtZSBkaW1lbnNpb25zIGFzIHRoZSBNZWRpYUJveC4gSG93ZXZlciwgaWYgeW91IGZpbmQgdGhpcyBtZXRob2QgZG9lcyBub3RcbiAgICAgKiB3b3JrIGZvciB5b3VyIGRvY3VtZW50LCBjb25zaWRlciBzZXR0aW5nIHRoZSBib3hlcyBkaXJlY3RseTpcbiAgICAgKiAgICogW1tQREZQYWdlLnNldE1lZGlhQm94XV1cbiAgICAgKiAgICogW1tQREZQYWdlLnNldENyb3BCb3hdXVxuICAgICAqICAgKiBbW1BERlBhZ2Uuc2V0QmxlZWRCb3hdXVxuICAgICAqICAgKiBbW1BERlBhZ2Uuc2V0VHJpbUJveF1dXG4gICAgICogICAqIFtbUERGUGFnZS5zZXRBcnRCb3hdXVxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSBuZXcgd2lkdGggb2YgdGhlIHBhZ2UuXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgbmV3IGhlaWdodCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRTaXplID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIG1lZGlhQm94ID0gdGhpcy5nZXRNZWRpYUJveCgpO1xuICAgICAgICB0aGlzLnNldE1lZGlhQm94KG1lZGlhQm94LngsIG1lZGlhQm94LnksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB2YXIgY3JvcEJveCA9IHRoaXMuZ2V0Q3JvcEJveCgpO1xuICAgICAgICB2YXIgYmxlZWRCb3ggPSB0aGlzLmdldEJsZWVkQm94KCk7XG4gICAgICAgIHZhciB0cmltQm94ID0gdGhpcy5nZXRUcmltQm94KCk7XG4gICAgICAgIHZhciBhcnRCb3ggPSB0aGlzLmdldEFydEJveCgpO1xuICAgICAgICB2YXIgaGFzQ3JvcEJveCA9IHRoaXMubm9kZS5Dcm9wQm94KCk7XG4gICAgICAgIHZhciBoYXNCbGVlZEJveCA9IHRoaXMubm9kZS5CbGVlZEJveCgpO1xuICAgICAgICB2YXIgaGFzVHJpbUJveCA9IHRoaXMubm9kZS5UcmltQm94KCk7XG4gICAgICAgIHZhciBoYXNBcnRCb3ggPSB0aGlzLm5vZGUuQXJ0Qm94KCk7XG4gICAgICAgIGlmIChoYXNDcm9wQm94ICYmIHJlY3RhbmdsZXNBcmVFcXVhbChjcm9wQm94LCBtZWRpYUJveCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3JvcEJveChtZWRpYUJveC54LCBtZWRpYUJveC55LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzQmxlZWRCb3ggJiYgcmVjdGFuZ2xlc0FyZUVxdWFsKGJsZWVkQm94LCBtZWRpYUJveCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmxlZWRCb3gobWVkaWFCb3gueCwgbWVkaWFCb3gueSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1RyaW1Cb3ggJiYgcmVjdGFuZ2xlc0FyZUVxdWFsKHRyaW1Cb3gsIG1lZGlhQm94KSkge1xuICAgICAgICAgICAgdGhpcy5zZXRUcmltQm94KG1lZGlhQm94LngsIG1lZGlhQm94LnksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNBcnRCb3ggJiYgcmVjdGFuZ2xlc0FyZUVxdWFsKGFydEJveCwgbWVkaWFCb3gpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEFydEJveChtZWRpYUJveC54LCBtZWRpYUJveC55LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzaXplIHRoaXMgcGFnZSBieSBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgaXRzIHdpZHRoLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2Uuc2V0V2lkdGgoMjUwKVxuICAgICAqIHBhZ2Uuc2V0V2lkdGgocGFnZS5nZXRXaWR0aCgpICsgNTApXG4gICAgICogcGFnZS5zZXRXaWR0aChwYWdlLmdldFdpZHRoKCkgLSA1MClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgW1tQREZQYWdlLnNldFNpemVdXSB0byBzZXQgdGhlIHBhZ2UncyB3aWR0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgbmV3IHdpZHRoIG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldFdpZHRoID0gZnVuY3Rpb24gKHdpZHRoKSB7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCB0aGlzLmdldFNpemUoKS5oZWlnaHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzaXplIHRoaXMgcGFnZSBieSBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgaXRzIGhlaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLnNldEhlaWdodCg1MDApXG4gICAgICogcGFnZS5zZXRIZWlnaHQocGFnZS5nZXRXaWR0aCgpICsgMTAwKVxuICAgICAqIHBhZ2Uuc2V0SGVpZ2h0KHBhZ2UuZ2V0V2lkdGgoKSAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgW1tQREZQYWdlLnNldFNpemVdXSB0byBzZXQgdGhlIHBhZ2UncyBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBuZXcgaGVpZ2h0IG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMuc2V0U2l6ZSh0aGlzLmdldFNpemUoKS53aWR0aCwgaGVpZ2h0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgTWVkaWFCb3ggb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG1lZGlhQm94ID0gcGFnZS5nZXRNZWRpYUJveCgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldE1lZGlhQm94KDAsIDAsIDI1MCwgNTAwKVxuICAgICAqIHBhZ2Uuc2V0TWVkaWFCb3gobWVkaWFCb3gueCwgbWVkaWFCb3gueSwgNTAsIDEwMClcbiAgICAgKiBwYWdlLnNldE1lZGlhQm94KDE1LCA1LCBtZWRpYUJveC53aWR0aCAtIDUwLCBtZWRpYUJveC5oZWlnaHQgLSAxMDApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTZWUgW1tQREZQYWdlLmdldE1lZGlhQm94XV0gZm9yIGRldGFpbHMgYWJvdXQgd2hhdCB0aGUgTWVkaWFCb3ggcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgTWVkaWFCb3guXG4gICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBNZWRpYUJveC5cbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBuZXcgTWVkaWFCb3guXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBuZXcgTWVkaWFCb3guXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0TWVkaWFCb3ggPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgbWVkaWFCb3ggPSB0aGlzLmRvYy5jb250ZXh0Lm9iaihbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSk7XG4gICAgICAgIHRoaXMubm9kZS5zZXQoUERGTmFtZS5NZWRpYUJveCwgbWVkaWFCb3gpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBDcm9wQm94IG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjcm9wQm94ID0gcGFnZS5nZXRDcm9wQm94KClcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Q3JvcEJveCgwLCAwLCAyNTAsIDUwMClcbiAgICAgKiBwYWdlLnNldENyb3BCb3goY3JvcEJveC54LCBjcm9wQm94LnksIDUwLCAxMDApXG4gICAgICogcGFnZS5zZXRDcm9wQm94KDE1LCA1LCBjcm9wQm94LndpZHRoIC0gNTAsIGNyb3BCb3guaGVpZ2h0IC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2VlIFtbUERGUGFnZS5nZXRDcm9wQm94XV0gZm9yIGRldGFpbHMgYWJvdXQgd2hhdCB0aGUgQ3JvcEJveCByZXByZXNlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBDcm9wQm94LlxuICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgQ3JvcEJveC5cbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBuZXcgQ3JvcEJveC5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIG5ldyBDcm9wQm94LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldENyb3BCb3ggPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgY3JvcEJveCA9IHRoaXMuZG9jLmNvbnRleHQub2JqKFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdKTtcbiAgICAgICAgdGhpcy5ub2RlLnNldChQREZOYW1lLkNyb3BCb3gsIGNyb3BCb3gpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBCbGVlZEJveCBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYmxlZWRCb3ggPSBwYWdlLmdldEJsZWVkQm94KClcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0QmxlZWRCb3goMCwgMCwgMjUwLCA1MDApXG4gICAgICogcGFnZS5zZXRCbGVlZEJveChibGVlZEJveC54LCBibGVlZEJveC55LCA1MCwgMTAwKVxuICAgICAqIHBhZ2Uuc2V0QmxlZWRCb3goMTUsIDUsIGJsZWVkQm94LndpZHRoIC0gNTAsIGJsZWVkQm94LmhlaWdodCAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBbW1BERlBhZ2UuZ2V0QmxlZWRCb3hdXSBmb3IgZGV0YWlscyBhYm91dCB3aGF0IHRoZSBCbGVlZEJveCByZXByZXNlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBCbGVlZEJveC5cbiAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IEJsZWVkQm94LlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG5ldyBCbGVlZEJveC5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIG5ldyBCbGVlZEJveC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRCbGVlZEJveCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBibGVlZEJveCA9IHRoaXMuZG9jLmNvbnRleHQub2JqKFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdKTtcbiAgICAgICAgdGhpcy5ub2RlLnNldChQREZOYW1lLkJsZWVkQm94LCBibGVlZEJveCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIFRyaW1Cb3ggb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRyaW1Cb3ggPSBwYWdlLmdldFRyaW1Cb3goKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRUcmltQm94KDAsIDAsIDI1MCwgNTAwKVxuICAgICAqIHBhZ2Uuc2V0VHJpbUJveCh0cmltQm94LngsIHRyaW1Cb3gueSwgNTAsIDEwMClcbiAgICAgKiBwYWdlLnNldFRyaW1Cb3goMTUsIDUsIHRyaW1Cb3gud2lkdGggLSA1MCwgdHJpbUJveC5oZWlnaHQgLSAxMDApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTZWUgW1tQREZQYWdlLmdldFRyaW1Cb3hdXSBmb3IgZGV0YWlscyBhYm91dCB3aGF0IHRoZSBUcmltQm94IHJlcHJlc2VudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IFRyaW1Cb3guXG4gICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBUcmltQm94LlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG5ldyBUcmltQm94LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbmV3IFRyaW1Cb3guXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0VHJpbUJveCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciB0cmltQm94ID0gdGhpcy5kb2MuY29udGV4dC5vYmooW3gsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodF0pO1xuICAgICAgICB0aGlzLm5vZGUuc2V0KFBERk5hbWUuVHJpbUJveCwgdHJpbUJveCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIEFydEJveCBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYXJ0Qm94ID0gcGFnZS5nZXRBcnRCb3goKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRBcnRCb3goMCwgMCwgMjUwLCA1MDApXG4gICAgICogcGFnZS5zZXRBcnRCb3goYXJ0Qm94LngsIGFydEJveC55LCA1MCwgMTAwKVxuICAgICAqIHBhZ2Uuc2V0QXJ0Qm94KDE1LCA1LCBhcnRCb3gud2lkdGggLSA1MCwgYXJ0Qm94LmhlaWdodCAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBbW1BERlBhZ2UuZ2V0QXJ0Qm94XV0gZm9yIGRldGFpbHMgYWJvdXQgd2hhdCB0aGUgQXJ0Qm94IHJlcHJlc2VudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IEFydEJveC5cbiAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IEFydEJveC5cbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBuZXcgQXJ0Qm94LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbmV3IEFydEJveC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRBcnRCb3ggPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgYXJ0Qm94ID0gdGhpcy5kb2MuY29udGV4dC5vYmooW3gsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodF0pO1xuICAgICAgICB0aGlzLm5vZGUuc2V0KFBERk5hbWUuQXJ0Qm94LCBhcnRCb3gpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgcGFnZSdzIHdpZHRoIGFuZCBoZWlnaHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldFNpemUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgdXNlcyBbW1BERlBhZ2UuZ2V0TWVkaWFCb3hdXSB0byBvYnRhaW4gdGhlIHBhZ2Unc1xuICAgICAqIHdpZHRoIGFuZCBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmdldE1lZGlhQm94KCksIHdpZHRoID0gX2Eud2lkdGgsIGhlaWdodCA9IF9hLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgcGFnZSdzIHdpZHRoLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHdpZHRoID0gcGFnZS5nZXRXaWR0aCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIFtbUERGUGFnZS5nZXRTaXplXV0gdG8gb2J0YWluIHRoZSBwYWdlJ3Mgc2l6ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2l6ZSgpLndpZHRoO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgcGFnZSdzIGhlaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWlnaHQgPSBwYWdlLmdldEhlaWdodCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIFtbUERGUGFnZS5nZXRTaXplXV0gdG8gb2J0YWluIHRoZSBwYWdlJ3Mgc2l6ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBoZWlnaHQgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTaXplKCkuaGVpZ2h0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZWN0YW5nbGUgZGVmaW5pbmcgdGhpcyBwYWdlJ3MgTWVkaWFCb3guIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldE1lZGlhQm94KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBNZWRpYUJveCBvZiBhIHBhZ2UgZGVmaW5lcyB0aGUgYm91bmRhcmllcyBvZiB0aGUgcGh5c2ljYWwgbWVkaXVtIG9uXG4gICAgICogd2hpY2ggdGhlIHBhZ2UgaXMgdG8gYmUgZGlzcGxheWVkL3ByaW50ZWQuIEl0IG1heSBpbmNsdWRlIGV4dGVuZGVkIGFyZWFcbiAgICAgKiBzdXJyb3VuZGluZyB0aGUgcGFnZSBjb250ZW50IGZvciBibGVlZCBtYXJrcywgcHJpbnRpbmcgbWFya3MsIGV0Yy4uLlxuICAgICAqIEl0IG1heSBhbHNvIGluY2x1ZGUgYXJlYXMgY2xvc2UgdG8gdGhlIGVkZ2VzIG9mIHRoZSBtZWRpdW0gdGhhdCBjYW5ub3QgYmVcbiAgICAgKiBtYXJrZWQgYmVjYXVzZSBvZiBwaHlzaWNhbCBsaW1pdGF0aW9ucyBvZiB0aGUgb3V0cHV0IGRldmljZS4gQ29udGVudFxuICAgICAqIGZhbGxpbmcgb3V0c2lkZSB0aGlzIGJvdW5kYXJ5IG1heSBzYWZlbHkgYmUgZGlzY2FyZGVkIHdpdGhvdXQgYWZmZWN0aW5nXG4gICAgICogdGhlIG1lYW5pbmcgb2YgdGhlIFBERiBmaWxlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGRlZmluaW5nIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgTWVkaWFCb3ggYW5kIGl0c1xuICAgICAqICAgICAgICAgIHdpZHRoICYgaGVpZ2h0LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldE1lZGlhQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWVkaWFCb3ggPSB0aGlzLm5vZGUuTWVkaWFCb3goKTtcbiAgICAgICAgcmV0dXJuIG1lZGlhQm94LmFzUmVjdGFuZ2xlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlY3RhbmdsZSBkZWZpbmluZyB0aGlzIHBhZ2UncyBDcm9wQm94LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcGFnZS5nZXRDcm9wQm94KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBDcm9wQm94IG9mIGEgcGFnZSBkZWZpbmVzIHRoZSByZWdpb24gdG8gd2hpY2ggdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWdlXG4gICAgICogc2hhbGwgYmUgY2xpcHBlZCB3aGVuIGRpc3BsYXllZCBvciBwcmludGVkLiBVbmxpa2UgdGhlIG90aGVyIGJveGVzLCB0aGVcbiAgICAgKiBDcm9wQm94IGRvZXMgbm90IG5lY2Vzc2FyaWx5IHJlcHJlc2VudCB0aGUgcGh5c2ljYWwgcGFnZSBnZW9tZXRyeS4gSXRcbiAgICAgKiBtZXJlbHkgaW1wb3NlcyBjbGlwcGluZyBvbiB0aGUgcGFnZSBjb250ZW50cy5cbiAgICAgKlxuICAgICAqIFRoZSBDcm9wQm94J3MgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgcGFnZSdzIE1lZGlhQm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGRlZmluaW5nIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgQ3JvcEJveCBhbmQgaXRzXG4gICAgICogICAgICAgICAgd2lkdGggJiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0Q3JvcEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgY3JvcEJveCA9IHRoaXMubm9kZS5Dcm9wQm94KCk7XG4gICAgICAgIHJldHVybiAoX2EgPSBjcm9wQm94ID09PSBudWxsIHx8IGNyb3BCb3ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNyb3BCb3guYXNSZWN0YW5nbGUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5nZXRNZWRpYUJveCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZWN0YW5nbGUgZGVmaW5pbmcgdGhpcyBwYWdlJ3MgQmxlZWRCb3guIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldEJsZWVkQm94KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBCbGVlZEJveCBvZiBhIHBhZ2UgZGVmaW5lcyB0aGUgcmVnaW9uIHRvIHdoaWNoIHRoZSBjb250ZW50cyBvZiB0aGVcbiAgICAgKiBwYWdlIHNoYWxsIGJlIGNsaXBwZWQgd2hlbiBvdXRwdXQgaW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50LiBUaGlzIG1heVxuICAgICAqIGluY2x1ZGUgYW55IGV4dHJhIGJsZWVkIGFyZWEgbmVlZGVkIHRvIGFjY29tbW9kYXRlIHRoZSBwaHlzaWNhbFxuICAgICAqIGxpbWl0YXRpb25zIG9mIGN1dHRpbmcsIGZvbGRpbmcsIGFuZCB0cmltbWluZyBlcXVpcG1lbnQuIFRoZSBhY3R1YWxcbiAgICAgKiBwcmludGVkIHBhZ2UgbWF5IGluY2x1ZGUgcHJpbnRpbmcgbWFya3MgdGhhdCBmYWxsIG91dHNpZGUgdGhlIEJsZWVkQm94LlxuICAgICAqXG4gICAgICogVGhlIEJsZWVkQm94J3MgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgcGFnZSdzIENyb3BCb3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBCbGVlZEJveCBhbmQgaXRzXG4gICAgICogICAgICAgICAgd2lkdGggJiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0QmxlZWRCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGJsZWVkQm94ID0gdGhpcy5ub2RlLkJsZWVkQm94KCk7XG4gICAgICAgIHJldHVybiAoX2EgPSBibGVlZEJveCA9PT0gbnVsbCB8fCBibGVlZEJveCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYmxlZWRCb3guYXNSZWN0YW5nbGUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5nZXRDcm9wQm94KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlY3RhbmdsZSBkZWZpbmluZyB0aGlzIHBhZ2UncyBUcmltQm94LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcGFnZS5nZXRUcmltQm94KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBUcmltQm94IG9mIGEgcGFnZSBkZWZpbmVzIHRoZSBpbnRlbmRlZCBkaW1lbnNpb25zIG9mIHRoZSBmaW5pc2hlZFxuICAgICAqIHBhZ2UgYWZ0ZXIgdHJpbW1pbmcuIEl0IG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIE1lZGlhQm94IHRvIGFsbG93IGZvclxuICAgICAqIHByb2R1Y3Rpb24tcmVsYXRlZCBjb250ZW50LCBzdWNoIGFzIHByaW50aW5nIGluc3RydWN0aW9ucywgY3V0IG1hcmtzLCBvclxuICAgICAqIGNvbG9yIGJhcnMuXG4gICAgICpcbiAgICAgKiBUaGUgVHJpbUJveCdzIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHBhZ2UncyBDcm9wQm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGRlZmluaW5nIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgVHJpbUJveCBhbmQgaXRzXG4gICAgICogICAgICAgICAgd2lkdGggJiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0VHJpbUJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdHJpbUJveCA9IHRoaXMubm9kZS5UcmltQm94KCk7XG4gICAgICAgIHJldHVybiAoX2EgPSB0cmltQm94ID09PSBudWxsIHx8IHRyaW1Cb3ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRyaW1Cb3guYXNSZWN0YW5nbGUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5nZXRDcm9wQm94KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlY3RhbmdsZSBkZWZpbmluZyB0aGlzIHBhZ2UncyBBcnRCb3guIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldEFydEJveCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgQXJ0Qm94IG9mIGEgcGFnZSBkZWZpbmVzIHRoZSBleHRlbnQgb2YgdGhlIHBhZ2UncyBtZWFuaW5nZnVsIGNvbnRlbnRcbiAgICAgKiAoaW5jbHVkaW5nIHBvdGVudGlhbCB3aGl0ZSBzcGFjZSkuXG4gICAgICpcbiAgICAgKiBUaGUgQXJ0Qm94J3MgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgcGFnZSdzIENyb3BCb3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBBcnRCb3ggYW5kIGl0c1xuICAgICAqICAgICAgICAgIHdpZHRoICYgaGVpZ2h0LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldEFydEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYXJ0Qm94ID0gdGhpcy5ub2RlLkFydEJveCgpO1xuICAgICAgICByZXR1cm4gKF9hID0gYXJ0Qm94ID09PSBudWxsIHx8IGFydEJveCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXJ0Qm94LmFzUmVjdGFuZ2xlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuZ2V0Q3JvcEJveCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlIHRoaXMgcGFnZSdzIGNvbnRlbnQgdG8gYSBuZXcgbG9jYXRpb24gb24gdGhlIHBhZ2UuIFRoaXMgb3BlcmF0aW9uXG4gICAgICogaXMgb2Z0ZW4gdXNlZnVsIGFmdGVyIHJlc2l6aW5nIHRoZSBwYWdlIHdpdGggW1tzZXRTaXplXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gQWRkIDUwIHVuaXRzIG9mIHdoaXRlc3BhY2UgdG8gdGhlIHRvcCBhbmQgcmlnaHQgb2YgdGhlIHBhZ2VcbiAgICAgKiBwYWdlLnNldFNpemUocGFnZS5nZXRXaWR0aCgpICsgNTAsIHBhZ2UuZ2V0SGVpZ2h0KCkgKyA1MClcbiAgICAgKlxuICAgICAqIC8vIE1vdmUgdGhlIHBhZ2UncyBjb250ZW50IGZyb20gdGhlIGxvd2VyLWxlZnQgY29ybmVyIG9mIHRoZSBwYWdlXG4gICAgICogLy8gdG8gdGhlIHRvcC1yaWdodCBjb3JuZXIuXG4gICAgICogcGFnZS50cmFuc2xhdGVDb250ZW50KDUwLCA1MClcbiAgICAgKlxuICAgICAqIC8vIE5vdyB0aGVyZSBhcmUgNTAgdW5pdHMgb2Ygd2hpdGVzcGFjZSB0byB0aGUgbGVmdCBhbmQgYm90dG9tIG9mIHRoZSBwYWdlXG4gICAgICogYGBgXG4gICAgICogU2VlIGFsc286IFtbcmVzZXRQb3NpdGlvbl1dXG4gICAgICogQHBhcmFtIHggVGhlIG5ldyBwb3NpdGlvbiBvbiB0aGUgeC1heGlzIGZvciB0aGlzIHBhZ2UncyBjb250ZW50LlxuICAgICAqIEBwYXJhbSB5IFRoZSBuZXcgcG9zaXRpb24gb24gdGhlIHktYXhpcyBmb3IgdGhpcyBwYWdlJ3MgY29udGVudC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS50cmFuc2xhdGVDb250ZW50ID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5ub2RlLm5vcm1hbGl6ZSgpO1xuICAgICAgICB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jcmVhdGVDb250ZW50U3RyZWFtKHB1c2hHcmFwaGljc1N0YXRlKCksIHRyYW5zbGF0ZSh4LCB5KSk7XG4gICAgICAgIHZhciBzdGFydFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIoc3RhcnQpO1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5jcmVhdGVDb250ZW50U3RyZWFtKHBvcEdyYXBoaWNzU3RhdGUoKSk7XG4gICAgICAgIHZhciBlbmRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKGVuZCk7XG4gICAgICAgIHRoaXMubm9kZS53cmFwQ29udGVudFN0cmVhbXMoc3RhcnRSZWYsIGVuZFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTY2FsZSB0aGUgc2l6ZSwgY29udGVudCwgYW5kIGFubm90YXRpb25zIG9mIGEgcGFnZS5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5zY2FsZSgwLjUsIDAuNSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoZSB3aWR0aCBmb3IgdGhlIHBhZ2Ugc2hvdWxkIGJlIHNjYWxlZFxuICAgICAqICAgICAgICAgIChlLmcuIGAwLjVgIGlzIDUwJSkuXG4gICAgICogQHBhcmFtIHkgVGhlIGZhY3RvciBieSB3aGljaCB0aGUgaGVpZ2h0IGZvciB0aGUgcGFnZSBzaG91bGQgYmUgc2NhbGVkXG4gICAgICogICAgICAgICAgKGUuZy4gYDIuMGAgaXMgMjAwJSkuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnNldFNpemUodGhpcy5nZXRXaWR0aCgpICogeCwgdGhpcy5nZXRIZWlnaHQoKSAqIHkpO1xuICAgICAgICB0aGlzLnNjYWxlQ29udGVudCh4LCB5KTtcbiAgICAgICAgdGhpcy5zY2FsZUFubm90YXRpb25zKHgsIHkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGNvbnRlbnQgb2YgYSBwYWdlLiBUaGlzIGlzIHVzZWZ1bCBhZnRlciByZXNpemluZyBhbiBleGlzdGluZ1xuICAgICAqIHBhZ2UuIFRoaXMgc2NhbGVzIG9ubHkgdGhlIGNvbnRlbnQsIG5vdCB0aGUgYW5ub3RhdGlvbnMuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIEJpc2VjdCB0aGUgc2l6ZSBvZiB0aGUgcGFnZVxuICAgICAqIHBhZ2Uuc2V0U2l6ZShwYWdlLmdldFdpZHRoKCkgLyAyLCBwYWdlLmdldEhlaWdodCgpIC8gMik7XG4gICAgICpcbiAgICAgKiAvLyBTY2FsZSB0aGUgY29udGVudCBvZiB0aGUgcGFnZSBkb3duIGJ5IDUwJSBpbiB4IGFuZCB5XG4gICAgICogcGFnZS5zY2FsZUNvbnRlbnQoMC41LCAwLjUpO1xuICAgICAqIGBgYFxuICAgICAqIFNlZSBhbHNvOiBbW3NjYWxlQW5ub3RhdGlvbnNdXVxuICAgICAqIEBwYXJhbSB4IFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhlIHgtYXhpcyBmb3IgdGhlIGNvbnRlbnQgc2hvdWxkIGJlIHNjYWxlZFxuICAgICAqICAgICAgICAgIChlLmcuIGAwLjVgIGlzIDUwJSkuXG4gICAgICogQHBhcmFtIHkgVGhlIGZhY3RvciBieSB3aGljaCB0aGUgeS1heGlzIGZvciB0aGUgY29udGVudCBzaG91bGQgYmUgc2NhbGVkXG4gICAgICogICAgICAgICAgKGUuZy4gYDIuMGAgaXMgMjAwJSkuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2NhbGVDb250ZW50ID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5ub2RlLm5vcm1hbGl6ZSgpO1xuICAgICAgICB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jcmVhdGVDb250ZW50U3RyZWFtKHB1c2hHcmFwaGljc1N0YXRlKCksIHNjYWxlKHgsIHkpKTtcbiAgICAgICAgdmFyIHN0YXJ0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3RlcihzdGFydCk7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLmNyZWF0ZUNvbnRlbnRTdHJlYW0ocG9wR3JhcGhpY3NTdGF0ZSgpKTtcbiAgICAgICAgdmFyIGVuZFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIoZW5kKTtcbiAgICAgICAgdGhpcy5ub2RlLndyYXBDb250ZW50U3RyZWFtcyhzdGFydFJlZiwgZW5kUmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBhbm5vdGF0aW9ucyBvZiBhIHBhZ2UuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHNjYWxlIGFcbiAgICAgKiBwYWdlIHdpdGggY29tbWVudHMgb3Igb3RoZXIgYW5ub3RhdGlvbnMuXG4gICAgICogYGBganNcbiAgICAgKiAvLyBTY2FsZSB0aGUgY29udGVudCBvZiB0aGUgcGFnZSBkb3duIGJ5IDUwJSBpbiB4IGFuZCB5XG4gICAgICogcGFnZS5zY2FsZUNvbnRlbnQoMC41LCAwLjUpO1xuICAgICAqXG4gICAgICogLy8gU2NhbGUgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2UgZG93biBieSA1MCUgaW4geCBhbmQgeVxuICAgICAqIHBhZ2Uuc2NhbGVBbm5vdGF0aW9ucygwLjUsIDAuNSk7XG4gICAgICogYGBgXG4gICAgICogU2VlIGFsc286IFtbc2NhbGVDb250ZW50XV1cbiAgICAgKiBAcGFyYW0geCBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoZSB4LWF4aXMgZm9yIHRoZSBhbm5vdGF0aW9ucyBzaG91bGQgYmVcbiAgICAgKiAgICAgICAgICBzY2FsZWQgKGUuZy4gYDAuNWAgaXMgNTAlKS5cbiAgICAgKiBAcGFyYW0geSBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoZSB5LWF4aXMgZm9yIHRoZSBhbm5vdGF0aW9ucyBzaG91bGQgYmVcbiAgICAgKiAgICAgICAgICBzY2FsZWQgKGUuZy4gYDIuMGAgaXMgMjAwJSkuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2NhbGVBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBhbm5vdHMgPSB0aGlzLm5vZGUuQW5ub3RzKCk7XG4gICAgICAgIGlmICghYW5ub3RzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBhbm5vdHMuc2l6ZSgpOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGFubm90ID0gYW5ub3RzLmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgaWYgKGFubm90IGluc3RhbmNlb2YgUERGRGljdClcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlQW5ub3QoYW5ub3QsIHgsIHkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNldCB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGlzIHBhZ2UgdG8gYCgwLCAwKWAuIFRoaXMgb3BlcmF0aW9uIGlzXG4gICAgICogb2Z0ZW4gdXNlZnVsIGFmdGVyIGNhbGxpbmcgW1t0cmFuc2xhdGVDb250ZW50XV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gU2hpZnQgdGhlIHBhZ2UncyBjb250ZW50cyB1cCBhbmQgdG8gdGhlIHJpZ2h0IGJ5IDUwIHVuaXRzXG4gICAgICogcGFnZS50cmFuc2xhdGVDb250ZW50KDUwLCA1MClcbiAgICAgKlxuICAgICAqIC8vIFRoaXMgdGV4dCB3aWxsIHNoaWZ0ZWQgLSBpdCB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSBhbSBzaGlmdGVkJylcbiAgICAgKlxuICAgICAqIC8vIE1vdmUgYmFjayB0byAoMCwgMClcbiAgICAgKiBwYWdlLnJlc2V0UG9zaXRpb24oKVxuICAgICAqXG4gICAgICogLy8gVGhpcyB0ZXh0IHdpbGwgbm90IGJlIHNoaWZ0ZWQgLSBpdCB3aWxsIGJlIGRyYXduIGF0ICgwLCAwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgYW0gbm90IHNoaWZ0ZWQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnJlc2V0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZ2V0Q29udGVudFN0cmVhbShmYWxzZSk7XG4gICAgICAgIHRoaXMueCA9IDA7XG4gICAgICAgIHRoaXMueSA9IDA7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgYSBkZWZhdWx0IGZvbnQgZm9yIHRoaXMgcGFnZS4gVGhlIGRlZmF1bHQgZm9udCB3aWxsIGJlIHVzZWQgd2hlbmV2ZXJcbiAgICAgKiB0ZXh0IGlzIGRyYXduIG9uIHRoaXMgcGFnZSBhbmQgbm8gZm9udCBpcyBzcGVjaWZpZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgU3RhbmRhcmRGb250cyB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCB0aW1lc1JvbWFuRm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5UaW1lc1JvbWFuKVxuICAgICAqIGNvbnN0IGhlbHZldGljYUZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IGNvdXJpZXJGb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkNvdXJpZXIpXG4gICAgICpcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRGb250KGhlbHZldGljYUZvbnQpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGluIEhlbHZldGljYScpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEZvbnQodGltZXNSb21hbkZvbnQpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGluIENvdXJpZXInLCB7IGZvbnQ6IGNvdXJpZXJGb250IH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGRlZmF1bHQgZm9udCB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0ZXh0IG9uIHRoaXMgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRGb250ID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgLy8gVE9ETzogUmV1c2UgaW1hZ2UgRm9udCBuYW1lIGlmIHdlJ3ZlIGFscmVhZHkgYWRkZWQgdGhpcyBpbWFnZSB0byBSZXNvdXJjZXMuRm9udHNcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgdGhpcy5mb250ID0gZm9udDtcbiAgICAgICAgdGhpcy5mb250S2V5ID0gdGhpcy5ub2RlLm5ld0ZvbnREaWN0aW9uYXJ5KHRoaXMuZm9udC5uYW1lLCB0aGlzLmZvbnQucmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSBhIGRlZmF1bHQgZm9udCBzaXplIGZvciB0aGlzIHBhZ2UuIFRoZSBkZWZhdWx0IGZvbnQgc2l6ZSB3aWxsIGJlXG4gICAgICogdXNlZCB3aGVuZXZlciB0ZXh0IGlzIGRyYXduIG9uIHRoaXMgcGFnZSBhbmQgbm8gZm9udCBzaXplIGlzIHNwZWNpZmllZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2Uuc2V0Rm9udFNpemUoMTIpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGluIHNpemUgMTInKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRGb250U2l6ZSgzNilcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gc2l6ZSAyNCcsIHsgZm9udFNpemU6IDI0IH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnRTaXplIFRoZSBkZWZhdWx0IGZvbnQgc2l6ZSB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0ZXh0IG9uIHRoaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICBhc3NlcnRJcyhmb250U2l6ZSwgJ2ZvbnRTaXplJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSBhIGRlZmF1bHQgZm9udCBjb2xvciBmb3IgdGhpcyBwYWdlLiBUaGUgZGVmYXVsdCBmb250IGNvbG9yIHdpbGwgYmVcbiAgICAgKiB1c2VkIHdoZW5ldmVyIHRleHQgaXMgZHJhd24gb24gdGhpcyBwYWdlIGFuZCBubyBmb250IGNvbG9yIGlzIHNwZWNpZmllZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IHJnYiwgY215aywgZ3JheXNjYWxlIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Rm9udENvbG9yKHJnYigwLjk3LCAwLjAyLCAwLjk3KSlcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gcGluaycpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEZvbnRDb2xvcihjbXlrKDAuNCwgMC43LCAwLjM5LCAwLjE1KSlcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gZ3JheScsIHsgY29sb3I6IGdyYXlzY2FsZSgwLjUpIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnRDb2xvciBUaGUgZGVmYXVsdCBmb250IGNvbG9yIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRleHQgb25cbiAgICAgKiAgICAgICAgICAgICAgICAgIHRoaXMgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRGb250Q29sb3IgPSBmdW5jdGlvbiAoZm9udENvbG9yKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnRDb2xvciwgJ2ZvbnRDb2xvcicsIFtbT2JqZWN0LCAnQ29sb3InXV0pO1xuICAgICAgICB0aGlzLmZvbnRDb2xvciA9IGZvbnRDb2xvcjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSBhIGRlZmF1bHQgbGluZSBoZWlnaHQgZm9yIHRoaXMgcGFnZS4gVGhlIGRlZmF1bHQgbGluZSBoZWlnaHQgd2lsbCBiZVxuICAgICAqIHVzZWQgd2hlbmV2ZXIgdGV4dCBpcyBkcmF3biBvbiB0aGlzIHBhZ2UgYW5kIG5vIGxpbmUgaGVpZ2h0IGlzIHNwZWNpZmllZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2Uuc2V0TGluZUhlaWdodCgxMik7XG4gICAgICogcGFnZS5kcmF3VGV4dCgnVGhlc2UgbGluZXMgd2lsbCBiZSB2ZXJ0aWNhbGx5IFxcbiBzZXBhcmF0ZWQgYnkgMTIgdW5pdHMnKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRMaW5lSGVpZ2h0KDM2KTtcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdUaGVzZSBsaW5lcyB3aWxsIGJlIHZlcnRpY2FsbHkgXFxuIHNlcGFyYXRlZCBieSAyNCB1bml0cycsIHtcbiAgICAgKiAgIGxpbmVIZWlnaHQ6IDI0XG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbGluZUhlaWdodCBUaGUgZGVmYXVsdCBsaW5lIGhlaWdodCB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0ZXh0IG9uXG4gICAgICogICAgICAgICAgICAgICAgICAgdGhpcyBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldExpbmVIZWlnaHQgPSBmdW5jdGlvbiAobGluZUhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyhsaW5lSGVpZ2h0LCAnbGluZUhlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLmxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHgsIHkgfSA9IHBhZ2UuZ2V0UG9zaXRpb24oKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4geyB4OiB0aGlzLngsIHk6IHRoaXMueSB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHggY29vcmRpbmF0ZSBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeCA9IHBhZ2UuZ2V0WCgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIGRlZmF1bHQgeCBjb29yZGluYXRlIG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLng7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgeSBjb29yZGluYXRlIG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB5ID0gcGFnZS5nZXRZKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCB5IGNvb3JkaW5hdGUgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgZGVmYXVsdCBwb3NpdGlvbiBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5tb3ZlVG8oMCwgMClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgdGhlIG9yaWdpbicpXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVUbygwLCAyNSlcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gMjUgdW5pdHMgdXAnKVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlVG8oMjUsIDI1KVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biAyNSB1bml0cyB1cCBhbmQgMjUgdW5pdHMgdG8gdGhlIHJpZ2h0JylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0geCBUaGUgbmV3IGRlZmF1bHQgcG9zaXRpb24gb24gdGhlIHgtYXhpcyBmb3IgdGhpcyBwYWdlLlxuICAgICAqIEBwYXJhbSB5IFRoZSBuZXcgZGVmYXVsdCBwb3NpdGlvbiBvbiB0aGUgeS1heGlzIGZvciB0aGlzIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUubW92ZVRvID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgZGVmYXVsdCBwb3NpdGlvbiBvZiB0aGlzIHBhZ2UgdG8gYmUgZnVydGhlciBkb3duIHRoZSB5LWF4aXMuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLm1vdmVUbyg1MCwgNTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNTApJylcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZURvd24oMTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNDApJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0geURlY3JlYXNlIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHBhZ2UncyBkZWZhdWx0IHBvc2l0aW9uIGFsb25nIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgeS1heGlzIHNob3VsZCBiZSBkZWNyZWFzZWQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUubW92ZURvd24gPSBmdW5jdGlvbiAoeURlY3JlYXNlKSB7XG4gICAgICAgIGFzc2VydElzKHlEZWNyZWFzZSwgJ3lEZWNyZWFzZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnkgLT0geURlY3JlYXNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoaXMgcGFnZSB0byBiZSBmdXJ0aGVyIHVwIHRoZSB5LWF4aXMuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLm1vdmVUbyg1MCwgNTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNTApJylcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZVVwKDEwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNTAsIDYwKScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHlJbmNyZWFzZSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBwYWdlJ3MgZGVmYXVsdCBwb3NpdGlvbiBhbG9uZyB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgIHktYXhpcyBzaG91bGQgYmUgaW5jcmVhc2VkLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLm1vdmVVcCA9IGZ1bmN0aW9uICh5SW5jcmVhc2UpIHtcbiAgICAgICAgYXNzZXJ0SXMoeUluY3JlYXNlLCAneUluY3JlYXNlJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMueSArPSB5SW5jcmVhc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhpcyBwYWdlIHRvIGJlIGZ1cnRoZXIgbGVmdCBvbiB0aGUgeC1heGlzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5tb3ZlVG8oNTAsIDUwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNTAsIDUwKScpXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVMZWZ0KDEwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNDAsIDUwKScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHhEZWNyZWFzZSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBwYWdlJ3MgZGVmYXVsdCBwb3NpdGlvbiBhbG9uZyB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgIHgtYXhpcyBzaG91bGQgYmUgZGVjcmVhc2VkLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLm1vdmVMZWZ0ID0gZnVuY3Rpb24gKHhEZWNyZWFzZSkge1xuICAgICAgICBhc3NlcnRJcyh4RGVjcmVhc2UsICd4RGVjcmVhc2UnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy54IC09IHhEZWNyZWFzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgZGVmYXVsdCBwb3NpdGlvbiBvZiB0aGlzIHBhZ2UgdG8gYmUgZnVydGhlciByaWdodCBvbiB0aGUgeS1heGlzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5tb3ZlVG8oNTAsIDUwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNTAsIDUwKScpXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVSaWdodCgxMClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDYwLCA1MCknKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB4SW5jcmVhc2UgVGhlIGFtb3VudCBieSB3aGljaCB0aGUgcGFnZSdzIGRlZmF1bHQgcG9zaXRpb24gYWxvbmcgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICB4LWF4aXMgc2hvdWxkIGJlIGluY3JlYXNlZC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5tb3ZlUmlnaHQgPSBmdW5jdGlvbiAoeEluY3JlYXNlKSB7XG4gICAgICAgIGFzc2VydElzKHhJbmNyZWFzZSwgJ3hJbmNyZWFzZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnggKz0geEluY3JlYXNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHVzaCBvbmUgb3IgbW9yZSBvcGVyYXRvcnMgdG8gdGhlIGVuZCBvZiB0aGlzIHBhZ2UncyBjdXJyZW50IGNvbnRlbnRcbiAgICAgKiBzdHJlYW0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHtcbiAgICAgKiAgIHB1c2hHcmFwaGljc1N0YXRlLFxuICAgICAqICAgbW92ZVRvLFxuICAgICAqICAgbGluZVRvLFxuICAgICAqICAgY2xvc2VQYXRoLFxuICAgICAqICAgc2V0RmlsbGluZ0NvbG9yLFxuICAgICAqICAgcmdiLFxuICAgICAqICAgZmlsbCxcbiAgICAgKiAgIHBvcEdyYXBoaWNzU3RhdGUsXG4gICAgICogfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogLy8gRHJhdyBhIGdyZWVuIHRyaWFuZ2xlIGluIHRoZSBsb3dlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGFnZVxuICAgICAqIHBhZ2UucHVzaE9wZXJhdG9ycyhcbiAgICAgKiAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICogICBtb3ZlVG8oMCwgMCksXG4gICAgICogICBsaW5lVG8oMTAwLCAwKSxcbiAgICAgKiAgIGxpbmVUbyg1MCwgMTAwKSxcbiAgICAgKiAgIGNsb3NlUGF0aCgpLFxuICAgICAqICAgc2V0RmlsbGluZ0NvbG9yKHJnYigwLjAsIDEuMCwgMC4wKSksXG4gICAgICogICBmaWxsKCksXG4gICAgICogICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcGVyYXRvciBUaGUgb3BlcmF0b3JzIHRvIGJlIHB1c2hlZC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5wdXNoT3BlcmF0b3JzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb3BlcmF0b3IgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG9wZXJhdG9yW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0RWFjaElzKG9wZXJhdG9yLCAnb3BlcmF0b3InLCBbW1BERk9wZXJhdG9yLCAnUERGT3BlcmF0b3InXV0pO1xuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgb3BlcmF0b3IpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBvbmUgb3IgbW9yZSBsaW5lcyBvZiB0ZXh0IG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBTdGFuZGFyZEZvbnRzLCByZ2IgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgaGVsdmV0aWNhRm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgdGltZXNSb21hbkZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuVGltZXNSb21hbilcbiAgICAgKlxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEZvbnQoaGVsdmV0aWNhRm9udClcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZVRvKDUsIDIwMClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdUaGUgTGlmZSBvZiBhbiBFZ2cnLCB7IHNpemU6IDM2IH0pXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVEb3duKDM2KVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0FuIEVwaWMgVGFsZSBvZiBXb2UnLCB7IHNpemU6IDMwIH0pXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdUZXh0KFxuICAgICAqICAgYEh1bXB0eSBEdW1wdHkgc2F0IG9uIGEgd2FsbCBcXG5gICtcbiAgICAgKiAgIGBIdW1wdHkgRHVtcHR5IGhhZCBhIGdyZWF0IGZhbGw7IFxcbmAgK1xuICAgICAqICAgYEFsbCB0aGUga2luZydzIGhvcnNlcyBhbmQgYWxsIHRoZSBraW5nJ3MgbWVuIFxcbmAgK1xuICAgICAqICAgYENvdWxkbid0IHB1dCBIdW1wdHkgdG9nZXRoZXIgYWdhaW4uIFxcbmAsXG4gICAgICogICB7XG4gICAgICogICAgIHg6IDI1LFxuICAgICAqICAgICB5OiAxMDAsXG4gICAgICogICAgIGZvbnQ6IHRpbWVzUm9tYW5Gb250LFxuICAgICAqICAgICBzaXplOiAyNCxcbiAgICAgKiAgICAgY29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgICAgbGluZUhlaWdodDogMjQsXG4gICAgICogICAgIG9wYWNpdHk6IDAuNzUsXG4gICAgICogICB9LFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBiZSBkcmF3bi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgdGV4dC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgYXNzZXJ0SXModGV4dCwgJ3RleHQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jb2xvciwgJ29wdGlvbnMuY29sb3InLCBbW09iamVjdCwgJ0NvbG9yJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5mb250LCAnb3B0aW9ucy5mb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuc2l6ZSwgJ29wdGlvbnMuc2l6ZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnJvdGF0ZSwgJ29wdGlvbnMucm90YXRlJywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueFNrZXcsICdvcHRpb25zLnhTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueVNrZXcsICdvcHRpb25zLnlTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5saW5lSGVpZ2h0LCAnb3B0aW9ucy5saW5lSGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMubWF4V2lkdGgsICdvcHRpb25zLm1heFdpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMud29yZEJyZWFrcywgJ29wdGlvbnMud29yZEJyZWFrcycsIFtBcnJheV0pO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciBfaCA9IHRoaXMuc2V0T3JFbWJlZEZvbnQob3B0aW9ucy5mb250KSwgb2xkRm9udCA9IF9oLm9sZEZvbnQsIG5ld0ZvbnQgPSBfaC5uZXdGb250LCBuZXdGb250S2V5ID0gX2gubmV3Rm9udEtleTtcbiAgICAgICAgdmFyIGZvbnRTaXplID0gb3B0aW9ucy5zaXplIHx8IHRoaXMuZm9udFNpemU7XG4gICAgICAgIHZhciB3b3JkQnJlYWtzID0gb3B0aW9ucy53b3JkQnJlYWtzIHx8IHRoaXMuZG9jLmRlZmF1bHRXb3JkQnJlYWtzO1xuICAgICAgICB2YXIgdGV4dFdpZHRoID0gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIG5ld0ZvbnQud2lkdGhPZlRleHRBdFNpemUodCwgZm9udFNpemUpOyB9O1xuICAgICAgICB2YXIgbGluZXMgPSBvcHRpb25zLm1heFdpZHRoID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gbGluZVNwbGl0KGNsZWFuVGV4dCh0ZXh0KSlcbiAgICAgICAgICAgIDogYnJlYWtUZXh0SW50b0xpbmVzKHRleHQsIHdvcmRCcmVha3MsIG9wdGlvbnMubWF4V2lkdGgsIHRleHRXaWR0aCk7XG4gICAgICAgIHZhciBlbmNvZGVkTGluZXMgPSBuZXcgQXJyYXkobGluZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBlbmNvZGVkTGluZXNbaWR4XSA9IG5ld0ZvbnQuZW5jb2RlVGV4dChsaW5lc1tpZHhdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZUtleSA9IHRoaXMubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogb3B0aW9ucy5vcGFjaXR5LFxuICAgICAgICAgICAgYmxlbmRNb2RlOiBvcHRpb25zLmJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIGNvbnRlbnRTdHJlYW0ucHVzaC5hcHBseShjb250ZW50U3RyZWFtLCBkcmF3TGluZXNPZlRleHQoZW5jb2RlZExpbmVzLCB7XG4gICAgICAgICAgICBjb2xvcjogKF9hID0gb3B0aW9ucy5jb2xvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5mb250Q29sb3IsXG4gICAgICAgICAgICBmb250OiBuZXdGb250S2V5LFxuICAgICAgICAgICAgc2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICByb3RhdGU6IChfYiA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeFNrZXc6IChfYyA9IG9wdGlvbnMueFNrZXcpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB5U2tldzogKF9kID0gb3B0aW9ucy55U2tldykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHg6IChfZSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogdGhpcy54LFxuICAgICAgICAgICAgeTogKF9mID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiB0aGlzLnksXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiAoX2cgPSBvcHRpb25zLmxpbmVIZWlnaHQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHRoaXMubGluZUhlaWdodCxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZm9udCkge1xuICAgICAgICAgICAgaWYgKG9sZEZvbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb250KG9sZEZvbnQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb250KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYW4gaW1hZ2Ugb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QganBnVXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnXG4gICAgICogY29uc3QganBnSW1hZ2VCeXRlcyA9IGF3YWl0IGZldGNoKGpwZ1VybCkudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKlxuICAgICAqIGNvbnN0IGpwZ0ltYWdlID0gYXdhaXQgcGRmRG9jLmVtYmVkSnBnKGpwZ0ltYWdlQnl0ZXMpXG4gICAgICogY29uc3QganBnRGltcyA9IGpwZ0ltYWdlLnNjYWxlKDAuNSlcbiAgICAgKlxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdJbWFnZShqcGdJbWFnZSwge1xuICAgICAqICAgeDogMjUsXG4gICAgICogICB5OiAyNSxcbiAgICAgKiAgIHdpZHRoOiBqcGdEaW1zLndpZHRoLFxuICAgICAqICAgaGVpZ2h0OiBqcGdEaW1zLmhlaWdodCxcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcygzMCksXG4gICAgICogICBvcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB0byBiZSBkcmF3bi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd0ltYWdlID0gZnVuY3Rpb24gKGltYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgLy8gVE9ETzogUmV1c2UgaW1hZ2UgWE9iamVjdCBuYW1lIGlmIHdlJ3ZlIGFscmVhZHkgYWRkZWQgdGhpcyBpbWFnZSB0byBSZXNvdXJjZXMuWE9iamVjdHNcbiAgICAgICAgYXNzZXJ0SXMoaW1hZ2UsICdpbWFnZScsIFtbUERGSW1hZ2UsICdQREZJbWFnZSddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy53aWR0aCwgJ29wdGlvbnMud2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5oZWlnaHQsICdvcHRpb25zLmhlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnJvdGF0ZSwgJ29wdGlvbnMucm90YXRlJywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueFNrZXcsICdvcHRpb25zLnhTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueVNrZXcsICdvcHRpb25zLnlTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5vcGFjaXR5LCAnb3BhY2l0eS5vcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIHhPYmplY3RLZXkgPSB0aGlzLm5vZGUubmV3WE9iamVjdCgnSW1hZ2UnLCBpbWFnZS5yZWYpO1xuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZUtleSA9IHRoaXMubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogb3B0aW9ucy5vcGFjaXR5LFxuICAgICAgICAgICAgYmxlbmRNb2RlOiBvcHRpb25zLmJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIGNvbnRlbnRTdHJlYW0ucHVzaC5hcHBseShjb250ZW50U3RyZWFtLCBkcmF3SW1hZ2UoeE9iamVjdEtleSwge1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMueSxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBpbWFnZS5zaXplKCkud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBpbWFnZS5zaXplKCkuaGVpZ2h0LFxuICAgICAgICAgICAgcm90YXRlOiAoX2UgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHhTa2V3OiAoX2YgPSBvcHRpb25zLnhTa2V3KSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeVNrZXc6IChfZyA9IG9wdGlvbnMueVNrZXcpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGFuIGVtYmVkZGVkIFBERiBwYWdlIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHNvdXJjZVBkZlVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy93aXRoX2xhcmdlX3BhZ2VfY291bnQucGRmJ1xuICAgICAqIGNvbnN0IHNvdXJjZVBkZiA9IGF3YWl0IGZldGNoKHNvdXJjZVBkZlVybCkudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKlxuICAgICAqIC8vIEVtYmVkIHBhZ2UgNzQgZnJvbSB0aGUgUERGXG4gICAgICogY29uc3QgW2VtYmVkZGVkUGFnZV0gPSBhd2FpdCBwZGZEb2MuZW1iZWRQZGYoc291cmNlUGRmLCA3MylcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd1BhZ2UoZW1iZWRkZWRQYWdlLCB7XG4gICAgICogICB4OiAyNTAsXG4gICAgICogICB5OiAyMDAsXG4gICAgICogICB4U2NhbGU6IDAuNSxcbiAgICAgKiAgIHlTY2FsZTogMC41LFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDMwKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBgb3B0aW9uc2AgYXJndW1lbnQgYWNjZXB0cyBib3RoIGB3aWR0aGAvYGhlaWdodGAgYW5kIGB4U2NhbGVgL2B5U2NhbGVgXG4gICAgICogYXMgb3B0aW9ucy4gU2luY2UgZWFjaCBvZiB0aGVzZSBvcHRpb25zIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIGRyYXduIHBhZ2UsXG4gICAgICogaWYgYm90aCBvcHRpb25zIGFyZSBnaXZlbiwgYHdpZHRoYCBhbmQgYGhlaWdodGAgdGFrZSBwcmVjZWRlbmNlIGFuZCB0aGVcbiAgICAgKiBjb3JyZXNwb25kaW5nIHNjYWxlIHZhcmlhbnRzIGFyZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVtYmVkZGVkUGFnZSBUaGUgZW1iZWRkZWQgcGFnZSB0byBiZSBkcmF3bi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgZW1iZWRkZWQgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3UGFnZSA9IGZ1bmN0aW9uIChlbWJlZGRlZFBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgLy8gVE9ETzogUmV1c2UgZW1iZWRkZWRQYWdlIFhPYmplY3QgbmFtZSBpZiB3ZSd2ZSBhbHJlYWR5IGFkZGVkIHRoaXMgZW1iZWRkZWRQYWdlIHRvIFJlc291cmNlcy5YT2JqZWN0c1xuICAgICAgICBhc3NlcnRJcyhlbWJlZGRlZFBhZ2UsICdlbWJlZGRlZFBhZ2UnLCBbXG4gICAgICAgICAgICBbUERGRW1iZWRkZWRQYWdlLCAnUERGRW1iZWRkZWRQYWdlJ10sXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLngsICdvcHRpb25zLngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55LCAnb3B0aW9ucy55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueFNjYWxlLCAnb3B0aW9ucy54U2NhbGUnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55U2NhbGUsICdvcHRpb25zLnlTY2FsZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLndpZHRoLCAnb3B0aW9ucy53aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmhlaWdodCwgJ29wdGlvbnMuaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2tldywgJ29wdGlvbnMueFNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55U2tldywgJ29wdGlvbnMueVNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYmxlbmRNb2RlLCAnb3B0aW9ucy5ibGVuZE1vZGUnLCBCbGVuZE1vZGUpO1xuICAgICAgICB2YXIgeE9iamVjdEtleSA9IHRoaXMubm9kZS5uZXdYT2JqZWN0KCdFbWJlZGRlZFBkZlBhZ2UnLCBlbWJlZGRlZFBhZ2UucmVmKTtcbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGVLZXkgPSB0aGlzLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgIGJsZW5kTW9kZTogb3B0aW9ucy5ibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdmFyIHhTY2FsZSA9IChvcHRpb25zLndpZHRoICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLndpZHRoIC8gZW1iZWRkZWRQYWdlLndpZHRoXG4gICAgICAgICAgICA6IG9wdGlvbnMueFNjYWxlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnhTY2FsZVxuICAgICAgICAgICAgICAgIDogMSk7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB2YXIgeVNjYWxlID0gKG9wdGlvbnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmhlaWdodCAvIGVtYmVkZGVkUGFnZS5oZWlnaHRcbiAgICAgICAgICAgIDogb3B0aW9ucy55U2NhbGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMueVNjYWxlXG4gICAgICAgICAgICAgICAgOiAxKTtcbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdQYWdlKHhPYmplY3RLZXksIHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy54LFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0aGlzLnksXG4gICAgICAgICAgICB4U2NhbGU6IHhTY2FsZSxcbiAgICAgICAgICAgIHlTY2FsZTogeVNjYWxlLFxuICAgICAgICAgICAgcm90YXRlOiAoX2MgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHhTa2V3OiAoX2QgPSBvcHRpb25zLnhTa2V3KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeVNrZXc6IChfZSA9IG9wdGlvbnMueVNrZXcpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGFuIFNWRyBwYXRoIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyByZ2IgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3Qgc3ZnUGF0aCA9ICdNIDAsMjAgTCAxMDAsMTYwIFEgMTMwLDIwMCAxNTAsMTIwIEMgMTkwLC00MCAyMDAsMjAwIDMwMCwxNTAgTCA0MDAsOTAnXG4gICAgICpcbiAgICAgKiAvLyBEcmF3IHBhdGggYXMgYmxhY2sgbGluZVxuICAgICAqIHBhZ2UuZHJhd1N2Z1BhdGgoc3ZnUGF0aCwgeyB4OiAyNSwgeTogNzUgfSlcbiAgICAgKlxuICAgICAqIC8vIENoYW5nZSBib3JkZXIgc3R5bGUgYW5kIG9wYWNpdHlcbiAgICAgKiBwYWdlLmRyYXdTdmdQYXRoKHN2Z1BhdGgsIHtcbiAgICAgKiAgIHg6IDI1LFxuICAgICAqICAgeTogMjc1LFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLjUsIDAuNSwgMC41KSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgYm9yZGVyT3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqXG4gICAgICogLy8gU2V0IGZpbGwgY29sb3IgYW5kIG9wYWNpdHlcbiAgICAgKiBwYWdlLmRyYXdTdmdQYXRoKHN2Z1BhdGgsIHtcbiAgICAgKiAgIHg6IDI1LFxuICAgICAqICAgeTogNDc1LFxuICAgICAqICAgY29sb3I6IHJnYigxLjAsIDAsIDApLFxuICAgICAqICAgb3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqXG4gICAgICogLy8gRHJhdyA1MCUgb2Ygb3JpZ2luYWwgc2l6ZVxuICAgICAqIHBhZ2UuZHJhd1N2Z1BhdGgoc3ZnUGF0aCwge1xuICAgICAqICAgeDogMjUsXG4gICAgICogICB5OiA2NzUsXG4gICAgICogICBzY2FsZTogMC41LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHBhdGggVGhlIFNWRyBwYXRoIHRvIGJlIGRyYXduLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBTVkcgcGF0aC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3U3ZnUGF0aCA9IGZ1bmN0aW9uIChwYXRoLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBhc3NlcnRJcyhwYXRoLCAncGF0aCcsIFsnc3RyaW5nJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLngsICdvcHRpb25zLngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55LCAnb3B0aW9ucy55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuc2NhbGUsICdvcHRpb25zLnNjYWxlJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJXaWR0aCwgJ29wdGlvbnMuYm9yZGVyV2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jb2xvciwgJ29wdGlvbnMuY29sb3InLCBbW09iamVjdCwgJ0NvbG9yJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJDb2xvciwgJ29wdGlvbnMuYm9yZGVyQ29sb3InLCBbXG4gICAgICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5LCAnb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXknLCBbXG4gICAgICAgICAgICBBcnJheSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlLCAnb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UnLCBbXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckxpbmVDYXAsICdvcHRpb25zLmJvcmRlckxpbmVDYXAnLCBMaW5lQ2FwU3R5bGUpO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyT3BhY2l0eSwgJ29wdGlvbnMuYm9yZGVyT3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBib3JkZXJPcGFjaXR5OiBvcHRpb25zLmJvcmRlck9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCEoJ2NvbG9yJyBpbiBvcHRpb25zKSAmJiAhKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdTdmdQYXRoKHBhdGgsIHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy54LFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0aGlzLnksXG4gICAgICAgICAgICBzY2FsZTogb3B0aW9ucy5zY2FsZSxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9jID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBjb2xvcjogKF9kID0gb3B0aW9ucy5jb2xvcikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IChfZSA9IG9wdGlvbnMuYm9yZGVyQ29sb3IpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2YgPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiAwLFxuICAgICAgICAgICAgYm9yZGVyRGFzaEFycmF5OiAoX2cgPSBvcHRpb25zLmJvcmRlckRhc2hBcnJheSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyRGFzaFBoYXNlOiAoX2ggPSBvcHRpb25zLmJvcmRlckRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyTGluZUNhcDogKF9qID0gb3B0aW9ucy5ib3JkZXJMaW5lQ2FwKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGEgbGluZSBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd0xpbmUoe1xuICAgICAqICAgc3RhcnQ6IHsgeDogMjUsIHk6IDc1IH0sXG4gICAgICogICBlbmQ6IHsgeDogMTI1LCB5OiAxNzUgfSxcbiAgICAgKiAgIHRoaWNrbmVzczogMixcbiAgICAgKiAgIGNvbG9yOiByZ2IoMC43NSwgMC4yLCAwLjIpLFxuICAgICAqICAgb3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBsaW5lLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdMaW5lID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucy5zdGFydCwgJ29wdGlvbnMuc3RhcnQnLCBbXG4gICAgICAgICAgICBbT2JqZWN0LCAneyB4OiBudW1iZXIsIHk6IG51bWJlciB9J10sXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLmVuZCwgJ29wdGlvbnMuZW5kJywgW1xuICAgICAgICAgICAgW09iamVjdCwgJ3sgeDogbnVtYmVyLCB5OiBudW1iZXIgfSddLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucy5zdGFydC54LCAnb3B0aW9ucy5zdGFydC54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMuc3RhcnQueSwgJ29wdGlvbnMuc3RhcnQueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLmVuZC54LCAnb3B0aW9ucy5lbmQueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLmVuZC55LCAnb3B0aW9ucy5lbmQueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnRoaWNrbmVzcywgJ29wdGlvbnMudGhpY2tuZXNzJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuY29sb3IsICdvcHRpb25zLmNvbG9yJywgW1tPYmplY3QsICdDb2xvciddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuZGFzaEFycmF5LCAnb3B0aW9ucy5kYXNoQXJyYXknLCBbQXJyYXldKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5kYXNoUGhhc2UsICdvcHRpb25zLmRhc2hQaGFzZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5saW5lQ2FwLCAnb3B0aW9ucy5saW5lQ2FwJywgTGluZUNhcFN0eWxlKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYmxlbmRNb2RlLCAnb3B0aW9ucy5ibGVuZE1vZGUnLCBCbGVuZE1vZGUpO1xuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZUtleSA9IHRoaXMubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUoe1xuICAgICAgICAgICAgYm9yZGVyT3BhY2l0eTogb3B0aW9ucy5vcGFjaXR5LFxuICAgICAgICAgICAgYmxlbmRNb2RlOiBvcHRpb25zLmJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghKCdjb2xvcicgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdMaW5lKHtcbiAgICAgICAgICAgIHN0YXJ0OiBvcHRpb25zLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBvcHRpb25zLmVuZCxcbiAgICAgICAgICAgIHRoaWNrbmVzczogKF9hID0gb3B0aW9ucy50aGlja25lc3MpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDEsXG4gICAgICAgICAgICBjb2xvcjogKF9iID0gb3B0aW9ucy5jb2xvcikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGFzaEFycmF5OiAoX2MgPSBvcHRpb25zLmRhc2hBcnJheSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGFzaFBoYXNlOiAoX2QgPSBvcHRpb25zLmRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbGluZUNhcDogKF9lID0gb3B0aW9ucy5saW5lQ2FwKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGEgcmVjdGFuZ2xlIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBkZWdyZWVzLCBncmF5c2NhbGUsIHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdSZWN0YW5nbGUoe1xuICAgICAqICAgeDogMjUsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHdpZHRoOiAyNTAsXG4gICAgICogICBoZWlnaHQ6IDc1LFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKC0xNSksXG4gICAgICogICBib3JkZXJXaWR0aDogNSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiBncmF5c2NhbGUoMC41KSxcbiAgICAgKiAgIGNvbG9yOiByZ2IoMC43NSwgMC4yLCAwLjIpLFxuICAgICAqICAgb3BhY2l0eTogMC41LFxuICAgICAqICAgYm9yZGVyT3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSByZWN0YW5nbGUuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd1JlY3RhbmdsZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tLCBfbztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueSwgJ29wdGlvbnMueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLndpZHRoLCAnb3B0aW9ucy53aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmhlaWdodCwgJ29wdGlvbnMuaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2tldywgJ29wdGlvbnMueFNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55U2tldywgJ29wdGlvbnMueVNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJXaWR0aCwgJ29wdGlvbnMuYm9yZGVyV2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jb2xvciwgJ29wdGlvbnMuY29sb3InLCBbW09iamVjdCwgJ0NvbG9yJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJDb2xvciwgJ29wdGlvbnMuYm9yZGVyQ29sb3InLCBbXG4gICAgICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5LCAnb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXknLCBbXG4gICAgICAgICAgICBBcnJheSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlLCAnb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UnLCBbXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckxpbmVDYXAsICdvcHRpb25zLmJvcmRlckxpbmVDYXAnLCBMaW5lQ2FwU3R5bGUpO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyT3BhY2l0eSwgJ29wdGlvbnMuYm9yZGVyT3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBib3JkZXJPcGFjaXR5OiBvcHRpb25zLmJvcmRlck9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCEoJ2NvbG9yJyBpbiBvcHRpb25zKSAmJiAhKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdSZWN0YW5nbGUoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMueSxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAxNTAsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAxMDAsXG4gICAgICAgICAgICByb3RhdGU6IChfZSA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeFNrZXc6IChfZiA9IG9wdGlvbnMueFNrZXcpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB5U2tldzogKF9nID0gb3B0aW9ucy55U2tldykgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2ggPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwLFxuICAgICAgICAgICAgY29sb3I6IChfaiA9IG9wdGlvbnMuY29sb3IpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiAoX2sgPSBvcHRpb25zLmJvcmRlckNvbG9yKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJEYXNoQXJyYXk6IChfbCA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJEYXNoUGhhc2U6IChfbSA9IG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICAgICAgYm9yZGVyTGluZUNhcDogKF9vID0gb3B0aW9ucy5ib3JkZXJMaW5lQ2FwKSAhPT0gbnVsbCAmJiBfbyAhPT0gdm9pZCAwID8gX28gOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYSBzcXVhcmUgb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGRlZ3JlZXMsIGdyYXlzY2FsZSwgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd1NxdWFyZSh7XG4gICAgICogICB4OiAyNSxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgc2l6ZTogMTAwLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKC0xNSksXG4gICAgICogICBib3JkZXJXaWR0aDogNSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiBncmF5c2NhbGUoMC41KSxcbiAgICAgKiAgIGNvbG9yOiByZ2IoMC43NSwgMC4yLCAwLjIpLFxuICAgICAqICAgb3BhY2l0eTogMC41LFxuICAgICAqICAgYm9yZGVyT3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBzcXVhcmUuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd1NxdWFyZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBzaXplID0gb3B0aW9ucy5zaXplO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChzaXplLCAnc2l6ZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLmRyYXdSZWN0YW5nbGUoX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHdpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemUgfSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBhbiBlbGxpcHNlIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBncmF5c2NhbGUsIHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdFbGxpcHNlKHtcbiAgICAgKiAgIHg6IDIwMCxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgeFNjYWxlOiAxMDAsXG4gICAgICogICB5U2NhbGU6IDUwLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDUsXG4gICAgICogICBib3JkZXJDb2xvcjogZ3JheXNjYWxlKDAuNSksXG4gICAgICogICBjb2xvcjogcmdiKDAuNzUsIDAuMiwgMC4yKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNSxcbiAgICAgKiAgIGJvcmRlck9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgZWxsaXBzZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3RWxsaXBzZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2w7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2NhbGUsICdvcHRpb25zLnhTY2FsZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnlTY2FsZSwgJ29wdGlvbnMueVNjYWxlJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jb2xvciwgJ29wdGlvbnMuY29sb3InLCBbW09iamVjdCwgJ0NvbG9yJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJDb2xvciwgJ29wdGlvbnMuYm9yZGVyQ29sb3InLCBbXG4gICAgICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJPcGFjaXR5LCAnb3B0aW9ucy5ib3JkZXJPcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyV2lkdGgsICdvcHRpb25zLmJvcmRlcldpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5LCAnb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXknLCBbXG4gICAgICAgICAgICBBcnJheSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlLCAnb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UnLCBbXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckxpbmVDYXAsICdvcHRpb25zLmJvcmRlckxpbmVDYXAnLCBMaW5lQ2FwU3R5bGUpO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBib3JkZXJPcGFjaXR5OiBvcHRpb25zLmJvcmRlck9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCEoJ2NvbG9yJyBpbiBvcHRpb25zKSAmJiAhKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdFbGxpcHNlKHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy54LFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0aGlzLnksXG4gICAgICAgICAgICB4U2NhbGU6IChfYyA9IG9wdGlvbnMueFNjYWxlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAxMDAsXG4gICAgICAgICAgICB5U2NhbGU6IChfZCA9IG9wdGlvbnMueVNjYWxlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAxMDAsXG4gICAgICAgICAgICByb3RhdGU6IChfZSA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb2xvcjogKF9mID0gb3B0aW9ucy5jb2xvcikgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IChfZyA9IG9wdGlvbnMuYm9yZGVyQ29sb3IpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2ggPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAwLFxuICAgICAgICAgICAgYm9yZGVyRGFzaEFycmF5OiAoX2ogPSBvcHRpb25zLmJvcmRlckRhc2hBcnJheSkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyRGFzaFBoYXNlOiAoX2sgPSBvcHRpb25zLmJvcmRlckRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyTGluZUNhcDogKF9sID0gb3B0aW9ucy5ib3JkZXJMaW5lQ2FwKSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGEgY2lyY2xlIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBncmF5c2NhbGUsIHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdDaXJjbGUoe1xuICAgICAqICAgeDogMjAwLFxuICAgICAqICAgeTogMTUwLFxuICAgICAqICAgc2l6ZTogMTAwLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDUsXG4gICAgICogICBib3JkZXJDb2xvcjogZ3JheXNjYWxlKDAuNSksXG4gICAgICogICBjb2xvcjogcmdiKDAuNzUsIDAuMiwgMC4yKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNSxcbiAgICAgKiAgIGJvcmRlck9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgZWxsaXBzZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3Q2lyY2xlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIF9hID0gb3B0aW9ucy5zaXplLCBzaXplID0gX2EgPT09IHZvaWQgMCA/IDEwMCA6IF9hO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChzaXplLCAnc2l6ZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLmRyYXdFbGxpcHNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyB4U2NhbGU6IHNpemUsIHlTY2FsZTogc2l6ZSB9KSk7XG4gICAgfTtcbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRPckVtYmVkRm9udCA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIHZhciBvbGRGb250ID0gdGhpcy5mb250O1xuICAgICAgICB2YXIgb2xkRm9udEtleSA9IHRoaXMuZm9udEtleTtcbiAgICAgICAgaWYgKGZvbnQpXG4gICAgICAgICAgICB0aGlzLnNldEZvbnQoZm9udCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9udCgpO1xuICAgICAgICB2YXIgbmV3Rm9udCA9IHRoaXMuZm9udDtcbiAgICAgICAgdmFyIG5ld0ZvbnRLZXkgPSB0aGlzLmZvbnRLZXk7XG4gICAgICAgIHJldHVybiB7IG9sZEZvbnQ6IG9sZEZvbnQsIG9sZEZvbnRLZXk6IG9sZEZvbnRLZXksIG5ld0ZvbnQ6IG5ld0ZvbnQsIG5ld0ZvbnRLZXk6IG5ld0ZvbnRLZXkgfTtcbiAgICB9O1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldEZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5mb250IHx8ICF0aGlzLmZvbnRLZXkpIHtcbiAgICAgICAgICAgIHZhciBmb250ID0gdGhpcy5kb2MuZW1iZWRTdGFuZGFyZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpO1xuICAgICAgICAgICAgdGhpcy5zZXRGb250KGZvbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5mb250LCB0aGlzLmZvbnRLZXldO1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUucmVzZXRGb250ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmZvbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZm9udEtleSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldENvbnRlbnRTdHJlYW0gPSBmdW5jdGlvbiAodXNlRXhpc3RpbmcpIHtcbiAgICAgICAgaWYgKHVzZUV4aXN0aW5nID09PSB2b2lkIDApIHsgdXNlRXhpc3RpbmcgPSB0cnVlOyB9XG4gICAgICAgIGlmICh1c2VFeGlzdGluZyAmJiB0aGlzLmNvbnRlbnRTdHJlYW0pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50U3RyZWFtO1xuICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0gPSB0aGlzLmNyZWF0ZUNvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgdGhpcy5jb250ZW50U3RyZWFtUmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih0aGlzLmNvbnRlbnRTdHJlYW0pO1xuICAgICAgICB0aGlzLm5vZGUuYWRkQ29udGVudFN0cmVhbSh0aGlzLmNvbnRlbnRTdHJlYW1SZWYpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50U3RyZWFtO1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUuY3JlYXRlQ29udGVudFN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgb3BlcmF0b3JzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLmRvYy5jb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gUERGQ29udGVudFN0cmVhbS5vZihkaWN0LCBvcGVyYXRvcnMpO1xuICAgICAgICByZXR1cm4gY29udGVudFN0cmVhbTtcbiAgICB9O1xuICAgIFBERlBhZ2UucHJvdG90eXBlLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG9wYWNpdHkgPSBvcHRpb25zLm9wYWNpdHksIGJvcmRlck9wYWNpdHkgPSBvcHRpb25zLmJvcmRlck9wYWNpdHksIGJsZW5kTW9kZSA9IG9wdGlvbnMuYmxlbmRNb2RlO1xuICAgICAgICBpZiAob3BhY2l0eSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBib3JkZXJPcGFjaXR5ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGJsZW5kTW9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlID0gdGhpcy5kb2MuY29udGV4dC5vYmooe1xuICAgICAgICAgICAgVHlwZTogJ0V4dEdTdGF0ZScsXG4gICAgICAgICAgICBjYTogb3BhY2l0eSxcbiAgICAgICAgICAgIENBOiBib3JkZXJPcGFjaXR5LFxuICAgICAgICAgICAgQk06IGJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLm5vZGUubmV3RXh0R1N0YXRlKCdHUycsIGdyYXBoaWNzU3RhdGUpO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2NhbGVBbm5vdCA9IGZ1bmN0aW9uIChhbm5vdCwgeCwgeSkge1xuICAgICAgICB2YXIgc2VsZWN0b3JzID0gWydSRCcsICdDTCcsICdWZXJ0aWNlcycsICdRdWFkUG9pbnRzJywgJ0wnLCAnUmVjdCddO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBzZWxlY3RvcnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgbGlzdCA9IGFubm90Lmxvb2t1cChQREZOYW1lLm9mKHNlbGVjdG9yc1tpZHhdKSk7XG4gICAgICAgICAgICBpZiAobGlzdCBpbnN0YW5jZW9mIFBERkFycmF5KVxuICAgICAgICAgICAgICAgIGxpc3Quc2NhbGVQREZOdW1iZXJzKHgsIHkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmtMaXN0cyA9IGFubm90Lmxvb2t1cChQREZOYW1lLm9mKCdJbmtMaXN0JykpO1xuICAgICAgICBpZiAoaW5rTGlzdHMgaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gaW5rTGlzdHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IGlua0xpc3RzLmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgICAgIGlmIChhcnIgaW5zdGFuY2VvZiBQREZBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgYXJyLnNjYWxlUERGTnVtYmVycyh4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkRvY3VtZW50LmFkZFBhZ2VdXSBhbmQgW1tQREZEb2N1bWVudC5pbnNlcnRQYWdlXV1cbiAgICAgKiA+IG1ldGhvZHMsIHdoaWNoIGNhbiBjcmVhdGUgaW5zdGFuY2VzIG9mIFtbUERGUGFnZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZQYWdlXV0gZnJvbSBhbiBleGlzdGluZyBsZWFmIG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVhZk5vZGUgVGhlIGxlYWYgbm9kZSB0byBiZSB3cmFwcGVkLlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoZSBwYWdlLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBwYWdlIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERlBhZ2Uub2YgPSBmdW5jdGlvbiAobGVhZk5vZGUsIHJlZiwgZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZShsZWFmTm9kZSwgcmVmLCBkb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkRvY3VtZW50LmFkZFBhZ2VdXSBhbmQgW1tQREZEb2N1bWVudC5pbnNlcnRQYWdlXV1cbiAgICAgKiA+IG1ldGhvZHMsIHdoaWNoIGNhbiBjcmVhdGUgaW5zdGFuY2VzIG9mIFtbUERGUGFnZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZQYWdlXV0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgcGFnZSB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZQYWdlLmNyZWF0ZSA9IGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgdmFyIGR1bW15UmVmID0gUERGUmVmLm9mKC0xKTtcbiAgICAgICAgdmFyIHBhZ2VMZWFmID0gUERGUGFnZUxlYWYud2l0aENvbnRleHRBbmRQYXJlbnQoZG9jLmNvbnRleHQsIGR1bW15UmVmKTtcbiAgICAgICAgdmFyIHBhZ2VSZWYgPSBkb2MuY29udGV4dC5yZWdpc3RlcihwYWdlTGVhZik7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZShwYWdlTGVhZiwgcGFnZVJlZiwgZG9jKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZQYWdlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlBhZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZQYWdlLmpzLm1hcCIsImV4cG9ydCB2YXIgQmxlbmRNb2RlO1xuKGZ1bmN0aW9uIChCbGVuZE1vZGUpIHtcbiAgICBCbGVuZE1vZGVbXCJOb3JtYWxcIl0gPSBcIk5vcm1hbFwiO1xuICAgIEJsZW5kTW9kZVtcIk11bHRpcGx5XCJdID0gXCJNdWx0aXBseVwiO1xuICAgIEJsZW5kTW9kZVtcIlNjcmVlblwiXSA9IFwiU2NyZWVuXCI7XG4gICAgQmxlbmRNb2RlW1wiT3ZlcmxheVwiXSA9IFwiT3ZlcmxheVwiO1xuICAgIEJsZW5kTW9kZVtcIkRhcmtlblwiXSA9IFwiRGFya2VuXCI7XG4gICAgQmxlbmRNb2RlW1wiTGlnaHRlblwiXSA9IFwiTGlnaHRlblwiO1xuICAgIEJsZW5kTW9kZVtcIkNvbG9yRG9kZ2VcIl0gPSBcIkNvbG9yRG9kZ2VcIjtcbiAgICBCbGVuZE1vZGVbXCJDb2xvckJ1cm5cIl0gPSBcIkNvbG9yQnVyblwiO1xuICAgIEJsZW5kTW9kZVtcIkhhcmRMaWdodFwiXSA9IFwiSGFyZExpZ2h0XCI7XG4gICAgQmxlbmRNb2RlW1wiU29mdExpZ2h0XCJdID0gXCJTb2Z0TGlnaHRcIjtcbiAgICBCbGVuZE1vZGVbXCJEaWZmZXJlbmNlXCJdID0gXCJEaWZmZXJlbmNlXCI7XG4gICAgQmxlbmRNb2RlW1wiRXhjbHVzaW9uXCJdID0gXCJFeGNsdXNpb25cIjtcbn0pKEJsZW5kTW9kZSB8fCAoQmxlbmRNb2RlID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlBhZ2VPcHRpb25zLmpzLm1hcCIsImV4cG9ydCB2YXIgU3RhbmRhcmRGb250cztcbihmdW5jdGlvbiAoU3RhbmRhcmRGb250cykge1xuICAgIFN0YW5kYXJkRm9udHNbXCJDb3VyaWVyXCJdID0gXCJDb3VyaWVyXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIkNvdXJpZXJCb2xkXCJdID0gXCJDb3VyaWVyLUJvbGRcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiQ291cmllck9ibGlxdWVcIl0gPSBcIkNvdXJpZXItT2JsaXF1ZVwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJDb3VyaWVyQm9sZE9ibGlxdWVcIl0gPSBcIkNvdXJpZXItQm9sZE9ibGlxdWVcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiSGVsdmV0aWNhXCJdID0gXCJIZWx2ZXRpY2FcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiSGVsdmV0aWNhQm9sZFwiXSA9IFwiSGVsdmV0aWNhLUJvbGRcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiSGVsdmV0aWNhT2JsaXF1ZVwiXSA9IFwiSGVsdmV0aWNhLU9ibGlxdWVcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiSGVsdmV0aWNhQm9sZE9ibGlxdWVcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJUaW1lc1JvbWFuXCJdID0gXCJUaW1lcy1Sb21hblwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJUaW1lc1JvbWFuQm9sZFwiXSA9IFwiVGltZXMtQm9sZFwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJUaW1lc1JvbWFuSXRhbGljXCJdID0gXCJUaW1lcy1JdGFsaWNcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiVGltZXNSb21hbkJvbGRJdGFsaWNcIl0gPSBcIlRpbWVzLUJvbGRJdGFsaWNcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiU3ltYm9sXCJdID0gXCJTeW1ib2xcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiWmFwZkRpbmdiYXRzXCJdID0gXCJaYXBmRGluZ2JhdHNcIjtcbn0pKFN0YW5kYXJkRm9udHMgfHwgKFN0YW5kYXJkRm9udHMgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RhbmRhcmRGb250cy5qcy5tYXAiLCJpbXBvcnQgeyBzZXRGaWxsaW5nQ215a0NvbG9yLCBzZXRGaWxsaW5nR3JheXNjYWxlQ29sb3IsIHNldEZpbGxpbmdSZ2JDb2xvciwgc2V0U3Ryb2tpbmdDbXlrQ29sb3IsIHNldFN0cm9raW5nR3JheXNjYWxlQ29sb3IsIHNldFN0cm9raW5nUmdiQ29sb3IsIH0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBhc3NlcnRSYW5nZSwgZXJyb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmV4cG9ydCB2YXIgQ29sb3JUeXBlcztcbihmdW5jdGlvbiAoQ29sb3JUeXBlcykge1xuICAgIENvbG9yVHlwZXNbXCJHcmF5c2NhbGVcIl0gPSBcIkdyYXlzY2FsZVwiO1xuICAgIENvbG9yVHlwZXNbXCJSR0JcIl0gPSBcIlJHQlwiO1xuICAgIENvbG9yVHlwZXNbXCJDTVlLXCJdID0gXCJDTVlLXCI7XG59KShDb2xvclR5cGVzIHx8IChDb2xvclR5cGVzID0ge30pKTtcbmV4cG9ydCB2YXIgZ3JheXNjYWxlID0gZnVuY3Rpb24gKGdyYXkpIHtcbiAgICBhc3NlcnRSYW5nZShncmF5LCAnZ3JheScsIDAuMCwgMS4wKTtcbiAgICByZXR1cm4geyB0eXBlOiBDb2xvclR5cGVzLkdyYXlzY2FsZSwgZ3JheTogZ3JheSB9O1xufTtcbmV4cG9ydCB2YXIgcmdiID0gZnVuY3Rpb24gKHJlZCwgZ3JlZW4sIGJsdWUpIHtcbiAgICBhc3NlcnRSYW5nZShyZWQsICdyZWQnLCAwLCAxKTtcbiAgICBhc3NlcnRSYW5nZShncmVlbiwgJ2dyZWVuJywgMCwgMSk7XG4gICAgYXNzZXJ0UmFuZ2UoYmx1ZSwgJ2JsdWUnLCAwLCAxKTtcbiAgICByZXR1cm4geyB0eXBlOiBDb2xvclR5cGVzLlJHQiwgcmVkOiByZWQsIGdyZWVuOiBncmVlbiwgYmx1ZTogYmx1ZSB9O1xufTtcbmV4cG9ydCB2YXIgY215ayA9IGZ1bmN0aW9uIChjeWFuLCBtYWdlbnRhLCB5ZWxsb3csIGtleSkge1xuICAgIGFzc2VydFJhbmdlKGN5YW4sICdjeWFuJywgMCwgMSk7XG4gICAgYXNzZXJ0UmFuZ2UobWFnZW50YSwgJ21hZ2VudGEnLCAwLCAxKTtcbiAgICBhc3NlcnRSYW5nZSh5ZWxsb3csICd5ZWxsb3cnLCAwLCAxKTtcbiAgICBhc3NlcnRSYW5nZShrZXksICdrZXknLCAwLCAxKTtcbiAgICByZXR1cm4geyB0eXBlOiBDb2xvclR5cGVzLkNNWUssIGN5YW46IGN5YW4sIG1hZ2VudGE6IG1hZ2VudGEsIHllbGxvdzogeWVsbG93LCBrZXk6IGtleSB9O1xufTtcbnZhciBHcmF5c2NhbGUgPSBDb2xvclR5cGVzLkdyYXlzY2FsZSwgUkdCID0gQ29sb3JUeXBlcy5SR0IsIENNWUsgPSBDb2xvclR5cGVzLkNNWUs7XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB2YXIgc2V0RmlsbGluZ0NvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgcmV0dXJuIGNvbG9yLnR5cGUgPT09IEdyYXlzY2FsZSA/IHNldEZpbGxpbmdHcmF5c2NhbGVDb2xvcihjb2xvci5ncmF5KVxuICAgICAgICA6IGNvbG9yLnR5cGUgPT09IFJHQiA/IHNldEZpbGxpbmdSZ2JDb2xvcihjb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlKVxuICAgICAgICAgICAgOiBjb2xvci50eXBlID09PSBDTVlLID8gc2V0RmlsbGluZ0NteWtDb2xvcihjb2xvci5jeWFuLCBjb2xvci5tYWdlbnRhLCBjb2xvci55ZWxsb3csIGNvbG9yLmtleSlcbiAgICAgICAgICAgICAgICA6IGVycm9yKFwiSW52YWxpZCBjb2xvcjogXCIgKyBKU09OLnN0cmluZ2lmeShjb2xvcikpO1xufTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciBzZXRTdHJva2luZ0NvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgcmV0dXJuIGNvbG9yLnR5cGUgPT09IEdyYXlzY2FsZSA/IHNldFN0cm9raW5nR3JheXNjYWxlQ29sb3IoY29sb3IuZ3JheSlcbiAgICAgICAgOiBjb2xvci50eXBlID09PSBSR0IgPyBzZXRTdHJva2luZ1JnYkNvbG9yKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpXG4gICAgICAgICAgICA6IGNvbG9yLnR5cGUgPT09IENNWUsgPyBzZXRTdHJva2luZ0NteWtDb2xvcihjb2xvci5jeWFuLCBjb2xvci5tYWdlbnRhLCBjb2xvci55ZWxsb3csIGNvbG9yLmtleSlcbiAgICAgICAgICAgICAgICA6IGVycm9yKFwiSW52YWxpZCBjb2xvcjogXCIgKyBKU09OLnN0cmluZ2lmeShjb2xvcikpO1xufTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciBjb21wb25lbnRzVG9Db2xvciA9IGZ1bmN0aW9uIChjb21wcywgc2NhbGUpIHtcbiAgICBpZiAoc2NhbGUgPT09IHZvaWQgMCkgeyBzY2FsZSA9IDE7IH1cbiAgICByZXR1cm4gKChjb21wcyA9PT0gbnVsbCB8fCBjb21wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcHMubGVuZ3RoKSA9PT0gMSA/IGdyYXlzY2FsZShjb21wc1swXSAqIHNjYWxlKVxuICAgICAgICA6IChjb21wcyA9PT0gbnVsbCB8fCBjb21wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcHMubGVuZ3RoKSA9PT0gMyA/IHJnYihjb21wc1swXSAqIHNjYWxlLCBjb21wc1sxXSAqIHNjYWxlLCBjb21wc1syXSAqIHNjYWxlKVxuICAgICAgICAgICAgOiAoY29tcHMgPT09IG51bGwgfHwgY29tcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBzLmxlbmd0aCkgPT09IDQgPyBjbXlrKGNvbXBzWzBdICogc2NhbGUsIGNvbXBzWzFdICogc2NhbGUsIGNvbXBzWzJdICogc2NhbGUsIGNvbXBzWzNdICogc2NhbGUpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQpO1xufTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciBjb2xvclRvQ29tcG9uZW50cyA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgIHJldHVybiBjb2xvci50eXBlID09PSBHcmF5c2NhbGUgPyBbY29sb3IuZ3JheV1cbiAgICAgICAgOiBjb2xvci50eXBlID09PSBSR0IgPyBbY29sb3IucmVkLCBjb2xvci5ncmVlbiwgY29sb3IuYmx1ZV1cbiAgICAgICAgICAgIDogY29sb3IudHlwZSA9PT0gQ01ZSyA/IFtjb2xvci5jeWFuLCBjb2xvci5tYWdlbnRhLCBjb2xvci55ZWxsb3csIGNvbG9yLmtleV1cbiAgICAgICAgICAgICAgICA6IGVycm9yKFwiSW52YWxpZCBjb2xvcjogXCIgKyBKU09OLnN0cmluZ2lmeShjb2xvcikpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbG9ycy5qcy5tYXAiLCIvLyB0c2xpbnQ6ZGlzYWJsZTogbWF4LWNsYXNzZXMtcGVyLWZpbGVcbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuLy8gVE9ETzogSW5jbHVkZSBsaW5rIHRvIGRvY3VtZW50YXRpb24gd2l0aCBleGFtcGxlXG52YXIgRW5jcnlwdGVkUERGRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVuY3J5cHRlZFBERkVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEVuY3J5cHRlZFBERkVycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gJ0lucHV0IGRvY3VtZW50IHRvIGBQREZEb2N1bWVudC5sb2FkYCBpcyBlbmNyeXB0ZWQuIFlvdSBjYW4gdXNlIGBQREZEb2N1bWVudC5sb2FkKC4uLiwgeyBpZ25vcmVFbmNyeXB0aW9uOiB0cnVlIH0pYCBpZiB5b3Ugd2lzaCB0byBsb2FkIHRoZSBkb2N1bWVudCBhbnl3YXlzLic7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBFbmNyeXB0ZWRQREZFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEVuY3J5cHRlZFBERkVycm9yIH07XG4vLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gZG9jdW1lbnRhdGlvbiB3aXRoIGV4YW1wbGVcbnZhciBGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSAnSW5wdXQgdG8gYFBERkRvY3VtZW50LmVtYmVkRm9udGAgd2FzIGEgY3VzdG9tIGZvbnQsIGJ1dCBubyBgZm9udGtpdGAgaW5zdGFuY2Ugd2FzIGZvdW5kLiBZb3UgbXVzdCByZWdpc3RlciBhIGBmb250a2l0YCBpbnN0YW5jZSB3aXRoIGBQREZEb2N1bWVudC5yZWdpc3RlckZvbnRraXQoLi4uKWAgYmVmb3JlIGVtYmVkZGluZyBjdXN0b20gZm9udHMuJztcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yIH07XG4vLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gZG9jdW1lbnRhdGlvbiB3aXRoIGV4YW1wbGVcbnZhciBGb3JlaWduUGFnZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGb3JlaWduUGFnZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZvcmVpZ25QYWdlRXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSAnQSBgcGFnZWAgcGFzc2VkIHRvIGBQREZEb2N1bWVudC5hZGRQYWdlYCBvciBgUERGRG9jdW1lbnQuaW5zZXJ0UGFnZWAgd2FzIGZyb20gYSBkaWZmZXJlbnQgKGZvcmVpZ24pIFBERiBkb2N1bWVudC4gSWYgeW91IHdhbnQgdG8gY29weSBwYWdlcyBmcm9tIG9uZSBQREZEb2N1bWVudCB0byBhbm90aGVyLCB5b3UgbXVzdCB1c2UgYFBERkRvY3VtZW50LmNvcHlQYWdlcyguLi4pYCB0byBjb3B5IHRoZSBwYWdlcyBiZWZvcmUgYWRkaW5nIG9yIGluc2VydGluZyB0aGVtLic7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBGb3JlaWduUGFnZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgRm9yZWlnblBhZ2VFcnJvciB9O1xuLy8gVE9ETzogSW5jbHVkZSBsaW5rIHRvIGRvY3VtZW50YXRpb24gd2l0aCBleGFtcGxlXG52YXIgUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gJ1BERkRvY3VtZW50IGhhcyBubyBwYWdlcyBzbyBgUERGRG9jdW1lbnQucmVtb3ZlUGFnZWAgY2Fubm90IGJlIGNhbGxlZCc7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBSZW1vdmVQYWdlRnJvbUVtcHR5RG9jdW1lbnRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yIH07XG52YXIgTm9TdWNoRmllbGRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTm9TdWNoRmllbGRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOb1N1Y2hGaWVsZEVycm9yKG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiUERGRG9jdW1lbnQgaGFzIG5vIGZvcm0gZmllbGQgd2l0aCB0aGUgbmFtZSBcXFwiXCIgKyBuYW1lICsgXCJcXFwiXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb1N1Y2hGaWVsZEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTm9TdWNoRmllbGRFcnJvciB9O1xudmFyIFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBleHBlY3RlZCwgYWN0dWFsKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBleHBlY3RlZFR5cGUgPSBleHBlY3RlZCA9PT0gbnVsbCB8fCBleHBlY3RlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhwZWN0ZWQubmFtZTtcbiAgICAgICAgdmFyIGFjdHVhbFR5cGUgPSAoX2IgPSAoX2EgPSBhY3R1YWwgPT09IG51bGwgfHwgYWN0dWFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY3R1YWwuY29uc3RydWN0b3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBhY3R1YWw7XG4gICAgICAgIHZhciBtc2cgPSBcIkV4cGVjdGVkIGZpZWxkIFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgdG8gYmUgb2YgdHlwZSBcIiArIGV4cGVjdGVkVHlwZSArIFwiLCBcIiArXG4gICAgICAgICAgICAoXCJidXQgaXQgaXMgYWN0dWFsbHkgb2YgdHlwZSBcIiArIGFjdHVhbFR5cGUpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yIH07XG52YXIgTWlzc2luZ09uVmFsdWVDaGVja0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nT25WYWx1ZUNoZWNrRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ09uVmFsdWVDaGVja0Vycm9yKG9uVmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIHNlbGVjdCBjaGVjayBib3ggZHVlIHRvIG1pc3Npbmcgb25WYWx1ZTogXFxcIlwiICsgb25WYWx1ZSArIFwiXFxcIlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ09uVmFsdWVDaGVja0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ09uVmFsdWVDaGVja0Vycm9yIH07XG52YXIgRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yKG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZTogXFxcIlwiICsgbmFtZSArIFwiXFxcIlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRmllbGRBbHJlYWR5RXhpc3RzRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBGaWVsZEFscmVhZHlFeGlzdHNFcnJvciB9O1xudmFyIEludmFsaWRGaWVsZE5hbWVQYXJ0RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEludmFsaWRGaWVsZE5hbWVQYXJ0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvcihuYW1lUGFydCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGaWVsZCBuYW1lIGNvbnRhaW5zIGludmFsaWQgY29tcG9uZW50OiBcXFwiXCIgKyBuYW1lUGFydCArIFwiXFxcIlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEludmFsaWRGaWVsZE5hbWVQYXJ0RXJyb3IgfTtcbnZhciBGaWVsZEV4aXN0c0FzTm9uVGVybWluYWxFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmllbGRFeGlzdHNBc05vblRlcm1pbmFsRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmllbGRFeGlzdHNBc05vblRlcm1pbmFsRXJyb3IobmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBIG5vbi10ZXJtaW5hbCBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZTogXFxcIlwiICsgbmFtZSArIFwiXFxcIlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRmllbGRFeGlzdHNBc05vblRlcm1pbmFsRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBGaWVsZEV4aXN0c0FzTm9uVGVybWluYWxFcnJvciB9O1xudmFyIFJpY2hUZXh0RmllbGRSZWFkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJpY2hUZXh0RmllbGRSZWFkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmljaFRleHRGaWVsZFJlYWRFcnJvcihmaWVsZE5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiUmVhZGluZyByaWNoIHRleHQgZmllbGRzIGlzIG5vdCBzdXBwb3J0ZWQ6IEF0dGVtcHRlZCB0byByZWFkIHJpY2ggdGV4dCBmaWVsZDogXCIgKyBmaWVsZE5hbWU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBSaWNoVGV4dEZpZWxkUmVhZEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUmljaFRleHRGaWVsZFJlYWRFcnJvciB9O1xudmFyIENvbWJlZFRleHRMYXlvdXRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29tYmVkVGV4dExheW91dEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENvbWJlZFRleHRMYXlvdXRFcnJvcihsaW5lTGVuZ3RoLCBjZWxsQ291bnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIGxheW91dCBjb21iZWQgdGV4dCBhcyBsaW5lTGVuZ3RoPVwiICsgbGluZUxlbmd0aCArIFwiIGlzIGdyZWF0ZXIgdGhhbiBjZWxsQ291bnQ9XCIgKyBjZWxsQ291bnQ7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBDb21iZWRUZXh0TGF5b3V0RXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBDb21iZWRUZXh0TGF5b3V0RXJyb3IgfTtcbnZhciBFeGNlZWRlZE1heExlbmd0aEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFeGNlZWRlZE1heExlbmd0aEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3IodGV4dExlbmd0aCwgbWF4TGVuZ3RoLCBuYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkF0dGVtcHRlZCB0byBzZXQgdGV4dCB3aXRoIGxlbmd0aD1cIiArIHRleHRMZW5ndGggKyBcIiBmb3IgVGV4dEZpZWxkIHdpdGggbWF4TGVuZ3RoPVwiICsgbWF4TGVuZ3RoICsgXCIgYW5kIG5hbWU9XCIgKyBuYW1lO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRXhjZWVkZWRNYXhMZW5ndGhFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3IgfTtcbnZhciBJbnZhbGlkTWF4TGVuZ3RoRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEludmFsaWRNYXhMZW5ndGhFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnZhbGlkTWF4TGVuZ3RoRXJyb3IodGV4dExlbmd0aCwgbWF4TGVuZ3RoLCBuYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkF0dGVtcHRlZCB0byBzZXQgbWF4TGVuZ3RoPVwiICsgbWF4TGVuZ3RoICsgXCIsIHdoaWNoIGlzIGxlc3MgdGhhbiBcIiArIHRleHRMZW5ndGggKyBcIiwgdGhlIGxlbmd0aCBvZiB0aGlzIGZpZWxkJ3MgY3VycmVudCB2YWx1ZSAobmFtZT1cIiArIG5hbWUgKyBcIilcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEludmFsaWRNYXhMZW5ndGhFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEludmFsaWRNYXhMZW5ndGhFcnJvciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4uL1BERlBhZ2VcIjtcbmltcG9ydCBQREZGb250IGZyb20gXCIuLi9QREZGb250XCI7XG5pbXBvcnQgeyBJbWFnZUFsaWdubWVudCB9IGZyb20gXCIuLi9pbWFnZS9hbGlnbm1lbnRcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUFwcGVhcmFuY2UsIGRlZmF1bHRCdXR0b25BcHBlYXJhbmNlUHJvdmlkZXIsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmltcG9ydCBQREZGaWVsZCwgeyBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zLCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgUERGU3RyZWFtLCBQREZBY3JvUHVzaEJ1dHRvbiwgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydE9yVW5kZWZpbmVkLCBhc3NlcnRQb3NpdGl2ZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgYnV0dG9uIGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZCdXR0b25dXSBmaWVsZHMgYXJlIGludGVyYWN0aXZlIGNvbnRyb2xzIHRoYXQgdXNlcnMgY2FuIGNsaWNrIHdpdGggdGhlaXJcbiAqIG1vdXNlLiBUaGlzIHR5cGUgb2YgW1tQREZGaWVsZF1dIGlzIG5vdCBzdGF0ZWZ1bC4gVGhlIHB1cnBvc2Ugb2YgYSBidXR0b25cbiAqIGlzIHRvIHBlcmZvcm0gYW4gYWN0aW9uIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGl0LCBzdWNoIGFzIG9wZW5pbmcgYSBwcmludFxuICogbW9kYWwgb3IgcmVzZXR0aW5nIHRoZSBmb3JtLiBCdXR0b25zIGFyZSB0eXBpY2FsbHkgcmVjdGFuZ3VsYXIgaW4gc2hhcGUgYW5kXG4gKiBoYXZlIGEgdGV4dCBsYWJlbCBkZXNjcmliaW5nIHRoZSBhY3Rpb24gdGhhdCB0aGV5IHBlcmZvcm0gd2hlbiBjbGlja2VkLlxuICovXG52YXIgUERGQnV0dG9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZCdXR0b24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQnV0dG9uKGFjcm9QdXNoQnV0dG9uLCByZWYsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBhY3JvUHVzaEJ1dHRvbiwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9QdXNoQnV0dG9uLCAnYWNyb0J1dHRvbicsIFtcbiAgICAgICAgICAgIFtQREZBY3JvUHVzaEJ1dHRvbiwgJ1BERkFjcm9QdXNoQnV0dG9uJ10sXG4gICAgICAgIF0pO1xuICAgICAgICBfdGhpcy5hY3JvRmllbGQgPSBhY3JvUHVzaEJ1dHRvbjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IGFuIGltYWdlIGluc2lkZSB0aGUgYm91bmRzIG9mIHRoaXMgYnV0dG9uJ3Mgd2lkZ2V0cy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwbmdJbWFnZSA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZyguLi4pXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5nZXRCdXR0b24oJ3NvbWUuYnV0dG9uLmZpZWxkJylcbiAgICAgKiBidXR0b24uc2V0SW1hZ2UocG5nSW1hZ2UsIEltYWdlQWxpZ25tZW50LkNlbnRlcilcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBhcHBlYXJhbmNlcyBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgYnV0dG9uJ3Mgd2lkZ2V0cy5cbiAgICAgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKiBAcGFyYW0gYWxpZ25tZW50IFRoZSBhbGlnbm1lbnQgb2YgdGhlIGltYWdlLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUuc2V0SW1hZ2UgPSBmdW5jdGlvbiAoaW1hZ2UsIGFsaWdubWVudCkge1xuICAgICAgICBpZiAoYWxpZ25tZW50ID09PSB2b2lkIDApIHsgYWxpZ25tZW50ID0gSW1hZ2VBbGlnbm1lbnQuQ2VudGVyOyB9XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdHJlYW1SZWYgPSB0aGlzLmNyZWF0ZUltYWdlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIGltYWdlLCBhbGlnbm1lbnQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlcyh3aWRnZXQsIHsgbm9ybWFsOiBzdHJlYW1SZWYgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNDbGVhbigpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmb250IHNpemUgZm9yIHRoaXMgZmllbGQuIExhcmdlciBmb250IHNpemVzIHdpbGwgcmVzdWx0IGluIGxhcmdlclxuICAgICAqIHRleHQgYmVpbmcgZGlzcGxheWVkIHdoZW4gUERGIHJlYWRlcnMgcmVuZGVyIHRoaXMgYnV0dG9uLiBGb250IHNpemVzIG1heVxuICAgICAqIGJlIGludGVnZXIgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gU3VwcGx5aW5nIGEgbmVnYXRpdmUgZm9udCBzaXplIHdpbGxcbiAgICAgKiBjYXVzZSB0aGlzIG1ldGhvZCB0byB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5nZXRCdXR0b24oJ3NvbWUuYnV0dG9uLmZpZWxkJylcbiAgICAgKiBidXR0b24uc2V0Rm9udFNpemUoNClcbiAgICAgKiBidXR0b24uc2V0Rm9udFNpemUoMTUuNylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqID4gVGhpcyBtZXRob2QgZGVwZW5kcyB1cG9uIHRoZSBleGlzdGVuY2Ugb2YgYSBkZWZhdWx0IGFwcGVhcmFuY2VcbiAgICAgKiA+IChgL0RBYCkgc3RyaW5nLiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGFwcGVhcmFuY2Ugc3RyaW5nLFxuICAgICAqID4gb3IgdGhhdCBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhIGZvbnQgc2l6ZSAodmlhIHRoZSBgVGZgIG9wZXJhdG9yKSxcbiAgICAgKiA+IHRoZW4gdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb250U2l6ZSBUaGUgZm9udCBzaXplIHRvIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGV4dCBpbiB0aGlzIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUuc2V0Rm9udFNpemUgPSBmdW5jdGlvbiAoZm9udFNpemUpIHtcbiAgICAgICAgYXNzZXJ0UG9zaXRpdmUoZm9udFNpemUsICdmb250U2l6ZScpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNob3cgdGhpcyBidXR0b24gb24gdGhlIHNwZWNpZmllZCBwYWdlIHdpdGggdGhlIGdpdmVuIHRleHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdWJ1bnR1Rm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQodWJ1bnR1Rm9udEJ5dGVzKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uY3JlYXRlQnV0dG9uKCdzb21lLmJ1dHRvbi5maWVsZCcpXG4gICAgICpcbiAgICAgKiBidXR0b24uYWRkVG9QYWdlKCdEbyBTdHVmZicsIHBhZ2UsIHtcbiAgICAgKiAgIHg6IDUwLFxuICAgICAqICAgeTogNzUsXG4gICAgICogICB3aWR0aDogMjAwLFxuICAgICAqICAgaGVpZ2h0OiAxMDAsXG4gICAgICogICB0ZXh0Q29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgIGJhY2tncm91bmRDb2xvcjogcmdiKDAsIDEsIDApLFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLCAwLCAxKSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDkwKSxcbiAgICAgKiAgIGZvbnQ6IHVidW50dUZvbnQsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHdpZGdldCBmb3IgdGhpcyBidXR0b24gZmllbGQuXG4gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgZGlzcGxheWVkIGZvciB0aGlzIGJ1dHRvbiB3aWRnZXQuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gd2hpY2ggdGhpcyBidXR0b24gd2lkZ2V0IHNob3VsZCBiZSBhZGRlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gYWRkaW5nIHRoaXMgYnV0dG9uIHdpZGdldC5cbiAgICAgKi9cbiAgICBQREZCdXR0b24ucHJvdG90eXBlLmFkZFRvUGFnZSA9IGZ1bmN0aW9uIChcbiAgICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIGJlIG9wdGlvbmFsLCBlLmcuIGZvciBpbWFnZSBidXR0b25zXG4gICAgdGV4dCwgcGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZCh0ZXh0LCAndGV4dCcsIFsnc3RyaW5nJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAvLyBDcmVhdGUgYSB3aWRnZXQgZm9yIHRoaXMgYnV0dG9uXG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmNyZWF0ZVdpZGdldCh7XG4gICAgICAgICAgICB4OiAoKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDApIC0gKChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCkgLyAyLFxuICAgICAgICAgICAgeTogKChfYyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwKSAtICgoX2QgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDApIC8gMixcbiAgICAgICAgICAgIHdpZHRoOiAoX2UgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDEwMCxcbiAgICAgICAgICAgIGhlaWdodDogKF9mID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogNTAsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IChfZyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50ZXh0Q29sb3IpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHJnYigwLCAwLCAwKSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogKF9oID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcikgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogcmdiKDAuNzUsIDAuNzUsIDAuNzUpLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2ogPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IDAsXG4gICAgICAgICAgICByb3RhdGU6IChfayA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9rICE9PSB2b2lkIDAgPyBfayA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBjYXB0aW9uOiB0ZXh0LFxuICAgICAgICAgICAgaGlkZGVuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5hZGRXaWRnZXQod2lkZ2V0UmVmKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHZhciBmb250ID0gKF9sID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZvbnQpICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IHRoaXMuZG9jLmdldEZvcm0oKS5nZXREZWZhdWx0Rm9udCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGUgZ2l2ZW4gcGFnZVxuICAgICAgICBwYWdlLm5vZGUuYWRkQW5ub3Qod2lkZ2V0UmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYnV0dG9uIGhhcyBiZWVuIG1hcmtlZCBhcyBkaXJ0eSwgb3IgaWYgYW55IG9mIHRoaXNcbiAgICAgKiBidXR0b24ncyB3aWRnZXRzIGRvIG5vdCBoYXZlIGFuIGFwcGVhcmFuY2Ugc3RyZWFtLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uZ2V0QnV0dG9uKCdzb21lLmJ1dHRvbi5maWVsZCcpXG4gICAgICogaWYgKGJ1dHRvbi5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIGNvbnNvbGUubG9nKCdOZWVkcyB1cGRhdGUnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgYnV0dG9uIG5lZWRzIGFuIGFwcGVhcmFuY2UgdXBkYXRlLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5pc0RpcnR5KCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIGhhc0FwcGVhcmFuY2VzID0gKChfYSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsKSBpbnN0YW5jZW9mIFBERlN0cmVhbTtcbiAgICAgICAgICAgIGlmICghaGFzQXBwZWFyYW5jZXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBidXR0b24ncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgYnV0dG9ucy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uZ2V0QnV0dG9uKCdzb21lLmJ1dHRvbi5maWVsZCcpXG4gICAgICogYnV0dG9uLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZCdXR0b24ucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoZm9udCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGJ1dHRvbidzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZ2l2ZW4gYXBwZWFyYW5jZSBwcm92aWRlci4gSWYgbm8gYHByb3ZpZGVyYCBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0XG4gICAgICogYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgYnV0dG9ucyB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmdldEJ1dHRvbignc29tZS5idXR0b24uZmllbGQnKVxuICAgICAqIGJ1dHRvbi51cGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EsIChmaWVsZCwgd2lkZ2V0LCBmb250KSA9PiB7XG4gICAgICogICAuLi5cbiAgICAgKiAgIHJldHVybiB7XG4gICAgICogICAgIG5vcm1hbDogZHJhd0J1dHRvbiguLi4pLFxuICAgICAqICAgICBkb3duOiBkcmF3QnV0dG9uKC4uLiksXG4gICAgICogICB9XG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqIEBwYXJhbSBwcm92aWRlciBPcHRpb25hbGx5LCB0aGUgYXBwZWFyYW5jZSBwcm92aWRlciB0byBiZSB1c2VkIGZvclxuICAgICAqICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUudXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQocHJvdmlkZXIsICdwcm92aWRlcicsIFtGdW5jdGlvbl0pO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250LCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciBhcFByb3ZpZGVyID0gcHJvdmlkZXIgIT09IG51bGwgJiYgcHJvdmlkZXIgIT09IHZvaWQgMCA/IHByb3ZpZGVyIDogZGVmYXVsdEJ1dHRvbkFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCwgZm9udCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VXaXRoRm9udCh3aWRnZXQsIGZvbnQsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldEJ1dHRvbl1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGQnV0dG9uXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkJ1dHRvbl1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb1B1c2hCdXR0b24gYW5kIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9QdXNoQnV0dG9uIFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvUHVzaEJ1dHRvbmAgZm9yIHRoaXMgYnV0dG9uLlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgYnV0dG9uLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgYnV0dG9uIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5vZiA9IGZ1bmN0aW9uIChhY3JvUHVzaEJ1dHRvbiwgcmVmLCBkb2MpIHsgcmV0dXJuIG5ldyBQREZCdXR0b24oYWNyb1B1c2hCdXR0b24sIHJlZiwgZG9jKTsgfTtcbiAgICByZXR1cm4gUERGQnV0dG9uO1xufShQREZGaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQnV0dG9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQnV0dG9uLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4uL1BERlBhZ2VcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUFwcGVhcmFuY2UsIGRlZmF1bHRDaGVja0JveEFwcGVhcmFuY2VQcm92aWRlciwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuaW1wb3J0IHsgcmdiIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCBQREZGaWVsZCwgeyBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zLCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyBQREZOYW1lLCBQREZEaWN0LCBQREZBY3JvQ2hlY2tCb3gsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRPclVuZGVmaW5lZCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2hlY2sgYm94IGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZDaGVja0JveF1dIGZpZWxkcyBhcmUgaW50ZXJhY3RpdmUgYm94ZXMgdGhhdCB1c2VycyBjYW4gY2xpY2sgd2l0aCB0aGVpclxuICogbW91c2UuIFRoaXMgdHlwZSBvZiBbW1BERkZpZWxkXV0gaGFzIHR3byBzdGF0ZXM6IGBvbmAgYW5kIGBvZmZgLiBUaGUgcHVycG9zZVxuICogb2YgYSBjaGVjayBib3ggaXMgdG8gZW5hYmxlIHVzZXJzIHRvIHNlbGVjdCBmcm9tIG9uZSBvciBtb3JlIG9wdGlvbnMsIHdoZXJlXG4gKiBlYWNoIG9wdGlvbiBpcyByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBjaGVjayBib3guIENoZWNrIGJveGVzIGFyZSB0eXBpY2FsbHlcbiAqIHNxdWFyZSBpbiBzaGFwZSBhbmQgZGlzcGxheSBhIGNoZWNrIG1hcmsgd2hlbiB0aGV5IGFyZSBpbiB0aGUgYG9uYCBzdGF0ZS5cbiAqL1xudmFyIFBERkNoZWNrQm94ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZDaGVja0JveCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZDaGVja0JveChhY3JvQ2hlY2tCb3gsIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9DaGVja0JveCwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9DaGVja0JveCwgJ2Fjcm9DaGVja0JveCcsIFtcbiAgICAgICAgICAgIFtQREZBY3JvQ2hlY2tCb3gsICdQREZBY3JvQ2hlY2tCb3gnXSxcbiAgICAgICAgXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9DaGVja0JveDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrIHRoaXMgY2hlY2sgYm94LiBUaGlzIG9wZXJhdGlvbiBpcyBhbmFsb2dvdXMgdG8gYSBodW1hbiB1c2VyIGNsaWNraW5nXG4gICAgICogYSBjaGVjayBib3ggdG8gZmlsbCBpdCBpbiBhIFBERiByZWFkZXIuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZVxuICAgICAqIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlIGNoZWNrIGJveCBmaWVsZCB0byBpbmRpY2F0ZSBpdCBoYXMgYmVlbiBzZWxlY3RlZC5cbiAgICAgKiBQREYgbGlicmFyaWVzIGFuZCByZWFkZXJzIHdpbGwgYmUgYWJsZSB0byBleHRyYWN0IHRoaXMgdmFsdWUgZnJvbSB0aGVcbiAgICAgKiBzYXZlZCBkb2N1bWVudCBhbmQgZGV0ZXJtaW5lIHRoYXQgaXQgd2FzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ3NvbWUuY2hlY2tCb3guZmllbGQnKVxuICAgICAqIGNoZWNrQm94LmNoZWNrKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIGNoZWNrIGJveCBhcyBkaXJ0eSwgY2F1c2luZyBpdHMgYXBwZWFyYW5jZVxuICAgICAqIHN0cmVhbXMgdG8gYmUgdXBkYXRlZCB3aGVuIGVpdGhlciBbW1BERkRvY3VtZW50LnNhdmVdXSBvclxuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gaXMgY2FsbGVkLiBUaGUgdXBkYXRlZCBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB3aWxsIGRpc3BsYXkgYSBjaGVjayBtYXJrIGluc2lkZSB0aGUgd2lkZ2V0cyBvZiB0aGlzIGNoZWNrIGJveFxuICAgICAqIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgb25WYWx1ZSA9IChfYSA9IHRoaXMuYWNyb0ZpZWxkLmdldE9uVmFsdWUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUERGTmFtZS5vZignWWVzJyk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWUob25WYWx1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhpcyBjaGVjayBib3guIFRoaXMgb3BlcmF0aW9uIGlzIGFuYWxvZ291cyB0byBhIGh1bWFuIHVzZXIgY2xpY2tpbmdcbiAgICAgKiBhIGNoZWNrIGJveCB0byB1bm1hcmsgaXQgaW4gYSBQREYgcmVhZGVyLiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGVcbiAgICAgKiB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZSBjaGVjayBib3ggZmllbGQgdG8gaW5kaWNhdGUgaXQgaGFzIGJlZW4gZGVzZWxlY3RlZC5cbiAgICAgKiBQREYgbGlicmFyaWVzIGFuZCByZWFkZXJzIHdpbGwgYmUgYWJsZSB0byBleHRyYWN0IHRoaXMgdmFsdWUgZnJvbSB0aGVcbiAgICAgKiBzYXZlZCBkb2N1bWVudCBhbmQgZGV0ZXJtaW5lIHRoYXQgaXQgd2FzIG5vdCBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKiBjaGVja0JveC51bmNoZWNrKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIGNoZWNrIGJveCBhcyBkaXJ0eS4gU2VlIFtbUERGQ2hlY2tCb3guY2hlY2tdXVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS51bmNoZWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlKFBERk5hbWUub2YoJ09mZicpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgY2hlY2sgYm94IGlzIHNlbGVjdGVkIChlaXRoZXIgYnkgYSBodW1hbiB1c2VyIHZpYVxuICAgICAqIGEgUERGIHJlYWRlciwgb3IgZWxzZSBwcm9ncmFtbWF0aWNhbGx5IHZpYSBzb2Z0d2FyZSkuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKiBpZiAoY2hlY2tCb3guaXNDaGVja2VkKCkpIGNvbnNvbGUubG9nKCdjaGVjayBib3ggaXMgc2VsZWN0ZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgY2hlY2sgYm94IGlzIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS5pc0NoZWNrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvblZhbHVlID0gdGhpcy5hY3JvRmllbGQuZ2V0T25WYWx1ZSgpO1xuICAgICAgICByZXR1cm4gISFvblZhbHVlICYmIG9uVmFsdWUgPT09IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93IHRoaXMgY2hlY2sgYm94IG9uIHRoZSBzcGVjaWZpZWQgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5jcmVhdGVDaGVja0JveCgnc29tZS5jaGVja0JveC5maWVsZCcpXG4gICAgICpcbiAgICAgKiBjaGVja0JveC5hZGRUb1BhZ2UocGFnZSwge1xuICAgICAqICAgeDogNTAsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHdpZHRoOiAyNSxcbiAgICAgKiAgIGhlaWdodDogMjUsXG4gICAgICogICB0ZXh0Q29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgIGJhY2tncm91bmRDb2xvcjogcmdiKDAsIDEsIDApLFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLCAwLCAxKSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDkwKSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgd2lkZ2V0IGZvciB0aGlzIGNoZWNrIGJveCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGlzIGNoZWNrIGJveCB3aWRnZXQgc2hvdWxkIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhpcyBjaGVjayBib3ggd2lkZ2V0LlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS5hZGRUb1BhZ2UgPSBmdW5jdGlvbiAocGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbW1BERlBhZ2UsICdQREZQYWdlJ11dKTtcbiAgICAgICAgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAoISgndGV4dENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMudGV4dENvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYmFja2dyb3VuZENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYmFja2dyb3VuZENvbG9yID0gcmdiKDEsIDEsIDEpO1xuICAgICAgICBpZiAoISgnYm9yZGVyQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlcldpZHRoJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyV2lkdGggPSAxO1xuICAgICAgICAvLyBDcmVhdGUgYSB3aWRnZXQgZm9yIHRoaXMgY2hlY2sgYm94XG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmNyZWF0ZVdpZGdldCh7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDAsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDAsXG4gICAgICAgICAgICB3aWR0aDogKF9jID0gb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogNTAsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiA1MCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9lID0gb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9mID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBoaWRkZW46IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5hZGRXaWRnZXQod2lkZ2V0UmVmKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHdpZGdldC5zZXRBcHBlYXJhbmNlU3RhdGUoUERGTmFtZS5vZignT2ZmJykpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBQREZOYW1lLm9mKCdZZXMnKSk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIGdpdmVuIHBhZ2VcbiAgICAgICAgcGFnZS5ub2RlLmFkZEFubm90KHdpZGdldFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgb2YgdGhpcyBjaGVjayBib3gncyB3aWRnZXRzIGRvIG5vdCBoYXZlIGFuXG4gICAgICogYXBwZWFyYW5jZSBzdHJlYW0gZm9yIGl0cyBjdXJyZW50IHN0YXRlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5nZXRDaGVja0JveCgnc29tZS5jaGVja0JveC5maWVsZCcpXG4gICAgICogaWYgKGNoZWNrQm94Lm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUoKSkgY29uc29sZS5sb2coJ05lZWRzIHVwZGF0ZScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBjaGVjayBib3ggbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VTdGF0ZSgpO1xuICAgICAgICAgICAgdmFyIG5vcm1hbCA9IChfYSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsO1xuICAgICAgICAgICAgaWYgKCEobm9ybWFsIGluc3RhbmNlb2YgUERGRGljdCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoc3RhdGUgJiYgIW5vcm1hbC5oYXMoc3RhdGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgY2hlY2sgYm94J3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIGNoZWNrIGJveGVzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5nZXRDaGVja0JveCgnc29tZS5jaGVja0JveC5maWVsZCcpXG4gICAgICogY2hlY2tCb3guZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUFwcGVhcmFuY2VzKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGNoZWNrIGJveCdzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZ2l2ZW4gYXBwZWFyYW5jZSBwcm92aWRlci4gSWYgbm8gYHByb3ZpZGVyYCBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0XG4gICAgICogYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgY2hlY2sgYm94cyB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKiBjaGVja0JveC51cGRhdGVBcHBlYXJhbmNlcygoZmllbGQsIHdpZGdldCkgPT4ge1xuICAgICAqICAgLi4uXG4gICAgICogICByZXR1cm4ge1xuICAgICAqICAgICBub3JtYWw6IHsgb246IGRyYXdDaGVja0JveCguLi4pLCBvZmY6IGRyYXdDaGVja0JveCguLi4pIH0sXG4gICAgICogICAgIGRvd246IHsgb246IGRyYXdDaGVja0JveCguLi4pLCBvZmY6IGRyYXdDaGVja0JveCguLi4pIH0sXG4gICAgICogICB9XG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgT3B0aW9uYWxseSwgdGhlIGFwcGVhcmFuY2UgcHJvdmlkZXIgdG8gYmUgdXNlZCBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUudXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwcm92aWRlciwgJ3Byb3ZpZGVyJywgW0Z1bmN0aW9uXSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBvblZhbHVlID0gKF9hID0gd2lkZ2V0LmdldE9uVmFsdWUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUERGTmFtZS5vZignWWVzJyk7XG4gICAgICAgICAgICBpZiAoIW9uVmFsdWUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBvblZhbHVlLCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNDbGVhbigpO1xuICAgIH07XG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBvblZhbHVlLCBwcm92aWRlcikge1xuICAgICAgICB2YXIgYXBQcm92aWRlciA9IHByb3ZpZGVyICE9PSBudWxsICYmIHByb3ZpZGVyICE9PSB2b2lkIDAgPyBwcm92aWRlciA6IGRlZmF1bHRDaGVja0JveEFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZU9uT2ZmV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIG9uVmFsdWUsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldENoZWNrQm94XV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZDaGVja0JveF1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZDaGVja0JveF1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb0NoZWNrQm94IGFuZCByZWZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvQ2hlY2tCb3ggVGhlIHVuZGVybHlpbmcgYFBERkFjcm9DaGVja0JveGAgZm9yIHRoaXMgY2hlY2sgYm94LlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgY2hlY2sgYm94LlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgY2hlY2sgYm94IHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94Lm9mID0gZnVuY3Rpb24gKGFjcm9DaGVja0JveCwgcmVmLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZDaGVja0JveChhY3JvQ2hlY2tCb3gsIHJlZiwgZG9jKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZDaGVja0JveDtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkNoZWNrQm94O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQ2hlY2tCb3guanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGUGFnZSBmcm9tIFwiLi4vUERGUGFnZVwiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4uL1BERkZvbnRcIjtcbmltcG9ydCBQREZGaWVsZCwgeyBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zLCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyBub3JtYWxpemVBcHBlYXJhbmNlLCBkZWZhdWx0RHJvcGRvd25BcHBlYXJhbmNlUHJvdmlkZXIsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBQREZIZXhTdHJpbmcsIFBERlN0cmVhbSwgUERGQWNyb0NvbWJvQm94LCBBY3JvQ2hvaWNlRmxhZ3MsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRPclVuZGVmaW5lZCwgYXNzZXJ0UG9zaXRpdmUgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIGRyb3Bkb3duIGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZEcm9wZG93bl1dIGZpZWxkcyBhcmUgaW50ZXJhY3RpdmUgdGV4dCBib3hlcyB0aGF0IGRpc3BsYXkgYSBzaW5nbGVcbiAqIGVsZW1lbnQgKHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsdWUpLiBUaGUgcHVycG9zZSBvZiBhIGRyb3Bkb3duIGlzIHRvXG4gKiBlbmFibGUgdXNlcnMgdG8gc2VsZWN0IGEgc2luZ2xlIG9wdGlvbiBmcm9tIGEgc2V0IG9mIHBvc3NpYmxlIG9wdGlvbnMuIFVzZXJzXG4gKiBjYW4gY2xpY2sgb24gYSBkcm9wZG93biB0byB2aWV3IHRoZSBmdWxsIGxpc3Qgb2Ygb3B0aW9ucyBpdCBwcm92aWRlcy5cbiAqIENsaWNraW5nIG9uIGFuIG9wdGlvbiBpbiB0aGUgbGlzdCB3aWxsIGNhdXNlIGl0IHRvIGJlIHNlbGVjdGVkIGFuZCBkaXNwbGF5ZWRcbiAqIGluIHRoZSBkcm9wZG93bidzIHRleHQgYm94LiBTb21lIGRyb3Bkb3ducyBhbGxvdyB1c2VycyB0byBlbnRlciB0ZXh0XG4gKiBkaXJlY3RseSBpbnRvIHRoZSBib3ggZnJvbSB0aGVpciBrZXlib2FyZCwgcmF0aGVyIHRoYW4gb25seSBiZWluZyBhbGxvd2VkIHRvXG4gKiBjaG9vc2UgYW4gb3B0aW9uIGZyb20gdGhlIGxpc3QgKHNlZSBbW1BERkRyb3Bkb3duLmlzRWRpdGFibGVdXSkuXG4gKi9cbnZhciBQREZEcm9wZG93biA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGRHJvcGRvd24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGRHJvcGRvd24oYWNyb0NvbWJvQm94LCByZWYsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBhY3JvQ29tYm9Cb3gsIHJlZiwgZG9jKSB8fCB0aGlzO1xuICAgICAgICBhc3NlcnRJcyhhY3JvQ29tYm9Cb3gsICdhY3JvQ29tYm9Cb3gnLCBbXG4gICAgICAgICAgICBbUERGQWNyb0NvbWJvQm94LCAnUERGQWNyb0NvbWJvQm94J10sXG4gICAgICAgIF0pO1xuICAgICAgICBfdGhpcy5hY3JvRmllbGQgPSBhY3JvQ29tYm9Cb3g7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb25zIGZvciB0aGlzIGRyb3Bkb3duLiBUaGVzZSBvcHRpb25zIHdpbGwgYmVcbiAgICAgKiBkaXNwbGF5ZWQgdG8gdXNlcnMgd2hvIGNsaWNrIG9uIHRoaXMgZHJvcGRvd24gaW4gYSBQREYgcmVhZGVyLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBjb25zdCBvcHRpb25zID0gZHJvcGRvd24uZ2V0T3B0aW9ucygpXG4gICAgICogY29uc29sZS5sb2coJ0Ryb3Bkb3duIG9wdGlvbnM6Jywgb3B0aW9ucylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW9ucyBmb3IgdGhpcyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJhd09wdGlvbnMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPcHRpb25zKCk7XG4gICAgICAgIHZhciBvcHRpb25zID0gbmV3IEFycmF5KHJhd09wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHJhd09wdGlvbnNbaWR4XSwgZGlzcGxheSA9IF9hLmRpc3BsYXksIHZhbHVlID0gX2EudmFsdWU7XG4gICAgICAgICAgICBvcHRpb25zW2lkeF0gPSAoZGlzcGxheSAhPT0gbnVsbCAmJiBkaXNwbGF5ICE9PSB2b2lkIDAgPyBkaXNwbGF5IDogdmFsdWUpLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2VsZWN0ZWQgb3B0aW9ucyBmb3IgdGhpcyBkcm9wZG93bi4gVGhlc2UgYXJlIHRoZSB2YWx1ZXMgdGhhdCB3ZXJlXG4gICAgICogc2VsZWN0ZWQgYnkgYSBodW1hbiB1c2VyIHZpYSBhIFBERiByZWFkZXIsIG9yIHByb2dyYW1hdGljYWxseSB2aWFcbiAgICAgKiBzb2Z0d2FyZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogY29uc3Qgc2VsZWN0aW9ucyA9IGRyb3Bkb3duLmdldFNlbGVjdGVkKClcbiAgICAgKiBjb25zb2xlLmxvZygnRHJvcGRvd24gc2VsZWN0aW9uczonLCBzZWxlY3Rpb25zKVxuICAgICAqIGBgYFxuICAgICAqID4gKipOT1RFOioqIE5vdGUgdGhhdCBQREYgcmVhZGVycyBvbmx5IGRpc3BsYXkgb25lIHNlbGVjdGVkIG9wdGlvbiB3aGVuXG4gICAgICogPiByZW5kZXJpbmcgZHJvcGRvd25zLiBIb3dldmVyLCB0aGUgUERGIHNwZWNpZmljYXRpb24gZG9lcyBhbGxvdyBmb3JcbiAgICAgKiA+IG11bHRpcGxlIHZhbHVlcyB0byBiZSBzZWxlY3RlZCBpbiBhIGRyb3Bkb3duLiBBcyBzdWNoLCB0aGUgYHBkZi1saWJgXG4gICAgICogPiBBUEkgc3VwcG9ydHMgdGhpcy4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyB0aGUgYXJyYXkgcmV0dXJuZWQgYnkgdGhpc1xuICAgICAqID4gbWV0aG9kIHdpbGwgY29udGFpbiBvbmx5IGEgc2luZ2xlIGVsZW1lbnQgKG9yIG5vIGVsZW1lbnRzKS5cbiAgICAgKiBAcmV0dXJucyBUaGUgc2VsZWN0ZWQgb3B0aW9ucyBpbiB0aGlzIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5nZXRTZWxlY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlcygpO1xuICAgICAgICB2YXIgc2VsZWN0ZWQgPSBuZXcgQXJyYXkodmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHNlbGVjdGVkW2lkeF0gPSB2YWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsaXN0IG9mIG9wdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGRyb3Bkb3duLiBUaGVzZSBhcmVcbiAgICAgKiB0aGUgdmFsdWVzIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHVzZXJzIHRvIHNlbGVjdCB3aGVuIHRoZXkgdmlldyB0aGlzXG4gICAgICogZHJvcGRvd24gaW4gYSBQREYgcmVhZGVyLiBOb3RlIHRoYXQgcHJlZXhpc3Rpbmcgb3B0aW9ucyBmb3IgdGhpcyBkcm9wZG93blxuICAgICAqIHdpbGwgYmUgcmVtb3ZlZC4gT25seSB0aGUgdmFsdWVzIHBhc3NlZCBhcyBgb3B0aW9uc2Agd2lsbCBiZSBhdmFpbGFibGUgdG9cbiAgICAgKiBzZWxlY3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3BsYW5ldHMuZHJvcGRvd24nKVxuICAgICAqIGRyb3Bkb3duLnNldE9wdGlvbnMoWydFYXJ0aCcsICdNYXJzJywgJ1BsdXRvJywgJ1ZlbnVzJ10pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoaXMgZHJvcGRvd24uXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLCAnb3B0aW9ucycsIFtBcnJheV0pO1xuICAgICAgICB2YXIgb3B0aW9uT2JqZWN0cyA9IG5ldyBBcnJheShvcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBvcHRpb25PYmplY3RzW2lkeF0gPSB7IHZhbHVlOiBQREZIZXhTdHJpbmcuZnJvbVRleHQob3B0aW9uc1tpZHhdKSB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldE9wdGlvbnMob3B0aW9uT2JqZWN0cyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgdG8gdGhlIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgZHJvcGRvd24uIFVzZXJzXG4gICAgICogd2lsbCBiZSBhYmxlIHRvIHNlbGVjdCB0aGVzZSB2YWx1ZXMgaW4gYSBQREYgcmVhZGVyLiBJbiBhZGRpdGlvbiB0byB0aGVcbiAgICAgKiB2YWx1ZXMgcGFzc2VkIGFzIGBvcHRpb25zYCwgYW55IHByZWV4aXN0aW5nIG9wdGlvbnMgZm9yIHRoaXMgZHJvcGRvd24gd2lsbFxuICAgICAqIHN0aWxsIGJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgdG8gc2VsZWN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdyb2NrZXRzLmRyb3Bkb3duJylcbiAgICAgKiBkcm9wZG93bi5hZGRPcHRpb25zKFsnU2F0dXJuIElWJywgJ0ZhbGNvbiBIZWF2eSddKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIE5ldyBvcHRpb25zIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGlzIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5hZGRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucywgJ29wdGlvbnMnLCBbJ3N0cmluZycsIEFycmF5XSk7XG4gICAgICAgIHZhciBvcHRpb25zQXJyID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBbb3B0aW9uc107XG4gICAgICAgIHZhciBleGlzdGluZ09wdGlvbnMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPcHRpb25zKCk7XG4gICAgICAgIHZhciBuZXdPcHRpb25zID0gbmV3IEFycmF5KG9wdGlvbnNBcnIubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9uc0Fyci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG5ld09wdGlvbnNbaWR4XSA9IHsgdmFsdWU6IFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb25zQXJyW2lkeF0pIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0T3B0aW9ucyhleGlzdGluZ09wdGlvbnMuY29uY2F0KG5ld09wdGlvbnMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlbGVjdCBvbmUgb3IgbW9yZSB2YWx1ZXMgZm9yIHRoaXMgZHJvcGRvd24uIFRoaXMgb3BlcmF0aW9uIGlzIGFuYWxvZ291c1xuICAgICAqIHRvIGEgaHVtYW4gdXNlciBvcGVuaW5nIHRoZSBkcm9wZG93biBpbiBhIFBERiByZWFkZXIgYW5kIGNsaWNraW5nIG9uIGFcbiAgICAgKiB2YWx1ZSB0byBzZWxlY3QgaXQuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZVxuICAgICAqIGRyb3Bkb3duIHRvIGluZGljYXRlIHdoaWNoIHZhbHVlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuIFBERiBsaWJyYXJpZXMgYW5kXG4gICAgICogcmVhZGVycyB3aWxsIGJlIGFibGUgdG8gZXh0cmFjdCB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgc2F2ZWQgZG9jdW1lbnQgYW5kXG4gICAgICogZGV0ZXJtaW5lIHdoaWNoIHZhbHVlcyB3ZXJlIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ2Jlc3Quc3VwZXJoZXJvLmRyb3Bkb3duJylcbiAgICAgKiBkcm9wZG93bi5zZWxlY3QoJ09uZSBQdW5jaCBNYW4nKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgZHJvcGRvd24gYXMgZGlydHksIGNhdXNpbmcgaXRzIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHRvIGJlIHVwZGF0ZWQgd2hlbiBlaXRoZXIgW1tQREZEb2N1bWVudC5zYXZlXV0gb3JcbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIGlzIGNhbGxlZC4gVGhlIHVwZGF0ZWQgc3RyZWFtcyB3aWxsXG4gICAgICogZGlzcGxheSB0aGUgc2VsZWN0ZWQgb3B0aW9uIGluc2lkZSB0aGUgd2lkZ2V0cyBvZiB0aGlzIGRyb3Bkb3duLlxuICAgICAqXG4gICAgICogKipJTVBPUlRBTlQ6KiogVGhlIGRlZmF1bHQgZm9udCB1c2VkIHRvIHVwZGF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgaXNcbiAgICAgKiBbW1N0YW5kYXJkRm9udHMuSGVsdmV0aWNhXV0uIE5vdGUgdGhhdCB0aGlzIGlzIGEgV2luQW5zaSBmb250LiBUaGlzIG1lYW5zXG4gICAgICogdGhhdCBlbmNvZGluZyBlcnJvcnMgd2lsbCBiZSB0aHJvd24gaWYgdGhlIHNlbGVjdGVkIG9wdGlvbiBmb3IgdGhpcyBmaWVsZFxuICAgICAqIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgV2luQW5zaSBjaGFyYWN0ZXIgc2V0ICh0aGUgbGF0aW4gYWxwaGFiZXQpLlxuICAgICAqXG4gICAgICogRW1iZWRkaW5nIGEgY3VzdG9tIGZvbnQgYW5kIHBhc3NpbmcgaXQgdG9cbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIG9yIFtbUERGRHJvcGRvd24udXBkYXRlQXBwZWFyYW5jZXNdXVxuICAgICAqIGFsbG93cyB5b3UgdG8gZ2VuZXJhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIHdpdGggY2hhcmFjdGVycyBvdXRzaWRlIHRoZVxuICAgICAqIGxhdGluIGFscGhhYmV0IChhc3N1bWluZyB0aGUgY3VzdG9tIGZvbnQgc3VwcG9ydHMgdGhlbSkuXG4gICAgICpcbiAgICAgKiBTZWxlY3RpbmcgYW4gb3B0aW9uIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBkcm9wZG93bidzIG9wdGlvbiBsaXN0XG4gICAgICogKHNlZSBbW1BERkRyb3Bkb3duLmdldE9wdGlvbnNdXSkgd2lsbCBlbmFibGUgZWRpdGluZyBvbiB0aGlzIGRyb3Bkb3duXG4gICAgICogKHNlZSBbW1BERkRyb3Bkb3duLmVuYWJsZUVkaXRpbmddXSkuXG4gICAgICpcbiAgICAgKiA+ICoqTk9URToqKiBQREYgcmVhZGVycyBvbmx5IGRpc3BsYXkgb25lIHNlbGVjdGVkIG9wdGlvbiB3aGVuIHJlbmRlcmluZ1xuICAgICAqID4gZHJvcGRvd25zLiBIb3dldmVyLCB0aGUgUERGIHNwZWNpZmljYXRpb24gZG9lcyBhbGxvdyBmb3IgbXVsdGlwbGUgdmFsdWVzXG4gICAgICogPiB0byBiZSBzZWxlY3RlZCBpbiBhIGRyb3Bkb3duLiBBcyBzdWNoLCB0aGUgYHBkZi1saWJgIEFQSSBzdXBwb3J0cyB0aGlzLlxuICAgICAqID4gSG93ZXZlciwgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHNlbGVjdCBtb3JlIHRoYW4gb25lIHZhbHVlIHdpdGggdGhpc1xuICAgICAqID4gbWV0aG9kLCBhcyBvbmx5IG9uZSB3aWxsIGJlIHZpc2libGUuIFtbUERGT3B0aW9uTGlzdF1dIGZpZWxkcyBhcmUgYmV0dGVyXG4gICAgICogPiBzdWl0ZWQgZm9yIGRpc3BsYXlpbmcgbXVsdGlwbGUgc2VsZWN0ZWQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICogQHBhcmFtIG1lcmdlIFdoZXRoZXIgb3Igbm90IGV4aXN0aW5nIHNlbGVjdGlvbnMgc2hvdWxkIGJlIHByZXNlcnZlZC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24gKG9wdGlvbnMsIG1lcmdlKSB7XG4gICAgICAgIGlmIChtZXJnZSA9PT0gdm9pZCAwKSB7IG1lcmdlID0gZmFsc2U7IH1cbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucywgJ29wdGlvbnMnLCBbJ3N0cmluZycsIEFycmF5XSk7XG4gICAgICAgIGFzc2VydElzKG1lcmdlLCAnbWVyZ2UnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgIHZhciBvcHRpb25zQXJyID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBbb3B0aW9uc107XG4gICAgICAgIHZhciB2YWxpZE9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIGhhc0N1c3RvbU9wdGlvbiA9IG9wdGlvbnNBcnIuZmluZChmdW5jdGlvbiAob3B0aW9uKSB7IHJldHVybiAhdmFsaWRPcHRpb25zLmluY2x1ZGVzKG9wdGlvbik7IH0pO1xuICAgICAgICBpZiAoaGFzQ3VzdG9tT3B0aW9uKVxuICAgICAgICAgICAgdGhpcy5lbmFibGVFZGl0aW5nKCk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgaWYgKG9wdGlvbnNBcnIubGVuZ3RoID4gMSB8fCAob3B0aW9uc0Fyci5sZW5ndGggPT09IDEgJiYgbWVyZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZU11bHRpc2VsZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlcyA9IG5ldyBBcnJheShvcHRpb25zQXJyLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnNBcnIubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YWx1ZXNbaWR4XSA9IFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb25zQXJyW2lkeF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXJnZSkge1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0VmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZXMoZXhpc3RpbmdWYWx1ZXMuY29uY2F0KHZhbHVlcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWVzKHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBzZWxlY3RlZCB2YWx1ZXMgZm9yIHRoaXMgZHJvcGRvd24uIFRoaXMgb3BlcmF0aW9uIGlzIGVxdWl2YWxlbnRcbiAgICAgKiB0byBzZWxlY3RpbmcgYW4gZW1wdHkgbGlzdC4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgc3RhdGVcbiAgICAgKiBvZiB0aGUgZHJvcGRvd24gdG8gaW5kaWNhdGUgdGhhdCBubyB2YWx1ZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5jbGVhcigpXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgdGV4dCBmaWVsZCBhcyBkaXJ0eS4gU2VlIFtbUERGRHJvcGRvd24uc2VsZWN0XV1cbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWVzKFtdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZm9udCBzaXplIGZvciB0aGlzIGZpZWxkLiBMYXJnZXIgZm9udCBzaXplcyB3aWxsIHJlc3VsdCBpbiBsYXJnZXJcbiAgICAgKiB0ZXh0IGJlaW5nIGRpc3BsYXllZCB3aGVuIFBERiByZWFkZXJzIHJlbmRlciB0aGlzIGRyb3Bkb3duLiBGb250IHNpemVzIG1heVxuICAgICAqIGJlIGludGVnZXIgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gU3VwcGx5aW5nIGEgbmVnYXRpdmUgZm9udCBzaXplIHdpbGxcbiAgICAgKiBjYXVzZSB0aGlzIG1ldGhvZCB0byB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5zZXRGb250U2l6ZSg0KVxuICAgICAqIGRyb3Bkb3duLnNldEZvbnRTaXplKDE1LjcpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA+IFRoaXMgbWV0aG9kIGRlcGVuZHMgdXBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBhcHBlYXJhbmNlXG4gICAgICogPiAoYC9EQWApIHN0cmluZy4gSWYgdGhpcyBmaWVsZCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBhcHBlYXJhbmNlIHN0cmluZyxcbiAgICAgKiA+IG9yIHRoYXQgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYSBmb250IHNpemUgKHZpYSB0aGUgYFRmYCBvcGVyYXRvciksXG4gICAgICogPiB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9udFNpemUgVGhlIGZvbnQgc2l6ZSB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRleHQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuc2V0Rm9udFNpemUgPSBmdW5jdGlvbiAoZm9udFNpemUpIHtcbiAgICAgICAgYXNzZXJ0UG9zaXRpdmUoZm9udFNpemUsICdmb250U2l6ZScpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHVzZXJzIGFyZSBhbGxvd2VkIHRvIGVkaXQgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoaXNcbiAgICAgKiBkcm9wZG93biBkaXJlY3RseSBhbmQgYXJlIG5vdCBjb25zdHJhaW5lZCBieSB0aGUgbGlzdCBvZiBhdmFpbGFibGVcbiAgICAgKiBvcHRpb25zLiBTZWUgW1tQREZEcm9wZG93bi5lbmFibGVFZGl0aW5nXV0gYW5kXG4gICAgICogW1tQREZEcm9wZG93bi5kaXNhYmxlRWRpdGluZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogaWYgKGRyb3Bkb3duLmlzRWRpdGFibGUoKSkgY29uc29sZS5sb2coJ0VkaXRpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBkcm9wZG93biBpcyBlZGl0YWJsZS5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuaXNFZGl0YWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLkVkaXQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgdXNlcnMgdG8gZWRpdCB0aGUgc2VsZWN0ZWQgdmFsdWUgb2YgdGhpcyBkcm9wZG93biBpbiBQREYgcmVhZGVyc1xuICAgICAqIHdpdGggdGhlaXIga2V5Ym9hcmQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2VsZWN0ZWQgdmFsdWUgb2YgdGhpcyBkcm9wZG93blxuICAgICAqIHdpbGwgbm90IGJlIGNvbnN0cmFpbmVkIGJ5IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb25zLiBIb3dldmVyLCBpZiB0aGlzXG4gICAgICogZHJvcGRvd24gaGFzIGFueSBhdmFpbGFibGUgb3B0aW9ucywgdXNlcnMgd2lsbCBzdGlsbCBiZSBhbGxvd2VkIHRvIHNlbGVjdFxuICAgICAqIGZyb20gdGhhdCBsaXN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5lbmFibGVFZGl0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZW5hYmxlRWRpdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5FZGl0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbGxvdyB1c2VycyB0byBlZGl0IHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGlzIGRyb3Bkb3duIGluIFBERlxuICAgICAqIHJlYWRlcnMgd2l0aCB0aGVpciBrZXlib2FyZC4gVGhpcyB3aWxsIGNvbnN0cmFpbiB0aGUgc2VsZWN0ZWQgdmFsdWUgb2ZcbiAgICAgKiB0aGlzIGRyb3Bkb3duIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb25zLiBVc2VycyB3aWxsIG9ubHkgYmUgYWJsZVxuICAgICAqIHRvIHNlbGVjdCBhbiBvcHRpb24gZnJvbSB0aGF0IGxpc3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmRpc2FibGVFZGl0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZGlzYWJsZUVkaXRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuRWRpdCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9wdGlvbiBsaXN0IG9mIHRoaXMgZHJvcGRvd24gaXMgYWx3YXlzIGRpc3BsYXllZFxuICAgICAqIGluIGFscGhhYmV0aWNhbCBvcmRlciwgaXJyZXNwZWN0aXZlIG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgb3B0aW9uc1xuICAgICAqIHdlcmUgYWRkZWQgdG8gdGhlIGRyb3Bkb3duLiBTZWUgW1tQREZEcm9wZG93bi5lbmFibGVTb3J0aW5nXV0gYW5kXG4gICAgICogW1tQREZEcm9wZG93bi5kaXNhYmxlU29ydGluZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogaWYgKGRyb3Bkb3duLmlzU29ydGVkKCkpIGNvbnNvbGUubG9nKCdTb3J0aW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZHJvcGRvd24ncyBvcHRpb25zIGFyZSBzb3J0ZWQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmlzU29ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbHdheXMgZGlzcGxheSB0aGUgb3B0aW9uIGxpc3Qgb2YgdGhpcyBkcm9wZG93biBpbiBhbHBoYWJldGljYWwgb3JkZXIsXG4gICAgICogaXJyZXNwZWN0aXZlIG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgb3B0aW9ucyB3ZXJlIGFkZGVkIHRvIHRoaXMgZHJvcGRvd24uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmVuYWJsZVNvcnRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5lbmFibGVTb3J0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLlNvcnQsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsd2F5cyBkaXNwbGF5IHRoZSBvcHRpb24gbGlzdCBvZiB0aGlzIGRyb3Bkb3duIGluIGFscGhhYmV0aWNhbFxuICAgICAqIG9yZGVyLiBJbnN0ZWFkLCBkaXNwbGF5IHRoZSBvcHRpb25zIGluIHdoaWNoZXZlciBvcmRlciB0aGV5IHdlcmUgYWRkZWRcbiAgICAgKiB0byB0aGUgbGlzdC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmRpc2FibGVTb3J0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZGlzYWJsZVNvcnRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGlzIGRyb3Bkb3duJ3NcbiAgICAgKiBvcHRpb24gbGlzdC4gU2VlIFtbUERGRHJvcGRvd24uZW5hYmxlTXVsdGlzZWxlY3RdXSBhbmRcbiAgICAgKiBbW1BERkRyb3Bkb3duLmRpc2FibGVNdWx0aXNlbGVjdF1dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogaWYgKGRyb3Bkb3duLmlzTXVsdGlzZWxlY3QoKSkgY29uc29sZS5sb2coJ011bHRpc2VsZWN0IGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IG11bHRpcGxlIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5pc011bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgdXNlcnMgdG8gc2VsZWN0IG1vcmUgdGhhbiBvbmUgb3B0aW9uIGZyb20gdGhpcyBkcm9wZG93bidzIG9wdGlvblxuICAgICAqIGxpc3QuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5lbmFibGVNdWx0aXNlbGVjdCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmVuYWJsZU11bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbGxvdyB1c2VycyB0byBzZWxlY3QgbW9yZSB0aGFuIG9uZSBvcHRpb24gZnJvbSB0aGlzIGRyb3Bkb3duJ3NcbiAgICAgKiBvcHRpb24gbGlzdC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmRpc2FibGVNdWx0aXNlbGVjdCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmRpc2FibGVNdWx0aXNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5NdWx0aVNlbGVjdCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNlbGVjdGVkIG9wdGlvbiBzaG91bGQgYmUgc3BlbGwgY2hlY2tlZCBieSBQREZcbiAgICAgKiByZWFkZXJzLiBTcGVsbCBjaGVja2luZyB3aWxsIG9ubHkgYmUgcGVyZm9ybWVkIGlmIHRoaXMgZHJvcGRvd24gYWxsb3dzXG4gICAgICogZWRpdGluZyAoc2VlIFtbUERGRHJvcGRvd24uaXNFZGl0YWJsZV1dKS4gU2VlXG4gICAgICogW1tQREZEcm9wZG93bi5lbmFibGVTcGVsbENoZWNraW5nXV0gYW5kXG4gICAgICogW1tQREZEcm9wZG93bi5kaXNhYmxlU3BlbGxDaGVja2luZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogaWYgKGRyb3Bkb3duLmlzU3BlbGxDaGVja2VkKCkpIGNvbnNvbGUubG9nKCdTcGVsbCBjaGVja2luZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGRyb3Bkb3duIGNhbiBiZSBzcGVsbCBjaGVja2VkLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5pc1NwZWxsQ2hlY2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5Eb05vdFNwZWxsQ2hlY2spO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgUERGIHJlYWRlcnMgdG8gc3BlbGwgY2hlY2sgdGhlIHNlbGVjdGVkIG9wdGlvbiBvZiB0aGlzIGRyb3Bkb3duLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5lbmFibGVTcGVsbENoZWNraW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZW5hYmxlU3BlbGxDaGVja2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Eb05vdFNwZWxsQ2hlY2ssIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbGxvdyBQREYgcmVhZGVycyB0byBzcGVsbCBjaGVjayB0aGUgc2VsZWN0ZWQgb3B0aW9uIG9mIHRoaXNcbiAgICAgKiBkcm9wZG93bi4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmRpc2FibGVTcGVsbENoZWNraW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZGlzYWJsZVNwZWxsQ2hlY2tpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuRG9Ob3RTcGVsbENoZWNrLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIGlzIHN0b3JlZCwgb3IgXCJjb21taXR0ZWRcIixcbiAgICAgKiB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgb3B0aW9uLiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhhdCB0aGUgdXNlcidzXG4gICAgICogc2VsZWN0aW9uIGlzIHN0b3JlZCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGlzIGRyb3Bkb3duIGZpZWxkIChieSBjbGlja2luZ1xuICAgICAqIG91dHNpZGUgb2YgaXQgLSBvbiBhbm90aGVyIGZpZWxkLCBmb3IgZXhhbXBsZSkuIFNlZVxuICAgICAqIFtbUERGRHJvcGRvd24uZW5hYmxlU2VsZWN0T25DbGlja11dIGFuZFxuICAgICAqIFtbUERGRHJvcGRvd24uZGlzYWJsZVNlbGVjdE9uQ2xpY2tdXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGlmIChkcm9wZG93bi5pc1NlbGVjdE9uQ2xpY2soKSkgY29uc29sZS5sb2coJ1NlbGVjdCBvbiBjbGljayBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBvcHRpb25zIGFyZSBzZWxlY3RlZCBpbW1lZGlhdGVseSBhZnRlciB0aGV5IGFyZVxuICAgICAqICAgICAgICAgIGNsaWNrZWQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmlzU2VsZWN0T25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLkNvbW1pdE9uU2VsQ2hhbmdlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN0b3JlIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1c2VyIGNsaWNrcyB0aGVcbiAgICAgKiBvcHRpb24uIERvIG5vdCB3YWl0IGZvciB0aGUgdXNlciB0byBsZWF2ZSB0aGlzIGRyb3Bkb3duIGZpZWxkIChieSBjbGlja2luZ1xuICAgICAqIG91dHNpZGUgb2YgaXQgLSBvbiBhbm90aGVyIGZpZWxkLCBmb3IgZXhhbXBsZSkuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5lbmFibGVTZWxlY3RPbkNsaWNrKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZW5hYmxlU2VsZWN0T25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Db21taXRPblNlbENoYW5nZSwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXYWl0IHRvIHN0b3JlIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIHVudGlsIHRoZXkgbGVhdmUgdGhpcyBkcm9wZG93blxuICAgICAqIGZpZWxkIChieSBjbGlja2luZyBvdXRzaWRlIG9mIGl0IC0gb24gYW5vdGhlciBmaWVsZCwgZm9yIGV4YW1wbGUpLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5kaXNhYmxlU2VsZWN0T25DbGljaygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmRpc2FibGVTZWxlY3RPbkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkNvbW1pdE9uU2VsQ2hhbmdlLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93IHRoaXMgZHJvcGRvd24gb24gdGhlIHNwZWNpZmllZCBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHVidW50dUZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KHVidW50dUZvbnRCeXRlcylcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uY3JlYXRlRHJvcGRvd24oJ2Jlc3QuZ3VuZGFtJylcbiAgICAgKiBkcm9wZG93bi5zZXRPcHRpb25zKFsnRXhpYScsICdEeW5hbWVzJ10pXG4gICAgICogZHJvcGRvd24uc2VsZWN0KCdFeGlhJylcbiAgICAgKlxuICAgICAqIGRyb3Bkb3duLmFkZFRvUGFnZShwYWdlLCB7XG4gICAgICogICB4OiA1MCxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgd2lkdGg6IDIwMCxcbiAgICAgKiAgIGhlaWdodDogMTAwLFxuICAgICAqICAgdGV4dENvbG9yOiByZ2IoMSwgMCwgMCksXG4gICAgICogICBiYWNrZ3JvdW5kQ29sb3I6IHJnYigwLCAxLCAwKSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiByZ2IoMCwgMCwgMSksXG4gICAgICogICBib3JkZXJXaWR0aDogMixcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcyg5MCksXG4gICAgICogICBmb250OiB1YnVudHVGb250LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB3aWRnZXQgZm9yIHRoaXMgZHJvcGRvd24gZmllbGQuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gd2hpY2ggdGhpcyBkcm9wZG93biB3aWRnZXQgc2hvdWxkIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhpcyBkcm9wZG93biB3aWRnZXQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmFkZFRvUGFnZSA9IGZ1bmN0aW9uIChwYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbW1BERlBhZ2UsICdQREZQYWdlJ11dKTtcbiAgICAgICAgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAoISgndGV4dENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMudGV4dENvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYmFja2dyb3VuZENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYmFja2dyb3VuZENvbG9yID0gcmdiKDEsIDEsIDEpO1xuICAgICAgICBpZiAoISgnYm9yZGVyQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlcldpZHRoJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyV2lkdGggPSAxO1xuICAgICAgICAvLyBDcmVhdGUgYSB3aWRnZXQgZm9yIHRoaXMgZHJvcGRvd25cbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0KHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAyMDAsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiA1MCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9lID0gb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9mID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBoaWRkZW46IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5hZGRXaWRnZXQod2lkZ2V0UmVmKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHZhciBmb250ID0gKF9nID0gb3B0aW9ucy5mb250KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB0aGlzLmRvYy5nZXRGb3JtKCkuZ2V0RGVmYXVsdEZvbnQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIGdpdmVuIHBhZ2VcbiAgICAgICAgcGFnZS5ub2RlLmFkZEFubm90KHdpZGdldFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGRyb3Bkb3duIGhhcyBiZWVuIG1hcmtlZCBhcyBkaXJ0eSwgb3IgaWYgYW55IG9mXG4gICAgICogdGhpcyBkcm9wZG93bidzIHdpZGdldHMgZG8gbm90IGhhdmUgYW4gYXBwZWFyYW5jZSBzdHJlYW0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBpZiAoZHJvcGRvd24ubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSBjb25zb2xlLmxvZygnTmVlZHMgdXBkYXRlJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGRyb3Bkb3duIG5lZWRzIGFuIGFwcGVhcmFuY2UgdXBkYXRlLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLmlzRGlydHkoKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgaGFzQXBwZWFyYW5jZXMgPSAoKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWwpIGluc3RhbmNlb2YgUERGU3RyZWFtO1xuICAgICAgICAgICAgaWYgKCFoYXNBcHBlYXJhbmNlcylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGRyb3Bkb3duJ3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIGRyb3Bkb3ducy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICB0aGlzLnVwZGF0ZUFwcGVhcmFuY2VzKGZvbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBkcm9wZG93bidzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZ2l2ZW4gYXBwZWFyYW5jZSBwcm92aWRlci4gSWYgbm8gYHByb3ZpZGVyYCBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0XG4gICAgICogYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgZHJvcGRvd25zIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24udXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhLCAoZmllbGQsIHdpZGdldCwgZm9udCkgPT4ge1xuICAgICAqICAgLi4uXG4gICAgICogICByZXR1cm4gZHJhd1RleHRGaWVsZCguLi4pXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqIEBwYXJhbSBwcm92aWRlciBPcHRpb25hbGx5LCB0aGUgYXBwZWFyYW5jZSBwcm92aWRlciB0byBiZSB1c2VkIGZvclxuICAgICAqICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS51cGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250LCBwcm92aWRlcikge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwcm92aWRlciwgJ3Byb3ZpZGVyJywgW0Z1bmN0aW9uXSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICAvLyBnZXRPcHRpb24oaW5kZXg6IG51bWJlcik6IHN0cmluZyB7fVxuICAgIC8vIGdldFNlbGVjdGVkSW5kaWNlcygpOiBudW1iZXJbXSB7fVxuICAgIC8vIHJlbW92ZU9wdGlvbnMob3B0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXSkge31cbiAgICAvLyByZW1vdmVJbmRpY2VzKG9wdGlvbjogbnVtYmVyW10pIHt9XG4gICAgLy8gZGVzZWxlY3Qob3B0aW9uczogc3RyaW5nIHwgc3RyaW5nW10pIHt9XG4gICAgLy8gZGVzZWxlY3RJbmRpY2VzKG9wdGlvbkluZGljZXM6IG51bWJlcltdKSB7fVxuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIGFwUHJvdmlkZXIgPSBwcm92aWRlciAhPT0gbnVsbCAmJiBwcm92aWRlciAhPT0gdm9pZCAwID8gcHJvdmlkZXIgOiBkZWZhdWx0RHJvcGRvd25BcHBlYXJhbmNlUHJvdmlkZXI7XG4gICAgICAgIHZhciBhcHBlYXJhbmNlcyA9IG5vcm1hbGl6ZUFwcGVhcmFuY2UoYXBQcm92aWRlcih0aGlzLCB3aWRnZXQsIGZvbnQpKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlV2l0aEZvbnQod2lkZ2V0LCBmb250LCBhcHBlYXJhbmNlcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRm9ybS5nZXREcm9wZG93bl1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGRHJvcGRvd25dXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGRHJvcGRvd25dXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9Db21ib0JveCBhbmQgcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb0NvbWJvQm94IFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvQ29tYm9Cb3hgIGZvciB0aGlzIGRyb3Bkb3duLlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgZHJvcGRvd24uXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhpcyBkcm9wZG93biB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5vZiA9IGZ1bmN0aW9uIChhY3JvQ29tYm9Cb3gsIHJlZiwgZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRHJvcGRvd24oYWNyb0NvbWJvQm94LCByZWYsIGRvYyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRHJvcGRvd247XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZEcm9wZG93bjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkRyb3Bkb3duLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduLCBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuLi9QREZEb2N1bWVudFwiO1xuaW1wb3J0IHsgY29sb3JUb0NvbXBvbmVudHMsIHNldEZpbGxpbmdDb2xvciB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IHRvRGVncmVlcywgcm90YXRlUmVjdGFuZ2xlLCByZWR1Y2VSb3RhdGlvbiwgYWRqdXN0RGltc0ZvclJvdGF0aW9uLCBkZWdyZWVzLCB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFBERlJlZiwgUERGV2lkZ2V0QW5ub3RhdGlvbiwgUERGTmFtZSwgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciwgQWNyb0ZpZWxkRmxhZ3MsIFBERkFjcm9UZXJtaW5hbCwgQW5ub3RhdGlvbkZsYWdzLCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0TXVsdGlwbGUsIGFzc2VydE9yVW5kZWZpbmVkIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBJbWFnZUFsaWdubWVudCB9IGZyb20gJy4uL2ltYWdlJztcbmltcG9ydCB7IGRyYXdJbWFnZSwgcm90YXRlSW5QbGFjZSB9IGZyb20gJy4uL29wZXJhdGlvbnMnO1xuZXhwb3J0IHZhciBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy55LCAnb3B0aW9ucy55JywgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndpZHRoLCAnb3B0aW9ucy53aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oZWlnaHQsICdvcHRpb25zLmhlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50ZXh0Q29sb3IsICdvcHRpb25zLnRleHRDb2xvcicsIFtcbiAgICAgICAgW09iamVjdCwgJ0NvbG9yJ10sXG4gICAgXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJhY2tncm91bmRDb2xvciwgJ29wdGlvbnMuYmFja2dyb3VuZENvbG9yJywgW1xuICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICBdKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyQ29sb3IsICdvcHRpb25zLmJvcmRlckNvbG9yJywgW1xuICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICBdKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyV2lkdGgsICdvcHRpb25zLmJvcmRlcldpZHRoJywgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJvdGF0ZSwgJ29wdGlvbnMucm90YXRlJywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG59O1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBUaGlzIGNsYXNzIGlzIGVmZmVjdGl2ZWx5IGFic3RyYWN0LiBBbGwgZmllbGRzIGluIGEgW1tQREZGb3JtXV0gd2lsbFxuICogYWN0dWFsbHkgYmUgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzLlxuICpcbiAqIE5vdGUgdGhhdCBlYWNoIGZpZWxkIGluIGEgUERGIGlzIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGZpZWxkIG9iamVjdC5cbiAqIEhvd2V2ZXIsIGEgZ2l2ZW4gZmllbGQgb2JqZWN0IG1heSBiZSByZW5kZXJlZCBhdCBtdWx0aXBsZSBsb2NhdGlvbnMgd2l0aGluXG4gKiB0aGUgZG9jdW1lbnQgKGFjcm9zcyBvbmUgb3IgbW9yZSBwYWdlcykuIFRoZSByZW5kZXJpbmcgb2YgYSBmaWVsZCBpc1xuICogY29udHJvbGxlZCBieSBpdHMgd2lkZ2V0cy4gRWFjaCB3aWRnZXQgY2F1c2VzIGl0cyBmaWVsZCB0byBiZSBkaXNwbGF5ZWQgYXQgYVxuICogcGFydGljdWxhciBsb2NhdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG4gKlxuICogTW9zdCBvZiB0aGUgdGltZSBlYWNoIGZpZWxkIGluIGEgUERGIGhhcyBvbmx5IGEgc2luZ2xlIHdpZGdldCwgYW5kIHRodXMgaXNcbiAqIG9ubHkgcmVuZGVyZWQgb25jZS4gSG93ZXZlciwgaWYgYSBmaWVsZCBpcyByZW5kZXJlZCBtdWx0aXBsZSB0aW1lcywgaXQgd2lsbFxuICogaGF2ZSBtdWx0aXBsZSB3aWRnZXRzIC0gb25lIGZvciBlYWNoIGxvY2F0aW9uIGl0IGlzIHJlbmRlcmVkLlxuICpcbiAqIFRoaXMgYWJzdHJhY3Rpb24gb2YgZmllbGQgb2JqZWN0cyBhbmQgd2lkZ2V0cyBpcyBkZWZpbmVkIGluIHRoZSBQREZcbiAqIHNwZWNpZmljYXRpb24gYW5kIGRpY3RhdGVzIGhvdyBQREYgZmlsZXMgc3RvcmUgZmllbGRzIGFuZCB3aGVyZSB0aGV5IGFyZVxuICogdG8gYmUgcmVuZGVyZWQuXG4gKi9cbnZhciBQREZGaWVsZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZGaWVsZChhY3JvRmllbGQsIHJlZiwgZG9jKSB7XG4gICAgICAgIGFzc2VydElzKGFjcm9GaWVsZCwgJ2Fjcm9GaWVsZCcsIFtbUERGQWNyb1Rlcm1pbmFsLCAnUERGQWNyb1Rlcm1pbmFsJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMocmVmLCAncmVmJywgW1tQREZSZWYsICdQREZSZWYnXV0pO1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZCA9IGFjcm9GaWVsZDtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgZmllbGQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGRzID0gZm9ybS5nZXRGaWVsZHMoKVxuICAgICAqIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgKiAgIGNvbnN0IG5hbWUgPSBmaWVsZC5nZXROYW1lKClcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdGaWVsZCBuYW1lOicsIG5hbWUpXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgUERGIGZpZWxkcyBhcmUgc3RydWN0dXJlZCBhcyBhIHRyZWUuIEVhY2ggZmllbGQgaXMgdGhlXG4gICAgICogZGVzY2VuZGVudCBvZiBhIHNlcmllcyBvZiBhbmNlc3RvciBub2RlcyBhbGwgdGhlIHdheSB1cCB0byB0aGUgZm9ybSBub2RlLFxuICAgICAqIHdoaWNoIGlzIGFsd2F5cyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4gRWFjaCBub2RlIGluIHRoZSB0cmVlIChleGNlcHQgZm9yXG4gICAgICogdGhlIGZvcm0gbm9kZSkgaGFzIGEgcGFydGlhbCBuYW1lLiBQYXJ0aWFsIG5hbWVzIGNhbiBiZSBjb21wb3NlZCBvZiBhbnlcbiAgICAgKiB1bmljb2RlIGNoYXJhY3RlcnMgZXhjZXB0IGEgcGVyaW9kIChgLmApLiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYVxuICAgICAqIGZpZWxkIGlzIGNvbXBvc2VkIG9mIHRoZSBwYXJ0aWFsIG5hbWVzIG9mIGFsbCBpdHMgYW5jZXN0b3JzIGpvaW5lZFxuICAgICAqIHdpdGggcGVyaW9kcy4gVGhpcyBtZWFucyB0aGF0IHNwbGl0dGluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb25cbiAgICAgKiBwZXJpb2RzIGFuZCB0YWtpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGFycmF5IHdpbGwgZ2l2ZSB5b3VcbiAgICAgKiB0aGUgcGFydGlhbCBuYW1lIG9mIGEgc3BlY2lmaWMgZmllbGQuXG4gICAgICogQHJldHVybnMgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgZmllbGQuXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuYWNyb0ZpZWxkLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgZmllbGQgaXMgcmVhZCBvbmx5LiBUaGlzIG1lYW5zIHRoYXQgUERGIHJlYWRlcnNcbiAgICAgKiB3aWxsIG5vdCBhbGxvdyB1c2VycyB0byBpbnRlcmFjdCB3aXRoIHRoZSBmaWVsZCBvciBjaGFuZ2UgaXRzIHZhbHVlLiBTZWVcbiAgICAgKiBbW1BERkZpZWxkLmVuYWJsZVJlYWRPbmx5XV0gYW5kIFtbUERGRmllbGQuZGlzYWJsZVJlYWRPbmx5XV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGlmIChmaWVsZC5pc1JlYWRPbmx5KCkpIGNvbnNvbGUubG9nKCdSZWFkIG9ubHkgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBpcyBhIHJlYWQgb25seSBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuaXNSZWFkT25seSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0ZpZWxkRmxhZ3MuUmVhZE9ubHkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJldmVudCBQREYgcmVhZGVycyBmcm9tIGFsbG93aW5nIHVzZXJzIHRvIGludGVyYWN0IHdpdGggdGhpcyBmaWVsZCBvclxuICAgICAqIGNoYW5nZSBpdHMgdmFsdWUuIFRoZSBmaWVsZCB3aWxsIG5vdCByZXNwb25kIHRvIG1vdXNlIG9yIGtleWJvYXJkIGlucHV0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBmaWVsZC5lbmFibGVSZWFkT25seSgpXG4gICAgICogYGBgXG4gICAgICogVXNlZnVsIGZvciBmaWVsZHMgd2hvc2UgdmFsdWVzIGFyZSBjb21wdXRlZCwgaW1wb3J0ZWQgZnJvbSBhIGRhdGFiYXNlLCBvclxuICAgICAqIHByZWZpbGxlZCBieSBzb2Z0d2FyZSBiZWZvcmUgYmVpbmcgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5lbmFibGVSZWFkT25seSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9GaWVsZEZsYWdzLlJlYWRPbmx5LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IHVzZXJzIHRvIGludGVyYWN0IHdpdGggdGhpcyBmaWVsZCBhbmQgY2hhbmdlIGl0cyB2YWx1ZSBpbiBQREZcbiAgICAgKiByZWFkZXJzIHZpYSBtb3VzZSBhbmQga2V5Ym9hcmQgaW5wdXQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBmaWVsZC5kaXNhYmxlUmVhZE9ubHkoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5kaXNhYmxlUmVhZE9ubHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvRmllbGRGbGFncy5SZWFkT25seSwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBmaWVsZCBtdXN0IGhhdmUgYSB2YWx1ZSB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC5cbiAgICAgKiBTZWUgW1tQREZGaWVsZC5lbmFibGVSZXF1aXJlZF1dIGFuZCBbW1BERkZpZWxkLmRpc2FibGVSZXF1aXJlZF1dLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBpZiAoZmllbGQuaXNSZXF1aXJlZCgpKSBjb25zb2xlLmxvZygnRmllbGQgaXMgcmVxdWlyZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgaXMgcmVxdWlyZWQuXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmlzUmVxdWlyZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9GaWVsZEZsYWdzLlJlcXVpcmVkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlcXVpcmUgdGhpcyBmaWVsZCB0byBoYXZlIGEgdmFsdWUgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGZpZWxkLmVuYWJsZVJlcXVpcmVkKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZW5hYmxlUmVxdWlyZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvRmllbGRGbGFncy5SZXF1aXJlZCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgcmVxdWlyZSB0aGlzIGZpZWxkIHRvIGhhdmUgYSB2YWx1ZSB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogZmllbGQuZGlzYWJsZVJlcXVpcmVkKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZGlzYWJsZVJlcXVpcmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0ZpZWxkRmxhZ3MuUmVxdWlyZWQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgZmllbGQncyB2YWx1ZSBzaG91bGQgYmUgZXhwb3J0ZWQgd2hlbiB0aGUgZm9ybSBpc1xuICAgICAqIHN1Ym1pdHRlZC4gU2VlIFtbUERGRmllbGQuZW5hYmxlRXhwb3J0aW5nXV0gYW5kXG4gICAgICogW1tQREZGaWVsZC5kaXNhYmxlRXhwb3J0aW5nXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGlmIChmaWVsZC5pc0V4cG9ydGVkKCkpIGNvbnNvbGUubG9nKCdFeHBvcnRpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBmaWVsZCdzIHZhbHVlIHNob3VsZCBiZSBleHBvcnRlZC5cbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuaXNFeHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9GaWVsZEZsYWdzLk5vRXhwb3J0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBmaWVsZCdzIHZhbHVlIHNob3VsZCBiZSBleHBvcnRlZCB3aGVuIHRoZSBmb3JtIGlzXG4gICAgICogc3VibWl0dGVkIGluIGEgUERGIHJlYWRlci4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGZpZWxkLmVuYWJsZUV4cG9ydGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmVuYWJsZUV4cG9ydGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9GaWVsZEZsYWdzLk5vRXhwb3J0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgZmllbGQncyB2YWx1ZSBzaG91bGQgKipub3QqKiBiZSBleHBvcnRlZCB3aGVuIHRoZSBmb3JtXG4gICAgICogaXMgc3VibWl0dGVkIGluIGEgUERGIHJlYWRlci4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGZpZWxkLmRpc2FibGVFeHBvcnRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5kaXNhYmxlRXhwb3J0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0ZpZWxkRmxhZ3MuTm9FeHBvcnQsIHRydWUpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnbmVlZHNBcHBlYXJhbmNlc1VwZGF0ZScpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKF9mb250KSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2RlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcycpO1xuICAgIH07XG4gICAgUERGRmllbGQucHJvdG90eXBlLm1hcmtBc0RpcnR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRvYy5nZXRGb3JtKCkubWFya0ZpZWxkQXNEaXJ0eSh0aGlzLnJlZik7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUubWFya0FzQ2xlYW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZG9jLmdldEZvcm0oKS5tYXJrRmllbGRBc0NsZWFuKHRoaXMucmVmKTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5pc0RpcnR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2MuZ2V0Rm9ybSgpLmZpZWxkSXNEaXJ0eSh0aGlzLnJlZik7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUuY3JlYXRlV2lkZ2V0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdGV4dENvbG9yID0gb3B0aW9ucy50ZXh0Q29sb3I7XG4gICAgICAgIHZhciBiYWNrZ3JvdW5kQ29sb3IgPSBvcHRpb25zLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgdmFyIGJvcmRlckNvbG9yID0gb3B0aW9ucy5ib3JkZXJDb2xvcjtcbiAgICAgICAgdmFyIGJvcmRlcldpZHRoID0gb3B0aW9ucy5ib3JkZXJXaWR0aDtcbiAgICAgICAgdmFyIGRlZ3JlZXNBbmdsZSA9IHRvRGVncmVlcyhvcHRpb25zLnJvdGF0ZSk7XG4gICAgICAgIHZhciBjYXB0aW9uID0gb3B0aW9ucy5jYXB0aW9uO1xuICAgICAgICB2YXIgeCA9IG9wdGlvbnMueDtcbiAgICAgICAgdmFyIHkgPSBvcHRpb25zLnk7XG4gICAgICAgIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGggKyBib3JkZXJXaWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0ICsgYm9yZGVyV2lkdGg7XG4gICAgICAgIHZhciBoaWRkZW4gPSBCb29sZWFuKG9wdGlvbnMuaGlkZGVuKTtcbiAgICAgICAgdmFyIHBhZ2VSZWYgPSBvcHRpb25zLnBhZ2U7XG4gICAgICAgIGFzc2VydE11bHRpcGxlKGRlZ3JlZXNBbmdsZSwgJ2RlZ3JlZXNBbmdsZScsIDkwKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGZvciB0aGlzIGZpZWxkXG4gICAgICAgIHZhciB3aWRnZXQgPSBQREZXaWRnZXRBbm5vdGF0aW9uLmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0LCB0aGlzLnJlZik7XG4gICAgICAgIC8vIFNldCB3aWRnZXQgcHJvcGVydGllc1xuICAgICAgICB2YXIgcmVjdCA9IHJvdGF0ZVJlY3RhbmdsZSh7IHg6IHgsIHk6IHksIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfSwgYm9yZGVyV2lkdGgsIGRlZ3JlZXNBbmdsZSk7XG4gICAgICAgIHdpZGdldC5zZXRSZWN0YW5nbGUocmVjdCk7XG4gICAgICAgIGlmIChwYWdlUmVmKVxuICAgICAgICAgICAgd2lkZ2V0LnNldFAocGFnZVJlZik7XG4gICAgICAgIHZhciBhYyA9IHdpZGdldC5nZXRPckNyZWF0ZUFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICAgICAgaWYgKGJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgYWMuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yVG9Db21wb25lbnRzKGJhY2tncm91bmRDb2xvcikpO1xuICAgICAgICB9XG4gICAgICAgIGFjLnNldFJvdGF0aW9uKGRlZ3JlZXNBbmdsZSk7XG4gICAgICAgIGlmIChjYXB0aW9uKVxuICAgICAgICAgICAgYWMuc2V0Q2FwdGlvbnMoeyBub3JtYWw6IGNhcHRpb24gfSk7XG4gICAgICAgIGlmIChib3JkZXJDb2xvcilcbiAgICAgICAgICAgIGFjLnNldEJvcmRlckNvbG9yKGNvbG9yVG9Db21wb25lbnRzKGJvcmRlckNvbG9yKSk7XG4gICAgICAgIHZhciBicyA9IHdpZGdldC5nZXRPckNyZWF0ZUJvcmRlclN0eWxlKCk7XG4gICAgICAgIGlmIChib3JkZXJXaWR0aCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgYnMuc2V0V2lkdGgoYm9yZGVyV2lkdGgpO1xuICAgICAgICB3aWRnZXQuc2V0RmxhZ1RvKEFubm90YXRpb25GbGFncy5QcmludCwgdHJ1ZSk7XG4gICAgICAgIHdpZGdldC5zZXRGbGFnVG8oQW5ub3RhdGlvbkZsYWdzLkhpZGRlbiwgaGlkZGVuKTtcbiAgICAgICAgd2lkZ2V0LnNldEZsYWdUbyhBbm5vdGF0aW9uRmxhZ3MuSW52aXNpYmxlLCBmYWxzZSk7XG4gICAgICAgIC8vIFNldCBhY3JvZmllbGQgcHJvcGVydGllc1xuICAgICAgICBpZiAodGV4dENvbG9yKSB7XG4gICAgICAgICAgICB2YXIgZGEgPSAoX2EgPSB0aGlzLmFjcm9GaWVsZC5nZXREZWZhdWx0QXBwZWFyYW5jZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICAgICAgICAgIHZhciBuZXdEYSA9IGRhICsgJ1xcbicgKyBzZXRGaWxsaW5nQ29sb3IodGV4dENvbG9yKS50b1N0cmluZygpO1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RGVmYXVsdEFwcGVhcmFuY2UobmV3RGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aWRnZXQ7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZVdpdGhGb250ID0gZnVuY3Rpb24gKHdpZGdldCwgZm9udCwgX2EpIHtcbiAgICAgICAgdmFyIG5vcm1hbCA9IF9hLm5vcm1hbCwgcm9sbG92ZXIgPSBfYS5yb2xsb3ZlciwgZG93biA9IF9hLmRvd247XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZXMod2lkZ2V0LCB7XG4gICAgICAgICAgICBub3JtYWw6IHRoaXMuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIG5vcm1hbCwgZm9udCksXG4gICAgICAgICAgICByb2xsb3Zlcjogcm9sbG92ZXIgJiYgdGhpcy5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgcm9sbG92ZXIsIGZvbnQpLFxuICAgICAgICAgICAgZG93bjogZG93biAmJiB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0od2lkZ2V0LCBkb3duLCBmb250KSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUudXBkYXRlT25PZmZXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgb25WYWx1ZSwgX2EpIHtcbiAgICAgICAgdmFyIG5vcm1hbCA9IF9hLm5vcm1hbCwgcm9sbG92ZXIgPSBfYS5yb2xsb3ZlciwgZG93biA9IF9hLmRvd247XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZXMod2lkZ2V0LCB7XG4gICAgICAgICAgICBub3JtYWw6IHRoaXMuY3JlYXRlQXBwZWFyYW5jZURpY3Qod2lkZ2V0LCBub3JtYWwsIG9uVmFsdWUpLFxuICAgICAgICAgICAgcm9sbG92ZXI6IHJvbGxvdmVyICYmIHRoaXMuY3JlYXRlQXBwZWFyYW5jZURpY3Qod2lkZ2V0LCByb2xsb3Zlciwgb25WYWx1ZSksXG4gICAgICAgICAgICBkb3duOiBkb3duICYmIHRoaXMuY3JlYXRlQXBwZWFyYW5jZURpY3Qod2lkZ2V0LCBkb3duLCBvblZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAod2lkZ2V0LCBfYSkge1xuICAgICAgICB2YXIgbm9ybWFsID0gX2Eubm9ybWFsLCByb2xsb3ZlciA9IF9hLnJvbGxvdmVyLCBkb3duID0gX2EuZG93bjtcbiAgICAgICAgd2lkZ2V0LnNldE5vcm1hbEFwcGVhcmFuY2Uobm9ybWFsKTtcbiAgICAgICAgaWYgKHJvbGxvdmVyKSB7XG4gICAgICAgICAgICB3aWRnZXQuc2V0Um9sbG92ZXJBcHBlYXJhbmNlKHJvbGxvdmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdpZGdldC5yZW1vdmVSb2xsb3ZlckFwcGVhcmFuY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG93bikge1xuICAgICAgICAgICAgd2lkZ2V0LnNldERvd25BcHBlYXJhbmNlKGRvd24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2lkZ2V0LnJlbW92ZURvd25BcHBlYXJhbmNlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIC8vIFRPRE86IERvIHdlIG5lZWQgdG8gZG8gdGhpcy4uLj9cbiAgICAvLyBwcml2YXRlIGZvbyhmb250OiBQREZGb250LCBkaWN0OiBQREZEaWN0KSB7XG4gICAgLy8gICBpZiAoIWRpY3QubG9va3VwKFBERk5hbWUub2YoJ0RSJykpKSB7XG4gICAgLy8gICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ0RSJyksIGRpY3QuY29udGV4dC5vYmooe30pKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGNvbnN0IERSID0gZGljdC5sb29rdXAoUERGTmFtZS5vZignRFInKSwgUERGRGljdCk7XG4gICAgLy8gICBpZiAoIURSLmxvb2t1cChQREZOYW1lLm9mKCdGb250JykpKSB7XG4gICAgLy8gICAgIERSLnNldChQREZOYW1lLm9mKCdGb250JyksIGRpY3QuY29udGV4dC5vYmooe30pKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGNvbnN0IEZvbnQgPSBEUi5sb29rdXAoUERGTmFtZS5vZignRm9udCcpLCBQREZEaWN0KTtcbiAgICAvLyAgIEZvbnQuc2V0KFBERk5hbWUub2YoZm9udC5uYW1lKSwgZm9udC5yZWYpO1xuICAgIC8vIH1cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSA9IGZ1bmN0aW9uICh3aWRnZXQsIGFwcGVhcmFuY2UsIGZvbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuYWNyb0ZpZWxkLmRpY3QuY29udGV4dDtcbiAgICAgICAgdmFyIF9iID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpLCB3aWR0aCA9IF9iLndpZHRoLCBoZWlnaHQgPSBfYi5oZWlnaHQ7XG4gICAgICAgIC8vIFRPRE86IERvIHdlIG5lZWQgdG8gZG8gdGhpcy4uLj9cbiAgICAgICAgLy8gaWYgKGZvbnQpIHtcbiAgICAgICAgLy8gICB0aGlzLmZvbyhmb250LCB3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vICAgdGhpcy5mb28oZm9udCwgdGhpcy5kb2MuZ2V0Rm9ybSgpLmFjcm9Gb3JtLmRpY3QpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIEVORCBUT0RPXG4gICAgICAgIHZhciBSZXNvdXJjZXMgPSBmb250ICYmIHsgRm9udDogKF9hID0ge30sIF9hW2ZvbnQubmFtZV0gPSBmb250LnJlZiwgX2EpIH07XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250ZXh0LmZvcm1YT2JqZWN0KGFwcGVhcmFuY2UsIHtcbiAgICAgICAgICAgIFJlc291cmNlczogUmVzb3VyY2VzLFxuICAgICAgICAgICAgQkJveDogY29udGV4dC5vYmooWzAsIDAsIHdpZHRoLCBoZWlnaHRdKSxcbiAgICAgICAgICAgIE1hdHJpeDogY29udGV4dC5vYmooWzEsIDAsIDAsIDEsIDAsIDBdKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzdHJlYW1SZWYgPSBjb250ZXh0LnJlZ2lzdGVyKHN0cmVhbSk7XG4gICAgICAgIHJldHVybiBzdHJlYW1SZWY7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBGb3JtWE9iamVjdCBvZiB0aGUgc3VwcGxpZWQgaW1hZ2UgYW5kIGFkZCBpdCB0byBjb250ZXh0LlxuICAgICAqIFRoZSBGb3JtWE9iamVjdCBzaXplIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIHdpZGdldCAoaW5jbHVkaW5nXG4gICAgICogdGhlIGFsaWdubWVudCkuXG4gICAgICogQHBhcmFtIHdpZGdldCBUaGUgd2lkZ2V0IHRoYXQgc2hvdWxkIGRpc3BsYXkgdGhlIGltYWdlLlxuICAgICAqIEBwYXJhbSBhbGlnbm1lbnQgVGhlIGFsaWdubWVudCBvZiB0aGUgaW1hZ2UuXG4gICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICogQHJldHVybnMgVGhlIHJlZiBmb3IgdGhlIEZvcm1YT2JqZWN0IHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBjb250ZXh0LlxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5jcmVhdGVJbWFnZUFwcGVhcmFuY2VTdHJlYW0gPSBmdW5jdGlvbiAod2lkZ2V0LCBpbWFnZSwgYWxpZ25tZW50KSB7XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBoYW5kbGUgaW1hZ2UgYm9yZGVycy5cbiAgICAgICAgLy8gTk9URTogQWNyb2JhdCBzZWVtcyB0byByZXNpemUgdGhlIGltYWdlIChtYXliZSBldmVuIHNrZXdpbmcgaXRzIGFzcGVjdFxuICAgICAgICAvLyAgICAgICByYXRpbykgdG8gZml0IHBlcmZlY3RseSB3aXRoaW4gdGhlIHdpZGdldCdzIHJlY3RhbmdsZS4gVGhpcyBtZXRob2RcbiAgICAgICAgLy8gICAgICAgZG9lcyBub3QgY3VycmVudGx5IGRvIHRoYXQuIFNob3VsZCB0aGVyZSBiZSBhbiBvcHRpb24gZm9yIHRoYXQ/XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIF9iO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuYWNyb0ZpZWxkLmRpY3QuY29udGV4dDtcbiAgICAgICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICAgICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICAgICAgdmFyIGJzID0gd2lkZ2V0LmdldEJvcmRlclN0eWxlKCk7XG4gICAgICAgIHZhciBib3JkZXJXaWR0aCA9IChfYiA9IGJzID09PSBudWxsIHx8IGJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBicy5nZXRXaWR0aCgpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgICAgIHZhciByb3RhdGUgPSByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiByb3RhdGlvbiB9KSk7XG4gICAgICAgIHZhciBhZGogPSBhZGp1c3REaW1zRm9yUm90YXRpb24ocmVjdGFuZ2xlLCByb3RhdGlvbik7XG4gICAgICAgIHZhciBpbWFnZURpbXMgPSBpbWFnZS5zY2FsZVRvRml0KGFkai53aWR0aCAtIGJvcmRlcldpZHRoICogMiwgYWRqLmhlaWdodCAtIGJvcmRlcldpZHRoICogMik7XG4gICAgICAgIC8vIFN1cHBvcnQgYm9yZGVycyBvbiBpbWFnZXMgYW5kIG1heWJlIG90aGVyIHByb3BlcnRpZXNcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB4OiBib3JkZXJXaWR0aCxcbiAgICAgICAgICAgIHk6IGJvcmRlcldpZHRoLFxuICAgICAgICAgICAgd2lkdGg6IGltYWdlRGltcy53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaW1hZ2VEaW1zLmhlaWdodCxcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoYWxpZ25tZW50ID09PSBJbWFnZUFsaWdubWVudC5DZW50ZXIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMueCArPSAoYWRqLndpZHRoIC0gYm9yZGVyV2lkdGggKiAyKSAvIDIgLSBpbWFnZURpbXMud2lkdGggLyAyO1xuICAgICAgICAgICAgb3B0aW9ucy55ICs9IChhZGouaGVpZ2h0IC0gYm9yZGVyV2lkdGggKiAyKSAvIDIgLSBpbWFnZURpbXMuaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGlnbm1lbnQgPT09IEltYWdlQWxpZ25tZW50LlJpZ2h0KSB7XG4gICAgICAgICAgICBvcHRpb25zLnggPSBhZGoud2lkdGggLSBib3JkZXJXaWR0aCAtIGltYWdlRGltcy53aWR0aDtcbiAgICAgICAgICAgIG9wdGlvbnMueSA9IGFkai5oZWlnaHQgLSBib3JkZXJXaWR0aCAtIGltYWdlRGltcy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGltYWdlTmFtZSA9IHRoaXMuZG9jLmNvbnRleHQuYWRkUmFuZG9tU3VmZml4KCdJbWFnZScsIDEwKTtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2UgPSBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdJbWFnZShpbWFnZU5hbWUsIG9wdGlvbnMpKTtcbiAgICAgICAgLy8vLy8vLy8vLy8vXG4gICAgICAgIHZhciBSZXNvdXJjZXMgPSB7IFhPYmplY3Q6IChfYSA9IHt9LCBfYVtpbWFnZU5hbWVdID0gaW1hZ2UucmVmLCBfYSkgfTtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRleHQuZm9ybVhPYmplY3QoYXBwZWFyYW5jZSwge1xuICAgICAgICAgICAgUmVzb3VyY2VzOiBSZXNvdXJjZXMsXG4gICAgICAgICAgICBCQm94OiBjb250ZXh0Lm9iaihbMCwgMCwgcmVjdGFuZ2xlLndpZHRoLCByZWN0YW5nbGUuaGVpZ2h0XSksXG4gICAgICAgICAgICBNYXRyaXg6IGNvbnRleHQub2JqKFsxLCAwLCAwLCAxLCAwLCAwXSksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udGV4dC5yZWdpc3RlcihzdHJlYW0pO1xuICAgIH07XG4gICAgUERGRmllbGQucHJvdG90eXBlLmNyZWF0ZUFwcGVhcmFuY2VEaWN0ID0gZnVuY3Rpb24gKHdpZGdldCwgYXBwZWFyYW5jZSwgb25WYWx1ZSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuYWNyb0ZpZWxkLmRpY3QuY29udGV4dDtcbiAgICAgICAgdmFyIG9uU3RyZWFtUmVmID0gdGhpcy5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgYXBwZWFyYW5jZS5vbik7XG4gICAgICAgIHZhciBvZmZTdHJlYW1SZWYgPSB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0od2lkZ2V0LCBhcHBlYXJhbmNlLm9mZik7XG4gICAgICAgIHZhciBhcHBlYXJhbmNlRGljdCA9IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgYXBwZWFyYW5jZURpY3Quc2V0KG9uVmFsdWUsIG9uU3RyZWFtUmVmKTtcbiAgICAgICAgYXBwZWFyYW5jZURpY3Quc2V0KFBERk5hbWUub2YoJ09mZicpLCBvZmZTdHJlYW1SZWYpO1xuICAgICAgICByZXR1cm4gYXBwZWFyYW5jZURpY3Q7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRmllbGQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRmllbGQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZGaWVsZC5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEb2N1bWVudCBmcm9tIFwiLi4vUERGRG9jdW1lbnRcIjtcbmltcG9ydCBQREZCdXR0b24gZnJvbSBcIi4vUERGQnV0dG9uXCI7XG5pbXBvcnQgUERGQ2hlY2tCb3ggZnJvbSBcIi4vUERGQ2hlY2tCb3hcIjtcbmltcG9ydCBQREZEcm9wZG93biBmcm9tIFwiLi9QREZEcm9wZG93blwiO1xuaW1wb3J0IFBERk9wdGlvbkxpc3QgZnJvbSBcIi4vUERGT3B0aW9uTGlzdFwiO1xuaW1wb3J0IFBERlJhZGlvR3JvdXAgZnJvbSBcIi4vUERGUmFkaW9Hcm91cFwiO1xuaW1wb3J0IFBERlNpZ25hdHVyZSBmcm9tIFwiLi9QREZTaWduYXR1cmVcIjtcbmltcG9ydCBQREZUZXh0RmllbGQgZnJvbSBcIi4vUERGVGV4dEZpZWxkXCI7XG5pbXBvcnQgeyBOb1N1Y2hGaWVsZEVycm9yLCBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IsIEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yLCBJbnZhbGlkRmllbGROYW1lUGFydEVycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZGb250IGZyb20gXCIuLi9QREZGb250XCI7XG5pbXBvcnQgeyBTdGFuZGFyZEZvbnRzIH0gZnJvbSBcIi4uL1N0YW5kYXJkRm9udHNcIjtcbmltcG9ydCB7IHJvdGF0ZUluUGxhY2UgfSBmcm9tIFwiLi4vb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgZHJhd09iamVjdCwgcG9wR3JhcGhpY3NTdGF0ZSwgcHVzaEdyYXBoaWNzU3RhdGUsIHRyYW5zbGF0ZSwgfSBmcm9tIFwiLi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBQREZBY3JvRm9ybSwgUERGQWNyb0NoZWNrQm94LCBQREZBY3JvQ29tYm9Cb3gsIFBERkFjcm9MaXN0Qm94LCBQREZBY3JvUmFkaW9CdXR0b24sIFBERkFjcm9TaWduYXR1cmUsIFBERkFjcm9UZXh0LCBQREZBY3JvUHVzaEJ1dHRvbiwgUERGQWNyb05vblRlcm1pbmFsLCBQREZEaWN0LCBQREZSZWYsIGNyZWF0ZVBERkFjcm9GaWVsZHMsIFBERk5hbWUsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBDYWNoZSwgYXNzZXJ0T3JVbmRlZmluZWQgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgaW50ZXJhY3RpdmUgZm9ybSBvZiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqXG4gKiBJbnRlcmFjdGl2ZSBmb3JtcyAoc29tZXRpbWVzIGNhbGxlZCBfQWNyb0Zvcm1zXykgYXJlIGNvbGxlY3Rpb25zIG9mIGZpZWxkc1xuICogZGVzaWduZWQgdG8gZ2F0aGVyIGluZm9ybWF0aW9uIGZyb20gYSB1c2VyLiBBIFBERiBkb2N1bWVudCBtYXkgY29udGFpbnMgYW55XG4gKiBudW1iZXIgb2YgZmllbGRzIHRoYXQgYXBwZWFyIG9uIHZhcmlvdXMgcGFnZXMsIGFsbCBvZiB3aGljaCBtYWtlIHVwIGEgc2luZ2xlLFxuICogZ2xvYmFsIGludGVyYWN0aXZlIGZvcm0gc3Bhbm5pbmcgdGhlIGVudGlyZSBkb2N1bWVudC4gVGhpcyBtZWFucyB0aGF0XG4gKiBpbnN0YW5jZXMgb2YgW1tQREZEb2N1bWVudF1dIHNoYWxsIGNvbnRhaW4gYXQgbW9zdCBvbmUgW1tQREZGb3JtXV0uXG4gKlxuICogVGhlIGZpZWxkcyBvZiBhbiBpbnRlcmFjdGl2ZSBmb3JtIGFyZSByZXByZXNlbnRlZCBieSBbW1BERkZpZWxkXV0gaW5zdGFuY2VzLlxuICovXG52YXIgUERGRm9ybSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZGb3JtKGFjcm9Gb3JtLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5lbWJlZERlZmF1bHRGb250ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmRvYy5lbWJlZFN0YW5kYXJkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSk7XG4gICAgICAgIH07XG4gICAgICAgIGFzc2VydElzKGFjcm9Gb3JtLCAnYWNyb0Zvcm0nLCBbW1BERkFjcm9Gb3JtLCAnUERGQWNyb0Zvcm0nXV0pO1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICB0aGlzLmFjcm9Gb3JtID0gYWNyb0Zvcm07XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmRpcnR5RmllbGRzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLmRlZmF1bHRGb250Q2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeSh0aGlzLmVtYmVkRGVmYXVsdEZvbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIFtbUERGRm9ybV1dIGhhcyBYRkEgZGF0YS4gTW9zdCBQREZzIHdpdGggZm9ybVxuICAgICAqIGZpZWxkcyBkbyBub3QgdXNlIFhGQSBhcyBpdCBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCBieSBQREYgcmVhZGVycy5cbiAgICAgKlxuICAgICAqID4gYHBkZi1saWJgIGRvZXMgbm90IHN1cHBvcnQgY3JlYXRpb24sIG1vZGlmaWNhdGlvbiwgb3IgcmVhZGluZyBvZiBYRkFcbiAgICAgKiA+IGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBpZiAoZm9ybS5oYXNYRkEoKSkgY29uc29sZS5sb2coJ1BERiBoYXMgWEZBIGRhdGEnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZm9ybSBoYXMgWEZBIGRhdGEuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuaGFzWEZBID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRm9ybS5kaWN0LmhhcyhQREZOYW1lLm9mKCdYRkEnKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0IHRoZSBYRkEgZGF0YSBmcm9tIHRoaXMgW1tQREZGb3JtXV0gKGlmIGFueSBleGlzdHMpLiBUaGlzIHdpbGxcbiAgICAgKiBmb3JjZSByZWFkZXJzIHRvIGZhbGxiYWNrIHRvIHN0YW5kYXJkIGZpZWxkcyBpZiB0aGUgW1tQREZEb2N1bWVudF1dXG4gICAgICogY29udGFpbnMgYW55LiBGb3IgZXhhbXBsZTpcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBmb3JtLmRlbGV0ZVhGQSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZGVsZXRlWEZBID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9Gb3JtLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ1hGQScpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhbGwgZmllbGRzIGNvbnRhaW5lZCBpbiB0aGlzIFtbUERGRm9ybV1dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZmllbGRzID0gZm9ybS5nZXRGaWVsZHMoKVxuICAgICAqIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgKiAgIGNvbnN0IHR5cGUgPSBmaWVsZC5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICogICBjb25zdCBuYW1lID0gZmllbGQuZ2V0TmFtZSgpXG4gICAgICogICBjb25zb2xlLmxvZyhgJHt0eXBlfTogJHtuYW1lfWApXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgZmllbGRzIGluIHRoaXMgZm9ybS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRGaWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhbGxGaWVsZHMgPSB0aGlzLmFjcm9Gb3JtLmdldEFsbEZpZWxkcygpO1xuICAgICAgICB2YXIgZmllbGRzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFsbEZpZWxkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGFsbEZpZWxkc1tpZHhdLCBhY3JvRmllbGQgPSBfYVswXSwgcmVmID0gX2FbMV07XG4gICAgICAgICAgICB2YXIgZmllbGQgPSBjb252ZXJ0VG9QREZGaWVsZChhY3JvRmllbGQsIHJlZiwgdGhpcy5kb2MpO1xuICAgICAgICAgICAgaWYgKGZpZWxkKVxuICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmllbGRzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGRNYXliZSgnUGFnZTEuRm9vLkJhclswXScpXG4gICAgICogaWYgKGZpZWxkKSBjb25zb2xlLmxvZygnRmllbGQgZXhpc3RzIScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgZmllbGQgbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGlmIG9uZSBleGlzdHMuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0RmllbGRNYXliZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZHMgPSB0aGlzLmdldEZpZWxkcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBmaWVsZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaWR4XTtcbiAgICAgICAgICAgIGlmIChmaWVsZC5nZXROYW1lKCkgPT09IG5hbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnUGFnZTEuRm9vLkJhclswXScpXG4gICAgICogYGBgXG4gICAgICogSWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIGZpZWxkIG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIGZpZWxkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldEZpZWxkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZE1heWJlKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBOb1N1Y2hGaWVsZEVycm9yKG5hbWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBidXR0b24gZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5nZXRCdXR0b24oJ1BhZ2UxLkZvby5CdXR0b25bMF0nKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBidXR0b24gbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgYnV0dG9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldEJ1dHRvbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkJ1dHRvbilcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBQREZCdXR0b24sIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY2hlY2sgYm94IGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdQYWdlMS5Gb28uQ2hlY2tCb3hbMF0nKVxuICAgICAqIGNoZWNrQm94LmNoZWNrKClcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYSBjaGVjayBib3guXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgY2hlY2sgYm94IG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIGNoZWNrIGJveCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRDaGVja0JveCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkNoZWNrQm94KVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERkNoZWNrQm94LCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRyb3Bkb3duIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdQYWdlMS5Gb28uRHJvcGRvd25bMF0nKVxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSBkcm9wZG93bi5nZXRPcHRpb25zKClcbiAgICAgKiBkcm9wZG93bi5zZWxlY3Qob3B0aW9uc1swXSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYSBkcm9wZG93bi5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBkcm9wZG93biBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBkcm9wZG93biB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXREcm9wZG93biA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkRyb3Bkb3duKVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERkRyb3Bkb3duLCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG9wdGlvbiBsaXN0IGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnUGFnZTEuRm9vLk9wdGlvbkxpc3RbMF0nKVxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25MaXN0LmdldE9wdGlvbnMoKVxuICAgICAqIG9wdGlvbkxpc3Quc2VsZWN0KG9wdGlvbnNbMF0pXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUsIG9yIGlmXG4gICAgICogdGhlIGZpZWxkIGV4aXN0cyBidXQgaXMgbm90IGFuIG9wdGlvbiBsaXN0LlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIG9wdGlvbiBsaXN0IG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGlvbiBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldE9wdGlvbkxpc3QgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZPcHRpb25MaXN0KVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERk9wdGlvbkxpc3QsIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmFkaW8gZ3JvdXAgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdQYWdlMS5Gb28uUmFkaW9Hcm91cFswXScpXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IHJhZGlvR3JvdXAuZ2V0T3B0aW9ucygpXG4gICAgICogcmFkaW9Hcm91cC5zZWxlY3Qob3B0aW9uc1swXSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYSByYWRpbyBncm91cC5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCByYWRpbyBncm91cCBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSByYWRpbyBncm91cCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRSYWRpb0dyb3VwID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGUmFkaW9Hcm91cClcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBQREZSYWRpb0dyb3VwLCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNpZ25hdHVyZSBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHNpZ25hdHVyZSA9IGZvcm0uZ2V0U2lnbmF0dXJlKCdQYWdlMS5Gb28uU2lnbmF0dXJlWzBdJylcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYSBzaWduYXR1cmUuXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgc2lnbmF0dXJlIG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIHNpZ25hdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRTaWduYXR1cmUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZTaWduYXR1cmUpXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGU2lnbmF0dXJlLCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRleHQgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnUGFnZTEuRm9vLlRleHRGaWVsZFswXScpXG4gICAgICogdGV4dEZpZWxkLnNldFRleHQoJ0FyZSB5b3UgZGVzaWduZWQgdG8gYWN0IG9yIHRvIGJlIGFjdGVkIHVwb24/JylcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYSB0ZXh0IGZpZWxkLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIHRleHQgZmllbGQgbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdGV4dCBmaWVsZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRUZXh0RmllbGQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZUZXh0RmllbGQpXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGVGV4dEZpZWxkLCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgYnV0dG9uIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uY3JlYXRlQnV0dG9uKCdjb29sLm5ldy5idXR0b24nKVxuICAgICAqXG4gICAgICogYnV0dG9uLmFkZFRvUGFnZSgnRG8gU3R1ZmYnLCBmb250LCBwYWdlKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGEgZmllbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgYnV0dG9uLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgYnV0dG9uIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmNyZWF0ZUJ1dHRvbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBuYW1lUGFydHMgPSBzcGxpdEZpZWxkTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZmluZE9yQ3JlYXRlTm9uVGVybWluYWxzKG5hbWVQYXJ0cy5ub25UZXJtaW5hbCk7XG4gICAgICAgIHZhciBidXR0b24gPSBQREZBY3JvUHVzaEJ1dHRvbi5jcmVhdGUodGhpcy5kb2MuY29udGV4dCk7XG4gICAgICAgIGJ1dHRvbi5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICBhZGRGaWVsZFRvUGFyZW50KHBhcmVudCwgW2J1dHRvbiwgYnV0dG9uLnJlZl0sIG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIHJldHVybiBQREZCdXR0b24ub2YoYnV0dG9uLCBidXR0b24ucmVmLCB0aGlzLmRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgY2hlY2sgYm94IGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5jcmVhdGVDaGVja0JveCgnY29vbC5uZXcuY2hlY2tCb3gnKVxuICAgICAqXG4gICAgICogY2hlY2tCb3guYWRkVG9QYWdlKHBhZ2UpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBjaGVjayBib3guXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBjaGVjayBib3ggZmllbGQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuY3JlYXRlQ2hlY2tCb3ggPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgbmFtZVBhcnRzID0gc3BsaXRGaWVsZE5hbWUobmFtZSk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyhuYW1lUGFydHMubm9uVGVybWluYWwpO1xuICAgICAgICB2YXIgY2hlY2tCb3ggPSBQREZBY3JvQ2hlY2tCb3guY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICBjaGVja0JveC5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICBhZGRGaWVsZFRvUGFyZW50KHBhcmVudCwgW2NoZWNrQm94LCBjaGVja0JveC5yZWZdLCBuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICByZXR1cm4gUERGQ2hlY2tCb3gub2YoY2hlY2tCb3gsIGNoZWNrQm94LnJlZiwgdGhpcy5kb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGRyb3Bkb3duIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5jcmVhdGVEcm9wZG93bignY29vbC5uZXcuZHJvcGRvd24nKVxuICAgICAqXG4gICAgICogZHJvcGRvd24uYWRkVG9QYWdlKGZvbnQsIHBhZ2UpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBkcm9wZG93bi5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IGRyb3Bkb3duIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmNyZWF0ZURyb3Bkb3duID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IHNwbGl0RmllbGROYW1lKG5hbWUpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMobmFtZVBhcnRzLm5vblRlcm1pbmFsKTtcbiAgICAgICAgdmFyIGNvbWJvQm94ID0gUERGQWNyb0NvbWJvQm94LmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgY29tYm9Cb3guc2V0UGFydGlhbE5hbWUobmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgYWRkRmllbGRUb1BhcmVudChwYXJlbnQsIFtjb21ib0JveCwgY29tYm9Cb3gucmVmXSwgbmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgcmV0dXJuIFBERkRyb3Bkb3duLm9mKGNvbWJvQm94LCBjb21ib0JveC5yZWYsIHRoaXMuZG9jKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBvcHRpb24gbGlzdCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5jcmVhdGVPcHRpb25MaXN0KCdjb29sLm5ldy5vcHRpb25MaXN0JylcbiAgICAgKlxuICAgICAqIG9wdGlvbkxpc3QuYWRkVG9QYWdlKGZvbnQsIHBhZ2UpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBvcHRpb24gbGlzdC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IG9wdGlvbiBsaXN0IGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmNyZWF0ZU9wdGlvbkxpc3QgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgbmFtZVBhcnRzID0gc3BsaXRGaWVsZE5hbWUobmFtZSk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyhuYW1lUGFydHMubm9uVGVybWluYWwpO1xuICAgICAgICB2YXIgbGlzdEJveCA9IFBERkFjcm9MaXN0Qm94LmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgbGlzdEJveC5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICBhZGRGaWVsZFRvUGFyZW50KHBhcmVudCwgW2xpc3RCb3gsIGxpc3RCb3gucmVmXSwgbmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgcmV0dXJuIFBERk9wdGlvbkxpc3Qub2YobGlzdEJveCwgbGlzdEJveC5yZWYsIHRoaXMuZG9jKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyByYWRpbyBncm91cCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5jcmVhdGVSYWRpb0dyb3VwKCdjb29sLm5ldy5yYWRpb0dyb3VwJylcbiAgICAgKlxuICAgICAqIHJhZGlvR3JvdXAuYWRkT3B0aW9uVG9QYWdlKCdpcy1kb2cnLCBwYWdlLCB7IHk6IDAgfSlcbiAgICAgKiByYWRpb0dyb3VwLmFkZE9wdGlvblRvUGFnZSgnaXMtY2F0JywgcGFnZSwgeyB5OiA3NSB9KVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGEgZmllbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgcmFkaW8gZ3JvdXAuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyByYWRpbyBncm91cCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5jcmVhdGVSYWRpb0dyb3VwID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IHNwbGl0RmllbGROYW1lKG5hbWUpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMobmFtZVBhcnRzLm5vblRlcm1pbmFsKTtcbiAgICAgICAgdmFyIHJhZGlvQnV0dG9uID0gUERGQWNyb1JhZGlvQnV0dG9uLmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgcmFkaW9CdXR0b24uc2V0UGFydGlhbE5hbWUobmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgYWRkRmllbGRUb1BhcmVudChwYXJlbnQsIFtyYWRpb0J1dHRvbiwgcmFkaW9CdXR0b24ucmVmXSwgbmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgcmV0dXJuIFBERlJhZGlvR3JvdXAub2YocmFkaW9CdXR0b24sIHJhZGlvQnV0dG9uLnJlZiwgdGhpcy5kb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHRleHQgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5jcmVhdGVUZXh0RmllbGQoJ2Nvb2wubmV3LnRleHRGaWVsZCcpXG4gICAgICpcbiAgICAgKiB0ZXh0RmllbGQuYWRkVG9QYWdlKGZvbnQsIHBhZ2UpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyByYWRpbyBncm91cC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IHJhZGlvIGdyb3VwIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmNyZWF0ZVRleHRGaWVsZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBuYW1lUGFydHMgPSBzcGxpdEZpZWxkTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZmluZE9yQ3JlYXRlTm9uVGVybWluYWxzKG5hbWVQYXJ0cy5ub25UZXJtaW5hbCk7XG4gICAgICAgIHZhciB0ZXh0ID0gUERGQWNyb1RleHQuY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICB0ZXh0LnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIGFkZEZpZWxkVG9QYXJlbnQocGFyZW50LCBbdGV4dCwgdGV4dC5yZWZdLCBuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICByZXR1cm4gUERGVGV4dEZpZWxkLm9mKHRleHQsIHRleHQucmVmLCB0aGlzLmRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGbGF0dGVuIGFsbCBmaWVsZHMgaW4gdGhpcyBbW1BERkZvcm1dXS5cbiAgICAgKlxuICAgICAqIEZsYXR0ZW5pbmcgYSBmb3JtIGZpZWxkIHdpbGwgdGFrZSB0aGUgY3VycmVudCBhcHBlYXJhbmNlIGZvciBlYWNoIG9mIHRoYXRcbiAgICAgKiBmaWVsZCdzIHdpZGdldHMgYW5kIG1ha2UgdGhlbSBwYXJ0IG9mIHRoZWlyIHBhZ2UncyBjb250ZW50IHN0cmVhbS4gQWxsIGZvcm1cbiAgICAgKiBmaWVsZHMgYW5kIGFubm90YXRpb25zIGFzc29jaWF0ZWQgYXJlIHRoZW4gcmVtb3ZlZC4gTm90ZSB0aGF0IG9uY2UgYSBmb3JtXG4gICAgICogaGFzIGJlZW4gZmxhdHRlbmVkIGl0cyBmaWVsZHMgY2FuIG5vIGxvbmdlciBiZSBhY2Nlc3NlZCBvciBlZGl0ZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBvZnRlbiB1c2VkIGFmdGVyIGZpbGxpbmcgZm9ybSBmaWVsZHMgdG8gZW5zdXJlIGFcbiAgICAgKiBjb25zaXN0ZW50IGFwcGVhcmFuY2UgYWNyb3NzIGRpZmZlcmVudCBQREYgcmVhZGVycyBhbmQvb3IgcHJpbnRlcnMuXG4gICAgICogQW5vdGhlciBjb21tb24gdXNlIGNhc2UgaXMgdG8gY29weSBhIHRlbXBsYXRlIGRvY3VtZW50IHdpdGggZm9ybSBmaWVsZHNcbiAgICAgKiBpbnRvIGFub3RoZXIgZG9jdW1lbnQuIEluIHRoaXMgc2NlbmFyaW8geW91IHdvdWxkIGxvYWQgdGhlIHRlbXBsYXRlXG4gICAgICogZG9jdW1lbnQsIGZpbGwgaXRzIGZpZWxkcywgZmxhdHRlbiBpdCwgYW5kIHRoZW4gY29weSBpdHMgcGFnZXMgaW50byB0aGVcbiAgICAgKiByZWNpcGllbnQgZG9jdW1lbnQgLSB0aGUgZmlsbGVkIGZpZWxkcyB3aWxsIGJlIGNvcGllZCBvdmVyLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKTtcbiAgICAgKiBmb3JtLmZsYXR0ZW4oKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5mbGF0dGVuID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0geyB1cGRhdGVGaWVsZEFwcGVhcmFuY2VzOiB0cnVlIH07IH1cbiAgICAgICAgaWYgKG9wdGlvbnMudXBkYXRlRmllbGRBcHBlYXJhbmNlcykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWVsZEFwcGVhcmFuY2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5GaWVsZHMgPSBmaWVsZHMubGVuZ3RoOyBpIDwgbGVuRmllbGRzOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgICAgIHZhciB3aWRnZXRzID0gZmllbGQuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBsZW5XaWRnZXRzID0gd2lkZ2V0cy5sZW5ndGg7IGogPCBsZW5XaWRnZXRzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tqXTtcbiAgICAgICAgICAgICAgICB2YXIgcGFnZSA9IHRoaXMuZmluZFdpZGdldFBhZ2Uod2lkZ2V0KTtcbiAgICAgICAgICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5maW5kV2lkZ2V0QXBwZWFyYW5jZVJlZihmaWVsZCwgd2lkZ2V0KTtcbiAgICAgICAgICAgICAgICB2YXIgeE9iamVjdEtleSA9IHBhZ2Uubm9kZS5uZXdYT2JqZWN0KCdGbGF0V2lkZ2V0Jywgd2lkZ2V0UmVmKTtcbiAgICAgICAgICAgICAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgICAgICAgICAgICAgIHZhciBvcGVyYXRvcnMgPSBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgICAgICAgICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZShyZWN0YW5nbGUueCwgcmVjdGFuZ2xlLnkpXG4gICAgICAgICAgICAgICAgXSwgcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogMCB9KSksIFtcbiAgICAgICAgICAgICAgICAgICAgZHJhd09iamVjdCh4T2JqZWN0S2V5KSxcbiAgICAgICAgICAgICAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICAgICAgICAgIF0pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBwYWdlLnB1c2hPcGVyYXRvcnMuYXBwbHkocGFnZSwgb3BlcmF0b3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRmllbGQoZmllbGQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBmaWVsZCBmcm9tIHRoaXMgW1tQREZGb3JtXV0uXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpO1xuICAgICAqIGNvbnN0IGFnZUZpZWxkID0gZm9ybS5nZXRGaWVsZHMoKS5maW5kKHggPT4geC5nZXROYW1lKCkgPT09ICdBZ2UnKTtcbiAgICAgKiBmb3JtLnJlbW92ZUZpZWxkKGFnZUZpZWxkKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5yZW1vdmVGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IGZpZWxkLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIHZhciBwYWdlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2ldO1xuICAgICAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZmluZFdpZGdldEFwcGVhcmFuY2VSZWYoZmllbGQsIHdpZGdldCk7XG4gICAgICAgICAgICB2YXIgcGFnZSA9IHRoaXMuZmluZFdpZGdldFBhZ2Uod2lkZ2V0KTtcbiAgICAgICAgICAgIHBhZ2VzLmFkZChwYWdlKTtcbiAgICAgICAgICAgIHBhZ2Uubm9kZS5yZW1vdmVBbm5vdCh3aWRnZXRSZWYpO1xuICAgICAgICB9XG4gICAgICAgIHBhZ2VzLmZvckVhY2goZnVuY3Rpb24gKHBhZ2UpIHsgcmV0dXJuIHBhZ2Uubm9kZS5yZW1vdmVBbm5vdChmaWVsZC5yZWYpOyB9KTtcbiAgICAgICAgdGhpcy5hY3JvRm9ybS5yZW1vdmVGaWVsZChmaWVsZC5hY3JvRmllbGQpO1xuICAgICAgICB2YXIgZmllbGRLaWRzID0gZmllbGQuYWNyb0ZpZWxkLm5vcm1hbGl6ZWRFbnRyaWVzKCkuS2lkcztcbiAgICAgICAgdmFyIGtpZHNDb3VudCA9IGZpZWxkS2lkcy5zaXplKCk7XG4gICAgICAgIGZvciAodmFyIGNoaWxkSW5kZXggPSAwOyBjaGlsZEluZGV4IDwga2lkc0NvdW50OyBjaGlsZEluZGV4KyspIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGZpZWxkS2lkcy5nZXQoY2hpbGRJbmRleCk7XG4gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBQREZSZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRvYy5jb250ZXh0LmRlbGV0ZShjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2MuY29udGV4dC5kZWxldGUoZmllbGQucmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBhbGwgd2lkZ2V0cyBvZiBhbGwgZmllbGRzIGluIHRoaXNcbiAgICAgKiBbW1BERkZvcm1dXS4gQXBwZWFyYW5jZSBzdHJlYW1zIHdpbGwgb25seSBiZSBjcmVhdGVkIGZvciBhIHdpZGdldCBpZiBpdFxuICAgICAqIGRvZXMgbm90IGhhdmUgYW55IGV4aXN0aW5nIGFwcGVhcmFuY2Ugc3RyZWFtcywgb3IgdGhlIGZpZWxkJ3MgdmFsdWUgaGFzXG4gICAgICogY2hhbmdlZCAoZS5nLiBieSBjYWxsaW5nIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBvclxuICAgICAqIFtbUERGRHJvcGRvd24uc2VsZWN0XV0pLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb3VyaWVyID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkNvdXJpZXIpXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBmb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMoY291cmllcilcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqICoqSU1QT1JUQU5UOioqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYGZvbnRgIHBhcmFtZXRlciBpc1xuICAgICAqIFtbU3RhbmRhcmRGb250cy5IZWx2ZXRpY2FdXS4gTm90ZSB0aGF0IHRoaXMgaXMgYSBXaW5BbnNpIGZvbnQuIFRoaXMgbWVhbnNcbiAgICAgKiB0aGF0IGVuY29kaW5nIGVycm9ycyB3aWxsIGJlIHRocm93biBpZiBhbnkgZmllbGRzIGNvbnRhaW4gdGV4dCB3aXRoXG4gICAgICogY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBXaW5BbnNpIGNoYXJhY3RlciBzZXQgKHRoZSBsYXRpbiBhbHBoYWJldCkuXG4gICAgICpcbiAgICAgKiBFbWJlZGRpbmcgYSBjdXN0b20gZm9udCBhbmQgcGFzc2luZyB0aGF0IGFzIHRoZSBgZm9udGBcbiAgICAgKiBwYXJhbWV0ZXIgYWxsb3dzIHlvdSB0byBnZW5lcmF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgd2l0aCBub24gV2luQW5zaVxuICAgICAqIGNoYXJhY3RlcnMgKGFzc3VtaW5nIHlvdXIgY3VzdG9tIGZvbnQgc3VwcG9ydHMgdGhlbSkuXG4gICAgICpcbiAgICAgKiA+ICoqTk9URToqKiBUaGUgW1tQREZEb2N1bWVudC5zYXZlXV0gbWV0aG9kIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCB0b1xuICAgICAqID4gdXBkYXRlIGFwcGVhcmFuY2VzIGF1dG9tYXRpY2FsbHkgaWYgYSBmb3JtIHdhcyBhY2Nlc3NlZCB2aWEgdGhlXG4gICAgICogPiBbW1BERkRvY3VtZW50LmdldEZvcm1dXSBtZXRob2QgcHJpb3IgdG8gc2F2aW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvbnQgT3B0aW9uYWxseSwgdGhlIGZvbnQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgbmV3IGFwcGVhcmFuY2VzLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICBmb250ID0gZm9udCAhPT0gbnVsbCAmJiBmb250ICE9PSB2b2lkIDAgPyBmb250IDogdGhpcy5nZXREZWZhdWx0Rm9udCgpO1xuICAgICAgICB2YXIgZmllbGRzID0gdGhpcy5nZXRGaWVsZHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZmllbGRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2lkeF07XG4gICAgICAgICAgICBpZiAoZmllbGQubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKGZvbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYXJrIGEgZmllbGQgYXMgZGlydHkuIFRoaXMgd2lsbCBjYXVzZSBpdHMgYXBwZWFyYW5jZSBzdHJlYW1zIHRvIGJlXG4gICAgICogdXBkYXRlZCBieSBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dLlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ2Zvby5iYXInKVxuICAgICAqIGZvcm0ubWFya0ZpZWxkQXNEaXJ0eShmaWVsZC5yZWYpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZpZWxkUmVmIFRoZSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIHRoYXQgc2hvdWxkIGJlIG1hcmtlZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5tYXJrRmllbGRBc0RpcnR5ID0gZnVuY3Rpb24gKGZpZWxkUmVmKSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKGZpZWxkUmVmLCAnZmllbGRSZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIHRoaXMuZGlydHlGaWVsZHMuYWRkKGZpZWxkUmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1hcmsgYSBmaWVsZCBhcyBkaXJ0eS4gVGhpcyB3aWxsIGNhdXNlIGl0cyBhcHBlYXJhbmNlIHN0cmVhbXMgdG8gbm90IGJlXG4gICAgICogdXBkYXRlZCBieSBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dLlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ2Zvby5iYXInKVxuICAgICAqIGZvcm0ubWFya0ZpZWxkQXNDbGVhbihmaWVsZC5yZWYpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZpZWxkUmVmIFRoZSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIHRoYXQgc2hvdWxkIGJlIG1hcmtlZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5tYXJrRmllbGRBc0NsZWFuID0gZnVuY3Rpb24gKGZpZWxkUmVmKSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKGZpZWxkUmVmLCAnZmllbGRSZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIHRoaXMuZGlydHlGaWVsZHMuZGVsZXRlKGZpZWxkUmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlzIHRoZSBzcGVjaWZpZWQgZmllbGQgaGFzIGJlZW4gbWFya2VkIGFzIGRpcnR5LlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ2Zvby5iYXInKVxuICAgICAqIGlmIChmb3JtLmZpZWxkSXNEaXJ0eShmaWVsZC5yZWYpKSBjb25zb2xlLmxvZygnRmllbGQgaXMgZGlydHknKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmaWVsZFJlZiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCB0aGF0IHNob3VsZCBiZSBjaGVja2VkLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgZmllbGQgaXMgZGlydHkuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZmllbGRJc0RpcnR5ID0gZnVuY3Rpb24gKGZpZWxkUmVmKSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKGZpZWxkUmVmLCAnZmllbGRSZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcnR5RmllbGRzLmhhcyhmaWVsZFJlZik7XG4gICAgfTtcbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXREZWZhdWx0Rm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEZvbnRDYWNoZS5hY2Nlc3MoKTtcbiAgICB9O1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmZpbmRXaWRnZXRQYWdlID0gZnVuY3Rpb24gKHdpZGdldCkge1xuICAgICAgICB2YXIgcGFnZVJlZiA9IHdpZGdldC5QKCk7XG4gICAgICAgIHZhciBwYWdlID0gdGhpcy5kb2MuZ2V0UGFnZXMoKS5maW5kKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4LnJlZiA9PT0gcGFnZVJlZjsgfSk7XG4gICAgICAgIGlmIChwYWdlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LmdldE9iamVjdFJlZih3aWRnZXQuZGljdCk7XG4gICAgICAgICAgICBpZiAod2lkZ2V0UmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIFBERlJlZiBmb3IgUERGT2JqZWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWdlID0gdGhpcy5kb2MuZmluZFBhZ2VGb3JBbm5vdGF0aW9uUmVmKHdpZGdldFJlZik7XG4gICAgICAgICAgICBpZiAocGFnZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgcGFnZSBmb3IgUERGUmVmIFwiICsgd2lkZ2V0UmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICB9O1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmZpbmRXaWRnZXRBcHBlYXJhbmNlUmVmID0gZnVuY3Rpb24gKGZpZWxkLCB3aWRnZXQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgcmVmT3JEaWN0ID0gd2lkZ2V0LmdldE5vcm1hbEFwcGVhcmFuY2UoKTtcbiAgICAgICAgaWYgKHJlZk9yRGljdCBpbnN0YW5jZW9mIFBERkRpY3QgJiZcbiAgICAgICAgICAgIChmaWVsZCBpbnN0YW5jZW9mIFBERkNoZWNrQm94IHx8IGZpZWxkIGluc3RhbmNlb2YgUERGUmFkaW9Hcm91cCkpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGZpZWxkLmFjcm9GaWVsZC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFyIHJlZiA9IChfYSA9IHJlZk9yRGljdC5nZXQodmFsdWUpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiByZWZPckRpY3QuZ2V0KFBERk5hbWUub2YoJ09mZicpKTtcbiAgICAgICAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBQREZSZWYpIHtcbiAgICAgICAgICAgICAgICByZWZPckRpY3QgPSByZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocmVmT3JEaWN0IGluc3RhbmNlb2YgUERGUmVmKSkge1xuICAgICAgICAgICAgdmFyIG5hbWVfMSA9IGZpZWxkLmdldE5hbWUoKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBleHRyYWN0IGFwcGVhcmFuY2UgcmVmIGZvcjogXCIgKyBuYW1lXzEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZPckRpY3Q7XG4gICAgfTtcbiAgICBQREZGb3JtLnByb3RvdHlwZS5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMgPSBmdW5jdGlvbiAocGFydGlhbE5hbWVzKSB7XG4gICAgICAgIHZhciBub25UZXJtaW5hbCA9IFtcbiAgICAgICAgICAgIHRoaXMuYWNyb0Zvcm0sXG4gICAgICAgIF07XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHBhcnRpYWxOYW1lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBuYW1lUGFydCA9IHBhcnRpYWxOYW1lc1tpZHhdO1xuICAgICAgICAgICAgaWYgKCFuYW1lUGFydClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvcihuYW1lUGFydCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50XzEgPSBub25UZXJtaW5hbFswXSwgcGFyZW50UmVmID0gbm9uVGVybWluYWxbMV07XG4gICAgICAgICAgICB2YXIgcmVzID0gdGhpcy5maW5kTm9uVGVybWluYWwobmFtZVBhcnQsIHBhcmVudF8xKTtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICBub25UZXJtaW5hbCA9IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBub2RlID0gUERGQWNyb05vblRlcm1pbmFsLmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICBub2RlLnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0KTtcbiAgICAgICAgICAgICAgICBub2RlLnNldFBhcmVudChwYXJlbnRSZWYpO1xuICAgICAgICAgICAgICAgIHZhciBub2RlUmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcihub2RlLmRpY3QpO1xuICAgICAgICAgICAgICAgIHBhcmVudF8xLmFkZEZpZWxkKG5vZGVSZWYpO1xuICAgICAgICAgICAgICAgIG5vblRlcm1pbmFsID0gW25vZGUsIG5vZGVSZWZdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub25UZXJtaW5hbDtcbiAgICB9O1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmZpbmROb25UZXJtaW5hbCA9IGZ1bmN0aW9uIChwYXJ0aWFsTmFtZSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBmaWVsZHMgPSBwYXJlbnQgaW5zdGFuY2VvZiBQREZBY3JvRm9ybVxuICAgICAgICAgICAgPyB0aGlzLmFjcm9Gb3JtLmdldEZpZWxkcygpXG4gICAgICAgICAgICA6IGNyZWF0ZVBERkFjcm9GaWVsZHMocGFyZW50LktpZHMoKSk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGZpZWxkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGZpZWxkc1tpZHhdLCBmaWVsZCA9IF9hWzBdLCByZWYgPSBfYVsxXTtcbiAgICAgICAgICAgIGlmIChmaWVsZC5nZXRQYXJ0aWFsTmFtZSgpID09PSBwYXJ0aWFsTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9Ob25UZXJtaW5hbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtmaWVsZCwgcmVmXTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IocGFydGlhbE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuZ2V0Rm9ybV1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGRm9ybV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZGb3JtXV0gZnJvbSBhbiBleGlzdGluZyBhY3JvRm9ybSBhbmQgZW1iZWRkZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvRm9ybSBUaGUgdW5kZXJseWluZyBgUERGQWNyb0Zvcm1gIGZvciB0aGlzIGZvcm0uXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhlIGZvcm0gd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGRm9ybS5vZiA9IGZ1bmN0aW9uIChhY3JvRm9ybSwgZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRm9ybShhY3JvRm9ybSwgZG9jKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZGb3JtO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkZvcm07XG52YXIgY29udmVydFRvUERGRmllbGQgPSBmdW5jdGlvbiAoZmllbGQsIHJlZiwgZG9jKSB7XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb1B1c2hCdXR0b24pXG4gICAgICAgIHJldHVybiBQREZCdXR0b24ub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvQ2hlY2tCb3gpXG4gICAgICAgIHJldHVybiBQREZDaGVja0JveC5vZihmaWVsZCwgcmVmLCBkb2MpO1xuICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9Db21ib0JveClcbiAgICAgICAgcmV0dXJuIFBERkRyb3Bkb3duLm9mKGZpZWxkLCByZWYsIGRvYyk7XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb0xpc3RCb3gpXG4gICAgICAgIHJldHVybiBQREZPcHRpb25MaXN0Lm9mKGZpZWxkLCByZWYsIGRvYyk7XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb1RleHQpXG4gICAgICAgIHJldHVybiBQREZUZXh0RmllbGQub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvUmFkaW9CdXR0b24pIHtcbiAgICAgICAgcmV0dXJuIFBERlJhZGlvR3JvdXAub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICB9XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb1NpZ25hdHVyZSkge1xuICAgICAgICByZXR1cm4gUERGU2lnbmF0dXJlLm9mKGZpZWxkLCByZWYsIGRvYyk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xudmFyIHNwbGl0RmllbGROYW1lID0gZnVuY3Rpb24gKGZ1bGx5UXVhbGlmaWVkTmFtZSkge1xuICAgIGlmIChmdWxseVF1YWxpZmllZE5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUERGIGZpZWxkIG5hbWVzIG11c3Qgbm90IGJlIGVtcHR5IHN0cmluZ3MnKTtcbiAgICB9XG4gICAgdmFyIHBhcnRzID0gZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KCcuJyk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gcGFydHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGlmIChwYXJ0c1tpZHhdID09PSAnJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGVyaW9kcyBpbiBQREYgZmllbGQgbmFtZXMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgYXQgbGVhc3Qgb25lIGNoYXJhY3RlcjogXFxcIlwiICsgZnVsbHlRdWFsaWZpZWROYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpXG4gICAgICAgIHJldHVybiB7IG5vblRlcm1pbmFsOiBbXSwgdGVybWluYWw6IHBhcnRzWzBdIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbm9uVGVybWluYWw6IHBhcnRzLnNsaWNlKDAsIHBhcnRzLmxlbmd0aCAtIDEpLFxuICAgICAgICB0ZXJtaW5hbDogcGFydHNbcGFydHMubGVuZ3RoIC0gMV0sXG4gICAgfTtcbn07XG52YXIgYWRkRmllbGRUb1BhcmVudCA9IGZ1bmN0aW9uIChfYSwgX2IsIHBhcnRpYWxOYW1lKSB7XG4gICAgdmFyIHBhcmVudCA9IF9hWzBdLCBwYXJlbnRSZWYgPSBfYVsxXTtcbiAgICB2YXIgZmllbGQgPSBfYlswXSwgZmllbGRSZWYgPSBfYlsxXTtcbiAgICB2YXIgZW50cmllcyA9IHBhcmVudC5ub3JtYWxpemVkRW50cmllcygpO1xuICAgIHZhciBmaWVsZHMgPSBjcmVhdGVQREZBY3JvRmllbGRzKCdLaWRzJyBpbiBlbnRyaWVzID8gZW50cmllcy5LaWRzIDogZW50cmllcy5GaWVsZHMpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGZpZWxkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgaWYgKGZpZWxkc1tpZHhdWzBdLmdldFBhcnRpYWxOYW1lKCkgPT09IHBhcnRpYWxOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IocGFydGlhbE5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhcmVudC5hZGRGaWVsZChmaWVsZFJlZik7XG4gICAgZmllbGQuc2V0UGFyZW50KHBhcmVudFJlZik7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRm9ybS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuLi9QREZQYWdlXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi4vUERGRm9udFwiO1xuaW1wb3J0IFBERkZpZWxkLCB7IGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMsIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUFwcGVhcmFuY2UsIGRlZmF1bHRPcHRpb25MaXN0QXBwZWFyYW5jZVByb3ZpZGVyLCB9IGZyb20gXCIuL2FwcGVhcmFuY2VzXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgUERGSGV4U3RyaW5nLCBQREZTdHJlYW0sIFBERkFjcm9MaXN0Qm94LCBBY3JvQ2hvaWNlRmxhZ3MsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRJc1N1YnNldCwgYXNzZXJ0T3JVbmRlZmluZWQsIGFzc2VydFBvc2l0aXZlLCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGFuIG9wdGlvbiBsaXN0IGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZPcHRpb25MaXN0XV0gZmllbGRzIGFyZSBpbnRlcmFjdGl2ZSBsaXN0cyBvZiBvcHRpb25zLiBUaGUgcHVycG9zZSBvZiBhblxuICogb3B0aW9uIGxpc3QgaXMgdG8gZW5hYmxlIHVzZXJzIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBvcHRpb25zIGZyb20gYSBzZXQgb2ZcbiAqIHBvc3NpYmxlIG9wdGlvbnMuIFVzZXJzIGFyZSBhYmxlIHRvIHNlZSB0aGUgZnVsbCBzZXQgb2Ygb3B0aW9ucyB3aXRob3V0XG4gKiBmaXJzdCBoYXZpbmcgdG8gY2xpY2sgb24gdGhlIGZpZWxkICh0aG91Z2ggc2Nyb2xsaW5nIG1heSBiZSBuZWNlc3NhcnkpLlxuICogQ2xpY2tpbmcgYW4gb3B0aW9uIGluIHRoZSBsaXN0IHdpbGwgY2F1c2UgaXQgdG8gYmUgc2VsZWN0ZWQgYW5kIGRpc3BsYXllZFxuICogd2l0aCBhIGhpZ2hsaWdodGVkIGJhY2tncm91bmQuIFNvbWUgb3B0aW9uIGxpc3RzIGFsbG93IHVzZXJzIHRvIHNlbGVjdFxuICogbW9yZSB0aGFuIG9uZSBvcHRpb24gKHNlZSBbW1BERk9wdGlvbkxpc3QuaXNNdWx0aXNlbGVjdF1dKS5cbiAqL1xudmFyIFBERk9wdGlvbkxpc3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk9wdGlvbkxpc3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGT3B0aW9uTGlzdChhY3JvTGlzdEJveCwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb0xpc3RCb3gsIHJlZiwgZG9jKSB8fCB0aGlzO1xuICAgICAgICBhc3NlcnRJcyhhY3JvTGlzdEJveCwgJ2Fjcm9MaXN0Qm94JywgW1tQREZBY3JvTGlzdEJveCwgJ1BERkFjcm9MaXN0Qm94J11dKTtcbiAgICAgICAgX3RoaXMuYWNyb0ZpZWxkID0gYWNyb0xpc3RCb3g7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb25zIGZvciB0aGlzIG9wdGlvbiBsaXN0LiBUaGVzZSBvcHRpb25zIHdpbGxcbiAgICAgKiBiZSBkaXNwbGF5ZWQgdG8gdXNlcnMgd2hvIHZpZXcgdGhpcyBvcHRpb24gbGlzdCBpbiBhIFBERiByZWFkZXIuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25MaXN0LmdldE9wdGlvbnMoKVxuICAgICAqIGNvbnNvbGUubG9nKCdPcHRpb24gTGlzdCBvcHRpb25zOicsIG9wdGlvbnMpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIG9wdGlvbnMgZm9yIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJhd09wdGlvbnMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPcHRpb25zKCk7XG4gICAgICAgIHZhciBvcHRpb25zID0gbmV3IEFycmF5KHJhd09wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHJhd09wdGlvbnNbaWR4XSwgZGlzcGxheSA9IF9hLmRpc3BsYXksIHZhbHVlID0gX2EudmFsdWU7XG4gICAgICAgICAgICBvcHRpb25zW2lkeF0gPSAoZGlzcGxheSAhPT0gbnVsbCAmJiBkaXNwbGF5ICE9PSB2b2lkIDAgPyBkaXNwbGF5IDogdmFsdWUpLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2VsZWN0ZWQgb3B0aW9ucyBmb3IgdGhpcyBvcHRpb24gbGlzdC4gVGhlc2UgYXJlIHRoZSB2YWx1ZXMgdGhhdFxuICAgICAqIHdlcmUgc2VsZWN0ZWQgYnkgYSBodW1hbiB1c2VyIHZpYSBhIFBERiByZWFkZXIsIG9yIHByb2dyYW1hdGljYWxseSB2aWFcbiAgICAgKiBzb2Z0d2FyZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogY29uc3Qgc2VsZWN0aW9ucyA9IG9wdGlvbkxpc3QuZ2V0U2VsZWN0ZWQoKVxuICAgICAqIGNvbnNvbGUubG9nKCdPcHRpb24gTGlzdCBzZWxlY3Rpb25zOicsIHNlbGVjdGlvbnMpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIHNlbGVjdGVkIG9wdGlvbnMgZm9yIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZ2V0U2VsZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZXMoKTtcbiAgICAgICAgdmFyIHNlbGVjdGVkID0gbmV3IEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFtpZHhdID0gdmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxlY3RlZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGlzdCBvZiBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24gbGlzdC4gVGhlc2UgYXJlXG4gICAgICogdGhlIHZhbHVlcyB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlIGZvciB1c2VycyB0byBzZWxlY3Qgd2hlbiB0aGV5IHZpZXcgdGhpc1xuICAgICAqIG9wdGlvbiBsaXN0IGluIGEgUERGIHJlYWRlci4gTm90ZSB0aGF0IHByZWV4aXN0aW5nIG9wdGlvbnMgZm9yIHRoaXNcbiAgICAgKiBvcHRpb24gbGlzdCB3aWxsIGJlIHJlbW92ZWQuIE9ubHkgdGhlIHZhbHVlcyBwYXNzZWQgYXMgYG9wdGlvbnNgIHdpbGwgYmVcbiAgICAgKiBhdmFpbGFibGUgdG8gc2VsZWN0LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdwbGFuZXRzLm9wdGlvbkxpc3QnKVxuICAgICAqIG9wdGlvbkxpc3Quc2V0T3B0aW9ucyhbJ0VhcnRoJywgJ01hcnMnLCAnUGx1dG8nLCAnVmVudXMnXSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIG9wdGlvbiBsaXN0IGFzIGRpcnR5LCBjYXVzaW5nIGl0cyBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB0byBiZSB1cGRhdGVkIHdoZW4gZWl0aGVyIFtbUERGRG9jdW1lbnQuc2F2ZV1dIG9yXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBpcyBjYWxsZWQuIFRoZSB1cGRhdGVkIHN0cmVhbXMgd2lsbFxuICAgICAqIGRpc3BsYXkgdGhlIG9wdGlvbnMgdGhpcyBmaWVsZCBjb250YWlucyBpbnNpZGUgdGhlIHdpZGdldHMgb2YgdGhpcyB0ZXh0XG4gICAgICogZmllbGQgKHdpdGggc2VsZWN0ZWQgb3B0aW9ucyBoaWdobGlnaHRlZCkuXG4gICAgICpcbiAgICAgKiAqKklNUE9SVEFOVDoqKiBUaGUgZGVmYXVsdCBmb250IHVzZWQgdG8gdXBkYXRlIGFwcGVhcmFuY2Ugc3RyZWFtcyBpc1xuICAgICAqIFtbU3RhbmRhcmRGb250cy5IZWx2ZXRpY2FdXS4gTm90ZSB0aGF0IHRoaXMgaXMgYSBXaW5BbnNpIGZvbnQuIFRoaXMgbWVhbnNcbiAgICAgKiB0aGF0IGVuY29kaW5nIGVycm9ycyB3aWxsIGJlIHRocm93biBpZiB0aGlzIGZpZWxkIGNvbnRhaW5zIGFueSBvcHRpb25zXG4gICAgICogd2l0aCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIFdpbkFuc2kgY2hhcmFjdGVyIHNldCAodGhlIGxhdGluIGFscGhhYmV0KS5cbiAgICAgKlxuICAgICAqIEVtYmVkZGluZyBhIGN1c3RvbSBmb250IGFuZCBwYXNzaW5nIGl0IHRvXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBvciBbW1BERk9wdGlvbkxpc3QudXBkYXRlQXBwZWFyYW5jZXNdXVxuICAgICAqIGFsbG93cyB5b3UgdG8gZ2VuZXJhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIHdpdGggY2hhcmFjdGVycyBvdXRzaWRlIHRoZVxuICAgICAqIGxhdGluIGFscGhhYmV0IChhc3N1bWluZyB0aGUgY3VzdG9tIGZvbnQgc3VwcG9ydHMgdGhlbSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5zZXRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucywgJ29wdGlvbnMnLCBbQXJyYXldKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB2YXIgb3B0aW9uT2JqZWN0cyA9IG5ldyBBcnJheShvcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBvcHRpb25PYmplY3RzW2lkeF0gPSB7IHZhbHVlOiBQREZIZXhTdHJpbmcuZnJvbVRleHQob3B0aW9uc1tpZHhdKSB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldE9wdGlvbnMob3B0aW9uT2JqZWN0cyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgdG8gdGhlIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uIGxpc3QuIFVzZXJzXG4gICAgICogd2lsbCBiZSBhYmxlIHRvIHNlbGVjdCB0aGVzZSB2YWx1ZXMgaW4gYSBQREYgcmVhZGVyLiBJbiBhZGRpdGlvbiB0byB0aGVcbiAgICAgKiB2YWx1ZXMgcGFzc2VkIGFzIGBvcHRpb25zYCwgYW55IHByZWV4aXN0aW5nIG9wdGlvbnMgZm9yIHRoaXMgb3B0aW9uIGxpc3RcbiAgICAgKiB3aWxsIHN0aWxsIGJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgdG8gc2VsZWN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgncm9ja2V0cy5vcHRpb25MaXN0JylcbiAgICAgKiBvcHRpb25MaXN0LmFkZE9wdGlvbnMoWydTYXR1cm4gSVYnLCAnRmFsY29uIEhlYXZ5J10pXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgb3B0aW9uIGxpc3QgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5zZXRPcHRpb25zXV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTmV3IG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuYWRkT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMsICdvcHRpb25zJywgWydzdHJpbmcnLCBBcnJheV0pO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHZhciBvcHRpb25zQXJyID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBbb3B0aW9uc107XG4gICAgICAgIHZhciBleGlzdGluZ09wdGlvbnMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPcHRpb25zKCk7XG4gICAgICAgIHZhciBuZXdPcHRpb25zID0gbmV3IEFycmF5KG9wdGlvbnNBcnIubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9uc0Fyci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG5ld09wdGlvbnNbaWR4XSA9IHsgdmFsdWU6IFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb25zQXJyW2lkeF0pIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0T3B0aW9ucyhleGlzdGluZ09wdGlvbnMuY29uY2F0KG5ld09wdGlvbnMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlbGVjdCBvbmUgb3IgbW9yZSB2YWx1ZXMgZm9yIHRoaXMgb3B0aW9uIGxpc3QuIFRoaXMgb3BlcmF0aW9uIGlzIGFuYWxvZ291c1xuICAgICAqIHRvIGEgaHVtYW4gdXNlciBvcGVuaW5nIHRoZSBvcHRpb24gbGlzdCBpbiBhIFBERiByZWFkZXIgYW5kIGNsaWNraW5nIG9uIG9uZVxuICAgICAqIG9yIG1vcmUgdmFsdWVzIHRvIHNlbGVjdCB0aGVtLiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBzdGF0ZVxuICAgICAqIG9mIHRoZSBvcHRpb24gbGlzdCB0byBpbmRpY2F0ZSB3aGljaCB2YWx1ZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLiBQREZcbiAgICAgKiBsaWJyYXJpZXMgYW5kIHJlYWRlcnMgd2lsbCBiZSBhYmxlIHRvIGV4dHJhY3QgdGhlc2UgdmFsdWVzIGZyb20gdGhlIHNhdmVkXG4gICAgICogZG9jdW1lbnQgYW5kIGRldGVybWluZSB3aGljaCB2YWx1ZXMgd2VyZSBzZWxlY3RlZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ2Jlc3Quc3VwZXJoZXJvZXMub3B0aW9uTGlzdCcpXG4gICAgICogb3B0aW9uTGlzdC5zZWxlY3QoWydPbmUgUHVuY2ggTWFuJywgJ0lyb24gTWFuJ10pXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgb3B0aW9uIGxpc3QgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5zZXRPcHRpb25zXV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICogQHBhcmFtIG1lcmdlIFdoZXRoZXIgb3Igbm90IGV4aXN0aW5nIHNlbGVjdGlvbnMgc2hvdWxkIGJlIHByZXNlcnZlZC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbiAob3B0aW9ucywgbWVyZ2UpIHtcbiAgICAgICAgaWYgKG1lcmdlID09PSB2b2lkIDApIHsgbWVyZ2UgPSBmYWxzZTsgfVxuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLCAnb3B0aW9ucycsIFsnc3RyaW5nJywgQXJyYXldKTtcbiAgICAgICAgYXNzZXJ0SXMobWVyZ2UsICdtZXJnZScsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgdmFyIG9wdGlvbnNBcnIgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IFtvcHRpb25zXTtcbiAgICAgICAgdmFyIHZhbGlkT3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICBhc3NlcnRJc1N1YnNldChvcHRpb25zQXJyLCAnb3B0aW9uJywgdmFsaWRPcHRpb25zKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICBpZiAob3B0aW9uc0Fyci5sZW5ndGggPiAxIHx8IChvcHRpb25zQXJyLmxlbmd0aCA9PT0gMSAmJiBtZXJnZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlTXVsdGlzZWxlY3QoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVzID0gbmV3IEFycmF5KG9wdGlvbnNBcnIubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9uc0Fyci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhbHVlc1tpZHhdID0gUERGSGV4U3RyaW5nLmZyb21UZXh0KG9wdGlvbnNBcnJbaWR4XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlcyhleGlzdGluZ1ZhbHVlcy5jb25jYXQodmFsdWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZXModmFsdWVzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHNlbGVjdGVkIHZhbHVlcyBmb3IgdGhpcyBvcHRpb24gbGlzdC4gVGhpcyBvcGVyYXRpb24gaXNcbiAgICAgKiBlcXVpdmFsZW50IHRvIHNlbGVjdGluZyBhbiBlbXB0eSBsaXN0LiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGVcbiAgICAgKiB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZSBvcHRpb24gbGlzdCB0byBpbmRpY2F0ZSB0aGF0IG5vIHZhbHVlcyBoYXZlIGJlZW5cbiAgICAgKiBzZWxlY3RlZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5jbGVhcigpXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgb3B0aW9uIGxpc3QgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5zZXRPcHRpb25zXV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWVzKFtdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZm9udCBzaXplIGZvciB0aGUgdGV4dCBpbiB0aGlzIGZpZWxkLiBUaGVyZSBuZWVkcyB0byBiZSBhXG4gICAgICogZGVmYXVsdCBhcHBlYXJhbmNlIHN0cmluZyAoREEpIHNldCB3aXRoIGEgZm9udCB2YWx1ZSBzcGVjaWZpZWRcbiAgICAgKiBmb3IgdGhpcyB0byB3b3JrLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5zZXRGb250U2l6ZSg0KTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udFNpemUgVGhlIGZvbnQgc2l6ZSB0byBzZXQgdGhlIGZvbnQgdG8uXG4gICAgICovXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmb250IHNpemUgZm9yIHRoaXMgZmllbGQuIExhcmdlciBmb250IHNpemVzIHdpbGwgcmVzdWx0IGluIGxhcmdlclxuICAgICAqIHRleHQgYmVpbmcgZGlzcGxheWVkIHdoZW4gUERGIHJlYWRlcnMgcmVuZGVyIHRoaXMgb3B0aW9uIGxpc3QuIEZvbnQgc2l6ZXNcbiAgICAgKiBtYXkgYmUgaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBTdXBwbHlpbmcgYSBuZWdhdGl2ZSBmb250IHNpemVcbiAgICAgKiB3aWxsIGNhdXNlIHRoaXMgbWV0aG9kIHRvIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3Quc2V0Rm9udFNpemUoNClcbiAgICAgKiBvcHRpb25MaXN0LnNldEZvbnRTaXplKDE1LjcpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA+IFRoaXMgbWV0aG9kIGRlcGVuZHMgdXBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBhcHBlYXJhbmNlXG4gICAgICogPiAoYC9EQWApIHN0cmluZy4gSWYgdGhpcyBmaWVsZCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBhcHBlYXJhbmNlIHN0cmluZyxcbiAgICAgKiA+IG9yIHRoYXQgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYSBmb250IHNpemUgKHZpYSB0aGUgYFRmYCBvcGVyYXRvciksXG4gICAgICogPiB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9udFNpemUgVGhlIGZvbnQgc2l6ZSB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRleHQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICBhc3NlcnRQb3NpdGl2ZShmb250U2l6ZSwgJ2ZvbnRTaXplJyk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9wdGlvbnMgb2YgdGhpcyBvcHRpb24gbGlzdCBhcmUgYWx3YXlzIGRpc3BsYXllZFxuICAgICAqIGluIGFscGhhYmV0aWNhbCBvcmRlciwgaXJyZXNwZWN0aXZlIG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgb3B0aW9uc1xuICAgICAqIHdlcmUgYWRkZWQgdG8gdGhlIG9wdGlvbiBsaXN0LiBTZWUgW1tQREZPcHRpb25MaXN0LmVuYWJsZVNvcnRpbmddXSBhbmRcbiAgICAgKiBbW1BERk9wdGlvbkxpc3QuZGlzYWJsZVNvcnRpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIGlmIChvcHRpb25MaXN0LmlzU29ydGVkKCkpIGNvbnNvbGUubG9nKCdTb3J0aW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgb3B0aW9uIGxpc3QgaXMgc29ydGVkLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmlzU29ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbHdheXMgZGlzcGxheSB0aGUgb3B0aW9ucyBvZiB0aGlzIG9wdGlvbiBsaXN0IGluIGFscGhhYmV0aWNhbCBvcmRlcixcbiAgICAgKiBpcnJlc3BlY3RpdmUgb2YgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBvcHRpb25zIHdlcmUgYWRkZWQgdG8gdGhpcyBvcHRpb25cbiAgICAgKiBsaXN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmVuYWJsZVNvcnRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmVuYWJsZVNvcnRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgYWx3YXlzIGRpc3BsYXkgdGhlIG9wdGlvbnMgb2YgdGhpcyBvcHRpb24gbGlzdCBpbiBhbHBoYWJldGljYWxcbiAgICAgKiBvcmRlci4gSW5zdGVhZCwgZGlzcGxheSB0aGUgb3B0aW9ucyBpbiB3aGljaGV2ZXIgb3JkZXIgdGhleSB3ZXJlIGFkZGVkXG4gICAgICogdG8gdGhpcyBvcHRpb24gbGlzdC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZGlzYWJsZVNvcnRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmRpc2FibGVTb3J0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLlNvcnQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIG11bHRpcGxlIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIGZyb20gdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKiBTZWUgW1tQREZPcHRpb25MaXN0LmVuYWJsZU11bHRpc2VsZWN0XV0gYW5kXG4gICAgICogW1tQREZPcHRpb25MaXN0LmRpc2FibGVNdWx0aXNlbGVjdF1dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogaWYgKG9wdGlvbkxpc3QuaXNNdWx0aXNlbGVjdCgpKSBjb25zb2xlLmxvZygnTXVsdGlzZWxlY3QgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuaXNNdWx0aXNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IHVzZXJzIHRvIHNlbGVjdCBtb3JlIHRoYW4gb25lIG9wdGlvbiBmcm9tIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZW5hYmxlTXVsdGlzZWxlY3QoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmVuYWJsZU11bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbGxvdyB1c2VycyB0byBzZWxlY3QgbW9yZSB0aGFuIG9uZSBvcHRpb24gZnJvbSB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmRpc2FibGVNdWx0aXNlbGVjdCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZGlzYWJsZU11bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb3B0aW9uIHNlbGVjdGVkIGJ5IGEgdXNlciBpcyBzdG9yZWQsIG9yIFwiY29tbWl0dGVkXCIsXG4gICAgICogd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIG9wdGlvbi4gVGhlIGFsdGVybmF0aXZlIGlzIHRoYXQgdGhlIHVzZXInc1xuICAgICAqIHNlbGVjdGlvbiBpcyBzdG9yZWQgd2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhpcyBvcHRpb24gbGlzdCBmaWVsZCAoYnlcbiAgICAgKiBjbGlja2luZyBvdXRzaWRlIG9mIGl0IC0gb24gYW5vdGhlciBmaWVsZCwgZm9yIGV4YW1wbGUpLiBTZWVcbiAgICAgKiBbW1BERk9wdGlvbkxpc3QuZW5hYmxlU2VsZWN0T25DbGlja11dIGFuZFxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5kaXNhYmxlU2VsZWN0T25DbGlja11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogaWYgKG9wdGlvbkxpc3QuaXNTZWxlY3RPbkNsaWNrKCkpIGNvbnNvbGUubG9nKCdTZWxlY3Qgb24gY2xpY2sgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3Qgb3B0aW9ucyBhcmUgc2VsZWN0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhleSBhcmVcbiAgICAgKiAgICAgICAgICBjbGlja2VkLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmlzU2VsZWN0T25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLkNvbW1pdE9uU2VsQ2hhbmdlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN0b3JlIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1c2VyIGNsaWNrcyB0aGVcbiAgICAgKiBvcHRpb24uIERvIG5vdCB3YWl0IGZvciB0aGUgdXNlciB0byBsZWF2ZSB0aGlzIG9wdGlvbiBsaXN0IGZpZWxkIChieVxuICAgICAqIGNsaWNraW5nIG91dHNpZGUgb2YgaXQgLSBvbiBhbm90aGVyIGZpZWxkLCBmb3IgZXhhbXBsZSkuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmVuYWJsZVNlbGVjdE9uQ2xpY2soKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmVuYWJsZVNlbGVjdE9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuQ29tbWl0T25TZWxDaGFuZ2UsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV2FpdCB0byBzdG9yZSB0aGUgb3B0aW9uIHNlbGVjdGVkIGJ5IGEgdXNlciB1bnRpbCB0aGV5IGxlYXZlIHRoaXMgb3B0aW9uXG4gICAgICogbGlzdCBmaWVsZCAoYnkgY2xpY2tpbmcgb3V0c2lkZSBvZiBpdCAtIG9uIGFub3RoZXIgZmllbGQsIGZvciBleGFtcGxlKS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5kaXNhYmxlU2VsZWN0T25DbGljaygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZGlzYWJsZVNlbGVjdE9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuQ29tbWl0T25TZWxDaGFuZ2UsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNob3cgdGhpcyBvcHRpb24gbGlzdCBvbiB0aGUgc3BlY2lmaWVkIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdWJ1bnR1Rm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQodWJ1bnR1Rm9udEJ5dGVzKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmNyZWF0ZU9wdGlvbkxpc3QoJ2Jlc3QuZ3VuZGFtcycpXG4gICAgICogb3B0aW9uTGlzdC5zZXRPcHRpb25zKFsnRXhpYScsICdEeW5hbWVzJywgJ0t5cmlvcycsICdWaXJ0dWUnXSlcbiAgICAgKiBvcHRpb25MaXN0LnNlbGVjdChbJ0V4aWEnLCAnVmlydHVlJ10pXG4gICAgICpcbiAgICAgKiBvcHRpb25MaXN0LmFkZFRvUGFnZShwYWdlLCB7XG4gICAgICogICB4OiA1MCxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgd2lkdGg6IDIwMCxcbiAgICAgKiAgIGhlaWdodDogMTAwLFxuICAgICAqICAgdGV4dENvbG9yOiByZ2IoMSwgMCwgMCksXG4gICAgICogICBiYWNrZ3JvdW5kQ29sb3I6IHJnYigwLCAxLCAwKSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiByZ2IoMCwgMCwgMSksXG4gICAgICogICBib3JkZXJXaWR0aDogMixcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcyg5MCksXG4gICAgICogICBmb250OiB1YnVudHVGb250LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB3aWRnZXQgZm9yIHRoaXMgb3B0aW9uIGxpc3QgZmllbGQuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gd2hpY2ggdGhpcyBvcHRpb24gbGlzdCB3aWRnZXQgc2hvdWxkIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhpcyBvcHRpb24gbGlzdCB3aWRnZXQuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuYWRkVG9QYWdlID0gZnVuY3Rpb24gKHBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIGlmICghKCd0ZXh0Q29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy50ZXh0Q29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdiYWNrZ3JvdW5kQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgPSByZ2IoMSwgMSwgMSk7XG4gICAgICAgIGlmICghKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYm9yZGVyV2lkdGgnIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDE7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyBvcHRpb24gbGlzdFxuICAgICAgICB2YXIgd2lkZ2V0ID0gdGhpcy5jcmVhdGVXaWRnZXQoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwLFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwLFxuICAgICAgICAgICAgd2lkdGg6IChfYyA9IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDIwMCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDEwMCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9lID0gb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9mID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBoaWRkZW46IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5hZGRXaWRnZXQod2lkZ2V0UmVmKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHZhciBmb250ID0gKF9nID0gb3B0aW9ucy5mb250KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB0aGlzLmRvYy5nZXRGb3JtKCkuZ2V0RGVmYXVsdEZvbnQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIGdpdmVuIHBhZ2VcbiAgICAgICAgcGFnZS5ub2RlLmFkZEFubm90KHdpZGdldFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG9wdGlvbiBsaXN0IGhhcyBiZWVuIG1hcmtlZCBhcyBkaXJ0eSwgb3IgaWYgYW55IG9mXG4gICAgICogdGhpcyBvcHRpb24gbGlzdCdzIHdpZGdldHMgZG8gbm90IGhhdmUgYW4gYXBwZWFyYW5jZSBzdHJlYW0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBpZiAob3B0aW9uTGlzdC5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIGNvbnNvbGUubG9nKCdOZWVkcyB1cGRhdGUnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgb3B0aW9uIGxpc3QgbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5pc0RpcnR5KCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIGhhc0FwcGVhcmFuY2VzID0gKChfYSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsKSBpbnN0YW5jZW9mIFBERlN0cmVhbTtcbiAgICAgICAgICAgIGlmICghaGFzQXBwZWFyYW5jZXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBvcHRpb24gbGlzdCdzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBvcHRpb24gbGlzdHMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoZm9udCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIG9wdGlvbiBsaXN0J3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBnaXZlbiBhcHBlYXJhbmNlIHByb3ZpZGVyLiBJZiBubyBgcHJvdmlkZXJgIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHRcbiAgICAgKiBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBvcHRpb24gbGlzdHMgd2lsbCBiZSB1c2VkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LnVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSwgKGZpZWxkLCB3aWRnZXQsIGZvbnQpID0+IHtcbiAgICAgKiAgIC4uLlxuICAgICAqICAgcmV0dXJuIGRyYXdPcHRpb25MaXN0KC4uLilcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIE9wdGlvbmFsbHksIHRoZSBhcHBlYXJhbmNlIHByb3ZpZGVyIHRvIGJlIHVzZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUudXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQocHJvdmlkZXIsICdwcm92aWRlcicsIFtGdW5jdGlvbl0pO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250LCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNDbGVhbigpO1xuICAgIH07XG4gICAgLy8gZ2V0T3B0aW9uKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge31cbiAgICAvLyBnZXRTZWxlY3RlZEluZGljZXMoKTogbnVtYmVyW10ge31cbiAgICAvLyByZW1vdmVPcHRpb25zKG9wdGlvbjogc3RyaW5nIHwgc3RyaW5nW10pIHt9XG4gICAgLy8gcmVtb3ZlSW5kaWNlcyhvcHRpb246IG51bWJlcltdKSB7fVxuICAgIC8vIGRlc2VsZWN0KG9wdGlvbnM6IHN0cmluZyB8IHN0cmluZ1tdKSB7fVxuICAgIC8vIGRlc2VsZWN0SW5kaWNlcyhvcHRpb25JbmRpY2VzOiBudW1iZXJbXSkge31cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIGFwUHJvdmlkZXIgPSBwcm92aWRlciAhPT0gbnVsbCAmJiBwcm92aWRlciAhPT0gdm9pZCAwID8gcHJvdmlkZXIgOiBkZWZhdWx0T3B0aW9uTGlzdEFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCwgZm9udCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VXaXRoRm9udCh3aWRnZXQsIGZvbnQsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldE9wdGlvbkxpc3RdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlXG4gICAgICogPiBhbiBpbnN0YW5jZSBvZiBbW1BERk9wdGlvbkxpc3RdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGT3B0aW9uTGlzdF1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb0xpc3RCb3ggYW5kXG4gICAgICogcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb0NvbWJvQm94IFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvTGlzdEJveGAgZm9yIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGlzIG9wdGlvbiBsaXN0IHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3Qub2YgPSBmdW5jdGlvbiAoYWNyb0xpc3RCb3gsIHJlZiwgZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGT3B0aW9uTGlzdChhY3JvTGlzdEJveCwgcmVmLCBkb2MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9wdGlvbkxpc3Q7XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPcHRpb25MaXN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT3B0aW9uTGlzdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuLi9QREZQYWdlXCI7XG5pbXBvcnQgUERGRmllbGQsIHsgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucywgfSBmcm9tIFwiLi9QREZGaWVsZFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQXBwZWFyYW5jZSwgZGVmYXVsdFJhZGlvR3JvdXBBcHBlYXJhbmNlUHJvdmlkZXIsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBQREZOYW1lLCBQREZIZXhTdHJpbmcsIFBERkRpY3QsIFBERkFjcm9SYWRpb0J1dHRvbiwgQWNyb0J1dHRvbkZsYWdzLCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0T3JVbmRlZmluZWQsIGFzc2VydElzT25lT2YgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIHJhZGlvIGdyb3VwIGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZSYWRpb0dyb3VwXV0gZmllbGRzIGFyZSBjb2xsZWN0aW9ucyBvZiByYWRpbyBidXR0b25zLiBUaGUgcHVycG9zZSBvZiBhXG4gKiByYWRpbyBncm91cCBpcyB0byBlbmFibGUgdXNlcnMgdG8gc2VsZWN0IG9uZSBvcHRpb24gZnJvbSBhIHNldCBvZiBtdXR1YWxseVxuICogZXhjbHVzaXZlIGNob2ljZXMuIEVhY2ggY2hvaWNlIGluIGEgcmFkaW8gZ3JvdXAgaXMgcmVwcmVzZW50ZWQgYnkgYSByYWRpb1xuICogYnV0dG9uLiBSYWRpbyBidXR0b25zIGVhY2ggaGF2ZSB0d28gc3RhdGVzOiBgb25gIGFuZCBgb2ZmYC4gQXQgbW9zdCBvbmVcbiAqIHJhZGlvIGJ1dHRvbiBpbiBhIGdyb3VwIG1heSBiZSBpbiB0aGUgYG9uYCBzdGF0ZSBhdCBhbnkgdGltZS4gVXNlcnMgY2FuXG4gKiBjbGljayBvbiBhIHJhZGlvIGJ1dHRvbiB0byBzZWxlY3QgaXQgKGFuZCB0aGVyZWJ5IGF1dG9tYXRpY2FsbHkgZGVzZWxlY3QgYW55XG4gKiBvdGhlciByYWRpbyBidXR0b24gdGhhdCBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBzZWxlY3RlZCkuIFNvbWUgcmFkaW9cbiAqIGdyb3VwcyBhbGxvdyB1c2VycyB0byB0b2dnbGUgYSBzZWxlY3RlZCByYWRpbyBidXR0b24gYG9mZmAgYnkgY2xpY2tpbmcgb25cbiAqIGl0IChzZWUgW1tQREZSYWRpb0dyb3VwLmlzT2ZmVG9nZ2xlYWJsZV1dKS5cbiAqXG4gKiBOb3RlIHRoYXQgc29tZSByYWRpbyBncm91cHMgYWxsb3cgbXVsdGlwbGUgcmFkaW8gYnV0dG9ucyB0byBiZSBpbiB0aGUgYG9uYFxuICogc3RhdGUgYXQgdGhlIHNhbWUgdHlwZSAqKmlmKiogdGhleSByZXByZXNlbnQgdGhlIHNhbWUgdW5kZXJseWluZyB2YWx1ZSAoc2VlXG4gKiBbW1BERlJhZGlvR3JvdXAuaXNNdXR1YWxseUV4Y2x1c2l2ZV1dKS5cbiAqL1xudmFyIFBERlJhZGlvR3JvdXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlJhZGlvR3JvdXAsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUmFkaW9Hcm91cChhY3JvUmFkaW9CdXR0b24sIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9SYWRpb0J1dHRvbiwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9SYWRpb0J1dHRvbiwgJ2Fjcm9SYWRpb0J1dHRvbicsIFtcbiAgICAgICAgICAgIFtQREZBY3JvUmFkaW9CdXR0b24sICdQREZBY3JvUmFkaW9CdXR0b24nXSxcbiAgICAgICAgXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9SYWRpb0J1dHRvbjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMgZm9yIHRoaXMgcmFkaW8gZ3JvdXAuIEVhY2ggb3B0aW9uIGlzXG4gICAgICogcmVwcmVzZW50ZWQgYnkgYSByYWRpbyBidXR0b24uIFRoZXNlIHJhZGlvIGJ1dHRvbnMgYXJlIGRpc3BsYXllZCBhdFxuICAgICAqIHZhcmlvdXMgbG9jYXRpb25zIGluIHRoZSBkb2N1bWVudCwgcG90ZW50aWFsbHkgb24gZGlmZmVyZW50IHBhZ2VzICh0aG91Z2hcbiAgICAgKiB0eXBpY2FsbHkgdGhleSBhcmUgc3RhY2tlZCBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseSBvbiB0aGUgc2FtZSBwYWdlKS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IHJhZGlvR3JvdXAuZ2V0T3B0aW9ucygpXG4gICAgICogY29uc29sZS5sb2coJ1JhZGlvIEdyb3VwIG9wdGlvbnM6Jywgb3B0aW9ucylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW9ucyBmb3IgdGhpcyByYWRpbyBncm91cC5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZXhwb3J0VmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0RXhwb3J0VmFsdWVzKCk7XG4gICAgICAgIGlmIChleHBvcnRWYWx1ZXMpIHtcbiAgICAgICAgICAgIHZhciBleHBvcnRPcHRpb25zID0gbmV3IEFycmF5KGV4cG9ydFZhbHVlcy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZXhwb3J0VmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIGV4cG9ydE9wdGlvbnNbaWR4XSA9IGV4cG9ydFZhbHVlc1tpZHhdLmRlY29kZVRleHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleHBvcnRPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvblZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9uVmFsdWVzKCk7XG4gICAgICAgIHZhciBvbk9wdGlvbnMgPSBuZXcgQXJyYXkob25WYWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb25PcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgb25PcHRpb25zW2lkeF0gPSBvblZhbHVlc1tpZHhdLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb25PcHRpb25zO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZWxlY3RlZCBvcHRpb24gZm9yIHRoaXMgcmFkaW8gZ3JvdXAuIFRoZSBzZWxlY3RlZCBvcHRpb24gaXNcbiAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgcmFkaW8gYnV0dG9uIGluIHRoaXMgZ3JvdXAgdGhhdCBpcyB0dXJuZWQgb24uIEF0IG1vc3RcbiAgICAgKiBvbmUgcmFkaW8gYnV0dG9uIGluIGEgZ3JvdXAgY2FuIGJlIHNlbGVjdGVkLiBJZiBubyBidXR0b25zIGluIHRoaXMgZ3JvdXBcbiAgICAgKiBhcmUgc2VsZWN0ZWQsIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiBjb25zdCBzZWxlY3RlZCA9IHJhZGlvR3JvdXAuZ2V0U2VsZWN0ZWQoKVxuICAgICAqIGNvbnNvbGUubG9nKCdTZWxlY3RlZCByYWRpbyBidXR0b246Jywgc2VsZWN0ZWQpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIHNlbGVjdGVkIG9wdGlvbiBmb3IgdGhpcyByYWRpbyBncm91cC5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5nZXRTZWxlY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5hY3JvRmllbGQuZ2V0VmFsdWUoKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBQREZOYW1lLm9mKCdPZmYnKSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBleHBvcnRWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRFeHBvcnRWYWx1ZXMoKTtcbiAgICAgICAgaWYgKGV4cG9ydFZhbHVlcykge1xuICAgICAgICAgICAgdmFyIG9uVmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0T25WYWx1ZXMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9uVmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIGlmIChvblZhbHVlc1tpZHhdID09PSB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydFZhbHVlc1tpZHhdLmRlY29kZVRleHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLy8gLy8gVE9ETzogRmlndXJlIG91dCB3aHkgdGhpcyBzZWVtcyB0byBjcmFzaCBBY3JvYmF0LiBNYXliZSBpdCdzIGJlY2F1c2Ugd2VcbiAgICAvLyAvLyAgICAgICBhcmVuJ3QgcmVtb3ZpbmcgdGhlIHdpZGdldCByZWZlcmVuY2UgZnJvbSB0aGUgcGFnZSdzIEFubm90cz9cbiAgICAvLyByZW1vdmVPcHRpb24ob3B0aW9uOiBzdHJpbmcpIHtcbiAgICAvLyAgIGFzc2VydElzKG9wdGlvbiwgJ29wdGlvbicsIFsnc3RyaW5nJ10pO1xuICAgIC8vICAgLy8gVE9ETzogQXNzZXJ0IGlzIHZhbGlkIGBvcHRpb25gIVxuICAgIC8vICAgY29uc3Qgb25WYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPblZhbHVlcygpO1xuICAgIC8vICAgY29uc3QgZXhwb3J0VmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0RXhwb3J0VmFsdWVzKCk7XG4gICAgLy8gICBpZiAoZXhwb3J0VmFsdWVzKSB7XG4gICAgLy8gICAgIGZvciAobGV0IGlkeCA9IDAsIGxlbiA9IGV4cG9ydFZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAvLyAgICAgICBpZiAoZXhwb3J0VmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpID09PSBvcHRpb24pIHtcbiAgICAvLyAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZVdpZGdldChpZHgpO1xuICAgIC8vICAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlRXhwb3J0VmFsdWUoaWR4KTtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIGZvciAobGV0IGlkeCA9IDAsIGxlbiA9IG9uVmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgIC8vICAgICAgIGNvbnN0IHZhbHVlID0gb25WYWx1ZXNbaWR4XTtcbiAgICAvLyAgICAgICBpZiAodmFsdWUuZGVjb2RlVGV4dCgpID09PSBvcHRpb24pIHtcbiAgICAvLyAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZVdpZGdldChpZHgpO1xuICAgIC8vICAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlRXhwb3J0VmFsdWUoaWR4KTtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gICAgLyoqXG4gICAgICogU2VsZWN0IGFuIG9wdGlvbiBmb3IgdGhpcyByYWRpbyBncm91cC4gVGhpcyBvcGVyYXRpb24gaXMgYW5hbG9nb3VzIHRvIGFcbiAgICAgKiBodW1hbiB1c2VyIGNsaWNraW5nIG9uZSBvZiB0aGUgcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIHZpYSBhIFBERlxuICAgICAqIHJlYWRlciB0byB0b2dnbGUgaXQgb24uIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHN0YXRlIG9mXG4gICAgICogdGhlIHJhZGlvIGdyb3VwIHRvIGluZGljYXRlIHdoaWNoIG9wdGlvbiBoYXMgYmVlbiBzZWxlY3RlZC4gUERGIGxpYnJhcmllc1xuICAgICAqIGFuZCByZWFkZXJzIHdpbGwgYmUgYWJsZSB0byBleHRyYWN0IHRoaXMgdmFsdWUgZnJvbSB0aGUgc2F2ZWQgZG9jdW1lbnQgYW5kXG4gICAgICogZGV0ZXJtaW5lIHdoaWNoIG9wdGlvbiB3YXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ2Jlc3Quc3VwZXJoZXJvLnJhZGlvR3JvdXAnKVxuICAgICAqIHJhZGlvR3JvdXAuc2VsZWN0KCdPbmUgUHVuY2ggTWFuJylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHJhZGlvIGdyb3VwIGFzIGRpcnR5LCBjYXVzaW5nIGl0cyBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB0byBiZSB1cGRhdGVkIHdoZW4gZWl0aGVyIFtbUERGRG9jdW1lbnQuc2F2ZV1dIG9yXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBpcyBjYWxsZWQuIFRoZSB1cGRhdGVkIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHdpbGwgZGlzcGxheSBhIGRvdCBpbnNpZGUgdGhlIHdpZGdldCBvZiB0aGlzIGNoZWNrIGJveCBmaWVsZFxuICAgICAqIHRoYXQgcmVwcmVzZW50cyB0aGUgc2VsZWN0ZWQgb3B0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbiBUaGUgb3B0aW9uIHRvIGJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9uLCAnb3B0aW9uJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciB2YWxpZE9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZihvcHRpb24sICdvcHRpb24nLCB2YWxpZE9wdGlvbnMpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHZhciBvblZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9uVmFsdWVzKCk7XG4gICAgICAgIHZhciBleHBvcnRWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRFeHBvcnRWYWx1ZXMoKTtcbiAgICAgICAgaWYgKGV4cG9ydFZhbHVlcykge1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZXhwb3J0VmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIGlmIChleHBvcnRWYWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCkgPT09IG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZShvblZhbHVlc1tpZHhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvblZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBvblZhbHVlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5kZWNvZGVUZXh0KCkgPT09IG9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhciBhbnkgc2VsZWN0ZWQgb3B0aW9uIGZvciB0aGlzIGRyb3Bkb3duLiBUaGlzIHdpbGwgcmVzdWx0IGluIGFsbFxuICAgICAqIHJhZGlvIGJ1dHRvbnMgaW4gdGhpcyBncm91cCBiZWluZyB0b2dnbGVkIG9mZi4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGVcbiAgICAgKiB0aGUgdW5kZXJseWluZyBzdGF0ZSBvZiB0aGUgZHJvcGRvd24gdG8gaW5kaWNhdGUgdGhhdCBubyByYWRpbyBidXR0b25zXG4gICAgICogaGF2ZSBiZWVuIHNlbGVjdGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiByYWRpb0dyb3VwLmNsZWFyKClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyByYWRpbyBncm91cCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZSYWRpb0dyb3VwLnNlbGVjdF1dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlKFBERk5hbWUub2YoJ09mZicpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHVzZXJzIGNhbiBjbGljayBvbiByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgdG8gdG9nZ2xlXG4gICAgICogdGhlbSBvZmYuIFRoZSBhbHRlcm5hdGl2ZSBpcyB0aGF0IG9uY2UgYSB1c2VyIGNsaWNrcyBvbiBhIHJhZGlvIGJ1dHRvblxuICAgICAqIHRvIHNlbGVjdCBpdCwgdGhlIG9ubHkgd2F5IHRvIGRlc2VsZWN0IGl0IGlzIGJ5IHNlbGVjdGluZyBvbiBhbm90aGVyIHJhZGlvXG4gICAgICogYnV0dG9uIGluIHRoZSBncm91cC4gU2VlIFtbUERGUmFkaW9Hcm91cC5lbmFibGVPZmZUb2dnbGluZ11dIGFuZFxuICAgICAqIFtbUERGUmFkaW9Hcm91cC5kaXNhYmxlT2ZmVG9nZ2xpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIGlmIChyYWRpb0dyb3VwLmlzT2ZmVG9nZ2xlYWJsZSgpKSBjb25zb2xlLmxvZygnT2ZmIHRvZ2dsaW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmlzT2ZmVG9nZ2xlYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9CdXR0b25GbGFncy5Ob1RvZ2dsZVRvT2ZmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IHVzZXJzIHRvIGNsaWNrIG9uIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbnMgaW4gdGhpcyBncm91cCB0byB0b2dnbGVcbiAgICAgKiB0aGVtIG9mZi4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuZW5hYmxlT2ZmVG9nZ2xpbmcoKVxuICAgICAqIGBgYFxuICAgICAqID4gKipOT1RFOioqIFRoaXMgZmVhdHVyZSBpcyBkb2N1bWVudGVkIGluIHRoZSBQREYgc3BlY2lmaWNhdGlvblxuICAgICAqID4gKFRhYmxlIDIyNikuIEhvd2V2ZXIsIG1vc3QgUERGIHJlYWRlcnMgZG8gbm90IHJlc3BlY3QgdGhpcyBvcHRpb24gYW5kXG4gICAgICogPiBwcmV2ZW50IHVzZXJzIGZyb20gdG9nZ2xpbmcgcmFkaW8gYnV0dG9ucyBvZmYgZXZlbiB3aGVuIGl0IGlzIGVuYWJsZWQuXG4gICAgICogPiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcgKDkvNi8yMDIwKSBNYWMncyBQcmV2aWV3IHNvZnR3YXJlIGRpZFxuICAgICAqID4gcmVzcGVjdCB0aGUgb3B0aW9uLiBBZG9iZSBBY3JvYmF0LCBGb3hpdCBSZWFkZXIsIGFuZCBHb29nbGUgQ2hyb21lIGRpZFxuICAgICAqID4gbm90LlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmVuYWJsZU9mZlRvZ2dsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0J1dHRvbkZsYWdzLk5vVG9nZ2xlVG9PZmYsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByZXZlbnQgdXNlcnMgZnJvbSBjbGlja2luZyBvbiBzZWxlY3RlZCByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgdG9cbiAgICAgKiB0b2dnbGUgdGhlbSBvZmYuIENsaWNraW5nIG9uIGEgc2VsZWN0ZWQgcmFkaW8gYnV0dG9uIHdpbGwgaGF2ZSBubyBlZmZlY3QuXG4gICAgICogVGhlIG9ubHkgd2F5IHRvIGRlc2VsZWN0IGEgc2VsZWN0ZWQgcmFkaW8gYnV0dG9uIGlzIHRvIGNsaWNrIG9uIGFcbiAgICAgKiBkaWZmZXJlbnQgcmFkaW8gYnV0dG9uIGluIHRoZSBncm91cC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuZGlzYWJsZU9mZlRvZ2dsaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5kaXNhYmxlT2ZmVG9nZ2xpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQnV0dG9uRmxhZ3MuTm9Ub2dnbGVUb09mZiwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuXG4gICAgICogVGhpcyBtZWFucyB0aGF0IHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIHJhZGlvIGJ1dHRvbiwgb25seSB0aGF0IHNwZWNpZmljXG4gICAgICogYnV0dG9uIHdpbGwgYmUgdHVybmVkIG9uLiBFdmVuIGlmIG90aGVyIHJhZGlvIGJ1dHRvbnMgaW4gdGhlIGdyb3VwXG4gICAgICogcmVwcmVzZW50IHRoZSBzYW1lIHZhbHVlLCB0aGV5IHdpbGwgbm90IGJlIGVuYWJsZWQuIFRoZSBhbHRlcm5hdGl2ZSB0b1xuICAgICAqIHRoaXMgaXMgdGhhdCBjbGlja2luZyBhIHJhZGlvIGJ1dHRvbiB3aWxsIHNlbGVjdCB0aGF0IGJ1dHRvbiBhbG9uZyB3aXRoXG4gICAgICogYW55IG90aGVyIHJhZGlvIGJ1dHRvbnMgaW4gdGhlIGdyb3VwIHRoYXQgc2hhcmUgdGhlIHNhbWUgdmFsdWUuIFNlZVxuICAgICAqIFtbUERGUmFkaW9Hcm91cC5lbmFibGVNdXR1YWxFeGNsdXNpb25dXSBhbmRcbiAgICAgKiBbW1BERlJhZGlvR3JvdXAuZGlzYWJsZU11dHVhbEV4Y2x1c2lvbl1dLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiBpZiAocmFkaW9Hcm91cC5pc011dHVhbGx5RXhjbHVzaXZlKCkpIGNvbnNvbGUubG9nKCdNdXR1YWwgZXhjbHVzaW9uIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmlzTXV0dWFsbHlFeGNsdXNpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQnV0dG9uRmxhZ3MuUmFkaW9zSW5Vbmlzb24pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgdXNlciBjbGlja3MgYSByYWRpbyBidXR0b24gaW4gdGhpcyBncm91cCBpdCB3aWxsIGJlIHNlbGVjdGVkLiBJblxuICAgICAqIGFkZGl0aW9uLCBhbnkgb3RoZXIgcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIHRoYXQgc2hhcmUgdGhlIHNhbWVcbiAgICAgKiB1bmRlcmx5aW5nIHZhbHVlIHdpbGwgYWxzbyBiZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuZW5hYmxlTXV0dWFsRXhjbHVzaW9uKClcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gbXVzdCBiZSBlbmFibGVkIHByaW9yIHRvIGFkZGluZyBvcHRpb25zIHRvIHRoZVxuICAgICAqIHJhZGlvIGdyb3VwLiBJdCBkb2VzIG5vdCBjdXJyZW50bHkgYXBwbHkgcmV0cm9hY3RpdmVseSB0byBleGlzdGluZ1xuICAgICAqIHJhZGlvIGJ1dHRvbnMgaW4gdGhlIGdyb3VwLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmVuYWJsZU11dHVhbEV4Y2x1c2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9CdXR0b25GbGFncy5SYWRpb3NJblVuaXNvbiwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgdXNlciBjbGlja3MgYSByYWRpbyBidXR0b24gaW4gdGhpcyBncm91cCBvbmx5IGl0IHdpbGwgYmUgc2VsZWN0ZWQuXG4gICAgICogTm8gb3RoZXIgcmFkaW8gYnV0dG9ucyBpbiB0aGUgZ3JvdXAgd2lsbCBiZSBzZWxlY3RlZCwgZXZlbiBpZiB0aGV5IHNoYXJlXG4gICAgICogdGhlIHNhbWUgdW5kZXJseWluZyB2YWx1ZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuZGlzYWJsZU11dHVhbEV4Y2x1c2lvbigpXG4gICAgICogYGBgXG4gICAgICogTm90ZSB0aGF0IHRoaXMgb3B0aW9uIG11c3QgYmUgZGlzYWJsZWQgcHJpb3IgdG8gYWRkaW5nIG9wdGlvbnMgdG8gdGhlXG4gICAgICogcmFkaW8gZ3JvdXAuIEl0IGRvZXMgbm90IGN1cnJlbnRseSBhcHBseSByZXRyb2FjdGl2ZWx5IHRvIGV4aXN0aW5nXG4gICAgICogcmFkaW8gYnV0dG9ucyBpbiB0aGUgZ3JvdXAuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuZGlzYWJsZU11dHVhbEV4Y2x1c2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9CdXR0b25GbGFncy5SYWRpb3NJblVuaXNvbiwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBuZXcgcmFkaW8gYnV0dG9uIHRvIHRoaXMgZ3JvdXAgb24gdGhlIHNwZWNpZmllZCBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmNyZWF0ZVJhZGlvR3JvdXAoJ2Jlc3QuZ3VuZGFtJylcbiAgICAgKlxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICogICB4OiA1MCxcbiAgICAgKiAgIHdpZHRoOiAyNSxcbiAgICAgKiAgIGhlaWdodDogMjUsXG4gICAgICogICB0ZXh0Q29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgIGJhY2tncm91bmRDb2xvcjogcmdiKDAsIDEsIDApLFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLCAwLCAxKSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDkwKSxcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiByYWRpb0dyb3VwLmFkZE9wdGlvblRvUGFnZSgnRXhpYScsIHBhZ2UsIHsgLi4ub3B0aW9ucywgeTogNTAgfSlcbiAgICAgKiByYWRpb0dyb3VwLmFkZE9wdGlvblRvUGFnZSgnRHluYW1lcycsIHBhZ2UsIHsgLi4ub3B0aW9ucywgeTogMTEwIH0pXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyByYWRpbyBidXR0b24gd2lkZ2V0IGZvciB0aGlzIHJhZGlvIGdyb3VwIGZpZWxkLlxuICAgICAqIEBwYXJhbSBvcHRpb24gVGhlIG9wdGlvbiB0aGF0IHRoZSByYWRpbyBidXR0b24gd2lkZ2V0IHJlcHJlc2VudHMuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gd2hpY2ggdGhlIHJhZGlvIGJ1dHRvbiB3aWRnZXQgc2hvdWxkIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhlIHJhZGlvIGJ1dHRvbiB3aWRnZXQuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuYWRkT3B0aW9uVG9QYWdlID0gZnVuY3Rpb24gKG9wdGlvbiwgcGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfajtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9uLCAnb3B0aW9uJywgWydzdHJpbmcnXSk7XG4gICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgW1tQREZQYWdlLCAnUERGUGFnZSddXSk7XG4gICAgICAgIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyByYWRpbyBidXR0b25cbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0KHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwLFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDAsXG4gICAgICAgICAgICB3aWR0aDogKF9jID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiA1MCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogNTAsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IChfZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50ZXh0Q29sb3IpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHJnYigwLCAwLCAwKSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogKF9mID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcikgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogcmdiKDEsIDEsIDEpLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IChfZyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJDb2xvcikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogcmdiKDAsIDAsIDApLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfaCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogMSxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9qID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGhpZGRlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhpZGRlbixcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UucmVmLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIod2lkZ2V0LmRpY3QpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoaXMgZmllbGRcbiAgICAgICAgdmFyIGFwU3RhdGVWYWx1ZSA9IHRoaXMuYWNyb0ZpZWxkLmFkZFdpZGdldFdpdGhPcHQod2lkZ2V0UmVmLCBQREZIZXhTdHJpbmcuZnJvbVRleHQob3B0aW9uKSwgIXRoaXMuaXNNdXR1YWxseUV4Y2x1c2l2ZSgpKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHdpZGdldC5zZXRBcHBlYXJhbmNlU3RhdGUoUERGTmFtZS5vZignT2ZmJykpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBhcFN0YXRlVmFsdWUpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoZSBnaXZlbiBwYWdlXG4gICAgICAgIHBhZ2Uubm9kZS5hZGRBbm5vdCh3aWRnZXRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYW55IG9mIHRoaXMgZ3JvdXAncyByYWRpbyBidXR0b24gd2lkZ2V0cyBkbyBub3QgaGF2ZSBhblxuICAgICAqIGFwcGVhcmFuY2Ugc3RyZWFtIGZvciB0aGVpciBjdXJyZW50IHN0YXRlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogaWYgKHJhZGlvR3JvdXAubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSBjb25zb2xlLmxvZygnTmVlZHMgdXBkYXRlJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIHJhZGlvIGdyb3VwIG5lZWRzIGFuIGFwcGVhcmFuY2UgdXBkYXRlLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VTdGF0ZSgpO1xuICAgICAgICAgICAgdmFyIG5vcm1hbCA9IChfYSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsO1xuICAgICAgICAgICAgaWYgKCEobm9ybWFsIGluc3RhbmNlb2YgUERGRGljdCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoc3RhdGUgJiYgIW5vcm1hbC5oYXMoc3RhdGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgZ3JvdXAncyByYWRpbyBidXR0b24gd2lkZ2V0c1xuICAgICAqIHVzaW5nIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIHJhZGlvIGdyb3Vwcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoKTtcbiAgICB9O1xuICAgIC8vIHJnLnVwZGF0ZUFwcGVhcmFuY2VzKChmaWVsZDogYW55LCB3aWRnZXQ6IGFueSkgPT4ge1xuICAgIC8vICAgYXNzZXJ0KGZpZWxkID09PSByZyk7XG4gICAgLy8gICBhc3NlcnQod2lkZ2V0IGluc3RhbmNlb2YgUERGV2lkZ2V0QW5ub3RhdGlvbik7XG4gICAgLy8gICByZXR1cm4geyBvbjogWy4uLnJlY3RhbmdsZSwgLi4uY2lyY2xlXSwgb2ZmOiBbLi4ucmVjdGFuZ2xlLCAuLi5jaXJjbGVdIH07XG4gICAgLy8gfSk7XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBncm91cCdzIHJhZGlvIGJ1dHRvbiB3aWRnZXRzXG4gICAgICogdXNpbmcgdGhlIGdpdmVuIGFwcGVhcmFuY2UgcHJvdmlkZXIuIElmIG5vIGBwcm92aWRlcmAgaXMgcGFzc2VkLCB0aGVcbiAgICAgKiBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIHJhZGlvIGdyb3VwcyB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiByYWRpb0dyb3VwLnVwZGF0ZUFwcGVhcmFuY2VzKChmaWVsZCwgd2lkZ2V0KSA9PiB7XG4gICAgICogICAuLi5cbiAgICAgKiAgIHJldHVybiB7XG4gICAgICogICAgIG5vcm1hbDogeyBvbjogZHJhd1JhZGlvQnV0dG9uKC4uLiksIG9mZjogZHJhd1JhZGlvQnV0dG9uKC4uLikgfSxcbiAgICAgKiAgICAgZG93bjogeyBvbjogZHJhd1JhZGlvQnV0dG9uKC4uLiksIG9mZjogZHJhd1JhZGlvQnV0dG9uKC4uLikgfSxcbiAgICAgKiAgIH1cbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBwcm92aWRlciBPcHRpb25hbGx5LCB0aGUgYXBwZWFyYW5jZSBwcm92aWRlciB0byBiZSB1c2VkIGZvclxuICAgICAqICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLnVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHByb3ZpZGVyLCAncHJvdmlkZXInLCBbRnVuY3Rpb25dKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIG9uVmFsdWUgPSB3aWRnZXQuZ2V0T25WYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKCFvblZhbHVlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgb25WYWx1ZSwgcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgb25WYWx1ZSwgcHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIGFwUHJvdmlkZXIgPSBwcm92aWRlciAhPT0gbnVsbCAmJiBwcm92aWRlciAhPT0gdm9pZCAwID8gcHJvdmlkZXIgOiBkZWZhdWx0UmFkaW9Hcm91cEFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZU9uT2ZmV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIG9uVmFsdWUsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldE9wdGlvbkxpc3RdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlIGFuXG4gICAgICogPiBpbnN0YW5jZSBvZiBbW1BERk9wdGlvbkxpc3RdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGT3B0aW9uTGlzdF1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb1JhZGlvQnV0dG9uXG4gICAgICogYW5kIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9SYWRpb0J1dHRvbiBUaGUgdW5kZXJseWluZyBgUERGQWNyb1JhZGlvQnV0dG9uYCBmb3IgdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW8gZ3JvdXAuXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyByYWRpbyBncm91cC5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGlzIHJhZGlvIGdyb3VwIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAub2YgPSBmdW5jdGlvbiAoYWNyb1JhZGlvQnV0dG9uLCByZWYsIGRvYykgeyByZXR1cm4gbmV3IFBERlJhZGlvR3JvdXAoYWNyb1JhZGlvQnV0dG9uLCByZWYsIGRvYyk7IH07XG4gICAgcmV0dXJuIFBERlJhZGlvR3JvdXA7XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZSYWRpb0dyb3VwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUmFkaW9Hcm91cC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZGaWVsZCBmcm9tIFwiLi9QREZGaWVsZFwiO1xuaW1wb3J0IHsgUERGQWNyb1NpZ25hdHVyZSB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2lnbmF0dXJlIGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZTaWduYXR1cmVdXSBmaWVsZHMgYXJlIGRpZ2l0YWwgc2lnbmF0dXJlcy4gYHBkZi1saWJgIGRvZXMgbm90XG4gKiBjdXJyZW50bHkgcHJvdmlkZSBhbnkgc3BlY2lhbGl6ZWQgQVBJcyBmb3IgY3JlYXRpbmcgZGlnaXRhbCBzaWduYXR1cmVzIG9yXG4gKiByZWFkaW5nIHRoZSBjb250ZW50cyBvZiBleGlzdGluZyBkaWdpdGFsIHNpZ25hdHVyZXMuXG4gKi9cbnZhciBQREZTaWduYXR1cmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlNpZ25hdHVyZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZTaWduYXR1cmUoYWNyb1NpZ25hdHVyZSwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb1NpZ25hdHVyZSwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9TaWduYXR1cmUsICdhY3JvU2lnbmF0dXJlJywgW1xuICAgICAgICAgICAgW1BERkFjcm9TaWduYXR1cmUsICdQREZBY3JvU2lnbmF0dXJlJ10sXG4gICAgICAgIF0pO1xuICAgICAgICBfdGhpcy5hY3JvRmllbGQgPSBhY3JvU2lnbmF0dXJlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlNpZ25hdHVyZS5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0U2lnbmF0dXJlXV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZTaWduYXR1cmVdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGU2lnbmF0dXJlXV0gZnJvbSBhbiBleGlzdGluZyBhY3JvU2lnbmF0dXJlIGFuZFxuICAgICAqIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9TaWduYXR1cmUgVGhlIHVuZGVybHlpbmcgYFBERkFjcm9TaWduYXR1cmVgIGZvciB0aGlzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGlzIHNpZ25hdHVyZSB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZTaWduYXR1cmUub2YgPSBmdW5jdGlvbiAoYWNyb1NpZ25hdHVyZSwgcmVmLCBkb2MpIHsgcmV0dXJuIG5ldyBQREZTaWduYXR1cmUoYWNyb1NpZ25hdHVyZSwgcmVmLCBkb2MpOyB9O1xuICAgIHJldHVybiBQREZTaWduYXR1cmU7XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZTaWduYXR1cmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZTaWduYXR1cmUuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGUGFnZSBmcm9tIFwiLi4vUERGUGFnZVwiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4uL1BERkZvbnRcIjtcbmltcG9ydCBQREZGaWVsZCwgeyBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zLCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyBub3JtYWxpemVBcHBlYXJhbmNlLCBkZWZhdWx0VGV4dEZpZWxkQXBwZWFyYW5jZVByb3ZpZGVyLCB9IGZyb20gXCIuL2FwcGVhcmFuY2VzXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgUmljaFRleHRGaWVsZFJlYWRFcnJvciwgRXhjZWVkZWRNYXhMZW5ndGhFcnJvciwgSW52YWxpZE1heExlbmd0aEVycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IEltYWdlQWxpZ25tZW50IH0gZnJvbSBcIi4uL2ltYWdlL2FsaWdubWVudFwiO1xuaW1wb3J0IHsgVGV4dEFsaWdubWVudCB9IGZyb20gXCIuLi90ZXh0L2FsaWdubWVudFwiO1xuaW1wb3J0IHsgUERGSGV4U3RyaW5nLCBQREZTdHJlYW0sIFBERkFjcm9UZXh0LCBBY3JvVGV4dEZsYWdzLCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0SXNPbmVPZiwgYXNzZXJ0T3JVbmRlZmluZWQsIGFzc2VydFBvc2l0aXZlLCBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkLCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgdGV4dCBmaWVsZCBvZiBhIFtbUERGRm9ybV1dLlxuICpcbiAqIFtbUERGVGV4dEZpZWxkXV0gZmllbGRzIGFyZSBib3hlcyB0aGF0IGRpc3BsYXkgdGV4dCBlbnRlcmVkIGJ5IHRoZSB1c2VyLiBUaGVcbiAqIHB1cnBvc2Ugb2YgYSB0ZXh0IGZpZWxkIGlzIHRvIGVuYWJsZSB1c2VycyB0byBlbnRlciB0ZXh0IG9yIHZpZXcgdGV4dCB2YWx1ZXNcbiAqIGluIHRoZSBkb2N1bWVudCBwcmVmaWxsZWQgYnkgc29mdHdhcmUuIFVzZXJzIGNhbiBjbGljayBvbiBhIHRleHQgZmllbGQgYW5kXG4gKiBpbnB1dCB0ZXh0IHZpYSB0aGVpciBrZXlib2FyZC4gU29tZSB0ZXh0IGZpZWxkcyBhbGxvdyBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0XG4gKiB0byBiZSBlbnRlcmVkIChzZWUgW1tQREZUZXh0RmllbGQuaXNNdWx0aWxpbmVdXSkuXG4gKi9cbnZhciBQREZUZXh0RmllbGQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlRleHRGaWVsZCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZUZXh0RmllbGQoYWNyb1RleHQsIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9UZXh0LCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb1RleHQsICdhY3JvVGV4dCcsIFtbUERGQWNyb1RleHQsICdQREZBY3JvVGV4dCddXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9UZXh0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGV4dCB0aGF0IHRoaXMgZmllbGQgY29udGFpbnMuIFRoaXMgdGV4dCBpcyB2aXNpYmxlIHRvIHVzZXJzIHdob1xuICAgICAqIHZpZXcgdGhpcyBmaWVsZCBpbiBhIFBERiByZWFkZXIuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGNvbnN0IHRleHQgPSB0ZXh0RmllbGQuZ2V0VGV4dCgpXG4gICAgICogY29uc29sZS5sb2coJ1RleHQgZmllbGQgY29udGVudHM6JywgdGV4dClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBpZiB0aGlzIHRleHQgZmllbGQgY29udGFpbnMgbm8gdW5kZXJseWluZyB2YWx1ZSwgYHVuZGVmaW5lZGBcbiAgICAgKiB3aWxsIGJlIHJldHVybmVkLiBUZXh0IGZpZWxkcyBtYXkgYWxzbyBjb250YWluIGFuIHVuZGVybHlpbmcgdmFsdWUgdGhhdFxuICAgICAqIGlzIHNpbXBseSBhbiBlbXB0eSBzdHJpbmcgKGAnJ2ApLiBUaGlzIGRldGFpbCBpcyBsYXJnZWx5IGlycmVsZXZhbnQgZm9yXG4gICAgICogbW9zdCBhcHBsaWNhdGlvbnMuIEluIGdlbmVyYWwsIHlvdSdsbCB3YW50IHRvIHRyZWF0IGJvdGggY2FzZXMgdGhlIHNhbWVcbiAgICAgKiB3YXkgYW5kIHNpbXBseSBjb25zaWRlciB0aGUgdGV4dCBmaWVsZCB0byBiZSBlbXB0eS4gSW4gZWl0aGVyIGNhc2UsIHRoZVxuICAgICAqIHRleHQgZmllbGQgd2lsbCBhcHBlYXIgZW1wdHkgdG8gdXNlcnMgd2hlbiB2aWV3ZWQgaW4gYSBQREYgcmVhZGVyLlxuICAgICAqXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgdGhpcyBpcyBhIHJpY2ggdGV4dCBmaWVsZC4gYHBkZi1saWJgIGRvZXMgbm90XG4gICAgICogc3VwcG9ydCByZWFkaW5nIHJpY2ggdGV4dCBmaWVsZHMuIE5vciBkbyBtb3N0IFBERiByZWFkZXJzIGFuZCB3cml0ZXJzLlxuICAgICAqIFJpY2ggdGV4dCBmaWVsZHMgYXJlIGJhc2VkIG9uIFhGQSAoWE1MIEZvcm1zIEFyY2hpdGVjdHVyZSkuIFJlbGF0aXZlbHkgZmV3XG4gICAgICogUERGcyB1c2UgcmljaCB0ZXh0IGZpZWxkcyBvciBYRkEuIFVubGlrZSBQREYgaXRzZWxmLCBYRkEgaXMgbm90IGFuIElTT1xuICAgICAqIHN0YW5kYXJkLiBYRkEgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBQREYgMi4wOlxuICAgICAqICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWEZBXG4gICAgICogKiBodHRwOi8vYmxvZy5wZGZzaGFyZWZvcm1zLmNvbS9wZGYtMi0wLXJlbGVhc2UtYmlkLWZhcmV3ZWxsLXhmYS1mb3Jtcy9cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB0ZXh0IGNvbnRhaW5lZCBpbiB0aGlzIHRleHQgZmllbGQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZSgpO1xuICAgICAgICBpZiAoIXZhbHVlICYmIHRoaXMuaXNSaWNoRm9ybWF0dGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSaWNoVGV4dEZpZWxkUmVhZEVycm9yKHRoaXMuZ2V0TmFtZSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZhbHVlLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgdGV4dCBmb3IgdGhpcyBmaWVsZC4gVGhpcyBvcGVyYXRpb24gaXMgYW5hbG9nb3VzIHRvIGEgaHVtYW4gdXNlclxuICAgICAqIGNsaWNraW5nIG9uIHRoZSB0ZXh0IGZpZWxkIGluIGEgUERGIHJlYWRlciBhbmQgdHlwaW5nIGluIHRleHQgdmlhIHRoZWlyXG4gICAgICoga2V5Ym9hcmQuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZSB0ZXh0IGZpZWxkXG4gICAgICogdG8gaW5kaWNhdGUgd2hhdCB0ZXh0IGhhcyBiZWVuIHNldC4gUERGIGxpYnJhcmllcyBhbmQgcmVhZGVycyB3aWxsIGJlIGFibGVcbiAgICAgKiB0byBleHRyYWN0IHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBzYXZlZCBkb2N1bWVudCBhbmQgZGV0ZXJtaW5lIHdoYXQgdGV4dFxuICAgICAqIHdhcyBzZXQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdiZXN0LnN1cGVyaGVyby50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuc2V0VGV4dCgnT25lIFB1bmNoIE1hbicpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LCBjYXVzaW5nIGl0cyBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB0byBiZSB1cGRhdGVkIHdoZW4gZWl0aGVyIFtbUERGRG9jdW1lbnQuc2F2ZV1dIG9yXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBpcyBjYWxsZWQuIFRoZSB1cGRhdGVkIHN0cmVhbXMgd2lsbFxuICAgICAqIGRpc3BsYXkgdGhlIHRleHQgdGhpcyBmaWVsZCBjb250YWlucyBpbnNpZGUgdGhlIHdpZGdldHMgb2YgdGhpcyB0ZXh0XG4gICAgICogZmllbGQuXG4gICAgICpcbiAgICAgKiAqKklNUE9SVEFOVDoqKiBUaGUgZGVmYXVsdCBmb250IHVzZWQgdG8gdXBkYXRlIGFwcGVhcmFuY2Ugc3RyZWFtcyBpc1xuICAgICAqIFtbU3RhbmRhcmRGb250cy5IZWx2ZXRpY2FdXS4gTm90ZSB0aGF0IHRoaXMgaXMgYSBXaW5BbnNpIGZvbnQuIFRoaXMgbWVhbnNcbiAgICAgKiB0aGF0IGVuY29kaW5nIGVycm9ycyB3aWxsIGJlIHRocm93biBpZiB0aGlzIGZpZWxkIGNvbnRhaW5zIHRleHQgb3V0c2lkZVxuICAgICAqIHRoZSBXaW5BbnNpIGNoYXJhY3RlciBzZXQgKHRoZSBsYXRpbiBhbHBoYWJldCkuXG4gICAgICpcbiAgICAgKiBFbWJlZGRpbmcgYSBjdXN0b20gZm9udCBhbmQgcGFzc2luZyBpdCB0b1xuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gb3IgW1tQREZUZXh0RmllbGQudXBkYXRlQXBwZWFyYW5jZXNdXVxuICAgICAqIGFsbG93cyB5b3UgdG8gZ2VuZXJhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIHdpdGggY2hhcmFjdGVycyBvdXRzaWRlIHRoZVxuICAgICAqIGxhdGluIGFscGhhYmV0IChhc3N1bWluZyB0aGUgY3VzdG9tIGZvbnQgc3VwcG9ydHMgdGhlbSkuXG4gICAgICpcbiAgICAgKiBJZiB0aGlzIGlzIGEgcmljaCB0ZXh0IGZpZWxkLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0YW5kYXJkIHRleHRcbiAgICAgKiBmaWVsZCBpbiBvcmRlciB0byBzZXQgdGhlIHRleHQuIGBwZGYtbGliYCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgcmljaFxuICAgICAqIHRleHQgc3RyaW5ncy4gTm9yIGRvIG1vc3QgUERGIHJlYWRlcnMgYW5kIHdyaXRlcnMuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLmdldFRleHRdXSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCByaWNoIHRleHQgZmllbGRzIGFuZFxuICAgICAqIHRoZWlyIGRlcHJlY2F0aW9uIGluIFBERiAyLjAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0aGlzIGZpZWxkIHNob3VsZCBjb250YWluLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuc2V0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHRleHQsICd0ZXh0JywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBtYXhMZW5ndGggPSB0aGlzLmdldE1heExlbmd0aCgpO1xuICAgICAgICBpZiAobWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgdGV4dCAmJiB0ZXh0Lmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3IodGV4dC5sZW5ndGgsIG1heExlbmd0aCwgdGhpcy5nZXROYW1lKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlUmljaEZvcm1hdHRpbmcoKTtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlKFBERkhleFN0cmluZy5mcm9tVGV4dCh0ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5yZW1vdmVWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFsaWdubWVudCBmb3IgdGhpcyB0ZXh0IGZpZWxkLiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlXG4gICAgICoganVzdGlmaWNhdGlvbiBvZiB0aGUgdGV4dCB3aGVuIGl0IGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBpbiBQREYgcmVhZGVycy5cbiAgICAgKiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgYWxpZ25tZW50czogbGVmdCwgY2VudGVyLCBhbmQgcmlnaHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogY29uc3QgYWxpZ25tZW50ID0gdGV4dEZpZWxkLmdldEFsaWdubWVudCgpXG4gICAgICogaWYgKGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5MZWZ0KSBjb25zb2xlLmxvZygnVGV4dCBpcyBsZWZ0IGp1c3RpZmllZCcpXG4gICAgICogaWYgKGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5DZW50ZXIpIGNvbnNvbGUubG9nKCdUZXh0IGlzIGNlbnRlcmVkJylcbiAgICAgKiBpZiAoYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LlJpZ2h0KSBjb25zb2xlLmxvZygnVGV4dCBpcyByaWdodCBqdXN0aWZpZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBhbGlnbm1lbnQgb2YgdGhpcyB0ZXh0IGZpZWxkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZ2V0QWxpZ25tZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcXVhZGRpbmcgPSB0aGlzLmFjcm9GaWVsZC5nZXRRdWFkZGluZygpO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgcmV0dXJuIChxdWFkZGluZyA9PT0gMCA/IFRleHRBbGlnbm1lbnQuTGVmdFxuICAgICAgICAgICAgOiBxdWFkZGluZyA9PT0gMSA/IFRleHRBbGlnbm1lbnQuQ2VudGVyXG4gICAgICAgICAgICAgICAgOiBxdWFkZGluZyA9PT0gMiA/IFRleHRBbGlnbm1lbnQuUmlnaHRcbiAgICAgICAgICAgICAgICAgICAgOiBUZXh0QWxpZ25tZW50LkxlZnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBhbGlnbm1lbnQgZm9yIHRoaXMgdGV4dCBmaWVsZC4gVGhpcyB3aWxsIGRldGVybWluZSB0aGVcbiAgICAgKiBqdXN0aWZpY2F0aW9uIG9mIHRoZSB0ZXh0IHdoZW4gaXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGluIFBERiByZWFkZXJzLlxuICAgICAqIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBhbGlnbm1lbnRzOiBsZWZ0LCBjZW50ZXIsIGFuZCByaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKlxuICAgICAqIC8vIFRleHQgd2lsbCBiZSBsZWZ0IGp1c3RpZmllZCB3aGVuIGRpc3BsYXllZFxuICAgICAqIHRleHRGaWVsZC5zZXRBbGlnbm1lbnQoVGV4dEFsaWdubWVudC5MZWZ0KVxuICAgICAqXG4gICAgICogLy8gVGV4dCB3aWxsIGJlIGNlbnRlcmVkIHdoZW4gZGlzcGxheWVkXG4gICAgICogdGV4dEZpZWxkLnNldEFsaWdubWVudChUZXh0QWxpZ25tZW50LkNlbnRlcilcbiAgICAgKlxuICAgICAqIC8vIFRleHQgd2lsbCBiZSByaWdodCBqdXN0aWZpZWQgd2hlbiBkaXNwbGF5ZWRcbiAgICAgKiB0ZXh0RmllbGQuc2V0QWxpZ25tZW50KFRleHRBbGlnbm1lbnQuUmlnaHQpXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgdGV4dCBmaWVsZCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqIEBwYXJhbSBhbGlnbm1lbnQgVGhlIGFsaWdubWVudCBmb3IgdGhpcyB0ZXh0IGZpZWxkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuc2V0QWxpZ25tZW50ID0gZnVuY3Rpb24gKGFsaWdubWVudCkge1xuICAgICAgICBhc3NlcnRJc09uZU9mKGFsaWdubWVudCwgJ2FsaWdubWVudCcsIFRleHRBbGlnbm1lbnQpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFF1YWRkaW5nKGFsaWdubWVudCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQuIFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgbWF4aW11bVxuICAgICAqIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHR5cGVkIGludG8gdGhpcyBmaWVsZCBieSB0aGUgdXNlci4gSWZcbiAgICAgKiB0aGlzIGZpZWxkIGRvZXMgbm90IGhhdmUgYSBtYXhpbXVtIGxlbmd0aCwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBjb25zdCBtYXhMZW5ndGggPSB0ZXh0RmllbGQuZ2V0TWF4TGVuZ3RoKClcbiAgICAgKiBpZiAobWF4TGVuZ3RoID09PSB1bmRlZmluZWQpIGNvbnNvbGUubG9nKCdObyBtYXggbGVuZ3RoJylcbiAgICAgKiBlbHNlIGNvbnNvbGUubG9nKGBNYXggbGVuZ3RoIGlzICR7bWF4TGVuZ3RofWApXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGlzIGZpZWxkLCBvclxuICAgICAqICAgICAgICAgIGB1bmRlZmluZWRgIGlmIG5vIGxpbWl0IGV4aXN0cy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmdldE1heExlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmdldE1heExlbmd0aCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkLiBUaGlzIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnNcbiAgICAgKiB0aGF0IGNhbiBiZSB0eXBlZCBpbnRvIHRoaXMgZmllbGQgYnkgdGhlIHVzZXIuIFRoaXMgYWxzbyBsaW1pdHMgdGhlIGxlbmd0aFxuICAgICAqIG9mIHRoZSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXS4gVGhpcyBsaW1pdFxuICAgICAqIGNhbiBiZSByZW1vdmVkIGJ5IHBhc3NpbmcgYHVuZGVmaW5lZGAgYXMgYG1heExlbmd0aGAuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICpcbiAgICAgKiAvLyBBbGxvdyBiZXR3ZWVuIDAgYW5kIDUgY2hhcmFjdGVycyB0byBiZSBlbnRlcmVkXG4gICAgICogdGV4dEZpZWxkLnNldE1heExlbmd0aCg1KVxuICAgICAqXG4gICAgICogLy8gQWxsb3cgYW55IG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIGVudGVyZWRcbiAgICAgKiB0ZXh0RmllbGQuc2V0TWF4TGVuZ3RoKHVuZGVmaW5lZClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICogQHBhcmFtIG1heExlbmd0aCBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbGxvd2VkIGluIHRoaXMgZmllbGQsIG9yXG4gICAgICogICAgICAgICAgICAgICAgICBgdW5kZWZpbmVkYCB0byByZW1vdmUgdGhlIGxpbWl0LlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuc2V0TWF4TGVuZ3RoID0gZnVuY3Rpb24gKG1heExlbmd0aCkge1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG1heExlbmd0aCwgJ21heExlbmd0aCcsIDAsIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICBpZiAobWF4TGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZU1heExlbmd0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRleHQgPSB0aGlzLmdldFRleHQoKTtcbiAgICAgICAgICAgIGlmICh0ZXh0ICYmIHRleHQubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRNYXhMZW5ndGhFcnJvcih0ZXh0Lmxlbmd0aCwgbWF4TGVuZ3RoLCB0aGlzLmdldE5hbWUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRNYXhMZW5ndGgobWF4TGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgdGhpcyB0ZXh0IGZpZWxkLiBUaGlzIGFsbG93cyBhbnkgbnVtYmVyIG9mXG4gICAgICogY2hhcmFjdGVycyB0byBiZSB0eXBlZCBpbnRvIHRoaXMgZmllbGQgYnkgdGhlIHVzZXIuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLnJlbW92ZU1heExlbmd0aCgpXG4gICAgICogYGBgXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmcgYHVuZGVmaW5lZGAgdG9cbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRNYXhMZW5ndGhdXS5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnJlbW92ZU1heExlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5yZW1vdmVNYXhMZW5ndGgoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc3BsYXkgYW4gaW1hZ2UgaW5zaWRlIHRoZSBib3VuZHMgb2YgdGhpcyB0ZXh0IGZpZWxkJ3Mgd2lkZ2V0cy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwbmdJbWFnZSA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZyguLi4pXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLnNldEltYWdlKHBuZ0ltYWdlKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGFwcGVhcmFuY2VzIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyB0ZXh0IGZpZWxkJ3Mgd2lkZ2V0cy5cbiAgICAgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnNldEltYWdlID0gZnVuY3Rpb24gKGltYWdlKSB7XG4gICAgICAgIHZhciBmaWVsZEFsaWdubWVudCA9IHRoaXMuZ2V0QWxpZ25tZW50KCk7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB2YXIgYWxpZ25tZW50ID0gZmllbGRBbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuQ2VudGVyID8gSW1hZ2VBbGlnbm1lbnQuQ2VudGVyXG4gICAgICAgICAgICA6IGZpZWxkQWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LlJpZ2h0ID8gSW1hZ2VBbGlnbm1lbnQuUmlnaHRcbiAgICAgICAgICAgICAgICA6IEltYWdlQWxpZ25tZW50LkxlZnQ7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdHJlYW1SZWYgPSB0aGlzLmNyZWF0ZUltYWdlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIGltYWdlLCBhbGlnbm1lbnQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlcyh3aWRnZXQsIHsgbm9ybWFsOiBzdHJlYW1SZWYgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNDbGVhbigpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmb250IHNpemUgZm9yIHRoaXMgZmllbGQuIExhcmdlciBmb250IHNpemVzIHdpbGwgcmVzdWx0IGluIGxhcmdlclxuICAgICAqIHRleHQgYmVpbmcgZGlzcGxheWVkIHdoZW4gUERGIHJlYWRlcnMgcmVuZGVyIHRoaXMgdGV4dCBmaWVsZC4gRm9udCBzaXplc1xuICAgICAqIG1heSBiZSBpbnRlZ2VyIG9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIFN1cHBseWluZyBhIG5lZ2F0aXZlIGZvbnQgc2l6ZVxuICAgICAqIHdpbGwgY2F1c2UgdGhpcyBtZXRob2QgdG8gdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5zZXRGb250U2l6ZSg0KVxuICAgICAqIHRleHRGaWVsZC5zZXRGb250U2l6ZSgxNS43KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPiBUaGlzIG1ldGhvZCBkZXBlbmRzIHVwb24gdGhlIGV4aXN0ZW5jZSBvZiBhIGRlZmF1bHQgYXBwZWFyYW5jZVxuICAgICAqID4gKGAvREFgKSBzdHJpbmcuIElmIHRoaXMgZmllbGQgZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgYXBwZWFyYW5jZSBzdHJpbmcsXG4gICAgICogPiBvciB0aGF0IHN0cmluZyBkb2VzIG5vdCBjb250YWluIGEgZm9udCBzaXplICh2aWEgdGhlIGBUZmAgb3BlcmF0b3IpLFxuICAgICAqID4gdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvbnRTaXplIFRoZSBmb250IHNpemUgdG8gYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0ZXh0IGluIHRoaXMgZmllbGQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICBhc3NlcnRQb3NpdGl2ZShmb250U2l6ZSwgJ2ZvbnRTaXplJyk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgZWFjaCBsaW5lIG9mIHRleHQgaXMgc2hvd24gb24gYSBuZXcgbGluZSB3aGVuIHRoaXNcbiAgICAgKiBmaWVsZCBpcyBkaXNwbGF5ZWQgaW4gYSBQREYgcmVhZGVyLiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhhdCBhbGwgbGluZXMgb2ZcbiAgICAgKiB0ZXh0IGFyZSBtZXJnZWQgb250byBhIHNpbmdsZSBsaW5lIHdoZW4gZGlzcGxheWVkLiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5lbmFibGVNdWx0aWxpbmVdXSBhbmQgW1tQREZUZXh0RmllbGQuZGlzYWJsZU11bHRpbGluZV1dLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogaWYgKHRleHRGaWVsZC5pc011bHRpbGluZSgpKSBjb25zb2xlLmxvZygnTXVsdGlsaW5lIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgYSBtdWx0aWxpbmUgdGV4dCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmlzTXVsdGlsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLk11bHRpbGluZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IGVhY2ggbGluZSBvZiB0ZXh0IG9uIGEgbmV3IGxpbmUgd2hlbiB0aGlzIGZpZWxkIGlzIGRpc3BsYXllZCBpbiBhXG4gICAgICogUERGIHJlYWRlci4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlTXVsdGlsaW5lKClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVNdWx0aWxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuTXVsdGlsaW5lLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc3BsYXkgZWFjaCBsaW5lIG9mIHRleHQgb24gdGhlIHNhbWUgbGluZSB3aGVuIHRoaXMgZmllbGQgaXMgZGlzcGxheWVkXG4gICAgICogaW4gYSBQREYgcmVhZGVyLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlTXVsdGlsaW5lKClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlTXVsdGlsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLk11bHRpbGluZSwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBpcyBhIHBhc3N3b3JkIHRleHQgZmllbGQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmllbGRcbiAgICAgKiBpcyBpbnRlbmRlZCBmb3Igc3RvcmluZyBhIHNlY3VyZSBwYXNzd29yZC4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuZW5hYmxlUGFzc3dvcmRdXSBhbmQgW1tQREZUZXh0RmllbGQuZGlzYWJsZVBhc3N3b3JkXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzUGFzc3dvcmQoKSkgY29uc29sZS5sb2coJ1Bhc3N3b3JkIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgYSBwYXNzd29yZCB0ZXh0IGZpZWxkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNQYXNzd29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb1RleHRGbGFncy5QYXNzd29yZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgdGV4dCBmaWVsZCBpcyBpbnRlbmRlZCBmb3Igc3RvcmluZyBhIHNlY3VyZSBwYXNzd29yZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5lbmFibGVQYXNzd29yZCgpXG4gICAgICogYGBgXG4gICAgICogVmFsdWVzIGVudGVyZWQgaW50byBwYXNzd29yZCB0ZXh0IGZpZWxkcyBzaG91bGQgbm90IGJlIGRpc3BsYXllZCBvbiB0aGVcbiAgICAgKiBzY3JlZW4gYnkgUERGIHJlYWRlcnMuIE1vc3QgUERGIHJlYWRlcnMgd2lsbCBkaXNwbGF5IHRoZSB2YWx1ZSBhc1xuICAgICAqIGFzdGVyaXNrcyBvciBidWxsZXRzLiBQREYgcmVhZGVycyBzaG91bGQgbmV2ZXIgc3RvcmUgdmFsdWVzIGVudGVyZWQgYnkgdGhlXG4gICAgICogdXNlciBpbnRvIHBhc3N3b3JkIHRleHQgZmllbGRzLiBTaW1pbGFybHksIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90XG4gICAgICogd3JpdGUgZGF0YSB0byBhIHBhc3N3b3JkIHRleHQgZmllbGQuXG4gICAgICpcbiAgICAgKiAqKlBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgY2F1c2UgZW50ZXJlZCB2YWx1ZXMgdG8gYmVcbiAgICAgKiBlbmNyeXB0ZWQgb3Igc2VjdXJlZCBpbiBhbnkgd2F5ISBJdCBzaW1wbHkgc2V0cyBhIGZsYWcgdGhhdCBQREYgc29mdHdhcmVcbiAgICAgKiBhbmQgcmVhZGVycyBjYW4gYWNjZXNzIHRvIGRldGVybWluZSB0aGUgX3B1cnBvc2VfIG9mIHRoaXMgZmllbGQuKipcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZVBhc3N3b3JkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5QYXNzd29yZCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgdGV4dCBmaWVsZCBpcyAqKm5vdCoqIGludGVuZGVkIGZvciBzdG9yaW5nIGEgc2VjdXJlXG4gICAgICogcGFzc3dvcmQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVQYXNzd29yZCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlUGFzc3dvcmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLlBhc3N3b3JkLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29udGVudHMgb2YgdGhpcyB0ZXh0IGZpZWxkIHJlcHJlc2VudCBhIGZpbGUgcGF0aC5cbiAgICAgKiBTZWUgW1tQREZUZXh0RmllbGQuZW5hYmxlRmlsZVNlbGVjdGlvbl1dIGFuZFxuICAgICAqIFtbUERGVGV4dEZpZWxkLmRpc2FibGVGaWxlU2VsZWN0aW9uXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogaWYgKHRleHRGaWVsZC5pc0ZpbGVTZWxlY3RvcigpKSBjb25zb2xlLmxvZygnSXMgYSBmaWxlIHNlbGVjdG9yJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZpZWxkIHNob3VsZCBjb250YWluIGZpbGUgcGF0aHMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc0ZpbGVTZWxlY3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb1RleHRGbGFncy5GaWxlU2VsZWN0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyB0ZXh0IGZpZWxkIGlzIGludGVuZGVkIHRvIHN0b3JlIGEgZmlsZSBwYXRoLiBUaGVcbiAgICAgKiBjb250ZW50cyBvZiB0aGUgZmlsZSBzdG9yZWQgYXQgdGhhdCBwYXRoIHNob3VsZCBiZSBzdWJtaXR0ZWQgYXMgdGhlIHZhbHVlXG4gICAgICogb2YgdGhlIGZpZWxkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5lbmFibGVGaWxlU2VsZWN0aW9uKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZUZpbGVTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkZpbGVTZWxlY3QsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIHRleHQgZmllbGQgaXMgKipub3QqKiBpbnRlbmRlZCB0byBzdG9yZSBhIGZpbGUgcGF0aC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlRmlsZVNlbGVjdGlvbigpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlRmlsZVNlbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuRmlsZVNlbGVjdCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGlzIGZpZWxkIHNob3VsZCBiZSBzcGVsbCBjaGVja2VkXG4gICAgICogYnkgUERGIHJlYWRlcnMuIFNlZSBbW1BERlRleHRGaWVsZC5lbmFibGVTcGVsbENoZWNraW5nXV0gYW5kXG4gICAgICogW1tQREZUZXh0RmllbGQuZGlzYWJsZVNwZWxsQ2hlY2tpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzU3BlbGxDaGVja2VkKCkpIGNvbnNvbGUubG9nKCdTcGVsbCBjaGVja2luZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZpZWxkIHNob3VsZCBiZSBzcGVsbCBjaGVja2VkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNTcGVsbENoZWNrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLkRvTm90U3BlbGxDaGVjayk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBQREYgcmVhZGVycyB0byBzcGVsbCBjaGVjayB0aGUgdGV4dCBlbnRlcmVkIGluIHRoaXMgZmllbGQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlU3BlbGxDaGVja2luZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVTcGVsbENoZWNraW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5Eb05vdFNwZWxsQ2hlY2ssIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbGxvdyBQREYgcmVhZGVycyB0byBzcGVsbCBjaGVjayB0aGUgdGV4dCBlbnRlcmVkIGluIHRoaXMgZmllbGQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGlzYWJsZVNwZWxsQ2hlY2tpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGlzYWJsZVNwZWxsQ2hlY2tpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkRvTm90U3BlbGxDaGVjaywgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBQREYgcmVhZGVycyBzaG91bGQgYWxsb3cgdGhlIHVzZXIgdG8gc2Nyb2xsIHRoZSB0ZXh0XG4gICAgICogZmllbGQgd2hlbiBpdHMgY29udGVudHMgZG8gbm90IGZpdCB3aXRoaW4gdGhlIGZpZWxkJ3MgdmlldyBib3VuZHMuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLmVuYWJsZVNjcm9sbGluZ11dIGFuZCBbW1BERlRleHRGaWVsZC5kaXNhYmxlU2Nyb2xsaW5nXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzU2Nyb2xsYWJsZSgpKSBjb25zb2xlLmxvZygnU2Nyb2xsaW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBmaWVsZCBpcyBzY3JvbGxhYmxlIGluIFBERiByZWFkZXJzLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNTY3JvbGxhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb1RleHRGbGFncy5Eb05vdFNjcm9sbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBQREYgcmVhZGVycyB0byBwcmVzZW50IGEgc2Nyb2xsIGJhciB0byB0aGUgdXNlciB3aGVuIHRoZSBjb250ZW50c1xuICAgICAqIG9mIHRoaXMgdGV4dCBmaWVsZCBkbyBub3QgZml0IHdpdGhpbiBpdHMgdmlldyBib3VuZHMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZVNjcm9sbGluZygpXG4gICAgICogYGBgXG4gICAgICogQSBob3Jpem9udGFsIHNjcm9sbCBiYXIgc2hvdWxkIGJlIHNob3duIGZvciBzaW5nbGVsaW5lIGZpZWxkcy4gQSB2ZXJ0aWNhbFxuICAgICAqIHNjcm9sbCBiYXIgc2hvdWxkIGJlIHNob3duIGZvciBtdWx0aWxpbmUgZmllbGRzLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZW5hYmxlU2Nyb2xsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5Eb05vdFNjcm9sbCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IFBERiByZWFkZXJzIHRvIHByZXNlbnQgYSBzY3JvbGwgYmFyIHRvIHRoZSB1c2VyIHdoZW4gdGhlXG4gICAgICogY29udGVudHMgb2YgdGhpcyB0ZXh0IGZpZWxkIGRvIG5vdCBmaXQgd2l0aGluIGl0cyB2aWV3IGJvdW5kcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGlzYWJsZVNjcm9sbGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlU2Nyb2xsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5Eb05vdFNjcm9sbCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIGEgY29tYmVkIHRleHQgZmllbGQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmllbGRcbiAgICAgKiBpcyBzcGxpdCBpbnRvIGBuYCBlcXVhbCBzaXplIGNlbGxzIHdpdGggb25lIGNoYXJhY3RlciBpbiBlYWNoICh3aGVyZSBgbmBcbiAgICAgKiBpcyBlcXVhbCB0byB0aGUgbWF4IGxlbmd0aCBvZiB0aGUgdGV4dCBmaWVsZCkuIFRoZSByZXN1bHQgaXMgdGhhdCBhbGxcbiAgICAgKiBjaGFyYWN0ZXJzIGluIHRoaXMgZmllbGQgYXJlIGRpc3BsYXllZCBhbiBlcXVhbCBkaXN0YW5jZSBhcGFydCBmcm9tIG9uZVxuICAgICAqIGFub3RoZXIuIFNlZSBbW1BERlRleHRGaWVsZC5lbmFibGVDb21iaW5nXV0gYW5kXG4gICAgICogW1tQREZUZXh0RmllbGQuZGlzYWJsZUNvbWJpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzQ29tYmVkKCkpIGNvbnNvbGUubG9nKCdDb21iaW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCBpbiBvcmRlciBmb3IgYSB0ZXh0IGZpZWxkIHRvIGJlIGNvbWJlZCwgdGhlIGZvbGxvd2luZyBtdXN0IGJlXG4gICAgICogdHJ1ZSAoaW4gYWRkaXRpb24gdG8gZW5hYmxpbmcgY29tYmluZyk6XG4gICAgICogKiBJdCBtdXN0IG5vdCBiZSBhIG11bHRpbGluZSBmaWVsZCAoc2VlIFtbUERGVGV4dEZpZWxkLmlzTXVsdGlsaW5lXV0pXG4gICAgICogKiBJdCBtdXN0IG5vdCBiZSBhIHBhc3N3b3JkIGZpZWxkIChzZWUgW1tQREZUZXh0RmllbGQuaXNQYXNzd29yZF1dKVxuICAgICAqICogSXQgbXVzdCBub3QgYmUgYSBmaWxlIHNlbGVjdG9yIGZpZWxkIChzZWUgW1tQREZUZXh0RmllbGQuaXNGaWxlU2VsZWN0b3JdXSlcbiAgICAgKiAqIEl0IG11c3QgaGF2ZSBhIG1heCBsZW5ndGggZGVmaW5lZCAoc2VlIFtbUERGVGV4dEZpZWxkLnNldE1heExlbmd0aF1dKVxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgaXMgY29tYmVkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNDb21iZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLkNvbWIpICYmXG4gICAgICAgICAgICAhdGhpcy5pc011bHRpbGluZSgpICYmXG4gICAgICAgICAgICAhdGhpcy5pc1Bhc3N3b3JkKCkgJiZcbiAgICAgICAgICAgICF0aGlzLmlzRmlsZVNlbGVjdG9yKCkgJiZcbiAgICAgICAgICAgIHRoaXMuZ2V0TWF4TGVuZ3RoKCkgIT09IHVuZGVmaW5lZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTcGxpdCB0aGlzIGZpZWxkIGludG8gYG5gIGVxdWFsIHNpemUgY2VsbHMgd2l0aCBvbmUgY2hhcmFjdGVyIGluIGVhY2hcbiAgICAgKiAod2hlcmUgYG5gIGlzIGVxdWFsIHRvIHRoZSBtYXggbGVuZ3RoIG9mIHRoZSB0ZXh0IGZpZWxkKS4gVGhpcyB3aWxsIGNhdXNlXG4gICAgICogYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGZpZWxkIHRvIGJlIGRpc3BsYXllZCBhbiBlcXVhbCBkaXN0YW5jZSBhcGFydCBmcm9tXG4gICAgICogb25lIGFub3RoZXIuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZUNvbWJpbmcoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gYWRkaXRpb24gdG8gY2FsbGluZyB0aGlzIG1ldGhvZCwgdGV4dCBmaWVsZHMgbXVzdCBoYXZlIGEgbWF4IGxlbmd0aFxuICAgICAqIGRlZmluZWQgaW4gb3JkZXIgdG8gYmUgY29tYmVkIChzZWUgW1tQREZUZXh0RmllbGQuc2V0TWF4TGVuZ3RoXV0pLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBhbHNvIGNhbGwgdGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzIGludGVybmFsbHk6XG4gICAgICogKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlTXVsdGlsaW5lXV1cbiAgICAgKiAqIFtbUERGVGV4dEZpZWxkLmRpc2FibGVQYXNzd29yZF1dXG4gICAgICogKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlRmlsZVNlbGVjdGlvbl1dXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVDb21iaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5nZXRNYXhMZW5ndGgoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgbXNnID0gXCJQREZUZXh0RmllbGRzIG11c3QgaGF2ZSBhIG1heCBsZW5ndGggaW4gb3JkZXIgdG8gYmUgY29tYmVkXCI7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZU11bHRpbGluZSgpO1xuICAgICAgICB0aGlzLmRpc2FibGVQYXNzd29yZCgpO1xuICAgICAgICB0aGlzLmRpc2FibGVGaWxlU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkNvbWIsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVHVybiBvZmYgY29tYmluZyBmb3IgdGhpcyB0ZXh0IGZpZWxkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlQ29tYmluZygpXG4gICAgICogYGBgXG4gICAgICogU2VlIFtbUERGVGV4dEZpZWxkLmlzQ29tYmVkXV0gYW5kIFtbUERGVGV4dEZpZWxkLmVuYWJsZUNvbWJpbmddXSBmb3IgbW9yZVxuICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgY29tYmluZyBpcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVDb21iaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkNvbWIsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgdGV4dCBmaWVsZCBjb250YWlucyByaWNoIHRleHQuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLmVuYWJsZVJpY2hGb3JtYXR0aW5nXV0gYW5kXG4gICAgICogW1tQREZUZXh0RmllbGQuZGlzYWJsZVJpY2hGb3JtYXR0aW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogaWYgKHRleHRGaWVsZC5pc1JpY2hGb3JtYXR0ZWQoKSkgY29uc29sZS5sb2coJ1JpY2ggZm9ybWF0dGluZyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZpZWxkIGNvbnRhaW5zIHJpY2ggdGV4dC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmlzUmljaEZvcm1hdHRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb1RleHRGbGFncy5SaWNoVGV4dCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgZmllbGQgY29udGFpbnMgWEZBIGRhdGEgLSBvciByaWNoIHRleHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZVJpY2hGb3JtYXR0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgYHBkZi1saWJgIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBvciB3cml0aW5nIHJpY2ggdGV4dCBmaWVsZHMuXG4gICAgICogTm9yIGRvIG1vc3QgUERGIHJlYWRlcnMgYW5kIHdyaXRlcnMuIFJpY2ggdGV4dCBmaWVsZHMgYXJlIGJhc2VkIG9uIFhGQVxuICAgICAqIChYTUwgRm9ybXMgQXJjaGl0ZWN0dXJlKS4gUmVsYXRpdmVseSBmZXcgUERGcyB1c2UgcmljaCB0ZXh0IGZpZWxkcyBvciBYRkEuXG4gICAgICogVW5saWtlIFBERiBpdHNlbGYsIFhGQSBpcyBub3QgYW4gSVNPIHN0YW5kYXJkLiBYRkEgaGFzIGJlZW4gZGVwcmVjYXRlZCBpblxuICAgICAqIFBERiAyLjA6XG4gICAgICogKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9YRkFcbiAgICAgKiAqIGh0dHA6Ly9ibG9nLnBkZnNoYXJlZm9ybXMuY29tL3BkZi0yLTAtcmVsZWFzZS1iaWQtZmFyZXdlbGwteGZhLWZvcm1zL1xuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZW5hYmxlUmljaEZvcm1hdHRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLlJpY2hUZXh0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBpcyBhIHN0YW5kYXJkIHRleHQgZmllbGQgdGhhdCBkb2VzIG5vdCBYRkEgZGF0YSAocmljaFxuICAgICAqIHRleHQpLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlUmljaEZvcm1hdHRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGlzYWJsZVJpY2hGb3JtYXR0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5SaWNoVGV4dCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGlzIHRleHQgZmllbGQgb24gdGhlIHNwZWNpZmllZCBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHVidW50dUZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KHVidW50dUZvbnRCeXRlcylcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmNyZWF0ZVRleHRGaWVsZCgnYmVzdC5ndW5kYW0nKVxuICAgICAqIHRleHRGaWVsZC5zZXRUZXh0KCdFeGlhJylcbiAgICAgKlxuICAgICAqIHRleHRGaWVsZC5hZGRUb1BhZ2UocGFnZSwge1xuICAgICAqICAgeDogNTAsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHdpZHRoOiAyMDAsXG4gICAgICogICBoZWlnaHQ6IDEwMCxcbiAgICAgKiAgIHRleHRDb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgYmFja2dyb3VuZENvbG9yOiByZ2IoMCwgMSwgMCksXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAsIDAsIDEpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoOTApLFxuICAgICAqICAgZm9udDogdWJ1bnR1Rm9udCxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgd2lkZ2V0IGZvciB0aGlzIHRleHQgZmllbGQuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gd2hpY2ggdGhpcyB0ZXh0IGZpZWxkIHdpZGdldCBzaG91bGQgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGFkZGluZyB0aGlzIHRleHQgZmllbGQgd2lkZ2V0LlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuYWRkVG9QYWdlID0gZnVuY3Rpb24gKHBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIGlmICghKCd0ZXh0Q29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy50ZXh0Q29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdiYWNrZ3JvdW5kQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgPSByZ2IoMSwgMSwgMSk7XG4gICAgICAgIGlmICghKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYm9yZGVyV2lkdGgnIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDE7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyB0ZXh0IGZpZWxkXG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmNyZWF0ZVdpZGdldCh7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDAsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDAsXG4gICAgICAgICAgICB3aWR0aDogKF9jID0gb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogNTAsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IG9wdGlvbnMudGV4dENvbG9yLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfZSA9IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDAsXG4gICAgICAgICAgICByb3RhdGU6IChfZiA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgaGlkZGVuOiBvcHRpb25zLmhpZGRlbixcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UucmVmLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIod2lkZ2V0LmRpY3QpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoaXMgZmllbGRcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuYWRkV2lkZ2V0KHdpZGdldFJlZik7XG4gICAgICAgIC8vIFNldCBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIHdpZGdldFxuICAgICAgICB2YXIgZm9udCA9IChfZyA9IG9wdGlvbnMuZm9udCkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdGhpcy5kb2MuZ2V0Rm9ybSgpLmdldERlZmF1bHRGb250KCk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoZSBnaXZlbiBwYWdlXG4gICAgICAgIHBhZ2Uubm9kZS5hZGRBbm5vdCh3aWRnZXRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyB0ZXh0IGZpZWxkIGhhcyBiZWVuIG1hcmtlZCBhcyBkaXJ0eSwgb3IgaWYgYW55IG9mXG4gICAgICogdGhpcyB0ZXh0IGZpZWxkJ3Mgd2lkZ2V0cyBkbyBub3QgaGF2ZSBhbiBhcHBlYXJhbmNlIHN0cmVhbS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUoKSkgY29uc29sZS5sb2coJ05lZWRzIHVwZGF0ZScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyB0ZXh0IGZpZWxkIG5lZWRzIGFuIGFwcGVhcmFuY2UgdXBkYXRlLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5pc0RpcnR5KCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIGhhc0FwcGVhcmFuY2VzID0gKChfYSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsKSBpbnN0YW5jZW9mIFBERlN0cmVhbTtcbiAgICAgICAgICAgIGlmICghaGFzQXBwZWFyYW5jZXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyB0ZXh0IGZpZWxkJ3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIHRleHQgZmllbGRzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoZm9udCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIHRleHQgZmllbGQncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGdpdmVuIGFwcGVhcmFuY2UgcHJvdmlkZXIuIElmIG5vIGBwcm92aWRlcmAgaXMgcGFzc2VkLCB0aGUgZGVmYXVsdFxuICAgICAqIGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIHRleHQgZmllbGRzIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC51cGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EsIChmaWVsZCwgd2lkZ2V0LCBmb250KSA9PiB7XG4gICAgICogICAuLi5cbiAgICAgKiAgIHJldHVybiBkcmF3VGV4dEZpZWxkKC4uLilcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIE9wdGlvbmFsbHksIHRoZSBhcHBlYXJhbmNlIHByb3ZpZGVyIHRvIGJlIHVzZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS51cGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250LCBwcm92aWRlcikge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwcm92aWRlciwgJ3Byb3ZpZGVyJywgW0Z1bmN0aW9uXSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBmb250LCBwcm92aWRlcikge1xuICAgICAgICB2YXIgYXBQcm92aWRlciA9IHByb3ZpZGVyICE9PSBudWxsICYmIHByb3ZpZGVyICE9PSB2b2lkIDAgPyBwcm92aWRlciA6IGRlZmF1bHRUZXh0RmllbGRBcHBlYXJhbmNlUHJvdmlkZXI7XG4gICAgICAgIHZhciBhcHBlYXJhbmNlcyA9IG5vcm1hbGl6ZUFwcGVhcmFuY2UoYXBQcm92aWRlcih0aGlzLCB3aWRnZXQsIGZvbnQpKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlV2l0aEZvbnQod2lkZ2V0LCBmb250LCBhcHBlYXJhbmNlcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRm9ybS5nZXRUZXh0RmllbGRdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlIGFuXG4gICAgICogPiBpbnN0YW5jZSBvZiBbW1BERlRleHRGaWVsZF1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZUZXh0RmllbGRdXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9UZXh0IGFuZCByZWZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvVGV4dCBUaGUgdW5kZXJseWluZyBgUERGQWNyb1RleHRgIGZvciB0aGlzIHRleHQgZmllbGQuXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyB0ZXh0IGZpZWxkLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgdGV4dCBmaWVsZCB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQub2YgPSBmdW5jdGlvbiAoYWNyb1RleHQsIHJlZiwgZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGVGV4dEZpZWxkKGFjcm9UZXh0LCByZWYsIGRvYyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGVGV4dEZpZWxkO1xufShQREZGaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGVGV4dEZpZWxkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGVGV4dEZpZWxkLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduLCBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZHJhd0NoZWNrQm94LCByb3RhdGVJblBsYWNlLCBkcmF3UmFkaW9CdXR0b24sIGRyYXdCdXR0b24sIGRyYXdUZXh0RmllbGQsIGRyYXdPcHRpb25MaXN0LCB9IGZyb20gXCIuLi9vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyByZ2IsIGNvbXBvbmVudHNUb0NvbG9yLCBzZXRGaWxsaW5nQ29sb3IsIGdyYXlzY2FsZSwgY215aywgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyByZWR1Y2VSb3RhdGlvbiwgYWRqdXN0RGltc0ZvclJvdGF0aW9uIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgbGF5b3V0TXVsdGlsaW5lVGV4dCwgbGF5b3V0Q29tYmVkVGV4dCwgbGF5b3V0U2luZ2xlbGluZVRleHQsIH0gZnJvbSBcIi4uL3RleHQvbGF5b3V0XCI7XG5pbXBvcnQgeyBUZXh0QWxpZ25tZW50IH0gZnJvbSBcIi4uL3RleHQvYWxpZ25tZW50XCI7XG5pbXBvcnQgeyBzZXRGb250QW5kU2l6ZSB9IGZyb20gXCIuLi9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IGZpbmRMYXN0TWF0Y2ggfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKioqKioqKioqKioqKioqKioqKiogQXBwZWFyYW5jZSBQcm92aWRlciBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgdmFyIG5vcm1hbGl6ZUFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgIGlmICgnbm9ybWFsJyBpbiBhcHBlYXJhbmNlKVxuICAgICAgICByZXR1cm4gYXBwZWFyYW5jZTtcbiAgICByZXR1cm4geyBub3JtYWw6IGFwcGVhcmFuY2UgfTtcbn07XG4vLyBFeGFtcGxlczpcbi8vICAgYC9IZWx2IDEyIFRmYCAtPiBbJy9IZWx2IDEyIFRmJywgJ0hlbHYnLCAnMTInXVxuLy8gICBgL0hlQm8gOC4wMCBUZmAgLT4gWycvSGVCbyA4IFRmJywgJ0hlQm8nLCAnOC4wMCddXG52YXIgdGZSZWdleCA9IC9cXC8oW15cXDBcXHRcXG5cXGZcXHJcXCBdKylbXFwwXFx0XFxuXFxmXFxyXFwgXSsoXFxkKlxcLlxcZCt8XFxkKylbXFwwXFx0XFxuXFxmXFxyXFwgXStUZi87XG52YXIgZ2V0RGVmYXVsdEZvbnRTaXplID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICB2YXIgZGEgPSAoX2EgPSBmaWVsZC5nZXREZWZhdWx0QXBwZWFyYW5jZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICB2YXIgZGFNYXRjaCA9IChfYiA9IGZpbmRMYXN0TWF0Y2goZGEsIHRmUmVnZXgpLm1hdGNoKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXTtcbiAgICB2YXIgZGVmYXVsdEZvbnRTaXplID0gTnVtYmVyKGRhTWF0Y2hbMl0pO1xuICAgIHJldHVybiBpc0Zpbml0ZShkZWZhdWx0Rm9udFNpemUpID8gZGVmYXVsdEZvbnRTaXplIDogdW5kZWZpbmVkO1xufTtcbi8vIEV4YW1wbGVzOlxuLy8gICBgMC4zIGdgIC0+IFsnMC4zJywgJ2cnXVxuLy8gICBgMC4zIDEgLjMgcmdgIC0+IFsnMC4zJywgJzEnLCAnLjMnLCAncmcnXVxuLy8gICBgMC4zIDEgLjMgMCBrYCAtPiBbJzAuMycsICcxJywgJy4zJywgJzAnLCAnayddXG52YXIgY29sb3JSZWdleCA9IC8oXFxkKlxcLlxcZCt8XFxkKylbXFwwXFx0XFxuXFxmXFxyXFwgXSooXFxkKlxcLlxcZCt8XFxkKyk/W1xcMFxcdFxcblxcZlxcclxcIF0qKFxcZCpcXC5cXGQrfFxcZCspP1tcXDBcXHRcXG5cXGZcXHJcXCBdKihcXGQqXFwuXFxkK3xcXGQrKT9bXFwwXFx0XFxuXFxmXFxyXFwgXSsoZ3xyZ3xrKS87XG52YXIgZ2V0RGVmYXVsdENvbG9yID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBkYSA9IChfYSA9IGZpZWxkLmdldERlZmF1bHRBcHBlYXJhbmNlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIHZhciBkYU1hdGNoID0gZmluZExhc3RNYXRjaChkYSwgY29sb3JSZWdleCkubWF0Y2g7XG4gICAgdmFyIF9iID0gZGFNYXRjaCAhPT0gbnVsbCAmJiBkYU1hdGNoICE9PSB2b2lkIDAgPyBkYU1hdGNoIDogW10sIGMxID0gX2JbMV0sIGMyID0gX2JbMl0sIGMzID0gX2JbM10sIGM0ID0gX2JbNF0sIGNvbG9yU3BhY2UgPSBfYls1XTtcbiAgICBpZiAoY29sb3JTcGFjZSA9PT0gJ2cnICYmIGMxKSB7XG4gICAgICAgIHJldHVybiBncmF5c2NhbGUoTnVtYmVyKGMxKSk7XG4gICAgfVxuICAgIGlmIChjb2xvclNwYWNlID09PSAncmcnICYmIGMxICYmIGMyICYmIGMzKSB7XG4gICAgICAgIHJldHVybiByZ2IoTnVtYmVyKGMxKSwgTnVtYmVyKGMyKSwgTnVtYmVyKGMzKSk7XG4gICAgfVxuICAgIGlmIChjb2xvclNwYWNlID09PSAnaycgJiYgYzEgJiYgYzIgJiYgYzMgJiYgYzQpIHtcbiAgICAgICAgcmV0dXJuIGNteWsoTnVtYmVyKGMxKSwgTnVtYmVyKGMyKSwgTnVtYmVyKGMzKSwgTnVtYmVyKGM0KSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xudmFyIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGZpZWxkLCBjb2xvciwgZm9udCwgZm9udFNpemUpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKGZvbnRTaXplID09PSB2b2lkIDApIHsgZm9udFNpemUgPSAwOyB9XG4gICAgdmFyIGRhID0gW1xuICAgICAgICBzZXRGaWxsaW5nQ29sb3IoY29sb3IpLnRvU3RyaW5nKCksXG4gICAgICAgIHNldEZvbnRBbmRTaXplKChfYSA9IGZvbnQgPT09IG51bGwgfHwgZm9udCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9udC5uYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnZHVtbXlfX25vb3AnLCBmb250U2l6ZSkudG9TdHJpbmcoKSxcbiAgICBdLmpvaW4oJ1xcbicpO1xuICAgIGZpZWxkLnNldERlZmF1bHRBcHBlYXJhbmNlKGRhKTtcbn07XG5leHBvcnQgdmFyIGRlZmF1bHRDaGVja0JveEFwcGVhcmFuY2VQcm92aWRlciA9IGZ1bmN0aW9uIChjaGVja0JveCwgd2lkZ2V0KSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcihjaGVja0JveC5hY3JvRmllbGQpO1xuICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2EgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9kID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9kLndpZHRoLCBoZWlnaHQgPSBfZC5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gKF9iID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBibGFjaztcbiAgICB2YXIgbm9ybWFsQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpKTtcbiAgICB2YXIgZG93bkJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSwgMC44KTtcbiAgICAvLyBVcGRhdGUgY29sb3JcbiAgICB2YXIgdGV4dENvbG9yID0gKF9jID0gd2lkZ2V0Q29sb3IgIT09IG51bGwgJiYgd2lkZ2V0Q29sb3IgIT09IHZvaWQgMCA/IHdpZGdldENvbG9yIDogZmllbGRDb2xvcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogYmxhY2s7XG4gICAgaWYgKHdpZGdldENvbG9yKSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHdpZGdldCwgdGV4dENvbG9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKGNoZWNrQm94LmFjcm9GaWVsZCwgdGV4dENvbG9yKTtcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHg6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHk6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoLFxuICAgICAgICB0aGlja25lc3M6IDEuNSxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gICAgICAgIG1hcmtDb2xvcjogdGV4dENvbG9yLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbm9ybWFsOiB7XG4gICAgICAgICAgICBvbjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3Q2hlY2tCb3goX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogdHJ1ZSB9KSkpLFxuICAgICAgICAgICAgb2ZmOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdDaGVja0JveChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvciwgZmlsbGVkOiBmYWxzZSB9KSkpLFxuICAgICAgICB9LFxuICAgICAgICBkb3duOiB7XG4gICAgICAgICAgICBvbjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3Q2hlY2tCb3goX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBkb3duQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IHRydWUgfSkpKSxcbiAgICAgICAgICAgIG9mZjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3Q2hlY2tCb3goX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBkb3duQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IGZhbHNlIH0pKSksXG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIGRlZmF1bHRSYWRpb0dyb3VwQXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKHJhZGlvR3JvdXAsIHdpZGdldCkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIC8vIFRoZSBgL0RBYCBlbnRyeSBjYW4gYmUgYXQgdGhlIHdpZGdldCBvciBmaWVsZCBsZXZlbCAtIHNvIHdlIGhhbmRsZSBib3RoXG4gICAgdmFyIHdpZGdldENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkQ29sb3IgPSBnZXREZWZhdWx0Q29sb3IocmFkaW9Hcm91cC5hY3JvRmllbGQpO1xuICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2EgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9kID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9kLndpZHRoLCBoZWlnaHQgPSBfZC5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gKF9iID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBibGFjaztcbiAgICB2YXIgbm9ybWFsQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpKTtcbiAgICB2YXIgZG93bkJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSwgMC44KTtcbiAgICAvLyBVcGRhdGUgY29sb3JcbiAgICB2YXIgdGV4dENvbG9yID0gKF9jID0gd2lkZ2V0Q29sb3IgIT09IG51bGwgJiYgd2lkZ2V0Q29sb3IgIT09IHZvaWQgMCA/IHdpZGdldENvbG9yIDogZmllbGRDb2xvcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogYmxhY2s7XG4gICAgaWYgKHdpZGdldENvbG9yKSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHdpZGdldCwgdGV4dENvbG9yKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHJhZGlvR3JvdXAuYWNyb0ZpZWxkLCB0ZXh0Q29sb3IpO1xuICAgIH1cbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgeDogd2lkdGggLyAyLFxuICAgICAgICB5OiBoZWlnaHQgLyAyLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gICAgICAgIGRvdENvbG9yOiB0ZXh0Q29sb3IsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBub3JtYWw6IHtcbiAgICAgICAgICAgIG9uOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdSYWRpb0J1dHRvbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvciwgZmlsbGVkOiB0cnVlIH0pKSksXG4gICAgICAgICAgICBvZmY6IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd1JhZGlvQnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IGZhbHNlIH0pKSksXG4gICAgICAgIH0sXG4gICAgICAgIGRvd246IHtcbiAgICAgICAgICAgIG9uOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdSYWRpb0J1dHRvbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IGRvd25CYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogdHJ1ZSB9KSkpLFxuICAgICAgICAgICAgb2ZmOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdSYWRpb0J1dHRvbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IGRvd25CYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogZmFsc2UgfSkpKSxcbiAgICAgICAgfSxcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdEJ1dHRvbkFwcGVhcmFuY2VQcm92aWRlciA9IGZ1bmN0aW9uIChidXR0b24sIHdpZGdldCwgZm9udCkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcihidXR0b24uYWNyb0ZpZWxkKTtcbiAgICB2YXIgd2lkZ2V0Rm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZShidXR0b24uYWNyb0ZpZWxkKTtcbiAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgIHZhciBhcCA9IHdpZGdldC5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgdmFyIGJzID0gd2lkZ2V0LmdldEJvcmRlclN0eWxlKCk7XG4gICAgdmFyIGNhcHRpb25zID0gYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldENhcHRpb25zKCk7XG4gICAgdmFyIG5vcm1hbFRleHQgPSAoX2EgPSBjYXB0aW9ucyA9PT0gbnVsbCB8fCBjYXB0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FwdGlvbnMubm9ybWFsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICB2YXIgZG93blRleHQgPSAoX2MgPSAoX2IgPSBjYXB0aW9ucyA9PT0gbnVsbCB8fCBjYXB0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FwdGlvbnMuZG93bikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbm9ybWFsVGV4dCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJyc7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gKF9kID0gYnMgPT09IG51bGwgfHwgYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJzLmdldFdpZHRoKCkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldFJvdGF0aW9uKCkpO1xuICAgIHZhciBfZiA9IGFkanVzdERpbXNGb3JSb3RhdGlvbihyZWN0YW5nbGUsIHJvdGF0aW9uKSwgd2lkdGggPSBfZi53aWR0aCwgaGVpZ2h0ID0gX2YuaGVpZ2h0O1xuICAgIHZhciByb3RhdGUgPSByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiByb3RhdGlvbiB9KSk7XG4gICAgdmFyIGJsYWNrID0gcmdiKDAsIDAsIDApO1xuICAgIHZhciBib3JkZXJDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCb3JkZXJDb2xvcigpKTtcbiAgICB2YXIgbm9ybWFsQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpKTtcbiAgICB2YXIgZG93bkJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSwgMC44KTtcbiAgICB2YXIgYm91bmRzID0ge1xuICAgICAgICB4OiBib3JkZXJXaWR0aCxcbiAgICAgICAgeTogYm9yZGVyV2lkdGgsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoICogMixcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCAqIDIsXG4gICAgfTtcbiAgICB2YXIgbm9ybWFsTGF5b3V0ID0gbGF5b3V0U2luZ2xlbGluZVRleHQobm9ybWFsVGV4dCwge1xuICAgICAgICBhbGlnbm1lbnQ6IFRleHRBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgfSk7XG4gICAgdmFyIGRvd25MYXlvdXQgPSBsYXlvdXRTaW5nbGVsaW5lVGV4dChkb3duVGV4dCwge1xuICAgICAgICBhbGlnbm1lbnQ6IFRleHRBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgfSk7XG4gICAgLy8gVXBkYXRlIGZvbnQgc2l6ZSBhbmQgY29sb3JcbiAgICB2YXIgZm9udFNpemUgPSBNYXRoLm1pbihub3JtYWxMYXlvdXQuZm9udFNpemUsIGRvd25MYXlvdXQuZm9udFNpemUpO1xuICAgIHZhciB0ZXh0Q29sb3IgPSAoX2UgPSB3aWRnZXRDb2xvciAhPT0gbnVsbCAmJiB3aWRnZXRDb2xvciAhPT0gdm9pZCAwID8gd2lkZ2V0Q29sb3IgOiBmaWVsZENvbG9yKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBibGFjaztcbiAgICBpZiAod2lkZ2V0Q29sb3IgfHwgd2lkZ2V0Rm9udFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZSh3aWRnZXQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2UoYnV0dG9uLmFjcm9GaWVsZCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICB4OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB5OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gICAgICAgIHRleHRDb2xvcjogdGV4dENvbG9yLFxuICAgICAgICBmb250OiBmb250Lm5hbWUsXG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vcm1hbDogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3QnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLCB0ZXh0TGluZXM6IFtub3JtYWxMYXlvdXQubGluZV0gfSkpKSxcbiAgICAgICAgZG93bjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3QnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogZG93bkJhY2tncm91bmRDb2xvciwgdGV4dExpbmVzOiBbZG93bkxheW91dC5saW5lXSB9KSkpLFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBkZWZhdWx0VGV4dEZpZWxkQXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKHRleHRGaWVsZCwgd2lkZ2V0LCBmb250KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIC8vIFRoZSBgL0RBYCBlbnRyeSBjYW4gYmUgYXQgdGhlIHdpZGdldCBvciBmaWVsZCBsZXZlbCAtIHNvIHdlIGhhbmRsZSBib3RoXG4gICAgdmFyIHdpZGdldENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkQ29sb3IgPSBnZXREZWZhdWx0Q29sb3IodGV4dEZpZWxkLmFjcm9GaWVsZCk7XG4gICAgdmFyIHdpZGdldEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkRm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUodGV4dEZpZWxkLmFjcm9GaWVsZCk7XG4gICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgIHZhciB0ZXh0ID0gKF9hID0gdGV4dEZpZWxkLmdldFRleHQoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gKF9iID0gYnMgPT09IG51bGwgfHwgYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJzLmdldFdpZHRoKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldFJvdGF0aW9uKCkpO1xuICAgIHZhciBfZSA9IGFkanVzdERpbXNGb3JSb3RhdGlvbihyZWN0YW5nbGUsIHJvdGF0aW9uKSwgd2lkdGggPSBfZS53aWR0aCwgaGVpZ2h0ID0gX2UuaGVpZ2h0O1xuICAgIHZhciByb3RhdGUgPSByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiByb3RhdGlvbiB9KSk7XG4gICAgdmFyIGJsYWNrID0gcmdiKDAsIDAsIDApO1xuICAgIHZhciBib3JkZXJDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCb3JkZXJDb2xvcigpKTtcbiAgICB2YXIgbm9ybWFsQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpKTtcbiAgICB2YXIgdGV4dExpbmVzO1xuICAgIHZhciBmb250U2l6ZTtcbiAgICB2YXIgcGFkZGluZyA9IHRleHRGaWVsZC5pc0NvbWJlZCgpID8gMCA6IDE7XG4gICAgdmFyIGJvdW5kcyA9IHtcbiAgICAgICAgeDogYm9yZGVyV2lkdGggKyBwYWRkaW5nLFxuICAgICAgICB5OiBib3JkZXJXaWR0aCArIHBhZGRpbmcsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIChib3JkZXJXaWR0aCArIHBhZGRpbmcpICogMixcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSAoYm9yZGVyV2lkdGggKyBwYWRkaW5nKSAqIDIsXG4gICAgfTtcbiAgICBpZiAodGV4dEZpZWxkLmlzTXVsdGlsaW5lKCkpIHtcbiAgICAgICAgdmFyIGxheW91dCA9IGxheW91dE11bHRpbGluZVRleHQodGV4dCwge1xuICAgICAgICAgICAgYWxpZ25tZW50OiB0ZXh0RmllbGQuZ2V0QWxpZ25tZW50KCksXG4gICAgICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnQ6IGZvbnQsXG4gICAgICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRleHRMaW5lcyA9IGxheW91dC5saW5lcztcbiAgICAgICAgZm9udFNpemUgPSBsYXlvdXQuZm9udFNpemU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRleHRGaWVsZC5pc0NvbWJlZCgpKSB7XG4gICAgICAgIHZhciBsYXlvdXQgPSBsYXlvdXRDb21iZWRUZXh0KHRleHQsIHtcbiAgICAgICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgICAgIGJvdW5kczogYm91bmRzLFxuICAgICAgICAgICAgY2VsbENvdW50OiAoX2MgPSB0ZXh0RmllbGQuZ2V0TWF4TGVuZ3RoKCkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICB0ZXh0TGluZXMgPSBsYXlvdXQuY2VsbHM7XG4gICAgICAgIGZvbnRTaXplID0gbGF5b3V0LmZvbnRTaXplO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGxheW91dCA9IGxheW91dFNpbmdsZWxpbmVUZXh0KHRleHQsIHtcbiAgICAgICAgICAgIGFsaWdubWVudDogdGV4dEZpZWxkLmdldEFsaWdubWVudCgpLFxuICAgICAgICAgICAgZm9udFNpemU6IHdpZGdldEZvbnRTaXplICE9PSBudWxsICYmIHdpZGdldEZvbnRTaXplICE9PSB2b2lkIDAgPyB3aWRnZXRGb250U2l6ZSA6IGZpZWxkRm9udFNpemUsXG4gICAgICAgICAgICBmb250OiBmb250LFxuICAgICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgIH0pO1xuICAgICAgICB0ZXh0TGluZXMgPSBbbGF5b3V0LmxpbmVdO1xuICAgICAgICBmb250U2l6ZSA9IGxheW91dC5mb250U2l6ZTtcbiAgICB9XG4gICAgLy8gVXBkYXRlIGZvbnQgc2l6ZSBhbmQgY29sb3JcbiAgICB2YXIgdGV4dENvbG9yID0gKF9kID0gd2lkZ2V0Q29sb3IgIT09IG51bGwgJiYgd2lkZ2V0Q29sb3IgIT09IHZvaWQgMCA/IHdpZGdldENvbG9yIDogZmllbGRDb2xvcikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogYmxhY2s7XG4gICAgaWYgKHdpZGdldENvbG9yIHx8IHdpZGdldEZvbnRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uod2lkZ2V0LCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHRleHRGaWVsZC5hY3JvRmllbGQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgeDogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgeTogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlcldpZHRoOiBib3JkZXJXaWR0aCAhPT0gbnVsbCAmJiBib3JkZXJXaWR0aCAhPT0gdm9pZCAwID8gYm9yZGVyV2lkdGggOiAwLFxuICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gICAgICAgIHRleHRDb2xvcjogdGV4dENvbG9yLFxuICAgICAgICBmb250OiBmb250Lm5hbWUsXG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvcixcbiAgICAgICAgdGV4dExpbmVzOiB0ZXh0TGluZXMsXG4gICAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgfTtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3VGV4dEZpZWxkKG9wdGlvbnMpKTtcbn07XG5leHBvcnQgdmFyIGRlZmF1bHREcm9wZG93bkFwcGVhcmFuY2VQcm92aWRlciA9IGZ1bmN0aW9uIChkcm9wZG93biwgd2lkZ2V0LCBmb250KSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcihkcm9wZG93bi5hY3JvRmllbGQpO1xuICAgIHZhciB3aWRnZXRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZSh3aWRnZXQpO1xuICAgIHZhciBmaWVsZEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKGRyb3Bkb3duLmFjcm9GaWVsZCk7XG4gICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgIHZhciB0ZXh0ID0gKF9hID0gZHJvcGRvd24uZ2V0U2VsZWN0ZWQoKVswXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gKF9iID0gYnMgPT09IG51bGwgfHwgYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJzLmdldFdpZHRoKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldFJvdGF0aW9uKCkpO1xuICAgIHZhciBfZCA9IGFkanVzdERpbXNGb3JSb3RhdGlvbihyZWN0YW5nbGUsIHJvdGF0aW9uKSwgd2lkdGggPSBfZC53aWR0aCwgaGVpZ2h0ID0gX2QuaGVpZ2h0O1xuICAgIHZhciByb3RhdGUgPSByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiByb3RhdGlvbiB9KSk7XG4gICAgdmFyIGJsYWNrID0gcmdiKDAsIDAsIDApO1xuICAgIHZhciBib3JkZXJDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCb3JkZXJDb2xvcigpKTtcbiAgICB2YXIgbm9ybWFsQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpKTtcbiAgICB2YXIgcGFkZGluZyA9IDE7XG4gICAgdmFyIGJvdW5kcyA9IHtcbiAgICAgICAgeDogYm9yZGVyV2lkdGggKyBwYWRkaW5nLFxuICAgICAgICB5OiBib3JkZXJXaWR0aCArIHBhZGRpbmcsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIChib3JkZXJXaWR0aCArIHBhZGRpbmcpICogMixcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSAoYm9yZGVyV2lkdGggKyBwYWRkaW5nKSAqIDIsXG4gICAgfTtcbiAgICB2YXIgX2UgPSBsYXlvdXRTaW5nbGVsaW5lVGV4dCh0ZXh0LCB7XG4gICAgICAgIGFsaWdubWVudDogVGV4dEFsaWdubWVudC5MZWZ0LFxuICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgfSksIGxpbmUgPSBfZS5saW5lLCBmb250U2l6ZSA9IF9lLmZvbnRTaXplO1xuICAgIC8vIFVwZGF0ZSBmb250IHNpemUgYW5kIGNvbG9yXG4gICAgdmFyIHRleHRDb2xvciA9IChfYyA9IHdpZGdldENvbG9yICE9PSBudWxsICYmIHdpZGdldENvbG9yICE9PSB2b2lkIDAgPyB3aWRnZXRDb2xvciA6IGZpZWxkQ29sb3IpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGJsYWNrO1xuICAgIGlmICh3aWRnZXRDb2xvciB8fCB3aWRnZXRGb250U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHdpZGdldCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZShkcm9wZG93bi5hY3JvRmllbGQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgeDogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgeTogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlcldpZHRoOiBib3JkZXJXaWR0aCAhPT0gbnVsbCAmJiBib3JkZXJXaWR0aCAhPT0gdm9pZCAwID8gYm9yZGVyV2lkdGggOiAwLFxuICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gICAgICAgIHRleHRDb2xvcjogdGV4dENvbG9yLFxuICAgICAgICBmb250OiBmb250Lm5hbWUsXG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvcixcbiAgICAgICAgdGV4dExpbmVzOiBbbGluZV0sXG4gICAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgfTtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3VGV4dEZpZWxkKG9wdGlvbnMpKTtcbn07XG5leHBvcnQgdmFyIGRlZmF1bHRPcHRpb25MaXN0QXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKG9wdGlvbkxpc3QsIHdpZGdldCwgZm9udCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcihvcHRpb25MaXN0LmFjcm9GaWVsZCk7XG4gICAgdmFyIHdpZGdldEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkRm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUob3B0aW9uTGlzdC5hY3JvRmllbGQpO1xuICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2EgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9jID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9jLndpZHRoLCBoZWlnaHQgPSBfYy5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciBvcHRpb25zID0gb3B0aW9uTGlzdC5nZXRPcHRpb25zKCk7XG4gICAgdmFyIHNlbGVjdGVkID0gb3B0aW9uTGlzdC5nZXRTZWxlY3RlZCgpO1xuICAgIGlmIChvcHRpb25MaXN0LmlzU29ydGVkKCkpXG4gICAgICAgIG9wdGlvbnMuc29ydCgpO1xuICAgIHZhciB0ZXh0ID0gJyc7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdGV4dCArPSBvcHRpb25zW2lkeF07XG4gICAgICAgIGlmIChpZHggPCBsZW4gLSAxKVxuICAgICAgICAgICAgdGV4dCArPSAnXFxuJztcbiAgICB9XG4gICAgdmFyIHBhZGRpbmcgPSAxO1xuICAgIHZhciBib3VuZHMgPSB7XG4gICAgICAgIHg6IGJvcmRlcldpZHRoICsgcGFkZGluZyxcbiAgICAgICAgeTogYm9yZGVyV2lkdGggKyBwYWRkaW5nLFxuICAgICAgICB3aWR0aDogd2lkdGggLSAoYm9yZGVyV2lkdGggKyBwYWRkaW5nKSAqIDIsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gKGJvcmRlcldpZHRoICsgcGFkZGluZykgKiAyLFxuICAgIH07XG4gICAgdmFyIF9kID0gbGF5b3V0TXVsdGlsaW5lVGV4dCh0ZXh0LCB7XG4gICAgICAgIGFsaWdubWVudDogVGV4dEFsaWdubWVudC5MZWZ0LFxuICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgfSksIGxpbmVzID0gX2QubGluZXMsIGZvbnRTaXplID0gX2QuZm9udFNpemUsIGxpbmVIZWlnaHQgPSBfZC5saW5lSGVpZ2h0O1xuICAgIHZhciBzZWxlY3RlZExpbmVzID0gW107XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gbGluZXNbaWR4XTtcbiAgICAgICAgaWYgKHNlbGVjdGVkLmluY2x1ZGVzKGxpbmUudGV4dCkpXG4gICAgICAgICAgICBzZWxlY3RlZExpbmVzLnB1c2goaWR4KTtcbiAgICB9XG4gICAgdmFyIGJsdWUgPSByZ2IoMTUzIC8gMjU1LCAxOTMgLyAyNTUsIDIxOCAvIDI1NSk7XG4gICAgLy8gVXBkYXRlIGZvbnQgc2l6ZSBhbmQgY29sb3JcbiAgICB2YXIgdGV4dENvbG9yID0gKF9iID0gd2lkZ2V0Q29sb3IgIT09IG51bGwgJiYgd2lkZ2V0Q29sb3IgIT09IHZvaWQgMCA/IHdpZGdldENvbG9yIDogZmllbGRDb2xvcikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogYmxhY2s7XG4gICAgaWYgKHdpZGdldENvbG9yIHx8IHdpZGdldEZvbnRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uod2lkZ2V0LCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKG9wdGlvbkxpc3QuYWNyb0ZpZWxkLCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd09wdGlvbkxpc3Qoe1xuICAgICAgICB4OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB5OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoICE9PSBudWxsICYmIGJvcmRlcldpZHRoICE9PSB2b2lkIDAgPyBib3JkZXJXaWR0aCA6IDAsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgdGV4dENvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IGZvbnQubmFtZSxcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLFxuICAgICAgICB0ZXh0TGluZXM6IGxpbmVzLFxuICAgICAgICBsaW5lSGVpZ2h0OiBsaW5lSGVpZ2h0LFxuICAgICAgICBzZWxlY3RlZENvbG9yOiBibHVlLFxuICAgICAgICBzZWxlY3RlZExpbmVzOiBzZWxlY3RlZExpbmVzLFxuICAgICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIH0pKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHBlYXJhbmNlcy5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZCdXR0b24gfSBmcm9tIFwiLi9QREZCdXR0b25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQ2hlY2tCb3ggfSBmcm9tIFwiLi9QREZDaGVja0JveFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZEcm9wZG93biB9IGZyb20gXCIuL1BERkRyb3Bkb3duXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkZpZWxkIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRm9ybSB9IGZyb20gXCIuL1BERkZvcm1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT3B0aW9uTGlzdCB9IGZyb20gXCIuL1BERk9wdGlvbkxpc3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUmFkaW9Hcm91cCB9IGZyb20gXCIuL1BERlJhZGlvR3JvdXBcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGU2lnbmF0dXJlIH0gZnJvbSBcIi4vUERGU2lnbmF0dXJlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlRleHRGaWVsZCB9IGZyb20gXCIuL1BERlRleHRGaWVsZFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IHZhciBJbWFnZUFsaWdubWVudDtcbihmdW5jdGlvbiAoSW1hZ2VBbGlnbm1lbnQpIHtcbiAgICBJbWFnZUFsaWdubWVudFtJbWFnZUFsaWdubWVudFtcIkxlZnRcIl0gPSAwXSA9IFwiTGVmdFwiO1xuICAgIEltYWdlQWxpZ25tZW50W0ltYWdlQWxpZ25tZW50W1wiQ2VudGVyXCJdID0gMV0gPSBcIkNlbnRlclwiO1xuICAgIEltYWdlQWxpZ25tZW50W0ltYWdlQWxpZ25tZW50W1wiUmlnaHRcIl0gPSAyXSA9IFwiUmlnaHRcIjtcbn0pKEltYWdlQWxpZ25tZW50IHx8IChJbWFnZUFsaWdubWVudCA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGlnbm1lbnQuanMubWFwIiwiZXhwb3J0ICogZnJvbSBcIi4vYWxpZ25tZW50XCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9mb3JtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb2xvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29iamVjdHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29wZXJhdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29wZXJhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcm90YXRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zaXplc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUERGUGFnZU9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1BERkRvY3VtZW50T3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vU3RhbmRhcmRGb250c1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZEb2N1bWVudCB9IGZyb20gXCIuL1BERkRvY3VtZW50XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkZvbnQgfSBmcm9tIFwiLi9QREZGb250XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkltYWdlIH0gZnJvbSBcIi4vUERGSW1hZ2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUGFnZSB9IGZyb20gXCIuL1BERlBhZ2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRW1iZWRkZWRQYWdlIH0gZnJvbSBcIi4vUERGRW1iZWRkZWRQYWdlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkphdmFTY3JpcHQgfSBmcm9tIFwiLi9QREZKYXZhU2NyaXB0XCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBQREZOYW1lLCBQREZOdW1iZXIgfSBmcm9tIFwiLi4vY29yZVwiO1xuZXhwb3J0IHZhciBhc1BERk5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBuYW1lIGluc3RhbmNlb2YgUERGTmFtZSA/IG5hbWUgOiBQREZOYW1lLm9mKG5hbWUpO1xufTtcbmV4cG9ydCB2YXIgYXNQREZOdW1iZXIgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgcmV0dXJuIG51bSBpbnN0YW5jZW9mIFBERk51bWJlciA/IG51bSA6IFBERk51bWJlci5vZihudW0pO1xufTtcbmV4cG9ydCB2YXIgYXNOdW1iZXIgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgcmV0dXJuIG51bSBpbnN0YW5jZW9mIFBERk51bWJlciA/IG51bS5hc051bWJlcigpIDogbnVtO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdHMuanMubWFwIiwiaW1wb3J0IHsgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHNldEZpbGxpbmdDb2xvciwgc2V0U3Ryb2tpbmdDb2xvciB9IGZyb20gXCIuL2NvbG9yc1wiO1xuaW1wb3J0IHsgYmVnaW5UZXh0LCBjbG9zZVBhdGgsIGRyYXdPYmplY3QsIGVuZFRleHQsIGZpbGwsIGZpbGxBbmRTdHJva2UsIGxpbmVUbywgbW92ZVRvLCBuZXh0TGluZSwgcG9wR3JhcGhpY3NTdGF0ZSwgcHVzaEdyYXBoaWNzU3RhdGUsIHJvdGF0ZUFuZFNrZXdUZXh0UmFkaWFuc0FuZFRyYW5zbGF0ZSwgcm90YXRlUmFkaWFucywgc2NhbGUsIHNldEZvbnRBbmRTaXplLCBzZXRMaW5lSGVpZ2h0LCBzZXRMaW5lV2lkdGgsIHNob3dUZXh0LCBza2V3UmFkaWFucywgc3Ryb2tlLCB0cmFuc2xhdGUsIHNldExpbmVDYXAsIHJvdGF0ZURlZ3JlZXMsIHNldEdyYXBoaWNzU3RhdGUsIHNldERhc2hQYXR0ZXJuLCBiZWdpbk1hcmtlZENvbnRlbnQsIGVuZE1hcmtlZENvbnRlbnQsIGNsaXAsIGVuZFBhdGgsIGFwcGVuZEJlemllckN1cnZlLCB9IGZyb20gXCIuL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgZGVncmVlcywgdG9SYWRpYW5zIH0gZnJvbSBcIi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBzdmdQYXRoVG9PcGVyYXRvcnMgfSBmcm9tIFwiLi9zdmdQYXRoXCI7XG5pbXBvcnQgeyBhc051bWJlciB9IGZyb20gXCIuL29iamVjdHNcIjtcbmV4cG9ydCB2YXIgZHJhd1RleHQgPSBmdW5jdGlvbiAobGluZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIGJlZ2luVGV4dCgpLFxuICAgICAgICBzZXRGaWxsaW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIHNldEZvbnRBbmRTaXplKG9wdGlvbnMuZm9udCwgb3B0aW9ucy5zaXplKSxcbiAgICAgICAgcm90YXRlQW5kU2tld1RleHRSYWRpYW5zQW5kVHJhbnNsYXRlKHRvUmFkaWFucyhvcHRpb25zLnJvdGF0ZSksIHRvUmFkaWFucyhvcHRpb25zLnhTa2V3KSwgdG9SYWRpYW5zKG9wdGlvbnMueVNrZXcpLCBvcHRpb25zLngsIG9wdGlvbnMueSksXG4gICAgICAgIHNob3dUZXh0KGxpbmUpLFxuICAgICAgICBlbmRUZXh0KCksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbn07XG5leHBvcnQgdmFyIGRyYXdMaW5lc09mVGV4dCA9IGZ1bmN0aW9uIChsaW5lcywgb3B0aW9ucykge1xuICAgIHZhciBvcGVyYXRvcnMgPSBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIGJlZ2luVGV4dCgpLFxuICAgICAgICBzZXRGaWxsaW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIHNldEZvbnRBbmRTaXplKG9wdGlvbnMuZm9udCwgb3B0aW9ucy5zaXplKSxcbiAgICAgICAgc2V0TGluZUhlaWdodChvcHRpb25zLmxpbmVIZWlnaHQpLFxuICAgICAgICByb3RhdGVBbmRTa2V3VGV4dFJhZGlhbnNBbmRUcmFuc2xhdGUodG9SYWRpYW5zKG9wdGlvbnMucm90YXRlKSwgdG9SYWRpYW5zKG9wdGlvbnMueFNrZXcpLCB0b1JhZGlhbnMob3B0aW9ucy55U2tldyksIG9wdGlvbnMueCwgb3B0aW9ucy55KSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgb3BlcmF0b3JzLnB1c2goc2hvd1RleHQobGluZXNbaWR4XSksIG5leHRMaW5lKCkpO1xuICAgIH1cbiAgICBvcGVyYXRvcnMucHVzaChlbmRUZXh0KCksIHBvcEdyYXBoaWNzU3RhdGUoKSk7XG4gICAgcmV0dXJuIG9wZXJhdG9ycztcbn07XG5leHBvcnQgdmFyIGRyYXdJbWFnZSA9IGZ1bmN0aW9uIChuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgdHJhbnNsYXRlKG9wdGlvbnMueCwgb3B0aW9ucy55KSxcbiAgICAgICAgcm90YXRlUmFkaWFucyh0b1JhZGlhbnMob3B0aW9ucy5yb3RhdGUpKSxcbiAgICAgICAgc2NhbGUob3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQpLFxuICAgICAgICBza2V3UmFkaWFucyh0b1JhZGlhbnMob3B0aW9ucy54U2tldyksIHRvUmFkaWFucyhvcHRpb25zLnlTa2V3KSksXG4gICAgICAgIGRyYXdPYmplY3QobmFtZSksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbn07XG5leHBvcnQgdmFyIGRyYXdQYWdlID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgICAgICByb3RhdGVSYWRpYW5zKHRvUmFkaWFucyhvcHRpb25zLnJvdGF0ZSkpLFxuICAgICAgICBzY2FsZShvcHRpb25zLnhTY2FsZSwgb3B0aW9ucy55U2NhbGUpLFxuICAgICAgICBza2V3UmFkaWFucyh0b1JhZGlhbnMob3B0aW9ucy54U2tldyksIHRvUmFkaWFucyhvcHRpb25zLnlTa2V3KSksXG4gICAgICAgIGRyYXdPYmplY3QobmFtZSksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbn07XG5leHBvcnQgdmFyIGRyYXdMaW5lID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgc2V0U3Ryb2tpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgc2V0TGluZVdpZHRoKG9wdGlvbnMudGhpY2tuZXNzKSxcbiAgICAgICAgc2V0RGFzaFBhdHRlcm4oKF9hID0gb3B0aW9ucy5kYXNoQXJyYXkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdLCAoX2IgPSBvcHRpb25zLmRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCksXG4gICAgICAgIG1vdmVUbyhvcHRpb25zLnN0YXJ0LngsIG9wdGlvbnMuc3RhcnQueSksXG4gICAgICAgIG9wdGlvbnMubGluZUNhcCAmJiBzZXRMaW5lQ2FwKG9wdGlvbnMubGluZUNhcCksXG4gICAgICAgIG1vdmVUbyhvcHRpb25zLnN0YXJ0LngsIG9wdGlvbnMuc3RhcnQueSksXG4gICAgICAgIGxpbmVUbyhvcHRpb25zLmVuZC54LCBvcHRpb25zLmVuZC55KSxcbiAgICAgICAgc3Ryb2tlKCksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbn07XG5leHBvcnQgdmFyIGRyYXdSZWN0YW5nbGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBzZXRGaWxsaW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgJiYgc2V0U3Ryb2tpbmdDb2xvcihvcHRpb25zLmJvcmRlckNvbG9yKSxcbiAgICAgICAgc2V0TGluZVdpZHRoKG9wdGlvbnMuYm9yZGVyV2lkdGgpLFxuICAgICAgICBvcHRpb25zLmJvcmRlckxpbmVDYXAgJiYgc2V0TGluZUNhcChvcHRpb25zLmJvcmRlckxpbmVDYXApLFxuICAgICAgICBzZXREYXNoUGF0dGVybigoX2EgPSBvcHRpb25zLmJvcmRlckRhc2hBcnJheSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10sIChfYiA9IG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwKSxcbiAgICAgICAgdHJhbnNsYXRlKG9wdGlvbnMueCwgb3B0aW9ucy55KSxcbiAgICAgICAgcm90YXRlUmFkaWFucyh0b1JhZGlhbnMob3B0aW9ucy5yb3RhdGUpKSxcbiAgICAgICAgc2tld1JhZGlhbnModG9SYWRpYW5zKG9wdGlvbnMueFNrZXcpLCB0b1JhZGlhbnMob3B0aW9ucy55U2tldykpLFxuICAgICAgICBtb3ZlVG8oMCwgMCksXG4gICAgICAgIGxpbmVUbygwLCBvcHRpb25zLmhlaWdodCksXG4gICAgICAgIGxpbmVUbyhvcHRpb25zLndpZHRoLCBvcHRpb25zLmhlaWdodCksXG4gICAgICAgIGxpbmVUbyhvcHRpb25zLndpZHRoLCAwKSxcbiAgICAgICAgY2xvc2VQYXRoKCksXG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIG9wdGlvbnMuYm9yZGVyV2lkdGggPyBmaWxsQW5kU3Ryb2tlKClcbiAgICAgICAgICAgIDogb3B0aW9ucy5jb2xvciA/IGZpbGwoKVxuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5ib3JkZXJDb2xvciA/IHN0cm9rZSgpXG4gICAgICAgICAgICAgICAgICAgIDogY2xvc2VQYXRoKCksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbn07XG52YXIgS0FQUEEgPSA0LjAgKiAoKE1hdGguc3FydCgyKSAtIDEuMCkgLyAzLjApO1xuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgdmFyIGRyYXdFbGxpcHNlUGF0aCA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICB2YXIgeCA9IGFzTnVtYmVyKGNvbmZpZy54KTtcbiAgICB2YXIgeSA9IGFzTnVtYmVyKGNvbmZpZy55KTtcbiAgICB2YXIgeFNjYWxlID0gYXNOdW1iZXIoY29uZmlnLnhTY2FsZSk7XG4gICAgdmFyIHlTY2FsZSA9IGFzTnVtYmVyKGNvbmZpZy55U2NhbGUpO1xuICAgIHggLT0geFNjYWxlO1xuICAgIHkgLT0geVNjYWxlO1xuICAgIHZhciBveCA9IHhTY2FsZSAqIEtBUFBBO1xuICAgIHZhciBveSA9IHlTY2FsZSAqIEtBUFBBO1xuICAgIHZhciB4ZSA9IHggKyB4U2NhbGUgKiAyO1xuICAgIHZhciB5ZSA9IHkgKyB5U2NhbGUgKiAyO1xuICAgIHZhciB4bSA9IHggKyB4U2NhbGU7XG4gICAgdmFyIHltID0geSArIHlTY2FsZTtcbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBtb3ZlVG8oeCwgeW0pLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4LCB5bSAtIG95LCB4bSAtIG94LCB5LCB4bSwgeSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhtICsgb3gsIHksIHhlLCB5bSAtIG95LCB4ZSwgeW0pLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4ZSwgeW0gKyBveSwgeG0gKyBveCwgeWUsIHhtLCB5ZSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhtIC0gb3gsIHllLCB4LCB5bSArIG95LCB4LCB5bSksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdO1xufTtcbnZhciBkcmF3RWxsaXBzZUN1cnZlcyA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICB2YXIgY2VudGVyWCA9IGFzTnVtYmVyKGNvbmZpZy54KTtcbiAgICB2YXIgY2VudGVyWSA9IGFzTnVtYmVyKGNvbmZpZy55KTtcbiAgICB2YXIgeFNjYWxlID0gYXNOdW1iZXIoY29uZmlnLnhTY2FsZSk7XG4gICAgdmFyIHlTY2FsZSA9IGFzTnVtYmVyKGNvbmZpZy55U2NhbGUpO1xuICAgIHZhciB4ID0gLXhTY2FsZTtcbiAgICB2YXIgeSA9IC15U2NhbGU7XG4gICAgdmFyIG94ID0geFNjYWxlICogS0FQUEE7XG4gICAgdmFyIG95ID0geVNjYWxlICogS0FQUEE7XG4gICAgdmFyIHhlID0geCArIHhTY2FsZSAqIDI7XG4gICAgdmFyIHllID0geSArIHlTY2FsZSAqIDI7XG4gICAgdmFyIHhtID0geCArIHhTY2FsZTtcbiAgICB2YXIgeW0gPSB5ICsgeVNjYWxlO1xuICAgIHJldHVybiBbXG4gICAgICAgIHRyYW5zbGF0ZShjZW50ZXJYLCBjZW50ZXJZKSxcbiAgICAgICAgcm90YXRlUmFkaWFucyh0b1JhZGlhbnMoY29uZmlnLnJvdGF0ZSkpLFxuICAgICAgICBtb3ZlVG8oeCwgeW0pLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4LCB5bSAtIG95LCB4bSAtIG94LCB5LCB4bSwgeSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhtICsgb3gsIHksIHhlLCB5bSAtIG95LCB4ZSwgeW0pLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4ZSwgeW0gKyBveSwgeG0gKyBveCwgeWUsIHhtLCB5ZSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhtIC0gb3gsIHllLCB4LCB5bSArIG95LCB4LCB5bSksXG4gICAgXTtcbn07XG5leHBvcnQgdmFyIGRyYXdFbGxpcHNlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIHNldEZpbGxpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciAmJiBzZXRTdHJva2luZ0NvbG9yKG9wdGlvbnMuYm9yZGVyQ29sb3IpLFxuICAgICAgICBzZXRMaW5lV2lkdGgob3B0aW9ucy5ib3JkZXJXaWR0aCksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyTGluZUNhcCAmJiBzZXRMaW5lQ2FwKG9wdGlvbnMuYm9yZGVyTGluZUNhcCksXG4gICAgICAgIHNldERhc2hQYXR0ZXJuKChfYSA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXSwgKF9iID0gb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDApXG4gICAgXSwgKG9wdGlvbnMucm90YXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBkcmF3RWxsaXBzZVBhdGgoe1xuICAgICAgICAgICAgeDogb3B0aW9ucy54LFxuICAgICAgICAgICAgeTogb3B0aW9ucy55LFxuICAgICAgICAgICAgeFNjYWxlOiBvcHRpb25zLnhTY2FsZSxcbiAgICAgICAgICAgIHlTY2FsZTogb3B0aW9ucy55U2NhbGUsXG4gICAgICAgIH0pXG4gICAgICAgIDogZHJhd0VsbGlwc2VDdXJ2ZXMoe1xuICAgICAgICAgICAgeDogb3B0aW9ucy54LFxuICAgICAgICAgICAgeTogb3B0aW9ucy55LFxuICAgICAgICAgICAgeFNjYWxlOiBvcHRpb25zLnhTY2FsZSxcbiAgICAgICAgICAgIHlTY2FsZTogb3B0aW9ucy55U2NhbGUsXG4gICAgICAgICAgICByb3RhdGU6IChfYyA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBkZWdyZWVzKDApLFxuICAgICAgICB9KSksIFtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgb3B0aW9ucy5ib3JkZXJXaWR0aCA/IGZpbGxBbmRTdHJva2UoKVxuICAgICAgICAgICAgOiBvcHRpb25zLmNvbG9yID8gZmlsbCgpXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zLmJvcmRlckNvbG9yID8gc3Ryb2tlKClcbiAgICAgICAgICAgICAgICAgICAgOiBjbG9zZVBhdGgoKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0pLmZpbHRlcihCb29sZWFuKTtcbn07XG5leHBvcnQgdmFyIGRyYXdTdmdQYXRoID0gZnVuY3Rpb24gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgICAgICByb3RhdGVSYWRpYW5zKHRvUmFkaWFucygoX2EgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZGVncmVlcygwKSkpLFxuICAgICAgICAvLyBTVkcgcGF0aCBZIGF4aXMgaXMgb3Bwb3NpdGUgcGRmLWxpYidzXG4gICAgICAgIG9wdGlvbnMuc2NhbGUgPyBzY2FsZShvcHRpb25zLnNjYWxlLCAtb3B0aW9ucy5zY2FsZSkgOiBzY2FsZSgxLCAtMSksXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgc2V0RmlsbGluZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yICYmIHNldFN0cm9raW5nQ29sb3Iob3B0aW9ucy5ib3JkZXJDb2xvciksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyV2lkdGggJiYgc2V0TGluZVdpZHRoKG9wdGlvbnMuYm9yZGVyV2lkdGgpLFxuICAgICAgICBvcHRpb25zLmJvcmRlckxpbmVDYXAgJiYgc2V0TGluZUNhcChvcHRpb25zLmJvcmRlckxpbmVDYXApLFxuICAgICAgICBzZXREYXNoUGF0dGVybigoX2IgPSBvcHRpb25zLmJvcmRlckRhc2hBcnJheSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW10sIChfYyA9IG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwKVxuICAgIF0sIHN2Z1BhdGhUb09wZXJhdG9ycyhwYXRoKSwgW1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBvcHRpb25zLmJvcmRlcldpZHRoID8gZmlsbEFuZFN0cm9rZSgpXG4gICAgICAgICAgICA6IG9wdGlvbnMuY29sb3IgPyBmaWxsKClcbiAgICAgICAgICAgICAgICA6IG9wdGlvbnMuYm9yZGVyQ29sb3IgPyBzdHJva2UoKVxuICAgICAgICAgICAgICAgICAgICA6IGNsb3NlUGF0aCgpLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXSkuZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd0NoZWNrTWFyayA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHNpemUgPSBhc051bWJlcihvcHRpb25zLnNpemUpO1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiBEZWZpbmUgQ2hlY2sgTWFyayBQb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8vIEEgY2hlY2sgbWFyayBpcyBkZWZpbmVkIGJ5IHRocmVlIHBvaW50cyBpbiBzb21lIGNvb3JkaW5hdGUgc3BhY2UuIEhlcmUsIHdlXG4gICAgLy8gZGVmaW5lIHRoZXNlIHBvaW50cyBpbiBhIHVuaXQgY29vcmRpbmF0ZSBzeXN0ZW0sIHdoZXJlIHRoZSByYW5nZSBvZiB0aGUgeFxuICAgIC8vIGFuZCB5IGF4aXMgYXJlIGJvdGggWy0xLCAxXS5cbiAgICAvL1xuICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBub3QgaGFyZCBjb2RlIGBwMXlgIGluIGNhc2Ugd2Ugd2lzaCB0byBjaGFuZ2UgdGhlXG4gICAgLy8gc2l6ZS9zaGFwZSBvZiB0aGUgY2hlY2sgbWFyayBpbiB0aGUgZnV0dXJlLiBXZSB3YW50IHRoZSBjaGVjayBtYXJrIHRvXG4gICAgLy8gYWx3YXlzIGZvcm0gYSByaWdodCBhbmdsZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBkb3QgcHJvZHVjdCBiZXR3ZWVuIChwMS1wMilcbiAgICAvLyBhbmQgKHAzLXAyKSBzaG91bGQgYmUgemVybzpcbiAgICAvL1xuICAgIC8vICAgKHAxeC1wMngpICogKHAzeC1wMngpICsgKHAxeS1wMnkpICogKHAzeS1wMnkpID0gMFxuICAgIC8vXG4gICAgLy8gV2UgY2FuIG5vdyByZWppZ2dlciB0aGlzIGVxdWF0aW9uIHRvIHNvbHZlIGZvciBgcDF5YDpcbiAgICAvL1xuICAgIC8vICAgKHAxeS1wMnkpICogKHAzeS1wMnkpID0gLSgocDF4LXAyeCkgKiAocDN4LXAyeCkpXG4gICAgLy8gICAocDF5LXAyeSkgPSAtKChwMXgtcDJ4KSAqIChwM3gtcDJ4KSkgLyAocDN5LXAyeSlcbiAgICAvLyAgIHAxeSA9IC0oKHAxeC1wMngpICogKHAzeC1wMngpKSAvIChwM3ktcDJ5KSArIHAyeVxuICAgIC8vXG4gICAgLy8gVGhhbmtzIHRvIG15IGZyaWVuZCBKb2VsIFdhbGtlciAoaHR0cHM6Ly9naXRodWIuY29tL0pXYWxrZXIxOTk1KSBmb3JcbiAgICAvLyBkZXZpc2luZyB0aGUgYWJvdmUgZXF1YXRpb24gYW5kIHVuaXQgY29vcmRpbmF0ZSBzeXN0ZW0gYXBwcm9hY2ghXG4gICAgLy8gKHgsIHkpIGNvb3JkcyBvZiB0aGUgY2hlY2sgbWFyaydzIGJvdHRvbW1vc3QgcG9pbnRcbiAgICB2YXIgcDJ4ID0gLTEgKyAwLjc1O1xuICAgIHZhciBwMnkgPSAtMSArIDAuNTE7XG4gICAgLy8gKHgsIHkpIGNvb3JkcyBvZiB0aGUgY2hlY2sgbWFyaydzIHRvcG1vc3QgcG9pbnRcbiAgICB2YXIgcDN5ID0gMSAtIDAuNTI1O1xuICAgIHZhciBwM3ggPSAxIC0gMC4zMTtcbiAgICAvLyAoeCwgeSkgY29vcmRzIG9mIHRoZSBjaGVjayBtYXJrJ3MgY2VudGVyICh2ZXJ0aWNhbGx5KSBwb2ludFxuICAgIHZhciBwMXggPSAtMSArIDAuMzI1O1xuICAgIHZhciBwMXkgPSAtKChwMXggLSBwMngpICogKHAzeCAtIHAyeCkpIC8gKHAzeSAtIHAyeSkgKyBwMnk7XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBzZXRTdHJva2luZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBzZXRMaW5lV2lkdGgob3B0aW9ucy50aGlja25lc3MpLFxuICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgICAgICBtb3ZlVG8ocDF4ICogc2l6ZSwgcDF5ICogc2l6ZSksXG4gICAgICAgIGxpbmVUbyhwMnggKiBzaXplLCBwMnkgKiBzaXplKSxcbiAgICAgICAgbGluZVRvKHAzeCAqIHNpemUsIHAzeSAqIHNpemUpLFxuICAgICAgICBzdHJva2UoKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciByb3RhdGVJblBsYWNlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5yb3RhdGlvbiA9PT0gMCA/IFtcbiAgICAgICAgdHJhbnNsYXRlKDAsIDApLFxuICAgICAgICByb3RhdGVEZWdyZWVzKDApXG4gICAgXVxuICAgICAgICA6IG9wdGlvbnMucm90YXRpb24gPT09IDkwID8gW1xuICAgICAgICAgICAgdHJhbnNsYXRlKG9wdGlvbnMud2lkdGgsIDApLFxuICAgICAgICAgICAgcm90YXRlRGVncmVlcyg5MClcbiAgICAgICAgXVxuICAgICAgICAgICAgOiBvcHRpb25zLnJvdGF0aW9uID09PSAxODAgPyBbXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlKG9wdGlvbnMud2lkdGgsIG9wdGlvbnMuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICByb3RhdGVEZWdyZWVzKDE4MClcbiAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICA6IG9wdGlvbnMucm90YXRpb24gPT09IDI3MCA/IFtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlKDAsIG9wdGlvbnMuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgcm90YXRlRGVncmVlcygyNzApXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICA6IFtdO1xufTsgLy8gSW52YWxpZCByb3RhdGlvbiAtIG5vb3BcbmV4cG9ydCB2YXIgZHJhd0NoZWNrQm94ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgb3V0bGluZSA9IGRyYXdSZWN0YW5nbGUoe1xuICAgICAgICB4OiBvcHRpb25zLngsXG4gICAgICAgIHk6IG9wdGlvbnMueSxcbiAgICAgICAgd2lkdGg6IG9wdGlvbnMud2lkdGgsXG4gICAgICAgIGhlaWdodDogb3B0aW9ucy5oZWlnaHQsXG4gICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIGlmICghb3B0aW9ucy5maWxsZWQpXG4gICAgICAgIHJldHVybiBvdXRsaW5lO1xuICAgIHZhciB3aWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSBhc051bWJlcihvcHRpb25zLmhlaWdodCk7XG4gICAgdmFyIGNoZWNrTWFya1NpemUgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDI7XG4gICAgdmFyIGNoZWNrTWFyayA9IGRyYXdDaGVja01hcmsoe1xuICAgICAgICB4OiB3aWR0aCAvIDIsXG4gICAgICAgIHk6IGhlaWdodCAvIDIsXG4gICAgICAgIHNpemU6IGNoZWNrTWFya1NpemUsXG4gICAgICAgIHRoaWNrbmVzczogb3B0aW9ucy50aGlja25lc3MsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLm1hcmtDb2xvcixcbiAgICB9KTtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW3B1c2hHcmFwaGljc1N0YXRlKCldLCBvdXRsaW5lLCBjaGVja01hcmssIFtwb3BHcmFwaGljc1N0YXRlKCldKTtcbn07XG5leHBvcnQgdmFyIGRyYXdSYWRpb0J1dHRvbiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHdpZHRoID0gYXNOdW1iZXIob3B0aW9ucy53aWR0aCk7XG4gICAgdmFyIGhlaWdodCA9IGFzTnVtYmVyKG9wdGlvbnMuaGVpZ2h0KTtcbiAgICB2YXIgb3V0bGluZVNjYWxlID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCkgLyAyO1xuICAgIHZhciBvdXRsaW5lID0gZHJhd0VsbGlwc2Uoe1xuICAgICAgICB4OiBvcHRpb25zLngsXG4gICAgICAgIHk6IG9wdGlvbnMueSxcbiAgICAgICAgeFNjYWxlOiBvdXRsaW5lU2NhbGUsXG4gICAgICAgIHlTY2FsZTogb3V0bGluZVNjYWxlLFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgIH0pO1xuICAgIGlmICghb3B0aW9ucy5maWxsZWQpXG4gICAgICAgIHJldHVybiBvdXRsaW5lO1xuICAgIHZhciBkb3QgPSBkcmF3RWxsaXBzZSh7XG4gICAgICAgIHg6IG9wdGlvbnMueCxcbiAgICAgICAgeTogb3B0aW9ucy55LFxuICAgICAgICB4U2NhbGU6IG91dGxpbmVTY2FsZSAqIDAuNDUsXG4gICAgICAgIHlTY2FsZTogb3V0bGluZVNjYWxlICogMC40NSxcbiAgICAgICAgY29sb3I6IG9wdGlvbnMuZG90Q29sb3IsXG4gICAgICAgIGJvcmRlckNvbG9yOiB1bmRlZmluZWQsXG4gICAgICAgIGJvcmRlcldpZHRoOiAwLFxuICAgIH0pO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbcHVzaEdyYXBoaWNzU3RhdGUoKV0sIG91dGxpbmUsIGRvdCwgW3BvcEdyYXBoaWNzU3RhdGUoKV0pO1xufTtcbmV4cG9ydCB2YXIgZHJhd0J1dHRvbiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHggPSBhc051bWJlcihvcHRpb25zLngpO1xuICAgIHZhciB5ID0gYXNOdW1iZXIob3B0aW9ucy55KTtcbiAgICB2YXIgd2lkdGggPSBhc051bWJlcihvcHRpb25zLndpZHRoKTtcbiAgICB2YXIgaGVpZ2h0ID0gYXNOdW1iZXIob3B0aW9ucy5oZWlnaHQpO1xuICAgIHZhciBiYWNrZ3JvdW5kID0gZHJhd1JlY3RhbmdsZSh7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIHZhciBsaW5lcyA9IGRyYXdUZXh0TGluZXMob3B0aW9ucy50ZXh0TGluZXMsIHtcbiAgICAgICAgY29sb3I6IG9wdGlvbnMudGV4dENvbG9yLFxuICAgICAgICBmb250OiBvcHRpb25zLmZvbnQsXG4gICAgICAgIHNpemU6IG9wdGlvbnMuZm9udFNpemUsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbcHVzaEdyYXBoaWNzU3RhdGUoKV0sIGJhY2tncm91bmQsIGxpbmVzLCBbcG9wR3JhcGhpY3NTdGF0ZSgpXSk7XG59O1xuZXhwb3J0IHZhciBkcmF3VGV4dExpbmVzID0gZnVuY3Rpb24gKGxpbmVzLCBvcHRpb25zKSB7XG4gICAgdmFyIG9wZXJhdG9ycyA9IFtcbiAgICAgICAgYmVnaW5UZXh0KCksXG4gICAgICAgIHNldEZpbGxpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgc2V0Rm9udEFuZFNpemUob3B0aW9ucy5mb250LCBvcHRpb25zLnNpemUpLFxuICAgIF07XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBfYSA9IGxpbmVzW2lkeF0sIGVuY29kZWQgPSBfYS5lbmNvZGVkLCB4ID0gX2EueCwgeSA9IF9hLnk7XG4gICAgICAgIG9wZXJhdG9ycy5wdXNoKHJvdGF0ZUFuZFNrZXdUZXh0UmFkaWFuc0FuZFRyYW5zbGF0ZSh0b1JhZGlhbnMob3B0aW9ucy5yb3RhdGUpLCB0b1JhZGlhbnMob3B0aW9ucy54U2tldyksIHRvUmFkaWFucyhvcHRpb25zLnlTa2V3KSwgeCwgeSksIHNob3dUZXh0KGVuY29kZWQpKTtcbiAgICB9XG4gICAgb3BlcmF0b3JzLnB1c2goZW5kVGV4dCgpKTtcbiAgICByZXR1cm4gb3BlcmF0b3JzO1xufTtcbmV4cG9ydCB2YXIgZHJhd1RleHRGaWVsZCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHggPSBhc051bWJlcihvcHRpb25zLngpO1xuICAgIHZhciB5ID0gYXNOdW1iZXIob3B0aW9ucy55KTtcbiAgICB2YXIgd2lkdGggPSBhc051bWJlcihvcHRpb25zLndpZHRoKTtcbiAgICB2YXIgaGVpZ2h0ID0gYXNOdW1iZXIob3B0aW9ucy5oZWlnaHQpO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMuYm9yZGVyV2lkdGgpO1xuICAgIHZhciBwYWRkaW5nID0gYXNOdW1iZXIob3B0aW9ucy5wYWRkaW5nKTtcbiAgICB2YXIgY2xpcFggPSB4ICsgYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZztcbiAgICB2YXIgY2xpcFkgPSB5ICsgYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZztcbiAgICB2YXIgY2xpcFdpZHRoID0gd2lkdGggLSAoYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZykgKiAyO1xuICAgIHZhciBjbGlwSGVpZ2h0ID0gaGVpZ2h0IC0gKGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmcpICogMjtcbiAgICB2YXIgY2xpcHBpbmdBcmVhID0gW1xuICAgICAgICBtb3ZlVG8oY2xpcFgsIGNsaXBZKSxcbiAgICAgICAgbGluZVRvKGNsaXBYLCBjbGlwWSArIGNsaXBIZWlnaHQpLFxuICAgICAgICBsaW5lVG8oY2xpcFggKyBjbGlwV2lkdGgsIGNsaXBZICsgY2xpcEhlaWdodCksXG4gICAgICAgIGxpbmVUbyhjbGlwWCArIGNsaXBXaWR0aCwgY2xpcFkpLFxuICAgICAgICBjbG9zZVBhdGgoKSxcbiAgICAgICAgY2xpcCgpLFxuICAgICAgICBlbmRQYXRoKCksXG4gICAgXTtcbiAgICB2YXIgYmFja2dyb3VuZCA9IGRyYXdSZWN0YW5nbGUoe1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcbiAgICAgICAgY29sb3I6IG9wdGlvbnMuY29sb3IsXG4gICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICB9KTtcbiAgICB2YXIgbGluZXMgPSBkcmF3VGV4dExpbmVzKG9wdGlvbnMudGV4dExpbmVzLCB7XG4gICAgICAgIGNvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgZm9udDogb3B0aW9ucy5mb250LFxuICAgICAgICBzaXplOiBvcHRpb25zLmZvbnRTaXplLFxuICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICB9KTtcbiAgICB2YXIgbWFya2VkQ29udGVudCA9IF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgYmVnaW5NYXJrZWRDb250ZW50KCdUeCcpLFxuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpXG4gICAgXSwgbGluZXMsIFtcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBlbmRNYXJrZWRDb250ZW50KCksXG4gICAgXSk7XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKVxuICAgIF0sIGJhY2tncm91bmQsIGNsaXBwaW5nQXJlYSwgbWFya2VkQ29udGVudCwgW1xuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBkcmF3T3B0aW9uTGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHggPSBhc051bWJlcihvcHRpb25zLngpO1xuICAgIHZhciB5ID0gYXNOdW1iZXIob3B0aW9ucy55KTtcbiAgICB2YXIgd2lkdGggPSBhc051bWJlcihvcHRpb25zLndpZHRoKTtcbiAgICB2YXIgaGVpZ2h0ID0gYXNOdW1iZXIob3B0aW9ucy5oZWlnaHQpO1xuICAgIHZhciBsaW5lSGVpZ2h0ID0gYXNOdW1iZXIob3B0aW9ucy5saW5lSGVpZ2h0KTtcbiAgICB2YXIgYm9yZGVyV2lkdGggPSBhc051bWJlcihvcHRpb25zLmJvcmRlcldpZHRoKTtcbiAgICB2YXIgcGFkZGluZyA9IGFzTnVtYmVyKG9wdGlvbnMucGFkZGluZyk7XG4gICAgdmFyIGNsaXBYID0geCArIGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGNsaXBZID0geSArIGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGNsaXBXaWR0aCA9IHdpZHRoIC0gKGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmcpICogMjtcbiAgICB2YXIgY2xpcEhlaWdodCA9IGhlaWdodCAtIChib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nKSAqIDI7XG4gICAgdmFyIGNsaXBwaW5nQXJlYSA9IFtcbiAgICAgICAgbW92ZVRvKGNsaXBYLCBjbGlwWSksXG4gICAgICAgIGxpbmVUbyhjbGlwWCwgY2xpcFkgKyBjbGlwSGVpZ2h0KSxcbiAgICAgICAgbGluZVRvKGNsaXBYICsgY2xpcFdpZHRoLCBjbGlwWSArIGNsaXBIZWlnaHQpLFxuICAgICAgICBsaW5lVG8oY2xpcFggKyBjbGlwV2lkdGgsIGNsaXBZKSxcbiAgICAgICAgY2xvc2VQYXRoKCksXG4gICAgICAgIGNsaXAoKSxcbiAgICAgICAgZW5kUGF0aCgpLFxuICAgIF07XG4gICAgdmFyIGJhY2tncm91bmQgPSBkcmF3UmVjdGFuZ2xlKHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeSxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IG9wdGlvbnMuYm9yZGVyV2lkdGgsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLmNvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgdmFyIGhpZ2hsaWdodHMgPSBbXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLnNlbGVjdGVkTGluZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gb3B0aW9ucy50ZXh0TGluZXNbb3B0aW9ucy5zZWxlY3RlZExpbmVzW2lkeF1dO1xuICAgICAgICBoaWdobGlnaHRzLnB1c2guYXBwbHkoaGlnaGxpZ2h0cywgZHJhd1JlY3RhbmdsZSh7XG4gICAgICAgICAgICB4OiBsaW5lLnggLSBwYWRkaW5nLFxuICAgICAgICAgICAgeTogbGluZS55IC0gKGxpbmVIZWlnaHQgLSBsaW5lLmhlaWdodCkgLyAyLFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGxpbmUuaGVpZ2h0ICsgKGxpbmVIZWlnaHQgLSBsaW5lLmhlaWdodCkgLyAyLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDAsXG4gICAgICAgICAgICBjb2xvcjogb3B0aW9ucy5zZWxlY3RlZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgdmFyIGxpbmVzID0gZHJhd1RleHRMaW5lcyhvcHRpb25zLnRleHRMaW5lcywge1xuICAgICAgICBjb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IG9wdGlvbnMuZm9udCxcbiAgICAgICAgc2l6ZTogb3B0aW9ucy5mb250U2l6ZSxcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgdmFyIG1hcmtlZENvbnRlbnQgPSBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgIGJlZ2luTWFya2VkQ29udGVudCgnVHgnKSxcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKVxuICAgIF0sIGxpbmVzLCBbXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgZW5kTWFya2VkQ29udGVudCgpLFxuICAgIF0pO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKClcbiAgICBdLCBiYWNrZ3JvdW5kLCBoaWdobGlnaHRzLCBjbGlwcGluZ0FyZWEsIG1hcmtlZENvbnRlbnQsIFtcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0pO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdGlvbnMuanMubWFwIiwiaW1wb3J0IHsgYXNOdW1iZXIsIGFzUERGTmFtZSwgYXNQREZOdW1iZXIgfSBmcm9tIFwiLi9vYmplY3RzXCI7XG5pbXBvcnQgeyBkZWdyZWVzVG9SYWRpYW5zIH0gZnJvbSBcIi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBQREZPcGVyYXRvciwgUERGT3BlcmF0b3JOYW1lcyBhcyBPcHMsIH0gZnJvbSBcIi4uL2NvcmVcIjtcbi8qID09PT09PT09PT09PT09PT09PT09IENsaXBwaW5nIFBhdGggT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIGNsaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQ2xpcE5vblplcm8pOyB9O1xuZXhwb3J0IHZhciBjbGlwRXZlbk9kZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5DbGlwRXZlbk9kZCk7IH07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBHcmFwaGljcyBTdGF0ZSBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbnZhciBjb3MgPSBNYXRoLmNvcywgc2luID0gTWF0aC5zaW4sIHRhbiA9IE1hdGgudGFuO1xuZXhwb3J0IHZhciBjb25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeCA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Db25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeCwgW1xuICAgICAgICBhc1BERk51bWJlcihhKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYiksXG4gICAgICAgIGFzUERGTnVtYmVyKGMpLFxuICAgICAgICBhc1BERk51bWJlcihkKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZSksXG4gICAgICAgIGFzUERGTnVtYmVyKGYpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgdHJhbnNsYXRlID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MpIHtcbiAgICByZXR1cm4gY29uY2F0VHJhbnNmb3JtYXRpb25NYXRyaXgoMSwgMCwgMCwgMSwgeFBvcywgeVBvcyk7XG59O1xuZXhwb3J0IHZhciBzY2FsZSA9IGZ1bmN0aW9uICh4UG9zLCB5UG9zKSB7XG4gICAgcmV0dXJuIGNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4KHhQb3MsIDAsIDAsIHlQb3MsIDAsIDApO1xufTtcbmV4cG9ydCB2YXIgcm90YXRlUmFkaWFucyA9IGZ1bmN0aW9uIChhbmdsZSkge1xuICAgIHJldHVybiBjb25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeChjb3MoYXNOdW1iZXIoYW5nbGUpKSwgc2luKGFzTnVtYmVyKGFuZ2xlKSksIC1zaW4oYXNOdW1iZXIoYW5nbGUpKSwgY29zKGFzTnVtYmVyKGFuZ2xlKSksIDAsIDApO1xufTtcbmV4cG9ydCB2YXIgcm90YXRlRGVncmVlcyA9IGZ1bmN0aW9uIChhbmdsZSkge1xuICAgIHJldHVybiByb3RhdGVSYWRpYW5zKGRlZ3JlZXNUb1JhZGlhbnMoYXNOdW1iZXIoYW5nbGUpKSk7XG59O1xuZXhwb3J0IHZhciBza2V3UmFkaWFucyA9IGZ1bmN0aW9uICh4U2tld0FuZ2xlLCB5U2tld0FuZ2xlKSB7XG4gICAgcmV0dXJuIGNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4KDEsIHRhbihhc051bWJlcih4U2tld0FuZ2xlKSksIHRhbihhc051bWJlcih5U2tld0FuZ2xlKSksIDEsIDAsIDApO1xufTtcbmV4cG9ydCB2YXIgc2tld0RlZ3JlZXMgPSBmdW5jdGlvbiAoeFNrZXdBbmdsZSwgeVNrZXdBbmdsZSkge1xuICAgIHJldHVybiBza2V3UmFkaWFucyhkZWdyZWVzVG9SYWRpYW5zKGFzTnVtYmVyKHhTa2V3QW5nbGUpKSwgZGVncmVlc1RvUmFkaWFucyhhc051bWJlcih5U2tld0FuZ2xlKSkpO1xufTtcbmV4cG9ydCB2YXIgc2V0RGFzaFBhdHRlcm4gPSBmdW5jdGlvbiAoZGFzaEFycmF5LCBkYXNoUGhhc2UpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldExpbmVEYXNoUGF0dGVybiwgW1xuICAgICAgICBcIltcIiArIGRhc2hBcnJheS5tYXAoYXNQREZOdW1iZXIpLmpvaW4oJyAnKSArIFwiXVwiLFxuICAgICAgICBhc1BERk51bWJlcihkYXNoUGhhc2UpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgcmVzdG9yZURhc2hQYXR0ZXJuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gc2V0RGFzaFBhdHRlcm4oW10sIDApOyB9O1xuZXhwb3J0IHZhciBMaW5lQ2FwU3R5bGU7XG4oZnVuY3Rpb24gKExpbmVDYXBTdHlsZSkge1xuICAgIExpbmVDYXBTdHlsZVtMaW5lQ2FwU3R5bGVbXCJCdXR0XCJdID0gMF0gPSBcIkJ1dHRcIjtcbiAgICBMaW5lQ2FwU3R5bGVbTGluZUNhcFN0eWxlW1wiUm91bmRcIl0gPSAxXSA9IFwiUm91bmRcIjtcbiAgICBMaW5lQ2FwU3R5bGVbTGluZUNhcFN0eWxlW1wiUHJvamVjdGluZ1wiXSA9IDJdID0gXCJQcm9qZWN0aW5nXCI7XG59KShMaW5lQ2FwU3R5bGUgfHwgKExpbmVDYXBTdHlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIHNldExpbmVDYXAgPSBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldExpbmVDYXBTdHlsZSwgW2FzUERGTnVtYmVyKHN0eWxlKV0pO1xufTtcbmV4cG9ydCB2YXIgTGluZUpvaW5TdHlsZTtcbihmdW5jdGlvbiAoTGluZUpvaW5TdHlsZSkge1xuICAgIExpbmVKb2luU3R5bGVbTGluZUpvaW5TdHlsZVtcIk1pdGVyXCJdID0gMF0gPSBcIk1pdGVyXCI7XG4gICAgTGluZUpvaW5TdHlsZVtMaW5lSm9pblN0eWxlW1wiUm91bmRcIl0gPSAxXSA9IFwiUm91bmRcIjtcbiAgICBMaW5lSm9pblN0eWxlW0xpbmVKb2luU3R5bGVbXCJCZXZlbFwiXSA9IDJdID0gXCJCZXZlbFwiO1xufSkoTGluZUpvaW5TdHlsZSB8fCAoTGluZUpvaW5TdHlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIHNldExpbmVKb2luID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRMaW5lSm9pblN0eWxlLCBbYXNQREZOdW1iZXIoc3R5bGUpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRHcmFwaGljc1N0YXRlID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRHcmFwaGljc1N0YXRlUGFyYW1zLCBbYXNQREZOYW1lKHN0YXRlKV0pO1xufTtcbmV4cG9ydCB2YXIgcHVzaEdyYXBoaWNzU3RhdGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuUHVzaEdyYXBoaWNzU3RhdGUpOyB9O1xuZXhwb3J0IHZhciBwb3BHcmFwaGljc1N0YXRlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlBvcEdyYXBoaWNzU3RhdGUpOyB9O1xuZXhwb3J0IHZhciBzZXRMaW5lV2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldExpbmVXaWR0aCwgW2FzUERGTnVtYmVyKHdpZHRoKV0pO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IFBhdGggQ29uc3RydWN0aW9uIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBhcHBlbmRCZXppZXJDdXJ2ZSA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5BcHBlbmRCZXppZXJDdXJ2ZSwgW1xuICAgICAgICBhc1BERk51bWJlcih4MSksXG4gICAgICAgIGFzUERGTnVtYmVyKHkxKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeDIpLFxuICAgICAgICBhc1BERk51bWJlcih5MiksXG4gICAgICAgIGFzUERGTnVtYmVyKHgzKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeTMpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgYXBwZW5kUXVhZHJhdGljQ3VydmUgPSBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkN1cnZlVG9SZXBsaWNhdGVJbml0aWFsUG9pbnQsIFtcbiAgICAgICAgYXNQREZOdW1iZXIoeDEpLFxuICAgICAgICBhc1BERk51bWJlcih5MSksXG4gICAgICAgIGFzUERGTnVtYmVyKHgyKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeTIpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgY2xvc2VQYXRoID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkNsb3NlUGF0aCk7IH07XG5leHBvcnQgdmFyIG1vdmVUbyA9IGZ1bmN0aW9uICh4UG9zLCB5UG9zKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Nb3ZlVG8sIFthc1BERk51bWJlcih4UG9zKSwgYXNQREZOdW1iZXIoeVBvcyldKTtcbn07XG5leHBvcnQgdmFyIGxpbmVUbyA9IGZ1bmN0aW9uICh4UG9zLCB5UG9zKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5MaW5lVG8sIFthc1BERk51bWJlcih4UG9zKSwgYXNQREZOdW1iZXIoeVBvcyldKTtcbn07XG4vKipcbiAqIEBwYXJhbSB4UG9zIHggY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGVcbiAqIEBwYXJhbSB5UG9zIHkgY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGVcbiAqIEBwYXJhbSB3aWR0aCB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlXG4gKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlXG4gKi9cbmV4cG9ydCB2YXIgcmVjdGFuZ2xlID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkFwcGVuZFJlY3RhbmdsZSwgW1xuICAgICAgICBhc1BERk51bWJlcih4UG9zKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeVBvcyksXG4gICAgICAgIGFzUERGTnVtYmVyKHdpZHRoKSxcbiAgICAgICAgYXNQREZOdW1iZXIoaGVpZ2h0KSxcbiAgICBdKTtcbn07XG4vKipcbiAqIEBwYXJhbSB4UG9zIHggY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBzcXVhcmVcbiAqIEBwYXJhbSB5UG9zIHkgY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBzcXVhcmVcbiAqIEBwYXJhbSBzaXplIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNxdWFyZVxuICovXG5leHBvcnQgdmFyIHNxdWFyZSA9IGZ1bmN0aW9uICh4UG9zLCB5UG9zLCBzaXplKSB7XG4gICAgcmV0dXJuIHJlY3RhbmdsZSh4UG9zLCB5UG9zLCBzaXplLCBzaXplKTtcbn07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBQYXRoIFBhaW50aW5nIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBzdHJva2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU3Ryb2tlUGF0aCk7IH07XG5leHBvcnQgdmFyIGZpbGwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuRmlsbE5vblplcm8pOyB9O1xuZXhwb3J0IHZhciBmaWxsQW5kU3Ryb2tlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkZpbGxOb25aZXJvQW5kU3Ryb2tlKTsgfTtcbmV4cG9ydCB2YXIgZW5kUGF0aCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5FbmRQYXRoKTsgfTtcbi8qID09PT09PT09PT09PT09PT09PT09IFRleHQgUG9zaXRpb25pbmcgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIG5leHRMaW5lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLk5leHRMaW5lKTsgfTtcbmV4cG9ydCB2YXIgbW92ZVRleHQgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuTW92ZVRleHQsIFthc1BERk51bWJlcih4KSwgYXNQREZOdW1iZXIoeSldKTtcbn07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBUZXh0IFNob3dpbmcgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIHNob3dUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNob3dUZXh0LCBbdGV4dF0pO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IFRleHQgU3RhdGUgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIGJlZ2luVGV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5CZWdpblRleHQpOyB9O1xuZXhwb3J0IHZhciBlbmRUZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkVuZFRleHQpOyB9O1xuZXhwb3J0IHZhciBzZXRGb250QW5kU2l6ZSA9IGZ1bmN0aW9uIChuYW1lLCBzaXplKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0Rm9udEFuZFNpemUsIFthc1BERk5hbWUobmFtZSksIGFzUERGTnVtYmVyKHNpemUpXSk7IH07XG5leHBvcnQgdmFyIHNldENoYXJhY3RlclNwYWNpbmcgPSBmdW5jdGlvbiAoc3BhY2luZykge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0Q2hhcmFjdGVyU3BhY2luZywgW2FzUERGTnVtYmVyKHNwYWNpbmcpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRXb3JkU3BhY2luZyA9IGZ1bmN0aW9uIChzcGFjaW5nKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRXb3JkU3BhY2luZywgW2FzUERGTnVtYmVyKHNwYWNpbmcpXSk7XG59O1xuLyoqIEBwYXJhbSBzcXVlZXplIGhvcml6b250YWwgY2hhcmFjdGVyIHNwYWNpbmcgKi9cbmV4cG9ydCB2YXIgc2V0Q2hhcmFjdGVyU3F1ZWV6ZSA9IGZ1bmN0aW9uIChzcXVlZXplKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRUZXh0SG9yaXpvbnRhbFNjYWxpbmcsIFthc1BERk51bWJlcihzcXVlZXplKV0pO1xufTtcbmV4cG9ydCB2YXIgc2V0TGluZUhlaWdodCA9IGZ1bmN0aW9uIChsaW5lSGVpZ2h0KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRUZXh0TGluZUhlaWdodCwgW2FzUERGTnVtYmVyKGxpbmVIZWlnaHQpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRUZXh0UmlzZSA9IGZ1bmN0aW9uIChyaXNlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRUZXh0UmlzZSwgW2FzUERGTnVtYmVyKHJpc2UpXSk7XG59O1xuZXhwb3J0IHZhciBUZXh0UmVuZGVyaW5nTW9kZTtcbihmdW5jdGlvbiAoVGV4dFJlbmRlcmluZ01vZGUpIHtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIkZpbGxcIl0gPSAwXSA9IFwiRmlsbFwiO1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiT3V0bGluZVwiXSA9IDFdID0gXCJPdXRsaW5lXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJGaWxsQW5kT3V0bGluZVwiXSA9IDJdID0gXCJGaWxsQW5kT3V0bGluZVwiO1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiSW52aXNpYmxlXCJdID0gM10gPSBcIkludmlzaWJsZVwiO1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiRmlsbEFuZENsaXBcIl0gPSA0XSA9IFwiRmlsbEFuZENsaXBcIjtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIk91dGxpbmVBbmRDbGlwXCJdID0gNV0gPSBcIk91dGxpbmVBbmRDbGlwXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJGaWxsQW5kT3V0bGluZUFuZENsaXBcIl0gPSA2XSA9IFwiRmlsbEFuZE91dGxpbmVBbmRDbGlwXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJDbGlwXCJdID0gN10gPSBcIkNsaXBcIjtcbn0pKFRleHRSZW5kZXJpbmdNb2RlIHx8IChUZXh0UmVuZGVyaW5nTW9kZSA9IHt9KSk7XG5leHBvcnQgdmFyIHNldFRleHRSZW5kZXJpbmdNb2RlID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldFRleHRSZW5kZXJpbmdNb2RlLCBbYXNQREZOdW1iZXIobW9kZSldKTtcbn07XG5leHBvcnQgdmFyIHNldFRleHRNYXRyaXggPSBmdW5jdGlvbiAoYSwgYiwgYywgZCwgZSwgZikge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0VGV4dE1hdHJpeCwgW1xuICAgICAgICBhc1BERk51bWJlcihhKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYiksXG4gICAgICAgIGFzUERGTnVtYmVyKGMpLFxuICAgICAgICBhc1BERk51bWJlcihkKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZSksXG4gICAgICAgIGFzUERGTnVtYmVyKGYpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgcm90YXRlQW5kU2tld1RleHRSYWRpYW5zQW5kVHJhbnNsYXRlID0gZnVuY3Rpb24gKHJvdGF0aW9uQW5nbGUsIHhTa2V3QW5nbGUsIHlTa2V3QW5nbGUsIHgsIHkpIHtcbiAgICByZXR1cm4gc2V0VGV4dE1hdHJpeChjb3MoYXNOdW1iZXIocm90YXRpb25BbmdsZSkpLCBzaW4oYXNOdW1iZXIocm90YXRpb25BbmdsZSkpICsgdGFuKGFzTnVtYmVyKHhTa2V3QW5nbGUpKSwgLXNpbihhc051bWJlcihyb3RhdGlvbkFuZ2xlKSkgKyB0YW4oYXNOdW1iZXIoeVNrZXdBbmdsZSkpLCBjb3MoYXNOdW1iZXIocm90YXRpb25BbmdsZSkpLCB4LCB5KTtcbn07XG5leHBvcnQgdmFyIHJvdGF0ZUFuZFNrZXdUZXh0RGVncmVlc0FuZFRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChyb3RhdGlvbkFuZ2xlLCB4U2tld0FuZ2xlLCB5U2tld0FuZ2xlLCB4LCB5KSB7XG4gICAgcmV0dXJuIHJvdGF0ZUFuZFNrZXdUZXh0UmFkaWFuc0FuZFRyYW5zbGF0ZShkZWdyZWVzVG9SYWRpYW5zKGFzTnVtYmVyKHJvdGF0aW9uQW5nbGUpKSwgZGVncmVlc1RvUmFkaWFucyhhc051bWJlcih4U2tld0FuZ2xlKSksIGRlZ3JlZXNUb1JhZGlhbnMoYXNOdW1iZXIoeVNrZXdBbmdsZSkpLCB4LCB5KTtcbn07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBYT2JqZWN0IE9wZXJhdG9yID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIGRyYXdPYmplY3QgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuRHJhd09iamVjdCwgW2FzUERGTmFtZShuYW1lKV0pO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IENvbG9yIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBzZXRGaWxsaW5nR3JheXNjYWxlQ29sb3IgPSBmdW5jdGlvbiAoZ3JheSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuTm9uU3Ryb2tpbmdDb2xvckdyYXksIFthc1BERk51bWJlcihncmF5KV0pO1xufTtcbmV4cG9ydCB2YXIgc2V0U3Ryb2tpbmdHcmF5c2NhbGVDb2xvciA9IGZ1bmN0aW9uIChncmF5KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TdHJva2luZ0NvbG9yR3JheSwgW2FzUERGTnVtYmVyKGdyYXkpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRGaWxsaW5nUmdiQ29sb3IgPSBmdW5jdGlvbiAocmVkLCBncmVlbiwgYmx1ZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuTm9uU3Ryb2tpbmdDb2xvclJnYiwgW1xuICAgICAgICBhc1BERk51bWJlcihyZWQpLFxuICAgICAgICBhc1BERk51bWJlcihncmVlbiksXG4gICAgICAgIGFzUERGTnVtYmVyKGJsdWUpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgc2V0U3Ryb2tpbmdSZ2JDb2xvciA9IGZ1bmN0aW9uIChyZWQsIGdyZWVuLCBibHVlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TdHJva2luZ0NvbG9yUmdiLCBbXG4gICAgICAgIGFzUERGTnVtYmVyKHJlZCksXG4gICAgICAgIGFzUERGTnVtYmVyKGdyZWVuKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYmx1ZSksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBzZXRGaWxsaW5nQ215a0NvbG9yID0gZnVuY3Rpb24gKGN5YW4sIG1hZ2VudGEsIHllbGxvdywga2V5KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Ob25TdHJva2luZ0NvbG9yQ215aywgW1xuICAgICAgICBhc1BERk51bWJlcihjeWFuKSxcbiAgICAgICAgYXNQREZOdW1iZXIobWFnZW50YSksXG4gICAgICAgIGFzUERGTnVtYmVyKHllbGxvdyksXG4gICAgICAgIGFzUERGTnVtYmVyKGtleSksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBzZXRTdHJva2luZ0NteWtDb2xvciA9IGZ1bmN0aW9uIChjeWFuLCBtYWdlbnRhLCB5ZWxsb3csIGtleSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU3Ryb2tpbmdDb2xvckNteWssIFtcbiAgICAgICAgYXNQREZOdW1iZXIoY3lhbiksXG4gICAgICAgIGFzUERGTnVtYmVyKG1hZ2VudGEpLFxuICAgICAgICBhc1BERk51bWJlcih5ZWxsb3cpLFxuICAgICAgICBhc1BERk51bWJlcihrZXkpLFxuICAgIF0pO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IE1hcmtlZCBDb250ZW50IE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBiZWdpbk1hcmtlZENvbnRlbnQgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5CZWdpbk1hcmtlZENvbnRlbnQsIFthc1BERk5hbWUodGFnKV0pO1xufTtcbmV4cG9ydCB2YXIgZW5kTWFya2VkQ29udGVudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5FbmRNYXJrZWRDb250ZW50KTsgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdG9ycy5qcy5tYXAiLCJpbXBvcnQgeyBhc3NlcnRJcywgZXJyb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmV4cG9ydCB2YXIgUm90YXRpb25UeXBlcztcbihmdW5jdGlvbiAoUm90YXRpb25UeXBlcykge1xuICAgIFJvdGF0aW9uVHlwZXNbXCJEZWdyZWVzXCJdID0gXCJkZWdyZWVzXCI7XG4gICAgUm90YXRpb25UeXBlc1tcIlJhZGlhbnNcIl0gPSBcInJhZGlhbnNcIjtcbn0pKFJvdGF0aW9uVHlwZXMgfHwgKFJvdGF0aW9uVHlwZXMgPSB7fSkpO1xuZXhwb3J0IHZhciByYWRpYW5zID0gZnVuY3Rpb24gKHJhZGlhbkFuZ2xlKSB7XG4gICAgYXNzZXJ0SXMocmFkaWFuQW5nbGUsICdyYWRpYW5BbmdsZScsIFsnbnVtYmVyJ10pO1xuICAgIHJldHVybiB7IHR5cGU6IFJvdGF0aW9uVHlwZXMuUmFkaWFucywgYW5nbGU6IHJhZGlhbkFuZ2xlIH07XG59O1xuZXhwb3J0IHZhciBkZWdyZWVzID0gZnVuY3Rpb24gKGRlZ3JlZUFuZ2xlKSB7XG4gICAgYXNzZXJ0SXMoZGVncmVlQW5nbGUsICdkZWdyZWVBbmdsZScsIFsnbnVtYmVyJ10pO1xuICAgIHJldHVybiB7IHR5cGU6IFJvdGF0aW9uVHlwZXMuRGVncmVlcywgYW5nbGU6IGRlZ3JlZUFuZ2xlIH07XG59O1xudmFyIFJhZGlhbnMgPSBSb3RhdGlvblR5cGVzLlJhZGlhbnMsIERlZ3JlZXMgPSBSb3RhdGlvblR5cGVzLkRlZ3JlZXM7XG5leHBvcnQgdmFyIGRlZ3JlZXNUb1JhZGlhbnMgPSBmdW5jdGlvbiAoZGVncmVlKSB7IHJldHVybiAoZGVncmVlICogTWF0aC5QSSkgLyAxODA7IH07XG5leHBvcnQgdmFyIHJhZGlhbnNUb0RlZ3JlZXMgPSBmdW5jdGlvbiAocmFkaWFuKSB7IHJldHVybiAocmFkaWFuICogMTgwKSAvIE1hdGguUEk7IH07XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB2YXIgdG9SYWRpYW5zID0gZnVuY3Rpb24gKHJvdGF0aW9uKSB7XG4gICAgcmV0dXJuIHJvdGF0aW9uLnR5cGUgPT09IFJhZGlhbnMgPyByb3RhdGlvbi5hbmdsZVxuICAgICAgICA6IHJvdGF0aW9uLnR5cGUgPT09IERlZ3JlZXMgPyBkZWdyZWVzVG9SYWRpYW5zKHJvdGF0aW9uLmFuZ2xlKVxuICAgICAgICAgICAgOiBlcnJvcihcIkludmFsaWQgcm90YXRpb246IFwiICsgSlNPTi5zdHJpbmdpZnkocm90YXRpb24pKTtcbn07XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB2YXIgdG9EZWdyZWVzID0gZnVuY3Rpb24gKHJvdGF0aW9uKSB7XG4gICAgcmV0dXJuIHJvdGF0aW9uLnR5cGUgPT09IFJhZGlhbnMgPyByYWRpYW5zVG9EZWdyZWVzKHJvdGF0aW9uLmFuZ2xlKVxuICAgICAgICA6IHJvdGF0aW9uLnR5cGUgPT09IERlZ3JlZXMgPyByb3RhdGlvbi5hbmdsZVxuICAgICAgICAgICAgOiBlcnJvcihcIkludmFsaWQgcm90YXRpb246IFwiICsgSlNPTi5zdHJpbmdpZnkocm90YXRpb24pKTtcbn07XG5leHBvcnQgdmFyIHJlZHVjZVJvdGF0aW9uID0gZnVuY3Rpb24gKGRlZ3JlZUFuZ2xlKSB7XG4gICAgaWYgKGRlZ3JlZUFuZ2xlID09PSB2b2lkIDApIHsgZGVncmVlQW5nbGUgPSAwOyB9XG4gICAgdmFyIHF1YWRyYW50cyA9IChkZWdyZWVBbmdsZSAvIDkwKSAlIDQ7XG4gICAgaWYgKHF1YWRyYW50cyA9PT0gMClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgaWYgKHF1YWRyYW50cyA9PT0gMSlcbiAgICAgICAgcmV0dXJuIDkwO1xuICAgIGlmIChxdWFkcmFudHMgPT09IDIpXG4gICAgICAgIHJldHVybiAxODA7XG4gICAgaWYgKHF1YWRyYW50cyA9PT0gMylcbiAgICAgICAgcmV0dXJuIDI3MDtcbiAgICByZXR1cm4gMDsgLy8gYGRlZ3JlZUFuZ2xlYCBpcyBub3QgYSBtdWx0aXBsZSBvZiA5MFxufTtcbmV4cG9ydCB2YXIgYWRqdXN0RGltc0ZvclJvdGF0aW9uID0gZnVuY3Rpb24gKGRpbXMsIGRlZ3JlZUFuZ2xlKSB7XG4gICAgaWYgKGRlZ3JlZUFuZ2xlID09PSB2b2lkIDApIHsgZGVncmVlQW5nbGUgPSAwOyB9XG4gICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oZGVncmVlQW5nbGUpO1xuICAgIHJldHVybiByb3RhdGlvbiA9PT0gOTAgfHwgcm90YXRpb24gPT09IDI3MFxuICAgICAgICA/IHsgd2lkdGg6IGRpbXMuaGVpZ2h0LCBoZWlnaHQ6IGRpbXMud2lkdGggfVxuICAgICAgICA6IHsgd2lkdGg6IGRpbXMud2lkdGgsIGhlaWdodDogZGltcy5oZWlnaHQgfTtcbn07XG5leHBvcnQgdmFyIHJvdGF0ZVJlY3RhbmdsZSA9IGZ1bmN0aW9uIChyZWN0YW5nbGUsIGJvcmRlcldpZHRoLCBkZWdyZWVBbmdsZSkge1xuICAgIGlmIChib3JkZXJXaWR0aCA9PT0gdm9pZCAwKSB7IGJvcmRlcldpZHRoID0gMDsgfVxuICAgIGlmIChkZWdyZWVBbmdsZSA9PT0gdm9pZCAwKSB7IGRlZ3JlZUFuZ2xlID0gMDsgfVxuICAgIHZhciB4ID0gcmVjdGFuZ2xlLngsIHkgPSByZWN0YW5nbGUueSwgdyA9IHJlY3RhbmdsZS53aWR0aCwgaCA9IHJlY3RhbmdsZS5oZWlnaHQ7XG4gICAgdmFyIHIgPSByZWR1Y2VSb3RhdGlvbihkZWdyZWVBbmdsZSk7XG4gICAgdmFyIGIgPSBib3JkZXJXaWR0aCAvIDI7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgaWYgKHIgPT09IDApXG4gICAgICAgIHJldHVybiB7IHg6IHggLSBiLCB5OiB5IC0gYiwgd2lkdGg6IHcsIGhlaWdodDogaCB9O1xuICAgIGVsc2UgaWYgKHIgPT09IDkwKVxuICAgICAgICByZXR1cm4geyB4OiB4IC0gaCArIGIsIHk6IHkgLSBiLCB3aWR0aDogaCwgaGVpZ2h0OiB3IH07XG4gICAgZWxzZSBpZiAociA9PT0gMTgwKVxuICAgICAgICByZXR1cm4geyB4OiB4IC0gdyArIGIsIHk6IHkgLSBoICsgYiwgd2lkdGg6IHcsIGhlaWdodDogaCB9O1xuICAgIGVsc2UgaWYgKHIgPT09IDI3MClcbiAgICAgICAgcmV0dXJuIHsgeDogeCAtIGIsIHk6IHkgLSB3ICsgYiwgd2lkdGg6IGgsIGhlaWdodDogdyB9O1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHsgeDogeCAtIGIsIHk6IHkgLSBiLCB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm90YXRpb25zLmpzLm1hcCIsImV4cG9ydCB2YXIgUGFnZVNpemVzID0ge1xuICAgICc0QTAnOiBbNDc2Ny44NywgNjc0MC43OV0sXG4gICAgJzJBMCc6IFszMzcwLjM5LCA0NzY3Ljg3XSxcbiAgICBBMDogWzIzODMuOTQsIDMzNzAuMzldLFxuICAgIEExOiBbMTY4My43OCwgMjM4My45NF0sXG4gICAgQTI6IFsxMTkwLjU1LCAxNjgzLjc4XSxcbiAgICBBMzogWzg0MS44OSwgMTE5MC41NV0sXG4gICAgQTQ6IFs1OTUuMjgsIDg0MS44OV0sXG4gICAgQTU6IFs0MTkuNTMsIDU5NS4yOF0sXG4gICAgQTY6IFsyOTcuNjQsIDQxOS41M10sXG4gICAgQTc6IFsyMDkuNzYsIDI5Ny42NF0sXG4gICAgQTg6IFsxNDcuNCwgMjA5Ljc2XSxcbiAgICBBOTogWzEwNC44OCwgMTQ3LjRdLFxuICAgIEExMDogWzczLjcsIDEwNC44OF0sXG4gICAgQjA6IFsyODM0LjY1LCA0MDA4LjE5XSxcbiAgICBCMTogWzIwMDQuMDksIDI4MzQuNjVdLFxuICAgIEIyOiBbMTQxNy4zMiwgMjAwNC4wOV0sXG4gICAgQjM6IFsxMDAwLjYzLCAxNDE3LjMyXSxcbiAgICBCNDogWzcwOC42NiwgMTAwMC42M10sXG4gICAgQjU6IFs0OTguOSwgNzA4LjY2XSxcbiAgICBCNjogWzM1NC4zMywgNDk4LjldLFxuICAgIEI3OiBbMjQ5LjQ1LCAzNTQuMzNdLFxuICAgIEI4OiBbMTc1Ljc1LCAyNDkuNDVdLFxuICAgIEI5OiBbMTI0LjcyLCAxNzUuNzVdLFxuICAgIEIxMDogWzg3Ljg3LCAxMjQuNzJdLFxuICAgIEMwOiBbMjU5OS4zNywgMzY3Ni41NF0sXG4gICAgQzE6IFsxODM2Ljg1LCAyNTk5LjM3XSxcbiAgICBDMjogWzEyOTguMjcsIDE4MzYuODVdLFxuICAgIEMzOiBbOTE4LjQzLCAxMjk4LjI3XSxcbiAgICBDNDogWzY0OS4xMywgOTE4LjQzXSxcbiAgICBDNTogWzQ1OS4yMSwgNjQ5LjEzXSxcbiAgICBDNjogWzMyMy4xNSwgNDU5LjIxXSxcbiAgICBDNzogWzIyOS42MSwgMzIzLjE1XSxcbiAgICBDODogWzE2MS41NywgMjI5LjYxXSxcbiAgICBDOTogWzExMy4zOSwgMTYxLjU3XSxcbiAgICBDMTA6IFs3OS4zNywgMTEzLjM5XSxcbiAgICBSQTA6IFsyNDM3LjgsIDM0NTguMjddLFxuICAgIFJBMTogWzE3MjkuMTMsIDI0MzcuOF0sXG4gICAgUkEyOiBbMTIxOC45LCAxNzI5LjEzXSxcbiAgICBSQTM6IFs4NjQuNTcsIDEyMTguOV0sXG4gICAgUkE0OiBbNjA5LjQ1LCA4NjQuNTddLFxuICAgIFNSQTA6IFsyNTUxLjE4LCAzNjI4LjM1XSxcbiAgICBTUkExOiBbMTgxNC4xNywgMjU1MS4xOF0sXG4gICAgU1JBMjogWzEyNzUuNTksIDE4MTQuMTddLFxuICAgIFNSQTM6IFs5MDcuMDksIDEyNzUuNTldLFxuICAgIFNSQTQ6IFs2MzcuOCwgOTA3LjA5XSxcbiAgICBFeGVjdXRpdmU6IFs1MjEuODYsIDc1Ni4wXSxcbiAgICBGb2xpbzogWzYxMi4wLCA5MzYuMF0sXG4gICAgTGVnYWw6IFs2MTIuMCwgMTAwOC4wXSxcbiAgICBMZXR0ZXI6IFs2MTIuMCwgNzkyLjBdLFxuICAgIFRhYmxvaWQ6IFs3OTIuMCwgMTIyNC4wXSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaXplcy5qcy5tYXAiLCIvLyBPcmlnaW5hdGVkIGZyb20gcGRma2l0IENvcHlyaWdodCAoYykgMjAxNCBEZXZvbiBHb3ZldHRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdC9ibG9iLzFlNjJlNmZmZTI0YjM3OGViODkwZGY1MDdhNDc2MTBmNGM0YTdiMjQvbGliL3BhdGguanNcbi8vIE1JVCBMSUNFTlNFXG4vLyBVcGRhdGVkIGZvciBwZGYtbGliICYgVHlwZVNjcmlwdCBieSBKZXJlbXkgTWVzc2VuZ2VyXG5pbXBvcnQgeyBhcHBlbmRCZXppZXJDdXJ2ZSwgYXBwZW5kUXVhZHJhdGljQ3VydmUsIGNsb3NlUGF0aCwgbGluZVRvLCBtb3ZlVG8sIH0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG52YXIgY3ggPSAwO1xudmFyIGN5ID0gMDtcbnZhciBweCA9IDA7XG52YXIgcHkgPSAwO1xudmFyIHN4ID0gMDtcbnZhciBzeSA9IDA7XG52YXIgcGFyYW1ldGVycyA9IG5ldyBNYXAoW1xuICAgIFsnQScsIDddLFxuICAgIFsnYScsIDddLFxuICAgIFsnQycsIDZdLFxuICAgIFsnYycsIDZdLFxuICAgIFsnSCcsIDFdLFxuICAgIFsnaCcsIDFdLFxuICAgIFsnTCcsIDJdLFxuICAgIFsnbCcsIDJdLFxuICAgIFsnTScsIDJdLFxuICAgIFsnbScsIDJdLFxuICAgIFsnUScsIDRdLFxuICAgIFsncScsIDRdLFxuICAgIFsnUycsIDRdLFxuICAgIFsncycsIDRdLFxuICAgIFsnVCcsIDJdLFxuICAgIFsndCcsIDJdLFxuICAgIFsnVicsIDFdLFxuICAgIFsndicsIDFdLFxuICAgIFsnWicsIDBdLFxuICAgIFsneicsIDBdLFxuXSk7XG52YXIgcGFyc2UgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIHZhciBjbWQ7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGN1ckFyZyA9ICcnO1xuICAgIHZhciBmb3VuZERlY2ltYWwgPSBmYWxzZTtcbiAgICB2YXIgcGFyYW1zID0gMDtcbiAgICBmb3IgKHZhciBfaSA9IDAsIHBhdGhfMSA9IHBhdGg7IF9pIDwgcGF0aF8xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgYyA9IHBhdGhfMVtfaV07XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLmhhcyhjKSkge1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1ldGVycy5nZXQoYyk7XG4gICAgICAgICAgICBpZiAoY21kKSB7XG4gICAgICAgICAgICAgICAgLy8gc2F2ZSBleGlzdGluZyBjb21tYW5kXG4gICAgICAgICAgICAgICAgaWYgKGN1ckFyZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJncy5sZW5ndGhdID0gK2N1ckFyZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0W3JldC5sZW5ndGhdID0geyBjbWQ6IGNtZCwgYXJnczogYXJncyB9O1xuICAgICAgICAgICAgICAgIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBjdXJBcmcgPSAnJztcbiAgICAgICAgICAgICAgICBmb3VuZERlY2ltYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNtZCA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoWycgJywgJywnXS5pbmNsdWRlcyhjKSB8fFxuICAgICAgICAgICAgKGMgPT09ICctJyAmJiBjdXJBcmcubGVuZ3RoID4gMCAmJiBjdXJBcmdbY3VyQXJnLmxlbmd0aCAtIDFdICE9PSAnZScpIHx8XG4gICAgICAgICAgICAoYyA9PT0gJy4nICYmIGZvdW5kRGVjaW1hbCkpIHtcbiAgICAgICAgICAgIGlmIChjdXJBcmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IHBhcmFtcykge1xuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSByZXVzZWQgY29tbWFuZHNcbiAgICAgICAgICAgICAgICByZXRbcmV0Lmxlbmd0aF0gPSB7IGNtZDogY21kLCBhcmdzOiBhcmdzIH07XG4gICAgICAgICAgICAgICAgYXJncyA9IFsrY3VyQXJnXTtcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXNzdW1lZCBjb21tYW5kc1xuICAgICAgICAgICAgICAgIGlmIChjbWQgPT09ICdNJykge1xuICAgICAgICAgICAgICAgICAgICBjbWQgPSAnTCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjbWQgPT09ICdtJykge1xuICAgICAgICAgICAgICAgICAgICBjbWQgPSAnbCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aF0gPSArY3VyQXJnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm91bmREZWNpbWFsID0gYyA9PT0gJy4nO1xuICAgICAgICAgICAgLy8gZml4IGZvciBuZWdhdGl2ZSBudW1iZXJzIG9yIHJlcGVhdGVkIGRlY2ltYWxzIHdpdGggbm8gZGVsaW1ldGVyIGJldHdlZW4gY29tbWFuZHNcbiAgICAgICAgICAgIGN1ckFyZyA9IFsnLScsICcuJ10uaW5jbHVkZXMoYykgPyBjIDogJyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjdXJBcmcgKz0gYztcbiAgICAgICAgICAgIGlmIChjID09PSAnLicpIHtcbiAgICAgICAgICAgICAgICBmb3VuZERlY2ltYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGFkZCB0aGUgbGFzdCBjb21tYW5kXG4gICAgaWYgKGN1ckFyZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gcGFyYW1zKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgcmV1c2VkIGNvbW1hbmRzXG4gICAgICAgICAgICByZXRbcmV0Lmxlbmd0aF0gPSB7IGNtZDogY21kLCBhcmdzOiBhcmdzIH07XG4gICAgICAgICAgICBhcmdzID0gWytjdXJBcmddO1xuICAgICAgICAgICAgLy8gaGFuZGxlIGFzc3VtZWQgY29tbWFuZHNcbiAgICAgICAgICAgIGlmIChjbWQgPT09ICdNJykge1xuICAgICAgICAgICAgICAgIGNtZCA9ICdMJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjbWQgPT09ICdtJykge1xuICAgICAgICAgICAgICAgIGNtZCA9ICdsJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFyZ3NbYXJncy5sZW5ndGhdID0gK2N1ckFyZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXRbcmV0Lmxlbmd0aF0gPSB7IGNtZDogY21kLCBhcmdzOiBhcmdzIH07XG4gICAgcmV0dXJuIHJldDtcbn07XG52YXIgYXBwbHkgPSBmdW5jdGlvbiAoY29tbWFuZHMpIHtcbiAgICAvLyBjdXJyZW50IHBvaW50LCBjb250cm9sIHBvaW50LCBhbmQgc3VicGF0aCBzdGFydGluZyBwb2ludFxuICAgIGN4ID0gY3kgPSBweCA9IHB5ID0gc3ggPSBzeSA9IDA7XG4gICAgLy8gcnVuIHRoZSBjb21tYW5kc1xuICAgIHZhciBjbWRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYyA9IGNvbW1hbmRzW2ldO1xuICAgICAgICBpZiAoYy5jbWQgJiYgdHlwZW9mIHJ1bm5lcnNbYy5jbWRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgY21kID0gcnVubmVyc1tjLmNtZF0oYy5hcmdzKTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNtZCkpIHtcbiAgICAgICAgICAgICAgICBjbWRzID0gY21kcy5jb25jYXQoY21kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNtZHMucHVzaChjbWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbWRzO1xufTtcbnZhciBydW5uZXJzID0ge1xuICAgIE06IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN4ID0gYVswXTtcbiAgICAgICAgY3kgPSBhWzFdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgc3ggPSBjeDtcbiAgICAgICAgc3kgPSBjeTtcbiAgICAgICAgcmV0dXJuIG1vdmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgbTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggKz0gYVswXTtcbiAgICAgICAgY3kgKz0gYVsxXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHN4ID0gY3g7XG4gICAgICAgIHN5ID0gY3k7XG4gICAgICAgIHJldHVybiBtb3ZlVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIEM6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN4ID0gYVs0XTtcbiAgICAgICAgY3kgPSBhWzVdO1xuICAgICAgICBweCA9IGFbMl07XG4gICAgICAgIHB5ID0gYVszXTtcbiAgICAgICAgcmV0dXJuIGFwcGVuZEJlemllckN1cnZlKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0pO1xuICAgIH0sXG4gICAgYzogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdmFyIGNtZCA9IGFwcGVuZEJlemllckN1cnZlKGFbMF0gKyBjeCwgYVsxXSArIGN5LCBhWzJdICsgY3gsIGFbM10gKyBjeSwgYVs0XSArIGN4LCBhWzVdICsgY3kpO1xuICAgICAgICBweCA9IGN4ICsgYVsyXTtcbiAgICAgICAgcHkgPSBjeSArIGFbM107XG4gICAgICAgIGN4ICs9IGFbNF07XG4gICAgICAgIGN5ICs9IGFbNV07XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbiAgICBTOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBpZiAocHggPT09IG51bGwgfHwgcHkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHB4ID0gY3g7XG4gICAgICAgICAgICBweSA9IGN5O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbWQgPSBhcHBlbmRCZXppZXJDdXJ2ZShjeCAtIChweCAtIGN4KSwgY3kgLSAocHkgLSBjeSksIGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pO1xuICAgICAgICBweCA9IGFbMF07XG4gICAgICAgIHB5ID0gYVsxXTtcbiAgICAgICAgY3ggPSBhWzJdO1xuICAgICAgICBjeSA9IGFbM107XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbiAgICBzOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBpZiAocHggPT09IG51bGwgfHwgcHkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHB4ID0gY3g7XG4gICAgICAgICAgICBweSA9IGN5O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbWQgPSBhcHBlbmRCZXppZXJDdXJ2ZShjeCAtIChweCAtIGN4KSwgY3kgLSAocHkgLSBjeSksIGN4ICsgYVswXSwgY3kgKyBhWzFdLCBjeCArIGFbMl0sIGN5ICsgYVszXSk7XG4gICAgICAgIHB4ID0gY3ggKyBhWzBdO1xuICAgICAgICBweSA9IGN5ICsgYVsxXTtcbiAgICAgICAgY3ggKz0gYVsyXTtcbiAgICAgICAgY3kgKz0gYVszXTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIFE6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHB4ID0gYVswXTtcbiAgICAgICAgcHkgPSBhWzFdO1xuICAgICAgICBjeCA9IGFbMl07XG4gICAgICAgIGN5ID0gYVszXTtcbiAgICAgICAgcmV0dXJuIGFwcGVuZFF1YWRyYXRpY0N1cnZlKGFbMF0sIGFbMV0sIGN4LCBjeSk7XG4gICAgfSxcbiAgICBxOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgY21kID0gYXBwZW5kUXVhZHJhdGljQ3VydmUoYVswXSArIGN4LCBhWzFdICsgY3ksIGFbMl0gKyBjeCwgYVszXSArIGN5KTtcbiAgICAgICAgcHggPSBjeCArIGFbMF07XG4gICAgICAgIHB5ID0gY3kgKyBhWzFdO1xuICAgICAgICBjeCArPSBhWzJdO1xuICAgICAgICBjeSArPSBhWzNdO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG4gICAgVDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgaWYgKHB4ID09PSBudWxsIHx8IHB5ID09PSBudWxsKSB7XG4gICAgICAgICAgICBweCA9IGN4O1xuICAgICAgICAgICAgcHkgPSBjeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHB4ID0gY3ggLSAocHggLSBjeCk7XG4gICAgICAgICAgICBweSA9IGN5IC0gKHB5IC0gY3kpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbWQgPSBhcHBlbmRRdWFkcmF0aWNDdXJ2ZShweCwgcHksIGFbMF0sIGFbMV0pO1xuICAgICAgICBweCA9IGN4IC0gKHB4IC0gY3gpO1xuICAgICAgICBweSA9IGN5IC0gKHB5IC0gY3kpO1xuICAgICAgICBjeCA9IGFbMF07XG4gICAgICAgIGN5ID0gYVsxXTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIHQ6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGlmIChweCA9PT0gbnVsbCB8fCBweSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHggPSBjeDtcbiAgICAgICAgICAgIHB5ID0gY3k7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBweCA9IGN4IC0gKHB4IC0gY3gpO1xuICAgICAgICAgICAgcHkgPSBjeSAtIChweSAtIGN5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY21kID0gYXBwZW5kUXVhZHJhdGljQ3VydmUocHgsIHB5LCBjeCArIGFbMF0sIGN5ICsgYVsxXSk7XG4gICAgICAgIGN4ICs9IGFbMF07XG4gICAgICAgIGN5ICs9IGFbMV07XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbiAgICBBOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgY21kcyA9IHNvbHZlQXJjKGN4LCBjeSwgYSk7XG4gICAgICAgIGN4ID0gYVs1XTtcbiAgICAgICAgY3kgPSBhWzZdO1xuICAgICAgICByZXR1cm4gY21kcztcbiAgICB9LFxuICAgIGE6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGFbNV0gKz0gY3g7XG4gICAgICAgIGFbNl0gKz0gY3k7XG4gICAgICAgIHZhciBjbWRzID0gc29sdmVBcmMoY3gsIGN5LCBhKTtcbiAgICAgICAgY3ggPSBhWzVdO1xuICAgICAgICBjeSA9IGFbNl07XG4gICAgICAgIHJldHVybiBjbWRzO1xuICAgIH0sXG4gICAgTDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggPSBhWzBdO1xuICAgICAgICBjeSA9IGFbMV07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICByZXR1cm4gbGluZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBsOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCArPSBhWzBdO1xuICAgICAgICBjeSArPSBhWzFdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxpbmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgSDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggPSBhWzBdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxpbmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgaDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggKz0gYVswXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHJldHVybiBsaW5lVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIFY6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN5ID0gYVswXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHJldHVybiBsaW5lVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIHY6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN5ICs9IGFbMF07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICByZXR1cm4gbGluZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBaOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjbWQgPSBjbG9zZVBhdGgoKTtcbiAgICAgICAgY3ggPSBzeDtcbiAgICAgICAgY3kgPSBzeTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIHo6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNtZCA9IGNsb3NlUGF0aCgpO1xuICAgICAgICBjeCA9IHN4O1xuICAgICAgICBjeSA9IHN5O1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG59O1xudmFyIHNvbHZlQXJjID0gZnVuY3Rpb24gKHgsIHksIGNvb3Jkcykge1xuICAgIHZhciByeCA9IGNvb3Jkc1swXSwgcnkgPSBjb29yZHNbMV0sIHJvdCA9IGNvb3Jkc1syXSwgbGFyZ2UgPSBjb29yZHNbM10sIHN3ZWVwID0gY29vcmRzWzRdLCBleCA9IGNvb3Jkc1s1XSwgZXkgPSBjb29yZHNbNl07XG4gICAgdmFyIHNlZ3MgPSBhcmNUb1NlZ21lbnRzKGV4LCBleSwgcngsIHJ5LCBsYXJnZSwgc3dlZXAsIHJvdCwgeCwgeSk7XG4gICAgdmFyIGNtZHMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIHNlZ3NfMSA9IHNlZ3M7IF9pIDwgc2Vnc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgc2VnID0gc2Vnc18xW19pXTtcbiAgICAgICAgdmFyIGJleiA9IHNlZ21lbnRUb0Jlemllci5hcHBseSh2b2lkIDAsIHNlZyk7XG4gICAgICAgIGNtZHMucHVzaChhcHBlbmRCZXppZXJDdXJ2ZS5hcHBseSh2b2lkIDAsIGJleikpO1xuICAgIH1cbiAgICByZXR1cm4gY21kcztcbn07XG4vLyBmcm9tIElua3NjYXBlIHN2Z3RvcGRmLCB0aGFua3MhXG52YXIgYXJjVG9TZWdtZW50cyA9IGZ1bmN0aW9uICh4LCB5LCByeCwgcnksIGxhcmdlLCBzd2VlcCwgcm90YXRlWCwgb3gsIG95KSB7XG4gICAgdmFyIHRoID0gcm90YXRlWCAqIChNYXRoLlBJIC8gMTgwKTtcbiAgICB2YXIgc2luVGggPSBNYXRoLnNpbih0aCk7XG4gICAgdmFyIGNvc1RoID0gTWF0aC5jb3ModGgpO1xuICAgIHJ4ID0gTWF0aC5hYnMocngpO1xuICAgIHJ5ID0gTWF0aC5hYnMocnkpO1xuICAgIHB4ID0gY29zVGggKiAob3ggLSB4KSAqIDAuNSArIHNpblRoICogKG95IC0geSkgKiAwLjU7XG4gICAgcHkgPSBjb3NUaCAqIChveSAtIHkpICogMC41IC0gc2luVGggKiAob3ggLSB4KSAqIDAuNTtcbiAgICB2YXIgcGwgPSAocHggKiBweCkgLyAocnggKiByeCkgKyAocHkgKiBweSkgLyAocnkgKiByeSk7XG4gICAgaWYgKHBsID4gMSkge1xuICAgICAgICBwbCA9IE1hdGguc3FydChwbCk7XG4gICAgICAgIHJ4ICo9IHBsO1xuICAgICAgICByeSAqPSBwbDtcbiAgICB9XG4gICAgdmFyIGEwMCA9IGNvc1RoIC8gcng7XG4gICAgdmFyIGEwMSA9IHNpblRoIC8gcng7XG4gICAgdmFyIGExMCA9IC1zaW5UaCAvIHJ5O1xuICAgIHZhciBhMTEgPSBjb3NUaCAvIHJ5O1xuICAgIHZhciB4MCA9IGEwMCAqIG94ICsgYTAxICogb3k7XG4gICAgdmFyIHkwID0gYTEwICogb3ggKyBhMTEgKiBveTtcbiAgICB2YXIgeDEgPSBhMDAgKiB4ICsgYTAxICogeTtcbiAgICB2YXIgeTEgPSBhMTAgKiB4ICsgYTExICogeTtcbiAgICB2YXIgZCA9ICh4MSAtIHgwKSAqICh4MSAtIHgwKSArICh5MSAtIHkwKSAqICh5MSAtIHkwKTtcbiAgICB2YXIgc2ZhY3RvclNxID0gMSAvIGQgLSAwLjI1O1xuICAgIGlmIChzZmFjdG9yU3EgPCAwKSB7XG4gICAgICAgIHNmYWN0b3JTcSA9IDA7XG4gICAgfVxuICAgIHZhciBzZmFjdG9yID0gTWF0aC5zcXJ0KHNmYWN0b3JTcSk7XG4gICAgaWYgKHN3ZWVwID09PSBsYXJnZSkge1xuICAgICAgICBzZmFjdG9yID0gLXNmYWN0b3I7XG4gICAgfVxuICAgIHZhciB4YyA9IDAuNSAqICh4MCArIHgxKSAtIHNmYWN0b3IgKiAoeTEgLSB5MCk7XG4gICAgdmFyIHljID0gMC41ICogKHkwICsgeTEpICsgc2ZhY3RvciAqICh4MSAtIHgwKTtcbiAgICB2YXIgdGgwID0gTWF0aC5hdGFuMih5MCAtIHljLCB4MCAtIHhjKTtcbiAgICB2YXIgdGgxID0gTWF0aC5hdGFuMih5MSAtIHljLCB4MSAtIHhjKTtcbiAgICB2YXIgdGhBcmMgPSB0aDEgLSB0aDA7XG4gICAgaWYgKHRoQXJjIDwgMCAmJiBzd2VlcCA9PT0gMSkge1xuICAgICAgICB0aEFyYyArPSAyICogTWF0aC5QSTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhBcmMgPiAwICYmIHN3ZWVwID09PSAwKSB7XG4gICAgICAgIHRoQXJjIC09IDIgKiBNYXRoLlBJO1xuICAgIH1cbiAgICB2YXIgc2VnbWVudHMgPSBNYXRoLmNlaWwoTWF0aC5hYnModGhBcmMgLyAoTWF0aC5QSSAqIDAuNSArIDAuMDAxKSkpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlZ21lbnRzOyBpKyspIHtcbiAgICAgICAgdmFyIHRoMiA9IHRoMCArIChpICogdGhBcmMpIC8gc2VnbWVudHM7XG4gICAgICAgIHZhciB0aDMgPSB0aDAgKyAoKGkgKyAxKSAqIHRoQXJjKSAvIHNlZ21lbnRzO1xuICAgICAgICByZXN1bHRbaV0gPSBbeGMsIHljLCB0aDIsIHRoMywgcngsIHJ5LCBzaW5UaCwgY29zVGhdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBzZWdtZW50VG9CZXppZXIgPSBmdW5jdGlvbiAoY3gxLCBjeTEsIHRoMCwgdGgxLCByeCwgcnksIHNpblRoLCBjb3NUaCkge1xuICAgIHZhciBhMDAgPSBjb3NUaCAqIHJ4O1xuICAgIHZhciBhMDEgPSAtc2luVGggKiByeTtcbiAgICB2YXIgYTEwID0gc2luVGggKiByeDtcbiAgICB2YXIgYTExID0gY29zVGggKiByeTtcbiAgICB2YXIgdGhIYWxmID0gMC41ICogKHRoMSAtIHRoMCk7XG4gICAgdmFyIHQgPSAoKDggLyAzKSAqIE1hdGguc2luKHRoSGFsZiAqIDAuNSkgKiBNYXRoLnNpbih0aEhhbGYgKiAwLjUpKSAvXG4gICAgICAgIE1hdGguc2luKHRoSGFsZik7XG4gICAgdmFyIHgxID0gY3gxICsgTWF0aC5jb3ModGgwKSAtIHQgKiBNYXRoLnNpbih0aDApO1xuICAgIHZhciB5MSA9IGN5MSArIE1hdGguc2luKHRoMCkgKyB0ICogTWF0aC5jb3ModGgwKTtcbiAgICB2YXIgeDMgPSBjeDEgKyBNYXRoLmNvcyh0aDEpO1xuICAgIHZhciB5MyA9IGN5MSArIE1hdGguc2luKHRoMSk7XG4gICAgdmFyIHgyID0geDMgKyB0ICogTWF0aC5zaW4odGgxKTtcbiAgICB2YXIgeTIgPSB5MyAtIHQgKiBNYXRoLmNvcyh0aDEpO1xuICAgIHZhciByZXN1bHQgPSBbXG4gICAgICAgIGEwMCAqIHgxICsgYTAxICogeTEsXG4gICAgICAgIGExMCAqIHgxICsgYTExICogeTEsXG4gICAgICAgIGEwMCAqIHgyICsgYTAxICogeTIsXG4gICAgICAgIGExMCAqIHgyICsgYTExICogeTIsXG4gICAgICAgIGEwMCAqIHgzICsgYTAxICogeTMsXG4gICAgICAgIGExMCAqIHgzICsgYTExICogeTMsXG4gICAgXTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCB2YXIgc3ZnUGF0aFRvT3BlcmF0b3JzID0gZnVuY3Rpb24gKHBhdGgpIHsgcmV0dXJuIGFwcGx5KHBhcnNlKHBhdGgpKTsgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN2Z1BhdGguanMubWFwIiwiZXhwb3J0IHZhciBUZXh0QWxpZ25tZW50O1xuKGZ1bmN0aW9uIChUZXh0QWxpZ25tZW50KSB7XG4gICAgVGV4dEFsaWdubWVudFtUZXh0QWxpZ25tZW50W1wiTGVmdFwiXSA9IDBdID0gXCJMZWZ0XCI7XG4gICAgVGV4dEFsaWdubWVudFtUZXh0QWxpZ25tZW50W1wiQ2VudGVyXCJdID0gMV0gPSBcIkNlbnRlclwiO1xuICAgIFRleHRBbGlnbm1lbnRbVGV4dEFsaWdubWVudFtcIlJpZ2h0XCJdID0gMl0gPSBcIlJpZ2h0XCI7XG59KShUZXh0QWxpZ25tZW50IHx8IChUZXh0QWxpZ25tZW50ID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsaWdubWVudC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9hbGlnbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xheW91dFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgQ29tYmVkVGV4dExheW91dEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgVGV4dEFsaWdubWVudCB9IGZyb20gXCIuL2FsaWdubWVudFwiO1xuaW1wb3J0IHsgY2xlYW5UZXh0LCBsaW5lU3BsaXQsIG1lcmdlTGluZXMsIGNoYXJBdEluZGV4LCBjaGFyU3BsaXQsIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgTUlOX0ZPTlRfU0laRSA9IDQ7XG52YXIgTUFYX0ZPTlRfU0laRSA9IDUwMDtcbnZhciBjb21wdXRlRm9udFNpemUgPSBmdW5jdGlvbiAobGluZXMsIGZvbnQsIGJvdW5kcywgbXVsdGlsaW5lKSB7XG4gICAgaWYgKG11bHRpbGluZSA9PT0gdm9pZCAwKSB7IG11bHRpbGluZSA9IGZhbHNlOyB9XG4gICAgdmFyIGZvbnRTaXplID0gTUlOX0ZPTlRfU0laRTtcbiAgICB3aGlsZSAoZm9udFNpemUgPCBNQVhfRk9OVF9TSVpFKSB7XG4gICAgICAgIHZhciBsaW5lc1VzZWQgPSAwO1xuICAgICAgICBmb3IgKHZhciBsaW5lSWR4ID0gMCwgbGluZUxlbiA9IGxpbmVzLmxlbmd0aDsgbGluZUlkeCA8IGxpbmVMZW47IGxpbmVJZHgrKykge1xuICAgICAgICAgICAgbGluZXNVc2VkICs9IDE7XG4gICAgICAgICAgICB2YXIgbGluZSA9IGxpbmVzW2xpbmVJZHhdO1xuICAgICAgICAgICAgdmFyIHdvcmRzID0gbGluZS5zcGxpdCgnICcpO1xuICAgICAgICAgICAgLy8gTGF5b3V0IHRoZSB3b3JkcyB1c2luZyB0aGUgY3VycmVudCBgZm9udFNpemVgLCBsaW5lIHdyYXBwaW5nXG4gICAgICAgICAgICAvLyB3aGVuZXZlciB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpbmUuXG4gICAgICAgICAgICB2YXIgc3BhY2VJbkxpbmVSZW1haW5pbmcgPSBib3VuZHMud2lkdGg7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3b3Jkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNMYXN0V29yZCA9IGlkeCA9PT0gbGVuIC0gMTtcbiAgICAgICAgICAgICAgICB2YXIgd29yZCA9IGlzTGFzdFdvcmQgPyB3b3Jkc1tpZHhdIDogd29yZHNbaWR4XSArICcgJztcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGhPZldvcmQgPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKHdvcmQsIGZvbnRTaXplKTtcbiAgICAgICAgICAgICAgICBzcGFjZUluTGluZVJlbWFpbmluZyAtPSB3aWR0aE9mV29yZDtcbiAgICAgICAgICAgICAgICBpZiAoc3BhY2VJbkxpbmVSZW1haW5pbmcgPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lc1VzZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgc3BhY2VJbkxpbmVSZW1haW5pbmcgPSBib3VuZHMud2lkdGggLSB3aWR0aE9mV29yZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmV0dXJuIGlmIHdlIGV4Y2VlZGVkIHRoZSBhbGxvd2VkIHdpZHRoXG4gICAgICAgIGlmICghbXVsdGlsaW5lICYmIGxpbmVzVXNlZCA+IGxpbmVzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmb250U2l6ZSAtIDE7XG4gICAgICAgIHZhciBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHZhciBsaW5lSGVpZ2h0ID0gaGVpZ2h0ICsgaGVpZ2h0ICogMC4yO1xuICAgICAgICB2YXIgdG90YWxIZWlnaHQgPSBsaW5lSGVpZ2h0ICogbGluZXNVc2VkO1xuICAgICAgICAvLyBSZXR1cm4gaWYgd2UgZXhjZWVkZWQgdGhlIGFsbG93ZWQgaGVpZ2h0XG4gICAgICAgIGlmICh0b3RhbEhlaWdodCA+IE1hdGguYWJzKGJvdW5kcy5oZWlnaHQpKVxuICAgICAgICAgICAgcmV0dXJuIGZvbnRTaXplIC0gMTtcbiAgICAgICAgZm9udFNpemUgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGZvbnRTaXplO1xufTtcbnZhciBjb21wdXRlQ29tYmVkRm9udFNpemUgPSBmdW5jdGlvbiAobGluZSwgZm9udCwgYm91bmRzLCBjZWxsQ291bnQpIHtcbiAgICB2YXIgY2VsbFdpZHRoID0gYm91bmRzLndpZHRoIC8gY2VsbENvdW50O1xuICAgIHZhciBjZWxsSGVpZ2h0ID0gYm91bmRzLmhlaWdodDtcbiAgICB2YXIgZm9udFNpemUgPSBNSU5fRk9OVF9TSVpFO1xuICAgIHZhciBjaGFycyA9IGNoYXJTcGxpdChsaW5lKTtcbiAgICB3aGlsZSAoZm9udFNpemUgPCBNQVhfRk9OVF9TSVpFKSB7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGNoYXJzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGMgPSBjaGFyc1tpZHhdO1xuICAgICAgICAgICAgdmFyIHRvb0xvbmcgPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKGMsIGZvbnRTaXplKSA+IGNlbGxXaWR0aCAqIDAuNzU7XG4gICAgICAgICAgICBpZiAodG9vTG9uZylcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9udFNpemUgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHZhciBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZShmb250U2l6ZSwgeyBkZXNjZW5kZXI6IGZhbHNlIH0pO1xuICAgICAgICBpZiAoaGVpZ2h0ID4gY2VsbEhlaWdodClcbiAgICAgICAgICAgIHJldHVybiBmb250U2l6ZSAtIDE7XG4gICAgICAgIGZvbnRTaXplICs9IDE7XG4gICAgfVxuICAgIHJldHVybiBmb250U2l6ZTtcbn07XG52YXIgbGFzdEluZGV4T2ZXaGl0ZXNwYWNlID0gZnVuY3Rpb24gKGxpbmUpIHtcbiAgICBmb3IgKHZhciBpZHggPSBsaW5lLmxlbmd0aDsgaWR4ID4gMDsgaWR4LS0pIHtcbiAgICAgICAgaWYgKC9cXHMvLnRlc3QobGluZVtpZHhdKSlcbiAgICAgICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xudmFyIHNwbGl0T3V0TGluZXMgPSBmdW5jdGlvbiAoaW5wdXQsIG1heFdpZHRoLCBmb250LCBmb250U2l6ZSkge1xuICAgIHZhciBfYTtcbiAgICB2YXIgbGFzdFdoaXRlc3BhY2VJZHggPSBpbnB1dC5sZW5ndGg7XG4gICAgd2hpbGUgKGxhc3RXaGl0ZXNwYWNlSWR4ID4gMCkge1xuICAgICAgICB2YXIgbGluZSA9IGlucHV0LnN1YnN0cmluZygwLCBsYXN0V2hpdGVzcGFjZUlkeCk7XG4gICAgICAgIHZhciBlbmNvZGVkID0gZm9udC5lbmNvZGVUZXh0KGxpbmUpO1xuICAgICAgICB2YXIgd2lkdGggPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKGxpbmUsIGZvbnRTaXplKTtcbiAgICAgICAgaWYgKHdpZHRoIDwgbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHZhciByZW1haW5kZXIgPSBpbnB1dC5zdWJzdHJpbmcobGFzdFdoaXRlc3BhY2VJZHgpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB7IGxpbmU6IGxpbmUsIGVuY29kZWQ6IGVuY29kZWQsIHdpZHRoOiB3aWR0aCwgcmVtYWluZGVyOiByZW1haW5kZXIgfTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0V2hpdGVzcGFjZUlkeCA9IChfYSA9IGxhc3RJbmRleE9mV2hpdGVzcGFjZShsaW5lKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICB9XG4gICAgLy8gV2Ugd2VyZSB1bmFibGUgdG8gc3BsaXQgdGhlIGlucHV0IGVub3VnaCB0byBnZXQgYSBjaHVuayB0aGF0IHdvdWxkIGZpdFxuICAgIC8vIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBtYXhXaWR0aGAgc28gd2UnbGwganVzdCByZXR1cm4gZXZlcnl0aGluZ1xuICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IGlucHV0LFxuICAgICAgICBlbmNvZGVkOiBmb250LmVuY29kZVRleHQoaW5wdXQpLFxuICAgICAgICB3aWR0aDogZm9udC53aWR0aE9mVGV4dEF0U2l6ZShpbnB1dCwgZm9udFNpemUpLFxuICAgICAgICByZW1haW5kZXI6IHVuZGVmaW5lZCxcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgbGF5b3V0TXVsdGlsaW5lVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBfYSkge1xuICAgIHZhciBhbGlnbm1lbnQgPSBfYS5hbGlnbm1lbnQsIGZvbnRTaXplID0gX2EuZm9udFNpemUsIGZvbnQgPSBfYS5mb250LCBib3VuZHMgPSBfYS5ib3VuZHM7XG4gICAgdmFyIGxpbmVzID0gbGluZVNwbGl0KGNsZWFuVGV4dCh0ZXh0KSk7XG4gICAgaWYgKGZvbnRTaXplID09PSB1bmRlZmluZWQgfHwgZm9udFNpemUgPT09IDApIHtcbiAgICAgICAgZm9udFNpemUgPSBjb21wdXRlRm9udFNpemUobGluZXMsIGZvbnQsIGJvdW5kcywgdHJ1ZSk7XG4gICAgfVxuICAgIHZhciBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZShmb250U2l6ZSk7XG4gICAgdmFyIGxpbmVIZWlnaHQgPSBoZWlnaHQgKyBoZWlnaHQgKiAwLjI7XG4gICAgdmFyIHRleHRMaW5lcyA9IFtdO1xuICAgIHZhciBtaW5YID0gYm91bmRzLng7XG4gICAgdmFyIG1pblkgPSBib3VuZHMueTtcbiAgICB2YXIgbWF4WCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoO1xuICAgIHZhciBtYXhZID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0O1xuICAgIHZhciB5ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0O1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgcHJldlJlbWFpbmRlciA9IGxpbmVzW2lkeF07XG4gICAgICAgIHdoaWxlIChwcmV2UmVtYWluZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBfYiA9IHNwbGl0T3V0TGluZXMocHJldlJlbWFpbmRlciwgYm91bmRzLndpZHRoLCBmb250LCBmb250U2l6ZSksIGxpbmUgPSBfYi5saW5lLCBlbmNvZGVkID0gX2IuZW5jb2RlZCwgd2lkdGggPSBfYi53aWR0aCwgcmVtYWluZGVyID0gX2IucmVtYWluZGVyO1xuICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICB2YXIgeCA9IChhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuTGVmdCA/IGJvdW5kcy54XG4gICAgICAgICAgICAgICAgOiBhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuQ2VudGVyID8gYm91bmRzLnggKyAoYm91bmRzLndpZHRoIC8gMikgLSAod2lkdGggLyAyKVxuICAgICAgICAgICAgICAgICAgICA6IGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5SaWdodCA/IGJvdW5kcy54ICsgYm91bmRzLndpZHRoIC0gd2lkdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYm91bmRzLngpO1xuICAgICAgICAgICAgeSAtPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgaWYgKHggPCBtaW5YKVxuICAgICAgICAgICAgICAgIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKVxuICAgICAgICAgICAgICAgIG1pblkgPSB5O1xuICAgICAgICAgICAgaWYgKHggKyB3aWR0aCA+IG1heFgpXG4gICAgICAgICAgICAgICAgbWF4WCA9IHggKyB3aWR0aDtcbiAgICAgICAgICAgIGlmICh5ICsgaGVpZ2h0ID4gbWF4WSlcbiAgICAgICAgICAgICAgICBtYXhZID0geSArIGhlaWdodDtcbiAgICAgICAgICAgIHRleHRMaW5lcy5wdXNoKHsgdGV4dDogbGluZSwgZW5jb2RlZDogZW5jb2RlZCwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgeDogeCwgeTogeSB9KTtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJpbSBsaW5lcyB0aGF0IHdlIGhhZCB0byBzcGxpdCBvdXJzZWx2ZXMuIFNvIHdlIHdvbid0IHRyaW0gbGluZXNcbiAgICAgICAgICAgIC8vIHRoYXQgdGhlIHVzZXIgcHJvdmlkZWQgdGhlbXNlbHZlcyB3aXRoIHdoaXRlc3BhY2UuXG4gICAgICAgICAgICBwcmV2UmVtYWluZGVyID0gcmVtYWluZGVyID09PSBudWxsIHx8IHJlbWFpbmRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVtYWluZGVyLnRyaW0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgIGxpbmVIZWlnaHQ6IGxpbmVIZWlnaHQsXG4gICAgICAgIGxpbmVzOiB0ZXh0TGluZXMsXG4gICAgICAgIGJvdW5kczoge1xuICAgICAgICAgICAgeDogbWluWCxcbiAgICAgICAgICAgIHk6IG1pblksXG4gICAgICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgICAgICB9LFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBsYXlvdXRDb21iZWRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIF9hKSB7XG4gICAgdmFyIGZvbnRTaXplID0gX2EuZm9udFNpemUsIGZvbnQgPSBfYS5mb250LCBib3VuZHMgPSBfYS5ib3VuZHMsIGNlbGxDb3VudCA9IF9hLmNlbGxDb3VudDtcbiAgICB2YXIgbGluZSA9IG1lcmdlTGluZXMoY2xlYW5UZXh0KHRleHQpKTtcbiAgICBpZiAobGluZS5sZW5ndGggPiBjZWxsQ291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbWJlZFRleHRMYXlvdXRFcnJvcihsaW5lLmxlbmd0aCwgY2VsbENvdW50KTtcbiAgICB9XG4gICAgaWYgKGZvbnRTaXplID09PSB1bmRlZmluZWQgfHwgZm9udFNpemUgPT09IDApIHtcbiAgICAgICAgZm9udFNpemUgPSBjb21wdXRlQ29tYmVkRm9udFNpemUobGluZSwgZm9udCwgYm91bmRzLCBjZWxsQ291bnQpO1xuICAgIH1cbiAgICB2YXIgY2VsbFdpZHRoID0gYm91bmRzLndpZHRoIC8gY2VsbENvdW50O1xuICAgIHZhciBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZShmb250U2l6ZSwgeyBkZXNjZW5kZXI6IGZhbHNlIH0pO1xuICAgIHZhciB5ID0gYm91bmRzLnkgKyAoYm91bmRzLmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyKTtcbiAgICB2YXIgY2VsbHMgPSBbXTtcbiAgICB2YXIgbWluWCA9IGJvdW5kcy54O1xuICAgIHZhciBtaW5ZID0gYm91bmRzLnk7XG4gICAgdmFyIG1heFggPSBib3VuZHMueCArIGJvdW5kcy53aWR0aDtcbiAgICB2YXIgbWF4WSA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDtcbiAgICB2YXIgY2VsbE9mZnNldCA9IDA7XG4gICAgdmFyIGNoYXJPZmZzZXQgPSAwO1xuICAgIHdoaWxlIChjZWxsT2Zmc2V0IDwgY2VsbENvdW50KSB7XG4gICAgICAgIHZhciBfYiA9IGNoYXJBdEluZGV4KGxpbmUsIGNoYXJPZmZzZXQpLCBjaGFyID0gX2JbMF0sIGNoYXJMZW5ndGggPSBfYlsxXTtcbiAgICAgICAgdmFyIGVuY29kZWQgPSBmb250LmVuY29kZVRleHQoY2hhcik7XG4gICAgICAgIHZhciB3aWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUoY2hhciwgZm9udFNpemUpO1xuICAgICAgICB2YXIgY2VsbENlbnRlciA9IGJvdW5kcy54ICsgKGNlbGxXaWR0aCAqIGNlbGxPZmZzZXQgKyBjZWxsV2lkdGggLyAyKTtcbiAgICAgICAgdmFyIHggPSBjZWxsQ2VudGVyIC0gd2lkdGggLyAyO1xuICAgICAgICBpZiAoeCA8IG1pblgpXG4gICAgICAgICAgICBtaW5YID0geDtcbiAgICAgICAgaWYgKHkgPCBtaW5ZKVxuICAgICAgICAgICAgbWluWSA9IHk7XG4gICAgICAgIGlmICh4ICsgd2lkdGggPiBtYXhYKVxuICAgICAgICAgICAgbWF4WCA9IHggKyB3aWR0aDtcbiAgICAgICAgaWYgKHkgKyBoZWlnaHQgPiBtYXhZKVxuICAgICAgICAgICAgbWF4WSA9IHkgKyBoZWlnaHQ7XG4gICAgICAgIGNlbGxzLnB1c2goeyB0ZXh0OiBsaW5lLCBlbmNvZGVkOiBlbmNvZGVkLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LCB4OiB4LCB5OiB5IH0pO1xuICAgICAgICBjZWxsT2Zmc2V0ICs9IDE7XG4gICAgICAgIGNoYXJPZmZzZXQgKz0gY2hhckxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICBjZWxsczogY2VsbHMsXG4gICAgICAgIGJvdW5kczoge1xuICAgICAgICAgICAgeDogbWluWCxcbiAgICAgICAgICAgIHk6IG1pblksXG4gICAgICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgICAgICB9LFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBsYXlvdXRTaW5nbGVsaW5lVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBfYSkge1xuICAgIHZhciBhbGlnbm1lbnQgPSBfYS5hbGlnbm1lbnQsIGZvbnRTaXplID0gX2EuZm9udFNpemUsIGZvbnQgPSBfYS5mb250LCBib3VuZHMgPSBfYS5ib3VuZHM7XG4gICAgdmFyIGxpbmUgPSBtZXJnZUxpbmVzKGNsZWFuVGV4dCh0ZXh0KSk7XG4gICAgaWYgKGZvbnRTaXplID09PSB1bmRlZmluZWQgfHwgZm9udFNpemUgPT09IDApIHtcbiAgICAgICAgZm9udFNpemUgPSBjb21wdXRlRm9udFNpemUoW2xpbmVdLCBmb250LCBib3VuZHMpO1xuICAgIH1cbiAgICB2YXIgZW5jb2RlZCA9IGZvbnQuZW5jb2RlVGV4dChsaW5lKTtcbiAgICB2YXIgd2lkdGggPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKGxpbmUsIGZvbnRTaXplKTtcbiAgICB2YXIgaGVpZ2h0ID0gZm9udC5oZWlnaHRBdFNpemUoZm9udFNpemUsIHsgZGVzY2VuZGVyOiBmYWxzZSB9KTtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICB2YXIgeCA9IChhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuTGVmdCA/IGJvdW5kcy54XG4gICAgICAgIDogYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LkNlbnRlciA/IGJvdW5kcy54ICsgKGJvdW5kcy53aWR0aCAvIDIpIC0gKHdpZHRoIC8gMilcbiAgICAgICAgICAgIDogYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LlJpZ2h0ID8gYm91bmRzLnggKyBib3VuZHMud2lkdGggLSB3aWR0aFxuICAgICAgICAgICAgICAgIDogYm91bmRzLngpO1xuICAgIHZhciB5ID0gYm91bmRzLnkgKyAoYm91bmRzLmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgIGxpbmU6IHsgdGV4dDogbGluZSwgZW5jb2RlZDogZW5jb2RlZCwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgeDogeCwgeTogeSB9LFxuICAgICAgICBib3VuZHM6IHsgeDogeCwgeTogeSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9LFxuICAgIH07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGF5b3V0LmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgcGFrbyBmcm9tICdwYWtvJztcbmltcG9ydCBQREZIZWFkZXIgZnJvbSBcIi4vZG9jdW1lbnQvUERGSGVhZGVyXCI7XG5pbXBvcnQgeyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkJvb2wgZnJvbSBcIi4vb2JqZWN0cy9QREZCb29sXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bGwgZnJvbSBcIi4vb2JqZWN0cy9QREZOdWxsXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL29iamVjdHMvUERGT2JqZWN0XCI7XG5pbXBvcnQgUERGUmF3U3RyZWFtIGZyb20gXCIuL29iamVjdHMvUERGUmF3U3RyZWFtXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGT3BlcmF0b3IgZnJvbSBcIi4vb3BlcmF0b3JzL1BERk9wZXJhdG9yXCI7XG5pbXBvcnQgT3BzIGZyb20gXCIuL29wZXJhdG9ycy9QREZPcGVyYXRvck5hbWVzXCI7XG5pbXBvcnQgUERGQ29udGVudFN0cmVhbSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERkNvbnRlbnRTdHJlYW1cIjtcbmltcG9ydCB7IHR5cGVkQXJyYXlGb3IgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFNpbXBsZVJORyB9IGZyb20gXCIuLi91dGlscy9ybmdcIjtcbnZhciBieUFzY2VuZGluZ09iamVjdE51bWJlciA9IGZ1bmN0aW9uIChfYSwgX2IpIHtcbiAgICB2YXIgYSA9IF9hWzBdO1xuICAgIHZhciBiID0gX2JbMF07XG4gICAgcmV0dXJuIGEub2JqZWN0TnVtYmVyIC0gYi5vYmplY3ROdW1iZXI7XG59O1xudmFyIFBERkNvbnRleHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGQ29udGV4dCgpIHtcbiAgICAgICAgdGhpcy5sYXJnZXN0T2JqZWN0TnVtYmVyID0gMDtcbiAgICAgICAgdGhpcy5oZWFkZXIgPSBQREZIZWFkZXIuZm9yVmVyc2lvbigxLCA3KTtcbiAgICAgICAgdGhpcy50cmFpbGVySW5mbyA9IHt9O1xuICAgICAgICB0aGlzLmluZGlyZWN0T2JqZWN0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5ybmcgPSBTaW1wbGVSTkcud2l0aFNlZWQoMSk7XG4gICAgfVxuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmFzc2lnbiA9IGZ1bmN0aW9uIChyZWYsIG9iamVjdCkge1xuICAgICAgICB0aGlzLmluZGlyZWN0T2JqZWN0cy5zZXQocmVmLCBvYmplY3QpO1xuICAgICAgICBpZiAocmVmLm9iamVjdE51bWJlciA+IHRoaXMubGFyZ2VzdE9iamVjdE51bWJlcikge1xuICAgICAgICAgICAgdGhpcy5sYXJnZXN0T2JqZWN0TnVtYmVyID0gcmVmLm9iamVjdE51bWJlcjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUubmV4dFJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sYXJnZXN0T2JqZWN0TnVtYmVyICs9IDE7XG4gICAgICAgIHJldHVybiBQREZSZWYub2YodGhpcy5sYXJnZXN0T2JqZWN0TnVtYmVyKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5uZXh0UmVmKCk7XG4gICAgICAgIHRoaXMuYXNzaWduKHJlZiwgb2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIHJlZjtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kaXJlY3RPYmplY3RzLmRlbGV0ZShyZWYpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUubG9va3VwTWF5YmUgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHZhciB0eXBlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdHlwZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogYHByZXNlcnZlUERGTnVsbGAgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBTaG91bGQgYmVcbiAgICAgICAgLy8gcmVtb3ZlZCBpbiBuZXh0IGJyZWFraW5nIEFQSSBjaGFuZ2UuXG4gICAgICAgIHZhciBwcmVzZXJ2ZVBERk51bGwgPSB0eXBlcy5pbmNsdWRlcyhQREZOdWxsKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlZiBpbnN0YW5jZW9mIFBERlJlZiA/IHRoaXMuaW5kaXJlY3RPYmplY3RzLmdldChyZWYpIDogcmVmO1xuICAgICAgICBpZiAoIXJlc3VsdCB8fCAocmVzdWx0ID09PSBQREZOdWxsICYmICFwcmVzZXJ2ZVBERk51bGwpKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdHlwZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2lkeF07XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gUERGTnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IFBERk51bGwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgdHlwZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvcih0eXBlcywgcmVzdWx0KTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmxvb2t1cCA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0eXBlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gcmVmIGluc3RhbmNlb2YgUERGUmVmID8gdGhpcy5pbmRpcmVjdE9iamVjdHMuZ2V0KHJlZikgOiByZWY7XG4gICAgICAgIGlmICh0eXBlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0eXBlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gdHlwZXNbaWR4XTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBQREZOdWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gUERGTnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiB0eXBlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yKHR5cGVzLCByZXN1bHQpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZ2V0T2JqZWN0UmVmID0gZnVuY3Rpb24gKHBkZk9iamVjdCkge1xuICAgICAgICB2YXIgZW50cmllcyA9IEFycmF5LmZyb20odGhpcy5pbmRpcmVjdE9iamVjdHMuZW50cmllcygpKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwgcmVmID0gX2FbMF0sIG9iamVjdCA9IF9hWzFdO1xuICAgICAgICAgICAgaWYgKG9iamVjdCA9PT0gcGRmT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZW51bWVyYXRlSW5kaXJlY3RPYmplY3RzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmluZGlyZWN0T2JqZWN0cy5lbnRyaWVzKCkpLnNvcnQoYnlBc2NlbmRpbmdPYmplY3ROdW1iZXIpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUub2JqID0gZnVuY3Rpb24gKGxpdGVyYWwpIHtcbiAgICAgICAgaWYgKGxpdGVyYWwgaW5zdGFuY2VvZiBQREZPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBsaXRlcmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpdGVyYWwgPT09IG51bGwgfHwgbGl0ZXJhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUERGTnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbGl0ZXJhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBQREZOYW1lLm9mKGxpdGVyYWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsaXRlcmFsID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIFBERk51bWJlci5vZihsaXRlcmFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbGl0ZXJhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gbGl0ZXJhbCA/IFBERkJvb2wuVHJ1ZSA6IFBERkJvb2wuRmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShsaXRlcmFsKSkge1xuICAgICAgICAgICAgdmFyIGFycmF5ID0gUERGQXJyYXkud2l0aENvbnRleHQodGhpcyk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsaXRlcmFsLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIGFycmF5LnB1c2godGhpcy5vYmoobGl0ZXJhbFtpZHhdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgZGljdCA9IFBERkRpY3Qud2l0aENvbnRleHQodGhpcyk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGxpdGVyYWwpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0ga2V5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpZHhdO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGxpdGVyYWxba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZihrZXkpLCB0aGlzLm9iaih2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpY3Q7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLnN0cmVhbSA9IGZ1bmN0aW9uIChjb250ZW50cywgZGljdCkge1xuICAgICAgICBpZiAoZGljdCA9PT0gdm9pZCAwKSB7IGRpY3QgPSB7fTsgfVxuICAgICAgICByZXR1cm4gUERGUmF3U3RyZWFtLm9mKHRoaXMub2JqKGRpY3QpLCB0eXBlZEFycmF5Rm9yKGNvbnRlbnRzKSk7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5mbGF0ZVN0cmVhbSA9IGZ1bmN0aW9uIChjb250ZW50cywgZGljdCkge1xuICAgICAgICBpZiAoZGljdCA9PT0gdm9pZCAwKSB7IGRpY3QgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0ocGFrby5kZWZsYXRlKHR5cGVkQXJyYXlGb3IoY29udGVudHMpKSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRpY3QpLCB7IEZpbHRlcjogJ0ZsYXRlRGVjb2RlJyB9KSk7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5jb250ZW50U3RyZWFtID0gZnVuY3Rpb24gKG9wZXJhdG9ycywgZGljdCkge1xuICAgICAgICBpZiAoZGljdCA9PT0gdm9pZCAwKSB7IGRpY3QgPSB7fTsgfVxuICAgICAgICByZXR1cm4gUERGQ29udGVudFN0cmVhbS5vZih0aGlzLm9iaihkaWN0KSwgb3BlcmF0b3JzKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmZvcm1YT2JqZWN0ID0gZnVuY3Rpb24gKG9wZXJhdG9ycywgZGljdCkge1xuICAgICAgICBpZiAoZGljdCA9PT0gdm9pZCAwKSB7IGRpY3QgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50U3RyZWFtKG9wZXJhdG9ycywgX19hc3NpZ24oX19hc3NpZ24oeyBCQm94OiB0aGlzLm9iaihbMCwgMCwgMCwgMF0pLCBNYXRyaXg6IHRoaXMub2JqKFsxLCAwLCAwLCAxLCAwLCAwXSkgfSwgZGljdCksIHsgVHlwZTogJ1hPYmplY3QnLCBTdWJ0eXBlOiAnRm9ybScgfSkpO1xuICAgIH07XG4gICAgLypcbiAgICAgKiBSZWZlcmVuY2UgdG8gUERGQ29udGVudFN0cmVhbSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIFBERk9wZXJhdG9yOiBgcWAuXG4gICAgICogVXNlZCBieSBbW1BERlBhZ2VMZWFmXV0gaW5zdGFuY2VzIHRvIGVuc3VyZSB0aGF0IHdoZW4gY29udGVudCBzdHJlYW1zIGFyZVxuICAgICAqIGFkZGVkIHRvIGEgbW9kaWZpZWQgUERGLCB0aGV5IHN0YXJ0IGluIHRoZSBkZWZhdWx0LCB1bmNoYW5nZWQgZ3JhcGhpY3NcbiAgICAgKiBzdGF0ZS5cbiAgICAgKi9cbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5nZXRQdXNoR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnB1c2hHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHVzaEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5vYmooe30pO1xuICAgICAgICB2YXIgb3AgPSBQREZPcGVyYXRvci5vZihPcHMuUHVzaEdyYXBoaWNzU3RhdGUpO1xuICAgICAgICB2YXIgc3RyZWFtID0gUERGQ29udGVudFN0cmVhbS5vZihkaWN0LCBbb3BdKTtcbiAgICAgICAgdGhpcy5wdXNoR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWYgPSB0aGlzLnJlZ2lzdGVyKHN0cmVhbSk7XG4gICAgICAgIHJldHVybiB0aGlzLnB1c2hHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZjtcbiAgICB9O1xuICAgIC8qXG4gICAgICogUmVmZXJlbmNlIHRvIFBERkNvbnRlbnRTdHJlYW0gdGhhdCBjb250YWlucyBhIHNpbmdsZSBQREZPcGVyYXRvcjogYFFgLlxuICAgICAqIFVzZWQgYnkgW1tQREZQYWdlTGVhZl1dIGluc3RhbmNlcyB0byBlbnN1cmUgdGhhdCB3aGVuIGNvbnRlbnQgc3RyZWFtcyBhcmVcbiAgICAgKiBhZGRlZCB0byBhIG1vZGlmaWVkIFBERiwgdGhleSBzdGFydCBpbiB0aGUgZGVmYXVsdCwgdW5jaGFuZ2VkIGdyYXBoaWNzXG4gICAgICogc3RhdGUuXG4gICAgICovXG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZ2V0UG9wR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3BHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGljdCA9IHRoaXMub2JqKHt9KTtcbiAgICAgICAgdmFyIG9wID0gUERGT3BlcmF0b3Iub2YoT3BzLlBvcEdyYXBoaWNzU3RhdGUpO1xuICAgICAgICB2YXIgc3RyZWFtID0gUERGQ29udGVudFN0cmVhbS5vZihkaWN0LCBbb3BdKTtcbiAgICAgICAgdGhpcy5wb3BHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZiA9IHRoaXMucmVnaXN0ZXIoc3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9wR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWY7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5hZGRSYW5kb21TdWZmaXggPSBmdW5jdGlvbiAocHJlZml4LCBzdWZmaXhMZW5ndGgpIHtcbiAgICAgICAgaWYgKHN1ZmZpeExlbmd0aCA9PT0gdm9pZCAwKSB7IHN1ZmZpeExlbmd0aCA9IDQ7IH1cbiAgICAgICAgcmV0dXJuIHByZWZpeCArIFwiLVwiICsgTWF0aC5mbG9vcih0aGlzLnJuZy5uZXh0SW50KCkgKiBNYXRoLnBvdygxMCwgc3VmZml4TGVuZ3RoKSk7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBQREZDb250ZXh0KCk7IH07XG4gICAgcmV0dXJuIFBERkNvbnRleHQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQ29udGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkNvbnRleHQuanMubWFwIiwiaW1wb3J0IFBERkFycmF5IGZyb20gXCIuL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuL29iamVjdHMvUERGU3RyZWFtXCI7XG5pbXBvcnQgUERGUGFnZUxlYWYgZnJvbSBcIi4vc3RydWN0dXJlcy9QREZQYWdlTGVhZlwiO1xuLyoqXG4gKiBQREZPYmplY3RDb3BpZXIgY29waWVzIFBERk9iamVjdHMgZnJvbSBhIHNyYyBjb250ZXh0IHRvIGEgZGVzdCBjb250ZXh0LlxuICogVGhlIHByaW1hcnkgdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gY29weSBwYWdlcyBiZXR3ZWVuIFBERnMuXG4gKlxuICogX0NvcHlpbmdfIGFuIG9iamVjdCB3aXRoIGEgUERGT2JqZWN0Q29waWVyIGlzIGRpZmZlcmVudCBmcm9tIF9jbG9uaW5nXyBhblxuICogb2JqZWN0IHdpdGggaXRzIFtbUERGT2JqZWN0LmNsb25lXV0gbWV0aG9kOlxuICpcbiAqIGBgYFxuICogICBjb25zdCBzcmM6IFBERkNvbnRleHQgPSAuLi5cbiAqICAgY29uc3QgZGVzdDogUERGQ29udGV4dCA9IC4uLlxuICogICBjb25zdCBvcmlnaW5hbE9iamVjdDogUERGT2JqZWN0ID0gLi4uXG4gKiAgIGNvbnN0IGNvcGllZE9iamVjdCA9IFBERk9iamVjdENvcGllci5mb3Ioc3JjLCBkZXN0KS5jb3B5KG9yaWdpbmFsT2JqZWN0KTtcbiAqICAgY29uc3QgY2xvbmVkT2JqZWN0ID0gb3JpZ2luYWxPYmplY3QuY2xvbmUoKTtcbiAqIGBgYFxuICpcbiAqIENvcHlpbmcgYW4gb2JqZWN0IGlzIGVxdWl2YWxlbnQgdG8gY2xvbmluZyBpdCBhbmQgdGhlbiBjb3B5aW5nIG92ZXIgYW55IG90aGVyXG4gKiBvYmplY3RzIHRoYXQgaXQgcmVmZXJlbmNlcy4gTm90ZSB0aGF0IG9ubHkgZGljdGlvbmFyaWVzLCBhcnJheXMsIGFuZCBzdHJlYW1zXG4gKiAob3Igc3RydWN0dXJlcyBidWlsZCBmcm9tIHRoZW0pIGNhbiBjb250YWluIGluZGlyZWN0IHJlZmVyZW5jZXMgdG8gb3RoZXJcbiAqIG9iamVjdHMuIENvcHlpbmcgYSBQREZPYmplY3QgdGhhdCBpcyBub3QgYSBkaWN0aW9uYXJ5LCBhcnJheSwgb3Igc3RyZWFtIGlzXG4gKiBzdXBwb3J0ZWQsIGJ1dCBpcyBlcXVpdmFsZW50IHRvIGNsb25pbmcgaXQuXG4gKi9cbnZhciBQREZPYmplY3RDb3BpZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGT2JqZWN0Q29waWVyKHNyYywgZGVzdCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnRyYXZlcnNlZE9iamVjdHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0aGlzLmNvcHkgPSBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAob2JqZWN0IGluc3RhbmNlb2YgUERGUGFnZUxlYWYgPyBfdGhpcy5jb3B5UERGUGFnZShvYmplY3QpXG4gICAgICAgICAgICA6IG9iamVjdCBpbnN0YW5jZW9mIFBERkRpY3QgPyBfdGhpcy5jb3B5UERGRGljdChvYmplY3QpXG4gICAgICAgICAgICAgICAgOiBvYmplY3QgaW5zdGFuY2VvZiBQREZBcnJheSA/IF90aGlzLmNvcHlQREZBcnJheShvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIDogb2JqZWN0IGluc3RhbmNlb2YgUERGU3RyZWFtID8gX3RoaXMuY29weVBERlN0cmVhbShvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9iamVjdCBpbnN0YW5jZW9mIFBERlJlZiA/IF90aGlzLmNvcHlQREZJbmRpcmVjdE9iamVjdChvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvYmplY3QuY2xvbmUoKSk7IH07XG4gICAgICAgIHRoaXMuY29weVBERlBhZ2UgPSBmdW5jdGlvbiAob3JpZ2luYWxQYWdlKSB7XG4gICAgICAgICAgICB2YXIgY2xvbmVkUGFnZSA9IG9yaWdpbmFsUGFnZS5jbG9uZSgpO1xuICAgICAgICAgICAgLy8gTW92ZSBhbnkgZW50cmllcyB0aGF0IHRoZSBvcmlnaW5hbFBhZ2UgaXMgaW5oZXJpdGluZyBmcm9tIGl0cyBwYXJlbnRcbiAgICAgICAgICAgIC8vIHRyZWUgbm9kZXMgZGlyZWN0bHkgaW50byBvcmlnaW5hbFBhZ2Ugc28gdGhleSBhcmUgcHJlc2VydmVkIGR1cmluZ1xuICAgICAgICAgICAgLy8gdGhlIGNvcHkuXG4gICAgICAgICAgICB2YXIgSW5oZXJpdGFibGVFbnRyaWVzID0gUERGUGFnZUxlYWYuSW5oZXJpdGFibGVFbnRyaWVzO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gSW5oZXJpdGFibGVFbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKEluaGVyaXRhYmxlRW50cmllc1tpZHhdKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjbG9uZWRQYWdlLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjbG9uZWRQYWdlLmdldChrZXkpICYmIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICBjbG9uZWRQYWdlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcGFyZW50IHJlZmVyZW5jZSB0byBwcmV2ZW50IHRoZSB3aG9sZSBkb25vciBkb2N1bWVudCdzIHBhZ2VcbiAgICAgICAgICAgIC8vIHRyZWUgZnJvbSBiZWluZyBjb3BpZWQgd2hlbiB3ZSBvbmx5IG5lZWQgYSBzaW5nbGUgcGFnZS5cbiAgICAgICAgICAgIGNsb25lZFBhZ2UuZGVsZXRlKFBERk5hbWUub2YoJ1BhcmVudCcpKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jb3B5UERGRGljdChjbG9uZWRQYWdlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb3B5UERGRGljdCA9IGZ1bmN0aW9uIChvcmlnaW5hbERpY3QpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy50cmF2ZXJzZWRPYmplY3RzLmhhcyhvcmlnaW5hbERpY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuZ2V0KG9yaWdpbmFsRGljdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2xvbmVkRGljdCA9IG9yaWdpbmFsRGljdC5jbG9uZShfdGhpcy5kZXN0KTtcbiAgICAgICAgICAgIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuc2V0KG9yaWdpbmFsRGljdCwgY2xvbmVkRGljdCk7XG4gICAgICAgICAgICB2YXIgZW50cmllcyA9IG9yaWdpbmFsRGljdC5lbnRyaWVzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICAgICAgY2xvbmVkRGljdC5zZXQoa2V5LCBfdGhpcy5jb3B5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xvbmVkRGljdDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb3B5UERGQXJyYXkgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSkge1xuICAgICAgICAgICAgaWYgKF90aGlzLnRyYXZlcnNlZE9iamVjdHMuaGFzKG9yaWdpbmFsQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuZ2V0KG9yaWdpbmFsQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNsb25lZEFycmF5ID0gb3JpZ2luYWxBcnJheS5jbG9uZShfdGhpcy5kZXN0KTtcbiAgICAgICAgICAgIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuc2V0KG9yaWdpbmFsQXJyYXksIGNsb25lZEFycmF5KTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9yaWdpbmFsQXJyYXkuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gb3JpZ2luYWxBcnJheS5nZXQoaWR4KTtcbiAgICAgICAgICAgICAgICBjbG9uZWRBcnJheS5zZXQoaWR4LCBfdGhpcy5jb3B5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xvbmVkQXJyYXk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29weVBERlN0cmVhbSA9IGZ1bmN0aW9uIChvcmlnaW5hbFN0cmVhbSkge1xuICAgICAgICAgICAgaWYgKF90aGlzLnRyYXZlcnNlZE9iamVjdHMuaGFzKG9yaWdpbmFsU3RyZWFtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLmdldChvcmlnaW5hbFN0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2xvbmVkU3RyZWFtID0gb3JpZ2luYWxTdHJlYW0uY2xvbmUoX3RoaXMuZGVzdCk7XG4gICAgICAgICAgICBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLnNldChvcmlnaW5hbFN0cmVhbSwgY2xvbmVkU3RyZWFtKTtcbiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gb3JpZ2luYWxTdHJlYW0uZGljdC5lbnRyaWVzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICAgICAgY2xvbmVkU3RyZWFtLmRpY3Quc2V0KGtleSwgX3RoaXMuY29weSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsb25lZFN0cmVhbTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb3B5UERGSW5kaXJlY3RPYmplY3QgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICB2YXIgYWxyZWFkeU1hcHBlZCA9IF90aGlzLnRyYXZlcnNlZE9iamVjdHMuaGFzKHJlZik7XG4gICAgICAgICAgICBpZiAoIWFscmVhZHlNYXBwZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3UmVmID0gX3RoaXMuZGVzdC5uZXh0UmVmKCk7XG4gICAgICAgICAgICAgICAgX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5zZXQocmVmLCBuZXdSZWYpO1xuICAgICAgICAgICAgICAgIHZhciBkZXJlZmVyZW5jZWRWYWx1ZSA9IF90aGlzLnNyYy5sb29rdXAocmVmKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVyZWZlcmVuY2VkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lZCA9IF90aGlzLmNvcHkoZGVyZWZlcmVuY2VkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kZXN0LmFzc2lnbihuZXdSZWYsIGNsb25lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuZ2V0KHJlZik7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3JjID0gc3JjO1xuICAgICAgICB0aGlzLmRlc3QgPSBkZXN0O1xuICAgIH1cbiAgICBQREZPYmplY3RDb3BpZXIuZm9yID0gZnVuY3Rpb24gKHNyYywgZGVzdCkge1xuICAgICAgICByZXR1cm4gbmV3IFBERk9iamVjdENvcGllcihzcmMsIGRlc3QpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9iamVjdENvcGllcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPYmplY3RDb3BpZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPYmplY3RDb3BpZXIuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvVGVybWluYWxcIjtcbmltcG9ydCB7IEluZGV4T3V0T2ZCb3VuZHNFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZBY3JvQnV0dG9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvQnV0dG9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9CdXR0b24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUuT3B0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ09wdCcpLCBQREZTdHJpbmcsIFBERkhleFN0cmluZywgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUuc2V0T3B0ID0gZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ09wdCcpLCB0aGlzLmRpY3QuY29udGV4dC5vYmoob3B0KSk7XG4gICAgfTtcbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5nZXRFeHBvcnRWYWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvcHQgPSB0aGlzLk9wdCgpO1xuICAgICAgICBpZiAoIW9wdClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChvcHQgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgb3B0IGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gW29wdF07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHQuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBvcHQubG9va3VwKGlkeCk7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9O1xuICAgIFBERkFjcm9CdXR0b24ucHJvdG90eXBlLnJlbW92ZUV4cG9ydFZhbHVlID0gZnVuY3Rpb24gKGlkeCkge1xuICAgICAgICB2YXIgb3B0ID0gdGhpcy5PcHQoKTtcbiAgICAgICAgaWYgKCFvcHQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChvcHQgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgb3B0IGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAoaWR4ICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXJyb3IoaWR4LCAwLCAwKTtcbiAgICAgICAgICAgIHRoaXMuc2V0T3B0KFtdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+IG9wdC5zaXplKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0Vycm9yKGlkeCwgMCwgb3B0LnNpemUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHQucmVtb3ZlKGlkeCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEVuZm9yY2UgdXNlIHVzZSBvZiAvT3B0IGV2ZW4gaWYgaXQgaXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5XG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUubm9ybWFsaXplRXhwb3J0VmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHZhciBleHBvcnRWYWx1ZXMgPSAoX2EgPSB0aGlzLmdldEV4cG9ydFZhbHVlcygpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgdmFyIE9wdCA9IFtdO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBleHBvcnRWYWwgPSAoX2IgPSBleHBvcnRWYWx1ZXNbaWR4XSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogUERGSGV4U3RyaW5nLmZyb21UZXh0KChfZCA9IChfYyA9IHdpZGdldC5nZXRPblZhbHVlKCkpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5kZWNvZGVUZXh0KCkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICcnKTtcbiAgICAgICAgICAgIE9wdC5wdXNoKGV4cG9ydFZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRPcHQoT3B0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldXNlcyBleGlzdGluZyBvcHQgaWYgb25lIGV4aXN0cyB3aXRoIHRoZSBzYW1lIHZhbHVlIChhc3N1bWluZ1xuICAgICAqIGB1c2VFeGlzdGluZ0lkeGAgaXMgYHRydWVgKS4gUmV0dXJucyBpbmRleCBvZiBleGlzdGluZyAob3IgbmV3KSBvcHQuXG4gICAgICovXG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUuYWRkT3B0ID0gZnVuY3Rpb24gKG9wdCwgdXNlRXhpc3RpbmdPcHRJZHgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZUV4cG9ydFZhbHVlcygpO1xuICAgICAgICB2YXIgb3B0VGV4dCA9IG9wdC5kZWNvZGVUZXh0KCk7XG4gICAgICAgIHZhciBleGlzdGluZ0lkeDtcbiAgICAgICAgaWYgKHVzZUV4aXN0aW5nT3B0SWR4KSB7XG4gICAgICAgICAgICB2YXIgZXhwb3J0VmFsdWVzID0gKF9hID0gdGhpcy5nZXRFeHBvcnRWYWx1ZXMoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW107XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBleHBvcnRWYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGV4cG9ydFZhbCA9IGV4cG9ydFZhbHVlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGlmIChleHBvcnRWYWwuZGVjb2RlVGV4dCgpID09PSBvcHRUZXh0KVxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkeCA9IGlkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgT3B0ID0gdGhpcy5PcHQoKTtcbiAgICAgICAgT3B0LnB1c2gob3B0KTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nSWR4ICE9PSBudWxsICYmIGV4aXN0aW5nSWR4ICE9PSB2b2lkIDAgPyBleGlzdGluZ0lkeCA6IE9wdC5zaXplKCkgLSAxO1xuICAgIH07XG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUuYWRkV2lkZ2V0V2l0aE9wdCA9IGZ1bmN0aW9uICh3aWRnZXQsIG9wdCwgdXNlRXhpc3RpbmdPcHRJZHgpIHtcbiAgICAgICAgdmFyIG9wdElkeCA9IHRoaXMuYWRkT3B0KG9wdCwgdXNlRXhpc3RpbmdPcHRJZHgpO1xuICAgICAgICB2YXIgYXBTdGF0ZVZhbHVlID0gUERGTmFtZS5vZihTdHJpbmcob3B0SWR4KSk7XG4gICAgICAgIHRoaXMuYWRkV2lkZ2V0KHdpZGdldCk7XG4gICAgICAgIHJldHVybiBhcFN0YXRlVmFsdWU7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0J1dHRvbjtcbn0oUERGQWNyb1Rlcm1pbmFsKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvQnV0dG9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0J1dHRvbi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBY3JvQnV0dG9uIGZyb20gXCIuL1BERkFjcm9CdXR0b25cIjtcbmltcG9ydCB7IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkFjcm9DaGVja0JveCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb0NoZWNrQm94LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9DaGVja0JveCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvQ2hlY2tCb3gucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIG9uVmFsdWUgPSAoX2EgPSB0aGlzLmdldE9uVmFsdWUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUERGTmFtZS5vZignWWVzJyk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gb25WYWx1ZSAmJiB2YWx1ZSAhPT0gUERGTmFtZS5vZignT2ZmJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVicpLCB2YWx1ZSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gd2lkZ2V0LmdldE9uVmFsdWUoKSA9PT0gdmFsdWUgPyB2YWx1ZSA6IFBERk5hbWUub2YoJ09mZicpO1xuICAgICAgICAgICAgd2lkZ2V0LnNldEFwcGVhcmFuY2VTdGF0ZShzdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkFjcm9DaGVja0JveC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2ID0gdGhpcy5WKCk7XG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgUERGTmFtZSlcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICByZXR1cm4gUERGTmFtZS5vZignT2ZmJyk7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hlY2tCb3gucHJvdG90eXBlLmdldE9uVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmdldFdpZGdldHMoKVswXTtcbiAgICAgICAgcmV0dXJuIHdpZGdldCA9PT0gbnVsbCB8fCB3aWRnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpZGdldC5nZXRPblZhbHVlKCk7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hlY2tCb3guZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0NoZWNrQm94KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hlY2tCb3guY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBGVDogJ0J0bicsXG4gICAgICAgICAgICBLaWRzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGRpY3QpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9DaGVja0JveChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9DaGVja0JveDtcbn0oUERGQWNyb0J1dHRvbikpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb0NoZWNrQm94O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0NoZWNrQm94LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkFjcm9UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvVGVybWluYWxcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgeyBBY3JvQ2hvaWNlRmxhZ3MgfSBmcm9tIFwiLi9mbGFnc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IsIE11bHRpU2VsZWN0VmFsdWVFcnJvciwgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGQWNyb0Nob2ljZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb0Nob2ljZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvQ2hvaWNlKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9DaG9pY2UucHJvdG90eXBlLnNldFZhbHVlcyA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuQ29tYm8pICYmXG4gICAgICAgICAgICAhdGhpcy5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5FZGl0KSAmJlxuICAgICAgICAgICAgIXRoaXMudmFsdWVzQXJlVmFsaWQodmFsdWVzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignVicpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdWJyksIHZhbHVlc1swXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE11bHRpU2VsZWN0VmFsdWVFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdWJyksIHRoaXMuZGljdC5jb250ZXh0Lm9iaih2YWx1ZXMpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkSW5kaWNlcyh2YWx1ZXMpO1xuICAgIH07XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUudmFsdWVzQXJlVmFsaWQgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGlkeCwgbGVuKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmZpbmQoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHZhbCA9PT0gKG8uZGlzcGxheSB8fCBvLnZhbHVlKS5kZWNvZGVUZXh0KCk7IH0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBzdGF0ZV8xID0gX2xvb3BfMShpZHgsIGxlbik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0YXRlXzEgPT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlXzEudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hvaWNlLnByb3RvdHlwZS51cGRhdGVTZWxlY3RlZEluZGljZXMgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIGluZGljZXMgPSBuZXcgQXJyYXkodmFsdWVzLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICAgICAgdmFyIF9sb29wXzIgPSBmdW5jdGlvbiAoaWR4LCBsZW4pIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICAgICAgICAgIGluZGljZXNbaWR4XSA9IG9wdGlvbnMuZmluZEluZGV4KGZ1bmN0aW9uIChvKSB7IHJldHVybiB2YWwgPT09IChvLmRpc3BsYXkgfHwgby52YWx1ZSkuZGVjb2RlVGV4dCgpOyB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgX2xvb3BfMihpZHgsIGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0knKSwgdGhpcy5kaWN0LmNvbnRleHQub2JqKGluZGljZXMuc29ydCgpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ0knKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkFjcm9DaG9pY2UucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHYgPSB0aGlzLlYoKTtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgdiBpbnN0YW5jZW9mIFBERkhleFN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBbdl07XG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHYuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdi5sb29rdXAoaWR4KTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH07XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUuT3B0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ09wdCcpLCBQREZTdHJpbmcsIFBERkhleFN0cmluZywgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBuZXdPcHQgPSBuZXcgQXJyYXkob3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gb3B0aW9uc1tpZHhdLCB2YWx1ZSA9IF9hLnZhbHVlLCBkaXNwbGF5ID0gX2EuZGlzcGxheTtcbiAgICAgICAgICAgIG5ld09wdFtpZHhdID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKFt2YWx1ZSwgZGlzcGxheSB8fCB2YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignT3B0JyksIHRoaXMuZGljdC5jb250ZXh0Lm9iaihuZXdPcHQpKTtcbiAgICB9O1xuICAgIFBERkFjcm9DaG9pY2UucHJvdG90eXBlLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBPcHQgPSB0aGlzLk9wdCgpO1xuICAgICAgICAvLyBOb3Qgc3VwcG9zZWQgdG8gaGFwcGVuIC0gT3B0IF9zaG91bGRfIGFsd2F5cyBiZSBgUERGQXJyYXkgfCB1bmRlZmluZWRgXG4gICAgICAgIGlmIChPcHQgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgT3B0IGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gW3sgdmFsdWU6IE9wdCwgZGlzcGxheTogT3B0IH1dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPcHQgaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gT3B0LnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gT3B0Lmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgICAgIC8vIElmIGBpdGVtYCBpcyBhIHN0cmluZywgdXNlIHRoYXQgYXMgYm90aCB0aGUgZXhwb3J0IGFuZCB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgaXRlbSBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh7IHZhbHVlOiBpdGVtLCBkaXNwbGF5OiBpdGVtIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiBgaXRlbWAgaXMgYW4gYXJyYXkgb2Ygb25lLCB0cmVhdCBpdCB0aGUgc2FtZSBhcyBqdXN0IGEgc3RyaW5nLFxuICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgYW4gYXJyYXkgb2YgdHdvIHRoZW4gYGl0ZW1bMF1gIGlzIHRoZSBleHBvcnQgdmFsdWUgYW5kXG4gICAgICAgICAgICAgICAgLy8gYGl0ZW1bMV1gIGlzIHRoZSB0ZXh0IHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5zaXplKCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBpdGVtLmxvb2t1cCgwLCBQREZTdHJpbmcsIFBERkhleFN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2Vjb25kID0gaXRlbS5sb29rdXBNYXliZSgxLCBQREZTdHJpbmcsIFBERkhleFN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh7IHZhbHVlOiBmaXJzdCwgZGlzcGxheTogc2Vjb25kIHx8IGZpcnN0IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0Nob2ljZTtcbn0oUERGQWNyb1Rlcm1pbmFsKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvQ2hvaWNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0Nob2ljZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBY3JvQ2hvaWNlIGZyb20gXCIuL1BERkFjcm9DaG9pY2VcIjtcbmltcG9ydCB7IEFjcm9DaG9pY2VGbGFncyB9IGZyb20gXCIuL2ZsYWdzXCI7XG52YXIgUERGQWNyb0NvbWJvQm94ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvQ29tYm9Cb3gsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb0NvbWJvQm94KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9Db21ib0JveC5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvQ29tYm9Cb3goZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9Db21ib0JveC5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnQ2gnLFxuICAgICAgICAgICAgRmY6IEFjcm9DaG9pY2VGbGFncy5Db21ibyxcbiAgICAgICAgICAgIEtpZHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0NvbWJvQm94KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0NvbWJvQm94O1xufShQREZBY3JvQ2hvaWNlKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvQ29tYm9Cb3g7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvQ29tYm9Cb3guanMubWFwIiwiaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IHsgZmluZExhc3RNYXRjaCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgTWlzc2luZ0RBRW50cnlFcnJvciwgTWlzc2luZ1RmT3BlcmF0b3JFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbi8vIEV4YW1wbGVzOlxuLy8gICBgL0hlbHYgMTIgVGZgIC0+IFsnSGVsdicsICcxMiddXG4vLyAgIGAvSGVCbyA4LjAwIFRmYCAtPiBbJ0hlQm8nLCAnOC4wMCddXG4vLyAgIGAvSGVCbyBUZmAgLT4gWydIZUJvJywgdW5kZWZpbmVkXVxudmFyIHRmUmVnZXggPSAvXFwvKFteXFwwXFx0XFxuXFxmXFxyXFwgXSspW1xcMFxcdFxcblxcZlxcclxcIF0qKFxcZCpcXC5cXGQrfFxcZCspP1tcXDBcXHRcXG5cXGZcXHJcXCBdK1RmLztcbnZhciBQREZBY3JvRmllbGQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGQWNyb0ZpZWxkKGRpY3QsIHJlZikge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICB9XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5UID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ1QnKSwgUERGU3RyaW5nLCBQREZIZXhTdHJpbmcpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5GZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG51bWJlck9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLm9mKCdGZicpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5jb250ZXh0Lmxvb2t1cE1heWJlKG51bWJlck9yUmVmLCBQREZOdW1iZXIpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5WID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5vZignVicpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5jb250ZXh0Lmxvb2t1cCh2YWx1ZU9yUmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuS2lkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5sb29rdXBNYXliZShQREZOYW1lLm9mKCdLaWRzJyksIFBERkFycmF5KTtcbiAgICB9O1xuICAgIC8vIFBhcmVudCgpOiBQREZEaWN0IHwgdW5kZWZpbmVkIHtcbiAgICAvLyAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwTWF5YmUoUERGTmFtZS5vZignUGFyZW50JyksIFBERkRpY3QpO1xuICAgIC8vIH1cbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLkRBID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGEgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0RBJykpO1xuICAgICAgICBpZiAoZGEgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgZGEgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gZGE7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldEtpZHMgPSBmdW5jdGlvbiAoa2lkcykge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0tpZHMnKSwgdGhpcy5kaWN0LmNvbnRleHQub2JqKGtpZHMpKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuZ2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBjb25zdCBwYXJlbnQgPSB0aGlzLlBhcmVudCgpO1xuICAgICAgICAvLyBpZiAoIXBhcmVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgLy8gcmV0dXJuIG5ldyBQREZBY3JvRmllbGQocGFyZW50KTtcbiAgICAgICAgdmFyIHBhcmVudFJlZiA9IHRoaXMuZGljdC5nZXQoUERGTmFtZS5vZignUGFyZW50JykpO1xuICAgICAgICBpZiAocGFyZW50UmVmIGluc3RhbmNlb2YgUERGUmVmKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50XzEgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1BhcmVudCcpLCBQREZEaWN0KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUERGQWNyb0ZpZWxkKHBhcmVudF8xLCBwYXJlbnRSZWYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldFBhcmVudCA9IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ1BhcmVudCcpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdQYXJlbnQnKSwgcGFyZW50KTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoKTtcbiAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJ0aWFsTmFtZSgpO1xuICAgICAgICByZXR1cm4gcGFyZW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpICsgXCIuXCIgKyB0aGlzLmdldFBhcnRpYWxOYW1lKCk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmdldFBhcnRpYWxOYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLlQoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0UGFydGlhbE5hbWUgPSBmdW5jdGlvbiAocGFydGlhbE5hbWUpIHtcbiAgICAgICAgaWYgKCFwYXJ0aWFsTmFtZSlcbiAgICAgICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignVCcpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdUJyksIFBERkhleFN0cmluZy5mcm9tVGV4dChwYXJ0aWFsTmFtZSkpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXREZWZhdWx0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignREEnKSwgUERGU3RyaW5nLm9mKGFwcGVhcmFuY2UpKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuZ2V0RGVmYXVsdEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBEQSA9IHRoaXMuREEoKTtcbiAgICAgICAgaWYgKERBIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gREEuZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEQSA9PT0gbnVsbCB8fCBEQSA9PT0gdm9pZCAwID8gdm9pZCAwIDogREEuYXNTdHJpbmcoKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0Rm9udFNpemUgPSBmdW5jdGlvbiAoZm9udFNpemUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgbmFtZSA9IChfYSA9IHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgICAgICB2YXIgZGEgPSB0aGlzLmdldERlZmF1bHRBcHBlYXJhbmNlKCk7XG4gICAgICAgIGlmICghZGEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0RBRW50cnlFcnJvcihuYW1lKTtcbiAgICAgICAgdmFyIGRhTWF0Y2ggPSBmaW5kTGFzdE1hdGNoKGRhLCB0ZlJlZ2V4KTtcbiAgICAgICAgaWYgKCFkYU1hdGNoLm1hdGNoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdUZk9wZXJhdG9yRXJyb3IobmFtZSk7XG4gICAgICAgIHZhciBkYVN0YXJ0ID0gZGEuc2xpY2UoMCwgZGFNYXRjaC5wb3MgLSBkYU1hdGNoLm1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgIHZhciBkYUVuZCA9IGRhTWF0Y2gucG9zIDw9IGRhLmxlbmd0aCA/IGRhLnNsaWNlKGRhTWF0Y2gucG9zKSA6ICcnO1xuICAgICAgICB2YXIgZm9udE5hbWUgPSBkYU1hdGNoLm1hdGNoWzFdO1xuICAgICAgICB2YXIgbW9kaWZpZWREYSA9IGRhU3RhcnQgKyBcIiAvXCIgKyBmb250TmFtZSArIFwiIFwiICsgZm9udFNpemUgKyBcIiBUZiBcIiArIGRhRW5kO1xuICAgICAgICB0aGlzLnNldERlZmF1bHRBcHBlYXJhbmNlKG1vZGlmaWVkRGEpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5nZXRGbGFncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuRmYoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldEZsYWdzID0gZnVuY3Rpb24gKGZsYWdzKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRmYnKSwgUERGTnVtYmVyLm9mKGZsYWdzKSk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmhhc0ZsYWcgPSBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICB2YXIgZmxhZ3MgPSB0aGlzLmdldEZsYWdzKCk7XG4gICAgICAgIHJldHVybiAoZmxhZ3MgJiBmbGFnKSAhPT0gMDtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0RmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBmbGFncyA9IHRoaXMuZ2V0RmxhZ3MoKTtcbiAgICAgICAgdGhpcy5zZXRGbGFncyhmbGFncyB8IGZsYWcpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5jbGVhckZsYWcgPSBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICB2YXIgZmxhZ3MgPSB0aGlzLmdldEZsYWdzKCk7XG4gICAgICAgIHRoaXMuc2V0RmxhZ3MoZmxhZ3MgJiB+ZmxhZyk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldEZsYWdUbyA9IGZ1bmN0aW9uIChmbGFnLCBlbmFibGUpIHtcbiAgICAgICAgaWYgKGVuYWJsZSlcbiAgICAgICAgICAgIHRoaXMuc2V0RmxhZyhmbGFnKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5jbGVhckZsYWcoZmxhZyk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmdldEluaGVyaXRhYmxlQXR0cmlidXRlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZTtcbiAgICAgICAgdGhpcy5hc2NlbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICghYXR0cmlidXRlKVxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IG5vZGUuZGljdC5nZXQobmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXR0cmlidXRlO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5hc2NlbmQgPSBmdW5jdGlvbiAodmlzaXRvcikge1xuICAgICAgICB2aXNpdG9yKHRoaXMpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIHBhcmVudC5hc2NlbmQodmlzaXRvcik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0ZpZWxkO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9GaWVsZDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9GaWVsZC5qcy5tYXAiLCJpbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBY3JvTm9uVGVybWluYWwgZnJvbSBcIi4vUERGQWNyb05vblRlcm1pbmFsXCI7XG5pbXBvcnQgeyBjcmVhdGVQREZBY3JvRmllbGQsIGNyZWF0ZVBERkFjcm9GaWVsZHMsIH0gZnJvbSBcIi4vdXRpbHNcIjtcbnZhciBQREZBY3JvRm9ybSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZBY3JvRm9ybShkaWN0KSB7XG4gICAgICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgfVxuICAgIFBERkFjcm9Gb3JtLnByb3RvdHlwZS5GaWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmaWVsZHMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0ZpZWxkcycpKTtcbiAgICAgICAgaWYgKGZpZWxkcyBpbnN0YW5jZW9mIFBERkFycmF5KVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9Gb3JtLnByb3RvdHlwZS5nZXRGaWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBGaWVsZHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuRmllbGRzO1xuICAgICAgICB2YXIgZmllbGRzID0gbmV3IEFycmF5KEZpZWxkcy5zaXplKCkpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBGaWVsZHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgcmVmID0gRmllbGRzLmdldChpZHgpO1xuICAgICAgICAgICAgdmFyIGRpY3QgPSBGaWVsZHMubG9va3VwKGlkeCwgUERGRGljdCk7XG4gICAgICAgICAgICBmaWVsZHNbaWR4XSA9IFtjcmVhdGVQREZBY3JvRmllbGQoZGljdCwgcmVmKSwgcmVmXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmllbGRzO1xuICAgIH07XG4gICAgUERGQWNyb0Zvcm0ucHJvdG90eXBlLmdldEFsbEZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFsbEZpZWxkcyA9IFtdO1xuICAgICAgICB2YXIgcHVzaEZpZWxkcyA9IGZ1bmN0aW9uIChmaWVsZHMpIHtcbiAgICAgICAgICAgIGlmICghZmllbGRzKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGZpZWxkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaWR4XTtcbiAgICAgICAgICAgICAgICBhbGxGaWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkTW9kZWwgPSBmaWVsZFswXTtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRNb2RlbCBpbnN0YW5jZW9mIFBERkFjcm9Ob25UZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICBwdXNoRmllbGRzKGNyZWF0ZVBERkFjcm9GaWVsZHMoZmllbGRNb2RlbC5LaWRzKCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHB1c2hGaWVsZHModGhpcy5nZXRGaWVsZHMoKSk7XG4gICAgICAgIHJldHVybiBhbGxGaWVsZHM7XG4gICAgfTtcbiAgICBQREZBY3JvRm9ybS5wcm90b3R5cGUuYWRkRmllbGQgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgdmFyIEZpZWxkcyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5GaWVsZHM7XG4gICAgICAgIEZpZWxkcyA9PT0gbnVsbCB8fCBGaWVsZHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICB9O1xuICAgIFBERkFjcm9Gb3JtLnByb3RvdHlwZS5yZW1vdmVGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICB2YXIgcGFyZW50ID0gZmllbGQuZ2V0UGFyZW50KCk7XG4gICAgICAgIHZhciBmaWVsZHMgPSBwYXJlbnQgPT09IHVuZGVmaW5lZCA/IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5GaWVsZHMgOiBwYXJlbnQuS2lkcygpO1xuICAgICAgICB2YXIgaW5kZXggPSBmaWVsZHMgPT09IG51bGwgfHwgZmllbGRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWVsZHMuaW5kZXhPZihmaWVsZC5yZWYpO1xuICAgICAgICBpZiAoZmllbGRzID09PSB1bmRlZmluZWQgfHwgaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJpZWQgdG8gcmVtb3ZlIGluZXhpc3RlbnQgZmllbGQgXCIgKyBmaWVsZC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRzLnJlbW92ZShpbmRleCk7XG4gICAgICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCAmJiBmaWVsZHMuc2l6ZSgpID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZpZWxkKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkFjcm9Gb3JtLnByb3RvdHlwZS5ub3JtYWxpemVkRW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEZpZWxkcyA9IHRoaXMuRmllbGRzKCk7XG4gICAgICAgIGlmICghRmllbGRzKSB7XG4gICAgICAgICAgICBGaWVsZHMgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooW10pO1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdGaWVsZHMnKSwgRmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBGaWVsZHM6IEZpZWxkcyB9O1xuICAgIH07XG4gICAgUERGQWNyb0Zvcm0uZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCkgeyByZXR1cm4gbmV3IFBERkFjcm9Gb3JtKGRpY3QpOyB9O1xuICAgIFBERkFjcm9Gb3JtLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooeyBGaWVsZHM6IFtdIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9Gb3JtKGRpY3QpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9Gb3JtO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9Gb3JtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0Zvcm0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQWNyb0Nob2ljZSBmcm9tIFwiLi9QREZBY3JvQ2hvaWNlXCI7XG52YXIgUERGQWNyb0xpc3RCb3ggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9MaXN0Qm94LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9MaXN0Qm94KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9MaXN0Qm94LmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9MaXN0Qm94KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvTGlzdEJveC5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnQ2gnLFxuICAgICAgICAgICAgS2lkczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvTGlzdEJveChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9MaXN0Qm94O1xufShQREZBY3JvQ2hvaWNlKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvTGlzdEJveDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9MaXN0Qm94LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9GaWVsZCBmcm9tIFwiLi9QREZBY3JvRmllbGRcIjtcbnZhciBQREZBY3JvTm9uVGVybWluYWwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9Ob25UZXJtaW5hbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvTm9uVGVybWluYWwoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb05vblRlcm1pbmFsLnByb3RvdHlwZS5hZGRGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5LaWRzO1xuICAgICAgICBLaWRzID09PSBudWxsIHx8IEtpZHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEtpZHMucHVzaChmaWVsZCk7XG4gICAgfTtcbiAgICBQREZBY3JvTm9uVGVybWluYWwucHJvdG90eXBlLm5vcm1hbGl6ZWRFbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICBpZiAoIUtpZHMpIHtcbiAgICAgICAgICAgIEtpZHMgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooW10pO1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdLaWRzJyksIEtpZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IEtpZHM6IEtpZHMgfTtcbiAgICB9O1xuICAgIFBERkFjcm9Ob25UZXJtaW5hbC5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvTm9uVGVybWluYWwoZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9Ob25UZXJtaW5hbC5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb05vblRlcm1pbmFsKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb05vblRlcm1pbmFsO1xufShQREZBY3JvRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9Ob25UZXJtaW5hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9Ob25UZXJtaW5hbC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBY3JvQnV0dG9uIGZyb20gXCIuL1BERkFjcm9CdXR0b25cIjtcbmltcG9ydCB7IEFjcm9CdXR0b25GbGFncyB9IGZyb20gXCIuL2ZsYWdzXCI7XG52YXIgUERGQWNyb1B1c2hCdXR0b24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9QdXNoQnV0dG9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9QdXNoQnV0dG9uKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9QdXNoQnV0dG9uLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9QdXNoQnV0dG9uKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvUHVzaEJ1dHRvbi5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnQnRuJyxcbiAgICAgICAgICAgIEZmOiBBY3JvQnV0dG9uRmxhZ3MuUHVzaEJ1dHRvbixcbiAgICAgICAgICAgIEtpZHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1B1c2hCdXR0b24oZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvUHVzaEJ1dHRvbjtcbn0oUERGQWNyb0J1dHRvbikpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb1B1c2hCdXR0b247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvUHVzaEJ1dHRvbi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBY3JvQnV0dG9uIGZyb20gXCIuL1BERkFjcm9CdXR0b25cIjtcbmltcG9ydCB7IEFjcm9CdXR0b25GbGFncyB9IGZyb20gXCIuL2ZsYWdzXCI7XG5pbXBvcnQgeyBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZBY3JvUmFkaW9CdXR0b24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9SYWRpb0J1dHRvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvUmFkaW9CdXR0b24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb1JhZGlvQnV0dG9uLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgb25WYWx1ZXMgPSB0aGlzLmdldE9uVmFsdWVzKCk7XG4gICAgICAgIGlmICghb25WYWx1ZXMuaW5jbHVkZXModmFsdWUpICYmIHZhbHVlICE9PSBQREZOYW1lLm9mKCdPZmYnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdWJyksIHZhbHVlKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB3aWRnZXQuZ2V0T25WYWx1ZSgpID09PSB2YWx1ZSA/IHZhbHVlIDogUERGTmFtZS5vZignT2ZmJyk7XG4gICAgICAgICAgICB3aWRnZXQuc2V0QXBwZWFyYW5jZVN0YXRlKHN0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQWNyb1JhZGlvQnV0dG9uLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHYgPSB0aGlzLlYoKTtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQREZOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIHJldHVybiBQREZOYW1lLm9mKCdPZmYnKTtcbiAgICB9O1xuICAgIFBERkFjcm9SYWRpb0J1dHRvbi5wcm90b3R5cGUuZ2V0T25WYWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5nZXRXaWRnZXRzKCk7XG4gICAgICAgIHZhciBvblZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIG9uVmFsdWUgPSB3aWRnZXRzW2lkeF0uZ2V0T25WYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKG9uVmFsdWUpXG4gICAgICAgICAgICAgICAgb25WYWx1ZXMucHVzaChvblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb25WYWx1ZXM7XG4gICAgfTtcbiAgICBQREZBY3JvUmFkaW9CdXR0b24uZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1JhZGlvQnV0dG9uKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvUmFkaW9CdXR0b24uY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBGVDogJ0J0bicsXG4gICAgICAgICAgICBGZjogQWNyb0J1dHRvbkZsYWdzLlJhZGlvLFxuICAgICAgICAgICAgS2lkczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvUmFkaW9CdXR0b24oZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvUmFkaW9CdXR0b247XG59KFBERkFjcm9CdXR0b24pKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9SYWRpb0J1dHRvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9SYWRpb0J1dHRvbi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBY3JvVGVybWluYWwgZnJvbSBcIi4vUERGQWNyb1Rlcm1pbmFsXCI7XG52YXIgUERGQWNyb1NpZ25hdHVyZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb1NpZ25hdHVyZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvU2lnbmF0dXJlKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9TaWduYXR1cmUuZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1NpZ25hdHVyZShkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9TaWduYXR1cmU7XG59KFBERkFjcm9UZXJtaW5hbCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb1NpZ25hdHVyZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9TaWduYXR1cmUuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQWNyb0ZpZWxkIGZyb20gXCIuL1BERkFjcm9GaWVsZFwiO1xuaW1wb3J0IFBERldpZGdldEFubm90YXRpb24gZnJvbSBcIi4uL2Fubm90YXRpb24vUERGV2lkZ2V0QW5ub3RhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhPdXRPZkJvdW5kc0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkFjcm9UZXJtaW5hbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb1Rlcm1pbmFsLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9UZXJtaW5hbCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvVGVybWluYWwucHJvdG90eXBlLkZUID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbmFtZU9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLm9mKCdGVCcpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5jb250ZXh0Lmxvb2t1cChuYW1lT3JSZWYsIFBERk5hbWUpO1xuICAgIH07XG4gICAgUERGQWNyb1Rlcm1pbmFsLnByb3RvdHlwZS5nZXRXaWRnZXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIga2lkRGljdHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyBpdHNlbGYgYSB3aWRnZXRcbiAgICAgICAgaWYgKCFraWREaWN0cylcbiAgICAgICAgICAgIHJldHVybiBbUERGV2lkZ2V0QW5ub3RhdGlvbi5mcm9tRGljdCh0aGlzLmRpY3QpXTtcbiAgICAgICAgLy8gVGhpcyBmaWVsZCdzIGtpZHMgYXJlIGl0cyB3aWRnZXRzXG4gICAgICAgIHZhciB3aWRnZXRzID0gbmV3IEFycmF5KGtpZERpY3RzLnNpemUoKSk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGtpZERpY3RzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGRpY3QgPSBraWREaWN0cy5sb29rdXAoaWR4LCBQREZEaWN0KTtcbiAgICAgICAgICAgIHdpZGdldHNbaWR4XSA9IFBERldpZGdldEFubm90YXRpb24uZnJvbURpY3QoZGljdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdpZGdldHM7XG4gICAgfTtcbiAgICBQREZBY3JvVGVybWluYWwucHJvdG90eXBlLmFkZFdpZGdldCA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuS2lkcztcbiAgICAgICAgS2lkcy5wdXNoKHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvVGVybWluYWwucHJvdG90eXBlLnJlbW92ZVdpZGdldCA9IGZ1bmN0aW9uIChpZHgpIHtcbiAgICAgICAgdmFyIGtpZERpY3RzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIGlmICgha2lkRGljdHMpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgaXRzZWxmIGEgd2lkZ2V0XG4gICAgICAgICAgICBpZiAoaWR4ICE9PSAwKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXJyb3IoaWR4LCAwLCAwKTtcbiAgICAgICAgICAgIHRoaXMuc2V0S2lkcyhbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGlzIGZpZWxkJ3Mga2lkcyBhcmUgaXRzIHdpZGdldHNcbiAgICAgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+IGtpZERpY3RzLnNpemUoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXJyb3IoaWR4LCAwLCBraWREaWN0cy5zaXplKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2lkRGljdHMucmVtb3ZlKGlkeCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkFjcm9UZXJtaW5hbC5wcm90b3R5cGUubm9ybWFsaXplZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIC8vIElmIHRoaXMgZmllbGQgaXMgaXRzZWxmIGEgd2lkZ2V0IChiZWNhdXNlIGl0IHdhcyBvbmx5IHJlbmRlcmVkIG9uY2UgaW5cbiAgICAgICAgLy8gdGhlIGRvY3VtZW50LCBzbyB0aGUgZmllbGQgYW5kIHdpZGdldCBwcm9wZXJ0aWVzIHdlcmUgbWVyZ2VkKSB0aGVuIHdlXG4gICAgICAgIC8vIGFkZCBpdHNlbGYgdG8gdGhlIGBLaWRzYCBhcnJheS4gVGhlIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHRyeVxuICAgICAgICAvLyBzcGxpdHRpbmcgYXBhcnQgdGhlIHdpZGdldCBwcm9wZXJ0aWVzIGFuZCBjcmVhdGluZyBhIHNlcGFyYXRlIG9iamVjdFxuICAgICAgICAvLyBmb3IgdGhlbS5cbiAgICAgICAgaWYgKCFLaWRzKSB7XG4gICAgICAgICAgICBLaWRzID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKFt0aGlzLnJlZl0pO1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdLaWRzJyksIEtpZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IEtpZHM6IEtpZHMgfTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXJtaW5hbC5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvVGVybWluYWwoZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvVGVybWluYWw7XG59KFBERkFjcm9GaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb1Rlcm1pbmFsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb1Rlcm1pbmFsLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvVGVybWluYWxcIjtcbnZhciBQREZBY3JvVGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb1RleHQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb1RleHQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLk1heExlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1heExlbiA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignTWF4TGVuJykpO1xuICAgICAgICBpZiAobWF4TGVuIGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuIG1heExlbjtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5RID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignUScpKTtcbiAgICAgICAgaWYgKHEgaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gcTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5zZXRNYXhMZW5ndGggPSBmdW5jdGlvbiAobWF4TGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignTWF4TGVuJyksIFBERk51bWJlci5vZihtYXhMZW5ndGgpKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5yZW1vdmVNYXhMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignTWF4TGVuJykpO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLmdldE1heExlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5NYXhMZW4oKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCk7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuc2V0UXVhZGRpbmcgPSBmdW5jdGlvbiAocXVhZGRpbmcpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdRJyksIFBERk51bWJlci5vZihxdWFkZGluZykpO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLmdldFF1YWRkaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLlEoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCk7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdWJyksIHZhbHVlKTtcbiAgICAgICAgLy8gY29uc3Qgd2lkZ2V0cyA9IHRoaXMuZ2V0V2lkZ2V0cygpO1xuICAgICAgICAvLyBmb3IgKGxldCBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAvLyAgIGNvbnN0IHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgLy8gICBjb25zdCBzdGF0ZSA9IHdpZGdldC5nZXRPblZhbHVlKCkgPT09IHZhbHVlID8gdmFsdWUgOiBQREZOYW1lLm9mKCdPZmYnKTtcbiAgICAgICAgLy8gICB3aWRnZXQuc2V0QXBwZWFyYW5jZVN0YXRlKHN0YXRlKTtcbiAgICAgICAgLy8gfVxuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLnJlbW92ZVZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ1YnKSk7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2ID0gdGhpcy5WKCk7XG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgUERGU3RyaW5nIHx8IHYgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikgeyByZXR1cm4gbmV3IFBERkFjcm9UZXh0KGRpY3QsIHJlZik7IH07XG4gICAgUERGQWNyb1RleHQuY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBGVDogJ1R4JyxcbiAgICAgICAgICAgIEtpZHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1RleHQoZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvVGV4dDtcbn0oUERGQWNyb1Rlcm1pbmFsKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvVGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9UZXh0LmpzLm1hcCIsInZhciBmbGFnID0gZnVuY3Rpb24gKGJpdEluZGV4KSB7IHJldHVybiAxIDw8IGJpdEluZGV4OyB9O1xuLyoqIEZyb20gUERGIHNwZWMgdGFibGUgMjIxICovXG5leHBvcnQgdmFyIEFjcm9GaWVsZEZsYWdzO1xuKGZ1bmN0aW9uIChBY3JvRmllbGRGbGFncykge1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIHVzZXIgbWF5IG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gQW55IGFzc29jaWF0ZWRcbiAgICAgKiB3aWRnZXQgYW5ub3RhdGlvbnMgd2lsbCBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgdXNlcjsgdGhhdCBpcywgdGhleSB3aWxsIG5vdFxuICAgICAqIHJlc3BvbmQgdG8gbW91c2UgY2xpY2tzIG9yIGNoYW5nZSB0aGVpciBhcHBlYXJhbmNlIGluIHJlc3BvbnNlIHRvIG1vdXNlXG4gICAgICogbW90aW9ucy4gVGhpcyBmbGFnIGlzIHVzZWZ1bCBmb3IgZmllbGRzIHdob3NlIHZhbHVlcyBhcmUgY29tcHV0ZWQgb3JcbiAgICAgKiBpbXBvcnRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQWNyb0ZpZWxkRmxhZ3NbQWNyb0ZpZWxkRmxhZ3NbXCJSZWFkT25seVwiXSA9IGZsYWcoMSAtIDEpXSA9IFwiUmVhZE9ubHlcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBoYXZlIGEgdmFsdWUgYXQgdGhlIHRpbWUgaXQgaXMgZXhwb3J0ZWQgYnkgYVxuICAgICAqIHN1Ym1pdC1mb3JtIGFjdGlvbiAoc2VlIDEyLjcuNS4yLCBcIlN1Ym1pdC1Gb3JtIEFjdGlvblwiKS5cbiAgICAgKi9cbiAgICBBY3JvRmllbGRGbGFnc1tBY3JvRmllbGRGbGFnc1tcIlJlcXVpcmVkXCJdID0gZmxhZygyIC0gMSldID0gXCJSZXF1aXJlZFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBleHBvcnRlZCBieSBhIHN1Ym1pdC1mb3JtIGFjdGlvblxuICAgICAqIChzZWUgMTIuNy41LjIsIFwiU3VibWl0LUZvcm0gQWN0aW9uXCIpLlxuICAgICAqL1xuICAgIEFjcm9GaWVsZEZsYWdzW0Fjcm9GaWVsZEZsYWdzW1wiTm9FeHBvcnRcIl0gPSBmbGFnKDMgLSAxKV0gPSBcIk5vRXhwb3J0XCI7XG59KShBY3JvRmllbGRGbGFncyB8fCAoQWNyb0ZpZWxkRmxhZ3MgPSB7fSkpO1xuLyoqIEZyb20gUERGIHNwZWMgdGFibGUgMjI2ICovXG5leHBvcnQgdmFyIEFjcm9CdXR0b25GbGFncztcbihmdW5jdGlvbiAoQWNyb0J1dHRvbkZsYWdzKSB7XG4gICAgLyoqXG4gICAgICogKFJhZGlvIGJ1dHRvbnMgb25seSkgSWYgc2V0LCBleGFjdGx5IG9uZSByYWRpbyBidXR0b24gc2hhbGwgYmUgc2VsZWN0ZWQgYXRcbiAgICAgKiBhbGwgdGltZXM7IHNlbGVjdGluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJ1dHRvbiBoYXMgbm8gZWZmZWN0LiBJZiBjbGVhcixcbiAgICAgKiBjbGlja2luZyB0aGUgc2VsZWN0ZWQgYnV0dG9uIGRlc2VsZWN0cyBpdCwgbGVhdmluZyBubyBidXR0b24gc2VsZWN0ZWQuXG4gICAgICovXG4gICAgQWNyb0J1dHRvbkZsYWdzW0Fjcm9CdXR0b25GbGFnc1tcIk5vVG9nZ2xlVG9PZmZcIl0gPSBmbGFnKDE1IC0gMSldID0gXCJOb1RvZ2dsZVRvT2ZmXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBzZXQgb2YgcmFkaW8gYnV0dG9uczsgaWYgY2xlYXIsIHRoZSBmaWVsZCBpcyBhIGNoZWNrXG4gICAgICogYm94LiBUaGlzIGZsYWcgbWF5IGJlIHNldCBvbmx5IGlmIHRoZSBQdXNoYnV0dG9uIGZsYWcgaXMgY2xlYXIuXG4gICAgICovXG4gICAgQWNyb0J1dHRvbkZsYWdzW0Fjcm9CdXR0b25GbGFnc1tcIlJhZGlvXCJdID0gZmxhZygxNiAtIDEpXSA9IFwiUmFkaW9cIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHB1c2hidXR0b24gdGhhdCBkb2VzIG5vdCByZXRhaW4gYSBwZXJtYW5lbnQgdmFsdWUuXG4gICAgICovXG4gICAgQWNyb0J1dHRvbkZsYWdzW0Fjcm9CdXR0b25GbGFnc1tcIlB1c2hCdXR0b25cIl0gPSBmbGFnKDE3IC0gMSldID0gXCJQdXNoQnV0dG9uXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBhIGdyb3VwIG9mIHJhZGlvIGJ1dHRvbnMgd2l0aGluIGEgcmFkaW8gYnV0dG9uIGZpZWxkIHRoYXQgdXNlIHRoZVxuICAgICAqIHNhbWUgdmFsdWUgZm9yIHRoZSBvbiBzdGF0ZSB3aWxsIHR1cm4gb24gYW5kIG9mZiBpbiB1bmlzb247IHRoYXQgaXMgaWYgb25lXG4gICAgICogaXMgY2hlY2tlZCwgdGhleSBhcmUgYWxsIGNoZWNrZWQuIElmIGNsZWFyLCB0aGUgYnV0dG9ucyBhcmUgbXV0dWFsbHlcbiAgICAgKiBleGNsdXNpdmUgKHRoZSBzYW1lIGJlaGF2aW9yIGFzIEhUTUwgcmFkaW8gYnV0dG9ucykuXG4gICAgICovXG4gICAgQWNyb0J1dHRvbkZsYWdzW0Fjcm9CdXR0b25GbGFnc1tcIlJhZGlvc0luVW5pc29uXCJdID0gZmxhZygyNiAtIDEpXSA9IFwiUmFkaW9zSW5Vbmlzb25cIjtcbn0pKEFjcm9CdXR0b25GbGFncyB8fCAoQWNyb0J1dHRvbkZsYWdzID0ge30pKTtcbi8qKiBGcm9tIFBERiBzcGVjIHRhYmxlIDIyOCAqL1xuZXhwb3J0IHZhciBBY3JvVGV4dEZsYWdzO1xuKGZ1bmN0aW9uIChBY3JvVGV4dEZsYWdzKSB7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgbWF5IGNvbnRhaW4gbXVsdGlwbGUgbGluZXMgb2YgdGV4dDsgaWYgY2xlYXIsIHRoZSBmaWVsZCdzXG4gICAgICogdGV4dCBzaGFsbCBiZSByZXN0cmljdGVkIHRvIGEgc2luZ2xlIGxpbmUuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiTXVsdGlsaW5lXCJdID0gZmxhZygxMyAtIDEpXSA9IFwiTXVsdGlsaW5lXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgaW50ZW5kZWQgZm9yIGVudGVyaW5nIGEgc2VjdXJlIHBhc3N3b3JkIHRoYXQgc2hvdWxkXG4gICAgICogbm90IGJlIGVjaG9lZCB2aXNpYmx5IHRvIHRoZSBzY3JlZW4uIENoYXJhY3RlcnMgdHlwZWQgZnJvbSB0aGUga2V5Ym9hcmRcbiAgICAgKiBzaGFsbCBpbnN0ZWFkIGJlIGVjaG9lZCBpbiBzb21lIHVucmVhZGFibGUgZm9ybSwgc3VjaCBhcyBhc3Rlcmlza3Mgb3JcbiAgICAgKiBidWxsZXQgY2hhcmFjdGVycy5cbiAgICAgKiA+IE5PVEUgICBUbyBwcm90ZWN0IHBhc3N3b3JkIGNvbmZpZGVudGlhbGl0eSwgcmVhZGVycyBzaG91bGQgbmV2ZXIgc3RvcmVcbiAgICAgKiA+ICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHRleHQgZmllbGQgaW4gdGhlIFBERiBmaWxlIGlmIHRoaXMgZmxhZyBpcyBzZXQuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiUGFzc3dvcmRcIl0gPSBmbGFnKDE0IC0gMSldID0gXCJQYXNzd29yZFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgcmVwcmVzZW50cyB0aGUgcGF0aG5hbWUgb2YgYSBmaWxlXG4gICAgICogd2hvc2UgY29udGVudHMgc2hhbGwgYmUgc3VibWl0dGVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiRmlsZVNlbGVjdFwiXSA9IGZsYWcoMjEgLSAxKV0gPSBcIkZpbGVTZWxlY3RcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsLWNoZWNrZWQuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiRG9Ob3RTcGVsbENoZWNrXCJdID0gZmxhZygyMyAtIDEpXSA9IFwiRG9Ob3RTcGVsbENoZWNrXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgbm90IHNjcm9sbCAoaG9yaXpvbnRhbGx5IGZvciBzaW5nbGUtbGluZSBmaWVsZHMsXG4gICAgICogdmVydGljYWxseSBmb3IgbXVsdGlwbGUtbGluZSBmaWVsZHMpIHRvIGFjY29tbW9kYXRlIG1vcmUgdGV4dCB0aGFuIGZpdHNcbiAgICAgKiB3aXRoaW4gaXRzIGFubm90YXRpb24gcmVjdGFuZ2xlLiBPbmNlIHRoZSBmaWVsZCBpcyBmdWxsLCBubyBmdXJ0aGVyIHRleHRcbiAgICAgKiBzaGFsbCBiZSBhY2NlcHRlZCBmb3IgaW50ZXJhY3RpdmUgZm9ybSBmaWxsaW5nOyBmb3Igbm9uLWludGVyYWN0aXZlIGZvcm1cbiAgICAgKiBmaWxsaW5nLCB0aGUgZmlsbGVyIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGFkZCBtb3JlIGNoYXJhY3RlciB0aGFuIHdpbGxcbiAgICAgKiB2aXNpYmx5IGZpdCBpbiB0aGUgZGVmaW5lZCBhcmVhLlxuICAgICAqL1xuICAgIEFjcm9UZXh0RmxhZ3NbQWNyb1RleHRGbGFnc1tcIkRvTm90U2Nyb2xsXCJdID0gZmxhZygyNCAtIDEpXSA9IFwiRG9Ob3RTY3JvbGxcIjtcbiAgICAvKipcbiAgICAgKiBNYXkgYmUgc2V0IG9ubHkgaWYgdGhlIE1heExlbiBlbnRyeSBpcyBwcmVzZW50IGluIHRoZSB0ZXh0IGZpZWxkIGRpY3Rpb25hcnlcbiAgICAgKiAoc2VlIFRhYmxlIDIyOSkgYW5kIGlmIHRoZSBNdWx0aWxpbmUsIFBhc3N3b3JkLCBhbmQgRmlsZVNlbGVjdCBmbGFncyBhcmVcbiAgICAgKiBjbGVhci4gSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgYmUgYXV0b21hdGljYWxseSBkaXZpZGVkIGludG8gYXMgbWFueVxuICAgICAqIGVxdWFsbHkgc3BhY2VkIHBvc2l0aW9ucywgb3IgY29tYnMsIGFzIHRoZSB2YWx1ZSBvZiBNYXhMZW4sIGFuZCB0aGUgdGV4dFxuICAgICAqIGlzIGxhaWQgb3V0IGludG8gdGhvc2UgY29tYnMuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiQ29tYlwiXSA9IGZsYWcoMjUgLSAxKV0gPSBcIkNvbWJcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHNoYWxsIGJlIGEgcmljaCB0ZXh0IHN0cmluZ1xuICAgICAqIChzZWUgMTIuNy4zLjQsIFwiUmljaCBUZXh0IFN0cmluZ3NcIikuIElmIHRoZSBmaWVsZCBoYXMgYSB2YWx1ZSwgdGhlIFJWXG4gICAgICogZW50cnkgb2YgdGhlIGZpZWxkIGRpY3Rpb25hcnkgKFRhYmxlIDIyMikgc2hhbGwgc3BlY2lmeSB0aGUgcmljaCB0ZXh0XG4gICAgICogc3RyaW5nLlxuICAgICAqL1xuICAgIEFjcm9UZXh0RmxhZ3NbQWNyb1RleHRGbGFnc1tcIlJpY2hUZXh0XCJdID0gZmxhZygyNiAtIDEpXSA9IFwiUmljaFRleHRcIjtcbn0pKEFjcm9UZXh0RmxhZ3MgfHwgKEFjcm9UZXh0RmxhZ3MgPSB7fSkpO1xuLyoqIEZyb20gUERGIHNwZWMgdGFibGUgMjMwICovXG5leHBvcnQgdmFyIEFjcm9DaG9pY2VGbGFncztcbihmdW5jdGlvbiAoQWNyb0Nob2ljZUZsYWdzKSB7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBjb21ibyBib3g7IGlmIGNsZWFyLCB0aGUgZmllbGQgaXMgYSBsaXN0IGJveC5cbiAgICAgKi9cbiAgICBBY3JvQ2hvaWNlRmxhZ3NbQWNyb0Nob2ljZUZsYWdzW1wiQ29tYm9cIl0gPSBmbGFnKDE4IC0gMSldID0gXCJDb21ib1wiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGNvbWJvIGJveCBzaGFsbCBpbmNsdWRlIGFuIGVkaXRhYmxlIHRleHQgYm94IGFzIHdlbGwgYXMgYVxuICAgICAqIGRyb3AtZG93biBsaXN0OyBpZiBjbGVhciwgaXQgc2hhbGwgaW5jbHVkZSBvbmx5IGEgZHJvcC1kb3duIGxpc3QuIFRoaXNcbiAgICAgKiBmbGFnIHNoYWxsIGJlIHVzZWQgb25seSBpZiB0aGUgQ29tYm8gZmxhZyBpcyBzZXQuXG4gICAgICovXG4gICAgQWNyb0Nob2ljZUZsYWdzW0Fjcm9DaG9pY2VGbGFnc1tcIkVkaXRcIl0gPSBmbGFnKDE5IC0gMSldID0gXCJFZGl0XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQncyBvcHRpb24gaXRlbXMgc2hhbGwgYmUgc29ydGVkIGFscGhhYmV0aWNhbGx5LiBUaGlzIGZsYWdcbiAgICAgKiBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IHdyaXRlcnMsIG5vdCBieSByZWFkZXJzLiBDb25mb3JtaW5nIHJlYWRlcnMgc2hhbGxcbiAgICAgKiBkaXNwbGF5IHRoZSBvcHRpb25zIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VyIGluIHRoZSBPcHQgYXJyYXlcbiAgICAgKiAoc2VlIFRhYmxlIDIzMSkuXG4gICAgICovXG4gICAgQWNyb0Nob2ljZUZsYWdzW0Fjcm9DaG9pY2VGbGFnc1tcIlNvcnRcIl0gPSBmbGFnKDIwIC0gMSldID0gXCJTb3J0XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBtb3JlIHRoYW4gb25lIG9mIHRoZSBmaWVsZCdzIG9wdGlvbiBpdGVtcyBtYXkgYmUgc2VsZWN0ZWRcbiAgICAgKiBzaW11bHRhbmVvdXNseTsgaWYgY2xlYXIsIGF0IG1vc3Qgb25lIGl0ZW0gc2hhbGwgYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgQWNyb0Nob2ljZUZsYWdzW0Fjcm9DaG9pY2VGbGFnc1tcIk11bHRpU2VsZWN0XCJdID0gZmxhZygyMiAtIDEpXSA9IFwiTXVsdGlTZWxlY3RcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsLWNoZWNrZWQuIFRoaXMgZmxhZ1xuICAgICAqIHNoYWxsIG5vdCBiZSB1c2VkIHVubGVzcyB0aGUgQ29tYm8gYW5kIEVkaXQgZmxhZ3MgYXJlIGJvdGggc2V0LlxuICAgICAqL1xuICAgIEFjcm9DaG9pY2VGbGFnc1tBY3JvQ2hvaWNlRmxhZ3NbXCJEb05vdFNwZWxsQ2hlY2tcIl0gPSBmbGFnKDIzIC0gMSldID0gXCJEb05vdFNwZWxsQ2hlY2tcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBuZXcgdmFsdWUgc2hhbGwgYmUgY29tbWl0dGVkIGFzIHNvb24gYXMgYSBzZWxlY3Rpb24gaXMgbWFkZVxuICAgICAqIChjb21tb25seSB3aXRoIHRoZSBwb2ludGluZyBkZXZpY2UpLiBJbiB0aGlzIGNhc2UsIHN1cHBseWluZyBhIHZhbHVlIGZvclxuICAgICAqIGEgZmllbGQgaW52b2x2ZXMgdGhyZWUgYWN0aW9uczogc2VsZWN0aW5nIHRoZSBmaWVsZCBmb3IgZmlsbC1pbixcbiAgICAgKiBzZWxlY3RpbmcgYSBjaG9pY2UgZm9yIHRoZSBmaWxsLWluIHZhbHVlLCBhbmQgbGVhdmluZyB0aGF0IGZpZWxkLCB3aGljaFxuICAgICAqIGZpbmFsaXplcyBvciBcImNvbW1pdHNcIiB0aGUgZGF0YSBjaG9pY2UgYW5kIHRyaWdnZXJzIGFueSBhY3Rpb25zIGFzc29jaWF0ZWRcbiAgICAgKiB3aXRoIHRoZSBlbnRyeSBvciBjaGFuZ2luZyBvZiB0aGlzIGRhdGEuIElmIHRoaXMgZmxhZyBpcyBvbiwgdGhlblxuICAgICAqIHByb2Nlc3NpbmcgZG9lcyBub3Qgd2FpdCBmb3IgbGVhdmluZyB0aGUgZmllbGQgYWN0aW9uIHRvIG9jY3VyLCBidXRcbiAgICAgKiBpbW1lZGlhdGVseSBwcm9jZWVkcyB0byB0aGUgdGhpcmQgc3RlcC5cbiAgICAgKlxuICAgICAqIFRoaXMgb3B0aW9uIGVuYWJsZXMgYXBwbGljYXRpb25zIHRvIHBlcmZvcm0gYW4gYWN0aW9uIG9uY2UgYSBzZWxlY3Rpb24gaXNcbiAgICAgKiBtYWRlLCB3aXRob3V0IHJlcXVpcmluZyB0aGUgdXNlciB0byBleGl0IHRoZSBmaWVsZC4gSWYgY2xlYXIsIHRoZSBuZXdcbiAgICAgKiB2YWx1ZSBpcyBub3QgY29tbWl0dGVkIHVudGlsIHRoZSB1c2VyIGV4aXRzIHRoZSBmaWVsZC5cbiAgICAgKi9cbiAgICBBY3JvQ2hvaWNlRmxhZ3NbQWNyb0Nob2ljZUZsYWdzW1wiQ29tbWl0T25TZWxDaGFuZ2VcIl0gPSBmbGFnKDI3IC0gMSldID0gXCJDb21taXRPblNlbENoYW5nZVwiO1xufSkoQWNyb0Nob2ljZUZsYWdzIHx8IChBY3JvQ2hvaWNlRmxhZ3MgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxhZ3MuanMubWFwIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvQnV0dG9uIH0gZnJvbSBcIi4vUERGQWNyb0J1dHRvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvQ2hlY2tCb3ggfSBmcm9tIFwiLi9QREZBY3JvQ2hlY2tCb3hcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb0Nob2ljZSB9IGZyb20gXCIuL1BERkFjcm9DaG9pY2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb0NvbWJvQm94IH0gZnJvbSBcIi4vUERGQWNyb0NvbWJvQm94XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9GaWVsZCB9IGZyb20gXCIuL1BERkFjcm9GaWVsZFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvRm9ybSB9IGZyb20gXCIuL1BERkFjcm9Gb3JtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9MaXN0Qm94IH0gZnJvbSBcIi4vUERGQWNyb0xpc3RCb3hcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb05vblRlcm1pbmFsIH0gZnJvbSBcIi4vUERGQWNyb05vblRlcm1pbmFsXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9QdXNoQnV0dG9uIH0gZnJvbSBcIi4vUERGQWNyb1B1c2hCdXR0b25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb1JhZGlvQnV0dG9uIH0gZnJvbSBcIi4vUERGQWNyb1JhZGlvQnV0dG9uXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9TaWduYXR1cmUgfSBmcm9tIFwiLi9QREZBY3JvU2lnbmF0dXJlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9UZXJtaW5hbCB9IGZyb20gXCIuL1BERkFjcm9UZXJtaW5hbFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvVGV4dCB9IGZyb20gXCIuL1BERkFjcm9UZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mbGFnc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGQWNyb1Rlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9UZXJtaW5hbFwiO1xuaW1wb3J0IFBERkFjcm9Ob25UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvTm9uVGVybWluYWxcIjtcbmltcG9ydCBQREZBY3JvU2lnbmF0dXJlIGZyb20gXCIuL1BERkFjcm9TaWduYXR1cmVcIjtcbmltcG9ydCBQREZBY3JvVGV4dCBmcm9tIFwiLi9QREZBY3JvVGV4dFwiO1xuaW1wb3J0IFBERkFjcm9QdXNoQnV0dG9uIGZyb20gXCIuL1BERkFjcm9QdXNoQnV0dG9uXCI7XG5pbXBvcnQgUERGQWNyb1JhZGlvQnV0dG9uIGZyb20gXCIuL1BERkFjcm9SYWRpb0J1dHRvblwiO1xuaW1wb3J0IFBERkFjcm9DaGVja0JveCBmcm9tIFwiLi9QREZBY3JvQ2hlY2tCb3hcIjtcbmltcG9ydCBQREZBY3JvQ29tYm9Cb3ggZnJvbSBcIi4vUERGQWNyb0NvbWJvQm94XCI7XG5pbXBvcnQgUERGQWNyb0xpc3RCb3ggZnJvbSBcIi4vUERGQWNyb0xpc3RCb3hcIjtcbmltcG9ydCB7IEFjcm9CdXR0b25GbGFncywgQWNyb0Nob2ljZUZsYWdzIH0gZnJvbSBcIi4vZmxhZ3NcIjtcbmV4cG9ydCB2YXIgY3JlYXRlUERGQWNyb0ZpZWxkcyA9IGZ1bmN0aW9uIChraWREaWN0cykge1xuICAgIGlmICgha2lkRGljdHMpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB2YXIga2lkcyA9IFtdO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGtpZERpY3RzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgcmVmID0ga2lkRGljdHMuZ2V0KGlkeCk7XG4gICAgICAgIHZhciBkaWN0ID0ga2lkRGljdHMubG9va3VwKGlkeCk7XG4gICAgICAgIC8vIGlmIChkaWN0IGluc3RhbmNlb2YgUERGRGljdCkga2lkcy5wdXNoKFBERkFjcm9GaWVsZC5mcm9tRGljdChkaWN0KSk7XG4gICAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBQREZSZWYgJiYgZGljdCBpbnN0YW5jZW9mIFBERkRpY3QpIHtcbiAgICAgICAgICAgIGtpZHMucHVzaChbY3JlYXRlUERGQWNyb0ZpZWxkKGRpY3QsIHJlZiksIHJlZl0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBraWRzO1xufTtcbmV4cG9ydCB2YXIgY3JlYXRlUERGQWNyb0ZpZWxkID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgIHZhciBpc05vblRlcm1pbmFsID0gaXNOb25UZXJtaW5hbEFjcm9GaWVsZChkaWN0KTtcbiAgICBpZiAoaXNOb25UZXJtaW5hbClcbiAgICAgICAgcmV0dXJuIFBERkFjcm9Ob25UZXJtaW5hbC5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIHJldHVybiBjcmVhdGVQREZBY3JvVGVybWluYWwoZGljdCwgcmVmKTtcbn07XG4vLyBUT0RPOiBNYXliZSBqdXN0IGNoZWNrIGlmIHRoZSBkaWN0IGlzICpub3QqIGEgd2lkZ2V0PyBUaGF0IG1pZ2h0IGJlIGJldHRlci5cbi8vIEFjY29yZGluZyB0byB0aGUgUERGIHNwZWM6XG4vL1xuLy8gICA+IEEgZmllbGQncyBjaGlsZHJlbiBpbiB0aGUgaGllcmFyY2h5IG1heSBhbHNvIGluY2x1ZGUgd2lkZ2V0IGFubm90YXRpb25zXG4vLyAgID4gdGhhdCBkZWZpbmUgaXRzIGFwcGVhcmFuY2Ugb24gdGhlIHBhZ2UuIEEgZmllbGQgdGhhdCBoYXMgY2hpbGRyZW4gdGhhdFxuLy8gICA+IGFyZSBmaWVsZHMgaXMgY2FsbGVkIGEgbm9uLXRlcm1pbmFsIGZpZWxkLiBBIGZpZWxkIHRoYXQgZG9lcyBub3QgaGF2ZVxuLy8gICA+IGNoaWxkcmVuIHRoYXQgYXJlIGZpZWxkcyBpcyBjYWxsZWQgYSB0ZXJtaW5hbCBmaWVsZC5cbi8vXG4vLyBUaGUgc3BlYyBpcyBub3QgZW50aXJlbHkgY2xlYXIgYWJvdXQgaG93IHRvIGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW5cbi8vIGRpY3Rpb25hcnkgcmVwcmVzZW50cyBhbiBhY3JvZmllbGQgb3IgYSB3aWRnZXQgYW5ub3RhdGlvbi4gU28gd2Ugd2lsbCBhc3N1bWVcbi8vIHRoYXQgYSBkaWN0aW9uYXJ5IGlzIGFuIGFjcm9maWVsZCBpZiBpdCBpcyBhIG1lbWJlciBvZiB0aGUgYC9LaWRzYCBhcnJheVxuLy8gYW5kIGl0IGNvbnRhaW5zIGEgYC9UYCBlbnRyeSAod2lkZ2V0cyBkbyBub3QgaGF2ZSBgL1RgIGVudHJpZXMpLiBUaGlzIGlzbid0XG4vLyBhIGJ1bGxldCBwcm9vZiBzb2x1dGlvbiwgYmVjYXVzZSB0aGUgYC9UYCBlbnRyeSBpcyB0ZWNobmljYWxseSBkZWZpbmVkIGFzXG4vLyBvcHRpb25hbCBmb3IgYWNyb2ZpZWxkcyBieSB0aGUgUERGIHNwZWMuIEJ1dCBpbiBwcmFjdGljZSBhbGwgYWNyb2ZpZWxkcyBzZWVtXG4vLyB0byBoYXZlIGEgYC9UYCBlbnRyeSBkZWZpbmVkLlxudmFyIGlzTm9uVGVybWluYWxBY3JvRmllbGQgPSBmdW5jdGlvbiAoZGljdCkge1xuICAgIHZhciBraWRzID0gZGljdC5sb29rdXAoUERGTmFtZS5vZignS2lkcycpKTtcbiAgICBpZiAoa2lkcyBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGtpZHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIga2lkID0ga2lkcy5sb29rdXAoaWR4KTtcbiAgICAgICAgICAgIHZhciBraWRJc0ZpZWxkID0ga2lkIGluc3RhbmNlb2YgUERGRGljdCAmJiBraWQuaGFzKFBERk5hbWUub2YoJ1QnKSk7XG4gICAgICAgICAgICBpZiAoa2lkSXNGaWVsZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xudmFyIGNyZWF0ZVBERkFjcm9UZXJtaW5hbCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICB2YXIgZnROYW1lT3JSZWYgPSBnZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShkaWN0LCBQREZOYW1lLm9mKCdGVCcpKTtcbiAgICB2YXIgdHlwZSA9IGRpY3QuY29udGV4dC5sb29rdXAoZnROYW1lT3JSZWYsIFBERk5hbWUpO1xuICAgIGlmICh0eXBlID09PSBQREZOYW1lLm9mKCdCdG4nKSlcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVBERkFjcm9CdXR0b24oZGljdCwgcmVmKTtcbiAgICBpZiAodHlwZSA9PT0gUERGTmFtZS5vZignQ2gnKSlcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVBERkFjcm9DaG9pY2UoZGljdCwgcmVmKTtcbiAgICBpZiAodHlwZSA9PT0gUERGTmFtZS5vZignVHgnKSlcbiAgICAgICAgcmV0dXJuIFBERkFjcm9UZXh0LmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgaWYgKHR5cGUgPT09IFBERk5hbWUub2YoJ1NpZycpKVxuICAgICAgICByZXR1cm4gUERGQWNyb1NpZ25hdHVyZS5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIC8vIFdlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGxpbmUuIEJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2Ygd2VpcmQgUERGcyBvdXRcbiAgICAvLyB0aGVyZS4gU28sIGp1c3QgdG8gYmUgc2FmZSwgd2UnbGwgdHJ5IHRvIGhhbmRsZSB0aGluZ3MgZ3JhY2VmdWxseSBpbnN0ZWFkXG4gICAgLy8gb2YgdGhyb3dpbmcgYW4gZXJyb3IuXG4gICAgcmV0dXJuIFBERkFjcm9UZXJtaW5hbC5mcm9tRGljdChkaWN0LCByZWYpO1xufTtcbnZhciBjcmVhdGVQREZBY3JvQnV0dG9uID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgIHZhciBfYTtcbiAgICB2YXIgZmZOdW1iZXJPclJlZiA9IGdldEluaGVyaXRhYmxlQXR0cmlidXRlKGRpY3QsIFBERk5hbWUub2YoJ0ZmJykpO1xuICAgIHZhciBmZk51bWJlciA9IGRpY3QuY29udGV4dC5sb29rdXBNYXliZShmZk51bWJlck9yUmVmLCBQREZOdW1iZXIpO1xuICAgIHZhciBmbGFncyA9IChfYSA9IGZmTnVtYmVyID09PSBudWxsIHx8IGZmTnVtYmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmZk51bWJlci5hc051bWJlcigpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIGlmIChmbGFnSXNTZXQoZmxhZ3MsIEFjcm9CdXR0b25GbGFncy5QdXNoQnV0dG9uKSkge1xuICAgICAgICByZXR1cm4gUERGQWNyb1B1c2hCdXR0b24uZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZmxhZ0lzU2V0KGZsYWdzLCBBY3JvQnV0dG9uRmxhZ3MuUmFkaW8pKSB7XG4gICAgICAgIHJldHVybiBQREZBY3JvUmFkaW9CdXR0b24uZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBQREZBY3JvQ2hlY2tCb3guZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICB9XG59O1xudmFyIGNyZWF0ZVBERkFjcm9DaG9pY2UgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBmZk51bWJlck9yUmVmID0gZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoZGljdCwgUERGTmFtZS5vZignRmYnKSk7XG4gICAgdmFyIGZmTnVtYmVyID0gZGljdC5jb250ZXh0Lmxvb2t1cE1heWJlKGZmTnVtYmVyT3JSZWYsIFBERk51bWJlcik7XG4gICAgdmFyIGZsYWdzID0gKF9hID0gZmZOdW1iZXIgPT09IG51bGwgfHwgZmZOdW1iZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZmTnVtYmVyLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgaWYgKGZsYWdJc1NldChmbGFncywgQWNyb0Nob2ljZUZsYWdzLkNvbWJvKSkge1xuICAgICAgICByZXR1cm4gUERGQWNyb0NvbWJvQm94LmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gUERGQWNyb0xpc3RCb3guZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICB9XG59O1xudmFyIGZsYWdJc1NldCA9IGZ1bmN0aW9uIChmbGFncywgZmxhZykge1xuICAgIHJldHVybiAoZmxhZ3MgJiBmbGFnKSAhPT0gMDtcbn07XG52YXIgZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoc3RhcnROb2RlLCBuYW1lKSB7XG4gICAgdmFyIGF0dHJpYnV0ZTtcbiAgICBhc2NlbmQoc3RhcnROb2RlLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAoIWF0dHJpYnV0ZSlcbiAgICAgICAgICAgIGF0dHJpYnV0ZSA9IG5vZGUuZ2V0KG5hbWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhdHRyaWJ1dGU7XG59O1xudmFyIGFzY2VuZCA9IGZ1bmN0aW9uIChzdGFydE5vZGUsIHZpc2l0b3IpIHtcbiAgICB2aXNpdG9yKHN0YXJ0Tm9kZSk7XG4gICAgdmFyIFBhcmVudCA9IHN0YXJ0Tm9kZS5sb29rdXBNYXliZShQREZOYW1lLm9mKCdQYXJlbnQnKSwgUERGRGljdCk7XG4gICAgaWYgKFBhcmVudClcbiAgICAgICAgYXNjZW5kKFBhcmVudCwgdmlzaXRvcik7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwiaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG52YXIgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKGRpY3QpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB9XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuUiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFIgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1InKSk7XG4gICAgICAgIGlmIChSIGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuIFI7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5CQyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJDID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdCQycpKTtcbiAgICAgICAgaWYgKEJDIGluc3RhbmNlb2YgUERGQXJyYXkpXG4gICAgICAgICAgICByZXR1cm4gQkM7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5CRyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJHID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdCRycpKTtcbiAgICAgICAgaWYgKEJHIGluc3RhbmNlb2YgUERGQXJyYXkpXG4gICAgICAgICAgICByZXR1cm4gQkc7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5DQSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIENBID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdDQScpKTtcbiAgICAgICAgaWYgKENBIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nIHx8IENBIGluc3RhbmNlb2YgUERGU3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIENBO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuUkMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBSQyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignUkMnKSk7XG4gICAgICAgIGlmIChSQyBpbnN0YW5jZW9mIFBERkhleFN0cmluZyB8fCBSQyBpbnN0YW5jZW9mIFBERlN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBSQztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLkFDID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQUMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0FDJykpO1xuICAgICAgICBpZiAoQUMgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcgfHwgQUMgaW5zdGFuY2VvZiBQREZTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gQUM7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5nZXRSb3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5SKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc051bWJlcigpO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuZ2V0Qm9yZGVyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCQyA9IHRoaXMuQkMoKTtcbiAgICAgICAgaWYgKCFCQylcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBjb21wb25lbnRzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEJDID09PSBudWxsIHx8IEJDID09PSB2b2lkIDAgPyB2b2lkIDAgOiBCQy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSBCQy5nZXQoaWR4KTtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudC5hc051bWJlcigpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLmdldEJhY2tncm91bmRDb2xvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJHID0gdGhpcy5CRygpO1xuICAgICAgICBpZiAoIUJHKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gQkcgPT09IG51bGwgfHwgQkcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEJHLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IEJHLmdldChpZHgpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFBERk51bWJlcilcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50LmFzTnVtYmVyKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuZ2V0Q2FwdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBDQSA9IHRoaXMuQ0EoKTtcbiAgICAgICAgdmFyIFJDID0gdGhpcy5SQygpO1xuICAgICAgICB2YXIgQUMgPSB0aGlzLkFDKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub3JtYWw6IENBID09PSBudWxsIHx8IENBID09PSB2b2lkIDAgPyB2b2lkIDAgOiBDQS5kZWNvZGVUZXh0KCksXG4gICAgICAgICAgICByb2xsb3ZlcjogUkMgPT09IG51bGwgfHwgUkMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IFJDLmRlY29kZVRleHQoKSxcbiAgICAgICAgICAgIGRvd246IEFDID09PSBudWxsIHx8IEFDID09PSB2b2lkIDAgPyB2b2lkIDAgOiBBQy5kZWNvZGVUZXh0KCksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5zZXRSb3RhdGlvbiA9IGZ1bmN0aW9uIChyb3RhdGlvbikge1xuICAgICAgICB2YXIgUiA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihyb3RhdGlvbik7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUicpLCBSKTtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLnNldEJvcmRlckNvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciBCQyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihjb2xvcik7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQkMnKSwgQkMpO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuc2V0QmFja2dyb3VuZENvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciBCRyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihjb2xvcik7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQkcnKSwgQkcpO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuc2V0Q2FwdGlvbnMgPSBmdW5jdGlvbiAoY2FwdGlvbnMpIHtcbiAgICAgICAgdmFyIENBID0gUERGSGV4U3RyaW5nLmZyb21UZXh0KGNhcHRpb25zLm5vcm1hbCk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQ0EnKSwgQ0EpO1xuICAgICAgICBpZiAoY2FwdGlvbnMucm9sbG92ZXIpIHtcbiAgICAgICAgICAgIHZhciBSQyA9IFBERkhleFN0cmluZy5mcm9tVGV4dChjYXB0aW9ucy5yb2xsb3Zlcik7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1JDJyksIFJDKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignUkMnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhcHRpb25zLmRvd24pIHtcbiAgICAgICAgICAgIHZhciBBQyA9IFBERkhleFN0cmluZy5mcm9tVGV4dChjYXB0aW9ucy5kb3duKTtcbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQUMnKSwgQUMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdBQycpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcyhkaWN0KTtcbiAgICB9O1xuICAgIHJldHVybiBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3M7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmpzLm1hcCIsImltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG4vLyBUT0RPOiBBbHNvIGhhbmRsZSB0aGUgYC9TYCBhbmQgYC9EYCBlbnRyaWVzXG52YXIgQm9yZGVyU3R5bGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQm9yZGVyU3R5bGUoZGljdCkge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIH1cbiAgICBCb3JkZXJTdHlsZS5wcm90b3R5cGUuVyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFcgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1cnKSk7XG4gICAgICAgIGlmIChXIGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuIFc7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBCb3JkZXJTdHlsZS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLlcoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDE7XG4gICAgfTtcbiAgICBCb3JkZXJTdHlsZS5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgICAgICAgdmFyIFcgPSB0aGlzLmRpY3QuY29udGV4dC5vYmood2lkdGgpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1cnKSwgVyk7XG4gICAgfTtcbiAgICBCb3JkZXJTdHlsZS5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0KSB7IHJldHVybiBuZXcgQm9yZGVyU3R5bGUoZGljdCk7IH07XG4gICAgcmV0dXJuIEJvcmRlclN0eWxlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEJvcmRlclN0eWxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Qm9yZGVyU3R5bGUuanMubWFwIiwiaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERlN0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJlYW1cIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG52YXIgUERGQW5ub3RhdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZBbm5vdGF0aW9uKGRpY3QpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB9XG4gICAgLy8gVGhpcyBpcyB0ZWNobmljYWxseSByZXF1aXJlZCBieSB0aGUgUERGIHNwZWNcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5SZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdSZWN0JyksIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLkFQID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ0FQJyksIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuRiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG51bWJlck9yUmVmID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdGJykpO1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmNvbnRleHQubG9va3VwTWF5YmUobnVtYmVyT3JSZWYsIFBERk51bWJlcik7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRSZWN0YW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIFJlY3QgPSB0aGlzLlJlY3QoKTtcbiAgICAgICAgcmV0dXJuIChfYSA9IFJlY3QgPT09IG51bGwgfHwgUmVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogUmVjdC5hc1JlY3RhbmdsZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldFJlY3RhbmdsZSA9IGZ1bmN0aW9uIChyZWN0KSB7XG4gICAgICAgIHZhciB4ID0gcmVjdC54LCB5ID0gcmVjdC55LCB3aWR0aCA9IHJlY3Qud2lkdGgsIGhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICAgICAgICB2YXIgUmVjdCA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUmVjdCcpLCBSZWN0KTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmdldEFwcGVhcmFuY2VTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFTID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdBUycpKTtcbiAgICAgICAgaWYgKEFTIGluc3RhbmNlb2YgUERGTmFtZSlcbiAgICAgICAgICAgIHJldHVybiBBUztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldEFwcGVhcmFuY2VTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0FTJyksIHN0YXRlKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldEFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGFwcGVhcmFuY2VzKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQVAnKSwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuZW5zdXJlQVAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBBUCA9IHRoaXMuQVAoKTtcbiAgICAgICAgaWYgKCFBUCkge1xuICAgICAgICAgICAgQVAgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooe30pO1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdBUCcpLCBBUCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFQO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0Tm9ybWFsQXBwZWFyYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5lbnN1cmVBUCgpO1xuICAgICAgICB2YXIgTiA9IEFQLmdldChQREZOYW1lLm9mKCdOJykpO1xuICAgICAgICBpZiAoTiBpbnN0YW5jZW9mIFBERlJlZiB8fCBOIGluc3RhbmNlb2YgUERGRGljdClcbiAgICAgICAgICAgIHJldHVybiBOO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIE4gdHlwZTogXCIgKyAoTiA9PT0gbnVsbCB8fCBOID09PSB2b2lkIDAgPyB2b2lkIDAgOiBOLmNvbnN0cnVjdG9yLm5hbWUpKTtcbiAgICB9O1xuICAgIC8qKiBAcGFyYW0gYXBwZWFyYW5jZSBBIFBERkRpY3Qgb3IgUERGU3RyZWFtIChkaXJlY3Qgb3IgcmVmKSAqL1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldE5vcm1hbEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLmVuc3VyZUFQKCk7XG4gICAgICAgIEFQLnNldChQREZOYW1lLm9mKCdOJyksIGFwcGVhcmFuY2UpO1xuICAgIH07XG4gICAgLyoqIEBwYXJhbSBhcHBlYXJhbmNlIEEgUERGRGljdCBvciBQREZTdHJlYW0gKGRpcmVjdCBvciByZWYpICovXG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0Um9sbG92ZXJBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5lbnN1cmVBUCgpO1xuICAgICAgICBBUC5zZXQoUERGTmFtZS5vZignUicpLCBhcHBlYXJhbmNlKTtcbiAgICB9O1xuICAgIC8qKiBAcGFyYW0gYXBwZWFyYW5jZSBBIFBERkRpY3Qgb3IgUERGU3RyZWFtIChkaXJlY3Qgb3IgcmVmKSAqL1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldERvd25BcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5lbnN1cmVBUCgpO1xuICAgICAgICBBUC5zZXQoUERGTmFtZS5vZignRCcpLCBhcHBlYXJhbmNlKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnJlbW92ZVJvbGxvdmVyQXBwZWFyYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5BUCgpO1xuICAgICAgICBBUCA9PT0gbnVsbCB8fCBBUCA9PT0gdm9pZCAwID8gdm9pZCAwIDogQVAuZGVsZXRlKFBERk5hbWUub2YoJ1InKSk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5yZW1vdmVEb3duQXBwZWFyYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5BUCgpO1xuICAgICAgICBBUCA9PT0gbnVsbCB8fCBBUCA9PT0gdm9pZCAwID8gdm9pZCAwIDogQVAuZGVsZXRlKFBERk5hbWUub2YoJ0QnKSk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5BUCgpO1xuICAgICAgICBpZiAoIUFQKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIE4gPSBBUC5sb29rdXAoUERGTmFtZS5vZignTicpLCBQREZEaWN0LCBQREZTdHJlYW0pO1xuICAgICAgICB2YXIgUiA9IEFQLmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ1InKSwgUERGRGljdCwgUERGU3RyZWFtKTtcbiAgICAgICAgdmFyIEQgPSBBUC5sb29rdXBNYXliZShQREZOYW1lLm9mKCdEJyksIFBERkRpY3QsIFBERlN0cmVhbSk7XG4gICAgICAgIHJldHVybiB7IG5vcm1hbDogTiwgcm9sbG92ZXI6IFIsIGRvd246IEQgfTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmdldEZsYWdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5GKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc051bWJlcigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0RmxhZ3MgPSBmdW5jdGlvbiAoZmxhZ3MpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdGJyksIFBERk51bWJlci5vZihmbGFncykpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuaGFzRmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBmbGFncyA9IHRoaXMuZ2V0RmxhZ3MoKTtcbiAgICAgICAgcmV0dXJuIChmbGFncyAmIGZsYWcpICE9PSAwO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0RmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBmbGFncyA9IHRoaXMuZ2V0RmxhZ3MoKTtcbiAgICAgICAgdGhpcy5zZXRGbGFncyhmbGFncyB8IGZsYWcpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuY2xlYXJGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5nZXRGbGFncygpO1xuICAgICAgICB0aGlzLnNldEZsYWdzKGZsYWdzICYgfmZsYWcpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0RmxhZ1RvID0gZnVuY3Rpb24gKGZsYWcsIGVuYWJsZSkge1xuICAgICAgICBpZiAoZW5hYmxlKVxuICAgICAgICAgICAgdGhpcy5zZXRGbGFnKGZsYWcpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmNsZWFyRmxhZyhmbGFnKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24uZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCkgeyByZXR1cm4gbmV3IFBERkFubm90YXRpb24oZGljdCk7IH07XG4gICAgcmV0dXJuIFBERkFubm90YXRpb247XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQW5ub3RhdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFubm90YXRpb24uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgQm9yZGVyU3R5bGUgZnJvbSBcIi4vQm9yZGVyU3R5bGVcIjtcbmltcG9ydCBQREZBbm5vdGF0aW9uIGZyb20gXCIuL1BERkFubm90YXRpb25cIjtcbmltcG9ydCBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzIGZyb20gXCIuL0FwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3NcIjtcbnZhciBQREZXaWRnZXRBbm5vdGF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZXaWRnZXRBbm5vdGF0aW9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERldpZGdldEFubm90YXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuTUsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBNSyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignTUsnKSk7XG4gICAgICAgIGlmIChNSyBpbnN0YW5jZW9mIFBERkRpY3QpXG4gICAgICAgICAgICByZXR1cm4gTUs7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5CUyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJTID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdCUycpKTtcbiAgICAgICAgaWYgKEJTIGluc3RhbmNlb2YgUERGRGljdClcbiAgICAgICAgICAgIHJldHVybiBCUztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLkRBID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGEgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0RBJykpO1xuICAgICAgICBpZiAoZGEgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgZGEgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gZGE7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5QID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgUCA9IHRoaXMuZGljdC5nZXQoUERGTmFtZS5vZignUCcpKTtcbiAgICAgICAgaWYgKFAgaW5zdGFuY2VvZiBQREZSZWYpXG4gICAgICAgICAgICByZXR1cm4gUDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLnNldFAgPSBmdW5jdGlvbiAocGFnZSkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1AnKSwgcGFnZSk7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXREZWZhdWx0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignREEnKSwgUERGU3RyaW5nLm9mKGFwcGVhcmFuY2UpKTtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldERlZmF1bHRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgREEgPSB0aGlzLkRBKCk7XG4gICAgICAgIGlmIChEQSBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIERBLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gREEgPT09IG51bGwgfHwgREEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IERBLmFzU3RyaW5nKCk7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgTUsgPSB0aGlzLk1LKCk7XG4gICAgICAgIGlmIChNSylcbiAgICAgICAgICAgIHJldHVybiBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmZyb21EaWN0KE1LKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldE9yQ3JlYXRlQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIE1LID0gdGhpcy5NSygpO1xuICAgICAgICBpZiAoTUspXG4gICAgICAgICAgICByZXR1cm4gQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5mcm9tRGljdChNSyk7XG4gICAgICAgIHZhciBhYyA9IEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MuZnJvbURpY3QodGhpcy5kaWN0LmNvbnRleHQub2JqKHt9KSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignTUsnKSwgYWMuZGljdCk7XG4gICAgICAgIHJldHVybiBhYztcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldEJvcmRlclN0eWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQlMgPSB0aGlzLkJTKCk7XG4gICAgICAgIGlmIChCUylcbiAgICAgICAgICAgIHJldHVybiBCb3JkZXJTdHlsZS5mcm9tRGljdChCUyk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRPckNyZWF0ZUJvcmRlclN0eWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQlMgPSB0aGlzLkJTKCk7XG4gICAgICAgIGlmIChCUylcbiAgICAgICAgICAgIHJldHVybiBCb3JkZXJTdHlsZS5mcm9tRGljdChCUyk7XG4gICAgICAgIHZhciBicyA9IEJvcmRlclN0eWxlLmZyb21EaWN0KHRoaXMuZGljdC5jb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0JTJyksIGJzLmRpY3QpO1xuICAgICAgICByZXR1cm4gYnM7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRPblZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBub3JtYWwgPSAoX2EgPSB0aGlzLmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWw7XG4gICAgICAgIGlmIChub3JtYWwgaW5zdGFuY2VvZiBQREZEaWN0KSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IG5vcm1hbC5rZXlzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBrZXlzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gUERGTmFtZS5vZignT2ZmJykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24uZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCkge1xuICAgICAgICByZXR1cm4gbmV3IFBERldpZGdldEFubm90YXRpb24oZGljdCk7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBUeXBlOiAnQW5ub3QnLFxuICAgICAgICAgICAgU3VidHlwZTogJ1dpZGdldCcsXG4gICAgICAgICAgICBSZWN0OiBbMCwgMCwgMCwgMF0sXG4gICAgICAgICAgICBQYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgUERGV2lkZ2V0QW5ub3RhdGlvbihkaWN0KTtcbiAgICB9O1xuICAgIHJldHVybiBQREZXaWRnZXRBbm5vdGF0aW9uO1xufShQREZBbm5vdGF0aW9uKSk7XG5leHBvcnQgZGVmYXVsdCBQREZXaWRnZXRBbm5vdGF0aW9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGV2lkZ2V0QW5ub3RhdGlvbi5qcy5tYXAiLCJ2YXIgZmxhZyA9IGZ1bmN0aW9uIChiaXRJbmRleCkgeyByZXR1cm4gMSA8PCBiaXRJbmRleDsgfTtcbi8qKiBGcm9tIFBERiBzcGVjIHRhYmxlIDE2NSAqL1xuZXhwb3J0IHZhciBBbm5vdGF0aW9uRmxhZ3M7XG4oZnVuY3Rpb24gKEFubm90YXRpb25GbGFncykge1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IGRpc3BsYXkgdGhlIGFubm90YXRpb24gaWYgaXQgZG9lcyBub3QgYmVsb25nIHRvIG9uZSBvZiB0aGVcbiAgICAgKiBzdGFuZGFyZCBhbm5vdGF0aW9uIHR5cGVzIGFuZCBubyBhbm5vdGF0aW9uIGhhbmRsZXIgaXMgYXZhaWxhYmxlLiBJZiBjbGVhcixcbiAgICAgKiBkaXNwbGF5IHN1Y2ggYW4gdW5rbm93biBhbm5vdGF0aW9uIHVzaW5nIGFuIGFwcGVhcmFuY2Ugc3RyZWFtIHNwZWNpZmllZCBieVxuICAgICAqIGl0cyBhcHBlYXJhbmNlIGRpY3Rpb25hcnksIGlmIGFueS5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiSW52aXNpYmxlXCJdID0gZmxhZygxIC0gMSldID0gXCJJbnZpc2libGVcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBkaXNwbGF5IG9yIHByaW50IHRoZSBhbm5vdGF0aW9uIG9yIGFsbG93IGl0IHRvIGludGVyYWN0IHdpdGhcbiAgICAgKiB0aGUgdXNlciwgcmVnYXJkbGVzcyBvZiBpdHMgYW5ub3RhdGlvbiB0eXBlIG9yIHdoZXRoZXIgYW4gYW5ub3RhdGlvblxuICAgICAqIGhhbmRsZXIgaXMgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogSW4gY2FzZXMgd2hlcmUgc2NyZWVuIHNwYWNlIGlzIGxpbWl0ZWQsIHRoZSBhYmlsaXR5IHRvIGhpZGUgYW5kIHNob3dcbiAgICAgKiBhbm5vdGF0aW9ucyBzZWxlY3RpdmVseSBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGFwcGVhcmFuY2Ugc3RyZWFtc1xuICAgICAqIHRvIGRpc3BsYXkgYXV4aWxpYXJ5IHBvcC11cCBpbmZvcm1hdGlvbiBzaW1pbGFyIGluIGZ1bmN0aW9uIHRvIG9ubGluZSBoZWxwXG4gICAgICogc3lzdGVtcy5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiSGlkZGVuXCJdID0gZmxhZygyIC0gMSldID0gXCJIaWRkZW5cIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHByaW50IHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIHBhZ2UgaXMgcHJpbnRlZC4gSWYgY2xlYXIsIG5ldmVyXG4gICAgICogcHJpbnQgdGhlIGFubm90YXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgYW5ub3RhdGlvbnMgcmVwcmVzZW50aW5nIGludGVyYWN0aXZlIHB1c2hidXR0b25zLFxuICAgICAqIHdoaWNoIHdvdWxkIHNlcnZlIG5vIG1lYW5pbmdmdWwgcHVycG9zZSBvbiB0aGUgcHJpbnRlZCBwYWdlLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJQcmludFwiXSA9IGZsYWcoMyAtIDEpXSA9IFwiUHJpbnRcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBzY2FsZSB0aGUgYW5ub3RhdGlvbuKAmXMgYXBwZWFyYW5jZSB0byBtYXRjaCB0aGUgbWFnbmlmaWNhdGlvblxuICAgICAqIG9mIHRoZSBwYWdlLiBUaGUgbG9jYXRpb24gb2YgdGhlIGFubm90YXRpb24gb24gdGhlIHBhZ2UgKGRlZmluZWQgYnkgdGhlXG4gICAgICogdXBwZXItbGVmdCBjb3JuZXIgb2YgaXRzIGFubm90YXRpb24gcmVjdGFuZ2xlKSBzaGFsbCByZW1haW4gZml4ZWQsXG4gICAgICogcmVnYXJkbGVzcyBvZiB0aGUgcGFnZSBtYWduaWZpY2F0aW9uLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJOb1pvb21cIl0gPSBmbGFnKDQgLSAxKV0gPSBcIk5vWm9vbVwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IHJvdGF0ZSB0aGUgYW5ub3RhdGlvbuKAmXMgYXBwZWFyYW5jZSB0byBtYXRjaCB0aGUgcm90YXRpb24gb2ZcbiAgICAgKiB0aGUgcGFnZS4gVGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBhbm5vdGF0aW9uIHJlY3RhbmdsZSBzaGFsbCByZW1haW4gaW5cbiAgICAgKiBhIGZpeGVkIGxvY2F0aW9uIG9uIHRoZSBwYWdlLCByZWdhcmRsZXNzIG9mIHRoZSBwYWdlIHJvdGF0aW9uLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJOb1JvdGF0ZVwiXSA9IGZsYWcoNSAtIDEpXSA9IFwiTm9Sb3RhdGVcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBkaXNwbGF5IHRoZSBhbm5vdGF0aW9uIG9uIHRoZSBzY3JlZW4gb3IgYWxsb3cgaXQgdG8gaW50ZXJhY3RcbiAgICAgKiB3aXRoIHRoZSB1c2VyLiBUaGUgYW5ub3RhdGlvbiBtYXkgYmUgcHJpbnRlZCAoZGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5nIG9mXG4gICAgICogdGhlIFByaW50IGZsYWcpIGJ1dCBzaG91bGQgYmUgY29uc2lkZXJlZCBoaWRkZW4gZm9yIHB1cnBvc2VzIG9mIG9uLXNjcmVlblxuICAgICAqIGRpc3BsYXkgYW5kIHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIk5vVmlld1wiXSA9IGZsYWcoNiAtIDEpXSA9IFwiTm9WaWV3XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3QgYWxsb3cgdGhlIGFubm90YXRpb24gdG8gaW50ZXJhY3Qgd2l0aCB0aGUgdXNlci4gVGhlXG4gICAgICogYW5ub3RhdGlvbiBtYXkgYmUgZGlzcGxheWVkIG9yIHByaW50ZWQgKGRlcGVuZGluZyBvbiB0aGUgc2V0dGluZ3Mgb2YgdGhlXG4gICAgICogTm9WaWV3IGFuZCBQcmludCBmbGFncykgYnV0IHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBjbGlja3Mgb3IgY2hhbmdlXG4gICAgICogaXRzIGFwcGVhcmFuY2UgaW4gcmVzcG9uc2UgdG8gbW91c2UgbW90aW9ucy5cbiAgICAgKlxuICAgICAqIFRoaXMgZmxhZyBzaGFsbCBiZSBpZ25vcmVkIGZvciB3aWRnZXQgYW5ub3RhdGlvbnM7IGl0cyBmdW5jdGlvbiBpc1xuICAgICAqIHN1YnN1bWVkIGJ5IHRoZSBSZWFkT25seSBmbGFnIG9mIHRoZSBhc3NvY2lhdGVkIGZvcm0gZmllbGQuXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIlJlYWRPbmx5XCJdID0gZmxhZyg3IC0gMSldID0gXCJSZWFkT25seVwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IGFsbG93IHRoZSBhbm5vdGF0aW9uIHRvIGJlIGRlbGV0ZWQgb3IgaXRzIHByb3BlcnRpZXNcbiAgICAgKiAoaW5jbHVkaW5nIHBvc2l0aW9uIGFuZCBzaXplKSB0byBiZSBtb2RpZmllZCBieSB0aGUgdXNlci4gSG93ZXZlciwgdGhpc1xuICAgICAqIGZsYWcgZG9lcyBub3QgcmVzdHJpY3QgY2hhbmdlcyB0byB0aGUgYW5ub3RhdGlvbuKAmXMgY29udGVudHMsIHN1Y2ggYXMgdGhlXG4gICAgICogdmFsdWUgb2YgYSBmb3JtIGZpZWxkLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJMb2NrZWRcIl0gPSBmbGFnKDggLSAxKV0gPSBcIkxvY2tlZFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgaW52ZXJ0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgTm9WaWV3IGZsYWcgZm9yIGNlcnRhaW4gZXZlbnRzLlxuICAgICAqXG4gICAgICogQSB0eXBpY2FsIHVzZSBpcyB0byBoYXZlIGFuIGFubm90YXRpb24gdGhhdCBhcHBlYXJzIG9ubHkgd2hlbiBhIG1vdXNlXG4gICAgICogY3Vyc29yIGlzIGhlbGQgb3ZlciBpdC5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiVG9nZ2xlTm9WaWV3XCJdID0gZmxhZyg5IC0gMSldID0gXCJUb2dnbGVOb1ZpZXdcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBhbGxvdyB0aGUgY29udGVudHMgb2YgdGhlIGFubm90YXRpb24gdG8gYmUgbW9kaWZpZWQgYnkgdGhlXG4gICAgICogdXNlci4gVGhpcyBmbGFnIGRvZXMgbm90IHJlc3RyaWN0IGRlbGV0aW9uIG9mIHRoZSBhbm5vdGF0aW9uIG9yIGNoYW5nZXMgdG9cbiAgICAgKiBvdGhlciBhbm5vdGF0aW9uIHByb3BlcnRpZXMsIHN1Y2ggYXMgcG9zaXRpb24gYW5kIHNpemUuXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIkxvY2tlZENvbnRlbnRzXCJdID0gZmxhZygxMCAtIDEpXSA9IFwiTG9ja2VkQ29udGVudHNcIjtcbn0pKEFubm90YXRpb25GbGFncyB8fCAoQW5ub3RhdGlvbkZsYWdzID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZsYWdzLmpzLm1hcCIsImV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQW5ub3RhdGlvbiB9IGZyb20gXCIuL1BERkFubm90YXRpb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGV2lkZ2V0QW5ub3RhdGlvbiB9IGZyb20gXCIuL1BERldpZGdldEFubm90YXRpb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcyB9IGZyb20gXCIuL0FwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZsYWdzXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIHBhZFN0YXJ0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIEVudHJpZXMgc2hvdWxkIGJlIGFkZGVkIHVzaW5nIHRoZSBbW2FkZEVudHJ5XV0gYW5kIFtbYWRkRGVsZXRlZEVudHJ5XV1cbiAqIG1ldGhvZHMgKippbiBvcmRlciBvZiBhc2NlbmRpbmcgb2JqZWN0IG51bWJlcioqLlxuICovXG52YXIgUERGQ3Jvc3NSZWZTZWN0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkNyb3NzUmVmU2VjdGlvbihmaXJzdEVudHJ5KSB7XG4gICAgICAgIHRoaXMuc3Vic2VjdGlvbnMgPSBmaXJzdEVudHJ5ID8gW1tmaXJzdEVudHJ5XV0gOiBbXTtcbiAgICAgICAgdGhpcy5jaHVua0lkeCA9IDA7XG4gICAgICAgIHRoaXMuY2h1bmtMZW5ndGggPSBmaXJzdEVudHJ5ID8gMSA6IDA7XG4gICAgfVxuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuYWRkRW50cnkgPSBmdW5jdGlvbiAocmVmLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoeyByZWY6IHJlZiwgb2Zmc2V0OiBvZmZzZXQsIGRlbGV0ZWQ6IGZhbHNlIH0pO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5hZGREZWxldGVkRW50cnkgPSBmdW5jdGlvbiAocmVmLCBuZXh0RnJlZU9iamVjdE51bWJlcikge1xuICAgICAgICB0aGlzLmFwcGVuZCh7IHJlZjogcmVmLCBvZmZzZXQ6IG5leHRGcmVlT2JqZWN0TnVtYmVyLCBkZWxldGVkOiB0cnVlIH0pO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNlY3Rpb24gPSBcInhyZWZcXG5cIjtcbiAgICAgICAgZm9yICh2YXIgcmFuZ2VJZHggPSAwLCByYW5nZUxlbiA9IHRoaXMuc3Vic2VjdGlvbnMubGVuZ3RoOyByYW5nZUlkeCA8IHJhbmdlTGVuOyByYW5nZUlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLnN1YnNlY3Rpb25zW3JhbmdlSWR4XTtcbiAgICAgICAgICAgIHNlY3Rpb24gKz0gcmFuZ2VbMF0ucmVmLm9iamVjdE51bWJlciArIFwiIFwiICsgcmFuZ2UubGVuZ3RoICsgXCJcXG5cIjtcbiAgICAgICAgICAgIGZvciAodmFyIGVudHJ5SWR4ID0gMCwgZW50cnlMZW4gPSByYW5nZS5sZW5ndGg7IGVudHJ5SWR4IDwgZW50cnlMZW47IGVudHJ5SWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSByYW5nZVtlbnRyeUlkeF07XG4gICAgICAgICAgICAgICAgc2VjdGlvbiArPSBwYWRTdGFydChTdHJpbmcoZW50cnkub2Zmc2V0KSwgMTAsICcwJyk7XG4gICAgICAgICAgICAgICAgc2VjdGlvbiArPSAnICc7XG4gICAgICAgICAgICAgICAgc2VjdGlvbiArPSBwYWRTdGFydChTdHJpbmcoZW50cnkucmVmLmdlbmVyYXRpb25OdW1iZXIpLCA1LCAnMCcpO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gJyAnO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gZW50cnkuZGVsZXRlZCA/ICdmJyA6ICduJztcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9ICcgXFxuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VjdGlvbjtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzaXplID0gNTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5zdWJzZWN0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBzdWJzZWN0aW9uID0gdGhpcy5zdWJzZWN0aW9uc1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN1YnNlY3Rpb25MZW5ndGggPSBzdWJzZWN0aW9uLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBmaXJzdEVudHJ5ID0gc3Vic2VjdGlvblswXTtcbiAgICAgICAgICAgIHNpemUgKz0gMjtcbiAgICAgICAgICAgIHNpemUgKz0gU3RyaW5nKGZpcnN0RW50cnkucmVmLm9iamVjdE51bWJlcikubGVuZ3RoO1xuICAgICAgICAgICAgc2l6ZSArPSBTdHJpbmcoc3Vic2VjdGlvbkxlbmd0aCkubGVuZ3RoO1xuICAgICAgICAgICAgc2l6ZSArPSAyMCAqIHN1YnNlY3Rpb25MZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMueDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBvZmZzZXQgKz0gdGhpcy5jb3B5U3Vic2VjdGlvbnNJbnRvQnVmZmVyKHRoaXMuc3Vic2VjdGlvbnMsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLmNvcHlTdWJzZWN0aW9uc0ludG9CdWZmZXIgPSBmdW5jdGlvbiAoc3Vic2VjdGlvbnMsIGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB2YXIgbGVuZ3RoID0gc3Vic2VjdGlvbnMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgc3Vic2VjdGlvbiA9IHRoaXMuc3Vic2VjdGlvbnNbaWR4XTtcbiAgICAgICAgICAgIHZhciBmaXJzdE9iamVjdE51bWJlciA9IFN0cmluZyhzdWJzZWN0aW9uWzBdLnJlZi5vYmplY3ROdW1iZXIpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKGZpcnN0T2JqZWN0TnVtYmVyLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICAgICAgdmFyIHJhbmdlTGVuZ3RoID0gU3RyaW5nKHN1YnNlY3Rpb24ubGVuZ3RoKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihyYW5nZUxlbmd0aCwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRoaXMuY29weUVudHJpZXNJbnRvQnVmZmVyKHN1YnNlY3Rpb24sIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuY29weUVudHJpZXNJbnRvQnVmZmVyID0gZnVuY3Rpb24gKGVudHJpZXMsIGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpZHhdO1xuICAgICAgICAgICAgdmFyIGVudHJ5T2Zmc2V0ID0gcGFkU3RhcnQoU3RyaW5nKGVudHJ5Lm9mZnNldCksIDEwLCAnMCcpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKGVudHJ5T2Zmc2V0LCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICAgICAgdmFyIGVudHJ5R2VuID0gcGFkU3RhcnQoU3RyaW5nKGVudHJ5LnJlZi5nZW5lcmF0aW9uTnVtYmVyKSwgNSwgJzAnKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihlbnRyeUdlbiwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBlbnRyeS5kZWxldGVkID8gQ2hhckNvZGVzLmYgOiBDaGFyQ29kZXMubjtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDIwICogbGVuZ3RoO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoY3VyckVudHJ5KSB7XG4gICAgICAgIGlmICh0aGlzLmNodW5rTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNlY3Rpb25zLnB1c2goW2N1cnJFbnRyeV0pO1xuICAgICAgICAgICAgdGhpcy5jaHVua0lkeCA9IDA7XG4gICAgICAgICAgICB0aGlzLmNodW5rTGVuZ3RoID0gMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2h1bmsgPSB0aGlzLnN1YnNlY3Rpb25zW3RoaXMuY2h1bmtJZHhdO1xuICAgICAgICB2YXIgcHJldkVudHJ5ID0gY2h1bmtbdGhpcy5jaHVua0xlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoY3VyckVudHJ5LnJlZi5vYmplY3ROdW1iZXIgLSBwcmV2RW50cnkucmVmLm9iamVjdE51bWJlciA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2VjdGlvbnMucHVzaChbY3VyckVudHJ5XSk7XG4gICAgICAgICAgICB0aGlzLmNodW5rSWR4ICs9IDE7XG4gICAgICAgICAgICB0aGlzLmNodW5rTGVuZ3RoID0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goY3VyckVudHJ5KTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtMZW5ndGggKz0gMTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZDcm9zc1JlZlNlY3Rpb24oe1xuICAgICAgICAgICAgcmVmOiBQREZSZWYub2YoMCwgNjU1MzUpLFxuICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgZGVsZXRlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24uY3JlYXRlRW1wdHkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUERGQ3Jvc3NSZWZTZWN0aW9uKCk7IH07XG4gICAgcmV0dXJuIFBERkNyb3NzUmVmU2VjdGlvbjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZDcm9zc1JlZlNlY3Rpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZDcm9zc1JlZlNlY3Rpb24uanMubWFwIiwiaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY2hhckZyb21Db2RlLCBjb3B5U3RyaW5nSW50b0J1ZmZlciB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERkhlYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZIZWFkZXIobWFqb3IsIG1pbm9yKSB7XG4gICAgICAgIHRoaXMubWFqb3IgPSBTdHJpbmcobWFqb3IpO1xuICAgICAgICB0aGlzLm1pbm9yID0gU3RyaW5nKG1pbm9yKTtcbiAgICB9XG4gICAgUERGSGVhZGVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJjID0gY2hhckZyb21Db2RlKDEyOSk7XG4gICAgICAgIHJldHVybiBcIiVQREYtXCIgKyB0aGlzLm1ham9yICsgXCIuXCIgKyB0aGlzLm1pbm9yICsgXCJcXG4lXCIgKyBiYyArIGJjICsgYmMgKyBiYztcbiAgICB9O1xuICAgIFBERkhlYWRlci5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAxMiArIHRoaXMubWFqb3IubGVuZ3RoICsgdGhpcy5taW5vci5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZIZWFkZXIucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUGVyY2VudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5QO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuRjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5EYXNoO1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5tYWpvciwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlBlcmlvZDtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMubWlub3IsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlBlcmNlbnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSAxMjk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSAxMjk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSAxMjk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSAxMjk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGSGVhZGVyLmZvclZlcnNpb24gPSBmdW5jdGlvbiAobWFqb3IsIG1pbm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGSGVhZGVyKG1ham9yLCBtaW5vcik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGSGVhZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkhlYWRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkhlYWRlci5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERlRyYWlsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGVHJhaWxlcihsYXN0WFJlZk9mZnNldCkge1xuICAgICAgICB0aGlzLmxhc3RYUmVmT2Zmc2V0ID0gU3RyaW5nKGxhc3RYUmVmT2Zmc2V0KTtcbiAgICB9XG4gICAgUERGVHJhaWxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcInN0YXJ0eHJlZlxcblwiICsgdGhpcy5sYXN0WFJlZk9mZnNldCArIFwiXFxuJSVFT0ZcIjtcbiAgICB9O1xuICAgIFBERlRyYWlsZXIucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gMTYgKyB0aGlzLmxhc3RYUmVmT2Zmc2V0Lmxlbmd0aDtcbiAgICB9O1xuICAgIFBERlRyYWlsZXIucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucztcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmE7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLng7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmY7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMubGFzdFhSZWZPZmZzZXQsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlBlcmNlbnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUGVyY2VudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5FO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk87XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuRjtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZUcmFpbGVyLmZvckxhc3RDcm9zc1JlZlNlY3Rpb25PZmZzZXQgPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGVHJhaWxlcihvZmZzZXQpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlRyYWlsZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGVHJhaWxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlRyYWlsZXIuanMubWFwIiwiaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xudmFyIFBERlRyYWlsZXJEaWN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERlRyYWlsZXJEaWN0KGRpY3QpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB9XG4gICAgUERGVHJhaWxlckRpY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJ0cmFpbGVyXFxuXCIgKyB0aGlzLmRpY3QudG9TdHJpbmcoKTtcbiAgICB9O1xuICAgIFBERlRyYWlsZXJEaWN0LnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDggKyB0aGlzLmRpY3Quc2l6ZUluQnl0ZXMoKTtcbiAgICB9O1xuICAgIFBERlRyYWlsZXJEaWN0LnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5hO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMuZGljdC5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZUcmFpbGVyRGljdC5vZiA9IGZ1bmN0aW9uIChkaWN0KSB7IHJldHVybiBuZXcgUERGVHJhaWxlckRpY3QoZGljdCk7IH07XG4gICAgcmV0dXJuIFBERlRyYWlsZXJEaWN0O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlRyYWlsZXJEaWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGVHJhaWxlckRpY3QuanMubWFwIiwiaW1wb3J0IHsgdG9IZXhTdHJpbmcsIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGggfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IGhhc1N1cnJvZ2F0ZXMsIGhpZ2hTdXJyb2dhdGUsIGlzV2l0aGluQk1QLCBsb3dTdXJyb2dhdGUsIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3VuaWNvZGVcIjtcbi8qKiBgZ2x5cGhzYCBzaG91bGQgYmUgYW4gYXJyYXkgb2YgdW5pcXVlIGdseXBocyAqL1xuZXhwb3J0IHZhciBjcmVhdGVDbWFwID0gZnVuY3Rpb24gKGdseXBocywgZ2x5cGhJZCkge1xuICAgIHZhciBiZkNoYXJzID0gbmV3IEFycmF5KGdseXBocy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2lkeF07XG4gICAgICAgIHZhciBpZCA9IGNtYXBIZXhGb3JtYXQoY21hcEhleFN0cmluZyhnbHlwaElkKGdseXBoKSkpO1xuICAgICAgICB2YXIgdW5pY29kZSA9IGNtYXBIZXhGb3JtYXQuYXBwbHkodm9pZCAwLCBnbHlwaC5jb2RlUG9pbnRzLm1hcChjbWFwQ29kZVBvaW50Rm9ybWF0KSk7XG4gICAgICAgIGJmQ2hhcnNbaWR4XSA9IFtpZCwgdW5pY29kZV07XG4gICAgfVxuICAgIHJldHVybiBmaWxsQ21hcFRlbXBsYXRlKGJmQ2hhcnMpO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVGVtcGxhdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG52YXIgZmlsbENtYXBUZW1wbGF0ZSA9IGZ1bmN0aW9uIChiZkNoYXJzKSB7IHJldHVybiBcIi9DSURJbml0IC9Qcm9jU2V0IGZpbmRyZXNvdXJjZSBiZWdpblxcbjEyIGRpY3QgYmVnaW5cXG5iZWdpbmNtYXBcXG4vQ0lEU3lzdGVtSW5mbyA8PFxcbiAgL1JlZ2lzdHJ5IChBZG9iZSlcXG4gIC9PcmRlcmluZyAoVUNTKVxcbiAgL1N1cHBsZW1lbnQgMFxcbj4+IGRlZlxcbi9DTWFwTmFtZSAvQWRvYmUtSWRlbnRpdHktVUNTIGRlZlxcbi9DTWFwVHlwZSAyIGRlZlxcbjEgYmVnaW5jb2Rlc3BhY2VyYW5nZVxcbjwwMDAwPjxmZmZmPlxcbmVuZGNvZGVzcGFjZXJhbmdlXFxuXCIgKyBiZkNoYXJzLmxlbmd0aCArIFwiIGJlZ2luYmZjaGFyXFxuXCIgKyBiZkNoYXJzLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgZ2x5cGhJZCA9IF9hWzBdLCBjb2RlUG9pbnQgPSBfYVsxXTtcbiAgICByZXR1cm4gZ2x5cGhJZCArIFwiIFwiICsgY29kZVBvaW50O1xufSkuam9pbignXFxuJykgKyBcIlxcbmVuZGJmY2hhclxcbmVuZGNtYXBcXG5DTWFwTmFtZSBjdXJyZW50ZGljdCAvQ01hcCBkZWZpbmVyZXNvdXJjZSBwb3BcXG5lbmRcXG5lbmRcIjsgfTtcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVXRpbGl0aWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG52YXIgY21hcEhleEZvcm1hdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFsdWVzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHJldHVybiBcIjxcIiArIHZhbHVlcy5qb2luKCcnKSArIFwiPlwiO1xufTtcbnZhciBjbWFwSGV4U3RyaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0b0hleFN0cmluZ09mTWluTGVuZ3RoKHZhbHVlLCA0KTsgfTtcbnZhciBjbWFwQ29kZVBvaW50Rm9ybWF0ID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgIGlmIChpc1dpdGhpbkJNUChjb2RlUG9pbnQpKVxuICAgICAgICByZXR1cm4gY21hcEhleFN0cmluZyhjb2RlUG9pbnQpO1xuICAgIGlmIChoYXNTdXJyb2dhdGVzKGNvZGVQb2ludCkpIHtcbiAgICAgICAgdmFyIGhzID0gaGlnaFN1cnJvZ2F0ZShjb2RlUG9pbnQpO1xuICAgICAgICB2YXIgbHMgPSBsb3dTdXJyb2dhdGUoY29kZVBvaW50KTtcbiAgICAgICAgcmV0dXJuIFwiXCIgKyBjbWFwSGV4U3RyaW5nKGhzKSArIGNtYXBIZXhTdHJpbmcobHMpO1xuICAgIH1cbiAgICB2YXIgaGV4ID0gdG9IZXhTdHJpbmcoY29kZVBvaW50KTtcbiAgICB2YXIgbXNnID0gXCIweFwiICsgaGV4ICsgXCIgaXMgbm90IGEgdmFsaWQgVVRGLTggb3IgVVRGLTE2IGNvZGVwb2ludC5cIjtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DTWFwLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGNyZWF0ZUNtYXAgfSBmcm9tIFwiLi9DTWFwXCI7XG5pbXBvcnQgeyBkZXJpdmVGb250RmxhZ3MgfSBmcm9tIFwiLi9Gb250RmxhZ3NcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IHsgYnlBc2NlbmRpbmdJZCwgQ2FjaGUsIHNvcnRlZFVuaXEsIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgsIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIEEgbm90ZSBvZiB0aGFua3MgdG8gdGhlIGRldmVsb3BlcnMgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0LCBhc1xuICogdGhpcyBjbGFzcyBib3Jyb3dzIGZyb206XG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZvbmdvdmV0dC9wZGZraXQvYmxvYi9lNzFlZGFiMGRkNDY1N2I1YTc2NzgwNGJhODZjOTRjNThkMDFmYmNhL2xpYi9pbWFnZS9qcGVnLmNvZmZlZVxuICovXG52YXIgQ3VzdG9tRm9udEVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEN1c3RvbUZvbnRFbWJlZGRlcihmb250LCBmb250RGF0YSwgY3VzdG9tTmFtZSwgZm9udEZlYXR1cmVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuYWxsR2x5cGhzSW5Gb250U29ydGVkQnlJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBnbHlwaHMgPSBuZXcgQXJyYXkoX3RoaXMuZm9udC5jaGFyYWN0ZXJTZXQubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZVBvaW50ID0gX3RoaXMuZm9udC5jaGFyYWN0ZXJTZXRbaWR4XTtcbiAgICAgICAgICAgICAgICBnbHlwaHNbaWR4XSA9IF90aGlzLmZvbnQuZ2x5cGhGb3JDb2RlUG9pbnQoY29kZVBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzb3J0ZWRVbmlxKGdseXBocy5zb3J0KGJ5QXNjZW5kaW5nSWQpLCBmdW5jdGlvbiAoZykgeyByZXR1cm4gZy5pZDsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgICAgIHRoaXMuc2NhbGUgPSAxMDAwIC8gdGhpcy5mb250LnVuaXRzUGVyRW07XG4gICAgICAgIHRoaXMuZm9udERhdGEgPSBmb250RGF0YTtcbiAgICAgICAgdGhpcy5mb250TmFtZSA9IHRoaXMuZm9udC5wb3N0c2NyaXB0TmFtZSB8fCAnRm9udCc7XG4gICAgICAgIHRoaXMuY3VzdG9tTmFtZSA9IGN1c3RvbU5hbWU7XG4gICAgICAgIHRoaXMuZm9udEZlYXR1cmVzID0gZm9udEZlYXR1cmVzO1xuICAgICAgICB0aGlzLmJhc2VGb250TmFtZSA9ICcnO1xuICAgICAgICB0aGlzLmdseXBoQ2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeSh0aGlzLmFsbEdseXBoc0luRm9udFNvcnRlZEJ5SWQpO1xuICAgIH1cbiAgICBDdXN0b21Gb250RW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKGZvbnRraXQsIGZvbnREYXRhLCBjdXN0b21OYW1lLCBmb250RmVhdHVyZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZvbnQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGZvbnRraXQuY3JlYXRlKGZvbnREYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IEN1c3RvbUZvbnRFbWJlZGRlcihmb250LCBmb250RGF0YSwgY3VzdG9tTmFtZSwgZm9udEZlYXR1cmVzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW5jb2RlIHRoZSBKYXZhU2NyaXB0IHN0cmluZyBpbnRvIHRoaXMgZm9udC4gKEphdmFTY3JpcHQgZW5jb2RlcyBzdHJpbmdzIGluXG4gICAgICogVW5pY29kZSwgYnV0IGVtYmVkZGVkIGZvbnRzIHVzZSB0aGVpciBvd24gY3VzdG9tIGVuY29kaW5ncylcbiAgICAgKi9cbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVuY29kZVRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5mb250LmxheW91dCh0ZXh0LCB0aGlzLmZvbnRGZWF0dXJlcykuZ2x5cGhzO1xuICAgICAgICB2YXIgaGV4Q29kZXMgPSBuZXcgQXJyYXkoZ2x5cGhzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGhleENvZGVzW2lkeF0gPSB0b0hleFN0cmluZ09mTWluTGVuZ3RoKGdseXBoc1tpZHhdLmlkLCA0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUERGSGV4U3RyaW5nLm9mKGhleENvZGVzLmpvaW4oJycpKTtcbiAgICB9O1xuICAgIC8vIFRoZSBhZHZhbmNlV2lkdGggdGFrZXMgaW50byBhY2NvdW50IGtlcm5pbmcgYXV0b21hdGljYWxseSwgc28gd2UgZG9uJ3RcbiAgICAvLyBoYXZlIHRvIGRvIHRoYXQgbWFudWFsbHkgbGlrZSB3ZSBkbyBmb3IgdGhlIHN0YW5kYXJkIGZvbnRzLlxuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUud2lkdGhPZlRleHRBdFNpemUgPSBmdW5jdGlvbiAodGV4dCwgc2l6ZSkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5mb250LmxheW91dCh0ZXh0LCB0aGlzLmZvbnRGZWF0dXJlcykuZ2x5cGhzO1xuICAgICAgICB2YXIgdG90YWxXaWR0aCA9IDA7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gZ2x5cGhzW2lkeF0uYWR2YW5jZVdpZHRoICogdGhpcy5zY2FsZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2NhbGUgPSBzaXplIC8gMTAwMDtcbiAgICAgICAgcmV0dXJuIHRvdGFsV2lkdGggKiBzY2FsZTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuaGVpZ2h0T2ZGb250QXRTaXplID0gZnVuY3Rpb24gKHNpemUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIF9hID0gb3B0aW9ucy5kZXNjZW5kZXIsIGRlc2NlbmRlciA9IF9hID09PSB2b2lkIDAgPyB0cnVlIDogX2E7XG4gICAgICAgIHZhciBfYiA9IHRoaXMuZm9udCwgYXNjZW50ID0gX2IuYXNjZW50LCBkZXNjZW50ID0gX2IuZGVzY2VudCwgYmJveCA9IF9iLmJib3g7XG4gICAgICAgIHZhciB5VG9wID0gKGFzY2VudCB8fCBiYm94Lm1heFkpICogdGhpcy5zY2FsZTtcbiAgICAgICAgdmFyIHlCb3R0b20gPSAoZGVzY2VudCB8fCBiYm94Lm1pblkpICogdGhpcy5zY2FsZTtcbiAgICAgICAgdmFyIGhlaWdodCA9IHlUb3AgLSB5Qm90dG9tO1xuICAgICAgICBpZiAoIWRlc2NlbmRlcilcbiAgICAgICAgICAgIGhlaWdodCAtPSBNYXRoLmFicyhkZXNjZW50KSB8fCAwO1xuICAgICAgICByZXR1cm4gKGhlaWdodCAvIDEwMDApICogc2l6ZTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuc2l6ZU9mRm9udEF0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmZvbnQsIGFzY2VudCA9IF9hLmFzY2VudCwgZGVzY2VudCA9IF9hLmRlc2NlbnQsIGJib3ggPSBfYS5iYm94O1xuICAgICAgICB2YXIgeVRvcCA9IChhc2NlbnQgfHwgYmJveC5tYXhZKSAqIHRoaXMuc2NhbGU7XG4gICAgICAgIHZhciB5Qm90dG9tID0gKGRlc2NlbnQgfHwgYmJveC5taW5ZKSAqIHRoaXMuc2NhbGU7XG4gICAgICAgIHJldHVybiAoMTAwMCAqIGhlaWdodCkgLyAoeVRvcCAtIHlCb3R0b20pO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICB0aGlzLmJhc2VGb250TmFtZSA9XG4gICAgICAgICAgICB0aGlzLmN1c3RvbU5hbWUgfHwgY29udGV4dC5hZGRSYW5kb21TdWZmaXgodGhpcy5mb250TmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkRm9udERpY3QoY29udGV4dCwgcmVmKTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRGb250RGljdCA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNpZEZvbnREaWN0UmVmLCB1bmljb2RlQ01hcFJlZiwgZm9udERpY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRDSURGb250RGljdChjb250ZXh0KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpZEZvbnREaWN0UmVmID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZUNNYXBSZWYgPSB0aGlzLmVtYmVkVW5pY29kZUNtYXAoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250RGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnRm9udCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogJ1R5cGUwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlRm9udDogdGhpcy5iYXNlRm9udE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2Rpbmc6ICdJZGVudGl0eS1IJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjZW5kYW50Rm9udHM6IFtjaWRGb250RGljdFJlZl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9Vbmljb2RlOiB1bmljb2RlQ01hcFJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYXNzaWduKHJlZiwgZm9udERpY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZWZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoZm9udERpY3QpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmlzQ0ZGID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb250LmNmZjtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRDSURGb250RGljdCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmb250RGVzY3JpcHRvclJlZiwgY2lkRm9udERpY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRGb250RGVzY3JpcHRvcihjb250ZXh0KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdG9yUmVmID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2lkRm9udERpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTogJ0ZvbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6IHRoaXMuaXNDRkYoKSA/ICdDSURGb250VHlwZTAnIDogJ0NJREZvbnRUeXBlMicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lEVG9HSURNYXA6ICdJZGVudGl0eScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUZvbnQ6IHRoaXMuYmFzZUZvbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJRFN5c3RlbUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0cnk6IFBERlN0cmluZy5vZignQWRvYmUnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJpbmc6IFBERlN0cmluZy5vZignSWRlbnRpdHknKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcGxlbWVudDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnREZXNjcmlwdG9yOiBmb250RGVzY3JpcHRvclJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXOiB0aGlzLmNvbXB1dGVXaWR0aHMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoY2lkRm9udERpY3QpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkRm9udERlc2NyaXB0b3IgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZm9udFN0cmVhbVJlZiwgc2NhbGUsIF9hLCBpdGFsaWNBbmdsZSwgYXNjZW50LCBkZXNjZW50LCBjYXBIZWlnaHQsIHhIZWlnaHQsIF9iLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCBmb250RGVzY3JpcHRvcjtcbiAgICAgICAgICAgIHZhciBfYztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEZvbnRTdHJlYW0oY29udGV4dCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U3RyZWFtUmVmID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzLmZvbnQsIGl0YWxpY0FuZ2xlID0gX2EuaXRhbGljQW5nbGUsIGFzY2VudCA9IF9hLmFzY2VudCwgZGVzY2VudCA9IF9hLmRlc2NlbnQsIGNhcEhlaWdodCA9IF9hLmNhcEhlaWdodCwgeEhlaWdodCA9IF9hLnhIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IHRoaXMuZm9udC5iYm94LCBtaW5YID0gX2IubWluWCwgbWluWSA9IF9iLm1pblksIG1heFggPSBfYi5tYXhYLCBtYXhZID0gX2IubWF4WTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdG9yID0gY29udGV4dC5vYmooKF9jID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnRm9udERlc2NyaXB0b3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb250TmFtZTogdGhpcy5iYXNlRm9udE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOiBkZXJpdmVGb250RmxhZ3ModGhpcy5mb250KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9udEJCb3g6IFttaW5YICogc2NhbGUsIG1pblkgKiBzY2FsZSwgbWF4WCAqIHNjYWxlLCBtYXhZICogc2NhbGVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGFsaWNBbmdsZTogaXRhbGljQW5nbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY2VudDogYXNjZW50ICogc2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NlbnQ6IGRlc2NlbnQgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwSGVpZ2h0OiAoY2FwSGVpZ2h0IHx8IGFzY2VudCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEhlaWdodDogKHhIZWlnaHQgfHwgMCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN1cmUgaG93IHRvIGNvbXB1dGUvZmluZCB0aGlzLCBub3IgaXMgYW55Ym9keSBlbHNlIHJlYWxseTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU0ODUxNzkvc3RlbXYtdmFsdWUtb2YtdGhlLXRydWV0eXBlLWZvbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RlbVY6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jW3RoaXMuaXNDRkYoKSA/ICdGb250RmlsZTMnIDogJ0ZvbnRGaWxlMiddID0gZm9udFN0cmVhbVJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoZm9udERlc2NyaXB0b3IpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLnNlcmlhbGl6ZUZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5mb250RGF0YV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkRm9udFN0cmVhbSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmb250U3RyZWFtLCBfYSwgX2I7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IChfYSA9IGNvbnRleHQpLmZsYXRlU3RyZWFtO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZXJpYWxpemVGb250KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U3RyZWFtID0gX2IuYXBwbHkoX2EsIFtfYy5zZW50KCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogdGhpcy5pc0NGRigpID8gJ0NJREZvbnRUeXBlMEMnIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKGZvbnRTdHJlYW0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkVW5pY29kZUNtYXAgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgY21hcCA9IGNyZWF0ZUNtYXAodGhpcy5nbHlwaENhY2hlLmFjY2VzcygpLCB0aGlzLmdseXBoSWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHZhciBjbWFwU3RyZWFtID0gY29udGV4dC5mbGF0ZVN0cmVhbShjbWFwKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVnaXN0ZXIoY21hcFN0cmVhbSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmdseXBoSWQgPSBmdW5jdGlvbiAoZ2x5cGgpIHtcbiAgICAgICAgcmV0dXJuIGdseXBoID8gZ2x5cGguaWQgOiAtMTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuY29tcHV0ZVdpZHRocyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdseXBocyA9IHRoaXMuZ2x5cGhDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIHdpZHRocyA9IFtdO1xuICAgICAgICB2YXIgY3VyclNlY3Rpb24gPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGN1cnJHbHlwaCA9IGdseXBoc1tpZHhdO1xuICAgICAgICAgICAgdmFyIHByZXZHbHlwaCA9IGdseXBoc1tpZHggLSAxXTtcbiAgICAgICAgICAgIHZhciBjdXJyR2x5cGhJZCA9IHRoaXMuZ2x5cGhJZChjdXJyR2x5cGgpO1xuICAgICAgICAgICAgdmFyIHByZXZHbHlwaElkID0gdGhpcy5nbHlwaElkKHByZXZHbHlwaCk7XG4gICAgICAgICAgICBpZiAoaWR4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgd2lkdGhzLnB1c2goY3VyckdseXBoSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VyckdseXBoSWQgLSBwcmV2R2x5cGhJZCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHdpZHRocy5wdXNoKGN1cnJTZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB3aWR0aHMucHVzaChjdXJyR2x5cGhJZCk7XG4gICAgICAgICAgICAgICAgY3VyclNlY3Rpb24gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJTZWN0aW9uLnB1c2goY3VyckdseXBoLmFkdmFuY2VXaWR0aCAqIHRoaXMuc2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIHdpZHRocy5wdXNoKGN1cnJTZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHdpZHRocztcbiAgICB9O1xuICAgIHJldHVybiBDdXN0b21Gb250RW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQ3VzdG9tRm9udEVtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3VzdG9tRm9udEVtYmVkZGVyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IEN1c3RvbUZvbnRFbWJlZGRlciBmcm9tIFwiLi9DdXN0b21Gb250RW1iZWRkZXJcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgeyBDYWNoZSwgbWVyZ2VVaW50OEFycmF5cywgdG9IZXhTdHJpbmdPZk1pbkxlbmd0aCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBBIG5vdGUgb2YgdGhhbmtzIHRvIHRoZSBkZXZlbG9wZXJzIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdCwgYXNcbiAqIHRoaXMgY2xhc3MgYm9ycm93cyBmcm9tOlxuICogICBodHRwczovL2dpdGh1Yi5jb20vZGV2b25nb3ZldHQvcGRma2l0L2Jsb2IvZTcxZWRhYjBkZDQ2NTdiNWE3Njc4MDRiYTg2Yzk0YzU4ZDAxZmJjYS9saWIvaW1hZ2UvanBlZy5jb2ZmZWVcbiAqL1xudmFyIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlcihmb250LCBmb250RGF0YSwgY3VzdG9tRm9udE5hbWUsIGZvbnRGZWF0dXJlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBmb250LCBmb250RGF0YSwgY3VzdG9tRm9udE5hbWUsIGZvbnRGZWF0dXJlcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3Vic2V0ID0gX3RoaXMuZm9udC5jcmVhdGVTdWJzZXQoKTtcbiAgICAgICAgX3RoaXMuZ2x5cGhzID0gW107XG4gICAgICAgIF90aGlzLmdseXBoQ2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeShmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5nbHlwaHM7IH0pO1xuICAgICAgICBfdGhpcy5nbHlwaElkTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoZm9udGtpdCwgZm9udERhdGEsIGN1c3RvbUZvbnROYW1lLCBmb250RmVhdHVyZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZvbnQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGZvbnRraXQuY3JlYXRlKGZvbnREYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlcihmb250LCBmb250RGF0YSwgY3VzdG9tRm9udE5hbWUsIGZvbnRGZWF0dXJlcyldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5wcm90b3R5cGUuZW5jb2RlVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHZhciBnbHlwaHMgPSB0aGlzLmZvbnQubGF5b3V0KHRleHQsIHRoaXMuZm9udEZlYXR1cmVzKS5nbHlwaHM7XG4gICAgICAgIHZhciBoZXhDb2RlcyA9IG5ldyBBcnJheShnbHlwaHMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3Vic2V0R2x5cGhJZCA9IHRoaXMuc3Vic2V0LmluY2x1ZGVHbHlwaChnbHlwaCk7XG4gICAgICAgICAgICB0aGlzLmdseXBoc1tzdWJzZXRHbHlwaElkIC0gMV0gPSBnbHlwaDtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhJZE1hcC5zZXQoZ2x5cGguaWQsIHN1YnNldEdseXBoSWQpO1xuICAgICAgICAgICAgaGV4Q29kZXNbaWR4XSA9IHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgoc3Vic2V0R2x5cGhJZCwgNCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nbHlwaENhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgcmV0dXJuIFBERkhleFN0cmluZy5vZihoZXhDb2Rlcy5qb2luKCcnKSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIucHJvdG90eXBlLmlzQ0ZGID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzZXQuY2ZmO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLnByb3RvdHlwZS5nbHlwaElkID0gZnVuY3Rpb24gKGdseXBoKSB7XG4gICAgICAgIHJldHVybiBnbHlwaCA/IHRoaXMuZ2x5cGhJZE1hcC5nZXQoZ2x5cGguaWQpIDogLTE7XG4gICAgfTtcbiAgICBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIucHJvdG90eXBlLnNlcmlhbGl6ZUZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcGFydHMgPSBbXTtcbiAgICAgICAgICAgIF90aGlzLnN1YnNldFxuICAgICAgICAgICAgICAgIC5lbmNvZGVTdHJlYW0oKVxuICAgICAgICAgICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uIChieXRlcykgeyByZXR1cm4gcGFydHMucHVzaChieXRlcyk7IH0pXG4gICAgICAgICAgICAgICAgLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiByZXNvbHZlKG1lcmdlVWludDhBcnJheXMocGFydHMpKTsgfSlcbiAgICAgICAgICAgICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikgeyByZXR1cm4gcmVqZWN0KGVycik7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXI7XG59KEN1c3RvbUZvbnRFbWJlZGRlcikpO1xuZXhwb3J0IGRlZmF1bHQgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuLyoqXG4gKiBGcm9tIHRoZSBQREYtQTMgc3BlY2lmaWNhdGlvbiwgc2VjdGlvbiAqKjMuMS4gUmVxdWlyZW1lbnRzIC0gR2VuZXJhbCoqLlxuICogU2VlOlxuICogKiBodHRwczovL3d3dy5wZGZhLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAxOC8xMC9QREYyMF9BTjAwMi1BRi5wZGZcbiAqL1xuZXhwb3J0IHZhciBBRlJlbGF0aW9uc2hpcDtcbihmdW5jdGlvbiAoQUZSZWxhdGlvbnNoaXApIHtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIlNvdXJjZVwiXSA9IFwiU291cmNlXCI7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJEYXRhXCJdID0gXCJEYXRhXCI7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJBbHRlcm5hdGl2ZVwiXSA9IFwiQWx0ZXJuYXRpdmVcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIlN1cHBsZW1lbnRcIl0gPSBcIlN1cHBsZW1lbnRcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIkVuY3J5cHRlZFBheWxvYWRcIl0gPSBcIkVuY3J5cHRlZFBheWxvYWRcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIkZvcm1EYXRhXCJdID0gXCJFbmNyeXB0ZWRQYXlsb2FkXCI7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJTY2hlbWFcIl0gPSBcIlNjaGVtYVwiO1xuICAgIEFGUmVsYXRpb25zaGlwW1wiVW5zcGVjaWZpZWRcIl0gPSBcIlVuc3BlY2lmaWVkXCI7XG59KShBRlJlbGF0aW9uc2hpcCB8fCAoQUZSZWxhdGlvbnNoaXAgPSB7fSkpO1xudmFyIEZpbGVFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGaWxlRW1iZWRkZXIoZmlsZURhdGEsIGZpbGVOYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHRoaXMuZmlsZURhdGEgPSBmaWxlRGF0YTtcbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICBGaWxlRW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKGJ5dGVzLCBmaWxlTmFtZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gbmV3IEZpbGVFbWJlZGRlcihieXRlcywgZmlsZU5hbWUsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgRmlsZUVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIG1pbWVUeXBlLCBkZXNjcmlwdGlvbiwgY3JlYXRpb25EYXRlLCBtb2RpZmljYXRpb25EYXRlLCBhZlJlbGF0aW9uc2hpcCwgZW1iZWRkZWRGaWxlU3RyZWFtLCBlbWJlZGRlZEZpbGVTdHJlYW1SZWYsIGZpbGVTcGVjRGljdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBfYSA9IHRoaXMub3B0aW9ucywgbWltZVR5cGUgPSBfYS5taW1lVHlwZSwgZGVzY3JpcHRpb24gPSBfYS5kZXNjcmlwdGlvbiwgY3JlYXRpb25EYXRlID0gX2EuY3JlYXRpb25EYXRlLCBtb2RpZmljYXRpb25EYXRlID0gX2EubW9kaWZpY2F0aW9uRGF0ZSwgYWZSZWxhdGlvbnNoaXAgPSBfYS5hZlJlbGF0aW9uc2hpcDtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZEZpbGVTdHJlYW0gPSBjb250ZXh0LmZsYXRlU3RyZWFtKHRoaXMuZmlsZURhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgVHlwZTogJ0VtYmVkZGVkRmlsZScsXG4gICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6IG1pbWVUeXBlICE9PSBudWxsICYmIG1pbWVUeXBlICE9PSB2b2lkIDAgPyBtaW1lVHlwZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgUGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBTaXplOiB0aGlzLmZpbGVEYXRhLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0aW9uRGF0ZTogY3JlYXRpb25EYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQREZTdHJpbmcuZnJvbURhdGUoY3JlYXRpb25EYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgTW9kRGF0ZTogbW9kaWZpY2F0aW9uRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUERGU3RyaW5nLmZyb21EYXRlKG1vZGlmaWNhdGlvbkRhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWRGaWxlU3RyZWFtUmVmID0gY29udGV4dC5yZWdpc3RlcihlbWJlZGRlZEZpbGVTdHJlYW0pO1xuICAgICAgICAgICAgICAgIGZpbGVTcGVjRGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgICAgICAgICAgVHlwZTogJ0ZpbGVzcGVjJyxcbiAgICAgICAgICAgICAgICAgICAgRjogUERGU3RyaW5nLm9mKHRoaXMuZmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBVRjogUERGSGV4U3RyaW5nLmZyb21UZXh0KHRoaXMuZmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBFRjogeyBGOiBlbWJlZGRlZEZpbGVTdHJlYW1SZWYgfSxcbiAgICAgICAgICAgICAgICAgICAgRGVzYzogZGVzY3JpcHRpb24gPyBQREZIZXhTdHJpbmcuZnJvbVRleHQoZGVzY3JpcHRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBBRlJlbGF0aW9uc2hpcDogYWZSZWxhdGlvbnNoaXAgIT09IG51bGwgJiYgYWZSZWxhdGlvbnNoaXAgIT09IHZvaWQgMCA/IGFmUmVsYXRpb25zaGlwIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCBmaWxlU3BlY0RpY3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKGZpbGVTcGVjRGljdCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gRmlsZUVtYmVkZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEZpbGVFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGVFbWJlZGRlci5qcy5tYXAiLCIvLyBwcmV0dGllci1pZ25vcmVcbnZhciBtYWtlRm9udEZsYWdzID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgZmxhZ3MgPSAwO1xuICAgIHZhciBmbGlwQml0ID0gZnVuY3Rpb24gKGJpdCkgeyBmbGFncyB8PSAoMSA8PCAoYml0IC0gMSkpOyB9O1xuICAgIGlmIChvcHRpb25zLmZpeGVkUGl0Y2gpXG4gICAgICAgIGZsaXBCaXQoMSk7XG4gICAgaWYgKG9wdGlvbnMuc2VyaWYpXG4gICAgICAgIGZsaXBCaXQoMik7XG4gICAgaWYgKG9wdGlvbnMuc3ltYm9saWMpXG4gICAgICAgIGZsaXBCaXQoMyk7XG4gICAgaWYgKG9wdGlvbnMuc2NyaXB0KVxuICAgICAgICBmbGlwQml0KDQpO1xuICAgIGlmIChvcHRpb25zLm5vbnN5bWJvbGljKVxuICAgICAgICBmbGlwQml0KDYpO1xuICAgIGlmIChvcHRpb25zLml0YWxpYylcbiAgICAgICAgZmxpcEJpdCg3KTtcbiAgICBpZiAob3B0aW9ucy5hbGxDYXApXG4gICAgICAgIGZsaXBCaXQoMTcpO1xuICAgIGlmIChvcHRpb25zLnNtYWxsQ2FwKVxuICAgICAgICBmbGlwQml0KDE4KTtcbiAgICBpZiAob3B0aW9ucy5mb3JjZUJvbGQpXG4gICAgICAgIGZsaXBCaXQoMTkpO1xuICAgIHJldHVybiBmbGFncztcbn07XG4vLyBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQvYmxvYi84M2Y1ZjcyNDMxNzJhMDE3YWRjZjZhN2ZhYTU1NDdjNTU5ODJjNTdiL2xpYi9mb250L2VtYmVkZGVkLmpzI0wxMjMtTDEyOVxuZXhwb3J0IHZhciBkZXJpdmVGb250RmxhZ3MgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgIHZhciBmYW1pbHlDbGFzcyA9IGZvbnRbJ09TLzInXSA/IGZvbnRbJ09TLzInXS5zRmFtaWx5Q2xhc3MgOiAwO1xuICAgIHZhciBmbGFncyA9IG1ha2VGb250RmxhZ3Moe1xuICAgICAgICBmaXhlZFBpdGNoOiBmb250LnBvc3QuaXNGaXhlZFBpdGNoLFxuICAgICAgICBzZXJpZjogMSA8PSBmYW1pbHlDbGFzcyAmJiBmYW1pbHlDbGFzcyA8PSA3LFxuICAgICAgICBzeW1ib2xpYzogdHJ1ZSxcbiAgICAgICAgc2NyaXB0OiBmYW1pbHlDbGFzcyA9PT0gMTAsXG4gICAgICAgIGl0YWxpYzogZm9udC5oZWFkLm1hY1N0eWxlLml0YWxpYyxcbiAgICB9KTtcbiAgICByZXR1cm4gZmxhZ3M7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rm9udEZsYWdzLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG52YXIgSmF2YVNjcmlwdEVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEphdmFTY3JpcHRFbWJlZGRlcihzY3JpcHQsIHNjcmlwdE5hbWUpIHtcbiAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7XG4gICAgICAgIHRoaXMuc2NyaXB0TmFtZSA9IHNjcmlwdE5hbWU7XG4gICAgfVxuICAgIEphdmFTY3JpcHRFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoc2NyaXB0LCBzY3JpcHROYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdEVtYmVkZGVyKHNjcmlwdCwgc2NyaXB0TmFtZSk7XG4gICAgfTtcbiAgICBKYXZhU2NyaXB0RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBqc0FjdGlvbkRpY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAganNBY3Rpb25EaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnQWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgUzogJ0phdmFTY3JpcHQnLFxuICAgICAgICAgICAgICAgICAgICBKUzogUERGSGV4U3RyaW5nLmZyb21UZXh0KHRoaXMuc2NyaXB0KSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYXNzaWduKHJlZiwganNBY3Rpb25EaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcihqc0FjdGlvbkRpY3QpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEphdmFTY3JpcHRFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBKYXZhU2NyaXB0RW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1KYXZhU2NyaXB0RW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgTUFSS0VSUyA9IFtcbiAgICAweGZmYzAsIDB4ZmZjMSwgMHhmZmMyLFxuICAgIDB4ZmZjMywgMHhmZmM1LCAweGZmYzYsXG4gICAgMHhmZmM3LCAweGZmYzgsIDB4ZmZjOSxcbiAgICAweGZmY2EsIDB4ZmZjYiwgMHhmZmNjLFxuICAgIDB4ZmZjZCwgMHhmZmNlLCAweGZmY2YsXG5dO1xudmFyIENvbG9yU3BhY2U7XG4oZnVuY3Rpb24gKENvbG9yU3BhY2UpIHtcbiAgICBDb2xvclNwYWNlW1wiRGV2aWNlR3JheVwiXSA9IFwiRGV2aWNlR3JheVwiO1xuICAgIENvbG9yU3BhY2VbXCJEZXZpY2VSR0JcIl0gPSBcIkRldmljZVJHQlwiO1xuICAgIENvbG9yU3BhY2VbXCJEZXZpY2VDTVlLXCJdID0gXCJEZXZpY2VDTVlLXCI7XG59KShDb2xvclNwYWNlIHx8IChDb2xvclNwYWNlID0ge30pKTtcbnZhciBDaGFubmVsVG9Db2xvclNwYWNlID0ge1xuICAgIDE6IENvbG9yU3BhY2UuRGV2aWNlR3JheSxcbiAgICAzOiBDb2xvclNwYWNlLkRldmljZVJHQixcbiAgICA0OiBDb2xvclNwYWNlLkRldmljZUNNWUssXG59O1xuLyoqXG4gKiBBIG5vdGUgb2YgdGhhbmtzIHRvIHRoZSBkZXZlbG9wZXJzIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdCwgYXNcbiAqIHRoaXMgY2xhc3MgYm9ycm93cyBmcm9tOlxuICogICBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQvYmxvYi9hNmFmNzY0NjdjZTA2YmQ2YTJhZjRhYTcyNzFjY2FjOWZmMTUyYTdkL2xpYi9pbWFnZS9qcGVnLmpzXG4gKi9cbnZhciBKcGVnRW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSnBlZ0VtYmVkZGVyKGltYWdlRGF0YSwgYml0c1BlckNvbXBvbmVudCwgd2lkdGgsIGhlaWdodCwgY29sb3JTcGFjZSkge1xuICAgICAgICB0aGlzLmltYWdlRGF0YSA9IGltYWdlRGF0YTtcbiAgICAgICAgdGhpcy5iaXRzUGVyQ29tcG9uZW50ID0gYml0c1BlckNvbXBvbmVudDtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy5jb2xvclNwYWNlID0gY29sb3JTcGFjZTtcbiAgICB9XG4gICAgSnBlZ0VtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChpbWFnZURhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRhdGFWaWV3LCBzb2ksIHBvcywgbWFya2VyLCBiaXRzUGVyQ29tcG9uZW50LCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsQnl0ZSwgY2hhbm5lbE5hbWUsIGNvbG9yU3BhY2U7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoaW1hZ2VEYXRhLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgc29pID0gZGF0YVZpZXcuZ2V0VWludDE2KDApO1xuICAgICAgICAgICAgICAgIGlmIChzb2kgIT09IDB4ZmZkOClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTT0kgbm90IGZvdW5kIGluIEpQRUcnKTtcbiAgICAgICAgICAgICAgICBwb3MgPSAyO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBkYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGRhdGFWaWV3LmdldFVpbnQxNihwb3MpO1xuICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1BUktFUlMuaW5jbHVkZXMobWFya2VyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBwb3MgKz0gZGF0YVZpZXcuZ2V0VWludDE2KHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghTUFSS0VSUy5pbmNsdWRlcyhtYXJrZXIpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSlBFRycpO1xuICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICAgICAgICAgIGJpdHNQZXJDb21wb25lbnQgPSBkYXRhVmlldy5nZXRVaW50OChwb3MrKyk7XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gZGF0YVZpZXcuZ2V0VWludDE2KHBvcyk7XG4gICAgICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgICAgICAgICAgd2lkdGggPSBkYXRhVmlldy5nZXRVaW50MTYocG9zKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgICAgICAgICBjaGFubmVsQnl0ZSA9IGRhdGFWaWV3LmdldFVpbnQ4KHBvcysrKTtcbiAgICAgICAgICAgICAgICBjaGFubmVsTmFtZSA9IENoYW5uZWxUb0NvbG9yU3BhY2VbY2hhbm5lbEJ5dGVdO1xuICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbE5hbWUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBKUEVHIGNoYW5uZWwuJyk7XG4gICAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IGNoYW5uZWxOYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgSnBlZ0VtYmVkZGVyKGltYWdlRGF0YSwgYml0c1BlckNvbXBvbmVudCwgd2lkdGgsIGhlaWdodCwgY29sb3JTcGFjZSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgSnBlZ0VtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgeE9iamVjdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB4T2JqZWN0ID0gY29udGV4dC5zdHJlYW0odGhpcy5pbWFnZURhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgVHlwZTogJ1hPYmplY3QnLFxuICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlOiAnSW1hZ2UnLFxuICAgICAgICAgICAgICAgICAgICBCaXRzUGVyQ29tcG9uZW50OiB0aGlzLmJpdHNQZXJDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIFdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBIZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlOiB0aGlzLmNvbG9yU3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIEZpbHRlcjogJ0RDVERlY29kZScsXG4gICAgICAgICAgICAgICAgICAgIC8vIENNWUsgSlBFRyBzdHJlYW1zIGluIFBERiBhcmUgdHlwaWNhbGx5IHN0b3JlZCBjb21wbGVtZW50ZWQsXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGggMSBhcyAnb2ZmJyBhbmQgMCBhcyAnb24nIChQREYgMzIwMDAtMToyMDA4LCA4LjYuNC40KS5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gU3RhbmRhbG9uZSBDTVlLIEpQRUcgKHVzdWFsbHkgZXhwb3J0ZWQgYnkgUGhvdG9zaG9wKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmVkIGludmVyc2UsIHdpdGggMCBhcyAnb2ZmJyBhbmQgMSBhcyAnb24nLCBsaWtlIFJHQi5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHlpbmcgYSBzd2FwIGhlcmUgYXMgYSBoZWRnZSB0aGF0IG1vc3QgYnl0ZXMgcGFzc2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRoaXMgbWV0aG9kIHdpbGwgYmVuZWZpdCBmcm9tIGl0LlxuICAgICAgICAgICAgICAgICAgICBEZWNvZGU6IHRoaXMuY29sb3JTcGFjZSA9PT0gQ29sb3JTcGFjZS5EZXZpY2VDTVlLXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFsxLCAwLCAxLCAwLCAxLCAwLCAxLCAwXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmFzc2lnbihyZWYsIHhPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKHhPYmplY3QpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEpwZWdFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBKcGVnRW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1KcGVnRW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yLCBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZSYXdTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGUmF3U3RyZWFtXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmVhbVwiO1xuaW1wb3J0IHsgZGVjb2RlUERGUmF3U3RyZWFtIH0gZnJvbSBcIi4uL3N0cmVhbXMvZGVjb2RlXCI7XG5pbXBvcnQgUERGQ29udGVudFN0cmVhbSBmcm9tIFwiLi4vc3RydWN0dXJlcy9QREZDb250ZW50U3RyZWFtXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBtZXJnZUludG9UeXBlZEFycmF5IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgZnVsbFBhZ2VCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgdmFyIG1lZGlhQm94ID0gcGFnZS5NZWRpYUJveCgpO1xuICAgIHZhciB3aWR0aCA9IG1lZGlhQm94Lmxvb2t1cCgyLCBQREZOdW1iZXIpLmFzTnVtYmVyKCkgLVxuICAgICAgICBtZWRpYUJveC5sb29rdXAoMCwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgIHZhciBoZWlnaHQgPSBtZWRpYUJveC5sb29rdXAoMywgUERGTnVtYmVyKS5hc051bWJlcigpIC1cbiAgICAgICAgbWVkaWFCb3gubG9va3VwKDEsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICByZXR1cm4geyBsZWZ0OiAwLCBib3R0b206IDAsIHJpZ2h0OiB3aWR0aCwgdG9wOiBoZWlnaHQgfTtcbn07XG4vLyBSZXR1cm5zIHRoZSBpZGVudGl0eSBtYXRyaXgsIG1vZGlmaWVkIHRvIHBvc2l0aW9uIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlblxuLy8gYm91bmRpbmcgYm94IGF0ICgwLCAwKS5cbnZhciBib3VuZGluZ0JveEFkanVzdGVkTWF0cml4ID0gZnVuY3Rpb24gKGJiKSB7IHJldHVybiBbMSwgMCwgMCwgMSwgLWJiLmxlZnQsIC1iYi5ib3R0b21dOyB9O1xudmFyIFBERlBhZ2VFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZQYWdlRW1iZWRkZXIocGFnZSwgYm91bmRpbmdCb3gsIHRyYW5zZm9ybWF0aW9uTWF0cml4KSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgICAgIHZhciBiYiA9IGJvdW5kaW5nQm94ICE9PSBudWxsICYmIGJvdW5kaW5nQm94ICE9PSB2b2lkIDAgPyBib3VuZGluZ0JveCA6IGZ1bGxQYWdlQm91bmRpbmdCb3gocGFnZSk7XG4gICAgICAgIHRoaXMud2lkdGggPSBiYi5yaWdodCAtIGJiLmxlZnQ7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gYmIudG9wIC0gYmIuYm90dG9tO1xuICAgICAgICB0aGlzLmJvdW5kaW5nQm94ID0gYmI7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtYXRpb25NYXRyaXggPSB0cmFuc2Zvcm1hdGlvbk1hdHJpeCAhPT0gbnVsbCAmJiB0cmFuc2Zvcm1hdGlvbk1hdHJpeCAhPT0gdm9pZCAwID8gdHJhbnNmb3JtYXRpb25NYXRyaXggOiBib3VuZGluZ0JveEFkanVzdGVkTWF0cml4KGJiKTtcbiAgICB9XG4gICAgUERGUGFnZUVtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChwYWdlLCBib3VuZGluZ0JveCwgdHJhbnNmb3JtYXRpb25NYXRyaXgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUERGUGFnZUVtYmVkZGVyKHBhZ2UsIGJvdW5kaW5nQm94LCB0cmFuc2Zvcm1hdGlvbk1hdHJpeCldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGUGFnZUVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIENvbnRlbnRzLCBSZXNvdXJjZXMsIGRlY29kZWRDb250ZW50cywgX2IsIGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCwgeE9iamVjdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBfYSA9IHRoaXMucGFnZS5ub3JtYWxpemVkRW50cmllcygpLCBDb250ZW50cyA9IF9hLkNvbnRlbnRzLCBSZXNvdXJjZXMgPSBfYS5SZXNvdXJjZXM7XG4gICAgICAgICAgICAgICAgaWYgKCFDb250ZW50cylcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQYWdlQ29udGVudHNFbWJlZGRpbmdFcnJvcigpO1xuICAgICAgICAgICAgICAgIGRlY29kZWRDb250ZW50cyA9IHRoaXMuZGVjb2RlQ29udGVudHMoQ29udGVudHMpO1xuICAgICAgICAgICAgICAgIF9iID0gdGhpcy5ib3VuZGluZ0JveCwgbGVmdCA9IF9iLmxlZnQsIGJvdHRvbSA9IF9iLmJvdHRvbSwgcmlnaHQgPSBfYi5yaWdodCwgdG9wID0gX2IudG9wO1xuICAgICAgICAgICAgICAgIHhPYmplY3QgPSBjb250ZXh0LmZsYXRlU3RyZWFtKGRlY29kZWRDb250ZW50cywge1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnWE9iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6ICdGb3JtJyxcbiAgICAgICAgICAgICAgICAgICAgRm9ybVR5cGU6IDEsXG4gICAgICAgICAgICAgICAgICAgIEJCb3g6IFtsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3BdLFxuICAgICAgICAgICAgICAgICAgICBNYXRyaXg6IHRoaXMudHJhbnNmb3JtYXRpb25NYXRyaXgsXG4gICAgICAgICAgICAgICAgICAgIFJlc291cmNlczogUmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCB4T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcih4T2JqZWN0KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIGBjb250ZW50c2AgaXMgYW4gYXJyYXkgb2Ygc3RyZWFtcyB3aGljaCBhcmUgbWVyZ2VkIHRvIGluY2x1ZGUgdGhlbSBpbiB0aGUgWE9iamVjdC5cbiAgICAvLyBUaGlzIG1ldGhvZHMgZXh0cmFjdHMgZWFjaCBzdHJlYW0gYW5kIGpvaW5zIHRoZW0gd2l0aCBhIG5ld2xpbmUgY2hhcmFjdGVyLlxuICAgIFBERlBhZ2VFbWJlZGRlci5wcm90b3R5cGUuZGVjb2RlQ29udGVudHMgPSBmdW5jdGlvbiAoY29udGVudHMpIHtcbiAgICAgICAgdmFyIG5ld2xpbmUgPSBVaW50OEFycmF5Lm9mKENoYXJDb2Rlcy5OZXdsaW5lKTtcbiAgICAgICAgdmFyIGRlY29kZWRDb250ZW50cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBjb250ZW50cy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBzdHJlYW0gPSBjb250ZW50cy5sb29rdXAoaWR4LCBQREZTdHJlYW0pO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgUERGUmF3U3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGRlY29kZVBERlJhd1N0cmVhbShzdHJlYW0pLmRlY29kZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtIGluc3RhbmNlb2YgUERGQ29udGVudFN0cmVhbSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzdHJlYW0uZ2V0VW5lbmNvZGVkQ29udGVudHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3Ioc3RyZWFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlY29kZWRDb250ZW50cy5wdXNoKGNvbnRlbnQsIG5ld2xpbmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXJnZUludG9UeXBlZEFycmF5LmFwcGx5KHZvaWQgMCwgZGVjb2RlZENvbnRlbnRzKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZQYWdlRW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUGFnZUVtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUGFnZUVtYmVkZGVyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFBORyB9IGZyb20gXCIuLi8uLi91dGlscy9wbmdcIjtcbi8qKlxuICogQSBub3RlIG9mIHRoYW5rcyB0byB0aGUgZGV2ZWxvcGVycyBvZiBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQsIGFzXG4gKiB0aGlzIGNsYXNzIGJvcnJvd3MgZnJvbTpcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL2Rldm9uZ292ZXR0L3BkZmtpdC9ibG9iL2U3MWVkYWIwZGQ0NjU3YjVhNzY3ODA0YmE4NmM5NGM1OGQwMWZiY2EvbGliL2ltYWdlL3BuZy5jb2ZmZWVcbiAqL1xudmFyIFBuZ0VtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBuZ0VtYmVkZGVyKHBuZykge1xuICAgICAgICB0aGlzLmltYWdlID0gcG5nO1xuICAgICAgICB0aGlzLmJpdHNQZXJDb21wb25lbnQgPSBwbmcuYml0c1BlckNvbXBvbmVudDtcbiAgICAgICAgdGhpcy53aWR0aCA9IHBuZy53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBwbmcuaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbG9yU3BhY2UgPSAnRGV2aWNlUkdCJztcbiAgICB9XG4gICAgUG5nRW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKGltYWdlRGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcG5nO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHBuZyA9IFBORy5sb2FkKGltYWdlRGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQbmdFbWJlZGRlcihwbmcpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBuZ0VtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgU01hc2ssIHhPYmplY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgU01hc2sgPSB0aGlzLmVtYmVkQWxwaGFDaGFubmVsKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHhPYmplY3QgPSBjb250ZXh0LmZsYXRlU3RyZWFtKHRoaXMuaW1hZ2UucmdiQ2hhbm5lbCwge1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnWE9iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6ICdJbWFnZScsXG4gICAgICAgICAgICAgICAgICAgIEJpdHNQZXJDb21wb25lbnQ6IHRoaXMuaW1hZ2UuYml0c1BlckNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgV2lkdGg6IHRoaXMuaW1hZ2Uud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIEhlaWdodDogdGhpcy5pbWFnZS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2U6IHRoaXMuY29sb3JTcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgU01hc2s6IFNNYXNrLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCB4T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcih4T2JqZWN0KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBuZ0VtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEFscGhhQ2hhbm5lbCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy5pbWFnZS5hbHBoYUNoYW5uZWwpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgeE9iamVjdCA9IGNvbnRleHQuZmxhdGVTdHJlYW0odGhpcy5pbWFnZS5hbHBoYUNoYW5uZWwsIHtcbiAgICAgICAgICAgIFR5cGU6ICdYT2JqZWN0JyxcbiAgICAgICAgICAgIFN1YnR5cGU6ICdJbWFnZScsXG4gICAgICAgICAgICBIZWlnaHQ6IHRoaXMuaW1hZ2UuaGVpZ2h0LFxuICAgICAgICAgICAgV2lkdGg6IHRoaXMuaW1hZ2Uud2lkdGgsXG4gICAgICAgICAgICBCaXRzUGVyQ29tcG9uZW50OiB0aGlzLmltYWdlLmJpdHNQZXJDb21wb25lbnQsXG4gICAgICAgICAgICBDb2xvclNwYWNlOiAnRGV2aWNlR3JheScsXG4gICAgICAgICAgICBEZWNvZGU6IFswLCAxXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0LnJlZ2lzdGVyKHhPYmplY3QpO1xuICAgIH07XG4gICAgcmV0dXJuIFBuZ0VtYmVkZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBuZ0VtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UG5nRW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgRW5jb2RpbmdzLCBGb250LCBGb250TmFtZXMsIH0gZnJvbSAnQHBkZi1saWIvc3RhbmRhcmQtZm9udHMnO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCB7IHRvQ29kZVBvaW50LCB0b0hleFN0cmluZyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBBIG5vdGUgb2YgdGhhbmtzIHRvIHRoZSBkZXZlbG9wZXJzIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdCwgYXNcbiAqIHRoaXMgY2xhc3MgYm9ycm93cyBmcm9tOlxuICogICBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQvYmxvYi9mOTFiZGQ2MWMxNjRhNzJlYTA2YmUxYTQzZGMwYTQxMmFmYzM5MjVmL2xpYi9mb250L2FmbS5jb2ZmZWVcbiAqL1xudmFyIFN0YW5kYXJkRm9udEVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN0YW5kYXJkRm9udEVtYmVkZGVyKGZvbnROYW1lLCBjdXN0b21OYW1lKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0aGlzLmVuY29kaW5nID0gKGZvbnROYW1lID09PSBGb250TmFtZXMuWmFwZkRpbmdiYXRzID8gRW5jb2RpbmdzLlphcGZEaW5nYmF0c1xuICAgICAgICAgICAgOiBmb250TmFtZSA9PT0gRm9udE5hbWVzLlN5bWJvbCA/IEVuY29kaW5ncy5TeW1ib2xcbiAgICAgICAgICAgICAgICA6IEVuY29kaW5ncy5XaW5BbnNpKTtcbiAgICAgICAgdGhpcy5mb250ID0gRm9udC5sb2FkKGZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5mb250TmFtZSA9IHRoaXMuZm9udC5Gb250TmFtZTtcbiAgICAgICAgdGhpcy5jdXN0b21OYW1lID0gY3VzdG9tTmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIHRoZSBKYXZhU2NyaXB0IHN0cmluZyBpbnRvIHRoaXMgZm9udC4gKEphdmFTY3JpcHQgZW5jb2RlcyBzdHJpbmdzIGluXG4gICAgICogVW5pY29kZSwgYnV0IHN0YW5kYXJkIGZvbnRzIHVzZSBlaXRoZXIgV2luQW5zaSwgWmFwZkRpbmdiYXRzLCBvciBTeW1ib2xcbiAgICAgKiBlbmNvZGluZ3MpXG4gICAgICovXG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLmVuY29kZVRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5lbmNvZGVUZXh0QXNHbHlwaHModGV4dCk7XG4gICAgICAgIHZhciBoZXhDb2RlcyA9IG5ldyBBcnJheShnbHlwaHMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgaGV4Q29kZXNbaWR4XSA9IHRvSGV4U3RyaW5nKGdseXBoc1tpZHhdLmNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQREZIZXhTdHJpbmcub2YoaGV4Q29kZXMuam9pbignJykpO1xuICAgIH07XG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLndpZHRoT2ZUZXh0QXRTaXplID0gZnVuY3Rpb24gKHRleHQsIHNpemUpIHtcbiAgICAgICAgdmFyIGdseXBocyA9IHRoaXMuZW5jb2RlVGV4dEFzR2x5cGhzKHRleHQpO1xuICAgICAgICB2YXIgdG90YWxXaWR0aCA9IDA7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBsZWZ0ID0gZ2x5cGhzW2lkeF0ubmFtZTtcbiAgICAgICAgICAgIHZhciByaWdodCA9IChnbHlwaHNbaWR4ICsgMV0gfHwge30pLm5hbWU7XG4gICAgICAgICAgICB2YXIga2VybkFtb3VudCA9IHRoaXMuZm9udC5nZXRYQXhpc0tlcm5pbmdGb3JQYWlyKGxlZnQsIHJpZ2h0KSB8fCAwO1xuICAgICAgICAgICAgdG90YWxXaWR0aCArPSB0aGlzLndpZHRoT2ZHbHlwaChsZWZ0KSArIGtlcm5BbW91bnQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNjYWxlID0gc2l6ZSAvIDEwMDA7XG4gICAgICAgIHJldHVybiB0b3RhbFdpZHRoICogc2NhbGU7XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUuaGVpZ2h0T2ZGb250QXRTaXplID0gZnVuY3Rpb24gKHNpemUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIF9hID0gb3B0aW9ucy5kZXNjZW5kZXIsIGRlc2NlbmRlciA9IF9hID09PSB2b2lkIDAgPyB0cnVlIDogX2E7XG4gICAgICAgIHZhciBfYiA9IHRoaXMuZm9udCwgQXNjZW5kZXIgPSBfYi5Bc2NlbmRlciwgRGVzY2VuZGVyID0gX2IuRGVzY2VuZGVyLCBGb250QkJveCA9IF9iLkZvbnRCQm94O1xuICAgICAgICB2YXIgeVRvcCA9IEFzY2VuZGVyIHx8IEZvbnRCQm94WzNdO1xuICAgICAgICB2YXIgeUJvdHRvbSA9IERlc2NlbmRlciB8fCBGb250QkJveFsxXTtcbiAgICAgICAgdmFyIGhlaWdodCA9IHlUb3AgLSB5Qm90dG9tO1xuICAgICAgICBpZiAoIWRlc2NlbmRlcilcbiAgICAgICAgICAgIGhlaWdodCArPSBEZXNjZW5kZXIgfHwgMDtcbiAgICAgICAgcmV0dXJuIChoZWlnaHQgLyAxMDAwKSAqIHNpemU7XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUuc2l6ZU9mRm9udEF0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmZvbnQsIEFzY2VuZGVyID0gX2EuQXNjZW5kZXIsIERlc2NlbmRlciA9IF9hLkRlc2NlbmRlciwgRm9udEJCb3ggPSBfYS5Gb250QkJveDtcbiAgICAgICAgdmFyIHlUb3AgPSBBc2NlbmRlciB8fCBGb250QkJveFszXTtcbiAgICAgICAgdmFyIHlCb3R0b20gPSBEZXNjZW5kZXIgfHwgRm9udEJCb3hbMV07XG4gICAgICAgIHJldHVybiAoMTAwMCAqIGhlaWdodCkgLyAoeVRvcCAtIHlCb3R0b20pO1xuICAgIH07XG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHZhciBmb250RGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIFR5cGU6ICdGb250JyxcbiAgICAgICAgICAgIFN1YnR5cGU6ICdUeXBlMScsXG4gICAgICAgICAgICBCYXNlRm9udDogdGhpcy5jdXN0b21OYW1lIHx8IHRoaXMuZm9udE5hbWUsXG4gICAgICAgICAgICBFbmNvZGluZzogdGhpcy5lbmNvZGluZyA9PT0gRW5jb2RpbmdzLldpbkFuc2kgPyAnV2luQW5zaUVuY29kaW5nJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYXNzaWduKHJlZiwgZm9udERpY3QpO1xuICAgICAgICAgICAgcmV0dXJuIHJlZjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlZ2lzdGVyKGZvbnREaWN0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLndpZHRoT2ZHbHlwaCA9IGZ1bmN0aW9uIChnbHlwaE5hbWUpIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0byAyNTAgaWYgZm9udCBkb2Vzbid0IHNwZWNpZnkgYSB3aWR0aFxuICAgICAgICByZXR1cm4gdGhpcy5mb250LmdldFdpZHRoT2ZHbHlwaChnbHlwaE5hbWUpIHx8IDI1MDtcbiAgICB9O1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbmNvZGVUZXh0QXNHbHlwaHMgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICB2YXIgY29kZVBvaW50cyA9IEFycmF5LmZyb20odGV4dCk7XG4gICAgICAgIHZhciBnbHlwaHMgPSBuZXcgQXJyYXkoY29kZVBvaW50cy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNvZGVQb2ludCA9IHRvQ29kZVBvaW50KGNvZGVQb2ludHNbaWR4XSk7XG4gICAgICAgICAgICBnbHlwaHNbaWR4XSA9IHRoaXMuZW5jb2RpbmcuZW5jb2RlVW5pY29kZUNvZGVQb2ludChjb2RlUG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnbHlwaHM7XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoZm9udE5hbWUsIGN1c3RvbU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFuZGFyZEZvbnRFbWJlZGRlcihmb250TmFtZSwgY3VzdG9tTmFtZSk7XG4gICAgfTtcbiAgICByZXR1cm4gU3RhbmRhcmRGb250RW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgU3RhbmRhcmRGb250RW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGFuZGFyZEZvbnRFbWJlZGRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFycmF5QXNTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbnZhciBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IoY2xhc3NOYW1lLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIk1ldGhvZCBcIiArIGNsYXNzTmFtZSArIFwiLlwiICsgbWV0aG9kTmFtZSArIFwiKCkgbm90IGltcGxlbWVudGVkXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciB9O1xudmFyIFByaXZhdGVDb25zdHJ1Y3RvckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQcml2YXRlQ29uc3RydWN0b3JFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQcml2YXRlQ29uc3RydWN0b3JFcnJvcihjbGFzc05hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQ2Fubm90IGNvbnN0cnVjdCBcIiArIGNsYXNzTmFtZSArIFwiIC0gaXQgaGFzIGEgcHJpdmF0ZSBjb25zdHJ1Y3RvclwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBQcml2YXRlQ29uc3RydWN0b3JFcnJvciB9O1xudmFyIFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvcihleHBlY3RlZCwgYWN0dWFsKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBuYW1lID0gZnVuY3Rpb24gKHQpIHsgdmFyIF9hLCBfYjsgcmV0dXJuIChfYSA9IHQgPT09IG51bGwgfHwgdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdC5uYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAoX2IgPSB0ID09PSBudWxsIHx8IHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHQuY29uc3RydWN0b3IpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5uYW1lOyB9O1xuICAgICAgICB2YXIgZXhwZWN0ZWRUeXBlcyA9IEFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpXG4gICAgICAgICAgICA/IGV4cGVjdGVkLm1hcChuYW1lKVxuICAgICAgICAgICAgOiBbbmFtZShleHBlY3RlZCldO1xuICAgICAgICB2YXIgbXNnID0gXCJFeHBlY3RlZCBpbnN0YW5jZSBvZiBcIiArIGV4cGVjdGVkVHlwZXMuam9pbignIG9yICcpICsgXCIsIFwiICtcbiAgICAgICAgICAgIChcImJ1dCBnb3QgaW5zdGFuY2Ugb2YgXCIgKyAoYWN0dWFsID8gbmFtZShhY3R1YWwpIDogYWN0dWFsKSk7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvciB9O1xudmFyIFVuc3VwcG9ydGVkRW5jb2RpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVuc3VwcG9ydGVkRW5jb2RpbmdFcnJvcihlbmNvZGluZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gZW5jb2RpbmcgKyBcIiBzdHJlYW0gZW5jb2Rpbmcgbm90IHN1cHBvcnRlZFwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yIH07XG52YXIgUmVwYXJzZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZXBhcnNlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVwYXJzZUVycm9yKGNsYXNzTmFtZSwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJDYW5ub3QgY2FsbCBcIiArIGNsYXNzTmFtZSArIFwiLlwiICsgbWV0aG9kTmFtZSArIFwiKCkgbW9yZSB0aGFuIG9uY2VcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFJlcGFyc2VFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFJlcGFyc2VFcnJvciB9O1xudmFyIE1pc3NpbmdDYXRhbG9nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdDYXRhbG9nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ0NhdGFsb2dFcnJvcihyZWYpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiTWlzc2luZyBjYXRhbG9nIChyZWY9XCIgKyByZWYgKyBcIilcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdDYXRhbG9nRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nQ2F0YWxvZ0Vycm9yIH07XG52YXIgTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJDYW4ndCBlbWJlZCBwYWdlIHdpdGggbWlzc2luZyBDb250ZW50c1wiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yIH07XG52YXIgVW5yZWNvZ25pemVkU3RyZWFtVHlwZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5yZWNvZ25pemVkU3RyZWFtVHlwZUVycm9yKHN0cmVhbSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHN0cmVhbVR5cGUgPSAoX2MgPSAoX2IgPSAoX2EgPSBzdHJlYW0gPT09IG51bGwgfHwgc3RyZWFtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHJlYW0uY29udHJ1Y3RvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0cmVhbSA9PT0gbnVsbCB8fCBzdHJlYW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0cmVhbS5uYW1lKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBzdHJlYW07XG4gICAgICAgIHZhciBtc2cgPSBcIlVucmVjb2duaXplZCBzdHJlYW0gdHlwZTogXCIgKyBzdHJlYW1UeXBlO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVW5yZWNvZ25pemVkU3RyZWFtVHlwZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgVW5yZWNvZ25pemVkU3RyZWFtVHlwZUVycm9yIH07XG52YXIgUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGb3VuZCBtaXNtYXRjaGVkIGNvbnRleHRzIHdoaWxlIGVtYmVkZGluZyBwYWdlcy4gQWxsIHBhZ2VzIGluIHRoZSBhcnJheSBwYXNzZWQgdG8gYFBERkRvY3VtZW50LmVtYmVkUGFnZXMoKWAgbXVzdCBiZSBmcm9tIHRoZSBzYW1lIGRvY3VtZW50LlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBQYWdlRW1iZWRkaW5nTWlzbWF0Y2hlZENvbnRleHRFcnJvciB9O1xudmFyIFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvcihzaXplKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkF0dGVtcHRlZCB0byBjb252ZXJ0IFBERkFycmF5IHdpdGggXCIgKyBzaXplICsgXCIgZWxlbWVudHMgdG8gcmVjdGFuZ2xlLCBidXQgbXVzdCBoYXZlIGV4YWN0bHkgNCBlbGVtZW50cy5cIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvciB9O1xudmFyIEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvcih2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBdHRlbXB0ZWQgdG8gY29udmVydCBcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIiB0byBhIGRhdGUsIGJ1dCBpdCBkb2VzIG5vdCBtYXRjaCB0aGUgUERGIGRhdGUgc3RyaW5nIGZvcm1hdC5cIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yIH07XG52YXIgSW52YWxpZFRhcmdldEluZGV4RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEludmFsaWRUYXJnZXRJbmRleEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEludmFsaWRUYXJnZXRJbmRleEVycm9yKHRhcmdldEluZGV4LCBDb3VudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJJbnZhbGlkIHRhcmdldEluZGV4IHNwZWNpZmllZDogdGFyZ2V0SW5kZXg9XCIgKyB0YXJnZXRJbmRleCArIFwiIG11c3QgYmUgbGVzcyB0aGFuIENvdW50PVwiICsgQ291bnQ7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEludmFsaWRUYXJnZXRJbmRleEVycm9yIH07XG52YXIgQ29ycnVwdFBhZ2VUcmVlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvcnJ1cHRQYWdlVHJlZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENvcnJ1cHRQYWdlVHJlZUVycm9yKHRhcmdldEluZGV4LCBvcGVyYXRpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIFwiICsgb3BlcmF0aW9uICsgXCIgYXQgdGFyZ2V0SW5kZXg9XCIgKyB0YXJnZXRJbmRleCArIFwiIGR1ZSB0byBjb3JydXB0IHBhZ2UgdHJlZTogSXQgaXMgbGlrZWx5IHRoYXQgb25lIG9yIG1vcmUgJ0NvdW50JyBlbnRyaWVzIGFyZSBpbnZhbGlkXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBDb3JydXB0UGFnZVRyZWVFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IENvcnJ1cHRQYWdlVHJlZUVycm9yIH07XG52YXIgSW5kZXhPdXRPZkJvdW5kc0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbmRleE91dE9mQm91bmRzRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW5kZXhPdXRPZkJvdW5kc0Vycm9yKGluZGV4LCBtaW4sIG1heCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJpbmRleCBzaG91bGQgYmUgYXQgbGVhc3QgXCIgKyBtaW4gKyBcIiBhbmQgYXQgbW9zdCBcIiArIG1heCArIFwiLCBidXQgd2FzIGFjdHVhbGx5IFwiICsgaW5kZXg7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbmRleE91dE9mQm91bmRzRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBJbmRleE91dE9mQm91bmRzRXJyb3IgfTtcbnZhciBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkF0dGVtcHRlZCB0byBzZXQgaW52YWxpZCBmaWVsZCB2YWx1ZVwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvciB9O1xudmFyIE11bHRpU2VsZWN0VmFsdWVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTXVsdGlTZWxlY3RWYWx1ZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE11bHRpU2VsZWN0VmFsdWVFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQXR0ZW1wdGVkIHRvIHNlbGVjdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIHNpbmdsZS1zZWxlY3QgZmllbGRcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE11bHRpU2VsZWN0VmFsdWVFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE11bHRpU2VsZWN0VmFsdWVFcnJvciB9O1xudmFyIE1pc3NpbmdEQUVudHJ5RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdEQUVudHJ5RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ0RBRW50cnlFcnJvcihmaWVsZE5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiTm8gL0RBIChkZWZhdWx0IGFwcGVhcmFuY2UpIGVudHJ5IGZvdW5kIGZvciBmaWVsZDogXCIgKyBmaWVsZE5hbWU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nREFFbnRyeUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ0RBRW50cnlFcnJvciB9O1xudmFyIE1pc3NpbmdUZk9wZXJhdG9yRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdUZk9wZXJhdG9yRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ1RmT3BlcmF0b3JFcnJvcihmaWVsZE5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiTm8gVGYgb3BlcmF0b3IgZm91bmQgZm9yIERBIG9mIGZpZWxkOiBcIiArIGZpZWxkTmFtZTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdUZk9wZXJhdG9yRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nVGZPcGVyYXRvckVycm9yIH07XG52YXIgTnVtYmVyUGFyc2luZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOdW1iZXJQYXJzaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTnVtYmVyUGFyc2luZ0Vycm9yKHBvcywgdmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIHBhcnNlIG51bWJlciBcIiArXG4gICAgICAgICAgICAoXCIobGluZTpcIiArIHBvcy5saW5lICsgXCIgY29sOlwiICsgcG9zLmNvbHVtbiArIFwiIG9mZnNldD1cIiArIHBvcy5vZmZzZXQgKyBcIik6IFxcXCJcIiArIHZhbHVlICsgXCJcXFwiXCIpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTnVtYmVyUGFyc2luZ0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTnVtYmVyUGFyc2luZ0Vycm9yIH07XG52YXIgUERGUGFyc2luZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZQYXJzaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUGFyc2luZ0Vycm9yKHBvcywgZGV0YWlscykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgUERGIGRvY3VtZW50IFwiICtcbiAgICAgICAgICAgIChcIihsaW5lOlwiICsgcG9zLmxpbmUgKyBcIiBjb2w6XCIgKyBwb3MuY29sdW1uICsgXCIgb2Zmc2V0PVwiICsgcG9zLm9mZnNldCArIFwiKTogXCIgKyBkZXRhaWxzKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBERlBhcnNpbmdFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFBERlBhcnNpbmdFcnJvciB9O1xudmFyIE5leHRCeXRlQXNzZXJ0aW9uRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE5leHRCeXRlQXNzZXJ0aW9uRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTmV4dEJ5dGVBc3NlcnRpb25FcnJvcihwb3MsIGV4cGVjdGVkQnl0ZSwgYWN0dWFsQnl0ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJFeHBlY3RlZCBuZXh0IGJ5dGUgdG8gYmUgXCIgKyBleHBlY3RlZEJ5dGUgKyBcIiBidXQgaXQgd2FzIGFjdHVhbGx5IFwiICsgYWN0dWFsQnl0ZTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTmV4dEJ5dGVBc3NlcnRpb25FcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBOZXh0Qnl0ZUFzc2VydGlvbkVycm9yIH07XG52YXIgUERGT2JqZWN0UGFyc2luZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZPYmplY3RQYXJzaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGT2JqZWN0UGFyc2luZ0Vycm9yKHBvcywgYnl0ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgUERGIG9iamVjdCBzdGFydGluZyB3aXRoIHRoZSBmb2xsb3dpbmcgYnl0ZTogXCIgKyBieXRlO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQREZPYmplY3RQYXJzaW5nRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgUERGT2JqZWN0UGFyc2luZ0Vycm9yIH07XG52YXIgUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yKHBvcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgaW52YWxpZCBQREYgb2JqZWN0XCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBERkludmFsaWRPYmplY3RQYXJzaW5nRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvciB9O1xudmFyIFBERlN0cmVhbVBhcnNpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGU3RyZWFtUGFyc2luZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlN0cmVhbVBhcnNpbmdFcnJvcihwb3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIHBhcnNlIFBERiBzdHJlYW1cIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUERGU3RyZWFtUGFyc2luZ0Vycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IFBERlN0cmVhbVBhcnNpbmdFcnJvciB9O1xudmFyIFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvcihwb3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIHBhcnNlIFBERiBsaXRlcmFsIHN0cmluZyBkdWUgdG8gdW5iYWxhbmNlZCBwYXJlbnRoZXNpc1wiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvciB9O1xudmFyIFN0YWxsZWRQYXJzZXJFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3RhbGxlZFBhcnNlckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFN0YWxsZWRQYXJzZXJFcnJvcihwb3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiUGFyc2VyIHN0YWxsZWRcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gU3RhbGxlZFBhcnNlckVycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IFN0YWxsZWRQYXJzZXJFcnJvciB9O1xudmFyIE1pc3NpbmdQREZIZWFkZXJFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ1BERkhlYWRlckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdQREZIZWFkZXJFcnJvcihwb3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiTm8gUERGIGhlYWRlciBmb3VuZFwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nUERGSGVhZGVyRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ1BERkhlYWRlckVycm9yIH07XG52YXIgTWlzc2luZ0tleXdvcmRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0tleXdvcmRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nS2V5d29yZEVycm9yKHBvcywga2V5d29yZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJEaWQgbm90IGZpbmQgZXhwZWN0ZWQga2V5d29yZCAnXCIgKyBhcnJheUFzU3RyaW5nKGtleXdvcmQpICsgXCInXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdLZXl3b3JkRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ0tleXdvcmRFcnJvciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDaGFyQ29kZXMgfSBmcm9tIFwiLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkNvbnRleHQgfSBmcm9tIFwiLi9QREZDb250ZXh0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9iamVjdENvcGllciB9IGZyb20gXCIuL1BERk9iamVjdENvcGllclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZXcml0ZXIgfSBmcm9tIFwiLi93cml0ZXJzL1BERldyaXRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZTdHJlYW1Xcml0ZXIgfSBmcm9tIFwiLi93cml0ZXJzL1BERlN0cmVhbVdyaXRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZIZWFkZXIgfSBmcm9tIFwiLi9kb2N1bWVudC9QREZIZWFkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGVHJhaWxlciB9IGZyb20gXCIuL2RvY3VtZW50L1BERlRyYWlsZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGVHJhaWxlckRpY3QgfSBmcm9tIFwiLi9kb2N1bWVudC9QREZUcmFpbGVyRGljdFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZDcm9zc1JlZlNlY3Rpb24gfSBmcm9tIFwiLi9kb2N1bWVudC9QREZDcm9zc1JlZlNlY3Rpb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3RhbmRhcmRGb250RW1iZWRkZXIgfSBmcm9tIFwiLi9lbWJlZGRlcnMvU3RhbmRhcmRGb250RW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3VzdG9tRm9udEVtYmVkZGVyIH0gZnJvbSBcIi4vZW1iZWRkZXJzL0N1c3RvbUZvbnRFbWJlZGRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIgfSBmcm9tIFwiLi9lbWJlZGRlcnMvQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZpbGVFbWJlZGRlciwgQUZSZWxhdGlvbnNoaXAsIH0gZnJvbSBcIi4vZW1iZWRkZXJzL0ZpbGVFbWJlZGRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBKcGVnRW1iZWRkZXIgfSBmcm9tIFwiLi9lbWJlZGRlcnMvSnBlZ0VtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBuZ0VtYmVkZGVyIH0gZnJvbSBcIi4vZW1iZWRkZXJzL1BuZ0VtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlBhZ2VFbWJlZGRlciwgfSBmcm9tIFwiLi9lbWJlZGRlcnMvUERGUGFnZUVtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFZpZXdlclByZWZlcmVuY2VzLCBOb25GdWxsU2NyZWVuUGFnZU1vZGUsIFJlYWRpbmdEaXJlY3Rpb24sIFByaW50U2NhbGluZywgRHVwbGV4LCB9IGZyb20gXCIuL2ludGVyYWN0aXZlL1ZpZXdlclByZWZlcmVuY2VzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9iamVjdCB9IGZyb20gXCIuL29iamVjdHMvUERGT2JqZWN0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkJvb2wgfSBmcm9tIFwiLi9vYmplY3RzL1BERkJvb2xcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGTnVtYmVyIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGU3RyaW5nIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGSGV4U3RyaW5nIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGTmFtZSB9IGZyb20gXCIuL29iamVjdHMvUERGTmFtZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZOdWxsIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZOdWxsXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFycmF5IH0gZnJvbSBcIi4vb2JqZWN0cy9QREZBcnJheVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZEaWN0IH0gZnJvbSBcIi4vb2JqZWN0cy9QREZEaWN0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlJlZiB9IGZyb20gXCIuL29iamVjdHMvUERGUmVmXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkludmFsaWRPYmplY3QgfSBmcm9tIFwiLi9vYmplY3RzL1BERkludmFsaWRPYmplY3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGU3RyZWFtIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZTdHJlYW1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUmF3U3RyZWFtIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZSYXdTdHJlYW1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQ2F0YWxvZyB9IGZyb20gXCIuL3N0cnVjdHVyZXMvUERGQ2F0YWxvZ1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZDb250ZW50U3RyZWFtIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZDb250ZW50U3RyZWFtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkNyb3NzUmVmU3RyZWFtIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZDcm9zc1JlZlN0cmVhbVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPYmplY3RTdHJlYW0gfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERk9iamVjdFN0cmVhbVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZQYWdlVHJlZSB9IGZyb20gXCIuL3N0cnVjdHVyZXMvUERGUGFnZVRyZWVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUGFnZUxlYWYgfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERlBhZ2VMZWFmXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkZsYXRlU3RyZWFtIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZGbGF0ZVN0cmVhbVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPcGVyYXRvciB9IGZyb20gXCIuL29wZXJhdG9ycy9QREZPcGVyYXRvclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPcGVyYXRvck5hbWVzIH0gZnJvbSBcIi4vb3BlcmF0b3JzL1BERk9wZXJhdG9yTmFtZXNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT2JqZWN0UGFyc2VyIH0gZnJvbSBcIi4vcGFyc2VyL1BERk9iamVjdFBhcnNlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPYmplY3RTdHJlYW1QYXJzZXIgfSBmcm9tIFwiLi9wYXJzZXIvUERGT2JqZWN0U3RyZWFtUGFyc2VyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlBhcnNlciB9IGZyb20gXCIuL3BhcnNlci9QREZQYXJzZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGWFJlZlN0cmVhbVBhcnNlciB9IGZyb20gXCIuL3BhcnNlci9QREZYUmVmU3RyZWFtUGFyc2VyXCI7XG5leHBvcnQgeyBkZWNvZGVQREZSYXdTdHJlYW0gfSBmcm9tIFwiLi9zdHJlYW1zL2RlY29kZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYW5ub3RhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYWNyb2Zvcm1cIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkJvb2wgZnJvbSBcIi4uL29iamVjdHMvUERGQm9vbFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCB7IGFzc2VydEVhY2hJcywgYXNzZXJ0SW50ZWdlciwgYXNzZXJ0SXNPbmVPZiwgYXNzZXJ0UmFuZ2UsIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgYXNFbnVtID0gZnVuY3Rpb24gKHJhd1ZhbHVlLCBlbnVtVHlwZSkge1xuICAgIGlmIChyYXdWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBlbnVtVHlwZVtyYXdWYWx1ZV07XG59O1xuZXhwb3J0IHZhciBOb25GdWxsU2NyZWVuUGFnZU1vZGU7XG4oZnVuY3Rpb24gKE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSkge1xuICAgIC8qKlxuICAgICAqIEFmdGVyIGV4aXRpbmcgRnVsbFNjcmVlbiBtb2RlLCBuZWl0aGVyIHRoZSBkb2N1bWVudCBvdXRsaW5lIG5vciB0aHVtYm5haWxcbiAgICAgKiBpbWFnZXMgc2hvdWxkIGJlIHZpc2libGUuXG4gICAgICovXG4gICAgTm9uRnVsbFNjcmVlblBhZ2VNb2RlW1wiVXNlTm9uZVwiXSA9IFwiVXNlTm9uZVwiO1xuICAgIC8qKiBBZnRlciBleGl0aW5nIEZ1bGxTY3JlZW4gbW9kZSwgdGhlIGRvY3VtZW50IG91dGxpbmUgc2hvdWxkIGJlIHZpc2libGUuICovXG4gICAgTm9uRnVsbFNjcmVlblBhZ2VNb2RlW1wiVXNlT3V0bGluZXNcIl0gPSBcIlVzZU91dGxpbmVzXCI7XG4gICAgLyoqIEFmdGVyIGV4aXRpbmcgRnVsbFNjcmVlbiBtb2RlLCB0aHVtYm5haWwgaW1hZ2VzIHNob3VsZCBiZSB2aXNpYmxlLiAqL1xuICAgIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZVtcIlVzZVRodW1ic1wiXSA9IFwiVXNlVGh1bWJzXCI7XG4gICAgLyoqXG4gICAgICogQWZ0ZXIgZXhpdGluZyBGdWxsU2NyZWVuIG1vZGUsIHRoZSBvcHRpb25hbCBjb250ZW50IGdyb3VwIHBhbmVsIHNob3VsZCBiZVxuICAgICAqIHZpc2libGUuXG4gICAgICovXG4gICAgTm9uRnVsbFNjcmVlblBhZ2VNb2RlW1wiVXNlT0NcIl0gPSBcIlVzZU9DXCI7XG59KShOb25GdWxsU2NyZWVuUGFnZU1vZGUgfHwgKE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSA9IHt9KSk7XG5leHBvcnQgdmFyIFJlYWRpbmdEaXJlY3Rpb247XG4oZnVuY3Rpb24gKFJlYWRpbmdEaXJlY3Rpb24pIHtcbiAgICAvKiogVGhlIHByZWRvbWluYW50IHJlYWRpbmcgb3JkZXIgaXMgTGVmdCB0byBSaWdodC4gKi9cbiAgICBSZWFkaW5nRGlyZWN0aW9uW1wiTDJSXCJdID0gXCJMMlJcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZG9taW5hbnQgcmVhZGluZyBvcmRlciBpcyBSaWdodCB0byBsZWZ0IChpbmNsdWRpbmcgdmVydGljYWwgd3JpdGluZ1xuICAgICAqIHN5c3RlbXMsIHN1Y2ggYXMgQ2hpbmVzZSwgSmFwYW5lc2UgYW5kIEtvcmVhbikuXG4gICAgICovXG4gICAgUmVhZGluZ0RpcmVjdGlvbltcIlIyTFwiXSA9IFwiUjJMXCI7XG59KShSZWFkaW5nRGlyZWN0aW9uIHx8IChSZWFkaW5nRGlyZWN0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgUHJpbnRTY2FsaW5nO1xuKGZ1bmN0aW9uIChQcmludFNjYWxpbmcpIHtcbiAgICAvKiogTm8gcGFnZSBzY2FsaW5nLiAqL1xuICAgIFByaW50U2NhbGluZ1tcIk5vbmVcIl0gPSBcIk5vbmVcIjtcbiAgICAvKiBVc2UgdGhlIFBERiByZWFkZXIncyBkZWZhdWx0IHByaW50IHNjYWxpbmcuICovXG4gICAgUHJpbnRTY2FsaW5nW1wiQXBwRGVmYXVsdFwiXSA9IFwiQXBwRGVmYXVsdFwiO1xufSkoUHJpbnRTY2FsaW5nIHx8IChQcmludFNjYWxpbmcgPSB7fSkpO1xuZXhwb3J0IHZhciBEdXBsZXg7XG4oZnVuY3Rpb24gKER1cGxleCkge1xuICAgIC8qKiBUaGUgUERGIHJlYWRlciBzaG91bGQgcHJpbnQgc2luZ2xlLXNpZGVkLiAqL1xuICAgIER1cGxleFtcIlNpbXBsZXhcIl0gPSBcIlNpbXBsZXhcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgUERGIHJlYWRlciBzaG91bGQgcHJpbnQgZG91YmxlIHNpZGVkIGFuZCBmbGlwIG9uIHRoZSBzaG9ydCBlZGdlIG9mIHRoZVxuICAgICAqIHNoZWV0LlxuICAgICAqL1xuICAgIER1cGxleFtcIkR1cGxleEZsaXBTaG9ydEVkZ2VcIl0gPSBcIkR1cGxleEZsaXBTaG9ydEVkZ2VcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgUERGIHJlYWRlciBzaG91bGQgcHJpbnQgZG91YmxlIHNpZGVkIGFuZCBmbGlwIG9uIHRoZSBsb25nIGVkZ2Ugb2YgdGhlXG4gICAgICogc2hlZXQuXG4gICAgICovXG4gICAgRHVwbGV4W1wiRHVwbGV4RmxpcExvbmdFZGdlXCJdID0gXCJEdXBsZXhGbGlwTG9uZ0VkZ2VcIjtcbn0pKER1cGxleCB8fCAoRHVwbGV4ID0ge30pKTtcbnZhciBWaWV3ZXJQcmVmZXJlbmNlcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIGZ1bmN0aW9uIFZpZXdlclByZWZlcmVuY2VzKGRpY3QpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB9XG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmxvb2t1cEJvb2wgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciByZXR1cm5PYmogPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2Yoa2V5KSk7XG4gICAgICAgIGlmIChyZXR1cm5PYmogaW5zdGFuY2VvZiBQREZCb29sKVxuICAgICAgICAgICAgcmV0dXJuIHJldHVybk9iajtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5sb29rdXBOYW1lID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgcmV0dXJuT2JqID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKGtleSkpO1xuICAgICAgICBpZiAocmV0dXJuT2JqIGluc3RhbmNlb2YgUERGTmFtZSlcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5IaWRlVG9vbGJhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQm9vbCgnSGlkZVRvb2xiYXInKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkhpZGVNZW51YmFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdIaWRlTWVudWJhcicpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuSGlkZVdpbmRvd1VJID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdIaWRlV2luZG93VUknKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkZpdFdpbmRvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQm9vbCgnRml0V2luZG93Jyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5DZW50ZXJXaW5kb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJvb2woJ0NlbnRlcldpbmRvdycpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuRGlzcGxheURvY1RpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdEaXNwbGF5RG9jVGl0bGUnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLk5vbkZ1bGxTY3JlZW5QYWdlTW9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTmFtZSgnTm9uRnVsbFNjcmVlblBhZ2VNb2RlJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5EaXJlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE5hbWUoJ0RpcmVjdGlvbicpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuUHJpbnRTY2FsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBOYW1lKCdQcmludFNjYWxpbmcnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkR1cGxleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTmFtZSgnRHVwbGV4Jyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5QaWNrVHJheUJ5UERGU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQm9vbCgnUGlja1RyYXlCeVBERlNpemUnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLlByaW50UGFnZVJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgUHJpbnRQYWdlUmFuZ2UgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1ByaW50UGFnZVJhbmdlJykpO1xuICAgICAgICBpZiAoUHJpbnRQYWdlUmFuZ2UgaW5zdGFuY2VvZiBQREZBcnJheSlcbiAgICAgICAgICAgIHJldHVybiBQcmludFBhZ2VSYW5nZTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLk51bUNvcGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIE51bUNvcGllcyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignTnVtQ29waWVzJykpO1xuICAgICAgICBpZiAoTnVtQ29waWVzIGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuIE51bUNvcGllcztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCBoaWRlIHRoZSB0b29sYmFyIG1lbnVzIHdoZW4gZGlzcGxheWluZ1xuICAgICAqIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdG9vbGJhcnMgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0SGlkZVRvb2xiYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkhpZGVUb29sYmFyKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc0Jvb2xlYW4oKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBQREYgcmVhZGVycyBzaG91bGQgaGlkZSB0aGUgbWVudSBiYXIgd2hlbiBkaXNwbGF5aW5nIHRoaXNcbiAgICAgKiBkb2N1bWVudC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgbWVudSBiYXIgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0SGlkZU1lbnViYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkhpZGVNZW51YmFyKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc0Jvb2xlYW4oKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBQREYgcmVhZGVycyBzaG91bGQgaGlkZSB0aGUgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgaW5cbiAgICAgKiB0aGUgZG9jdW1lbnQncyB3aW5kb3cgKHN1Y2ggYXMgc2Nyb2xsIGJhcnMgYW5kIG5hdmlnYXRpb24gY29udHJvbHMpLFxuICAgICAqIGxlYXZpbmcgb25seSB0aGUgZG9jdW1lbnQncyBjb250ZW50cyBkaXNwbGF5ZWQuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0SGlkZVdpbmRvd1VJID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5IaWRlV2luZG93VUkoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCByZXNpemUgdGhlIGRvY3VtZW50J3Mgd2luZG93IHRvIGZpdFxuICAgICAqIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBkaXNwbGF5ZWQgcGFnZS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgd2luZG93IHNob3VsZCBiZSByZXNpemVkIHRvIGZpdC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0Rml0V2luZG93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5GaXRXaW5kb3coKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCBwb3NpdGlvbiB0aGUgZG9jdW1lbnQncyB3aW5kb3cgaW4gdGhlXG4gICAgICogY2VudGVyIG9mIHRoZSBzY3JlZW4uXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdG8gY2VudGVyIHRoZSBkb2N1bWVudCB3aW5kb3cuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldENlbnRlcldpbmRvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuQ2VudGVyV2luZG93KCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc0Jvb2xlYW4oKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgd2luZG93J3MgdGl0bGUgYmFyIHNob3VsZCBkaXNwbGF5IHRoZSBkb2N1bWVudFxuICAgICAqIGBUaXRsZWAsIHRha2VuIGZyb20gdGhlIGRvY3VtZW50IG1ldGFkYXRhIChzZWUgW1tQREZEb2N1bWVudC5nZXRUaXRsZV1dKS5cbiAgICAgKiBSZXR1cm5zIGBmYWxzZWAgaWYgdGhlIHRpdGxlIGJhciBzaG91bGQgaW5zdGVhZCBkaXNwbGF5IHRoZSBmaWxlbmFtZSBvZiB0aGVcbiAgICAgKiBQREYgZmlsZS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRvIGRpc3BsYXkgdGhlIGRvY3VtZW50IHRpdGxlLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXREaXNwbGF5RG9jVGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkRpc3BsYXlEb2NUaXRsZSgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNCb29sZWFuKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGFnZSBtb2RlLCB3aGljaCB0ZWxscyB0aGUgUERGIHJlYWRlciBob3cgdG8gZGlzcGxheSB0aGVcbiAgICAgKiBkb2N1bWVudCBhZnRlciBleGl0aW5nIGZ1bGwtc2NyZWVuIG1vZGUuXG4gICAgICogQHJldHVybnMgVGhlIHBhZ2UgbW9kZSBhZnRlciBleGl0aW5nIGZ1bGwtc2NyZWVuIG1vZGUuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdmFyIG1vZGUgPSAoX2EgPSB0aGlzLk5vbkZ1bGxTY3JlZW5QYWdlTW9kZSgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjb2RlVGV4dCgpO1xuICAgICAgICByZXR1cm4gKF9iID0gYXNFbnVtKG1vZGUsIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IE5vbkZ1bGxTY3JlZW5QYWdlTW9kZS5Vc2VOb25lO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJlZG9taW5hbnQgcmVhZGluZyBvcmRlciBmb3IgdGV4dC5cbiAgICAgKiBAcmV0dXJucyBUaGUgdGV4dCByZWFkaW5nIG9yZGVyLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRSZWFkaW5nRGlyZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gKF9hID0gdGhpcy5EaXJlY3Rpb24oKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29kZVRleHQoKTtcbiAgICAgICAgcmV0dXJuIChfYiA9IGFzRW51bShkaXJlY3Rpb24sIFJlYWRpbmdEaXJlY3Rpb24pKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBSZWFkaW5nRGlyZWN0aW9uLkwyUjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBhZ2Ugc2NhbGluZyBvcHRpb24gdGhhdCB0aGUgUERGIHJlYWRlciBzaG91bGQgc2VsZWN0IHdoZW4gdGhlXG4gICAgICogcHJpbnQgZGlhbG9nIGlzIGRpc3BsYXllZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcGFnZSBzY2FsaW5nIG9wdGlvbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0UHJpbnRTY2FsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB2YXIgc2NhbGluZyA9IChfYSA9IHRoaXMuUHJpbnRTY2FsaW5nKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIHJldHVybiAoX2IgPSBhc0VudW0oc2NhbGluZywgUHJpbnRTY2FsaW5nKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogUHJpbnRTY2FsaW5nLkFwcERlZmF1bHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwYXBlciBoYW5kbGluZyBvcHRpb24gdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHByaW50aW5nIHRoZVxuICAgICAqIGZpbGUgZnJvbSB0aGUgcHJpbnQgZGlhbG9nLlxuICAgICAqIEByZXR1cm5zIFRoZSBwYXBlciBoYW5kbGluZyBvcHRpb24uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldER1cGxleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgZHVwbGV4ID0gKF9hID0gdGhpcy5EdXBsZXgoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29kZVRleHQoKTtcbiAgICAgICAgcmV0dXJuIGFzRW51bShkdXBsZXgsIER1cGxleCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgUERGIHBhZ2Ugc2l6ZSBzaG91bGQgYmUgdXNlZCB0byBzZWxlY3QgdGhlIGlucHV0XG4gICAgICogcGFwZXIgdHJheS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgUERGIHBhZ2Ugc2l6ZSBzaG91bGQgYmUgdXNlZCB0byBzZWxlY3QgdGhlXG4gICAgICogICAgICAgICAgaW5wdXQgcGFwZXIgdHJheS5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0UGlja1RyYXlCeVBERlNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuUGlja1RyYXlCeVBERlNpemUoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBwYWdlIG51bWJlciByYW5nZXMsIHdoaWNoIGFyZSB0aGUgdmFsdWVzIHVzZWQgdG9cbiAgICAgKiBpbml0aWFsaXplIHRoZSBwcmludCBkaWFsb2cgYm94IHdoZW4gdGhlIGZpbGUgaXMgcHJpbnRlZC4gRWFjaCByYW5nZVxuICAgICAqIHNwZWNpZmllcyB0aGUgZmlyc3QgKGBzdGFydGApIGFuZCBsYXN0IChgZW5kYCkgcGFnZXMgaW4gYSBzdWItcmFuZ2Ugb2ZcbiAgICAgKiBwYWdlcyB0byBiZSBwcmludGVkLiBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgUERGIGZpbGUgaXMgZGVub3RlZCBieSAwLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgdmlld2VyUHJlZnMgPSBwZGZEb2MuY2F0YWxvZy5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzKClcbiAgICAgKiBjb25zdCBpbmNsdWRlc1BhZ2UzID0gdmlld2VyUHJlZnNcbiAgICAgKiAgIC5nZXRQcmludFJhbmdlcygpXG4gICAgICogICAuc29tZShwciA9PiBwci5zdGFydCA9PCAyICYmIHByLmVuZCA+PSAyKVxuICAgICAqIGlmIChpbmNsdWRlc1BhZ2UzKSBjb25zb2xlLmxvZygncHJpbnRSYW5nZSBpbmNsdWRlcyBwYWdlIDMnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIG9iamVjdHMsIGVhY2ggd2l0aCB0aGUgcHJvcGVydGllcyBgc3RhcnRgIGFuZCBgZW5kYCxcbiAgICAgKiAgICAgICAgICBkZW5vdGluZyBwYWdlIGluZGljZXMuIElmIG5vdCwgc3BlY2lmaWVkIGFuIGVtcHR5IGFycmF5IGlzXG4gICAgICogICAgICAgICAgcmV0dXJuZWQuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldFByaW50UGFnZVJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcm5nID0gdGhpcy5QcmludFBhZ2VSYW5nZSgpO1xuICAgICAgICBpZiAoIXJuZylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgdmFyIHBhZ2VSYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBybmcuc2l6ZSgpOyBpICs9IDIpIHtcbiAgICAgICAgICAgIC8vIERlc3BpdGUgdGhlIHNwZWMgY2xlYXJseSBzdGF0aW5nIHRoYXQgXCJUaGUgZmlyc3QgcGFnZSBvZiB0aGUgUERGIGZpbGVcbiAgICAgICAgICAgIC8vIHNoYWxsIGJlIGRvbm90ZWQgYnkgMVwiLCBzZXZlcmFsIHRlc3QgUERGcyAoc3BlYyAxLjcpIGNyZWF0ZWQgaW5cbiAgICAgICAgICAgIC8vIEFjcm9iYXQgWEkgMTEuMCBhbmQgYWxzbyByZWFkIHdpdGggUmVhZGVyIERDIDIwMjAuMDEzIGluZGljYXRlIHRoaXMgaXNcbiAgICAgICAgICAgIC8vIGFjdHVhbGx5IGEgMCBiYXNlZCBpbmRleC5cbiAgICAgICAgICAgIHZhciBzdGFydCA9IHJuZy5sb29rdXAoaSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICAgICAgdmFyIGVuZCA9IHJuZy5sb29rdXAoaSArIDEsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgIHBhZ2VSYW5nZXMucHVzaCh7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2VSYW5nZXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29waWVzIHRvIGJlIHByaW50ZWQgd2hlbiB0aGUgcHJpbnQgZGlhbG9nIGlzIG9wZW5lZFxuICAgICAqIGZvciB0aGlzIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IG51bWJlciBvZiBjb3BpZXMgdG8gYmUgcHJpbnRlZC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0TnVtQ29waWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5OdW1Db3BpZXMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDE7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIHJlYWRlcidzIHRvb2xiYXJzIHNob3VsZCBiZSBoaWRkZW4gd2hpbGUgdGhlXG4gICAgICogZG9jdW1lbnQgaXMgYWN0aXZlLlxuICAgICAqIEBwYXJhbSBoaWRlVG9vbGJhciBgdHJ1ZWAgaWYgdGhlIHRvb2xiYXIgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0SGlkZVRvb2xiYXIgPSBmdW5jdGlvbiAoaGlkZVRvb2xiYXIpIHtcbiAgICAgICAgdmFyIEhpZGVUb29sYmFyID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGhpZGVUb29sYmFyKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdIaWRlVG9vbGJhcicpLCBIaWRlVG9vbGJhcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIHJlYWRlcidzIG1lbnUgYmFyIHNob3VsZCBiZSBoaWRkZW4gd2hpbGUgdGhlXG4gICAgICogZG9jdW1lbnQgaXMgYWN0aXZlLlxuICAgICAqIEBwYXJhbSBoaWRlTWVudWJhciBgdHJ1ZWAgaWYgdGhlIG1lbnUgYmFyIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldEhpZGVNZW51YmFyID0gZnVuY3Rpb24gKGhpZGVNZW51YmFyKSB7XG4gICAgICAgIHZhciBIaWRlTWVudWJhciA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihoaWRlTWVudWJhcik7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignSGlkZU1lbnViYXInKSwgSGlkZU1lbnViYXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHdoZXRoZXIgdGhlIFBERiByZWFkZXIgc2hvdWxkIGhpZGUgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgaW4gdGhlXG4gICAgICogZG9jdW1lbnQncyB3aW5kb3cgKHN1Y2ggYXMgc2Nyb2xsIGJhcnMgYW5kIG5hdmlnYXRpb24gY29udHJvbHMpLCBsZWF2aW5nXG4gICAgICogb25seSB0aGUgZG9jdW1lbnQncyBjb250ZW50cyBkaXNwbGF5ZWQuXG4gICAgICogQHBhcmFtIGhpZGVXaW5kb3dVSSBgdHJ1ZWAgaWYgdGhlIHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldEhpZGVXaW5kb3dVSSA9IGZ1bmN0aW9uIChoaWRlV2luZG93VUkpIHtcbiAgICAgICAgdmFyIEhpZGVXaW5kb3dVSSA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihoaWRlV2luZG93VUkpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0hpZGVXaW5kb3dVSScpLCBIaWRlV2luZG93VUkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHdoZXRoZXIgdGhlIFBERiByZWFkZXIgc2hvdWxkIHJlc2l6ZSB0aGUgZG9jdW1lbnQncyB3aW5kb3cgdG8gZml0XG4gICAgICogdGhlIHNpemUgb2YgdGhlIGZpcnN0IGRpc3BsYXllZCBwYWdlLlxuICAgICAqIEBwYXJhbSBmaXRXaW5kb3cgYHRydWVgIGlmIHRoZSB3aW5kb3cgc2hvdWxkIGJlIHJlc2l6ZWQuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldEZpdFdpbmRvdyA9IGZ1bmN0aW9uIChmaXRXaW5kb3cpIHtcbiAgICAgICAgdmFyIEZpdFdpbmRvdyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihmaXRXaW5kb3cpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0ZpdFdpbmRvdycpLCBGaXRXaW5kb3cpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHdoZXRoZXIgdGhlIFBERiByZWFkZXIgc2hvdWxkIHBvc2l0aW9uIHRoZSBkb2N1bWVudCdzIHdpbmRvdyBpbiB0aGVcbiAgICAgKiBjZW50ZXIgb2YgdGhlIHNjcmVlbi5cbiAgICAgKiBAcGFyYW0gY2VudGVyV2luZG93IGB0cnVlYCBpZiB0aGUgd2luZG93IHNob3VsZCBiZSBjZW50ZXJlZC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0Q2VudGVyV2luZG93ID0gZnVuY3Rpb24gKGNlbnRlcldpbmRvdykge1xuICAgICAgICB2YXIgQ2VudGVyV2luZG93ID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGNlbnRlcldpbmRvdyk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQ2VudGVyV2luZG93JyksIENlbnRlcldpbmRvdyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgd2luZG93J3MgdGl0bGUgYmFyIHNob3VsZCBkaXNwbGF5IHRoZSBkb2N1bWVudCBgVGl0bGVgXG4gICAgICogdGFrZW4gZnJvbSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEgKHNlZSBbW1BERkRvY3VtZW50LnNldFRpdGxlXV0pLiBJZlxuICAgICAqIGBmYWxzZWAsIHRoZSB0aXRsZSBiYXIgc2hvdWxkIGluc3RlYWQgZGlzcGxheSB0aGUgUERGIGZpbGVuYW1lLlxuICAgICAqIEBwYXJhbSBkaXNwbGF5VGl0bGUgYHRydWVgIGlmIHRoZSBkb2N1bWVudCB0aXRsZSBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXREaXNwbGF5RG9jVGl0bGUgPSBmdW5jdGlvbiAoZGlzcGxheVRpdGxlKSB7XG4gICAgICAgIHZhciBEaXNwbGF5RG9jVGl0bGUgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooZGlzcGxheVRpdGxlKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdEaXNwbGF5RG9jVGl0bGUnKSwgRGlzcGxheURvY1RpdGxlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSBob3cgdGhlIFBERiByZWFkZXIgc2hvdWxkIGRpc3BsYXkgdGhlIGRvY3VtZW50IHVwb24gZXhpdGluZ1xuICAgICAqIGZ1bGwtc2NyZWVuIG1vZGUuIFRoaXMgZW50cnkgaXMgbWVhbmluZ2Z1bCBvbmx5IGlmIHRoZSB2YWx1ZSBvZiB0aGVcbiAgICAgKiBgUGFnZU1vZGVgIGVudHJ5IGluIHRoZSBkb2N1bWVudCdzIFtbUERGQ2F0YWxvZ11dIGlzIGBGdWxsU2NyZWVuYC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQsIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSwgUERGTmFtZSB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqXG4gICAgICogLy8gU2V0IHRoZSBQYWdlTW9kZVxuICAgICAqIHBkZkRvYy5jYXRhbG9nLnNldChQREZOYW1lLm9mKCdQYWdlTW9kZScpLFBERk5hbWUub2YoJ0Z1bGxTY3JlZW4nKSlcbiAgICAgKlxuICAgICAqIC8vIFNldCB3aGF0IGhhcHBlbnMgd2hlbiBmdWxsLXNjcmVlbiBpcyBjbG9zZWRcbiAgICAgKiBjb25zdCB2aWV3ZXJQcmVmcyA9IHBkZkRvYy5jYXRhbG9nLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMoKVxuICAgICAqIHZpZXdlclByZWZzLnNldE5vbkZ1bGxTY3JlZW5QYWdlTW9kZShOb25GdWxsU2NyZWVuUGFnZU1vZGUuVXNlT3V0bGluZXMpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9uRnVsbFNjcmVlblBhZ2VNb2RlIEhvdyB0aGUgZG9jdW1lbnQgc2hvdWxkIGJlIGRpc3BsYXllZCB1cG9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0aW5nIGZ1bGwgc2NyZWVuIG1vZGUuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSA9IGZ1bmN0aW9uIChub25GdWxsU2NyZWVuUGFnZU1vZGUpIHtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZihub25GdWxsU2NyZWVuUGFnZU1vZGUsICdub25GdWxsU2NyZWVuUGFnZU1vZGUnLCBOb25GdWxsU2NyZWVuUGFnZU1vZGUpO1xuICAgICAgICB2YXIgbW9kZSA9IFBERk5hbWUub2Yobm9uRnVsbFNjcmVlblBhZ2VNb2RlKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdOb25GdWxsU2NyZWVuUGFnZU1vZGUnKSwgbW9kZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgdGhlIHByZWRvbWluYW50IHJlYWRpbmcgb3JkZXIgZm9yIHRleHQuXG4gICAgICpcbiAgICAgKiBUaGlzIGVudHJ5IGhhcyBubyBkaXJlY3QgZWZmZWN0IG9uIHRoZSBkb2N1bWVudCdzIGNvbnRlbnRzIG9yIHBhZ2VcbiAgICAgKiBudW1iZXJpbmcsIGJ1dCBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIHBvc2l0aW9uaW5nIG9mIHBhZ2VzXG4gICAgICogd2hlbiBkaXNwbGF5ZWQgc2lkZSBieSBzaWRlIG9yIHByaW50ZWQgbi11cC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQsIFJlYWRpbmdEaXJlY3Rpb24gfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCB2aWV3ZXJQcmVmcyA9IHBkZkRvYy5jYXRhbG9nLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMoKVxuICAgICAqIHZpZXdlclByZWZzLnNldFJlYWRpbmdEaXJlY3Rpb24oUmVhZGluZ0RpcmVjdGlvbi5SMkwpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVhZGluZ0RpcmVjdGlvbiBUaGUgcmVhZGluZyBvcmRlciBmb3IgdGV4dC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0UmVhZGluZ0RpcmVjdGlvbiA9IGZ1bmN0aW9uIChyZWFkaW5nRGlyZWN0aW9uKSB7XG4gICAgICAgIGFzc2VydElzT25lT2YocmVhZGluZ0RpcmVjdGlvbiwgJ3JlYWRpbmdEaXJlY3Rpb24nLCBSZWFkaW5nRGlyZWN0aW9uKTtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IFBERk5hbWUub2YocmVhZGluZ0RpcmVjdGlvbik7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRGlyZWN0aW9uJyksIGRpcmVjdGlvbik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgdGhlIHBhZ2Ugc2NhbGluZyBvcHRpb24gdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBhIHByaW50IGRpYWxvZ1xuICAgICAqIGlzIGRpc3BsYXllZCBmb3IgdGhpcyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQsIFByaW50U2NhbGluZyB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHZpZXdlclByZWZzID0gcGRmRG9jLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpXG4gICAgICogdmlld2VyUHJlZnMuc2V0UHJpbnRTY2FsaW5nKFByaW50U2NhbGluZy5Ob25lKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHByaW50U2NhbGluZyBUaGUgcHJpbnQgc2NhbGluZyBvcHRpb24uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldFByaW50U2NhbGluZyA9IGZ1bmN0aW9uIChwcmludFNjYWxpbmcpIHtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZihwcmludFNjYWxpbmcsICdwcmludFNjYWxpbmcnLCBQcmludFNjYWxpbmcpO1xuICAgICAgICB2YXIgc2NhbGluZyA9IFBERk5hbWUub2YocHJpbnRTY2FsaW5nKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdQcmludFNjYWxpbmcnKSwgc2NhbGluZyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgdGhlIHBhcGVyIGhhbmRsaW5nIG9wdGlvbiB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0IGluIHRoZVxuICAgICAqIHByaW50IGRpYWxvZy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQsIER1cGxleCB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHZpZXdlclByZWZzID0gcGRmRG9jLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpXG4gICAgICogdmlld2VyUHJlZnMuc2V0RHVwbGV4KER1cGxleC5EdXBsZXhGbGlwU2hvcnRFZGdlKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGR1cGxleCBUaGUgZG91YmxlIG9yIHNpbmdsZSBzaWRlZCBwcmludGluZyBvcHRpb24uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldER1cGxleCA9IGZ1bmN0aW9uIChkdXBsZXgpIHtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZihkdXBsZXgsICdkdXBsZXgnLCBEdXBsZXgpO1xuICAgICAgICB2YXIgZHVwID0gUERGTmFtZS5vZihkdXBsZXgpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0R1cGxleCcpLCBkdXApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHdoZXRoZXIgdGhlIFBERiBkb2N1bWVudCdzIHBhZ2Ugc2l6ZSBzaG91bGQgYmUgdXNlZCB0byBzZWxlY3QgdGhlXG4gICAgICogaW5wdXQgcGFwZXIgdHJheSB3aGVuIHByaW50aW5nLiBUaGlzIHNldHRpbmcgaW5mbHVlbmNlcyBvbmx5IHRoZSBwcmVzZXRcbiAgICAgKiB2YWx1ZXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgcHJpbnQgZGlhbG9nIHByZXNlbnRlZCBieSBhIFBERiByZWFkZXIuXG4gICAgICpcbiAgICAgKiBJZiBQaWNrVHJheUJ5UERGU2l6ZSBpcyB0cnVlLCB0aGUgY2hlY2sgYm94IGluIHRoZSBwcmludCBkaWFsb2cgYXNzb2NpYXRlZFxuICAgICAqIHdpdGggaW5wdXQgcGFwZXIgdHJheSBzaG91bGQgYmUgY2hlY2tlZC4gVGhpcyBzZXR0aW5nIGhhcyBubyBlZmZlY3Qgb25cbiAgICAgKiBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIHBpY2sgdGhlIGlucHV0IHRyYXlcbiAgICAgKiBieSBzaXplLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBpY2tUcmF5QnlQREZTaXplIGB0cnVlYCBpZiB0aGUgZG9jdW1lbnQncyBwYWdlIHNpemUgc2hvdWxkIGJlIHVzZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VsZWN0IHRoZSBpbnB1dCBwYXBlciB0cmF5LlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRQaWNrVHJheUJ5UERGU2l6ZSA9IGZ1bmN0aW9uIChwaWNrVHJheUJ5UERGU2l6ZSkge1xuICAgICAgICB2YXIgUGlja1RyYXlCeVBERlNpemUgPSB0aGlzLmRpY3QuY29udGV4dC5vYmoocGlja1RyYXlCeVBERlNpemUpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1BpY2tUcmF5QnlQREZTaXplJyksIFBpY2tUcmF5QnlQREZTaXplKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB0aGUgcGFnZSBudW1iZXJzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJpbnQgZGlhbG9nIGJveCB3aGVuIHRoZVxuICAgICAqIGZpbGUgaXMgcHJpbnRlZC4gVGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIFBERiBmaWxlIGlzIGRlbm90ZWQgYnkgMC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgUERGRG9jdW1lbnQgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCB2aWV3ZXJQcmVmcyA9IHBkZkRvYy5jYXRhbG9nLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMoKVxuICAgICAqXG4gICAgICogLy8gV2UgY2FuIHNldCB0aGUgZGVmYXVsdCBwcmludCByYW5nZSB0byBvbmx5IHRoZSBmaXJzdCBwYWdlXG4gICAgICogdmlld2VyUHJlZnMuc2V0UHJpbnRQYWdlUmFuZ2UoeyBzdGFydDogMCwgZW5kOiAwIH0pXG4gICAgICpcbiAgICAgKiAvLyBPciB3ZSBjYW4gc3VwcGx5IG5vbmNvbnRpZ3VvdXMgcmFuZ2VzIChlLmcuIHBhZ2VzIDEsIDMsIGFuZCA1LTcpXG4gICAgICogdmlld2VyUHJlZnMuc2V0UHJpbnRQYWdlUmFuZ2UoW1xuICAgICAqICAgeyBzdGFydDogMCwgZW5kOiAwIH0sXG4gICAgICogICB7IHN0YXJ0OiAyLCBlbmQ6IDIgfSxcbiAgICAgKiAgIHsgc3RhcnQ6IDQsIGVuZDogNiB9LFxuICAgICAqIF0pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJpbnRQYWdlUmFuZ2UgQW4gb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMsIGVhY2ggd2l0aCB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBgc3RhcnRgIGFuZCBgZW5kYCwgZGVub3RpbmcgYSByYW5nZSBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGluZGljZXMuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldFByaW50UGFnZVJhbmdlID0gZnVuY3Rpb24gKHByaW50UGFnZVJhbmdlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcmludFBhZ2VSYW5nZSkpXG4gICAgICAgICAgICBwcmludFBhZ2VSYW5nZSA9IFtwcmludFBhZ2VSYW5nZV07XG4gICAgICAgIHZhciBmbGF0UmFuZ2UgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gcHJpbnRQYWdlUmFuZ2UubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBmbGF0UmFuZ2UucHVzaChwcmludFBhZ2VSYW5nZVtpZHhdLnN0YXJ0KTtcbiAgICAgICAgICAgIGZsYXRSYW5nZS5wdXNoKHByaW50UGFnZVJhbmdlW2lkeF0uZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRFYWNoSXMoZmxhdFJhbmdlLCAncHJpbnRQYWdlUmFuZ2UnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIHBhZ2VSYW5nZXMgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooZmxhdFJhbmdlKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdQcmludFBhZ2VSYW5nZScpLCBwYWdlUmFuZ2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB0aGUgZGVmYXVsdCBudW1iZXIgb2YgY29waWVzIHRvIGJlIHByaW50ZWQgd2hlbiB0aGUgcHJpbnQgZGlhbG9nIGlzXG4gICAgICogb3BlbmVkIGZvciB0aGlzIGZpbGUuXG4gICAgICogQHBhcmFtIG51bUNvcGllcyBUaGUgZGVmYXVsdCBudW1iZXIgb2YgY29waWVzLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXROdW1Db3BpZXMgPSBmdW5jdGlvbiAobnVtQ29waWVzKSB7XG4gICAgICAgIGFzc2VydFJhbmdlKG51bUNvcGllcywgJ251bUNvcGllcycsIDEsIE51bWJlci5NQVhfVkFMVUUpO1xuICAgICAgICBhc3NlcnRJbnRlZ2VyKG51bUNvcGllcywgJ251bUNvcGllcycpO1xuICAgICAgICB2YXIgTnVtQ29waWVzID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKG51bUNvcGllcyk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignTnVtQ29waWVzJyksIE51bUNvcGllcyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3ZXJQcmVmZXJlbmNlcyhkaWN0KTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMuY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIHJldHVybiBuZXcgVmlld2VyUHJlZmVyZW5jZXMoZGljdCk7XG4gICAgfTtcbiAgICByZXR1cm4gVmlld2VyUHJlZmVyZW5jZXM7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgVmlld2VyUHJlZmVyZW5jZXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1WaWV3ZXJQcmVmZXJlbmNlcy5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMsIF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuL1BERk51bWJlclwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZBcnJheSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQXJyYXksIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQXJyYXkoY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5hcnJheSA9IFtdO1xuICAgICAgICBfdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZBcnJheS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIHRoaXMuYXJyYXkucHVzaChvYmplY3QpO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChpbmRleCwgb2JqZWN0KSB7XG4gICAgICAgIHRoaXMuYXJyYXkuc3BsaWNlKGluZGV4LCAwLCBvYmplY3QpO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuYXJyYXkuaW5kZXhPZihvYmplY3QpO1xuICAgICAgICByZXR1cm4gaW5kZXggPT09IC0xID8gdW5kZWZpbmVkIDogaW5kZXg7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHRoaXMuYXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoaWR4LCBvYmplY3QpIHtcbiAgICAgICAgdGhpcy5hcnJheVtpZHhdID0gb2JqZWN0O1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJheVtpbmRleF07XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUubG9va3VwTWF5YmUgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHR5cGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLmNvbnRleHQpLmxvb2t1cE1heWJlLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5cyhbdGhpcy5nZXQoaW5kZXgpXSwgdHlwZXMpKTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5sb29rdXAgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHR5cGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLmNvbnRleHQpLmxvb2t1cC5hcHBseShfYSwgX19zcHJlYWRBcnJheXMoW3RoaXMuZ2V0KGluZGV4KV0sIHR5cGVzKSk7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuYXNSZWN0YW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNpemUoKSAhPT0gNClcbiAgICAgICAgICAgIHRocm93IG5ldyBQREZBcnJheUlzTm90UmVjdGFuZ2xlRXJyb3IodGhpcy5zaXplKCkpO1xuICAgICAgICB2YXIgbG93ZXJMZWZ0WCA9IHRoaXMubG9va3VwKDAsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgdmFyIGxvd2VyTGVmdFkgPSB0aGlzLmxvb2t1cCgxLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIHZhciB1cHBlclJpZ2h0WCA9IHRoaXMubG9va3VwKDIsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgdmFyIHVwcGVyUmlnaHRZID0gdGhpcy5sb29rdXAoMywgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICB2YXIgeCA9IGxvd2VyTGVmdFg7XG4gICAgICAgIHZhciB5ID0gbG93ZXJMZWZ0WTtcbiAgICAgICAgdmFyIHdpZHRoID0gdXBwZXJSaWdodFggLSBsb3dlckxlZnRYO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gdXBwZXJSaWdodFkgLSBsb3dlckxlZnRZO1xuICAgICAgICByZXR1cm4geyB4OiB4LCB5OiB5LCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuYXNBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkuc2xpY2UoKTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBjbG9uZSA9IFBERkFycmF5LndpdGhDb250ZXh0KGNvbnRleHQgfHwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGNsb25lLnB1c2godGhpcy5hcnJheVtpZHhdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheVN0cmluZyA9ICdbICc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBhcnJheVN0cmluZyArPSB0aGlzLmdldChpZHgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBhcnJheVN0cmluZyArPSAnICc7XG4gICAgICAgIH1cbiAgICAgICAgYXJyYXlTdHJpbmcgKz0gJ10nO1xuICAgICAgICByZXR1cm4gYXJyYXlTdHJpbmc7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzaXplID0gMztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHNpemUgKz0gdGhpcy5nZXQoaWR4KS5zaXplSW5CeXRlcygpICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkxlZnRTcXVhcmVCcmFja2V0O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRoaXMuZ2V0KGlkeCkuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUmlnaHRTcXVhcmVCcmFja2V0O1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5zY2FsZVBERk51bWJlcnMgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5sb29rdXAoaWR4KTtcbiAgICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIFBERk51bWJlcikge1xuICAgICAgICAgICAgICAgIHZhciBmYWN0b3IgPSBpZHggJSAyID09PSAwID8geCA6IHk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoaWR4LCBQREZOdW1iZXIub2YoZWwuYXNOdW1iZXIoKSAqIGZhY3RvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZBcnJheS53aXRoQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7IHJldHVybiBuZXcgUERGQXJyYXkoY29udGV4dCk7IH07XG4gICAgcmV0dXJuIFBERkFycmF5O1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFycmF5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQXJyYXkuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQcml2YXRlQ29uc3RydWN0b3JFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgRU5GT1JDRVIgPSB7fTtcbnZhciBQREZCb29sID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZCb29sLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkJvb2woZW5mb3JjZXIsIHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbmZvcmNlciAhPT0gRU5GT1JDRVIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IoJ1BERkJvb2wnKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkJvb2wucHJvdG90eXBlLmFzQm9vbGVhbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBQREZCb29sLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQREZCb29sLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlKTtcbiAgICB9O1xuICAgIFBERkJvb2wucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA/IDQgOiA1O1xuICAgIH07XG4gICAgUERGQm9vbC5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy50O1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy51O1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmY7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmE7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmw7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnM7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgICAgICByZXR1cm4gNTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQm9vbC5UcnVlID0gbmV3IFBERkJvb2woRU5GT1JDRVIsIHRydWUpO1xuICAgIFBERkJvb2wuRmFsc2UgPSBuZXcgUERGQm9vbChFTkZPUkNFUiwgZmFsc2UpO1xuICAgIHJldHVybiBQREZCb29sO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkJvb2w7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZCb29sLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcywgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdWxsIGZyb20gXCIuL1BERk51bGxcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgUERGRGljdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGRGljdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZEaWN0KG1hcCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kaWN0ID0gbWFwO1xuICAgICAgICBfdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZEaWN0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmRpY3Qua2V5cygpKTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5kaWN0LnZhbHVlcygpKTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZGljdC5lbnRyaWVzKCkpO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChrZXksIHZhbHVlKTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXksIFxuICAgIC8vIFRPRE86IGBwcmVzZXJ2ZVBERk51bGxgIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gU2hvdWxkIGJlXG4gICAgLy8gcmVtb3ZlZCBpbiBuZXh0IGJyZWFraW5nIEFQSSBjaGFuZ2UuXG4gICAgcHJlc2VydmVQREZOdWxsKSB7XG4gICAgICAgIGlmIChwcmVzZXJ2ZVBERk51bGwgPT09IHZvaWQgMCkgeyBwcmVzZXJ2ZVBERk51bGwgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRpY3QuZ2V0KGtleSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gUERGTnVsbCAmJiAhcHJlc2VydmVQREZOdWxsKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRpY3QuZ2V0KGtleSk7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBQREZOdWxsO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUubG9va3VwTWF5YmUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0eXBlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBgcHJlc2VydmVQREZOdWxsYCBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNob3VsZCBiZVxuICAgICAgICAvLyByZW1vdmVkIGluIG5leHQgYnJlYWtpbmcgQVBJIGNoYW5nZS5cbiAgICAgICAgdmFyIHByZXNlcnZlUERGTnVsbCA9IHR5cGVzLmluY2x1ZGVzKFBERk51bGwpO1xuICAgICAgICB2YXIgdmFsdWUgPSAoX2EgPSB0aGlzLmNvbnRleHQpLmxvb2t1cE1heWJlLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5cyhbdGhpcy5nZXQoa2V5LCBwcmVzZXJ2ZVBERk51bGwpXSwgdHlwZXMpKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBQREZOdWxsICYmICFwcmVzZXJ2ZVBERk51bGwpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5sb29rdXAgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0eXBlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBgcHJlc2VydmVQREZOdWxsYCBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNob3VsZCBiZVxuICAgICAgICAvLyByZW1vdmVkIGluIG5leHQgYnJlYWtpbmcgQVBJIGNoYW5nZS5cbiAgICAgICAgdmFyIHByZXNlcnZlUERGTnVsbCA9IHR5cGVzLmluY2x1ZGVzKFBERk51bGwpO1xuICAgICAgICB2YXIgdmFsdWUgPSAoX2EgPSB0aGlzLmNvbnRleHQpLmxvb2t1cC5hcHBseShfYSwgX19zcHJlYWRBcnJheXMoW3RoaXMuZ2V0KGtleSwgcHJlc2VydmVQREZOdWxsKV0sIHR5cGVzKSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gUERGTnVsbCAmJiAhcHJlc2VydmVQREZOdWxsKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmRlbGV0ZShrZXkpO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuYXNNYXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwKHRoaXMuZGljdCk7XG4gICAgfTtcbiAgICAvKiogR2VuZXJhdGUgYSByYW5kb20ga2V5IHRoYXQgZG9lc24ndCBleGlzdCBpbiBjdXJyZW50IGtleSBzZXQgKi9cbiAgICBQREZEaWN0LnByb3RvdHlwZS51bmlxdWVLZXkgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIGlmICh0YWcgPT09IHZvaWQgMCkgeyB0YWcgPSAnJzsgfVxuICAgICAgICB2YXIgZXhpc3RpbmdLZXlzID0gdGhpcy5rZXlzKCk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKHRoaXMuY29udGV4dC5hZGRSYW5kb21TdWZmaXgodGFnLCAxMCkpO1xuICAgICAgICB3aGlsZSAoZXhpc3RpbmdLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIGtleSA9IFBERk5hbWUub2YodGhpcy5jb250ZXh0LmFkZFJhbmRvbVN1ZmZpeCh0YWcsIDEwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNsb25lID0gUERGRGljdC53aXRoQ29udGV4dChjb250ZXh0IHx8IHRoaXMuY29udGV4dCk7XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICAgICAgY2xvbmUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGljdFN0cmluZyA9ICc8PFxcbic7XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICAgICAgZGljdFN0cmluZyArPSBrZXkudG9TdHJpbmcoKSArICcgJyArIHZhbHVlLnRvU3RyaW5nKCkgKyAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICBkaWN0U3RyaW5nICs9ICc+Pic7XG4gICAgICAgIHJldHVybiBkaWN0U3RyaW5nO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzaXplID0gNTtcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBzaXplICs9IGtleS5zaXplSW5CeXRlcygpICsgdmFsdWUuc2l6ZUluQnl0ZXMoKSArIDI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkxlc3NUaGFuO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkxlc3NUaGFuO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGtleS5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdmFsdWUuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5HcmVhdGVyVGhhbjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5HcmVhdGVyVGhhbjtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZEaWN0LndpdGhDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQpIHsgcmV0dXJuIG5ldyBQREZEaWN0KG5ldyBNYXAoKSwgY29udGV4dCk7IH07XG4gICAgUERGRGljdC5mcm9tTWFwV2l0aENvbnRleHQgPSBmdW5jdGlvbiAobWFwLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRGljdChtYXAsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkRpY3Q7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRGljdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkRpY3QuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgsIHV0ZjE2RGVjb2RlLCB1dGYxNkVuY29kZSwgcGRmRG9jRW5jb2RpbmdEZWNvZGUsIHBhcnNlRGF0ZSwgaGFzVXRmMTZCT00sIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkhleFN0cmluZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGSGV4U3RyaW5nLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkhleFN0cmluZyh2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUuYXNCeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQXBwZW5kIGEgemVybyBpZiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpcyBvZGQuIFNlZSBQREYgc3BlYyA3LjMuNC4zXG4gICAgICAgIHZhciBoZXggPSB0aGlzLnZhbHVlICsgKHRoaXMudmFsdWUubGVuZ3RoICUgMiA9PT0gMSA/ICcwJyA6ICcnKTtcbiAgICAgICAgdmFyIGhleExlbmd0aCA9IGhleC5sZW5ndGg7XG4gICAgICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGhleC5sZW5ndGggLyAyKTtcbiAgICAgICAgdmFyIGhleE9mZnNldCA9IDA7XG4gICAgICAgIHZhciBieXRlc09mZnNldCA9IDA7XG4gICAgICAgIC8vIEludGVycHJldCBlYWNoIHBhaXIgb2YgaGV4IGRpZ2l0cyBhcyBhIHNpbmdsZSBieXRlXG4gICAgICAgIHdoaWxlIChoZXhPZmZzZXQgPCBoZXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZyhoZXhPZmZzZXQsIGhleE9mZnNldCArIDIpLCAxNik7XG4gICAgICAgICAgICBieXRlc1tieXRlc09mZnNldF0gPSBieXRlO1xuICAgICAgICAgICAgaGV4T2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBieXRlc09mZnNldCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieXRlcztcbiAgICB9O1xuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUuZGVjb2RlVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5hc0J5dGVzKCk7XG4gICAgICAgIGlmIChoYXNVdGYxNkJPTShieXRlcykpXG4gICAgICAgICAgICByZXR1cm4gdXRmMTZEZWNvZGUoYnl0ZXMpO1xuICAgICAgICByZXR1cm4gcGRmRG9jRW5jb2RpbmdEZWNvZGUoYnl0ZXMpO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5kZWNvZGVEYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGV4dCA9IHRoaXMuZGVjb2RlVGV4dCgpO1xuICAgICAgICB2YXIgZGF0ZSA9IHBhcnNlRGF0ZSh0ZXh0KTtcbiAgICAgICAgaWYgKCFkYXRlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IodGV4dCk7XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5hc1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUERGSGV4U3RyaW5nLm9mKHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiPFwiICsgdGhpcy52YWx1ZSArIFwiPlwiO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUubGVuZ3RoICsgMjtcbiAgICB9O1xuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkxlc3NUaGFuO1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy52YWx1ZSwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkdyZWF0ZXJUaGFuO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGggKyAyO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLm9mID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBuZXcgUERGSGV4U3RyaW5nKHZhbHVlKTsgfTtcbiAgICBQREZIZXhTdHJpbmcuZnJvbVRleHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGVuY29kZWQgPSB1dGYxNkVuY29kZSh2YWx1ZSk7XG4gICAgICAgIHZhciBoZXggPSAnJztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW5jb2RlZC5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGhleCArPSB0b0hleFN0cmluZ09mTWluTGVuZ3RoKGVuY29kZWRbaWR4XSwgNCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZIZXhTdHJpbmcoaGV4KTtcbiAgICB9O1xuICAgIHJldHVybiBQREZIZXhTdHJpbmc7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGSGV4U3RyaW5nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGSGV4U3RyaW5nLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbnZhciBQREZJbnZhbGlkT2JqZWN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZJbnZhbGlkT2JqZWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkludmFsaWRPYmplY3QoZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZJbnZhbGlkT2JqZWN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFBERkludmFsaWRPYmplY3Qub2YodGhpcy5kYXRhLnNsaWNlKCkpO1xuICAgIH07XG4gICAgUERGSW52YWxpZE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlBERkludmFsaWRPYmplY3QoXCIgKyB0aGlzLmRhdGEubGVuZ3RoICsgXCIgYnl0ZXMpXCI7XG4gICAgfTtcbiAgICBQREZJbnZhbGlkT2JqZWN0LnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZJbnZhbGlkT2JqZWN0LnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gdGhpcy5kYXRhW2lkeF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9O1xuICAgIFBERkludmFsaWRPYmplY3Qub2YgPSBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gbmV3IFBERkludmFsaWRPYmplY3QoZGF0YSk7IH07XG4gICAgcmV0dXJuIFBERkludmFsaWRPYmplY3Q7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGSW52YWxpZE9iamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkludmFsaWRPYmplY3QuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQcml2YXRlQ29uc3RydWN0b3JFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBJc0lycmVndWxhciB9IGZyb20gXCIuLi9zeW50YXgvSXJyZWd1bGFyXCI7XG5pbXBvcnQgeyBjaGFyRnJvbUhleENvZGUsIGNvcHlTdHJpbmdJbnRvQnVmZmVyLCB0b0NoYXJDb2RlLCB0b0hleFN0cmluZywgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBkZWNvZGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC8jKFtcXGRBQkNERUZdezJ9KS9nLCBmdW5jdGlvbiAoXywgaGV4KSB7IHJldHVybiBjaGFyRnJvbUhleENvZGUoaGV4KTsgfSk7XG59O1xudmFyIGlzUmVndWxhckNoYXIgPSBmdW5jdGlvbiAoY2hhckNvZGUpIHtcbiAgICByZXR1cm4gY2hhckNvZGUgPj0gQ2hhckNvZGVzLkV4Y2xhbWF0aW9uUG9pbnQgJiZcbiAgICAgICAgY2hhckNvZGUgPD0gQ2hhckNvZGVzLlRpbGRlICYmXG4gICAgICAgICFJc0lycmVndWxhcltjaGFyQ29kZV07XG59O1xudmFyIEVORk9SQ0VSID0ge307XG52YXIgcG9vbCA9IG5ldyBNYXAoKTtcbnZhciBQREZOYW1lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZOYW1lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk5hbWUoZW5mb3JjZXIsIG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKGVuZm9yY2VyICE9PSBFTkZPUkNFUilcbiAgICAgICAgICAgIHRocm93IG5ldyBQcml2YXRlQ29uc3RydWN0b3JFcnJvcignUERGTmFtZScpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIHZhciBlbmNvZGVkTmFtZSA9ICcvJztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbmFtZS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBjaGFyYWN0ZXIgPSBuYW1lW2lkeF07XG4gICAgICAgICAgICB2YXIgY29kZSA9IHRvQ2hhckNvZGUoY2hhcmFjdGVyKTtcbiAgICAgICAgICAgIGVuY29kZWROYW1lICs9IGlzUmVndWxhckNoYXIoY29kZSkgPyBjaGFyYWN0ZXIgOiBcIiNcIiArIHRvSGV4U3RyaW5nKGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmVuY29kZWROYW1lID0gZW5jb2RlZE5hbWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGTmFtZS5wcm90b3R5cGUuYXNCeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gW107XG4gICAgICAgIHZhciBoZXggPSAnJztcbiAgICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHB1c2hCeXRlID0gZnVuY3Rpb24gKGJ5dGUpIHtcbiAgICAgICAgICAgIGlmIChieXRlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgYnl0ZXMucHVzaChieXRlKTtcbiAgICAgICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMSwgbGVuID0gdGhpcy5lbmNvZGVkTmFtZS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBjaGFyID0gdGhpcy5lbmNvZGVkTmFtZVtpZHhdO1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0b0NoYXJDb2RlKGNoYXIpO1xuICAgICAgICAgICAgdmFyIG5leHRDaGFyID0gdGhpcy5lbmNvZGVkTmFtZVtpZHggKyAxXTtcbiAgICAgICAgICAgIGlmICghZXNjYXBlZCkge1xuICAgICAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuSGFzaClcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShieXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgoYnl0ZSA+PSBDaGFyQ29kZXMuWmVybyAmJiBieXRlIDw9IENoYXJDb2Rlcy5OaW5lKSB8fFxuICAgICAgICAgICAgICAgICAgICAoYnl0ZSA+PSBDaGFyQ29kZXMuYSAmJiBieXRlIDw9IENoYXJDb2Rlcy5mKSB8fFxuICAgICAgICAgICAgICAgICAgICAoYnl0ZSA+PSBDaGFyQ29kZXMuQSAmJiBieXRlIDw9IENoYXJDb2Rlcy5GKSkge1xuICAgICAgICAgICAgICAgICAgICBoZXggKz0gY2hhcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhleC5sZW5ndGggPT09IDIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICEoKG5leHRDaGFyID49ICcwJyAmJiBuZXh0Q2hhciA8PSAnOScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRDaGFyID49ICdhJyAmJiBuZXh0Q2hhciA8PSAnZicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRDaGFyID49ICdBJyAmJiBuZXh0Q2hhciA8PSAnRicpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUocGFyc2VJbnQoaGV4LCAxNikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGV4ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKGJ5dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICAgIH07XG4gICAgLy8gVE9ETzogVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGB1dGY4RGVjb2RlKClgXG4gICAgLy8gVE9ETzogUG9seWZpbGwgQXJyYXkuZnJvbT9cbiAgICBQREZOYW1lLnByb3RvdHlwZS5kZWNvZGVUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmFzQnl0ZXMoKTtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBBcnJheS5mcm9tKGJ5dGVzKSk7XG4gICAgfTtcbiAgICBQREZOYW1lLnByb3RvdHlwZS5hc1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZE5hbWU7XG4gICAgfTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgW1tQREZOYW1lLmFzU3RyaW5nXV0gKi9cbiAgICBQREZOYW1lLnByb3RvdHlwZS52YWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZE5hbWU7XG4gICAgfTtcbiAgICBQREZOYW1lLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQREZOYW1lLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZE5hbWU7XG4gICAgfTtcbiAgICBQREZOYW1lLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZE5hbWUubGVuZ3RoO1xuICAgIH07XG4gICAgUERGTmFtZS5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5lbmNvZGVkTmFtZSwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVkTmFtZS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZOYW1lLm9mID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGRlY29kZWRWYWx1ZSA9IGRlY29kZU5hbWUobmFtZSk7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHBvb2wuZ2V0KGRlY29kZWRWYWx1ZSk7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IFBERk5hbWUoRU5GT1JDRVIsIGRlY29kZWRWYWx1ZSk7XG4gICAgICAgICAgICBwb29sLnNldChkZWNvZGVkVmFsdWUsIGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfTtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZSBtZW1iZXItb3JkZXJpbmcgKi9cbiAgICBQREZOYW1lLkxlbmd0aCA9IFBERk5hbWUub2YoJ0xlbmd0aCcpO1xuICAgIFBERk5hbWUuRmxhdGVEZWNvZGUgPSBQREZOYW1lLm9mKCdGbGF0ZURlY29kZScpO1xuICAgIFBERk5hbWUuUmVzb3VyY2VzID0gUERGTmFtZS5vZignUmVzb3VyY2VzJyk7XG4gICAgUERGTmFtZS5Gb250ID0gUERGTmFtZS5vZignRm9udCcpO1xuICAgIFBERk5hbWUuWE9iamVjdCA9IFBERk5hbWUub2YoJ1hPYmplY3QnKTtcbiAgICBQREZOYW1lLkV4dEdTdGF0ZSA9IFBERk5hbWUub2YoJ0V4dEdTdGF0ZScpO1xuICAgIFBERk5hbWUuQ29udGVudHMgPSBQREZOYW1lLm9mKCdDb250ZW50cycpO1xuICAgIFBERk5hbWUuVHlwZSA9IFBERk5hbWUub2YoJ1R5cGUnKTtcbiAgICBQREZOYW1lLlBhcmVudCA9IFBERk5hbWUub2YoJ1BhcmVudCcpO1xuICAgIFBERk5hbWUuTWVkaWFCb3ggPSBQREZOYW1lLm9mKCdNZWRpYUJveCcpO1xuICAgIFBERk5hbWUuUGFnZSA9IFBERk5hbWUub2YoJ1BhZ2UnKTtcbiAgICBQREZOYW1lLkFubm90cyA9IFBERk5hbWUub2YoJ0Fubm90cycpO1xuICAgIFBERk5hbWUuVHJpbUJveCA9IFBERk5hbWUub2YoJ1RyaW1Cb3gnKTtcbiAgICBQREZOYW1lLkFydEJveCA9IFBERk5hbWUub2YoJ0FydEJveCcpO1xuICAgIFBERk5hbWUuQmxlZWRCb3ggPSBQREZOYW1lLm9mKCdCbGVlZEJveCcpO1xuICAgIFBERk5hbWUuQ3JvcEJveCA9IFBERk5hbWUub2YoJ0Nyb3BCb3gnKTtcbiAgICBQREZOYW1lLlJvdGF0ZSA9IFBERk5hbWUub2YoJ1JvdGF0ZScpO1xuICAgIFBERk5hbWUuVGl0bGUgPSBQREZOYW1lLm9mKCdUaXRsZScpO1xuICAgIFBERk5hbWUuQXV0aG9yID0gUERGTmFtZS5vZignQXV0aG9yJyk7XG4gICAgUERGTmFtZS5TdWJqZWN0ID0gUERGTmFtZS5vZignU3ViamVjdCcpO1xuICAgIFBERk5hbWUuQ3JlYXRvciA9IFBERk5hbWUub2YoJ0NyZWF0b3InKTtcbiAgICBQREZOYW1lLktleXdvcmRzID0gUERGTmFtZS5vZignS2V5d29yZHMnKTtcbiAgICBQREZOYW1lLlByb2R1Y2VyID0gUERGTmFtZS5vZignUHJvZHVjZXInKTtcbiAgICBQREZOYW1lLkNyZWF0aW9uRGF0ZSA9IFBERk5hbWUub2YoJ0NyZWF0aW9uRGF0ZScpO1xuICAgIFBERk5hbWUuTW9kRGF0ZSA9IFBERk5hbWUub2YoJ01vZERhdGUnKTtcbiAgICByZXR1cm4gUERGTmFtZTtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZOYW1lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGTmFtZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgUERGTnVsbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGTnVsbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZOdWxsKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERk51bGwucHJvdG90eXBlLmFzTnVsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBQREZOdWxsLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQREZOdWxsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9O1xuICAgIFBERk51bGwucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gNDtcbiAgICB9O1xuICAgIFBERk51bGwucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5uO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5sO1xuICAgICAgICByZXR1cm4gNDtcbiAgICB9O1xuICAgIHJldHVybiBQREZOdWxsO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IG5ldyBQREZOdWxsKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZOdWxsLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIG51bWJlclRvU3RyaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2luZGV4XCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xudmFyIFBERk51bWJlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGTnVtYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk51bWJlcih2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5udW1iZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBfdGhpcy5zdHJpbmdWYWx1ZSA9IG51bWJlclRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZOdW1iZXIucHJvdG90eXBlLmFzTnVtYmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXJWYWx1ZTtcbiAgICB9O1xuICAgIC8qKiBAZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBbW1BERk51bWJlci5hc051bWJlcl1dICovXG4gICAgUERGTnVtYmVyLnByb3RvdHlwZS52YWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtYmVyVmFsdWU7XG4gICAgfTtcbiAgICBQREZOdW1iZXIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUERGTnVtYmVyLm9mKHRoaXMubnVtYmVyVmFsdWUpO1xuICAgIH07XG4gICAgUERGTnVtYmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nVmFsdWU7XG4gICAgfTtcbiAgICBQREZOdW1iZXIucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdWYWx1ZS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZOdW1iZXIucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMuc3RyaW5nVmFsdWUsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nVmFsdWUubGVuZ3RoO1xuICAgIH07XG4gICAgUERGTnVtYmVyLm9mID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBuZXcgUERGTnVtYmVyKHZhbHVlKTsgfTtcbiAgICByZXR1cm4gUERGTnVtYmVyO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk51bWJlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk51bWJlci5qcy5tYXAiLCJpbXBvcnQgeyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERk9iamVjdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZPYmplY3QoKSB7XG4gICAgfVxuICAgIFBERk9iamVjdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoX2NvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnY2xvbmUnKTtcbiAgICB9O1xuICAgIFBERk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ3RvU3RyaW5nJyk7XG4gICAgfTtcbiAgICBQREZPYmplY3QucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdzaXplSW5CeXRlcycpO1xuICAgIH07XG4gICAgUERGT2JqZWN0LnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKF9idWZmZXIsIF9vZmZzZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnY29weUJ5dGVzSW50bycpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9iamVjdDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPYmplY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPYmplY3QuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuL1BERlN0cmVhbVwiO1xuaW1wb3J0IHsgYXJyYXlBc1N0cmluZyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERlJhd1N0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUmF3U3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlJhd1N0cmVhbShkaWN0LCBjb250ZW50cykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkaWN0KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb250ZW50cyA9IGNvbnRlbnRzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlJhd1N0cmVhbS5wcm90b3R5cGUuYXNVaW50OEFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50cy5zbGljZSgpO1xuICAgIH07XG4gICAgUERGUmF3U3RyZWFtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBQREZSYXdTdHJlYW0ub2YodGhpcy5kaWN0LmNsb25lKGNvbnRleHQpLCB0aGlzLmNvbnRlbnRzLnNsaWNlKCkpO1xuICAgIH07XG4gICAgUERGUmF3U3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5QXNTdHJpbmcodGhpcy5jb250ZW50cyk7XG4gICAgfTtcbiAgICBQREZSYXdTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50cztcbiAgICB9O1xuICAgIFBERlJhd1N0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50cy5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZSYXdTdHJlYW0ub2YgPSBmdW5jdGlvbiAoZGljdCwgY29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZSYXdTdHJlYW0oZGljdCwgY29udGVudHMpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlJhd1N0cmVhbTtcbn0oUERGU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBQREZSYXdTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZSYXdTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQcml2YXRlQ29uc3RydWN0b3JFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIEVORk9SQ0VSID0ge307XG52YXIgcG9vbCA9IG5ldyBNYXAoKTtcbnZhciBQREZSZWYgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlJlZiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZSZWYoZW5mb3JjZXIsIG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbk51bWJlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZW5mb3JjZXIgIT09IEVORk9SQ0VSKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yKCdQREZSZWYnKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vYmplY3ROdW1iZXIgPSBvYmplY3ROdW1iZXI7XG4gICAgICAgIF90aGlzLmdlbmVyYXRpb25OdW1iZXIgPSBnZW5lcmF0aW9uTnVtYmVyO1xuICAgICAgICBfdGhpcy50YWcgPSBvYmplY3ROdW1iZXIgKyBcIiBcIiArIGdlbmVyYXRpb25OdW1iZXIgKyBcIiBSXCI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGUmVmLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQREZSZWYucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWc7XG4gICAgfTtcbiAgICBQREZSZWYucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWcubGVuZ3RoO1xuICAgIH07XG4gICAgUERGUmVmLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLnRhZywgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy50YWcubGVuZ3RoO1xuICAgIH07XG4gICAgUERGUmVmLm9mID0gZnVuY3Rpb24gKG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbk51bWJlcikge1xuICAgICAgICBpZiAoZ2VuZXJhdGlvbk51bWJlciA9PT0gdm9pZCAwKSB7IGdlbmVyYXRpb25OdW1iZXIgPSAwOyB9XG4gICAgICAgIHZhciB0YWcgPSBvYmplY3ROdW1iZXIgKyBcIiBcIiArIGdlbmVyYXRpb25OdW1iZXIgKyBcIiBSXCI7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHBvb2wuZ2V0KHRhZyk7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IFBERlJlZihFTkZPUkNFUiwgb2JqZWN0TnVtYmVyLCBnZW5lcmF0aW9uTnVtYmVyKTtcbiAgICAgICAgICAgIHBvb2wuc2V0KHRhZywgaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICAgIHJldHVybiBQREZSZWY7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUmVmO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUmVmLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4vUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xudmFyIFBERlN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGU3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlN0cmVhbShkaWN0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmRpY3QgPSBkaWN0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlN0cmVhbS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoX2NvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnY2xvbmUnKTtcbiAgICB9O1xuICAgIFBERlN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2dldENvbnRlbnRzU3RyaW5nJyk7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdnZXRDb250ZW50cycpO1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2dldENvbnRlbnRzU2l6ZScpO1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS51cGRhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29udGVudHNTaXplID0gdGhpcy5nZXRDb250ZW50c1NpemUoKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLkxlbmd0aCwgUERGTnVtYmVyLm9mKGNvbnRlbnRzU2l6ZSkpO1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEaWN0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Quc2l6ZUluQnl0ZXMoKSArIHRoaXMuZ2V0Q29udGVudHNTaXplKCkgKyAxODtcbiAgICB9O1xuICAgIFBERlN0cmVhbS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGljdCgpO1xuICAgICAgICB2YXIgc3RyZWFtU3RyaW5nID0gdGhpcy5kaWN0LnRvU3RyaW5nKCk7XG4gICAgICAgIHN0cmVhbVN0cmluZyArPSAnXFxuc3RyZWFtXFxuJztcbiAgICAgICAgc3RyZWFtU3RyaW5nICs9IHRoaXMuZ2V0Q29udGVudHNTdHJpbmcoKTtcbiAgICAgICAgc3RyZWFtU3RyaW5nICs9ICdcXG5lbmRzdHJlYW0nO1xuICAgICAgICByZXR1cm4gc3RyZWFtU3RyaW5nO1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGljdCgpO1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMuZGljdC5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnM7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuYTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5tO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIHZhciBjb250ZW50cyA9IHRoaXMuZ2V0Q29udGVudHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gY29udGVudHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gY29udGVudHNbaWR4XTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5uO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucztcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5hO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm07XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgcmV0dXJuIFBERlN0cmVhbTtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIHBhZFN0YXJ0LCB1dGYxNkRlY29kZSwgcGRmRG9jRW5jb2RpbmdEZWNvZGUsIHRvQ2hhckNvZGUsIHBhcnNlRGF0ZSwgaGFzVXRmMTZCT00sIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERlN0cmluZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGU3RyaW5nLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlN0cmluZyh2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlN0cmluZy5wcm90b3R5cGUuYXNCeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gW107XG4gICAgICAgIHZhciBvY3RhbCA9ICcnO1xuICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgcHVzaEJ5dGUgPSBmdW5jdGlvbiAoYnl0ZSkge1xuICAgICAgICAgICAgaWYgKGJ5dGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBieXRlcy5wdXNoKGJ5dGUpO1xuICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnZhbHVlLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNoYXIgPSB0aGlzLnZhbHVlW2lkeF07XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRvQ2hhckNvZGUoY2hhcik7XG4gICAgICAgICAgICB2YXIgbmV4dENoYXIgPSB0aGlzLnZhbHVlW2lkeCArIDFdO1xuICAgICAgICAgICAgaWYgKCFlc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5CYWNrU2xhc2gpXG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoYnl0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLk5ld2xpbmUpXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkNhcnJpYWdlUmV0dXJuKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZSgpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5uKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuTmV3bGluZSk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLnIpXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5DYXJyaWFnZVJldHVybik7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLnQpXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5UYWIpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5iKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuQmFja3NwYWNlKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMuZilcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLkZvcm1GZWVkKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMuTGVmdFBhcmVuKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuTGVmdFBhcmVuKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMuUmlnaHRQYXJlbilcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLlJpZ2h0UGFyZW4pO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5CYWNrc3BhY2UpXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5CYWNrU2xhc2gpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPj0gQ2hhckNvZGVzLlplcm8gJiYgYnl0ZSA8PSBDaGFyQ29kZXMuU2V2ZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgb2N0YWwgKz0gY2hhcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9jdGFsLmxlbmd0aCA9PT0gMyB8fCAhKG5leHRDaGFyID49ICcwJyAmJiBuZXh0Q2hhciA8PSAnNycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShwYXJzZUludChvY3RhbCwgOCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2N0YWwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoYnl0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShieXRlcyk7XG4gICAgfTtcbiAgICBQREZTdHJpbmcucHJvdG90eXBlLmRlY29kZVRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBieXRlcyA9IHRoaXMuYXNCeXRlcygpO1xuICAgICAgICBpZiAoaGFzVXRmMTZCT00oYnl0ZXMpKVxuICAgICAgICAgICAgcmV0dXJuIHV0ZjE2RGVjb2RlKGJ5dGVzKTtcbiAgICAgICAgcmV0dXJuIHBkZkRvY0VuY29kaW5nRGVjb2RlKGJ5dGVzKTtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUuZGVjb2RlRGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRleHQgPSB0aGlzLmRlY29kZVRleHQoKTtcbiAgICAgICAgdmFyIGRhdGUgPSBwYXJzZURhdGUodGV4dCk7XG4gICAgICAgIGlmICghZGF0ZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yKHRleHQpO1xuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUuYXNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFBERlN0cmluZy5vZih0aGlzLnZhbHVlKTtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIihcIiArIHRoaXMudmFsdWUgKyBcIilcIjtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmxlbmd0aCArIDI7XG4gICAgfTtcbiAgICBQREZTdHJpbmcucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5MZWZ0UGFyZW47XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLnZhbHVlLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUmlnaHRQYXJlbjtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUubGVuZ3RoICsgMjtcbiAgICB9O1xuICAgIC8vIFRoZSBQREYgc3BlYyBhbGxvd3MgbmV3bGluZXMgYW5kIHBhcmVucyB0byBhcHBlYXIgZGlyZWN0bHkgd2l0aGluIGEgbGl0ZXJhbFxuICAgIC8vIHN0cmluZy4gVGhlc2UgY2hhcmFjdGVyIF9tYXlfIGJlIGVzY2FwZWQuIEJ1dCB0aGV5IGRvIG5vdCBfaGF2ZV8gdG8gYmUuIFNvXG4gICAgLy8gZm9yIHNpbXBsaWNpdHksIHdlIHdpbGwgbm90IGJvdGhlciBlc2NhcGluZyB0aGVtLlxuICAgIFBERlN0cmluZy5vZiA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gbmV3IFBERlN0cmluZyh2YWx1ZSk7IH07XG4gICAgUERGU3RyaW5nLmZyb21EYXRlID0gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgdmFyIHllYXIgPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENGdWxsWWVhcigpKSwgNCwgJzAnKTtcbiAgICAgICAgdmFyIG1vbnRoID0gcGFkU3RhcnQoU3RyaW5nKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLCAyLCAnMCcpO1xuICAgICAgICB2YXIgZGF5ID0gcGFkU3RhcnQoU3RyaW5nKGRhdGUuZ2V0VVRDRGF0ZSgpKSwgMiwgJzAnKTtcbiAgICAgICAgdmFyIGhvdXJzID0gcGFkU3RhcnQoU3RyaW5nKGRhdGUuZ2V0VVRDSG91cnMoKSksIDIsICcwJyk7XG4gICAgICAgIHZhciBtaW5zID0gcGFkU3RhcnQoU3RyaW5nKGRhdGUuZ2V0VVRDTWludXRlcygpKSwgMiwgJzAnKTtcbiAgICAgICAgdmFyIHNlY3MgPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENTZWNvbmRzKCkpLCAyLCAnMCcpO1xuICAgICAgICByZXR1cm4gbmV3IFBERlN0cmluZyhcIkQ6XCIgKyB5ZWFyICsgbW9udGggKyBkYXkgKyBob3VycyArIG1pbnMgKyBzZWNzICsgXCJaXCIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlN0cmluZztcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZTdHJpbmc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZTdHJpbmcuanMubWFwIiwiaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGT3BlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGT3BlcmF0b3IobmFtZSwgYXJncykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzIHx8IFtdO1xuICAgIH1cbiAgICBQREZPcGVyYXRvci5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgYXJncyA9IG5ldyBBcnJheSh0aGlzLmFyZ3MubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJncy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBhcmcgPSB0aGlzLmFyZ3NbaWR4XTtcbiAgICAgICAgICAgIGFyZ3NbaWR4XSA9IGFyZyBpbnN0YW5jZW9mIFBERk9iamVjdCA/IGFyZy5jbG9uZShjb250ZXh0KSA6IGFyZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YodGhpcy5uYW1lLCBhcmdzKTtcbiAgICB9O1xuICAgIFBERk9wZXJhdG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuYXJncy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhbHVlICs9IFN0cmluZyh0aGlzLmFyZ3NbaWR4XSkgKyAnICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgKz0gdGhpcy5uYW1lO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBQREZPcGVyYXRvci5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzaXplID0gMDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5hcmdzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGFyZyA9IHRoaXMuYXJnc1tpZHhdO1xuICAgICAgICAgICAgc2l6ZSArPSAoYXJnIGluc3RhbmNlb2YgUERGT2JqZWN0ID8gYXJnLnNpemVJbkJ5dGVzKCkgOiBhcmcubGVuZ3RoKSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgc2l6ZSArPSB0aGlzLm5hbWUubGVuZ3RoO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFBERk9wZXJhdG9yLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLmFyZ3MubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgYXJnID0gdGhpcy5hcmdzW2lkeF07XG4gICAgICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgUERGT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGFyZy5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihhcmcsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMubmFtZSwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERk9wZXJhdG9yLm9mID0gZnVuY3Rpb24gKG5hbWUsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZPcGVyYXRvcihuYW1lLCBhcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZPcGVyYXRvcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPcGVyYXRvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9wZXJhdG9yLmpzLm1hcCIsInZhciBQREZPcGVyYXRvck5hbWVzO1xuKGZ1bmN0aW9uIChQREZPcGVyYXRvck5hbWVzKSB7XG4gICAgLy8gTm9uIFN0cm9raW5nIENvbG9yIE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJOb25TdHJva2luZ0NvbG9yXCJdID0gXCJzY1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJOb25TdHJva2luZ0NvbG9yTlwiXSA9IFwic2NuXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JSZ2JcIl0gPSBcInJnXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JHcmF5XCJdID0gXCJnXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JDbXlrXCJdID0gXCJrXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JzcGFjZVwiXSA9IFwiY3NcIjtcbiAgICAvLyBTdHJva2luZyBDb2xvciBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU3Ryb2tpbmdDb2xvclwiXSA9IFwiU0NcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU3Ryb2tpbmdDb2xvck5cIl0gPSBcIlNDTlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yUmdiXCJdID0gXCJSR1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yR3JheVwiXSA9IFwiR1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yQ215a1wiXSA9IFwiS1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yc3BhY2VcIl0gPSBcIkNTXCI7XG4gICAgLy8gTWFya2VkIENvbnRlbnQgT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkJlZ2luTWFya2VkQ29udGVudFNlcXVlbmNlXCJdID0gXCJCRENcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQmVnaW5NYXJrZWRDb250ZW50XCJdID0gXCJCTUNcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRW5kTWFya2VkQ29udGVudFwiXSA9IFwiRU1DXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk1hcmtlZENvbnRlbnRQb2ludFdpdGhQcm9wc1wiXSA9IFwiRFBcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTWFya2VkQ29udGVudFBvaW50XCJdID0gXCJNUFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJEcmF3T2JqZWN0XCJdID0gXCJEb1wiO1xuICAgIC8vIEdyYXBoaWNzIFN0YXRlIE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDb25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeFwiXSA9IFwiY21cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiUG9wR3JhcGhpY3NTdGF0ZVwiXSA9IFwiUVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJQdXNoR3JhcGhpY3NTdGF0ZVwiXSA9IFwicVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRGbGF0bmVzc1wiXSA9IFwiaVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRHcmFwaGljc1N0YXRlUGFyYW1zXCJdID0gXCJnc1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRMaW5lQ2FwU3R5bGVcIl0gPSBcIkpcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0TGluZURhc2hQYXR0ZXJuXCJdID0gXCJkXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldExpbmVKb2luU3R5bGVcIl0gPSBcImpcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0TGluZU1pdGVyTGltaXRcIl0gPSBcIk1cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0TGluZVdpZHRoXCJdID0gXCJ3XCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFRleHRNYXRyaXhcIl0gPSBcIlRtXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFJlbmRlcmluZ0ludGVudFwiXSA9IFwicmlcIjtcbiAgICAvLyBHcmFwaGljcyBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQXBwZW5kUmVjdGFuZ2xlXCJdID0gXCJyZVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJCZWdpbklubGluZUltYWdlXCJdID0gXCJCSVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJCZWdpbklubGluZUltYWdlRGF0YVwiXSA9IFwiSURcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRW5kSW5saW5lSW1hZ2VcIl0gPSBcIkVJXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsaXBFdmVuT2RkXCJdID0gXCJXKlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDbGlwTm9uWmVyb1wiXSA9IFwiV1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDbG9zZUFuZFN0cm9rZVwiXSA9IFwic1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDbG9zZUZpbGxFdmVuT2RkQW5kU3Ryb2tlXCJdID0gXCJiKlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDbG9zZUZpbGxOb25aZXJvQW5kU3Ryb2tlXCJdID0gXCJiXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsb3NlUGF0aFwiXSA9IFwiaFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJBcHBlbmRCZXppZXJDdXJ2ZVwiXSA9IFwiY1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDdXJ2ZVRvUmVwbGljYXRlRmluYWxQb2ludFwiXSA9IFwieVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDdXJ2ZVRvUmVwbGljYXRlSW5pdGlhbFBvaW50XCJdID0gXCJ2XCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkVuZFBhdGhcIl0gPSBcIm5cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRmlsbEV2ZW5PZGRBbmRTdHJva2VcIl0gPSBcIkIqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkZpbGxFdmVuT2RkXCJdID0gXCJmKlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJGaWxsTm9uWmVyb0FuZFN0cm9rZVwiXSA9IFwiQlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJGaWxsTm9uWmVyb1wiXSA9IFwiZlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJMZWdhY3lGaWxsTm9uWmVyb1wiXSA9IFwiRlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJMaW5lVG9cIl0gPSBcImxcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTW92ZVRvXCJdID0gXCJtXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNoYWRpbmdGaWxsXCJdID0gXCJzaFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2VQYXRoXCJdID0gXCJTXCI7XG4gICAgLy8gVGV4dCBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQmVnaW5UZXh0XCJdID0gXCJCVFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJFbmRUZXh0XCJdID0gXCJFVFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJNb3ZlVGV4dFwiXSA9IFwiVGRcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTW92ZVRleHRTZXRMZWFkaW5nXCJdID0gXCJURFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJOZXh0TGluZVwiXSA9IFwiVCpcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0Q2hhcmFjdGVyU3BhY2luZ1wiXSA9IFwiVGNcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0Rm9udEFuZFNpemVcIl0gPSBcIlRmXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFRleHRIb3Jpem9udGFsU2NhbGluZ1wiXSA9IFwiVHpcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0VGV4dExpbmVIZWlnaHRcIl0gPSBcIlRMXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFRleHRSZW5kZXJpbmdNb2RlXCJdID0gXCJUclwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRUZXh0UmlzZVwiXSA9IFwiVHNcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0V29yZFNwYWNpbmdcIl0gPSBcIlR3XCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNob3dUZXh0XCJdID0gXCJUalwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTaG93VGV4dEFkanVzdGVkXCJdID0gXCJUSlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTaG93VGV4dExpbmVcIl0gPSBcIidcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2hvd1RleHRMaW5lQW5kU3BhY2VcIl0gPSBcIlxcXCJcIjtcbiAgICAvLyBUeXBlMyBGb250IE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJUeXBlM0QwXCJdID0gXCJkMFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJUeXBlM0QxXCJdID0gXCJkMVwiO1xuICAgIC8vIENvbXBhdGliaWxpdHkgU2VjdGlvbiBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQmVnaW5Db21wYXRpYmlsaXR5U2VjdGlvblwiXSA9IFwiQlhcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRW5kQ29tcGF0aWJpbGl0eVNlY3Rpb25cIl0gPSBcIkVYXCI7XG59KShQREZPcGVyYXRvck5hbWVzIHx8IChQREZPcGVyYXRvck5hbWVzID0ge30pKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9wZXJhdG9yTmFtZXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPcGVyYXRvck5hbWVzLmpzLm1hcCIsImltcG9ydCB7IE51bWJlclBhcnNpbmdFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IElzRGlnaXQsIElzTnVtZXJpYyB9IGZyb20gXCIuLi9zeW50YXgvTnVtZXJpY1wiO1xuaW1wb3J0IHsgSXNXaGl0ZXNwYWNlIH0gZnJvbSBcIi4uL3N5bnRheC9XaGl0ZXNwYWNlXCI7XG5pbXBvcnQgeyBjaGFyRnJvbUNvZGUgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBOZXdsaW5lID0gQ2hhckNvZGVzLk5ld2xpbmUsIENhcnJpYWdlUmV0dXJuID0gQ2hhckNvZGVzLkNhcnJpYWdlUmV0dXJuO1xuLy8gVE9ETzogVGhyb3cgZXJyb3IgaWYgZW9mIGlzIHJlYWNoZWQgYmVmb3JlIGZpbmlzaGluZyBvYmplY3QgcGFyc2UuLi5cbnZhciBCYXNlUGFyc2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2VQYXJzZXIoYnl0ZXMsIGNhcE51bWJlcnMpIHtcbiAgICAgICAgaWYgKGNhcE51bWJlcnMgPT09IHZvaWQgMCkgeyBjYXBOdW1iZXJzID0gZmFsc2U7IH1cbiAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzO1xuICAgICAgICB0aGlzLmNhcE51bWJlcnMgPSBjYXBOdW1iZXJzO1xuICAgIH1cbiAgICBCYXNlUGFyc2VyLnByb3RvdHlwZS5wYXJzZVJhd0ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoIUlzRGlnaXRbYnl0ZV0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB2YWx1ZSArPSBjaGFyRnJvbUNvZGUodGhpcy5ieXRlcy5uZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBudW1iZXJWYWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGlmICghdmFsdWUgfHwgIWlzRmluaXRlKG51bWJlclZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlclBhcnNpbmdFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyVmFsdWU7XG4gICAgfTtcbiAgICAvLyBUT0RPOiBNYXliZSBoYW5kbGUgZXhwb25lbnRpYWwgZm9ybWF0P1xuICAgIC8vIFRPRE86IENvbXBhcmUgcGVyZm9ybWFuY2Ugb2Ygc3RyaW5nIGNvbmNhdGVuYXRpb24gdG8gY2hhckZyb21Db2RlKC4uLmJ5dGVzKVxuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLnBhcnNlUmF3TnVtYmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgLy8gUGFyc2UgaW50ZWdlci1wYXJ0LCB0aGUgbGVhZGluZyAoKyB8IC0gfCAuIHwgMC05KVxuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKCFJc051bWVyaWNbYnl0ZV0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB2YWx1ZSArPSBjaGFyRnJvbUNvZGUodGhpcy5ieXRlcy5uZXh0KCkpO1xuICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5QZXJpb2QpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGFyc2UgZGVjaW1hbC1wYXJ0LCB0aGUgdHJhaWxpbmcgKDAtOSlcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIGlmICghSXNEaWdpdFtieXRlXSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHZhbHVlICs9IGNoYXJGcm9tQ29kZSh0aGlzLmJ5dGVzLm5leHQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG51bWJlclZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAhaXNGaW5pdGUobnVtYmVyVmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyUGFyc2luZ0Vycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudW1iZXJWYWx1ZSA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYXBOdW1iZXJzKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1zZyA9IFwiUGFyc2VkIG51bWJlciB0aGF0IGlzIHRvbyBsYXJnZSBmb3Igc29tZSBQREYgcmVhZGVyczogXCIgKyB2YWx1ZSArIFwiLCB1c2luZyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiBpbnN0ZWFkLlwiO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBtc2cgPSBcIlBhcnNlZCBudW1iZXIgdGhhdCBpcyB0b28gbGFyZ2UgZm9yIHNvbWUgUERGIHJlYWRlcnM6IFwiICsgdmFsdWUgKyBcIiwgbm90IGNhcHBpbmcuXCI7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bWJlclZhbHVlO1xuICAgIH07XG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUuc2tpcFdoaXRlc3BhY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkgJiYgSXNXaGl0ZXNwYWNlW3RoaXMuYnl0ZXMucGVlaygpXSkge1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLnNraXBMaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKGJ5dGUgPT09IE5ld2xpbmUgfHwgYnl0ZSA9PT0gQ2FycmlhZ2VSZXR1cm4pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLnNraXBDb21tZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5ieXRlcy5wZWVrKCkgIT09IENoYXJDb2Rlcy5QZXJjZW50KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKGJ5dGUgPT09IE5ld2xpbmUgfHwgYnl0ZSA9PT0gQ2FycmlhZ2VSZXR1cm4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2UoKTtcbiAgICAgICAgd2hpbGUgKHRoaXMuc2tpcENvbW1lbnQoKSlcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2UoKTtcbiAgICB9O1xuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLm1hdGNoS2V5d29yZCA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0ga2V5d29yZC5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ5dGVzLmRvbmUoKSB8fCB0aGlzLmJ5dGVzLm5leHQoKSAhPT0ga2V5d29yZFtpZHhdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8oaW5pdGlhbE9mZnNldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgcmV0dXJuIEJhc2VQYXJzZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQmFzZVBhcnNlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhc2VQYXJzZXIuanMubWFwIiwiaW1wb3J0IHsgTmV4dEJ5dGVBc3NlcnRpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IGRlY29kZVBERlJhd1N0cmVhbSB9IGZyb20gXCIuLi9zdHJlYW1zL2RlY29kZVwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuLy8gVE9ETzogU2VlIGhvdyBsaW5lL2NvbCB0cmFja2luZyBhZmZlY3RzIHBlcmZvcm1hbmNlXG52YXIgQnl0ZVN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCeXRlU3RyZWFtKGJ5dGVzKSB7XG4gICAgICAgIHRoaXMuaWR4ID0gMDtcbiAgICAgICAgdGhpcy5saW5lID0gMDtcbiAgICAgICAgdGhpcy5jb2x1bW4gPSAwO1xuICAgICAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5ieXRlcy5sZW5ndGg7XG4gICAgfVxuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLm1vdmVUbyA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5pZHggPSBvZmZzZXQ7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXNbdGhpcy5pZHgrK107XG4gICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTmV3bGluZSkge1xuICAgICAgICAgICAgdGhpcy5saW5lICs9IDE7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbiArPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieXRlO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUuYXNzZXJ0TmV4dCA9IGZ1bmN0aW9uIChleHBlY3RlZCkge1xuICAgICAgICBpZiAodGhpcy5wZWVrKCkgIT09IGV4cGVjdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTmV4dEJ5dGVBc3NlcnRpb25FcnJvcih0aGlzLnBvc2l0aW9uKCksIGV4cGVjdGVkLCB0aGlzLnBlZWsoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5pZHhdO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUucGVla0FoZWFkID0gZnVuY3Rpb24gKHN0ZXBzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMuaWR4ICsgc3RlcHNdO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUucGVla0F0ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ieXRlc1tvZmZzZXRdO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUuZG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWR4ID49IHRoaXMubGVuZ3RoO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZHg7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUucG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7IGxpbmU6IHRoaXMubGluZSwgY29sdW1uOiB0aGlzLmNvbHVtbiwgb2Zmc2V0OiB0aGlzLmlkeCB9O1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5vZiA9IGZ1bmN0aW9uIChieXRlcykgeyByZXR1cm4gbmV3IEJ5dGVTdHJlYW0oYnl0ZXMpOyB9O1xuICAgIEJ5dGVTdHJlYW0uZnJvbVBERlJhd1N0cmVhbSA9IGZ1bmN0aW9uIChyYXdTdHJlYW0pIHtcbiAgICAgICAgcmV0dXJuIEJ5dGVTdHJlYW0ub2YoZGVjb2RlUERGUmF3U3RyZWFtKHJhd1N0cmVhbSkuZGVjb2RlKCkpO1xuICAgIH07XG4gICAgcmV0dXJuIEJ5dGVTdHJlYW07XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQnl0ZVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJ5dGVTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQREZPYmplY3RQYXJzaW5nRXJyb3IsIFBERlN0cmVhbVBhcnNpbmdFcnJvciwgVW5iYWxhbmNlZFBhcmVudGhlc2lzRXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGQm9vbCBmcm9tIFwiLi4vb2JqZWN0cy9QREZCb29sXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bGwgZnJvbSBcIi4uL29iamVjdHMvUERGTnVsbFwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZSYXdTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGUmF3U3RyZWFtXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBCYXNlUGFyc2VyIGZyb20gXCIuL0Jhc2VQYXJzZXJcIjtcbmltcG9ydCBCeXRlU3RyZWFtIGZyb20gXCIuL0J5dGVTdHJlYW1cIjtcbmltcG9ydCBQREZDYXRhbG9nIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERkNhdGFsb2dcIjtcbmltcG9ydCBQREZQYWdlTGVhZiBmcm9tIFwiLi4vc3RydWN0dXJlcy9QREZQYWdlTGVhZlwiO1xuaW1wb3J0IFBERlBhZ2VUcmVlIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERlBhZ2VUcmVlXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBJc0RlbGltaXRlciB9IGZyb20gXCIuLi9zeW50YXgvRGVsaW1pdGVyc1wiO1xuaW1wb3J0IHsgS2V5d29yZHMgfSBmcm9tIFwiLi4vc3ludGF4L0tleXdvcmRzXCI7XG5pbXBvcnQgeyBJc0RpZ2l0LCBJc051bWVyaWMgfSBmcm9tIFwiLi4vc3ludGF4L051bWVyaWNcIjtcbmltcG9ydCB7IElzV2hpdGVzcGFjZSB9IGZyb20gXCIuLi9zeW50YXgvV2hpdGVzcGFjZVwiO1xuaW1wb3J0IHsgY2hhckZyb21Db2RlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vLyBUT0RPOiBUaHJvdyBlcnJvciBpZiBlb2YgaXMgcmVhY2hlZCBiZWZvcmUgZmluaXNoaW5nIG9iamVjdCBwYXJzZS4uLlxudmFyIFBERk9iamVjdFBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGT2JqZWN0UGFyc2VyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk9iamVjdFBhcnNlcihieXRlU3RyZWFtLCBjb250ZXh0LCBjYXBOdW1iZXJzKSB7XG4gICAgICAgIGlmIChjYXBOdW1iZXJzID09PSB2b2lkIDApIHsgY2FwTnVtYmVycyA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGJ5dGVTdHJlYW0sIGNhcE51bWJlcnMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIFRPRE86IElzIGl0IHBvc3NpYmxlIHRvIHJlZHVjZSBkdXBsaWNhdGUgcGFyc2luZyBmb3IgcmVmIGxvb2thaGVhZHM/XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZU9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy50cnVlKSlcbiAgICAgICAgICAgIHJldHVybiBQREZCb29sLlRydWU7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5mYWxzZSkpXG4gICAgICAgICAgICByZXR1cm4gUERGQm9vbC5GYWxzZTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLm51bGwpKVxuICAgICAgICAgICAgcmV0dXJuIFBERk51bGw7XG4gICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTGVzc1RoYW4gJiZcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMucGVla0FoZWFkKDEpID09PSBDaGFyQ29kZXMuTGVzc1RoYW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGljdE9yU3RyZWFtKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5MZXNzVGhhbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlSGV4U3RyaW5nKCk7XG4gICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTGVmdFBhcmVuKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VTdHJpbmcoKTtcbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5Gb3J3YXJkU2xhc2gpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU5hbWUoKTtcbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5MZWZ0U3F1YXJlQnJhY2tldClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlQXJyYXkoKTtcbiAgICAgICAgaWYgKElzTnVtZXJpY1tieXRlXSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlTnVtYmVyT3JSZWYoKTtcbiAgICAgICAgdGhyb3cgbmV3IFBERk9iamVjdFBhcnNpbmdFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCksIGJ5dGUpO1xuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZU51bWJlck9yUmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZmlyc3ROdW0gPSB0aGlzLnBhcnNlUmF3TnVtYmVyKCk7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgbG9va2FoZWFkU3RhcnQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICBpZiAoSXNEaWdpdFt0aGlzLmJ5dGVzLnBlZWsoKV0pIHtcbiAgICAgICAgICAgIHZhciBzZWNvbmROdW0gPSB0aGlzLnBhcnNlUmF3TnVtYmVyKCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ5dGVzLnBlZWsoKSA9PT0gQ2hhckNvZGVzLlIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLlIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQREZSZWYub2YoZmlyc3ROdW0sIHNlY29uZE51bSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8obG9va2FoZWFkU3RhcnQpO1xuICAgICAgICByZXR1cm4gUERGTnVtYmVyLm9mKGZpcnN0TnVtKTtcbiAgICB9O1xuICAgIC8vIFRPRE86IE1heWJlIHVwZGF0ZSBQREZIZXhTdHJpbmcub2YoKSBsb2dpYyB0byByZW1vdmUgd2hpdGVzcGFjZSBhbmQgdmFsaWRhdGUgaW5wdXQ/XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZUhleFN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuTGVzc1RoYW4pO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpICYmIHRoaXMuYnl0ZXMucGVlaygpICE9PSBDaGFyQ29kZXMuR3JlYXRlclRoYW4pIHtcbiAgICAgICAgICAgIHZhbHVlICs9IGNoYXJGcm9tQ29kZSh0aGlzLmJ5dGVzLm5leHQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5HcmVhdGVyVGhhbik7XG4gICAgICAgIHJldHVybiBQREZIZXhTdHJpbmcub2YodmFsdWUpO1xuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5lc3RpbmdMdmwgPSAwO1xuICAgICAgICB2YXIgaXNFc2NhcGVkID0gZmFsc2U7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICAgICAgdmFsdWUgKz0gY2hhckZyb21Db2RlKGJ5dGUpO1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHVuZXNjYXBlZCBwYXJlbnRoZXNpc1xuICAgICAgICAgICAgaWYgKCFpc0VzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkxlZnRQYXJlbilcbiAgICAgICAgICAgICAgICAgICAgbmVzdGluZ0x2bCArPSAxO1xuICAgICAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuUmlnaHRQYXJlbilcbiAgICAgICAgICAgICAgICAgICAgbmVzdGluZ0x2bCAtPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJhY2sgd2hldGhlciBjdXJyZW50IGNoYXJhY3RlciBpcyBiZWluZyBlc2NhcGVkIG9yIG5vdFxuICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5CYWNrU2xhc2gpIHtcbiAgICAgICAgICAgICAgICBpc0VzY2FwZWQgPSAhaXNFc2NhcGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNFc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgaXNFc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPbmNlIChpZikgdGhlIHVuZXNjYXBlZCBwYXJlbnRoZXNpcyBiYWxhbmNlIG91dCwgcmV0dXJuIHRoZWlyIGNvbnRlbnRzXG4gICAgICAgICAgICBpZiAobmVzdGluZ0x2bCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb3V0ZXIgcGFyZW5zIHNvIHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlIGNvbnRlbnRzXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBERlN0cmluZy5vZih2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCkpO1xuICAgIH07XG4gICAgLy8gVE9ETzogQ29tcGFyZSBwZXJmb3JtYW5jZSBvZiBzdHJpbmcgY29uY2F0ZW5hdGlvbiB0byBjaGFyRnJvbUNvZGUoLi4uYnl0ZXMpXG4gICAgLy8gVE9ETzogTWF5YmUgcHJlYWxsb2NhdGUgc21hbGwgVWludDhBcnJheSBpZiBjYW4gdXNlIGNoYXJGcm9tQ29kZT9cbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5Gb3J3YXJkU2xhc2gpO1xuICAgICAgICB2YXIgbmFtZSA9ICcnO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKElzV2hpdGVzcGFjZVtieXRlXSB8fCBJc0RlbGltaXRlcltieXRlXSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIG5hbWUgKz0gY2hhckZyb21Db2RlKGJ5dGUpO1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBERk5hbWUub2YobmFtZSk7XG4gICAgfTtcbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuTGVmdFNxdWFyZUJyYWNrZXQpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIHBkZkFycmF5ID0gUERGQXJyYXkud2l0aENvbnRleHQodGhpcy5jb250ZXh0KTtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnl0ZXMucGVlaygpICE9PSBDaGFyQ29kZXMuUmlnaHRTcXVhcmVCcmFja2V0KSB7XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMucGFyc2VPYmplY3QoKTtcbiAgICAgICAgICAgIHBkZkFycmF5LnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLlJpZ2h0U3F1YXJlQnJhY2tldCk7XG4gICAgICAgIHJldHVybiBwZGZBcnJheTtcbiAgICB9O1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkxlc3NUaGFuKTtcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5MZXNzVGhhbik7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgZGljdCA9IG5ldyBNYXAoKTtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSAmJlxuICAgICAgICAgICAgdGhpcy5ieXRlcy5wZWVrKCkgIT09IENoYXJDb2Rlcy5HcmVhdGVyVGhhbiAmJlxuICAgICAgICAgICAgdGhpcy5ieXRlcy5wZWVrQWhlYWQoMSkgIT09IENoYXJDb2Rlcy5HcmVhdGVyVGhhbikge1xuICAgICAgICAgICAgdmFyIGtleSA9IHRoaXMucGFyc2VOYW1lKCk7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnBhcnNlT2JqZWN0KCk7XG4gICAgICAgICAgICBkaWN0LnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkdyZWF0ZXJUaGFuKTtcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5HcmVhdGVyVGhhbik7XG4gICAgICAgIHZhciBUeXBlID0gZGljdC5nZXQoUERGTmFtZS5vZignVHlwZScpKTtcbiAgICAgICAgaWYgKFR5cGUgPT09IFBERk5hbWUub2YoJ0NhdGFsb2cnKSkge1xuICAgICAgICAgICAgcmV0dXJuIFBERkNhdGFsb2cuZnJvbU1hcFdpdGhDb250ZXh0KGRpY3QsIHRoaXMuY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoVHlwZSA9PT0gUERGTmFtZS5vZignUGFnZXMnKSkge1xuICAgICAgICAgICAgcmV0dXJuIFBERlBhZ2VUcmVlLmZyb21NYXBXaXRoQ29udGV4dChkaWN0LCB0aGlzLmNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFR5cGUgPT09IFBERk5hbWUub2YoJ1BhZ2UnKSkge1xuICAgICAgICAgICAgcmV0dXJuIFBERlBhZ2VMZWFmLmZyb21NYXBXaXRoQ29udGV4dChkaWN0LCB0aGlzLmNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFBERkRpY3QuZnJvbU1hcFdpdGhDb250ZXh0KGRpY3QsIHRoaXMuY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VEaWN0T3JTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuYnl0ZXMucG9zaXRpb24oKTtcbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLnBhcnNlRGljdCgpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdHJlYW1FT0YxKSAmJlxuICAgICAgICAgICAgIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0cmVhbUVPRjIpICYmXG4gICAgICAgICAgICAhdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RyZWFtRU9GMykgJiZcbiAgICAgICAgICAgICF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdHJlYW1FT0Y0KSAmJlxuICAgICAgICAgICAgIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0cmVhbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkaWN0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgIHZhciBlbmQ7XG4gICAgICAgIHZhciBMZW5ndGggPSBkaWN0LmdldChQREZOYW1lLm9mKCdMZW5ndGgnKSk7XG4gICAgICAgIGlmIChMZW5ndGggaW5zdGFuY2VvZiBQREZOdW1iZXIpIHtcbiAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgTGVuZ3RoLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhlbmQpO1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVuZHN0cmVhbSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhzdGFydCk7XG4gICAgICAgICAgICAgICAgZW5kID0gdGhpcy5maW5kRW5kT2ZTdHJlYW1GYWxsYmFjayhzdGFydFBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmZpbmRFbmRPZlN0cmVhbUZhbGxiYWNrKHN0YXJ0UG9zKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudHMgPSB0aGlzLmJ5dGVzLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgICByZXR1cm4gUERGUmF3U3RyZWFtLm9mKGRpY3QsIGNvbnRlbnRzKTtcbiAgICB9O1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUuZmluZEVuZE9mU3RyZWFtRmFsbGJhY2sgPSBmdW5jdGlvbiAoc3RhcnRQb3MpIHtcbiAgICAgICAgLy8gTW92ZSB0byBlbmQgb2Ygc3RyZWFtLCB3aGlsZSBoYW5kbGluZyBuZXN0ZWQgc3RyZWFtc1xuICAgICAgICB2YXIgbmVzdGluZ0x2bCA9IDE7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0cmVhbSkpIHtcbiAgICAgICAgICAgICAgICBuZXN0aW5nTHZsICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5FT0YxZW5kc3RyZWFtKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLkVPRjJlbmRzdHJlYW0pIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuRU9GM2VuZHN0cmVhbSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lbmRzdHJlYW0pKSB7XG4gICAgICAgICAgICAgICAgbmVzdGluZ0x2bCAtPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmVzdGluZ0x2bCA9PT0gMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAobmVzdGluZ0x2bCAhPT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBQREZTdHJlYW1QYXJzaW5nRXJyb3Ioc3RhcnRQb3MpO1xuICAgICAgICByZXR1cm4gZW5kO1xuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLmZvckJ5dGVzID0gZnVuY3Rpb24gKGJ5dGVzLCBjb250ZXh0LCBjYXBOdW1iZXJzKSB7IHJldHVybiBuZXcgUERGT2JqZWN0UGFyc2VyKEJ5dGVTdHJlYW0ub2YoYnl0ZXMpLCBjb250ZXh0LCBjYXBOdW1iZXJzKTsgfTtcbiAgICBQREZPYmplY3RQYXJzZXIuZm9yQnl0ZVN0cmVhbSA9IGZ1bmN0aW9uIChieXRlU3RyZWFtLCBjb250ZXh0LCBjYXBOdW1iZXJzKSB7XG4gICAgICAgIGlmIChjYXBOdW1iZXJzID09PSB2b2lkIDApIHsgY2FwTnVtYmVycyA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiBuZXcgUERGT2JqZWN0UGFyc2VyKGJ5dGVTdHJlYW0sIGNvbnRleHQsIGNhcE51bWJlcnMpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9iamVjdFBhcnNlcjtcbn0oQmFzZVBhcnNlcikpO1xuZXhwb3J0IGRlZmF1bHQgUERGT2JqZWN0UGFyc2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT2JqZWN0UGFyc2VyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUmVwYXJzZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgQnl0ZVN0cmVhbSBmcm9tIFwiLi9CeXRlU3RyZWFtXCI7XG5pbXBvcnQgUERGT2JqZWN0UGFyc2VyIGZyb20gXCIuL1BERk9iamVjdFBhcnNlclwiO1xuaW1wb3J0IHsgd2FpdEZvclRpY2sgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZPYmplY3RTdHJlYW1QYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk9iamVjdFN0cmVhbVBhcnNlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZPYmplY3RTdHJlYW1QYXJzZXIocmF3U3RyZWFtLCBzaG91bGRXYWl0Rm9yVGljaykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBCeXRlU3RyZWFtLmZyb21QREZSYXdTdHJlYW0ocmF3U3RyZWFtKSwgcmF3U3RyZWFtLmRpY3QuY29udGV4dCkgfHwgdGhpcztcbiAgICAgICAgdmFyIGRpY3QgPSByYXdTdHJlYW0uZGljdDtcbiAgICAgICAgX3RoaXMuYWxyZWFkeVBhcnNlZCA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5zaG91bGRXYWl0Rm9yVGljayA9IHNob3VsZFdhaXRGb3JUaWNrIHx8IChmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfSk7XG4gICAgICAgIF90aGlzLmZpcnN0T2Zmc2V0ID0gZGljdC5sb29rdXAoUERGTmFtZS5vZignRmlyc3QnKSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICBfdGhpcy5vYmplY3RDb3VudCA9IGRpY3QubG9va3VwKFBERk5hbWUub2YoJ04nKSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERk9iamVjdFN0cmVhbVBhcnNlci5wcm90b3R5cGUucGFyc2VJbnRvQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldHNBbmRPYmplY3ROdW1iZXJzLCBpZHgsIGxlbiwgX2EsIG9iamVjdE51bWJlciwgb2Zmc2V0LCBvYmplY3QsIHJlZjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFscmVhZHlQYXJzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVwYXJzZUVycm9yKCdQREZPYmplY3RTdHJlYW1QYXJzZXInLCAncGFyc2VJbnRvQ29udGV4dCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5UGFyc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNBbmRPYmplY3ROdW1iZXJzID0gdGhpcy5wYXJzZU9mZnNldHNBbmRPYmplY3ROdW1iZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAwLCBsZW4gPSBvZmZzZXRzQW5kT2JqZWN0TnVtYmVycy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBvZmZzZXRzQW5kT2JqZWN0TnVtYmVyc1tpZHhdLCBvYmplY3ROdW1iZXIgPSBfYS5vYmplY3ROdW1iZXIsIG9mZnNldCA9IF9hLm9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKHRoaXMuZmlyc3RPZmZzZXQgKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5wYXJzZU9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gUERGUmVmLm9mKG9iamVjdE51bWJlciwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYXNzaWduKHJlZiwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRXYWl0Rm9yVGljaygpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbVBhcnNlci5wcm90b3R5cGUucGFyc2VPZmZzZXRzQW5kT2JqZWN0TnVtYmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9mZnNldHNBbmRPYmplY3ROdW1iZXJzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub2JqZWN0Q291bnQ7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgdmFyIG9iamVjdE51bWJlciA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgICAgIG9mZnNldHNBbmRPYmplY3ROdW1iZXJzLnB1c2goeyBvYmplY3ROdW1iZXI6IG9iamVjdE51bWJlciwgb2Zmc2V0OiBvZmZzZXQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldHNBbmRPYmplY3ROdW1iZXJzO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtUGFyc2VyLmZvclN0cmVhbSA9IGZ1bmN0aW9uIChyYXdTdHJlYW0sIHNob3VsZFdhaXRGb3JUaWNrKSB7IHJldHVybiBuZXcgUERGT2JqZWN0U3RyZWFtUGFyc2VyKHJhd1N0cmVhbSwgc2hvdWxkV2FpdEZvclRpY2spOyB9O1xuICAgIHJldHVybiBQREZPYmplY3RTdHJlYW1QYXJzZXI7XG59KFBERk9iamVjdFBhcnNlcikpO1xuZXhwb3J0IGRlZmF1bHQgUERGT2JqZWN0U3RyZWFtUGFyc2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT2JqZWN0U3RyZWFtUGFyc2VyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkNyb3NzUmVmU2VjdGlvbiBmcm9tIFwiLi4vZG9jdW1lbnQvUERGQ3Jvc3NSZWZTZWN0aW9uXCI7XG5pbXBvcnQgUERGSGVhZGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZIZWFkZXJcIjtcbmltcG9ydCBQREZUcmFpbGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZUcmFpbGVyXCI7XG5pbXBvcnQgeyBNaXNzaW5nS2V5d29yZEVycm9yLCBNaXNzaW5nUERGSGVhZGVyRXJyb3IsIFBERkludmFsaWRPYmplY3RQYXJzaW5nRXJyb3IsIFJlcGFyc2VFcnJvciwgU3RhbGxlZFBhcnNlckVycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZJbnZhbGlkT2JqZWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkludmFsaWRPYmplY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZSYXdTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGUmF3U3RyZWFtXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IEJ5dGVTdHJlYW0gZnJvbSBcIi4vQnl0ZVN0cmVhbVwiO1xuaW1wb3J0IFBERk9iamVjdFBhcnNlciBmcm9tIFwiLi9QREZPYmplY3RQYXJzZXJcIjtcbmltcG9ydCBQREZPYmplY3RTdHJlYW1QYXJzZXIgZnJvbSBcIi4vUERGT2JqZWN0U3RyZWFtUGFyc2VyXCI7XG5pbXBvcnQgUERGWFJlZlN0cmVhbVBhcnNlciBmcm9tIFwiLi9QREZYUmVmU3RyZWFtUGFyc2VyXCI7XG5pbXBvcnQgUERGQ29udGV4dCBmcm9tIFwiLi4vUERGQ29udGV4dFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgS2V5d29yZHMgfSBmcm9tIFwiLi4vc3ludGF4L0tleXdvcmRzXCI7XG5pbXBvcnQgeyBJc0RpZ2l0IH0gZnJvbSBcIi4uL3N5bnRheC9OdW1lcmljXCI7XG5pbXBvcnQgeyB3YWl0Rm9yVGljayB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERlBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUGFyc2VyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlBhcnNlcihwZGZCeXRlcywgb2JqZWN0c1BlclRpY2ssIHRocm93T25JbnZhbGlkT2JqZWN0LCBjYXBOdW1iZXJzKSB7XG4gICAgICAgIGlmIChvYmplY3RzUGVyVGljayA9PT0gdm9pZCAwKSB7IG9iamVjdHNQZXJUaWNrID0gSW5maW5pdHk7IH1cbiAgICAgICAgaWYgKHRocm93T25JbnZhbGlkT2JqZWN0ID09PSB2b2lkIDApIHsgdGhyb3dPbkludmFsaWRPYmplY3QgPSBmYWxzZTsgfVxuICAgICAgICBpZiAoY2FwTnVtYmVycyA9PT0gdm9pZCAwKSB7IGNhcE51bWJlcnMgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBCeXRlU3RyZWFtLm9mKHBkZkJ5dGVzKSwgUERGQ29udGV4dC5jcmVhdGUoKSwgY2FwTnVtYmVycykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuYWxyZWFkeVBhcnNlZCA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5wYXJzZWRPYmplY3RzID0gMDtcbiAgICAgICAgX3RoaXMuc2hvdWxkV2FpdEZvclRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5wYXJzZWRPYmplY3RzICs9IDE7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMucGFyc2VkT2JqZWN0cyAlIF90aGlzLm9iamVjdHNQZXJUaWNrID09PSAwO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5vYmplY3RzUGVyVGljayA9IG9iamVjdHNQZXJUaWNrO1xuICAgICAgICBfdGhpcy50aHJvd09uSW52YWxpZE9iamVjdCA9IHRocm93T25JbnZhbGlkT2JqZWN0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlBhcnNlci5wcm90b3R5cGUucGFyc2VEb2N1bWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHByZXZPZmZzZXQsIG9mZnNldDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFscmVhZHlQYXJzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVwYXJzZUVycm9yKCdQREZQYXJzZXInLCAncGFyc2VEb2N1bWVudCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHJlYWR5UGFyc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5oZWFkZXIgPSB0aGlzLnBhcnNlSGVhZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMuYnl0ZXMuZG9uZSgpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucGFyc2VEb2N1bWVudFNlY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSBwcmV2T2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0YWxsZWRQYXJzZXJFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldk9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heWJlUmVjb3ZlclJvb3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQubG9va3VwKFBERlJlZi5vZigwKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlbW92aW5nIHBhcnNlZCBvYmplY3Q6IDAgMCBSJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRlbGV0ZShQREZSZWYub2YoMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY29udGV4dF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5tYXliZVJlY292ZXJSb290ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXNWYWxpZENhdGFsb2cgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgUERGRGljdCAmJlxuICAgICAgICAgICAgICAgIG9iai5sb29rdXAoUERGTmFtZS5vZignVHlwZScpKSA9PT0gUERGTmFtZS5vZignQ2F0YWxvZycpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgY2F0YWxvZyA9IHRoaXMuY29udGV4dC5sb29rdXAodGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLlJvb3QpO1xuICAgICAgICBpZiAoIWlzVmFsaWRDYXRhbG9nKGNhdGFsb2cpKSB7XG4gICAgICAgICAgICB2YXIgaW5kaXJlY3RPYmplY3RzID0gdGhpcy5jb250ZXh0LmVudW1lcmF0ZUluZGlyZWN0T2JqZWN0cygpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gaW5kaXJlY3RPYmplY3RzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IGluZGlyZWN0T2JqZWN0c1tpZHhdLCByZWYgPSBfYVswXSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgICAgICAgICAgaWYgKGlzVmFsaWRDYXRhbG9nKG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLlJvb3QgPSByZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnBhcnNlSGVhZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuaGVhZGVyKSkge1xuICAgICAgICAgICAgICAgIHZhciBtYWpvciA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLlBlcmlvZCk7XG4gICAgICAgICAgICAgICAgdmFyIG1pbm9yID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICAgICAgICAgIHZhciBoZWFkZXIgPSBQREZIZWFkZXIuZm9yVmVyc2lvbihtYWpvciwgbWlub3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcEJpbmFyeUhlYWRlckNvbW1lbnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQREZIZWFkZXJFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCkpO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5wYXJzZUluZGlyZWN0T2JqZWN0SGVhZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIG9iamVjdE51bWJlciA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBnZW5lcmF0aW9uTnVtYmVyID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5vYmopKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0tleXdvcmRFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCksIEtleXdvcmRzLm9iaik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBERlJlZi5vZihvYmplY3ROdW1iZXIsIGdlbmVyYXRpb25OdW1iZXIpO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5tYXRjaEluZGlyZWN0T2JqZWN0SGVhZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3RIZWFkZXIoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhpbml0aWFsT2Zmc2V0KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5wYXJzZUluZGlyZWN0T2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVmLCBvYmplY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3RIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gdGhpcy5wYXJzZU9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVuZG9iaikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93IG5ldyBNaXNzaW5nS2V5d29yZEVycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSwgS2V5d29yZHMuZW5kb2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IExvZyBhIHdhcm5pbmcgaWYgdGhpcyBmYWlscy4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZW5kb2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFBERlJhd1N0cmVhbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdUeXBlJykpID09PSBQREZOYW1lLm9mKCdPYmpTdG0nKSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUERGT2JqZWN0U3RyZWFtUGFyc2VyLmZvclN0cmVhbShvYmplY3QsIHRoaXMuc2hvdWxkV2FpdEZvclRpY2spLnBhcnNlSW50b0NvbnRleHQoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUERGUmF3U3RyZWFtICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1R5cGUnKSkgPT09IFBERk5hbWUub2YoJ1hSZWYnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERlhSZWZTdHJlYW1QYXJzZXIuZm9yU3RyZWFtKG9iamVjdCkucGFyc2VJbnRvQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFzc2lnbihyZWYsIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gVE9ETzogSW1wcm92ZSBhbmQgY2xlYW4gdGhpcyB1cFxuICAgIFBERlBhcnNlci5wcm90b3R5cGUudHJ5VG9QYXJzZUludmFsaWRJbmRpcmVjdE9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5ieXRlcy5wb3NpdGlvbigpO1xuICAgICAgICB2YXIgbXNnID0gXCJUcnlpbmcgdG8gcGFyc2UgaW52YWxpZCBvYmplY3Q6IFwiICsgSlNPTi5zdHJpbmdpZnkoc3RhcnRQb3MpICsgXCIpXCI7XG4gICAgICAgIGlmICh0aGlzLnRocm93T25JbnZhbGlkT2JqZWN0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5wYXJzZUluZGlyZWN0T2JqZWN0SGVhZGVyKCk7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkludmFsaWQgb2JqZWN0IHJlZjogXCIgKyByZWYpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgdmFyIGZhaWxlZCA9IHRydWU7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lbmRvYmopKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZhaWxlZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvcihzdGFydFBvcyk7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpIC0gS2V5d29yZHMuZW5kb2JqLmxlbmd0aDtcbiAgICAgICAgdmFyIG9iamVjdCA9IFBERkludmFsaWRPYmplY3Qub2YodGhpcy5ieXRlcy5zbGljZShzdGFydCwgZW5kKSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5hc3NpZ24ocmVmLCBvYmplY3QpO1xuICAgICAgICByZXR1cm4gcmVmO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5wYXJzZUluZGlyZWN0T2JqZWN0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQsIGVfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISghdGhpcy5ieXRlcy5kb25lKCkgJiYgSXNEaWdpdFt0aGlzLmJ5dGVzLnBlZWsoKV0pKSByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxPZmZzZXQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzIsIDQsICwgNV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5wYXJzZUluZGlyZWN0T2JqZWN0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQWRkIHRyYWNpbmcvbG9nZ2luZyBtZWNoYW5pc20gdG8gdHJhY2sgd2hlbiB0aGlzIGhhcHBlbnMhXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhpbml0aWFsT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9QYXJzZUludmFsaWRJbmRpcmVjdE9iamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ2FuIHRoaXMgYmUgZG9uZSBvbmx5IHdoZW4gbmVlZGVkLCB0byBhdm9pZCBoYXJtaW5nIHBlcmZvcm1hbmNlP1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwSmliYmVyaXNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEZvclRpY2soKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB3YWl0Rm9yVGljaygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLm1heWJlUGFyc2VDcm9zc1JlZlNlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnhyZWYpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIG9iamVjdE51bWJlciA9IC0xO1xuICAgICAgICB2YXIgeHJlZiA9IFBERkNyb3NzUmVmU2VjdGlvbi5jcmVhdGVFbXB0eSgpO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpICYmIElzRGlnaXRbdGhpcy5ieXRlcy5wZWVrKCldKSB7XG4gICAgICAgICAgICB2YXIgZmlyc3RJbnQgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgIHZhciBzZWNvbmRJbnQgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLm4gfHwgYnl0ZSA9PT0gQ2hhckNvZGVzLmYpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVmID0gUERGUmVmLm9mKG9iamVjdE51bWJlciwgc2Vjb25kSW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ieXRlcy5uZXh0KCkgPT09IENoYXJDb2Rlcy5uKSB7XG4gICAgICAgICAgICAgICAgICAgIHhyZWYuYWRkRW50cnkocmVmLCBmaXJzdEludCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmNvbnRleHQuZGVsZXRlKHJlZik7XG4gICAgICAgICAgICAgICAgICAgIHhyZWYuYWRkRGVsZXRlZEVudHJ5KHJlZiwgZmlyc3RJbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvYmplY3ROdW1iZXIgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9iamVjdE51bWJlciA9IGZpcnN0SW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHhyZWY7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLm1heWJlUGFyc2VUcmFpbGVyRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMudHJhaWxlcikpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgZGljdCA9IHRoaXMucGFyc2VEaWN0KCk7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LnRyYWlsZXJJbmZvID0ge1xuICAgICAgICAgICAgUm9vdDogZGljdC5nZXQoUERGTmFtZS5vZignUm9vdCcpKSB8fCBjb250ZXh0LnRyYWlsZXJJbmZvLlJvb3QsXG4gICAgICAgICAgICBFbmNyeXB0OiBkaWN0LmdldChQREZOYW1lLm9mKCdFbmNyeXB0JykpIHx8IGNvbnRleHQudHJhaWxlckluZm8uRW5jcnlwdCxcbiAgICAgICAgICAgIEluZm86IGRpY3QuZ2V0KFBERk5hbWUub2YoJ0luZm8nKSkgfHwgY29udGV4dC50cmFpbGVySW5mby5JbmZvLFxuICAgICAgICAgICAgSUQ6IGRpY3QuZ2V0KFBERk5hbWUub2YoJ0lEJykpIHx8IGNvbnRleHQudHJhaWxlckluZm8uSUQsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLm1heWJlUGFyc2VUcmFpbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdGFydHhyZWYpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZSgpO1xuICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lb2YpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZW9mKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHJldHVybiBQREZUcmFpbGVyLmZvckxhc3RDcm9zc1JlZlNlY3Rpb25PZmZzZXQob2Zmc2V0KTtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUucGFyc2VEb2N1bWVudFNlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5wYXJzZUluZGlyZWN0T2JqZWN0cygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXliZVBhcnNlQ3Jvc3NSZWZTZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heWJlUGFyc2VUcmFpbGVyRGljdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXliZVBhcnNlVHJhaWxlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ2FuIHRoaXMgYmUgZG9uZSBvbmx5IHdoZW4gbmVlZGVkLCB0byBhdm9pZCBoYXJtaW5nIHBlcmZvcm1hbmNlP1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwSmliYmVyaXNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhpcyBvcGVyYXRpb24gaXMgbm90IG5lY2Vzc2FyeSBmb3IgdmFsaWQgUERGIGZpbGVzLiBCdXQgc29tZSBpbnZhbGlkIFBERnNcbiAgICAgKiBjb250YWluIGppYmJlcmlzaCBpbiBiZXR3ZWVuIGluZGlyZWN0IG9iamVjdHMuIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvXG4gICAgICogc2tpcCBwYXN0IHRoYXQgamliYmVyaXNoLCBzaG91bGQgaXQgZXhpc3QsIHVudGlsIGl0IHJlYWNoZXMgdGhlIG5leHRcbiAgICAgKiBpbmRpcmVjdCBvYmplY3QgaGVhZGVyLCBhbiB4cmVmIHRhYmxlIHNlY3Rpb24sIG9yIHRoZSBmaWxlIHRyYWlsZXIuXG4gICAgICovXG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5za2lwSmliYmVyaXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIHZhciBpc0FscGhhTnVtZXJpYyA9IGJ5dGUgPj0gQ2hhckNvZGVzLlNwYWNlICYmIGJ5dGUgPD0gQ2hhckNvZGVzLlRpbGRlO1xuICAgICAgICAgICAgaWYgKGlzQWxwaGFOdW1lcmljKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnhyZWYpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnRyYWlsZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0YXJ0eHJlZikgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaEluZGlyZWN0T2JqZWN0SGVhZGVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8oaW5pdGlhbE9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTa2lwcyB0aGUgYmluYXJ5IGNvbW1lbnQgZm9sbG93aW5nIGEgUERGIGhlYWRlci4gVGhlIHNwZWNpZmljYXRpb25cbiAgICAgKiBkZWZpbmVzIHRoaXMgYmluYXJ5IGNvbW1lbnQgKHNlY3Rpb24gNy41LjIgRmlsZSBIZWFkZXIpIGFzIGEgc2VxdWVuY2Ugb2YgNFxuICAgICAqIG9yIG1vcmUgYnl0ZXMgdGhhdCBhcmUgMTI4IG9yIGdyZWF0ZXIsIGFuZCB3aGljaCBhcmUgcHJlY2VkZWQgYnkgYSBcIiVcIi5cbiAgICAgKlxuICAgICAqIFRoaXMgd291bGQgaW1wbHkgdGhhdCB0byBzdHJpcCBvdXQgdGhpcyBiaW5hcnkgY29tbWVudCwgd2UgY291bGQgY2hlY2sgZm9yXG4gICAgICogYSBzZXF1ZW5jZSBvZiBieXRlcyBzdGFydGluZyB3aXRoIFwiJVwiLCBhbmQgcmVtb3ZlIGFsbCBzdWJzZXF1ZW50IGJ5dGVzIHRoYXRcbiAgICAgKiBhcmUgMTI4IG9yIGdyZWF0ZXIuIFRoaXMgd29ya3MgZm9yIG1hbnkgZG9jdW1lbnRzIHRoYXQgcHJvcGVybHkgY29tcGx5IHdpdGhcbiAgICAgKiB0aGUgc3BlYy4gQnV0IGluIHRoZSB3aWxkLCB0aGVyZSBhcmUgUERGcyB0aGF0IG9taXQgdGhlIGxlYWRpbmcgXCIlXCIsIGFuZFxuICAgICAqIGluY2x1ZGUgYnl0ZXMgdGhhdCBhcmUgbGVzcyB0aGFuIDEyOCAoZS5nLiAwIG9yIDEpLiBTbyBpbiBvcmRlciB0byBwYXJzZVxuICAgICAqIHRoZXNlIGhlYWRlcnMgY29ycmVjdGx5LCB3ZSBqdXN0IHRocm93IG91dCBhbGwgYnl0ZXMgbGVhZGluZyB1cCB0byB0aGVcbiAgICAgKiBmaXJzdCBpbmRpcmVjdCBvYmplY3QgaGVhZGVyLlxuICAgICAqL1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUuc2tpcEJpbmFyeUhlYWRlckNvbW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICAgICAgdGhpcy5wYXJzZUluZGlyZWN0T2JqZWN0SGVhZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhpbml0aWFsT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGUGFyc2VyLmZvckJ5dGVzV2l0aE9wdGlvbnMgPSBmdW5jdGlvbiAocGRmQnl0ZXMsIG9iamVjdHNQZXJUaWNrLCB0aHJvd09uSW52YWxpZE9iamVjdCwgY2FwTnVtYmVycykge1xuICAgICAgICByZXR1cm4gbmV3IFBERlBhcnNlcihwZGZCeXRlcywgb2JqZWN0c1BlclRpY2ssIHRocm93T25JbnZhbGlkT2JqZWN0LCBjYXBOdW1iZXJzKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZQYXJzZXI7XG59KFBERk9iamVjdFBhcnNlcikpO1xuZXhwb3J0IGRlZmF1bHQgUERGUGFyc2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUGFyc2VyLmpzLm1hcCIsImltcG9ydCB7IFJlcGFyc2VFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgQnl0ZVN0cmVhbSBmcm9tIFwiLi9CeXRlU3RyZWFtXCI7XG52YXIgUERGWFJlZlN0cmVhbVBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZYUmVmU3RyZWFtUGFyc2VyKHJhd1N0cmVhbSkge1xuICAgICAgICB0aGlzLmFscmVhZHlQYXJzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaWN0ID0gcmF3U3RyZWFtLmRpY3Q7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBCeXRlU3RyZWFtLmZyb21QREZSYXdTdHJlYW0ocmF3U3RyZWFtKTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5kaWN0LmNvbnRleHQ7XG4gICAgICAgIHZhciBTaXplID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdTaXplJyksIFBERk51bWJlcik7XG4gICAgICAgIHZhciBJbmRleCA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignSW5kZXgnKSk7XG4gICAgICAgIGlmIChJbmRleCBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNlY3Rpb25zID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBJbmRleC5zaXplKCk7IGlkeCA8IGxlbjsgaWR4ICs9IDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3RPYmplY3ROdW1iZXIgPSBJbmRleC5sb29rdXAoaWR4ICsgMCwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGhfMSA9IEluZGV4Lmxvb2t1cChpZHggKyAxLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzZWN0aW9ucy5wdXNoKHsgZmlyc3RPYmplY3ROdW1iZXI6IGZpcnN0T2JqZWN0TnVtYmVyLCBsZW5ndGg6IGxlbmd0aF8xIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdWJzZWN0aW9ucyA9IFt7IGZpcnN0T2JqZWN0TnVtYmVyOiAwLCBsZW5ndGg6IFNpemUuYXNOdW1iZXIoKSB9XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgVyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignVycpLCBQREZBcnJheSk7XG4gICAgICAgIHRoaXMuYnl0ZVdpZHRocyA9IFstMSwgLTEsIC0xXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gVy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHRoaXMuYnl0ZVdpZHRoc1tpZHhdID0gVy5sb29rdXAoaWR4LCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUERGWFJlZlN0cmVhbVBhcnNlci5wcm90b3R5cGUucGFyc2VJbnRvQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxyZWFkeVBhcnNlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlcGFyc2VFcnJvcignUERGWFJlZlN0cmVhbVBhcnNlcicsICdwYXJzZUludG9Db250ZXh0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbHJlYWR5UGFyc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvID0ge1xuICAgICAgICAgICAgUm9vdDogdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdSb290JykpLFxuICAgICAgICAgICAgRW5jcnlwdDogdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdFbmNyeXB0JykpLFxuICAgICAgICAgICAgSW5mbzogdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdJbmZvJykpLFxuICAgICAgICAgICAgSUQ6IHRoaXMuZGljdC5nZXQoUERGTmFtZS5vZignSUQnKSksXG4gICAgICAgIH07XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5wYXJzZUVudHJpZXMoKTtcbiAgICAgICAgLy8gZm9yIChsZXQgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgLy8gY29uc3QgZW50cnkgPSBlbnRyaWVzW2lkeF07XG4gICAgICAgIC8vIGlmIChlbnRyeS5kZWxldGVkKSB0aGlzLmNvbnRleHQuZGVsZXRlKGVudHJ5LnJlZik7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfTtcbiAgICBQREZYUmVmU3RyZWFtUGFyc2VyLnByb3RvdHlwZS5wYXJzZUVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgICAgIHZhciBfYSA9IHRoaXMuYnl0ZVdpZHRocywgdHlwZUZpZWxkV2lkdGggPSBfYVswXSwgb2Zmc2V0RmllbGRXaWR0aCA9IF9hWzFdLCBnZW5GaWVsZFdpZHRoID0gX2FbMl07XG4gICAgICAgIGZvciAodmFyIHN1YnNlY3Rpb25JZHggPSAwLCBzdWJzZWN0aW9uTGVuID0gdGhpcy5zdWJzZWN0aW9ucy5sZW5ndGg7IHN1YnNlY3Rpb25JZHggPCBzdWJzZWN0aW9uTGVuOyBzdWJzZWN0aW9uSWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYiA9IHRoaXMuc3Vic2VjdGlvbnNbc3Vic2VjdGlvbklkeF0sIGZpcnN0T2JqZWN0TnVtYmVyID0gX2IuZmlyc3RPYmplY3ROdW1iZXIsIGxlbmd0aF8yID0gX2IubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgb2JqSWR4ID0gMDsgb2JqSWR4IDwgbGVuZ3RoXzI7IG9iaklkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHR5cGUgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHR5cGVGaWVsZFdpZHRoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAodHlwZSA8PCA4KSB8IHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvZmZzZXRGaWVsZFdpZHRoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IChvZmZzZXQgPDwgOCkgfCB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGdlbmVyYXRpb25OdW1iZXIgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdlbkZpZWxkV2lkdGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbk51bWJlciA9IChnZW5lcmF0aW9uTnVtYmVyIDw8IDgpIHwgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGB0eXBlYCBmaWVsZCBpcyBhYnNlbnQsIGl0IGRlZmF1bHRzIHRvIDFcbiAgICAgICAgICAgICAgICBpZiAodHlwZUZpZWxkV2lkdGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAxO1xuICAgICAgICAgICAgICAgIHZhciBvYmplY3ROdW1iZXIgPSBmaXJzdE9iamVjdE51bWJlciArIG9iaklkeDtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZjogUERGUmVmLm9mKG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbk51bWJlciksXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVkOiB0eXBlID09PSAwLFxuICAgICAgICAgICAgICAgICAgICBpbk9iamVjdFN0cmVhbTogdHlwZSA9PT0gMixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfTtcbiAgICBQREZYUmVmU3RyZWFtUGFyc2VyLmZvclN0cmVhbSA9IGZ1bmN0aW9uIChyYXdTdHJlYW0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZYUmVmU3RyZWFtUGFyc2VyKHJhd1N0cmVhbSk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGWFJlZlN0cmVhbVBhcnNlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZYUmVmU3RyZWFtUGFyc2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGWFJlZlN0cmVhbVBhcnNlci5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIEFzY2lpODVTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgQXNjaWk4NVN0cmVhbSBjbGFzcyBpbiBNb3ppbGxhJ3MgcGRmLmpzIHByb2plY3QsIG1hZGUgYXZhaWxhYmxlXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZSBsaWNlbnNlLlxuICovXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBEZWNvZGVTdHJlYW0gZnJvbSBcIi4vRGVjb2RlU3RyZWFtXCI7XG52YXIgaXNTcGFjZSA9IGZ1bmN0aW9uIChjaCkge1xuICAgIHJldHVybiBjaCA9PT0gMHgyMCB8fCBjaCA9PT0gMHgwOSB8fCBjaCA9PT0gMHgwZCB8fCBjaCA9PT0gMHgwYTtcbn07XG52YXIgQXNjaWk4NVN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXNjaWk4NVN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBc2NpaTg1U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgX3RoaXMuaW5wdXQgPSBuZXcgVWludDhBcnJheSg1KTtcbiAgICAgICAgLy8gTW9zdCBzdHJlYW1zIGluY3JlYXNlIGluIHNpemUgd2hlbiBkZWNvZGVkLCBidXQgQXNjaWk4NSBzdHJlYW1zXG4gICAgICAgIC8vIHR5cGljYWxseSBzaHJpbmsgYnkgfjIwJS5cbiAgICAgICAgaWYgKG1heWJlTGVuZ3RoKSB7XG4gICAgICAgICAgICBtYXliZUxlbmd0aCA9IDAuOCAqIG1heWJlTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQXNjaWk4NVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgVElMREFfQ0hBUiA9IDB4N2U7IC8vICd+J1xuICAgICAgICB2YXIgWl9MT1dFUl9DSEFSID0gMHg3YTsgLy8gJ3onXG4gICAgICAgIHZhciBFT0YgPSAtMTtcbiAgICAgICAgdmFyIHN0cmVhbSA9IHRoaXMuc3RyZWFtO1xuICAgICAgICB2YXIgYyA9IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgIHdoaWxlIChpc1NwYWNlKGMpKSB7XG4gICAgICAgICAgICBjID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHtcbiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHZhciBidWZmZXI7XG4gICAgICAgIHZhciBpO1xuICAgICAgICAvLyBzcGVjaWFsIGNvZGUgZm9yIHpcbiAgICAgICAgaWYgKGMgPT09IFpfTE9XRVJfQ0hBUikge1xuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgNCk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCArIGldID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IDQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLmlucHV0O1xuICAgICAgICAgICAgaW5wdXRbMF0gPSBjO1xuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7ICsraSkge1xuICAgICAgICAgICAgICAgIGMgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChpc1NwYWNlKGMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnB1dFtpXSA9IGM7XG4gICAgICAgICAgICAgICAgaWYgKGMgPT09IEVPRiB8fCBjID09PSBUSUxEQV9DSEFSKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIGkgLSAxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IGkgLSAxO1xuICAgICAgICAgICAgLy8gcGFydGlhbCBlbmRpbmc7XG4gICAgICAgICAgICBpZiAoaSA8IDUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IDU7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFtpXSA9IDB4MjEgKyA4NDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHQgPSAwO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkge1xuICAgICAgICAgICAgICAgIHQgPSB0ICogODUgKyAoaW5wdXRbaV0gLSAweDIxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDM7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCArIGldID0gdCAmIDB4ZmY7XG4gICAgICAgICAgICAgICAgdCA+Pj0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEFzY2lpODVTdHJlYW07XG59KERlY29kZVN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgQXNjaWk4NVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzY2lpODVTdHJlYW0uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBBc2NpaUhleFN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBBc2NpaUhleFN0cmVhbSBjbGFzcyBpbiBNb3ppbGxhJ3MgcGRmLmpzIHByb2plY3QsIG1hZGUgYXZhaWxhYmxlXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZSBsaWNlbnNlLlxuICovXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBEZWNvZGVTdHJlYW0gZnJvbSBcIi4vRGVjb2RlU3RyZWFtXCI7XG52YXIgQXNjaWlIZXhTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFzY2lpSGV4U3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFzY2lpSGV4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgX3RoaXMuZmlyc3REaWdpdCA9IC0xO1xuICAgICAgICAvLyBNb3N0IHN0cmVhbXMgaW5jcmVhc2UgaW4gc2l6ZSB3aGVuIGRlY29kZWQsIGJ1dCBBc2NpaUhleCBzdHJlYW1zIHNocmlua1xuICAgICAgICAvLyBieSA1MCUuXG4gICAgICAgIGlmIChtYXliZUxlbmd0aCkge1xuICAgICAgICAgICAgbWF5YmVMZW5ndGggPSAwLjUgKiBtYXliZUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEFzY2lpSGV4U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBVUFNUUkVBTV9CTE9DS19TSVpFID0gODAwMDtcbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZXMoVVBTVFJFQU1fQkxPQ0tfU0laRSk7XG4gICAgICAgIGlmICghYnl0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1heERlY29kZUxlbmd0aCA9IChieXRlcy5sZW5ndGggKyAxKSA+PiAxO1xuICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBtYXhEZWNvZGVMZW5ndGgpO1xuICAgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHZhciBmaXJzdERpZ2l0ID0gdGhpcy5maXJzdERpZ2l0O1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2ggPSBieXRlc1tpXTtcbiAgICAgICAgICAgIHZhciBkaWdpdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHtcbiAgICAgICAgICAgICAgICAvLyAnMCctJzknXG4gICAgICAgICAgICAgICAgZGlnaXQgPSBjaCAmIDB4MGY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgoY2ggPj0gMHg0MSAmJiBjaCA8PSAweDQ2KSB8fCAoY2ggPj0gMHg2MSAmJiBjaCA8PSAweDY2KSkge1xuICAgICAgICAgICAgICAgIC8vICdBJy0nWicsICdhJy0neidcbiAgICAgICAgICAgICAgICBkaWdpdCA9IChjaCAmIDB4MGYpICsgOTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAweDNlKSB7XG4gICAgICAgICAgICAgICAgLy8gJz4nXG4gICAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgd2hpdGVzcGFjZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpZ25vcmluZ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0RGlnaXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgZmlyc3REaWdpdCA9IGRpZ2l0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IChmaXJzdERpZ2l0IDw8IDQpIHwgZGlnaXQ7XG4gICAgICAgICAgICAgICAgZmlyc3REaWdpdCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaXJzdERpZ2l0ID49IDAgJiYgdGhpcy5lb2YpIHtcbiAgICAgICAgICAgIC8vIGluY29tcGxldGUgYnl0ZVxuICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IGZpcnN0RGlnaXQgPDwgNDtcbiAgICAgICAgICAgIGZpcnN0RGlnaXQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpcnN0RGlnaXQgPSBmaXJzdERpZ2l0O1xuICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDtcbiAgICB9O1xuICAgIHJldHVybiBBc2NpaUhleFN0cmVhbTtcbn0oRGVjb2RlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBBc2NpaUhleFN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzY2lpSGV4U3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgU3RyZWFtIGZyb20gXCIuL1N0cmVhbVwiO1xuLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBEZWNvZGVTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgRGVjb2RlU3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbi8vIExvdHMgb2YgRGVjb2RlU3RyZWFtcyBhcmUgY3JlYXRlZCB3aG9zZSBidWZmZXJzIGFyZSBuZXZlciB1c2VkLiAgRm9yIHRoZXNlXG4vLyB3ZSBzaGFyZSBhIHNpbmdsZSBlbXB0eSBidWZmZXIuIFRoaXMgaXMgKGEpIHNwYWNlLWVmZmljaWVudCBhbmQgKGIpIGF2b2lkc1xuLy8gaGF2aW5nIHNwZWNpYWwgY2FzZXMgdGhhdCB3b3VsZCBiZSByZXF1aXJlZCBpZiB3ZSB1c2VkIHxudWxsfCBmb3IgYW4gZW1wdHlcbi8vIGJ1ZmZlci5cbnZhciBlbXB0eUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuLyoqXG4gKiBTdXBlciBjbGFzcyBmb3IgdGhlIGRlY29kaW5nIHN0cmVhbXNcbiAqL1xudmFyIERlY29kZVN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWNvZGVTdHJlYW0obWF5YmVNaW5CdWZmZXJMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuZW9mID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gZW1wdHlCdWZmZXI7XG4gICAgICAgIHRoaXMubWluQnVmZmVyTGVuZ3RoID0gNTEyO1xuICAgICAgICBpZiAobWF5YmVNaW5CdWZmZXJMZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGZpcnN0IHBvd2VyIG9mIHR3byB0aGF0IGlzIGFzIGJpZyBhcyBtYXliZU1pbkJ1ZmZlckxlbmd0aC5cbiAgICAgICAgICAgIHdoaWxlICh0aGlzLm1pbkJ1ZmZlckxlbmd0aCA8IG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggKj0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVjb2RlU3RyZWFtLnByb3RvdHlwZSwgXCJpc0VtcHR5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB3aGlsZSAoIXRoaXMuZW9mICYmIHRoaXMuYnVmZmVyTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlckxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUuZ2V0Qnl0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gcG9zKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5lb2YpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXTtcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUuZ2V0VWludDE2ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChiMCA8PCA4KSArIGIxO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5nZXRJbnQzMiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjIgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIzID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5nZXRCeXRlcyA9IGZ1bmN0aW9uIChsZW5ndGgsIGZvcmNlQ2xhbXBlZCkge1xuICAgICAgICBpZiAoZm9yY2VDbGFtcGVkID09PSB2b2lkIDApIHsgZm9yY2VDbGFtcGVkID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIGVuZDtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyBsZW5ndGgpO1xuICAgICAgICAgICAgZW5kID0gcG9zICsgbGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA8IGVuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYnVmRW5kID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gYnVmRW5kKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gYnVmRW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKCF0aGlzLmVvZikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgdmFyIHN1YmFycmF5ID0gdGhpcy5idWZmZXIuc3ViYXJyYXkocG9zLCBlbmQpO1xuICAgICAgICAvLyBgdGhpcy5idWZmZXJgIGlzIGVpdGhlciBhIGBVaW50OEFycmF5YCBvciBgVWludDhDbGFtcGVkQXJyYXlgIGhlcmUuXG4gICAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgJiYgIShzdWJhcnJheSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KVxuICAgICAgICAgICAgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpXG4gICAgICAgICAgICA6IHN1YmFycmF5O1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5wZWVrQnl0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBlZWtlZEJ5dGUgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdGhpcy5wb3MtLTtcbiAgICAgICAgcmV0dXJuIHBlZWtlZEJ5dGU7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnBlZWtCeXRlcyA9IGZ1bmN0aW9uIChsZW5ndGgsIGZvcmNlQ2xhbXBlZCkge1xuICAgICAgICBpZiAoZm9yY2VDbGFtcGVkID09PSB2b2lkIDApIHsgZm9yY2VDbGFtcGVkID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCk7XG4gICAgICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgaWYgKCFuKSB7XG4gICAgICAgICAgICBuID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyArPSBuO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5tYWtlU3ViU3RyZWFtID0gZnVuY3Rpb24gKHN0YXJ0LCBsZW5ndGggLyogZGljdCAqLykge1xuICAgICAgICB2YXIgZW5kID0gc3RhcnQgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlICh0aGlzLmJ1ZmZlckxlbmd0aCA8PSBlbmQgJiYgIXRoaXMuZW9mKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU3RyZWFtKHRoaXMuYnVmZmVyLCBzdGFydCwgbGVuZ3RoIC8qIGRpY3QgKi8pO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5lb2YpXG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuc3ViYXJyYXkoMCwgdGhpcy5idWZmZXJMZW5ndGgpO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ3JlYWRCbG9jaycpO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5lbnN1cmVCdWZmZXIgPSBmdW5jdGlvbiAocmVxdWVzdGVkKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgaWYgKHJlcXVlc3RlZCA8PSBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2l6ZSA9IHRoaXMubWluQnVmZmVyTGVuZ3RoO1xuICAgICAgICB3aGlsZSAoc2l6ZSA8IHJlcXVlc3RlZCkge1xuICAgICAgICAgICAgc2l6ZSAqPSAyO1xuICAgICAgICB9XG4gICAgICAgIHZhciBidWZmZXIyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICAgIGJ1ZmZlcjIuc2V0KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiAodGhpcy5idWZmZXIgPSBidWZmZXIyKTtcbiAgICB9O1xuICAgIHJldHVybiBEZWNvZGVTdHJlYW07XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgRGVjb2RlU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVjb2RlU3RyZWFtLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgMTk5Ni0yMDAzIEdseXBoICYgQ29nLCBMTENcbiAqXG4gKiBUaGUgZmxhdGUgc3RyZWFtIGltcGxlbWVudGF0aW9uIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBKYXZhU2NyaXB0IHBvcnRcbiAqIG9mIFhQREYncyBpbXBsZW1lbnRhdGlvbiwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2VcbiAqIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBGbGF0ZVN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBGbGF0ZVN0cmVhbSBjbGFzcyBpbiBNb3ppbGxhJ3MgcGRmLmpzIHByb2plY3QsIG1hZGUgYXZhaWxhYmxlXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZSBsaWNlbnNlLlxuICovXG4vKiB0c2xpbnQ6ZGlzYWJsZSAgbm8tY29uZGl0aW9uYWwtYXNzaWdubWVudCAqL1xuaW1wb3J0IERlY29kZVN0cmVhbSBmcm9tIFwiLi9EZWNvZGVTdHJlYW1cIjtcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGNvZGVMZW5Db2RlTWFwID0gbmV3IEludDMyQXJyYXkoW1xuICAgIDE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVcbl0pO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgbGVuZ3RoRGVjb2RlID0gbmV3IEludDMyQXJyYXkoW1xuICAgIDB4MDAwMDMsIDB4MDAwMDQsIDB4MDAwMDUsIDB4MDAwMDYsIDB4MDAwMDcsIDB4MDAwMDgsIDB4MDAwMDksIDB4MDAwMGEsXG4gICAgMHgxMDAwYiwgMHgxMDAwZCwgMHgxMDAwZiwgMHgxMDAxMSwgMHgyMDAxMywgMHgyMDAxNywgMHgyMDAxYiwgMHgyMDAxZixcbiAgICAweDMwMDIzLCAweDMwMDJiLCAweDMwMDMzLCAweDMwMDNiLCAweDQwMDQzLCAweDQwMDUzLCAweDQwMDYzLCAweDQwMDczLFxuICAgIDB4NTAwODMsIDB4NTAwYTMsIDB4NTAwYzMsIDB4NTAwZTMsIDB4MDAxMDIsIDB4MDAxMDIsIDB4MDAxMDJcbl0pO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgZGlzdERlY29kZSA9IG5ldyBJbnQzMkFycmF5KFtcbiAgICAweDAwMDAxLCAweDAwMDAyLCAweDAwMDAzLCAweDAwMDA0LCAweDEwMDA1LCAweDEwMDA3LCAweDIwMDA5LCAweDIwMDBkLFxuICAgIDB4MzAwMTEsIDB4MzAwMTksIDB4NDAwMjEsIDB4NDAwMzEsIDB4NTAwNDEsIDB4NTAwNjEsIDB4NjAwODEsIDB4NjAwYzEsXG4gICAgMHg3MDEwMSwgMHg3MDE4MSwgMHg4MDIwMSwgMHg4MDMwMSwgMHg5MDQwMSwgMHg5MDYwMSwgMHhhMDgwMSwgMHhhMGMwMSxcbiAgICAweGIxMDAxLCAweGIxODAxLCAweGMyMDAxLCAweGMzMDAxLCAweGQ0MDAxLCAweGQ2MDAxXG5dKTtcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGZpeGVkTGl0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbXG4gICAgICAgIDB4NzAxMDAsIDB4ODAwNTAsIDB4ODAwMTAsIDB4ODAxMTgsIDB4NzAxMTAsIDB4ODAwNzAsIDB4ODAwMzAsIDB4OTAwYzAsXG4gICAgICAgIDB4NzAxMDgsIDB4ODAwNjAsIDB4ODAwMjAsIDB4OTAwYTAsIDB4ODAwMDAsIDB4ODAwODAsIDB4ODAwNDAsIDB4OTAwZTAsXG4gICAgICAgIDB4NzAxMDQsIDB4ODAwNTgsIDB4ODAwMTgsIDB4OTAwOTAsIDB4NzAxMTQsIDB4ODAwNzgsIDB4ODAwMzgsIDB4OTAwZDAsXG4gICAgICAgIDB4NzAxMGMsIDB4ODAwNjgsIDB4ODAwMjgsIDB4OTAwYjAsIDB4ODAwMDgsIDB4ODAwODgsIDB4ODAwNDgsIDB4OTAwZjAsXG4gICAgICAgIDB4NzAxMDIsIDB4ODAwNTQsIDB4ODAwMTQsIDB4ODAxMWMsIDB4NzAxMTIsIDB4ODAwNzQsIDB4ODAwMzQsIDB4OTAwYzgsXG4gICAgICAgIDB4NzAxMGEsIDB4ODAwNjQsIDB4ODAwMjQsIDB4OTAwYTgsIDB4ODAwMDQsIDB4ODAwODQsIDB4ODAwNDQsIDB4OTAwZTgsXG4gICAgICAgIDB4NzAxMDYsIDB4ODAwNWMsIDB4ODAwMWMsIDB4OTAwOTgsIDB4NzAxMTYsIDB4ODAwN2MsIDB4ODAwM2MsIDB4OTAwZDgsXG4gICAgICAgIDB4NzAxMGUsIDB4ODAwNmMsIDB4ODAwMmMsIDB4OTAwYjgsIDB4ODAwMGMsIDB4ODAwOGMsIDB4ODAwNGMsIDB4OTAwZjgsXG4gICAgICAgIDB4NzAxMDEsIDB4ODAwNTIsIDB4ODAwMTIsIDB4ODAxMWEsIDB4NzAxMTEsIDB4ODAwNzIsIDB4ODAwMzIsIDB4OTAwYzQsXG4gICAgICAgIDB4NzAxMDksIDB4ODAwNjIsIDB4ODAwMjIsIDB4OTAwYTQsIDB4ODAwMDIsIDB4ODAwODIsIDB4ODAwNDIsIDB4OTAwZTQsXG4gICAgICAgIDB4NzAxMDUsIDB4ODAwNWEsIDB4ODAwMWEsIDB4OTAwOTQsIDB4NzAxMTUsIDB4ODAwN2EsIDB4ODAwM2EsIDB4OTAwZDQsXG4gICAgICAgIDB4NzAxMGQsIDB4ODAwNmEsIDB4ODAwMmEsIDB4OTAwYjQsIDB4ODAwMGEsIDB4ODAwOGEsIDB4ODAwNGEsIDB4OTAwZjQsXG4gICAgICAgIDB4NzAxMDMsIDB4ODAwNTYsIDB4ODAwMTYsIDB4ODAxMWUsIDB4NzAxMTMsIDB4ODAwNzYsIDB4ODAwMzYsIDB4OTAwY2MsXG4gICAgICAgIDB4NzAxMGIsIDB4ODAwNjYsIDB4ODAwMjYsIDB4OTAwYWMsIDB4ODAwMDYsIDB4ODAwODYsIDB4ODAwNDYsIDB4OTAwZWMsXG4gICAgICAgIDB4NzAxMDcsIDB4ODAwNWUsIDB4ODAwMWUsIDB4OTAwOWMsIDB4NzAxMTcsIDB4ODAwN2UsIDB4ODAwM2UsIDB4OTAwZGMsXG4gICAgICAgIDB4NzAxMGYsIDB4ODAwNmUsIDB4ODAwMmUsIDB4OTAwYmMsIDB4ODAwMGUsIDB4ODAwOGUsIDB4ODAwNGUsIDB4OTAwZmMsXG4gICAgICAgIDB4NzAxMDAsIDB4ODAwNTEsIDB4ODAwMTEsIDB4ODAxMTksIDB4NzAxMTAsIDB4ODAwNzEsIDB4ODAwMzEsIDB4OTAwYzIsXG4gICAgICAgIDB4NzAxMDgsIDB4ODAwNjEsIDB4ODAwMjEsIDB4OTAwYTIsIDB4ODAwMDEsIDB4ODAwODEsIDB4ODAwNDEsIDB4OTAwZTIsXG4gICAgICAgIDB4NzAxMDQsIDB4ODAwNTksIDB4ODAwMTksIDB4OTAwOTIsIDB4NzAxMTQsIDB4ODAwNzksIDB4ODAwMzksIDB4OTAwZDIsXG4gICAgICAgIDB4NzAxMGMsIDB4ODAwNjksIDB4ODAwMjksIDB4OTAwYjIsIDB4ODAwMDksIDB4ODAwODksIDB4ODAwNDksIDB4OTAwZjIsXG4gICAgICAgIDB4NzAxMDIsIDB4ODAwNTUsIDB4ODAwMTUsIDB4ODAxMWQsIDB4NzAxMTIsIDB4ODAwNzUsIDB4ODAwMzUsIDB4OTAwY2EsXG4gICAgICAgIDB4NzAxMGEsIDB4ODAwNjUsIDB4ODAwMjUsIDB4OTAwYWEsIDB4ODAwMDUsIDB4ODAwODUsIDB4ODAwNDUsIDB4OTAwZWEsXG4gICAgICAgIDB4NzAxMDYsIDB4ODAwNWQsIDB4ODAwMWQsIDB4OTAwOWEsIDB4NzAxMTYsIDB4ODAwN2QsIDB4ODAwM2QsIDB4OTAwZGEsXG4gICAgICAgIDB4NzAxMGUsIDB4ODAwNmQsIDB4ODAwMmQsIDB4OTAwYmEsIDB4ODAwMGQsIDB4ODAwOGQsIDB4ODAwNGQsIDB4OTAwZmEsXG4gICAgICAgIDB4NzAxMDEsIDB4ODAwNTMsIDB4ODAwMTMsIDB4ODAxMWIsIDB4NzAxMTEsIDB4ODAwNzMsIDB4ODAwMzMsIDB4OTAwYzYsXG4gICAgICAgIDB4NzAxMDksIDB4ODAwNjMsIDB4ODAwMjMsIDB4OTAwYTYsIDB4ODAwMDMsIDB4ODAwODMsIDB4ODAwNDMsIDB4OTAwZTYsXG4gICAgICAgIDB4NzAxMDUsIDB4ODAwNWIsIDB4ODAwMWIsIDB4OTAwOTYsIDB4NzAxMTUsIDB4ODAwN2IsIDB4ODAwM2IsIDB4OTAwZDYsXG4gICAgICAgIDB4NzAxMGQsIDB4ODAwNmIsIDB4ODAwMmIsIDB4OTAwYjYsIDB4ODAwMGIsIDB4ODAwOGIsIDB4ODAwNGIsIDB4OTAwZjYsXG4gICAgICAgIDB4NzAxMDMsIDB4ODAwNTcsIDB4ODAwMTcsIDB4ODAxMWYsIDB4NzAxMTMsIDB4ODAwNzcsIDB4ODAwMzcsIDB4OTAwY2UsXG4gICAgICAgIDB4NzAxMGIsIDB4ODAwNjcsIDB4ODAwMjcsIDB4OTAwYWUsIDB4ODAwMDcsIDB4ODAwODcsIDB4ODAwNDcsIDB4OTAwZWUsXG4gICAgICAgIDB4NzAxMDcsIDB4ODAwNWYsIDB4ODAwMWYsIDB4OTAwOWUsIDB4NzAxMTcsIDB4ODAwN2YsIDB4ODAwM2YsIDB4OTAwZGUsXG4gICAgICAgIDB4NzAxMGYsIDB4ODAwNmYsIDB4ODAwMmYsIDB4OTAwYmUsIDB4ODAwMGYsIDB4ODAwOGYsIDB4ODAwNGYsIDB4OTAwZmUsXG4gICAgICAgIDB4NzAxMDAsIDB4ODAwNTAsIDB4ODAwMTAsIDB4ODAxMTgsIDB4NzAxMTAsIDB4ODAwNzAsIDB4ODAwMzAsIDB4OTAwYzEsXG4gICAgICAgIDB4NzAxMDgsIDB4ODAwNjAsIDB4ODAwMjAsIDB4OTAwYTEsIDB4ODAwMDAsIDB4ODAwODAsIDB4ODAwNDAsIDB4OTAwZTEsXG4gICAgICAgIDB4NzAxMDQsIDB4ODAwNTgsIDB4ODAwMTgsIDB4OTAwOTEsIDB4NzAxMTQsIDB4ODAwNzgsIDB4ODAwMzgsIDB4OTAwZDEsXG4gICAgICAgIDB4NzAxMGMsIDB4ODAwNjgsIDB4ODAwMjgsIDB4OTAwYjEsIDB4ODAwMDgsIDB4ODAwODgsIDB4ODAwNDgsIDB4OTAwZjEsXG4gICAgICAgIDB4NzAxMDIsIDB4ODAwNTQsIDB4ODAwMTQsIDB4ODAxMWMsIDB4NzAxMTIsIDB4ODAwNzQsIDB4ODAwMzQsIDB4OTAwYzksXG4gICAgICAgIDB4NzAxMGEsIDB4ODAwNjQsIDB4ODAwMjQsIDB4OTAwYTksIDB4ODAwMDQsIDB4ODAwODQsIDB4ODAwNDQsIDB4OTAwZTksXG4gICAgICAgIDB4NzAxMDYsIDB4ODAwNWMsIDB4ODAwMWMsIDB4OTAwOTksIDB4NzAxMTYsIDB4ODAwN2MsIDB4ODAwM2MsIDB4OTAwZDksXG4gICAgICAgIDB4NzAxMGUsIDB4ODAwNmMsIDB4ODAwMmMsIDB4OTAwYjksIDB4ODAwMGMsIDB4ODAwOGMsIDB4ODAwNGMsIDB4OTAwZjksXG4gICAgICAgIDB4NzAxMDEsIDB4ODAwNTIsIDB4ODAwMTIsIDB4ODAxMWEsIDB4NzAxMTEsIDB4ODAwNzIsIDB4ODAwMzIsIDB4OTAwYzUsXG4gICAgICAgIDB4NzAxMDksIDB4ODAwNjIsIDB4ODAwMjIsIDB4OTAwYTUsIDB4ODAwMDIsIDB4ODAwODIsIDB4ODAwNDIsIDB4OTAwZTUsXG4gICAgICAgIDB4NzAxMDUsIDB4ODAwNWEsIDB4ODAwMWEsIDB4OTAwOTUsIDB4NzAxMTUsIDB4ODAwN2EsIDB4ODAwM2EsIDB4OTAwZDUsXG4gICAgICAgIDB4NzAxMGQsIDB4ODAwNmEsIDB4ODAwMmEsIDB4OTAwYjUsIDB4ODAwMGEsIDB4ODAwOGEsIDB4ODAwNGEsIDB4OTAwZjUsXG4gICAgICAgIDB4NzAxMDMsIDB4ODAwNTYsIDB4ODAwMTYsIDB4ODAxMWUsIDB4NzAxMTMsIDB4ODAwNzYsIDB4ODAwMzYsIDB4OTAwY2QsXG4gICAgICAgIDB4NzAxMGIsIDB4ODAwNjYsIDB4ODAwMjYsIDB4OTAwYWQsIDB4ODAwMDYsIDB4ODAwODYsIDB4ODAwNDYsIDB4OTAwZWQsXG4gICAgICAgIDB4NzAxMDcsIDB4ODAwNWUsIDB4ODAwMWUsIDB4OTAwOWQsIDB4NzAxMTcsIDB4ODAwN2UsIDB4ODAwM2UsIDB4OTAwZGQsXG4gICAgICAgIDB4NzAxMGYsIDB4ODAwNmUsIDB4ODAwMmUsIDB4OTAwYmQsIDB4ODAwMGUsIDB4ODAwOGUsIDB4ODAwNGUsIDB4OTAwZmQsXG4gICAgICAgIDB4NzAxMDAsIDB4ODAwNTEsIDB4ODAwMTEsIDB4ODAxMTksIDB4NzAxMTAsIDB4ODAwNzEsIDB4ODAwMzEsIDB4OTAwYzMsXG4gICAgICAgIDB4NzAxMDgsIDB4ODAwNjEsIDB4ODAwMjEsIDB4OTAwYTMsIDB4ODAwMDEsIDB4ODAwODEsIDB4ODAwNDEsIDB4OTAwZTMsXG4gICAgICAgIDB4NzAxMDQsIDB4ODAwNTksIDB4ODAwMTksIDB4OTAwOTMsIDB4NzAxMTQsIDB4ODAwNzksIDB4ODAwMzksIDB4OTAwZDMsXG4gICAgICAgIDB4NzAxMGMsIDB4ODAwNjksIDB4ODAwMjksIDB4OTAwYjMsIDB4ODAwMDksIDB4ODAwODksIDB4ODAwNDksIDB4OTAwZjMsXG4gICAgICAgIDB4NzAxMDIsIDB4ODAwNTUsIDB4ODAwMTUsIDB4ODAxMWQsIDB4NzAxMTIsIDB4ODAwNzUsIDB4ODAwMzUsIDB4OTAwY2IsXG4gICAgICAgIDB4NzAxMGEsIDB4ODAwNjUsIDB4ODAwMjUsIDB4OTAwYWIsIDB4ODAwMDUsIDB4ODAwODUsIDB4ODAwNDUsIDB4OTAwZWIsXG4gICAgICAgIDB4NzAxMDYsIDB4ODAwNWQsIDB4ODAwMWQsIDB4OTAwOWIsIDB4NzAxMTYsIDB4ODAwN2QsIDB4ODAwM2QsIDB4OTAwZGIsXG4gICAgICAgIDB4NzAxMGUsIDB4ODAwNmQsIDB4ODAwMmQsIDB4OTAwYmIsIDB4ODAwMGQsIDB4ODAwOGQsIDB4ODAwNGQsIDB4OTAwZmIsXG4gICAgICAgIDB4NzAxMDEsIDB4ODAwNTMsIDB4ODAwMTMsIDB4ODAxMWIsIDB4NzAxMTEsIDB4ODAwNzMsIDB4ODAwMzMsIDB4OTAwYzcsXG4gICAgICAgIDB4NzAxMDksIDB4ODAwNjMsIDB4ODAwMjMsIDB4OTAwYTcsIDB4ODAwMDMsIDB4ODAwODMsIDB4ODAwNDMsIDB4OTAwZTcsXG4gICAgICAgIDB4NzAxMDUsIDB4ODAwNWIsIDB4ODAwMWIsIDB4OTAwOTcsIDB4NzAxMTUsIDB4ODAwN2IsIDB4ODAwM2IsIDB4OTAwZDcsXG4gICAgICAgIDB4NzAxMGQsIDB4ODAwNmIsIDB4ODAwMmIsIDB4OTAwYjcsIDB4ODAwMGIsIDB4ODAwOGIsIDB4ODAwNGIsIDB4OTAwZjcsXG4gICAgICAgIDB4NzAxMDMsIDB4ODAwNTcsIDB4ODAwMTcsIDB4ODAxMWYsIDB4NzAxMTMsIDB4ODAwNzcsIDB4ODAwMzcsIDB4OTAwY2YsXG4gICAgICAgIDB4NzAxMGIsIDB4ODAwNjcsIDB4ODAwMjcsIDB4OTAwYWYsIDB4ODAwMDcsIDB4ODAwODcsIDB4ODAwNDcsIDB4OTAwZWYsXG4gICAgICAgIDB4NzAxMDcsIDB4ODAwNWYsIDB4ODAwMWYsIDB4OTAwOWYsIDB4NzAxMTcsIDB4ODAwN2YsIDB4ODAwM2YsIDB4OTAwZGYsXG4gICAgICAgIDB4NzAxMGYsIDB4ODAwNmYsIDB4ODAwMmYsIDB4OTAwYmYsIDB4ODAwMGYsIDB4ODAwOGYsIDB4ODAwNGYsIDB4OTAwZmZcbiAgICBdKSwgOV07XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBmaXhlZERpc3RDb2RlVGFiID0gW25ldyBJbnQzMkFycmF5KFtcbiAgICAgICAgMHg1MDAwMCwgMHg1MDAxMCwgMHg1MDAwOCwgMHg1MDAxOCwgMHg1MDAwNCwgMHg1MDAxNCwgMHg1MDAwYywgMHg1MDAxYyxcbiAgICAgICAgMHg1MDAwMiwgMHg1MDAxMiwgMHg1MDAwYSwgMHg1MDAxYSwgMHg1MDAwNiwgMHg1MDAxNiwgMHg1MDAwZSwgMHgwMDAwMCxcbiAgICAgICAgMHg1MDAwMSwgMHg1MDAxMSwgMHg1MDAwOSwgMHg1MDAxOSwgMHg1MDAwNSwgMHg1MDAxNSwgMHg1MDAwZCwgMHg1MDAxZCxcbiAgICAgICAgMHg1MDAwMywgMHg1MDAxMywgMHg1MDAwYiwgMHg1MDAxYiwgMHg1MDAwNywgMHg1MDAxNywgMHg1MDAwZiwgMHgwMDAwMFxuICAgIF0pLCA1XTtcbnZhciBGbGF0ZVN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmxhdGVTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmxhdGVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtYXliZUxlbmd0aCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICB2YXIgY21mID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGZsZyA9IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgIGlmIChjbWYgPT09IC0xIHx8IGZsZyA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaGVhZGVyIGluIGZsYXRlIHN0cmVhbTogXCIgKyBjbWYgKyBcIiwgXCIgKyBmbGcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoY21mICYgMHgwZikgIT09IDB4MDgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIGluIGZsYXRlIHN0cmVhbTogXCIgKyBjbWYgKyBcIiwgXCIgKyBmbGcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoKGNtZiA8PCA4KSArIGZsZykgJSAzMSAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIEZDSEVDSyBpbiBmbGF0ZSBzdHJlYW06IFwiICsgY21mICsgXCIsIFwiICsgZmxnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmxnICYgMHgyMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkRJQ1QgYml0IHNldCBpbiBmbGF0ZSBzdHJlYW06IFwiICsgY21mICsgXCIsIFwiICsgZmxnKTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5jb2RlU2l6ZSA9IDA7XG4gICAgICAgIF90aGlzLmNvZGVCdWYgPSAwO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBidWZmZXI7XG4gICAgICAgIHZhciBsZW47XG4gICAgICAgIHZhciBzdHIgPSB0aGlzLnN0cmVhbTtcbiAgICAgICAgLy8gcmVhZCBibG9jayBoZWFkZXJcbiAgICAgICAgdmFyIGhkciA9IHRoaXMuZ2V0Qml0cygzKTtcbiAgICAgICAgaWYgKGhkciAmIDEpIHtcbiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBoZHIgPj49IDE7XG4gICAgICAgIGlmIChoZHIgPT09IDApIHtcbiAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBibG9ja1xuICAgICAgICAgICAgdmFyIGIgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYmxvY2tMZW4gPSBiO1xuICAgICAgICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmxvY2tMZW4gfD0gYiA8PCA4O1xuICAgICAgICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNoZWNrID0gYjtcbiAgICAgICAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoZWNrIHw9IGIgPDwgODtcbiAgICAgICAgICAgIGlmIChjaGVjayAhPT0gKH5ibG9ja0xlbiAmIDB4ZmZmZikgJiYgKGJsb2NrTGVuICE9PSAwIHx8IGNoZWNrICE9PSAwKSkge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yaW5nIGVycm9yIGZvciBiYWQgXCJlbXB0eVwiIGJsb2NrIChzZWUgaXNzdWUgMTI3NylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCB1bmNvbXByZXNzZWQgYmxvY2sgbGVuZ3RoIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb2RlQnVmID0gMDtcbiAgICAgICAgICAgIHRoaXMuY29kZVNpemUgPSAwO1xuICAgICAgICAgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgYmxvY2tMZW4pO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGJ1ZmZlckxlbmd0aCArIGJsb2NrTGVuO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBlbmQ7XG4gICAgICAgICAgICBpZiAoYmxvY2tMZW4gPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyLnBlZWtCeXRlKCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gYnVmZmVyTGVuZ3RoOyBuIDwgZW5kOyArK24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBidWZmZXJbbl0gPSBiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGl0Q29kZVRhYmxlO1xuICAgICAgICB2YXIgZGlzdENvZGVUYWJsZTtcbiAgICAgICAgaWYgKGhkciA9PT0gMSkge1xuICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBibG9jaywgZml4ZWQgY29kZXNcbiAgICAgICAgICAgIGxpdENvZGVUYWJsZSA9IGZpeGVkTGl0Q29kZVRhYjtcbiAgICAgICAgICAgIGRpc3RDb2RlVGFibGUgPSBmaXhlZERpc3RDb2RlVGFiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGhkciA9PT0gMikge1xuICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBibG9jaywgZHluYW1pYyBjb2Rlc1xuICAgICAgICAgICAgdmFyIG51bUxpdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMjU3O1xuICAgICAgICAgICAgdmFyIG51bURpc3RDb2RlcyA9IHRoaXMuZ2V0Qml0cyg1KSArIDE7XG4gICAgICAgICAgICB2YXIgbnVtQ29kZUxlbkNvZGVzID0gdGhpcy5nZXRCaXRzKDQpICsgNDtcbiAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBjb2RlIGxlbmd0aHMgY29kZSB0YWJsZVxuICAgICAgICAgICAgdmFyIGNvZGVMZW5Db2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KGNvZGVMZW5Db2RlTWFwLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgaSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Db2RlTGVuQ29kZXM7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvZGVMZW5Db2RlTGVuZ3Roc1tjb2RlTGVuQ29kZU1hcFtpXV0gPSB0aGlzLmdldEJpdHMoMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY29kZUxlbkNvZGVUYWIgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5Db2RlTGVuZ3Rocyk7XG4gICAgICAgICAgICAvLyBidWlsZCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgY29kZSB0YWJsZXNcbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIHZhciBjb2RlcyA9IG51bUxpdENvZGVzICsgbnVtRGlzdENvZGVzO1xuICAgICAgICAgICAgdmFyIGNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZXMpO1xuICAgICAgICAgICAgdmFyIGJpdHNMZW5ndGggPSB2b2lkIDA7XG4gICAgICAgICAgICB2YXIgYml0c09mZnNldCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciB3aGF0ID0gdm9pZCAwO1xuICAgICAgICAgICAgd2hpbGUgKGkgPCBjb2Rlcykge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlID0gdGhpcy5nZXRDb2RlKGNvZGVMZW5Db2RlVGFiKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgYml0c0xlbmd0aCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJpdHNPZmZzZXQgPSAzO1xuICAgICAgICAgICAgICAgICAgICB3aGF0ID0gbGVuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2RlID09PSAxNykge1xuICAgICAgICAgICAgICAgICAgICBiaXRzTGVuZ3RoID0gMztcbiAgICAgICAgICAgICAgICAgICAgYml0c09mZnNldCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIHdoYXQgPSBsZW4gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2RlID09PSAxOCkge1xuICAgICAgICAgICAgICAgICAgICBiaXRzTGVuZ3RoID0gNztcbiAgICAgICAgICAgICAgICAgICAgYml0c09mZnNldCA9IDExO1xuICAgICAgICAgICAgICAgICAgICB3aGF0ID0gbGVuID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSBsZW4gPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJlcGVhdExlbmd0aCA9IHRoaXMuZ2V0Qml0cyhiaXRzTGVuZ3RoKSArIGJpdHNPZmZzZXQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHJlcGVhdExlbmd0aC0tID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVuZ3Roc1tpKytdID0gd2hhdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaXRDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KDAsIG51bUxpdENvZGVzKSk7XG4gICAgICAgICAgICBkaXN0Q29kZVRhYmxlID0gdGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShjb2RlTGVuZ3Rocy5zdWJhcnJheShudW1MaXRDb2RlcywgY29kZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBibG9jayB0eXBlIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgICB2YXIgbGltaXQgPSBidWZmZXIgPyBidWZmZXIubGVuZ3RoIDogMDtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGNvZGUxID0gdGhpcy5nZXRDb2RlKGxpdENvZGVUYWJsZSk7XG4gICAgICAgICAgICBpZiAoY29kZTEgPCAyNTYpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zICsgMSA+PSBsaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmZXJbcG9zKytdID0gY29kZTE7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZTEgPT09IDI1Nikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gcG9zO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvZGUxIC09IDI1NztcbiAgICAgICAgICAgIGNvZGUxID0gbGVuZ3RoRGVjb2RlW2NvZGUxXTtcbiAgICAgICAgICAgIHZhciBjb2RlMiA9IGNvZGUxID4+IDE2O1xuICAgICAgICAgICAgaWYgKGNvZGUyID4gMCkge1xuICAgICAgICAgICAgICAgIGNvZGUyID0gdGhpcy5nZXRCaXRzKGNvZGUyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxlbiA9IChjb2RlMSAmIDB4ZmZmZikgKyBjb2RlMjtcbiAgICAgICAgICAgIGNvZGUxID0gdGhpcy5nZXRDb2RlKGRpc3RDb2RlVGFibGUpO1xuICAgICAgICAgICAgY29kZTEgPSBkaXN0RGVjb2RlW2NvZGUxXTtcbiAgICAgICAgICAgIGNvZGUyID0gY29kZTEgPj4gMTY7XG4gICAgICAgICAgICBpZiAoY29kZTIgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29kZTIgPSB0aGlzLmdldEJpdHMoY29kZTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRpc3QgPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7XG4gICAgICAgICAgICBpZiAocG9zICsgbGVuID49IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgbGVuKTtcbiAgICAgICAgICAgICAgICBsaW1pdCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGxlbjsgKytrLCArK3Bvcykge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NdID0gYnVmZmVyW3BvcyAtIGRpc3RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Qml0cyA9IGZ1bmN0aW9uIChiaXRzKSB7XG4gICAgICAgIHZhciBzdHIgPSB0aGlzLnN0cmVhbTtcbiAgICAgICAgdmFyIGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTtcbiAgICAgICAgdmFyIGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7XG4gICAgICAgIHZhciBiO1xuICAgICAgICB3aGlsZSAoY29kZVNpemUgPCBiaXRzKSB7XG4gICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTtcbiAgICAgICAgICAgIGNvZGVTaXplICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgYiA9IGNvZGVCdWYgJiAoKDEgPDwgYml0cykgLSAxKTtcbiAgICAgICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBiaXRzO1xuICAgICAgICB0aGlzLmNvZGVTaXplID0gY29kZVNpemUgLT0gYml0cztcbiAgICAgICAgcmV0dXJuIGI7XG4gICAgfTtcbiAgICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Q29kZSA9IGZ1bmN0aW9uICh0YWJsZSkge1xuICAgICAgICB2YXIgc3RyID0gdGhpcy5zdHJlYW07XG4gICAgICAgIHZhciBjb2RlcyA9IHRhYmxlWzBdO1xuICAgICAgICB2YXIgbWF4TGVuID0gdGFibGVbMV07XG4gICAgICAgIHZhciBjb2RlU2l6ZSA9IHRoaXMuY29kZVNpemU7XG4gICAgICAgIHZhciBjb2RlQnVmID0gdGhpcy5jb2RlQnVmO1xuICAgICAgICB2YXIgYjtcbiAgICAgICAgd2hpbGUgKGNvZGVTaXplIDwgbWF4TGVuKSB7XG4gICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBwcmVtYXR1cmUgZW5kIG9mIHN0cmVhbS4gY29kZSBtaWdodCBob3dldmVyIHN0aWxsIGJlIHZhbGlkLlxuICAgICAgICAgICAgICAgIC8vIGNvZGVTaXplIDwgY29kZUxlbiBjaGVjayBiZWxvdyBndWFyZHMgYWdhaW5zdCBpbmNvbXBsZXRlIGNvZGVWYWwuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlQnVmIHw9IGIgPDwgY29kZVNpemU7XG4gICAgICAgICAgICBjb2RlU2l6ZSArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb2RlID0gY29kZXNbY29kZUJ1ZiAmICgoMSA8PCBtYXhMZW4pIC0gMSldO1xuICAgICAgICBpZiAodHlwZW9mIGNvZGVzID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZMQVRFOicsIGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb2RlTGVuID0gY29kZSA+PiAxNjtcbiAgICAgICAgdmFyIGNvZGVWYWwgPSBjb2RlICYgMHhmZmZmO1xuICAgICAgICBpZiAoY29kZUxlbiA8IDEgfHwgY29kZVNpemUgPCBjb2RlTGVuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvZGVCdWYgPSBjb2RlQnVmID4+IGNvZGVMZW47XG4gICAgICAgIHRoaXMuY29kZVNpemUgPSBjb2RlU2l6ZSAtIGNvZGVMZW47XG4gICAgICAgIHJldHVybiBjb2RlVmFsO1xuICAgIH07XG4gICAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdlbmVyYXRlSHVmZm1hblRhYmxlID0gZnVuY3Rpb24gKGxlbmd0aHMpIHtcbiAgICAgICAgdmFyIG4gPSBsZW5ndGhzLmxlbmd0aDtcbiAgICAgICAgLy8gZmluZCBtYXggY29kZSBsZW5ndGhcbiAgICAgICAgdmFyIG1heExlbiA9IDA7XG4gICAgICAgIHZhciBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgICBpZiAobGVuZ3Roc1tpXSA+IG1heExlbikge1xuICAgICAgICAgICAgICAgIG1heExlbiA9IGxlbmd0aHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYnVpbGQgdGhlIHRhYmxlXG4gICAgICAgIHZhciBzaXplID0gMSA8PCBtYXhMZW47XG4gICAgICAgIHZhciBjb2RlcyA9IG5ldyBJbnQzMkFycmF5KHNpemUpO1xuICAgICAgICBmb3IgKHZhciBsZW4gPSAxLCBjb2RlID0gMCwgc2tpcCA9IDI7IGxlbiA8PSBtYXhMZW47ICsrbGVuLCBjb2RlIDw8PSAxLCBza2lwIDw8PSAxKSB7XG4gICAgICAgICAgICBmb3IgKHZhciB2YWwgPSAwOyB2YWwgPCBuOyArK3ZhbCkge1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGhzW3ZhbF0gPT09IGxlbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBiaXQtcmV2ZXJzZSB0aGUgY29kZVxuICAgICAgICAgICAgICAgICAgICB2YXIgY29kZTIgPSAwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTIgPSAoY29kZTIgPDwgMSkgfCAodCAmIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA+Pj0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBmaWxsIHRoZSB0YWJsZSBlbnRyaWVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGNvZGUyOyBpIDwgc2l6ZTsgaSArPSBza2lwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc1tpXSA9IChsZW4gPDwgMTYpIHwgdmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICsrY29kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtjb2RlcywgbWF4TGVuXTtcbiAgICB9O1xuICAgIHJldHVybiBGbGF0ZVN0cmVhbTtcbn0oRGVjb2RlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBGbGF0ZVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZsYXRlU3RyZWFtLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBUaGUgTFpXU3RyZWFtIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBUeXBlU2NyaXB0IHBvcnQgb2YgdGhlXG4gKiBKYXZhU2NyaXB0IExaV1N0cmVhbSBjbGFzcyBpbiBNb3ppbGxhJ3MgcGRmLmpzIHByb2plY3QsIG1hZGUgYXZhaWxhYmxlXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZSBsaWNlbnNlLlxuICovXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBEZWNvZGVTdHJlYW0gZnJvbSBcIi4vRGVjb2RlU3RyZWFtXCI7XG52YXIgTFpXU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhMWldTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTFpXU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGVhcmx5Q2hhbmdlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIF90aGlzLmNhY2hlZERhdGEgPSAwO1xuICAgICAgICBfdGhpcy5iaXRzQ2FjaGVkID0gMDtcbiAgICAgICAgdmFyIG1heEx6d0RpY3Rpb25hcnlTaXplID0gNDA5NjtcbiAgICAgICAgdmFyIGx6d1N0YXRlID0ge1xuICAgICAgICAgICAgZWFybHlDaGFuZ2U6IGVhcmx5Q2hhbmdlLFxuICAgICAgICAgICAgY29kZUxlbmd0aDogOSxcbiAgICAgICAgICAgIG5leHRDb2RlOiAyNTgsXG4gICAgICAgICAgICBkaWN0aW9uYXJ5VmFsdWVzOiBuZXcgVWludDhBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksXG4gICAgICAgICAgICBkaWN0aW9uYXJ5TGVuZ3RoczogbmV3IFVpbnQxNkFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlQcmV2Q29kZXM6IG5ldyBVaW50MTZBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksXG4gICAgICAgICAgICBjdXJyZW50U2VxdWVuY2U6IG5ldyBVaW50OEFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDogMCxcbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeVZhbHVlc1tpXSA9IGk7XG4gICAgICAgICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5TGVuZ3Roc1tpXSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMubHp3U3RhdGUgPSBsendTdGF0ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBMWldTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IDUxMjtcbiAgICAgICAgdmFyIGVzdGltYXRlZERlY29kZWRTaXplID0gYmxvY2tTaXplICogMjtcbiAgICAgICAgdmFyIGRlY29kZWRTaXplRGVsdGEgPSBibG9ja1NpemU7XG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgajtcbiAgICAgICAgdmFyIHE7XG4gICAgICAgIHZhciBsendTdGF0ZSA9IHRoaXMubHp3U3RhdGU7XG4gICAgICAgIGlmICghbHp3U3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gZW9mIHdhcyBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIHZhciBlYXJseUNoYW5nZSA9IGx6d1N0YXRlLmVhcmx5Q2hhbmdlO1xuICAgICAgICB2YXIgbmV4dENvZGUgPSBsendTdGF0ZS5uZXh0Q29kZTtcbiAgICAgICAgdmFyIGRpY3Rpb25hcnlWYWx1ZXMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5VmFsdWVzO1xuICAgICAgICB2YXIgZGljdGlvbmFyeUxlbmd0aHMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5TGVuZ3RocztcbiAgICAgICAgdmFyIGRpY3Rpb25hcnlQcmV2Q29kZXMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5UHJldkNvZGVzO1xuICAgICAgICB2YXIgY29kZUxlbmd0aCA9IGx6d1N0YXRlLmNvZGVMZW5ndGg7XG4gICAgICAgIHZhciBwcmV2Q29kZSA9IGx6d1N0YXRlLnByZXZDb2RlO1xuICAgICAgICB2YXIgY3VycmVudFNlcXVlbmNlID0gbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlO1xuICAgICAgICB2YXIgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoO1xuICAgICAgICB2YXIgZGVjb2RlZExlbmd0aCA9IDA7XG4gICAgICAgIHZhciBjdXJyZW50QnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIGVzdGltYXRlZERlY29kZWRTaXplKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29kZSA9IHRoaXMucmVhZEJpdHMoY29kZUxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgaGFzUHJldiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA+IDA7XG4gICAgICAgICAgICBpZiAoIWNvZGUgfHwgY29kZSA8IDI1Nikge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVswXSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gMjU4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPCBuZXh0Q29kZSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBkaWN0aW9uYXJ5TGVuZ3Roc1tjb2RlXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoIC0gMSwgcSA9IGNvZGU7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VxdWVuY2Vbal0gPSBkaWN0aW9uYXJ5VmFsdWVzW3FdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcSA9IGRpY3Rpb25hcnlQcmV2Q29kZXNbcV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVtjdXJyZW50U2VxdWVuY2VMZW5ndGgrK10gPSBjdXJyZW50U2VxdWVuY2VbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29kZSA9PT0gMjU2KSB7XG4gICAgICAgICAgICAgICAgY29kZUxlbmd0aCA9IDk7XG4gICAgICAgICAgICAgICAgbmV4dENvZGUgPSAyNTg7XG4gICAgICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5sendTdGF0ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNQcmV2KSB7XG4gICAgICAgICAgICAgICAgZGljdGlvbmFyeVByZXZDb2Rlc1tuZXh0Q29kZV0gPSBwcmV2Q29kZTtcbiAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5TGVuZ3Roc1tuZXh0Q29kZV0gPSBkaWN0aW9uYXJ5TGVuZ3Roc1twcmV2Q29kZV0gKyAxO1xuICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlWYWx1ZXNbbmV4dENvZGVdID0gY3VycmVudFNlcXVlbmNlWzBdO1xuICAgICAgICAgICAgICAgIG5leHRDb2RlKys7XG4gICAgICAgICAgICAgICAgY29kZUxlbmd0aCA9XG4gICAgICAgICAgICAgICAgICAgIChuZXh0Q29kZSArIGVhcmx5Q2hhbmdlKSAmIChuZXh0Q29kZSArIGVhcmx5Q2hhbmdlIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY29kZUxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBNYXRoLm1pbihNYXRoLmxvZyhuZXh0Q29kZSArIGVhcmx5Q2hhbmdlKSAvIDAuNjkzMTQ3MTgwNTU5OTQ1MyArIDEsIDEyKSB8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2Q29kZSA9IGNvZGU7XG4gICAgICAgICAgICBkZWNvZGVkTGVuZ3RoICs9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlc3RpbWF0ZWREZWNvZGVkU2l6ZSA8IGRlY29kZWRMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZERlY29kZWRTaXplICs9IGRlY29kZWRTaXplRGVsdGE7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoZXN0aW1hdGVkRGVjb2RlZFNpemUgPCBkZWNvZGVkTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIGVzdGltYXRlZERlY29kZWRTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdXJyZW50U2VxdWVuY2VMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltjdXJyZW50QnVmZmVyTGVuZ3RoKytdID0gY3VycmVudFNlcXVlbmNlW2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGx6d1N0YXRlLm5leHRDb2RlID0gbmV4dENvZGU7XG4gICAgICAgIGx6d1N0YXRlLmNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoO1xuICAgICAgICBsendTdGF0ZS5wcmV2Q29kZSA9IHByZXZDb2RlO1xuICAgICAgICBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGggPSBjdXJyZW50U2VxdWVuY2VMZW5ndGg7XG4gICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gY3VycmVudEJ1ZmZlckxlbmd0aDtcbiAgICB9O1xuICAgIExaV1N0cmVhbS5wcm90b3R5cGUucmVhZEJpdHMgPSBmdW5jdGlvbiAobikge1xuICAgICAgICB2YXIgYml0c0NhY2hlZCA9IHRoaXMuYml0c0NhY2hlZDtcbiAgICAgICAgdmFyIGNhY2hlZERhdGEgPSB0aGlzLmNhY2hlZERhdGE7XG4gICAgICAgIHdoaWxlIChiaXRzQ2FjaGVkIDwgbikge1xuICAgICAgICAgICAgdmFyIGMgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgICAgICBpZiAoYyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWNoZWREYXRhID0gKGNhY2hlZERhdGEgPDwgOCkgfCBjO1xuICAgICAgICAgICAgYml0c0NhY2hlZCArPSA4O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYml0c0NhY2hlZCA9IGJpdHNDYWNoZWQgLT0gbjtcbiAgICAgICAgdGhpcy5jYWNoZWREYXRhID0gY2FjaGVkRGF0YTtcbiAgICAgICAgcmV0dXJuIChjYWNoZWREYXRhID4+PiBiaXRzQ2FjaGVkKSAmICgoMSA8PCBuKSAtIDEpO1xuICAgIH07XG4gICAgcmV0dXJuIExaV1N0cmVhbTtcbn0oRGVjb2RlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBMWldTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MWldTdHJlYW0uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBSdW5MZW5ndGhTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgUnVuTGVuZ3RoU3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IERlY29kZVN0cmVhbSBmcm9tIFwiLi9EZWNvZGVTdHJlYW1cIjtcbnZhciBSdW5MZW5ndGhTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJ1bkxlbmd0aFN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSdW5MZW5ndGhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtYXliZUxlbmd0aCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJ1bkxlbmd0aFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBUaGUgcmVwZWF0SGVhZGVyIGhhcyBmb2xsb3dpbmcgZm9ybWF0LiBUaGUgZmlyc3QgYnl0ZSBkZWZpbmVzIHR5cGUgb2YgcnVuXG4gICAgICAgIC8vIGFuZCBhbW91bnQgb2YgYnl0ZXMgdG8gcmVwZWF0L2NvcHk6IG4gPSAwIHRocm91Z2ggMTI3IC0gY29weSBuZXh0IG4gYnl0ZXNcbiAgICAgICAgLy8gKGluIGFkZGl0aW9uIHRvIHRoZSBzZWNvbmQgYnl0ZSBmcm9tIHRoZSBoZWFkZXIpLCBuID0gMTI5IHRocm91Z2ggMjU1IC1cbiAgICAgICAgLy8gZHVwbGljYXRlIHRoZSBzZWNvbmQgYnl0ZSBmcm9tIHRoZSBoZWFkZXIgKDI1NyAtIG4pIHRpbWVzLCBuID0gMTI4IC0gZW5kLlxuICAgICAgICB2YXIgcmVwZWF0SGVhZGVyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZXMoMik7XG4gICAgICAgIGlmICghcmVwZWF0SGVhZGVyIHx8IHJlcGVhdEhlYWRlci5sZW5ndGggPCAyIHx8IHJlcGVhdEhlYWRlclswXSA9PT0gMTI4KSB7XG4gICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJ1ZmZlcjtcbiAgICAgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICB2YXIgbiA9IHJlcGVhdEhlYWRlclswXTtcbiAgICAgICAgaWYgKG4gPCAxMjgpIHtcbiAgICAgICAgICAgIC8vIGNvcHkgbiBieXRlc1xuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbiArIDEpO1xuICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IHJlcGVhdEhlYWRlclsxXTtcbiAgICAgICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLnN0cmVhbS5nZXRCeXRlcyhuKTtcbiAgICAgICAgICAgICAgICBidWZmZXIuc2V0KHNvdXJjZSwgYnVmZmVyTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBidWZmZXJMZW5ndGggKz0gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG4gPSAyNTcgLSBuO1xuICAgICAgICAgICAgdmFyIGIgPSByZXBlYXRIZWFkZXJbMV07XG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuICsgMSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICAgIH07XG4gICAgcmV0dXJuIFJ1bkxlbmd0aFN0cmVhbTtcbn0oRGVjb2RlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBSdW5MZW5ndGhTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SdW5MZW5ndGhTdHJlYW0uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgU3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbnZhciBTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3RyZWFtKGJ1ZmZlciwgc3RhcnQsIGxlbmd0aCkge1xuICAgICAgICB0aGlzLmJ5dGVzID0gYnVmZmVyO1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICAgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgICAgICB0aGlzLmVuZCA9ICEhc3RhcnQgJiYgISFsZW5ndGggPyBzdGFydCArIGxlbmd0aCA6IHRoaXMuYnl0ZXMubGVuZ3RoO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyZWFtLnByb3RvdHlwZSwgXCJsZW5ndGhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVuZCAtIHRoaXMuc3RhcnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyZWFtLnByb3RvdHlwZSwgXCJpc0VtcHR5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDA7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLmdldEJ5dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMucG9zKytdO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5nZXRVaW50MTYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgaWYgKGIwID09PSAtMSB8fCBiMSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLmdldEludDMyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMiA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjMgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7XG4gICAgfTtcbiAgICAvLyBSZXR1cm5zIHN1YmFycmF5IG9mIG9yaWdpbmFsIGJ1ZmZlciwgc2hvdWxkIG9ubHkgYmUgcmVhZC5cbiAgICBTdHJlYW0ucHJvdG90eXBlLmdldEJ5dGVzID0gZnVuY3Rpb24gKGxlbmd0aCwgZm9yY2VDbGFtcGVkKSB7XG4gICAgICAgIGlmIChmb3JjZUNsYW1wZWQgPT09IHZvaWQgMCkgeyBmb3JjZUNsYW1wZWQgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzO1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3M7XG4gICAgICAgIHZhciBzdHJFbmQgPSB0aGlzLmVuZDtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBzdWJhcnJheSA9IGJ5dGVzLnN1YmFycmF5KHBvcywgc3RyRW5kKTtcbiAgICAgICAgICAgIC8vIGB0aGlzLmJ5dGVzYCBpcyBhbHdheXMgYSBgVWludDhBcnJheWAgaGVyZS5cbiAgICAgICAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgZW5kID0gcG9zICsgbGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHN0ckVuZCkge1xuICAgICAgICAgICAgICAgIGVuZCA9IHN0ckVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICAgICAgdmFyIHN1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBlbmQpO1xuICAgICAgICAgICAgLy8gYHRoaXMuYnl0ZXNgIGlzIGFsd2F5cyBhIGBVaW50OEFycmF5YCBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCA/IG5ldyBVaW50OENsYW1wZWRBcnJheShzdWJhcnJheSkgOiBzdWJhcnJheTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5wZWVrQnl0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBlZWtlZEJ5dGUgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdGhpcy5wb3MtLTtcbiAgICAgICAgcmV0dXJuIHBlZWtlZEJ5dGU7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLnBlZWtCeXRlcyA9IGZ1bmN0aW9uIChsZW5ndGgsIGZvcmNlQ2xhbXBlZCkge1xuICAgICAgICBpZiAoZm9yY2VDbGFtcGVkID09PSB2b2lkIDApIHsgZm9yY2VDbGFtcGVkID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGZvcmNlQ2xhbXBlZCk7XG4gICAgICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgaWYgKCFuKSB7XG4gICAgICAgICAgICBuID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyArPSBuO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5tb3ZlU3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvcztcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUubWFrZVN1YlN0cmVhbSA9IGZ1bmN0aW9uIChzdGFydCwgbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RyZWFtKHRoaXMuYnl0ZXMsIHN0YXJ0LCBsZW5ndGgpO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzO1xuICAgIH07XG4gICAgcmV0dXJuIFN0cmVhbTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvciwgVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBBc2NpaTg1U3RyZWFtIGZyb20gXCIuL0FzY2lpODVTdHJlYW1cIjtcbmltcG9ydCBBc2NpaUhleFN0cmVhbSBmcm9tIFwiLi9Bc2NpaUhleFN0cmVhbVwiO1xuaW1wb3J0IEZsYXRlU3RyZWFtIGZyb20gXCIuL0ZsYXRlU3RyZWFtXCI7XG5pbXBvcnQgTFpXU3RyZWFtIGZyb20gXCIuL0xaV1N0cmVhbVwiO1xuaW1wb3J0IFJ1bkxlbmd0aFN0cmVhbSBmcm9tIFwiLi9SdW5MZW5ndGhTdHJlYW1cIjtcbmltcG9ydCBTdHJlYW0gZnJvbSBcIi4vU3RyZWFtXCI7XG52YXIgZGVjb2RlU3RyZWFtID0gZnVuY3Rpb24gKHN0cmVhbSwgZW5jb2RpbmcsIHBhcmFtcykge1xuICAgIGlmIChlbmNvZGluZyA9PT0gUERGTmFtZS5vZignRmxhdGVEZWNvZGUnKSkge1xuICAgICAgICByZXR1cm4gbmV3IEZsYXRlU3RyZWFtKHN0cmVhbSk7XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyA9PT0gUERGTmFtZS5vZignTFpXRGVjb2RlJykpIHtcbiAgICAgICAgdmFyIGVhcmx5Q2hhbmdlID0gMTtcbiAgICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIFBERkRpY3QpIHtcbiAgICAgICAgICAgIHZhciBFYXJseUNoYW5nZSA9IHBhcmFtcy5sb29rdXAoUERGTmFtZS5vZignRWFybHlDaGFuZ2UnKSk7XG4gICAgICAgICAgICBpZiAoRWFybHlDaGFuZ2UgaW5zdGFuY2VvZiBQREZOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBlYXJseUNoYW5nZSA9IEVhcmx5Q2hhbmdlLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMWldTdHJlYW0oc3RyZWFtLCB1bmRlZmluZWQsIGVhcmx5Q2hhbmdlKTtcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nID09PSBQREZOYW1lLm9mKCdBU0NJSTg1RGVjb2RlJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBc2NpaTg1U3RyZWFtKHN0cmVhbSk7XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyA9PT0gUERGTmFtZS5vZignQVNDSUlIZXhEZWNvZGUnKSkge1xuICAgICAgICByZXR1cm4gbmV3IEFzY2lpSGV4U3RyZWFtKHN0cmVhbSk7XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyA9PT0gUERGTmFtZS5vZignUnVuTGVuZ3RoRGVjb2RlJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSdW5MZW5ndGhTdHJlYW0oc3RyZWFtKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRW5jb2RpbmdFcnJvcihlbmNvZGluZy5hc1N0cmluZygpKTtcbn07XG5leHBvcnQgdmFyIGRlY29kZVBERlJhd1N0cmVhbSA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBkaWN0ID0gX2EuZGljdCwgY29udGVudHMgPSBfYS5jb250ZW50cztcbiAgICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbShjb250ZW50cyk7XG4gICAgdmFyIEZpbHRlciA9IGRpY3QubG9va3VwKFBERk5hbWUub2YoJ0ZpbHRlcicpKTtcbiAgICB2YXIgRGVjb2RlUGFybXMgPSBkaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdEZWNvZGVQYXJtcycpKTtcbiAgICBpZiAoRmlsdGVyIGluc3RhbmNlb2YgUERGTmFtZSkge1xuICAgICAgICBzdHJlYW0gPSBkZWNvZGVTdHJlYW0oc3RyZWFtLCBGaWx0ZXIsIERlY29kZVBhcm1zKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoRmlsdGVyIGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gRmlsdGVyLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgc3RyZWFtID0gZGVjb2RlU3RyZWFtKHN0cmVhbSwgRmlsdGVyLmxvb2t1cChpZHgsIFBERk5hbWUpLCBEZWNvZGVQYXJtcyAmJiBEZWNvZGVQYXJtcy5sb29rdXBNYXliZShpZHgsIFBERkRpY3QpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICghIUZpbHRlcikge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvcihbUERGTmFtZSwgUERGQXJyYXldLCBGaWx0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyZWFtO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlY29kZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCB7IFBERkFjcm9Gb3JtIH0gZnJvbSBcIi4uL2Fjcm9mb3JtXCI7XG5pbXBvcnQgVmlld2VyUHJlZmVyZW5jZXMgZnJvbSAnLi4vaW50ZXJhY3RpdmUvVmlld2VyUHJlZmVyZW5jZXMnO1xudmFyIFBERkNhdGFsb2cgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkNhdGFsb2csIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQ2F0YWxvZygpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5QYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwKFBERk5hbWUub2YoJ1BhZ2VzJyksIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuQWNyb0Zvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ0Fjcm9Gb3JtJyksIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuZ2V0QWNyb0Zvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5BY3JvRm9ybSgpO1xuICAgICAgICBpZiAoIWRpY3QpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gUERGQWNyb0Zvcm0uZnJvbURpY3QoZGljdCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5nZXRPckNyZWF0ZUFjcm9Gb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYWNyb0Zvcm0gPSB0aGlzLmdldEFjcm9Gb3JtKCk7XG4gICAgICAgIGlmICghYWNyb0Zvcm0pIHtcbiAgICAgICAgICAgIGFjcm9Gb3JtID0gUERGQWNyb0Zvcm0uY3JlYXRlKHRoaXMuY29udGV4dCk7XG4gICAgICAgICAgICB2YXIgYWNyb0Zvcm1SZWYgPSB0aGlzLmNvbnRleHQucmVnaXN0ZXIoYWNyb0Zvcm0uZGljdCk7XG4gICAgICAgICAgICB0aGlzLnNldChQREZOYW1lLm9mKCdBY3JvRm9ybScpLCBhY3JvRm9ybVJlZik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjcm9Gb3JtO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuVmlld2VyUHJlZmVyZW5jZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ1ZpZXdlclByZWZlcmVuY2VzJyksIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuZ2V0Vmlld2VyUHJlZmVyZW5jZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5WaWV3ZXJQcmVmZXJlbmNlcygpO1xuICAgICAgICBpZiAoIWRpY3QpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gVmlld2VyUHJlZmVyZW5jZXMuZnJvbURpY3QoZGljdCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmlld2VyUHJlZnMgPSB0aGlzLmdldFZpZXdlclByZWZlcmVuY2VzKCk7XG4gICAgICAgIGlmICghdmlld2VyUHJlZnMpIHtcbiAgICAgICAgICAgIHZpZXdlclByZWZzID0gVmlld2VyUHJlZmVyZW5jZXMuY3JlYXRlKHRoaXMuY29udGV4dCk7XG4gICAgICAgICAgICB2YXIgdmlld2VyUHJlZnNSZWYgPSB0aGlzLmNvbnRleHQucmVnaXN0ZXIodmlld2VyUHJlZnMuZGljdCk7XG4gICAgICAgICAgICB0aGlzLnNldChQREZOYW1lLm9mKCdWaWV3ZXJQcmVmZXJlbmNlcycpLCB2aWV3ZXJQcmVmc1JlZik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXdlclByZWZzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgZ2l2ZW4gcmVmIGFzIGEgbGVhZiBub2RlIG9mIHRoaXMgY2F0YWxvZydzIHBhZ2UgdHJlZSBhdCB0aGVcbiAgICAgKiBzcGVjaWZpZWQgaW5kZXggKHplcm8tYmFzZWQpLiBBbHNvIGluY3JlbWVudHMgdGhlIGBDb3VudGAgb2YgZWFjaCBub2RlIGluXG4gICAgICogdGhlIHBhZ2UgdHJlZSBoaWVyYXJjaHkgdG8gYWNjb21vZGF0ZSB0aGUgbmV3IHBhZ2UuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSByZWYgb2YgdGhlIFBERlBhZ2VUcmVlIG5vZGUgaW50byB3aGljaCBgbGVhZlJlZmAgd2FzIGluc2VydGVkLlxuICAgICAqL1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLmluc2VydExlYWZOb2RlID0gZnVuY3Rpb24gKGxlYWZSZWYsIGluZGV4KSB7XG4gICAgICAgIHZhciBwYWdlc1JlZiA9IHRoaXMuZ2V0KFBERk5hbWUub2YoJ1BhZ2VzJykpO1xuICAgICAgICB2YXIgbWF5YmVQYXJlbnRSZWYgPSB0aGlzLlBhZ2VzKCkuaW5zZXJ0TGVhZk5vZGUobGVhZlJlZiwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gbWF5YmVQYXJlbnRSZWYgfHwgcGFnZXNSZWY7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5yZW1vdmVMZWFmTm9kZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB0aGlzLlBhZ2VzKCkucmVtb3ZlTGVhZk5vZGUoaW5kZXgpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy53aXRoQ29udGV4dEFuZFBhZ2VzID0gZnVuY3Rpb24gKGNvbnRleHQsIHBhZ2VzKSB7XG4gICAgICAgIHZhciBkaWN0ID0gbmV3IE1hcCgpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdUeXBlJyksIFBERk5hbWUub2YoJ0NhdGFsb2cnKSk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ1BhZ2VzJyksIHBhZ2VzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZDYXRhbG9nKGRpY3QsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5mcm9tTWFwV2l0aENvbnRleHQgPSBmdW5jdGlvbiAobWFwLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQ2F0YWxvZyhtYXAsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkNhdGFsb2c7XG59KFBERkRpY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkNhdGFsb2c7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZDYXRhbG9nLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkZsYXRlU3RyZWFtIGZyb20gXCIuL1BERkZsYXRlU3RyZWFtXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgUERGQ29udGVudFN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQ29udGVudFN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZDb250ZW50U3RyZWFtKGRpY3QsIG9wZXJhdG9ycywgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRpY3QsIGVuY29kZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMub3BlcmF0b3JzID0gb3BlcmF0b3JzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkNvbnRlbnRTdHJlYW0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgb3BlcmF0b3JzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgKF9hID0gdGhpcy5vcGVyYXRvcnMpLnB1c2guYXBwbHkoX2EsIG9wZXJhdG9ycyk7XG4gICAgfTtcbiAgICBQREZDb250ZW50U3RyZWFtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBvcGVyYXRvcnMgPSBuZXcgQXJyYXkodGhpcy5vcGVyYXRvcnMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBvcGVyYXRvcnNbaWR4XSA9IHRoaXMub3BlcmF0b3JzW2lkeF0uY2xvbmUoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gdGhpcywgZGljdCA9IF9hLmRpY3QsIGVuY29kZSA9IF9hLmVuY29kZTtcbiAgICAgICAgcmV0dXJuIFBERkNvbnRlbnRTdHJlYW0ub2YoZGljdC5jbG9uZShjb250ZXh0KSwgb3BlcmF0b3JzLCBlbmNvZGUpO1xuICAgIH07XG4gICAgUERGQ29udGVudFN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhbHVlICs9IHRoaXMub3BlcmF0b3JzW2lkeF0gKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERkNvbnRlbnRTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRVbmVuY29kZWRDb250ZW50c1NpemUoKSk7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG9mZnNldCArPSB0aGlzLm9wZXJhdG9yc1tpZHhdLmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfTtcbiAgICBQREZDb250ZW50U3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50c1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzaXplID0gMDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBzaXplICs9IHRoaXMub3BlcmF0b3JzW2lkeF0uc2l6ZUluQnl0ZXMoKSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcbiAgICBQREZDb250ZW50U3RyZWFtLm9mID0gZnVuY3Rpb24gKGRpY3QsIG9wZXJhdG9ycywgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHJldHVybiBuZXcgUERGQ29udGVudFN0cmVhbShkaWN0LCBvcGVyYXRvcnMsIGVuY29kZSk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQ29udGVudFN0cmVhbTtcbn0oUERGRmxhdGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IFBERkNvbnRlbnRTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZDb250ZW50U3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZGbGF0ZVN0cmVhbSBmcm9tIFwiLi9QREZGbGF0ZVN0cmVhbVwiO1xuaW1wb3J0IHsgYnl0ZXNGb3IsIENhY2hlLCByZXZlcnNlQXJyYXksIHNpemVJbkJ5dGVzLCBzdW0gfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmV4cG9ydCB2YXIgRW50cnlUeXBlO1xuKGZ1bmN0aW9uIChFbnRyeVR5cGUpIHtcbiAgICBFbnRyeVR5cGVbRW50cnlUeXBlW1wiRGVsZXRlZFwiXSA9IDBdID0gXCJEZWxldGVkXCI7XG4gICAgRW50cnlUeXBlW0VudHJ5VHlwZVtcIlVuY29tcHJlc3NlZFwiXSA9IDFdID0gXCJVbmNvbXByZXNzZWRcIjtcbiAgICBFbnRyeVR5cGVbRW50cnlUeXBlW1wiQ29tcHJlc3NlZFwiXSA9IDJdID0gXCJDb21wcmVzc2VkXCI7XG59KShFbnRyeVR5cGUgfHwgKEVudHJ5VHlwZSA9IHt9KSk7XG4vKipcbiAqIEVudHJpZXMgc2hvdWxkIGJlIGFkZGVkIHVzaW5nIHRoZSBbW2FkZERlbGV0ZWRFbnRyeV1dLFxuICogW1thZGRVbmNvbXByZXNzZWRFbnRyeV1dLCBhbmQgW1thZGRDb21wcmVzc2VkRW50cnldXSBtZXRob2RzXG4gKiAqKmluIG9yZGVyIG9mIGFzY2VuZGluZyBvYmplY3QgbnVtYmVyKiouXG4gKi9cbnZhciBQREZDcm9zc1JlZlN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQ3Jvc3NSZWZTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQ3Jvc3NSZWZTdHJlYW0oZGljdCwgZW50cmllcywgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRpY3QsIGVuY29kZSkgfHwgdGhpcztcbiAgICAgICAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBpbnRlZ2VyIHBhaXJzIGZvciBlYWNoIHN1YnNlY3Rpb24gb2YgdGhlIGNyb3NzIHJlZlxuICAgICAgICAvLyBzZWN0aW9uLCB3aGVyZSBlYWNoIGludGVnZXIgcGFpciByZXByZXNlbnRzOlxuICAgICAgICAvLyAgIGZpcnN0T2JqZWN0TnVtYmVyKE9mU2VjdGlvbiksIGxlbmd0aChPZlNlY3Rpb24pXG4gICAgICAgIF90aGlzLmNvbXB1dGVJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzdWJzZWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgdmFyIHN1YnNlY3Rpb25MZW5ndGggPSAwO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gX3RoaXMuZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VyckVudHJ5ID0gX3RoaXMuZW50cmllc1tpZHhdO1xuICAgICAgICAgICAgICAgIHZhciBwcmV2RW50cnkgPSBfdGhpcy5lbnRyaWVzW2lkeCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChpZHggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2VjdGlvbnMucHVzaChjdXJyRW50cnkucmVmLm9iamVjdE51bWJlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJFbnRyeS5yZWYub2JqZWN0TnVtYmVyIC0gcHJldkVudHJ5LnJlZi5vYmplY3ROdW1iZXIgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNlY3Rpb25zLnB1c2goc3Vic2VjdGlvbkxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNlY3Rpb25zLnB1c2goY3VyckVudHJ5LnJlZi5vYmplY3ROdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICBzdWJzZWN0aW9uTGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3Vic2VjdGlvbkxlbmd0aCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Vic2VjdGlvbnMucHVzaChzdWJzZWN0aW9uTGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiBzdWJzZWN0aW9ucztcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuY29tcHV0ZUVudHJ5VHVwbGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGVudHJ5VHVwbGVzID0gbmV3IEFycmF5KF90aGlzLmVudHJpZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IF90aGlzLmVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cmllc1tpZHhdO1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS50eXBlID09PSBFbnRyeVR5cGUuRGVsZXRlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGVudHJ5LnR5cGUsIG5leHRGcmVlT2JqZWN0TnVtYmVyID0gZW50cnkubmV4dEZyZWVPYmplY3ROdW1iZXIsIHJlZiA9IGVudHJ5LnJlZjtcbiAgICAgICAgICAgICAgICAgICAgZW50cnlUdXBsZXNbaWR4XSA9IFt0eXBlLCBuZXh0RnJlZU9iamVjdE51bWJlciwgcmVmLmdlbmVyYXRpb25OdW1iZXJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gRW50cnlUeXBlLlVuY29tcHJlc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGVudHJ5LnR5cGUsIG9mZnNldCA9IGVudHJ5Lm9mZnNldCwgcmVmID0gZW50cnkucmVmO1xuICAgICAgICAgICAgICAgICAgICBlbnRyeVR1cGxlc1tpZHhdID0gW3R5cGUsIG9mZnNldCwgcmVmLmdlbmVyYXRpb25OdW1iZXJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gRW50cnlUeXBlLkNvbXByZXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBlbnRyeS50eXBlLCBvYmplY3RTdHJlYW1SZWYgPSBlbnRyeS5vYmplY3RTdHJlYW1SZWYsIGluZGV4ID0gZW50cnkuaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5VHVwbGVzW2lkeF0gPSBbdHlwZSwgb2JqZWN0U3RyZWFtUmVmLm9iamVjdE51bWJlciwgaW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnRyeVR1cGxlcztcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuY29tcHV0ZU1heEVudHJ5Qnl0ZVdpZHRocyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlbnRyeVR1cGxlcyA9IF90aGlzLmVudHJ5VHVwbGVzQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgICAgICB2YXIgd2lkdGhzID0gWzAsIDAsIDBdO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cnlUdXBsZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gZW50cnlUdXBsZXNbaWR4XSwgZmlyc3QgPSBfYVswXSwgc2Vjb25kID0gX2FbMV0sIHRoaXJkID0gX2FbMl07XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0U2l6ZSA9IHNpemVJbkJ5dGVzKGZpcnN0KTtcbiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kU2l6ZSA9IHNpemVJbkJ5dGVzKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXJkU2l6ZSA9IHNpemVJbkJ5dGVzKHRoaXJkKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RTaXplID4gd2lkdGhzWzBdKVxuICAgICAgICAgICAgICAgICAgICB3aWR0aHNbMF0gPSBmaXJzdFNpemU7XG4gICAgICAgICAgICAgICAgaWYgKHNlY29uZFNpemUgPiB3aWR0aHNbMV0pXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoc1sxXSA9IHNlY29uZFNpemU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXJkU2l6ZSA+IHdpZHRoc1syXSlcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhzWzJdID0gdGhpcmRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdpZHRocztcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuZW50cmllcyA9IGVudHJpZXMgfHwgW107XG4gICAgICAgIF90aGlzLmVudHJ5VHVwbGVzQ2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeShfdGhpcy5jb21wdXRlRW50cnlUdXBsZXMpO1xuICAgICAgICBfdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeShfdGhpcy5jb21wdXRlTWF4RW50cnlCeXRlV2lkdGhzKTtcbiAgICAgICAgX3RoaXMuaW5kZXhDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KF90aGlzLmNvbXB1dGVJbmRleCk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ1R5cGUnKSwgUERGTmFtZS5vZignWFJlZicpKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuYWRkRGVsZXRlZEVudHJ5ID0gZnVuY3Rpb24gKHJlZiwgbmV4dEZyZWVPYmplY3ROdW1iZXIpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBFbnRyeVR5cGUuRGVsZXRlZDtcbiAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goeyB0eXBlOiB0eXBlLCByZWY6IHJlZiwgbmV4dEZyZWVPYmplY3ROdW1iZXI6IG5leHRGcmVlT2JqZWN0TnVtYmVyIH0pO1xuICAgICAgICB0aGlzLmVudHJ5VHVwbGVzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuaW5kZXhDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuY29udGVudHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuYWRkVW5jb21wcmVzc2VkRW50cnkgPSBmdW5jdGlvbiAocmVmLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBFbnRyeVR5cGUuVW5jb21wcmVzc2VkO1xuICAgICAgICB0aGlzLmVudHJpZXMucHVzaCh7IHR5cGU6IHR5cGUsIHJlZjogcmVmLCBvZmZzZXQ6IG9mZnNldCB9KTtcbiAgICAgICAgdGhpcy5lbnRyeVR1cGxlc0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLmluZGV4Q2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLmNvbnRlbnRzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLmFkZENvbXByZXNzZWRFbnRyeSA9IGZ1bmN0aW9uIChyZWYsIG9iamVjdFN0cmVhbVJlZiwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBFbnRyeVR5cGUuQ29tcHJlc3NlZDtcbiAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goeyB0eXBlOiB0eXBlLCByZWY6IHJlZiwgb2JqZWN0U3RyZWFtUmVmOiBvYmplY3RTdHJlYW1SZWYsIGluZGV4OiBpbmRleCB9KTtcbiAgICAgICAgdGhpcy5lbnRyeVR1cGxlc0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLmluZGV4Q2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLmNvbnRlbnRzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgZGljdCA9IF9hLmRpY3QsIGVudHJpZXMgPSBfYS5lbnRyaWVzLCBlbmNvZGUgPSBfYS5lbmNvZGU7XG4gICAgICAgIHJldHVybiBQREZDcm9zc1JlZlN0cmVhbS5vZihkaWN0LmNsb25lKGNvbnRleHQpLCBlbnRyaWVzLnNsaWNlKCksIGVuY29kZSk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbnRyeVR1cGxlcyA9IHRoaXMuZW50cnlUdXBsZXNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIGJ5dGVXaWR0aHMgPSB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIGZvciAodmFyIGVudHJ5SWR4ID0gMCwgZW50cmllc0xlbiA9IGVudHJ5VHVwbGVzLmxlbmd0aDsgZW50cnlJZHggPCBlbnRyaWVzTGVuOyBlbnRyeUlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyeVR1cGxlc1tlbnRyeUlkeF0sIGZpcnN0ID0gX2FbMF0sIHNlY29uZCA9IF9hWzFdLCB0aGlyZCA9IF9hWzJdO1xuICAgICAgICAgICAgdmFyIGZpcnN0Qnl0ZXMgPSByZXZlcnNlQXJyYXkoYnl0ZXNGb3IoZmlyc3QpKTtcbiAgICAgICAgICAgIHZhciBzZWNvbmRCeXRlcyA9IHJldmVyc2VBcnJheShieXRlc0ZvcihzZWNvbmQpKTtcbiAgICAgICAgICAgIHZhciB0aGlyZEJ5dGVzID0gcmV2ZXJzZUFycmF5KGJ5dGVzRm9yKHRoaXJkKSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSBieXRlV2lkdGhzWzBdIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gKGZpcnN0Qnl0ZXNbaWR4XSB8fCAwKS50b1N0cmluZygyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IGJ5dGVXaWR0aHNbMV0gLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAoc2Vjb25kQnl0ZXNbaWR4XSB8fCAwKS50b1N0cmluZygyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IGJ5dGVXaWR0aHNbMl0gLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAodGhpcmRCeXRlc1tpZHhdIHx8IDApLnRvU3RyaW5nKDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVudHJ5VHVwbGVzID0gdGhpcy5lbnRyeVR1cGxlc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgYnl0ZVdpZHRocyA9IHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRVbmVuY29kZWRDb250ZW50c1NpemUoKSk7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKHZhciBlbnRyeUlkeCA9IDAsIGVudHJpZXNMZW4gPSBlbnRyeVR1cGxlcy5sZW5ndGg7IGVudHJ5SWR4IDwgZW50cmllc0xlbjsgZW50cnlJZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZW50cnlUdXBsZXNbZW50cnlJZHhdLCBmaXJzdCA9IF9hWzBdLCBzZWNvbmQgPSBfYVsxXSwgdGhpcmQgPSBfYVsyXTtcbiAgICAgICAgICAgIHZhciBmaXJzdEJ5dGVzID0gcmV2ZXJzZUFycmF5KGJ5dGVzRm9yKGZpcnN0KSk7XG4gICAgICAgICAgICB2YXIgc2Vjb25kQnl0ZXMgPSByZXZlcnNlQXJyYXkoYnl0ZXNGb3Ioc2Vjb25kKSk7XG4gICAgICAgICAgICB2YXIgdGhpcmRCeXRlcyA9IHJldmVyc2VBcnJheShieXRlc0Zvcih0aGlyZCkpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gYnl0ZVdpZHRoc1swXSAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBmaXJzdEJ5dGVzW2lkeF0gfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IGJ5dGVXaWR0aHNbMV0gLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gc2Vjb25kQnl0ZXNbaWR4XSB8fCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gYnl0ZVdpZHRoc1syXSAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSB0aGlyZEJ5dGVzW2lkeF0gfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGVXaWR0aHMgPSB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIGVudHJ5V2lkdGggPSBzdW0oYnl0ZVdpZHRocyk7XG4gICAgICAgIHJldHVybiBlbnRyeVdpZHRoICogdGhpcy5lbnRyaWVzLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS51cGRhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLnVwZGF0ZURpY3QuY2FsbCh0aGlzKTtcbiAgICAgICAgdmFyIGJ5dGVXaWR0aHMgPSB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5pbmRleENhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuZGljdC5jb250ZXh0O1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1cnKSwgY29udGV4dC5vYmooYnl0ZVdpZHRocykpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0luZGV4JyksIGNvbnRleHQub2JqKGluZGV4KSk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5jcmVhdGUgPSBmdW5jdGlvbiAoZGljdCwgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHZhciBzdHJlYW0gPSBuZXcgUERGQ3Jvc3NSZWZTdHJlYW0oZGljdCwgW10sIGVuY29kZSk7XG4gICAgICAgIHN0cmVhbS5hZGREZWxldGVkRW50cnkoUERGUmVmLm9mKDAsIDY1NTM1KSwgMCk7XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5vZiA9IGZ1bmN0aW9uIChkaWN0LCBlbnRyaWVzLCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZDcm9zc1JlZlN0cmVhbShkaWN0LCBlbnRyaWVzLCBlbmNvZGUpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkNyb3NzUmVmU3RyZWFtO1xufShQREZGbGF0ZVN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQ3Jvc3NSZWZTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZDcm9zc1JlZlN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBwYWtvIGZyb20gJ3Bha28nO1xuaW1wb3J0IHsgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGU3RyZWFtXCI7XG5pbXBvcnQgeyBDYWNoZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERkZsYXRlU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZGbGF0ZVN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZGbGF0ZVN0cmVhbShkaWN0LCBlbmNvZGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGljdCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29tcHV0ZUNvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVuZW5jb2RlZENvbnRlbnRzID0gX3RoaXMuZ2V0VW5lbmNvZGVkQ29udGVudHMoKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5lbmNvZGUgPyBwYWtvLmRlZmxhdGUodW5lbmNvZGVkQ29udGVudHMpIDogdW5lbmNvZGVkQ29udGVudHM7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmVuY29kZSA9IGVuY29kZTtcbiAgICAgICAgaWYgKGVuY29kZSlcbiAgICAgICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ0ZpbHRlcicpLCBQREZOYW1lLm9mKCdGbGF0ZURlY29kZScpKTtcbiAgICAgICAgX3RoaXMuY29udGVudHNDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KF90aGlzLmNvbXB1dGVDb250ZW50cyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50c0NhY2hlLmFjY2VzcygpO1xuICAgIH07XG4gICAgUERGRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudHNDYWNoZS5hY2Nlc3MoKS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0VW5lbmNvZGVkQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2dldFVuZW5jb2RlZENvbnRlbnRzJyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRmxhdGVTdHJlYW07XG59KFBERlN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRmxhdGVTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZGbGF0ZVN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGRmxhdGVTdHJlYW0gZnJvbSBcIi4vUERGRmxhdGVTdHJlYW1cIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyLCBsYXN0IH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGT2JqZWN0U3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZPYmplY3RTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGT2JqZWN0U3RyZWFtKGNvbnRleHQsIG9iamVjdHMsIGVuY29kZSkge1xuICAgICAgICBpZiAoZW5jb2RlID09PSB2b2lkIDApIHsgZW5jb2RlID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjb250ZXh0Lm9iaih7fSksIGVuY29kZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMub2JqZWN0cyA9IG9iamVjdHM7XG4gICAgICAgIF90aGlzLm9mZnNldHMgPSBfdGhpcy5jb21wdXRlT2JqZWN0T2Zmc2V0cygpO1xuICAgICAgICBfdGhpcy5vZmZzZXRzU3RyaW5nID0gX3RoaXMuY29tcHV0ZU9mZnNldHNTdHJpbmcoKTtcbiAgICAgICAgX3RoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVHlwZScpLCBQREZOYW1lLm9mKCdPYmpTdG0nKSk7XG4gICAgICAgIF90aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ04nKSwgUERGTnVtYmVyLm9mKF90aGlzLm9iamVjdHMubGVuZ3RoKSk7XG4gICAgICAgIF90aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0ZpcnN0JyksIFBERk51bWJlci5vZihfdGhpcy5vZmZzZXRzU3RyaW5nLmxlbmd0aCkpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERk9iamVjdFN0cmVhbS5wcm90b3R5cGUuZ2V0T2JqZWN0c0NvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gUERGT2JqZWN0U3RyZWFtLndpdGhDb250ZXh0QW5kT2JqZWN0cyhjb250ZXh0IHx8IHRoaXMuZGljdC5jb250ZXh0LCB0aGlzLm9iamVjdHMuc2xpY2UoKSwgdGhpcy5lbmNvZGUpO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5vZmZzZXRzU3RyaW5nO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9iamVjdHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLm9iamVjdHNbaWR4XSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgICAgICB2YWx1ZSArPSBvYmplY3QgKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbS5wcm90b3R5cGUuZ2V0VW5lbmNvZGVkQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0aGlzLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSgpKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMub2Zmc2V0c1N0cmluZywgYnVmZmVyLCAwKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vYmplY3RzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5vYmplY3RzW2lkeF0sIG9iamVjdCA9IF9hWzFdO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IG9iamVjdC5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50c1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5vZmZzZXRzU3RyaW5nLmxlbmd0aCArXG4gICAgICAgICAgICBsYXN0KHRoaXMub2Zmc2V0cylbMV0gK1xuICAgICAgICAgICAgbGFzdCh0aGlzLm9iamVjdHMpWzFdLnNpemVJbkJ5dGVzKCkgK1xuICAgICAgICAgICAgMSk7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ucHJvdG90eXBlLmNvbXB1dGVPZmZzZXRzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb2Zmc2V0c1N0cmluZyA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9mZnNldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLm9mZnNldHNbaWR4XSwgb2JqZWN0TnVtYmVyID0gX2FbMF0sIG9mZnNldCA9IF9hWzFdO1xuICAgICAgICAgICAgb2Zmc2V0c1N0cmluZyArPSBvYmplY3ROdW1iZXIgKyBcIiBcIiArIG9mZnNldCArIFwiIFwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZmZzZXRzU3RyaW5nO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5jb21wdXRlT2JqZWN0T2Zmc2V0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIHZhciBvZmZzZXRzID0gbmV3IEFycmF5KHRoaXMub2JqZWN0cy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9iamVjdHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLm9iamVjdHNbaWR4XSwgcmVmID0gX2FbMF0sIG9iamVjdCA9IF9hWzFdO1xuICAgICAgICAgICAgb2Zmc2V0c1tpZHhdID0gW3JlZi5vYmplY3ROdW1iZXIsIG9mZnNldF07XG4gICAgICAgICAgICBvZmZzZXQgKz0gb2JqZWN0LnNpemVJbkJ5dGVzKCkgKyAxOyAvLyAnXFxuJ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZmZzZXRzO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLndpdGhDb250ZXh0QW5kT2JqZWN0cyA9IGZ1bmN0aW9uIChjb250ZXh0LCBvYmplY3RzLCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZPYmplY3RTdHJlYW0oY29udGV4dCwgb2JqZWN0cywgZW5jb2RlKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZPYmplY3RTdHJlYW07XG59KFBERkZsYXRlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPYmplY3RTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPYmplY3RTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmVhbVwiO1xudmFyIFBERlBhZ2VMZWFmID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZQYWdlTGVhZiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZQYWdlTGVhZihtYXAsIGNvbnRleHQsIGF1dG9Ob3JtYWxpemVDVE0pIHtcbiAgICAgICAgaWYgKGF1dG9Ob3JtYWxpemVDVE0gPT09IHZvaWQgMCkgeyBhdXRvTm9ybWFsaXplQ1RNID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtYXAsIGNvbnRleHQpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm5vcm1hbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuYXV0b05vcm1hbGl6ZUNUTSA9IGF1dG9Ob3JtYWxpemVDVE07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNsb25lID0gUERGUGFnZUxlYWYuZnJvbU1hcFdpdGhDb250ZXh0KG5ldyBNYXAoKSwgY29udGV4dCB8fCB0aGlzLmNvbnRleHQsIHRoaXMuYXV0b05vcm1hbGl6ZUNUTSk7XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICAgICAgY2xvbmUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5QYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE1heWJlKFBERk5hbWUuUGFyZW50LCBQREZEaWN0KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5Db250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwKFBERk5hbWUub2YoJ0NvbnRlbnRzJykpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLkFubm90cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5Bbm5vdHMsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5CbGVlZEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5CbGVlZEJveCwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLlRyaW1Cb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE1heWJlKFBERk5hbWUuVHJpbUJveCwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLkFydEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5BcnRCb3gsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5SZXNvdXJjZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaWN0T3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUuUmVzb3VyY2VzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5sb29rdXBNYXliZShkaWN0T3JSZWYsIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLk1lZGlhQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJyYXlPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5NZWRpYUJveCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQubG9va3VwKGFycmF5T3JSZWYsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5Dcm9wQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJyYXlPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5Dcm9wQm94KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5sb29rdXBNYXliZShhcnJheU9yUmVmLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuUm90YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbnVtYmVyT3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUuUm90YXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5sb29rdXBNYXliZShudW1iZXJPclJlZiwgUERGTnVtYmVyKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGU7XG4gICAgICAgIHRoaXMuYXNjZW5kKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZSlcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBub2RlLmdldChuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuc2V0UGFyZW50ID0gZnVuY3Rpb24gKHBhcmVudFJlZikge1xuICAgICAgICB0aGlzLnNldChQREZOYW1lLlBhcmVudCwgcGFyZW50UmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5hZGRDb250ZW50U3RyZWFtID0gZnVuY3Rpb24gKGNvbnRlbnRTdHJlYW1SZWYpIHtcbiAgICAgICAgdmFyIENvbnRlbnRzID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkNvbnRlbnRzIHx8IHRoaXMuY29udGV4dC5vYmooW10pO1xuICAgICAgICB0aGlzLnNldChQREZOYW1lLkNvbnRlbnRzLCBDb250ZW50cyk7XG4gICAgICAgIENvbnRlbnRzLnB1c2goY29udGVudFN0cmVhbVJlZik7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUud3JhcENvbnRlbnRTdHJlYW1zID0gZnVuY3Rpb24gKHN0YXJ0U3RyZWFtLCBlbmRTdHJlYW0pIHtcbiAgICAgICAgdmFyIENvbnRlbnRzID0gdGhpcy5Db250ZW50cygpO1xuICAgICAgICBpZiAoQ29udGVudHMgaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICAgICAgQ29udGVudHMuaW5zZXJ0KDAsIHN0YXJ0U3RyZWFtKTtcbiAgICAgICAgICAgIENvbnRlbnRzLnB1c2goZW5kU3RyZWFtKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5hZGRBbm5vdCA9IGZ1bmN0aW9uIChhbm5vdFJlZikge1xuICAgICAgICB2YXIgQW5ub3RzID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkFubm90cztcbiAgICAgICAgQW5ub3RzLnB1c2goYW5ub3RSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLnJlbW92ZUFubm90ID0gZnVuY3Rpb24gKGFubm90UmVmKSB7XG4gICAgICAgIHZhciBBbm5vdHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuQW5ub3RzO1xuICAgICAgICB2YXIgaW5kZXggPSBBbm5vdHMuaW5kZXhPZihhbm5vdFJlZik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBBbm5vdHMucmVtb3ZlKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLnNldEZvbnREaWN0aW9uYXJ5ID0gZnVuY3Rpb24gKG5hbWUsIGZvbnREaWN0UmVmKSB7XG4gICAgICAgIHZhciBGb250ID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkZvbnQ7XG4gICAgICAgIEZvbnQuc2V0KG5hbWUsIGZvbnREaWN0UmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5uZXdGb250RGljdGlvbmFyeUtleSA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgdmFyIEZvbnQgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuRm9udDtcbiAgICAgICAgcmV0dXJuIEZvbnQudW5pcXVlS2V5KHRhZyk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUubmV3Rm9udERpY3Rpb25hcnkgPSBmdW5jdGlvbiAodGFnLCBmb250RGljdFJlZikge1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5uZXdGb250RGljdGlvbmFyeUtleSh0YWcpO1xuICAgICAgICB0aGlzLnNldEZvbnREaWN0aW9uYXJ5KGtleSwgZm9udERpY3RSZWYpO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLnNldFhPYmplY3QgPSBmdW5jdGlvbiAobmFtZSwgeE9iamVjdFJlZikge1xuICAgICAgICB2YXIgWE9iamVjdCA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5YT2JqZWN0O1xuICAgICAgICBYT2JqZWN0LnNldChuYW1lLCB4T2JqZWN0UmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5uZXdYT2JqZWN0S2V5ID0gZnVuY3Rpb24gKHRhZykge1xuICAgICAgICB2YXIgWE9iamVjdCA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5YT2JqZWN0O1xuICAgICAgICByZXR1cm4gWE9iamVjdC51bmlxdWVLZXkodGFnKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5uZXdYT2JqZWN0ID0gZnVuY3Rpb24gKHRhZywgeE9iamVjdFJlZikge1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5uZXdYT2JqZWN0S2V5KHRhZyk7XG4gICAgICAgIHRoaXMuc2V0WE9iamVjdChrZXksIHhPYmplY3RSZWYpO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLnNldEV4dEdTdGF0ZSA9IGZ1bmN0aW9uIChuYW1lLCBleHRHU3RhdGVSZWYpIHtcbiAgICAgICAgdmFyIEV4dEdTdGF0ZSA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5FeHRHU3RhdGU7XG4gICAgICAgIEV4dEdTdGF0ZS5zZXQobmFtZSwgZXh0R1N0YXRlUmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5uZXdFeHRHU3RhdGVLZXkgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHZhciBFeHRHU3RhdGUgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuRXh0R1N0YXRlO1xuICAgICAgICByZXR1cm4gRXh0R1N0YXRlLnVuaXF1ZUtleSh0YWcpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5ld0V4dEdTdGF0ZSA9IGZ1bmN0aW9uICh0YWcsIGV4dEdTdGF0ZVJlZikge1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5uZXdFeHRHU3RhdGVLZXkodGFnKTtcbiAgICAgICAgdGhpcy5zZXRFeHRHU3RhdGUoa2V5LCBleHRHU3RhdGVSZWYpO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLmFzY2VuZCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgICAgIHZpc2l0b3IodGhpcyk7XG4gICAgICAgIHZhciBQYXJlbnQgPSB0aGlzLlBhcmVudCgpO1xuICAgICAgICBpZiAoUGFyZW50KVxuICAgICAgICAgICAgUGFyZW50LmFzY2VuZCh2aXNpdG9yKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICB2YXIgY29udGVudHNSZWYgPSB0aGlzLmdldChQREZOYW1lLkNvbnRlbnRzKTtcbiAgICAgICAgdmFyIGNvbnRlbnRzID0gdGhpcy5jb250ZXh0Lmxvb2t1cChjb250ZW50c1JlZik7XG4gICAgICAgIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIFBERlN0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoUERGTmFtZS5Db250ZW50cywgY29udGV4dC5vYmooW2NvbnRlbnRzUmVmXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF1dG9Ob3JtYWxpemVDVE0pIHtcbiAgICAgICAgICAgIHRoaXMud3JhcENvbnRlbnRTdHJlYW1zKHRoaXMuY29udGV4dC5nZXRQdXNoR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW0oKSwgdGhpcy5jb250ZXh0LmdldFBvcEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IENsb25lIGBSZXNvdXJjZXNgIGlmIGl0IGlzIGluaGVyaXRlZFxuICAgICAgICB2YXIgZGljdE9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLlJlc291cmNlcyk7XG4gICAgICAgIHZhciBSZXNvdXJjZXMgPSBjb250ZXh0Lmxvb2t1cE1heWJlKGRpY3RPclJlZiwgUERGRGljdCkgfHwgY29udGV4dC5vYmooe30pO1xuICAgICAgICB0aGlzLnNldChQREZOYW1lLlJlc291cmNlcywgUmVzb3VyY2VzKTtcbiAgICAgICAgLy8gVE9ETzogQ2xvbmUgYEZvbnRgIGlmIGl0IGlzIGluaGVyaXRlZFxuICAgICAgICB2YXIgRm9udCA9IFJlc291cmNlcy5sb29rdXBNYXliZShQREZOYW1lLkZvbnQsIFBERkRpY3QpIHx8IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgUmVzb3VyY2VzLnNldChQREZOYW1lLkZvbnQsIEZvbnQpO1xuICAgICAgICAvLyBUT0RPOiBDbG9uZSBgWE9iamVjdGAgaWYgaXQgaXMgaW5oZXJpdGVkXG4gICAgICAgIHZhciBYT2JqZWN0ID0gUmVzb3VyY2VzLmxvb2t1cE1heWJlKFBERk5hbWUuWE9iamVjdCwgUERGRGljdCkgfHwgY29udGV4dC5vYmooe30pO1xuICAgICAgICBSZXNvdXJjZXMuc2V0KFBERk5hbWUuWE9iamVjdCwgWE9iamVjdCk7XG4gICAgICAgIC8vIFRPRE86IENsb25lIGBFeHRHU3RhdGVgIGlmIGl0IGlzIGluaGVyaXRlZFxuICAgICAgICB2YXIgRXh0R1N0YXRlID0gUmVzb3VyY2VzLmxvb2t1cE1heWJlKFBERk5hbWUuRXh0R1N0YXRlLCBQREZEaWN0KSB8fCBjb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIFJlc291cmNlcy5zZXQoUERGTmFtZS5FeHRHU3RhdGUsIEV4dEdTdGF0ZSk7XG4gICAgICAgIHZhciBBbm5vdHMgPSB0aGlzLkFubm90cygpIHx8IGNvbnRleHQub2JqKFtdKTtcbiAgICAgICAgdGhpcy5zZXQoUERGTmFtZS5Bbm5vdHMsIEFubm90cyk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplZCA9IHRydWU7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUubm9ybWFsaXplZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubm9ybWFsaXplKCk7XG4gICAgICAgIHZhciBBbm5vdHMgPSB0aGlzLkFubm90cygpO1xuICAgICAgICB2YXIgUmVzb3VyY2VzID0gdGhpcy5SZXNvdXJjZXMoKTtcbiAgICAgICAgdmFyIENvbnRlbnRzID0gdGhpcy5Db250ZW50cygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgQW5ub3RzOiBBbm5vdHMsXG4gICAgICAgICAgICBSZXNvdXJjZXM6IFJlc291cmNlcyxcbiAgICAgICAgICAgIENvbnRlbnRzOiBDb250ZW50cyxcbiAgICAgICAgICAgIEZvbnQ6IFJlc291cmNlcy5sb29rdXAoUERGTmFtZS5Gb250LCBQREZEaWN0KSxcbiAgICAgICAgICAgIFhPYmplY3Q6IFJlc291cmNlcy5sb29rdXAoUERGTmFtZS5YT2JqZWN0LCBQREZEaWN0KSxcbiAgICAgICAgICAgIEV4dEdTdGF0ZTogUmVzb3VyY2VzLmxvb2t1cChQREZOYW1lLkV4dEdTdGF0ZSwgUERGRGljdCksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5Jbmhlcml0YWJsZUVudHJpZXMgPSBbXG4gICAgICAgICdSZXNvdXJjZXMnLFxuICAgICAgICAnTWVkaWFCb3gnLFxuICAgICAgICAnQ3JvcEJveCcsXG4gICAgICAgICdSb3RhdGUnLFxuICAgIF07XG4gICAgUERGUGFnZUxlYWYud2l0aENvbnRleHRBbmRQYXJlbnQgPSBmdW5jdGlvbiAoY29udGV4dCwgcGFyZW50KSB7XG4gICAgICAgIHZhciBkaWN0ID0gbmV3IE1hcCgpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLlR5cGUsIFBERk5hbWUuUGFnZSk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUuUGFyZW50LCBwYXJlbnQpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLlJlc291cmNlcywgY29udGV4dC5vYmooe30pKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5NZWRpYUJveCwgY29udGV4dC5vYmooWzAsIDAsIDYxMiwgNzkyXSkpO1xuICAgICAgICByZXR1cm4gbmV3IFBERlBhZ2VMZWFmKGRpY3QsIGNvbnRleHQsIGZhbHNlKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLmZyb21NYXBXaXRoQ29udGV4dCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQsIGF1dG9Ob3JtYWxpemVDVE0pIHtcbiAgICAgICAgaWYgKGF1dG9Ob3JtYWxpemVDVE0gPT09IHZvaWQgMCkgeyBhdXRvTm9ybWFsaXplQ1RNID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gbmV3IFBERlBhZ2VMZWFmKG1hcCwgY29udGV4dCwgYXV0b05vcm1hbGl6ZUNUTSk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGUGFnZUxlYWY7XG59KFBERkRpY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlBhZ2VMZWFmO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUGFnZUxlYWYuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGUGFnZUxlYWYgZnJvbSBcIi4vUERGUGFnZUxlYWZcIjtcbmltcG9ydCB7IEludmFsaWRUYXJnZXRJbmRleEVycm9yLCBDb3JydXB0UGFnZVRyZWVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZQYWdlVHJlZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUGFnZVRyZWUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUGFnZVRyZWUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLlBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwKFBERk5hbWUub2YoJ1BhcmVudCcpKTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5LaWRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXAoUERGTmFtZS5vZignS2lkcycpLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUuQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cChQREZOYW1lLm9mKCdDb3VudCcpLCBQREZOdW1iZXIpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLnB1c2hUcmVlTm9kZSA9IGZ1bmN0aW9uICh0cmVlUmVmKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIEtpZHMucHVzaCh0cmVlUmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5wdXNoTGVhZk5vZGUgPSBmdW5jdGlvbiAobGVhZlJlZikge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICB0aGlzLmluc2VydExlYWZLaWQoS2lkcy5zaXplKCksIGxlYWZSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgZ2l2ZW4gcmVmIGFzIGEgbGVhZiBub2RlIG9mIHRoaXMgcGFnZSB0cmVlIGF0IHRoZSBzcGVjaWZpZWRcbiAgICAgKiBpbmRleCAoemVyby1iYXNlZCkuIEFsc28gaW5jcmVtZW50cyB0aGUgYENvdW50YCBvZiBlYWNoIHBhZ2UgdHJlZSBpbiB0aGVcbiAgICAgKiBoaWVyYXJjaHkgdG8gYWNjb21vZGF0ZSB0aGUgbmV3IHBhZ2UuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSByZWYgb2YgdGhlIFBERlBhZ2VUcmVlIG5vZGUgaW50byB3aGljaCBgbGVhZlJlZmAgd2FzIGluc2VydGVkLFxuICAgICAqIG9yIGB1bmRlZmluZWRgIGlmIGl0IHdhcyBpbnNlcnRlZCBpbnRvIHRoZSByb290IG5vZGUgKHRoZSBQREZQYWdlVHJlZSB1cG9uXG4gICAgICogd2hpY2ggdGhlIG1ldGhvZCB3YXMgZmlyc3QgY2FsbGVkKS5cbiAgICAgKi9cbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUuaW5zZXJ0TGVhZk5vZGUgPSBmdW5jdGlvbiAobGVhZlJlZiwgdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgdmFyIENvdW50ID0gdGhpcy5Db3VudCgpLmFzTnVtYmVyKCk7XG4gICAgICAgIGlmICh0YXJnZXRJbmRleCA+IENvdW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRhcmdldEluZGV4RXJyb3IodGFyZ2V0SW5kZXgsIENvdW50KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCA9IHRhcmdldEluZGV4O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBLaWRzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgaWYgKGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJbnNlcnQgcGFnZSBhbmQgcmV0dXJuXG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRMZWFmS2lkKGlkeCwgbGVhZlJlZik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBraWRSZWYgPSBLaWRzLmdldChpZHgpO1xuICAgICAgICAgICAgdmFyIGtpZCA9IHRoaXMuY29udGV4dC5sb29rdXAoa2lkUmVmKTtcbiAgICAgICAgICAgIGlmIChraWQgaW5zdGFuY2VvZiBQREZQYWdlVHJlZSkge1xuICAgICAgICAgICAgICAgIGlmIChraWQuQ291bnQoKS5hc051bWJlcigpID4gbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaWcgaW5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChraWQuaW5zZXJ0TGVhZk5vZGUobGVhZlJlZiwgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCkgfHwga2lkUmVmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb25cbiAgICAgICAgICAgICAgICAgICAgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCAtPSBraWQuQ291bnQoKS5hc051bWJlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChraWQgaW5zdGFuY2VvZiBQREZQYWdlTGVhZikge1xuICAgICAgICAgICAgICAgIC8vIE1vdmUgb25cbiAgICAgICAgICAgICAgICBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0IC09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgPT09IDApIHtcbiAgICAgICAgICAgIC8vIEluc2VydCBwYWdlIGF0IHRoZSBlbmQgYW5kIHJldHVyblxuICAgICAgICAgICAgdGhpcy5pbnNlcnRMZWFmS2lkKEtpZHMuc2l6ZSgpLCBsZWFmUmVmKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlIGlmIGB0YXJnZXRJbmRleGAgaXMgdmFsaWRcbiAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRQYWdlVHJlZUVycm9yKHRhcmdldEluZGV4LCAnaW5zZXJ0TGVhZk5vZGUnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGxlYWYgbm9kZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4ICh6ZXJvLWJhc2VkKSBmcm9tIHRoaXMgcGFnZVxuICAgICAqIHRyZWUuIEFsc28gZGVjcmVtZW50cyB0aGUgYENvdW50YCBvZiBlYWNoIHBhZ2UgdHJlZSBpbiB0aGUgaGllcmFyY2h5IHRvXG4gICAgICogYWNjb3VudCBmb3IgdGhlIHJlbW92ZWQgcGFnZS5cbiAgICAgKlxuICAgICAqIElmIGBwcnVuZWAgaXMgdHJ1ZSwgdGhlbiBpbnRlcm1lZGlhdGUgdHJlZSBub2RlcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGVcbiAgICAgKiB0cmVlIGlmIHRoZXkgY29udGFpbiAwIGNoaWxkcmVuIGFmdGVyIHRoZSBsZWFmIG5vZGUgaXMgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUucmVtb3ZlTGVhZk5vZGUgPSBmdW5jdGlvbiAodGFyZ2V0SW5kZXgsIHBydW5lKSB7XG4gICAgICAgIGlmIChwcnVuZSA9PT0gdm9pZCAwKSB7IHBydW5lID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICB2YXIgQ291bnQgPSB0aGlzLkNvdW50KCkuYXNOdW1iZXIoKTtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IENvdW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRhcmdldEluZGV4RXJyb3IodGFyZ2V0SW5kZXgsIENvdW50KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCA9IHRhcmdldEluZGV4O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBLaWRzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGtpZFJlZiA9IEtpZHMuZ2V0KGlkeCk7XG4gICAgICAgICAgICB2YXIga2lkID0gdGhpcy5jb250ZXh0Lmxvb2t1cChraWRSZWYpO1xuICAgICAgICAgICAgaWYgKGtpZCBpbnN0YW5jZW9mIFBERlBhZ2VUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtpZC5Db3VudCgpLmFzTnVtYmVyKCkgPiBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERpZyBpblxuICAgICAgICAgICAgICAgICAgICBraWQucmVtb3ZlTGVhZk5vZGUobGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCwgcHJ1bmUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJ1bmUgJiYga2lkLktpZHMoKS5zaXplKCkgPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBLaWRzLnJlbW92ZShpZHgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uXG4gICAgICAgICAgICAgICAgICAgIGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgLT0ga2lkLkNvdW50KCkuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUERGUGFnZUxlYWYpIHtcbiAgICAgICAgICAgICAgICBpZiAobGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcGFnZSBhbmQgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlS2lkKGlkeCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb25cbiAgICAgICAgICAgICAgICAgICAgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgaWYgYHRhcmdldEluZGV4YCBpcyB2YWxpZFxuICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFBhZ2VUcmVlRXJyb3IodGFyZ2V0SW5kZXgsICdyZW1vdmVMZWFmTm9kZScpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLmFzY2VuZCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgICAgIHZpc2l0b3IodGhpcyk7XG4gICAgICAgIHZhciBQYXJlbnQgPSB0aGlzLlBhcmVudCgpO1xuICAgICAgICBpZiAoUGFyZW50KVxuICAgICAgICAgICAgUGFyZW50LmFzY2VuZCh2aXNpdG9yKTtcbiAgICB9O1xuICAgIC8qKiBQZXJmb3JtcyBhIFBvc3QtT3JkZXIgdHJhdmVyc2FsIG9mIHRoaXMgcGFnZSB0cmVlICovXG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLnRyYXZlcnNlID0gZnVuY3Rpb24gKHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gS2lkcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBraWRSZWYgPSBLaWRzLmdldChpZHgpO1xuICAgICAgICAgICAgdmFyIGtpZCA9IHRoaXMuY29udGV4dC5sb29rdXAoa2lkUmVmKTtcbiAgICAgICAgICAgIGlmIChraWQgaW5zdGFuY2VvZiBQREZQYWdlVHJlZSlcbiAgICAgICAgICAgICAgICBraWQudHJhdmVyc2UodmlzaXRvcik7XG4gICAgICAgICAgICB2aXNpdG9yKGtpZCwga2lkUmVmKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLmluc2VydExlYWZLaWQgPSBmdW5jdGlvbiAoa2lkSWR4LCBsZWFmUmVmKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIHRoaXMuYXNjZW5kKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICB2YXIgbmV3Q291bnQgPSBub2RlLkNvdW50KCkuYXNOdW1iZXIoKSArIDE7XG4gICAgICAgICAgICBub2RlLnNldChQREZOYW1lLm9mKCdDb3VudCcpLCBQREZOdW1iZXIub2YobmV3Q291bnQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEtpZHMuaW5zZXJ0KGtpZElkeCwgbGVhZlJlZik7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUucmVtb3ZlS2lkID0gZnVuY3Rpb24gKGtpZElkeCkge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICB2YXIga2lkID0gS2lkcy5sb29rdXAoa2lkSWR4KTtcbiAgICAgICAgaWYgKGtpZCBpbnN0YW5jZW9mIFBERlBhZ2VMZWFmKSB7XG4gICAgICAgICAgICB0aGlzLmFzY2VuZChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdDb3VudCA9IG5vZGUuQ291bnQoKS5hc051bWJlcigpIC0gMTtcbiAgICAgICAgICAgICAgICBub2RlLnNldChQREZOYW1lLm9mKCdDb3VudCcpLCBQREZOdW1iZXIub2YobmV3Q291bnQpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIEtpZHMucmVtb3ZlKGtpZElkeCk7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS53aXRoQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBuZXcgTWFwKCk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ1R5cGUnKSwgUERGTmFtZS5vZignUGFnZXMnKSk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ0tpZHMnKSwgY29udGV4dC5vYmooW10pKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignQ291bnQnKSwgY29udGV4dC5vYmooMCkpO1xuICAgICAgICBpZiAocGFyZW50KVxuICAgICAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignUGFyZW50JyksIHBhcmVudCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZVRyZWUoZGljdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5mcm9tTWFwV2l0aENvbnRleHQgPSBmdW5jdGlvbiAobWFwLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZVRyZWUobWFwLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBQREZQYWdlVHJlZTtcbn0oUERGRGljdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUGFnZVRyZWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZQYWdlVHJlZS5qcy5tYXAiLCJ2YXIgQ2hhckNvZGVzO1xuKGZ1bmN0aW9uIChDaGFyQ29kZXMpIHtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTnVsbFwiXSA9IDBdID0gXCJOdWxsXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkJhY2tzcGFjZVwiXSA9IDhdID0gXCJCYWNrc3BhY2VcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiVGFiXCJdID0gOV0gPSBcIlRhYlwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJOZXdsaW5lXCJdID0gMTBdID0gXCJOZXdsaW5lXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkZvcm1GZWVkXCJdID0gMTJdID0gXCJGb3JtRmVlZFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJDYXJyaWFnZVJldHVyblwiXSA9IDEzXSA9IFwiQ2FycmlhZ2VSZXR1cm5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiU3BhY2VcIl0gPSAzMl0gPSBcIlNwYWNlXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkV4Y2xhbWF0aW9uUG9pbnRcIl0gPSAzM10gPSBcIkV4Y2xhbWF0aW9uUG9pbnRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiSGFzaFwiXSA9IDM1XSA9IFwiSGFzaFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJQZXJjZW50XCJdID0gMzddID0gXCJQZXJjZW50XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxlZnRQYXJlblwiXSA9IDQwXSA9IFwiTGVmdFBhcmVuXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlJpZ2h0UGFyZW5cIl0gPSA0MV0gPSBcIlJpZ2h0UGFyZW5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUGx1c1wiXSA9IDQzXSA9IFwiUGx1c1wiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJNaW51c1wiXSA9IDQ1XSA9IFwiTWludXNcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRGFzaFwiXSA9IDQ1XSA9IFwiRGFzaFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJQZXJpb2RcIl0gPSA0Nl0gPSBcIlBlcmlvZFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJGb3J3YXJkU2xhc2hcIl0gPSA0N10gPSBcIkZvcndhcmRTbGFzaFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJaZXJvXCJdID0gNDhdID0gXCJaZXJvXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIk9uZVwiXSA9IDQ5XSA9IFwiT25lXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlR3b1wiXSA9IDUwXSA9IFwiVHdvXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlRocmVlXCJdID0gNTFdID0gXCJUaHJlZVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJGb3VyXCJdID0gNTJdID0gXCJGb3VyXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkZpdmVcIl0gPSA1M10gPSBcIkZpdmVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiU2l4XCJdID0gNTRdID0gXCJTaXhcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiU2V2ZW5cIl0gPSA1NV0gPSBcIlNldmVuXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkVpZ2h0XCJdID0gNTZdID0gXCJFaWdodFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJOaW5lXCJdID0gNTddID0gXCJOaW5lXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxlc3NUaGFuXCJdID0gNjBdID0gXCJMZXNzVGhhblwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJHcmVhdGVyVGhhblwiXSA9IDYyXSA9IFwiR3JlYXRlclRoYW5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiQVwiXSA9IDY1XSA9IFwiQVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJEXCJdID0gNjhdID0gXCJEXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkVcIl0gPSA2OV0gPSBcIkVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRlwiXSA9IDcwXSA9IFwiRlwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJPXCJdID0gNzldID0gXCJPXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlBcIl0gPSA4MF0gPSBcIlBcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUlwiXSA9IDgyXSA9IFwiUlwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJMZWZ0U3F1YXJlQnJhY2tldFwiXSA9IDkxXSA9IFwiTGVmdFNxdWFyZUJyYWNrZXRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiQmFja1NsYXNoXCJdID0gOTJdID0gXCJCYWNrU2xhc2hcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUmlnaHRTcXVhcmVCcmFja2V0XCJdID0gOTNdID0gXCJSaWdodFNxdWFyZUJyYWNrZXRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiYVwiXSA9IDk3XSA9IFwiYVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJiXCJdID0gOThdID0gXCJiXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImRcIl0gPSAxMDBdID0gXCJkXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImVcIl0gPSAxMDFdID0gXCJlXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImZcIl0gPSAxMDJdID0gXCJmXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImlcIl0gPSAxMDVdID0gXCJpXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImpcIl0gPSAxMDZdID0gXCJqXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImxcIl0gPSAxMDhdID0gXCJsXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIm1cIl0gPSAxMDldID0gXCJtXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIm5cIl0gPSAxMTBdID0gXCJuXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIm9cIl0gPSAxMTFdID0gXCJvXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcInJcIl0gPSAxMTRdID0gXCJyXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcInNcIl0gPSAxMTVdID0gXCJzXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcInRcIl0gPSAxMTZdID0gXCJ0XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcInVcIl0gPSAxMTddID0gXCJ1XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcInhcIl0gPSAxMjBdID0gXCJ4XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxlZnRDdXJseVwiXSA9IDEyM10gPSBcIkxlZnRDdXJseVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJSaWdodEN1cmx5XCJdID0gMTI1XSA9IFwiUmlnaHRDdXJseVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJUaWxkZVwiXSA9IDEyNl0gPSBcIlRpbGRlXCI7XG59KShDaGFyQ29kZXMgfHwgKENoYXJDb2RlcyA9IHt9KSk7XG5leHBvcnQgZGVmYXVsdCBDaGFyQ29kZXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFyQ29kZXMuanMubWFwIiwiaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi9DaGFyQ29kZXNcIjtcbmV4cG9ydCB2YXIgSXNEZWxpbWl0ZXIgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLkxlZnRQYXJlbl0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLlJpZ2h0UGFyZW5dID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5MZXNzVGhhbl0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLkdyZWF0ZXJUaGFuXSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuTGVmdFNxdWFyZUJyYWNrZXRdID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5SaWdodFNxdWFyZUJyYWNrZXRdID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5MZWZ0Q3VybHldID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5SaWdodEN1cmx5XSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuRm9yd2FyZFNsYXNoXSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuUGVyY2VudF0gPSAxO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVsaW1pdGVycy5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuL0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgSXNEZWxpbWl0ZXIgfSBmcm9tIFwiLi9EZWxpbWl0ZXJzXCI7XG5pbXBvcnQgeyBJc1doaXRlc3BhY2UgfSBmcm9tIFwiLi9XaGl0ZXNwYWNlXCI7XG5leHBvcnQgdmFyIElzSXJyZWd1bGFyID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAodmFyIGlkeCA9IDAsIGxlbiA9IDI1NjsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgIElzSXJyZWd1bGFyW2lkeF0gPSBJc1doaXRlc3BhY2VbaWR4XSB8fCBJc0RlbGltaXRlcltpZHhdID8gMSA6IDA7XG59XG5Jc0lycmVndWxhcltDaGFyQ29kZXMuSGFzaF0gPSAxO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXJyZWd1bGFyLmpzLm1hcCIsImltcG9ydCB7IF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuL0NoYXJDb2Rlc1wiO1xudmFyIFNwYWNlID0gQ2hhckNvZGVzLlNwYWNlLCBDYXJyaWFnZVJldHVybiA9IENoYXJDb2Rlcy5DYXJyaWFnZVJldHVybiwgTmV3bGluZSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xudmFyIHN0cmVhbSA9IFtcbiAgICBDaGFyQ29kZXMucyxcbiAgICBDaGFyQ29kZXMudCxcbiAgICBDaGFyQ29kZXMucixcbiAgICBDaGFyQ29kZXMuZSxcbiAgICBDaGFyQ29kZXMuYSxcbiAgICBDaGFyQ29kZXMubSxcbl07XG52YXIgZW5kc3RyZWFtID0gW1xuICAgIENoYXJDb2Rlcy5lLFxuICAgIENoYXJDb2Rlcy5uLFxuICAgIENoYXJDb2Rlcy5kLFxuICAgIENoYXJDb2Rlcy5zLFxuICAgIENoYXJDb2Rlcy50LFxuICAgIENoYXJDb2Rlcy5yLFxuICAgIENoYXJDb2Rlcy5lLFxuICAgIENoYXJDb2Rlcy5hLFxuICAgIENoYXJDb2Rlcy5tLFxuXTtcbmV4cG9ydCB2YXIgS2V5d29yZHMgPSB7XG4gICAgaGVhZGVyOiBbXG4gICAgICAgIENoYXJDb2Rlcy5QZXJjZW50LFxuICAgICAgICBDaGFyQ29kZXMuUCxcbiAgICAgICAgQ2hhckNvZGVzLkQsXG4gICAgICAgIENoYXJDb2Rlcy5GLFxuICAgICAgICBDaGFyQ29kZXMuRGFzaCxcbiAgICBdLFxuICAgIGVvZjogW1xuICAgICAgICBDaGFyQ29kZXMuUGVyY2VudCxcbiAgICAgICAgQ2hhckNvZGVzLlBlcmNlbnQsXG4gICAgICAgIENoYXJDb2Rlcy5FLFxuICAgICAgICBDaGFyQ29kZXMuTyxcbiAgICAgICAgQ2hhckNvZGVzLkYsXG4gICAgXSxcbiAgICBvYmo6IFtDaGFyQ29kZXMubywgQ2hhckNvZGVzLmIsIENoYXJDb2Rlcy5qXSxcbiAgICBlbmRvYmo6IFtcbiAgICAgICAgQ2hhckNvZGVzLmUsXG4gICAgICAgIENoYXJDb2Rlcy5uLFxuICAgICAgICBDaGFyQ29kZXMuZCxcbiAgICAgICAgQ2hhckNvZGVzLm8sXG4gICAgICAgIENoYXJDb2Rlcy5iLFxuICAgICAgICBDaGFyQ29kZXMuaixcbiAgICBdLFxuICAgIHhyZWY6IFtDaGFyQ29kZXMueCwgQ2hhckNvZGVzLnIsIENoYXJDb2Rlcy5lLCBDaGFyQ29kZXMuZl0sXG4gICAgdHJhaWxlcjogW1xuICAgICAgICBDaGFyQ29kZXMudCxcbiAgICAgICAgQ2hhckNvZGVzLnIsXG4gICAgICAgIENoYXJDb2Rlcy5hLFxuICAgICAgICBDaGFyQ29kZXMuaSxcbiAgICAgICAgQ2hhckNvZGVzLmwsXG4gICAgICAgIENoYXJDb2Rlcy5lLFxuICAgICAgICBDaGFyQ29kZXMucixcbiAgICBdLFxuICAgIHN0YXJ0eHJlZjogW1xuICAgICAgICBDaGFyQ29kZXMucyxcbiAgICAgICAgQ2hhckNvZGVzLnQsXG4gICAgICAgIENoYXJDb2Rlcy5hLFxuICAgICAgICBDaGFyQ29kZXMucixcbiAgICAgICAgQ2hhckNvZGVzLnQsXG4gICAgICAgIENoYXJDb2Rlcy54LFxuICAgICAgICBDaGFyQ29kZXMucixcbiAgICAgICAgQ2hhckNvZGVzLmUsXG4gICAgICAgIENoYXJDb2Rlcy5mLFxuICAgIF0sXG4gICAgdHJ1ZTogW0NoYXJDb2Rlcy50LCBDaGFyQ29kZXMuciwgQ2hhckNvZGVzLnUsIENoYXJDb2Rlcy5lXSxcbiAgICBmYWxzZTogW0NoYXJDb2Rlcy5mLCBDaGFyQ29kZXMuYSwgQ2hhckNvZGVzLmwsIENoYXJDb2Rlcy5zLCBDaGFyQ29kZXMuZV0sXG4gICAgbnVsbDogW0NoYXJDb2Rlcy5uLCBDaGFyQ29kZXMudSwgQ2hhckNvZGVzLmwsIENoYXJDb2Rlcy5sXSxcbiAgICBzdHJlYW06IHN0cmVhbSxcbiAgICBzdHJlYW1FT0YxOiBfX3NwcmVhZEFycmF5cyhzdHJlYW0sIFtTcGFjZSwgQ2FycmlhZ2VSZXR1cm4sIE5ld2xpbmVdKSxcbiAgICBzdHJlYW1FT0YyOiBfX3NwcmVhZEFycmF5cyhzdHJlYW0sIFtDYXJyaWFnZVJldHVybiwgTmV3bGluZV0pLFxuICAgIHN0cmVhbUVPRjM6IF9fc3ByZWFkQXJyYXlzKHN0cmVhbSwgW0NhcnJpYWdlUmV0dXJuXSksXG4gICAgc3RyZWFtRU9GNDogX19zcHJlYWRBcnJheXMoc3RyZWFtLCBbTmV3bGluZV0pLFxuICAgIGVuZHN0cmVhbTogZW5kc3RyZWFtLFxuICAgIEVPRjFlbmRzdHJlYW06IF9fc3ByZWFkQXJyYXlzKFtDYXJyaWFnZVJldHVybiwgTmV3bGluZV0sIGVuZHN0cmVhbSksXG4gICAgRU9GMmVuZHN0cmVhbTogX19zcHJlYWRBcnJheXMoW0NhcnJpYWdlUmV0dXJuXSwgZW5kc3RyZWFtKSxcbiAgICBFT0YzZW5kc3RyZWFtOiBfX3NwcmVhZEFycmF5cyhbTmV3bGluZV0sIGVuZHN0cmVhbSksXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9S2V5d29yZHMuanMubWFwIiwiaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi9DaGFyQ29kZXNcIjtcbmV4cG9ydCB2YXIgSXNEaWdpdCA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5aZXJvXSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5PbmVdID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLlR3b10gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuVGhyZWVdID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLkZvdXJdID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLkZpdmVdID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLlNpeF0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuU2V2ZW5dID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLkVpZ2h0XSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5OaW5lXSA9IDE7XG5leHBvcnQgdmFyIElzTnVtZXJpY1ByZWZpeCA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5Jc051bWVyaWNQcmVmaXhbQ2hhckNvZGVzLlBlcmlvZF0gPSAxO1xuSXNOdW1lcmljUHJlZml4W0NoYXJDb2Rlcy5QbHVzXSA9IDE7XG5Jc051bWVyaWNQcmVmaXhbQ2hhckNvZGVzLk1pbnVzXSA9IDE7XG5leHBvcnQgdmFyIElzTnVtZXJpYyA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5mb3IgKHZhciBpZHggPSAwLCBsZW4gPSAyNTY7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICBJc051bWVyaWNbaWR4XSA9IElzRGlnaXRbaWR4XSB8fCBJc051bWVyaWNQcmVmaXhbaWR4XSA/IDEgOiAwO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TnVtZXJpYy5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuL0NoYXJDb2Rlc1wiO1xuZXhwb3J0IHZhciBJc1doaXRlc3BhY2UgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuSXNXaGl0ZXNwYWNlW0NoYXJDb2Rlcy5OdWxsXSA9IDE7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLlRhYl0gPSAxO1xuSXNXaGl0ZXNwYWNlW0NoYXJDb2Rlcy5OZXdsaW5lXSA9IDE7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLkZvcm1GZWVkXSA9IDE7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLkNhcnJpYWdlUmV0dXJuXSA9IDE7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLlNwYWNlXSA9IDE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGl0ZXNwYWNlLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkhlYWRlciBmcm9tIFwiLi4vZG9jdW1lbnQvUERGSGVhZGVyXCI7XG5pbXBvcnQgUERGVHJhaWxlciBmcm9tIFwiLi4vZG9jdW1lbnQvUERGVHJhaWxlclwiO1xuaW1wb3J0IFBERkludmFsaWRPYmplY3QgZnJvbSBcIi4uL29iamVjdHMvUERGSW52YWxpZE9iamVjdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmVhbVwiO1xuaW1wb3J0IFBERkNyb3NzUmVmU3RyZWFtIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERkNyb3NzUmVmU3RyZWFtXCI7XG5pbXBvcnQgUERGT2JqZWN0U3RyZWFtIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERk9iamVjdFN0cmVhbVwiO1xuaW1wb3J0IFBERldyaXRlciBmcm9tIFwiLi9QREZXcml0ZXJcIjtcbmltcG9ydCB7IGxhc3QsIHdhaXRGb3JUaWNrIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGU3RyZWFtV3JpdGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZTdHJlYW1Xcml0ZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGU3RyZWFtV3JpdGVyKGNvbnRleHQsIG9iamVjdHNQZXJUaWNrLCBlbmNvZGVTdHJlYW1zLCBvYmplY3RzUGVyU3RyZWFtKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNvbnRleHQsIG9iamVjdHNQZXJUaWNrKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5lbmNvZGVTdHJlYW1zID0gZW5jb2RlU3RyZWFtcztcbiAgICAgICAgX3RoaXMub2JqZWN0c1BlclN0cmVhbSA9IG9iamVjdHNQZXJTdHJlYW07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5jb21wdXRlQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9iamVjdE51bWJlciwgaGVhZGVyLCBzaXplLCB4cmVmU3RyZWFtLCB1bmNvbXByZXNzZWRPYmplY3RzLCBjb21wcmVzc2VkT2JqZWN0cywgb2JqZWN0U3RyZWFtUmVmcywgaW5kaXJlY3RPYmplY3RzLCBpZHgsIGxlbiwgaW5kaXJlY3RPYmplY3QsIHJlZiwgb2JqZWN0LCBzaG91bGROb3RDb21wcmVzcywgY2h1bmssIG9iamVjdFN0cmVhbVJlZiwgaWR4LCBsZW4sIGNodW5rLCByZWYsIG9iamVjdFN0cmVhbSwgeHJlZlN0cmVhbVJlZiwgeHJlZk9mZnNldCwgdHJhaWxlcjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE51bWJlciA9IHRoaXMuY29udGV4dC5sYXJnZXN0T2JqZWN0TnVtYmVyICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFBERkhlYWRlci5mb3JWZXJzaW9uKDEsIDcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGhlYWRlci5zaXplSW5CeXRlcygpICsgMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW0gPSBQREZDcm9zc1JlZlN0cmVhbS5jcmVhdGUodGhpcy5jcmVhdGVUcmFpbGVyRGljdCgpLCB0aGlzLmVuY29kZVN0cmVhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkT2JqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZE9iamVjdHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFN0cmVhbVJlZnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0T2JqZWN0cyA9IHRoaXMuY29udGV4dC5lbnVtZXJhdGVJbmRpcmVjdE9iamVjdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IGluZGlyZWN0T2JqZWN0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3RPYmplY3QgPSBpbmRpcmVjdE9iamVjdHNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IGluZGlyZWN0T2JqZWN0WzBdLCBvYmplY3QgPSBpbmRpcmVjdE9iamVjdFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZE5vdENvbXByZXNzID0gcmVmID09PSB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uRW5jcnlwdCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFBERlN0cmVhbSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFBERkludmFsaWRPYmplY3QgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYuZ2VuZXJhdGlvbk51bWJlciAhPT0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkTm90Q29tcHJlc3MpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkT2JqZWN0cy5wdXNoKGluZGlyZWN0T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW0uYWRkVW5jb21wcmVzc2VkRW50cnkocmVmLCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jb21wdXRlSW5kaXJlY3RPYmplY3RTaXplKGluZGlyZWN0T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRXYWl0Rm9yVGljaygxKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB3YWl0Rm9yVGljaygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVuayA9IGxhc3QoY29tcHJlc3NlZE9iamVjdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0U3RyZWFtUmVmID0gbGFzdChvYmplY3RTdHJlYW1SZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2h1bmsgfHwgY2h1bmsubGVuZ3RoICUgdGhpcy5vYmplY3RzUGVyU3RyZWFtID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkT2JqZWN0cy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RTdHJlYW1SZWYgPSBQREZSZWYub2Yob2JqZWN0TnVtYmVyKyspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFN0cmVhbVJlZnMucHVzaChvYmplY3RTdHJlYW1SZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZlN0cmVhbS5hZGRDb21wcmVzc2VkRW50cnkocmVmLCBvYmplY3RTdHJlYW1SZWYsIGNodW5rLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVuay5wdXNoKGluZGlyZWN0T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gMCwgbGVuID0gY29tcHJlc3NlZE9iamVjdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpZHggPCBsZW4pKSByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVuayA9IGNvbXByZXNzZWRPYmplY3RzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSBvYmplY3RTdHJlYW1SZWZzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RTdHJlYW0gPSBQREZPYmplY3RTdHJlYW0ud2l0aENvbnRleHRBbmRPYmplY3RzKHRoaXMuY29udGV4dCwgY2h1bmssIHRoaXMuZW5jb2RlU3RyZWFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmU3RyZWFtLmFkZFVuY29tcHJlc3NlZEVudHJ5KHJlZiwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRoaXMuY29tcHV0ZUluZGlyZWN0T2JqZWN0U2l6ZShbcmVmLCBvYmplY3RTdHJlYW1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZE9iamVjdHMucHVzaChbcmVmLCBvYmplY3RTdHJlYW1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRXYWl0Rm9yVGljayhjaHVuay5sZW5ndGgpKSByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmU3RyZWFtUmVmID0gUERGUmVmLm9mKG9iamVjdE51bWJlcisrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW0uZGljdC5zZXQoUERGTmFtZS5vZignU2l6ZScpLCBQREZOdW1iZXIub2Yob2JqZWN0TnVtYmVyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmU3RyZWFtLmFkZFVuY29tcHJlc3NlZEVudHJ5KHhyZWZTdHJlYW1SZWYsIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZk9mZnNldCA9IHNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRoaXMuY29tcHV0ZUluZGlyZWN0T2JqZWN0U2l6ZShbeHJlZlN0cmVhbVJlZiwgeHJlZlN0cmVhbV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkT2JqZWN0cy5wdXNoKFt4cmVmU3RyZWFtUmVmLCB4cmVmU3RyZWFtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGVyID0gUERGVHJhaWxlci5mb3JMYXN0Q3Jvc3NSZWZTZWN0aW9uT2Zmc2V0KHhyZWZPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0cmFpbGVyLnNpemVJbkJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyBzaXplOiBzaXplLCBoZWFkZXI6IGhlYWRlciwgaW5kaXJlY3RPYmplY3RzOiB1bmNvbXByZXNzZWRPYmplY3RzLCB0cmFpbGVyOiB0cmFpbGVyIH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERlN0cmVhbVdyaXRlci5mb3JDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIG9iamVjdHNQZXJUaWNrLCBlbmNvZGVTdHJlYW1zLCBvYmplY3RzUGVyU3RyZWFtKSB7XG4gICAgICAgIGlmIChlbmNvZGVTdHJlYW1zID09PSB2b2lkIDApIHsgZW5jb2RlU3RyZWFtcyA9IHRydWU7IH1cbiAgICAgICAgaWYgKG9iamVjdHNQZXJTdHJlYW0gPT09IHZvaWQgMCkgeyBvYmplY3RzUGVyU3RyZWFtID0gNTA7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZTdHJlYW1Xcml0ZXIoY29udGV4dCwgb2JqZWN0c1BlclRpY2ssIGVuY29kZVN0cmVhbXMsIG9iamVjdHNQZXJTdHJlYW0pO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlN0cmVhbVdyaXRlcjtcbn0oUERGV3JpdGVyKSk7XG5leHBvcnQgZGVmYXVsdCBQREZTdHJlYW1Xcml0ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZTdHJlYW1Xcml0ZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkNyb3NzUmVmU2VjdGlvbiBmcm9tIFwiLi4vZG9jdW1lbnQvUERGQ3Jvc3NSZWZTZWN0aW9uXCI7XG5pbXBvcnQgUERGSGVhZGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZIZWFkZXJcIjtcbmltcG9ydCBQREZUcmFpbGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZUcmFpbGVyXCI7XG5pbXBvcnQgUERGVHJhaWxlckRpY3QgZnJvbSBcIi4uL2RvY3VtZW50L1BERlRyYWlsZXJEaWN0XCI7XG5pbXBvcnQgUERGT2JqZWN0U3RyZWFtIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERk9iamVjdFN0cmVhbVwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIHdhaXRGb3JUaWNrIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGV3JpdGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERldyaXRlcihjb250ZXh0LCBvYmplY3RzUGVyVGljaykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnBhcnNlZE9iamVjdHMgPSAwO1xuICAgICAgICB0aGlzLnNob3VsZFdhaXRGb3JUaWNrID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIF90aGlzLnBhcnNlZE9iamVjdHMgKz0gbjtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5wYXJzZWRPYmplY3RzICUgX3RoaXMub2JqZWN0c1BlclRpY2sgPT09IDA7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMub2JqZWN0c1BlclRpY2sgPSBvYmplY3RzUGVyVGljaztcbiAgICB9XG4gICAgUERGV3JpdGVyLnByb3RvdHlwZS5zZXJpYWxpemVUb0J1ZmZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBzaXplLCBoZWFkZXIsIGluZGlyZWN0T2JqZWN0cywgeHJlZiwgdHJhaWxlckRpY3QsIHRyYWlsZXIsIG9mZnNldCwgYnVmZmVyLCBpZHgsIGxlbiwgX2IsIHJlZiwgb2JqZWN0LCBvYmplY3ROdW1iZXIsIGdlbmVyYXRpb25OdW1iZXIsIG47XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29tcHV0ZUJ1ZmZlclNpemUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Muc2VudCgpLCBzaXplID0gX2Euc2l6ZSwgaGVhZGVyID0gX2EuaGVhZGVyLCBpbmRpcmVjdE9iamVjdHMgPSBfYS5pbmRpcmVjdE9iamVjdHMsIHhyZWYgPSBfYS54cmVmLCB0cmFpbGVyRGljdCA9IF9hLnRyYWlsZXJEaWN0LCB0cmFpbGVyID0gX2EudHJhaWxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBoZWFkZXIuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAwLCBsZW4gPSBpbmRpcmVjdE9iamVjdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpZHggPCBsZW4pKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gaW5kaXJlY3RPYmplY3RzW2lkeF0sIHJlZiA9IF9iWzBdLCBvYmplY3QgPSBfYlsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE51bWJlciA9IFN0cmluZyhyZWYub2JqZWN0TnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihvYmplY3ROdW1iZXIsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uTnVtYmVyID0gU3RyaW5nKHJlZi5nZW5lcmF0aW9uTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihnZW5lcmF0aW9uTnVtYmVyLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5vO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5iO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5qO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG9iamVjdC5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuYjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuajtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBvYmplY3QgaW5zdGFuY2VvZiBQREZPYmplY3RTdHJlYW0gPyBvYmplY3QuZ2V0T2JqZWN0c0NvdW50KCkgOiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFdhaXRGb3JUaWNrKG4pKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4cmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHhyZWYuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWlsZXJEaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHRyYWlsZXJEaWN0LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdHJhaWxlci5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBidWZmZXJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERldyaXRlci5wcm90b3R5cGUuY29tcHV0ZUluZGlyZWN0T2JqZWN0U2l6ZSA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgcmVmID0gX2FbMF0sIG9iamVjdCA9IF9hWzFdO1xuICAgICAgICB2YXIgcmVmU2l6ZSA9IHJlZi5zaXplSW5CeXRlcygpICsgMzsgLy8gJ1InIC0+ICdvYmpcXG4nXG4gICAgICAgIHZhciBvYmplY3RTaXplID0gb2JqZWN0LnNpemVJbkJ5dGVzKCkgKyA5OyAvLyAnXFxuZW5kb2JqXFxuXFxuJ1xuICAgICAgICByZXR1cm4gcmVmU2l6ZSArIG9iamVjdFNpemU7XG4gICAgfTtcbiAgICBQREZXcml0ZXIucHJvdG90eXBlLmNyZWF0ZVRyYWlsZXJEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBTaXplOiB0aGlzLmNvbnRleHQubGFyZ2VzdE9iamVjdE51bWJlciArIDEsXG4gICAgICAgICAgICBSb290OiB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uUm9vdCxcbiAgICAgICAgICAgIEVuY3J5cHQ6IHRoaXMuY29udGV4dC50cmFpbGVySW5mby5FbmNyeXB0LFxuICAgICAgICAgICAgSW5mbzogdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLkluZm8sXG4gICAgICAgICAgICBJRDogdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLklELFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERldyaXRlci5wcm90b3R5cGUuY29tcHV0ZUJ1ZmZlclNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBoZWFkZXIsIHNpemUsIHhyZWYsIGluZGlyZWN0T2JqZWN0cywgaWR4LCBsZW4sIGluZGlyZWN0T2JqZWN0LCByZWYsIHhyZWZPZmZzZXQsIHRyYWlsZXJEaWN0LCB0cmFpbGVyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gUERGSGVhZGVyLmZvclZlcnNpb24oMSwgNyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gaGVhZGVyLnNpemVJbkJ5dGVzKCkgKyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZiA9IFBERkNyb3NzUmVmU2VjdGlvbi5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0T2JqZWN0cyA9IHRoaXMuY29udGV4dC5lbnVtZXJhdGVJbmRpcmVjdE9iamVjdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IGluZGlyZWN0T2JqZWN0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3RPYmplY3QgPSBpbmRpcmVjdE9iamVjdHNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IGluZGlyZWN0T2JqZWN0WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZi5hZGRFbnRyeShyZWYsIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0aGlzLmNvbXB1dGVJbmRpcmVjdE9iamVjdFNpemUoaW5kaXJlY3RPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFdhaXRGb3JUaWNrKDEpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZPZmZzZXQgPSBzaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB4cmVmLnNpemVJbkJ5dGVzKCkgKyAxOyAvLyAnXFxuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxlckRpY3QgPSBQREZUcmFpbGVyRGljdC5vZih0aGlzLmNyZWF0ZVRyYWlsZXJEaWN0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0cmFpbGVyRGljdC5zaXplSW5CeXRlcygpICsgMjsgLy8gJ1xcblxcbidcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsZXIgPSBQREZUcmFpbGVyLmZvckxhc3RDcm9zc1JlZlNlY3Rpb25PZmZzZXQoeHJlZk9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRyYWlsZXIuc2l6ZUluQnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IHNpemU6IHNpemUsIGhlYWRlcjogaGVhZGVyLCBpbmRpcmVjdE9iamVjdHM6IGluZGlyZWN0T2JqZWN0cywgeHJlZjogeHJlZiwgdHJhaWxlckRpY3Q6IHRyYWlsZXJEaWN0LCB0cmFpbGVyOiB0cmFpbGVyIH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERldyaXRlci5mb3JDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIG9iamVjdHNQZXJUaWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGV3JpdGVyKGNvbnRleHQsIG9iamVjdHNQZXJUaWNrKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZXcml0ZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGV3JpdGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGV3JpdGVyLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2FwaS9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29yZS9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMvaW5kZXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2luZGV4XCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJ2YXIgQ2FjaGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2FjaGUocG9wdWxhdGUpIHtcbiAgICAgICAgdGhpcy5wb3B1bGF0ZSA9IHBvcHVsYXRlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBDYWNoZS5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgQ2FjaGUucHJvdG90eXBlLmFjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucG9wdWxhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBDYWNoZS5wcm90b3R5cGUuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIENhY2hlLnBvcHVsYXRlZEJ5ID0gZnVuY3Rpb24gKHBvcHVsYXRlKSB7IHJldHVybiBuZXcgQ2FjaGUocG9wdWxhdGUpOyB9O1xuICAgIHJldHVybiBDYWNoZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBDYWNoZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhY2hlLmpzLm1hcCIsImltcG9ydCB7IGRlY29kZUZyb21CYXNlNjREYXRhVXJpIH0gZnJvbSBcIi4vYmFzZTY0XCI7XG5pbXBvcnQgeyBjaGFyRnJvbUNvZGUgfSBmcm9tIFwiLi9zdHJpbmdzXCI7XG5leHBvcnQgdmFyIGxhc3QgPSBmdW5jdGlvbiAoYXJyYXkpIHsgcmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdOyB9O1xuLy8gZXhwb3J0IGNvbnN0IGRyb3BMYXN0ID0gPFQ+KGFycmF5OiBUW10pOiBUW10gPT5cbi8vIGFycmF5LnNsaWNlKDAsIGFycmF5Lmxlbmd0aCAtIDEpO1xuZXhwb3J0IHZhciB0eXBlZEFycmF5Rm9yID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSlcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgdmFyIHR5cGVkQXJyYXkgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgdHlwZWRBcnJheVtpZHhdID0gdmFsdWUuY2hhckNvZGVBdChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZWRBcnJheTtcbn07XG5leHBvcnQgdmFyIG1lcmdlSW50b1R5cGVkQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5cyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFycmF5c1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgYXJyYXlDb3VudCA9IGFycmF5cy5sZW5ndGg7XG4gICAgdmFyIHR5cGVkQXJyYXlzID0gW107XG4gICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgYXJyYXlDb3VudDsgaWR4KyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBhcnJheXNbaWR4XTtcbiAgICAgICAgdHlwZWRBcnJheXNbaWR4XSA9XG4gICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgVWludDhBcnJheSA/IGVsZW1lbnQgOiB0eXBlZEFycmF5Rm9yKGVsZW1lbnQpO1xuICAgIH1cbiAgICB2YXIgdG90YWxTaXplID0gMDtcbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBhcnJheUNvdW50OyBpZHgrKykge1xuICAgICAgICB0b3RhbFNpemUgKz0gYXJyYXlzW2lkeF0ubGVuZ3RoO1xuICAgIH1cbiAgICB2YXIgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkodG90YWxTaXplKTtcbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICBmb3IgKHZhciBhcnJJZHggPSAwOyBhcnJJZHggPCBhcnJheUNvdW50OyBhcnJJZHgrKykge1xuICAgICAgICB2YXIgYXJyID0gdHlwZWRBcnJheXNbYXJySWR4XTtcbiAgICAgICAgZm9yICh2YXIgYnl0ZUlkeCA9IDAsIGFyckxlbiA9IGFyci5sZW5ndGg7IGJ5dGVJZHggPCBhcnJMZW47IGJ5dGVJZHgrKykge1xuICAgICAgICAgICAgbWVyZ2VkW29mZnNldCsrXSA9IGFycltieXRlSWR4XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkO1xufTtcbmV4cG9ydCB2YXIgbWVyZ2VVaW50OEFycmF5cyA9IGZ1bmN0aW9uIChhcnJheXMpIHtcbiAgICB2YXIgdG90YWxTaXplID0gMDtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHRvdGFsU2l6ZSArPSBhcnJheXNbaWR4XS5sZW5ndGg7XG4gICAgfVxuICAgIHZhciBtZXJnZWRCdWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpO1xuICAgIHZhciBvZmZzZXQgPSAwO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJyYXlzW2lkeF07XG4gICAgICAgIG1lcmdlZEJ1ZmZlci5zZXQoYXJyYXksIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSBhcnJheS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWRCdWZmZXI7XG59O1xuZXhwb3J0IHZhciBhcnJheUFzU3RyaW5nID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBzdHIgKz0gY2hhckZyb21Db2RlKGFycmF5W2lkeF0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufTtcbmV4cG9ydCB2YXIgYnlBc2NlbmRpbmdJZCA9IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmlkIC0gYi5pZDsgfTtcbmV4cG9ydCB2YXIgc29ydGVkVW5pcSA9IGZ1bmN0aW9uIChhcnJheSwgaW5kZXhlcikge1xuICAgIHZhciB1bmlxID0gW107XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBjdXJyID0gYXJyYXlbaWR4XTtcbiAgICAgICAgdmFyIHByZXYgPSBhcnJheVtpZHggLSAxXTtcbiAgICAgICAgaWYgKGlkeCA9PT0gMCB8fCBpbmRleGVyKGN1cnIpICE9PSBpbmRleGVyKHByZXYpKSB7XG4gICAgICAgICAgICB1bmlxLnB1c2goY3Vycik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuaXE7XG59O1xuLy8gQXJyYXlzIGFuZCBUeXBlZEFycmF5cyBpbiBKUyBib3RoIGhhdmUgLnJldmVyc2UoKSBtZXRob2RzLCB3aGljaCB3b3VsZCBzZWVtXG4vLyB0byBuZWdhdGUgdGhlIG5lZWQgZm9yIHRoaXMgZnVuY3Rpb24uIEhvd2V2ZXIsIG5vdCBhbGwgcnVudGltZXMgc3VwcG9ydCB0aGlzXG4vLyBtZXRob2QgKGUuZy4gUmVhY3QgTmF0aXZlKS4gVGhpcyBmdW5jdGlvbiBjb21wZW5zYXRlcyBmb3IgdGhhdCBmYWN0LlxuZXhwb3J0IHZhciByZXZlcnNlQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICB2YXIgYXJyYXlMZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gTWF0aC5mbG9vcihhcnJheUxlbiAvIDIpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBsZWZ0SWR4ID0gaWR4O1xuICAgICAgICB2YXIgcmlnaHRJZHggPSBhcnJheUxlbiAtIGlkeCAtIDE7XG4gICAgICAgIHZhciB0ZW1wID0gYXJyYXlbaWR4XTtcbiAgICAgICAgYXJyYXlbbGVmdElkeF0gPSBhcnJheVtyaWdodElkeF07XG4gICAgICAgIGFycmF5W3JpZ2h0SWR4XSA9IHRlbXA7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn07XG5leHBvcnQgdmFyIHN1bSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgIHZhciB0b3RhbCA9IDA7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHRvdGFsICs9IGFycmF5W2lkeF07XG4gICAgfVxuICAgIHJldHVybiB0b3RhbDtcbn07XG5leHBvcnQgdmFyIHJhbmdlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgYXJyID0gbmV3IEFycmF5KGVuZCAtIHN0YXJ0KTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGFycltpZHhdID0gc3RhcnQgKyBpZHg7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59O1xuZXhwb3J0IHZhciBwbHVja0luZGljZXMgPSBmdW5jdGlvbiAoYXJyLCBpbmRpY2VzKSB7XG4gICAgdmFyIHBsdWNrZWQgPSBuZXcgQXJyYXkoaW5kaWNlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGluZGljZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHBsdWNrZWRbaWR4XSA9IGFycltpbmRpY2VzW2lkeF1dO1xuICAgIH1cbiAgICByZXR1cm4gcGx1Y2tlZDtcbn07XG5leHBvcnQgdmFyIGNhbkJlQ29udmVydGVkVG9VaW50OEFycmF5ID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7XG59O1xuZXhwb3J0IHZhciB0b1VpbnQ4QXJyYXkgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZGVjb2RlRnJvbUJhc2U2NERhdGFVcmkoaW5wdXQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgaW5wdXRgIG11c3QgYmUgb25lIG9mIGBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXlgJyk7XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFycmF5cy5qcy5tYXAiLCIvKipcbiAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgYXQgbGVhc3Qgb25lIHRpY2sgb2YgdGhlXG4gKiBNYWNybyBUYXNrIFF1ZXVlIG9jY3Vycy5cbiAqL1xuZXhwb3J0IHZhciB3YWl0Rm9yVGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiByZXNvbHZlKCk7IH0sIDApO1xuICAgIH0pO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzeW5jLmpzLm1hcCIsIi8qXG4gKiBUaGUgYGNoYXJzYCwgYGxvb2t1cGAsIGBlbmNvZGVgLCBhbmQgYGRlY29kZWAgbWVtYmVycyBvZiB0aGlzIGZpbGUgYXJlXG4gKiBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAgICBiYXNlNjQtYXJyYXlidWZmZXJcbiAqICAgICBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzdmgvYmFzZTY0LWFycmF5YnVmZmVyXG4gKlxuICogICAgIENvcHlyaWdodCAoYykgMjAxMiBOaWtsYXMgdm9uIEhlcnR6ZW5cbiAqICAgICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICovXG52YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG4vLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguXG52YXIgbG9va3VwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpO1xufVxuZXhwb3J0IHZhciBlbmNvZGVUb0Jhc2U2NCA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgIHZhciBiYXNlNjQgPSAnJztcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDMpIHtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2ldID4+IDJdO1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbKChieXRlc1tpXSAmIDMpIDw8IDQpIHwgKGJ5dGVzW2kgKyAxXSA+PiA0KV07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2kgKyAxXSAmIDE1KSA8PCAyKSB8IChieXRlc1tpICsgMl0gPj4gNildO1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaSArIDJdICYgNjNdO1xuICAgIH1cbiAgICBpZiAobGVuICUgMyA9PT0gMikge1xuICAgICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKDAsIGJhc2U2NC5sZW5ndGggLSAxKSArICc9JztcbiAgICB9XG4gICAgZWxzZSBpZiAobGVuICUgMyA9PT0gMSkge1xuICAgICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKDAsIGJhc2U2NC5sZW5ndGggLSAyKSArICc9PSc7XG4gICAgfVxuICAgIHJldHVybiBiYXNlNjQ7XG59O1xuZXhwb3J0IHZhciBkZWNvZGVGcm9tQmFzZTY0ID0gZnVuY3Rpb24gKGJhc2U2NCkge1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBiYXNlNjQubGVuZ3RoICogMC43NTtcbiAgICB2YXIgbGVuID0gYmFzZTY0Lmxlbmd0aDtcbiAgICB2YXIgaTtcbiAgICB2YXIgcCA9IDA7XG4gICAgdmFyIGVuY29kZWQxO1xuICAgIHZhciBlbmNvZGVkMjtcbiAgICB2YXIgZW5jb2RlZDM7XG4gICAgdmFyIGVuY29kZWQ0O1xuICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDFdID09PSAnPScpIHtcbiAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlckxlbmd0aCk7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgICAgIGVuY29kZWQxID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkpXTtcbiAgICAgICAgZW5jb2RlZDIgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDEpXTtcbiAgICAgICAgZW5jb2RlZDMgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDIpXTtcbiAgICAgICAgZW5jb2RlZDQgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDMpXTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9IChlbmNvZGVkMSA8PCAyKSB8IChlbmNvZGVkMiA+PiA0KTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9ICgoZW5jb2RlZDIgJiAxNSkgPDwgNCkgfCAoZW5jb2RlZDMgPj4gMik7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQzICYgMykgPDwgNikgfCAoZW5jb2RlZDQgJiA2Myk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn07XG4vLyBUaGlzIHJlZ2V4IGlzIGRlc2lnbmVkIHRvIGJlIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlLiBJdCB3aWxsIHBhcnNlIGNlcnRhaW5cbi8vIGludmFsaWQgZGF0YSBVUklzLlxudmFyIERBVEFfVVJJX1BSRUZJWF9SRUdFWCA9IC9eKGRhdGEpPzo/KFtcXHdcXC9cXCtdKyk/Oz8oY2hhcnNldD1bXFx3LV0rfGJhc2U2NCk/LiosL2k7XG4vKipcbiAqIElmIHRoZSBgZGF0YVVyaWAgaW5wdXQgaXMgYSBkYXRhIFVSSSwgdGhlbiB0aGUgZGF0YSBVUkkgcHJlZml4IG11c3Qgbm90IGJlXG4gKiBsb25nZXIgdGhhbiAxMDAgY2hhcmFjdGVycywgb3IgdGhpcyBmdW5jdGlvbiB3aWxsIGZhaWwgdG8gZGVjb2RlIGl0LlxuICpcbiAqIEBwYXJhbSBkYXRhVXJpIGEgYmFzZTY0IGRhdGEgVVJJIG9yIHBsYWluIGJhc2U2NCBzdHJpbmdcbiAqIEByZXR1cm5zIGEgVWludDhBcnJheSBjb250YWluaW5nIHRoZSBkZWNvZGVkIGlucHV0XG4gKi9cbmV4cG9ydCB2YXIgZGVjb2RlRnJvbUJhc2U2NERhdGFVcmkgPSBmdW5jdGlvbiAoZGF0YVVyaSkge1xuICAgIHZhciB0cmltbWVkVXJpID0gZGF0YVVyaS50cmltKCk7XG4gICAgdmFyIHByZWZpeCA9IHRyaW1tZWRVcmkuc3Vic3RyaW5nKDAsIDEwMCk7XG4gICAgdmFyIHJlcyA9IHByZWZpeC5tYXRjaChEQVRBX1VSSV9QUkVGSVhfUkVHRVgpO1xuICAgIC8vIEFzc3VtZSBpdCdzIG5vdCBhIGRhdGEgVVJJIC0ganVzdCBhIHBsYWluIGJhc2U2NCBzdHJpbmdcbiAgICBpZiAoIXJlcylcbiAgICAgICAgcmV0dXJuIGRlY29kZUZyb21CYXNlNjQodHJpbW1lZFVyaSk7XG4gICAgLy8gUmVtb3ZlIHRoZSBkYXRhIFVSSSBwcmVmaXggYW5kIHBhcnNlIHRoZSByZW1haW5kZXIgYXMgYSBiYXNlNjQgc3RyaW5nXG4gICAgdmFyIGZ1bGxNYXRjaCA9IHJlc1swXTtcbiAgICB2YXIgZGF0YSA9IHRyaW1tZWRVcmkuc3Vic3RyaW5nKGZ1bGxNYXRjaC5sZW5ndGgpO1xuICAgIHJldHVybiBkZWNvZGVGcm9tQmFzZTY0KGRhdGEpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2U2NC5qcy5tYXAiLCJleHBvcnQgdmFyIGVycm9yID0gZnVuY3Rpb24gKG1zZykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9ycy5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9hcnJheXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FzeW5jXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJpbmdzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91bmljb2RlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9udW1iZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Jhc2U2NFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb2JqZWN0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGRmRG9jRW5jb2RpbmdcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FjaGUgfSBmcm9tIFwiLi9DYWNoZVwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8gdHNsaW50OmRpc2FibGUgcmFkaXhcbi8qKlxuICogQ29udmVydHMgYSBudW1iZXIgdG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbiBpbiBkZWNpbWFsLiBUaGlzIGZ1bmN0aW9uXG4gKiBkaWZmZXJzIGZyb20gc2ltcGx5IGNvbnZlcnRpbmcgYSBudW1iZXIgdG8gYSBzdHJpbmcgd2l0aCBgLnRvU3RyaW5nKClgXG4gKiBiZWNhdXNlIHRoaXMgZnVuY3Rpb24ncyBvdXRwdXQgc3RyaW5nIHdpbGwgKipub3QqKiBjb250YWluIGV4cG9uZW50aWFsXG4gKiBub3RhdGlvbi5cbiAqXG4gKiBDcmVkaXQ6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NjU0NTUxOVxuICovXG5leHBvcnQgdmFyIG51bWJlclRvU3RyaW5nID0gZnVuY3Rpb24gKG51bSkge1xuICAgIHZhciBudW1TdHIgPSBTdHJpbmcobnVtKTtcbiAgICBpZiAoTWF0aC5hYnMobnVtKSA8IDEuMCkge1xuICAgICAgICB2YXIgZSA9IHBhcnNlSW50KG51bS50b1N0cmluZygpLnNwbGl0KCdlLScpWzFdKTtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIHZhciBuZWdhdGl2ZSA9IG51bSA8IDA7XG4gICAgICAgICAgICBpZiAobmVnYXRpdmUpXG4gICAgICAgICAgICAgICAgbnVtICo9IC0xO1xuICAgICAgICAgICAgbnVtICo9IE1hdGgucG93KDEwLCBlIC0gMSk7XG4gICAgICAgICAgICBudW1TdHIgPSAnMC4nICsgbmV3IEFycmF5KGUpLmpvaW4oJzAnKSArIG51bS50b1N0cmluZygpLnN1YnN0cmluZygyKTtcbiAgICAgICAgICAgIGlmIChuZWdhdGl2ZSlcbiAgICAgICAgICAgICAgICBudW1TdHIgPSAnLScgKyBudW1TdHI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBlID0gcGFyc2VJbnQobnVtLnRvU3RyaW5nKCkuc3BsaXQoJysnKVsxXSk7XG4gICAgICAgIGlmIChlID4gMjApIHtcbiAgICAgICAgICAgIGUgLT0gMjA7XG4gICAgICAgICAgICBudW0gLz0gTWF0aC5wb3coMTAsIGUpO1xuICAgICAgICAgICAgbnVtU3RyID0gbnVtLnRvU3RyaW5nKCkgKyBuZXcgQXJyYXkoZSArIDEpLmpvaW4oJzAnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVtU3RyO1xufTtcbmV4cG9ydCB2YXIgc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAobikgeyByZXR1cm4gTWF0aC5jZWlsKG4udG9TdHJpbmcoMikubGVuZ3RoIC8gOCk7IH07XG4vKipcbiAqIENvbnZlcnRzIGEgbnVtYmVyIGludG8gaXRzIGNvbnN0aXR1ZW50IGJ5dGVzIGFuZCByZXR1cm5zIHRoZW0gYXNcbiAqIGEgbnVtYmVyW10uXG4gKlxuICogUmV0dXJucyBtb3N0IHNpZ25pZmljYW50IGJ5dGUgYXMgZmlyc3QgZWxlbWVudCBpbiBhcnJheS4gSXQgbWF5IGJlIG5lY2Vzc2FyeVxuICogdG8gY2FsbCAucmV2ZXJzZSgpIHRvIGdldCB0aGUgYml0cyBpbiB0aGUgZGVzaXJlZCBvcmRlci5cbiAqXG4gKiBFeGFtcGxlOlxuICogICBieXRlc0ZvcigweDAyQTQxRSkgPT4gWyAwYjEwLCAwYjEwMTAwMTAwLCAwYjExMTEwIF1cbiAqXG4gKiBDcmVkaXQgZm9yIGFsZ29yaXRobTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5MzY4NjVcbiAqL1xuZXhwb3J0IHZhciBieXRlc0ZvciA9IGZ1bmN0aW9uIChuKSB7XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZUluQnl0ZXMobikpO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJ5dGVzW2kgLSAxXSA9IG4gPj4gKChieXRlcy5sZW5ndGggLSBpKSAqIDgpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bnVtYmVycy5qcy5tYXAiLCJpbXBvcnQgeyBGb250TmFtZXMgfSBmcm9tICdAcGRmLWxpYi9zdGFuZGFyZC1mb250cyc7XG5leHBvcnQgdmFyIHZhbHVlcyA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubWFwKGZ1bmN0aW9uIChrKSB7IHJldHVybiBvYmpba107IH0pOyB9O1xuZXhwb3J0IHZhciBTdGFuZGFyZEZvbnRWYWx1ZXMgPSB2YWx1ZXMoRm9udE5hbWVzKTtcbmV4cG9ydCB2YXIgaXNTdGFuZGFyZEZvbnQgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICByZXR1cm4gU3RhbmRhcmRGb250VmFsdWVzLmluY2x1ZGVzKGlucHV0KTtcbn07XG5leHBvcnQgdmFyIHJlY3RhbmdsZXNBcmVFcXVhbCA9IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLnggPT09IGIueCAmJiBhLnkgPT09IGIueSAmJiBhLndpZHRoID09PSBiLndpZHRoICYmIGEuaGVpZ2h0ID09PSBiLmhlaWdodDsgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdHMuanMubWFwIiwiaW1wb3J0IHsgdG9DaGFyQ29kZSB9IGZyb20gXCIuL3N0cmluZ3NcIjtcbi8vIE1hcHBpbmcgZnJvbSBQREZEb2NFbmNvZGluZyB0byBVbmljb2RlIGNvZGUgcG9pbnRcbnZhciBwZGZEb2NFbmNvZGluZ1RvVW5pY29kZSA9IG5ldyBVaW50MTZBcnJheSgyNTYpO1xuLy8gSW5pdGlhbGl6ZSB0aGUgY29kZSBwb2ludHMgd2hpY2ggYXJlIHRoZSBzYW1lXG5mb3IgKHZhciBpZHggPSAwOyBpZHggPCAyNTY7IGlkeCsrKSB7XG4gICAgcGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbaWR4XSA9IGlkeDtcbn1cbi8vIFNldCBkaWZmZXJlbmNlcyAoc2VlIFwiVGFibGUgRC4yIOKAkyBQREZEb2NFbmNvZGluZyBDaGFyYWN0ZXIgU2V0XCIgb2YgdGhlIFBERiBzcGVjKVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxNl0gPSB0b0NoYXJDb2RlKCdcXHUwMDE3Jyk7IC8vIFNZTkNST05PVVMgSURMRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxOF0gPSB0b0NoYXJDb2RlKCdcXHUwMkQ4Jyk7IC8vIEJSRVZFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDE5XSA9IHRvQ2hhckNvZGUoJ1xcdTAyQzcnKTsgLy8gQ0FST05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MWFdID0gdG9DaGFyQ29kZSgnXFx1MDJDNicpOyAvLyBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlRcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MWJdID0gdG9DaGFyQ29kZSgnXFx1MDJEOScpOyAvLyBET1QgQUJPVkVcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MWNdID0gdG9DaGFyQ29kZSgnXFx1MDJERCcpOyAvLyBET1VCTEUgQUNVVEUgQUNDRU5UXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDFkXSA9IHRvQ2hhckNvZGUoJ1xcdTAyREInKTsgLy8gT0dPTkVLXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDFlXSA9IHRvQ2hhckNvZGUoJ1xcdTAyREEnKTsgLy8gUklORyBBQk9WRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxZl0gPSB0b0NoYXJDb2RlKCdcXHUwMkRDJyk7IC8vIFNNQUxMIFRJTERFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDdmXSA9IHRvQ2hhckNvZGUoJ1xcdUZGRkQnKTsgLy8gUkVQTEFDRU1FTlQgQ0hBUkFDVEVSIChib3ggd2l0aCBxdWVzdGlvbm1hcmspXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDgwXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMjInKTsgLy8gQlVMTEVUXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDgxXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMjAnKTsgLy8gREFHR0VSXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDgyXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMjEnKTsgLy8gRE9VQkxFIERBR0dFUlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4M10gPSB0b0NoYXJDb2RlKCdcXHUyMDI2Jyk7IC8vIEhPUklaT05UQUwgRUxMSVBTSVNcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODRdID0gdG9DaGFyQ29kZSgnXFx1MjAxNCcpOyAvLyBFTSBEQVNIXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDg1XSA9IHRvQ2hhckNvZGUoJ1xcdTIwMTMnKTsgLy8gRU4gREFTSFxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4Nl0gPSB0b0NoYXJDb2RlKCdcXHUwMTkyJyk7IC8vIExBVElOIFNNQUxMIExFVFRFUiBTQ1JJUFQgRlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4N10gPSB0b0NoYXJDb2RlKCdcXHUyMDQ0Jyk7IC8vIEZSQUNUSU9OIFNMQVNIIChzb2xpZHVzKVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4OF0gPSB0b0NoYXJDb2RlKCdcXHUyMDM5Jyk7IC8vIFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDg5XSA9IHRvQ2hhckNvZGUoJ1xcdTIwM0EnKTsgLy8gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDhhXSA9IHRvQ2hhckNvZGUoJ1xcdTIyMTInKTsgLy8gTUlOVVMgU0lHTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4Yl0gPSB0b0NoYXJDb2RlKCdcXHUyMDMwJyk7IC8vIFBFUiBNSUxMRSBTSUdOXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDhjXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMUUnKTsgLy8gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLIChxdW90ZWRibGJhc2UpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDhkXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMUMnKTsgLy8gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKHF1b3RlZGJsbGVmdClcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OGVdID0gdG9DaGFyQ29kZSgnXFx1MjAxRCcpOyAvLyBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKHF1b3RlZGJscmlnaHQpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDhmXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMTgnKTsgLy8gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKHF1b3RlbGVmdClcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTBdID0gdG9DaGFyQ29kZSgnXFx1MjAxOScpOyAvLyBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKHF1b3RlcmlnaHQpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDkxXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMUEnKTsgLy8gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLIChxdW90ZXNpbmdsYmFzZSlcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTJdID0gdG9DaGFyQ29kZSgnXFx1MjEyMicpOyAvLyBUUkFERSBNQVJLIFNJR05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTNdID0gdG9DaGFyQ29kZSgnXFx1RkIwMScpOyAvLyBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGSVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5NF0gPSB0b0NoYXJDb2RlKCdcXHVGQjAyJyk7IC8vIExBVElOIFNNQUxMIExJR0FUVVJFIEZMXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDk1XSA9IHRvQ2hhckNvZGUoJ1xcdTAxNDEnKTsgLy8gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5Nl0gPSB0b0NoYXJDb2RlKCdcXHUwMTUyJyk7IC8vIExBVElOIENBUElUQUwgTElHQVRVUkUgT0VcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTddID0gdG9DaGFyQ29kZSgnXFx1MDE2MCcpOyAvLyBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OThdID0gdG9DaGFyQ29kZSgnXFx1MDE3OCcpOyAvLyBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDk5XSA9IHRvQ2hhckNvZGUoJ1xcdTAxN0QnKTsgLy8gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDlhXSA9IHRvQ2hhckNvZGUoJ1xcdTAxMzEnKTsgLy8gTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5Yl0gPSB0b0NoYXJDb2RlKCdcXHUwMTQyJyk7IC8vIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDljXSA9IHRvQ2hhckNvZGUoJ1xcdTAxNTMnKTsgLy8gTEFUSU4gU01BTEwgTElHQVRVUkUgT0VcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OWRdID0gdG9DaGFyQ29kZSgnXFx1MDE2MScpOyAvLyBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDllXSA9IHRvQ2hhckNvZGUoJ1xcdTAxN0UnKTsgLy8gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5Zl0gPSB0b0NoYXJDb2RlKCdcXHVGRkZEJyk7IC8vIFJFUExBQ0VNRU5UIENIQVJBQ1RFUiAoYm94IHdpdGggcXVlc3Rpb25tYXJrKVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHhhMF0gPSB0b0NoYXJDb2RlKCdcXHUyMEFDJyk7IC8vIEVVUk8gU0lHTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHhhZF0gPSB0b0NoYXJDb2RlKCdcXHVGRkZEJyk7IC8vIFJFUExBQ0VNRU5UIENIQVJBQ1RFUiAoYm94IHdpdGggcXVlc3Rpb25tYXJrKVxuLyoqXG4gKiBEZWNvZGUgYSBieXRlIGFycmF5IGludG8gYSBzdHJpbmcgdXNpbmcgUERGRG9jRW5jb2RpbmcuXG4gKlxuICogQHBhcmFtIGJ5dGVzIGEgYnl0ZSBhcnJheSAoZGVjaW1hbCByZXByZXNlbnRhdGlvbikgY29udGFpbmluZyBhIHN0cmluZ1xuICogICAgICAgICAgICAgIGVuY29kZWQgd2l0aCBQREZEb2NFbmNvZGluZy5cbiAqL1xuZXhwb3J0IHZhciBwZGZEb2NFbmNvZGluZ0RlY29kZSA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgIHZhciBjb2RlUG9pbnRzID0gbmV3IEFycmF5KGJ5dGVzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYnl0ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGNvZGVQb2ludHNbaWR4XSA9IHBkZkRvY0VuY29kaW5nVG9Vbmljb2RlW2J5dGVzW2lkeF1dO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wZGZEb2NFbmNvZGluZy5qcy5tYXAiLCJpbXBvcnQgVVBORyBmcm9tICdAcGRmLWxpYi91cG5nJztcbnZhciBnZXRJbWFnZVR5cGUgPSBmdW5jdGlvbiAoY3R5cGUpIHtcbiAgICBpZiAoY3R5cGUgPT09IDApXG4gICAgICAgIHJldHVybiBQbmdUeXBlLkdyZXlzY2FsZTtcbiAgICBpZiAoY3R5cGUgPT09IDIpXG4gICAgICAgIHJldHVybiBQbmdUeXBlLlRydWVjb2xvdXI7XG4gICAgaWYgKGN0eXBlID09PSAzKVxuICAgICAgICByZXR1cm4gUG5nVHlwZS5JbmRleGVkQ29sb3VyO1xuICAgIGlmIChjdHlwZSA9PT0gNClcbiAgICAgICAgcmV0dXJuIFBuZ1R5cGUuR3JleXNjYWxlV2l0aEFscGhhO1xuICAgIGlmIChjdHlwZSA9PT0gNilcbiAgICAgICAgcmV0dXJuIFBuZ1R5cGUuVHJ1ZWNvbG91cldpdGhBbHBoYTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNvbG9yIHR5cGU6IFwiICsgY3R5cGUpO1xufTtcbnZhciBzcGxpdEFscGhhQ2hhbm5lbCA9IGZ1bmN0aW9uIChyZ2JhQ2hhbm5lbCkge1xuICAgIHZhciBwaXhlbENvdW50ID0gTWF0aC5mbG9vcihyZ2JhQ2hhbm5lbC5sZW5ndGggLyA0KTtcbiAgICB2YXIgcmdiQ2hhbm5lbCA9IG5ldyBVaW50OEFycmF5KHBpeGVsQ291bnQgKiAzKTtcbiAgICB2YXIgYWxwaGFDaGFubmVsID0gbmV3IFVpbnQ4QXJyYXkocGl4ZWxDb3VudCAqIDEpO1xuICAgIHZhciByZ2JhT2Zmc2V0ID0gMDtcbiAgICB2YXIgcmdiT2Zmc2V0ID0gMDtcbiAgICB2YXIgYWxwaGFPZmZzZXQgPSAwO1xuICAgIHdoaWxlIChyZ2JhT2Zmc2V0IDwgcmdiYUNoYW5uZWwubGVuZ3RoKSB7XG4gICAgICAgIHJnYkNoYW5uZWxbcmdiT2Zmc2V0KytdID0gcmdiYUNoYW5uZWxbcmdiYU9mZnNldCsrXTtcbiAgICAgICAgcmdiQ2hhbm5lbFtyZ2JPZmZzZXQrK10gPSByZ2JhQ2hhbm5lbFtyZ2JhT2Zmc2V0KytdO1xuICAgICAgICByZ2JDaGFubmVsW3JnYk9mZnNldCsrXSA9IHJnYmFDaGFubmVsW3JnYmFPZmZzZXQrK107XG4gICAgICAgIGFscGhhQ2hhbm5lbFthbHBoYU9mZnNldCsrXSA9IHJnYmFDaGFubmVsW3JnYmFPZmZzZXQrK107XG4gICAgfVxuICAgIHJldHVybiB7IHJnYkNoYW5uZWw6IHJnYkNoYW5uZWwsIGFscGhhQ2hhbm5lbDogYWxwaGFDaGFubmVsIH07XG59O1xuZXhwb3J0IHZhciBQbmdUeXBlO1xuKGZ1bmN0aW9uIChQbmdUeXBlKSB7XG4gICAgUG5nVHlwZVtcIkdyZXlzY2FsZVwiXSA9IFwiR3JleXNjYWxlXCI7XG4gICAgUG5nVHlwZVtcIlRydWVjb2xvdXJcIl0gPSBcIlRydWVjb2xvdXJcIjtcbiAgICBQbmdUeXBlW1wiSW5kZXhlZENvbG91clwiXSA9IFwiSW5kZXhlZENvbG91clwiO1xuICAgIFBuZ1R5cGVbXCJHcmV5c2NhbGVXaXRoQWxwaGFcIl0gPSBcIkdyZXlzY2FsZVdpdGhBbHBoYVwiO1xuICAgIFBuZ1R5cGVbXCJUcnVlY29sb3VyV2l0aEFscGhhXCJdID0gXCJUcnVlY29sb3VyV2l0aEFscGhhXCI7XG59KShQbmdUeXBlIHx8IChQbmdUeXBlID0ge30pKTtcbnZhciBQTkcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUE5HKHBuZ0RhdGEpIHtcbiAgICAgICAgdmFyIHVwbmcgPSBVUE5HLmRlY29kZShwbmdEYXRhKTtcbiAgICAgICAgdmFyIGZyYW1lcyA9IFVQTkcudG9SR0JBOCh1cG5nKTtcbiAgICAgICAgaWYgKGZyYW1lcy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW5pbWF0ZWQgUE5HcyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgdmFyIGZyYW1lID0gbmV3IFVpbnQ4QXJyYXkoZnJhbWVzWzBdKTtcbiAgICAgICAgdmFyIF9hID0gc3BsaXRBbHBoYUNoYW5uZWwoZnJhbWUpLCByZ2JDaGFubmVsID0gX2EucmdiQ2hhbm5lbCwgYWxwaGFDaGFubmVsID0gX2EuYWxwaGFDaGFubmVsO1xuICAgICAgICB0aGlzLnJnYkNoYW5uZWwgPSByZ2JDaGFubmVsO1xuICAgICAgICB2YXIgaGFzQWxwaGFWYWx1ZXMgPSBhbHBoYUNoYW5uZWwuc29tZShmdW5jdGlvbiAoYSkgeyByZXR1cm4gYSA8IDI1NTsgfSk7XG4gICAgICAgIGlmIChoYXNBbHBoYVZhbHVlcylcbiAgICAgICAgICAgIHRoaXMuYWxwaGFDaGFubmVsID0gYWxwaGFDaGFubmVsO1xuICAgICAgICB0aGlzLnR5cGUgPSBnZXRJbWFnZVR5cGUodXBuZy5jdHlwZSk7XG4gICAgICAgIHRoaXMud2lkdGggPSB1cG5nLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHVwbmcuaGVpZ2h0O1xuICAgICAgICB0aGlzLmJpdHNQZXJDb21wb25lbnQgPSA4O1xuICAgIH1cbiAgICBQTkcubG9hZCA9IGZ1bmN0aW9uIChwbmdEYXRhKSB7IHJldHVybiBuZXcgUE5HKHBuZ0RhdGEpOyB9O1xuICAgIHJldHVybiBQTkc7XG59KCkpO1xuZXhwb3J0IHsgUE5HIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wbmcuanMubWFwIiwiLyoqXG4gKiBHZW5lcmF0ZXMgYSBwc2V1ZG8gcmFuZG9tIG51bWJlci4gQWx0aG91Z2ggaXQgaXMgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZVxuICogYW5kIHVuaWZvcm1seSBkaXN0cmlidXRlZCwgaXQgaXMgbm90IGEgY29uY2VybiBmb3IgdGhlIGludGVuZGVkIHVzZS1jYXNlLFxuICogd2hpY2ggaXMgdG8gZ2VuZXJhdGUgZGlzdGluY3QgbnVtYmVycy5cbiAqXG4gKiBDcmVkaXQ6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xOTMwMzcyNS8xMDI1NDA0OVxuICovXG52YXIgU2ltcGxlUk5HID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNpbXBsZVJORyhzZWVkKSB7XG4gICAgICAgIHRoaXMuc2VlZCA9IHNlZWQ7XG4gICAgfVxuICAgIFNpbXBsZVJORy5wcm90b3R5cGUubmV4dEludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHggPSBNYXRoLnNpbih0aGlzLnNlZWQrKykgKiAxMDAwMDtcbiAgICAgICAgcmV0dXJuIHggLSBNYXRoLmZsb29yKHgpO1xuICAgIH07XG4gICAgU2ltcGxlUk5HLndpdGhTZWVkID0gZnVuY3Rpb24gKHNlZWQpIHsgcmV0dXJuIG5ldyBTaW1wbGVSTkcoc2VlZCk7IH07XG4gICAgcmV0dXJuIFNpbXBsZVJORztcbn0oKSk7XG5leHBvcnQgeyBTaW1wbGVSTkcgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJuZy5qcy5tYXAiLCJleHBvcnQgdmFyIHRvQ2hhckNvZGUgPSBmdW5jdGlvbiAoY2hhcmFjdGVyKSB7IHJldHVybiBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKTsgfTtcbmV4cG9ydCB2YXIgdG9Db2RlUG9pbnQgPSBmdW5jdGlvbiAoY2hhcmFjdGVyKSB7IHJldHVybiBjaGFyYWN0ZXIuY29kZVBvaW50QXQoMCk7IH07XG5leHBvcnQgdmFyIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGggPSBmdW5jdGlvbiAobnVtLCBtaW5MZW5ndGgpIHtcbiAgICByZXR1cm4gcGFkU3RhcnQobnVtLnRvU3RyaW5nKDE2KSwgbWluTGVuZ3RoLCAnMCcpLnRvVXBwZXJDYXNlKCk7XG59O1xuZXhwb3J0IHZhciB0b0hleFN0cmluZyA9IGZ1bmN0aW9uIChudW0pIHsgcmV0dXJuIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgobnVtLCAyKTsgfTtcbmV4cG9ydCB2YXIgY2hhckZyb21Db2RlID0gZnVuY3Rpb24gKGNvZGUpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7IH07XG5leHBvcnQgdmFyIGNoYXJGcm9tSGV4Q29kZSA9IGZ1bmN0aW9uIChoZXgpIHsgcmV0dXJuIGNoYXJGcm9tQ29kZShwYXJzZUludChoZXgsIDE2KSk7IH07XG5leHBvcnQgdmFyIHBhZFN0YXJ0ID0gZnVuY3Rpb24gKHZhbHVlLCBsZW5ndGgsIHBhZENoYXIpIHtcbiAgICB2YXIgcGFkZGluZyA9ICcnO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxlbmd0aCAtIHZhbHVlLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBwYWRkaW5nICs9IHBhZENoYXI7XG4gICAgfVxuICAgIHJldHVybiBwYWRkaW5nICsgdmFsdWU7XG59O1xuZXhwb3J0IHZhciBjb3B5U3RyaW5nSW50b0J1ZmZlciA9IGZ1bmN0aW9uIChzdHIsIGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gc3RyLmNoYXJDb2RlQXQoaWR4KTtcbiAgICB9XG4gICAgcmV0dXJuIGxlbmd0aDtcbn07XG5leHBvcnQgdmFyIGFkZFJhbmRvbVN1ZmZpeCA9IGZ1bmN0aW9uIChwcmVmaXgsIHN1ZmZpeExlbmd0aCkge1xuICAgIGlmIChzdWZmaXhMZW5ndGggPT09IHZvaWQgMCkgeyBzdWZmaXhMZW5ndGggPSA0OyB9XG4gICAgcmV0dXJuIHByZWZpeCArIFwiLVwiICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTWF0aC5wb3coMTAsIHN1ZmZpeExlbmd0aCkpO1xufTtcbmV4cG9ydCB2YXIgZXNjYXBlUmVnRXhwID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbn07XG5leHBvcnQgdmFyIGNsZWFuVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFx0fFxcdTAwODV8XFx1MjAyOHxcXHUyMDI5L2csICcgICAgJykucmVwbGFjZSgvW1xcYlxcdl0vZywgJycpO1xufTtcbmV4cG9ydCB2YXIgZXNjYXBlZE5ld2xpbmVDaGFycyA9IFsnXFxcXG4nLCAnXFxcXGYnLCAnXFxcXHInLCAnXFxcXHUwMDBCJ107XG5leHBvcnQgdmFyIG5ld2xpbmVDaGFycyA9IFsnXFxuJywgJ1xcZicsICdcXHInLCAnXFx1MDAwQiddO1xuZXhwb3J0IHZhciBpc05ld2xpbmVDaGFyID0gZnVuY3Rpb24gKHRleHQpIHsgcmV0dXJuIC9eW1xcblxcZlxcclxcdTAwMEJdJC8udGVzdCh0ZXh0KTsgfTtcbmV4cG9ydCB2YXIgbGluZVNwbGl0ID0gZnVuY3Rpb24gKHRleHQpIHsgcmV0dXJuIHRleHQuc3BsaXQoL1tcXG5cXGZcXHJcXHUwMDBCXS8pOyB9O1xuZXhwb3J0IHZhciBtZXJnZUxpbmVzID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bXFxuXFxmXFxyXFx1MDAwQl0vZywgJyAnKTtcbn07XG4vLyBKYXZhU2NyaXB0J3MgU3RyaW5nLmNoYXJBdCgpIG1ldGhvZCBkb2VzbiB3b3JrIG9uIHN0cmluZ3MgY29udGFpbmluZyBVVEYtMTZcbi8vIGNoYXJhY3RlcnMgKHdpdGggaGlnaCBhbmQgbG93IHN1cnJvZ2F0ZSBwYWlycyksIHN1Y2ggYXMg8J+SqSAocG9vIGVtb2ppKS4gVGhpc1xuLy8gYGNoYXJBdEluZGV4KClgIGZ1bmN0aW9uIGRvZXMuXG4vL1xuLy8gQ3JlZGl0OiBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0L2Jsb2IvbWFzdGVyL2F0LmpzI0wxNC1MNDhcbmV4cG9ydCB2YXIgY2hhckF0SW5kZXggPSBmdW5jdGlvbiAodGV4dCwgaW5kZXgpIHtcbiAgICAvLyBHZXQgdGhlIGZpcnN0IGNvZGUgdW5pdCBhbmQgY29kZSB1bml0IHZhbHVlXG4gICAgdmFyIGN1Rmlyc3QgPSB0ZXh0LmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgIHZhciBjdVNlY29uZDtcbiAgICB2YXIgbmV4dEluZGV4ID0gaW5kZXggKyAxO1xuICAgIHZhciBsZW5ndGggPSAxO1xuICAgIGlmIChcbiAgICAvLyBDaGVjayBpZiBpdCdzIHRoZSBzdGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyLlxuICAgIGN1Rmlyc3QgPj0gMHhkODAwICYmXG4gICAgICAgIGN1Rmlyc3QgPD0gMHhkYmZmICYmIC8vIGhpZ2ggc3Vycm9nYXRlXG4gICAgICAgIHRleHQubGVuZ3RoID4gbmV4dEluZGV4IC8vIHRoZXJlIGlzIGEgbmV4dCBjb2RlIHVuaXRcbiAgICApIHtcbiAgICAgICAgY3VTZWNvbmQgPSB0ZXh0LmNoYXJDb2RlQXQobmV4dEluZGV4KTtcbiAgICAgICAgaWYgKGN1U2Vjb25kID49IDB4ZGMwMCAmJiBjdVNlY29uZCA8PSAweGRmZmYpXG4gICAgICAgICAgICBsZW5ndGggPSAyOyAvLyBsb3cgc3Vycm9nYXRlXG4gICAgfVxuICAgIHJldHVybiBbdGV4dC5zbGljZShpbmRleCwgaW5kZXggKyBsZW5ndGgpLCBsZW5ndGhdO1xufTtcbmV4cG9ydCB2YXIgY2hhclNwbGl0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICB2YXIgY2hhcnMgPSBbXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0ZXh0Lmxlbmd0aDsgaWR4IDwgbGVuOykge1xuICAgICAgICB2YXIgX2EgPSBjaGFyQXRJbmRleCh0ZXh0LCBpZHgpLCBjID0gX2FbMF0sIGNMZW4gPSBfYVsxXTtcbiAgICAgICAgY2hhcnMucHVzaChjKTtcbiAgICAgICAgaWR4ICs9IGNMZW47XG4gICAgfVxuICAgIHJldHVybiBjaGFycztcbn07XG52YXIgYnVpbGRXb3JkQnJlYWtSZWdleCA9IGZ1bmN0aW9uICh3b3JkQnJlYWtzKSB7XG4gICAgdmFyIG5ld2xpbmVDaGFyVW5pb24gPSBlc2NhcGVkTmV3bGluZUNoYXJzLmpvaW4oJ3wnKTtcbiAgICB2YXIgZXNjYXBlZFJ1bGVzID0gWyckJ107XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd29yZEJyZWFrcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIHdvcmRCcmVhayA9IHdvcmRCcmVha3NbaWR4XTtcbiAgICAgICAgaWYgKGlzTmV3bGluZUNoYXIod29yZEJyZWFrKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImB3b3JkQnJlYWtgIG11c3Qgbm90IGluY2x1ZGUgXCIgKyBuZXdsaW5lQ2hhclVuaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlc2NhcGVkUnVsZXMucHVzaCh3b3JkQnJlYWsgPT09ICcnID8gJy4nIDogZXNjYXBlUmVnRXhwKHdvcmRCcmVhaykpO1xuICAgIH1cbiAgICB2YXIgYnJlYWtSdWxlcyA9IGVzY2FwZWRSdWxlcy5qb2luKCd8Jyk7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXCIoXCIgKyBuZXdsaW5lQ2hhclVuaW9uICsgXCIpfCgoLio/KShcIiArIGJyZWFrUnVsZXMgKyBcIikpXCIsICdnbScpO1xufTtcbmV4cG9ydCB2YXIgYnJlYWtUZXh0SW50b0xpbmVzID0gZnVuY3Rpb24gKHRleHQsIHdvcmRCcmVha3MsIG1heFdpZHRoLCBjb21wdXRlV2lkdGhPZlRleHQpIHtcbiAgICB2YXIgcmVnZXggPSBidWlsZFdvcmRCcmVha1JlZ2V4KHdvcmRCcmVha3MpO1xuICAgIHZhciB3b3JkcyA9IGNsZWFuVGV4dCh0ZXh0KS5tYXRjaChyZWdleCk7XG4gICAgdmFyIGN1cnJMaW5lID0gJyc7XG4gICAgdmFyIGN1cnJXaWR0aCA9IDA7XG4gICAgdmFyIGxpbmVzID0gW107XG4gICAgdmFyIHB1c2hDdXJyTGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGN1cnJMaW5lICE9PSAnJylcbiAgICAgICAgICAgIGxpbmVzLnB1c2goY3VyckxpbmUpO1xuICAgICAgICBjdXJyTGluZSA9ICcnO1xuICAgICAgICBjdXJyV2lkdGggPSAwO1xuICAgIH07XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd29yZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciB3b3JkID0gd29yZHNbaWR4XTtcbiAgICAgICAgaWYgKGlzTmV3bGluZUNoYXIod29yZCkpIHtcbiAgICAgICAgICAgIHB1c2hDdXJyTGluZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gY29tcHV0ZVdpZHRoT2ZUZXh0KHdvcmQpO1xuICAgICAgICAgICAgaWYgKGN1cnJXaWR0aCArIHdpZHRoID4gbWF4V2lkdGgpXG4gICAgICAgICAgICAgICAgcHVzaEN1cnJMaW5lKCk7XG4gICAgICAgICAgICBjdXJyTGluZSArPSB3b3JkO1xuICAgICAgICAgICAgY3VycldpZHRoICs9IHdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1c2hDdXJyTGluZSgpO1xuICAgIHJldHVybiBsaW5lcztcbn07XG4vLyBTZWUgc2VjdGlvbiBcIjcuOS40IERhdGVzXCIgb2YgdGhlIFBERiBzcGVjaWZpY2F0aW9uXG52YXIgZGF0ZVJlZ2V4ID0gL15EOihcXGRcXGRcXGRcXGQpKFxcZFxcZCk/KFxcZFxcZCk/KFxcZFxcZCk/KFxcZFxcZCk/KFxcZFxcZCk/KFsrXFwtWl0pPyhcXGRcXGQpPyc/KFxcZFxcZCk/Jz8kLztcbmV4cG9ydCB2YXIgcGFyc2VEYXRlID0gZnVuY3Rpb24gKGRhdGVTdHIpIHtcbiAgICB2YXIgbWF0Y2ggPSBkYXRlU3RyLm1hdGNoKGRhdGVSZWdleCk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB2YXIgeWVhciA9IG1hdGNoWzFdLCBfYSA9IG1hdGNoWzJdLCBtb250aCA9IF9hID09PSB2b2lkIDAgPyAnMDEnIDogX2EsIF9iID0gbWF0Y2hbM10sIGRheSA9IF9iID09PSB2b2lkIDAgPyAnMDEnIDogX2IsIF9jID0gbWF0Y2hbNF0sIGhvdXJzID0gX2MgPT09IHZvaWQgMCA/ICcwMCcgOiBfYywgX2QgPSBtYXRjaFs1XSwgbWlucyA9IF9kID09PSB2b2lkIDAgPyAnMDAnIDogX2QsIF9lID0gbWF0Y2hbNl0sIHNlY3MgPSBfZSA9PT0gdm9pZCAwID8gJzAwJyA6IF9lLCBfZiA9IG1hdGNoWzddLCBvZmZzZXRTaWduID0gX2YgPT09IHZvaWQgMCA/ICdaJyA6IF9mLCBfZyA9IG1hdGNoWzhdLCBvZmZzZXRIb3VycyA9IF9nID09PSB2b2lkIDAgPyAnMDAnIDogX2csIF9oID0gbWF0Y2hbOV0sIG9mZnNldE1pbnMgPSBfaCA9PT0gdm9pZCAwID8gJzAwJyA6IF9oO1xuICAgIC8vIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS45LjEuMTVcbiAgICB2YXIgdHpPZmZzZXQgPSBvZmZzZXRTaWduID09PSAnWicgPyAnWicgOiBcIlwiICsgb2Zmc2V0U2lnbiArIG9mZnNldEhvdXJzICsgXCI6XCIgKyBvZmZzZXRNaW5zO1xuICAgIHZhciBkYXRlID0gbmV3IERhdGUoeWVhciArIFwiLVwiICsgbW9udGggKyBcIi1cIiArIGRheSArIFwiVFwiICsgaG91cnMgKyBcIjpcIiArIG1pbnMgKyBcIjpcIiArIHNlY3MgKyB0ek9mZnNldCk7XG4gICAgcmV0dXJuIGRhdGU7XG59O1xuZXhwb3J0IHZhciBmaW5kTGFzdE1hdGNoID0gZnVuY3Rpb24gKHZhbHVlLCByZWdleCkge1xuICAgIHZhciBfYTtcbiAgICB2YXIgcG9zaXRpb24gPSAwO1xuICAgIHZhciBsYXN0TWF0Y2g7XG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHZhbHVlLnN1YnN0cmluZyhwb3NpdGlvbikubWF0Y2gocmVnZXgpO1xuICAgICAgICBpZiAoIW1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2g6IGxhc3RNYXRjaCwgcG9zOiBwb3NpdGlvbiB9O1xuICAgICAgICBsYXN0TWF0Y2ggPSBtYXRjaDtcbiAgICAgICAgcG9zaXRpb24gKz0gKChfYSA9IG1hdGNoLmluZGV4KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwKSArIG1hdGNoWzBdLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHsgbWF0Y2g6IGxhc3RNYXRjaCwgcG9zOiBwb3NpdGlvbiB9O1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ3MuanMubWFwIiwiaW1wb3J0IHsgdG9IZXhTdHJpbmcgfSBmcm9tIFwiLi9zdHJpbmdzXCI7XG4vKipcbiAqIEVuY29kZXMgYSBzdHJpbmcgdG8gVVRGLTguXG4gKlxuICogQHBhcmFtIGlucHV0IFRoZSBzdHJpbmcgdG8gYmUgZW5jb2RlZC5cbiAqIEBwYXJhbSBieXRlT3JkZXJNYXJrIFdoZXRoZXIgb3Igbm90IGEgYnl0ZSBvcmRlciBtYXJrZXIgKEJPTSkgc2hvdWxkIGJlIGFkZGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgc3RhcnQgb2YgdGhlIGVuY29kaW5nLiAoZGVmYXVsdCBgdHJ1ZWApXG4gKiBAcmV0dXJucyBBIFVpbnQ4QXJyYXkgY29udGFpbmluZyB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIEphdmFTY3JpcHQgc3RyaW5ncyBhcmUgY29tcG9zZWQgb2YgVW5pY29kZSBjb2RlIHBvaW50cy4gQ29kZSBwb2ludHMgYXJlXG4gKiBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMCB0byAxLDExNCwxMTEgKDB4MTBGRkZGKS4gV2hlbiBzZXJpYWxpemluZyBhIHN0cmluZyxcbiAqIGl0IG11c3QgYmUgZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIHdvcmRzLiBBIHdvcmQgaXMgdHlwaWNhbGx5IDgsIDE2LCBvciAzMlxuICogYnl0ZXMgaW4gc2l6ZS4gQXMgc3VjaCwgVW5pY29kZSBkZWZpbmVzIHRocmVlIGVuY29kaW5nIGZvcm1zOiBVVEYtOCwgVVRGLTE2LFxuICogYW5kIFVURi0zMi4gVGhlc2UgZW5jb2RpbmcgZm9ybXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgVW5pY29kZSBzdGFuZGFyZCBbMV0uXG4gKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIFVURi04IGVuY29kaW5nIGZvcm0uXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBJbiBVVEYtOCwgZWFjaCBjb2RlIHBvaW50IGlzIG1hcHBlZCB0byBhIHNlcXVlbmNlIG9mIDEsIDIsIDMsIG9yIDQgYnl0ZXMuXG4gKiBOb3RlIHRoYXQgdGhlIGxvZ2ljIHdoaWNoIGRlZmluZXMgdGhpcyBtYXBwaW5nIGlzIHNsaWdodGx5IGNvbnZvbHV0ZWQsIGFuZFxuICogbm90IGFzIHN0cmFpZ2h0Zm9yd2FyZCBhcyB0aGUgbWFwcGluZyBsb2dpYyBmb3IgVVRGLTE2IG9yIFVURi0zMi4gVGhlIFVURi04XG4gKiBtYXBwaW5nIGxvZ2ljIGlzIGFzIGZvbGxvd3MgWzJdOlxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMDAwMC4uVSswMDdGLCB0aGVuIHZpZXcgaXQgYXMgYSA3LWJpdFxuICogICBpbnRlZ2VyOiAwYnh4eHh4eHguIE1hcCB0aGUgY29kZSBwb2ludCB0byAxIGJ5dGUgd2l0aCB0aGUgZmlyc3QgaGlnaCBvcmRlclxuICogICBiaXQgc2V0IHRvIDA6XG4gKlxuICogICAgICAgYjE9MGIweHh4eHh4eFxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMDA4MC4uVSswN0ZGLCB0aGVuIHZpZXcgaXQgYXMgYW4gMTEtYml0XG4gKiAgIGludGVnZXI6IDBieXl5eXl4eHh4eHguIE1hcCB0aGUgY29kZSBwb2ludCB0byAyIGJ5dGVzIHdpdGggdGhlIGZpcnN0IDUgYml0c1xuICogICBvZiB0aGUgY29kZSBwb2ludCBzdG9yZWQgaW4gdGhlIGZpcnN0IGJ5dGUsIGFuZCB0aGUgbGFzdCA2IGJpdHMgc3RvcmVkIGluXG4gKiAgIHRoZSBzZWNvbmQgYnl0ZTpcbiAqXG4gKiAgICAgICBiMT0wYjExMHl5eXl5ICAgIGIyPTBiMTB4eHh4eHhcbiAqXG4gKiDigKIgSWYgYSBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVKzA4MDAuLlUrRkZGRiwgdGhlbiB2aWV3IGl0IGFzIGEgMTYtYml0XG4gKiAgIGludGVnZXIsIDBienp6enl5eXl5eXh4eHh4eC4gTWFwIHRoZSBjb2RlIHBvaW50IHRvIDMgYnl0ZXMgd2l0aCB0aGUgZmlyc3RcbiAqICAgNCBiaXRzIHN0b3JlZCBpbiB0aGUgZmlyc3QgYnl0ZSwgdGhlIG5leHQgNiBiaXRzIHN0b3JlZCBpbiB0aGUgc2Vjb25kIGJ5dGUsXG4gKiAgIGFuZCB0aGUgbGFzdCA2IGJpdHMgaW4gdGhlIHRoaXJkIGJ5dGU6XG4gKlxuICogICAgICAgYjE9MGIxMTEwenp6eiAgICBiMj0wYjEweXl5eXl5ICAgIGIzPTBiMTB4eHh4eHhcbiAqXG4gKiDigKIgSWYgYSBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVKzEwMDAwLi4uVSsxMEZGRkYsIHRoZW4gdmlldyBpdCBhcyBhXG4gKiAgIDIxLWJpdCBpbnRlZ2VyLCAwYnZ2dnp6enp6enl5eXl5eXh4eHh4eC4gTWFwIHRoZSBjb2RlIHBvaW50IHRvIDQgYnl0ZXMgd2l0aFxuICogICB0aGUgZmlyc3QgMyBiaXRzIHN0b3JlZCBpbiB0aGUgZmlyc3QgYnl0ZSwgdGhlIG5leHQgNiBiaXRzIHN0b3JlZCBpbiB0aGVcbiAqICAgc2Vjb25kIGJ5dGUsIHRoZSBuZXh0IDYgYml0cyBzdG9yZWQgaW4gdGhlIHRoaXJkIGJ5dGUsIGFuZCB0aGUgbGFzdCA2IGJpdHNcbiAqICAgc3RvcmVkIGluIHRoZSBmb3VydGggYnl0ZTpcbiAqXG4gKiAgICAgICBiMT0wYjExMTEweHh4ICAgIGIyPTBiMTB6enp6enogICAgYjM9MGIxMHl5eXl5eSAgICBiND0wYjEweHh4eHh4XG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSwgd2hlbiBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgY29kZSBwb2ludHMgb2YgYSBzdHJpbmdcbiAqIGluIEphdmFTY3JpcHQsIHRoYXQgaWYgYSBjaGFyYWN0ZXIgaXMgZW5jb2RlZCBhcyBhIHN1cnJvZ2F0ZSBwYWlyIGl0IHdpbGxcbiAqIGluY3JlYXNlIHRoZSBzdHJpbmcncyBsZW5ndGggYnkgMiBpbnN0ZWFkIG9mIDEgWzRdLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBcbiAqID4gJ2EnLmxlbmd0aFxuICogMVxuICogPiAn8J+SqScubGVuZ3RoXG4gKiAyXG4gKiA+ICfoqp4nLmxlbmd0aFxuICogMVxuICogPiAnYfCfkqnoqp4nLmxlbmd0aFxuICogNFxuICogYGBgXG4gKlxuICogVGhlIHJlc3VsdHMgb2YgdGhlIGFib3ZlIGV4YW1wbGUgYXJlIGV4cGxhaW5lZCBieSB0aGUgZmFjdCB0aGF0IHRoZVxuICogY2hhcmFjdGVycyAnYScgYW5kICfoqp4nIGFyZSBub3QgcmVwcmVzZW50ZWQgYnkgc3Vycm9nYXRlIHBhaXJzLCBidXQgJ/CfkqknIGlzLlxuICpcbiAqIEJlY2F1c2Ugb2YgdGhpcyBpZGlvc3luY3Jhc3kgaW4gSmF2YVNjcmlwdCdzIHN0cmluZyBpbXBsZW1lbnRhdGlvbiBhbmQgQVBJcyxcbiAqIHdlIG11c3QgXCJqdW1wXCIgYW4gZXh0cmEgaW5kZXggYWZ0ZXIgZW5jb2RpbmcgYSBjaGFyYWN0ZXIgYXMgYSBzdXJyb2dhdGVcbiAqIHBhaXIuIEluIHByYWN0aWNlLCB0aGlzIG1lYW5zIHdlIG11c3QgaW5jcmVtZW50IHRoZSBpbmRleCBvZiBvdXIgZm9yIGxvb3AgYnlcbiAqIDIgaWYgd2UgZW5jb2RlIGEgc3Vycm9nYXRlIHBhaXIsIGFuZCAxIGluIGFsbCBvdGhlciBjYXNlcy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiAgIC0gWzFdIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL3ZlcnNpb25zL1VuaWNvZGUxMi4wLjAvVW5pY29kZVN0YW5kYXJkLTEyLjAucGRmXG4gKiAgICAgICAgIDMuOSAgVW5pY29kZSBFbmNvZGluZyBGb3JtcyAtIFVURi04XG4gKiAgIC0gWzJdIGh0dHA6Ly93d3cuaGVyb25neWFuZy5jb20vVW5pY29kZS9VVEYtOC1VVEYtOC1FbmNvZGluZy5odG1sXG4gKiAgIC0gWzNdIGh0dHA6Ly93d3cuaGVyb25neWFuZy5jb20vVW5pY29kZS9VVEYtOC1VVEYtOC1FbmNvZGluZy1BbGdvcml0aG0uaHRtbFxuICogICAtIFs0XSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvbGVuZ3RoI0Rlc2NyaXB0aW9uXG4gKlxuICovXG5leHBvcnQgdmFyIHV0ZjhFbmNvZGUgPSBmdW5jdGlvbiAoaW5wdXQsIGJ5dGVPcmRlck1hcmspIHtcbiAgICBpZiAoYnl0ZU9yZGVyTWFyayA9PT0gdm9pZCAwKSB7IGJ5dGVPcmRlck1hcmsgPSB0cnVlOyB9XG4gICAgdmFyIGVuY29kZWQgPSBbXTtcbiAgICBpZiAoYnl0ZU9yZGVyTWFyaylcbiAgICAgICAgZW5jb2RlZC5wdXNoKDB4ZWYsIDB4YmIsIDB4YmYpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGlucHV0Lmxlbmd0aDsgaWR4IDwgbGVuOykge1xuICAgICAgICB2YXIgY29kZVBvaW50ID0gaW5wdXQuY29kZVBvaW50QXQoaWR4KTtcbiAgICAgICAgLy8gT25lIGJ5dGUgZW5jb2RpbmdcbiAgICAgICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgICAgICAgIHZhciBieXRlMSA9IGNvZGVQb2ludCAmIDB4N2Y7XG4gICAgICAgICAgICBlbmNvZGVkLnB1c2goYnl0ZTEpO1xuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHdvIGJ5dGUgZW5jb2RpbmdcbiAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDwgMHgwODAwKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZTEgPSAoKGNvZGVQb2ludCA+PiA2KSAmIDB4MWYpIHwgMHhjMDtcbiAgICAgICAgICAgIHZhciBieXRlMiA9IChjb2RlUG9pbnQgJiAweDNmKSB8IDB4ODA7XG4gICAgICAgICAgICBlbmNvZGVkLnB1c2goYnl0ZTEsIGJ5dGUyKTtcbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRocmVlIGJ5dGUgZW5jb2RpbmdcbiAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDwgMHgwMTAwMDApIHtcbiAgICAgICAgICAgIHZhciBieXRlMSA9ICgoY29kZVBvaW50ID4+IDEyKSAmIDB4MGYpIHwgMHhlMDtcbiAgICAgICAgICAgIHZhciBieXRlMiA9ICgoY29kZVBvaW50ID4+IDYpICYgMHgzZikgfCAweDgwO1xuICAgICAgICAgICAgdmFyIGJ5dGUzID0gKGNvZGVQb2ludCAmIDB4M2YpIHwgMHg4MDtcbiAgICAgICAgICAgIGVuY29kZWQucHVzaChieXRlMSwgYnl0ZTIsIGJ5dGUzKTtcbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvdXIgYnl0ZSBlbmNvZGluZyAoc3Vycm9nYXRlIHBhaXIpXG4gICAgICAgIGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZTEgPSAoKGNvZGVQb2ludCA+PiAxOCkgJiAweDA3KSB8IDB4ZjA7XG4gICAgICAgICAgICB2YXIgYnl0ZTIgPSAoKGNvZGVQb2ludCA+PiAxMikgJiAweDNmKSB8IDB4ODA7XG4gICAgICAgICAgICB2YXIgYnl0ZTMgPSAoKGNvZGVQb2ludCA+PiA2KSAmIDB4M2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHZhciBieXRlNCA9ICgoY29kZVBvaW50ID4+IDApICYgMHgzZikgfCAweDgwO1xuICAgICAgICAgICAgZW5jb2RlZC5wdXNoKGJ5dGUxLCBieXRlMiwgYnl0ZTMsIGJ5dGU0KTtcbiAgICAgICAgICAgIGlkeCArPSAyO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciByZWFjaCB0aGlzIGNhc2VcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjb2RlIHBvaW50OiAweFwiICsgdG9IZXhTdHJpbmcoY29kZVBvaW50KSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShlbmNvZGVkKTtcbn07XG4vKipcbiAqIEVuY29kZXMgYSBzdHJpbmcgdG8gVVRGLTE2LlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyaW5nIHRvIGJlIGVuY29kZWQuXG4gKiBAcGFyYW0gYnl0ZU9yZGVyTWFyayBXaGV0aGVyIG9yIG5vdCBhIGJ5dGUgb3JkZXIgbWFya2VyIChCT00pIHNob3VsZCBiZSBhZGRlZFxuICogICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBlbmNvZGluZy4gKGRlZmF1bHQgYHRydWVgKVxuICogQHJldHVybnMgQSBVaW50MTZBcnJheSBjb250YWluaW5nIHRoZSBVVEYtMTYgZW5jb2Rpbmcgb2YgdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIEphdmFTY3JpcHQgc3RyaW5ncyBhcmUgY29tcG9zZWQgb2YgVW5pY29kZSBjb2RlIHBvaW50cy4gQ29kZSBwb2ludHMgYXJlXG4gKiBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMCB0byAxLDExNCwxMTEgKDB4MTBGRkZGKS4gV2hlbiBzZXJpYWxpemluZyBhIHN0cmluZyxcbiAqIGl0IG11c3QgYmUgZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIHdvcmRzLiBBIHdvcmQgaXMgdHlwaWNhbGx5IDgsIDE2LCBvciAzMlxuICogYnl0ZXMgaW4gc2l6ZS4gQXMgc3VjaCwgVW5pY29kZSBkZWZpbmVzIHRocmVlIGVuY29kaW5nIGZvcm1zOiBVVEYtOCwgVVRGLTE2LFxuICogYW5kIFVURi0zMi4gVGhlc2UgZW5jb2RpbmcgZm9ybXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgVW5pY29kZSBzdGFuZGFyZCBbMV0uXG4gKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIFVURi0xNiBlbmNvZGluZyBmb3JtLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSW4gVVRGLTE2LCBlYWNoIGNvZGUgcG9pbnQgaXMgbWFwcGVkIHRvIG9uZSBvciB0d28gMTYtYml0IGludGVnZXJzLiBUaGVcbiAqIFVURi0xNiBtYXBwaW5nIGxvZ2ljIGlzIGFzIGZvbGxvd3MgWzJdOlxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMDAwMC4uVStGRkZGLCB0aGVuIG1hcCB0aGUgY29kZSBwb2ludCB0b1xuICogICBhIDE2LWJpdCBpbnRlZ2VyIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdC5cbiAqXG4gKiDigKIgSWYgYSBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVKzEwMDAwLi5VKzEwMDAwLCB0aGVuIG1hcCB0aGUgY29kZSBwb2ludFxuICogICB0byB0d28gMTYtYml0IGludGVnZXJzLiBUaGUgZmlyc3QgaW50ZWdlciBzaG91bGQgY29udGFpbiB0aGUgaGlnaCBzdXJyb2dhdGVcbiAqICAgYW5kIHRoZSBzZWNvbmQgaW50ZWdlciBzaG91bGQgY29udGFpbiB0aGUgbG93IHN1cnJvZ2F0ZS4gQm90aCBzdXJyb2dhdGVzXG4gKiAgIHNob3VsZCBiZSB3cml0dGVuIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdC5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIEl0IGlzIGltcG9ydGFudCB0byBub3RlLCB3aGVuIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBjb2RlIHBvaW50cyBvZiBhIHN0cmluZ1xuICogaW4gSmF2YVNjcmlwdCwgdGhhdCBpZiBhIGNoYXJhY3RlciBpcyBlbmNvZGVkIGFzIGEgc3Vycm9nYXRlIHBhaXIgaXQgd2lsbFxuICogaW5jcmVhc2UgdGhlIHN0cmluZydzIGxlbmd0aCBieSAyIGluc3RlYWQgb2YgMSBbNF0uIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYFxuICogPiAnYScubGVuZ3RoXG4gKiAxXG4gKiA+ICfwn5KpJy5sZW5ndGhcbiAqIDJcbiAqID4gJ+iqnicubGVuZ3RoXG4gKiAxXG4gKiA+ICdh8J+SqeiqnicubGVuZ3RoXG4gKiA0XG4gKiBgYGBcbiAqXG4gKiBUaGUgcmVzdWx0cyBvZiB0aGUgYWJvdmUgZXhhbXBsZSBhcmUgZXhwbGFpbmVkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlXG4gKiBjaGFyYWN0ZXJzICdhJyBhbmQgJ+iqnicgYXJlIG5vdCByZXByZXNlbnRlZCBieSBzdXJyb2dhdGUgcGFpcnMsIGJ1dCAn8J+SqScgaXMuXG4gKlxuICogQmVjYXVzZSBvZiB0aGlzIGlkaW9zeW5jcmFzeSBpbiBKYXZhU2NyaXB0J3Mgc3RyaW5nIGltcGxlbWVudGF0aW9uIGFuZCBBUElzLFxuICogd2UgbXVzdCBcImp1bXBcIiBhbiBleHRyYSBpbmRleCBhZnRlciBlbmNvZGluZyBhIGNoYXJhY3RlciBhcyBhIHN1cnJvZ2F0ZVxuICogcGFpci4gSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgd2UgbXVzdCBpbmNyZW1lbnQgdGhlIGluZGV4IG9mIG91ciBmb3IgbG9vcCBieVxuICogMiBpZiB3ZSBlbmNvZGUgYSBzdXJyb2dhdGUgcGFpciwgYW5kIDEgaW4gYWxsIG90aGVyIGNhc2VzLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogUmVmZXJlbmNlczpcbiAqICAgLSBbMV0gaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTEyLjAuMC9Vbmljb2RlU3RhbmRhcmQtMTIuMC5wZGZcbiAqICAgICAgICAgMy45ICBVbmljb2RlIEVuY29kaW5nIEZvcm1zIC0gVVRGLThcbiAqICAgLSBbMl0gaHR0cDovL3d3dy5oZXJvbmd5YW5nLmNvbS9Vbmljb2RlL1VURi0xNi1VVEYtMTYtRW5jb2RpbmcuaHRtbFxuICogICAtIFszXSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvbGVuZ3RoI0Rlc2NyaXB0aW9uXG4gKlxuICovXG5leHBvcnQgdmFyIHV0ZjE2RW5jb2RlID0gZnVuY3Rpb24gKGlucHV0LCBieXRlT3JkZXJNYXJrKSB7XG4gICAgaWYgKGJ5dGVPcmRlck1hcmsgPT09IHZvaWQgMCkgeyBieXRlT3JkZXJNYXJrID0gdHJ1ZTsgfVxuICAgIHZhciBlbmNvZGVkID0gW107XG4gICAgaWYgKGJ5dGVPcmRlck1hcmspXG4gICAgICAgIGVuY29kZWQucHVzaCgweGZlZmYpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGlucHV0Lmxlbmd0aDsgaWR4IDwgbGVuOykge1xuICAgICAgICB2YXIgY29kZVBvaW50ID0gaW5wdXQuY29kZVBvaW50QXQoaWR4KTtcbiAgICAgICAgLy8gVHdvIGJ5dGUgZW5jb2RpbmdcbiAgICAgICAgaWYgKGNvZGVQb2ludCA8IDB4MDEwMDAwKSB7XG4gICAgICAgICAgICBlbmNvZGVkLnB1c2goY29kZVBvaW50KTtcbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvdXIgYnl0ZSBlbmNvZGluZyAoc3Vycm9nYXRlIHBhaXIpXG4gICAgICAgIGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICBlbmNvZGVkLnB1c2goaGlnaFN1cnJvZ2F0ZShjb2RlUG9pbnQpLCBsb3dTdXJyb2dhdGUoY29kZVBvaW50KSk7XG4gICAgICAgICAgICBpZHggKz0gMjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBjYXNlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29kZSBwb2ludDogMHhcIiArIHRvSGV4U3RyaW5nKGNvZGVQb2ludCkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQxNkFycmF5KGVuY29kZWQpO1xufTtcbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGBjb2RlUG9pbnRgIGlzIHdpdGhpbiB0aGVcbiAqIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKS4gQ29kZSBwb2ludHMgaW5zaWRlIHRoZSBCTVAgYXJlIG5vdCBlbmNvZGVkXG4gKiB3aXRoIHN1cnJvZ2F0ZSBwYWlycy5cbiAqIEBwYXJhbSBjb2RlUG9pbnQgVGhlIGNvZGUgcG9pbnQgdG8gYmUgZXZhbHVhdGVkLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0Rlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCB2YXIgaXNXaXRoaW5CTVAgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuIGNvZGVQb2ludCA+PSAwICYmIGNvZGVQb2ludCA8PSAweGZmZmY7XG59O1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYGNvZGVQb2ludGAgaXMgdmFsaWQgYW5kIG11c3QgYmUgcmVwcmVzZW50ZWRcbiAqIHdpdGggYSBzdXJyb2dhdGUgcGFpciB3aGVuIGVuY29kZWQuXG4gKiBAcGFyYW0gY29kZVBvaW50IFRoZSBjb2RlIHBvaW50IHRvIGJlIGV2YWx1YXRlZC5cbiAqXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNEZXNjcmlwdGlvblxuICovXG5leHBvcnQgdmFyIGhhc1N1cnJvZ2F0ZXMgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuIGNvZGVQb2ludCA+PSAweDAxMDAwMCAmJiBjb2RlUG9pbnQgPD0gMHgxMGZmZmY7XG59O1xuLy8gRnJvbSBVbmljb2RlIDMuMCBzcGVjLCBzZWN0aW9uIDMuNzpcbi8vICAgaHR0cDovL3VuaWNvZGUub3JnL3ZlcnNpb25zL1VuaWNvZGUzLjAuMC9jaDAzLnBkZlxuZXhwb3J0IHZhciBoaWdoU3Vycm9nYXRlID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKChjb2RlUG9pbnQgLSAweDEwMDAwKSAvIDB4NDAwKSArIDB4ZDgwMDtcbn07XG4vLyBGcm9tIFVuaWNvZGUgMy4wIHNwZWMsIHNlY3Rpb24gMy43OlxuLy8gICBodHRwOi8vdW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTMuMC4wL2NoMDMucGRmXG5leHBvcnQgdmFyIGxvd1N1cnJvZ2F0ZSA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gKChjb2RlUG9pbnQgLSAweDEwMDAwKSAlIDB4NDAwKSArIDB4ZGMwMDtcbn07XG52YXIgQnl0ZU9yZGVyO1xuKGZ1bmN0aW9uIChCeXRlT3JkZXIpIHtcbiAgICBCeXRlT3JkZXJbXCJCaWdFbmRpYW5cIl0gPSBcIkJpZ0VuZGlhblwiO1xuICAgIEJ5dGVPcmRlcltcIkxpdHRsZUVuZGlhblwiXSA9IFwiTGl0dGxlRW5kaWFuXCI7XG59KShCeXRlT3JkZXIgfHwgKEJ5dGVPcmRlciA9IHt9KSk7XG52YXIgUkVQTEFDRU1FTlQgPSAn77+9Jy5jb2RlUG9pbnRBdCgwKTtcbi8qKlxuICogRGVjb2RlcyBhIFVpbnQ4QXJyYXkgb2YgZGF0YSB0byBhIHN0cmluZyB1c2luZyBVVEYtMTYuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gcmVjb3ZlciBmcm9tIGVycm9ub3VzIGlucHV0IGJ5XG4gKiBpbnNlcnRpbmcgdGhlIHJlcGxhY2VtZW50IGNoYXJhY3RlciAo77+9KSB0byBtYXJrIGludmFsaWQgY29kZSBwb2ludHNcbiAqIGFuZCBzdXJyb2dhdGUgcGFpcnMuXG4gKlxuICogQHBhcmFtIGlucHV0IEEgVWludDhBcnJheSBjb250YWluaW5nIFVURi0xNiBlbmNvZGVkIGRhdGFcbiAqIEBwYXJhbSBieXRlT3JkZXJNYXJrIFdoZXRoZXIgb3Igbm90IGEgYnl0ZSBvcmRlciBtYXJrZXIgKEJPTSkgc2hvdWxkIGJlIHJlYWRcbiAqICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBzdGFydCBvZiB0aGUgZW5jb2RpbmcuIChkZWZhdWx0IGB0cnVlYClcbiAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IHZhciB1dGYxNkRlY29kZSA9IGZ1bmN0aW9uIChpbnB1dCwgYnl0ZU9yZGVyTWFyaykge1xuICAgIGlmIChieXRlT3JkZXJNYXJrID09PSB2b2lkIDApIHsgYnl0ZU9yZGVyTWFyayA9IHRydWU7IH1cbiAgICAvLyBOZWVkIGF0IGxlYXN0IDIgYnl0ZXMgb2YgZGF0YSBpbiBVVEYtMTYgZW5jb2RpbmdzXG4gICAgaWYgKGlucHV0Lmxlbmd0aCA8PSAxKVxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoUkVQTEFDRU1FTlQpO1xuICAgIHZhciBieXRlT3JkZXIgPSBieXRlT3JkZXJNYXJrID8gcmVhZEJPTShpbnB1dCkgOiBCeXRlT3JkZXIuQmlnRW5kaWFuO1xuICAgIC8vIFNraXAgYnl0ZSBvcmRlciBtYXJrIGlmIG5lZWRlZFxuICAgIHZhciBpZHggPSBieXRlT3JkZXJNYXJrID8gMiA6IDA7XG4gICAgdmFyIGNvZGVQb2ludHMgPSBbXTtcbiAgICB3aGlsZSAoaW5wdXQubGVuZ3RoIC0gaWR4ID49IDIpIHtcbiAgICAgICAgdmFyIGZpcnN0ID0gZGVjb2RlVmFsdWVzKGlucHV0W2lkeCsrXSwgaW5wdXRbaWR4KytdLCBieXRlT3JkZXIpO1xuICAgICAgICBpZiAoaXNIaWdoU3Vycm9nYXRlKGZpcnN0KSkge1xuICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCAtIGlkeCA8IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBOZWVkIGF0IGxlYXN0IDIgYnl0ZXMgbGVmdCBmb3IgdGhlIGxvdyBzdXJyb2dhdGUgdGhhdCBpcyByZXF1aXJlZFxuICAgICAgICAgICAgICAgIGNvZGVQb2ludHMucHVzaChSRVBMQUNFTUVOVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kID0gZGVjb2RlVmFsdWVzKGlucHV0W2lkeCsrXSwgaW5wdXRbaWR4KytdLCBieXRlT3JkZXIpO1xuICAgICAgICAgICAgICAgIGlmIChpc0xvd1N1cnJvZ2F0ZShzZWNvbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVQb2ludHMucHVzaChmaXJzdCwgc2Vjb25kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvdyBzdXJyb2dhdGVzIHNob3VsZCBhbHdheXMgZm9sbG93IGhpZ2ggc3Vycm9nYXRlc1xuICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnRzLnB1c2goUkVQTEFDRU1FTlQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0xvd1N1cnJvZ2F0ZShmaXJzdCkpIHtcbiAgICAgICAgICAgIC8vIEhpZ2ggc3Vycm9nYXRlcyBzaG91bGQgYWx3YXlzIGNvbWUgZmlyc3Qgc2luY2UgYGRlY29kZVZhbHVlcygpYFxuICAgICAgICAgICAgLy8gYWNjb3VudHMgZm9yIHRoZSBieXRlIG9yZGVyaW5nXG4gICAgICAgICAgICBpZHggKz0gMjtcbiAgICAgICAgICAgIGNvZGVQb2ludHMucHVzaChSRVBMQUNFTUVOVCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb2RlUG9pbnRzLnB1c2goZmlyc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBleHRyYSBieXRlKHMpIGxlZnQgb3ZlclxuICAgIGlmIChpZHggPCBpbnB1dC5sZW5ndGgpXG4gICAgICAgIGNvZGVQb2ludHMucHVzaChSRVBMQUNFTUVOVCk7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KFN0cmluZywgY29kZVBvaW50cyk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYGNvZGVQb2ludGAgaXMgYSBoaWdoIHN1cnJvZ2F0ZS5cbiAqIEBwYXJhbSBjb2RlUG9pbnQgVGhlIGNvZGUgcG9pbnQgdG8gYmUgZXZhbHVhdGVkLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0Rlc2NyaXB0aW9uXG4gKi9cbnZhciBpc0hpZ2hTdXJyb2dhdGUgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuIGNvZGVQb2ludCA+PSAweGQ4MDAgJiYgY29kZVBvaW50IDw9IDB4ZGJmZjtcbn07XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBgY29kZVBvaW50YCBpcyBhIGxvdyBzdXJyb2dhdGUuXG4gKiBAcGFyYW0gY29kZVBvaW50IFRoZSBjb2RlIHBvaW50IHRvIGJlIGV2YWx1YXRlZC5cbiAqXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNEZXNjcmlwdGlvblxuICovXG52YXIgaXNMb3dTdXJyb2dhdGUgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuIGNvZGVQb2ludCA+PSAweGRjMDAgJiYgY29kZVBvaW50IDw9IDB4ZGZmZjtcbn07XG4vKipcbiAqIERlY29kZXMgdGhlIGdpdmVuIHV0Zi0xNiB2YWx1ZXMgZmlyc3QgYW5kIHNlY29uZCB1c2luZyB0aGUgc3BlY2lmaWVkXG4gKiBieXRlIG9yZGVyLlxuICogQHBhcmFtIGZpcnN0IFRoZSBmaXJzdCBieXRlIG9mIHRoZSBlbmNvZGluZy5cbiAqIEBwYXJhbSBzZWNvbmQgVGhlIHNlY29uZCBieXRlIG9mIHRoZSBlbmNvZGluZy5cbiAqIEBwYXJhbSBieXRlT3JkZXIgVGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGVuY29kaW5nLlxuICogUmVmZXJlbmNlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjRXhhbXBsZXNcbiAqL1xudmFyIGRlY29kZVZhbHVlcyA9IGZ1bmN0aW9uIChmaXJzdCwgc2Vjb25kLCBieXRlT3JkZXIpIHtcbiAgICAvLyBBcHBlbmQgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJlY2VkaW5nIGJ5dGUgYnkgc2hpZnRpbmcgdGhlXG4gICAgLy8gZmlyc3Qgb25lIDggdG8gdGhlIGxlZnQgYW5kIHRoYW4gYXBwbHlpbmcgYSBiaXR3aXNlIG9yLW9wZXJhdG9yIHRvIGFwcGVuZFxuICAgIC8vIHRoZSBzZWNvbmQgb25lLlxuICAgIGlmIChieXRlT3JkZXIgPT09IEJ5dGVPcmRlci5MaXR0bGVFbmRpYW4pXG4gICAgICAgIHJldHVybiAoc2Vjb25kIDw8IDgpIHwgZmlyc3Q7XG4gICAgaWYgKGJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkJpZ0VuZGlhbilcbiAgICAgICAgcmV0dXJuIChmaXJzdCA8PCA4KSB8IHNlY29uZDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJ5dGVPcmRlcjogXCIgKyBieXRlT3JkZXIpO1xufTtcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBhcnJheSBjb250YWlucyBhIGJ5dGUgb3JkZXIgbWFyayBmb3IgdGhlXG4gKiBVVEYtMTZCRSBvciBVVEYtMTZMRSBlbmNvZGluZy4gSWYgaXQgaGFzIG5laXRoZXIsIEJpZ0VuZGlhbiBpcyBhc3N1bWVkLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnl0ZV9vcmRlcl9tYXJrI1VURi0xNlxuICpcbiAqIEBwYXJhbSBieXRlcyBUaGUgYnl0ZSBhcnJheSB0byBiZSBldmFsdWF0ZWQuXG4gKi9cbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIHJlYWRCT00gPSBmdW5jdGlvbiAoYnl0ZXMpIHsgcmV0dXJuIChoYXNVdGYxNkJpZ0VuZGlhbkJPTShieXRlcykgPyBCeXRlT3JkZXIuQmlnRW5kaWFuXG4gICAgOiBoYXNVdGYxNkxpdHRsZUVuZGlhbkJPTShieXRlcykgPyBCeXRlT3JkZXIuTGl0dGxlRW5kaWFuXG4gICAgICAgIDogQnl0ZU9yZGVyLkJpZ0VuZGlhbik7IH07XG52YXIgaGFzVXRmMTZCaWdFbmRpYW5CT00gPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICByZXR1cm4gYnl0ZXNbMF0gPT09IDB4ZmUgJiYgYnl0ZXNbMV0gPT09IDB4ZmY7XG59O1xudmFyIGhhc1V0ZjE2TGl0dGxlRW5kaWFuQk9NID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGJ5dGVzWzBdID09PSAweGZmICYmIGJ5dGVzWzFdID09PSAweGZlO1xufTtcbmV4cG9ydCB2YXIgaGFzVXRmMTZCT00gPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICByZXR1cm4gaGFzVXRmMTZCaWdFbmRpYW5CT00oYnl0ZXMpIHx8IGhhc1V0ZjE2TGl0dGxlRW5kaWFuQk9NKGJ5dGVzKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmljb2RlLmpzLm1hcCIsIi8qIHRzbGludDpkaXNhYmxlOmJhbi10eXBlcyAqL1xuaW1wb3J0IHsgdmFsdWVzIGFzIG9iamVjdFZhbHVlcyB9IGZyb20gXCIuL29iamVjdHNcIjtcbmV4cG9ydCB2YXIgYmFja3RpY2sgPSBmdW5jdGlvbiAodmFsKSB7IHJldHVybiBcImBcIiArIHZhbCArIFwiYFwiOyB9O1xuZXhwb3J0IHZhciBzaW5nbGVRdW90ZSA9IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIFwiJ1wiICsgdmFsICsgXCInXCI7IH07XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBmb3JtYXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJylcbiAgICAgICAgcmV0dXJuIHNpbmdsZVF1b3RlKHZhbHVlKTtcbiAgICBlbHNlIGlmICh0eXBlID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIGJhY2t0aWNrKHZhbHVlKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbn07XG5leHBvcnQgdmFyIGNyZWF0ZVZhbHVlRXJyb3JNc2cgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgdmFsdWVzKSB7XG4gICAgdmFyIGFsbG93ZWRWYWx1ZXMgPSBuZXcgQXJyYXkodmFsdWVzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgdiA9IHZhbHVlc1tpZHhdO1xuICAgICAgICBhbGxvd2VkVmFsdWVzW2lkeF0gPSBmb3JtYXRWYWx1ZSh2KTtcbiAgICB9XG4gICAgdmFyIGpvaW5lZFZhbHVlcyA9IGFsbG93ZWRWYWx1ZXMuam9pbignIG9yICcpO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHJldHVybiBiYWNrdGljayh2YWx1ZU5hbWUpICsgXCIgbXVzdCBiZSBvbmUgb2YgXCIgKyBqb2luZWRWYWx1ZXMgKyBcIiwgYnV0IHdhcyBhY3R1YWxseSBcIiArIGZvcm1hdFZhbHVlKHZhbHVlKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydElzT25lT2YgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgYWxsb3dlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhbGxvd2VkVmFsdWVzKSkge1xuICAgICAgICBhbGxvd2VkVmFsdWVzID0gb2JqZWN0VmFsdWVzKGFsbG93ZWRWYWx1ZXMpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhbGxvd2VkVmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBpZiAodmFsdWUgPT09IGFsbG93ZWRWYWx1ZXNbaWR4XSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihjcmVhdGVWYWx1ZUVycm9yTXNnKHZhbHVlLCB2YWx1ZU5hbWUsIGFsbG93ZWRWYWx1ZXMpKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCBhbGxvd2VkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFsbG93ZWRWYWx1ZXMpKSB7XG4gICAgICAgIGFsbG93ZWRWYWx1ZXMgPSBvYmplY3RWYWx1ZXMoYWxsb3dlZFZhbHVlcyk7XG4gICAgfVxuICAgIGFzc2VydElzT25lT2YodmFsdWUsIHZhbHVlTmFtZSwgYWxsb3dlZFZhbHVlcy5jb25jYXQodW5kZWZpbmVkKSk7XG59O1xuZXhwb3J0IHZhciBhc3NlcnRJc1N1YnNldCA9IGZ1bmN0aW9uICh2YWx1ZXMsIHZhbHVlTmFtZSwgYWxsb3dlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhbGxvd2VkVmFsdWVzKSkge1xuICAgICAgICBhbGxvd2VkVmFsdWVzID0gb2JqZWN0VmFsdWVzKGFsbG93ZWRWYWx1ZXMpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGFzc2VydElzT25lT2YodmFsdWVzW2lkeF0sIHZhbHVlTmFtZSwgYWxsb3dlZFZhbHVlcyk7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgZ2V0VHlwZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICBpZiAodmFsID09PSBudWxsKVxuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIGlmIChpc05hTih2YWwpKVxuICAgICAgICByZXR1cm4gJ05hTic7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJylcbiAgICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N5bWJvbCcpXG4gICAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2JpZ2ludCcpXG4gICAgICAgIHJldHVybiAnYmlnaW50JztcbiAgICBpZiAodmFsLmNvbnN0cnVjdG9yICYmIHZhbC5jb25zdHJ1Y3Rvci5uYW1lKVxuICAgICAgICByZXR1cm4gdmFsLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgaWYgKHZhbC5uYW1lKVxuICAgICAgICByZXR1cm4gdmFsLm5hbWU7XG4gICAgaWYgKHZhbC5jb25zdHJ1Y3RvcilcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWwuY29uc3RydWN0b3IpO1xuICAgIHJldHVybiBTdHJpbmcodmFsKTtcbn07XG5leHBvcnQgdmFyIGlzVHlwZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdHlwZSkge1xuICAgIGlmICh0eXBlID09PSAnbnVsbCcpXG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbDtcbiAgICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJylcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpO1xuICAgIGlmICh0eXBlID09PSAnYm9vbGVhbicpXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgICBpZiAodHlwZSA9PT0gJ3N5bWJvbCcpXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnO1xuICAgIGlmICh0eXBlID09PSAnYmlnaW50JylcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCc7XG4gICAgaWYgKHR5cGUgPT09IERhdGUpXG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgaWYgKHR5cGUgPT09IEFycmF5KVxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBBcnJheTtcbiAgICBpZiAodHlwZSA9PT0gVWludDhBcnJheSlcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheTtcbiAgICBpZiAodHlwZSA9PT0gQXJyYXlCdWZmZXIpXG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyO1xuICAgIGlmICh0eXBlID09PSBGdW5jdGlvbilcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgdHlwZVswXTtcbn07XG5leHBvcnQgdmFyIGNyZWF0ZVR5cGVFcnJvck1zZyA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCB0eXBlcykge1xuICAgIHZhciBhbGxvd2VkVHlwZXMgPSBuZXcgQXJyYXkodHlwZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0eXBlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIHR5cGUgPSB0eXBlc1tpZHhdO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ251bGwnKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnbnVsbCcpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCd1bmRlZmluZWQnKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnc3RyaW5nJyk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnbnVtYmVyJyk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ2Jvb2xlYW4nKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3N5bWJvbCcpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdzeW1ib2wnKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2JpZ2ludCcpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdiaWdpbnQnKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gQXJyYXkpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdBcnJheScpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBVaW50OEFycmF5KVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnVWludDhBcnJheScpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBBcnJheUJ1ZmZlcilcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ0FycmF5QnVmZmVyJyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2sodHlwZVsxXSk7XG4gICAgfVxuICAgIHZhciBqb2luZWRUeXBlcyA9IGFsbG93ZWRUeXBlcy5qb2luKCcgb3IgJyk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgcmV0dXJuIGJhY2t0aWNrKHZhbHVlTmFtZSkgKyBcIiBtdXN0IGJlIG9mIHR5cGUgXCIgKyBqb2luZWRUeXBlcyArIFwiLCBidXQgd2FzIGFjdHVhbGx5IG9mIHR5cGUgXCIgKyBiYWNrdGljayhnZXRUeXBlKHZhbHVlKSk7XG59O1xuZXhwb3J0IHZhciBhc3NlcnRJcyA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCB0eXBlcykge1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHR5cGVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBpZiAoaXNUeXBlKHZhbHVlLCB0eXBlc1tpZHhdKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihjcmVhdGVUeXBlRXJyb3JNc2codmFsdWUsIHZhbHVlTmFtZSwgdHlwZXMpKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydE9yVW5kZWZpbmVkID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIHR5cGVzKSB7XG4gICAgYXNzZXJ0SXModmFsdWUsIHZhbHVlTmFtZSwgdHlwZXMuY29uY2F0KCd1bmRlZmluZWQnKSk7XG59O1xuZXhwb3J0IHZhciBhc3NlcnRFYWNoSXMgPSBmdW5jdGlvbiAodmFsdWVzLCB2YWx1ZU5hbWUsIHR5cGVzKSB7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBhc3NlcnRJcyh2YWx1ZXNbaWR4XSwgdmFsdWVOYW1lLCB0eXBlcyk7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgYXNzZXJ0UmFuZ2UgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgbWluLCBtYXgpIHtcbiAgICBhc3NlcnRJcyh2YWx1ZSwgdmFsdWVOYW1lLCBbJ251bWJlciddKTtcbiAgICBhc3NlcnRJcyhtaW4sICdtaW4nLCBbJ251bWJlciddKTtcbiAgICBhc3NlcnRJcyhtYXgsICdtYXgnLCBbJ251bWJlciddKTtcbiAgICBtYXggPSBNYXRoLm1heChtaW4sIG1heCk7XG4gICAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYmFja3RpY2sodmFsdWVOYW1lKSArIFwiIG11c3QgYmUgYXQgbGVhc3QgXCIgKyBtaW4gKyBcIiBhbmQgYXQgbW9zdCBcIiArIG1heCArIFwiLCBidXQgd2FzIGFjdHVhbGx5IFwiICsgdmFsdWUpO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIGFzc2VydFJhbmdlT3JVbmRlZmluZWQgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgbWluLCBtYXgpIHtcbiAgICBhc3NlcnRJcyh2YWx1ZSwgdmFsdWVOYW1lLCBbJ251bWJlcicsICd1bmRlZmluZWQnXSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICAgIGFzc2VydFJhbmdlKHZhbHVlLCB2YWx1ZU5hbWUsIG1pbiwgbWF4KTtcbn07XG5leHBvcnQgdmFyIGFzc2VydE11bHRpcGxlID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIG11bHRpcGxpZXIpIHtcbiAgICBhc3NlcnRJcyh2YWx1ZSwgdmFsdWVOYW1lLCBbJ251bWJlciddKTtcbiAgICBpZiAodmFsdWUgJSBtdWx0aXBsaWVyICE9PSAwKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYmFja3RpY2sodmFsdWVOYW1lKSArIFwiIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBcIiArIG11bHRpcGxpZXIgKyBcIiwgYnV0IHdhcyBhY3R1YWxseSBcIiArIHZhbHVlKTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciBhc3NlcnRJbnRlZ2VyID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihiYWNrdGljayh2YWx1ZU5hbWUpICsgXCIgbXVzdCBiZSBhbiBpbnRlZ2VyLCBidXQgd2FzIGFjdHVhbGx5IFwiICsgdmFsdWUpO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIGFzc2VydFBvc2l0aXZlID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUpIHtcbiAgICBpZiAoIVsxLCAwXS5pbmNsdWRlcyhNYXRoLnNpZ24odmFsdWUpKSkge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJhY2t0aWNrKHZhbHVlTmFtZSkgKyBcIiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIDAsIGJ1dCB3YXMgYWN0dWFsbHkgXCIgKyB2YWx1ZSk7XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZhbGlkYXRvcnMuanMubWFwIiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY3JlYXRlQmluZGluZyhvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XHJcbiAgICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wicHJpbnRKU1wiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJwcmludEpTXCJdID0gZmFjdG9yeSgpO1xufSkod2luZG93LCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoe1xuXG4vKioqLyBcIi4vc3JjL2luZGV4LmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2luZGV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3Nhc3NfaW5kZXhfc2Nzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9zYXNzL2luZGV4LnNjc3MgKi8gXCIuL3NyYy9zYXNzL2luZGV4LnNjc3NcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3Nhc3NfaW5kZXhfc2Nzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9zYXNzX2luZGV4X3Njc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2pzX2luaXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vanMvaW5pdCAqLyBcIi4vc3JjL2pzL2luaXQuanNcIik7XG5cblxudmFyIHByaW50SlMgPSBfanNfaW5pdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5pbml0O1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93LnByaW50SlMgPSBwcmludEpTO1xufVxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHByaW50SlMpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9icm93c2VyLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvYnJvd3Nlci5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG52YXIgQnJvd3NlciA9IHtcbiAgLy8gRmlyZWZveCAxLjArXG4gIGlzRmlyZWZveDogZnVuY3Rpb24gaXNGaXJlZm94KCkge1xuICAgIHJldHVybiB0eXBlb2YgSW5zdGFsbFRyaWdnZXIgIT09ICd1bmRlZmluZWQnO1xuICB9LFxuICAvLyBJbnRlcm5ldCBFeHBsb3JlciA2LTExXG4gIGlzSUU6IGZ1bmN0aW9uIGlzSUUoKSB7XG4gICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTVNJRScpICE9PSAtMSB8fCAhIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcbiAgfSxcbiAgLy8gRWRnZSAyMCtcbiAgaXNFZGdlOiBmdW5jdGlvbiBpc0VkZ2UoKSB7XG4gICAgcmV0dXJuICFCcm93c2VyLmlzSUUoKSAmJiAhIXdpbmRvdy5TdHlsZU1lZGlhO1xuICB9LFxuICAvLyBDaHJvbWUgMStcbiAgaXNDaHJvbWU6IGZ1bmN0aW9uIGlzQ2hyb21lKCkge1xuICAgIHZhciBjb250ZXh0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB3aW5kb3c7XG4gICAgcmV0dXJuICEhY29udGV4dC5jaHJvbWU7XG4gIH0sXG4gIC8vIEF0IGxlYXN0IFNhZmFyaSAzKzogXCJbb2JqZWN0IEhUTUxFbGVtZW50Q29uc3RydWN0b3JdXCJcbiAgaXNTYWZhcmk6IGZ1bmN0aW9uIGlzU2FmYXJpKCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93LkhUTUxFbGVtZW50KS5pbmRleE9mKCdDb25zdHJ1Y3RvcicpID4gMCB8fCBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignc2FmYXJpJykgIT09IC0xO1xuICB9LFxuICAvLyBJT1MgQ2hyb21lXG4gIGlzSU9TQ2hyb21lOiBmdW5jdGlvbiBpc0lPU0Nocm9tZSgpIHtcbiAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2NyaW9zJykgIT09IC0xO1xuICB9XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChCcm93c2VyKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvZnVuY3Rpb25zLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9mdW5jdGlvbnMuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGFkZFdyYXBwZXIsIGNhcGl0YWxpemVQcmludCwgY29sbGVjdFN0eWxlcywgYWRkSGVhZGVyLCBjbGVhblVwLCBpc1Jhd0hUTUwgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYWRkV3JhcHBlclwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFkZFdyYXBwZXI7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImNhcGl0YWxpemVQcmludFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGNhcGl0YWxpemVQcmludDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiY29sbGVjdFN0eWxlc1wiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGNvbGxlY3RTdHlsZXM7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZEhlYWRlclwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFkZEhlYWRlcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiY2xlYW5VcFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGNsZWFuVXA7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImlzUmF3SFRNTFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGlzUmF3SFRNTDsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX21vZGFsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL21vZGFsICovIFwiLi9zcmMvanMvbW9kYWwuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYnJvd3NlciAqLyBcIi4vc3JjL2pzL2Jyb3dzZXIuanNcIik7XG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblxuXG5mdW5jdGlvbiBhZGRXcmFwcGVyKGh0bWxEYXRhLCBwYXJhbXMpIHtcbiAgdmFyIGJvZHlTdHlsZSA9ICdmb250LWZhbWlseTonICsgcGFyYW1zLmZvbnQgKyAnICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZTogJyArIHBhcmFtcy5mb250X3NpemUgKyAnICFpbXBvcnRhbnQ7IHdpZHRoOjEwMCU7JztcbiAgcmV0dXJuICc8ZGl2IHN0eWxlPVwiJyArIGJvZHlTdHlsZSArICdcIj4nICsgaHRtbERhdGEgKyAnPC9kaXY+Jztcbn1cbmZ1bmN0aW9uIGNhcGl0YWxpemVQcmludChvYmopIHtcbiAgcmV0dXJuIG9iai5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG9iai5zbGljZSgxKTtcbn1cbmZ1bmN0aW9uIGNvbGxlY3RTdHlsZXMoZWxlbWVudCwgcGFyYW1zKSB7XG4gIHZhciB3aW4gPSBkb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IC8vIFN0cmluZyB2YXJpYWJsZSB0byBob2xkIHN0eWxpbmcgZm9yIGVhY2ggZWxlbWVudFxuXG4gIHZhciBlbGVtZW50U3R5bGUgPSAnJzsgLy8gTG9vcCBvdmVyIGNvbXB1dGVkIHN0eWxlc1xuXG4gIHZhciBzdHlsZXMgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCAnJyk7XG5cbiAgZm9yICh2YXIga2V5ID0gMDsga2V5IDwgc3R5bGVzLmxlbmd0aDsga2V5KyspIHtcbiAgICAvLyBDaGVjayBpZiBzdHlsZSBzaG91bGQgYmUgcHJvY2Vzc2VkXG4gICAgaWYgKHBhcmFtcy50YXJnZXRTdHlsZXMuaW5kZXhPZignKicpICE9PSAtMSB8fCBwYXJhbXMudGFyZ2V0U3R5bGUuaW5kZXhPZihzdHlsZXNba2V5XSkgIT09IC0xIHx8IHRhcmdldFN0eWxlc01hdGNoKHBhcmFtcy50YXJnZXRTdHlsZXMsIHN0eWxlc1trZXldKSkge1xuICAgICAgaWYgKHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlc1trZXldKSkgZWxlbWVudFN0eWxlICs9IHN0eWxlc1trZXldICsgJzonICsgc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGVzW2tleV0pICsgJzsnO1xuICAgIH1cbiAgfSAvLyBQcmludCBmcmllbmRseSBkZWZhdWx0cyAoZGVwcmVjYXRlZClcblxuXG4gIGVsZW1lbnRTdHlsZSArPSAnbWF4LXdpZHRoOiAnICsgcGFyYW1zLm1heFdpZHRoICsgJ3B4ICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZTogJyArIHBhcmFtcy5mb250X3NpemUgKyAnICFpbXBvcnRhbnQ7JztcbiAgcmV0dXJuIGVsZW1lbnRTdHlsZTtcbn1cblxuZnVuY3Rpb24gdGFyZ2V0U3R5bGVzTWF0Y2goc3R5bGVzLCB2YWx1ZSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuaW5kZXhPZihzdHlsZXNbaV0pICE9PSAtMSkgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFkZEhlYWRlcihwcmludEVsZW1lbnQsIHBhcmFtcykge1xuICAvLyBDcmVhdGUgdGhlIGhlYWRlciBjb250YWluZXIgZGl2XG4gIHZhciBoZWFkZXJDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgLy8gQ2hlY2sgaWYgdGhlIGhlYWRlciBpcyB0ZXh0IG9yIHJhdyBodG1sXG5cbiAgaWYgKGlzUmF3SFRNTChwYXJhbXMuaGVhZGVyKSkge1xuICAgIGhlYWRlckNvbnRhaW5lci5pbm5lckhUTUwgPSBwYXJhbXMuaGVhZGVyO1xuICB9IGVsc2Uge1xuICAgIC8vIENyZWF0ZSBoZWFkZXIgZWxlbWVudFxuICAgIHZhciBoZWFkZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDEnKTsgLy8gQ3JlYXRlIGhlYWRlciB0ZXh0IG5vZGVcblxuICAgIHZhciBoZWFkZXJOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFyYW1zLmhlYWRlcik7IC8vIEJ1aWxkIGFuZCBzdHlsZVxuXG4gICAgaGVhZGVyRWxlbWVudC5hcHBlbmRDaGlsZChoZWFkZXJOb2RlKTtcbiAgICBoZWFkZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBwYXJhbXMuaGVhZGVyU3R5bGUpO1xuICAgIGhlYWRlckNvbnRhaW5lci5hcHBlbmRDaGlsZChoZWFkZXJFbGVtZW50KTtcbiAgfVxuXG4gIHByaW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaGVhZGVyQ29udGFpbmVyLCBwcmludEVsZW1lbnQuY2hpbGROb2Rlc1swXSk7XG59XG5mdW5jdGlvbiBjbGVhblVwKHBhcmFtcykge1xuICAvLyBJZiB3ZSBhcmUgc2hvd2luZyBhIGZlZWRiYWNrIG1lc3NhZ2UgdG8gdXNlciwgcmVtb3ZlIGl0XG4gIGlmIChwYXJhbXMuc2hvd01vZGFsKSBfbW9kYWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uY2xvc2UoKTsgLy8gQ2hlY2sgZm9yIGEgZmluaXNoZWQgbG9hZGluZyBob29rIGZ1bmN0aW9uXG5cbiAgaWYgKHBhcmFtcy5vbkxvYWRpbmdFbmQpIHBhcmFtcy5vbkxvYWRpbmdFbmQoKTsgLy8gSWYgcHJlbG9hZGluZyBwZGYgZmlsZXMsIGNsZWFuIGJsb2IgdXJsXG5cbiAgaWYgKHBhcmFtcy5zaG93TW9kYWwgfHwgcGFyYW1zLm9uTG9hZGluZ1N0YXJ0KSB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTChwYXJhbXMucHJpbnRhYmxlKTsgLy8gUnVuIG9uUHJpbnREaWFsb2dDbG9zZSBjYWxsYmFja1xuXG4gIHZhciBldmVudCA9ICdtb3VzZW92ZXInO1xuXG4gIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5pc0Nocm9tZSgpIHx8IF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLmlzRmlyZWZveCgpKSB7XG4gICAgLy8gUHMuOiBGaXJlZm94IHdpbGwgcmVxdWlyZSBhbiBleHRyYSBjbGljayBpbiB0aGUgZG9jdW1lbnQgdG8gZmlyZSB0aGUgZm9jdXMgZXZlbnQuXG4gICAgZXZlbnQgPSAnZm9jdXMnO1xuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgZXZlbnQgb25seSBoYXBwZW5zIG9uY2UuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgIHBhcmFtcy5vblByaW50RGlhbG9nQ2xvc2UoKTsgLy8gUmVtb3ZlIGlmcmFtZSBmcm9tIHRoZSBET01cblxuICAgIHZhciBpZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJhbXMuZnJhbWVJZCk7XG5cbiAgICBpZiAoaWZyYW1lKSB7XG4gICAgICBpZnJhbWUucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbn1cbmZ1bmN0aW9uIGlzUmF3SFRNTChyYXcpIHtcbiAgdmFyIHJlZ2V4SHRtbCA9IG5ldyBSZWdFeHAoJzwoW0EtWmEtel1bQS1aYS16MC05XSopXFxcXGJbXj5dKj4oLio/KTwvXFxcXDE+Jyk7XG4gIHJldHVybiByZWdleEh0bWwudGVzdChyYXcpO1xufVxuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9odG1sLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvaHRtbC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9mdW5jdGlvbnMgKi8gXCIuL3NyYy9qcy9mdW5jdGlvbnMuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3ByaW50ICovIFwiLi9zcmMvanMvcHJpbnQuanNcIik7XG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHtcbiAgcHJpbnQ6IGZ1bmN0aW9uIHByaW50KHBhcmFtcywgcHJpbnRGcmFtZSkge1xuICAgIC8vIEdldCB0aGUgRE9NIHByaW50YWJsZSBlbGVtZW50XG4gICAgdmFyIHByaW50RWxlbWVudCA9IGlzSHRtbEVsZW1lbnQocGFyYW1zLnByaW50YWJsZSkgPyBwYXJhbXMucHJpbnRhYmxlIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1zLnByaW50YWJsZSk7IC8vIENoZWNrIGlmIHRoZSBlbGVtZW50IGV4aXN0c1xuXG4gICAgaWYgKCFwcmludEVsZW1lbnQpIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLmVycm9yKCdJbnZhbGlkIEhUTUwgZWxlbWVudCBpZDogJyArIHBhcmFtcy5wcmludGFibGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gQ2xvbmUgdGhlIHRhcmdldCBlbGVtZW50IGluY2x1ZGluZyBpdHMgY2hpbGRyZW4gKGlmIGF2YWlsYWJsZSlcblxuXG4gICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQocHJpbnRFbGVtZW50LCBwYXJhbXMpOyAvLyBBZGQgaGVhZGVyXG5cbiAgICBpZiAocGFyYW1zLmhlYWRlcikge1xuICAgICAgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImFkZEhlYWRlclwiXSkocGFyYW1zLnByaW50YWJsZUVsZW1lbnQsIHBhcmFtcyk7XG4gICAgfSAvLyBQcmludCBodG1sIGVsZW1lbnQgY29udGVudHNcblxuXG4gICAgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLnNlbmQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBwYXJhbXMpIHtcbiAgLy8gQ2xvbmUgdGhlIG1haW4gbm9kZSAoaWYgbm90IGFscmVhZHkgaW5zaWRlIHRoZSByZWN1cnNpb24gcHJvY2VzcylcbiAgdmFyIGNsb25lID0gZWxlbWVudC5jbG9uZU5vZGUoKTsgLy8gTG9vcCBvdmVyIGFuZCBwcm9jZXNzIHRoZSBjaGlsZHJlbiBlbGVtZW50cyAvIG5vZGVzIChpbmNsdWRpbmcgdGV4dCBub2RlcylcblxuICB2YXIgY2hpbGROb2Rlc0FycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZWxlbWVudC5jaGlsZE5vZGVzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkTm9kZXNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgIC8vIENoZWNrIGlmIHdlIGFyZSBza2lwcGluZyB0aGUgY3VycmVudCBlbGVtZW50XG4gICAgaWYgKHBhcmFtcy5pZ25vcmVFbGVtZW50cy5pbmRleE9mKGNoaWxkTm9kZXNBcnJheVtpXS5pZCkgIT09IC0xKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIENsb25lIHRoZSBjaGlsZCBlbGVtZW50XG5cblxuICAgIHZhciBjbG9uZWRDaGlsZCA9IGNsb25lRWxlbWVudChjaGlsZE5vZGVzQXJyYXlbaV0sIHBhcmFtcyk7IC8vIEF0dGFjaCB0aGUgY2xvbmVkIGNoaWxkIHRvIHRoZSBjbG9uZWQgcGFyZW50IG5vZGVcblxuICAgIGNsb25lLmFwcGVuZENoaWxkKGNsb25lZENoaWxkKTtcbiAgfSAvLyBHZXQgYWxsIHN0eWxpbmcgZm9yIHByaW50IGVsZW1lbnQgKGZvciBub2RlcyBvZiB0eXBlIGVsZW1lbnQgb25seSlcblxuXG4gIGlmIChwYXJhbXMuc2NhblN0eWxlcyAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgY2xvbmUuc2V0QXR0cmlidXRlKCdzdHlsZScsIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJjb2xsZWN0U3R5bGVzXCJdKShlbGVtZW50LCBwYXJhbXMpKTtcbiAgfSAvLyBDaGVjayBpZiB0aGUgZWxlbWVudCBuZWVkcyBhbnkgc3RhdGUgcHJvY2Vzc2luZyAoY29weSB1c2VyIGlucHV0IGRhdGEpXG5cblxuICBzd2l0Y2ggKGVsZW1lbnQudGFnTmFtZSkge1xuICAgIGNhc2UgJ1NFTEVDVCc6XG4gICAgICAvLyBDb3B5IHRoZSBjdXJyZW50IHNlbGVjdGlvbiB2YWx1ZSB0byBpdHMgY2xvbmVcbiAgICAgIGNsb25lLnZhbHVlID0gZWxlbWVudC52YWx1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnQ0FOVkFTJzpcbiAgICAgIC8vIENvcHkgdGhlIGNhbnZhcyBjb250ZW50IHRvIGl0cyBjbG9uZVxuICAgICAgY2xvbmUuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UoZWxlbWVudCwgMCwgMCk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gaXNIdG1sRWxlbWVudChwcmludGFibGUpIHtcbiAgLy8gQ2hlY2sgaWYgZWxlbWVudCBpcyBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCBvciBoYXMgbm9kZVR5cGUgPT09IDEgKGZvciBlbGVtZW50cyBpbiBpZnJhbWUpXG4gIHJldHVybiBfdHlwZW9mKHByaW50YWJsZSkgPT09ICdvYmplY3QnICYmIHByaW50YWJsZSAmJiAocHJpbnRhYmxlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgcHJpbnRhYmxlLm5vZGVUeXBlID09PSAxKTtcbn1cblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvaW1hZ2UuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvaW1hZ2UuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Z1bmN0aW9ucyAqLyBcIi4vc3JjL2pzL2Z1bmN0aW9ucy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJpbnQgKi8gXCIuL3NyYy9qcy9wcmludC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9icm93c2VyICovIFwiLi9zcmMvanMvYnJvd3Nlci5qc1wiKTtcblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoe1xuICBwcmludDogZnVuY3Rpb24gcHJpbnQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHByaW50aW5nIG9uZSBpbWFnZSBvciBtdWx0aXBsZSBpbWFnZXNcbiAgICBpZiAocGFyYW1zLnByaW50YWJsZS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHtcbiAgICAgIC8vIENyZWF0ZSBhcnJheSB3aXRoIG9uZSBpbWFnZVxuICAgICAgcGFyYW1zLnByaW50YWJsZSA9IFtwYXJhbXMucHJpbnRhYmxlXTtcbiAgICB9IC8vIENyZWF0ZSBwcmludGFibGUgZWxlbWVudCAoY29udGFpbmVyKVxuXG5cbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBDcmVhdGUgYWxsIGltYWdlIGVsZW1lbnRzIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUgcHJpbnRhYmxlIGNvbnRhaW5lclxuXG4gICAgcGFyYW1zLnByaW50YWJsZS5mb3JFYWNoKGZ1bmN0aW9uIChzcmMpIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgaW1hZ2UgZWxlbWVudFxuICAgICAgdmFyIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgaW1nLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBwYXJhbXMuaW1hZ2VTdHlsZSk7IC8vIFNldCBpbWFnZSBzcmMgd2l0aCB0aGUgZmlsZSB1cmxcblxuICAgICAgaW1nLnNyYyA9IHNyYzsgLy8gVGhlIGZvbGxvd2luZyBibG9jayBpcyBmb3IgRmlyZWZveCwgd2hpY2ggZm9yIHNvbWUgcmVhc29uIHJlcXVpcmVzIHRoZSBpbWFnZSdzIHNyYyB0byBiZSBmdWxseSBxdWFsaWZpZWQgaW5cbiAgICAgIC8vIG9yZGVyIHRvIHByaW50IGl0XG5cbiAgICAgIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fW1wiZGVmYXVsdFwiXS5pc0ZpcmVmb3goKSkge1xuICAgICAgICB2YXIgZnVsbHlRdWFsaWZpZWRTcmMgPSBpbWcuc3JjO1xuICAgICAgICBpbWcuc3JjID0gZnVsbHlRdWFsaWZpZWRTcmM7XG4gICAgICB9IC8vIENyZWF0ZSB0aGUgaW1hZ2Ugd3JhcHBlclxuXG5cbiAgICAgIHZhciBpbWFnZVdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgLy8gQXBwZW5kIGltYWdlIHRvIHRoZSB3cmFwcGVyIGVsZW1lbnRcblxuICAgICAgaW1hZ2VXcmFwcGVyLmFwcGVuZENoaWxkKGltZyk7IC8vIEFwcGVuZCB3cmFwcGVyIHRvIHRoZSBwcmludGFibGUgZWxlbWVudFxuXG4gICAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudC5hcHBlbmRDaGlsZChpbWFnZVdyYXBwZXIpO1xuICAgIH0pOyAvLyBDaGVjayBpZiB3ZSBhcmUgYWRkaW5nIGEgcHJpbnQgaGVhZGVyXG5cbiAgICBpZiAocGFyYW1zLmhlYWRlcikgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImFkZEhlYWRlclwiXSkocGFyYW1zLnByaW50YWJsZUVsZW1lbnQsIHBhcmFtcyk7IC8vIFByaW50IGltYWdlXG5cbiAgICBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uc2VuZChwYXJhbXMsIHByaW50RnJhbWUpO1xuICB9XG59KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvaW5pdC5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL2luaXQuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Jyb3dzZXIgKi8gXCIuL3NyYy9qcy9icm93c2VyLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9tb2RhbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9tb2RhbCAqLyBcIi4vc3JjL2pzL21vZGFsLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9wZGZfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcGRmICovIFwiLi9zcmMvanMvcGRmLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9odG1sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2h0bWwgKi8gXCIuL3NyYy9qcy9odG1sLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9yYXdfaHRtbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9yYXctaHRtbCAqLyBcIi4vc3JjL2pzL3Jhdy1odG1sLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9pbWFnZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9pbWFnZSAqLyBcIi4vc3JjL2pzL2ltYWdlLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9qc29uX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2pzb24gKi8gXCIuL3NyYy9qcy9qc29uLmpzXCIpO1xuXG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuXG5cblxuXG5cblxuXG52YXIgcHJpbnRUeXBlcyA9IFsncGRmJywgJ2h0bWwnLCAnaW1hZ2UnLCAnanNvbicsICdyYXctaHRtbCddO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9ICh7XG4gIGluaXQ6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgIHByaW50YWJsZTogbnVsbCxcbiAgICAgIGZhbGxiYWNrUHJpbnRhYmxlOiBudWxsLFxuICAgICAgdHlwZTogJ3BkZicsXG4gICAgICBoZWFkZXI6IG51bGwsXG4gICAgICBoZWFkZXJTdHlsZTogJ2ZvbnQtd2VpZ2h0OiAzMDA7JyxcbiAgICAgIG1heFdpZHRoOiA4MDAsXG4gICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgZ3JpZEhlYWRlclN0eWxlOiAnZm9udC13ZWlnaHQ6IGJvbGQ7IHBhZGRpbmc6IDVweDsgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsnLFxuICAgICAgZ3JpZFN0eWxlOiAnYm9yZGVyOiAxcHggc29saWQgbGlnaHRncmF5OyBtYXJnaW4tYm90dG9tOiAtMXB4OycsXG4gICAgICBzaG93TW9kYWw6IGZhbHNlLFxuICAgICAgb25FcnJvcjogZnVuY3Rpb24gb25FcnJvcihlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRpbmdTdGFydDogbnVsbCxcbiAgICAgIG9uTG9hZGluZ0VuZDogbnVsbCxcbiAgICAgIG9uUHJpbnREaWFsb2dDbG9zZTogZnVuY3Rpb24gb25QcmludERpYWxvZ0Nsb3NlKCkge30sXG4gICAgICBvbkluY29tcGF0aWJsZUJyb3dzZXI6IGZ1bmN0aW9uIG9uSW5jb21wYXRpYmxlQnJvd3NlcigpIHt9LFxuICAgICAgbW9kYWxNZXNzYWdlOiAnUmV0cmlldmluZyBEb2N1bWVudC4uLicsXG4gICAgICBmcmFtZUlkOiAncHJpbnRKUycsXG4gICAgICBwcmludGFibGVFbGVtZW50OiBudWxsLFxuICAgICAgZG9jdW1lbnRUaXRsZTogJ0RvY3VtZW50JyxcbiAgICAgIHRhcmdldFN0eWxlOiBbJ2NsZWFyJywgJ2Rpc3BsYXknLCAnd2lkdGgnLCAnbWluLXdpZHRoJywgJ2hlaWdodCcsICdtaW4taGVpZ2h0JywgJ21heC1oZWlnaHQnXSxcbiAgICAgIHRhcmdldFN0eWxlczogWydib3JkZXInLCAnYm94JywgJ2JyZWFrJywgJ3RleHQtZGVjb3JhdGlvbiddLFxuICAgICAgaWdub3JlRWxlbWVudHM6IFtdLFxuICAgICAgcmVwZWF0VGFibGVIZWFkZXI6IHRydWUsXG4gICAgICBjc3M6IG51bGwsXG4gICAgICBzdHlsZTogbnVsbCxcbiAgICAgIHNjYW5TdHlsZXM6IHRydWUsXG4gICAgICBiYXNlNjQ6IGZhbHNlLFxuICAgICAgLy8gRGVwcmVjYXRlZFxuICAgICAgb25QZGZPcGVuOiBudWxsLFxuICAgICAgZm9udDogJ1RpbWVzTmV3Um9tYW4nLFxuICAgICAgZm9udF9zaXplOiAnMTJwdCcsXG4gICAgICBob25vck1hcmdpblBhZGRpbmc6IHRydWUsXG4gICAgICBob25vckNvbG9yOiBmYWxzZSxcbiAgICAgIGltYWdlU3R5bGU6ICdtYXgtd2lkdGg6IDEwMCU7J1xuICAgIH07IC8vIENoZWNrIGlmIGEgcHJpbnRhYmxlIGRvY3VtZW50IG9yIG9iamVjdCB3YXMgc3VwcGxpZWRcblxuICAgIHZhciBhcmdzID0gYXJndW1lbnRzWzBdO1xuXG4gICAgaWYgKGFyZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcmludEpTIGV4cGVjdHMgYXQgbGVhc3QgMSBhdHRyaWJ1dGUuJyk7XG4gICAgfSAvLyBQcm9jZXNzIHBhcmFtZXRlcnNcblxuXG4gICAgc3dpdGNoIChfdHlwZW9mKGFyZ3MpKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICBwYXJhbXMucHJpbnRhYmxlID0gZW5jb2RlVVJJKGFyZ3MpO1xuICAgICAgICBwYXJhbXMuZmFsbGJhY2tQcmludGFibGUgPSBwYXJhbXMucHJpbnRhYmxlO1xuICAgICAgICBwYXJhbXMudHlwZSA9IGFyZ3VtZW50c1sxXSB8fCBwYXJhbXMudHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHBhcmFtcy5wcmludGFibGUgPSBhcmdzLnByaW50YWJsZTtcbiAgICAgICAgcGFyYW1zLmZhbGxiYWNrUHJpbnRhYmxlID0gdHlwZW9mIGFyZ3MuZmFsbGJhY2tQcmludGFibGUgIT09ICd1bmRlZmluZWQnID8gYXJncy5mYWxsYmFja1ByaW50YWJsZSA6IHBhcmFtcy5wcmludGFibGU7XG4gICAgICAgIHBhcmFtcy5mYWxsYmFja1ByaW50YWJsZSA9IHBhcmFtcy5iYXNlNjQgPyBcImRhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCxcIi5jb25jYXQocGFyYW1zLmZhbGxiYWNrUHJpbnRhYmxlKSA6IHBhcmFtcy5mYWxsYmFja1ByaW50YWJsZTtcblxuICAgICAgICBmb3IgKHZhciBrIGluIHBhcmFtcykge1xuICAgICAgICAgIGlmIChrID09PSAncHJpbnRhYmxlJyB8fCBrID09PSAnZmFsbGJhY2tQcmludGFibGUnKSBjb250aW51ZTtcbiAgICAgICAgICBwYXJhbXNba10gPSB0eXBlb2YgYXJnc1trXSAhPT0gJ3VuZGVmaW5lZCcgPyBhcmdzW2tdIDogcGFyYW1zW2tdO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBhcmd1bWVudCB0eXBlISBFeHBlY3RlZCBcInN0cmluZ1wiIG9yIFwib2JqZWN0XCIsIGdvdCAnICsgX3R5cGVvZihhcmdzKSk7XG4gICAgfSAvLyBWYWxpZGF0ZSBwcmludGFibGVcblxuXG4gICAgaWYgKCFwYXJhbXMucHJpbnRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJpbnRhYmxlIGluZm9ybWF0aW9uLicpOyAvLyBWYWxpZGF0ZSB0eXBlXG5cbiAgICBpZiAoIXBhcmFtcy50eXBlIHx8IHR5cGVvZiBwYXJhbXMudHlwZSAhPT0gJ3N0cmluZycgfHwgcHJpbnRUeXBlcy5pbmRleE9mKHBhcmFtcy50eXBlLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaW50IHR5cGUuIEF2YWlsYWJsZSB0eXBlcyBhcmU6IHBkZiwgaHRtbCwgaW1hZ2UgYW5kIGpzb24uJyk7XG4gICAgfSAvLyBDaGVjayBpZiB3ZSBhcmUgc2hvd2luZyBhIGZlZWRiYWNrIG1lc3NhZ2UgdG8gdGhlIHVzZXIgKHVzZWZ1bCBmb3IgbGFyZ2UgZmlsZXMpXG5cblxuICAgIGlmIChwYXJhbXMuc2hvd01vZGFsKSBfbW9kYWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uc2hvdyhwYXJhbXMpOyAvLyBDaGVjayBmb3IgYSBwcmludCBzdGFydCBob29rIGZ1bmN0aW9uXG5cbiAgICBpZiAocGFyYW1zLm9uTG9hZGluZ1N0YXJ0KSBwYXJhbXMub25Mb2FkaW5nU3RhcnQoKTsgLy8gVG8gcHJldmVudCBkdXBsaWNhdGlvbiBhbmQgaXNzdWVzLCByZW1vdmUgYW55IHVzZWQgcHJpbnRGcmFtZSBmcm9tIHRoZSBET01cblxuICAgIHZhciB1c2VkRnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJhbXMuZnJhbWVJZCk7XG4gICAgaWYgKHVzZWRGcmFtZSkgdXNlZEZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodXNlZEZyYW1lKTsgLy8gQ3JlYXRlIGEgbmV3IGlmcmFtZSBmb3IgdGhlIHByaW50IGpvYlxuXG4gICAgdmFyIHByaW50RnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcblxuICAgIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5pc0ZpcmVmb3goKSkge1xuICAgICAgLy8gU2V0IHRoZSBpZnJhbWUgdG8gYmUgaXMgdmlzaWJsZSBvbiB0aGUgcGFnZSAoZ3VhcmFudGVlZCBieSBmaXhlZCBwb3NpdGlvbikgYnV0IGhpZGRlbiB1c2luZyBvcGFjaXR5IDAsIGJlY2F1c2VcbiAgICAgIC8vIHRoaXMgd29ya3MgaW4gRmlyZWZveC4gVGhlIGhlaWdodCBuZWVkcyB0byBiZSBzdWZmaWNpZW50IGZvciBzb21lIHBhcnQgb2YgdGhlIGRvY3VtZW50IG90aGVyIHRoYW4gdGhlIFBERlxuICAgICAgLy8gdmlld2VyJ3MgdG9vbGJhciB0byBiZSB2aXNpYmxlIGluIHRoZSBwYWdlXG4gICAgICBwcmludEZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6IDFweDsgaGVpZ2h0OiAxMDBweDsgcG9zaXRpb246IGZpeGVkOyBsZWZ0OiAwOyB0b3A6IDA7IG9wYWNpdHk6IDA7IGJvcmRlci13aWR0aDogMDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhpZGUgdGhlIGlmcmFtZSBpbiBvdGhlciBicm93c2Vyc1xuICAgICAgcHJpbnRGcmFtZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3Zpc2liaWxpdHk6IGhpZGRlbjsgaGVpZ2h0OiAwOyB3aWR0aDogMDsgcG9zaXRpb246IGFic29sdXRlOyBib3JkZXI6IDAnKTtcbiAgICB9IC8vIFNldCBpZnJhbWUgZWxlbWVudCBpZFxuXG5cbiAgICBwcmludEZyYW1lLnNldEF0dHJpYnV0ZSgnaWQnLCBwYXJhbXMuZnJhbWVJZCk7IC8vIEZvciBub24gcGRmIHByaW50aW5nLCBwYXNzIGFuIGh0bWwgZG9jdW1lbnQgc3RyaW5nIHRvIHNyY2RvYyAoZm9yY2Ugb25sb2FkIGNhbGxiYWNrKVxuXG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSAncGRmJykge1xuICAgICAgcHJpbnRGcmFtZS5zcmNkb2MgPSAnPGh0bWw+PGhlYWQ+PHRpdGxlPicgKyBwYXJhbXMuZG9jdW1lbnRUaXRsZSArICc8L3RpdGxlPic7IC8vIEF0dGFjaCBjc3MgZmlsZXNcblxuICAgICAgaWYgKHBhcmFtcy5jc3MpIHtcbiAgICAgICAgLy8gQWRkIHN1cHBvcnQgZm9yIHNpbmdsZSBmaWxlXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuY3NzKSkgcGFyYW1zLmNzcyA9IFtwYXJhbXMuY3NzXTsgLy8gQ3JlYXRlIGxpbmsgdGFncyBmb3IgZWFjaCBjc3MgZmlsZVxuXG4gICAgICAgIHBhcmFtcy5jc3MuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICAgIHByaW50RnJhbWUuc3JjZG9jICs9ICc8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIicgKyBmaWxlICsgJ1wiPic7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwcmludEZyYW1lLnNyY2RvYyArPSAnPC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+JztcbiAgICB9IC8vIENoZWNrIHByaW50YWJsZSB0eXBlXG5cblxuICAgIHN3aXRjaCAocGFyYW1zLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3BkZic6XG4gICAgICAgIC8vIENoZWNrIGJyb3dzZXIgc3VwcG9ydCBmb3IgcGRmIGFuZCBpZiBub3Qgc3VwcG9ydGVkIHdlIHdpbGwganVzdCBvcGVuIHRoZSBwZGYgZmlsZSBpbnN0ZWFkXG4gICAgICAgIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5pc0lFKCkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdQcmludC5qcyBkb2VzblxcJ3Qgc3VwcG9ydCBQREYgcHJpbnRpbmcgaW4gSW50ZXJuZXQgRXhwbG9yZXIuJyk7XG4gICAgICAgICAgICB2YXIgd2luID0gd2luZG93Lm9wZW4ocGFyYW1zLmZhbGxiYWNrUHJpbnRhYmxlLCAnX2JsYW5rJyk7XG4gICAgICAgICAgICB3aW4uZm9jdXMoKTtcbiAgICAgICAgICAgIHBhcmFtcy5vbkluY29tcGF0aWJsZUJyb3dzZXIoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcGFyYW1zLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgbm8gbG9hZGluZyBtb2RhbCBvcGVuZWRcbiAgICAgICAgICAgIGlmIChwYXJhbXMuc2hvd01vZGFsKSBfbW9kYWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uY2xvc2UoKTtcbiAgICAgICAgICAgIGlmIChwYXJhbXMub25Mb2FkaW5nRW5kKSBwYXJhbXMub25Mb2FkaW5nRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9wZGZfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1tcImRlZmF1bHRcIl0ucHJpbnQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgIF9pbWFnZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fW1wiZGVmYXVsdFwiXS5wcmludChwYXJhbXMsIHByaW50RnJhbWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICAgIF9odG1sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bXCJkZWZhdWx0XCJdLnByaW50KHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyYXctaHRtbCc6XG4gICAgICAgIF9yYXdfaHRtbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fW1wiZGVmYXVsdFwiXS5wcmludChwYXJhbXMsIHByaW50RnJhbWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgIF9qc29uX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X19bXCJkZWZhdWx0XCJdLnByaW50KHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL2pzb24uanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9qc29uLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Z1bmN0aW9ucyAqLyBcIi4vc3JjL2pzL2Z1bmN0aW9ucy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJpbnQgKi8gXCIuL3NyYy9qcy9wcmludC5qc1wiKTtcbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoe1xuICBwcmludDogZnVuY3Rpb24gcHJpbnQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgcmVjZWl2ZWQgcHJvcGVyIGRhdGFcbiAgICBpZiAoX3R5cGVvZihwYXJhbXMucHJpbnRhYmxlKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBqYXZhc2NyaXB0IGRhdGEgb2JqZWN0IChKU09OKS4nKTtcbiAgICB9IC8vIFZhbGlkYXRlIHJlcGVhdFRhYmxlSGVhZGVyXG5cblxuICAgIGlmICh0eXBlb2YgcGFyYW1zLnJlcGVhdFRhYmxlSGVhZGVyICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgcmVwZWF0VGFibGVIZWFkZXIgYXR0cmlidXRlIChKU09OKS4nKTtcbiAgICB9IC8vIFZhbGlkYXRlIHByb3BlcnRpZXNcblxuXG4gICAgaWYgKCFwYXJhbXMucHJvcGVydGllcyB8fCAhQXJyYXkuaXNBcnJheShwYXJhbXMucHJvcGVydGllcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwcm9wZXJ0aWVzIGFycmF5IGZvciB5b3VyIEpTT04gZGF0YS4nKTtcbiAgICB9IC8vIFdlIHdpbGwgZm9ybWF0IHRoZSBwcm9wZXJ0eSBvYmplY3RzIHRvIGtlZXAgdGhlIEpTT04gYXBpIGNvbXBhdGlibGUgd2l0aCBvbGRlciByZWxlYXNlc1xuXG5cbiAgICBwYXJhbXMucHJvcGVydGllcyA9IHBhcmFtcy5wcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBfdHlwZW9mKHByb3BlcnR5KSA9PT0gJ29iamVjdCcgPyBwcm9wZXJ0eS5maWVsZCA6IHByb3BlcnR5LFxuICAgICAgICBkaXNwbGF5TmFtZTogX3R5cGVvZihwcm9wZXJ0eSkgPT09ICdvYmplY3QnID8gcHJvcGVydHkuZGlzcGxheU5hbWUgOiBwcm9wZXJ0eSxcbiAgICAgICAgY29sdW1uU2l6ZTogX3R5cGVvZihwcm9wZXJ0eSkgPT09ICdvYmplY3QnICYmIHByb3BlcnR5LmNvbHVtblNpemUgPyBwcm9wZXJ0eS5jb2x1bW5TaXplICsgJzsnIDogMTAwIC8gcGFyYW1zLnByb3BlcnRpZXMubGVuZ3RoICsgJyU7J1xuICAgICAgfTtcbiAgICB9KTsgLy8gQ3JlYXRlIGEgcHJpbnQgY29udGFpbmVyIGVsZW1lbnRcblxuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IC8vIENoZWNrIGlmIHdlIGFyZSBhZGRpbmcgYSBwcmludCBoZWFkZXJcblxuICAgIGlmIChwYXJhbXMuaGVhZGVyKSB7XG4gICAgICBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiYWRkSGVhZGVyXCJdKShwYXJhbXMucHJpbnRhYmxlRWxlbWVudCwgcGFyYW1zKTtcbiAgICB9IC8vIEJ1aWxkIHRoZSBwcmludGFibGUgaHRtbCBkYXRhXG5cblxuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50LmlubmVySFRNTCArPSBqc29uVG9IVE1MKHBhcmFtcyk7IC8vIFByaW50IHRoZSBqc29uIGRhdGFcblxuICAgIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5zZW5kKHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBqc29uVG9IVE1MKHBhcmFtcykge1xuICAvLyBHZXQgdGhlIHJvdyBhbmQgY29sdW1uIGRhdGFcbiAgdmFyIGRhdGEgPSBwYXJhbXMucHJpbnRhYmxlO1xuICB2YXIgcHJvcGVydGllcyA9IHBhcmFtcy5wcm9wZXJ0aWVzOyAvLyBDcmVhdGUgYSBodG1sIHRhYmxlXG5cbiAgdmFyIGh0bWxEYXRhID0gJzx0YWJsZSBzdHlsZT1cImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiAxMDAlO1wiPic7IC8vIENoZWNrIGlmIHRoZSBoZWFkZXIgc2hvdWxkIGJlIHJlcGVhdGVkXG5cbiAgaWYgKHBhcmFtcy5yZXBlYXRUYWJsZUhlYWRlcikge1xuICAgIGh0bWxEYXRhICs9ICc8dGhlYWQ+JztcbiAgfSAvLyBBZGQgdGhlIHRhYmxlIGhlYWRlciByb3dcblxuXG4gIGh0bWxEYXRhICs9ICc8dHI+JzsgLy8gQWRkIHRoZSB0YWJsZSBoZWFkZXIgY29sdW1uc1xuXG4gIGZvciAodmFyIGEgPSAwOyBhIDwgcHJvcGVydGllcy5sZW5ndGg7IGErKykge1xuICAgIGh0bWxEYXRhICs9ICc8dGggc3R5bGU9XCJ3aWR0aDonICsgcHJvcGVydGllc1thXS5jb2x1bW5TaXplICsgJzsnICsgcGFyYW1zLmdyaWRIZWFkZXJTdHlsZSArICdcIj4nICsgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImNhcGl0YWxpemVQcmludFwiXSkocHJvcGVydGllc1thXS5kaXNwbGF5TmFtZSkgKyAnPC90aD4nO1xuICB9IC8vIEFkZCB0aGUgY2xvc2luZyB0YWcgZm9yIHRoZSB0YWJsZSBoZWFkZXIgcm93XG5cblxuICBodG1sRGF0YSArPSAnPC90cj4nOyAvLyBJZiB0aGUgdGFibGUgaGVhZGVyIGlzIG1hcmtlZCBhcyByZXBlYXRlZCwgYWRkIHRoZSBjbG9zaW5nIHRhZ1xuXG4gIGlmIChwYXJhbXMucmVwZWF0VGFibGVIZWFkZXIpIHtcbiAgICBodG1sRGF0YSArPSAnPC90aGVhZD4nO1xuICB9IC8vIENyZWF0ZSB0aGUgdGFibGUgYm9keVxuXG5cbiAgaHRtbERhdGEgKz0gJzx0Ym9keT4nOyAvLyBBZGQgdGhlIHRhYmxlIGRhdGEgcm93c1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIC8vIEFkZCB0aGUgcm93IHN0YXJ0aW5nIHRhZ1xuICAgIGh0bWxEYXRhICs9ICc8dHI+JzsgLy8gUHJpbnQgc2VsZWN0ZWQgcHJvcGVydGllcyBvbmx5XG5cbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IHByb3BlcnRpZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgIHZhciBzdHJpbmdEYXRhID0gZGF0YVtpXTsgLy8gU3VwcG9ydCBuZXN0ZWQgb2JqZWN0c1xuXG4gICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW25dLmZpZWxkLnNwbGl0KCcuJyk7XG5cbiAgICAgIGlmIChwcm9wZXJ0eS5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgcHJvcGVydHkubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICBzdHJpbmdEYXRhID0gc3RyaW5nRGF0YVtwcm9wZXJ0eVtwXV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0cmluZ0RhdGEgPSBzdHJpbmdEYXRhW3Byb3BlcnRpZXNbbl0uZmllbGRdO1xuICAgICAgfSAvLyBBZGQgdGhlIHJvdyBjb250ZW50cyBhbmQgc3R5bGVzXG5cblxuICAgICAgaHRtbERhdGEgKz0gJzx0ZCBzdHlsZT1cIndpZHRoOicgKyBwcm9wZXJ0aWVzW25dLmNvbHVtblNpemUgKyBwYXJhbXMuZ3JpZFN0eWxlICsgJ1wiPicgKyBzdHJpbmdEYXRhICsgJzwvdGQ+JztcbiAgICB9IC8vIEFkZCB0aGUgcm93IGNsb3NpbmcgdGFnXG5cblxuICAgIGh0bWxEYXRhICs9ICc8L3RyPic7XG4gIH0gLy8gQWRkIHRoZSB0YWJsZSBhbmQgYm9keSBjbG9zaW5nIHRhZ3NcblxuXG4gIGh0bWxEYXRhICs9ICc8L3Rib2R5PjwvdGFibGU+JztcbiAgcmV0dXJuIGh0bWxEYXRhO1xufVxuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9tb2RhbC5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9tb2RhbC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xudmFyIE1vZGFsID0ge1xuICBzaG93OiBmdW5jdGlvbiBzaG93KHBhcmFtcykge1xuICAgIC8vIEJ1aWxkIG1vZGFsXG4gICAgdmFyIG1vZGFsU3R5bGUgPSAnZm9udC1mYW1pbHk6c2Fucy1zZXJpZjsgJyArICdkaXNwbGF5OnRhYmxlOyAnICsgJ3RleHQtYWxpZ246Y2VudGVyOyAnICsgJ2ZvbnQtd2VpZ2h0OjMwMDsgJyArICdmb250LXNpemU6MzBweDsgJyArICdsZWZ0OjA7IHRvcDowOycgKyAncG9zaXRpb246Zml4ZWQ7ICcgKyAnei1pbmRleDogOTk5MDsnICsgJ2NvbG9yOiAjMDQ2MEI1OyAnICsgJ3dpZHRoOiAxMDAlOyAnICsgJ2hlaWdodDogMTAwJTsgJyArICdiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpOycgKyAndHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTsnOyAvLyBDcmVhdGUgd3JhcHBlclxuXG4gICAgdmFyIHByaW50TW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBwcmludE1vZGFsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBtb2RhbFN0eWxlKTtcbiAgICBwcmludE1vZGFsLnNldEF0dHJpYnV0ZSgnaWQnLCAncHJpbnRKUy1Nb2RhbCcpOyAvLyBDcmVhdGUgY29udGVudCBkaXZcblxuICAgIHZhciBjb250ZW50RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29udGVudERpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6dGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyBwYWRkaW5nLWJvdHRvbToxMDBweDsnKTsgLy8gQWRkIGNsb3NlIGJ1dHRvbiAocmVxdWlyZXMgcHJpbnQuY3NzKVxuXG4gICAgdmFyIGNsb3NlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY2xvc2VCdXR0b24uc2V0QXR0cmlidXRlKCdjbGFzcycsICdwcmludENsb3NlJyk7XG4gICAgY2xvc2VCdXR0b24uc2V0QXR0cmlidXRlKCdpZCcsICdwcmludENsb3NlJyk7XG4gICAgY29udGVudERpdi5hcHBlbmRDaGlsZChjbG9zZUJ1dHRvbik7IC8vIEFkZCBzcGlubmVyIChyZXF1aXJlcyBwcmludC5jc3MpXG5cbiAgICB2YXIgc3Bpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBzcGlubmVyLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAncHJpbnRTcGlubmVyJyk7XG4gICAgY29udGVudERpdi5hcHBlbmRDaGlsZChzcGlubmVyKTsgLy8gQWRkIG1lc3NhZ2VcblxuICAgIHZhciBtZXNzYWdlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhcmFtcy5tb2RhbE1lc3NhZ2UpO1xuICAgIGNvbnRlbnREaXYuYXBwZW5kQ2hpbGQobWVzc2FnZU5vZGUpOyAvLyBBZGQgY29udGVudERpdiB0byBwcmludE1vZGFsXG5cbiAgICBwcmludE1vZGFsLmFwcGVuZENoaWxkKGNvbnRlbnREaXYpOyAvLyBBcHBlbmQgcHJpbnQgbW9kYWwgZWxlbWVudCB0byBkb2N1bWVudCBib2R5XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLmFwcGVuZENoaWxkKHByaW50TW9kYWwpOyAvLyBBZGQgZXZlbnQgbGlzdGVuZXIgdG8gY2xvc2UgYnV0dG9uXG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpbnRDbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgTW9kYWwuY2xvc2UoKTtcbiAgICB9KTtcbiAgfSxcbiAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIHZhciBwcmludE1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW50SlMtTW9kYWwnKTtcblxuICAgIGlmIChwcmludE1vZGFsKSB7XG4gICAgICBwcmludE1vZGFsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocHJpbnRNb2RhbCk7XG4gICAgfVxuICB9XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChNb2RhbCk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL3BkZi5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvcGRmLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9wcmludCAqLyBcIi4vc3JjL2pzL3ByaW50LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZnVuY3Rpb25zICovIFwiLi9zcmMvanMvZnVuY3Rpb25zLmpzXCIpO1xuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoe1xuICBwcmludDogZnVuY3Rpb24gcHJpbnQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBiYXNlNjQgZGF0YVxuICAgIGlmIChwYXJhbXMuYmFzZTY0KSB7XG4gICAgICB2YXIgYnl0ZXNBcnJheSA9IFVpbnQ4QXJyYXkuZnJvbShhdG9iKHBhcmFtcy5wcmludGFibGUpLCBmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYy5jaGFyQ29kZUF0KDApO1xuICAgICAgfSk7XG4gICAgICBjcmVhdGVCbG9iQW5kUHJpbnQocGFyYW1zLCBwcmludEZyYW1lLCBieXRlc0FycmF5KTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZvcm1hdCBwZGYgdXJsXG5cblxuICAgIHBhcmFtcy5wcmludGFibGUgPSAvXihibG9ifGh0dHB8XFwvXFwvKS9pLnRlc3QocGFyYW1zLnByaW50YWJsZSkgPyBwYXJhbXMucHJpbnRhYmxlIDogd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIChwYXJhbXMucHJpbnRhYmxlLmNoYXJBdCgwKSAhPT0gJy8nID8gJy8nICsgcGFyYW1zLnByaW50YWJsZSA6IHBhcmFtcy5wcmludGFibGUpOyAvLyBHZXQgdGhlIGZpbGUgdGhyb3VnaCBhIGh0dHAgcmVxdWVzdCAoUHJlbG9hZClcblxuICAgIHZhciByZXEgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgcmVxLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImNsZWFuVXBcIl0pKHBhcmFtcyk7XG4gICAgICBwYXJhbXMub25FcnJvcihyZXEuc3RhdHVzVGV4dCwgcmVxKTsgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHBkZiBkb2N1bWVudCBhdmFpbGFibGUsIHdlIHdpbGwgc3RvcCB0aGUgcHJpbnQgam9iXG4gICAgfSk7XG4gICAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBDaGVjayBmb3IgZXJyb3JzXG4gICAgICBpZiAoWzIwMCwgMjAxXS5pbmRleE9mKHJlcS5zdGF0dXMpID09PSAtMSkge1xuICAgICAgICBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiY2xlYW5VcFwiXSkocGFyYW1zKTtcbiAgICAgICAgcGFyYW1zLm9uRXJyb3IocmVxLnN0YXR1c1RleHQsIHJlcSk7IC8vIFNpbmNlIHdlIGRvbid0IGhhdmUgYSBwZGYgZG9jdW1lbnQgYXZhaWxhYmxlLCB3ZSB3aWxsIHN0b3AgdGhlIHByaW50IGpvYlxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gUHJpbnQgcmVxdWVzdGVkIGRvY3VtZW50XG5cblxuICAgICAgY3JlYXRlQmxvYkFuZFByaW50KHBhcmFtcywgcHJpbnRGcmFtZSwgcmVxLnJlc3BvbnNlKTtcbiAgICB9KTtcbiAgICByZXEub3BlbignR0VUJywgcGFyYW1zLnByaW50YWJsZSwgdHJ1ZSk7XG4gICAgcmVxLnNlbmQoKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUJsb2JBbmRQcmludChwYXJhbXMsIHByaW50RnJhbWUsIGRhdGEpIHtcbiAgLy8gUGFzcyByZXNwb25zZSBvciBiYXNlNjQgZGF0YSB0byBhIGJsb2IgYW5kIGNyZWF0ZSBhIGxvY2FsIG9iamVjdCB1cmxcbiAgdmFyIGxvY2FsUGRmID0gbmV3IHdpbmRvdy5CbG9iKFtkYXRhXSwge1xuICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnXG4gIH0pO1xuICBsb2NhbFBkZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGxvY2FsUGRmKTsgLy8gU2V0IGlmcmFtZSBzcmMgd2l0aCBwZGYgZG9jdW1lbnQgdXJsXG5cbiAgcHJpbnRGcmFtZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIGxvY2FsUGRmKTtcbiAgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLnNlbmQocGFyYW1zLCBwcmludEZyYW1lKTtcbn1cblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvcHJpbnQuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvcHJpbnQuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9icm93c2VyICovIFwiLi9zcmMvanMvYnJvd3Nlci5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Z1bmN0aW9ucyAqLyBcIi4vc3JjL2pzL2Z1bmN0aW9ucy5qc1wiKTtcblxuXG52YXIgUHJpbnQgPSB7XG4gIHNlbmQ6IGZ1bmN0aW9uIHNlbmQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gQXBwZW5kIGlmcmFtZSBlbGVtZW50IHRvIGRvY3VtZW50IGJvZHlcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLmFwcGVuZENoaWxkKHByaW50RnJhbWUpOyAvLyBHZXQgaWZyYW1lIGVsZW1lbnRcblxuICAgIHZhciBpZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1zLmZyYW1lSWQpOyAvLyBXYWl0IGZvciBpZnJhbWUgdG8gbG9hZCBhbGwgY29udGVudFxuXG4gICAgaWZyYW1lRWxlbWVudC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdwZGYnKSB7XG4gICAgICAgIC8vIEFkZCBhIGRlbGF5IGZvciBGaXJlZm94LiBJbiBteSB0ZXN0cywgMTAwMG1zIHdhcyBzdWZmaWNpZW50IGJ1dCAxMDBtcyB3YXMgbm90XG4gICAgICAgIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5pc0ZpcmVmb3goKSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1QcmludChpZnJhbWVFbGVtZW50LCBwYXJhbXMpO1xuICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlcmZvcm1QcmludChpZnJhbWVFbGVtZW50LCBwYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBHZXQgaWZyYW1lIGVsZW1lbnQgZG9jdW1lbnRcblxuXG4gICAgICB2YXIgcHJpbnREb2N1bWVudCA9IGlmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdyB8fCBpZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudDtcbiAgICAgIGlmIChwcmludERvY3VtZW50LmRvY3VtZW50KSBwcmludERvY3VtZW50ID0gcHJpbnREb2N1bWVudC5kb2N1bWVudDsgLy8gQXBwZW5kIHByaW50YWJsZSBlbGVtZW50IHRvIHRoZSBpZnJhbWUgYm9keVxuXG4gICAgICBwcmludERvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGFyYW1zLnByaW50YWJsZUVsZW1lbnQpOyAvLyBBZGQgY3VzdG9tIHN0eWxlXG5cbiAgICAgIGlmIChwYXJhbXMudHlwZSAhPT0gJ3BkZicgJiYgcGFyYW1zLnN0eWxlKSB7XG4gICAgICAgIC8vIENyZWF0ZSBzdHlsZSBlbGVtZW50XG4gICAgICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlLmlubmVySFRNTCA9IHBhcmFtcy5zdHlsZTsgLy8gQXBwZW5kIHN0eWxlIGVsZW1lbnQgdG8gaWZyYW1lJ3MgaGVhZFxuXG4gICAgICAgIHByaW50RG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICB9IC8vIElmIHByaW50aW5nIGltYWdlcywgd2FpdCBmb3IgdGhlbSB0byBsb2FkIGluc2lkZSB0aGUgaWZyYW1lXG5cblxuICAgICAgdmFyIGltYWdlcyA9IHByaW50RG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpO1xuXG4gICAgICBpZiAoaW1hZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9hZElmcmFtZUltYWdlcyhBcnJheS5mcm9tKGltYWdlcykpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBwZXJmb3JtUHJpbnQoaWZyYW1lRWxlbWVudCwgcGFyYW1zKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXJmb3JtUHJpbnQoaWZyYW1lRWxlbWVudCwgcGFyYW1zKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG5mdW5jdGlvbiBwZXJmb3JtUHJpbnQoaWZyYW1lRWxlbWVudCwgcGFyYW1zKSB7XG4gIHRyeSB7XG4gICAgaWZyYW1lRWxlbWVudC5mb2N1cygpOyAvLyBJZiBFZGdlIG9yIElFLCB0cnkgY2F0Y2ggd2l0aCBleGVjQ29tbWFuZFxuXG4gICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzRWRnZSgpIHx8IF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzSUUoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50LmV4ZWNDb21tYW5kKCdwcmludCcsIGZhbHNlLCBudWxsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93LnByaW50KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyIGJyb3dzZXJzXG4gICAgICBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cucHJpbnQoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcGFyYW1zLm9uRXJyb3IoZXJyb3IpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5pc0ZpcmVmb3goKSkge1xuICAgICAgLy8gTW92ZSB0aGUgaWZyYW1lIGVsZW1lbnQgb2ZmLXNjcmVlbiBhbmQgbWFrZSBpdCBpbnZpc2libGVcbiAgICAgIGlmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgaWZyYW1lRWxlbWVudC5zdHlsZS5sZWZ0ID0gJy0xcHgnO1xuICAgIH1cblxuICAgIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJjbGVhblVwXCJdKShwYXJhbXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxvYWRJZnJhbWVJbWFnZXMoaW1hZ2VzKSB7XG4gIHZhciBwcm9taXNlcyA9IGltYWdlcy5tYXAoZnVuY3Rpb24gKGltYWdlKSB7XG4gICAgaWYgKGltYWdlLnNyYyAmJiBpbWFnZS5zcmMgIT09IHdpbmRvdy5sb2NhdGlvbi5ocmVmKSB7XG4gICAgICByZXR1cm4gbG9hZElmcmFtZUltYWdlKGltYWdlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuXG5mdW5jdGlvbiBsb2FkSWZyYW1lSW1hZ2UoaW1hZ2UpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgdmFyIHBvbGxJbWFnZSA9IGZ1bmN0aW9uIHBvbGxJbWFnZSgpIHtcbiAgICAgICFpbWFnZSB8fCB0eXBlb2YgaW1hZ2UubmF0dXJhbFdpZHRoID09PSAndW5kZWZpbmVkJyB8fCBpbWFnZS5uYXR1cmFsV2lkdGggPT09IDAgfHwgIWltYWdlLmNvbXBsZXRlID8gc2V0VGltZW91dChwb2xsSW1hZ2UsIDUwMCkgOiByZXNvbHZlKCk7XG4gICAgfTtcblxuICAgIHBvbGxJbWFnZSgpO1xuICB9KTtcbn1cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChQcmludCk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL3Jhdy1odG1sLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL3Jhdy1odG1sLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3ByaW50ICovIFwiLi9zcmMvanMvcHJpbnQuanNcIik7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoe1xuICBwcmludDogZnVuY3Rpb24gcHJpbnQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gQ3JlYXRlIHByaW50YWJsZSBlbGVtZW50IChjb250YWluZXIpXG4gICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOjEwMCUnKTsgLy8gU2V0IG91ciByYXcgaHRtbCBhcyB0aGUgcHJpbnRhYmxlIGVsZW1lbnQgaW5uZXIgaHRtbCBjb250ZW50XG5cbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudC5pbm5lckhUTUwgPSBwYXJhbXMucHJpbnRhYmxlOyAvLyBQcmludCBodG1sIGNvbnRlbnRzXG5cbiAgICBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uc2VuZChwYXJhbXMsIHByaW50RnJhbWUpO1xuICB9XG59KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvc2Fzcy9pbmRleC5zY3NzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9zYXNzL2luZGV4LnNjc3MgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMDpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogbXVsdGkgLi9zcmMvaW5kZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3NyYy9pbmRleC5qcyAqL1wiLi9zcmMvaW5kZXguanNcIik7XG5cblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSlbXCJkZWZhdWx0XCJdO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcmludC5tYXAiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG4gIHZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgdmFyIGhhcyA9IHJlcXVpcmUoJy4vbGliL2hhcycpO1xuXG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7IC8qKi8gfVxuICB9O1xufVxuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZ2V0U3RhY2sgUmV0dXJucyB0aGUgY29tcG9uZW50IHN0YWNrLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBnZXRTdGFjaykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcihcbiAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICAgICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArXG4gICAgICAgICAgICAgICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgJiYgIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICcgK1xuICAgICAgICAgICAgbG9jYXRpb24gKyAnIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAnICsgdHlwZW9mIGVycm9yICsgJy4gJyArXG4gICAgICAgICAgICAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICtcbiAgICAgICAgICAgICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgICB2YXIgc3RhY2sgPSBnZXRTdGFjayA/IGdldFN0YWNrKCkgOiAnJztcblxuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdGYWlsZWQgJyArIGxvY2F0aW9uICsgJyB0eXBlOiAnICsgZXJyb3IubWVzc2FnZSArIChzdGFjayAhPSBudWxsID8gc3RhY2sgOiAnJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVzZXRzIHdhcm5pbmcgY2FjaGUgd2hlbiB0ZXN0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNoZWNrUHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlID0gZnVuY3Rpb24oKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1Byb3BUeXBlcztcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vbGliL2hhcycpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgnLi9jaGVja1Byb3BUeXBlcycpO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gIC8qIGdsb2JhbCBTeW1ib2wgKi9cbiAgdmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xuICB2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICAgKlxuICAgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAgICpcbiAgICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAgICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAgICogICAgICAgLi4uXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlXG4gICAqIHN1cHBsaWVkIHRvIFJlYWN0IGNvbXBvbmVudHMuIEV4YW1wbGUgdXNhZ2U6XG4gICAqXG4gICAqICAgdmFyIFByb3BzID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTtcbiAgICogICB2YXIgTXlBcnRpY2xlID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBwcm9wIG5hbWVkIFwiZGVzY3JpcHRpb25cIi5cbiAgICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZyxcbiAgICpcbiAgICogICAgICAgLy8gQSByZXF1aXJlZCBlbnVtIHByb3AgbmFtZWQgXCJjYXRlZ29yeVwiLlxuICAgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9zJ10pLmlzUmVxdWlyZWQsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCBcImRpYWxvZ1wiIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLlxuICAgKiAgICAgICBkaWFsb2c6IFByb3BzLmluc3RhbmNlT2YoRGlhbG9nKS5pc1JlcXVpcmVkXG4gICAqICAgICB9LFxuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogQSBtb3JlIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOlxuICAgKlxuICAgKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAgICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJlZCk/XG4gICAqXG4gICAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAgICogYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIFVSSSBwcm9wIG5hbWVkIFwiaHJlZlwiLlxuICAgKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgKiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICAgKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICAgKiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgKiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFtZSArICcgaW4gJyArXG4gICAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgKiAgICAgICAgICApO1xuICAgKiAgICAgICAgfVxuICAgKiAgICAgIH1cbiAgICogICAgfSxcbiAgICogICAgcmVuZGVyOiBmdW5jdGlvbigpIHsuLi59XG4gICAqICB9KTtcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIHZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksXG4gICAgYmlnaW50OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYmlnaW50JyksXG4gICAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgICBmdW5jOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignZnVuY3Rpb24nKSxcbiAgICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdudW1iZXInKSxcbiAgICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgICBzdHJpbmc6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzdHJpbmcnKSxcbiAgICBzeW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSxcblxuICAgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSxcbiAgICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gICAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksXG4gICAgZWxlbWVudFR5cGU6IGNyZWF0ZUVsZW1lbnRUeXBlVHlwZUNoZWNrZXIoKSxcbiAgICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICAgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksXG4gICAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsXG4gICAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsXG4gICAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIsXG4gICAgZXhhY3Q6IGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gICAqL1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSovXG4gIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gICAgfVxuICB9XG4gIC8qZXNsaW50LWVuYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuXG4gIC8qKlxuICAgKiBXZSB1c2UgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgcGVvcGxlIG1heSBjYWxsXG4gICAqIFByb3BUeXBlcyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIsIHdlIGRvbid0IHVzZSByZWFsXG4gICAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFueXdheSwgYW5kIGNyZWF0aW5nIHRoZW1cbiAgICogaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdFxuICAgKiBoYXBwZW5zIGluIG9uZU9mVHlwZSgpIGZvciBhbnkgdHlwZSBiZWZvcmUgdGhlIG9uZSB0aGF0IG1hdGNoZWQuXG4gICAqL1xuICBmdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuZGF0YSA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YToge307XG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG4gIC8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy5cbiAgUHJvcFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPSAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgICAgaWYgKHNlY3JldCAhPT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgICAgaWYgKHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgICAgICAgICAvLyBOZXcgYmVoYXZpb3Igb25seSBmb3IgdXNlcnMgb2YgYHByb3AtdHlwZXNgIHBhY2thZ2VcbiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgJ1VzZSBgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKClgIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAgICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICAgICAgICApO1xuICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE9sZCBiZWhhdmlvciBmb3IgcGVvcGxlIHVzaW5nIFJlYWN0LlByb3BUeXBlc1xuICAgICAgICAgIHZhciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldICYmXG4gICAgICAgICAgICAvLyBBdm9pZCBzcGFtbWluZyB0aGUgY29uc29sZSBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIG5vdCBhY3Rpb25hYmxlIGV4Y2VwdCBmb3IgbGliIGF1dGhvcnNcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50IDwgM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgICAnWW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGEgUmVhY3QuUHJvcFR5cGVzIHZhbGlkYXRpb24gJyArXG4gICAgICAgICAgICAgICdmdW5jdGlvbiBmb3IgdGhlIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgcHJvcCBvbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgK1xuICAgICAgICAgICAgICAnYW5kIHdpbGwgdGhyb3cgaW4gdGhlIHN0YW5kYWxvbmUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgICAnWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyAnICtcbiAgICAgICAgICAgICAgJ2xpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0eXBlcyAnICsgJ2ZvciBkZXRhaWxzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gPSB0cnVlO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICAgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhblxuICAgICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJyksXG4gICAgICAgICAge2V4cGVjdGVkVHlwZTogZXhwZWN0ZWRUeXBlfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBhcnJheS4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnWycgKyBpICsgJ10nLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIVJlYWN0SXMuaXNWYWxpZEVsZW1lbnRUeXBlKHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50IHR5cGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyKGV4cGVjdGVkQ2xhc3MpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICAgIHZhciBleHBlY3RlZENsYXNzTmFtZSA9IGV4cGVjdGVkQ2xhc3MubmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgYWN0dWFsQ2xhc3NOYW1lICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdpbnN0YW5jZSBvZiBgJyArIGV4cGVjdGVkQ2xhc3NOYW1lICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIoZXhwZWN0ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZXMpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LCBnb3QgJyArIGFyZ3VtZW50cy5sZW5ndGggKyAnIGFyZ3VtZW50cy4gJyArXG4gICAgICAgICAgICAnQSBjb21tb24gbWlzdGFrZSBpcyB0byB3cml0ZSBvbmVPZih4LCB5LCB6KSBpbnN0ZWFkIG9mIG9uZU9mKFt4LCB5LCB6XSkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBhcnJheS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMsIGZ1bmN0aW9uIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIFN0cmluZyhwcm9wVmFsdWUpICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIG9uZSBvZiAnICsgdmFsdWVzU3RyaW5nICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIG9iamVjdC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcFZhbHVlKSB7XG4gICAgICAgIGlmIChoYXMocHJvcFZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVVbmlvblR5cGVDaGVja2VyKGFycmF5T2ZUeXBlQ2hlY2tlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2VycykpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUuIEV4cGVjdGVkIGFuIGFycmF5IG9mIGNoZWNrIGZ1bmN0aW9ucywgYnV0ICcgK1xuICAgICAgICAgICdyZWNlaXZlZCAnICsgZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKGNoZWNrZXIpICsgJyBhdCBpbmRleCAnICsgaSArICcuJ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBleHBlY3RlZFR5cGVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgICB2YXIgY2hlY2tlclJlc3VsdCA9IGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChjaGVja2VyUmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tlclJlc3VsdC5kYXRhICYmIGhhcyhjaGVja2VyUmVzdWx0LmRhdGEsICdleHBlY3RlZFR5cGUnKSkge1xuICAgICAgICAgIGV4cGVjdGVkVHlwZXMucHVzaChjaGVja2VyUmVzdWx0LmRhdGEuZXhwZWN0ZWRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGV4cGVjdGVkVHlwZXNNZXNzYWdlID0gKGV4cGVjdGVkVHlwZXMubGVuZ3RoID4gMCkgPyAnLCBleHBlY3RlZCBvbmUgb2YgdHlwZSBbJyArIGV4cGVjdGVkVHlwZXMuam9pbignLCAnKSArICddJzogJyc7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgJyArIGV4cGVjdGVkVHlwZXNNZXNzYWdlICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVOb2RlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghaXNOb2RlKHByb3BzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdE5vZGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZhbGlkVmFsaWRhdG9yRXJyb3IoY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwga2V5LCB0eXBlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXkgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGUgKyAnYC4nXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFZhbGlkYXRvckVycm9yKGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIGtleSwgZ2V0UHJlY2lzZVR5cGUoY2hlY2tlcikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWxsIGtleXMgaW4gY2FzZSBzb21lIGFyZSByZXF1aXJlZCBidXQgbWlzc2luZyBmcm9tIHByb3BzLlxuICAgICAgdmFyIGFsbEtleXMgPSBhc3NpZ24oe30sIHByb3BzW3Byb3BOYW1lXSwgc2hhcGVUeXBlcyk7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gYWxsS2V5cykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKGhhcyhzaGFwZVR5cGVzLCBrZXkpICYmIHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGludmFsaWRWYWxpZGF0b3JFcnJvcihjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBrZXksIGdldFByZWNpc2VUeXBlKGNoZWNrZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAgICAgICAnSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Aga2V5IGAnICsga2V5ICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJyArXG4gICAgICAgICAgICAnXFxuQmFkIG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KHByb3BzW3Byb3BOYW1lXSwgbnVsbCwgJyAgJykgK1xuICAgICAgICAgICAgJ1xcblZhbGlkIGtleXM6ICcgKyBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzaGFwZVR5cGVzKSwgbnVsbCwgJyAgJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZW9mIHByb3BWYWx1ZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gIXByb3BWYWx1ZTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFZhbHVlLmV2ZXJ5KGlzTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4ocHJvcFZhbHVlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gICAgLy8gTmF0aXZlIFN5bWJvbC5cbiAgICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBmYWxzeSB2YWx1ZSBjYW4ndCBiZSBhIFN5bWJvbFxuICAgIGlmICghcHJvcFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSA9PT0gJ1N5bWJvbCdcbiAgICBpZiAocHJvcFZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNwZWMgY29tcGxpYW50IFN5bWJvbHMgd2hpY2ggYXJlIHBvbHlmaWxsZWQuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuXG4gIGZ1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSkge1xuICAgIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdhcnJheSc7XG4gICAgfVxuICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIE9sZCB3ZWJraXRzIChhdCBsZWFzdCB1bnRpbCBBbmRyb2lkIDQuMCkgcmV0dXJuICdmdW5jdGlvbicgcmF0aGVyIHRoYW5cbiAgICAgIC8vICdvYmplY3QnIGZvciB0eXBlb2YgYSBSZWdFeHAuIFdlJ2xsIG5vcm1hbGl6ZSB0aGlzIGhlcmUgc28gdGhhdCAvYmxhL1xuICAgICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmplY3QuXG4gICAgICByZXR1cm4gJ29iamVjdCc7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBUaGlzIGhhbmRsZXMgbW9yZSB0eXBlcyB0aGFuIGBnZXRQcm9wVHlwZWAuIE9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gIC8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXJgLlxuICBmdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJycgKyBwcm9wVmFsdWU7XG4gICAgfVxuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuICdkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiAncmVnZXhwJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHBvc3RmaXhlZCB0byBhIHdhcm5pbmcgYWJvdXQgYW4gaW52YWxpZCB0eXBlLlxuICAvLyBGb3IgZXhhbXBsZSwgXCJ1bmRlZmluZWRcIiBvciBcIm9mIHR5cGUgYXJyYXlcIlxuICBmdW5jdGlvbiBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcodmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHJldHVybiAnYW4gJyArIHR5cGU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgY2FzZSAncmVnZXhwJzpcbiAgICAgICAgcmV0dXJuICdhICcgKyB0eXBlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QsIGlmIGFueS5cbiAgZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKHByb3BWYWx1ZSkge1xuICAgIGlmICghcHJvcFZhbHVlLmNvbnN0cnVjdG9yIHx8ICFwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSkge1xuICAgICAgcmV0dXJuIEFOT05ZTU9VUztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbiAgUmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMgPSBjaGVja1Byb3BUeXBlcztcbiAgUmVhY3RQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBjaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZTtcbiAgUmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzID0gUmVhY3RQcm9wVHlwZXM7XG5cbiAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IGRldmVsb3BtZW50IGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gdHJ1ZTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoUmVhY3RJcy5pc0VsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufSBlbHNlIHtcbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zJykoKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmbHVzaFN5bmMgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgUmVzaXplciB9IGZyb20gJy4vcmVzaXplcic7XG52YXIgREVGQVVMVF9TSVpFID0ge1xuICAgIHdpZHRoOiAnYXV0bycsXG4gICAgaGVpZ2h0OiAnYXV0bycsXG59O1xudmFyIGNsYW1wID0gZnVuY3Rpb24gKG4sIG1pbiwgbWF4KSB7IHJldHVybiBNYXRoLm1heChNYXRoLm1pbihuLCBtYXgpLCBtaW4pOyB9O1xudmFyIHNuYXAgPSBmdW5jdGlvbiAobiwgc2l6ZSkgeyByZXR1cm4gTWF0aC5yb3VuZChuIC8gc2l6ZSkgKiBzaXplOyB9O1xudmFyIGhhc0RpcmVjdGlvbiA9IGZ1bmN0aW9uIChkaXIsIHRhcmdldCkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGRpciwgJ2knKS50ZXN0KHRhcmdldCk7XG59O1xuLy8gSU5GTzogSW4gY2FzZSBvZiB3aW5kb3cgaXMgYSBQcm94eSBhbmQgZG9lcyBub3QgcG9yeHkgRXZlbnRzIGNvcnJlY3RseSwgdXNlIGlzVG91Y2hFdmVudCAmIGlzTW91c2VFdmVudCB0byBkaXN0aW5ndWlzaCBldmVudCB0eXBlIGluc3RlYWQgb2YgYGluc3RhbmNlb2ZgLlxudmFyIGlzVG91Y2hFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBCb29sZWFuKGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGgpO1xufTtcbnZhciBpc01vdXNlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gQm9vbGVhbigoZXZlbnQuY2xpZW50WCB8fCBldmVudC5jbGllbnRYID09PSAwKSAmJlxuICAgICAgICAoZXZlbnQuY2xpZW50WSB8fCBldmVudC5jbGllbnRZID09PSAwKSk7XG59O1xudmFyIGZpbmRDbG9zZXN0U25hcCA9IGZ1bmN0aW9uIChuLCBzbmFwQXJyYXksIHNuYXBHYXApIHtcbiAgICBpZiAoc25hcEdhcCA9PT0gdm9pZCAwKSB7IHNuYXBHYXAgPSAwOyB9XG4gICAgdmFyIGNsb3Nlc3RHYXBJbmRleCA9IHNuYXBBcnJheS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIsIGluZGV4KSB7IHJldHVybiAoTWF0aC5hYnMoY3VyciAtIG4pIDwgTWF0aC5hYnMoc25hcEFycmF5W3ByZXZdIC0gbikgPyBpbmRleCA6IHByZXYpOyB9LCAwKTtcbiAgICB2YXIgZ2FwID0gTWF0aC5hYnMoc25hcEFycmF5W2Nsb3Nlc3RHYXBJbmRleF0gLSBuKTtcbiAgICByZXR1cm4gc25hcEdhcCA9PT0gMCB8fCBnYXAgPCBzbmFwR2FwID8gc25hcEFycmF5W2Nsb3Nlc3RHYXBJbmRleF0gOiBuO1xufTtcbnZhciBnZXRTdHJpbmdTaXplID0gZnVuY3Rpb24gKG4pIHtcbiAgICBuID0gbi50b1N0cmluZygpO1xuICAgIGlmIChuID09PSAnYXV0bycpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChuLmVuZHNXaXRoKCdweCcpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAobi5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAobi5lbmRzV2l0aCgndmgnKSkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgaWYgKG4uZW5kc1dpdGgoJ3Z3JykpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChuLmVuZHNXaXRoKCd2bWF4JykpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChuLmVuZHNXaXRoKCd2bWluJykpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIHJldHVybiBuICsgXCJweFwiO1xufTtcbnZhciBnZXRQaXhlbFNpemUgPSBmdW5jdGlvbiAoc2l6ZSwgcGFyZW50U2l6ZSwgaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQpIHtcbiAgICBpZiAoc2l6ZSAmJiB0eXBlb2Ygc2l6ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHNpemUuZW5kc1dpdGgoJ3B4JykpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIoc2l6ZS5yZXBsYWNlKCdweCcsICcnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUuZW5kc1dpdGgoJyUnKSkge1xuICAgICAgICAgICAgdmFyIHJhdGlvID0gTnVtYmVyKHNpemUucmVwbGFjZSgnJScsICcnKSkgLyAxMDA7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50U2l6ZSAqIHJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXplLmVuZHNXaXRoKCd2dycpKSB7XG4gICAgICAgICAgICB2YXIgcmF0aW8gPSBOdW1iZXIoc2l6ZS5yZXBsYWNlKCd2dycsICcnKSkgLyAxMDA7XG4gICAgICAgICAgICByZXR1cm4gaW5uZXJXaWR0aCAqIHJhdGlvO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXplLmVuZHNXaXRoKCd2aCcpKSB7XG4gICAgICAgICAgICB2YXIgcmF0aW8gPSBOdW1iZXIoc2l6ZS5yZXBsYWNlKCd2aCcsICcnKSkgLyAxMDA7XG4gICAgICAgICAgICByZXR1cm4gaW5uZXJIZWlnaHQgKiByYXRpbztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn07XG52YXIgY2FsY3VsYXRlTmV3TWF4ID0gZnVuY3Rpb24gKHBhcmVudFNpemUsIGlubmVyV2lkdGgsIGlubmVySGVpZ2h0LCBtYXhXaWR0aCwgbWF4SGVpZ2h0LCBtaW5XaWR0aCwgbWluSGVpZ2h0KSB7XG4gICAgbWF4V2lkdGggPSBnZXRQaXhlbFNpemUobWF4V2lkdGgsIHBhcmVudFNpemUud2lkdGgsIGlubmVyV2lkdGgsIGlubmVySGVpZ2h0KTtcbiAgICBtYXhIZWlnaHQgPSBnZXRQaXhlbFNpemUobWF4SGVpZ2h0LCBwYXJlbnRTaXplLmhlaWdodCwgaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQpO1xuICAgIG1pbldpZHRoID0gZ2V0UGl4ZWxTaXplKG1pbldpZHRoLCBwYXJlbnRTaXplLndpZHRoLCBpbm5lcldpZHRoLCBpbm5lckhlaWdodCk7XG4gICAgbWluSGVpZ2h0ID0gZ2V0UGl4ZWxTaXplKG1pbkhlaWdodCwgcGFyZW50U2l6ZS5oZWlnaHQsIGlubmVyV2lkdGgsIGlubmVySGVpZ2h0KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBtYXhXaWR0aDogdHlwZW9mIG1heFdpZHRoID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE51bWJlcihtYXhXaWR0aCksXG4gICAgICAgIG1heEhlaWdodDogdHlwZW9mIG1heEhlaWdodCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBOdW1iZXIobWF4SGVpZ2h0KSxcbiAgICAgICAgbWluV2lkdGg6IHR5cGVvZiBtaW5XaWR0aCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBOdW1iZXIobWluV2lkdGgpLFxuICAgICAgICBtaW5IZWlnaHQ6IHR5cGVvZiBtaW5IZWlnaHQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogTnVtYmVyKG1pbkhlaWdodCksXG4gICAgfTtcbn07XG4vKipcbiAqIHRyYW5zZm9ybSBUIHwgW1QsIFRdIHRvIFtULCBUXVxuICogQHBhcmFtIHZhbFxuICogQHJldHVybnNcbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG52YXIgbm9ybWFsaXplVG9QYWlyID0gZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gKEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWwsIHZhbF0pOyB9O1xudmFyIGRlZmluZWRQcm9wcyA9IFtcbiAgICAnYXMnLFxuICAgICdyZWYnLFxuICAgICdzdHlsZScsXG4gICAgJ2NsYXNzTmFtZScsXG4gICAgJ2dyaWQnLFxuICAgICdzbmFwJyxcbiAgICAnYm91bmRzJyxcbiAgICAnYm91bmRzQnlEaXJlY3Rpb24nLFxuICAgICdzaXplJyxcbiAgICAnZGVmYXVsdFNpemUnLFxuICAgICdtaW5XaWR0aCcsXG4gICAgJ21pbkhlaWdodCcsXG4gICAgJ21heFdpZHRoJyxcbiAgICAnbWF4SGVpZ2h0JyxcbiAgICAnbG9ja0FzcGVjdFJhdGlvJyxcbiAgICAnbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aCcsXG4gICAgJ2xvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0JyxcbiAgICAnZW5hYmxlJyxcbiAgICAnaGFuZGxlU3R5bGVzJyxcbiAgICAnaGFuZGxlQ2xhc3NlcycsXG4gICAgJ2hhbmRsZVdyYXBwZXJTdHlsZScsXG4gICAgJ2hhbmRsZVdyYXBwZXJDbGFzcycsXG4gICAgJ2NoaWxkcmVuJyxcbiAgICAnb25SZXNpemVTdGFydCcsXG4gICAgJ29uUmVzaXplJyxcbiAgICAnb25SZXNpemVTdG9wJyxcbiAgICAnaGFuZGxlQ29tcG9uZW50JyxcbiAgICAnc2NhbGUnLFxuICAgICdyZXNpemVSYXRpbycsXG4gICAgJ3NuYXBHYXAnLFxuXTtcbi8vIEhBQ0s6IFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjYWxjdWxhdGUgJSBzaXplLlxudmFyIGJhc2VDbGFzc05hbWUgPSAnX19yZXNpemFibGVfYmFzZV9fJztcbnZhciBSZXNpemFibGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlc2l6YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZXNpemFibGUocHJvcHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucmF0aW8gPSAxO1xuICAgICAgICBfdGhpcy5yZXNpemFibGUgPSBudWxsO1xuICAgICAgICAvLyBGb3IgcGFyZW50IGJvdW5kYXJ5XG4gICAgICAgIF90aGlzLnBhcmVudExlZnQgPSAwO1xuICAgICAgICBfdGhpcy5wYXJlbnRUb3AgPSAwO1xuICAgICAgICAvLyBGb3IgYm91bmRhcnlcbiAgICAgICAgX3RoaXMucmVzaXphYmxlTGVmdCA9IDA7XG4gICAgICAgIF90aGlzLnJlc2l6YWJsZVJpZ2h0ID0gMDtcbiAgICAgICAgX3RoaXMucmVzaXphYmxlVG9wID0gMDtcbiAgICAgICAgX3RoaXMucmVzaXphYmxlQm90dG9tID0gMDtcbiAgICAgICAgLy8gRm9yIHRhcmdldCBib3VuZGFyeVxuICAgICAgICBfdGhpcy50YXJnZXRMZWZ0ID0gMDtcbiAgICAgICAgX3RoaXMudGFyZ2V0VG9wID0gMDtcbiAgICAgICAgX3RoaXMuYXBwZW5kQmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghX3RoaXMucmVzaXphYmxlIHx8ICFfdGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBfdGhpcy5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMud2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICdzY2FsZSgwLCAwKSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmZsZXggPSAnMCAwIDEwMCUnO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGJhc2VDbGFzc05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gYmFzZUNsYXNzTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5yZW1vdmVCYXNlID0gZnVuY3Rpb24gKGJhc2UpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBfdGhpcy5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoYmFzZSk7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgICAgICB3aWR0aDogKF9iID0gKF9hID0gX3RoaXMucHJvcHNTaXplKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eud2lkdGgpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICdhdXRvJyxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gKF9jID0gX3RoaXMucHJvcHNTaXplKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnYXV0bycsXG4gICAgICAgICAgICBkaXJlY3Rpb246ICdyaWdodCcsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmFja2dyb3VuZFN0eWxlOiB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsMCwwLDApJyxcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgICAgIHpJbmRleDogOTk5OSxcbiAgICAgICAgICAgICAgICB0b3A6ICcwJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICcwJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmbGV4QmFzaXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMub25SZXNpemVTdGFydCA9IF90aGlzLm9uUmVzaXplU3RhcnQuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uTW91c2VNb3ZlID0gX3RoaXMub25Nb3VzZU1vdmUuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uTW91c2VVcCA9IF90aGlzLm9uTW91c2VVcC5iaW5kKF90aGlzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVzaXphYmxlLnByb3RvdHlwZSwgXCJwYXJlbnROb2RlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNpemFibGUucGFyZW50Tm9kZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNpemFibGUucHJvdG90eXBlLCBcIndpbmRvd1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZS5vd25lckRvY3VtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNpemFibGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNpemFibGUucHJvdG90eXBlLCBcInByb3BzU2l6ZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2l6ZSB8fCB0aGlzLnByb3BzLmRlZmF1bHRTaXplIHx8IERFRkFVTFRfU0laRTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNpemFibGUucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IDA7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6YWJsZSAmJiB0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgICAgIHZhciBvcmdXaWR0aCA9IHRoaXMucmVzaXphYmxlLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgIHZhciBvcmdIZWlnaHQgPSB0aGlzLnJlc2l6YWJsZS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgLy8gSEFDSzogU2V0IHBvc2l0aW9uIGByZWxhdGl2ZWAgdG8gZ2V0IHBhcmVudCBzaXplLlxuICAgICAgICAgICAgICAgIC8vICAgICAgIFRoaXMgaXMgYmVjYXVzZSB3aGVuIHJlLXJlc2l6YWJsZSBzZXQgYGFic29sdXRlYCwgSSBjYW4gbm90IGdldCBiYXNlIHdpZHRoIGNvcnJlY3RseS5cbiAgICAgICAgICAgICAgICB2YXIgb3JnUG9zaXRpb24gPSB0aGlzLnJlc2l6YWJsZS5zdHlsZS5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAob3JnUG9zaXRpb24gIT09ICdyZWxhdGl2ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemFibGUuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJTkZPOiBVc2Ugb3JpZ2luYWwgd2lkdGggb3IgaGVpZ2h0IGlmIHNldCBhdXRvLlxuICAgICAgICAgICAgICAgIHdpZHRoID0gdGhpcy5yZXNpemFibGUuc3R5bGUud2lkdGggIT09ICdhdXRvJyA/IHRoaXMucmVzaXphYmxlLm9mZnNldFdpZHRoIDogb3JnV2lkdGg7XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5yZXNpemFibGUuc3R5bGUuaGVpZ2h0ICE9PSAnYXV0bycgPyB0aGlzLnJlc2l6YWJsZS5vZmZzZXRIZWlnaHQgOiBvcmdIZWlnaHQ7XG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBwb3NpdGlvblxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXphYmxlLnN0eWxlLnBvc2l0aW9uID0gb3JnUG9zaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVzaXphYmxlLnByb3RvdHlwZSwgXCJzaXplU3R5bGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZTtcbiAgICAgICAgICAgIHZhciBnZXRTaXplID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIF90aGlzLnN0YXRlW2tleV0gPT09ICd1bmRlZmluZWQnIHx8IF90aGlzLnN0YXRlW2tleV0gPT09ICdhdXRvJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2F1dG8nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMucHJvcHNTaXplICYmIF90aGlzLnByb3BzU2l6ZVtrZXldICYmICgoX2EgPSBfdGhpcy5wcm9wc1NpemVba2V5XSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkuZW5kc1dpdGgoJyUnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLnN0YXRlW2tleV0udG9TdHJpbmcoKS5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuc3RhdGVba2V5XS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTaXplID0gX3RoaXMuZ2V0UGFyZW50U2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBOdW1iZXIoX3RoaXMuc3RhdGVba2V5XS50b1N0cmluZygpLnJlcGxhY2UoJ3B4JywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSAodmFsdWUgLyBwYXJlbnRTaXplW2tleV0pICogMTAwO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGVyY2VudCArIFwiJVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3RyaW5nU2l6ZShfdGhpcy5zdGF0ZVtrZXldKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgd2lkdGggPSBzaXplICYmIHR5cGVvZiBzaXplLndpZHRoICE9PSAndW5kZWZpbmVkJyAmJiAhdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nXG4gICAgICAgICAgICAgICAgPyBnZXRTdHJpbmdTaXplKHNpemUud2lkdGgpXG4gICAgICAgICAgICAgICAgOiBnZXRTaXplKCd3aWR0aCcpO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHNpemUgJiYgdHlwZW9mIHNpemUuaGVpZ2h0ICE9PSAndW5kZWZpbmVkJyAmJiAhdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nXG4gICAgICAgICAgICAgICAgPyBnZXRTdHJpbmdTaXplKHNpemUuaGVpZ2h0KVxuICAgICAgICAgICAgICAgIDogZ2V0U2l6ZSgnaGVpZ2h0Jyk7XG4gICAgICAgICAgICByZXR1cm4geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmdldFBhcmVudFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2luZG93KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHRoaXMud2luZG93LmlubmVyV2lkdGgsIGhlaWdodDogdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmFzZSA9IHRoaXMuYXBwZW5kQmFzZSgpO1xuICAgICAgICBpZiAoIWJhc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJTkZPOiBUbyBjYWxjdWxhdGUgcGFyZW50IHdpZHRoIHdpdGggZmxleCBsYXlvdXRcbiAgICAgICAgdmFyIHdyYXBDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHZhciB3cmFwID0gdGhpcy5wYXJlbnROb2RlLnN0eWxlLmZsZXhXcmFwO1xuICAgICAgICBpZiAod3JhcCAhPT0gJ3dyYXAnKSB7XG4gICAgICAgICAgICB3cmFwQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUuc3R5bGUuZmxleFdyYXAgPSAnd3JhcCc7XG4gICAgICAgICAgICAvLyBIQUNLOiBVc2UgcmVsYXRpdmUgdG8gZ2V0IHBhcmVudCBwYWRkaW5nIHNpemVcbiAgICAgICAgfVxuICAgICAgICBiYXNlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgYmFzZS5zdHlsZS5taW5XaWR0aCA9ICcxMDAlJztcbiAgICAgICAgYmFzZS5zdHlsZS5taW5IZWlnaHQgPSAnMTAwJSc7XG4gICAgICAgIHZhciBzaXplID0ge1xuICAgICAgICAgICAgd2lkdGg6IGJhc2Uub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGJhc2Uub2Zmc2V0SGVpZ2h0LFxuICAgICAgICB9O1xuICAgICAgICBpZiAod3JhcENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5zdHlsZS5mbGV4V3JhcCA9IHdyYXA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVCYXNlKGJhc2UpO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMud2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSwge1xuICAgICAgICAgICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICAgICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLnVuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMud2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSB8fCAhdGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IHRoaXMud2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5yZXNpemFibGUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnN0YXRlLndpZHRoIHx8IHRoaXMuc2l6ZS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5zdGF0ZS5oZWlnaHQgfHwgdGhpcy5zaXplLmhlaWdodCxcbiAgICAgICAgICAgIGZsZXhCYXNpczogY29tcHV0ZWRTdHlsZS5mbGV4QmFzaXMgIT09ICdhdXRvJyA/IGNvbXB1dGVkU3R5bGUuZmxleEJhc2lzIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgdGhpcy51bmJpbmRFdmVudHMoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5jcmVhdGVTaXplRm9yQ3NzUHJvcGVydHkgPSBmdW5jdGlvbiAobmV3U2l6ZSwga2luZCkge1xuICAgICAgICB2YXIgcHJvcHNTaXplID0gdGhpcy5wcm9wc1NpemUgJiYgdGhpcy5wcm9wc1NpemVba2luZF07XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlW2tpbmRdID09PSAnYXV0bycgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUub3JpZ2luYWxba2luZF0gPT09IG5ld1NpemUgJiZcbiAgICAgICAgICAgICh0eXBlb2YgcHJvcHNTaXplID09PSAndW5kZWZpbmVkJyB8fCBwcm9wc1NpemUgPT09ICdhdXRvJylcbiAgICAgICAgICAgID8gJ2F1dG8nXG4gICAgICAgICAgICA6IG5ld1NpemU7XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmNhbGN1bGF0ZU5ld01heEZyb21Cb3VuZGFyeSA9IGZ1bmN0aW9uIChtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBib3VuZHNCeURpcmVjdGlvbiA9IHRoaXMucHJvcHMuYm91bmRzQnlEaXJlY3Rpb247XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSB0aGlzLnN0YXRlLmRpcmVjdGlvbjtcbiAgICAgICAgdmFyIHdpZHRoQnlEaXJlY3Rpb24gPSBib3VuZHNCeURpcmVjdGlvbiAmJiBoYXNEaXJlY3Rpb24oJ2xlZnQnLCBkaXJlY3Rpb24pO1xuICAgICAgICB2YXIgaGVpZ2h0QnlEaXJlY3Rpb24gPSBib3VuZHNCeURpcmVjdGlvbiAmJiBoYXNEaXJlY3Rpb24oJ3RvcCcsIGRpcmVjdGlvbik7XG4gICAgICAgIHZhciBib3VuZFdpZHRoO1xuICAgICAgICB2YXIgYm91bmRIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gJ3BhcmVudCcpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRfMSkge1xuICAgICAgICAgICAgICAgIGJvdW5kV2lkdGggPSB3aWR0aEJ5RGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZXNpemFibGVSaWdodCAtIHRoaXMucGFyZW50TGVmdFxuICAgICAgICAgICAgICAgICAgICA6IHBhcmVudF8xLm9mZnNldFdpZHRoICsgKHRoaXMucGFyZW50TGVmdCAtIHRoaXMucmVzaXphYmxlTGVmdCk7XG4gICAgICAgICAgICAgICAgYm91bmRIZWlnaHQgPSBoZWlnaHRCeURpcmVjdGlvblxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMucmVzaXphYmxlQm90dG9tIC0gdGhpcy5wYXJlbnRUb3BcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJlbnRfMS5vZmZzZXRIZWlnaHQgKyAodGhpcy5wYXJlbnRUb3AgLSB0aGlzLnJlc2l6YWJsZVRvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgICAgICBib3VuZFdpZHRoID0gd2lkdGhCeURpcmVjdGlvbiA/IHRoaXMucmVzaXphYmxlUmlnaHQgOiB0aGlzLndpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy5yZXNpemFibGVMZWZ0O1xuICAgICAgICAgICAgICAgIGJvdW5kSGVpZ2h0ID0gaGVpZ2h0QnlEaXJlY3Rpb24gPyB0aGlzLnJlc2l6YWJsZUJvdHRvbSA6IHRoaXMud2luZG93LmlubmVySGVpZ2h0IC0gdGhpcy5yZXNpemFibGVUb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIGJvdW5kV2lkdGggPSB3aWR0aEJ5RGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgPyB0aGlzLnJlc2l6YWJsZVJpZ2h0IC0gdGhpcy50YXJnZXRMZWZ0XG4gICAgICAgICAgICAgICAgOiB0aGlzLnByb3BzLmJvdW5kcy5vZmZzZXRXaWR0aCArICh0aGlzLnRhcmdldExlZnQgLSB0aGlzLnJlc2l6YWJsZUxlZnQpO1xuICAgICAgICAgICAgYm91bmRIZWlnaHQgPSBoZWlnaHRCeURpcmVjdGlvblxuICAgICAgICAgICAgICAgID8gdGhpcy5yZXNpemFibGVCb3R0b20gLSB0aGlzLnRhcmdldFRvcFxuICAgICAgICAgICAgICAgIDogdGhpcy5wcm9wcy5ib3VuZHMub2Zmc2V0SGVpZ2h0ICsgKHRoaXMudGFyZ2V0VG9wIC0gdGhpcy5yZXNpemFibGVUb3ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChib3VuZFdpZHRoICYmIE51bWJlci5pc0Zpbml0ZShib3VuZFdpZHRoKSkge1xuICAgICAgICAgICAgbWF4V2lkdGggPSBtYXhXaWR0aCAmJiBtYXhXaWR0aCA8IGJvdW5kV2lkdGggPyBtYXhXaWR0aCA6IGJvdW5kV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJvdW5kSGVpZ2h0ICYmIE51bWJlci5pc0Zpbml0ZShib3VuZEhlaWdodCkpIHtcbiAgICAgICAgICAgIG1heEhlaWdodCA9IG1heEhlaWdodCAmJiBtYXhIZWlnaHQgPCBib3VuZEhlaWdodCA/IG1heEhlaWdodCA6IGJvdW5kSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1heFdpZHRoOiBtYXhXaWR0aCwgbWF4SGVpZ2h0OiBtYXhIZWlnaHQgfTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuY2FsY3VsYXRlTmV3U2l6ZUZyb21EaXJlY3Rpb24gPSBmdW5jdGlvbiAoY2xpZW50WCwgY2xpZW50WSkge1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLnByb3BzLnNjYWxlIHx8IDE7XG4gICAgICAgIHZhciBfYSA9IG5vcm1hbGl6ZVRvUGFpcih0aGlzLnByb3BzLnJlc2l6ZVJhdGlvIHx8IDEpLCByZXNpemVSYXRpb1ggPSBfYVswXSwgcmVzaXplUmF0aW9ZID0gX2FbMV07XG4gICAgICAgIHZhciBfYiA9IHRoaXMuc3RhdGUsIGRpcmVjdGlvbiA9IF9iLmRpcmVjdGlvbiwgb3JpZ2luYWwgPSBfYi5vcmlnaW5hbDtcbiAgICAgICAgdmFyIF9jID0gdGhpcy5wcm9wcywgbG9ja0FzcGVjdFJhdGlvID0gX2MubG9ja0FzcGVjdFJhdGlvLCBsb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodCA9IF9jLmxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0LCBsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoID0gX2MubG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aDtcbiAgICAgICAgdmFyIG5ld1dpZHRoID0gb3JpZ2luYWwud2lkdGg7XG4gICAgICAgIHZhciBuZXdIZWlnaHQgPSBvcmlnaW5hbC5oZWlnaHQ7XG4gICAgICAgIHZhciBleHRyYUhlaWdodCA9IGxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0IHx8IDA7XG4gICAgICAgIHZhciBleHRyYVdpZHRoID0gbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aCB8fCAwO1xuICAgICAgICBpZiAoaGFzRGlyZWN0aW9uKCdyaWdodCcsIGRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gb3JpZ2luYWwud2lkdGggKyAoKGNsaWVudFggLSBvcmlnaW5hbC54KSAqIHJlc2l6ZVJhdGlvWCkgLyBzY2FsZTtcbiAgICAgICAgICAgIGlmIChsb2NrQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSAobmV3V2lkdGggLSBleHRyYVdpZHRoKSAvIHRoaXMucmF0aW8gKyBleHRyYUhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzRGlyZWN0aW9uKCdsZWZ0JywgZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgbmV3V2lkdGggPSBvcmlnaW5hbC53aWR0aCAtICgoY2xpZW50WCAtIG9yaWdpbmFsLngpICogcmVzaXplUmF0aW9YKSAvIHNjYWxlO1xuICAgICAgICAgICAgaWYgKGxvY2tBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IChuZXdXaWR0aCAtIGV4dHJhV2lkdGgpIC8gdGhpcy5yYXRpbyArIGV4dHJhSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNEaXJlY3Rpb24oJ2JvdHRvbScsIGRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IG9yaWdpbmFsLmhlaWdodCArICgoY2xpZW50WSAtIG9yaWdpbmFsLnkpICogcmVzaXplUmF0aW9ZKSAvIHNjYWxlO1xuICAgICAgICAgICAgaWYgKGxvY2tBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gKG5ld0hlaWdodCAtIGV4dHJhSGVpZ2h0KSAqIHRoaXMucmF0aW8gKyBleHRyYVdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNEaXJlY3Rpb24oJ3RvcCcsIGRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IG9yaWdpbmFsLmhlaWdodCAtICgoY2xpZW50WSAtIG9yaWdpbmFsLnkpICogcmVzaXplUmF0aW9ZKSAvIHNjYWxlO1xuICAgICAgICAgICAgaWYgKGxvY2tBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gKG5ld0hlaWdodCAtIGV4dHJhSGVpZ2h0KSAqIHRoaXMucmF0aW8gKyBleHRyYVdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5ld1dpZHRoOiBuZXdXaWR0aCwgbmV3SGVpZ2h0OiBuZXdIZWlnaHQgfTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuY2FsY3VsYXRlTmV3U2l6ZUZyb21Bc3BlY3RSYXRpbyA9IGZ1bmN0aW9uIChuZXdXaWR0aCwgbmV3SGVpZ2h0LCBtYXgsIG1pbikge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBsb2NrQXNwZWN0UmF0aW8gPSBfYS5sb2NrQXNwZWN0UmF0aW8sIGxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0ID0gX2EubG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQsIGxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGggPSBfYS5sb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoO1xuICAgICAgICB2YXIgY29tcHV0ZWRNaW5XaWR0aCA9IHR5cGVvZiBtaW4ud2lkdGggPT09ICd1bmRlZmluZWQnID8gMTAgOiBtaW4ud2lkdGg7XG4gICAgICAgIHZhciBjb21wdXRlZE1heFdpZHRoID0gdHlwZW9mIG1heC53aWR0aCA9PT0gJ3VuZGVmaW5lZCcgfHwgbWF4LndpZHRoIDwgMCA/IG5ld1dpZHRoIDogbWF4LndpZHRoO1xuICAgICAgICB2YXIgY29tcHV0ZWRNaW5IZWlnaHQgPSB0eXBlb2YgbWluLmhlaWdodCA9PT0gJ3VuZGVmaW5lZCcgPyAxMCA6IG1pbi5oZWlnaHQ7XG4gICAgICAgIHZhciBjb21wdXRlZE1heEhlaWdodCA9IHR5cGVvZiBtYXguaGVpZ2h0ID09PSAndW5kZWZpbmVkJyB8fCBtYXguaGVpZ2h0IDwgMCA/IG5ld0hlaWdodCA6IG1heC5oZWlnaHQ7XG4gICAgICAgIHZhciBleHRyYUhlaWdodCA9IGxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0IHx8IDA7XG4gICAgICAgIHZhciBleHRyYVdpZHRoID0gbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aCB8fCAwO1xuICAgICAgICBpZiAobG9ja0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICB2YXIgZXh0cmFNaW5XaWR0aCA9IChjb21wdXRlZE1pbkhlaWdodCAtIGV4dHJhSGVpZ2h0KSAqIHRoaXMucmF0aW8gKyBleHRyYVdpZHRoO1xuICAgICAgICAgICAgdmFyIGV4dHJhTWF4V2lkdGggPSAoY29tcHV0ZWRNYXhIZWlnaHQgLSBleHRyYUhlaWdodCkgKiB0aGlzLnJhdGlvICsgZXh0cmFXaWR0aDtcbiAgICAgICAgICAgIHZhciBleHRyYU1pbkhlaWdodCA9IChjb21wdXRlZE1pbldpZHRoIC0gZXh0cmFXaWR0aCkgLyB0aGlzLnJhdGlvICsgZXh0cmFIZWlnaHQ7XG4gICAgICAgICAgICB2YXIgZXh0cmFNYXhIZWlnaHQgPSAoY29tcHV0ZWRNYXhXaWR0aCAtIGV4dHJhV2lkdGgpIC8gdGhpcy5yYXRpbyArIGV4dHJhSGVpZ2h0O1xuICAgICAgICAgICAgdmFyIGxvY2tlZE1pbldpZHRoID0gTWF0aC5tYXgoY29tcHV0ZWRNaW5XaWR0aCwgZXh0cmFNaW5XaWR0aCk7XG4gICAgICAgICAgICB2YXIgbG9ja2VkTWF4V2lkdGggPSBNYXRoLm1pbihjb21wdXRlZE1heFdpZHRoLCBleHRyYU1heFdpZHRoKTtcbiAgICAgICAgICAgIHZhciBsb2NrZWRNaW5IZWlnaHQgPSBNYXRoLm1heChjb21wdXRlZE1pbkhlaWdodCwgZXh0cmFNaW5IZWlnaHQpO1xuICAgICAgICAgICAgdmFyIGxvY2tlZE1heEhlaWdodCA9IE1hdGgubWluKGNvbXB1dGVkTWF4SGVpZ2h0LCBleHRyYU1heEhlaWdodCk7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IGNsYW1wKG5ld1dpZHRoLCBsb2NrZWRNaW5XaWR0aCwgbG9ja2VkTWF4V2lkdGgpO1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gY2xhbXAobmV3SGVpZ2h0LCBsb2NrZWRNaW5IZWlnaHQsIGxvY2tlZE1heEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IGNsYW1wKG5ld1dpZHRoLCBjb21wdXRlZE1pbldpZHRoLCBjb21wdXRlZE1heFdpZHRoKTtcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IGNsYW1wKG5ld0hlaWdodCwgY29tcHV0ZWRNaW5IZWlnaHQsIGNvbXB1dGVkTWF4SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuZXdXaWR0aDogbmV3V2lkdGgsIG5ld0hlaWdodDogbmV3SGVpZ2h0IH07XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLnNldEJvdW5kaW5nQ2xpZW50UmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gRm9yIHBhcmVudCBib3VuZGFyeVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09ICdwYXJlbnQnKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50XzIgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAocGFyZW50XzIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50UmVjdCA9IHBhcmVudF8yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TGVmdCA9IHBhcmVudFJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFRvcCA9IHBhcmVudFJlY3QudG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZvciB0YXJnZXQoaHRtbCBlbGVtZW50KSBib3VuZGFyeVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMgJiYgdHlwZW9mIHRoaXMucHJvcHMuYm91bmRzICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIHRhcmdldFJlY3QgPSB0aGlzLnByb3BzLmJvdW5kcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0TGVmdCA9IHRhcmdldFJlY3QubGVmdDtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0VG9wID0gdGFyZ2V0UmVjdC50b3A7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIGJvdW5kYXJ5XG4gICAgICAgIGlmICh0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5yZXNpemFibGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGxlZnQgPSBfYS5sZWZ0LCB0b3BfMSA9IF9hLnRvcCwgcmlnaHQgPSBfYS5yaWdodCwgYm90dG9tID0gX2EuYm90dG9tO1xuICAgICAgICAgICAgdGhpcy5yZXNpemFibGVMZWZ0ID0gbGVmdDtcbiAgICAgICAgICAgIHRoaXMucmVzaXphYmxlUmlnaHQgPSByaWdodDtcbiAgICAgICAgICAgIHRoaXMucmVzaXphYmxlVG9wID0gdG9wXzE7XG4gICAgICAgICAgICB0aGlzLnJlc2l6YWJsZUJvdHRvbSA9IGJvdHRvbTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5vblJlc2l6ZVN0YXJ0ID0gZnVuY3Rpb24gKGV2ZW50LCBkaXJlY3Rpb24pIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSB8fCAhdGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2xpZW50WCA9IDA7XG4gICAgICAgIHZhciBjbGllbnRZID0gMDtcbiAgICAgICAgaWYgKGV2ZW50Lm5hdGl2ZUV2ZW50ICYmIGlzTW91c2VFdmVudChldmVudC5uYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgIGNsaWVudFggPSBldmVudC5uYXRpdmVFdmVudC5jbGllbnRYO1xuICAgICAgICAgICAgY2xpZW50WSA9IGV2ZW50Lm5hdGl2ZUV2ZW50LmNsaWVudFk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZlbnQubmF0aXZlRXZlbnQgJiYgaXNUb3VjaEV2ZW50KGV2ZW50Lm5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAgICAgY2xpZW50WCA9IGV2ZW50Lm5hdGl2ZUV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgICAgICAgIGNsaWVudFkgPSBldmVudC5uYXRpdmVFdmVudC50b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25SZXNpemVTdGFydCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0UmVzaXplID0gdGhpcy5wcm9wcy5vblJlc2l6ZVN0YXJ0KGV2ZW50LCBkaXJlY3Rpb24sIHRoaXMucmVzaXphYmxlKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRSZXNpemUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRml4ICMxNjhcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc2l6ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNpemUuaGVpZ2h0ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnByb3BzLnNpemUuaGVpZ2h0ICE9PSB0aGlzLnN0YXRlLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBoZWlnaHQ6IHRoaXMucHJvcHMuc2l6ZS5oZWlnaHQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuc2l6ZS53aWR0aCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wcm9wcy5zaXplLndpZHRoICE9PSB0aGlzLnN0YXRlLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHdpZHRoOiB0aGlzLnByb3BzLnNpemUud2lkdGggfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIGxvY2tBc3BlY3RSYXRpbyBjYXNlXG4gICAgICAgIHRoaXMucmF0aW8gPVxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvID09PSAnbnVtYmVyJyA/IHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvIDogdGhpcy5zaXplLndpZHRoIC8gdGhpcy5zaXplLmhlaWdodDtcbiAgICAgICAgdmFyIGZsZXhCYXNpcztcbiAgICAgICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB0aGlzLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMucmVzaXphYmxlKTtcbiAgICAgICAgaWYgKGNvbXB1dGVkU3R5bGUuZmxleEJhc2lzICE9PSAnYXV0bycpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMyA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRfMykge1xuICAgICAgICAgICAgICAgIHZhciBkaXIgPSB0aGlzLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudF8zKS5mbGV4RGlyZWN0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuZmxleERpciA9IGRpci5zdGFydHNXaXRoKCdyb3cnKSA/ICdyb3cnIDogJ2NvbHVtbic7XG4gICAgICAgICAgICAgICAgZmxleEJhc2lzID0gY29tcHV0ZWRTdHlsZS5mbGV4QmFzaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIGJvdW5kYXJ5XG4gICAgICAgIHRoaXMuc2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICB2YXIgc3RhdGUgPSB7XG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICAgIHg6IGNsaWVudFgsXG4gICAgICAgICAgICAgICAgeTogY2xpZW50WSxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5zaXplLndpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5zaXplLmhlaWdodCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1Jlc2l6aW5nOiB0cnVlLFxuICAgICAgICAgICAgYmFja2dyb3VuZFN0eWxlOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5zdGF0ZS5iYWNrZ3JvdW5kU3R5bGUpLCB7IGN1cnNvcjogdGhpcy53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShldmVudC50YXJnZXQpLmN1cnNvciB8fCAnYXV0bycgfSksXG4gICAgICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgICAgICAgIGZsZXhCYXNpczogZmxleEJhc2lzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNldFN0YXRlKHN0YXRlKTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUub25Nb3VzZU1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmlzUmVzaXppbmcgfHwgIXRoaXMucmVzaXphYmxlIHx8ICF0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndpbmRvdy5Ub3VjaEV2ZW50ICYmIGlzVG91Y2hFdmVudChldmVudCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIG9uIGZhaWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBtYXhXaWR0aCA9IF9hLm1heFdpZHRoLCBtYXhIZWlnaHQgPSBfYS5tYXhIZWlnaHQsIG1pbldpZHRoID0gX2EubWluV2lkdGgsIG1pbkhlaWdodCA9IF9hLm1pbkhlaWdodDtcbiAgICAgICAgdmFyIGNsaWVudFggPSBpc1RvdWNoRXZlbnQoZXZlbnQpID8gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYIDogZXZlbnQuY2xpZW50WDtcbiAgICAgICAgdmFyIGNsaWVudFkgPSBpc1RvdWNoRXZlbnQoZXZlbnQpID8gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZIDogZXZlbnQuY2xpZW50WTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5zdGF0ZSwgZGlyZWN0aW9uID0gX2IuZGlyZWN0aW9uLCBvcmlnaW5hbCA9IF9iLm9yaWdpbmFsLCB3aWR0aCA9IF9iLndpZHRoLCBoZWlnaHQgPSBfYi5oZWlnaHQ7XG4gICAgICAgIHZhciBwYXJlbnRTaXplID0gdGhpcy5nZXRQYXJlbnRTaXplKCk7XG4gICAgICAgIHZhciBtYXggPSBjYWxjdWxhdGVOZXdNYXgocGFyZW50U2l6ZSwgdGhpcy53aW5kb3cuaW5uZXJXaWR0aCwgdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQsIG1pbldpZHRoLCBtaW5IZWlnaHQpO1xuICAgICAgICBtYXhXaWR0aCA9IG1heC5tYXhXaWR0aDtcbiAgICAgICAgbWF4SGVpZ2h0ID0gbWF4Lm1heEhlaWdodDtcbiAgICAgICAgbWluV2lkdGggPSBtYXgubWluV2lkdGg7XG4gICAgICAgIG1pbkhlaWdodCA9IG1heC5taW5IZWlnaHQ7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgc2l6ZVxuICAgICAgICB2YXIgX2MgPSB0aGlzLmNhbGN1bGF0ZU5ld1NpemVGcm9tRGlyZWN0aW9uKGNsaWVudFgsIGNsaWVudFkpLCBuZXdIZWlnaHQgPSBfYy5uZXdIZWlnaHQsIG5ld1dpZHRoID0gX2MubmV3V2lkdGg7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBtYXggc2l6ZSBmcm9tIGJvdW5kYXJ5IHNldHRpbmdzXG4gICAgICAgIHZhciBib3VuZGFyeU1heCA9IHRoaXMuY2FsY3VsYXRlTmV3TWF4RnJvbUJvdW5kYXJ5KG1heFdpZHRoLCBtYXhIZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5zbmFwICYmIHRoaXMucHJvcHMuc25hcC54KSB7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IGZpbmRDbG9zZXN0U25hcChuZXdXaWR0aCwgdGhpcy5wcm9wcy5zbmFwLngsIHRoaXMucHJvcHMuc25hcEdhcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc25hcCAmJiB0aGlzLnByb3BzLnNuYXAueSkge1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gZmluZENsb3Nlc3RTbmFwKG5ld0hlaWdodCwgdGhpcy5wcm9wcy5zbmFwLnksIHRoaXMucHJvcHMuc25hcEdhcCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzaXplIGZyb20gYXNwZWN0IHJhdGlvXG4gICAgICAgIHZhciBuZXdTaXplID0gdGhpcy5jYWxjdWxhdGVOZXdTaXplRnJvbUFzcGVjdFJhdGlvKG5ld1dpZHRoLCBuZXdIZWlnaHQsIHsgd2lkdGg6IGJvdW5kYXJ5TWF4Lm1heFdpZHRoLCBoZWlnaHQ6IGJvdW5kYXJ5TWF4Lm1heEhlaWdodCB9LCB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSk7XG4gICAgICAgIG5ld1dpZHRoID0gbmV3U2l6ZS5uZXdXaWR0aDtcbiAgICAgICAgbmV3SGVpZ2h0ID0gbmV3U2l6ZS5uZXdIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmdyaWQpIHtcbiAgICAgICAgICAgIHZhciBuZXdHcmlkV2lkdGggPSBzbmFwKG5ld1dpZHRoLCB0aGlzLnByb3BzLmdyaWRbMF0pO1xuICAgICAgICAgICAgdmFyIG5ld0dyaWRIZWlnaHQgPSBzbmFwKG5ld0hlaWdodCwgdGhpcy5wcm9wcy5ncmlkWzFdKTtcbiAgICAgICAgICAgIHZhciBnYXAgPSB0aGlzLnByb3BzLnNuYXBHYXAgfHwgMDtcbiAgICAgICAgICAgIHZhciB3ID0gZ2FwID09PSAwIHx8IE1hdGguYWJzKG5ld0dyaWRXaWR0aCAtIG5ld1dpZHRoKSA8PSBnYXAgPyBuZXdHcmlkV2lkdGggOiBuZXdXaWR0aDtcbiAgICAgICAgICAgIHZhciBoID0gZ2FwID09PSAwIHx8IE1hdGguYWJzKG5ld0dyaWRIZWlnaHQgLSBuZXdIZWlnaHQpIDw9IGdhcCA/IG5ld0dyaWRIZWlnaHQgOiBuZXdIZWlnaHQ7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IHc7XG4gICAgICAgICAgICBuZXdIZWlnaHQgPSBoO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZWx0YSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBuZXdXaWR0aCAtIG9yaWdpbmFsLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHQgLSBvcmlnaW5hbC5oZWlnaHQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh3aWR0aCAmJiB0eXBlb2Ygd2lkdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAod2lkdGguZW5kc1dpdGgoJyUnKSkge1xuICAgICAgICAgICAgICAgIHZhciBwZXJjZW50ID0gKG5ld1dpZHRoIC8gcGFyZW50U2l6ZS53aWR0aCkgKiAxMDA7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSBwZXJjZW50ICsgXCIlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3aWR0aC5lbmRzV2l0aCgndncnKSkge1xuICAgICAgICAgICAgICAgIHZhciB2dyA9IChuZXdXaWR0aCAvIHRoaXMud2luZG93LmlubmVyV2lkdGgpICogMTAwO1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gdncgKyBcInZ3XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3aWR0aC5lbmRzV2l0aCgndmgnKSkge1xuICAgICAgICAgICAgICAgIHZhciB2aCA9IChuZXdXaWR0aCAvIHRoaXMud2luZG93LmlubmVySGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHZoICsgXCJ2aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoZWlnaHQgJiYgdHlwZW9mIGhlaWdodCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChoZWlnaHQuZW5kc1dpdGgoJyUnKSkge1xuICAgICAgICAgICAgICAgIHZhciBwZXJjZW50ID0gKG5ld0hlaWdodCAvIHBhcmVudFNpemUuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBwZXJjZW50ICsgXCIlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoZWlnaHQuZW5kc1dpdGgoJ3Z3JykpIHtcbiAgICAgICAgICAgICAgICB2YXIgdncgPSAobmV3SGVpZ2h0IC8gdGhpcy53aW5kb3cuaW5uZXJXaWR0aCkgKiAxMDA7XG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gdncgKyBcInZ3XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoZWlnaHQuZW5kc1dpdGgoJ3ZoJykpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmggPSAobmV3SGVpZ2h0IC8gdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQpICogMTAwO1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IHZoICsgXCJ2aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLmNyZWF0ZVNpemVGb3JDc3NQcm9wZXJ0eShuZXdXaWR0aCwgJ3dpZHRoJyksXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuY3JlYXRlU2l6ZUZvckNzc1Byb3BlcnR5KG5ld0hlaWdodCwgJ2hlaWdodCcpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5mbGV4RGlyID09PSAncm93Jykge1xuICAgICAgICAgICAgbmV3U3RhdGUuZmxleEJhc2lzID0gbmV3U3RhdGUud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5mbGV4RGlyID09PSAnY29sdW1uJykge1xuICAgICAgICAgICAgbmV3U3RhdGUuZmxleEJhc2lzID0gbmV3U3RhdGUuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHZhciB3aWR0aENoYW5nZWQgPSB0aGlzLnN0YXRlLndpZHRoICE9PSBuZXdTdGF0ZS53aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodENoYW5nZWQgPSB0aGlzLnN0YXRlLmhlaWdodCAhPT0gbmV3U3RhdGUuaGVpZ2h0O1xuICAgICAgICB2YXIgZmxleEJhc2VDaGFuZ2VkID0gdGhpcy5zdGF0ZS5mbGV4QmFzaXMgIT09IG5ld1N0YXRlLmZsZXhCYXNpcztcbiAgICAgICAgdmFyIGNoYW5nZWQgPSB3aWR0aENoYW5nZWQgfHwgaGVpZ2h0Q2hhbmdlZCB8fCBmbGV4QmFzZUNoYW5nZWQ7XG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAvLyBGb3IgdjE4LCB1cGRhdGUgc3RhdGUgc3luY1xuICAgICAgICAgICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblJlc2l6ZSkge1xuICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uUmVzaXplKGV2ZW50LCBkaXJlY3Rpb24sIHRoaXMucmVzaXphYmxlLCBkZWx0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUub25Nb3VzZVVwID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBfYyA9IHRoaXMuc3RhdGUsIGlzUmVzaXppbmcgPSBfYy5pc1Jlc2l6aW5nLCBkaXJlY3Rpb24gPSBfYy5kaXJlY3Rpb24sIG9yaWdpbmFsID0gX2Mub3JpZ2luYWw7XG4gICAgICAgIGlmICghaXNSZXNpemluZyB8fCAhdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsdGEgPSB7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy5zaXplLndpZHRoIC0gb3JpZ2luYWwud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuc2l6ZS5oZWlnaHQgLSBvcmlnaW5hbC5oZWlnaHQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uUmVzaXplU3RvcCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vblJlc2l6ZVN0b3AoZXZlbnQsIGRpcmVjdGlvbiwgdGhpcy5yZXNpemFibGUsIGRlbHRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaXplKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgd2lkdGg6IChfYSA9IHRoaXMucHJvcHMuc2l6ZS53aWR0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJ2F1dG8nLCBoZWlnaHQ6IChfYiA9IHRoaXMucHJvcHMuc2l6ZS5oZWlnaHQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICdhdXRvJyB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzUmVzaXppbmc6IGZhbHNlLFxuICAgICAgICAgICAgYmFja2dyb3VuZFN0eWxlOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5zdGF0ZS5iYWNrZ3JvdW5kU3R5bGUpLCB7IGN1cnNvcjogJ2F1dG8nIH0pLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUudXBkYXRlU2l6ZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB3aWR0aDogKF9hID0gc2l6ZS53aWR0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJ2F1dG8nLCBoZWlnaHQ6IChfYiA9IHNpemUuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnYXV0bycgfSk7XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLnJlbmRlclJlc2l6ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIGVuYWJsZSA9IF9hLmVuYWJsZSwgaGFuZGxlU3R5bGVzID0gX2EuaGFuZGxlU3R5bGVzLCBoYW5kbGVDbGFzc2VzID0gX2EuaGFuZGxlQ2xhc3NlcywgaGFuZGxlV3JhcHBlclN0eWxlID0gX2EuaGFuZGxlV3JhcHBlclN0eWxlLCBoYW5kbGVXcmFwcGVyQ2xhc3MgPSBfYS5oYW5kbGVXcmFwcGVyQ2xhc3MsIGhhbmRsZUNvbXBvbmVudCA9IF9hLmhhbmRsZUNvbXBvbmVudDtcbiAgICAgICAgaWYgKCFlbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXNpemVycyA9IE9iamVjdC5rZXlzKGVuYWJsZSkubWFwKGZ1bmN0aW9uIChkaXIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVbZGlyXSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplciwgeyBrZXk6IGRpciwgZGlyZWN0aW9uOiBkaXIsIG9uUmVzaXplU3RhcnQ6IF90aGlzLm9uUmVzaXplU3RhcnQsIHJlcGxhY2VTdHlsZXM6IGhhbmRsZVN0eWxlcyAmJiBoYW5kbGVTdHlsZXNbZGlyXSwgY2xhc3NOYW1lOiBoYW5kbGVDbGFzc2VzICYmIGhhbmRsZUNsYXNzZXNbZGlyXSB9LCBoYW5kbGVDb21wb25lbnQgJiYgaGFuZGxlQ29tcG9uZW50W2Rpcl0gPyBoYW5kbGVDb21wb25lbnRbZGlyXSA6IG51bGwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gIzkzIFdyYXAgdGhlIHJlc2l6ZSBib3ggaW4gc3BhbiAod2lsbCBub3QgYnJlYWsgMTAwJSB3aWR0aC9oZWlnaHQpXG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogaGFuZGxlV3JhcHBlckNsYXNzLCBzdHlsZTogaGFuZGxlV3JhcHBlclN0eWxlIH0sIHJlc2l6ZXJzKSk7XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGV4dGVuZHNQcm9wcyA9IE9iamVjdC5rZXlzKHRoaXMucHJvcHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgICAgIGlmIChkZWZpbmVkUHJvcHMuaW5kZXhPZihrZXkpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY2Nba2V5XSA9IF90aGlzLnByb3BzW2tleV07XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHZhciBzdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHsgcG9zaXRpb246ICdyZWxhdGl2ZScsIHVzZXJTZWxlY3Q6IHRoaXMuc3RhdGUuaXNSZXNpemluZyA/ICdub25lJyA6ICdhdXRvJyB9LCB0aGlzLnByb3BzLnN0eWxlKSwgdGhpcy5zaXplU3R5bGUpLCB7IG1heFdpZHRoOiB0aGlzLnByb3BzLm1heFdpZHRoLCBtYXhIZWlnaHQ6IHRoaXMucHJvcHMubWF4SGVpZ2h0LCBtaW5XaWR0aDogdGhpcy5wcm9wcy5taW5XaWR0aCwgbWluSGVpZ2h0OiB0aGlzLnByb3BzLm1pbkhlaWdodCwgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsIGZsZXhTaHJpbms6IDAgfSk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmZsZXhCYXNpcykge1xuICAgICAgICAgICAgc3R5bGUuZmxleEJhc2lzID0gdGhpcy5zdGF0ZS5mbGV4QmFzaXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIFdyYXBwZXIgPSB0aGlzLnByb3BzLmFzIHx8ICdkaXYnO1xuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlciwgX19hc3NpZ24oeyBzdHlsZTogc3R5bGUsIGNsYXNzTmFtZTogdGhpcy5wcm9wcy5jbGFzc05hbWUgfSwgZXh0ZW5kc1Byb3BzLCB7IFxuICAgICAgICAgICAgLy8gYHJlZmAgaXMgYWZ0ZXIgYGV4dGVuZHNQcm9wc2AgdG8gZW5zdXJlIHRoaXMgb25lIHdpbnMgb3ZlciBhIHZlcnNpb25cbiAgICAgICAgICAgIC8vIHBhc3NlZCBpblxuICAgICAgICAgICAgcmVmOiBmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlc2l6YWJsZSA9IGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB9KSxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuaXNSZXNpemluZyAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgc3R5bGU6IHRoaXMuc3RhdGUuYmFja2dyb3VuZFN0eWxlIH0pLFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICAgIHRoaXMucmVuZGVyUmVzaXplcigpKSk7XG4gICAgfTtcbiAgICBSZXNpemFibGUuZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBhczogJ2RpdicsXG4gICAgICAgIG9uUmVzaXplU3RhcnQ6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25SZXNpemU6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25SZXNpemVTdG9wOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIGVuYWJsZToge1xuICAgICAgICAgICAgdG9wOiB0cnVlLFxuICAgICAgICAgICAgcmlnaHQ6IHRydWUsXG4gICAgICAgICAgICBib3R0b206IHRydWUsXG4gICAgICAgICAgICBsZWZ0OiB0cnVlLFxuICAgICAgICAgICAgdG9wUmlnaHQ6IHRydWUsXG4gICAgICAgICAgICBib3R0b21SaWdodDogdHJ1ZSxcbiAgICAgICAgICAgIGJvdHRvbUxlZnQ6IHRydWUsXG4gICAgICAgICAgICB0b3BMZWZ0OiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBzdHlsZToge30sXG4gICAgICAgIGdyaWQ6IFsxLCAxXSxcbiAgICAgICAgbG9ja0FzcGVjdFJhdGlvOiBmYWxzZSxcbiAgICAgICAgbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aDogMCxcbiAgICAgICAgbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQ6IDAsXG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgICByZXNpemVSYXRpbzogMSxcbiAgICAgICAgc25hcEdhcDogMCxcbiAgICB9O1xuICAgIHJldHVybiBSZXNpemFibGU7XG59KFJlYWN0LlB1cmVDb21wb25lbnQpKTtcbmV4cG9ydCB7IFJlc2l6YWJsZSB9O1xuIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgcm93U2l6ZUJhc2UgPSB7XG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICBoZWlnaHQ6ICcxMHB4JyxcbiAgICB0b3A6ICcwcHgnLFxuICAgIGxlZnQ6ICcwcHgnLFxuICAgIGN1cnNvcjogJ3Jvdy1yZXNpemUnLFxufTtcbnZhciBjb2xTaXplQmFzZSA9IHtcbiAgICB3aWR0aDogJzEwcHgnLFxuICAgIGhlaWdodDogJzEwMCUnLFxuICAgIHRvcDogJzBweCcsXG4gICAgbGVmdDogJzBweCcsXG4gICAgY3Vyc29yOiAnY29sLXJlc2l6ZScsXG59O1xudmFyIGVkZ2VCYXNlID0ge1xuICAgIHdpZHRoOiAnMjBweCcsXG4gICAgaGVpZ2h0OiAnMjBweCcsXG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG59O1xudmFyIHN0eWxlcyA9IHtcbiAgICB0b3A6IF9fYXNzaWduKF9fYXNzaWduKHt9LCByb3dTaXplQmFzZSksIHsgdG9wOiAnLTVweCcgfSksXG4gICAgcmlnaHQ6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb2xTaXplQmFzZSksIHsgbGVmdDogdW5kZWZpbmVkLCByaWdodDogJy01cHgnIH0pLFxuICAgIGJvdHRvbTogX19hc3NpZ24oX19hc3NpZ24oe30sIHJvd1NpemVCYXNlKSwgeyB0b3A6IHVuZGVmaW5lZCwgYm90dG9tOiAnLTVweCcgfSksXG4gICAgbGVmdDogX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbFNpemVCYXNlKSwgeyBsZWZ0OiAnLTVweCcgfSksXG4gICAgdG9wUmlnaHQ6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBlZGdlQmFzZSksIHsgcmlnaHQ6ICctMTBweCcsIHRvcDogJy0xMHB4JywgY3Vyc29yOiAnbmUtcmVzaXplJyB9KSxcbiAgICBib3R0b21SaWdodDogX19hc3NpZ24oX19hc3NpZ24oe30sIGVkZ2VCYXNlKSwgeyByaWdodDogJy0xMHB4JywgYm90dG9tOiAnLTEwcHgnLCBjdXJzb3I6ICdzZS1yZXNpemUnIH0pLFxuICAgIGJvdHRvbUxlZnQ6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBlZGdlQmFzZSksIHsgbGVmdDogJy0xMHB4JywgYm90dG9tOiAnLTEwcHgnLCBjdXJzb3I6ICdzdy1yZXNpemUnIH0pLFxuICAgIHRvcExlZnQ6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBlZGdlQmFzZSksIHsgbGVmdDogJy0xMHB4JywgdG9wOiAnLTEwcHgnLCBjdXJzb3I6ICdudy1yZXNpemUnIH0pLFxufTtcbnZhciBSZXNpemVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZXNpemVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlc2l6ZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vbk1vdXNlRG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBfdGhpcy5wcm9wcy5vblJlc2l6ZVN0YXJ0KGUsIF90aGlzLnByb3BzLmRpcmVjdGlvbik7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLm9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBfdGhpcy5wcm9wcy5vblJlc2l6ZVN0YXJ0KGUsIF90aGlzLnByb3BzLmRpcmVjdGlvbik7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVzaXplci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHRoaXMucHJvcHMuY2xhc3NOYW1lIHx8ICcnLCBzdHlsZTogX19hc3NpZ24oX19hc3NpZ24oeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgdXNlclNlbGVjdDogJ25vbmUnIH0sIHN0eWxlc1t0aGlzLnByb3BzLmRpcmVjdGlvbl0pLCAodGhpcy5wcm9wcy5yZXBsYWNlU3R5bGVzIHx8IHt9KSksIG9uTW91c2VEb3duOiB0aGlzLm9uTW91c2VEb3duLCBvblRvdWNoU3RhcnQ6IHRoaXMub25Ub3VjaFN0YXJ0IH0sIHRoaXMucHJvcHMuY2hpbGRyZW4pKTtcbiAgICB9O1xuICAgIHJldHVybiBSZXNpemVyO1xufShSZWFjdC5QdXJlQ29tcG9uZW50KSk7XG5leHBvcnQgeyBSZXNpemVyIH07XG4iLCJpbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZSc7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5JztcbmltcG9ydCBSZWFjdCwgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiB3aXRoU2lkZUVmZmVjdChyZWR1Y2VQcm9wc1RvU3RhdGUsIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICh0eXBlb2YgcmVkdWNlUHJvcHNUb1N0YXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlZHVjZVByb3BzVG9TdGF0ZSB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50IHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIHJldHVybiBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKFdyYXBwZWRDb21wb25lbnQpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBpZiAodHlwZW9mIFdyYXBwZWRDb21wb25lbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBXcmFwcGVkQ29tcG9uZW50IHRvIGJlIGEgUmVhY3QgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtb3VudGVkSW5zdGFuY2VzID0gW107XG4gICAgdmFyIHN0YXRlO1xuXG4gICAgZnVuY3Rpb24gZW1pdENoYW5nZSgpIHtcbiAgICAgIHN0YXRlID0gcmVkdWNlUHJvcHNUb1N0YXRlKG1vdW50ZWRJbnN0YW5jZXMubWFwKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UucHJvcHM7XG4gICAgICB9KSk7XG4gICAgICBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50KHN0YXRlKTtcbiAgICB9XG5cbiAgICB2YXIgU2lkZUVmZmVjdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B1cmVDb21wb25lbnQpIHtcbiAgICAgIF9pbmhlcml0c0xvb3NlKFNpZGVFZmZlY3QsIF9QdXJlQ29tcG9uZW50KTtcblxuICAgICAgZnVuY3Rpb24gU2lkZUVmZmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIF9QdXJlQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IHRvIHVzZSBkaXNwbGF5TmFtZSBvZiB3cmFwcGVkIGNvbXBvbmVudFxuICAgICAgU2lkZUVmZmVjdC5wZWVrID0gZnVuY3Rpb24gcGVlaygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfTtcblxuICAgICAgdmFyIF9wcm90byA9IFNpZGVFZmZlY3QucHJvdG90eXBlO1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgbW91bnRlZEluc3RhbmNlcy5wdXNoKHRoaXMpO1xuICAgICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gbW91bnRlZEluc3RhbmNlcy5pbmRleE9mKHRoaXMpO1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCB0aGlzLnByb3BzKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBTaWRlRWZmZWN0O1xuICAgIH0oUHVyZUNvbXBvbmVudCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoU2lkZUVmZmVjdCwgXCJkaXNwbGF5TmFtZVwiLCBcIlNpZGVFZmZlY3QoXCIgKyBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSArIFwiKVwiKTtcblxuICAgIHJldHVybiBTaWRlRWZmZWN0O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoU2lkZUVmZmVjdDtcbiIsIiFmdW5jdGlvbih0LGUpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcInJlYWN0XCIpKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcInJlYWN0XCJdLGUpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuUmVhY3RDb25mZXR0aT1lKHJlcXVpcmUoXCJyZWFjdFwiKSk6dC5SZWFjdENvbmZldHRpPWUodC5SZWFjdCl9KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcywoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBpPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLG4pLGkubD0hMCxpLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUscil7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIGkgaW4gdCluLmQocixpLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwsaSkpO3JldHVybiByfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9Mil9KFtmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9e2xpbmVhcjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSp0L3IrZX0sZWFzZUluUXVhZDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSoodC89cikqdCtlfSxlYXNlT3V0UXVhZDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4tKG4tZSkqKHQvPXIpKih0LTIpK2V9LGVhc2VJbk91dFF1YWQ6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybih0Lz1yLzIpPDE/aS8yKnQqdCtlOi1pLzIqKC0tdCoodC0yKS0xKStlfSxlYXNlSW5DdWJpYzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSoodC89cikqdCp0K2V9LGVhc2VPdXRDdWJpYzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSooKHQ9dC9yLTEpKnQqdCsxKStlfSxlYXNlSW5PdXRDdWJpYzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuKHQvPXIvMik8MT9pLzIqdCp0KnQrZTppLzIqKCh0LT0yKSp0KnQrMikrZX0sZWFzZUluUXVhcnQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqKHQvPXIpKnQqdCp0K2V9LGVhc2VPdXRRdWFydDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4tKG4tZSkqKCh0PXQvci0xKSp0KnQqdC0xKStlfSxlYXNlSW5PdXRRdWFydDpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuKHQvPXIvMik8MT9pLzIqdCp0KnQqdCtlOi1pLzIqKCh0LT0yKSp0KnQqdC0yKStlfSxlYXNlSW5RdWludDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSoodC89cikqdCp0KnQqdCtlfSxlYXNlT3V0UXVpbnQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqKCh0PXQvci0xKSp0KnQqdCp0KzEpK2V9LGVhc2VJbk91dFF1aW50OmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4odC89ci8yKTwxP2kvMip0KnQqdCp0KnQrZTppLzIqKCh0LT0yKSp0KnQqdCp0KzIpK2V9LGVhc2VJblNpbmU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybi1pKk1hdGguY29zKHQvciooTWF0aC5QSS8yKSkraStlfSxlYXNlT3V0U2luZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSpNYXRoLnNpbih0L3IqKE1hdGguUEkvMikpK2V9LGVhc2VJbk91dFNpbmU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuLShuLWUpLzIqKE1hdGguY29zKE1hdGguUEkqdC9yKS0xKStlfSxlYXNlSW5FeHBvOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiAwPT10P2U6KG4tZSkqTWF0aC5wb3coMiwxMCoodC9yLTEpKStlfSxlYXNlT3V0RXhwbzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuIHQ9PXI/ZStpOmkqKDEtTWF0aC5wb3coMiwtMTAqdC9yKSkrZX0sZWFzZUluT3V0RXhwbzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuIDA9PT10P2U6dD09PXI/ZStpOih0Lz1yLzIpPDE/aS8yKk1hdGgucG93KDIsMTAqKHQtMSkpK2U6aS8yKigyLU1hdGgucG93KDIsLTEwKi0tdCkpK2V9LGVhc2VJbkNpcmM6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuLShuLWUpKihNYXRoLnNxcnQoMS0odC89cikqdCktMSkrZX0sZWFzZU91dENpcmM6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqTWF0aC5zcXJ0KDEtKHQ9dC9yLTEpKnQpK2V9LGVhc2VJbk91dENpcmM6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybih0Lz1yLzIpPDE/LWkvMiooTWF0aC5zcXJ0KDEtdCp0KS0xKStlOmkvMiooTWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpK2V9LGVhc2VJbkVsYXN0aWM6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxhLGM9bi1lO3JldHVybiBhPTEuNzAxNTgsMD09PXQ/ZToxPT0odC89cik/ZStjOigobz0wKXx8KG89LjMqciksKGk9Yyk8TWF0aC5hYnMoYyk/KGk9YyxhPW8vNCk6YT1vLygyKk1hdGguUEkpKk1hdGguYXNpbihjL2kpLC1pKk1hdGgucG93KDIsMTAqKHQtPTEpKSpNYXRoLnNpbigodCpyLWEpKigyKk1hdGguUEkpL28pK2UpfSxlYXNlT3V0RWxhc3RpYzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLGEsYz1uLWU7cmV0dXJuIGE9MS43MDE1OCwwPT09dD9lOjE9PSh0Lz1yKT9lK2M6KChvPTApfHwobz0uMypyKSwoaT1jKTxNYXRoLmFicyhjKT8oaT1jLGE9by80KTphPW8vKDIqTWF0aC5QSSkqTWF0aC5hc2luKGMvaSksaSpNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigodCpyLWEpKigyKk1hdGguUEkpL28pK2MrZSl9LGVhc2VJbk91dEVsYXN0aWM6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxhLGM9bi1lO3JldHVybiBhPTEuNzAxNTgsMD09PXQ/ZToyPT0odC89ci8yKT9lK2M6KChvPTApfHwobz1yKiguMyoxLjUpKSwoaT1jKTxNYXRoLmFicyhjKT8oaT1jLGE9by80KTphPW8vKDIqTWF0aC5QSSkqTWF0aC5hc2luKGMvaSksdDwxP2kqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0KnItYSkqKDIqTWF0aC5QSSkvbykqLS41K2U6aSpNYXRoLnBvdygyLC0xMCoodC09MSkpKk1hdGguc2luKCh0KnItYSkqKDIqTWF0aC5QSSkvbykqLjUrYytlKX0sZWFzZUluQmFjazpmdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB2b2lkIDA9PT1pJiYoaT0xLjcwMTU4KSwobi1lKSoodC89cikqdCooKGkrMSkqdC1pKStlfSxlYXNlT3V0QmFjazpmdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB2b2lkIDA9PT1pJiYoaT0xLjcwMTU4KSwobi1lKSooKHQ9dC9yLTEpKnQqKChpKzEpKnQraSkrMSkrZX0sZWFzZUluT3V0QmFjazpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPW4tZTtyZXR1cm4gdm9pZCAwPT09aSYmKGk9MS43MDE1OCksKHQvPXIvMik8MT9vLzIqKHQqdCooKDErKGkqPTEuNTI1KSkqdC1pKSkrZTpvLzIqKCh0LT0yKSp0KigoMSsoaSo9MS41MjUpKSp0K2kpKzIpK2V9LGVhc2VJbkJvdW5jZTpmdW5jdGlvbih0LGUsbixpKXt2YXIgbz1uLWU7cmV0dXJuIG8tci5lYXNlT3V0Qm91bmNlKGktdCwwLG8saSkrZX0sZWFzZU91dEJvdW5jZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuKHQvPXIpPDEvMi43NT9pKig3LjU2MjUqdCp0KStlOnQ8Mi8yLjc1P2kqKDcuNTYyNSoodC09MS41LzIuNzUpKnQrLjc1KStlOnQ8Mi41LzIuNzU/aSooNy41NjI1Kih0LT0yLjI1LzIuNzUpKnQrLjkzNzUpK2U6aSooNy41NjI1Kih0LT0yLjYyNS8yLjc1KSp0Ky45ODQzNzUpK2V9LGVhc2VJbk91dEJvdW5jZTpmdW5jdGlvbih0LGUsbixpKXt2YXIgbz1uLWU7cmV0dXJuIHQ8aS8yPy41KnIuZWFzZUluQm91bmNlKDIqdCwwLG8saSkrZTouNSpyLmVhc2VPdXRCb3VuY2UoMip0LWksMCxvLGkpKy41Km8rZX19O3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMyl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSksbi5kKGUsXCJSZWFjdENvbmZldHRpXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSk7dmFyIHIsaSxvPW4oMCksYT1uLm4obyksYz1uKDEpLHM9bi5uKGMpO2Z1bmN0aW9uIHUodCxlKXtyZXR1cm4gdCtNYXRoLnJhbmRvbSgpKihlLXQpfWZ1bmN0aW9uIGYodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIGgodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fSFmdW5jdGlvbih0KXt0W3QuQ2lyY2xlPTBdPVwiQ2lyY2xlXCIsdFt0LlNxdWFyZT0xXT1cIlNxdWFyZVwiLHRbdC5TdHJpcD0yXT1cIlN0cmlwXCJ9KHJ8fChyPXt9KSksZnVuY3Rpb24odCl7dFt0LlBvc2l0aXZlPTFdPVwiUG9zaXRpdmVcIix0W3QuTmVnYXRpdmU9LTFdPVwiTmVnYXRpdmVcIn0oaXx8KGk9e30pKTt2YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuLHIsbyl7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0odGhpcyx0KSxoKHRoaXMsXCJjb250ZXh0XCIsdm9pZCAwKSxoKHRoaXMsXCJyYWRpdXNcIix2b2lkIDApLGgodGhpcyxcInhcIix2b2lkIDApLGgodGhpcyxcInlcIix2b2lkIDApLGgodGhpcyxcIndcIix2b2lkIDApLGgodGhpcyxcImhcIix2b2lkIDApLGgodGhpcyxcInZ4XCIsdm9pZCAwKSxoKHRoaXMsXCJ2eVwiLHZvaWQgMCksaCh0aGlzLFwic2hhcGVcIix2b2lkIDApLGgodGhpcyxcImFuZ2xlXCIsdm9pZCAwKSxoKHRoaXMsXCJhbmd1bGFyU3BpblwiLHZvaWQgMCksaCh0aGlzLFwiY29sb3JcIix2b2lkIDApLGgodGhpcyxcInJvdGF0ZVlcIix2b2lkIDApLGgodGhpcyxcInJvdGF0aW9uRGlyZWN0aW9uXCIsdm9pZCAwKSxoKHRoaXMsXCJnZXRPcHRpb25zXCIsdm9pZCAwKSx0aGlzLmdldE9wdGlvbnM9bjt2YXIgYSxjLHM9dGhpcy5nZXRPcHRpb25zKCksZj1zLmNvbG9ycyxsPXMuaW5pdGlhbFZlbG9jaXR5WCxwPXMuaW5pdGlhbFZlbG9jaXR5WTt0aGlzLmNvbnRleHQ9ZSx0aGlzLng9cix0aGlzLnk9byx0aGlzLnc9dSg1LDIwKSx0aGlzLmg9dSg1LDIwKSx0aGlzLnJhZGl1cz11KDUsMTApLHRoaXMudng9XCJudW1iZXJcIj09dHlwZW9mIGw/dSgtbCxsKTp1KGwubWluLGwubWF4KSx0aGlzLnZ5PVwibnVtYmVyXCI9PXR5cGVvZiBwP3UoLXAsMCk6dShwLm1pbixwLm1heCksdGhpcy5zaGFwZT0oYT0wLGM9MixNYXRoLmZsb29yKGErTWF0aC5yYW5kb20oKSooYy1hKzEpKSksdGhpcy5hbmdsZT11KDAsMzYwKSpNYXRoLlBJLzE4MCx0aGlzLmFuZ3VsYXJTcGluPXUoLS4yLC4yKSx0aGlzLmNvbG9yPWZbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmYubGVuZ3RoKV0sdGhpcy5yb3RhdGVZPXUoMCwxKSx0aGlzLnJvdGF0aW9uRGlyZWN0aW9uPXUoMCwxKT9pLlBvc2l0aXZlOmkuTmVnYXRpdmV9dmFyIGUsbixvO3JldHVybiBlPXQsKG49W3trZXk6XCJ1cGRhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0T3B0aW9ucygpLGU9dC5ncmF2aXR5LG49dC53aW5kLG89dC5mcmljdGlvbixhPXQub3BhY2l0eSxjPXQuZHJhd1NoYXBlO3RoaXMueCs9dGhpcy52eCx0aGlzLnkrPXRoaXMudnksdGhpcy52eSs9ZSx0aGlzLnZ4Kz1uLHRoaXMudngqPW8sdGhpcy52eSo9byx0aGlzLnJvdGF0ZVk+PTEmJnRoaXMucm90YXRpb25EaXJlY3Rpb249PT1pLlBvc2l0aXZlP3RoaXMucm90YXRpb25EaXJlY3Rpb249aS5OZWdhdGl2ZTp0aGlzLnJvdGF0ZVk8PS0xJiZ0aGlzLnJvdGF0aW9uRGlyZWN0aW9uPT09aS5OZWdhdGl2ZSYmKHRoaXMucm90YXRpb25EaXJlY3Rpb249aS5Qb3NpdGl2ZSk7dmFyIHM9LjEqdGhpcy5yb3RhdGlvbkRpcmVjdGlvbjtpZih0aGlzLnJvdGF0ZVkrPXMsdGhpcy5hbmdsZSs9dGhpcy5hbmd1bGFyU3Bpbix0aGlzLmNvbnRleHQuc2F2ZSgpLHRoaXMuY29udGV4dC50cmFuc2xhdGUodGhpcy54LHRoaXMueSksdGhpcy5jb250ZXh0LnJvdGF0ZSh0aGlzLmFuZ2xlKSx0aGlzLmNvbnRleHQuc2NhbGUoMSx0aGlzLnJvdGF0ZVkpLHRoaXMuY29udGV4dC5yb3RhdGUodGhpcy5hbmdsZSksdGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpLHRoaXMuY29udGV4dC5maWxsU3R5bGU9dGhpcy5jb2xvcix0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGU9dGhpcy5jb2xvcix0aGlzLmNvbnRleHQuZ2xvYmFsQWxwaGE9YSx0aGlzLmNvbnRleHQubGluZUNhcD1cInJvdW5kXCIsdGhpcy5jb250ZXh0LmxpbmVXaWR0aD0yLGMmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGMpYy5jYWxsKHRoaXMsdGhpcy5jb250ZXh0KTtlbHNlIHN3aXRjaCh0aGlzLnNoYXBlKXtjYXNlIHIuQ2lyY2xlOnRoaXMuY29udGV4dC5iZWdpblBhdGgoKSx0aGlzLmNvbnRleHQuYXJjKDAsMCx0aGlzLnJhZGl1cywwLDIqTWF0aC5QSSksdGhpcy5jb250ZXh0LmZpbGwoKTticmVhaztjYXNlIHIuU3F1YXJlOnRoaXMuY29udGV4dC5maWxsUmVjdCgtdGhpcy53LzIsLXRoaXMuaC8yLHRoaXMudyx0aGlzLmgpO2JyZWFrO2Nhc2Ugci5TdHJpcDp0aGlzLmNvbnRleHQuZmlsbFJlY3QoLXRoaXMudy82LC10aGlzLmgvMix0aGlzLncvMyx0aGlzLmgpfXRoaXMuY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLmNvbnRleHQucmVzdG9yZSgpfX1dKSYmZihlLnByb3RvdHlwZSxuKSxvJiZmKGUsbyksdH0oKTtmdW5jdGlvbiBwKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH12YXIgdj1mdW5jdGlvbiB0KGUsbil7dmFyIHI9dGhpczshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLHQpLHAodGhpcyxcImNhbnZhc1wiLHZvaWQgMCkscCh0aGlzLFwiY29udGV4dFwiLHZvaWQgMCkscCh0aGlzLFwiZ2V0T3B0aW9uc1wiLHZvaWQgMCkscCh0aGlzLFwieFwiLDApLHAodGhpcyxcInlcIiwwKSxwKHRoaXMsXCJ3XCIsMCkscCh0aGlzLFwiaFwiLDApLHAodGhpcyxcImxhc3ROdW1iZXJPZlBpZWNlc1wiLDApLHAodGhpcyxcInR3ZWVuSW5pdFRpbWVcIixEYXRlLm5vdygpKSxwKHRoaXMsXCJwYXJ0aWNsZXNcIixbXSkscCh0aGlzLFwicGFydGljbGVzR2VuZXJhdGVkXCIsMCkscCh0aGlzLFwicmVtb3ZlUGFydGljbGVBdFwiLChmdW5jdGlvbih0KXtyLnBhcnRpY2xlcy5zcGxpY2UodCwxKX0pKSxwKHRoaXMsXCJnZXRQYXJ0aWNsZVwiLChmdW5jdGlvbigpe3ZhciB0PXUoci54LHIudytyLngpLGU9dShyLnksci5oK3IueSk7cmV0dXJuIG5ldyBsKHIuY29udGV4dCxyLmdldE9wdGlvbnMsdCxlKX0pKSxwKHRoaXMsXCJhbmltYXRlXCIsKGZ1bmN0aW9uKCl7dmFyIHQ9ci5jYW52YXMsZT1yLmNvbnRleHQsbj1yLnBhcnRpY2xlc0dlbmVyYXRlZCxpPXIubGFzdE51bWJlck9mUGllY2VzLG89ci5nZXRPcHRpb25zKCksYT1vLnJ1bixjPW8ucmVjeWNsZSxzPW8ubnVtYmVyT2ZQaWVjZXMsdT1vLmRlYnVnLGY9by50d2VlbkZ1bmN0aW9uLGg9by50d2VlbkR1cmF0aW9uO2lmKCFhKXJldHVybiExO3ZhciBsPXIucGFydGljbGVzLmxlbmd0aCxwPWM/bDpuLHY9RGF0ZS5ub3coKTtpZihwPHMpe2khPT1zJiYoci50d2VlbkluaXRUaW1lPXYsci5sYXN0TnVtYmVyT2ZQaWVjZXM9cyk7Zm9yKHZhciB5PXIudHdlZW5Jbml0VGltZSxkPWYodi15Pmg/aDpNYXRoLm1heCgwLHYteSkscCxzLGgpLGI9TWF0aC5yb3VuZChkLXApLGc9MDtnPGI7ZysrKXIucGFydGljbGVzLnB1c2goci5nZXRQYXJ0aWNsZSgpKTtyLnBhcnRpY2xlc0dlbmVyYXRlZCs9Yn1yZXR1cm4gdSYmKGUuZm9udD1cIjEycHggc2Fucy1zZXJpZlwiLGUuZmlsbFN0eWxlPVwiIzMzM1wiLGUudGV4dEFsaWduPVwicmlnaHRcIixlLmZpbGxUZXh0KFwiUGFydGljbGVzOiBcIi5jb25jYXQobCksdC53aWR0aC0xMCx0LmhlaWdodC0yMCkpLHIucGFydGljbGVzLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7ZS51cGRhdGUoKSwoZS55PnQuaGVpZ2h0fHxlLnk8LTEwMHx8ZS54PnQud2lkdGgrMTAwfHxlLng8LTEwMCkmJihjJiZwPD1zP3IucGFydGljbGVzW25dPXIuZ2V0UGFydGljbGUoKTpyLnJlbW92ZVBhcnRpY2xlQXQobikpfSkpLGw+MHx8cDxzfSkpLHRoaXMuY2FudmFzPWU7dmFyIGk9dGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO2lmKCFpKXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBnZXQgY2FudmFzIGNvbnRleHRcIik7dGhpcy5jb250ZXh0PWksdGhpcy5nZXRPcHRpb25zPW59O2Z1bmN0aW9uIHkodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIGQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/eShPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2codCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOnkoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gYih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gZyh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9dmFyIE89e3dpZHRoOlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93LmlubmVyV2lkdGg6MzAwLGhlaWdodDpcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdy5pbm5lckhlaWdodDoyMDAsbnVtYmVyT2ZQaWVjZXM6MjAwLGZyaWN0aW9uOi45OSx3aW5kOjAsZ3Jhdml0eTouMSxpbml0aWFsVmVsb2NpdHlYOjQsaW5pdGlhbFZlbG9jaXR5WToxMCxjb2xvcnM6W1wiI2Y0NDMzNlwiLFwiI2U5MWU2M1wiLFwiIzljMjdiMFwiLFwiIzY3M2FiN1wiLFwiIzNmNTFiNVwiLFwiIzIxOTZmM1wiLFwiIzAzYTlmNFwiLFwiIzAwYmNkNFwiLFwiIzAwOTY4OFwiLFwiIzRDQUY1MFwiLFwiIzhCQzM0QVwiLFwiI0NEREMzOVwiLFwiI0ZGRUIzQlwiLFwiI0ZGQzEwN1wiLFwiI0ZGOTgwMFwiLFwiI0ZGNTcyMlwiLFwiIzc5NTU0OFwiXSxvcGFjaXR5OjEsZGVidWc6ITEsdHdlZW5GdW5jdGlvbjpzLmEuZWFzZUluT3V0UXVhZCx0d2VlbkR1cmF0aW9uOjVlMyxyZWN5Y2xlOiEwLHJ1bjohMH0sdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXt2YXIgcj10aGlzOyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsdCksZyh0aGlzLFwiY2FudmFzXCIsdm9pZCAwKSxnKHRoaXMsXCJjb250ZXh0XCIsdm9pZCAwKSxnKHRoaXMsXCJfb3B0aW9uc1wiLHZvaWQgMCksZyh0aGlzLFwiZ2VuZXJhdG9yXCIsdm9pZCAwKSxnKHRoaXMsXCJyYWZJZFwiLHZvaWQgMCksZyh0aGlzLFwic2V0T3B0aW9uc1dpdGhEZWZhdWx0c1wiLChmdW5jdGlvbih0KXt2YXIgZT17Y29uZmV0dGlTb3VyY2U6e3g6MCx5OjAsdzpyLmNhbnZhcy53aWR0aCxoOjB9fTtyLl9vcHRpb25zPWQoZChkKHt9LGUpLE8pLHQpLE9iamVjdC5hc3NpZ24ocix0LmNvbmZldHRpU291cmNlKX0pKSxnKHRoaXMsXCJ1cGRhdGVcIiwoZnVuY3Rpb24oKXt2YXIgdD1yLm9wdGlvbnMsZT10LnJ1bixuPXQub25Db25mZXR0aUNvbXBsZXRlLGk9ci5jYW52YXMsbz1yLmNvbnRleHQ7ZSYmKG8uZmlsbFN0eWxlPVwid2hpdGVcIixvLmNsZWFyUmVjdCgwLDAsaS53aWR0aCxpLmhlaWdodCkpLHIuZ2VuZXJhdG9yLmFuaW1hdGUoKT9yLnJhZklkPXJlcXVlc3RBbmltYXRpb25GcmFtZShyLnVwZGF0ZSk6KG4mJlwiZnVuY3Rpb25cIj09dHlwZW9mIG4mJnIuZ2VuZXJhdG9yLnBhcnRpY2xlc0dlbmVyYXRlZD4wJiZuLmNhbGwocixyKSxyLl9vcHRpb25zLnJ1bj0hMSl9KSksZyh0aGlzLFwicmVzZXRcIiwoZnVuY3Rpb24oKXtyLmdlbmVyYXRvciYmci5nZW5lcmF0b3IucGFydGljbGVzR2VuZXJhdGVkPjAmJihyLmdlbmVyYXRvci5wYXJ0aWNsZXNHZW5lcmF0ZWQ9MCxyLmdlbmVyYXRvci5wYXJ0aWNsZXM9W10sci5nZW5lcmF0b3IubGFzdE51bWJlck9mUGllY2VzPTApfSkpLGcodGhpcyxcInN0b3BcIiwoZnVuY3Rpb24oKXtyLm9wdGlvbnM9e3J1bjohMX0sci5yYWZJZCYmKGNhbmNlbEFuaW1hdGlvbkZyYW1lKHIucmFmSWQpLHIucmFmSWQ9dm9pZCAwKX0pKSx0aGlzLmNhbnZhcz1lO3ZhciBpPXRoaXMuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtpZighaSl0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZ2V0IGNhbnZhcyBjb250ZXh0XCIpO3RoaXMuY29udGV4dD1pLHRoaXMuZ2VuZXJhdG9yPW5ldyB2KHRoaXMuY2FudmFzLChmdW5jdGlvbigpe3JldHVybiByLm9wdGlvbnN9KSksdGhpcy5vcHRpb25zPW4sdGhpcy51cGRhdGUoKX12YXIgZSxuLHI7cmV0dXJuIGU9dCwobj1be2tleTpcIm9wdGlvbnNcIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3B0aW9uc30sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX29wdGlvbnMmJnRoaXMuX29wdGlvbnMucnVuLG49dGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5yZWN5Y2xlO3RoaXMuc2V0T3B0aW9uc1dpdGhEZWZhdWx0cyh0KSx0aGlzLmdlbmVyYXRvciYmKE9iamVjdC5hc3NpZ24odGhpcy5nZW5lcmF0b3IsdGhpcy5vcHRpb25zLmNvbmZldHRpU291cmNlKSxcImJvb2xlYW5cIj09dHlwZW9mIHQucmVjeWNsZSYmdC5yZWN5Y2xlJiYhMT09PW4mJih0aGlzLmdlbmVyYXRvci5sYXN0TnVtYmVyT2ZQaWVjZXM9dGhpcy5nZW5lcmF0b3IucGFydGljbGVzLmxlbmd0aCkpLFwiYm9vbGVhblwiPT10eXBlb2YgdC5ydW4mJnQucnVuJiYhMT09PWUmJnRoaXMudXBkYXRlKCl9fV0pJiZiKGUucHJvdG90eXBlLG4pLHImJmIoZSxyKSx0fSgpO2Z1bmN0aW9uIG0odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEModCl9KHQpfHxmdW5jdGlvbih0KXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKXJldHVybiBBcnJheS5mcm9tKHQpfSh0KXx8Uyh0KXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKX0oKX1mdW5jdGlvbiB4KHQpe3JldHVybih4PVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9KSh0KX1mdW5jdGlvbiBQKCl7cmV0dXJuKFA9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYodFtyXT1uW3JdKX1yZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBqKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBNKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP2ooT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtUKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpqKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fWZ1bmN0aW9uIEkodCxlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdH0odCl8fGZ1bmN0aW9uKHQsZSl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKSlyZXR1cm47dmFyIG49W10scj0hMCxpPSExLG89dm9pZCAwO3RyeXtmb3IodmFyIGEsYz10W1N5bWJvbC5pdGVyYXRvcl0oKTshKHI9KGE9Yy5uZXh0KCkpLmRvbmUpJiYobi5wdXNoKGEudmFsdWUpLCFlfHxuLmxlbmd0aCE9PWUpO3I9ITApO31jYXRjaCh0KXtpPSEwLG89dH1maW5hbGx5e3RyeXtyfHxudWxsPT1jLnJldHVybnx8Yy5yZXR1cm4oKX1maW5hbGx5e2lmKGkpdGhyb3cgb319cmV0dXJuIG59KHQsZSl8fFModCxlKXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfSgpfWZ1bmN0aW9uIFModCxlKXtpZih0KXtpZihcInN0cmluZ1wiPT10eXBlb2YgdClyZXR1cm4gQyh0LGUpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTtyZXR1cm5cIk9iamVjdFwiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKSxcIk1hcFwiPT09bnx8XCJTZXRcIj09PW4/QXJyYXkuZnJvbSh0KTpcIkFyZ3VtZW50c1wiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/Qyh0LGUpOnZvaWQgMH19ZnVuY3Rpb24gQyh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIEQodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIEUodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIF8odCxlKXtyZXR1cm4oXz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gUih0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbixyPUYodCk7aWYoZSl7dmFyIGk9Rih0aGlzKS5jb25zdHJ1Y3RvcjtuPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gayh0aGlzLG4pfX1mdW5jdGlvbiBrKHQsZSl7cmV0dXJuIWV8fFwib2JqZWN0XCIhPT14KGUpJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP0EodCk6ZX1mdW5jdGlvbiBBKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiB0fWZ1bmN0aW9uIEYodCl7cmV0dXJuKEY9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIFQodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fXZhciBCPWEuYS5jcmVhdGVSZWYoKSxOPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmXyh0LGUpfShvLHQpO3ZhciBlLG4scixpPVIobyk7ZnVuY3Rpb24gbyh0KXt2YXIgZTtEKHRoaXMsbyk7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxjPTE7YzxuO2MrKylyW2MtMV09YXJndW1lbnRzW2NdO3JldHVybiBUKEEoZT1pLmNhbGwuYXBwbHkoaSxbdGhpcyx0XS5jb25jYXQocikpKSxcImNhbnZhc1wiLGEuYS5jcmVhdGVSZWYoKSksVChBKGUpLFwiY29uZmV0dGlcIix2b2lkIDApLGUuY2FudmFzPXQuY2FudmFzUmVmfHxCLGV9cmV0dXJuIGU9bywobj1be2tleTpcImNvbXBvbmVudERpZE1vdW50XCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmNhbnZhcy5jdXJyZW50KXt2YXIgdD1xKHRoaXMucHJvcHMpWzBdO3RoaXMuY29uZmV0dGk9bmV3IHcodGhpcy5jYW52YXMuY3VycmVudCx0KX19fSx7a2V5OlwiY29tcG9uZW50RGlkVXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1xKHRoaXMucHJvcHMpWzBdO3RoaXMuY29uZmV0dGkmJih0aGlzLmNvbmZldHRpLm9wdGlvbnM9dCl9fSx7a2V5OlwiY29tcG9uZW50V2lsbFVubW91bnRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY29uZmV0dGkmJnRoaXMuY29uZmV0dGkuc3RvcCgpLHRoaXMuY29uZmV0dGk9dm9pZCAwfX0se2tleTpcInJlbmRlclwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9SShxKHRoaXMucHJvcHMpLDIpLGU9dFswXSxuPXRbMV0scj1NKHt6SW5kZXg6Mixwb3NpdGlvbjpcImFic29sdXRlXCIscG9pbnRlckV2ZW50czpcIm5vbmVcIix0b3A6MCxsZWZ0OjAsYm90dG9tOjAscmlnaHQ6MH0sbi5zdHlsZSk7cmV0dXJuIGEuYS5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIsUCh7d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHQscmVmOnRoaXMuY2FudmFzfSxuLHtzdHlsZTpyfSkpfX1dKSYmRShlLnByb3RvdHlwZSxuKSxyJiZFKGUsciksb30oby5Db21wb25lbnQpO2Z1bmN0aW9uIHEodCl7dmFyIGU9e30sbj17fSxyPVtdLmNvbmNhdChtKE9iamVjdC5rZXlzKE8pKSxbXCJjb25mZXR0aVNvdXJjZVwiLFwiZHJhd1NoYXBlXCIsXCJvbkNvbmZldHRpQ29tcGxldGVcIl0pLGk9W1wiY2FudmFzUmVmXCJdO2Zvcih2YXIgbyBpbiB0KXt2YXIgYT10W29dO3IuaW5jbHVkZXMobyk/ZVtvXT1hOmkuaW5jbHVkZXMobyk/aVtvXT1hOm5bb109YX1yZXR1cm5bZSxuLHt9XX1UKE4sXCJkZWZhdWx0UHJvcHNcIixNKHt9LE8pKSxUKE4sXCJkaXNwbGF5TmFtZVwiLFwiUmVhY3RDb25mZXR0aVwiKTt2YXIgUT1hLmEuZm9yd2FyZFJlZigoZnVuY3Rpb24odCxlKXtyZXR1cm4gYS5hLmNyZWF0ZUVsZW1lbnQoTixQKHtjYW52YXNSZWY6ZX0sdCkpfSkpO2UuZGVmYXVsdD1RfV0pLmRlZmF1bHR9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWFjdC1jb25mZXR0aS5taW4uanMubWFwIiwiLyohXG4gIHJlYWN0LWRhdGVwaWNrZXIgdjcuMy4wXG4gIGh0dHBzOi8vZ2l0aHViLmNvbS9IYWNrZXIweDAxL3JlYWN0LWRhdGVwaWNrZXJcbiAgUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuKi9cbiFmdW5jdGlvbihlLHQpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP3QoZXhwb3J0cyxyZXF1aXJlKFwiY2xzeFwiKSxyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcInJlYWN0LW9uY2xpY2tvdXRzaWRlXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGREYXlzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRIb3Vyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkTWludXRlc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkTW9udGhzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRRdWFydGVyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkU2Vjb25kc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkV2Vla3NcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZFllYXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXNcIikscmVxdWlyZShcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9lbmRPZkRheVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZW5kT2ZNb250aFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZW5kT2ZXZWVrXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9lbmRPZlllYXJcIikscmVxdWlyZShcImRhdGUtZm5zL2Zvcm1hdFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0RGF0ZVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0RGF5XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRIb3Vyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0SVNPV2Vla1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0TWludXRlc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0TW9udGhcIikscmVxdWlyZShcImRhdGUtZm5zL2dldFF1YXJ0ZXJcIikscmVxdWlyZShcImRhdGUtZm5zL2dldFNlY29uZHNcIikscmVxdWlyZShcImRhdGUtZm5zL2dldFRpbWVcIikscmVxdWlyZShcImRhdGUtZm5zL2dldFllYXJcIikscmVxdWlyZShcImRhdGUtZm5zL2lzQWZ0ZXJcIikscmVxdWlyZShcImRhdGUtZm5zL2lzQmVmb3JlXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc0RhdGVcIikscmVxdWlyZShcImRhdGUtZm5zL2lzRXF1YWxcIikscmVxdWlyZShcImRhdGUtZm5zL2lzU2FtZURheVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNTYW1lTW9udGhcIikscmVxdWlyZShcImRhdGUtZm5zL2lzU2FtZVF1YXJ0ZXJcIikscmVxdWlyZShcImRhdGUtZm5zL2lzU2FtZVllYXJcIikscmVxdWlyZShcImRhdGUtZm5zL2lzVmFsaWRcIikscmVxdWlyZShcImRhdGUtZm5zL2lzV2l0aGluSW50ZXJ2YWxcIikscmVxdWlyZShcImRhdGUtZm5zL21heFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvbWluXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9wYXJzZVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvcGFyc2VJU09cIikscmVxdWlyZShcImRhdGUtZm5zL3NldFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc2V0SG91cnNcIikscmVxdWlyZShcImRhdGUtZm5zL3NldE1pbnV0ZXNcIikscmVxdWlyZShcImRhdGUtZm5zL3NldE1vbnRoXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zZXRRdWFydGVyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zZXRTZWNvbmRzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zZXRZZWFyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdGFydE9mRGF5XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdGFydE9mTW9udGhcIikscmVxdWlyZShcImRhdGUtZm5zL3N0YXJ0T2ZRdWFydGVyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdGFydE9mV2Vla1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3RhcnRPZlllYXJcIikscmVxdWlyZShcImRhdGUtZm5zL3N1YkRheXNcIikscmVxdWlyZShcImRhdGUtZm5zL3N1Yk1vbnRoc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3ViUXVhcnRlcnNcIikscmVxdWlyZShcImRhdGUtZm5zL3N1YldlZWtzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdWJZZWFyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvdG9EYXRlXCIpLHJlcXVpcmUoXCJAZmxvYXRpbmctdWkvcmVhY3RcIikscmVxdWlyZShcInJlYWN0LWRvbVwiKSk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJleHBvcnRzXCIsXCJjbHN4XCIsXCJyZWFjdFwiLFwicmVhY3Qtb25jbGlja291dHNpZGVcIixcImRhdGUtZm5zL2FkZERheXNcIixcImRhdGUtZm5zL2FkZEhvdXJzXCIsXCJkYXRlLWZucy9hZGRNaW51dGVzXCIsXCJkYXRlLWZucy9hZGRNb250aHNcIixcImRhdGUtZm5zL2FkZFF1YXJ0ZXJzXCIsXCJkYXRlLWZucy9hZGRTZWNvbmRzXCIsXCJkYXRlLWZucy9hZGRXZWVrc1wiLFwiZGF0ZS1mbnMvYWRkWWVhcnNcIixcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c1wiLFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNcIixcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnNcIixcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnNcIixcImRhdGUtZm5zL2VuZE9mRGF5XCIsXCJkYXRlLWZucy9lbmRPZk1vbnRoXCIsXCJkYXRlLWZucy9lbmRPZldlZWtcIixcImRhdGUtZm5zL2VuZE9mWWVhclwiLFwiZGF0ZS1mbnMvZm9ybWF0XCIsXCJkYXRlLWZucy9nZXREYXRlXCIsXCJkYXRlLWZucy9nZXREYXlcIixcImRhdGUtZm5zL2dldEhvdXJzXCIsXCJkYXRlLWZucy9nZXRJU09XZWVrXCIsXCJkYXRlLWZucy9nZXRNaW51dGVzXCIsXCJkYXRlLWZucy9nZXRNb250aFwiLFwiZGF0ZS1mbnMvZ2V0UXVhcnRlclwiLFwiZGF0ZS1mbnMvZ2V0U2Vjb25kc1wiLFwiZGF0ZS1mbnMvZ2V0VGltZVwiLFwiZGF0ZS1mbnMvZ2V0WWVhclwiLFwiZGF0ZS1mbnMvaXNBZnRlclwiLFwiZGF0ZS1mbnMvaXNCZWZvcmVcIixcImRhdGUtZm5zL2lzRGF0ZVwiLFwiZGF0ZS1mbnMvaXNFcXVhbFwiLFwiZGF0ZS1mbnMvaXNTYW1lRGF5XCIsXCJkYXRlLWZucy9pc1NhbWVNb250aFwiLFwiZGF0ZS1mbnMvaXNTYW1lUXVhcnRlclwiLFwiZGF0ZS1mbnMvaXNTYW1lWWVhclwiLFwiZGF0ZS1mbnMvaXNWYWxpZFwiLFwiZGF0ZS1mbnMvaXNXaXRoaW5JbnRlcnZhbFwiLFwiZGF0ZS1mbnMvbWF4XCIsXCJkYXRlLWZucy9taW5cIixcImRhdGUtZm5zL3BhcnNlXCIsXCJkYXRlLWZucy9wYXJzZUlTT1wiLFwiZGF0ZS1mbnMvc2V0XCIsXCJkYXRlLWZucy9zZXRIb3Vyc1wiLFwiZGF0ZS1mbnMvc2V0TWludXRlc1wiLFwiZGF0ZS1mbnMvc2V0TW9udGhcIixcImRhdGUtZm5zL3NldFF1YXJ0ZXJcIixcImRhdGUtZm5zL3NldFNlY29uZHNcIixcImRhdGUtZm5zL3NldFllYXJcIixcImRhdGUtZm5zL3N0YXJ0T2ZEYXlcIixcImRhdGUtZm5zL3N0YXJ0T2ZNb250aFwiLFwiZGF0ZS1mbnMvc3RhcnRPZlF1YXJ0ZXJcIixcImRhdGUtZm5zL3N0YXJ0T2ZXZWVrXCIsXCJkYXRlLWZucy9zdGFydE9mWWVhclwiLFwiZGF0ZS1mbnMvc3ViRGF5c1wiLFwiZGF0ZS1mbnMvc3ViTW9udGhzXCIsXCJkYXRlLWZucy9zdWJRdWFydGVyc1wiLFwiZGF0ZS1mbnMvc3ViV2Vla3NcIixcImRhdGUtZm5zL3N1YlllYXJzXCIsXCJkYXRlLWZucy90b0RhdGVcIixcIkBmbG9hdGluZy11aS9yZWFjdFwiLFwicmVhY3QtZG9tXCJdLHQpOnQoKGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5EYXRlUGlja2VyPXt9LGUuY2xzeCxlLlJlYWN0LGUub25DbGlja091dHNpZGUsZS5hZGREYXlzLGUuYWRkSG91cnMsZS5hZGRNaW51dGVzLGUuYWRkTW9udGhzLGUuYWRkUXVhcnRlcnMsZS5hZGRTZWNvbmRzLGUuYWRkV2Vla3MsZS5hZGRZZWFycyxlLmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyxlLmRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzLGUuZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyxlLmRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMsZS5lbmRPZkRheSxlLmVuZE9mTW9udGgsZS5lbmRPZldlZWssZS5lbmRPZlllYXIsZS5mb3JtYXQsZS5nZXREYXRlLGUuZ2V0RGF5LGUuZ2V0SG91cnMsZS5nZXRJU09XZWVrLGUuZ2V0TWludXRlcyxlLmdldE1vbnRoLGUuZ2V0UXVhcnRlcixlLmdldFNlY29uZHMsZS5nZXRUaW1lLGUuZ2V0WWVhcixlLmlzQWZ0ZXIsZS5pc0JlZm9yZSxlLmlzRGF0ZSxlLmlzRXF1YWwkMSxlLmlzU2FtZURheSQxLGUuaXNTYW1lTW9udGgkMSxlLmlzU2FtZVF1YXJ0ZXIkMSxlLmlzU2FtZVllYXIkMSxlLmlzVmFsaWQkMSxlLmlzV2l0aGluSW50ZXJ2YWwsZS5tYXgsZS5taW4sZS5wYXJzZSxlLnBhcnNlSVNPLGUuc2V0LGUuc2V0SG91cnMsZS5zZXRNaW51dGVzLGUuc2V0TW9udGgsZS5zZXRRdWFydGVyLGUuc2V0U2Vjb25kcyxlLnNldFllYXIsZS5zdGFydE9mRGF5LGUuc3RhcnRPZk1vbnRoLGUuc3RhcnRPZlF1YXJ0ZXIsZS5zdGFydE9mV2VlayxlLnN0YXJ0T2ZZZWFyLGUuc3ViRGF5cyxlLnN1Yk1vbnRocyxlLnN1YlF1YXJ0ZXJzLGUuc3ViV2Vla3MsZS5zdWJZZWFycyxlLnRvRGF0ZSxlLnJlYWN0LGUuUmVhY3RET00pfSh0aGlzLChmdW5jdGlvbihlLHQscixuLGEsbyxzLGksbCxjLHAsZCx1LGYsaCxtLHYsZyxELHksayx3LFMsYixNLEMsXyxFLFAsWSx4LE4sTyxJLFQsUixMLEEsRixILFcsUSxxLEssQixWLGosVSwkLHosWCxHLEosWixlZSx0ZSxyZSxuZSxhZSxvZSxzZSxpZSxsZSxjZSxwZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZGUoZSl7cmV0dXJuIGUmJlwib2JqZWN0XCI9PXR5cGVvZiBlJiZcImRlZmF1bHRcImluIGU/ZTp7ZGVmYXVsdDplfX12YXIgdWU9ZGUociksZmU9ZGUobiksaGU9ZGUocGUpLG1lPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG1lPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgciBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpJiYoZVtyXT10W3JdKX0sbWUoZSx0KX07ZnVuY3Rpb24gdmUoZSx0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIitTdHJpbmcodCkrXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfW1lKGUsdCksZS5wcm90b3R5cGU9bnVsbD09PXQ/T2JqZWN0LmNyZWF0ZSh0KTooci5wcm90b3R5cGU9dC5wcm90b3R5cGUsbmV3IHIpfXZhciBnZT1mdW5jdGlvbigpe3JldHVybiBnZT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQscj0xLG49YXJndW1lbnRzLmxlbmd0aDtyPG47cisrKWZvcih2YXIgYSBpbiB0PWFyZ3VtZW50c1tyXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxhKSYmKGVbYV09dFthXSk7cmV0dXJuIGV9LGdlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07ZnVuY3Rpb24gRGUoZSx0LHIpe2lmKHJ8fDI9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgbixhPTAsbz10Lmxlbmd0aDthPG87YSsrKSFuJiZhIGluIHR8fChufHwobj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LDAsYSkpLG5bYV09dFthXSk7cmV0dXJuIGUuY29uY2F0KG58fEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpKX1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTdXBwcmVzc2VkRXJyb3ImJlN1cHByZXNzZWRFcnJvcjt2YXIgeWUsa2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zaG93VGltZVNlbGVjdE9ubHkscj12b2lkIDAhPT10JiZ0LG49ZS5zaG93VGltZSxhPXZvaWQgMCE9PW4mJm4sbz1lLmNsYXNzTmFtZSxzPWUuY2hpbGRyZW4saT1yP1wiQ2hvb3NlIFRpbWVcIjpcIkNob29zZSBEYXRlXCIuY29uY2F0KGE/XCIgYW5kIFRpbWVcIjpcIlwiKTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpvLHJvbGU6XCJkaWFsb2dcIixcImFyaWEtbGFiZWxcIjppLFwiYXJpYS1tb2RhbFwiOlwidHJ1ZVwifSxzKX07ZnVuY3Rpb24gd2UoKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzpnbG9iYWxUaGlzfSFmdW5jdGlvbihlKXtlLkFycm93VXA9XCJBcnJvd1VwXCIsZS5BcnJvd0Rvd249XCJBcnJvd0Rvd25cIixlLkFycm93TGVmdD1cIkFycm93TGVmdFwiLGUuQXJyb3dSaWdodD1cIkFycm93UmlnaHRcIixlLlBhZ2VVcD1cIlBhZ2VVcFwiLGUuUGFnZURvd249XCJQYWdlRG93blwiLGUuSG9tZT1cIkhvbWVcIixlLkVuZD1cIkVuZFwiLGUuRW50ZXI9XCJFbnRlclwiLGUuU3BhY2U9XCIgXCIsZS5UYWI9XCJUYWJcIixlLkVzY2FwZT1cIkVzY2FwZVwiLGUuQmFja3NwYWNlPVwiQmFja3NwYWNlXCIsZS5YPVwieFwifSh5ZXx8KHllPXt9KSk7dmFyIFNlPTEyLGJlPS9QK3ArfFArfHArfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nO2Z1bmN0aW9uIE1lKGUpe2lmKG51bGw9PWUpcmV0dXJuIG5ldyBEYXRlO3ZhciB0PVwic3RyaW5nXCI9PXR5cGVvZiBlP0IucGFyc2VJU08oZSk6bGUudG9EYXRlKGUpO3JldHVybiBDZSh0KT90Om5ldyBEYXRlfWZ1bmN0aW9uIENlKGUsdCl7cmV0dXJuIEguaXNWYWxpZChlKSYmIU8uaXNCZWZvcmUoZSxudWxsIT10P3Q6bmV3IERhdGUoXCIxLzEvMTgwMFwiKSl9ZnVuY3Rpb24gX2UoZSx0LHIpe2lmKFwiZW5cIj09PXIpcmV0dXJuIGsuZm9ybWF0KGUsdCx7dXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zOiEwLHVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnM6ITB9KTt2YXIgbj1yP0tlKHIpOnZvaWQgMDtyZXR1cm4gciYmIW4mJmNvbnNvbGUud2FybignQSBsb2NhbGUgb2JqZWN0IHdhcyBub3QgZm91bmQgZm9yIHRoZSBwcm92aWRlZCBzdHJpbmcgW1wiJy5jb25jYXQociwnXCJdLicpKSwhbiYmcWUoKSYmS2UocWUoKSkmJihuPUtlKHFlKCkpKSxrLmZvcm1hdChlLHQse2xvY2FsZTpuLHVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VuczohMCx1c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zOiEwfSl9ZnVuY3Rpb24gRWUoZSx0KXt2YXIgcj10LmRhdGVGb3JtYXQsbj10LmxvY2FsZSxhPUFycmF5LmlzQXJyYXkocikmJnIubGVuZ3RoPjA/clswXTpyO3JldHVybiBlJiZfZShlLGEsbil8fFwiXCJ9ZnVuY3Rpb24gUGUoZSx0KXt2YXIgcj10LmhvdXIsbj12b2lkIDA9PT1yPzA6cixhPXQubWludXRlLG89dm9pZCAwPT09YT8wOmEscz10LnNlY29uZCxpPXZvaWQgMD09PXM/MDpzO3JldHVybiBqLnNldEhvdXJzKFUuc2V0TWludXRlcyhYLnNldFNlY29uZHMoZSxpKSxvKSxuKX1mdW5jdGlvbiBZZShlKXtyZXR1cm4gSi5zdGFydE9mRGF5KGUpfWZ1bmN0aW9uIHhlKGUsdCxyKXt2YXIgbj1LZSh0fHxxZSgpKTtyZXR1cm4gdGUuc3RhcnRPZldlZWsoZSx7bG9jYWxlOm4sd2Vla1N0YXJ0c09uOnJ9KX1mdW5jdGlvbiBOZShlKXtyZXR1cm4gWi5zdGFydE9mTW9udGgoZSl9ZnVuY3Rpb24gT2UoZSl7cmV0dXJuIHJlLnN0YXJ0T2ZZZWFyKGUpfWZ1bmN0aW9uIEllKGUpe3JldHVybiBlZS5zdGFydE9mUXVhcnRlcihlKX1mdW5jdGlvbiBUZSgpe3JldHVybiBKLnN0YXJ0T2ZEYXkoTWUoKSl9ZnVuY3Rpb24gUmUoZSl7cmV0dXJuIHYuZW5kT2ZEYXkoZSl9ZnVuY3Rpb24gTGUoZSx0KXtyZXR1cm4gZSYmdD9GLmlzU2FtZVllYXIoZSx0KTohZSYmIXR9ZnVuY3Rpb24gQWUoZSx0KXtyZXR1cm4gZSYmdD9MLmlzU2FtZU1vbnRoKGUsdCk6IWUmJiF0fWZ1bmN0aW9uIEZlKGUsdCl7cmV0dXJuIGUmJnQ/QS5pc1NhbWVRdWFydGVyKGUsdCk6IWUmJiF0fWZ1bmN0aW9uIEhlKGUsdCl7cmV0dXJuIGUmJnQ/Ui5pc1NhbWVEYXkoZSx0KTohZSYmIXR9ZnVuY3Rpb24gV2UoZSx0KXtyZXR1cm4gZSYmdD9ULmlzRXF1YWwoZSx0KTohZSYmIXR9ZnVuY3Rpb24gUWUoZSx0LHIpe3ZhciBuLGE9Si5zdGFydE9mRGF5KHQpLG89di5lbmRPZkRheShyKTt0cnl7bj1XLmlzV2l0aGluSW50ZXJ2YWwoZSx7c3RhcnQ6YSxlbmQ6b30pfWNhdGNoKGUpe249ITF9cmV0dXJuIG59ZnVuY3Rpb24gcWUoKXtyZXR1cm4gd2UoKS5fX2xvY2FsZUlkX199ZnVuY3Rpb24gS2UoZSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpe3ZhciB0PXdlKCk7cmV0dXJuIHQuX19sb2NhbGVEYXRhX18/dC5fX2xvY2FsZURhdGFfX1tlXTp2b2lkIDB9cmV0dXJuIGV9ZnVuY3Rpb24gQmUoZSx0KXtyZXR1cm4gX2UoJC5zZXRNb250aChNZSgpLGUpLFwiTExMTFwiLHQpfWZ1bmN0aW9uIFZlKGUsdCl7cmV0dXJuIF9lKCQuc2V0TW9udGgoTWUoKSxlKSxcIkxMTFwiLHQpfWZ1bmN0aW9uIGplKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5tYXhEYXRlLG89ci5leGNsdWRlRGF0ZXMscz1yLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzLGk9ci5pbmNsdWRlRGF0ZXMsbD1yLmluY2x1ZGVEYXRlSW50ZXJ2YWxzLGM9ci5maWx0ZXJEYXRlO3JldHVybiB0dChlLHttaW5EYXRlOm4sbWF4RGF0ZTphfSl8fG8mJm8uc29tZSgoZnVuY3Rpb24odCl7dmFyIHI7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlP0hlKGUsdCk6SGUoZSxudWxsIT09KHI9dC5kYXRlKSYmdm9pZCAwIT09cj9yOm5ldyBEYXRlKX0pKXx8cyYmcy5zb21lKChmdW5jdGlvbih0KXt2YXIgcj10LnN0YXJ0LG49dC5lbmQ7cmV0dXJuIFcuaXNXaXRoaW5JbnRlcnZhbChlLHtzdGFydDpyLGVuZDpufSl9KSl8fGkmJiFpLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBIZShlLHQpfSkpfHxsJiYhbC5zb21lKChmdW5jdGlvbih0KXt2YXIgcj10LnN0YXJ0LG49dC5lbmQ7cmV0dXJuIFcuaXNXaXRoaW5JbnRlcnZhbChlLHtzdGFydDpyLGVuZDpufSl9KSl8fGMmJiFjKE1lKGUpKXx8ITF9ZnVuY3Rpb24gVWUoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLmV4Y2x1ZGVEYXRlcyxhPXIuZXhjbHVkZURhdGVJbnRlcnZhbHM7cmV0dXJuIGEmJmEubGVuZ3RoPjA/YS5zb21lKChmdW5jdGlvbih0KXt2YXIgcj10LnN0YXJ0LG49dC5lbmQ7cmV0dXJuIFcuaXNXaXRoaW5JbnRlcnZhbChlLHtzdGFydDpyLGVuZDpufSl9KSk6biYmbi5zb21lKChmdW5jdGlvbih0KXt2YXIgcjtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGU/SGUoZSx0KTpIZShlLG51bGwhPT0ocj10LmRhdGUpJiZ2b2lkIDAhPT1yP3I6bmV3IERhdGUpfSkpfHwhMX1mdW5jdGlvbiAkZShlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWluRGF0ZSxhPXIubWF4RGF0ZSxvPXIuZXhjbHVkZURhdGVzLHM9ci5pbmNsdWRlRGF0ZXMsaT1yLmZpbHRlckRhdGU7cmV0dXJuIHR0KGUse21pbkRhdGU6bj9aLnN0YXJ0T2ZNb250aChuKTp2b2lkIDAsbWF4RGF0ZTphP2cuZW5kT2ZNb250aChhKTp2b2lkIDB9KXx8KG51bGw9PW8/dm9pZCAwOm8uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEFlKGUsdCBpbnN0YW5jZW9mIERhdGU/dDp0LmRhdGUpfSkpKXx8cyYmIXMuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEFlKGUsdCl9KSl8fGkmJiFpKE1lKGUpKXx8ITF9ZnVuY3Rpb24gemUoZSx0LHIsbil7dmFyIGE9eC5nZXRZZWFyKGUpLG89Xy5nZXRNb250aChlKSxzPXguZ2V0WWVhcih0KSxpPV8uZ2V0TW9udGgodCksbD14LmdldFllYXIobik7cmV0dXJuIGE9PT1zJiZhPT09bD9vPD1yJiZyPD1pOmE8cyYmKGw9PT1hJiZvPD1yfHxsPT09cyYmaT49cnx8bDxzJiZsPmEpfWZ1bmN0aW9uIFhlKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5tYXhEYXRlLG89ci5leGNsdWRlRGF0ZXMscz1yLmluY2x1ZGVEYXRlcztyZXR1cm4gdHQoZSx7bWluRGF0ZTpuLG1heERhdGU6YX0pfHxvJiZvLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBBZSh0IGluc3RhbmNlb2YgRGF0ZT90OnQuZGF0ZSxlKX0pKXx8cyYmIXMuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEFlKHQsZSl9KSl8fCExfWZ1bmN0aW9uIEdlKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5tYXhEYXRlLG89ci5leGNsdWRlRGF0ZXMscz1yLmluY2x1ZGVEYXRlcyxpPXIuZmlsdGVyRGF0ZTtyZXR1cm4gdHQoZSx7bWluRGF0ZTpuLG1heERhdGU6YX0pfHwobnVsbD09bz92b2lkIDA6by5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gRmUoZSx0IGluc3RhbmNlb2YgRGF0ZT90OnQuZGF0ZSl9KSkpfHxzJiYhcy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gRmUoZSx0KX0pKXx8aSYmIWkoTWUoZSkpfHwhMX1mdW5jdGlvbiBKZShlLHQscil7aWYoIXR8fCFyKXJldHVybiExO2lmKCFILmlzVmFsaWQodCl8fCFILmlzVmFsaWQocikpcmV0dXJuITE7dmFyIG49eC5nZXRZZWFyKHQpLGE9eC5nZXRZZWFyKHIpO3JldHVybiBuPD1lJiZhPj1lfWZ1bmN0aW9uIFplKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5tYXhEYXRlLG89ci5leGNsdWRlRGF0ZXMscz1yLmluY2x1ZGVEYXRlcyxpPXIuZmlsdGVyRGF0ZSxsPW5ldyBEYXRlKGUsMCwxKTtyZXR1cm4gdHQobCx7bWluRGF0ZTpuP3JlLnN0YXJ0T2ZZZWFyKG4pOnZvaWQgMCxtYXhEYXRlOmE/eS5lbmRPZlllYXIoYSk6dm9pZCAwfSl8fChudWxsPT1vP3ZvaWQgMDpvLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBMZShsLGUgaW5zdGFuY2VvZiBEYXRlP2U6ZS5kYXRlKX0pKSl8fHMmJiFzLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBMZShsLGUpfSkpfHxpJiYhaShNZShsKSl8fCExfWZ1bmN0aW9uIGV0KGUsdCxyLG4pe3ZhciBhPXguZ2V0WWVhcihlKSxvPUUuZ2V0UXVhcnRlcihlKSxzPXguZ2V0WWVhcih0KSxpPUUuZ2V0UXVhcnRlcih0KSxsPXguZ2V0WWVhcihuKTtyZXR1cm4gYT09PXMmJmE9PT1sP288PXImJnI8PWk6YTxzJiYobD09PWEmJm88PXJ8fGw9PT1zJiZpPj1yfHxsPHMmJmw+YSl9ZnVuY3Rpb24gdHQoZSx0KXt2YXIgcixuPXZvaWQgMD09PXQ/e306dCxhPW4ubWluRGF0ZSxvPW4ubWF4RGF0ZTtyZXR1cm4gbnVsbCE9PShyPWEmJnUuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsYSk8MHx8byYmdS5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSxvKT4wKSYmdm9pZCAwIT09ciYmcn1mdW5jdGlvbiBydChlLHQpe3JldHVybiB0LnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBiLmdldEhvdXJzKHQpPT09Yi5nZXRIb3VycyhlKSYmQy5nZXRNaW51dGVzKHQpPT09Qy5nZXRNaW51dGVzKGUpJiZQLmdldFNlY29uZHModCk9PT1QLmdldFNlY29uZHMoZSl9KSl9ZnVuY3Rpb24gbnQoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLmV4Y2x1ZGVUaW1lcyxhPXIuaW5jbHVkZVRpbWVzLG89ci5maWx0ZXJUaW1lO3JldHVybiBuJiZydChlLG4pfHxhJiYhcnQoZSxhKXx8byYmIW8oZSl8fCExfWZ1bmN0aW9uIGF0KGUsdCl7dmFyIHI9dC5taW5UaW1lLG49dC5tYXhUaW1lO2lmKCFyfHwhbil0aHJvdyBuZXcgRXJyb3IoXCJCb3RoIG1pblRpbWUgYW5kIG1heFRpbWUgcHJvcHMgcmVxdWlyZWRcIik7dmFyIGE9TWUoKTthPWouc2V0SG91cnMoYSxiLmdldEhvdXJzKGUpKSxhPVUuc2V0TWludXRlcyhhLEMuZ2V0TWludXRlcyhlKSksYT1YLnNldFNlY29uZHMoYSxQLmdldFNlY29uZHMoZSkpO3ZhciBvPU1lKCk7bz1qLnNldEhvdXJzKG8sYi5nZXRIb3VycyhyKSksbz1VLnNldE1pbnV0ZXMobyxDLmdldE1pbnV0ZXMocikpLG89WC5zZXRTZWNvbmRzKG8sUC5nZXRTZWNvbmRzKHIpKTt2YXIgcyxpPU1lKCk7aT1qLnNldEhvdXJzKGksYi5nZXRIb3VycyhuKSksaT1VLnNldE1pbnV0ZXMoaSxDLmdldE1pbnV0ZXMobikpLGk9WC5zZXRTZWNvbmRzKGksUC5nZXRTZWNvbmRzKG4pKTt0cnl7cz0hVy5pc1dpdGhpbkludGVydmFsKGEse3N0YXJ0Om8sZW5kOml9KX1jYXRjaChlKXtzPSExfXJldHVybiBzfWZ1bmN0aW9uIG90KGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz1hZS5zdWJNb250aHMoZSwxKTtyZXR1cm4gbiYmZi5kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhuLG8pPjB8fGEmJmEuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBmLmRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKGUsbyk+MH0pKXx8ITF9ZnVuY3Rpb24gc3QoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1heERhdGUsYT1yLmluY2x1ZGVEYXRlcyxvPWkuYWRkTW9udGhzKGUsMSk7cmV0dXJuIG4mJmYuZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobyxuKT4wfHxhJiZhLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gZi5kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhvLGUpPjB9KSl8fCExfWZ1bmN0aW9uIGl0KGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz1pZS5zdWJZZWFycyhlLDEpO3JldHVybiBuJiZtLmRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobixvKT4wfHxhJiZhLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gbS5kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKGUsbyk+MH0pKXx8ITF9ZnVuY3Rpb24gbHQoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1heERhdGUsYT1yLmluY2x1ZGVEYXRlcyxvPWQuYWRkWWVhcnMoZSwxKTtyZXR1cm4gbiYmbS5kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKG8sbik+MHx8YSYmYS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIG0uZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhvLGUpPjB9KSl8fCExfWZ1bmN0aW9uIGN0KGUpe3ZhciB0PWUubWluRGF0ZSxyPWUuaW5jbHVkZURhdGVzO2lmKHImJnQpe3ZhciBuPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gdS5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSx0KT49MH0pKTtyZXR1cm4gcS5taW4obil9cmV0dXJuIHI/cS5taW4ocik6dH1mdW5jdGlvbiBwdChlKXt2YXIgdD1lLm1heERhdGUscj1lLmluY2x1ZGVEYXRlcztpZihyJiZ0KXt2YXIgbj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIHUuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsdCk8PTB9KSk7cmV0dXJuIFEubWF4KG4pfXJldHVybiByP1EubWF4KHIpOnR9ZnVuY3Rpb24gZHQoZSx0KXt2YXIgcjt2b2lkIDA9PT1lJiYoZT1bXSksdm9pZCAwPT09dCYmKHQ9XCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkXCIpO2Zvcih2YXIgbj1uZXcgTWFwLGE9MCxvPWUubGVuZ3RoO2E8bzthKyspe3ZhciBzPWVbYV07aWYoSS5pc0RhdGUocykpe3ZhciBpPV9lKHMsXCJNTS5kZC55eXl5XCIpOyhmPW4uZ2V0KGkpfHxbXSkuaW5jbHVkZXModCl8fChmLnB1c2godCksbi5zZXQoaSxmKSl9ZWxzZSBpZihcIm9iamVjdFwiPT10eXBlb2Ygcyl7dmFyIGw9bnVsbCE9PShyPU9iamVjdC5rZXlzKHMpWzBdKSYmdm9pZCAwIT09cj9yOlwiXCIsYz1zW2xdO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBsJiZBcnJheS5pc0FycmF5KGMpKWZvcih2YXIgcD0wLGQ9Yy5sZW5ndGg7cDxkO3ArKyl7dmFyIHU9Y1twXTtpZih1KXt2YXIgZjtpPV9lKHUsXCJNTS5kZC55eXl5XCIpOyhmPW4uZ2V0KGkpfHxbXSkuaW5jbHVkZXMobCl8fChmLnB1c2gobCksbi5zZXQoaSxmKSl9fX19cmV0dXJuIG59ZnVuY3Rpb24gdXQoZSx0KXt2b2lkIDA9PT1lJiYoZT1bXSksdm9pZCAwPT09dCYmKHQ9XCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzXCIpO3ZhciByPW5ldyBNYXA7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5kYXRlLGE9ZS5ob2xpZGF5TmFtZTtpZihJLmlzRGF0ZShuKSl7dmFyIG89X2UobixcIk1NLmRkLnl5eXlcIikscz1yLmdldChvKXx8e2NsYXNzTmFtZTpcIlwiLGhvbGlkYXlOYW1lczpbXX07aWYoIShcImNsYXNzTmFtZVwiaW4gcyl8fHMuY2xhc3NOYW1lIT09dHx8KGk9cy5ob2xpZGF5TmFtZXMsbD1bYV0saS5sZW5ndGghPT1sLmxlbmd0aHx8IWkuZXZlcnkoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT1sW3RdfSkpKSl7dmFyIGksbDtzLmNsYXNzTmFtZT10O3ZhciBjPXMuaG9saWRheU5hbWVzO3MuaG9saWRheU5hbWVzPWM/RGUoRGUoW10sYywhMCksW2FdLCExKTpbYV0sci5zZXQobyxzKX19fSkpLHJ9ZnVuY3Rpb24gZnQoZSx0LHIsbixhKXtmb3IodmFyIGk9YS5sZW5ndGgsbD1bXSxwPTA7cDxpO3ArKyl7dmFyIGQ9ZSx1PWFbcF07dSYmKGQ9by5hZGRIb3VycyhkLGIuZ2V0SG91cnModSkpLGQ9cy5hZGRNaW51dGVzKGQsQy5nZXRNaW51dGVzKHUpKSxkPWMuYWRkU2Vjb25kcyhkLFAuZ2V0U2Vjb25kcyh1KSkpO3ZhciBmPXMuYWRkTWludXRlcyhlLChyKzEpKm4pO04uaXNBZnRlcihkLHQpJiZPLmlzQmVmb3JlKGQsZikmJm51bGwhPXUmJmwucHVzaCh1KX1yZXR1cm4gbH1mdW5jdGlvbiBodChlKXtyZXR1cm4gZTwxMD9cIjBcIi5jb25jYXQoZSk6XCJcIi5jb25jYXQoZSl9ZnVuY3Rpb24gbXQoZSx0KXt2b2lkIDA9PT10JiYodD1TZSk7dmFyIHI9TWF0aC5jZWlsKHguZ2V0WWVhcihlKS90KSp0O3JldHVybntzdGFydFBlcmlvZDpyLSh0LTEpLGVuZFBlcmlvZDpyfX1mdW5jdGlvbiB2dChlKXt2YXIgdD1lLmdldFNlY29uZHMoKSxyPWUuZ2V0TWlsbGlzZWNvbmRzKCk7cmV0dXJuIGxlLnRvRGF0ZShlLmdldFRpbWUoKS0xZTMqdC1yKX1mdW5jdGlvbiBndChlKXtpZighSS5pc0RhdGUoZSkpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRlXCIpO3ZhciB0PW5ldyBEYXRlKGUpO3JldHVybiB0LnNldEhvdXJzKDAsMCwwLDApLHR9ZnVuY3Rpb24gRHQoZSx0KXtpZighSS5pc0RhdGUoZSl8fCFJLmlzRGF0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRhdGUgcmVjZWl2ZWRcIik7dmFyIHI9Z3QoZSksbj1ndCh0KTtyZXR1cm4gTy5pc0JlZm9yZShyLG4pfWZ1bmN0aW9uIHl0KGUpe3JldHVybiBlLmtleT09PXllLlNwYWNlfXZhciBrdCx3dD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLm9uVGltZUNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdCxyO24uc2V0U3RhdGUoe3RpbWU6ZX0pO3ZhciBhPW4ucHJvcHMuZGF0ZSxvPWEgaW5zdGFuY2VvZiBEYXRlJiYhaXNOYU4oK2EpP2E6bmV3IERhdGU7aWYobnVsbD09ZT92b2lkIDA6ZS5pbmNsdWRlcyhcIjpcIikpe3ZhciBzPWUuc3BsaXQoXCI6XCIpLGk9c1swXSxsPXNbMV07by5zZXRIb3VycyhOdW1iZXIoaSkpLG8uc2V0TWludXRlcyhOdW1iZXIobCkpfW51bGw9PT0ocj0odD1uLnByb3BzKS5vbkNoYW5nZSl8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LG8pfSxuLnJlbmRlclRpbWVJbnB1dD1mdW5jdGlvbigpe3ZhciBlPW4uc3RhdGUudGltZSx0PW4ucHJvcHMsYT10LmRhdGUsbz10LnRpbWVTdHJpbmcscz10LmN1c3RvbVRpbWVJbnB1dDtyZXR1cm4gcz9yLmNsb25lRWxlbWVudChzLHtkYXRlOmEsdmFsdWU6ZSxvbkNoYW5nZTpuLm9uVGltZUNoYW5nZX0pOnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImlucHV0XCIse3R5cGU6XCJ0aW1lXCIsY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dFwiLHBsYWNlaG9sZGVyOlwiVGltZVwiLG5hbWU6XCJ0aW1lLWlucHV0XCIscmVxdWlyZWQ6ITAsdmFsdWU6ZSxvbkNoYW5nZTpmdW5jdGlvbihlKXtuLm9uVGltZUNoYW5nZShlLnRhcmdldC52YWx1ZXx8byl9fSl9LG4uc3RhdGU9e3RpbWU6bi5wcm9wcy50aW1lU3RyaW5nfSxufXJldHVybiB2ZSh0LGUpLHQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudGltZVN0cmluZyE9PXQudGltZT97dGltZTplLnRpbWVTdHJpbmd9Om51bGx9LHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXJcIn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXItdGltZV9fY2FwdGlvblwifSx0aGlzLnByb3BzLnRpbWVJbnB1dExhYmVsKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXJcIn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXRcIn0sdGhpcy5yZW5kZXJUaW1lSW5wdXQoKSkpKX0sdH0oci5Db21wb25lbnQpLFN0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4uZGF5RWw9ci5jcmVhdGVSZWYoKSxuLmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGUpeyFuLmlzRGlzYWJsZWQoKSYmbi5wcm9wcy5vbkNsaWNrJiZuLnByb3BzLm9uQ2xpY2soZSl9LG4uaGFuZGxlTW91c2VFbnRlcj1mdW5jdGlvbihlKXshbi5pc0Rpc2FibGVkKCkmJm4ucHJvcHMub25Nb3VzZUVudGVyJiZuLnByb3BzLm9uTW91c2VFbnRlcihlKX0sbi5oYW5kbGVPbktleURvd249ZnVuY3Rpb24oZSl7dmFyIHQscjtlLmtleT09PXllLlNwYWNlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUua2V5PXllLkVudGVyKSxudWxsPT09KHI9KHQ9bi5wcm9wcykuaGFuZGxlT25LZXlEb3duKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSl9LG4uaXNTYW1lRGF5PWZ1bmN0aW9uKGUpe3JldHVybiBIZShuLnByb3BzLmRheSxlKX0sbi5pc0tleWJvYXJkU2VsZWN0ZWQ9ZnVuY3Rpb24oKXt2YXIgZTtpZihuLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uKXJldHVybiExO3ZhciB0PW4ucHJvcHMuc2VsZWN0c011bHRpcGxlP251bGw9PT0oZT1uLnByb3BzLnNlbGVjdGVkRGF0ZXMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBuLmlzU2FtZURheU9yV2VlayhlKX0pKTpuLmlzU2FtZURheU9yV2VlayhuLnByb3BzLnNlbGVjdGVkKSxyPW4ucHJvcHMucHJlU2VsZWN0aW9uJiZuLmlzRGlzYWJsZWQobi5wcm9wcy5wcmVTZWxlY3Rpb24pO3JldHVybiF0JiZuLmlzU2FtZURheU9yV2VlayhuLnByb3BzLnByZVNlbGVjdGlvbikmJiFyfSxuLmlzRGlzYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPW4ucHJvcHMuZGF5KSxqZShlLHttaW5EYXRlOm4ucHJvcHMubWluRGF0ZSxtYXhEYXRlOm4ucHJvcHMubWF4RGF0ZSxleGNsdWRlRGF0ZXM6bi5wcm9wcy5leGNsdWRlRGF0ZXMsZXhjbHVkZURhdGVJbnRlcnZhbHM6bi5wcm9wcy5leGNsdWRlRGF0ZUludGVydmFscyxpbmNsdWRlRGF0ZUludGVydmFsczpuLnByb3BzLmluY2x1ZGVEYXRlSW50ZXJ2YWxzLGluY2x1ZGVEYXRlczpuLnByb3BzLmluY2x1ZGVEYXRlcyxmaWx0ZXJEYXRlOm4ucHJvcHMuZmlsdGVyRGF0ZX0pfSxuLmlzRXhjbHVkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gVWUobi5wcm9wcy5kYXkse2V4Y2x1ZGVEYXRlczpuLnByb3BzLmV4Y2x1ZGVEYXRlcyxleGNsdWRlRGF0ZUludGVydmFsczpuLnByb3BzLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzfSl9LG4uaXNTdGFydE9mV2Vlaz1mdW5jdGlvbigpe3JldHVybiBIZShuLnByb3BzLmRheSx4ZShuLnByb3BzLmRheSxuLnByb3BzLmxvY2FsZSxuLnByb3BzLmNhbGVuZGFyU3RhcnREYXkpKX0sbi5pc1NhbWVXZWVrPWZ1bmN0aW9uKGUpe3JldHVybiBuLnByb3BzLnNob3dXZWVrUGlja2VyJiZIZShlLHhlKG4ucHJvcHMuZGF5LG4ucHJvcHMubG9jYWxlLG4ucHJvcHMuY2FsZW5kYXJTdGFydERheSkpfSxuLmlzU2FtZURheU9yV2Vlaz1mdW5jdGlvbihlKXtyZXR1cm4gbi5pc1NhbWVEYXkoZSl8fG4uaXNTYW1lV2VlayhlKX0sbi5nZXRIaWdoTGlnaHRlZENsYXNzPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5oaWdobGlnaHREYXRlcztpZighcilyZXR1cm4hMTt2YXIgYT1fZSh0LFwiTU0uZGQueXl5eVwiKTtyZXR1cm4gci5nZXQoYSl9LG4uZ2V0SG9saWRheXNDbGFzcz1mdW5jdGlvbigpe3ZhciBlLHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5ob2xpZGF5cztpZighYSlyZXR1cm5bdm9pZCAwXTt2YXIgbz1fZShyLFwiTU0uZGQueXl5eVwiKTtyZXR1cm4gYS5oYXMobyk/W251bGw9PT0oZT1hLmdldChvKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuY2xhc3NOYW1lXTpbdm9pZCAwXX0sbi5pc0luUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLnN0YXJ0RGF0ZSxhPWUuZW5kRGF0ZTtyZXR1cm4hKCFyfHwhYSkmJlFlKHQscixhKX0sbi5pc0luU2VsZWN0aW5nUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgZSx0PW4ucHJvcHMscj10LmRheSxhPXQuc2VsZWN0c1N0YXJ0LG89dC5zZWxlY3RzRW5kLHM9dC5zZWxlY3RzUmFuZ2UsaT10LnNlbGVjdHNEaXNhYmxlZERheXNJblJhbmdlLGw9dC5zdGFydERhdGUsYz10LmVuZERhdGUscD1udWxsIT09KGU9bi5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09ZT9lOm4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybiEoIShhfHxvfHxzKXx8IXB8fCFpJiZuLmlzRGlzYWJsZWQoKSkmJihhJiZjJiYoTy5pc0JlZm9yZShwLGMpfHxXZShwLGMpKT9RZShyLHAsYyk6KG8mJmwmJihOLmlzQWZ0ZXIocCxsKXx8V2UocCxsKSl8fCEoIXN8fCFsfHxjfHwhTi5pc0FmdGVyKHAsbCkmJiFXZShwLGwpKSkmJlFlKHIsbCxwKSl9LG4uaXNTZWxlY3RpbmdSYW5nZVN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGU7aWYoIW4uaXNJblNlbGVjdGluZ1JhbmdlKCkpcmV0dXJuITE7dmFyIHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5zdGFydERhdGUsbz10LnNlbGVjdHNTdGFydCxzPW51bGwhPT0oZT1uLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT1lP2U6bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuIEhlKHIsbz9zOmEpfSxuLmlzU2VsZWN0aW5nUmFuZ2VFbmQ9ZnVuY3Rpb24oKXt2YXIgZTtpZighbi5pc0luU2VsZWN0aW5nUmFuZ2UoKSlyZXR1cm4hMTt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LmVuZERhdGUsbz10LnNlbGVjdHNFbmQscz10LnNlbGVjdHNSYW5nZSxpPW51bGwhPT0oZT1uLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT1lP2U6bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuIEhlKHIsb3x8cz9pOmEpfSxuLmlzUmFuZ2VTdGFydD1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMsdD1lLmRheSxyPWUuc3RhcnREYXRlLGE9ZS5lbmREYXRlO3JldHVybiEoIXJ8fCFhKSYmSGUocix0KX0sbi5pc1JhbmdlRW5kPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5zdGFydERhdGUsYT1lLmVuZERhdGU7cmV0dXJuISghcnx8IWEpJiZIZShhLHQpfSxuLmlzV2Vla2VuZD1mdW5jdGlvbigpe3ZhciBlPVMuZ2V0RGF5KG4ucHJvcHMuZGF5KTtyZXR1cm4gMD09PWV8fDY9PT1lfSxuLmlzQWZ0ZXJNb250aD1mdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT1uLnByb3BzLm1vbnRoJiYobi5wcm9wcy5tb250aCsxKSUxMj09PV8uZ2V0TW9udGgobi5wcm9wcy5kYXkpfSxuLmlzQmVmb3JlTW9udGg9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09bi5wcm9wcy5tb250aCYmKF8uZ2V0TW9udGgobi5wcm9wcy5kYXkpKzEpJTEyPT09bi5wcm9wcy5tb250aH0sbi5pc0N1cnJlbnREYXk9ZnVuY3Rpb24oKXtyZXR1cm4gbi5pc1NhbWVEYXkoTWUoKSl9LG4uaXNTZWxlY3RlZD1mdW5jdGlvbigpe3ZhciBlO3JldHVybiBuLnByb3BzLnNlbGVjdHNNdWx0aXBsZT9udWxsPT09KGU9bi5wcm9wcy5zZWxlY3RlZERhdGVzKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gbi5pc1NhbWVEYXlPcldlZWsoZSl9KSk6bi5pc1NhbWVEYXlPcldlZWsobi5wcm9wcy5zZWxlY3RlZCl9LG4uZ2V0Q2xhc3NOYW1lcz1mdW5jdGlvbihlKXt2YXIgcixhPW4ucHJvcHMuZGF5Q2xhc3NOYW1lP24ucHJvcHMuZGF5Q2xhc3NOYW1lKGUpOnZvaWQgMDtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5XCIsYSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tXCIrX2Uobi5wcm9wcy5kYXksXCJkZGRcIixyKSx7XCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkXCI6bi5pc0Rpc2FibGVkKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWV4Y2x1ZGVkXCI6bi5pc0V4Y2x1ZGVkKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkXCI6bi5pc1NlbGVjdGVkKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWtleWJvYXJkLXNlbGVjdGVkXCI6bi5pc0tleWJvYXJkU2VsZWN0ZWQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tcmFuZ2Utc3RhcnRcIjpuLmlzUmFuZ2VTdGFydCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1yYW5nZS1lbmRcIjpuLmlzUmFuZ2VFbmQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2VcIjpuLmlzSW5SYW5nZSgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2VcIjpuLmlzSW5TZWxlY3RpbmdSYW5nZSgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RpbmctcmFuZ2Utc3RhcnRcIjpuLmlzU2VsZWN0aW5nUmFuZ2VTdGFydCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RpbmctcmFuZ2UtZW5kXCI6bi5pc1NlbGVjdGluZ1JhbmdlRW5kKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXRvZGF5XCI6bi5pc0N1cnJlbnREYXkoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0td2Vla2VuZFwiOm4uaXNXZWVrZW5kKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLW91dHNpZGUtbW9udGhcIjpuLmlzQWZ0ZXJNb250aCgpfHxuLmlzQmVmb3JlTW9udGgoKX0sbi5nZXRIaWdoTGlnaHRlZENsYXNzKCksbi5nZXRIb2xpZGF5c0NsYXNzKCkpfSxuLmdldEFyaWFMYWJlbD1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMsdD1lLmRheSxyPWUuYXJpYUxhYmVsUHJlZml4V2hlbkVuYWJsZWQsYT12b2lkIDA9PT1yP1wiQ2hvb3NlXCI6cixvPWUuYXJpYUxhYmVsUHJlZml4V2hlbkRpc2FibGVkLHM9dm9pZCAwPT09bz9cIk5vdCBhdmFpbGFibGVcIjpvLGk9bi5pc0Rpc2FibGVkKCl8fG4uaXNFeGNsdWRlZCgpP3M6YTtyZXR1cm5cIlwiLmNvbmNhdChpLFwiIFwiKS5jb25jYXQoX2UodCxcIlBQUFBcIixuLnByb3BzLmxvY2FsZSkpfSxuLmdldFRpdGxlPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5ob2xpZGF5cyxhPXZvaWQgMD09PXI/bmV3IE1hcDpyLG89ZS5leGNsdWRlRGF0ZXMscz1fZSh0LFwiTU0uZGQueXl5eVwiKSxpPVtdO3JldHVybiBhLmhhcyhzKSYmaS5wdXNoLmFwcGx5KGksYS5nZXQocykuaG9saWRheU5hbWVzKSxuLmlzRXhjbHVkZWQoKSYmaS5wdXNoKG51bGw9PW8/dm9pZCAwOm8uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIERhdGU/SGUoZSx0KTpIZShudWxsPT1lP3ZvaWQgMDplLmRhdGUsdCl9KSkubWFwKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBEYXRlKSlyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZS5tZXNzYWdlfSkpKSxpLmpvaW4oXCIsIFwiKX0sbi5nZXRUYWJJbmRleD1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMuc2VsZWN0ZWQsdD1uLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4oIW4ucHJvcHMuc2hvd1dlZWtQaWNrZXJ8fCFuLnByb3BzLnNob3dXZWVrTnVtYmVyJiZuLmlzU3RhcnRPZldlZWsoKSkmJihuLmlzS2V5Ym9hcmRTZWxlY3RlZCgpfHxuLmlzU2FtZURheShlKSYmSGUodCxlKSk/MDotMX0sbi5oYW5kbGVGb2N1c0RheT1mdW5jdGlvbigpe3ZhciBlO24uc2hvdWxkRm9jdXNEYXkoKSYmKG51bGw9PT0oZT1uLmRheUVsLmN1cnJlbnQpfHx2b2lkIDA9PT1lfHxlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSkpfSxuLnJlbmRlckRheUNvbnRlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIG4ucHJvcHMubW9udGhTaG93c0R1cGxpY2F0ZURheXNFbmQmJm4uaXNBZnRlck1vbnRoKCl8fG4ucHJvcHMubW9udGhTaG93c0R1cGxpY2F0ZURheXNTdGFydCYmbi5pc0JlZm9yZU1vbnRoKCk/bnVsbDpuLnByb3BzLnJlbmRlckRheUNvbnRlbnRzP24ucHJvcHMucmVuZGVyRGF5Q29udGVudHMody5nZXREYXRlKG4ucHJvcHMuZGF5KSxuLnByb3BzLmRheSk6dy5nZXREYXRlKG4ucHJvcHMuZGF5KX0sbi5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse3JlZjpuLmRheUVsLGNsYXNzTmFtZTpuLmdldENsYXNzTmFtZXMobi5wcm9wcy5kYXkpLG9uS2V5RG93bjpuLmhhbmRsZU9uS2V5RG93bixvbkNsaWNrOm4uaGFuZGxlQ2xpY2ssb25Nb3VzZUVudGVyOm4ucHJvcHMudXNlUG9pbnRlckV2ZW50P3ZvaWQgMDpuLmhhbmRsZU1vdXNlRW50ZXIsb25Qb2ludGVyRW50ZXI6bi5wcm9wcy51c2VQb2ludGVyRXZlbnQ/bi5oYW5kbGVNb3VzZUVudGVyOnZvaWQgMCx0YWJJbmRleDpuLmdldFRhYkluZGV4KCksXCJhcmlhLWxhYmVsXCI6bi5nZXRBcmlhTGFiZWwoKSxyb2xlOlwib3B0aW9uXCIsdGl0bGU6bi5nZXRUaXRsZSgpLFwiYXJpYS1kaXNhYmxlZFwiOm4uaXNEaXNhYmxlZCgpLFwiYXJpYS1jdXJyZW50XCI6bi5pc0N1cnJlbnREYXkoKT9cImRhdGVcIjp2b2lkIDAsXCJhcmlhLXNlbGVjdGVkXCI6bi5pc1NlbGVjdGVkKCl8fG4uaXNJblJhbmdlKCl9LG4ucmVuZGVyRGF5Q29udGVudHMoKSxcIlwiIT09bi5nZXRUaXRsZSgpJiZ1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcIm92ZXJsYXlcIn0sbi5nZXRUaXRsZSgpKSl9LG59cmV0dXJuIHZlKG4sZSksbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZUZvY3VzRGF5KCl9LG4ucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuaGFuZGxlRm9jdXNEYXkoKX0sbi5wcm90b3R5cGUuc2hvdWxkRm9jdXNEYXk9ZnVuY3Rpb24oKXt2YXIgZT0hMTtyZXR1cm4gMD09PXRoaXMuZ2V0VGFiSW5kZXgoKSYmdGhpcy5pc1NhbWVEYXkodGhpcy5wcm9wcy5wcmVTZWxlY3Rpb24pJiYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWRvY3VtZW50LmJvZHl8fChlPSEwKSx0aGlzLnByb3BzLmlubGluZSYmIXRoaXMucHJvcHMuc2hvdWxkRm9jdXNEYXlJbmxpbmUmJihlPSExKSx0aGlzLmlzRGF5QWN0aXZlRWxlbWVudCgpJiYoZT0hMCksdGhpcy5pc0R1cGxpY2F0ZURheSgpJiYoZT0hMSkpLGV9LG4ucHJvdG90eXBlLmlzRGF5QWN0aXZlRWxlbWVudD1mdW5jdGlvbigpe3ZhciBlLHQscjtyZXR1cm4obnVsbD09PSh0PW51bGw9PT0oZT10aGlzLnByb3BzLmNvbnRhaW5lclJlZil8fHZvaWQgMD09PWU/dm9pZCAwOmUuY3VycmVudCl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpJiYobnVsbD09PShyPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmNsYXNzTGlzdC5jb250YWlucyhcInJlYWN0LWRhdGVwaWNrZXJfX2RheVwiKSl9LG4ucHJvdG90eXBlLmlzRHVwbGljYXRlRGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcHMubW9udGhTaG93c0R1cGxpY2F0ZURheXNFbmQmJnRoaXMuaXNBZnRlck1vbnRoKCl8fHRoaXMucHJvcHMubW9udGhTaG93c0R1cGxpY2F0ZURheXNTdGFydCYmdGhpcy5pc0JlZm9yZU1vbnRoKCl9LG59KHIuQ29tcG9uZW50KSxidD1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0LndlZWtOdW1iZXJFbD1yLmNyZWF0ZVJlZigpLHQuaGFuZGxlQ2xpY2s9ZnVuY3Rpb24oZSl7dC5wcm9wcy5vbkNsaWNrJiZ0LnByb3BzLm9uQ2xpY2soZSl9LHQuaGFuZGxlT25LZXlEb3duPWZ1bmN0aW9uKGUpe3ZhciByLG47ZS5rZXk9PT15ZS5TcGFjZSYmKGUucHJldmVudERlZmF1bHQoKSxlLmtleT15ZS5FbnRlciksbnVsbD09PShuPShyPXQucHJvcHMpLmhhbmRsZU9uS2V5RG93bil8fHZvaWQgMD09PW58fG4uY2FsbChyLGUpfSx0LmlzS2V5Ym9hcmRTZWxlY3RlZD1mdW5jdGlvbigpe3JldHVybiF0LnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uJiYhSGUodC5wcm9wcy5kYXRlLHQucHJvcHMuc2VsZWN0ZWQpJiZIZSh0LnByb3BzLmRhdGUsdC5wcm9wcy5wcmVTZWxlY3Rpb24pfSx0LmdldFRhYkluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvcHMuc2hvd1dlZWtQaWNrZXImJnQucHJvcHMuc2hvd1dlZWtOdW1iZXImJih0LmlzS2V5Ym9hcmRTZWxlY3RlZCgpfHxIZSh0LnByb3BzLmRhdGUsdC5wcm9wcy5zZWxlY3RlZCkmJkhlKHQucHJvcHMucHJlU2VsZWN0aW9uLHQucHJvcHMuc2VsZWN0ZWQpKT8wOi0xfSx0LmhhbmRsZUZvY3VzV2Vla051bWJlcj1mdW5jdGlvbihlKXt2YXIgcj0hMTswPT09dC5nZXRUYWJJbmRleCgpJiYhKG51bGw9PWU/dm9pZCAwOmUuaXNJbnB1dEZvY3VzZWQpJiZIZSh0LnByb3BzLmRhdGUsdC5wcm9wcy5wcmVTZWxlY3Rpb24pJiYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWRvY3VtZW50LmJvZHl8fChyPSEwKSx0LnByb3BzLmlubGluZSYmIXQucHJvcHMuc2hvdWxkRm9jdXNEYXlJbmxpbmUmJihyPSExKSx0LnByb3BzLmNvbnRhaW5lclJlZiYmdC5wcm9wcy5jb250YWluZXJSZWYuY3VycmVudCYmdC5wcm9wcy5jb250YWluZXJSZWYuY3VycmVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJyZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlclwiKSYmKHI9ITApKSxyJiZ0LndlZWtOdW1iZXJFbC5jdXJyZW50JiZ0LndlZWtOdW1iZXJFbC5jdXJyZW50LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9LHR9cmV0dXJuIHZlKG4sZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FyaWFMYWJlbFByZWZpeDpcIndlZWsgXCJ9fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLG4ucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVGb2N1c1dlZWtOdW1iZXIoKX0sbi5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMuaGFuZGxlRm9jdXNXZWVrTnVtYmVyKGUpfSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHI9ZS53ZWVrTnVtYmVyLGE9ZS5hcmlhTGFiZWxQcmVmaXgsbz12b2lkIDA9PT1hP24uZGVmYXVsdFByb3BzLmFyaWFMYWJlbFByZWZpeDphLHM9ZS5vbkNsaWNrLGk9e1wicmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXJcIjohMCxcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1jbGlja2FibGVcIjohIXMsXCJyZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tc2VsZWN0ZWRcIjohIXMmJkhlKHRoaXMucHJvcHMuZGF0ZSx0aGlzLnByb3BzLnNlbGVjdGVkKSxcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZFwiOnRoaXMuaXNLZXlib2FyZFNlbGVjdGVkKCl9O3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOnRoaXMud2Vla051bWJlckVsLGNsYXNzTmFtZTp0LmNsc3goaSksXCJhcmlhLWxhYmVsXCI6XCJcIi5jb25jYXQobyxcIiBcIikuY29uY2F0KHRoaXMucHJvcHMud2Vla051bWJlciksb25DbGljazp0aGlzLmhhbmRsZUNsaWNrLG9uS2V5RG93bjp0aGlzLmhhbmRsZU9uS2V5RG93bix0YWJJbmRleDp0aGlzLmdldFRhYkluZGV4KCl9LHIpfSxufShyLkNvbXBvbmVudCksTXQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcigpe3ZhciB0PW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gdC5pc0Rpc2FibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBqZShlLHttaW5EYXRlOnQucHJvcHMubWluRGF0ZSxtYXhEYXRlOnQucHJvcHMubWF4RGF0ZSxleGNsdWRlRGF0ZXM6dC5wcm9wcy5leGNsdWRlRGF0ZXMsZXhjbHVkZURhdGVJbnRlcnZhbHM6dC5wcm9wcy5leGNsdWRlRGF0ZUludGVydmFscyxpbmNsdWRlRGF0ZUludGVydmFsczp0LnByb3BzLmluY2x1ZGVEYXRlSW50ZXJ2YWxzLGluY2x1ZGVEYXRlczp0LnByb3BzLmluY2x1ZGVEYXRlcyxmaWx0ZXJEYXRlOnQucHJvcHMuZmlsdGVyRGF0ZX0pfSx0LmhhbmRsZURheUNsaWNrPWZ1bmN0aW9uKGUscil7dC5wcm9wcy5vbkRheUNsaWNrJiZ0LnByb3BzLm9uRGF5Q2xpY2soZSxyKX0sdC5oYW5kbGVEYXlNb3VzZUVudGVyPWZ1bmN0aW9uKGUpe3QucHJvcHMub25EYXlNb3VzZUVudGVyJiZ0LnByb3BzLm9uRGF5TW91c2VFbnRlcihlKX0sdC5oYW5kbGVXZWVrQ2xpY2s9ZnVuY3Rpb24oZSxuLGEpe2Zvcih2YXIgbyxzLGksbD1uZXcgRGF0ZShlKSxjPTA7Yzw3O2MrKyl7dmFyIHA9bmV3IERhdGUoZSk7aWYocC5zZXREYXRlKHAuZ2V0RGF0ZSgpK2MpLCF0LmlzRGlzYWJsZWQocCkpe2w9cDticmVha319XCJmdW5jdGlvblwiPT10eXBlb2YgdC5wcm9wcy5vbldlZWtTZWxlY3QmJnQucHJvcHMub25XZWVrU2VsZWN0KGwsbixhKSx0LnByb3BzLnNob3dXZWVrUGlja2VyJiZ0LmhhbmRsZURheUNsaWNrKGwsYSksKG51bGwhPT0obz10LnByb3BzLnNob3VsZENsb3NlT25TZWxlY3QpJiZ2b2lkIDAhPT1vP286ci5kZWZhdWx0UHJvcHMuc2hvdWxkQ2xvc2VPblNlbGVjdCkmJihudWxsPT09KGk9KHM9dC5wcm9wcykuc2V0T3Blbil8fHZvaWQgMD09PWl8fGkuY2FsbChzLCExKSl9LHQuZm9ybWF0V2Vla051bWJlcj1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm9wcy5mb3JtYXRXZWVrTnVtYmVyP3QucHJvcHMuZm9ybWF0V2Vla051bWJlcihlKTpmdW5jdGlvbihlKXtyZXR1cm4gTS5nZXRJU09XZWVrKGUpfShlKX0sdC5yZW5kZXJEYXlzPWZ1bmN0aW9uKCl7dmFyIGU9dC5zdGFydE9mV2VlaygpLG49W10sbz10LmZvcm1hdFdlZWtOdW1iZXIoZSk7aWYodC5wcm9wcy5zaG93V2Vla051bWJlcil7dmFyIHM9dC5wcm9wcy5vbldlZWtTZWxlY3R8fHQucHJvcHMuc2hvd1dlZWtQaWNrZXI/dC5oYW5kbGVXZWVrQ2xpY2suYmluZCh0LGUsbyk6dm9pZCAwO24ucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYnQsZ2Uoe2tleTpcIldcIn0sci5kZWZhdWx0UHJvcHMsdC5wcm9wcyx7d2Vla051bWJlcjpvLGRhdGU6ZSxvbkNsaWNrOnN9KSkpfXJldHVybiBuLmNvbmNhdChbMCwxLDIsMyw0LDUsNl0ubWFwKChmdW5jdGlvbihuKXt2YXIgbz1hLmFkZERheXMoZSxuKTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFN0LGdlKHt9LHIuZGVmYXVsdFByb3BzLHQucHJvcHMse2FyaWFMYWJlbFByZWZpeFdoZW5FbmFibGVkOnQucHJvcHMuY2hvb3NlRGF5QXJpYUxhYmVsUHJlZml4LGFyaWFMYWJlbFByZWZpeFdoZW5EaXNhYmxlZDp0LnByb3BzLmRpc2FibGVkRGF5QXJpYUxhYmVsUHJlZml4LGtleTpvLnZhbHVlT2YoKSxkYXk6byxvbkNsaWNrOnQuaGFuZGxlRGF5Q2xpY2suYmluZCh0LG8pLG9uTW91c2VFbnRlcjp0LmhhbmRsZURheU1vdXNlRW50ZXIuYmluZCh0LG8pfSkpfSkpKX0sdC5zdGFydE9mV2Vlaz1mdW5jdGlvbigpe3JldHVybiB4ZSh0LnByb3BzLmRheSx0LnByb3BzLmxvY2FsZSx0LnByb3BzLmNhbGVuZGFyU3RhcnREYXkpfSx0LmlzS2V5Ym9hcmRTZWxlY3RlZD1mdW5jdGlvbigpe3JldHVybiF0LnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uJiYhSGUodC5zdGFydE9mV2VlaygpLHQucHJvcHMuc2VsZWN0ZWQpJiZIZSh0LnN0YXJ0T2ZXZWVrKCksdC5wcm9wcy5wcmVTZWxlY3Rpb24pfSx0fXJldHVybiB2ZShyLGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLFwiZGVmYXVsdFByb3BzXCIse2dldDpmdW5jdGlvbigpe3JldHVybntzaG91bGRDbG9zZU9uU2VsZWN0OiEwfX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT17XCJyZWFjdC1kYXRlcGlja2VyX193ZWVrXCI6ITAsXCJyZWFjdC1kYXRlcGlja2VyX193ZWVrLS1zZWxlY3RlZFwiOkhlKHRoaXMuc3RhcnRPZldlZWsoKSx0aGlzLnByb3BzLnNlbGVjdGVkKSxcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstLWtleWJvYXJkLXNlbGVjdGVkXCI6dGhpcy5pc0tleWJvYXJkU2VsZWN0ZWQoKX07cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6dC5jbHN4KGUpfSx0aGlzLnJlbmRlckRheXMoKSl9LHJ9KHIuQ29tcG9uZW50KSxDdD1cInR3b19jb2x1bW5zXCIsX3Q9XCJ0aHJlZV9jb2x1bW5zXCIsRXQ9XCJmb3VyX2NvbHVtbnNcIixQdD0oKGt0PXt9KVtDdF09e2dyaWQ6W1swLDFdLFsyLDNdLFs0LDVdLFs2LDddLFs4LDldLFsxMCwxMV1dLHZlcnRpY2FsTmF2aWdhdGlvbk9mZnNldDoyfSxrdFtfdF09e2dyaWQ6W1swLDEsMl0sWzMsNCw1XSxbNiw3LDhdLFs5LDEwLDExXV0sdmVydGljYWxOYXZpZ2F0aW9uT2Zmc2V0OjN9LGt0W0V0XT17Z3JpZDpbWzAsMSwyLDNdLFs0LDUsNiw3XSxbOCw5LDEwLDExXV0sdmVydGljYWxOYXZpZ2F0aW9uT2Zmc2V0OjR9LGt0KTtmdW5jdGlvbiBZdChlLHQpe3JldHVybiBlP0V0OnQ/Q3Q6X3R9dmFyIHh0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4uTU9OVEhfUkVGUz1EZShbXSxBcnJheSgxMiksITApLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gci5jcmVhdGVSZWYoKX0pKSxuLlFVQVJURVJfUkVGUz1EZShbXSxBcnJheSg0KSwhMCkubWFwKChmdW5jdGlvbigpe3JldHVybiByLmNyZWF0ZVJlZigpfSkpLG4uaXNEaXNhYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gamUoZSx7bWluRGF0ZTpuLnByb3BzLm1pbkRhdGUsbWF4RGF0ZTpuLnByb3BzLm1heERhdGUsZXhjbHVkZURhdGVzOm4ucHJvcHMuZXhjbHVkZURhdGVzLGV4Y2x1ZGVEYXRlSW50ZXJ2YWxzOm4ucHJvcHMuZXhjbHVkZURhdGVJbnRlcnZhbHMsaW5jbHVkZURhdGVJbnRlcnZhbHM6bi5wcm9wcy5pbmNsdWRlRGF0ZUludGVydmFscyxpbmNsdWRlRGF0ZXM6bi5wcm9wcy5pbmNsdWRlRGF0ZXMsZmlsdGVyRGF0ZTpuLnByb3BzLmZpbHRlckRhdGV9KX0sbi5pc0V4Y2x1ZGVkPWZ1bmN0aW9uKGUpe3JldHVybiBVZShlLHtleGNsdWRlRGF0ZXM6bi5wcm9wcy5leGNsdWRlRGF0ZXMsZXhjbHVkZURhdGVJbnRlcnZhbHM6bi5wcm9wcy5leGNsdWRlRGF0ZUludGVydmFsc30pfSxuLmhhbmRsZURheUNsaWNrPWZ1bmN0aW9uKGUsdCl7dmFyIHIsYTtudWxsPT09KGE9KHI9bi5wcm9wcykub25EYXlDbGljayl8fHZvaWQgMD09PWF8fGEuY2FsbChyLGUsdCxuLnByb3BzLm9yZGVySW5EaXNwbGF5KX0sbi5oYW5kbGVEYXlNb3VzZUVudGVyPWZ1bmN0aW9uKGUpe3ZhciB0LHI7bnVsbD09PShyPSh0PW4ucHJvcHMpLm9uRGF5TW91c2VFbnRlcil8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpfSxuLmhhbmRsZU1vdXNlTGVhdmU9ZnVuY3Rpb24oKXt2YXIgZSx0O251bGw9PT0odD0oZT1uLnByb3BzKS5vbk1vdXNlTGVhdmUpfHx2b2lkIDA9PT10fHx0LmNhbGwoZSl9LG4uaXNSYW5nZVN0YXJ0TW9udGg9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5zdGFydERhdGUsbz10LmVuZERhdGU7cmV0dXJuISghYXx8IW8pJiZBZSgkLnNldE1vbnRoKHIsZSksYSl9LG4uaXNSYW5nZVN0YXJ0UXVhcnRlcj1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LnN0YXJ0RGF0ZSxvPXQuZW5kRGF0ZTtyZXR1cm4hKCFhfHwhbykmJkZlKHouc2V0UXVhcnRlcihyLGUpLGEpfSxuLmlzUmFuZ2VFbmRNb250aD1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LnN0YXJ0RGF0ZSxvPXQuZW5kRGF0ZTtyZXR1cm4hKCFhfHwhbykmJkFlKCQuc2V0TW9udGgocixlKSxvKX0sbi5pc1JhbmdlRW5kUXVhcnRlcj1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LnN0YXJ0RGF0ZSxvPXQuZW5kRGF0ZTtyZXR1cm4hKCFhfHwhbykmJkZlKHouc2V0UXVhcnRlcihyLGUpLG8pfSxuLmlzSW5TZWxlY3RpbmdSYW5nZU1vbnRoPWZ1bmN0aW9uKGUpe3ZhciB0LHI9bi5wcm9wcyxhPXIuZGF5LG89ci5zZWxlY3RzU3RhcnQscz1yLnNlbGVjdHNFbmQsaT1yLnNlbGVjdHNSYW5nZSxsPXIuc3RhcnREYXRlLGM9ci5lbmREYXRlLHA9bnVsbCE9PSh0PW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PXQ/dDpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4hKCEob3x8c3x8aSl8fCFwKSYmKG8mJmM/emUocCxjLGUsYSk6KHMmJmx8fCEoIWl8fCFsfHxjKSkmJnplKGwscCxlLGEpKX0sbi5pc1NlbGVjdGluZ01vbnRoUmFuZ2VTdGFydD1mdW5jdGlvbihlKXt2YXIgdDtpZighbi5pc0luU2VsZWN0aW5nUmFuZ2VNb250aChlKSlyZXR1cm4hMTt2YXIgcj1uLnByb3BzLGE9ci5kYXksbz1yLnN0YXJ0RGF0ZSxzPXIuc2VsZWN0c1N0YXJ0LGk9JC5zZXRNb250aChhLGUpLGw9bnVsbCE9PSh0PW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PXQ/dDpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4gQWUoaSxzP2w6byl9LG4uaXNTZWxlY3RpbmdNb250aFJhbmdlRW5kPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFuLmlzSW5TZWxlY3RpbmdSYW5nZU1vbnRoKGUpKXJldHVybiExO3ZhciByPW4ucHJvcHMsYT1yLmRheSxvPXIuZW5kRGF0ZSxzPXIuc2VsZWN0c0VuZCxpPXIuc2VsZWN0c1JhbmdlLGw9JC5zZXRNb250aChhLGUpLGM9bnVsbCE9PSh0PW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PXQ/dDpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4gQWUobCxzfHxpP2M6byl9LG4uaXNJblNlbGVjdGluZ1JhbmdlUXVhcnRlcj1mdW5jdGlvbihlKXt2YXIgdCxyPW4ucHJvcHMsYT1yLmRheSxvPXIuc2VsZWN0c1N0YXJ0LHM9ci5zZWxlY3RzRW5kLGk9ci5zZWxlY3RzUmFuZ2UsbD1yLnN0YXJ0RGF0ZSxjPXIuZW5kRGF0ZSxwPW51bGwhPT0odD1uLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT10P3Q6bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuISghKG98fHN8fGkpfHwhcCkmJihvJiZjP2V0KHAsYyxlLGEpOihzJiZsfHwhKCFpfHwhbHx8YykpJiZldChsLHAsZSxhKSl9LG4uaXNXZWVrSW5Nb250aD1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLmRheSxyPWEuYWRkRGF5cyhlLDYpO3JldHVybiBBZShlLHQpfHxBZShyLHQpfSxuLmlzQ3VycmVudE1vbnRoPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguZ2V0WWVhcihlKT09PXguZ2V0WWVhcihNZSgpKSYmdD09PV8uZ2V0TW9udGgoTWUoKSl9LG4uaXNDdXJyZW50UXVhcnRlcj1mdW5jdGlvbihlLHQpe3JldHVybiB4LmdldFllYXIoZSk9PT14LmdldFllYXIoTWUoKSkmJnQ9PT1FLmdldFF1YXJ0ZXIoTWUoKSl9LG4uaXNTZWxlY3RlZE1vbnRoPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gXy5nZXRNb250aChyKT09PXQmJnguZ2V0WWVhcihlKT09PXguZ2V0WWVhcihyKX0sbi5pc1NlbGVjdE1vbnRoSW5MaXN0PWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gci5zb21lKChmdW5jdGlvbihyKXtyZXR1cm4gbi5pc1NlbGVjdGVkTW9udGgoZSx0LHIpfSkpfSxuLmlzU2VsZWN0ZWRRdWFydGVyPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gRS5nZXRRdWFydGVyKGUpPT09dCYmeC5nZXRZZWFyKGUpPT09eC5nZXRZZWFyKHIpfSxuLnJlbmRlcldlZWtzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9bi5wcm9wcy5maXhlZEhlaWdodCxyPTAsYT0hMSxvPXhlKE5lKG4ucHJvcHMuZGF5KSxuLnByb3BzLmxvY2FsZSxuLnByb3BzLmNhbGVuZGFyU3RhcnREYXkpLHM9bi5wcm9wcy5zZWxlY3RlZD9mdW5jdGlvbihlKXtyZXR1cm4gbi5wcm9wcy5zaG93V2Vla1BpY2tlcj94ZShlLG4ucHJvcHMubG9jYWxlLG4ucHJvcHMuY2FsZW5kYXJTdGFydERheSk6bi5wcm9wcy5zZWxlY3RlZH0obi5wcm9wcy5zZWxlY3RlZCk6dm9pZCAwLGk9bi5wcm9wcy5wcmVTZWxlY3Rpb24/ZnVuY3Rpb24oZSl7cmV0dXJuIG4ucHJvcHMuc2hvd1dlZWtQaWNrZXI/eGUoZSxuLnByb3BzLmxvY2FsZSxuLnByb3BzLmNhbGVuZGFyU3RhcnREYXkpOm4ucHJvcHMucHJlU2VsZWN0aW9ufShuLnByb3BzLnByZVNlbGVjdGlvbik6dm9pZCAwO2UucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTXQsZ2Uoe30sbi5wcm9wcyx7YXJpYUxhYmVsUHJlZml4Om4ucHJvcHMud2Vla0FyaWFMYWJlbFByZWZpeCxrZXk6cixkYXk6byxtb250aDpfLmdldE1vbnRoKG4ucHJvcHMuZGF5KSxvbkRheUNsaWNrOm4uaGFuZGxlRGF5Q2xpY2ssb25EYXlNb3VzZUVudGVyOm4uaGFuZGxlRGF5TW91c2VFbnRlcixzZWxlY3RlZDpzLHByZVNlbGVjdGlvbjppLHNob3dXZWVrTnVtYmVyOm4ucHJvcHMuc2hvd1dlZWtOdW1iZXJzfSkpKSwhYTspe3IrKyxvPXAuYWRkV2Vla3MobywxKTt2YXIgbD10JiZyPj02LGM9IXQmJiFuLmlzV2Vla0luTW9udGgobyk7aWYobHx8Yyl7aWYoIW4ucHJvcHMucGVla05leHRNb250aClicmVhazthPSEwfX1yZXR1cm4gZX0sbi5vbk1vbnRoQ2xpY2s9ZnVuY3Rpb24oZSx0KXt2YXIgcj1uLmlzTW9udGhEaXNhYmxlZEZvckxhYmVsRGF0ZSh0KSxhPXIuaXNEaXNhYmxlZCxvPXIubGFiZWxEYXRlO2F8fG4uaGFuZGxlRGF5Q2xpY2soTmUobyksZSl9LG4ub25Nb250aE1vdXNlRW50ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5pc01vbnRoRGlzYWJsZWRGb3JMYWJlbERhdGUoZSkscj10LmlzRGlzYWJsZWQsYT10LmxhYmVsRGF0ZTtyfHxuLmhhbmRsZURheU1vdXNlRW50ZXIoTmUoYSkpfSxuLmhhbmRsZU1vbnRoTmF2aWdhdGlvbj1mdW5jdGlvbihlLHQpe3ZhciByLGEsbyxzO251bGw9PT0oYT0ocj1uLnByb3BzKS5zZXRQcmVTZWxlY3Rpb24pfHx2b2lkIDA9PT1hfHxhLmNhbGwocix0KSxudWxsPT09KHM9bnVsbD09PShvPW4uTU9OVEhfUkVGU1tlXSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uY3VycmVudCl8fHZvaWQgMD09PXN8fHMuZm9jdXMoKX0sbi5oYW5kbGVLZXlib2FyZE5hdmlnYXRpb249ZnVuY3Rpb24oZSx0LHIpe3ZhciBhLG89bi5wcm9wcyxzPW8uc2VsZWN0ZWQsbD1vLnByZVNlbGVjdGlvbixjPW8uc2V0UHJlU2VsZWN0aW9uLHA9by5taW5EYXRlLGQ9by5tYXhEYXRlLHU9by5zaG93Rm91ckNvbHVtbk1vbnRoWWVhclBpY2tlcixmPW8uc2hvd1R3b0NvbHVtbk1vbnRoWWVhclBpY2tlcjtpZihsKXt2YXIgaD1ZdCh1LGYpLG09bi5nZXRWZXJ0aWNhbE9mZnNldChoKSx2PW51bGw9PT0oYT1QdFtoXSl8fHZvaWQgMD09PWE/dm9pZCAwOmEuZ3JpZCxnPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbixhLG89dCxzPXI7c3dpdGNoKGUpe2Nhc2UgeWUuQXJyb3dSaWdodDpvPWkuYWRkTW9udGhzKHQsMSkscz0xMT09PXI/MDpyKzE7YnJlYWs7Y2FzZSB5ZS5BcnJvd0xlZnQ6bz1hZS5zdWJNb250aHModCwxKSxzPTA9PT1yPzExOnItMTticmVhaztjYXNlIHllLkFycm93VXA6bz1hZS5zdWJNb250aHModCxtKSxzPShudWxsPT09KG49bnVsbD09dj92b2lkIDA6dlswXSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uaW5jbHVkZXMocikpP3IrMTItbTpyLW07YnJlYWs7Y2FzZSB5ZS5BcnJvd0Rvd246bz1pLmFkZE1vbnRocyh0LG0pLHM9KG51bGw9PT0oYT1udWxsPT12P3ZvaWQgMDp2W3YubGVuZ3RoLTFdKXx8dm9pZCAwPT09YT92b2lkIDA6YS5pbmNsdWRlcyhyKSk/ci0xMittOnIrbX1yZXR1cm57bmV3Q2FsY3VsYXRlZERhdGU6byxuZXdDYWxjdWxhdGVkTW9udGg6c319O2lmKHQhPT15ZS5FbnRlcil7dmFyIEQ9ZnVuY3Rpb24oZSx0LHIpe2Zvcih2YXIgYT1lLG89ITEscz0wLGk9ZyhhLHQsciksbD1pLm5ld0NhbGN1bGF0ZWREYXRlLGM9aS5uZXdDYWxjdWxhdGVkTW9udGg7IW87KXtpZihzPj00MCl7bD10LGM9cjticmVha312YXIgdTtpZihwJiZsPHApYT15ZS5BcnJvd1JpZ2h0LGw9KHU9ZyhhLGwsYykpLm5ld0NhbGN1bGF0ZWREYXRlLGM9dS5uZXdDYWxjdWxhdGVkTW9udGg7aWYoZCYmbD5kKWE9eWUuQXJyb3dMZWZ0LGw9KHU9ZyhhLGwsYykpLm5ld0NhbGN1bGF0ZWREYXRlLGM9dS5uZXdDYWxjdWxhdGVkTW9udGg7aWYoWGUobCxuLnByb3BzKSlsPSh1PWcoYSxsLGMpKS5uZXdDYWxjdWxhdGVkRGF0ZSxjPXUubmV3Q2FsY3VsYXRlZE1vbnRoO2Vsc2Ugbz0hMDtzKyt9cmV0dXJue25ld0NhbGN1bGF0ZWREYXRlOmwsbmV3Q2FsY3VsYXRlZE1vbnRoOmN9fSh0LGwscikseT1ELm5ld0NhbGN1bGF0ZWREYXRlLGs9RC5uZXdDYWxjdWxhdGVkTW9udGg7c3dpdGNoKHQpe2Nhc2UgeWUuQXJyb3dSaWdodDpjYXNlIHllLkFycm93TGVmdDpjYXNlIHllLkFycm93VXA6Y2FzZSB5ZS5BcnJvd0Rvd246bi5oYW5kbGVNb250aE5hdmlnYXRpb24oayx5KX19ZWxzZSBuLmlzTW9udGhEaXNhYmxlZChyKXx8KG4ub25Nb250aENsaWNrKGUsciksbnVsbD09Y3x8YyhzKSl9fSxuLmdldFZlcnRpY2FsT2Zmc2V0PWZ1bmN0aW9uKGUpe3ZhciB0LHI7cmV0dXJuIG51bGwhPT0ocj1udWxsPT09KHQ9UHRbZV0pfHx2b2lkIDA9PT10P3ZvaWQgMDp0LnZlcnRpY2FsTmF2aWdhdGlvbk9mZnNldCkmJnZvaWQgMCE9PXI/cjowfSxuLm9uTW9udGhLZXlEb3duPWZ1bmN0aW9uKGUsdCl7dmFyIHI9bi5wcm9wcyxhPXIuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24sbz1yLmhhbmRsZU9uTW9udGhLZXlEb3duLHM9ZS5rZXk7cyE9PXllLlRhYiYmZS5wcmV2ZW50RGVmYXVsdCgpLGF8fG4uaGFuZGxlS2V5Ym9hcmROYXZpZ2F0aW9uKGUscyx0KSxvJiZvKGUpfSxuLm9uUXVhcnRlckNsaWNrPWZ1bmN0aW9uKGUsdCl7dmFyIHI9ei5zZXRRdWFydGVyKG4ucHJvcHMuZGF5LHQpO0dlKHIsbi5wcm9wcyl8fG4uaGFuZGxlRGF5Q2xpY2soSWUociksZSl9LG4ub25RdWFydGVyTW91c2VFbnRlcj1mdW5jdGlvbihlKXt2YXIgdD16LnNldFF1YXJ0ZXIobi5wcm9wcy5kYXksZSk7R2UodCxuLnByb3BzKXx8bi5oYW5kbGVEYXlNb3VzZUVudGVyKEllKHQpKX0sbi5oYW5kbGVRdWFydGVyTmF2aWdhdGlvbj1mdW5jdGlvbihlLHQpe3ZhciByLGEsbyxzO24uaXNEaXNhYmxlZCh0KXx8bi5pc0V4Y2x1ZGVkKHQpfHwobnVsbD09PShhPShyPW4ucHJvcHMpLnNldFByZVNlbGVjdGlvbil8fHZvaWQgMD09PWF8fGEuY2FsbChyLHQpLG51bGw9PT0ocz1udWxsPT09KG89bi5RVUFSVEVSX1JFRlNbZS0xXSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uY3VycmVudCl8fHZvaWQgMD09PXN8fHMuZm9jdXMoKSl9LG4ub25RdWFydGVyS2V5RG93bj1mdW5jdGlvbihlLHQpe3ZhciByLGEsbz1lLmtleTtpZighbi5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbilzd2l0Y2gobyl7Y2FzZSB5ZS5FbnRlcjpuLm9uUXVhcnRlckNsaWNrKGUsdCksbnVsbD09PShhPShyPW4ucHJvcHMpLnNldFByZVNlbGVjdGlvbil8fHZvaWQgMD09PWF8fGEuY2FsbChyLG4ucHJvcHMuc2VsZWN0ZWQpO2JyZWFrO2Nhc2UgeWUuQXJyb3dSaWdodDppZighbi5wcm9wcy5wcmVTZWxlY3Rpb24pYnJlYWs7bi5oYW5kbGVRdWFydGVyTmF2aWdhdGlvbig0PT09dD8xOnQrMSxsLmFkZFF1YXJ0ZXJzKG4ucHJvcHMucHJlU2VsZWN0aW9uLDEpKTticmVhaztjYXNlIHllLkFycm93TGVmdDppZighbi5wcm9wcy5wcmVTZWxlY3Rpb24pYnJlYWs7bi5oYW5kbGVRdWFydGVyTmF2aWdhdGlvbigxPT09dD80OnQtMSxvZS5zdWJRdWFydGVycyhuLnByb3BzLnByZVNlbGVjdGlvbiwxKSl9fSxuLmlzTW9udGhEaXNhYmxlZEZvckxhYmVsRGF0ZT1mdW5jdGlvbihlKXt2YXIgdCxyPW4ucHJvcHMsYT1yLmRheSxvPXIubWluRGF0ZSxzPXIubWF4RGF0ZSxpPXIuZXhjbHVkZURhdGVzLGw9ci5pbmNsdWRlRGF0ZXMsYz0kLnNldE1vbnRoKGEsZSk7cmV0dXJue2lzRGlzYWJsZWQ6bnVsbCE9PSh0PShvfHxzfHxpfHxsKSYmJGUoYyxuLnByb3BzKSkmJnZvaWQgMCE9PXQmJnQsbGFiZWxEYXRlOmN9fSxuLmlzTW9udGhEaXNhYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gbi5pc01vbnRoRGlzYWJsZWRGb3JMYWJlbERhdGUoZSkuaXNEaXNhYmxlZH0sbi5nZXRNb250aENsYXNzTmFtZXM9ZnVuY3Rpb24oZSl7dmFyIHI9bi5wcm9wcyxhPXIuZGF5LG89ci5zdGFydERhdGUscz1yLmVuZERhdGUsaT1yLnByZVNlbGVjdGlvbixsPXIubW9udGhDbGFzc05hbWUsYz1sP2woJC5zZXRNb250aChhLGUpKTp2b2lkIDAscD1uLmdldFNlbGVjdGlvbigpO3JldHVybiB0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0XCIsXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1cIi5jb25jYXQoZSksYyx7XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZFwiOm4uaXNNb250aERpc2FibGVkKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tc2VsZWN0ZWRcIjpwP24uaXNTZWxlY3RNb250aEluTGlzdChhLGUscCk6dm9pZCAwLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWRcIjohbi5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbiYmaSYmbi5pc1NlbGVjdGVkTW9udGgoYSxlLGkpJiYhbi5pc01vbnRoRGlzYWJsZWQoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2VcIjpuLmlzSW5TZWxlY3RpbmdSYW5nZU1vbnRoKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2VcIjpvJiZzP3plKG8scyxlLGEpOnZvaWQgMCxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXJhbmdlLXN0YXJ0XCI6bi5pc1JhbmdlU3RhcnRNb250aChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXJhbmdlLWVuZFwiOm4uaXNSYW5nZUVuZE1vbnRoKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tc2VsZWN0aW5nLXJhbmdlLXN0YXJ0XCI6bi5pc1NlbGVjdGluZ01vbnRoUmFuZ2VTdGFydChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGluZy1yYW5nZS1lbmRcIjpuLmlzU2VsZWN0aW5nTW9udGhSYW5nZUVuZChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXRvZGF5XCI6bi5pc0N1cnJlbnRNb250aChhLGUpfSl9LG4uZ2V0VGFiSW5kZXg9ZnVuY3Rpb24oZSl7aWYobnVsbD09bi5wcm9wcy5wcmVTZWxlY3Rpb24pcmV0dXJuXCItMVwiO3ZhciB0PV8uZ2V0TW9udGgobi5wcm9wcy5wcmVTZWxlY3Rpb24pO3JldHVybiBuLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9ufHxlIT09dD9cIi0xXCI6XCIwXCJ9LG4uZ2V0UXVhcnRlclRhYkluZGV4PWZ1bmN0aW9uKGUpe2lmKG51bGw9PW4ucHJvcHMucHJlU2VsZWN0aW9uKXJldHVyblwiLTFcIjt2YXIgdD1FLmdldFF1YXJ0ZXIobi5wcm9wcy5wcmVTZWxlY3Rpb24pO3JldHVybiBuLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9ufHxlIT09dD9cIi0xXCI6XCIwXCJ9LG4uZ2V0QXJpYUxhYmVsPWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMscj10LmNob29zZURheUFyaWFMYWJlbFByZWZpeCxhPXZvaWQgMD09PXI/XCJDaG9vc2VcIjpyLG89dC5kaXNhYmxlZERheUFyaWFMYWJlbFByZWZpeCxzPXZvaWQgMD09PW8/XCJOb3QgYXZhaWxhYmxlXCI6byxpPXQuZGF5LGw9dC5sb2NhbGUsYz0kLnNldE1vbnRoKGksZSkscD1uLmlzRGlzYWJsZWQoYyl8fG4uaXNFeGNsdWRlZChjKT9zOmE7cmV0dXJuXCJcIi5jb25jYXQocCxcIiBcIikuY29uY2F0KF9lKGMsXCJNTU1NIHl5eXlcIixsKSl9LG4uZ2V0UXVhcnRlckNsYXNzTmFtZXM9ZnVuY3Rpb24oZSl7dmFyIHI9bi5wcm9wcyxhPXIuZGF5LG89ci5zdGFydERhdGUscz1yLmVuZERhdGUsaT1yLnNlbGVjdGVkLGw9ci5taW5EYXRlLGM9ci5tYXhEYXRlLHA9ci5leGNsdWRlRGF0ZXMsZD1yLmluY2x1ZGVEYXRlcyx1PXIuZmlsdGVyRGF0ZSxmPXIucHJlU2VsZWN0aW9uLGg9ci5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbixtPShsfHxjfHxwfHxkfHx1KSYmR2Uoei5zZXRRdWFydGVyKGEsZSksbi5wcm9wcyk7cmV0dXJuIHQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dFwiLFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci1cIi5jb25jYXQoZSkse1wicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1kaXNhYmxlZFwiOm0sXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXNlbGVjdGVkXCI6aT9uLmlzU2VsZWN0ZWRRdWFydGVyKGEsZSxpKTp2b2lkIDAsXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkXCI6IWgmJmYmJm4uaXNTZWxlY3RlZFF1YXJ0ZXIoYSxlLGYpJiYhbSxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlXCI6bi5pc0luU2VsZWN0aW5nUmFuZ2VRdWFydGVyKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZVwiOm8mJnM/ZXQobyxzLGUsYSk6dm9pZCAwLFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1yYW5nZS1zdGFydFwiOm4uaXNSYW5nZVN0YXJ0UXVhcnRlcihlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tcmFuZ2UtZW5kXCI6bi5pc1JhbmdlRW5kUXVhcnRlcihlKX0pfSxuLmdldE1vbnRoQ29udGVudD1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLHI9dC5zaG93RnVsbE1vbnRoWWVhclBpY2tlcixhPXQucmVuZGVyTW9udGhDb250ZW50LG89dC5sb2NhbGUscz10LmRheSxpPVZlKGUsbyksbD1CZShlLG8pO3JldHVybiBhP2EoZSxpLGwscyk6cj9sOml9LG4uZ2V0UXVhcnRlckNvbnRlbnQ9ZnVuY3Rpb24oZSl7dmFyIHQscj1uLnByb3BzLGE9ci5yZW5kZXJRdWFydGVyQ29udGVudCxvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9lKHouc2V0UXVhcnRlcihNZSgpLGUpLFwiUVFRXCIsdCl9KGUsci5sb2NhbGUpO3JldHVybiBudWxsIT09KHQ9bnVsbD09YT92b2lkIDA6YShlLG8pKSYmdm9pZCAwIT09dD90Om99LG4ucmVuZGVyTW9udGhzPWZ1bmN0aW9uKCl7dmFyIGUsdD1uLnByb3BzLHI9dC5zaG93VHdvQ29sdW1uTW9udGhZZWFyUGlja2VyLGE9dC5zaG93Rm91ckNvbHVtbk1vbnRoWWVhclBpY2tlcixvPXQuZGF5LHM9dC5zZWxlY3RlZCxpPW51bGw9PT0oZT1QdFtZdChhLHIpXSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuZ3JpZDtyZXR1cm4gbnVsbD09aT92b2lkIDA6aS5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC13cmFwcGVyXCIsa2V5OnR9LGUubWFwKChmdW5jdGlvbihlLHQpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOm4uTU9OVEhfUkVGU1tlXSxrZXk6dCxvbkNsaWNrOmZ1bmN0aW9uKHQpe24ub25Nb250aENsaWNrKHQsZSl9LG9uS2V5RG93bjpmdW5jdGlvbih0KXt5dCh0KSYmKHQucHJldmVudERlZmF1bHQoKSx0LmtleT15ZS5FbnRlciksbi5vbk1vbnRoS2V5RG93bih0LGUpfSxvbk1vdXNlRW50ZXI6bi5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOmZ1bmN0aW9uKCl7cmV0dXJuIG4ub25Nb250aE1vdXNlRW50ZXIoZSl9LG9uUG9pbnRlckVudGVyOm4ucHJvcHMudXNlUG9pbnRlckV2ZW50P2Z1bmN0aW9uKCl7cmV0dXJuIG4ub25Nb250aE1vdXNlRW50ZXIoZSl9OnZvaWQgMCx0YWJJbmRleDpOdW1iZXIobi5nZXRUYWJJbmRleChlKSksY2xhc3NOYW1lOm4uZ2V0TW9udGhDbGFzc05hbWVzKGUpLFwiYXJpYS1kaXNhYmxlZFwiOm4uaXNNb250aERpc2FibGVkKGUpLHJvbGU6XCJvcHRpb25cIixcImFyaWEtbGFiZWxcIjpuLmdldEFyaWFMYWJlbChlKSxcImFyaWEtY3VycmVudFwiOm4uaXNDdXJyZW50TW9udGgobyxlKT9cImRhdGVcIjp2b2lkIDAsXCJhcmlhLXNlbGVjdGVkXCI6cz9uLmlzU2VsZWN0ZWRNb250aChvLGUscyk6dm9pZCAwfSxuLmdldE1vbnRoQ29udGVudChlKSl9KSkpfSkpfSxuLnJlbmRlclF1YXJ0ZXJzPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5zZWxlY3RlZDtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItd3JhcHBlclwifSxbMSwyLDMsNF0ubWFwKChmdW5jdGlvbihlLGEpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7a2V5OmEscmVmOm4uUVVBUlRFUl9SRUZTW2FdLHJvbGU6XCJvcHRpb25cIixvbkNsaWNrOmZ1bmN0aW9uKHQpe24ub25RdWFydGVyQ2xpY2sodCxlKX0sb25LZXlEb3duOmZ1bmN0aW9uKHQpe24ub25RdWFydGVyS2V5RG93bih0LGUpfSxvbk1vdXNlRW50ZXI6bi5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOmZ1bmN0aW9uKCl7cmV0dXJuIG4ub25RdWFydGVyTW91c2VFbnRlcihlKX0sb25Qb2ludGVyRW50ZXI6bi5wcm9wcy51c2VQb2ludGVyRXZlbnQ/ZnVuY3Rpb24oKXtyZXR1cm4gbi5vblF1YXJ0ZXJNb3VzZUVudGVyKGUpfTp2b2lkIDAsY2xhc3NOYW1lOm4uZ2V0UXVhcnRlckNsYXNzTmFtZXMoZSksXCJhcmlhLXNlbGVjdGVkXCI6cj9uLmlzU2VsZWN0ZWRRdWFydGVyKHQsZSxyKTp2b2lkIDAsdGFiSW5kZXg6TnVtYmVyKG4uZ2V0UXVhcnRlclRhYkluZGV4KGUpKSxcImFyaWEtY3VycmVudFwiOm4uaXNDdXJyZW50UXVhcnRlcih0LGUpP1wiZGF0ZVwiOnZvaWQgMH0sbi5nZXRRdWFydGVyQ29udGVudChlKSl9KSkpfSxuLmdldENsYXNzTmFtZXM9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHI9ZS5zZWxlY3RpbmdEYXRlLGE9ZS5zZWxlY3RzU3RhcnQsbz1lLnNlbGVjdHNFbmQscz1lLnNob3dNb250aFllYXJQaWNrZXIsaT1lLnNob3dRdWFydGVyWWVhclBpY2tlcixsPWUuc2hvd1dlZWtQaWNrZXI7cmV0dXJuIHQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoXCIse1wicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZVwiOnImJihhfHxvKX0se1wicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGhQaWNrZXJcIjpzfSx7XCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyUGlja2VyXCI6aX0se1wicmVhY3QtZGF0ZXBpY2tlcl9fd2Vla1BpY2tlclwiOmx9KX0sbn1yZXR1cm4gdmUobixlKSxuLnByb3RvdHlwZS5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5zZWxlY3RlZCxyPWUuc2VsZWN0ZWREYXRlcztyZXR1cm4gZS5zZWxlY3RzTXVsdGlwbGU/cjp0P1t0XTp2b2lkIDB9LG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLnNob3dNb250aFllYXJQaWNrZXIscj1lLnNob3dRdWFydGVyWWVhclBpY2tlcixuPWUuZGF5LGE9ZS5hcmlhTGFiZWxQcmVmaXgsbz12b2lkIDA9PT1hP1wiTW9udGggXCI6YSxzPW8/by50cmltKCkrXCIgXCI6XCJcIjtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTp0aGlzLmdldENsYXNzTmFtZXMoKSxvbk1vdXNlTGVhdmU6dGhpcy5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOnRoaXMuaGFuZGxlTW91c2VMZWF2ZSxvblBvaW50ZXJMZWF2ZTp0aGlzLnByb3BzLnVzZVBvaW50ZXJFdmVudD90aGlzLmhhbmRsZU1vdXNlTGVhdmU6dm9pZCAwLFwiYXJpYS1sYWJlbFwiOlwiXCIuY29uY2F0KHMpLmNvbmNhdChfZShuLFwiTU1NTSwgeXl5eVwiLHRoaXMucHJvcHMubG9jYWxlKSkscm9sZTpcImxpc3Rib3hcIn0sdD90aGlzLnJlbmRlck1vbnRocygpOnI/dGhpcy5yZW5kZXJRdWFydGVycygpOnRoaXMucmVuZGVyV2Vla3MoKSl9LG59KHIuQ29tcG9uZW50KSxOdD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0LmlzU2VsZWN0ZWRNb250aD1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm9wcy5tb250aD09PWV9LHQucmVuZGVyT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0LnByb3BzLm1vbnRoTmFtZXMubWFwKChmdW5jdGlvbihlLHIpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOnQuaXNTZWxlY3RlZE1vbnRoKHIpP1wicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uIHJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbi0tc2VsZWN0ZWRfbW9udGhcIjpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvblwiLGtleTplLG9uQ2xpY2s6dC5vbkNoYW5nZS5iaW5kKHQsciksXCJhcmlhLXNlbGVjdGVkXCI6dC5pc1NlbGVjdGVkTW9udGgocik/XCJ0cnVlXCI6dm9pZCAwfSx0LmlzU2VsZWN0ZWRNb250aChyKT91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbi0tc2VsZWN0ZWRcIn0sXCLinJNcIik6XCJcIixlKX0pKX0sdC5vbkNoYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm9wcy5vbkNoYW5nZShlKX0sdC5oYW5kbGVDbGlja091dHNpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm9wcy5vbkNhbmNlbCgpfSx0fXJldHVybiB2ZSh0LGUpLHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd25cIn0sdGhpcy5yZW5kZXJPcHRpb25zKCkpfSx0fShyLkNvbXBvbmVudCksT3Q9ZmUuZGVmYXVsdChOdCksSXQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciB0PW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gdC5zdGF0ZT17ZHJvcGRvd25WaXNpYmxlOiExfSx0LnJlbmRlclNlbGVjdE9wdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFwKChmdW5jdGlvbihlLHQpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIix7a2V5OmUsdmFsdWU6dH0sZSl9KSl9LHQucmVuZGVyU2VsZWN0TW9kZT1mdW5jdGlvbihlKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIse3ZhbHVlOnQucHJvcHMubW9udGgsY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtc2VsZWN0XCIsb25DaGFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHQub25DaGFuZ2UocGFyc2VJbnQoZS50YXJnZXQudmFsdWUpKX19LHQucmVuZGVyU2VsZWN0T3B0aW9ucyhlKSl9LHQucmVuZGVyUmVhZFZpZXc9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTpcInJlYWRcIixzdHlsZTp7dmlzaWJpbGl0eTplP1widmlzaWJsZVwiOlwiaGlkZGVuXCJ9LGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlld1wiLG9uQ2xpY2s6dC50b2dnbGVEcm9wZG93bn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3dcIn0pLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1zZWxlY3RlZC1tb250aFwifSxyW3QucHJvcHMubW9udGhdKSl9LHQucmVuZGVyRHJvcGRvd249ZnVuY3Rpb24oZSl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChPdCxnZSh7a2V5OlwiZHJvcGRvd25cIn0sdC5wcm9wcyx7bW9udGhOYW1lczplLG9uQ2hhbmdlOnQub25DaGFuZ2Usb25DYW5jZWw6dC50b2dnbGVEcm9wZG93bn0pKX0sdC5yZW5kZXJTY3JvbGxNb2RlPWZ1bmN0aW9uKGUpe3ZhciByPXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlLG49W3QucmVuZGVyUmVhZFZpZXcoIXIsZSldO3JldHVybiByJiZuLnVuc2hpZnQodC5yZW5kZXJEcm9wZG93bihlKSksbn0sdC5vbkNoYW5nZT1mdW5jdGlvbihlKXt0LnRvZ2dsZURyb3Bkb3duKCksZSE9PXQucHJvcHMubW9udGgmJnQucHJvcHMub25DaGFuZ2UoZSl9LHQudG9nZ2xlRHJvcGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7ZHJvcGRvd25WaXNpYmxlOiF0LnN0YXRlLmRyb3Bkb3duVmlzaWJsZX0pfSx0fXJldHVybiB2ZSh0LGUpLHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlLHQ9dGhpcyxyPVswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExXS5tYXAodGhpcy5wcm9wcy51c2VTaG9ydE1vbnRoSW5Ecm9wZG93bj9mdW5jdGlvbihlKXtyZXR1cm4gVmUoZSx0LnByb3BzLmxvY2FsZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBCZShlLHQucHJvcHMubG9jYWxlKX0pO3N3aXRjaCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl7Y2FzZVwic2Nyb2xsXCI6ZT10aGlzLnJlbmRlclNjcm9sbE1vZGUocik7YnJlYWs7Y2FzZVwic2VsZWN0XCI6ZT10aGlzLnJlbmRlclNlbGVjdE1vZGUocil9cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi1jb250YWluZXIgcmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tY29udGFpbmVyLS1cIi5jb25jYXQodGhpcy5wcm9wcy5kcm9wZG93bk1vZGUpfSxlKX0sdH0oci5Db21wb25lbnQpO2Z1bmN0aW9uIFR0KGUsdCl7Zm9yKHZhciByPVtdLG49TmUoZSksYT1OZSh0KTshTi5pc0FmdGVyKG4sYSk7KXIucHVzaChNZShuKSksbj1pLmFkZE1vbnRocyhuLDEpO3JldHVybiByfXZhciBSdD1mdW5jdGlvbihlKXtmdW5jdGlvbiByKHQpe3ZhciByPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiByLnJlbmRlck9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gci5zdGF0ZS5tb250aFllYXJzTGlzdC5tYXAoKGZ1bmN0aW9uKGUpe3ZhciB0PVkuZ2V0VGltZShlKSxuPUxlKHIucHJvcHMuZGF0ZSxlKSYmQWUoci5wcm9wcy5kYXRlLGUpO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOm4/XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbi0tc2VsZWN0ZWRfbW9udGgteWVhclwiOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb25cIixrZXk6dCxvbkNsaWNrOnIub25DaGFuZ2UuYmluZChyLHQpLFwiYXJpYS1zZWxlY3RlZFwiOm4/XCJ0cnVlXCI6dm9pZCAwfSxuP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb24tLXNlbGVjdGVkXCJ9LFwi4pyTXCIpOlwiXCIsX2UoZSxyLnByb3BzLmRhdGVGb3JtYXQsci5wcm9wcy5sb2NhbGUpKX0pKX0sci5vbkNoYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gci5wcm9wcy5vbkNoYW5nZShlKX0sci5oYW5kbGVDbGlja091dHNpZGU9ZnVuY3Rpb24oKXtyLnByb3BzLm9uQ2FuY2VsKCl9LHIuc3RhdGU9e21vbnRoWWVhcnNMaXN0OlR0KHIucHJvcHMubWluRGF0ZSxyLnByb3BzLm1heERhdGUpfSxyfXJldHVybiB2ZShyLGUpLHIucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXQuY2xzeCh7XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duXCI6ITAsXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLS1zY3JvbGxhYmxlXCI6dGhpcy5wcm9wcy5zY3JvbGxhYmxlTW9udGhZZWFyRHJvcGRvd259KTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTplfSx0aGlzLnJlbmRlck9wdGlvbnMoKSl9LHJ9KHIuQ29tcG9uZW50KSxMdD1mZS5kZWZhdWx0KFJ0KSxBdD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0LnN0YXRlPXtkcm9wZG93blZpc2libGU6ITF9LHQucmVuZGVyU2VsZWN0T3B0aW9ucz1mdW5jdGlvbigpe2Zvcih2YXIgZT1OZSh0LnByb3BzLm1pbkRhdGUpLHI9TmUodC5wcm9wcy5tYXhEYXRlKSxuPVtdOyFOLmlzQWZ0ZXIoZSxyKTspe3ZhciBhPVkuZ2V0VGltZShlKTtuLnB1c2godWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIse2tleTphLHZhbHVlOmF9LF9lKGUsdC5wcm9wcy5kYXRlRm9ybWF0LHQucHJvcHMubG9jYWxlKSkpLGU9aS5hZGRNb250aHMoZSwxKX1yZXR1cm4gbn0sdC5vblNlbGVjdENoYW5nZT1mdW5jdGlvbihlKXt0Lm9uQ2hhbmdlKHBhcnNlSW50KGUudGFyZ2V0LnZhbHVlKSl9LHQucmVuZGVyU2VsZWN0TW9kZT1mdW5jdGlvbigpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIix7dmFsdWU6WS5nZXRUaW1lKE5lKHQucHJvcHMuZGF0ZSkpLGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItc2VsZWN0XCIsb25DaGFuZ2U6dC5vblNlbGVjdENoYW5nZX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zKCkpfSx0LnJlbmRlclJlYWRWaWV3PWZ1bmN0aW9uKGUpe3ZhciByPV9lKHQucHJvcHMuZGF0ZSx0LnByb3BzLmRhdGVGb3JtYXQsdC5wcm9wcy5sb2NhbGUpO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7a2V5OlwicmVhZFwiLHN0eWxlOnt2aXNpYmlsaXR5OmU/XCJ2aXNpYmxlXCI6XCJoaWRkZW5cIn0sY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXdcIixvbkNsaWNrOnQudG9nZ2xlRHJvcGRvd259LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3dcIn0pLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXctLXNlbGVjdGVkLW1vbnRoLXllYXJcIn0scikpfSx0LnJlbmRlckRyb3Bkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChMdCxnZSh7a2V5OlwiZHJvcGRvd25cIn0sdC5wcm9wcyx7b25DaGFuZ2U6dC5vbkNoYW5nZSxvbkNhbmNlbDp0LnRvZ2dsZURyb3Bkb3dufSkpfSx0LnJlbmRlclNjcm9sbE1vZGU9ZnVuY3Rpb24oKXt2YXIgZT10LnN0YXRlLmRyb3Bkb3duVmlzaWJsZSxyPVt0LnJlbmRlclJlYWRWaWV3KCFlKV07cmV0dXJuIGUmJnIudW5zaGlmdCh0LnJlbmRlckRyb3Bkb3duKCkpLHJ9LHQub25DaGFuZ2U9ZnVuY3Rpb24oZSl7dC50b2dnbGVEcm9wZG93bigpO3ZhciByPU1lKGUpO0xlKHQucHJvcHMuZGF0ZSxyKSYmQWUodC5wcm9wcy5kYXRlLHIpfHx0LnByb3BzLm9uQ2hhbmdlKHIpfSx0LnRvZ2dsZURyb3Bkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIHQuc2V0U3RhdGUoe2Ryb3Bkb3duVmlzaWJsZTohdC5zdGF0ZS5kcm9wZG93blZpc2libGV9KX0sdH1yZXR1cm4gdmUodCxlKSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZTtzd2l0Y2godGhpcy5wcm9wcy5kcm9wZG93bk1vZGUpe2Nhc2VcInNjcm9sbFwiOmU9dGhpcy5yZW5kZXJTY3JvbGxNb2RlKCk7YnJlYWs7Y2FzZVwic2VsZWN0XCI6ZT10aGlzLnJlbmRlclNlbGVjdE1vZGUoKX1yZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tY29udGFpbmVyIHJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tY29udGFpbmVyLS1cIi5jb25jYXQodGhpcy5wcm9wcy5kcm9wZG93bk1vZGUpfSxlKX0sdH0oci5Db21wb25lbnQpLEZ0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgcj1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHIuc3RhdGU9e2hlaWdodDpudWxsfSxyLnNjcm9sbFRvVGhlU2VsZWN0ZWRUaW1lPWZ1bmN0aW9uKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe3ZhciBlLG4sYTtyLmxpc3QmJihyLmxpc3Quc2Nyb2xsVG9wPW51bGwhPT0oYT1yLmNlbnRlckxpJiZ0LmNhbGNDZW50ZXJQb3NpdGlvbihyLnByb3BzLm1vbnRoUmVmP3IucHJvcHMubW9udGhSZWYuY2xpZW50SGVpZ2h0LShudWxsIT09KG49bnVsbD09PShlPXIuaGVhZGVyKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jbGllbnRIZWlnaHQpJiZ2b2lkIDAhPT1uP246MCk6ci5saXN0LmNsaWVudEhlaWdodCxyLmNlbnRlckxpKSkmJnZvaWQgMCE9PWE/YTowKX0pKX0sci5oYW5kbGVDbGljaz1mdW5jdGlvbihlKXt2YXIgdCxuOyhyLnByb3BzLm1pblRpbWV8fHIucHJvcHMubWF4VGltZSkmJmF0KGUsci5wcm9wcyl8fChyLnByb3BzLmV4Y2x1ZGVUaW1lc3x8ci5wcm9wcy5pbmNsdWRlVGltZXN8fHIucHJvcHMuZmlsdGVyVGltZSkmJm50KGUsci5wcm9wcyl8fG51bGw9PT0obj0odD1yLnByb3BzKS5vbkNoYW5nZSl8fHZvaWQgMD09PW58fG4uY2FsbCh0LGUpfSxyLmlzU2VsZWN0ZWRUaW1lPWZ1bmN0aW9uKGUpe3JldHVybiByLnByb3BzLnNlbGVjdGVkJiYodD1yLnByb3BzLnNlbGVjdGVkLG49ZSx2dCh0KS5nZXRUaW1lKCk9PT12dChuKS5nZXRUaW1lKCkpO3ZhciB0LG59LHIuaXNEaXNhYmxlZFRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuKHIucHJvcHMubWluVGltZXx8ci5wcm9wcy5tYXhUaW1lKSYmYXQoZSxyLnByb3BzKXx8KHIucHJvcHMuZXhjbHVkZVRpbWVzfHxyLnByb3BzLmluY2x1ZGVUaW1lc3x8ci5wcm9wcy5maWx0ZXJUaW1lKSYmbnQoZSxyLnByb3BzKX0sci5saUNsYXNzZXM9ZnVuY3Rpb24oZSl7dmFyIG4sYT1bXCJyZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbVwiLHIucHJvcHMudGltZUNsYXNzTmFtZT9yLnByb3BzLnRpbWVDbGFzc05hbWUoZSk6dm9pZCAwXTtyZXR1cm4gci5pc1NlbGVjdGVkVGltZShlKSYmYS5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLXNlbGVjdGVkXCIpLHIuaXNEaXNhYmxlZFRpbWUoZSkmJmEucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1kaXNhYmxlZFwiKSxyLnByb3BzLmluamVjdFRpbWVzJiYoMzYwMCpiLmdldEhvdXJzKGUpKzYwKkMuZ2V0TWludXRlcyhlKStQLmdldFNlY29uZHMoZSkpJSg2MCoobnVsbCE9PShuPXIucHJvcHMuaW50ZXJ2YWxzKSYmdm9pZCAwIT09bj9uOnQuZGVmYXVsdFByb3BzLmludGVydmFscykpIT0wJiZhLnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0taW5qZWN0ZWRcIiksYS5qb2luKFwiIFwiKX0sci5oYW5kbGVPbktleURvd249ZnVuY3Rpb24oZSx0KXt2YXIgbixhO2Uua2V5PT09eWUuU3BhY2UmJihlLnByZXZlbnREZWZhdWx0KCksZS5rZXk9eWUuRW50ZXIpLChlLmtleT09PXllLkFycm93VXB8fGUua2V5PT09eWUuQXJyb3dMZWZ0KSYmZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZS50YXJnZXQucHJldmlvdXNTaWJsaW5nJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUudGFyZ2V0LnByZXZpb3VzU2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZlLnRhcmdldC5wcmV2aW91c1NpYmxpbmcuZm9jdXMoKSksKGUua2V5PT09eWUuQXJyb3dEb3dufHxlLmtleT09PXllLkFycm93UmlnaHQpJiZlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZlLnRhcmdldC5uZXh0U2libGluZyYmKGUucHJldmVudERlZmF1bHQoKSxlLnRhcmdldC5uZXh0U2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZlLnRhcmdldC5uZXh0U2libGluZy5mb2N1cygpKSxlLmtleT09PXllLkVudGVyJiZyLmhhbmRsZUNsaWNrKHQpLG51bGw9PT0oYT0obj1yLnByb3BzKS5oYW5kbGVPbktleURvd24pfHx2b2lkIDA9PT1hfHxhLmNhbGwobixlKX0sci5yZW5kZXJUaW1lcz1mdW5jdGlvbigpe2Zvcih2YXIgZSxuPVtdLGE9ci5wcm9wcy5mb3JtYXQ/ci5wcm9wcy5mb3JtYXQ6XCJwXCIsbz1udWxsIT09KGU9ci5wcm9wcy5pbnRlcnZhbHMpJiZ2b2lkIDAhPT1lP2U6dC5kZWZhdWx0UHJvcHMuaW50ZXJ2YWxzLGk9ci5wcm9wcy5zZWxlY3RlZHx8ci5wcm9wcy5vcGVuVG9EYXRlfHxNZSgpLGw9WWUoaSksYz1yLnByb3BzLmluamVjdFRpbWVzJiZyLnByb3BzLmluamVjdFRpbWVzLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuZ2V0VGltZSgpLXQuZ2V0VGltZSgpfSkpLHA9NjAqZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLGUuZ2V0TW9udGgoKSxlLmdldERhdGUoKSkscj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLGUuZ2V0RGF0ZSgpLDI0KTtyZXR1cm4gTWF0aC5yb3VuZCgoK3ItK3QpLzM2ZTUpfShpKSxkPXAvbyx1PTA7dTxkO3UrKyl7dmFyIGY9cy5hZGRNaW51dGVzKGwsdSpvKTtpZihuLnB1c2goZiksYyl7dmFyIGg9ZnQobCxmLHUsbyxjKTtuPW4uY29uY2F0KGgpfX12YXIgbT1uLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5nZXRUaW1lKCk8PWkuZ2V0VGltZSgpP3Q6ZX0pLG5bMF0pO3JldHVybiBuLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpXCIse2tleTplLnZhbHVlT2YoKSxvbkNsaWNrOnIuaGFuZGxlQ2xpY2suYmluZChyLGUpLGNsYXNzTmFtZTpyLmxpQ2xhc3NlcyhlKSxyZWY6ZnVuY3Rpb24odCl7ZT09PW0mJihyLmNlbnRlckxpPXQpfSxvbktleURvd246ZnVuY3Rpb24odCl7ci5oYW5kbGVPbktleURvd24odCxlKX0sdGFiSW5kZXg6ZT09PW0/MDotMSxyb2xlOlwib3B0aW9uXCIsXCJhcmlhLXNlbGVjdGVkXCI6ci5pc1NlbGVjdGVkVGltZShlKT9cInRydWVcIjp2b2lkIDAsXCJhcmlhLWRpc2FibGVkXCI6ci5pc0Rpc2FibGVkVGltZShlKT9cInRydWVcIjp2b2lkIDB9LF9lKGUsYSxyLnByb3BzLmxvY2FsZSkpfSkpfSxyfXJldHVybiB2ZSh0LGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdFByb3BzXCIse2dldDpmdW5jdGlvbigpe3JldHVybntpbnRlcnZhbHM6MzAsdG9kYXlCdXR0b246bnVsbCx0aW1lQ2FwdGlvbjpcIlRpbWVcIn19LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbFRvVGhlU2VsZWN0ZWRUaW1lKCksdGhpcy5wcm9wcy5tb250aFJlZiYmdGhpcy5oZWFkZXImJnRoaXMuc2V0U3RhdGUoe2hlaWdodDp0aGlzLnByb3BzLm1vbnRoUmVmLmNsaWVudEhlaWdodC10aGlzLmhlYWRlci5jbGllbnRIZWlnaHR9KX0sdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGUscj10aGlzLG49dGhpcy5zdGF0ZS5oZWlnaHQ7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciBcIi5jb25jYXQoKG51bGwhPT0oZT10aGlzLnByb3BzLnRvZGF5QnV0dG9uKSYmdm9pZCAwIT09ZT9lOnQuZGVmYXVsdFByb3BzLnRvZGF5QnV0dG9uKT9cInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyLS13aXRoLXRvZGF5LWJ1dHRvblwiOlwiXCIpfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyIHJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZSBcIi5jb25jYXQodGhpcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHk/XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWUtLW9ubHlcIjpcIlwiKSxyZWY6ZnVuY3Rpb24oZSl7ci5oZWFkZXI9ZX19LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlclwifSx0aGlzLnByb3BzLnRpbWVDYXB0aW9uKSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWVcIn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94XCJ9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInVsXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdFwiLHJlZjpmdW5jdGlvbihlKXtyLmxpc3Q9ZX0sc3R5bGU6bj97aGVpZ2h0Om59Ont9LHJvbGU6XCJsaXN0Ym94XCIsXCJhcmlhLWxhYmVsXCI6dGhpcy5wcm9wcy50aW1lQ2FwdGlvbn0sdGhpcy5yZW5kZXJUaW1lcygpKSkpKX0sdC5jYWxjQ2VudGVyUG9zaXRpb249ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5vZmZzZXRUb3AtKGUvMi10LmNsaWVudEhlaWdodC8yKX0sdH0oci5Db21wb25lbnQpLEh0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4obil7dmFyIGE9ZS5jYWxsKHRoaXMsbil8fHRoaXM7cmV0dXJuIGEuWUVBUl9SRUZTPURlKFtdLEFycmF5KGEucHJvcHMueWVhckl0ZW1OdW1iZXIpLCEwKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIHIuY3JlYXRlUmVmKCl9KSksYS5pc0Rpc2FibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBqZShlLHttaW5EYXRlOmEucHJvcHMubWluRGF0ZSxtYXhEYXRlOmEucHJvcHMubWF4RGF0ZSxleGNsdWRlRGF0ZXM6YS5wcm9wcy5leGNsdWRlRGF0ZXMsaW5jbHVkZURhdGVzOmEucHJvcHMuaW5jbHVkZURhdGVzLGZpbHRlckRhdGU6YS5wcm9wcy5maWx0ZXJEYXRlfSl9LGEuaXNFeGNsdWRlZD1mdW5jdGlvbihlKXtyZXR1cm4gVWUoZSx7ZXhjbHVkZURhdGVzOmEucHJvcHMuZXhjbHVkZURhdGVzfSl9LGEuc2VsZWN0aW5nRGF0ZT1mdW5jdGlvbigpe3ZhciBlO3JldHVybiBudWxsIT09KGU9YS5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09ZT9lOmEucHJvcHMucHJlU2VsZWN0aW9ufSxhLnVwZGF0ZUZvY3VzT25QYWdpbmF0ZT1mdW5jdGlvbihlKXt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe3ZhciB0LHI7bnVsbD09PShyPW51bGw9PT0odD1hLllFQVJfUkVGU1tlXSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuY3VycmVudCl8fHZvaWQgMD09PXJ8fHIuZm9jdXMoKX0pKX0sYS5oYW5kbGVZZWFyQ2xpY2s9ZnVuY3Rpb24oZSx0KXthLnByb3BzLm9uRGF5Q2xpY2smJmEucHJvcHMub25EYXlDbGljayhlLHQpfSxhLmhhbmRsZVllYXJOYXZpZ2F0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbixvLHMsaT1hLnByb3BzLGw9aS5kYXRlLGM9aS55ZWFySXRlbU51bWJlcjtpZih2b2lkIDAhPT1sJiZ2b2lkIDAhPT1jKXt2YXIgcD1tdChsLGMpLnN0YXJ0UGVyaW9kO2EuaXNEaXNhYmxlZCh0KXx8YS5pc0V4Y2x1ZGVkKHQpfHwobnVsbD09PShuPShyPWEucHJvcHMpLnNldFByZVNlbGVjdGlvbil8fHZvaWQgMD09PW58fG4uY2FsbChyLHQpLGUtcDwwP2EudXBkYXRlRm9jdXNPblBhZ2luYXRlKGMtKHAtZSkpOmUtcD49Yz9hLnVwZGF0ZUZvY3VzT25QYWdpbmF0ZShNYXRoLmFicyhjLShlLXApKSk6bnVsbD09PShzPW51bGw9PT0obz1hLllFQVJfUkVGU1tlLXBdKXx8dm9pZCAwPT09bz92b2lkIDA6by5jdXJyZW50KXx8dm9pZCAwPT09c3x8cy5mb2N1cygpKX19LGEuaXNTYW1lRGF5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEhlKGUsdCl9LGEuaXNDdXJyZW50WWVhcj1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXguZ2V0WWVhcihNZSgpKX0sYS5pc1JhbmdlU3RhcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGEucHJvcHMuc3RhcnREYXRlJiZhLnByb3BzLmVuZERhdGUmJkxlKEcuc2V0WWVhcihNZSgpLGUpLGEucHJvcHMuc3RhcnREYXRlKX0sYS5pc1JhbmdlRW5kPWZ1bmN0aW9uKGUpe3JldHVybiBhLnByb3BzLnN0YXJ0RGF0ZSYmYS5wcm9wcy5lbmREYXRlJiZMZShHLnNldFllYXIoTWUoKSxlKSxhLnByb3BzLmVuZERhdGUpfSxhLmlzSW5SYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gSmUoZSxhLnByb3BzLnN0YXJ0RGF0ZSxhLnByb3BzLmVuZERhdGUpfSxhLmlzSW5TZWxlY3RpbmdSYW5nZT1mdW5jdGlvbihlKXt2YXIgdD1hLnByb3BzLHI9dC5zZWxlY3RzU3RhcnQsbj10LnNlbGVjdHNFbmQsbz10LnNlbGVjdHNSYW5nZSxzPXQuc3RhcnREYXRlLGk9dC5lbmREYXRlO3JldHVybiEoIShyfHxufHxvKXx8IWEuc2VsZWN0aW5nRGF0ZSgpKSYmKHImJmk/SmUoZSxhLnNlbGVjdGluZ0RhdGUoKSxpKToobiYmc3x8ISghb3x8IXN8fGkpKSYmSmUoZSxzLGEuc2VsZWN0aW5nRGF0ZSgpKSl9LGEuaXNTZWxlY3RpbmdSYW5nZVN0YXJ0PWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFhLmlzSW5TZWxlY3RpbmdSYW5nZShlKSlyZXR1cm4hMTt2YXIgcj1hLnByb3BzLG49ci5zdGFydERhdGUsbz1yLnNlbGVjdHNTdGFydCxzPUcuc2V0WWVhcihNZSgpLGUpO3JldHVybiBMZShzLG8/bnVsbCE9PSh0PWEuc2VsZWN0aW5nRGF0ZSgpKSYmdm9pZCAwIT09dD90Om51bGw6bnVsbCE9bj9uOm51bGwpfSxhLmlzU2VsZWN0aW5nUmFuZ2VFbmQ9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIWEuaXNJblNlbGVjdGluZ1JhbmdlKGUpKXJldHVybiExO3ZhciByPWEucHJvcHMsbj1yLmVuZERhdGUsbz1yLnNlbGVjdHNFbmQscz1yLnNlbGVjdHNSYW5nZSxpPUcuc2V0WWVhcihNZSgpLGUpO3JldHVybiBMZShpLG98fHM/bnVsbCE9PSh0PWEuc2VsZWN0aW5nRGF0ZSgpKSYmdm9pZCAwIT09dD90Om51bGw6bnVsbCE9bj9uOm51bGwpfSxhLmlzS2V5Ym9hcmRTZWxlY3RlZD1mdW5jdGlvbihlKXtpZih2b2lkIDAhPT1hLnByb3BzLmRhdGUmJm51bGwhPWEucHJvcHMuc2VsZWN0ZWQmJm51bGwhPWEucHJvcHMucHJlU2VsZWN0aW9uKXt2YXIgdD1hLnByb3BzLHI9dC5taW5EYXRlLG49dC5tYXhEYXRlLG89dC5leGNsdWRlRGF0ZXMscz10LmluY2x1ZGVEYXRlcyxpPXQuZmlsdGVyRGF0ZSxsPU9lKEcuc2V0WWVhcihhLnByb3BzLmRhdGUsZSkpLGM9KHJ8fG58fG98fHN8fGkpJiZaZShlLGEucHJvcHMpO3JldHVybiFhLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uJiYhYS5wcm9wcy5pbmxpbmUmJiFIZShsLE9lKGEucHJvcHMuc2VsZWN0ZWQpKSYmSGUobCxPZShhLnByb3BzLnByZVNlbGVjdGlvbikpJiYhY319LGEub25ZZWFyQ2xpY2s9ZnVuY3Rpb24oZSx0KXt2YXIgcj1hLnByb3BzLmRhdGU7dm9pZCAwIT09ciYmYS5oYW5kbGVZZWFyQ2xpY2soT2UoRy5zZXRZZWFyKHIsdCkpLGUpfSxhLm9uWWVhcktleURvd249ZnVuY3Rpb24oZSx0KXt2YXIgcixuLG89ZS5rZXkscz1hLnByb3BzLGk9cy5kYXRlLGw9cy55ZWFySXRlbU51bWJlcixjPXMuaGFuZGxlT25LZXlEb3duO2lmKG8hPT15ZS5UYWImJmUucHJldmVudERlZmF1bHQoKSwhYS5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbilzd2l0Y2gobyl7Y2FzZSB5ZS5FbnRlcjppZihudWxsPT1hLnByb3BzLnNlbGVjdGVkKWJyZWFrO2Eub25ZZWFyQ2xpY2soZSx0KSxudWxsPT09KG49KHI9YS5wcm9wcykuc2V0UHJlU2VsZWN0aW9uKXx8dm9pZCAwPT09bnx8bi5jYWxsKHIsYS5wcm9wcy5zZWxlY3RlZCk7YnJlYWs7Y2FzZSB5ZS5BcnJvd1JpZ2h0OmlmKG51bGw9PWEucHJvcHMucHJlU2VsZWN0aW9uKWJyZWFrO2EuaGFuZGxlWWVhck5hdmlnYXRpb24odCsxLGQuYWRkWWVhcnMoYS5wcm9wcy5wcmVTZWxlY3Rpb24sMSkpO2JyZWFrO2Nhc2UgeWUuQXJyb3dMZWZ0OmlmKG51bGw9PWEucHJvcHMucHJlU2VsZWN0aW9uKWJyZWFrO2EuaGFuZGxlWWVhck5hdmlnYXRpb24odC0xLGllLnN1YlllYXJzKGEucHJvcHMucHJlU2VsZWN0aW9uLDEpKTticmVhaztjYXNlIHllLkFycm93VXA6aWYodm9pZCAwPT09aXx8dm9pZCAwPT09bHx8bnVsbD09YS5wcm9wcy5wcmVTZWxlY3Rpb24pYnJlYWs7dmFyIHA9bXQoaSxsKS5zdGFydFBlcmlvZDtpZigoaD10LShmPTMpKTxwKXt2YXIgdT1sJWY7dD49cCYmdDxwK3U/Zj11OmYrPXUsaD10LWZ9YS5oYW5kbGVZZWFyTmF2aWdhdGlvbihoLGllLnN1YlllYXJzKGEucHJvcHMucHJlU2VsZWN0aW9uLGYpKTticmVhaztjYXNlIHllLkFycm93RG93bjppZih2b2lkIDA9PT1pfHx2b2lkIDA9PT1sfHxudWxsPT1hLnByb3BzLnByZVNlbGVjdGlvbilicmVhazt2YXIgZixoLG09bXQoaSxsKS5lbmRQZXJpb2Q7aWYoKGg9dCsoZj0zKSk+bSl7dT1sJWY7dDw9bSYmdD5tLXU/Zj11OmYrPXUsaD10K2Z9YS5oYW5kbGVZZWFyTmF2aWdhdGlvbihoLGQuYWRkWWVhcnMoYS5wcm9wcy5wcmVTZWxlY3Rpb24sZikpfWMmJmMoZSl9LGEuZ2V0WWVhckNsYXNzTmFtZXM9ZnVuY3Rpb24oZSl7dmFyIHI9YS5wcm9wcyxuPXIuZGF0ZSxvPXIubWluRGF0ZSxzPXIubWF4RGF0ZSxpPXIuc2VsZWN0ZWQsbD1yLmV4Y2x1ZGVEYXRlcyxjPXIuaW5jbHVkZURhdGVzLHA9ci5maWx0ZXJEYXRlLGQ9ci55ZWFyQ2xhc3NOYW1lO3JldHVybiB0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHRcIixcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItXCIuY29uY2F0KGUpLG4/bnVsbD09ZD92b2lkIDA6ZChHLnNldFllYXIobixlKSk6dm9pZCAwLHtcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0ZWRcIjppP2U9PT14LmdldFllYXIoaSk6dm9pZCAwLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1kaXNhYmxlZFwiOihvfHxzfHxsfHxjfHxwKSYmWmUoZSxhLnByb3BzKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWRcIjphLmlzS2V5Ym9hcmRTZWxlY3RlZChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tcmFuZ2Utc3RhcnRcIjphLmlzUmFuZ2VTdGFydChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tcmFuZ2UtZW5kXCI6YS5pc1JhbmdlRW5kKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZVwiOmEuaXNJblJhbmdlKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2VcIjphLmlzSW5TZWxlY3RpbmdSYW5nZShlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0aW5nLXJhbmdlLXN0YXJ0XCI6YS5pc1NlbGVjdGluZ1JhbmdlU3RhcnQoZSksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXNlbGVjdGluZy1yYW5nZS1lbmRcIjphLmlzU2VsZWN0aW5nUmFuZ2VFbmQoZSksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXRvZGF5XCI6YS5pc0N1cnJlbnRZZWFyKGUpfSl9LGEuZ2V0WWVhclRhYkluZGV4PWZ1bmN0aW9uKGUpe3JldHVybiBhLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9ufHxudWxsPT1hLnByb3BzLnByZVNlbGVjdGlvbj9cIi0xXCI6ZT09PXguZ2V0WWVhcihhLnByb3BzLnByZVNlbGVjdGlvbik/XCIwXCI6XCItMVwifSxhLmdldFllYXJDb250YWluZXJDbGFzc05hbWVzPWZ1bmN0aW9uKCl7dmFyIGU9YS5wcm9wcyxyPWUuc2VsZWN0aW5nRGF0ZSxuPWUuc2VsZWN0c1N0YXJ0LG89ZS5zZWxlY3RzRW5kLHM9ZS5zZWxlY3RzUmFuZ2U7cmV0dXJuIHQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJfX3llYXJcIix7XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2VcIjpyJiYobnx8b3x8cyl9KX0sYS5nZXRZZWFyQ29udGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYS5wcm9wcy5yZW5kZXJZZWFyQ29udGVudD9hLnByb3BzLnJlbmRlclllYXJDb250ZW50KGUpOmV9LGF9cmV0dXJuIHZlKG4sZSksbi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PVtdLHI9dGhpcy5wcm9wcyxuPXIuZGF0ZSxhPXIueWVhckl0ZW1OdW1iZXIsbz1yLm9uWWVhck1vdXNlRW50ZXIscz1yLm9uWWVhck1vdXNlTGVhdmU7aWYodm9pZCAwPT09bilyZXR1cm4gbnVsbDtmb3IodmFyIGk9bXQobixhKSxsPWkuc3RhcnRQZXJpb2QsYz1pLmVuZFBlcmlvZCxwPWZ1bmN0aW9uKHIpe3QucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOmQuWUVBUl9SRUZTW3ItbF0sb25DbGljazpmdW5jdGlvbih0KXtlLm9uWWVhckNsaWNrKHQscil9LG9uS2V5RG93bjpmdW5jdGlvbih0KXt5dCh0KSYmKHQucHJldmVudERlZmF1bHQoKSx0LmtleT15ZS5FbnRlciksZS5vblllYXJLZXlEb3duKHQscil9LHRhYkluZGV4Ok51bWJlcihkLmdldFllYXJUYWJJbmRleChyKSksY2xhc3NOYW1lOmQuZ2V0WWVhckNsYXNzTmFtZXMociksb25Nb3VzZUVudGVyOmQucHJvcHMudXNlUG9pbnRlckV2ZW50P3ZvaWQgMDpmdW5jdGlvbihlKXtyZXR1cm4gbyhlLHIpfSxvblBvaW50ZXJFbnRlcjpkLnByb3BzLnVzZVBvaW50ZXJFdmVudD9mdW5jdGlvbihlKXtyZXR1cm4gbyhlLHIpfTp2b2lkIDAsb25Nb3VzZUxlYXZlOmQucHJvcHMudXNlUG9pbnRlckV2ZW50P3ZvaWQgMDpmdW5jdGlvbihlKXtyZXR1cm4gcyhlLHIpfSxvblBvaW50ZXJMZWF2ZTpkLnByb3BzLnVzZVBvaW50ZXJFdmVudD9mdW5jdGlvbihlKXtyZXR1cm4gcyhlLHIpfTp2b2lkIDAsa2V5OnIsXCJhcmlhLWN1cnJlbnRcIjpkLmlzQ3VycmVudFllYXIocik/XCJkYXRlXCI6dm9pZCAwfSxkLmdldFllYXJDb250ZW50KHIpKSl9LGQ9dGhpcyx1PWw7dTw9Yzt1KyspcCh1KTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTp0aGlzLmdldFllYXJDb250YWluZXJDbGFzc05hbWVzKCl9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXdyYXBwZXJcIixvbk1vdXNlTGVhdmU6dGhpcy5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOnRoaXMucHJvcHMuY2xlYXJTZWxlY3RpbmdEYXRlLG9uUG9pbnRlckxlYXZlOnRoaXMucHJvcHMudXNlUG9pbnRlckV2ZW50P3RoaXMucHJvcHMuY2xlYXJTZWxlY3RpbmdEYXRlOnZvaWQgMH0sdCkpfSxufShyLkNvbXBvbmVudCk7ZnVuY3Rpb24gV3QoZSx0LHIsbil7Zm9yKHZhciBhPVtdLG89MDtvPDIqdCsxO28rKyl7dmFyIHM9ZSt0LW8saT0hMDtyJiYoaT14LmdldFllYXIocik8PXMpLG4mJmkmJihpPXguZ2V0WWVhcihuKT49cyksaSYmYS5wdXNoKHMpfXJldHVybiBhfXZhciBRdD1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO24ucmVuZGVyT3B0aW9ucz1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMueWVhcix0PW4uc3RhdGUueWVhcnNMaXN0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6ZT09PXQ/XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbiByZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbi0tc2VsZWN0ZWRfeWVhclwiOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb25cIixrZXk6dCxvbkNsaWNrOm4ub25DaGFuZ2UuYmluZChuLHQpLFwiYXJpYS1zZWxlY3RlZFwiOmU9PT10P1widHJ1ZVwiOnZvaWQgMH0sZT09PXQ/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbi0tc2VsZWN0ZWRcIn0sXCLinJNcIik6XCJcIix0KX0pKSxyPW4ucHJvcHMubWluRGF0ZT94LmdldFllYXIobi5wcm9wcy5taW5EYXRlKTpudWxsLGE9bi5wcm9wcy5tYXhEYXRlP3guZ2V0WWVhcihuLnByb3BzLm1heERhdGUpOm51bGw7cmV0dXJuIGEmJm4uc3RhdGUueWVhcnNMaXN0LmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09YX0pKXx8dC51bnNoaWZ0KHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvblwiLGtleTpcInVwY29taW5nXCIsb25DbGljazpuLmluY3JlbWVudFllYXJzfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJhXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24gcmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMgcmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmdcIn0pKSksciYmbi5zdGF0ZS55ZWFyc0xpc3QuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1yfSkpfHx0LnB1c2godWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uXCIsa2V5OlwicHJldmlvdXNcIixvbkNsaWNrOm4uZGVjcmVtZW50WWVhcnN9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbiByZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycyByZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy1wcmV2aW91c1wifSkpKSx0fSxuLm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe24ucHJvcHMub25DaGFuZ2UoZSl9LG4uaGFuZGxlQ2xpY2tPdXRzaWRlPWZ1bmN0aW9uKCl7bi5wcm9wcy5vbkNhbmNlbCgpfSxuLnNoaWZ0WWVhcnM9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5zdGF0ZS55ZWFyc0xpc3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdCtlfSkpO24uc2V0U3RhdGUoe3llYXJzTGlzdDp0fSl9LG4uaW5jcmVtZW50WWVhcnM9ZnVuY3Rpb24oKXtyZXR1cm4gbi5zaGlmdFllYXJzKDEpfSxuLmRlY3JlbWVudFllYXJzPWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2hpZnRZZWFycygtMSl9O3ZhciBhPXQueWVhckRyb3Bkb3duSXRlbU51bWJlcixvPXQuc2Nyb2xsYWJsZVllYXJEcm9wZG93bixzPWF8fChvPzEwOjUpO3JldHVybiBuLnN0YXRlPXt5ZWFyc0xpc3Q6V3Qobi5wcm9wcy55ZWFyLHMsbi5wcm9wcy5taW5EYXRlLG4ucHJvcHMubWF4RGF0ZSl9LG4uZHJvcGRvd25SZWY9ci5jcmVhdGVSZWYoKSxufXJldHVybiB2ZShuLGUpLG4ucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kcm9wZG93blJlZi5jdXJyZW50O2lmKGUpe3ZhciB0PWUuY2hpbGRyZW4/QXJyYXkuZnJvbShlLmNoaWxkcmVuKTpudWxsLHI9dD90LmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFyaWFTZWxlY3RlZH0pKTpudWxsO2Uuc2Nyb2xsVG9wPXImJnIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD9yLm9mZnNldFRvcCsoci5jbGllbnRIZWlnaHQtZS5jbGllbnRIZWlnaHQpLzI6KGUuc2Nyb2xsSGVpZ2h0LWUuY2xpZW50SGVpZ2h0KS8yfX0sbi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dC5jbHN4KHtcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd25cIjohMCxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tLXNjcm9sbGFibGVcIjp0aGlzLnByb3BzLnNjcm9sbGFibGVZZWFyRHJvcGRvd259KTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTplLHJlZjp0aGlzLmRyb3Bkb3duUmVmfSx0aGlzLnJlbmRlck9wdGlvbnMoKSl9LG59KHIuQ29tcG9uZW50KSxxdD1mZS5kZWZhdWx0KFF0KSxLdD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0LnN0YXRlPXtkcm9wZG93blZpc2libGU6ITF9LHQucmVuZGVyU2VsZWN0T3B0aW9ucz1mdW5jdGlvbigpe2Zvcih2YXIgZT10LnByb3BzLm1pbkRhdGU/eC5nZXRZZWFyKHQucHJvcHMubWluRGF0ZSk6MTkwMCxyPXQucHJvcHMubWF4RGF0ZT94LmdldFllYXIodC5wcm9wcy5tYXhEYXRlKToyMTAwLG49W10sYT1lO2E8PXI7YSsrKW4ucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIix7a2V5OmEsdmFsdWU6YX0sYSkpO3JldHVybiBufSx0Lm9uU2VsZWN0Q2hhbmdlPWZ1bmN0aW9uKGUpe3Qub25DaGFuZ2UocGFyc2VJbnQoZS50YXJnZXQudmFsdWUpKX0sdC5yZW5kZXJTZWxlY3RNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiLHt2YWx1ZTp0LnByb3BzLnllYXIsY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1zZWxlY3RcIixvbkNoYW5nZTp0Lm9uU2VsZWN0Q2hhbmdlfSx0LnJlbmRlclNlbGVjdE9wdGlvbnMoKSl9LHQucmVuZGVyUmVhZFZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6XCJyZWFkXCIsc3R5bGU6e3Zpc2liaWxpdHk6ZT9cInZpc2libGVcIjpcImhpZGRlblwifSxjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlld1wiLG9uQ2xpY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHQudG9nZ2xlRHJvcGRvd24oZSl9fSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93XCJ9KSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1zZWxlY3RlZC15ZWFyXCJ9LHQucHJvcHMueWVhcikpfSx0LnJlbmRlckRyb3Bkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChxdCxnZSh7a2V5OlwiZHJvcGRvd25cIn0sdC5wcm9wcyx7b25DaGFuZ2U6dC5vbkNoYW5nZSxvbkNhbmNlbDp0LnRvZ2dsZURyb3Bkb3dufSkpfSx0LnJlbmRlclNjcm9sbE1vZGU9ZnVuY3Rpb24oKXt2YXIgZT10LnN0YXRlLmRyb3Bkb3duVmlzaWJsZSxyPVt0LnJlbmRlclJlYWRWaWV3KCFlKV07cmV0dXJuIGUmJnIudW5zaGlmdCh0LnJlbmRlckRyb3Bkb3duKCkpLHJ9LHQub25DaGFuZ2U9ZnVuY3Rpb24oZSl7dC50b2dnbGVEcm9wZG93bigpLGUhPT10LnByb3BzLnllYXImJnQucHJvcHMub25DaGFuZ2UoZSl9LHQudG9nZ2xlRHJvcGRvd249ZnVuY3Rpb24oZSl7dC5zZXRTdGF0ZSh7ZHJvcGRvd25WaXNpYmxlOiF0LnN0YXRlLmRyb3Bkb3duVmlzaWJsZX0sKGZ1bmN0aW9uKCl7dC5wcm9wcy5hZGp1c3REYXRlT25DaGFuZ2UmJnQuaGFuZGxlWWVhckNoYW5nZSh0LnByb3BzLmRhdGUsZSl9KSl9LHQuaGFuZGxlWWVhckNoYW5nZT1mdW5jdGlvbihlLHIpe3Qub25TZWxlY3QoZSxyKSx0LnNldE9wZW4oKX0sdC5vblNlbGVjdD1mdW5jdGlvbihlLHIpe3QucHJvcHMub25TZWxlY3QmJnQucHJvcHMub25TZWxlY3QoZSxyKX0sdC5zZXRPcGVuPWZ1bmN0aW9uKCl7dC5wcm9wcy5zZXRPcGVuJiZ0LnByb3BzLnNldE9wZW4oITApfSx0fXJldHVybiB2ZSh0LGUpLHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlO3N3aXRjaCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl7Y2FzZVwic2Nyb2xsXCI6ZT10aGlzLnJlbmRlclNjcm9sbE1vZGUoKTticmVhaztjYXNlXCJzZWxlY3RcIjplPXRoaXMucmVuZGVyU2VsZWN0TW9kZSgpfXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi1jb250YWluZXIgcmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi1jb250YWluZXItLVwiLmNvbmNhdCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl9LGUpfSx0fShyLkNvbXBvbmVudCksQnQ9W1wicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1zZWxlY3RcIixcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXNlbGVjdFwiLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1zZWxlY3RcIl0sVnQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihvKXt2YXIgcz1lLmNhbGwodGhpcyxvKXx8dGhpcztyZXR1cm4gcy5tb250aENvbnRhaW5lcj12b2lkIDAscy5oYW5kbGVDbGlja091dHNpZGU9ZnVuY3Rpb24oZSl7cy5wcm9wcy5vbkNsaWNrT3V0c2lkZShlKX0scy5zZXRDbGlja091dHNpZGVSZWY9ZnVuY3Rpb24oKXtyZXR1cm4gcy5jb250YWluZXJSZWYuY3VycmVudH0scy5oYW5kbGVEcm9wZG93bkZvY3VzPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhO249ZS50YXJnZXQsYT0obi5jbGFzc05hbWV8fFwiXCIpLnNwbGl0KC9cXHMrLyksQnQuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGEuaW5kZXhPZihlKT49MH0pKSYmKG51bGw9PT0ocj0odD1zLnByb3BzKS5vbkRyb3Bkb3duRm9jdXMpfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKSl9LHMuZ2V0RGF0ZUluVmlldz1mdW5jdGlvbigpe3ZhciBlPXMucHJvcHMsdD1lLnByZVNlbGVjdGlvbixyPWUuc2VsZWN0ZWQsbj1lLm9wZW5Ub0RhdGUsYT1jdChzLnByb3BzKSxvPXB0KHMucHJvcHMpLGk9TWUoKSxsPW58fHJ8fHQ7cmV0dXJuIGx8fChhJiZPLmlzQmVmb3JlKGksYSk/YTpvJiZOLmlzQWZ0ZXIoaSxvKT9vOmkpfSxzLmluY3JlYXNlTW9udGg9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKChmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGU7cmV0dXJue2RhdGU6aS5hZGRNb250aHModCwxKX19KSwoZnVuY3Rpb24oKXtyZXR1cm4gcy5oYW5kbGVNb250aENoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmRlY3JlYXNlTW9udGg9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKChmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGU7cmV0dXJue2RhdGU6YWUuc3ViTW9udGhzKHQsMSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlTW9udGhDaGFuZ2Uocy5zdGF0ZS5kYXRlKX0pKX0scy5oYW5kbGVEYXlDbGljaz1mdW5jdGlvbihlLHQscil7cy5wcm9wcy5vblNlbGVjdChlLHQscikscy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24mJnMucHJvcHMuc2V0UHJlU2VsZWN0aW9uKGUpfSxzLmhhbmRsZURheU1vdXNlRW50ZXI9ZnVuY3Rpb24oZSl7cy5zZXRTdGF0ZSh7c2VsZWN0aW5nRGF0ZTplfSkscy5wcm9wcy5vbkRheU1vdXNlRW50ZXImJnMucHJvcHMub25EYXlNb3VzZUVudGVyKGUpfSxzLmhhbmRsZU1vbnRoTW91c2VMZWF2ZT1mdW5jdGlvbigpe3Muc2V0U3RhdGUoe3NlbGVjdGluZ0RhdGU6dm9pZCAwfSkscy5wcm9wcy5vbk1vbnRoTW91c2VMZWF2ZSYmcy5wcm9wcy5vbk1vbnRoTW91c2VMZWF2ZSgpfSxzLmhhbmRsZVllYXJNb3VzZUVudGVyPWZ1bmN0aW9uKGUsdCl7cy5zZXRTdGF0ZSh7c2VsZWN0aW5nRGF0ZTpHLnNldFllYXIoTWUoKSx0KX0pLHMucHJvcHMub25ZZWFyTW91c2VFbnRlciYmcy5wcm9wcy5vblllYXJNb3VzZUVudGVyKGUsdCl9LHMuaGFuZGxlWWVhck1vdXNlTGVhdmU9ZnVuY3Rpb24oZSx0KXtzLnByb3BzLm9uWWVhck1vdXNlTGVhdmUmJnMucHJvcHMub25ZZWFyTW91c2VMZWF2ZShlLHQpfSxzLmhhbmRsZVllYXJDaGFuZ2U9ZnVuY3Rpb24oZSl7cy5wcm9wcy5vblllYXJDaGFuZ2UmJihzLnByb3BzLm9uWWVhckNoYW5nZShlKSxzLnNldFN0YXRlKHtpc1JlbmRlckFyaWFMaXZlTWVzc2FnZTohMH0pKSxzLnByb3BzLmFkanVzdERhdGVPbkNoYW5nZSYmKHMucHJvcHMub25TZWxlY3QmJnMucHJvcHMub25TZWxlY3QoZSkscy5wcm9wcy5zZXRPcGVuJiZzLnByb3BzLnNldE9wZW4oITApKSxzLnByb3BzLnNldFByZVNlbGVjdGlvbiYmcy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24oZSl9LHMuaGFuZGxlTW9udGhDaGFuZ2U9ZnVuY3Rpb24oZSl7cy5oYW5kbGVDdXN0b21Nb250aENoYW5nZShlKSxzLnByb3BzLmFkanVzdERhdGVPbkNoYW5nZSYmKHMucHJvcHMub25TZWxlY3QmJnMucHJvcHMub25TZWxlY3QoZSkscy5wcm9wcy5zZXRPcGVuJiZzLnByb3BzLnNldE9wZW4oITApKSxzLnByb3BzLnNldFByZVNlbGVjdGlvbiYmcy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24oZSl9LHMuaGFuZGxlQ3VzdG9tTW9udGhDaGFuZ2U9ZnVuY3Rpb24oZSl7cy5wcm9wcy5vbk1vbnRoQ2hhbmdlJiYocy5wcm9wcy5vbk1vbnRoQ2hhbmdlKGUpLHMuc2V0U3RhdGUoe2lzUmVuZGVyQXJpYUxpdmVNZXNzYWdlOiEwfSkpfSxzLmhhbmRsZU1vbnRoWWVhckNoYW5nZT1mdW5jdGlvbihlKXtzLmhhbmRsZVllYXJDaGFuZ2UoZSkscy5oYW5kbGVNb250aENoYW5nZShlKX0scy5jaGFuZ2VZZWFyPWZ1bmN0aW9uKGUpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKHQpe3ZhciByPXQuZGF0ZTtyZXR1cm57ZGF0ZTpHLnNldFllYXIocixOdW1iZXIoZSkpfX0pLChmdW5jdGlvbigpe3JldHVybiBzLmhhbmRsZVllYXJDaGFuZ2Uocy5zdGF0ZS5kYXRlKX0pKX0scy5jaGFuZ2VNb250aD1mdW5jdGlvbihlKXtzLnNldFN0YXRlKChmdW5jdGlvbih0KXt2YXIgcj10LmRhdGU7cmV0dXJue2RhdGU6JC5zZXRNb250aChyLE51bWJlcihlKSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlTW9udGhDaGFuZ2Uocy5zdGF0ZS5kYXRlKX0pKX0scy5jaGFuZ2VNb250aFllYXI9ZnVuY3Rpb24oZSl7cy5zZXRTdGF0ZSgoZnVuY3Rpb24odCl7dmFyIHI9dC5kYXRlO3JldHVybntkYXRlOkcuc2V0WWVhcigkLnNldE1vbnRoKHIsXy5nZXRNb250aChlKSkseC5nZXRZZWFyKGUpKX19KSwoZnVuY3Rpb24oKXtyZXR1cm4gcy5oYW5kbGVNb250aFllYXJDaGFuZ2Uocy5zdGF0ZS5kYXRlKX0pKX0scy5oZWFkZXI9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9cy5zdGF0ZS5kYXRlKTt2YXIgcj14ZShlLHMucHJvcHMubG9jYWxlLHMucHJvcHMuY2FsZW5kYXJTdGFydERheSksbj1bXTtyZXR1cm4gcy5wcm9wcy5zaG93V2Vla051bWJlcnMmJm4ucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7a2V5OlwiV1wiLGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lXCJ9LHMucHJvcHMud2Vla0xhYmVsfHxcIiNcIikpLG4uY29uY2F0KFswLDEsMiwzLDQsNSw2XS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBuPWEuYWRkRGF5cyhyLGUpLG89cy5mb3JtYXRXZWVrZGF5KG4scy5wcm9wcy5sb2NhbGUpLGk9cy5wcm9wcy53ZWVrRGF5Q2xhc3NOYW1lP3MucHJvcHMud2Vla0RheUNsYXNzTmFtZShuKTp2b2lkIDA7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6ZSxcImFyaWEtbGFiZWxcIjpfZShuLFwiRUVFRVwiLHMucHJvcHMubG9jYWxlKSxjbGFzc05hbWU6dC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWVcIixpKX0sbyl9KSkpfSxzLmZvcm1hdFdlZWtkYXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcy5wcm9wcy5mb3JtYXRXZWVrRGF5P2Z1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdChfZShlLFwiRUVFRVwiLHIpKX0oZSxzLnByb3BzLmZvcm1hdFdlZWtEYXksdCk6cy5wcm9wcy51c2VXZWVrZGF5c1Nob3J0P2Z1bmN0aW9uKGUsdCl7cmV0dXJuIF9lKGUsXCJFRUVcIix0KX0oZSx0KTpmdW5jdGlvbihlLHQpe3JldHVybiBfZShlLFwiRUVFRUVFXCIsdCl9KGUsdCl9LHMuZGVjcmVhc2VZZWFyPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZSgoZnVuY3Rpb24oZSl7dmFyIHQscj1lLmRhdGU7cmV0dXJue2RhdGU6aWUuc3ViWWVhcnMocixzLnByb3BzLnNob3dZZWFyUGlja2VyP251bGwhPT0odD1zLnByb3BzLnllYXJJdGVtTnVtYmVyKSYmdm9pZCAwIT09dD90Om4uZGVmYXVsdFByb3BzLnllYXJJdGVtTnVtYmVyOjEpfX0pLChmdW5jdGlvbigpe3JldHVybiBzLmhhbmRsZVllYXJDaGFuZ2Uocy5zdGF0ZS5kYXRlKX0pKX0scy5jbGVhclNlbGVjdGluZ0RhdGU9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKHtzZWxlY3RpbmdEYXRlOnZvaWQgMH0pfSxzLnJlbmRlclByZXZpb3VzQnV0dG9uPWZ1bmN0aW9uKCl7dmFyIGU7aWYoIXMucHJvcHMucmVuZGVyQ3VzdG9tSGVhZGVyKXt2YXIgdDtzd2l0Y2goITApe2Nhc2Ugcy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyOnQ9aXQocy5zdGF0ZS5kYXRlLHMucHJvcHMpO2JyZWFrO2Nhc2Ugcy5wcm9wcy5zaG93WWVhclBpY2tlcjp0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci55ZWFySXRlbU51bWJlcixvPXZvaWQgMD09PWE/U2U6YSxzPW10KE9lKGllLnN1YlllYXJzKGUsbykpLG8pLmVuZFBlcmlvZCxpPW4mJnguZ2V0WWVhcihuKTtyZXR1cm4gaSYmaT5zfHwhMX0ocy5zdGF0ZS5kYXRlLHMucHJvcHMpO2JyZWFrO2Nhc2Ugcy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXI6dD1mdW5jdGlvbihlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWluRGF0ZSxhPXIuaW5jbHVkZURhdGVzLG89cmUuc3RhcnRPZlllYXIoZSkscz1vZS5zdWJRdWFydGVycyhvLDEpO3JldHVybiBuJiZoLmRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMobixzKT4wfHxhJiZhLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gaC5kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzKGUscyk+MH0pKXx8ITF9KHMuc3RhdGUuZGF0ZSxzLnByb3BzKTticmVhaztkZWZhdWx0OnQ9b3Qocy5zdGF0ZS5kYXRlLHMucHJvcHMpfWlmKCgobnVsbCE9PShlPXMucHJvcHMuZm9yY2VTaG93TW9udGhOYXZpZ2F0aW9uKSYmdm9pZCAwIT09ZT9lOm4uZGVmYXVsdFByb3BzLmZvcmNlU2hvd01vbnRoTmF2aWdhdGlvbil8fHMucHJvcHMuc2hvd0Rpc2FibGVkTW9udGhOYXZpZ2F0aW9ufHwhdCkmJiFzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSl7dmFyIHI9W1wicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvblwiLFwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tcHJldmlvdXNcIl0sYT1zLmRlY3JlYXNlTW9udGg7KHMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1llYXJQaWNrZXIpJiYoYT1zLmRlY3JlYXNlWWVhciksdCYmcy5wcm9wcy5zaG93RGlzYWJsZWRNb250aE5hdmlnYXRpb24mJihyLnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1wcmV2aW91cy0tZGlzYWJsZWRcIiksYT12b2lkIDApO3ZhciBvPXMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1llYXJQaWNrZXIsaT1zLnByb3BzLGw9aS5wcmV2aW91c01vbnRoQnV0dG9uTGFiZWwsYz12b2lkIDA9PT1sP24uZGVmYXVsdFByb3BzLnByZXZpb3VzTW9udGhCdXR0b25MYWJlbDpsLHA9aS5wcmV2aW91c1llYXJCdXR0b25MYWJlbCxkPXZvaWQgMD09PXA/bi5kZWZhdWx0UHJvcHMucHJldmlvdXNZZWFyQnV0dG9uTGFiZWw6cCx1PXMucHJvcHMsZj11LnByZXZpb3VzTW9udGhBcmlhTGFiZWwsbT12b2lkIDA9PT1mP1wic3RyaW5nXCI9PXR5cGVvZiBjP2M6XCJQcmV2aW91cyBNb250aFwiOmYsdj11LnByZXZpb3VzWWVhckFyaWFMYWJlbCxnPXZvaWQgMD09PXY/XCJzdHJpbmdcIj09dHlwZW9mIGQ/ZDpcIlByZXZpb3VzIFllYXJcIjp2O3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIix7dHlwZTpcImJ1dHRvblwiLGNsYXNzTmFtZTpyLmpvaW4oXCIgXCIpLG9uQ2xpY2s6YSxvbktleURvd246cy5wcm9wcy5oYW5kbGVPbktleURvd24sXCJhcmlhLWxhYmVsXCI6bz9nOm19LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOltcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvblwiLFwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1wcmV2aW91c1wiXS5qb2luKFwiIFwiKX0sbz9kOmMpKX19fSxzLmluY3JlYXNlWWVhcj1mdW5jdGlvbigpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3ZhciB0LHI9ZS5kYXRlO3JldHVybntkYXRlOmQuYWRkWWVhcnMocixzLnByb3BzLnNob3dZZWFyUGlja2VyP251bGwhPT0odD1zLnByb3BzLnllYXJJdGVtTnVtYmVyKSYmdm9pZCAwIT09dD90Om4uZGVmYXVsdFByb3BzLnllYXJJdGVtTnVtYmVyOjEpfX0pLChmdW5jdGlvbigpe3JldHVybiBzLmhhbmRsZVllYXJDaGFuZ2Uocy5zdGF0ZS5kYXRlKX0pKX0scy5yZW5kZXJOZXh0QnV0dG9uPWZ1bmN0aW9uKCl7dmFyIGU7aWYoIXMucHJvcHMucmVuZGVyQ3VzdG9tSGVhZGVyKXt2YXIgdDtzd2l0Y2goITApe2Nhc2Ugcy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyOnQ9bHQocy5zdGF0ZS5kYXRlLHMucHJvcHMpO2JyZWFrO2Nhc2Ugcy5wcm9wcy5zaG93WWVhclBpY2tlcjp0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5tYXhEYXRlLGE9ci55ZWFySXRlbU51bWJlcixvPXZvaWQgMD09PWE/U2U6YSxzPW10KGQuYWRkWWVhcnMoZSxvKSxvKS5zdGFydFBlcmlvZCxpPW4mJnguZ2V0WWVhcihuKTtyZXR1cm4gaSYmaTxzfHwhMX0ocy5zdGF0ZS5kYXRlLHMucHJvcHMpO2JyZWFrO2Nhc2Ugcy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXI6dD1mdW5jdGlvbihlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWF4RGF0ZSxhPXIuaW5jbHVkZURhdGVzLG89eS5lbmRPZlllYXIoZSkscz1sLmFkZFF1YXJ0ZXJzKG8sMSk7cmV0dXJuIG4mJmguZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhzLG4pPjB8fGEmJmEuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBoLmRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMocyxlKT4wfSkpfHwhMX0ocy5zdGF0ZS5kYXRlLHMucHJvcHMpO2JyZWFrO2RlZmF1bHQ6dD1zdChzLnN0YXRlLmRhdGUscy5wcm9wcyl9aWYoKChudWxsIT09KGU9cy5wcm9wcy5mb3JjZVNob3dNb250aE5hdmlnYXRpb24pJiZ2b2lkIDAhPT1lP2U6bi5kZWZhdWx0UHJvcHMuZm9yY2VTaG93TW9udGhOYXZpZ2F0aW9uKXx8cy5wcm9wcy5zaG93RGlzYWJsZWRNb250aE5hdmlnYXRpb258fCF0KSYmIXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5KXt2YXIgcj1bXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uXCIsXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0XCJdO3MucHJvcHMuc2hvd1RpbWVTZWxlY3QmJnIucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLXdpdGgtdGltZVwiKSxzLnByb3BzLnRvZGF5QnV0dG9uJiZyLnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0LS13aXRoLXRvZGF5LWJ1dHRvblwiKTt2YXIgYT1zLmluY3JlYXNlTW9udGg7KHMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1llYXJQaWNrZXIpJiYoYT1zLmluY3JlYXNlWWVhciksdCYmcy5wcm9wcy5zaG93RGlzYWJsZWRNb250aE5hdmlnYXRpb24mJihyLnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0LS1kaXNhYmxlZFwiKSxhPXZvaWQgMCk7dmFyIG89cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93WWVhclBpY2tlcixpPXMucHJvcHMsYz1pLm5leHRNb250aEJ1dHRvbkxhYmVsLHA9dm9pZCAwPT09Yz9uLmRlZmF1bHRQcm9wcy5uZXh0TW9udGhCdXR0b25MYWJlbDpjLHU9aS5uZXh0WWVhckJ1dHRvbkxhYmVsLGY9dm9pZCAwPT09dT9uLmRlZmF1bHRQcm9wcy5uZXh0WWVhckJ1dHRvbkxhYmVsOnUsbT1zLnByb3BzLHY9bS5uZXh0TW9udGhBcmlhTGFiZWwsZz12b2lkIDA9PT12P1wic3RyaW5nXCI9PXR5cGVvZiBwP3A6XCJOZXh0IE1vbnRoXCI6dixEPW0ubmV4dFllYXJBcmlhTGFiZWwsaz12b2lkIDA9PT1EP1wic3RyaW5nXCI9PXR5cGVvZiBmP2Y6XCJOZXh0IFllYXJcIjpEO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIix7dHlwZTpcImJ1dHRvblwiLGNsYXNzTmFtZTpyLmpvaW4oXCIgXCIpLG9uQ2xpY2s6YSxvbktleURvd246cy5wcm9wcy5oYW5kbGVPbktleURvd24sXCJhcmlhLWxhYmVsXCI6bz9rOmd9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOltcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvblwiLFwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1uZXh0XCJdLmpvaW4oXCIgXCIpfSxvP2Y6cCkpfX19LHMucmVuZGVyQ3VycmVudE1vbnRoPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXMuc3RhdGUuZGF0ZSk7dmFyIHQ9W1wicmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aFwiXTtyZXR1cm4gcy5wcm9wcy5zaG93WWVhckRyb3Bkb3duJiZ0LnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLS1oYXNZZWFyRHJvcGRvd25cIikscy5wcm9wcy5zaG93TW9udGhEcm9wZG93biYmdC5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aC0taGFzTW9udGhEcm9wZG93blwiKSxzLnByb3BzLnNob3dNb250aFllYXJEcm9wZG93biYmdC5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aC0taGFzTW9udGhZZWFyRHJvcGRvd25cIiksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaDJcIix7Y2xhc3NOYW1lOnQuam9pbihcIiBcIil9LF9lKGUscy5wcm9wcy5kYXRlRm9ybWF0LHMucHJvcHMubG9jYWxlKSl9LHMucmVuZGVyWWVhckRyb3Bkb3duPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPSExKSxzLnByb3BzLnNob3dZZWFyRHJvcGRvd24mJiFlKXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoS3QsZ2Uoe30sbi5kZWZhdWx0UHJvcHMscy5wcm9wcyx7ZGF0ZTpzLnN0YXRlLmRhdGUsb25DaGFuZ2U6cy5jaGFuZ2VZZWFyLHllYXI6eC5nZXRZZWFyKHMuc3RhdGUuZGF0ZSl9KSl9LHMucmVuZGVyTW9udGhEcm9wZG93bj1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lJiYoZT0hMSkscy5wcm9wcy5zaG93TW9udGhEcm9wZG93biYmIWUpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChJdCxnZSh7fSxuLmRlZmF1bHRQcm9wcyxzLnByb3BzLHttb250aDpfLmdldE1vbnRoKHMuc3RhdGUuZGF0ZSksb25DaGFuZ2U6cy5jaGFuZ2VNb250aH0pKX0scy5yZW5kZXJNb250aFllYXJEcm9wZG93bj1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lJiYoZT0hMSkscy5wcm9wcy5zaG93TW9udGhZZWFyRHJvcGRvd24mJiFlKXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQXQsZ2Uoe30sbi5kZWZhdWx0UHJvcHMscy5wcm9wcyx7ZGF0ZTpzLnN0YXRlLmRhdGUsb25DaGFuZ2U6cy5jaGFuZ2VNb250aFllYXJ9KSl9LHMuaGFuZGxlVG9kYXlCdXR0b25DbGljaz1mdW5jdGlvbihlKXtzLnByb3BzLm9uU2VsZWN0KFRlKCksZSkscy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24mJnMucHJvcHMuc2V0UHJlU2VsZWN0aW9uKFRlKCkpfSxzLnJlbmRlclRvZGF5QnV0dG9uPWZ1bmN0aW9uKCl7aWYocy5wcm9wcy50b2RheUJ1dHRvbiYmIXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5KXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdG9kYXktYnV0dG9uXCIsb25DbGljazpzLmhhbmRsZVRvZGF5QnV0dG9uQ2xpY2t9LHMucHJvcHMudG9kYXlCdXR0b24pfSxzLnJlbmRlckRlZmF1bHRIZWFkZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tb250aERhdGUscj1lLmk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXIgXCIuY29uY2F0KHMucHJvcHMuc2hvd1RpbWVTZWxlY3Q/XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLWhhcy10aW1lLXNlbGVjdFwiOlwiXCIpfSxzLnJlbmRlckN1cnJlbnRNb250aCh0KSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyX19kcm9wZG93biByZWFjdC1kYXRlcGlja2VyX19oZWFkZXJfX2Ryb3Bkb3duLS1cIi5jb25jYXQocy5wcm9wcy5kcm9wZG93bk1vZGUpLG9uRm9jdXM6cy5oYW5kbGVEcm9wZG93bkZvY3VzfSxzLnJlbmRlck1vbnRoRHJvcGRvd24oMCE9PXIpLHMucmVuZGVyTW9udGhZZWFyRHJvcGRvd24oMCE9PXIpLHMucmVuZGVyWWVhckRyb3Bkb3duKDAhPT1yKSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lc1wifSxzLmhlYWRlcih0KSkpfSxzLnJlbmRlckN1c3RvbUhlYWRlcj1mdW5jdGlvbihlKXt2YXIgdCxyLG49ZS5tb250aERhdGUsYT1lLmk7aWYocy5wcm9wcy5zaG93VGltZVNlbGVjdCYmIXMuc3RhdGUubW9udGhDb250YWluZXJ8fHMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5KXJldHVybiBudWxsO3ZhciBvPW90KHMuc3RhdGUuZGF0ZSxzLnByb3BzKSxpPXN0KHMuc3RhdGUuZGF0ZSxzLnByb3BzKSxsPWl0KHMuc3RhdGUuZGF0ZSxzLnByb3BzKSxjPWx0KHMuc3RhdGUuZGF0ZSxzLnByb3BzKSxwPSFzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXImJiFzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlciYmIXMucHJvcHMuc2hvd1llYXJQaWNrZXI7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXIgcmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS1jdXN0b21cIixvbkZvY3VzOnMucHJvcHMub25Ecm9wZG93bkZvY3VzfSxudWxsPT09KHI9KHQ9cy5wcm9wcykucmVuZGVyQ3VzdG9tSGVhZGVyKXx8dm9pZCAwPT09cj92b2lkIDA6ci5jYWxsKHQsZ2UoZ2Uoe30scy5zdGF0ZSkse2N1c3RvbUhlYWRlckNvdW50OmEsbW9udGhEYXRlOm4sY2hhbmdlTW9udGg6cy5jaGFuZ2VNb250aCxjaGFuZ2VZZWFyOnMuY2hhbmdlWWVhcixkZWNyZWFzZU1vbnRoOnMuZGVjcmVhc2VNb250aCxpbmNyZWFzZU1vbnRoOnMuaW5jcmVhc2VNb250aCxkZWNyZWFzZVllYXI6cy5kZWNyZWFzZVllYXIsaW5jcmVhc2VZZWFyOnMuaW5jcmVhc2VZZWFyLHByZXZNb250aEJ1dHRvbkRpc2FibGVkOm8sbmV4dE1vbnRoQnV0dG9uRGlzYWJsZWQ6aSxwcmV2WWVhckJ1dHRvbkRpc2FibGVkOmwsbmV4dFllYXJCdXR0b25EaXNhYmxlZDpjfSkpLHAmJnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZXNcIn0scy5oZWFkZXIobikpKX0scy5yZW5kZXJZZWFySGVhZGVyPWZ1bmN0aW9uKGUpe3ZhciB0PWUubW9udGhEYXRlLHI9cy5wcm9wcyxhPXIuc2hvd1llYXJQaWNrZXIsbz1yLnllYXJJdGVtTnVtYmVyLGk9bXQodCx2b2lkIDA9PT1vP24uZGVmYXVsdFByb3BzLnllYXJJdGVtTnVtYmVyOm8pLGw9aS5zdGFydFBlcmlvZCxjPWkuZW5kUGVyaW9kO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyIHJlYWN0LWRhdGVwaWNrZXIteWVhci1oZWFkZXJcIn0sYT9cIlwiLmNvbmNhdChsLFwiIC0gXCIpLmNvbmNhdChjKTp4LmdldFllYXIodCkpfSxzLnJlbmRlckhlYWRlcj1mdW5jdGlvbihlKXt2YXIgdD1lLm1vbnRoRGF0ZSxyPWUuaSxuPXttb250aERhdGU6dCxpOnZvaWQgMD09PXI/MDpyfTtzd2l0Y2goITApe2Nhc2Ugdm9pZCAwIT09cy5wcm9wcy5yZW5kZXJDdXN0b21IZWFkZXI6cmV0dXJuIHMucmVuZGVyQ3VzdG9tSGVhZGVyKG4pO2Nhc2Ugcy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93WWVhclBpY2tlcjpyZXR1cm4gcy5yZW5kZXJZZWFySGVhZGVyKG4pO2RlZmF1bHQ6cmV0dXJuIHMucmVuZGVyRGVmYXVsdEhlYWRlcihuKX19LHMucmVuZGVyTW9udGhzPWZ1bmN0aW9uKCl7dmFyIGUsdDtpZighcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkmJiFzLnByb3BzLnNob3dZZWFyUGlja2VyKXtmb3IodmFyIHI9W10sYT1udWxsIT09KGU9cy5wcm9wcy5tb250aHNTaG93bikmJnZvaWQgMCE9PWU/ZTpuLmRlZmF1bHRQcm9wcy5tb250aHNTaG93bixvPXMucHJvcHMuc2hvd1ByZXZpb3VzTW9udGhzP2EtMTowLGw9cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcj9kLmFkZFllYXJzKHMuc3RhdGUuZGF0ZSxvKTphZS5zdWJNb250aHMocy5zdGF0ZS5kYXRlLG8pLGM9bnVsbCE9PSh0PXMucHJvcHMubW9udGhTZWxlY3RlZEluKSYmdm9pZCAwIT09dD90Om8scD0wO3A8YTsrK3Ape3ZhciB1PXAtYytvLGY9cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcj9kLmFkZFllYXJzKGwsdSk6aS5hZGRNb250aHMobCx1KSxoPVwibW9udGgtXCIuY29uY2F0KHApLG09cDxhLTEsdj1wPjA7ci5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6aCxyZWY6ZnVuY3Rpb24oZSl7cy5tb250aENvbnRhaW5lcj1udWxsIT1lP2U6dm9pZCAwfSxjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1jb250YWluZXJcIn0scy5yZW5kZXJIZWFkZXIoe21vbnRoRGF0ZTpmLGk6cH0pLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh4dCxnZSh7fSxuLmRlZmF1bHRQcm9wcyxzLnByb3BzLHthcmlhTGFiZWxQcmVmaXg6cy5wcm9wcy5tb250aEFyaWFMYWJlbFByZWZpeCxkYXk6ZixvbkRheUNsaWNrOnMuaGFuZGxlRGF5Q2xpY2ssaGFuZGxlT25LZXlEb3duOnMucHJvcHMuaGFuZGxlT25EYXlLZXlEb3duLGhhbmRsZU9uTW9udGhLZXlEb3duOnMucHJvcHMuaGFuZGxlT25LZXlEb3duLG9uRGF5TW91c2VFbnRlcjpzLmhhbmRsZURheU1vdXNlRW50ZXIsb25Nb3VzZUxlYXZlOnMuaGFuZGxlTW9udGhNb3VzZUxlYXZlLG9yZGVySW5EaXNwbGF5OnAsc2VsZWN0aW5nRGF0ZTpzLnN0YXRlLnNlbGVjdGluZ0RhdGUsbW9udGhTaG93c0R1cGxpY2F0ZURheXNFbmQ6bSxtb250aFNob3dzRHVwbGljYXRlRGF5c1N0YXJ0OnZ9KSkpKX1yZXR1cm4gcn19LHMucmVuZGVyWWVhcnM9ZnVuY3Rpb24oKXtpZighcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpcmV0dXJuIHMucHJvcHMuc2hvd1llYXJQaWNrZXI/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItLWNvbnRhaW5lclwifSxzLnJlbmRlckhlYWRlcih7bW9udGhEYXRlOnMuc3RhdGUuZGF0ZX0pLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChIdCxnZSh7fSxuLmRlZmF1bHRQcm9wcyxzLnByb3BzLHtzZWxlY3RpbmdEYXRlOnMuc3RhdGUuc2VsZWN0aW5nRGF0ZSxkYXRlOnMuc3RhdGUuZGF0ZSxvbkRheUNsaWNrOnMuaGFuZGxlRGF5Q2xpY2ssY2xlYXJTZWxlY3RpbmdEYXRlOnMuY2xlYXJTZWxlY3RpbmdEYXRlLG9uWWVhck1vdXNlRW50ZXI6cy5oYW5kbGVZZWFyTW91c2VFbnRlcixvblllYXJNb3VzZUxlYXZlOnMuaGFuZGxlWWVhck1vdXNlTGVhdmV9KSkpOnZvaWQgMH0scy5yZW5kZXJUaW1lU2VjdGlvbj1mdW5jdGlvbigpe2lmKHMucHJvcHMuc2hvd1RpbWVTZWxlY3QmJihzLnN0YXRlLm1vbnRoQ29udGFpbmVyfHxzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSkpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChGdCxnZSh7fSxuLmRlZmF1bHRQcm9wcyxzLnByb3BzLHtvbkNoYW5nZTpzLnByb3BzLm9uVGltZUNoYW5nZSxmb3JtYXQ6cy5wcm9wcy50aW1lRm9ybWF0LGludGVydmFsczpzLnByb3BzLnRpbWVJbnRlcnZhbHMsbW9udGhSZWY6cy5zdGF0ZS5tb250aENvbnRhaW5lcn0pKX0scy5yZW5kZXJJbnB1dFRpbWVTZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9cy5wcm9wcy5zZWxlY3RlZD9uZXcgRGF0ZShzLnByb3BzLnNlbGVjdGVkKTp2b2lkIDAsdD1lJiZDZShlKSYmQm9vbGVhbihzLnByb3BzLnNlbGVjdGVkKT9cIlwiLmNvbmNhdChodChlLmdldEhvdXJzKCkpLFwiOlwiKS5jb25jYXQoaHQoZS5nZXRNaW51dGVzKCkpKTpcIlwiO2lmKHMucHJvcHMuc2hvd1RpbWVJbnB1dClyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHd0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse2RhdGU6ZSx0aW1lU3RyaW5nOnQsb25DaGFuZ2U6cy5wcm9wcy5vblRpbWVDaGFuZ2V9KSl9LHMucmVuZGVyQXJpYUxpdmVSZWdpb249ZnVuY3Rpb24oKXt2YXIgZSx0LHI9bXQocy5zdGF0ZS5kYXRlLG51bGwhPT0oZT1zLnByb3BzLnllYXJJdGVtTnVtYmVyKSYmdm9pZCAwIT09ZT9lOm4uZGVmYXVsdFByb3BzLnllYXJJdGVtTnVtYmVyKSxhPXIuc3RhcnRQZXJpb2Qsbz1yLmVuZFBlcmlvZDtyZXR1cm4gdD1zLnByb3BzLnNob3dZZWFyUGlja2VyP1wiXCIuY29uY2F0KGEsXCIgLSBcIikuY29uY2F0KG8pOnMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXI/eC5nZXRZZWFyKHMuc3RhdGUuZGF0ZSk6XCJcIi5jb25jYXQoQmUoXy5nZXRNb250aChzLnN0YXRlLmRhdGUpLHMucHJvcHMubG9jYWxlKSxcIiBcIikuY29uY2F0KHguZ2V0WWVhcihzLnN0YXRlLmRhdGUpKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse3JvbGU6XCJhbGVydFwiLFwiYXJpYS1saXZlXCI6XCJwb2xpdGVcIixjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19hcmlhLWxpdmVcIn0scy5zdGF0ZS5pc1JlbmRlckFyaWFMaXZlTWVzc2FnZSYmdCl9LHMucmVuZGVyQ2hpbGRyZW49ZnVuY3Rpb24oKXtpZihzLnByb3BzLmNoaWxkcmVuKXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fY2hpbGRyZW4tY29udGFpbmVyXCJ9LHMucHJvcHMuY2hpbGRyZW4pfSxzLmNvbnRhaW5lclJlZj1yLmNyZWF0ZVJlZigpLHMuc3RhdGU9e2RhdGU6cy5nZXREYXRlSW5WaWV3KCksc2VsZWN0aW5nRGF0ZTp2b2lkIDAsbW9udGhDb250YWluZXI6dm9pZCAwLGlzUmVuZGVyQXJpYUxpdmVNZXNzYWdlOiExfSxzfXJldHVybiB2ZShuLGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwiZGVmYXVsdFByb3BzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnttb250aHNTaG93bjoxLGZvcmNlU2hvd01vbnRoTmF2aWdhdGlvbjohMSx0aW1lQ2FwdGlvbjpcIlRpbWVcIixwcmV2aW91c1llYXJCdXR0b25MYWJlbDpcIlByZXZpb3VzIFllYXJcIixuZXh0WWVhckJ1dHRvbkxhYmVsOlwiTmV4dCBZZWFyXCIscHJldmlvdXNNb250aEJ1dHRvbkxhYmVsOlwiUHJldmlvdXMgTW9udGhcIixuZXh0TW9udGhCdXR0b25MYWJlbDpcIk5leHQgTW9udGhcIix5ZWFySXRlbU51bWJlcjpTZX19LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMucHJvcHMuc2hvd1RpbWVTZWxlY3QmJih0aGlzLmFzc2lnbk1vbnRoQ29udGFpbmVyPXZvaWQgZS5zZXRTdGF0ZSh7bW9udGhDb250YWluZXI6ZS5tb250aENvbnRhaW5lcn0pKX0sbi5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoIXRoaXMucHJvcHMucHJlU2VsZWN0aW9ufHxIZSh0aGlzLnByb3BzLnByZVNlbGVjdGlvbixlLnByZVNlbGVjdGlvbikmJnRoaXMucHJvcHMubW9udGhTZWxlY3RlZEluPT09ZS5tb250aFNlbGVjdGVkSW4pdGhpcy5wcm9wcy5vcGVuVG9EYXRlJiYhSGUodGhpcy5wcm9wcy5vcGVuVG9EYXRlLGUub3BlblRvRGF0ZSkmJnRoaXMuc2V0U3RhdGUoe2RhdGU6dGhpcy5wcm9wcy5vcGVuVG9EYXRlfSk7ZWxzZXt2YXIgcj0hQWUodGhpcy5zdGF0ZS5kYXRlLHRoaXMucHJvcHMucHJlU2VsZWN0aW9uKTt0aGlzLnNldFN0YXRlKHtkYXRlOnRoaXMucHJvcHMucHJlU2VsZWN0aW9ufSwoZnVuY3Rpb24oKXtyZXR1cm4gciYmdC5oYW5kbGVDdXN0b21Nb250aENoYW5nZSh0LnN0YXRlLmRhdGUpfSkpfX0sbi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcy5jb250YWluZXJ8fGtlO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7c3R5bGU6e2Rpc3BsYXk6XCJjb250ZW50c1wifSxyZWY6dGhpcy5jb250YWluZXJSZWZ9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChlLHtjbGFzc05hbWU6dC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlclwiLHRoaXMucHJvcHMuY2xhc3NOYW1lLHtcInJlYWN0LWRhdGVwaWNrZXItLXRpbWUtb25seVwiOnRoaXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5fSksc2hvd1RpbWU6dGhpcy5wcm9wcy5zaG93VGltZVNlbGVjdHx8dGhpcy5wcm9wcy5zaG93VGltZUlucHV0LHNob3dUaW1lU2VsZWN0T25seTp0aGlzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seX0sdGhpcy5yZW5kZXJBcmlhTGl2ZVJlZ2lvbigpLHRoaXMucmVuZGVyUHJldmlvdXNCdXR0b24oKSx0aGlzLnJlbmRlck5leHRCdXR0b24oKSx0aGlzLnJlbmRlck1vbnRocygpLHRoaXMucmVuZGVyWWVhcnMoKSx0aGlzLnJlbmRlclRvZGF5QnV0dG9uKCksdGhpcy5yZW5kZXJUaW1lU2VjdGlvbigpLHRoaXMucmVuZGVySW5wdXRUaW1lU2VjdGlvbigpLHRoaXMucmVuZGVyQ2hpbGRyZW4oKSkpfSxufShyLkNvbXBvbmVudCksanQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pY29uLHI9ZS5jbGFzc05hbWUsbj12b2lkIDA9PT1yP1wiXCI6cixhPWUub25DbGljayxvPVwicmVhY3QtZGF0ZXBpY2tlcl9fY2FsZW5kYXItaWNvblwiO3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0P3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImlcIix7Y2xhc3NOYW1lOlwiXCIuY29uY2F0KG8sXCIgXCIpLmNvbmNhdCh0LFwiIFwiKS5jb25jYXQobiksXCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwiLG9uQ2xpY2s6YX0pOnVlLmRlZmF1bHQuaXNWYWxpZEVsZW1lbnQodCk/dWUuZGVmYXVsdC5jbG9uZUVsZW1lbnQodCx7Y2xhc3NOYW1lOlwiXCIuY29uY2F0KHQucHJvcHMuY2xhc3NOYW1lfHxcIlwiLFwiIFwiKS5jb25jYXQobyxcIiBcIikuY29uY2F0KG4pLG9uQ2xpY2s6ZnVuY3Rpb24oZSl7XCJmdW5jdGlvblwiPT10eXBlb2YgdC5wcm9wcy5vbkNsaWNrJiZ0LnByb3BzLm9uQ2xpY2soZSksXCJmdW5jdGlvblwiPT10eXBlb2YgYSYmYShlKX19KTp1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIix7Y2xhc3NOYW1lOlwiXCIuY29uY2F0KG8sXCIgXCIpLmNvbmNhdChuKSx4bWxuczpcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsdmlld0JveDpcIjAgMCA0NDggNTEyXCIsb25DbGljazphfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIse2Q6XCJNOTYgMzJWNjRINDhDMjEuNSA2NCAwIDg1LjUgMCAxMTJ2NDhINDQ4VjExMmMwLTI2LjUtMjEuNS00OC00OC00OEgzNTJWMzJjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJWNjRIMTYwVjMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyUzk2IDE0LjMgOTYgMzJ6TTQ0OCAxOTJIMFY0NjRjMCAyNi41IDIxLjUgNDggNDggNDhINDAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4VjE5MnpcIn0pKX0sVXQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgcj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gci5wb3J0YWxSb290PW51bGwsci5lbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHJ9cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLnBvcnRhbFJvb3Q9KHRoaXMucHJvcHMucG9ydGFsSG9zdHx8ZG9jdW1lbnQpLmdldEVsZW1lbnRCeUlkKHRoaXMucHJvcHMucG9ydGFsSWQpLHRoaXMucG9ydGFsUm9vdHx8KHRoaXMucG9ydGFsUm9vdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMucG9ydGFsUm9vdC5zZXRBdHRyaWJ1dGUoXCJpZFwiLHRoaXMucHJvcHMucG9ydGFsSWQpLCh0aGlzLnByb3BzLnBvcnRhbEhvc3R8fGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKHRoaXMucG9ydGFsUm9vdCkpLHRoaXMucG9ydGFsUm9vdC5hcHBlbmRDaGlsZCh0aGlzLmVsKX0sdC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLnBvcnRhbFJvb3QmJnRoaXMucG9ydGFsUm9vdC5yZW1vdmVDaGlsZCh0aGlzLmVsKX0sdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGhlLmRlZmF1bHQuY3JlYXRlUG9ydGFsKHRoaXMucHJvcHMuY2hpbGRyZW4sdGhpcy5lbCl9LHR9KHIuQ29tcG9uZW50KSwkdD1mdW5jdGlvbihlKXtyZXR1cm4oZSBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50fHwhZS5kaXNhYmxlZCkmJi0xIT09ZS50YWJJbmRleH0senQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5nZXRUYWJDaGlsZHJlbj1mdW5jdGlvbigpe3ZhciBlO3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChudWxsPT09KGU9bi50YWJMb29wUmVmLmN1cnJlbnQpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbdGFiaW5kZXhdLCBhLCBidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhXCIpLDEsLTEpLmZpbHRlcigkdCl9LG4uaGFuZGxlRm9jdXNTdGFydD1mdW5jdGlvbigpe3ZhciBlPW4uZ2V0VGFiQ2hpbGRyZW4oKTtlJiZlLmxlbmd0aD4xJiZlW2UubGVuZ3RoLTFdLmZvY3VzKCl9LG4uaGFuZGxlRm9jdXNFbmQ9ZnVuY3Rpb24oKXt2YXIgZT1uLmdldFRhYkNoaWxkcmVuKCk7ZSYmZS5sZW5ndGg+MSYmZVswXS5mb2N1cygpfSxuLnRhYkxvb3BSZWY9ci5jcmVhdGVSZWYoKSxufXJldHVybiB2ZSh0LGUpLHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlO3JldHVybihudWxsIT09KGU9dGhpcy5wcm9wcy5lbmFibGVUYWJMb29wKSYmdm9pZCAwIT09ZT9lOnQuZGVmYXVsdFByb3BzLmVuYWJsZVRhYkxvb3ApP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190YWItbG9vcFwiLHJlZjp0aGlzLnRhYkxvb3BSZWZ9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190YWItbG9vcF9fc3RhcnRcIix0YWJJbmRleDowLG9uRm9jdXM6dGhpcy5oYW5kbGVGb2N1c1N0YXJ0fSksdGhpcy5wcm9wcy5jaGlsZHJlbix1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGFiLWxvb3BfX2VuZFwiLHRhYkluZGV4OjAsb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzRW5kfSkpOnRoaXMucHJvcHMuY2hpbGRyZW59LHQuZGVmYXVsdFByb3BzPXtlbmFibGVUYWJMb29wOiEwfSx0fShyLkNvbXBvbmVudCk7dmFyIFh0LEd0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXtyZXR1cm4gbnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiB2ZShuLGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwiZGVmYXVsdFByb3BzXCIse2dldDpmdW5jdGlvbigpe3JldHVybntoaWRlUG9wcGVyOiEwfX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLGE9ZS5jbGFzc05hbWUsbz1lLndyYXBwZXJDbGFzc05hbWUscz1lLmhpZGVQb3BwZXIsaT12b2lkIDA9PT1zP24uZGVmYXVsdFByb3BzLmhpZGVQb3BwZXI6cyxsPWUucG9wcGVyQ29tcG9uZW50LGM9ZS50YXJnZXRDb21wb25lbnQscD1lLmVuYWJsZVRhYkxvb3AsZD1lLnBvcHBlck9uS2V5RG93bix1PWUucG9ydGFsSWQsZj1lLnBvcnRhbEhvc3QsaD1lLnBvcHBlclByb3BzLG09ZS5zaG93QXJyb3csdj12b2lkIDA7aWYoIWkpe3ZhciBnPXQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXItcG9wcGVyXCIsYSk7dj11ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoenQse2VuYWJsZVRhYkxvb3A6cH0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse3JlZjpoLnJlZnMuc2V0RmxvYXRpbmcsc3R5bGU6aC5mbG9hdGluZ1N0eWxlcyxjbGFzc05hbWU6ZyxcImRhdGEtcGxhY2VtZW50XCI6aC5wbGFjZW1lbnQsb25LZXlEb3duOmR9LGwsbSYmdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGNlLkZsb2F0aW5nQXJyb3cse3JlZjpoLmFycm93UmVmLGNvbnRleHQ6aC5jb250ZXh0LGZpbGw6XCJjdXJyZW50Q29sb3JcIixzdHJva2VXaWR0aDoxLGhlaWdodDo4LHdpZHRoOjE2LHN0eWxlOnt0cmFuc2Zvcm06XCJ0cmFuc2xhdGVZKC0xcHgpXCJ9LGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RyaWFuZ2xlXCJ9KSkpfXRoaXMucHJvcHMucG9wcGVyQ29udGFpbmVyJiYodj1yLmNyZWF0ZUVsZW1lbnQodGhpcy5wcm9wcy5wb3BwZXJDb250YWluZXIse30sdikpLHUmJiFpJiYodj11ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVXQse3BvcnRhbElkOnUscG9ydGFsSG9zdDpmfSx2KSk7dmFyIEQ9dC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlci13cmFwcGVyXCIsbyk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1ZS5kZWZhdWx0LkZyYWdtZW50LG51bGwsdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse3JlZjpoLnJlZnMuc2V0UmVmZXJlbmNlLGNsYXNzTmFtZTpEfSxjKSx2KX0sbn0oci5Db21wb25lbnQpLEp0PShYdD1HdCxmdW5jdGlvbihlKXt2YXIgdCxuPVwiYm9vbGVhblwiIT10eXBlb2YgZS5oaWRlUG9wcGVyfHxlLmhpZGVQb3BwZXIsYT1yLnVzZVJlZihudWxsKSxvPWNlLnVzZUZsb2F0aW5nKGdlKHtvcGVuOiFuLHdoaWxlRWxlbWVudHNNb3VudGVkOmNlLmF1dG9VcGRhdGUscGxhY2VtZW50OmUucG9wcGVyUGxhY2VtZW50LG1pZGRsZXdhcmU6RGUoW2NlLmZsaXAoe3BhZGRpbmc6MTV9KSxjZS5vZmZzZXQoMTApLGNlLmFycm93KHtlbGVtZW50OmF9KV0sbnVsbCE9PSh0PWUucG9wcGVyTW9kaWZpZXJzKSYmdm9pZCAwIT09dD90OltdLCEwKX0sZS5wb3BwZXJQcm9wcykpLHM9Z2UoZ2Uoe30sZSkse2hpZGVQb3BwZXI6bixwb3BwZXJQcm9wczpnZShnZSh7fSxvKSx7YXJyb3dSZWY6YX0pfSk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChYdCxnZSh7fSxzKSl9KSxadD1cInJlYWN0LWRhdGVwaWNrZXItaWdub3JlLW9uY2xpY2tvdXRzaWRlXCIsZXI9ZmUuZGVmYXVsdChWdCk7dmFyIHRyPVwiRGF0ZSBpbnB1dCBub3QgdmFsaWQuXCIscnI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihvKXt2YXIgcz1lLmNhbGwodGhpcyxvKXx8dGhpcztyZXR1cm4gcy5jYWxlbmRhcj1udWxsLHMuaW5wdXQ9bnVsbCxzLmdldFByZVNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiBzLnByb3BzLm9wZW5Ub0RhdGU/cy5wcm9wcy5vcGVuVG9EYXRlOnMucHJvcHMuc2VsZWN0c0VuZCYmcy5wcm9wcy5zdGFydERhdGU/cy5wcm9wcy5zdGFydERhdGU6cy5wcm9wcy5zZWxlY3RzU3RhcnQmJnMucHJvcHMuZW5kRGF0ZT9zLnByb3BzLmVuZERhdGU6TWUoKX0scy5tb2RpZnlIb2xpZGF5cz1mdW5jdGlvbigpe3ZhciBlO3JldHVybiBudWxsPT09KGU9cy5wcm9wcy5ob2xpZGF5cyl8fHZvaWQgMD09PWU/dm9pZCAwOmUucmVkdWNlKChmdW5jdGlvbihlLHQpe3ZhciByPW5ldyBEYXRlKHQuZGF0ZSk7cmV0dXJuIENlKHIpP0RlKERlKFtdLGUsITApLFtnZShnZSh7fSx0KSx7ZGF0ZTpyfSldLCExKTplfSksW10pfSxzLmNhbGNJbml0aWFsU3RhdGU9ZnVuY3Rpb24oKXt2YXIgZSx0PXMuZ2V0UHJlU2VsZWN0aW9uKCkscj1jdChzLnByb3BzKSxuPXB0KHMucHJvcHMpLGE9ciYmTy5pc0JlZm9yZSh0LFllKHIpKT9yOm4mJk4uaXNBZnRlcih0LFJlKG4pKT9uOnQ7cmV0dXJue29wZW46cy5wcm9wcy5zdGFydE9wZW58fCExLHByZXZlbnRGb2N1czohMSxpbnB1dFZhbHVlOm51bGwscHJlU2VsZWN0aW9uOm51bGwhPT0oZT1zLnByb3BzLnNlbGVjdHNSYW5nZT9zLnByb3BzLnN0YXJ0RGF0ZTpzLnByb3BzLnNlbGVjdGVkKSYmdm9pZCAwIT09ZT9lOmEsaGlnaGxpZ2h0RGF0ZXM6ZHQocy5wcm9wcy5oaWdobGlnaHREYXRlcyksZm9jdXNlZDohMSxzaG91bGRGb2N1c0RheUlubGluZTohMSxpc1JlbmRlckFyaWFMaXZlTWVzc2FnZTohMSx3YXNIaWRkZW46ITF9fSxzLnJlc2V0SGlkZGVuU3RhdHVzPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZShnZShnZSh7fSxzLnN0YXRlKSx7d2FzSGlkZGVuOiExfSkpfSxzLnNldEhpZGRlblN0YXR1cz1mdW5jdGlvbigpe3Muc2V0U3RhdGUoZ2UoZ2Uoe30scy5zdGF0ZSkse3dhc0hpZGRlbjohMH0pKX0scy5zZXRIaWRkZW5TdGF0ZU9uVmlzaWJpbGl0eUhpZGRlbj1mdW5jdGlvbigpe1wiaGlkZGVuXCI9PT1kb2N1bWVudC52aXNpYmlsaXR5U3RhdGUmJnMuc2V0SGlkZGVuU3RhdHVzKCl9LHMuY2xlYXJQcmV2ZW50Rm9jdXNUaW1lb3V0PWZ1bmN0aW9uKCl7cy5wcmV2ZW50Rm9jdXNUaW1lb3V0JiZjbGVhclRpbWVvdXQocy5wcmV2ZW50Rm9jdXNUaW1lb3V0KX0scy5zZXRGb2N1cz1mdW5jdGlvbigpe3MuaW5wdXQmJnMuaW5wdXQuZm9jdXMmJnMuaW5wdXQuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KX0scy5zZXRCbHVyPWZ1bmN0aW9uKCl7cy5pbnB1dCYmcy5pbnB1dC5ibHVyJiZzLmlucHV0LmJsdXIoKSxzLmNhbmNlbEZvY3VzSW5wdXQoKX0scy5zZXRPcGVuPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9ITEpLHMuc2V0U3RhdGUoe29wZW46ZSxwcmVTZWxlY3Rpb246ZSYmcy5zdGF0ZS5vcGVuP3Muc3RhdGUucHJlU2VsZWN0aW9uOnMuY2FsY0luaXRpYWxTdGF0ZSgpLnByZVNlbGVjdGlvbixsYXN0UHJlU2VsZWN0Q2hhbmdlOmFyfSwoZnVuY3Rpb24oKXtlfHxzLnNldFN0YXRlKChmdW5jdGlvbihlKXtyZXR1cm57Zm9jdXNlZDohIXQmJmUuZm9jdXNlZH19KSwoZnVuY3Rpb24oKXshdCYmcy5zZXRCbHVyKCkscy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZTpudWxsfSl9KSl9KSl9LHMuaW5wdXRPaz1mdW5jdGlvbigpe3JldHVybiBJLmlzRGF0ZShzLnN0YXRlLnByZVNlbGVjdGlvbil9LHMuaXNDYWxlbmRhck9wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09cy5wcm9wcy5vcGVuP3Muc3RhdGUub3BlbiYmIXMucHJvcHMuZGlzYWJsZWQmJiFzLnByb3BzLnJlYWRPbmx5OnMucHJvcHMub3Blbn0scy5oYW5kbGVGb2N1cz1mdW5jdGlvbihlKXt2YXIgdCxyLG49cy5zdGF0ZS53YXNIaWRkZW4sYT0hbnx8cy5zdGF0ZS5vcGVuO24mJnMucmVzZXRIaWRkZW5TdGF0dXMoKSwhcy5zdGF0ZS5wcmV2ZW50Rm9jdXMmJmEmJihudWxsPT09KHI9KHQ9cy5wcm9wcykub25Gb2N1cyl8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpLHMucHJvcHMucHJldmVudE9wZW5PbkZvY3VzfHxzLnByb3BzLnJlYWRPbmx5fHxzLnNldE9wZW4oITApKSxzLnNldFN0YXRlKHtmb2N1c2VkOiEwfSl9LHMuc2VuZEZvY3VzQmFja1RvSW5wdXQ9ZnVuY3Rpb24oKXtzLnByZXZlbnRGb2N1c1RpbWVvdXQmJnMuY2xlYXJQcmV2ZW50Rm9jdXNUaW1lb3V0KCkscy5zZXRTdGF0ZSh7cHJldmVudEZvY3VzOiEwfSwoZnVuY3Rpb24oKXtzLnByZXZlbnRGb2N1c1RpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtzLnNldEZvY3VzKCkscy5zZXRTdGF0ZSh7cHJldmVudEZvY3VzOiExfSl9KSl9KSl9LHMuY2FuY2VsRm9jdXNJbnB1dD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChzLmlucHV0Rm9jdXNUaW1lb3V0KSxzLmlucHV0Rm9jdXNUaW1lb3V0PXZvaWQgMH0scy5kZWZlckZvY3VzSW5wdXQ9ZnVuY3Rpb24oKXtzLmNhbmNlbEZvY3VzSW5wdXQoKSxzLmlucHV0Rm9jdXNUaW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIHMuc2V0Rm9jdXMoKX0pLDEpfSxzLmhhbmRsZURyb3Bkb3duRm9jdXM9ZnVuY3Rpb24oKXtzLmNhbmNlbEZvY3VzSW5wdXQoKX0scy5oYW5kbGVCbHVyPWZ1bmN0aW9uKGUpe3ZhciB0LHI7KCFzLnN0YXRlLm9wZW58fHMucHJvcHMud2l0aFBvcnRhbHx8cy5wcm9wcy5zaG93VGltZUlucHV0KSYmKG51bGw9PT0ocj0odD1zLnByb3BzKS5vbkJsdXIpfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKSkscy5zZXRTdGF0ZSh7Zm9jdXNlZDohMX0pfSxzLmhhbmRsZUNhbGVuZGFyQ2xpY2tPdXRzaWRlPWZ1bmN0aW9uKGUpe3ZhciB0LHI7cy5wcm9wcy5pbmxpbmV8fHMuc2V0T3BlbighMSksbnVsbD09PShyPSh0PXMucHJvcHMpLm9uQ2xpY2tPdXRzaWRlKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSkscy5wcm9wcy53aXRoUG9ydGFsJiZlLnByZXZlbnREZWZhdWx0KCl9LHMuaGFuZGxlQ2hhbmdlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWVbdF09YXJndW1lbnRzW3RdO3ZhciByPWVbMF07aWYoIXMucHJvcHMub25DaGFuZ2VSYXd8fChzLnByb3BzLm9uQ2hhbmdlUmF3LmFwcGx5KHMsZSksciYmXCJmdW5jdGlvblwiPT10eXBlb2Ygci5pc0RlZmF1bHRQcmV2ZW50ZWQmJiFyLmlzRGVmYXVsdFByZXZlbnRlZCgpKSl7cy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZToobnVsbD09cj92b2lkIDA6ci50YXJnZXQpaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50P3IudGFyZ2V0LnZhbHVlOm51bGwsbGFzdFByZVNlbGVjdENoYW5nZTpucn0pO3ZhciBhPXMucHJvcHMsbz1hLmRhdGVGb3JtYXQsaT12b2lkIDA9PT1vP24uZGVmYXVsdFByb3BzLmRhdGVGb3JtYXQ6byxsPWEuc3RyaWN0UGFyc2luZyxjPXZvaWQgMD09PWw/bi5kZWZhdWx0UHJvcHMuc3RyaWN0UGFyc2luZzpsLHA9ZnVuY3Rpb24oZSx0LHIsbixhKXt2YXIgbyxzPW51bGwsaT1LZShyKXx8S2UocWUoKSksbD0hMDtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBvPUsucGFyc2UoZSx0LG5ldyBEYXRlLHtsb2NhbGU6aSx1c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnM6ITAsdXNlQWRkaXRpb25hbERheU9mWWVhclRva2VuczohMH0pO24mJihsPUNlKG8sYSkmJmU9PT1fZShvLHQscikpLENlKG8sYSkmJmwmJihzPW8pfSkpLHM7aWYocz1LLnBhcnNlKGUsdCxuZXcgRGF0ZSx7bG9jYWxlOmksdXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zOiEwLHVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnM6ITB9KSxuKWw9Q2UocykmJmU9PT1fZShzLHQscik7ZWxzZSBpZighQ2Uocykpe3ZhciBjPShudWxsIT09KG89dC5tYXRjaChiZSkpJiZ2b2lkIDAhPT1vP286W10pLm1hcCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtpZihcInBcIj09PXR8fFwiUFwiPT09dCl7dmFyIHI9ay5sb25nRm9ybWF0dGVyc1t0XTtyZXR1cm4gaT9yKGUsaS5mb3JtYXRMb25nKTp0fXJldHVybiBlfSkpLmpvaW4oXCJcIik7ZS5sZW5ndGg+MCYmKHM9Sy5wYXJzZShlLGMuc2xpY2UoMCxlLmxlbmd0aCksbmV3IERhdGUse3VzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VuczohMCx1c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zOiEwfSkpLENlKHMpfHwocz1uZXcgRGF0ZShlKSl9cmV0dXJuIENlKHMpJiZsP3M6bnVsbH0oKG51bGw9PXI/dm9pZCAwOnIudGFyZ2V0KWluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudD9yLnRhcmdldC52YWx1ZTpcIlwiLGkscy5wcm9wcy5sb2NhbGUsYyxzLnByb3BzLm1pbkRhdGUpO3MucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5JiZzLnByb3BzLnNlbGVjdGVkJiZwJiYhSGUocCxzLnByb3BzLnNlbGVjdGVkKSYmKHA9Vi5zZXQocy5wcm9wcy5zZWxlY3RlZCx7aG91cnM6Yi5nZXRIb3VycyhwKSxtaW51dGVzOkMuZ2V0TWludXRlcyhwKSxzZWNvbmRzOlAuZ2V0U2Vjb25kcyhwKX0pKSwhcCYmKG51bGw9PXI/dm9pZCAwOnIudGFyZ2V0KWluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCYmKG51bGw9PXI/dm9pZCAwOnIudGFyZ2V0LnZhbHVlKXx8cy5zZXRTZWxlY3RlZChwLHIsITApfX0scy5oYW5kbGVTZWxlY3Q9ZnVuY3Rpb24oZSx0LHIpe2lmKHMucHJvcHMuc2hvdWxkQ2xvc2VPblNlbGVjdCYmIXMucHJvcHMuc2hvd1RpbWVTZWxlY3QmJnMuc2VuZEZvY3VzQmFja1RvSW5wdXQoKSxzLnByb3BzLm9uQ2hhbmdlUmF3JiZzLnByb3BzLm9uQ2hhbmdlUmF3KHQpLHMuc2V0U2VsZWN0ZWQoZSx0LCExLHIpLHMucHJvcHMuc2hvd0RhdGVTZWxlY3QmJnMuc2V0U3RhdGUoe2lzUmVuZGVyQXJpYUxpdmVNZXNzYWdlOiEwfSksIXMucHJvcHMuc2hvdWxkQ2xvc2VPblNlbGVjdHx8cy5wcm9wcy5zaG93VGltZVNlbGVjdClzLnNldFByZVNlbGVjdGlvbihlKTtlbHNlIGlmKCFzLnByb3BzLmlubGluZSl7cy5wcm9wcy5zZWxlY3RzUmFuZ2V8fHMuc2V0T3BlbighMSk7dmFyIG49cy5wcm9wcyxhPW4uc3RhcnREYXRlLG89bi5lbmREYXRlOyFhfHxvfHwhcy5wcm9wcy5zd2FwUmFuZ2UmJkR0KGUsYSl8fHMuc2V0T3BlbighMSl9fSxzLnNldFNlbGVjdGVkPWZ1bmN0aW9uKGUsdCxyLGEpe3ZhciBvLGk9ZTtpZihzLnByb3BzLnNob3dZZWFyUGlja2VyKXtpZihudWxsIT09aSYmWmUoeC5nZXRZZWFyKGkpLHMucHJvcHMpKXJldHVybn1lbHNlIGlmKHMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcil7aWYobnVsbCE9PWkmJiRlKGkscy5wcm9wcykpcmV0dXJufWVsc2UgaWYobnVsbCE9PWkmJmplKGkscy5wcm9wcykpcmV0dXJuO3ZhciBsPXMucHJvcHMsYz1sLm9uQ2hhbmdlLHA9bC5zZWxlY3RzUmFuZ2UsZD1sLnN0YXJ0RGF0ZSx1PWwuZW5kRGF0ZSxmPWwuc2VsZWN0c011bHRpcGxlLGg9bC5zZWxlY3RlZERhdGVzLG09bC5taW5UaW1lLHY9bC5zd2FwUmFuZ2U7aWYoIVdlKHMucHJvcHMuc2VsZWN0ZWQsaSl8fHMucHJvcHMuYWxsb3dTYW1lRGF5fHxwfHxmKWlmKG51bGwhPT1pJiYoIXMucHJvcHMuc2VsZWN0ZWR8fHImJihzLnByb3BzLnNob3dUaW1lU2VsZWN0fHxzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seXx8cy5wcm9wcy5zaG93VGltZUlucHV0KXx8KGk9UGUoaSx7aG91cjpiLmdldEhvdXJzKHMucHJvcHMuc2VsZWN0ZWQpLG1pbnV0ZTpDLmdldE1pbnV0ZXMocy5wcm9wcy5zZWxlY3RlZCksc2Vjb25kOlAuZ2V0U2Vjb25kcyhzLnByb3BzLnNlbGVjdGVkKX0pKSxyfHwhcy5wcm9wcy5zaG93VGltZVNlbGVjdCYmIXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5fHxtJiYoaT1QZShpLHtob3VyOm0uZ2V0SG91cnMoKSxtaW51dGU6bS5nZXRNaW51dGVzKCksc2Vjb25kOm0uZ2V0U2Vjb25kcygpfSkpLHMucHJvcHMuaW5saW5lfHxzLnNldFN0YXRlKHtwcmVTZWxlY3Rpb246aX0pLHMucHJvcHMuZm9jdXNTZWxlY3RlZE1vbnRofHxzLnNldFN0YXRlKHttb250aFNlbGVjdGVkSW46YX0pKSxwKXt2YXIgZz1kJiYhdSxEPWQmJnU7IWQmJiF1P2M/YyhbaSxudWxsXSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZTpnJiYobnVsbD09PWk/Yz9jKFtudWxsLG51bGxdLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlOkR0KGksZCk/dj9jP2MoW2ksZF0sdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2U6Yz9jKFtpLG51bGxdLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlOmM/YyhbZCxpXSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZSksRCYmKGM/YyhbaSxudWxsXSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZSl9ZWxzZSBpZihmKXtpZihudWxsIT09aSlpZihudWxsPT1oP3ZvaWQgMDpoLmxlbmd0aClpZihoLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBIZShlLGkpfSkpKXt2YXIgeT1oLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIUhlKGUsaSl9KSk7Yz9jKHksdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2V9ZWxzZSBjP2MoRGUoRGUoW10saCwhMCksW2ldLCExKSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZTtlbHNlIGM/YyhbaV0sdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2V9ZWxzZSBjP2MoaSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZTtyfHwoKG51bGwhPT0obz1zLnByb3BzLm9uU2VsZWN0KSYmdm9pZCAwIT09bz9vOm4uZGVmYXVsdFByb3BzLm9uU2VsZWN0KShpLHQpLHMuc2V0U3RhdGUoe2lucHV0VmFsdWU6bnVsbH0pKX0scy5zZXRQcmVTZWxlY3Rpb249ZnVuY3Rpb24oZSl7dmFyIHQ9SS5pc0RhdGUocy5wcm9wcy5taW5EYXRlKSxyPUkuaXNEYXRlKHMucHJvcHMubWF4RGF0ZSksbj0hMDtpZihlKXt2YXIgYT1ZZShlKTtpZih0JiZyKW49UWUoZSxzLnByb3BzLm1pbkRhdGUscy5wcm9wcy5tYXhEYXRlKTtlbHNlIGlmKHQpe3ZhciBvPVllKHMucHJvcHMubWluRGF0ZSk7bj1OLmlzQWZ0ZXIoZSxvKXx8V2UoYSxvKX1lbHNlIGlmKHIpe3ZhciBpPVJlKHMucHJvcHMubWF4RGF0ZSk7bj1PLmlzQmVmb3JlKGUsaSl8fFdlKGEsaSl9fW4mJnMuc2V0U3RhdGUoe3ByZVNlbGVjdGlvbjplfSl9LHMudG9nZ2xlQ2FsZW5kYXI9ZnVuY3Rpb24oKXtzLnNldE9wZW4oIXMuc3RhdGUub3Blbil9LHMuaGFuZGxlVGltZUNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdDtpZighcy5wcm9wcy5zZWxlY3RzUmFuZ2UmJiFzLnByb3BzLnNlbGVjdHNNdWx0aXBsZSl7dmFyIHI9cy5wcm9wcy5zZWxlY3RlZD9zLnByb3BzLnNlbGVjdGVkOnMuZ2V0UHJlU2VsZWN0aW9uKCksYT1zLnByb3BzLnNlbGVjdGVkP2U6UGUocix7aG91cjpiLmdldEhvdXJzKGUpLG1pbnV0ZTpDLmdldE1pbnV0ZXMoZSl9KTtzLnNldFN0YXRlKHtwcmVTZWxlY3Rpb246YX0pLChudWxsIT09KHQ9cy5wcm9wcy5vbkNoYW5nZSkmJnZvaWQgMCE9PXQ/dDpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZSkoYSkscy5wcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0JiYhcy5wcm9wcy5zaG93VGltZUlucHV0JiYocy5zZW5kRm9jdXNCYWNrVG9JbnB1dCgpLHMuc2V0T3BlbighMSkpLHMucHJvcHMuc2hvd1RpbWVJbnB1dCYmcy5zZXRPcGVuKCEwKSwocy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHl8fHMucHJvcHMuc2hvd1RpbWVTZWxlY3QpJiZzLnNldFN0YXRlKHtpc1JlbmRlckFyaWFMaXZlTWVzc2FnZTohMH0pLHMuc2V0U3RhdGUoe2lucHV0VmFsdWU6bnVsbH0pfX0scy5vbklucHV0Q2xpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0O3MucHJvcHMuZGlzYWJsZWR8fHMucHJvcHMucmVhZE9ubHl8fHMuc2V0T3BlbighMCksbnVsbD09PSh0PShlPXMucHJvcHMpLm9uSW5wdXRDbGljayl8fHZvaWQgMD09PXR8fHQuY2FsbChlKX0scy5vbklucHV0S2V5RG93bj1mdW5jdGlvbihlKXt2YXIgdCxyLG4sYSxvO251bGw9PT0ocj0odD1zLnByb3BzKS5vbktleURvd24pfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKTt2YXIgaT1lLmtleTtpZihzLnN0YXRlLm9wZW58fHMucHJvcHMuaW5saW5lfHxzLnByb3BzLnByZXZlbnRPcGVuT25Gb2N1cyl7aWYocy5zdGF0ZS5vcGVuKXtpZihpPT09eWUuQXJyb3dEb3dufHxpPT09eWUuQXJyb3dVcCl7ZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBsPXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5P1wiLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtW3RhYmluZGV4PScwJ11cIjpzLnByb3BzLnNob3dXZWVrUGlja2VyJiZzLnByb3BzLnNob3dXZWVrTnVtYmVycz8nLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyW3RhYmluZGV4PVwiMFwiXSc6cy5wcm9wcy5zaG93RnVsbE1vbnRoWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyPycucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dFt0YWJpbmRleD1cIjBcIl0nOicucmVhY3QtZGF0ZXBpY2tlcl9fZGF5W3RhYmluZGV4PVwiMFwiXScsYz0obnVsbD09PShuPXMuY2FsZW5kYXIpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmNvbXBvbmVudE5vZGUpaW5zdGFuY2VvZiBFbGVtZW50JiZzLmNhbGVuZGFyLmNvbXBvbmVudE5vZGUucXVlcnlTZWxlY3RvcihsKTtyZXR1cm4gdm9pZChjIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmMuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSl9dmFyIHA9TWUocy5zdGF0ZS5wcmVTZWxlY3Rpb24pO2k9PT15ZS5FbnRlcj8oZS5wcmV2ZW50RGVmYXVsdCgpLHMuaW5wdXRPaygpJiZzLnN0YXRlLmxhc3RQcmVTZWxlY3RDaGFuZ2U9PT1hcj8ocy5oYW5kbGVTZWxlY3QocCxlKSwhcy5wcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0JiZzLnNldFByZVNlbGVjdGlvbihwKSk6cy5zZXRPcGVuKCExKSk6aT09PXllLkVzY2FwZT8oZS5wcmV2ZW50RGVmYXVsdCgpLHMuc2VuZEZvY3VzQmFja1RvSW5wdXQoKSxzLnNldE9wZW4oITEpKTppPT09eWUuVGFiJiZzLnNldE9wZW4oITEpLHMuaW5wdXRPaygpfHxudWxsPT09KG89KGE9cy5wcm9wcykub25JbnB1dEVycm9yKXx8dm9pZCAwPT09b3x8by5jYWxsKGEse2NvZGU6MSxtc2c6dHJ9KX19ZWxzZSBpIT09eWUuQXJyb3dEb3duJiZpIT09eWUuQXJyb3dVcCYmaSE9PXllLkVudGVyfHxzLm9uSW5wdXRDbGljaygpfSxzLm9uUG9ydGFsS2V5RG93bj1mdW5jdGlvbihlKXtlLmtleT09PXllLkVzY2FwZSYmKGUucHJldmVudERlZmF1bHQoKSxzLnNldFN0YXRlKHtwcmV2ZW50Rm9jdXM6ITB9LChmdW5jdGlvbigpe3Muc2V0T3BlbighMSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzLnNldEZvY3VzKCkscy5zZXRTdGF0ZSh7cHJldmVudEZvY3VzOiExfSl9KSl9KSkpfSxzLm9uRGF5S2V5RG93bj1mdW5jdGlvbihlKXt2YXIgdCxyLG4sbyxsPXMucHJvcHMsYz1sLm1pbkRhdGUsdT1sLm1heERhdGUsZj1sLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uLGg9bC5zaG93V2Vla1BpY2tlcixtPWwuc2hvdWxkQ2xvc2VPblNlbGVjdCx2PWwubG9jYWxlLGc9bC5jYWxlbmRhclN0YXJ0RGF5LHk9bC5hZGp1c3REYXRlT25DaGFuZ2Usaz1sLmlubGluZTtpZihudWxsPT09KHI9KHQ9cy5wcm9wcykub25LZXlEb3duKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSksIWYpe3ZhciB3PWUua2V5LFM9ZS5zaGlmdEtleSxiPU1lKHMuc3RhdGUucHJlU2VsZWN0aW9uKSxNPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dDtzd2l0Y2goZSl7Y2FzZSB5ZS5BcnJvd1JpZ2h0OnI9aD9wLmFkZFdlZWtzKHQsMSk6YS5hZGREYXlzKHQsMSk7YnJlYWs7Y2FzZSB5ZS5BcnJvd0xlZnQ6cj1oP3NlLnN1YldlZWtzKHQsMSk6bmUuc3ViRGF5cyh0LDEpO2JyZWFrO2Nhc2UgeWUuQXJyb3dVcDpyPXNlLnN1YldlZWtzKHQsMSk7YnJlYWs7Y2FzZSB5ZS5BcnJvd0Rvd246cj1wLmFkZFdlZWtzKHQsMSk7YnJlYWs7Y2FzZSB5ZS5QYWdlVXA6cj1TP2llLnN1YlllYXJzKHQsMSk6YWUuc3ViTW9udGhzKHQsMSk7YnJlYWs7Y2FzZSB5ZS5QYWdlRG93bjpyPVM/ZC5hZGRZZWFycyh0LDEpOmkuYWRkTW9udGhzKHQsMSk7YnJlYWs7Y2FzZSB5ZS5Ib21lOnI9eGUodCx2LGcpO2JyZWFrO2Nhc2UgeWUuRW5kOnI9ZnVuY3Rpb24oZSl7cmV0dXJuIEQuZW5kT2ZXZWVrKGUpfSh0KX1yZXR1cm4gcn07aWYodz09PXllLkVudGVyKXJldHVybiBlLnByZXZlbnREZWZhdWx0KCkscy5oYW5kbGVTZWxlY3QoYixlKSx2b2lkKCFtJiZzLnNldFByZVNlbGVjdGlvbihiKSk7aWYodz09PXllLkVzY2FwZSlyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpLHMuc2V0T3BlbighMSksdm9pZChzLmlucHV0T2soKXx8bnVsbD09PShvPShuPXMucHJvcHMpLm9uSW5wdXRFcnJvcil8fHZvaWQgMD09PW98fG8uY2FsbChuLHtjb2RlOjEsbXNnOnRyfSkpO3ZhciBDPW51bGw7c3dpdGNoKHcpe2Nhc2UgeWUuQXJyb3dMZWZ0OmNhc2UgeWUuQXJyb3dSaWdodDpjYXNlIHllLkFycm93VXA6Y2FzZSB5ZS5BcnJvd0Rvd246Y2FzZSB5ZS5QYWdlVXA6Y2FzZSB5ZS5QYWdlRG93bjpjYXNlIHllLkhvbWU6Y2FzZSB5ZS5FbmQ6Qz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj1lLG49ITEsYT0wLG89TShlLHQpOyFuOyl7aWYoYT49NDApe289dDticmVha31jJiZvPGMmJihyPXllLkFycm93UmlnaHQsbz1qZShjLHMucHJvcHMpP00ocixvKTpjKSx1JiZvPnUmJihyPXllLkFycm93TGVmdCxvPWplKHUscy5wcm9wcyk/TShyLG8pOnUpLGplKG8scy5wcm9wcyk/KHIhPT15ZS5QYWdlVXAmJnIhPT15ZS5Ib21lfHwocj15ZS5BcnJvd1JpZ2h0KSxyIT09eWUuUGFnZURvd24mJnIhPT15ZS5FbmR8fChyPXllLkFycm93TGVmdCksbz1NKHIsbykpOm49ITAsYSsrfXJldHVybiBvfSh3LGIpfWlmKEMpe2lmKGUucHJldmVudERlZmF1bHQoKSxzLnNldFN0YXRlKHtsYXN0UHJlU2VsZWN0Q2hhbmdlOmFyfSkseSYmcy5zZXRTZWxlY3RlZChDKSxzLnNldFByZVNlbGVjdGlvbihDKSxrKXt2YXIgRT1fLmdldE1vbnRoKGIpLFA9Xy5nZXRNb250aChDKSxZPXguZ2V0WWVhcihiKSxOPXguZ2V0WWVhcihDKTtFIT09UHx8WSE9PU4/cy5zZXRTdGF0ZSh7c2hvdWxkRm9jdXNEYXlJbmxpbmU6ITB9KTpzLnNldFN0YXRlKHtzaG91bGRGb2N1c0RheUlubGluZTohMX0pfX1lbHNlIHMucHJvcHMub25JbnB1dEVycm9yJiZzLnByb3BzLm9uSW5wdXRFcnJvcih7Y29kZToxLG1zZzp0cn0pfX0scy5vblBvcHBlcktleURvd249ZnVuY3Rpb24oZSl7ZS5rZXk9PT15ZS5Fc2NhcGUmJihlLnByZXZlbnREZWZhdWx0KCkscy5zZW5kRm9jdXNCYWNrVG9JbnB1dCgpKX0scy5vbkNsZWFyQ2xpY2s9ZnVuY3Rpb24oZSl7ZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5wcmV2ZW50RGVmYXVsdCgpLHMuc2VuZEZvY3VzQmFja1RvSW5wdXQoKTt2YXIgdD1zLnByb3BzLHI9dC5zZWxlY3RzUmFuZ2UsYT10Lm9uQ2hhbmdlO3I/YT9hKFtudWxsLG51bGxdLGUpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlKCk6YT9hKG51bGwsZSk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2UoKSxzLnNldFN0YXRlKHtpbnB1dFZhbHVlOm51bGx9KX0scy5jbGVhcj1mdW5jdGlvbigpe3Mub25DbGVhckNsaWNrKCl9LHMub25TY3JvbGw9ZnVuY3Rpb24oZSl7XCJib29sZWFuXCI9PXR5cGVvZiBzLnByb3BzLmNsb3NlT25TY3JvbGwmJnMucHJvcHMuY2xvc2VPblNjcm9sbD9lLnRhcmdldCE9PWRvY3VtZW50JiZlLnRhcmdldCE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmZS50YXJnZXQhPT1kb2N1bWVudC5ib2R5fHxzLnNldE9wZW4oITEpOlwiZnVuY3Rpb25cIj09dHlwZW9mIHMucHJvcHMuY2xvc2VPblNjcm9sbCYmcy5wcm9wcy5jbG9zZU9uU2Nyb2xsKGUpJiZzLnNldE9wZW4oITEpfSxzLnJlbmRlckNhbGVuZGFyPWZ1bmN0aW9uKCl7dmFyIGUsdDtyZXR1cm4gcy5wcm9wcy5pbmxpbmV8fHMuaXNDYWxlbmRhck9wZW4oKT91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZXIsZ2Uoe3JlZjpmdW5jdGlvbihlKXtzLmNhbGVuZGFyPWV9fSxzLnByb3BzLHMuc3RhdGUse3NldE9wZW46cy5zZXRPcGVuLGRhdGVGb3JtYXQ6bnVsbCE9PShlPXMucHJvcHMuZGF0ZUZvcm1hdENhbGVuZGFyKSYmdm9pZCAwIT09ZT9lOm4uZGVmYXVsdFByb3BzLmRhdGVGb3JtYXRDYWxlbmRhcixvblNlbGVjdDpzLmhhbmRsZVNlbGVjdCxvbkNsaWNrT3V0c2lkZTpzLmhhbmRsZUNhbGVuZGFyQ2xpY2tPdXRzaWRlLGhvbGlkYXlzOnV0KHMubW9kaWZ5SG9saWRheXMoKSksb3V0c2lkZUNsaWNrSWdub3JlQ2xhc3M6WnQsb25Ecm9wZG93bkZvY3VzOnMuaGFuZGxlRHJvcGRvd25Gb2N1cyxvblRpbWVDaGFuZ2U6cy5oYW5kbGVUaW1lQ2hhbmdlLGNsYXNzTmFtZTpzLnByb3BzLmNhbGVuZGFyQ2xhc3NOYW1lLGNvbnRhaW5lcjpzLnByb3BzLmNhbGVuZGFyQ29udGFpbmVyLGhhbmRsZU9uS2V5RG93bjpzLnByb3BzLm9uS2V5RG93bixoYW5kbGVPbkRheUtleURvd246cy5vbkRheUtleURvd24sc2V0UHJlU2VsZWN0aW9uOnMuc2V0UHJlU2VsZWN0aW9uLGRyb3Bkb3duTW9kZTpudWxsIT09KHQ9cy5wcm9wcy5kcm9wZG93bk1vZGUpJiZ2b2lkIDAhPT10P3Q6bi5kZWZhdWx0UHJvcHMuZHJvcGRvd25Nb2RlfSkscy5wcm9wcy5jaGlsZHJlbik6bnVsbH0scy5yZW5kZXJBcmlhTGl2ZVJlZ2lvbj1mdW5jdGlvbigpe3ZhciBlLHQ9cy5wcm9wcyxyPXQuZGF0ZUZvcm1hdCxhPXZvaWQgMD09PXI/bi5kZWZhdWx0UHJvcHMuZGF0ZUZvcm1hdDpyLG89dC5sb2NhbGUsaT1zLnByb3BzLnNob3dUaW1lSW5wdXR8fHMucHJvcHMuc2hvd1RpbWVTZWxlY3Q/XCJQUFBQcFwiOlwiUFBQUFwiO3JldHVybiBlPXMucHJvcHMuc2VsZWN0c1JhbmdlP1wiU2VsZWN0ZWQgc3RhcnQgZGF0ZTogXCIuY29uY2F0KEVlKHMucHJvcHMuc3RhcnREYXRlLHtkYXRlRm9ybWF0OmksbG9jYWxlOm99KSxcIi4gXCIpLmNvbmNhdChzLnByb3BzLmVuZERhdGU/XCJFbmQgZGF0ZTogXCIrRWUocy5wcm9wcy5lbmREYXRlLHtkYXRlRm9ybWF0OmksbG9jYWxlOm99KTpcIlwiKTpzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seT9cIlNlbGVjdGVkIHRpbWU6IFwiLmNvbmNhdChFZShzLnByb3BzLnNlbGVjdGVkLHtkYXRlRm9ybWF0OmEsbG9jYWxlOm99KSk6cy5wcm9wcy5zaG93WWVhclBpY2tlcj9cIlNlbGVjdGVkIHllYXI6IFwiLmNvbmNhdChFZShzLnByb3BzLnNlbGVjdGVkLHtkYXRlRm9ybWF0OlwieXl5eVwiLGxvY2FsZTpvfSkpOnMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcj9cIlNlbGVjdGVkIG1vbnRoOiBcIi5jb25jYXQoRWUocy5wcm9wcy5zZWxlY3RlZCx7ZGF0ZUZvcm1hdDpcIk1NTU0geXl5eVwiLGxvY2FsZTpvfSkpOnMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyP1wiU2VsZWN0ZWQgcXVhcnRlcjogXCIuY29uY2F0KEVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6XCJ5eXl5LCBRUVFcIixsb2NhbGU6b30pKTpcIlNlbGVjdGVkIGRhdGU6IFwiLmNvbmNhdChFZShzLnByb3BzLnNlbGVjdGVkLHtkYXRlRm9ybWF0OmksbG9jYWxlOm99KSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtyb2xlOlwiYWxlcnRcIixcImFyaWEtbGl2ZVwiOlwicG9saXRlXCIsY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fYXJpYS1saXZlXCJ9LGUpfSxzLnJlbmRlckRhdGVJbnB1dD1mdW5jdGlvbigpe3ZhciBlLGEsbyxpPXQuY2xzeChzLnByb3BzLmNsYXNzTmFtZSwoKGU9e30pW1p0XT1zLnN0YXRlLm9wZW4sZSkpLGw9cy5wcm9wcy5jdXN0b21JbnB1dHx8dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIix7dHlwZTpcInRleHRcIn0pLGM9cy5wcm9wcy5jdXN0b21JbnB1dFJlZnx8XCJyZWZcIixwPXMucHJvcHMsZD1wLmRhdGVGb3JtYXQsdT12b2lkIDA9PT1kP24uZGVmYXVsdFByb3BzLmRhdGVGb3JtYXQ6ZCxmPXAubG9jYWxlLGg9XCJzdHJpbmdcIj09dHlwZW9mIHMucHJvcHMudmFsdWU/cy5wcm9wcy52YWx1ZTpcInN0cmluZ1wiPT10eXBlb2Ygcy5zdGF0ZS5pbnB1dFZhbHVlP3Muc3RhdGUuaW5wdXRWYWx1ZTpzLnByb3BzLnNlbGVjdHNSYW5nZT9mdW5jdGlvbihlLHQscil7aWYoIWUpcmV0dXJuXCJcIjt2YXIgbj1FZShlLHIpLGE9dD9FZSh0LHIpOlwiXCI7cmV0dXJuXCJcIi5jb25jYXQobixcIiAtIFwiKS5jb25jYXQoYSl9KHMucHJvcHMuc3RhcnREYXRlLHMucHJvcHMuZW5kRGF0ZSx7ZGF0ZUZvcm1hdDp1LGxvY2FsZTpmfSk6cy5wcm9wcy5zZWxlY3RzTXVsdGlwbGU/ZnVuY3Rpb24oZSx0KXtpZighKG51bGw9PWU/dm9pZCAwOmUubGVuZ3RoKSlyZXR1cm5cIlwiO3ZhciByPWVbMF0/RWUoZVswXSx0KTpcIlwiO2lmKDE9PT1lLmxlbmd0aClyZXR1cm4gcjtpZigyPT09ZS5sZW5ndGgmJmVbMV0pe3ZhciBuPUVlKGVbMV0sdCk7cmV0dXJuXCJcIi5jb25jYXQocixcIiwgXCIpLmNvbmNhdChuKX12YXIgYT1lLmxlbmd0aC0xO3JldHVyblwiXCIuY29uY2F0KHIsXCIgKCtcIikuY29uY2F0KGEsXCIpXCIpfShudWxsIT09KG89cy5wcm9wcy5zZWxlY3RlZERhdGVzKSYmdm9pZCAwIT09bz9vOltdLHtkYXRlRm9ybWF0OnUsbG9jYWxlOmZ9KTpFZShzLnByb3BzLnNlbGVjdGVkLHtkYXRlRm9ybWF0OnUsbG9jYWxlOmZ9KTtyZXR1cm4gci5jbG9uZUVsZW1lbnQobCwoKGE9e30pW2NdPWZ1bmN0aW9uKGUpe3MuaW5wdXQ9ZX0sYS52YWx1ZT1oLGEub25CbHVyPXMuaGFuZGxlQmx1cixhLm9uQ2hhbmdlPXMuaGFuZGxlQ2hhbmdlLGEub25DbGljaz1zLm9uSW5wdXRDbGljayxhLm9uRm9jdXM9cy5oYW5kbGVGb2N1cyxhLm9uS2V5RG93bj1zLm9uSW5wdXRLZXlEb3duLGEuaWQ9cy5wcm9wcy5pZCxhLm5hbWU9cy5wcm9wcy5uYW1lLGEuZm9ybT1zLnByb3BzLmZvcm0sYS5hdXRvRm9jdXM9cy5wcm9wcy5hdXRvRm9jdXMsYS5wbGFjZWhvbGRlcj1zLnByb3BzLnBsYWNlaG9sZGVyVGV4dCxhLmRpc2FibGVkPXMucHJvcHMuZGlzYWJsZWQsYS5hdXRvQ29tcGxldGU9cy5wcm9wcy5hdXRvQ29tcGxldGUsYS5jbGFzc05hbWU9dC5jbHN4KGwucHJvcHMuY2xhc3NOYW1lLGkpLGEudGl0bGU9cy5wcm9wcy50aXRsZSxhLnJlYWRPbmx5PXMucHJvcHMucmVhZE9ubHksYS5yZXF1aXJlZD1zLnByb3BzLnJlcXVpcmVkLGEudGFiSW5kZXg9cy5wcm9wcy50YWJJbmRleCxhW1wiYXJpYS1kZXNjcmliZWRieVwiXT1zLnByb3BzLmFyaWFEZXNjcmliZWRCeSxhW1wiYXJpYS1pbnZhbGlkXCJdPXMucHJvcHMuYXJpYUludmFsaWQsYVtcImFyaWEtbGFiZWxsZWRieVwiXT1zLnByb3BzLmFyaWFMYWJlbGxlZEJ5LGFbXCJhcmlhLXJlcXVpcmVkXCJdPXMucHJvcHMuYXJpYVJlcXVpcmVkLGEpKX0scy5yZW5kZXJDbGVhckJ1dHRvbj1mdW5jdGlvbigpe3ZhciBlPXMucHJvcHMscj1lLmlzQ2xlYXJhYmxlLG49ZS5kaXNhYmxlZCxhPWUuc2VsZWN0ZWQsbz1lLnN0YXJ0RGF0ZSxpPWUuZW5kRGF0ZSxsPWUuY2xlYXJCdXR0b25UaXRsZSxjPWUuY2xlYXJCdXR0b25DbGFzc05hbWUscD12b2lkIDA9PT1jP1wiXCI6YyxkPWUuYXJpYUxhYmVsQ2xvc2UsdT12b2lkIDA9PT1kP1wiQ2xvc2VcIjpkLGY9ZS5zZWxlY3RlZERhdGVzO3JldHVybiByJiYobnVsbCE9YXx8bnVsbCE9b3x8bnVsbCE9aXx8KG51bGw9PWY/dm9pZCAwOmYubGVuZ3RoKSk/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIse3R5cGU6XCJidXR0b25cIixjbGFzc05hbWU6dC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvblwiLHAse1wicmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbi0tZGlzYWJsZWRcIjpufSksZGlzYWJsZWQ6bixcImFyaWEtbGFiZWxcIjp1LG9uQ2xpY2s6cy5vbkNsZWFyQ2xpY2ssdGl0bGU6bCx0YWJJbmRleDotMX0pOm51bGx9LHMuc3RhdGU9cy5jYWxjSW5pdGlhbFN0YXRlKCkscy5wcmV2ZW50Rm9jdXNUaW1lb3V0PXZvaWQgMCxzfXJldHVybiB2ZShuLGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwiZGVmYXVsdFByb3BzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthbGxvd1NhbWVEYXk6ITEsZGF0ZUZvcm1hdDpcIk1NL2RkL3l5eXlcIixkYXRlRm9ybWF0Q2FsZW5kYXI6XCJMTExMIHl5eXlcIixvbkNoYW5nZTpmdW5jdGlvbigpe30sZGlzYWJsZWQ6ITEsZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb246ITEsZHJvcGRvd25Nb2RlOlwic2Nyb2xsXCIsb25Gb2N1czpmdW5jdGlvbigpe30sb25CbHVyOmZ1bmN0aW9uKCl7fSxvbktleURvd246ZnVuY3Rpb24oKXt9LG9uSW5wdXRDbGljazpmdW5jdGlvbigpe30sb25TZWxlY3Q6ZnVuY3Rpb24oKXt9LG9uQ2xpY2tPdXRzaWRlOmZ1bmN0aW9uKCl7fSxvbk1vbnRoQ2hhbmdlOmZ1bmN0aW9uKCl7fSxvbkNhbGVuZGFyT3BlbjpmdW5jdGlvbigpe30sb25DYWxlbmRhckNsb3NlOmZ1bmN0aW9uKCl7fSxwcmV2ZW50T3Blbk9uRm9jdXM6ITEsb25ZZWFyQ2hhbmdlOmZ1bmN0aW9uKCl7fSxvbklucHV0RXJyb3I6ZnVuY3Rpb24oKXt9LG1vbnRoc1Nob3duOjEscmVhZE9ubHk6ITEsd2l0aFBvcnRhbDohMSxzZWxlY3RzRGlzYWJsZWREYXlzSW5SYW5nZTohMSxzaG91bGRDbG9zZU9uU2VsZWN0OiEwLHNob3dUaW1lU2VsZWN0OiExLHNob3dUaW1lSW5wdXQ6ITEsc2hvd1ByZXZpb3VzTW9udGhzOiExLHNob3dNb250aFllYXJQaWNrZXI6ITEsc2hvd0Z1bGxNb250aFllYXJQaWNrZXI6ITEsc2hvd1R3b0NvbHVtbk1vbnRoWWVhclBpY2tlcjohMSxzaG93Rm91ckNvbHVtbk1vbnRoWWVhclBpY2tlcjohMSxzaG93WWVhclBpY2tlcjohMSxzaG93UXVhcnRlclllYXJQaWNrZXI6ITEsc2hvd1dlZWtQaWNrZXI6ITEsc3RyaWN0UGFyc2luZzohMSxzd2FwUmFuZ2U6ITEsdGltZUludGVydmFsczozMCx0aW1lQ2FwdGlvbjpcIlRpbWVcIixwcmV2aW91c01vbnRoQXJpYUxhYmVsOlwiUHJldmlvdXMgTW9udGhcIixwcmV2aW91c01vbnRoQnV0dG9uTGFiZWw6XCJQcmV2aW91cyBNb250aFwiLG5leHRNb250aEFyaWFMYWJlbDpcIk5leHQgTW9udGhcIixuZXh0TW9udGhCdXR0b25MYWJlbDpcIk5leHQgTW9udGhcIixwcmV2aW91c1llYXJBcmlhTGFiZWw6XCJQcmV2aW91cyBZZWFyXCIscHJldmlvdXNZZWFyQnV0dG9uTGFiZWw6XCJQcmV2aW91cyBZZWFyXCIsbmV4dFllYXJBcmlhTGFiZWw6XCJOZXh0IFllYXJcIixuZXh0WWVhckJ1dHRvbkxhYmVsOlwiTmV4dCBZZWFyXCIsdGltZUlucHV0TGFiZWw6XCJUaW1lXCIsZW5hYmxlVGFiTG9vcDohMCx5ZWFySXRlbU51bWJlcjpTZSxmb2N1c1NlbGVjdGVkTW9udGg6ITEsc2hvd1BvcHBlckFycm93OiEwLGV4Y2x1ZGVTY3JvbGxiYXI6ITAsY3VzdG9tVGltZUlucHV0Om51bGwsY2FsZW5kYXJTdGFydERheTp2b2lkIDAsdG9nZ2xlQ2FsZW5kYXJPbkljb25DbGljazohMSx1c2VQb2ludGVyRXZlbnQ6ITF9fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLG4ucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIix0aGlzLm9uU2Nyb2xsLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLHRoaXMuc2V0SGlkZGVuU3RhdGVPblZpc2liaWxpdHlIaWRkZW4pfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgcixuLGEsbyxzLGk7ZS5pbmxpbmUmJihzPWUuc2VsZWN0ZWQsaT10aGlzLnByb3BzLnNlbGVjdGVkLHMmJmk/Xy5nZXRNb250aChzKSE9PV8uZ2V0TW9udGgoaSl8fHguZ2V0WWVhcihzKSE9PXguZ2V0WWVhcihpKTpzIT09aSkmJnRoaXMuc2V0UHJlU2VsZWN0aW9uKHRoaXMucHJvcHMuc2VsZWN0ZWQpLHZvaWQgMCE9PXRoaXMuc3RhdGUubW9udGhTZWxlY3RlZEluJiZlLm1vbnRoc1Nob3duIT09dGhpcy5wcm9wcy5tb250aHNTaG93biYmdGhpcy5zZXRTdGF0ZSh7bW9udGhTZWxlY3RlZEluOjB9KSxlLmhpZ2hsaWdodERhdGVzIT09dGhpcy5wcm9wcy5oaWdobGlnaHREYXRlcyYmdGhpcy5zZXRTdGF0ZSh7aGlnaGxpZ2h0RGF0ZXM6ZHQodGhpcy5wcm9wcy5oaWdobGlnaHREYXRlcyl9KSx0LmZvY3VzZWR8fFdlKGUuc2VsZWN0ZWQsdGhpcy5wcm9wcy5zZWxlY3RlZCl8fHRoaXMuc2V0U3RhdGUoe2lucHV0VmFsdWU6bnVsbH0pLHQub3BlbiE9PXRoaXMuc3RhdGUub3BlbiYmKCExPT09dC5vcGVuJiYhMD09PXRoaXMuc3RhdGUub3BlbiYmKG51bGw9PT0obj0ocj10aGlzLnByb3BzKS5vbkNhbGVuZGFyT3Blbil8fHZvaWQgMD09PW58fG4uY2FsbChyKSksITA9PT10Lm9wZW4mJiExPT09dGhpcy5zdGF0ZS5vcGVuJiYobnVsbD09PShvPShhPXRoaXMucHJvcHMpLm9uQ2FsZW5kYXJDbG9zZSl8fHZvaWQgMD09PW98fG8uY2FsbChhKSkpfSxuLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMuY2xlYXJQcmV2ZW50Rm9jdXNUaW1lb3V0KCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIix0aGlzLm9uU2Nyb2xsLCEwKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLHRoaXMuc2V0SGlkZGVuU3RhdGVPblZpc2liaWxpdHlIaWRkZW4pfSxuLnByb3RvdHlwZS5yZW5kZXJJbnB1dENvbnRhaW5lcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMscj1lLnNob3dJY29uLG49ZS5pY29uLGE9ZS5jYWxlbmRhckljb25DbGFzc25hbWUsbz1lLmNhbGVuZGFySWNvbkNsYXNzTmFtZSxzPWUudG9nZ2xlQ2FsZW5kYXJPbkljb25DbGljayxpPXRoaXMuc3RhdGUub3BlbjtyZXR1cm4gYSYmY29uc29sZS53YXJuKFwiY2FsZW5kYXJJY29uQ2xhc3NuYW1lIHByb3BzIGlzIGRlcHJlY2F0ZWQuIHNob3VsZCB1c2UgY2FsZW5kYXJJY29uQ2xhc3NOYW1lIHByb3BzLlwiKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtY29udGFpbmVyXCIuY29uY2F0KHI/XCIgcmVhY3QtZGF0ZXBpY2tlcl9fdmlldy1jYWxlbmRhci1pY29uXCI6XCJcIil9LHImJnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChqdCxnZSh7aWNvbjpuLGNsYXNzTmFtZTp0LmNsc3gobywhbyYmYSxpJiZcInJlYWN0LWRhdGVwaWNrZXItaWdub3JlLW9uY2xpY2tvdXRzaWRlXCIpfSxzP3tvbkNsaWNrOnRoaXMudG9nZ2xlQ2FsZW5kYXJ9Om51bGwpKSx0aGlzLnN0YXRlLmlzUmVuZGVyQXJpYUxpdmVNZXNzYWdlJiZ0aGlzLnJlbmRlckFyaWFMaXZlUmVnaW9uKCksdGhpcy5yZW5kZXJEYXRlSW5wdXQoKSx0aGlzLnJlbmRlckNsZWFyQnV0dG9uKCkpfSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlbmRlckNhbGVuZGFyKCk7aWYodGhpcy5wcm9wcy5pbmxpbmUpcmV0dXJuIGU7aWYodGhpcy5wcm9wcy53aXRoUG9ydGFsKXt2YXIgdD10aGlzLnN0YXRlLm9wZW4/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHp0LHtlbmFibGVUYWJMb29wOnRoaXMucHJvcHMuZW5hYmxlVGFiTG9vcH0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbFwiLHRhYkluZGV4Oi0xLG9uS2V5RG93bjp0aGlzLm9uUG9ydGFsS2V5RG93bn0sZSkpOm51bGw7cmV0dXJuIHRoaXMuc3RhdGUub3BlbiYmdGhpcy5wcm9wcy5wb3J0YWxJZCYmKHQ9dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFV0LGdlKHtwb3J0YWxJZDp0aGlzLnByb3BzLnBvcnRhbElkfSx0aGlzLnByb3BzKSx0KSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsbnVsbCx0aGlzLnJlbmRlcklucHV0Q29udGFpbmVyKCksdCl9cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChKdCxnZSh7fSx0aGlzLnByb3BzLHtjbGFzc05hbWU6dGhpcy5wcm9wcy5wb3BwZXJDbGFzc05hbWUsaGlkZVBvcHBlcjohdGhpcy5pc0NhbGVuZGFyT3BlbigpLHRhcmdldENvbXBvbmVudDp0aGlzLnJlbmRlcklucHV0Q29udGFpbmVyKCkscG9wcGVyQ29tcG9uZW50OmUscG9wcGVyT25LZXlEb3duOnRoaXMub25Qb3BwZXJLZXlEb3duLHNob3dBcnJvdzp0aGlzLnByb3BzLnNob3dQb3BwZXJBcnJvd30pKX0sbn0oci5Db21wb25lbnQpLG5yPVwiaW5wdXRcIixhcj1cIm5hdmlnYXRlXCI7ZS5DYWxlbmRhckNvbnRhaW5lcj1rZSxlLmRlZmF1bHQ9cnIsZS5nZXREZWZhdWx0TG9jYWxlPXFlLGUucmVnaXN0ZXJMb2NhbGU9ZnVuY3Rpb24oZSx0KXt2YXIgcj13ZSgpO3IuX19sb2NhbGVEYXRhX198fChyLl9fbG9jYWxlRGF0YV9fPXt9KSxyLl9fbG9jYWxlRGF0YV9fW2VdPXR9LGUuc2V0RGVmYXVsdExvY2FsZT1mdW5jdGlvbihlKXt3ZSgpLl9fbG9jYWxlSWRfXz1lfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0pKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRMZWFkaW5nWmVyb3MgPSBhZGRMZWFkaW5nWmVyb3M7XG5mdW5jdGlvbiBhZGRMZWFkaW5nWmVyb3MobnVtYmVyLCB0YXJnZXRMZW5ndGgpIHtcbiAgY29uc3Qgc2lnbiA9IG51bWJlciA8IDAgPyBcIi1cIiA6IFwiXCI7XG4gIGNvbnN0IG91dHB1dCA9IE1hdGguYWJzKG51bWJlcikudG9TdHJpbmcoKS5wYWRTdGFydCh0YXJnZXRMZW5ndGgsIFwiMFwiKTtcbiAgcmV0dXJuIHNpZ24gKyBvdXRwdXQ7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmF1bHRMb2NhbGVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2luZGV4LmVuVVM7XG4gIH0sXG59KTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vbG9jYWxlL2VuLVVTLmpzXCIpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldERlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnM7XG5leHBvcnRzLnNldERlZmF1bHRPcHRpb25zID0gc2V0RGVmYXVsdE9wdGlvbnM7XG5cbmxldCBkZWZhdWx0T3B0aW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBzZXREZWZhdWx0T3B0aW9ucyhuZXdPcHRpb25zKSB7XG4gIGRlZmF1bHRPcHRpb25zID0gbmV3T3B0aW9ucztcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5mb3JtYXR0ZXJzID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi9nZXREYXlPZlllYXIuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi9nZXRJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi4vLi4vZ2V0SVNPV2Vla1llYXIuanNcIik7XG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuLi8uLi9nZXRXZWVrLmpzXCIpO1xudmFyIF9pbmRleDUgPSByZXF1aXJlKFwiLi4vLi4vZ2V0V2Vla1llYXIuanNcIik7XG5cbnZhciBfaW5kZXg2ID0gcmVxdWlyZShcIi4uL2FkZExlYWRpbmdaZXJvcy5qc1wiKTtcbnZhciBfaW5kZXg3ID0gcmVxdWlyZShcIi4vbGlnaHRGb3JtYXR0ZXJzLmpzXCIpO1xuXG5jb25zdCBkYXlQZXJpb2RFbnVtID0ge1xuICBhbTogXCJhbVwiLFxuICBwbTogXCJwbVwiLFxuICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICBub29uOiBcIm5vb25cIixcbiAgbW9ybmluZzogXCJtb3JuaW5nXCIsXG4gIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gIG5pZ2h0OiBcIm5pZ2h0XCIsXG59O1xuXG4vKlxuICogfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCAgYSAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgfCAgQSogfCBNaWxsaXNlY29uZHMgaW4gZGF5ICAgICAgICAgICAgfFxuICogfCAgYiAgfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgfCAgQiAgfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgfFxuICogfCAgYyAgfCBTdGFuZC1hbG9uZSBsb2NhbCBkYXkgb2Ygd2VlayAgfCAgQyogfCBMb2NhbGl6ZWQgaG91ciB3LyBkYXkgcGVyaW9kICAgfFxuICogfCAgZCAgfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgfCAgRCAgfCBEYXkgb2YgeWVhciAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZSAgfCBMb2NhbCBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgfCAgRSAgfCBEYXkgb2Ygd2VlayAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRiogfCBEYXkgb2Ygd2VlayBpbiBtb250aCAgICAgICAgICAgfFxuICogfCAgZyogfCBNb2RpZmllZCBKdWxpYW4gZGF5ICAgICAgICAgICAgfCAgRyAgfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaCAgfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgfCAgSCAgfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaSEgfCBJU08gZGF5IG9mIHdlZWsgICAgICAgICAgICAgICAgfCAgSSEgfCBJU08gd2VlayBvZiB5ZWFyICAgICAgICAgICAgICAgfFxuICogfCAgaiogfCBMb2NhbGl6ZWQgaG91ciB3LyBkYXkgcGVyaW9kICAgfCAgSiogfCBMb2NhbGl6ZWQgaG91ciB3L28gZGF5IHBlcmlvZCAgfFxuICogfCAgayAgfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgfCAgSyAgfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbCogfCAoZGVwcmVjYXRlZCkgICAgICAgICAgICAgICAgICAgfCAgTCAgfCBTdGFuZC1hbG9uZSBtb250aCAgICAgICAgICAgICAgfFxuICogfCAgbSAgfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTSAgfCBNb250aCAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbyEgfCBPcmRpbmFsIG51bWJlciBtb2RpZmllciAgICAgICAgfCAgTyAgfCBUaW1lem9uZSAoR01UKSAgICAgICAgICAgICAgICAgfFxuICogfCAgcCEgfCBMb25nIGxvY2FsaXplZCB0aW1lICAgICAgICAgICAgfCAgUCEgfCBMb25nIGxvY2FsaXplZCBkYXRlICAgICAgICAgICAgfFxuICogfCAgcSAgfCBTdGFuZC1hbG9uZSBxdWFydGVyICAgICAgICAgICAgfCAgUSAgfCBRdWFydGVyICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgciogfCBSZWxhdGVkIEdyZWdvcmlhbiB5ZWFyICAgICAgICAgfCAgUiEgfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgfFxuICogfCAgcyAgfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgUyAgfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgfFxuICogfCAgdCEgfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgfCAgVCEgfCBNaWxsaXNlY29uZHMgdGltZXN0YW1wICAgICAgICAgfFxuICogfCAgdSAgfCBFeHRlbmRlZCB5ZWFyICAgICAgICAgICAgICAgICAgfCAgVSogfCBDeWNsaWMgeWVhciAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgdiogfCBUaW1lem9uZSAoZ2VuZXJpYyBub24tbG9jYXQuKSAgfCAgViogfCBUaW1lem9uZSAobG9jYXRpb24pICAgICAgICAgICAgfFxuICogfCAgdyAgfCBMb2NhbCB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgfCAgVyogfCBXZWVrIG9mIG1vbnRoICAgICAgICAgICAgICAgICAgfFxuICogfCAgeCAgfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgfCAgWCAgfCBUaW1lem9uZSAoSVNPLTg2MDEpICAgICAgICAgICAgfFxuICogfCAgeSAgfCBZZWFyIChhYnMpICAgICAgICAgICAgICAgICAgICAgfCAgWSAgfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgfFxuICogfCAgeiAgfCBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0LikgfCAgWiogfCBUaW1lem9uZSAoYWxpYXNlcykgICAgICAgICAgICAgfFxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICogYXJlIG5vdCBpbXBsZW1lbnRlZCBidXQgcmVzZXJ2ZWQgYnkgVW5pY29kZSBzdGFuZGFyZC5cbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAhIGFyZSBub24tc3RhbmRhcmQsIGJ1dCBpbXBsZW1lbnRlZCBieSBkYXRlLWZuczpcbiAqIC0gYG9gIG1vZGlmaWVzIHRoZSBwcmV2aW91cyB0b2tlbiB0byB0dXJuIGl0IGludG8gYW4gb3JkaW5hbCAoc2VlIGBmb3JtYXRgIGRvY3MpXG4gKiAtIGBpYCBpcyBJU08gZGF5IG9mIHdlZWsuIEZvciBgaWAgYW5kIGBpaWAgaXMgcmV0dXJucyBudW1lcmljIElTTyB3ZWVrIGRheXMsXG4gKiAgIGkuZS4gNyBmb3IgU3VuZGF5LCAxIGZvciBNb25kYXksIGV0Yy5cbiAqIC0gYElgIGlzIElTTyB3ZWVrIG9mIHllYXIsIGFzIG9wcG9zZWQgdG8gYHdgIHdoaWNoIGlzIGxvY2FsIHdlZWsgb2YgeWVhci5cbiAqIC0gYFJgIGlzIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyLCBhcyBvcHBvc2VkIHRvIGBZYCB3aGljaCBpcyBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogICBgUmAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGBJYCBhbmQgYGlgXG4gKiAgIGZvciB1bml2ZXJzYWwgSVNPIHdlZWstbnVtYmVyaW5nIGRhdGUsIHdoZXJlYXNcbiAqICAgYFlgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgd2AgYW5kIGBlYFxuICogICBmb3Igd2Vlay1udW1iZXJpbmcgZGF0ZSBzcGVjaWZpYyB0byB0aGUgbG9jYWxlLlxuICogLSBgUGAgaXMgbG9uZyBsb2NhbGl6ZWQgZGF0ZSBmb3JtYXRcbiAqIC0gYHBgIGlzIGxvbmcgbG9jYWxpemVkIHRpbWUgZm9ybWF0XG4gKi9cblxuY29uc3QgZm9ybWF0dGVycyA9IChleHBvcnRzLmZvcm1hdHRlcnMgPSB7XG4gIC8vIEVyYVxuICBHOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZXJhID0gZGF0ZS5nZXRGdWxsWWVhcigpID4gMCA/IDEgOiAwO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEFELCBCQ1xuICAgICAgY2FzZSBcIkdcIjpcbiAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgY2FzZSBcIkdHR1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwgeyB3aWR0aDogXCJhYmJyZXZpYXRlZFwiIH0pO1xuICAgICAgLy8gQSwgQlxuICAgICAgY2FzZSBcIkdHR0dHXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcIm5hcnJvd1wiIH0pO1xuICAgICAgLy8gQW5ubyBEb21pbmksIEJlZm9yZSBDaHJpc3RcbiAgICAgIGNhc2UgXCJHR0dHXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwgeyB3aWR0aDogXCJ3aWRlXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFllYXJcbiAgeTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIC8vIE9yZGluYWwgbnVtYmVyXG4gICAgaWYgKHRva2VuID09PSBcInlvXCIpIHtcbiAgICAgIGNvbnN0IHNpZ25lZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgICAgY29uc3QgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyO1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoeWVhciwgeyB1bml0OiBcInllYXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMueShkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc2lnbmVkV2Vla1llYXIgPSAoMCwgX2luZGV4NS5nZXRXZWVrWWVhcikoZGF0ZSwgb3B0aW9ucyk7XG4gICAgLy8gUmV0dXJucyAxIGZvciAxIEJDICh3aGljaCBpcyB5ZWFyIDAgaW4gSmF2YVNjcmlwdClcbiAgICBjb25zdCB3ZWVrWWVhciA9IHNpZ25lZFdlZWtZZWFyID4gMCA/IHNpZ25lZFdlZWtZZWFyIDogMSAtIHNpZ25lZFdlZWtZZWFyO1xuXG4gICAgLy8gVHdvIGRpZ2l0IHllYXJcbiAgICBpZiAodG9rZW4gPT09IFwiWVlcIikge1xuICAgICAgY29uc3QgdHdvRGlnaXRZZWFyID0gd2Vla1llYXIgJSAxMDA7XG4gICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKSh0d29EaWdpdFllYXIsIDIpO1xuICAgIH1cblxuICAgIC8vIE9yZGluYWwgbnVtYmVyXG4gICAgaWYgKHRva2VuID09PSBcIllvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHdlZWtZZWFyLCB7IHVuaXQ6IFwieWVhclwiIH0pO1xuICAgIH1cblxuICAgIC8vIFBhZGRpbmdcbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKSh3ZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBpc29XZWVrWWVhciA9ICgwLCBfaW5kZXgzLmdldElTT1dlZWtZZWFyKShkYXRlKTtcblxuICAgIC8vIFBhZGRpbmdcbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShpc29XZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBFeHRlbmRlZCB5ZWFyLiBUaGlzIGlzIGEgc2luZ2xlIG51bWJlciBkZXNpZ25hdGluZyB0aGUgeWVhciBvZiB0aGlzIGNhbGVuZGFyIHN5c3RlbS5cbiAgLy8gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIGxvY2FsaXplcnMgYXJlIEIuQy4geWVhcnM6XG4gIC8vIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gIC8vIHwtLS0tLS18LS0tLS18LS0tLS18XG4gIC8vIHwgQUMgMSB8ICAgMSB8ICAgMSB8XG4gIC8vIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gIC8vIHwgQkMgMiB8ICAgMiB8ICAtMSB8XG4gIC8vIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAgLy8gd2hpbGUgYHV1YCBwYWRzIHNpbmdsZSBkaWdpdCB5ZWFycyB0byAyIGNoYXJhY3RlcnMgYW5kIHJldHVybnMgb3RoZXIgeWVhcnMgdW5jaGFuZ2VkLlxuICB1OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gUXVhcnRlclxuICBROiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwiUVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgXCJRUVwiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShxdWFydGVyLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuICAgICAgY2FzZSBcIlFvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHF1YXJ0ZXIsIHsgdW5pdDogXCJxdWFydGVyXCIgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuICAgICAgY2FzZSBcIlFRUVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcbiAgICAgIGNhc2UgXCJRUVFRUVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi5cbiAgICAgIGNhc2UgXCJRUVFRXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gU3RhbmQtYWxvbmUgcXVhcnRlclxuICBxOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwicVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgXCJxcVwiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShxdWFydGVyLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuICAgICAgY2FzZSBcInFvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHF1YXJ0ZXIsIHsgdW5pdDogXCJxdWFydGVyXCIgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuICAgICAgY2FzZSBcInFxcVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcbiAgICAgIGNhc2UgXCJxcXFxcVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi5cbiAgICAgIGNhc2UgXCJxcXFxXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gTW9udGhcbiAgTTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJNXCI6XG4gICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLk0oZGF0ZSwgdG9rZW4pO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aFxuICAgICAgY2FzZSBcIk1vXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKG1vbnRoICsgMSwgeyB1bml0OiBcIm1vbnRoXCIgfSk7XG4gICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWNcbiAgICAgIGNhc2UgXCJNTU1cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKLCBGLCAuLi4sIERcbiAgICAgIGNhc2UgXCJNTU1NTVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlclxuICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBtb250aFxuICBMOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhtb250aCArIDEpO1xuICAgICAgLy8gMDEsIDAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykobW9udGggKyAxLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcbiAgICAgIGNhc2UgXCJMb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihtb250aCArIDEsIHsgdW5pdDogXCJtb250aFwiIH0pO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG4gICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSiwgRiwgLi4uLCBEXG4gICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcbiAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gTG9jYWwgd2VlayBvZiB5ZWFyXG4gIHc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB3ZWVrID0gKDAsIF9pbmRleDQuZ2V0V2VlaykoZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwid29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKSh3ZWVrLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIElTTyB3ZWVrIG9mIHllYXJcbiAgSTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGlzb1dlZWsgPSAoMCwgX2luZGV4Mi5nZXRJU09XZWVrKShkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJJb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29XZWVrLCB7IHVuaXQ6IFwid2Vla1wiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcImRvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0RGF0ZSgpLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5kKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBEYXkgb2YgeWVhclxuICBEOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZZZWFyID0gKDAsIF9pbmRleC5nZXREYXlPZlllYXIpKGRhdGUpO1xuXG4gICAgaWYgKHRva2VuID09PSBcIkRvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRheU9mWWVhciwgeyB1bml0OiBcImRheU9mWWVhclwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBEYXkgb2Ygd2Vla1xuICBFOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiRUVcIjpcbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiRUVFRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBMb2NhbCBkYXkgb2Ygd2Vla1xuICBlOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3O1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoTnRoIGRheSBvZiB3ZWVrIHdpdGggY3VycmVudCBsb2NhbGUgb3Igd2Vla1N0YXJ0c09uKVxuICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlIFwiZWVcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykobG9jYWxEYXlPZldlZWssIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoXG4gICAgICBjYXNlIFwiZW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobG9jYWxEYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIGNhc2UgXCJlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJlZWVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiZWVlZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiZWVlZVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBsb2NhbCBkYXkgb2Ygd2Vla1xuICBjOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3O1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoc2FtZSBhcyBpbiBgZWApXG4gICAgICBjYXNlIFwiY1wiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGxvY2FsRGF5T2ZXZWVrKTtcbiAgICAgIC8vIFBhZGRlZCBudW1lcmljYWwgdmFsdWVcbiAgICAgIGNhc2UgXCJjY1wiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShsb2NhbERheU9mV2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDd0aFxuICAgICAgY2FzZSBcImNvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7IHVuaXQ6IFwiZGF5XCIgfSk7XG4gICAgICBjYXNlIFwiY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImNjY2NjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImNjY2NcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSVNPIGRheSBvZiB3ZWVrXG4gIGk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGlzb0RheU9mV2VlayA9IGRheU9mV2VlayA9PT0gMCA/IDcgOiBkYXlPZldlZWs7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMlxuICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhpc29EYXlPZldlZWspO1xuICAgICAgLy8gMDJcbiAgICAgIGNhc2UgXCJpaVwiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShpc29EYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAybmRcbiAgICAgIGNhc2UgXCJpb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29EYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImlpaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJpaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJpaWlpXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyBcInBtXCIgOiBcImFtXCI7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgY2FzZSBcImFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJhYWFhYVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNLCBQTSwgbWlkbmlnaHQsIG5vb25cbiAgYjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID09PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5ub29uO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPT09IDApIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubWlkbmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYlwiOlxuICAgICAgY2FzZSBcImJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYmJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJiYmJiYlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJiXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbiAgQjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID49IDE3KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5hZnRlcm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1vcm5pbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkJcIjpcbiAgICAgIGNhc2UgXCJCQlwiOlxuICAgICAgY2FzZSBcIkJCQlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJCXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJob1wiKSB7XG4gICAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcbiAgICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAxMjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5oKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTIzXVxuICBIOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcIkhvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0SG91cnMoKSwgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMuSChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0xMV1cbiAgSzogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpICUgMTI7XG5cbiAgICBpZiAodG9rZW4gPT09IFwiS29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0yNF1cbiAgazogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMjQ7XG5cbiAgICBpZiAodG9rZW4gPT09IFwia29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwibW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCksIHsgdW5pdDogXCJtaW51dGVcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMubShkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gU2Vjb25kXG4gIHM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwic29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRTZWNvbmRzKCksIHsgdW5pdDogXCJzZWNvbmRcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMucyhkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5TKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKVxuICBYOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJaXCI7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGBcbiAgICAgIGNhc2UgXCJYWFhYXCI6XG4gICAgICBjYXNlIFwiWFhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYWGBcbiAgICAgIGNhc2UgXCJYWFhYWFwiOlxuICAgICAgY2FzZSBcIlhYWFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYCcrMDA6MDAnYCBvciBlcXVpdmFsZW50KVxuICB4OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGBcbiAgICAgIGNhc2UgXCJ4eHh4XCI6XG4gICAgICBjYXNlIFwieHhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGBcbiAgICAgIGNhc2UgXCJ4eHh4eFwiOlxuICAgICAgY2FzZSBcInh4eFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoR01UKVxuICBPOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJPXCI6XG4gICAgICBjYXNlIFwiT09cIjpcbiAgICAgIGNhc2UgXCJPT09cIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwiT09PT1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0aW9uKVxuICB6OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICBjYXNlIFwienpcIjpcbiAgICAgIGNhc2UgXCJ6enpcIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwienp6elwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBTZWNvbmRzIHRpbWVzdGFtcFxuICB0OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IE1hdGgudHJ1bmMoZGF0ZS5nZXRUaW1lKCkgLyAxMDAwKTtcbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKSh0aW1lc3RhbXAsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWlsbGlzZWNvbmRzIHRpbWVzdGFtcFxuICBUOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn0pO1xuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZVNob3J0KG9mZnNldCwgZGVsaW1pdGVyID0gXCJcIikge1xuICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gIGNvbnN0IGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7XG4gIGNvbnN0IGhvdXJzID0gTWF0aC50cnVuYyhhYnNPZmZzZXQgLyA2MCk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBhYnNPZmZzZXQgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gc2lnbiArIFN0cmluZyhob3Vycyk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBzaWduICsgU3RyaW5nKGhvdXJzKSArIGRlbGltaXRlciArICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykobWludXRlcywgMilcbiAgKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGltZXpvbmVXaXRoT3B0aW9uYWxNaW51dGVzKG9mZnNldCwgZGVsaW1pdGVyKSB7XG4gIGlmIChvZmZzZXQgJSA2MCA9PT0gMCkge1xuICAgIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgICByZXR1cm4gc2lnbiArICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTtcbiAgfVxuICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkZWxpbWl0ZXIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRlbGltaXRlciA9IFwiXCIpIHtcbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICBjb25zdCBob3VycyA9ICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoTWF0aC50cnVuYyhhYnNPZmZzZXQgLyA2MCksIDIpO1xuICBjb25zdCBtaW51dGVzID0gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShhYnNPZmZzZXQgJSA2MCwgMik7XG4gIHJldHVybiBzaWduICsgaG91cnMgKyBkZWxpbWl0ZXIgKyBtaW51dGVzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmxpZ2h0Rm9ybWF0dGVycyA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vYWRkTGVhZGluZ1plcm9zLmpzXCIpO1xuXG4vKlxuICogfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCAgYSAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgfCAgQSogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZCAgfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgfCAgRCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaCAgfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgfCAgSCAgfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbSAgfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTSAgfCBNb250aCAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgcyAgfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgUyAgfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgfFxuICogfCAgeSAgfCBZZWFyIChhYnMpICAgICAgICAgICAgICAgICAgICAgfCAgWSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICogYXJlIG5vdCBpbXBsZW1lbnRlZCBidXQgcmVzZXJ2ZWQgYnkgVW5pY29kZSBzdGFuZGFyZC5cbiAqL1xuXG5jb25zdCBsaWdodEZvcm1hdHRlcnMgPSAoZXhwb3J0cy5saWdodEZvcm1hdHRlcnMgPSB7XG4gIC8vIFllYXJcbiAgeShkYXRlLCB0b2tlbikge1xuICAgIC8vIEZyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS0zMS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9Gb3JtYXRfdG9rZW5zXG4gICAgLy8gfCBZZWFyICAgICB8ICAgICB5IHwgeXkgfCAgIHl5eSB8ICB5eXl5IHwgeXl5eXkgfFxuICAgIC8vIHwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXxcbiAgICAvLyB8IEFEIDEgICAgIHwgICAgIDEgfCAwMSB8ICAgMDAxIHwgIDAwMDEgfCAwMDAwMSB8XG4gICAgLy8gfCBBRCAxMiAgICB8ICAgIDEyIHwgMTIgfCAgIDAxMiB8ICAwMDEyIHwgMDAwMTIgfFxuICAgIC8vIHwgQUQgMTIzICAgfCAgIDEyMyB8IDIzIHwgICAxMjMgfCAgMDEyMyB8IDAwMTIzIHxcbiAgICAvLyB8IEFEIDEyMzQgIHwgIDEyMzQgfCAzNCB8ICAxMjM0IHwgIDEyMzQgfCAwMTIzNCB8XG4gICAgLy8gfCBBRCAxMjM0NSB8IDEyMzQ1IHwgNDUgfCAxMjM0NSB8IDEyMzQ1IHwgMTIzNDUgfFxuXG4gICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKFxuICAgICAgdG9rZW4gPT09IFwieXlcIiA/IHllYXIgJSAxMDAgOiB5ZWFyLFxuICAgICAgdG9rZW4ubGVuZ3RoLFxuICAgICk7XG4gIH0sXG5cbiAgLy8gTW9udGhcbiAgTShkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIHJldHVybiB0b2tlbiA9PT0gXCJNXCJcbiAgICAgID8gU3RyaW5nKG1vbnRoICsgMSlcbiAgICAgIDogKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKG1vbnRoICsgMSwgMik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShkYXRlLmdldERhdGUoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBBTSBvciBQTVxuICBhKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF0ZS5nZXRIb3VycygpIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICBjYXNlIFwiYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgY2FzZSBcImFhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlO1xuICAgICAgY2FzZSBcImFhYWFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWVbMF07XG4gICAgICBjYXNlIFwiYWFhYVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZSA9PT0gXCJhbVwiID8gXCJhLm0uXCIgOiBcInAubS5cIjtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoXG4gICAgICBkYXRlLmdldEhvdXJzKCkgJSAxMiB8fCAxMixcbiAgICAgIHRva2VuLmxlbmd0aCxcbiAgICApO1xuICB9LFxuXG4gIC8vIEhvdXIgWzAtMjNdXG4gIEgoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKGRhdGUuZ2V0SG91cnMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaW51dGVcbiAgbShkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoZGF0ZS5nZXRNaW51dGVzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gU2Vjb25kXG4gIHMoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKGRhdGUuZ2V0U2Vjb25kcygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEZyYWN0aW9uIG9mIHNlY29uZFxuICBTKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgbnVtYmVyT2ZEaWdpdHMgPSB0b2tlbi5sZW5ndGg7XG4gICAgY29uc3QgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICBjb25zdCBmcmFjdGlvbmFsU2Vjb25kcyA9IE1hdGgudHJ1bmMoXG4gICAgICBtaWxsaXNlY29uZHMgKiBNYXRoLnBvdygxMCwgbnVtYmVyT2ZEaWdpdHMgLSAzKSxcbiAgICApO1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoZnJhY3Rpb25hbFNlY29uZHMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5sb25nRm9ybWF0dGVycyA9IHZvaWQgMDtcblxuY29uc3QgZGF0ZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBzd2l0Y2ggKHBhdHRlcm4pIHtcbiAgICBjYXNlIFwiUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgY2FzZSBcIlBQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICBjYXNlIFwiUFBQUFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICB9XG59O1xuXG5jb25zdCB0aW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgXCJwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICBjYXNlIFwicHBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICBjYXNlIFwicHBwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgIGNhc2UgXCJwcHBwXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gIH1cbn07XG5cbmNvbnN0IGRhdGVUaW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIGNvbnN0IG1hdGNoUmVzdWx0ID0gcGF0dGVybi5tYXRjaCgvKFArKShwKyk/LykgfHwgW107XG4gIGNvbnN0IGRhdGVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMV07XG4gIGNvbnN0IHRpbWVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMl07XG5cbiAgaWYgKCF0aW1lUGF0dGVybikge1xuICAgIHJldHVybiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKTtcbiAgfVxuXG4gIGxldCBkYXRlVGltZUZvcm1hdDtcblxuICBzd2l0Y2ggKGRhdGVQYXR0ZXJuKSB7XG4gICAgY2FzZSBcIlBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZGF0ZVRpbWVGb3JtYXRcbiAgICAucmVwbGFjZShcInt7ZGF0ZX19XCIsIGRhdGVMb25nRm9ybWF0dGVyKGRhdGVQYXR0ZXJuLCBmb3JtYXRMb25nKSlcbiAgICAucmVwbGFjZShcInt7dGltZX19XCIsIHRpbWVMb25nRm9ybWF0dGVyKHRpbWVQYXR0ZXJuLCBmb3JtYXRMb25nKSk7XG59O1xuXG5jb25zdCBsb25nRm9ybWF0dGVycyA9IChleHBvcnRzLmxvbmdGb3JtYXR0ZXJzID0ge1xuICBwOiB0aW1lTG9uZ0Zvcm1hdHRlcixcbiAgUDogZGF0ZVRpbWVMb25nRm9ybWF0dGVyLFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyA9IGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBHb29nbGUgQ2hyb21lIGFzIG9mIDY3LjAuMzM5Ni44NyBpbnRyb2R1Y2VkIHRpbWV6b25lcyB3aXRoIG9mZnNldCB0aGF0IGluY2x1ZGVzIHNlY29uZHMuXG4gKiBUaGV5IHVzdWFsbHkgYXBwZWFyIGZvciBkYXRlcyB0aGF0IGRlbm90ZSB0aW1lIGJlZm9yZSB0aGUgdGltZXpvbmVzIHdlcmUgaW50cm9kdWNlZFxuICogKGUuZy4gZm9yICdFdXJvcGUvUHJhZ3VlJyB0aW1lem9uZSB0aGUgb2Zmc2V0IGlzIEdNVCswMDo1Nzo0NCBiZWZvcmUgMSBPY3RvYmVyIDE4OTFcbiAqIGFuZCBHTVQrMDE6MDA6MDAgYWZ0ZXIgdGhhdCBkYXRlKVxuICpcbiAqIERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgYW5kIHdvdWxkIHJldHVybiA1NyBmb3IgdGhlIGV4YW1wbGUgYWJvdmUsXG4gKiB3aGljaCB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCBjYWxjdWxhdGlvbnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGFrZXMgc2Vjb25kcyBpbiBhY2NvdW50LlxuICovXG5mdW5jdGlvbiBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHV0Y0RhdGUgPSBuZXcgRGF0ZShcbiAgICBEYXRlLlVUQyhcbiAgICAgIF9kYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBfZGF0ZS5nZXRNb250aCgpLFxuICAgICAgX2RhdGUuZ2V0RGF0ZSgpLFxuICAgICAgX2RhdGUuZ2V0SG91cnMoKSxcbiAgICAgIF9kYXRlLmdldE1pbnV0ZXMoKSxcbiAgICAgIF9kYXRlLmdldFNlY29uZHMoKSxcbiAgICAgIF9kYXRlLmdldE1pbGxpc2Vjb25kcygpLFxuICAgICksXG4gICk7XG4gIHV0Y0RhdGUuc2V0VVRDRnVsbFllYXIoX2RhdGUuZ2V0RnVsbFllYXIoKSk7XG4gIHJldHVybiArZGF0ZSAtICt1dGNEYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4gPSBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuO1xuZXhwb3J0cy5pc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4gPSBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW47XG5leHBvcnRzLndhcm5PclRocm93UHJvdGVjdGVkRXJyb3IgPSB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yO1xuY29uc3QgZGF5T2ZZZWFyVG9rZW5SRSA9IC9eRCskLztcbmNvbnN0IHdlZWtZZWFyVG9rZW5SRSA9IC9eWSskLztcblxuY29uc3QgdGhyb3dUb2tlbnMgPSBbXCJEXCIsIFwiRERcIiwgXCJZWVwiLCBcIllZWVlcIl07XG5cbmZ1bmN0aW9uIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIGRheU9mWWVhclRva2VuUkUudGVzdCh0b2tlbik7XG59XG5cbmZ1bmN0aW9uIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gd2Vla1llYXJUb2tlblJFLnRlc3QodG9rZW4pO1xufVxuXG5mdW5jdGlvbiB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGNvbnN0IF9tZXNzYWdlID0gbWVzc2FnZSh0b2tlbiwgZm9ybWF0LCBpbnB1dCk7XG4gIGNvbnNvbGUud2FybihfbWVzc2FnZSk7XG4gIGlmICh0aHJvd1Rva2Vucy5pbmNsdWRlcyh0b2tlbikpIHRocm93IG5ldyBSYW5nZUVycm9yKF9tZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gbWVzc2FnZSh0b2tlbiwgZm9ybWF0LCBpbnB1dCkge1xuICBjb25zdCBzdWJqZWN0ID0gdG9rZW5bMF0gPT09IFwiWVwiID8gXCJ5ZWFyc1wiIDogXCJkYXlzIG9mIHRoZSBtb250aFwiO1xuICByZXR1cm4gYFVzZSBcXGAke3Rva2VuLnRvTG93ZXJDYXNlKCl9XFxgIGluc3RlYWQgb2YgXFxgJHt0b2tlbn1cXGAgKGluIFxcYCR7Zm9ybWF0fVxcYCkgZm9yIGZvcm1hdHRpbmcgJHtzdWJqZWN0fSB0byB0aGUgaW5wdXQgXFxgJHtpbnB1dH1cXGA7IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZGA7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkRGF5cyA9IGFkZERheXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZERheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGRheXMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheXMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDEwIGRheXMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZERheXMobmV3IERhdGUoMjAxNCwgOCwgMSksIDEwKVxuICogLy89PiBUaHUgU2VwIDExIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkRGF5cyhkYXRlLCBhbW91bnQpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGlmIChpc05hTihhbW91bnQpKSByZXR1cm4gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgTmFOKTtcbiAgaWYgKCFhbW91bnQpIHtcbiAgICAvLyBJZiAwIGRheXMsIG5vLW9wIHRvIGF2b2lkIGNoYW5naW5nIHRpbWVzIGluIHRoZSBob3VyIGJlZm9yZSBlbmQgb2YgRFNUXG4gICAgcmV0dXJuIF9kYXRlO1xuICB9XG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgYW1vdW50KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZEhvdXJzID0gYWRkSG91cnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTWlsbGlzZWNvbmRzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkSG91cnNcbiAqIEBjYXRlZ29yeSBIb3VyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBob3VycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBob3VycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGhvdXJzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBob3VycyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMiBob3VycyB0byAxMCBKdWx5IDIwMTQgMjM6MDA6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRIb3VycyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMjMsIDApLCAyKVxuICogLy89PiBGcmkgSnVsIDExIDIwMTQgMDE6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkSG91cnMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZE1pbGxpc2Vjb25kcykoZGF0ZSwgYW1vdW50ICogX2luZGV4Mi5taWxsaXNlY29uZHNJbkhvdXIpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZE1pbGxpc2Vjb25kcyA9IGFkZE1pbGxpc2Vjb25kcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkTWlsbGlzZWNvbmRzXG4gKiBAY2F0ZWdvcnkgTWlsbGlzZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIG1pbGxpc2Vjb25kcyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgNzUwIG1pbGxpc2Vjb25kcyB0byAxMCBKdWx5IDIwMTQgMTI6NDU6MzAuMDAwOlxuICogY29uc3QgcmVzdWx0ID0gYWRkTWlsbGlzZWNvbmRzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAxMiwgNDUsIDMwLCAwKSwgNzUwKVxuICogLy89PiBUaHUgSnVsIDEwIDIwMTQgMTI6NDU6MzAuNzUwXG4gKi9cbmZ1bmN0aW9uIGFkZE1pbGxpc2Vjb25kcyhkYXRlLCBhbW91bnQpIHtcbiAgY29uc3QgdGltZXN0YW1wID0gKygwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgcmV0dXJuICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIHRpbWVzdGFtcCArIGFtb3VudCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkTWludXRlcyA9IGFkZE1pbnV0ZXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTWlsbGlzZWNvbmRzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkTWludXRlc1xuICogQGNhdGVnb3J5IE1pbnV0ZSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWludXRlcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaW51dGVzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgbWludXRlcyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbWludXRlcyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMzAgbWludXRlcyB0byAxMCBKdWx5IDIwMTQgMTI6MDA6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRNaW51dGVzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAxMiwgMCksIDMwKVxuICogLy89PiBUaHUgSnVsIDEwIDIwMTQgMTI6MzA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkTWludXRlcyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkTWlsbGlzZWNvbmRzKShcbiAgICBkYXRlLFxuICAgIGFtb3VudCAqIF9pbmRleDIubWlsbGlzZWNvbmRzSW5NaW51dGUsXG4gICk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkTW9udGhzID0gYWRkTW9udGhzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRNb250aHNcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbW9udGhzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1vbnRocyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIG1vbnRocyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbW9udGhzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA1IG1vbnRocyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkTW9udGhzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA1KVxuICogLy89PiBTdW4gRmViIDAxIDIwMTUgMDA6MDA6MDBcbiAqXG4gKiAvLyBBZGQgb25lIG1vbnRoIHRvIDMwIEphbnVhcnkgMjAyMzpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1vbnRocyhuZXcgRGF0ZSgyMDIzLCAwLCAzMCksIDEpXG4gKiAvLz0+IFR1ZSBGZWIgMjggMjAyMyAwMDowMDowMFxuICovXG5mdW5jdGlvbiBhZGRNb250aHMoZGF0ZSwgYW1vdW50KSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIE5hTik7XG4gIGlmICghYW1vdW50KSB7XG4gICAgLy8gSWYgMCBtb250aHMsIG5vLW9wIHRvIGF2b2lkIGNoYW5naW5nIHRpbWVzIGluIHRoZSBob3VyIGJlZm9yZSBlbmQgb2YgRFNUXG4gICAgcmV0dXJuIF9kYXRlO1xuICB9XG4gIGNvbnN0IGRheU9mTW9udGggPSBfZGF0ZS5nZXREYXRlKCk7XG5cbiAgLy8gVGhlIEpTIERhdGUgb2JqZWN0IHN1cHBvcnRzIGRhdGUgbWF0aCBieSBhY2NlcHRpbmcgb3V0LW9mLWJvdW5kcyB2YWx1ZXMgZm9yXG4gIC8vIG1vbnRoLCBkYXksIGV0Yy4gRm9yIGV4YW1wbGUsIG5ldyBEYXRlKDIwMjAsIDAsIDApIHJldHVybnMgMzEgRGVjIDIwMTkgYW5kXG4gIC8vIG5ldyBEYXRlKDIwMjAsIDEzLCAxKSByZXR1cm5zIDEgRmViIDIwMjEuICBUaGlzIGlzICphbG1vc3QqIHRoZSBiZWhhdmlvciB3ZVxuICAvLyB3YW50IGV4Y2VwdCB0aGF0IGRhdGVzIHdpbGwgd3JhcCBhcm91bmQgdGhlIGVuZCBvZiBhIG1vbnRoLCBtZWFuaW5nIHRoYXRcbiAgLy8gbmV3IERhdGUoMjAyMCwgMTMsIDMxKSB3aWxsIHJldHVybiAzIE1hciAyMDIxIG5vdCAyOCBGZWIgMjAyMSBhcyBkZXNpcmVkLiBTb1xuICAvLyB3ZSdsbCBkZWZhdWx0IHRvIHRoZSBlbmQgb2YgdGhlIGRlc2lyZWQgbW9udGggYnkgYWRkaW5nIDEgdG8gdGhlIGRlc2lyZWRcbiAgLy8gbW9udGggYW5kIHVzaW5nIGEgZGF0ZSBvZiAwIHRvIGJhY2sgdXAgb25lIGRheSB0byB0aGUgZW5kIG9mIHRoZSBkZXNpcmVkXG4gIC8vIG1vbnRoLlxuICBjb25zdCBlbmRPZkRlc2lyZWRNb250aCA9ICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIF9kYXRlLmdldFRpbWUoKSk7XG4gIGVuZE9mRGVzaXJlZE1vbnRoLnNldE1vbnRoKF9kYXRlLmdldE1vbnRoKCkgKyBhbW91bnQgKyAxLCAwKTtcbiAgY29uc3QgZGF5c0luTW9udGggPSBlbmRPZkRlc2lyZWRNb250aC5nZXREYXRlKCk7XG4gIGlmIChkYXlPZk1vbnRoID49IGRheXNJbk1vbnRoKSB7XG4gICAgLy8gSWYgd2UncmUgYWxyZWFkeSBhdCB0aGUgZW5kIG9mIHRoZSBtb250aCwgdGhlbiB0aGlzIGlzIHRoZSBjb3JyZWN0IGRhdGVcbiAgICAvLyBhbmQgd2UncmUgZG9uZS5cbiAgICByZXR1cm4gZW5kT2ZEZXNpcmVkTW9udGg7XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlLCB3ZSBub3cga25vdyB0aGF0IHNldHRpbmcgdGhlIG9yaWdpbmFsIGRheS1vZi1tb250aCB2YWx1ZSB3b24ndFxuICAgIC8vIGNhdXNlIGFuIG92ZXJmbG93LCBzbyBzZXQgdGhlIGRlc2lyZWQgZGF5LW9mLW1vbnRoLiBOb3RlIHRoYXQgd2UgY2FuJ3RcbiAgICAvLyBqdXN0IHNldCB0aGUgZGF0ZSBvZiBgZW5kT2ZEZXNpcmVkTW9udGhgIGJlY2F1c2UgdGhhdCBvYmplY3QgbWF5IGhhdmUgaGFkXG4gICAgLy8gaXRzIHRpbWUgY2hhbmdlZCBpbiB0aGUgdW51c3VhbCBjYXNlIHdoZXJlIHdoZXJlIGEgRFNUIHRyYW5zaXRpb24gd2FzIG9uXG4gICAgLy8gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCBhbmQgaXRzIGxvY2FsIHRpbWUgd2FzIGluIHRoZSBob3VyIHNraXBwZWQgb3JcbiAgICAvLyByZXBlYXRlZCBuZXh0IHRvIGEgRFNUIHRyYW5zaXRpb24uICBTbyB3ZSB1c2UgYGRhdGVgIGluc3RlYWQgd2hpY2ggaXNcbiAgICAvLyBndWFyYW50ZWVkIHRvIHN0aWxsIGhhdmUgdGhlIG9yaWdpbmFsIHRpbWUuXG4gICAgX2RhdGUuc2V0RnVsbFllYXIoXG4gICAgICBlbmRPZkRlc2lyZWRNb250aC5nZXRGdWxsWWVhcigpLFxuICAgICAgZW5kT2ZEZXNpcmVkTW9udGguZ2V0TW9udGgoKSxcbiAgICAgIGRheU9mTW9udGgsXG4gICAgKTtcbiAgICByZXR1cm4gX2RhdGU7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRRdWFydGVycyA9IGFkZFF1YXJ0ZXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZE1vbnRocy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRRdWFydGVyc1xuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXIgcXVhcnRlcnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhciBxdWFydGVycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHF1YXJ0ZXJzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBxdWFydGVycyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMSBxdWFydGVyIHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRRdWFydGVycyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMSlcbiAqIC8vPT4gTW9uIERlYyAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIGFkZFF1YXJ0ZXJzKGRhdGUsIGFtb3VudCkge1xuICBjb25zdCBtb250aHMgPSBhbW91bnQgKiAzO1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRNb250aHMpKGRhdGUsIG1vbnRocyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkU2Vjb25kcyA9IGFkZFNlY29uZHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTWlsbGlzZWNvbmRzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZFNlY29uZHNcbiAqIEBjYXRlZ29yeSBTZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHNlY29uZHMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHNlY29uZHMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDMwIHNlY29uZHMgdG8gMTAgSnVseSAyMDE0IDEyOjQ1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gYWRkU2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAwKSwgMzApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjo0NTozMFxuICovXG5mdW5jdGlvbiBhZGRTZWNvbmRzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRNaWxsaXNlY29uZHMpKGRhdGUsIGFtb3VudCAqIDEwMDApO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZFdlZWtzID0gYWRkV2Vla3M7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkRGF5cy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRXZWVrc1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiB3ZWVrcyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgd2Vla3MgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDQgd2Vla3MgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFdlZWtzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA0KVxuICogLy89PiBNb24gU2VwIDI5IDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkV2Vla3MoZGF0ZSwgYW1vdW50KSB7XG4gIGNvbnN0IGRheXMgPSBhbW91bnQgKiA3O1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGREYXlzKShkYXRlLCBkYXlzKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRZZWFycyA9IGFkZFllYXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZE1vbnRocy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRZZWFyc1xuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgeWVhcnMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHllYXJzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA1IHllYXJzIHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRZZWFycyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgNSlcbiAqIC8vPT4gU3VuIFNlcCAwMSAyMDE5IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIGFkZFllYXJzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRNb250aHMpKGRhdGUsIGFtb3VudCAqIDEyKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZWNvbmRzSW5ZZWFyID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5XZWVrID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5RdWFydGVyID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5Nb250aCA9XG4gIGV4cG9ydHMuc2Vjb25kc0luTWludXRlID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5Ib3VyID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5EYXkgPVxuICBleHBvcnRzLnF1YXJ0ZXJzSW5ZZWFyID1cbiAgZXhwb3J0cy5tb250aHNJblllYXIgPVxuICBleHBvcnRzLm1vbnRoc0luUXVhcnRlciA9XG4gIGV4cG9ydHMubWludXRlc0luWWVhciA9XG4gIGV4cG9ydHMubWludXRlc0luTW9udGggPVxuICBleHBvcnRzLm1pbnV0ZXNJbkhvdXIgPVxuICBleHBvcnRzLm1pbnV0ZXNJbkRheSA9XG4gIGV4cG9ydHMubWluVGltZSA9XG4gIGV4cG9ydHMubWlsbGlzZWNvbmRzSW5XZWVrID1cbiAgZXhwb3J0cy5taWxsaXNlY29uZHNJblNlY29uZCA9XG4gIGV4cG9ydHMubWlsbGlzZWNvbmRzSW5NaW51dGUgPVxuICBleHBvcnRzLm1pbGxpc2Vjb25kc0luSG91ciA9XG4gIGV4cG9ydHMubWlsbGlzZWNvbmRzSW5EYXkgPVxuICBleHBvcnRzLm1heFRpbWUgPVxuICBleHBvcnRzLmRheXNJblllYXIgPVxuICBleHBvcnRzLmRheXNJbldlZWsgPVxuICAgIHZvaWQgMDsgLyoqXG4gKiBAbW9kdWxlIGNvbnN0YW50c1xuICogQHN1bW1hcnkgVXNlZnVsIGNvbnN0YW50c1xuICogQGRlc2NyaXB0aW9uXG4gKiBDb2xsZWN0aW9uIG9mIHVzZWZ1bCBkYXRlIGNvbnN0YW50cy5cbiAqXG4gKiBUaGUgY29uc3RhbnRzIGNvdWxkIGJlIGltcG9ydGVkIGZyb20gYGRhdGUtZm5zL2NvbnN0YW50c2A6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IG1heFRpbWUsIG1pblRpbWUgfSBmcm9tIFwiZGF0ZS1mbnMvY29uc3RhbnRzXCI7XG4gKlxuICogZnVuY3Rpb24gaXNBbGxvd2VkVGltZSh0aW1lKSB7XG4gKiAgIHJldHVybiB0aW1lIDw9IG1heFRpbWUgJiYgdGltZSA+PSBtaW5UaW1lO1xuICogfVxuICogYGBgXG4gKi9cblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIGRheXNJbldlZWtcbiAqIEBzdW1tYXJ5IERheXMgaW4gMSB3ZWVrLlxuICovXG5jb25zdCBkYXlzSW5XZWVrID0gKGV4cG9ydHMuZGF5c0luV2VlayA9IDcpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgZGF5c0luWWVhclxuICogQHN1bW1hcnkgRGF5cyBpbiAxIHllYXIuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIb3cgbWFueSBkYXlzIGluIGEgeWVhci5cbiAqXG4gKiBPbmUgeWVhcnMgZXF1YWxzIDM2NS4yNDI1IGRheXMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOlxuICpcbiAqID4gTGVhcCB5ZWFyIG9jY3VyZXMgZXZlcnkgNCB5ZWFycywgZXhjZXB0IGZvciB5ZWFycyB0aGF0IGFyZSBkaXZpc2FibGUgYnkgMTAwIGFuZCBub3QgZGl2aXNhYmxlIGJ5IDQwMC5cbiAqID4gMSBtZWFuIHllYXIgPSAoMzY1KzEvNC0xLzEwMCsxLzQwMCkgZGF5cyA9IDM2NS4yNDI1IGRheXNcbiAqL1xuY29uc3QgZGF5c0luWWVhciA9IChleHBvcnRzLmRheXNJblllYXIgPSAzNjUuMjQyNSk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtYXhUaW1lXG4gKiBAc3VtbWFyeSBNYXhpbXVtIGFsbG93ZWQgdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbWF4VGltZSB9IGZyb20gXCJkYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBjb25zdCBpc1ZhbGlkID0gODY0MDAwMDAwMDAwMDAwMSA8PSBtYXhUaW1lO1xuICogLy89PiBmYWxzZVxuICpcbiAqIG5ldyBEYXRlKDg2NDAwMDAwMDAwMDAwMDEpO1xuICogLy89PiBJbnZhbGlkIERhdGVcbiAqL1xuY29uc3QgbWF4VGltZSA9IChleHBvcnRzLm1heFRpbWUgPSBNYXRoLnBvdygxMCwgOCkgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pblRpbWVcbiAqIEBzdW1tYXJ5IE1pbmltdW0gYWxsb3dlZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBtaW5UaW1lIH0gZnJvbSBcImRhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGNvbnN0IGlzVmFsaWQgPSAtODY0MDAwMDAwMDAwMDAwMSA+PSBtaW5UaW1lO1xuICogLy89PiBmYWxzZVxuICpcbiAqIG5ldyBEYXRlKC04NjQwMDAwMDAwMDAwMDAxKVxuICogLy89PiBJbnZhbGlkIERhdGVcbiAqL1xuY29uc3QgbWluVGltZSA9IChleHBvcnRzLm1pblRpbWUgPSAtbWF4VGltZSk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbldlZWtcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIHdlZWsuXG4gKi9cbmNvbnN0IG1pbGxpc2Vjb25kc0luV2VlayA9IChleHBvcnRzLm1pbGxpc2Vjb25kc0luV2VlayA9IDYwNDgwMDAwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbkRheVxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgZGF5LlxuICovXG5jb25zdCBtaWxsaXNlY29uZHNJbkRheSA9IChleHBvcnRzLm1pbGxpc2Vjb25kc0luRGF5ID0gODY0MDAwMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5NaW51dGVcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIG1pbnV0ZVxuICovXG5jb25zdCBtaWxsaXNlY29uZHNJbk1pbnV0ZSA9IChleHBvcnRzLm1pbGxpc2Vjb25kc0luTWludXRlID0gNjAwMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5Ib3VyXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBob3VyXG4gKi9cbmNvbnN0IG1pbGxpc2Vjb25kc0luSG91ciA9IChleHBvcnRzLm1pbGxpc2Vjb25kc0luSG91ciA9IDM2MDAwMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5TZWNvbmRcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIHNlY29uZFxuICovXG5jb25zdCBtaWxsaXNlY29uZHNJblNlY29uZCA9IChleHBvcnRzLm1pbGxpc2Vjb25kc0luU2Vjb25kID0gMTAwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5ZZWFyXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgeWVhci5cbiAqL1xuY29uc3QgbWludXRlc0luWWVhciA9IChleHBvcnRzLm1pbnV0ZXNJblllYXIgPSA1MjU2MDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luTW9udGhcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSBtb250aC5cbiAqL1xuY29uc3QgbWludXRlc0luTW9udGggPSAoZXhwb3J0cy5taW51dGVzSW5Nb250aCA9IDQzMjAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbkRheVxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIGRheS5cbiAqL1xuY29uc3QgbWludXRlc0luRGF5ID0gKGV4cG9ydHMubWludXRlc0luRGF5ID0gMTQ0MCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5Ib3VyXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgaG91ci5cbiAqL1xuY29uc3QgbWludXRlc0luSG91ciA9IChleHBvcnRzLm1pbnV0ZXNJbkhvdXIgPSA2MCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtb250aHNJblF1YXJ0ZXJcbiAqIEBzdW1tYXJ5IE1vbnRocyBpbiAxIHF1YXJ0ZXIuXG4gKi9cbmNvbnN0IG1vbnRoc0luUXVhcnRlciA9IChleHBvcnRzLm1vbnRoc0luUXVhcnRlciA9IDMpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbW9udGhzSW5ZZWFyXG4gKiBAc3VtbWFyeSBNb250aHMgaW4gMSB5ZWFyLlxuICovXG5jb25zdCBtb250aHNJblllYXIgPSAoZXhwb3J0cy5tb250aHNJblllYXIgPSAxMik7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBxdWFydGVyc0luWWVhclxuICogQHN1bW1hcnkgUXVhcnRlcnMgaW4gMSB5ZWFyXG4gKi9cbmNvbnN0IHF1YXJ0ZXJzSW5ZZWFyID0gKGV4cG9ydHMucXVhcnRlcnNJblllYXIgPSA0KTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbkhvdXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBob3VyLlxuICovXG5jb25zdCBzZWNvbmRzSW5Ib3VyID0gKGV4cG9ydHMuc2Vjb25kc0luSG91ciA9IDM2MDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luTWludXRlXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgbWludXRlLlxuICovXG5jb25zdCBzZWNvbmRzSW5NaW51dGUgPSAoZXhwb3J0cy5zZWNvbmRzSW5NaW51dGUgPSA2MCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5EYXlcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBkYXkuXG4gKi9cbmNvbnN0IHNlY29uZHNJbkRheSA9IChleHBvcnRzLnNlY29uZHNJbkRheSA9IHNlY29uZHNJbkhvdXIgKiAyNCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5XZWVrXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgd2Vlay5cbiAqL1xuY29uc3Qgc2Vjb25kc0luV2VlayA9IChleHBvcnRzLnNlY29uZHNJbldlZWsgPSBzZWNvbmRzSW5EYXkgKiA3KTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblllYXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSB5ZWFyLlxuICovXG5jb25zdCBzZWNvbmRzSW5ZZWFyID0gKGV4cG9ydHMuc2Vjb25kc0luWWVhciA9IHNlY29uZHNJbkRheSAqIGRheXNJblllYXIpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luTW9udGhcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBtb250aFxuICovXG5jb25zdCBzZWNvbmRzSW5Nb250aCA9IChleHBvcnRzLnNlY29uZHNJbk1vbnRoID0gc2Vjb25kc0luWWVhciAvIDEyKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblF1YXJ0ZXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBxdWFydGVyLlxuICovXG5jb25zdCBzZWNvbmRzSW5RdWFydGVyID0gKGV4cG9ydHMuc2Vjb25kc0luUXVhcnRlciA9IHNlY29uZHNJbk1vbnRoICogMyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuY29uc3RydWN0RnJvbSA9IGNvbnN0cnVjdEZyb207XG5cbi8qKlxuICogQG5hbWUgY29uc3RydWN0RnJvbVxuICogQGNhdGVnb3J5IEdlbmVyaWMgSGVscGVyc1xuICogQHN1bW1hcnkgQ29uc3RydWN0cyBhIGRhdGUgdXNpbmcgdGhlIHJlZmVyZW5jZSBkYXRlIGFuZCB0aGUgdmFsdWVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBmdW5jdGlvbiBjb25zdHJ1Y3RzIGEgbmV3IGRhdGUgdXNpbmcgdGhlIGNvbnN0cnVjdG9yIGZyb20gdGhlIHJlZmVyZW5jZVxuICogZGF0ZSBhbmQgdGhlIGdpdmVuIHZhbHVlLiBJdCBoZWxwcyB0byBidWlsZCBnZW5lcmljIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdFxuICogZGF0ZSBleHRlbnNpb25zLlxuICpcbiAqIEl0IGRlZmF1bHRzIHRvIGBEYXRlYCBpZiB0aGUgcGFzc2VkIHJlZmVyZW5jZSBkYXRlIGlzIGEgbnVtYmVyIG9yIGEgc3RyaW5nLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRha2UgY29uc3RydWN0b3IgZnJvbVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNyZWF0ZSB0aGUgZGF0ZVxuICpcbiAqIEByZXR1cm5zIERhdGUgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlIGdpdmVuIGRhdGUgYW5kIHZhbHVlXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tICdkYXRlLWZucydcbiAqXG4gKiAvLyBBIGZ1bmN0aW9uIHRoYXQgY2xvbmVzIGEgZGF0ZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCB0eXBlXG4gKiBmdW5jdGlvbiBjbG9uZURhdGU8RGF0ZVR5cGUgZXh0ZW5kcyBEYXRlKGRhdGU6IERhdGVUeXBlKTogRGF0ZVR5cGUge1xuICogICByZXR1cm4gY29uc3RydWN0RnJvbShcbiAqICAgICBkYXRlLCAvLyBVc2UgY29udHJ1c3RvciBmcm9tIHRoZSBnaXZlbiBkYXRlXG4gKiAgICAgZGF0ZS5nZXRUaW1lKCkgLy8gVXNlIHRoZSBkYXRlIHZhbHVlIHRvIGNyZWF0ZSBhIG5ldyBkYXRlXG4gKiAgIClcbiAqIH1cbiAqL1xuZnVuY3Rpb24gY29uc3RydWN0RnJvbShkYXRlLCB2YWx1ZSkge1xuICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gbmV3IGRhdGUuY29uc3RydWN0b3IodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zdGFydE9mRGF5LmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHRpbWVzIGFyZSByZW1vdmVkXG4gKiBmcm9tIHRoZSBkYXRlcyBhbmQgdGhlbiB0aGUgZGlmZmVyZW5jZSBpbiBkYXlzIGlzIGNhbGN1bGF0ZWQuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgZWFybGllciBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjAwOjAwIGFuZCAyIEp1bHkgMjAxMiAwMDowMDowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMiwgNiwgMiwgMCwgMCksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCAwKVxuICogKVxuICogLy89PiAzNjZcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjU5OjAwIGFuZCAzIEp1bHkgMjAxMSAwMDowMTowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMywgMCwgMSksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCA1OSlcbiAqIClcbiAqIC8vPT4gMVxuICovXG5mdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBzdGFydE9mRGF5TGVmdCA9ICgwLCBfaW5kZXgyLnN0YXJ0T2ZEYXkpKGRhdGVMZWZ0KTtcbiAgY29uc3Qgc3RhcnRPZkRheVJpZ2h0ID0gKDAsIF9pbmRleDIuc3RhcnRPZkRheSkoZGF0ZVJpZ2h0KTtcblxuICBjb25zdCB0aW1lc3RhbXBMZWZ0ID1cbiAgICArc3RhcnRPZkRheUxlZnQgLVxuICAgICgwLCBfaW5kZXgzLmdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMpKHN0YXJ0T2ZEYXlMZWZ0KTtcbiAgY29uc3QgdGltZXN0YW1wUmlnaHQgPVxuICAgICtzdGFydE9mRGF5UmlnaHQgLVxuICAgICgwLCBfaW5kZXgzLmdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMpKHN0YXJ0T2ZEYXlSaWdodCk7XG5cbiAgLy8gUm91bmQgdGhlIG51bWJlciBvZiBkYXlzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIGRheSBpcyBub3QgY29uc3RhbnQgKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2ZcbiAgLy8gdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KS5cbiAgcmV0dXJuIE1hdGgucm91bmQoXG4gICAgKHRpbWVzdGFtcExlZnQgLSB0aW1lc3RhbXBSaWdodCkgLyBfaW5kZXgubWlsbGlzZWNvbmRzSW5EYXksXG4gICk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgZWFybGllciBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgbW9udGhzIGFyZSBiZXR3ZWVuIDMxIEphbnVhcnkgMjAxNCBhbmQgMSBTZXB0ZW1iZXIgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKFxuICogICBuZXcgRGF0ZSgyMDE0LCA4LCAxKSxcbiAqICAgbmV3IERhdGUoMjAxNCwgMCwgMzEpXG4gKiApXG4gKiAvLz0+IDhcbiAqL1xuZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZUxlZnQpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVSaWdodCk7XG5cbiAgY29uc3QgeWVhckRpZmYgPSBfZGF0ZUxlZnQuZ2V0RnVsbFllYXIoKSAtIF9kYXRlUmlnaHQuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGhEaWZmID0gX2RhdGVMZWZ0LmdldE1vbnRoKCkgLSBfZGF0ZVJpZ2h0LmdldE1vbnRoKCk7XG5cbiAgcmV0dXJuIHllYXJEaWZmICogMTIgKyBtb250aERpZmY7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vZ2V0UXVhcnRlci5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnNcbiAqIEBjYXRlZ29yeSBRdWFydGVyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHF1YXJ0ZXJzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgcXVhcnRlcnMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgZWFybGllciBkYXRlXG5cbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgY2FsZW5kYXIgcXVhcnRlcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgcXVhcnRlcnMgYXJlIGJldHdlZW4gMzEgRGVjZW1iZXIgMjAxMyBhbmQgMiBKdWx5IDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzKFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCAyKSxcbiAqICAgbmV3IERhdGUoMjAxMywgMTEsIDMxKVxuICogKVxuICogLy89PiAzXG4gKi9cbmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGVMZWZ0KTtcbiAgY29uc3QgX2RhdGVSaWdodCA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZVJpZ2h0KTtcblxuICBjb25zdCB5ZWFyRGlmZiA9IF9kYXRlTGVmdC5nZXRGdWxsWWVhcigpIC0gX2RhdGVSaWdodC5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBxdWFydGVyRGlmZiA9XG4gICAgKDAsIF9pbmRleC5nZXRRdWFydGVyKShfZGF0ZUxlZnQpIC0gKDAsIF9pbmRleC5nZXRRdWFydGVyKShfZGF0ZVJpZ2h0KTtcblxuICByZXR1cm4geWVhckRpZmYgKiA0ICsgcXVhcnRlckRpZmY7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnNcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHllYXJzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgeWVhcnMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgZWFybGllciBkYXRlXG5cbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgY2FsZW5kYXIgeWVhcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgeWVhcnMgYXJlIGJldHdlZW4gMzEgRGVjZW1iZXIgMjAxMyBhbmQgMTEgRmVicnVhcnkgMjAxNT9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMoXG4gKiAgIG5ldyBEYXRlKDIwMTUsIDEsIDExKSxcbiAqICAgbmV3IERhdGUoMjAxMywgMTEsIDMxKVxuICogKVxuICogLy89PiAyXG4gKi9cbmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZUxlZnQpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVSaWdodCk7XG5cbiAgcmV0dXJuIF9kYXRlTGVmdC5nZXRGdWxsWWVhcigpIC0gX2RhdGVSaWdodC5nZXRGdWxsWWVhcigpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmVuZE9mRGF5ID0gZW5kT2ZEYXk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mRGF5XG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZW5kIG9mIGEgZGF5IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgZGF5IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBlbmQgb2YgYSBkYXlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIGVuZCBvZiBhIGRheSBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFR1ZSBTZXAgMDIgMjAxNCAyMzo1OTo1OS45OTlcbiAqL1xuZnVuY3Rpb24gZW5kT2ZEYXkoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmVuZE9mTW9udGggPSBlbmRPZk1vbnRoO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBlbmRPZk1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGVuZCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBlbmQgb2YgYSBtb250aFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgbW9udGggZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBlbmRPZk1vbnRoKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFR1ZSBTZXAgMzAgMjAxNCAyMzo1OTo1OS45OTlcbiAqL1xuZnVuY3Rpb24gZW5kT2ZNb250aChkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBtb250aCA9IF9kYXRlLmdldE1vbnRoKCk7XG4gIF9kYXRlLnNldEZ1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoICsgMSwgMCk7XG4gIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5lbmRPZldlZWsgPSBlbmRPZldlZWs7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIik7XG5cbi8qKlxuICogVGhlIHtAbGluayBlbmRPZldlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBlbmRPZldlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZW5kIG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGVuZCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgZW5kIG9mIGEgd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBTYXQgU2VwIDA2IDIwMTQgMjM6NTk6NTkuOTk5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksIHRoZSBlbmQgb2YgdGhlIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBlbmRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSwgeyB3ZWVrU3RhcnRzT246IDEgfSlcbiAqIC8vPT4gU3VuIFNlcCAwNyAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5mdW5jdGlvbiBlbmRPZldlZWsoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9ICgwLCBfaW5kZXgyLmdldERlZmF1bHRPcHRpb25zKSgpO1xuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTtcbiAgY29uc3QgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyAtNyA6IDApICsgNiAtIChkYXkgLSB3ZWVrU3RhcnRzT24pO1xuXG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgZGlmZik7XG4gIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5lbmRPZlllYXIgPSBlbmRPZlllYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZW5kIG9mIGEgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgeWVhciBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mWWVhcihuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDAwKSlcbiAqIC8vPT4gV2VkIERlYyAzMSAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5mdW5jdGlvbiBlbmRPZlllYXIoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG4gIF9kYXRlLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCAwKTtcbiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmZvcm1hdCA9IGV4cG9ydHMuZm9ybWF0RGF0ZSA9IGZvcm1hdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZvcm1hdHRlcnNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2luZGV4My5mb3JtYXR0ZXJzO1xuICB9LFxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJsb25nRm9ybWF0dGVyc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfaW5kZXg0LmxvbmdGb3JtYXR0ZXJzO1xuICB9LFxufSk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0TG9jYWxlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzLmpzXCIpO1xudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qc1wiKTtcbnZhciBfaW5kZXg1ID0gcmVxdWlyZShcIi4vX2xpYi9wcm90ZWN0ZWRUb2tlbnMuanNcIik7XG5cbnZhciBfaW5kZXg2ID0gcmVxdWlyZShcIi4vaXNWYWxpZC5qc1wiKTtcbnZhciBfaW5kZXg3ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vLyBSZXhwb3J0cyBvZiBpbnRlcm5hbCBmb3IgbGlicmFyaWVzIHRvIHVzZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNjM4I2lzc3VlY29tbWVudC0xODc3MDgyODc0XG5cbi8vIFRoaXMgUmVnRXhwIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzIHNlcGFyYXRlZCBieSBgfGA6XG4vLyAtIFt5WVFxTUx3SWREZWNpaEhLa21zXW8gbWF0Y2hlcyBhbnkgYXZhaWxhYmxlIG9yZGluYWwgbnVtYmVyIHRva2VuXG4vLyAgIChvbmUgb2YgdGhlIGNlcnRhaW4gbGV0dGVycyBmb2xsb3dlZCBieSBgb2ApXG4vLyAtIChcXHcpXFwxKiBtYXRjaGVzIGFueSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgbGV0dGVyXG4vLyAtICcnIG1hdGNoZXMgdHdvIHF1b3RlIGNoYXJhY3RlcnMgaW4gYSByb3dcbi8vIC0gJygnJ3xbXiddKSsoJ3wkKSBtYXRjaGVzIGFueXRoaW5nIHN1cnJvdW5kZWQgYnkgdHdvIHF1b3RlIGNoYXJhY3RlcnMgKCcpLFxuLy8gICBleGNlcHQgYSBzaW5nbGUgcXVvdGUgc3ltYm9sLCB3aGljaCBlbmRzIHRoZSBzZXF1ZW5jZS5cbi8vICAgVHdvIHF1b3RlIGNoYXJhY3RlcnMgZG8gbm90IGVuZCB0aGUgc2VxdWVuY2UuXG4vLyAgIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHNpbmdsZSBxdW90ZVxuLy8gICB0aGVuIHRoZSBzZXF1ZW5jZSB3aWxsIGNvbnRpbnVlIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0cmluZy5cbi8vIC0gLiBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyIHVubWF0Y2hlZCBieSBwcmV2aW91cyBwYXJ0cyBvZiB0aGUgUmVnRXhwc1xuY29uc3QgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9XG4gIC9beVlRcU1Md0lkRGVjaWhIS2ttc11vfChcXHcpXFwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuLy8gVGhpcyBSZWdFeHAgY2F0Y2hlcyBzeW1ib2xzIGVzY2FwZWQgYnkgcXVvdGVzLCBhbmQgYWxzb1xuLy8gc2VxdWVuY2VzIG9mIHN5bWJvbHMgUCwgcCwgYW5kIHRoZSBjb21iaW5hdGlvbnMgbGlrZSBgUFBQUFBQUHBwcHBwYFxuY29uc3QgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPSAvUCtwK3xQK3xwK3wnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuY29uc3QgZXNjYXBlZFN0cmluZ1JlZ0V4cCA9IC9eJyhbXl0qPyknPyQvO1xuY29uc3QgZG91YmxlUXVvdGVSZWdFeHAgPSAvJycvZztcbmNvbnN0IHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwID0gL1thLXpBLVpdLztcblxuLyoqXG4gKiBUaGUge0BsaW5rIGZvcm1hdH0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGZvcm1hdFxuICogQGFsaWFzIGZvcm1hdERhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgRm9ybWF0IHRoZSBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcgaW4gdGhlIGdpdmVuIGZvcm1hdC4gVGhlIHJlc3VsdCBtYXkgdmFyeSBieSBsb2NhbGUuXG4gKlxuICogPiDimqDvuI8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgYGZvcm1hdGAgdG9rZW5zIGRpZmZlciBmcm9tIE1vbWVudC5qcyBhbmQgb3RoZXIgbGlicmFyaWVzLlxuICogPiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiBUaGUgY2hhcmFjdGVycyB3cmFwcGVkIGJldHdlZW4gdHdvIHNpbmdsZSBxdW90ZXMgY2hhcmFjdGVycyAoJykgYXJlIGVzY2FwZWQuXG4gKiBUd28gc2luZ2xlIHF1b3RlcyBpbiBhIHJvdywgd2hldGhlciBpbnNpZGUgb3Igb3V0c2lkZSBhIHF1b3RlZCBzZXF1ZW5jZSwgcmVwcmVzZW50IGEgJ3JlYWwnIHNpbmdsZSBxdW90ZS5cbiAqIChzZWUgdGhlIGxhc3QgZXhhbXBsZSlcbiAqXG4gKiBGb3JtYXQgb2YgdGhlIHN0cmluZyBpcyBiYXNlZCBvbiBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzU6XG4gKiBodHRwczovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS1kYXRlcy5odG1sI0RhdGVfRmllbGRfU3ltYm9sX1RhYmxlXG4gKiB3aXRoIGEgZmV3IGFkZGl0aW9ucyAoc2VlIG5vdGUgNyBiZWxvdyB0aGUgdGFibGUpLlxuICpcbiAqIEFjY2VwdGVkIHBhdHRlcm5zOlxuICogfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUGF0dGVybiB8IFJlc3VsdCBleGFtcGxlcyAgICAgICAgICAgICAgICAgICB8IE5vdGVzIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS18XG4gKiB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHLi5HR0cgIHwgQUQsIEJDICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR0dHRyAgICB8IEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0ICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0dHICAgfCBBLCBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IENhbGVuZGFyIHllYXIgICAgICAgICAgICAgICAgICAgfCB5ICAgICAgIHwgNDQsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeW8gICAgICB8IDQ0dGgsIDFzdCwgMHRoLCAxN3RoICAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5ICAgICAgfCA0NCwgMDEsIDAwLCAxNyAgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXkgICAgIHwgMDQ0LCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5eSAgICB8IDAwNDQsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXl5ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgfCBZICAgICAgIHwgNDQsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWW8gICAgICB8IDQ0dGgsIDFzdCwgMTkwMHRoLCAyMDE3dGggICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZICAgICAgfCA0NCwgMDEsIDAwLCAxNyAgICAgICAgICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVkgICAgIHwgMDQ0LCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZWSAgICB8IDAwNDQsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICB8IDUsOCAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVlZICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICAgfCBSICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlIgICAgICB8IC00MywgMDAsIDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUiAgICAgfCAtMDQzLCAwMDAsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlJSICAgIHwgLTAwNDMsIDAwMDAsIDAwMDEsIDE5MDAsIDIwMTcgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUlIgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSw3IHxcbiAqIHwgRXh0ZW5kZWQgeWVhciAgICAgICAgICAgICAgICAgICB8IHUgICAgICAgfCAtNDMsIDAsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dSAgICAgIHwgLTQzLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1ICAgICB8IC0wNDMsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dXUgICAgfCAtMDA0MywgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1dSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBRdWFydGVyIChmb3JtYXR0aW5nKSAgICAgICAgICAgIHwgUSAgICAgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFvICAgICAgfCAxc3QsIDJuZCwgM3JkLCA0dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUSAgICAgIHwgMDEsIDAyLCAwMywgMDQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRICAgICB8IFExLCBRMiwgUTMsIFE0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUVEgICAgfCAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRUSAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCBRdWFydGVyIChzdGFuZC1hbG9uZSkgICAgICAgICAgIHwgcSAgICAgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFvICAgICAgfCAxc3QsIDJuZCwgM3JkLCA0dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcSAgICAgIHwgMDEsIDAyLCAwMywgMDQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxICAgICB8IFExLCBRMiwgUTMsIFE0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcXEgICAgfCAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxcSAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCBNb250aCAoZm9ybWF0dGluZykgICAgICAgICAgICAgIHwgTSAgICAgICB8IDEsIDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1vICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMnRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTSAgICAgIHwgMDEsIDAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NICAgICB8IEphbiwgRmViLCAuLi4sIERlYyAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTU0gICAgfCBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlciAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NTSAgIHwgSiwgRiwgLi4uLCBEICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNb250aCAoc3RhbmQtYWxvbmUpICAgICAgICAgICAgIHwgTCAgICAgICB8IDEsIDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMnRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTCAgICAgIHwgMDEsIDAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMICAgICB8IEphbiwgRmViLCAuLi4sIERlYyAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTEwgICAgfCBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlciAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMTCAgIHwgSiwgRiwgLi4uLCBEICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgIHwgdyAgICAgICB8IDEsIDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA1M3RoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3dyAgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBJU08gd2VlayBvZiB5ZWFyICAgICAgICAgICAgICAgIHwgSSAgICAgICB8IDEsIDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA1M3RoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJSSAgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgIHwgZCAgICAgICB8IDEsIDIsIC4uLiwgMzEgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAzMXN0ICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkZCAgICAgIHwgMDEsIDAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBEYXkgb2YgeWVhciAgICAgICAgICAgICAgICAgICAgIHwgRCAgICAgICB8IDEsIDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAzNjV0aCwgMzY2dGggICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBERCAgICAgIHwgMDEsIDAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgIHwgOSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREREICAgICB8IDAwMSwgMDAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEREREQgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzICAgICB8XG4gKiB8IERheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICAgICAgfCBFLi5FRUUgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUVFICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRUUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBJU08gZGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICAgIHwgaSAgICAgICB8IDEsIDIsIDMsIC4uLiwgNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA3dGggICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaSAgICAgIHwgMDEsIDAyLCAuLi4sIDA3ICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWkgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyLDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpaSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWlpICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8IDcgICAgIHxcbiAqIHwgTG9jYWwgZGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICB8IGUgICAgICAgfCAyLCAzLCA0LCAuLi4sIDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlbyAgICAgIHwgMm5kLCAzcmQsIC4uLiwgMXN0ICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWUgICAgICB8IDAyLCAwMywgLi4uLCAwMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZWUgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlZSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChzdGFuZC1hbG9uZSkgfCBjICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY28gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2MgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjYyAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2NjICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjY2MgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgYS4uYWEgICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYSAgICAgfCBhbSwgcG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWFhICAgIHwgYS5tLiwgcC5tLiAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYWEgICB8IGEsIHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICB8IGIuLmJiICAgfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmIgICAgIHwgYW0sIHBtLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiYiAgICB8IGEubS4sIHAubS4sIG5vb24sIG1pZG5pZ2h0ICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmJiICAgfCBhLCBwLCBuLCBtaSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICAgfCBCLi5CQkIgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQkJCQiAgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkJCICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICAgfCBoICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDEydGggICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhoICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICAgfCBIICAgICAgIHwgMCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSG8gICAgICB8IDB0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhIICAgICAgfCAwMCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICAgfCBLICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMCAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDB0aCAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtLICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICAgfCBrICAgICAgIHwgMjQsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga28gICAgICB8IDI0dGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtrICAgICAgfCAyNCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW8gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1tICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc28gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNzICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICAgfCBTICAgICAgIHwgMCwgMSwgLi4uLCA5ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1MgICAgICB8IDAwLCAwMSwgLi4uLCA5OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTUyAgICAgfCAwMDAsIDAwMSwgLi4uLCA5OTkgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1NTICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy8gWikgICAgICAgIHwgWCAgICAgICB8IC0wOCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYICAgICAgfCAtMDgwMCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFggICAgIHwgLTA4OjAwLCArMDU6MzAsIFogICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYWCAgICB8IC0wODAwLCArMDUzMCwgWiwgKzEyMzQ1NiAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFhYICAgfCAtMDg6MDAsICswNTozMCwgWiwgKzEyOjM0OjU2ICAgICAgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICAgfCB4ICAgICAgIHwgLTA4LCArMDUzMCwgKzAwICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHggICAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eCAgICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHh4ICAgIHwgLTA4MDAsICswNTMwLCArMDAwMCwgKzEyMzQ1NiAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eHggICB8IC0wODowMCwgKzA1OjMwLCArMDA6MDAsICsxMjozNDo1NiB8ICAgICAgIHxcbiAqIHwgVGltZXpvbmUgKEdNVCkgICAgICAgICAgICAgICAgICB8IE8uLi5PT08gfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPT09PICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiAgICAgfFxuICogfCBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0LikgIHwgei4uLnp6eiB8IEdNVC04LCBHTVQrNTozMCwgR01UKzAgICAgICAgICAgICB8IDYgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHp6enogICAgfCBHTVQtMDg6MDAsIEdNVCswNTozMCwgR01UKzAwOjAwICAgfCAyLDYgICB8XG4gKiB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICAgfCB0ICAgICAgIHwgNTEyOTY5NTIwICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICB8IFQgICAgICAgfCA1MTI5Njk1MjA5MDAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw3ICAgfFxuICogfCBMb25nIGxvY2FsaXplZCBkYXRlICAgICAgICAgICAgIHwgUCAgICAgICB8IDA0LzI5LzE0NTMgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQICAgICAgfCBBcHIgMjksIDE0NTMgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFAgICAgIHwgQXByaWwgMjl0aCwgMTQ1MyAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUCAgICB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyAgICAgICAgICB8IDIsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgdGltZSAgICAgICAgICAgICB8IHAgICAgICAgfCAxMjowMCBBTSAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcCAgICAgIHwgMTI6MDA6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHBwICAgICB8IDEyOjAwOjAwIEFNIEdNVCsyICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcHAgICAgfCAxMjowMDowMCBBTSBHTVQrMDI6MDAgICAgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IENvbWJpbmF0aW9uIG9mIGRhdGUgYW5kIHRpbWUgICAgfCBQcCAgICAgIHwgMDQvMjkvMTQ1MywgMTI6MDAgQU0gICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBwcCAgICB8IEFwciAyOSwgMTQ1MywgMTI6MDA6MDAgQU0gICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUHBwcCAgfCBBcHJpbCAyOXRoLCAxNDUzIGF0IC4uLiAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBQcHBwcHwgRnJpZGF5LCBBcHJpbCAyOXRoLCAxNDUzIGF0IC4uLiAgIHwgMiw3ICAgfFxuICogTm90ZXM6XG4gKiAxLiBcIkZvcm1hdHRpbmdcIiB1bml0cyAoZS5nLiBmb3JtYXR0aW5nIHF1YXJ0ZXIpIGluIHRoZSBkZWZhdWx0IGVuLVVTIGxvY2FsZVxuICogICAgYXJlIHRoZSBzYW1lIGFzIFwic3RhbmQtYWxvbmVcIiB1bml0cywgYnV0IGFyZSBkaWZmZXJlbnQgaW4gc29tZSBsYW5ndWFnZXMuXG4gKiAgICBcIkZvcm1hdHRpbmdcIiB1bml0cyBhcmUgZGVjbGluZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgbGFuZ3VhZ2VcbiAqICAgIGluIHRoZSBjb250ZXh0IG9mIGEgZGF0ZS4gXCJTdGFuZC1hbG9uZVwiIHVuaXRzIGFyZSBhbHdheXMgbm9taW5hdGl2ZSBzaW5ndWxhcjpcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ2RvIExMTEwnLCB7bG9jYWxlOiBjc30pIC8vPT4gJzYuIGxpc3RvcGFkJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ2RvIE1NTU0nLCB7bG9jYWxlOiBjc30pIC8vPT4gJzYuIGxpc3RvcGFkdSdgXG4gKlxuICogMi4gQW55IHNlcXVlbmNlIG9mIHRoZSBpZGVudGljYWwgbGV0dGVycyBpcyBhIHBhdHRlcm4sIHVubGVzcyBpdCBpcyBlc2NhcGVkIGJ5XG4gKiAgICB0aGUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgKHNlZSBiZWxvdykuXG4gKiAgICBJZiB0aGUgc2VxdWVuY2UgaXMgbG9uZ2VyIHRoYW4gbGlzdGVkIGluIHRhYmxlIChlLmcuIGBFRUVFRUVFRUVFRWApXG4gKiAgICB0aGUgb3V0cHV0IHdpbGwgYmUgdGhlIHNhbWUgYXMgZGVmYXVsdCBwYXR0ZXJuIGZvciB0aGlzIHVuaXQsIHVzdWFsbHlcbiAqICAgIHRoZSBsb25nZXN0IG9uZSAoaW4gY2FzZSBvZiBJU08gd2Vla2RheXMsIGBFRUVFYCkuIERlZmF1bHQgcGF0dGVybnMgZm9yIHVuaXRzXG4gKiAgICBhcmUgbWFya2VkIHdpdGggXCIyXCIgaW4gdGhlIGxhc3QgY29sdW1uIG9mIHRoZSB0YWJsZS5cbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTScpIC8vPT4gJ05vdidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU0nKSAvLz0+ICdOJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogMy4gU29tZSBwYXR0ZXJucyBjb3VsZCBiZSB1bmxpbWl0ZWQgbGVuZ3RoIChzdWNoIGFzIGB5eXl5eXl5eWApLlxuICogICAgVGhlIG91dHB1dCB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zIHRvIG1hdGNoIHRoZSBsZW5ndGggb2YgdGhlIHBhdHRlcm4uXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICd5eXl5eXl5eScpIC8vPT4gJzAwMDAyMDE3J2BcbiAqXG4gKiA0LiBgUVFRUVFgIGFuZCBgcXFxcXFgIGNvdWxkIGJlIG5vdCBzdHJpY3RseSBudW1lcmljYWwgaW4gc29tZSBsb2NhbGVzLlxuICogICAgVGhlc2UgdG9rZW5zIHJlcHJlc2VudCB0aGUgc2hvcnRlc3QgZm9ybSBvZiB0aGUgcXVhcnRlci5cbiAqXG4gKiA1LiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gYHlgIGFuZCBgdWAgcGF0dGVybnMgYXJlIEIuQy4geWVhcnM6XG4gKlxuICogICAgfCBZZWFyIHwgYHlgIHwgYHVgIHxcbiAqICAgIHwtLS0tLS18LS0tLS18LS0tLS18XG4gKiAgICB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICogICAgfCBCQyAxIHwgICAxIHwgICAwIHxcbiAqICAgIHwgQkMgMiB8ICAgMiB8ICAtMSB8XG4gKlxuICogICAgQWxzbyBgeXlgIGFsd2F5cyByZXR1cm5zIHRoZSBsYXN0IHR3byBkaWdpdHMgb2YgYSB5ZWFyLFxuICogICAgd2hpbGUgYHV1YCBwYWRzIHNpbmdsZSBkaWdpdCB5ZWFycyB0byAyIGNoYXJhY3RlcnMgYW5kIHJldHVybnMgb3RoZXIgeWVhcnMgdW5jaGFuZ2VkOlxuICpcbiAqICAgIHwgWWVhciB8IGB5eWAgfCBgdXVgIHxcbiAqICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLXxcbiAqICAgIHwgMSAgICB8ICAgMDEgfCAgIDAxIHxcbiAqICAgIHwgMTQgICB8ICAgMTQgfCAgIDE0IHxcbiAqICAgIHwgMzc2ICB8ICAgNzYgfCAgMzc2IHxcbiAqICAgIHwgMTQ1MyB8ICAgNTMgfCAxNDUzIHxcbiAqXG4gKiAgICBUaGUgc2FtZSBkaWZmZXJlbmNlIGlzIHRydWUgZm9yIGxvY2FsIGFuZCBJU08gd2Vlay1udW1iZXJpbmcgeWVhcnMgKGBZYCBhbmQgYFJgKSxcbiAqICAgIGV4Y2VwdCBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFycyBhcmUgZGVwZW5kZW50IG9uIGBvcHRpb25zLndlZWtTdGFydHNPbmBcbiAqICAgIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgIChjb21wYXJlIFtnZXRJU09XZWVrWWVhcl0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9nZXRJU09XZWVrWWVhcilcbiAqICAgIGFuZCBbZ2V0V2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0V2Vla1llYXIpKS5cbiAqXG4gKiA2LiBTcGVjaWZpYyBub24tbG9jYXRpb24gdGltZXpvbmVzIGFyZSBjdXJyZW50bHkgdW5hdmFpbGFibGUgaW4gYGRhdGUtZm5zYCxcbiAqICAgIHNvIHJpZ2h0IG5vdyB0aGVzZSB0b2tlbnMgZmFsbCBiYWNrIHRvIEdNVCB0aW1lem9uZXMuXG4gKlxuICogNy4gVGhlc2UgcGF0dGVybnMgYXJlIG5vdCBpbiB0aGUgVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogICAgLSBgaWA6IElTTyBkYXkgb2Ygd2Vla1xuICogICAgLSBgSWA6IElTTyB3ZWVrIG9mIHllYXJcbiAqICAgIC0gYFJgOiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICogICAgLSBgdGA6IHNlY29uZHMgdGltZXN0YW1wXG4gKiAgICAtIGBUYDogbWlsbGlzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgb2A6IG9yZGluYWwgbnVtYmVyIG1vZGlmaWVyXG4gKiAgICAtIGBQYDogbG9uZyBsb2NhbGl6ZWQgZGF0ZVxuICogICAgLSBgcGA6IGxvbmcgbG9jYWxpemVkIHRpbWVcbiAqXG4gKiA4LiBgWVlgIGFuZCBgWVlZWWAgdG9rZW5zIHJlcHJlc2VudCB3ZWVrLW51bWJlcmluZyB5ZWFycyBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCB5ZWFycy5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIDkuIGBEYCBhbmQgYEREYCB0b2tlbnMgcmVwcmVzZW50IGRheXMgb2YgdGhlIHllYXIgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggZGF5cyBvZiB0aGUgbW9udGguXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zYCB0byB1c2UgdGhlbS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIGZvcm1hdCAtIFRoZSBzdHJpbmcgb2YgdG9rZW5zXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nXG4gKlxuICogQHRocm93cyBgZGF0ZWAgbXVzdCBub3QgYmUgSW52YWxpZCBEYXRlXG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBsb2NhbGl6ZWAgcHJvcGVydHlcbiAqIEB0aHJvd3MgYG9wdGlvbnMubG9jYWxlYCBtdXN0IGNvbnRhaW4gYGZvcm1hdExvbmdgIHByb3BlcnR5XG4gKiBAdGhyb3dzIHVzZSBgeXl5eWAgaW5zdGVhZCBvZiBgWVlZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYHl5YCBpbnN0ZWFkIG9mIGBZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYGRgIGluc3RlYWQgb2YgYERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgZm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAxMSBGZWJydWFyeSAyMDE0IGluIG1pZGRsZS1lbmRpYW4gZm9ybWF0OlxuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDEsIDExKSwgJ01NL2RkL3l5eXknKVxuICogLy89PiAnMDIvMTEvMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVwcmVzZW50IDIgSnVseSAyMDE0IGluIEVzcGVyYW50bzpcbiAqIGltcG9ydCB7IGVvTG9jYWxlIH0gZnJvbSAnZGF0ZS1mbnMvbG9jYWxlL2VvJ1xuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDYsIDIpLCBcImRvICdkZScgTU1NTSB5eXl5XCIsIHtcbiAqICAgbG9jYWxlOiBlb0xvY2FsZVxuICogfSlcbiAqIC8vPT4gJzItYSBkZSBqdWxpbyAyMDE0J1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFc2NhcGUgc3RyaW5nIGJ5IHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzOlxuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDYsIDIsIDE1KSwgXCJoICdvJydjbG9jaydcIilcbiAqIC8vPT4gXCIzIG8nY2xvY2tcIlxuICovXG5mdW5jdGlvbiBmb3JtYXQoZGF0ZSwgZm9ybWF0U3RyLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDIuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IGxvY2FsZSA9XG4gICAgb3B0aW9ucz8ubG9jYWxlID8/IGRlZmF1bHRPcHRpb25zLmxvY2FsZSA/PyBfaW5kZXguZGVmYXVsdExvY2FsZTtcblxuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3Qgb3JpZ2luYWxEYXRlID0gKDAsIF9pbmRleDcudG9EYXRlKShkYXRlKTtcblxuICBpZiAoISgwLCBfaW5kZXg2LmlzVmFsaWQpKG9yaWdpbmFsRGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdGltZSB2YWx1ZVwiKTtcbiAgfVxuXG4gIGxldCBwYXJ0cyA9IGZvcm1hdFN0clxuICAgIC5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcInBcIiB8fCBmaXJzdENoYXJhY3RlciA9PT0gXCJQXCIpIHtcbiAgICAgICAgY29uc3QgbG9uZ0Zvcm1hdHRlciA9IF9pbmRleDQubG9uZ0Zvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdO1xuICAgICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdHJpbmc7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKVxuICAgIC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwKVxuICAgIC5tYXAoKHN1YnN0cmluZykgPT4ge1xuICAgICAgLy8gUmVwbGFjZSB0d28gc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgd2l0aCBvbmUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlclxuICAgICAgaWYgKHN1YnN0cmluZyA9PT0gXCInJ1wiKSB7XG4gICAgICAgIHJldHVybiB7IGlzVG9rZW46IGZhbHNlLCB2YWx1ZTogXCInXCIgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIHJldHVybiB7IGlzVG9rZW46IGZhbHNlLCB2YWx1ZTogY2xlYW5Fc2NhcGVkU3RyaW5nKHN1YnN0cmluZykgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKF9pbmRleDMuZm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl0pIHtcbiAgICAgICAgcmV0dXJuIHsgaXNUb2tlbjogdHJ1ZSwgdmFsdWU6IHN1YnN0cmluZyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIubWF0Y2godW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHApKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgIFwiRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGBcIiArXG4gICAgICAgICAgICBmaXJzdENoYXJhY3RlciArXG4gICAgICAgICAgICBcImBcIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgaXNUb2tlbjogZmFsc2UsIHZhbHVlOiBzdWJzdHJpbmcgfTtcbiAgICB9KTtcblxuICAvLyBpbnZva2UgbG9jYWxpemUgcHJlcHJvY2Vzc29yIChvbmx5IGZvciBmcmVuY2ggbG9jYWxlcyBhdCB0aGUgbW9tZW50KVxuICBpZiAobG9jYWxlLmxvY2FsaXplLnByZXByb2Nlc3Nvcikge1xuICAgIHBhcnRzID0gbG9jYWxlLmxvY2FsaXplLnByZXByb2Nlc3NvcihvcmlnaW5hbERhdGUsIHBhcnRzKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdHRlck9wdGlvbnMgPSB7XG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlLFxuICAgIHdlZWtTdGFydHNPbixcbiAgICBsb2NhbGUsXG4gIH07XG5cbiAgcmV0dXJuIHBhcnRzXG4gICAgLm1hcCgocGFydCkgPT4ge1xuICAgICAgaWYgKCFwYXJ0LmlzVG9rZW4pIHJldHVybiBwYXJ0LnZhbHVlO1xuXG4gICAgICBjb25zdCB0b2tlbiA9IHBhcnQudmFsdWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgKCFvcHRpb25zPy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnMgJiZcbiAgICAgICAgICAoMCwgX2luZGV4NS5pc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4pKHRva2VuKSkgfHxcbiAgICAgICAgKCFvcHRpb25zPy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zICYmXG4gICAgICAgICAgKDAsIF9pbmRleDUuaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbikodG9rZW4pKVxuICAgICAgKSB7XG4gICAgICAgICgwLCBfaW5kZXg1Lndhcm5PclRocm93UHJvdGVjdGVkRXJyb3IpKHRva2VuLCBmb3JtYXRTdHIsIFN0cmluZyhkYXRlKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IF9pbmRleDMuZm9ybWF0dGVyc1t0b2tlblswXV07XG4gICAgICByZXR1cm4gZm9ybWF0dGVyKG9yaWdpbmFsRGF0ZSwgdG9rZW4sIGxvY2FsZS5sb2NhbGl6ZSwgZm9ybWF0dGVyT3B0aW9ucyk7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nKGlucHV0KSB7XG4gIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTtcblxuICBpZiAoIW1hdGNoZWQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlZFsxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwLCBcIidcIik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0RGF0ZSA9IGdldERhdGU7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldERhdGVcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBkYXkgb2YgdGhlIG1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIG1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF5IG9mIG1vbnRoXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIGRheSBvZiB0aGUgbW9udGggaXMgMjkgRmVicnVhcnkgMjAxMj9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldERhdGUobmV3IERhdGUoMjAxMiwgMSwgMjkpKVxuICogLy89PiAyOVxuICovXG5mdW5jdGlvbiBnZXREYXRlKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRheU9mTW9udGggPSBfZGF0ZS5nZXREYXRlKCk7XG4gIHJldHVybiBkYXlPZk1vbnRoO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldERheSA9IGdldERheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0RGF5XG4gKiBAY2F0ZWdvcnkgV2Vla2RheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGRheSBvZiB0aGUgd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF5IG9mIHdlZWssIDAgcmVwcmVzZW50cyBTdW5kYXlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggZGF5IG9mIHRoZSB3ZWVrIGlzIDI5IEZlYnJ1YXJ5IDIwMTI/XG4gKiBjb25zdCByZXN1bHQgPSBnZXREYXkobmV3IERhdGUoMjAxMiwgMSwgMjkpKVxuICogLy89PiAzXG4gKi9cbmZ1bmN0aW9uIGdldERheShkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTtcbiAgcmV0dXJuIGRheTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXREYXlPZlllYXIgPSBnZXREYXlPZlllYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zdGFydE9mWWVhci5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldERheU9mWWVhclxuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGRheSBvZiB0aGUgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgZGF5IG9mIHRoZSB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF5IG9mIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggZGF5IG9mIHRoZSB5ZWFyIGlzIDIgSnVseSAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0RGF5T2ZZZWFyKG5ldyBEYXRlKDIwMTQsIDYsIDIpKVxuICogLy89PiAxODNcbiAqL1xuZnVuY3Rpb24gZ2V0RGF5T2ZZZWFyKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4My50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkaWZmID0gKDAsIF9pbmRleC5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMpKFxuICAgIF9kYXRlLFxuICAgICgwLCBfaW5kZXgyLnN0YXJ0T2ZZZWFyKShfZGF0ZSksXG4gICk7XG4gIGNvbnN0IGRheU9mWWVhciA9IGRpZmYgKyAxO1xuICByZXR1cm4gZGF5T2ZZZWFyO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldERheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldERheXNJbk1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIG1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIG1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGRheXMgaW4gYSBtb250aFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBkYXlzIGFyZSBpbiBGZWJydWFyeSAyMDAwP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0RGF5c0luTW9udGgobmV3IERhdGUoMjAwMCwgMSkpXG4gKiAvLz0+IDI5XG4gKi9cbmZ1bmN0aW9uIGdldERheXNJbk1vbnRoKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtb250aEluZGV4ID0gX2RhdGUuZ2V0TW9udGgoKTtcbiAgY29uc3QgbGFzdERheU9mTW9udGggPSAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgbGFzdERheU9mTW9udGguc2V0RnVsbFllYXIoeWVhciwgbW9udGhJbmRleCArIDEsIDApO1xuICBsYXN0RGF5T2ZNb250aC5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGxhc3REYXlPZk1vbnRoLmdldERhdGUoKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXREZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zO1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXREZWZhdWx0T3B0aW9uc1xuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgZGVmYXVsdCBvcHRpb25zLlxuICogQHB1cmUgZmFsc2VcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgZGVmYXVsdHMgZm9yXG4gKiBgb3B0aW9ucy5sb2NhbGVgLCBgb3B0aW9ucy53ZWVrU3RhcnRzT25gIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgXG4gKiBhcmd1bWVudHMgZm9yIGFsbCBmdW5jdGlvbnMuXG4gKlxuICogWW91IGNhbiBjaGFuZ2UgdGhlc2Ugd2l0aCBbc2V0RGVmYXVsdE9wdGlvbnNdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3Mvc2V0RGVmYXVsdE9wdGlvbnMpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcmVzdWx0ID0gZ2V0RGVmYXVsdE9wdGlvbnMoKVxuICogLy89PiB7fVxuICpcbiAqIEBleGFtcGxlXG4gKiBzZXREZWZhdWx0T3B0aW9ucyh7IHdlZWtTdGFyc09uOiAxLCBmaXJzdFdlZWtDb250YWluc0RhdGU6IDQgfSlcbiAqIGNvbnN0IHJlc3VsdCA9IGdldERlZmF1bHRPcHRpb25zKClcbiAqIC8vPT4geyB3ZWVrU3RhcnNPbjogMSwgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0IH1cbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCAoMCwgX2luZGV4LmdldERlZmF1bHRPcHRpb25zKSgpKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRIb3VycyA9IGdldEhvdXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRIb3Vyc1xuICogQGNhdGVnb3J5IEhvdXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBob3VycyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgaG91cnMgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBob3Vyc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZXQgdGhlIGhvdXJzIG9mIDI5IEZlYnJ1YXJ5IDIwMTIgMTE6NDU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBnZXRIb3VycyhuZXcgRGF0ZSgyMDEyLCAxLCAyOSwgMTEsIDQ1KSlcbiAqIC8vPT4gMTFcbiAqL1xuZnVuY3Rpb24gZ2V0SG91cnMoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgaG91cnMgPSBfZGF0ZS5nZXRIb3VycygpO1xuICByZXR1cm4gaG91cnM7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0SVNPRGF5ID0gZ2V0SVNPRGF5O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRJU09EYXlcbiAqIEBjYXRlZ29yeSBXZWVrZGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgZGF5IG9mIHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgZGF5IG9mIHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZSxcbiAqIHdoaWNoIGlzIDcgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5IGV0Yy5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2YgSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggZGF5IG9mIHRoZSBJU08gd2VlayBpcyAyNiBGZWJydWFyeSAyMDEyP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0SVNPRGF5KG5ldyBEYXRlKDIwMTIsIDEsIDI2KSlcbiAqIC8vPT4gN1xuICovXG5mdW5jdGlvbiBnZXRJU09EYXkoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgbGV0IGRheSA9IF9kYXRlLmdldERheSgpO1xuXG4gIGlmIChkYXkgPT09IDApIHtcbiAgICBkYXkgPSA3O1xuICB9XG5cbiAgcmV0dXJuIGRheTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRJU09XZWVrID0gZ2V0SVNPV2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9zdGFydE9mSVNPV2Vla1llYXIuanNcIik7XG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgSVNPIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiA1M1xuICovXG5mdW5jdGlvbiBnZXRJU09XZWVrKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4NC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkaWZmID1cbiAgICArKDAsIF9pbmRleDIuc3RhcnRPZklTT1dlZWspKF9kYXRlKSAtXG4gICAgKygwLCBfaW5kZXgzLnN0YXJ0T2ZJU09XZWVrWWVhcikoX2RhdGUpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2Ygd2Vla3MgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBiZWNhdXNlIHRoZSBudW1iZXIgb2ZcbiAgLy8gbWlsbGlzZWNvbmRzIGluIGEgd2VlayBpcyBub3QgY29uc3RhbnQgKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2ZcbiAgLy8gdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KS5cbiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIF9pbmRleC5taWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRJU09XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0SVNPV2Vla1llYXJcbiAqIEBjYXRlZ29yeSBJU08gV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZSxcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIElTTy13ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0SVNPV2Vla1llYXIobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDIwMDRcbiAqL1xuZnVuY3Rpb24gZ2V0SVNPV2Vla1llYXIoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgzLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gKDAsIF9pbmRleDIuc3RhcnRPZklTT1dlZWspKFxuICAgIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIsXG4gICk7XG5cbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhciA9ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZUaGlzWWVhciA9ICgwLCBfaW5kZXgyLnN0YXJ0T2ZJU09XZWVrKShcbiAgICBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyLFxuICApO1xuXG4gIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZk5leHRZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZlRoaXNZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldE1pbnV0ZXMgPSBnZXRNaW51dGVzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRNaW51dGVzXG4gKiBAY2F0ZWdvcnkgTWludXRlIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbWludXRlcyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbWludXRlcyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG1pbnV0ZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2V0IHRoZSBtaW51dGVzIG9mIDI5IEZlYnJ1YXJ5IDIwMTIgMTE6NDU6MDU6XG4gKiBjb25zdCByZXN1bHQgPSBnZXRNaW51dGVzKG5ldyBEYXRlKDIwMTIsIDEsIDI5LCAxMSwgNDUsIDUpKVxuICogLy89PiA0NVxuICovXG5mdW5jdGlvbiBnZXRNaW51dGVzKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBfZGF0ZS5nZXRNaW51dGVzKCk7XG4gIHJldHVybiBtaW51dGVzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldE1vbnRoID0gZ2V0TW9udGg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldE1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBtb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBtb250aCBpbmRleCAoMC0xMSlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggbW9udGggaXMgMjkgRmVicnVhcnkgMjAxMj9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldE1vbnRoKG5ldyBEYXRlKDIwMTIsIDEsIDI5KSlcbiAqIC8vPT4gMVxuICovXG5mdW5jdGlvbiBnZXRNb250aChkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBtb250aCA9IF9kYXRlLmdldE1vbnRoKCk7XG4gIHJldHVybiBtb250aDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRRdWFydGVyID0gZ2V0UXVhcnRlcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0UXVhcnRlclxuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSB5ZWFyIHF1YXJ0ZXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIHllYXIgcXVhcnRlciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHF1YXJ0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggcXVhcnRlciBpcyAyIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFF1YXJ0ZXIobmV3IERhdGUoMjAxNCwgNiwgMikpXG4gKiAvLz0+IDNcbiAqL1xuZnVuY3Rpb24gZ2V0UXVhcnRlcihkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBxdWFydGVyID0gTWF0aC50cnVuYyhfZGF0ZS5nZXRNb250aCgpIC8gMykgKyAxO1xuICByZXR1cm4gcXVhcnRlcjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRTZWNvbmRzID0gZ2V0U2Vjb25kcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0U2Vjb25kc1xuICogQGNhdGVnb3J5IFNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHNlY29uZHMgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIHNlY29uZHMgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBzZWNvbmRzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEdldCB0aGUgc2Vjb25kcyBvZiAyOSBGZWJydWFyeSAyMDEyIDExOjQ1OjA1LjEyMzpcbiAqIGNvbnN0IHJlc3VsdCA9IGdldFNlY29uZHMobmV3IERhdGUoMjAxMiwgMSwgMjksIDExLCA0NSwgNSwgMTIzKSlcbiAqIC8vPT4gNVxuICovXG5mdW5jdGlvbiBnZXRTZWNvbmRzKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHNlY29uZHMgPSBfZGF0ZS5nZXRTZWNvbmRzKCk7XG4gIHJldHVybiBzZWNvbmRzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFRpbWUgPSBnZXRUaW1lO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRUaW1lXG4gKiBAY2F0ZWdvcnkgVGltZXN0YW1wIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbWlsbGlzZWNvbmRzIHRpbWVzdGFtcCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbWlsbGlzZWNvbmRzIHRpbWVzdGFtcCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHRpbWVzdGFtcFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZXQgdGhlIHRpbWVzdGFtcCBvZiAyOSBGZWJydWFyeSAyMDEyIDExOjQ1OjA1LjEyMzpcbiAqIGNvbnN0IHJlc3VsdCA9IGdldFRpbWUobmV3IERhdGUoMjAxMiwgMSwgMjksIDExLCA0NSwgNSwgMTIzKSlcbiAqIC8vPT4gMTMzMDUxNTkwNTEyM1xuICovXG5mdW5jdGlvbiBnZXRUaW1lKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IF9kYXRlLmdldFRpbWUoKTtcbiAgcmV0dXJuIHRpbWVzdGFtcDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRXZWVrID0gZ2V0V2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZXZWVrLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9zdGFydE9mV2Vla1llYXIuanNcIik7XG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9ucz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiA1M1xuICovXG5cbmZ1bmN0aW9uIGdldFdlZWsoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXg0LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRpZmYgPVxuICAgICsoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoX2RhdGUsIG9wdGlvbnMpIC1cbiAgICArKDAsIF9pbmRleDMuc3RhcnRPZldlZWtZZWFyKShfZGF0ZSwgb3B0aW9ucyk7XG5cbiAgLy8gUm91bmQgdGhlIG51bWJlciBvZiB3ZWVrcyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGJlY2F1c2UgdGhlIG51bWJlciBvZlxuICAvLyBtaWxsaXNlY29uZHMgaW4gYSB3ZWVrIGlzIG5vdCBjb25zdGFudCAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZlxuICAvLyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpLlxuICByZXR1cm4gTWF0aC5yb3VuZChkaWZmIC8gX2luZGV4Lm1pbGxpc2Vjb25kc0luV2VlaykgKyAxO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFdlZWtZZWFyID0gZ2V0V2Vla1llYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZldlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0V2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrWWVhclxuICogQGNhdGVnb3J5IFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1RoZV9JU09fd2Vla19kYXRlX3N5c3RlbVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgd2l0aCB0aGUgZGVmYXVsdCBzZXR0aW5ncz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNikpXG4gKiAvLz0+IDIwMDVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IGlmIHdlZWsgc3RhcnRzIG9uIFNhdHVyZGF5P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSwgeyB3ZWVrU3RhcnRzT246IDYgfSlcbiAqIC8vPT4gMjAwNFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgaWYgdGhlIGZpcnN0IHdlZWsgY29udGFpbnMgNCBKYW51YXJ5P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSwgeyBmaXJzdFdlZWtDb250YWluc0RhdGU6IDQgfSlcbiAqIC8vPT4gMjAwNFxuICovXG5mdW5jdGlvbiBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDMudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4NC5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCBmaXJzdFdlZWtPZk5leHRZZWFyID0gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gKDAsIF9pbmRleDIuc3RhcnRPZldlZWspKFxuICAgIGZpcnN0V2Vla09mTmV4dFllYXIsXG4gICAgb3B0aW9ucyxcbiAgKTtcblxuICBjb25zdCBmaXJzdFdlZWtPZlRoaXNZZWFyID0gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSAoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoXG4gICAgZmlyc3RXZWVrT2ZUaGlzWWVhcixcbiAgICBvcHRpb25zLFxuICApO1xuXG4gIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZk5leHRZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZlRoaXNZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFllYXIgPSBnZXRZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHllYXIgaXMgMiBKdWx5IDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRZZWFyKG5ldyBEYXRlKDIwMTQsIDYsIDIpKVxuICogLy89PiAyMDE0XG4gKi9cbmZ1bmN0aW9uIGdldFllYXIoZGF0ZSkge1xuICByZXR1cm4gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpLmdldEZ1bGxZZWFyKCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNBZnRlciA9IGlzQWZ0ZXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzQWZ0ZXJcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGZpcnN0IGRhdGUgYWZ0ZXIgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJcyB0aGUgZmlyc3QgZGF0ZSBhZnRlciB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRoYXQgc2hvdWxkIGJlIGFmdGVyIHRoZSBvdGhlciBvbmUgdG8gcmV0dXJuIHRydWVcbiAqIEBwYXJhbSBkYXRlVG9Db21wYXJlIC0gVGhlIGRhdGUgdG8gY29tcGFyZSB3aXRoXG4gKlxuICogQHJldHVybnMgVGhlIGZpcnN0IGRhdGUgaXMgYWZ0ZXIgdGhlIHNlY29uZCBkYXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElzIDEwIEp1bHkgMTk4OSBhZnRlciAxMSBGZWJydWFyeSAxOTg3P1xuICogY29uc3QgcmVzdWx0ID0gaXNBZnRlcihuZXcgRGF0ZSgxOTg5LCA2LCAxMCksIG5ldyBEYXRlKDE5ODcsIDEsIDExKSlcbiAqIC8vPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc0FmdGVyKGRhdGUsIGRhdGVUb0NvbXBhcmUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IF9kYXRlVG9Db21wYXJlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVUb0NvbXBhcmUpO1xuICByZXR1cm4gX2RhdGUuZ2V0VGltZSgpID4gX2RhdGVUb0NvbXBhcmUuZ2V0VGltZSgpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzQmVmb3JlID0gaXNCZWZvcmU7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzQmVmb3JlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRoYXQgc2hvdWxkIGJlIGJlZm9yZSB0aGUgb3RoZXIgb25lIHRvIHJldHVybiB0cnVlXG4gKiBAcGFyYW0gZGF0ZVRvQ29tcGFyZSAtIFRoZSBkYXRlIHRvIGNvbXBhcmUgd2l0aFxuICpcbiAqIEByZXR1cm5zIFRoZSBmaXJzdCBkYXRlIGlzIGJlZm9yZSB0aGUgc2Vjb25kIGRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSXMgMTAgSnVseSAxOTg5IGJlZm9yZSAxMSBGZWJydWFyeSAxOTg3P1xuICogY29uc3QgcmVzdWx0ID0gaXNCZWZvcmUobmV3IERhdGUoMTk4OSwgNiwgMTApLCBuZXcgRGF0ZSgxOTg3LCAxLCAxMSkpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQmVmb3JlKGRhdGUsIGRhdGVUb0NvbXBhcmUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IF9kYXRlVG9Db21wYXJlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVUb0NvbXBhcmUpO1xuICByZXR1cm4gK19kYXRlIDwgK19kYXRlVG9Db21wYXJlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTsgLyoqXG4gKiBAbmFtZSBpc0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIHZhbHVlIGEgZGF0ZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZS4gVGhlIGZ1bmN0aW9uIHdvcmtzIGZvciBkYXRlcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgaWZyYW1lcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGEgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZSgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUobmV3IERhdGUoTmFOKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3Igc29tZSB2YWx1ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSgnMjAxNC0wMi0zMScpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBvYmplY3Q6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUoe30pXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBEYXRlXVwiKVxuICApO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzRXF1YWwgPSBpc0VxdWFsO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc0VxdWFsXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgZXF1YWw/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBcmUgdGhlIGdpdmVuIGRhdGVzIGVxdWFsP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgc2Vjb25kIGRhdGUgdG8gY29tcGFyZVxuICpcbiAqIEByZXR1cm5zIFRoZSBkYXRlcyBhcmUgZXF1YWxcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDIgSnVseSAyMDE0IDA2OjMwOjQ1LjAwMCBhbmQgMiBKdWx5IDIwMTQgMDY6MzA6NDUuNTAwIGVxdWFsP1xuICogY29uc3QgcmVzdWx0ID0gaXNFcXVhbChcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMiwgNiwgMzAsIDQ1LCAwKSxcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMiwgNiwgMzAsIDQ1LCA1MDApXG4gKiApXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRXF1YWwobGVmdERhdGUsIHJpZ2h0RGF0ZSkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4LnRvRGF0ZSkobGVmdERhdGUpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleC50b0RhdGUpKHJpZ2h0RGF0ZSk7XG4gIHJldHVybiArX2RhdGVMZWZ0ID09PSArX2RhdGVSaWdodDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc1NhbWVEYXkgPSBpc1NhbWVEYXk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vc3RhcnRPZkRheS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc1NhbWVEYXlcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBkYXkgKGFuZCB5ZWFyIGFuZCBtb250aCk/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIGRheSAoYW5kIHllYXIgYW5kIG1vbnRoKT9cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgZmlyc3QgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBzZWNvbmQgZGF0ZSB0byBjaGVja1xuXG4gKiBAcmV0dXJucyBUaGUgZGF0ZXMgYXJlIGluIHRoZSBzYW1lIGRheSAoYW5kIHllYXIgYW5kIG1vbnRoKVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgNCBTZXB0ZW1iZXIgMDY6MDA6MDAgYW5kIDQgU2VwdGVtYmVyIDE4OjAwOjAwIGluIHRoZSBzYW1lIGRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZURheShuZXcgRGF0ZSgyMDE0LCA4LCA0LCA2LCAwKSwgbmV3IERhdGUoMjAxNCwgOCwgNCwgMTgsIDApKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSA0IFNlcHRlbWJlciBhbmQgNCBPY3RvYmVyIGluIHRoZSBzYW1lIGRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZURheShuZXcgRGF0ZSgyMDE0LCA4LCA0KSwgbmV3IERhdGUoMjAxNCwgOSwgNCkpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSA0IFNlcHRlbWJlciwgMjAxNCBhbmQgNCBTZXB0ZW1iZXIsIDIwMTUgaW4gdGhlIHNhbWUgZGF5P1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDQpLCBuZXcgRGF0ZSgyMDE1LCA4LCA0KSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTYW1lRGF5KGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgZGF0ZUxlZnRTdGFydE9mRGF5ID0gKDAsIF9pbmRleC5zdGFydE9mRGF5KShkYXRlTGVmdCk7XG4gIGNvbnN0IGRhdGVSaWdodFN0YXJ0T2ZEYXkgPSAoMCwgX2luZGV4LnN0YXJ0T2ZEYXkpKGRhdGVSaWdodCk7XG5cbiAgcmV0dXJuICtkYXRlTGVmdFN0YXJ0T2ZEYXkgPT09ICtkYXRlUmlnaHRTdGFydE9mRGF5O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzU2FtZU1vbnRoID0gaXNTYW1lTW9udGg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzU2FtZU1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBtb250aCAoYW5kIHllYXIpP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBtb250aCAoYW5kIHllYXIpP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIHNlY29uZCBkYXRlIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSBtb250aCAoYW5kIHllYXIpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAyIFNlcHRlbWJlciAyMDE0IGFuZCAyNSBTZXB0ZW1iZXIgMjAxNCBpbiB0aGUgc2FtZSBtb250aD9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZU1vbnRoKG5ldyBEYXRlKDIwMTQsIDgsIDIpLCBuZXcgRGF0ZSgyMDE0LCA4LCAyNSkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDIgU2VwdGVtYmVyIDIwMTQgYW5kIDI1IFNlcHRlbWJlciAyMDE1IGluIHRoZSBzYW1lIG1vbnRoP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiksIG5ldyBEYXRlKDIwMTUsIDgsIDI1KSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTYW1lTW9udGgoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZUxlZnQpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVSaWdodCk7XG4gIHJldHVybiAoXG4gICAgX2RhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgPT09IF9kYXRlUmlnaHQuZ2V0RnVsbFllYXIoKSAmJlxuICAgIF9kYXRlTGVmdC5nZXRNb250aCgpID09PSBfZGF0ZVJpZ2h0LmdldE1vbnRoKClcbiAgKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc1NhbWVRdWFydGVyID0gaXNTYW1lUXVhcnRlcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9zdGFydE9mUXVhcnRlci5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc1NhbWVRdWFydGVyXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIHF1YXJ0ZXIgKGFuZCB5ZWFyKT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgcXVhcnRlciAoYW5kIHllYXIpP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIHNlY29uZCBkYXRlIHRvIGNoZWNrXG5cbiAqIEByZXR1cm5zIFRoZSBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgcXVhcnRlciAoYW5kIHllYXIpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAxIEphbnVhcnkgMjAxNCBhbmQgOCBNYXJjaCAyMDE0IGluIHRoZSBzYW1lIHF1YXJ0ZXI/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVRdWFydGVyKG5ldyBEYXRlKDIwMTQsIDAsIDEpLCBuZXcgRGF0ZSgyMDE0LCAyLCA4KSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMSBKYW51YXJ5IDIwMTQgYW5kIDEgSmFudWFyeSAyMDE1IGluIHRoZSBzYW1lIHF1YXJ0ZXI/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVRdWFydGVyKG5ldyBEYXRlKDIwMTQsIDAsIDEpLCBuZXcgRGF0ZSgyMDE1LCAwLCAxKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTYW1lUXVhcnRlcihkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IGRhdGVMZWZ0U3RhcnRPZlF1YXJ0ZXIgPSAoMCwgX2luZGV4LnN0YXJ0T2ZRdWFydGVyKShkYXRlTGVmdCk7XG4gIGNvbnN0IGRhdGVSaWdodFN0YXJ0T2ZRdWFydGVyID0gKDAsIF9pbmRleC5zdGFydE9mUXVhcnRlcikoZGF0ZVJpZ2h0KTtcblxuICByZXR1cm4gK2RhdGVMZWZ0U3RhcnRPZlF1YXJ0ZXIgPT09ICtkYXRlUmlnaHRTdGFydE9mUXVhcnRlcjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc1NhbWVZZWFyID0gaXNTYW1lWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNTYW1lWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSB5ZWFyP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSB5ZWFyP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIHNlY29uZCBkYXRlIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAyIFNlcHRlbWJlciAyMDE0IGFuZCAyNSBTZXB0ZW1iZXIgMjAxNCBpbiB0aGUgc2FtZSB5ZWFyP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lWWVhcihuZXcgRGF0ZSgyMDE0LCA4LCAyKSwgbmV3IERhdGUoMjAxNCwgOCwgMjUpKVxuICogLy89PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzU2FtZVllYXIoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBfZGF0ZUxlZnQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZUxlZnQpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVSaWdodCk7XG4gIHJldHVybiBfZGF0ZUxlZnQuZ2V0RnVsbFllYXIoKSA9PT0gX2RhdGVSaWdodC5nZXRGdWxsWWVhcigpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzVmFsaWQgPSBpc1ZhbGlkO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2lzRGF0ZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzVmFsaWRcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIGRhdGUgdmFsaWQ/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIGZhbHNlIGlmIGFyZ3VtZW50IGlzIEludmFsaWQgRGF0ZSBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gKiBBcmd1bWVudCBpcyBjb252ZXJ0ZWQgdG8gRGF0ZSB1c2luZyBgdG9EYXRlYC4gU2VlIFt0b0RhdGVdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvdG9EYXRlKVxuICogSW52YWxpZCBEYXRlIGlzIGEgRGF0ZSwgd2hvc2UgdGltZSB2YWx1ZSBpcyBOYU4uXG4gKlxuICogVGltZSB2YWx1ZSBvZiBEYXRlOiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjkuMS4xXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIFRoZSBkYXRlIGlzIHZhbGlkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQobmV3IERhdGUoMjAxNCwgMSwgMzEpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgdmFsdWUsIGNvbnZlcnRhYmxlIGludG8gYSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZCgxMzkzODA0ODAwMDAwKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgaW52YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZChuZXcgRGF0ZSgnJykpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWQoZGF0ZSkge1xuICBpZiAoISgwLCBfaW5kZXguaXNEYXRlKShkYXRlKSAmJiB0eXBlb2YgZGF0ZSAhPT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZSk7XG4gIHJldHVybiAhaXNOYU4oTnVtYmVyKF9kYXRlKSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNXaXRoaW5JbnRlcnZhbCA9IGlzV2l0aGluSW50ZXJ2YWw7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzV2l0aGluSW50ZXJ2YWxcbiAqIEBjYXRlZ29yeSBJbnRlcnZhbCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gZGF0ZSB3aXRoaW4gdGhlIGludGVydmFsP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSXMgdGhlIGdpdmVuIGRhdGUgd2l0aGluIHRoZSBpbnRlcnZhbD8gKEluY2x1ZGluZyBzdGFydCBhbmQgZW5kLilcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gaW50ZXJ2YWwgLSBUaGUgaW50ZXJ2YWwgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF0ZSBpcyB3aXRoaW4gdGhlIGludGVydmFsXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgZGF0ZSB3aXRoaW4gdGhlIGludGVydmFsOlxuICogaXNXaXRoaW5JbnRlcnZhbChuZXcgRGF0ZSgyMDE0LCAwLCAzKSwge1xuICogICBzdGFydDogbmV3IERhdGUoMjAxNCwgMCwgMSksXG4gKiAgIGVuZDogbmV3IERhdGUoMjAxNCwgMCwgNylcbiAqIH0pXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSBkYXRlIG91dHNpZGUgb2YgdGhlIGludGVydmFsOlxuICogaXNXaXRoaW5JbnRlcnZhbChuZXcgRGF0ZSgyMDE0LCAwLCAxMCksIHtcbiAqICAgc3RhcnQ6IG5ldyBEYXRlKDIwMTQsIDAsIDEpLFxuICogICBlbmQ6IG5ldyBEYXRlKDIwMTQsIDAsIDcpXG4gKiB9KVxuICogLy89PiBmYWxzZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgZGF0ZSBlcXVhbCB0byBpbnRlcnZhbCBzdGFydDpcbiAqIGlzV2l0aGluSW50ZXJ2YWwoZGF0ZSwgeyBzdGFydCwgZW5kOiBkYXRlIH0pXG4gKiAvLyA9PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBkYXRlIGVxdWFsIHRvIGludGVydmFsIGVuZDpcbiAqIGlzV2l0aGluSW50ZXJ2YWwoZGF0ZSwgeyBzdGFydDogZGF0ZSwgZW5kIH0pXG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzV2l0aGluSW50ZXJ2YWwoZGF0ZSwgaW50ZXJ2YWwpIHtcbiAgY29uc3QgdGltZSA9ICsoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IFtzdGFydFRpbWUsIGVuZFRpbWVdID0gW1xuICAgICsoMCwgX2luZGV4LnRvRGF0ZSkoaW50ZXJ2YWwuc3RhcnQpLFxuICAgICsoMCwgX2luZGV4LnRvRGF0ZSkoaW50ZXJ2YWwuZW5kKSxcbiAgXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG5cbiAgcmV0dXJuIHRpbWUgPj0gc3RhcnRUaW1lICYmIHRpbWUgPD0gZW5kVGltZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5idWlsZEZvcm1hdExvbmdGbiA9IGJ1aWxkRm9ybWF0TG9uZ0ZuO1xuXG5mdW5jdGlvbiBidWlsZEZvcm1hdExvbmdGbihhcmdzKSB7XG4gIHJldHVybiAob3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgLy8gVE9ETzogUmVtb3ZlIFN0cmluZygpXG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgY29uc3QgZm9ybWF0ID0gYXJncy5mb3JtYXRzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHNbYXJncy5kZWZhdWx0V2lkdGhdO1xuICAgIHJldHVybiBmb3JtYXQ7XG4gIH07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYnVpbGRMb2NhbGl6ZUZuID0gYnVpbGRMb2NhbGl6ZUZuOyAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4vKipcbiAqIFRoZSBsb2NhbGl6ZSBmdW5jdGlvbiBhcmd1bWVudCBjYWxsYmFjayB3aGljaCBhbGxvd3MgdG8gY29udmVydCByYXcgdmFsdWUgdG9cbiAqIHRoZSBhY3R1YWwgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgdmFsdWVcbiAqL1xuXG4vKipcbiAqIFRoZSBtYXAgb2YgbG9jYWxpemVkIHZhbHVlcyBmb3IgZWFjaCB3aWR0aC5cbiAqL1xuXG4vKipcbiAqIFRoZSBpbmRleCB0eXBlIG9mIHRoZSBsb2NhbGUgdW5pdCB2YWx1ZS4gSXQgdHlwZXMgY29udmVyc2lvbiBvZiB1bml0cyBvZlxuICogdmFsdWVzIHRoYXQgZG9uJ3Qgc3RhcnQgYXQgMCAoaS5lLiBxdWFydGVycykuXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgdW5pdCB2YWx1ZSB0byB0aGUgdHVwbGUgb2YgdmFsdWVzLlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBlcmEgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIEJDLFxuICogdGhlIHNlY29uZCBlbGVtZW50IHJlcHJlc2VudHMgQUQuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIHF1YXJ0ZXIgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIFExLlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBkYXkgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIFN1bmRheS5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgbW9udGggdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIEphbnVhcnkuXG4gKi9cblxuZnVuY3Rpb24gYnVpbGRMb2NhbGl6ZUZuKGFyZ3MpIHtcbiAgcmV0dXJuICh2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBvcHRpb25zPy5jb250ZXh0ID8gU3RyaW5nKG9wdGlvbnMuY29udGV4dCkgOiBcInN0YW5kYWxvbmVcIjtcblxuICAgIGxldCB2YWx1ZXNBcnJheTtcbiAgICBpZiAoY29udGV4dCA9PT0gXCJmb3JtYXR0aW5nXCIgJiYgYXJncy5mb3JtYXR0aW5nVmFsdWVzKSB7XG4gICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRGb3JtYXR0aW5nV2lkdGggfHwgYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YWx1ZXNBcnJheSA9XG4gICAgICAgIGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1t3aWR0aF0gfHwgYXJncy5mb3JtYXR0aW5nVmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MudmFsdWVzW3dpZHRoXSB8fCBhcmdzLnZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGFyZ3MuYXJndW1lbnRDYWxsYmFjayA/IGFyZ3MuYXJndW1lbnRDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBGb3Igc29tZSByZWFzb24gVHlwZVNjcmlwdCBqdXN0IGRvbid0IHdhbnQgdG8gbWF0Y2ggaXQsIG5vIG1hdHRlciBob3cgaGFyZCB3ZSB0cnkuIEkgY2hhbGxlbmdlIHlvdSB0byB0cnkgdG8gcmVtb3ZlIGl0IVxuICAgIHJldHVybiB2YWx1ZXNBcnJheVtpbmRleF07XG4gIH07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYnVpbGRNYXRjaEZuID0gYnVpbGRNYXRjaEZuO1xuXG5mdW5jdGlvbiBidWlsZE1hdGNoRm4oYXJncykge1xuICByZXR1cm4gKHN0cmluZywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoO1xuXG4gICAgY29uc3QgbWF0Y2hQYXR0ZXJuID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLm1hdGNoUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5tYXRjaFBhdHRlcm5zW2FyZ3MuZGVmYXVsdE1hdGNoV2lkdGhdO1xuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3RyaW5nLm1hdGNoKG1hdGNoUGF0dGVybik7XG5cbiAgICBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdO1xuXG4gICAgY29uc3QgcGFyc2VQYXR0ZXJucyA9XG4gICAgICAod2lkdGggJiYgYXJncy5wYXJzZVBhdHRlcm5zW3dpZHRoXSkgfHxcbiAgICAgIGFyZ3MucGFyc2VQYXR0ZXJuc1thcmdzLmRlZmF1bHRQYXJzZVdpZHRoXTtcblxuICAgIGNvbnN0IGtleSA9IEFycmF5LmlzQXJyYXkocGFyc2VQYXR0ZXJucylcbiAgICAgID8gZmluZEluZGV4KHBhcnNlUGF0dGVybnMsIChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZykpXG4gICAgICA6IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIEkgY2hhbGxhbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgZmluZEtleShwYXJzZVBhdHRlcm5zLCAocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpKTtcblxuICAgIGxldCB2YWx1ZTtcblxuICAgIHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKGtleSkgOiBrZXk7XG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gSSBjaGFsbGFuZ2UgeW91IHRvIGZpeCB0aGUgdHlwZVxuICAgICAgICBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUpXG4gICAgICA6IHZhbHVlO1xuXG4gICAgY29uc3QgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG5cbiAgICByZXR1cm4geyB2YWx1ZSwgcmVzdCB9O1xuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIGlmIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiZcbiAgICAgIHByZWRpY2F0ZShvYmplY3Rba2V5XSlcbiAgICApIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlKSB7XG4gIGZvciAobGV0IGtleSA9IDA7IGtleSA8IGFycmF5Lmxlbmd0aDsga2V5KyspIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2tleV0pKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmJ1aWxkTWF0Y2hQYXR0ZXJuRm4gPSBidWlsZE1hdGNoUGF0dGVybkZuO1xuXG5mdW5jdGlvbiBidWlsZE1hdGNoUGF0dGVybkZuKGFyZ3MpIHtcbiAgcmV0dXJuIChzdHJpbmcsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MubWF0Y2hQYXR0ZXJuKTtcbiAgICBpZiAoIW1hdGNoUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLnBhcnNlUGF0dGVybik7XG4gICAgaWYgKCFwYXJzZVJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgbGV0IHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrXG4gICAgICA/IGFyZ3MudmFsdWVDYWxsYmFjayhwYXJzZVJlc3VsdFswXSlcbiAgICAgIDogcGFyc2VSZXN1bHRbMF07XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBJIGNoYWxsYW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cbiAgICBjb25zdCByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcblxuICAgIHJldHVybiB7IHZhbHVlLCByZXN0IH07XG4gIH07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZW5VUyA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9lbi1VUy9fbGliL2Zvcm1hdExvbmcuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanNcIik7XG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL2VuLVVTL19saWIvbG9jYWxpemUuanNcIik7XG52YXIgX2luZGV4NSA9IHJlcXVpcmUoXCIuL2VuLVVTL19saWIvbWF0Y2guanNcIik7XG5cbi8qKlxuICogQGNhdGVnb3J5IExvY2FsZXNcbiAqIEBzdW1tYXJ5IEVuZ2xpc2ggbG9jYWxlIChVbml0ZWQgU3RhdGVzKS5cbiAqIEBsYW5ndWFnZSBFbmdsaXNoXG4gKiBAaXNvLTYzOS0yIGVuZ1xuICogQGF1dGhvciBTYXNoYSBLb3NzIFtAa29zc25vY29ycF0oaHR0cHM6Ly9naXRodWIuY29tL2tvc3Nub2NvcnApXG4gKiBAYXV0aG9yIExlc2hhIEtvc3MgW0BsZXNoYWtvc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZXNoYWtvc3MpXG4gKi9cbmNvbnN0IGVuVVMgPSAoZXhwb3J0cy5lblVTID0ge1xuICBjb2RlOiBcImVuLVVTXCIsXG4gIGZvcm1hdERpc3RhbmNlOiBfaW5kZXguZm9ybWF0RGlzdGFuY2UsXG4gIGZvcm1hdExvbmc6IF9pbmRleDIuZm9ybWF0TG9uZyxcbiAgZm9ybWF0UmVsYXRpdmU6IF9pbmRleDMuZm9ybWF0UmVsYXRpdmUsXG4gIGxvY2FsaXplOiBfaW5kZXg0LmxvY2FsaXplLFxuICBtYXRjaDogX2luZGV4NS5tYXRjaCxcbiAgb3B0aW9uczoge1xuICAgIHdlZWtTdGFydHNPbjogMCAvKiBTdW5kYXkgKi8sXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxLFxuICB9LFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZm9ybWF0RGlzdGFuY2UgPSB2b2lkIDA7XG5cbmNvbnN0IGZvcm1hdERpc3RhbmNlTG9jYWxlID0ge1xuICBsZXNzVGhhblhTZWNvbmRzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIHNlY29uZFwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIHhTZWNvbmRzOiB7XG4gICAgb25lOiBcIjEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IHNlY29uZHNcIixcbiAgfSxcblxuICBoYWxmQU1pbnV0ZTogXCJoYWxmIGEgbWludXRlXCIsXG5cbiAgbGVzc1RoYW5YTWludXRlczoge1xuICAgIG9uZTogXCJsZXNzIHRoYW4gYSBtaW51dGVcIixcbiAgICBvdGhlcjogXCJsZXNzIHRoYW4ge3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICB4TWludXRlczoge1xuICAgIG9uZTogXCIxIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBtaW51dGVzXCIsXG4gIH0sXG5cbiAgYWJvdXRYSG91cnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBob3VyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeEhvdXJzOiB7XG4gICAgb25lOiBcIjEgaG91clwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBob3Vyc1wiLFxuICB9LFxuXG4gIHhEYXlzOiB7XG4gICAgb25lOiBcIjEgZGF5XCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGRheXNcIixcbiAgfSxcblxuICBhYm91dFhXZWVrczoge1xuICAgIG9uZTogXCJhYm91dCAxIHdlZWtcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICB4V2Vla3M6IHtcbiAgICBvbmU6IFwiMSB3ZWVrXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IHdlZWtzXCIsXG4gIH0sXG5cbiAgYWJvdXRYTW9udGhzOiB7XG4gICAgb25lOiBcImFib3V0IDEgbW9udGhcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgeE1vbnRoczoge1xuICAgIG9uZTogXCIxIG1vbnRoXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1vbnRoc1wiLFxuICB9LFxuXG4gIGFib3V0WFllYXJzOiB7XG4gICAgb25lOiBcImFib3V0IDEgeWVhclwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIHhZZWFyczoge1xuICAgIG9uZTogXCIxIHllYXJcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcblxuICBvdmVyWFllYXJzOiB7XG4gICAgb25lOiBcIm92ZXIgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwib3ZlciB7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcblxuICBhbG1vc3RYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWxtb3N0IDEgeWVhclwiLFxuICAgIG90aGVyOiBcImFsbW9zdCB7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcbn07XG5cbmNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgY291bnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gXCJpbiBcIiArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIFwiIGFnb1wiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0cy5mb3JtYXREaXN0YW5jZSA9IGZvcm1hdERpc3RhbmNlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmZvcm1hdExvbmcgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uL19saWIvYnVpbGRGb3JtYXRMb25nRm4uanNcIik7XG5cbmNvbnN0IGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiBcIkVFRUUsIE1NTU0gZG8sIHlcIixcbiAgbG9uZzogXCJNTU1NIGRvLCB5XCIsXG4gIG1lZGl1bTogXCJNTU0gZCwgeVwiLFxuICBzaG9ydDogXCJNTS9kZC95eXl5XCIsXG59O1xuXG5jb25zdCB0aW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJoOm1tOnNzIGEgenp6elwiLFxuICBsb25nOiBcImg6bW06c3MgYSB6XCIsXG4gIG1lZGl1bTogXCJoOm1tOnNzIGFcIixcbiAgc2hvcnQ6IFwiaDptbSBhXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbWVkaXVtOiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxuICBzaG9ydDogXCJ7e2RhdGV9fSwge3t0aW1lfX1cIixcbn07XG5cbmNvbnN0IGZvcm1hdExvbmcgPSAoZXhwb3J0cy5mb3JtYXRMb25nID0ge1xuICBkYXRlOiAoMCwgX2luZGV4LmJ1aWxkRm9ybWF0TG9uZ0ZuKSh7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgdGltZTogKDAsIF9pbmRleC5idWlsZEZvcm1hdExvbmdGbikoe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIGRhdGVUaW1lOiAoMCwgX2luZGV4LmJ1aWxkRm9ybWF0TG9uZ0ZuKSh7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZm9ybWF0UmVsYXRpdmUgPSB2b2lkIDA7XG5cbmNvbnN0IGZvcm1hdFJlbGF0aXZlTG9jYWxlID0ge1xuICBsYXN0V2VlazogXCInbGFzdCcgZWVlZSAnYXQnIHBcIixcbiAgeWVzdGVyZGF5OiBcIid5ZXN0ZXJkYXkgYXQnIHBcIixcbiAgdG9kYXk6IFwiJ3RvZGF5IGF0JyBwXCIsXG4gIHRvbW9ycm93OiBcIid0b21vcnJvdyBhdCcgcFwiLFxuICBuZXh0V2VlazogXCJlZWVlICdhdCcgcFwiLFxuICBvdGhlcjogXCJQXCIsXG59O1xuXG5jb25zdCBmb3JtYXRSZWxhdGl2ZSA9ICh0b2tlbiwgX2RhdGUsIF9iYXNlRGF0ZSwgX29wdGlvbnMpID0+XG4gIGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcbmV4cG9ydHMuZm9ybWF0UmVsYXRpdmUgPSBmb3JtYXRSZWxhdGl2ZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5sb2NhbGl6ZSA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vX2xpYi9idWlsZExvY2FsaXplRm4uanNcIik7XG5cbmNvbnN0IGVyYVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJCXCIsIFwiQVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIkJDXCIsIFwiQURcIl0sXG4gIHdpZGU6IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXSxcbn07XG5cbmNvbnN0IHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdLFxuICB3aWRlOiBbXCIxc3QgcXVhcnRlclwiLCBcIjJuZCBxdWFydGVyXCIsIFwiM3JkIHF1YXJ0ZXJcIiwgXCI0dGggcXVhcnRlclwiXSxcbn07XG5cbi8vIE5vdGU6IGluIEVuZ2xpc2gsIHRoZSBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBtb250aHMgYXJlIGNhcGl0YWxpemVkLlxuLy8gSWYgeW91IGFyZSBtYWtpbmcgYSBuZXcgbG9jYWxlIGJhc2VkIG9uIHRoaXMgb25lLCBjaGVjayBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbGFuZ3VhZ2UgeW91J3JlIHdvcmtpbmcgb24uXG4vLyBHZW5lcmFsbHksIGZvcm1hdHRlZCBkYXRlcyBzaG91bGQgbG9vayBsaWtlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzZW50ZW5jZSxcbi8vIGUuZy4gaW4gU3BhbmlzaCBsYW5ndWFnZSB0aGUgd2Vla2RheXMgYW5kIG1vbnRocyBzaG91bGQgYmUgaW4gdGhlIGxvd2VyY2FzZS5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcbiAgICBcIkphblwiLFxuICAgIFwiRmViXCIsXG4gICAgXCJNYXJcIixcbiAgICBcIkFwclwiLFxuICAgIFwiTWF5XCIsXG4gICAgXCJKdW5cIixcbiAgICBcIkp1bFwiLFxuICAgIFwiQXVnXCIsXG4gICAgXCJTZXBcIixcbiAgICBcIk9jdFwiLFxuICAgIFwiTm92XCIsXG4gICAgXCJEZWNcIixcbiAgXSxcblxuICB3aWRlOiBbXG4gICAgXCJKYW51YXJ5XCIsXG4gICAgXCJGZWJydWFyeVwiLFxuICAgIFwiTWFyY2hcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1bmVcIixcbiAgICBcIkp1bHlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPY3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGVjZW1iZXJcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJTXCIsIFwiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCJdLFxuICBzaG9ydDogW1wiU3VcIiwgXCJNb1wiLCBcIlR1XCIsIFwiV2VcIiwgXCJUaFwiLCBcIkZyXCIsIFwiU2FcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIl0sXG4gIHdpZGU6IFtcbiAgICBcIlN1bmRheVwiLFxuICAgIFwiTW9uZGF5XCIsXG4gICAgXCJUdWVzZGF5XCIsXG4gICAgXCJXZWRuZXNkYXlcIixcbiAgICBcIlRodXJzZGF5XCIsXG4gICAgXCJGcmlkYXlcIixcbiAgICBcIlNhdHVyZGF5XCIsXG4gIF0sXG59O1xuXG5jb25zdCBkYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOdW1iZXIgPSAoZGlydHlOdW1iZXIsIF9vcHRpb25zKSA9PiB7XG4gIGNvbnN0IG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG5cbiAgLy8gSWYgb3JkaW5hbCBudW1iZXJzIGRlcGVuZCBvbiBjb250ZXh0LCBmb3IgZXhhbXBsZSxcbiAgLy8gaWYgdGhleSBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgZ3JhbW1hdGljYWwgZ2VuZGVycyxcbiAgLy8gdXNlIGBvcHRpb25zLnVuaXRgLlxuICAvL1xuICAvLyBgdW5pdGAgY2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXRlJywgJ2RheU9mWWVhcicsXG4gIC8vICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJy5cblxuICBjb25zdCByZW0xMDAgPSBudW1iZXIgJSAxMDA7XG4gIGlmIChyZW0xMDAgPiAyMCB8fCByZW0xMDAgPCAxMCkge1xuICAgIHN3aXRjaCAocmVtMTAwICUgMTApIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwic3RcIjtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwibmRcIjtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwicmRcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bWJlciArIFwidGhcIjtcbn07XG5cbmNvbnN0IGxvY2FsaXplID0gKGV4cG9ydHMubG9jYWxpemUgPSB7XG4gIG9yZGluYWxOdW1iZXIsXG5cbiAgZXJhOiAoMCwgX2luZGV4LmJ1aWxkTG9jYWxpemVGbikoe1xuICAgIHZhbHVlczogZXJhVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6ICgwLCBfaW5kZXguYnVpbGRMb2NhbGl6ZUZuKSh7XG4gICAgdmFsdWVzOiBxdWFydGVyVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gICAgYXJndW1lbnRDYWxsYmFjazogKHF1YXJ0ZXIpID0+IHF1YXJ0ZXIgLSAxLFxuICB9KSxcblxuICBtb250aDogKDAsIF9pbmRleC5idWlsZExvY2FsaXplRm4pKHtcbiAgICB2YWx1ZXM6IG1vbnRoVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheTogKDAsIF9pbmRleC5idWlsZExvY2FsaXplRm4pKHtcbiAgICB2YWx1ZXM6IGRheVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6ICgwLCBfaW5kZXguYnVpbGRMb2NhbGl6ZUZuKSh7XG4gICAgdmFsdWVzOiBkYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRGb3JtYXR0aW5nV2lkdGg6IFwid2lkZVwiLFxuICB9KSxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLm1hdGNoID0gdm9pZCAwO1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uL19saWIvYnVpbGRNYXRjaEZuLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuLmpzXCIpO1xuXG5jb25zdCBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL14oXFxkKykodGh8c3R8bmR8cmQpPy9pO1xuY29uc3QgcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9cXGQrL2k7XG5cbmNvbnN0IG1hdGNoRXJhUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oYnxhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oYlxcLj9cXHM/Y1xcLj98YlxcLj9cXHM/Y1xcLj9cXHM/ZVxcLj98YVxcLj9cXHM/ZFxcLj98Y1xcLj9cXHM/ZVxcLj8pL2ksXG4gIHdpZGU6IC9eKGJlZm9yZSBjaHJpc3R8YmVmb3JlIGNvbW1vbiBlcmF8YW5ubyBkb21pbml8Y29tbW9uIGVyYSkvaSxcbn07XG5jb25zdCBwYXJzZUVyYVBhdHRlcm5zID0ge1xuICBhbnk6IFsvXmIvaSwgL14oYXxjKS9pXSxcbn07XG5cbmNvbnN0IG1hdGNoUXVhcnRlclBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eWzEyMzRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXnFbMTIzNF0vaSxcbiAgd2lkZTogL15bMTIzNF0odGh8c3R8bmR8cmQpPyBxdWFydGVyL2ksXG59O1xuY29uc3QgcGFyc2VRdWFydGVyUGF0dGVybnMgPSB7XG4gIGFueTogWy8xL2ksIC8yL2ksIC8zL2ksIC80L2ldLFxufTtcblxuY29uc3QgbWF0Y2hNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eW2pmbWFzb25kXS9pLFxuICBhYmJyZXZpYXRlZDogL14oamFufGZlYnxtYXJ8YXByfG1heXxqdW58anVsfGF1Z3xzZXB8b2N0fG5vdnxkZWMpL2ksXG4gIHdpZGU6IC9eKGphbnVhcnl8ZmVicnVhcnl8bWFyY2h8YXByaWx8bWF5fGp1bmV8anVseXxhdWd1c3R8c2VwdGVtYmVyfG9jdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpL2ksXG59O1xuY29uc3QgcGFyc2VNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFtcbiAgICAvXmovaSxcbiAgICAvXmYvaSxcbiAgICAvXm0vaSxcbiAgICAvXmEvaSxcbiAgICAvXm0vaSxcbiAgICAvXmovaSxcbiAgICAvXmovaSxcbiAgICAvXmEvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcblxuICBhbnk6IFtcbiAgICAvXmphL2ksXG4gICAgL15mL2ksXG4gICAgL15tYXIvaSxcbiAgICAvXmFwL2ksXG4gICAgL15tYXkvaSxcbiAgICAvXmp1bi9pLFxuICAgIC9eanVsL2ksXG4gICAgL15hdS9pLFxuICAgIC9ecy9pLFxuICAgIC9eby9pLFxuICAgIC9ebi9pLFxuICAgIC9eZC9pLFxuICBdLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltzbXR3Zl0vaSxcbiAgc2hvcnQ6IC9eKHN1fG1vfHR1fHdlfHRofGZyfHNhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oc3VufG1vbnx0dWV8d2VkfHRodXxmcml8c2F0KS9pLFxuICB3aWRlOiAvXihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSkvaSxcbn07XG5jb25zdCBwYXJzZURheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFsvXnMvaSwgL15tL2ksIC9edC9pLCAvXncvaSwgL150L2ksIC9eZi9pLCAvXnMvaV0sXG4gIGFueTogWy9ec3UvaSwgL15tL2ksIC9edHUvaSwgL153L2ksIC9edGgvaSwgL15mL2ksIC9ec2EvaV0sXG59O1xuXG5jb25zdCBtYXRjaERheVBlcmlvZFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGF8cHxtaXxufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSxcbiAgYW55OiAvXihbYXBdXFwuP1xccz9tXFwuP3xtaWRuaWdodHxub29ufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSxcbn07XG5jb25zdCBwYXJzZURheVBlcmlvZFBhdHRlcm5zID0ge1xuICBhbnk6IHtcbiAgICBhbTogL15hL2ksXG4gICAgcG06IC9ecC9pLFxuICAgIG1pZG5pZ2h0OiAvXm1pL2ksXG4gICAgbm9vbjogL15uby9pLFxuICAgIG1vcm5pbmc6IC9tb3JuaW5nL2ksXG4gICAgYWZ0ZXJub29uOiAvYWZ0ZXJub29uL2ksXG4gICAgZXZlbmluZzogL2V2ZW5pbmcvaSxcbiAgICBuaWdodDogL25pZ2h0L2ksXG4gIH0sXG59O1xuXG5jb25zdCBtYXRjaCA9IChleHBvcnRzLm1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiAoMCwgX2luZGV4Mi5idWlsZE1hdGNoUGF0dGVybkZuKSh7XG4gICAgbWF0Y2hQYXR0ZXJuOiBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHBhcnNlUGF0dGVybjogcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICB2YWx1ZUNhbGxiYWNrOiAodmFsdWUpID0+IHBhcnNlSW50KHZhbHVlLCAxMCksXG4gIH0pLFxuXG4gIGVyYTogKDAsIF9pbmRleC5idWlsZE1hdGNoRm4pKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaEVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZUVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBxdWFydGVyOiAoMCwgX2luZGV4LmJ1aWxkTWF0Y2hGbikoe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgICB2YWx1ZUNhbGxiYWNrOiAoaW5kZXgpID0+IGluZGV4ICsgMSxcbiAgfSksXG5cbiAgbW9udGg6ICgwLCBfaW5kZXguYnVpbGRNYXRjaEZuKSh7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZU1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheTogKDAsIF9pbmRleC5idWlsZE1hdGNoRm4pKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6ICgwLCBfaW5kZXguYnVpbGRNYXRjaEZuKSh7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJhbnlcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLm1heCA9IG1heDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgbWF4XG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgbGF0ZXN0IG9mIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgbGF0ZXN0IG9mIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZXMgLSBUaGUgZGF0ZXMgdG8gY29tcGFyZVxuICpcbiAqIEByZXR1cm5zIFRoZSBsYXRlc3Qgb2YgdGhlIGRhdGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIG9mIHRoZXNlIGRhdGVzIGlzIHRoZSBsYXRlc3Q/XG4gKiBjb25zdCByZXN1bHQgPSBtYXgoW1xuICogICBuZXcgRGF0ZSgxOTg5LCA2LCAxMCksXG4gKiAgIG5ldyBEYXRlKDE5ODcsIDEsIDExKSxcbiAqICAgbmV3IERhdGUoMTk5NSwgNiwgMiksXG4gKiAgIG5ldyBEYXRlKDE5OTAsIDAsIDEpXG4gKiBdKVxuICogLy89PiBTdW4gSnVsIDAyIDE5OTUgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gbWF4KGRhdGVzKSB7XG4gIGxldCByZXN1bHQ7XG4gIGRhdGVzLmZvckVhY2goZnVuY3Rpb24gKGRpcnR5RGF0ZSkge1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRpcnR5RGF0ZSk7XG5cbiAgICBpZiAoXG4gICAgICByZXN1bHQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgcmVzdWx0IDwgY3VycmVudERhdGUgfHxcbiAgICAgIGlzTmFOKE51bWJlcihjdXJyZW50RGF0ZSkpXG4gICAgKSB7XG4gICAgICByZXN1bHQgPSBjdXJyZW50RGF0ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQgfHwgbmV3IERhdGUoTmFOKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5taW4gPSBtaW47XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIG1pblxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBlYXJsaWVzdCBvZiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIHRoZSBlYXJsaWVzdCBvZiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVzIC0gVGhlIGRhdGVzIHRvIGNvbXBhcmVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZWFybGllc3Qgb2YgdGhlIGRhdGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIG9mIHRoZXNlIGRhdGVzIGlzIHRoZSBlYXJsaWVzdD9cbiAqIGNvbnN0IHJlc3VsdCA9IG1pbihbXG4gKiAgIG5ldyBEYXRlKDE5ODksIDYsIDEwKSxcbiAqICAgbmV3IERhdGUoMTk4NywgMSwgMTEpLFxuICogICBuZXcgRGF0ZSgxOTk1LCA2LCAyKSxcbiAqICAgbmV3IERhdGUoMTk5MCwgMCwgMSlcbiAqIF0pXG4gKiAvLz0+IFdlZCBGZWIgMTEgMTk4NyAwMDowMDowMFxuICovXG5mdW5jdGlvbiBtaW4oZGF0ZXMpIHtcbiAgbGV0IHJlc3VsdDtcblxuICBkYXRlcy5mb3JFYWNoKChkaXJ0eURhdGUpID0+IHtcbiAgICBjb25zdCBkYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRpcnR5RGF0ZSk7XG4gICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0ID4gZGF0ZSB8fCBpc05hTigrZGF0ZSkpIHtcbiAgICAgIHJlc3VsdCA9IGRhdGU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0IHx8IG5ldyBEYXRlKE5hTik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxvbmdGb3JtYXR0ZXJzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9pbmRleDUubG9uZ0Zvcm1hdHRlcnM7XG4gIH0sXG59KTtcbmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInBhcnNlcnNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2luZGV4Ny5wYXJzZXJzO1xuICB9LFxufSk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vZ2V0RGVmYXVsdE9wdGlvbnMuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdExvY2FsZS5qc1wiKTtcbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG52YXIgX2luZGV4NSA9IHJlcXVpcmUoXCIuL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzLmpzXCIpO1xudmFyIF9pbmRleDYgPSByZXF1aXJlKFwiLi9fbGliL3Byb3RlY3RlZFRva2Vucy5qc1wiKTtcblxudmFyIF9pbmRleDcgPSByZXF1aXJlKFwiLi9wYXJzZS9fbGliL3BhcnNlcnMuanNcIik7XG5cbnZhciBfU2V0dGVyID0gcmVxdWlyZShcIi4vcGFyc2UvX2xpYi9TZXR0ZXIuanNcIik7XG5cbi8vIFJleHBvcnRzIG9mIGludGVybmFsIGZvciBsaWJyYXJpZXMgdG8gdXNlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM2MzgjaXNzdWVjb21tZW50LTE4NzcwODI4NzRcblxuLyoqXG4gKiBUaGUge0BsaW5rIHBhcnNlfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8vIFRoaXMgUmVnRXhwIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzIHNlcGFyYXRlZCBieSBgfGA6XG4vLyAtIFt5WVFxTUx3SWREZWNpaEhLa21zXW8gbWF0Y2hlcyBhbnkgYXZhaWxhYmxlIG9yZGluYWwgbnVtYmVyIHRva2VuXG4vLyAgIChvbmUgb2YgdGhlIGNlcnRhaW4gbGV0dGVycyBmb2xsb3dlZCBieSBgb2ApXG4vLyAtIChcXHcpXFwxKiBtYXRjaGVzIGFueSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgbGV0dGVyXG4vLyAtICcnIG1hdGNoZXMgdHdvIHF1b3RlIGNoYXJhY3RlcnMgaW4gYSByb3dcbi8vIC0gJygnJ3xbXiddKSsoJ3wkKSBtYXRjaGVzIGFueXRoaW5nIHN1cnJvdW5kZWQgYnkgdHdvIHF1b3RlIGNoYXJhY3RlcnMgKCcpLFxuLy8gICBleGNlcHQgYSBzaW5nbGUgcXVvdGUgc3ltYm9sLCB3aGljaCBlbmRzIHRoZSBzZXF1ZW5jZS5cbi8vICAgVHdvIHF1b3RlIGNoYXJhY3RlcnMgZG8gbm90IGVuZCB0aGUgc2VxdWVuY2UuXG4vLyAgIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHNpbmdsZSBxdW90ZVxuLy8gICB0aGVuIHRoZSBzZXF1ZW5jZSB3aWxsIGNvbnRpbnVlIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0cmluZy5cbi8vIC0gLiBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyIHVubWF0Y2hlZCBieSBwcmV2aW91cyBwYXJ0cyBvZiB0aGUgUmVnRXhwc1xuY29uc3QgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9XG4gIC9beVlRcU1Md0lkRGVjaWhIS2ttc11vfChcXHcpXFwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuLy8gVGhpcyBSZWdFeHAgY2F0Y2hlcyBzeW1ib2xzIGVzY2FwZWQgYnkgcXVvdGVzLCBhbmQgYWxzb1xuLy8gc2VxdWVuY2VzIG9mIHN5bWJvbHMgUCwgcCwgYW5kIHRoZSBjb21iaW5hdGlvbnMgbGlrZSBgUFBQUFBQUHBwcHBwYFxuY29uc3QgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPSAvUCtwK3xQK3xwK3wnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuY29uc3QgZXNjYXBlZFN0cmluZ1JlZ0V4cCA9IC9eJyhbXl0qPyknPyQvO1xuY29uc3QgZG91YmxlUXVvdGVSZWdFeHAgPSAvJycvZztcblxuY29uc3Qgbm90V2hpdGVzcGFjZVJlZ0V4cCA9IC9cXFMvO1xuY29uc3QgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAgPSAvW2EtekEtWl0vO1xuXG4vKipcbiAqIEBuYW1lIHBhcnNlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFBhcnNlIHRoZSBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBkYXRlIHBhcnNlZCBmcm9tIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4gZm9ybWF0IHN0cmluZy5cbiAqXG4gKiA+IOKaoO+4jyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBgZm9ybWF0YCB0b2tlbnMgZGlmZmVyIGZyb20gTW9tZW50LmpzIGFuZCBvdGhlciBsaWJyYXJpZXMuXG4gKiA+IFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIFRoZSBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtYXQgc3RyaW5nIHdyYXBwZWQgYmV0d2VlbiB0d28gc2luZ2xlIHF1b3RlcyBjaGFyYWN0ZXJzICgnKSBhcmUgZXNjYXBlZC5cbiAqIFR3byBzaW5nbGUgcXVvdGVzIGluIGEgcm93LCB3aGV0aGVyIGluc2lkZSBvciBvdXRzaWRlIGEgcXVvdGVkIHNlcXVlbmNlLCByZXByZXNlbnQgYSAncmVhbCcgc2luZ2xlIHF1b3RlLlxuICpcbiAqIEZvcm1hdCBvZiB0aGUgZm9ybWF0IHN0cmluZyBpcyBiYXNlZCBvbiBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzU6XG4gKiBodHRwczovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS1kYXRlcy5odG1sI0RhdGVfRmllbGRfU3ltYm9sX1RhYmxlXG4gKiB3aXRoIGEgZmV3IGFkZGl0aW9ucyAoc2VlIG5vdGUgNSBiZWxvdyB0aGUgdGFibGUpLlxuICpcbiAqIE5vdCBhbGwgdG9rZW5zIGFyZSBjb21wYXRpYmxlLiBDb21iaW5hdGlvbnMgdGhhdCBkb24ndCBtYWtlIHNlbnNlIG9yIGNvdWxkIGxlYWQgdG8gYnVncyBhcmUgcHJvaGliaXRlZFxuICogYW5kIHdpbGwgdGhyb3cgYFJhbmdlRXJyb3JgLiBGb3IgZXhhbXBsZSB1c2FnZSBvZiAyNC1ob3VyIGZvcm1hdCB0b2tlbiB3aXRoIEFNL1BNIHRva2VuIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHBhcnNlKCcyMyBBTScsICdISCBhJywgbmV3IERhdGUoKSlcbiAqIC8vPT4gUmFuZ2VFcnJvcjogVGhlIGZvcm1hdCBzdHJpbmcgbXVzdG4ndCBjb250YWluIGBISGAgYW5kIGBhYCBhdCB0aGUgc2FtZSB0aW1lXG4gKiBgYGBcbiAqXG4gKiBTZWUgdGhlIGNvbXBhdGliaWxpdHkgdGFibGU6IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kL2UvMlBBQ1gtMXZRT1BVM3hVaHBsbGw2ZHlvTW1WVVhIS2xfOENSRHM2X3VlTG1leDNTb3F3aHVvbGt1TjNPMDVsNHJxeDVoMWRLWDhlYjQ2VWwtQ0NTcnEvcHViaHRtbD9naWQ9MCZzaW5nbGU9dHJ1ZVxuICpcbiAqIEFjY2VwdGVkIGZvcm1hdCBzdHJpbmcgcGF0dGVybnM6XG4gKiB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFByaW9yfCBQYXR0ZXJuIHwgUmVzdWx0IGV4YW1wbGVzICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLXxcbiAqIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE0MCB8IEcuLkdHRyAgfCBBRCwgQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBHR0dHICAgIHwgQW5ubyBEb21pbmksIEJlZm9yZSBDaHJpc3QgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgR0dHR0cgICB8IEEsIEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQ2FsZW5kYXIgeWVhciAgICAgICAgICAgICAgICAgICB8IDEzMCB8IHkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNywgOTk5OSAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB5byAgICAgIHwgNDR0aCwgMXN0LCAxOTAwdGgsIDk5OTk5OTl0aCAgICAgIHwgNCw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeXkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHl5eSAgICAgfCAwNDQsIDAwMSwgMTIzLCA5OTkgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB5eXl5ICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeXl5eXkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIsNCAgIHxcbiAqIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICB8IDEzMCB8IFkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNywgOTAwMCAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBZbyAgICAgIHwgNDR0aCwgMXN0LCAxOTAwdGgsIDk5OTk5OTl0aCAgICAgIHwgNCw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWVkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDQsNiAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFlZWSAgICAgfCAwNDQsIDAwMSwgMTIzLCA5OTkgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBZWVlZICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNCw2ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWVlZWVkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIsNCAgIHxcbiAqIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgICB8IDEzMCB8IFIgICAgICAgfCAtNDMsIDEsIDE5MDAsIDIwMTcsIDk5OTksIC05OTk5ICAgfCA0LDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBSUiAgICAgIHwgLTQzLCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgIHwgNCw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUlJSICAgICB8IC0wNDMsIDAwMSwgMTIzLCA5OTksIC05OTkgICAgICAgICB8IDQsNSAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFJSUlIgICAgfCAtMDA0MywgMDAwMSwgMjAxNywgOTk5OSwgLTk5OTkgICAgfCA0LDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBSUlJSUiAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiw0LDUgfFxuICogfCBFeHRlbmRlZCB5ZWFyICAgICAgICAgICAgICAgICAgIHwgMTMwIHwgdSAgICAgICB8IC00MywgMSwgMTkwMCwgMjAxNywgOTk5OSwgLTk5OSAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHV1ICAgICAgfCAtNDMsIDAxLCA5OSwgLTk5ICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB1dXUgICAgIHwgLTA0MywgMDAxLCAxMjMsIDk5OSwgLTk5OSAgICAgICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgdXV1dSAgICB8IC0wMDQzLCAwMDAxLCAyMDE3LCA5OTk5LCAtOTk5OSAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHV1dXV1ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyLDQgICB8XG4gKiB8IFF1YXJ0ZXIgKGZvcm1hdHRpbmcpICAgICAgICAgICAgfCAxMjAgfCBRICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFFRICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBRUVEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUVFRUSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFFRUVFRICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8IFF1YXJ0ZXIgKHN0YW5kLWFsb25lKSAgICAgICAgICAgfCAxMjAgfCBxICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgcW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHFxICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBxcXEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgcXFxcSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHFxcXFxICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAzICAgICB8XG4gKiB8IE1vbnRoIChmb3JtYXR0aW5nKSAgICAgICAgICAgICAgfCAxMTAgfCBNICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IE1NICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBNTU0gICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTU1NTSAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IE1NTU1NICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1vbnRoIChzdGFuZC1hbG9uZSkgICAgICAgICAgICAgfCAxMTAgfCBMICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IExMICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBMTEwgICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTExMTCAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IExMTExMICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgfCAxMDAgfCB3ICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgd28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHd3ICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICAgfCAxMDAgfCBJICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgSW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IElJICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICAgfCAgOTAgfCBkICAgICAgIHwgMSwgMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDMxc3QgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGRkICAgICAgfCAwMSwgMDIsIC4uLiwgMzEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICAgfCAgOTAgfCBEICAgICAgIHwgMSwgMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgRG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDM2NXRoLCAzNjZ0aCAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEREICAgICAgfCAwMSwgMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBEREQgICAgIHwgMDAxLCAwMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgRERERCAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgRGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICAgICAgICB8ICA5MCB8IEUuLkVFRSAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBFRUVFICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgRUVFRUUgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEVFRUVFRSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgfCAgOTAgfCBpICAgICAgIHwgMSwgMiwgMywgLi4uLCA3ICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDd0aCAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGlpICAgICAgfCAwMSwgMDIsIC4uLiwgMDcgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBpaWkgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaWlpaSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIsNSAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGlpaWlpICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBpaWlpaWkgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgNSAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgIHwgIDkwIHwgZSAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGVvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBlZSAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZWVlICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGVlZWUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBlZWVlZSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZWVlZWVlICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgZGF5IG9mIHdlZWsgKHN0YW5kLWFsb25lKSB8ICA5MCB8IGMgICAgICAgfCAyLCAzLCA0LCAuLi4sIDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBjbyAgICAgIHwgMm5kLCAzcmQsIC4uLiwgMXN0ICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgY2MgICAgICB8IDAyLCAwMywgLi4uLCAwMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGNjYyAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBjY2NjICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgY2NjY2MgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGNjY2NjYyAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODAgfCBhLi5hYWEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgYWFhYSAgICB8IGEubS4sIHAubS4gICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGFhYWFhICAgfCBhLCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgfCAgODAgfCBiLi5iYmIgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgYmJiYiAgICB8IGEubS4sIHAubS4sIG5vb24sIG1pZG5pZ2h0ICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGJiYmJiICAgfCBhLCBwLCBuLCBtaSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICAgfCAgODAgfCBCLi5CQkIgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgQkJCQiAgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEJCQkJCICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICAgfCAgNzAgfCBoICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDEydGggICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGhoICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICAgfCAgNzAgfCBIICAgICAgIHwgMCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgSG8gICAgICB8IDB0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEhIICAgICAgfCAwMCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICAgfCAgNzAgfCBLICAgICAgIHwgMSwgMiwgLi4uLCAxMSwgMCAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgS28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDExdGgsIDB0aCAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEtLICAgICAgfCAwMSwgMDIsIC4uLiwgMTEsIDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICAgfCAgNzAgfCBrICAgICAgIHwgMjQsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwga28gICAgICB8IDI0dGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGtrICAgICAgfCAyNCwgMDEsIDAyLCAuLi4sIDIzICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNjAgfCBtICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgbW8gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IG1tICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTAgfCBzICAgICAgIHwgMCwgMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgc28gICAgICB8IDB0aCwgMXN0LCAuLi4sIDU5dGggICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHNzICAgICAgfCAwMCwgMDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICAgfCAgNDAgfCB0ICAgICAgIHwgNTEyOTY5NTIwICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgdHQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgICB8ICAzMCB8IFMgICAgICAgfCAwLCAxLCAuLi4sIDkgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBTUyAgICAgIHwgMDAsIDAxLCAuLi4sIDk5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgU1NTICAgICB8IDAwMCwgMDAxLCAuLi4sIDk5OSAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFNTU1MgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgfCAgMjAgfCBUICAgICAgIHwgNTEyOTY5NTIwOTAwICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVFQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvIFopICAgICAgICB8ICAxMCB8IFggICAgICAgfCAtMDgsICswNTMwLCBaICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBYWCAgICAgIHwgLTA4MDAsICswNTMwLCBaICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWFhYICAgICB8IC0wODowMCwgKzA1OjMwLCBaICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFhYWFggICAgfCAtMDgwMCwgKzA1MzAsIFosICsxMjM0NTYgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBYWFhYWCAgIHwgLTA4OjAwLCArMDU6MzAsIFosICsxMjozNDo1NiAgICAgIHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgIHwgIDEwIHwgeCAgICAgICB8IC0wOCwgKzA1MzAsICswMCAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHh4ICAgICAgfCAtMDgwMCwgKzA1MzAsICswMDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB4eHggICAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeHh4eCAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAsICsxMjM0NTYgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHh4eHh4ICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwLCArMTI6MzQ6NTYgfCAgICAgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICAgfCAgTkEgfCBQICAgICAgIHwgMDUvMjkvMTQ1MyAgICAgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUFAgICAgICB8IE1heSAyOSwgMTQ1MyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFBQUCAgICAgfCBNYXkgMjl0aCwgMTQ1MyAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBQUFBQICAgIHwgU3VuZGF5LCBNYXkgMjl0aCwgMTQ1MyAgICAgICAgICAgIHwgMiw1LDggfFxuICogfCBMb25nIGxvY2FsaXplZCB0aW1lICAgICAgICAgICAgIHwgIE5BIHwgcCAgICAgICB8IDEyOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICAgICB8IDUsOCAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHBwICAgICAgfCAxMjowMDowMCBBTSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IENvbWJpbmF0aW9uIG9mIGRhdGUgYW5kIHRpbWUgICAgfCAgTkEgfCBQcCAgICAgIHwgMDUvMjkvMTQ1MywgMTI6MDAgQU0gICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUFBwcCAgICB8IE1heSAyOSwgMTQ1MywgMTI6MDA6MDAgQU0gICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFBQUHBwICAgfCBNYXkgMjl0aCwgMTQ1MyBhdCAuLi4gICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBQUFBQcHAgIHwgU3VuZGF5LCBNYXkgMjl0aCwgMTQ1MyBhdCAuLi4gICAgIHwgMiw1LDggfFxuICogTm90ZXM6XG4gKiAxLiBcIkZvcm1hdHRpbmdcIiB1bml0cyAoZS5nLiBmb3JtYXR0aW5nIHF1YXJ0ZXIpIGluIHRoZSBkZWZhdWx0IGVuLVVTIGxvY2FsZVxuICogICAgYXJlIHRoZSBzYW1lIGFzIFwic3RhbmQtYWxvbmVcIiB1bml0cywgYnV0IGFyZSBkaWZmZXJlbnQgaW4gc29tZSBsYW5ndWFnZXMuXG4gKiAgICBcIkZvcm1hdHRpbmdcIiB1bml0cyBhcmUgZGVjbGluZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgbGFuZ3VhZ2VcbiAqICAgIGluIHRoZSBjb250ZXh0IG9mIGEgZGF0ZS4gXCJTdGFuZC1hbG9uZVwiIHVuaXRzIGFyZSBhbHdheXMgbm9taW5hdGl2ZSBzaW5ndWxhci5cbiAqICAgIEluIGBmb3JtYXRgIGZ1bmN0aW9uLCB0aGV5IHdpbGwgcHJvZHVjZSBkaWZmZXJlbnQgcmVzdWx0OlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTExMTCcsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWQnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTU1NTScsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWR1J2BcbiAqXG4gKiAgICBgcGFyc2VgIHdpbGwgdHJ5IHRvIG1hdGNoIGJvdGggZm9ybWF0dGluZyBhbmQgc3RhbmQtYWxvbmUgdW5pdHMgaW50ZXJjaGFuZ2FibHkuXG4gKlxuICogMi4gQW55IHNlcXVlbmNlIG9mIHRoZSBpZGVudGljYWwgbGV0dGVycyBpcyBhIHBhdHRlcm4sIHVubGVzcyBpdCBpcyBlc2NhcGVkIGJ5XG4gKiAgICB0aGUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgKHNlZSBiZWxvdykuXG4gKiAgICBJZiB0aGUgc2VxdWVuY2UgaXMgbG9uZ2VyIHRoYW4gbGlzdGVkIGluIHRhYmxlOlxuICogICAgLSBmb3IgbnVtZXJpY2FsIHVuaXRzIChgeXl5eXl5eXlgKSBgcGFyc2VgIHdpbGwgdHJ5IHRvIG1hdGNoIGEgbnVtYmVyXG4gKiAgICAgIGFzIHdpZGUgYXMgdGhlIHNlcXVlbmNlXG4gKiAgICAtIGZvciB0ZXh0IHVuaXRzIChgTU1NTU1NTU1gKSBgcGFyc2VgIHdpbGwgdHJ5IHRvIG1hdGNoIHRoZSB3aWRlc3QgdmFyaWF0aW9uIG9mIHRoZSB1bml0LlxuICogICAgICBUaGVzZSB2YXJpYXRpb25zIGFyZSBtYXJrZWQgd2l0aCBcIjJcIiBpbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIHRhYmxlLlxuICpcbiAqIDMuIGBRUVFRUWAgYW5kIGBxcXFxcWAgY291bGQgYmUgbm90IHN0cmljdGx5IG51bWVyaWNhbCBpbiBzb21lIGxvY2FsZXMuXG4gKiAgICBUaGVzZSB0b2tlbnMgcmVwcmVzZW50IHRoZSBzaG9ydGVzdCBmb3JtIG9mIHRoZSBxdWFydGVyLlxuICpcbiAqIDQuIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBwYXR0ZXJucyBhcmUgQi5DLiB5ZWFyczpcbiAqXG4gKiAgICB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICogICAgfC0tLS0tLXwtLS0tLXwtLS0tLXxcbiAqICAgIHwgQUMgMSB8ICAgMSB8ICAgMSB8XG4gKiAgICB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICogICAgfCBCQyAyIHwgICAyIHwgIC0xIHxcbiAqXG4gKiAgICBBbHNvIGB5eWAgd2lsbCB0cnkgdG8gZ3Vlc3MgdGhlIGNlbnR1cnkgb2YgdHdvIGRpZ2l0IHllYXIgYnkgcHJveGltaXR5IHdpdGggYHJlZmVyZW5jZURhdGVgOlxuICpcbiAqICAgIGBwYXJzZSgnNTAnLCAneXknLCBuZXcgRGF0ZSgyMDE4LCAwLCAxKSkgLy89PiBTYXQgSmFuIDAxIDIwNTAgMDA6MDA6MDBgXG4gKlxuICogICAgYHBhcnNlKCc3NScsICd5eScsIG5ldyBEYXRlKDIwMTgsIDAsIDEpKSAvLz0+IFdlZCBKYW4gMDEgMTk3NSAwMDowMDowMGBcbiAqXG4gKiAgICB3aGlsZSBgdXVgIHdpbGwganVzdCBhc3NpZ24gdGhlIHllYXIgYXMgaXM6XG4gKlxuICogICAgYHBhcnNlKCc1MCcsICd1dScsIG5ldyBEYXRlKDIwMTgsIDAsIDEpKSAvLz0+IFNhdCBKYW4gMDEgMDA1MCAwMDowMDowMGBcbiAqXG4gKiAgICBgcGFyc2UoJzc1JywgJ3V1JywgbmV3IERhdGUoMjAxOCwgMCwgMSkpIC8vPT4gVHVlIEphbiAwMSAwMDc1IDAwOjAwOjAwYFxuICpcbiAqICAgIFRoZSBzYW1lIGRpZmZlcmVuY2UgaXMgdHJ1ZSBmb3IgbG9jYWwgYW5kIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFycyAoYFlgIGFuZCBgUmApLFxuICogICAgZXhjZXB0IGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJzIGFyZSBkZXBlbmRlbnQgb24gYG9wdGlvbnMud2Vla1N0YXJ0c09uYFxuICogICAgYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKGNvbXBhcmUgW3NldElTT1dlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL3NldElTT1dlZWtZZWFyKVxuICogICAgYW5kIFtzZXRXZWVrWWVhcl0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9zZXRXZWVrWWVhcikpLlxuICpcbiAqIDUuIFRoZXNlIHBhdHRlcm5zIGFyZSBub3QgaW4gdGhlIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqICAgIC0gYGlgOiBJU08gZGF5IG9mIHdlZWtcbiAqICAgIC0gYElgOiBJU08gd2VlayBvZiB5ZWFyXG4gKiAgICAtIGBSYDogSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqICAgIC0gYG9gOiBvcmRpbmFsIG51bWJlciBtb2RpZmllclxuICogICAgLSBgUGA6IGxvbmcgbG9jYWxpemVkIGRhdGVcbiAqICAgIC0gYHBgOiBsb25nIGxvY2FsaXplZCB0aW1lXG4gKlxuICogNi4gYFlZYCBhbmQgYFlZWVlgIHRva2VucyByZXByZXNlbnQgd2Vlay1udW1iZXJpbmcgeWVhcnMgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggeWVhcnMuXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiA3LiBgRGAgYW5kIGBERGAgdG9rZW5zIHJlcHJlc2VudCBkYXlzIG9mIHRoZSB5ZWFyIGJ1dCB0aGV5IGFyZSBvZnRoZW4gY29uZnVzZWQgd2l0aCBkYXlzIG9mIHRoZSBtb250aC5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiA4LiBgUCtgIHRva2VucyBkbyBub3QgaGF2ZSBhIGRlZmluZWQgcHJpb3JpdHkgc2luY2UgdGhleSBhcmUgbWVyZWx5IGFsaWFzZXMgdG8gb3RoZXIgdG9rZW5zIGJhc2VkXG4gKiAgICBvbiB0aGUgZ2l2ZW4gbG9jYWxlLlxuICpcbiAqICAgIHVzaW5nIGBlbi1VU2AgbG9jYWxlOiBgUGAgPT4gYE1NL2RkL3l5eXlgXG4gKiAgICB1c2luZyBgZW4tVVNgIGxvY2FsZTogYHBgID0+IGBoaDptbSBhYFxuICogICAgdXNpbmcgYHB0LUJSYCBsb2NhbGU6IGBQYCA9PiBgZGQvTU0veXl5eWBcbiAqICAgIHVzaW5nIGBwdC1CUmAgbG9jYWxlOiBgcGAgPT4gYEhIOm1tYFxuICpcbiAqIFZhbHVlcyB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBkYXRlIGluIHRoZSBkZXNjZW5kaW5nIG9yZGVyIG9mIGl0cyB1bml0J3MgcHJpb3JpdHkuXG4gKiBVbml0cyBvZiBhbiBlcXVhbCBwcmlvcml0eSBvdmVyd3JpdGUgZWFjaCBvdGhlciBpbiB0aGUgb3JkZXIgb2YgYXBwZWFyYW5jZS5cbiAqXG4gKiBJZiBubyB2YWx1ZXMgb2YgaGlnaGVyIHByaW9yaXR5IGFyZSBwYXJzZWQgKGUuZy4gd2hlbiBwYXJzaW5nIHN0cmluZyAnSmFudWFyeSAxc3QnIHdpdGhvdXQgYSB5ZWFyKSxcbiAqIHRoZSB2YWx1ZXMgd2lsbCBiZSB0YWtlbiBmcm9tIDNyZCBhcmd1bWVudCBgcmVmZXJlbmNlRGF0ZWAgd2hpY2ggd29ya3MgYXMgYSBjb250ZXh0IG9mIHBhcnNpbmcuXG4gKlxuICogYHJlZmVyZW5jZURhdGVgIG11c3QgYmUgcGFzc2VkIGZvciBjb3JyZWN0IHdvcmsgb2YgdGhlIGZ1bmN0aW9uLlxuICogSWYgeW91J3JlIG5vdCBzdXJlIHdoaWNoIGByZWZlcmVuY2VEYXRlYCB0byBzdXBwbHksIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBEYXRlOlxuICogYHBhcnNlKCcwMi8xMS8yMDE0JywgJ01NL2RkL3l5eXknLCBuZXcgRGF0ZSgpKWBcbiAqIEluIHRoaXMgY2FzZSBwYXJzaW5nIHdpbGwgYmUgZG9uZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBkYXRlLlxuICogSWYgYHJlZmVyZW5jZURhdGVgIGlzIGBJbnZhbGlkIERhdGVgIG9yIGEgdmFsdWUgbm90IGNvbnZlcnRpYmxlIHRvIHZhbGlkIGBEYXRlYCxcbiAqIHRoZW4gYEludmFsaWQgRGF0ZWAgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBUaGUgcmVzdWx0IG1heSB2YXJ5IGJ5IGxvY2FsZS5cbiAqXG4gKiBJZiBgZm9ybWF0U3RyaW5nYCBtYXRjaGVzIHdpdGggYGRhdGVTdHJpbmdgIGJ1dCBkb2VzIG5vdCBwcm92aWRlcyB0b2tlbnMsIGByZWZlcmVuY2VEYXRlYCB3aWxsIGJlIHJldHVybmVkLlxuICpcbiAqIElmIHBhcnNpbmcgZmFpbGVkLCBgSW52YWxpZCBEYXRlYCB3aWxsIGJlIHJldHVybmVkLlxuICogSW52YWxpZCBEYXRlIGlzIGEgRGF0ZSwgd2hvc2UgdGltZSB2YWx1ZSBpcyBOYU4uXG4gKiBUaW1lIHZhbHVlIG9mIERhdGU6IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuOS4xLjFcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZVN0ciAtIFRoZSBzdHJpbmcgdG8gcGFyc2VcbiAqIEBwYXJhbSBmb3JtYXRTdHIgLSBUaGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIHJlZmVyZW5jZURhdGUgLSBkZWZpbmVzIHZhbHVlcyBtaXNzaW5nIGZyb20gdGhlIHBhcnNlZCBkYXRlU3RyaW5nXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKiAgIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogICBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGRhdGVcbiAqXG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBtYXRjaGAgcHJvcGVydHlcbiAqIEB0aHJvd3MgdXNlIGB5eXl5YCBpbnN0ZWFkIG9mIGBZWVlZYCBmb3IgZm9ybWF0dGluZyB5ZWFycyB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgeXlgIGluc3RlYWQgb2YgYFlZYCBmb3IgZm9ybWF0dGluZyB5ZWFycyB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGAgaW5zdGVhZCBvZiBgRGAgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYGRkYCBpbnN0ZWFkIG9mIGBERGAgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyBmb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUGFyc2UgMTEgRmVicnVhcnkgMjAxNCBmcm9tIG1pZGRsZS1lbmRpYW4gZm9ybWF0OlxuICogdmFyIHJlc3VsdCA9IHBhcnNlKCcwMi8xMS8yMDE0JywgJ01NL2RkL3l5eXknLCBuZXcgRGF0ZSgpKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUGFyc2UgMjh0aCBvZiBGZWJydWFyeSBpbiBFc3BlcmFudG8gbG9jYWxlIGluIHRoZSBjb250ZXh0IG9mIDIwMTAgeWVhcjpcbiAqIGltcG9ydCBlbyBmcm9tICdkYXRlLWZucy9sb2NhbGUvZW8nXG4gKiB2YXIgcmVzdWx0ID0gcGFyc2UoJzI4LWEgZGUgZmVicnVhcm8nLCBcImRvICdkZScgTU1NTVwiLCBuZXcgRGF0ZSgyMDEwLCAwLCAxKSwge1xuICogICBsb2NhbGU6IGVvXG4gKiB9KVxuICogLy89PiBTdW4gRmViIDI4IDIwMTAgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gcGFyc2UoZGF0ZVN0ciwgZm9ybWF0U3RyLCByZWZlcmVuY2VEYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDIuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IGxvY2FsZSA9XG4gICAgb3B0aW9ucz8ubG9jYWxlID8/IGRlZmF1bHRPcHRpb25zLmxvY2FsZSA/PyBfaW5kZXgzLmRlZmF1bHRMb2NhbGU7XG5cbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGlmIChmb3JtYXRTdHIgPT09IFwiXCIpIHtcbiAgICBpZiAoZGF0ZVN0ciA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuICgwLCBfaW5kZXg0LnRvRGF0ZSkocmVmZXJlbmNlRGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIE5hTik7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3ViRm5PcHRpb25zID0ge1xuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSxcbiAgICB3ZWVrU3RhcnRzT24sXG4gICAgbG9jYWxlLFxuICB9O1xuXG4gIC8vIElmIHRpbWV6b25lIGlzbid0IHNwZWNpZmllZCwgaXQgd2lsbCBiZSBzZXQgdG8gdGhlIHN5c3RlbSB0aW1lem9uZVxuICBjb25zdCBzZXR0ZXJzID0gW25ldyBfU2V0dGVyLkRhdGVUb1N5c3RlbVRpbWV6b25lU2V0dGVyKCldO1xuXG4gIGNvbnN0IHRva2VucyA9IGZvcm1hdFN0clxuICAgIC5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyIGluIF9pbmRleDUubG9uZ0Zvcm1hdHRlcnMpIHtcbiAgICAgICAgY29uc3QgbG9uZ0Zvcm1hdHRlciA9IF9pbmRleDUubG9uZ0Zvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdO1xuICAgICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdHJpbmc7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKVxuICAgIC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwKTtcblxuICBjb25zdCB1c2VkVG9rZW5zID0gW107XG5cbiAgZm9yIChsZXQgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgaWYgKFxuICAgICAgIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJlxuICAgICAgKDAsIF9pbmRleDYuaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKSh0b2tlbilcbiAgICApIHtcbiAgICAgICgwLCBfaW5kZXg2Lndhcm5PclRocm93UHJvdGVjdGVkRXJyb3IpKHRva2VuLCBmb3JtYXRTdHIsIGRhdGVTdHIpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJlxuICAgICAgKDAsIF9pbmRleDYuaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbikodG9rZW4pXG4gICAgKSB7XG4gICAgICAoMCwgX2luZGV4Ni53YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKSh0b2tlbiwgZm9ybWF0U3RyLCBkYXRlU3RyKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHRva2VuWzBdO1xuICAgIGNvbnN0IHBhcnNlciA9IF9pbmRleDcucGFyc2Vyc1tmaXJzdENoYXJhY3Rlcl07XG4gICAgaWYgKHBhcnNlcikge1xuICAgICAgY29uc3QgeyBpbmNvbXBhdGlibGVUb2tlbnMgfSA9IHBhcnNlcjtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGluY29tcGF0aWJsZVRva2VucykpIHtcbiAgICAgICAgY29uc3QgaW5jb21wYXRpYmxlVG9rZW4gPSB1c2VkVG9rZW5zLmZpbmQoXG4gICAgICAgICAgKHVzZWRUb2tlbikgPT5cbiAgICAgICAgICAgIGluY29tcGF0aWJsZVRva2Vucy5pbmNsdWRlcyh1c2VkVG9rZW4udG9rZW4pIHx8XG4gICAgICAgICAgICB1c2VkVG9rZW4udG9rZW4gPT09IGZpcnN0Q2hhcmFjdGVyLFxuICAgICAgICApO1xuICAgICAgICBpZiAoaW5jb21wYXRpYmxlVG9rZW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICAgIGBUaGUgZm9ybWF0IHN0cmluZyBtdXN0bid0IGNvbnRhaW4gXFxgJHtpbmNvbXBhdGlibGVUb2tlbi5mdWxsVG9rZW59XFxgIGFuZCBcXGAke3Rva2VufVxcYCBhdCB0aGUgc2FtZSB0aW1lYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlci5pbmNvbXBhdGlibGVUb2tlbnMgPT09IFwiKlwiICYmIHVzZWRUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICBgVGhlIGZvcm1hdCBzdHJpbmcgbXVzdG4ndCBjb250YWluIFxcYCR7dG9rZW59XFxgIGFuZCBhbnkgb3RoZXIgdG9rZW4gYXQgdGhlIHNhbWUgdGltZWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHVzZWRUb2tlbnMucHVzaCh7IHRva2VuOiBmaXJzdENoYXJhY3RlciwgZnVsbFRva2VuOiB0b2tlbiB9KTtcblxuICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSBwYXJzZXIucnVuKFxuICAgICAgICBkYXRlU3RyLFxuICAgICAgICB0b2tlbixcbiAgICAgICAgbG9jYWxlLm1hdGNoLFxuICAgICAgICBzdWJGbk9wdGlvbnMsXG4gICAgICApO1xuXG4gICAgICBpZiAoIXBhcnNlUmVzdWx0KSB7XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIE5hTik7XG4gICAgICB9XG5cbiAgICAgIHNldHRlcnMucHVzaChwYXJzZVJlc3VsdC5zZXR0ZXIpO1xuXG4gICAgICBkYXRlU3RyID0gcGFyc2VSZXN1bHQucmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyLm1hdGNoKHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICBcIkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlciBgXCIgK1xuICAgICAgICAgICAgZmlyc3RDaGFyYWN0ZXIgK1xuICAgICAgICAgICAgXCJgXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcGxhY2UgdHdvIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggb25lIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICAgIGlmICh0b2tlbiA9PT0gXCInJ1wiKSB7XG4gICAgICAgIHRva2VuID0gXCInXCI7XG4gICAgICB9IGVsc2UgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcIidcIikge1xuICAgICAgICB0b2tlbiA9IGNsZWFuRXNjYXBlZFN0cmluZyh0b2tlbik7XG4gICAgICB9XG5cbiAgICAgIC8vIEN1dCB0b2tlbiBmcm9tIHN0cmluZywgb3IsIGlmIHN0cmluZyBkb2Vzbid0IG1hdGNoIHRoZSB0b2tlbiwgcmV0dXJuIEludmFsaWQgRGF0ZVxuICAgICAgaWYgKGRhdGVTdHIuaW5kZXhPZih0b2tlbikgPT09IDApIHtcbiAgICAgICAgZGF0ZVN0ciA9IGRhdGVTdHIuc2xpY2UodG9rZW4ubGVuZ3RoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIE5hTik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHJlbWFpbmluZyBpbnB1dCBjb250YWlucyBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGl0ZXNwYWNlXG4gIGlmIChkYXRlU3RyLmxlbmd0aCA+IDAgJiYgbm90V2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGRhdGVTdHIpKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgTmFOKTtcbiAgfVxuXG4gIGNvbnN0IHVuaXF1ZVByaW9yaXR5U2V0dGVycyA9IHNldHRlcnNcbiAgICAubWFwKChzZXR0ZXIpID0+IHNldHRlci5wcmlvcml0eSlcbiAgICAuc29ydCgoYSwgYikgPT4gYiAtIGEpXG4gICAgLmZpbHRlcigocHJpb3JpdHksIGluZGV4LCBhcnJheSkgPT4gYXJyYXkuaW5kZXhPZihwcmlvcml0eSkgPT09IGluZGV4KVxuICAgIC5tYXAoKHByaW9yaXR5KSA9PlxuICAgICAgc2V0dGVyc1xuICAgICAgICAuZmlsdGVyKChzZXR0ZXIpID0+IHNldHRlci5wcmlvcml0eSA9PT0gcHJpb3JpdHkpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnN1YlByaW9yaXR5IC0gYS5zdWJQcmlvcml0eSksXG4gICAgKVxuICAgIC5tYXAoKHNldHRlckFycmF5KSA9PiBzZXR0ZXJBcnJheVswXSk7XG5cbiAgbGV0IGRhdGUgPSAoMCwgX2luZGV4NC50b0RhdGUpKHJlZmVyZW5jZURhdGUpO1xuXG4gIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShyZWZlcmVuY2VEYXRlLCBOYU4pO1xuICB9XG5cbiAgY29uc3QgZmxhZ3MgPSB7fTtcbiAgZm9yIChjb25zdCBzZXR0ZXIgb2YgdW5pcXVlUHJpb3JpdHlTZXR0ZXJzKSB7XG4gICAgaWYgKCFzZXR0ZXIudmFsaWRhdGUoZGF0ZSwgc3ViRm5PcHRpb25zKSkge1xuICAgICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgTmFOKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBzZXR0ZXIuc2V0KGRhdGUsIGZsYWdzLCBzdWJGbk9wdGlvbnMpO1xuICAgIC8vIFJlc3VsdCBpcyB0dXBsZSAoZGF0ZSwgZmxhZ3MpXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgZGF0ZSA9IHJlc3VsdFswXTtcbiAgICAgIE9iamVjdC5hc3NpZ24oZmxhZ3MsIHJlc3VsdFsxXSk7XG4gICAgICAvLyBSZXN1bHQgaXMgZGF0ZVxuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlID0gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIGRhdGUpO1xufVxuXG5mdW5jdGlvbiBjbGVhbkVzY2FwZWRTdHJpbmcoaW5wdXQpIHtcbiAgcmV0dXJuIGlucHV0Lm1hdGNoKGVzY2FwZWRTdHJpbmdSZWdFeHApWzFdLnJlcGxhY2UoZG91YmxlUXVvdGVSZWdFeHAsIFwiJ1wiKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5wYXJzZUlTTyA9IHBhcnNlSVNPO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHBhcnNlSVNPfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgcGFyc2VJU09cbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgUGFyc2UgSVNPIHN0cmluZ1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUGFyc2UgdGhlIGdpdmVuIHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQgYW5kIHJldHVybiBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEZ1bmN0aW9uIGFjY2VwdHMgY29tcGxldGUgSVNPIDg2MDEgZm9ybWF0cyBhcyB3ZWxsIGFzIHBhcnRpYWwgaW1wbGVtZW50YXRpb25zLlxuICogSVNPIDg2MDE6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDFcbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXNuJ3QgYSBzdHJpbmcsIHRoZSBmdW5jdGlvbiBjYW5ub3QgcGFyc2UgdGhlIHN0cmluZyBvclxuICogdGhlIHZhbHVlcyBhcmUgaW52YWxpZCwgaXQgcmV0dXJucyBJbnZhbGlkIERhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGFyZ3VtZW50IC0gVGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgc3RyaW5nICcyMDE0LTAyLTExVDExOjMwOjMwJyB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gcGFyc2VJU08oJzIwMTQtMDItMTFUMTE6MzA6MzAnKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBzdHJpbmcgJyswMjAxNDEwMScgdG8gZGF0ZSxcbiAqIC8vIGlmIHRoZSBhZGRpdGlvbmFsIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGV4dGVuZGVkIHllYXIgZm9ybWF0IGlzIDE6XG4gKiBjb25zdCByZXN1bHQgPSBwYXJzZUlTTygnKzAyMDE0MTAxJywgeyBhZGRpdGlvbmFsRGlnaXRzOiAxIH0pXG4gKiAvLz0+IEZyaSBBcHIgMTEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBwYXJzZUlTTyhhcmd1bWVudCwgb3B0aW9ucykge1xuICBjb25zdCBhZGRpdGlvbmFsRGlnaXRzID0gb3B0aW9ucz8uYWRkaXRpb25hbERpZ2l0cyA/PyAyO1xuICBjb25zdCBkYXRlU3RyaW5ncyA9IHNwbGl0RGF0ZVN0cmluZyhhcmd1bWVudCk7XG5cbiAgbGV0IGRhdGU7XG4gIGlmIChkYXRlU3RyaW5ncy5kYXRlKSB7XG4gICAgY29uc3QgcGFyc2VZZWFyUmVzdWx0ID0gcGFyc2VZZWFyKGRhdGVTdHJpbmdzLmRhdGUsIGFkZGl0aW9uYWxEaWdpdHMpO1xuICAgIGRhdGUgPSBwYXJzZURhdGUocGFyc2VZZWFyUmVzdWx0LnJlc3REYXRlU3RyaW5nLCBwYXJzZVllYXJSZXN1bHQueWVhcik7XG4gIH1cblxuICBpZiAoIWRhdGUgfHwgaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cblxuICBjb25zdCB0aW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKTtcbiAgbGV0IHRpbWUgPSAwO1xuICBsZXQgb2Zmc2V0O1xuXG4gIGlmIChkYXRlU3RyaW5ncy50aW1lKSB7XG4gICAgdGltZSA9IHBhcnNlVGltZShkYXRlU3RyaW5ncy50aW1lKTtcbiAgICBpZiAoaXNOYU4odGltZSkpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkYXRlU3RyaW5ncy50aW1lem9uZSkge1xuICAgIG9mZnNldCA9IHBhcnNlVGltZXpvbmUoZGF0ZVN0cmluZ3MudGltZXpvbmUpO1xuICAgIGlmIChpc05hTihvZmZzZXQpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGlydHlEYXRlID0gbmV3IERhdGUodGltZXN0YW1wICsgdGltZSk7XG4gICAgLy8gSlMgcGFyc2VkIHN0cmluZyBhc3N1bWluZyBpdCdzIGluIFVUQyB0aW1lem9uZVxuICAgIC8vIGJ1dCB3ZSBuZWVkIGl0IHRvIGJlIHBhcnNlZCBpbiBvdXIgdGltZXpvbmVcbiAgICAvLyBzbyB3ZSB1c2UgdXRjIHZhbHVlcyB0byBidWlsZCBkYXRlIGluIG91ciB0aW1lem9uZS5cbiAgICAvLyBZZWFyIHZhbHVlcyBmcm9tIDAgdG8gOTkgbWFwIHRvIHRoZSB5ZWFycyAxOTAwIHRvIDE5OTlcbiAgICAvLyBzbyBzZXQgeWVhciBleHBsaWNpdGx5IHdpdGggc2V0RnVsbFllYXIuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IERhdGUoMCk7XG4gICAgcmVzdWx0LnNldEZ1bGxZZWFyKFxuICAgICAgZGlydHlEYXRlLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDTW9udGgoKSxcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENEYXRlKCksXG4gICAgKTtcbiAgICByZXN1bHQuc2V0SG91cnMoXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDSG91cnMoKSxcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENNaW51dGVzKCksXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDU2Vjb25kcygpLFxuICAgICAgZGlydHlEYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXAgKyB0aW1lICsgb2Zmc2V0KTtcbn1cblxuY29uc3QgcGF0dGVybnMgPSB7XG4gIGRhdGVUaW1lRGVsaW1pdGVyOiAvW1QgXS8sXG4gIHRpbWVab25lRGVsaW1pdGVyOiAvW1ogXS9pLFxuICB0aW1lem9uZTogLyhbWistXS4qKSQvLFxufTtcblxuY29uc3QgZGF0ZVJlZ2V4ID1cbiAgL14tPyg/OihcXGR7M30pfChcXGR7Mn0pKD86LT8oXFxkezJ9KSk/fFcoXFxkezJ9KSg/Oi0/KFxcZHsxfSkpP3wpJC87XG5jb25zdCB0aW1lUmVnZXggPVxuICAvXihcXGR7Mn0oPzpbLixdXFxkKik/KSg/Ojo/KFxcZHsyfSg/OlsuLF1cXGQqKT8pKT8oPzo6PyhcXGR7Mn0oPzpbLixdXFxkKik/KSk/JC87XG5jb25zdCB0aW1lem9uZVJlZ2V4ID0gL14oWystXSkoXFxkezJ9KSg/Ojo/KFxcZHsyfSkpPyQvO1xuXG5mdW5jdGlvbiBzcGxpdERhdGVTdHJpbmcoZGF0ZVN0cmluZykge1xuICBjb25zdCBkYXRlU3RyaW5ncyA9IHt9O1xuICBjb25zdCBhcnJheSA9IGRhdGVTdHJpbmcuc3BsaXQocGF0dGVybnMuZGF0ZVRpbWVEZWxpbWl0ZXIpO1xuICBsZXQgdGltZVN0cmluZztcblxuICAvLyBUaGUgcmVnZXggbWF0Y2ggc2hvdWxkIG9ubHkgcmV0dXJuIGF0IG1heGltdW0gdHdvIGFycmF5IGVsZW1lbnRzLlxuICAvLyBbZGF0ZV0sIFt0aW1lXSwgb3IgW2RhdGUsIHRpbWVdLlxuICBpZiAoYXJyYXkubGVuZ3RoID4gMikge1xuICAgIHJldHVybiBkYXRlU3RyaW5ncztcbiAgfVxuXG4gIGlmICgvOi8udGVzdChhcnJheVswXSkpIHtcbiAgICB0aW1lU3RyaW5nID0gYXJyYXlbMF07XG4gIH0gZWxzZSB7XG4gICAgZGF0ZVN0cmluZ3MuZGF0ZSA9IGFycmF5WzBdO1xuICAgIHRpbWVTdHJpbmcgPSBhcnJheVsxXTtcbiAgICBpZiAocGF0dGVybnMudGltZVpvbmVEZWxpbWl0ZXIudGVzdChkYXRlU3RyaW5ncy5kYXRlKSkge1xuICAgICAgZGF0ZVN0cmluZ3MuZGF0ZSA9IGRhdGVTdHJpbmcuc3BsaXQocGF0dGVybnMudGltZVpvbmVEZWxpbWl0ZXIpWzBdO1xuICAgICAgdGltZVN0cmluZyA9IGRhdGVTdHJpbmcuc3Vic3RyKFxuICAgICAgICBkYXRlU3RyaW5ncy5kYXRlLmxlbmd0aCxcbiAgICAgICAgZGF0ZVN0cmluZy5sZW5ndGgsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aW1lU3RyaW5nKSB7XG4gICAgY29uc3QgdG9rZW4gPSBwYXR0ZXJucy50aW1lem9uZS5leGVjKHRpbWVTdHJpbmcpO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgZGF0ZVN0cmluZ3MudGltZSA9IHRpbWVTdHJpbmcucmVwbGFjZSh0b2tlblsxXSwgXCJcIik7XG4gICAgICBkYXRlU3RyaW5ncy50aW1lem9uZSA9IHRva2VuWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlU3RyaW5ncy50aW1lID0gdGltZVN0cmluZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGF0ZVN0cmluZ3M7XG59XG5cbmZ1bmN0aW9uIHBhcnNlWWVhcihkYXRlU3RyaW5nLCBhZGRpdGlvbmFsRGlnaXRzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBcIl4oPzooXFxcXGR7NH18WystXVxcXFxke1wiICtcbiAgICAgICg0ICsgYWRkaXRpb25hbERpZ2l0cykgK1xuICAgICAgXCJ9KXwoXFxcXGR7Mn18WystXVxcXFxke1wiICtcbiAgICAgICgyICsgYWRkaXRpb25hbERpZ2l0cykgK1xuICAgICAgXCJ9KSQpXCIsXG4gICk7XG5cbiAgY29uc3QgY2FwdHVyZXMgPSBkYXRlU3RyaW5nLm1hdGNoKHJlZ2V4KTtcbiAgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHllYXJcbiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIHsgeWVhcjogTmFOLCByZXN0RGF0ZVN0cmluZzogXCJcIiB9O1xuXG4gIGNvbnN0IHllYXIgPSBjYXB0dXJlc1sxXSA/IHBhcnNlSW50KGNhcHR1cmVzWzFdKSA6IG51bGw7XG4gIGNvbnN0IGNlbnR1cnkgPSBjYXB0dXJlc1syXSA/IHBhcnNlSW50KGNhcHR1cmVzWzJdKSA6IG51bGw7XG5cbiAgLy8gZWl0aGVyIHllYXIgb3IgY2VudHVyeSBpcyBudWxsLCBub3QgYm90aFxuICByZXR1cm4ge1xuICAgIHllYXI6IGNlbnR1cnkgPT09IG51bGwgPyB5ZWFyIDogY2VudHVyeSAqIDEwMCxcbiAgICByZXN0RGF0ZVN0cmluZzogZGF0ZVN0cmluZy5zbGljZSgoY2FwdHVyZXNbMV0gfHwgY2FwdHVyZXNbMl0pLmxlbmd0aCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF0ZShkYXRlU3RyaW5nLCB5ZWFyKSB7XG4gIC8vIEludmFsaWQgSVNPLWZvcm1hdHRlZCB5ZWFyXG4gIGlmICh5ZWFyID09PSBudWxsKSByZXR1cm4gbmV3IERhdGUoTmFOKTtcblxuICBjb25zdCBjYXB0dXJlcyA9IGRhdGVTdHJpbmcubWF0Y2goZGF0ZVJlZ2V4KTtcbiAgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHN0cmluZ1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gbmV3IERhdGUoTmFOKTtcblxuICBjb25zdCBpc1dlZWtEYXRlID0gISFjYXB0dXJlc1s0XTtcbiAgY29uc3QgZGF5T2ZZZWFyID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1sxXSk7XG4gIGNvbnN0IG1vbnRoID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1syXSkgLSAxO1xuICBjb25zdCBkYXkgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzNdKTtcbiAgY29uc3Qgd2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNF0pO1xuICBjb25zdCBkYXlPZldlZWsgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzVdKSAtIDE7XG5cbiAgaWYgKGlzV2Vla0RhdGUpIHtcbiAgICBpZiAoIXZhbGlkYXRlV2Vla0RhdGUoeWVhciwgd2VlaywgZGF5T2ZXZWVrKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gICAgfVxuICAgIHJldHVybiBkYXlPZklTT1dlZWtZZWFyKHllYXIsIHdlZWssIGRheU9mV2Vlayk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDApO1xuICAgIGlmIChcbiAgICAgICF2YWxpZGF0ZURhdGUoeWVhciwgbW9udGgsIGRheSkgfHxcbiAgICAgICF2YWxpZGF0ZURheU9mWWVhckRhdGUoeWVhciwgZGF5T2ZZZWFyKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gICAgfVxuICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeWVhciwgbW9udGgsIE1hdGgubWF4KGRheU9mWWVhciwgZGF5KSk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlVW5pdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPyBwYXJzZUludCh2YWx1ZSkgOiAxO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRpbWUodGltZVN0cmluZykge1xuICBjb25zdCBjYXB0dXJlcyA9IHRpbWVTdHJpbmcubWF0Y2godGltZVJlZ2V4KTtcbiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIE5hTjsgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHRpbWVcblxuICBjb25zdCBob3VycyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbMV0pO1xuICBjb25zdCBtaW51dGVzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1syXSk7XG4gIGNvbnN0IHNlY29uZHMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzNdKTtcblxuICBpZiAoIXZhbGlkYXRlVGltZShob3VycywgbWludXRlcywgc2Vjb25kcykpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBob3VycyAqIF9pbmRleC5taWxsaXNlY29uZHNJbkhvdXIgK1xuICAgIG1pbnV0ZXMgKiBfaW5kZXgubWlsbGlzZWNvbmRzSW5NaW51dGUgK1xuICAgIHNlY29uZHMgKiAxMDAwXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZVVuaXQodmFsdWUpIHtcbiAgcmV0dXJuICh2YWx1ZSAmJiBwYXJzZUZsb2F0KHZhbHVlLnJlcGxhY2UoXCIsXCIsIFwiLlwiKSkpIHx8IDA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZXpvbmUodGltZXpvbmVTdHJpbmcpIHtcbiAgaWYgKHRpbWV6b25lU3RyaW5nID09PSBcIlpcIikgcmV0dXJuIDA7XG5cbiAgY29uc3QgY2FwdHVyZXMgPSB0aW1lem9uZVN0cmluZy5tYXRjaCh0aW1lem9uZVJlZ2V4KTtcbiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIDA7XG5cbiAgY29uc3Qgc2lnbiA9IGNhcHR1cmVzWzFdID09PSBcIitcIiA/IC0xIDogMTtcbiAgY29uc3QgaG91cnMgPSBwYXJzZUludChjYXB0dXJlc1syXSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSAoY2FwdHVyZXNbM10gJiYgcGFyc2VJbnQoY2FwdHVyZXNbM10pKSB8fCAwO1xuXG4gIGlmICghdmFsaWRhdGVUaW1lem9uZShob3VycywgbWludXRlcykpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBzaWduICpcbiAgICAoaG91cnMgKiBfaW5kZXgubWlsbGlzZWNvbmRzSW5Ib3VyICsgbWludXRlcyAqIF9pbmRleC5taWxsaXNlY29uZHNJbk1pbnV0ZSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gZGF5T2ZJU09XZWVrWWVhcihpc29XZWVrWWVhciwgd2VlaywgZGF5KSB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwKTtcbiAgZGF0ZS5zZXRVVENGdWxsWWVhcihpc29XZWVrWWVhciwgMCwgNCk7XG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeURheSA9IGRhdGUuZ2V0VVRDRGF5KCkgfHwgNztcbiAgY29uc3QgZGlmZiA9ICh3ZWVrIC0gMSkgKiA3ICsgZGF5ICsgMSAtIGZvdXJ0aE9mSmFudWFyeURheTtcbiAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpICsgZGlmZik7XG4gIHJldHVybiBkYXRlO1xufVxuXG4vLyBWYWxpZGF0aW9uIGZ1bmN0aW9uc1xuXG4vLyBGZWJydWFyeSBpcyBudWxsIHRvIGhhbmRsZSB0aGUgbGVhcCB5ZWFyICh1c2luZyB8fClcbmNvbnN0IGRheXNJbk1vbnRocyA9IFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuXG5mdW5jdGlvbiBpc0xlYXBZZWFySW5kZXgoeWVhcikge1xuICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCAoeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSkge1xuICByZXR1cm4gKFxuICAgIG1vbnRoID49IDAgJiZcbiAgICBtb250aCA8PSAxMSAmJlxuICAgIGRhdGUgPj0gMSAmJlxuICAgIGRhdGUgPD0gKGRheXNJbk1vbnRoc1ttb250aF0gfHwgKGlzTGVhcFllYXJJbmRleCh5ZWFyKSA/IDI5IDogMjgpKVxuICApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZURheU9mWWVhckRhdGUoeWVhciwgZGF5T2ZZZWFyKSB7XG4gIHJldHVybiBkYXlPZlllYXIgPj0gMSAmJiBkYXlPZlllYXIgPD0gKGlzTGVhcFllYXJJbmRleCh5ZWFyKSA/IDM2NiA6IDM2NSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlV2Vla0RhdGUoX3llYXIsIHdlZWssIGRheSkge1xuICByZXR1cm4gd2VlayA+PSAxICYmIHdlZWsgPD0gNTMgJiYgZGF5ID49IDAgJiYgZGF5IDw9IDY7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGltZShob3VycywgbWludXRlcywgc2Vjb25kcykge1xuICBpZiAoaG91cnMgPT09IDI0KSB7XG4gICAgcmV0dXJuIG1pbnV0ZXMgPT09IDAgJiYgc2Vjb25kcyA9PT0gMDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgc2Vjb25kcyA+PSAwICYmXG4gICAgc2Vjb25kcyA8IDYwICYmXG4gICAgbWludXRlcyA+PSAwICYmXG4gICAgbWludXRlcyA8IDYwICYmXG4gICAgaG91cnMgPj0gMCAmJlxuICAgIGhvdXJzIDwgMjVcbiAgKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUaW1lem9uZShfaG91cnMsIG1pbnV0ZXMpIHtcbiAgcmV0dXJuIG1pbnV0ZXMgPj0gMCAmJiBtaW51dGVzIDw9IDU5O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlBhcnNlciA9IHZvaWQgMDtcbnZhciBfU2V0dGVyID0gcmVxdWlyZShcIi4vU2V0dGVyLmpzXCIpO1xuXG5jbGFzcyBQYXJzZXIge1xuICBydW4oZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gsIG9wdGlvbnMpO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2V0dGVyOiBuZXcgX1NldHRlci5WYWx1ZVNldHRlcihcbiAgICAgICAgcmVzdWx0LnZhbHVlLFxuICAgICAgICB0aGlzLnZhbGlkYXRlLFxuICAgICAgICB0aGlzLnNldCxcbiAgICAgICAgdGhpcy5wcmlvcml0eSxcbiAgICAgICAgdGhpcy5zdWJQcmlvcml0eSxcbiAgICAgICksXG4gICAgICByZXN0OiByZXN1bHQucmVzdCxcbiAgICB9O1xuICB9XG5cbiAgdmFsaWRhdGUoX3V0Y0RhdGUsIF92YWx1ZSwgX29wdGlvbnMpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuZXhwb3J0cy5QYXJzZXIgPSBQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuVmFsdWVTZXR0ZXIgPVxuICBleHBvcnRzLlNldHRlciA9XG4gIGV4cG9ydHMuRGF0ZVRvU3lzdGVtVGltZXpvbmVTZXR0ZXIgPVxuICAgIHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vdHJhbnNwb3NlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuY29uc3QgVElNRVpPTkVfVU5JVF9QUklPUklUWSA9IDEwO1xuXG5jbGFzcyBTZXR0ZXIge1xuICBzdWJQcmlvcml0eSA9IDA7XG5cbiAgdmFsaWRhdGUoX3V0Y0RhdGUsIF9vcHRpb25zKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbmV4cG9ydHMuU2V0dGVyID0gU2V0dGVyO1xuXG5jbGFzcyBWYWx1ZVNldHRlciBleHRlbmRzIFNldHRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHZhbHVlLFxuXG4gICAgdmFsaWRhdGVWYWx1ZSxcblxuICAgIHNldFZhbHVlLFxuXG4gICAgcHJpb3JpdHksXG4gICAgc3ViUHJpb3JpdHksXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZSA9IHZhbGlkYXRlVmFsdWU7XG4gICAgdGhpcy5zZXRWYWx1ZSA9IHNldFZhbHVlO1xuICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICBpZiAoc3ViUHJpb3JpdHkpIHtcbiAgICAgIHRoaXMuc3ViUHJpb3JpdHkgPSBzdWJQcmlvcml0eTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShkYXRlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVWYWx1ZShkYXRlLCB0aGlzLnZhbHVlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHNldChkYXRlLCBmbGFncywgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnNldFZhbHVlKGRhdGUsIGZsYWdzLCB0aGlzLnZhbHVlLCBvcHRpb25zKTtcbiAgfVxufVxuZXhwb3J0cy5WYWx1ZVNldHRlciA9IFZhbHVlU2V0dGVyO1xuXG5jbGFzcyBEYXRlVG9TeXN0ZW1UaW1lem9uZVNldHRlciBleHRlbmRzIFNldHRlciB7XG4gIHByaW9yaXR5ID0gVElNRVpPTkVfVU5JVF9QUklPUklUWTtcbiAgc3ViUHJpb3JpdHkgPSAtMTtcbiAgc2V0KGRhdGUsIGZsYWdzKSB7XG4gICAgaWYgKGZsYWdzLnRpbWVzdGFtcElzU2V0KSByZXR1cm4gZGF0ZTtcbiAgICByZXR1cm4gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgKDAsIF9pbmRleC50cmFuc3Bvc2UpKGRhdGUsIERhdGUpKTtcbiAgfVxufVxuZXhwb3J0cy5EYXRlVG9TeXN0ZW1UaW1lem9uZVNldHRlciA9IERhdGVUb1N5c3RlbVRpbWV6b25lU2V0dGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnRpbWV6b25lUGF0dGVybnMgPSBleHBvcnRzLm51bWVyaWNQYXR0ZXJucyA9IHZvaWQgMDtcbmNvbnN0IG51bWVyaWNQYXR0ZXJucyA9IChleHBvcnRzLm51bWVyaWNQYXR0ZXJucyA9IHtcbiAgbW9udGg6IC9eKDFbMC0yXXwwP1xcZCkvLCAvLyAwIHRvIDEyXG4gIGRhdGU6IC9eKDNbMC0xXXxbMC0yXT9cXGQpLywgLy8gMCB0byAzMVxuICBkYXlPZlllYXI6IC9eKDM2WzAtNl18M1swLTVdXFxkfFswLTJdP1xcZD9cXGQpLywgLy8gMCB0byAzNjZcbiAgd2VlazogL14oNVswLTNdfFswLTRdP1xcZCkvLCAvLyAwIHRvIDUzXG4gIGhvdXIyM2g6IC9eKDJbMC0zXXxbMC0xXT9cXGQpLywgLy8gMCB0byAyM1xuICBob3VyMjRoOiAvXigyWzAtNF18WzAtMV0/XFxkKS8sIC8vIDAgdG8gMjRcbiAgaG91cjExaDogL14oMVswLTFdfDA/XFxkKS8sIC8vIDAgdG8gMTFcbiAgaG91cjEyaDogL14oMVswLTJdfDA/XFxkKS8sIC8vIDAgdG8gMTJcbiAgbWludXRlOiAvXlswLTVdP1xcZC8sIC8vIDAgdG8gNTlcbiAgc2Vjb25kOiAvXlswLTVdP1xcZC8sIC8vIDAgdG8gNTlcblxuICBzaW5nbGVEaWdpdDogL15cXGQvLCAvLyAwIHRvIDlcbiAgdHdvRGlnaXRzOiAvXlxcZHsxLDJ9LywgLy8gMCB0byA5OVxuICB0aHJlZURpZ2l0czogL15cXGR7MSwzfS8sIC8vIDAgdG8gOTk5XG4gIGZvdXJEaWdpdHM6IC9eXFxkezEsNH0vLCAvLyAwIHRvIDk5OTlcblxuICBhbnlEaWdpdHNTaWduZWQ6IC9eLT9cXGQrLyxcbiAgc2luZ2xlRGlnaXRTaWduZWQ6IC9eLT9cXGQvLCAvLyAwIHRvIDksIC0wIHRvIC05XG4gIHR3b0RpZ2l0c1NpZ25lZDogL14tP1xcZHsxLDJ9LywgLy8gMCB0byA5OSwgLTAgdG8gLTk5XG4gIHRocmVlRGlnaXRzU2lnbmVkOiAvXi0/XFxkezEsM30vLCAvLyAwIHRvIDk5OSwgLTAgdG8gLTk5OVxuICBmb3VyRGlnaXRzU2lnbmVkOiAvXi0/XFxkezEsNH0vLCAvLyAwIHRvIDk5OTksIC0wIHRvIC05OTk5XG59KTtcblxuY29uc3QgdGltZXpvbmVQYXR0ZXJucyA9IChleHBvcnRzLnRpbWV6b25lUGF0dGVybnMgPSB7XG4gIGJhc2ljT3B0aW9uYWxNaW51dGVzOiAvXihbKy1dKShcXGR7Mn0pKFxcZHsyfSk/fFovLFxuICBiYXNpYzogL14oWystXSkoXFxkezJ9KShcXGR7Mn0pfFovLFxuICBiYXNpY09wdGlvbmFsU2Vjb25kczogL14oWystXSkoXFxkezJ9KShcXGR7Mn0pKChcXGR7Mn0pKT98Wi8sXG4gIGV4dGVuZGVkOiAvXihbKy1dKShcXGR7Mn0pOihcXGR7Mn0pfFovLFxuICBleHRlbmRlZE9wdGlvbmFsU2Vjb25kczogL14oWystXSkoXFxkezJ9KTooXFxkezJ9KSg6KFxcZHsyfSkpP3xaLyxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnBhcnNlcnMgPSB2b2lkIDA7XG52YXIgX0VyYVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvRXJhUGFyc2VyLmpzXCIpO1xudmFyIF9ZZWFyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9ZZWFyUGFyc2VyLmpzXCIpO1xudmFyIF9Mb2NhbFdlZWtZZWFyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Mb2NhbFdlZWtZZWFyUGFyc2VyLmpzXCIpO1xudmFyIF9JU09XZWVrWWVhclBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSVNPV2Vla1llYXJQYXJzZXIuanNcIik7XG52YXIgX0V4dGVuZGVkWWVhclBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvRXh0ZW5kZWRZZWFyUGFyc2VyLmpzXCIpO1xudmFyIF9RdWFydGVyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9RdWFydGVyUGFyc2VyLmpzXCIpO1xudmFyIF9TdGFuZEFsb25lUXVhcnRlclBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuanNcIik7XG52YXIgX01vbnRoUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Nb250aFBhcnNlci5qc1wiKTtcbnZhciBfU3RhbmRBbG9uZU1vbnRoUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9TdGFuZEFsb25lTW9udGhQYXJzZXIuanNcIik7XG52YXIgX0xvY2FsV2Vla1BhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvTG9jYWxXZWVrUGFyc2VyLmpzXCIpO1xudmFyIF9JU09XZWVrUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9JU09XZWVrUGFyc2VyLmpzXCIpO1xudmFyIF9EYXRlUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9EYXRlUGFyc2VyLmpzXCIpO1xudmFyIF9EYXlPZlllYXJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0RheU9mWWVhclBhcnNlci5qc1wiKTtcbnZhciBfRGF5UGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9EYXlQYXJzZXIuanNcIik7XG52YXIgX0xvY2FsRGF5UGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Mb2NhbERheVBhcnNlci5qc1wiKTtcbnZhciBfU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIuanNcIik7XG52YXIgX0lTT0RheVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSVNPRGF5UGFyc2VyLmpzXCIpO1xudmFyIF9BTVBNUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9BTVBNUGFyc2VyLmpzXCIpO1xudmFyIF9BTVBNTWlkbmlnaHRQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0FNUE1NaWRuaWdodFBhcnNlci5qc1wiKTtcbnZhciBfRGF5UGVyaW9kUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9EYXlQZXJpb2RQYXJzZXIuanNcIik7XG52YXIgX0hvdXIxdG8xMlBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSG91cjF0bzEyUGFyc2VyLmpzXCIpO1xudmFyIF9Ib3VyMHRvMjNQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0hvdXIwdG8yM1BhcnNlci5qc1wiKTtcbnZhciBfSG91cjBUbzExUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Ib3VyMFRvMTFQYXJzZXIuanNcIik7XG52YXIgX0hvdXIxVG8yNFBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSG91cjFUbzI0UGFyc2VyLmpzXCIpO1xudmFyIF9NaW51dGVQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL01pbnV0ZVBhcnNlci5qc1wiKTtcbnZhciBfU2Vjb25kUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9TZWNvbmRQYXJzZXIuanNcIik7XG52YXIgX0ZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0ZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIuanNcIik7XG52YXIgX0lTT1RpbWV6b25lV2l0aFpQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0lTT1RpbWV6b25lV2l0aFpQYXJzZXIuanNcIik7XG52YXIgX0lTT1RpbWV6b25lUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9JU09UaW1lem9uZVBhcnNlci5qc1wiKTtcbnZhciBfVGltZXN0YW1wU2Vjb25kc1BhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvVGltZXN0YW1wU2Vjb25kc1BhcnNlci5qc1wiKTtcbnZhciBfVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIuanNcIik7XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8IE1pbGxpc2Vjb25kcyBpbiBkYXkgICAgICAgICAgICB8XG4gKiB8ICBiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICB8ICBCICB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICB8XG4gKiB8ICBjICB8IFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrICB8ICBDKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBlICB8IExvY2FsIGRheSBvZiB3ZWVrICAgICAgICAgICAgICB8ICBFICB8IERheSBvZiB3ZWVrICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBmICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBGKiB8IERheSBvZiB3ZWVrIGluIG1vbnRoICAgICAgICAgICB8XG4gKiB8ICBnKiB8IE1vZGlmaWVkIEp1bGlhbiBkYXkgICAgICAgICAgICB8ICBHICB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBpISB8IElTTyBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgICB8ICBJISB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICB8XG4gKiB8ICBqKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8ICBKKiB8IExvY2FsaXplZCBob3VyIHcvbyBkYXkgcGVyaW9kICB8XG4gKiB8ICBrICB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICB8ICBLICB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBsKiB8IChkZXByZWNhdGVkKSAgICAgICAgICAgICAgICAgICB8ICBMICB8IFN0YW5kLWFsb25lIG1vbnRoICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBuICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBOICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBvISB8IE9yZGluYWwgbnVtYmVyIG1vZGlmaWVyICAgICAgICB8ICBPKiB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICB8XG4gKiB8ICBwICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBQICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBxICB8IFN0YW5kLWFsb25lIHF1YXJ0ZXIgICAgICAgICAgICB8ICBRICB8IFF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICByKiB8IFJlbGF0ZWQgR3JlZ29yaWFuIHllYXIgICAgICAgICB8ICBSISB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB0ISB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICB8ICBUISB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICB8XG4gKiB8ICB1ICB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICB8ICBVKiB8IEN5Y2xpYyB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICB2KiB8IFRpbWV6b25lIChnZW5lcmljIG5vbi1sb2NhdC4pICB8ICBWKiB8IFRpbWV6b25lIChsb2NhdGlvbikgICAgICAgICAgICB8XG4gKiB8ICB3ICB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICB8ICBXKiB8IFdlZWsgb2YgbW9udGggICAgICAgICAgICAgICAgICB8XG4gKiB8ICB4ICB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICB8ICBYICB8IFRpbWV6b25lIChJU08tODYwMSkgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICB8XG4gKiB8ICB6KiB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSB8ICBaKiB8IFRpbWV6b25lIChhbGlhc2VzKSAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICEgYXJlIG5vbi1zdGFuZGFyZCwgYnV0IGltcGxlbWVudGVkIGJ5IGRhdGUtZm5zOlxuICogLSBgb2AgbW9kaWZpZXMgdGhlIHByZXZpb3VzIHRva2VuIHRvIHR1cm4gaXQgaW50byBhbiBvcmRpbmFsIChzZWUgYHBhcnNlYCBkb2NzKVxuICogLSBgaWAgaXMgSVNPIGRheSBvZiB3ZWVrLiBGb3IgYGlgIGFuZCBgaWlgIGlzIHJldHVybnMgbnVtZXJpYyBJU08gd2VlayBkYXlzLFxuICogICBpLmUuIDcgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5LCBldGMuXG4gKiAtIGBJYCBpcyBJU08gd2VlayBvZiB5ZWFyLCBhcyBvcHBvc2VkIHRvIGB3YCB3aGljaCBpcyBsb2NhbCB3ZWVrIG9mIHllYXIuXG4gKiAtIGBSYCBpcyBJU08gd2Vlay1udW1iZXJpbmcgeWVhciwgYXMgb3Bwb3NlZCB0byBgWWAgd2hpY2ggaXMgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhci5cbiAqICAgYFJgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgSWAgYW5kIGBpYFxuICogICBmb3IgdW5pdmVyc2FsIElTTyB3ZWVrLW51bWJlcmluZyBkYXRlLCB3aGVyZWFzXG4gKiAgIGBZYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYHdgIGFuZCBgZWBcbiAqICAgZm9yIHdlZWstbnVtYmVyaW5nIGRhdGUgc3BlY2lmaWMgdG8gdGhlIGxvY2FsZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gSXQncyBvaywgd2Ugd2FudCBhbnkgaGVyZVxuY29uc3QgcGFyc2VycyA9IChleHBvcnRzLnBhcnNlcnMgPSB7XG4gIEc6IG5ldyBfRXJhUGFyc2VyLkVyYVBhcnNlcigpLFxuICB5OiBuZXcgX1llYXJQYXJzZXIuWWVhclBhcnNlcigpLFxuICBZOiBuZXcgX0xvY2FsV2Vla1llYXJQYXJzZXIuTG9jYWxXZWVrWWVhclBhcnNlcigpLFxuICBSOiBuZXcgX0lTT1dlZWtZZWFyUGFyc2VyLklTT1dlZWtZZWFyUGFyc2VyKCksXG4gIHU6IG5ldyBfRXh0ZW5kZWRZZWFyUGFyc2VyLkV4dGVuZGVkWWVhclBhcnNlcigpLFxuICBROiBuZXcgX1F1YXJ0ZXJQYXJzZXIuUXVhcnRlclBhcnNlcigpLFxuICBxOiBuZXcgX1N0YW5kQWxvbmVRdWFydGVyUGFyc2VyLlN0YW5kQWxvbmVRdWFydGVyUGFyc2VyKCksXG4gIE06IG5ldyBfTW9udGhQYXJzZXIuTW9udGhQYXJzZXIoKSxcbiAgTDogbmV3IF9TdGFuZEFsb25lTW9udGhQYXJzZXIuU3RhbmRBbG9uZU1vbnRoUGFyc2VyKCksXG4gIHc6IG5ldyBfTG9jYWxXZWVrUGFyc2VyLkxvY2FsV2Vla1BhcnNlcigpLFxuICBJOiBuZXcgX0lTT1dlZWtQYXJzZXIuSVNPV2Vla1BhcnNlcigpLFxuICBkOiBuZXcgX0RhdGVQYXJzZXIuRGF0ZVBhcnNlcigpLFxuICBEOiBuZXcgX0RheU9mWWVhclBhcnNlci5EYXlPZlllYXJQYXJzZXIoKSxcbiAgRTogbmV3IF9EYXlQYXJzZXIuRGF5UGFyc2VyKCksXG4gIGU6IG5ldyBfTG9jYWxEYXlQYXJzZXIuTG9jYWxEYXlQYXJzZXIoKSxcbiAgYzogbmV3IF9TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIuU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyKCksXG4gIGk6IG5ldyBfSVNPRGF5UGFyc2VyLklTT0RheVBhcnNlcigpLFxuICBhOiBuZXcgX0FNUE1QYXJzZXIuQU1QTVBhcnNlcigpLFxuICBiOiBuZXcgX0FNUE1NaWRuaWdodFBhcnNlci5BTVBNTWlkbmlnaHRQYXJzZXIoKSxcbiAgQjogbmV3IF9EYXlQZXJpb2RQYXJzZXIuRGF5UGVyaW9kUGFyc2VyKCksXG4gIGg6IG5ldyBfSG91cjF0bzEyUGFyc2VyLkhvdXIxdG8xMlBhcnNlcigpLFxuICBIOiBuZXcgX0hvdXIwdG8yM1BhcnNlci5Ib3VyMHRvMjNQYXJzZXIoKSxcbiAgSzogbmV3IF9Ib3VyMFRvMTFQYXJzZXIuSG91cjBUbzExUGFyc2VyKCksXG4gIGs6IG5ldyBfSG91cjFUbzI0UGFyc2VyLkhvdXIxVG8yNFBhcnNlcigpLFxuICBtOiBuZXcgX01pbnV0ZVBhcnNlci5NaW51dGVQYXJzZXIoKSxcbiAgczogbmV3IF9TZWNvbmRQYXJzZXIuU2Vjb25kUGFyc2VyKCksXG4gIFM6IG5ldyBfRnJhY3Rpb25PZlNlY29uZFBhcnNlci5GcmFjdGlvbk9mU2Vjb25kUGFyc2VyKCksXG4gIFg6IG5ldyBfSVNPVGltZXpvbmVXaXRoWlBhcnNlci5JU09UaW1lem9uZVdpdGhaUGFyc2VyKCksXG4gIHg6IG5ldyBfSVNPVGltZXpvbmVQYXJzZXIuSVNPVGltZXpvbmVQYXJzZXIoKSxcbiAgdDogbmV3IF9UaW1lc3RhbXBTZWNvbmRzUGFyc2VyLlRpbWVzdGFtcFNlY29uZHNQYXJzZXIoKSxcbiAgVDogbmV3IF9UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIuVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyKCksXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5BTVBNTWlkbmlnaHRQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEFNUE1NaWRuaWdodFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA4MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYlwiOlxuICAgICAgY2FzZSBcImJiXCI6XG4gICAgICBjYXNlIFwiYmJiXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgXCJiYmJiYlwiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYmJiYlwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0SG91cnMoKDAsIF91dGlscy5kYXlQZXJpb2RFbnVtVG9Ib3VycykodmFsdWUpLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcImFcIiwgXCJCXCIsIFwiSFwiLCBcImtcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuQU1QTU1pZG5pZ2h0UGFyc2VyID0gQU1QTU1pZG5pZ2h0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkFNUE1QYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEFNUE1QYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gODA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImFcIjpcbiAgICAgIGNhc2UgXCJhYVwiOlxuICAgICAgY2FzZSBcImFhYVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICBjYXNlIFwiYWFhYWFcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcImFhYWFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldEhvdXJzKCgwLCBfdXRpbHMuZGF5UGVyaW9kRW51bVRvSG91cnMpKHZhbHVlKSwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJiXCIsIFwiQlwiLCBcIkhcIiwgXCJrXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkFNUE1QYXJzZXIgPSBBTVBNUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkRhdGVQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNvbnN0IERBWVNfSU5fTU9OVEggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07XG5jb25zdCBEQVlTX0lOX01PTlRIX0xFQVBfWUVBUiA9IFtcbiAgMzEsIDI5LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMSxcbl07XG5cbi8vIERheSBvZiB0aGUgbW9udGhcbmNsYXNzIERhdGVQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG4gIHN1YlByaW9yaXR5ID0gMTtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiZFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5kYXRlLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiZG9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImRhdGVcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShkYXRlLCB2YWx1ZSkge1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgaXNMZWFwWWVhciA9ICgwLCBfdXRpbHMuaXNMZWFwWWVhckluZGV4KSh5ZWFyKTtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBpZiAoaXNMZWFwWWVhcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gREFZU19JTl9NT05USF9MRUFQX1lFQVJbbW9udGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSBEQVlTX0lOX01PTlRIW21vbnRoXTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0RGF0ZSh2YWx1ZSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIllcIixcbiAgICBcIlJcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIndcIixcbiAgICBcIklcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuRGF0ZVBhcnNlciA9IERhdGVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRGF5T2ZZZWFyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBEYXlPZlllYXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG5cbiAgc3VicHJpb3JpdHkgPSAxO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJEXCI6XG4gICAgICBjYXNlIFwiRERcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuZGF5T2ZZZWFyLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiRG9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImRhdGVcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShkYXRlLCB2YWx1ZSkge1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgaXNMZWFwWWVhciA9ICgwLCBfdXRpbHMuaXNMZWFwWWVhckluZGV4KSh5ZWFyKTtcbiAgICBpZiAoaXNMZWFwWWVhcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMzY2O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAzNjU7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldE1vbnRoKDAsIHZhbHVlKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiWVwiLFxuICAgIFwiUlwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRVwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5EYXlPZlllYXJQYXJzZXIgPSBEYXlPZlllYXJQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRGF5UGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zZXREYXkuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbi8vIERheSBvZiB3ZWVrXG5jbGFzcyBEYXlQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiRVwiOlxuICAgICAgY2FzZSBcIkVFXCI6XG4gICAgICBjYXNlIFwiRUVFXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcIkVFRUVFRVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJFRUVFXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA2O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBkYXRlID0gKDAsIF9pbmRleC5zZXREYXkpKGRhdGUsIHZhbHVlLCBvcHRpb25zKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiRFwiLCBcImlcIiwgXCJlXCIsIFwiY1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5EYXlQYXJzZXIgPSBEYXlQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRGF5UGVyaW9kUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBpbiB0aGUgbW9ybmluZywgaW4gdGhlIGFmdGVybm9vbiwgaW4gdGhlIGV2ZW5pbmcsIGF0IG5pZ2h0XG5jbGFzcyBEYXlQZXJpb2RQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gODA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkJcIjpcbiAgICAgIGNhc2UgXCJCQlwiOlxuICAgICAgY2FzZSBcIkJCQlwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICBjYXNlIFwiQkJCQkJcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldEhvdXJzKCgwLCBfdXRpbHMuZGF5UGVyaW9kRW51bVRvSG91cnMpKHZhbHVlKSwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJhXCIsIFwiYlwiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5EYXlQZXJpb2RQYXJzZXIgPSBEYXlQZXJpb2RQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRXJhUGFyc2VyID0gdm9pZCAwO1xuXG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbmNsYXNzIEVyYVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxNDA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gQUQsIEJDXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICBjYXNlIFwiR0dHXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEEsIEJcbiAgICAgIGNhc2UgXCJHR0dHR1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIgfSk7XG4gICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdFxuICAgICAgY2FzZSBcIkdHR0dcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwid2lkZVwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZSkge1xuICAgIGZsYWdzLmVyYSA9IHZhbHVlO1xuICAgIGRhdGUuc2V0RnVsbFllYXIodmFsdWUsIDAsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJSXCIsIFwidVwiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5FcmFQYXJzZXIgPSBFcmFQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRXh0ZW5kZWRZZWFyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBFeHRlbmRlZFllYXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTMwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7XG4gICAgaWYgKHRva2VuID09PSBcInVcIikge1xuICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzU2lnbmVkKSg0LCBkYXRlU3RyaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHNTaWduZWQpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0RnVsbFllYXIodmFsdWUsIDAsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJHXCIsIFwieVwiLCBcIllcIiwgXCJSXCIsIFwid1wiLCBcIklcIiwgXCJpXCIsIFwiZVwiLCBcImNcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuRXh0ZW5kZWRZZWFyUGFyc2VyID0gRXh0ZW5kZWRZZWFyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlKSA9PlxuICAgICAgTWF0aC50cnVuYyh2YWx1ZSAqIE1hdGgucG93KDEwLCAtdG9rZW4ubGVuZ3RoICsgMykpO1xuICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLFxuICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICApO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldE1pbGxpc2Vjb25kcyh2YWx1ZSk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuRnJhY3Rpb25PZlNlY29uZFBhcnNlciA9IEZyYWN0aW9uT2ZTZWNvbmRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSG91cjBUbzExUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBIb3VyMFRvMTFQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIktcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuaG91cjExaCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIktvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTE7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGNvbnN0IGlzUE0gPSBkYXRlLmdldEhvdXJzKCkgPj0gMTI7XG4gICAgaWYgKGlzUE0gJiYgdmFsdWUgPCAxMikge1xuICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZSArIDEyLCAwLCAwLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZSwgMCwgMCwgMCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiaFwiLCBcIkhcIiwgXCJrXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkhvdXIwVG8xMVBhcnNlciA9IEhvdXIwVG8xMVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Ib3VyMHRvMjNQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEhvdXIwdG8yM1BhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA3MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiSFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5ob3VyMjNoLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiSG9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAyMztcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZSwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJhXCIsIFwiYlwiLCBcImhcIiwgXCJLXCIsIFwia1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5Ib3VyMHRvMjNQYXJzZXIgPSBIb3VyMHRvMjNQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSG91cjFUbzI0UGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBIb3VyMVRvMjRQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImtcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuaG91cjI0aCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcImtvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMjQ7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gdmFsdWUgPD0gMjQgPyB2YWx1ZSAlIDI0IDogdmFsdWU7XG4gICAgZGF0ZS5zZXRIb3Vycyhob3VycywgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJhXCIsIFwiYlwiLCBcImhcIiwgXCJIXCIsIFwiS1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5Ib3VyMVRvMjRQYXJzZXIgPSBIb3VyMVRvMjRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSG91cjF0bzEyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBIb3VyMXRvMTJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuaG91cjEyaCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcImhvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMTI7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGNvbnN0IGlzUE0gPSBkYXRlLmdldEhvdXJzKCkgPj0gMTI7XG4gICAgaWYgKGlzUE0gJiYgdmFsdWUgPCAxMikge1xuICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZSArIDEyLCAwLCAwLCAwKTtcbiAgICB9IGVsc2UgaWYgKCFpc1BNICYmIHZhbHVlID09PSAxMikge1xuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZSwgMCwgMCwgMCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiSFwiLCBcIktcIiwgXCJrXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkhvdXIxdG8xMlBhcnNlciA9IEhvdXIxdG8xMlBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5JU09EYXlQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3NldElTT0RheS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gSVNPIGRheSBvZiB3ZWVrXG5jbGFzcyBJU09EYXlQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICAgIHJldHVybiA3O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAyXG4gICAgICBjYXNlIFwiaVwiOlxuICAgICAgY2FzZSBcImlpXCI6IC8vIDAyXG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICAgIC8vIDJuZFxuICAgICAgY2FzZSBcImlvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImlpaVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJpaWlpaVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiaWlpaWlpXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImlpaWlcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gNztcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZSA9ICgwLCBfaW5kZXguc2V0SVNPRGF5KShkYXRlLCB2YWx1ZSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcInlcIixcbiAgICBcIllcIixcbiAgICBcInVcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcIkVcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuSVNPRGF5UGFyc2VyID0gSVNPRGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLklTT1RpbWV6b25lUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vLi4vX2xpYi9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLmpzXCIpO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBUaW1lem9uZSAoSVNPLTg2MDEpXG5jbGFzcyBJU09UaW1lem9uZVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbE1pbnV0ZXMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJ4eFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmJhc2ljLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwieHh4eFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxTZWNvbmRzLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwieHh4eHhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZE9wdGlvbmFsU2Vjb25kcyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInh4eFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBmbGFncywgdmFsdWUpIHtcbiAgICBpZiAoZmxhZ3MudGltZXN0YW1wSXNTZXQpIHJldHVybiBkYXRlO1xuICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKFxuICAgICAgZGF0ZSxcbiAgICAgIGRhdGUuZ2V0VGltZSgpIC1cbiAgICAgICAgKDAsIF9pbmRleDIuZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcykoZGF0ZSkgLVxuICAgICAgICB2YWx1ZSxcbiAgICApO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1widFwiLCBcIlRcIiwgXCJYXCJdO1xufVxuZXhwb3J0cy5JU09UaW1lem9uZVBhcnNlciA9IElTT1RpbWV6b25lUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLklTT1RpbWV6b25lV2l0aFpQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanNcIik7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIFRpbWV6b25lIChJU08tODYwMS4gKzAwOjAwIGlzIGAnWidgKVxuY2xhc3MgSVNPVGltZXpvbmVXaXRoWlBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbE1pbnV0ZXMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJYWFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmJhc2ljLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiWFhYWFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxTZWNvbmRzLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiWFhYWFhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZE9wdGlvbmFsU2Vjb25kcyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIlhYWFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBmbGFncywgdmFsdWUpIHtcbiAgICBpZiAoZmxhZ3MudGltZXN0YW1wSXNTZXQpIHJldHVybiBkYXRlO1xuICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKFxuICAgICAgZGF0ZSxcbiAgICAgIGRhdGUuZ2V0VGltZSgpIC1cbiAgICAgICAgKDAsIF9pbmRleDIuZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcykoZGF0ZSkgLVxuICAgICAgICB2YWx1ZSxcbiAgICApO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1widFwiLCBcIlRcIiwgXCJ4XCJdO1xufVxuZXhwb3J0cy5JU09UaW1lem9uZVdpdGhaUGFyc2VyID0gSVNPVGltZXpvbmVXaXRoWlBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5JU09XZWVrUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zZXRJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vLi4vc3RhcnRPZklTT1dlZWsuanNcIik7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIElTTyB3ZWVrIG9mIHllYXJcbmNsYXNzIElTT1dlZWtQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTAwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJJXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLndlZWssXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJJb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwid2Vla1wiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDUzO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleDIuc3RhcnRPZklTT1dlZWspKCgwLCBfaW5kZXguc2V0SVNPV2VlaykoZGF0ZSwgdmFsdWUpKTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcInlcIixcbiAgICBcIllcIixcbiAgICBcInVcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuSVNPV2Vla1BhcnNlciA9IElTT1dlZWtQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSVNPV2Vla1llYXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3N0YXJ0T2ZJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbmNsYXNzIElTT1dlZWtZZWFyUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEzMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikge1xuICAgIGlmICh0b2tlbiA9PT0gXCJSXCIpIHtcbiAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0c1NpZ25lZCkoNCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzU2lnbmVkKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBjb25zdCBmaXJzdFdlZWtPZlllYXIgPSAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgICBmaXJzdFdlZWtPZlllYXIuc2V0RnVsbFllYXIodmFsdWUsIDAsIDQpO1xuICAgIGZpcnN0V2Vla09mWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5zdGFydE9mSVNPV2VlaykoZmlyc3RXZWVrT2ZZZWFyKTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIkdcIixcbiAgICBcInlcIixcbiAgICBcIllcIixcbiAgICBcInVcIixcbiAgICBcIlFcIixcbiAgICBcInFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuSVNPV2Vla1llYXJQYXJzZXIgPSBJU09XZWVrWWVhclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Mb2NhbERheVBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vc2V0RGF5LmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBMb2NhbCBkYXkgb2Ygd2Vla1xuY2xhc3MgTG9jYWxEYXlQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUpID0+IHtcbiAgICAgIC8vIFdlIHdhbnQgaGVyZSBmbG9vciBpbnN0ZWFkIG9mIHRydW5jLCBzbyB3ZSBnZXQgLTcgZm9yIHZhbHVlIDAgaW5zdGVhZCBvZiAwXG4gICAgICBjb25zdCB3aG9sZVdlZWtEYXlzID0gTWF0aC5mbG9vcigodmFsdWUgLSAxKSAvIDcpICogNztcbiAgICAgIHJldHVybiAoKHZhbHVlICsgb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA2KSAlIDcpICsgd2hvbGVXZWVrRGF5cztcbiAgICB9O1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gM1xuICAgICAgY2FzZSBcImVcIjpcbiAgICAgIGNhc2UgXCJlZVwiOiAvLyAwM1xuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIDNyZFxuICAgICAgY2FzZSBcImVvXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHVuaXQ6IFwiZGF5XCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImVlZVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJlZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiZWVlZVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gNjtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgZGF0ZSA9ICgwLCBfaW5kZXguc2V0RGF5KShkYXRlLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcInlcIixcbiAgICBcIlJcIixcbiAgICBcInVcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIklcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcIkVcIixcbiAgICBcImlcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuTG9jYWxEYXlQYXJzZXIgPSBMb2NhbERheVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Mb2NhbFdlZWtQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3NldFdlZWsuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zdGFydE9mV2Vlay5qc1wiKTtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gTG9jYWwgd2VlayBvZiB5ZWFyXG5jbGFzcyBMb2NhbFdlZWtQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTAwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJ3XCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLndlZWssXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJ3b1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwid2Vla1wiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDUzO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleDIuc3RhcnRPZldlZWspKFxuICAgICAgKDAsIF9pbmRleC5zZXRXZWVrKShkYXRlLCB2YWx1ZSwgb3B0aW9ucyksXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJ5XCIsXG4gICAgXCJSXCIsXG4gICAgXCJ1XCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLkxvY2FsV2Vla1BhcnNlciA9IExvY2FsV2Vla1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Mb2NhbFdlZWtZZWFyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9nZXRXZWVrWWVhci5qc1wiKTtcblxudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vLi4vc3RhcnRPZldlZWsuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJcbmNsYXNzIExvY2FsV2Vla1llYXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTMwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAoeWVhcikgPT4gKHtcbiAgICAgIHllYXIsXG4gICAgICBpc1R3b0RpZ2l0WWVhcjogdG9rZW4gPT09IFwiWVlcIixcbiAgICB9KTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJZXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykoNCwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJZb1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB1bml0OiBcInllYXJcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmlzVHdvRGlnaXRZZWFyIHx8IHZhbHVlLnllYXIgPiAwO1xuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gKDAsIF9pbmRleC5nZXRXZWVrWWVhcikoZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUuaXNUd29EaWdpdFllYXIpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUd29EaWdpdFllYXIgPSAoMCwgX3V0aWxzLm5vcm1hbGl6ZVR3b0RpZ2l0WWVhcikoXG4gICAgICAgIHZhbHVlLnllYXIsXG4gICAgICAgIGN1cnJlbnRZZWFyLFxuICAgICAgKTtcbiAgICAgIGRhdGUuc2V0RnVsbFllYXIoXG4gICAgICAgIG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsXG4gICAgICAgIDAsXG4gICAgICAgIG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlLFxuICAgICAgKTtcbiAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICByZXR1cm4gKDAsIF9pbmRleDIuc3RhcnRPZldlZWspKGRhdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IHllYXIgPVxuICAgICAgIShcImVyYVwiIGluIGZsYWdzKSB8fCBmbGFncy5lcmEgPT09IDEgPyB2YWx1ZS55ZWFyIDogMSAtIHZhbHVlLnllYXI7XG4gICAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyLCAwLCBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gKDAsIF9pbmRleDIuc3RhcnRPZldlZWspKGRhdGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwieVwiLFxuICAgIFwiUlwiLFxuICAgIFwidVwiLFxuICAgIFwiUVwiLFxuICAgIFwicVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiaVwiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5Mb2NhbFdlZWtZZWFyUGFyc2VyID0gTG9jYWxXZWVrWWVhclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5NaW51dGVQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIE1pbnV0ZVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA2MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5taW51dGUsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJtb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwibWludXRlXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gNTk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TWludXRlcyh2YWx1ZSwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuTWludXRlUGFyc2VyID0gTWludXRlUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLk1vbnRoUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBNb250aFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiWVwiLFxuICAgIFwiUlwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiSVwiLFxuICAgIFwiRFwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xuXG4gIHByaW9yaXR5ID0gMTEwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUpID0+IHZhbHVlIC0gMTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMubW9udGgsXG4gICAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykoMiwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcbiAgICAgIGNhc2UgXCJNb1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB1bml0OiBcIm1vbnRoXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcbiAgICAgIGNhc2UgXCJNTU1NXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTE7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TW9udGgodmFsdWUsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbn1cbmV4cG9ydHMuTW9udGhQYXJzZXIgPSBNb250aFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5RdWFydGVyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBRdWFydGVyUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEyMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwiUVwiOlxuICAgICAgY2FzZSBcIlFRXCI6IC8vIDAxLCAwMiwgMDMsIDA0XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuICAgICAgY2FzZSBcIlFvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJxdWFydGVyXCIgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuICAgICAgY2FzZSBcIlFRUVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcIlFRUVFRXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcIlFRUVFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gNDtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRNb250aCgodmFsdWUgLSAxKSAqIDMsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJZXCIsXG4gICAgXCJSXCIsXG4gICAgXCJxXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLlF1YXJ0ZXJQYXJzZXIgPSBRdWFydGVyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlNlY29uZFBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgU2Vjb25kUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDUwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLnNlY29uZCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInNvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJzZWNvbmRcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA1OTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRTZWNvbmRzKHZhbHVlLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5TZWNvbmRQYXJzZXIgPSBTZWNvbmRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zZXREYXkuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrXG5jbGFzcyBTdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gOTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gV2Ugd2FudCBoZXJlIGZsb29yIGluc3RlYWQgb2YgdHJ1bmMsIHNvIHdlIGdldCAtNyBmb3IgdmFsdWUgMCBpbnN0ZWFkIG9mIDBcbiAgICAgIGNvbnN0IHdob2xlV2Vla0RheXMgPSBNYXRoLmZsb29yKCh2YWx1ZSAtIDEpIC8gNykgKiA3O1xuICAgICAgcmV0dXJuICgodmFsdWUgKyBvcHRpb25zLndlZWtTdGFydHNPbiArIDYpICUgNykgKyB3aG9sZVdlZWtEYXlzO1xuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAzXG4gICAgICBjYXNlIFwiY1wiOlxuICAgICAgY2FzZSBcImNjXCI6IC8vIDAzXG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gM3JkXG4gICAgICBjYXNlIFwiY29cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgdW5pdDogXCJkYXlcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiY2NjXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJjY2NjY1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImNjY2NjY1wiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA2O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBkYXRlID0gKDAsIF9pbmRleC5zZXREYXkpKGRhdGUsIHZhbHVlLCBvcHRpb25zKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwieVwiLFxuICAgIFwiUlwiLFxuICAgIFwidVwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiRVwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIgPSBTdGFuZEFsb25lTG9jYWxEYXlQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuU3RhbmRBbG9uZU1vbnRoUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBTdGFuZEFsb25lTW9udGhQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTEwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUpID0+IHZhbHVlIC0gMTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMubW9udGgsXG4gICAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykoMiwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcbiAgICAgIGNhc2UgXCJMb1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB1bml0OiBcIm1vbnRoXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcbiAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTE7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TW9udGgodmFsdWUsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJZXCIsXG4gICAgXCJSXCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJJXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLlN0YW5kQWxvbmVNb250aFBhcnNlciA9IFN0YW5kQWxvbmVNb250aFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5TdGFuZEFsb25lUXVhcnRlclBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTIwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJxXCI6XG4gICAgICBjYXNlIFwicXFcIjogLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwicW9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwicXFxXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwicXFxcXFcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwicXFxcVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSA0O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldE1vbnRoKCh2YWx1ZSAtIDEpICogMywgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIllcIixcbiAgICBcIlJcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcIklcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIgPSBTdGFuZEFsb25lUXVhcnRlclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIFRpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAyMDtcblxuICBwYXJzZShkYXRlU3RyaW5nKSB7XG4gICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VBbnlEaWdpdHNTaWduZWQpKGRhdGVTdHJpbmcpO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICByZXR1cm4gWygwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgdmFsdWUpLCB7IHRpbWVzdGFtcElzU2V0OiB0cnVlIH1dO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gXCIqXCI7XG59XG5leHBvcnRzLlRpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlciA9IFRpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5UaW1lc3RhbXBTZWNvbmRzUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBUaW1lc3RhbXBTZWNvbmRzUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDQwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcpIHtcbiAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZUFueURpZ2l0c1NpZ25lZCkoZGF0ZVN0cmluZyk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIHJldHVybiBbXG4gICAgICAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIHZhbHVlICogMTAwMCksXG4gICAgICB7IHRpbWVzdGFtcElzU2V0OiB0cnVlIH0sXG4gICAgXTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFwiKlwiO1xufVxuZXhwb3J0cy5UaW1lc3RhbXBTZWNvbmRzUGFyc2VyID0gVGltZXN0YW1wU2Vjb25kc1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5ZZWFyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBGcm9tIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtMzEvdHIzNS1kYXRlcy5odG1sI0RhdGVfRm9ybWF0X1BhdHRlcm5zXG4vLyB8IFllYXIgICAgIHwgICAgIHkgfCB5eSB8ICAgeXl5IHwgIHl5eXkgfCB5eXl5eSB8XG4vLyB8LS0tLS0tLS0tLXwtLS0tLS0tfC0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18XG4vLyB8IEFEIDEgICAgIHwgICAgIDEgfCAwMSB8ICAgMDAxIHwgIDAwMDEgfCAwMDAwMSB8XG4vLyB8IEFEIDEyICAgIHwgICAgMTIgfCAxMiB8ICAgMDEyIHwgIDAwMTIgfCAwMDAxMiB8XG4vLyB8IEFEIDEyMyAgIHwgICAxMjMgfCAyMyB8ICAgMTIzIHwgIDAxMjMgfCAwMDEyMyB8XG4vLyB8IEFEIDEyMzQgIHwgIDEyMzQgfCAzNCB8ICAxMjM0IHwgIDEyMzQgfCAwMTIzNCB8XG4vLyB8IEFEIDEyMzQ1IHwgMTIzNDUgfCA0NSB8IDEyMzQ1IHwgMTIzNDUgfCAxMjM0NSB8XG5jbGFzcyBZZWFyUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEzMDtcbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiWVwiLCBcIlJcIiwgXCJ1XCIsIFwid1wiLCBcIklcIiwgXCJpXCIsIFwiZVwiLCBcImNcIiwgXCJ0XCIsIFwiVFwiXTtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHllYXIpID0+ICh7XG4gICAgICB5ZWFyLFxuICAgICAgaXNUd29EaWdpdFllYXI6IHRva2VuID09PSBcInl5XCIsXG4gICAgfSk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwieVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKDQsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwieW9cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgdW5pdDogXCJ5ZWFyXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5pc1R3b0RpZ2l0WWVhciB8fCB2YWx1ZS55ZWFyID4gMDtcbiAgfVxuXG4gIHNldChkYXRlLCBmbGFncywgdmFsdWUpIHtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcblxuICAgIGlmICh2YWx1ZS5pc1R3b0RpZ2l0WWVhcikge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR3b0RpZ2l0WWVhciA9ICgwLCBfdXRpbHMubm9ybWFsaXplVHdvRGlnaXRZZWFyKShcbiAgICAgICAgdmFsdWUueWVhcixcbiAgICAgICAgY3VycmVudFllYXIsXG4gICAgICApO1xuICAgICAgZGF0ZS5zZXRGdWxsWWVhcihub3JtYWxpemVkVHdvRGlnaXRZZWFyLCAwLCAxKTtcbiAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCB5ZWFyID1cbiAgICAgICEoXCJlcmFcIiBpbiBmbGFncykgfHwgZmxhZ3MuZXJhID09PSAxID8gdmFsdWUueWVhciA6IDEgLSB2YWx1ZS55ZWFyO1xuICAgIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgMCwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxufVxuZXhwb3J0cy5ZZWFyUGFyc2VyID0gWWVhclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5kYXlQZXJpb2RFbnVtVG9Ib3VycyA9IGRheVBlcmlvZEVudW1Ub0hvdXJzO1xuZXhwb3J0cy5pc0xlYXBZZWFySW5kZXggPSBpc0xlYXBZZWFySW5kZXg7XG5leHBvcnRzLm1hcFZhbHVlID0gbWFwVmFsdWU7XG5leHBvcnRzLm5vcm1hbGl6ZVR3b0RpZ2l0WWVhciA9IG5vcm1hbGl6ZVR3b0RpZ2l0WWVhcjtcbmV4cG9ydHMucGFyc2VBbnlEaWdpdHNTaWduZWQgPSBwYXJzZUFueURpZ2l0c1NpZ25lZDtcbmV4cG9ydHMucGFyc2VORGlnaXRzID0gcGFyc2VORGlnaXRzO1xuZXhwb3J0cy5wYXJzZU5EaWdpdHNTaWduZWQgPSBwYXJzZU5EaWdpdHNTaWduZWQ7XG5leHBvcnRzLnBhcnNlTnVtZXJpY1BhdHRlcm4gPSBwYXJzZU51bWVyaWNQYXR0ZXJuO1xuZXhwb3J0cy5wYXJzZVRpbWV6b25lUGF0dGVybiA9IHBhcnNlVGltZXpvbmVQYXR0ZXJuO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi9jb25zdGFudHMuanNcIik7XG5cbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4vY29uc3RhbnRzLmpzXCIpO1xuXG5mdW5jdGlvbiBtYXBWYWx1ZShwYXJzZUZuUmVzdWx0LCBtYXBGbikge1xuICBpZiAoIXBhcnNlRm5SZXN1bHQpIHtcbiAgICByZXR1cm4gcGFyc2VGblJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmFsdWU6IG1hcEZuKHBhcnNlRm5SZXN1bHQudmFsdWUpLFxuICAgIHJlc3Q6IHBhcnNlRm5SZXN1bHQucmVzdCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VOdW1lcmljUGF0dGVybihwYXR0ZXJuLCBkYXRlU3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoUmVzdWx0ID0gZGF0ZVN0cmluZy5tYXRjaChwYXR0ZXJuKTtcblxuICBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZhbHVlOiBwYXJzZUludChtYXRjaFJlc3VsdFswXSwgMTApLFxuICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UobWF0Y2hSZXN1bHRbMF0ubGVuZ3RoKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lem9uZVBhdHRlcm4ocGF0dGVybiwgZGF0ZVN0cmluZykge1xuICBjb25zdCBtYXRjaFJlc3VsdCA9IGRhdGVTdHJpbmcubWF0Y2gocGF0dGVybik7XG5cbiAgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gSW5wdXQgaXMgJ1onXG4gIGlmIChtYXRjaFJlc3VsdFswXSA9PT0gXCJaXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IDAsXG4gICAgICByZXN0OiBkYXRlU3RyaW5nLnNsaWNlKDEpLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBzaWduID0gbWF0Y2hSZXN1bHRbMV0gPT09IFwiK1wiID8gMSA6IC0xO1xuICBjb25zdCBob3VycyA9IG1hdGNoUmVzdWx0WzJdID8gcGFyc2VJbnQobWF0Y2hSZXN1bHRbMl0sIDEwKSA6IDA7XG4gIGNvbnN0IG1pbnV0ZXMgPSBtYXRjaFJlc3VsdFszXSA/IHBhcnNlSW50KG1hdGNoUmVzdWx0WzNdLCAxMCkgOiAwO1xuICBjb25zdCBzZWNvbmRzID0gbWF0Y2hSZXN1bHRbNV0gPyBwYXJzZUludChtYXRjaFJlc3VsdFs1XSwgMTApIDogMDtcblxuICByZXR1cm4ge1xuICAgIHZhbHVlOlxuICAgICAgc2lnbiAqXG4gICAgICAoaG91cnMgKiBfaW5kZXgubWlsbGlzZWNvbmRzSW5Ib3VyICtcbiAgICAgICAgbWludXRlcyAqIF9pbmRleC5taWxsaXNlY29uZHNJbk1pbnV0ZSArXG4gICAgICAgIHNlY29uZHMgKiBfaW5kZXgubWlsbGlzZWNvbmRzSW5TZWNvbmQpLFxuICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UobWF0Y2hSZXN1bHRbMF0ubGVuZ3RoKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBbnlEaWdpdHNTaWduZWQoZGF0ZVN0cmluZykge1xuICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5hbnlEaWdpdHNTaWduZWQsXG4gICAgZGF0ZVN0cmluZyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VORGlnaXRzKG4sIGRhdGVTdHJpbmcpIHtcbiAgc3dpdGNoIChuKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLnNpbmdsZURpZ2l0LFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMudHdvRGlnaXRzLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMudGhyZWVEaWdpdHMsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5mb3VyRGlnaXRzLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obmV3IFJlZ0V4cChcIl5cXFxcZHsxLFwiICsgbiArIFwifVwiKSwgZGF0ZVN0cmluZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VORGlnaXRzU2lnbmVkKG4sIGRhdGVTdHJpbmcpIHtcbiAgc3dpdGNoIChuKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLnNpbmdsZURpZ2l0U2lnbmVkLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMudHdvRGlnaXRzU2lnbmVkLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMudGhyZWVEaWdpdHNTaWduZWQsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5mb3VyRGlnaXRzU2lnbmVkLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obmV3IFJlZ0V4cChcIl4tP1xcXFxkezEsXCIgKyBuICsgXCJ9XCIpLCBkYXRlU3RyaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkYXlQZXJpb2RFbnVtVG9Ib3VycyhkYXlQZXJpb2QpIHtcbiAgc3dpdGNoIChkYXlQZXJpb2QpIHtcbiAgICBjYXNlIFwibW9ybmluZ1wiOlxuICAgICAgcmV0dXJuIDQ7XG4gICAgY2FzZSBcImV2ZW5pbmdcIjpcbiAgICAgIHJldHVybiAxNztcbiAgICBjYXNlIFwicG1cIjpcbiAgICBjYXNlIFwibm9vblwiOlxuICAgIGNhc2UgXCJhZnRlcm5vb25cIjpcbiAgICAgIHJldHVybiAxMjtcbiAgICBjYXNlIFwiYW1cIjpcbiAgICBjYXNlIFwibWlkbmlnaHRcIjpcbiAgICBjYXNlIFwibmlnaHRcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVHdvRGlnaXRZZWFyKHR3b0RpZ2l0WWVhciwgY3VycmVudFllYXIpIHtcbiAgY29uc3QgaXNDb21tb25FcmEgPSBjdXJyZW50WWVhciA+IDA7XG4gIC8vIEFic29sdXRlIG51bWJlciBvZiB0aGUgY3VycmVudCB5ZWFyOlxuICAvLyAxIC0+IDEgQUNcbiAgLy8gMCAtPiAxIEJDXG4gIC8vIC0xIC0+IDIgQkNcbiAgY29uc3QgYWJzQ3VycmVudFllYXIgPSBpc0NvbW1vbkVyYSA/IGN1cnJlbnRZZWFyIDogMSAtIGN1cnJlbnRZZWFyO1xuXG4gIGxldCByZXN1bHQ7XG4gIGlmIChhYnNDdXJyZW50WWVhciA8PSA1MCkge1xuICAgIHJlc3VsdCA9IHR3b0RpZ2l0WWVhciB8fCAxMDA7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmFuZ2VFbmQgPSBhYnNDdXJyZW50WWVhciArIDUwO1xuICAgIGNvbnN0IHJhbmdlRW5kQ2VudHVyeSA9IE1hdGgudHJ1bmMocmFuZ2VFbmQgLyAxMDApICogMTAwO1xuICAgIGNvbnN0IGlzUHJldmlvdXNDZW50dXJ5ID0gdHdvRGlnaXRZZWFyID49IHJhbmdlRW5kICUgMTAwO1xuICAgIHJlc3VsdCA9IHR3b0RpZ2l0WWVhciArIHJhbmdlRW5kQ2VudHVyeSAtIChpc1ByZXZpb3VzQ2VudHVyeSA/IDEwMCA6IDApO1xuICB9XG5cbiAgcmV0dXJuIGlzQ29tbW9uRXJhID8gcmVzdWx0IDogMSAtIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNMZWFwWWVhckluZGV4KHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0MDAgPT09IDAgfHwgKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldCA9IHNldDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zZXRNb250aC5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgZGF0ZSB2YWx1ZXMgdG8gYSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IGRhdGUgdmFsdWVzIHRvIGEgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBTZXRzIHRpbWUgdmFsdWVzIHRvIGRhdGUgZnJvbSBvYmplY3QgYHZhbHVlc2AuXG4gKiBBIHZhbHVlIGlzIG5vdCBzZXQgaWYgaXQgaXMgdW5kZWZpbmVkIG9yIG51bGwgb3IgZG9lc24ndCBleGlzdCBpbiBgdmFsdWVzYC5cbiAqXG4gKiBOb3RlIGFib3V0IGJ1bmRsZSBzaXplOiBgc2V0YCBkb2VzIG5vdCBpbnRlcm5hbGx5IHVzZSBgc2V0WGAgZnVuY3Rpb25zIGZyb20gZGF0ZS1mbnMgYnV0IGluc3RlYWQgb3B0c1xuICogdG8gdXNlIG5hdGl2ZSBgRGF0ZSNzZXRYYCBtZXRob2RzLiBJZiB5b3UgdXNlIHRoaXMgZnVuY3Rpb24sIHlvdSBtYXkgbm90IHdhbnQgdG8gaW5jbHVkZSB0aGVcbiAqIG90aGVyIGBzZXRYYCBmdW5jdGlvbnMgdGhhdCBkYXRlLWZucyBwcm92aWRlcyBpZiB5b3UgYXJlIGNvbmNlcm5lZCBhYm91dCB0aGUgYnVuZGxlIHNpemUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIGRhdGUgdmFsdWVzIHRvIGJlIHNldFxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIG9wdGlvbnMgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRyYW5zZm9ybSAxIFNlcHRlbWJlciAyMDE0IGludG8gMjAgT2N0b2JlciAyMDE1IGluIGEgc2luZ2xlIGxpbmU6XG4gKiBjb25zdCByZXN1bHQgPSBzZXQobmV3IERhdGUoMjAxNCwgOCwgMjApLCB7IHllYXI6IDIwMTUsIG1vbnRoOiA5LCBkYXRlOiAyMCB9KVxuICogLy89PiBUdWUgT2N0IDIwIDIwMTUgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IDEyIFBNIHRvIDEgU2VwdGVtYmVyIDIwMTQgMDE6MjM6NDUgdG8gMSBTZXB0ZW1iZXIgMjAxNCAxMjowMDowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldChuZXcgRGF0ZSgyMDE0LCA4LCAxLCAxLCAyMywgNDUpLCB7IGhvdXJzOiAxMiB9KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMTI6MjM6NDVcbiAqL1xuXG5mdW5jdGlvbiBzZXQoZGF0ZSwgdmFsdWVzKSB7XG4gIGxldCBfZGF0ZSA9ICgwLCBfaW5kZXgzLnRvRGF0ZSkoZGF0ZSk7XG5cbiAgLy8gQ2hlY2sgaWYgZGF0ZSBpcyBJbnZhbGlkIERhdGUgYmVjYXVzZSBEYXRlLnByb3RvdHlwZS5zZXRGdWxsWWVhciBpZ25vcmVzIHRoZSB2YWx1ZSBvZiBJbnZhbGlkIERhdGVcbiAgaWYgKGlzTmFOKCtfZGF0ZSkpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCBOYU4pO1xuICB9XG5cbiAgaWYgKHZhbHVlcy55ZWFyICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZXMueWVhcik7XG4gIH1cblxuICBpZiAodmFsdWVzLm1vbnRoICE9IG51bGwpIHtcbiAgICBfZGF0ZSA9ICgwLCBfaW5kZXgyLnNldE1vbnRoKShfZGF0ZSwgdmFsdWVzLm1vbnRoKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMuZGF0ZSAhPSBudWxsKSB7XG4gICAgX2RhdGUuc2V0RGF0ZSh2YWx1ZXMuZGF0ZSk7XG4gIH1cblxuICBpZiAodmFsdWVzLmhvdXJzICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXRIb3Vycyh2YWx1ZXMuaG91cnMpO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5taW51dGVzICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXRNaW51dGVzKHZhbHVlcy5taW51dGVzKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMuc2Vjb25kcyAhPSBudWxsKSB7XG4gICAgX2RhdGUuc2V0U2Vjb25kcyh2YWx1ZXMuc2Vjb25kcyk7XG4gIH1cblxuICBpZiAodmFsdWVzLm1pbGxpc2Vjb25kcyAhPSBudWxsKSB7XG4gICAgX2RhdGUuc2V0TWlsbGlzZWNvbmRzKHZhbHVlcy5taWxsaXNlY29uZHMpO1xuICB9XG5cbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldERheSA9IHNldERheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGREYXlzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHNldERheX0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHNldERheVxuICogQGNhdGVnb3J5IFdlZWtkYXkgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIGRheSBvZiB0aGUgd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBkYXkgLSBUaGUgZGF5IG9mIHRoZSB3ZWVrIG9mIHRoZSBuZXcgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBkYXkgb2YgdGhlIHdlZWsgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB3ZWVrIGRheSB0byBTdW5kYXksIHdpdGggdGhlIGRlZmF1bHQgd2Vla1N0YXJ0c09uIG9mIFN1bmRheTpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldERheShuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMClcbiAqIC8vPT4gU3VuIEF1ZyAzMSAyMDE0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB3ZWVrIGRheSB0byBTdW5kYXksIHdpdGggYSB3ZWVrU3RhcnRzT24gb2YgTW9uZGF5OlxuICogY29uc3QgcmVzdWx0ID0gc2V0RGF5KG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAwLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBTdW4gU2VwIDA3IDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0RGF5KGRhdGUsIGRheSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9ICgwLCBfaW5kZXgzLmdldERlZmF1bHRPcHRpb25zKSgpO1xuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgY3VycmVudERheSA9IF9kYXRlLmdldERheSgpO1xuXG4gIGNvbnN0IHJlbWFpbmRlciA9IGRheSAlIDc7XG4gIGNvbnN0IGRheUluZGV4ID0gKHJlbWFpbmRlciArIDcpICUgNztcblxuICBjb25zdCBkZWx0YSA9IDcgLSB3ZWVrU3RhcnRzT247XG4gIGNvbnN0IGRpZmYgPVxuICAgIGRheSA8IDAgfHwgZGF5ID4gNlxuICAgICAgPyBkYXkgLSAoKGN1cnJlbnREYXkgKyBkZWx0YSkgJSA3KVxuICAgICAgOiAoKGRheUluZGV4ICsgZGVsdGEpICUgNykgLSAoKGN1cnJlbnREYXkgKyBkZWx0YSkgJSA3KTtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkRGF5cykoX2RhdGUsIGRpZmYpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldEhvdXJzID0gc2V0SG91cnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldEhvdXJzXG4gKiBAY2F0ZWdvcnkgSG91ciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBob3VycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBob3VycyAtIFRoZSBob3VycyBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgaG91cnMgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCA0IGhvdXJzIHRvIDEgU2VwdGVtYmVyIDIwMTQgMTE6MzA6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRIb3VycyhuZXcgRGF0ZSgyMDE0LCA4LCAxLCAxMSwgMzApLCA0KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDQ6MzA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0SG91cnMoZGF0ZSwgaG91cnMpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIF9kYXRlLnNldEhvdXJzKGhvdXJzKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldElTT0RheSA9IHNldElTT0RheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGREYXlzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9nZXRJU09EYXkuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRJU09EYXlcbiAqIEBjYXRlZ29yeSBXZWVrZGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgZGF5IG9mIHRoZSBJU08gd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgZGF5IG9mIHRoZSBJU08gd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIElTTyB3ZWVrIHN0YXJ0cyB3aXRoIE1vbmRheS5cbiAqIDcgaXMgdGhlIGluZGV4IG9mIFN1bmRheSwgMSBpcyB0aGUgaW5kZXggb2YgTW9uZGF5IGV0Yy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBkYXkgLSBUaGUgZGF5IG9mIHRoZSBJU08gd2VlayBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5IG9mIHRoZSBJU08gd2VlayBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IFN1bmRheSB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc2V0SVNPRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA3KVxuICogLy89PiBTdW4gU2VwIDA3IDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0SVNPRGF5KGRhdGUsIGRheSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgzLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGN1cnJlbnREYXkgPSAoMCwgX2luZGV4Mi5nZXRJU09EYXkpKF9kYXRlKTtcbiAgY29uc3QgZGlmZiA9IGRheSAtIGN1cnJlbnREYXk7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZERheXMpKF9kYXRlLCBkaWZmKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRJU09XZWVrID0gc2V0SVNPV2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9nZXRJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0SVNPV2Vla1xuICogQGNhdGVnb3J5IElTTyBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgSVNPIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIElTTyB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLCBzYXZpbmcgdGhlIHdlZWtkYXkgbnVtYmVyLlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB3ZWVrIC0gVGhlIElTTyB3ZWVrIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBJU08gd2VlayBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHRoZSA1M3JkIElTTyB3ZWVrIHRvIDcgQXVndXN0IDIwMDQ6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRJU09XZWVrKG5ldyBEYXRlKDIwMDQsIDcsIDcpLCA1MylcbiAqIC8vPT4gU2F0IEphbiAwMSAyMDA1IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldElTT1dlZWsoZGF0ZSwgd2Vlaykge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRpZmYgPSAoMCwgX2luZGV4LmdldElTT1dlZWspKF9kYXRlKSAtIHdlZWs7XG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpIC0gZGlmZiAqIDcpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0TWludXRlcyA9IHNldE1pbnV0ZXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldE1pbnV0ZXNcbiAqIEBjYXRlZ29yeSBNaW51dGUgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBtaW51dGVzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBtaW51dGVzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIG1pbnV0ZXMgLSBUaGUgbWludXRlcyBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbWludXRlcyBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IDQ1IG1pbnV0ZXMgdG8gMSBTZXB0ZW1iZXIgMjAxNCAxMTozMDo0MDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldE1pbnV0ZXMobmV3IERhdGUoMjAxNCwgOCwgMSwgMTEsIDMwLCA0MCksIDQ1KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMTE6NDU6NDBcbiAqL1xuZnVuY3Rpb24gc2V0TWludXRlcyhkYXRlLCBtaW51dGVzKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBfZGF0ZS5zZXRNaW51dGVzKG1pbnV0ZXMpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0TW9udGggPSBzZXRNb250aDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9nZXREYXlzSW5Nb250aC5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldE1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBtb250aCB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgbW9udGggdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gbW9udGggLSBUaGUgbW9udGggaW5kZXggdG8gc2V0ICgwLTExKVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtb250aCBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IEZlYnJ1YXJ5IHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMSlcbiAqIC8vPT4gU2F0IEZlYiAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldE1vbnRoKGRhdGUsIG1vbnRoKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDMudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERhdGUoKTtcblxuICBjb25zdCBkYXRlV2l0aERlc2lyZWRNb250aCA9ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGRhdGVXaXRoRGVzaXJlZE1vbnRoLnNldEZ1bGxZZWFyKHllYXIsIG1vbnRoLCAxNSk7XG4gIGRhdGVXaXRoRGVzaXJlZE1vbnRoLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBkYXlzSW5Nb250aCA9ICgwLCBfaW5kZXgyLmdldERheXNJbk1vbnRoKShkYXRlV2l0aERlc2lyZWRNb250aCk7XG4gIC8vIFNldCB0aGUgbGFzdCBkYXkgb2YgdGhlIG5ldyBtb250aFxuICAvLyBpZiB0aGUgb3JpZ2luYWwgZGF0ZSB3YXMgdGhlIGxhc3QgZGF5IG9mIHRoZSBsb25nZXIgbW9udGhcbiAgX2RhdGUuc2V0TW9udGgobW9udGgsIE1hdGgubWluKGRheSwgZGF5c0luTW9udGgpKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldFF1YXJ0ZXIgPSBzZXRRdWFydGVyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3NldE1vbnRoLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0UXVhcnRlclxuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSB5ZWFyIHF1YXJ0ZXIgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIHllYXIgcXVhcnRlciB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBxdWFydGVyIC0gVGhlIHF1YXJ0ZXIgb2YgdGhlIG5ldyBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHF1YXJ0ZXIgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB0aGUgMm5kIHF1YXJ0ZXIgdG8gMiBKdWx5IDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRRdWFydGVyKG5ldyBEYXRlKDIwMTQsIDYsIDIpLCAyKVxuICogLy89PiBXZWQgQXByIDAyIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0UXVhcnRlcihkYXRlLCBxdWFydGVyKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlKTtcbiAgY29uc3Qgb2xkUXVhcnRlciA9IE1hdGgudHJ1bmMoX2RhdGUuZ2V0TW9udGgoKSAvIDMpICsgMTtcbiAgY29uc3QgZGlmZiA9IHF1YXJ0ZXIgLSBvbGRRdWFydGVyO1xuICByZXR1cm4gKDAsIF9pbmRleC5zZXRNb250aCkoX2RhdGUsIF9kYXRlLmdldE1vbnRoKCkgKyBkaWZmICogMyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0U2Vjb25kcyA9IHNldFNlY29uZHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldFNlY29uZHNcbiAqIEBjYXRlZ29yeSBTZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHNlY29uZHMgLSBUaGUgc2Vjb25kcyBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgc2Vjb25kcyBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IDQ1IHNlY29uZHMgdG8gMSBTZXB0ZW1iZXIgMjAxNCAxMTozMDo0MDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFNlY29uZHMobmV3IERhdGUoMjAxNCwgOCwgMSwgMTEsIDMwLCA0MCksIDQ1KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMTE6MzA6NDVcbiAqL1xuZnVuY3Rpb24gc2V0U2Vjb25kcyhkYXRlLCBzZWNvbmRzKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBfZGF0ZS5zZXRTZWNvbmRzKHNlY29uZHMpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0V2VlayA9IHNldFdlZWs7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vZ2V0V2Vlay5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc2V0V2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHNldFdlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgbG9jYWwgd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgbG9jYWwgd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZSwgc2F2aW5nIHRoZSB3ZWVrZGF5IG51bWJlci5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB3ZWVrIC0gVGhlIHdlZWsgb2YgdGhlIG5ldyBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbG9jYWwgd2VlayBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHRoZSAxc3Qgd2VlayB0byAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9uczpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMiksIDEpXG4gKiAvLz0+IFN1biBEZWMgMjYgMjAwNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgdGhlIDFzdCB3ZWVrIHRvIDIgSmFudWFyeSAyMDA1LFxuICogLy8gaWYgTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWssXG4gKiAvLyBhbmQgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIgYWx3YXlzIGNvbnRhaW5zIDQgSmFudWFyeTpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMiksIDEsIHtcbiAqICAgd2Vla1N0YXJ0c09uOiAxLFxuICogICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDRcbiAqIH0pXG4gKiAvLz0+IFN1biBKYW4gNCAyMDA0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldFdlZWsoZGF0ZSwgd2Vlaywgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRpZmYgPSAoMCwgX2luZGV4LmdldFdlZWspKF9kYXRlLCBvcHRpb25zKSAtIHdlZWs7XG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpIC0gZGlmZiAqIDcpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0WWVhciA9IHNldFllYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldFllYXJcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgeWVhciB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgeWVhciB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB5ZWFyIC0gVGhlIHllYXIgb2YgdGhlIG5ldyBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHllYXIgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB5ZWFyIDIwMTMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFllYXIobmV3IERhdGUoMjAxNCwgOCwgMSksIDIwMTMpXG4gKiAvLz0+IFN1biBTZXAgMDEgMjAxMyAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzZXRZZWFyKGRhdGUsIHllYXIpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGUpO1xuXG4gIC8vIENoZWNrIGlmIGRhdGUgaXMgSW52YWxpZCBEYXRlIGJlY2F1c2UgRGF0ZS5wcm90b3R5cGUuc2V0RnVsbFllYXIgaWdub3JlcyB0aGUgdmFsdWUgb2YgSW52YWxpZCBEYXRlXG4gIGlmIChpc05hTigrX2RhdGUpKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgTmFOKTtcbiAgfVxuXG4gIF9kYXRlLnNldEZ1bGxZZWFyKHllYXIpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZEYXlcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIGRheSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgZGF5IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIGRheVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSBkYXkgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFR1ZSBTZXAgMDIgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mRGF5KGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZklTT1dlZWsgPSBzdGFydE9mSVNPV2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9zdGFydE9mV2Vlay5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mSVNPV2Vla1xuICogQGNhdGVnb3J5IElTTyBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZJU09XZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mSVNPV2VlayhkYXRlKSB7XG4gIHJldHVybiAoMCwgX2luZGV4LnN0YXJ0T2ZXZWVrKShkYXRlLCB7IHdlZWtTdGFydHNPbjogMSB9KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mSVNPV2Vla1llYXIgPSBzdGFydE9mSVNPV2Vla1llYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vZ2V0SVNPV2Vla1llYXIuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZJU09XZWVrLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcixcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1OlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZklTT1dlZWtZZWFyKGRhdGUpIHtcbiAgY29uc3QgeWVhciA9ICgwLCBfaW5kZXguZ2V0SVNPV2Vla1llYXIpKGRhdGUpO1xuICBjb25zdCBmb3VydGhPZkphbnVhcnkgPSAoMCwgX2luZGV4My5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldEZ1bGxZZWFyKHllYXIsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiAoMCwgX2luZGV4Mi5zdGFydE9mSVNPV2VlaykoZm91cnRoT2ZKYW51YXJ5KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mTW9udGggPSBzdGFydE9mTW9udGg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgbW9udGhcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgbW9udGggZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZNb250aChkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBfZGF0ZS5zZXREYXRlKDEpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZRdWFydGVyID0gc3RhcnRPZlF1YXJ0ZXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZRdWFydGVyXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgeWVhciBxdWFydGVyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSB5ZWFyIHF1YXJ0ZXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgcXVhcnRlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSBxdWFydGVyIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZlF1YXJ0ZXIobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIEp1bCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZRdWFydGVyKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGN1cnJlbnRNb250aCA9IF9kYXRlLmdldE1vbnRoKCk7XG4gIGNvbnN0IG1vbnRoID0gY3VycmVudE1vbnRoIC0gKGN1cnJlbnRNb250aCAlIDMpO1xuICBfZGF0ZS5zZXRNb250aChtb250aCwgMSk7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZldlZWsgPSBzdGFydE9mV2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZXZWVrfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZldlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gU3VuIEF1ZyAzMSAyMDE0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksIHRoZSBzdGFydCBvZiB0aGUgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCksIHsgd2Vla1N0YXJ0c09uOiAxIH0pXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDIuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpO1xuICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcblxuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZXZWVrWWVhciA9IHN0YXJ0T2ZXZWVrWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9nZXRXZWVrWWVhci5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vc3RhcnRPZldlZWsuanNcIik7XG5cbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZXZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrWWVhclxuICogQGNhdGVnb3J5IFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gYSB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciAyIEp1bHkgMjAwNSB3aXRoIGRlZmF1bHQgc2V0dGluZ3M6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2Vla1llYXIobmV3IERhdGUoMjAwNSwgNiwgMikpXG4gKiAvLz0+IFN1biBEZWMgMjYgMjAwNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciAyIEp1bHkgMjAwNVxuICogLy8gaWYgTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2Ygd2Vla1xuICogLy8gYW5kIDQgSmFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXI6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2Vla1llYXIobmV3IERhdGUoMjAwNSwgNiwgMiksIHtcbiAqICAgd2Vla1N0YXJ0c09uOiAxLFxuICogICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDRcbiAqIH0pXG4gKiAvLz0+IE1vbiBKYW4gMDMgMjAwNSAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9ICgwLCBfaW5kZXg0LmdldERlZmF1bHRPcHRpb25zKSgpO1xuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IHllYXIgPSAoMCwgX2luZGV4Mi5nZXRXZWVrWWVhcikoZGF0ZSwgb3B0aW9ucyk7XG4gIGNvbnN0IGZpcnN0V2VlayA9ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGZpcnN0V2Vlay5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWsuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDMuc3RhcnRPZldlZWspKGZpcnN0V2Vlaywgb3B0aW9ucyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mWWVhciA9IHN0YXJ0T2ZZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB5ZWFyIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZlllYXIobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwMCkpXG4gKiAvLz0+IFdlZCBKYW4gMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mWWVhcihkYXRlKSB7XG4gIGNvbnN0IGNsZWFuRGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgX2RhdGUuc2V0RnVsbFllYXIoY2xlYW5EYXRlLmdldEZ1bGxZZWFyKCksIDAsIDEpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN1YkRheXMgPSBzdWJEYXlzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZERheXMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3ViRGF5c1xuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBkYXlzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheXMgc3VidHJhY3RlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCAxMCBkYXlzIGZyb20gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1YkRheXMobmV3IERhdGUoMjAxNCwgOCwgMSksIDEwKVxuICogLy89PiBGcmkgQXVnIDIyIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3ViRGF5cyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkRGF5cykoZGF0ZSwgLWFtb3VudCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3ViTW9udGhzID0gc3ViTW9udGhzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZE1vbnRocy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdWJNb250aHNcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtb250aHMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1vbnRocyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgbW9udGhzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIG1vbnRocyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDUgbW9udGhzIGZyb20gMSBGZWJydWFyeSAyMDE1OlxuICogY29uc3QgcmVzdWx0ID0gc3ViTW9udGhzKG5ldyBEYXRlKDIwMTUsIDEsIDEpLCA1KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3ViTW9udGhzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRNb250aHMpKGRhdGUsIC1hbW91bnQpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN1YlF1YXJ0ZXJzID0gc3ViUXVhcnRlcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkUXVhcnRlcnMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3ViUXVhcnRlcnNcbiAqIEBjYXRlZ29yeSBRdWFydGVyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXIgcXVhcnRlcnMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXIgcXVhcnRlcnMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHF1YXJ0ZXJzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHF1YXJ0ZXJzIHN1YnRyYWN0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgMyBxdWFydGVycyBmcm9tIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJRdWFydGVycyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMylcbiAqIC8vPT4gU3VuIERlYyAwMSAyMDEzIDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN1YlF1YXJ0ZXJzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRRdWFydGVycykoZGF0ZSwgLWFtb3VudCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3ViV2Vla3MgPSBzdWJXZWVrcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRXZWVrcy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdWJXZWVrc1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2Vla3MgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdlZWtzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiB3ZWVrcyB0byBiZSBzdWJ0cmFjdGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSB3ZWVrcyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDQgd2Vla3MgZnJvbSAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc3ViV2Vla3MobmV3IERhdGUoMjAxNCwgOCwgMSksIDQpXG4gKiAvLz0+IE1vbiBBdWcgMDQgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdWJXZWVrcyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkV2Vla3MpKGRhdGUsIC1hbW91bnQpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN1YlllYXJzID0gc3ViWWVhcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkWWVhcnMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3ViWWVhcnNcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXJzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFycyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgeWVhcnMgdG8gYmUgc3VidHJhY3RlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgeWVhcnMgc3VidHJhY3RlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCA1IHllYXJzIGZyb20gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1YlllYXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA1KVxuICogLy89PiBUdWUgU2VwIDAxIDIwMDkgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3ViWWVhcnMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZFllYXJzKShkYXRlLCAtYW1vdW50KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy50b0RhdGUgPSB0b0RhdGU7XG5cbi8qKlxuICogQG5hbWUgdG9EYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdHMgY2xvbmUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgbnVtYmVyLCBpdCBpcyB0cmVhdGVkIGFzIGEgdGltZXN0YW1wLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBub25lIG9mIHRoZSBhYm92ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBhcmd1bWVudCAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ2xvbmUgdGhlIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUobmV3IERhdGUoMjAxNCwgMSwgMTEsIDExLCAzMCwgMzApKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCB0aGUgdGltZXN0YW1wIHRvIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUoMTM5MjA5ODQzMDAwMClcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKi9cbmZ1bmN0aW9uIHRvRGF0ZShhcmd1bWVudCkge1xuICBjb25zdCBhcmdTdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnQpO1xuXG4gIC8vIENsb25lIHRoZSBkYXRlXG4gIGlmIChcbiAgICBhcmd1bWVudCBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAodHlwZW9mIGFyZ3VtZW50ID09PSBcIm9iamVjdFwiICYmIGFyZ1N0ciA9PT0gXCJbb2JqZWN0IERhdGVdXCIpXG4gICkge1xuICAgIC8vIFByZXZlbnQgdGhlIGRhdGUgdG8gbG9zZSB0aGUgbWlsbGlzZWNvbmRzIHdoZW4gcGFzc2VkIHRvIG5ldyBEYXRlKCkgaW4gSUUxMFxuICAgIHJldHVybiBuZXcgYXJndW1lbnQuY29uc3RydWN0b3IoK2FyZ3VtZW50KTtcbiAgfSBlbHNlIGlmIChcbiAgICB0eXBlb2YgYXJndW1lbnQgPT09IFwibnVtYmVyXCIgfHxcbiAgICBhcmdTdHIgPT09IFwiW29iamVjdCBOdW1iZXJdXCIgfHxcbiAgICB0eXBlb2YgYXJndW1lbnQgPT09IFwic3RyaW5nXCIgfHxcbiAgICBhcmdTdHIgPT09IFwiW29iamVjdCBTdHJpbmddXCJcbiAgKSB7XG4gICAgLy8gVE9ETzogQ2FuIHdlIGdldCByaWQgb2YgYXM/XG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUT0RPOiBDYW4gd2UgZ2V0IHJpZCBvZiBhcz9cbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnRyYW5zcG9zZSA9IHRyYW5zcG9zZTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHRyYW5zcG9zZVxuICogQGNhdGVnb3J5IEdlbmVyaWMgSGVscGVyc1xuICogQHN1bW1hcnkgVHJhbnNwb3NlIHRoZSBkYXRlIHRvIHRoZSBnaXZlbiBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBmdW5jdGlvbiB0cmFuc3Bvc2VzIHRoZSBkYXRlIHRvIHRoZSBnaXZlbiBjb25zdHJ1Y3Rvci4gSXQgaGVscHMgeW91XG4gKiB0byB0cmFuc3Bvc2UgdGhlIGRhdGUgaW4gdGhlIHN5c3RlbSB0aW1lIHpvbmUgdG8gc2F5IGBVVENEYXRlYCBvciBhbnkgb3RoZXJcbiAqIGRhdGUgZXh0ZW5zaW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZUlucHV0VHlwZSAtIFRoZSBpbnB1dCBgRGF0ZWAgdHlwZSBkZXJpdmVkIGZyb20gdGhlIHBhc3NlZCBhcmd1bWVudC5cbiAqIEB0eXBlUGFyYW0gRGF0ZU91dHB1dFR5cGUgLSBUaGUgb3V0cHV0IGBEYXRlYCB0eXBlIGRlcml2ZWQgZnJvbSB0aGUgcGFzc2VkIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSBmcm9tRGF0ZSAtIFRoZSBkYXRlIHRvIHVzZSB2YWx1ZXMgZnJvbVxuICogQHBhcmFtIGNvbnN0cnVjdG9yIC0gVGhlIGRhdGUgY29uc3RydWN0b3IgdG8gdXNlXG4gKlxuICogQHJldHVybnMgRGF0ZSB0cmFuc3Bvc2VkIHRvIHRoZSBnaXZlbiBjb25zdHJ1Y3RvclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgSnVseSAxMCwgMjAyMiAwMDowMCBpbiBsb2NhbGUgdGltZSB6b25lXG4gKiBjb25zdCBkYXRlID0gbmV3IERhdGUoMjAyMiwgNiwgMTApXG4gKiAvLz0+ICdTdW4gSnVsIDEwIDIwMjIgMDA6MDA6MDAgR01UKzA4MDAgKFNpbmdhcG9yZSBTdGFuZGFyZCBUaW1lKSdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVHJhbnNwb3NlIHRoZSBkYXRlIHRvIEp1bHkgMTAsIDIwMjIgMDA6MDAgaW4gVVRDXG4gKiB0cmFuc3Bvc2UoZGF0ZSwgVVRDRGF0ZSlcbiAqIC8vPT4gJ1N1biBKdWwgMTAgMjAyMiAwMDowMDowMCBHTVQrMDAwMCAoQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUpJ1xuICovXG5mdW5jdGlvbiB0cmFuc3Bvc2UoZnJvbURhdGUsIGNvbnN0cnVjdG9yKSB7XG4gIGNvbnN0IGRhdGUgPVxuICAgIGNvbnN0cnVjdG9yIGluc3RhbmNlb2YgRGF0ZVxuICAgICAgPyAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGNvbnN0cnVjdG9yLCAwKVxuICAgICAgOiBuZXcgY29uc3RydWN0b3IoMCk7XG4gIGRhdGUuc2V0RnVsbFllYXIoXG4gICAgZnJvbURhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICBmcm9tRGF0ZS5nZXRNb250aCgpLFxuICAgIGZyb21EYXRlLmdldERhdGUoKSxcbiAgKTtcbiAgZGF0ZS5zZXRIb3VycyhcbiAgICBmcm9tRGF0ZS5nZXRIb3VycygpLFxuICAgIGZyb21EYXRlLmdldE1pbnV0ZXMoKSxcbiAgICBmcm9tRGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgZnJvbURhdGUuZ2V0TWlsbGlzZWNvbmRzKCksXG4gICk7XG4gIHJldHVybiBkYXRlO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBTY2hlZHVsZXIgPSByZXF1aXJlKCdzY2hlZHVsZXInKTtcblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbnZhciBzdXBwcmVzc1dhcm5pbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHNldFN1cHByZXNzV2FybmluZyhuZXdTdXBwcmVzc1dhcm5pbmcpIHtcbiAge1xuICAgIHN1cHByZXNzV2FybmluZyA9IG5ld1N1cHByZXNzV2FybmluZztcbiAgfVxufSAvLyBJbiBERVYsIGNhbGxzIHRvIGNvbnNvbGUud2FybiBhbmQgY29uc29sZS5lcnJvciBnZXQgcmVwbGFjZWRcbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIGlmICghc3VwcHJlc3NXYXJuaW5nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBpZiAoIXN1cHByZXNzV2FybmluZykge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxudmFyIEZ1bmN0aW9uQ29tcG9uZW50ID0gMDtcbnZhciBDbGFzc0NvbXBvbmVudCA9IDE7XG52YXIgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCA9IDI7IC8vIEJlZm9yZSB3ZSBrbm93IHdoZXRoZXIgaXQgaXMgZnVuY3Rpb24gb3IgY2xhc3NcblxudmFyIEhvc3RSb290ID0gMzsgLy8gUm9vdCBvZiBhIGhvc3QgdHJlZS4gQ291bGQgYmUgbmVzdGVkIGluc2lkZSBhbm90aGVyIG5vZGUuXG5cbnZhciBIb3N0UG9ydGFsID0gNDsgLy8gQSBzdWJ0cmVlLiBDb3VsZCBiZSBhbiBlbnRyeSBwb2ludCB0byBhIGRpZmZlcmVudCByZW5kZXJlci5cblxudmFyIEhvc3RDb21wb25lbnQgPSA1O1xudmFyIEhvc3RUZXh0ID0gNjtcbnZhciBGcmFnbWVudCA9IDc7XG52YXIgTW9kZSA9IDg7XG52YXIgQ29udGV4dENvbnN1bWVyID0gOTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSAxMDtcbnZhciBGb3J3YXJkUmVmID0gMTE7XG52YXIgUHJvZmlsZXIgPSAxMjtcbnZhciBTdXNwZW5zZUNvbXBvbmVudCA9IDEzO1xudmFyIE1lbW9Db21wb25lbnQgPSAxNDtcbnZhciBTaW1wbGVNZW1vQ29tcG9uZW50ID0gMTU7XG52YXIgTGF6eUNvbXBvbmVudCA9IDE2O1xudmFyIEluY29tcGxldGVDbGFzc0NvbXBvbmVudCA9IDE3O1xudmFyIERlaHlkcmF0ZWRGcmFnbWVudCA9IDE4O1xudmFyIFN1c3BlbnNlTGlzdENvbXBvbmVudCA9IDE5O1xudmFyIFNjb3BlQ29tcG9uZW50ID0gMjE7XG52YXIgT2Zmc2NyZWVuQ29tcG9uZW50ID0gMjI7XG52YXIgTGVnYWN5SGlkZGVuQ29tcG9uZW50ID0gMjM7XG52YXIgQ2FjaGVDb21wb25lbnQgPSAyNDtcbnZhciBUcmFjaW5nTWFya2VyQ29tcG9uZW50ID0gMjU7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVDbGllbnRSZW5kZXJGYWxsYmFja09uVGV4dE1pc21hdGNoID0gdHJ1ZTsgLy8gVE9ETzogTmVlZCB0byByZXZpZXcgdGhpcyBjb2RlIG9uZSBtb3JlIHRpbWUgYmVmb3JlIGxhbmRpbmdcbi8vIHRoZSByZWFjdC1yZWNvbmNpbGVyIHBhY2thZ2UuXG5cbnZhciBlbmFibGVOZXdSZWNvbmNpbGVyID0gZmFsc2U7IC8vIFN1cHBvcnQgbGVnYWN5IFByaW1lciBzdXBwb3J0IG9uIGludGVybmFsIEZCIHd3d1xuXG52YXIgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiA9IGZhbHNlOyAvLyBGQi1vbmx5IHVzYWdlLiBUaGUgbmV3IEFQSSBoYXMgZGlmZmVyZW50IHNlbWFudGljcy5cblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcblxudmFyIGVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2sgPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpenpcbi8vIFJlYWN0IERPTSBDaG9wcGluZyBCbG9ja1xuLy9cbi8vIFNpbWlsYXIgdG8gbWFpbiBDaG9wcGluZyBCbG9jayBidXQgb25seSBmbGFncyByZWxhdGVkIHRvIFJlYWN0IERPTS4gVGhlc2UgYXJlXG4vLyBncm91cGVkIGJlY2F1c2Ugd2Ugd2lsbCBsaWtlbHkgYmF0Y2ggYWxsIG9mIHRoZW0gaW50byBhIHNpbmdsZSBtYWpvciByZWxlYXNlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERpc2FibGUgc3VwcG9ydCBmb3IgY29tbWVudCBub2RlcyBhcyBSZWFjdCBET00gY29udGFpbmVycy4gQWxyZWFkeSBkaXNhYmxlZFxuLy8gaW4gb3BlbiBzb3VyY2UsIGJ1dCB3d3cgY29kZWJhc2Ugc3RpbGwgcmVsaWVzIG9uIGl0LiBOZWVkIHRvIHJlbW92ZS5cblxudmFyIGRpc2FibGVDb21tZW50c0FzRE9NQ29udGFpbmVycyA9IHRydWU7IC8vIERpc2FibGUgamF2YXNjcmlwdDogVVJMIHN0cmluZ3MgaW4gaHJlZiBmb3IgWFNTIHByb3RlY3Rpb24uXG4vLyBhbmQgY2xpZW50IHJlbmRlcmluZywgbW9zdGx5IHRvIGFsbG93IEpTWCBhdHRyaWJ1dGVzIHRvIGFwcGx5IHRvIHRoZSBjdXN0b21cbi8vIGVsZW1lbnQncyBvYmplY3QgcHJvcGVydGllcyBpbnN0ZWFkIG9mIG9ubHkgSFRNTCBhdHRyaWJ1dGVzLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTM0N1xuXG52YXIgZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCA9IGZhbHNlOyAvLyBEaXNhYmxlcyBjaGlsZHJlbiBmb3IgPHRleHRhcmVhPiBlbGVtZW50c1xudmFyIHdhcm5BYm91dFN0cmluZ1JlZnMgPSB0cnVlOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGVidWdnaW5nIGFuZCBEZXZUb29sc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFkZHMgdXNlciB0aW1pbmcgbWFya3MgZm9yIGUuZy4gc3RhdGUgdXBkYXRlcywgc3VzcGVuc2UsIGFuZCB3b3JrIGxvb3Agc3R1ZmYsXG4vLyBmb3IgYW4gZXhwZXJpbWVudGFsIHRpbWVsaW5lIHRvb2wuXG5cbnZhciBlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIgPSB0cnVlOyAvLyBIZWxwcyBpZGVudGlmeSBzaWRlIGVmZmVjdHMgaW4gcmVuZGVyLXBoYXNlIGxpZmVjeWNsZSBob29rcyBhbmQgc2V0U3RhdGVcblxudmFyIGVuYWJsZVByb2ZpbGVyVGltZXIgPSB0cnVlOyAvLyBSZWNvcmQgZHVyYXRpb25zIGZvciBjb21taXQgYW5kIHBhc3NpdmUgZWZmZWN0cyBwaGFzZXMuXG5cbnZhciBlbmFibGVQcm9maWxlckNvbW1pdEhvb2tzID0gdHJ1ZTsgLy8gUGhhc2UgcGFyYW0gcGFzc2VkIHRvIG9uUmVuZGVyIGNhbGxiYWNrIGRpZmZlcmVudGlhdGVzIGJldHdlZW4gYW4gXCJ1cGRhdGVcIiBhbmQgYSBcImNhc2NhZGluZy11cGRhdGVcIi5cblxudmFyIGFsbE5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoKTtcbi8qKlxuICogTWFwcGluZyBmcm9tIHJlZ2lzdHJhdGlvbiBuYW1lIHRvIGV2ZW50IG5hbWVcbiAqL1xuXG5cbnZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0ge307XG4vKipcbiAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcmVnaXN0cmF0aW9uIG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLFxuICogdXNlZCB0byB3YXJuIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgZXZlbnQgaGFuZGxlcnMuIEF2YWlsYWJsZVxuICogb25seSBpbiB0cnVlLlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuXG52YXIgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9ICB7fSA7IC8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8gb25seSB1c2UgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyBpbiB0cnVlXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUgKyAnQ2FwdHVyZScsIGRlcGVuZGVuY2llcyk7XG59XG5mdW5jdGlvbiByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICB7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0pIHtcbiAgICAgIGVycm9yKCdFdmVudFJlZ2lzdHJ5OiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSAnICsgJ3JlZ2lzdHJhdGlvbiBuYW1lLCBgJXNgLicsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0gPSBkZXBlbmRlbmNpZXM7XG5cbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHJlZ2lzdHJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA9IHJlZ2lzdHJhdGlvbk5hbWU7XG5cbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uRG91YmxlQ2xpY2snKSB7XG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLm9uZGJsY2xpY2sgPSByZWdpc3RyYXRpb25OYW1lO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYWxsTmF0aXZlRXZlbnRzLmFkZChkZXBlbmRlbmNpZXNbaV0pO1xuICB9XG59XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnKTtcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIGF0dHJpYnV0ZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBhdHRyaWJ1dGVOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tQcm9wU3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgcHJvcCBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBwcm9wTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgQ1NTIHByb3BlcnR5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrSHRtbFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIEhUTUwgbWFya3VwIHVzZXMgYSB2YWx1ZSBvZiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ0Zvcm0gZmllbGQgdmFsdWVzICh2YWx1ZSwgY2hlY2tlZCwgZGVmYXVsdFZhbHVlLCBvciBkZWZhdWx0Q2hlY2tlZCBwcm9wcyknICsgJyBtdXN0IGJlIHN0cmluZ3MsIG5vdCAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbi8vIEEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuLy8gSXQgaXMgaGFuZGxlZCBieSBSZWFjdCBzZXBhcmF0ZWx5IGFuZCBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxudmFyIFJFU0VSVkVEID0gMDsgLy8gQSBzaW1wbGUgc3RyaW5nIGF0dHJpYnV0ZS5cbi8vIEF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpbHRlciBhcmUgcHJlc3VtZWQgdG8gaGF2ZSB0aGlzIHR5cGUuXG5cbnZhciBTVFJJTkcgPSAxOyAvLyBBIHN0cmluZyBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGJvb2xlYW5zIGluIFJlYWN0LiBJbiBIVE1MLCB0aGVzZSBhcmUgY2FsbGVkXG4vLyBcImVudW1lcmF0ZWRcIiBhdHRyaWJ1dGVzIHdpdGggXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIiBhcyBwb3NzaWJsZSB2YWx1ZXMuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcInRydWVcIiBzdHJpbmcuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJmYWxzZVwiIHN0cmluZy5cblxudmFyIEJPT0xFQU5JU0hfU1RSSU5HID0gMjsgLy8gQSByZWFsIGJvb2xlYW4gYXR0cmlidXRlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG5cbnZhciBCT09MRUFOID0gMzsgLy8gQW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG4vLyBGb3IgYW55IG90aGVyIHZhbHVlLCBzaG91bGQgYmUgcHJlc2VudCB3aXRoIHRoYXQgdmFsdWUuXG5cbnZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBOVU1FUklDID0gNTsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmUgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgUE9TSVRJVkVfTlVNRVJJQyA9IDY7XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSID0gXCI6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXCI7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxudmFyIEFUVFJJQlVURV9OQU1FX0NIQVIgPSBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgXCJcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MFwiO1xudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbnZhciB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGlzQXR0cmlidXRlTmFtZVNhZmUoYXR0cmlidXRlTmFtZSkge1xuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWC50ZXN0KGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuXG4gIHtcbiAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgbmFtZTogYCVzYCcsIGF0dHJpYnV0ZU5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQ7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAobmFtZS5sZW5ndGggPiAyICYmIChuYW1lWzBdID09PSAnbycgfHwgbmFtZVswXSA9PT0gJ08nKSAmJiAobmFtZVsxXSA9PT0gJ24nIHx8IG5hbWVbMV0gPT09ICdOJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdmdW5jdGlvbic6IC8vICRGbG93SXNzdWUgc3ltYm9sIGlzIHBlcmZlY3RseSB2YWxpZCBoZXJlXG5cbiAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiAhcHJvcGVydHlJbmZvLmFjY2VwdHNCb29sZWFucztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcHJlZml4ID0gbmFtZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsIDUpO1xuICAgICAgICAgIHJldHVybiBwcmVmaXggIT09ICdkYXRhLScgJiYgcHJlZml4ICE9PSAnYXJpYS0nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuXG4gICAgc3dpdGNoIChwcm9wZXJ0eUluZm8udHlwZSkge1xuICAgICAgY2FzZSBCT09MRUFOOlxuICAgICAgICByZXR1cm4gIXZhbHVlO1xuXG4gICAgICBjYXNlIE9WRVJMT0FERURfQk9PTEVBTjpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTtcblxuICAgICAgY2FzZSBOVU1FUklDOlxuICAgICAgICByZXR1cm4gaXNOYU4odmFsdWUpO1xuXG4gICAgICBjYXNlIFBPU0lUSVZFX05VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSkgfHwgdmFsdWUgPCAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldFByb3BlcnR5SW5mbyhuYW1lKSB7XG4gIHJldHVybiBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gcHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCB0eXBlLCBtdXN0VXNlUHJvcGVydHksIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWVzcGFjZSwgc2FuaXRpemVVUkwsIHJlbW92ZUVtcHR5U3RyaW5nKSB7XG4gIHRoaXMuYWNjZXB0c0Jvb2xlYW5zID0gdHlwZSA9PT0gQk9PTEVBTklTSF9TVFJJTkcgfHwgdHlwZSA9PT0gQk9PTEVBTiB8fCB0eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU47XG4gIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gIHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlID0gYXR0cmlidXRlTmFtZXNwYWNlO1xuICB0aGlzLm11c3RVc2VQcm9wZXJ0eSA9IG11c3RVc2VQcm9wZXJ0eTtcbiAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBuYW1lO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnNhbml0aXplVVJMID0gc2FuaXRpemVVUkw7XG4gIHRoaXMucmVtb3ZlRW1wdHlTdHJpbmcgPSByZW1vdmVFbXB0eVN0cmluZztcbn0gLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGlzIGxpc3QsIGJlIHN1cmUgdG8gYWxzbyBhZGQgdGhlbSB0b1xuLy8gdGhlIGBwb3NzaWJsZVN0YW5kYXJkTmFtZXNgIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3Rcbi8vIG5hbWUgd2FybmluZ3MuXG5cblxudmFyIHByb3BlcnRpZXMgPSB7fTsgLy8gVGhlc2UgcHJvcHMgYXJlIHJlc2VydmVkIGJ5IFJlYWN0LiBUaGV5IHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG5cbnZhciByZXNlcnZlZFByb3BzID0gWydjaGlsZHJlbicsICdkYW5nZXJvdXNseVNldElubmVySFRNTCcsIC8vIFRPRE86IFRoaXMgcHJldmVudHMgdGhlIGFzc2lnbm1lbnQgb2YgZGVmYXVsdFZhbHVlIHRvIHJlZ3VsYXJcbi8vIGVsZW1lbnRzIChub3QganVzdCBpbnB1dHMpLiBOb3cgdGhhdCBSZWFjdERPTUlucHV0IGFzc2lnbnMgdG8gdGhlXG4vLyBkZWZhdWx0VmFsdWUgcHJvcGVydHkgLS0gZG8gd2UgbmVlZCB0aGlzP1xuJ2RlZmF1bHRWYWx1ZScsICdkZWZhdWx0Q2hlY2tlZCcsICdpbm5lckhUTUwnLCAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJywgJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZycsICdzdHlsZSddO1xuXG5yZXNlcnZlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUkVTRVJWRUQsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBBIGZldyBSZWFjdCBzdHJpbmcgYXR0cmlidXRlcyBoYXZlIGEgZGlmZmVyZW50IG5hbWUuXG4vLyBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIFJlYWN0IHByb3AgbmFtZXMgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lcy5cblxuW1snYWNjZXB0Q2hhcnNldCcsICdhY2NlcHQtY2hhcnNldCddLCBbJ2NsYXNzTmFtZScsICdjbGFzcyddLCBbJ2h0bWxGb3InLCAnZm9yJ10sIFsnaHR0cEVxdWl2JywgJ2h0dHAtZXF1aXYnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWZbMF0sXG4gICAgICBhdHRyaWJ1dGVOYW1lID0gX3JlZlsxXTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIFwiZW51bWVyYXRlZFwiIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cblxuWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG4vLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG5cblsnYXV0b1JldmVyc2UnLCAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICdmb2N1c2FibGUnLCAncHJlc2VydmVBbHBoYSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBib29sZWFuIGF0dHJpYnV0ZXMuXG5cblsnYWxsb3dGdWxsU2NyZWVuJywgJ2FzeW5jJywgLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTVxuLy8gb24gdGhlIGNsaWVudCBzaWRlIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGFyZSBpbmNvbnNpc3RlbnQuIEluc3RlYWQgd2UgY2FsbCBmb2N1cygpLlxuJ2F1dG9Gb2N1cycsICdhdXRvUGxheScsICdjb250cm9scycsICdkZWZhdWx0JywgJ2RlZmVyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJywgJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsICdmb3JtTm9WYWxpZGF0ZScsICdoaWRkZW4nLCAnbG9vcCcsICdub01vZHVsZScsICdub1ZhbGlkYXRlJywgJ29wZW4nLCAncGxheXNJbmxpbmUnLCAncmVhZE9ubHknLCAncmVxdWlyZWQnLCAncmV2ZXJzZWQnLCAnc2NvcGVkJywgJ3NlYW1sZXNzJywgLy8gTWljcm9kYXRhXG4naXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllc1xuLy8gcmF0aGVyIHRoYW4gYXR0cmlidXRlcy4gVGhlc2UgYXJlIGFsbCBib29sZWFucy5cblxuWydjaGVja2VkJywgLy8gTm90ZTogYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAgaXNcbi8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAuIFdlIGhhdmUgc3BlY2lhbCBsb2dpYyBmb3IgaGFuZGxpbmcgdGhpcy5cbidtdWx0aXBsZScsICdtdXRlZCcsICdzZWxlY3RlZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgdHJ1ZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFyZSBcIm92ZXJsb2FkZWQgYm9vbGVhbnNcIjogdGhleSBiZWhhdmUgbGlrZVxuLy8gYm9vbGVhbnMsIGJ1dCBjYW4gYWxzbyBhY2NlcHQgYSBzdHJpbmcgdmFsdWUuXG5cblsnY2FwdHVyZScsICdkb3dubG9hZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtYmVycy5cblxuWydjb2xzJywgJ3Jvd3MnLCAnc2l6ZScsICdzcGFuJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBQT1NJVElWRV9OVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgbnVtYmVycy5cblxuWydyb3dTcGFuJywgJ3N0YXJ0J10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBOVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pO1xudmFyIENBTUVMSVpFID0gL1tcXC1cXDpdKFthLXpdKS9nO1xuXG52YXIgY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICByZXR1cm4gdG9rZW5bMV0udG9VcHBlckNhc2UoKTtcbn07IC8vIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCBTVkcgYXR0cmlidXRlcyB0aGF0IG5lZWQgc3BlY2lhbCBjYXNpbmcsIG5hbWVzcGFjaW5nLFxuLy8gb3IgYm9vbGVhbiB2YWx1ZSBhc3NpZ25tZW50LiBSZWd1bGFyIGF0dHJpYnV0ZXMgdGhhdCBqdXN0IGFjY2VwdCBzdHJpbmdzXG4vLyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcmUgb21pdHRlZCwganVzdCBsaWtlIGluIHRoZSBIVE1MIGF0dHJpYnV0ZSBmaWx0ZXIuXG4vLyBTb21lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGhhcmQgdG8gZmluZC4gVGhpcyBsaXN0IHdhcyBjcmVhdGVkIGJ5XG4vLyBzY3JhcGluZyB0aGUgTUROIGRvY3VtZW50YXRpb24uXG5cblxuWydhY2NlbnQtaGVpZ2h0JywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhcmFiaWMtZm9ybScsICdiYXNlbGluZS1zaGlmdCcsICdjYXAtaGVpZ2h0JywgJ2NsaXAtcGF0aCcsICdjbGlwLXJ1bGUnLCAnY29sb3ItaW50ZXJwb2xhdGlvbicsICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLCAnY29sb3ItcHJvZmlsZScsICdjb2xvci1yZW5kZXJpbmcnLCAnZG9taW5hbnQtYmFzZWxpbmUnLCAnZW5hYmxlLWJhY2tncm91bmQnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdnbHlwaC1uYW1lJywgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLCAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLCAnaG9yaXotYWR2LXgnLCAnaG9yaXotb3JpZ2luLXgnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2xldHRlci1zcGFjaW5nJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnb3ZlcmxpbmUtcG9zaXRpb24nLCAnb3ZlcmxpbmUtdGhpY2tuZXNzJywgJ3BhaW50LW9yZGVyJywgJ3Bhbm9zZS0xJywgJ3BvaW50ZXItZXZlbnRzJywgJ3JlbmRlcmluZy1pbnRlbnQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlLXdpZHRoJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd1bmRlcmxpbmUtcG9zaXRpb24nLCAndW5kZXJsaW5lLXRoaWNrbmVzcycsICd1bmljb2RlLWJpZGknLCAndW5pY29kZS1yYW5nZScsICd1bml0cy1wZXItZW0nLCAndi1hbHBoYWJldGljJywgJ3YtaGFuZ2luZycsICd2LWlkZW9ncmFwaGljJywgJ3YtbWF0aGVtYXRpY2FsJywgJ3ZlY3Rvci1lZmZlY3QnLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd29yZC1zcGFjaW5nJywgJ3dyaXRpbmctbW9kZScsICd4bWxuczp4bGluaycsICd4LWhlaWdodCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhsaW5rIG5hbWVzcGFjZS5cblxuWyd4bGluazphY3R1YXRlJywgJ3hsaW5rOmFyY3JvbGUnLCAneGxpbms6cm9sZScsICd4bGluazpzaG93JywgJ3hsaW5rOnRpdGxlJywgJ3hsaW5rOnR5cGUnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeG1sIG5hbWVzcGFjZS5cblxuWyd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZSBleGlzdHMgYm90aCBpbiBIVE1MIGFuZCBTVkcuXG4vLyBUaGUgYXR0cmlidXRlIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUgaW4gU1ZHIHNvIHdlIGNhbid0IGp1c3QgdXNlXG4vLyB0aGUgUmVhY3QgbmFtZSBsaWtlIHdlIGRvIGZvciBhdHRyaWJ1dGVzIHRoYXQgZXhpc3Qgb25seSBpbiBIVE1MLlxuXG5bJ3RhYkluZGV4JywgJ2Nyb3NzT3JpZ2luJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICBwcm9wZXJ0aWVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChhdHRyaWJ1dGVOYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZXMgYWNjZXB0IFVSTHMuIFRoZXNlIG11c3Qgbm90IGFsbG93IGphdmFzY3JpcHQ6IFVSTFMuXG4vLyBUaGVzZSB3aWxsIGFsc28gbmVlZCB0byBhY2NlcHQgVHJ1c3RlZCBUeXBlcyBvYmplY3QgaW4gdGhlIGZ1dHVyZS5cblxudmFyIHhsaW5rSHJlZiA9ICd4bGlua0hyZWYnO1xucHJvcGVydGllc1t4bGlua0hyZWZdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZCgneGxpbmtIcmVmJywgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4neGxpbms6aHJlZicsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbmZhbHNlKTtcblsnc3JjJywgJ2hyZWYnLCAnYWN0aW9uJywgJ2Zvcm1BY3Rpb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIHRydWUsIC8vIHNhbml0aXplVVJMXG4gIHRydWUpO1xufSk7XG5cbi8vIGFuZCBhbnkgbmV3bGluZSBvciB0YWIgYXJlIGZpbHRlcmVkIG91dCBhcyBpZiB0aGV5J3JlIG5vdCBwYXJ0IG9mIHRoZSBVUkwuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1wYXJzaW5nXG4vLyBUYWIgb3IgbmV3bGluZSBhcmUgZGVmaW5lZCBhcyBcXHJcXG5cXHQ6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktdGFiLW9yLW5ld2xpbmVcbi8vIEEgQzAgY29udHJvbCBpcyBhIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlIFxcdTAwMDAgTlVMTCB0byBcXHUwMDFGXG4vLyBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FLCBpbmNsdXNpdmU6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYzAtY29udHJvbC1vci1zcGFjZVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbnZhciBpc0phdmFTY3JpcHRQcm90b2NvbCA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyXFxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSpcXDovaTtcbnZhciBkaWRXYXJuID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHNhbml0aXplVVJMKHVybCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuICYmIGlzSmF2YVNjcmlwdFByb3RvY29sLnRlc3QodXJsKSkge1xuICAgICAgZGlkV2FybiA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdBIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0IHdpbGwgYmxvY2sgamF2YXNjcmlwdDogVVJMcyBhcyBhIHNlY3VyaXR5IHByZWNhdXRpb24uICcgKyAnVXNlIGV2ZW50IGhhbmRsZXJzIGluc3RlYWQgaWYgeW91IGNhbi4gSWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgdW5zYWZlIEhUTUwgdHJ5ICcgKyAndXNpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgaW5zdGVhZC4gUmVhY3Qgd2FzIHBhc3NlZCAlcy4nLCBKU09OLnN0cmluZ2lmeSh1cmwpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgXCJleHBlY3RlZFwiIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLlxuICogU29tZSBwcm9wZXJ0aWVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbykge1xuICB7XG4gICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuICAgICAgcmV0dXJuIG5vZGVbcHJvcGVydHlOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBjaGVjayBwcm90ZWN0cyBtdWx0aXBsZSB1c2VzIG9mIGBleHBlY3RlZGAsIHdoaWNoIGlzIHdoeSB0aGVcbiAgICAgIC8vIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uIHJ1bGUgaXMgZGlzYWJsZWQgaW4gc2V2ZXJhbCBzcG90c1xuICAgICAgLy8gYmVsb3cuXG4gICAgICB7XG4gICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oZXhwZWN0ZWQsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIHByb3BlcnR5SW5mby5zYW5pdGl6ZVVSTCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGZ1bGx5IGRpc2FibGVkIGphdmFzY3JpcHQ6IFVSTHMsIGFuZCBpZlxuICAgICAgICAvLyB0aGUgaHlkcmF0aW9uIGlzIHN1Y2Nlc3NmdWwgb2YgYSBqYXZhc2NyaXB0OiBVUkwsIHdlXG4gICAgICAgIC8vIHN0aWxsIHdhbnQgdG8gd2FybiBvbiB0aGUgY2xpZW50LlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgICAgc2FuaXRpemVVUkwoJycgKyBleHBlY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7XG4gICAgICB2YXIgc3RyaW5nVmFsdWUgPSBudWxsO1xuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTikge1xuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2UgaGFkIGFuIGF0dHJpYnV0ZSBidXQgc2hvdWxkbid0IGhhdmUgaGFkIG9uZSwgc28gcmVhZCBpdFxuICAgICAgICAgIC8vIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGJvb2xlYW4sIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHZhbHVlIGlzXG4gICAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBleHBlY3RlZC5cbiAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgIH0gLy8gRXZlbiBpZiB0aGlzIHByb3BlcnR5IHVzZXMgYSBuYW1lc3BhY2Ugd2UgdXNlIGdldEF0dHJpYnV0ZVxuICAgICAgICAvLyBiZWNhdXNlIHdlIGFzc3VtZSBpdHMgbmFtZXNwYWNlZCBuYW1lIGlzIHRoZSBzYW1lIGFzIG91ciBjb25maWcuXG4gICAgICAgIC8vIFRvIHVzZSBnZXRBdHRyaWJ1dGVOUyB3ZSBuZWVkIHRoZSBsb2NhbCBuYW1lIHdoaWNoIHdlIGRvbid0IGhhdmVcbiAgICAgICAgLy8gaW4gb3VyIGNvbmZpZyBhdG0uXG5cblxuICAgICAgICBzdHJpbmdWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUgPT09IG51bGwgPyBleHBlY3RlZCA6IHN0cmluZ1ZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIGF0dHJpYnV0ZSBvbiBhIG5vZGUuIE9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICogVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLiBTb21lXG4gKiBhdHRyaWJ1dGVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIHtcbiAgICBpZiAoIWlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG5cbiAgICB7XG4gICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKGV4cGVjdGVkLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUsIHZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpO1xuXG4gIGlmIChzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHZhbHVlID0gbnVsbDtcbiAgfVxuXG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAge1xuICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTtcblxuICBpZiAobXVzdFVzZVByb3BlcnR5KSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhciB0eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLlxuXG5cbiAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgaWYgKF90eXBlID09PSBCT09MRUFOIHx8IF90eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4gJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIElmIGF0dHJpYnV0ZSB0eXBlIGlzIGJvb2xlYW4sIHdlIGtub3cgZm9yIHN1cmUgaXQgd29uJ3QgYmUgYW4gZXhlY3V0aW9uIHNpbmtcbiAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLlxuICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgc2FuaXRpemVVUkwoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGVOYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKTtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbnZhciBSRUFDVF9DQUNIRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY2FjaGUnKTtcbnZhciBSRUFDVF9UUkFDSU5HX01BUktFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QudHJhY2luZ19tYXJrZXInKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTsgLy8gSWYgb3VyIGNvbXBvbmVudCBmcmFtZSBpcyBsYWJlbGVkIFwiPGFub255bW91cz5cIlxuICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCBcImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW4gdG8gbWFrZSB0aGUgc3RhY2sgbW9yZSByZWFkYWJsZS5cblxuXG4gICAgICAgICAgICAgICAgaWYgKGZuLmRpc3BsYXlOYW1lICYmIF9mcmFtZS5pbmNsdWRlcygnPGFub255bW91cz4nKSkge1xuICAgICAgICAgICAgICAgICAgX2ZyYW1lID0gX2ZyYW1lLnJlcGxhY2UoJzxhbm9ueW1vdXM+JywgZm4uZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShjdG9yLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGN0b3IsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUZpYmVyKGZpYmVyKSB7XG4gIHZhciBvd25lciA9ICBmaWJlci5fZGVidWdPd25lciA/IGZpYmVyLl9kZWJ1Z093bmVyLnR5cGUgOiBudWxsIDtcbiAgdmFyIHNvdXJjZSA9ICBmaWJlci5fZGVidWdTb3VyY2UgO1xuXG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdMYXp5Jyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZS5yZW5kZXIpO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUNsYXNzQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZCh3b3JrSW5Qcm9ncmVzcykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIGRvIHtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVGaWJlcihub2RlKTtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlKTtcblxuICAgIHJldHVybiBpbmZvO1xuICB9IGNhdGNoICh4KSB7XG4gICAgcmV0dXJuICdcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiAnICsgeC5tZXNzYWdlICsgJ1xcbicgKyB4LnN0YWNrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lJDEob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHNoYXJlZC9nZXRDb21wb25lbnROYW1lRnJvbVR5cGVcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSQxKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB7XG4gIHZhciB0YWcgPSBmaWJlci50YWcsXG4gICAgICB0eXBlID0gZmliZXIudHlwZTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ0NhY2hlJztcblxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lJDEoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZSQxKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgY2FzZSBEZWh5ZHJhdGVkRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0RlaHlkcmF0ZWRGcmFnbWVudCc7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUkMSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIC8vIEhvc3QgY29tcG9uZW50IHR5cGUgaXMgdGhlIGRpc3BsYXkgbmFtZSAoZS5nLiBcImRpdlwiLCBcIlZpZXdcIilcbiAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiAnUm9vdCc7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuICdUZXh0JztcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIC8vIE5hbWUgY29tZXMgZnJvbSB0aGUgdHlwZSBpbiB0aGlzIGNhc2U7IHdlIGRvbid0IGhhdmUgYSB0YWcuXG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgY2FzZSBNb2RlOlxuICAgICAgaWYgKHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUpIHtcbiAgICAgICAgLy8gRG9uJ3QgYmUgbGVzcyBzcGVjaWZpYyB0aGFuIHNoYXJlZC9nZXRDb21wb25lbnROYW1lRnJvbVR5cGVcbiAgICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdNb2RlJztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdPZmZzY3JlZW4nO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU2NvcGUnO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1RyYWNpbmdNYXJrZXInO1xuICAgIC8vIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoaXMgdGFncyBjb21lIGZyb20gdGhlIHVzZXItcHJvdmlkZWQgdHlwZTpcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG52YXIgY3VycmVudCA9IG51bGw7XG52YXIgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IC8vIFNhZmUgYmVjYXVzZSBpZiBjdXJyZW50IGZpYmVyIGV4aXN0cywgd2UgYXJlIHJlY29uY2lsaW5nLFxuICAgIC8vIGFuZCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSB3b3JrLWluLXByb2dyZXNzIHZlcnNpb24uXG5cblxuICAgIHJldHVybiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoY3VycmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRDdXJyZW50RmliZXIoKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG4gICAgY3VycmVudCA9IG51bGw7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0Q3VycmVudEZpYmVyKGZpYmVyKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IGZpYmVyID09PSBudWxsID8gbnVsbCA6IGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXY7XG4gICAgY3VycmVudCA9IGZpYmVyO1xuICAgIGlzUmVuZGVyaW5nID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiBzZXRJc1JlbmRlcmluZyhyZW5kZXJpbmcpIHtcbiAge1xuICAgIGlzUmVuZGVyaW5nID0gcmVuZGVyaW5nO1xuICB9XG59XG5cbi8vIEZsb3cgZG9lcyBub3QgYWxsb3cgc3RyaW5nIGNvbmNhdGVuYXRpb24gb2YgbW9zdCBub24tc3RyaW5nIHR5cGVzLiBUbyB3b3JrXG4vLyBhcm91bmQgdGhpcyBsaW1pdGF0aW9uLCB3ZSB1c2UgYW4gb3BhcXVlIHR5cGUgdGhhdCBjYW4gb25seSBiZSBvYnRhaW5lZCBieVxuLy8gcGFzc2luZyB0aGUgdmFsdWUgdGhyb3VnaCBnZXRUb1N0cmluZ1ZhbHVlIGZpcnN0LlxuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gVGhlIGNvZXJjaW9uIHNhZmV0eSBjaGVjayBpcyBwZXJmb3JtZWQgaW4gZ2V0VG9TdHJpbmdWYWx1ZSgpLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSB7XG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZnVuY3Rpb24sIHN5bWJvbCBhcmUgYXNzaWduZWQgYXMgZW1wdHkgc3RyaW5nc1xuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbnZhciBoYXNSZWFkT25seVZhbHVlID0ge1xuICBidXR0b246IHRydWUsXG4gIGNoZWNrYm94OiB0cnVlLFxuICBpbWFnZTogdHJ1ZSxcbiAgaGlkZGVuOiB0cnVlLFxuICByYWRpbzogdHJ1ZSxcbiAgcmVzZXQ6IHRydWUsXG4gIHN1Ym1pdDogdHJ1ZVxufTtcbmZ1bmN0aW9uIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHModGFnTmFtZSwgcHJvcHMpIHtcbiAge1xuICAgIGlmICghKGhhc1JlYWRPbmx5VmFsdWVbcHJvcHMudHlwZV0gfHwgcHJvcHMub25DaGFuZ2UgfHwgcHJvcHMub25JbnB1dCB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy52YWx1ZSA9PSBudWxsKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuXG4gICAgaWYgKCEocHJvcHMub25DaGFuZ2UgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMuY2hlY2tlZCA9PSBudWxsKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwcm92aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NoZWNrYWJsZShlbGVtKSB7XG4gIHZhciB0eXBlID0gZWxlbS50eXBlO1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhY2tlcihub2RlKSB7XG4gIHJldHVybiBub2RlLl92YWx1ZVRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIGRldGFjaFRyYWNrZXIobm9kZSkge1xuICBub2RlLl92YWx1ZVRyYWNrZXIgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIHZhbHVlID0gJyc7XG5cbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKGlzQ2hlY2thYmxlKG5vZGUpKSB7XG4gICAgdmFsdWUgPSBub2RlLmNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gbm9kZS52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdHJhY2tWYWx1ZU9uTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZUZpZWxkID0gaXNDaGVja2FibGUobm9kZSkgPyAnY2hlY2tlZCcgOiAndmFsdWUnO1xuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHZhbHVlRmllbGQpO1xuXG4gIHtcbiAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24obm9kZVt2YWx1ZUZpZWxkXSk7XG4gIH1cblxuICB2YXIgY3VycmVudFZhbHVlID0gJycgKyBub2RlW3ZhbHVlRmllbGRdOyAvLyBpZiBzb21lb25lIGhhcyBhbHJlYWR5IGRlZmluZWQgYSB2YWx1ZSBvciBTYWZhcmksIHRoZW4gYmFpbFxuICAvLyBhbmQgZG9uJ3QgdHJhY2sgdmFsdWUgd2lsbCBjYXVzZSBvdmVyIHJlcG9ydGluZyBvZiBjaGFuZ2VzLFxuICAvLyBidXQgaXQncyBiZXR0ZXIgdGhlbiBhIGhhcmQgZmFpbHVyZVxuICAvLyAobmVlZGVkIGZvciBjZXJ0YWluIHRlc3RzIHRoYXQgc3B5T24gaW5wdXQgdmFsdWVzIGFuZCBTYWZhcmkpXG5cbiAgaWYgKG5vZGUuaGFzT3duUHJvcGVydHkodmFsdWVGaWVsZCkgfHwgdHlwZW9mIGRlc2NyaXB0b3IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkZXNjcmlwdG9yLmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5zZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXQsXG4gICAgICBzZXQgPSBkZXNjcmlwdG9yLnNldDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0LmNhbGwodGhpcyk7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgIH1cbiAgfSk7IC8vIFdlIGNvdWxkJ3ZlIHBhc3NlZCB0aGlzIHRoZSBmaXJzdCB0aW1lXG4gIC8vIGJ1dCBpdCB0cmlnZ2VycyBhIGJ1ZyBpbiBJRTExIGFuZCBFZGdlIDE0LzE1LlxuICAvLyBDYWxsaW5nIGRlZmluZVByb3BlcnR5KCkgYWdhaW4gc2hvdWxkIGJlIGVxdWl2YWxlbnQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE3NjhcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGVudW1lcmFibGU6IGRlc2NyaXB0b3IuZW51bWVyYWJsZVxuICB9KTtcbiAgdmFyIHRyYWNrZXIgPSB7XG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfSxcbiAgICBzZXRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgfSxcbiAgICBzdG9wVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRldGFjaFRyYWNrZXIobm9kZSk7XG4gICAgICBkZWxldGUgbm9kZVt2YWx1ZUZpZWxkXTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0cmFja2VyO1xufVxuXG5mdW5jdGlvbiB0cmFjayhub2RlKSB7XG4gIGlmIChnZXRUcmFja2VyKG5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRPRE86IE9uY2UgaXQncyBqdXN0IEZpYmVyIHdlIGNhbiBtb3ZlIHRoaXMgdG8gbm9kZS5fd3JhcHBlclN0YXRlXG5cblxuICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpO1xufVxuZnVuY3Rpb24gdXBkYXRlVmFsdWVJZkNoYW5nZWQobm9kZSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIobm9kZSk7IC8vIGlmIHRoZXJlIGlzIG5vIHRyYWNrZXIgYXQgdGhpcyBwb2ludCBpdCdzIHVubGlrZWx5XG4gIC8vIHRoYXQgdHJ5aW5nIGFnYWluIHdpbGwgc3VjY2VlZFxuXG4gIGlmICghdHJhY2tlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGxhc3RWYWx1ZSA9IHRyYWNrZXIuZ2V0VmFsdWUoKTtcbiAgdmFyIG5leHRWYWx1ZSA9IGdldFZhbHVlRnJvbU5vZGUobm9kZSk7XG5cbiAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgdHJhY2tlci5zZXRWYWx1ZShuZXh0VmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykge1xuICBkb2MgPSBkb2MgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkb2MuYWN0aXZlRWxlbWVudCB8fCBkb2MuYm9keTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsXG4gKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnNcbiAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBub3RcbiAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvclxuICogdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYClcbiAqIHdpdGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS5cbiAqXG4gKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1sXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG4gIHZhciBob3N0UHJvcHMgPSBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWRcbiAgfSk7XG4gIHJldHVybiBob3N0UHJvcHM7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlKGVsZW1lbnQsIHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdpbnB1dCcsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5jaGVja2VkICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIGNoZWNrZWQgYW5kIGRlZmF1bHRDaGVja2VkIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSBjaGVja2VkIHByb3AsIG9yIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7XG5cbiAgICAgIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCA/ICcnIDogcHJvcHMuZGVmYXVsdFZhbHVlO1xuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbENoZWNrZWQ6IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA/IHByb3BzLmNoZWNrZWQgOiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCxcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUgIT0gbnVsbCA/IHByb3BzLnZhbHVlIDogZGVmYXVsdFZhbHVlKSxcbiAgICBjb250cm9sbGVkOiBpc0NvbnRyb2xsZWQocHJvcHMpXG4gIH07XG59XG5mdW5jdGlvbiB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuXG4gIGlmIChjaGVja2VkICE9IG51bGwpIHtcbiAgICBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsICdjaGVja2VkJywgY2hlY2tlZCwgZmFsc2UpO1xuICB9XG59XG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgdmFyIGNvbnRyb2xsZWQgPSBpc0NvbnRyb2xsZWQocHJvcHMpO1xuXG4gICAgaWYgKCFub2RlLl93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiBjb250cm9sbGVkICYmICFkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgY2hhbmdpbmcgYW4gdW5jb250cm9sbGVkIGlucHV0IHRvIGJlIGNvbnRyb2xsZWQuICcgKyAnVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IHRoZSB2YWx1ZSBjaGFuZ2luZyBmcm9tIHVuZGVmaW5lZCB0byAnICsgJ2EgZGVmaW5lZCB2YWx1ZSwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmICFjb250cm9sbGVkICYmICFkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgY2hhbmdpbmcgYSBjb250cm9sbGVkIGlucHV0IHRvIGJlIHVuY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gYSBkZWZpbmVkIHRvICcgKyAndW5kZWZpbmVkLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKTtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciB0eXBlID0gcHJvcHMudHlwZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHZhbHVlID09PSAwICYmIG5vZGUudmFsdWUgPT09ICcnIHx8IC8vIFdlIGV4cGxpY2l0bHkgd2FudCB0byBjb2VyY2UgdG8gbnVtYmVyIGhlcmUgaWYgcG9zc2libGUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIG5vZGUudmFsdWUgIT0gdmFsdWUpIHtcbiAgICAgICAgbm9kZS52YWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgbm9kZS52YWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0Jykge1xuICAgIC8vIFN1Ym1pdC9yZXNldCBpbnB1dHMgbmVlZCB0aGUgYXR0cmlidXRlIHJlbW92ZWQgY29tcGxldGVseSB0byBhdm9pZFxuICAgIC8vIGJsYW5rLXRleHQgYnV0dG9ucy5cbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBjb21lcyBmcm9tIGEgY2FzY2FkZSBvZlxuICAgIC8vIHByb3BlcnRpZXM6XG4gICAgLy8gIDEuIFRoZSB2YWx1ZSBSZWFjdCBwcm9wZXJ0eVxuICAgIC8vICAyLiBUaGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDMuIE90aGVyd2lzZSB0aGVyZSBzaG91bGQgYmUgbm8gY2hhbmdlXG4gICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgcHJvcHMudHlwZSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWYWx1ZScpKSB7XG4gICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgcHJvcHMudHlwZSwgZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgaXQgb25seSBjaGFuZ2VzIHdoZW4gaXQgbmVlZHNcbiAgICAvLyB0byBiZSByZW1vdmVkLCBzdWNoIGFzIHRyYW5zaXRpb25pbmcgZnJvbSBhIGNoZWNrYm94IGludG8gYSB0ZXh0IGlucHV0XG4gICAgaWYgKHByb3BzLmNoZWNrZWQgPT0gbnVsbCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFwcm9wcy5kZWZhdWx0Q2hlY2tlZDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIoZWxlbWVudCwgcHJvcHMsIGlzSHlkcmF0aW5nKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgLy8gZnJvbSBiZWluZyBsb3N0IGR1cmluZyBTU1IgaHlkcmF0aW9uLlxuXG4gIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSB8fCBwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG4gICAgdmFyIGlzQnV0dG9uID0gdHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0JzsgLy8gQXZvaWQgc2V0dGluZyB2YWx1ZSBhdHRyaWJ1dGUgb24gc3VibWl0L3Jlc2V0IGlucHV0cyBhcyBpdCBvdmVycmlkZXMgdGhlXG4gICAgLy8gZGVmYXVsdCB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYnJvd3Nlci4gU2VlOiAjMTI4NzJcblxuICAgIGlmIChpc0J1dHRvbiAmJiAocHJvcHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBwcm9wcy52YWx1ZSA9PT0gbnVsbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7IC8vIERvIG5vdCBhc3NpZ24gdmFsdWUgaWYgaXQgaXMgYWxyZWFkeSBzZXQuIFRoaXMgcHJldmVudHMgdXNlciB0ZXh0IGlucHV0XG4gICAgLy8gZnJvbSBiZWluZyBsb3N0IGR1cmluZyBTU1IgaHlkcmF0aW9uLlxuXG4gICAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgICAge1xuICAgICAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIHByb3BlcnR5IHNob3VsZCB1c2VcbiAgICAgICAgLy8gdGhlIHdyYXBwZXJTdGF0ZS5faW5pdGlhbFZhbHVlIHByb3BlcnR5LiBUaGlzIHVzZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgICAgICAvLyAgIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMy4gQW4gZW1wdHkgc3RyaW5nXG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgICAgICBub2RlLnZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIHN5bmNocm9uaXplZCB0byB0aGUgcHJvcGVydHksXG4gICAgICAvLyBzbyB3ZSBhc3NpZ24gZGVmYXVsdFZhbHVlIHRvIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgLy8gYXNzaWdubWVudCBzdGVwIGFib3ZlLlxuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgfVxuICB9IC8vIE5vcm1hbGx5LCB3ZSdkIGp1c3QgZG8gYG5vZGUuY2hlY2tlZCA9IG5vZGUuY2hlY2tlZGAgdXBvbiBpbml0aWFsIG1vdW50LCBsZXNzIHRoaXMgYnVnXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGEgY2hyb21lIGJ1ZyB3aGVyZSBzZXR0aW5nIGRlZmF1bHRDaGVja2VkXG4gIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5jZSB0aGUgdmFsdWUgb2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS5cbiAgLy8gUmVmZXJlbmNlOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD02MDg0MTZcbiAgLy8gV2UgbmVlZCB0byB0ZW1wb3JhcmlseSB1bnNldCBuYW1lIHRvIGF2b2lkIGRpc3J1cHRpbmcgcmFkaW8gYnV0dG9uIGdyb3Vwcy5cblxuXG4gIHZhciBuYW1lID0gbm9kZS5uYW1lO1xuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9ICcnO1xuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGJvdGggdGhlIGNoZWNrZWQgcHJvcGVydHkgYW5kXG4gICAgLy8gYXR0cmlidXRlIGFyZSBhc3NpZ25lZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIGRlZmF1bHRDaGVja2VkLiBUaGlzIHVzZXM6XG4gICAgLy9cbiAgICAvLyAgIDEuIFRoZSBjaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMi4gVGhlIGRlZmF1bHRDaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMy4gT3RoZXJ3aXNlLCBmYWxzZVxuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDtcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7XG4gIH1cblxuICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICBub2RlLm5hbWUgPSBuYW1lO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdXBkYXRlV3JhcHBlcihub2RlLCBwcm9wcyk7XG4gIHVwZGF0ZU5hbWVkQ291c2lucyhub2RlLCBwcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU5hbWVkQ291c2lucyhyb290Tm9kZSwgcHJvcHMpIHtcbiAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuXG4gIGlmIChwcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5hbWUgIT0gbnVsbCkge1xuICAgIHZhciBxdWVyeVJvb3QgPSByb290Tm9kZTtcblxuICAgIHdoaWxlIChxdWVyeVJvb3QucGFyZW50Tm9kZSkge1xuICAgICAgcXVlcnlSb290ID0gcXVlcnlSb290LnBhcmVudE5vZGU7XG4gICAgfSAvLyBJZiBgcm9vdE5vZGUuZm9ybWAgd2FzIG5vbi1udWxsLCB0aGVuIHdlIGNvdWxkIHRyeSBgZm9ybS5lbGVtZW50c2AsXG4gICAgLy8gYnV0IHRoYXQgc29tZXRpbWVzIGJlaGF2ZXMgc3RyYW5nZWx5IGluIElFOC4gV2UgY291bGQgYWxzbyB0cnkgdXNpbmdcbiAgICAvLyBgZm9ybS5nZXRFbGVtZW50c0J5TmFtZWAsIGJ1dCB0aGF0IHdpbGwgb25seSByZXR1cm4gZGlyZWN0IGNoaWxkcmVuXG4gICAgLy8gYW5kIHdvbid0IGluY2x1ZGUgaW5wdXRzIHRoYXQgdXNlIHRoZSBIVE1MNSBgZm9ybT1gIGF0dHJpYnV0ZS4gU2luY2VcbiAgICAvLyB0aGUgaW5wdXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gYSBmb3JtLiBJdCBtaWdodCBub3QgZXZlbiBiZSBpbiB0aGVcbiAgICAvLyBkb2N1bWVudC4gTGV0J3MganVzdCB1c2UgdGhlIGxvY2FsIGBxdWVyeVNlbGVjdG9yQWxsYCB0byBlbnN1cmUgd2UgZG9uJ3RcbiAgICAvLyBtaXNzIGFueXRoaW5nLlxuXG5cbiAgICB7XG4gICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKG5hbWUsICduYW1lJyk7XG4gICAgfVxuXG4gICAgdmFyIGdyb3VwID0gcXVlcnlSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9JyArIEpTT04uc3RyaW5naWZ5KCcnICsgbmFtZSkgKyAnXVt0eXBlPVwicmFkaW9cIl0nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvdGhlck5vZGUgPSBncm91cFtpXTtcblxuICAgICAgaWYgKG90aGVyTm9kZSA9PT0gcm9vdE5vZGUgfHwgb3RoZXJOb2RlLmZvcm0gIT09IHJvb3ROb2RlLmZvcm0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIFRoaXMgd2lsbCB0aHJvdyBpZiByYWRpbyBidXR0b25zIHJlbmRlcmVkIGJ5IGRpZmZlcmVudCBjb3BpZXMgb2YgUmVhY3RcbiAgICAgIC8vIGFuZCB0aGUgc2FtZSBuYW1lIGFyZSByZW5kZXJlZCBpbnRvIHRoZSBzYW1lIGZvcm0gKHNhbWUgYXMgIzE5MzkpLlxuICAgICAgLy8gVGhhdCdzIHByb2JhYmx5IG9rYXk7IHdlIGRvbid0IHN1cHBvcnQgaXQganVzdCBhcyB3ZSBkb24ndCBzdXBwb3J0XG4gICAgICAvLyBtaXhpbmcgUmVhY3QgcmFkaW8gYnV0dG9ucyB3aXRoIG5vbi1SZWFjdCBvbmVzLlxuXG5cbiAgICAgIHZhciBvdGhlclByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShvdGhlck5vZGUpO1xuXG4gICAgICBpZiAoIW90aGVyUHJvcHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgJyArICdzYW1lIGBuYW1lYCBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgfSAvLyBXZSBuZWVkIHVwZGF0ZSB0aGUgdHJhY2tlZCB2YWx1ZSBvbiB0aGUgbmFtZWQgY291c2luIHNpbmNlIHRoZSB2YWx1ZVxuICAgICAgLy8gd2FzIGNoYW5nZWQgYnV0IHRoZSBpbnB1dCBzYXcgbm8gZXZlbnQgb3IgdmFsdWUgc2V0XG5cblxuICAgICAgdXBkYXRlVmFsdWVJZkNoYW5nZWQob3RoZXJOb2RlKTsgLy8gSWYgdGhpcyBpcyBhIGNvbnRyb2xsZWQgcmFkaW8gYnV0dG9uIGdyb3VwLCBmb3JjaW5nIHRoZSBpbnB1dCB0aGF0XG4gICAgICAvLyB3YXMgcHJldmlvdXNseSBjaGVja2VkIHRvIHVwZGF0ZSB3aWxsIGNhdXNlIGl0IHRvIGJlIGNvbWUgcmUtY2hlY2tlZFxuICAgICAgLy8gYXMgYXBwcm9wcmlhdGUuXG5cbiAgICAgIHVwZGF0ZVdyYXBwZXIob3RoZXJOb2RlLCBvdGhlclByb3BzKTtcbiAgICB9XG4gIH1cbn0gLy8gSW4gQ2hyb21lLCBhc3NpZ25pbmcgZGVmYXVsdFZhbHVlIHRvIGNlcnRhaW4gaW5wdXQgdHlwZXMgdHJpZ2dlcnMgaW5wdXQgdmFsaWRhdGlvbi5cbi8vIEZvciBudW1iZXIgaW5wdXRzLCB0aGUgZGlzcGxheSB2YWx1ZSBsb3NlcyB0cmFpbGluZyBkZWNpbWFsIHBvaW50cy4gRm9yIGVtYWlsIGlucHV0cyxcbi8vIENocm9tZSByYWlzZXMgXCJUaGUgc3BlY2lmaWVkIHZhbHVlIDx4PiBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIuXG4vL1xuLy8gSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGRlZmF1bHRWYWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZCwgYXZvaWRpbmcgdGhlc2UgcHJvYmxlbXNcbi8vIHdoZW4gdGhlIHVzZXIgaXMgaW5wdXR0aW5nIHRleHRcbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTNcblxuXG5mdW5jdGlvbiBzZXREZWZhdWx0VmFsdWUobm9kZSwgdHlwZSwgdmFsdWUpIHtcbiAgaWYgKCAvLyBGb2N1c2VkIG51bWJlciBpbnB1dHMgc3luY2hyb25pemUgb24gYmx1ci4gU2VlIENoYW5nZUV2ZW50UGx1Z2luLmpzXG4gIHR5cGUgIT09ICdudW1iZXInIHx8IGdldEFjdGl2ZUVsZW1lbnQobm9kZS5vd25lckRvY3VtZW50KSAhPT0gbm9kZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5kZWZhdWx0VmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IGZhbHNlO1xudmFyIGRpZFdhcm5JbnZhbGlkQ2hpbGQgPSBmYWxzZTtcbnZhciBkaWRXYXJuSW52YWxpZElubmVySFRNTCA9IGZhbHNlO1xuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxvcHRpb24+IGhvc3QgY29tcG9uZW50IHRoYXQgd2FybnMgd2hlbiBgc2VsZWN0ZWRgIGlzIHNldC5cbiAqL1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHtcbiAgICAvLyBJZiBhIHZhbHVlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiB0aGUgY2hpbGRyZW4gbXVzdCBiZSBzaW1wbGUuXG4gICAgaWYgKHByb3BzLnZhbHVlID09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdvYmplY3QnICYmIHByb3BzLmNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGNoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZGlkV2FybkludmFsaWRDaGlsZCkge1xuICAgICAgICAgICAgZGlkV2FybkludmFsaWRDaGlsZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgaW5mZXIgdGhlIG9wdGlvbiB2YWx1ZSBvZiBjb21wbGV4IGNoaWxkcmVuLiAnICsgJ1Bhc3MgYSBgdmFsdWVgIHByb3Agb3IgdXNlIGEgcGxhaW4gc3RyaW5nIGFzIGNoaWxkcmVuIHRvIDxvcHRpb24+LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZElubmVySFRNTCkge1xuICAgICAgICAgIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdQYXNzIGEgYHZhbHVlYCBwcm9wIGlmIHlvdSBzZXQgZGFuZ2Vyb3VzbHlJbm5lckhUTUwgc28gUmVhY3Qga25vd3MgJyArICd3aGljaCB2YWx1ZSBzaG91bGQgYmUgc2VsZWN0ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFRPRE86IFJlbW92ZSBzdXBwb3J0IGZvciBgc2VsZWN0ZWRgIGluIDxvcHRpb24+LlxuXG5cbiAgICBpZiAocHJvcHMuc2VsZWN0ZWQgIT0gbnVsbCAmJiAhZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24pIHtcbiAgICAgIGVycm9yKCdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgb24gPHNlbGVjdD4gaW5zdGVhZCBvZiAnICsgJ3NldHRpbmcgYHNlbGVjdGVkYCBvbiA8b3B0aW9uPi4nKTtcblxuICAgICAgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIHZhbHVlPVwiXCIgc2hvdWxkIG1ha2UgYSB2YWx1ZSBhdHRyaWJ1dGUgKCM2MjE5KVxuICBpZiAocHJvcHMudmFsdWUgIT0gbnVsbCkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHRvU3RyaW5nKGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpKSk7XG4gIH1cbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDE7XG5cbntcbiAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICBpZiAob3duZXJOYW1lKSB7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciB2YWx1ZVByb3BOYW1lcyA9IFsndmFsdWUnLCAnZGVmYXVsdFZhbHVlJ107XG4vKipcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICovXG5cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdzZWxlY3QnLCBwcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcE5hbWUgPSB2YWx1ZVByb3BOYW1lc1tpXTtcblxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcE5hbWVJc0FycmF5ID0gaXNBcnJheShwcm9wc1twcm9wTmFtZV0pO1xuXG4gICAgICBpZiAocHJvcHMubXVsdGlwbGUgJiYgIXByb3BOYW1lSXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGFuIGFycmF5IGlmICcgKyAnYG11bHRpcGxlYCBpcyB0cnVlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpKTtcbiAgICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIHByb3BOYW1lSXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxzZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMobm9kZSwgbXVsdGlwbGUsIHByb3BWYWx1ZSwgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gIHZhciBvcHRpb25zID0gbm9kZS5vcHRpb25zO1xuXG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHZhciBzZWxlY3RlZFZhbHVlcyA9IHByb3BWYWx1ZTtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gUHJlZml4IHRvIGF2b2lkIGNoYW9zIHdpdGggc3BlY2lhbCBrZXlzLlxuICAgICAgc2VsZWN0ZWRWYWx1ZVsnJCcgKyBzZWxlY3RlZFZhbHVlc1tpXV0gPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcHRpb25zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7XG5cbiAgICAgIGlmIChvcHRpb25zW19pXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkICYmIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0IGNvbnNpc3RlbnQgYWNyb3NzIGFsbFxuICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuXG4gICAgdmFyIF9zZWxlY3RlZFZhbHVlID0gdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wVmFsdWUpKTtcblxuICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3B0aW9ucy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICBpZiAob3B0aW9uc1tfaTJdLnZhbHVlID09PSBfc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb25zW19pMl0uc2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICBvcHRpb25zW19pMl0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZmF1bHRTZWxlY3RlZCA9PT0gbnVsbCAmJiAhb3B0aW9uc1tfaTJdLmRpc2FibGVkKSB7XG4gICAgICAgIGRlZmF1bHRTZWxlY3RlZCA9IG9wdGlvbnNbX2kyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFNlbGVjdGVkICE9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0U2VsZWN0ZWQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHNlbGVjdD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZVxuICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYVxuICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVlLCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGVcbiAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAqXG4gKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90XG4gKiB1cGRhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBkYXRlLlxuICpcbiAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZVxuICogc2VsZWN0ZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMShlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgfSk7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcyk7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgd2FzTXVsdGlwbGU6ICEhcHJvcHMubXVsdGlwbGVcbiAgfTtcblxuICB7XG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxKSB7XG4gICAgICBlcnJvcignU2VsZWN0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBzZWxlY3QgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICBub2RlLm11bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RVcGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHdhc011bHRpcGxlID0gbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO1xuICBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmICh3YXNNdWx0aXBsZSAhPT0gISFwcm9wcy5tdWx0aXBsZSkge1xuICAgIC8vIEZvciBzaW1wbGljaXR5LCByZWFwcGx5IGBkZWZhdWx0VmFsdWVgIGlmIGBtdWx0aXBsZWAgaXMgdG9nZ2xlZC5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV2ZXJ0IHRoZSBzZWxlY3QgYmFjayB0byBpdHMgZGVmYXVsdCB1bnNlbGVjdGVkIHN0YXRlLlxuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5tdWx0aXBsZSA/IFtdIDogJycsIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IGZhbHNlO1xuXG4vKipcbiAqIEltcGxlbWVudHMgYSA8dGV4dGFyZWE+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgYHZhbHVlYCwgYW5kXG4gKiBgZGVmYXVsdFZhbHVlYC4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIHRyYWRpdGlvbmFsIERPTSBBUEkgYmVjYXVzZSB2YWx1ZSBpc1xuICogdXN1YWxseSBzZXQgYXMgUENEQVRBIGNoaWxkcmVuLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGVcbiAqIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsXG4gKiBub3QgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUsIHRoZSBwcm9wXG4gKiBgZGVmYXVsdFZhbHVlYCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBjaGlsZHJlbiBjb250ZW50IChkZXByZWNhdGVkKS5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugb24gPHRleHRhcmVhPi4nKTtcbiAgfSAvLyBBbHdheXMgc2V0IGNoaWxkcmVuIHRvIHRoZSBzYW1lIHRoaW5nLiBJbiBJRTksIHRoZSBzZWxlY3Rpb24gcmFuZ2Ugd2lsbFxuICAvLyBnZXQgcmVzZXQgaWYgYHRleHRDb250ZW50YCBpcyBtdXRhdGVkLiAgV2UgY291bGQgYWRkIGEgY2hlY2sgaW4gc2V0VGV4dENvbnRlbnRcbiAgLy8gdG8gb25seSBzZXQgdGhlIHZhbHVlIGlmL3doZW4gdGhlIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgbm9kZSB2YWx1ZSAod2hpY2ggd291bGRcbiAgLy8gY29tcGxldGVseSBzb2x2ZSB0aGlzIElFOSBidWcpLCBidXQgU2ViYXN0aWFuK1NvcGhpZSBzZWVtZWQgdG8gbGlrZSB0aGlzXG4gIC8vIHNvbHV0aW9uLiBUaGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbiBvciBvYmplY3Qgc28gdGhhdCdzIHdoeSBpdCdzIGZvcmNlZFxuICAvLyB0byBiZSBhIHN0cmluZy5cblxuXG4gIHZhciBob3N0UHJvcHMgPSBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGlsZHJlbjogdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSlcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3RleHRhcmVhJywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWxEZWZhdWx0VmFsKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcpO1xuXG4gICAgICBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRpYWxWYWx1ZSA9IHByb3BzLnZhbHVlOyAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuXG4gIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAnICsgJ2NoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uJyk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJZiB5b3Ugc3VwcGx5IGBkZWZhdWx0VmFsdWVgIG9uIGEgPHRleHRhcmVhPiwgZG8gbm90IHBhc3MgY2hpbGRyZW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCc8dGV4dGFyZWE+IGNhbiBvbmx5IGhhdmUgYXQgbW9zdCBvbmUgY2hpbGQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlblswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGNoaWxkcmVuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdFZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgaW5pdGlhbFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShpbml0aWFsVmFsdWUpXG4gIH07XG59XG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIC8vIENhc3QgYHZhbHVlYCB0byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlXG4gICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LlxuICAgIHZhciBuZXdWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTsgLy8gVG8gYXZvaWQgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGxvc2luZyB0ZXh0IHNlbGVjdGlvbiksIG9ubHkgc2V0IHZhbHVlIGlmIGNoYW5nZWRcblxuICAgIGlmIChuZXdWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCAmJiBub2RlLmRlZmF1bHRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhkZWZhdWx0VmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBUaGlzIGlzIGluIHBvc3RNb3VudCBiZWNhdXNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90XG4gIC8vIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLlxuXG4gIHZhciB0ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQ7IC8vIE9ubHkgc2V0IG5vZGUudmFsdWUgaWYgdGV4dENvbnRlbnQgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkXG4gIC8vIGluaXRpYWwgdmFsdWUuIEluIElFMTAvSUUxMSB0aGVyZSBpcyBhIGJ1ZyB3aGVyZSB0aGUgcGxhY2Vob2xkZXIgYXR0cmlidXRlXG4gIC8vIHdpbGwgcG9wdWxhdGUgdGV4dENvbnRlbnQgYXMgd2VsbC5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTAxNTI1L1xuXG4gIGlmICh0ZXh0Q29udGVudCA9PT0gbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSkge1xuICAgIGlmICh0ZXh0Q29udGVudCAhPT0gJycgJiYgdGV4dENvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUudmFsdWUgPSB0ZXh0Q29udGVudDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVwZGF0ZVxuICB1cGRhdGVXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpO1xufVxuXG52YXIgSFRNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG52YXIgTUFUSF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCc7XG52YXIgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7IC8vIEFzc3VtZXMgdGhlcmUgaXMgbm8gcGFyZW50IG5hbWVzcGFjZS5cblxuZnVuY3Rpb24gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3ZnJzpcbiAgICAgIHJldHVybiBTVkdfTkFNRVNQQUNFO1xuXG4gICAgY2FzZSAnbWF0aCc6XG4gICAgICByZXR1cm4gTUFUSF9OQU1FU1BBQ0U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PSBudWxsIHx8IHBhcmVudE5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAvLyBObyAob3IgZGVmYXVsdCkgcGFyZW50IG5hbWVzcGFjZTogcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuICAgIHJldHVybiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAocGFyZW50TmFtZXNwYWNlID09PSBTVkdfTkFNRVNQQUNFICYmIHR5cGUgPT09ICdmb3JlaWduT2JqZWN0Jykge1xuICAgIC8vIFdlJ3JlIGxlYXZpbmcgU1ZHLlxuICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfSAvLyBCeSBkZWZhdWx0LCBwYXNzIG5hbWVzcGFjZSBiZWxvdy5cblxuXG4gIHJldHVybiBwYXJlbnROYW1lc3BhY2U7XG59XG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2FmZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcylcbiAqL1xudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lcjtcbi8qKlxuICogU2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG5cbiAgICBpZiAoISgnaW5uZXJIVE1MJyBpbiBub2RlKSkge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBpbm5lckhUTUwgZm9yIFNWRyBub2Rlcywgc28gaW5zdGVhZCB3ZSBpbmplY3QgdGhlXG4gICAgICAvLyBuZXcgbWFya3VwIGluIGEgdGVtcCBub2RlIGFuZCB0aGVuIG1vdmUgdGhlIGNoaWxkIG5vZGVzIGFjcm9zcyBpbnRvXG4gICAgICAvLyB0aGUgdGFyZ2V0IG5vZGVcbiAgICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyID0gcmV1c2FibGVTVkdDb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHN2Zz4nICsgaHRtbC52YWx1ZU9mKCkudG9TdHJpbmcoKSArICc8L3N2Zz4nO1xuICAgICAgdmFyIHN2Z05vZGUgPSByZXVzYWJsZVNWR0NvbnRhaW5lci5maXJzdENoaWxkO1xuXG4gICAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHN2Z05vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLmFwcGVuZENoaWxkKHN2Z05vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBub2RlLmlubmVySFRNTCA9IGh0bWw7XG59KTtcblxuLyoqXG4gKiBIVE1MIG5vZGVUeXBlIHZhbHVlcyB0aGF0IHJlcHJlc2VudCB0aGUgdHlwZSBvZiB0aGUgbm9kZVxuICovXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG52YXIgRE9DVU1FTlRfTk9ERSA9IDk7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG4vKipcbiAqIFNldCB0aGUgdGV4dENvbnRlbnQgcHJvcGVydHkgb2YgYSBub2RlLiBGb3IgdGV4dCB1cGRhdGVzLCBpdCdzIGZhc3RlclxuICogdG8gc2V0IHRoZSBgbm9kZVZhbHVlYCBvZiB0aGUgVGV4dCBub2RlIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmdcbiAqIGAudGV4dENvbnRlbnRgIHdoaWNoIHdpbGwgcmVtb3ZlIHRoZSBleGlzdGluZyBub2RlIGFuZCBjcmVhdGUgYSBuZXcgb25lLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqIEBpbnRlcm5hbFxuICovXG5cbnZhciBzZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIChub2RlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0KSB7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG5cbiAgICBpZiAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkID09PSBub2RlLmxhc3RDaGlsZCAmJiBmaXJzdENoaWxkLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIGZpcnN0Q2hpbGQubm9kZVZhbHVlID0gdGV4dDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn07XG5cbi8vIExpc3QgZGVyaXZlZCBmcm9tIEdlY2tvIHNvdXJjZSBjb2RlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ2Vja28tZGV2L2Jsb2IvNGU2MzhlZmM3MS9sYXlvdXQvc3R5bGUvdGVzdC9wcm9wZXJ0eV9kYXRhYmFzZS5qc1xudmFyIHNob3J0aGFuZFRvTG9uZ2hhbmQgPSB7XG4gIGFuaW1hdGlvbjogWydhbmltYXRpb25EZWxheScsICdhbmltYXRpb25EaXJlY3Rpb24nLCAnYW5pbWF0aW9uRHVyYXRpb24nLCAnYW5pbWF0aW9uRmlsbE1vZGUnLCAnYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQnLCAnYW5pbWF0aW9uTmFtZScsICdhbmltYXRpb25QbGF5U3RhdGUnLCAnYW5pbWF0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgYmFja2dyb3VuZDogWydiYWNrZ3JvdW5kQXR0YWNobWVudCcsICdiYWNrZ3JvdW5kQ2xpcCcsICdiYWNrZ3JvdW5kQ29sb3InLCAnYmFja2dyb3VuZEltYWdlJywgJ2JhY2tncm91bmRPcmlnaW4nLCAnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJywgJ2JhY2tncm91bmRSZXBlYXQnLCAnYmFja2dyb3VuZFNpemUnXSxcbiAgYmFja2dyb3VuZFBvc2l0aW9uOiBbJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWSddLFxuICBib3JkZXI6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrRW5kOiBbJ2JvcmRlckJsb2NrRW5kQ29sb3InLCAnYm9yZGVyQmxvY2tFbmRTdHlsZScsICdib3JkZXJCbG9ja0VuZFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrU3RhcnQ6IFsnYm9yZGVyQmxvY2tTdGFydENvbG9yJywgJ2JvcmRlckJsb2NrU3RhcnRTdHlsZScsICdib3JkZXJCbG9ja1N0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyQm90dG9tOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJ10sXG4gIGJvcmRlckNvbG9yOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclRvcENvbG9yJ10sXG4gIGJvcmRlckltYWdlOiBbJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCddLFxuICBib3JkZXJJbmxpbmVFbmQ6IFsnYm9yZGVySW5saW5lRW5kQ29sb3InLCAnYm9yZGVySW5saW5lRW5kU3R5bGUnLCAnYm9yZGVySW5saW5lRW5kV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lU3RhcnQ6IFsnYm9yZGVySW5saW5lU3RhcnRDb2xvcicsICdib3JkZXJJbmxpbmVTdGFydFN0eWxlJywgJ2JvcmRlcklubGluZVN0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyTGVmdDogWydib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCddLFxuICBib3JkZXJSYWRpdXM6IFsnYm9yZGVyQm90dG9tTGVmdFJhZGl1cycsICdib3JkZXJCb3R0b21SaWdodFJhZGl1cycsICdib3JkZXJUb3BMZWZ0UmFkaXVzJywgJ2JvcmRlclRvcFJpZ2h0UmFkaXVzJ10sXG4gIGJvcmRlclJpZ2h0OiBbJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJ10sXG4gIGJvcmRlclN0eWxlOiBbJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclRvcFN0eWxlJ10sXG4gIGJvcmRlclRvcDogWydib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJXaWR0aDogWydib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BXaWR0aCddLFxuICBjb2x1bW5SdWxlOiBbJ2NvbHVtblJ1bGVDb2xvcicsICdjb2x1bW5SdWxlU3R5bGUnLCAnY29sdW1uUnVsZVdpZHRoJ10sXG4gIGNvbHVtbnM6IFsnY29sdW1uQ291bnQnLCAnY29sdW1uV2lkdGgnXSxcbiAgZmxleDogWydmbGV4QmFzaXMnLCAnZmxleEdyb3cnLCAnZmxleFNocmluayddLFxuICBmbGV4RmxvdzogWydmbGV4RGlyZWN0aW9uJywgJ2ZsZXhXcmFwJ10sXG4gIGZvbnQ6IFsnZm9udEZhbWlseScsICdmb250RmVhdHVyZVNldHRpbmdzJywgJ2ZvbnRLZXJuaW5nJywgJ2ZvbnRMYW5ndWFnZU92ZXJyaWRlJywgJ2ZvbnRTaXplJywgJ2ZvbnRTaXplQWRqdXN0JywgJ2ZvbnRTdHJldGNoJywgJ2ZvbnRTdHlsZScsICdmb250VmFyaWFudCcsICdmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJywgJ2ZvbnRXZWlnaHQnLCAnbGluZUhlaWdodCddLFxuICBmb250VmFyaWFudDogWydmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJ10sXG4gIGdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWQ6IFsnZ3JpZEF1dG9Db2x1bW5zJywgJ2dyaWRBdXRvRmxvdycsICdncmlkQXV0b1Jvd3MnLCAnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGdyaWRBcmVhOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0JywgJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRDb2x1bW46IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnXSxcbiAgZ3JpZENvbHVtbkdhcDogWydjb2x1bW5HYXAnXSxcbiAgZ3JpZEdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWRSb3c6IFsnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZFJvd0dhcDogWydyb3dHYXAnXSxcbiAgZ3JpZFRlbXBsYXRlOiBbJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBsaXN0U3R5bGU6IFsnbGlzdFN0eWxlSW1hZ2UnLCAnbGlzdFN0eWxlUG9zaXRpb24nLCAnbGlzdFN0eWxlVHlwZSddLFxuICBtYXJnaW46IFsnbWFyZ2luQm90dG9tJywgJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnLCAnbWFyZ2luVG9wJ10sXG4gIG1hcmtlcjogWydtYXJrZXJFbmQnLCAnbWFya2VyTWlkJywgJ21hcmtlclN0YXJ0J10sXG4gIG1hc2s6IFsnbWFza0NsaXAnLCAnbWFza0NvbXBvc2l0ZScsICdtYXNrSW1hZ2UnLCAnbWFza01vZGUnLCAnbWFza09yaWdpbicsICdtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknLCAnbWFza1JlcGVhdCcsICdtYXNrU2l6ZSddLFxuICBtYXNrUG9zaXRpb246IFsnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJ10sXG4gIG91dGxpbmU6IFsnb3V0bGluZUNvbG9yJywgJ291dGxpbmVTdHlsZScsICdvdXRsaW5lV2lkdGgnXSxcbiAgb3ZlcmZsb3c6IFsnb3ZlcmZsb3dYJywgJ292ZXJmbG93WSddLFxuICBwYWRkaW5nOiBbJ3BhZGRpbmdCb3R0b20nLCAncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0JywgJ3BhZGRpbmdUb3AnXSxcbiAgcGxhY2VDb250ZW50OiBbJ2FsaWduQ29udGVudCcsICdqdXN0aWZ5Q29udGVudCddLFxuICBwbGFjZUl0ZW1zOiBbJ2FsaWduSXRlbXMnLCAnanVzdGlmeUl0ZW1zJ10sXG4gIHBsYWNlU2VsZjogWydhbGlnblNlbGYnLCAnanVzdGlmeVNlbGYnXSxcbiAgdGV4dERlY29yYXRpb246IFsndGV4dERlY29yYXRpb25Db2xvcicsICd0ZXh0RGVjb3JhdGlvbkxpbmUnLCAndGV4dERlY29yYXRpb25TdHlsZSddLFxuICB0ZXh0RW1waGFzaXM6IFsndGV4dEVtcGhhc2lzQ29sb3InLCAndGV4dEVtcGhhc2lzU3R5bGUnXSxcbiAgdHJhbnNpdGlvbjogWyd0cmFuc2l0aW9uRGVsYXknLCAndHJhbnNpdGlvbkR1cmF0aW9uJywgJ3RyYW5zaXRpb25Qcm9wZXJ0eScsICd0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgd29yZFdyYXA6IFsnb3ZlcmZsb3dXcmFwJ11cbn07XG5cbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG52YXIgaXNVbml0bGVzc051bWJlciA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG4gIGFzcGVjdFJhdGlvOiB0cnVlLFxuICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSxcbiAgYm94RmxleDogdHJ1ZSxcbiAgYm94RmxleEdyb3VwOiB0cnVlLFxuICBib3hPcmRpbmFsR3JvdXA6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBjb2x1bW5zOiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFBvc2l0aXZlOiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmbGV4TmVnYXRpdmU6IHRydWUsXG4gIGZsZXhPcmRlcjogdHJ1ZSxcbiAgZ3JpZEFyZWE6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRvci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvblxuICogQHJldHVybiB7c3RyaW5nfSBzdHlsZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOlxuICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7XG4gIHJldHVybiBwcmVmaXggKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyaW5nKDEpO1xufVxuLyoqXG4gKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRoYXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnNcbiAqIG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107IC8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuXG5PYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIGlzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KSB7XG4gIC8vIE5vdGUgdGhhdCB3ZSd2ZSByZW1vdmVkIGVzY2FwZVRleHRGb3JCcm93c2VyKCkgY2FsbHMgaGVyZSBzaW5jZSB0aGVcbiAgLy8gd2hvbGUgc3RyaW5nIHdpbGwgYmUgZXNjYXBlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgaW5qZWN0ZWQgaW50b1xuICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0XG4gIC8vIGFyYml0cmFyeSBDU1Mgd2hpY2ggbWF5IGJlIHByb2JsZW1hdGljIChJIGNvdWxkbid0IHJlcHJvIHRoaXMpOlxuICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU19GaWx0ZXJfRXZhc2lvbl9DaGVhdF9TaGVldFxuICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi9cbiAgLy8gVGhpcyBpcyBub3QgYW4gWFNTIGhvbGUgYnV0IGluc3RlYWQgYSBwb3RlbnRpYWwgQ1NTIGluamVjdGlvbiBpc3N1ZVxuICAvLyB3aGljaCBoYXMgbGVhZCB0byBhIGdyZWF0ZXIgZGlzY3Vzc2lvbiBhYm91dCBob3cgd2UncmUgZ29pbmcgdG9cbiAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG5cbiAgaWYgKGlzRW1wdHkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCAmJiAhKGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkpIHtcbiAgICByZXR1cm4gdmFsdWUgKyAncHgnOyAvLyBQcmVzdW1lcyBpbXBsaWNpdCAncHgnIHN1ZmZpeCBmb3IgdW5pdGxlc3MgbnVtYmVyc1xuICB9XG5cbiAge1xuICAgIGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gIH1cblxuICByZXR1cm4gKCcnICsgdmFsdWUpLnRyaW0oKTtcbn1cblxudmFyIHVwcGVyY2FzZVBhdHRlcm4gPSAvKFtBLVpdKS9nO1xudmFyIG1zUGF0dGVybiA9IC9ebXMtLztcbi8qKlxuICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgQ1NTIHByb3BlcnR5IG5hbWUsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ2JhY2tncm91bmRDb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kLWNvbG9yXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ01velRyYW5zaXRpb24nKVxuICogICA8IFwiLW1vei10cmFuc2l0aW9uXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ21zVHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbXMtdHJhbnNpdGlvblwiXG4gKlxuICogQXMgTW9kZXJuaXpyIHN1Z2dlc3RzIChodHRwOi8vbW9kZXJuaXpyLmNvbS9kb2NzLyNwcmVmaXhlZCksIGFuIGBtc2AgcHJlZml4XG4gKiBpcyBjb252ZXJ0ZWQgdG8gYC1tcy1gLlxuICovXG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZVN0eWxlTmFtZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UodXBwZXJjYXNlUGF0dGVybiwgJy0kMScpLnRvTG93ZXJDYXNlKCkucmVwbGFjZShtc1BhdHRlcm4sICctbXMtJyk7XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vICdtc1RyYW5zZm9ybScgaXMgY29ycmVjdCwgYnV0IHRoZSBvdGhlciBwcmVmaXhlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWRcbiAgdmFyIGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybiA9IC9eKD86d2Via2l0fG1venxvKVtBLVpdLztcbiAgdmFyIG1zUGF0dGVybiQxID0gL14tbXMtLztcbiAgdmFyIGh5cGhlblBhdHRlcm4gPSAvLSguKS9nOyAvLyBzdHlsZSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb25cblxuICB2YXIgYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuID0gLztcXHMqJC87XG4gIHZhciB3YXJuZWRTdHlsZU5hbWVzID0ge307XG4gIHZhciB3YXJuZWRTdHlsZVZhbHVlcyA9IHt9O1xuICB2YXIgd2FybmVkRm9yTmFOVmFsdWUgPSBmYWxzZTtcbiAgdmFyIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSBmYWxzZTtcblxuICB2YXIgY2FtZWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGh5cGhlblBhdHRlcm4sIGZ1bmN0aW9uIChfLCBjaGFyYWN0ZXIpIHtcbiAgICAgIHJldHVybiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIC8vIEFzIEFuZGkgU21pdGggc3VnZ2VzdHNcbiAgICAvLyAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cvMjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4XG4gICAgLy8gaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBgbXNgLlxuICAgIGNhbWVsaXplKG5hbWUucmVwbGFjZShtc1BhdHRlcm4kMSwgJ21zLScpKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlVmFsdWVzLmhhc093blByb3BlcnR5KHZhbHVlKSAmJiB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoXCJTdHlsZSBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb24uIFwiICsgJ1RyeSBcIiVzOiAlc1wiIGluc3RlYWQuJywgbmFtZSwgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sICcnKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNOYU4gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9yTmFOVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JOYU5WYWx1ZSA9IHRydWU7XG5cbiAgICBlcnJvcignYE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9ySW5maW5pdHlWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BJbmZpbml0eWAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzTmFOKG5hbWUsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlJDEgPSB3YXJuVmFsaWRTdHlsZTtcblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciBkZWFsaW5nIHdpdGggQ1NTIHByb3BlcnRpZXMuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGNyZWF0ZXMgYSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBzdHlsZVxuICogYXR0cmlidXRlIGdlbmVyYXRlZCBieSBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuIEl0IGJ5LXBhc3NlcyB3YXJuaW5ncyBhbmRcbiAqIHNlY3VyaXR5IGNoZWNrcyBzbyBpdCdzIG5vdCBzYWZlIHRvIHVzZSB0aGlzIHZhbHVlIGZvciBhbnl0aGluZyBvdGhlciB0aGFuXG4gKiBjb21wYXJpc29uLiBJdCBpcyBvbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMoc3R5bGVzKSB7XG4gIHtcbiAgICB2YXIgc2VyaWFsaXplZCA9ICcnO1xuICAgIHZhciBkZWxpbWl0ZXIgPSAnJztcblxuICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHlsZVZhbHVlID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cbiAgICAgIGlmIChzdHlsZVZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcbiAgICAgICAgc2VyaWFsaXplZCArPSBkZWxpbWl0ZXIgKyAoaXNDdXN0b21Qcm9wZXJ0eSA/IHN0eWxlTmFtZSA6IGh5cGhlbmF0ZVN0eWxlTmFtZShzdHlsZU5hbWUpKSArICc6JztcbiAgICAgICAgc2VyaWFsaXplZCArPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG4gICAgICAgIGRlbGltaXRlciA9ICc7JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWFsaXplZCB8fCBudWxsO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBtdWx0aXBsZSBzdHlsZXMgb24gYSBub2RlLiAgSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXNcbiAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IHN0eWxlc1xuICovXG5cbmZ1bmN0aW9uIHNldFZhbHVlRm9yU3R5bGVzKG5vZGUsIHN0eWxlcykge1xuICB2YXIgc3R5bGUgPSBub2RlLnN0eWxlO1xuXG4gIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuXG4gICAge1xuICAgICAgaWYgKCFpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICAgIHdhcm5WYWxpZFN0eWxlJDEoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlVmFsdWUgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0sIGlzQ3VzdG9tUHJvcGVydHkpO1xuXG4gICAgaWYgKHN0eWxlTmFtZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgc3R5bGVOYW1lID0gJ2Nzc0Zsb2F0JztcbiAgICB9XG5cbiAgICBpZiAoaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVOYW1lLCBzdHlsZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsdWVFbXB0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG59XG4vKipcbiAqIEdpdmVuIHtjb2xvcjogJ3JlZCcsIG92ZXJmbG93OiAnaGlkZGVuJ30gcmV0dXJucyB7XG4gKiAgIGNvbG9yOiAnY29sb3InLFxuICogICBvdmVyZmxvd1g6ICdvdmVyZmxvdycsXG4gKiAgIG92ZXJmbG93WTogJ292ZXJmbG93JyxcbiAqIH0uIFRoaXMgY2FuIGJlIHJlYWQgYXMgXCJ0aGUgb3ZlcmZsb3dZIHByb3BlcnR5IHdhcyBzZXQgYnkgdGhlIG92ZXJmbG93XG4gKiBzaG9ydGhhbmRcIi4gVGhhdCBpcywgdGhlIHZhbHVlcyBhcmUgdGhlIHByb3BlcnR5IHRoYXQgZWFjaCB3YXMgZGVyaXZlZCBmcm9tLlxuICovXG5cblxuZnVuY3Rpb24gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlcykge1xuICB2YXIgZXhwYW5kZWQgPSB7fTtcblxuICBmb3IgKHZhciBrZXkgaW4gc3R5bGVzKSB7XG4gICAgdmFyIGxvbmdoYW5kcyA9IHNob3J0aGFuZFRvTG9uZ2hhbmRba2V5XSB8fCBba2V5XTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9uZ2hhbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBleHBhbmRlZFtsb25naGFuZHNbaV1dID0ga2V5O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbmRlZDtcbn1cbi8qKlxuICogV2hlbiBtaXhpbmcgc2hvcnRoYW5kIGFuZCBsb25naGFuZCBwcm9wZXJ0eSBuYW1lcywgd2Ugd2FybiBkdXJpbmcgdXBkYXRlcyBpZlxuICogd2UgZXhwZWN0IGFuIGluY29ycmVjdCByZXN1bHQgdG8gb2NjdXIuIEluIHBhcnRpY3VsYXIsIHdlIHdhcm4gZm9yOlxuICpcbiAqIFVwZGF0aW5nIGEgc2hvcnRoYW5kIHByb3BlcnR5IChsb25naGFuZCBnZXRzIG92ZXJ3cml0dGVuKTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnYmF6JywgZm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJ2JheidcbiAqIFJlbW92aW5nIGEgc2hvcnRoYW5kIHByb3BlcnR5IChsb25naGFuZCBnZXRzIGxvc3QgdG9vKTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250VmFyaWFudDogJ2Jhcid9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnQgPSAnJ1xuICogUmVtb3ZpbmcgYSBsb25naGFuZCBwcm9wZXJ0eSAoc2hvdWxkIHJldmVydCB0byBzaG9ydGhhbmQ7IGRvZXNuJ3QpOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnQ6ICdmb28nfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250VmFyaWFudCA9ICcnXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0U3R5bGVzKSB7XG4gIHtcbiAgICBpZiAoIW5leHRTdHlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXhwYW5kZWRVcGRhdGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlVXBkYXRlcyk7XG4gICAgdmFyIGV4cGFuZGVkU3R5bGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKG5leHRTdHlsZXMpO1xuICAgIHZhciB3YXJuZWRBYm91dCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGV4cGFuZGVkVXBkYXRlcykge1xuICAgICAgdmFyIG9yaWdpbmFsS2V5ID0gZXhwYW5kZWRVcGRhdGVzW2tleV07XG4gICAgICB2YXIgY29ycmVjdE9yaWdpbmFsS2V5ID0gZXhwYW5kZWRTdHlsZXNba2V5XTtcblxuICAgICAgaWYgKGNvcnJlY3RPcmlnaW5hbEtleSAmJiBvcmlnaW5hbEtleSAhPT0gY29ycmVjdE9yaWdpbmFsS2V5KSB7XG4gICAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3JpZ2luYWxLZXkgKyAnLCcgKyBjb3JyZWN0T3JpZ2luYWxLZXk7XG5cbiAgICAgICAgaWYgKHdhcm5lZEFib3V0W3dhcm5pbmdLZXldKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzIGEgc3R5bGUgcHJvcGVydHkgZHVyaW5nIHJlcmVuZGVyICglcykgd2hlbiBhICcgKyAnY29uZmxpY3RpbmcgcHJvcGVydHkgaXMgc2V0ICglcykgY2FuIGxlYWQgdG8gc3R5bGluZyBidWdzLiBUbyAnICsgXCJhdm9pZCB0aGlzLCBkb24ndCBtaXggc2hvcnRoYW5kIGFuZCBub24tc2hvcnRoYW5kIHByb3BlcnRpZXMgXCIgKyAnZm9yIHRoZSBzYW1lIHZhbHVlOyBpbnN0ZWFkLCByZXBsYWNlIHRoZSBzaG9ydGhhbmQgd2l0aCAnICsgJ3NlcGFyYXRlIHZhbHVlcy4nLCBpc1ZhbHVlRW1wdHkoc3R5bGVVcGRhdGVzW29yaWdpbmFsS2V5XSkgPyAnUmVtb3ZpbmcnIDogJ1VwZGF0aW5nJywgb3JpZ2luYWxLZXksIGNvcnJlY3RPcmlnaW5hbEtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3Mgc2hvdWxkIG9taXQgdGhlaXIgY2xvc2UgdGFnLiBXZSBrZWVwIGEgbGlzdCBmb3Jcbi8vIHRob3NlIHNwZWNpYWwtY2FzZSB0YWdzLlxudmFyIG9taXR0ZWRDbG9zZVRhZ3MgPSB7XG4gIGFyZWE6IHRydWUsXG4gIGJhc2U6IHRydWUsXG4gIGJyOiB0cnVlLFxuICBjb2w6IHRydWUsXG4gIGVtYmVkOiB0cnVlLFxuICBocjogdHJ1ZSxcbiAgaW1nOiB0cnVlLFxuICBpbnB1dDogdHJ1ZSxcbiAga2V5Z2VuOiB0cnVlLFxuICBsaW5rOiB0cnVlLFxuICBtZXRhOiB0cnVlLFxuICBwYXJhbTogdHJ1ZSxcbiAgc291cmNlOiB0cnVlLFxuICB0cmFjazogdHJ1ZSxcbiAgd2JyOiB0cnVlIC8vIE5PVEU6IG1lbnVpdGVtJ3MgY2xvc2UgdGFnIHNob3VsZCBiZSBvbWl0dGVkLCBidXQgdGhhdCBjYXVzZXMgcHJvYmxlbXMuXG5cbn07XG5cbi8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQgdGhhdCBgbWVudWl0ZW1gIHNob3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy5cblxudmFyIHZvaWRFbGVtZW50VGFncyA9IGFzc2lnbih7XG4gIG1lbnVpdGVtOiB0cnVlXG59LCBvbWl0dGVkQ2xvc2VUYWdzKTtcblxudmFyIEhUTUwgPSAnX19odG1sJztcblxuZnVuY3Rpb24gYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKSB7XG4gIGlmICghcHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gTm90ZSB0aGUgdXNlIG9mIGA9PWAgd2hpY2ggY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZC5cblxuXG4gIGlmICh2b2lkRWxlbWVudFRhZ3NbdGFnXSkge1xuICAgIGlmIChwcm9wcy5jaGlsZHJlbiAhPSBudWxsIHx8IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0YWcgKyBcIiBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIFwiICsgJ3VzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgaWYgKHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gJ29iamVjdCcgfHwgIShIVE1MIGluIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIG11c3QgYmUgaW4gdGhlIGZvcm0gYHtfX2h0bWw6IC4uLn1gLiAnICsgJ1BsZWFzZSB2aXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgJyArICdmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKCFwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgJiYgcHJvcHMuY29udGVudEVkaXRhYmxlICYmIHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3QuIEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgJyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLnN0eWxlICE9IG51bGwgJiYgdHlwZW9mIHByb3BzLnN0eWxlICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBzdHlsZWAgcHJvcCBleHBlY3RzIGEgbWFwcGluZyBmcm9tIHN0eWxlIHByb3BlcnRpZXMgdG8gdmFsdWVzLCAnICsgXCJub3QgYSBzdHJpbmcuIEZvciBleGFtcGxlLCBzdHlsZT17e21hcmdpblJpZ2h0OiBzcGFjaW5nICsgJ2VtJ319IHdoZW4gXCIgKyAndXNpbmcgSlNYLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ3VzdG9tQ29tcG9uZW50KHRhZ05hbWUsIHByb3BzKSB7XG4gIGlmICh0YWdOYW1lLmluZGV4T2YoJy0nKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gdHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIHN3aXRjaCAodGFnTmFtZSkge1xuICAgIC8vIFRoZXNlIGFyZSByZXNlcnZlZCBTVkcgYW5kIE1hdGhNTCBlbGVtZW50cy5cbiAgICAvLyBXZSBkb24ndCBtaW5kIHRoaXMgbGlzdCB0b28gbXVjaCBiZWNhdXNlIHdlIGV4cGVjdCBpdCB0byBuZXZlciBncm93LlxuICAgIC8vIFRoZSBhbHRlcm5hdGl2ZSBpcyB0byB0cmFjayB0aGUgbmFtZXNwYWNlIGluIGEgZmV3IHBsYWNlcyB3aGljaCBpcyBjb252b2x1dGVkLlxuICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjdXN0b20tZWxlbWVudHMtY29yZS1jb25jZXB0c1xuICAgIGNhc2UgJ2Fubm90YXRpb24teG1sJzpcbiAgICBjYXNlICdjb2xvci1wcm9maWxlJzpcbiAgICBjYXNlICdmb250LWZhY2UnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1zcmMnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS11cmknOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1mb3JtYXQnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1uYW1lJzpcbiAgICBjYXNlICdtaXNzaW5nLWdseXBoJzpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoZSBIVE1MIG9yIFNWRyBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0LCBiZSBzdXJlIHRvXG4vLyBhbHNvIGFkZCB0aGVtIHRvIHRoaXMgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdCBuYW1lXG4vLyB3YXJuaW5ncy5cbnZhciBwb3NzaWJsZVN0YW5kYXJkTmFtZXMgPSB7XG4gIC8vIEhUTUxcbiAgYWNjZXB0OiAnYWNjZXB0JyxcbiAgYWNjZXB0Y2hhcnNldDogJ2FjY2VwdENoYXJzZXQnLFxuICAnYWNjZXB0LWNoYXJzZXQnOiAnYWNjZXB0Q2hhcnNldCcsXG4gIGFjY2Vzc2tleTogJ2FjY2Vzc0tleScsXG4gIGFjdGlvbjogJ2FjdGlvbicsXG4gIGFsbG93ZnVsbHNjcmVlbjogJ2FsbG93RnVsbFNjcmVlbicsXG4gIGFsdDogJ2FsdCcsXG4gIGFzOiAnYXMnLFxuICBhc3luYzogJ2FzeW5jJyxcbiAgYXV0b2NhcGl0YWxpemU6ICdhdXRvQ2FwaXRhbGl6ZScsXG4gIGF1dG9jb21wbGV0ZTogJ2F1dG9Db21wbGV0ZScsXG4gIGF1dG9jb3JyZWN0OiAnYXV0b0NvcnJlY3QnLFxuICBhdXRvZm9jdXM6ICdhdXRvRm9jdXMnLFxuICBhdXRvcGxheTogJ2F1dG9QbGF5JyxcbiAgYXV0b3NhdmU6ICdhdXRvU2F2ZScsXG4gIGNhcHR1cmU6ICdjYXB0dXJlJyxcbiAgY2VsbHBhZGRpbmc6ICdjZWxsUGFkZGluZycsXG4gIGNlbGxzcGFjaW5nOiAnY2VsbFNwYWNpbmcnLFxuICBjaGFsbGVuZ2U6ICdjaGFsbGVuZ2UnLFxuICBjaGFyc2V0OiAnY2hhclNldCcsXG4gIGNoZWNrZWQ6ICdjaGVja2VkJyxcbiAgY2hpbGRyZW46ICdjaGlsZHJlbicsXG4gIGNpdGU6ICdjaXRlJyxcbiAgY2xhc3M6ICdjbGFzc05hbWUnLFxuICBjbGFzc2lkOiAnY2xhc3NJRCcsXG4gIGNsYXNzbmFtZTogJ2NsYXNzTmFtZScsXG4gIGNvbHM6ICdjb2xzJyxcbiAgY29sc3BhbjogJ2NvbFNwYW4nLFxuICBjb250ZW50OiAnY29udGVudCcsXG4gIGNvbnRlbnRlZGl0YWJsZTogJ2NvbnRlbnRFZGl0YWJsZScsXG4gIGNvbnRleHRtZW51OiAnY29udGV4dE1lbnUnLFxuICBjb250cm9sczogJ2NvbnRyb2xzJyxcbiAgY29udHJvbHNsaXN0OiAnY29udHJvbHNMaXN0JyxcbiAgY29vcmRzOiAnY29vcmRzJyxcbiAgY3Jvc3NvcmlnaW46ICdjcm9zc09yaWdpbicsXG4gIGRhbmdlcm91c2x5c2V0aW5uZXJodG1sOiAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLFxuICBkYXRhOiAnZGF0YScsXG4gIGRhdGV0aW1lOiAnZGF0ZVRpbWUnLFxuICBkZWZhdWx0OiAnZGVmYXVsdCcsXG4gIGRlZmF1bHRjaGVja2VkOiAnZGVmYXVsdENoZWNrZWQnLFxuICBkZWZhdWx0dmFsdWU6ICdkZWZhdWx0VmFsdWUnLFxuICBkZWZlcjogJ2RlZmVyJyxcbiAgZGlyOiAnZGlyJyxcbiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGRpc2FibGVwaWN0dXJlaW5waWN0dXJlOiAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLFxuICBkaXNhYmxlcmVtb3RlcGxheWJhY2s6ICdkaXNhYmxlUmVtb3RlUGxheWJhY2snLFxuICBkb3dubG9hZDogJ2Rvd25sb2FkJyxcbiAgZHJhZ2dhYmxlOiAnZHJhZ2dhYmxlJyxcbiAgZW5jdHlwZTogJ2VuY1R5cGUnLFxuICBlbnRlcmtleWhpbnQ6ICdlbnRlcktleUhpbnQnLFxuICBmb3I6ICdodG1sRm9yJyxcbiAgZm9ybTogJ2Zvcm0nLFxuICBmb3JtbWV0aG9kOiAnZm9ybU1ldGhvZCcsXG4gIGZvcm1hY3Rpb246ICdmb3JtQWN0aW9uJyxcbiAgZm9ybWVuY3R5cGU6ICdmb3JtRW5jVHlwZScsXG4gIGZvcm1ub3ZhbGlkYXRlOiAnZm9ybU5vVmFsaWRhdGUnLFxuICBmb3JtdGFyZ2V0OiAnZm9ybVRhcmdldCcsXG4gIGZyYW1lYm9yZGVyOiAnZnJhbWVCb3JkZXInLFxuICBoZWFkZXJzOiAnaGVhZGVycycsXG4gIGhlaWdodDogJ2hlaWdodCcsXG4gIGhpZGRlbjogJ2hpZGRlbicsXG4gIGhpZ2g6ICdoaWdoJyxcbiAgaHJlZjogJ2hyZWYnLFxuICBocmVmbGFuZzogJ2hyZWZMYW5nJyxcbiAgaHRtbGZvcjogJ2h0bWxGb3InLFxuICBodHRwZXF1aXY6ICdodHRwRXF1aXYnLFxuICAnaHR0cC1lcXVpdic6ICdodHRwRXF1aXYnLFxuICBpY29uOiAnaWNvbicsXG4gIGlkOiAnaWQnLFxuICBpbWFnZXNpemVzOiAnaW1hZ2VTaXplcycsXG4gIGltYWdlc3Jjc2V0OiAnaW1hZ2VTcmNTZXQnLFxuICBpbm5lcmh0bWw6ICdpbm5lckhUTUwnLFxuICBpbnB1dG1vZGU6ICdpbnB1dE1vZGUnLFxuICBpbnRlZ3JpdHk6ICdpbnRlZ3JpdHknLFxuICBpczogJ2lzJyxcbiAgaXRlbWlkOiAnaXRlbUlEJyxcbiAgaXRlbXByb3A6ICdpdGVtUHJvcCcsXG4gIGl0ZW1yZWY6ICdpdGVtUmVmJyxcbiAgaXRlbXNjb3BlOiAnaXRlbVNjb3BlJyxcbiAgaXRlbXR5cGU6ICdpdGVtVHlwZScsXG4gIGtleXBhcmFtczogJ2tleVBhcmFtcycsXG4gIGtleXR5cGU6ICdrZXlUeXBlJyxcbiAga2luZDogJ2tpbmQnLFxuICBsYWJlbDogJ2xhYmVsJyxcbiAgbGFuZzogJ2xhbmcnLFxuICBsaXN0OiAnbGlzdCcsXG4gIGxvb3A6ICdsb29wJyxcbiAgbG93OiAnbG93JyxcbiAgbWFuaWZlc3Q6ICdtYW5pZmVzdCcsXG4gIG1hcmdpbndpZHRoOiAnbWFyZ2luV2lkdGgnLFxuICBtYXJnaW5oZWlnaHQ6ICdtYXJnaW5IZWlnaHQnLFxuICBtYXg6ICdtYXgnLFxuICBtYXhsZW5ndGg6ICdtYXhMZW5ndGgnLFxuICBtZWRpYTogJ21lZGlhJyxcbiAgbWVkaWFncm91cDogJ21lZGlhR3JvdXAnLFxuICBtZXRob2Q6ICdtZXRob2QnLFxuICBtaW46ICdtaW4nLFxuICBtaW5sZW5ndGg6ICdtaW5MZW5ndGgnLFxuICBtdWx0aXBsZTogJ211bHRpcGxlJyxcbiAgbXV0ZWQ6ICdtdXRlZCcsXG4gIG5hbWU6ICduYW1lJyxcbiAgbm9tb2R1bGU6ICdub01vZHVsZScsXG4gIG5vbmNlOiAnbm9uY2UnLFxuICBub3ZhbGlkYXRlOiAnbm9WYWxpZGF0ZScsXG4gIG9wZW46ICdvcGVuJyxcbiAgb3B0aW11bTogJ29wdGltdW0nLFxuICBwYXR0ZXJuOiAncGF0dGVybicsXG4gIHBsYWNlaG9sZGVyOiAncGxhY2Vob2xkZXInLFxuICBwbGF5c2lubGluZTogJ3BsYXlzSW5saW5lJyxcbiAgcG9zdGVyOiAncG9zdGVyJyxcbiAgcHJlbG9hZDogJ3ByZWxvYWQnLFxuICBwcm9maWxlOiAncHJvZmlsZScsXG4gIHJhZGlvZ3JvdXA6ICdyYWRpb0dyb3VwJyxcbiAgcmVhZG9ubHk6ICdyZWFkT25seScsXG4gIHJlZmVycmVycG9saWN5OiAncmVmZXJyZXJQb2xpY3knLFxuICByZWw6ICdyZWwnLFxuICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgcmV2ZXJzZWQ6ICdyZXZlcnNlZCcsXG4gIHJvbGU6ICdyb2xlJyxcbiAgcm93czogJ3Jvd3MnLFxuICByb3dzcGFuOiAncm93U3BhbicsXG4gIHNhbmRib3g6ICdzYW5kYm94JyxcbiAgc2NvcGU6ICdzY29wZScsXG4gIHNjb3BlZDogJ3Njb3BlZCcsXG4gIHNjcm9sbGluZzogJ3Njcm9sbGluZycsXG4gIHNlYW1sZXNzOiAnc2VhbWxlc3MnLFxuICBzZWxlY3RlZDogJ3NlbGVjdGVkJyxcbiAgc2hhcGU6ICdzaGFwZScsXG4gIHNpemU6ICdzaXplJyxcbiAgc2l6ZXM6ICdzaXplcycsXG4gIHNwYW46ICdzcGFuJyxcbiAgc3BlbGxjaGVjazogJ3NwZWxsQ2hlY2snLFxuICBzcmM6ICdzcmMnLFxuICBzcmNkb2M6ICdzcmNEb2MnLFxuICBzcmNsYW5nOiAnc3JjTGFuZycsXG4gIHNyY3NldDogJ3NyY1NldCcsXG4gIHN0YXJ0OiAnc3RhcnQnLFxuICBzdGVwOiAnc3RlcCcsXG4gIHN0eWxlOiAnc3R5bGUnLFxuICBzdW1tYXJ5OiAnc3VtbWFyeScsXG4gIHRhYmluZGV4OiAndGFiSW5kZXgnLFxuICB0YXJnZXQ6ICd0YXJnZXQnLFxuICB0aXRsZTogJ3RpdGxlJyxcbiAgdHlwZTogJ3R5cGUnLFxuICB1c2VtYXA6ICd1c2VNYXAnLFxuICB2YWx1ZTogJ3ZhbHVlJyxcbiAgd2lkdGg6ICd3aWR0aCcsXG4gIHdtb2RlOiAnd21vZGUnLFxuICB3cmFwOiAnd3JhcCcsXG4gIC8vIFNWR1xuICBhYm91dDogJ2Fib3V0JyxcbiAgYWNjZW50aGVpZ2h0OiAnYWNjZW50SGVpZ2h0JyxcbiAgJ2FjY2VudC1oZWlnaHQnOiAnYWNjZW50SGVpZ2h0JyxcbiAgYWNjdW11bGF0ZTogJ2FjY3VtdWxhdGUnLFxuICBhZGRpdGl2ZTogJ2FkZGl0aXZlJyxcbiAgYWxpZ25tZW50YmFzZWxpbmU6ICdhbGlnbm1lbnRCYXNlbGluZScsXG4gICdhbGlnbm1lbnQtYmFzZWxpbmUnOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICBhbGxvd3Jlb3JkZXI6ICdhbGxvd1Jlb3JkZXInLFxuICBhbHBoYWJldGljOiAnYWxwaGFiZXRpYycsXG4gIGFtcGxpdHVkZTogJ2FtcGxpdHVkZScsXG4gIGFyYWJpY2Zvcm06ICdhcmFiaWNGb3JtJyxcbiAgJ2FyYWJpYy1mb3JtJzogJ2FyYWJpY0Zvcm0nLFxuICBhc2NlbnQ6ICdhc2NlbnQnLFxuICBhdHRyaWJ1dGVuYW1lOiAnYXR0cmlidXRlTmFtZScsXG4gIGF0dHJpYnV0ZXR5cGU6ICdhdHRyaWJ1dGVUeXBlJyxcbiAgYXV0b3JldmVyc2U6ICdhdXRvUmV2ZXJzZScsXG4gIGF6aW11dGg6ICdhemltdXRoJyxcbiAgYmFzZWZyZXF1ZW5jeTogJ2Jhc2VGcmVxdWVuY3knLFxuICBiYXNlbGluZXNoaWZ0OiAnYmFzZWxpbmVTaGlmdCcsXG4gICdiYXNlbGluZS1zaGlmdCc6ICdiYXNlbGluZVNoaWZ0JyxcbiAgYmFzZXByb2ZpbGU6ICdiYXNlUHJvZmlsZScsXG4gIGJib3g6ICdiYm94JyxcbiAgYmVnaW46ICdiZWdpbicsXG4gIGJpYXM6ICdiaWFzJyxcbiAgYnk6ICdieScsXG4gIGNhbGNtb2RlOiAnY2FsY01vZGUnLFxuICBjYXBoZWlnaHQ6ICdjYXBIZWlnaHQnLFxuICAnY2FwLWhlaWdodCc6ICdjYXBIZWlnaHQnLFxuICBjbGlwOiAnY2xpcCcsXG4gIGNsaXBwYXRoOiAnY2xpcFBhdGgnLFxuICAnY2xpcC1wYXRoJzogJ2NsaXBQYXRoJyxcbiAgY2xpcHBhdGh1bml0czogJ2NsaXBQYXRoVW5pdHMnLFxuICBjbGlwcnVsZTogJ2NsaXBSdWxlJyxcbiAgJ2NsaXAtcnVsZSc6ICdjbGlwUnVsZScsXG4gIGNvbG9yOiAnY29sb3InLFxuICBjb2xvcmludGVycG9sYXRpb246ICdjb2xvckludGVycG9sYXRpb24nLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbic6ICdjb2xvckludGVycG9sYXRpb24nLFxuICBjb2xvcmludGVycG9sYXRpb25maWx0ZXJzOiAnY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycycsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnOiAnY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVycycsXG4gIGNvbG9ycHJvZmlsZTogJ2NvbG9yUHJvZmlsZScsXG4gICdjb2xvci1wcm9maWxlJzogJ2NvbG9yUHJvZmlsZScsXG4gIGNvbG9ycmVuZGVyaW5nOiAnY29sb3JSZW5kZXJpbmcnLFxuICAnY29sb3ItcmVuZGVyaW5nJzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgY29udGVudHNjcmlwdHR5cGU6ICdjb250ZW50U2NyaXB0VHlwZScsXG4gIGNvbnRlbnRzdHlsZXR5cGU6ICdjb250ZW50U3R5bGVUeXBlJyxcbiAgY3Vyc29yOiAnY3Vyc29yJyxcbiAgY3g6ICdjeCcsXG4gIGN5OiAnY3knLFxuICBkOiAnZCcsXG4gIGRhdGF0eXBlOiAnZGF0YXR5cGUnLFxuICBkZWNlbGVyYXRlOiAnZGVjZWxlcmF0ZScsXG4gIGRlc2NlbnQ6ICdkZXNjZW50JyxcbiAgZGlmZnVzZWNvbnN0YW50OiAnZGlmZnVzZUNvbnN0YW50JyxcbiAgZGlyZWN0aW9uOiAnZGlyZWN0aW9uJyxcbiAgZGlzcGxheTogJ2Rpc3BsYXknLFxuICBkaXZpc29yOiAnZGl2aXNvcicsXG4gIGRvbWluYW50YmFzZWxpbmU6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgJ2RvbWluYW50LWJhc2VsaW5lJzogJ2RvbWluYW50QmFzZWxpbmUnLFxuICBkdXI6ICdkdXInLFxuICBkeDogJ2R4JyxcbiAgZHk6ICdkeScsXG4gIGVkZ2Vtb2RlOiAnZWRnZU1vZGUnLFxuICBlbGV2YXRpb246ICdlbGV2YXRpb24nLFxuICBlbmFibGViYWNrZ3JvdW5kOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gICdlbmFibGUtYmFja2dyb3VuZCc6ICdlbmFibGVCYWNrZ3JvdW5kJyxcbiAgZW5kOiAnZW5kJyxcbiAgZXhwb25lbnQ6ICdleHBvbmVudCcsXG4gIGV4dGVybmFscmVzb3VyY2VzcmVxdWlyZWQ6ICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgZmlsbDogJ2ZpbGwnLFxuICBmaWxsb3BhY2l0eTogJ2ZpbGxPcGFjaXR5JyxcbiAgJ2ZpbGwtb3BhY2l0eSc6ICdmaWxsT3BhY2l0eScsXG4gIGZpbGxydWxlOiAnZmlsbFJ1bGUnLFxuICAnZmlsbC1ydWxlJzogJ2ZpbGxSdWxlJyxcbiAgZmlsdGVyOiAnZmlsdGVyJyxcbiAgZmlsdGVycmVzOiAnZmlsdGVyUmVzJyxcbiAgZmlsdGVydW5pdHM6ICdmaWx0ZXJVbml0cycsXG4gIGZsb29kb3BhY2l0eTogJ2Zsb29kT3BhY2l0eScsXG4gICdmbG9vZC1vcGFjaXR5JzogJ2Zsb29kT3BhY2l0eScsXG4gIGZsb29kY29sb3I6ICdmbG9vZENvbG9yJyxcbiAgJ2Zsb29kLWNvbG9yJzogJ2Zsb29kQ29sb3InLFxuICBmb2N1c2FibGU6ICdmb2N1c2FibGUnLFxuICBmb250ZmFtaWx5OiAnZm9udEZhbWlseScsXG4gICdmb250LWZhbWlseSc6ICdmb250RmFtaWx5JyxcbiAgZm9udHNpemU6ICdmb250U2l6ZScsXG4gICdmb250LXNpemUnOiAnZm9udFNpemUnLFxuICBmb250c2l6ZWFkanVzdDogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgJ2ZvbnQtc2l6ZS1hZGp1c3QnOiAnZm9udFNpemVBZGp1c3QnLFxuICBmb250c3RyZXRjaDogJ2ZvbnRTdHJldGNoJyxcbiAgJ2ZvbnQtc3RyZXRjaCc6ICdmb250U3RyZXRjaCcsXG4gIGZvbnRzdHlsZTogJ2ZvbnRTdHlsZScsXG4gICdmb250LXN0eWxlJzogJ2ZvbnRTdHlsZScsXG4gIGZvbnR2YXJpYW50OiAnZm9udFZhcmlhbnQnLFxuICAnZm9udC12YXJpYW50JzogJ2ZvbnRWYXJpYW50JyxcbiAgZm9udHdlaWdodDogJ2ZvbnRXZWlnaHQnLFxuICAnZm9udC13ZWlnaHQnOiAnZm9udFdlaWdodCcsXG4gIGZvcm1hdDogJ2Zvcm1hdCcsXG4gIGZyb206ICdmcm9tJyxcbiAgZng6ICdmeCcsXG4gIGZ5OiAnZnknLFxuICBnMTogJ2cxJyxcbiAgZzI6ICdnMicsXG4gIGdseXBobmFtZTogJ2dseXBoTmFtZScsXG4gICdnbHlwaC1uYW1lJzogJ2dseXBoTmFtZScsXG4gIGdseXBob3JpZW50YXRpb25ob3Jpem9udGFsOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCc6ICdnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCcsXG4gIGdseXBob3JpZW50YXRpb252ZXJ0aWNhbDogJ2dseXBoT3JpZW50YXRpb25WZXJ0aWNhbCcsXG4gICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCc6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICBnbHlwaHJlZjogJ2dseXBoUmVmJyxcbiAgZ3JhZGllbnR0cmFuc2Zvcm06ICdncmFkaWVudFRyYW5zZm9ybScsXG4gIGdyYWRpZW50dW5pdHM6ICdncmFkaWVudFVuaXRzJyxcbiAgaGFuZ2luZzogJ2hhbmdpbmcnLFxuICBob3JpemFkdng6ICdob3JpekFkdlgnLFxuICAnaG9yaXotYWR2LXgnOiAnaG9yaXpBZHZYJyxcbiAgaG9yaXpvcmlnaW54OiAnaG9yaXpPcmlnaW5YJyxcbiAgJ2hvcml6LW9yaWdpbi14JzogJ2hvcml6T3JpZ2luWCcsXG4gIGlkZW9ncmFwaGljOiAnaWRlb2dyYXBoaWMnLFxuICBpbWFnZXJlbmRlcmluZzogJ2ltYWdlUmVuZGVyaW5nJyxcbiAgJ2ltYWdlLXJlbmRlcmluZyc6ICdpbWFnZVJlbmRlcmluZycsXG4gIGluMjogJ2luMicsXG4gIGluOiAnaW4nLFxuICBpbmxpc3Q6ICdpbmxpc3QnLFxuICBpbnRlcmNlcHQ6ICdpbnRlcmNlcHQnLFxuICBrMTogJ2sxJyxcbiAgazI6ICdrMicsXG4gIGszOiAnazMnLFxuICBrNDogJ2s0JyxcbiAgazogJ2snLFxuICBrZXJuZWxtYXRyaXg6ICdrZXJuZWxNYXRyaXgnLFxuICBrZXJuZWx1bml0bGVuZ3RoOiAna2VybmVsVW5pdExlbmd0aCcsXG4gIGtlcm5pbmc6ICdrZXJuaW5nJyxcbiAga2V5cG9pbnRzOiAna2V5UG9pbnRzJyxcbiAga2V5c3BsaW5lczogJ2tleVNwbGluZXMnLFxuICBrZXl0aW1lczogJ2tleVRpbWVzJyxcbiAgbGVuZ3RoYWRqdXN0OiAnbGVuZ3RoQWRqdXN0JyxcbiAgbGV0dGVyc3BhY2luZzogJ2xldHRlclNwYWNpbmcnLFxuICAnbGV0dGVyLXNwYWNpbmcnOiAnbGV0dGVyU3BhY2luZycsXG4gIGxpZ2h0aW5nY29sb3I6ICdsaWdodGluZ0NvbG9yJyxcbiAgJ2xpZ2h0aW5nLWNvbG9yJzogJ2xpZ2h0aW5nQ29sb3InLFxuICBsaW1pdGluZ2NvbmVhbmdsZTogJ2xpbWl0aW5nQ29uZUFuZ2xlJyxcbiAgbG9jYWw6ICdsb2NhbCcsXG4gIG1hcmtlcmVuZDogJ21hcmtlckVuZCcsXG4gICdtYXJrZXItZW5kJzogJ21hcmtlckVuZCcsXG4gIG1hcmtlcmhlaWdodDogJ21hcmtlckhlaWdodCcsXG4gIG1hcmtlcm1pZDogJ21hcmtlck1pZCcsXG4gICdtYXJrZXItbWlkJzogJ21hcmtlck1pZCcsXG4gIG1hcmtlcnN0YXJ0OiAnbWFya2VyU3RhcnQnLFxuICAnbWFya2VyLXN0YXJ0JzogJ21hcmtlclN0YXJ0JyxcbiAgbWFya2VydW5pdHM6ICdtYXJrZXJVbml0cycsXG4gIG1hcmtlcndpZHRoOiAnbWFya2VyV2lkdGgnLFxuICBtYXNrOiAnbWFzaycsXG4gIG1hc2tjb250ZW50dW5pdHM6ICdtYXNrQ29udGVudFVuaXRzJyxcbiAgbWFza3VuaXRzOiAnbWFza1VuaXRzJyxcbiAgbWF0aGVtYXRpY2FsOiAnbWF0aGVtYXRpY2FsJyxcbiAgbW9kZTogJ21vZGUnLFxuICBudW1vY3RhdmVzOiAnbnVtT2N0YXZlcycsXG4gIG9mZnNldDogJ29mZnNldCcsXG4gIG9wYWNpdHk6ICdvcGFjaXR5JyxcbiAgb3BlcmF0b3I6ICdvcGVyYXRvcicsXG4gIG9yZGVyOiAnb3JkZXInLFxuICBvcmllbnQ6ICdvcmllbnQnLFxuICBvcmllbnRhdGlvbjogJ29yaWVudGF0aW9uJyxcbiAgb3JpZ2luOiAnb3JpZ2luJyxcbiAgb3ZlcmZsb3c6ICdvdmVyZmxvdycsXG4gIG92ZXJsaW5lcG9zaXRpb246ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgJ292ZXJsaW5lLXBvc2l0aW9uJzogJ292ZXJsaW5lUG9zaXRpb24nLFxuICBvdmVybGluZXRoaWNrbmVzczogJ292ZXJsaW5lVGhpY2tuZXNzJyxcbiAgJ292ZXJsaW5lLXRoaWNrbmVzcyc6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gIHBhaW50b3JkZXI6ICdwYWludE9yZGVyJyxcbiAgJ3BhaW50LW9yZGVyJzogJ3BhaW50T3JkZXInLFxuICBwYW5vc2UxOiAncGFub3NlMScsXG4gICdwYW5vc2UtMSc6ICdwYW5vc2UxJyxcbiAgcGF0aGxlbmd0aDogJ3BhdGhMZW5ndGgnLFxuICBwYXR0ZXJuY29udGVudHVuaXRzOiAncGF0dGVybkNvbnRlbnRVbml0cycsXG4gIHBhdHRlcm50cmFuc2Zvcm06ICdwYXR0ZXJuVHJhbnNmb3JtJyxcbiAgcGF0dGVybnVuaXRzOiAncGF0dGVyblVuaXRzJyxcbiAgcG9pbnRlcmV2ZW50czogJ3BvaW50ZXJFdmVudHMnLFxuICAncG9pbnRlci1ldmVudHMnOiAncG9pbnRlckV2ZW50cycsXG4gIHBvaW50czogJ3BvaW50cycsXG4gIHBvaW50c2F0eDogJ3BvaW50c0F0WCcsXG4gIHBvaW50c2F0eTogJ3BvaW50c0F0WScsXG4gIHBvaW50c2F0ejogJ3BvaW50c0F0WicsXG4gIHByZWZpeDogJ3ByZWZpeCcsXG4gIHByZXNlcnZlYWxwaGE6ICdwcmVzZXJ2ZUFscGhhJyxcbiAgcHJlc2VydmVhc3BlY3RyYXRpbzogJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLFxuICBwcmltaXRpdmV1bml0czogJ3ByaW1pdGl2ZVVuaXRzJyxcbiAgcHJvcGVydHk6ICdwcm9wZXJ0eScsXG4gIHI6ICdyJyxcbiAgcmFkaXVzOiAncmFkaXVzJyxcbiAgcmVmeDogJ3JlZlgnLFxuICByZWZ5OiAncmVmWScsXG4gIHJlbmRlcmluZ2ludGVudDogJ3JlbmRlcmluZ0ludGVudCcsXG4gICdyZW5kZXJpbmctaW50ZW50JzogJ3JlbmRlcmluZ0ludGVudCcsXG4gIHJlcGVhdGNvdW50OiAncmVwZWF0Q291bnQnLFxuICByZXBlYXRkdXI6ICdyZXBlYXREdXInLFxuICByZXF1aXJlZGV4dGVuc2lvbnM6ICdyZXF1aXJlZEV4dGVuc2lvbnMnLFxuICByZXF1aXJlZGZlYXR1cmVzOiAncmVxdWlyZWRGZWF0dXJlcycsXG4gIHJlc291cmNlOiAncmVzb3VyY2UnLFxuICByZXN0YXJ0OiAncmVzdGFydCcsXG4gIHJlc3VsdDogJ3Jlc3VsdCcsXG4gIHJlc3VsdHM6ICdyZXN1bHRzJyxcbiAgcm90YXRlOiAncm90YXRlJyxcbiAgcng6ICdyeCcsXG4gIHJ5OiAncnknLFxuICBzY2FsZTogJ3NjYWxlJyxcbiAgc2VjdXJpdHk6ICdzZWN1cml0eScsXG4gIHNlZWQ6ICdzZWVkJyxcbiAgc2hhcGVyZW5kZXJpbmc6ICdzaGFwZVJlbmRlcmluZycsXG4gICdzaGFwZS1yZW5kZXJpbmcnOiAnc2hhcGVSZW5kZXJpbmcnLFxuICBzbG9wZTogJ3Nsb3BlJyxcbiAgc3BhY2luZzogJ3NwYWNpbmcnLFxuICBzcGVjdWxhcmNvbnN0YW50OiAnc3BlY3VsYXJDb25zdGFudCcsXG4gIHNwZWN1bGFyZXhwb25lbnQ6ICdzcGVjdWxhckV4cG9uZW50JyxcbiAgc3BlZWQ6ICdzcGVlZCcsXG4gIHNwcmVhZG1ldGhvZDogJ3NwcmVhZE1ldGhvZCcsXG4gIHN0YXJ0b2Zmc2V0OiAnc3RhcnRPZmZzZXQnLFxuICBzdGRkZXZpYXRpb246ICdzdGREZXZpYXRpb24nLFxuICBzdGVtaDogJ3N0ZW1oJyxcbiAgc3RlbXY6ICdzdGVtdicsXG4gIHN0aXRjaHRpbGVzOiAnc3RpdGNoVGlsZXMnLFxuICBzdG9wY29sb3I6ICdzdG9wQ29sb3InLFxuICAnc3RvcC1jb2xvcic6ICdzdG9wQ29sb3InLFxuICBzdG9wb3BhY2l0eTogJ3N0b3BPcGFjaXR5JyxcbiAgJ3N0b3Atb3BhY2l0eSc6ICdzdG9wT3BhY2l0eScsXG4gIHN0cmlrZXRocm91Z2hwb3NpdGlvbjogJ3N0cmlrZXRocm91Z2hQb3NpdGlvbicsXG4gICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJzogJ3N0cmlrZXRocm91Z2hQb3NpdGlvbicsXG4gIHN0cmlrZXRocm91Z2h0aGlja25lc3M6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJzogJ3N0cmlrZXRocm91Z2hUaGlja25lc3MnLFxuICBzdHJpbmc6ICdzdHJpbmcnLFxuICBzdHJva2U6ICdzdHJva2UnLFxuICBzdHJva2VkYXNoYXJyYXk6ICdzdHJva2VEYXNoYXJyYXknLFxuICAnc3Ryb2tlLWRhc2hhcnJheSc6ICdzdHJva2VEYXNoYXJyYXknLFxuICBzdHJva2VkYXNob2Zmc2V0OiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gICdzdHJva2UtZGFzaG9mZnNldCc6ICdzdHJva2VEYXNob2Zmc2V0JyxcbiAgc3Ryb2tlbGluZWNhcDogJ3N0cm9rZUxpbmVjYXAnLFxuICAnc3Ryb2tlLWxpbmVjYXAnOiAnc3Ryb2tlTGluZWNhcCcsXG4gIHN0cm9rZWxpbmVqb2luOiAnc3Ryb2tlTGluZWpvaW4nLFxuICAnc3Ryb2tlLWxpbmVqb2luJzogJ3N0cm9rZUxpbmVqb2luJyxcbiAgc3Ryb2tlbWl0ZXJsaW1pdDogJ3N0cm9rZU1pdGVybGltaXQnLFxuICAnc3Ryb2tlLW1pdGVybGltaXQnOiAnc3Ryb2tlTWl0ZXJsaW1pdCcsXG4gIHN0cm9rZXdpZHRoOiAnc3Ryb2tlV2lkdGgnLFxuICAnc3Ryb2tlLXdpZHRoJzogJ3N0cm9rZVdpZHRoJyxcbiAgc3Ryb2tlb3BhY2l0eTogJ3N0cm9rZU9wYWNpdHknLFxuICAnc3Ryb2tlLW9wYWNpdHknOiAnc3Ryb2tlT3BhY2l0eScsXG4gIHN1cHByZXNzY29udGVudGVkaXRhYmxld2FybmluZzogJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZycsXG4gIHN1cHByZXNzaHlkcmF0aW9ud2FybmluZzogJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZycsXG4gIHN1cmZhY2VzY2FsZTogJ3N1cmZhY2VTY2FsZScsXG4gIHN5c3RlbWxhbmd1YWdlOiAnc3lzdGVtTGFuZ3VhZ2UnLFxuICB0YWJsZXZhbHVlczogJ3RhYmxlVmFsdWVzJyxcbiAgdGFyZ2V0eDogJ3RhcmdldFgnLFxuICB0YXJnZXR5OiAndGFyZ2V0WScsXG4gIHRleHRhbmNob3I6ICd0ZXh0QW5jaG9yJyxcbiAgJ3RleHQtYW5jaG9yJzogJ3RleHRBbmNob3InLFxuICB0ZXh0ZGVjb3JhdGlvbjogJ3RleHREZWNvcmF0aW9uJyxcbiAgJ3RleHQtZGVjb3JhdGlvbic6ICd0ZXh0RGVjb3JhdGlvbicsXG4gIHRleHRsZW5ndGg6ICd0ZXh0TGVuZ3RoJyxcbiAgdGV4dHJlbmRlcmluZzogJ3RleHRSZW5kZXJpbmcnLFxuICAndGV4dC1yZW5kZXJpbmcnOiAndGV4dFJlbmRlcmluZycsXG4gIHRvOiAndG8nLFxuICB0cmFuc2Zvcm06ICd0cmFuc2Zvcm0nLFxuICB0eXBlb2Y6ICd0eXBlb2YnLFxuICB1MTogJ3UxJyxcbiAgdTI6ICd1MicsXG4gIHVuZGVybGluZXBvc2l0aW9uOiAndW5kZXJsaW5lUG9zaXRpb24nLFxuICAndW5kZXJsaW5lLXBvc2l0aW9uJzogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgdW5kZXJsaW5ldGhpY2tuZXNzOiAndW5kZXJsaW5lVGhpY2tuZXNzJyxcbiAgJ3VuZGVybGluZS10aGlja25lc3MnOiAndW5kZXJsaW5lVGhpY2tuZXNzJyxcbiAgdW5pY29kZTogJ3VuaWNvZGUnLFxuICB1bmljb2RlYmlkaTogJ3VuaWNvZGVCaWRpJyxcbiAgJ3VuaWNvZGUtYmlkaSc6ICd1bmljb2RlQmlkaScsXG4gIHVuaWNvZGVyYW5nZTogJ3VuaWNvZGVSYW5nZScsXG4gICd1bmljb2RlLXJhbmdlJzogJ3VuaWNvZGVSYW5nZScsXG4gIHVuaXRzcGVyZW06ICd1bml0c1BlckVtJyxcbiAgJ3VuaXRzLXBlci1lbSc6ICd1bml0c1BlckVtJyxcbiAgdW5zZWxlY3RhYmxlOiAndW5zZWxlY3RhYmxlJyxcbiAgdmFscGhhYmV0aWM6ICd2QWxwaGFiZXRpYycsXG4gICd2LWFscGhhYmV0aWMnOiAndkFscGhhYmV0aWMnLFxuICB2YWx1ZXM6ICd2YWx1ZXMnLFxuICB2ZWN0b3JlZmZlY3Q6ICd2ZWN0b3JFZmZlY3QnLFxuICAndmVjdG9yLWVmZmVjdCc6ICd2ZWN0b3JFZmZlY3QnLFxuICB2ZXJzaW9uOiAndmVyc2lvbicsXG4gIHZlcnRhZHZ5OiAndmVydEFkdlknLFxuICAndmVydC1hZHYteSc6ICd2ZXJ0QWR2WScsXG4gIHZlcnRvcmlnaW54OiAndmVydE9yaWdpblgnLFxuICAndmVydC1vcmlnaW4teCc6ICd2ZXJ0T3JpZ2luWCcsXG4gIHZlcnRvcmlnaW55OiAndmVydE9yaWdpblknLFxuICAndmVydC1vcmlnaW4teSc6ICd2ZXJ0T3JpZ2luWScsXG4gIHZoYW5naW5nOiAndkhhbmdpbmcnLFxuICAndi1oYW5naW5nJzogJ3ZIYW5naW5nJyxcbiAgdmlkZW9ncmFwaGljOiAndklkZW9ncmFwaGljJyxcbiAgJ3YtaWRlb2dyYXBoaWMnOiAndklkZW9ncmFwaGljJyxcbiAgdmlld2JveDogJ3ZpZXdCb3gnLFxuICB2aWV3dGFyZ2V0OiAndmlld1RhcmdldCcsXG4gIHZpc2liaWxpdHk6ICd2aXNpYmlsaXR5JyxcbiAgdm1hdGhlbWF0aWNhbDogJ3ZNYXRoZW1hdGljYWwnLFxuICAndi1tYXRoZW1hdGljYWwnOiAndk1hdGhlbWF0aWNhbCcsXG4gIHZvY2FiOiAndm9jYWInLFxuICB3aWR0aHM6ICd3aWR0aHMnLFxuICB3b3Jkc3BhY2luZzogJ3dvcmRTcGFjaW5nJyxcbiAgJ3dvcmQtc3BhY2luZyc6ICd3b3JkU3BhY2luZycsXG4gIHdyaXRpbmdtb2RlOiAnd3JpdGluZ01vZGUnLFxuICAnd3JpdGluZy1tb2RlJzogJ3dyaXRpbmdNb2RlJyxcbiAgeDE6ICd4MScsXG4gIHgyOiAneDInLFxuICB4OiAneCcsXG4gIHhjaGFubmVsc2VsZWN0b3I6ICd4Q2hhbm5lbFNlbGVjdG9yJyxcbiAgeGhlaWdodDogJ3hIZWlnaHQnLFxuICAneC1oZWlnaHQnOiAneEhlaWdodCcsXG4gIHhsaW5rYWN0dWF0ZTogJ3hsaW5rQWN0dWF0ZScsXG4gICd4bGluazphY3R1YXRlJzogJ3hsaW5rQWN0dWF0ZScsXG4gIHhsaW5rYXJjcm9sZTogJ3hsaW5rQXJjcm9sZScsXG4gICd4bGluazphcmNyb2xlJzogJ3hsaW5rQXJjcm9sZScsXG4gIHhsaW5raHJlZjogJ3hsaW5rSHJlZicsXG4gICd4bGluazpocmVmJzogJ3hsaW5rSHJlZicsXG4gIHhsaW5rcm9sZTogJ3hsaW5rUm9sZScsXG4gICd4bGluazpyb2xlJzogJ3hsaW5rUm9sZScsXG4gIHhsaW5rc2hvdzogJ3hsaW5rU2hvdycsXG4gICd4bGluazpzaG93JzogJ3hsaW5rU2hvdycsXG4gIHhsaW5rdGl0bGU6ICd4bGlua1RpdGxlJyxcbiAgJ3hsaW5rOnRpdGxlJzogJ3hsaW5rVGl0bGUnLFxuICB4bGlua3R5cGU6ICd4bGlua1R5cGUnLFxuICAneGxpbms6dHlwZSc6ICd4bGlua1R5cGUnLFxuICB4bWxiYXNlOiAneG1sQmFzZScsXG4gICd4bWw6YmFzZSc6ICd4bWxCYXNlJyxcbiAgeG1sbGFuZzogJ3htbExhbmcnLFxuICAneG1sOmxhbmcnOiAneG1sTGFuZycsXG4gIHhtbG5zOiAneG1sbnMnLFxuICAneG1sOnNwYWNlJzogJ3htbFNwYWNlJyxcbiAgeG1sbnN4bGluazogJ3htbG5zWGxpbmsnLFxuICAneG1sbnM6eGxpbmsnOiAneG1sbnNYbGluaycsXG4gIHhtbHNwYWNlOiAneG1sU3BhY2UnLFxuICB5MTogJ3kxJyxcbiAgeTI6ICd5MicsXG4gIHk6ICd5JyxcbiAgeWNoYW5uZWxzZWxlY3RvcjogJ3lDaGFubmVsU2VsZWN0b3InLFxuICB6OiAneicsXG4gIHpvb21hbmRwYW46ICd6b29tQW5kUGFuJ1xufTtcblxudmFyIGFyaWFQcm9wZXJ0aWVzID0ge1xuICAnYXJpYS1jdXJyZW50JzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtZGVzY3JpcHRpb24nOiAwLFxuICAnYXJpYS1kZXRhaWxzJzogMCxcbiAgJ2FyaWEtZGlzYWJsZWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1oaWRkZW4nOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1pbnZhbGlkJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEta2V5c2hvcnRjdXRzJzogMCxcbiAgJ2FyaWEtbGFiZWwnOiAwLFxuICAnYXJpYS1yb2xlZGVzY3JpcHRpb24nOiAwLFxuICAvLyBXaWRnZXQgQXR0cmlidXRlc1xuICAnYXJpYS1hdXRvY29tcGxldGUnOiAwLFxuICAnYXJpYS1jaGVja2VkJzogMCxcbiAgJ2FyaWEtZXhwYW5kZWQnOiAwLFxuICAnYXJpYS1oYXNwb3B1cCc6IDAsXG4gICdhcmlhLWxldmVsJzogMCxcbiAgJ2FyaWEtbW9kYWwnOiAwLFxuICAnYXJpYS1tdWx0aWxpbmUnOiAwLFxuICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnOiAwLFxuICAnYXJpYS1vcmllbnRhdGlvbic6IDAsXG4gICdhcmlhLXBsYWNlaG9sZGVyJzogMCxcbiAgJ2FyaWEtcHJlc3NlZCc6IDAsXG4gICdhcmlhLXJlYWRvbmx5JzogMCxcbiAgJ2FyaWEtcmVxdWlyZWQnOiAwLFxuICAnYXJpYS1zZWxlY3RlZCc6IDAsXG4gICdhcmlhLXNvcnQnOiAwLFxuICAnYXJpYS12YWx1ZW1heCc6IDAsXG4gICdhcmlhLXZhbHVlbWluJzogMCxcbiAgJ2FyaWEtdmFsdWVub3cnOiAwLFxuICAnYXJpYS12YWx1ZXRleHQnOiAwLFxuICAvLyBMaXZlIFJlZ2lvbiBBdHRyaWJ1dGVzXG4gICdhcmlhLWF0b21pYyc6IDAsXG4gICdhcmlhLWJ1c3knOiAwLFxuICAnYXJpYS1saXZlJzogMCxcbiAgJ2FyaWEtcmVsZXZhbnQnOiAwLFxuICAvLyBEcmFnLWFuZC1Ecm9wIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtZHJvcGVmZmVjdCc6IDAsXG4gICdhcmlhLWdyYWJiZWQnOiAwLFxuICAvLyBSZWxhdGlvbnNoaXAgQXR0cmlidXRlc1xuICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogMCxcbiAgJ2FyaWEtY29sY291bnQnOiAwLFxuICAnYXJpYS1jb2xpbmRleCc6IDAsXG4gICdhcmlhLWNvbHNwYW4nOiAwLFxuICAnYXJpYS1jb250cm9scyc6IDAsXG4gICdhcmlhLWRlc2NyaWJlZGJ5JzogMCxcbiAgJ2FyaWEtZXJyb3JtZXNzYWdlJzogMCxcbiAgJ2FyaWEtZmxvd3RvJzogMCxcbiAgJ2FyaWEtbGFiZWxsZWRieSc6IDAsXG4gICdhcmlhLW93bnMnOiAwLFxuICAnYXJpYS1wb3NpbnNldCc6IDAsXG4gICdhcmlhLXJvd2NvdW50JzogMCxcbiAgJ2FyaWEtcm93aW5kZXgnOiAwLFxuICAnYXJpYS1yb3dzcGFuJzogMCxcbiAgJ2FyaWEtc2V0c2l6ZSc6IDBcbn07XG5cbnZhciB3YXJuZWRQcm9wZXJ0aWVzID0ge307XG52YXIgckFSSUEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciByQVJJQUNhbWVsID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KHRhZ05hbWUsIG5hbWUpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChyQVJJQUNhbWVsLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBhcmlhTmFtZSA9ICdhcmlhLScgKyBuYW1lLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgY29ycmVjdE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShhcmlhTmFtZSkgPyBhcmlhTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoY29ycmVjdE5hbWUgPT0gbnVsbCkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBBUklBIGF0dHJpYnV0ZXMgZm9sbG93IHRoZSBwYXR0ZXJuIGFyaWEtKiBhbmQgbXVzdCBiZSBsb3dlcmNhc2UuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cblxuXG4gICAgICBpZiAobmFtZSAhPT0gY29ycmVjdE5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgY29ycmVjdE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAockFSSUEudGVzdChuYW1lKSkge1xuICAgICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IGxvd2VyQ2FzZWROYW1lIDogbnVsbDsgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG5cbiAgICAgIGlmIChzdGFuZGFyZE5hbWUgPT0gbnVsbCkge1xuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cblxuXG4gICAgICBpZiAobmFtZSAhPT0gc3RhbmRhcmROYW1lKSB7XG4gICAgICAgIGVycm9yKCdVbmtub3duIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgdmFyIGludmFsaWRQcm9wcyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkodHlwZSwga2V5KTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIGludmFsaWRQcm9wcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gaW52YWxpZFByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gICAgfSkuam9pbignLCAnKTtcblxuICAgIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3AgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1hcmlhLXByb3BzJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH0gZWxzZSBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGFyaWEgcHJvcHMgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1hcmlhLXByb3BzJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXModHlwZSwgcHJvcHMpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKTtcbn1cblxudmFyIGRpZFdhcm5WYWx1ZU51bGwgPSBmYWxzZTtcbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQxKHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAodHlwZSAhPT0gJ2lucHV0JyAmJiB0eXBlICE9PSAndGV4dGFyZWEnICYmIHR5cGUgIT09ICdzZWxlY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BzICE9IG51bGwgJiYgcHJvcHMudmFsdWUgPT09IG51bGwgJiYgIWRpZFdhcm5WYWx1ZU51bGwpIHtcbiAgICAgIGRpZFdhcm5WYWx1ZU51bGwgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcgJiYgcHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgZXJyb3IoJ2B2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gJyArICdDb25zaWRlciB1c2luZyBhbiBlbXB0eSBhcnJheSB3aGVuIGBtdWx0aXBsZWAgaXMgc2V0IHRvIGB0cnVlYCAnICsgJ3RvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ2B2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gJyArICdDb25zaWRlciB1c2luZyBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCAnICsgJ2ZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIHZhciB3YXJuZWRQcm9wZXJ0aWVzJDEgPSB7fTtcbiAgdmFyIEVWRU5UX05BTUVfUkVHRVggPSAvXm9uLi87XG4gIHZhciBJTlZBTElEX0VWRU5UX05BTUVfUkVHRVggPSAvXm9uW15BLVpdLztcbiAgdmFyIHJBUklBJDEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbiAgdmFyIHJBUklBQ2FtZWwkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuICB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAodGFnTmFtZSwgbmFtZSwgdmFsdWUsIGV2ZW50UmVnaXN0cnkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzJDEsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7XG4gICAgICBlcnJvcignUmVhY3QgdXNlcyBvbkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQuICcgKyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2UgY2FuJ3QgcmVseSBvbiB0aGUgZXZlbnQgc3lzdGVtIGJlaW5nIGluamVjdGVkIG9uIHRoZSBzZXJ2ZXIuXG5cblxuICAgIGlmIChldmVudFJlZ2lzdHJ5ICE9IG51bGwpIHtcbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0gZXZlbnRSZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBldmVudFJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBJdCB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIElmIG5vIGV2ZW50IHBsdWdpbnMgaGF2ZSBiZWVuIGluamVjdGVkLCB3ZSBhcmUgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQuXG4gICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyXG4gICAgICAvLyBvdXQga25vd24gYmFkIG9uZXMgbGlrZSBgb25jbGlja2AuIFdlIGNhbid0IHN1Z2dlc3QgYSBzcGVjaWZpYyByZXBsYWNlbWVudCB0aG91Z2guXG4gICAgICBpZiAoSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiAnICsgJ1JlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBMZXQgdGhlIEFSSUEgYXR0cmlidXRlIGhvb2sgdmFsaWRhdGUgQVJJQSBhdHRyaWJ1dGVzXG5cblxuICAgIGlmIChyQVJJQSQxLnRlc3QobmFtZSkgfHwgckFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lubmVyaHRtbCcpIHtcbiAgICAgIGVycm9yKCdEaXJlY3RseSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIGxvb2t1cCBkb2N1bWVudGF0aW9uIG9uIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdhcmlhJykge1xuICAgICAgZXJyb3IoJ1RoZSBgYXJpYWAgYXR0cmlidXRlIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGluIFJlYWN0LiAnICsgJ1Bhc3MgaW5kaXZpZHVhbCBgYXJpYS1gIGF0dHJpYnV0ZXMgaW5zdGVhZC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lzJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhIGAlc2AgZm9yIGEgc3RyaW5nIGF0dHJpYnV0ZSBgaXNgLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBOYU4gZm9yIHRoZSBgJXNgIGF0dHJpYnV0ZS4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCBuYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEOyAvLyBLbm93biBhdHRyaWJ1dGVzIHNob3VsZCBtYXRjaCB0aGUgY2FzaW5nIHNwZWNpZmllZCBpbiB0aGUgcHJvcGVydHkgY29uZmlnLlxuXG4gICAgaWYgKHBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdO1xuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIERPTSBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQgJiYgbmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpIHtcbiAgICAgIC8vIFVua25vd24gYXR0cmlidXRlcyBzaG91bGQgaGF2ZSBsb3dlcmNhc2UgY2FzaW5nIHNpbmNlIHRoYXQncyBob3cgdGhleVxuICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgICAgZXJyb3IoJ1JlYWN0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgYCVzYCBwcm9wIG9uIGEgRE9NIGVsZW1lbnQuIElmIHlvdSAnICsgJ2ludGVudGlvbmFsbHkgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIERPTSBhcyBhIGN1c3RvbSAnICsgJ2F0dHJpYnV0ZSwgc3BlbGwgaXQgYXMgbG93ZXJjYXNlIGAlc2AgaW5zdGVhZC4gJyArICdJZiB5b3UgYWNjaWRlbnRhbGx5IHBhc3NlZCBpdCBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCwgcmVtb3ZlICcgKyAnaXQgZnJvbSB0aGUgRE9NIGVsZW1lbnQuJywgbmFtZSwgbG93ZXJDYXNlZE5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUsIG5hbWUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGVcbiAgICAvLyBkYXRhIHR5cGVzIGZvciByZXNlcnZlZCBwcm9wc1xuXG5cbiAgICBpZiAoaXNSZXNlcnZlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXYXJuIHdoZW4gYSBrbm93biBhdHRyaWJ1dGUgaXMgYSBiYWQgdHlwZVxuXG5cbiAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gV2FybiB3aGVuIHBhc3NpbmcgdGhlIHN0cmluZ3MgJ2ZhbHNlJyBvciAndHJ1ZScgaW50byBhIGJvb2xlYW4gcHJvcFxuXG5cbiAgICBpZiAoKHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZScpICYmIHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIHRoZSBzdHJpbmcgYCVzYCBmb3IgdGhlIGJvb2xlYW4gYXR0cmlidXRlIGAlc2AuICcgKyAnJXMgJyArICdEaWQgeW91IG1lYW4gJXM9eyVzfT8nLCB2YWx1ZSwgbmFtZSwgdmFsdWUgPT09ICdmYWxzZScgPyAnVGhlIGJyb3dzZXIgd2lsbCBpbnRlcnByZXQgaXQgYXMgYSB0cnV0aHkgdmFsdWUuJyA6ICdBbHRob3VnaCB0aGlzIHdvcmtzLCBpdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgXCJmYWxzZVwiLicsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG52YXIgd2FyblVua25vd25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIHtcbiAgICB2YXIgdW5rbm93blByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSQxKHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAodW5rbm93blByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHByb3AgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgaXQgZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIGl0IGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZXMgZm9yIHByb3BzICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIHRoZW0gaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSk7XG59XG5cbnZhciBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSA9IDE7XG52YXIgSVNfTk9OX0RFTEVHQVRFRCA9IDEgPDwgMTtcbnZhciBJU19DQVBUVVJFX1BIQVNFID0gMSA8PCAyO1xuLy8gc2V0IHRvIExFR0FDWV9GQl9TVVBQT1JULiBMRUdBQ1lfRkJfU1VQUE9SVCBvbmx5IGdldHMgc2V0IHdoZW5cbi8vIHdlIGNhbGwgd2lsbERlZmVyTGF0ZXJGb3JMZWdhY3lGQlN1cHBvcnQsIHRodXMgbm90IGJhaWxpbmcgb3V0XG4vLyB3aWxsIHJlc3VsdCBpbiBlbmRsZXNzIGN5Y2xlcyBsaWtlIGFuIGluZmluaXRlIGxvb3AuXG4vLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gZGVmZXIgZHVyaW5nIGV2ZW50IHJlcGxheWluZy5cblxudmFyIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TID0gSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgfCBJU19OT05fREVMRUdBVEVEIHwgSVNfQ0FQVFVSRV9QSEFTRTtcblxuLy8gVGhpcyBleGlzdHMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIFJlYWN0RE9NRXZlbnRSZXBsYXlpbmdcbi8vIGFuZCBET01QbHVnaW5FdmVudFN5c3RlbS5cbnZhciBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBudWxsO1xuZnVuY3Rpb24gc2V0UmVwbGF5aW5nRXZlbnQoZXZlbnQpIHtcbiAge1xuICAgIGlmIChjdXJyZW50UmVwbGF5aW5nRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBjdXJyZW50bHkgcmVwbGF5aW5nIGV2ZW50IHRvIGJlIG51bGwuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBldmVudDtcbn1cbmZ1bmN0aW9uIHJlc2V0UmVwbGF5aW5nRXZlbnQoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudFJlcGxheWluZ0V2ZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgY3VycmVudGx5IHJlcGxheWluZyBldmVudCB0byBub3QgYmUgbnVsbC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7XG59XG5mdW5jdGlvbiBpc1JlcGxheWluZ0V2ZW50KGV2ZW50KSB7XG4gIHJldHVybiBldmVudCA9PT0gY3VycmVudFJlcGxheWluZ0V2ZW50O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHRhcmdldCBub2RlIGZyb20gYSBuYXRpdmUgYnJvd3NlciBldmVudCBieSBhY2NvdW50aW5nIGZvclxuICogaW5jb25zaXN0ZW5jaWVzIGluIGJyb3dzZXIgRE9NIEFQSXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7RE9NRXZlbnRUYXJnZXR9IFRhcmdldCBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSB7XG4gIC8vIEZhbGxiYWNrIHRvIG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgZm9yIElFOVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyNTA2XG4gIHZhciB0YXJnZXQgPSBuYXRpdmVFdmVudC50YXJnZXQgfHwgbmF0aXZlRXZlbnQuc3JjRWxlbWVudCB8fCB3aW5kb3c7IC8vIE5vcm1hbGl6ZSBTVkcgPHVzZT4gZWxlbWVudCBldmVudHMgIzQ5NjNcblxuICBpZiAodGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSB7XG4gICAgdGFyZ2V0ID0gdGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50O1xuICB9IC8vIFNhZmFyaSBtYXkgZmlyZSBldmVudHMgb24gdGV4dCBub2RlcyAoTm9kZS5URVhUX05PREUgaXMgMykuXG4gIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfcHJvcGVydGllcy5odG1sXG5cblxuICByZXR1cm4gdGFyZ2V0Lm5vZGVUeXBlID09PSBURVhUX05PREUgPyB0YXJnZXQucGFyZW50Tm9kZSA6IHRhcmdldDtcbn1cblxudmFyIHJlc3RvcmVJbXBsID0gbnVsbDtcbnZhciByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbnZhciByZXN0b3JlUXVldWUgPSBudWxsO1xuXG5mdW5jdGlvbiByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpIHtcbiAgLy8gV2UgcGVyZm9ybSB0aGlzIHRyYW5zbGF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IGxvb3Agc28gdGhhdCB3ZVxuICAvLyBhbHdheXMgcmVjZWl2ZSB0aGUgY29ycmVjdCBmaWJlciBoZXJlXG4gIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXQpO1xuXG4gIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgIC8vIFVubW91bnRlZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVzdG9yZUltcGwgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFJlc3RvcmVJbXBsZW1lbnRhdGlvbigpIG5lZWRzIHRvIGJlIGNhbGxlZCB0byBoYW5kbGUgYSB0YXJnZXQgZm9yIGNvbnRyb2xsZWQgJyArICdldmVudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB2YXIgc3RhdGVOb2RlID0gaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGU7IC8vIEd1YXJkIGFnYWluc3QgRmliZXIgYmVpbmcgdW5tb3VudGVkLlxuXG4gIGlmIChzdGF0ZU5vZGUpIHtcbiAgICB2YXIgX3Byb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gICAgcmVzdG9yZUltcGwoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUsIGludGVybmFsSW5zdGFuY2UudHlwZSwgX3Byb3BzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oaW1wbCkge1xuICByZXN0b3JlSW1wbCA9IGltcGw7XG59XG5mdW5jdGlvbiBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCkge1xuICBpZiAocmVzdG9yZVRhcmdldCkge1xuICAgIGlmIChyZXN0b3JlUXVldWUpIHtcbiAgICAgIHJlc3RvcmVRdWV1ZS5wdXNoKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RvcmVRdWV1ZSA9IFt0YXJnZXRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN0b3JlVGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG59XG5mdW5jdGlvbiBuZWVkc1N0YXRlUmVzdG9yZSgpIHtcbiAgcmV0dXJuIHJlc3RvcmVUYXJnZXQgIT09IG51bGwgfHwgcmVzdG9yZVF1ZXVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlSWZOZWVkZWQoKSB7XG4gIGlmICghcmVzdG9yZVRhcmdldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSByZXN0b3JlVGFyZ2V0O1xuICB2YXIgcXVldWVkVGFyZ2V0cyA9IHJlc3RvcmVRdWV1ZTtcbiAgcmVzdG9yZVRhcmdldCA9IG51bGw7XG4gIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG4gIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCk7XG5cbiAgaWYgKHF1ZXVlZFRhcmdldHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHF1ZXVlZFRhcmdldHNbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyB0aGUgcmVuZGVyZXIuIFN1Y2ggYXMgd2hlbiB3ZSdyZSBkaXNwYXRjaGluZyBldmVudHMgb3IgaWYgdGhpcmQgcGFydHlcbi8vIGxpYnJhcmllcyBuZWVkIHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMuIEV2ZW50dWFsbHksIHRoaXMgQVBJIHdpbGwgZ28gYXdheSB3aGVuXG4vLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZlxuLy8gc2NoZWR1bGVkIHdvcmsgYW5kIGluc3RlYWQgZG8gc3luY2hyb25vdXMgd29yay5cbi8vIERlZmF1bHRzXG5cbnZhciBiYXRjaGVkVXBkYXRlc0ltcGwgPSBmdW5jdGlvbiAoZm4sIGJvb2trZWVwaW5nKSB7XG4gIHJldHVybiBmbihib29ra2VlcGluZyk7XG59O1xuXG52YXIgZmx1c2hTeW5jSW1wbCA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmluaXNoRXZlbnRIYW5kbGVyKCkge1xuICAvLyBIZXJlIHdlIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAgLy8gd2hlbiB1c2luZyBjb250cm9sbGVkIGNvbXBvbmVudHMgd2l0aGluIGxheWVyczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjk4XG4gIC8vIFRoZW4gd2UgcmVzdG9yZSBzdGF0ZSBvZiBhbnkgY29udHJvbGxlZCBjb21wb25lbnQuXG4gIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7XG5cbiAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7XG4gICAgLy8gSWYgYSBjb250cm9sbGVkIGV2ZW50IHdhcyBmaXJlZCwgd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2ZcbiAgICAvLyB0aGUgRE9NIG5vZGUgYmFjayB0byB0aGUgY29udHJvbGxlZCB2YWx1ZS4gVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiBSZWFjdFxuICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS5cbiAgICAvLyBUT0RPOiBSZXN0b3JlIHN0YXRlIGluIHRoZSBtaWNyb3Rhc2ssIGFmdGVyIHRoZSBkaXNjcmV0ZSB1cGRhdGVzIGZsdXNoLFxuICAgIC8vIGluc3RlYWQgb2YgZWFybHkgZmx1c2hpbmcgdGhlbSBoZXJlLlxuICAgIGZsdXNoU3luY0ltcGwoKTtcbiAgICByZXN0b3JlU3RhdGVJZk5lZWRlZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBhLCBiKSB7XG4gIGlmIChpc0luc2lkZUV2ZW50SGFuZGxlcikge1xuICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgaW5zaWRlIGFub3RoZXIgYmF0Y2gsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdFxuICAgIC8vIGZ1bGx5IGNvbXBsZXRlcyBiZWZvcmUgcmVzdG9yaW5nIHN0YXRlLlxuICAgIHJldHVybiBmbihhLCBiKTtcbiAgfVxuXG4gIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIHJldHVybiBiYXRjaGVkVXBkYXRlc0ltcGwoZm4sIGEsIGIpO1xuICB9IGZpbmFsbHkge1xuICAgIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG4gICAgZmluaXNoRXZlbnRIYW5kbGVyKCk7XG4gIH1cbn0gLy8gVE9ETzogUmVwbGFjZSB3aXRoIGZsdXNoU3luY1xuZnVuY3Rpb24gc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihfYmF0Y2hlZFVwZGF0ZXNJbXBsLCBfZGlzY3JldGVVcGRhdGVzSW1wbCwgX2ZsdXNoU3luY0ltcGwpIHtcbiAgYmF0Y2hlZFVwZGF0ZXNJbXBsID0gX2JhdGNoZWRVcGRhdGVzSW1wbDtcbiAgZmx1c2hTeW5jSW1wbCA9IF9mbHVzaFN5bmNJbXBsO1xufVxuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKHRhZykge1xuICByZXR1cm4gdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYSc7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KG5hbWUsIHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ29uQ2xpY2snOlxuICAgIGNhc2UgJ29uQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZURvd24nOlxuICAgIGNhc2UgJ29uTW91c2VEb3duQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZVVwJzpcbiAgICBjYXNlICdvbk1vdXNlVXBDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRW50ZXInOlxuICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICB2YXIgc3RhdGVOb2RlID0gaW5zdC5zdGF0ZU5vZGU7XG5cbiAgaWYgKHN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MgKGV4OiBvbmxvYWQgZXZlbnRzIGluIGluY3JlbWVudGFsIG1vZGUpLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gIGlmIChwcm9wcyA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBwcm9wc1tyZWdpc3RyYXRpb25OYW1lXTtcblxuICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgaW5zdC50eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lciAmJiB0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBgXCIgKyByZWdpc3RyYXRpb25OYW1lICsgXCJgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYFwiICsgdHlwZW9mIGxpc3RlbmVyICsgXCJgIHR5cGUuXCIpO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG52YXIgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTsgLy8gQ2hlY2sgaWYgYnJvd3NlciBzdXBwb3J0IGV2ZW50cyB3aXRoIHBhc3NpdmUgbGlzdGVuZXJzXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9OyAvLyAkRmxvd0ZpeE1lOiBJZ25vcmUgRmxvdyBjb21wbGFpbmluZyBhYm91dCBuZWVkaW5nIGEgdmFsdWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcHRpb25zLCAncGFzc2l2ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICB0cnkge1xuICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kO1xuXG57XG4gIC8vIEluIERFViBtb2RlLCB3ZSBzd2FwIG91dCBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgZm9yIGEgc3BlY2lhbCB2ZXJzaW9uXG4gIC8vIHRoYXQgcGxheXMgbW9yZSBuaWNlbHkgd2l0aCB0aGUgYnJvd3NlcidzIERldlRvb2xzLiBUaGUgaWRlYSBpcyB0byBwcmVzZXJ2ZVxuICAvLyBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvci4gQmVjYXVzZSBSZWFjdCB3cmFwcyBhbGwgdXNlci1wcm92aWRlZFxuICAvLyBmdW5jdGlvbnMgaW4gaW52b2tlR3VhcmRlZENhbGxiYWNrLCBhbmQgdGhlIHByb2R1Y3Rpb24gdmVyc2lvbiBvZlxuICAvLyBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgdXNlcyBhIHRyeS1jYXRjaCwgYWxsIHVzZXIgZXhjZXB0aW9ucyBhcmUgdHJlYXRlZFxuICAvLyBsaWtlIGNhdWdodCBleGNlcHRpb25zLCBhbmQgdGhlIERldlRvb2xzIHdvbid0IHBhdXNlIHVubGVzcyB0aGUgZGV2ZWxvcGVyXG4gIC8vIHRha2VzIHRoZSBleHRyYSBzdGVwIG9mIGVuYWJsaW5nIHBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zLiBUaGlzIGlzXG4gIC8vIHVuaW50dWl0aXZlLCB0aG91Z2gsIGJlY2F1c2UgZXZlbiB0aG91Z2ggUmVhY3QgaGFzIGNhdWdodCB0aGUgZXJyb3IsIGZyb21cbiAgLy8gdGhlIGRldmVsb3BlcidzIHBlcnNwZWN0aXZlLCB0aGUgZXJyb3IgaXMgdW5jYXVnaHQuXG4gIC8vXG4gIC8vIFRvIHByZXNlcnZlIHRoZSBleHBlY3RlZCBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvciwgd2UgZG9uJ3QgdXNlIGFcbiAgLy8gdHJ5LWNhdGNoIGluIERFVi4gSW5zdGVhZCwgd2Ugc3luY2hyb25vdXNseSBkaXNwYXRjaCBhIGZha2UgZXZlbnQgdG8gYSBmYWtlXG4gIC8vIERPTSBub2RlLCBhbmQgY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayBmcm9tIGluc2lkZSBhbiBldmVudCBoYW5kbGVyXG4gIC8vIGZvciB0aGF0IGZha2UgZXZlbnQuIElmIHRoZSBjYWxsYmFjayB0aHJvd3MsIHRoZSBlcnJvciBpcyBcImNhcHR1cmVkXCIgdXNpbmdcbiAgLy8gYSBnbG9iYWwgZXZlbnQgaGFuZGxlci4gQnV0IGJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbnMgaW4gYSBkaWZmZXJlbnRcbiAgLy8gZXZlbnQgbG9vcCBjb250ZXh0LCBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIG5vcm1hbCBwcm9ncmFtIGZsb3cuXG4gIC8vIEVmZmVjdGl2ZWx5LCB0aGlzIGdpdmVzIHVzIHRyeS1jYXRjaCBiZWhhdmlvciB3aXRob3V0IGFjdHVhbGx5IHVzaW5nXG4gIC8vIHRyeS1jYXRjaC4gTmVhdCFcbiAgLy8gQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgc3BlY2lhbFxuICAvLyBERVYgdmVyc2lvbiBvZiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlYWN0Jyk7XG5cbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2KG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIC8vIElmIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3Qgd2Uga25vdyBmb3Igc3VyZSB3ZSB3aWxsIGNyYXNoIGluIHRoaXMgbWV0aG9kXG4gICAgICAvLyB3aGVuIHdlIGNhbGwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKS4gSG93ZXZlciB0aGlzIGNhbiBjYXVzZSBjb25mdXNpbmdcbiAgICAgIC8vIGVycm9yczogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2NyZWF0ZS1yZWFjdC1hcHAvaXNzdWVzLzM0ODJcbiAgICAgIC8vIFNvIHdlIHByZWVtcHRpdmVseSB0aHJvdyB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UgaW5zdGVhZC5cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IGRvY3VtZW50ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBkb2N1bWVudGAgZ2xvYmFsIHdhcyBkZWZpbmVkIHdoZW4gUmVhY3Qgd2FzIGluaXRpYWxpemVkLCBidXQgaXMgbm90ICcgKyAnZGVmaW5lZCBhbnltb3JlLiBUaGlzIGNhbiBoYXBwZW4gaW4gYSB0ZXN0IGVudmlyb25tZW50IGlmIGEgY29tcG9uZW50ICcgKyAnc2NoZWR1bGVzIGFuIHVwZGF0ZSBmcm9tIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjaywgYnV0IHRoZSB0ZXN0IGhhcyBhbHJlYWR5ICcgKyAnZmluaXNoZWQgcnVubmluZy4gVG8gc29sdmUgdGhpcywgeW91IGNhbiBlaXRoZXIgdW5tb3VudCB0aGUgY29tcG9uZW50IGF0ICcgKyAndGhlIGVuZCBvZiB5b3VyIHRlc3QgKGFuZCBlbnN1cmUgdGhhdCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgZ2V0ICcgKyAnY2FuY2VsZWQgaW4gYGNvbXBvbmVudFdpbGxVbm1vdW50YCksIG9yIHlvdSBjYW4gY2hhbmdlIHRoZSB0ZXN0IGl0c2VsZiAnICsgJ3RvIGJlIGFzeW5jaHJvbm91cy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgdmFyIGRpZENhbGwgPSBmYWxzZTsgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4gV2VcbiAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXJcbiAgICAgIC8vIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gZXJyb3JzLCBgZGlkRXJyb3JgIHdpbGwgbmV2ZXIgYmVcbiAgICAgIC8vIHNldCB0byBmYWxzZS4gVGhpcyBzdHJhdGVneSB3b3JrcyBldmVuIGlmIHRoZSBicm93c2VyIGlzIGZsYWt5IGFuZFxuICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgYXQgYWxsLlxuXG4gICAgICB2YXIgZGlkRXJyb3IgPSB0cnVlOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgdmFsdWUgb2Ygd2luZG93LmV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlc2V0IGl0XG4gICAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrIHRvIGxldCB1c2VyIGNvZGUgYWNjZXNzIHdpbmRvdy5ldmVudCBpbiB0aGVcbiAgICAgIC8vIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdC5cblxuICAgICAgdmFyIHdpbmRvd0V2ZW50ID0gd2luZG93LmV2ZW50OyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgZGVzY3JpcHRvciBvZiB3aW5kb3cuZXZlbnQgdG8gcmVzdG9yZSBpdCBhZnRlciBldmVudFxuICAgICAgLy8gZGlzcGF0Y2hpbmc6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2ODhcblxuICAgICAgdmFyIHdpbmRvd0V2ZW50RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZXZlbnQnKTtcblxuICAgICAgZnVuY3Rpb24gcmVzdG9yZUFmdGVyRGlzcGF0Y2goKSB7XG4gICAgICAgIC8vIFdlIGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBldmVudCBsaXN0ZW5lcnMgc28gdGhhdFxuICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGFcbiAgICAgICAgLy8gbmVzdGVkIGNhbGwgd291bGQgdHJpZ2dlciB0aGUgZmFrZSBldmVudCBoYW5kbGVycyBvZiBhbnkgY2FsbCBoaWdoZXJcbiAgICAgICAgLy8gaW4gdGhlIHN0YWNrLlxuICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBXZSBjaGVjayBmb3Igd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpIHRvIHByZXZlbnQgdGhlXG4gICAgICAgIC8vIHdpbmRvdy5ldmVudCBhc3NpZ25tZW50IGluIGJvdGggSUUgPD0gMTAgYXMgdGhleSB0aHJvdyBhbiBlcnJvclxuICAgICAgICAvLyBcIk1lbWJlciBub3QgZm91bmRcIiBpbiBzdHJpY3QgbW9kZSwgYW5kIGluIEZpcmVmb3ggd2hpY2ggZG9lcyBub3RcbiAgICAgICAgLy8gc3VwcG9ydCB3aW5kb3cuZXZlbnQuXG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZXZlbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSkge1xuICAgICAgICAgIHdpbmRvdy5ldmVudCA9IHdpbmRvd0V2ZW50O1xuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhbiBldmVudCBoYW5kbGVyIGZvciBvdXIgZmFrZSBldmVudC4gV2Ugd2lsbCBzeW5jaHJvbm91c2x5XG4gICAgICAvLyBkaXNwYXRjaCBvdXIgZmFrZSBldmVudCB1c2luZyBgZGlzcGF0Y2hFdmVudGAuIEluc2lkZSB0aGUgaGFuZGxlciwgd2VcbiAgICAgIC8vIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2suXG5cblxuICAgICAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICAgICAgZnVuY3Rpb24gY2FsbENhbGxiYWNrKCkge1xuICAgICAgICBkaWRDYWxsID0gdHJ1ZTtcbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gICAgICAgIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB9IC8vIENyZWF0ZSBhIGdsb2JhbCBlcnJvciBldmVudCBoYW5kbGVyLiBXZSB1c2UgdGhpcyB0byBjYXB0dXJlIHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCB3YXMgdGhyb3duLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgZmlyZSBtb3JlXG4gICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YFxuICAgICAgLy8gYW5kIGEgaGFuZGxlciBmb3IgdGhhdCBldmVudCB0aHJvd3MuIFdlIHNob3VsZCBiZSByZXNpbGllbnQgdG8gbW9zdCBvZlxuICAgICAgLy8gdGhvc2UgY2FzZXMuIEV2ZW4gaWYgb3VyIGVycm9yIGV2ZW50IGhhbmRsZXIgZmlyZXMgbW9yZSB0aGFuIG9uY2UsIHRoZVxuICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsXG4gICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZXJyb3IgZXZlbnQgaXMgdGhlIGNvcnJlY3Qgb25lLCBiZWNhdXNlIGl0J3Mgbm90XG4gICAgICAvLyBwb3NzaWJsZSBmb3IgYW55dGhpbmcgZWxzZSB0byBoYXZlIGhhcHBlbmVkIGluIGJldHdlZW4gb3VyIGNhbGxiYWNrXG4gICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWZcbiAgICAgIC8vIHRoZSBjYWxsYmFjayBkb2Vzbid0IGVycm9yLCBidXQgdGhlIGVycm9yIGV2ZW50IHdhcyBmaXJlZCwgd2Uga25vdyB0b1xuICAgICAgLy8gaWdub3JlIGl0IGJlY2F1c2UgYGRpZEVycm9yYCB3aWxsIGJlIGZhbHNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cblxuICAgICAgdmFyIGVycm9yOyAvLyBVc2UgdGhpcyB0byB0cmFjayB3aGV0aGVyIHRoZSBlcnJvciBldmVudCBpcyBldmVyIGNhbGxlZC5cblxuICAgICAgdmFyIGRpZFNldEVycm9yID0gZmFsc2U7XG4gICAgICB2YXIgaXNDcm9zc09yaWdpbkVycm9yID0gZmFsc2U7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0Vycm9yKGV2ZW50KSB7XG4gICAgICAgIGVycm9yID0gZXZlbnQuZXJyb3I7XG4gICAgICAgIGRpZFNldEVycm9yID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwgJiYgZXZlbnQuY29sbm8gPT09IDAgJiYgZXZlbnQubGluZW5vID09PSAwKSB7XG4gICAgICAgICAgaXNDcm9zc09yaWdpbkVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvciBoYW5kbGVyIGhhcyBwcmV2ZW50ZWQgZGVmYXVsdC5cbiAgICAgICAgICAvLyBCcm93c2VycyBzaWxlbmNlIHRoZSBlcnJvciByZXBvcnQgaWYgdGhpcyBoYXBwZW5zLlxuICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC5cbiAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7Ly8gSWdub3JlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYSBmYWtlIGV2ZW50IHR5cGUuXG5cblxuICAgICAgdmFyIGV2dFR5cGUgPSBcInJlYWN0LVwiICsgKG5hbWUgPyBuYW1lIDogJ2ludm9rZWd1YXJkZWRjYWxsYmFjaycpOyAvLyBBdHRhY2ggb3VyIGV2ZW50IGhhbmRsZXJzXG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcbiAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQuIElmIHRoZSB1c2VyLXByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgICAvLyBlcnJvcnMsIGl0IHdpbGwgdHJpZ2dlciBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIuXG5cbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICAgICAgaWYgKHdpbmRvd0V2ZW50RGVzY3JpcHRvcikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlkQ2FsbCAmJiBkaWRFcnJvcikge1xuICAgICAgICBpZiAoIWRpZFNldEVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGVycm9yZWQsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgbmV2ZXIgZmlyZWQuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignQW4gZXJyb3Igd2FzIHRocm93biBpbnNpZGUgb25lIG9mIHlvdXIgY29tcG9uZW50cywgYnV0IFJlYWN0ICcgKyBcImRvZXNuJ3Qga25vdyB3aGF0IGl0IHdhcy4gVGhpcyBpcyBsaWtlbHkgZHVlIHRvIGJyb3dzZXIgXCIgKyAnZmxha2luZXNzLiBSZWFjdCBkb2VzIGl0cyBiZXN0IHRvIHByZXNlcnZlIHRoZSBcIlBhdXNlIG9uICcgKyAnZXhjZXB0aW9uc1wiIGJlaGF2aW9yIG9mIHRoZSBEZXZUb29scywgd2hpY2ggcmVxdWlyZXMgc29tZSAnICsgXCJERVYtbW9kZSBvbmx5IHRyaWNrcy4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXNlIGRvbid0IHdvcmsgaW4gXCIgKyAneW91ciBicm93c2VyLiBUcnkgdHJpZ2dlcmluZyB0aGUgZXJyb3IgaW4gcHJvZHVjdGlvbiBtb2RlLCAnICsgJ29yIHN3aXRjaGluZyB0byBhIG1vZGVybiBicm93c2VyLiBJZiB5b3Ugc3VzcGVjdCB0aGF0IHRoaXMgaXMgJyArICdhY3R1YWxseSBhbiBpc3N1ZSB3aXRoIFJlYWN0LCBwbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Nyb3NzT3JpZ2luRXJyb3IpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFwiQSBjcm9zcy1vcmlnaW4gZXJyb3Igd2FzIHRocm93bi4gUmVhY3QgZG9lc24ndCBoYXZlIGFjY2VzcyB0byBcIiArICd0aGUgYWN0dWFsIGVycm9yIG9iamVjdCBpbiBkZXZlbG9wbWVudC4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Nyb3Nzb3JpZ2luLWVycm9yIGZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICAgIH0gLy8gUmVtb3ZlIG91ciBldmVudCBsaXN0ZW5lcnNcblxuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoYW5kbGVXaW5kb3dFcnJvcik7XG5cbiAgICAgIGlmICghZGlkQ2FsbCkge1xuICAgICAgICAvLyBTb21ldGhpbmcgd2VudCByZWFsbHkgd3JvbmcsIGFuZCBvdXIgZXZlbnQgd2FzIG5vdCBkaXNwYXRjaGVkLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2NzM0XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY1ODVcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBwcm9kdWN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpO1xuICAgICAgICByZXR1cm4gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwkMSA9IGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGw7XG5cbnZhciBoYXNFcnJvciA9IGZhbHNlO1xudmFyIGNhdWdodEVycm9yID0gbnVsbDsgLy8gVXNlZCBieSBldmVudCBzeXN0ZW0gdG8gY2FwdHVyZS9yZXRocm93IHRoZSBmaXJzdCBlcnJvci5cblxudmFyIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xudmFyIHJldGhyb3dFcnJvciA9IG51bGw7XG52YXIgcmVwb3J0ZXIgPSB7XG4gIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICB9XG59O1xuLyoqXG4gKiBDYWxsIGEgZnVuY3Rpb24gd2hpbGUgZ3VhcmRpbmcgYWdhaW5zdCBlcnJvcnMgdGhhdCBoYXBwZW5zIHdpdGhpbiBpdC5cbiAqIFJldHVybnMgYW4gZXJyb3IgaWYgaXQgdGhyb3dzLCBvdGhlcndpc2UgbnVsbC5cbiAqXG4gKiBJbiBwcm9kdWN0aW9uLCB0aGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgdHJ5LWNhdGNoLiBUaGUgcmVhc29uIHdlIGRvbid0XG4gKiB1c2UgYSB0cnktY2F0Y2ggZGlyZWN0bHkgaXMgc28gdGhhdCB3ZSBjYW4gc3dhcCBvdXQgYSBkaWZmZXJlbnRcbiAqIGltcGxlbWVudGF0aW9uIGluIERFViBtb2RlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBoYXNFcnJvciA9IGZhbHNlO1xuICBjYXVnaHRFcnJvciA9IG51bGw7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwkMS5hcHBseShyZXBvcnRlciwgYXJndW1lbnRzKTtcbn1cbi8qKlxuICogU2FtZSBhcyBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGJ1dCBpbnN0ZWFkIG9mIHJldHVybmluZyBhbiBlcnJvciwgaXQgc3RvcmVzXG4gKiBpdCBpbiBhIGdsb2JhbCBzbyBpdCBjYW4gYmUgcmV0aHJvd24gYnkgYHJldGhyb3dDYXVnaHRFcnJvcmAgbGF0ZXIuXG4gKiBUT0RPOiBTZWUgaWYgY2F1Z2h0RXJyb3IgYW5kIHJldGhyb3dFcnJvciBjYW4gYmUgdW5pZmllZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgaWYgKCFoYXNSZXRocm93RXJyb3IpIHtcbiAgICAgIGhhc1JldGhyb3dFcnJvciA9IHRydWU7XG4gICAgICByZXRocm93RXJyb3IgPSBlcnJvcjtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogRHVyaW5nIGV4ZWN1dGlvbiBvZiBndWFyZGVkIGZ1bmN0aW9ucyB3ZSB3aWxsIGNhcHR1cmUgdGhlIGZpcnN0IGVycm9yIHdoaWNoXG4gKiB3ZSB3aWxsIHJldGhyb3cgdG8gYmUgaGFuZGxlZCBieSB0aGUgdG9wIGxldmVsIGVycm9yIGhhbmRsZXIuXG4gKi9cblxuZnVuY3Rpb24gcmV0aHJvd0NhdWdodEVycm9yKCkge1xuICBpZiAoaGFzUmV0aHJvd0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gcmV0aHJvd0Vycm9yO1xuICAgIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xuICAgIHJldGhyb3dFcnJvciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0NhdWdodEVycm9yKCkge1xuICByZXR1cm4gaGFzRXJyb3I7XG59XG5mdW5jdGlvbiBjbGVhckNhdWdodEVycm9yKCkge1xuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjYXVnaHRFcnJvcjtcbiAgICBoYXNFcnJvciA9IGZhbHNlO1xuICAgIGNhdWdodEVycm9yID0gbnVsbDtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhckNhdWdodEVycm9yIHdhcyBjYWxsZWQgYnV0IG5vIGVycm9yIHdhcyBjYXB0dXJlZC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbi8qKlxuICogYFJlYWN0SW5zdGFuY2VNYXBgIG1haW50YWlucyBhIG1hcHBpbmcgZnJvbSBhIHB1YmxpYyBmYWNpbmcgc3RhdGVmdWxcbiAqIGluc3RhbmNlIChrZXkpIGFuZCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKHZhbHVlKS4gVGhpcyBhbGxvd3MgcHVibGljXG4gKiBtZXRob2RzIHRvIGFjY2VwdCB0aGUgdXNlciBmYWNpbmcgaW5zdGFuY2UgYXMgYW4gYXJndW1lbnQgYW5kIG1hcCB0aGVtIGJhY2tcbiAqIHRvIGludGVybmFsIG1ldGhvZHMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIGN1cnJlbnRseSBzaGFyZWQgYW5kIGFzc3VtZWQgdG8gYmUgc3RhdGVsZXNzLlxuICogSWYgdGhpcyBiZWNvbWVzIGFuIGFjdHVhbCBNYXAsIHRoYXQgd2lsbCBicmVhay5cbiAqL1xuZnVuY3Rpb24gZ2V0KGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscztcbn1cbmZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHMgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gIGtleS5fcmVhY3RJbnRlcm5hbHMgPSB2YWx1ZTtcbn1cblxuLy8gRG9uJ3QgY2hhbmdlIHRoZXNlIHR3byB2YWx1ZXMuIFRoZXkncmUgdXNlZCBieSBSZWFjdCBEZXYgVG9vbHMuXG52YXIgTm9GbGFncyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBQZXJmb3JtZWRXb3JrID1cbi8qICAgICAgICAgICAgICAgICovXG4xOyAvLyBZb3UgY2FuIGNoYW5nZSB0aGUgcmVzdCAoYW5kIGFkZCBtb3JlKS5cblxudmFyIFBsYWNlbWVudCA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgVXBkYXRlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBDaGlsZERlbGV0aW9uID1cbi8qICAgICAgICAgICAgICAgICovXG4xNjtcbnZhciBDb250ZW50UmVzZXQgPVxuLyogICAgICAgICAgICAgICAgICovXG4zMjtcbnZhciBDYWxsYmFjayA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG42NDtcbnZhciBEaWRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMjg7XG52YXIgRm9yY2VDbGllbnRSZW5kZXIgPVxuLyogICAgICAgICAgICAqL1xuMjU2O1xudmFyIFJlZiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUxMjtcbnZhciBTbmFwc2hvdCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4xMDI0O1xudmFyIFBhc3NpdmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbjIwNDg7XG52YXIgSHlkcmF0aW5nID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuNDA5NjtcbnZhciBWaXNpYmlsaXR5ID1cbi8qICAgICAgICAgICAgICAgICAgICovXG44MTkyO1xudmFyIFN0b3JlQ29uc2lzdGVuY3kgPVxuLyogICAgICAgICAgICAgKi9cbjE2Mzg0O1xudmFyIExpZmVjeWNsZUVmZmVjdE1hc2sgPSBQYXNzaXZlIHwgVXBkYXRlIHwgQ2FsbGJhY2sgfCBSZWYgfCBTbmFwc2hvdCB8IFN0b3JlQ29uc2lzdGVuY3k7IC8vIFVuaW9uIG9mIGFsbCBjb21taXQgZmxhZ3MgKGZsYWdzIHdpdGggdGhlIGxpZmV0aW1lIG9mIGEgcGFydGljdWxhciBjb21taXQpXG5cbnZhciBIb3N0RWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAgICAgICovXG4zMjc2NzsgLy8gVGhlc2UgYXJlIG5vdCByZWFsbHkgc2lkZSBlZmZlY3RzLCBidXQgd2Ugc3RpbGwgcmV1c2UgdGhpcyBmaWVsZC5cblxudmFyIEluY29tcGxldGUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjMyNzY4O1xudmFyIFNob3VsZENhcHR1cmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjY1NTM2O1xudmFyIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UgPVxuLyogKi9cbjEzMTA3MjtcbnZhciBGb3JrZWQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMDQ4NTc2OyAvLyBTdGF0aWMgdGFncyBkZXNjcmliZSBhc3BlY3RzIG9mIGEgZmliZXIgdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLFxuLy8gZS5nLiBhIGZpYmVyIHVzZXMgYSBwYXNzaXZlIGVmZmVjdCAoZXZlbiBpZiB0aGVyZSBhcmUgbm8gdXBkYXRlcyBvbiB0aGlzIHBhcnRpY3VsYXIgcmVuZGVyKS5cbi8vIFRoaXMgZW5hYmxlcyB1cyB0byBkZWZlciBtb3JlIHdvcmsgaW4gdGhlIHVubW91bnQgY2FzZSxcbi8vIHNpbmNlIHdlIGNhbiBkZWZlciB0cmF2ZXJzaW5nIHRoZSB0cmVlIGR1cmluZyBsYXlvdXQgdG8gbG9vayBmb3IgUGFzc2l2ZSBlZmZlY3RzLFxuLy8gYW5kIGluc3RlYWQgcmVseSBvbiB0aGUgc3RhdGljIGZsYWcgYXMgYSBzaWduYWwgdGhhdCB0aGVyZSBtYXkgYmUgY2xlYW51cCB3b3JrLlxuXG52YXIgUmVmU3RhdGljID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjA5NzE1MjtcbnZhciBMYXlvdXRTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgICovXG40MTk0MzA0O1xudmFyIFBhc3NpdmVTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgKi9cbjgzODg2MDg7IC8vIFRoZXNlIGZsYWdzIGFsbG93IHVzIHRvIHRyYXZlcnNlIHRvIGZpYmVycyB0aGF0IGhhdmUgZWZmZWN0cyBvbiBtb3VudFxuLy8gd2l0aG91dCB0cmF2ZXJzaW5nIHRoZSBlbnRpcmUgdHJlZSBhZnRlciBldmVyeSBjb21taXQgZm9yXG4vLyBkb3VibGUgaW52b2tpbmdcblxudmFyIE1vdW50TGF5b3V0RGV2ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE2Nzc3MjE2O1xudmFyIE1vdW50UGFzc2l2ZURldiA9XG4vKiAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyOyAvLyBHcm91cHMgb2YgZmxhZ3MgdGhhdCBhcmUgdXNlZCBpbiB0aGUgY29tbWl0IHBoYXNlIHRvIHNraXAgb3ZlciB0cmVlcyB0aGF0XG4vLyBkb24ndCBjb250YWluIGVmZmVjdHMsIGJ5IGNoZWNraW5nIHN1YnRyZWVGbGFncy5cblxudmFyIEJlZm9yZU11dGF0aW9uTWFzayA9IC8vIFRPRE86IFJlbW92ZSBVcGRhdGUgZmxhZyBmcm9tIGJlZm9yZSBtdXRhdGlvbiBwaGFzZSBieSByZS1sYW5kaW5nIFZpc2liaWxpdHlcbi8vIGZsYWcgbG9naWMgKHNlZSAjMjAwNDMpXG5VcGRhdGUgfCBTbmFwc2hvdCB8ICggMCk7XG52YXIgTXV0YXRpb25NYXNrID0gUGxhY2VtZW50IHwgVXBkYXRlIHwgQ2hpbGREZWxldGlvbiB8IENvbnRlbnRSZXNldCB8IFJlZiB8IEh5ZHJhdGluZyB8IFZpc2liaWxpdHk7XG52YXIgTGF5b3V0TWFzayA9IFVwZGF0ZSB8IENhbGxiYWNrIHwgUmVmIHwgVmlzaWJpbGl0eTsgLy8gVE9ETzogU3BsaXQgaW50byBQYXNzaXZlTW91bnRNYXNrIGFuZCBQYXNzaXZlVW5tb3VudE1hc2tcblxudmFyIFBhc3NpdmVNYXNrID0gUGFzc2l2ZSB8IENoaWxkRGVsZXRpb247IC8vIFVuaW9uIG9mIHRhZ3MgdGhhdCBkb24ndCBnZXQgcmVzZXQgb24gY2xvbmVzLlxuLy8gVGhpcyBhbGxvd3MgY2VydGFpbiBjb25jZXB0cyB0byBwZXJzaXN0IHdpdGhvdXQgcmVjYWxjdWxhdGluZyB0aGVtLFxuLy8gZS5nLiB3aGV0aGVyIGEgc3VidHJlZSBjb250YWlucyBwYXNzaXZlIGVmZmVjdHMgb3IgcG9ydGFscy5cblxudmFyIFN0YXRpY01hc2sgPSBMYXlvdXRTdGF0aWMgfCBQYXNzaXZlU3RhdGljIHwgUmVmU3RhdGljO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbmZ1bmN0aW9uIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpIHtcbiAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgdmFyIG5lYXJlc3RNb3VudGVkID0gZmliZXI7XG5cbiAgaWYgKCFmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoaXMgbWlnaHQgYmUgYSBuZXcgdHJlZSB0aGF0IGlzbid0IGluc2VydGVkXG4gICAgLy8geWV0LiBJZiBpdCBpcywgdGhlbiBpdCB3aWxsIGhhdmUgYSBwZW5kaW5nIGluc2VydGlvbiBlZmZlY3Qgb24gaXQuXG4gICAgdmFyIG5leHROb2RlID0gbm9kZTtcblxuICAgIGRvIHtcbiAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcblxuICAgICAgaWYgKChub2RlLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uIG9yIGluLXByb2dyZXNzIGh5ZHJhdGlvbi4gVGhlIG5lYXJlc3QgcG9zc2libGVcbiAgICAgICAgLy8gbW91bnRlZCBmaWJlciBpcyB0aGUgcGFyZW50IGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gaWYgdGhhdCBvbmUgaXMgc3RpbGwgbW91bnRlZC5cbiAgICAgICAgbmVhcmVzdE1vdW50ZWQgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dE5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChuZXh0Tm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5vZGUucmV0dXJuKSB7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoaXMgd2FzIGEgbmVzdGVkIEhvc3RSb290IHdoZW4gdXNlZCB3aXRoXG4gICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuXG4gICAgcmV0dXJuIG5lYXJlc3RNb3VudGVkO1xuICB9IC8vIElmIHdlIGRpZG4ndCBoaXQgdGhlIHJvb3QsIHRoYXQgbWVhbnMgdGhhdCB3ZSdyZSBpbiBhbiBkaXNjb25uZWN0ZWQgdHJlZVxuICAvLyB0aGF0IGhhcyBiZWVuIHVubW91bnRlZC5cblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihmaWJlcikge1xuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lckZyb21GaWJlcihmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Um9vdCA/IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkKGZpYmVyKSB7XG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5mdW5jdGlvbiBpc01vdW50ZWQoY29tcG9uZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKCFpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXJGaWJlcikgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgaWYgKCFmaWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzTW91bnRlZChmaWJlcikge1xuICBpZiAoZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgIT09IGZpYmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoIWFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZC5cbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBmaWJlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIElmIHdlIGhhdmUgdHdvIHBvc3NpYmxlIGJyYW5jaGVzLCB3ZSdsbCB3YWxrIGJhY2t3YXJkcyB1cCB0byB0aGUgcm9vdFxuICAvLyB0byBzZWUgd2hhdCBwYXRoIHRoZSByb290IHBvaW50cyB0by4gT24gdGhlIHdheSB3ZSBtYXkgaGl0IG9uZSBvZiB0aGVcbiAgLy8gc3BlY2lhbCBjYXNlcyBhbmQgd2UnbGwgZGVhbCB3aXRoIHRoZW0uXG5cblxuICB2YXIgYSA9IGZpYmVyO1xuICB2YXIgYiA9IGFsdGVybmF0ZTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBwYXJlbnRBID0gYS5yZXR1cm47XG5cbiAgICBpZiAocGFyZW50QSA9PT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgYXQgdGhlIHJvb3QuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50QiA9IHBhcmVudEEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKHBhcmVudEIgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoZXJlIGlzIG5vIGFsdGVybmF0ZS4gVGhpcyBpcyBhbiB1bnVzdWFsIGNhc2UuIEN1cnJlbnRseSwgaXQgb25seVxuICAgICAgLy8gaGFwcGVucyB3aGVuIGEgU3VzcGVuc2UgY29tcG9uZW50IGlzIGhpZGRlbi4gQW4gZXh0cmEgZnJhZ21lbnQgZmliZXJcbiAgICAgIC8vIGlzIGluc2VydGVkIGluIGJldHdlZW4gdGhlIFN1c3BlbnNlIGZpYmVyIGFuZCBpdHMgY2hpbGRyZW4uIFNraXBcbiAgICAgIC8vIG92ZXIgdGhpcyBleHRyYSBmcmFnbWVudCBmaWJlciBhbmQgcHJvY2VlZCB0byB0aGUgbmV4dCBwYXJlbnQuXG4gICAgICB2YXIgbmV4dFBhcmVudCA9IHBhcmVudEEucmV0dXJuO1xuXG4gICAgICBpZiAobmV4dFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICBhID0gYiA9IG5leHRQYXJlbnQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBJZiB0aGVyZSdzIG5vIHBhcmVudCwgd2UncmUgYXQgdGhlIHJvb3QuXG5cblxuICAgICAgYnJlYWs7XG4gICAgfSAvLyBJZiBib3RoIGNvcGllcyBvZiB0aGUgcGFyZW50IGZpYmVyIHBvaW50IHRvIHRoZSBzYW1lIGNoaWxkLCB3ZSBjYW5cbiAgICAvLyBhc3N1bWUgdGhhdCB0aGUgY2hpbGQgaXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW4gd2UgYmFpbG91dCBvbiBsb3dcbiAgICAvLyBwcmlvcml0eTogdGhlIGJhaWxlZCBvdXQgZmliZXIncyBjaGlsZCByZXVzZXMgdGhlIGN1cnJlbnQgY2hpbGQuXG5cblxuICAgIGlmIChwYXJlbnRBLmNoaWxkID09PSBwYXJlbnRCLmNoaWxkKSB7XG4gICAgICB2YXIgY2hpbGQgPSBwYXJlbnRBLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkID09PSBhKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gZmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQiBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBhbHRlcm5hdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9IC8vIFdlIHNob3VsZCBuZXZlciBoYXZlIGFuIGFsdGVybmF0ZSBmb3IgYW55IG1vdW50aW5nIG5vZGUuIFNvIHRoZSBvbmx5XG4gICAgICAvLyB3YXkgdGhpcyBjb3VsZCBwb3NzaWJseSBoYXBwZW4gaXMgaWYgdGhpcyB3YXMgdW5tb3VudGVkLCBpZiBhdCBhbGwuXG5cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGEucmV0dXJuICE9PSBiLnJldHVybikge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVyIG9mIEEgYW5kIHRoZSByZXR1cm4gcG9pbnRlciBvZiBCIHBvaW50IHRvIGRpZmZlcmVudFxuICAgICAgLy8gZmliZXJzLiBXZSBhc3N1bWUgdGhhdCByZXR1cm4gcG9pbnRlcnMgbmV2ZXIgY3Jpc3MtY3Jvc3MsIHNvIEEgbXVzdFxuICAgICAgLy8gYmVsb25nIHRvIHRoZSBjaGlsZCBzZXQgb2YgQS5yZXR1cm4sIGFuZCBCIG11c3QgYmVsb25nIHRvIHRoZSBjaGlsZFxuICAgICAgLy8gc2V0IG9mIEIucmV0dXJuLlxuICAgICAgYSA9IHBhcmVudEE7XG4gICAgICBiID0gcGFyZW50QjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVycyBwb2ludCB0byB0aGUgc2FtZSBmaWJlci4gV2UnbGwgaGF2ZSB0byB1c2UgdGhlXG4gICAgICAvLyBkZWZhdWx0LCBzbG93IHBhdGg6IHNjYW4gdGhlIGNoaWxkIHNldHMgb2YgZWFjaCBwYXJlbnQgYWx0ZXJuYXRlIHRvIHNlZVxuICAgICAgLy8gd2hpY2ggY2hpbGQgYmVsb25ncyB0byB3aGljaCBzZXQuXG4gICAgICAvL1xuICAgICAgLy8gU2VhcmNoIHBhcmVudCBBJ3MgY2hpbGQgc2V0XG4gICAgICB2YXIgZGlkRmluZENoaWxkID0gZmFsc2U7XG4gICAgICB2YXIgX2NoaWxkID0gcGFyZW50QS5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGlkRmluZENoaWxkKSB7XG4gICAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQidzIGNoaWxkIHNldFxuICAgICAgICBfY2hpbGQgPSBwYXJlbnRCLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBhKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2hpbGQgd2FzIG5vdCBmb3VuZCBpbiBlaXRoZXIgcGFyZW50IHNldC4gVGhpcyBpbmRpY2F0ZXMgYSBidWcgJyArICdpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYS5hbHRlcm5hdGUgIT09IGIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJldHVybiBmaWJlcnMgc2hvdWxkIGFsd2F5cyBiZSBlYWNoIG90aGVycycgYWx0ZXJuYXRlcy4gXCIgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH0gLy8gSWYgdGhlIHJvb3QgaXMgbm90IGEgaG9zdCBjb250YWluZXIsIHdlJ3JlIGluIGEgZGlzY29ubmVjdGVkIHRyZWUuIEkuZS5cbiAgLy8gdW5tb3VudGVkLlxuXG5cbiAgaWYgKGEudGFnICE9PSBIb3N0Um9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG5cbiAgaWYgKGEuc3RhdGVOb2RlLmN1cnJlbnQgPT09IGEpIHtcbiAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9IC8vIE90aGVyd2lzZSBCIGhhcyB0byBiZSBjdXJyZW50IGJyYW5jaC5cblxuXG4gIHJldHVybiBhbHRlcm5hdGU7XG59XG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcihwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuICByZXR1cm4gY3VycmVudFBhcmVudCAhPT0gbnVsbCA/IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChjdXJyZW50UGFyZW50KSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGNoaWxkKTtcblxuICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cblxuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgIT09IG51bGwgPyBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGN1cnJlbnRQYXJlbnQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChub2RlKSB7XG4gIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgaWYgKGNoaWxkLnRhZyAhPT0gSG9zdFBvcnRhbCkge1xuICAgICAgdmFyIG1hdGNoID0gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChjaGlsZCk7XG5cbiAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRoaXMgbW9kdWxlIG9ubHkgZXhpc3RzIGFzIGFuIEVTTSB3cmFwcGVyIGFyb3VuZCB0aGUgZXh0ZXJuYWwgQ29tbW9uSlNcbnZhciBzY2hlZHVsZUNhbGxiYWNrID0gU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG52YXIgY2FuY2VsQ2FsbGJhY2sgPSBTY2hlZHVsZXIudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG52YXIgc2hvdWxkWWllbGQgPSBTY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQ7XG52YXIgcmVxdWVzdFBhaW50ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3JlcXVlc3RQYWludDtcbnZhciBub3cgPSBTY2hlZHVsZXIudW5zdGFibGVfbm93O1xudmFyIGdldEN1cnJlbnRQcmlvcml0eUxldmVsID0gU2NoZWR1bGVyLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsO1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5O1xudmFyIE5vcm1hbFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5O1xudmFyIExvd1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5O1xudmFyIElkbGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JZGxlUHJpb3JpdHk7XG4vLyB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3Qgb24gdGhlIHNjaGVkdWxlciwgYnV0IGl0ICpkb2VzKlxuLy8gb24gc2NoZWR1bGVyL3Vuc3RhYmxlX21vY2ssIHdoaWNoIHdlJ2xsIG5lZWQgZm9yIGludGVybmFsIHRlc3RpbmdcbnZhciB1bnN0YWJsZV95aWVsZFZhbHVlID0gU2NoZWR1bGVyLnVuc3RhYmxlX3lpZWxkVmFsdWU7XG52YXIgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUgPSBTY2hlZHVsZXIudW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWU7XG5cbnZhciByZW5kZXJlcklEID0gbnVsbDtcbnZhciBpbmplY3RlZEhvb2sgPSBudWxsO1xudmFyIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBudWxsO1xudmFyIGhhc0xvZ2dlZEVycm9yID0gZmFsc2U7XG52YXIgaXNEZXZUb29sc1ByZXNlbnQgPSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGluamVjdEludGVybmFscyhpbnRlcm5hbHMpIHtcbiAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTm8gRGV2VG9vbHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaG9vayA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuICBpZiAoaG9vay5pc0Rpc2FibGVkKSB7XG4gICAgLy8gVGhpcyBpc24ndCBhIHJlYWwgcHJvcGVydHkgb24gdGhlIGhvb2ssIGJ1dCBpdCBjYW4gYmUgc2V0IHRvIG9wdCBvdXRcbiAgICAvLyBvZiBEZXZUb29scyBpbnRlZ3JhdGlvbiBhbmQgYXNzb2NpYXRlZCB3YXJuaW5ncyBhbmQgbG9ncy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzM4NzdcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaG9vay5zdXBwb3J0c0ZpYmVyKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1RoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBSZWFjdCBEZXZUb29scyBpcyB0b28gb2xkIGFuZCB3aWxsIG5vdCB3b3JrICcgKyAnd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJlYWN0LiBQbGVhc2UgdXBkYXRlIFJlYWN0IERldlRvb2xzLiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycpO1xuICAgIH0gLy8gRGV2VG9vbHMgZXhpc3RzLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgRmliZXIuXG5cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyKSB7XG4gICAgICAvLyBDb25kaXRpb25hbGx5IGluamVjdCB0aGVzZSBob29rcyBvbmx5IGlmIFRpbWVsaW5lIHByb2ZpbGVyIGlzIHN1cHBvcnRlZCBieSB0aGlzIGJ1aWxkLlxuICAgICAgLy8gVGhpcyBnaXZlcyBEZXZUb29scyBhIHdheSB0byBmZWF0dXJlIGRldGVjdCB0aGF0IGlzbid0IHRpZWQgdG8gdmVyc2lvbiBudW1iZXJcbiAgICAgIC8vIChzaW5jZSBwcm9maWxpbmcgYW5kIHRpbWVsaW5lIGFyZSBjb250cm9sbGVkIGJ5IGRpZmZlcmVudCBmZWF0dXJlIGZsYWdzKS5cbiAgICAgIGludGVybmFscyA9IGFzc2lnbih7fSwgaW50ZXJuYWxzLCB7XG4gICAgICAgIGdldExhbmVMYWJlbE1hcDogZ2V0TGFuZUxhYmVsTWFwLFxuICAgICAgICBpbmplY3RQcm9maWxpbmdIb29rczogaW5qZWN0UHJvZmlsaW5nSG9va3NcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcmVySUQgPSBob29rLmluamVjdChpbnRlcm5hbHMpOyAvLyBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBpbmplY3RlZCwgc28gbm93IGl0IGlzIHNhZmUgdG8gc2V0IHVwIGhvb2tzLlxuXG4gICAgaW5qZWN0ZWRIb29rID0gaG9vaztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQ2F0Y2ggYWxsIGVycm9ycyBiZWNhdXNlIGl0IGlzIHVuc2FmZSB0byB0aHJvdyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMuJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaG9vay5jaGVja0RDRSkge1xuICAgIC8vIFRoaXMgaXMgdGhlIHJlYWwgRGV2VG9vbHMuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBob29rIGluc3RhbGxlZCBieSBGYXN0IFJlZnJlc2ggcnVudGltZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG9uU2NoZWR1bGVSb290KHJvb3QsIGNoaWxkcmVuKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgY2hpbGRyZW4pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICggIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvbkNvbW1pdFJvb3Qocm9vdCwgZXZlbnRQcmlvcml0eSkge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGRpZEVycm9yID0gKHJvb3QuY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpID09PSBEaWRDYXB0dXJlO1xuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgICAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHk7XG5cbiAgICAgICAgc3dpdGNoIChldmVudFByaW9yaXR5KSB7XG4gICAgICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IEltbWVkaWF0ZVByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgSWRsZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCBzY2hlZHVsZXJQcmlvcml0eSwgZGlkRXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHVuZGVmaW5lZCwgZGlkRXJyb3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvblBvc3RDb21taXRSb290KHJvb3QpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Qb3N0Q29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvbkNvbW1pdFVubW91bnQoZmliZXIpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudChyZW5kZXJlcklELCBmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKG5ld0lzU3RyaWN0TW9kZSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiB1bnN0YWJsZV95aWVsZFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBXZSdyZSBpbiBhIHRlc3QgYmVjYXVzZSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZSBvbmx5IGV4aXN0c1xuICAgICAgLy8gaW4gU2NoZWR1bGVyTW9jay4gVG8gcmVkdWNlIHRoZSBub2lzZSBpbiBzdHJpY3QgbW9kZSB0ZXN0cyxcbiAgICAgIC8vIHN1cHByZXNzIHdhcm5pbmdzIGFuZCBkaXNhYmxlIHNjaGVkdWxlciB5aWVsZGluZyBkdXJpbmcgdGhlIGRvdWJsZSByZW5kZXJcbiAgICAgIHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlKG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgICBzZXRTdXBwcmVzc1dhcm5pbmcobmV3SXNTdHJpY3RNb2RlKTtcbiAgICB9XG5cbiAgICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUocmVuZGVyZXJJRCwgbmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIFByb2ZpbGVyIEFQSSBob29rc1xuXG5mdW5jdGlvbiBpbmplY3RQcm9maWxpbmdIb29rcyhwcm9maWxpbmdIb29rcykge1xuICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzID0gcHJvZmlsaW5nSG9va3M7XG59XG5cbmZ1bmN0aW9uIGdldExhbmVMYWJlbE1hcCgpIHtcbiAge1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgdmFyIGxhbmUgPSAxO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IFRvdGFsTGFuZXM7IGluZGV4KyspIHtcbiAgICAgIHZhciBsYWJlbCA9IGdldExhYmVsRm9yTGFuZShsYW5lKTtcbiAgICAgIG1hcC5zZXQobGFuZSwgbGFiZWwpO1xuICAgICAgbGFuZSAqPSAyO1xuICAgIH1cblxuICAgIHJldHVybiBtYXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21taXRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudEVycm9yZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50U3VzcGVuZGVkKGZpYmVyLCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRTdXNwZW5kZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFN1c3BlbmRlZChmaWJlciwgd2FrZWFibGUsIGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJZaWVsZGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlcllpZWxkZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlcllpZWxkZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBOb01vZGUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7IC8vIFRPRE86IFJlbW92ZSBDb25jdXJyZW50TW9kZSBieSByZWFkaW5nIGZyb20gdGhlIHJvb3QgdGFnIGluc3RlYWRcblxudmFyIENvbmN1cnJlbnRNb2RlID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMTtcbnZhciBQcm9maWxlTW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgU3RyaWN0TGVnYWN5TW9kZSA9XG4vKiAgICAgICAgICAgICAgICovXG44O1xudmFyIFN0cmljdEVmZmVjdHNNb2RlID1cbi8qICAgICAgICAgICAgICAqL1xuMTY7XG5cbi8vIFRPRE86IFRoaXMgaXMgcHJldHR5IHdlbGwgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzLiBNYXliZSB3ZSBjYW4gZHJvcCBpdC5cbnZhciBjbHozMiA9IE1hdGguY2x6MzIgPyBNYXRoLmNsejMyIDogY2x6MzJGYWxsYmFjazsgLy8gQ291bnQgbGVhZGluZyB6ZXJvcy5cbi8vIEJhc2VkIG9uOlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9jbHozMlxuXG52YXIgbG9nID0gTWF0aC5sb2c7XG52YXIgTE4yID0gTWF0aC5MTjI7XG5cbmZ1bmN0aW9uIGNsejMyRmFsbGJhY2soeCkge1xuICB2YXIgYXNVaW50ID0geCA+Pj4gMDtcblxuICBpZiAoYXNVaW50ID09PSAwKSB7XG4gICAgcmV0dXJuIDMyO1xuICB9XG5cbiAgcmV0dXJuIDMxIC0gKGxvZyhhc1VpbnQpIC8gTE4yIHwgMCkgfCAwO1xufVxuXG4vLyBJZiB0aG9zZSB2YWx1ZXMgYXJlIGNoYW5nZWQgdGhhdCBwYWNrYWdlIHNob3VsZCBiZSByZWJ1aWx0IGFuZCByZWRlcGxveWVkLlxuXG52YXIgVG90YWxMYW5lcyA9IDMxO1xudmFyIE5vTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBOb0xhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIFN5bmNMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAqL1xuMjtcbnZhciBJbnB1dENvbnRpbnVvdXNMYW5lID1cbi8qICAgICAgICAgICAgICovXG40O1xudmFyIERlZmF1bHRIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgKi9cbjg7XG52YXIgRGVmYXVsdExhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjMyO1xudmFyIFRyYW5zaXRpb25MYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQxOTQyNDA7XG52YXIgVHJhbnNpdGlvbkxhbmUxID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY0O1xudmFyIFRyYW5zaXRpb25MYW5lMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMjg7XG52YXIgVHJhbnNpdGlvbkxhbmUzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBUcmFuc2l0aW9uTGFuZTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTEyO1xudmFyIFRyYW5zaXRpb25MYW5lNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMDI0O1xudmFyIFRyYW5zaXRpb25MYW5lNiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4yMDQ4O1xudmFyIFRyYW5zaXRpb25MYW5lNyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIFRyYW5zaXRpb25MYW5lOCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG44MTkyO1xudmFyIFRyYW5zaXRpb25MYW5lOSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xNjM4NDtcbnZhciBUcmFuc2l0aW9uTGFuZTEwID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMzI3Njg7XG52YXIgVHJhbnNpdGlvbkxhbmUxMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY1NTM2O1xudmFyIFRyYW5zaXRpb25MYW5lMTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMzEwNzI7XG52YXIgVHJhbnNpdGlvbkxhbmUxMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI2MjE0NDtcbnZhciBUcmFuc2l0aW9uTGFuZTE0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTI0Mjg4O1xudmFyIFRyYW5zaXRpb25MYW5lMTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4xMDQ4NTc2O1xudmFyIFRyYW5zaXRpb25MYW5lMTYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4yMDk3MTUyO1xudmFyIFJldHJ5TGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEzMDAyMzQyNDtcbnZhciBSZXRyeUxhbmUxID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE5NDMwNDtcbnZhciBSZXRyeUxhbmUyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuODM4ODYwODtcbnZhciBSZXRyeUxhbmUzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTY3NzcyMTY7XG52YXIgUmV0cnlMYW5lNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyO1xudmFyIFJldHJ5TGFuZTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG42NzEwODg2NDtcbnZhciBTb21lUmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcbnZhciBTZWxlY3RpdmVIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICovXG4xMzQyMTc3Mjg7XG52YXIgTm9uSWRsZUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjY4NDM1NDU1O1xudmFyIElkbGVIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgICAgKi9cbjI2ODQzNTQ1NjtcbnZhciBJZGxlTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG41MzY4NzA5MTI7XG52YXIgT2Zmc2NyZWVuTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMTA3Mzc0MTgyNDsgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgZXhwZXJpbWVudGFsIHRpbWVsaW5lIChyZWFjdC1kZXZ0b29scy10aW1lbGluZSlcbi8vIEl0IHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgTGFuZXMgdmFsdWVzIGFib3ZlLlxuXG5mdW5jdGlvbiBnZXRMYWJlbEZvckxhbmUobGFuZSkge1xuICB7XG4gICAgaWYgKGxhbmUgJiBTeW5jTGFuZSkge1xuICAgICAgcmV0dXJuICdTeW5jJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnSW5wdXRDb250aW51b3VzSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElucHV0Q29udGludW91c0xhbmUpIHtcbiAgICAgIHJldHVybiAnSW5wdXRDb250aW51b3VzJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIERlZmF1bHRIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0RlZmF1bHRIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgRGVmYXVsdExhbmUpIHtcbiAgICAgIHJldHVybiAnRGVmYXVsdCc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdUcmFuc2l0aW9uSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFRyYW5zaXRpb25MYW5lcykge1xuICAgICAgcmV0dXJuICdUcmFuc2l0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFJldHJ5TGFuZXMpIHtcbiAgICAgIHJldHVybiAnUmV0cnknO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdTZWxlY3RpdmVIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSWRsZUh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnSWRsZUh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJZGxlTGFuZSkge1xuICAgICAgcmV0dXJuICdJZGxlJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgIHJldHVybiAnT2Zmc2NyZWVuJztcbiAgICB9XG4gIH1cbn1cbnZhciBOb1RpbWVzdGFtcCA9IC0xO1xudmFyIG5leHRUcmFuc2l0aW9uTGFuZSA9IFRyYW5zaXRpb25MYW5lMTtcbnZhciBuZXh0UmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobGFuZXMpIHtcbiAgc3dpdGNoIChnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSkge1xuICAgIGNhc2UgU3luY0xhbmU6XG4gICAgICByZXR1cm4gU3luY0xhbmU7XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNMYW5lO1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgICByZXR1cm4gRGVmYXVsdExhbmU7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgICAgcmV0dXJuIGxhbmVzICYgVHJhbnNpdGlvbkxhbmVzO1xuXG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIHJldHVybiBsYW5lcyAmIFJldHJ5TGFuZXM7XG5cbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSWRsZUh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gSWRsZUh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElkbGVMYW5lOlxuICAgICAgcmV0dXJuIElkbGVMYW5lO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5MYW5lOlxuICAgICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICBlcnJvcignU2hvdWxkIGhhdmUgZm91bmQgbWF0Y2hpbmcgbGFuZXMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9IC8vIFRoaXMgc2hvdWxkbid0IGJlIHJlYWNoYWJsZSwgYnV0IGFzIGEgZmFsbGJhY2ssIHJldHVybiB0aGUgZW50aXJlIGJpdG1hc2suXG5cblxuICAgICAgcmV0dXJuIGxhbmVzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5leHRMYW5lcyhyb290LCB3aXBMYW5lcykge1xuICAvLyBFYXJseSBiYWlsb3V0IGlmIHRoZXJlJ3Mgbm8gcGVuZGluZyB3b3JrIGxlZnQuXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAocGVuZGluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH1cblxuICB2YXIgbmV4dExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lczsgLy8gRG8gbm90IHdvcmsgb24gYW55IGlkbGUgd29yayB1bnRpbCBhbGwgdGhlIG5vbi1pZGxlIHdvcmsgaGFzIGZpbmlzaGVkLFxuICAvLyBldmVuIGlmIHRoZSB3b3JrIGlzIHN1c3BlbmRlZC5cblxuICB2YXIgbm9uSWRsZVBlbmRpbmdMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIE5vbklkbGVMYW5lcztcblxuICBpZiAobm9uSWRsZVBlbmRpbmdMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHZhciBub25JZGxlVW5ibG9ja2VkTGFuZXMgPSBub25JZGxlUGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzO1xuXG4gICAgaWYgKG5vbklkbGVVbmJsb2NrZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVVuYmxvY2tlZExhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5vbklkbGVQaW5nZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiBwaW5nZWRMYW5lcztcblxuICAgICAgaWYgKG5vbklkbGVQaW5nZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlUGluZ2VkTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGUgb25seSByZW1haW5pbmcgd29yayBpcyBJZGxlLlxuICAgIHZhciB1bmJsb2NrZWRMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgIGlmICh1bmJsb2NrZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXModW5ibG9ja2VkTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGluZ2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBpZiB3ZSdyZSBzdXNwZW5kZWRcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGluIHRoaXMgcGF0aCBpZiBhIGZhbGxiYWNrIHRpbWVyIGlzIG5vdCBzY2hlZHVsZWQuXG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH0gLy8gSWYgd2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIGEgcmVuZGVyLCBzd2l0Y2hpbmcgbGFuZXMgd2lsbCBpbnRlcnJ1cHRcbiAgLy8gaXQgYW5kIHdlJ2xsIGxvc2Ugb3VyIHByb2dyZXNzLiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHRoZSBuZXcgbGFuZXMgYXJlXG4gIC8vIGhpZ2hlciBwcmlvcml0eS5cblxuXG4gIGlmICh3aXBMYW5lcyAhPT0gTm9MYW5lcyAmJiB3aXBMYW5lcyAhPT0gbmV4dExhbmVzICYmIC8vIElmIHdlIGFscmVhZHkgc3VzcGVuZGVkIHdpdGggYSBkZWxheSwgdGhlbiBpbnRlcnJ1cHRpbmcgaXMgZmluZS4gRG9uJ3RcbiAgLy8gYm90aGVyIHdhaXRpbmcgdW50aWwgdGhlIHJvb3QgaXMgY29tcGxldGUuXG4gICh3aXBMYW5lcyAmIHN1c3BlbmRlZExhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIHZhciBuZXh0TGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTtcbiAgICB2YXIgd2lwTGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUod2lwTGFuZXMpO1xuXG4gICAgaWYgKCAvLyBUZXN0cyB3aGV0aGVyIHRoZSBuZXh0IGxhbmUgaXMgZXF1YWwgb3IgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgd2lwXG4gICAgLy8gb25lLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGJpdHMgZGVjcmVhc2UgaW4gcHJpb3JpdHkgYXMgeW91IGdvIGxlZnQuXG4gICAgbmV4dExhbmUgPj0gd2lwTGFuZSB8fCAvLyBEZWZhdWx0IHByaW9yaXR5IHVwZGF0ZXMgc2hvdWxkIG5vdCBpbnRlcnJ1cHQgdHJhbnNpdGlvbiB1cGRhdGVzLiBUaGVcbiAgICAvLyBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBkZWZhdWx0IHVwZGF0ZXMgYW5kIHRyYW5zaXRpb24gdXBkYXRlcyBpcyB0aGF0XG4gICAgLy8gZGVmYXVsdCB1cGRhdGVzIGRvIG5vdCBzdXBwb3J0IHJlZnJlc2ggdHJhbnNpdGlvbnMuXG4gICAgbmV4dExhbmUgPT09IERlZmF1bHRMYW5lICYmICh3aXBMYW5lICYgVHJhbnNpdGlvbkxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgICAgLy8gS2VlcCB3b3JraW5nIG9uIHRoZSBleGlzdGluZyBpbi1wcm9ncmVzcyB0cmVlLiBEbyBub3QgaW50ZXJydXB0LlxuICAgICAgcmV0dXJuIHdpcExhbmVzO1xuICAgIH1cbiAgfVxuXG4gIGlmICgobmV4dExhbmVzICYgSW5wdXRDb250aW51b3VzTGFuZSkgIT09IE5vTGFuZXMpIHtcbiAgICAvLyBXaGVuIHVwZGF0ZXMgYXJlIHN5bmMgYnkgZGVmYXVsdCwgd2UgZW50YW5nbGUgY29udGludW91cyBwcmlvcml0eSB1cGRhdGVzXG4gICAgLy8gYW5kIGRlZmF1bHQgdXBkYXRlcywgc28gdGhleSByZW5kZXIgaW4gdGhlIHNhbWUgYmF0Y2guIFRoZSBvbmx5IHJlYXNvblxuICAgIC8vIHRoZXkgdXNlIHNlcGFyYXRlIGxhbmVzIGlzIGJlY2F1c2UgY29udGludW91cyB1cGRhdGVzIHNob3VsZCBpbnRlcnJ1cHRcbiAgICAvLyB0cmFuc2l0aW9ucywgYnV0IGRlZmF1bHQgdXBkYXRlcyBzaG91bGQgbm90LlxuICAgIG5leHRMYW5lcyB8PSBwZW5kaW5nTGFuZXMgJiBEZWZhdWx0TGFuZTtcbiAgfSAvLyBDaGVjayBmb3IgZW50YW5nbGVkIGxhbmVzIGFuZCBhZGQgdGhlbSB0byB0aGUgYmF0Y2guXG4gIC8vXG4gIC8vIEEgbGFuZSBpcyBzYWlkIHRvIGJlIGVudGFuZ2xlZCB3aXRoIGFub3RoZXIgd2hlbiBpdCdzIG5vdCBhbGxvd2VkIHRvIHJlbmRlclxuICAvLyBpbiBhIGJhdGNoIHRoYXQgZG9lcyBub3QgYWxzbyBpbmNsdWRlIHRoZSBvdGhlciBsYW5lLiBUeXBpY2FsbHkgd2UgZG8gdGhpc1xuICAvLyB3aGVuIG11bHRpcGxlIHVwZGF0ZXMgaGF2ZSB0aGUgc2FtZSBzb3VyY2UsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gcmVzcG9uZCB0b1xuICAvLyB0aGUgbW9zdCByZWNlbnQgZXZlbnQgZnJvbSB0aGF0IHNvdXJjZS5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IHdlIGFwcGx5IGVudGFuZ2xlbWVudHMgKmFmdGVyKiBjaGVja2luZyBmb3IgcGFydGlhbCB3b3JrIGFib3ZlLlxuICAvLyBUaGlzIG1lYW5zIHRoYXQgaWYgYSBsYW5lIGlzIGVudGFuZ2xlZCBkdXJpbmcgYW4gaW50ZXJsZWF2ZWQgZXZlbnQgd2hpbGVcbiAgLy8gaXQncyBhbHJlYWR5IHJlbmRlcmluZywgd2Ugd29uJ3QgaW50ZXJydXB0IGl0LiBUaGlzIGlzIGludGVudGlvbmFsLCBzaW5jZVxuICAvLyBlbnRhbmdsZW1lbnQgaXMgdXN1YWxseSBcImJlc3QgZWZmb3J0XCI6IHdlJ2xsIHRyeSBvdXIgYmVzdCB0byByZW5kZXIgdGhlXG4gIC8vIGxhbmVzIGluIHRoZSBzYW1lIGJhdGNoLCBidXQgaXQncyBub3Qgd29ydGggdGhyb3dpbmcgb3V0IHBhcnRpYWxseVxuICAvLyBjb21wbGV0ZWQgd29yayBpbiBvcmRlciB0byBkbyBpdC5cbiAgLy8gVE9ETzogUmVjb25zaWRlciB0aGlzLiBUaGUgY291bnRlci1hcmd1bWVudCBpcyB0aGF0IHRoZSBwYXJ0aWFsIHdvcmtcbiAgLy8gcmVwcmVzZW50cyBhbiBpbnRlcm1lZGlhdGUgc3RhdGUsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gc2hvdyB0byB0aGUgdXNlci5cbiAgLy8gQW5kIGJ5IHNwZW5kaW5nIGV4dHJhIHRpbWUgZmluaXNoaW5nIGl0LCB3ZSdyZSBpbmNyZWFzaW5nIHRoZSBhbW91bnQgb2ZcbiAgLy8gdGltZSBpdCB0YWtlcyB0byBzaG93IHRoZSBmaW5hbCBzdGF0ZSwgd2hpY2ggaXMgd2hhdCB0aGV5IGFyZSBhY3R1YWxseVxuICAvLyB3YWl0aW5nIGZvci5cbiAgLy9cbiAgLy8gRm9yIHRob3NlIGV4Y2VwdGlvbnMgd2hlcmUgZW50YW5nbGVtZW50IGlzIHNlbWFudGljYWxseSBpbXBvcnRhbnQsIGxpa2VcbiAgLy8gdXNlTXV0YWJsZVNvdXJjZSwgd2Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHBhcnRpYWwgd29yayBhdCB0aGVcbiAgLy8gdGltZSB3ZSBhcHBseSB0aGUgZW50YW5nbGVtZW50LlxuXG5cbiAgdmFyIGVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcztcblxuICBpZiAoZW50YW5nbGVkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgICB2YXIgbGFuZXMgPSBuZXh0TGFuZXMgJiBlbnRhbmdsZWRMYW5lcztcblxuICAgIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgICAgbmV4dExhbmVzIHw9IGVudGFuZ2xlbWVudHNbaW5kZXhdO1xuICAgICAgbGFuZXMgJj0gfmxhbmU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRMYW5lcztcbn1cbmZ1bmN0aW9uIGdldE1vc3RSZWNlbnRFdmVudFRpbWUocm9vdCwgbGFuZXMpIHtcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXZlbnRUaW1lID0gZXZlbnRUaW1lc1tpbmRleF07XG5cbiAgICBpZiAoZXZlbnRUaW1lID4gbW9zdFJlY2VudEV2ZW50VGltZSkge1xuICAgICAgbW9zdFJlY2VudEV2ZW50VGltZSA9IGV2ZW50VGltZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxuXG4gIHJldHVybiBtb3N0UmVjZW50RXZlbnRUaW1lO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpIHtcbiAgc3dpdGNoIChsYW5lKSB7XG4gICAgY2FzZSBTeW5jTGFuZTpcbiAgICBjYXNlIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgLy8gVXNlciBpbnRlcmFjdGlvbnMgc2hvdWxkIGV4cGlyZSBzbGlnaHRseSBtb3JlIHF1aWNrbHkuXG4gICAgICAvL1xuICAgICAgLy8gTk9URTogVGhpcyBpcyBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29uc3RhbnQgYXMgaW4gU2NoZWR1bGVyLmpzLlxuICAgICAgLy8gV2hlbiB3ZSBtYWRlIGl0IGxhcmdlciwgYSBwcm9kdWN0IG1ldHJpYyBpbiB3d3cgcmVncmVzc2VkLCBzdWdnZXN0aW5nXG4gICAgICAvLyB0aGVyZSdzIGEgdXNlciBpbnRlcmFjdGlvbiB0aGF0J3MgYmVpbmcgc3RhcnZlZCBieSBhIHNlcmllcyBvZlxuICAgICAgLy8gc3luY2hyb25vdXMgdXBkYXRlcy4gSWYgdGhhdCB0aGVvcnkgaXMgY29ycmVjdCwgdGhlIHByb3BlciBzb2x1dGlvbiBpc1xuICAgICAgLy8gdG8gZml4IHRoZSBzdGFydmF0aW9uLiBIb3dldmVyLCB0aGlzIHNjZW5hcmlvIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXRcbiAgICAgIC8vIGV4cGlyYXRpb24gdGltZXMgYXJlIGFuIGltcG9ydGFudCBzYWZlZ3VhcmQgd2hlbiBzdGFydmF0aW9uXG4gICAgICAvLyBkb2VzIGhhcHBlbi5cbiAgICAgIHJldHVybiBjdXJyZW50VGltZSArIDI1MDtcblxuICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICAgIHJldHVybiBjdXJyZW50VGltZSArIDUwMDA7XG5cbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgLy8gVE9ETzogUmV0cmllcyBzaG91bGQgYmUgYWxsb3dlZCB0byBleHBpcmUgaWYgdGhleSBhcmUgQ1BVIGJvdW5kIGZvclxuICAgICAgLy8gdG9vIGxvbmcsIGJ1dCB3aGVuIEkgbWFkZSB0aGlzIGNoYW5nZSBpdCBjYXVzZWQgYSBzcGlrZSBpbiBicm93c2VyXG4gICAgICAvLyBjcmFzaGVzLiBUaGVyZSBtdXN0IGJlIHNvbWUgb3RoZXIgdW5kZXJseWluZyBidWc7IG5vdCBzdXBlciB1cmdlbnQgYnV0XG4gICAgICAvLyBpZGVhbGx5IHNob3VsZCBmaWd1cmUgb3V0IHdoeSBhbmQgZml4IGl0LiBVbmZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmVcbiAgICAgIC8vIGEgcmVwcm8gZm9yIHRoZSBjcmFzaGVzLCBvbmx5IGRldGVjdGVkIHZpYSBwcm9kdWN0aW9uIG1ldHJpY3MuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG5cbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElkbGVMYW5lOlxuICAgIGNhc2UgT2Zmc2NyZWVuTGFuZTpcbiAgICAgIC8vIEFueXRoaW5nIGlkbGUgcHJpb3JpdHkgb3IgbG93ZXIgc2hvdWxkIG5ldmVyIGV4cGlyZS5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGFydmVkTGFuZXNBc0V4cGlyZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgLy8gVE9ETzogVGhpcyBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIHdlIHlpZWxkLiBXZSBjYW4gb3B0aW1pemUgYnkgc3RvcmluZ1xuICAvLyB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lIG9uIHRoZSByb290LiBUaGVuIHVzZSB0aGF0IHRvIHF1aWNrbHkgYmFpbCBvdXRcbiAgLy8gb2YgdGhpcyBmdW5jdGlvbi5cbiAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuICB2YXIgcGluZ2VkTGFuZXMgPSByb290LnBpbmdlZExhbmVzO1xuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7IC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcGVuZGluZyBsYW5lcyBhbmQgY2hlY2sgaWYgd2UndmUgcmVhY2hlZCB0aGVpclxuICAvLyBleHBpcmF0aW9uIHRpbWUuIElmIHNvLCB3ZSdsbCBhc3N1bWUgdGhlIHVwZGF0ZSBpcyBiZWluZyBzdGFydmVkIGFuZCBtYXJrXG4gIC8vIGl0IGFzIGV4cGlyZWQgdG8gZm9yY2UgaXQgdG8gZmluaXNoLlxuXG4gIHZhciBsYW5lcyA9IHBlbmRpbmdMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciBleHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lc1tpbmRleF07XG5cbiAgICBpZiAoZXhwaXJhdGlvblRpbWUgPT09IE5vVGltZXN0YW1wKSB7XG4gICAgICAvLyBGb3VuZCBhIHBlbmRpbmcgbGFuZSB3aXRoIG5vIGV4cGlyYXRpb24gdGltZS4gSWYgaXQncyBub3Qgc3VzcGVuZGVkLCBvclxuICAgICAgLy8gaWYgaXQncyBwaW5nZWQsIGFzc3VtZSBpdCdzIENQVS1ib3VuZC4gQ29tcHV0ZSBhIG5ldyBleHBpcmF0aW9uIHRpbWVcbiAgICAgIC8vIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUuXG4gICAgICBpZiAoKGxhbmUgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMgfHwgKGxhbmUgJiBwaW5nZWRMYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgLy8gQXNzdW1lcyB0aW1lc3RhbXBzIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG4gICAgICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgIC8vIFRoaXMgbGFuZSBleHBpcmVkXG4gICAgICByb290LmV4cGlyZWRMYW5lcyB8PSBsYW5lO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59IC8vIFRoaXMgcmV0dXJucyB0aGUgaGlnaGVzdCBwcmlvcml0eSBwZW5kaW5nIGxhbmVzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5XG4vLyBhcmUgc3VzcGVuZGVkLlxuXG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlQZW5kaW5nTGFuZXMocm9vdCkge1xuICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocm9vdC5wZW5kaW5nTGFuZXMpO1xufVxuZnVuY3Rpb24gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCkge1xuICB2YXIgZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiA9IHJvb3QucGVuZGluZ0xhbmVzICYgfk9mZnNjcmVlbkxhbmU7XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gZXZlcnl0aGluZ0J1dE9mZnNjcmVlbjtcbiAgfVxuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuICB9XG5cbiAgcmV0dXJuIE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc1N5bmNMYW5lKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBTeW5jTGFuZSkgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc05vbklkbGVXb3JrKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBOb25JZGxlTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgUmV0cnlMYW5lcykgPT09IGxhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMobGFuZXMpIHtcbiAgdmFyIFVyZ2VudExhbmVzID0gU3luY0xhbmUgfCBJbnB1dENvbnRpbnVvdXNMYW5lIHwgRGVmYXVsdExhbmU7XG4gIHJldHVybiAobGFuZXMgJiBVcmdlbnRMYW5lcykgPT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgVHJhbnNpdGlvbkxhbmVzKSA9PT0gbGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykge1xuXG4gIHZhciBTeW5jRGVmYXVsdExhbmVzID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSB8IElucHV0Q29udGludW91c0xhbmUgfCBEZWZhdWx0SHlkcmF0aW9uTGFuZSB8IERlZmF1bHRMYW5lO1xuICByZXR1cm4gKGxhbmVzICYgU3luY0RlZmF1bHRMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc0V4cGlyZWRMYW5lKHJvb3QsIGxhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYSBzZXBhcmF0ZSBjaGVjayBmcm9tIGluY2x1ZGVzQmxvY2tpbmdMYW5lIGJlY2F1c2UgYSBsYW5lIGNhblxuICAvLyBleHBpcmUgYWZ0ZXIgYSByZW5kZXIgaGFzIGFscmVhZHkgc3RhcnRlZC5cbiAgcmV0dXJuIChsYW5lcyAmIHJvb3QuZXhwaXJlZExhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGlzVHJhbnNpdGlvbkxhbmUobGFuZSkge1xuICByZXR1cm4gKGxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKSB7XG4gIC8vIEN5Y2xlIHRocm91Z2ggdGhlIGxhbmVzLCBhc3NpZ25pbmcgZWFjaCBuZXcgdHJhbnNpdGlvbiB0byB0aGUgbmV4dCBsYW5lLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIG1lYW5zIGV2ZXJ5IHRyYW5zaXRpb24gZ2V0cyBpdHMgb3duIGxhbmUsIHVudGlsIHdlXG4gIC8vIHJ1biBvdXQgb2YgbGFuZXMgYW5kIGN5Y2xlIGJhY2sgdG8gdGhlIGJlZ2lubmluZy5cbiAgdmFyIGxhbmUgPSBuZXh0VHJhbnNpdGlvbkxhbmU7XG4gIG5leHRUcmFuc2l0aW9uTGFuZSA8PD0gMTtcblxuICBpZiAoKG5leHRUcmFuc2l0aW9uTGFuZSAmIFRyYW5zaXRpb25MYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGNsYWltTmV4dFJldHJ5TGFuZSgpIHtcbiAgdmFyIGxhbmUgPSBuZXh0UmV0cnlMYW5lO1xuICBuZXh0UmV0cnlMYW5lIDw8PSAxO1xuXG4gIGlmICgobmV4dFJldHJ5TGFuZSAmIFJldHJ5TGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgbmV4dFJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgcmV0dXJuIGxhbmVzICYgLWxhbmVzO1xufVxuZnVuY3Rpb24gcGlja0FyYml0cmFyeUxhbmUobGFuZXMpIHtcbiAgLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGdldHMgaW5saW5lZC4gT25seSBleGlzdHMgc28gdG8gY29tbXVuaWNhdGUgdGhhdCBpdFxuICAvLyBkb2Vzbid0IG1hdHRlciB3aGljaCBiaXQgaXMgc2VsZWN0ZWQ7IHlvdSBjYW4gcGljayBhbnkgYml0IHdpdGhvdXRcbiAgLy8gYWZmZWN0aW5nIHRoZSBhbGdvcml0aG1zIHdoZXJlIGl0cyB1c2VkLiBIZXJlIEknbSB1c2luZ1xuICAvLyBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lIGJlY2F1c2UgaXQgcmVxdWlyZXMgdGhlIGZld2VzdCBvcGVyYXRpb25zLlxuICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpIHtcbiAgcmV0dXJuIDMxIC0gY2x6MzIobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBsYW5lVG9JbmRleChsYW5lKSB7XG4gIHJldHVybiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmUpO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlc1NvbWVMYW5lKGEsIGIpIHtcbiAgcmV0dXJuIChhICYgYikgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpc1N1YnNldE9mTGFuZXMoc2V0LCBzdWJzZXQpIHtcbiAgcmV0dXJuIChzZXQgJiBzdWJzZXQpID09PSBzdWJzZXQ7XG59XG5mdW5jdGlvbiBtZXJnZUxhbmVzKGEsIGIpIHtcbiAgcmV0dXJuIGEgfCBiO1xufVxuZnVuY3Rpb24gcmVtb3ZlTGFuZXMoc2V0LCBzdWJzZXQpIHtcbiAgcmV0dXJuIHNldCAmIH5zdWJzZXQ7XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhICYgYjtcbn0gLy8gU2VlbXMgcmVkdW5kYW50LCBidXQgaXQgY2hhbmdlcyB0aGUgdHlwZSBmcm9tIGEgc2luZ2xlIGxhbmUgKHVzZWQgZm9yXG4vLyB1cGRhdGVzKSB0byBhIGdyb3VwIG9mIGxhbmVzICh1c2VkIGZvciBmbHVzaGluZyB3b3JrKS5cblxuZnVuY3Rpb24gbGFuZVRvTGFuZXMobGFuZSkge1xuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGhpZ2hlclByaW9yaXR5TGFuZShhLCBiKSB7XG4gIC8vIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYml0IHJhbmdlcyBkZWNyZWFzZSBpbiBwcmlvcml0eSBhcyB5b3UgZ28gbGVmdC5cbiAgcmV0dXJuIGEgIT09IE5vTGFuZSAmJiBhIDwgYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gY3JlYXRlTGFuZU1hcChpbml0aWFsKSB7XG4gIC8vIEludGVudGlvbmFsbHkgcHVzaGluZyBvbmUgYnkgb25lLlxuICAvLyBodHRwczovL3Y4LmRldi9ibG9nL2VsZW1lbnRzLWtpbmRzI2F2b2lkLWNyZWF0aW5nLWhvbGVzXG4gIHZhciBsYW5lTWFwID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBUb3RhbExhbmVzOyBpKyspIHtcbiAgICBsYW5lTWFwLnB1c2goaW5pdGlhbCk7XG4gIH1cblxuICByZXR1cm4gbGFuZU1hcDtcbn1cbmZ1bmN0aW9uIG1hcmtSb290VXBkYXRlZChyb290LCB1cGRhdGVMYW5lLCBldmVudFRpbWUpIHtcbiAgcm9vdC5wZW5kaW5nTGFuZXMgfD0gdXBkYXRlTGFuZTsgLy8gSWYgdGhlcmUgYXJlIGFueSBzdXNwZW5kZWQgdHJhbnNpdGlvbnMsIGl0J3MgcG9zc2libGUgdGhpcyBuZXcgdXBkYXRlXG4gIC8vIGNvdWxkIHVuYmxvY2sgdGhlbS4gQ2xlYXIgdGhlIHN1c3BlbmRlZCBsYW5lcyBzbyB0aGF0IHdlIGNhbiB0cnkgcmVuZGVyaW5nXG4gIC8vIHRoZW0gYWdhaW4uXG4gIC8vXG4gIC8vIFRPRE86IFdlIHJlYWxseSBvbmx5IG5lZWQgdG8gdW5zdXNwZW5kIG9ubHkgbGFuZXMgdGhhdCBhcmUgaW4gdGhlXG4gIC8vIGBzdWJ0cmVlTGFuZXNgIG9mIHRoZSB1cGRhdGVkIGZpYmVyLCBvciB0aGUgdXBkYXRlIGxhbmVzIG9mIHRoZSByZXR1cm5cbiAgLy8gcGF0aC4gVGhpcyB3b3VsZCBleGNsdWRlIHN1c3BlbmRlZCB1cGRhdGVzIGluIGFuIHVucmVsYXRlZCBzaWJsaW5nIHRyZWUsXG4gIC8vIHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IGZvciB0aGlzIHVwZGF0ZSB0byB1bmJsb2NrIGl0LlxuICAvL1xuICAvLyBXZSBkb24ndCBkbyB0aGlzIGlmIHRoZSBpbmNvbWluZyB1cGRhdGUgaXMgaWRsZSwgYmVjYXVzZSB3ZSBuZXZlciBwcm9jZXNzXG4gIC8vIGlkbGUgdXBkYXRlcyB1bnRpbCBhZnRlciBhbGwgdGhlIHJlZ3VsYXIgdXBkYXRlcyBoYXZlIGZpbmlzaGVkOyB0aGVyZSdzIG5vXG4gIC8vIHdheSBpdCBjb3VsZCB1bmJsb2NrIGEgdHJhbnNpdGlvbi5cblxuICBpZiAodXBkYXRlTGFuZSAhPT0gSWRsZUxhbmUpIHtcbiAgICByb290LnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgICByb290LnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleCh1cGRhdGVMYW5lKTsgLy8gV2UgY2FuIGFsd2F5cyBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdGltZXN0YW1wIGJlY2F1c2Ugd2UgcHJlZmVyIHRoZSBtb3N0XG4gIC8vIHJlY2VudCBldmVudCwgYW5kIHdlIGFzc3VtZSB0aW1lIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy5cblxuICBldmVudFRpbWVzW2luZGV4XSA9IGV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7XG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgfD0gc3VzcGVuZGVkTGFuZXM7XG4gIHJvb3QucGluZ2VkTGFuZXMgJj0gfnN1c3BlbmRlZExhbmVzOyAvLyBUaGUgc3VzcGVuZGVkIGxhbmVzIGFyZSBubyBsb25nZXIgQ1BVLWJvdW5kLiBDbGVhciB0aGVpciBleHBpcmF0aW9uIHRpbWVzLlxuXG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lcztcbiAgdmFyIGxhbmVzID0gc3VzcGVuZGVkTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzLCBldmVudFRpbWUpIHtcbiAgcm9vdC5waW5nZWRMYW5lcyB8PSByb290LnN1c3BlbmRlZExhbmVzICYgcGluZ2VkTGFuZXM7XG59XG5mdW5jdGlvbiBtYXJrUm9vdEZpbmlzaGVkKHJvb3QsIHJlbWFpbmluZ0xhbmVzKSB7XG4gIHZhciBub0xvbmdlclBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzICYgfnJlbWFpbmluZ0xhbmVzO1xuICByb290LnBlbmRpbmdMYW5lcyA9IHJlbWFpbmluZ0xhbmVzOyAvLyBMZXQncyB0cnkgZXZlcnl0aGluZyBhZ2FpblxuXG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICByb290LnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgcm9vdC5leHBpcmVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QubXV0YWJsZVJlYWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5lbnRhbmdsZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7IC8vIENsZWFyIHRoZSBsYW5lcyB0aGF0IG5vIGxvbmdlciBoYXZlIHBlbmRpbmcgd29ya1xuXG4gIHZhciBsYW5lcyA9IG5vTG9uZ2VyUGVuZGluZ0xhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZW50YW5nbGVtZW50c1tpbmRleF0gPSBOb0xhbmVzO1xuICAgIGV2ZW50VGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBlbnRhbmdsZWRMYW5lcykge1xuICAvLyBJbiBhZGRpdGlvbiB0byBlbnRhbmdsaW5nIGVhY2ggb2YgdGhlIGdpdmVuIGxhbmVzIHdpdGggZWFjaCBvdGhlciwgd2UgYWxzb1xuICAvLyBoYXZlIHRvIGNvbnNpZGVyIF90cmFuc2l0aXZlXyBlbnRhbmdsZW1lbnRzLiBGb3IgZWFjaCBsYW5lIHRoYXQgaXMgYWxyZWFkeVxuICAvLyBlbnRhbmdsZWQgd2l0aCAqYW55KiBvZiB0aGUgZ2l2ZW4gbGFuZXMsIHRoYXQgbGFuZSBpcyBub3cgdHJhbnNpdGl2ZWx5XG4gIC8vIGVudGFuZ2xlZCB3aXRoICphbGwqIHRoZSBnaXZlbiBsYW5lcy5cbiAgLy9cbiAgLy8gVHJhbnNsYXRlZDogSWYgQyBpcyBlbnRhbmdsZWQgd2l0aCBBLCB0aGVuIGVudGFuZ2xpbmcgQSB3aXRoIEIgYWxzb1xuICAvLyBlbnRhbmdsZXMgQyB3aXRoIEIuXG4gIC8vXG4gIC8vIElmIHRoaXMgaXMgaGFyZCB0byBncmFzcCwgaXQgbWlnaHQgaGVscCB0byBpbnRlbnRpb25hbGx5IGJyZWFrIHRoaXNcbiAgLy8gZnVuY3Rpb24gYW5kIGxvb2sgYXQgdGhlIHRlc3RzIHRoYXQgZmFpbCBpbiBSZWFjdFRyYW5zaXRpb24tdGVzdC5qcy4gVHJ5XG4gIC8vIGNvbW1lbnRpbmcgb3V0IG9uZSBvZiB0aGUgY29uZGl0aW9ucyBiZWxvdy5cbiAgdmFyIHJvb3RFbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXMgfD0gZW50YW5nbGVkTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgbGFuZXMgPSByb290RW50YW5nbGVkTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuXG4gICAgaWYgKCAvLyBJcyB0aGlzIG9uZSBvZiB0aGUgbmV3bHkgZW50YW5nbGVkIGxhbmVzP1xuICAgIGxhbmUgJiBlbnRhbmdsZWRMYW5lcyB8IC8vIElzIHRoaXMgbGFuZSB0cmFuc2l0aXZlbHkgZW50YW5nbGVkIHdpdGggdGhlIG5ld2x5IGVudGFuZ2xlZCBsYW5lcz9cbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSAmIGVudGFuZ2xlZExhbmVzKSB7XG4gICAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSB8PSBlbnRhbmdsZWRMYW5lcztcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcykge1xuICB2YXIgcmVuZGVyTGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUocmVuZGVyTGFuZXMpO1xuICB2YXIgbGFuZTtcblxuICBzd2l0Y2ggKHJlbmRlckxhbmUpIHtcbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICBsYW5lID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICAgIGxhbmUgPSBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICBsYW5lID0gVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgICBsYW5lID0gSWRsZUh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBFdmVyeXRoaW5nIGVsc2UgaXMgYWxyZWFkeSBlaXRoZXIgYSBoeWRyYXRpb24gbGFuZSwgb3Igc2hvdWxkbid0XG4gICAgICAvLyBiZSByZXRyaWVkIGF0IGEgaHlkcmF0aW9uIGxhbmUuXG4gICAgICBsYW5lID0gTm9MYW5lO1xuICAgICAgYnJlYWs7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlIGxhbmUgd2UgY2hvc2UgaXMgc3VzcGVuZGVkLiBJZiBzbywgdGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZVxuICAvLyBhbHJlYWR5IGF0dGVtcHRlZCBhbmQgZmFpbGVkIHRvIGh5ZHJhdGUgYXQgdGhhdCBsZXZlbC4gQWxzbyBjaGVjayBpZiB3ZSdyZVxuICAvLyBhbHJlYWR5IHJlbmRlcmluZyB0aGF0IGxhbmUsIHdoaWNoIGlzIHJhcmUgYnV0IGNvdWxkIGhhcHBlbi5cblxuXG4gIGlmICgobGFuZSAmIChyb290LnN1c3BlbmRlZExhbmVzIHwgcmVuZGVyTGFuZXMpKSAhPT0gTm9MYW5lKSB7XG4gICAgLy8gR2l2ZSB1cCB0cnlpbmcgdG8gaHlkcmF0ZSBhbmQgZmFsbCBiYWNrIHRvIGNsaWVudCByZW5kZXIuXG4gICAgcmV0dXJuIE5vTGFuZTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIGZpYmVyLCBsYW5lcykge1xuXG4gIGlmICghaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDtcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgdXBkYXRlcnMgPSBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwW2luZGV4XTtcbiAgICB1cGRhdGVycy5hZGQoZmliZXIpO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpIHtcblxuICBpZiAoIWlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXA7XG4gIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciB1cGRhdGVycyA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuXG4gICAgaWYgKHVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICB1cGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgIW1lbW9pemVkVXBkYXRlcnMuaGFzKGFsdGVybmF0ZSkpIHtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmFkZChmaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdXBkYXRlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcyhyb290LCBsYW5lcykge1xuICB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxudmFyIERpc2NyZXRlRXZlbnRQcmlvcml0eSA9IFN5bmNMYW5lO1xudmFyIENvbnRpbnVvdXNFdmVudFByaW9yaXR5ID0gSW5wdXRDb250aW51b3VzTGFuZTtcbnZhciBEZWZhdWx0RXZlbnRQcmlvcml0eSA9IERlZmF1bHRMYW5lO1xudmFyIElkbGVFdmVudFByaW9yaXR5ID0gSWRsZUxhbmU7XG52YXIgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gTm9MYW5lO1xuZnVuY3Rpb24gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCkge1xuICByZXR1cm4gY3VycmVudFVwZGF0ZVByaW9yaXR5O1xufVxuZnVuY3Rpb24gc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KG5ld1ByaW9yaXR5KSB7XG4gIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IG5ld1ByaW9yaXR5O1xufVxuZnVuY3Rpb24gcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5LCBmbikge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGN1cnJlbnRVcGRhdGVQcmlvcml0eTtcblxuICB0cnkge1xuICAgIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IHByaW9yaXR5O1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IHByZXZpb3VzUHJpb3JpdHk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZ2hlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSAhPT0gMCAmJiBhIDwgYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gbG93ZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgPT09IDAgfHwgYSA+IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGlzSGlnaGVyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhICE9PSAwICYmIGEgPCBiO1xufVxuZnVuY3Rpb24gbGFuZXNUb0V2ZW50UHJpb3JpdHkobGFuZXMpIHtcbiAgdmFyIGxhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTtcblxuICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHksIGxhbmUpKSB7XG4gICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KENvbnRpbnVvdXNFdmVudFByaW9yaXR5LCBsYW5lKSkge1xuICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIGlmIChpbmNsdWRlc05vbklkbGVXb3JrKGxhbmUpKSB7XG4gICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xufVxuXG4vLyBUaGlzIGlzIGltcG9ydGVkIGJ5IHRoZSBldmVudCByZXBsYXlpbmcgaW1wbGVtZW50YXRpb24gaW4gUmVhY3QgRE9NLiBJdCdzXG4vLyBpbiBhIHNlcGFyYXRlIGZpbGUgdG8gYnJlYWsgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHJlbmRlcmVyIGFuZFxuLy8gdGhlIHJlY29uY2lsZXIuXG5mdW5jdGlvbiBpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpIHtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHJvb3QuY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gY3VycmVudFN0YXRlLmlzRGVoeWRyYXRlZDtcbn1cblxudmFyIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb247XG5cbmZ1bmN0aW9uIHNldEF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmbikge1xuICBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uID0gZm47XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpIHtcbiAgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcik7XG59XG52YXIgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb247XG5mdW5jdGlvbiBzZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihmbikge1xuICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiA9IGZuO1xufVxudmFyIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eTtcbmZ1bmN0aW9uIHNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkgPSBmbjtcbn1cbnZhciBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMTtcbmZ1bmN0aW9uIHNldEdldEN1cnJlbnRVcGRhdGVQcmlvcml0eShmbikge1xuICBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMSA9IGZuO1xufVxudmFyIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5O1xuZnVuY3Rpb24gc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkgPSBmbjtcbn0gLy8gVE9ETzogVXBncmFkZSB0aGlzIGRlZmluaXRpb24gb25jZSB3ZSdyZSBvbiBhIG5ld2VyIHZlcnNpb24gb2YgRmxvdyB0aGF0XG4vLyBoYXMgdGhpcyBkZWZpbml0aW9uIGJ1aWx0LWluLlxuXG52YXIgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IGZhbHNlOyAvLyBUaGUgcXVldWUgb2YgZGlzY3JldGUgZXZlbnRzIHRvIGJlIHJlcGxheWVkLlxuXG52YXIgcXVldWVkRGlzY3JldGVFdmVudHMgPSBbXTsgLy8gSW5kaWNhdGVzIGlmIGFueSBjb250aW51b3VzIGV2ZW50IHRhcmdldHMgYXJlIG5vbi1udWxsIGZvciBlYXJseSBiYWlsb3V0LlxuLy8gaWYgdGhlIGxhc3QgdGFyZ2V0IHdhcyBkZWh5ZHJhdGVkLlxuXG52YXIgcXVldWVkRm9jdXMgPSBudWxsO1xudmFyIHF1ZXVlZERyYWcgPSBudWxsO1xudmFyIHF1ZXVlZE1vdXNlID0gbnVsbDsgLy8gRm9yIHBvaW50ZXIgZXZlbnRzIHRoZXJlIGNhbiBiZSBvbmUgbGF0ZXN0IGV2ZW50IHBlciBwb2ludGVySWQuXG5cbnZhciBxdWV1ZWRQb2ludGVycyA9IG5ldyBNYXAoKTtcbnZhciBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMgPSBuZXcgTWFwKCk7IC8vIFdlIGNvdWxkIGNvbnNpZGVyIHJlcGxheWluZyBzZWxlY3Rpb25jaGFuZ2UgYW5kIHRvdWNobW92ZXMgdG9vLlxuXG52YXIgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzID0gW107XG52YXIgZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzID0gWydtb3VzZWRvd24nLCAnbW91c2V1cCcsICd0b3VjaGNhbmNlbCcsICd0b3VjaGVuZCcsICd0b3VjaHN0YXJ0JywgJ2F1eGNsaWNrJywgJ2RibGNsaWNrJywgJ3BvaW50ZXJjYW5jZWwnLCAncG9pbnRlcmRvd24nLCAncG9pbnRlcnVwJywgJ2RyYWdlbmQnLCAnZHJhZ3N0YXJ0JywgJ2Ryb3AnLCAnY29tcG9zaXRpb25lbmQnLCAnY29tcG9zaXRpb25zdGFydCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ2lucHV0JywgJ3RleHRJbnB1dCcsIC8vIEludGVudGlvbmFsbHkgY2FtZWxDYXNlXG4nY29weScsICdjdXQnLCAncGFzdGUnLCAnY2xpY2snLCAnY2hhbmdlJywgJ2NvbnRleHRtZW51JywgJ3Jlc2V0JywgJ3N1Ym1pdCddO1xuZnVuY3Rpb24gaXNEaXNjcmV0ZUV2ZW50VGhhdFJlcXVpcmVzSHlkcmF0aW9uKGV2ZW50VHlwZSkge1xuICByZXR1cm4gZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzLmluZGV4T2YoZXZlbnRUeXBlKSA+IC0xO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBibG9ja2VkT246IGJsb2NrZWRPbixcbiAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICBldmVudFN5c3RlbUZsYWdzOiBldmVudFN5c3RlbUZsYWdzLFxuICAgIG5hdGl2ZUV2ZW50OiBuYXRpdmVFdmVudCxcbiAgICB0YXJnZXRDb250YWluZXJzOiBbdGFyZ2V0Q29udGFpbmVyXVxuICB9O1xufVxuXG5mdW5jdGlvbiBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5kZWxldGUocG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUoX3BvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoZXhpc3RpbmdRdWV1ZWRFdmVudCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKGV4aXN0aW5nUXVldWVkRXZlbnQgPT09IG51bGwgfHwgZXhpc3RpbmdRdWV1ZWRFdmVudC5uYXRpdmVFdmVudCAhPT0gbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9maWJlcjIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGFyZ2V0LlxuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWVkRXZlbnQ7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IHF1ZXVlZCB0aGlzIGV4YWN0IGV2ZW50LCB0aGVuIGl0J3MgYmVjYXVzZVxuICAvLyB0aGUgZGlmZmVyZW50IGV2ZW50IHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgRE9NIGV2ZW50IGxpc3RlbmVycy5cbiAgLy8gV2UgY2FuIGFjY3VtdWxhdGUgdGhlIGZsYWdzLCBhbmQgdGhlIHRhcmdldENvbnRhaW5lcnMsIGFuZFxuICAvLyBzdG9yZSBhIHNpbmdsZSBldmVudCB0byBiZSByZXBsYXllZC5cblxuXG4gIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzO1xuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IGV4aXN0aW5nUXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBudWxsICYmIHRhcmdldENvbnRhaW5lcnMuaW5kZXhPZih0YXJnZXRDb250YWluZXIpID09PSAtMSkge1xuICAgIHRhcmdldENvbnRhaW5lcnMucHVzaCh0YXJnZXRDb250YWluZXIpO1xuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nUXVldWVkRXZlbnQ7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVGhlc2Ugc2V0IHJlbGF0ZWRUYXJnZXQgdG8gbnVsbCBiZWNhdXNlIHRoZSByZXBsYXllZCBldmVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgd2VcbiAgLy8gbW92ZWQgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cgKG5vIHRhcmdldCkgb250byB0aGUgdGFyZ2V0IG9uY2UgaXQgaHlkcmF0ZXMuXG4gIC8vIEluc3RlYWQgb2YgbXV0YXRpbmcgd2UgY291bGQgY2xvbmUgdGhlIGV2ZW50LlxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAge1xuICAgICAgICB2YXIgZm9jdXNFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRGb2N1cyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRm9jdXMsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGZvY3VzRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBkcmFnRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRHJhZywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZHJhZ0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgbW91c2VFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRNb3VzZSA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkTW91c2UsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG1vdXNlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuc2V0KHBvaW50ZXJJZCwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVycy5nZXQocG9pbnRlcklkKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBwb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBfcG9pbnRlcklkMiA9IF9wb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuc2V0KF9wb2ludGVySWQyLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5nZXQoX3BvaW50ZXJJZDIpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIF9wb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IC8vIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGlzIHVuYmxvY2tlZC4gUmV0dXJucyB0cnVlIGlmIGl0J3MgdW5ibG9ja2VkLlxuXG5mdW5jdGlvbiBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hhcmVzIGEgbG90IG9mIGxvZ2ljIHdpdGggZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudC5cbiAgLy8gVHJ5IHRvIHVuaWZ5IHRoZW0uIEl0J3MgYSBiaXQgdHJpY2t5IHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgdHdvIHJldHVyblxuICAvLyB2YWx1ZXMuXG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBibG9ja2VkIG9uIGh5ZHJhdGluZyB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIC8vIEluY3JlYXNlIGl0cyBwcmlvcml0eS5cbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gaW5zdGFuY2U7XG4gICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocXVldWVkVGFyZ2V0LnByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7IC8vIFdlIGRvbid0IGN1cnJlbnRseSBoYXZlIGEgd2F5IHRvIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZlxuICAgICAgICAgIC8vIGEgcm9vdCBvdGhlciB0aGFuIHN5bmMuXG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcXVldWVFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpIHtcbiAgLy8gVE9ETzogVGhpcyB3aWxsIHJlYWQgdGhlIHByaW9yaXR5IGlmIGl0J3MgZGlzcGF0Y2hlZCBieSB0aGUgUmVhY3RcbiAgLy8gZXZlbnQgc3lzdGVtIGJ1dCBub3QgbmF0aXZlIGV2ZW50cy4gU2hvdWxkIHJlYWQgd2luZG93LmV2ZW50LnR5cGUsIGxpa2VcbiAgLy8gd2UgZG8gZm9yIHVwZGF0ZXMgKGdldEN1cnJlbnRFdmVudFByaW9yaXR5KS5cbiAgdmFyIHVwZGF0ZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDEoKTtcbiAgdmFyIHF1ZXVlZFRhcmdldCA9IHtcbiAgICBibG9ja2VkT246IG51bGwsXG4gICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgcHJpb3JpdHk6IHVwZGF0ZVByaW9yaXR5XG4gIH07XG4gIHZhciBpID0gMDtcblxuICBmb3IgKDsgaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgIC8vIFN0b3Agb25jZSB3ZSBoaXQgdGhlIGZpcnN0IHRhcmdldCB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW5cbiAgICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eSh1cGRhdGVQcmlvcml0eSwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW2ldLnByaW9yaXR5KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNwbGljZShpLCAwLCBxdWV1ZWRUYXJnZXQpO1xuXG4gIGlmIChpID09PSAwKSB7XG4gICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHF1ZXVlZFRhcmdldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkge1xuICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRhcmdldENvbnRhaW5lcnMgPSBxdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuXG4gIHdoaWxlICh0YXJnZXRDb250YWluZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gdGFyZ2V0Q29udGFpbmVyc1swXTtcbiAgICB2YXIgbmV4dEJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQocXVldWVkRXZlbnQuZG9tRXZlbnROYW1lLCBxdWV1ZWRFdmVudC5ldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50KTtcblxuICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHZhciBuYXRpdmVFdmVudCA9IHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgbmF0aXZlRXZlbnRDbG9uZSA9IG5ldyBuYXRpdmVFdmVudC5jb25zdHJ1Y3RvcihuYXRpdmVFdmVudC50eXBlLCBuYXRpdmVFdmVudCk7XG4gICAgICAgIHNldFJlcGxheWluZ0V2ZW50KG5hdGl2ZUV2ZW50Q2xvbmUpO1xuICAgICAgICBuYXRpdmVFdmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChuYXRpdmVFdmVudENsb25lKTtcbiAgICAgICAgcmVzZXRSZXBsYXlpbmdFdmVudCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSdyZSBzdGlsbCBibG9ja2VkLiBUcnkgYWdhaW4gbGF0ZXIuXG4gICAgICB2YXIgX2ZpYmVyMyA9IGdldEluc3RhbmNlRnJvbU5vZGUobmV4dEJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIzICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKF9maWJlcjMpO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBuZXh0QmxvY2tlZE9uO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gVGhpcyB0YXJnZXQgY29udGFpbmVyIHdhcyBzdWNjZXNzZnVsbHkgZGlzcGF0Y2hlZC4gVHJ5IHRoZSBuZXh0LlxuXG5cbiAgICB0YXJnZXRDb250YWluZXJzLnNoaWZ0KCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKHF1ZXVlZEV2ZW50LCBrZXksIG1hcCkge1xuICBpZiAoYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRFdmVudCkpIHtcbiAgICBtYXAuZGVsZXRlKGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGF5VW5ibG9ja2VkRXZlbnRzKCkge1xuICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7XG5cblxuICBpZiAocXVldWVkRm9jdXMgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRGb2N1cykpIHtcbiAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVldWVkRHJhZyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZERyYWcpKSB7XG4gICAgcXVldWVkRHJhZyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRNb3VzZSkpIHtcbiAgICBxdWV1ZWRNb3VzZSA9IG51bGw7XG4gIH1cblxuICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcCk7XG4gIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG51bGw7XG5cbiAgICBpZiAoIWhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQpIHtcbiAgICAgIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSB0cnVlOyAvLyBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGF0dGVtcHQgcmVwbGF5aW5nIGFzIG1hbnkgZXZlbnRzIGFzIGFyZVxuICAgICAgLy8gbm93IHVuYmxvY2tlZC4gVGhpcyBmaXJzdCBtaWdodCBub3QgYWN0dWFsbHkgYmUgdW5ibG9ja2VkIHlldC5cbiAgICAgIC8vIFdlIGNvdWxkIGNoZWNrIGl0IGVhcmx5IHRvIGF2b2lkIHNjaGVkdWxpbmcgYW4gdW5uZWNlc3NhcnkgY2FsbGJhY2suXG5cbiAgICAgIFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKFNjaGVkdWxlci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSwgcmVwbGF5VW5ibG9ja2VkRXZlbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV0cnlJZkJsb2NrZWRPbih1bmJsb2NrZWQpIHtcbiAgLy8gTWFyayBhbnl0aGluZyB0aGF0IHdhcyBibG9ja2VkIG9uIHRoaXMgYXMgbm8gbG9uZ2VyIGJsb2NrZWRcbiAgLy8gYW5kIGVsaWdpYmxlIGZvciBhIHJlcGxheS5cbiAgaWYgKHF1ZXVlZERpc2NyZXRlRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRGlzY3JldGVFdmVudHNbMF0sIHVuYmxvY2tlZCk7IC8vIFRoaXMgaXMgYSBleHBvbmVudGlhbCBzZWFyY2ggZm9yIGVhY2ggYm91bmRhcnkgdGhhdCBjb21taXRzLiBJIHRoaW5rIGl0J3NcbiAgICAvLyB3b3J0aCBpdCBiZWNhdXNlIHdlIGV4cGVjdCB2ZXJ5IGZldyBkaXNjcmV0ZSBldmVudHMgdG8gcXVldWUgdXAgYW5kIG9uY2VcbiAgICAvLyB3ZSBhcmUgYWN0dWFsbHkgZnVsbHkgdW5ibG9ja2VkIGl0IHdpbGwgYmUgZmFzdCB0byByZXBsYXkgdGhlbS5cblxuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWV1ZWRFdmVudCA9IHF1ZXVlZERpc2NyZXRlRXZlbnRzW2ldO1xuXG4gICAgICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocXVldWVkRm9jdXMgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRm9jdXMsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkRHJhZyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREcmFnLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgaWYgKHF1ZXVlZE1vdXNlICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZE1vdXNlLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgdmFyIHVuYmxvY2sgPSBmdW5jdGlvbiAocXVldWVkRXZlbnQpIHtcbiAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpO1xuICB9O1xuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2godW5ibG9jayk7XG4gIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKHVuYmxvY2spO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHF1ZXVlZFRhcmdldCA9IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1tfaV07XG5cbiAgICBpZiAocXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgbmV4dEV4cGxpY2l0VGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzWzBdO1xuXG4gICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuXG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KG5leHRFeHBsaWNpdFRhcmdldCk7XG5cbiAgICAgIGlmIChuZXh0RXhwbGljaXRUYXJnZXQuYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3JlIHVuYmxvY2tlZC5cbiAgICAgICAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOyAvLyBUT0RPOiBjYW4gd2Ugc3RvcCBleHBvcnRpbmcgdGhlc2U/XG5cbnZhciBfZW5hYmxlZCA9IHRydWU7IC8vIFRoaXMgaXMgZXhwb3J0ZWQgaW4gRkIgYnVpbGRzIGZvciB1c2UgYnkgbGVnYWN5IEZCIGxheWVyIGluZnJhLlxuLy8gV2UnZCBsaWtlIHRvIHJlbW92ZSB0aGlzIGJ1dCBpdCdzIG5vdCBjbGVhciBpZiB0aGlzIGlzIHNhZmUuXG5cbmZ1bmN0aW9uIHNldEVuYWJsZWQoZW5hYmxlZCkge1xuICBfZW5hYmxlZCA9ICEhZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGlzRW5hYmxlZCgpIHtcbiAgcmV0dXJuIF9lbmFibGVkO1xufVxuZnVuY3Rpb24gY3JlYXRlRXZlbnRMaXN0ZW5lcldyYXBwZXJXaXRoUHJpb3JpdHkodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MpIHtcbiAgdmFyIGV2ZW50UHJpb3JpdHkgPSBnZXRFdmVudFByaW9yaXR5KGRvbUV2ZW50TmFtZSk7XG4gIHZhciBsaXN0ZW5lcldyYXBwZXI7XG5cbiAgc3dpdGNoIChldmVudFByaW9yaXR5KSB7XG4gICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaERpc2NyZXRlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaENvbnRpbnVvdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICBkZWZhdWx0OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyV3JhcHBlci5iaW5kKG51bGwsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gbnVsbDtcblxuICB0cnkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gbnVsbDtcblxuICB0cnkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShDb250aW51b3VzRXZlbnRQcmlvcml0eSk7XG4gICAgZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKCFfZW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBkaXNwYXRjaEV2ZW50V2l0aEVuYWJsZUNhcHR1cmVQaGFzZVNlbGVjdGl2ZUh5ZHJhdGlvbldpdGhvdXREaXNjcmV0ZUV2ZW50UmVwbGF5KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudFdpdGhFbmFibGVDYXB0dXJlUGhhc2VTZWxlY3RpdmVIeWRyYXRpb25XaXRob3V0RGlzY3JldGVFdmVudFJlcGxheShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIGJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHJldHVybl90YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpO1xuICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpKSB7XG4gICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgcmV0dXJuO1xuICB9IC8vIFdlIG5lZWQgdG8gY2xlYXIgb25seSBpZiB3ZSBkaWRuJ3QgcXVldWUgYmVjYXVzZVxuICAvLyBxdWV1ZWluZyBpcyBhY2N1bXVsYXRpdmUuXG5cblxuICBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuXG4gIGlmIChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSAmJiBpc0Rpc2NyZXRlRXZlbnRUaGF0UmVxdWlyZXNIeWRyYXRpb24oZG9tRXZlbnROYW1lKSkge1xuICAgIHdoaWxlIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIHZhciBmaWJlciA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTtcblxuICAgICAgaWYgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgcmV0dXJuX3RhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBibG9ja2VkT24pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgfVxuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoaXMgaXMgbm90IHJlcGxheWFibGUgc28gd2UnbGwgaW52b2tlIGl0IGJ1dCB3aXRob3V0IGEgdGFyZ2V0LFxuICAvLyBpbiBjYXNlIHRoZSBldmVudCBzeXN0ZW0gbmVlZHMgdG8gdHJhY2UgaXQuXG5cblxuICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgbnVsbCwgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxudmFyIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDsgLy8gUmV0dXJucyBhIFN1c3BlbnNlSW5zdGFuY2Ugb3IgQ29udGFpbmVyIGlmIGl0J3MgYmxvY2tlZC5cbi8vIFRoZSByZXR1cm5fdGFyZ2V0SW5zdCBmaWVsZCBhYm92ZSBpcyBjb25jZXB0dWFsbHkgcGFydCBvZiB0aGUgcmV0dXJuIHZhbHVlLlxuXG5mdW5jdGlvbiBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICAvLyBUT0RPOiBXYXJuIGlmIF9lbmFibGVkIGlzIGZhbHNlLlxuICByZXR1cm5fdGFyZ2V0SW5zdCA9IG51bGw7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHRyZWUgaGFzIGJlZW4gdW5tb3VudGVkIGFscmVhZHkuIERpc3BhdGNoIHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIGV2ZW50IHRvIGJlIHJlcGxheWVkIGxhdGVyLiBBYm9ydCBkaXNwYXRjaGluZyBzaW5jZSB3ZVxuICAgICAgICAgIC8vIGRvbid0IHdhbnQgdGhpcyBldmVudCBkaXNwYXRjaGVkIHR3aWNlIHRocm91Z2ggdGhlIGV2ZW50IHN5c3RlbS5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkaXNjcmV0ZSBldmVudCBpbiB0aGUgcXVldWUuIFNjaGVkdWxlIGFuIGluY3JlYXNlZFxuICAgICAgICAgIC8vIHByaW9yaXR5IGZvciB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIHNvbWV0aGluZyB3ZW50IHdyb25nIGJ1dCB0byBhdm9pZCBibG9ja2luZ1xuICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLCBkaXNwYXRjaCB0aGUgZXZlbnQgd2l0aG91dCBhIHRhcmdldC5cbiAgICAgICAgLy8gVE9ETzogV2Fybi5cblxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zIGR1cmluZyBhIHJlcGxheSBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgaXQgbWlnaHQgYmxvY2tcbiAgICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLlxuICAgICAgICAgIHJldHVybiBnZXRDb250YWluZXJGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKG5lYXJlc3RNb3VudGVkICE9PSB0YXJnZXRJbnN0KSB7XG4gICAgICAgIC8vIElmIHdlIGdldCBhbiBldmVudCAoZXg6IGltZyBvbmxvYWQpIGJlZm9yZSBjb21taXR0aW5nIHRoYXRcbiAgICAgICAgLy8gY29tcG9uZW50J3MgbW91bnQsIGlnbm9yZSBpdCBmb3Igbm93ICh0aGF0IGlzLCB0cmVhdCBpdCBhcyBpZiBpdCB3YXMgYW5cbiAgICAgICAgLy8gZXZlbnQgb24gYSBub24tUmVhY3QgdHJlZSkuIFdlIG1pZ2h0IGFsc28gY29uc2lkZXIgcXVldWVpbmcgZXZlbnRzIGFuZFxuICAgICAgICAvLyBkaXNwYXRjaGluZyB0aGVtIGFmdGVyIHRoZSBtb3VudC5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0OyAvLyBXZSdyZSBub3QgYmxvY2tlZCBvbiBhbnl0aGluZy5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldEV2ZW50UHJpb3JpdHkoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgLy8gVXNlZCBieSBTaW1wbGVFdmVudFBsdWdpbjpcbiAgICBjYXNlICdjYW5jZWwnOlxuICAgIGNhc2UgJ2NsaWNrJzpcbiAgICBjYXNlICdjbG9zZSc6XG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICBjYXNlICdkcmFnc3RhcnQnOlxuICAgIGNhc2UgJ2Ryb3AnOlxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnaW52YWxpZCc6XG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNldXAnOlxuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICBjYXNlICdwYXVzZSc6XG4gICAgY2FzZSAncGxheSc6XG4gICAgY2FzZSAncG9pbnRlcmNhbmNlbCc6XG4gICAgY2FzZSAncG9pbnRlcmRvd24nOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgY2FzZSAncmF0ZWNoYW5nZSc6XG4gICAgY2FzZSAncmVzZXQnOlxuICAgIGNhc2UgJ3Jlc2l6ZSc6XG4gICAgY2FzZSAnc2Vla2VkJzpcbiAgICBjYXNlICdzdWJtaXQnOlxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2hzdGFydCc6XG4gICAgY2FzZSAndm9sdW1lY2hhbmdlJzogLy8gVXNlZCBieSBwb2x5ZmlsbHM6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdjaGFuZ2UnOlxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICBjYXNlICdjb21wb3NpdGlvbnN0YXJ0JzpcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOiAvLyBPbmx5IGVuYWJsZUNyZWF0ZUV2ZW50SGFuZGxlQVBJOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnYmVmb3JlYmx1cic6XG4gICAgY2FzZSAnYWZ0ZXJibHVyJzogLy8gTm90IHVzZWQgYnkgUmVhY3QgYnV0IGNvdWxkIGJlIGJ5IHVzZXIgY29kZTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2JlZm9yZWlucHV0JzpcbiAgICBjYXNlICdibHVyJzpcbiAgICBjYXNlICdmdWxsc2NyZWVuY2hhbmdlJzpcbiAgICBjYXNlICdmb2N1cyc6XG4gICAgY2FzZSAnaGFzaGNoYW5nZSc6XG4gICAgY2FzZSAncG9wc3RhdGUnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnc2VsZWN0c3RhcnQnOlxuICAgICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcm1vdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdzY3JvbGwnOlxuICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd3aGVlbCc6IC8vIE5vdCB1c2VkIGJ5IFJlYWN0IGJ1dCBjb3VsZCBiZSBieSB1c2VyIGNvZGU6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdtb3VzZWVudGVyJzpcbiAgICBjYXNlICdtb3VzZWxlYXZlJzpcbiAgICBjYXNlICdwb2ludGVyZW50ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJsZWF2ZSc6XG4gICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG5cbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgIHtcbiAgICAgICAgLy8gV2UgbWlnaHQgYmUgaW4gdGhlIFNjaGVkdWxlciBjYWxsYmFjay5cbiAgICAgICAgLy8gRXZlbnR1YWxseSB0aGlzIG1lY2hhbmlzbSB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgY2hlY2tcbiAgICAgICAgLy8gb2YgdGhlIGN1cnJlbnQgcHJpb3JpdHkgb24gdGhlIG5hdGl2ZSBzY2hlZHVsZXIuXG4gICAgICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eSA9IGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCk7XG5cbiAgICAgICAgc3dpdGNoIChzY2hlZHVsZXJQcmlvcml0eSkge1xuICAgICAgICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAgICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBMb3dTY2hlZHVsZXJQcmlvcml0eSwgc29tZWhvdy4gTWF5YmUgdGhlIHNhbWUgbGFuZSBhcyBoeWRyYXRpb24uXG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBJZGxlRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lciwgcGFzc2l2ZSkge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB7XG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH0pO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lciwgcGFzc2l2ZSkge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB7XG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG4vKipcbiAqIFRoZXNlIHZhcmlhYmxlcyBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0ZXh0IGNvbnRlbnQgb2YgYSB0YXJnZXQgbm9kZSxcbiAqIGFsbG93aW5nIGNvbXBhcmlzb24gb2YgY29udGVudCBiZWZvcmUgYW5kIGFmdGVyIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogSWRlbnRpZnkgdGhlIG5vZGUgd2hlcmUgc2VsZWN0aW9uIGN1cnJlbnRseSBiZWdpbnMsIHRoZW4gb2JzZXJ2ZVxuICogYm90aCBpdHMgdGV4dCBjb250ZW50IGFuZCBpdHMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgRE9NLiBTaW5jZSB0aGVcbiAqIGJyb3dzZXIgbWF5IG5hdGl2ZWx5IHJlcGxhY2UgdGhlIHRhcmdldCBub2RlIGR1cmluZyBjb21wb3NpdGlvbiwgd2UgY2FuXG4gKiB1c2UgaXRzIHBvc2l0aW9uIHRvIGZpbmQgaXRzIHJlcGxhY2VtZW50LlxuICpcbiAqXG4gKi9cbnZhciByb290ID0gbnVsbDtcbnZhciBzdGFydFRleHQgPSBudWxsO1xudmFyIGZhbGxiYWNrVGV4dCA9IG51bGw7XG5mdW5jdGlvbiBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJvb3QgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgc3RhcnRUZXh0ID0gZ2V0VGV4dCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlc2V0KCkge1xuICByb290ID0gbnVsbDtcbiAgc3RhcnRUZXh0ID0gbnVsbDtcbiAgZmFsbGJhY2tUZXh0ID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldERhdGEoKSB7XG4gIGlmIChmYWxsYmFja1RleHQpIHtcbiAgICByZXR1cm4gZmFsbGJhY2tUZXh0O1xuICB9XG5cbiAgdmFyIHN0YXJ0O1xuICB2YXIgc3RhcnRWYWx1ZSA9IHN0YXJ0VGV4dDtcbiAgdmFyIHN0YXJ0TGVuZ3RoID0gc3RhcnRWYWx1ZS5sZW5ndGg7XG4gIHZhciBlbmQ7XG4gIHZhciBlbmRWYWx1ZSA9IGdldFRleHQoKTtcbiAgdmFyIGVuZExlbmd0aCA9IGVuZFZhbHVlLmxlbmd0aDtcblxuICBmb3IgKHN0YXJ0ID0gMDsgc3RhcnQgPCBzdGFydExlbmd0aDsgc3RhcnQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0XSAhPT0gZW5kVmFsdWVbc3RhcnRdKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgbWluRW5kID0gc3RhcnRMZW5ndGggLSBzdGFydDtcblxuICBmb3IgKGVuZCA9IDE7IGVuZCA8PSBtaW5FbmQ7IGVuZCsrKSB7XG4gICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRMZW5ndGggLSBlbmRdICE9PSBlbmRWYWx1ZVtlbmRMZW5ndGggLSBlbmRdKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgc2xpY2VUYWlsID0gZW5kID4gMSA/IDEgLSBlbmQgOiB1bmRlZmluZWQ7XG4gIGZhbGxiYWNrVGV4dCA9IGVuZFZhbHVlLnNsaWNlKHN0YXJ0LCBzbGljZVRhaWwpO1xuICByZXR1cm4gZmFsbGJhY2tUZXh0O1xufVxuZnVuY3Rpb24gZ2V0VGV4dCgpIHtcbiAgaWYgKCd2YWx1ZScgaW4gcm9vdCkge1xuICAgIHJldHVybiByb290LnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QudGV4dENvbnRlbnQ7XG59XG5cbi8qKlxuICogYGNoYXJDb2RlYCByZXByZXNlbnRzIHRoZSBhY3R1YWwgXCJjaGFyYWN0ZXIgY29kZVwiIGFuZCBpcyBzYWZlIHRvIHVzZSB3aXRoXG4gKiBgU3RyaW5nLmZyb21DaGFyQ29kZWAuIEFzIHN1Y2gsIG9ubHkga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gcHJpbnRhYmxlXG4gKiBjaGFyYWN0ZXJzIHByb2R1Y2UgYSB2YWxpZCBgY2hhckNvZGVgLCB0aGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBpcyBFbnRlci5cbiAqIFRoZSBUYWIta2V5IGlzIGNvbnNpZGVyZWQgbm9uLXByaW50YWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBhIGBjaGFyQ29kZWAsXG4gKiBwcmVzdW1hYmx5IGJlY2F1c2UgaXQgZG9lcyBub3QgcHJvZHVjZSBhIHRhYi1jaGFyYWN0ZXIgaW4gYnJvd3NlcnMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7bnVtYmVyfSBOb3JtYWxpemVkIGBjaGFyQ29kZWAgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNoYXJDb2RlO1xuICB2YXIga2V5Q29kZSA9IG5hdGl2ZUV2ZW50LmtleUNvZGU7XG5cbiAgaWYgKCdjaGFyQ29kZScgaW4gbmF0aXZlRXZlbnQpIHtcbiAgICBjaGFyQ29kZSA9IG5hdGl2ZUV2ZW50LmNoYXJDb2RlOyAvLyBGRiBkb2VzIG5vdCBzZXQgYGNoYXJDb2RlYCBmb3IgdGhlIEVudGVyLWtleSwgY2hlY2sgYWdhaW5zdCBga2V5Q29kZWAuXG5cbiAgICBpZiAoY2hhckNvZGUgPT09IDAgJiYga2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgIGNoYXJDb2RlID0gMTM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElFOCBkb2VzIG5vdCBpbXBsZW1lbnQgYGNoYXJDb2RlYCwgYnV0IGBrZXlDb2RlYCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUuXG4gICAgY2hhckNvZGUgPSBrZXlDb2RlO1xuICB9IC8vIElFIGFuZCBFZGdlIChvbiBXaW5kb3dzKSBhbmQgQ2hyb21lIC8gU2FmYXJpIChvbiBXaW5kb3dzIGFuZCBMaW51eClcbiAgLy8gcmVwb3J0IEVudGVyIGFzIGNoYXJDb2RlIDEwIHdoZW4gY3RybCBpcyBwcmVzc2VkLlxuXG5cbiAgaWYgKGNoYXJDb2RlID09PSAxMCkge1xuICAgIGNoYXJDb2RlID0gMTM7XG4gIH0gLy8gU29tZSBub24tcHJpbnRhYmxlIGtleXMgYXJlIHJlcG9ydGVkIGluIGBjaGFyQ29kZWAvYGtleUNvZGVgLCBkaXNjYXJkIHRoZW0uXG4gIC8vIE11c3Qgbm90IGRpc2NhcmQgdGhlIChub24tKXByaW50YWJsZSBFbnRlci1rZXkuXG5cblxuICBpZiAoY2hhckNvZGUgPj0gMzIgfHwgY2hhckNvZGUgPT09IDEzKSB7XG4gICAgcmV0dXJuIGNoYXJDb2RlO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhIGZhY3Rvcnkgc28gdGhhdCB3ZSBoYXZlIGRpZmZlcmVudCByZXR1cm5lZCBjb25zdHJ1Y3RvcnMuXG4vLyBJZiB3ZSBoYWQgYSBzaW5nbGUgY29uc3RydWN0b3IsIGl0IHdvdWxkIGJlIG1lZ2Ftb3JwaGljIGFuZCBlbmdpbmVzIHdvdWxkIGRlb3B0LlxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEludGVyZmFjZSkge1xuICAvKipcbiAgICogU3ludGhldGljIGV2ZW50cyBhcmUgZGlzcGF0Y2hlZCBieSBldmVudCBwbHVnaW5zLCB0eXBpY2FsbHkgaW4gcmVzcG9uc2UgdG8gYVxuICAgKiB0b3AtbGV2ZWwgZXZlbnQgZGVsZWdhdGlvbiBoYW5kbGVyLlxuICAgKlxuICAgKiBUaGVzZSBzeXN0ZW1zIHNob3VsZCBnZW5lcmFsbHkgdXNlIHBvb2xpbmcgdG8gcmVkdWNlIHRoZSBmcmVxdWVuY3kgb2YgZ2FyYmFnZVxuICAgKiBjb2xsZWN0aW9uLiBUaGUgc3lzdGVtIHNob3VsZCBjaGVjayBgaXNQZXJzaXN0ZW50YCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVcbiAgICogZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGludG8gdGhlIHBvb2wgYWZ0ZXIgYmVpbmcgZGlzcGF0Y2hlZC4gVXNlcnMgdGhhdFxuICAgKiBuZWVkIGEgcGVyc2lzdGVkIGV2ZW50IHNob3VsZCBpbnZva2UgYHBlcnNpc3RgLlxuICAgKlxuICAgKiBTeW50aGV0aWMgZXZlbnRzIChhbmQgc3ViY2xhc3NlcykgaW1wbGVtZW50IHRoZSBET00gTGV2ZWwgMyBFdmVudHMgQVBJIGJ5XG4gICAqIG5vcm1hbGl6aW5nIGJyb3dzZXIgcXVpcmtzLiBTdWJjbGFzc2VzIGRvIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRvIGltcGxlbWVudCBhXG4gICAqIERPTSBpbnRlcmZhY2U7IGN1c3RvbSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBldmVudHMgY2FuIGFsc28gc3ViY2xhc3MgdGhpcy5cbiAgICovXG4gIGZ1bmN0aW9uIFN5bnRoZXRpY0Jhc2VFdmVudChyZWFjdE5hbWUsIHJlYWN0RXZlbnRUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICB0aGlzLl9yZWFjdE5hbWUgPSByZWFjdE5hbWU7XG4gICAgdGhpcy5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7XG4gICAgdGhpcy50eXBlID0gcmVhY3RFdmVudFR5cGU7XG4gICAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgIHRoaXMudGFyZ2V0ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcblxuICAgIGZvciAodmFyIF9wcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHtcbiAgICAgIGlmICghSW50ZXJmYWNlLmhhc093blByb3BlcnR5KF9wcm9wTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBub3JtYWxpemUgPSBJbnRlcmZhY2VbX3Byb3BOYW1lXTtcblxuICAgICAgaWYgKG5vcm1hbGl6ZSkge1xuICAgICAgICB0aGlzW19wcm9wTmFtZV0gPSBub3JtYWxpemUobmF0aXZlRXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbmF0aXZlRXZlbnRbX3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgIT0gbnVsbCA/IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgOiBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZSA9PT0gZmFsc2U7XG5cbiAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFzc2lnbihTeW50aGV0aWNCYXNlRXZlbnQucHJvdG90eXBlLCB7XG4gICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vICRGbG93Rml4TWUgLSBmbG93IGlzIG5vdCBhd2FyZSBvZiBgdW5rbm93bmAgaW4gSUVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LnJldHVyblZhbHVlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9LFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcblxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vICRGbG93Rml4TWUgLSBmbG93IGlzIG5vdCBhd2FyZSBvZiBgdW5rbm93bmAgaW4gSUVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAgIC8vIFRoZSBDaGFuZ2VFdmVudFBsdWdpbiByZWdpc3RlcnMgYSBcInByb3BlcnR5Y2hhbmdlXCIgZXZlbnQgZm9yXG4gICAgICAgIC8vIElFLiBUaGlzIGV2ZW50IGRvZXMgbm90IHN1cHBvcnQgYnViYmxpbmcgb3IgY2FuY2VsbGluZywgYW5kXG4gICAgICAgIC8vIGFueSByZWZlcmVuY2VzIHRvIGNhbmNlbEJ1YmJsZSB0aHJvdyBcIk1lbWJlciBub3QgZm91bmRcIi4gIEFcbiAgICAgICAgLy8gdHlwZW9mIGNoZWNrIG9mIFwidW5rbm93blwiIGNpcmN1bXZlbnRzIHRoaXMgaXNzdWUgKGFuZCBpcyBhbHNvXG4gICAgICAgIC8vIElFIHNwZWNpZmljKS5cbiAgICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXZSByZWxlYXNlIGFsbCBkaXNwYXRjaGVkIGBTeW50aGV0aWNFdmVudGBzIGFmdGVyIGVhY2ggZXZlbnQgbG9vcCwgYWRkaW5nXG4gICAgICogdGhlbSBiYWNrIGludG8gdGhlIHBvb2wuIFRoaXMgYWxsb3dzIGEgd2F5IHRvIGhvbGQgb250byBhIHJlZmVyZW5jZSB0aGF0XG4gICAgICogd29uJ3QgYmUgYWRkZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgICAqL1xuICAgIHBlcnNpc3Q6IGZ1bmN0aW9uICgpIHsvLyBNb2Rlcm4gZXZlbnQgc3lzdGVtIGRvZXNuJ3QgdXNlIHBvb2xpbmcuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoaXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzUGVyc2lzdGVudDogZnVuY3Rpb25UaGF0UmV0dXJuc1RydWVcbiAgfSk7XG4gIHJldHVybiBTeW50aGV0aWNCYXNlRXZlbnQ7XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIEV2ZW50SW50ZXJmYWNlID0ge1xuICBldmVudFBoYXNlOiAwLFxuICBidWJibGVzOiAwLFxuICBjYW5jZWxhYmxlOiAwLFxuICB0aW1lU3RhbXA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBldmVudC50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcbiAgfSxcbiAgZGVmYXVsdFByZXZlbnRlZDogMCxcbiAgaXNUcnVzdGVkOiAwXG59O1xudmFyIFN5bnRoZXRpY0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgVUlFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgdmlldzogMCxcbiAgZGV0YWlsOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChVSUV2ZW50SW50ZXJmYWNlKTtcbnZhciBsYXN0TW92ZW1lbnRYO1xudmFyIGxhc3RNb3ZlbWVudFk7XG52YXIgbGFzdE1vdXNlRXZlbnQ7XG5cbmZ1bmN0aW9uIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKGV2ZW50KSB7XG4gIGlmIChldmVudCAhPT0gbGFzdE1vdXNlRXZlbnQpIHtcbiAgICBpZiAobGFzdE1vdXNlRXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gJ21vdXNlbW92ZScpIHtcbiAgICAgIGxhc3RNb3ZlbWVudFggPSBldmVudC5zY3JlZW5YIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSBldmVudC5zY3JlZW5ZIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IDA7XG4gICAgICBsYXN0TW92ZW1lbnRZID0gMDtcbiAgICB9XG5cbiAgICBsYXN0TW91c2VFdmVudCA9IGV2ZW50O1xuICB9XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgTW91c2VFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgTW91c2VFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBzY3JlZW5YOiAwLFxuICBzY3JlZW5ZOiAwLFxuICBjbGllbnRYOiAwLFxuICBjbGllbnRZOiAwLFxuICBwYWdlWDogMCxcbiAgcGFnZVk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiAwLFxuICBidXR0b25zOiAwLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgfSxcbiAgbW92ZW1lbnRYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WCcgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFg7XG4gICAgfVxuXG4gICAgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpO1xuICAgIHJldHVybiBsYXN0TW92ZW1lbnRYO1xuICB9LFxuICBtb3ZlbWVudFk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRZJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WTtcbiAgICB9IC8vIERvbid0IG5lZWQgdG8gY2FsbCB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZSgpIGhlcmVcbiAgICAvLyBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBoYXZlIGFscmVhZHkgcnVuIHdoZW4gbW92ZW1lbnRYXG4gICAgLy8gd2FzIGNvcGllZC5cblxuXG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFk7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KE1vdXNlRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIERyYWdFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIERyYWdFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBkYXRhVHJhbnNmZXI6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRHJhZ0V2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBGb2N1c0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgRm9jdXNFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICByZWxhdGVkVGFyZ2V0OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0ZvY3VzRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChGb2N1c0V2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWFuaW1hdGlvbnMvI0FuaW1hdGlvbkV2ZW50LWludGVyZmFjZVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQW5pbWF0aW9uRXZlbnRcbiAqL1xuXG52YXIgQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGFuaW1hdGlvbk5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG5cbnZhciBDbGlwYm9hcmRFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgY2xpcGJvYXJkRGF0YTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdjbGlwYm9hcmREYXRhJyBpbiBldmVudCA/IGV2ZW50LmNsaXBib2FyZERhdGEgOiB3aW5kb3cuY2xpcGJvYXJkRGF0YTtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNDbGlwYm9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENsaXBib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1jb21wb3NpdGlvbmV2ZW50c1xuICovXG5cbnZhciBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBkYXRhOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNVxuICogICAgICAvI2V2ZW50cy1pbnB1dGV2ZW50c1xuICovXG4vLyBIYXBwZW5zIHRvIHNoYXJlIHRoZSBzYW1lIGxpc3QgZm9yIG5vdy5cblxudmFyIFN5bnRoZXRpY0lucHV0RXZlbnQgPSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50O1xuLyoqXG4gKiBOb3JtYWxpemF0aW9uIG9mIGRlcHJlY2F0ZWQgSFRNTDUgYGtleWAgdmFsdWVzXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG5cbnZhciBub3JtYWxpemVLZXkgPSB7XG4gIEVzYzogJ0VzY2FwZScsXG4gIFNwYWNlYmFyOiAnICcsXG4gIExlZnQ6ICdBcnJvd0xlZnQnLFxuICBVcDogJ0Fycm93VXAnLFxuICBSaWdodDogJ0Fycm93UmlnaHQnLFxuICBEb3duOiAnQXJyb3dEb3duJyxcbiAgRGVsOiAnRGVsZXRlJyxcbiAgV2luOiAnT1MnLFxuICBNZW51OiAnQ29udGV4dE1lbnUnLFxuICBBcHBzOiAnQ29udGV4dE1lbnUnLFxuICBTY3JvbGw6ICdTY3JvbGxMb2NrJyxcbiAgTW96UHJpbnRhYmxlS2V5OiAnVW5pZGVudGlmaWVkJ1xufTtcbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBsZWdhY3kgYGtleUNvZGVgIHRvIEhUTUw1IGBrZXlgXG4gKiBPbmx5IHNwZWNpYWwga2V5cyBzdXBwb3J0ZWQsIGFsbCBvdGhlcnMgZGVwZW5kIG9uIGtleWJvYXJkIGxheW91dCBvciBicm93c2VyXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG5cbnZhciB0cmFuc2xhdGVUb0tleSA9IHtcbiAgJzgnOiAnQmFja3NwYWNlJyxcbiAgJzknOiAnVGFiJyxcbiAgJzEyJzogJ0NsZWFyJyxcbiAgJzEzJzogJ0VudGVyJyxcbiAgJzE2JzogJ1NoaWZ0JyxcbiAgJzE3JzogJ0NvbnRyb2wnLFxuICAnMTgnOiAnQWx0JyxcbiAgJzE5JzogJ1BhdXNlJyxcbiAgJzIwJzogJ0NhcHNMb2NrJyxcbiAgJzI3JzogJ0VzY2FwZScsXG4gICczMic6ICcgJyxcbiAgJzMzJzogJ1BhZ2VVcCcsXG4gICczNCc6ICdQYWdlRG93bicsXG4gICczNSc6ICdFbmQnLFxuICAnMzYnOiAnSG9tZScsXG4gICczNyc6ICdBcnJvd0xlZnQnLFxuICAnMzgnOiAnQXJyb3dVcCcsXG4gICczOSc6ICdBcnJvd1JpZ2h0JyxcbiAgJzQwJzogJ0Fycm93RG93bicsXG4gICc0NSc6ICdJbnNlcnQnLFxuICAnNDYnOiAnRGVsZXRlJyxcbiAgJzExMic6ICdGMScsXG4gICcxMTMnOiAnRjInLFxuICAnMTE0JzogJ0YzJyxcbiAgJzExNSc6ICdGNCcsXG4gICcxMTYnOiAnRjUnLFxuICAnMTE3JzogJ0Y2JyxcbiAgJzExOCc6ICdGNycsXG4gICcxMTknOiAnRjgnLFxuICAnMTIwJzogJ0Y5JyxcbiAgJzEyMSc6ICdGMTAnLFxuICAnMTIyJzogJ0YxMScsXG4gICcxMjMnOiAnRjEyJyxcbiAgJzE0NCc6ICdOdW1Mb2NrJyxcbiAgJzE0NSc6ICdTY3JvbGxMb2NrJyxcbiAgJzIyNCc6ICdNZXRhJ1xufTtcbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIGBrZXlgIHByb3BlcnR5LlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50S2V5KG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5rZXkpIHtcbiAgICAvLyBOb3JtYWxpemUgaW5jb25zaXN0ZW50IHZhbHVlcyByZXBvcnRlZCBieSBicm93c2VycyBkdWUgdG9cbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgb2YgYSB3b3JraW5nIGRyYWZ0IHNwZWNpZmljYXRpb24uXG4gICAgLy8gRmlyZUZveCBpbXBsZW1lbnRzIGBrZXlgIGJ1dCByZXR1cm5zIGBNb3pQcmludGFibGVLZXlgIGZvciBhbGxcbiAgICAvLyBwcmludGFibGUgY2hhcmFjdGVycyAobm9ybWFsaXplZCB0byBgVW5pZGVudGlmaWVkYCksIGlnbm9yZSBpdC5cbiAgICB2YXIga2V5ID0gbm9ybWFsaXplS2V5W25hdGl2ZUV2ZW50LmtleV0gfHwgbmF0aXZlRXZlbnQua2V5O1xuXG4gICAgaWYgKGtleSAhPT0gJ1VuaWRlbnRpZmllZCcpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9IC8vIEJyb3dzZXIgZG9lcyBub3QgaW1wbGVtZW50IGBrZXlgLCBwb2x5ZmlsbCBhcyBtdWNoIG9mIGl0IGFzIHdlIGNhbi5cblxuXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgdmFyIGNoYXJDb2RlID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCk7IC8vIFRoZSBlbnRlci1rZXkgaXMgdGVjaG5pY2FsbHkgYm90aCBwcmludGFibGUgYW5kIG5vbi1wcmludGFibGUgYW5kIGNhblxuICAgIC8vIHRodXMgYmUgY2FwdHVyZWQgYnkgYGtleXByZXNzYCwgbm8gb3RoZXIgbm9uLXByaW50YWJsZSBrZXkgc2hvdWxkLlxuXG4gICAgcmV0dXJuIGNoYXJDb2RlID09PSAxMyA/ICdFbnRlcicgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgfVxuXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5ZG93bicgfHwgbmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgIC8vIFdoaWxlIHVzZXIga2V5Ym9hcmQgbGF5b3V0IGRldGVybWluZXMgdGhlIGFjdHVhbCBtZWFuaW5nIG9mIGVhY2hcbiAgICAvLyBga2V5Q29kZWAgdmFsdWUsIGFsbW9zdCBhbGwgZnVuY3Rpb24ga2V5cyBoYXZlIGEgdW5pdmVyc2FsIHZhbHVlLlxuICAgIHJldHVybiB0cmFuc2xhdGVUb0tleVtuYXRpdmVFdmVudC5rZXlDb2RlXSB8fCAnVW5pZGVudGlmaWVkJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBtb2RpZmllciBrZXkgdG8gdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgaW4gdGhlIGV2ZW50LlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleXMtTW9kaWZpZXJzXG4gKi9cblxuXG52YXIgbW9kaWZpZXJLZXlUb1Byb3AgPSB7XG4gIEFsdDogJ2FsdEtleScsXG4gIENvbnRyb2w6ICdjdHJsS2V5JyxcbiAgTWV0YTogJ21ldGFLZXknLFxuICBTaGlmdDogJ3NoaWZ0S2V5J1xufTsgLy8gT2xkZXIgYnJvd3NlcnMgKFNhZmFyaSA8PSAxMCwgaU9TIFNhZmFyaSA8PSAxMC4yKSBkbyBub3Qgc3VwcG9ydFxuLy8gZ2V0TW9kaWZpZXJTdGF0ZS4gSWYgZ2V0TW9kaWZpZXJTdGF0ZSBpcyBub3Qgc3VwcG9ydGVkLCB3ZSBtYXAgaXQgdG8gYSBzZXQgb2Zcbi8vIG1vZGlmaWVyIGtleXMgZXhwb3NlZCBieSB0aGUgZXZlbnQuIEluIHRoaXMgY2FzZSwgTG9jay1rZXlzIGFyZSBub3Qgc3VwcG9ydGVkLlxuXG5mdW5jdGlvbiBtb2RpZmllclN0YXRlR2V0dGVyKGtleUFyZykge1xuICB2YXIgc3ludGhldGljRXZlbnQgPSB0aGlzO1xuICB2YXIgbmF0aXZlRXZlbnQgPSBzeW50aGV0aWNFdmVudC5uYXRpdmVFdmVudDtcblxuICBpZiAobmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZSkge1xuICAgIHJldHVybiBuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKGtleUFyZyk7XG4gIH1cblxuICB2YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107XG4gIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXI7XG59XG4vKipcbiAqIEBpbnRlcmZhY2UgS2V5Ym9hcmRFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgS2V5Ym9hcmRFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBrZXk6IGdldEV2ZW50S2V5LFxuICBjb2RlOiAwLFxuICBsb2NhdGlvbjogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgcmVwZWF0OiAwLFxuICBsb2NhbGU6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgLy8gTGVnYWN5IEludGVyZmFjZVxuICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMgbm90IHlldCBmaW5hbCBhbmQgbm90XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gYW55IG1ham9yIGJyb3dzZXIuIE9ubHkgS2V5UHJlc3MgaGFzIGNoYXJDb2RlLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBrZXkuXG4gICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1c2Vycycga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkLiBBc3N1bWluZyB0aGF0IGl0IGlzIGEgVVMga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gcHJvdmlkZXMgYSBzdXJwcmlzaW5nbHkgYWNjdXJhdGUgbWFwcGluZyBmb3IgVVMgYW5kIEV1cm9wZWFuIHVzZXJzLlxuICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVudCBhdCB0aGlzIHRpbWUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlXG4gICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBQb2ludGVyRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvcG9pbnRlcmV2ZW50cy9cbiAqL1xuXG52YXIgUG9pbnRlckV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIHBvaW50ZXJJZDogMCxcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgcHJlc3N1cmU6IDAsXG4gIHRhbmdlbnRpYWxQcmVzc3VyZTogMCxcbiAgdGlsdFg6IDAsXG4gIHRpbHRZOiAwLFxuICB0d2lzdDogMCxcbiAgcG9pbnRlclR5cGU6IDAsXG4gIGlzUHJpbWFyeTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNQb2ludGVyRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChQb2ludGVyRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFRvdWNoRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvdG91Y2gtZXZlbnRzL1xuICovXG5cbnZhciBUb3VjaEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHRvdWNoZXM6IDAsXG4gIHRhcmdldFRvdWNoZXM6IDAsXG4gIGNoYW5nZWRUb3VjaGVzOiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGVcbn0pO1xuXG52YXIgU3ludGhldGljVG91Y2hFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRvdWNoRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtY3NzMy10cmFuc2l0aW9ucy0yMDA5MDMyMC8jdHJhbnNpdGlvbi1ldmVudHMtXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UcmFuc2l0aW9uRXZlbnRcbiAqL1xuXG52YXIgVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBwcm9wZXJ0eU5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRyYW5zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVhgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAocmlnaHQgaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWCcgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVggOiAwO1xuICB9LFxuICBkZWx0YVk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFZJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWWAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVknIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFgIGZvciBJRTw5IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhIDogMDtcbiAgfSxcbiAgZGVsdGFaOiAwLFxuICAvLyBCcm93c2VycyB3aXRob3V0IFwiZGVsdGFNb2RlXCIgaXMgcmVwb3J0aW5nIGluIHJhdyB3aGVlbCBkZWx0YSB3aGVyZSBvbmVcbiAgLy8gbm90Y2ggb24gdGhlIHNjcm9sbCBpcyBhbHdheXMgKy8tIDEyMCwgcm91Z2hseSBlcXVpdmFsZW50IHRvIHBpeGVscy5cbiAgLy8gQSBnb29kIGFwcHJveGltYXRpb24gb2YgRE9NX0RFTFRBX0xJTkUgKDEpIGlzIDUlIG9mIHZpZXdwb3J0IHNpemUgb3JcbiAgLy8gfjQwIHBpeGVscywgZm9yIERPTV9ERUxUQV9TQ1JFRU4gKDIpIGl0IGlzIDg3LjUlIG9mIHZpZXdwb3J0IHNpemUuXG4gIGRlbHRhTW9kZTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNXaGVlbEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoV2hlZWxFdmVudEludGVyZmFjZSk7XG5cbnZhciBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl07IC8vIFRhYiwgUmV0dXJuLCBFc2MsIFNwYWNlXG5cbnZhciBTVEFSVF9LRVlDT0RFID0gMjI5O1xudmFyIGNhblVzZUNvbXBvc2l0aW9uRXZlbnQgPSBjYW5Vc2VET00gJiYgJ0NvbXBvc2l0aW9uRXZlbnQnIGluIHdpbmRvdztcbnZhciBkb2N1bWVudE1vZGUgPSBudWxsO1xuXG5pZiAoY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50KSB7XG4gIGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZTtcbn0gLy8gV2Via2l0IG9mZmVycyBhIHZlcnkgdXNlZnVsIGB0ZXh0SW5wdXRgIGV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgdG9cbi8vIGRpcmVjdGx5IHJlcHJlc2VudCBgYmVmb3JlSW5wdXRgLiBUaGUgSUUgYHRleHRpbnB1dGAgZXZlbnQgaXMgbm90IGFzXG4vLyB1c2VmdWwsIHNvIHdlIGRvbid0IHVzZSBpdC5cblxuXG52YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBjYW5Vc2VET00gJiYgJ1RleHRFdmVudCcgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGU7IC8vIEluIElFOSssIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2l0aW9uIGV2ZW50cywgYnV0IHRoZSBkYXRhIHN1cHBsaWVkXG4vLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljXG4vLyBzcGFjZXMsIGZvciBpbnN0YW5jZSAoXFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuXG5cbnZhciB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA9IGNhblVzZURPTSAmJiAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgfHwgZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50TW9kZSA+IDggJiYgZG9jdW1lbnRNb2RlIDw9IDExKTtcbnZhciBTUEFDRUJBUl9DT0RFID0gMzI7XG52YXIgU1BBQ0VCQVJfQ0hBUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoU1BBQ0VCQVJfQ09ERSk7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQmVmb3JlSW5wdXQnLCBbJ2NvbXBvc2l0aW9uZW5kJywgJ2tleXByZXNzJywgJ3RleHRJbnB1dCcsICdwYXN0ZSddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uRW5kJywgWydjb21wb3NpdGlvbmVuZCcsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uU3RhcnQnLCBbJ2NvbXBvc2l0aW9uc3RhcnQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblVwZGF0ZScsIFsnY29tcG9zaXRpb251cGRhdGUnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG59IC8vIFRyYWNrIHdoZXRoZXIgd2UndmUgZXZlciBoYW5kbGVkIGEga2V5cHJlc3Mgb24gdGhlIHNwYWNlIGtleS5cblxuXG52YXIgaGFzU3BhY2VLZXlwcmVzcyA9IGZhbHNlO1xuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBhIG5hdGl2ZSBrZXlwcmVzcyBldmVudCBpcyBhc3N1bWVkIHRvIGJlIGEgY29tbWFuZC5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBGaXJlZm94IGZpcmVzIGBrZXlwcmVzc2AgZXZlbnRzIGZvciBrZXkgY29tbWFuZHNcbiAqIChjdXQsIGNvcHksIHNlbGVjdC1hbGwsIGV0Yy4pIGV2ZW4gdGhvdWdoIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZC5cbiAqL1xuXG5mdW5jdGlvbiBpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkge1xuICByZXR1cm4gKG5hdGl2ZUV2ZW50LmN0cmxLZXkgfHwgbmF0aXZlRXZlbnQuYWx0S2V5IHx8IG5hdGl2ZUV2ZW50Lm1ldGFLZXkpICYmIC8vIGN0cmxLZXkgJiYgYWx0S2V5IGlzIGVxdWl2YWxlbnQgdG8gQWx0R3IsIGFuZCBpcyBub3QgYSBjb21tYW5kLlxuICAhKG5hdGl2ZUV2ZW50LmN0cmxLZXkgJiYgbmF0aXZlRXZlbnQuYWx0S2V5KTtcbn1cbi8qKlxuICogVHJhbnNsYXRlIG5hdGl2ZSB0b3AgbGV2ZWwgZXZlbnRzIGludG8gZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbnN0YXJ0JzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvblN0YXJ0JztcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvbkVuZCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbnVwZGF0ZSc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25VcGRhdGUnO1xuICB9XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIGJlc3QtZ3Vlc3MgbW9kZWwgdGhpbmsgdGhpcyBldmVudCBzaWduaWZpZXMgdGhhdFxuICogY29tcG9zaXRpb24gaGFzIGJlZ3VuP1xuICovXG5cblxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4gZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicgJiYgbmF0aXZlRXZlbnQua2V5Q29kZSA9PT0gU1RBUlRfS0VZQ09ERTtcbn1cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgbW9kZSB0aGluayB0aGF0IHRoaXMgZXZlbnQgaXMgdGhlIGVuZCBvZiBjb21wb3NpdGlvbj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgLy8gQ29tbWFuZCBrZXlzIGluc2VydCBvciBjbGVhciBJTUUgaW5wdXQuXG4gICAgICByZXR1cm4gRU5EX0tFWUNPREVTLmluZGV4T2YobmF0aXZlRXZlbnQua2V5Q29kZSkgIT09IC0xO1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgICAvLyBFeHBlY3QgSU1FIGtleUNvZGUgb24gZWFjaCBrZXlkb3duLiBJZiB3ZSBnZXQgYW55IG90aGVyXG4gICAgICAvLyBjb2RlIHdlIG11c3QgaGF2ZSBleGl0ZWQgZWFybGllci5cbiAgICAgIHJldHVybiBuYXRpdmVFdmVudC5rZXlDb2RlICE9PSBTVEFSVF9LRVlDT0RFO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgLy8gRXZlbnRzIGFyZSBub3QgcG9zc2libGUgd2l0aG91dCBjYW5jZWxsaW5nIElNRS5cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBHb29nbGUgSW5wdXQgVG9vbHMgcHJvdmlkZXMgY29tcG9zaXRpb24gZGF0YSB2aWEgYSBDdXN0b21FdmVudCxcbiAqIHdpdGggdGhlIGBkYXRhYCBwcm9wZXJ0eSBwb3B1bGF0ZWQgaW4gdGhlIGBkZXRhaWxgIG9iamVjdC4gSWYgdGhpc1xuICogaXMgYXZhaWxhYmxlIG9uIHRoZSBldmVudCBvYmplY3QsIHVzZSBpdC4gSWYgbm90LCB0aGlzIGlzIGEgcGxhaW5cbiAqIGNvbXBvc2l0aW9uIGV2ZW50IGFuZCB3ZSBoYXZlIG5vdGhpbmcgc3BlY2lhbCB0byBleHRyYWN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7P3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRldGFpbCA9IG5hdGl2ZUV2ZW50LmRldGFpbDtcblxuICBpZiAodHlwZW9mIGRldGFpbCA9PT0gJ29iamVjdCcgJiYgJ2RhdGEnIGluIGRldGFpbCkge1xuICAgIHJldHVybiBkZXRhaWwuZGF0YTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBDaGVjayBpZiBhIGNvbXBvc2l0aW9uIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYnkgS29yZWFuIElNRS5cbiAqIE91ciBmYWxsYmFjayBtb2RlIGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIElFJ3MgS29yZWFuIElNRSxcbiAqIHNvIGp1c3QgdXNlIG5hdGl2ZSBjb21wb3NpdGlvbiBldmVudHMgd2hlbiBLb3JlYW4gSU1FIGlzIHVzZWQuXG4gKiBBbHRob3VnaCBDb21wb3NpdGlvbkV2ZW50LmxvY2FsZSBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLFxuICogaXQgaXMgYXZhaWxhYmxlIGluIElFLCB3aGVyZSBvdXIgZmFsbGJhY2sgbW9kZSBpcyBlbmFibGVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG5hdGl2ZUV2ZW50LmxvY2FsZSA9PT0gJ2tvJztcbn0gLy8gVHJhY2sgdGhlIGN1cnJlbnQgSU1FIGNvbXBvc2l0aW9uIHN0YXR1cywgaWYgYW55LlxuXG5cbnZhciBpc0NvbXBvc2luZyA9IGZhbHNlO1xuLyoqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuXG4gKi9cblxuZnVuY3Rpb24gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGV2ZW50VHlwZTtcbiAgdmFyIGZhbGxiYWNrRGF0YTtcblxuICBpZiAoY2FuVXNlQ29tcG9zaXRpb25FdmVudCkge1xuICAgIGV2ZW50VHlwZSA9IGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKGRvbUV2ZW50TmFtZSk7XG4gIH0gZWxzZSBpZiAoIWlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICBldmVudFR5cGUgPSAnb25Db21wb3NpdGlvblN0YXJ0JztcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25FbmQnO1xuICB9XG5cbiAgaWYgKCFldmVudFR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkpIHtcbiAgICAvLyBUaGUgY3VycmVudCBjb21wb3NpdGlvbiBpcyBzdG9yZWQgc3RhdGljYWxseSBhbmQgbXVzdCBub3QgYmVcbiAgICAvLyBvdmVyd3JpdHRlbiB3aGlsZSBjb21wb3NpdGlvbiBjb250aW51ZXMuXG4gICAgaWYgKCFpc0NvbXBvc2luZyAmJiBldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uU3RhcnQnKSB7XG4gICAgICBpc0NvbXBvc2luZyA9IGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvbkVuZCcpIHtcbiAgICAgIGlmIChpc0NvbXBvc2luZykge1xuICAgICAgICBmYWxsYmFja0RhdGEgPSBnZXREYXRhKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCBldmVudFR5cGUpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50KGV2ZW50VHlwZSwgZG9tRXZlbnROYW1lLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuXG4gICAgaWYgKGZhbGxiYWNrRGF0YSkge1xuICAgICAgLy8gSW5qZWN0IGRhdGEgZ2VuZXJhdGVkIGZyb20gZmFsbGJhY2sgcGF0aCBpbnRvIHRoZSBzeW50aGV0aWMgZXZlbnQuXG4gICAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIHByb3BlcnR5IG9mIG5hdGl2ZSBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlLlxuICAgICAgZXZlbnQuZGF0YSA9IGZhbGxiYWNrRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGN1c3RvbURhdGEgPSBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcblxuICAgICAgaWYgKGN1c3RvbURhdGEgIT09IG51bGwpIHtcbiAgICAgICAgZXZlbnQuZGF0YSA9IGN1c3RvbURhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogSWYgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50cyBhcmUgYXZhaWxhYmxlLCBvdXIgZ29hbCBpcyB0byBtYWtlXG4gICAgICAgKiB1c2Ugb2YgdGhlbS4gSG93ZXZlciwgdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2U6IHRoZSBzcGFjZWJhciBrZXkuXG4gICAgICAgKiBJbiBXZWJraXQsIHByZXZlbnRpbmcgZGVmYXVsdCBvbiBhIHNwYWNlYmFyIGB0ZXh0SW5wdXRgIGV2ZW50XG4gICAgICAgKiBjYW5jZWxzIGNoYXJhY3RlciBpbnNlcnRpb24sIGJ1dCBpdCAqYWxzbyogY2F1c2VzIHRoZSBicm93c2VyXG4gICAgICAgKiB0byBmYWxsIGJhY2sgdG8gaXRzIGRlZmF1bHQgc3BhY2ViYXIgYmVoYXZpb3Igb2Ygc2Nyb2xsaW5nIHRoZVxuICAgICAgICogcGFnZS5cbiAgICAgICAqXG4gICAgICAgKiBUcmFja2luZyBhdDpcbiAgICAgICAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNTUxMDNcbiAgICAgICAqXG4gICAgICAgKiBUbyBhdm9pZCB0aGlzIGlzc3VlLCB1c2UgdGhlIGtleXByZXNzIGV2ZW50IGFzIGlmIG5vIGB0ZXh0SW5wdXRgXG4gICAgICAgKiBldmVudCBpcyBhdmFpbGFibGUuXG4gICAgICAgKi9cbiAgICAgIHZhciB3aGljaCA9IG5hdGl2ZUV2ZW50LndoaWNoO1xuXG4gICAgICBpZiAod2hpY2ggIT09IFNQQUNFQkFSX0NPREUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhhc1NwYWNlS2V5cHJlc3MgPSB0cnVlO1xuICAgICAgcmV0dXJuIFNQQUNFQkFSX0NIQVI7XG5cbiAgICBjYXNlICd0ZXh0SW5wdXQnOlxuICAgICAgLy8gUmVjb3JkIHRoZSBjaGFyYWN0ZXJzIHRvIGJlIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICB2YXIgY2hhcnMgPSBuYXRpdmVFdmVudC5kYXRhOyAvLyBJZiBpdCdzIGEgc3BhY2ViYXIgY2hhcmFjdGVyLCBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZFxuICAgICAgLy8gaXQgYXQgdGhlIGtleXByZXNzIGxldmVsIGFuZCBiYWlsIGltbWVkaWF0ZWx5LiBBbmRyb2lkIENocm9tZVxuICAgICAgLy8gZG9lc24ndCBnaXZlIHVzIGtleWNvZGVzLCBzbyB3ZSBuZWVkIHRvIGlnbm9yZSBpdC5cblxuICAgICAgaWYgKGNoYXJzID09PSBTUEFDRUJBUl9DSEFSICYmIGhhc1NwYWNlS2V5cHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFycztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBGb3Igb3RoZXIgbmF0aXZlIGV2ZW50IHR5cGVzLCBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlIGB0ZXh0SW5wdXRgIGV2ZW50LCBleHRyYWN0IHRoZVxuICogYXBwcm9wcmlhdGUgc3RyaW5nIHRvIHVzZSBmb3IgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgY29tcG9zaW5nIChJTUUpIGFuZCB1c2luZyBhIGZhbGxiYWNrIHRvIGRvIHNvLFxuICAvLyB0cnkgdG8gZXh0cmFjdCB0aGUgY29tcG9zZWQgY2hhcmFjdGVycyBmcm9tIHRoZSBmYWxsYmFjayBvYmplY3QuXG4gIC8vIElmIGNvbXBvc2l0aW9uIGV2ZW50IGlzIGF2YWlsYWJsZSwgd2UgZXh0cmFjdCBhIHN0cmluZyBvbmx5IGF0XG4gIC8vIGNvbXBvc2l0aW9uZXZlbnQsIG90aGVyd2lzZSBleHRyYWN0IGl0IGF0IGZhbGxiYWNrIGV2ZW50cy5cbiAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NvbXBvc2l0aW9uZW5kJyB8fCAhY2FuVXNlQ29tcG9zaXRpb25FdmVudCAmJiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIHZhciBjaGFycyA9IGdldERhdGEoKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICBpc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGNoYXJzO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgICAvLyBJZiBhIHBhc3RlIGV2ZW50IG9jY3VycyBhZnRlciBhIGtleXByZXNzLCB0aHJvdyBvdXQgdGhlIGlucHV0XG4gICAgICAvLyBjaGFycy4gUGFzdGUgZXZlbnRzIHNob3VsZCBub3QgbGVhZCB0byBCZWZvcmVJbnB1dCBldmVudHMuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogQXMgb2YgdjI3LCBGaXJlZm94IG1heSBmaXJlIGtleXByZXNzIGV2ZW50cyBldmVuIHdoZW4gbm8gY2hhcmFjdGVyXG4gICAgICAgKiB3aWxsIGJlIGluc2VydGVkLiBBIGZldyBwb3NzaWJpbGl0aWVzOlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyBgMGAuIEFycm93IGtleXMsIEVzYyBrZXksIGV0Yy5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBubyBjaGFyIGlzIGF2YWlsYWJsZS5cbiAgICAgICAqICAgRXg6ICdBbHRHciArIGRgIGluIFBvbGlzaC4gVGhlcmUgaXMgbm8gbW9kaWZpZWQgY2hhcmFjdGVyIGZvclxuICAgICAgICogICB0aGlzIGtleSBjb21iaW5hdGlvbiBhbmQgbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkIGludG8gdGhlXG4gICAgICAgKiAgIGRvY3VtZW50LCBidXQgRkYgZmlyZXMgdGhlIGtleXByZXNzIGZvciBjaGFyIGNvZGUgYDEwMGAgYW55d2F5LlxuICAgICAgICogICBObyBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgYSBjb21tYW5kIGNvbWJpbmF0aW9uIGlzXG4gICAgICAgKiAgIGJlaW5nIHVzZWQuIEV4OiBgQ21kK0NgLiBObyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQsIGFuZCBub1xuICAgICAgICogICBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKi9cbiAgICAgIGlmICghaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIC8vIElFIGZpcmVzIHRoZSBga2V5cHJlc3NgIGV2ZW50IHdoZW4gYSB1c2VyIHR5cGVzIGFuIGVtb2ppIHZpYVxuICAgICAgICAvLyBUb3VjaCBrZXlib2FyZCBvZiBXaW5kb3dzLiAgSW4gc3VjaCBhIGNhc2UsIHRoZSBgY2hhcmAgcHJvcGVydHlcbiAgICAgICAgLy8gaG9sZHMgYW4gZW1vamkgY2hhcmFjdGVyIGxpa2UgYFxcdUQ4M0RcXHVERTBBYC4gIEJlY2F1c2UgaXRzIGxlbmd0aFxuICAgICAgICAvLyBpcyAyLCB0aGUgcHJvcGVydHkgYHdoaWNoYCBkb2VzIG5vdCByZXByZXNlbnQgYW4gZW1vamkgY29ycmVjdGx5LlxuICAgICAgICAvLyBJbiBzdWNoIGEgY2FzZSwgd2UgZGlyZWN0bHkgcmV0dXJuIHRoZSBgY2hhcmAgcHJvcGVydHkgaW5zdGVhZCBvZlxuICAgICAgICAvLyB1c2luZyBgd2hpY2hgLlxuICAgICAgICBpZiAobmF0aXZlRXZlbnQuY2hhciAmJiBuYXRpdmVFdmVudC5jaGFyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICByZXR1cm4gbmF0aXZlRXZlbnQuY2hhcjtcbiAgICAgICAgfSBlbHNlIGlmIChuYXRpdmVFdmVudC53aGljaCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICAgIHJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkgPyBudWxsIDogbmF0aXZlRXZlbnQuZGF0YTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBFeHRyYWN0IGEgU3ludGhldGljSW5wdXRFdmVudCBmb3IgYGJlZm9yZUlucHV0YCwgYmFzZWQgb24gZWl0aGVyIG5hdGl2ZVxuICogYHRleHRJbnB1dGAgb3IgZmFsbGJhY2sgYmVoYXZpb3IuXG4gKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGNoYXJzO1xuXG4gIGlmIChjYW5Vc2VUZXh0SW5wdXRFdmVudCkge1xuICAgIGNoYXJzID0gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBjaGFycyA9IGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSAvLyBJZiBubyBjaGFyYWN0ZXJzIGFyZSBiZWluZyBpbnNlcnRlZCwgbm8gQmVmb3JlSW5wdXQgZXZlbnQgc2hvdWxkXG4gIC8vIGJlIGZpcmVkLlxuXG5cbiAgaWYgKCFjaGFycykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCAnb25CZWZvcmVJbnB1dCcpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNJbnB1dEV2ZW50KCdvbkJlZm9yZUlucHV0JywgJ2JlZm9yZWlucHV0JywgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgICBldmVudC5kYXRhID0gY2hhcnM7XG4gIH1cbn1cbi8qKlxuICogQ3JlYXRlIGFuIGBvbkJlZm9yZUlucHV0YCBldmVudCB0byBtYXRjaFxuICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDUvI2V2ZW50cy1pbnB1dGV2ZW50cy5cbiAqXG4gKiBUaGlzIGV2ZW50IHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50XG4gKiBhdmFpbGFibGUgaW4gQ2hyb21lLCBTYWZhcmksIE9wZXJhLCBhbmQgSUUuIFRoaXMgZXZlbnQgZmlyZXMgYWZ0ZXJcbiAqIGBvbktleVByZXNzYCBhbmQgYG9uQ29tcG9zaXRpb25FbmRgLCBidXQgYmVmb3JlIGBvbklucHV0YC5cbiAqXG4gKiBgYmVmb3JlSW5wdXRgIGlzIHNwZWMnZCBidXQgbm90IGltcGxlbWVudGVkIGluIGFueSBicm93c2VycywgYW5kXG4gKiB0aGUgYGlucHV0YCBldmVudCBkb2VzIG5vdCBwcm92aWRlIGFueSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBoYXNcbiAqIGFjdHVhbGx5IGJlZW4gYWRkZWQsIGNvbnRyYXJ5IHRvIHRoZSBzcGVjLiBUaHVzLCBgdGV4dElucHV0YCBpcyB0aGUgYmVzdFxuICogYXZhaWxhYmxlIGV2ZW50IHRvIGlkZW50aWZ5IHRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGluc2VydGVkXG4gKiBpbnRvIHRoZSB0YXJnZXQgbm9kZS5cbiAqXG4gKiBUaGlzIHBsdWdpbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBgY29tcG9zaXRpb25gIGV2ZW50cywgdGh1c1xuICogYWxsb3dpbmcgdXMgdG8gc2hhcmUgY29tcG9zaXRpb24gZmFsbGJhY2sgY29kZSBmb3IgYm90aCBgYmVmb3JlSW5wdXRgIGFuZFxuICogYGNvbXBvc2l0aW9uYCBldmVudCB0eXBlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICBleHRyYWN0Q29tcG9zaXRpb25FdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3RoZS1pbnB1dC1lbGVtZW50Lmh0bWwjaW5wdXQtdHlwZS1hdHRyLXN1bW1hcnlcbiAqL1xudmFyIHN1cHBvcnRlZElucHV0VHlwZXMgPSB7XG4gIGNvbG9yOiB0cnVlLFxuICBkYXRlOiB0cnVlLFxuICBkYXRldGltZTogdHJ1ZSxcbiAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSxcbiAgZW1haWw6IHRydWUsXG4gIG1vbnRoOiB0cnVlLFxuICBudW1iZXI6IHRydWUsXG4gIHBhc3N3b3JkOiB0cnVlLFxuICByYW5nZTogdHJ1ZSxcbiAgc2VhcmNoOiB0cnVlLFxuICB0ZWw6IHRydWUsXG4gIHRleHQ6IHRydWUsXG4gIHRpbWU6IHRydWUsXG4gIHVybDogdHJ1ZSxcbiAgd2VlazogdHJ1ZVxufTtcblxuZnVuY3Rpb24gaXNUZXh0SW5wdXRFbGVtZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcpIHtcbiAgICByZXR1cm4gISFzdXBwb3J0ZWRJbnB1dFR5cGVzW2VsZW0udHlwZV07XG4gIH1cblxuICBpZiAobm9kZU5hbWUgPT09ICd0ZXh0YXJlYScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZXZlbnQgaXMgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBOT1RFOiBUaGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IGZvciBub24tZ2VuZXJpYyBldmVudHMgc3VjaCBhcyBgY2hhbmdlYCxcbiAqIGByZXNldGAsIGBsb2FkYCwgYGVycm9yYCwgYW5kIGBzZWxlY3RgLlxuICpcbiAqIEJvcnJvd3MgZnJvbSBNb2Rlcm5penIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVN1ZmZpeCBFdmVudCBuYW1lLCBlLmcuIFwiY2xpY2tcIi5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IGlzIHN1cHBvcnRlZC5cbiAqIEBpbnRlcm5hbFxuICogQGxpY2Vuc2UgTW9kZXJuaXpyIDMuMC4wcHJlIChDdXN0b20gQnVpbGQpIHwgTUlUXG4gKi9cblxuZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgpIHtcbiAgaWYgKCFjYW5Vc2VET00pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZXZlbnROYW1lID0gJ29uJyArIGV2ZW50TmFtZVN1ZmZpeDtcbiAgdmFyIGlzU3VwcG9ydGVkID0gKGV2ZW50TmFtZSBpbiBkb2N1bWVudCk7XG5cbiAgaWYgKCFpc1N1cHBvcnRlZCkge1xuICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoZXZlbnROYW1lLCAncmV0dXJuOycpO1xuICAgIGlzU3VwcG9ydGVkID0gdHlwZW9mIGVsZW1lbnRbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHJldHVybiBpc1N1cHBvcnRlZDtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMSgpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNoYW5nZScsIFsnY2hhbmdlJywgJ2NsaWNrJywgJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnLCAnaW5wdXQnLCAna2V5ZG93bicsICdrZXl1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBpbnN0LCBuYXRpdmVFdmVudCwgdGFyZ2V0KSB7XG4gIC8vIEZsYWcgdGhpcyBldmVudCBsb29wIGFzIG5lZWRpbmcgc3RhdGUgcmVzdG9yZS5cbiAgZW5xdWV1ZVN0YXRlUmVzdG9yZSh0YXJnZXQpO1xuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGluc3QsICdvbkNoYW5nZScpO1xuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudCgnb25DaGFuZ2UnLCAnY2hhbmdlJywgbnVsbCwgbmF0aXZlRXZlbnQsIHRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogRm9yIElFIHNoaW1zXG4gKi9cblxuXG52YXIgYWN0aXZlRWxlbWVudCA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNoYW5nZWAgZXZlbnRcbiAqL1xuXG5mdW5jdGlvbiBzaG91bGRVc2VDaGFuZ2VFdmVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgPT09ICdzZWxlY3QnIHx8IG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0gJ2ZpbGUnO1xufVxuXG5mdW5jdGlvbiBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBhY3RpdmVFbGVtZW50SW5zdCwgbmF0aXZlRXZlbnQsIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSk7IC8vIElmIGNoYW5nZSBhbmQgcHJvcGVydHljaGFuZ2UgYnViYmxlZCwgd2UnZCBqdXN0IGJpbmQgdG8gaXQgbGlrZSBhbGwgdGhlXG4gIC8vIG90aGVyIGV2ZW50cyBhbmQgaGF2ZSBpdCBnbyB0aHJvdWdoIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci4gU2luY2UgaXRcbiAgLy8gZG9lc24ndCwgd2UgbWFudWFsbHkgbGlzdGVuIGZvciB0aGUgZXZlbnRzIGFuZCBzbyB3ZSBoYXZlIHRvIGVucXVldWUgYW5kXG4gIC8vIHByb2Nlc3MgdGhlIGFic3RyYWN0IGV2ZW50IG1hbnVhbGx5LlxuICAvL1xuICAvLyBCYXRjaGluZyBpcyBuZWNlc3NhcnkgaGVyZSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBhbGwgZXZlbnQgaGFuZGxlcnMgcnVuXG4gIC8vIGJlZm9yZSB0aGUgbmV4dCByZXJlbmRlciAoaW5jbHVkaW5nIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIHRvIGFuY2VzdG9yXG4gIC8vIGVsZW1lbnRzIGluc3RlYWQgb2YgZGlyZWN0bHkgb24gdGhlIGlucHV0KS4gV2l0aG91dCB0aGlzLCBjb250cm9sbGVkXG4gIC8vIGNvbXBvbmVudHMgZG9uJ3Qgd29yayBwcm9wZXJseSBpbiBjb25qdW5jdGlvbiB3aXRoIGV2ZW50IGJ1YmJsaW5nIGJlY2F1c2VcbiAgLy8gdGhlIGNvbXBvbmVudCBpcyByZXJlbmRlcmVkIGFuZCB0aGUgdmFsdWUgcmV2ZXJ0ZWQgYmVmb3JlIGFsbCB0aGUgZXZlbnRcbiAgLy8gaGFuZGxlcnMgY2FuIHJ1bi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzA4LlxuXG4gIGJhdGNoZWRVcGRhdGVzKHJ1bkV2ZW50SW5CYXRjaCwgZGlzcGF0Y2hRdWV1ZSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkV2ZW50SW5CYXRjaChkaXNwYXRjaFF1ZXVlKSB7XG4gIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIDApO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCkge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCk7XG5cbiAgaWYgKHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKHRhcmdldE5vZGUpKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgaW5wdXRgIGV2ZW50XG4gKi9cblxuXG52YXIgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gZmFsc2U7XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgLy8gSUU5IGNsYWltcyB0byBzdXBwb3J0IHRoZSBpbnB1dCBldmVudCBidXQgZmFpbHMgdG8gdHJpZ2dlciBpdCB3aGVuXG4gIC8vIGRlbGV0aW5nIHRleHQsIHNvIHdlIGlnbm9yZSBpdHMgaW5wdXQgZXZlbnRzLlxuICBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBpc0V2ZW50U3VwcG9ydGVkKCdpbnB1dCcpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDkpO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgU3RhcnRzIHRyYWNraW5nIHByb3BlcnR5Y2hhbmdlIGV2ZW50cyBvbiB0aGUgcGFzc2VkLWluIGVsZW1lbnRcbiAqIGFuZCBvdmVycmlkZSB0aGUgdmFsdWUgcHJvcGVydHkgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggdXNlciBldmVudHMgZnJvbVxuICogdmFsdWUgY2hhbmdlcyBpbiBKUy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgYWN0aXZlRWxlbWVudCA9IHRhcmdldDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICBhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgUmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZyb20gdGhlIGN1cnJlbnRseS10cmFja2VkIGVsZW1lbnQsXG4gKiBpZiBhbnkgZXhpc3RzLlxuICovXG5cblxuZnVuY3Rpb24gc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKSB7XG4gIGlmICghYWN0aXZlRWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFjdGl2ZUVsZW1lbnQuZGV0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG4gIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBIYW5kbGVzIGEgcHJvcGVydHljaGFuZ2UgZXZlbnQsIHNlbmRpbmcgYSBgY2hhbmdlYCBldmVudCBpZlxuICogdGhlIHZhbHVlIG9mIHRoZSBhY3RpdmUgZWxlbWVudCBoYXMgY2hhbmdlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0KSkge1xuICAgIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUsIHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNpbicpIHtcbiAgICAvLyBJbiBJRTksIHByb3BlcnR5Y2hhbmdlIGZpcmVzIGZvciBtb3N0IGlucHV0IGV2ZW50cyBidXQgaXMgYnVnZ3kgYW5kXG4gICAgLy8gZG9lc24ndCBmaXJlIHdoZW4gdGV4dCBpcyBkZWxldGVkLCBidXQgY29udmVuaWVudGx5LCBzZWxlY3Rpb25jaGFuZ2VcbiAgICAvLyBhcHBlYXJzIHRvIGZpcmUgaW4gYWxsIG9mIHRoZSByZW1haW5pbmcgY2FzZXMgc28gd2UgY2F0Y2ggdGhvc2UgYW5kXG4gICAgLy8gZm9yd2FyZCB0aGUgZXZlbnQgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkXG4gICAgLy8gSW4gZWl0aGVyIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gY2FsbCB0aGUgZXZlbnQgaGFuZGxlciBpZiB0aGUgdmFsdWVcbiAgICAvLyBpcyBjaGFuZ2VkIGZyb20gSlMgc28gd2UgcmVkZWZpbmUgYSBzZXR0ZXIgZm9yIGAudmFsdWVgIHRoYXQgdXBkYXRlc1xuICAgIC8vIG91ciBhY3RpdmVFbGVtZW50VmFsdWUgdmFyaWFibGUsIGFsbG93aW5nIHVzIHRvIGlnbm9yZSB0aG9zZSBjaGFuZ2VzXG4gICAgLy9cbiAgICAvLyBzdG9wV2F0Y2hpbmcoKSBzaG91bGQgYmUgYSBub29wIGhlcmUgYnV0IHdlIGNhbGwgaXQganVzdCBpbiBjYXNlIHdlXG4gICAgLy8gbWlzc2VkIGEgYmx1ciBldmVudCBzb21laG93LlxuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gICAgc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCk7XG4gIH0gZWxzZSBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgfVxufSAvLyBGb3IgSUU4IGFuZCBJRTkuXG5cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3NlbGVjdGlvbmNoYW5nZScgfHwgZG9tRXZlbnROYW1lID09PSAna2V5dXAnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgLy8gT24gdGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCwgdGhlIHRhcmdldCBpcyBqdXN0IGRvY3VtZW50IHdoaWNoIGlzbid0XG4gICAgLy8gaGVscGZ1bCBmb3IgdXMgc28ganVzdCBjaGVjayBhY3RpdmVFbGVtZW50IGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyA5OSUgb2YgdGhlIHRpbWUsIGtleWRvd24gYW5kIGtleXVwIGFyZW4ndCBuZWNlc3NhcnkuIElFOCBmYWlscyB0byBmaXJlXG4gICAgLy8gcHJvcGVydHljaGFuZ2Ugb24gdGhlIGZpcnN0IGlucHV0IGV2ZW50IGFmdGVyIHNldHRpbmcgYHZhbHVlYCBmcm9tIGFcbiAgICAvLyBzY3JpcHQgYW5kIGZpcmVzIG9ubHkga2V5ZG93biwga2V5cHJlc3MsIGtleXVwLiBDYXRjaGluZyBrZXl1cCB1c3VhbGx5XG4gICAgLy8gZ2V0cyBpdCBhbmQgY2F0Y2hpbmcga2V5ZG93biBsZXRzIHVzIGZpcmUgYW4gZXZlbnQgZm9yIHRoZSBmaXJzdFxuICAgIC8vIGtleXN0cm9rZSBpZiB1c2VyIGRvZXMgYSBrZXkgcmVwZWF0IChpdCdsbCBiZSBhIGxpdHRsZSBkZWxheWVkOiByaWdodFxuICAgIC8vIGJlZm9yZSB0aGUgc2Vjb25kIGtleXN0cm9rZSkuIE90aGVyIGlucHV0IG1ldGhvZHMgKGUuZy4sIHBhc3RlKSBzZWVtIHRvXG4gICAgLy8gZmlyZSBzZWxlY3Rpb25jaGFuZ2Ugbm9ybWFsbHkuXG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCk7XG4gIH1cbn1cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjbGlja2AgZXZlbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNsaWNrRXZlbnQoZWxlbSkge1xuICAvLyBVc2UgdGhlIGBjbGlja2AgZXZlbnQgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gY2hlY2tib3ggYW5kIHJhZGlvIGlucHV0cy5cbiAgLy8gVGhpcyBhcHByb2FjaCB3b3JrcyBhY3Jvc3MgYWxsIGJyb3dzZXJzLCB3aGVyZWFzIGBjaGFuZ2VgIGRvZXMgbm90IGZpcmVcbiAgLy8gdW50aWwgYGJsdXJgIGluIElFOC5cbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtLnR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NsaWNrJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0T3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2lucHV0JyB8fCBkb21FdmVudE5hbWUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKG5vZGUpIHtcbiAgdmFyIHN0YXRlID0gbm9kZS5fd3JhcHBlclN0YXRlO1xuXG4gIGlmICghc3RhdGUgfHwgIXN0YXRlLmNvbnRyb2xsZWQgfHwgbm9kZS50eXBlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBJZiBjb250cm9sbGVkLCBhc3NpZ24gdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBvbiBibHVyXG4gICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsICdudW1iZXInLCBub2RlLnZhbHVlKTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvbkNoYW5nZWAgZXZlbnQgdGhhdCBub3JtYWxpemVzIGNoYW5nZSBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLiBUaGlzIGV2ZW50IGZpcmVzIGF0IGEgdGltZSB3aGVuIGl0J3MgcG9zc2libGUgdG9cbiAqIGNoYW5nZSB0aGUgZWxlbWVudCdzIHZhbHVlIHdpdGhvdXQgc2VlaW5nIGEgZmxpY2tlci5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBzZWxlY3RcbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG4gIHZhciBnZXRUYXJnZXRJbnN0RnVuYywgaGFuZGxlRXZlbnRGdW5jO1xuXG4gIGlmIChzaG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50O1xuICB9IGVsc2UgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSkge1xuICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0T3JDaGFuZ2VFdmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgICAgaGFuZGxlRXZlbnRGdW5jID0gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzaG91bGRVc2VDbGlja0V2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudDtcbiAgfVxuXG4gIGlmIChnZXRUYXJnZXRJbnN0RnVuYykge1xuICAgIHZhciBpbnN0ID0gZ2V0VGFyZ2V0SW5zdEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KTtcblxuICAgIGlmIChpbnN0KSB7XG4gICAgICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoaGFuZGxlRXZlbnRGdW5jKSB7XG4gICAgaGFuZGxlRXZlbnRGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0Tm9kZSwgdGFyZ2V0SW5zdCk7XG4gIH0gLy8gV2hlbiBibHVycmluZywgc2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUgZm9yIG51bWJlciBpbnB1dHNcblxuXG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c291dCcpIHtcbiAgICBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKHRhcmdldE5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDIoKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uTW91c2VFbnRlcicsIFsnbW91c2VvdXQnLCAnbW91c2VvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlTGVhdmUnLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Qb2ludGVyRW50ZXInLCBbJ3BvaW50ZXJvdXQnLCAncG9pbnRlcm92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckxlYXZlJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xufVxuLyoqXG4gKiBGb3IgYWxtb3N0IGV2ZXJ5IGludGVyYWN0aW9uIHdlIGNhcmUgYWJvdXQsIHRoZXJlIHdpbGwgYmUgYm90aCBhIHRvcC1sZXZlbFxuICogYG1vdXNlb3ZlcmAgYW5kIGBtb3VzZW91dGAgZXZlbnQgdGhhdCBvY2N1cnMuIE9ubHkgdXNlIGBtb3VzZW91dGAgc28gdGhhdFxuICogd2UgZG8gbm90IGV4dHJhY3QgZHVwbGljYXRlIGV2ZW50cy4gSG93ZXZlciwgbW92aW5nIHRoZSBtb3VzZSBpbnRvIHRoZVxuICogYnJvd3NlciBmcm9tIG91dHNpZGUgd2lsbCBub3QgZmlyZSBhIGBtb3VzZW91dGAgZXZlbnQuIEluIHRoaXMgY2FzZSwgd2UgdXNlXG4gKiB0aGUgYG1vdXNlb3ZlcmAgdG9wLWxldmVsIGV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQyKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIGlzT3ZlckV2ZW50ID0gZG9tRXZlbnROYW1lID09PSAnbW91c2VvdmVyJyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3Zlcic7XG4gIHZhciBpc091dEV2ZW50ID0gZG9tRXZlbnROYW1lID09PSAnbW91c2VvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnO1xuXG4gIGlmIChpc092ZXJFdmVudCAmJiAhaXNSZXBsYXlpbmdFdmVudChuYXRpdmVFdmVudCkpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGFuIG92ZXIgZXZlbnQgd2l0aCBhIHRhcmdldCwgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IGRpc3BhdGNoZWRcbiAgICAvLyB0aGUgZXZlbnQgaW4gdGhlIG91dCBldmVudCBvZiB0aGUgb3RoZXIgdGFyZ2V0LiBJZiB0aGlzIGlzIHJlcGxheWVkLFxuICAgIC8vIHRoZW4gaXQncyBiZWNhdXNlIHdlIGNvdWxkbid0IGRpc3BhdGNoIGFnYWluc3QgdGhpcyB0YXJnZXQgcHJldmlvdXNseVxuICAgIC8vIHNvIHdlIGhhdmUgdG8gZG8gaXQgbm93IGluc3RlYWQuXG4gICAgdmFyIHJlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50O1xuXG4gICAgaWYgKHJlbGF0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSByZWxhdGVkIG5vZGUgaXMgbWFuYWdlZCBieSBSZWFjdCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGhhdmVcbiAgICAgIC8vIGFscmVhZHkgZGlzcGF0Y2hlZCB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgZHVyaW5nIGl0cyBtb3VzZW91dC5cbiAgICAgIGlmIChnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWxhdGVkKSB8fCBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChyZWxhdGVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc091dEV2ZW50ICYmICFpc092ZXJFdmVudCkge1xuICAgIC8vIE11c3Qgbm90IGJlIGEgbW91c2Ugb3IgcG9pbnRlciBpbiBvciBvdXQgLSBpZ25vcmluZy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgd2luOyAvLyBUT0RPOiB3aHkgaXMgdGhpcyBudWxsYWJsZSBpbiB0aGUgdHlwZXMgYnV0IHdlIHJlYWQgZnJvbSBpdD9cblxuICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgIHdpbiA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICB2YXIgZG9jID0gbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChkb2MpIHtcbiAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW4gPSB3aW5kb3c7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZyb207XG4gIHZhciB0bztcblxuICBpZiAoaXNPdXRFdmVudCkge1xuICAgIHZhciBfcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuXG4gICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgdG8gPSBfcmVsYXRlZCA/IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKF9yZWxhdGVkKSA6IG51bGw7XG5cbiAgICBpZiAodG8gIT09IG51bGwpIHtcbiAgICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodG8pO1xuXG4gICAgICBpZiAodG8gIT09IG5lYXJlc3RNb3VudGVkIHx8IHRvLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiB0by50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHRvID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICBmcm9tID0gbnVsbDtcbiAgICB0byA9IHRhcmdldEluc3Q7XG4gIH1cblxuICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gIHZhciBsZWF2ZUV2ZW50VHlwZSA9ICdvbk1vdXNlTGVhdmUnO1xuICB2YXIgZW50ZXJFdmVudFR5cGUgPSAnb25Nb3VzZUVudGVyJztcbiAgdmFyIGV2ZW50VHlwZVByZWZpeCA9ICdtb3VzZSc7XG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJykge1xuICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICBsZWF2ZUV2ZW50VHlwZSA9ICdvblBvaW50ZXJMZWF2ZSc7XG4gICAgZW50ZXJFdmVudFR5cGUgPSAnb25Qb2ludGVyRW50ZXInO1xuICAgIGV2ZW50VHlwZVByZWZpeCA9ICdwb2ludGVyJztcbiAgfVxuXG4gIHZhciBmcm9tTm9kZSA9IGZyb20gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gIHZhciB0b05vZGUgPSB0byA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG4gIHZhciBsZWF2ZSA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IobGVhdmVFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdsZWF2ZScsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlO1xuICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuICB2YXIgZW50ZXIgPSBudWxsOyAvLyBXZSBzaG91bGQgb25seSBwcm9jZXNzIHRoaXMgbmF0aXZlRXZlbnQgaWYgd2UgYXJlIHByb2Nlc3NpbmdcbiAgLy8gdGhlIGZpcnN0IGFuY2VzdG9yLiBOZXh0IHRpbWUsIHdlIHdpbGwgaWdub3JlIHRoZSBldmVudC5cblxuICB2YXIgbmF0aXZlVGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobmF0aXZlVGFyZ2V0SW5zdCA9PT0gdGFyZ2V0SW5zdCkge1xuICAgIHZhciBlbnRlckV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihlbnRlckV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2VudGVyJywgdG8sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZW50ZXJFdmVudC50YXJnZXQgPSB0b05vZGU7XG4gICAgZW50ZXJFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG4gICAgZW50ZXIgPSBlbnRlckV2ZW50O1xuICB9XG5cbiAgYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcbn1cblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChvYmplY3RJcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjdXJyZW50S2V5ID0ga2V5c0FbaV07XG5cbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwgY3VycmVudEtleSkgfHwgIW9iamVjdElzKG9iakFbY3VycmVudEtleV0sIG9iakJbY3VycmVudEtleV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogR2l2ZW4gYW55IG5vZGUgcmV0dXJuIHRoZSBmaXJzdCBsZWFmIG5vZGUgd2l0aG91dCBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cblxuZnVuY3Rpb24gZ2V0TGVhZk5vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBub2RlID0gbm9kZS5maXJzdENoaWxkO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4vKipcbiAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIHdpdGhpbiBhIGNvbnRhaW5lci4gVGhpcyB3aWxsIHdhbGsgdXAgdGhlXG4gKiBET00gaWYgYSBub2RlJ3Mgc2libGluZ3MgaGF2ZSBiZWVuIGV4aGF1c3RlZC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4gez9ET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0U2libGluZ05vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG59XG4vKipcbiAqIEdldCBvYmplY3QgZGVzY3JpYmluZyB0aGUgbm9kZXMgd2hpY2ggY29udGFpbiBjaGFyYWN0ZXJzIGF0IG9mZnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IHJvb3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkge1xuICB2YXIgbm9kZSA9IGdldExlYWZOb2RlKHJvb3QpO1xuICB2YXIgbm9kZVN0YXJ0ID0gMDtcbiAgdmFyIG5vZGVFbmQgPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgbm9kZUVuZCA9IG5vZGVTdGFydCArIG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICBpZiAobm9kZVN0YXJ0IDw9IG9mZnNldCAmJiBub2RlRW5kID49IG9mZnNldCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXQgLSBub2RlU3RhcnRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbm9kZVN0YXJ0ID0gbm9kZUVuZDtcbiAgICB9XG5cbiAgICBub2RlID0gZ2V0TGVhZk5vZGUoZ2V0U2libGluZ05vZGUobm9kZSkpO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBvdXRlck5vZGVcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0cyhvdXRlck5vZGUpIHtcbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBvdXRlck5vZGUub3duZXJEb2N1bWVudDtcbiAgdmFyIHdpbiA9IG93bmVyRG9jdW1lbnQgJiYgb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uICYmIHdpbi5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGFuY2hvck5vZGUgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldCA9IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQ7IC8vIEluIEZpcmVmb3gsIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBjYW4gYmUgXCJhbm9ueW1vdXMgZGl2c1wiLCBlLmcuIHRoZVxuICAvLyB1cC9kb3duIGJ1dHRvbnMgb24gYW4gPGlucHV0IHR5cGU9XCJudW1iZXJcIj4uIEFub255bW91cyBkaXZzIGRvIG5vdCBzZWVtIHRvXG4gIC8vIGV4cG9zZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgXCJQZXJtaXNzaW9uIGRlbmllZCBlcnJvclwiIGlmIGFueSBvZiBpdHNcbiAgLy8gcHJvcGVydGllcyBhcmUgYWNjZXNzZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZSB3YXkgdG8gYXZvaWQgZXJyb3JpbmdcbiAgLy8gaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmRcbiAgLy8gY2F0Y2ggYW55IGVycm9yIHRoYXQgbWF5IG90aGVyd2lzZSBhcmlzZS4gU2VlXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIwODQyN1xuXG4gIHRyeSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gICAgYW5jaG9yTm9kZS5ub2RlVHlwZTtcbiAgICBmb2N1c05vZGUubm9kZVR5cGU7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTtcbn1cbi8qKlxuICogUmV0dXJucyB7c3RhcnQsIGVuZH0gd2hlcmUgYHN0YXJ0YCBpcyB0aGUgY2hhcmFjdGVyL2NvZGVwb2ludCBpbmRleCBvZlxuICogKGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCkgd2l0aGluIHRoZSB0ZXh0Q29udGVudCBvZiBgb3V0ZXJOb2RlYCwgYW5kXG4gKiBgZW5kYCBpcyB0aGUgaW5kZXggb2YgKGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpLlxuICpcbiAqIFJldHVybnMgbnVsbCBpZiB5b3UgcGFzcyBpbiBnYXJiYWdlIGlucHV0IGJ1dCB3ZSBzaG91bGQgcHJvYmFibHkganVzdCBjcmFzaC5cbiAqXG4gKiBFeHBvcnRlZCBvbmx5IGZvciB0ZXN0aW5nLlxuICovXG5cbmZ1bmN0aW9uIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gIHZhciBsZW5ndGggPSAwO1xuICB2YXIgc3RhcnQgPSAtMTtcbiAgdmFyIGVuZCA9IC0xO1xuICB2YXIgaW5kZXhXaXRoaW5BbmNob3IgPSAwO1xuICB2YXIgaW5kZXhXaXRoaW5Gb2N1cyA9IDA7XG4gIHZhciBub2RlID0gb3V0ZXJOb2RlO1xuICB2YXIgcGFyZW50Tm9kZSA9IG51bGw7XG5cbiAgb3V0ZXI6IHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5leHQgPSBudWxsO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBhbmNob3JOb2RlICYmIChhbmNob3JPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aCArIGFuY2hvck9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZvY3VzTm9kZSAmJiAoZm9jdXNPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBlbmQgPSBsZW5ndGggKyBmb2N1c09mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgICBsZW5ndGggKz0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5leHQgPSBub2RlLmZpcnN0Q2hpbGQpID09PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIGZpcnN0IGNoaWxkIGBuZXh0YC5cblxuXG4gICAgICBwYXJlbnROb2RlID0gbm9kZTtcbiAgICAgIG5vZGUgPSBuZXh0O1xuICAgIH1cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gb3V0ZXJOb2RlKSB7XG4gICAgICAgIC8vIElmIGBvdXRlck5vZGVgIGhhcyBjaGlsZHJlbiwgdGhpcyBpcyBhbHdheXMgdGhlIHNlY29uZCB0aW1lIHZpc2l0aW5nXG4gICAgICAgIC8vIGl0LiBJZiBpdCBoYXMgbm8gY2hpbGRyZW4sIHRoaXMgaXMgc3RpbGwgdGhlIGZpcnN0IGxvb3AsIGFuZCB0aGUgb25seVxuICAgICAgICAvLyB2YWxpZCBzZWxlY3Rpb24gaXMgYW5jaG9yTm9kZSBhbmQgZm9jdXNOb2RlIGJvdGggZXF1YWwgdG8gdGhpcyBub2RlXG4gICAgICAgIC8vIGFuZCBib3RoIG9mZnNldHMgMCwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIGhhdmUgaGFuZGxlZCBhYm92ZS5cbiAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBhbmNob3JOb2RlICYmICsraW5kZXhXaXRoaW5BbmNob3IgPT09IGFuY2hvck9mZnNldCkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGZvY3VzTm9kZSAmJiArK2luZGV4V2l0aGluRm9jdXMgPT09IGZvY3VzT2Zmc2V0KSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5uZXh0U2libGluZykgIT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBwYXJlbnROb2RlO1xuICAgICAgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgbmV4dCBzaWJsaW5nIGBuZXh0YC5cblxuXG4gICAgbm9kZSA9IG5leHQ7XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCA9PT0gLTEpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIChXb3VsZCBoYXBwZW4gaWYgdGhlIGFuY2hvci9mb2N1cyBub2RlcyBhcmVuJ3RcbiAgICAvLyBhY3R1YWxseSBpbnNpZGUgdGhlIHBhc3NlZC1pbiBub2RlLilcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kXG4gIH07XG59XG4vKipcbiAqIEluIG1vZGVybiBub24tSUUgYnJvd3NlcnMsIHdlIGNhbiBzdXBwb3J0IGJvdGggZm9yd2FyZCBhbmQgYmFja3dhcmRcbiAqIHNlbGVjdGlvbnMuXG4gKlxuICogTm90ZTogSUUxMCsgc3VwcG9ydHMgdGhlIFNlbGVjdGlvbiBvYmplY3QsIGJ1dCBpdCBkb2VzIG5vdCBzdXBwb3J0XG4gKiB0aGUgYGV4dGVuZGAgbWV0aG9kLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4gaW4gbW9kZXJuIElFLCBpdCdzIG5vdCBwb3NzaWJsZVxuICogdG8gcHJvZ3JhbW1hdGljYWxseSBjcmVhdGUgYSBiYWNrd2FyZCBzZWxlY3Rpb24uIFRodXMsIGZvciBhbGwgSUVcbiAqIHZlcnNpb25zLCB3ZSB1c2UgdGhlIG9sZCBJRSBBUEkgdG8gY3JlYXRlIG91ciBzZWxlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHNcbiAqL1xuXG5mdW5jdGlvbiBzZXRPZmZzZXRzKG5vZGUsIG9mZnNldHMpIHtcbiAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcbiAgdmFyIHdpbiA9IGRvYyAmJiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93OyAvLyBFZGdlIGZhaWxzIHdpdGggXCJPYmplY3QgZXhwZWN0ZWRcIiBpbiBzb21lIHNjZW5hcmlvcy5cbiAgLy8gKEZvciBpbnN0YW5jZTogVGlueU1DRSBlZGl0b3IgdXNlZCBpbiBhIGxpc3QgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgcGFzdGluZyB0byBhZGQgbW9yZSxcbiAgLy8gZmFpbHMgd2hlbiBwYXN0aW5nIDEwMCsgaXRlbXMpXG5cbiAgaWYgKCF3aW4uZ2V0U2VsZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgdmFyIGxlbmd0aCA9IG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuICB2YXIgc3RhcnQgPSBNYXRoLm1pbihvZmZzZXRzLnN0YXJ0LCBsZW5ndGgpO1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0IDogTWF0aC5taW4ob2Zmc2V0cy5lbmQsIGxlbmd0aCk7IC8vIElFIDExIHVzZXMgbW9kZXJuIHNlbGVjdGlvbiwgYnV0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZXh0ZW5kIG1ldGhvZC5cbiAgLy8gRmxpcCBiYWNrd2FyZCBzZWxlY3Rpb25zLCBzbyB3ZSBjYW4gc2V0IHdpdGggYSBzaW5nbGUgcmFuZ2UuXG5cbiAgaWYgKCFzZWxlY3Rpb24uZXh0ZW5kICYmIHN0YXJ0ID4gZW5kKSB7XG4gICAgdmFyIHRlbXAgPSBlbmQ7XG4gICAgZW5kID0gc3RhcnQ7XG4gICAgc3RhcnQgPSB0ZW1wO1xuICB9XG5cbiAgdmFyIHN0YXJ0TWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBzdGFydCk7XG4gIHZhciBlbmRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIGVuZCk7XG5cbiAgaWYgKHN0YXJ0TWFya2VyICYmIGVuZE1hcmtlcikge1xuICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMSAmJiBzZWxlY3Rpb24uYW5jaG9yTm9kZSA9PT0gc3RhcnRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0ID09PSBzdGFydE1hcmtlci5vZmZzZXQgJiYgc2VsZWN0aW9uLmZvY3VzTm9kZSA9PT0gZW5kTWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ID09PSBlbmRNYXJrZXIub2Zmc2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQoc3RhcnRNYXJrZXIubm9kZSwgc3RhcnRNYXJrZXIub2Zmc2V0KTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICBzZWxlY3Rpb24uZXh0ZW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2Uuc2V0RW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREU7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZSkge1xuICBpZiAoIW91dGVyTm9kZSB8fCAhaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZSA9PT0gaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShvdXRlck5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUoaW5uZXJOb2RlKSkge1xuICAgIHJldHVybiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUucGFyZW50Tm9kZSk7XG4gIH0gZWxzZSBpZiAoJ2NvbnRhaW5zJyBpbiBvdXRlck5vZGUpIHtcbiAgICByZXR1cm4gb3V0ZXJOb2RlLmNvbnRhaW5zKGlubmVyTm9kZSk7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgcmV0dXJuICEhKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpbm5lck5vZGUpICYgMTYpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luRG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgY29udGFpbnNOb2RlKG5vZGUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG5vZGUpO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW5GcmFtZShpZnJhbWUpIHtcbiAgdHJ5IHtcbiAgICAvLyBBY2Nlc3NpbmcgdGhlIGNvbnRlbnREb2N1bWVudCBvZiBhIEhUTUxJZnJhbWVFbGVtZW50IGNhbiBjYXVzZSB0aGUgYnJvd3NlclxuICAgIC8vIHRvIHRocm93LCBlLmcuIGlmIGl0IGhhcyBhIGNyb3NzLW9yaWdpbiBzcmMgYXR0cmlidXRlLlxuICAgIC8vIFNhZmFyaSB3aWxsIHNob3cgYW4gZXJyb3IgaW4gdGhlIGNvbnNvbGUgd2hlbiB0aGUgYWNjZXNzIHJlc3VsdHMgaW4gXCJCbG9ja2VkIGEgZnJhbWUgd2l0aCBvcmlnaW5cIi4gZS5nOlxuICAgIC8vIGlmcmFtZS5jb250ZW50RG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgLy8gQSBzYWZldHkgd2F5IGlzIHRvIGFjY2VzcyBvbmUgb2YgdGhlIGNyb3NzIG9yaWdpbiBwcm9wZXJ0aWVzOiBXaW5kb3cgb3IgTG9jYXRpb25cbiAgICAvLyBXaGljaCBtaWdodCByZXN1bHQgaW4gXCJTZWN1cml0eUVycm9yXCIgRE9NIEV4Y2VwdGlvbiBhbmQgaXQgaXMgY29tcGF0aWJsZSB0byBTYWZhcmkuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvYnJvd3NlcnMuaHRtbCNpbnRlZ3JhdGlvbi13aXRoLWlkbFxuICAgIHJldHVybiB0eXBlb2YgaWZyYW1lLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZiA9PT0gJ3N0cmluZyc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50RGVlcCgpIHtcbiAgdmFyIHdpbiA9IHdpbmRvdztcbiAgdmFyIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KCk7XG5cbiAgd2hpbGUgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW4uSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICBpZiAoaXNTYW1lT3JpZ2luRnJhbWUoZWxlbWVudCkpIHtcbiAgICAgIHdpbiA9IGVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQod2luLmRvY3VtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuLyoqXG4gKiBAUmVhY3RJbnB1dFNlbGVjdGlvbjogUmVhY3QgaW5wdXQgc2VsZWN0aW9uIG1vZHVsZS4gQmFzZWQgb24gU2VsZWN0aW9uLmpzLFxuICogYnV0IG1vZGlmaWVkIHRvIGJlIHN1aXRhYmxlIGZvciByZWFjdCBhbmQgaGFzIGEgY291cGxlIG9mIGJ1ZyBmaXhlcyAoZG9lc24ndFxuICogYXNzdW1lIGJ1dHRvbnMgaGF2ZSByYW5nZSBzZWxlY3Rpb25zIGFsbG93ZWQpLlxuICogSW5wdXQgc2VsZWN0aW9uIG1vZHVsZSBmb3IgUmVhY3QuXG4gKi9cblxuLyoqXG4gKiBAaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzOiB3ZSBnZXQgdGhlIGVsZW1lbnQgdHlwZXMgdGhhdCBzdXBwb3J0IHNlbGVjdGlvblxuICogZnJvbSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNkby1ub3QtYXBwbHksIGxvb2tpbmcgYXQgYHNlbGVjdGlvblN0YXJ0YFxuICogYW5kIGBzZWxlY3Rpb25FbmRgIHJvd3MuXG4gKi9cblxuXG5mdW5jdGlvbiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICd0ZXh0JyB8fCBlbGVtLnR5cGUgPT09ICdzZWFyY2gnIHx8IGVsZW0udHlwZSA9PT0gJ3RlbCcgfHwgZWxlbS50eXBlID09PSAndXJsJyB8fCBlbGVtLnR5cGUgPT09ICdwYXNzd29yZCcpIHx8IG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpO1xufVxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKSB7XG4gIHZhciBmb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7XG4gIHJldHVybiB7XG4gICAgZm9jdXNlZEVsZW06IGZvY3VzZWRFbGVtLFxuICAgIHNlbGVjdGlvblJhbmdlOiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZm9jdXNlZEVsZW0pID8gZ2V0U2VsZWN0aW9uKGZvY3VzZWRFbGVtKSA6IG51bGxcbiAgfTtcbn1cbi8qKlxuICogQHJlc3RvcmVTZWxlY3Rpb246IElmIGFueSBzZWxlY3Rpb24gaW5mb3JtYXRpb24gd2FzIHBvdGVudGlhbGx5IGxvc3QsXG4gKiByZXN0b3JlIGl0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyB0aGF0IGNvdWxkIHJlbW92ZSBkb21cbiAqIG5vZGVzIGFuZCBwbGFjZSB0aGVtIGJhY2sgaW4sIHJlc3VsdGluZyBpbiBmb2N1cyBiZWluZyBsb3N0LlxuICovXG5cbmZ1bmN0aW9uIHJlc3RvcmVTZWxlY3Rpb24ocHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbikge1xuICB2YXIgY3VyRm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICB2YXIgcHJpb3JGb2N1c2VkRWxlbSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uZm9jdXNlZEVsZW07XG4gIHZhciBwcmlvclNlbGVjdGlvblJhbmdlID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5zZWxlY3Rpb25SYW5nZTtcblxuICBpZiAoY3VyRm9jdXNlZEVsZW0gIT09IHByaW9yRm9jdXNlZEVsZW0gJiYgaXNJbkRvY3VtZW50KHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgaWYgKHByaW9yU2VsZWN0aW9uUmFuZ2UgIT09IG51bGwgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgICBzZXRTZWxlY3Rpb24ocHJpb3JGb2N1c2VkRWxlbSwgcHJpb3JTZWxlY3Rpb25SYW5nZSk7XG4gICAgfSAvLyBGb2N1c2luZyBhIG5vZGUgY2FuIGNoYW5nZSB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB3aGljaCBpcyB1bmRlc2lyYWJsZVxuXG5cbiAgICB2YXIgYW5jZXN0b3JzID0gW107XG4gICAgdmFyIGFuY2VzdG9yID0gcHJpb3JGb2N1c2VkRWxlbTtcblxuICAgIHdoaWxlIChhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUpIHtcbiAgICAgIGlmIChhbmNlc3Rvci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGFuY2VzdG9ycy5wdXNoKHtcbiAgICAgICAgICBlbGVtZW50OiBhbmNlc3RvcixcbiAgICAgICAgICBsZWZ0OiBhbmNlc3Rvci5zY3JvbGxMZWZ0LFxuICAgICAgICAgIHRvcDogYW5jZXN0b3Iuc2Nyb2xsVG9wXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IGFuY2VzdG9yc1tpXTtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxMZWZ0ID0gaW5mby5sZWZ0O1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbFRvcCA9IGluZm8udG9wO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBAZ2V0U2VsZWN0aW9uOiBHZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgZm9jdXNlZCB0ZXh0YXJlYSwgaW5wdXQgb3JcbiAqIGNvbnRlbnRFZGl0YWJsZSBub2RlLlxuICogLUBpbnB1dDogTG9vayB1cCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXRcbiAqIC1AcmV0dXJuIHtzdGFydDogc2VsZWN0aW9uU3RhcnQsIGVuZDogc2VsZWN0aW9uRW5kfVxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbihpbnB1dCkge1xuICB2YXIgc2VsZWN0aW9uO1xuXG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXIgd2l0aCBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSB7XG4gICAgICBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IGlucHV0LnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29udGVudCBlZGl0YWJsZSBvciBvbGQgSUUgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0gZ2V0T2Zmc2V0cyhpbnB1dCk7XG4gIH1cblxuICByZXR1cm4gc2VsZWN0aW9uIHx8IHtcbiAgICBzdGFydDogMCxcbiAgICBlbmQ6IDBcbiAgfTtcbn1cbi8qKlxuICogQHNldFNlbGVjdGlvbjogU2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIHRleHRhcmVhIG9yIGlucHV0IGFuZCBmb2N1c2VzXG4gKiB0aGUgaW5wdXQuXG4gKiAtQGlucHV0ICAgICBTZXQgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0IG9yIHRleHRhcmVhXG4gKiAtQG9mZnNldHMgICBPYmplY3Qgb2Ygc2FtZSBmb3JtIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXQqXG4gKi9cblxuZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGlucHV0LCBvZmZzZXRzKSB7XG4gIHZhciBzdGFydCA9IG9mZnNldHMuc3RhcnQ7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZDtcblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSBzdGFydDtcbiAgfVxuXG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICBpbnB1dC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1pbihlbmQsIGlucHV0LnZhbHVlLmxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0T2Zmc2V0cyhpbnB1dCwgb2Zmc2V0cyk7XG4gIH1cbn1cblxudmFyIHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCA9IGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPD0gMTE7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDMoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25TZWxlY3QnLCBbJ2ZvY3Vzb3V0JywgJ2NvbnRleHRtZW51JywgJ2RyYWdlbmQnLCAnZm9jdXNpbicsICdrZXlkb3duJywgJ2tleXVwJywgJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTtcbn1cblxudmFyIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG52YXIgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG52YXIgbW91c2VEb3duID0gZmFsc2U7XG4vKipcbiAqIEdldCBhbiBvYmplY3Qgd2hpY2ggaXMgYSB1bmlxdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBub3QgYmUgY29uc2lzdGVudCBhY3Jvc3Mgbm9kZXMgb3IgYnJvd3NlcnMsIGJ1dFxuICogdHdvIGlkZW50aWNhbCBzZWxlY3Rpb25zIG9uIHRoZSBzYW1lIG5vZGUgd2lsbCByZXR1cm4gaWRlbnRpY2FsIG9iamVjdHMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uJDEobm9kZSkge1xuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhub2RlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogbm9kZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogbm9kZS5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciB3aW4gPSBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHJldHVybiB7XG4gICAgICBhbmNob3JOb2RlOiBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldDogc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZTogc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0OiBzZWxlY3Rpb24uZm9jdXNPZmZzZXRcbiAgICB9O1xuICB9XG59XG4vKipcbiAqIEdldCBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50IHRhcmdldC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQoZXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIGV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gZXZlbnRUYXJnZXQgPyBldmVudFRhcmdldC5kb2N1bWVudCA6IGV2ZW50VGFyZ2V0Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gZXZlbnRUYXJnZXQgOiBldmVudFRhcmdldC5vd25lckRvY3VtZW50O1xufVxuLyoqXG4gKiBQb2xsIHNlbGVjdGlvbiB0byBzZWUgd2hldGhlciBpdCdzIGNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRUYXJnZXRcbiAqIEByZXR1cm4gez9TeW50aGV0aWNFdmVudH1cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgZWxlbWVudCwgYW5kIHRoYXQgdGhlIHVzZXIgaXMgbm90IGRyYWdnaW5nIGFcbiAgLy8gc2VsZWN0aW9uICh0aGlzIG1hdGNoZXMgbmF0aXZlIGBzZWxlY3RgIGV2ZW50IGJlaGF2aW9yKS4gSW4gSFRNTDUsIHNlbGVjdFxuICAvLyBmaXJlcyBvbmx5IG9uIGlucHV0IGFuZCB0ZXh0YXJlYSB0aHVzIGlmIHRoZXJlJ3Mgbm8gZm9jdXNlZCBlbGVtZW50IHdlXG4gIC8vIHdvbid0IGRpc3BhdGNoLlxuICB2YXIgZG9jID0gZ2V0RXZlbnRUYXJnZXREb2N1bWVudChuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKG1vdXNlRG93biB8fCBhY3RpdmVFbGVtZW50JDEgPT0gbnVsbCB8fCBhY3RpdmVFbGVtZW50JDEgIT09IGdldEFjdGl2ZUVsZW1lbnQoZG9jKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBPbmx5IGZpcmUgd2hlbiBzZWxlY3Rpb24gaGFzIGFjdHVhbGx5IGNoYW5nZWQuXG5cblxuICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbiQxKGFjdGl2ZUVsZW1lbnQkMSk7XG5cbiAgaWYgKCFsYXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHtcbiAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcbiAgICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGFjdGl2ZUVsZW1lbnRJbnN0JDEsICdvblNlbGVjdCcpO1xuXG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uU2VsZWN0JywgJ3NlbGVjdCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgICB9KTtcbiAgICAgIGV2ZW50LnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQkMTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25TZWxlY3RgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBzZWxlY3QgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBjb250ZW50RWRpdGFibGVcbiAqXG4gKiBUaGlzIGRpZmZlcnMgZnJvbSBuYXRpdmUgYnJvd3NlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB3YXlzOlxuICogLSBGaXJlcyBvbiBjb250ZW50RWRpdGFibGUgZmllbGRzIGFzIHdlbGwgYXMgaW5wdXRzLlxuICogLSBGaXJlcyBmb3IgY29sbGFwc2VkIHNlbGVjdGlvbi5cbiAqIC0gRmlyZXMgYWZ0ZXIgdXNlciBpbnB1dC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJykge1xuICAgICAgICBhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXROb2RlO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xuICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICBicmVhaztcbiAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZy4gVGhpcyBtYXRjaGVzIHRoZVxuICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC5cblxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgICBtb3VzZURvd24gPSBmYWxzZTtcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBicmVhaztcbiAgICAvLyBDaHJvbWUgYW5kIElFIGZpcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWQgKGFuZFxuICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LlxuICAgIC8vXG4gICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmVcbiAgICAvLyBrZXl1cCwgYnV0IHdlIGNoZWNrIG9uIGtleWRvd24gYXMgd2VsbCBpbiB0aGUgY2FzZSBvZiBob2xkaW5nIGRvd24gYVxuICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cblxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgICBpZiAoc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuICByZXR1cm4gcHJlZml4ZXM7XG59XG4vKipcbiAqIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuLyoqXG4gKiBFdmVudCBuYW1lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRldGVjdGVkIGFuZCBwcmVmaXhlZCAoaWYgYXBwbGljYWJsZSkuXG4gKi9cblxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuLyoqXG4gKiBFbGVtZW50IHRvIGNoZWNrIGZvciBwcmVmaXhlcyBvbi5cbiAqL1xuXG52YXIgc3R5bGUgPSB7fTtcbi8qKlxuICogQm9vdHN0cmFwIGlmIGEgRE9NIGV4aXN0cy5cbiAqL1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7IC8vIE9uIHNvbWUgcGxhdGZvcm1zLCBpbiBwYXJ0aWN1bGFyIHNvbWUgcmVsZWFzZXMgb2YgQW5kcm9pZCA0LngsXG4gIC8vIHRoZSB1bi1wcmVmaXhlZCBcImFuaW1hdGlvblwiIGFuZCBcInRyYW5zaXRpb25cIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZVxuICAvLyBzdHlsZSBvYmplY3QgYnV0IHRoZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWRcbiAgLy8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC5cblxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9IC8vIFNhbWUgYXMgYWJvdmVcblxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICB9XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBldmVudE5hbWU7XG4gIH1cblxuICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTtcblxuICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7XG4gICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50TmFtZTtcbn1cblxudmFyIEFOSU1BVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgQU5JTUFUSU9OX0lURVJBVElPTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKTtcbnZhciBBTklNQVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKTtcbnZhciBUUkFOU0lUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG5cbnZhciB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKTsgLy8gTk9URTogQ2FwaXRhbGl6YXRpb24gaXMgaW1wb3J0YW50IGluIHRoaXMgbGlzdCFcbi8vXG4vLyBFLmcuIGl0IG5lZWRzIFwicG9pbnRlckRvd25cIiwgbm90IFwicG9pbnRlcmRvd25cIi5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBkZXJpdmUgYm90aCBSZWFjdCBuYW1lIChcIm9uUG9pbnRlckRvd25cIilcbi8vIGFuZCBET00gbmFtZSAoXCJwb2ludGVyZG93blwiKSBmcm9tIHRoZSBzYW1lIGxpc3QuXG4vL1xuLy8gRXhjZXB0aW9ucyB0aGF0IGRvbid0IG1hdGNoIHRoaXMgY29udmVudGlvbiBhcmUgbGlzdGVkIHNlcGFyYXRlbHkuXG4vL1xuLy8gcHJldHRpZXItaWdub3JlXG5cbnZhciBzaW1wbGVFdmVudFBsdWdpbkV2ZW50cyA9IFsnYWJvcnQnLCAnYXV4Q2xpY2snLCAnY2FuY2VsJywgJ2NhblBsYXknLCAnY2FuUGxheVRocm91Z2gnLCAnY2xpY2snLCAnY2xvc2UnLCAnY29udGV4dE1lbnUnLCAnY29weScsICdjdXQnLCAnZHJhZycsICdkcmFnRW5kJywgJ2RyYWdFbnRlcicsICdkcmFnRXhpdCcsICdkcmFnTGVhdmUnLCAnZHJhZ092ZXInLCAnZHJhZ1N0YXJ0JywgJ2Ryb3AnLCAnZHVyYXRpb25DaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnZ290UG9pbnRlckNhcHR1cmUnLCAnaW5wdXQnLCAnaW52YWxpZCcsICdrZXlEb3duJywgJ2tleVByZXNzJywgJ2tleVVwJywgJ2xvYWQnLCAnbG9hZGVkRGF0YScsICdsb2FkZWRNZXRhZGF0YScsICdsb2FkU3RhcnQnLCAnbG9zdFBvaW50ZXJDYXB0dXJlJywgJ21vdXNlRG93bicsICdtb3VzZU1vdmUnLCAnbW91c2VPdXQnLCAnbW91c2VPdmVyJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3BvaW50ZXJDYW5jZWwnLCAncG9pbnRlckRvd24nLCAncG9pbnRlck1vdmUnLCAncG9pbnRlck91dCcsICdwb2ludGVyT3ZlcicsICdwb2ludGVyVXAnLCAncHJvZ3Jlc3MnLCAncmF0ZUNoYW5nZScsICdyZXNldCcsICdyZXNpemUnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdWJtaXQnLCAnc3VzcGVuZCcsICd0aW1lVXBkYXRlJywgJ3RvdWNoQ2FuY2VsJywgJ3RvdWNoRW5kJywgJ3RvdWNoU3RhcnQnLCAndm9sdW1lQ2hhbmdlJywgJ3Njcm9sbCcsICd0b2dnbGUnLCAndG91Y2hNb3ZlJywgJ3dhaXRpbmcnLCAnd2hlZWwnXTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSkge1xuICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5zZXQoZG9tRXZlbnROYW1lLCByZWFjdE5hbWUpO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVhY3ROYW1lLCBbZG9tRXZlbnROYW1lXSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlRXZlbnRzKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGV2ZW50TmFtZSA9IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzW2ldO1xuICAgIHZhciBkb21FdmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgY2FwaXRhbGl6ZWRFdmVudCA9IGV2ZW50TmFtZVswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnROYW1lLnNsaWNlKDEpO1xuICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoZG9tRXZlbnROYW1lLCAnb24nICsgY2FwaXRhbGl6ZWRFdmVudCk7XG4gIH0gLy8gU3BlY2lhbCBjYXNlcyB3aGVyZSBldmVudCBuYW1lcyBkb24ndCBtYXRjaC5cblxuXG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX0VORCwgJ29uQW5pbWF0aW9uRW5kJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX0lURVJBVElPTiwgJ29uQW5pbWF0aW9uSXRlcmF0aW9uJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX1NUQVJULCAnb25BbmltYXRpb25TdGFydCcpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdkYmxjbGljaycsICdvbkRvdWJsZUNsaWNrJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2ZvY3VzaW4nLCAnb25Gb2N1cycpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdmb2N1c291dCcsICdvbkJsdXInKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChUUkFOU0lUSU9OX0VORCwgJ29uVHJhbnNpdGlvbkVuZCcpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgcmVhY3ROYW1lID0gdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuZ2V0KGRvbUV2ZW50TmFtZSk7XG5cbiAgaWYgKHJlYWN0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0V2ZW50O1xuICB2YXIgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmRcbiAgICAgIC8vIG5vbi1wcmludGFibGUuIE9uZSB3b3VsZCBleHBlY3QgVGFiIHRvIGJlIGFzIHdlbGwgKGJ1dCBpdCBpc24ndCkuXG4gICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdmb2N1cyc7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdibHVyJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjbGljayc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMgcmVtb3ZlcyB0aGVcbiAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy5cbiAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2V1cCc6IC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQU5JTUFUSU9OX0VORDpcbiAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUUkFOU0lUSU9OX0VORDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAge1xuICAgIC8vIFNvbWUgZXZlbnRzIGRvbid0IGJ1YmJsZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAvLyBJbiB0aGUgcGFzdCwgUmVhY3QgaGFzIGFsd2F5cyBidWJibGVkIHRoZW0sIGJ1dCB0aGlzIGNhbiBiZSBzdXJwcmlzaW5nLlxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRyeSBhbGlnbmluZyBjbG9zZXIgdG8gdGhlIGJyb3dzZXIgYmVoYXZpb3IgYnkgbm90IGJ1YmJsaW5nXG4gICAgLy8gdGhlbSBpbiBSZWFjdCBlaXRoZXIuIFdlJ2xsIHN0YXJ0IGJ5IG5vdCBidWJibGluZyBvblNjcm9sbCwgYW5kIHRoZW4gZXhwYW5kLlxuICAgIHZhciBhY2N1bXVsYXRlVGFyZ2V0T25seSA9ICFpbkNhcHR1cmVQaGFzZSAmJiAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYWRkIGFsbCBldmVudHMgZnJvbVxuICAgIC8vIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0IGluIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxuICAgIC8vIFRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHNwZWNpYWwgbGlzdC5cbiAgICAvLyBUaGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdlIHRoYXQgY2FuIHdhaXQgdW50aWwgUmVhY3QgMTguXG4gICAgZG9tRXZlbnROYW1lID09PSAnc2Nyb2xsJztcblxuICAgIHZhciBfbGlzdGVuZXJzID0gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnQudHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5KTtcblxuICAgIGlmIChfbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgY3JlYXRlIGV2ZW50IGxhemlseS5cbiAgICAgIHZhciBfZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBfZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogX2xpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0b3AtbGV2ZWwgc2lkZSBlZmZlY3QuXG5yZWdpc3RlclNpbXBsZUV2ZW50cygpO1xucmVnaXN0ZXJFdmVudHMkMigpO1xucmVnaXN0ZXJFdmVudHMkMSgpO1xucmVnaXN0ZXJFdmVudHMkMygpO1xucmVnaXN0ZXJFdmVudHMoKTtcblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29uY2VwdCBvZiBhIFwiU2ltcGxlRXZlbnRQbHVnaW5cIi5cbiAgLy8gVGhpcyBpcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXZlbnQgc3lzdGVtLiBBbGxcbiAgLy8gdGhlIG90aGVyIHBsdWdpbnMgYXJlIGVzc2VudGlhbGx5IHBvbHlmaWxscy4gU28gdGhlIHBsdWdpblxuICAvLyBzaG91bGQgcHJvYmFibHkgYmUgaW5saW5lZCBzb21ld2hlcmUgYW5kIGhhdmUgaXRzIGxvZ2ljXG4gIC8vIGJlIGNvcmUgdGhlIHRvIGV2ZW50IHN5c3RlbS4gVGhpcyB3b3VsZCBwb3RlbnRpYWxseSBhbGxvd1xuICAvLyB1cyB0byBzaGlwIGJ1aWxkcyBvZiBSZWFjdCB3aXRob3V0IHRoZSBwb2x5ZmlsbGVkIHBsdWdpbnMgYmVsb3cuXG4gIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHZhciBzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUykgPT09IDA7IC8vIFdlIGRvbid0IHByb2Nlc3MgdGhlc2UgZXZlbnRzIHVubGVzcyB3ZSBhcmUgaW4gdGhlXG4gIC8vIGV2ZW50J3MgbmF0aXZlIFwiYnViYmxlXCIgcGhhc2UsIHdoaWNoIG1lYW5zIHRoYXQgd2UncmVcbiAgLy8gbm90IGluIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0J3MgYmVjYXVzZSB3ZSBlbXVsYXRlXG4gIC8vIHRoZSBjYXB0dXJlIHBoYXNlIGhlcmUgc3RpbGwuIFRoaXMgaXMgYSB0cmFkZS1vZmYsXG4gIC8vIGJlY2F1c2UgaW4gYW4gaWRlYWwgd29ybGQgd2Ugd291bGQgbm90IGVtdWxhdGUgYW5kIHVzZVxuICAvLyB0aGUgcGhhc2VzIHByb3Blcmx5LCBsaWtlIHdlIGRvIHdpdGggdGhlIFNpbXBsZUV2ZW50XG4gIC8vIHBsdWdpbi4gSG93ZXZlciwgdGhlIHBsdWdpbnMgYmVsb3cgZWl0aGVyIGV4cGVjdFxuICAvLyBlbXVsYXRpb24gKEVudGVyTGVhdmUpIG9yIHVzZSBzdGF0ZSBsb2NhbGl6ZWQgdG8gdGhhdFxuICAvLyBwbHVnaW4gKEJlZm9yZUlucHV0LCBDaGFuZ2UsIFNlbGVjdCkuIFRoZSBzdGF0ZSBpblxuICAvLyB0aGVzZSBtb2R1bGVzIGNvbXBsaWNhdGVzIHRoaW5ncywgYXMgeW91J2xsIGVzc2VudGlhbGx5XG4gIC8vIGdldCB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwdHVyZSBwaGFzZSBldmVudCBtaWdodCBjaGFuZ2VcbiAgLy8gc3RhdGUsIG9ubHkgZm9yIHRoZSBmb2xsb3dpbmcgYnViYmxlIGV2ZW50IHRvIGNvbWUgaW5cbiAgLy8gbGF0ZXIgYW5kIG5vdCB0cmlnZ2VyIGFueXRoaW5nIGFzIHRoZSBzdGF0ZSBub3dcbiAgLy8gaW52YWxpZGF0ZXMgdGhlIGhldXJpc3RpY3Mgb2YgdGhlIGV2ZW50IHBsdWdpbi4gV2VcbiAgLy8gY291bGQgYWx0ZXIgYWxsIHRoZXNlIHBsdWdpbnMgdG8gd29yayBpbiBzdWNoIHdheXMsIGJ1dFxuICAvLyB0aGF0IG1pZ2h0IGNhdXNlIG90aGVyIHVua25vd24gc2lkZS1lZmZlY3RzIHRoYXQgd2VcbiAgLy8gY2FuJ3QgZm9yZXNlZSByaWdodCBub3cuXG5cbiAgaWYgKHNob3VsZFByb2Nlc3NQb2x5ZmlsbFBsdWdpbnMpIHtcbiAgICBleHRyYWN0RXZlbnRzJDIoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMkMShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyQzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufSAvLyBMaXN0IG9mIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgaW5kaXZpZHVhbGx5IGF0dGFjaGVkIHRvIG1lZGlhIGVsZW1lbnRzLlxuXG5cbnZhciBtZWRpYUV2ZW50VHlwZXMgPSBbJ2Fib3J0JywgJ2NhbnBsYXknLCAnY2FucGxheXRocm91Z2gnLCAnZHVyYXRpb25jaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnbG9hZGVkZGF0YScsICdsb2FkZWRtZXRhZGF0YScsICdsb2Fkc3RhcnQnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVjaGFuZ2UnLCAncmVzaXplJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VzcGVuZCcsICd0aW1ldXBkYXRlJywgJ3ZvbHVtZWNoYW5nZScsICd3YWl0aW5nJ107IC8vIFdlIHNob3VsZCBub3QgZGVsZWdhdGUgdGhlc2UgZXZlbnRzIHRvIHRoZSBjb250YWluZXIsIGJ1dCByYXRoZXJcbi8vIHNldCB0aGVtIG9uIHRoZSBhY3R1YWwgdGFyZ2V0IGVsZW1lbnQgaXRzZWxmLiBUaGlzIGlzIHByaW1hcmlseVxuLy8gYmVjYXVzZSB0aGVzZSBldmVudHMgZG8gbm90IGNvbnNpc3RlbnRseSBidWJibGUgaW4gdGhlIERPTS5cblxudmFyIG5vbkRlbGVnYXRlZEV2ZW50cyA9IG5ldyBTZXQoWydjYW5jZWwnLCAnY2xvc2UnLCAnaW52YWxpZCcsICdsb2FkJywgJ3Njcm9sbCcsICd0b2dnbGUnXS5jb25jYXQobWVkaWFFdmVudFR5cGVzKSk7XG5cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHtcbiAgdmFyIHR5cGUgPSBldmVudC50eXBlIHx8ICd1bmtub3duLWV2ZW50JztcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQ7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFja0FuZENhdGNoRmlyc3RFcnJvcih0eXBlLCBsaXN0ZW5lciwgdW5kZWZpbmVkLCBldmVudCk7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZUl0ZW1zSW5PcmRlcihldmVudCwgZGlzcGF0Y2hMaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciBwcmV2aW91c0luc3RhbmNlO1xuXG4gIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgIGZvciAodmFyIGkgPSBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRpID0gZGlzcGF0Y2hMaXN0ZW5lcnNbaV0sXG4gICAgICAgICAgaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5pbnN0YW5jZSxcbiAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBsaXN0ZW5lciA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmxpc3RlbmVyO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpO1xuICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2Rpc3BhdGNoTGlzdGVuZXJzJF9pID0gZGlzcGF0Y2hMaXN0ZW5lcnNbX2ldLFxuICAgICAgICAgIF9pbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5pbnN0YW5jZSxcbiAgICAgICAgICBfY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgIF9saXN0ZW5lciA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKF9pbnN0YW5jZSAhPT0gcHJldmlvdXNJbnN0YW5jZSAmJiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBfbGlzdGVuZXIsIF9jdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBfaW5zdGFuY2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpIHtcbiAgdmFyIGluQ2FwdHVyZVBoYXNlID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFKSAhPT0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2Rpc3BhdGNoUXVldWUkaSA9IGRpc3BhdGNoUXVldWVbaV0sXG4gICAgICAgIGV2ZW50ID0gX2Rpc3BhdGNoUXVldWUkaS5ldmVudCxcbiAgICAgICAgbGlzdGVuZXJzID0gX2Rpc3BhdGNoUXVldWUkaS5saXN0ZW5lcnM7XG4gICAgcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGxpc3RlbmVycywgaW5DYXB0dXJlUGhhc2UpOyAvLyAgZXZlbnQgc3lzdGVtIGRvZXNuJ3QgdXNlIHBvb2xpbmcuXG4gIH0gLy8gVGhpcyB3b3VsZCBiZSBhIGdvb2QgdGltZSB0byByZXRocm93IGlmIGFueSBvZiB0aGUgZXZlbnQgaGFuZGxlcnMgdGhyZXcuXG5cblxuICByZXRocm93Q2F1Z2h0RXJyb3IoKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCk7XG4gIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gIGV4dHJhY3RFdmVudHMkNShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0RWxlbWVudCkge1xuICB7XG4gICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBhIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoKSBjYWxsIGZvciBcIiVzXCIuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZG9tRXZlbnROYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciA9IGZhbHNlO1xuICB2YXIgbGlzdGVuZXJTZXQgPSBnZXRFdmVudExpc3RlbmVyU2V0KHRhcmdldEVsZW1lbnQpO1xuICB2YXIgbGlzdGVuZXJTZXRLZXkgPSBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuXG4gIGlmICghbGlzdGVuZXJTZXQuaGFzKGxpc3RlbmVyU2V0S2V5KSkge1xuICAgIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIGRvbUV2ZW50TmFtZSwgSVNfTk9OX0RFTEVHQVRFRCwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG4gICAgbGlzdGVuZXJTZXQuYWRkKGxpc3RlbmVyU2V0S2V5KTtcbiAgfVxufVxuZnVuY3Rpb24gbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIHRhcmdldCkge1xuICB7XG4gICAgaWYgKG5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSAmJiAhaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9OYXRpdmVFdmVudCgpIGNhbGwgZm9yIFwiJXNcIiBpbiB0aGUgYnViYmxlIHBoYXNlLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGRvbUV2ZW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50U3lzdGVtRmxhZ3MgPSAwO1xuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgZXZlbnRTeXN0ZW1GbGFncyB8PSBJU19DQVBUVVJFX1BIQVNFO1xuICB9XG5cbiAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xufSAvLyBUaGlzIGlzIG9ubHkgdXNlZCBieSBjcmVhdGVFdmVudEhhbmRsZSB3aGVuIHRoZVxudmFyIGxpc3RlbmluZ01hcmtlciA9ICdfcmVhY3RMaXN0ZW5pbmcnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG5mdW5jdGlvbiBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCkge1xuICBpZiAoIXJvb3RDb250YWluZXJFbGVtZW50W2xpc3RlbmluZ01hcmtlcl0pIHtcbiAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICBhbGxOYXRpdmVFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9tRXZlbnROYW1lKSB7XG4gICAgICAvLyBXZSBoYW5kbGUgc2VsZWN0aW9uY2hhbmdlIHNlcGFyYXRlbHkgYmVjYXVzZSBpdFxuICAgICAgLy8gZG9lc24ndCBidWJibGUgYW5kIG5lZWRzIHRvIGJlIG9uIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmIChkb21FdmVudE5hbWUgIT09ICdzZWxlY3Rpb25jaGFuZ2UnKSB7XG4gICAgICAgIGlmICghbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpKSB7XG4gICAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGZhbHNlLCByb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgdHJ1ZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICBpZiAob3duZXJEb2N1bWVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCBhbHNvIG5lZWRzIGRlZHVwbGljYXRpb25cbiAgICAgIC8vIGJ1dCBpdCBpcyBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnQuXG4gICAgICBpZiAoIW93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgICAgICBvd25lckRvY3VtZW50W2xpc3RlbmluZ01hcmtlcl0gPSB0cnVlO1xuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCdzZWxlY3Rpb25jaGFuZ2UnLCBmYWxzZSwgb3duZXJEb2N1bWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyLCBpc0RlZmVycmVkTGlzdGVuZXJGb3JMZWdhY3lGQlN1cHBvcnQpIHtcbiAgdmFyIGxpc3RlbmVyID0gY3JlYXRlRXZlbnRMaXN0ZW5lcldyYXBwZXJXaXRoUHJpb3JpdHkodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MpOyAvLyBJZiBwYXNzaXZlIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCB0aGVuIHRoZSBldmVudCB3aWxsIGJlXG4gIC8vIGFjdGl2ZSBhbmQgbm90IHBhc3NpdmUuXG5cbiAgdmFyIGlzUGFzc2l2ZUxpc3RlbmVyID0gdW5kZWZpbmVkO1xuXG4gIGlmIChwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCkge1xuICAgIC8vIEJyb3dzZXJzIGludHJvZHVjZWQgYW4gaW50ZXJ2ZW50aW9uLCBtYWtpbmcgdGhlc2UgZXZlbnRzXG4gICAgLy8gcGFzc2l2ZSBieSBkZWZhdWx0IG9uIGRvY3VtZW50LiBSZWFjdCBkb2Vzbid0IGJpbmQgdGhlbVxuICAgIC8vIHRvIGRvY3VtZW50IGFueW1vcmUsIGJ1dCBjaGFuZ2luZyB0aGlzIG5vdyB3b3VsZCB1bmRvXG4gICAgLy8gdGhlIHBlcmZvcm1hbmNlIHdpbnMgZnJvbSB0aGUgY2hhbmdlLiBTbyB3ZSBlbXVsYXRlXG4gICAgLy8gdGhlIGV4aXN0aW5nIGJlaGF2aW9yIG1hbnVhbGx5IG9uIHRoZSByb290cyBub3cuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTY1MVxuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICd0b3VjaHN0YXJ0JyB8fCBkb21FdmVudE5hbWUgPT09ICd0b3VjaG1vdmUnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3doZWVsJykge1xuICAgICAgaXNQYXNzaXZlTGlzdGVuZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHRhcmdldENvbnRhaW5lciA9ICB0YXJnZXRDb250YWluZXI7XG4gIHZhciB1bnN1YnNjcmliZUxpc3RlbmVyOyAvLyBXaGVuIGxlZ2FjeUZCU3VwcG9ydCBpcyBlbmFibGVkLCBpdCdzIGZvciB3aGVuIHdlXG5cblxuICBpZiAoaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNQYXNzaXZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdyYW5kQ29udGFpbmVyID09PSB0YXJnZXRDb250YWluZXIgfHwgZ3JhbmRDb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBncmFuZENvbnRhaW5lci5wYXJlbnROb2RlID09PSB0YXJnZXRDb250YWluZXI7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIGFuY2VzdG9ySW5zdCA9IHRhcmdldEluc3Q7XG5cbiAgaWYgKChldmVudFN5c3RlbUZsYWdzICYgSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUpID09PSAwICYmIChldmVudFN5c3RlbUZsYWdzICYgSVNfTk9OX0RFTEVHQVRFRCkgPT09IDApIHtcbiAgICB2YXIgdGFyZ2V0Q29udGFpbmVyTm9kZSA9IHRhcmdldENvbnRhaW5lcjsgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSBsZWdhY3kgRkIgc3VwcG9ydCBmbGFnLCB3ZVxuXG4gICAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSBiZWxvdyBsb2dpYyBhdHRlbXB0cyB0byB3b3JrIG91dCBpZiB3ZSBuZWVkIHRvIGNoYW5nZVxuICAgICAgLy8gdGhlIHRhcmdldCBmaWJlciB0byBhIGRpZmZlcmVudCBhbmNlc3Rvci4gV2UgaGFkIHNpbWlsYXIgbG9naWNcbiAgICAgIC8vIGluIHRoZSBsZWdhY3kgZXZlbnQgc3lzdGVtLCBleGNlcHQgdGhlIGJpZyBkaWZmZXJlbmNlIGJldHdlZW5cbiAgICAgIC8vIHN5c3RlbXMgaXMgdGhhdCB0aGUgbW9kZXJuIGV2ZW50IHN5c3RlbSBub3cgaGFzIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICAvLyBhdHRhY2hlZCB0byBlYWNoIFJlYWN0IFJvb3QgYW5kIFJlYWN0IFBvcnRhbCBSb290LiBUb2dldGhlcixcbiAgICAgIC8vIHRoZSBET00gbm9kZXMgcmVwcmVzZW50aW5nIHRoZXNlIHJvb3RzIGFyZSB0aGUgXCJyb290Q29udGFpbmVyXCIuXG4gICAgICAvLyBUbyBmaWd1cmUgb3V0IHdoaWNoIGFuY2VzdG9yIGluc3RhbmNlIHdlIHNob3VsZCB1c2UsIHdlIHRyYXZlcnNlXG4gICAgICAvLyB1cCB0aGUgZmliZXIgdHJlZSBmcm9tIHRoZSB0YXJnZXQgaW5zdGFuY2UgYW5kIGF0dGVtcHQgdG8gZmluZFxuICAgICAgLy8gcm9vdCBib3VuZGFyaWVzIHRoYXQgbWF0Y2ggdGhhdCBvZiBvdXIgY3VycmVudCBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIElmIHdlIGZpbmQgdGhhdCBcInJvb3RDb250YWluZXJcIiwgd2UgZmluZCB0aGUgcGFyZW50IGZpYmVyXG4gICAgICAvLyBzdWItdHJlZSBmb3IgdGhhdCByb290IGFuZCBtYWtlIHRoYXQgb3VyIGFuY2VzdG9yIGluc3RhbmNlLlxuICAgICAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0O1xuXG4gICAgICBtYWluTG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9kZVRhZyA9IG5vZGUudGFnO1xuXG4gICAgICAgIGlmIChub2RlVGFnID09PSBIb3N0Um9vdCB8fCBub2RlVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBpZiAoaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoY29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICAgIC8vIFRoZSB0YXJnZXQgaXMgYSBwb3J0YWwsIGJ1dCBpdCdzIG5vdCB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvci5cbiAgICAgICAgICAgIC8vIE5vcm1hbGx5IHBvcnRhbHMgaGFuZGxlIHRoZWlyIG93biBldmVudHMgYWxsIHRoZSB3YXkgZG93biB0byB0aGUgcm9vdC5cbiAgICAgICAgICAgIC8vIFNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIHN0b3Agbm93LiBIb3dldmVyLCB3ZSBkb24ndCBrbm93IGlmIHRoaXMgcG9ydGFsXG4gICAgICAgICAgICAvLyB3YXMgcGFydCBvZiAqb3VyKiByb290LlxuICAgICAgICAgICAgdmFyIGdyYW5kTm9kZSA9IG5vZGUucmV0dXJuO1xuXG4gICAgICAgICAgICB3aGlsZSAoZ3JhbmROb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBncmFuZFRhZyA9IGdyYW5kTm9kZS50YWc7XG5cbiAgICAgICAgICAgICAgaWYgKGdyYW5kVGFnID09PSBIb3N0Um9vdCB8fCBncmFuZFRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgICAgIHZhciBncmFuZENvbnRhaW5lciA9IGdyYW5kTm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihncmFuZENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3RDb250YWluZXIgd2UncmUgbG9va2luZyBmb3IgYW5kIHdlIGZvdW5kIGl0IGFzXG4gICAgICAgICAgICAgICAgICAvLyBhIHBhcmVudCBvZiB0aGUgUG9ydGFsLiBUaGF0IG1lYW5zIHdlIGNhbiBpZ25vcmUgaXQgYmVjYXVzZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFBvcnRhbCB3aWxsIGJ1YmJsZSB0aHJvdWdoIHRvIHVzLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGdyYW5kTm9kZSA9IGdyYW5kTm9kZS5yZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBOb3cgd2UgbmVlZCB0byBmaW5kIGl0J3MgY29ycmVzcG9uZGluZyBob3N0IGZpYmVyIGluIHRoZSBvdGhlclxuICAgICAgICAgIC8vIHRyZWUuIFRvIGRvIHRoaXMgd2UgY2FuIHVzZSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSwgYnV0IHdlXG4gICAgICAgICAgLy8gbmVlZCB0byB2YWxpZGF0ZSB0aGF0IHRoZSBmaWJlciBpcyBhIGhvc3QgaW5zdGFuY2UsIG90aGVyd2lzZVxuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdHJhdmVyc2UgdXAgdGhyb3VnaCB0aGUgRE9NIHRpbGwgd2UgZmluZCB0aGUgY29ycmVjdFxuICAgICAgICAgIC8vIG5vZGUgdGhhdCBpcyBmcm9tIHRoZSBvdGhlciB0cmVlLlxuXG5cbiAgICAgICAgICB3aGlsZSAoY29udGFpbmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudE5vZGUudGFnO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50VGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHBhcmVudFRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgICAgICAgbm9kZSA9IGFuY2VzdG9ySW5zdCA9IHBhcmVudE5vZGU7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG1haW5Mb29wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgYW5jZXN0b3JJbnN0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHJldHVybiB7XG4gICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgIGxpc3RlbmVyOiBsaXN0ZW5lcixcbiAgICBjdXJyZW50VGFyZ2V0OiBjdXJyZW50VGFyZ2V0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVTaW5nbGVQaGFzZUxpc3RlbmVycyh0YXJnZXRGaWJlciwgcmVhY3ROYW1lLCBuYXRpdmVFdmVudFR5cGUsIGluQ2FwdHVyZVBoYXNlLCBhY2N1bXVsYXRlVGFyZ2V0T25seSwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICE9PSBudWxsID8gcmVhY3ROYW1lICsgJ0NhcHR1cmUnIDogbnVsbDtcbiAgdmFyIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2UgPyBjYXB0dXJlTmFtZSA6IHJlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjtcbiAgdmFyIGxhc3RIb3N0Q29tcG9uZW50ID0gbnVsbDsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UyID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTIuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UyLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICBsYXN0SG9zdENvbXBvbmVudCA9IHN0YXRlTm9kZTsgLy8gY3JlYXRlRXZlbnRIYW5kbGUgbGlzdGVuZXJzXG5cblxuICAgICAgaWYgKHJlYWN0RXZlbnROYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdEV2ZW50TmFtZSk7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgbGFzdEhvc3RDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gSWYgd2UgYXJlIG9ubHkgYWNjdW11bGF0aW5nIGV2ZW50cyBmb3IgdGhlIHRhcmdldCwgdGhlbiB3ZSBkb24ndFxuICAgIC8vIGNvbnRpbnVlIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBSZWFjdCBmaWJlciB0cmVlIHRvIGZpbmQgb3RoZXJcbiAgICAvLyBsaXN0ZW5lcnMuXG5cblxuICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkge1xuICAgICAgYnJlYWs7XG4gICAgfSAvLyBJZiB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgb25CZWZvcmVCbHVyIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gdGFrZVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEJlZm9yZUlucHV0RXZlbnRQbHVnaW5cbi8vIC0gQ2hhbmdlRXZlbnRQbHVnaW5cbi8vIC0gU2VsZWN0RXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhlc2UgcGx1Z2luc1xuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzICh2aWEgZW11bGF0aW9uKS5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICsgJ0NhcHR1cmUnO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTMgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMy5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTMudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTmFtZSk7XG5cbiAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0TmFtZSk7XG5cbiAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICBpZiAoaW5zdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZG8ge1xuICAgIGluc3QgPSBpbnN0LnJldHVybjsgLy8gVE9ETzogSWYgdGhpcyBpcyBhIEhvc3RSb290IHdlIG1pZ2h0IHdhbnQgdG8gYmFpbCBvdXQuXG4gICAgLy8gVGhhdCBpcyBkZXBlbmRpbmcgb24gaWYgd2Ugd2FudCBuZXN0ZWQgc3VidHJlZXMgKGxheWVycykgdG8gYnViYmxlXG4gICAgLy8gZXZlbnRzIHRvIHRoZWlyIHBhcmVudC4gV2UgY291bGQgYWxzbyBnbyB0aHJvdWdoIHBhcmVudE5vZGUgb24gdGhlXG4gICAgLy8gaG9zdCBub2RlIGJ1dCB0aGF0IHdvdWxkbid0IHdvcmsgZm9yIFJlYWN0IE5hdGl2ZSBhbmQgZG9lc24ndCBsZXQgdXNcbiAgICAvLyBkbyB0aGUgcG9ydGFsIGZlYXR1cmUuXG4gIH0gd2hpbGUgKGluc3QgJiYgaW5zdC50YWcgIT09IEhvc3RDb21wb25lbnQpO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0Qikge1xuICB2YXIgbm9kZUEgPSBpbnN0QTtcbiAgdmFyIG5vZGVCID0gaW5zdEI7XG4gIHZhciBkZXB0aEEgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBBID0gbm9kZUE7IHRlbXBBOyB0ZW1wQSA9IGdldFBhcmVudCh0ZW1wQSkpIHtcbiAgICBkZXB0aEErKztcbiAgfVxuXG4gIHZhciBkZXB0aEIgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBCID0gbm9kZUI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHtcbiAgICBkZXB0aEIrKztcbiAgfSAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhBIC0gZGVwdGhCID4gMCkge1xuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBkZXB0aEEtLTtcbiAgfSAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhCIC0gZGVwdGhBID4gMCkge1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgICBkZXB0aEItLTtcbiAgfSAvLyBXYWxrIGluIGxvY2tzdGVwIHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cblxuXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcblxuICB3aGlsZSAoZGVwdGgtLSkge1xuICAgIGlmIChub2RlQSA9PT0gbm9kZUIgfHwgbm9kZUIgIT09IG51bGwgJiYgbm9kZUEgPT09IG5vZGVCLmFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIG5vZGVBO1xuICAgIH1cblxuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBldmVudCwgdGFyZ2V0LCBjb21tb24sIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuX3JlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXQ7XG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgaWYgKGluc3RhbmNlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBfaW5zdGFuY2U0ID0gaW5zdGFuY2UsXG4gICAgICAgIGFsdGVybmF0ZSA9IF9pbnN0YW5jZTQuYWx0ZXJuYXRlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2U0LnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlNC50YWc7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoaXMgcGx1Z2luXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMuXG5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBlbnRlckV2ZW50LCBmcm9tLCB0bykge1xuICB2YXIgY29tbW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZyb20sIHRvKSA6IG51bGw7XG5cbiAgaWYgKGZyb20gIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGZyb20sIGNvbW1vbiwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHRvICE9PSBudWxsICYmIGVudGVyRXZlbnQgIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGVudGVyRXZlbnQsIHRvLCBjb21tb24sIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGNhcHR1cmUpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSArIFwiX19cIiArIChjYXB0dXJlID8gJ2NhcHR1cmUnIDogJ2J1YmJsZScpO1xufVxuXG52YXIgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSBmYWxzZTtcbnZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7XG52YXIgU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HID0gJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyc7XG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBBVVRPRk9DVVMgPSAnYXV0b0ZvY3VzJztcbnZhciBDSElMRFJFTiA9ICdjaGlsZHJlbic7XG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwkMSA9ICdfX2h0bWwnO1xudmFyIHdhcm5lZFVua25vd25UYWdzO1xudmFyIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQ7XG52YXIgd2FybkZvclByb3BEaWZmZXJlbmNlO1xudmFyIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXM7XG52YXIgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyO1xudmFyIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmc7XG52YXIgbm9ybWFsaXplSFRNTDtcblxue1xuICB3YXJuZWRVbmtub3duVGFncyA9IHtcbiAgICAvLyBUaGVyZSBhcmUgd29ya2luZyBwb2x5ZmlsbHMgZm9yIDxkaWFsb2c+LiBMZXQgcGVvcGxlIHVzZSBpdC5cbiAgICBkaWFsb2c6IHRydWUsXG4gICAgLy8gRWxlY3Ryb24gc2hpcHMgYSBjdXN0b20gPHdlYnZpZXc+IHRhZyB0byBkaXNwbGF5IGV4dGVybmFsIHdlYiBjb250ZW50IGluXG4gICAgLy8gYW4gaXNvbGF0ZWQgZnJhbWUgYW5kIHByb2Nlc3MuXG4gICAgLy8gVGhpcyB0YWcgaXMgbm90IHByZXNlbnQgaW4gbm9uIEVsZWN0cm9uIGVudmlyb25tZW50cyBzdWNoIGFzIEpTRG9tIHdoaWNoXG4gICAgLy8gaXMgb2Z0ZW4gdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICAvLyBAc2VlIGh0dHBzOi8vZWxlY3Ryb25qcy5vcmcvZG9jcy9hcGkvd2Vidmlldy10YWdcbiAgICB3ZWJ2aWV3OiB0cnVlXG4gIH07XG5cbiAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBwcm9wcykge1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCB7XG4gICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzOiByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lczogcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1xuICAgIH0pO1xuICB9OyAvLyBJRSAxMSBwYXJzZXMgJiBub3JtYWxpemVzIHRoZSBzdHlsZSBhdHRyaWJ1dGUgYXMgb3Bwb3NlZCB0byBvdGhlclxuICAvLyBicm93c2Vycy4gSXQgYWRkcyBzcGFjZXMgYW5kIHNvcnRzIHRoZSBwcm9wZXJ0aWVzIGluIHNvbWVcbiAgLy8gbm9uLWFscGhhYmV0aWNhbCBvcmRlci4gSGFuZGxpbmcgdGhhdCB3b3VsZCByZXF1aXJlIHNvcnRpbmcgQ1NTXG4gIC8vIHByb3BlcnRpZXMgaW4gdGhlIGNsaWVudCAmIHNlcnZlciB2ZXJzaW9ucyBvciBhcHBseWluZ1xuICAvLyBgZXhwZWN0ZWRTdHlsZWAgdG8gYSB0ZW1wb3JhcnkgRE9NIG5vZGUgdG8gcmVhZCBpdHMgYHN0eWxlYCBhdHRyaWJ1dGVcbiAgLy8gbm9ybWFsaXplZC4gU2luY2UgaXQgb25seSBhZmZlY3RzIElFLCB3ZSdyZSBza2lwcGluZyBzdHlsZSB3YXJuaW5nc1xuICAvLyBpbiB0aGF0IGJyb3dzZXIgY29tcGxldGVseSBpbiBmYXZvciBvZiBkb2luZyBhbGwgdGhhdCB3b3JrLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTgwN1xuXG5cbiAgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZyA9IGNhblVzZURPTSAmJiAhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuXG4gIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChwcm9wTmFtZSwgc2VydmVyVmFsdWUsIGNsaWVudFZhbHVlKSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRWYWx1ZSk7XG4gICAgdmFyIG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJWYWx1ZSk7XG5cbiAgICBpZiAobm9ybWFsaXplZFNlcnZlclZhbHVlID09PSBub3JtYWxpemVkQ2xpZW50VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignUHJvcCBgJXNgIGRpZCBub3QgbWF0Y2guIFNlcnZlcjogJXMgQ2xpZW50OiAlcycsIHByb3BOYW1lLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkU2VydmVyVmFsdWUpLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkQ2xpZW50VmFsdWUpKTtcbiAgfTtcblxuICB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWVzKSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuICAgIHZhciBuYW1lcyA9IFtdO1xuICAgIGF0dHJpYnV0ZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIG5hbWVzLnB1c2gobmFtZSk7XG4gICAgfSk7XG5cbiAgICBlcnJvcignRXh0cmEgYXR0cmlidXRlcyBmcm9tIHRoZSBzZXJ2ZXI6ICVzJywgbmFtZXMpO1xuICB9O1xuXG4gIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChyZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgIGlmIChsaXN0ZW5lciA9PT0gZmFsc2UpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGBmYWxzZWAuXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgJXNgIHR5cGUuJywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICB9XG4gIH07IC8vIFBhcnNlIHRoZSBIVE1MIGFuZCByZWFkIGl0IGJhY2sgdG8gbm9ybWFsaXplIHRoZSBIVE1MIHN0cmluZyBzbyB0aGF0IGl0XG4gIC8vIGNhbiBiZSB1c2VkIGZvciBjb21wYXJpc29uLlxuXG5cbiAgbm9ybWFsaXplSFRNTCA9IGZ1bmN0aW9uIChwYXJlbnQsIGh0bWwpIHtcbiAgICAvLyBXZSBjb3VsZCBoYXZlIGNyZWF0ZWQgYSBzZXBhcmF0ZSBkb2N1bWVudCBoZXJlIHRvIGF2b2lkXG4gICAgLy8gcmUtaW5pdGlhbGl6aW5nIGN1c3RvbSBlbGVtZW50cyBpZiB0aGV5IGV4aXN0LiBCdXQgdGhpcyBicmVha3NcbiAgICAvLyBob3cgPG5vc2NyaXB0PiBpcyBiZWluZyBoYW5kbGVkLiBTbyB3ZSB1c2UgdGhlIHNhbWUgZG9jdW1lbnQuXG4gICAgLy8gU2VlIHRoZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzExMTU3LlxuICAgIHZhciB0ZXN0RWxlbWVudCA9IHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFID8gcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChwYXJlbnQudGFnTmFtZSkgOiBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMocGFyZW50Lm5hbWVzcGFjZVVSSSwgcGFyZW50LnRhZ05hbWUpO1xuICAgIHRlc3RFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRlc3RFbGVtZW50LmlubmVySFRNTDtcbiAgfTtcbn0gLy8gSFRNTCBwYXJzaW5nIG5vcm1hbGl6ZXMgQ1IgYW5kIENSTEYgdG8gTEYuXG4vLyBJdCBhbHNvIGNhbiB0dXJuIFxcdTAwMDAgaW50byBcXHVGRkZEIGluc2lkZSBhdHRyaWJ1dGVzLlxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NpbmdsZS1wYWdlLmh0bWwjcHJlcHJvY2Vzc2luZy10aGUtaW5wdXQtc3RyZWFtXG4vLyBJZiB3ZSBoYXZlIGEgbWlzbWF0Y2gsIGl0IG1pZ2h0IGJlIGNhdXNlZCBieSB0aGF0LlxuLy8gV2Ugd2lsbCBzdGlsbCBwYXRjaCB1cCBpbiB0aGlzIGNhc2UgYnV0IG5vdCBmaXJlIHRoZSB3YXJuaW5nLlxuXG5cbnZhciBOT1JNQUxJWkVfTkVXTElORVNfUkVHRVggPSAvXFxyXFxuPy9nO1xudmFyIE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCA9IC9cXHUwMDAwfFxcdUZGRkQvZztcblxuZnVuY3Rpb24gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKG1hcmt1cCkge1xuICB7XG4gICAgY2hlY2tIdG1sU3RyaW5nQ29lcmNpb24obWFya3VwKTtcbiAgfVxuXG4gIHZhciBtYXJrdXBTdHJpbmcgPSB0eXBlb2YgbWFya3VwID09PSAnc3RyaW5nJyA/IG1hcmt1cCA6ICcnICsgbWFya3VwO1xuICByZXR1cm4gbWFya3VwU3RyaW5nLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCAnXFxuJykucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsICcnKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHNlcnZlclRleHQsIGNsaWVudFRleHQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgdmFyIG5vcm1hbGl6ZWRDbGllbnRUZXh0ID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFRleHQpO1xuICB2YXIgbm9ybWFsaXplZFNlcnZlclRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCk7XG5cbiAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0ID09PSBub3JtYWxpemVkQ2xpZW50VGV4dCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRXYXJuRGV2KSB7XG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RleHQgY29udGVudCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6IFwiJXNcIiBDbGllbnQ6IFwiJXNcIicsIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0LCBub3JtYWxpemVkQ2xpZW50VGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQ29uY3VycmVudE1vZGUgJiYgZW5hYmxlQ2xpZW50UmVuZGVyRmFsbGJhY2tPblRleHRNaXNtYXRjaCkge1xuICAgIC8vIEluIGNvbmN1cnJlbnQgcm9vdHMsIHdlIHRocm93IHdoZW4gdGhlcmUncyBhIHRleHQgbWlzbWF0Y2ggYW5kIHJldmVydCB0b1xuICAgIC8vIGNsaWVudCByZW5kZXJpbmcsIHVwIHRvIHRoZSBuZWFyZXN0IFN1c3BlbnNlIGJvdW5kYXJ5LlxuICAgIHRocm93IG5ldyBFcnJvcignVGV4dCBjb250ZW50IGRvZXMgbm90IG1hdGNoIHNlcnZlci1yZW5kZXJlZCBIVE1MLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChub2RlKSB7XG4gIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgLy8gZmlyZS4gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGlja1xuICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAvLyBKdXN0IHNldCBpdCB1c2luZyB0aGUgb25jbGljayBwcm9wZXJ0eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbWFuYWdlIGFueVxuICAvLyBib29ra2VlcGluZyBmb3IgaXQuIE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gY2xlYXIgaXQgd2hlbiB0aGUgbGlzdGVuZXIgaXNcbiAgLy8gcmVtb3ZlZC5cbiAgLy8gVE9ETzogT25seSBkbyB0aGlzIGZvciB0aGUgcmVsZXZhbnQgU2FmYXJpcyBtYXliZT9cbiAgbm9kZS5vbmNsaWNrID0gbm9vcDtcbn1cblxuZnVuY3Rpb24gc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgbmV4dFByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBmb3IgKHZhciBwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuXG5cbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQXZvaWQgc2V0dGluZyBpbml0aWFsIHRleHRDb250ZW50IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZ1xuICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIDx0ZXh0YXJlYT4gd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90XG4gICAgICAgIC8vIHNob3cgd2l0aGluIHRoZSA8dGV4dGFyZWE+IHVudGlsIGl0IGhhcyBiZWVuIGZvY3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzXG4gICAgICAgIHZhciBjYW5TZXRUZXh0Q29udGVudCA9IHRhZyAhPT0gJ3RleHRhcmVhJyB8fCBuZXh0UHJvcCAhPT0gJyc7XG5cbiAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIC8vIFRPRE86IEhhbmRsZSB3YXNDdXN0b21Db21wb25lbnRUYWdcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVQYXlsb2FkLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHByb3BLZXkgPSB1cGRhdGVQYXlsb2FkW2ldO1xuICAgIHZhciBwcm9wVmFsdWUgPSB1cGRhdGVQYXlsb2FkW2kgKyAxXTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIHByb3BWYWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVyRWxlbWVudCwgcGFyZW50TmFtZXNwYWNlKSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZzsgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTFxuICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuXG5cbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICB2YXIgZG9tRWxlbWVudDtcbiAgdmFyIG5hbWVzcGFjZVVSSSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIG5hbWVzcGFjZVVSSSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAge1xuICAgICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcyk7IC8vIFNob3VsZCB0aGlzIGNoZWNrIGJlIGdhdGVkIGJ5IHBhcmVudCBuYW1lc3BhY2U/IE5vdCBzdXJlIHdlIHdhbnQgdG9cbiAgICAgIC8vIGFsbG93IDxTVkc+IG9yIDxtQVRIPi5cblxuICAgICAgaWYgKCFpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiB0eXBlICE9PSB0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgZXJyb3IoJzwlcyAvPiBpcyB1c2luZyBpbmNvcnJlY3QgY2FzaW5nLiAnICsgJ1VzZSBQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzLCAnICsgJ29yIGxvd2VyY2FzZSBmb3IgSFRNTCBlbGVtZW50cy4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ3NjcmlwdCcpIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgc2NyaXB0IHZpYSAuaW5uZXJIVE1MIHNvIGl0cyBcInBhcnNlci1pbnNlcnRlZFwiIGZsYWcgaXNcbiAgICAgIC8vIHNldCB0byB0cnVlIGFuZCBpdCBkb2VzIG5vdCBleGVjdXRlXG4gICAgICB2YXIgZGl2ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgZGl2LmlubmVySFRNTCA9ICc8c2NyaXB0PjwnICsgJy9zY3JpcHQ+JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHlpZWxkIGEgc2NyaXB0IGVsZW1lbnQuXG5cbiAgICAgIHZhciBmaXJzdENoaWxkID0gZGl2LmZpcnN0Q2hpbGQ7XG4gICAgICBkb21FbGVtZW50ID0gZGl2LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gJEZsb3dJc3N1ZSBgY3JlYXRlRWxlbWVudGAgc2hvdWxkIGJlIHVwZGF0ZWQgZm9yIFdlYiBDb21wb25lbnRzXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUsIHtcbiAgICAgICAgaXM6IHByb3BzLmlzXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VwYXJhdGUgZWxzZSBicmFuY2ggaW5zdGVhZCBvZiB1c2luZyBgcHJvcHMuaXMgfHwgdW5kZWZpbmVkYCBhYm92ZSBiZWNhdXNlIG9mIGEgRmlyZWZveCBidWcuXG4gICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC82ODk2XG4gICAgICAvLyBhbmQgZGlzY3Vzc2lvbiBpbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc2MjQwXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOyAvLyBOb3JtYWxseSBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZCBpbiBgc2V0SW5pdGlhbERPTVByb3BlcnRpZXNgLCBob3dldmVyIHRoZSBgbXVsdGlwbGVgIGFuZCBgc2l6ZWBcbiAgICAgIC8vIGF0dHJpYnV0ZXMgb24gYHNlbGVjdGBzIG5lZWRzIHRvIGJlIGFkZGVkIGJlZm9yZSBgb3B0aW9uYHMgYXJlIGluc2VydGVkLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50czpcbiAgICAgIC8vIC0gYSBidWcgd2hlcmUgdGhlIGBzZWxlY3RgIGRvZXMgbm90IHNjcm9sbCB0byB0aGUgY29ycmVjdCBvcHRpb24gYmVjYXVzZSBzaW5ndWxhclxuICAgICAgLy8gIGBzZWxlY3RgIGVsZW1lbnRzIGF1dG9tYXRpY2FsbHkgcGljayB0aGUgZmlyc3QgaXRlbSAjMTMyMjJcbiAgICAgIC8vIC0gYSBidWcgd2hlcmUgdGhlIGBzZWxlY3RgIHNldCB0aGUgZmlyc3QgaXRlbSBhcyBzZWxlY3RlZCBkZXNwaXRlIHRoZSBgc2l6ZWAgYXR0cmlidXRlICMxNDIzOVxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMyMjJcbiAgICAgIC8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MjM5XG5cbiAgICAgIGlmICh0eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICB2YXIgbm9kZSA9IGRvbUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgICAgbm9kZS5tdWx0aXBsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMuc2l6ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgYSBzaXplIGdyZWF0ZXIgdGhhbiAxIGNhdXNlcyBhIHNlbGVjdCB0byBiZWhhdmUgbGlrZSBgbXVsdGlwbGU9dHJ1ZWAsIHdoZXJlXG4gICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBubyBvcHRpb24gaXMgc2VsZWN0ZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gYSBzZWxlY3QgaW4gXCJzaW5nbGUgc2VsZWN0aW9uIG1vZGVcIi5cbiAgICAgICAgICBub2RlLnNpemUgPSBwcm9wcy5zaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHR5cGUpO1xuICB9XG5cbiAge1xuICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIWhhc093blByb3BlcnR5LmNhbGwod2FybmVkVW5rbm93blRhZ3MsIHR5cGUpKSB7XG4gICAgICAgIHdhcm5lZFVua25vd25UYWdzW3R5cGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGhlIHRhZyA8JXM+IGlzIHVucmVjb2duaXplZCBpbiB0aGlzIGJyb3dzZXIuICcgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIFJlYWN0IGNvbXBvbmVudCwgc3RhcnQgaXRzIG5hbWUgd2l0aCAnICsgJ2FuIHVwcGVyY2FzZSBsZXR0ZXIuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KS5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcbn1cbmZ1bmN0aW9uIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcmF3UHJvcHMpO1xuICB9IC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuXG5cblxuICB2YXIgcHJvcHM7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgIGNhc2UgJ2VtYmVkJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBsb2FkIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgYWxsIHRoZSBtZWRpYSBldmVudHMuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1tpXSwgZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICBjYXNlICdpbWFnZSc6XG4gICAgY2FzZSAnbGluayc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSB0b2dnbGUgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCd0b2dnbGUnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKTtcbiAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIGZhbHNlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG59IC8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cblxuZnVuY3Rpb24gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuICB2YXIgbGFzdFByb3BzO1xuICB2YXIgbmV4dFByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGxhc3RQcm9wcyA9IGxhc3RSYXdQcm9wcztcbiAgICAgIG5leHRQcm9wcyA9IG5leHRSYXdQcm9wcztcblxuICAgICAgaWYgKHR5cGVvZiBsYXN0UHJvcHMub25DbGljayAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbmV4dFByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIG5leHRQcm9wcyk7XG4gIHZhciBwcm9wS2V5O1xuICB2YXIgc3R5bGVOYW1lO1xuICB2YXIgc3R5bGVVcGRhdGVzID0gbnVsbDtcblxuICBmb3IgKHByb3BLZXkgaW4gbGFzdFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAhbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHZhciBsYXN0U3R5bGUgPSBsYXN0UHJvcHNbcHJvcEtleV07XG5cbiAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RTdHlsZSkge1xuICAgICAgICBpZiAobGFzdFN0eWxlLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwgfHwgcHJvcEtleSA9PT0gQ0hJTERSRU4pIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IEFVVE9GT0NVUykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZVxuICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgZmliZXIgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbGwgb3RoZXIgZGVsZXRlZCBwcm9wZXJ0aWVzIHdlIGFkZCBpdCB0byB0aGUgcXVldWUuIFdlIHVzZVxuICAgICAgLy8gdGhlIGFsbG93ZWQgcHJvcGVydHkgbGlzdCBpbiB0aGUgY29tbWl0IHBoYXNlIGluc3RlYWQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIHZhciBuZXh0UHJvcCA9IG5leHRQcm9wc1twcm9wS2V5XTtcbiAgICB2YXIgbGFzdFByb3AgPSBsYXN0UHJvcHMgIT0gbnVsbCA/IGxhc3RQcm9wc1twcm9wS2V5XSA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IG5leHRQcm9wID09PSBsYXN0UHJvcCB8fCBuZXh0UHJvcCA9PSBudWxsICYmIGxhc3RQcm9wID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAvLyBGcmVlemUgdGhlIG5leHQgc3R5bGUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBiZVxuICAgICAgICAgIC8vIG11dGF0ZWQuIFdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgICAgT2JqZWN0LmZyZWV6ZShuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgbGFzdFByb3BgIGJ1dCBub3Qgb24gYG5leHRQcm9wYC5cbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFByb3ApIHtcbiAgICAgICAgICBpZiAobGFzdFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFVwZGF0ZSBzdHlsZXMgdGhhdCBjaGFuZ2VkIHNpbmNlIGBsYXN0UHJvcGAuXG5cblxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmIGxhc3RQcm9wW3N0eWxlTmFtZV0gIT09IG5leHRQcm9wW3N0eWxlTmFtZV0pIHtcbiAgICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9IG5leHRQcm9wW3N0eWxlTmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cbiAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICBpZiAoIXVwZGF0ZVBheWxvYWQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkLnB1c2gocHJvcEtleSwgc3R5bGVVcGRhdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlVXBkYXRlcyA9IG5leHRQcm9wO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciBsYXN0SHRtbCA9IGxhc3RQcm9wID8gbGFzdFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGxhc3RIdG1sICE9PSBuZXh0SHRtbCkge1xuICAgICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0SHRtbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCAnJyArIG5leHRQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICAvLyBXZSBlYWdlcmx5IGxpc3RlbiB0byB0aGlzIGV2ZW4gdGhvdWdoIHdlIGhhdmVuJ3QgY29tbWl0dGVkIHlldC5cbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXVwZGF0ZVBheWxvYWQgJiYgbGFzdFByb3AgIT09IG5leHRQcm9wKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAgIC8vIHRoYXQgdGhlIFwiY3VycmVudFwiIHByb3BzIHBvaW50ZXIgZ2V0cyB1cGRhdGVkIHNvIHdlIG5lZWQgYSBjb21taXRcbiAgICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgYW55IG90aGVyIHByb3BlcnR5IHdlIGFsd2F5cyBhZGQgaXQgdG8gdGhlIHF1ZXVlIGFuZCB0aGVuIHdlXG4gICAgICAvLyBmaWx0ZXIgaXQgb3V0IHVzaW5nIHRoZSBhbGxvd2VkIHByb3BlcnR5IGxpc3QgZHVyaW5nIHRoZSBjb21taXQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbmV4dFByb3ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdHlsZVVwZGF0ZXMpIHtcbiAgICB7XG4gICAgICB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0UHJvcHNbU1RZTEVdKTtcbiAgICB9XG5cbiAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2goU1RZTEUsIHN0eWxlVXBkYXRlcyk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn0gLy8gQXBwbHkgdGhlIGRpZmYuXG5cbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcykge1xuICAvLyBVcGRhdGUgY2hlY2tlZCAqYmVmb3JlKiBuYW1lLlxuICAvLyBJbiB0aGUgbWlkZGxlIG9mIGFuIHVwZGF0ZSwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBjaGVja2VkLlxuICAvLyBXaGVuIGEgY2hlY2tlZCByYWRpbyB0cmllcyB0byBjaGFuZ2UgbmFtZSwgYnJvd3NlciBtYWtlcyBhbm90aGVyIHJhZGlvJ3MgY2hlY2tlZCBmYWxzZS5cbiAgaWYgKHRhZyA9PT0gJ2lucHV0JyAmJiBuZXh0UmF3UHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuZXh0UmF3UHJvcHMubmFtZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlQ2hlY2tlZChkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHdhc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbGFzdFJhd1Byb3BzKTtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCBuZXh0UmF3UHJvcHMpOyAvLyBBcHBseSB0aGUgZGlmZi5cblxuICB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpOyAvLyBUT0RPOiBFbnN1cmUgdGhhdCBhbiB1cGRhdGUgZ2V0cyBzY2hlZHVsZWQgaWYgYW55IG9mIHRoZSBzcGVjaWFsIHByb3BzXG4gIC8vIGNoYW5nZWQuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBVcGRhdGUgdGhlIHdyYXBwZXIgYXJvdW5kIGlucHV0cyAqYWZ0ZXIqIHVwZGF0aW5nIHByb3BzLiBUaGlzIGhhcyB0b1xuICAgICAgLy8gaGFwcGVuIGFmdGVyIGB1cGRhdGVET01Qcm9wZXJ0aWVzYC4gT3RoZXJ3aXNlIEhUTUw1IGlucHV0IHZhbGlkYXRpb25zXG4gICAgICAvLyByYWlzZSB3YXJuaW5ncyBhbmQgcHJldmVudCB0aGUgbmV3IHZhbHVlIGZyb20gYmVpbmcgYXNzaWduZWQuXG4gICAgICB1cGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHVwZGF0ZVdyYXBwZXIkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgLy8gPHNlbGVjdD4gdmFsdWUgdXBkYXRlIG5lZWRzIHRvIG9jY3VyIGFmdGVyIDxvcHRpb24+IGNoaWxkcmVuXG4gICAgICAvLyByZWNvbmNpbGlhdGlvblxuICAgICAgcG9zdFVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BOYW1lKSB7XG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBwcm9wTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKCFwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zc2libGVTdGFuZGFyZE5hbWVzW2xvd2VyQ2FzZWROYW1lXSB8fCBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVyRWxlbWVudCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldikge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWc7XG4gIHZhciBleHRyYUF0dHJpYnV0ZU5hbWVzO1xuXG4gIHtcbiAgICBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2NhbmNlbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2xvc2UnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgIGNhc2UgJ2VtYmVkJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBsb2FkIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGVycm9yIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICBjYXNlICdpbWFnZSc6XG4gICAgY2FzZSAnbGluayc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHJhd1Byb3BzKTtcblxuICB7XG4gICAgZXh0cmFBdHRyaWJ1dGVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IGRvbUVsZW1lbnQuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVzW19pXS5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdjaGVja2VkJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzZWxlY3RlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IHVzZSB0aGUgb3JpZ2luYWwgbmFtZS5cbiAgICAgICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMDY3Ni5cbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVzW19pXS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdXBkYXRlUGF5bG9hZCA9IG51bGw7XG5cbiAgZm9yICh2YXIgcHJvcEtleSBpbiByYXdQcm9wcykge1xuICAgIGlmICghcmF3UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXh0UHJvcCA9IHJhd1Byb3BzW3Byb3BLZXldO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICAvLyBGb3IgdGV4dCBjb250ZW50IGNoaWxkcmVuIHdlIGNvbXBhcmUgYWdhaW5zdCB0ZXh0Q29udGVudC4gVGhpc1xuICAgICAgLy8gbWlnaHQgbWF0Y2ggYWRkaXRpb25hbCBIVE1MIHRoYXQgaXMgaGlkZGVuIHdoZW4gd2UgcmVhZCBpdCB1c2luZ1xuICAgICAgLy8gdGV4dENvbnRlbnQuIEUuZy4gXCJmb29cIiB3aWxsIG1hdGNoIFwiZjxzcGFuPm9vPC9zcGFuPlwiIGJ1dCB0aGF0IHN0aWxsXG4gICAgICAvLyBzYXRpc2ZpZXMgb3VyIHJlcXVpcmVtZW50LiBPdXIgcmVxdWlyZW1lbnQgaXMgbm90IHRvIHByb2R1Y2UgcGVyZmVjdFxuICAgICAgLy8gSFRNTCBhbmQgYXR0cmlidXRlcy4gSWRlYWxseSB3ZSBzaG91bGQgcHJlc2VydmUgc3RydWN0dXJlIGJ1dCBpdCdzXG4gICAgICAvLyBvayBub3QgdG8gaWYgdGhlIHZpc2libGUgY29udGVudCBpcyBzdGlsbCBlbm91Z2ggdG8gaW5kaWNhdGUgd2hhdFxuICAgICAgLy8gZXZlbiBsaXN0ZW5lcnMgdGhlc2Ugbm9kZXMgbWlnaHQgYmUgd2lyZWQgdXAgdG8uXG4gICAgICAvLyBUT0RPOiBXYXJuIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBhIHNpbmdsZSB0ZXh0Tm9kZSBhcyBhIGNoaWxkLlxuICAgICAgLy8gVE9ETzogU2hvdWxkIHdlIHVzZSBkb21FbGVtZW50LmZpcnN0Q2hpbGQubm9kZVZhbHVlIHRvIGNvbXBhcmU/XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudC50ZXh0Q29udGVudCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3AsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSAnJyArIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCAnJyArIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2hvdWxkV2FybkRldiAmJiB0cnVlICYmIC8vIENvbnZpbmNlIEZsb3cgd2UndmUgY2FsY3VsYXRlZCBpdCAoaXQncyBERVYtb25seSBpbiB0aGlzIG1ldGhvZC4pXG4gICAgdHlwZW9mIGlzQ3VzdG9tQ29tcG9uZW50VGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHByb3BlcnRpZXMgY29ycmVzcG9uZCB0byB0aGVpciBleHBlY3RlZCB2YWx1ZXMuXG4gICAgICB2YXIgc2VydmVyVmFsdWUgPSB2b2lkIDA7XG4gICAgICB2YXIgcHJvcGVydHlJbmZvID0gaXNDdXN0b21Db21wb25lbnRUYWcgJiYgZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCA/IG51bGwgOiBnZXRQcm9wZXJ0eUluZm8ocHJvcEtleSk7XG5cbiAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gPT09IHRydWUpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HIHx8IC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICBwcm9wS2V5ID09PSAndmFsdWUnIHx8IHByb3BLZXkgPT09ICdjaGVja2VkJyB8fCBwcm9wS2V5ID09PSAnc2VsZWN0ZWQnKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICAgIHZhciBzZXJ2ZXJIVE1MID0gZG9tRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZEhUTUwgIT09IHNlcnZlckhUTUwpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJIVE1MLCBleHBlY3RlZEhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuXG4gICAgICAgIGlmIChjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkU3R5bGUgPSBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMobmV4dFByb3ApO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRTdHlsZSAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgZXhwZWN0ZWRTdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnICYmICFlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0KSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRJZ25vcmVBdHRyaWJ1dGUocHJvcEtleSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgJiYgIXNob3VsZFJlbW92ZUF0dHJpYnV0ZShwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICAgICAgdmFyIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIG93bk5hbWVzcGFjZSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0YWcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvd25OYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgc3RhbmRhcmROYW1lID0gZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUocHJvcEtleSk7XG5cbiAgICAgICAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG51bGwgJiYgc3RhbmRhcmROYW1lICE9PSBwcm9wS2V5KSB7XG4gICAgICAgICAgICAgIC8vIElmIGFuIFNWRyBwcm9wIGlzIHN1cHBsaWVkIHdpdGggYmFkIGNhc2luZywgaXQgd2lsbFxuICAgICAgICAgICAgICAvLyBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkIGZyb20gSFRNTCwgYnV0IHdpbGwgcHJvZHVjZSBhIG1pc21hdGNoXG4gICAgICAgICAgICAgIC8vIChhbmQgd291bGQgYmUgaW5jb3JyZWN0bHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCkuXG4gICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGFscmVhZHkgd2FybiBhYm91dCBiYWQgY2FzaW5nIGVsc2V3aGVyZS5cbiAgICAgICAgICAgICAgLy8gU28gd2UnbGwgc2tpcCB0aGUgbWlzbGVhZGluZyBleHRyYSBtaXNtYXRjaCB3YXJuaW5nIGluIHRoaXMgY2FzZS5cbiAgICAgICAgICAgICAgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gdHJ1ZTsgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuXG4gICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHN0YW5kYXJkTmFtZSk7XG4gICAgICAgICAgICB9IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuXG4gICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkb250V2FybkN1c3RvbUVsZW1lbnQgPSBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ICA7XG5cbiAgICAgICAgaWYgKCFkb250V2FybkN1c3RvbUVsZW1lbnQgJiYgbmV4dFByb3AgIT09IHNlcnZlclZhbHVlICYmICFpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoc2hvdWxkV2FybkRldikge1xuICAgICAgaWYgKCAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLnNpemUgPiAwICYmIHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMoZXh0cmFBdHRyaWJ1dGVOYW1lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyKGRvbUVsZW1lbnQsIHJhd1Byb3BzLCB0cnVlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAvLyBGb3IgaW5wdXQgYW5kIHRleHRhcmVhIHdlIGN1cnJlbnQgYWx3YXlzIHNldCB0aGUgdmFsdWUgcHJvcGVydHkgYXRcbiAgICAgIC8vIHBvc3QgbW91bnQgdG8gZm9yY2UgaXQgdG8gZGl2ZXJnZSBmcm9tIGF0dHJpYnV0ZXMuIEhvd2V2ZXIsIGZvclxuICAgICAgLy8gb3B0aW9uIGFuZCBzZWxlY3Qgd2UgZG9uJ3QgcXVpdGUgZG8gdGhlIHNhbWUgdGhpbmcgYW5kIHNlbGVjdFxuICAgICAgLy8gaXMgbm90IHJlc2lsaWVudCB0byB0aGUgRE9NIHN0YXRlIGNoYW5naW5nIHNvIHdlIGRvbid0IGRvIHRoYXQgaGVyZS5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIG5vdCBkb2luZyB0aGlzIGZvciBpbnB1dCBhbmQgdGV4dGFyZWEuXG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHJhd1Byb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59XG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRUZXh0KHRleHROb2RlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHZhciBpc0RpZmZlcmVudCA9IHRleHROb2RlLm5vZGVWYWx1ZSAhPT0gdGV4dDtcbiAgcmV0dXJuIGlzRGlmZmVyZW50O1xufVxuZnVuY3Rpb24gd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnROb2RlLCBjaGlsZCkge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSA8JXM+IGluIDwlcz4uJywgY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnROb2RlLCBjaGlsZCkge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gdGhlIHRleHQgbm9kZSBcIiVzXCIgaW4gPCVzPi4nLCBjaGlsZC5ub2RlVmFsdWUsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnROb2RlLCB0YWcsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIDwlcz4gaW4gPCVzPi4nLCB0YWcsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KSB7XG4gIHtcbiAgICBpZiAodGV4dCA9PT0gJycpIHtcbiAgICAgIC8vIFdlIGV4cGVjdCB0byBpbnNlcnQgZW1wdHkgdGV4dCBub2RlcyBzaW5jZSB0aGV5J3JlIG5vdCByZXByZXNlbnRlZCBpblxuICAgICAgLy8gdGhlIEhUTUwuXG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBzcGVjaWFsIGNhc2UgaWYgd2UgY2FuIGp1c3QgYXZvaWQgaW5zZXJ0aW5nIGVtcHR5XG4gICAgICAvLyB0ZXh0IG5vZGVzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgdGV4dCBub2RlIGZvciBcIiVzXCIgaW4gPCVzPi4nLCB0ZXh0LCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMoZG9tRWxlbWVudCwgdGFnLCBwcm9wcykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuICB9XG59XG5cbnZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyBUaGlzIHZhbGlkYXRpb24gY29kZSB3YXMgd3JpdHRlbiBiYXNlZCBvbiB0aGUgSFRNTDUgcGFyc2luZyBzcGVjOlxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuICAvL1xuICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGNhdGNoIGFsbCBpbnZhbGlkIG5lc3RpbmcsIG5vciBkb2VzIGl0IHRyeSB0byAoYXMgaXQnc1xuICAvLyBub3QgY2xlYXIgd2hhdCBwcmFjdGljYWwgYmVuZWZpdCBkb2luZyBzbyBwcm92aWRlcyk7IGluc3RlYWQsIHdlIHdhcm4gb25seVxuICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciB3aWxsIGdpdmUgYSBwYXJzZSB0cmVlIGRpZmZlcmluZyBmcm9tIHdoYXQgUmVhY3RcbiAgLy8gaW50ZW5kZWQuIEZvciBleGFtcGxlLCA8Yj48ZGl2PjwvZGl2PjwvYj4gaXMgaW52YWxpZCBidXQgd2UgZG9uJ3Qgd2FyblxuICAvLyBiZWNhdXNlIGl0IHN0aWxsIHBhcnNlcyBjb3JyZWN0bHk7IHdlIGRvIHdhcm4gZm9yIG90aGVyIGNhc2VzIGxpa2UgbmVzdGVkXG4gIC8vIDxwPiB0YWdzIHdoZXJlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBlbGVtZW50IGltcGxpY2l0bHkgY2xvc2VzIHRoZVxuICAvLyBmaXJzdCwgY2F1c2luZyBhIGNvbmZ1c2luZyBtZXNzLlxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNzcGVjaWFsXG4gIHZhciBzcGVjaWFsVGFncyA9IFsnYWRkcmVzcycsICdhcHBsZXQnLCAnYXJlYScsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2Jhc2UnLCAnYmFzZWZvbnQnLCAnYmdzb3VuZCcsICdibG9ja3F1b3RlJywgJ2JvZHknLCAnYnInLCAnYnV0dG9uJywgJ2NhcHRpb24nLCAnY2VudGVyJywgJ2NvbCcsICdjb2xncm91cCcsICdkZCcsICdkZXRhaWxzJywgJ2RpcicsICdkaXYnLCAnZGwnLCAnZHQnLCAnZW1iZWQnLCAnZmllbGRzZXQnLCAnZmlnY2FwdGlvbicsICdmaWd1cmUnLCAnZm9vdGVyJywgJ2Zvcm0nLCAnZnJhbWUnLCAnZnJhbWVzZXQnLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnaGVhZCcsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJywgJ2h0bWwnLCAnaWZyYW1lJywgJ2ltZycsICdpbnB1dCcsICdpc2luZGV4JywgJ2xpJywgJ2xpbmsnLCAnbGlzdGluZycsICdtYWluJywgJ21hcnF1ZWUnLCAnbWVudScsICdtZW51aXRlbScsICdtZXRhJywgJ25hdicsICdub2VtYmVkJywgJ25vZnJhbWVzJywgJ25vc2NyaXB0JywgJ29iamVjdCcsICdvbCcsICdwJywgJ3BhcmFtJywgJ3BsYWludGV4dCcsICdwcmUnLCAnc2NyaXB0JywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NvdXJjZScsICdzdHlsZScsICdzdW1tYXJ5JywgJ3RhYmxlJywgJ3Rib2R5JywgJ3RkJywgJ3RlbXBsYXRlJywgJ3RleHRhcmVhJywgJ3Rmb290JywgJ3RoJywgJ3RoZWFkJywgJ3RpdGxlJywgJ3RyJywgJ3RyYWNrJywgJ3VsJywgJ3dicicsICd4bXAnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcblxuICB2YXIgaW5TY29wZVRhZ3MgPSBbJ2FwcGxldCcsICdjYXB0aW9uJywgJ2h0bWwnLCAndGFibGUnLCAndGQnLCAndGgnLCAnbWFycXVlZScsICdvYmplY3QnLCAndGVtcGxhdGUnLCAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNodG1sLWludGVncmF0aW9uLXBvaW50XG4gIC8vIFRPRE86IERpc3Rpbmd1aXNoIGJ5IG5hbWVzcGFjZSBoZXJlIC0tIGZvciA8dGl0bGU+LCBpbmNsdWRpbmcgaXQgaGVyZVxuICAvLyBlcnJzIG9uIHRoZSBzaWRlIG9mIGZld2VyIHdhcm5pbmdzXG4gICdmb3JlaWduT2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tYnV0dG9uLXNjb3BlXG5cbiAgdmFyIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbJ2J1dHRvbiddKTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjZ2VuZXJhdGUtaW1wbGllZC1lbmQtdGFnc1xuXG4gIHZhciBpbXBsaWVkRW5kVGFncyA9IFsnZGQnLCAnZHQnLCAnbGknLCAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3AnLCAncnAnLCAncnQnXTtcbiAgdmFyIGVtcHR5QW5jZXN0b3JJbmZvID0ge1xuICAgIGN1cnJlbnQ6IG51bGwsXG4gICAgZm9ybVRhZzogbnVsbCxcbiAgICBhVGFnSW5TY29wZTogbnVsbCxcbiAgICBidXR0b25UYWdJblNjb3BlOiBudWxsLFxuICAgIG5vYnJUYWdJblNjb3BlOiBudWxsLFxuICAgIHBUYWdJbkJ1dHRvblNjb3BlOiBudWxsLFxuICAgIGxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwsXG4gICAgZGxJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGxcbiAgfTtcblxuICB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKG9sZEluZm8sIHRhZykge1xuICAgIHZhciBhbmNlc3RvckluZm8gPSBhc3NpZ24oe30sIG9sZEluZm8gfHwgZW1wdHlBbmNlc3RvckluZm8pO1xuXG4gICAgdmFyIGluZm8gPSB7XG4gICAgICB0YWc6IHRhZ1xuICAgIH07XG5cbiAgICBpZiAoaW5TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGJ1dHRvblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBudWxsO1xuICAgIH0gLy8gU2VlIHJ1bGVzIGZvciAnbGknLCAnZGQnLCAnZHQnIHN0YXJ0IHRhZ3MgaW5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG5cblxuICAgIGlmIChzcGVjaWFsVGFncy5pbmRleE9mKHRhZykgIT09IC0xICYmIHRhZyAhPT0gJ2FkZHJlc3MnICYmIHRhZyAhPT0gJ2RpdicgJiYgdGFnICE9PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgfVxuXG4gICAgYW5jZXN0b3JJbmZvLmN1cnJlbnQgPSBpbmZvO1xuXG4gICAgaWYgKHRhZyA9PT0gJ2Zvcm0nKSB7XG4gICAgICBhbmNlc3RvckluZm8uZm9ybVRhZyA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2EnKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdidXR0b24nKSB7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ25vYnInKSB7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbGknKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2RkJyB8fCB0YWcgPT09ICdkdCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9ySW5mbztcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cblxuXG4gIHZhciBpc1RhZ1ZhbGlkV2l0aFBhcmVudCA9IGZ1bmN0aW9uICh0YWcsIHBhcmVudFRhZykge1xuICAgIC8vIEZpcnN0LCBsZXQncyBjaGVjayBpZiB3ZSdyZSBpbiBhbiB1bnVzdWFsIHBhcnNpbmcgbW9kZS4uLlxuICAgIHN3aXRjaCAocGFyZW50VGFnKSB7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5zZWxlY3RcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJ29wdGdyb3VwJyB8fCB0YWcgPT09ICcjdGV4dCc7XG5cbiAgICAgIGNhc2UgJ29wdGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcsIHNlZWluZyBhbiA8b3B0aW9uPiBkb2Vzbid0IG1lYW4gd2UncmUgaW4gYSA8c2VsZWN0PlxuICAgICAgLy8gYnV0XG5cbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50ZFxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY2FwdGlvblxuICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvciBzaW5jZSB0aGVzZSBydWxlcyBmYWxsIGJhY2sgdG8gXCJpbiBib2R5XCIgbW9kZSBmb3JcbiAgICAgIC8vIGFsbCBleGNlcHQgc3BlY2lhbCB0YWJsZSBub2RlcyB3aGljaCBjYXVzZSBiYWQgcGFyc2luZyBiZWhhdmlvciBhbnl3YXkuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50clxuXG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0aCcgfHwgdGFnID09PSAndGQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRib2R5XG5cbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RyJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jb2xncm91cFxuXG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjb2wnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRhYmxlXG5cbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NhcHRpb24nIHx8IHRhZyA9PT0gJ2NvbGdyb3VwJyB8fCB0YWcgPT09ICd0Ym9keScgfHwgdGFnID09PSAndGZvb3QnIHx8IHRhZyA9PT0gJ3RoZWFkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5oZWFkXG5cbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnYmFzZScgfHwgdGFnID09PSAnYmFzZWZvbnQnIHx8IHRhZyA9PT0gJ2Jnc291bmQnIHx8IHRhZyA9PT0gJ2xpbmsnIHx8IHRhZyA9PT0gJ21ldGEnIHx8IHRhZyA9PT0gJ3RpdGxlJyB8fCB0YWcgPT09ICdub3NjcmlwdCcgfHwgdGFnID09PSAnbm9mcmFtZXMnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlbWFudGljcy5odG1sI3RoZS1odG1sLWVsZW1lbnRcblxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdoZWFkJyB8fCB0YWcgPT09ICdib2R5JyB8fCB0YWcgPT09ICdmcmFtZXNldCc7XG5cbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2ZyYW1lJztcblxuICAgICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2h0bWwnO1xuICAgIH0gLy8gUHJvYmFibHkgaW4gdGhlIFwiaW4gYm9keVwiIHBhcnNpbmcgbW9kZSwgc28gd2Ugb3V0bGF3IG9ubHkgdGFnIGNvbWJvc1xuICAgIC8vIHdoZXJlIHRoZSBwYXJzaW5nIHJ1bGVzIGNhdXNlIGltcGxpY2l0IG9wZW5zIG9yIGNsb3NlcyB0byBiZSBhZGRlZC5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG5cblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgIT09ICdoMScgJiYgcGFyZW50VGFnICE9PSAnaDInICYmIHBhcmVudFRhZyAhPT0gJ2gzJyAmJiBwYXJlbnRUYWcgIT09ICdoNCcgJiYgcGFyZW50VGFnICE9PSAnaDUnICYmIHBhcmVudFRhZyAhPT0gJ2g2JztcblxuICAgICAgY2FzZSAncnAnOlxuICAgICAgY2FzZSAncnQnOlxuICAgICAgICByZXR1cm4gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcpID09PSAtMTtcblxuICAgICAgY2FzZSAnYm9keSc6XG4gICAgICBjYXNlICdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2NvbCc6XG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICBjYXNlICdmcmFtZXNldCc6XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgY2FzZSAndGgnOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndHInOlxuICAgICAgICAvLyBUaGVzZSB0YWdzIGFyZSBvbmx5IHZhbGlkIHdpdGggYSBmZXcgcGFyZW50cyB0aGF0IGhhdmUgc3BlY2lhbCBjaGlsZFxuICAgICAgICAvLyBwYXJzaW5nIHJ1bGVzIC0tIGlmIHdlJ3JlIGRvd24gaGVyZSwgdGhlbiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kXG4gICAgICAgIC8vIHNvIHdlIGFsbG93IGl0IG9ubHkgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBwYXJlbnQgaXMsIGFzIGFsbCBvdGhlclxuICAgICAgICAvLyBjYXNlcyBhcmUgaW52YWxpZC5cbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyA9PSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcgPSBmdW5jdGlvbiAodGFnLCBhbmNlc3RvckluZm8pIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnYWRkcmVzcyc6XG4gICAgICBjYXNlICdhcnRpY2xlJzpcbiAgICAgIGNhc2UgJ2FzaWRlJzpcbiAgICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOlxuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGNhc2UgJ2Rpcic6XG4gICAgICBjYXNlICdkaXYnOlxuICAgICAgY2FzZSAnZGwnOlxuICAgICAgY2FzZSAnZmllbGRzZXQnOlxuICAgICAgY2FzZSAnZmlnY2FwdGlvbic6XG4gICAgICBjYXNlICdmaWd1cmUnOlxuICAgICAgY2FzZSAnZm9vdGVyJzpcbiAgICAgIGNhc2UgJ2hlYWRlcic6XG4gICAgICBjYXNlICdoZ3JvdXAnOlxuICAgICAgY2FzZSAnbWFpbic6XG4gICAgICBjYXNlICdtZW51JzpcbiAgICAgIGNhc2UgJ25hdic6XG4gICAgICBjYXNlICdvbCc6XG4gICAgICBjYXNlICdwJzpcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxuICAgICAgY2FzZSAnc3VtbWFyeSc6XG4gICAgICBjYXNlICd1bCc6XG4gICAgICBjYXNlICdwcmUnOlxuICAgICAgY2FzZSAnbGlzdGluZyc6XG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICBjYXNlICdocic6XG4gICAgICBjYXNlICd4bXAnOlxuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5mb3JtVGFnIHx8IGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnbGknOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2RkJzpcbiAgICAgIGNhc2UgJ2R0JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnYnV0dG9uJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdhJzpcbiAgICAgICAgLy8gU3BlYyBzYXlzIHNvbWV0aGluZyBhYm91dCBzdG9yaW5nIGEgbGlzdCBvZiBtYXJrZXJzLCBidXQgaXQgc291bmRzXG4gICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhpcyBjaGVjay5cbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnbm9icic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgdmFyIGRpZFdhcm4kMSA9IHt9O1xuXG4gIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uIChjaGlsZFRhZywgY2hpbGRUZXh0LCBhbmNlc3RvckluZm8pIHtcbiAgICBhbmNlc3RvckluZm8gPSBhbmNlc3RvckluZm8gfHwgZW1wdHlBbmNlc3RvckluZm87XG4gICAgdmFyIHBhcmVudEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVudDtcbiAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnRhZztcblxuICAgIGlmIChjaGlsZFRleHQgIT0gbnVsbCkge1xuICAgICAgaWYgKGNoaWxkVGFnICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZzogd2hlbiBjaGlsZFRleHQgaXMgcGFzc2VkLCBjaGlsZFRhZyBzaG91bGQgYmUgbnVsbCcpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZFRhZyA9ICcjdGV4dCc7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWRQYXJlbnQgPSBpc1RhZ1ZhbGlkV2l0aFBhcmVudChjaGlsZFRhZywgcGFyZW50VGFnKSA/IG51bGwgOiBwYXJlbnRJbmZvO1xuICAgIHZhciBpbnZhbGlkQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50ID8gbnVsbCA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7XG4gICAgdmFyIGludmFsaWRQYXJlbnRPckFuY2VzdG9yID0gaW52YWxpZFBhcmVudCB8fCBpbnZhbGlkQW5jZXN0b3I7XG5cbiAgICBpZiAoIWludmFsaWRQYXJlbnRPckFuY2VzdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGFuY2VzdG9yVGFnID0gaW52YWxpZFBhcmVudE9yQW5jZXN0b3IudGFnO1xuICAgIHZhciB3YXJuS2V5ID0gISFpbnZhbGlkUGFyZW50ICsgJ3wnICsgY2hpbGRUYWcgKyAnfCcgKyBhbmNlc3RvclRhZztcblxuICAgIGlmIChkaWRXYXJuJDFbd2FybktleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuJDFbd2FybktleV0gPSB0cnVlO1xuICAgIHZhciB0YWdEaXNwbGF5TmFtZSA9IGNoaWxkVGFnO1xuICAgIHZhciB3aGl0ZXNwYWNlSW5mbyA9ICcnO1xuXG4gICAgaWYgKGNoaWxkVGFnID09PSAnI3RleHQnKSB7XG4gICAgICBpZiAoL1xcUy8udGVzdChjaGlsZFRleHQpKSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1RleHQgbm9kZXMnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnV2hpdGVzcGFjZSB0ZXh0IG5vZGVzJztcbiAgICAgICAgd2hpdGVzcGFjZUluZm8gPSBcIiBNYWtlIHN1cmUgeW91IGRvbid0IGhhdmUgYW55IGV4dHJhIHdoaXRlc3BhY2UgYmV0d2VlbiB0YWdzIG9uIFwiICsgJ2VhY2ggbGluZSBvZiB5b3VyIHNvdXJjZSBjb2RlLic7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJzwnICsgY2hpbGRUYWcgKyAnPic7XG4gICAgfVxuXG4gICAgaWYgKGludmFsaWRQYXJlbnQpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgIGlmIChhbmNlc3RvclRhZyA9PT0gJ3RhYmxlJyAmJiBjaGlsZFRhZyA9PT0gJ3RyJykge1xuICAgICAgICBpbmZvICs9ICcgQWRkIGEgPHRib2R5PiwgPHRoZWFkPiBvciA8dGZvb3Q+IHRvIHlvdXIgY29kZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5ICcgKyAndGhlIGJyb3dzZXIuJztcbiAgICAgIH1cblxuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgY2hpbGQgb2YgPCVzPi4lcyVzJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnLCB3aGl0ZXNwYWNlSW5mbywgaW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGRlc2NlbmRhbnQgb2YgJyArICc8JXM+LicsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZyk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMSA9ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnO1xudmFyIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSAnJCc7XG52YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnO1xudmFyIFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSA9ICckPyc7XG52YXIgU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSA9ICckISc7XG52YXIgU1RZTEUkMSA9ICdzdHlsZSc7XG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG52YXIgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB2YXIgdHlwZTtcbiAgdmFyIG5hbWVzcGFjZTtcbiAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlO1xuXG4gIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICBjYXNlIERPQ1VNRU5UX05PREU6XG4gICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxuICAgICAge1xuICAgICAgICB0eXBlID0gbm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyAnI2RvY3VtZW50JyA6ICcjZnJhZ21lbnQnO1xuICAgICAgICB2YXIgcm9vdCA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIG5hbWVzcGFjZSA9IHJvb3QgPyByb290Lm5hbWVzcGFjZVVSSSA6IGdldENoaWxkTmFtZXNwYWNlKG51bGwsICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJJbnN0YW5jZS5wYXJlbnROb2RlIDogcm9vdENvbnRhaW5lckluc3RhbmNlO1xuICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gY29udGFpbmVyLm5hbWVzcGFjZVVSSSB8fCBudWxsO1xuICAgICAgICB0eXBlID0gY29udGFpbmVyLnRhZ05hbWU7XG4gICAgICAgIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKG93bk5hbWVzcGFjZSwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHZhciB2YWxpZGF0ZWRUYWcgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgdmFsaWRhdGVkVGFnKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkSG9zdENvbnRleHQocGFyZW50SG9zdENvbnRleHQsIHR5cGUsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB7XG4gICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKHBhcmVudEhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZSwgdHlwZSk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykge1xuICBldmVudHNFbmFibGVkID0gaXNFbmFibGVkKCk7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKTtcbiAgdmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcblxuICBzZXRFbmFibGVkKGZhbHNlKTtcbiAgcmV0dXJuIGFjdGl2ZUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcmVzZXRBZnRlckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIHJlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uSW5mb3JtYXRpb24pO1xuICBzZXRFbmFibGVkKGV2ZW50c0VuYWJsZWQpO1xuICBldmVudHNFbmFibGVkID0gbnVsbDtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgLy8gVE9ETzogdGFrZSBuYW1lc3BhY2UgaW50byBhY2NvdW50IHdoZW4gdmFsaWRhdGluZy5cbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcodHlwZSwgbnVsbCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuXG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG5cbiAgdmFyIGRvbUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIHBhcmVudE5hbWVzcGFjZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGRvbUVsZW1lbnQpO1xuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmV0dXJuICEhcHJvcHMuYXV0b0ZvY3VzO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVVwZGF0ZShkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuXG4gICAgaWYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiAhPT0gdHlwZW9mIG9sZFByb3BzLmNoaWxkcmVuICYmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgc3RyaW5nID0gJycgKyBuZXdQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBvd25BbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgc3RyaW5nLCBvd25BbmNlc3RvckluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaWZmUHJvcGVydGllcyhkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpO1xufVxuZnVuY3Rpb24gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICd0ZXh0YXJlYScgfHwgdHlwZSA9PT0gJ25vc2NyaXB0JyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09PSAnb2JqZWN0JyAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwgIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHRJbnN0YW5jZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgdGV4dCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcbiAgfVxuXG4gIHZhciB0ZXh0Tm9kZSA9IGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHRleHROb2RlKTtcbiAgcmV0dXJuIHRleHROb2RlO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkoKSB7XG4gIHZhciBjdXJyZW50RXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG5cbiAgaWYgKGN1cnJlbnRFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgcmV0dXJuIGdldEV2ZW50UHJpb3JpdHkoY3VycmVudEV2ZW50LnR5cGUpO1xufVxuLy8gaWYgYSBjb21wb25lbnQganVzdCBpbXBvcnRzIFJlYWN0RE9NIChlLmcuIGZvciBmaW5kRE9NTm9kZSkuXG4vLyBTb21lIGVudmlyb25tZW50cyBtaWdodCBub3QgaGF2ZSBzZXRUaW1lb3V0IG9yIGNsZWFyVGltZW91dC5cblxudmFyIHNjaGVkdWxlVGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBjYW5jZWxUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBub1RpbWVvdXQgPSAtMTtcbnZhciBsb2NhbFByb21pc2UgPSB0eXBlb2YgUHJvbWlzZSA9PT0gJ2Z1bmN0aW9uJyA/IFByb21pc2UgOiB1bmRlZmluZWQ7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBzY2hlZHVsZU1pY3JvdGFzayA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJyA/IHF1ZXVlTWljcm90YXNrIDogdHlwZW9mIGxvY2FsUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGxvY2FsUHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGhhbmRsZUVycm9ySW5OZXh0VGljayk7XG59IDogc2NoZWR1bGVUaW1lb3V0OyAvLyBUT0RPOiBEZXRlcm1pbmUgdGhlIGJlc3QgZmFsbGJhY2sgaGVyZS5cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3JJbk5leHRUaWNrKGVycm9yKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY29tbWl0TW91bnQoZG9tRWxlbWVudCwgdHlwZSwgbmV3UHJvcHMsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgLy8gRGVzcGl0ZSB0aGUgbmFtaW5nIHRoYXQgbWlnaHQgaW1wbHkgb3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCBvbmx5XG4gIC8vIGZpcmVzIGlmIHRoZXJlIGlzIGFuIGBVcGRhdGVgIGVmZmVjdCBzY2hlZHVsZWQgZHVyaW5nIG1vdW50aW5nLlxuICAvLyBUaGlzIGhhcHBlbnMgaWYgYGZpbmFsaXplSW5pdGlhbENoaWxkcmVuYCByZXR1cm5zIGB0cnVlYCAod2hpY2ggaXRcbiAgLy8gZG9lcyB0byBpbXBsZW1lbnQgdGhlIGBhdXRvRm9jdXNgIGF0dHJpYnV0ZSBvbiB0aGUgY2xpZW50KS4gQnV0XG4gIC8vIHRoZXJlIGFyZSBhbHNvIG90aGVyIGNhc2VzIHdoZW4gdGhpcyBtaWdodCBoYXBwZW4gKHN1Y2ggYXMgcGF0Y2hpbmdcbiAgLy8gdXAgdGV4dCBjb250ZW50IGR1cmluZyBoeWRyYXRpb24gbWlzbWF0Y2gpLiBTbyB3ZSdsbCBjaGVjayB0aGlzIGFnYWluLlxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdidXR0b24nOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGlmIChuZXdQcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgICAgZG9tRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdpbWcnOlxuICAgICAge1xuICAgICAgICBpZiAobmV3UHJvcHMuc3JjKSB7XG4gICAgICAgICAgZG9tRWxlbWVudC5zcmMgPSBuZXdQcm9wcy5zcmM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNvbW1pdFVwZGF0ZShkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIERPTSBub2RlLlxuICB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7IC8vIFVwZGF0ZSB0aGUgcHJvcHMgaGFuZGxlIHNvIHRoYXQgd2Uga25vdyB3aGljaCBwcm9wcyBhcmUgdGhlIG9uZXMgd2l0aFxuICAvLyB3aXRoIGN1cnJlbnQgZXZlbnQgaGFuZGxlcnMuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiByZXNldFRleHRDb250ZW50KGRvbUVsZW1lbnQpIHtcbiAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycpO1xufVxuZnVuY3Rpb24gY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IG5ld1RleHQ7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihjb250YWluZXIsIGNoaWxkKSB7XG4gIHZhciBwYXJlbnROb2RlO1xuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgY29udGFpbmVyKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnROb2RlID0gY29udGFpbmVyO1xuICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICB9IC8vIFRoaXMgY29udGFpbmVyIG1pZ2h0IGJlIHVzZWQgZm9yIGEgcG9ydGFsLlxuICAvLyBJZiBzb21ldGhpbmcgaW5zaWRlIGEgcG9ydGFsIGlzIGNsaWNrZWQsIHRoYXQgY2xpY2sgc2hvdWxkIGJ1YmJsZVxuICAvLyB0aHJvdWdoIHRoZSBSZWFjdCB0cmVlLiBIb3dldmVyLCBvbiBNb2JpbGUgU2FmYXJpIHRoZSBjbGljayB3b3VsZFxuICAvLyBuZXZlciBidWJibGUgdGhyb3VnaCB0aGUgKkRPTSogdHJlZSB1bmxlc3MgYW4gYW5jZXN0b3Igd2l0aCBvbmNsaWNrXG4gIC8vIGV2ZW50IGV4aXN0cy4gU28gd2Ugd291bGRuJ3Qgc2VlIGl0IGFuZCBkaXNwYXRjaCBpdC5cbiAgLy8gVGhpcyBpcyB3aHkgd2UgZW5zdXJlIHRoYXQgbm9uIFJlYWN0IHJvb3QgY29udGFpbmVycyBoYXZlIGlubGluZSBvbmNsaWNrXG4gIC8vIGRlZmluZWQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE5MThcblxuXG4gIHZhciByZWFjdFJvb3RDb250YWluZXIgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcblxuICBpZiAoKHJlYWN0Um9vdENvbnRhaW5lciA9PT0gbnVsbCB8fCByZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZCkgJiYgcGFyZW50Tm9kZS5vbmNsaWNrID09PSBudWxsKSB7XG4gICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChwYXJlbnROb2RlKTtcbiAgfVxufVxuZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKHBhcmVudEluc3RhbmNlLCBjaGlsZCwgYmVmb3JlQ2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG59XG5mdW5jdGlvbiBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShjb250YWluZXIsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcihjb250YWluZXIsIGNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9XG59XG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnkocGFyZW50SW5zdGFuY2UsIHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlOyAvLyBEZWxldGUgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIGRvIHtcbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5vZGUpO1xuXG4gICAgaWYgKG5leHROb2RlICYmIG5leHROb2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbmV4dE5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5leHROb2RlKTsgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG4gICAgICAgICAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9IHdoaWxlIChub2RlKTsgLy8gVE9ETzogV2Fybiwgd2UgZGlkbid0IGZpbmQgdGhlIGVuZCBjb21tZW50IGJvdW5kYXJ5LlxuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cblxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihjb250YWluZXIsIHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lci5wYXJlbnROb2RlLCBzdXNwZW5zZUluc3RhbmNlKTtcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShjb250YWluZXIsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuXG4gIHJldHJ5SWZCbG9ja2VkT24oY29udGFpbmVyKTtcbn1cbmZ1bmN0aW9uIGhpZGVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgYWxsIGVsZW1lbnQgdHlwZXM/IFdoYXQgYWJvdXQgTWF0aE1MPyBTaG91bGQgd2VcbiAgLy8gcGFzcyBob3N0IGNvbnRleHQgdG8gdGhpcyBtZXRob2Q/XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZSA9IGluc3RhbmNlLnN0eWxlO1xuXG4gIGlmICh0eXBlb2Ygc3R5bGUuc2V0UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlKSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSAnJztcbn1cbmZ1bmN0aW9uIHVuaGlkZUluc3RhbmNlKGluc3RhbmNlLCBwcm9wcykge1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGVQcm9wID0gcHJvcHNbU1RZTEUkMV07XG4gIHZhciBkaXNwbGF5ID0gc3R5bGVQcm9wICE9PSB1bmRlZmluZWQgJiYgc3R5bGVQcm9wICE9PSBudWxsICYmIHN0eWxlUHJvcC5oYXNPd25Qcm9wZXJ0eSgnZGlzcGxheScpID8gc3R5bGVQcm9wLmRpc3BsYXkgOiBudWxsO1xuICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZSgnZGlzcGxheScsIGRpc3BsYXkpO1xufVxuZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGNsZWFyQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjb250YWluZXIudGV4dENvbnRlbnQgPSAnJztcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICBpZiAoY29udGFpbmVyLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYW4gZWxlbWVudCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShpbnN0YW5jZSwgdGV4dCkge1xuICBpZiAodGV4dCA9PT0gJycgfHwgaW5zdGFuY2Uubm9kZVR5cGUgIT09IFRFWFRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgdGV4dCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAvLyBFbXB0eSBzdHJpbmdzIGFyZSBub3QgcGFyc2VkIGJ5IEhUTUwgc28gdGhlcmUgd29uJ3QgYmUgYSBjb3JyZWN0IG1hdGNoIGhlcmUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHN1c3BlbnNlIG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEE7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQTtcbn1cbmZ1bmN0aW9uIGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhpbnN0YW5jZSkge1xuICB2YXIgZGF0YXNldCA9IGluc3RhbmNlLm5leHRTaWJsaW5nICYmIGluc3RhbmNlLm5leHRTaWJsaW5nLmRhdGFzZXQ7XG4gIHZhciBkaWdlc3QsIG1lc3NhZ2UsIHN0YWNrO1xuXG4gIGlmIChkYXRhc2V0KSB7XG4gICAgZGlnZXN0ID0gZGF0YXNldC5kZ3N0O1xuXG4gICAge1xuICAgICAgbWVzc2FnZSA9IGRhdGFzZXQubXNnO1xuICAgICAgc3RhY2sgPSBkYXRhc2V0LnN0Y2s7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgZGlnZXN0OiBkaWdlc3QsXG4gICAgICBzdGFjazogc3RhY2tcbiAgICB9O1xuICB9IC8vIGxldCB2YWx1ZSA9IHttZXNzYWdlOiB1bmRlZmluZWQsIGhhc2g6IHVuZGVmaW5lZH07XG4gIC8vIGNvbnN0IG5leHRTaWJsaW5nID0gaW5zdGFuY2UubmV4dFNpYmxpbmc7XG4gIC8vIGlmIChuZXh0U2libGluZykge1xuICAvLyAgIGNvbnN0IGRhdGFzZXQgPSAoKG5leHRTaWJsaW5nOiBhbnkpOiBIVE1MVGVtcGxhdGVFbGVtZW50KS5kYXRhc2V0O1xuICAvLyAgIHZhbHVlLm1lc3NhZ2UgPSBkYXRhc2V0Lm1zZztcbiAgLy8gICB2YWx1ZS5oYXNoID0gZGF0YXNldC5oYXNoO1xuICAvLyAgIGlmICh0cnVlKSB7XG4gIC8vICAgICB2YWx1ZS5zdGFjayA9IGRhdGFzZXQuc3RhY2s7XG4gIC8vICAgfVxuICAvLyB9XG4gIC8vIHJldHVybiB2YWx1ZTtcblxufVxuZnVuY3Rpb24gcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoaW5zdGFuY2UsIGNhbGxiYWNrKSB7XG4gIGluc3RhbmNlLl9yZWFjdFJldHJ5ID0gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlKG5vZGUpIHtcbiAgLy8gU2tpcCBub24taHlkcmF0YWJsZSBub2Rlcy5cbiAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuXG4gICAgaWYgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBub2RlRGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlRGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLmZpcnN0Q2hpbGQpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShwYXJlbnRDb250YWluZXIuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLm5leHRTaWJsaW5nKTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgaW5zdGFuY2UpOyAvLyBUT0RPOiBQb3NzaWJseSBkZWZlciB0aGlzIHVudGlsIHRoZSBjb21taXQgcGhhc2Ugd2hlcmUgYWxsIHRoZSBldmVudHNcbiAgLy8gZ2V0IGF0dGFjaGVkLlxuXG4gIHVwZGF0ZUZpYmVyUHJvcHMoaW5zdGFuY2UsIHByb3BzKTtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9IC8vIFRPRE86IFRlbXBvcmFyeSBoYWNrIHRvIGNoZWNrIGlmIHdlJ3JlIGluIGEgY29uY3VycmVudCByb290LiBXZSBjYW4gZGVsZXRlXG4gIC8vIHdoZW4gdGhlIGxlZ2FjeSByb290IEFQSSBpcyByZW1vdmVkLlxuXG5cbiAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVySW5zdGFuY2UsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dEluc3RhbmNlKTsgLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cbiAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRUZXh0KHRleHRJbnN0YW5jZSwgdGV4dCk7XG59XG5mdW5jdGlvbiBoeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfSAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG5cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gUmV0dXJucyB0aGUgU3VzcGVuc2VJbnN0YW5jZSBpZiB0aGlzIG5vZGUgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuLy8gU3VzcGVuc2VJbnN0YW5jZS4gSS5lLiBpZiBpdHMgcHJldmlvdXMgc2libGluZyBpcyBhIENvbW1lbnQgd2l0aFxuLy8gU1VTUEVOU0VfeF9TVEFSVF9EQVRBLiBPdGhlcndpc2UsIG51bGwuXG5cbmZ1bmN0aW9uIGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2UodGFyZ2V0SW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRDb250YWluZXIoY29udGFpbmVyKSB7XG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVW5oeWRyYXRlZFRhaWxJbnN0YW5jZXMocGFyZW50VHlwZSkge1xuICByZXR1cm4gcGFyZW50VHlwZSAhPT0gJ2hlYWQnICYmIHBhcmVudFR5cGUgIT09ICdib2R5Jztcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICBjaGVja0ZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLm5vZGVWYWx1ZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBkaWROb3RNYXRjaEh5ZHJhdGVkVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIGlmIChwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgIHZhciBzaG91bGRXYXJuRGV2ID0gdHJ1ZTtcbiAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLm5vZGVWYWx1ZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcblxuICAgIGlmIChwYXJlbnROb2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnROb2RlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Q29udGFpbmVyLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0ZXh0KSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnROb2RlLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCB0ZXh0KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudEluc3RhbmNlLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRJbnN0YW5jZSwgdGV4dCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvckh5ZHJhdGluZ0NvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAge1xuICAgIC8vIFRPRE86IFRoaXMgZ2V0cyBsb2dnZWQgYnkgb25SZWNvdmVyYWJsZUVycm9yLCB0b28sIHNvIHdlIHNob3VsZCBiZVxuICAgIC8vIGFibGUgdG8gcmVtb3ZlIGl0LlxuICAgIGVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaHlkcmF0aW9uLiBUaGUgc2VydmVyIEhUTUwgd2FzIHJlcGxhY2VkIHdpdGggY2xpZW50IGNvbnRlbnQgaW4gPCVzPi4nLCBwYXJlbnRDb250YWluZXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVQb3J0YWxNb3VudChwb3J0YWxJbnN0YW5jZSkge1xuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhwb3J0YWxJbnN0YW5jZSk7XG59XG5cbnZhciByYW5kb21LZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcbnZhciBpbnRlcm5hbEluc3RhbmNlS2V5ID0gJ19fcmVhY3RGaWJlciQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsUHJvcHNLZXkgPSAnX19yZWFjdFByb3BzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleSA9ICdfX3JlYWN0Q29udGFpbmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5ID0gJ19fcmVhY3RFdmVudHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlckxpc3RlbmVyc0tleSA9ICdfX3JlYWN0TGlzdGVuZXJzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXkgPSAnX19yZWFjdEhhbmRsZXMkJyArIHJhbmRvbUtleTtcbmZ1bmN0aW9uIGRldGFjaERlbGV0ZWRJbnN0YW5jZShub2RlKSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb24gaG9zdCBjb21wb25lbnRzLiBJIGRvbid0IHRoaW5rIGFsbCBvZlxuICAvLyB0aGVzZSBmaWVsZHMgYXJlIHJlbGV2YW50LlxuICBkZWxldGUgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxQcm9wc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXldO1xufVxuZnVuY3Rpb24gcHJlY2FjaGVGaWJlck5vZGUoaG9zdEluc3QsIG5vZGUpIHtcbiAgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGhvc3RJbnN0O1xufVxuZnVuY3Rpb24gbWFya0NvbnRhaW5lckFzUm9vdChob3N0Um9vdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gaG9zdFJvb3Q7XG59XG5mdW5jdGlvbiB1bm1hcmtDb250YWluZXJBc1Jvb3Qobm9kZSkge1xuICBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzQ29udGFpbmVyTWFya2VkQXNSb290KG5vZGUpIHtcbiAgcmV0dXJuICEhbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XTtcbn0gLy8gR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBjbG9zZXN0IEhvc3RDb21wb25lbnQgb3IgSG9zdFRleHQgZmliZXIgYW5jZXN0b3IuXG4vLyBJZiB0aGUgdGFyZ2V0IG5vZGUgaXMgcGFydCBvZiBhIGh5ZHJhdGVkIG9yIG5vdCB5ZXQgcmVuZGVyZWQgc3VidHJlZSwgdGhlblxuLy8gdGhpcyBtYXkgYWxzbyByZXR1cm4gYSBTdXNwZW5zZUNvbXBvbmVudCBvciBIb3N0Um9vdCB0byBpbmRpY2F0ZSB0aGF0LlxuLy8gQ29uY2VwdHVhbGx5IHRoZSBIb3N0Um9vdCBmaWJlciBpcyBhIGNoaWxkIG9mIHRoZSBDb250YWluZXIgbm9kZS4gU28gaWYgeW91XG4vLyBwYXNzIHRoZSBDb250YWluZXIgbm9kZSBhcyB0aGUgdGFyZ2V0Tm9kZSwgeW91IHdpbGwgbm90IGFjdHVhbGx5IGdldCB0aGVcbi8vIEhvc3RSb290IGJhY2suIFRvIGdldCB0byB0aGUgSG9zdFJvb3QsIHlvdSBuZWVkIHRvIHBhc3MgYSBjaGlsZCBvZiBpdC5cbi8vIFRoZSBzYW1lIHRoaW5nIGFwcGxpZXMgdG8gU3VzcGVuc2UgYm91bmRhcmllcy5cblxuZnVuY3Rpb24gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0Tm9kZSkge1xuICB2YXIgdGFyZ2V0SW5zdCA9IHRhcmdldE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgaWYgKHRhcmdldEluc3QpIHtcbiAgICAvLyBEb24ndCByZXR1cm4gSG9zdFJvb3Qgb3IgU3VzcGVuc2VDb21wb25lbnQgaGVyZS5cbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfSAvLyBJZiB0aGUgZGlyZWN0IGV2ZW50IHRhcmdldCBpc24ndCBhIFJlYWN0IG93bmVkIERPTSBub2RlLCB3ZSBuZWVkIHRvIGxvb2tcbiAgLy8gdG8gc2VlIGlmIG9uZSBvZiBpdHMgcGFyZW50cyBpcyBhIFJlYWN0IG93bmVkIERPTSBub2RlLlxuXG5cbiAgdmFyIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG5cbiAgd2hpbGUgKHBhcmVudE5vZGUpIHtcbiAgICAvLyBXZSdsbCBjaGVjayBpZiB0aGlzIGlzIGEgY29udGFpbmVyIHJvb3QgdGhhdCBjb3VsZCBpbmNsdWRlXG4gICAgLy8gUmVhY3Qgbm9kZXMgaW4gdGhlIGZ1dHVyZS4gV2UgbmVlZCB0byBjaGVjayB0aGlzIGZpcnN0IGJlY2F1c2VcbiAgICAvLyBpZiB3ZSdyZSBhIGNoaWxkIG9mIGEgZGVoeWRyYXRlZCBjb250YWluZXIsIHdlIG5lZWQgdG8gZmlyc3RcbiAgICAvLyBmaW5kIHRoYXQgaW5uZXIgY29udGFpbmVyIGJlZm9yZSBtb3Zpbmcgb24gdG8gZmluZGluZyB0aGUgcGFyZW50XG4gICAgLy8gaW5zdGFuY2UuIE5vdGUgdGhhdCB3ZSBkb24ndCBjaGVjayB0aGlzIGZpZWxkIG9uICB0aGUgdGFyZ2V0Tm9kZVxuICAgIC8vIGl0c2VsZiBiZWNhdXNlIHRoZSBmaWJlcnMgYXJlIGNvbmNlcHR1YWxseSBiZXR3ZWVuIHRoZSBjb250YWluZXJcbiAgICAvLyBub2RlIGFuZCB0aGUgZmlyc3QgY2hpbGQuIEl0IGlzbid0IHN1cnJvdW5kaW5nIHRoZSBjb250YWluZXIgbm9kZS5cbiAgICAvLyBJZiBpdCdzIG5vdCBhIGNvbnRhaW5lciwgd2UgY2hlY2sgaWYgaXQncyBhbiBpbnN0YW5jZS5cbiAgICB0YXJnZXRJbnN0ID0gcGFyZW50Tm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSB8fCBwYXJlbnROb2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gICAgaWYgKHRhcmdldEluc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgd2Fzbid0IHRoZSBkaXJlY3QgdGFyZ2V0IG9mIHRoZSBldmVudCwgd2UgbWlnaHQgaGF2ZVxuICAgICAgLy8gc3RlcHBlZCBwYXN0IGRlaHlkcmF0ZWQgRE9NIG5vZGVzIHRvIGdldCBoZXJlLiBIb3dldmVyIHRoZXkgY291bGRcbiAgICAgIC8vIGFsc28gaGF2ZSBiZWVuIG5vbi1SZWFjdCBub2Rlcy4gV2UgbmVlZCB0byBhbnN3ZXIgd2hpY2ggb25lLlxuICAgICAgLy8gSWYgd2UgdGhlIGluc3RhbmNlIGRvZXNuJ3QgaGF2ZSBhbnkgY2hpbGRyZW4sIHRoZW4gdGhlcmUgY2FuJ3QgYmVcbiAgICAgIC8vIGEgbmVzdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IHdpdGhpbiBpdC4gU28gd2UgY2FuIHVzZSB0aGlzIGFzIGEgZmFzdFxuICAgICAgLy8gYmFpbG91dC4gTW9zdCBvZiB0aGUgdGltZSwgd2hlbiBwZW9wbGUgYWRkIG5vbi1SZWFjdCBjaGlsZHJlbiB0b1xuICAgICAgLy8gdGhlIHRyZWUsIGl0IGlzIHVzaW5nIGEgcmVmIHRvIGEgY2hpbGQtbGVzcyBET00gbm9kZS5cbiAgICAgIC8vIE5vcm1hbGx5IHdlJ2Qgb25seSBuZWVkIHRvIGNoZWNrIG9uZSBvZiB0aGUgZmliZXJzIGJlY2F1c2UgaWYgaXRcbiAgICAgIC8vIGhhcyBldmVyIGdvbmUgZnJvbSBoYXZpbmcgY2hpbGRyZW4gdG8gZGVsZXRpbmcgdGhlbSBvciB2aWNlIHZlcnNhXG4gICAgICAvLyBpdCB3b3VsZCBoYXZlIGRlbGV0ZWQgdGhlIGRlaHlkcmF0ZWQgYm91bmRhcnkgbmVzdGVkIGluc2lkZSBhbHJlYWR5LlxuICAgICAgLy8gSG93ZXZlciwgc2luY2UgdGhlIEhvc3RSb290IHN0YXJ0cyBvdXQgd2l0aCBhbiBhbHRlcm5hdGUgaXQgbWlnaHRcbiAgICAgIC8vIGhhdmUgb25lIG9uIHRoZSBhbHRlcm5hdGUgc28gd2UgbmVlZCB0byBjaGVjayBpbiBjYXNlIHRoaXMgd2FzIGFcbiAgICAgIC8vIHJvb3QuXG4gICAgICB2YXIgYWx0ZXJuYXRlID0gdGFyZ2V0SW5zdC5hbHRlcm5hdGU7XG5cbiAgICAgIGlmICh0YXJnZXRJbnN0LmNoaWxkICE9PSBudWxsIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIG5vZGUgdGhhdCBza2lwcGVkIHBhc3QgaXNcbiAgICAgICAgLy8gbmVzdGVkIHdpdGhpbiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgYW5kIGlmIHNvLCB3aGljaCBvbmUuXG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXROb2RlKTtcblxuICAgICAgICB3aGlsZSAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3VzcGVuc2UgaW5zdGFuY2UuIFRoYXQgbWVhbnMgdGhhdCB3ZSBoYXZlbid0XG4gICAgICAgICAgLy8gaHlkcmF0ZWQgaXQgeWV0LiBFdmVuIHRob3VnaCB3ZSBsZWF2ZSB0aGUgY29tbWVudHMgaW4gdGhlXG4gICAgICAgICAgLy8gRE9NIGFmdGVyIGh5ZHJhdGluZywgYW5kIHRoZXJlIGFyZSBib3VuZGFyaWVzIGluIHRoZSBET01cbiAgICAgICAgICAvLyB0aGF0IGNvdWxkIGFscmVhZHkgYmUgaHlkcmF0ZWQsIHdlIHdvdWxkbid0IGhhdmUgZm91bmQgdGhlbVxuICAgICAgICAgIC8vIHRocm91Z2ggdGhpcyBwYXNzIHNpbmNlIGlmIHRoZSB0YXJnZXQgaXMgaHlkcmF0ZWQgaXQgd291bGRcbiAgICAgICAgICAvLyBoYXZlIGhhZCBhbiBpbnRlcm5hbEluc3RhbmNlS2V5IG9uIGl0LlxuICAgICAgICAgIC8vIExldCdzIGdldCB0aGUgZmliZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBTdXNwZW5zZUNvbXBvbmVudFxuICAgICAgICAgIC8vIGFzIHRoZSBkZWVwZXN0IGluc3RhbmNlLlxuICAgICAgICAgIHZhciB0YXJnZXRTdXNwZW5zZUluc3QgPSBzdXNwZW5zZUluc3RhbmNlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gICAgICAgICAgaWYgKHRhcmdldFN1c3BlbnNlSW5zdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFN1c3BlbnNlSW5zdDtcbiAgICAgICAgICB9IC8vIElmIHdlIGRvbid0IGZpbmQgYSBGaWJlciBvbiB0aGUgY29tbWVudCwgaXQgbWlnaHQgYmUgYmVjYXVzZVxuICAgICAgICAgIC8vIHdlIGhhdmVuJ3QgZ290dGVuIHRvIGh5ZHJhdGUgaXQgeWV0LiBUaGVyZSBtaWdodCBzdGlsbCBiZSBhXG4gICAgICAgICAgLy8gcGFyZW50IGJvdW5kYXJ5IHRoYXQgaGFzbid0IGFib3ZlIHRoaXMgb25lIHNvIHdlIG5lZWQgdG8gZmluZFxuICAgICAgICAgIC8vIHRoZSBvdXRlciBtb3N0IHRoYXQgaXMga25vd24uXG5cblxuICAgICAgICAgIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpOyAvLyBJZiB3ZSBkb24ndCBmaW5kIG9uZSwgdGhlbiB0aGF0IHNob3VsZCBtZWFuIHRoYXQgdGhlIHBhcmVudFxuICAgICAgICAgIC8vIGhvc3QgY29tcG9uZW50IGFsc28gaGFzbid0IGh5ZHJhdGVkIHlldC4gV2UgY2FuIHJldHVybiBpdFxuICAgICAgICAgIC8vIGJlbG93IHNpbmNlIGl0IHdpbGwgYmFpbCBvdXQgb24gdGhlIGlzTW91bnRlZCBjaGVjayBsYXRlci5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICB9XG5cbiAgICB0YXJnZXROb2RlID0gcGFyZW50Tm9kZTtcbiAgICBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdpdmVuIGEgRE9NIG5vZGUsIHJldHVybiB0aGUgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50XG4gKiBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgbm9kZSB3YXMgbm90IHJlbmRlcmVkIGJ5IHRoaXMgUmVhY3QuXG4gKi9cblxuZnVuY3Rpb24gZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKSB7XG4gIHZhciBpbnN0ID0gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSB8fCBub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgaWYgKGluc3QudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGluc3QudGFnID09PSBIb3N0VGV4dCB8fCBpbnN0LnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICByZXR1cm4gaW5zdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdpdmVuIGEgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50LCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmdcbiAqIERPTSBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkge1xuICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgLy8gSW4gRmliZXIgdGhpcywgaXMganVzdCB0aGUgc3RhdGUgbm9kZSByaWdodCBub3cuIFdlIGFzc3VtZSBpdCB3aWxsIGJlXG4gICAgLy8gYSBob3N0IGNvbXBvbmVudCBvciBob3N0IHRleHQuXG4gICAgcmV0dXJuIGluc3Quc3RhdGVOb2RlO1xuICB9IC8vIFdpdGhvdXQgdGhpcyBmaXJzdCBpbnZhcmlhbnQsIHBhc3NpbmcgYSBub24tRE9NLWNvbXBvbmVudCB0cmlnZ2VycyB0aGUgbmV4dFxuICAvLyBpbnZhcmlhbnQgZm9yIGEgbWlzc2luZyBwYXJlbnQsIHdoaWNoIGlzIHN1cGVyIGNvbmZ1c2luZy5cblxuXG4gIHRocm93IG5ldyBFcnJvcignZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKTtcbn1cbmZ1bmN0aW9uIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZVtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlRmliZXJQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlW2ludGVybmFsUHJvcHNLZXldID0gcHJvcHM7XG59XG5mdW5jdGlvbiBnZXRFdmVudExpc3RlbmVyU2V0KG5vZGUpIHtcbiAgdmFyIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcblxuICBpZiAoZWxlbWVudExpc3RlbmVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudExpc3RlbmVyU2V0O1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWx1ZVN0YWNrID0gW107XG52YXIgZmliZXJTdGFjaztcblxue1xuICBmaWJlclN0YWNrID0gW107XG59XG5cbnZhciBpbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjcmVhdGVDdXJzb3IoZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgY3VycmVudDogZGVmYXVsdFZhbHVlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBvcChjdXJzb3IsIGZpYmVyKSB7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICB7XG4gICAgICBlcnJvcignVW5leHBlY3RlZCBwb3AuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChmaWJlciAhPT0gZmliZXJTdGFja1tpbmRleF0pIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIEZpYmVyIHBvcHBlZC4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlU3RhY2tbaW5kZXhdO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IG51bGw7XG5cbiAge1xuICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gbnVsbDtcbiAgfVxuXG4gIGluZGV4LS07XG59XG5cbmZ1bmN0aW9uIHB1c2goY3Vyc29yLCB2YWx1ZSwgZmliZXIpIHtcbiAgaW5kZXgrKztcbiAgdmFsdWVTdGFja1tpbmRleF0gPSBjdXJzb3IuY3VycmVudDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBmaWJlcjtcbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWU7XG59XG5cbnZhciB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQ7XG5cbntcbiAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0ID0ge307XG59XG5cbnZhciBlbXB0eUNvbnRleHRPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5Q29udGV4dE9iamVjdCk7XG59IC8vIEEgY3Vyc29yIHRvIHRoZSBjdXJyZW50IG1lcmdlZCBjb250ZXh0IG9iamVjdCBvbiB0aGUgc3RhY2suXG5cblxudmFyIGNvbnRleHRTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihlbXB0eUNvbnRleHRPYmplY3QpOyAvLyBBIGN1cnNvciB0byBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuXG52YXIgZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihmYWxzZSk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGNvbnRleHQgb2JqZWN0IHRoYXQgd2FzIG9uIHRoZSBzdGFjay5cbi8vIFdlIHVzZSB0aGlzIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHBhcmVudCBjb250ZXh0IGFmdGVyIHdlIGhhdmUgYWxyZWFkeVxuLy8gcHVzaGVkIHRoZSBuZXh0IGNvbnRleHQgcHJvdmlkZXIsIGFuZCBub3cgbmVlZCB0byBtZXJnZSB0aGVpciBjb250ZXh0cy5cblxudmFyIHByZXZpb3VzQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuZnVuY3Rpb24gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlcikge1xuICB7XG4gICAgaWYgKGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlciAmJiBpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAvLyBJZiB0aGUgZmliZXIgaXMgYSBjb250ZXh0IHByb3ZpZGVyIGl0c2VsZiwgd2hlbiB3ZSByZWFkIGl0cyBjb250ZXh0XG4gICAgICAvLyB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHB1c2hlZCBpdHMgb3duIGNoaWxkIGNvbnRleHQgb24gdGhlIHN0YWNrLiBBIGNvbnRleHRcbiAgICAgIC8vIHByb3ZpZGVyIHNob3VsZCBub3QgXCJzZWVcIiBpdHMgb3duIGNoaWxkIGNvbnRleHQuIFRoZXJlZm9yZSB3ZSByZWFkIHRoZVxuICAgICAgLy8gcHJldmlvdXMgKHBhcmVudCkgY29udGV4dCBpbnN0ZWFkIGZvciBhIGNvbnRleHQgcHJvdmlkZXIuXG4gICAgICByZXR1cm4gcHJldmlvdXNDb250ZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgbWFza2VkQ29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPSB1bm1hc2tlZENvbnRleHQ7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQgPSBtYXNrZWRDb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSB0eXBlLmNvbnRleHRUeXBlcztcblxuICAgIGlmICghY29udGV4dFR5cGVzKSB7XG4gICAgICByZXR1cm4gZW1wdHlDb250ZXh0T2JqZWN0O1xuICAgIH0gLy8gQXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgdW5tYXNrZWQgY29udGV4dCBoYXMgY2hhbmdlZC5cbiAgICAvLyBGYWlsaW5nIHRvIGRvIHRoaXMgd2lsbCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgY2FsbHMgdG8gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5cbiAgICAvLyBUaGlzIG1heSB0cmlnZ2VyIGluZmluaXRlIGxvb3BzIGlmIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgY2FsbHMgc2V0U3RhdGUuXG5cblxuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID09PSB1bm1hc2tlZENvbnRleHQpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDtcbiAgICB9XG5cbiAgICB2YXIgY29udGV4dCA9IHt9O1xuXG4gICAgZm9yICh2YXIga2V5IGluIGNvbnRleHRUeXBlcykge1xuICAgICAgY29udGV4dFtrZXldID0gdW5tYXNrZWRDb250ZXh0W2tleV07XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjb250ZXh0VHlwZXMsIGNvbnRleHQsICdjb250ZXh0JywgbmFtZSk7XG4gICAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gICAgLy8gQ29udGV4dCBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgY2xhc3MgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBzbyBjaGVjayBmb3IgaW5zdGFuY2UuXG5cblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnRleHRDaGFuZ2VkKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcih0eXBlKSB7XG4gIHtcbiAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB0eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuICAgIHJldHVybiBjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlciwgY29udGV4dCwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICBpZiAoY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGNvbnRleHQgZm91bmQgb24gc3RhY2suICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgdHlwZSwgcGFyZW50Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7IC8vIFRPRE8gKGJ2YXVnaG4pIFJlcGxhY2UgdGhpcyBiZWhhdmlvciB3aXRoIGFuIGludmFyaWFudCgpIGluIHRoZSBmdXR1cmUuXG4gICAgLy8gSXQgaGFzIG9ubHkgYmVlbiBhZGRlZCBpbiBGaWJlciB0byBtYXRjaCB0aGUgKHVuaW50ZW50aW9uYWwpIGJlaGF2aW9yIGluIFN0YWNrLlxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgaWYgKCF3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJyVzLmNoaWxkQ29udGV4dFR5cGVzIGlzIHNwZWNpZmllZCBidXQgdGhlcmUgaXMgbm8gZ2V0Q2hpbGRDb250ZXh0KCkgbWV0aG9kICcgKyAnb24gdGhlIGluc3RhbmNlLiBZb3UgY2FuIGVpdGhlciBkZWZpbmUgZ2V0Q2hpbGRDb250ZXh0KCkgb24gJXMgb3IgcmVtb3ZlICcgKyAnY2hpbGRDb250ZXh0VHlwZXMgZnJvbSBpdC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyZW50Q29udGV4dDtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRDb250ZXh0ID0gaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0KCk7XG5cbiAgICBmb3IgKHZhciBjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dCkge1xuICAgICAgaWYgKCEoY29udGV4dEtleSBpbiBjaGlsZENvbnRleHRUeXBlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bicpICsgXCIuZ2V0Q2hpbGRDb250ZXh0KCk6IGtleSBcXFwiXCIgKyBjb250ZXh0S2V5ICsgXCJcXFwiIGlzIG5vdCBkZWZpbmVkIGluIGNoaWxkQ29udGV4dFR5cGVzLlwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNoaWxkQ29udGV4dFR5cGVzLCBjaGlsZENvbnRleHQsICdjaGlsZCBjb250ZXh0JywgbmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc2lnbih7fSwgcGFyZW50Q29udGV4dCwgY2hpbGRDb250ZXh0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFdlIHB1c2ggdGhlIGNvbnRleHQgYXMgZWFybHkgYXMgcG9zc2libGUgdG8gZW5zdXJlIHN0YWNrIGludGVncml0eS5cbiAgICAvLyBJZiB0aGUgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QgeWV0LCB3ZSB3aWxsIHB1c2ggbnVsbCBhdCBmaXJzdCxcbiAgICAvLyBhbmQgcmVwbGFjZSBpdCBvbiB0aGUgc3RhY2sgbGF0ZXIgd2hlbiBpbnZhbGlkYXRpbmcgdGhlIGNvbnRleHQuXG5cbiAgICB2YXIgbWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCB8fCBlbXB0eUNvbnRleHRPYmplY3Q7IC8vIFJlbWVtYmVyIHRoZSBwYXJlbnQgY29udGV4dCBzbyB3ZSBjYW4gbWVyZ2Ugd2l0aCBpdCBsYXRlci5cbiAgICAvLyBJbmhlcml0IHRoZSBwYXJlbnQncyBkaWQtcGVyZm9ybS13b3JrIHZhbHVlIHRvIGF2b2lkIGluYWR2ZXJ0ZW50bHkgYmxvY2tpbmcgdXBkYXRlcy5cblxuICAgIHByZXZpb3VzQ29udGV4dCA9IGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgdHlwZSwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYW4gaW5zdGFuY2UgYnkgdGhpcyBwb2ludC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmIChkaWRDaGFuZ2UpIHtcbiAgICAgIC8vIE1lcmdlIHBhcmVudCBhbmQgb3duIGNvbnRleHQuXG4gICAgICAvLyBTa2lwIHRoaXMgaWYgd2UncmUgbm90IHVwZGF0aW5nIGR1ZSB0byBzQ1UuXG4gICAgICAvLyBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyaWx5IHJlY29tcHV0aW5nIG1lbW9pemVkIHZhbHVlcy5cbiAgICAgIHZhciBtZXJnZWRDb250ZXh0ID0gcHJvY2Vzc0NoaWxkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdHlwZSwgcHJldmlvdXNDb250ZXh0KTtcbiAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0ID0gbWVyZ2VkQ29udGV4dDsgLy8gUmVwbGFjZSB0aGUgb2xkIChvciBlbXB0eSkgY29udGV4dCB3aXRoIHRoZSBuZXcgb25lLlxuICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRvIHVud2luZCB0aGUgY29udGV4dCBpbiB0aGUgcmV2ZXJzZSBvcmRlci5cblxuICAgICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTsgLy8gTm93IHB1c2ggdGhlIG5ldyBjb250ZXh0IGFuZCBtYXJrIHRoYXQgaXQgaGFzIGNoYW5nZWQuXG5cbiAgICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBtZXJnZWRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRVbm1hc2tlZENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIC8vIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgdXNlZCB3aXRoIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOyBub3Qgc3VyZSBpZiBpdFxuICAgIC8vIG1ha2VzIHNlbnNlIGVsc2V3aGVyZVxuICAgIGlmICghaXNGaWJlck1vdW50ZWQoZmliZXIpIHx8IGZpYmVyLnRhZyAhPT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc3VidHJlZSBwYXJlbnQgdG8gYmUgYSBtb3VudGVkIGNsYXNzIGNvbXBvbmVudC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICBkbyB7XG4gICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLmNvbnRleHQ7XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gbm9kZS50eXBlO1xuXG4gICAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUgIT09IG51bGwpO1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1bmV4cGVjdGVkIGRldGFjaGVkIHN1YnRyZWUgcGFyZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxudmFyIExlZ2FjeVJvb3QgPSAwO1xudmFyIENvbmN1cnJlbnRSb290ID0gMTtcblxudmFyIHN5bmNRdWV1ZSA9IG51bGw7XG52YXIgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG52YXIgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgLy8gUHVzaCB0aGlzIGNhbGxiYWNrIGludG8gYW4gaW50ZXJuYWwgcXVldWUuIFdlJ2xsIGZsdXNoIHRoZXNlIGVpdGhlciBpblxuICAvLyB0aGUgbmV4dCB0aWNrLCBvciBlYXJsaWVyIGlmIHNvbWV0aGluZyBjYWxscyBgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZWAuXG4gIGlmIChzeW5jUXVldWUgPT09IG51bGwpIHtcbiAgICBzeW5jUXVldWUgPSBbY2FsbGJhY2tdO1xuICB9IGVsc2Uge1xuICAgIC8vIFB1c2ggb250byBleGlzdGluZyBxdWV1ZS4gRG9uJ3QgbmVlZCB0byBzY2hlZHVsZSBhIGNhbGxiYWNrIGJlY2F1c2VcbiAgICAvLyB3ZSBhbHJlYWR5IHNjaGVkdWxlZCBvbmUgd2hlbiB3ZSBjcmVhdGVkIHRoZSBxdWV1ZS5cbiAgICBzeW5jUXVldWUucHVzaChjYWxsYmFjayk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IHRydWU7XG4gIHNjaGVkdWxlU3luY0NhbGxiYWNrKGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKSB7XG4gIC8vIE9ubHkgZmx1c2hlcyB0aGUgcXVldWUgaWYgdGhlcmUncyBhIGxlZ2FjeSBzeW5jIGNhbGxiYWNrIHNjaGVkdWxlZC5cbiAgLy8gVE9ETzogVGhlcmUncyBvbmx5IGEgc2luZ2xlIHR5cGUgb2YgY2FsbGJhY2s6IHBlcmZvcm1TeW5jT25Xb3JrT25Sb290LiBTb1xuICAvLyBpdCBtaWdodCBtYWtlIG1vcmUgc2Vuc2UgZm9yIHRoZSBxdWV1ZSB0byBiZSBhIGxpc3Qgb2Ygcm9vdHMgaW5zdGVhZCBvZiBhXG4gIC8vIGxpc3Qgb2YgZ2VuZXJpYyBjYWxsYmFja3MuIFRoZW4gd2UgY2FuIGhhdmUgdHdvOiBvbmUgZm9yIGxlZ2FjeSByb290cywgb25lXG4gIC8vIGZvciBjb25jdXJyZW50IHJvb3RzLiBBbmQgdGhpcyBtZXRob2Qgd291bGQgb25seSBmbHVzaCB0aGUgbGVnYWN5IG9uZXMuXG4gIGlmIChpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MpIHtcbiAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgfVxufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzKCkge1xuICBpZiAoIWlzRmx1c2hpbmdTeW5jUXVldWUgJiYgc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gdHJ1ZTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHByZXZpb3VzVXBkYXRlUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgaXNTeW5jID0gdHJ1ZTtcbiAgICAgIHZhciBxdWV1ZSA9IHN5bmNRdWV1ZTsgLy8gVE9ETzogSXMgdGhpcyBuZWNlc3NhcnkgYW55bW9yZT8gVGhlIG9ubHkgdXNlciBjb2RlIHRoYXQgcnVucyBpbiB0aGlzXG4gICAgICAvLyBxdWV1ZSBpcyBpbiB0aGUgcmVuZGVyIG9yIGNvbW1pdCBwaGFzZXMuXG5cbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuXG4gICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHF1ZXVlW2ldO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKGlzU3luYyk7XG4gICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgIH1cblxuICAgICAgc3luY1F1ZXVlID0gbnVsbDtcbiAgICAgIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICBpZiAoc3luY1F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHN5bmNRdWV1ZSA9IHN5bmNRdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICB9IC8vIFJlc3VtZSBmbHVzaGluZyBpbiB0aGUgbmV4dCB0aWNrXG5cblxuICAgICAgc2NoZWR1bGVDYWxsYmFjayhJbW1lZGlhdGVQcmlvcml0eSwgZmx1c2hTeW5jQ2FsbGJhY2tzKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNVcGRhdGVQcmlvcml0eSk7XG4gICAgICBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRPRE86IFVzZSB0aGUgdW5pZmllZCBmaWJlciBzdGFjayBtb2R1bGUgaW5zdGVhZCBvZiB0aGlzIGxvY2FsIG9uZT9cbi8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGl0IHlldCB0byBkZXJpc2sgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24sIGJlY2F1c2Vcbi8vIHRoZSB3YXkgd2UgcHVzaC9wb3AgdGhlc2UgdmFsdWVzIGlzIGEgYml0IHVudXN1YWwuIElmIHRoZXJlJ3MgYSBtaXN0YWtlLCBJJ2Rcbi8vIHJhdGhlciB0aGUgaWRzIGJlIHdyb25nIHRoYW4gY3Jhc2ggdGhlIHdob2xlIHJlY29uY2lsZXIuXG52YXIgZm9ya1N0YWNrID0gW107XG52YXIgZm9ya1N0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVGb3JrUHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVGb3JrQ291bnQgPSAwO1xudmFyIGlkU3RhY2sgPSBbXTtcbnZhciBpZFN0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVDb250ZXh0SWQgPSAxO1xudmFyIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSAnJztcbmZ1bmN0aW9uIGlzRm9ya2VkQ2hpbGQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JrZWQpICE9PSBOb0ZsYWdzO1xufVxuZnVuY3Rpb24gZ2V0Rm9ya3NBdExldmVsKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICByZXR1cm4gdHJlZUZvcmtDb3VudDtcbn1cbmZ1bmN0aW9uIGdldFRyZWVJZCgpIHtcbiAgdmFyIG92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgdmFyIGlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgaWQgPSBpZFdpdGhMZWFkaW5nQml0ICYgfmdldExlYWRpbmdCaXQoaWRXaXRoTGVhZGluZ0JpdCk7XG4gIHJldHVybiBpZC50b1N0cmluZygzMikgKyBvdmVyZmxvdztcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbikge1xuICAvLyBUaGlzIGlzIGNhbGxlZCByaWdodCBhZnRlciB3ZSByZWNvbmNpbGUgYW4gYXJyYXkgKG9yIGl0ZXJhdG9yKSBvZiBjaGlsZFxuICAvLyBmaWJlcnMsIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdlIGtub3cgaG93IG1hbnkgY2hpbGRyZW4gaW5cbiAgLy8gdGhlIHdob2xlIHNldCB3aXRob3V0IGRvaW5nIGV4dHJhIHdvcmsgbGF0ZXIsIG9yIHN0b3JpbmcgYWRkdGlvbmFsXG4gIC8vIGluZm9ybWF0aW9uIG9uIHRoZSBmaWJlci5cbiAgLy9cbiAgLy8gVGhhdCdzIHdoeSB0aGlzIGZ1bmN0aW9uIGlzIHNlcGFyYXRlIGZyb20gcHVzaFRyZWVJZCDigJQgaXQncyBjYWxsZWQgZHVyaW5nXG4gIC8vIHRoZSByZW5kZXIgcGhhc2Ugb2YgdGhlIGZvcmsgcGFyZW50LCBub3QgdGhlIGNoaWxkLCB3aGljaCBpcyB3aGVyZSB3ZSBwdXNoXG4gIC8vIHRoZSBvdGhlciBjb250ZXh0IHZhbHVlcy5cbiAgLy9cbiAgLy8gSW4gdGhlIEZpenogaW1wbGVtZW50YXRpb24gdGhpcyBpcyBtdWNoIHNpbXBsZXIgYmVjYXVzZSB0aGUgY2hpbGQgaXNcbiAgLy8gcmVuZGVyZWQgaW4gdGhlIHNhbWUgY2FsbHN0YWNrIGFzIHRoZSBwYXJlbnQuXG4gIC8vXG4gIC8vIEl0IG1pZ2h0IGJlIGJldHRlciB0byBqdXN0IGFkZCBhIGBmb3Jrc2AgZmllbGQgdG8gdGhlIEZpYmVyIHR5cGUuIEl0IHdvdWxkXG4gIC8vIG1ha2UgdGhpcyBtb2R1bGUgc2ltcGxlci5cbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrQ291bnQ7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrUHJvdmlkZXI7XG4gIHRyZWVGb3JrUHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdHJlZUZvcmtDb3VudCA9IHRvdGFsQ2hpbGRyZW47XG59XG5mdW5jdGlvbiBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuLCBpbmRleCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB2YXIgYmFzZUlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgYmFzZU92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdzsgLy8gVGhlIGxlZnRtb3N0IDEgbWFya3MgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIG5vbi1pbmNsdXNpdmUuIEl0J3Mgbm90IHBhcnRcbiAgLy8gb2YgdGhlIGlkOyB3ZSB1c2UgaXQgdG8gYWNjb3VudCBmb3IgbGVhZGluZyAwcy5cblxuICB2YXIgYmFzZUxlbmd0aCA9IGdldEJpdExlbmd0aChiYXNlSWRXaXRoTGVhZGluZ0JpdCkgLSAxO1xuICB2YXIgYmFzZUlkID0gYmFzZUlkV2l0aExlYWRpbmdCaXQgJiB+KDEgPDwgYmFzZUxlbmd0aCk7XG4gIHZhciBzbG90ID0gaW5kZXggKyAxO1xuICB2YXIgbGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgYmFzZUxlbmd0aDsgLy8gMzAgaXMgdGhlIG1heCBsZW5ndGggd2UgY2FuIHN0b3JlIHdpdGhvdXQgb3ZlcmZsb3dpbmcsIHRha2luZyBpbnRvXG4gIC8vIGNvbnNpZGVyYXRpb24gdGhlIGxlYWRpbmcgMSB3ZSB1c2UgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cblxuICBpZiAobGVuZ3RoID4gMzApIHtcbiAgICAvLyBXZSBvdmVyZmxvd2VkIHRoZSBiaXR3aXNlLXNhZmUgcmFuZ2UuIEZhbGwgYmFjayB0byBzbG93ZXIgYWxnb3JpdGhtLlxuICAgIC8vIFRoaXMgYnJhbmNoIGFzc3VtZXMgdGhlIGxlbmd0aCBvZiB0aGUgYmFzZSBpZCBpcyBncmVhdGVyIHRoYW4gNTsgaXQgd29uJ3RcbiAgICAvLyB3b3JrIGZvciBzbWFsbGVyIGlkcywgYmVjYXVzZSB5b3UgbmVlZCA1IGJpdHMgcGVyIGNoYXJhY3Rlci5cbiAgICAvL1xuICAgIC8vIFdlIGVuY29kZSB0aGUgaWQgaW4gbXVsdGlwbGUgc3RlcHM6IGZpcnN0IHRoZSBiYXNlIGlkLCB0aGVuIHRoZVxuICAgIC8vIHJlbWFpbmluZyBkaWdpdHMuXG4gICAgLy9cbiAgICAvLyBFYWNoIDUgYml0IHNlcXVlbmNlIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGJhc2UgMzIgY2hhcmFjdGVyLiBTbyBmb3JcbiAgICAvLyBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBpZCBpcyAyMyBiaXRzIGxvbmcsIHdlIGNhbiBjb252ZXJ0IDIwIG9mIHRob3NlXG4gICAgLy8gYml0cyBpbnRvIGEgc3RyaW5nIG9mIDQgY2hhcmFjdGVycywgd2l0aCAzIGJpdHMgbGVmdCBvdmVyLlxuICAgIC8vXG4gICAgLy8gRmlyc3QgY2FsY3VsYXRlIGhvdyBtYW55IGJpdHMgaW4gdGhlIGJhc2UgaWQgcmVwcmVzZW50IGEgY29tcGxldGVcbiAgICAvLyBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLlxuICAgIHZhciBudW1iZXJPZk92ZXJmbG93Qml0cyA9IGJhc2VMZW5ndGggLSBiYXNlTGVuZ3RoICUgNTsgLy8gVGhlbiBjcmVhdGUgYSBiaXRtYXNrIHRoYXQgc2VsZWN0cyBvbmx5IHRob3NlIGJpdHMuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3dCaXRzID0gKDEgPDwgbnVtYmVyT2ZPdmVyZmxvd0JpdHMpIC0gMTsgLy8gU2VsZWN0IHRoZSBiaXRzLCBhbmQgY29udmVydCB0aGVtIHRvIGEgYmFzZSAzMiBzdHJpbmcuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3cgPSAoYmFzZUlkICYgbmV3T3ZlcmZsb3dCaXRzKS50b1N0cmluZygzMik7IC8vIE5vdyB3ZSBjYW4gcmVtb3ZlIHRob3NlIGJpdHMgZnJvbSB0aGUgYmFzZSBpZC5cblxuICAgIHZhciByZXN0T2ZCYXNlSWQgPSBiYXNlSWQgPj4gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7XG4gICAgdmFyIHJlc3RPZkJhc2VMZW5ndGggPSBiYXNlTGVuZ3RoIC0gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7IC8vIEZpbmFsbHksIGVuY29kZSB0aGUgcmVzdCBvZiB0aGUgYml0cyB1c2luZyB0aGUgbm9ybWFsIGFsZ29yaXRobS4gQmVjYXVzZVxuICAgIC8vIHdlIG1hZGUgbW9yZSByb29tLCB0aGlzIHRpbWUgaXQgd29uJ3Qgb3ZlcmZsb3cuXG5cbiAgICB2YXIgcmVzdE9mTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgcmVzdE9mTmV3Qml0cyA9IHNsb3QgPDwgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgaWQgPSByZXN0T2ZOZXdCaXRzIHwgcmVzdE9mQmFzZUlkO1xuICAgIHZhciBvdmVyZmxvdyA9IG5ld092ZXJmbG93ICsgYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IHJlc3RPZkxlbmd0aCB8IGlkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgfSBlbHNlIHtcbiAgICAvLyBOb3JtYWwgcGF0aFxuICAgIHZhciBuZXdCaXRzID0gc2xvdCA8PCBiYXNlTGVuZ3RoO1xuXG4gICAgdmFyIF9pZCA9IG5ld0JpdHMgfCBiYXNlSWQ7XG5cbiAgICB2YXIgX292ZXJmbG93ID0gYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IGxlbmd0aCB8IF9pZDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gX292ZXJmbG93O1xuICB9XG59XG5mdW5jdGlvbiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpOyAvLyBUaGlzIGNvbXBvbmVudCBtYXRlcmlhbGl6ZWQgYW4gaWQuIFRoaXMgd2lsbCBhZmZlY3QgYW55IGlkcyB0aGF0IGFwcGVhclxuICAvLyBpbiBpdHMgY2hpbGRyZW4uXG5cbiAgdmFyIHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBudW1iZXJPZkZvcmtzID0gMTtcbiAgICB2YXIgc2xvdEluZGV4ID0gMDtcbiAgICBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MpO1xuICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MsIHNsb3RJbmRleCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Qml0TGVuZ3RoKG51bWJlcikge1xuICByZXR1cm4gMzIgLSBjbHozMihudW1iZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRMZWFkaW5nQml0KGlkKSB7XG4gIHJldHVybiAxIDw8IGdldEJpdExlbmd0aChpZCkgLSAxO1xufVxuXG5mdW5jdGlvbiBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZXMuXG4gIC8vIFRoaXMgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuIG90aGVyIGNvbnRleHQtbGlrZSBtb2R1bGVzIGluIEZpYmVyXG4gIC8vIGJlY2F1c2UgdGhlIHNhbWUgRmliZXIgbWF5IGFwcGVhciBvbiB0aGUgc3RhY2sgbXVsdGlwbGUgdGltZXMgYW5kIGZvclxuICAvLyBkaWZmZXJlbnQgcmVhc29ucy4gV2UgaGF2ZSB0byBrZWVwIHBvcHBpbmcgdW50aWwgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaXNcbiAgLy8gbm8gbG9uZ2VyIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVGb3JrUHJvdmlkZXIpIHtcbiAgICB0cmVlRm9ya1Byb3ZpZGVyID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdO1xuICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVGb3JrQ291bnQgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gIH1cblxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVDb250ZXh0UHJvdmlkZXIpIHtcbiAgICB0cmVlQ29udGV4dFByb3ZpZGVyID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dElkID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuXG4gIGlmICh0cmVlQ29udGV4dFByb3ZpZGVyICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0cmVlQ29udGV4dElkLFxuICAgICAgb3ZlcmZsb3c6IHRyZWVDb250ZXh0T3ZlcmZsb3dcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbmRlZENvbnRleHQpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gIHRyZWVDb250ZXh0SWQgPSBzdXNwZW5kZWRDb250ZXh0LmlkO1xuICB0cmVlQ29udGV4dE92ZXJmbG93ID0gc3VzcGVuZGVkQ29udGV4dC5vdmVyZmxvdztcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RIeWRyYXRpbmcoKSB7XG4gIHtcbiAgICBpZiAoIWdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBiZSBoeWRyYXRpbmcuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlICcgKyAnYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uXG5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTsgLy8gVGhpcyBmbGFnIGFsbG93cyBmb3Igd2FybmluZyBzdXByZXNzaW9uIHdoZW4gd2UgZXhwZWN0IHRoZXJlIHRvIGJlIG1pc21hdGNoZXNcbi8vIGR1ZSB0byBlYXJsaWVyIG1pc21hdGNoZXMgb3IgYSBzdXNwZW5kZWQgZmliZXIuXG5cbnZhciBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlOyAvLyBIeWRyYXRpb24gZXJyb3JzIHRoYXQgd2VyZSB0aHJvd24gaW5zaWRlIHRoaXMgYm91bmRhcnlcblxudmFyIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5JZkh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgZXJyb3IoJ1dlIHNob3VsZCBub3QgYmUgaHlkcmF0aW5nIGhlcmUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGEgYnVnLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIGRpZFN1c3BlbmRPckVycm9yREVWID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIHJldHVybiBkaWRTdXNwZW5kT3JFcnJvckRFVjtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnRlckh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgdmFyIHBhcmVudEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlciwgc3VzcGVuc2VJbnN0YW5jZSwgdHJlZUNvbnRleHQpIHtcblxuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG5cbiAgaWYgKHRyZWVDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KGZpYmVyLCB0cmVlQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQsIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKTtcbiAgdmFyIGNoaWxkVG9EZWxldGUgPSBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpO1xuICBjaGlsZFRvRGVsZXRlLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyO1xuICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpIHtcbiAge1xuICAgIGlmIChkaWRTdXNwZW5kT3JFcnJvckRFVikge1xuICAgICAgLy8gSW5zaWRlIGEgYm91bmRhcnkgdGhhdCBhbHJlYWR5IHN1c3BlbmRlZC4gV2UncmUgY3VycmVudGx5IHJlbmRlcmluZyB0aGVcbiAgICAgIC8vIHNpYmxpbmdzIG9mIGEgc3VzcGVuZGVkIG5vZGUuIFRoZSBtaXNtYXRjaCBtYXkgYmUgZHVlIHRvIHRoZSBtaXNzaW5nXG4gICAgICAvLyBkYXRhLCBzbyBpdCdzIHByb2JhYmx5IGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3R5cGUgPSBmaWJlci50eXBlO1xuICAgICAgICAgICAgICAgIHZhciBfcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdHlwZSwgX3Byb3BzLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdGV4dCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSByZXR1cm5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBfcGFyZW50SW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICAgICAgaWYgKF9wYXJlbnRJbnN0YW5jZSAhPT0gbnVsbCkgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIF90eXBlMiA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90eXBlMik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UoX3BhcmVudEluc3RhbmNlLCBfdGV4dDIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcbiAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIGluc3RhbmNlID0gY2FuSHlkcmF0ZUluc3RhbmNlKG5leHRJbnN0YW5jZSwgdHlwZSk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQoaW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKG5leHRJbnN0YW5jZSwgdGV4dCk7XG5cbiAgICAgICAgaWYgKHRleHRJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IHRleHRJbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOyAvLyBUZXh0IEluc3RhbmNlcyBkb24ndCBoYXZlIGNoaWxkcmVuIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBoeWRyYXRlLlxuXG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKG5leHRJbnN0YW5jZSk7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHtcbiAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHN1c3BlbnNlSW5zdGFuY2UsXG4gICAgICAgICAgICB0cmVlQ29udGV4dDogZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSxcbiAgICAgICAgICAgIHJldHJ5TGFuZTogT2Zmc2NyZWVuTGFuZVxuICAgICAgICAgIH07XG4gICAgICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IHN1c3BlbnNlU3RhdGU7IC8vIFN0b3JlIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50IGFzIGEgY2hpbGQgZmliZXIuXG4gICAgICAgICAgLy8gVGhpcyBzaW1wbGlmaWVzIHRoZSBjb2RlIGZvciBnZXRIb3N0U2libGluZyBhbmQgZGVsZXRpbmcgbm9kZXMsXG4gICAgICAgICAgLy8gc2luY2UgaXQgZG9lc24ndCBoYXZlIHRvIGNvbnNpZGVyIGFsbCBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXkncmUgZGVoeWRyYXRlZCBvbmVzIG9yIG5vdC5cblxuICAgICAgICAgIHZhciBkZWh5ZHJhdGVkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgZGVoeWRyYXRlZEZyYWdtZW50LnJldHVybiA9IGZpYmVyO1xuICAgICAgICAgIGZpYmVyLmNoaWxkID0gZGVoeWRyYXRlZEZyYWdtZW50O1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFdoaWxlIGEgU3VzcGVuc2UgSW5zdGFuY2UgZG9lcyBoYXZlIGNoaWxkcmVuLCB3ZSB3b24ndCBzdGVwIGludG9cbiAgICAgICAgICAvLyBpdCBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIEluc3RlYWQsIHdlJ2xsIHJlZW50ZXIgaXQgbGF0ZXIuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikge1xuICByZXR1cm4gKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAoZmliZXIuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncztcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKGZpYmVyKSB7XG4gIHRocm93IG5ldyBFcnJvcignSHlkcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBpbml0aWFsIFVJIGRvZXMgbm90IG1hdGNoIHdoYXQgd2FzICcgKyAncmVuZGVyZWQgb24gdGhlIHNlcnZlci4nKTtcbn1cblxuZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuXG5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaXJzdEF0dGVtcHRlZEluc3RhbmNlID0gbmV4dEluc3RhbmNlO1xuXG4gIGlmICghdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgIH0gLy8gSWYgd2UgY2FuJ3QgaHlkcmF0ZSB0aGlzIGluc3RhbmNlIGxldCdzIHRyeSB0aGUgbmV4dCBvbmUuXG4gICAgLy8gV2UgdXNlIHRoaXMgYXMgYSBoZXVyaXN0aWMuIEl0J3MgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBub3QgZGF0YSBzbyBpdFxuICAgIC8vIG1pZ2h0IGJlIGZsYXdlZCBvciB1bm5lY2Vzc2FyeS5cblxuXG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICAgIHZhciBwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmICghbmV4dEluc3RhbmNlIHx8ICF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuICAgICAgaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBtYXRjaGVkIHRoZSBuZXh0IG9uZSwgd2UnbGwgbm93IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBvbmUgd2FzXG4gICAgLy8gc3VwZXJmbHVvdXMgYW5kIHdlJ2xsIGRlbGV0ZSBpdC4gU2luY2Ugd2UgY2FuJ3QgZWFnZXJseSBkZWxldGUgaXRcbiAgICAvLyB3ZSdsbCBoYXZlIHRvIHNjaGVkdWxlIGEgZGVsZXRpb24uIFRvIGRvIHRoYXQsIHRoaXMgbm9kZSBuZWVkcyBhIGR1bW15XG4gICAgLy8gZmliZXIgYXNzb2NpYXRlZCB3aXRoIGl0LlxuXG5cbiAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocHJldkh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaXJzdEF0dGVtcHRlZEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKGZpYmVyLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG5cbiAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYgPSAhZGlkU3VzcGVuZE9yRXJyb3JERVY7XG4gIHZhciB1cGRhdGVQYXlsb2FkID0gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCBmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBmaWJlciwgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICBmaWJlci51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAvLyBpcyBhIG5ldyByZWYgd2UgbWFyayB0aGlzIGFzIGFuIHVwZGF0ZS5cblxuICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciB0ZXh0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciB0ZXh0Q29udGVudCA9IGZpYmVyLm1lbW9pemVkUHJvcHM7XG4gIHZhciBzaG91bGRVcGRhdGUgPSBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIGZpYmVyKTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UgaXMgY2FsbGVkIGluIGEgY29udGV4dCB3aGVyZSB0aGVcbiAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuXG4gICAgdmFyIHJldHVybkZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG5cbiAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdmFyIF9pc0NvbmN1cnJlbnRNb2RlMiA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgX2lzQ29uY3VycmVudE1vZGUyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBub3QgY3VycmVudGx5IGh5ZHJhdGluZyBidXQgd2UncmUgaW4gYSBoeWRyYXRpb24gY29udGV4dCwgdGhlblxuICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyXG4gICAgLy8gc2libGluZ3MuXG4gICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFueSByZW1haW5pbmcgaHlkcmF0YWJsZSBub2Rlcywgd2UgbmVlZCB0byBkZWxldGUgdGhlbSBub3cuXG4gIC8vIFdlIG9ubHkgZG8gdGhpcyBkZWVwZXIgdGhhbiBoZWFkIGFuZCBib2R5IHNpbmNlIHRoZXkgdGVuZCB0byBoYXZlIHJhbmRvbVxuICAvLyBvdGhlciBub2RlcyBpbiB0aGVtLiBXZSBhbHNvIGlnbm9yZSBjb21wb25lbnRzIHdpdGggcHVyZSB0ZXh0IGNvbnRlbnQgaW5cbiAgLy8gc2lkZSBvZiB0aGVtLiBXZSBhbHNvIGRvbid0IGRlbGV0ZSBhbnl0aGluZyBpbnNpZGUgdGhlIHJvb3QgY29udGFpbmVyLlxuXG5cbiAgaWYgKGZpYmVyLnRhZyAhPT0gSG9zdFJvb3QgJiYgKGZpYmVyLnRhZyAhPT0gSG9zdENvbXBvbmVudCB8fCBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhmaWJlci50eXBlKSAmJiAhc2hvdWxkU2V0VGV4dENvbnRlbnQoZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcykpKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgICBpZiAobmV4dEluc3RhbmNlKSB7XG4gICAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcik7XG4gICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKG5leHRJbnN0YW5jZSkge1xuICAgICAgICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICAgICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuXG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpO1xuICB9IGVsc2Uge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBoeWRyYXRpb25QYXJlbnRGaWJlciA/IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhmaWJlci5zdGF0ZU5vZGUpIDogbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkge1xuICByZXR1cm4gaXNIeWRyYXRpbmcgJiYgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcikge1xuICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEh5ZHJhdGlvblN0YXRlKCkge1xuXG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCkge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLiBUaGUgZXJyb3JzIHRoYXQgb2NjdXJyZWRcbiAgICAvLyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBhdHRlbXB0IGFyZSBub3cgcmVjb3ZlcmVkLiBXZSB3aWxsIGxvZyB0aGVtIGluXG4gICAgLy8gY29tbWl0IHBoYXNlLCBvbmNlIHRoZSBlbnRpcmUgdHJlZSBoYXMgZmluaXNoZWQuXG4gICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhoeWRyYXRpb25FcnJvcnMpO1xuICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SXNIeWRyYXRpbmcoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZztcbn1cblxuZnVuY3Rpb24gcXVldWVIeWRyYXRpb25FcnJvcihlcnJvcikge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzID09PSBudWxsKSB7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gW2Vycm9yXTtcbiAgfSBlbHNlIHtcbiAgICBoeWRyYXRpb25FcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBOb1RyYW5zaXRpb24gPSBudWxsO1xuZnVuY3Rpb24gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkge1xuICByZXR1cm4gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xufVxuXG52YXIgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxufTtcblxue1xuICB2YXIgZmluZFN0cmljdFJvb3QgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVTdHJpY3RSb290O1xuICB9O1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICAvLyBEZWR1cGUgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuICAgIGlmIChkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLlxuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgZG8gYW4gaW5pdGlhbCBwYXNzIHRvIGdhdGhlciBjb21wb25lbnQgbmFtZXNcbiAgICB2YXIgY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH0gLy8gRmluYWxseSwgd2UgZmx1c2ggYWxsIHRoZSB3YXJuaW5nc1xuICAgIC8vIFVOU0FGRV8gb25lcyBiZWZvcmUgdGhlIGRlcHJlY2F0ZWQgb25lcywgc2luY2UgdGhleSdsbCBiZSAnbG91ZGVyJ1xuXG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgXCIgKyAncmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczIgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMyKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsTW91bnQgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsTW91bnQgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzMyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczQgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgXCIqIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIHJlZmFjdG9yIHlvdXIgXCIgKyAnY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczQpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXM1ID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbFVwZGF0ZSBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsVXBkYXRlIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXM1KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICB2YXIgc3RyaWN0Um9vdCA9IGZpbmRTdHJpY3RSb290KGZpYmVyKTtcblxuICAgIGlmIChzdHJpY3RSb290ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIFN0cmljdE1vZGUgY29tcG9uZW50IGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBEZWR1cCBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG5cblxuICAgIGlmIChkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZ2V0KHN0cmljdFJvb3QpO1xuXG4gICAgaWYgKGZpYmVyLnR5cGUuY29udGV4dFR5cGVzICE9IG51bGwgfHwgZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyAhPSBudWxsIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh3YXJuaW5nc0ZvclJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3YXJuaW5nc0ZvclJvb3QgPSBbXTtcbiAgICAgICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpO1xuICAgICAgfVxuXG4gICAgICB3YXJuaW5nc0ZvclJvb3QucHVzaChmaWJlcik7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyQXJyYXksIHN0cmljdFJvb3QpIHtcbiAgICAgIGlmIChmaWJlckFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBmaXJzdEZpYmVyID0gZmliZXJBcnJheVswXTtcbiAgICAgIHZhciB1bmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIGZpYmVyQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKHVuaXF1ZU5hbWVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpcnN0RmliZXIpO1xuXG4gICAgICAgIGVycm9yKCdMZWdhY3kgY29udGV4dCBBUEkgaGFzIGJlZW4gZGV0ZWN0ZWQgd2l0aGluIGEgc3RyaWN0LW1vZGUgdHJlZS4nICsgJ1xcblxcblRoZSBvbGQgQVBJIHdpbGwgYmUgc3VwcG9ydGVkIGluIGFsbCAxNi54IHJlbGVhc2VzLCBidXQgYXBwbGljYXRpb25zICcgKyAndXNpbmcgaXQgc2hvdWxkIG1pZ3JhdGUgdG8gdGhlIG5ldyB2ZXJzaW9uLicgKyAnXFxuXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJyArICdcXG5cXG5MZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBzb3J0ZWROYW1lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTtcbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dE1hcHM7XG52YXIgZGlkV2FybkFib3V0R2VuZXJhdG9ycztcbnZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xudmFyIG93bmVySGFzS2V5VXNlV2FybmluZztcbnZhciBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmc7XG5cbnZhciB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHt9O1xuXG57XG4gIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG4gIC8qKlxuICAgKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gICAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICAgKiB1cGRhdGVzLlxuICAgKi9cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcbiAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nID0ge307XG5cbiAgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQsIHJldHVybkZpYmVyKSB7XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkLl9zdG9yZSB8fCBjaGlsZC5fc3RvcmUudmFsaWRhdGVkIHx8IGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGlsZC5fc3RvcmUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IENvbXBvbmVudCBpbiB3YXJuRm9yTWlzc2luZ0tleSBzaG91bGQgaGF2ZSBhIF9zdG9yZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSAnICsgJ1wia2V5XCIgcHJvcC4gU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yICcgKyAnbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNSZWFjdENsYXNzKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUucHJvdG90eXBlICYmIHR5cGUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ7XG59XG5cbmZ1bmN0aW9uIGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCkge1xuICB2YXIgbWl4ZWRSZWYgPSBlbGVtZW50LnJlZjtcblxuICBpZiAobWl4ZWRSZWYgIT09IG51bGwgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ29iamVjdCcpIHtcbiAgICB7XG4gICAgICAvLyBUT0RPOiBDbGVhbiB0aGlzIHVwIG9uY2Ugd2UgdHVybiBvbiB0aGUgc3RyaW5nIHJlZiB3YXJuaW5nIGZvclxuICAgICAgLy8gZXZlcnlvbmUsIGJlY2F1c2UgdGhlIHN0cmljdCBtb2RlIGNhc2Ugd2lsbCBubyBsb25nZXIgYmUgcmVsZXZhbnRcbiAgICAgIGlmICgocmV0dXJuRmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgfHwgd2FybkFib3V0U3RyaW5nUmVmcykgJiYgLy8gV2Ugd2FybiBpbiBSZWFjdEVsZW1lbnQuanMgaWYgb3duZXIgYW5kIHNlbGYgYXJlIGVxdWFsIGZvciBzdHJpbmcgcmVmc1xuICAgICAgLy8gYmVjYXVzZSB0aGVzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb25cbiAgICAgIC8vIHVzaW5nIGEgY29kZW1vZC4gVGhlcmVmb3JlLCB3ZSBkb24ndCBoYXZlIHRvIHdhcm4gYWJvdXQgc3RyaW5nIHJlZnMgYWdhaW4uXG4gICAgICAhKGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX3NlbGYgJiYgZWxlbWVudC5fb3duZXIuc3RhdGVOb2RlICE9PSBlbGVtZW50Ll9zZWxmKSAmJiAvLyBXaWxsIGFscmVhZHkgdGhyb3cgd2l0aCBcIkZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnNcIlxuICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lci50YWcgIT09IENsYXNzQ29tcG9uZW50KSAmJiAvLyBXaWxsIGFscmVhZHkgd2FybiB3aXRoIFwiRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmc1wiXG4gICAgICAhKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdmdW5jdGlvbicgJiYgIWlzUmVhY3RDbGFzcyhlbGVtZW50LnR5cGUpKSAmJiAvLyBXaWxsIGFscmVhZHkgdGhyb3cgd2l0aCBcIkVsZW1lbnQgcmVmIHdhcyBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKHNvbWVTdHJpbmdSZWYpIGJ1dCBubyBvd25lciB3YXMgc2V0XCJcbiAgICAgIGVsZW1lbnQuX293bmVyKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiBTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyAnICsgJ3dpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBXZSByZWNvbW1lbmQgdXNpbmcgJyArICd1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIG1peGVkUmVmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50Ll9vd25lcikge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgaW5zdDtcblxuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG5cbiAgICAgICAgaWYgKG93bmVyRmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgaGF2ZSBzdHJpbmcgcmVmcy4gJyArICdXZSByZWNvbW1lbmQgdXNpbmcgdXNlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluc3QgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpbnN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcgb3duZXIgZm9yIHN0cmluZyByZWYgXCIgKyBtaXhlZFJlZiArIFwiLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBcIiArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfSAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0IHNvIEZsb3cga25vd3MgaXQgd29uJ3QgY2hhbmdlIGluIHRoZSBjbG9zdXJlXG5cblxuICAgICAgdmFyIHJlc29sdmVkSW5zdCA9IGluc3Q7XG5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tQcm9wU3RyaW5nQ29lcmNpb24obWl4ZWRSZWYsICdyZWYnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0cmluZ1JlZiA9ICcnICsgbWl4ZWRSZWY7IC8vIENoZWNrIGlmIHByZXZpb3VzIHN0cmluZyByZWYgbWF0Y2hlcyBuZXcgc3RyaW5nIHJlZlxuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgY3VycmVudC5yZWYgPT09ICdmdW5jdGlvbicgJiYgY3VycmVudC5yZWYuX3N0cmluZ1JlZiA9PT0gc3RyaW5nUmVmKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50LnJlZjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVmcyA9IHJlc29sdmVkSW5zdC5yZWZzO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlbGV0ZSByZWZzW3N0cmluZ1JlZl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmc1tzdHJpbmdSZWZdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmO1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBtaXhlZFJlZiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZWYgdG8gYmUgYSBmdW5jdGlvbiwgYSBzdHJpbmcsIGFuIG9iamVjdCByZXR1cm5lZCBieSBSZWFjdC5jcmVhdGVSZWYoKSwgb3IgbnVsbC4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50Ll9vd25lcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IHJlZiB3YXMgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChcIiArIG1peGVkUmVmICsgXCIpIGJ1dCBubyBvd25lciB3YXMgc2V0LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mXCIgKyAnIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgZnVuY3Rpb24gY29tcG9uZW50XFxuJyArIFwiMi4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50J3MgcmVuZGVyIG1ldGhvZFxcblwiICsgJzMuIFlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWRcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVmcy1tdXN0LWhhdmUtb3duZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1peGVkUmVmO1xufVxuXG5mdW5jdGlvbiB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKSB7XG4gIHZhciBjaGlsZFN0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdDaGlsZCk7XG4gIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRTdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhuZXdDaGlsZCkuam9pbignLCAnKSArICd9JyA6IGNoaWxkU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG59XG5cbmZ1bmN0aW9uIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcikge1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0Z1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiAnICsgJ3lvdSByZXR1cm4gYSBDb21wb25lbnQgaW5zdGVhZCBvZiA8Q29tcG9uZW50IC8+IGZyb20gcmVuZGVyLiAnICsgJ09yIG1heWJlIHlvdSBtZWFudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuIGl0LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVMYXp5KGxhenlUeXBlKSB7XG4gIHZhciBwYXlsb2FkID0gbGF6eVR5cGUuX3BheWxvYWQ7XG4gIHZhciBpbml0ID0gbGF6eVR5cGUuX2luaXQ7XG4gIHJldHVybiBpbml0KHBheWxvYWQpO1xufSAvLyBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZXhpc3RzIGJlY2F1c2UgSSBleHBlY3QgdG8gY2xvbmUgdGhlIGNvZGUgaW4gZWFjaCBwYXRoXG4vLyB0byBiZSBhYmxlIHRvIG9wdGltaXplIGVhY2ggcGF0aCBpbmRpdmlkdWFsbHkgYnkgYnJhbmNoaW5nIGVhcmx5LiBUaGlzIG5lZWRzXG4vLyBhIGNvbXBpbGVyIG9yIHdlIGNhbiBkbyBpdCBtYW51YWxseS4gSGVscGVycyB0aGF0IGRvbid0IG5lZWQgdGhpcyBicmFuY2hpbmdcbi8vIGxpdmUgb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9uLlxuXG5cbmZ1bmN0aW9uIENoaWxkUmVjb25jaWxlcihzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gIGZ1bmN0aW9uIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIFRPRE86IEZvciB0aGUgc2hvdWxkQ2xvbmUgY2FzZSwgdGhpcyBjb3VsZCBiZSBtaWNyby1vcHRpbWl6ZWQgYSBiaXQgYnlcbiAgICAvLyBhc3N1bWluZyB0aGF0IGFmdGVyIHRoZSBmaXJzdCBjaGlsZCB3ZSd2ZSBhbHJlYWR5IGFkZGVkIGV2ZXJ5dGhpbmcuXG5cblxuICAgIHZhciBjaGlsZFRvRGVsZXRlID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGRUb0RlbGV0ZSAhPT0gbnVsbCkge1xuICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpO1xuICAgICAgY2hpbGRUb0RlbGV0ZSA9IGNoaWxkVG9EZWxldGUuc2libGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCkge1xuICAgIC8vIEFkZCB0aGUgcmVtYWluaW5nIGNoaWxkcmVuIHRvIGEgdGVtcG9yYXJ5IG1hcCBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZW0gYnlcbiAgICAvLyBrZXlzIHF1aWNrbHkuIEltcGxpY2l0IChudWxsKSBrZXlzIGdldCBhZGRlZCB0byB0aGlzIHNldCB3aXRoIHRoZWlyIGluZGV4XG4gICAgLy8gaW5zdGVhZC5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG5ldyBNYXAoKTtcbiAgICB2YXIgZXhpc3RpbmdDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGV4aXN0aW5nQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGlmIChleGlzdGluZ0NoaWxkLmtleSAhPT0gbnVsbCkge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmtleSwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmluZGV4LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH1cblxuICAgICAgZXhpc3RpbmdDaGlsZCA9IGV4aXN0aW5nQ2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gZXhpc3RpbmdDaGlsZHJlbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUZpYmVyKGZpYmVyLCBwZW5kaW5nUHJvcHMpIHtcbiAgICAvLyBXZSBjdXJyZW50bHkgc2V0IHNpYmxpbmcgdG8gbnVsbCBhbmQgaW5kZXggdG8gMCBoZXJlIGJlY2F1c2UgaXQgaXMgZWFzeVxuICAgIC8vIHRvIGZvcmdldCB0byBkbyBiZWZvcmUgcmV0dXJuaW5nIGl0LiBFLmcuIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuXG4gICAgdmFyIGNsb25lID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZmliZXIsIHBlbmRpbmdQcm9wcyk7XG4gICAgY2xvbmUuaW5kZXggPSAwO1xuICAgIGNsb25lLnNpYmxpbmcgPSBudWxsO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SW5kZXgpIHtcbiAgICBuZXdGaWJlci5pbmRleCA9IG5ld0luZGV4O1xuXG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBEdXJpbmcgaHlkcmF0aW9uLCB0aGUgdXNlSWQgYWxnb3JpdGhtIG5lZWRzIHRvIGtub3cgd2hpY2ggZmliZXJzIGFyZVxuICAgICAgLy8gcGFydCBvZiBhIGxpc3Qgb2YgY2hpbGRyZW4gKGFycmF5cywgaXRlcmF0b3JzKS5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IEZvcmtlZDtcbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnQgPSBuZXdGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEluZGV4ID0gY3VycmVudC5pbmRleDtcblxuICAgICAgaWYgKG9sZEluZGV4IDwgbGFzdFBsYWNlZEluZGV4KSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBtb3ZlLlxuICAgICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGl0ZW0gY2FuIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgIHJldHVybiBvbGRJbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyBhbiBpbnNlcnRpb24uXG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBsYWNlU2luZ2xlQ2hpbGQobmV3RmliZXIpIHtcbiAgICAvLyBUaGlzIGlzIHNpbXBsZXIgZm9yIHRoZSBzaW5nbGUgY2hpbGQgY2FzZS4gV2Ugb25seSBuZWVkIHRvIGRvIGFcbiAgICAvLyBwbGFjZW1lbnQgZm9yIGluc2VydGluZyBuZXcgY2hpbGRyZW4uXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZpYmVyO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBlbGVtZW50VHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LnByb3BzLmNoaWxkcmVuLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUgfHwgKCAvLyBLZWVwIHRoaXMgY2hlY2sgaW5saW5lIHNvIGl0IG9ubHkgcnVucyBvbiB0aGUgZmFsc2UgcGF0aDpcbiAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY3VycmVudCwgZWxlbWVudCkgKSB8fCAvLyBMYXp5IHR5cGVzIHNob3VsZCByZWNvbmNpbGUgdGhlaXIgcmVzb2x2ZWQgdHlwZS5cbiAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgSG90IFJlbG9hZGluZyBjaGVjayBhYm92ZSxcbiAgICAgIC8vIGJlY2F1c2UgaG90IHJlbG9hZGluZyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHByb2QgYmVjYXVzZVxuICAgICAgLy8gaXQgZG9lc24ndCByZXN1c3BlbmQuIFNvIHdlIGNhbid0IGxldCB0aGUgY2FsbCBiZWxvdyBzdXNwZW5kLlxuICAgICAgdHlwZW9mIGVsZW1lbnRUeXBlID09PSAnb2JqZWN0JyAmJiBlbGVtZW50VHlwZSAhPT0gbnVsbCAmJiBlbGVtZW50VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY3VycmVudC50eXBlKSB7XG4gICAgICAgIC8vIE1vdmUgYmFzZWQgb24gaW5kZXhcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZWxlbWVudC5wcm9wcyk7XG4gICAgICAgIGV4aXN0aW5nLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCk7XG4gICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgIH1cbiAgICB9IC8vIEluc2VydFxuXG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50LCBwb3J0YWwsIGxhbmVzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEhvc3RQb3J0YWwgfHwgY3VycmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyAhPT0gcG9ydGFsLmNvbnRhaW5lckluZm8gfHwgY3VycmVudC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gIT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBwb3J0YWwuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGZyYWdtZW50LCBsYW5lcywga2V5KSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEZyYWdtZW50KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBrZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIGZyYWdtZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KCcnICsgbmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgICAgICAgIF9jcmVhdGVkLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgbnVsbCwgbmV3Q2hpbGQpO1xuICAgICAgICAgICAgX2NyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkMiA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZDIucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQyO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfY3JlYXRlZDMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIG51bGwpO1xuXG4gICAgICAgIF9jcmVhdGVkMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVkMztcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFVwZGF0ZSB0aGUgZmliZXIgaWYgdGhlIGtleXMgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICB2YXIga2V5ID0gb2xkRmliZXIgIT09IG51bGwgPyBvbGRGaWJlci5rZXkgOiBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgb2xkRmliZXIsICcnICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMsIHNvIHdlIG5laXRoZXIgaGF2ZSB0byBjaGVjayB0aGUgb2xkIG5vclxuICAgICAgLy8gbmV3IG5vZGUgZm9yIHRoZSBrZXkuIElmIGJvdGggYXJlIHRleHQgbm9kZXMsIHRoZXkgbWF0Y2guXG4gICAgICB2YXIgbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBtYXRjaGVkRmliZXIsICcnICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX21hdGNoZWRGaWJlciA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0NoaWxkLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleSkgfHwgbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMiwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgIHJldHVybiB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyMyA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbDtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIzLCBuZXdDaGlsZCwgbGFuZXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFdhcm5zIGlmIHRoZXJlIGlzIGEgZHVwbGljYXRlIG9yIG1pc3Npbmcga2V5XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcikge1xuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnIHx8IGNoaWxkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBrbm93bktleXM7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoY2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgd2FybkZvck1pc3NpbmdLZXkoY2hpbGQsIHJldHVybkZpYmVyKTtcbiAgICAgICAgICB2YXIga2V5ID0gY2hpbGQua2V5O1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoa25vd25LZXlzID09PSBudWxsKSB7XG4gICAgICAgICAgICBrbm93bktleXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWtub3duS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAga25vd25LZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IoJ0VuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgYCVzYC4gJyArICdLZXlzIHNob3VsZCBiZSB1bmlxdWUgc28gdGhhdCBjb21wb25lbnRzIG1haW50YWluIHRoZWlyIGlkZW50aXR5ICcgKyAnYWNyb3NzIHVwZGF0ZXMuIE5vbi11bmlxdWUga2V5cyBtYXkgY2F1c2UgY2hpbGRyZW4gdG8gYmUgJyArICdkdXBsaWNhdGVkIGFuZC9vciBvbWl0dGVkIOKAlCB0aGUgYmVoYXZpb3IgaXMgdW5zdXBwb3J0ZWQgYW5kICcgKyAnY291bGQgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb24uJywga2V5KTtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gY2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBjaGlsZC5faW5pdDtcbiAgICAgICAgICB3YXJuT25JbnZhbGlkS2V5KGluaXQocGF5bG9hZCksIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBrbm93bktleXM7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW4sIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBhbGdvcml0aG0gY2FuJ3Qgb3B0aW1pemUgYnkgc2VhcmNoaW5nIGZyb20gYm90aCBlbmRzIHNpbmNlIHdlXG4gICAgLy8gZG9uJ3QgaGF2ZSBiYWNrcG9pbnRlcnMgb24gZmliZXJzLiBJJ20gdHJ5aW5nIHRvIHNlZSBob3cgZmFyIHdlIGNhbiBnZXRcbiAgICAvLyB3aXRoIHRoYXQgbW9kZWwuIElmIGl0IGVuZHMgdXAgbm90IGJlaW5nIHdvcnRoIHRoZSB0cmFkZW9mZnMsIHdlIGNhblxuICAgIC8vIGFkZCBpdCBsYXRlci5cbiAgICAvLyBFdmVuIHdpdGggYSB0d28gZW5kZWQgb3B0aW1pemF0aW9uLCB3ZSdkIHdhbnQgdG8gb3B0aW1pemUgZm9yIHRoZSBjYXNlXG4gICAgLy8gd2hlcmUgdGhlcmUgYXJlIGZldyBjaGFuZ2VzIGFuZCBicnV0ZSBmb3JjZSB0aGUgY29tcGFyaXNvbiBpbnN0ZWFkIG9mXG4gICAgLy8gZ29pbmcgZm9yIHRoZSBNYXAuIEl0J2QgbGlrZSB0byBleHBsb3JlIGhpdHRpbmcgdGhhdCBwYXRoIGZpcnN0IGluXG4gICAgLy8gZm9yd2FyZC1vbmx5IG1vZGUgYW5kIG9ubHkgZ28gZm9yIHRoZSBNYXAgb25jZSB3ZSBub3RpY2UgdGhhdCB3ZSBuZWVkXG4gICAgLy8gbG90cyBvZiBsb29rIGFoZWFkLiBUaGlzIGRvZXNuJ3QgaGFuZGxlIHJldmVyc2FsIGFzIHdlbGwgYXMgdHdvIGVuZGVkXG4gICAgLy8gc2VhcmNoIGJ1dCB0aGF0J3MgdW51c3VhbC4gQmVzaWRlcywgZm9yIHRoZSB0d28gZW5kZWQgb3B0aW1pemF0aW9uIHRvXG4gICAgLy8gd29yayBvbiBJdGVyYWJsZXMsIHdlJ2QgbmVlZCB0byBjb3B5IHRoZSB3aG9sZSBzZXQuXG4gICAgLy8gSW4gdGhpcyBmaXJzdCBpdGVyYXRpb24sIHdlJ2xsIGp1c3QgbGl2ZSB3aXRoIGhpdHRpbmcgdGhlIGJhZCBjYXNlXG4gICAgLy8gKGFkZGluZyBldmVyeXRoaW5nIHRvIGEgTWFwKSBpbiBmb3IgZXZlcnkgaW5zZXJ0L21vdmUuXG4gICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNvZGUsIGFsc28gdXBkYXRlIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IoKSB3aGljaFxuICAgIC8vIHVzZXMgdGhlIHNhbWUgYWxnb3JpdGhtLlxuICAgIHtcbiAgICAgIC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3Q2hpbGRyZW5baV07XG4gICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG4gICAgdmFyIG9sZEZpYmVyID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgdmFyIGxhc3RQbGFjZWRJbmRleCA9IDA7XG4gICAgdmFyIG5ld0lkeCA9IDA7XG4gICAgdmFyIG5leHRPbGRGaWJlciA9IG51bGw7XG5cbiAgICBmb3IgKDsgb2xkRmliZXIgIT09IG51bGwgJiYgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKG5ld0lkeCA9PT0gbmV3Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgX251bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLlxuXG5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7IC8vIEtlZXAgc2Nhbm5pbmcgYW5kIHVzZSB0aGUgbWFwIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtcyBhcyBtb3Zlcy5cblxuICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyMiA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyMiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXIyLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjIua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyMi5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyMiwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczIgPSBuZXdJZHg7XG4gICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW5JdGVyYWJsZSwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGFzIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkoKSxcbiAgICAvLyBidXQgdXNpbmcgdGhlIGl0ZXJhdG9yIGluc3RlYWQuXG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIG9iamVjdCBpcyBub3QgYW4gaXRlcmFibGUuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiAnICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHJlbmRlcmluZyBHZW5lcmF0b3JzIGJlY2F1c2UgaXQncyBhIG11dGF0aW9uLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI5OTVcbiAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgdG9TdHJpbmdUYWdcbiAgICAgIG5ld0NoaWxkcmVuSXRlcmFibGVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0dlbmVyYXRvcicpIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRHZW5lcmF0b3JzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIEdlbmVyYXRvcnMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzIGJlY2F1c2UgZW51bWVyYXRpbmcgYSBnZW5lcmF0b3IgbXV0YXRlcyBpdC4gJyArICdZb3UgbWF5IGNvbnZlcnQgaXQgdG8gYW4gYXJyYXkgd2l0aCBgQXJyYXkuZnJvbSgpYCBvciB0aGUgJyArICdgWy4uLnNwcmVhZF1gIG9wZXJhdG9yIGJlZm9yZSByZW5kZXJpbmcuIEtlZXAgaW4gbWluZCAnICsgJ3lvdSBtaWdodCBuZWVkIHRvIHBvbHlmaWxsIHRoZXNlIGZlYXR1cmVzIGZvciBvbGRlciBicm93c2Vycy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSB0cnVlO1xuICAgICAgfSAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cblxuXG4gICAgICBpZiAobmV3Q2hpbGRyZW5JdGVyYWJsZS5lbnRyaWVzID09PSBpdGVyYXRvckZuKSB7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgIGVycm9yKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgfSAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIC8vIFdlJ2xsIGdldCBhIGRpZmZlcmVudCBpdGVyYXRvciBsYXRlciBmb3IgdGhlIG1haW4gcGFzcy5cblxuXG4gICAgICB2YXIgX25ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgICBpZiAoX25ld0NoaWxkcmVuKSB7XG4gICAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuXG4gICAgICAgIHZhciBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCk7XG5cbiAgICAgICAgZm9yICg7ICFfc3RlcC5kb25lOyBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXdDaGlsZHJlbiA9IGl0ZXJhdG9yRm4uY2FsbChuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgIGlmIChuZXdDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGl0ZXJhYmxlIG9iamVjdCBwcm92aWRlZCBubyBpdGVyYXRvci4nKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzTmV3RmliZXIgPSBudWxsO1xuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuICAgIHZhciBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpO1xuXG4gICAgZm9yICg7IG9sZEZpYmVyICE9PSBudWxsICYmICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICB2YXIgX25ld0ZpYmVyMyA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlcjMgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyMywgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyMztcbiAgICAgIH1cblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzMyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLlxuXG5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7IC8vIEtlZXAgc2Nhbm5pbmcgYW5kIHVzZSB0aGUgbWFwIHRvIHJlc3RvcmUgZGVsZXRlZCBpdGVtcyBhcyBtb3Zlcy5cblxuICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgdmFyIF9uZXdGaWJlcjQgPSB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgaWYgKF9uZXdGaWJlcjQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyNC5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXI0LmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjQsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyNDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICB2YXIgX251bWJlck9mRm9ya3M0ID0gbmV3SWR4O1xuICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCwgbGFuZXMpIHtcbiAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGtleXMgb24gdGV4dCBub2RlcyBzaW5jZSB3ZSBkb24ndCBoYXZlIGFcbiAgICAvLyB3YXkgdG8gZGVmaW5lIHRoZW0uXG4gICAgaWYgKGN1cnJlbnRGaXJzdENoaWxkICE9PSBudWxsICYmIGN1cnJlbnRGaXJzdENoaWxkLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBub2RlIHNvIGxldCdzIGp1c3QgdXBkYXRlIGl0IGFuZCBkZWxldGVcbiAgICAgIC8vIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmcpO1xuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH0gLy8gVGhlIGV4aXN0aW5nIGZpcnN0IGNoaWxkIGlzIG5vdCBhIHRleHQgbm9kZSBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmVcbiAgICAvLyBhbmQgZGVsZXRlIHRoZSBleGlzdGluZyBvbmVzLlxuXG5cbiAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCwgbGFuZXMpIHtcbiAgICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gICAgdmFyIGNoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gRnJhZ21lbnQpIHtcbiAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2hpbGQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhjaGlsZCwgZWxlbWVudCkgKSB8fCAvLyBMYXp5IHR5cGVzIHNob3VsZCByZWNvbmNpbGUgdGhlaXIgcmVzb2x2ZWQgdHlwZS5cbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIEhvdCBSZWxvYWRpbmcgY2hlY2sgYWJvdmUsXG4gICAgICAgICAgLy8gYmVjYXVzZSBob3QgcmVsb2FkaW5nIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gcHJvZCBiZWNhdXNlXG4gICAgICAgICAgLy8gaXQgZG9lc24ndCByZXN1c3BlbmQuIFNvIHdlIGNhbid0IGxldCB0aGUgY2FsbCBiZWxvdyBzdXNwZW5kLlxuICAgICAgICAgIHR5cGVvZiBlbGVtZW50VHlwZSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudFR5cGUgIT09IG51bGwgJiYgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJiByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcblxuICAgICAgICAgICAgdmFyIF9leGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzKTtcblxuICAgICAgICAgICAgX2V4aXN0aW5nLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY2hpbGQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgX2V4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIF9leGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgIF9leGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2V4aXN0aW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBEaWRuJ3QgbWF0Y2guXG5cblxuICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBlbGVtZW50LmtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY3JlYXRlZDQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgX2NyZWF0ZWQ0LnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGVsZW1lbnQpO1xuICAgICAgX2NyZWF0ZWQ0LnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIF9jcmVhdGVkNDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBwb3J0YWwsIGxhbmVzKSB7XG4gICAgdmFyIGtleSA9IHBvcnRhbC5rZXk7XG4gICAgdmFyIGNoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoY2hpbGQudGFnID09PSBIb3N0UG9ydGFsICYmIGNoaWxkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvID09PSBwb3J0YWwuY29udGFpbmVySW5mbyAmJiBjaGlsZC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gPT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH0gLy8gVGhpcyBBUEkgd2lsbCB0YWcgdGhlIGNoaWxkcmVuIHdpdGggdGhlIHNpZGUtZWZmZWN0IG9mIHRoZSByZWNvbmNpbGlhdGlvblxuICAvLyBpdHNlbGYuIFRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2lkZS1lZmZlY3QgbGlzdCBhcyB3ZSBwYXNzIHRocm91Z2ggdGhlXG4gIC8vIGNoaWxkcmVuIGFuZCB0aGUgcGFyZW50LlxuXG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWN1cnNpdmUuXG4gICAgLy8gSWYgdGhlIHRvcCBsZXZlbCBpdGVtIGlzIGFuIGFycmF5LCB3ZSB0cmVhdCBpdCBhcyBhIHNldCBvZiBjaGlsZHJlbixcbiAgICAvLyBub3QgYXMgYSBmcmFnbWVudC4gTmVzdGVkIGFycmF5cyBvbiB0aGUgb3RoZXIgaGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXNcbiAgICAvLyBmcmFnbWVudCBub2Rlcy4gUmVjdXJzaW9uIGhhcHBlbnMgYXQgdGhlIG5vcm1hbCBmbG93LlxuICAgIC8vIEhhbmRsZSB0b3AgbGV2ZWwgdW5rZXllZCBmcmFnbWVudHMgYXMgaWYgdGhleSB3ZXJlIGFycmF5cy5cbiAgICAvLyBUaGlzIGxlYWRzIHRvIGFuIGFtYmlndWl0eSBiZXR3ZWVuIDw+e1suLi5dfTwvPiBhbmQgPD4uLi48Lz4uXG4gICAgLy8gV2UgdHJlYXQgdGhlIGFtYmlndW91cyBjYXNlcyBhYm92ZSB0aGUgc2FtZS5cbiAgICB2YXIgaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCA9IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwgJiYgbmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSAmJiBuZXdDaGlsZC5rZXkgPT09IG51bGw7XG5cbiAgICBpZiAoaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlbjtcbiAgICB9IC8vIEhhbmRsZSBvYmplY3QgdHlwZXNcblxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0OyAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIG5vbi1yZWN1cnNpdmUuXG5cbiAgICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsICcnICsgbmV3Q2hpbGQsIGxhbmVzKSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH0gLy8gUmVtYWluaW5nIGNhc2VzIGFyZSBhbGwgdHJlYXRlZCBhcyBlbXB0eS5cblxuXG4gICAgcmV0dXJuIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gIH1cblxuICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnM7XG59XG5cbnZhciByZWNvbmNpbGVDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcih0cnVlKTtcbnZhciBtb3VudENoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKGZhbHNlKTtcbmZ1bmN0aW9uIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnQuY2hpbGQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3VtaW5nIHdvcmsgbm90IHlldCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjdXJyZW50Q2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBjdXJyZW50Q2hpbGQucGVuZGluZ1Byb3BzKTtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXdDaGlsZDtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgd2hpbGUgKGN1cnJlbnRDaGlsZC5zaWJsaW5nICE9PSBudWxsKSB7XG4gICAgY3VycmVudENoaWxkID0gY3VycmVudENoaWxkLnNpYmxpbmc7XG4gICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5zaWJsaW5nID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBjdXJyZW50Q2hpbGQucGVuZGluZ1Byb3BzKTtcbiAgICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIG5ld0NoaWxkLnNpYmxpbmcgPSBudWxsO1xufSAvLyBSZXNldCBhIHdvcmtJblByb2dyZXNzIGNoaWxkIHNldCB0byBwcmVwYXJlIGl0IGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBsYW5lcykge1xuICB2YXIgY2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICByZXNldFdvcmtJblByb2dyZXNzKGNoaWxkLCBsYW5lcyk7XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbnZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbnZhciByZW5kZXJlclNpZ2lsO1xuXG57XG4gIC8vIFVzZSB0aGlzIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgY29udGV4dFxuICByZW5kZXJlclNpZ2lsID0ge307XG59XG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG52YXIgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbnZhciBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbmZ1bmN0aW9uIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgXG4gIC8vIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG5cbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBjb250ZXh0LCBuZXh0VmFsdWUpIHtcbiAge1xuICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuXG4gICAge1xuICAgICAgaWYgKGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gbnVsbCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHJlbmRlcmVyU2lnaWwpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3BQcm92aWRlcihjb250ZXh0LCBwcm92aWRlckZpYmVyKSB7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZUN1cnNvci5jdXJyZW50O1xuICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuXG4gIHtcbiAgICB7XG4gICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudCwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCkge1xuICAvLyBVcGRhdGUgdGhlIGNoaWxkIGxhbmVzIG9mIGFsbCB0aGUgYW5jZXN0b3JzLCBpbmNsdWRpbmcgdGhlIGFsdGVybmF0ZXMuXG4gIHZhciBub2RlID0gcGFyZW50O1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IG5vZGUuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKCFpc1N1YnNldE9mTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIG5vZGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhbHRlcm5hdGUgIT09IG51bGwgJiYgIWlzU3Vic2V0T2ZMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcHJvcGFnYXRpb25Sb290KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKG5vZGUgIT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgdGhlIHByb3BhZ2F0aW9uIHJvb3Qgd2hlbiBzY2hlZHVsaW5nIGNvbnRleHQgd29yay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VfZWFnZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcykge1xuXG4gIHZhciBmaWJlciA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIGlmIChmaWJlciAhPT0gbnVsbCkge1xuICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgIGZpYmVyLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG5leHRGaWJlciA9IHZvaWQgMDsgLy8gVmlzaXQgdGhpcyBmaWJlci5cblxuICAgIHZhciBsaXN0ID0gZmliZXIuZGVwZW5kZW5jaWVzO1xuXG4gICAgaWYgKGxpc3QgIT09IG51bGwpIHtcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgICAgdmFyIGRlcGVuZGVuY3kgPSBsaXN0LmZpcnN0Q29udGV4dDtcblxuICAgICAgd2hpbGUgKGRlcGVuZGVuY3kgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRleHQgbWF0Y2hlcy5cbiAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgICAgIC8vIE1hdGNoISBTY2hlZHVsZSBhbiB1cGRhdGUgb24gdGhpcyBmaWJlci5cbiAgICAgICAgICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBmb3JjZSB1cGRhdGUgb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MuXG4gICAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpO1xuICAgICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlOyAvLyBUT0RPOiBCZWNhdXNlIHdlIGRvbid0IGhhdmUgYSB3b3JrLWluLXByb2dyZXNzLCB0aGlzIHdpbGwgYWRkIHRoZVxuICAgICAgICAgICAgLy8gdXBkYXRlIHRvIHRoZSBjdXJyZW50IGZpYmVyLCB0b28sIHdoaWNoIG1lYW5zIGl0IHdpbGwgcGVyc2lzdCBldmVuIGlmXG4gICAgICAgICAgICAvLyB0aGlzIHJlbmRlciBpcyB0aHJvd24gYXdheS4gU2luY2UgaXQncyBhIHJhY2UgY29uZGl0aW9uLCBub3Qgc3VyZSBpdCdzXG4gICAgICAgICAgICAvLyB3b3J0aCBmaXhpbmcuXG4gICAgICAgICAgICAvLyBJbmxpbmVkIGBlbnF1ZXVlVXBkYXRlYCB0byByZW1vdmUgaW50ZXJsZWF2ZWQgdXBkYXRlIGNoZWNrXG5cbiAgICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIDsgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcbiAgICAgICAgICAgICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgICAgICAgICAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNoYXJlZFF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7IC8vIE1hcmsgdGhlIHVwZGF0ZWQgbGFuZXMgb24gdGhlIGxpc3QsIHRvby5cblxuICAgICAgICAgIGxpc3QubGFuZXMgPSBtZXJnZUxhbmVzKGxpc3QubGFuZXMsIHJlbmRlckxhbmVzKTsgLy8gU2luY2Ugd2UgYWxyZWFkeSBmb3VuZCBhIG1hdGNoLCB3ZSBjYW4gc3RvcCB0cmF2ZXJzaW5nIHRoZVxuICAgICAgICAgIC8vIGRlcGVuZGVuY3kgbGlzdC5cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGlzIGluIHRoaXMgc3VidHJlZSwgd2UgZG9uJ3Qga25vd1xuICAgICAgLy8gaWYgaXQgd2lsbCBoYXZlIGFueSBjb250ZXh0IGNvbnN1bWVycyBpbiBpdC4gVGhlIGJlc3Qgd2UgY2FuIGRvIGlzXG4gICAgICAvLyBtYXJrIGl0IGFzIGhhdmluZyB1cGRhdGVzLlxuICAgICAgdmFyIHBhcmVudFN1c3BlbnNlID0gZmliZXIucmV0dXJuO1xuXG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBqdXN0IGNhbWUgZnJvbSBhIHBhcmVudCBzbyB3ZSBtdXN0IGhhdmUgaGFkIGEgcGFyZW50LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRTdXNwZW5zZS5sYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50U3VzcGVuc2UubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfYWx0ZXJuYXRlID0gcGFyZW50U3VzcGVuc2UuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoX2FsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBfYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhfYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBwYXNzaW5nIHRoaXMgZmliZXIgYXMgdGhlIHBhcmVudFxuICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50IHRvIHNjaGVkdWxlIHRoaXMgZmliZXIgYXMgaGF2aW5nIHdvcmtcbiAgICAgIC8vIG9uIGl0cyBjaGlsZHJlbi4gV2UnbGwgdXNlIHRoZSBjaGlsZExhbmVzIG9uXG4gICAgICAvLyB0aGlzIGZpYmVyIHRvIGluZGljYXRlIHRoYXQgYSBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuXG5cbiAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgocGFyZW50U3VzcGVuc2UsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5zaWJsaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcmF2ZXJzZSBkb3duLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXIuY2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICBuZXh0RmliZXIucmV0dXJuID0gZmliZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNoaWxkLiBUcmF2ZXJzZSB0byBuZXh0IHNpYmxpbmcuXG4gICAgICBuZXh0RmliZXIgPSBmaWJlcjtcblxuICAgICAgd2hpbGUgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dEZpYmVyID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIC8vIFdlJ3JlIGJhY2sgdG8gdGhlIHJvb3Qgb2YgdGhpcyBzdWJ0cmVlLiBFeGl0LlxuICAgICAgICAgIG5leHRGaWJlciA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2libGluZyA9IG5leHRGaWJlci5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgc2libGluZyB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgICAgICBzaWJsaW5nLnJldHVybiA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICAgICAgbmV4dEZpYmVyID0gc2libGluZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSAvLyBObyBtb3JlIHNpYmxpbmdzLiBUcmF2ZXJzZSB1cC5cblxuXG4gICAgICAgIG5leHRGaWJlciA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBuZXh0RmliZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xuICB2YXIgZGVwZW5kZW5jaWVzID0gd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzO1xuXG4gIGlmIChkZXBlbmRlbmNpZXMgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICB2YXIgZmlyc3RDb250ZXh0ID0gZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dDtcblxuICAgICAgaWYgKGZpcnN0Q29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShkZXBlbmRlbmNpZXMubGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAgIC8vIENvbnRleHQgbGlzdCBoYXMgYSBwZW5kaW5nIHVwZGF0ZS4gTWFyayB0aGF0IHRoaXMgZmliZXIgcGVyZm9ybWVkIHdvcmsuXG4gICAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICAgICAgfSAvLyBSZXNldCB0aGUgd29yay1pbi1wcm9ncmVzcyBsaXN0XG5cblxuICAgICAgICBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlYWRDb250ZXh0KGNvbnRleHQpIHtcbiAge1xuICAgIC8vIFRoaXMgd2FybmluZyB3b3VsZCBmaXJlIGlmIHlvdSByZWFkIGNvbnRleHQgaW5zaWRlIGEgSG9vayBsaWtlIHVzZU1lbW8uXG4gICAgLy8gVW5saWtlIHRoZSBjbGFzcyBjaGVjayBiZWxvdywgaXQncyBub3QgZW5mb3JjZWQgaW4gcHJvZHVjdGlvbiBmb3IgcGVyZi5cbiAgICBpZiAoaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVikge1xuICAgICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB2YWx1ZSA9ICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgO1xuXG4gIGlmIChsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPT09IGNvbnRleHQpIDsgZWxzZSB7XG4gICAgdmFyIGNvbnRleHRJdGVtID0ge1xuICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIG1lbW9pemVkVmFsdWU6IHZhbHVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAobGFzdENvbnRleHREZXBlbmRlbmN5ID09PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICAgIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgZGVwZW5kZW5jeSBmb3IgdGhpcyBjb21wb25lbnQuIENyZWF0ZSBhIG5ldyBsaXN0LlxuXG5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGNvbnRleHRJdGVtO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIuZGVwZW5kZW5jaWVzID0ge1xuICAgICAgICBsYW5lczogTm9MYW5lcyxcbiAgICAgICAgZmlyc3RDb250ZXh0OiBjb250ZXh0SXRlbVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIGEgbmV3IGNvbnRleHQgaXRlbS5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGxhc3RDb250ZXh0RGVwZW5kZW5jeS5uZXh0ID0gY29udGV4dEl0ZW07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyByZW5kZXIuIFdoZW4gdGhpcyByZW5kZXIgZXhpdHMsIGVpdGhlciBiZWNhdXNlIGl0IGZpbmlzaGVzIG9yIGJlY2F1c2UgaXQgaXNcbi8vIGludGVycnVwdGVkLCB0aGUgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsIGJlIHRyYW5zZmVycmVkIG9udG8gdGhlIG1haW4gcGFydFxuLy8gb2YgdGhlIHF1ZXVlLlxuXG52YXIgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG5mdW5jdGlvbiBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKSB7XG4gIGlmIChjb25jdXJyZW50UXVldWVzID09PSBudWxsKSB7XG4gICAgY29uY3VycmVudFF1ZXVlcyA9IFtxdWV1ZV07XG4gIH0gZWxzZSB7XG4gICAgY29uY3VycmVudFF1ZXVlcy5wdXNoKHF1ZXVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpIHtcbiAgLy8gVHJhbnNmZXIgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgb250byB0aGUgbWFpbiBxdWV1ZS4gRWFjaCBxdWV1ZSBoYXMgYVxuICAvLyBgcGVuZGluZ2AgZmllbGQgYW5kIGFuIGBpbnRlcmxlYXZlZGAgZmllbGQuIFdoZW4gdGhleSBhcmUgbm90IG51bGwsIHRoZXlcbiAgLy8gcG9pbnQgdG8gdGhlIGxhc3Qgbm9kZSBpbiBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0LiBXZSBuZWVkIHRvIGFwcGVuZCB0aGVcbiAgLy8gaW50ZXJsZWF2ZWQgbGlzdCB0byB0aGUgZW5kIG9mIHRoZSBwZW5kaW5nIGxpc3QgYnkgam9pbmluZyB0aGVtIGludG8gYVxuICAvLyBzaW5nbGUsIGNpcmN1bGFyIGxpc3QuXG4gIGlmIChjb25jdXJyZW50UXVldWVzICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25jdXJyZW50UXVldWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVldWUgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgdmFyIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gICAgICBpZiAobGFzdEludGVybGVhdmVkVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLmludGVybGVhdmVkID0gbnVsbDtcbiAgICAgICAgdmFyIGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGUgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dDtcbiAgICAgICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcXVldWUucGVuZGluZztcblxuICAgICAgICBpZiAobGFzdFBlbmRpbmdVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgICAgICBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlQW5kRWFnZXJseUJhaWxvdXQoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50Q2xhc3NVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSkge1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufSAvLyBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBiZSBkb25lIGZvciBiYWNrd2FyZHNcbi8vIGNvbXBhdGliaWxpdHkgYW5kIHNob3VsZCBhbHdheXMgYmUgYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nLlxuXG52YXIgdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Q7XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KHNvdXJjZUZpYmVyLCBsYW5lKSB7XG4gIC8vIFVwZGF0ZSB0aGUgc291cmNlIGZpYmVyJ3MgbGFuZXNcbiAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBsYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIGxhbmUpO1xuICB9XG5cbiAge1xuICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgJiYgKHNvdXJjZUZpYmVyLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICB9XG4gIH0gLy8gV2FsayB0aGUgcGFyZW50IHBhdGggdG8gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMuXG5cblxuICB2YXIgbm9kZSA9IHNvdXJjZUZpYmVyO1xuICB2YXIgcGFyZW50ID0gc291cmNlRmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBwYXJlbnQuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50LmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIGFsdGVybmF0ZSA9IHBhcmVudC5hbHRlcm5hdGU7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIGlmICgocGFyZW50LmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gcGFyZW50O1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBpZiAobm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgdmFyIHJvb3QgPSBub2RlLnN0YXRlTm9kZTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgVXBkYXRlU3RhdGUgPSAwO1xudmFyIFJlcGxhY2VTdGF0ZSA9IDE7XG52YXIgRm9yY2VVcGRhdGUgPSAyO1xudmFyIENhcHR1cmVVcGRhdGUgPSAzOyAvLyBHbG9iYWwgc3RhdGUgdGhhdCBpcyByZXNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAuXG4vLyBJdCBzaG91bGQgb25seSBiZSByZWFkIHJpZ2h0IGFmdGVyIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAsIHZpYVxuLy8gYGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmdgLlxuXG52YXIgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlO1xudmFyIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZTtcblxue1xuICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gZmFsc2U7XG4gIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpemVVcGRhdGVRdWV1ZShmaWJlcikge1xuICB2YXIgcXVldWUgPSB7XG4gICAgYmFzZVN0YXRlOiBmaWJlci5tZW1vaXplZFN0YXRlLFxuICAgIGZpcnN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBsYXN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBzaGFyZWQ6IHtcbiAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICAgIGxhbmVzOiBOb0xhbmVzXG4gICAgfSxcbiAgICBlZmZlY3RzOiBudWxsXG4gIH07XG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG59XG5mdW5jdGlvbiBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIENsb25lIHRoZSB1cGRhdGUgcXVldWUgZnJvbSBjdXJyZW50LiBVbmxlc3MgaXQncyBhbHJlYWR5IGEgY2xvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgIHZhciBjbG9uZSA9IHtcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSxcbiAgICAgIGxhc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUsXG4gICAgICBzaGFyZWQ6IGN1cnJlbnRRdWV1ZS5zaGFyZWQsXG4gICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgIH07XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjbG9uZTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGV2ZW50VGltZTogZXZlbnRUaW1lLFxuICAgIGxhbmU6IGxhbmUsXG4gICAgdGFnOiBVcGRhdGVTdGF0ZSxcbiAgICBwYXlsb2FkOiBudWxsLFxuICAgIGNhbGxiYWNrOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBPbmx5IG9jY3VycyBpZiB0aGUgZmliZXIgaGFzIGJlZW4gdW5tb3VudGVkLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuXG4gIHtcbiAgICBpZiAoY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBzaGFyZWRRdWV1ZSAmJiAhZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSkge1xuICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgJyArICdmcm9tIGluc2lkZSBhbiB1cGRhdGUgZnVuY3Rpb24uIFVwZGF0ZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHB1cmUsICcgKyAnd2l0aCB6ZXJvIHNpZGUtZWZmZWN0cy4gQ29uc2lkZXIgdXNpbmcgY29tcG9uZW50RGlkVXBkYXRlIG9yIGEgJyArICdjYWxsYmFjay4nKTtcblxuICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzVW5zYWZlQ2xhc3NSZW5kZXJQaGFzZVVwZGF0ZSgpKSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1bnNhZmUgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gQWRkIGRpcmVjdGx5IHRvIHRoZSB1cGRhdGVcbiAgICAvLyBxdWV1ZSBzbyB3ZSBjYW4gcHJvY2VzcyBpdCBpbW1lZGlhdGVseSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyLlxuICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgfVxuXG4gICAgc2hhcmVkUXVldWUucGVuZGluZyA9IHVwZGF0ZTsgLy8gVXBkYXRlIHRoZSBjaGlsZExhbmVzIGV2ZW4gdGhvdWdoIHdlJ3JlIG1vc3QgbGlrZWx5IGFscmVhZHkgcmVuZGVyaW5nXG4gICAgLy8gdGhpcyBmaWJlci4gVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaW4gdGhlIGNhc2Ugd2hlcmUgeW91XG4gICAgLy8gdXBkYXRlIGEgZGlmZmVyZW50IGNvbXBvbmVudCBkdXJpbmcgcmVuZGVyIHBoYXNlIHRoYW4gdGhlIG9uZSB0aGF0IGlzXG4gICAgLy8gY3VycmVudGx5IHJlbmRlcmluZ3MgKGEgcGF0dGVybiB0aGF0IGlzIGFjY29tcGFuaWVkIGJ5IGEgd2FybmluZykuXG5cbiAgICByZXR1cm4gdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgc2hhcmVkUXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHNoYXJlZFF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5IG11c3RcbiAgICAvLyBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaCByZXByZXNlbnRzXG4gICAgLy8gYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW50YW5nbGVcbiAgICAvLyBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmIHdlICpkb24ndCpcbiAgICAvLyBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgc2hhcmVkUXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY2FwdHVyZWRVcGRhdGUpIHtcbiAgLy8gQ2FwdHVyZWQgdXBkYXRlcyBhcmUgdXBkYXRlcyB0aGF0IGFyZSB0aHJvd24gYnkgYSBjaGlsZCBkdXJpbmcgdGhlIHJlbmRlclxuICAvLyBwaGFzZS4gVGhleSBzaG91bGQgYmUgZGlzY2FyZGVkIGlmIHRoZSByZW5kZXIgaXMgYWJvcnRlZC4gVGhlcmVmb3JlLFxuICAvLyB3ZSBzaG91bGQgb25seSBwdXQgdGhlbSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSwgbm90IHRoZSBjdXJyZW50IG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7IC8vIENoZWNrIGlmIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIGEgY2xvbmUuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICAgIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgICAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlblxuICAgICAgLy8gd2UgYmFpbCBvdXQgb24gYSBwYXJlbnQgZmliZXIgdGhhdCB0aGVuIGNhcHR1cmVzIGFuIGVycm9yIHRocm93biBieVxuICAgICAgLy8gYSBjaGlsZC4gU2luY2Ugd2Ugd2FudCB0byBhcHBlbmQgdGhlIHVwZGF0ZSBvbmx5IHRvIHRoZSB3b3JrLWluXG4gICAgICAvLyAtcHJvZ3Jlc3MgcXVldWUsIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHVwZGF0ZXMuIFdlIHVzdWFsbHkgY2xvbmUgZHVyaW5nXG4gICAgICAvLyBwcm9jZXNzVXBkYXRlUXVldWUsIGJ1dCB0aGF0IGRpZG4ndCBoYXBwZW4gaW4gdGhpcyBjYXNlIGJlY2F1c2Ugd2VcbiAgICAgIC8vIHNraXBwZWQgb3ZlciB0aGUgcGFyZW50IHdoZW4gd2UgYmFpbGVkIG91dC5cbiAgICAgIHZhciBuZXdGaXJzdCA9IG51bGw7XG4gICAgICB2YXIgbmV3TGFzdCA9IG51bGw7XG4gICAgICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgdXBkYXRlcyBhbmQgY2xvbmUgdGhlbS5cbiAgICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGUuZXZlbnRUaW1lLFxuICAgICAgICAgICAgbGFuZTogdXBkYXRlLmxhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgICAgICBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCk7IC8vIEFwcGVuZCB0aGUgY2FwdHVyZWQgdXBkYXRlIHRoZSBlbmQgb2YgdGhlIGNsb25lZCBsaXN0LlxuXG5cbiAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgICBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBubyBiYXNlIHVwZGF0ZXMuXG4gICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSA9IHtcbiAgICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgICBmaXJzdEJhc2VVcGRhdGU6IG5ld0ZpcnN0LFxuICAgICAgICBsYXN0QmFzZVVwZGF0ZTogbmV3TGFzdCxcbiAgICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cblxuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gIH1cblxuICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIHByZXZTdGF0ZSwgbmV4dFByb3BzLCBpbnN0YW5jZSkge1xuICBzd2l0Y2ggKHVwZGF0ZS50YWcpIHtcbiAgICBjYXNlIFJlcGxhY2VTdGF0ZTpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICAgICAgfSAvLyBTdGF0ZSBvYmplY3RcblxuXG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYXB0dXJlVXBkYXRlOlxuICAgICAge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgfVxuICAgIC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFVwZGF0ZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgX3BheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcbiAgICAgICAgdmFyIHBhcnRpYWxTdGF0ZTtcblxuICAgICAgICBpZiAodHlwZW9mIF9wYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgX3BheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yY2VVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIGhhc0ZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmV2U3RhdGU7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgcHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIHtcbiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQ7XG4gIH1cblxuICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTsgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcy4gSWYgc28sIHRyYW5zZmVyIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG5cbiAgdmFyIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7IC8vIFRoZSBwZW5kaW5nIHF1ZXVlIGlzIGNpcmN1bGFyLiBEaXNjb25uZWN0IHRoZSBwb2ludGVyIGJldHdlZW4gZmlyc3RcbiAgICAvLyBhbmQgbGFzdCBzbyB0aGF0IGl0J3Mgbm9uLWNpcmN1bGFyLlxuXG4gICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsOyAvLyBBcHBlbmQgcGVuZGluZyB1cGRhdGVzIHRvIGJhc2UgcXVldWVcblxuICAgIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH1cblxuICAgIGxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7IC8vIElmIHRoZXJlJ3MgYSBjdXJyZW50IHF1ZXVlLCBhbmQgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgYmFzZSBxdWV1ZSwgdGhlblxuICAgIC8vIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlIHVwZGF0ZXMgdG8gdGhhdCBxdWV1ZSwgdG9vLiBCZWNhdXNlIHRoZSBiYXNlXG4gICAgLy8gcXVldWUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3Qgd2l0aCBubyBjeWNsZXMsIHdlIGNhbiBhcHBlbmQgdG8gYm90aFxuICAgIC8vIGxpc3RzIGFuZCB0YWtlIGFkdmFudGFnZSBvZiBzdHJ1Y3R1cmFsIHNoYXJpbmcuXG4gICAgLy8gVE9ETzogUGFzcyBgY3VycmVudGAgYXMgYXJndW1lbnRcblxuICAgIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgdmFyIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSAhPT0gbGFzdEJhc2VVcGRhdGUpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudExhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gVGhlc2UgdmFsdWVzIG1heSBjaGFuZ2UgYXMgd2UgcHJvY2VzcyB0aGUgcXVldWUuXG5cblxuICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHVwZGF0ZXMgdG8gY29tcHV0ZSB0aGUgcmVzdWx0LlxuICAgIHZhciBuZXdTdGF0ZSA9IHF1ZXVlLmJhc2VTdGF0ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmUgcmVuZGVyTGFuZXNcbiAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuICAgIHZhciBuZXdMYW5lcyA9IE5vTGFuZXM7XG4gICAgdmFyIG5ld0Jhc2VTdGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0xhc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHVwZGF0ZUxhbmUgPSB1cGRhdGUubGFuZTtcbiAgICAgIHZhciB1cGRhdGVFdmVudFRpbWUgPSB1cGRhdGUuZXZlbnRUaW1lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBjbG9uZTtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG5cblxuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIG5ld1N0YXRlID0gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBuZXdTdGF0ZSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdXBkYXRlLmNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiAvLyBJZiB0aGUgdXBkYXRlIHdhcyBhbHJlYWR5IGNvbW1pdHRlZCwgd2Ugc2hvdWxkIG5vdCBxdWV1ZSBpdHNcbiAgICAgICAgLy8gY2FsbGJhY2sgYWdhaW4uXG4gICAgICAgIHVwZGF0ZS5sYW5lICE9PSBOb0xhbmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAgIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzXG4gICAgLy8gYXJlIHJlbWFpbmluZy5cblxuICAgIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5zaGFyZWQuaW50ZXJsZWF2ZWQ7XG5cbiAgICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCBpbnRlcmxlYXZlZC5sYW5lKTtcbiAgICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gICAgfSBlbHNlIGlmIChmaXJzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAgcXVldWUuc2hhcmVkLmxhbmVzID0gTm9MYW5lcztcbiAgICB9IC8vIFNldCB0aGUgcmVtYWluaW5nIGV4cGlyYXRpb24gdGltZSB0byBiZSB3aGF0ZXZlciBpcyByZW1haW5pbmcgaW4gdGhlIHF1ZXVlLlxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIGZpbmUgYmVjYXVzZSB0aGUgb25seSB0d28gb3RoZXIgdGhpbmdzIHRoYXQgY29udHJpYnV0ZSB0b1xuICAgIC8vIGV4cGlyYXRpb24gdGltZSBhcmUgcHJvcHMgYW5kIGNvbnRleHQuIFdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiB0aGVcbiAgICAvLyBiZWdpbiBwaGFzZSBieSB0aGUgdGltZSB3ZSBzdGFydCBwcm9jZXNzaW5nIHRoZSBxdWV1ZSwgc28gd2UndmUgYWxyZWFkeVxuICAgIC8vIGRlYWx0IHdpdGggdGhlIHByb3BzLiBDb250ZXh0IGluIGNvbXBvbmVudHMgdGhhdCBzcGVjaWZ5XG4gICAgLy8gc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHRyaWNreTsgYnV0IHdlJ2xsIGhhdmUgdG8gYWNjb3VudCBmb3JcbiAgICAvLyB0aGF0IHJlZ2FyZGxlc3MuXG5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkICcgKyAoXCJyZWNlaXZlZDogXCIgKyBjYWxsYmFjaykpO1xuICB9XG5cbiAgY2FsbGJhY2suY2FsbChjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKSB7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkge1xuICByZXR1cm4gaGFzRm9yY2VVcGRhdGU7XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIGZpbmlzaGVkUXVldWUsIGluc3RhbmNlKSB7XG4gIC8vIENvbW1pdCB0aGUgZWZmZWN0c1xuICB2YXIgZWZmZWN0cyA9IGZpbmlzaGVkUXVldWUuZWZmZWN0cztcbiAgZmluaXNoZWRRdWV1ZS5lZmZlY3RzID0gbnVsbDtcblxuICBpZiAoZWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVmZmVjdCA9IGVmZmVjdHNbaV07XG4gICAgICB2YXIgY2FsbGJhY2sgPSBlZmZlY3QuY2FsbGJhY2s7XG5cbiAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICBlZmZlY3QuY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcbnZhciBjb250ZXh0U3RhY2tDdXJzb3IkMSA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciBjb250ZXh0RmliZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcblxuZnVuY3Rpb24gcmVxdWlyZWRDb250ZXh0KGMpIHtcbiAgaWYgKGMgPT09IE5PX0NPTlRFWFQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhvc3QgY29udGV4dCB0byBleGlzdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGM7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3RIb3N0Q29udGFpbmVyKCkge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICByZXR1cm4gcm9vdEluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdENvbnRhaW5lcihmaWJlciwgbmV4dFJvb3RJbnN0YW5jZSkge1xuICAvLyBQdXNoIGN1cnJlbnQgcm9vdCBpbnN0YW5jZSBvbnRvIHRoZSBzdGFjaztcbiAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcmVzZXQgcm9vdCB3aGVuIHBvcnRhbHMgYXJlIHBvcHBlZC5cbiAgcHVzaChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgbmV4dFJvb3RJbnN0YW5jZSwgZmliZXIpOyAvLyBUcmFjayB0aGUgY29udGV4dCBhbmQgdGhlIEZpYmVyIHRoYXQgcHJvdmlkZWQgaXQuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBwb3Agb25seSBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpOyAvLyBGaW5hbGx5LCB3ZSBuZWVkIHRvIHB1c2ggdGhlIGhvc3QgY29udGV4dCB0byB0aGUgc3RhY2suXG4gIC8vIEhvd2V2ZXIsIHdlIGNhbid0IGp1c3QgY2FsbCBnZXRSb290SG9zdENvbnRleHQoKSBhbmQgcHVzaCBpdCBiZWNhdXNlXG4gIC8vIHdlJ2QgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZW50cmllcyBvbiB0aGUgc3RhY2sgZGVwZW5kaW5nIG9uXG4gIC8vIHdoZXRoZXIgZ2V0Um9vdEhvc3RDb250ZXh0KCkgdGhyb3dzIHNvbWV3aGVyZSBpbiByZW5kZXJlciBjb2RlIG9yIG5vdC5cbiAgLy8gU28gd2UgcHVzaCBhbiBlbXB0eSB2YWx1ZSBmaXJzdC4gVGhpcyBsZXRzIHVzIHNhZmVseSB1bndpbmQgb24gZXJyb3JzLlxuXG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIE5PX0NPTlRFWFQsIGZpYmVyKTtcbiAgdmFyIG5leHRSb290Q29udGV4dCA9IGdldFJvb3RIb3N0Q29udGV4dChuZXh0Um9vdEluc3RhbmNlKTsgLy8gTm93IHRoYXQgd2Uga25vdyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdGhyb3csIHJlcGxhY2UgaXQuXG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRSb290Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGFpbmVyKGZpYmVyKSB7XG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgcG9wKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RDb250ZXh0KCkge1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGV4dChmaWJlcikge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZ2V0Q2hpbGRIb3N0Q29udGV4dChjb250ZXh0LCBmaWJlci50eXBlKTsgLy8gRG9uJ3QgcHVzaCB0aGlzIEZpYmVyJ3MgY29udGV4dCB1bmxlc3MgaXQncyB1bmlxdWUuXG5cbiAgaWYgKGNvbnRleHQgPT09IG5leHRDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG5cbiAgcHVzaChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dENvbnRleHQsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcG9wSG9zdENvbnRleHQoZmliZXIpIHtcbiAgLy8gRG8gbm90IHBvcCB1bmxlc3MgdGhpcyBGaWJlciBwcm92aWRlZCB0aGUgY3VycmVudCBjb250ZXh0LlxuICAvLyBwdXNoSG9zdENvbnRleHQoKSBvbmx5IHB1c2hlcyBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cbiAgaWYgKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGZpYmVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG52YXIgRGVmYXVsdFN1c3BlbnNlQ29udGV4dCA9IDA7IC8vIFRoZSBTdXNwZW5zZSBDb250ZXh0IGlzIHNwbGl0IGludG8gdHdvIHBhcnRzLiBUaGUgbG93ZXIgYml0cyBpc1xuLy8gaW5oZXJpdGVkIGRlZXBseSBkb3duIHRoZSBzdWJ0cmVlLiBUaGUgdXBwZXIgYml0cyBvbmx5IGFmZmVjdFxuLy8gdGhpcyBpbW1lZGlhdGUgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGdldHMgcmVzZXQgZWFjaCBuZXdcbi8vIGJvdW5kYXJ5IG9yIHN1c3BlbnNlIGxpc3QuXG5cbnZhciBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayA9IDE7IC8vIFN1YnRyZWUgRmxhZ3M6XG4vLyBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQgaW5kaWNhdGVzIHRoYXQgb25lIG9mIG91ciBwYXJlbnQgU3VzcGVuc2Vcbi8vIGJvdW5kYXJpZXMgaXMgbm90IGN1cnJlbnRseSBzaG93aW5nIHZpc2libGUgbWFpbiBjb250ZW50LlxuLy8gRWl0aGVyIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgb3IgaXMgbm90IG1vdW50ZWQgYXQgYWxsLlxuLy8gV2UgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiBpdCBpcyBkZXNpcmFibGUgdG8gdHJpZ2dlciBhIGZhbGxiYWNrIGF0XG4vLyB0aGUgcGFyZW50LiBJZiBub3QsIHRoZW4gd2UgbWlnaHQgbmVlZCB0byB0cmlnZ2VyIHVuZGVzaXJhYmxlIGJvdW5kYXJpZXNcbi8vIGFuZC9vciBzdXNwZW5kIHRoZSBjb21taXQgdG8gYXZvaWQgaGlkaW5nIHRoZSBwYXJlbnQgY29udGVudC5cblxudmFyIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCA9IDE7IC8vIFNoYWxsb3cgRmxhZ3M6XG4vLyBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgY2FuIGJlIHVzZWQgYnkgU3VzcGVuc2VMaXN0IHRvIGZvcmNlIG5ld2x5IGFkZGVkXG4vLyBpdGVtcyBpbnRvIHRoZWlyIGZhbGxiYWNrIHN0YXRlIGR1cmluZyBvbmUgb2YgdGhlIHJlbmRlciBwYXNzZXMuXG5cbnZhciBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgPSAyO1xudmFyIHN1c3BlbnNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoRGVmYXVsdFN1c3BlbnNlQ29udGV4dCk7XG5mdW5jdGlvbiBoYXNTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgZmxhZykge1xuICByZXR1cm4gKHBhcmVudENvbnRleHQgJiBmbGFnKSAhPT0gMDtcbn1cbmZ1bmN0aW9uIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzaztcbn1cbmZ1bmN0aW9uIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgc2hhbGxvd0NvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayB8IHNoYWxsb3dDb250ZXh0O1xufVxuZnVuY3Rpb24gYWRkU3VidHJlZVN1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzdWJ0cmVlQ29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCB8IHN1YnRyZWVDb250ZXh0O1xufVxuZnVuY3Rpb24gcHVzaFN1c3BlbnNlQ29udGV4dChmaWJlciwgbmV3Q29udGV4dCkge1xuICBwdXNoKHN1c3BlbnNlU3RhY2tDdXJzb3IsIG5ld0NvbnRleHQsIGZpYmVyKTtcbn1cbmZ1bmN0aW9uIHBvcFN1c3BlbnNlQ29udGV4dChmaWJlcikge1xuICBwb3Aoc3VzcGVuc2VTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRDYXB0dXJlU3VzcGVuc2Uod29ya0luUHJvZ3Jlc3MsIGhhc0ludmlzaWJsZVBhcmVudCkge1xuICAvLyBJZiBpdCB3YXMgdGhlIHByaW1hcnkgY2hpbGRyZW4gdGhhdCBqdXN0IHN1c3BlbmRlZCwgY2FwdHVyZSBhbmQgcmVuZGVyIHRoZVxuICAvLyBmYWxsYmFjay4gT3RoZXJ3aXNlLCBkb24ndCBjYXB0dXJlIGFuZCBidWJibGUgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmV4dFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbHdheXMgY2FwdHVyZXMuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzOyAvLyBSZWd1bGFyIGJvdW5kYXJpZXMgYWx3YXlzIGNhcHR1cmUuXG5cbiAge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIGl0J3MgYSBib3VuZGFyeSB3ZSBzaG91bGQgYXZvaWQsIHRoZW4gd2UgcHJlZmVyIHRvIGJ1YmJsZSB1cCB0byB0aGVcbn1cbmZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgdmFyIG5vZGUgPSByb3c7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgZGVoeWRyYXRlZCA9IHN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKGRlaHlkcmF0ZWQgPT09IG51bGwgfHwgaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhkZWh5ZHJhdGVkKSB8fCBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhkZWh5ZHJhdGVkKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50ICYmIC8vIHJldmVhbE9yZGVyIHVuZGVmaW5lZCBjYW4ndCBiZSB0cnVzdGVkIGJlY2F1c2UgaXQgZG9uJ3RcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaXQgc3VzcGVuZGVkIG9yIG5vdC5cbiAgICBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRpZFN1c3BlbmQgPSAobm9kZS5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgTm9GbGFncyQxID1cbi8qICAgKi9cbjA7IC8vIFJlcHJlc2VudHMgd2hldGhlciBlZmZlY3Qgc2hvdWxkIGZpcmUuXG5cbnZhciBIYXNFZmZlY3QgPVxuLyogKi9cbjE7IC8vIFJlcHJlc2VudHMgdGhlIHBoYXNlIGluIHdoaWNoIHRoZSBlZmZlY3QgKG5vdCB0aGUgY2xlYW4tdXApIGZpcmVzLlxuXG52YXIgSW5zZXJ0aW9uID1cbi8qICAqL1xuMjtcbnZhciBMYXlvdXQgPVxuLyogICAgKi9cbjQ7XG52YXIgUGFzc2l2ZSQxID1cbi8qICAgKi9cbjg7XG5cbi8vIGFuZCBzaG91bGQgYmUgcmVzZXQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IHJlbmRlci5cbi8vIFRoaXMgdHJhY2tzIHdoaWNoIG11dGFibGUgc291cmNlcyBuZWVkIHRvIGJlIHJlc2V0IGFmdGVyIGEgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NTb3VyY2VzID0gW107XG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG11dGFibGVTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzc1NvdXJjZXNbaV07XG5cbiAgICB7XG4gICAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoID0gMDtcbn1cbi8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2ZXJzaW9uIHVzZWQgZm9yIHNlcnZlciByZW5kZXJpbmcgbWF0Y2hlcyB0aGUgb25lXG4vLyB0aGF0IGlzIGV2ZW50dWFsbHkgcmVhZCBkdXJpbmcgaHlkcmF0aW9uLlxuLy8gSWYgdGhleSBkb24ndCBtYXRjaCB0aGVyZSdzIGEgcG90ZW50aWFsIHRlYXIgYW5kIGEgZnVsbCBkZW9wdCByZW5kZXIgaXMgcmVxdWlyZWQuXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKSB7XG4gIHZhciBnZXRWZXJzaW9uID0gbXV0YWJsZVNvdXJjZS5fZ2V0VmVyc2lvbjtcbiAgdmFyIHZlcnNpb24gPSBnZXRWZXJzaW9uKG11dGFibGVTb3VyY2UuX3NvdXJjZSk7IC8vIFRPRE8gQ2xlYXIgdGhpcyBkYXRhIG9uY2UgYWxsIHBlbmRpbmcgaHlkcmF0aW9uIHdvcmsgaXMgZmluaXNoZWQuXG4gIC8vIFJldGFpbmluZyBpdCBmb3JldmVyIG1heSBpbnRlcmZlcmUgd2l0aCBHQy5cblxuICBpZiAocm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID09IG51bGwpIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBbbXV0YWJsZVNvdXJjZSwgdmVyc2lvbl07XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2gobXV0YWJsZVNvdXJjZSwgdmVyc2lvbik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudDtcbnZhciBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdDtcblxue1xuICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG59XG5cbi8vIFRoZXNlIGFyZSBzZXQgcmlnaHQgYmVmb3JlIGNhbGxpbmcgdGhlIGNvbXBvbmVudC5cbnZhciByZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBJJ3ZlIG5hbWVkIGl0IGRpZmZlcmVudGx5IHRvIGRpc3Rpbmd1aXNoIGl0IGZyb21cbi8vIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDsgLy8gSG9va3MgYXJlIHN0b3JlZCBhcyBhIGxpbmtlZCBsaXN0IG9uIHRoZSBmaWJlcidzIG1lbW9pemVkU3RhdGUgZmllbGQuIFRoZVxuLy8gY3VycmVudCBob29rIGxpc3QgaXMgdGhlIGxpc3QgdGhhdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IGZpYmVyLiBUaGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBsaXN0IGlzIGEgbmV3IGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBmaWJlci5cblxudmFyIGN1cnJlbnRIb29rID0gbnVsbDtcbnZhciB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsOyAvLyBXaGV0aGVyIGFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpc1xuLy8gZG9lcyBub3QgZ2V0IHJlc2V0IGlmIHdlIGRvIGFub3RoZXIgcmVuZGVyIHBhc3M7IG9ubHkgd2hlbiB3ZSdyZSBjb21wbGV0ZWx5XG4vLyBmaW5pc2hlZCBldmFsdWF0aW5nIHRoaXMgY29tcG9uZW50LiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBzbyB3ZSBrbm93XG4vLyB3aGV0aGVyIHdlIG5lZWQgdG8gY2xlYXIgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYWZ0ZXIgYSB0aHJvdy5cblxudmFyIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gV2hlcmUgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb25seSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MuIFRoaXNcbi8vIGdldHMgcmVzZXQgYWZ0ZXIgZWFjaCBhdHRlbXB0LlxuLy8gVE9ETzogTWF5YmUgdGhlcmUncyBzb21lIHdheSB0byBjb25zb2xpZGF0ZSB0aGlzIHdpdGhcbi8vIGBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlYC4gT3Igd2l0aCBgbnVtYmVyT2ZSZVJlbmRlcnNgLlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7IC8vIENvdW50cyB0aGUgbnVtYmVyIG9mIHVzZUlkIGhvb2tzIGluIHRoaXMgY29tcG9uZW50LlxuXG52YXIgbG9jYWxJZENvdW50ZXIgPSAwOyAvLyBVc2VkIGZvciBpZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGNvbXBsZXRlbHkgY2xpZW50LXNpZGUgKGkuZS4gbm90IGR1cmluZ1xuLy8gaHlkcmF0aW9uKS4gVGhpcyBjb3VudGVyIGlzIGdsb2JhbCwgc28gY2xpZW50IGlkcyBhcmUgbm90IHN0YWJsZSBhY3Jvc3Ncbi8vIHJlbmRlciBhdHRlbXB0cy5cblxudmFyIGdsb2JhbENsaWVudElkQ291bnRlciA9IDA7XG52YXIgUkVfUkVOREVSX0xJTUlUID0gMjU7IC8vIEluIERFViwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBwcmltaXRpdmUgaG9va1xuXG52YXIgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsOyAvLyBJbiBERVYsIHRoaXMgbGlzdCBlbnN1cmVzIHRoYXQgaG9va3MgYXJlIGNhbGxlZCBpbiB0aGUgc2FtZSBvcmRlciBiZXR3ZWVuIHJlbmRlcnMuXG4vLyBUaGUgbGlzdCBzdG9yZXMgdGhlIG9yZGVyIG9mIGhvb2tzIHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsIHJlbmRlciAobW91bnQpLlxuLy8gU3Vic2VxdWVudCByZW5kZXJzICh1cGRhdGVzKSByZWZlcmVuY2UgdGhpcyBsaXN0LlxuXG52YXIgaG9va1R5cGVzRGV2ID0gbnVsbDtcbnZhciBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBJbiBERVYsIHRoaXMgdHJhY2tzIHdoZXRoZXIgY3VycmVudGx5IHJlbmRlcmluZyBjb21wb25lbnQgbmVlZHMgdG8gaWdub3JlXG4vLyB0aGUgZGVwZW5kZW5jaWVzIGZvciBIb29rcyB0aGF0IG5lZWQgdGhlbSAoZS5nLiB1c2VFZmZlY3Qgb3IgdXNlTWVtbykuXG4vLyBXaGVuIHRydWUsIHN1Y2ggSG9va3Mgd2lsbCBhbHdheXMgYmUgXCJyZW1vdW50ZWRcIi4gT25seSB1c2VkIGR1cmluZyBob3QgcmVsb2FkLlxuXG52YXIgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcblxuZnVuY3Rpb24gbW91bnRIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgPT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc0RldiA9IFtob29rTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tUeXBlc0Rldi5wdXNoKGhvb2tOYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldisrO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2W2hvb2tUeXBlc1VwZGF0ZUluZGV4RGV2XSAhPT0gaG9va05hbWUpIHtcbiAgICAgICAgd2Fybk9uSG9va01pc21hdGNoSW5EZXYoaG9va05hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKSB7XG4gIHtcbiAgICBpZiAoZGVwcyAhPT0gdW5kZWZpbmVkICYmIGRlcHMgIT09IG51bGwgJiYgIWlzQXJyYXkoZGVwcykpIHtcbiAgICAgIC8vIFZlcmlmeSBkZXBzLCBidXQgb25seSBvbiBtb3VudCB0byBhdm9pZCBleHRyYSBjaGVja3MuXG4gICAgICAvLyBJdCdzIHVubGlrZWx5IHRoZWlyIHR5cGUgd291bGQgY2hhbmdlIGFzIHVzdWFsbHkgeW91IGRlZmluZSB0aGVtIGlubGluZS5cbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IHRoYXQgaXMgbm90IGFuIGFycmF5IChpbnN0ZWFkLCByZWNlaXZlZCBgJXNgKS4gV2hlbiAnICsgJ3NwZWNpZmllZCwgdGhlIGZpbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkuJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIHR5cGVvZiBkZXBzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uSG9va01pc21hdGNoSW5EZXYoY3VycmVudEhvb2tOYW1lKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSk7XG5cbiAgICBpZiAoIWRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHRhYmxlID0gJyc7XG4gICAgICAgIHZhciBzZWNvbmRDb2x1bW5TdGFydCA9IDMwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHtcbiAgICAgICAgICB2YXIgb2xkSG9va05hbWUgPSBob29rVHlwZXNEZXZbaV07XG4gICAgICAgICAgdmFyIG5ld0hvb2tOYW1lID0gaSA9PT0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPyBjdXJyZW50SG9va05hbWUgOiBvbGRIb29rTmFtZTtcbiAgICAgICAgICB2YXIgcm93ID0gaSArIDEgKyBcIi4gXCIgKyBvbGRIb29rTmFtZTsgLy8gRXh0cmEgc3BhY2Ugc28gc2Vjb25kIGNvbHVtbiBsaW5lcyB1cFxuICAgICAgICAgIC8vIGxvbCBAIElFIG5vdCBzdXBwb3J0aW5nIFN0cmluZyNyZXBlYXRcblxuICAgICAgICAgIHdoaWxlIChyb3cubGVuZ3RoIDwgc2Vjb25kQ29sdW1uU3RhcnQpIHtcbiAgICAgICAgICAgIHJvdyArPSAnICc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm93ICs9IG5ld0hvb2tOYW1lICsgJ1xcbic7XG4gICAgICAgICAgdGFibGUgKz0gcm93O1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJ1JlYWN0IGhhcyBkZXRlY3RlZCBhIGNoYW5nZSBpbiB0aGUgb3JkZXIgb2YgSG9va3MgY2FsbGVkIGJ5ICVzLiAnICsgJ1RoaXMgd2lsbCBsZWFkIHRvIGJ1Z3MgYW5kIGVycm9ycyBpZiBub3QgZml4ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgdGhlIFJ1bGVzIG9mIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3NcXG5cXG4nICsgJyAgIFByZXZpb3VzIHJlbmRlciAgICAgICAgICAgIE5leHQgcmVuZGVyXFxuJyArICcgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4nICsgJyVzJyArICcgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cXG4nLCBjb21wb25lbnROYW1lLCB0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93SW52YWxpZEhvb2tFcnJvcigpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG59XG5cbmZ1bmN0aW9uIGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpIHtcbiAge1xuICAgIGlmIChpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcykge1xuICAgICAgLy8gT25seSB0cnVlIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgYmVpbmcgaG90IHJlbG9hZGVkLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcmV2RGVwcyA9PT0gbnVsbCkge1xuICAgIHtcbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IG5vdCBkdXJpbmcgJyArICd0aGUgcHJldmlvdXMgcmVuZGVyLiBFdmVuIHRob3VnaCB0aGUgZmluYWwgYXJndW1lbnQgaXMgb3B0aW9uYWwsICcgKyAnaXRzIHR5cGUgY2Fubm90IGNoYW5nZSBiZXR3ZWVuIHJlbmRlcnMuJywgY3VycmVudEhvb2tOYW1lSW5EZXYpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCBib3RoZXIgY29tcGFyaW5nIGxlbmd0aHMgaW4gcHJvZCBiZWNhdXNlIHRoZXNlIGFycmF5cyBzaG91bGQgYmVcbiAgICAvLyBwYXNzZWQgaW5saW5lLlxuICAgIGlmIChuZXh0RGVwcy5sZW5ndGggIT09IHByZXZEZXBzLmxlbmd0aCkge1xuICAgICAgZXJyb3IoJ1RoZSBmaW5hbCBhcmd1bWVudCBwYXNzZWQgdG8gJXMgY2hhbmdlZCBzaXplIGJldHdlZW4gcmVuZGVycy4gVGhlICcgKyAnb3JkZXIgYW5kIHNpemUgb2YgdGhpcyBhcnJheSBtdXN0IHJlbWFpbiBjb25zdGFudC5cXG5cXG4nICsgJ1ByZXZpb3VzOiAlc1xcbicgKyAnSW5jb21pbmc6ICVzJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIFwiW1wiICsgcHJldkRlcHMuam9pbignLCAnKSArIFwiXVwiLCBcIltcIiArIG5leHREZXBzLmpvaW4oJywgJykgKyBcIl1cIik7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2RGVwcy5sZW5ndGggJiYgaSA8IG5leHREZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG9iamVjdElzKG5leHREZXBzW2ldLCBwcmV2RGVwc1tpXSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZywgbmV4dFJlbmRlckxhbmVzKSB7XG4gIHJlbmRlckxhbmVzID0gbmV4dFJlbmRlckxhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcyA6IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gVXNlZCBmb3IgaG90IHJlbG9hZGluZzpcblxuICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnR5cGUgIT09IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlc2V0XG4gIC8vIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgLy8gd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgLy8gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG4gIC8vIFRPRE8gV2FybiBpZiBubyBob29rcyBhcmUgdXNlZCBhdCBhbGwgZHVyaW5nIG1vdW50LCB0aGVuIHNvbWUgYXJlIHVzZWQgZHVyaW5nIHVwZGF0ZS5cbiAgLy8gQ3VycmVudGx5IHdlIHdpbGwgaWRlbnRpZnkgdGhlIHVwZGF0ZSByZW5kZXIgYXMgYSBtb3VudCBiZWNhdXNlIG1lbW9pemVkU3RhdGUgPT09IG51bGwuXG4gIC8vIFRoaXMgaXMgdHJpY2t5IGJlY2F1c2UgaXQncyB2YWxpZCBmb3IgY2VydGFpbiB0eXBlcyBvZiBjb21wb25lbnRzIChlLmcuIFJlYWN0LmxhenkpXG4gIC8vIFVzaW5nIG1lbW9pemVkU3RhdGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1vdW50L3VwZGF0ZSBvbmx5IHdvcmtzIGlmIGF0IGxlYXN0IG9uZSBzdGF0ZWZ1bCBob29rIGlzIHVzZWQuXG4gIC8vIE5vbi1zdGF0ZWZ1bCBob29rcyAoZS5nLiBjb250ZXh0KSBkb24ndCBnZXQgYWRkZWQgdG8gbWVtb2l6ZWRTdGF0ZSxcbiAgLy8gc28gbWVtb2l6ZWRTdGF0ZSB3b3VsZCBiZSBudWxsIGR1cmluZyB1cGRhdGVzIGFuZCBtb3VudHMuXG5cbiAge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgIH0gZWxzZSBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgaGFuZGxlcyBhbiBlZGdlIGNhc2Ugd2hlcmUgYSBjb21wb25lbnQgaXMgdXBkYXRpbmcsXG4gICAgICAvLyBidXQgbm8gc3RhdGVmdWwgaG9va3MgaGF2ZSBiZWVuIHVzZWQuXG4gICAgICAvLyBXZSB3YW50IHRvIG1hdGNoIHRoZSBwcm9kdWN0aW9uIGNvZGUgYmVoYXZpb3IgKHdoaWNoIHdpbGwgdXNlIEhvb2tzRGlzcGF0Y2hlck9uTW91bnQpLFxuICAgICAgLy8gYnV0IHdpdGggdGhlIGV4dHJhIERFViB2YWxpZGF0aW9uIHRvIGVuc3VyZSBob29rcyBvcmRlcmluZyBoYXNuJ3QgY2hhbmdlZC5cbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBkb2VzIHRoYXQuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTsgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZVxuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpIHtcbiAgICAvLyBLZWVwIHJlbmRlcmluZyBpbiBhIGxvb3AgZm9yIGFzIGxvbmcgYXMgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgY29udGludWUgdG9cbiAgICAvLyBiZSBzY2hlZHVsZWQuIFVzZSBhIGNvdW50ZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy5cbiAgICB2YXIgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gICAgICBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgICAgIGlmIChudW1iZXJPZlJlUmVuZGVycyA+PSBSRV9SRU5ERVJfTElNSVQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgJyArICdhbiBpbmZpbml0ZSBsb29wLicpO1xuICAgICAgfVxuXG4gICAgICBudW1iZXJPZlJlUmVuZGVycyArPSAxO1xuXG4gICAgICB7XG4gICAgICAgIC8vIEV2ZW4gd2hlbiBob3QgcmVsb2FkaW5nLCBhbGxvdyBkZXBlbmRlbmNpZXMgdG8gc3RhYmlsaXplXG4gICAgICAgIC8vIGFmdGVyIGZpcnN0IHJlbmRlciB0byBwcmV2ZW50IGluZmluaXRlIHJlbmRlciBwaGFzZSB1cGRhdGVzLlxuICAgICAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuICAgICAgfSAvLyBTdGFydCBvdmVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXG5cbiAgICAgIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gQWxzbyB2YWxpZGF0ZSBob29rIG9yZGVyIGZvciBjYXNjYWRpbmcgdXBkYXRlcy5cbiAgICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICAgIH1cblxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWIDtcbiAgICAgIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpO1xuICAgIH0gd2hpbGUgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyk7XG4gIH0gLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG5cblxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gaG9va1R5cGVzRGV2O1xuICB9IC8vIFRoaXMgY2hlY2sgdXNlcyBjdXJyZW50SG9vayBzbyB0aGF0IGl0IHdvcmtzIHRoZSBzYW1lIGluIERFViBhbmQgcHJvZCBidW5kbGVzLlxuICAvLyBob29rVHlwZXNEZXYgY291bGQgY2F0Y2ggbW9yZSBjYXNlcyAoZS5nLiBjb250ZXh0KSBidXQgb25seSBpbiBERVYgYnVuZGxlcy5cblxuXG4gIHZhciBkaWRSZW5kZXJUb29GZXdIb29rcyA9IGN1cnJlbnRIb29rICE9PSBudWxsICYmIGN1cnJlbnRIb29rLm5leHQgIT09IG51bGw7XG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gQ29uZmlybSB0aGF0IGEgc3RhdGljIGZsYWcgd2FzIG5vdCBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZSBsYXN0XG4gICAgLy8gcmVuZGVyLiBJZiB0aGlzIGZpcmVzLCBpdCBzdWdnZXN0cyB0aGF0IHdlIGluY29ycmVjdGx5IHJlc2V0IHRoZSBzdGF0aWNcbiAgICAvLyBmbGFncyBpbiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIGNvZGViYXNlLiBUaGlzIGhhcyBoYXBwZW5lZCBiZWZvcmUsIGZvclxuICAgIC8vIGV4YW1wbGUsIGluIHRoZSBTdXNwZW5zZUxpc3QgaW1wbGVtZW50YXRpb24uXG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2spICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTdGF0aWNNYXNrKSAmJiAvLyBEaXNhYmxlIHRoaXMgd2FybmluZyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBsZWdhY3kgU3VzcGVuc2UgaXMgd2VpcmRcbiAgICAvLyBhbmQgY3JlYXRlcyBmYWxzZSBwb3NpdGl2ZXMuIFRvIG1ha2UgdGhpcyB3b3JrIGluIGxlZ2FjeSBtb2RlLCB3ZSdkXG4gICAgLy8gbmVlZCB0byBtYXJrIGZpYmVycyB0aGF0IGNvbW1pdCBpbiBhbiBpbmNvbXBsZXRlIHN0YXRlLCBzb21laG93LiBGb3JcbiAgICAvLyBub3cgSSdsbCBkaXNhYmxlIHRoZSB3YXJuaW5nIHRoYXQgbW9zdCBvZiB0aGUgYnVncyB0aGF0IHdvdWxkIHRyaWdnZXJcbiAgICAvLyBpdCBhcmUgZWl0aGVyIGV4Y2x1c2l2ZSB0byBjb25jdXJyZW50IG1vZGUgb3IgZXhpc3QgaW4gYm90aC5cbiAgICAoY3VycmVudC5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogRXhwZWN0ZWQgc3RhdGljIGZsYWcgd2FzIG1pc3NpbmcuIFBsZWFzZSAnICsgJ25vdGlmeSB0aGUgUmVhY3QgdGVhbS4nKTtcbiAgICB9XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7IC8vIFRoaXMgaXMgcmVzZXQgYnkgY2hlY2tEaWRSZW5kZXJJZEhvb2tcbiAgLy8gbG9jYWxJZENvdW50ZXIgPSAwO1xuXG4gIGlmIChkaWRSZW5kZXJUb29GZXdIb29rcykge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgZmV3ZXIgaG9va3MgdGhhbiBleHBlY3RlZC4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGFuIGFjY2lkZW50YWwgJyArICdlYXJseSByZXR1cm4gc3RhdGVtZW50LicpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuZnVuY3Rpb24gY2hlY2tEaWRSZW5kZXJJZEhvb2soKSB7XG4gIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBldmVyeSByZW5kZXJXaXRoSG9va3MgY2FsbC5cbiAgLy8gQ29uY2VwdHVhbGx5LCBpdCdzIHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiByZW5kZXJXaXRoSG9va3M7IGl0J3Mgb25seSBhXG4gIC8vIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIHVzaW5nIGFuIGFycmF5IHR1cGxlLlxuICB2YXIgZGlkUmVuZGVySWRIb29rID0gbG9jYWxJZENvdW50ZXIgIT09IDA7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgcmV0dXJuIGRpZFJlbmRlcklkSG9vaztcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIHJlc2V0IHRoZSBmbGFncyBoZXJlLCBiZWNhdXNlIHRoZXkncmUgcmVzZXQgaW4gdGhlXG4gIC8vIGNvbXBsZXRlIHBoYXNlIChidWJibGVQcm9wZXJ0aWVzKS5cblxuICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KE1vdW50UGFzc2l2ZURldiB8IE1vdW50TGF5b3V0RGV2IHwgUGFzc2l2ZSB8IFVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfihQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfVxuXG4gIGN1cnJlbnQubGFuZXMgPSByZW1vdmVMYW5lcyhjdXJyZW50LmxhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiByZXNldEhvb2tzQWZ0ZXJUaHJvdygpIHtcbiAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlKSB7XG4gICAgLy8gVGhlcmUgd2VyZSByZW5kZXIgcGhhc2UgdXBkYXRlcy4gVGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIHRoaXMgcmVuZGVyXG4gICAgLy8gcGhhc2UsIHdoaWNoIHdlIGFyZSBub3cgYWJvcnRpbmcuIFJlbW92ZSB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZXMgc29cbiAgICAvLyB0aGV5IGRvIG5vdCBwZXJzaXN0IHRvIHRoZSBuZXh0IHJlbmRlci4gRG8gbm90IHJlbW92ZSB1cGRhdGVzIGZyb20gaG9va3NcbiAgICAvLyB0aGF0IHdlcmVuJ3QgcHJvY2Vzc2VkLlxuICAgIC8vXG4gICAgLy8gT25seSByZXNldCB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZSBpZiBpdCBoYXMgYSBjbG9uZS4gSWYgaXQgZG9lc1xuICAgIC8vIG5vdCBoYXZlIGEgY2xvbmUsIHRoYXQgbWVhbnMgaXQgd2Fzbid0IHByb2Nlc3NlZCwgYW5kIHRoZSB1cGRhdGVzIHdlcmVcbiAgICAvLyBzY2hlZHVsZWQgYmVmb3JlIHdlIGVudGVyZWQgdGhlIHJlbmRlciBwaGFzZS5cbiAgICB2YXIgaG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhvb2sgPSBob29rLm5leHQ7XG4gICAgfVxuXG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2UgPSBmYWxzZTtcbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlO1xuICBsb2NhbElkQ291bnRlciA9IDA7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICB2YXIgaG9vayA9IHtcbiAgICBtZW1vaXplZFN0YXRlOiBudWxsLFxuICAgIGJhc2VTdGF0ZTogbnVsbCxcbiAgICBiYXNlUXVldWU6IG51bGwsXG4gICAgcXVldWU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gaG9vaztcbiAgfSBlbHNlIHtcbiAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gaG9vaztcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJvdGggZm9yIHVwZGF0ZXMgYW5kIGZvciByZS1yZW5kZXJzIHRyaWdnZXJlZCBieSBhXG4gIC8vIHJlbmRlciBwaGFzZSB1cGRhdGUuIEl0IGFzc3VtZXMgdGhlcmUgaXMgZWl0aGVyIGEgY3VycmVudCBob29rIHdlIGNhblxuICAvLyBjbG9uZSwgb3IgYSB3b3JrLWluLXByb2dyZXNzIGhvb2sgZnJvbSBhIHByZXZpb3VzIHJlbmRlciBwYXNzIHRoYXQgd2UgY2FuXG4gIC8vIHVzZSBhcyBhIGJhc2UuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgYmFzZSBsaXN0LCB3ZSBtdXN0IHN3aXRjaCB0b1xuICAvLyB0aGUgZGlzcGF0Y2hlciB1c2VkIGZvciBtb3VudHMuXG4gIHZhciBuZXh0Q3VycmVudEhvb2s7XG5cbiAgaWYgKGN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gIH1cblxuICB2YXIgbmV4dFdvcmtJblByb2dyZXNzSG9vaztcblxuICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gIH1cblxuICBpZiAobmV4dFdvcmtJblByb2dyZXNzSG9vayAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlJ3MgYWxyZWFkeSBhIHdvcmstaW4tcHJvZ3Jlc3MuIFJldXNlIGl0LlxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2s7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICB9IGVsc2Uge1xuICAgIC8vIENsb25lIGZyb20gdGhlIGN1cnJlbnQgaG9vay5cbiAgICBpZiAobmV4dEN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIG1vcmUgaG9va3MgdGhhbiBkdXJpbmcgdGhlIHByZXZpb3VzIHJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgICB2YXIgbmV3SG9vayA9IHtcbiAgICAgIG1lbW9pemVkU3RhdGU6IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUsXG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRIb29rLmJhc2VTdGF0ZSxcbiAgICAgIGJhc2VRdWV1ZTogY3VycmVudEhvb2suYmFzZVF1ZXVlLFxuICAgICAgcXVldWU6IGN1cnJlbnRIb29rLnF1ZXVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0LlxuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gbmV3SG9vaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG4gICAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCA9IG5ld0hvb2s7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBsYXN0RWZmZWN0OiBudWxsLFxuICAgIHN0b3JlczogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaW5pdGlhbFN0YXRlO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICB9IGVsc2Uge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogcmVkdWNlcixcbiAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gIH07XG4gIGhvb2sucXVldWUgPSBxdWV1ZTtcbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaFJlZHVjZXJBY3Rpb24uYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50ID0gY3VycmVudEhvb2s7IC8vIFRoZSBsYXN0IHJlYmFzZSB1cGRhdGUgdGhhdCBpcyBOT1QgcGFydCBvZiB0aGUgYmFzZSBzdGF0ZS5cblxuICB2YXIgYmFzZVF1ZXVlID0gY3VycmVudC5iYXNlUXVldWU7IC8vIFRoZSBsYXN0IHBlbmRpbmcgdXBkYXRlIHRoYXQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldC5cblxuICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gV2UgaGF2ZSBuZXcgdXBkYXRlcyB0aGF0IGhhdmVuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuICAgIC8vIFdlJ2xsIGFkZCB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuICAgIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAgIC8vIE1lcmdlIHRoZSBwZW5kaW5nIHF1ZXVlIGFuZCB0aGUgYmFzZSBxdWV1ZS5cbiAgICAgIHZhciBiYXNlRmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICAgIHZhciBwZW5kaW5nRmlyc3QgPSBwZW5kaW5nUXVldWUubmV4dDtcbiAgICAgIGJhc2VRdWV1ZS5uZXh0ID0gcGVuZGluZ0ZpcnN0O1xuICAgICAgcGVuZGluZ1F1ZXVlLm5leHQgPSBiYXNlRmlyc3Q7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGN1cnJlbnQuYmFzZVF1ZXVlICE9PSBiYXNlUXVldWUpIHtcbiAgICAgICAgLy8gSW50ZXJuYWwgaW52YXJpYW50IHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGZlYXNpYmx5IGNvdWxkIGluXG4gICAgICAgIC8vIHRoZSBmdXR1cmUgaWYgd2UgaW1wbGVtZW50IHJlc3VtaW5nLCBvciBzb21lIGZvcm0gb2YgdGhhdC5cbiAgICAgICAgZXJyb3IoJ0ludGVybmFsIGVycm9yOiBFeHBlY3RlZCB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIHRvIGJlIGEgY2xvbmUuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdXJyZW50LmJhc2VRdWV1ZSA9IGJhc2VRdWV1ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIGEgcXVldWUgdG8gcHJvY2Vzcy5cbiAgICB2YXIgZmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICB2YXIgbmV3U3RhdGUgPSBjdXJyZW50LmJhc2VTdGF0ZTtcbiAgICB2YXIgbmV3QmFzZVN0YXRlID0gbnVsbDtcbiAgICB2YXIgbmV3QmFzZVF1ZXVlRmlyc3QgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVMYXN0ID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3Q7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmVcbiAgICAgICAgLy8gcmVuZGVyTGFuZXMgZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cblxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIGlmICh1cGRhdGUuaGFzRWFnZXJTdGF0ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgdXBkYXRlIGlzIGEgc3RhdGUgdXBkYXRlIChub3QgYSByZWR1Y2VyKSBhbmQgd2FzIHByb2Nlc3NlZCBlYWdlcmx5LFxuICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGVcbiAgICAgICAgICBuZXdTdGF0ZSA9IHVwZGF0ZS5lYWdlclN0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwgJiYgdXBkYXRlICE9PSBmaXJzdCk7XG5cbiAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCA9PT0gbnVsbCkge1xuICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IG5ld0Jhc2VRdWV1ZUZpcnN0O1xuICAgIH0gLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIGhvb2suYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICAgIGhvb2suYmFzZVF1ZXVlID0gbmV3QmFzZVF1ZXVlTGFzdDtcbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIEludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHN0b3JlZCBvbiBhIHNlcGFyYXRlIHF1ZXVlLiBXZSBhcmVuJ3QgZ29pbmcgdG9cbiAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXNcbiAgLy8gYXJlIHJlbWFpbmluZy5cblxuXG4gIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVybGVhdmVkID0gbGFzdEludGVybGVhdmVkO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIGludGVybGVhdmVkTGFuZSA9IGludGVybGVhdmVkLmxhbmU7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIH0gd2hpbGUgKGludGVybGVhdmVkICE9PSBsYXN0SW50ZXJsZWF2ZWQpO1xuICB9IGVsc2UgaWYgKGJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgLy8gemVybyBvbmNlIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICBxdWV1ZS5sYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAocXVldWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyOyAvLyBUaGlzIGlzIGEgcmUtcmVuZGVyLiBBcHBseSB0aGUgbmV3IHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvIHRoZSBwcmV2aW91c1xuICAvLyB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gIHZhciBsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nO1xuICB2YXIgbmV3U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSBxdWV1ZSBkb2Vzbid0IHBlcnNpc3QgcGFzdCB0aGlzIHJlbmRlciBwYXNzLlxuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgIHZhciBmaXJzdFJlbmRlclBoYXNlVXBkYXRlID0gbGFzdFJlbmRlclBoYXNlVXBkYXRlLm5leHQ7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGU7XG5cbiAgICBkbyB7XG4gICAgICAvLyBQcm9jZXNzIHRoaXMgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVcbiAgICAgIC8vIHByaW9yaXR5IGJlY2F1c2UgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnRcbiAgICAgIC8vIHJlbmRlcidzLlxuICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICBuZXdTdGF0ZSA9IHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUpOyAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7IC8vIERvbid0IHBlcnNpc3QgdGhlIHN0YXRlIGFjY3VtdWxhdGVkIGZyb20gdGhlIHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvXG4gICAgLy8gdGhlIGJhc2Ugc3RhdGUgdW5sZXNzIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAvLyBUT0RPOiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBkZXNpcmVkIHNlbWFudGljcywgYnV0IGl0J3Mgd2hhdCB3ZVxuICAgIC8vIGRvIGZvciBnRFNGUC4gSSBjYW4ndCByZW1lbWJlciB3aHkuXG5cbiAgICBpZiAoaG9vay5iYXNlUXVldWUgPT09IG51bGwpIHtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBbbmV3U3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHRTbmFwc2hvdDtcbiAgdmFyIGlzSHlkcmF0aW5nID0gZ2V0SXNIeWRyYXRpbmcoKTtcblxuICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICBpZiAoZ2V0U2VydmVyU25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGdldFNlcnZlclNuYXBzaG90LCB3aGljaCBpcyByZXF1aXJlZCBmb3IgJyArICdzZXJ2ZXItcmVuZGVyZWQgY29udGVudC4gV2lsbCByZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICB9XG5cbiAgICBuZXh0U25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICBpZiAobmV4dFNuYXBzaG90ICE9PSBnZXRTZXJ2ZXJTbmFwc2hvdCgpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U2VydmVyU25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgIHtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuICAgIC8vXG4gICAgLy8gV2Ugd29uJ3QgZG8gdGhpcyBpZiB3ZSdyZSBoeWRyYXRpbmcgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQsIGJlY2F1c2UgaWZcbiAgICAvLyB0aGUgY29udGVudCBpcyBzdGFsZSwgaXQncyBhbHJlYWR5IHZpc2libGUgYW55d2F5LiBJbnN0ZWFkIHdlJ2xsIHBhdGNoXG4gICAgLy8gaXQgdXAgaW4gYSBwYXNzaXZlIGVmZmVjdC5cblxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgdmFyIGluc3QgPSB7XG4gICAgdmFsdWU6IG5leHRTbmFwc2hvdCxcbiAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3RcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IGluc3Q7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlLlxuXG4gIG1vdW50RWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW3N1YnNjcmliZV0pOyAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gdXBkYXRlIHRoZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkcy4gV2Ugd2lsbCB1cGRhdGVcbiAgLy8gdGhpcyB3aGVuZXZlciBzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBvciB2YWx1ZSBjaGFuZ2VzLiBCZWNhdXNlIHRoZXJlJ3Mgbm9cbiAgLy8gY2xlYW4tdXAgZnVuY3Rpb24sIGFuZCB3ZSB0cmFjayB0aGUgZGVwcyBjb3JyZWN0bHksIHdlIGNhbiBjYWxsIHB1c2hFZmZlY3RcbiAgLy8gZGlyZWN0bHksIHdpdGhvdXQgc3RvcmluZyBhbnkgYWRkaXRpb25hbCBzdGF0ZS4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2VcbiAgLy8gZG9uJ3QgbmVlZCB0byBzZXQgYSBzdGF0aWMgZmxhZywgZWl0aGVyLlxuICAvLyBUT0RPOiBXZSBjYW4gbW92ZSB0aGlzIHRvIHRoZSBwYXNzaXZlIHBoYXNlIG9uY2Ugd2UgYWRkIGEgcHJlLWNvbW1pdFxuICAvLyBjb25zaXN0ZW5jeSBjaGVjay4gU2VlIHRoZSBuZXh0IGNvbW1lbnQuXG5cbiAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7XG4gIHJldHVybiBuZXh0U25hcHNob3Q7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuICB2YXIgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgaWYgKCFvYmplY3RJcyhuZXh0U25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSkge1xuICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHByZXZTbmFwc2hvdCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHNuYXBzaG90Q2hhbmdlZCA9ICFvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG5cbiAgaWYgKHNuYXBzaG90Q2hhbmdlZCkge1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICB9XG5cbiAgdmFyIGluc3QgPSBob29rLnF1ZXVlO1xuICB1cGRhdGVFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFdoZW5ldmVyIGdldFNuYXBzaG90IG9yIHN1YnNjcmliZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UgaWYgdGhlcmUgd2FzIGFuIGludGVybGVhdmVkIG11dGF0aW9uLiBJbiBjb25jdXJyZW50IG1vZGVcbiAgLy8gdGhpcyBjYW4gaGFwcGVuIGFsbCB0aGUgdGltZSwgYnV0IGV2ZW4gaW4gc3luY2hyb25vdXMgbW9kZSwgYW4gZWFybGllclxuICAvLyBlZmZlY3QgbWF5IGhhdmUgbXV0YXRlZCB0aGUgc3RvcmUuXG5cbiAgaWYgKGluc3QuZ2V0U25hcHNob3QgIT09IGdldFNuYXBzaG90IHx8IHNuYXBzaG90Q2hhbmdlZCB8fCAvLyBDaGVjayBpZiB0aGUgc3VzYmNyaWJlIGZ1bmN0aW9uIGNoYW5nZWQuIFdlIGNhbiBzYXZlIHNvbWUgbWVtb3J5IGJ5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgd2Ugc2NoZWR1bGVkIGEgc3Vic2NyaXB0aW9uIGVmZmVjdCBhYm92ZS5cbiAgd29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzSG9vay5tZW1vaXplZFN0YXRlLnRhZyAmIEhhc0VmZmVjdCkge1xuICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmU7XG4gICAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIHJlbmRlcmVkU25hcHNob3QpIHtcbiAgZmliZXIuZmxhZ3MgfD0gU3RvcmVDb25zaXN0ZW5jeTtcbiAgdmFyIGNoZWNrID0ge1xuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdCxcbiAgICB2YWx1ZTogcmVuZGVyZWRTbmFwc2hvdFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICB9IGVsc2Uge1xuICAgIHZhciBzdG9yZXMgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICBpZiAoc3RvcmVzID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZXMucHVzaChjaGVjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0b3JlSW5zdGFuY2UoZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHtcbiAgLy8gVGhlc2UgYXJlIHVwZGF0ZWQgaW4gdGhlIHBhc3NpdmUgcGhhc2VcbiAgaW5zdC52YWx1ZSA9IG5leHRTbmFwc2hvdDtcbiAgaW5zdC5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBTb21ldGhpbmcgbWF5IGhhdmUgYmVlbiBtdXRhdGVkIGluIGJldHdlZW4gcmVuZGVyIGFuZCBjb21taXQuIFRoaXMgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGFuIGV2ZW50IHRoYXQgZmlyZWQgYmVmb3JlIHRoZSBwYXNzaXZlIGVmZmVjdHMsIG9yIGl0IGNvdWxkXG4gIC8vIGhhdmUgYmVlbiBpbiBhIGxheW91dCBlZmZlY3QuIEluIHRoYXQgY2FzZSwgd2Ugd291bGQgaGF2ZSB1c2VkIHRoZSBvbGRcbiAgLy8gc25hcHNobyBhbmQgZ2V0U25hcHNob3QgdmFsdWVzIHRvIGJhaWwgb3V0LiBXZSBuZWVkIHRvIGNoZWNrIG9uZSBtb3JlIHRpbWUuXG5cbiAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZVRvU3RvcmUoZmliZXIsIGluc3QsIHN1YnNjcmliZSkge1xuICB2YXIgaGFuZGxlU3RvcmVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhlIHN0b3JlIGNoYW5nZWQuIENoZWNrIGlmIHRoZSBzbmFwc2hvdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2VcbiAgICAvLyByZWFkIGZyb20gdGhlIHN0b3JlLlxuICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gICAgfVxuICB9OyAvLyBTdWJzY3JpYmUgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gYSBjbGVhbi11cCBmdW5jdGlvbi5cblxuXG4gIHJldHVybiBzdWJzY3JpYmUoaGFuZGxlU3RvcmVDaGFuZ2UpO1xufVxuXG5mdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgdmFyIGxhdGVzdEdldFNuYXBzaG90ID0gaW5zdC5nZXRTbmFwc2hvdDtcbiAgdmFyIHByZXZWYWx1ZSA9IGluc3QudmFsdWU7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbmV4dFZhbHVlID0gbGF0ZXN0R2V0U25hcHNob3QoKTtcbiAgICByZXR1cm4gIW9iamVjdElzKHByZXZWYWx1ZSwgbmV4dFZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpIHtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSBtaXhlZCB0eXBlc1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZSgpO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoU2V0U3RhdGUuYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiByZXJlbmRlclJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiBwdXNoRWZmZWN0KHRhZywgY3JlYXRlLCBkZXN0cm95LCBkZXBzKSB7XG4gIHZhciBlZmZlY3QgPSB7XG4gICAgdGFnOiB0YWcsXG4gICAgY3JlYXRlOiBjcmVhdGUsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBkZXBzOiBkZXBzLFxuICAgIC8vIENpcmN1bGFyXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxhc3RFZmZlY3QgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgaWYgKGxhc3RFZmZlY3QgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgbGFzdEVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgICAgZWZmZWN0Lm5leHQgPSBmaXJzdEVmZmVjdDtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3Q7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVmZmVjdDtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICB7XG4gICAgdmFyIF9yZWYyID0ge1xuICAgICAgY3VycmVudDogaW5pdGlhbFZhbHVlXG4gICAgfTtcbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBfcmVmMjtcbiAgICByZXR1cm4gX3JlZjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICByZXR1cm4gaG9vay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCB1bmRlZmluZWQsIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIGRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGN1cnJlbnRIb29rICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZFZmZlY3QgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIGRlc3Ryb3kgPSBwcmV2RWZmZWN0LmRlc3Ryb3k7XG5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZFZmZlY3QuZGVwcztcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKE1vdW50UGFzc2l2ZURldiB8IFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChQYXNzaXZlIHwgUGFzc2l2ZVN0YXRpYywgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoUGFzc2l2ZSwgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gIHtcbiAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgfVxuXG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0KGNyZWF0ZSwgcmVmKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlZkNhbGxiYWNrID0gcmVmO1xuXG4gICAgdmFyIF9pbnN0ID0gY3JlYXRlKCk7XG5cbiAgICByZWZDYWxsYmFjayhfaW5zdCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZkNhbGxiYWNrKG51bGwpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHJlZk9iamVjdCA9IHJlZjtcblxuICAgIHtcbiAgICAgIGlmICghcmVmT2JqZWN0Lmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBmaXJzdCBhcmd1bWVudCB0byBlaXRoZXIgYmUgYSAnICsgJ3JlZiBjYWxsYmFjayBvciBSZWFjdC5jcmVhdGVSZWYoKSBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsICdhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMocmVmT2JqZWN0KS5qb2luKCcsICcpICsgJ30nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX2luc3QyID0gY3JlYXRlKCk7XG5cbiAgICByZWZPYmplY3QuY3VycmVudCA9IF9pbnN0MjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBudWxsO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudERlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7Ly8gVGhpcyBob29rIGlzIG5vcm1hbGx5IGEgbm8tb3AuXG4gIC8vIFRoZSByZWFjdC1kZWJ1Zy1ob29rcyBwYWNrYWdlIGluamVjdHMgaXRzIG93biBpbXBsZW1lbnRhdGlvblxuICAvLyBzbyB0aGF0IGUuZy4gRGV2VG9vbHMgY2FuIGRpc3BsYXkgY3VzdG9tIGhvb2sgdmFsdWVzLlxufVxuXG52YXIgdXBkYXRlRGVidWdWYWx1ZSA9IG1vdW50RGVidWdWYWx1ZTtcblxuZnVuY3Rpb24gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIG1vdW50TWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAvLyBBc3N1bWUgdGhlc2UgYXJlIGRlZmluZWQuIElmIHRoZXkncmUgbm90LCBhcmVIb29rSW5wdXRzRXF1YWwgd2lsbCB3YXJuLlxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHJlc29sdmVkQ3VycmVudEhvb2sgPSBjdXJyZW50SG9vaztcbiAgdmFyIHByZXZWYWx1ZSA9IHJlc29sdmVkQ3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVyZW5kZXIgZHVyaW5nIGEgbW91bnQuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYW4gdXBkYXRlLlxuICAgIHZhciBwcmV2VmFsdWUgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKSB7XG4gIHZhciBzaG91bGREZWZlclZhbHVlID0gIWluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKHJlbmRlckxhbmVzKTtcblxuICBpZiAoc2hvdWxkRGVmZXJWYWx1ZSkge1xuICAgIC8vIFRoaXMgaXMgYW4gdXJnZW50IHVwZGF0ZS4gSWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLCBrZWVwIHVzaW5nIHRoZVxuICAgIC8vIHByZXZpb3VzIHZhbHVlIGFuZCBzcGF3biBhIGRlZmVycmVkIHJlbmRlciB0byB1cGRhdGUgaXQgbGF0ZXIuXG4gICAgaWYgKCFvYmplY3RJcyh2YWx1ZSwgcHJldlZhbHVlKSkge1xuICAgICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCByZW5kZXJcbiAgICAgIHZhciBkZWZlcnJlZExhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgZGVmZXJyZWRMYW5lKTtcbiAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoZGVmZXJyZWRMYW5lKTsgLy8gU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBpbmNvbnNpc3RlbnRcbiAgICAgIC8vIGZyb20gdGhlIGxhdGVzdCB2YWx1ZS4gVGhlIG5hbWUgXCJiYXNlU3RhdGVcIiBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2VcbiAgICAgIC8vIHVzZSBpdCBiZWNhdXNlIHdlJ3JlIHJldXNpbmcgYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYVxuICAgICAgLy8gbmV3IG9uZS5cblxuICAgICAgaG9vay5iYXNlU3RhdGUgPSB0cnVlO1xuICAgIH0gLy8gUmV1c2UgdGhlIHByZXZpb3VzIHZhbHVlXG5cblxuICAgIHJldHVybiBwcmV2VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBub3QgYW4gdXJnZW50IHVwZGF0ZSwgc28gd2UgY2FuIHVzZSB0aGUgbGF0ZXN0IHZhbHVlIHJlZ2FyZGxlc3NcbiAgICAvLyBvZiB3aGF0IGl0IGlzLiBObyBuZWVkIHRvIGRlZmVyIGl0LlxuICAgIC8vIEhvd2V2ZXIsIGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBzcGF3bmVkIHJlbmRlciwgdGhlbiB3ZSBuZWVkIHRvIG1hcmtcbiAgICAvLyB0aGlzIGFzIGFuIHVwZGF0ZSB0byBwcmV2ZW50IHRoZSBmaWJlciBmcm9tIGJhaWxpbmcgb3V0LlxuICAgIC8vXG4gICAgLy8gYGJhc2VTdGF0ZWAgaXMgdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZW5kZXJlZFxuICAgIC8vIHZhbHVlLiBUaGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2UgdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZ1xuICAgIC8vIGEgc3RhdGUgaG9vayBmaWVsZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAoaG9vay5iYXNlU3RhdGUpIHtcbiAgICAgIC8vIEZsaXAgdGhpcyBiYWNrIHRvIGZhbHNlLlxuICAgICAgaG9vay5iYXNlU3RhdGUgPSBmYWxzZTtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihzZXRQZW5kaW5nLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoaGlnaGVyRXZlbnRQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5LCBDb250aW51b3VzRXZlbnRQcmlvcml0eSkpO1xuICBzZXRQZW5kaW5nKHRydWUpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2V0UGVuZGluZyhmYWxzZSk7XG4gICAgY2FsbGJhY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkge1xuICB2YXIgX21vdW50U3RhdGUgPSBtb3VudFN0YXRlKGZhbHNlKSxcbiAgICAgIGlzUGVuZGluZyA9IF9tb3VudFN0YXRlWzBdLFxuICAgICAgc2V0UGVuZGluZyA9IF9tb3VudFN0YXRlWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgbmV2ZXIgY2hhbmdlcy5cblxuXG4gIHZhciBzdGFydCA9IHN0YXJ0VHJhbnNpdGlvbi5iaW5kKG51bGwsIHNldFBlbmRpbmcpO1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHN0YXJ0O1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkge1xuICB2YXIgX3VwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGUoKSxcbiAgICAgIGlzUGVuZGluZyA9IF91cGRhdGVTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyVHJhbnNpdGlvbigpIHtcbiAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3JlcmVuZGVyU3RhdGVbMF07XG5cbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHN0YXJ0ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG52YXIgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJZCgpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpOyAvLyBUT0RPOiBJbiBGaXp6LCBpZCBnZW5lcmF0aW9uIGlzIHNwZWNpZmljIHRvIGVhY2ggc2VydmVyIGNvbmZpZy4gTWF5YmUgd2VcbiAgLy8gc2hvdWxkIGRvIHRoaXMgaW4gRmliZXIsIHRvbz8gRGVmZXJyaW5nIHRoaXMgZGVjaXNpb24gZm9yIG5vdyBiZWNhdXNlXG4gIC8vIHRoZXJlJ3Mgbm8gb3RoZXIgcGxhY2UgdG8gc3RvcmUgdGhlIHByZWZpeCBleGNlcHQgZm9yIGFuIGludGVybmFsIGZpZWxkIG9uXG4gIC8vIHRoZSBwdWJsaWMgY3JlYXRlUm9vdCBvYmplY3QsIHdoaWNoIHRoZSBmaWJlciB0cmVlIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlXG4gIC8vIGEgcmVmZXJlbmNlIHRvLlxuXG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gcm9vdC5pZGVudGlmaWVyUHJlZml4O1xuICB2YXIgaWQ7XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICB2YXIgdHJlZUlkID0gZ2V0VHJlZUlkKCk7IC8vIFVzZSBhIGNhcHRpYWwgUiBwcmVmaXggZm9yIHNlcnZlci1nZW5lcmF0ZWQgaWRzLlxuXG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ1InICsgdHJlZUlkOyAvLyBVbmxlc3MgdGhpcyBpcyB0aGUgZmlyc3QgaWQgYXQgdGhpcyBsZXZlbCwgYXBwZW5kIGEgbnVtYmVyIGF0IHRoZSBlbmRcbiAgICAvLyB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgdXNlSWQgaG9vayBhbW9uZyBhbGwgdGhlIHVzZUlkXG4gICAgLy8gaG9va3MgZm9yIHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbG9jYWxJZCA9IGxvY2FsSWRDb3VudGVyKys7XG5cbiAgICBpZiAobG9jYWxJZCA+IDApIHtcbiAgICAgIGlkICs9ICdIJyArIGxvY2FsSWQudG9TdHJpbmcoMzIpO1xuICAgIH1cblxuICAgIGlkICs9ICc6JztcbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgYSBsb3dlcmNhc2UgciBwcmVmaXggZm9yIGNsaWVudC1nZW5lcmF0ZWQgaWRzLlxuICAgIHZhciBnbG9iYWxDbGllbnRJZCA9IGdsb2JhbENsaWVudElkQ291bnRlcisrO1xuICAgIGlkID0gJzonICsgaWRlbnRpZmllclByZWZpeCArICdyJyArIGdsb2JhbENsaWVudElkLnRvU3RyaW5nKDMyKSArICc6JztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGlkO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUlkKCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaWQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFNldFN0YXRlKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5oYXNFYWdlclN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICB1cGRhdGUuZWFnZXJTdGF0ZSA9IGVhZ2VyU3RhdGU7XG5cbiAgICAgICAgICBpZiAob2JqZWN0SXMoZWFnZXJTdGF0ZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgICAgICAgLy8gRmFzdCBwYXRoLiBXZSBjYW4gYmFpbCBvdXQgd2l0aG91dCBzY2hlZHVsaW5nIFJlYWN0IHRvIHJlLXJlbmRlci5cbiAgICAgICAgICAgIC8vIEl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlYmFzZSB0aGlzIHVwZGF0ZSBsYXRlcixcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQgcmUtcmVuZGVycyBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIGFuZCBieSB0aGF0XG4gICAgICAgICAgICAvLyB0aW1lIHRoZSByZWR1Y2VyIGhhcyBjaGFuZ2VkLlxuICAgICAgICAgICAgLy8gVE9ETzogRG8gd2Ugc3RpbGwgbmVlZCB0byBlbnRhbmdsZSB0cmFuc2l0aW9ucyBpbiB0aGlzIGNhc2U/XG4gICAgICAgICAgICBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICByZXR1cm4gZmliZXIgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpIHtcbiAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFN0YXNoIGl0IGluIGEgbGF6aWx5LWNyZWF0ZWQgbWFwIG9mXG4gIC8vIHF1ZXVlIC0+IGxpbmtlZCBsaXN0IG9mIHVwZGF0ZXMuIEFmdGVyIHRoaXMgcmVuZGVyIHBhc3MsIHdlJ2xsIHJlc3RhcnRcbiAgLy8gYW5kIGFwcGx5IHRoZSBzdGFzaGVkIHVwZGF0ZXMgb24gdG9wIG9mIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSB0cnVlO1xuICB2YXIgcGVuZGluZyA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbn0gLy8gVE9ETzogTW92ZSB0byBSZWFjdEZpYmVyQ29uY3VycmVudFVwZGF0ZXM/XG5cblxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKSB7XG4gIGlmIChpc1RyYW5zaXRpb25MYW5lKGxhbmUpKSB7XG4gICAgdmFyIHF1ZXVlTGFuZXMgPSBxdWV1ZS5sYW5lczsgLy8gSWYgYW55IGVudGFuZ2xlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIHBlbmRpbmcgb24gdGhlIHJvb3QsIHRoZW4gdGhleVxuICAgIC8vIG11c3QgaGF2ZSBmaW5pc2hlZC4gV2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSwgd2hpY2hcbiAgICAvLyByZXByZXNlbnRzIGEgc3VwZXJzZXQgb2YgdGhlIGFjdHVhbGx5IHBlbmRpbmcgbGFuZXMuIEluIHNvbWUgY2FzZXMgd2VcbiAgICAvLyBtYXkgZW50YW5nbGUgbW9yZSB0aGFuIHdlIG5lZWQgdG8sIGJ1dCB0aGF0J3MgT0suIEluIGZhY3QgaXQncyB3b3JzZSBpZlxuICAgIC8vIHdlICpkb24ndCogZW50YW5nbGUgd2hlbiB3ZSBzaG91bGQuXG5cbiAgICBxdWV1ZUxhbmVzID0gaW50ZXJzZWN0TGFuZXMocXVldWVMYW5lcywgcm9vdC5wZW5kaW5nTGFuZXMpOyAvLyBFbnRhbmdsZSB0aGUgbmV3IHRyYW5zaXRpb24gbGFuZSB3aXRoIHRoZSBvdGhlciB0cmFuc2l0aW9uIGxhbmVzLlxuXG4gICAgdmFyIG5ld1F1ZXVlTGFuZXMgPSBtZXJnZUxhbmVzKHF1ZXVlTGFuZXMsIGxhbmUpO1xuICAgIHF1ZXVlLmxhbmVzID0gbmV3UXVldWVMYW5lczsgLy8gRXZlbiBpZiBxdWV1ZS5sYW5lcyBhbHJlYWR5IGluY2x1ZGUgbGFuZSwgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbiBpZlxuICAgIC8vIHRoZSBsYW5lIGZpbmlzaGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZW50YW5nbGVkIGl0LiBTbyB3ZSBuZWVkIHRvXG4gICAgLy8gZW50YW5nbGUgaXQgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZS5cblxuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG5ld1F1ZXVlTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lLCBhY3Rpb24pIHtcblxuICB7XG4gICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgfVxufVxuXG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsXG4gIHVzZUNhbGxiYWNrOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW5zZXJ0aW9uRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUxheW91dEVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNZW1vOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZHVjZXI6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVmOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlYnVnVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVmZXJyZWRWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VUcmFuc2l0aW9uOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU11dGFibGVTb3VyY2U6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3luY0V4dGVybmFsU3RvcmU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSWQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG59O1xuXG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcblxue1xuICB2YXIgd2FybkludmFsaWRDb250ZXh0QWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgfTtcblxuICB2YXIgd2FybkludmFsaWRIb29rQWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdEbyBub3QgY2FsbCBIb29rcyBpbnNpZGUgdXNlRWZmZWN0KC4uLiksIHVzZU1lbW8oLi4uKSwgb3Igb3RoZXIgYnVpbHQtaW4gSG9va3MuICcgKyAnWW91IGNhbiBvbmx5IGNhbGwgSG9va3MgYXQgdGhlIHRvcCBsZXZlbCBvZiB5b3VyIFJlYWN0IGZ1bmN0aW9uLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3MnKTtcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbn1cblxudmFyIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBjb21taXRUaW1lID0gMDtcbnZhciBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTtcbnZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xudmFyIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSAtMTtcbi8qKlxuICogVHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZC9jYXNjYWRpbmcgdXBkYXRlIChzY2hlZHVsZWQgZnJvbSBhIGxheW91dCBlZmZlY3QpLlxuICpcbiAqIFRoZSBvdmVyYWxsIHNlcXVlbmNlIGlzOlxuICogICAxLiByZW5kZXJcbiAqICAgMi4gY29tbWl0IChhbmQgY2FsbCBgb25SZW5kZXJgLCBgb25Db21taXRgKVxuICogICAzLiBjaGVjayBmb3IgbmVzdGVkIHVwZGF0ZXNcbiAqICAgNC4gZmx1c2ggcGFzc2l2ZSBlZmZlY3RzIChhbmQgY2FsbCBgb25Qb3N0Q29tbWl0YClcbiAqXG4gKiBOZXN0ZWQgdXBkYXRlcyBhcmUgaWRlbnRpZmllZCBpbiBzdGVwIDMgYWJvdmUsXG4gKiBidXQgc3RlcCA0IHN0aWxsIGFwcGxpZXMgdG8gdGhlIHdvcmsgdGhhdCB3YXMganVzdCBjb21taXR0ZWQuXG4gKiBXZSB1c2UgdHdvIGZsYWdzIHRvIHRyYWNrIG5lc3RlZCB1cGRhdGVzIHRoZW46XG4gKiBvbmUgdHJhY2tzIHdoZXRoZXIgdGhlIHVwY29taW5nIHVwZGF0ZSBpcyBhIG5lc3RlZCB1cGRhdGUsXG4gKiBhbmQgdGhlIG90aGVyIHRyYWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVwZGF0ZSB3YXMgYSBuZXN0ZWQgdXBkYXRlLlxuICogVGhlIGZpcnN0IHZhbHVlIGdldHMgc3luY2VkIHRvIHRoZSBzZWNvbmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UuXG4gKi9cblxudmFyIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xudmFyIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlSXNOZXN0ZWQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKSB7XG4gIHtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpIHtcbiAge1xuICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gbmVzdGVkVXBkYXRlU2NoZWR1bGVkO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvbW1pdFRpbWUoKSB7XG4gIHJldHVybiBjb21taXRUaW1lO1xufVxuXG5mdW5jdGlvbiByZWNvcmRDb21taXRUaW1lKCkge1xuXG4gIGNvbW1pdFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFByb2ZpbGVyVGltZXIoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IG5vdyQxKCk7XG5cbiAgaWYgKGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA8IDApIHtcbiAgICBmaWJlci5hY3R1YWxTdGFydFRpbWUgPSBub3ckMSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShmaWJlciwgb3ZlcnJpZGVCYXNlVGltZSkge1xuXG4gIGlmIChwcm9maWxlclN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHByb2ZpbGVyU3RhcnRUaW1lO1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuXG4gICAgaWYgKG92ZXJyaWRlQmFzZVRpbWUpIHtcbiAgICAgIGZpYmVyLnNlbGZCYXNlRHVyYXRpb24gPSBlbGFwc2VkVGltZTtcbiAgICB9XG5cbiAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKSB7XG5cbiAgaWYgKGxheW91dEVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIGxheW91dEVmZmVjdFN0YXJ0VGltZTtcbiAgICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTsgLy8gU3RvcmUgZHVyYXRpb24gb24gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3RvclxuICAgIC8vIE9yIHRoZSByb290IChmb3IgdGhlIERldlRvb2xzIFByb2ZpbGVyIHRvIHJlYWQpXG5cbiAgICB2YXIgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAocGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHBhc3NpdmVFZmZlY3RTdGFydFRpbWU7XG4gICAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHBhcmVudFN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRGV0YWNoZWQgZmliZXJzIGhhdmUgdGhlaXIgc3RhdGUgbm9kZSBjbGVhcmVkIG91dC5cbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHJldHVybiBwb2ludGVyIGlzIGFsc28gY2xlYXJlZCBvdXQsXG4gICAgICAgICAgICAvLyBzbyB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlcG9ydCB0aGUgdGltZSBzcGVudCBpbiB0aGlzIFByb2ZpbGVyJ3Mgc3VidHJlZS5cbiAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpIHtcblxuICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpIHtcblxuICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmZXJBY3R1YWxEdXJhdGlvbihmaWJlcikge1xuICAvLyBUcmFuc2ZlciB0aW1lIHNwZW50IHJlbmRlcmluZyB0aGVzZSBjaGlsZHJlbiBzbyB3ZSBkb24ndCBsb3NlIGl0XG4gIC8vIGFmdGVyIHdlIHJlcmVuZGVyLiBUaGlzIGlzIHVzZWQgYXMgYSBoZWxwZXIgaW4gc3BlY2lhbCBjYXNlc1xuICAvLyB3aGVyZSB3ZSBzaG91bGQgY291bnQgdGhlIHdvcmsgb2YgbXVsdGlwbGUgcGFzc2VzLlxuICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQpIHtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIGJhc2VQcm9wcykge1xuICBpZiAoQ29tcG9uZW50ICYmIENvbXBvbmVudC5kZWZhdWx0UHJvcHMpIHtcbiAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHMuIFRha2VuIGZyb20gUmVhY3RFbGVtZW50XG4gICAgdmFyIHByb3BzID0gYXNzaWduKHt9LCBiYXNlUHJvcHMpO1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSBDb21wb25lbnQuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cblxuICByZXR1cm4gYmFzZVByb3BzO1xufVxuXG52YXIgZmFrZUludGVybmFsSW5zdGFuY2UgPSB7fTtcbnZhciBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uSW52YWxpZENhbGxiYWNrO1xudmFyIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzO1xudmFyIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDE7XG5cbntcbiAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxID0gbmV3IFNldCgpO1xuICB2YXIgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrID0gbmV3IFNldCgpO1xuXG4gIHdhcm5PbkludmFsaWRDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIGlmIChjYWxsYmFjayA9PT0gbnVsbCB8fCB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gY2FsbGVyTmFtZSArICdfJyArIGNhbGxiYWNrO1xuXG4gICAgaWYgKCFkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suaGFzKGtleSkpIHtcbiAgICAgIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KTtcblxuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9O1xuXG4gIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IGZ1bmN0aW9uICh0eXBlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAocGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCk6IEEgdmFsaWQgc3RhdGUgb2JqZWN0IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiAnICsgJ1lvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFRoaXMgaXMgc28gZ3Jvc3MgYnV0IGl0J3MgYXQgbGVhc3Qgbm9uLWNyaXRpY2FsIGFuZCBjYW4gYmUgcmVtb3ZlZCBpZlxuICAvLyBpdCBjYXVzZXMgcHJvYmxlbXMuIFRoaXMgaXMgbWVhbnQgdG8gZ2l2ZSBhIG5pY2VyIGVycm9yIG1lc3NhZ2UgZm9yXG4gIC8vIFJlYWN0RE9NMTUudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocmVhY3RET00xNkNvbXBvbmVudCxcbiAgLy8gLi4uKSkgd2hpY2ggb3RoZXJ3aXNlIHRocm93cyBhIFwiX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGEgZnVuY3Rpb25cIlxuICAvLyBleGNlcHRpb24uXG5cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmFrZUludGVybmFsSW5zdGFuY2UsICdfcHJvY2Vzc0NoaWxkQ29udGV4dCcsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgJyArICdtZWFucyB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgYW5kIGFyZSBhdHRlbXB0aW5nIHRvIG5lc3QgJyArICdhIFJlYWN0IDE1IHRyZWUgaW5zaWRlIGEgUmVhY3QgMTYgdHJlZSB1c2luZyAnICsgXCJ1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciwgd2hpY2ggaXNuJ3Qgc3VwcG9ydGVkLiBUcnkgXCIgKyAndG8gbWFrZSBzdXJlIHlvdSBoYXZlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QgKGFuZCBpZGVhbGx5LCBzd2l0Y2ggJyArICd0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLicpO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5mcmVlemUoZmFrZUludGVybmFsSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXh0UHJvcHMpIHtcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgcGFydGlhbFN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUoY3RvciwgcGFydGlhbFN0YXRlKTtcbiAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgdmFyIG1lbW9pemVkU3RhdGUgPSBwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQgPyBwcmV2U3RhdGUgOiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cblxudmFyIGNsYXNzQ29tcG9uZW50VXBkYXRlciA9IHtcbiAgaXNNb3VudGVkOiBpc01vdW50ZWQsXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBSZXBsYWNlU3RhdGU7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAoaW5zdCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcignJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyArICdib29sZWFuIHZhbHVlLiBNYWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2hvdWxkVXBkYXRlO1xuICB9XG5cbiAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuICFzaGFsbG93RXF1YWwob2xkUHJvcHMsIG5ld1Byb3BzKSB8fCAhc2hhbGxvd0VxdWFsKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGN0b3IuY2hpbGRDb250ZXh0VHlwZXMgJiYgIWRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5oYXMoY3RvcikgJiYgLy8gU3RyaWN0IE1vZGUgaGFzIGl0cyBvd24gd2FybmluZyBmb3IgbGVnYWN5IGNvbnRleHQsIHNvIHdlIGNhbiBza2lwXG4gICAgICAvLyB0aGlzIG9uZS5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyB1c2VzIHRoZSBsZWdhY3kgY2hpbGRDb250ZXh0VHlwZXMgQVBJIHdoaWNoIGlzIG5vIGxvbmdlciAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFVzZSAnICsgJ1JlYWN0LmNyZWF0ZUNvbnRleHQoKSBpbnN0ZWFkXFxuXFxuLicgKyAnTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmhhcyhjdG9yKSAmJiAvLyBTdHJpY3QgTW9kZSBoYXMgaXRzIG93biB3YXJuaW5nIGZvciBsZWdhY3kgY29udGV4dCwgc28gd2UgY2FuIHNraXBcbiAgICAgIC8vIHRoaXMgb25lLlxuICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5hZGQoY3Rvcik7XG5cbiAgICAgICAgZXJyb3IoJyVzIHVzZXMgdGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgQVBJIHdoaWNoIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIFVzZSAnICsgJ1JlYWN0LmNyZWF0ZUNvbnRleHQoKSB3aXRoIHN0YXRpYyBjb250ZXh0VHlwZSBpbnN0ZWFkLlxcblxcbicgKyAnTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnN0YW5jZS5jb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJ2NvbnRleHRUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3Rvci5jb250ZXh0VHlwZSAmJiBjdG9yLmNvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuaGFzKGN0b3IpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzLmFkZChjdG9yKTtcblxuICAgICAgICBlcnJvcignJXMgZGVjbGFyZXMgYm90aCBjb250ZXh0VHlwZXMgYW5kIGNvbnRleHRUeXBlIHN0YXRpYyBwcm9wZXJ0aWVzLiAnICsgJ1RoZSBsZWdhY3kgY29udGV4dFR5cGVzIHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyAnICsgJ1RoZSBuYW1lIGlzIHBocmFzZWQgYXMgYSBxdWVzdGlvbiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyAnICsgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChjdG9yLnByb3RvdHlwZSAmJiBjdG9yLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCAmJiB0eXBlb2YgaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkuICcgKyAnc2hvdWxkQ29tcG9uZW50VXBkYXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIGV4dGVuZGluZyBSZWFjdC5QdXJlQ29tcG9uZW50LiAnICsgJ1BsZWFzZSBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB1c2VkLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQSBwdXJlIGNvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRVbm1vdW50KCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxVbm1vdW50KCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzKCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnSWYgeW91IG1lYW50IHRvIHVwZGF0ZSB0aGUgc3RhdGUgaW4gcmVzcG9uc2UgdG8gY2hhbmdpbmcgcHJvcHMsICcgKyAndXNlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKS4gSWYgeW91IG1lYW50IHRvIGZldGNoIGRhdGEgb3IgJyArICdydW4gc2lkZS1lZmZlY3RzIG9yIG11dGF0aW9ucyBhZnRlciBSZWFjdCBoYXMgdXBkYXRlZCB0aGUgVUksIHVzZSBjb21wb25lbnREaWRVcGRhdGUoKS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGhhc011dGF0ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzICE9PSBuZXdQcm9wcztcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gdW5kZWZpbmVkICYmIGhhc011dGF0ZWRQcm9wcykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyBcInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLlwiLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZGVmYXVsdFByb3BzKSB7XG4gICAgICBlcnJvcignU2V0dGluZyBkZWZhdWx0UHJvcHMgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLicgKyAnIEluc3RlYWQsIGRlZmluZSBkZWZhdWx0UHJvcHMgYXMgYSBzdGF0aWMgcHJvcGVydHkgb24gJXMuJywgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICFkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuaGFzKGN0b3IpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuYWRkKGN0b3IpO1xuXG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjb21wb25lbnREaWRVcGRhdGUoKS4gJyArICdUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBpcyBkZWZpbmVkIGFzIGEgc3RhdGljIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBfc3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICAgIGlmIChfc3RhdGUgJiYgKHR5cGVvZiBfc3RhdGUgIT09ICdvYmplY3QnIHx8IGlzQXJyYXkoX3N0YXRlKSkpIHtcbiAgICAgIGVycm9yKCclcy5zdGF0ZTogbXVzdCBiZSBzZXQgdG8gYW4gb2JqZWN0IG9yIG51bGwnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY3Rvci5jaGlsZENvbnRleHRUeXBlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGVycm9yKCclcy5nZXRDaGlsZENvbnRleHQoKTogY2hpbGRDb250ZXh0VHlwZXMgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvICcgKyAndXNlIGdldENoaWxkQ29udGV4dCgpLicsIG5hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnVwZGF0ZXIgPSBjbGFzc0NvbXBvbmVudFVwZGF0ZXI7XG4gIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlOyAvLyBUaGUgaW5zdGFuY2UgbmVlZHMgYWNjZXNzIHRvIHRoZSBmaWJlciBzbyB0aGF0IGl0IGNhbiBzY2hlZHVsZSB1cGRhdGVzXG5cbiAgc2V0KGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAge1xuICAgIGluc3RhbmNlLl9yZWFjdEludGVybmFsSW5zdGFuY2UgPSBmYWtlSW50ZXJuYWxJbnN0YW5jZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBwcm9wcykge1xuICB2YXIgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBmYWxzZTtcbiAgdmFyIHVubWFza2VkQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAge1xuICAgIGlmICgnY29udGV4dFR5cGUnIGluIGN0b3IpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gLy8gQWxsb3cgbnVsbCBmb3IgY29uZGl0aW9uYWwgZGVjbGFyYXRpb25cbiAgICAgIGNvbnRleHRUeXBlID09PSBudWxsIHx8IGNvbnRleHRUeXBlICE9PSB1bmRlZmluZWQgJiYgY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSAmJiBjb250ZXh0VHlwZS5fY29udGV4dCA9PT0gdW5kZWZpbmVkOyAvLyBOb3QgYSA8Q29udGV4dC5Db25zdW1lcj5cblxuICAgICAgaWYgKCFpc1ZhbGlkICYmICFkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuaGFzKGN0b3IpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5hZGQoY3Rvcik7XG4gICAgICAgIHZhciBhZGRlbmR1bSA9ICcnO1xuXG4gICAgICAgIGlmIChjb250ZXh0VHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byB1bmRlZmluZWQuICcgKyAnVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IGEgdHlwbyBvciBieSBtaXhpbmcgdXAgbmFtZWQgYW5kIGRlZmF1bHQgaW1wb3J0cy4gJyArICdUaGlzIGNhbiBhbHNvIGhhcHBlbiBkdWUgdG8gYSBjaXJjdWxhciBkZXBlbmRlbmN5LCBzbyAnICsgJ3RyeSBtb3ZpbmcgdGhlIGNyZWF0ZUNvbnRleHQoKSBjYWxsIHRvIGEgc2VwYXJhdGUgZmlsZS4nO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGEgJyArIHR5cGVvZiBjb250ZXh0VHlwZSArICcuJztcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LlByb3ZpZGVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZS5fY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gPENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuQ29uc3VtZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYW4gb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNvbnRleHRUeXBlKS5qb2luKCcsICcpICsgJ30uJztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCclcyBkZWZpbmVzIGFuIGludmFsaWQgY29udGV4dFR5cGUuICcgKyAnY29udGV4dFR5cGUgc2hvdWxkIHBvaW50IHRvIHRoZSBDb250ZXh0IG9iamVjdCByZXR1cm5lZCBieSBSZWFjdC5jcmVhdGVDb250ZXh0KCkuJXMnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCcsIGFkZGVuZHVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIGNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gY3Rvci5jb250ZXh0VHlwZXM7XG4gICAgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBjb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gICAgY29udGV4dCA9IGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID8gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSA6IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gSW5zdGFudGlhdGUgdHdpY2UgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlICE9PSBudWxsICYmIGluc3RhbmNlLnN0YXRlICE9PSB1bmRlZmluZWQgPyBpbnN0YW5jZS5zdGF0ZSA6IG51bGw7XG4gIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nICYmIHN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJ2Alc2AgdXNlcyBgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzYCBidXQgaXRzIGluaXRpYWwgc3RhdGUgaXMgJyArICclcy4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuIEluc3RlYWQsIGRlZmluZSB0aGUgaW5pdGlhbCBzdGF0ZSBieSAnICsgJ2Fzc2lnbmluZyBhbiBvYmplY3QgdG8gYHRoaXMuc3RhdGVgIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBgJXNgLiAnICsgJ1RoaXMgZW5zdXJlcyB0aGF0IGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGFyZ3VtZW50cyBoYXZlIGEgY29uc2lzdGVudCBzaGFwZS4nLCBjb21wb25lbnROYW1lLCBpbnN0YW5jZS5zdGF0ZSA9PT0gbnVsbCA/ICdudWxsJyA6ICd1bmRlZmluZWQnLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9IC8vIElmIG5ldyBjb21wb25lbnQgQVBJcyBhcmUgZGVmaW5lZCwgXCJ1bnNhZmVcIiBsaWZlY3ljbGVzIHdvbid0IGJlIGNhbGxlZC5cbiAgICAvLyBXYXJuIGFib3V0IHRoZXNlIGxpZmVjeWNsZXMgaWYgdGhleSBhcmUgcHJlc2VudC5cbiAgICAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgbWV0aG9kcyB0aG91Z2guXG5cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgZm91bmRXaWxsTW91bnROYW1lID0gbnVsbDtcbiAgICAgIHZhciBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gbnVsbDtcbiAgICAgIHZhciBmb3VuZFdpbGxVcGRhdGVOYW1lID0gbnVsbDtcblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ2NvbXBvbmVudFdpbGxNb3VudCc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdjb21wb25lbnRXaWxsVXBkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsIHx8IGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgdmFyIG5ld0FwaU5hbWUgPSB0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgPyAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCknIDogJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlKCknO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5oYXMoX2NvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZXJyb3IoJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgKyAnJXMgdXNlcyAlcyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOiVzJXMlc1xcblxcbicgKyAnVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzJywgX2NvbXBvbmVudE5hbWUsIG5ld0FwaU5hbWUsIGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnLCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA6ICcnLCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsVXBkYXRlTmFtZSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gIC8vIFJlYWN0RmliZXJDb250ZXh0IHVzdWFsbHkgdXBkYXRlcyB0aGlzIGNhY2hlIGJ1dCBjYW4ndCBmb3IgbmV3bHktY3JlYXRlZCBpbnN0YW5jZXMuXG5cblxuICBpZiAoaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAob2xkU3RhdGUgIT09IGluc3RhbmNlLnN0YXRlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgXCJkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCkge1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gb2xkU3RhdGUpIHtcbiAgICB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gJyArIFwidGhpcy5zdGF0ZSBpcyBkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59IC8vIEludm9rZXMgdGhlIG1vdW50IGxpZmUtY3ljbGVzIG9uIGEgcHJldmlvdXNseSBuZXZlciByZW5kZXJlZCBpbnN0YW5jZS5cblxuXG5mdW5jdGlvbiBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgaW5zdGFuY2UucmVmcyA9IHt9O1xuICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgaW5zdGFuY2UuY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgPT09IG5ld1Byb3BzKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgIHtcbiAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgIH1cblxuICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gX2ZpYmVyRmxhZ3M7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzMiA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MyIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFnczI7XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufSAvLyBJbnZva2VzIHRoZSB1cGRhdGUgbGlmZS1jeWNsZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgaXQgc2hvdWxkbid0IHJlcmVuZGVyLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdW5yZXNvbHZlZE9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPyB1bnJlc29sdmVkT2xkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHVucmVzb2x2ZWRPbGRQcm9wcyk7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG4gIHZhciB1bnJlc29sdmVkTmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dFVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7IC8vIE5vdGU6IER1cmluZyB0aGVzZSBsaWZlLWN5Y2xlcywgaW5zdGFuY2UucHJvcHMvaW5zdGFuY2Uuc3RhdGUgYXJlIHdoYXRcbiAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSBcImN1cnJlbnRcIi4gSG93ZXZlcixcbiAgLy8gZHVyaW5nIGNvbXBvbmVudERpZFVwZGF0ZSB3ZSBwYXNzIHRoZSBcImN1cnJlbnRcIiBwcm9wcy5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cbiAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gdW5yZXNvbHZlZE5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgPT09IHVucmVzb2x2ZWROZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSAmJiAhKGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gICApKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkgfHwgLy8gVE9ETzogSW4gc29tZSBjYXNlcywgd2UnbGwgZW5kIHVwIGNoZWNraW5nIGlmIGNvbnRleHQgaGFzIGNoYW5nZWQgdHdpY2UsXG4gIC8vIGJvdGggYmVmb3JlIGFuZCBhZnRlciBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCBoYXMgYmVlbiBjYWxsZWQuIE5vdCBpZGVhbCxcbiAgLy8gYnV0IEknbSBsb2F0aCB0byByZWZhY3RvciB0aGlzIGZ1bmN0aW9uLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgbWVtb2l6ZWRcbiAgLy8gY29tcG9uZW50cyBzbyBpdCdzIG5vdCB0aGF0IGNvbW1vbi5cbiAgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgIDtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBwcm9wcy9zdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2UpIHtcbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duXG4gIC8vIHNvIHRoZSBzdGFjayBpcyBhY2N1cmF0ZS5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpLFxuICAgIGRpZ2VzdDogbnVsbFxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZSh2YWx1ZSwgZGlnZXN0LCBzdGFjaykge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IG51bGwsXG4gICAgc3RhY2s6IHN0YWNrICE9IG51bGwgPyBzdGFjayA6IG51bGwsXG4gICAgZGlnZXN0OiBkaWdlc3QgIT0gbnVsbCA/IGRpZ2VzdCA6IG51bGxcbiAgfTtcbn1cblxuLy8gVGhpcyBtb2R1bGUgaXMgZm9ya2VkIGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4vLyBCeSBkZWZhdWx0LCByZXR1cm4gYHRydWVgIHRvIGxvZyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUuXG4vLyBGb3JrcyBjYW4gcmV0dXJuIGBmYWxzZWAgaWYgdGhpcyBpc24ndCBkZXNpcmFibGUuXG5mdW5jdGlvbiBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbykge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbG9nQ2FwdHVyZWRFcnJvcihib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gIHRyeSB7XG4gICAgdmFyIGxvZ0Vycm9yID0gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pOyAvLyBBbGxvdyBpbmplY3RlZCBzaG93RXJyb3JEaWFsb2coKSB0byBwcmV2ZW50IGRlZmF1bHQgY29uc29sZS5lcnJvciBsb2dnaW5nLlxuICAgIC8vIFRoaXMgZW5hYmxlcyByZW5kZXJlcnMgbGlrZSBSZWFjdE5hdGl2ZSB0byBiZXR0ZXIgbWFuYWdlIHJlZGJveCBiZWhhdmlvci5cblxuICAgIGlmIChsb2dFcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgICBpZiAodHJ1ZSkge1xuICAgICAgdmFyIHNvdXJjZSA9IGVycm9ySW5mby5zb3VyY2U7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICB2YXIgY29tcG9uZW50U3RhY2sgPSBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJyc7IC8vIEJyb3dzZXJzIHN1cHBvcnQgc2lsZW5jaW5nIHVuY2F1Z2h0IGVycm9ycyBieSBjYWxsaW5nXG4gICAgICAvLyBgcHJldmVudERlZmF1bHQoKWAgaW4gd2luZG93IGBlcnJvcmAgaGFuZGxlci5cbiAgICAgIC8vIFdlIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uIGFzIGFuIGV4cGFuZG8gb24gdGhlIGVycm9yLlxuXG4gICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7XG4gICAgICAgIGlmIChib3VuZGFyeS50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgLy8gVGhlIGVycm9yIGlzIHJlY292ZXJhYmxlIGFuZCB3YXMgc2lsZW5jZWQuXG4gICAgICAgICAgLy8gSWdub3JlIGl0IGFuZCBkb24ndCBwcmludCB0aGUgc3RhY2sgYWRkZW5kdW0uXG4gICAgICAgICAgLy8gVGhpcyBpcyBoYW5keSBmb3IgdGVzdGluZyBlcnJvciBib3VuZGFyaWVzIHdpdGhvdXQgbm9pc2UuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFRoZSBlcnJvciBpcyBmYXRhbC4gU2luY2UgdGhlIHNpbGVuY2luZyBtaWdodCBoYXZlXG4gICAgICAgIC8vIGJlZW4gYWNjaWRlbnRhbCwgd2UnbGwgc3VyZmFjZSBpdCBhbnl3YXkuXG4gICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBicm93c2VyIHdvdWxkIGhhdmUgc2lsZW5jZWQgdGhlIG9yaWdpbmFsIGVycm9yXG4gICAgICAgIC8vIHNvIHdlJ2xsIHByaW50IGl0IGZpcnN0LCBhbmQgdGhlbiBwcmludCB0aGUgc3RhY2sgYWRkZW5kdW0uXG5cblxuICAgICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgICAgIC8vIEZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcyBibG9jaywgc2VlOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMzM4NFxuICAgICAgfVxuXG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IHNvdXJjZSA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoc291cmNlKSA6IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZU1lc3NhZ2UgPSBjb21wb25lbnROYW1lID8gXCJUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIDxcIiArIGNvbXBvbmVudE5hbWUgKyBcIj4gY29tcG9uZW50OlwiIDogJ1RoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzOic7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU1lc3NhZ2U7XG5cbiAgICAgIGlmIChib3VuZGFyeS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gJ0NvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcbicgKyAnVmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Vycm9yLWJvdW5kYXJpZXMgdG8gbGVhcm4gbW9yZSBhYm91dCBlcnJvciBib3VuZGFyaWVzLic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGJvdW5kYXJ5KSB8fCAnQW5vbnltb3VzJztcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSBcIlJlYWN0IHdpbGwgdHJ5IHRvIHJlY3JlYXRlIHRoaXMgY29tcG9uZW50IHRyZWUgZnJvbSBzY3JhdGNoIFwiICsgKFwidXNpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHlvdSBwcm92aWRlZCwgXCIgKyBlcnJvckJvdW5kYXJ5TmFtZSArIFwiLlwiKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbWJpbmVkTWVzc2FnZSA9IGNvbXBvbmVudE5hbWVNZXNzYWdlICsgXCJcXG5cIiArIGNvbXBvbmVudFN0YWNrICsgXCJcXG5cXG5cIiArIChcIlwiICsgZXJyb3JCb3VuZGFyeU1lc3NhZ2UpOyAvLyBJbiBkZXZlbG9wbWVudCwgd2UgcHJvdmlkZSBvdXIgb3duIG1lc3NhZ2Ugd2l0aCBqdXN0IHRoZSBjb21wb25lbnQgc3RhY2suXG4gICAgICAvLyBXZSBkb24ndCBpbmNsdWRlIHRoZSBvcmlnaW5hbCBlcnJvciBtZXNzYWdlIGFuZCBKUyBzdGFjayBiZWNhdXNlIHRoZSBicm93c2VyXG4gICAgICAvLyBoYXMgYWxyZWFkeSBwcmludGVkIGl0LiBFdmVuIGlmIHRoZSBhcHBsaWNhdGlvbiBzd2FsbG93cyB0aGUgZXJyb3IsIGl0IGlzIHN0aWxsXG4gICAgICAvLyBkaXNwbGF5ZWQgYnkgdGhlIGJyb3dzZXIgdGhhbmtzIHRvIHRoZSBERVYtb25seSBmYWtlIGV2ZW50IHRyaWNrIGluIFJlYWN0RXJyb3JVdGlscy5cblxuICAgICAgY29uc29sZVsnZXJyb3InXShjb21iaW5lZE1lc3NhZ2UpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gcHJvZHVjdGlvbiwgd2UgcHJpbnQgdGhlIGVycm9yIGRpcmVjdGx5LlxuICAgICAgLy8gVGhpcyB3aWxsIGluY2x1ZGUgdGhlIG1lc3NhZ2UsIHRoZSBKUyBzdGFjaywgYW5kIGFueXRoaW5nIHRoZSBicm93c2VyIHdhbnRzIHRvIHNob3cuXG4gICAgICAvLyBXZSBwYXNzIHRoZSBlcnJvciBvYmplY3QgaW5zdGVhZCBvZiBjdXN0b20gbWVzc2FnZSBzbyB0aGF0IHRoZSBicm93c2VyIGRpc3BsYXlzIHRoZSBlcnJvciBuYXRpdmVseS5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUaGlzIG1ldGhvZCBtdXN0IG5vdCB0aHJvdywgb3IgUmVhY3QgaW50ZXJuYWwgc3RhdGUgd2lsbCBnZXQgbWVzc2VkIHVwLlxuICAgIC8vIElmIGNvbnNvbGUuZXJyb3IgaXMgb3ZlcnJpZGRlbiwgb3IgbG9nQ2FwdHVyZWRFcnJvcigpIHNob3dzIGEgZGlhbG9nIHRoYXQgdGhyb3dzLFxuICAgIC8vIHdlIHdhbnQgdG8gcmVwb3J0IHRoaXMgZXJyb3Igb3V0c2lkZSBvZiB0aGUgbm9ybWFsIHN0YWNrIGFzIGEgbGFzdCByZXNvcnQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzE4OFxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgUG9zc2libHlXZWFrTWFwJDEgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpOyAvLyBVbm1vdW50IHRoZSByb290IGJ5IHJlbmRlcmluZyBudWxsLlxuXG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBudWxsXG4gIH07XG4gIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcblxuICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgb25VbmNhdWdodEVycm9yKGVycm9yKTtcbiAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuICB9O1xuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTtcbiAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7XG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPSBmaWJlci50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtcblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgdXBkYXRlLnBheWxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yJDEpO1xuICAgIH07XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGluc3QgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgaWYgKGluc3QgIT09IG51bGwgJiYgdHlwZW9mIGluc3QuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHtcbiAgICAgICAgbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpO1xuICAgICAgfVxuXG4gICAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuXG4gICAgICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUbyBwcmVzZXJ2ZSB0aGUgcHJlZXhpc3RpbmcgcmV0cnkgYmVoYXZpb3Igb2YgZXJyb3IgYm91bmRhcmllcyxcbiAgICAgICAgLy8gd2Uga2VlcCB0cmFjayBvZiB3aGljaCBvbmVzIGFscmVhZHkgZmFpbGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgICAgICAvLyBUaGlzIGdldHMgcmVzZXQgYmVmb3JlIHdlIHlpZWxkIGJhY2sgdG8gdGhlIGJyb3dzZXIuXG4gICAgICAgIC8vIFRPRE86IFdhcm4gaW4gc3RyaWN0IG1vZGUgaWYgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzXG4gICAgICAgIC8vIG5vdCBkZWZpbmVkLlxuICAgICAgICBtYXJrTGVnYWN5RXJyb3JCb3VuZGFyeUFzRmFpbGVkKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcbiAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjaztcbiAgICAgIHRoaXMuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IkMSwge1xuICAgICAgICBjb21wb25lbnRTdGFjazogc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnXG4gICAgICB9KTtcblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIElmIGNvbXBvbmVudERpZENhdGNoIGlzIHRoZSBvbmx5IGVycm9yIGJvdW5kYXJ5IG1ldGhvZCBkZWZpbmVkLFxuICAgICAgICAgIC8vIHRoZW4gaXQgbmVlZHMgdG8gY2FsbCBzZXRTdGF0ZSB0byByZWNvdmVyIGZyb20gZXJyb3JzLlxuICAgICAgICAgIC8vIElmIG5vIHN0YXRlIHVwZGF0ZSBpcyBzY2hlZHVsZWQgdGhlbiB0aGUgYm91bmRhcnkgd2lsbCBzd2FsbG93IHRoZSBlcnJvci5cbiAgICAgICAgICBpZiAoIWluY2x1ZGVzU29tZUxhbmUoZmliZXIubGFuZXMsIFN5bmNMYW5lKSkge1xuICAgICAgICAgICAgZXJyb3IoJyVzOiBFcnJvciBib3VuZGFyaWVzIHNob3VsZCBpbXBsZW1lbnQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkuICcgKyAnSW4gdGhhdCBtZXRob2QsIHJldHVybiBhIHN0YXRlIHVwZGF0ZSB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2Ugb3IgZmFsbGJhY2sgVUkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCBsYW5lcykge1xuICAvLyBBdHRhY2ggYSBwaW5nIGxpc3RlbmVyXG4gIC8vXG4gIC8vIFRoZSBkYXRhIG1pZ2h0IHJlc29sdmUgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8gY29tbWl0IHRoZSBmYWxsYmFjay4gT3IsXG4gIC8vIGluIHRoZSBjYXNlIG9mIGEgcmVmcmVzaCwgd2UnbGwgbmV2ZXIgY29tbWl0IGEgZmFsbGJhY2suIFNvIHdlIG5lZWQgdG9cbiAgLy8gYXR0YWNoIGEgbGlzdGVuZXIgbm93LiBXaGVuIGl0IHJlc29sdmVzIChcInBpbmdzXCIpLCB3ZSBjYW4gZGVjaWRlIHdoZXRoZXIgdG9cbiAgLy8gdHJ5IHJlbmRlcmluZyB0aGUgdHJlZSBhZ2Fpbi5cbiAgLy9cbiAgLy8gT25seSBhdHRhY2ggYSBsaXN0ZW5lciBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGxhbmVzXG4gIC8vIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgKHdoaWNoIGFjdHMgbGlrZSBhIFwidGhyZWFkIElEXCIgaGVyZSkuXG4gIC8vXG4gIC8vIFdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGluIGNvbmN1cnJlbnQgbW9kZS4gTGVnYWN5IFN1c3BlbnNlIGFsd2F5c1xuICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgdmFyIHRocmVhZElEcztcblxuICBpZiAocGluZ0NhY2hlID09PSBudWxsKSB7XG4gICAgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwJDEoKTtcbiAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKTtcblxuICAgIGlmICh0aHJlYWRJRHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRocmVhZElEcy5oYXMobGFuZXMpKSB7XG4gICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgdGhyZWFkIElEIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICB0aHJlYWRJRHMuYWRkKGxhbmVzKTtcbiAgICB2YXIgcGluZyA9IHBpbmdTdXNwZW5kZWRSb290LmJpbmQobnVsbCwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKTtcblxuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnNcbiAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FrZWFibGUudGhlbihwaW5nLCBwaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRhY2hSZXRyeUxpc3RlbmVyKHN1c3BlbnNlQm91bmRhcnksIHJvb3QsIHdha2VhYmxlLCBsYW5lcykge1xuICAvLyBSZXRyeSBsaXN0ZW5lclxuICAvL1xuICAvLyBJZiB0aGUgZmFsbGJhY2sgZG9lcyBjb21taXQsIHdlIG5lZWQgdG8gYXR0YWNoIGEgZGlmZmVyZW50IHR5cGUgb2ZcbiAgLy8gbGlzdGVuZXIuIFRoaXMgb25lIHNjaGVkdWxlcyBhbiB1cGRhdGUgb24gdGhlIFN1c3BlbnNlIGJvdW5kYXJ5IHRvIHR1cm5cbiAgLy8gdGhlIGZhbGxiYWNrIHN0YXRlIG9mZi5cbiAgLy9cbiAgLy8gU3Rhc2ggdGhlIHdha2VhYmxlIG9uIHRoZSBib3VuZGFyeSBmaWJlciBzbyB3ZSBjYW4gYWNjZXNzIGl0IGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UuXG4gIC8vXG4gIC8vIFdoZW4gdGhlIHdha2VhYmxlIHJlc29sdmVzLCB3ZSdsbCBhdHRlbXB0IHRvIHJlbmRlciB0aGUgYm91bmRhcnlcbiAgLy8gYWdhaW4gKFwicmV0cnlcIikuXG4gIHZhciB3YWtlYWJsZXMgPSBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgPT09IG51bGwpIHtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSBuZXcgU2V0KCk7XG4gICAgdXBkYXRlUXVldWUuYWRkKHdha2VhYmxlKTtcbiAgICBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWU7XG4gIH0gZWxzZSB7XG4gICAgd2FrZWFibGVzLmFkZCh3YWtlYWJsZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRTdXNwZW5kZWRDb21wb25lbnQoc291cmNlRmliZXIsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBBIGxlZ2FjeSBtb2RlIFN1c3BlbnNlIHF1aXJrLCBvbmx5IHJlbGV2YW50IHRvIGhvb2sgY29tcG9uZW50cy5cblxuXG4gIHZhciB0YWcgPSBzb3VyY2VGaWJlci50YWc7XG5cbiAgaWYgKChzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgKHRhZyA9PT0gRnVuY3Rpb25Db21wb25lbnQgfHwgdGFnID09PSBGb3J3YXJkUmVmIHx8IHRhZyA9PT0gU2ltcGxlTWVtb0NvbXBvbmVudCkpIHtcbiAgICB2YXIgY3VycmVudFNvdXJjZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50U291cmNlKSB7XG4gICAgICBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSA9IGN1cnJlbnRTb3VyY2UudXBkYXRlUXVldWU7XG4gICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gY3VycmVudFNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICAgICAgc291cmNlRmliZXIubGFuZXMgPSBjdXJyZW50U291cmNlLmxhbmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpIHtcbiAgdmFyIG5vZGUgPSByZXR1cm5GaWJlcjtcblxuICBkbyB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCAmJiBzaG91bGRDYXB0dXJlU3VzcGVuc2Uobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0gLy8gVGhpcyBib3VuZGFyeSBhbHJlYWR5IGNhcHR1cmVkIGR1cmluZyB0aGlzIHJlbmRlci4gQ29udGludWUgdG8gdGhlIG5leHRcbiAgICAvLyBib3VuZGFyeS5cblxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9IHdoaWxlIChub2RlICE9PSBudWxsKTtcblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgbWFya3MgYSBTdXNwZW5zZSBib3VuZGFyeSBzbyB0aGF0IHdoZW4gd2UncmUgdW53aW5kaW5nIHRoZSBzdGFjayxcbiAgLy8gaXQgY2FwdHVyZXMgdGhlIHN1c3BlbmRlZCBcImV4Y2VwdGlvblwiIGFuZCBkb2VzIGEgc2Vjb25kIChmYWxsYmFjaykgcGFzcy5cbiAgaWYgKChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIC8vIExlZ2FjeSBNb2RlIFN1c3BlbnNlXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgYm91bmRhcnkgaXMgaW4gbGVnYWN5IG1vZGUsIHdlIHNob3VsZCAqbm90KlxuICAgIC8vIHN1c3BlbmQgdGhlIGNvbW1pdC4gUHJldGVuZCBhcyBpZiB0aGUgc3VzcGVuZGVkIGNvbXBvbmVudCByZW5kZXJlZFxuICAgIC8vIG51bGwgYW5kIGtlZXAgcmVuZGVyaW5nLiBXaGVuIHRoZSBTdXNwZW5zZSBib3VuZGFyeSBjb21wbGV0ZXMsXG4gICAgLy8gd2UnbGwgZG8gYSBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5ID09PSByZXR1cm5GaWJlcikge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlIHdoZXJlIHdlIHN1c3BlbmRlZCB3aGlsZSByZWNvbmNpbGluZyB0aGUgY2hpbGRyZW4gb2ZcbiAgICAgIC8vIGEgU3VzcGVuc2UgYm91bmRhcnkncyBpbm5lciBPZmZzY3JlZW4gd3JhcHBlciBmaWJlci4gVGhpcyBoYXBwZW5zXG4gICAgICAvLyB3aGVuIGEgUmVhY3QubGF6eSBjb21wb25lbnQgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnkuXG4gICAgICAvL1xuICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcmllcyBhcmUgaW1wbGVtZW50ZWQgYXMgbXVsdGlwbGUgZmliZXJzLCBidXQgdGhleVxuICAgICAgLy8gYXJlIGEgc2luZ2xlIGNvbmNlcHR1YWwgdW5pdC4gVGhlIGxlZ2FjeSBtb2RlIGJlaGF2aW9yIHdoZXJlIHdlXG4gICAgICAvLyBwcmV0ZW5kIHRoZSBzdXNwZW5kZWQgZmliZXIgY29tbWl0dGVkIGFzIGBudWxsYCB3b24ndCB3b3JrLFxuICAgICAgLy8gYmVjYXVzZSBpbiB0aGlzIGNhc2UgdGhlIFwic3VzcGVuZGVkXCIgZmliZXIgaXMgdGhlIGlubmVyXG4gICAgICAvLyBPZmZzY3JlZW4gd3JhcHBlci5cbiAgICAgIC8vXG4gICAgICAvLyBCZWNhdXNlIHRoZSBjb250ZW50cyBvZiB0aGUgYm91bmRhcnkgaGF2ZW4ndCBzdGFydGVkIHJlbmRlcmluZ1xuICAgICAgLy8geWV0IChpLmUuIG5vdGhpbmcgaW4gdGhlIHRyZWUgaGFzIHBhcnRpYWxseSByZW5kZXJlZCkgd2UgY2FuXG4gICAgICAvLyBzd2l0Y2ggdG8gdGhlIHJlZ3VsYXIsIGNvbmN1cnJlbnQgbW9kZSBiZWhhdmlvcjogbWFyayB0aGVcbiAgICAgIC8vIGJvdW5kYXJ5IHdpdGggU2hvdWxkQ2FwdHVyZSBhbmQgZW50ZXIgdGhlIHVud2luZCBwaGFzZS5cbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgc291cmNlRmliZXIuZmxhZ3MgfD0gRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZTsgLy8gV2UncmUgZ29pbmcgdG8gY29tbWl0IHRoaXMgZmliZXIgZXZlbiB0aG91Z2ggaXQgZGlkbid0IGNvbXBsZXRlLlxuICAgICAgLy8gQnV0IHdlIHNob3VsZG4ndCBjYWxsIGFueSBsaWZlY3ljbGUgbWV0aG9kcyBvciBjYWxsYmFja3MuIFJlbW92ZVxuICAgICAgLy8gYWxsIGxpZmVjeWNsZSBlZmZlY3QgdGFncy5cblxuICAgICAgc291cmNlRmliZXIuZmxhZ3MgJj0gfihMaWZlY3ljbGVFZmZlY3RNYXNrIHwgSW5jb21wbGV0ZSk7XG5cbiAgICAgIGlmIChzb3VyY2VGaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBjdXJyZW50U291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2VGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgbW91bnQuIENoYW5nZSB0aGUgdGFnIHNvIGl0J3Mgbm90IG1pc3Rha2VuIGZvciBhXG4gICAgICAgICAgLy8gY29tcGxldGVkIGNsYXNzIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgY2FsbFxuICAgICAgICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50IGlmIGl0IGlzIGRlbGV0ZWQuXG4gICAgICAgICAgc291cmNlRmliZXIudGFnID0gSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdoZW4gd2UgdHJ5IHJlbmRlcmluZyBhZ2Fpbiwgd2Ugc2hvdWxkIG5vdCByZXVzZSB0aGUgY3VycmVudCBmaWJlcixcbiAgICAgICAgICAvLyBzaW5jZSBpdCdzIGtub3duIHRvIGJlIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gVXNlIGEgZm9yY2UgdXBkYXRlIHRvXG4gICAgICAgICAgLy8gcHJldmVudCBhIGJhaWwgb3V0LlxuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIFN5bmNMYW5lKTtcbiAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG4gICAgICAgICAgZW5xdWV1ZVVwZGF0ZShzb3VyY2VGaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLiBNYXJrIGl0IHdpdGggU3luYyBwcmlvcml0eSB0b1xuICAgICAgLy8gaW5kaWNhdGUgdGhhdCBpdCBzdGlsbCBoYXMgcGVuZGluZyB3b3JrLlxuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgU3luY0xhbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xuICB9IC8vIENvbmZpcm1lZCB0aGF0IHRoZSBib3VuZGFyeSBpcyBpbiBhIGNvbmN1cnJlbnQgbW9kZSB0cmVlLiBDb250aW51ZVxuICAvLyB3aXRoIHRoZSBub3JtYWwgc3VzcGVuZCBwYXRoLlxuICAvL1xuICAvLyBBZnRlciB0aGlzIHdlJ2xsIHVzZSBhIHNldCBvZiBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXNcbiAgLy8gcmVuZGVyIHBhc3Mgd2lsbCBydW4gdG8gY29tcGxldGlvbiBvciByZXN0YXJ0IG9yIFwic3VzcGVuZFwiIHRoZSBjb21taXQuXG4gIC8vIFRoZSBhY3R1YWwgbG9naWMgZm9yIHRoaXMgaXMgc3ByZWFkIG91dCBpbiBkaWZmZXJlbnQgcGxhY2VzLlxuICAvL1xuICAvLyBUaGlzIGZpcnN0IHByaW5jaXBsZSBpcyB0aGF0IGlmIHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2hlbiB3ZSBjb21wbGV0ZVxuICAvLyBhIHJvb3QsIHRoZW4gd2Ugc2hvdWxkIGFsc28gcmVzdGFydCBpZiB3ZSBnZXQgYW4gdXBkYXRlIG9yIHBpbmcgdGhhdFxuICAvLyBtaWdodCB1bnN1c3BlbmQgaXQsIGFuZCB2aWNlIHZlcnNhLiBUaGUgb25seSByZWFzb24gdG8gc3VzcGVuZCBpc1xuICAvLyBiZWNhdXNlIHlvdSB0aGluayB5b3UgbWlnaHQgd2FudCB0byByZXN0YXJ0IGJlZm9yZSBjb21taXR0aW5nLiBIb3dldmVyLFxuICAvLyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVzdGFydCBvbmx5IHdoaWxlIGluIHRoZSBwZXJpb2Qgd2UncmUgc3VzcGVuZGVkLlxuICAvL1xuICAvLyBSZXN0YXJ0aW5nIHRvbyBhZ2dyZXNzaXZlbHkgaXMgYWxzbyBub3QgZ29vZCBiZWNhdXNlIGl0IHN0YXJ2ZXMgb3V0IGFueVxuICAvLyBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gU28gd2UgdXNlIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZW4uXG4gIC8vIFN1c3BlbnNlIEhldXJpc3RpY3NcbiAgLy9cbiAgLy8gSWYgbm90aGluZyB0aHJldyBhIFByb21pc2Ugb3IgYWxsIHRoZSBzYW1lIGZhbGxiYWNrcyBhcmUgYWxyZWFkeSBzaG93aW5nLFxuICAvLyB0aGVuIGRvbid0IHN1c3BlbmQvcmVzdGFydC5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBhbiBpbml0aWFsIHJlbmRlciBvZiBhIG5ldyB0cmVlIG9mIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gIC8vIHRob3NlIHRyaWdnZXIgYSBmYWxsYmFjaywgdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgY2FuIHNob3cgdGhlIGluaXRpYWwgbG9hZGluZyBzdGF0ZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLlxuICAvL1xuICAvLyBJZiB3ZSBoaXQgYSBcIkRlbGF5ZWRcIiBjYXNlLCBzdWNoIGFzIHdoZW4gd2UnZCBzd2l0Y2ggZnJvbSBjb250ZW50IGJhY2sgaW50b1xuICAvLyBhIGZhbGxiYWNrLCB0aGVuIHdlIHNob3VsZCBhbHdheXMgc3VzcGVuZC9yZXN0YXJ0LiBUcmFuc2l0aW9ucyBhcHBseVxuICAvLyB0byB0aGlzIGNhc2UuIElmIG5vbmUgaXMgZGVmaW5lZCwgSk5EIGlzIHVzZWQgaW5zdGVhZC5cbiAgLy9cbiAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgYW5kIGl0IGdldHMgXCJyZXRyaWVkXCIsIGFsbG93aW5nIHVzIHRvIHNob3dcbiAgLy8gYW5vdGhlciBsZXZlbCwgYnV0IHRoZXJlJ3Mgc3RpbGwgYW4gaW5uZXIgYm91bmRhcnkgdGhhdCB3b3VsZCBzaG93IGEgZmFsbGJhY2ssXG4gIC8vIHRoZW4gd2Ugc3VzcGVuZC9yZXN0YXJ0IGZvciA1MDBtcyBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHNob3dlZCBhIGZhbGxiYWNrXG4gIC8vIGFueXdoZXJlIGluIHRoZSB0cmVlLiBUaGlzIGVmZmVjdGl2ZWx5IHRocm90dGxlcyBwcm9ncmVzc2l2ZSBsb2FkaW5nIGludG8gYVxuICAvLyBjb25zaXN0ZW50IHRyYWluIG9mIGNvbW1pdHMuIFRoaXMgYWxzbyBnaXZlcyB1cyBhbiBvcHBvcnR1bml0eSB0byByZXN0YXJ0IHRvXG4gIC8vIGdldCB0byB0aGUgY29tcGxldGVkIHN0YXRlIHNsaWdodGx5IGVhcmxpZXIuXG4gIC8vXG4gIC8vIElmIHRoZXJlJ3MgYW1iaWd1aXR5IGR1ZSB0byBiYXRjaGluZyBpdCdzIHJlc29sdmVkIGluIHByZWZlcmVuY2Ugb2Y6XG4gIC8vIDEpIFwiZGVsYXllZFwiLCAyKSBcImluaXRpYWwgcmVuZGVyXCIsIDMpIFwicmV0cnlcIi5cbiAgLy9cbiAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCBhIFwiYnVzeVwiIHN0YXRlIGRvZXNuJ3QgZ2V0IGZvcmNlIGNvbW1pdHRlZC4gV2Ugd2FudCB0b1xuICAvLyBlbnN1cmUgdGhhdCBuZXcgaW5pdGlhbCBsb2FkaW5nIHN0YXRlcyBjYW4gY29tbWl0IGFzIHNvb24gYXMgcG9zc2libGUuXG5cblxuICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIFRPRE86IEkgdGhpbmsgd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSBub3cgdXNlIGBEaWRDYXB0dXJlYCBpblxuICAvLyB0aGUgYmVnaW4gcGhhc2UgdG8gcHJldmVudCBhbiBlYXJseSBiYWlsb3V0LlxuXG4gIHN1c3BlbnNlQm91bmRhcnkubGFuZXMgPSByb290UmVuZGVyTGFuZXM7XG4gIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xufVxuXG5mdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbihyb290LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHZhbHVlLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLlxuICBzb3VyY2VGaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuXG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCByZXN0b3JlIHRoZSBvcmlnaW5hbCB1cGRhdGVyc1xuICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCByb290UmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVGhpcyBpcyBhIHdha2VhYmxlLiBUaGUgY29tcG9uZW50IHN1c3BlbmRlZC5cbiAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTtcbiAgICByZXNldFN1c3BlbmRlZENvbXBvbmVudChzb3VyY2VGaWJlcik7XG5cbiAgICB7XG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIHZhciBzdXNwZW5zZUJvdW5kYXJ5ID0gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpO1xuXG4gICAgaWYgKHN1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgJj0gfkZvcmNlQ2xpZW50UmVuZGVyO1xuICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gV2Ugb25seSBhdHRhY2ggcGluZyBsaXN0ZW5lcnMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzXG4gICAgICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG5cbiAgICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBib3VuZGFyeSB3YXMgZm91bmQuIFVubGVzcyB0aGlzIGlzIGEgc3luYyB1cGRhdGUsIHRoaXMgaXMgT0suXG4gICAgICAvLyBXZSBjYW4gc3VzcGVuZCBhbmQgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cbiAgICAgIGlmICghaW5jbHVkZXNTeW5jTGFuZShyb290UmVuZGVyTGFuZXMpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgbm90IGEgc3luYyB1cGRhdGUuIFN1c3BlbmQuIFNpbmNlIHdlJ3JlIG5vdCBhY3RpdmF0aW5nIGFcbiAgICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIHRoaXMgd2lsbCB1bndpbmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgd2l0aG91dFxuICAgICAgICAvLyBwZXJmb3JtaW5nIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIGEgZmFsbGJhY2suIChUaGlzIGlzIGFyZ3VhYmx5IGhvd1xuICAgICAgICAvLyByZWZyZXNoIHRyYW5zaXRpb25zIHNob3VsZCB3b3JrLCB0b28sIHNpbmNlIHdlJ3JlIG5vdCBnb2luZyB0byBjb21taXRcbiAgICAgICAgLy8gdGhlIGZhbGxiYWNrcyBhbnl3YXkuKVxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGNhc2UgYWxzbyBhcHBsaWVzIHRvIGluaXRpYWwgaHlkcmF0aW9uLlxuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBUaGlzIGlzIGEgc3luYy9kaXNjcmV0ZSB1cGRhdGUuIFdlIHRyZWF0IHRoaXMgY2FzZSBsaWtlIGFuIGVycm9yXG4gICAgICAvLyBiZWNhdXNlIGRpc2NyZXRlIHJlbmRlcnMgYXJlIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBjb21wbGV0ZSB0cmVlXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggZXh0ZXJuYWwgc3RhdGUuXG5cblxuICAgICAgdmFyIHVuY2F1Z2h0U3VzcGVuc2VFcnJvciA9IG5ldyBFcnJvcignQSBjb21wb25lbnQgc3VzcGVuZGVkIHdoaWxlIHJlc3BvbmRpbmcgdG8gc3luY2hyb25vdXMgaW5wdXQuIFRoaXMgJyArICd3aWxsIGNhdXNlIHRoZSBVSSB0byBiZSByZXBsYWNlZCB3aXRoIGEgbG9hZGluZyBpbmRpY2F0b3IuIFRvICcgKyAnZml4LCB1cGRhdGVzIHRoYXQgc3VzcGVuZCBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ3dpdGggc3RhcnRUcmFuc2l0aW9uLicpOyAvLyBJZiB3ZSdyZSBvdXRzaWRlIGEgdHJhbnNpdGlvbiwgZmFsbCB0aHJvdWdoIHRvIHRoZSByZWd1bGFyIGVycm9yIHBhdGguXG4gICAgICAvLyBUaGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQgYnkgdGhlIG5lYXJlc3Qgc3VzcGVuc2UgYm91bmRhcnkuXG5cbiAgICAgIHZhbHVlID0gdW5jYXVnaHRTdXNwZW5zZUVycm9yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVndWxhciBlcnJvciwgbm90IGEgU3VzcGVuc2Ugd2FrZWFibGUuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpO1xuXG4gICAgICB2YXIgX3N1c3BlbnNlQm91bmRhcnkgPSBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcik7IC8vIElmIHRoZSBlcnJvciB3YXMgdGhyb3duIGR1cmluZyBoeWRyYXRpb24sIHdlIG1heSBiZSBhYmxlIHRvIHJlY292ZXIgYnlcbiAgICAgIC8vIGRpc2NhcmRpbmcgdGhlIGRlaHlkcmF0ZWQgY29udGVudCBhbmQgc3dpdGNoaW5nIHRvIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIC8vIEluc3RlYWQgb2Ygc3VyZmFjaW5nIHRoZSBlcnJvciwgZmluZCB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeVxuICAgICAgLy8gYW5kIHJlbmRlciBpdCBhZ2FpbiB3aXRob3V0IGh5ZHJhdGlvbi5cblxuXG4gICAgICBpZiAoX3N1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKChfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmIFNob3VsZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIHNob3VsZCB0cnkgcmVuZGVyaW5nIHRoZSBub3JtYWxcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhZ2Fpbiwgbm90IHRoZSBmYWxsYmFjay5cbiAgICAgICAgICBfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShfc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBFdmVuIHRob3VnaCB0aGUgdXNlciBtYXkgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgZXJyb3IsIHdlIHNob3VsZFxuICAgICAgICAvLyBzdGlsbCBsb2cgaXQgc28gaXQgY2FuIGJlIGZpeGVkLlxuXG4gICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IoY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gIHJlbmRlckRpZEVycm9yKHZhbHVlKTsgLy8gV2UgZGlkbid0IGZpbmQgYSBib3VuZGFyeSB0aGF0IGNvdWxkIGhhbmRsZSB0aGlzIHR5cGUgb2YgZXhjZXB0aW9uLiBTdGFydFxuICAvLyBvdmVyIGFuZCB0cmF2ZXJzZSBwYXJlbnQgcGF0aCBhZ2FpbiwgdGhpcyB0aW1lIHRyZWF0aW5nIHRoZSBleGNlcHRpb25cbiAgLy8gYXMgYW4gZXJyb3IuXG5cbiAgdmFyIHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9lcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIGxhbmUpO1xuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIF9lcnJvckluZm8sIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gQ2FwdHVyZSBhbmQgcmV0cnlcbiAgICAgICAgdmFyIGVycm9ySW5mbyA9IHZhbHVlO1xuICAgICAgICB2YXIgY3RvciA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MgJiYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCBpbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG5cbiAgICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBfbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIF91cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBlcnJvckluZm8sIF9sYW5lKTtcblxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gIH0gd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkQ2FjaGUoKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgc3VzcGVuZHMuIEl0IHJldHVybnMgdGhlXG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5BYm91dEJhZENsYXNzO1xudmFyIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzO1xudmFyIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHM7XG52YXIgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXI7XG52YXIgZGlkV2FybkFib3V0VGFpbE9wdGlvbnM7XG52YXIgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudDtcblxue1xuICBkaWRXYXJuQWJvdXRCYWRDbGFzcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyID0ge307XG4gIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zID0ge307XG4gIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgZnJlc2ggbmV3IGNvbXBvbmVudCB0aGF0IGhhc24ndCBiZWVuIHJlbmRlcmVkIHlldCwgd2VcbiAgICAvLyB3b24ndCB1cGRhdGUgaXRzIGNoaWxkIHNldCBieSBhcHBseWluZyBtaW5pbWFsIHNpZGUtZWZmZWN0cy4gSW5zdGVhZCxcbiAgICAvLyB3ZSB3aWxsIGFkZCB0aGVtIGFsbCB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IGdldHMgcmVuZGVyZWQuIFRoYXQgbWVhbnNcbiAgICAvLyB3ZSBjYW4gb3B0aW1pemUgdGhpcyByZWNvbmNpbGlhdGlvbiBwYXNzIGJ5IG5vdCB0cmFja2luZyBzaWRlLWVmZmVjdHMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgd29yayBpbiBwcm9ncmVzcywgaXQgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGhhdmVuJ3QgeWV0IHN0YXJ0ZWQgYW55IHdvcmsgb24gdGhlc2UgY2hpbGRyZW4uIFRoZXJlZm9yZSwgd2UgdXNlXG4gICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbi5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXJcbiAgLy8gaWRlbnRpdGllcyBtYXRjaC5cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIGFmdGVyIHRoZSBmaXJzdCByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcmVuZGVyID0gQ29tcG9uZW50LnJlbmRlcjtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjsgLy8gVGhlIHJlc3QgaXMgYSBmb3JrIG9mIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50XG5cbiAgdmFyIG5leHRDaGlsZHJlbjtcbiAgdmFyIGhhc0lkO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB2YXIgdHlwZSA9IENvbXBvbmVudC50eXBlO1xuXG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiYgLy8gU2ltcGxlTWVtb0NvbXBvbmVudCBjb2RlcGF0aCBkb2Vzbid0IHJlc29sdmUgb3V0ZXIgcHJvcHMgZWl0aGVyLlxuICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gU2ltcGxlTWVtb0NvbXBvbmVudDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlZFR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCB0eXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlc29sdmVkVHlwZSwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICggQ29tcG9uZW50LmRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICBlcnJvcignJXM6IFN1cHBvcnQgZm9yIGRlZmF1bHRQcm9wcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBtZW1vIGNvbXBvbmVudHMgJyArICdpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBVc2UgSmF2YVNjcmlwdCBkZWZhdWx0IHBhcmFtZXRlcnMgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICAgIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKENvbXBvbmVudC50eXBlLCBudWxsLCBuZXh0UHJvcHMsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5tb2RlLCByZW5kZXJMYW5lcyk7XG4gICAgY2hpbGQucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICAgIGNoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2hpbGQ7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAge1xuICAgIHZhciBfdHlwZSA9IENvbXBvbmVudC50eXBlO1xuICAgIHZhciBfaW5uZXJQcm9wVHlwZXMgPSBfdHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAoX2lubmVyUHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgIGNoZWNrUHJvcFR5cGVzKF9pbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoX3R5cGUpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhpcyBpcyBhbHdheXMgZXhhY3RseSBvbmUgY2hpbGRcblxuICB2YXIgaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ID0gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuXG4gIGlmICghaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KSB7XG4gICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBwcm9wcyB3aXRoIHJlc29sdmVkIGRlZmF1bHRQcm9wcyxcbiAgICAvLyB1bmxpa2UgY3VycmVudC5tZW1vaXplZFByb3BzIHdoaWNoIHdpbGwgYmUgdGhlIHVucmVzb2x2ZWQgb25lcy5cbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudENoaWxkLm1lbW9pemVkUHJvcHM7IC8vIERlZmF1bHQgdG8gc2hhbGxvdyBjb21wYXJpc29uXG5cbiAgICB2YXIgY29tcGFyZSA9IENvbXBvbmVudC5jb21wYXJlO1xuICAgIGNvbXBhcmUgPSBjb21wYXJlICE9PSBudWxsID8gY29tcGFyZSA6IHNoYWxsb3dFcXVhbDtcblxuICAgIGlmIChjb21wYXJlKHByZXZQcm9wcywgbmV4dFByb3BzKSAmJiBjdXJyZW50LnJlZiA9PT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIG5leHRQcm9wcyk7XG4gIG5ld0NoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIHJldHVybiBuZXdDaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGlubmVyIHJlbmRlciBzdXNwZW5kcy5cbiAgLy8gV2UnbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgZmluZSBvciBjYW4gY2F1c2UgaXNzdWVzLlxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIG91dGVyTWVtb1R5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTtcblxuICAgICAgaWYgKG91dGVyTWVtb1R5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAvLyBXZSB3YXJuIHdoZW4geW91IGRlZmluZSBwcm9wVHlwZXMgb24gbGF6eSgpXG4gICAgICAgIC8vIHNvIGxldCdzIGp1c3Qgc2tpcCBvdmVyIGl0IHRvIGZpbmQgbWVtbygpIG91dGVyIHdyYXBwZXIuXG4gICAgICAgIC8vIElubmVyIHByb3BzIGZvciBtZW1vIGFyZSB2YWxpZGF0ZWQgbGF0ZXIuXG4gICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gb3V0ZXJNZW1vVHlwZTtcbiAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvdXRlck1lbW9UeXBlID0gaW5pdChwYXlsb2FkKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBudWxsO1xuICAgICAgICB9IC8vIElubmVyIHByb3BUeXBlcyB3aWxsIGJlIHZhbGlkYXRlZCBpbiB0aGUgZnVuY3Rpb24gY29tcG9uZW50IHBhdGguXG5cblxuICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBvdXRlck1lbW9UeXBlICYmIG91dGVyTWVtb1R5cGUucHJvcFR5cGVzO1xuXG4gICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIChTaW1wbGVNZW1vQ29tcG9uZW50IGhhcyBubyBkZWZhdWx0UHJvcHMpXG4gICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3V0ZXJNZW1vVHlwZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKHNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJiAoIC8vIFByZXZlbnQgYmFpbG91dCBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZC5cbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsgLy8gVGhlIHByb3BzIGFyZSBzaGFsbG93bHkgZXF1YWwuIFJldXNlIHRoZSBwcmV2aW91cyBwcm9wcyBvYmplY3QsIGxpa2Ugd2VcbiAgICAgIC8vIHdvdWxkIGR1cmluZyBhIG5vcm1hbCBmaWJlciBiYWlsb3V0LlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgc3Ryb25nIGd1YXJhbnRlZXMgdGhhdCB0aGUgcHJvcHMgb2JqZWN0IGlzIHJlZmVyZW50aWFsbHlcbiAgICAgIC8vIGVxdWFsIGR1cmluZyB1cGRhdGVzIHdoZXJlIHdlIGNhbid0IGJhaWwgb3V0IGFueXdheSDigJQgbGlrZSBpZiB0aGUgcHJvcHNcbiAgICAgIC8vIGFyZSBzaGFsbG93bHkgZXF1YWwsIGJ1dCB0aGVyZSdzIGEgbG9jYWwgc3RhdGUgb3IgY29udGV4dCB1cGRhdGUgaW4gdGhlXG4gICAgICAvLyBzYW1lIGJhdGNoLlxuICAgICAgLy9cbiAgICAgIC8vIEhvd2V2ZXIsIGFzIGEgcHJpbmNpcGxlLCB3ZSBzaG91bGQgYWltIHRvIG1ha2UgdGhlIGJlaGF2aW9yIGNvbnNpc3RlbnRcbiAgICAgIC8vIGFjcm9zcyBkaWZmZXJlbnQgd2F5cyBvZiBtZW1vaXppbmcgYSBjb21wb25lbnQuIEZvciBleGFtcGxlLCBSZWFjdC5tZW1vXG4gICAgICAvLyBoYXMgYSBkaWZmZXJlbnQgaW50ZXJuYWwgRmliZXIgbGF5b3V0IGlmIHlvdSBwYXNzIGEgbm9ybWFsIGZ1bmN0aW9uXG4gICAgICAvLyBjb21wb25lbnQgKFNpbXBsZU1lbW9Db21wb25lbnQpIHZlcnN1cyBpZiB5b3UgcGFzcyBhIGRpZmZlcmVudCB0eXBlXG4gICAgICAvLyBsaWtlIGZvcndhcmRSZWYgKE1lbW9Db21wb25lbnQpLiBCdXQgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG4gICAgICAvLyBXcmFwcGluZyBhIGNvbXBvbmVudCBpbiBmb3J3YXJkUmVmIChvciBSZWFjdC5sYXp5LCBldGMpIHNob3VsZG4ndFxuICAgICAgLy8gYWZmZWN0IHdoZXRoZXIgdGhlIHByb3BzIG9iamVjdCBpcyByZXVzZWQgZHVyaW5nIGEgYmFpbG91dC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gbmV4dFByb3BzID0gcHJldlByb3BzO1xuXG4gICAgICBpZiAoIWNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAvLyBUaGUgcGVuZGluZyBsYW5lcyB3ZXJlIGNsZWFyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBiZWdpbldvcmsuIFdlJ3JlXG4gICAgICAgIC8vIGFib3V0IHRvIGJhaWwgb3V0LCBidXQgdGhlcmUgbWlnaHQgYmUgb3RoZXIgbGFuZXMgdGhhdCB3ZXJlbid0XG4gICAgICAgIC8vIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IHJlbmRlci4gVXN1YWxseSwgdGhlIHByaW9yaXR5IGxldmVsIG9mIHRoZVxuICAgICAgICAvLyByZW1haW5pbmcgdXBkYXRlcyBpcyBhY2N1bXVsYXRlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCAoaS5lLiB3aGVuIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZSkuIEJ1dCBzaW5jZSBzaW5jZVxuICAgICAgICAvLyB3ZSdyZSBiYWlsaW5nIG91dCBlYXJseSAqd2l0aG91dCogZXZhbHVhdGluZyB0aGUgY29tcG9uZW50LCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGl0IGhlcmUsIHRvby4gUmVzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGZpYmVyLlxuICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgYXBwbGllcyB0byBTaW1wbGVNZW1vQ29tcG9uZW50LCBub3QgTWVtb0NvbXBvbmVudCxcbiAgICAgICAgLy8gYmVjYXVzZSBhIE1lbW9Db21wb25lbnQgZmliZXIgZG9lcyBub3QgaGF2ZSBob29rcyBvciBhbiB1cGRhdGUgcXVldWU7XG4gICAgICAgIC8vIHJhdGhlciwgaXQgd3JhcHMgYXJvdW5kIGFuIGlubmVyIGNvbXBvbmVudCwgd2hpY2ggbWF5IG9yIG1heSBub3RcbiAgICAgICAgLy8gY29udGFpbnMgaG9va3MuXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhlIHJlc2V0IGF0IGluIGJlZ2luV29yayBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIHNvIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsO1xuXG4gIGlmIChuZXh0UHJvcHMubW9kZSA9PT0gJ2hpZGRlbicgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICkge1xuICAgIC8vIFJlbmRlcmluZyBhIGhpZGRlbiB0cmVlLlxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBsZWdhY3kgc3luYyBtb2RlLCBkb24ndCBkZWZlciB0aGUgc3VidHJlZS4gUmVuZGVyIGl0IG5vdy5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIGhvdyBPZmZzY3JlZW4gc2hvdWxkIHdvcmsgd2l0aCB0cmFuc2l0aW9ucyBpbiB0aGUgZnV0dXJlXG4gICAgICB2YXIgbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9IGVsc2UgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkge1xuICAgICAgdmFyIHNwYXduZWRDYWNoZVBvb2wgPSBudWxsOyAvLyBXZSdyZSBoaWRkZW4sIGFuZCB3ZSdyZSBub3QgcmVuZGVyaW5nIGF0IE9mZnNjcmVlbi4gV2Ugd2lsbCBiYWlsIG91dFxuICAgICAgLy8gYW5kIHJlc3VtZSB0aGlzIHRyZWUgbGF0ZXIuXG5cbiAgICAgIHZhciBuZXh0QmFzZUxhbmVzO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2QmFzZUxhbmVzID0gcHJldlN0YXRlLmJhc2VMYW5lcztcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IG1lcmdlTGFuZXMocHJldkJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgICAgfSAvLyBTY2hlZHVsZSB0aGlzIGZpYmVyIHRvIHJlLXJlbmRlciBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuIFRoZW4gYmFpbG91dC5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgICAgIHZhciBfbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IG5leHRCYXNlTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogc3Bhd25lZENhY2hlUG9vbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIC8vIHRvIGF2b2lkIGEgcHVzaC9wb3AgbWlzYWxpZ25tZW50LlxuXG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgbmV4dEJhc2VMYW5lcyk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyLiBUaGUgc3Vycm91bmRpbmcgdmlzaWJsZSBjb250ZW50IGhhcyBhbHJlYWR5XG4gICAgICAvLyBjb21taXR0ZWQuIE5vdyB3ZSByZXN1bWUgcmVuZGVyaW5nIHRoZSBoaWRkZW4gdHJlZS5cbiAgICAgIC8vIFJlbmRlcmluZyBhdCBvZmZzY3JlZW4sIHNvIHdlIGNhbiBjbGVhciB0aGUgYmFzZSBsYW5lcy5cbiAgICAgIHZhciBfbmV4dFN0YXRlMiA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGUyOyAvLyBQdXNoIHRoZSBsYW5lcyB0aGF0IHdlcmUgc2tpcHBlZCB3aGVuIHdlIGJhaWxlZCBvdXQuXG5cbiAgICAgIHZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBwcmV2U3RhdGUgIT09IG51bGwgPyBwcmV2U3RhdGUuYmFzZUxhbmVzIDogcmVuZGVyTGFuZXM7XG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVuZGVyaW5nIGEgdmlzaWJsZSB0cmVlLlxuICAgIHZhciBfc3VidHJlZVJlbmRlckxhbmVzO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgZ29pbmcgZnJvbSBoaWRkZW4gLT4gdmlzaWJsZS5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZTdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIHdlcmVuJ3QgcHJldmlvdXNseSBoaWRkZW4sIGFuZCB3ZSBzdGlsbCBhcmVuJ3QsIHNvIHRoZXJlJ3Mgbm90aGluZ1xuICAgICAgLy8gc3BlY2lhbCB0byBkby4gTmVlZCB0byBwdXNoIHRvIHRoZSBzdGFjayByZWdhcmRsZXNzLCB0aG91Z2gsIHRvIGF2b2lkXG4gICAgICAvLyBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB9XG5cbiAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIF9zdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59IC8vIE5vdGU6IFRoZXNlIGhhcHBlbiB0byBoYXZlIGlkZW50aWNhbCBiZWdpbiBwaGFzZXMsIGZvciBub3cuIFdlIHNob3VsZG4ndCBob2xkXG5cbmZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgLy8gVGhlc2UgYXJlIHJlc2V0IGR1cmluZyByZW5kZXIgdG8gYWxsb3cgdGhlIERldlRvb2xzIGNvbW1pdCBob29rIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSxcbiAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gICAge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICB2YXIgaGFzSWQ7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFJlY2VpdmVVcGRhdGUpIHtcbiAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgLy8gVGhpcyBpcyB1c2VkIGJ5IERldlRvb2xzIHRvIGZvcmNlIGEgYm91bmRhcnkgdG8gZXJyb3IuXG4gICAgc3dpdGNoIChzaG91bGRFcnJvcih3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBjdG9yID0gd29ya0luUHJvZ3Jlc3MudHlwZTsgLy8gVE9ETyBUaGlzIHdheSBvZiByZXNldHRpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHN0YXRlIGlzIGEgaGFjay5cbiAgICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz9cblxuICAgICAgICAgIHZhciB0ZW1wSW5zdGFuY2UgPSBuZXcgY3Rvcih3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLCBfaW5zdGFuY2UuY29udGV4dCk7XG4gICAgICAgICAgdmFyIHN0YXRlID0gdGVtcEluc3RhbmNlLnN0YXRlO1xuXG4gICAgICAgICAgX2luc3RhbmNlLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKF9pbnN0YW5jZSwgc3RhdGUsIG51bGwpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuXG4gICAgICAgICAgdmFyIGVycm9yJDEgPSBuZXcgRXJyb3IoJ1NpbXVsYXRlZCBlcnJvciBjb21pbmcgZnJvbSBEZXZUb29scycpO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yJDEsIHdvcmtJblByb2dyZXNzKSwgbGFuZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuXG4gIHZhciBoYXNDb250ZXh0O1xuXG4gIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgaGFzQ29udGV4dCA9IHRydWU7XG4gICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gZWxzZSB7XG4gICAgaGFzQ29udGV4dCA9IGZhbHNlO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkVXBkYXRlO1xuXG4gIGlmIChpbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOyAvLyBJbiB0aGUgaW5pdGlhbCBwYXNzIHdlIG1pZ2h0IG5lZWQgdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZS5cblxuICAgIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW4gYSByZXN1bWUsIHdlJ2xsIGFscmVhZHkgaGF2ZSBhbiBpbnN0YW5jZSB3ZSBjYW4gcmV1c2UuXG4gICAgc2hvdWxkVXBkYXRlID0gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFVwZGF0ZSA9IHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgbmV4dFVuaXRPZldvcmsgPSBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgdmFyIGluc3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlICYmIGluc3QucHJvcHMgIT09IG5leHRQcm9wcykge1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgIGVycm9yKCdJdCBsb29rcyBsaWtlICVzIGlzIHJlYXNzaWduaW5nIGl0cyBvd24gYHRoaXMucHJvcHNgIHdoaWxlIHJlbmRlcmluZy4gJyArICdUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGNhbiBsZWFkIHRvIGNvbmZ1c2luZyBidWdzLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoIXNob3VsZFVwZGF0ZSAmJiAhZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gQ29udGV4dCBwcm92aWRlcnMgc2hvdWxkIGRlZmVyIHRvIHNDVSBmb3IgcmVuZGVyaW5nXG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFJlcmVuZGVyXG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBuZXh0Q2hpbGRyZW47XG5cbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzIG5vdCBkZWZpbmVkLFxuICAgIC8vIHVubW91bnQgYWxsIHRoZSBjaGlsZHJlbi4gY29tcG9uZW50RGlkQ2F0Y2ggd2lsbCBzY2hlZHVsZSBhbiB1cGRhdGUgdG9cbiAgICAvLyByZS1yZW5kZXIgYSBmYWxsYmFjay4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgbWlncmF0ZSBldmVyeW9uZSB0b1xuICAgIC8vIHRoZSBuZXcgQVBJLlxuICAgIC8vIFRPRE86IFdhcm4gaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuXG4gICAge1xuICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgICAgbmV4dENoaWxkcmVuID0gaW5zdGFuY2UucmVuZGVyKCk7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gSWYgd2UncmUgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZWNvbmNpbGUgd2l0aG91dCByZXVzaW5nIGFueSBvZlxuICAgIC8vIHRoZSBleGlzdGluZyBjaGlsZHJlbi4gQ29uY2VwdHVhbGx5LCB0aGUgbm9ybWFsIGNoaWxkcmVuIGFuZCB0aGUgY2hpbGRyZW5cbiAgICAvLyB0aGF0IGFyZSBzaG93biBvbiBlcnJvciBhcmUgdHdvIGRpZmZlcmVudCBzZXRzLCBzbyB3ZSBzaG91bGRuJ3QgcmV1c2VcbiAgICAvLyBub3JtYWwgY2hpbGRyZW4gZXZlbiBpZiB0aGVpciBpZGVudGl0aWVzIG1hdGNoLlxuICAgIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSAvLyBNZW1vaXplIHN0YXRlIHVzaW5nIHRoZSB2YWx1ZXMgd2UganVzdCB1c2VkIHRvIHJlbmRlci5cbiAgLy8gVE9ETzogUmVzdHJ1Y3R1cmUgc28gd2UgbmV2ZXIgcmVhZCB2YWx1ZXMgZnJvbSB0aGUgaW5zdGFuY2UuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7IC8vIFRoZSBjb250ZXh0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzbyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIGl0LlxuXG4gIGlmIChoYXNDb250ZXh0KSB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAocm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QucGVuZGluZ0NvbnRleHQsIHJvb3QucGVuZGluZ0NvbnRleHQgIT09IHJvb3QuY29udGV4dCk7XG4gIH0gZWxzZSBpZiAocm9vdC5jb250ZXh0KSB7XG4gICAgLy8gU2hvdWxkIGFsd2F5cyBiZSBzZXRcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LmNvbnRleHQsIGZhbHNlKTtcbiAgfVxuXG4gIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCByb290LmNvbnRhaW5lckluZm8pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcHJldkNoaWxkcmVuID0gcHJldlN0YXRlLmVsZW1lbnQ7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcywgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0U3RhdGUuZWxlbWVudDtcblxuICBpZiAoIHByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAvLyBUaGlzIGlzIGEgaHlkcmF0aW9uIHJvb3Qgd2hvc2Ugc2hlbGwgaGFzIG5vdCB5ZXQgaHlkcmF0ZWQuIFdlIHNob3VsZFxuICAgIC8vIGF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBGbGlwIGlzRGVoeWRyYXRlZCB0byBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHdoZW4gdGhpcyByZW5kZXJcbiAgICAvLyBmaW5pc2hlcywgdGhlIHJvb3Qgd2lsbCBubyBsb25nZXIgYmUgZGVoeWRyYXRlZC5cbiAgICB2YXIgb3ZlcnJpZGVTdGF0ZSA9IHtcbiAgICAgIGVsZW1lbnQ6IG5leHRDaGlsZHJlbixcbiAgICAgIGlzRGVoeWRyYXRlZDogZmFsc2UsXG4gICAgICBjYWNoZTogbmV4dFN0YXRlLmNhY2hlLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbmV4dFN0YXRlLnBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXMsXG4gICAgICB0cmFuc2l0aW9uczogbmV4dFN0YXRlLnRyYW5zaXRpb25zXG4gICAgfTtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsgLy8gYGJhc2VTdGF0ZWAgY2FuIGFsd2F5cyBiZSB0aGUgbGFzdCBzdGF0ZSBiZWNhdXNlIHRoZSByb290IGRvZXNuJ3RcbiAgICAvLyBoYXZlIHJlZHVjZXIgZnVuY3Rpb25zIHNvIGl0IGRvZXNuJ3QgbmVlZCByZWJhc2luZy5cblxuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGEgcHJldmlvdXMgYXR0ZW1wdCB0byBoeWRyYXRlIHRoZSBzaGVsbCwgc28gd2VcbiAgICAgIC8vIGZvcmNlZCBhIGNsaWVudCByZW5kZXIuXG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZy4gQmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVuZWQgb3V0c2lkZSAnICsgJ29mIGEgU3VzcGVuc2UgYm91bmRhcnksIHRoZSBlbnRpcmUgcm9vdCB3aWxsIHN3aXRjaCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyksIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIGlmIChuZXh0Q2hpbGRyZW4gIT09IHByZXZDaGlsZHJlbikge1xuICAgICAgdmFyIF9yZWNvdmVyYWJsZUVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIobmV3IEVycm9yKCdUaGlzIHJvb3QgcmVjZWl2ZWQgYW4gZWFybHkgdXBkYXRlLCBiZWZvcmUgYW55dGhpbmcgd2FzIGFibGUgJyArICdoeWRyYXRlLiBTd2l0Y2hlZCB0aGUgZW50aXJlIHJvb3QgdG8gY2xpZW50IHJlbmRlcmluZy4nKSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICByZXR1cm4gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIF9yZWNvdmVyYWJsZUVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIG91dGVybW9zdCBzaGVsbCBoYXMgbm90IGh5ZHJhdGVkIHlldC4gU3RhcnQgaHlkcmF0aW5nLlxuICAgICAgZW50ZXJIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHZhciBjaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICAgIHZhciBub2RlID0gY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIC8vIE1hcmsgZWFjaCBjaGlsZCBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgICAgbm9kZS5mbGFncyA9IG5vZGUuZmxhZ3MgJiB+UGxhY2VtZW50IHwgSHlkcmF0aW5nO1xuICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSb290IGlzIG5vdCBkZWh5ZHJhdGVkLiBFaXRoZXIgdGhpcyBpcyBhIGNsaWVudC1vbmx5IHJvb3QsIG9yIGl0XG4gICAgLy8gYWxyZWFkeSBoeWRyYXRlZC5cbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICBxdWV1ZUh5ZHJhdGlvbkVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbnVsbDtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGlzRGlyZWN0VGV4dENoaWxkID0gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgbmV4dFByb3BzKTtcblxuICBpZiAoaXNEaXJlY3RUZXh0Q2hpbGQpIHtcbiAgICAvLyBXZSBzcGVjaWFsIGNhc2UgYSBkaXJlY3QgdGV4dCBjaGlsZCBvZiBhIGhvc3Qgbm9kZS4gVGhpcyBpcyBhIGNvbW1vblxuICAgIC8vIGNhc2UuIFdlIHdvbid0IGhhbmRsZSBpdCBhcyBhIHJlaWZpZWQgY2hpbGQuIFdlIHdpbGwgaW5zdGVhZCBoYW5kbGVcbiAgICAvLyB0aGlzIGluIHRoZSBob3N0IGVudmlyb25tZW50IHRoYXQgYWxzbyBoYXMgYWNjZXNzIHRvIHRoaXMgcHJvcC4gVGhhdFxuICAgIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGFub3RoZXIgSG9zdFRleHQgZmliZXIgYW5kIHRyYXZlcnNpbmcgaXQuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChwcmV2UHJvcHMgIT09IG51bGwgJiYgc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJldlByb3BzKSkge1xuICAgIC8vIElmIHdlJ3JlIHN3aXRjaGluZyBmcm9tIGEgZGlyZWN0IHRleHQgY2hpbGQgdG8gYSBub3JtYWwgY2hpbGQsIG9yIHRvXG4gICAgLy8gZW1wdHksIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIHRleHQgY29udGVudCB0byBiZSByZXNldC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDb250ZW50UmVzZXQ7XG4gIH1cblxuICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBpcyB0ZXJtaW5hbC4gV2UnbGwgZG8gdGhlIGNvbXBsZXRpb24gc3RlcFxuICAvLyBpbW1lZGlhdGVseSBhZnRlci5cblxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtb3VudExhenlDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgcmVuZGVyTGFuZXMpIHtcbiAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBsYXp5Q29tcG9uZW50ID0gZWxlbWVudFR5cGU7XG4gIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuICB2YXIgQ29tcG9uZW50ID0gaW5pdChwYXlsb2FkKTsgLy8gU3RvcmUgdGhlIHVud3JhcHBlZCBjb21wb25lbnQgaW4gdGhlIHR5cGUuXG5cbiAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudDtcbiAgdmFyIHJlc29sdmVkVGFnID0gd29ya0luUHJvZ3Jlc3MudGFnID0gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KTtcbiAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpO1xuICB2YXIgY2hpbGQ7XG5cbiAgc3dpdGNoIChyZXNvbHZlZFRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUNsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZvcndhcmRSZWYobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgcmVzb2x2ZWRQcm9wcywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVNZW1vQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LnR5cGUsIHJlc29sdmVkUHJvcHMpLCAvLyBUaGUgaW5uZXIgdHlwZSBjYW4gaGF2ZSBkZWZhdWx0cyB0b29cbiAgICAgICAgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gIH1cblxuICB2YXIgaGludCA9ICcnO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50ICE9PSBudWxsICYmIHR5cGVvZiBDb21wb25lbnQgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICBoaW50ID0gJyBEaWQgeW91IHdyYXAgYSBjb21wb25lbnQgaW4gUmVhY3QubGF6eSgpIG1vcmUgdGhhbiBvbmNlPyc7XG4gICAgfVxuICB9IC8vIFRoaXMgbWVzc2FnZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgbWVudGlvbiBGb3J3YXJkUmVmIG9yIE1lbW9Db21wb25lbnRcbiAgLy8gYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3MgYSBzZXBhcmF0ZSB0eXBlIG9mIHdvcmsgaXMgYW5cbiAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCB0eXBlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArIENvbXBvbmVudCArIFwiLiBcIiArIChcIkxhenkgZWxlbWVudCB0eXBlIG11c3QgcmVzb2x2ZSB0byBhIGNsYXNzIG9yIGZ1bmN0aW9uLlwiICsgaGludCkpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cbiAgd29ya0luUHJvZ3Jlc3MudGFnID0gQ2xhc3NDb21wb25lbnQ7IC8vIFRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gaXMgYSBmb3JrIG9mIGB1cGRhdGVDbGFzc0NvbXBvbmVudGBcbiAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIGZpbmlzaENsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgaGFzSWQ7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKFwiVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBoYXZlIGEgcmVuZGVyIG1ldGhvZCwgYnV0IGRvZXNuJ3QgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudC4gXCIgKyAnVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgZXJyb3JzLiBDaGFuZ2UgJXMgdG8gZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBudWxsKTtcbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIHtcbiAgICAvLyBTdXBwb3J0IGZvciBtb2R1bGUgY29tcG9uZW50cyBpcyBkZXByZWNhdGVkIGFuZCBpcyByZW1vdmVkIGJlaGluZCBhIGZsYWcuXG4gICAgLy8gV2hldGhlciBvciBub3QgaXQgd291bGQgY3Jhc2ggbGF0ZXIsIHdlIHdhbnQgdG8gc2hvdyBhIGdvb2QgbWVzc2FnZSBpbiBERVYgZmlyc3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS4kJHR5cGVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ1RoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gYmUgYSBmdW5jdGlvbiBjb21wb25lbnQgdGhhdCByZXR1cm5zIGEgY2xhc3MgaW5zdGFuY2UuICcgKyAnQ2hhbmdlICVzIHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLiAnICsgXCJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuIFwiICsgXCJgJXMucHJvdG90eXBlID0gUmVhY3QuQ29tcG9uZW50LnByb3RvdHlwZWAuIERvbid0IHVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzaW5jZSBpdCBcIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICggLy8gUnVuIHRoZXNlIGNoZWNrcyBpbiBwcm9kdWN0aW9uIG9ubHkgaWYgdGhlIGZsYWcgaXMgb2ZmLlxuICAvLyBFdmVudHVhbGx5IHdlJ2xsIGRlbGV0ZSB0aGlzIGJyYW5jaCBhbHRvZ2V0aGVyLlxuICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4obnVsbCwgd29ya0luUHJvZ3Jlc3MsIHZhbHVlLCByZW5kZXJMYW5lcyk7XG5cbiAgICB7XG4gICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KSB7XG4gIHtcbiAgICBpZiAoQ29tcG9uZW50KSB7XG4gICAgICBpZiAoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICB9XG5cbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8ICcnO1xuICAgICAgdmFyIGRlYnVnU291cmNlID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlO1xuXG4gICAgICBpZiAoZGVidWdTb3VyY2UpIHtcbiAgICAgICAgd2FybmluZ0tleSA9IGRlYnVnU291cmNlLmZpbGVOYW1lICsgJzonICsgZGVidWdTb3VyY2UubGluZU51bWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcy4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiAnICsgJ0RpZCB5b3UgbWVhbiB0byB1c2UgUmVhY3QuZm9yd2FyZFJlZigpPyVzJywgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBDb21wb25lbnQuZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJyVzOiBTdXBwb3J0IGZvciBkZWZhdWx0UHJvcHMgd2lsbCBiZSByZW1vdmVkIGZyb20gZnVuY3Rpb24gY29tcG9uZW50cyAnICsgJ2luIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIFVzZSBKYXZhU2NyaXB0IGRlZmF1bHQgcGFyYW1ldGVycyBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lMyA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lM10pIHtcbiAgICAgICAgZXJyb3IoJyVzOiBGdW5jdGlvbiBjb21wb25lbnRzIGRvIG5vdCBzdXBwb3J0IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4nLCBfY29tcG9uZW50TmFtZTMpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC5jb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lNCA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuJywgX2NvbXBvbmVudE5hbWU0KTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTVVNQRU5ERURfTUFSS0VSID0ge1xuICBkZWh5ZHJhdGVkOiBudWxsLFxuICB0cmVlQ29udGV4dDogbnVsbCxcbiAgcmV0cnlMYW5lOiBOb0xhbmVcbn07XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykge1xuICByZXR1cm4ge1xuICAgIGJhc2VMYW5lczogcmVuZGVyTGFuZXMsXG4gICAgY2FjaGVQb29sOiBnZXRTdXNwZW5kZWRDYWNoZSgpLFxuICAgIHRyYW5zaXRpb25zOiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocHJldk9mZnNjcmVlblN0YXRlLCByZW5kZXJMYW5lcykge1xuICB2YXIgY2FjaGVQb29sID0gbnVsbDtcblxuICByZXR1cm4ge1xuICAgIGJhc2VMYW5lczogbWVyZ2VMYW5lcyhwcmV2T2Zmc2NyZWVuU3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyksXG4gICAgY2FjaGVQb29sOiBjYWNoZVBvb2wsXG4gICAgdHJhbnNpdGlvbnM6IHByZXZPZmZzY3JlZW5TdGF0ZS50cmFuc2l0aW9uc1xuICB9O1xufSAvLyBUT0RPOiBQcm9iYWJseSBzaG91bGQgaW5saW5lIHRoaXMgYmFja1xuXG5cbmZ1bmN0aW9uIHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2ssIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB3ZSBuZWVkIHRvXG4gIC8vIHJlbWFpbiBvbiB0aGF0IGZhbGxiYWNrIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgY29udGVudCBoYXMgcmVzb2x2ZWQuXG4gIC8vIEZvciBleGFtcGxlLCBTdXNwZW5zZUxpc3QgY29vcmRpbmF0ZXMgd2hlbiBuZXN0ZWQgY29udGVudCBhcHBlYXJzLlxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIEN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIERvbid0IGhpZGUgaXQsIGV2ZW4gaWYgRm9yY2VTdXNwZW5zZUZhbGxiYWNrXG4gICAgICAvLyBpcyB0cnVlLiBNb3JlIHByZWNpc2UgbmFtZSBtaWdodCBiZSBcIkZvcmNlUmVtYWluU3VzcGVuc2VGYWxsYmFja1wiLlxuICAgICAgLy8gTm90ZTogVGhpcyBpcyBhIGZhY3RvcmluZyBzbWVsbC4gQ2FuJ3QgcmVtYWluIG9uIGEgZmFsbGJhY2sgaWYgdGhlcmUnc1xuICAgICAgLy8gbm8gZmFsbGJhY2sgdG8gcmVtYWluIG9uLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSAvLyBOb3QgY3VycmVudGx5IHNob3dpbmcgY29udGVudC4gQ29uc3VsdCB0aGUgU3VzcGVuc2UgY29udGV4dC5cblxuXG4gIHJldHVybiBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBnZXRSZW1haW5pbmdXb3JrSW5QcmltYXJ5VHJlZShjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBTaG91bGQgbm90IHJlbW92ZSByZW5kZXIgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBkdXJpbmcgdGhpcyByZW5kZXJcbiAgcmV0dXJuIHJlbW92ZUxhbmVzKGN1cnJlbnQuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gVGhpcyBpcyB1c2VkIGJ5IERldlRvb2xzIHRvIGZvcmNlIGEgYm91bmRhcnkgdG8gc3VzcGVuZC5cblxuICB7XG4gICAgaWYgKHNob3VsZFN1c3BlbmQod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIHZhciBzaG93RmFsbGJhY2sgPSBmYWxzZTtcbiAgdmFyIGRpZFN1c3BlbmQgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoZGlkU3VzcGVuZCB8fCBzaG91bGRSZW1haW5PbkZhbGxiYWNrKHN1c3BlbnNlQ29udGV4dCwgY3VycmVudCkpIHtcbiAgICAvLyBTb21ldGhpbmcgaW4gdGhpcyBib3VuZGFyeSdzIHN1YnRyZWUgYWxyZWFkeSBzdXNwZW5kZWQuIFN3aXRjaCB0b1xuICAgIC8vIHJlbmRlcmluZyB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgc2hvd0ZhbGxiYWNrID0gdHJ1ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+RGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBBdHRlbXB0aW5nIHRoZSBtYWluIGNvbnRlbnRcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBuZXcgbW91bnQgb3IgdGhpcyBib3VuZGFyeSBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIE1hcmsgdGhpcyBzdWJ0cmVlIGNvbnRleHQgYXMgaGF2aW5nIGF0IGxlYXN0IG9uZSBpbnZpc2libGUgcGFyZW50IHRoYXQgY291bGRcbiAgICAgIC8vIGhhbmRsZSB0aGUgZmFsbGJhY2sgc3RhdGUuXG4gICAgICAvLyBBdm9pZGVkIGJvdW5kYXJpZXMgYXJlIG5vdCBjb25zaWRlcmVkIHNpbmNlIHRoZXkgY2Fubm90IGhhbmRsZSBwcmVmZXJyZWQgZmFsbGJhY2sgc3RhdGVzLlxuICAgICAge1xuICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBPSywgdGhlIG5leHQgcGFydCBpcyBjb25mdXNpbmcuIFdlJ3JlIGFib3V0IHRvIHJlY29uY2lsZSB0aGUgU3VzcGVuc2VcbiAgLy8gYm91bmRhcnkncyBjaGlsZHJlbi4gVGhpcyBpbnZvbHZlcyBzb21lIGN1c3RvbSByZWNvbmNpbGlhdGlvbiBsb2dpYy4gVHdvXG4gIC8vIG1haW4gcmVhc29ucyB0aGlzIGlzIHNvIGNvbXBsaWNhdGVkLlxuICAvL1xuICAvLyBGaXJzdCwgTGVnYWN5IE1vZGUgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGVcbiAgLy8gcHJpbWFyeSB0cmVlIHdpbGwgY29tbWl0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSwgc28gd2hlbiB3ZSBkbyB0aGVcbiAgLy8gc2Vjb25kIHBhc3MgdG8gcmVuZGVyIHRoZSBmYWxsYmFjaywgd2UgZG8gc29tZSBleGNlZWRpbmdseSwgdWgsIGNsZXZlclxuICAvLyBoYWNrcyB0byBtYWtlIHRoYXQgbm90IHRvdGFsbHkgYnJlYWsuIExpa2UgdHJhbnNmZXJyaW5nIGVmZmVjdHMgYW5kXG4gIC8vIGRlbGV0aW9ucyBmcm9tIGhpZGRlbiB0cmVlLiBJbiBDb25jdXJyZW50IE1vZGUsIGl0J3MgbXVjaCBzaW1wbGVyLFxuICAvLyBiZWNhdXNlIHdlIGJhaWxvdXQgb24gdGhlIHByaW1hcnkgdHJlZSBjb21wbGV0ZWx5IGFuZCBsZWF2ZSBpdCBpbiBpdHMgb2xkXG4gIC8vIHN0YXRlLCBubyBlZmZlY3RzLiBTYW1lIGFzIHdoYXQgd2UgZG8gZm9yIE9mZnNjcmVlbiAoZXhjZXB0IHRoYXRcbiAgLy8gT2Zmc2NyZWVuIGRvZXNuJ3QgaGF2ZSB0aGUgZmlyc3QgcmVuZGVyIHBhc3MpLlxuICAvL1xuICAvLyBTZWNvbmQgaXMgaHlkcmF0aW9uLiBEdXJpbmcgaHlkcmF0aW9uLCB0aGUgU3VzcGVuc2UgZmliZXIgaGFzIGEgc2xpZ2h0bHlcbiAgLy8gZGlmZmVyZW50IGxheW91dCwgd2hlcmUgdGhlIGNoaWxkIHBvaW50cyB0byBhIGRlaHlkcmF0ZWQgZnJhZ21lbnQsIHdoaWNoXG4gIC8vIGNvbnRhaW5zIHRoZSBET00gcmVuZGVyZWQgYnkgdGhlIHNlcnZlci5cbiAgLy9cbiAgLy8gVGhpcmQsIGV2ZW4gaWYgeW91IHNldCBhbGwgdGhhdCBhc2lkZSwgU3VzcGVuc2UgaXMgbGlrZSBlcnJvciBib3VuZGFyaWVzIGluXG4gIC8vIHRoYXQgd2UgZmlyc3Qgd2UgdHJ5IHRvIHJlbmRlciBvbmUgdHJlZSwgYW5kIGlmIHRoYXQgZmFpbHMsIHdlIHJlbmRlciBhZ2FpblxuICAvLyBhbmQgc3dpdGNoIHRvIGEgZGlmZmVyZW50IHRyZWUuIExpa2UgYSB0cnkvY2F0Y2ggYmxvY2suIFNvIHdlIGhhdmUgdG8gdHJhY2tcbiAgLy8gd2hpY2ggYnJhbmNoIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcuIElkZWFsbHkgd2Ugd291bGQgbW9kZWwgdGhpcyB1c2luZ1xuICAvLyBhIHN0YWNrLlxuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIC8vIFNwZWNpYWwgcGF0aCBmb3IgaHlkcmF0aW9uXG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGh5ZHJhdGluZywgdHJ5IHRvIGh5ZHJhdGUgdGhpcyBib3VuZGFyeS5cbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7IC8vIFRoaXMgY291bGQndmUgYmVlbiBhIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50LlxuXG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICBpZiAoZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIGRlaHlkcmF0ZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBuZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcblxuICAgIGlmIChzaG93RmFsbGJhY2spIHtcbiAgICAgIHZhciBmYWxsYmFja0ZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50Lm1lbW9pemVkU3RhdGUgPSBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG5cbiAgICAgIHJldHVybiBmYWxsYmFja0ZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYW4gdXBkYXRlLlxuICAgIC8vIFNwZWNpYWwgcGF0aCBmb3IgaHlkcmF0aW9uXG4gICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBfZGVoeWRyYXRlZCA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICBpZiAoX2RlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZURlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZGlkU3VzcGVuZCwgbmV4dFByb3BzLCBfZGVoeWRyYXRlZCwgcHJldlN0YXRlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcbiAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSB1cGRhdGVTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuLCBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICB2YXIgcHJldk9mZnNjcmVlblN0YXRlID0gY3VycmVudC5jaGlsZC5tZW1vaXplZFN0YXRlO1xuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5tZW1vaXplZFN0YXRlID0gcHJldk9mZnNjcmVlblN0YXRlID09PSBudWxsID8gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSA6IHVwZGF0ZVN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocHJldk9mZnNjcmVlblN0YXRlLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIuY2hpbGRMYW5lcyA9IGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuMiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcblxuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDMgPSB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4yLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDM7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBtb2RlKTtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgICAvLyBjb21wbGV0ZWQsIGV2ZW4gdGhvdWdoIGl0J3MgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLlxuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBtb2RlKTtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIob2Zmc2NyZWVuUHJvcHMsIG1vZGUsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoZSBwcm9wcyBhcmd1bWVudCB0byBgY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlXG4gIC8vIHRoaXMgd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ob2Zmc2NyZWVuUHJvcHMsIG1vZGUsIE5vTGFuZXMsIG51bGwpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnQsIG9mZnNjcmVlblByb3BzKSB7XG4gIC8vIFRoZSBwcm9wcyBhcmd1bWVudCB0byBgY3JlYXRlV29ya0luUHJvZ3Jlc3NgIGlzIGBhbnlgIHR5cGVkLCBzbyB3ZSB1c2UgdGhpc1xuICAvLyB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNvbnN0cmFpbiBpdC5cbiAgcmV0dXJuIGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIG9mZnNjcmVlblByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LCB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfSk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5sYW5lcyA9IHJlbmRlckxhbmVzO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBudWxsO1xuXG4gIGlmIChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgLy8gRGVsZXRlIHRoZSBmYWxsYmFjayBjaGlsZCBmcmFnbWVudFxuICAgIHZhciBkZWxldGlvbnMgPSB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBbY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudF07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50KTtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKCAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gIC8vIGNvbXBsZXRlZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuXG4gIChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgLy8gTWFrZSBzdXJlIHdlJ3JlIG9uIHRoZSBzZWNvbmQgcGFzcywgaS5lLiB0aGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCB3YXNcbiAgLy8gYWxyZWFkeSBjbG9uZWQuIEluIGxlZ2FjeSBtb2RlLCB0aGUgb25seSBjYXNlIHdoZXJlIHRoaXMgaXNuJ3QgdHJ1ZSBpc1xuICAvLyB3aGVuIERldlRvb2xzIGZvcmNlcyB1cyB0byBkaXNwbGF5IGEgZmFsbGJhY2s7IHdlIHNraXAgdGhlIGZpcnN0IHJlbmRlclxuICAvLyBwYXNzIGVudGlyZWx5IGFuZCBnbyBzdHJhaWdodCB0byByZW5kZXJpbmcgdGhlIGZhbGxiYWNrLiAoSW4gQ29uY3VycmVudFxuICAvLyBNb2RlLCBTdXNwZW5zZUxpc3QgY2FuIGFsc28gdHJpZ2dlciB0aGlzIHNjZW5hcmlvLCBidXQgdGhpcyBpcyBhIGxlZ2FjeS1cbiAgLy8gb25seSBjb2RlcGF0aC4pXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQpIHtcbiAgICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IC8vIFRoZSBmYWxsYmFjayBmaWJlciB3YXMgYWRkZWQgYXMgYSBkZWxldGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuXG4gICAgLy8gSG93ZXZlciwgc2luY2Ugd2UncmUgZ29pbmcgdG8gcmVtYWluIG9uIHRoZSBmYWxsYmFjaywgd2Ugbm8gbG9uZ2VyIHdhbnRcbiAgICAvLyB0byBkZWxldGUgaXQuXG5cblxuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwgcHJpbWFyeUNoaWxkUHJvcHMpOyAvLyBTaW5jZSB3ZSdyZSByZXVzaW5nIGEgY3VycmVudCB0cmVlLCB3ZSBuZWVkIHRvIHJldXNlIHRoZSBmbGFncywgdG9vLlxuICAgIC8vIChXZSBkb24ndCBkbyB0aGlzIGluIGxlZ2FjeSBtb2RlLCBiZWNhdXNlIGluIGxlZ2FjeSBtb2RlIHdlIGRvbid0IHJlLXVzZVxuICAgIC8vIHRoZSBjdXJyZW50IHRyZWU7IHNlZSBwcmV2aW91cyBicmFuY2guKVxuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gIH1cblxuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuXG4gIGlmIChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCwgZmFsbGJhY2tDaGlsZHJlbik7XG4gIH0gZWxzZSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBGYWxsaW5nIGJhY2sgdG8gY2xpZW50IHJlbmRlcmluZy4gQmVjYXVzZSB0aGlzIGhhcyBwZXJmb3JtYW5jZVxuICAvLyBpbXBsaWNhdGlvbnMsIGl0J3MgY29uc2lkZXJlZCBhIHJlY292ZXJhYmxlIGVycm9yLCBldmVuIHRob3VnaCB0aGUgdXNlclxuICAvLyBsaWtlbHkgd29uJ3Qgb2JzZXJ2ZSBhbnl0aGluZyB3cm9uZyB3aXRoIHRoZSBVSS5cbiAgLy9cbiAgLy8gVGhlIGVycm9yIGlzIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCB0byBlbmZvcmNlIHRoYXQgZXZlcnkgY2FsbGVyIHByb3ZpZGVcbiAgLy8gYSBjdXN0b20gbWVzc2FnZSwgb3IgZXhwbGljaXRseSBvcHQgb3V0IChjdXJyZW50bHkgdGhlIG9ubHkgcGF0aCB0aGF0IG9wdHNcbiAgLy8gb3V0IGlzIGxlZ2FjeSBtb2RlOyBldmVyeSBjb25jdXJyZW50IHBhdGggcHJvdmlkZXMgYW4gZXJyb3IpLlxuICBpZiAocmVjb3ZlcmFibGVFcnJvciAhPT0gbnVsbCkge1xuICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IocmVjb3ZlcmFibGVFcnJvcik7XG4gIH0gLy8gVGhpcyB3aWxsIGFkZCB0aGUgb2xkIGZpYmVyIHRvIHRoZSBkZWxldGlvbiBsaXN0XG5cblxuICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpOyAvLyBXZSdyZSBub3cgbm90IHN1c3BlbmRlZCBub3IgZGVoeWRyYXRlZC5cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4pOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgLy8gbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0FmdGVyUmV0cnlXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBmaWJlck1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBmaWJlck1vZGUpO1xuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgZmliZXJNb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSkgYWxyZWFkeSBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAvLyBXZSB3aWxsIGhhdmUgZHJvcHBlZCB0aGUgZWZmZWN0IGxpc3Qgd2hpY2ggY29udGFpbnMgdGhlXG4gICAgLy8gZGVsZXRpb24uIFdlIG5lZWQgdG8gcmVjb25jaWxlIHRvIGRlbGV0ZSB0aGUgY3VycmVudCBjaGlsZC5cbiAgICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlSW5zdGFuY2UsIHJlbmRlckxhbmVzKSB7XG4gIC8vIER1cmluZyB0aGUgZmlyc3QgcGFzcywgd2UnbGwgYmFpbCBvdXQgYW5kIG5vdCBkcmlsbCBpbnRvIHRoZSBjaGlsZHJlbi5cbiAgLy8gSW5zdGVhZCwgd2UnbGwgbGVhdmUgdGhlIGNvbnRlbnQgaW4gcGxhY2UgYW5kIHRyeSB0byBoeWRyYXRlIGl0IGxhdGVyLlxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHtcbiAgICAgIGVycm9yKCdDYW5ub3QgaHlkcmF0ZSBTdXNwZW5zZSBpbiBsZWdhY3kgbW9kZS4gU3dpdGNoIGZyb20gJyArICdSZWFjdERPTS5oeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lcikgdG8gJyArICdSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pJyArICcucmVuZGVyKGVsZW1lbnQpIG9yIHJlbW92ZSB0aGUgU3VzcGVuc2UgY29tcG9uZW50cyBmcm9tICcgKyAndGhlIHNlcnZlciByZW5kZXJlZCBjb21wb25lbnRzLicpO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoU3luY0xhbmUpO1xuICB9IGVsc2UgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgLy8gVGhpcyBpcyBhIGNsaWVudC1vbmx5IGJvdW5kYXJ5LiBTaW5jZSB3ZSB3b24ndCBnZXQgYW55IGNvbnRlbnQgZnJvbSB0aGUgc2VydmVyXG4gICAgLy8gZm9yIHRoaXMsIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhhdCBhdCBhIGhpZ2hlciBwcmlvcml0eSBiYXNlZCBvbiB3aGVuIGl0IHdvdWxkXG4gICAgLy8gaGF2ZSB0aW1lZCBvdXQuIEluIHRoZW9yeSB3ZSBjb3VsZCByZW5kZXIgaXQgaW4gdGhpcyBwYXNzIGJ1dCBpdCB3b3VsZCBoYXZlIHRoZVxuICAgIC8vIHdyb25nIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCBpdCBhbmQgd2lsbCBwcmV2ZW50IGh5ZHJhdGlvbiBvZiBwYXJlbnQgcGF0aC5cbiAgICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB3b3JrIGxlZnQgb24gaXQgdG8gcmVuZGVyIGl0IGluIGEgc2VwYXJhdGUgY29tbWl0LlxuICAgIC8vIFRPRE8gVGhpcyB0aW1lIHNob3VsZCBiZSB0aGUgdGltZSBhdCB3aGljaCB0aGUgc2VydmVyIHJlbmRlcmVkIHJlc3BvbnNlIHRoYXQgaXNcbiAgICAvLyBhIHBhcmVudCB0byB0aGlzIGJvdW5kYXJ5IHdhcyBkaXNwbGF5ZWQuIEhvd2V2ZXIsIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBoYXZlXG4gICAgLy8gYSBwcm90b2NvbCB0byB0cmFuc2ZlciB0aGF0IHRpbWUsIHdlJ2xsIGp1c3QgZXN0aW1hdGUgaXQgYnkgdXNpbmcgdGhlIGN1cnJlbnRcbiAgICAvLyB0aW1lLiBUaGlzIHdpbGwgbWVhbiB0aGF0IFN1c3BlbnNlIHRpbWVvdXRzIGFyZSBzbGlnaHRseSBzaGlmdGVkIHRvIGxhdGVyIHRoYW5cbiAgICAvLyB0aGV5IHNob3VsZCBiZS5cbiAgICAvLyBTY2hlZHVsZSBhIG5vcm1hbCBwcmkgdXBkYXRlIHRvIHJlbmRlciB0aGlzIGNvbnRlbnQuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhEZWZhdWx0SHlkcmF0aW9uTGFuZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UnbGwgY29udGludWUgaHlkcmF0aW5nIHRoZSByZXN0IGF0IG9mZnNjcmVlbiBwcmlvcml0eSBzaW5jZSB3ZSdsbCBhbHJlYWR5XG4gICAgLy8gYmUgc2hvd2luZyB0aGUgcmlnaHQgY29udGVudCBjb21pbmcgZnJvbSB0aGUgc2VydmVyLCBpdCBpcyBubyBydXNoLlxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kLCBuZXh0UHJvcHMsIHN1c3BlbnNlSW5zdGFuY2UsIHN1c3BlbnNlU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIGlmICghZGlkU3VzcGVuZCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHJlbmRlciBwYXNzLiBBdHRlbXB0IHRvIGh5ZHJhdGUuXG4gICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGJlIGh5ZHJhdGluZyBhdCB0aGlzIHBvaW50IGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0IHBhc3MsXG4gICAgLy8gYnV0IGFmdGVyIHdlJ3ZlIGFscmVhZHkgY29tbWl0dGVkIG9uY2UuXG4gICAgd2FybklmSHlkcmF0aW5nKCk7XG5cbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgLy8gVE9ETzogV2hlbiB3ZSBkZWxldGUgbGVnYWN5IG1vZGUsIHdlIHNob3VsZCBtYWtlIHRoaXMgZXJyb3IgYXJndW1lbnRcbiAgICAgIC8vIHJlcXVpcmVkIOKAlCBldmVyeSBjb25jdXJyZW50IG1vZGUgcGF0aCB0aGF0IGNhdXNlcyBoeWRyYXRpb24gdG9cbiAgICAgIC8vIGRlLW9wdCB0byBjbGllbnQgcmVuZGVyaW5nIHNob3VsZCBoYXZlIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAgIC8vIFRoaXMgYm91bmRhcnkgaXMgaW4gYSBwZXJtYW5lbnQgZmFsbGJhY2sgc3RhdGUuIEluIHRoaXMgY2FzZSwgd2UnbGwgbmV2ZXJcbiAgICAgIC8vIGdldCBhbiB1cGRhdGUgYW5kIHdlJ2xsIG5ldmVyIGJlIGFibGUgdG8gaHlkcmF0ZSB0aGUgZmluYWwgY29udGVudC4gTGV0J3MganVzdCB0cnkgdGhlXG4gICAgICAvLyBjbGllbnQgc2lkZSByZW5kZXIgaW5zdGVhZC5cbiAgICAgIHZhciBkaWdlc3QsIG1lc3NhZ2UsIHN0YWNrO1xuXG4gICAgICB7XG4gICAgICAgIHZhciBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYgPSBnZXRTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2tFcnJvckRldGFpbHMoc3VzcGVuc2VJbnN0YW5jZSk7XG5cbiAgICAgICAgZGlnZXN0ID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLmRpZ2VzdDtcbiAgICAgICAgbWVzc2FnZSA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5tZXNzYWdlO1xuICAgICAgICBzdGFjayA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5zdGFjaztcbiAgICAgIH1cblxuICAgICAgdmFyIGVycm9yO1xuXG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdUaGUgc2VydmVyIGNvdWxkIG5vdCBmaW5pc2ggdGhpcyBTdXNwZW5zZSBib3VuZGFyeSwgbGlrZWx5ICcgKyAnZHVlIHRvIGFuIGVycm9yIGR1cmluZyBzZXJ2ZXIgcmVuZGVyaW5nLiBTd2l0Y2hlZCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjYXB0dXJlZFZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShlcnJvciwgZGlnZXN0LCBzdGFjayk7XG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBjYXB0dXJlZFZhbHVlKTtcbiAgICB9XG4gICAgLy8gYW55IGNvbnRleHQgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gdHJlYXQgaXMgYXMgaWYgdGhlIGlucHV0IG1pZ2h0IGhhdmUgY2hhbmdlZC5cblxuXG4gICAgdmFyIGhhc0NvbnRleHRDaGFuZ2VkID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgY3VycmVudC5jaGlsZExhbmVzKTtcblxuICAgIGlmIChkaWRSZWNlaXZlVXBkYXRlIHx8IGhhc0NvbnRleHRDaGFuZ2VkKSB7XG4gICAgICAvLyBUaGlzIGJvdW5kYXJ5IGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBmaXJzdCByZW5kZXIuIFRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgbm93IHVuYWJsZSB0b1xuICAgICAgLy8gaHlkcmF0ZSBpdC4gV2UgbWlnaHQgc3RpbGwgYmUgYWJsZSB0byBoeWRyYXRlIGl0IHVzaW5nIGEgaGlnaGVyIHByaW9yaXR5IGxhbmUuXG4gICAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSA9IGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb24ocm9vdCwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIGlmIChhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBOb0xhbmUgJiYgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSAhPT0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUpIHtcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG11dGF0aW5nIHNpbmNlIHRoaXMgcmVuZGVyIHdpbGwgZ2V0IGludGVycnVwdGVkLiBUaGlzXG4gICAgICAgICAgLy8gaXMgb25lIG9mIHRoZSB2ZXJ5IHJhcmUgdGltZXMgd2hlcmUgd2UgbXV0YXRlIHRoZSBjdXJyZW50IHRyZWVcbiAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgICAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGF0dGVtcHRIeWRyYXRpb25BdExhbmU7IC8vIFRPRE86IElkZWFsbHkgdGhpcyB3b3VsZCBpbmhlcml0IHRoZSBldmVudCB0aW1lIG9mIHRoZSBjdXJyZW50IHJlbmRlclxuXG4gICAgICAgICAgdmFyIGV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuICAgICAgICAgIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lKTtcbiAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgY3VycmVudCwgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBJZiB3ZSBoYXZlIHNjaGVkdWxlZCBoaWdoZXIgcHJpIHdvcmsgYWJvdmUsIHRoaXMgd2lsbCBwcm9iYWJseSBqdXN0IGFib3J0IHRoZSByZW5kZXJcbiAgICAgIC8vIHNpbmNlIHdlIG5vdyBoYXZlIGhpZ2hlciBwcmlvcml0eSB3b3JrLCBidXQgaW4gY2FzZSBpdCBkb2Vzbid0LCB3ZSBuZWVkIHRvIHByZXBhcmUgdG9cbiAgICAgIC8vIHJlbmRlciBzb21ldGhpbmcsIGlmIHdlIHRpbWUgb3V0LiBFdmVuIGlmIHRoYXQgcmVxdWlyZXMgdXMgdG8gZGVsZXRlIGV2ZXJ5dGhpbmcgYW5kXG4gICAgICAvLyBza2lwIGh5ZHJhdGlvbi5cbiAgICAgIC8vIERlbGF5IGhhdmluZyB0byBkbyB0aGlzIGFzIGxvbmcgYXMgdGhlIHN1c3BlbnNlIHRpbWVvdXQgYWxsb3dzIHVzLlxuXG5cbiAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcblxuICAgICAgdmFyIF9jYXB0dXJlZFZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShuZXcgRXJyb3IoJ1RoaXMgU3VzcGVuc2UgYm91bmRhcnkgcmVjZWl2ZWQgYW4gdXBkYXRlIGJlZm9yZSBpdCBmaW5pc2hlZCAnICsgJ2h5ZHJhdGluZy4gVGhpcyBjYXVzZWQgdGhlIGJvdW5kYXJ5IHRvIHN3aXRjaCB0byBjbGllbnQgcmVuZGVyaW5nLiAnICsgJ1RoZSB1c3VhbCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gd3JhcCB0aGUgb3JpZ2luYWwgdXBkYXRlICcgKyAnaW4gc3RhcnRUcmFuc2l0aW9uLicpKTtcblxuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgX2NhcHR1cmVkVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgLy8gVGhpcyBjb21wb25lbnQgaXMgc3RpbGwgcGVuZGluZyBtb3JlIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBzbyB3ZSBjYW4ndCBoeWRyYXRlIGl0c1xuICAgICAgLy8gY29udGVudC4gV2UgdHJlYXQgaXQgYXMgaWYgdGhpcyBjb21wb25lbnQgc3VzcGVuZGVkIGl0c2VsZi4gSXQgbWlnaHQgc2VlbSBhcyBpZlxuICAgICAgLy8gd2UgY291bGQganVzdCB0cnkgdG8gcmVuZGVyIGl0IGNsaWVudC1zaWRlIGluc3RlYWQuIEhvd2V2ZXIsIHRoaXMgd2lsbCBwZXJmb3JtIGFcbiAgICAgIC8vIGxvdCBvZiB1bm5lY2Vzc2FyeSB3b3JrIGFuZCBpcyB1bmxpa2VseSB0byBjb21wbGV0ZSBzaW5jZSBpdCBvZnRlbiB3aWxsIHN1c3BlbmRcbiAgICAgIC8vIG9uIG1pc3NpbmcgZGF0YSBhbnl3YXkuIEFkZGl0aW9uYWxseSwgdGhlIHNlcnZlciBtaWdodCBiZSBhYmxlIHRvIHJlbmRlciBtb3JlXG4gICAgICAvLyB0aGFuIHdlIGNhbiBvbiB0aGUgY2xpZW50IHlldC4gSW4gdGhhdCBjYXNlIHdlJ2QgZW5kIHVwIHdpdGggbW9yZSBmYWxsYmFjayBzdGF0ZXNcbiAgICAgIC8vIG9uIHRoZSBjbGllbnQgdGhhbiBpZiB3ZSBqdXN0IGxlYXZlIGl0IGFsb25lLiBJZiB0aGUgc2VydmVyIHRpbWVzIG91dCBvciBlcnJvcnNcbiAgICAgIC8vIHRoZXNlIHNob3VsZCB1cGRhdGUgdGhpcyBib3VuZGFyeSB0byB0aGUgcGVybWFuZW50IEZhbGxiYWNrIHN0YXRlIGluc3RlYWQuXG4gICAgICAvLyBNYXJrIGl0IGFzIGhhdmluZyBjYXB0dXJlZCAoaS5lLiBzdXNwZW5kZWQpLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsgLy8gTGVhdmUgdGhlIGNoaWxkIGluIHBsYWNlLiBJLmUuIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gcmV0cnkgdGhpcyBib3VuZGFyeSBvbmNlIHRoZSBzZXJ2ZXIgaGFzIHNlbnQgdGhlIHJlc3VsdC5cblxuICAgICAgdmFyIHJldHJ5ID0gcmV0cnlEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeS5iaW5kKG51bGwsIGN1cnJlbnQpO1xuICAgICAgcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoc3VzcGVuc2VJbnN0YW5jZSwgcmV0cnkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGF0dGVtcHQuXG4gICAgICByZWVudGVySHlkcmF0aW9uU3RhdGVGcm9tRGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlSW5zdGFuY2UsIHN1c3BlbnNlU3RhdGUudHJlZUNvbnRleHQpO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbik7IC8vIE1hcmsgdGhlIGNoaWxkcmVuIGFzIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGZhc3QgcGF0aCB0byBrbm93IHdoZXRoZXIgdGhpc1xuICAgICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgICAgLy8gbm9kZSBoYXMgZnVsbHkgbW91bnRlZCB5ZXQsIGFuZCBmb3Igc2NoZWR1bGluZyBldmVudCByZXBsYXlpbmcuXG4gICAgICAvLyBDb25jZXB0dWFsbHkgdGhpcyBpcyBzaW1pbGFyIHRvIFBsYWNlbWVudCBpbiB0aGF0IGEgbmV3IHN1YnRyZWUgaXNcbiAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgICAgLy8gbXV0YXRpb25zIGJlY2F1c2UgaXQgYWxyZWFkeSBleGlzdHMuXG5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmZsYWdzIHw9IEh5ZHJhdGluZztcbiAgICAgIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHJlbmRlciBwYXNzLiBXZSBhbHJlYWR5IGF0dGVtcHRlZCB0byBoeWRyYXRlZCwgYnV0XG4gICAgLy8gc29tZXRoaW5nIGVpdGhlciBzdXNwZW5kZWQgb3IgZXJyb3JlZC5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGh5ZHJhdGlvbi4gVHJ5IGFnYWluIHdpdGhvdXQgaHlkcmF0aW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfkZvcmNlQ2xpZW50UmVuZGVyO1xuXG4gICAgICB2YXIgX2NhcHR1cmVkVmFsdWUyID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShuZXcgRXJyb3IoJ1RoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBoeWRyYXRpbmcgdGhpcyBTdXNwZW5zZSBib3VuZGFyeS4gJyArICdTd2l0Y2hlZCB0byBjbGllbnQgcmVuZGVyaW5nLicpKTtcblxuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgX2NhcHR1cmVkVmFsdWUyKTtcbiAgICB9IGVsc2UgaWYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQgYW5kIHdlIHNob3VsZCBzdGlsbCBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuXG4gICAgICAvLyBMZWF2ZSB0aGUgZXhpc3RpbmcgY2hpbGQgaW4gcGxhY2UuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFRoZSBkZWh5ZHJhdGVkIGNvbXBsZXRpb24gcGFzcyBleHBlY3RzIHRoaXMgZmxhZyB0byBiZSB0aGVyZVxuICAgICAgLy8gYnV0IHRoZSBub3JtYWwgc3VzcGVuc2UgcGFzcyBkb2Vzbid0LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN1c3BlbmRlZCBidXQgd2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuXG4gICAgICAvLyBUaGVyZWZvcmUgd2Ugbm93IGhhdmUgdG8gcmVuZGVyIHRoZSBmYWxsYmFjay5cbiAgICAgIHZhciBuZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG5leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0FmdGVyUmV0cnlXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihmaWJlciwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCkge1xuICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KTtcbn1cblxuZnVuY3Rpb24gcHJvcGFnYXRlU3VzcGVuc2VDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBmaXJzdENoaWxkLCByZW5kZXJMYW5lcykge1xuICAvLyBNYXJrIGFueSBTdXNwZW5zZSBib3VuZGFyaWVzIHdpdGggZmFsbGJhY2tzIGFzIGhhdmluZyB3b3JrIHRvIGRvLlxuICAvLyBJZiB0aGV5IHdlcmUgcHJldmlvdXNseSBmb3JjZWQgaW50byBmYWxsYmFja3MsIHRoZXkgbWF5IG5vdyBiZSBhYmxlXG4gIC8vIHRvIHVuYmxvY2suXG4gIHZhciBub2RlID0gZmlyc3RDaGlsZDtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IG5vZGUubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlTGlzdENvbXBvbmVudCkge1xuICAgICAgLy8gSWYgdGhlIHRhaWwgaXMgaGlkZGVuIHRoZXJlIG1pZ2h0IG5vdCBiZSBhbiBTdXNwZW5zZSBib3VuZGFyaWVzXG4gICAgICAvLyB0byBzY2hlZHVsZSB3b3JrIG9uLiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBvbiB0aGVcbiAgICAgIC8vIGxpc3QgaXRzZWxmLlxuICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSB0byB0cmF2ZXJzZSB0byB0aGUgY2hpbGRyZW4gb2YgdGhlIGxpc3Qgc2luY2VcbiAgICAgIC8vIHRoZSBsaXN0IHdpbGwgcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugd2hlbiBpdCByZXJlbmRlcnMuXG4gICAgICBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIobm9kZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kTGFzdENvbnRlbnRSb3coZmlyc3RDaGlsZCkge1xuICAvLyBUaGlzIGlzIGdvaW5nIHRvIGZpbmQgdGhlIGxhc3Qgcm93IGFtb25nIHRoZXNlIGNoaWxkcmVuIHRoYXQgaXMgYWxyZWFkeVxuICAvLyBzaG93aW5nIGNvbnRlbnQgb24gdGhlIHNjcmVlbiwgYXMgb3Bwb3NlZCB0byBiZWluZyBpbiBmYWxsYmFjayBzdGF0ZSBvclxuICAvLyBuZXcuIElmIGEgcm93IGhhcyBtdWx0aXBsZSBTdXNwZW5zZSBib3VuZGFyaWVzLCBhbnkgb2YgdGhlbSBiZWluZyBpbiB0aGVcbiAgLy8gZmFsbGJhY2sgc3RhdGUsIGNvdW50cyBhcyB0aGUgd2hvbGUgcm93IGJlaW5nIGluIGEgZmFsbGJhY2sgc3RhdGUuXG4gIC8vIE5vdGUgdGhhdCB0aGUgXCJyb3dzXCIgd2lsbCBiZSB3b3JrSW5Qcm9ncmVzcywgYnV0IGFueSBuZXN0ZWQgY2hpbGRyZW5cbiAgLy8gd2lsbCBzdGlsbCBiZSBjdXJyZW50IHNpbmNlIHdlIGhhdmVuJ3QgcmVuZGVyZWQgdGhlbSB5ZXQuIFRoZSBtb3VudGVkXG4gIC8vIG9yZGVyIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5ldyBvcmRlci4gV2UgdXNlIHRoZSBuZXcgb3JkZXIuXG4gIHZhciByb3cgPSBmaXJzdENoaWxkO1xuICB2YXIgbGFzdENvbnRlbnRSb3cgPSBudWxsO1xuXG4gIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgIGlmIChjdXJyZW50Um93ICE9PSBudWxsICYmIGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50Um93KSA9PT0gbnVsbCkge1xuICAgICAgbGFzdENvbnRlbnRSb3cgPSByb3c7XG4gICAgfVxuXG4gICAgcm93ID0gcm93LnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbGFzdENvbnRlbnRSb3c7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmV2ZWFsT3JkZXIocmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmIChyZXZlYWxPcmRlciAhPT0gdW5kZWZpbmVkICYmIHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ3RvZ2V0aGVyJyAmJiAhZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdKSB7XG4gICAgICBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0gPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIHJldmVhbE9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICBzd2l0Y2ggKHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICd0b2dldGhlcic6XG4gICAgICAgICAgY2FzZSAnZm9yd2FyZHMnOlxuICAgICAgICAgIGNhc2UgJ2JhY2t3YXJkcyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnVXNlIGxvd2VyY2FzZSBcIiVzXCIgaW5zdGVhZC4nLCByZXZlYWxPcmRlciwgcmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdmb3J3YXJkJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnUmVhY3QgdXNlcyB0aGUgLXMgc3VmZml4IGluIHRoZSBzcGVsbGluZy4gVXNlIFwiJXNzXCIgaW5zdGVhZC4nLCByZXZlYWxPcmRlciwgcmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignJXMgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsIHJldmVhbE9yZGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmICh0YWlsTW9kZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0pIHtcbiAgICAgIGlmICh0YWlsTW9kZSAhPT0gJ2NvbGxhcHNlZCcgJiYgdGFpbE1vZGUgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHRhaWwgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJjb2xsYXBzZWRcIiBvciBcImhpZGRlblwiPycsIHRhaWxNb2RlKTtcbiAgICAgIH0gZWxzZSBpZiAocmV2ZWFsT3JkZXIgIT09ICdmb3J3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICdiYWNrd2FyZHMnKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJzxTdXNwZW5zZUxpc3QgdGFpbD1cIiVzXCIgLz4gaXMgb25seSB2YWxpZCBpZiByZXZlYWxPcmRlciBpcyAnICsgJ1wiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBzcGVjaWZ5IHJldmVhbE9yZGVyPVwiZm9yd2FyZHNcIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoY2hpbGRTbG90LCBpbmRleCkge1xuICB7XG4gICAgdmFyIGlzQW5BcnJheSA9IGlzQXJyYXkoY2hpbGRTbG90KTtcbiAgICB2YXIgaXNJdGVyYWJsZSA9ICFpc0FuQXJyYXkgJiYgdHlwZW9mIGdldEl0ZXJhdG9yRm4oY2hpbGRTbG90KSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmIChpc0FuQXJyYXkgfHwgaXNJdGVyYWJsZSkge1xuICAgICAgdmFyIHR5cGUgPSBpc0FuQXJyYXkgPyAnYXJyYXknIDogJ2l0ZXJhYmxlJztcblxuICAgICAgZXJyb3IoJ0EgbmVzdGVkICVzIHdhcyBwYXNzZWQgdG8gcm93ICMlcyBpbiA8U3VzcGVuc2VMaXN0IC8+LiBXcmFwIGl0IGluICcgKyAnYW4gYWRkaXRpb25hbCBTdXNwZW5zZUxpc3QgdG8gY29uZmlndXJlIGl0cyByZXZlYWxPcmRlcjogJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj4gLi4uICcgKyAnPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+eyVzfTwvU3VzcGVuc2VMaXN0PiAuLi4gJyArICc8L1N1c3BlbnNlTGlzdD4nLCB0eXBlLCBpbmRleCwgdHlwZSk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihjaGlsZHJlbiwgcmV2ZWFsT3JkZXIpIHtcbiAge1xuICAgIGlmICgocmV2ZWFsT3JkZXIgPT09ICdmb3J3YXJkcycgfHwgcmV2ZWFsT3JkZXIgPT09ICdiYWNrd2FyZHMnKSAmJiBjaGlsZHJlbiAhPT0gdW5kZWZpbmVkICYmIGNoaWxkcmVuICE9PSBudWxsICYmIGNoaWxkcmVuICE9PSBmYWxzZSkge1xuICAgICAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoY2hpbGRyZW5baV0sIGkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjaGlsZHJlbkl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcblxuICAgICAgICAgIGlmIChjaGlsZHJlbkl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgdmFyIF9pID0gMDtcblxuICAgICAgICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IHN0ZXAgPSBjaGlsZHJlbkl0ZXJhdG9yLm5leHQoKSkge1xuICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRlU3VzcGVuc2VMaXN0TmVzdGVkQ2hpbGQoc3RlcC52YWx1ZSwgX2kpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgX2krKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3IoJ0Egc2luZ2xlIHJvdyB3YXMgcGFzc2VkIHRvIGEgPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj1cIiVzXCIgLz4uICcgKyAnVGhpcyBpcyBub3QgdXNlZnVsIHNpbmNlIGl0IG5lZWRzIG11bHRpcGxlIHJvd3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHBhc3MgbXVsdGlwbGUgY2hpbGRyZW4gb3IgYW4gYXJyYXk/JywgcmV2ZWFsT3JkZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgaXNCYWNrd2FyZHMsIHRhaWwsIGxhc3RDb250ZW50Um93LCB0YWlsTW9kZSkge1xuICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChyZW5kZXJTdGF0ZSA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgICBpc0JhY2t3YXJkczogaXNCYWNrd2FyZHMsXG4gICAgICByZW5kZXJpbmc6IG51bGwsXG4gICAgICByZW5kZXJpbmdTdGFydFRpbWU6IDAsXG4gICAgICBsYXN0OiBsYXN0Q29udGVudFJvdyxcbiAgICAgIHRhaWw6IHRhaWwsXG4gICAgICB0YWlsTW9kZTogdGFpbE1vZGVcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGNhbiByZXVzZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGZyb20gcHJldmlvdXMgcmVuZGVycy5cbiAgICByZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcyA9IGlzQmFja3dhcmRzO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gMDtcbiAgICByZW5kZXJTdGF0ZS5sYXN0ID0gbGFzdENvbnRlbnRSb3c7XG4gICAgcmVuZGVyU3RhdGUudGFpbCA9IHRhaWw7XG4gICAgcmVuZGVyU3RhdGUudGFpbE1vZGUgPSB0YWlsTW9kZTtcbiAgfVxufSAvLyBUaGlzIGNhbiBlbmQgdXAgcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50IG11bHRpcGxlIHBhc3Nlcy5cbi8vIFRoZSBmaXJzdCBwYXNzIHNwbGl0cyB0aGUgY2hpbGRyZW4gZmliZXJzIGludG8gdHdvIHNldHMuIEEgaGVhZCBhbmQgdGFpbC5cbi8vIFdlIGZpcnN0IHJlbmRlciB0aGUgaGVhZC4gSWYgYW55dGhpbmcgaXMgaW4gZmFsbGJhY2sgc3RhdGUsIHdlIGRvIGFub3RoZXJcbi8vIHBhc3MgdGhyb3VnaCBiZWdpbldvcmsgdG8gcmVyZW5kZXIgYWxsIGNoaWxkcmVuIChpbmNsdWRpbmcgdGhlIHRhaWwpIHdpdGhcbi8vIHRoZSBmb3JjZSBzdXNwZW5kIGNvbnRleHQuIElmIHRoZSBmaXJzdCByZW5kZXIgZGlkbid0IGhhdmUgYW55dGhpbmcgaW5cbi8vIGluIGZhbGxiYWNrIHN0YXRlLiBUaGVuIHdlIHJlbmRlciBlYWNoIHJvdyBpbiB0aGUgdGFpbCBvbmUtYnktb25lLlxuLy8gVGhhdCBoYXBwZW5zIGluIHRoZSBjb21wbGV0ZVdvcmsgcGhhc2Ugd2l0aG91dCBnb2luZyBiYWNrIHRvIGJlZ2luV29yay5cblxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZXZlYWxPcmRlciA9IG5leHRQcm9wcy5yZXZlYWxPcmRlcjtcbiAgdmFyIHRhaWxNb2RlID0gbmV4dFByb3BzLnRhaWw7XG4gIHZhciBuZXdDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihuZXdDaGlsZHJlbiwgcmV2ZWFsT3JkZXIpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3VsZEZvcmNlRmFsbGJhY2sgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuXG4gIGlmIChzaG91bGRGb3JjZUZhbGxiYWNrKSB7XG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAvLyBJZiB3ZSBwcmV2aW91c2x5IGZvcmNlZCBhIGZhbGxiYWNrLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHdvcmtcbiAgICAgIC8vIG9uIGFueSBuZXN0ZWQgYm91bmRhcmllcyB0byBsZXQgdGhlbSBrbm93IHRvIHRyeSB0byByZW5kZXJcbiAgICAgIC8vIGFnYWluLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvbnRleHQgdXBkYXRpbmcuXG4gICAgICBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLmNoaWxkLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgfVxuXG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgU3VzcGVuc2VMaXN0IGRvZXNuJ3Qgd29yayBzbyB3ZSBqdXN0XG4gICAgLy8gdXNlIG1ha2UgaXQgYSBub29wIGJ5IHRyZWF0aW5nIGl0IGFzIHRoZSBkZWZhdWx0IHJldmVhbE9yZGVyLlxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIpIHtcbiAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXN0Q29udGVudFJvdyA9IGZpbmRMYXN0Q29udGVudFJvdyh3b3JrSW5Qcm9ncmVzcy5jaGlsZCk7XG4gICAgICAgICAgdmFyIHRhaWw7XG5cbiAgICAgICAgICBpZiAobGFzdENvbnRlbnRSb3cgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSB3aG9sZSBsaXN0IGlzIHBhcnQgb2YgdGhlIHRhaWwuXG4gICAgICAgICAgICAvLyBUT0RPOiBXZSBjb3VsZCBmYXN0IHBhdGggYnkganVzdCByZW5kZXJpbmcgdGhlIHRhaWwgbm93LlxuICAgICAgICAgICAgdGFpbCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSB0YWlsIHJvd3MgYWZ0ZXIgdGhlIGNvbnRlbnQgcm93LlxuICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZW0gc2VwYXJhdGVseSBsYXRlci5cbiAgICAgICAgICAgIHRhaWwgPSBsYXN0Q29udGVudFJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgbGFzdENvbnRlbnRSb3cuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICB0YWlsLCBsYXN0Q29udGVudFJvdywgdGFpbE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ2JhY2t3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBmaW5kIHRoZSBmaXJzdCByb3cgdGhhdCBoYXMgZXhpc3RpbmcgY29udGVudC5cbiAgICAgICAgICAvLyBBdCB0aGUgc2FtZSB0aW1lIHdlJ3JlIGdvaW5nIHRvIHJldmVyc2UgdGhlIGxpc3Qgb2YgZXZlcnl0aGluZ1xuICAgICAgICAgIC8vIHdlIHBhc3MgaW4gdGhlIG1lYW50aW1lLiBUaGF0J3MgZ29pbmcgdG8gYmUgb3VyIHRhaWwgaW4gcmV2ZXJzZVxuICAgICAgICAgIC8vIG9yZGVyLlxuICAgICAgICAgIHZhciBfdGFpbCA9IG51bGw7XG4gICAgICAgICAgdmFyIHJvdyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcblxuICAgICAgICAgIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50Um93ID0gcm93LmFsdGVybmF0ZTsgLy8gTmV3IHJvd3MgY2FuJ3QgYmUgY29udGVudCByb3dzLlxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYWluIGNvbnRlbnQuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcm93O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5leHRSb3cgPSByb3cuc2libGluZztcbiAgICAgICAgICAgIHJvdy5zaWJsaW5nID0gX3RhaWw7XG4gICAgICAgICAgICBfdGFpbCA9IHJvdztcbiAgICAgICAgICAgIHJvdyA9IG5leHRSb3c7XG4gICAgICAgICAgfSAvLyBUT0RPOiBJZiB3b3JrSW5Qcm9ncmVzcy5jaGlsZCBpcyBudWxsLCB3ZSBjYW4gY29udGludWUgb24gdGhlIHRhaWwgaW1tZWRpYXRlbHkuXG5cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgdHJ1ZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBfdGFpbCwgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHRhaWxNb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICd0b2dldGhlcic6XG4gICAgICAgIHtcbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIG51bGwsIC8vIHRhaWxcbiAgICAgICAgICBudWxsLCAvLyBsYXN0XG4gICAgICAgICAgdW5kZWZpbmVkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVGhlIGRlZmF1bHQgcmV2ZWFsIG9yZGVyIGlzIHRoZSBzYW1lIGFzIG5vdCBoYXZpbmdcbiAgICAgICAgICAvLyBhIGJvdW5kYXJ5LlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBQb3J0YWxzIGFyZSBzcGVjaWFsIGJlY2F1c2Ugd2UgZG9uJ3QgYXBwZW5kIHRoZSBjaGlsZHJlbiBkdXJpbmcgbW91bnRcbiAgICAvLyBidXQgYXQgY29tbWl0LiBUaGVyZWZvcmUgd2UgbmVlZCB0byB0cmFjayBpbnNlcnRpb25zIHdoaWNoIHRoZSBub3JtYWxcbiAgICAvLyBmbG93IGRvZXNuJ3QgZG8gZHVyaW5nIG1vdW50LiBUaGlzIGRvZXNuJ3QgaGFwcGVuIGF0IHRoZSByb290IGJlY2F1c2VcbiAgICAvLyB0aGUgcm9vdCBhbHdheXMgc3RhcnRzIHdpdGggYSBcImN1cnJlbnRcIiB3aXRoIGEgbnVsbCBjaGlsZC5cbiAgICAvLyBUT0RPOiBDb25zaWRlciB1bmlmeWluZyB0aGlzIHdpdGggaG93IHRoZSByb290IHdvcmtzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxudmFyIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHByb3ZpZGVyVHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBjb250ZXh0ID0gcHJvdmlkZXJUeXBlLl9jb250ZXh0O1xuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIHZhciBuZXdWYWx1ZSA9IG5ld1Byb3BzLnZhbHVlO1xuXG4gIHtcbiAgICBpZiAoISgndmFsdWUnIGluIG5ld1Byb3BzKSkge1xuICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlcikge1xuICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RoZSBgdmFsdWVgIHByb3AgaXMgcmVxdWlyZWQgZm9yIHRoZSBgPENvbnRleHQuUHJvdmlkZXI+YC4gRGlkIHlvdSBtaXNzcGVsbCBpdCBvciBmb3JnZXQgdG8gcGFzcyBpdD8nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJvdmlkZXJQcm9wVHlwZXMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChwcm92aWRlclByb3BUeXBlcykge1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvdmlkZXJQcm9wVHlwZXMsIG5ld1Byb3BzLCAncHJvcCcsICdDb250ZXh0LlByb3ZpZGVyJyk7XG4gICAgfVxuICB9XG5cbiAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBuZXdWYWx1ZSk7XG5cbiAge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZFZhbHVlID0gb2xkUHJvcHMudmFsdWU7XG5cbiAgICAgIGlmIChvYmplY3RJcyhvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgIC8vIE5vIGNoYW5nZS4gQmFpbG91dCBlYXJseSBpZiBjaGlsZHJlbiBhcmUgdGhlIHNhbWUuXG4gICAgICAgIGlmIChvbGRQcm9wcy5jaGlsZHJlbiA9PT0gbmV3UHJvcHMuY2hpbGRyZW4gJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkpIHtcbiAgICAgICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgY29udGV4dCB2YWx1ZSBjaGFuZ2VkLiBTZWFyY2ggZm9yIG1hdGNoaW5nIGNvbnN1bWVycyBhbmQgc2NoZWR1bGVcbiAgICAgICAgLy8gdGhlbSB0byB1cGRhdGUuXG4gICAgICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRyZW4gPSBuZXdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxudmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZTsgLy8gVGhlIGxvZ2ljIGJlbG93IGZvciBDb250ZXh0IGRpZmZlcnMgZGVwZW5kaW5nIG9uIFBST0Qgb3IgREVWIG1vZGUuIEluXG4gIC8vIERFViBtb2RlLCB3ZSBjcmVhdGUgYSBzZXBhcmF0ZSBvYmplY3QgZm9yIENvbnRleHQuQ29uc3VtZXIgdGhhdCBhY3RzXG4gIC8vIGxpa2UgYSBwcm94eSB0byBDb250ZXh0LiBUaGlzIHByb3h5IG9iamVjdCBhZGRzIHVubmVjZXNzYXJ5IGNvZGUgaW4gUFJPRFxuICAvLyBzbyB3ZSB1c2UgdGhlIG9sZCBiZWhhdmlvdXIgKENvbnRleHQuQ29uc3VtZXIgcmVmZXJlbmNlcyBDb250ZXh0KSB0b1xuICAvLyByZWR1Y2Ugc2l6ZSBhbmQgb3ZlcmhlYWQuIFRoZSBzZXBhcmF0ZSBvYmplY3QgcmVmZXJlbmNlcyBjb250ZXh0IHZpYVxuICAvLyBhIHByb3BlcnR5IGNhbGxlZCBcIl9jb250ZXh0XCIsIHdoaWNoIGFsc28gZ2l2ZXMgdXMgdGhlIGFiaWxpdHkgdG8gY2hlY2tcbiAgLy8gaW4gREVWIG1vZGUgaWYgdGhpcyBwcm9wZXJ0eSBleGlzdHMgb3Igbm90IGFuZCB3YXJuIGlmIGl0IGRvZXMgbm90LlxuXG4gIHtcbiAgICBpZiAoY29udGV4dC5fY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIG1heSBiZSBiZWNhdXNlIGl0J3MgYSBDb250ZXh0IChyYXRoZXIgdGhhbiBhIENvbnN1bWVyKS5cbiAgICAgIC8vIE9yIGl0IG1heSBiZSBiZWNhdXNlIGl0J3Mgb2xkZXIgUmVhY3Qgd2hlcmUgdGhleSdyZSB0aGUgc2FtZSB0aGluZy5cbiAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB3YXJuIGlmIHdlJ3JlIHN1cmUgaXQncyBhIG5ldyBSZWFjdC5cbiAgICAgIGlmIChjb250ZXh0ICE9PSBjb250ZXh0LkNvbnN1bWVyKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyKSB7XG4gICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQ+IGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dCA9IGNvbnRleHQuX2NvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcmVuZGVyID0gbmV3UHJvcHMuY2hpbGRyZW47XG5cbiAge1xuICAgIGlmICh0eXBlb2YgcmVuZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignQSBjb250ZXh0IGNvbnN1bWVyIHdhcyByZW5kZXJlZCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuLCBvciBhIGNoaWxkICcgKyBcInRoYXQgaXNuJ3QgYSBmdW5jdGlvbi4gQSBjb250ZXh0IGNvbnN1bWVyIGV4cGVjdHMgYSBzaW5nbGUgY2hpbGQgXCIgKyAndGhhdCBpcyBhIGZ1bmN0aW9uLiBJZiB5b3UgZGlkIHBhc3MgYSBmdW5jdGlvbiwgbWFrZSBzdXJlIHRoZXJlICcgKyAnaXMgbm8gdHJhaWxpbmcgb3IgbGVhZGluZyB3aGl0ZXNwYWNlIGFyb3VuZCBpdC4nKTtcbiAgICB9XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgbmV3VmFsdWUgPSByZWFkQ29udGV4dChjb250ZXh0KTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAgdmFyIG5ld0NoaWxkcmVuO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXdDaGlsZHJlbiA9IHJlbmRlcihuZXdWYWx1ZSk7XG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKSB7XG4gIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgbGF6eSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAgIC8vIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHkgY29tbWl0dGVkLlxuICAgICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgICAgY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gUmV1c2UgcHJldmlvdXMgZGVwZW5kZW5jaWVzXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgdXBkYXRlIFwiYmFzZVwiIHJlbmRlciB0aW1lcyBmb3IgYmFpbG91dHMuXG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgfVxuXG4gIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMpOyAvLyBDaGVjayBpZiB0aGUgY2hpbGRyZW4gaGF2ZSBhbnkgcGVuZGluZyB3b3JrLlxuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykpIHtcbiAgICAvLyBUaGUgY2hpbGRyZW4gZG9uJ3QgaGF2ZSBhbnkgd29yayBlaXRoZXIuIFdlIGNhbiBza2lwIHRoZW0uXG4gICAgLy8gVE9ETzogT25jZSB3ZSBhZGQgYmFjayByZXN1bWluZywgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBjaGlsZHJlbiBhcmVcbiAgICAvLyBhIHdvcmstaW4tcHJvZ3Jlc3Mgc2V0LiBJZiBzbywgd2UgbmVlZCB0byB0cmFuc2ZlciB0aGVpciBlZmZlY3RzLlxuICAgIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSAvLyBUaGlzIGZpYmVyIGRvZXNuJ3QgaGF2ZSB3b3JrLCBidXQgaXRzIHN1YnRyZWUgZG9lcy4gQ2xvbmUgdGhlIGNoaWxkXG4gIC8vIGZpYmVycyBhbmQgY29udGludWUuXG5cblxuICBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiByZW1vdW50RmliZXIoY3VycmVudCwgb2xkV29ya0luUHJvZ3Jlc3MsIG5ld1dvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgICBpZiAocmV0dXJuRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzd2FwIHRoZSByb290IGZpYmVyLicpO1xuICAgIH0gLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBvbGQgY3VycmVudC5cbiAgICAvLyBJdCB3aWxsIGdldCBkZWxldGVkLlxuXG5cbiAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgb2xkV29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gQ29ubmVjdCB0byB0aGUgbmV3IHRyZWUuXG5cbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5pbmRleCA9IG9sZFdvcmtJblByb2dyZXNzLmluZGV4O1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnNpYmxpbmcgPSBvbGRXb3JrSW5Qcm9ncmVzcy5zaWJsaW5nO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJldHVybiA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5yZWYgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFJlcGxhY2UgdGhlIGNoaWxkL3NpYmxpbmcgcG9pbnRlcnMgYWJvdmUgaXQuXG5cbiAgICBpZiAob2xkV29ya0luUHJvZ3Jlc3MgPT09IHJldHVybkZpYmVyLmNoaWxkKSB7XG4gICAgICByZXR1cm5GaWJlci5jaGlsZCA9IG5ld1dvcmtJblByb2dyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcHJldlNpYmxpbmcgPSByZXR1cm5GaWJlci5jaGlsZDtcblxuICAgICAgaWYgKHByZXZTaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcGFyZW50IHRvIGhhdmUgYSBjaGlsZC4nKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHByZXZTaWJsaW5nLnNpYmxpbmcgIT09IG9sZFdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHByZXZTaWJsaW5nID0gcHJldlNpYmxpbmcuc2libGluZztcblxuICAgICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJldmlvdXMgc2libGluZy4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcmV2U2libGluZy5zaWJsaW5nID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSAvLyBEZWxldGUgdGhlIG9sZCBmaWJlciBhbmQgcGxhY2UgdGhlIG5ldyBvbmUuXG4gICAgLy8gU2luY2UgdGhlIG9sZCBmaWJlciBpcyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgbWFudWFsbHkuXG5cblxuICAgIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY3VycmVudF07XG4gICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGlvbnMucHVzaChjdXJyZW50KTtcbiAgICB9XG5cbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7IC8vIFJlc3RhcnQgd29yayBmcm9tIHRoZSBuZXcgZmliZXIuXG5cbiAgICByZXR1cm4gbmV3V29ya0luUHJvZ3Jlc3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gQmVmb3JlIHBlcmZvcm1pbmcgYW4gZWFybHkgYmFpbG91dCwgd2UgbXVzdCBjaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZ1xuICAvLyB1cGRhdGVzIG9yIGNvbnRleHQuXG4gIHZhciB1cGRhdGVMYW5lcyA9IGN1cnJlbnQubGFuZXM7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUodXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vIHBlbmRpbmcgdXBkYXRlLCBidXQgYmVjYXVzZSBjb250ZXh0IGlzIHByb3BhZ2F0ZWQgbGF6aWx5LCB3ZSBuZWVkXG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBmaWJlciBkb2VzIG5vdCBoYXZlIGFueSBwZW5kaW5nIHdvcmsuIEJhaWxvdXQgd2l0aG91dCBlbnRlcmluZ1xuICAvLyB0aGUgYmVnaW4gcGhhc2UuIFRoZXJlJ3Mgc3RpbGwgc29tZSBib29ra2VlcGluZyB3ZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmVcbiAgLy8gaW4gdGhpcyBvcHRpbWl6ZWQgcGF0aCwgbW9zdGx5IHB1c2hpbmcgc3R1ZmYgb250byB0aGUgc3RhY2suXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudmFsdWU7XG4gICAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgICAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBuZXdWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHtcbiAgICAgICAgLy8gUHJvZmlsZXIgc2hvdWxkIG9ubHkgY2FsbCBvblJlbmRlciB3aGVuIG9uZSBvZiBpdHMgZGVzY2VuZGFudHMgYWN0dWFsbHkgcmVuZGVyZWQuXG4gICAgICAgIHZhciBoYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAgICAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuICAgICAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpOyAvLyBXZSBrbm93IHRoYXQgdGhpcyBjb21wb25lbnQgd2lsbCBzdXNwZW5kIGFnYWluIGJlY2F1c2UgaWYgaXQgaGFzXG4gICAgICAgICAgICAvLyBiZWVuIHVuc3VzcGVuZGVkIGl0IGhhcyBjb21taXR0ZWQgYXMgYSByZXNvbHZlZCBTdXNwZW5zZSBjb21wb25lbnQuXG4gICAgICAgICAgICAvLyBJZiBpdCBuZWVkcyB0byBiZSByZXRyaWVkLCBpdCBzaG91bGQgaGF2ZSB3b3JrIHNjaGVkdWxlZCBvbiBpdC5cblxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsgLy8gV2Ugc2hvdWxkIG5ldmVyIHJlbmRlciB0aGUgY2hpbGRyZW4gb2YgYSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IHVudGlsIHdlXG4gICAgICAgICAgICAvLyB1cGdyYWRlIGl0LiBXZSByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsuXG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH0gLy8gSWYgdGhpcyBib3VuZGFyeSBpcyBjdXJyZW50bHkgdGltZWQgb3V0LCB3ZSBuZWVkIHRvIGRlY2lkZVxuICAgICAgICAgIC8vIHdoZXRoZXIgdG8gcmV0cnkgdGhlIHByaW1hcnkgY2hpbGRyZW4sIG9yIHRvIHNraXAgb3ZlciBpdCBhbmRcbiAgICAgICAgICAvLyBnbyBzdHJhaWdodCB0byB0aGUgZmFsbGJhY2suIENoZWNrIHRoZSBwcmlvcml0eSBvZiB0aGUgcHJpbWFyeVxuICAgICAgICAgIC8vIGNoaWxkIGZyYWdtZW50LlxuXG5cbiAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkTGFuZXMgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzO1xuXG4gICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHByaW1hcnlDaGlsZExhbmVzKSkge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFVzZSB0aGUgbm9ybWFsIHBhdGhcbiAgICAgICAgICAgIC8vIHRvIGF0dGVtcHQgdG8gcmVuZGVyIHRoZSBwcmltYXJ5IGNoaWxkcmVuIGFnYWluLlxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50IGRvZXMgbm90IGhhdmUgcGVuZGluZyB3b3JrIG1hcmtlZFxuICAgICAgICAgICAgLy8gb24gaXRcbiAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpOyAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBkbyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgd2l0aCBzdWZmaWNpZW50XG4gICAgICAgICAgICAvLyBwcmlvcml0eS4gQmFpbG91dC5cblxuICAgICAgICAgICAgdmFyIGNoaWxkID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhlIGZhbGxiYWNrIGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBTa2lwIG92ZXIgdGhlXG4gICAgICAgICAgICAgIC8vIHByaW1hcnkgY2hpbGRyZW4gYW5kIHdvcmsgb24gdGhlIGZhbGxiYWNrLlxuICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2libGluZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE5vdGU6IFdlIGNhbiByZXR1cm4gYG51bGxgIGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IGNoZWNrZWRcbiAgICAgICAgICAgICAgLy8gd2hldGhlciB0aGVyZSB3ZXJlIG5lc3RlZCBjb250ZXh0IGNvbnN1bWVycywgdmlhIHRoZSBjYWxsIHRvXG4gICAgICAgICAgICAgIC8vIGBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrYCBhYm92ZS5cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGRpZFN1c3BlbmRCZWZvcmUgPSAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICAgIHZhciBfaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG5cbiAgICAgICAgaWYgKGRpZFN1c3BlbmRCZWZvcmUpIHtcbiAgICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIHdhcyBpbiBmYWxsYmFjayBzdGF0ZSBsYXN0IHRpbWUsIGFuZCB3ZSBoYXZlIGFsbCB0aGVcbiAgICAgICAgICAgIC8vIHNhbWUgY2hpbGRyZW4gdGhlbiB3ZSdyZSBzdGlsbCBpbiBwcm9ncmVzc2l2ZSBsb2FkaW5nIHN0YXRlLlxuICAgICAgICAgICAgLy8gU29tZXRoaW5nIG1pZ2h0IGdldCB1bmJsb2NrZWQgYnkgc3RhdGUgdXBkYXRlcyBvciByZXRyaWVzIGluIHRoZVxuICAgICAgICAgICAgLy8gdHJlZSB3aGljaCB3aWxsIGFmZmVjdCB0aGUgdGFpbC4gU28gd2UgbmVlZCB0byB1c2UgdGhlIG5vcm1hbFxuICAgICAgICAgICAgLy8gcGF0aCB0byBjb21wdXRlIHRoZSBjb3JyZWN0IHRhaWwuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfSAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cblxuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgfSAvLyBJZiBub3RoaW5nIHN1c3BlbmRlZCBiZWZvcmUgYW5kIHdlJ3JlIHJlbmRlcmluZyB0aGUgc2FtZSBjaGlsZHJlbixcbiAgICAgICAgLy8gdGhlbiB0aGUgdGFpbCBkb2Vzbid0IG1hdHRlci4gQW55dGhpbmcgbmV3IHRoYXQgc3VzcGVuZHMgd2lsbCB3b3JrXG4gICAgICAgIC8vIGluIHRoZSBcInRvZ2V0aGVyXCIgbW9kZSwgc28gd2UgY2FuIGNvbnRpbnVlIGZyb20gdGhlIHN0YXRlIHdlIGhhZC5cblxuXG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUmVzZXQgdG8gdGhlIFwidG9nZXRoZXJcIiBtb2RlIGluIGNhc2Ugd2UndmUgc3RhcnRlZCBhIGRpZmZlcmVudFxuICAgICAgICAgIC8vIHVwZGF0ZSBpbiB0aGUgcGFzdCBidXQgZGlkbid0IGNvbXBsZXRlIGl0LlxuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuXG4gICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm9uZSBvZiB0aGUgY2hpbGRyZW4gaGFkIGFueSB3b3JrLCB0aGF0IG1lYW5zIHRoYXQgbm9uZSBvZlxuICAgICAgICAgIC8vIHRoZW0gZ290IHJldHJpZWQgc28gdGhleSdsbCBzdGlsbCBiZSBibG9ja2VkIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSB0cmVlIHN0aWxsIG5lZWRzIHRvIGJlIGRlZmVycmVkLiBUaGlzIGlzXG4gICAgICAgIC8vIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlIGxvZ2ljIHVzZWQgaW4gdGhlIG5vcm1hbCB1cGRhdGUgcGF0aCxcbiAgICAgICAgLy8gc28gd2UnbGwganVzdCBlbnRlciB0aGF0LiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHdlJ2xsIGJhaWwgb3V0XG4gICAgICAgIC8vIGF0IHRoZSBuZXh0IGxldmVsIGluc3RlYWQgb2YgdGhpcyBvbmUsIGJlY2F1c2UgdGhlIGNoaWxkIHByb3BzXG4gICAgICAgIC8vIGhhdmUgbm90IGNoYW5nZWQuIFdoaWNoIGlzIGZpbmUuXG4gICAgICAgIC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCByZWZhY3RvciBgYmVnaW5Xb3JrYCB0byBzcGxpdCB0aGUgYmFpbG91dFxuICAgICAgICAvLyBwYXRoIGZyb20gdGhlIG5vcm1hbCBwYXRoLiBJJ20gdGVtcHRlZCB0byBkbyBhIGxhYmVsZWQgYnJlYWsgaGVyZVxuICAgICAgICAvLyBidXQgSSB3b24ndCA6KVxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIGJlZ2luV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgJiYgY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB3aWxsIHJlc3RhcnQgdGhlIGJlZ2luIHBoYXNlIHdpdGggYSBuZXcgZmliZXIuXG4gICAgICByZXR1cm4gcmVtb3VudEZpYmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3Mua2V5LCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyIHx8IG51bGwsIHdvcmtJblByb2dyZXNzLm1vZGUsIHdvcmtJblByb2dyZXNzLmxhbmVzKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBoYXNDb250ZXh0Q2hhbmdlZCgpIHx8ICggLy8gRm9yY2UgYSByZS1yZW5kZXIgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQ6XG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgIT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICAvLyBJZiBwcm9wcyBvciBjb250ZXh0IGNoYW5nZWQsIG1hcmsgdGhlIGZpYmVyIGFzIGhhdmluZyBwZXJmb3JtZWQgd29yay5cbiAgICAgIC8vIFRoaXMgbWF5IGJlIHVuc2V0IGlmIHRoZSBwcm9wcyBhcmUgZGV0ZXJtaW5lZCB0byBiZSBlcXVhbCBsYXRlciAobWVtbykuXG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBwcm9wcyBub3IgbGVnYWN5IGNvbnRleHQgY2hhbmdlcy4gQ2hlY2sgaWYgdGhlcmUncyBhIHBlbmRpbmdcbiAgICAgIC8vIHVwZGF0ZSBvciBjb250ZXh0IGNoYW5nZS5cbiAgICAgIHZhciBoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgPSBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmICghaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ICYmIC8vIElmIHRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIG9mIGFuIGVycm9yIG9yIHN1c3BlbnNlIGJvdW5kYXJ5LCB0aGVyZVxuICAgICAgLy8gbWF5IG5vdCBiZSB3b3JrIHNjaGVkdWxlZCBvbiBgY3VycmVudGAsIHNvIHdlIGNoZWNrIGZvciB0aGlzIGZsYWcuXG4gICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBObyBwZW5kaW5nIHVwZGF0ZXMgb3IgY29udGV4dC4gQmFpbCBvdXQgbm93LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb24gdGhpcyBmaWJlciwgYnV0IHRoZXJlIGFyZSBubyBuZXcgcHJvcHNcbiAgICAgICAgLy8gbm9yIGxlZ2FjeSBjb250ZXh0LiBTZXQgdGhpcyB0byBmYWxzZS4gSWYgYW4gdXBkYXRlIHF1ZXVlIG9yIGNvbnRleHRcbiAgICAgICAgLy8gY29uc3VtZXIgcHJvZHVjZXMgYSBjaGFuZ2VkIHZhbHVlLCBpdCB3aWxsIHNldCB0aGlzIHRvIHRydWUuIE90aGVyd2lzZSxcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCB3aWxsIGFzc3VtZSB0aGUgY2hpbGRyZW4gaGF2ZSBub3QgY2hhbmdlZCBhbmQgYmFpbCBvdXQuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaXNGb3JrZWRDaGlsZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgY2hpbGQgYmVsb25ncyB0byBhIGxpc3Qgb2YgbXVsaXBsZSBjaGlsZHJlbiBpblxuICAgICAgLy8gaXRzIHBhcmVudC5cbiAgICAgIC8vXG4gICAgICAvLyBJbiBhIHRydWUgbXVsdGktdGhyZWFkZWQgaW1wbGVtZW50YXRpb24sIHdlIHdvdWxkIHJlbmRlciBjaGlsZHJlbiBvblxuICAgICAgLy8gcGFyYWxsZWwgdGhyZWFkcy4gVGhpcyB3b3VsZCByZXByZXNlbnQgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyByZW5kZXJcbiAgICAgIC8vIHRocmVhZCBmb3IgdGhpcyBzdWJ0cmVlLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIG9ubHkgdXNlIHRoaXMgZm9yIGlkIGdlbmVyYXRpb24gZHVyaW5nIGh5ZHJhdGlvbiwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgLy8gbG9naWMgaXMgbG9jYXRlZCBpbiB0aGlzIHNwZWNpYWwgYnJhbmNoLlxuICAgICAgdmFyIHNsb3RJbmRleCA9IHdvcmtJblByb2dyZXNzLmluZGV4O1xuICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBnZXRGb3Jrc0F0TGV2ZWwoKTtcbiAgICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MsIHNsb3RJbmRleCk7XG4gICAgfVxuICB9IC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNsZWFyIHBlbmRpbmcgdXBkYXRlIHByaW9yaXR5LlxuICAvLyBUT0RPOiBUaGlzIGFzc3VtZXMgdGhhdCB3ZSdyZSBhYm91dCB0byBldmFsdWF0ZSB0aGUgY29tcG9uZW50IGFuZCBwcm9jZXNzXG4gIC8vIHRoZSB1cGRhdGUgcXVldWUuIEhvd2V2ZXIsIHRoZXJlJ3MgYW4gZXhjZXB0aW9uOiBTaW1wbGVNZW1vQ29tcG9uZW50XG4gIC8vIHNvbWV0aW1lcyBiYWlscyBvdXQgbGF0ZXIgaW4gdGhlIGJlZ2luIHBoYXNlLiBUaGlzIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAvLyBtb3ZlIHRoaXMgYXNzaWdubWVudCBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIGFuZCBpbnRvIGVhY2ggYnJhbmNoLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuICAgICAgICByZXR1cm4gbW91bnRMYXp5Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciB1bnJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciByZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IENvbXBvbmVudCA/IHVucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCB1bnJlc29sdmVkUHJvcHMpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9Db21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudCA/IF91bnJlc29sdmVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQsIF91bnJlc29sdmVkUHJvcHMpO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudCwgX3Jlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSB0eXBlID8gX3VucmVzb2x2ZWRQcm9wczIgOiByZXNvbHZlRGVmYXVsdFByb3BzKHR5cGUsIF91bnJlc29sdmVkUHJvcHMyKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICByZXR1cm4gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMiwgX3VucmVzb2x2ZWRQcm9wczMpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IF90eXBlMi5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShfdHlwZTIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMi50eXBlLCBfcmVzb2x2ZWRQcm9wczMpO1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX3R5cGUyLCBfcmVzb2x2ZWRQcm9wczMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQyID8gX3VucmVzb2x2ZWRQcm9wczQgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQyLCBfdW5yZXNvbHZlZFByb3BzNCk7XG5cbiAgICAgICAgcmV0dXJuIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MiwgX3Jlc29sdmVkUHJvcHM0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICsgd29ya0luUHJvZ3Jlc3MudGFnICsgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gXCIgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFRhZyB0aGUgZmliZXIgd2l0aCBhbiB1cGRhdGUgZWZmZWN0LiBUaGlzIHR1cm5zIGEgUGxhY2VtZW50IGludG9cbiAgLy8gYSBQbGFjZW1lbnRBbmRVcGRhdGUuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKSB7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICB9XG59XG5cbnZhciBhcHBlbmRBbGxDaGlsZHJlbjtcbnZhciB1cGRhdGVIb3N0Q29udGFpbmVyO1xudmFyIHVwZGF0ZUhvc3RDb21wb25lbnQkMTtcbnZhciB1cGRhdGVIb3N0VGV4dCQxO1xuXG57XG4gIC8vIE11dGF0aW9uIG1vZGVcbiAgYXBwZW5kQWxsQ2hpbGRyZW4gPSBmdW5jdGlvbiAocGFyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmVlZHNWaXNpYmlsaXR5VG9nZ2xlLCBpc0hpZGRlbikge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGNyZWF0ZWQgYnV0IHdlIG5lZWQgcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RDb250YWluZXIgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHsvLyBOb29wXG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbXBvbmVudCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWQgdG9cbiAgICAvLyBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcblxuICAgIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIC8vIEluIG11dGF0aW9uIG1vZGUsIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYSBiYWlsb3V0IGJlY2F1c2VcbiAgICAgIC8vIHdlIHdvbid0IHRvdWNoIHRoaXMgbm9kZSBldmVuIGlmIGNoaWxkcmVuIGNoYW5nZWQuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBnZXQgdXBkYXRlZCBiZWNhdXNlIG9uZSBvZiBvdXIgY2hpbGRyZW4gdXBkYXRlZCwgd2UgZG9uJ3RcbiAgICAvLyBoYXZlIG5ld1Byb3BzIHNvIHdlJ2xsIGhhdmUgdG8gcmV1c2UgdGhlbS5cbiAgICAvLyBUT0RPOiBTcGxpdCB0aGUgdXBkYXRlIEFQSSBhcyBzZXBhcmF0ZSBmb3IgdGhlIHByb3BzIHZzLiBjaGlsZHJlbi5cbiAgICAvLyBFdmVuIGJldHRlciB3b3VsZCBiZSBpZiBjaGlsZHJlbiB3ZXJlbid0IHNwZWNpYWwgY2FzZWQgYXQgYWxsIHRoby5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpOyAvLyBUT0RPOiBFeHBlcmllbmNpbmcgYW4gZXJyb3Igd2hlcmUgb2xkUHJvcHMgaXMgbnVsbC4gU3VnZ2VzdHMgYSBob3N0XG4gICAgLy8gY29tcG9uZW50IGlzIGhpdHRpbmcgdGhlIHJlc3VtZSBwYXRoLiBGaWd1cmUgb3V0IHdoeS4gUG9zc2libHlcbiAgICAvLyByZWxhdGVkIHRvIGBoaWRkZW5gLlxuXG4gICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBwcmVwYXJlVXBkYXRlKGluc3RhbmNlLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAgIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaXMgZG9uZSBpbiBjb21taXRXb3JrLlxuXG4gICAgaWYgKHVwZGF0ZVBheWxvYWQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcblxuICB1cGRhdGVIb3N0VGV4dCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBvbGRUZXh0LCBuZXdUZXh0KSB7XG4gICAgLy8gSWYgdGhlIHRleHQgZGlmZmVycywgbWFyayBpdCBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpbiBkb25lIGluIGNvbW1pdFdvcmsuXG4gICAgaWYgKG9sZFRleHQgIT09IG5ld1RleHQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2spIHtcbiAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAvLyBJZiB3ZSdyZSBoeWRyYXRpbmcsIHdlIHNob3VsZCBjb25zdW1lIGFzIG1hbnkgaXRlbXMgYXMgd2UgY2FuXG4gICAgLy8gc28gd2UgZG9uJ3QgbGVhdmUgYW55IGJlaGluZC5cbiAgICByZXR1cm47XG4gIH1cblxuICBzd2l0Y2ggKHJlbmRlclN0YXRlLnRhaWxNb2RlKSB7XG4gICAgY2FzZSAnaGlkZGVuJzpcbiAgICAgIHtcbiAgICAgICAgLy8gQW55IGluc2VydGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgdGFpbCBsaXN0IGFmdGVyIHRoaXMgcG9pbnRcbiAgICAgICAgLy8gc2hvdWxkIGJlIGludmlzaWJsZS4gSWYgdGhlcmUgYXJlIGFscmVhZHkgbW91bnRlZCBib3VuZGFyaWVzXG4gICAgICAgIC8vIGFueXRoaW5nIGJlZm9yZSB0aGVtIGFyZSBub3QgY29uc2lkZXJlZCBmb3IgY29sbGFwc2luZy5cbiAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgd2hvbGUgdGFpbCB0byBmaW5kIGlmXG4gICAgICAgIC8vIHRoZXJlIGFyZSBhbnkuXG4gICAgICAgIHZhciB0YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBsYXN0VGFpbE5vZGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlICh0YWlsTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxhc3RUYWlsTm9kZSA9IHRhaWxOb2RlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRhaWxOb2RlID0gdGFpbE5vZGUuc2libGluZztcbiAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIHNpbXBseSBnb2luZyB0byBkZWxldGUgYWxsIGluc2VydGlvbnMgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxhc3QgcmVuZGVyZWQgaXRlbS5cblxuXG4gICAgICAgIGlmIChsYXN0VGFpbE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBBbGwgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSB0YWlsIGFyZSBpbnNlcnRpb25zLlxuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIGxhc3RUYWlsTm9kZS5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSAnY29sbGFwc2VkJzpcbiAgICAgIHtcbiAgICAgICAgLy8gQW55IGluc2VydGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgdGFpbCBsaXN0IGFmdGVyIHRoaXMgcG9pbnRcbiAgICAgICAgLy8gc2hvdWxkIGJlIGludmlzaWJsZS4gSWYgdGhlcmUgYXJlIGFscmVhZHkgbW91bnRlZCBib3VuZGFyaWVzXG4gICAgICAgIC8vIGFueXRoaW5nIGJlZm9yZSB0aGVtIGFyZSBub3QgY29uc2lkZXJlZCBmb3IgY29sbGFwc2luZy5cbiAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgd2hvbGUgdGFpbCB0byBmaW5kIGlmXG4gICAgICAgIC8vIHRoZXJlIGFyZSBhbnkuXG4gICAgICAgIHZhciBfdGFpbE5vZGUgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICB2YXIgX2xhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKF90YWlsTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChfdGFpbE5vZGUuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBfbGFzdFRhaWxOb2RlID0gX3RhaWxOb2RlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90YWlsTm9kZSA9IF90YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKF9sYXN0VGFpbE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBBbGwgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSB0YWlsIGFyZSBpbnNlcnRpb25zLlxuICAgICAgICAgIGlmICghaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrICYmIHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFdlIHN1c3BlbmRlZCBkdXJpbmcgdGhlIGhlYWQuIFdlIHdhbnQgdG8gc2hvdyBhdCBsZWFzdCBvbmVcbiAgICAgICAgICAgIC8vIHJvdyBhdCB0aGUgdGFpbC4gU28gd2UnbGwga2VlcCBvbiBhbmQgY3V0IG9mZiB0aGUgcmVzdC5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZXRhY2ggdGhlIGluc2VydGlvbiBhZnRlciB0aGUgbGFzdCBub2RlIHRoYXQgd2FzIGFscmVhZHlcbiAgICAgICAgICAvLyBpbnNlcnRlZC5cbiAgICAgICAgICBfbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYnViYmxlUHJvcGVydGllcyhjb21wbGV0ZWRXb3JrKSB7XG4gIHZhciBkaWRCYWlsb3V0ID0gY29tcGxldGVkV29yay5hbHRlcm5hdGUgIT09IG51bGwgJiYgY29tcGxldGVkV29yay5hbHRlcm5hdGUuY2hpbGQgPT09IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG4gIHZhciBuZXdDaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG5cbiAgaWYgKCFkaWRCYWlsb3V0KSB7XG4gICAgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG4gICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIHByb2ZpbGluZyBtb2RlLCByZXNldENoaWxkRXhwaXJhdGlvblRpbWUgaXMgYWxzbyB1c2VkIHRvIHJlc2V0XG4gICAgICAvLyBwcm9maWxlciBkdXJhdGlvbnMuXG4gICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgICAgdmFyIHRyZWVCYXNlRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhjaGlsZC5sYW5lcywgY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gY2hpbGQuc3VidHJlZUZsYWdzO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gY2hpbGQuZmxhZ3M7IC8vIFdoZW4gYSBmaWJlciBpcyBjbG9uZWQsIGl0cyBhY3R1YWxEdXJhdGlvbiBpcyByZXNldCB0byAwLiBUaGlzIHZhbHVlIHdpbGxcbiAgICAgICAgLy8gb25seSBiZSB1cGRhdGVkIGlmIHdvcmsgaXMgZG9uZSBvbiB0aGUgZmliZXIgKGkuZS4gaXQgZG9lc24ndCBiYWlsb3V0KS5cbiAgICAgICAgLy8gV2hlbiB3b3JrIGlzIGRvbmUsIGl0IHNob3VsZCBidWJibGUgdG8gdGhlIHBhcmVudCdzIGFjdHVhbER1cmF0aW9uLiBJZlxuICAgICAgICAvLyB0aGUgZmliZXIgaGFzIG5vdCBiZWVuIGNsb25lZCB0aG91Z2gsIChtZWFuaW5nIG5vIHdvcmsgd2FzIGRvbmUpLCB0aGVuXG4gICAgICAgIC8vIHRoaXMgdmFsdWUgd2lsbCByZWZsZWN0IHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCB3b3JraW5nIG9uIGEgcHJldmlvdXNcbiAgICAgICAgLy8gcmVuZGVyLiBJbiB0aGF0IGNhc2UgaXQgc2hvdWxkIG5vdCBidWJibGUuIFdlIGRldGVybWluZSB3aGV0aGVyIGl0IHdhc1xuICAgICAgICAvLyBjbG9uZWQgYnkgY29tcGFyaW5nIHRoZSBjaGlsZCBwb2ludGVyLlxuXG4gICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB0cmVlQmFzZUR1cmF0aW9uICs9IGNoaWxkLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cblxuICAgICAgY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uO1xuICAgICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gdHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQubGFuZXMsIF9jaGlsZC5jaGlsZExhbmVzKSk7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQuc3VidHJlZUZsYWdzO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkLmZsYWdzOyAvLyBVcGRhdGUgdGhlIHJldHVybiBwb2ludGVyIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuIFRoaXMgaXMgYSBjb2RlXG4gICAgICAgIC8vIHNtZWxsIGJlY2F1c2UgaXQgYXNzdW1lcyB0aGUgY29tbWl0IHBoYXNlIGlzIG5ldmVyIGNvbmN1cnJlbnQgd2l0aFxuICAgICAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLiBXaWxsIGFkZHJlc3MgZHVyaW5nIHJlZmFjdG9yIHRvIGFsdGVybmF0ZSBtb2RlbC5cblxuICAgICAgICBfY2hpbGQucmV0dXJuID0gY29tcGxldGVkV29yaztcbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3MgfD0gc3VidHJlZUZsYWdzO1xuICB9IGVsc2Uge1xuICAgIC8vIEJ1YmJsZSB1cCB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lLlxuICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgICAgLy8gcHJvZmlsZXIgZHVyYXRpb25zLlxuICAgICAgdmFyIF90cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgdmFyIF9jaGlsZDIgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkMiAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZDIubGFuZXMsIF9jaGlsZDIuY2hpbGRMYW5lcykpOyAvLyBcIlN0YXRpY1wiIGZsYWdzIHNoYXJlIHRoZSBsaWZldGltZSBvZiB0aGUgZmliZXIvaG9vayB0aGV5IGJlbG9uZyB0byxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGJ1YmJsZSB0aG9zZSB1cCBldmVuIGR1cmluZyBhIGJhaWxvdXQuIEFsbCB0aGUgb3RoZXJcbiAgICAgICAgLy8gZmxhZ3MgaGF2ZSBhIGxpZmV0aW1lIG9ubHkgb2YgYSBzaW5nbGUgcmVuZGVyICsgY29tbWl0LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaWdub3JlIHRoZW0uXG5cbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDIuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDIuZmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBfdHJlZUJhc2VEdXJhdGlvbiArPSBfY2hpbGQyLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIF9jaGlsZDIgPSBfY2hpbGQyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IF90cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NoaWxkMyA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQzICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkMy5sYW5lcywgX2NoaWxkMy5jaGlsZExhbmVzKSk7IC8vIFwiU3RhdGljXCIgZmxhZ3Mgc2hhcmUgdGhlIGxpZmV0aW1lIG9mIHRoZSBmaWJlci9ob29rIHRoZXkgYmVsb25nIHRvLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgYnViYmxlIHRob3NlIHVwIGV2ZW4gZHVyaW5nIGEgYmFpbG91dC4gQWxsIHRoZSBvdGhlclxuICAgICAgICAvLyBmbGFncyBoYXZlIGEgbGlmZXRpbWUgb25seSBvZiBhIHNpbmdsZSByZW5kZXIgKyBjb21taXQsIHNvIHdlIHNob3VsZFxuICAgICAgICAvLyBpZ25vcmUgdGhlbS5cblxuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMy5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMy5mbGFncyAmIFN0YXRpY01hc2s7IC8vIFVwZGF0ZSB0aGUgcmV0dXJuIHBvaW50ZXIgc28gdGhlIHRyZWUgaXMgY29uc2lzdGVudC4gVGhpcyBpcyBhIGNvZGVcbiAgICAgICAgLy8gc21lbGwgYmVjYXVzZSBpdCBhc3N1bWVzIHRoZSBjb21taXQgcGhhc2UgaXMgbmV2ZXIgY29uY3VycmVudCB3aXRoXG4gICAgICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuIFdpbGwgYWRkcmVzcyBkdXJpbmcgcmVmYWN0b3IgdG8gYWx0ZXJuYXRlIG1vZGVsLlxuXG4gICAgICAgIF9jaGlsZDMucmV0dXJuID0gY29tcGxldGVkV29yaztcbiAgICAgICAgX2NoaWxkMyA9IF9jaGlsZDMuc2libGluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLnN1YnRyZWVGbGFncyB8PSBzdWJ0cmVlRmxhZ3M7XG4gIH1cblxuICBjb21wbGV0ZWRXb3JrLmNoaWxkTGFuZXMgPSBuZXdDaGlsZExhbmVzO1xuICByZXR1cm4gZGlkQmFpbG91dDtcbn1cblxuZnVuY3Rpb24gY29tcGxldGVEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFN0YXRlKSB7XG4gIGlmIChoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkgJiYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlciB8IEluY29tcGxldGUgfCBTaG91bGRDYXB0dXJlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB3YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAobmV4dFN0YXRlICE9PSBudWxsICYmIG5leHRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgLy8gV2UgbWlnaHQgYmUgaW5zaWRlIGEgaHlkcmF0aW9uIHN0YXRlIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHBpY2tpbmcgdXAgdGhpc1xuICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LCBhbmQgYWxzbyBhZnRlciB3ZSd2ZSByZWVudGVyZWQgaXQgZm9yIGZ1cnRoZXIgaHlkcmF0aW9uLlxuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBpZiAoIXdhc0h5ZHJhdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudCB3YXMgY29tcGxldGVkIHdpdGhvdXQgYSBoeWRyYXRlZCBub2RlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHByZXBhcmVUb0h5ZHJhdGVIb3N0U3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAge1xuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIHZhciBpc1RpbWVkT3V0U3VzcGVuc2UgPSBuZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoaXNUaW1lZE91dFN1c3BlbnNlKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAocHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgcmVlbnRlcmVkIHRoaXMgYm91bmRhcnkgdG8gaHlkcmF0ZSBpdC4gSWYgc28sIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGh5ZHJhdGlvblxuICAgICAgLy8gc3RhdGUgc2luY2Ugd2UncmUgbm93IGV4aXRpbmcgb3V0IG9mIGl0LiBwb3BIeWRyYXRpb25TdGF0ZSBkb2Vzbid0IGRvIHRoYXQgZm9yIHVzLlxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuXG4gICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBib3VuZGFyeSBkaWQgbm90IHN1c3BlbmQgc28gaXQncyBub3cgaHlkcmF0ZWQgYW5kIHVuc3VzcGVuZGVkLlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQsIHdlIG5lZWQgdG8gc2NoZWR1bGUgYW4gZWZmZWN0IHRvIG1hcmsgdGhpcyBib3VuZGFyeVxuICAgICAgLy8gYXMgaGF2aW5nIGh5ZHJhdGVkIHNvIGV2ZW50cyBrbm93IHRoYXQgdGhleSdyZSBmcmVlIHRvIGJlIGludm9rZWQuXG4gICAgICAvLyBJdCdzIGFsc28gYSBzaWduYWwgdG8gcmVwbGF5IGV2ZW50cyBhbmQgdGhlIHN1c3BlbnNlIGNhbGxiYWNrLlxuICAgICAgLy8gSWYgc29tZXRoaW5nIHN1c3BlbmRlZCwgc2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCByZXRyeSBsaXN0ZW5lcnMuXG4gICAgICAvLyBTbyB3ZSBtaWdodCBhcyB3ZWxsIGFsd2F5cyBtYXJrIHRoaXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICB2YXIgX2lzVGltZWRPdXRTdXNwZW5zZSA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChfaXNUaW1lZE91dFN1c3BlbnNlKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKF9wcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IF9wcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhpcyB0cmVlLiBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLFxuICAgIC8vIHRoZXJlIG1heSBoYXZlIGJlZW4gcmVjb3ZlcmFibGUgZXJyb3JzIGR1cmluZyBmaXJzdCBoeWRyYXRpb25cbiAgICAvLyBhdHRlbXB0LiBJZiBzbywgYWRkIHRoZW0gdG8gYSBxdWV1ZSBzbyB3ZSBjYW4gbG9nIHRoZW0gaW4gdGhlXG4gICAgLy8gY29tbWl0IHBoYXNlLlxuICAgIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCk7IC8vIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgU3VzcGVuc2UgcGF0aFxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGxldGVXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuXG4gIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgY2FzZSBNb2RlOlxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgZmliZXJSb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG5cbiAgICAgICAgaWYgKGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgIGZpYmVyUm9vdC5jb250ZXh0ID0gZmliZXJSb290LnBlbmRpbmdDb250ZXh0O1xuICAgICAgICAgIGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LmNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHBvcCBzbyB0aGF0IHdlIGNhbiBkZWxldGUgYW55IHJlbWFpbmluZyBjaGlsZHJlblxuICAgICAgICAgIC8vIHRoYXQgd2VyZW4ndCBoeWRyYXRlZC5cbiAgICAgICAgICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAod2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCB0aGVuIHdlJ2xsIG5lZWQgdG8gc2NoZWR1bGUgYW4gdXBkYXRlIGZvclxuICAgICAgICAgICAgLy8gdGhlIGNvbW1pdCBzaWRlLWVmZmVjdHMgb24gdGhlIHJvb3QuXG4gICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjbGllbnQgcm9vdFxuICAgICAgICAgICAgICAhcHJldlN0YXRlLmlzRGVoeWRyYXRlZCB8fCAvLyBDaGVjayBpZiB3ZSByZXZlcnRlZCB0byBjbGllbnQgcmVuZGVyaW5nIChlLmcuIGR1ZSB0byBhbiBlcnJvcilcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9yY2VDbGllbnRSZW5kZXIpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGNsZWFyIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzdGFydCBvZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbW1pdC4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIG9mIFJlYWN0IHJlbmRlcmluZyBpbnRvIGFcbiAgICAgICAgICAgICAgICAvLyBjb250YWluZXIgd2l0aCBwcmV2aW91cyBjaGlsZHJlbi4gSXQncyBhbHNvIHNhZmUgdG8gZG8gZm9yXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlcyB0b28sIGJlY2F1c2UgY3VycmVudC5jaGlsZCB3b3VsZCBvbmx5IGJlIG51bGwgaWYgdGhlXG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgcmVuZGVyIHdhcyBudWxsIChzbyB0aGUgY29udGFpbmVyIHdvdWxkIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBiZSBlbXB0eSkuXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7IC8vIElmIHRoaXMgd2FzIGEgZm9yY2VkIGNsaWVudCByZW5kZXIsIHRoZXJlIG1heSBoYXZlIGJlZW5cbiAgICAgICAgICAgICAgICAvLyByZWNvdmVyYWJsZSBlcnJvcnMgZHVyaW5nIGZpcnN0IGh5ZHJhdGlvbiBhdHRlbXB0LiBJZiBzbywgYWRkXG4gICAgICAgICAgICAgICAgLy8gdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGUgY29tbWl0IHBoYXNlLlxuXG4gICAgICAgICAgICAgICAgdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdXBkYXRlSG9zdENvbXBvbmVudCQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50LnJlZiAhPT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICAgICAgICBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5ld1Byb3BzKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfSAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhYm9ydCB3b3JrLlxuXG5cbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBhZGQgdGhlbSB0b3AtPmRvd24gb3JcbiAgICAgICAgICAvLyBib3R0b20tPnVwLiBUb3AtPmRvd24gaXMgZmFzdGVyIGluIElFMTEuXG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGFuZCBjcmVhdGVJbnN0YW5jZSBzdGVwIGludG8gdGhlIGJlZ2luUGhhc2VcbiAgICAgICAgICAgIC8vIHRvIGNvbnNvbGlkYXRlLlxuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KSkge1xuICAgICAgICAgICAgICAvLyBJZiBjaGFuZ2VzIHRvIHRoZSBoeWRyYXRlZCBub2RlIG5lZWQgdG8gYmUgYXBwbGllZCBhdCB0aGVcbiAgICAgICAgICAgICAgLy8gY29tbWl0LXBoYXNlIHdlIG1hcmsgdGhpcyBhcyBzdWNoLlxuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UodHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBhcHBlbmRBbGxDaGlsZHJlbihpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gQ2VydGFpbiByZW5kZXJlcnMgcmVxdWlyZSBjb21taXQtdGltZSBlZmZlY3RzIGZvciBpbml0aWFsIG1vdW50LlxuICAgICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBzdXBwb3J0cyBhdXRvLWZvY3VzIGZvciBjZXJ0YWluIGVsZW1lbnRzKS5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzdWNoIHJlbmRlcmVycyBnZXQgc2NoZWR1bGVkIGZvciBsYXRlciB3b3JrLlxuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgbmV3VGV4dCA9IG5ld1Byb3BzO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7IC8vIElmIHdlIGhhdmUgYW4gYWx0ZXJuYXRlLCB0aGF0IG1lYW5zIHRoaXMgaXMgYW4gdXBkYXRlIGFuZCB3ZSBuZWVkXG4gICAgICAgICAgLy8gdG8gc2NoZWR1bGUgYSBzaWRlLWVmZmVjdCB0byBkbyB0aGUgdXBkYXRlcy5cblxuICAgICAgICAgIHVwZGF0ZUhvc3RUZXh0JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV3VGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3Jvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgICB2YXIgX2N1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMiA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQyKSB7XG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjcmVhdGVUZXh0SW5zdGFuY2UobmV3VGV4dCwgX3Jvb3RDb250YWluZXJJbnN0YW5jZSwgX2N1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlOyAvLyBTcGVjaWFsIHBhdGggZm9yIGRlaHlkcmF0ZWQgYm91bmRhcmllcy4gV2UgbWF5IGV2ZW50dWFsbHkgbW92ZSB0aGlzXG4gICAgICAgIC8vIHRvIGl0cyBvd24gZmliZXIgdHlwZSBzbyB0aGF0IHdlIGNhbiBhZGQgb3RoZXIga2luZHMgb2YgaHlkcmF0aW9uXG4gICAgICAgIC8vIGJvdW5kYXJpZXMgdGhhdCBhcmVuJ3QgYXNzb2NpYXRlZCB3aXRoIGEgU3VzcGVuc2UgdHJlZS4gSW4gYW50aWNpcGF0aW9uXG4gICAgICAgIC8vIG9mIHN1Y2ggYSByZWZhY3RvciwgYWxsIHRoZSBoeWRyYXRpb24gbG9naWMgaXMgY29udGFpbmVkIGluXG4gICAgICAgIC8vIHRoaXMgYnJhbmNoLlxuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBmYWxsdGhyb3VnaFRvTm9ybWFsU3VzcGVuc2VQYXRoID0gY29tcGxldGVEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFN0YXRlKTtcblxuICAgICAgICAgIGlmICghZmFsbHRocm91Z2hUb05vcm1hbFN1c3BlbnNlUGF0aCkge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UuIFRoZXJlIHdlcmUgcmVtYWluaW5nIHVuaHlkcmF0ZWQgbm9kZXMuIFdlIHRyZWF0XG4gICAgICAgICAgICAgIC8vIHRoaXMgYXMgYSBtaXNtYXRjaC4gUmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuXG4gICAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIERpZCBub3QgZmluaXNoIGh5ZHJhdGluZywgZWl0aGVyIGJlY2F1c2UgdGhpcyBpcyB0aGUgaW5pdGlhbFxuICAgICAgICAgICAgICAvLyByZW5kZXIgb3IgYmVjYXVzZSBzb21ldGhpbmcgc3VzcGVuZGVkLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIENvbnRpbnVlIHdpdGggdGhlIG5vcm1hbCBTdXNwZW5zZSBwYXRoLlxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBTb21ldGhpbmcgc3VzcGVuZGVkLiBSZS1yZW5kZXIgd2l0aCB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lczsgLy8gRG8gbm90IHJlc2V0IHRoZSBlZmZlY3QgbGlzdC5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZEaWRUaW1lb3V0ID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgIC8vIGEgcGFzc2l2ZSBlZmZlY3QsIHdoaWNoIGlzIHdoZW4gd2UgcHJvY2VzcyB0aGUgdHJhbnNpdGlvbnNcblxuXG4gICAgICAgIGlmIChuZXh0RGlkVGltZW91dCAhPT0gcHJldkRpZFRpbWVvdXQpIHtcbiAgICAgICAgICAvLyBhbiBlZmZlY3QgdG8gdG9nZ2xlIHRoZSBzdWJ0cmVlJ3MgdmlzaWJpbGl0eS4gV2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIGZhbGxiYWNrIC0+IHByaW1hcnksIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgc2NoZWR1bGVzIHRoaXMgZWZmZWN0XG4gICAgICAgICAgLy8gYXMgcGFydCBvZiBpdHMgbm9ybWFsIGNvbXBsZXRlIHBoYXNlLiBCdXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIHByaW1hcnkgLT4gZmFsbGJhY2ssIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgZG9lcyBub3QgaGF2ZSBhIGNvbXBsZXRlXG4gICAgICAgICAgLy8gcGhhc2UuIFNvIHdlIG5lZWQgdG8gc2NoZWR1bGUgaXRzIGVmZmVjdCBoZXJlLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2UgYWxzbyB1c2UgdGhpcyBmbGFnIHRvIGNvbm5lY3QvZGlzY29ubmVjdCB0aGUgZWZmZWN0cywgYnV0IHRoZSBzYW1lXG4gICAgICAgICAgLy8gbG9naWMgYXBwbGllczogd2hlbiByZS1jb25uZWN0aW5nLCB0aGUgT2Zmc2NyZWVuIGZpYmVyJ3MgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZSB3aWxsIGhhbmRsZSBzY2hlZHVsaW5nIHRoZSBlZmZlY3QuIEl0J3Mgb25seSB3aGVuIHRoZSBmYWxsYmFja1xuICAgICAgICAgIC8vIGlzIGFjdGl2ZSB0aGF0IHdlIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC5cblxuXG4gICAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0KSB7XG4gICAgICAgICAgICB2YXIgX29mZnNjcmVlbkZpYmVyMiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgX29mZnNjcmVlbkZpYmVyMi5mbGFncyB8PSBWaXNpYmlsaXR5OyAvLyBUT0RPOiBUaGlzIHdpbGwgc3RpbGwgc3VzcGVuZCBhIHN5bmNocm9ub3VzIHRyZWUgaWYgYW55dGhpbmdcbiAgICAgICAgICAgIC8vIGluIHRoZSBjb25jdXJyZW50IHRyZWUgYWxyZWFkeSBzdXNwZW5kZWQgZHVyaW5nIHRoaXMgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGtub3duIGJ1Zy5cblxuICAgICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGJhY2sgdG8gdGhyb3dFeGNlcHRpb24gYmVjYXVzZSB0aGlzIGlzIHRvbyBsYXRlXG4gICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBsYXJnZSB0cmVlIHdoaWNoIGlzIGNvbW1vbiBmb3IgaW5pdGlhbCBsb2Fkcy4gV2VcbiAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgcmVzdGFydCBhIHJlbmRlciBvciBub3QgdW50aWwgd2UgZ2V0XG4gICAgICAgICAgICAgIC8vIHRoaXMgbWFya2VyLCBhbmQgdGhpcyBpcyB0b28gbGF0ZS5cbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyByZW5kZXIgYWxyZWFkeSBoYWQgYSBwaW5nIG9yIGxvd2VyIHByaSB1cGRhdGVzLFxuICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2VcbiAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gaW1tZWRpYXRlbHkgcmVzdGFydCBmcm9tIHdpdGhpbiB0aHJvd0V4Y2VwdGlvbi5cbiAgICAgICAgICAgICAgdmFyIGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCA9IGN1cnJlbnQgPT09IG51bGwgJiYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgIT09IHRydWUgfHwgIWVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2spO1xuXG4gICAgICAgICAgICAgIGlmIChoYXNJbnZpc2libGVDaGlsZENvbnRleHQgfHwgaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGluIGFuIGludmlzaWJsZSB0cmVlIG9yIGEgbmV3IHJlbmRlciwgdGhlbiBzaG93aW5nXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIGZvciBsb25nZXIgaWYgcG9zc2libGUuXG4gICAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdha2VhYmxlcyA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIGEgcmV0cnkgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UuXG4gICAgICAgICAgLy8gVE9ETzogTW92ZSB0byBwYXNzaXZlIHBoYXNlXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICBwcmVwYXJlUG9ydGFsTW91bnQod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgfVxuXG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXJcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gU2FtZSBhcyBjbGFzcyBjb21wb25lbnQgY2FzZS4gSSBwdXQgaXQgZG93biBoZXJlIHNvIHRoYXQgdGhlIHRhZ3MgYXJlXG4gICAgICAgIC8vIHNlcXVlbnRpYWwgdG8gZW5zdXJlIHRoaXMgc3dpdGNoIGlzIGNvbXBpbGVkIHRvIGEganVtcCB0YWJsZS5cbiAgICAgICAgdmFyIF9Db21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihfQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbiB0aGUgZGVmYXVsdCwgXCJpbmRlcGVuZGVudFwiIG1vZGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG4gICAgICAgIHZhciByZW5kZXJlZFRhaWwgPSByZW5kZXJTdGF0ZS5yZW5kZXJpbmc7XG5cbiAgICAgICAgaWYgKHJlbmRlcmVkVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGp1c3QgcmVuZGVyZWQgdGhlIGhlYWQuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFzcy4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGFueXRoaW5nIGlzIHN0aWxsXG4gICAgICAgICAgICAvLyBzdXNwZW5kZWQgaW4gdGhlIHJlbmRlcmVkIHNldC5cbiAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdFxuICAgICAgICAgICAgLy8gZGlkbid0LiBUaGVuIHdlIG5lZWQgdG8gZG8gYSBzZWNvbmQgcGFzcyB0aGF0IGZvcmNlcyBldmVyeXRoaW5nXG4gICAgICAgICAgICAvLyB0byBrZWVwIHNob3dpbmcgdGhlaXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3JcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpbiB0aGUgcHJldmlvdXMgY29tbWl0dGVkIHBhc3Mgc3VzcGVuZGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSBzbyB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC5cbiAgICAgICAgICAgIHZhciBjYW5ub3RCZVN1c3BlbmRlZCA9IHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpICYmIChjdXJyZW50ID09PSBudWxsIHx8IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIWNhbm5vdEJlU3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzXG4gICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzZWNvbmQgcGFzcy4gSW4gdGhhdCBjYXNlIG5vdGhpbmcgd2lsbCBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyB0aGVuYWJsZXMuIEluc3RlYWQsIHdlJ2xsIHRyYW5zZmVyIGl0cyB0aGVuYWJsZXMgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBTdXNwZW5zZUxpc3Qgc28gdGhhdCBpdCBjYW4gcmV0cnkgaWYgdGhleSByZXNvbHZlLlxuICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgb2YgdGhlc2UgaW4gdGhlIGxpc3QgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgICAgICAgICAgICAvLyBnb2luZyB0byB3YWl0IGZvciBhbGwgb2YgdGhlbSBhbnl3YXksIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlclxuICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggb25lcyBnZXRzIHRvIHBpbmcuIEluIHRoZW9yeSB3ZSBjb3VsZCBnZXQgY2xldmVyIGFuZCBrZWVwXG4gICAgICAgICAgICAgICAgICAvLyB0cmFjayBvZiBob3cgbWFueSBkZXBlbmRlbmNpZXMgcmVtYWluIGJ1dCBpdCBnZXRzIHRyaWNreSBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWVhbnRpbWUsIHdlIGNhbiBhZGQvcmVtb3ZlL2NoYW5nZSBpdGVtcyBhbmQgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmFpbCBvdXQgb2YgdGhlIGxvb3AgYmVmb3JlIGZpbmRpbmcgYW55IGJ1dCB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IG1hdHRlciBzaW5jZSB0aGF0IG1lYW5zIHRoYXQgdGhlIG90aGVyIGJvdW5kYXJpZXMgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd2UgZGlkIGZpbmQgYWxyZWFkeSBoYXMgdGhlaXIgbGlzdGVuZXJzIGF0dGFjaGVkLlxuXG4gICAgICAgICAgICAgICAgICB2YXIgbmV3VGhlbmFibGVzID0gc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgICAgICB9IC8vIFJlcmVuZGVyIHRoZSB3aG9sZSBsaXN0LCBidXQgdGhpcyB0aW1lLCB3ZSdsbCBmb3JjZSBmYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJlZm9yZSBkb2luZyB0aGUgc2Vjb25kIHBhc3Mgc2luY2UgdGhhdCdzIG5vdyBpbnZhbGlkLlxuICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGNoaWxkIGZpYmVycyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZS5cblxuXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICAgICAgICAgICAgcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOyAvLyBTZXQgdXAgdGhlIFN1c3BlbnNlIENvbnRleHQgdG8gZm9yY2Ugc3VzcGVuc2UgYW5kIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAvLyByZXJlbmRlciB0aGUgY2hpbGRyZW4uXG5cbiAgICAgICAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spKTsgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcm93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwgJiYgbm93KCkgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGJ1dCB3ZSBzdGlsbCBoYXZlIHJvd3NcbiAgICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgdGFpbC4gV2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXIgYXR0ZW1wdHMgdG8gcmVuZGVyXG4gICAgICAgICAgICAgIC8vIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGUgdGFpbC5cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgcmVuZGVyZWQgcm93IHRvIHRoZSBjaGlsZCBsaXN0LlxuICAgICAgICAgIGlmICghZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIHZhciBfc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJlbmRlcmVkVGFpbCk7XG5cbiAgICAgICAgICAgIGlmIChfc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTsgLy8gRW5zdXJlIHdlIHRyYW5zZmVyIHRoZSB1cGRhdGUgcXVldWUgdG8gdGhlIHBhcmVudCBzbyB0aGF0IGl0IGRvZXNuJ3RcbiAgICAgICAgICAgICAgLy8gZ2V0IGxvc3QgaWYgdGhpcyByb3cgZW5kcyB1cCBkcm9wcGVkIGR1cmluZyBhIHNlY29uZCBwYXNzLlxuXG4gICAgICAgICAgICAgIHZhciBfbmV3VGhlbmFibGVzID0gX3N1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICBpZiAoX25ld1RoZW5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gX25ld1RoZW5hYmxlcztcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIHRydWUpOyAvLyBUaGlzIG1pZ2h0IGhhdmUgYmVlbiBtb2RpZmllZC5cblxuICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCA9PT0gbnVsbCAmJiByZW5kZXJTdGF0ZS50YWlsTW9kZSA9PT0gJ2hpZGRlbicgJiYgIXJlbmRlcmVkVGFpbC5hbHRlcm5hdGUgJiYgIWdldElzSHlkcmF0aW5nKCkgLy8gV2UgZG9uJ3QgY3V0IGl0IGlmIHdlJ3JlIGh5ZHJhdGluZy5cbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAvLyBXZSdyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCAvLyBUaGUgdGltZSBpdCB0b29rIHRvIHJlbmRlciBsYXN0IHJvdyBpcyBncmVhdGVyIHRoYW4gdGhlIHJlbWFpbmluZ1xuICAgICAgICAgICAgLy8gdGltZSB3ZSBoYXZlIHRvIHJlbmRlci4gU28gcmVuZGVyaW5nIG9uZSBtb3JlIHJvdyB3b3VsZCBsaWtlbHlcbiAgICAgICAgICAgIC8vIGV4Y2VlZCBpdC5cbiAgICAgICAgICAgIG5vdygpICogMiAtIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSAmJiByZW5kZXJMYW5lcyAhPT0gT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdyBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBhbmQgd2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXJcbiAgICAgICAgICAgICAgLy8gYXR0ZW1wdHMgdG8gcmVuZGVyIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGlzIGlzIHVzdWFsbHkgZmFzdGVyLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcykge1xuICAgICAgICAgICAgLy8gVGhlIGVmZmVjdCBsaXN0IG9mIHRoZSBiYWNrd2FyZHMgdGFpbCB3aWxsIGhhdmUgYmVlbiBhZGRlZFxuICAgICAgICAgICAgLy8gdG8gdGhlIGVuZC4gVGhpcyBicmVha3MgdGhlIGd1YXJhbnRlZSB0aGF0IGxpZmUtY3ljbGVzIGZpcmUgaW5cbiAgICAgICAgICAgIC8vIHNpYmxpbmcgb3JkZXIgYnV0IHRoYXQgaXNuJ3QgYSBzdHJvbmcgZ3VhcmFudGVlIHByb21pc2VkIGJ5IFJlYWN0LlxuICAgICAgICAgICAgLy8gRXNwZWNpYWxseSBzaW5jZSB0aGVzZSBtaWdodCBhbHNvIGp1c3QgcG9wIGluIGR1cmluZyBmdXR1cmUgY29tbWl0cy5cbiAgICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICAgICAgICAgICAgcmVuZGVyZWRUYWlsLnNpYmxpbmcgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNTaWJsaW5nID0gcmVuZGVyU3RhdGUubGFzdDtcblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpYmxpbmcuc2libGluZyA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0ID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSB0YWlsIHJvd3MgdG8gcmVuZGVyLlxuICAgICAgICAgIC8vIFBvcCBhIHJvdy5cbiAgICAgICAgICB2YXIgbmV4dCA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbmV4dDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbmV4dC5zaWJsaW5nO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IG5vdygpO1xuICAgICAgICAgIG5leHQuc2libGluZyA9IG51bGw7IC8vIFJlc3RvcmUgdGhlIGNvbnRleHQuXG4gICAgICAgICAgLy8gVE9ETzogV2UgY2FuIHByb2JhYmx5IGp1c3QgYXZvaWQgcG9wcGluZyBpdCBpbnN0ZWFkIGFuZCBvbmx5XG4gICAgICAgICAgLy8gc2V0dGluZyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBnbyBmcm9tIG5vdCBzdXNwZW5kZWQgdG8gc3VzcGVuZGVkLlxuXG4gICAgICAgICAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcblxuICAgICAgICAgIGlmIChkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gRG8gYSBwYXNzIG92ZXIgdGhlIG5leHQgcm93LlxuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBfbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgdmFyIG5leHRJc0hpZGRlbiA9IF9uZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX3ByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgcHJldklzSGlkZGVuID0gX3ByZXZTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChwcmV2SXNIaWRkZW4gIT09IG5leHRJc0hpZGRlbiAmJiAoIC8vIExlZ2FjeUhpZGRlbiBkb2Vzbid0IGRvIGFueSBoaWRpbmcg4oCUIGl0IG9ubHkgcHJlLXJlbmRlcnMuXG4gICAgICAgICAgIWVuYWJsZUxlZ2FjeUhpZGRlbiApKSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBWaXNpYmlsaXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmV4dElzSGlkZGVuIHx8ICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBmb3IgaGlkZGVuIGNoaWxkcmVuIHVubGVzcyB3ZSdyZSByZW5kZXJpbmdcbiAgICAgICAgICAvLyBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuXG4gICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoc3VidHJlZVJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkge1xuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGFuIGluc2VydGlvbiBvciB1cGRhdGUgaW4gdGhlIGhpZGRlbiBzdWJ0cmVlLlxuICAgICAgICAgICAgICAvLyBJZiBzbywgd2UgbmVlZCB0byBoaWRlIHRob3NlIG5vZGVzIGluIHRoZSBjb21taXQgcGhhc2UsIHNvXG4gICAgICAgICAgICAgIC8vIHNjaGVkdWxlIGEgdmlzaWJpbGl0eSBlZmZlY3QuXG4gICAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzICYgKFBsYWNlbWVudCB8IFVwZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBWaXNpYmlsaXR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBcIiArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIHVud2luZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuICBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcbiAgICAgICAgdmFyIF9mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmICgoX2ZsYWdzICYgU2hvdWxkQ2FwdHVyZSkgIT09IE5vRmxhZ3MgJiYgKF9mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gVGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyByZW5kZXIgdGhhdCB3YXNuJ3QgY2FwdHVyZWQgYnkgYSBzdXNwZW5zZVxuICAgICAgICAgIC8vIGJvdW5kYXJ5LiBEbyBhIHNlY29uZCBwYXNzIG9uIHRoZSByb290IHRvIHVubW91bnQgdGhlIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfSAvLyBXZSB1bndvdW5kIHRvIHRoZSByb290IHdpdGhvdXQgY29tcGxldGluZyBpdC4gRXhpdC5cblxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBUT0RPOiBwb3BIeWRyYXRpb25TdGF0ZVxuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsICYmIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhyZXcgaW4gbmV3bHkgbW91bnRlZCBkZWh5ZHJhdGVkIGNvbXBvbmVudC4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gJyArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9mbGFnczIgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoX2ZsYWdzMiAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFnczIgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7IC8vIENhcHR1cmVkIGEgc3VzcGVuc2UgZWZmZWN0LiBSZS1yZW5kZXIgdGhlIGJvdW5kYXJ5LlxuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpOyAvLyBTdXNwZW5zZUxpc3QgZG9lc24ndCBhY3R1YWxseSBjYXRjaCBhbnl0aGluZy4gSXQgc2hvdWxkJ3ZlIGJlZW5cbiAgICAgICAgLy8gY2F1Z2h0IGJ5IGEgbmVzdGVkIGJvdW5kYXJ5LiBJZiBub3QsIGl0IHNob3VsZCBidWJibGUgdGhyb3VnaC5cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCBpbnRlcnJ1cHRlZFdvcmssIHJlbmRlckxhbmVzKSB7XG4gIC8vIE5vdGU6IFRoaXMgaW50ZW50aW9uYWxseSBkb2Vzbid0IGNoZWNrIGlmIHdlJ3JlIGh5ZHJhdGluZyBiZWNhdXNlIGNvbXBhcmluZ1xuICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS5cbiAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seVxuICAvLyBmb3IgaHlkcmF0aW9uLlxuICBwb3BUcmVlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuXG4gIHN3aXRjaCAoaW50ZXJydXB0ZWRXb3JrLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IGludGVycnVwdGVkV29yay50eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuXG4gICAgICAgIGlmIChjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcG9wQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IGludGVycnVwdGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgY29udGV4dCA9IGludGVycnVwdGVkV29yay50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBwb3BSZW5kZXJMYW5lcyhpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbnVsbDtcblxue1xuICBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG5ldyBTZXQoKTtcbn0gLy8gVXNlZCBkdXJpbmcgdGhlIGNvbW1pdCBwaGFzZSB0byB0cmFjayB0aGUgc3RhdGUgb2YgdGhlIE9mZnNjcmVlbiBjb21wb25lbnQgc3RhY2suXG4vLyBBbGxvd3MgdXMgdG8gYXZvaWQgdHJhdmVyc2luZyB0aGUgcmV0dXJuIHBhdGggdG8gZmluZCB0aGUgbmVhcmVzdCBPZmZzY3JlZW4gYW5jZXN0b3IuXG4vLyBPbmx5IHVzZWQgd2hlbiBlbmFibGVTdXNwZW5zZUxheW91dEVmZmVjdFNlbWFudGljcyBpcyBlbmFibGVkLlxuXG5cbnZhciBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBmYWxzZTtcbnZhciBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gZmFsc2U7XG52YXIgUG9zc2libHlXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgPyBXZWFrU2V0IDogU2V0O1xudmFyIG5leHRFZmZlY3QgPSBudWxsOyAvLyBVc2VkIGZvciBQcm9maWxpbmcgYnVpbGRzIHRvIHRyYWNrIHVwZGF0ZXJzLlxuXG52YXIgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbnZhciBpblByb2dyZXNzUm9vdCA9IG51bGw7XG5mdW5jdGlvbiByZXBvcnRVbmNhdWdodEVycm9ySW5ERVYoZXJyb3IpIHtcbiAgLy8gV3JhcHBpbmcgZWFjaCBzbWFsbCBwYXJ0IG9mIHRoZSBjb21taXQgcGhhc2UgaW50byBhIGd1YXJkZWRcbiAgLy8gY2FsbGJhY2sgaXMgYSBiaXQgdG9vIHNsb3cgKGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIxNjY2KS5cbiAgLy8gQnV0IHdlIHJlbHkgb24gaXQgdG8gc3VyZmFjZSBlcnJvcnMgdG8gREVWIHRvb2xzIGxpa2Ugb3ZlcmxheXNcbiAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjE3MTIpLlxuICAvLyBBcyBhIGNvbXByb21pc2UsIHJldGhyb3cgb25seSBjYXVnaHQgZXJyb3JzIGluIGEgZ3VhcmQuXG4gIHtcbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG4gICAgY2xlYXJDYXVnaHRFcnJvcigpO1xuICB9XG59XG5cbnZhciBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIgPSBmdW5jdGlvbiAoY3VycmVudCwgaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICggY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICB0cnkge1xuICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gIH1cbn07IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdHJ5IHtcbiAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCwgY3VycmVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IHVubW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKSB7XG4gIHRyeSB7XG4gICAgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyKGN1cnJlbnQsIGluc3RhbmNlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudERpZE1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKSB7XG4gIHRyeSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5QXR0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdHJ5IHtcbiAgICBjb21taXRBdHRhY2hSZWYoY3VycmVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHZhciByZWYgPSBjdXJyZW50LnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciByZXRWYWw7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVuYWJsZVByb2ZpbGVyQ29tbWl0SG9va3MgJiYgY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgcmV0VmFsID0gcmVmKG51bGwpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0VmFsID0gcmVmKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXRWYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBhIGNhbGxiYWNrIHJlZiBpbiAlcy4gJyArICdBIGNhbGxiYWNrIHJlZiBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSkge1xuICB0cnkge1xuICAgIGRlc3Ryb3koKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn1cblxudmFyIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG52YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmlyc3RDaGlsZCkge1xuICBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBwcmVwYXJlRm9yQ29tbWl0KHJvb3QuY29udGFpbmVySW5mbyk7XG4gIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfYmVnaW4oKTsgLy8gV2Ugbm8gbG9uZ2VyIG5lZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSBpbnN0YW5jZSBmaWJlclxuXG4gIHZhciBzaG91bGRGaXJlID0gc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyO1xuICBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbiAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcbiAgcmV0dXJuIHNob3VsZEZpcmU7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBUaGlzIHBoYXNlIGlzIG9ubHkgdXNlZCBmb3IgYmVmb3JlQWN0aXZlSW5zdGFuY2VCbHVyLlxuXG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIEJlZm9yZU11dGF0aW9uTWFzaykgIT09IE5vRmxhZ3MgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaykge1xuICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcblxuICBpZiAoKGZsYWdzICYgU25hcHNob3QpICE9PSBOb0ZsYWdzKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG5cbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc25hcHNob3QgPSBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gcHJldlByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgcHJldlByb3BzKSwgcHJldlN0YXRlKTtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgZGlkV2FyblNldCA9IGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlO1xuXG4gICAgICAgICAgICAgIGlmIChzbmFwc2hvdCA9PT0gdW5kZWZpbmVkICYmICFkaWRXYXJuU2V0LmhhcyhmaW5pc2hlZFdvcmsudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBkaWRXYXJuU2V0LmFkZChmaW5pc2hlZFdvcmsudHlwZSk7XG5cbiAgICAgICAgICAgICAgICBlcnJvcignJXMuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKTogQSBzbmFwc2hvdCB2YWx1ZSAob3IgbnVsbCkgJyArICdtdXN0IGJlIHJldHVybmVkLiBZb3UgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IHNuYXBzaG90O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBjbGVhckNvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgdGhlc2UgY29tcG9uZW50IHR5cGVzXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyAnICsgJ2xpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoZmxhZ3MsIGZpbmlzaGVkV29yaywgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBmbGFncykgPT09IGZsYWdzKSB7XG4gICAgICAgIC8vIFVubW91bnRcbiAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcbiAgICAgICAgZWZmZWN0LmRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZmluaXNoZWRXb3JrLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KGZsYWdzLCBmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG5cbiAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKChlZmZlY3QudGFnICYgZmxhZ3MpID09PSBmbGFncykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBNb3VudFxuXG5cbiAgICAgICAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdCh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlZmZlY3QuZGVzdHJveSA9IGNyZWF0ZSgpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG5cbiAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgaG9va05hbWUgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmICgoZWZmZWN0LnRhZyAmIExheW91dCkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVmZmVjdC50YWcgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VFZmZlY3QnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYWRkZW5kdW0gPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmIChkZXN0cm95ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVzdHJveS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJ1xcblxcbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlICcgKyBob29rTmFtZSArICcoYXN5bmMgKCkgPT4gLi4uKSBvciByZXR1cm5lZCBhIFByb21pc2UuICcgKyAnSW5zdGVhZCwgd3JpdGUgdGhlIGFzeW5jIGZ1bmN0aW9uIGluc2lkZSB5b3VyIGVmZmVjdCAnICsgJ2FuZCBjYWxsIGl0IGltbWVkaWF0ZWx5OlxcblxcbicgKyBob29rTmFtZSArICcoKCkgPT4ge1xcbicgKyAnICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XFxuJyArICcgICAgLy8gWW91IGNhbiBhd2FpdCBoZXJlXFxuJyArICcgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNeUFQSS5nZXREYXRhKHNvbWVJZCk7XFxuJyArICcgICAgLy8gLi4uXFxuJyArICcgIH1cXG4nICsgJyAgZmV0Y2hEYXRhKCk7XFxuJyArIFwifSwgW3NvbWVJZF0pOyAvLyBPciBbXSBpZiBlZmZlY3QgZG9lc24ndCBuZWVkIHByb3BzIG9yIHN0YXRlXFxuXFxuXCIgKyAnTGVhcm4gbW9yZSBhYm91dCBkYXRhIGZldGNoaW5nIHdpdGggSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ob29rcy1kYXRhLWZldGNoaW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQ6ICcgKyBkZXN0cm95O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvcignJXMgbXVzdCBub3QgcmV0dXJuIGFueXRoaW5nIGJlc2lkZXMgYSBmdW5jdGlvbiwgJyArICd3aGljaCBpcyB1c2VkIGZvciBjbGVhbi11cC4lcycsIGhvb2tOYW1lLCBhZGRlbmR1bSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVFZmZlY3REdXJhdGlvbnMoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcbiAge1xuICAgIC8vIE9ubHkgUHJvZmlsZXJzIHdpdGggd29yayBpbiB0aGVpciBzdWJ0cmVlIHdpbGwgaGF2ZSBhbiBVcGRhdGUgZWZmZWN0IHNjaGVkdWxlZC5cbiAgICBpZiAoKGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXNzaXZlRWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICBpZCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5pZCxcbiAgICAgICAgICAgICAgICBvblBvc3RDb21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUub25Qb3N0Q29tbWl0OyAvLyBUaGlzIHZhbHVlIHdpbGwgc3RpbGwgcmVmbGVjdCB0aGUgcHJldmlvdXMgY29tbWl0IHBoYXNlLlxuICAgICAgICAgICAgLy8gSXQgZG9lcyBub3QgZ2V0IHJlc2V0IHVudGlsIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjb21taXQgcGhhc2UuXG5cbiAgICAgICAgICAgIHZhciBjb21taXRUaW1lID0gZ2V0Q29tbWl0VGltZSgpO1xuICAgICAgICAgICAgdmFyIHBoYXNlID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSA9PT0gbnVsbCA/ICdtb3VudCcgOiAndXBkYXRlJztcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBwaGFzZSA9ICduZXN0ZWQtdXBkYXRlJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uUG9zdENvbW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBvblBvc3RDb21taXQoaWQsIHBoYXNlLCBwYXNzaXZlRWZmZWN0RHVyYXRpb24sIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgfSAvLyBCdWJibGUgdGltZXMgdG8gdGhlIG5leHQgbmVhcmVzdCBhbmNlc3RvciBQcm9maWxlci5cbiAgICAgICAgICAgIC8vIEFmdGVyIHdlIHByb2Nlc3MgdGhhdCBQcm9maWxlciwgd2UnbGwgYnViYmxlIGZ1cnRoZXIgdXAuXG5cblxuICAgICAgICAgICAgdmFyIHBhcmVudEZpYmVyID0gZmluaXNoZWRXb3JrLnJldHVybjtcblxuICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIHJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMpIHtcbiAgaWYgKChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncykge1xuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICggIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgbGF5b3V0IGVmZmVjdHMgaGF2ZSBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIChkdXJpbmcgbXV0YXRpb24gcGhhc2UpLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldFxuICAgICAgICAgICAgLy8gYnkgYSBjcmVhdGUgZnVuY3Rpb24gaW4gYW5vdGhlciBjb21wb25lbnQgZHVyaW5nIHRoZSBzYW1lIGNvbW1pdC5cbiAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgY3VycmVudC5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlOyAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICAvLyBjb21taXQgcGhhc2UuIENvbnNpZGVyIHJlbW92aW5nIHRoZSB0eXBlIGNoZWNrLlxuXG5cbiAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG5cbiAgICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgdXBkYXRlUXVldWUsIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICAvLyBjb21taXQgcGhhc2UuIENvbnNpZGVyIHJlbW92aW5nIHRoZSB0eXBlIGNoZWNrLlxuICAgICAgICAgIHZhciBfdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAoX3VwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBnZXRQdWJsaWNJbnN0YW5jZShmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIF91cGRhdGVRdWV1ZSwgX2luc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlMiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7IC8vIFJlbmRlcmVycyBtYXkgc2NoZWR1bGUgd29yayB0byBiZSBkb25lIGFmdGVyIGhvc3QgY29tcG9uZW50cyBhcmUgbW91bnRlZFxuICAgICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgbWF5IHNjaGVkdWxlIGF1dG8tZm9jdXMgZm9yIGlucHV0cyBhbmQgZm9ybSBjb250cm9scykuXG4gICAgICAgICAgLy8gVGhlc2UgZWZmZWN0cyBzaG91bGQgb25seSBiZSBjb21taXR0ZWQgd2hlbiBjb21wb25lbnRzIGFyZSBmaXJzdCBtb3VudGVkLFxuICAgICAgICAgIC8vIGFrYSB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQvYWx0ZXJuYXRlLlxuXG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgJiYgZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgICAgdmFyIHByb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICBjb21taXRNb3VudChfaW5zdGFuY2UyLCB0eXBlLCBwcm9wcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHRleHQuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggcG9ydGFscy5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9maW5pc2hlZFdvcmskbWVtb2l6ZTIgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICBvbkNvbW1pdCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25Db21taXQsXG4gICAgICAgICAgICAgICAgb25SZW5kZXIgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uUmVuZGVyO1xuICAgICAgICAgICAgdmFyIGVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgIHZhciBjb21taXRUaW1lID0gZ2V0Q29tbWl0VGltZSgpO1xuICAgICAgICAgICAgdmFyIHBoYXNlID0gY3VycmVudCA9PT0gbnVsbCA/ICdtb3VudCcgOiAndXBkYXRlJztcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBwaGFzZSA9ICduZXN0ZWQtdXBkYXRlJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBwaGFzZSwgZmluaXNoZWRXb3JrLmFjdHVhbER1cmF0aW9uLCBmaW5pc2hlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiwgZmluaXNoZWRXb3JrLmFjdHVhbFN0YXJ0VGltZSwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvbkNvbW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIG9uQ29tbWl0KGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBwaGFzZSwgZWZmZWN0RHVyYXRpb24sIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgICB9IC8vIFNjaGVkdWxlIGEgcGFzc2l2ZSBlZmZlY3QgZm9yIHRoaXMgUHJvZmlsZXIgdG8gY2FsbCBvblBvc3RDb21taXQgaG9va3MuXG4gICAgICAgICAgICAgIC8vIFRoaXMgZWZmZWN0IHNob3VsZCBiZSBzY2hlZHVsZWQgZXZlbiBpZiB0aGVyZSBpcyBubyBvblBvc3RDb21taXQgY2FsbGJhY2sgZm9yIHRoaXMgUHJvZmlsZXIsXG4gICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGVmZmVjdCBpcyBhbHNvIHdoZXJlIHRpbWVzIGJ1YmJsZSB0byBwYXJlbnQgUHJvZmlsZXJzLlxuXG5cbiAgICAgICAgICAgICAgZW5xdWV1ZVBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3QoZmluaXNoZWRXb3JrKTsgLy8gUHJvcGFnYXRlIGxheW91dCBlZmZlY3QgZHVyYXRpb25zIHRvIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3IuXG4gICAgICAgICAgICAgIC8vIERvIG5vdCByZXNldCB0aGVzZSB2YWx1ZXMgdW50aWwgdGhlIG5leHQgcmVuZGVyIHNvIERldlRvb2xzIGhhcyBhIGNoYW5jZSB0byByZWFkIHRoZW0gZmlyc3QuXG5cbiAgICAgICAgICAgICAgdmFyIHBhcmVudEZpYmVyID0gZmluaXNoZWRXb3JrLnJldHVybjtcblxuICAgICAgICAgICAgICBvdXRlcjogd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgICByb290LmVmZmVjdER1cmF0aW9uICs9IGVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcblxuICAgICAgICAgICAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uICs9IGVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyAnICsgJ2xpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICggIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICB7XG4gICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgUmVmKSB7XG4gICAgICAgIGNvbW1pdEF0dGFjaFJlZihmaW5pc2hlZFdvcmspO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNPbkZpYmVyKG5vZGUpIHtcbiAgLy8gVHVybiBvbiBsYXlvdXQgZWZmZWN0cyBpbiBhIHRyZWUgdGhhdCBwcmV2aW91c2x5IGRpc2FwcGVhcmVkLlxuICAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIExheW91dFN0YXRpY1xuICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIG5vZGUubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24obm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNhZmVseUNhbGxDb21taXRIb29rTGF5b3V0RWZmZWN0TGlzdE1vdW50KG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnREaWRNb3VudChub2RlLCBub2RlLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2FmZWx5QXR0YWNoUmVmKG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHNhZmVseUF0dGFjaFJlZihub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKGZpbmlzaGVkV29yaywgaXNIaWRkZW4pIHtcbiAgLy8gT25seSBoaWRlIG9yIHVuaGlkZSB0aGUgdG9wLW1vc3QgaG9zdCBub2Rlcy5cbiAgdmFyIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG5cbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBub2RlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZUluc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaGlkZUluc3RhbmNlKG5vZGUuc3RhdGVOb2RlLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTMgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1bmhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMywgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChub2RlLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50IHx8IG5vZGUudGFnID09PSBMZWdhY3lIaWRkZW5Db21wb25lbnQpICYmIG5vZGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBub2RlICE9PSBmaW5pc2hlZFdvcmspIDsgZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBub2RlKSB7XG4gICAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbm9kZSkge1xuICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gIHZhciByZWYgPSBmaW5pc2hlZFdvcmsucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgIHZhciBpbnN0YW5jZVRvVXNlO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2U7XG4gICAgfSAvLyBNb3ZlZCBvdXRzaWRlIHRvIGVuc3VyZSBEQ0Ugd29ya3Mgd2l0aCB0aGlzIGZsYWdcblxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcmV0VmFsO1xuXG4gICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldFZhbCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIHJldFZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIGlmICghcmVmLmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZWYgb2JqZWN0IHByb3ZpZGVkIGZvciAlcy4gJyArICdVc2UgZWl0aGVyIGEgcmVmLXNldHRlciBmdW5jdGlvbiBvciBSZWFjdC5jcmVhdGVSZWYoKS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlZi5jdXJyZW50ID0gaW5zdGFuY2VUb1VzZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0YWNoRmliZXJNdXRhdGlvbihmaWJlcikge1xuICAvLyBDdXQgb2ZmIHRoZSByZXR1cm4gcG9pbnRlciB0byBkaXNjb25uZWN0IGl0IGZyb20gdGhlIHRyZWUuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBkZXRlY3QgYW5kIHdhcm4gYWdhaW5zdCBzdGF0ZSB1cGRhdGVzIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXG4gIC8vIEl0IGFsc28gcHJldmVudHMgZXZlbnRzIGZyb20gYnViYmxpbmcgZnJvbSB3aXRoaW4gZGlzY29ubmVjdGVkIGNvbXBvbmVudHMuXG4gIC8vXG4gIC8vIElkZWFsbHksIHdlIHNob3VsZCBhbHNvIGNsZWFyIHRoZSBjaGlsZCBwb2ludGVyIG9mIHRoZSBwYXJlbnQgYWx0ZXJuYXRlIHRvIGxldCB0aGlzXG4gIC8vIGdldCBHQzplZCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBmb3Igc3VyZSB3aGljaCBwYXJlbnQgaXMgdGhlIGN1cnJlbnRcbiAgLy8gb25lIHNvIHdlJ2xsIHNldHRsZSBmb3IgR0M6aW5nIHRoZSBzdWJ0cmVlIG9mIHRoaXMgY2hpbGQuXG4gIC8vIFRoaXMgY2hpbGQgaXRzZWxmIHdpbGwgYmUgR0M6ZWQgd2hlbiB0aGUgcGFyZW50IHVwZGF0ZXMgdGhlIG5leHQgdGltZS5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IGNsZWFyIGNoaWxkIG9yIHNpYmxpbmcgcG9pbnRlcnMgeWV0LlxuICAvLyBUaGV5J3JlIG5lZWRlZCBmb3IgcGFzc2l2ZSBlZmZlY3RzIGFuZCBmb3IgZmluZERPTU5vZGUuXG4gIC8vIFdlIGRlZmVyIHRob3NlIGZpZWxkcywgYW5kIGFsbCBvdGhlciBjbGVhbnVwLCB0byB0aGUgcGFzc2l2ZSBwaGFzZSAoc2VlIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKS5cbiAgLy9cbiAgLy8gRG9uJ3QgcmVzZXQgdGhlIGFsdGVybmF0ZSB5ZXQsIGVpdGhlci4gV2UgbmVlZCB0aGF0IHNvIHdlIGNhbiBkZXRhY2ggdGhlXG4gIC8vIGFsdGVybmF0ZSdzIGZpZWxkcyBpbiB0aGUgcGFzc2l2ZSBwaGFzZS4gQ2xlYXJpbmcgdGhlIHJldHVybiBwb2ludGVyIGlzXG4gIC8vIHN1ZmZpY2llbnQgZm9yIGZpbmRET01Ob2RlIHNlbWFudGljcy5cbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLnJldHVybiA9IG51bGw7XG4gIH1cblxuICBmaWJlci5yZXR1cm4gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBmaWJlci5hbHRlcm5hdGUgPSBudWxsO1xuICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGFsdGVybmF0ZSk7XG4gIH0gLy8gTm90ZTogRGVmZW5zaXZlbHkgdXNpbmcgbmVnYXRpb24gaW5zdGVhZCBvZiA8IGluIGNhc2VcbiAgLy8gYGRlbGV0ZWRUcmVlQ2xlYW5VcExldmVsYCBpcyB1bmRlZmluZWQuXG5cblxuICB7XG4gICAgLy8gQ2xlYXIgY3ljbGljYWwgRmliZXIgZmllbGRzLiBUaGlzIGxldmVsIGFsb25lIGlzIGRlc2lnbmVkIHRvIHJvdWdobHlcbiAgICAvLyBhcHByb3hpbWF0ZSB0aGUgcGxhbm5lZCBGaWJlciByZWZhY3Rvci4gSW4gdGhhdCB3b3JsZCwgYHNldFN0YXRlYCB3aWxsIGJlXG4gICAgLy8gYm91bmQgdG8gYSBzcGVjaWFsIFwiaW5zdGFuY2VcIiBvYmplY3QgaW5zdGVhZCBvZiBhIEZpYmVyLiBUaGUgSW5zdGFuY2VcbiAgICAvLyBvYmplY3Qgd2lsbCBub3QgaGF2ZSBhbnkgb2YgdGhlc2UgZmllbGRzLiBJdCB3aWxsIG9ubHkgYmUgY29ubmVjdGVkIHRvXG4gICAgLy8gdGhlIGZpYmVyIHRyZWUgdmlhIGEgc2luZ2xlIGxpbmsgYXQgdGhlIHJvb3QuIFNvIGlmIHRoaXMgbGV2ZWwgYWxvbmUgaXNcbiAgICAvLyBzdWZmaWNpZW50IHRvIGZpeCBtZW1vcnkgaXNzdWVzLCB0aGF0IGJvZGVzIHdlbGwgZm9yIG91ciBwbGFucy5cbiAgICBmaWJlci5jaGlsZCA9IG51bGw7XG4gICAgZmliZXIuZGVsZXRpb25zID0gbnVsbDtcbiAgICBmaWJlci5zaWJsaW5nID0gbnVsbDsgLy8gVGhlIGBzdGF0ZU5vZGVgIGlzIGN5Y2xpY2FsIGJlY2F1c2Ugb24gaG9zdCBub2RlcyBpdCBwb2ludHMgdG8gdGhlIGhvc3RcbiAgICAvLyB0cmVlLCB3aGljaCBoYXMgaXRzIG93biBwb2ludGVycyB0byBjaGlsZHJlbiwgcGFyZW50cywgYW5kIHNpYmxpbmdzLlxuICAgIC8vIFRoZSBvdGhlciBob3N0IG5vZGVzIGFsc28gcG9pbnQgYmFjayB0byBmaWJlcnMsIHNvIHdlIHNob3VsZCBkZXRhY2ggdGhhdFxuICAgIC8vIG9uZSwgdG9vLlxuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICBkZXRhY2hEZWxldGVkSW5zdGFuY2UoaG9zdEluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBJJ20gaW50ZW50aW9uYWxseSBub3QgY2xlYXJpbmcgdGhlIGByZXR1cm5gIGZpZWxkIGluIHRoaXMgbGV2ZWwuIFdlXG4gICAgLy8gYWxyZWFkeSBkaXNjb25uZWN0IHRoZSBgcmV0dXJuYCBwb2ludGVyIGF0IHRoZSByb290IG9mIHRoZSBkZWxldGVkXG4gICAgLy8gc3VidHJlZSAoaW4gYGRldGFjaEZpYmVyTXV0YXRpb25gKS4gQmVzaWRlcywgYHJldHVybmAgYnkgaXRzZWxmIGlzIG5vdFxuICAgIC8vIGN5Y2xpY2FsIOKAlCBpdCdzIG9ubHkgY3ljbGljYWwgd2hlbiBjb21iaW5lZCB3aXRoIGBjaGlsZGAsIGBzaWJsaW5nYCwgYW5kXG4gICAgLy8gYGFsdGVybmF0ZWAuIEJ1dCB3ZSdsbCBjbGVhciBpdCBpbiB0aGUgbmV4dCBsZXZlbCBhbnl3YXksIGp1c3QgaW4gY2FzZS5cblxuICAgIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBUaGVvcmV0aWNhbGx5LCBub3RoaW5nIGluIGhlcmUgc2hvdWxkIGJlIG5lY2Vzc2FyeSwgYmVjYXVzZSB3ZSBhbHJlYWR5XG4gICAgICAvLyBkaXNjb25uZWN0ZWQgdGhlIGZpYmVyIGZyb20gdGhlIHRyZWUuIFNvIGV2ZW4gaWYgc29tZXRoaW5nIGxlYWtzIHRoaXNcbiAgICAgIC8vIHBhcnRpY3VsYXIgZmliZXIsIGl0IHdvbid0IGxlYWsgYW55dGhpbmcgZWxzZVxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgYnJhbmNoIGlzIHRvIGJlIHN1cGVyIGFnZ3Jlc3NpdmUgc28gd2UgY2FuIG1lYXN1cmVcbiAgICAgIC8vIGlmIHRoZXJlJ3MgYW55IGRpZmZlcmVuY2UgaW4gbWVtb3J5IGltcGFjdC4gSWYgdGhlcmUgaXMsIHRoYXQgY291bGRcbiAgICAgIC8vIGluZGljYXRlIGEgUmVhY3QgbGVhayB3ZSBkb24ndCBrbm93IGFib3V0LlxuICAgICAgZmliZXIucmV0dXJuID0gbnVsbDtcbiAgICAgIGZpYmVyLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gbnVsbDtcbiAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7IC8vIFRPRE86IE1vdmUgdG8gYGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyYCBpbnN0ZWFkLlxuXG4gICAgICBmaWJlci51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RQYXJlbnRGaWJlcihmaWJlcikge1xuICB2YXIgcGFyZW50ID0gZmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBpZiAoaXNIb3N0UGFyZW50KHBhcmVudCkpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIGlzSG9zdFBhcmVudChmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QgfHwgZmliZXIudGFnID09PSBIb3N0UG9ydGFsO1xufVxuXG5mdW5jdGlvbiBnZXRIb3N0U2libGluZyhmaWJlcikge1xuICAvLyBXZSdyZSBnb2luZyB0byBzZWFyY2ggZm9yd2FyZCBpbnRvIHRoZSB0cmVlIHVudGlsIHdlIGZpbmQgYSBzaWJsaW5nIGhvc3RcbiAgLy8gbm9kZS4gVW5mb3J0dW5hdGVseSwgaWYgbXVsdGlwbGUgaW5zZXJ0aW9ucyBhcmUgZG9uZSBpbiBhIHJvdyB3ZSBoYXZlIHRvXG4gIC8vIHNlYXJjaCBwYXN0IHRoZW0uIFRoaXMgbGVhZHMgdG8gZXhwb25lbnRpYWwgc2VhcmNoIGZvciB0aGUgbmV4dCBzaWJsaW5nLlxuICAvLyBUT0RPOiBGaW5kIGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMuXG4gIHZhciBub2RlID0gZmliZXI7XG5cbiAgc2libGluZ3M6IHdoaWxlICh0cnVlKSB7XG4gICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcsIGxldCdzIHRyeSB0aGUgbmV4dCBzaWJsaW5nLlxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBpc0hvc3RQYXJlbnQobm9kZS5yZXR1cm4pKSB7XG4gICAgICAgIC8vIElmIHdlIHBvcCBvdXQgb2YgdGhlIHJvb3Qgb3IgaGl0IHRoZSBwYXJlbnQgdGhlIGZpYmVyIHdlIGFyZSB0aGVcbiAgICAgICAgLy8gbGFzdCBzaWJsaW5nLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuXG4gICAgd2hpbGUgKG5vZGUudGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIG5vZGUudGFnICE9PSBIb3N0VGV4dCAmJiBub2RlLnRhZyAhPT0gRGVoeWRyYXRlZEZyYWdtZW50KSB7XG4gICAgICAvLyBJZiBpdCBpcyBub3QgaG9zdCBub2RlIGFuZCwgd2UgbWlnaHQgaGF2ZSBhIGhvc3Qgbm9kZSBpbnNpZGUgaXQuXG4gICAgICAvLyBUcnkgdG8gc2VhcmNoIGRvd24gdW50aWwgd2UgZmluZCBvbmUuXG4gICAgICBpZiAobm9kZS5mbGFncyAmIFBsYWNlbWVudCkge1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IC8vIElmIHdlIGRvbid0IGhhdmUgYSBjaGlsZCwgdHJ5IHRoZSBzaWJsaW5ncyBpbnN0ZWFkLlxuICAgICAgLy8gV2UgYWxzbyBza2lwIHBvcnRhbHMgYmVjYXVzZSB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGlzIGhvc3QgdHJlZS5cblxuXG4gICAgICBpZiAobm9kZS5jaGlsZCA9PT0gbnVsbCB8fCBub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICBjb250aW51ZSBzaWJsaW5ncztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICB9XG4gICAgfSAvLyBDaGVjayBpZiB0aGlzIGhvc3Qgbm9kZSBpcyBzdGFibGUgb3IgYWJvdXQgdG8gYmUgcGxhY2VkLlxuXG5cbiAgICBpZiAoIShub2RlLmZsYWdzICYgUGxhY2VtZW50KSkge1xuICAgICAgLy8gRm91bmQgaXQhXG4gICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspIHtcblxuXG4gIHZhciBwYXJlbnRGaWJlciA9IGdldEhvc3RQYXJlbnRGaWJlcihmaW5pc2hlZFdvcmspOyAvLyBOb3RlOiB0aGVzZSB0d28gdmFyaWFibGVzICptdXN0KiBhbHdheXMgYmUgdXBkYXRlZCB0b2dldGhlci5cblxuICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAocGFyZW50RmliZXIuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgICAgICAvLyBSZXNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgYmVmb3JlIGRvaW5nIGFueSBpbnNlcnRpb25zXG4gICAgICAgICAgcmVzZXRUZXh0Q29udGVudChwYXJlbnQpOyAvLyBDbGVhciBDb250ZW50UmVzZXQgZnJvbSB0aGUgZWZmZWN0IHRhZ1xuXG4gICAgICAgICAgcGFyZW50RmliZXIuZmxhZ3MgJj0gfkNvbnRlbnRSZXNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBiZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspOyAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cblxuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoZmluaXNoZWRXb3JrLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgdmFyIF9iZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoZmluaXNoZWRXb3JrLCBfYmVmb3JlLCBfcGFyZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lLW5vLWZhbGx0aHJvdWdoXG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvc3QgcGFyZW50IGZpYmVyLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihub2RlLCBiZWZvcmUsIHBhcmVudCkge1xuICB2YXIgdGFnID0gbm9kZS50YWc7XG4gIHZhciBpc0hvc3QgPSB0YWcgPT09IEhvc3RDb21wb25lbnQgfHwgdGFnID09PSBIb3N0VGV4dDtcblxuICBpZiAoaXNIb3N0KSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgaW5zZXJ0SW5Db250YWluZXJCZWZvcmUocGFyZW50LCBzdGF0ZU5vZGUsIGJlZm9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZENoaWxkVG9Db250YWluZXIocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihjaGlsZCwgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgdmFyIHNpYmxpbmcgPSBjaGlsZC5zaWJsaW5nO1xuXG4gICAgICB3aGlsZSAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKHNpYmxpbmcsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgc2libGluZyA9IHNpYmxpbmcuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QpIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBzdGF0ZU5vZGUsIGJlZm9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGVuZENoaWxkKHBhcmVudCwgc3RhdGVOb2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2Uge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShjaGlsZCwgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgdmFyIHNpYmxpbmcgPSBjaGlsZC5zaWJsaW5nO1xuXG4gICAgICB3aGlsZSAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBUaGVzZSBhcmUgdHJhY2tlZCBvbiB0aGUgc3RhY2sgYXMgd2UgcmVjdXJzaXZlbHkgdHJhdmVyc2UgYVxuLy8gZGVsZXRlZCBzdWJ0cmVlLlxuLy8gVE9ETzogVXBkYXRlIHRoZXNlIGR1cmluZyB0aGUgd2hvbGUgbXV0YXRpb24gcGhhc2UsIG5vdCBqdXN0IGR1cmluZ1xuLy8gYSBkZWxldGlvbi5cblxuXG52YXIgaG9zdFBhcmVudCA9IG51bGw7XG52YXIgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGNvbW1pdERlbGV0aW9uRWZmZWN0cyhyb290LCByZXR1cm5GaWJlciwgZGVsZXRlZEZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBkZWxldGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgLy8gUmVjdXJzaXZlbHkgZGVsZXRlIGFsbCBob3N0IG5vZGVzIGZyb20gdGhlIHBhcmVudCwgZGV0YWNoIHJlZnMsIGNsZWFuXG4gICAgLy8gdXAgbW91bnRlZCBsYXlvdXQgZWZmZWN0cywgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQuXG4gICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgdG9wbW9zdCBob3N0IGNoaWxkIGluIGVhY2ggYnJhbmNoLiBCdXQgdGhlbiB3ZVxuICAgIC8vIHN0aWxsIG5lZWQgdG8ga2VlcCB0cmF2ZXJzaW5nIHRvIHVubW91bnQgZWZmZWN0cywgcmVmcywgYW5kIGNXVS4gVE9ETzogV2VcbiAgICAvLyBjb3VsZCBzcGxpdCB0aGlzIGludG8gdHdvIHNlcGFyYXRlIHRyYXZlcnNhbHMgZnVuY3Rpb25zLCB3aGVyZSB0aGUgc2Vjb25kXG4gICAgLy8gb25lIGRvZXNuJ3QgaW5jbHVkZSBhbnkgcmVtb3ZlQ2hpbGQgbG9naWMuIFRoaXMgaXMgbWF5YmUgdGhlIHNhbWVcbiAgICAvLyBmdW5jdGlvbiBhcyBcImRpc2FwcGVhckxheW91dEVmZmVjdHNcIiAob3Igd2hhdGV2ZXIgdGhhdCB0dXJucyBpbnRvIGFmdGVyXG4gICAgLy8gdGhlIGxheW91dCBwaGFzZSBpcyByZWZhY3RvcmVkIHRvIHVzZSByZWN1cnNpb24pLlxuICAgIC8vIEJlZm9yZSBzdGFydGluZywgZmluZCB0aGUgbmVhcmVzdCBob3N0IHBhcmVudCBvbiB0aGUgc3RhY2sgc28gd2Uga25vd1xuICAgIC8vIHdoaWNoIGluc3RhbmNlL2NvbnRhaW5lciB0byByZW1vdmUgdGhlIGNoaWxkcmVuIGZyb20uXG4gICAgLy8gVE9ETzogSW5zdGVhZCBvZiBzZWFyY2hpbmcgdXAgdGhlIGZpYmVyIHJldHVybiBwYXRoIG9uIGV2ZXJ5IGRlbGV0aW9uLCB3ZVxuICAgIC8vIGNhbiB0cmFjayB0aGUgbmVhcmVzdCBob3N0IGNvbXBvbmVudCBvbiB0aGUgSlMgc3RhY2sgYXMgd2UgdHJhdmVyc2UgdGhlXG4gICAgLy8gdHJlZSBkdXJpbmcgdGhlIGNvbW1pdCBwaGFzZS4gVGhpcyB3b3VsZCBtYWtlIGluc2VydGlvbnMgZmFzdGVyLCB0b28uXG4gICAgdmFyIHBhcmVudCA9IHJldHVybkZpYmVyO1xuXG4gICAgZmluZFBhcmVudDogd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnQudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChob3N0UGFyZW50ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5ICcgKyAnYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcik7XG4gICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gIH1cblxuICBkZXRhY2hGaWJlck11dGF0aW9uKGRlbGV0ZWRGaWJlcik7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBwYXJlbnQpIHtcbiAgLy8gVE9ETzogVXNlIGEgc3RhdGljIGZsYWcgdG8gc2tpcCB0cmVlcyB0aGF0IGRvbid0IGhhdmUgdW5tb3VudCBlZmZlY3RzXG4gIHZhciBjaGlsZCA9IHBhcmVudC5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgY2hpbGQpO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKSB7XG4gIG9uQ29tbWl0VW5tb3VudChkZWxldGVkRmliZXIpOyAvLyBUaGUgY2FzZXMgaW4gdGhpcyBvdXRlciBzd2l0Y2ggbW9kaWZ5IHRoZSBzdGFjayBiZWZvcmUgdGhleSB0cmF2ZXJzZVxuICAvLyBpbnRvIHRoZWlyIHN1YnRyZWUuIFRoZXJlIGFyZSBzaW1wbGVyIGNhc2VzIGluIHRoZSBpbm5lciBzd2l0Y2hcbiAgLy8gdGhhdCBkb24ndCBtb2RpZnkgdGhlIHN0YWNrLlxuXG4gIHN3aXRjaCAoZGVsZXRlZEZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgIH0gLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggdG8gbmV4dCBicmFuY2hcblxuICAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgbmVhcmVzdCBob3N0IGNoaWxkLiBTZXQgdGhlIGhvc3QgcGFyZW50XG4gICAgICAgIC8vIHRvIGBudWxsYCBvbiB0aGUgc3RhY2sgdG8gaW5kaWNhdGUgdGhhdCBuZXN0ZWQgY2hpbGRyZW4gZG9uJ3RcbiAgICAgICAgLy8gbmVlZCB0byBiZSByZW1vdmVkLlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgICAgICB2YXIgcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBob3N0UGFyZW50ID0gcHJldkhvc3RQYXJlbnQ7XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcblxuICAgICAgICAgIGlmIChob3N0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBOb3cgdGhhdCBhbGwgdGhlIGNoaWxkIGVmZmVjdHMgaGF2ZSB1bm1vdW50ZWQsIHdlIGNhbiByZW1vdmUgdGhlXG4gICAgICAgICAgICAvLyBub2RlIGZyb20gdGhlIHRyZWUuXG4gICAgICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcihob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlbW92ZUNoaWxkKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAge1xuICAgICAgICAvLyBEZWxldGUgdGhlIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudC5cblxuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoaG9zdFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnlGcm9tQ29udGFpbmVyKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdoZW4gd2UgZ28gaW50byBhIHBvcnRhbCwgaXQgYmVjb21lcyB0aGUgcGFyZW50IHRvIHJlbW92ZSBmcm9tLlxuICAgICAgICAgIHZhciBfcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgIHZhciBfcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgICBob3N0UGFyZW50ID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IF9wcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBfcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGRlbGV0ZWRGaWJlci51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgICAgICAgICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIF9lZmZlY3QgPSBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3kgPSBfZWZmZWN0LmRlc3Ryb3ksXG4gICAgICAgICAgICAgICAgICAgIHRhZyA9IF9lZmZlY3QudGFnO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhZyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIGRlbGV0ZWRGaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihkZWxldGVkRmliZXIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICAgICAgICAgICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlYWQgZmxhZ1xuICAgICAgICAgZGVsZXRlZEZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgb2Zmc2NyZWVuIGNvbXBvbmVudCBpcyBoaWRkZW4sIHdlIGFscmVhZHkgdW5tb3VudGVkIGl0LiBCZWZvcmVcbiAgICAgICAgICAvLyBkZWxldGluZyB0aGUgY2hpbGRyZW4sIHRyYWNrIHRoYXQgaXQncyBhbHJlYWR5IHVubW91bnRlZCBzbyB0aGF0IHdlXG4gICAgICAgICAgLy8gZG9uJ3QgYXR0ZW1wdCB0byB1bm1vdW50IHRoZSBlZmZlY3RzIGFnYWluLlxuICAgICAgICAgIC8vIFRPRE86IElmIHRoZSB0cmVlIGlzIGhpZGRlbiwgaW4gbW9zdCBjYXNlcyB3ZSBzaG91bGQgYmUgYWJsZSB0byBza2lwXG4gICAgICAgICAgLy8gb3ZlciB0aGUgbmVzdGVkIGNoaWxkcmVuIGVudGlyZWx5LiBBbiBleGNlcHRpb24gaXMgd2UgaGF2ZW4ndCB5ZXQgZm91bmRcbiAgICAgICAgICAvLyB0aGUgdG9wbW9zdCBob3N0IG5vZGUgdG8gZGVsZXRlLCB3aGljaCB3ZSBhbHJlYWR5IHRyYWNrIG9uIHRoZSBzdGFjay5cbiAgICAgICAgICAvLyBCdXQgdGhlIG90aGVyIGNhc2UgaXMgcG9ydGFscywgd2hpY2ggbmVlZCB0byBiZSBkZXRhY2hlZCBubyBtYXR0ZXIgaG93XG4gICAgICAgICAgLy8gZGVlcGx5IHRoZXkgYXJlIG5lc3RlZC4gV2Ugc2hvdWxkIHVzZSBhIHN1YnRyZWUgZmxhZyB0byB0cmFjayB3aGV0aGVyIGFcbiAgICAgICAgICAvLyBzdWJ0cmVlIGluY2x1ZGVzIGEgbmVzdGVkIHBvcnRhbC5cbiAgICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fCBkZWxldGVkRmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VDYWxsYmFjayhmaW5pc2hlZFdvcmspIHtcbiAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIHBhc3NpdmUgcGhhc2VcbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKSB7XG5cbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5ld1N0YXRlID09PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBwcmV2U3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgICBpZiAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yaykge1xuICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGp1c3QgdGltZWQgb3V0LCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHNldCBvZiB3YWtlYWJsZXMuXG4gIC8vIEZvciBlYWNoIHdha2VhYmxlLCBhdHRhY2ggYSBsaXN0ZW5lciBzbyB0aGF0IHdoZW4gaXQgcmVzb2x2ZXMsIFJlYWN0XG4gIC8vIGF0dGVtcHRzIHRvIHJlLXJlbmRlciB0aGUgYm91bmRhcnkgaW4gdGhlIHByaW1hcnkgKHByZS10aW1lb3V0KSBzdGF0ZS5cbiAgdmFyIHdha2VhYmxlcyA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICBpZiAod2FrZWFibGVzICE9PSBudWxsKSB7XG4gICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB2YXIgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICBpZiAocmV0cnlDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBuZXcgUG9zc2libHlXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgd2FrZWFibGVzLmZvckVhY2goZnVuY3Rpb24gKHdha2VhYmxlKSB7XG4gICAgICAvLyBNZW1vaXplIHVzaW5nIHRoZSBib3VuZGFyeSBmaWJlciB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgICB2YXIgcmV0cnkgPSByZXNvbHZlUmV0cnlXYWtlYWJsZS5iaW5kKG51bGwsIGZpbmlzaGVkV29yaywgd2FrZWFibGUpO1xuXG4gICAgICBpZiAoIXJldHJ5Q2FjaGUuaGFzKHdha2VhYmxlKSkge1xuICAgICAgICByZXRyeUNhY2hlLmFkZCh3YWtlYWJsZSk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICAgICAgaWYgKGluUHJvZ3Jlc3NMYW5lcyAhPT0gbnVsbCAmJiBpblByb2dyZXNzUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgYXNzb2NpYXRlIHRoZSBvcmlnaW5hbCB1cGRhdGVycyB3aXRoIGl0LlxuICAgICAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKGluUHJvZ3Jlc3NSb290LCBpblByb2dyZXNzTGFuZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0V4cGVjdGVkIGZpbmlzaGVkIHJvb3QgYW5kIGxhbmVzIHRvIGJlIHNldC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3YWtlYWJsZS50aGVuKHJldHJ5LCByZXRyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0gLy8gVGhpcyBmdW5jdGlvbiBkZXRlY3RzIHdoZW4gYSBTdXNwZW5zZSBib3VuZGFyeSBnb2VzIGZyb20gdmlzaWJsZSB0byBoaWRkZW4uXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcykge1xuICBpblByb2dyZXNzTGFuZXMgPSBjb21taXR0ZWRMYW5lcztcbiAgaW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcbiAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QpO1xuICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbiAgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIHBhcmVudEZpYmVyLCBsYW5lcykge1xuICAvLyBEZWxldGlvbnMgZWZmZWN0cyBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlciB0eXBlLiBUaGV5IG5lZWQgdG8gaGFwcGVuXG4gIC8vIGJlZm9yZSB0aGUgY2hpbGRyZW4gZWZmZWN0cyBoYWUgZmlyZWQuXG4gIHZhciBkZWxldGlvbnMgPSBwYXJlbnRGaWJlci5kZWxldGlvbnM7XG5cbiAgaWYgKGRlbGV0aW9ucyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0RGVsZXRpb25FZmZlY3RzKHJvb3QsIHBhcmVudEZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGNoaWxkVG9EZWxldGUsIHBhcmVudEZpYmVyLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHByZXZEZWJ1Z0ZpYmVyID0gZ2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIE11dGF0aW9uTWFzaykge1xuICAgIHZhciBjaGlsZCA9IHBhcmVudEZpYmVyLmNoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY2hpbGQpO1xuICAgICAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihjaGlsZCwgcm9vdCk7XG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgc2V0Q3VycmVudEZpYmVyKHByZXZEZWJ1Z0ZpYmVyKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKSB7XG4gIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzOyAvLyBUaGUgZWZmZWN0IGZsYWcgc2hvdWxkIGJlIGNoZWNrZWQgKmFmdGVyKiB3ZSByZWZpbmUgdGhlIHR5cGUgb2YgZmliZXIsXG4gIC8vIGJlY2F1c2UgdGhlIGZpYmVyIHRhZyBpcyBtb3JlIHNwZWNpZmljLiBBbiBleGNlcHRpb24gaXMgYW55IGZsYWcgcmVsYXRlZFxuICAvLyB0byByZWNvbmNpbGF0aW9uLCBiZWNhdXNlIHRob3NlIGNhbiBiZSBzZXQgb24gYWxsIGZpYmVyIHR5cGVzLlxuXG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KEluc2VydGlvbiB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfSAvLyBMYXlvdXQgZWZmZWN0cyBhcmUgZGVzdHJveWVkIGR1cmluZyB0aGUgbXV0YXRpb24gcGhhc2Ugc28gdGhhdCBhbGxcbiAgICAgICAgICAvLyBkZXN0cm95IGZ1bmN0aW9ucyBmb3IgYWxsIGZpYmVycyBhcmUgY2FsbGVkIGJlZm9yZSBhbnkgY3JlYXRlIGZ1bmN0aW9ucy5cbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHNpYmxpbmcgY29tcG9uZW50IGVmZmVjdHMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIsXG4gICAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgICAgLy8gYnkgYSBjcmVhdGUgZnVuY3Rpb24gaW4gYW5vdGhlciBjb21wb25lbnQgZHVyaW5nIHRoZSBzYW1lIGNvbW1pdC5cblxuXG4gICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFJlZikge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPOiBDb250ZW50UmVzZXQgZ2V0cyBjbGVhcmVkIGJ5IHRoZSBjaGlsZHJlbiBkdXJpbmcgdGhlIGNvbW1pdFxuICAgICAgICAgIC8vIHBoYXNlLiBUaGlzIGlzIGEgcmVmYWN0b3IgaGF6YXJkIGJlY2F1c2UgaXQgbWVhbnMgd2UgbXVzdCByZWFkXG4gICAgICAgICAgLy8gZmxhZ3MgdGhlIGZsYWdzIGFmdGVyIGBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHNgIGhhcyBhbHJlYWR5IHJ1bjtcbiAgICAgICAgICAvLyB0aGUgb3JkZXIgbWF0dGVycy4gV2Ugc2hvdWxkIHJlZmFjdG9yIHNvIHRoYXQgQ29udGVudFJlc2V0IGRvZXMgbm90XG4gICAgICAgICAgLy8gcmVseSBvbiBtdXRhdGluZyB0aGUgZmxhZyBkdXJpbmcgY29tbWl0LiBMaWtlIGJ5IHNldHRpbmcgYSBmbGFnXG4gICAgICAgICAgLy8gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UgaW5zdGVhZC5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgQ29udGVudFJlc2V0KSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXNldFRleHRDb250ZW50KGluc3RhbmNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTQgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoX2luc3RhbmNlNCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIENvbW1pdCB0aGUgd29yayBwcmVwYXJlZCBlYXJsaWVyLlxuICAgICAgICAgICAgICB2YXIgbmV3UHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wczsgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wc1xuICAgICAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAgICAgLy8gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdQcm9wcztcbiAgICAgICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTsgLy8gVE9ETzogVHlwZSB0aGUgdXBkYXRlUXVldWUgdG8gYmUgc3BlY2lmaWMgdG8gaG9zdCBjb21wb25lbnRzLlxuXG4gICAgICAgICAgICAgIHZhciB1cGRhdGVQYXlsb2FkID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbW1pdFVwZGF0ZShfaW5zdGFuY2U0LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHNob3VsZCBoYXZlIGEgdGV4dCBub2RlIGluaXRpYWxpemVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgdmFyIG5ld1RleHQgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wczsgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wc1xuICAgICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgIHZhciBvbGRUZXh0ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG5ld1RleHQ7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbW1pdFRleHRVcGRhdGUodGV4dEluc3RhbmNlLCBvbGRUZXh0LCBuZXdUZXh0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIHByZXZSb290U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKHByZXZSb290U3RhdGUuaXNEZWh5ZHJhdGVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB2YXIgb2Zmc2NyZWVuRmliZXIgPSBmaW5pc2hlZFdvcmsuY2hpbGQ7XG5cbiAgICAgICAgaWYgKG9mZnNjcmVlbkZpYmVyLmZsYWdzICYgVmlzaWJpbGl0eSkge1xuICAgICAgICAgIHZhciBvZmZzY3JlZW5JbnN0YW5jZSA9IG9mZnNjcmVlbkZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgbmV3U3RhdGUgPSBvZmZzY3JlZW5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IG5ld1N0YXRlICE9PSBudWxsOyAvLyBUcmFjayB0aGUgY3VycmVudCBzdGF0ZSBvbiB0aGUgT2Zmc2NyZWVuIGluc3RhbmNlIHNvIHdlIGNhblxuICAgICAgICAgIC8vIHJlYWQgaXQgZHVyaW5nIGFuIGV2ZW50XG5cbiAgICAgICAgICBvZmZzY3JlZW5JbnN0YW5jZS5pc0hpZGRlbiA9IGlzSGlkZGVuO1xuXG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICB2YXIgd2FzSGlkZGVuID0gb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlICE9PSBudWxsICYmIG9mZnNjcmVlbkZpYmVyLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoIXdhc0hpZGRlbikge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2VcbiAgICAgICAgICAgICAgbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKCAvLyBUT0RPOiBSZW1vdmUgdGhpcyBkZWFkIGZsYWdcbiAgICAgICAgIGZpbmlzaGVkV29yay5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgICAvLyBCZWZvcmUgY29tbWl0dGluZyB0aGUgY2hpbGRyZW4sIHRyYWNrIG9uIHRoZSBzdGFjayB3aGV0aGVyIHRoaXNcbiAgICAgICAgICAvLyBvZmZzY3JlZW4gc3VidHJlZSB3YXMgYWxyZWFkeSBoaWRkZW4sIHNvIHRoYXQgd2UgZG9uJ3QgdW5tb3VudCB0aGVcbiAgICAgICAgICAvLyBlZmZlY3RzIGFnYWluLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IF93YXNIaWRkZW47XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIF9vZmZzY3JlZW5JbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIF9uZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgdmFyIF9pc0hpZGRlbiA9IF9uZXdTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIHZhciBvZmZzY3JlZW5Cb3VuZGFyeSA9IGZpbmlzaGVkV29yazsgLy8gVHJhY2sgdGhlIGN1cnJlbnQgc3RhdGUgb24gdGhlIE9mZnNjcmVlbiBpbnN0YW5jZSBzbyB3ZSBjYW5cbiAgICAgICAgICAvLyByZWFkIGl0IGR1cmluZyBhbiBldmVudFxuXG4gICAgICAgICAgX29mZnNjcmVlbkluc3RhbmNlLmlzSGlkZGVuID0gX2lzSGlkZGVuO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKF9pc0hpZGRlbikge1xuICAgICAgICAgICAgICBpZiAoIV93YXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoKG9mZnNjcmVlbkJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdCA9IG9mZnNjcmVlbkJvdW5kYXJ5O1xuICAgICAgICAgICAgICAgICAgdmFyIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQm91bmRhcnkuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzY3JlZW5DaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4ob2Zmc2NyZWVuQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5DaGlsZCA9IG9mZnNjcmVlbkNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBuZWVkcyB0byBydW4gd2hlbmV2ZXIgdGhlcmUncyBhbiBpbnNlcnRpb24gb3IgdXBkYXRlXG4gICAgICAgICAgICAvLyBpbnNpZGUgYSBoaWRkZW4gT2Zmc2NyZWVuIHRyZWUuXG4gICAgICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihvZmZzY3JlZW5Cb3VuZGFyeSwgX2lzSGlkZGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIFBsYWNlbWVudCBlZmZlY3RzIChpbnNlcnRpb25zLCByZW9yZGVycykgY2FuIGJlIHNjaGVkdWxlZCBvbiBhbnkgZmliZXJcbiAgLy8gdHlwZS4gVGhleSBuZWVkcyB0byBoYXBwZW4gYWZ0ZXIgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGF2ZSBmaXJlZCwgYnV0XG4gIC8vIGJlZm9yZSB0aGUgZWZmZWN0cyBvbiB0aGlzIGZpYmVyIGhhdmUgZmlyZWQuXG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcblxuICBpZiAoZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICB0cnkge1xuICAgICAgY29tbWl0UGxhY2VtZW50KGZpbmlzaGVkV29yayk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgIH0gLy8gQ2xlYXIgdGhlIFwicGxhY2VtZW50XCIgZnJvbSBlZmZlY3QgdGFnIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgaXNcbiAgICAvLyBpbnNlcnRlZCwgYmVmb3JlIGFueSBsaWZlLWN5Y2xlcyBsaWtlIGNvbXBvbmVudERpZE1vdW50IGdldHMgY2FsbGVkLlxuICAgIC8vIFRPRE86IGZpbmRET01Ob2RlIGRvZXNuJ3QgcmVseSBvbiB0aGlzIGFueSBtb3JlIGJ1dCBpc01vdW50ZWQgZG9lc1xuICAgIC8vIGFuZCBpc01vdW50ZWQgaXMgZGVwcmVjYXRlZCBhbnl3YXkgc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8ga2lsbCB0aGlzLlxuXG5cbiAgICBmaW5pc2hlZFdvcmsuZmxhZ3MgJj0gflBsYWNlbWVudDtcbiAgfVxuXG4gIGlmIChmbGFncyAmIEh5ZHJhdGluZykge1xuICAgIGZpbmlzaGVkV29yay5mbGFncyAmPSB+SHlkcmF0aW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICBpblByb2dyZXNzTGFuZXMgPSBjb21taXR0ZWRMYW5lcztcbiAgaW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICBuZXh0RWZmZWN0ID0gZmluaXNoZWRXb3JrO1xuICBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xuICBpblByb2dyZXNzUm9vdCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIC8vIFN1c3BlbnNlIGxheW91dCBlZmZlY3RzIHNlbWFudGljcyBkb24ndCBjaGFuZ2UgZm9yIGxlZ2FjeSByb290cy5cbiAgdmFyIGlzTW9kZXJuUm9vdCA9IChzdWJ0cmVlUm9vdC5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoIGZpYmVyLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50ICYmIGlzTW9kZXJuUm9vdCkge1xuICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBPZmZzY3JlZW4gc3RhY2sncyBzdGF0ZS5cbiAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICB2YXIgbmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gaXNIaWRkZW4gfHwgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuXG4gICAgICBpZiAobmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuKSB7XG4gICAgICAgIC8vIFRoZSBPZmZzY3JlZW4gdHJlZSBpcyBoaWRkZW4uIFNraXAgb3ZlciBpdHMgbGF5b3V0IGVmZmVjdHMuXG4gICAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQWxzbyBjaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0TWFza1xuICAgICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgICAgdmFyIHdhc0hpZGRlbiA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICB2YXIgbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHdhc0hpZGRlbiB8fCBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjsgLy8gVHJhdmVyc2UgdGhlIE9mZnNjcmVlbiBzdWJ0cmVlIHdpdGggdGhlIGN1cnJlbnQgT2Zmc2NyZWVuIGFzIHRoZSByb290LlxuXG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG5ld09mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG5cbiAgICAgICAgaWYgKG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gJiYgIXByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdCBvZiBhIHJlYXBwZWFyaW5nIGJvdW5kYXJ5LiBUdXJuIGl0cyBsYXlvdXQgZWZmZWN0c1xuICAgICAgICAgIC8vIGJhY2sgb24uXG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihmaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hpbGQgPSBmaXJzdENoaWxkO1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICAgICAgICBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKGNoaWxkLCAvLyBOZXcgcm9vdDsgYnViYmxlIGJhY2sgdXAgdG8gaGVyZSBhbmQgc3RvcC5cbiAgICAgICAgICByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9IC8vIFJlc3RvcmUgT2Zmc2NyZWVuIHN0YXRlIGFuZCByZXN1bWUgaW4gb3VyLXByb2dyZXNzIHRyYXZlcnNhbC5cblxuXG4gICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncyAmJiBmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncykge1xuICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKHJvb3QsIGN1cnJlbnQsIGZpYmVyLCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkOyAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIChSZWZTdGF0aWMgfCBMYXlvdXRTdGF0aWMpXG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICggZmliZXIubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmliZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBSZWZTdGF0aWNcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGZpYmVyLCBmaWJlci5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFcbiAgICAgICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAvLyBOZXN0ZWQgT2Zmc2NyZWVuIHRyZWUgaXMgYWxyZWFkeSBoaWRkZW4uIERvbid0IGRpc2FwcGVhclxuICAgICAgICAgICAgLy8gaXRzIGVmZmVjdHMuXG4gICAgICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfSAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuXG4gICAgaWYgKGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoZmliZXIudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQpIHtcbiAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAvLyBOZXN0ZWQgT2Zmc2NyZWVuIHRyZWUgaXMgc3RpbGwgaGlkZGVuLiBEb24ndCByZS1hcHBlYXIgaXRzIGVmZmVjdHMuXG4gICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0U3RhdGljXG5cblxuICAgIGlmIChmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIG5vZGUgbWF5IGhhdmUgYmVlbiByZXVzZWQgZnJvbSBhIHByZXZpb3VzIHJlbmRlciwgc28gd2UgY2FuJ3RcbiAgICAgIC8vIGFzc3VtZSBpdHMgcmV0dXJuIHBvaW50ZXIgaXMgY29ycmVjdC5cbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICB0cnkge1xuICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzT25GaWJlcihmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbm9kZSBtYXkgaGF2ZSBiZWVuIHJldXNlZCBmcm9tIGEgcHJldmlvdXMgcmVuZGVyLCBzbyB3ZSBjYW4ndFxuICAgICAgLy8gYXNzdW1lIGl0cyByZXR1cm4gcG9pbnRlciBpcyBjb3JyZWN0LlxuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgbmV4dEVmZmVjdCA9IGZpbmlzaGVkV29yaztcbiAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19iZWdpbihmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzICYmIGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihyb290LCBmaWJlciwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaXJzdENoaWxkKSB7XG4gIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfYmVnaW4oKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2JlZ2luKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKG5leHRFZmZlY3QuZmxhZ3MgJiBDaGlsZERlbGV0aW9uKSAhPT0gTm9GbGFncykge1xuICAgICAgdmFyIGRlbGV0aW9ucyA9IGZpYmVyLmRlbGV0aW9ucztcblxuICAgICAgaWYgKGRlbGV0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBmaWJlclRvRGVsZXRlID0gZGVsZXRpb25zW2ldO1xuICAgICAgICAgIG5leHRFZmZlY3QgPSBmaWJlclRvRGVsZXRlO1xuICAgICAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oZmliZXJUb0RlbGV0ZSwgZmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIEEgZmliZXIgd2FzIGRlbGV0ZWQgZnJvbSB0aGlzIHBhcmVudCBmaWJlciwgYnV0IGl0J3Mgc3RpbGwgcGFydCBvZlxuICAgICAgICAgIC8vIHRoZSBwcmV2aW91cyAoYWx0ZXJuYXRlKSBwYXJlbnQgZmliZXIncyBsaXN0IG9mIGNoaWxkcmVuLiBCZWNhdXNlXG4gICAgICAgICAgLy8gY2hpbGRyZW4gYXJlIGEgbGlua2VkIGxpc3QsIGFuIGVhcmxpZXIgc2libGluZyB0aGF0J3Mgc3RpbGwgYWxpdmVcbiAgICAgICAgICAvLyB3aWxsIGJlIGNvbm5lY3RlZCB0byB0aGUgZGVsZXRlZCBmaWJlciB2aWEgaXRzIGBhbHRlcm5hdGVgOlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gICBsaXZlIGZpYmVyXG4gICAgICAgICAgLy8gICAtLWFsdGVybmF0ZS0tPiBwcmV2aW91cyBsaXZlIGZpYmVyXG4gICAgICAgICAgLy8gICAtLXNpYmxpbmctLT4gZGVsZXRlZCBmaWJlclxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2UgY2FuJ3QgZGlzY29ubmVjdCBgYWx0ZXJuYXRlYCBvbiBub2RlcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZWxldGVkXG4gICAgICAgICAgLy8geWV0LCBidXQgd2UgY2FuIGRpc2Nvbm5lY3QgdGhlIGBzaWJsaW5nYCBhbmQgYGNoaWxkYCBwb2ludGVycy5cbiAgICAgICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICAgIGlmIChwcmV2aW91c0ZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZGV0YWNoZWRDaGlsZCA9IHByZXZpb3VzRmliZXIuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChkZXRhY2hlZENoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzRmliZXIuY2hpbGQgPSBudWxsO1xuXG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgZGV0YWNoZWRTaWJsaW5nID0gZGV0YWNoZWRDaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgIGRldGFjaGVkQ2hpbGQuc2libGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZCA9IGRldGFjaGVkU2libGluZztcbiAgICAgICAgICAgICAgfSB3aGlsZSAoZGV0YWNoZWRDaGlsZCAhPT0gbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19jb21wbGV0ZSgpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKGZpYmVyKTtcbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKGRlbGV0ZWRTdWJ0cmVlUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIERlbGV0aW9uIGVmZmVjdHMgZmlyZSBpbiBwYXJlbnQgLT4gY2hpbGQgb3JkZXJcbiAgICAvLyBUT0RPOiBDaGVjayBpZiBmaWJlciBoYXMgYSBQYXNzaXZlU3RhdGljIGZsYWdcblxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXIoZmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7IC8vIFRPRE86IE9ubHkgdHJhdmVyc2Ugc3VidHJlZSBpZiBpdCBoYXMgYSBQYXNzaXZlU3RhdGljIGZsYWcuIChCdXQsIGlmIHdlXG4gICAgLy8gZG8gdGhpcywgc3RpbGwgbmVlZCB0byBoYW5kbGUgYGRlbGV0ZWRUcmVlQ2xlYW5VcExldmVsYCBjb3JyZWN0bHkuKVxuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9jb21wbGV0ZShkZWxldGVkU3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2NvbXBsZXRlKGRlbGV0ZWRTdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuICAgIHZhciByZXR1cm5GaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSBlbnRpcmUgZGVsZXRlZCB0cmVlIGFuZCBjbGVhbiB1cCBmaWJlciBmaWVsZHMuXG4gICAgICAvLyBUaGlzIGlzIG1vcmUgYWdncmVzc2l2ZSB0aGFuIGlkZWFsLCBhbmQgdGhlIGxvbmcgdGVybSBnb2FsIGlzIHRvIG9ubHlcbiAgICAgIC8vIGhhdmUgdG8gZGV0YWNoIHRoZSBkZWxldGVkIHRyZWUgYXQgdGhlIHJvb3QuXG4gICAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcik7XG5cbiAgICAgIGlmIChmaWJlciA9PT0gZGVsZXRlZFN1YnRyZWVSb290KSB7XG4gICAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gcmV0dXJuRmliZXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXIoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICBzd2l0Y2ggKGN1cnJlbnQudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxLCBjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSwgY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufSAvLyBUT0RPOiBSZXVzZSByZWFwcGVhckxheW91dEVmZmVjdHMgdHJhdmVyc2FsIGhlcmU/XG5cblxuZnVuY3Rpb24gaW52b2tlTGF5b3V0RWZmZWN0TW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZVBhc3NpdmVFZmZlY3RNb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmliZXIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZmliZXIsIGZpYmVyLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBDT01QT05FTlRfVFlQRSA9IDA7XG52YXIgSEFTX1BTRVVET19DTEFTU19UWVBFID0gMTtcbnZhciBST0xFX1RZUEUgPSAyO1xudmFyIFRFU1RfTkFNRV9UWVBFID0gMztcbnZhciBURVhUX1RZUEUgPSA0O1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBDT01QT05FTlRfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IuY29tcG9uZW50Jyk7XG4gIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IuaGFzX3BzZXVkb19jbGFzcycpO1xuICBST0xFX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnJvbGUnKTtcbiAgVEVTVF9OQU1FX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnRlc3RfaWQnKTtcbiAgVEVYVF9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci50ZXh0Jyk7XG59XG52YXIgY29tbWl0SG9va3MgPSBbXTtcbmZ1bmN0aW9uIG9uQ29tbWl0Um9vdCQxKCkge1xuICB7XG4gICAgY29tbWl0SG9va3MuZm9yRWFjaChmdW5jdGlvbiAoY29tbWl0SG9vaykge1xuICAgICAgcmV0dXJuIGNvbW1pdEhvb2soKTtcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QWN0UXVldWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZTtcbmZ1bmN0aW9uIGlzTGVnYWN5QWN0RW52aXJvbm1lbnQoZmliZXIpIHtcbiAge1xuICAgIC8vIExlZ2FjeSBtb2RlLiBXZSBwcmVzZXJ2ZSB0aGUgYmVoYXZpb3Igb2YgUmVhY3QgMTcncyBhY3QuIEl0IGFzc3VtZXMgYW5cbiAgICAvLyBhY3QgZW52aXJvbm1lbnQgd2hlbmV2ZXIgYGplc3RgIGlzIGRlZmluZWQsIGJ1dCB5b3UgY2FuIHN0aWxsIHR1cm4gb2ZmXG4gICAgLy8gc3B1cmlvdXMgd2FybmluZ3MgYnkgc2V0dGluZyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZXhwbGljaXRseVxuICAgIC8vIHRvIGZhbHNlLlxuICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPSAvLyAkRmxvd0V4cGVjdGVkRXJyb3Ig4oCTIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBnbG9iYWxcbiAgICB0eXBlb2YgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UICE9PSAndW5kZWZpbmVkJyA/IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCA6IHVuZGVmaW5lZDsgLy8gJEZsb3dFeHBlY3RlZEVycm9yIC0gRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgamVzdFxuXG4gICAgdmFyIGplc3RJc0RlZmluZWQgPSB0eXBlb2YgamVzdCAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgcmV0dXJuICBqZXN0SXNEZWZpbmVkICYmIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCAhPT0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkge1xuICB7XG4gICAgdmFyIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCA9IC8vICRGbG93RXhwZWN0ZWRFcnJvciDigJMgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGdsb2JhbFxuICAgIHR5cGVvZiBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgIT09ICd1bmRlZmluZWQnID8gSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSW5jbHVkZSBsaW5rIHRvIHJlbGV2YW50IGRvY3VtZW50YXRpb24gcGFnZS5cbiAgICAgIGVycm9yKCdUaGUgY3VycmVudCB0ZXN0aW5nIGVudmlyb25tZW50IGlzIG5vdCBjb25maWd1cmVkIHRvIHN1cHBvcnQgJyArICdhY3QoLi4uKScpO1xuICAgIH1cblxuICAgIHJldHVybiBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWw7XG4gIH1cbn1cblxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBSZWFjdEN1cnJlbnRPd25lciQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXIsXG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZTtcbnZhciBOb0NvbnRleHQgPVxuLyogICAgICAgICAgICAgKi9cbjA7XG52YXIgQmF0Y2hlZENvbnRleHQgPVxuLyogICAgICAgICAgICAgICAqL1xuMTtcbnZhciBSZW5kZXJDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICovXG4yO1xudmFyIENvbW1pdENvbnRleHQgPVxuLyogICAgICAgICAgICAgICAgKi9cbjQ7XG52YXIgUm9vdEluUHJvZ3Jlc3MgPSAwO1xudmFyIFJvb3RGYXRhbEVycm9yZWQgPSAxO1xudmFyIFJvb3RFcnJvcmVkID0gMjtcbnZhciBSb290U3VzcGVuZGVkID0gMztcbnZhciBSb290U3VzcGVuZGVkV2l0aERlbGF5ID0gNDtcbnZhciBSb290Q29tcGxldGVkID0gNTtcbnZhciBSb290RGlkTm90Q29tcGxldGUgPSA2OyAvLyBEZXNjcmliZXMgd2hlcmUgd2UgYXJlIGluIHRoZSBSZWFjdCBleGVjdXRpb24gc3RhY2tcblxudmFyIGV4ZWN1dGlvbkNvbnRleHQgPSBOb0NvbnRleHQ7IC8vIFRoZSByb290IHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7IC8vIFRoZSBmaWJlciB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7IC8vIFRoZSBsYW5lcyB3ZSdyZSByZW5kZXJpbmdcblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gU3RhY2sgdGhhdCBhbGxvd3MgY29tcG9uZW50cyB0byBjaGFuZ2UgdGhlIHJlbmRlciBsYW5lcyBmb3IgaXRzIHN1YnRyZWVcbi8vIFRoaXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCB3b3JraW5nIG9uIGF0IHRoZSByb290LiBUaGUgb25seVxuLy8gY2FzZSB3aGVyZSBpdCdzIGRpZmZlcmVudCBmcm9tIGB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc2AgaXMgd2hlbiB3ZVxuLy8gZW50ZXIgYSBzdWJ0cmVlIHRoYXQgaXMgaGlkZGVuIGFuZCBuZWVkcyB0byBiZSB1bmhpZGRlbjogU3VzcGVuc2UgYW5kXG4vLyBPZmZzY3JlZW4gY29tcG9uZW50LlxuLy9cbi8vIE1vc3QgdGhpbmdzIGluIHRoZSB3b3JrIGxvb3Agc2hvdWxkIGRlYWwgd2l0aCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcy5cbi8vIE1vc3QgdGhpbmdzIGluIGJlZ2luL2NvbXBsZXRlIHBoYXNlcyBzaG91bGQgZGVhbCB3aXRoIHN1YnRyZWVSZW5kZXJMYW5lcy5cblxudmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG52YXIgc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5vTGFuZXMpOyAvLyBXaGV0aGVyIHRvIHJvb3QgY29tcGxldGVkLCBlcnJvcmVkLCBzdXNwZW5kZWQsIGV0Yy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzczsgLy8gQSBmYXRhbCBlcnJvciwgaWYgb25lIGlzIHRocm93blxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7IC8vIFwiSW5jbHVkZWRcIiBsYW5lcyByZWZlciB0byBsYW5lcyB0aGF0IHdlcmUgd29ya2VkIG9uIGR1cmluZyB0aGlzIHJlbmRlci4gSXQnc1xuLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gYHJlbmRlckxhbmVzYCBiZWNhdXNlIGByZW5kZXJMYW5lc2AgY2FuIGNoYW5nZSBhcyB5b3Vcbi8vIGVudGVyIGFuZCBleGl0IGFuIE9mZnNjcmVlbiB0cmVlLiBUaGlzIHZhbHVlIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgcmVuZGVyXG4vLyBsYW5lcyBmb3IgdGhlIGVudGlyZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmsgbGVmdCBvdmVyIGJ5IGNvbXBvbmVudHMgdGhhdCB3ZXJlIHZpc2l0ZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBPbmx5XG4vLyBpbmNsdWRlcyB1bnByb2Nlc3NlZCB1cGRhdGVzLCBub3Qgd29yayBpbiBiYWlsZWQgb3V0IGNoaWxkcmVuLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgKGluIGFuIGludGVybGVhdmVkIGV2ZW50KSBkdXJpbmcgdGhpcyByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IE5vTGFuZXM7IC8vIExhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlICgqbm90KiBhbiBpbnRlcmxlYXZlZCBldmVudCkuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7IC8vIEVycm9ycyB0aGF0IGFyZSB0aHJvd24gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbDsgLy8gVGhlc2UgYXJlIGVycm9ycyB0aGF0IHdlIHJlY292ZXJlZCBmcm9tIHdpdGhvdXQgc3VyZmFjaW5nIHRoZW0gdG8gdGhlIFVJLlxuLy8gV2Ugd2lsbCBsb2cgdGhlbSBvbmNlIHRoZSB0cmVlIGNvbW1pdHMuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IG51bGw7IC8vIFRoZSBtb3N0IHJlY2VudCB0aW1lIHdlIGNvbW1pdHRlZCBhIGZhbGxiYWNrLiBUaGlzIGxldHMgdXMgZW5zdXJlIGEgdHJhaW5cbi8vIG1vZGVsIHdoZXJlIHdlIGRvbid0IGNvbW1pdCBuZXcgbG9hZGluZyBzdGF0ZXMgaW4gdG9vIHF1aWNrIHN1Y2Nlc3Npb24uXG5cbnZhciBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gMDtcbnZhciBGQUxMQkFDS19USFJPVFRMRV9NUyA9IDUwMDsgLy8gVGhlIGFic29sdXRlIHRpbWUgZm9yIHdoZW4gd2Ugc2hvdWxkIHN0YXJ0IGdpdmluZyB1cCBvbiByZW5kZXJpbmdcbi8vIG1vcmUgYW5kIHByZWZlciBDUFUgc3VzcGVuc2UgaGV1cmlzdGljcyBpbnN0ZWFkLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSA9IEluZmluaXR5OyAvLyBIb3cgbG9uZyBhIHJlbmRlciBpcyBzdXBwb3NlZCB0byB0YWtlIGJlZm9yZSB3ZSBzdGFydCBmb2xsb3dpbmcgQ1BVXG4vLyBzdXNwZW5zZSBoZXVyaXN0aWNzIGFuZCBvcHQgb3V0IG9mIHJlbmRlcmluZyBtb3JlIGNvbnRlbnQuXG5cbnZhciBSRU5ERVJfVElNRU9VVF9NUyA9IDUwMDtcbnZhciB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzZXRSZW5kZXJUaW1lcigpIHtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSA9IG5vdygpICsgUkVOREVSX1RJTUVPVVRfTVM7XG59XG5cbmZ1bmN0aW9uIGdldFJlbmRlclRhcmdldFRpbWUoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lO1xufVxudmFyIGhhc1VuY2F1Z2h0RXJyb3IgPSBmYWxzZTtcbnZhciBmaXJzdFVuY2F1Z2h0RXJyb3IgPSBudWxsO1xudmFyIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbDsgLy8gT25seSB1c2VkIHdoZW4gZW5hYmxlUHJvZmlsZXJOZXN0ZWRVcGRhdGVTY2hlZHVsZWRIb29rIGlzIHRydWU7XG52YXIgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IG51bGw7XG52YXIgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBOb0xhbmVzO1xudmFyIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107XG52YXIgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7IC8vIFVzZSB0aGVzZSB0byBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3Agb2YgbmVzdGVkIHVwZGF0ZXNcblxudmFyIE5FU1RFRF9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG52YXIgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gbnVsbDtcbnZhciBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbnZhciByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDsgLy8gSWYgdHdvIHVwZGF0ZXMgYXJlIHNjaGVkdWxlZCB3aXRoaW4gdGhlIHNhbWUgZXZlbnQsIHdlIHNob3VsZCB0cmVhdCB0aGVpclxuLy8gZXZlbnQgdGltZXMgYXMgc2ltdWx0YW5lb3VzLCBldmVuIGlmIHRoZSBhY3R1YWwgY2xvY2sgdGltZSBoYXMgYWR2YW5jZWRcbi8vIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2FsbC5cblxudmFyIGN1cnJlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcbnZhciBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IE5vTGFuZXM7XG52YXIgaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3Q7XG59XG5mdW5jdGlvbiByZXF1ZXN0RXZlbnRUaW1lKCkge1xuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgLy8gV2UncmUgaW5zaWRlIFJlYWN0LCBzbyBpdCdzIGZpbmUgdG8gcmVhZCB0aGUgYWN0dWFsIHRpbWUuXG4gICAgcmV0dXJuIG5vdygpO1xuICB9IC8vIFdlJ3JlIG5vdCBpbnNpZGUgUmVhY3QsIHNvIHdlIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgYnJvd3NlciBldmVudC5cblxuXG4gIGlmIChjdXJyZW50RXZlbnRUaW1lICE9PSBOb1RpbWVzdGFtcCkge1xuICAgIC8vIFVzZSB0aGUgc2FtZSBzdGFydCB0aW1lIGZvciBhbGwgdXBkYXRlcyB1bnRpbCB3ZSBlbnRlciBSZWFjdCBhZ2Fpbi5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbiAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgc2luY2UgUmVhY3QgeWllbGRlZC4gQ29tcHV0ZSBhIG5ldyBzdGFydCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IG5vdygpO1xuICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKSB7XG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIFN5bmNMYW5lO1xuICB9IGVsc2UgaWYgKCAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQgJiYgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gVGhlc2UgYXJlIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC4gVGhlXG4gICAgLy8gb2xkIGJlaGF2aW9yIGlzIHRvIGdpdmUgdGhpcyB0aGUgc2FtZSBcInRocmVhZFwiIChsYW5lcykgYXNcbiAgICAvLyB3aGF0ZXZlciBpcyBjdXJyZW50bHkgcmVuZGVyaW5nLiBTbyBpZiB5b3UgY2FsbCBgc2V0U3RhdGVgIG9uIGEgY29tcG9uZW50XG4gICAgLy8gdGhhdCBoYXBwZW5zIGxhdGVyIGluIHRoZSBzYW1lIHJlbmRlciwgaXQgd2lsbCBmbHVzaC4gSWRlYWxseSwgd2Ugd2FudCB0b1xuICAgIC8vIHJlbW92ZSB0aGUgc3BlY2lhbCBjYXNlIGFuZCB0cmVhdCB0aGVtIGFzIGlmIHRoZXkgY2FtZSBmcm9tIGFuXG4gICAgLy8gaW50ZXJsZWF2ZWQgZXZlbnQuIFJlZ2FyZGxlc3MsIHRoaXMgcGF0dGVybiBpcyBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQuXG4gICAgLy8gVGhpcyBiZWhhdmlvciBpcyBvbmx5IGEgZmFsbGJhY2suIFRoZSBmbGFnIG9ubHkgZXhpc3RzIHVudGlsIHdlIGNhbiByb2xsXG4gICAgLy8gb3V0IHRoZSBzZXRTdGF0ZSB3YXJuaW5nLCBzaW5jZSBleGlzdGluZyBjb2RlIG1pZ2h0IGFjY2lkZW50YWxseSByZWx5IG9uXG4gICAgLy8gdGhlIGN1cnJlbnQgYmVoYXZpb3IuXG4gICAgcmV0dXJuIHBpY2tBcmJpdHJhcnlMYW5lKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBpc1RyYW5zaXRpb24gPSByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSAhPT0gTm9UcmFuc2l0aW9uO1xuXG4gIGlmIChpc1RyYW5zaXRpb24pIHtcbiAgICBpZiAoIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgICAgIGlmICghdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmFkZChmaWJlcik7XG4gICAgfSAvLyBUaGUgYWxnb3JpdGhtIGZvciBhc3NpZ25pbmcgYW4gdXBkYXRlIHRvIGEgbGFuZSBzaG91bGQgYmUgc3RhYmxlIGZvciBhbGxcbiAgICAvLyB1cGRhdGVzIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGhpbiB0aGUgc2FtZSBldmVudC4gVG8gZG8gdGhpcywgdGhlXG4gICAgLy8gaW5wdXRzIHRvIHRoZSBhbGdvcml0aG0gbXVzdCBiZSB0aGUgc2FtZS5cbiAgICAvL1xuICAgIC8vIFRoZSB0cmljayB3ZSB1c2UgaXMgdG8gY2FjaGUgdGhlIGZpcnN0IG9mIGVhY2ggb2YgdGhlc2UgaW5wdXRzIHdpdGhpbiBhblxuICAgIC8vIGV2ZW50LiBUaGVuIHJlc2V0IHRoZSBjYWNoZWQgdmFsdWVzIG9uY2Ugd2UgY2FuIGJlIHN1cmUgdGhlIGV2ZW50IGlzXG4gICAgLy8gb3Zlci4gT3VyIGhldXJpc3RpYyBmb3IgdGhhdCBpcyB3aGVuZXZlciB3ZSBlbnRlciBhIGNvbmN1cnJlbnQgd29yayBsb29wLlxuXG5cbiAgICBpZiAoY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPT09IE5vTGFuZSkge1xuICAgICAgLy8gQWxsIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUgc2FtZSBldmVudCBhcmUgYXNzaWduZWQgdGhlIHNhbWUgbGFuZS5cbiAgICAgIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmU7XG4gIH0gLy8gVXBkYXRlcyBvcmlnaW5hdGluZyBpbnNpZGUgY2VydGFpbiBSZWFjdCBtZXRob2RzLCBsaWtlIGZsdXNoU3luYywgaGF2ZVxuICAvLyB0aGVpciBwcmlvcml0eSBzZXQgYnkgdHJhY2tpbmcgaXQgd2l0aCBhIGNvbnRleHQgdmFyaWFibGUuXG4gIC8vXG4gIC8vIFRoZSBvcGFxdWUgdHlwZSByZXR1cm5lZCBieSB0aGUgaG9zdCBjb25maWcgaXMgaW50ZXJuYWxseSBhIGxhbmUsIHNvIHdlIGNhblxuICAvLyB1c2UgdGhhdCBkaXJlY3RseS5cbiAgLy8gVE9ETzogTW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiB0byB0aGUgZXZlbnQgcHJpb3JpdHkgbW9kdWxlLlxuXG5cbiAgdmFyIHVwZGF0ZUxhbmUgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICBpZiAodXBkYXRlTGFuZSAhPT0gTm9MYW5lKSB7XG4gICAgcmV0dXJuIHVwZGF0ZUxhbmU7XG4gIH0gLy8gVGhpcyB1cGRhdGUgb3JpZ2luYXRlZCBvdXRzaWRlIFJlYWN0LiBBc2sgdGhlIGhvc3QgZW52aXJvbm1lbnQgZm9yIGFuXG4gIC8vIGFwcHJvcHJpYXRlIHByaW9yaXR5LCBiYXNlZCBvbiB0aGUgdHlwZSBvZiBldmVudC5cbiAgLy9cbiAgLy8gVGhlIG9wYXF1ZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbmZpZyBpcyBpbnRlcm5hbGx5IGEgbGFuZSwgc28gd2UgY2FuXG4gIC8vIHVzZSB0aGF0IGRpcmVjdGx5LlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIHRvIHRoZSBldmVudCBwcmlvcml0eSBtb2R1bGUuXG5cblxuICB2YXIgZXZlbnRMYW5lID0gZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkoKTtcbiAgcmV0dXJuIGV2ZW50TGFuZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFJldHJ5TGFuZShmaWJlcikge1xuICAvLyBUaGlzIGlzIGEgZm9yayBvZiBgcmVxdWVzdFVwZGF0ZUxhbmVgIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgU3VzcGVuc2VcbiAgLy8gXCJyZXRyaWVzXCIg4oCUIGEgc3BlY2lhbCB1cGRhdGUgdGhhdCBhdHRlbXB0cyB0byBmbGlwIGEgU3VzcGVuc2UgYm91bmRhcnlcbiAgLy8gZnJvbSBpdHMgcGxhY2Vob2xkZXIgc3RhdGUgdG8gaXRzIHByaW1hcnkvcmVzb2x2ZWQgc3RhdGUuXG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIFN5bmNMYW5lO1xuICB9XG5cbiAgcmV0dXJuIGNsYWltTmV4dFJldHJ5TGFuZSgpO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSkge1xuICBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKTtcblxuICB7XG4gICAgaWYgKGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCkge1xuICAgICAgZXJyb3IoJ3VzZUluc2VydGlvbkVmZmVjdCBtdXN0IG5vdCBzY2hlZHVsZSB1cGRhdGVzLicpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICB9XG4gIH0gLy8gTWFyayB0aGF0IHRoZSByb290IGhhcyBhIHBlbmRpbmcgdXBkYXRlLlxuXG5cbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vTGFuZXMgJiYgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgLy8gVGhpcyB1cGRhdGUgd2FzIGRpc3BhdGNoZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIFRoaXMgaXMgYSBtaXN0YWtlXG4gICAgLy8gaWYgdGhlIHVwZGF0ZSBvcmlnaW5hdGVzIGZyb20gdXNlciBzcGFjZSAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIGxvY2FsXG4gICAgLy8gaG9vayB1cGRhdGVzLCB3aGljaCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBhbmQgZG9uJ3QgcmVhY2ggdGhpc1xuICAgIC8vIGZ1bmN0aW9uKSwgYnV0IHRoZXJlIGFyZSBzb21lIGludGVybmFsIFJlYWN0IGZlYXR1cmVzIHRoYXQgdXNlIHRoaXMgYXNcbiAgICAvLyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIGxpa2Ugc2VsZWN0aXZlIGh5ZHJhdGlvbi5cbiAgICB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcik7IC8vIFRyYWNrIGxhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlXG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIG5vcm1hbCB1cGRhdGUsIHNjaGVkdWxlZCBmcm9tIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS4gRm9yXG4gICAgLy8gZXhhbXBsZSwgZHVyaW5nIGFuIGlucHV0IGV2ZW50LlxuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdhcm5JZlVwZGF0ZXNOb3RXcmFwcGVkV2l0aEFjdERFVihmaWJlcik7XG5cbiAgICBpZiAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgICAvLyBSZWNlaXZlZCBhbiB1cGRhdGUgdG8gYSB0cmVlIHRoYXQncyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlcmluZy4gTWFya1xuICAgICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlIHdvcmsgb24gdGhpcyByb290LiBVbmxlc3MgdGhlXG4gICAgICAvLyBgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoYCBmbGFnIGlzIG9mZiBhbmQgdGhpcyBpcyBhIHJlbmRlclxuICAgICAgLy8gcGhhc2UgdXBkYXRlLiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHRyZWF0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGFzIGlmXG4gICAgICAvLyB0aGV5IHdlcmUgaW50ZXJsZWF2ZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMuXG4gICAgICBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMsIGxhbmUpO1xuICAgICAgfVxuXG4gICAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgICAgICAvLyBUaGUgcm9vdCBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHdoaWNoIG1lYW5zIHRoaXMgcmVuZGVyXG4gICAgICAgIC8vIGRlZmluaXRlbHkgd29uJ3QgZmluaXNoLiBTaW5jZSB3ZSBoYXZlIGEgbmV3IHVwZGF0ZSwgbGV0J3MgbWFyayBpdCBhc1xuICAgICAgICAvLyBzdXNwZW5kZWQgbm93LCByaWdodCBiZWZvcmUgbWFya2luZyB0aGUgaW5jb21pbmcgdXBkYXRlLiBUaGlzIGhhcyB0aGVcbiAgICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCByZW5kZXIgYW5kIHN3aXRjaGluZyB0byB0aGUgdXBkYXRlLlxuICAgICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IG92ZXJyaWRlIHBpbmdzIHRoYXQgaGFwcGVuIHdoaWxlIHdlJ3ZlXG4gICAgICAgIC8vIGFscmVhZHkgc3RhcnRlZCByZW5kZXJpbmcuXG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuXG4gICAgaWYgKGxhbmUgPT09IFN5bmNMYW5lICYmIGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCAmJiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgLy8gRmx1c2ggdGhlIHN5bmNocm9ub3VzIHdvcmsgbm93LCB1bmxlc3Mgd2UncmUgYWxyZWFkeSB3b3JraW5nIG9yIGluc2lkZVxuICAgICAgLy8gYSBiYXRjaC4gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGluc2lkZSBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgaW5zdGVhZCBvZlxuICAgICAgLy8gc2NoZWR1bGVDYWxsYmFja0ZvckZpYmVyIHRvIHByZXNlcnZlIHRoZSBhYmlsaXR5IHRvIHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAgICAgIC8vIHdpdGhvdXQgaW1tZWRpYXRlbHkgZmx1c2hpbmcgaXQuIFdlIG9ubHkgZG8gdGhpcyBmb3IgdXNlci1pbml0aWF0ZWRcbiAgICAgIC8vIHVwZGF0ZXMsIHRvIHByZXNlcnZlIGhpc3RvcmljYWwgYmVoYXZpb3Igb2YgbGVnYWN5IG1vZGUuXG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUluaXRpYWxIeWRyYXRpb25PblJvb3Qocm9vdCwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGZvcmsgb2Ygc2NoZWR1bGVVcGRhdGVPbkZpYmVyIHRoYXQgaXMgb25seSB1c2VkIHRvXG4gIC8vIHNjaGVkdWxlIHRoZSBpbml0aWFsIGh5ZHJhdGlvbiBvZiBhIHJvb3QgdGhhdCBoYXMganVzdCBiZWVuIGNyZWF0ZWQuIE1vc3RcbiAgLy8gb2YgdGhlIHN0dWZmIGluIHNjaGVkdWxlVXBkYXRlT25GaWJlciBjYW4gYmUgc2tpcHBlZC5cbiAgLy9cbiAgLy8gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIHNlcGFyYXRlIHBhdGgsIHRob3VnaCwgaXMgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gIC8vIGluaXRpYWwgY2hpbGRyZW4gZnJvbSBzdWJzZXF1ZW50IHVwZGF0ZXMuIEluIGZ1bGx5IGNsaWVudC1yZW5kZXJlZCByb290c1xuICAvLyAoY3JlYXRlUm9vdCBpbnN0ZWFkIG9mIGh5ZHJhdGVSb290KSwgYWxsIHRvcC1sZXZlbCByZW5kZXJzIGFyZSBtb2RlbGVkIGFzXG4gIC8vIHVwZGF0ZXMsIGJ1dCBoeWRyYXRpb24gcm9vdHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGUgaW5pdGlhbCByZW5kZXIgbXVzdFxuICAvLyBtYXRjaCB3aGF0IHdhcyByZW5kZXJlZCBvbiB0aGUgc2VydmVyLlxuICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgY3VycmVudC5sYW5lcyA9IGxhbmU7XG4gIG1hcmtSb290VXBkYXRlZChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn1cbmZ1bmN0aW9uIGlzVW5zYWZlQ2xhc3NSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikge1xuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gT25seSBjYWxsZWQgYnkgY2xhc3MgY29tcG9uZW50cyxcbiAgLy8gd2hpY2ggc3BlY2lhbCAoZGVwcmVjYXRlZCkgYmVoYXZpb3IgZm9yIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZSBwcm9wcy5cbiAgcmV0dXJuICgvLyBUT0RPOiBSZW1vdmUgb3V0ZGF0ZWQgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoIGV4cGVyaW1lbnQuIFdlXG4gICAgLy8gZGVjaWRlZCBub3QgdG8gZW5hYmxlIGl0LlxuICAgICAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHRcbiAgKTtcbn0gLy8gVXNlIHRoaXMgZnVuY3Rpb24gdG8gc2NoZWR1bGUgYSB0YXNrIGZvciBhIHJvb3QuIFRoZXJlJ3Mgb25seSBvbmUgdGFzayBwZXJcbi8vIHJvb3Q7IGlmIGEgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQsIHdlJ2xsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcHJpb3JpdHlcbi8vIG9mIHRoZSBleGlzdGluZyB0YXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV4dCBsZXZlbCB0aGF0IHRoZVxuLy8gcm9vdCBoYXMgd29yayBvbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZXZlcnkgdXBkYXRlLCBhbmQgcmlnaHQgYmVmb3JlXG4vLyBleGl0aW5nIGEgdGFzay5cblxuZnVuY3Rpb24gZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIHZhciBleGlzdGluZ0NhbGxiYWNrTm9kZSA9IHJvb3QuY2FsbGJhY2tOb2RlOyAvLyBDaGVjayBpZiBhbnkgbGFuZXMgYXJlIGJlaW5nIHN0YXJ2ZWQgYnkgb3RoZXIgd29yay4gSWYgc28sIG1hcmsgdGhlbSBhc1xuICAvLyBleHBpcmVkIHNvIHdlIGtub3cgdG8gd29yayBvbiB0aG9zZSBuZXh0LlxuXG4gIG1hcmtTdGFydmVkTGFuZXNBc0V4cGlyZWQocm9vdCwgY3VycmVudFRpbWUpOyAvLyBEZXRlcm1pbmUgdGhlIG5leHQgbGFuZXMgdG8gd29yayBvbiwgYW5kIHRoZWlyIHByaW9yaXR5LlxuXG4gIHZhciBuZXh0TGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ID8gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgOiBOb0xhbmVzKTtcblxuICBpZiAobmV4dExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBUaGVyZSdzIG5vdGhpbmcgdG8gd29yayBvbi5cbiAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbENhbGxiYWNrJDEoZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICAgIH1cblxuICAgIHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7XG4gICAgcmV0dXJuO1xuICB9IC8vIFdlIHVzZSB0aGUgaGlnaGVzdCBwcmlvcml0eSBsYW5lIHRvIHJlcHJlc2VudCB0aGUgcHJpb3JpdHkgb2YgdGhlIGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrUHJpb3JpdHkgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKG5leHRMYW5lcyk7IC8vIENoZWNrIGlmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgdGFzay4gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgaXQuXG5cbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tQcmlvcml0eSA9IHJvb3QuY2FsbGJhY2tQcmlvcml0eTtcblxuICBpZiAoZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID09PSBuZXdDYWxsYmFja1ByaW9yaXR5ICYmIC8vIFNwZWNpYWwgY2FzZSByZWxhdGVkIHRvIGBhY3RgLiBJZiB0aGUgY3VycmVudGx5IHNjaGVkdWxlZCB0YXNrIGlzIGFcbiAgLy8gU2NoZWR1bGVyIHRhc2ssIHJhdGhlciB0aGFuIGFuIGBhY3RgIHRhc2ssIGNhbmNlbCBpdCBhbmQgcmUtc2NoZWR1bGVkXG4gIC8vIG9uIHRoZSBgYWN0YCBxdWV1ZS5cbiAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsICYmIGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSkge1xuICAgIHtcbiAgICAgIC8vIElmIHdlJ3JlIGdvaW5nIHRvIHJlLXVzZSBhbiBleGlzdGluZyB0YXNrLCBpdCBuZWVkcyB0byBleGlzdC5cbiAgICAgIC8vIEFzc3VtZSB0aGF0IGRpc2NyZXRlIHVwZGF0ZSBtaWNyb3Rhc2tzIGFyZSBub24tY2FuY2VsbGFibGUgYW5kIG51bGwuXG4gICAgICAvLyBUT0RPOiBUZW1wb3JhcnkgdW50aWwgd2UgY29uZmlybSB0aGlzIHdhcm5pbmcgaXMgbm90IGZpcmVkLlxuICAgICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlID09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ICE9PSBTeW5jTGFuZSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgc2NoZWR1bGVkIGNhbGxiYWNrIHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfVxuICAgIH0gLy8gVGhlIHByaW9yaXR5IGhhc24ndCBjaGFuZ2VkLiBXZSBjYW4gcmV1c2UgdGhlIGV4aXN0aW5nIHRhc2suIEV4aXQuXG5cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPSBudWxsKSB7XG4gICAgLy8gQ2FuY2VsIHRoZSBleGlzdGluZyBjYWxsYmFjay4gV2UnbGwgc2NoZWR1bGUgYSBuZXcgb25lIGJlbG93LlxuICAgIGNhbmNlbENhbGxiYWNrJDEoZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICB9IC8vIFNjaGVkdWxlIGEgbmV3IGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrTm9kZTtcblxuICBpZiAobmV3Q2FsbGJhY2tQcmlvcml0eSA9PT0gU3luY0xhbmUpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFN5bmMgUmVhY3QgY2FsbGJhY2tzIGFyZSBzY2hlZHVsZWQgb24gYSBzcGVjaWFsXG4gICAgLy8gaW50ZXJuYWwgcXVldWVcbiAgICBpZiAocm9vdC50YWcgPT09IExlZ2FjeVJvb3QpIHtcbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5ICE9PSBudWxsKSB7XG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZUxlZ2FjeVN5bmNDYWxsYmFjayhwZXJmb3JtU3luY1dvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVkdWxlU3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBGbHVzaCB0aGUgcXVldWUgaW4gYSBtaWNyb3Rhc2suXG4gICAgICBpZiAoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJbnNpZGUgYGFjdGAsIHVzZSBvdXIgaW50ZXJuYWwgYGFjdGAgcXVldWUgc28gdGhhdCB0aGVzZSBnZXQgZmx1c2hlZFxuICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNjb3BlIGV2ZW4gd2hlbiB1c2luZyB0aGUgc3luYyB2ZXJzaW9uXG4gICAgICAgIC8vIG9mIGBhY3RgLlxuICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQucHVzaChmbHVzaFN5bmNDYWxsYmFja3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIEluIFNhZmFyaSwgYXBwZW5kaW5nIGFuIGlmcmFtZSBmb3JjZXMgbWljcm90YXNrcyB0byBydW4uXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMjQ1OVxuICAgICAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcnVubmluZyBjYWxsYmFja3MgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJcbiAgICAgICAgICAvLyBvciBjb21taXQgc28gd2UgbmVlZCB0byBjaGVjayBhZ2FpbnN0IHRoYXQuXG4gICAgICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgd291bGQgc3RpbGwgcHJlbWF0dXJlbHkgZmx1c2ggdGhlIGNhbGxiYWNrc1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBoYXBwZW5zIG91dHNpZGUgcmVuZGVyIG9yIGNvbW1pdCBwaGFzZSAoZS5nLiBpbiBhbiBldmVudCkuXG4gICAgICAgICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNjaGVkdWxlclByaW9yaXR5TGV2ZWw7XG5cbiAgICBzd2l0Y2ggKGxhbmVzVG9FdmVudFByaW9yaXR5KG5leHRMYW5lcykpIHtcbiAgICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSWRsZVByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBuZXdDYWxsYmFja05vZGUgPSBzY2hlZHVsZUNhbGxiYWNrJDEoc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCwgcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICB9XG5cbiAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gbmV3Q2FsbGJhY2tQcmlvcml0eTtcbiAgcm9vdC5jYWxsYmFja05vZGUgPSBuZXdDYWxsYmFja05vZGU7XG59IC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBldmVyeSBjb25jdXJyZW50IHRhc2ssIGkuZS4gYW55dGhpbmcgdGhhdFxuLy8gZ29lcyB0aHJvdWdoIFNjaGVkdWxlci5cblxuXG5mdW5jdGlvbiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3Qocm9vdCwgZGlkVGltZW91dCkge1xuICB7XG4gICAgcmVzZXROZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH0gLy8gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBhIFJlYWN0IGV2ZW50LCB3ZSBjYW4gY2xlYXIgdGhlIGN1cnJlbnRcbiAgLy8gZXZlbnQgdGltZS4gVGhlIG5leHQgdXBkYXRlIHdpbGwgY29tcHV0ZSBhIG5ldyBldmVudCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH0gLy8gRmx1c2ggYW55IHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGJlZm9yZSBkZWNpZGluZyB3aGljaCBsYW5lcyB0byB3b3JrIG9uLFxuICAvLyBpbiBjYXNlIHRoZXkgc2NoZWR1bGUgYWRkaXRpb25hbCB3b3JrLlxuXG5cbiAgdmFyIG9yaWdpbmFsQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7XG4gIHZhciBkaWRGbHVzaFBhc3NpdmVFZmZlY3RzID0gZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuXG4gIGlmIChkaWRGbHVzaFBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoZSBwYXNzaXZlIGVmZmVjdCBwaGFzZSBtYXkgaGF2ZSBjYW5jZWxlZCB0aGUgY3VycmVudCB0YXNrLlxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXNrIG5vZGUgZm9yIHRoaXMgcm9vdCB3YXMgY2hhbmdlZC5cbiAgICBpZiAocm9vdC5jYWxsYmFja05vZGUgIT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0YXNrIHdhcyBjYW5jZWxlZC4gRXhpdC4gV2UgZG9uJ3QgbmVlZCB0byBjYWxsXG4gICAgICAvLyBgZW5zdXJlUm9vdElzU2NoZWR1bGVkYCBiZWNhdXNlIHRoZSBjaGVjayBhYm92ZSBpbXBsaWVzIGVpdGhlciB0aGF0XG4gICAgICAvLyB0aGVyZSdzIGEgbmV3IHRhc2ssIG9yIHRoYXQgdGhlcmUncyBubyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGxhbmVzIHRvIHdvcmsgb24sIHVzaW5nIHRoZSBmaWVsZHMgc3RvcmVkXG4gIC8vIG9uIHRoZSByb290LlxuXG5cbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzIDogTm9MYW5lcyk7XG5cbiAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gRGVmZW5zaXZlIGNvZGluZy4gVGhpcyBpcyBuZXZlciBleHBlY3RlZCB0byBoYXBwZW4uXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gV2UgZGlzYWJsZSB0aW1lLXNsaWNpbmcgaW4gc29tZSBjYXNlczogaWYgdGhlIHdvcmsgaGFzIGJlZW4gQ1BVLWJvdW5kXG4gIC8vIGZvciB0b28gbG9uZyAoXCJleHBpcmVkXCIgd29yaywgdG8gcHJldmVudCBzdGFydmF0aW9uKSwgb3Igd2UncmUgaW5cbiAgLy8gc3luYy11cGRhdGVzLWJ5LWRlZmF1bHQgbW9kZS5cbiAgLy8gVE9ETzogV2Ugb25seSBjaGVjayBgZGlkVGltZW91dGAgZGVmZW5zaXZlbHksIHRvIGFjY291bnQgZm9yIGEgU2NoZWR1bGVyXG4gIC8vIGJ1ZyB3ZSdyZSBzdGlsbCBpbnZlc3RpZ2F0aW5nLiBPbmNlIHRoZSBidWcgaW4gU2NoZWR1bGVyIGlzIGZpeGVkLFxuICAvLyB3ZSBjYW4gcmVtb3ZlIHRoaXMsIHNpbmNlIHdlIHRyYWNrIGV4cGlyYXRpb24gb3Vyc2VsdmVzLlxuXG5cbiAgdmFyIHNob3VsZFRpbWVTbGljZSA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykgJiYgIWluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpICYmICggIWRpZFRpbWVvdXQpO1xuICB2YXIgZXhpdFN0YXR1cyA9IHNob3VsZFRpbWVTbGljZSA/IHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSA6IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbFxuICAgICAgLy8gcmVuZGVyIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsXG4gICAgICAvLyBpbmNsdWRlcyBhbGwgcGVuZGluZyB1cGRhdGVzIGFyZSBpbmNsdWRlZC4gSWYgaXQgc3RpbGwgZmFpbHMgYWZ0ZXJcbiAgICAgIC8vIHRoZSBzZWNvbmQgYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgaWYgKGVycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdERpZE5vdENvbXBsZXRlKSB7XG4gICAgICAvLyBUaGUgcmVuZGVyIHVud291bmQgd2l0aG91dCBjb21wbGV0aW5nIHRoZSB0cmVlLiBUaGlzIGhhcHBlbnMgaW4gc3BlY2lhbFxuICAgICAgLy8gY2FzZXMgd2hlcmUgbmVlZCB0byBleGl0IHRoZSBjdXJyZW50IHJlbmRlciB3aXRob3V0IHByb2R1Y2luZyBhXG4gICAgICAvLyBjb25zaXN0ZW50IHRyZWUgb3IgY29tbWl0dGluZy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBkdXJpbmcgYSBjb25jdXJyZW50IHJlbmRlciwgbm90IGEgZGlzY3JldGUgb3JcbiAgICAgIC8vIHN5bmNocm9ub3VzIHVwZGF0ZS4gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIGZvciB0aGlzIHdoZW4gd2VcbiAgICAgIC8vIHVud291bmQgdGhlIHN0YWNrLlxuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZW5kZXIgY29tcGxldGVkLlxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyByZW5kZXIgbWF5IGhhdmUgeWllbGRlZCB0byBhIGNvbmN1cnJlbnQgZXZlbnQsIGFuZCBpZiBzbyxcbiAgICAgIC8vIGNvbmZpcm0gdGhhdCBhbnkgbmV3bHkgcmVuZGVyZWQgc3RvcmVzIGFyZSBjb25zaXN0ZW50LlxuICAgICAgLy8gVE9ETzogSXQncyBwb3NzaWJsZSB0aGF0IGV2ZW4gYSBjb25jdXJyZW50IHJlbmRlciBtYXkgbmV2ZXIgaGF2ZSB5aWVsZGVkXG4gICAgICAvLyB0byB0aGUgbWFpbiB0aHJlYWQsIGlmIGl0IHdhcyBmYXN0IGVub3VnaCwgb3IgaWYgaXQgZXhwaXJlZC4gV2UgY291bGRcbiAgICAgIC8vIHNraXAgdGhlIGNvbnNpc3RlbmN5IGNoZWNrIGluIHRoYXQgY2FzZSwgdG9vLlxuICAgICAgdmFyIHJlbmRlcldhc0NvbmN1cnJlbnQgPSAhaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpO1xuICAgICAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChyZW5kZXJXYXNDb25jdXJyZW50ICYmICFpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSkge1xuICAgICAgICAvLyBBIHN0b3JlIHdhcyBtdXRhdGVkIGluIGFuIGludGVybGVhdmVkIGV2ZW50LiBSZW5kZXIgYWdhaW4sXG4gICAgICAgIC8vIHN5bmNocm9ub3VzbHksIHRvIGJsb2NrIGZ1cnRoZXIgbXV0YXRpb25zLlxuICAgICAgICBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpOyAvLyBXZSBuZWVkIHRvIGNoZWNrIGFnYWluIGlmIHNvbWV0aGluZyB0aHJld1xuXG4gICAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICAgICAgICBpZiAoX2Vycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgbGFuZXMgPSBfZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIF9lcnJvclJldHJ5TGFuZXMpOyAvLyBXZSBhc3N1bWUgdGhlIHRyZWUgaXMgbm93IGNvbnNpc3RlbnQgYmVjYXVzZSB3ZSBkaWRuJ3QgeWllbGQgdG8gYW55XG4gICAgICAgICAgICAvLyBjb25jdXJyZW50IGV2ZW50cy5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICAgICAgICB0aHJvdyBfZmF0YWxFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gVGhlIG5leHQgc3RlcCBpcyBlaXRoZXIgdG8gY29tbWl0IGl0LFxuICAgICAgLy8gb3IsIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHdhaXQgdG8gY29tbWl0IGl0IGFmdGVyIGEgdGltZW91dC5cblxuXG4gICAgICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgICAgIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICAgICAgZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocm9vdC5jYWxsYmFja05vZGUgPT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgLy8gVGhlIHRhc2sgbm9kZSBzY2hlZHVsZWQgZm9yIHRoaXMgcm9vdCBpcyB0aGUgc2FtZSBvbmUgdGhhdCdzXG4gICAgLy8gY3VycmVudGx5IGV4ZWN1dGVkLiBOZWVkIHRvIHJldHVybiBhIGNvbnRpbnVhdGlvbi5cbiAgICByZXR1cm4gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKSB7XG4gIC8vIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24sIGRpc2NhcmQgc2VydmVyIHJlc3BvbnNlIGFuZCBmYWxsXG4gIC8vIGJhY2sgdG8gY2xpZW50IHNpZGUgcmVuZGVyLlxuICAvLyBCZWZvcmUgcmVuZGVyaW5nIGFnYWluLCBzYXZlIHRoZSBlcnJvcnMgZnJvbSB0aGUgcHJldmlvdXMgYXR0ZW1wdC5cbiAgdmFyIGVycm9yc0Zyb21GaXJzdEF0dGVtcHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzO1xuXG4gIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgLy8gVGhlIHNoZWxsIGZhaWxlZCB0byBoeWRyYXRlLiBTZXQgYSBmbGFnIHRvIGZvcmNlIGEgY2xpZW50IHJlbmRlcmluZ1xuICAgIC8vIGR1cmluZyB0aGUgbmV4dCBhdHRlbXB0LiBUbyBkbyB0aGlzLCB3ZSBjYWxsIHByZXBhcmVGcmVzaFN0YWNrIG5vd1xuICAgIC8vIHRvIGNyZWF0ZSB0aGUgcm9vdCB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBUaGlzIGlzIGEgYml0IHdlaXJkIGluIHRlcm1zXG4gICAgLy8gb2YgZmFjdG9yaW5nLCBiZWNhdXNlIGl0IHJlbGllcyBvbiByZW5kZXJSb290U3luYyBub3QgY2FsbGluZ1xuICAgIC8vIHByZXBhcmVGcmVzaFN0YWNrIGFnYWluIGluIHRoZSBjYWxsIGJlbG93LCB3aGljaCBoYXBwZW5zIGJlY2F1c2UgdGhlXG4gICAgLy8gcm9vdCBhbmQgbGFuZXMgaGF2ZW4ndCBjaGFuZ2VkLlxuICAgIC8vXG4gICAgLy8gVE9ETzogSSB0aGluayB3aGF0IHdlIHNob3VsZCBkbyBpcyBzZXQgRm9yY2VDbGllbnRSZW5kZXIgaW5zaWRlXG4gICAgLy8gdGhyb3dFeGNlcHRpb24sIGxpa2Ugd2UgZG8gZm9yIG5lc3RlZCBTdXNwZW5zZSBib3VuZGFyaWVzLiBUaGUgcmVhc29uXG4gICAgLy8gaXQncyBoZXJlIGluc3RlYWQgaXMgc28gd2UgY2FuIHN3aXRjaCB0byB0aGUgc3luY2hyb25vdXMgd29yayBsb29wLCB0b28uXG4gICAgLy8gU29tZXRoaW5nIHRvIGNvbnNpZGVyIGZvciBhIGZ1dHVyZSByZWZhY3Rvci5cbiAgICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICByb290V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICB7XG4gICAgICBlcnJvckh5ZHJhdGluZ0NvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEVycm9yZWQpIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgZmluaXNoZWQgcmVuZGVyaW5nIG9uIHJldHJ5XG4gICAgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBmYWlsZWQgZmlyc3QgYXR0ZW1wdCBoYXZlIGJlZW4gcmVjb3ZlcmVkLiBBZGRcbiAgICAvLyB0aGVtIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHJlY292ZXJhYmxlIGVycm9ycy4gV2UnbGwgbG9nIHRoZW0gaW4gdGhlXG4gICAgLy8gY29tbWl0IHBoYXNlLlxuICAgIHZhciBlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gZXJyb3JzRnJvbUZpcnN0QXR0ZW1wdDsgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBzZWNvbmQgYXR0ZW1wdCBzaG91bGQgYmUgcXVldWVkIGFmdGVyIHRoZSBlcnJvcnNcbiAgICAvLyBmcm9tIHRoZSBmaXJzdCBhdHRlbXB0LCB0byBwcmVzZXJ2ZSB0aGUgY2F1c2FsIHNlcXVlbmNlLlxuXG4gICAgaWYgKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0ICE9PSBudWxsKSB7XG4gICAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpdFN0YXR1cztcbn1cblxuZnVuY3Rpb24gcXVldWVSZWNvdmVyYWJsZUVycm9ycyhlcnJvcnMpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBlcnJvcnM7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMucHVzaC5hcHBseSh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgZXJyb3JzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKSB7XG4gIHN3aXRjaCAoZXhpdFN0YXR1cykge1xuICAgIGNhc2UgUm9vdEluUHJvZ3Jlc3M6XG4gICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICAvLyBGbG93IGtub3dzIGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zIGlmIEkgYWRkIGEgYnJlYWtcbiAgICAvLyBzdGF0ZW1lbnQsIGJ1dCBlc2xpbnQgZG9lc24ndCBrbm93IGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zXG4gICAgLy8gaWYgSSBkby4gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFJvb3RFcnJvcmVkOlxuICAgICAge1xuICAgICAgICAvLyBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGF0dGVtcHRlZCB0byByZXRyeSB0aGlzIHRyZWUuIElmIHdlIHJlYWNoZWRcbiAgICAgICAgLy8gdGhpcyBwb2ludCwgaXQgZXJyb3JlZCBhZ2Fpbi4gQ29tbWl0IGl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWQ6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOyAvLyBXZSBoYXZlIGFuIGFjY2VwdGFibGUgbG9hZGluZyBzdGF0ZS4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHdlXG4gICAgICAgIC8vIHNob3VsZCBpbW1lZGlhdGVseSBjb21taXQgaXQgb3Igd2FpdCBhIGJpdC5cblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgJiYgLy8gZG8gbm90IGRlbGF5IGlmIHdlJ3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZVxuICAgICAgICAhc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIHJlbmRlciBvbmx5IGluY2x1ZGVkIHJldHJpZXMsIG5vIHVwZGF0ZXMuIFRocm90dGxlIGNvbW1pdHRpbmdcbiAgICAgICAgICAvLyByZXRyaWVzIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyB0b28gbWFueSBsb2FkaW5nIHN0YXRlcyB0b28gcXVpY2tseS5cbiAgICAgICAgICB2YXIgbXNVbnRpbFRpbWVvdXQgPSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lICsgRkFMTEJBQ0tfVEhST1RUTEVfTVMgLSBub3coKTsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cbiAgICAgICAgICBpZiAobXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICAgICAgICAgICAgaWYgKG5leHRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuXG4gICAgICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhzdXNwZW5kZWRMYW5lcywgbGFuZXMpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmVmZXIgdG8gcmVuZGVyIHRoZSBmYWxsYmFjayBvZiBhdCB0aGUgbGFzdFxuICAgICAgICAgICAgICAvLyBzdXNwZW5kZWQgbGV2ZWwuIFBpbmcgdGhlIGxhc3Qgc3VzcGVuZGVkIGxldmVsIHRvIHRyeVxuICAgICAgICAgICAgICAvLyByZW5kZXJpbmcgaXQgYWdhaW4uXG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIElkbGU/IFNob3VsZCBub3QgcmVzdGFydC5cbiAgICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgICAgbWFya1Jvb3RQaW5nZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gVGhlIHJlbmRlciBpcyBzdXNwZW5kZWQsIGl0IGhhc24ndCB0aW1lZCBvdXQsIGFuZCB0aGVyZSdzIG5vXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB3b3JrIHRvIGRvLiBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cblxuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKSwgbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFRoZSB3b3JrIGV4cGlyZWQuIENvbW1pdCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdFN1c3BlbmRlZFdpdGhEZWxheTpcbiAgICAgIHtcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSB0cmFuc2l0aW9uLCBzbyB3ZSBzaG91bGQgZXhpdCB3aXRob3V0IGNvbW1pdHRpbmcgYVxuICAgICAgICAgIC8vIHBsYWNlaG9sZGVyIGFuZCB3aXRob3V0IHNjaGVkdWxpbmcgYSB0aW1lb3V0LiBEZWxheSBpbmRlZmluaXRlbHlcbiAgICAgICAgICAvLyB1bnRpbCB3ZSByZWNlaXZlIG1vcmUgZGF0YS5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHRyYW5zaXRpb24sIGJ1dCB3ZSBkaWQgdHJpZ2dlciBhbiBhdm9pZGVkIHN0YXRlLlxuICAgICAgICAgIC8vIFNjaGVkdWxlIGEgcGxhY2Vob2xkZXIgdG8gZGlzcGxheSBhZnRlciBhIHNob3J0IGRlbGF5LCB1c2luZyB0aGUgSnVzdFxuICAgICAgICAgIC8vIE5vdGljZWFibGUgRGlmZmVyZW5jZS5cbiAgICAgICAgICAvLyBUT0RPOiBJcyB0aGUgSk5EIG9wdGltaXphdGlvbiB3b3J0aCB0aGUgYWRkZWQgY29tcGxleGl0eT8gSWYgdGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBvbmx5IHJlYXNvbiB3ZSB0cmFjayB0aGUgZXZlbnQgdGltZSwgdGhlbiBwcm9iYWJseSBub3QuXG4gICAgICAgICAgLy8gQ29uc2lkZXIgcmVtb3ZpbmcuXG4gICAgICAgICAgdmFyIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICB2YXIgZXZlbnRUaW1lTXMgPSBtb3N0UmVjZW50RXZlbnRUaW1lO1xuICAgICAgICAgIHZhciB0aW1lRWxhcHNlZE1zID0gbm93KCkgLSBldmVudFRpbWVNcztcblxuICAgICAgICAgIHZhciBfbXNVbnRpbFRpbWVvdXQgPSBqbmQodGltZUVsYXBzZWRNcykgLSB0aW1lRWxhcHNlZE1zOyAvLyBEb24ndCBib3RoZXIgd2l0aCBhIHZlcnkgc2hvcnQgc3VzcGVuc2UgdGltZS5cblxuXG4gICAgICAgICAgaWYgKF9tc1VudGlsVGltZW91dCA+IDEwKSB7XG4gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrIGltbWVkaWF0ZWx5LCB3YWl0IGZvciBtb3JlIGRhdGFcbiAgICAgICAgICAgIC8vIHRvIGFycml2ZS5cbiAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBfbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIENvbW1pdCB0aGUgcGxhY2Vob2xkZXIuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RDb21wbGV0ZWQ6XG4gICAgICB7XG4gICAgICAgIC8vIFRoZSB3b3JrIGNvbXBsZXRlZC4gUmVhZHkgdG8gY29tbWl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcm9vdCBleGl0IHN0YXR1cy4nKTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIFNlYXJjaCB0aGUgcmVuZGVyZWQgdHJlZSBmb3IgZXh0ZXJuYWwgc3RvcmUgcmVhZHMsIGFuZCBjaGVjayB3aGV0aGVyIHRoZVxuICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkIGluIGEgY29uY3VycmVudCBldmVudC4gSW50ZW50aW9uYWxseSB1c2luZyBhbiBpdGVyYXRpdmVcbiAgLy8gbG9vcCBpbnN0ZWFkIG9mIHJlY3Vyc2lvbiBzbyB3ZSBjYW4gZXhpdCBlYXJseS5cbiAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAobm9kZS5mbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kpIHtcbiAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5vZGUudXBkYXRlUXVldWU7XG5cbiAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gdXBkYXRlUXVldWUuc3RvcmVzO1xuXG4gICAgICAgIGlmIChjaGVja3MgIT09IG51bGwpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoZWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoZWNrID0gY2hlY2tzW2ldO1xuICAgICAgICAgICAgdmFyIGdldFNuYXBzaG90ID0gY2hlY2suZ2V0U25hcHNob3Q7XG4gICAgICAgICAgICB2YXIgcmVuZGVyZWRWYWx1ZSA9IGNoZWNrLnZhbHVlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoIW9iamVjdElzKGdldFNuYXBzaG90KCksIHJlbmRlcmVkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gRm91bmQgYW4gaW5jb25zaXN0ZW50IHN0b3JlLlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYGdldFNuYXBzaG90YCB0aHJvd3MsIHJldHVybiBgZmFsc2VgLiBUaGlzIHdpbGwgc2NoZWR1bGVcbiAgICAgICAgICAgICAgLy8gYSByZS1yZW5kZXIsIGFuZCB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biBkdXJpbmcgcmVuZGVyLlxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChub2RlLnN1YnRyZWVGbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9IC8vIEZsb3cgZG9lc24ndCBrbm93IHRoaXMgaXMgdW5yZWFjaGFibGUsIGJ1dCBlc2xpbnQgZG9lc1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGVcblxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7XG4gIC8vIFdoZW4gc3VzcGVuZGluZywgd2Ugc2hvdWxkIGFsd2F5cyBleGNsdWRlIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgb3IgKG1vcmVcbiAgLy8gcmFyZWx5LCBzaW5jZSB3ZSB0cnkgdG8gYXZvaWQgaXQpIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gIC8vIFRPRE86IExvbCBtYXliZSB0aGVyZSdzIGEgYmV0dGVyIHdheSB0byBmYWN0b3IgdGhpcyBiZXNpZGVzIHRoaXNcbiAgLy8gb2Jub3hpb3VzbHkgbmFtZWQgZnVuY3Rpb24gOilcbiAgc3VzcGVuZGVkTGFuZXMgPSByZW1vdmVMYW5lcyhzdXNwZW5kZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMpO1xuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyk7XG4gIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHN5bmNocm9ub3VzIHRhc2tzIHRoYXQgZG9uJ3QgZ29cbi8vIHRocm91Z2ggU2NoZWR1bGVyXG5cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QpIHtcbiAge1xuICAgIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH1cblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShsYW5lcywgU3luY0xhbmUpKSB7XG4gICAgLy8gVGhlcmUncyBubyByZW1haW5pbmcgc3luYyB3b3JrIGxlZnQuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gIGlmIChyb290LnRhZyAhPT0gTGVnYWN5Um9vdCAmJiBleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbCByZW5kZXJcbiAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgIC8vIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlciB0aGUgc2Vjb25kXG4gICAgLy8gYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICB2YXIgZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICBpZiAoZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgdmFyIGZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gQmVjYXVzZSB0aGlzIGlzIGEgc3luYyByZW5kZXIsIHdlXG4gIC8vIHdpbGwgY29tbWl0IGl0IGV2ZW4gaWYgc29tZXRoaW5nIHN1c3BlbmRlZC5cblxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlO1xuICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpOyAvLyBCZWZvcmUgZXhpdGluZywgbWFrZSBzdXJlIHRoZXJlJ3MgYSBjYWxsYmFjayBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0XG4gIC8vIHBlbmRpbmcgbGV2ZWwuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUm9vdChyb290LCBsYW5lcykge1xuICBpZiAobGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBtZXJnZUxhbmVzKGxhbmVzLCBTeW5jTGFuZSkpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzJDEoZm4sIGEpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcblxuICB0cnkge1xuICAgIHJldHVybiBmbihhKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIElmIHRoZXJlIHdlcmUgbGVnYWN5IHN5bmMgdXBkYXRlcywgZmx1c2ggdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSBvdXRlclxuICAgIC8vIG1vc3QgYmF0Y2hlZFVwZGF0ZXMtbGlrZSBtZXRob2QuXG5cbiAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlzY3JldGVVcGRhdGVzKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgcmV0dXJuIGZuKGEsIGIsIGMsIGQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICB9XG4gIH1cbn0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLlxuLy8gV2FybmluZywgdGhpcyBvcHRzLW91dCBvZiBjaGVja2luZyB0aGUgZnVuY3Rpb24gYm9keS5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuZnVuY3Rpb24gZmx1c2hTeW5jKGZuKSB7XG4gIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBmbHVzaCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuICAvLyBuZXh0IGV2ZW50LCBub3QgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgb25lLlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwgJiYgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMudGFnID09PSBMZWdhY3lSb290ICYmIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICBpZiAoZm4pIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBGbHVzaCB0aGUgaW1tZWRpYXRlIGNhbGxiYWNrcyB0aGF0IHdlcmUgc2NoZWR1bGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwXG4gICAgLy8gdGhlIHN0YWNrLlxuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpc0FscmVhZHlSZW5kZXJpbmcoKSB7XG4gIC8vIFVzZWQgYnkgdGhlIHJlbmRlcmVyIHRvIHByaW50IGEgd2FybmluZyBpZiBjZXJ0YWluIEFQSXMgYXJlIGNhbGxlZCBmcm9tXG4gIC8vIHRoZSB3cm9uZyBjb250ZXh0LlxuICByZXR1cm4gIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dDtcbn1cbmZ1bmN0aW9uIHB1c2hSZW5kZXJMYW5lcyhmaWJlciwgbGFuZXMpIHtcbiAgcHVzaChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIHN1YnRyZWVSZW5kZXJMYW5lcywgZmliZXIpO1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHN1YnRyZWVSZW5kZXJMYW5lcywgbGFuZXMpO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiBwb3BSZW5kZXJMYW5lcyhmaWJlcikge1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IuY3VycmVudDtcbiAgcG9wKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcykge1xuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciB0aW1lb3V0SGFuZGxlID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuXG4gIGlmICh0aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXQpIHtcbiAgICAvLyBUaGUgcm9vdCBwcmV2aW91cyBzdXNwZW5kZWQgYW5kIHNjaGVkdWxlZCBhIHRpbWVvdXQgdG8gY29tbWl0IGEgZmFsbGJhY2tcbiAgICAvLyBzdGF0ZS4gTm93IHRoYXQgd2UgaGF2ZSBhZGRpdGlvbmFsIHdvcmssIGNhbmNlbCB0aGUgdGltZW91dC5cbiAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7IC8vICRGbG93Rml4TWUgQ29tcGxhaW5zIG5vVGltZW91dCBpcyBub3QgYSBUaW1lb3V0SUQsIGRlc3BpdGUgdGhlIGNoZWNrIGFib3ZlXG5cbiAgICBjYW5jZWxUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaW50ZXJydXB0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gY3JlYXRlV29ya0luUHJvZ3Jlc3Mocm9vdC5jdXJyZW50LCBudWxsKTtcbiAgd29ya0luUHJvZ3Jlc3MgPSByb290V29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IGxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDtcbiAgZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpO1xuXG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzKCk7XG4gIH1cblxuICByZXR1cm4gcm9vdFdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSkge1xuICBkbyB7XG4gICAgdmFyIGVycm9yZWRXb3JrID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzZXQgbW9kdWxlLWxldmVsIHN0YXRlIHRoYXQgd2FzIHNldCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTtcbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7IC8vIFRPRE86IEkgZm91bmQgYW5kIGFkZGVkIHRoaXMgbWlzc2luZyBsaW5lIHdoaWxlIGludmVzdGlnYXRpbmcgYVxuICAgICAgLy8gc2VwYXJhdGUgaXNzdWUuIFdyaXRlIGEgcmVncmVzc2lvbiB0ZXN0IHVzaW5nIHN0cmluZyByZWZzLlxuXG4gICAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xuXG4gICAgICBpZiAoZXJyb3JlZFdvcmsgPT09IG51bGwgfHwgZXJyb3JlZFdvcmsucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIC8vIEV4cGVjdGVkIHRvIGJlIHdvcmtpbmcgb24gYSBub24tcm9vdCBmaWJlci4gVGhpcyBpcyBhIGZhdGFsIGVycm9yXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlcmUncyBubyBhbmNlc3RvciB0aGF0IGNhbiBoYW5kbGUgaXQ7IHRoZSByb290IGlzXG4gICAgICAgIC8vIHN1cHBvc2VkIHRvIGNhcHR1cmUgYWxsIGVycm9ycyB0aGF0IHdlcmVuJ3QgY2F1Z2h0IGJ5IGFuIGVycm9yXG4gICAgICAgIC8vIGJvdW5kYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEZhdGFsRXJyb3JlZDtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IHRocm93blZhbHVlOyAvLyBTZXQgYHdvcmtJblByb2dyZXNzYCB0byBudWxsLiBUaGlzIHJlcHJlc2VudHMgYWR2YW5jaW5nIHRvIHRoZSBuZXh0XG4gICAgICAgIC8vIHNpYmxpbmcsIG9yIHRoZSBwYXJlbnQgaWYgdGhlcmUgYXJlIG5vIHNpYmxpbmdzLiBCdXQgc2luY2UgdGhlIHJvb3RcbiAgICAgICAgLy8gaGFzIG5vIHNpYmxpbmdzIG5vciBhIHBhcmVudCwgd2Ugc2V0IGl0IHRvIG51bGwuIFVzdWFsbHkgdGhpcyBpc1xuICAgICAgICAvLyBoYW5kbGVkIGJ5IGBjb21wbGV0ZVVuaXRPZldvcmtgIG9yIGB1bndpbmRXb3JrYCwgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgIC8vIGludGVudGlvbmFsbHkgbm90IGNhbGxpbmcgdGhvc2UsIHdlIG5lZWQgc2V0IGl0IGhlcmUuXG4gICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGNhbGxpbmcgYHVud2luZFdvcmtgIHRvIHBvcCB0aGUgY29udGV4dHMuXG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVycm9yZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHRpbWUgc3BlbnQgcmVuZGVyaW5nIGJlZm9yZSBhbiBlcnJvciB3YXMgdGhyb3duLiBUaGlzXG4gICAgICAgIC8vIGF2b2lkcyBpbmFjY3VyYXRlIFByb2ZpbGVyIGR1cmF0aW9ucyBpbiB0aGUgY2FzZSBvZiBhXG4gICAgICAgIC8vIHN1c3BlbmRlZCByZW5kZXIuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZXJyb3JlZFdvcmssIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyKSB7XG4gICAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG5cbiAgICAgICAgaWYgKHRocm93blZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB0aHJvd25WYWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRocm93blZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgd2FrZWFibGUgPSB0aHJvd25WYWx1ZTtcbiAgICAgICAgICBtYXJrQ29tcG9uZW50U3VzcGVuZGVkKGVycm9yZWRXb3JrLCB3YWtlYWJsZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcmtDb21wb25lbnRFcnJvcmVkKGVycm9yZWRXb3JrLCB0aHJvd25WYWx1ZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93RXhjZXB0aW9uKHJvb3QsIGVycm9yZWRXb3JrLnJldHVybiwgZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICBjb21wbGV0ZVVuaXRPZldvcmsoZXJyb3JlZFdvcmspO1xuICAgIH0gY2F0Y2ggKHlldEFub3RoZXJUaHJvd25WYWx1ZSkge1xuICAgICAgLy8gU29tZXRoaW5nIGluIHRoZSByZXR1cm4gcGF0aCBhbHNvIHRocmV3LlxuICAgICAgdGhyb3duVmFsdWUgPSB5ZXRBbm90aGVyVGhyb3duVmFsdWU7XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gZXJyb3JlZFdvcmsgJiYgZXJyb3JlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBoYXMgYWxyZWFkeSBlcnJvcmVkLCB0aGVuIHdlIGhhZCB0cm91YmxlIHByb2Nlc3NpbmdcbiAgICAgICAgLy8gdGhlIGVycm9yLiBCdWJibGUgaXQgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gICAgICAgIGVycm9yZWRXb3JrID0gZXJyb3JlZFdvcmsucmV0dXJuO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IGVycm9yZWRXb3JrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIH1cblxuICAgICAgY29udGludWU7XG4gICAgfSAvLyBSZXR1cm4gdG8gdGhlIG5vcm1hbCB3b3JrIGxvb3AuXG5cblxuICAgIHJldHVybjtcbiAgfSB3aGlsZSAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHB1c2hEaXNwYXRjaGVyKCkge1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudDtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAgaWYgKHByZXZEaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgLy8gVGhlIFJlYWN0IGlzb21vcnBoaWMgcGFja2FnZSBkb2VzIG5vdCBpbmNsdWRlIGEgZGVmYXVsdCBkaXNwYXRjaGVyLlxuICAgIC8vIEluc3RlYWQgdGhlIGZpcnN0IHJlbmRlcmVyIHdpbGwgbGF6aWx5IGF0dGFjaCBvbmUsIGluIG9yZGVyIHRvIGdpdmVcbiAgICAvLyBuaWNlciBlcnJvciBtZXNzYWdlcy5cbiAgICByZXR1cm4gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcmV2RGlzcGF0Y2hlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpIHtcbiAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IG5vdygpO1xufVxuZnVuY3Rpb24gbWFya1NraXBwZWRVcGRhdGVMYW5lcyhsYW5lKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IG1lcmdlTGFuZXMobGFuZSwgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmQoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcykge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkV2l0aERlbGF5O1xuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1cGRhdGVzIHRoYXQgd2Ugc2tpcHBlZCB0cmVlIHRoYXQgbWlnaHQgaGF2ZSB1bmJsb2NrZWRcbiAgLy8gdGhpcyByZW5kZXIuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsICYmIChpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcykgfHwgaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcykpKSB7XG4gICAgLy8gTWFyayB0aGUgY3VycmVudCByZW5kZXIgYXMgc3VzcGVuZGVkIHNvIHRoYXQgd2Ugc3dpdGNoIHRvIHdvcmtpbmcgb25cbiAgICAvLyB0aGUgdXBkYXRlcyB0aGF0IHdlcmUgc2tpcHBlZC4gVXN1YWxseSB3ZSBvbmx5IHN1c3BlbmQgYXQgdGhlIGVuZCBvZlxuICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgLy8gVE9ETzogV2Ugc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBtYXJrIHRoZSByb290IGFzIHN1c3BlbmRlZCBpbW1lZGlhdGVseVxuICAgIC8vIChpbnNpZGUgdGhpcyBmdW5jdGlvbiksIHNpbmNlIGJ5IHN1c3BlbmRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgcmVuZGVyXG4gICAgLy8gcGhhc2UgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBtaXN0YWtlIHdoZXJlIHdlIHN1c3BlbmQgbGFuZXMgdGhhdCB3ZXJlXG4gICAgLy8gcGluZ2VkIG9yIHVwZGF0ZWQgd2hpbGUgd2Ugd2VyZSByZW5kZXJpbmcuXG4gICAgbWFya1Jvb3RTdXNwZW5kZWQkMSh3b3JrSW5Qcm9ncmVzc1Jvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyRGlkRXJyb3IoZXJyb3IpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgIT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEVycm9yZWQ7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBbZXJyb3JdO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn0gLy8gQ2FsbGVkIGR1cmluZyByZW5kZXIgdG8gZGV0ZXJtaW5lIGlmIGFueXRoaW5nIGhhcyBzdXNwZW5kZWQuXG4vLyBSZXR1cm5zIGZhbHNlIGlmIHdlJ3JlIG5vdCBzdXJlLlxuXG5mdW5jdGlvbiByZW5kZXJIYXNOb3RTdXNwZW5kZWRZZXQoKSB7XG4gIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIG9yIGNvbXBsZXRlZCwgd2UgY2FuJ3QgcmVhbGx5IGJlIHN1cmUsXG4gIC8vIHNvIHRob3NlIGFyZSBmYWxzZS5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcFN5bmMoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgc3luYyByZW5kZXIsIHNvIHdlIHNob3VsZCBoYXZlIGZpbmlzaGVkIHRoZSB3aG9sZSB0cmVlLlxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCBhbiBpbmNvbXBsZXRlIHJvb3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhICcgKyAnYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xufSAvLyBUaGUgd29yayBsb29wIGlzIGFuIGV4dHJlbWVseSBob3QgcGF0aC4gVGVsbCBDbG9zdXJlIG5vdCB0byBpbmxpbmUgaXQuXG5cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcFN5bmMoKSB7XG4gIC8vIEFscmVhZHkgdGltZWQgb3V0LCBzbyBwZXJmb3JtIHdvcmsgd2l0aG91dCBjaGVja2luZyBpZiB3ZSBuZWVkIHRvIHlpZWxkLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBSZW5kZXJDb250ZXh0O1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBwdXNoRGlzcGF0Y2hlcigpOyAvLyBJZiB0aGUgcm9vdCBvciBsYW5lcyBoYXZlIGNoYW5nZWQsIHRocm93IG91dCB0aGUgZXhpc3Rpbmcgc3RhY2tcbiAgLy8gYW5kIHByZXBhcmUgYSBmcmVzaCBvbmUuIE90aGVyd2lzZSB3ZSdsbCBjb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZi5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcykge1xuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICAgICAgICBpZiAobWVtb2l6ZWRVcGRhdGVycy5zaXplID4gMCkge1xuICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICAgICAgfSAvLyBBdCB0aGlzIHBvaW50LCBtb3ZlIEZpYmVycyB0aGF0IHNjaGVkdWxlZCB0aGUgdXBjb21pbmcgd29yayBmcm9tIHRoZSBNYXAgdG8gdGhlIFNldC5cbiAgICAgICAgLy8gSWYgd2UgYmFpbG91dCBvbiB0aGlzIHdvcmssIHdlJ2xsIG1vdmUgdGhlbSBiYWNrIChsaWtlIGFib3ZlKS5cbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gbW92ZSB0aGVtIG5vdyBpbiBjYXNlIHRoZSB3b3JrIHNwYXducyBtb3JlIHdvcmsgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aCBkaWZmZXJlbnQgdXBkYXRlcnMuXG4gICAgICAgIC8vIFRoYXQgd2F5IHdlIGNhbiBrZWVwIHRoZSBjdXJyZW50IHVwZGF0ZSBhbmQgZnV0dXJlIHVwZGF0ZXMgc2VwYXJhdGUuXG5cblxuICAgICAgICBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKCk7XG4gICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wQ29uY3VycmVudCgpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgLy8gU3RpbGwgd29yayByZW1haW5pbmcuXG4gICAge1xuICAgICAgbWFya1JlbmRlcllpZWxkZWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUm9vdEluUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29tcGxldGVkIHRoZSB0cmVlLlxuICAgIHtcbiAgICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gICAgfSAvLyBTZXQgdGhpcyB0byBudWxsIHRvIGluZGljYXRlIHRoZXJlJ3Mgbm8gaW4tcHJvZ3Jlc3MgcmVuZGVyLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gUmV0dXJuIHRoZSBmaW5hbCBleGl0IHN0YXR1cy5cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICB9XG59XG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BDb25jdXJyZW50KCkge1xuICAvLyBQZXJmb3JtIHdvcmsgdW50aWwgU2NoZWR1bGVyIGFza3MgdXMgdG8geWllbGRcbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsICYmICFzaG91bGRZaWVsZCgpKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Vbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50ID0gdW5pdE9mV29yay5hbHRlcm5hdGU7XG4gIHNldEN1cnJlbnRGaWJlcih1bml0T2ZXb3JrKTtcbiAgdmFyIG5leHQ7XG5cbiAgaWYgKCAodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh1bml0T2ZXb3JrLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gIH1cblxuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBBdHRlbXB0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IHVuaXQgb2Ygd29yaywgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0XG4gIC8vIHNpYmxpbmcuIElmIHRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmdzLCByZXR1cm4gdG8gdGhlIHBhcmVudCBmaWJlci5cbiAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuXG4gIGRvIHtcbiAgICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gICAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBjb21wbGV0ZWRXb3JrLnJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHdvcmsgY29tcGxldGVkIG9yIGlmIHNvbWV0aGluZyB0aHJldy5cblxuICAgIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIEluY29tcGxldGUpID09PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY29tcGxldGVkV29yayk7XG4gICAgICB2YXIgbmV4dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7IC8vIFVwZGF0ZSByZW5kZXIgZHVyYXRpb24gYXNzdW1pbmcgd2UgZGlkbid0IGVycm9yLlxuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDb21wbGV0aW5nIHRoaXMgZmliZXIgc3Bhd25lZCBuZXcgd29yay4gV29yayBvbiB0aGF0IG5leHQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBzb21ldGhpbmcgdGhyZXcuIFBvcCB2YWx1ZXMgb2ZmXG4gICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBlbnRlcmluZyB0aGUgY29tcGxldGUgcGhhc2UuIElmIHRoaXMgaXMgYSBib3VuZGFyeSxcbiAgICAgIC8vIGNhcHR1cmUgdmFsdWVzIGlmIHBvc3NpYmxlLlxuICAgICAgdmFyIF9uZXh0ID0gdW53aW5kV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrKTsgLy8gQmVjYXVzZSB0aGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUsIGRvbid0IHJlc2V0IGl0cyBsYW5lcy5cblxuXG4gICAgICBpZiAoX25leHQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgY29tcGxldGluZyB0aGlzIHdvcmsgc3Bhd25lZCBuZXcgd29yaywgZG8gdGhhdCBuZXh0LiBXZSdsbCBjb21lXG4gICAgICAgIC8vIGJhY2sgaGVyZSBhZ2Fpbi5cbiAgICAgICAgLy8gU2luY2Ugd2UncmUgcmVzdGFydGluZywgcmVtb3ZlIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgaG9zdCBlZmZlY3RcbiAgICAgICAgLy8gZnJvbSB0aGUgZWZmZWN0IHRhZy5cbiAgICAgICAgX25leHQuZmxhZ3MgJj0gSG9zdEVmZmVjdE1hc2s7XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gX25leHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSByZW5kZXIgZHVyYXRpb24gZm9yIHRoZSBmaWJlciB0aGF0IGVycm9yZWQuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpOyAvLyBJbmNsdWRlIHRoZSB0aW1lIHNwZW50IHdvcmtpbmcgb24gZmFpbGVkIGNoaWxkcmVuIGJlZm9yZSBjb250aW51aW5nLlxuXG4gICAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb247XG4gICAgICAgIHZhciBjaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgcGFyZW50IGZpYmVyIGFzIGluY29tcGxldGUgYW5kIGNsZWFyIGl0cyBzdWJ0cmVlIGZsYWdzLlxuICAgICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuICAgICAgICByZXR1cm5GaWJlci5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UndmUgdW53b3VuZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3REaWROb3RDb21wbGV0ZTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyBpbiB0aGlzIHJldHVybkZpYmVyLCBkbyB0aGF0IG5leHQuXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHNpYmxpbmdGaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRvIHRoZSBwYXJlbnRcblxuXG4gICAgY29tcGxldGVkV29yayA9IHJldHVybkZpYmVyOyAvLyBVcGRhdGUgdGhlIG5leHQgdGhpbmcgd2UncmUgd29ya2luZyBvbiBpbiBjYXNlIHNvbWV0aGluZyB0aHJvd3MuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gIH0gd2hpbGUgKGNvbXBsZXRlZFdvcmsgIT09IG51bGwpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSByb290LlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RDb21wbGV0ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMpIHtcbiAgLy8gVE9ETzogVGhpcyBubyBsb25nZXIgbWFrZXMgYW55IHNlbnNlLiBXZSBhbHJlYWR5IHdyYXAgdGhlIG11dGF0aW9uIGFuZFxuICAvLyBsYXlvdXQgcGhhc2VzLiBTaG91bGQgYmUgYWJsZSB0byByZW1vdmUuXG4gIHZhciBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGNvbW1pdFJvb3RJbXBsKHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucywgcHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCByZW5kZXJQcmlvcml0eUxldmVsKSB7XG4gIGRvIHtcbiAgICAvLyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBjYWxsIGBmbHVzaFN5bmNVcGRhdGVRdWV1ZWAgYXQgdGhlIGVuZCwgd2hpY2hcbiAgICAvLyBtZWFucyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBzb21ldGltZXMgcmVzdWx0IGluIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzaXZlIGVmZmVjdHMuIFNvIHdlIG5lZWQgdG8ga2VlcCBmbHVzaGluZyBpbiBhIGxvb3AgdW50aWwgdGhlcmUgYXJlXG4gICAgLy8gbm8gbW9yZSBwZW5kaW5nIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgYmV0dGVyIGlmIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCBkaWQgbm90IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBmbHVzaCBzeW5jaHJvbm91cyB3b3JrIGF0IHRoZSBlbmQsIHRvIGF2b2lkIGZhY3RvcmluZyBoYXphcmRzIGxpa2UgdGhpcy5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gd2hpbGUgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKTtcblxuICBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmZpbmlzaGVkV29yaztcbiAgdmFyIGxhbmVzID0gcm9vdC5maW5pc2hlZExhbmVzO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBpZiAoZmluaXNoZWRXb3JrID09PSBudWxsKSB7XG5cbiAgICB7XG4gICAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgICAgICBlcnJvcigncm9vdC5maW5pc2hlZExhbmVzIHNob3VsZCBub3QgYmUgZW1wdHkgZHVyaW5nIGEgY29tbWl0LiBUaGlzIGlzIGEgJyArICdidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBudWxsO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IHJvb3QuY3VycmVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCB0aGUgc2FtZSB0cmVlIGFzIGJlZm9yZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5ICcgKyAnYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9IC8vIGNvbW1pdFJvb3QgbmV2ZXIgcmV0dXJucyBhIGNvbnRpbnVhdGlvbjsgaXQgYWx3YXlzIGZpbmlzaGVzIHN5bmNocm9ub3VzbHkuXG4gIC8vIFNvIHdlIGNhbiBjbGVhciB0aGVzZSBub3cgdG8gYWxsb3cgYSBuZXcgY2FsbGJhY2sgdG8gYmUgc2NoZWR1bGVkLlxuXG5cbiAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7IC8vIFVwZGF0ZSB0aGUgZmlyc3QgYW5kIGxhc3QgcGVuZGluZyB0aW1lcyBvbiB0aGlzIHJvb3QuIFRoZSBuZXcgZmlyc3RcbiAgLy8gcGVuZGluZyB0aW1lIGlzIHdoYXRldmVyIGlzIGxlZnQgb24gdGhlIHJvb3QgZmliZXIuXG5cbiAgdmFyIHJlbWFpbmluZ0xhbmVzID0gbWVyZ2VMYW5lcyhmaW5pc2hlZFdvcmsubGFuZXMsIGZpbmlzaGVkV29yay5jaGlsZExhbmVzKTtcbiAgbWFya1Jvb3RGaW5pc2hlZChyb290LCByZW1haW5pbmdMYW5lcyk7XG5cbiAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFdlIGNhbiByZXNldCB0aGVzZSBub3cgdGhhdCB0aGV5IGFyZSBmaW5pc2hlZC5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIH0gLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzLCBzY2hlZHVsZSBhIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlbS5cbiAgLy8gRG8gdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSwgc28gaXQgaXMgcXVldWVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXRcbiAgLy8gbWlnaHQgZ2V0IHNjaGVkdWxlZCBpbiB0aGUgY29tbWl0IHBoYXNlLiAoU2VlICMxNjcxNC4pXG4gIC8vIFRPRE86IERlbGV0ZSBhbGwgb3RoZXIgcGxhY2VzIHRoYXQgc2NoZWR1bGUgdGhlIHBhc3NpdmUgZWZmZWN0IGNhbGxiYWNrXG4gIC8vIFRoZXkncmUgcmVkdW5kYW50LlxuXG5cbiAgaWYgKChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzIHx8IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICAvLyB0byBzdG9yZSBpdCBpbiBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zIHVudGlsIHRoZXkgZ2V0IHByb2Nlc3NlZFxuICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIHRoaXMgdGhyb3VnaCBhcyBhbiBhcmd1bWVudCB0byBjb21taXRSb290XG4gICAgICAvLyBiZWNhdXNlIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgbWlnaHQgaGF2ZSBjaGFuZ2VkIGJldHdlZW5cbiAgICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIgYW5kIGNvbW1pdCBpZiB3ZSB0aHJvdHRsZSB0aGUgY29tbWl0XG4gICAgICAvLyB3aXRoIHNldFRpbWVvdXRcblxuICAgICAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zO1xuICAgICAgc2NoZWR1bGVDYWxsYmFjayQxKE5vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTsgLy8gVGhpcyByZW5kZXIgdHJpZ2dlcmVkIHBhc3NpdmUgZWZmZWN0czogcmVsZWFzZSB0aGUgcm9vdCBjYWNoZSBwb29sXG4gICAgICAgIC8vICphZnRlciogcGFzc2l2ZSBlZmZlY3RzIGZpcmUgdG8gYXZvaWQgZnJlZWluZyBhIGNhY2hlIHBvb2wgdGhhdCBtYXlcbiAgICAgICAgLy8gYmUgcmVmZXJlbmNlZCBieSBhIG5vZGUgaW4gdGhlIHRyZWUgKEhvc3RSb290LCBDYWNoZSBib3VuZGFyeSBldGMpXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBlZmZlY3RzIGluIHRoZSB3aG9sZSB0cmVlLlxuICAvLyBUT0RPOiBUaGlzIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBlZmZlY3QgbGlzdCBpbXBsZW1lbnRhdGlvbiwgd2hlcmUgd2UgaGFkXG4gIC8vIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGBmaXJzdEVmZmVjdGAgdG8gc2F0aXNmeSBGbG93LiBJIHRoaW5rIHRoZVxuICAvLyBvbmx5IG90aGVyIHJlYXNvbiB0aGlzIG9wdGltaXphdGlvbiBleGlzdHMgaXMgYmVjYXVzZSBpdCBhZmZlY3RzIHByb2ZpbGluZy5cbiAgLy8gUmVjb25zaWRlciB3aGV0aGVyIHRoaXMgaXMgbmVjZXNzYXJ5LlxuXG5cbiAgdmFyIHN1YnRyZWVIYXNFZmZlY3RzID0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAoQmVmb3JlTXV0YXRpb25NYXNrIHwgTXV0YXRpb25NYXNrIHwgTGF5b3V0TWFzayB8IFBhc3NpdmVNYXNrKSkgIT09IE5vRmxhZ3M7XG4gIHZhciByb290SGFzRWZmZWN0ID0gKGZpbmlzaGVkV29yay5mbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcblxuICBpZiAoc3VidHJlZUhhc0VmZmVjdHMgfHwgcm9vdEhhc0VmZmVjdCkge1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7IC8vIFJlc2V0IHRoaXMgdG8gbnVsbCBiZWZvcmUgY2FsbGluZyBsaWZlY3ljbGVzXG5cbiAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsOyAvLyBUaGUgY29tbWl0IHBoYXNlIGlzIGJyb2tlbiBpbnRvIHNldmVyYWwgc3ViLXBoYXNlcy4gV2UgZG8gYSBzZXBhcmF0ZSBwYXNzXG4gICAgLy8gb2YgdGhlIGVmZmVjdCBsaXN0IGZvciBlYWNoIHBoYXNlOiBhbGwgbXV0YXRpb24gZWZmZWN0cyBjb21lIGJlZm9yZSBhbGxcbiAgICAvLyBsYXlvdXQgZWZmZWN0cywgYW5kIHNvIG9uLlxuICAgIC8vIFRoZSBmaXJzdCBwaGFzZSBhIFwiYmVmb3JlIG11dGF0aW9uXCIgcGhhc2UuIFdlIHVzZSB0aGlzIHBoYXNlIHRvIHJlYWQgdGhlXG4gICAgLy8gc3RhdGUgb2YgdGhlIGhvc3QgdHJlZSByaWdodCBiZWZvcmUgd2UgbXV0YXRlIGl0LiBUaGlzIGlzIHdoZXJlXG4gICAgLy8gZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgaXMgY2FsbGVkLlxuXG4gICAgdmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuXG4gICAge1xuICAgICAgLy8gTWFyayB0aGUgY3VycmVudCBjb21taXQgdGltZSB0byBiZSBzaGFyZWQgYnkgYWxsIFByb2ZpbGVycyBpbiB0aGlzXG4gICAgICAvLyBiYXRjaC4gVGhpcyBlbmFibGVzIHRoZW0gdG8gYmUgZ3JvdXBlZCBsYXRlci5cbiAgICAgIHJlY29yZENvbW1pdFRpbWUoKTtcbiAgICB9XG5cblxuICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcblxuICAgIHJlc2V0QWZ0ZXJDb21taXQocm9vdC5jb250YWluZXJJbmZvKTsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgdHJlZSBpcyBub3cgdGhlIGN1cnJlbnQgdHJlZS4gVGhpcyBtdXN0IGNvbWUgYWZ0ZXJcbiAgICAvLyB0aGUgbXV0YXRpb24gcGhhc2UsIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRyZWUgaXMgc3RpbGwgY3VycmVudCBkdXJpbmdcbiAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCwgYnV0IGJlZm9yZSB0aGUgbGF5b3V0IHBoYXNlLCBzbyB0aGF0IHRoZSBmaW5pc2hlZFxuICAgIC8vIHdvcmsgaXMgY3VycmVudCBkdXJpbmcgY29tcG9uZW50RGlkTW91bnQvVXBkYXRlLlxuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBUaGUgbmV4dCBwaGFzZSBpcyB0aGUgbGF5b3V0IHBoYXNlLCB3aGVyZSB3ZSBjYWxsIGVmZmVjdHMgdGhhdCByZWFkXG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cblxuICAgIGNvbW1pdExheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gICAgLy8gb3Bwb3J0dW5pdHkgdG8gcGFpbnQuXG5cblxuICAgIHJlcXVlc3RQYWludCgpO1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gUmVzZXQgdGhlIHByaW9yaXR5IHRvIHRoZSBwcmV2aW91cyBub24tc3luYyB2YWx1ZS5cblxuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfSBlbHNlIHtcbiAgICAvLyBObyBlZmZlY3RzLlxuICAgIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yazsgLy8gTWVhc3VyZSB0aGVzZSBhbnl3YXkgc28gdGhlIGZsYW1lZ3JhcGggZXhwbGljaXRseSBzaG93cyB0aGF0IHRoZXJlIHdlcmVcbiAgICAvLyBubyBlZmZlY3RzLlxuICAgIC8vIFRPRE86IE1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIHJlcG9ydCB0aGlzLlxuXG4gICAge1xuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290RGlkSGF2ZVBhc3NpdmVFZmZlY3RzID0gcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHM7XG5cbiAgaWYgKHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gVGhpcyBjb21taXQgaGFzIHBhc3NpdmUgZWZmZWN0cy4gU3Rhc2ggYSByZWZlcmVuY2UgdG8gdGhlbS4gQnV0IGRvbid0XG4gICAgLy8gc2NoZWR1bGUgYSBjYWxsYmFjayB1bnRpbCBhZnRlciBmbHVzaGluZyBsYXlvdXQgd29yay5cbiAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gcm9vdDtcbiAgICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IGxhbmVzO1xuICB9IGVsc2Uge1xuXG4gICAge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGFuIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7IC8vIENoZWNrIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290XG4gIC8vIFRPRE86IFRoaXMgaXMgcGFydCBvZiB0aGUgYGNvbXBvbmVudERpZENhdGNoYCBpbXBsZW1lbnRhdGlvbi4gSXRzIHB1cnBvc2VcbiAgLy8gaXMgdG8gZGV0ZWN0IHdoZXRoZXIgc29tZXRoaW5nIG1pZ2h0IGhhdmUgY2FsbGVkIHNldFN0YXRlIGluc2lkZVxuICAvLyBgY29tcG9uZW50RGlkQ2F0Y2hgLiBUaGUgbWVjaGFuaXNtIGlzIGtub3duIHRvIGJlIGZsYXdlZCBiZWNhdXNlIGBzZXRTdGF0ZWBcbiAgLy8gaW5zaWRlIGBjb21wb25lbnREaWRDYXRjaGAgaXMgaXRzZWxmIGZsYXdlZCDigJQgdGhhdCdzIHdoeSB3ZSByZWNvbW1lbmRcbiAgLy8gYGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcmAgaW5zdGVhZC4gSG93ZXZlciwgaXQgY291bGQgYmUgaW1wcm92ZWQgYnlcbiAgLy8gY2hlY2tpbmcgaWYgcmVtYWluaW5nTGFuZXMgaW5jbHVkZXMgU3luYyB3b3JrLCBpbnN0ZWFkIG9mIHdoZXRoZXIgdGhlcmUnc1xuICAvLyBhbnkgd29yayByZW1haW5pbmcgYXQgYWxsICh3aGljaCB3b3VsZCBhbHNvIGluY2x1ZGUgc3R1ZmYgbGlrZSBTdXNwZW5zZVxuICAvLyByZXRyaWVzIG9yIHRyYW5zaXRpb25zKS4gSXQncyBiZWVuIGxpa2UgdGhpcyBmb3IgYSB3aGlsZSwgdGhvdWdoLCBzbyBmaXhpbmdcbiAgLy8gaXQgcHJvYmFibHkgaXNuJ3QgdGhhdCB1cmdlbnQuXG5cbiAgaWYgKHJlbWFpbmluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gSWYgdGhlcmUncyBubyByZW1haW5pbmcgd29yaywgd2UgY2FuIGNsZWFyIHRoZSBzZXQgb2YgYWxyZWFkeSBmYWlsZWRcbiAgICAvLyBlcnJvciBib3VuZGFyaWVzLlxuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAoIXJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBvbkNvbW1pdFJvb3QoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSwgcmVuZGVyUHJpb3JpdHlMZXZlbCk7XG5cbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgcm9vdC5tZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG9uQ29tbWl0Um9vdCQxKCk7XG4gIH0gLy8gQWx3YXlzIGNhbGwgdGhpcyBiZWZvcmUgZXhpdGluZyBgY29tbWl0Um9vdGAsIHRvIGVuc3VyZSB0aGF0IGFueVxuICAvLyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290IGlzIHNjaGVkdWxlZC5cblxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKHJlY292ZXJhYmxlRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUgd2VyZSBlcnJvcnMgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgcmVjb3ZlcmVkIGZyb20gdGhlbSB3aXRob3V0XG4gICAgLy8gbmVlZGluZyB0byBzdXJmYWNlIGl0IHRvIHRoZSBVSS4gV2UgbG9nIHRoZW0gaGVyZS5cbiAgICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gcm9vdC5vblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY292ZXJhYmxlRXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IHJlY292ZXJhYmxlRXJyb3JzW2ldO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gcmVjb3ZlcmFibGVFcnJvci5zdGFjaztcbiAgICAgIHZhciBkaWdlc3QgPSByZWNvdmVyYWJsZUVycm9yLmRpZ2VzdDtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvcihyZWNvdmVyYWJsZUVycm9yLnZhbHVlLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBjb21wb25lbnRTdGFjayxcbiAgICAgICAgZGlnZXN0OiBkaWdlc3RcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xuICAgIHZhciBlcnJvciQxID0gZmlyc3RVbmNhdWdodEVycm9yO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3IkMTtcbiAgfSAvLyBJZiB0aGUgcGFzc2l2ZSBlZmZlY3RzIGFyZSB0aGUgcmVzdWx0IG9mIGEgZGlzY3JldGUgcmVuZGVyLCBmbHVzaCB0aGVtXG4gIC8vIHN5bmNocm9ub3VzbHkgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCB0YXNrIHNvIHRoYXQgdGhlIHJlc3VsdCBpc1xuICAvLyBpbW1lZGlhdGVseSBvYnNlcnZhYmxlLiBPdGhlcndpc2UsIHdlIGFzc3VtZSB0aGF0IHRoZXkgYXJlIG5vdFxuICAvLyBvcmRlci1kZXBlbmRlbnQgYW5kIGRvIG5vdCBuZWVkIHRvIGJlIG9ic2VydmVkIGJ5IGV4dGVybmFsIHN5c3RlbXMsIHNvIHdlXG4gIC8vIGNhbiB3YWl0IHVudGlsIGFmdGVyIHBhaW50LlxuICAvLyBUT0RPOiBXZSBjYW4gb3B0aW1pemUgdGhpcyBieSBub3Qgc2NoZWR1bGluZyB0aGUgY2FsbGJhY2sgZWFybGllci4gU2luY2Ugd2VcbiAgLy8gY3VycmVudGx5IHNjaGVkdWxlIHRoZSBjYWxsYmFjayBpbiBtdWx0aXBsZSBwbGFjZXMsIHdpbGwgd2FpdCB1bnRpbCB0aG9zZVxuICAvLyBhcmUgY29uc29saWRhdGVkLlxuXG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMsIFN5bmNMYW5lKSAmJiByb290LnRhZyAhPT0gTGVnYWN5Um9vdCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGEgcGFzc2l2ZSBlZmZlY3QgbWlnaHQgaGF2ZSB1cGRhdGVkIGl0XG5cblxuICByZW1haW5pbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHJlbWFpbmluZ0xhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICB7XG4gICAgICBtYXJrTmVzdGVkVXBkYXRlU2NoZWR1bGVkKCk7XG4gICAgfSAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSByb290IHN5bmNocm9ub3VzbHkgcmUtcmVuZGVycyB3aXRob3V0XG4gICAgLy8gZmluaXNoaW5nLiBJZiB0aGVyZSBhcmUgdG9vIG1hbnksIGl0IGluZGljYXRlcyBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcC5cblxuXG4gICAgaWYgKHJvb3QgPT09IHJvb3RXaXRoTmVzdGVkVXBkYXRlcykge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gcm9vdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICB9IC8vIElmIGxheW91dCB3b3JrIHdhcyBzY2hlZHVsZWQsIGZsdXNoIGl0IG5vdy5cblxuXG4gIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKSB7XG4gIC8vIFJldHVybnMgd2hldGhlciBwYXNzaXZlIGVmZmVjdHMgd2VyZSBmbHVzaGVkLlxuICAvLyBUT0RPOiBDb21iaW5lIHRoaXMgY2hlY2sgd2l0aCB0aGUgb25lIGluIGZsdXNoUGFzc2l2ZUVGZmVjdHNJbXBsLiBXZSBzaG91bGRcbiAgLy8gcHJvYmFibHkganVzdCBjb21iaW5lIHRoZSB0d28gZnVuY3Rpb25zLiBJIGJlbGlldmUgdGhleSB3ZXJlIG9ubHkgc2VwYXJhdGVcbiAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlIGJlY2F1c2Ugd2UgdXNlZCB0byB3cmFwIGl0IHdpdGhcbiAgLy8gYFNjaGVkdWxlci5ydW5XaXRoUHJpb3JpdHlgLCB3aGljaCBhY2NlcHRzIGEgZnVuY3Rpb24uIEJ1dCBub3cgd2UgdHJhY2sgdGhlXG4gIC8vIHByaW9yaXR5IHdpdGhpbiBSZWFjdCBpdHNlbGYsIHNvIHdlIGNhbiBtdXRhdGUgdGhlIHZhcmlhYmxlIGRpcmVjdGx5LlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpIHtcbiAgICB2YXIgcmVuZGVyUHJpb3JpdHkgPSBsYW5lc1RvRXZlbnRQcmlvcml0eShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyk7XG4gICAgdmFyIHByaW9yaXR5ID0gbG93ZXJFdmVudFByaW9yaXR5KERlZmF1bHRFdmVudFByaW9yaXR5LCByZW5kZXJQcmlvcml0eSk7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgICB0cnkge1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmlvcml0eSk7XG4gICAgICByZXR1cm4gZmx1c2hQYXNzaXZlRWZmZWN0c0ltcGwoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247IC8vIE9uY2UgcGFzc2l2ZSBlZmZlY3RzIGhhdmUgcnVuIGZvciB0aGUgdHJlZSAtIGdpdmluZyBjb21wb25lbnRzIGFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaWJlcikge1xuICB7XG4gICAgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMucHVzaChmaWJlcik7XG5cbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpIHtcbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIENhY2hlIGFuZCBjbGVhciB0aGUgdHJhbnNpdGlvbnMgZmxhZ1xuXG5cbiAgdmFyIHRyYW5zaXRpb25zID0gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucztcbiAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7XG4gIHZhciByb290ID0gcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHM7XG4gIHZhciBsYW5lcyA9IHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzO1xuICByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IG51bGw7IC8vIFRPRE86IFRoaXMgaXMgc29tZXRpbWVzIG91dCBvZiBzeW5jIHdpdGggcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMuXG4gIC8vIEZpZ3VyZSBvdXQgd2h5IGFuZCBmaXggaXQuIEl0J3Mgbm90IGNhdXNpbmcgYW55IGtub3duIGlzc3VlcyAocHJvYmFibHlcbiAgLy8gYmVjYXVzZSBpdCdzIG9ubHkgdXNlZCBmb3IgcHJvZmlsaW5nKSwgYnV0IGl0J3MgYSByZWZhY3RvciBoYXphcmQuXG5cbiAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgd2hpbGUgYWxyZWFkeSByZW5kZXJpbmcuJyk7XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0cyhyb290LmN1cnJlbnQpO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIHJvb3QuY3VycmVudCwgbGFuZXMsIHRyYW5zaXRpb25zKTsgLy8gVE9ETzogTW92ZSB0byBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzXG5cbiAge1xuICAgIHZhciBwcm9maWxlckVmZmVjdHMgPSBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cztcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9maWxlckVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfZmliZXIgPSBwcm9maWxlckVmZmVjdHNbaV07XG4gICAgICBjb21taXRQYXNzaXZlRWZmZWN0RHVyYXRpb25zKHJvb3QsIF9maWJlcik7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKTtcbiAgfVxuXG4gIHtcbiAgICBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYocm9vdC5jdXJyZW50LCB0cnVlKTtcbiAgfVxuXG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIC8vIElmIGFkZGl0aW9uYWwgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgc2NoZWR1bGVkLCBpbmNyZW1lbnQgYSBjb3VudGVyLiBJZiB0aGlzXG4gICAgLy8gZXhjZWVkcyB0aGUgbGltaXQsIHdlJ2xsIGZpcmUgYSB3YXJuaW5nLlxuICAgIGlmIChkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcykge1xuICAgICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgIH1cblxuICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfSAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuXG4gIG9uUG9zdENvbW1pdFJvb3Qocm9vdCk7XG5cbiAge1xuICAgIHZhciBzdGF0ZU5vZGUgPSByb290LmN1cnJlbnQuc3RhdGVOb2RlO1xuICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkge1xuICByZXR1cm4gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgIT09IG51bGwgJiYgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuaGFzKGluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQoaW5zdGFuY2UpIHtcbiAgaWYgKGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID09PSBudWxsKSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBuZXcgU2V0KFtpbnN0YW5jZV0pO1xuICB9IGVsc2Uge1xuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmFkZChpbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvVGhyb3dVbmNhdWdodEVycm9yKGVycm9yKSB7XG4gIGlmICghaGFzVW5jYXVnaHRFcnJvcikge1xuICAgIGhhc1VuY2F1Z2h0RXJyb3IgPSB0cnVlO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IGVycm9yO1xuICB9XG59XG5cbnZhciBvblVuY2F1Z2h0RXJyb3IgPSBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3I7XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHJvb3RGaWJlciwgc291cmNlRmliZXIsIGVycm9yKSB7XG4gIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciwgc291cmNlRmliZXIpO1xuICB2YXIgdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHJvb3RGaWJlciwgZXJyb3JJbmZvLCBTeW5jTGFuZSk7XG4gIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvciQxKSB7XG4gIHtcbiAgICByZXBvcnRVbmNhdWdodEVycm9ySW5ERVYoZXJyb3IkMSk7XG4gICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgfVxuXG4gIGlmIChzb3VyY2VGaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgLy8gRXJyb3Igd2FzIHRocm93biBhdCB0aGUgcm9vdC4gVGhlcmUgaXMgbm8gcGFyZW50LCBzbyB0aGUgcm9vdFxuICAgIC8vIGl0c2VsZiBzaG91bGQgY2FwdHVyZSBpdC5cbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChzb3VyY2VGaWJlciwgc291cmNlRmliZXIsIGVycm9yJDEpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaWJlciA9IG51bGw7XG5cbiAge1xuICAgIGZpYmVyID0gbmVhcmVzdE1vdW50ZWRBbmNlc3RvcjtcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChmaWJlciwgc291cmNlRmliZXIsIGVycm9yJDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdmFyIGN0b3IgPSBmaWJlci50eXBlO1xuICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkpIHtcbiAgICAgICAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yJDEsIHNvdXJjZUZpYmVyKTtcbiAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgU3luY0xhbmUpO1xuICAgICAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIFRPRE86IFVudGlsIHdlIHJlLWxhbmQgc2tpcFVubW91bnRlZEJvdW5kYXJpZXMgKHNlZSAjMjAxNDcpLCB0aGlzIHdhcm5pbmdcbiAgICAvLyB3aWxsIGZpcmUgZm9yIGVycm9ycyB0aGF0IGFyZSB0aHJvd24gYnkgZGVzdHJveSBmdW5jdGlvbnMgaW5zaWRlIGRlbGV0ZWRcbiAgICAvLyB0cmVlcy4gV2hhdCBpdCBzaG91bGQgaW5zdGVhZCBkbyBpcyBwcm9wYWdhdGUgdGhlIGVycm9yIHRvIHRoZSBwYXJlbnQgb2ZcbiAgICAvLyB0aGUgZGVsZXRlZCB0cmVlLiBJbiB0aGUgbWVhbnRpbWUsIGRvIG5vdCBhZGQgdGhpcyB3YXJuaW5nIHRvIHRoZVxuICAgIC8vIGFsbG93bGlzdDsgdGhpcyBpcyBvbmx5IGZvciBvdXIgaW50ZXJuYWwgdXNlLlxuICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogQXR0ZW1wdGVkIHRvIGNhcHR1cmUgYSBjb21taXQgcGhhc2UgZXJyb3IgJyArICdpbnNpZGUgYSBkZXRhY2hlZCB0cmVlLiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdC4gTGlrZWx5ICcgKyAnY2F1c2VzIGluY2x1ZGUgZGVsZXRpbmcgdGhlIHNhbWUgZmliZXIgbW9yZSB0aGFuIG9uY2UsIGNvbW1pdHRpbmcgYW4gJyArICdhbHJlYWR5LWZpbmlzaGVkIHRyZWUsIG9yIGFuIGluY29uc2lzdGVudCByZXR1cm4gcG9pbnRlci5cXG5cXG4nICsgJ0Vycm9yIG1lc3NhZ2U6XFxuXFxuJXMnLCBlcnJvciQxKTtcbiAgfVxufVxuZnVuY3Rpb24gcGluZ1N1c3BlbmRlZFJvb3Qocm9vdCwgd2FrZWFibGUsIHBpbmdlZExhbmVzKSB7XG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcblxuICBpZiAocGluZ0NhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHdha2VhYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcGluZ0NhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcyk7XG4gIHdhcm5JZlN1c3BlbnNlUmVzb2x1dGlvbk5vdFdyYXBwZWRXaXRoQWN0REVWKHJvb3QpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiYgaXNTdWJzZXRPZkxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLCBwaW5nZWRMYW5lcykpIHtcbiAgICAvLyBSZWNlaXZlZCBhIHBpbmcgYXQgdGhlIHNhbWUgcHJpb3JpdHkgbGV2ZWwgYXQgd2hpY2ggd2UncmUgY3VycmVudGx5XG4gICAgLy8gcmVuZGVyaW5nLiBXZSBtaWdodCB3YW50IHRvIHJlc3RhcnQgdGhpcyByZW5kZXIuIFRoaXMgc2hvdWxkIG1pcnJvclxuICAgIC8vIHRoZSBsb2dpYyBvZiB3aGV0aGVyIG9yIG5vdCBhIHJvb3Qgc3VzcGVuZHMgb25jZSBpdCBjb21wbGV0ZXMuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgcmVuZGVyaW5nIHN5bmMgZWl0aGVyIGR1ZSB0byBTeW5jLCBCYXRjaGVkIG9yIGV4cGlyZWQsXG4gICAgLy8gd2Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIHJlc3RhcnQuXG4gICAgLy8gSWYgd2UncmUgc3VzcGVuZGVkIHdpdGggZGVsYXksIG9yIGlmIGl0J3MgYSByZXRyeSwgd2UnbGwgYWx3YXlzIHN1c3BlbmRcbiAgICAvLyBzbyB3ZSBjYW4gYWx3YXlzIHJlc3RhcnQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCAmJiBpbmNsdWRlc09ubHlSZXRyaWVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSAmJiBub3coKSAtIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPCBGQUxMQkFDS19USFJPVFRMRV9NUykge1xuICAgICAgLy8gUmVzdGFydCBmcm9tIHRoZSByb290LlxuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNhbid0IHJlc3RhcnQgcmlnaHQgbm93LCB3ZSBtaWdodCBnZXQgYW5cbiAgICAgIC8vIG9wcG9ydHVuaXR5IGxhdGVyLiBTbyB3ZSBtYXJrIHRoaXMgcmVuZGVyIGFzIGhhdmluZyBhIHBpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMsIHBpbmdlZExhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn1cblxuZnVuY3Rpb24gcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50IG9yIFN1c3BlbnNlTGlzdCBjb21wb25lbnQpXG4gIC8vIHByZXZpb3VzbHkgd2FzIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0XG4gIC8vIHN1c3BlbmRlZCBpdCBoYXMgcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzXG4gIC8vIGxpa2VseSB1bmJsb2NrZWQuIFRyeSByZW5kZXJpbmcgYWdhaW4sIGF0IGEgbmV3IGxhbmVzLlxuICBpZiAocmV0cnlMYW5lID09PSBOb0xhbmUpIHtcbiAgICAvLyBUT0RPOiBBc3NpZ24gdGhpcyB0byBgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmVgPyB0byBhdm9pZFxuICAgIC8vIHVubmVjZXNzYXJ5IGVudGFuZ2xlbWVudD9cbiAgICByZXRyeUxhbmUgPSByZXF1ZXN0UmV0cnlMYW5lKGJvdW5kYXJ5RmliZXIpO1xuICB9IC8vIFRPRE86IFNwZWNpYWwgY2FzZSBpZGxlIHByaW9yaXR5P1xuXG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCByZXRyeUxhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV0cnlEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShib3VuZGFyeUZpYmVyKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gYm91bmRhcnlGaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgcmV0cnlMYW5lID0gTm9MYW5lO1xuXG4gIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgcmV0cnlMYW5lID0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmU7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVSZXRyeVdha2VhYmxlKGJvdW5kYXJ5RmliZXIsIHdha2VhYmxlKSB7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7IC8vIERlZmF1bHRcblxuICB2YXIgcmV0cnlDYWNoZTtcblxuICBzd2l0Y2ggKGJvdW5kYXJ5RmliZXIudGFnKSB7XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gYm91bmRhcnlGaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGluZ2VkIHVua25vd24gc3VzcGVuc2UgYm91bmRhcnkgdHlwZS4gJyArICdUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIFJlYWN0LicpO1xuICB9XG5cbiAgaWYgKHJldHJ5Q2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICByZXRyeUNhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn0gLy8gQ29tcHV0ZXMgdGhlIG5leHQgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2UgKEpORCkgYm91bmRhcnkuXG4vLyBUaGUgdGhlb3J5IGlzIHRoYXQgYSBwZXJzb24gY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuXG4vLyBUaGVyZWZvcmUsIGlmIHdlIHdhaXQgYSBiaXQgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5IHRoYXQgd29uJ3QgdHJhbnNsYXRlIHRvIGEgbm90aWNlYWJsZVxuLy8gZGlmZmVyZW5jZSBpbiB0aGUgZXhwZXJpZW5jZS4gSG93ZXZlciwgd2FpdGluZyBmb3IgbG9uZ2VyIG1pZ2h0IG1lYW4gdGhhdCB3ZSBjYW4gYXZvaWRcbi8vIHNob3dpbmcgYW4gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFRoZSBsb25nZXIgd2UgaGF2ZSBhbHJlYWR5IHdhaXRlZCwgdGhlIGhhcmRlciBpdFxuLy8gaXMgdG8gdGVsbCBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLiBUaGVyZWZvcmUsIHRoZSBsb25nZXIgd2UndmUgYWxyZWFkeSB3YWl0ZWQsXG4vLyB0aGUgbG9uZ2VyIHdlIGNhbiB3YWl0IGFkZGl0aW9uYWxseS4gQXQgc29tZSBwb2ludCB3ZSBoYXZlIHRvIGdpdmUgdXAgdGhvdWdoLlxuLy8gV2UgcGljayBhIHRyYWluIG1vZGVsIHdoZXJlIHRoZSBuZXh0IGJvdW5kYXJ5IGNvbW1pdHMgYXQgYSBjb25zaXN0ZW50IHNjaGVkdWxlLlxuLy8gVGhlc2UgcGFydGljdWxhciBudW1iZXJzIGFyZSB2YWd1ZSBlc3RpbWF0ZXMuIFdlIGV4cGVjdCB0byBhZGp1c3QgdGhlbSBiYXNlZCBvbiByZXNlYXJjaC5cblxuZnVuY3Rpb24gam5kKHRpbWVFbGFwc2VkKSB7XG4gIHJldHVybiB0aW1lRWxhcHNlZCA8IDEyMCA/IDEyMCA6IHRpbWVFbGFwc2VkIDwgNDgwID8gNDgwIDogdGltZUVsYXBzZWQgPCAxMDgwID8gMTA4MCA6IHRpbWVFbGFwc2VkIDwgMTkyMCA/IDE5MjAgOiB0aW1lRWxhcHNlZCA8IDMwMDAgPyAzMDAwIDogdGltZUVsYXBzZWQgPCA0MzIwID8gNDMyMCA6IGNlaWwodGltZUVsYXBzZWQgLyAxOTYwKSAqIDE5NjA7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpIHtcbiAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVCkge1xuICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuICAgIHRocm93IG5ldyBFcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyAncmVwZWF0ZWRseSBjYWxscyBzZXRTdGF0ZSBpbnNpZGUgY29tcG9uZW50V2lsbFVwZGF0ZSBvciAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gUmVhY3QgbGltaXRzIHRoZSBudW1iZXIgb2YgbmVzdGVkIHVwZGF0ZXMgdG8gJyArICdwcmV2ZW50IGluZmluaXRlIGxvb3BzLicpO1xuICB9XG5cbiAge1xuICAgIGlmIChuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPiBORVNURURfUEFTU0lWRV9VUERBVEVfTElNSVQpIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDtcblxuICAgICAgZXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgXCJjYWxscyBzZXRTdGF0ZSBpbnNpZGUgdXNlRWZmZWN0LCBidXQgdXNlRWZmZWN0IGVpdGhlciBkb2Vzbid0IFwiICsgJ2hhdmUgYSBkZXBlbmRlbmN5IGFycmF5LCBvciBvbmUgb2YgdGhlIGRlcGVuZGVuY2llcyBjaGFuZ2VzIG9uICcgKyAnZXZlcnkgcmVuZGVyLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKSB7XG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nKCk7XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncygpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYoZmliZXIsIGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gIHtcbiAgICAvLyBUT0RPIChTdHJpY3RFZmZlY3RzKSBTaG91bGQgd2Ugc2V0IGEgbWFya2VyIG9uIHRoZSByb290IGlmIGl0IGNvbnRhaW5zIHN0cmljdCBlZmZlY3RzXG4gICAgLy8gc28gd2UgZG9uJ3QgdHJhdmVyc2UgdW5uZWNlc3NhcmlseT8gc2ltaWxhciB0byBzdWJ0cmVlRmxhZ3MgYnV0IGp1c3QgYXQgdGhlIHJvb3QgbGV2ZWwuXG4gICAgLy8gTWF5YmUgbm90IGEgYmlnIGRlYWwgc2luY2UgdGhpcyBpcyBERVYgb25seSBiZWhhdmlvci5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdFVubW91bnRJbkRFVik7XG5cbiAgICBpZiAoaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRQYXNzaXZlRGV2LCBpbnZva2VQYXNzaXZlRWZmZWN0VW5tb3VudEluREVWKTtcbiAgICB9XG5cbiAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50TGF5b3V0RGV2LCBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RNb3VudEluREVWKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUVmZmVjdHNJbkRldihmaXJzdENoaWxkLCBmaWJlckZsYWdzLCBpbnZva2VFZmZlY3RGbikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgdmFyIGN1cnJlbnQgPSBmaXJzdENoaWxkO1xuICAgIHZhciBzdWJ0cmVlUm9vdCA9IG51bGw7XG5cbiAgICB3aGlsZSAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByaW1hcnlTdWJ0cmVlRmxhZyA9IGN1cnJlbnQuc3VidHJlZUZsYWdzICYgZmliZXJGbGFncztcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IHN1YnRyZWVSb290ICYmIGN1cnJlbnQuY2hpbGQgIT09IG51bGwgJiYgcHJpbWFyeVN1YnRyZWVGbGFnICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKChjdXJyZW50LmZsYWdzICYgZmliZXJGbGFncykgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICBpbnZva2VFZmZlY3RGbihjdXJyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50LnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5zaWJsaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnQgPSBzdWJ0cmVlUm9vdCA9IGN1cnJlbnQucmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIFdlIGxldCB0aGUgb3RoZXIgd2FybmluZyBhYm91dCByZW5kZXIgcGhhc2UgdXBkYXRlcyBkZWFsIHdpdGggdGhpcyBvbmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0YWcgPSBmaWJlci50YWc7XG5cbiAgICBpZiAodGFnICE9PSBJbmRldGVybWluYXRlQ29tcG9uZW50ICYmIHRhZyAhPT0gSG9zdFJvb3QgJiYgdGFnICE9PSBDbGFzc0NvbXBvbmVudCAmJiB0YWcgIT09IEZ1bmN0aW9uQ29tcG9uZW50ICYmIHRhZyAhPT0gRm9yd2FyZFJlZiAmJiB0YWcgIT09IE1lbW9Db21wb25lbnQgJiYgdGFnICE9PSBTaW1wbGVNZW1vQ29tcG9uZW50KSB7XG4gICAgICAvLyBPbmx5IHdhcm4gZm9yIHVzZXItZGVmaW5lZCBjb21wb25lbnRzLCBub3QgaW50ZXJuYWwgb25lcyBsaWtlIFN1c3BlbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2Ugc2hvdyB0aGUgd2hvbGUgc3RhY2sgYnV0IGRlZHVwZSBvbiB0aGUgdG9wIGNvbXBvbmVudCdzIG5hbWUgYmVjYXVzZVxuICAgIC8vIHRoZSBwcm9ibGVtYXRpYyBjb2RlIGFsbW9zdCBhbHdheXMgbGllcyBpbnNpZGUgdGhhdCBjb21wb25lbnQuXG5cblxuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1JlYWN0Q29tcG9uZW50JztcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG5ldyBTZXQoW2NvbXBvbmVudE5hbWVdKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgZXJyb3IoXCJDYW4ndCBwZXJmb3JtIGEgUmVhY3Qgc3RhdGUgdXBkYXRlIG9uIGEgY29tcG9uZW50IHRoYXQgaGFzbid0IG1vdW50ZWQgeWV0LiBcIiArICdUaGlzIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGEgc2lkZS1lZmZlY3QgaW4geW91ciByZW5kZXIgZnVuY3Rpb24gdGhhdCAnICsgJ2FzeW5jaHJvbm91c2x5IGxhdGVyIGNhbGxzIHRyaWVzIHRvIHVwZGF0ZSB0aGUgY29tcG9uZW50LiBNb3ZlIHRoaXMgd29yayB0byAnICsgJ3VzZUVmZmVjdCBpbnN0ZWFkLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbnZhciBiZWdpbldvcmskMTtcblxue1xuICB2YXIgZHVtbXlGaWJlciA9IG51bGw7XG5cbiAgYmVnaW5Xb3JrJDEgPSBmdW5jdGlvbiAoY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpIHtcbiAgICAvLyBJZiBhIGNvbXBvbmVudCB0aHJvd3MgYW4gZXJyb3IsIHdlIHJlcGxheSBpdCBhZ2FpbiBpbiBhIHN5bmNocm9ub3VzbHlcbiAgICAvLyBkaXNwYXRjaGVkIGV2ZW50LCBzbyB0aGF0IHRoZSBkZWJ1Z2dlciB3aWxsIHRyZWF0IGl0IGFzIGFuIHVuY2F1Z2h0XG4gICAgLy8gZXJyb3IgU2VlIFJlYWN0RXJyb3JVdGlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjb3B5IHRoZSB3b3JrLWluLXByb2dyZXNzIG9udG8gYSBkdW1teVxuICAgIC8vIGZpYmVyLiBJZiBiZWdpbldvcmsgdGhyb3dzLCB3ZSdsbCB1c2UgdGhpcyB0byByZXNldCB0aGUgc3RhdGUuXG4gICAgdmFyIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5ID0gYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYoZHVtbXlGaWJlciwgdW5pdE9mV29yayk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGJlZ2luV29yayhjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG4gICAgfSBjYXRjaCAob3JpZ2luYWxFcnJvcikge1xuICAgICAgaWYgKGRpZFN1c3BlbmRPckVycm9yV2hpbGVIeWRyYXRpbmdERVYoKSB8fCBvcmlnaW5hbEVycm9yICE9PSBudWxsICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvci50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIERvbid0IHJlcGxheSBwcm9taXNlcy5cbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IGVycm9ycyBpZiB3ZSBhcmUgaHlkcmF0aW5nIGFuZCBoYXZlIGFscmVhZHkgc3VzcGVuZGVkIG9yIGhhbmRsZWQgYW4gZXJyb3JcbiAgICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICAgIH0gLy8gS2VlcCB0aGlzIGNvZGUgaW4gc3luYyB3aXRoIGhhbmRsZUVycm9yOyBhbnkgY2hhbmdlcyBoZXJlIG11c3QgaGF2ZVxuICAgICAgLy8gY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRoZXJlLlxuXG5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTsgLy8gRG9uJ3QgcmVzZXQgY3VycmVudCBkZWJ1ZyBmaWJlciwgc2luY2Ugd2UncmUgYWJvdXQgdG8gd29yayBvbiB0aGVcbiAgICAgIC8vIHNhbWUgZmliZXIgYWdhaW4uXG4gICAgICAvLyBVbndpbmQgdGhlIGZhaWxlZCBzdGFjayBmcmFtZVxuXG4gICAgICB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgdW5pdE9mV29yayk7IC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgb2YgdGhlIGZpYmVyLlxuXG4gICAgICBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih1bml0T2ZXb3JrLCBvcmlnaW5hbFdvcmtJblByb2dyZXNzQ29weSk7XG5cbiAgICAgIGlmICggdW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHByb2ZpbGVyIHRpbWVyLlxuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgICB9IC8vIFJ1biBiZWdpbldvcmsgYWdhaW4uXG5cblxuICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGJlZ2luV29yaywgbnVsbCwgY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpO1xuXG4gICAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgICB2YXIgcmVwbGF5RXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYXlFcnJvciA9PT0gJ29iamVjdCcgJiYgcmVwbGF5RXJyb3IgIT09IG51bGwgJiYgcmVwbGF5RXJyb3IuX3N1cHByZXNzTG9nZ2luZyAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgb3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiAhb3JpZ2luYWxFcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7XG4gICAgICAgICAgLy8gSWYgc3VwcHJlc3NlZCwgbGV0IHRoZSBmbGFnIGNhcnJ5IG92ZXIgdG8gdGhlIG9yaWdpbmFsIGVycm9yIHdoaWNoIGlzIHRoZSBvbmUgd2UnbGwgcmV0aHJvdy5cbiAgICAgICAgICBvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIGFsd2F5cyB0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3IgaW4gY2FzZSB0aGUgc2Vjb25kIHJlbmRlciBwYXNzIGlzIG5vdCBpZGVtcG90ZW50LlxuICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGEgbWVtb2l6ZWQgZnVuY3Rpb24gb3IgQ29tbW9uSlMgbW9kdWxlIGRvZXNuJ3QgdGhyb3cgYWZ0ZXIgZmlyc3QgaW52b2NhdGlvbi5cblxuXG4gICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50O1xuXG57XG4gIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiAhZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJpbmdDb21wb25lbnROYW1lID0gd29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ1Vua25vd24nOyAvLyBEZWR1cGUgYnkgdGhlIHJlbmRlcmluZyBjb21wb25lbnQgYmVjYXVzZSBpdCdzIHRoZSBvbmUgdGhhdCBuZWVkcyB0byBiZSBmaXhlZC5cblxuICAgICAgICAgICAgdmFyIGRlZHVwZUtleSA9IHJlbmRlcmluZ0NvbXBvbmVudE5hbWU7XG5cbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmhhcyhkZWR1cGVLZXkpKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudC5hZGQoZGVkdXBlS2V5KTtcbiAgICAgICAgICAgICAgdmFyIHNldFN0YXRlQ29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBhIGNvbXBvbmVudCAoYCVzYCkgd2hpbGUgcmVuZGVyaW5nIGEgJyArICdkaWZmZXJlbnQgY29tcG9uZW50IChgJXNgKS4gVG8gbG9jYXRlIHRoZSBiYWQgc2V0U3RhdGUoKSBjYWxsIGluc2lkZSBgJXNgLCAnICsgJ2ZvbGxvdyB0aGUgc3RhY2sgdHJhY2UgYXMgZGVzY3JpYmVkIGluIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zZXRzdGF0ZS1pbi1yZW5kZXInLCBzZXRTdGF0ZUNvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGR1cmluZyBhbiBleGlzdGluZyBzdGF0ZSB0cmFuc2l0aW9uIChzdWNoIGFzICcgKyAnd2l0aGluIGByZW5kZXJgKS4gUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSAnICsgJ2Z1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4nKTtcblxuICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcykge1xuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcbiAgICAgIG1lbW9pemVkVXBkYXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc2NoZWR1bGluZ0ZpYmVyKSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBzY2hlZHVsaW5nRmliZXIsIGxhbmVzKTtcbiAgICAgIH0pOyAvLyBUaGlzIGZ1bmN0aW9uIGludGVudGlvbmFsbHkgZG9lcyBub3QgY2xlYXIgbWVtb2l6ZWQgdXBkYXRlcnMuXG4gICAgICAvLyBUaG9zZSBtYXkgc3RpbGwgYmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgY29tbWl0XG4gICAgICAvLyBhbmQgYSBmdXR1cmUgb25lIChlLmcuIFN1c3BlbnNlKS5cbiAgICB9XG4gIH1cbn1cbnZhciBmYWtlQWN0Q2FsbGJhY2tOb2RlID0ge307XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2skMShwcmlvcml0eUxldmVsLCBjYWxsYmFjaykge1xuICB7XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhbiBgYWN0YCBzY29wZSwgYnlwYXNzIFNjaGVkdWxlciBhbmQgcHVzaCB0b1xuICAgIC8vIHRoZSBgYWN0YCBxdWV1ZSBpbnN0ZWFkLlxuICAgIHZhciBhY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudDtcblxuICAgIGlmIChhY3RRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgYWN0UXVldWUucHVzaChjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZmFrZUFjdENhbGxiYWNrTm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5jZWxDYWxsYmFjayQxKGNhbGxiYWNrTm9kZSkge1xuICBpZiAoIGNhbGxiYWNrTm9kZSA9PT0gZmFrZUFjdENhbGxiYWNrTm9kZSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBJbiBwcm9kdWN0aW9uLCBhbHdheXMgY2FsbCBTY2hlZHVsZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBzdHJpcHBlZCBvdXQuXG5cblxuICByZXR1cm4gY2FuY2VsQ2FsbGJhY2soY2FsbGJhY2tOb2RlKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkge1xuICAvLyBOZXZlciBmb3JjZSBmbHVzaCBpbiBwcm9kdWN0aW9uLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBnZXQgc3RyaXBwZWQgb3V0LlxuICByZXR1cm4gIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBpZiAoIWlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlZ2FjeSBtb2RlIGhhcyBhZGRpdGlvbmFsIGNhc2VzIHdoZXJlIHdlIHN1cHByZXNzIGEgd2FybmluZy5cbiAgICAgIGlmICghaXNMZWdhY3lBY3RFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgIC8vIE5vdCBpbiBhbiBhY3QgZW52aXJvbm1lbnQuIE5vIG5lZWQgdG8gd2Fybi5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCAhPT0gTm9Db250ZXh0KSB7XG4gICAgICAgIC8vIExlZ2FjeSBtb2RlIGRvZXNuJ3Qgd2FybiBpZiB0aGUgdXBkYXRlIGlzIGJhdGNoZWQsIGkuZS5cbiAgICAgICAgLy8gYmF0Y2hlZFVwZGF0ZXMgb3IgZmx1c2hTeW5jLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWJlci50YWcgIT09IEZ1bmN0aW9uQ29tcG9uZW50ICYmIGZpYmVyLnRhZyAhPT0gRm9yd2FyZFJlZiAmJiBmaWJlci50YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcHJlLWhvb2tzIGNvZGUsIGxlZ2FjeSBtb2RlIG9ubHlcbiAgICAgICAgLy8gd2FybnMgZm9yIHVwZGF0ZXMgdGhhdCBvcmlnaW5hdGUgZnJvbSBhIGhvb2suXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSB0byAlcyBpbnNpZGUgYSB0ZXN0IHdhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IGNhdXNlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIHNob3VsZCBiZSAnICsgJ3dyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0JywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCkge1xuICB7XG4gICAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignQSBzdXNwZW5kZWQgcmVzb3VyY2UgZmluaXNoZWQgbG9hZGluZyBpbnNpZGUgYSB0ZXN0LCBidXQgdGhlIGV2ZW50ICcgKyAnd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgcmVzb2x2ZXMgc3VzcGVuZGVkIGRhdGEgc2hvdWxkIGJlIHdyYXBwZWQgJyArICdpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmluaXNoIGxvYWRpbmcgc3VzcGVuZGVkIGRhdGEgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGlzUnVubmluZykge1xuICB7XG4gICAgaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gaXNSdW5uaW5nO1xuICB9XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXMgKi9cbnZhciByZXNvbHZlRmFtaWx5ID0gbnVsbDsgLy8gJEZsb3dGaXhNZSBGbG93IGdldHMgY29uZnVzZWQgYnkgYSBXZWFrU2V0IGZlYXR1cmUgY2hlY2sgYmVsb3cuXG5cbnZhciBmYWlsZWRCb3VuZGFyaWVzID0gbnVsbDtcbnZhciBzZXRSZWZyZXNoSGFuZGxlciA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gIHtcbiAgICByZXNvbHZlRmFtaWx5ID0gaGFuZGxlcjtcbiAgfVxufTtcbmZ1bmN0aW9uIHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIC8vIE5vIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzLlxuICByZXR1cm4gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseSh0eXBlKTtcblxuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgcmVhbCBmb3J3YXJkUmVmLiBEb24ndCB3YW50IHRvIGNyYXNoIGVhcmx5LlxuICAgICAgaWYgKHR5cGUgIT09IG51bGwgJiYgdHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGb3J3YXJkUmVmIGlzIHNwZWNpYWwgYmVjYXVzZSBpdHMgcmVzb2x2ZWQgLnR5cGUgaXMgYW4gb2JqZWN0LFxuICAgICAgICAvLyBidXQgaXQncyBwb3NzaWJsZSB0aGF0IHdlIG9ubHkgaGF2ZSBpdHMgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGluIHRoZSBtYXAuXG4gICAgICAgIC8vIElmIHRoYXQgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCwgd2UnbGwgYnVpbGQgYSBuZXcgZm9yd2FyZFJlZiB0eXBlLlxuICAgICAgICB2YXIgY3VycmVudFJlbmRlciA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlLnJlbmRlcik7XG5cbiAgICAgICAgaWYgKHR5cGUucmVuZGVyICE9PSBjdXJyZW50UmVuZGVyKSB7XG4gICAgICAgICAgdmFyIHN5bnRoZXRpY1R5cGUgPSB7XG4gICAgICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICAgICAgICAgIHJlbmRlcjogY3VycmVudFJlbmRlclxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAodHlwZS5kaXNwbGF5TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzeW50aGV0aWNUeXBlLmRpc3BsYXlOYW1lID0gdHlwZS5kaXNwbGF5TmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3ludGhldGljVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhmaWJlciwgZWxlbWVudCkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHByZXZUeXBlID0gZmliZXIuZWxlbWVudFR5cGU7XG4gICAgdmFyIG5leHRUeXBlID0gZWxlbWVudC50eXBlOyAvLyBJZiB3ZSBnb3QgaGVyZSwgd2Uga25vdyB0eXBlcyBhcmVuJ3QgPT09IGVxdWFsLlxuXG4gICAgdmFyIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gZmFsc2U7XG4gICAgdmFyICQkdHlwZW9mTmV4dFR5cGUgPSB0eXBlb2YgbmV4dFR5cGUgPT09ICdvYmplY3QnICYmIG5leHRUeXBlICE9PSBudWxsID8gbmV4dFR5cGUuJCR0eXBlb2YgOiBudWxsO1xuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5leHRUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgaW5uZXIgdHlwZSB5ZXQuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGUgbGF6eSBpbm5lciB0eXBlIGlzIHN0YWJsZSxcbiAgICAgICAgICAgIC8vIGFuZCBzbyBpdCBpcyBzdWZmaWNpZW50IHRvIGF2b2lkIHJlY29uY2lsaW5nIGl0IGF3YXkuXG4gICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gdW53cmFwIG9yIGFjdHVhbGx5IHVzZSB0aGUgbmV3IGxhenkgdHlwZS5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgICAgICAgLy8gVE9ETzogaWYgaXQgd2FzIGJ1dCBjYW4gbm8gbG9uZ2VyIGJlIHNpbXBsZSxcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZG4ndCBzZXQgdGhpcy5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIENoZWNrIGlmIGJvdGggdHlwZXMgaGF2ZSBhIGZhbWlseSBhbmQgaXQncyB0aGUgc2FtZSBvbmUuXG5cblxuICAgIGlmIChuZWVkc0NvbXBhcmVGYW1pbGllcykge1xuICAgICAgLy8gTm90ZTogbWVtbygpIGFuZCBmb3J3YXJkUmVmKCkgd2UnbGwgY29tcGFyZSBvdXRlciByYXRoZXIgdGhhbiBpbm5lciB0eXBlLlxuICAgICAgLy8gVGhpcyBtZWFucyBib3RoIG9mIHRoZW0gbmVlZCB0byBiZSByZWdpc3RlcmVkIHRvIHByZXNlcnZlIHN0YXRlLlxuICAgICAgLy8gSWYgd2UgdW53cmFwcGVkIGFuZCBjb21wYXJlZCB0aGUgaW5uZXIgdHlwZXMgZm9yIHdyYXBwZXJzIGluc3RlYWQsXG4gICAgICAvLyB0aGVuIHdlIHdvdWxkIHJpc2sgZmFsc2VseSBzYXlpbmcgdHdvIHNlcGFyYXRlIG1lbW8oRm9vKVxuICAgICAgLy8gY2FsbHMgYXJlIGVxdWl2YWxlbnQgYmVjYXVzZSB0aGV5IHdyYXAgdGhlIHNhbWUgRm9vIGZ1bmN0aW9uLlxuICAgICAgdmFyIHByZXZGYW1pbHkgPSByZXNvbHZlRmFtaWx5KHByZXZUeXBlKTtcblxuICAgICAgaWYgKHByZXZGYW1pbHkgIT09IHVuZGVmaW5lZCAmJiBwcmV2RmFtaWx5ID09PSByZXNvbHZlRmFtaWx5KG5leHRUeXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIFdlYWtTZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyA9PT0gbnVsbCkge1xuICAgICAgZmFpbGVkQm91bmRhcmllcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgZmFpbGVkQm91bmRhcmllcy5hZGQoZmliZXIpO1xuICB9XG59XG52YXIgc2NoZWR1bGVSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIHVwZGF0ZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHN0YWxlRmFtaWxpZXMgPSB1cGRhdGUuc3RhbGVGYW1pbGllcyxcbiAgICAgICAgdXBkYXRlZEZhbWlsaWVzID0gdXBkYXRlLnVwZGF0ZWRGYW1pbGllcztcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkocm9vdC5jdXJyZW50LCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjaGVkdWxlUm9vdCA9IGZ1bmN0aW9uIChyb290LCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocm9vdC5jb250ZXh0ICE9PSBlbXB0eUNvbnRleHRPYmplY3QpIHtcbiAgICAgIC8vIFN1cGVyIGVkZ2UgY2FzZTogcm9vdCBoYXMgYSBsZWdhY3kgX3JlbmRlclN1YnRyZWUgY29udGV4dFxuICAgICAgLy8gYnV0IHdlIGRvbid0IGtub3cgdGhlIHBhcmVudENvbXBvbmVudCBzbyB3ZSBjYW4ndCBwYXNzIGl0LlxuICAgICAgLy8gSnVzdCBpZ25vcmUuIFdlJ2xsIGRlbGV0ZSB0aGlzIHdpdGggX3JlbmRlclN1YnRyZWUgY29kZSBwYXRoIGxhdGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIHJvb3QsIG51bGwsIG51bGwpO1xuICAgIH0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGZpYmVyLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGUsXG4gICAgICAgIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzb2x2ZUZhbWlseSB0byBiZSBzZXQgZHVyaW5nIGhvdCByZWxvYWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5lZWRzUmVuZGVyID0gZmFsc2U7XG4gICAgdmFyIG5lZWRzUmVtb3VudCA9IGZhbHNlO1xuXG4gICAgaWYgKGNhbmRpZGF0ZVR5cGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KGNhbmRpZGF0ZVR5cGUpO1xuXG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHN0YWxlRmFtaWxpZXMuaGFzKGZhbWlseSkpIHtcbiAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHVwZGF0ZWRGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIGlmICh0YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZWVkc1JlbmRlciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMgIT09IG51bGwpIHtcbiAgICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzLmhhcyhmaWJlcikgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGZhaWxlZEJvdW5kYXJpZXMuaGFzKGFsdGVybmF0ZSkpIHtcbiAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVlZHNSZW1vdW50KSB7XG4gICAgICBmaWJlci5fZGVidWdOZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQgfHwgbmVlZHNSZW5kZXIpIHtcbiAgICAgIHZhciBfcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAoX3Jvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKF9yb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgIW5lZWRzUmVtb3VudCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShjaGlsZCwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShzaWJsaW5nLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIGZhbWlsaWVzKSB7XG4gIHtcbiAgICB2YXIgaG9zdEluc3RhbmNlcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgdHlwZXMgPSBuZXcgU2V0KGZhbWlsaWVzLm1hcChmdW5jdGlvbiAoZmFtaWx5KSB7XG4gICAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gICAgfSkpO1xuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICByZXR1cm4gaG9zdEluc3RhbmNlcztcbiAgfVxufTtcblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KGZpYmVyLCB0eXBlcywgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGRpZE1hdGNoID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVzLmhhcyhjYW5kaWRhdGVUeXBlKSkge1xuICAgICAgICBkaWRNYXRjaCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZE1hdGNoKSB7XG4gICAgICAvLyBXZSBoYXZlIGEgbWF0Y2guIFRoaXMgb25seSBkcmlsbHMgZG93biB0byB0aGUgY2xvc2VzdCBob3N0IGNvbXBvbmVudHMuXG4gICAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gc2VhcmNoIGRlZXBlciBiZWNhdXNlIGZvciB0aGUgcHVycG9zZSBvZiBnaXZpbmdcbiAgICAgIC8vIHZpc3VhbCBmZWVkYmFjaywgXCJmbGFzaGluZ1wiIG91dGVybW9zdCBwYXJlbnQgcmVjdGFuZ2xlcyBpcyBzdWZmaWNpZW50LlxuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsIG1heWJlIHRoZXJlIHdpbGwgYmUgb25lIGZ1cnRoZXIgZG93biBpbiB0aGUgY2hpbGQgdHJlZS5cbiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoY2hpbGQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZpbmRDaGlsZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG5cbiAgICBpZiAoZm91bmRIb3N0SW5zdGFuY2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnkgaG9zdCBjaGlsZHJlbiwgZmFsbGJhY2sgdG8gY2xvc2VzdCBob3N0IHBhcmVudC5cblxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIHJlYWNoIHJvb3QgZmlyc3QuJyk7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuICAgIHZhciBmb3VuZEhvc3RJbnN0YW5jZXMgPSBmYWxzZTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgLy8gV2UgZ290IGEgbWF0Y2guXG4gICAgICAgIGZvdW5kSG9zdEluc3RhbmNlcyA9IHRydWU7XG4gICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTsgLy8gVGhlcmUgbWF5IHN0aWxsIGJlIG1vcmUsIHNvIGtlZXAgc2VhcmNoaW5nLlxuICAgICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZmliZXIpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpYmVyKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBoYXNCYWRNYXBQb2x5ZmlsbDtcblxue1xuICBoYXNCYWRNYXBQb2x5ZmlsbCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5vbkV4dGVuc2libGVPYmplY3QgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldyAqL1xuXG4gICAgbmV3IE1hcChbW25vbkV4dGVuc2libGVPYmplY3QsIG51bGxdXSk7XG4gICAgbmV3IFNldChbbm9uRXh0ZW5zaWJsZU9iamVjdF0pO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbmV3ICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGFib3V0IGJhZCBwb2x5ZmlsbHNcbiAgICBoYXNCYWRNYXBQb2x5ZmlsbCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gSW5zdGFuY2VcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmVsZW1lbnRUeXBlID0gbnVsbDtcbiAgdGhpcy50eXBlID0gbnVsbDtcbiAgdGhpcy5zdGF0ZU5vZGUgPSBudWxsOyAvLyBGaWJlclxuXG4gIHRoaXMucmV0dXJuID0gbnVsbDtcbiAgdGhpcy5jaGlsZCA9IG51bGw7XG4gIHRoaXMuc2libGluZyA9IG51bGw7XG4gIHRoaXMuaW5kZXggPSAwO1xuICB0aGlzLnJlZiA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICB0aGlzLm1vZGUgPSBtb2RlOyAvLyBFZmZlY3RzXG5cbiAgdGhpcy5mbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMuc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5kZWxldGlvbnMgPSBudWxsO1xuICB0aGlzLmxhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgdG8gYXZvaWQgYSB2OCBwZXJmb3JtYW5jZSBjbGlmZi5cbiAgICAvL1xuICAgIC8vIEluaXRpYWxpemluZyB0aGUgZmllbGRzIGJlbG93IHRvIHNtaXMgYW5kIGxhdGVyIHVwZGF0aW5nIHRoZW0gd2l0aFxuICAgIC8vIGRvdWJsZSB2YWx1ZXMgd2lsbCBjYXVzZSBGaWJlcnMgdG8gZW5kIHVwIGhhdmluZyBzZXBhcmF0ZSBzaGFwZXMuXG4gICAgLy8gVGhpcyBiZWhhdmlvci9idWcgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uKCkuXG4gICAgLy8gRm9ydHVuYXRlbHkgdGhpcyBvbmx5IGltcGFjdHMgREVWIGJ1aWxkcy5cbiAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0IG1ha2VzIFJlYWN0IHVudXNhYmx5IHNsb3cgZm9yIHNvbWUgYXBwbGljYXRpb25zLlxuICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBiZWxvdyB3aXRoIGRvdWJsZXMuXG4gICAgLy9cbiAgICAvLyBMZWFybiBtb3JlIGFib3V0IHRoaXMgaGVyZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MzY1XG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9ODUzOFxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47IC8vIEl0J3Mgb2theSB0byByZXBsYWNlIHRoZSBpbml0aWFsIGRvdWJsZXMgd2l0aCBzbWlzIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgIC8vIFRoaXMgd29uJ3QgdHJpZ2dlciB0aGUgcGVyZm9ybWFuY2UgY2xpZmYgbWVudGlvbmVkIGFib3ZlLFxuICAgIC8vIGFuZCBpdCBzaW1wbGlmaWVzIG90aGVyIHByb2ZpbGVyIGNvZGUgKGluY2x1ZGluZyBEZXZUb29scykuXG5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICAvLyBUaGlzIGlzbid0IGRpcmVjdGx5IHVzZWQgYnV0IGlzIGhhbmR5IGZvciBkZWJ1Z2dpbmcgaW50ZXJuYWxzOlxuICAgIHRoaXMuX2RlYnVnU291cmNlID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z093bmVyID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2RlYnVnSG9va1R5cGVzID0gbnVsbDtcblxuICAgIGlmICghaGFzQmFkTWFwUG9seWZpbGwgJiYgdHlwZW9mIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHRoaXMpO1xuICAgIH1cbiAgfVxufSAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGEgUE9KTyBjb25zdHJ1Y3Rvciwgc3RpbGxcbi8vIHBsZWFzZSBlbnN1cmUgd2UgZG8gdGhlIGZvbGxvd2luZzpcbi8vIDEpIE5vYm9keSBzaG91bGQgYWRkIGFueSBpbnN0YW5jZSBtZXRob2RzIG9uIHRoaXMuIEluc3RhbmNlIG1ldGhvZHMgY2FuIGJlXG4vLyAgICBtb3JlIGRpZmZpY3VsdCB0byBwcmVkaWN0IHdoZW4gdGhleSBnZXQgb3B0aW1pemVkIGFuZCB0aGV5IGFyZSBhbG1vc3Rcbi8vICAgIG5ldmVyIGlubGluZWQgcHJvcGVybHkgaW4gc3RhdGljIGNvbXBpbGVycy5cbi8vIDIpIE5vYm9keSBzaG91bGQgcmVseSBvbiBgaW5zdGFuY2VvZiBGaWJlcmAgZm9yIHR5cGUgdGVzdGluZy4gV2Ugc2hvdWxkXG4vLyAgICBhbHdheXMga25vdyB3aGVuIGl0IGlzIGEgZmliZXIuXG4vLyAzKSBXZSBtaWdodCB3YW50IHRvIGV4cGVyaW1lbnQgd2l0aCB1c2luZyBudW1lcmljIGtleXMgc2luY2UgdGhleSBhcmUgZWFzaWVyXG4vLyAgICB0byBvcHRpbWl6ZSBpbiBhIG5vbi1KSVQgZW52aXJvbm1lbnQuXG4vLyA0KSBXZSBjYW4gZWFzaWx5IGdvIGZyb20gYSBjb25zdHJ1Y3RvciB0byBhIGNyZWF0ZUZpYmVyIG9iamVjdCBsaXRlcmFsIGlmIHRoYXRcbi8vICAgIGlzIGZhc3Rlci5cbi8vIDUpIEl0IHNob3VsZCBiZSBlYXN5IHRvIHBvcnQgdGhpcyB0byBhIEMgc3RydWN0IGFuZCBrZWVwIGEgQyBpbXBsZW1lbnRhdGlvblxuLy8gICAgY29tcGF0aWJsZS5cblxuXG52YXIgY3JlYXRlRmliZXIgPSBmdW5jdGlvbiAodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyAkRmxvd0ZpeE1lOiB0aGUgc2hhcGVzIGFyZSBleGFjdCBoZXJlIGJ1dCBGbG93IGRvZXNuJ3QgbGlrZSBjb25zdHJ1Y3RvcnNcbiAgcmV0dXJuIG5ldyBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmICFzaG91bGRDb25zdHJ1Y3QkMSh0eXBlKSAmJiB0eXBlLmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KSB7XG4gIGlmICh0eXBlb2YgQ29tcG9uZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkgPyBDbGFzc0NvbXBvbmVudCA6IEZ1bmN0aW9uQ29tcG9uZW50O1xuICB9IGVsc2UgaWYgKENvbXBvbmVudCAhPT0gdW5kZWZpbmVkICYmIENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IENvbXBvbmVudC4kJHR5cGVvZjtcblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgcmV0dXJuIEZvcndhcmRSZWY7XG4gICAgfVxuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIHJldHVybiBNZW1vQ29tcG9uZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBJbmRldGVybWluYXRlQ29tcG9uZW50O1xufSAvLyBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGFsdGVybmF0ZSBmaWJlciB0byBkbyB3b3JrIG9uLlxuXG5mdW5jdGlvbiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBwZW5kaW5nUHJvcHMpIHtcbiAgdmFyIHdvcmtJblByb2dyZXNzID0gY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzID09PSBudWxsKSB7XG4gICAgLy8gV2UgdXNlIGEgZG91YmxlIGJ1ZmZlcmluZyBwb29saW5nIHRlY2huaXF1ZSBiZWNhdXNlIHdlIGtub3cgdGhhdCB3ZSdsbFxuICAgIC8vIG9ubHkgZXZlciBuZWVkIGF0IG1vc3QgdHdvIHZlcnNpb25zIG9mIGEgdHJlZS4gV2UgcG9vbCB0aGUgXCJvdGhlclwiIHVudXNlZFxuICAgIC8vIG5vZGUgdGhhdCB3ZSdyZSBmcmVlIHRvIHJldXNlLiBUaGlzIGlzIGxhemlseSBjcmVhdGVkIHRvIGF2b2lkIGFsbG9jYXRpbmdcbiAgICAvLyBleHRyYSBvYmplY3RzIGZvciB0aGluZ3MgdGhhdCBhcmUgbmV2ZXIgdXBkYXRlZC4gSXQgYWxzbyBhbGxvdyB1cyB0b1xuICAgIC8vIHJlY2xhaW0gdGhlIGV4dHJhIG1lbW9yeSBpZiBuZWVkZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVGaWJlcihjdXJyZW50LnRhZywgcGVuZGluZ1Byb3BzLCBjdXJyZW50LmtleSwgY3VycmVudC5tb2RlKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9IGN1cnJlbnQuZWxlbWVudFR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50LnN0YXRlTm9kZTtcblxuICAgIHtcbiAgICAgIC8vIERFVi1vbmx5IGZpZWxkc1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlID0gY3VycmVudC5fZGVidWdTb3VyY2U7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gd29ya0luUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGFsdGVybmF0ZS5cbiAgICAvLyBSZXNldCB0aGUgZWZmZWN0IHRhZy5cblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gTm9GbGFnczsgLy8gVGhlIGVmZmVjdHMgYXJlIG5vIGxvbmdlciB2YWxpZC5cblxuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgcmVzZXQsIHJhdGhlciB0aGFuIGNvcHksIGFjdHVhbER1cmF0aW9uICYgYWN0dWFsU3RhcnRUaW1lLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aW1lIGZyb20gZW5kbGVzc2x5IGFjY3VtdWxhdGluZyBpbiBuZXcgY29tbWl0cy5cbiAgICAgIC8vIFRoaXMgaGFzIHRoZSBkb3duc2lkZSBvZiByZXNldHRpbmcgdmFsdWVzIGZvciBkaWZmZXJlbnQgcHJpb3JpdHkgcmVuZGVycyxcbiAgICAgIC8vIEJ1dCB3b3JrcyBmb3IgeWllbGRpbmcgKHRoZSBjb21tb24gY2FzZSkgYW5kIHNob3VsZCBzdXBwb3J0IHJlc3VtaW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgfVxuICB9IC8vIFJlc2V0IGFsbCBlZmZlY3RzIGV4Y2VwdCBzdGF0aWMgb25lcy5cbiAgLy8gU3RhdGljIGVmZmVjdHMgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzID0gY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2s7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gIH07IC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG5cbiAgd29ya0luUHJvZ3Jlc3Muc2libGluZyA9IGN1cnJlbnQuc2libGluZztcbiAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4O1xuICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGN1cnJlbnQuX2RlYnVnTmVlZHNSZW1vdW50O1xuXG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn0gLy8gVXNlZCB0byByZXVzZSBhIEZpYmVyIGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIHJlc2V0cyB0aGUgRmliZXIgdG8gd2hhdCBjcmVhdGVGaWJlciBvciBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZFxuICAvLyBoYXZlIHNldCB0aGUgdmFsdWVzIHRvIGJlZm9yZSBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIElkZWFsbHkgdGhpcyB3b3VsZG4ndFxuICAvLyBiZSBuZWNlc3NhcnkgYnV0IHVuZm9ydHVuYXRlbHkgbWFueSBjb2RlIHBhdGhzIHJlYWRzIGZyb20gdGhlIHdvcmtJblByb2dyZXNzXG4gIC8vIHdoZW4gdGhleSBzaG91bGQgYmUgcmVhZGluZyBmcm9tIGN1cnJlbnQgYW5kIHdyaXRpbmcgdG8gd29ya0luUHJvZ3Jlc3MuXG4gIC8vIFdlIGFzc3VtZSBwZW5kaW5nUHJvcHMsIGluZGV4LCBrZXksIHJlZiwgcmV0dXJuIGFyZSBzdGlsbCB1bnRvdWNoZWQgdG9cbiAgLy8gYXZvaWQgZG9pbmcgYW5vdGhlciByZWNvbmNpbGlhdGlvbi5cbiAgLy8gUmVzZXQgdGhlIGVmZmVjdCBmbGFncyBidXQga2VlcCBhbnkgUGxhY2VtZW50IHRhZ3MsIHNpbmNlIHRoYXQncyBzb21ldGhpbmdcbiAgLy8gdGhhdCBjaGlsZCBmaWJlciBpcyBzZXR0aW5nLCBub3QgdGhlIHJlY29uY2lsaWF0aW9uLlxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSBTdGF0aWNNYXNrIHwgUGxhY2VtZW50OyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUmVzZXQgdG8gY3JlYXRlRmliZXIncyBpbml0aWFsIHZhbHVlcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVzZXQgdG8gdGhlIGNsb25lZCB2YWx1ZXMgdGhhdCBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZCd2ZS5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gY3VycmVudC5jaGlsZExhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBDbG9uZSB0aGUgZGVwZW5kZW5jaWVzIG9iamVjdC4gVGhpcyBpcyBtdXRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLCBzb1xuICAgIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICAgIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudERlcGVuZGVuY2llcyA9PT0gbnVsbCA/IG51bGwgOiB7XG4gICAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgICB9O1xuXG4gICAge1xuICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbFRpbWUgY291bnRzLiBJdCdzIHVzZWZ1bCB0byBhY2N1bXVsYXRlXG4gICAgICAvLyBhY3R1YWwgdGltZSBhY3Jvc3MgbXVsdGlwbGUgcmVuZGVyIHBhc3Nlcy5cbiAgICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhvc3RSb290RmliZXIodGFnLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUpIHtcbiAgdmFyIG1vZGU7XG5cbiAgaWYgKHRhZyA9PT0gQ29uY3VycmVudFJvb3QpIHtcbiAgICBtb2RlID0gQ29uY3VycmVudE1vZGU7XG5cbiAgICBpZiAoaXNTdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgIHtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RFZmZlY3RzTW9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbW9kZSA9IE5vTW9kZTtcbiAgfVxuXG4gIGlmICggaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAvLyBBbHdheXMgY29sbGVjdCBwcm9maWxlIHRpbWluZ3Mgd2hlbiBEZXZUb29scyBhcmUgcHJlc2VudC5cbiAgICAvLyBUaGlzIGVuYWJsZXMgRGV2VG9vbHMgdG8gc3RhcnQgY2FwdHVyaW5nIHRpbWluZyBhdCBhbnkgcG9pbnTigJNcbiAgICAvLyBXaXRob3V0IHNvbWUgbm9kZXMgaW4gdGhlIHRyZWUgaGF2aW5nIGVtcHR5IGJhc2UgdGltZXMuXG4gICAgbW9kZSB8PSBQcm9maWxlTW9kZTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVGaWJlcihIb3N0Um9vdCwgbnVsbCwgbnVsbCwgbW9kZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwgLy8gUmVhY3QkRWxlbWVudFR5cGVcbmtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIGZpYmVyVGFnID0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDsgLy8gVGhlIHJlc29sdmVkIHR5cGUgaXMgc2V0IGlmIHdlIGtub3cgd2hhdCB0aGUgZmluYWwgdHlwZSB3aWxsIGJlLiBJLmUuIGl0J3Mgbm90IGxhenkuXG5cbiAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHNob3VsZENvbnN0cnVjdCQxKHR5cGUpKSB7XG4gICAgICBmaWJlclRhZyA9IENsYXNzQ29tcG9uZW50O1xuXG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBmaWJlclRhZyA9IEhvc3RDb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgZ2V0VGFnOiBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KHBlbmRpbmdQcm9wcy5jaGlsZHJlbiwgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgZmliZXJUYWcgPSBNb2RlO1xuICAgICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgICAgaWYgKCAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgLy8gU3RyaWN0IGVmZmVjdHMgc2hvdWxkIG5ldmVyIHJ1biBvbiBsZWdhY3kgcm9vdHNcbiAgICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2VMaXN0KHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfT0ZGU0NSRUVOX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1NDT1BFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0NBQ0hFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRQcm92aWRlcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNvbnN1bWVyXG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0Q29uc3VtZXI7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEZvcndhcmRSZWY7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IE1lbW9Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTGF6eUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKSA6IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChvd25lck5hbWUpIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRWxlbWVudCB0eXBlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gJyArICdjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpICcgKyAoXCJidXQgZ290OiBcIiArICh0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUpICsgXCIuXCIgKyBpbmZvKSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBvd25lciA9IG51bGw7XG5cbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcGVuZGluZ1Byb3BzID0gZWxlbWVudC5wcm9wcztcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIGtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEZyYWdtZW50LCBlbGVtZW50cywga2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgcGVuZGluZ1Byb3BzLmlkICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgb2YgdHlwZSBgc3RyaW5nYCBhcyBhIHByb3AuIFJlY2VpdmVkIHRoZSB0eXBlIGAlc2AgaW5zdGVhZC4nLCB0eXBlb2YgcGVuZGluZ1Byb3BzLmlkKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihQcm9maWxlciwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUgfCBQcm9maWxlTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgICAgZWZmZWN0RHVyYXRpb246IDAsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlTGlzdENvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihPZmZzY3JlZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgdmFyIHByaW1hcnlDaGlsZEluc3RhbmNlID0ge1xuICAgIGlzSGlkZGVuOiBmYWxzZVxuICB9O1xuICBmaWJlci5zdGF0ZU5vZGUgPSBwcmltYXJ5Q2hpbGRJbnN0YW5jZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tVGV4dChjb250ZW50LCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0VGV4dCwgY29udGVudCwgbnVsbCwgbW9kZSk7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUhvc3RJbnN0YW5jZUZvckRlbGV0aW9uKCkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0Q29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9ICdERUxFVEVEJztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KGRlaHlkcmF0ZWROb2RlKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKERlaHlkcmF0ZWRGcmFnbWVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgZmliZXIuc3RhdGVOb2RlID0gZGVoeWRyYXRlZE5vZGU7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBwb3J0YWwuY2hpbGRyZW4gIT09IG51bGwgPyBwb3J0YWwuY2hpbGRyZW4gOiBbXTtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFBvcnRhbCwgcGVuZGluZ1Byb3BzLCBwb3J0YWwua2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgIGNvbnRhaW5lckluZm86IHBvcnRhbC5jb250YWluZXJJbmZvLFxuICAgIHBlbmRpbmdDaGlsZHJlbjogbnVsbCxcbiAgICAvLyBVc2VkIGJ5IHBlcnNpc3RlbnQgdXBkYXRlc1xuICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb25cbiAgfTtcbiAgcmV0dXJuIGZpYmVyO1xufSAvLyBVc2VkIGZvciBzdGFzaGluZyBXSVAgcHJvcGVydGllcyB0byByZXBsYXkgZmFpbGVkIHdvcmsgaW4gREVWLlxuXG5mdW5jdGlvbiBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih0YXJnZXQsIHNvdXJjZSkge1xuICBpZiAodGFyZ2V0ID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBGaWJlcidzIGluaXRpYWwgcHJvcGVydGllcyB3aWxsIGFsd2F5cyBiZSBvdmVyd3JpdHRlbi5cbiAgICAvLyBXZSBvbmx5IHVzZSBhIEZpYmVyIHRvIGVuc3VyZSB0aGUgc2FtZSBoaWRkZW4gY2xhc3Mgc28gREVWIGlzbid0IHNsb3cuXG4gICAgdGFyZ2V0ID0gY3JlYXRlRmliZXIoSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgd3JpdHRlbiBhcyBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMuXG4gIC8vIFdlIHRyaWVkIHRvIHVzZSBPYmplY3QuYXNzaWduKCkgaW5zdGVhZCBidXQgdGhpcyBpcyBjYWxsZWQgaW5cbiAgLy8gdGhlIGhvdHRlc3QgcGF0aCwgYW5kIE9iamVjdC5hc3NpZ24oKSB3YXMgdG9vIHNsb3c6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDJcbiAgLy8gVGhpcyBjb2RlIGlzIERFVi1vbmx5IHNvIHNpemUgaXMgbm90IGEgY29uY2Vybi5cblxuXG4gIHRhcmdldC50YWcgPSBzb3VyY2UudGFnO1xuICB0YXJnZXQua2V5ID0gc291cmNlLmtleTtcbiAgdGFyZ2V0LmVsZW1lbnRUeXBlID0gc291cmNlLmVsZW1lbnRUeXBlO1xuICB0YXJnZXQudHlwZSA9IHNvdXJjZS50eXBlO1xuICB0YXJnZXQuc3RhdGVOb2RlID0gc291cmNlLnN0YXRlTm9kZTtcbiAgdGFyZ2V0LnJldHVybiA9IHNvdXJjZS5yZXR1cm47XG4gIHRhcmdldC5jaGlsZCA9IHNvdXJjZS5jaGlsZDtcbiAgdGFyZ2V0LnNpYmxpbmcgPSBzb3VyY2Uuc2libGluZztcbiAgdGFyZ2V0LmluZGV4ID0gc291cmNlLmluZGV4O1xuICB0YXJnZXQucmVmID0gc291cmNlLnJlZjtcbiAgdGFyZ2V0LnBlbmRpbmdQcm9wcyA9IHNvdXJjZS5wZW5kaW5nUHJvcHM7XG4gIHRhcmdldC5tZW1vaXplZFByb3BzID0gc291cmNlLm1lbW9pemVkUHJvcHM7XG4gIHRhcmdldC51cGRhdGVRdWV1ZSA9IHNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgdGFyZ2V0Lm1lbW9pemVkU3RhdGUgPSBzb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgdGFyZ2V0LmRlcGVuZGVuY2llcyA9IHNvdXJjZS5kZXBlbmRlbmNpZXM7XG4gIHRhcmdldC5tb2RlID0gc291cmNlLm1vZGU7XG4gIHRhcmdldC5mbGFncyA9IHNvdXJjZS5mbGFncztcbiAgdGFyZ2V0LnN1YnRyZWVGbGFncyA9IHNvdXJjZS5zdWJ0cmVlRmxhZ3M7XG4gIHRhcmdldC5kZWxldGlvbnMgPSBzb3VyY2UuZGVsZXRpb25zO1xuICB0YXJnZXQubGFuZXMgPSBzb3VyY2UubGFuZXM7XG4gIHRhcmdldC5jaGlsZExhbmVzID0gc291cmNlLmNoaWxkTGFuZXM7XG4gIHRhcmdldC5hbHRlcm5hdGUgPSBzb3VyY2UuYWx0ZXJuYXRlO1xuXG4gIHtcbiAgICB0YXJnZXQuYWN0dWFsRHVyYXRpb24gPSBzb3VyY2UuYWN0dWFsRHVyYXRpb247XG4gICAgdGFyZ2V0LmFjdHVhbFN0YXJ0VGltZSA9IHNvdXJjZS5hY3R1YWxTdGFydFRpbWU7XG4gICAgdGFyZ2V0LnNlbGZCYXNlRHVyYXRpb24gPSBzb3VyY2Uuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB0YXJnZXQudHJlZUJhc2VEdXJhdGlvbiA9IHNvdXJjZS50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAgdGFyZ2V0Ll9kZWJ1Z1NvdXJjZSA9IHNvdXJjZS5fZGVidWdTb3VyY2U7XG4gIHRhcmdldC5fZGVidWdPd25lciA9IHNvdXJjZS5fZGVidWdPd25lcjtcbiAgdGFyZ2V0Ll9kZWJ1Z05lZWRzUmVtb3VudCA9IHNvdXJjZS5fZGVidWdOZWVkc1JlbW91bnQ7XG4gIHRhcmdldC5fZGVidWdIb29rVHlwZXMgPSBzb3VyY2UuX2RlYnVnSG9va1R5cGVzO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBGaWJlclJvb3ROb2RlKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKSB7XG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmNvbnRhaW5lckluZm8gPSBjb250YWluZXJJbmZvO1xuICB0aGlzLnBlbmRpbmdDaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIHRoaXMucGluZ0NhY2hlID0gbnVsbDtcbiAgdGhpcy5maW5pc2hlZFdvcmsgPSBudWxsO1xuICB0aGlzLnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICB0aGlzLmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgdGhpcy5ldmVudFRpbWVzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5leHBpcmF0aW9uVGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vVGltZXN0YW1wKTtcbiAgdGhpcy5wZW5kaW5nTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZXhwaXJlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5tdXRhYmxlUmVhZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZW50YW5nbGVtZW50cyA9IGNyZWF0ZUxhbmVNYXAoTm9MYW5lcyk7XG4gIHRoaXMuaWRlbnRpZmllclByZWZpeCA9IGlkZW50aWZpZXJQcmVmaXg7XG4gIHRoaXMub25SZWNvdmVyYWJsZUVycm9yID0gb25SZWNvdmVyYWJsZUVycm9yO1xuXG4gIHtcbiAgICB0aGlzLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIHRoaXMuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIHRoaXMucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLm1lbW9pemVkVXBkYXRlcnMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSB0aGlzLnBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBUb3RhbExhbmVzOyBfaSsrKSB7XG4gICAgICBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwLnB1c2gobmV3IFNldCgpKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgQ29uY3VycmVudFJvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSBoeWRyYXRlID8gJ2h5ZHJhdGVSb290KCknIDogJ2NyZWF0ZVJvb3QoKSc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIExlZ2FjeVJvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSBoeWRyYXRlID8gJ2h5ZHJhdGUoKScgOiAncmVuZGVyKCknO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgLy8gVE9ETzogV2UgaGF2ZSBzZXZlcmFsIG9mIHRoZXNlIGFyZ3VtZW50cyB0aGF0IGFyZSBjb25jZXB0dWFsbHkgcGFydCBvZiB0aGVcbi8vIGhvc3QgY29uZmlnLCBidXQgYmVjYXVzZSB0aGV5IGFyZSBwYXNzZWQgaW4gYXQgcnVudGltZSwgd2UgaGF2ZSB0byB0aHJlYWRcbi8vIHRoZW0gdGhyb3VnaCB0aGUgcm9vdCBjb25zdHJ1Y3Rvci4gUGVyaGFwcyB3ZSBzaG91bGQgcHV0IHRoZW0gYWxsIGludG8gYVxuLy8gc2luZ2xlIHR5cGUsIGxpa2UgYSBEeW5hbWljSG9zdENvbmZpZyB0aGF0IGlzIGRlZmluZWQgYnkgdGhlIHJlbmRlcmVyLlxuaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciByb290ID0gbmV3IEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICAvLyBzdGF0ZU5vZGUgaXMgYW55LlxuXG5cbiAgdmFyIHVuaW5pdGlhbGl6ZWRGaWJlciA9IGNyZWF0ZUhvc3RSb290RmliZXIodGFnLCBpc1N0cmljdE1vZGUpO1xuICByb290LmN1cnJlbnQgPSB1bmluaXRpYWxpemVkRmliZXI7XG4gIHVuaW5pdGlhbGl6ZWRGaWJlci5zdGF0ZU5vZGUgPSByb290O1xuXG4gIHtcbiAgICB2YXIgX2luaXRpYWxTdGF0ZSA9IHtcbiAgICAgIGVsZW1lbnQ6IGluaXRpYWxDaGlsZHJlbixcbiAgICAgIGlzRGVoeWRyYXRlZDogaHlkcmF0ZSxcbiAgICAgIGNhY2hlOiBudWxsLFxuICAgICAgLy8gbm90IGVuYWJsZWQgeWV0XG4gICAgICB0cmFuc2l0aW9uczogbnVsbCxcbiAgICAgIHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6IG51bGxcbiAgICB9O1xuICAgIHVuaW5pdGlhbGl6ZWRGaWJlci5tZW1vaXplZFN0YXRlID0gX2luaXRpYWxTdGF0ZTtcbiAgfVxuXG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh1bmluaXRpYWxpemVkRmliZXIpO1xuICByZXR1cm4gcm9vdDtcbn1cblxudmFyIFJlYWN0VmVyc2lvbiA9ICcxOC4zLjEnO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lckluZm8sIC8vIFRPRE86IGZpZ3VyZSBvdXQgdGhlIEFQSSBmb3IgY3Jvc3MtcmVuZGVyZXIgaW1wbGVtZW50YXRpb24uXG5pbXBsZW1lbnRhdGlvbikge1xuICB2YXIga2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsO1xuXG4gIHtcbiAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGtleSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93IHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBQb3J0YWxcbiAgICAkJHR5cGVvZjogUkVBQ1RfUE9SVEFMX1RZUEUsXG4gICAga2V5OiBrZXkgPT0gbnVsbCA/IG51bGwgOiAnJyArIGtleSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgY29udGFpbmVySW5mbzogY29udGFpbmVySW5mbyxcbiAgICBpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb25cbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXM7XG52YXIgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGU7XG5cbntcbiAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZSA9IHt9O1xufVxuXG5mdW5jdGlvbiBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpIHtcbiAgaWYgKCFwYXJlbnRDb21wb25lbnQpIHtcbiAgICByZXR1cm4gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9XG5cbiAgdmFyIGZpYmVyID0gZ2V0KHBhcmVudENvbXBvbmVudCk7XG4gIHZhciBwYXJlbnRDb250ZXh0ID0gZmluZEN1cnJlbnRVbm1hc2tlZENvbnRleHQoZmliZXIpO1xuXG4gIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgdmFyIENvbXBvbmVudCA9IGZpYmVyLnR5cGU7XG5cbiAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuIHByb2Nlc3NDaGlsZENvbnRleHQoZmliZXIsIENvbXBvbmVudCwgcGFyZW50Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmVudENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnQsIG1ldGhvZE5hbWUpIHtcbiAge1xuICAgIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuXG4gICAgaWYgKGZpYmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoY29tcG9uZW50KS5qb2luKCcsJyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFyZ3VtZW50IGFwcGVhcnMgdG8gbm90IGJlIGEgUmVhY3RDb21wb25lbnQuIEtleXM6IFwiICsga2V5cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTtcblxuICAgIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChob3N0RmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoaG9zdEZpYmVyKTtcblxuICAgICAgICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgZXJyb3IoJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIGlzIGluc2lkZSBTdHJpY3RNb2RlLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IoJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIHJlbmRlcnMgU3RyaWN0TW9kZSBjaGlsZHJlbi4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIC8vIElkZWFsbHkgdGhpcyBzaG91bGQgcmVzZXQgdG8gcHJldmlvdXMgYnV0IHRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBpblxuICAgICAgICAgIC8vIHJlbmRlciBhbmQgdGhlcmUncyBhbm90aGVyIHdhcm5pbmcgZm9yIHRoYXQgYW55d2F5LlxuICAgICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgICBzZXRDdXJyZW50RmliZXIocHJldmlvdXNGaWJlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IGZhbHNlO1xuICB2YXIgaW5pdGlhbENoaWxkcmVuID0gbnVsbDtcbiAgcmV0dXJuIGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCAvLyBUT0RPOiBSZW1vdmUgYGNhbGxiYWNrYCB3aGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZS5cbmNhbGxiYWNrLCBjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIGh5ZHJhdGUgPSB0cnVlO1xuICB2YXIgcm9vdCA9IGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7IC8vIFRPRE86IE1vdmUgdGhpcyB0byBGaWJlclJvb3QgY29uc3RydWN0b3JcblxuICByb290LmNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShudWxsKTsgLy8gU2NoZWR1bGUgdGhlIGluaXRpYWwgcmVuZGVyLiBJbiBhIGh5ZHJhdGlvbiByb290LCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tXG4gIC8vIGEgcmVndWxhciB1cGRhdGUgYmVjYXVzZSB0aGUgaW5pdGlhbCByZW5kZXIgbXVzdCBtYXRjaCB3YXMgd2FzIHJlbmRlcmVkXG4gIC8vIG9uIHRoZSBzZXJ2ZXIuXG4gIC8vIE5PVEU6IFRoaXMgdXBkYXRlIGludGVudGlvbmFsbHkgZG9lc24ndCBoYXZlIGEgcGF5bG9hZC4gV2UncmUgb25seSB1c2luZ1xuICAvLyB0aGUgdXBkYXRlIHRvIHNjaGVkdWxlIHdvcmsgb24gdGhlIHJvb3QgZmliZXIgKGFuZCwgZm9yIGxlZ2FjeSByb290cywgdG9cbiAgLy8gZW5xdWV1ZSB0aGUgY2FsbGJhY2sgaWYgb25lIGlzIHByb3ZpZGVkKS5cblxuICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50KTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsID8gY2FsbGJhY2sgOiBudWxsO1xuICBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQsIHVwZGF0ZSwgbGFuZSk7XG4gIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuICByZXR1cm4gcm9vdDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spIHtcbiAge1xuICAgIG9uU2NoZWR1bGVSb290KGNvbnRhaW5lciwgZWxlbWVudCk7XG4gIH1cblxuICB2YXIgY3VycmVudCQxID0gY29udGFpbmVyLmN1cnJlbnQ7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCQxKTtcblxuICB7XG4gICAgbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKTtcbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KTtcblxuICBpZiAoY29udGFpbmVyLmNvbnRleHQgPT09IG51bGwpIHtcbiAgICBjb250YWluZXIuY29udGV4dCA9IGNvbnRleHQ7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnBlbmRpbmdDb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaXNSZW5kZXJpbmcgJiYgY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcykge1xuICAgICAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZTsgJyArICd0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRlcyBmcm9tIHJlbmRlciBpcyBub3QgYWxsb3dlZC4gJyArICdJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gY29tcG9uZW50RGlkVXBkYXRlLlxcblxcbicgKyAnQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSB8fCAnVW5rbm93bicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogZWxlbWVudFxuICB9O1xuICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7XG5cbiAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoY3VycmVudCQxLCB1cGRhdGUsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSk7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShjb250YWluZXIpIHtcbiAgdmFyIGNvbnRhaW5lckZpYmVyID0gY29udGFpbmVyLmN1cnJlbnQ7XG5cbiAgaWYgKCFjb250YWluZXJGaWJlci5jaGlsZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChjb250YWluZXJGaWJlci5jaGlsZC50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZ2V0UHVibGljSW5zdGFuY2UoY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgICAgICAgLy8gRmx1c2ggdGhlIGZpcnN0IHNjaGVkdWxlZCBcInVwZGF0ZVwiLlxuICAgICAgICAgIHZhciBsYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eVBlbmRpbmdMYW5lcyhyb290KTtcbiAgICAgICAgICBmbHVzaFJvb3Qocm9vdCwgbGFuZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTsgLy8gSWYgd2UncmUgc3RpbGwgYmxvY2tlZCBhZnRlciB0aGlzLCB3ZSBuZWVkIHRvIGluY3JlYXNlXG4gICAgICAgIC8vIHRoZSBwcmlvcml0eSBvZiBhbnkgcHJvbWlzZXMgcmVzb2x2aW5nIHdpdGhpbiB0aGlzXG4gICAgICAgIC8vIGJvdW5kYXJ5IHNvIHRoYXQgdGhleSBuZXh0IGF0dGVtcHQgYWxzbyBoYXMgaGlnaGVyIHByaS5cblxuICAgICAgICB2YXIgcmV0cnlMYW5lID0gU3luY0xhbmU7XG4gICAgICAgIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGhpZ2hlclByaW9yaXR5TGFuZShzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSwgcmV0cnlMYW5lKTtcbiAgfVxufSAvLyBJbmNyZWFzZXMgdGhlIHByaW9yaXR5IG9mIHRoZW5hYmxlcyB3aGVuIHRoZXkgcmVzb2x2ZSB3aXRoaW4gdGhpcyBib3VuZGFyeS5cblxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpO1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUpIHtcbiAgICBtYXJrUmV0cnlMYW5lSW1wbChhbHRlcm5hdGUsIHJldHJ5TGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uJDEoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAvLyBXZSBpZ25vcmUgSG9zdFJvb3RzIGhlcmUgYmVjYXVzZSB3ZSBjYW4ndCBpbmNyZWFzZVxuICAgIC8vIHRoZWlyIHByaW9yaXR5IGFuZCB0aGV5IHNob3VsZCBub3Qgc3VzcGVuZCBvbiBJL08sXG4gICAgLy8gc2luY2UgeW91IGhhdmUgdG8gd3JhcCBhbnl0aGluZyB0aGF0IG1pZ2h0IHN1c3BlbmQgaW5cbiAgICAvLyBTdXNwZW5zZS5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbGFuZSA9IFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9XG5cbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAvLyBXZSBpZ25vcmUgSG9zdFJvb3RzIGhlcmUgYmVjYXVzZSB3ZSBjYW4ndCBpbmNyZWFzZVxuICAgIC8vIHRoZWlyIHByaW9yaXR5IG90aGVyIHRoYW4gc3luY2hyb25vdXNseSBmbHVzaCBpdC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIH1cblxuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhmaWJlcikge1xuICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzKGZpYmVyKTtcblxuICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbn1cblxudmFyIHNob3VsZEVycm9ySW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZEVycm9yKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRFcnJvckltcGwoZmliZXIpO1xufVxuXG52YXIgc2hvdWxkU3VzcGVuZEltcGwgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkU3VzcGVuZChmaWJlcikge1xuICByZXR1cm4gc2hvdWxkU3VzcGVuZEltcGwoZmliZXIpO1xufVxudmFyIG92ZXJyaWRlSG9va1N0YXRlID0gbnVsbDtcbnZhciBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wcyA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBzY2hlZHVsZVVwZGF0ZSA9IG51bGw7XG52YXIgc2V0RXJyb3JIYW5kbGVyID0gbnVsbDtcbnZhciBzZXRTdXNwZW5zZUhhbmRsZXIgPSBudWxsO1xuXG57XG4gIHZhciBjb3B5V2l0aERlbGV0ZUltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCkge1xuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gcGF0aC5sZW5ndGgpIHtcbiAgICAgIGlmIChpc0FycmF5KHVwZGF0ZWQpKSB7XG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKGtleSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtrZXldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuXG4gICAgdXBkYXRlZFtrZXldID0gY29weVdpdGhEZWxldGVJbXBsKG9ialtrZXldLCBwYXRoLCBpbmRleCArIDEpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aERlbGV0ZSA9IGZ1bmN0aW9uIChvYmosIHBhdGgpIHtcbiAgICByZXR1cm4gY29weVdpdGhEZWxldGVJbXBsKG9iaiwgcGF0aCwgMCk7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoUmVuYW1lSW1wbCA9IGZ1bmN0aW9uIChvYmosIG9sZFBhdGgsIG5ld1BhdGgsIGluZGV4KSB7XG4gICAgdmFyIG9sZEtleSA9IG9sZFBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7XG5cbiAgICBpZiAoaW5kZXggKyAxID09PSBvbGRQYXRoLmxlbmd0aCkge1xuICAgICAgdmFyIG5ld0tleSA9IG5ld1BhdGhbaW5kZXhdOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICAgIHVwZGF0ZWRbbmV3S2V5XSA9IHVwZGF0ZWRbb2xkS2V5XTtcblxuICAgICAgaWYgKGlzQXJyYXkodXBkYXRlZCkpIHtcbiAgICAgICAgdXBkYXRlZC5zcGxpY2Uob2xkS2V5LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW29sZEtleV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICAgIHVwZGF0ZWRbb2xkS2V5XSA9IGNvcHlXaXRoUmVuYW1lSW1wbCggLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgb2JqW29sZEtleV0sIG9sZFBhdGgsIG5ld1BhdGgsIGluZGV4ICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoUmVuYW1lID0gZnVuY3Rpb24gKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIGlmIChvbGRQYXRoLmxlbmd0aCAhPT0gbmV3UGF0aC5sZW5ndGgpIHtcbiAgICAgIHdhcm4oJ2NvcHlXaXRoUmVuYW1lKCkgZXhwZWN0cyBwYXRocyBvZiB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1BhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGlmIChvbGRQYXRoW2ldICE9PSBuZXdQYXRoW2ldKSB7XG4gICAgICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIHRvIGJlIHRoZSBzYW1lIGV4Y2VwdCBmb3IgdGhlIGRlZXBlc3Qga2V5Jyk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29weVdpdGhSZW5hbWVJbXBsKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgMCk7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoU2V0SW1wbCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIGluZGV4LCB2YWx1ZSkge1xuICAgIGlmIChpbmRleCA+PSBwYXRoLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aFNldEltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSwgdmFsdWUpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoU2V0SW1wbChvYmosIHBhdGgsIDAsIHZhbHVlKTtcbiAgfTtcblxuICB2YXIgZmluZEhvb2sgPSBmdW5jdGlvbiAoZmliZXIsIGlkKSB7XG4gICAgLy8gRm9yIG5vdywgdGhlIFwiaWRcIiBvZiBzdGF0ZWZ1bCBob29rcyBpcyBqdXN0IHRoZSBzdGF0ZWZ1bCBob29rIGluZGV4LlxuICAgIC8vIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHdpdGggZS5nLiBuZXN0ZWQgaG9va3MuXG4gICAgdmFyIGN1cnJlbnRIb29rID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBpZCA+IDApIHtcbiAgICAgIGN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgICAgIGlkLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRIb29rO1xuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIGVkaXRhYmxlIHZhbHVlcyBmb3IgdXNlU3RhdGUgYW5kIHVzZVJlZHVjZXIuXG5cblxuICBvdmVycmlkZUhvb2tTdGF0ZSA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgsIHZhbHVlKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoU2V0KGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCwgdmFsdWUpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgcGF0aCkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aERlbGV0ZShob29rLm1lbW9pemVkU3RhdGUsIHBhdGgpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aFJlbmFtZShob29rLm1lbW9pemVkU3RhdGUsIG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgcHJvcHMgZm9yIGZ1bmN0aW9uIGNvbXBvbmVudHMsIGZvcndhcmRSZWYsIG1lbW8sIGhvc3QgY29tcG9uZW50cywgZXRjLlxuXG5cbiAgb3ZlcnJpZGVQcm9wcyA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCwgdmFsdWUpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFNldChmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoLCB2YWx1ZSk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoRGVsZXRlKGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFJlbmFtZShmaWJlci5tZW1vaXplZFByb3BzLCBvbGRQYXRoLCBuZXdQYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIHNjaGVkdWxlVXBkYXRlID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIHNldEVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRFcnJvckltcGwpIHtcbiAgICBzaG91bGRFcnJvckltcGwgPSBuZXdTaG91bGRFcnJvckltcGw7XG4gIH07XG5cbiAgc2V0U3VzcGVuc2VIYW5kbGVyID0gZnVuY3Rpb24gKG5ld1Nob3VsZFN1c3BlbmRJbXBsKSB7XG4gICAgc2hvdWxkU3VzcGVuZEltcGwgPSBuZXdTaG91bGRTdXNwZW5kSW1wbDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTtcblxuICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbn1cblxuZnVuY3Rpb24gZW1wdHlGaW5kRmliZXJCeUhvc3RJbnN0YW5jZShpbnN0YW5jZSkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyRm9yRGV2VG9vbHMoKSB7XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG5mdW5jdGlvbiBpbmplY3RJbnRvRGV2VG9vbHMoZGV2VG9vbHNDb25maWcpIHtcbiAgdmFyIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlID0gZGV2VG9vbHNDb25maWcuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U7XG4gIHZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbiAgcmV0dXJuIGluamVjdEludGVybmFscyh7XG4gICAgYnVuZGxlVHlwZTogZGV2VG9vbHNDb25maWcuYnVuZGxlVHlwZSxcbiAgICB2ZXJzaW9uOiBkZXZUb29sc0NvbmZpZy52ZXJzaW9uLFxuICAgIHJlbmRlcmVyUGFja2FnZU5hbWU6IGRldlRvb2xzQ29uZmlnLnJlbmRlcmVyUGFja2FnZU5hbWUsXG4gICAgcmVuZGVyZXJDb25maWc6IGRldlRvb2xzQ29uZmlnLnJlbmRlcmVyQ29uZmlnLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlOiBvdmVycmlkZUhvb2tTdGF0ZSxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6IG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6IG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCxcbiAgICBvdmVycmlkZVByb3BzOiBvdmVycmlkZVByb3BzLFxuICAgIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOiBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCxcbiAgICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aDogb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGgsXG4gICAgc2V0RXJyb3JIYW5kbGVyOiBzZXRFcnJvckhhbmRsZXIsXG4gICAgc2V0U3VzcGVuc2VIYW5kbGVyOiBzZXRTdXNwZW5zZUhhbmRsZXIsXG4gICAgc2NoZWR1bGVVcGRhdGU6IHNjaGVkdWxlVXBkYXRlLFxuICAgIGN1cnJlbnREaXNwYXRjaGVyUmVmOiBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOiBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcixcbiAgICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZmluZEZpYmVyQnlIb3N0SW5zdGFuY2UgfHwgZW1wdHlGaW5kRmliZXJCeUhvc3RJbnN0YW5jZSxcbiAgICAvLyBSZWFjdCBSZWZyZXNoXG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOiAgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJlZnJlc2g6ICBzY2hlZHVsZVJlZnJlc2ggLFxuICAgIHNjaGVkdWxlUm9vdDogIHNjaGVkdWxlUm9vdCAsXG4gICAgc2V0UmVmcmVzaEhhbmRsZXI6ICBzZXRSZWZyZXNoSGFuZGxlciAsXG4gICAgLy8gRW5hYmxlcyBEZXZUb29scyB0byBhcHBlbmQgb3duZXIgc3RhY2tzIHRvIGVycm9yIG1lc3NhZ2VzIGluIERFViBtb2RlLlxuICAgIGdldEN1cnJlbnRGaWJlcjogIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzICxcbiAgICAvLyBFbmFibGVzIERldlRvb2xzIHRvIGRldGVjdCByZWNvbmNpbGVyIHZlcnNpb24gcmF0aGVyIHRoYW4gcmVuZGVyZXIgdmVyc2lvblxuICAgIC8vIHdoaWNoIG1heSBub3QgbWF0Y2ggZm9yIHRoaXJkIHBhcnR5IHJlbmRlcmVycy5cbiAgICByZWNvbmNpbGVyVmVyc2lvbjogUmVhY3RWZXJzaW9uXG4gIH0pO1xufVxuXG4vKiBnbG9iYWwgcmVwb3J0RXJyb3IgKi9cblxudmFyIGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3IgPSB0eXBlb2YgcmVwb3J0RXJyb3IgPT09ICdmdW5jdGlvbicgPyAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHJlcG9ydEVycm9yIHdpbGwgZGlzcGF0Y2ggYW4gZXJyb3IgZXZlbnQsXG4vLyBlbXVsYXRpbmcgYW4gdW5jYXVnaHQgSmF2YVNjcmlwdCBlcnJvci5cbnJlcG9ydEVycm9yIDogZnVuY3Rpb24gKGVycm9yKSB7XG4gIC8vIEluIG9sZGVyIGJyb3dzZXJzIGFuZCB0ZXN0IGVudmlyb25tZW50cywgZmFsbGJhY2sgdG8gY29uc29sZS5lcnJvci5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuICBjb25zb2xlWydlcnJvciddKGVycm9yKTtcbn07XG5cbmZ1bmN0aW9uIFJlYWN0RE9NUm9vdChpbnRlcm5hbFJvb3QpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gaW50ZXJuYWxSb290O1xufVxuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnJlbmRlciA9IFJlYWN0RE9NUm9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIGFuIHVubW91bnRlZCByb290LicpO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcigncmVuZGVyKC4uLik6IGRvZXMgbm90IHN1cHBvcnQgdGhlIHNlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gJyArICdUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgcmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIGEgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9IGVsc2UgaWYgKGlzVmFsaWRDb250YWluZXIoYXJndW1lbnRzWzFdKSkge1xuICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBjb250YWluZXIgdG8gdGhlIHNlY29uZCBhcmd1bWVudCBvZiByb290LnJlbmRlciguLi4pLiAnICsgXCJZb3UgZG9uJ3QgbmVlZCB0byBwYXNzIGl0IGFnYWluIHNpbmNlIHlvdSBhbHJlYWR5IHBhc3NlZCBpdCB0byBjcmVhdGUgdGhlIHJvb3QuXCIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgc2Vjb25kIGFyZ3VtZW50IHRvIHJvb3QucmVuZGVyKC4uLikgYnV0IGl0IG9ubHkgYWNjZXB0cyAnICsgJ29uZSBhcmd1bWVudC4nKTtcbiAgICB9XG5cbiAgICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMocm9vdC5jdXJyZW50KTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSkge1xuICAgICAgICBpZiAoaG9zdEluc3RhbmNlLnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikge1xuICAgICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogSXQgbG9va3MgbGlrZSB0aGUgUmVhY3QtcmVuZGVyZWQgY29udGVudCBvZiB0aGUgJyArICdyb290IGNvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArIFwicm9vdC51bm1vdW50KCkgdG8gZW1wdHkgYSByb290J3MgY29udGFpbmVyLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgbnVsbCwgbnVsbCk7XG59O1xuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnVubW91bnQgPSBSZWFjdERPTVJvb3QucHJvdG90eXBlLnVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3VubW91bnQoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCBhIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdGhpcy5faW50ZXJuYWxSb290ID0gbnVsbDtcbiAgICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuXG4gICAge1xuICAgICAgaWYgKGlzQWxyZWFkeVJlbmRlcmluZygpKSB7XG4gICAgICAgIGVycm9yKCdBdHRlbXB0ZWQgdG8gc3luY2hyb25vdXNseSB1bm1vdW50IGEgcm9vdCB3aGlsZSBSZWFjdCB3YXMgYWxyZWFkeSAnICsgJ3JlbmRlcmluZy4gUmVhY3QgY2Fubm90IGZpbmlzaCB1bm1vdW50aW5nIHRoZSByb290IHVudGlsIHRoZSAnICsgJ2N1cnJlbnQgcmVuZGVyIGhhcyBjb21wbGV0ZWQsIHdoaWNoIG1heSBsZWFkIHRvIGEgcmFjZSBjb25kaXRpb24uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZUNvbnRhaW5lcihudWxsLCByb290LCBudWxsLCBudWxsKTtcbiAgICB9KTtcbiAgICB1bm1hcmtDb250YWluZXJBc1Jvb3QoY29udGFpbmVyKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVJvb3QoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKTtcbiAgdmFyIGlzU3RyaWN0TW9kZSA9IGZhbHNlO1xuICB2YXIgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSA9IGZhbHNlO1xuICB2YXIgaWRlbnRpZmllclByZWZpeCA9ICcnO1xuICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgdmFyIHRyYW5zaXRpb25DYWxsYmFja3MgPSBudWxsO1xuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIGlmIChvcHRpb25zLmh5ZHJhdGUpIHtcbiAgICAgICAgd2FybignaHlkcmF0ZSB0aHJvdWdoIGNyZWF0ZVJvb3QgaXMgZGVwcmVjYXRlZC4gVXNlIFJlYWN0RE9NQ2xpZW50Lmh5ZHJhdGVSb290KGNvbnRhaW5lciwgPEFwcCAvPikgaW5zdGVhZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgICAgICBlcnJvcignWW91IHBhc3NlZCBhIEpTWCBlbGVtZW50IHRvIGNyZWF0ZVJvb3QuIFlvdSBwcm9iYWJseSBtZWFudCB0byAnICsgJ2NhbGwgcm9vdC5yZW5kZXIgaW5zdGVhZC4gJyArICdFeGFtcGxlIHVzYWdlOlxcblxcbicgKyAnICBsZXQgcm9vdCA9IGNyZWF0ZVJvb3QoZG9tQ29udGFpbmVyKTtcXG4nICsgJyAgcm9vdC5yZW5kZXIoPEFwcCAvPik7Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy51bnN0YWJsZV9zdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBpc1N0cmljdE1vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmlkZW50aWZpZXJQcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWRlbnRpZmllclByZWZpeCA9IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbkNhbGxiYWNrcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cmFuc2l0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucy50cmFuc2l0aW9uQ2FsbGJhY2tzO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgQ29uY3VycmVudFJvb3QsIG51bGwsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gIHZhciByb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgcmV0dXJuIG5ldyBSZWFjdERPTVJvb3Qocm9vdCk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NSHlkcmF0aW9uUm9vdChpbnRlcm5hbFJvb3QpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gaW50ZXJuYWxSb290O1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUh5ZHJhdGlvbih0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHF1ZXVlRXhwbGljaXRIeWRyYXRpb25UYXJnZXQodGFyZ2V0KTtcbiAgfVxufVxuXG5SZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnVuc3RhYmxlX3NjaGVkdWxlSHlkcmF0aW9uID0gc2NoZWR1bGVIeWRyYXRpb247XG5mdW5jdGlvbiBoeWRyYXRlUm9vdChjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaHlkcmF0ZVJvb3QoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKTtcblxuICB7XG4gICAgaWYgKGluaXRpYWxDaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvcignTXVzdCBwcm92aWRlIGluaXRpYWwgY2hpbGRyZW4gYXMgc2Vjb25kIGFyZ3VtZW50IHRvIGh5ZHJhdGVSb290LiAnICsgJ0V4YW1wbGUgdXNhZ2U6IGh5ZHJhdGVSb290KGRvbUNvbnRhaW5lciwgPEFwcCAvPiknKTtcbiAgICB9XG4gIH0gLy8gRm9yIG5vdyB3ZSByZXVzZSB0aGUgd2hvbGUgYmFnIG9mIG9wdGlvbnMgc2luY2UgdGhleSBjb250YWluXG4gIC8vIHRoZSBoeWRyYXRpb24gY2FsbGJhY2tzLlxuXG5cbiAgdmFyIGh5ZHJhdGlvbkNhbGxiYWNrcyA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMgOiBudWxsOyAvLyBUT0RPOiBEZWxldGUgdGhpcyBvcHRpb25cblxuICB2YXIgbXV0YWJsZVNvdXJjZXMgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRlZFNvdXJjZXMgfHwgbnVsbDtcbiAgdmFyIGlzU3RyaWN0TW9kZSA9IGZhbHNlO1xuICB2YXIgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSA9IGZhbHNlO1xuICB2YXIgaWRlbnRpZmllclByZWZpeCA9ICcnO1xuICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAob3B0aW9ucy51bnN0YWJsZV9zdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBpc1N0cmljdE1vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmlkZW50aWZpZXJQcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWRlbnRpZmllclByZWZpeCA9IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBudWxsLCBjb250YWluZXIsIENvbmN1cnJlbnRSb290LCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7IC8vIFRoaXMgY2FuJ3QgYmUgYSBjb21tZW50IG5vZGUgc2luY2UgaHlkcmF0aW9uIGRvZXNuJ3Qgd29yayBvbiBjb21tZW50IG5vZGVzIGFueXdheS5cblxuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhjb250YWluZXIpO1xuXG4gIGlmIChtdXRhYmxlU291cmNlcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXV0YWJsZVNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtdXRhYmxlU291cmNlID0gbXV0YWJsZVNvdXJjZXNbaV07XG4gICAgICByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFjdERPTUh5ZHJhdGlvblJvb3Qocm9vdCk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkQ29udGFpbmVyKG5vZGUpIHtcbiAgcmV0dXJuICEhKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgIWRpc2FibGVDb21tZW50c0FzRE9NQ29udGFpbmVycyAgKSk7XG59IC8vIFRPRE86IFJlbW92ZSB0aGlzIGZ1bmN0aW9uIHdoaWNoIGFsc28gaW5jbHVkZXMgY29tbWVudCBub2Rlcy5cbi8vIFdlIG9ubHkgdXNlIGl0IGluIHBsYWNlcyB0aGF0IGFyZSBjdXJyZW50bHkgbW9yZSByZWxheGVkLlxuXG5mdW5jdGlvbiBpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KG5vZGUpIHtcbiAgcmV0dXJuICEhKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIG5vZGUubm9kZVZhbHVlID09PSAnIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlICcpKTtcbn1cblxuZnVuY3Rpb24gd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpIHtcbiAge1xuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBjb250YWluZXIudGFnTmFtZSAmJiBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQk9EWScpIHtcbiAgICAgIGVycm9yKCdjcmVhdGVSb290KCk6IENyZWF0aW5nIHJvb3RzIGRpcmVjdGx5IHdpdGggZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHVzaW5nIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSkge1xuICAgICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00ucmVuZGVyKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpIG9uIGEgY29udGFpbmVyIHRoYXQgJyArICdoYXMgYWxyZWFkeSBiZWVuIHBhc3NlZCB0byBjcmVhdGVSb290KCkgYmVmb3JlLiBJbnN0ZWFkLCBjYWxsICcgKyAncm9vdC5yZW5kZXIoKSBvbiB0aGUgZXhpc3Rpbmcgcm9vdCBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvIHVwZGF0ZSBpdC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzO1xuXG57XG4gIHRvcExldmVsVXBkYXRlV2FybmluZ3MgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyICYmIGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhpcyAnICsgJ2NvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArICdSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlIHRvIGVtcHR5IGEgY29udGFpbmVyLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QgPSAhIWNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShyb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpKTtcblxuICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCAmJiAhaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCkge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ3JlbmRlcigpOiBSZW5kZXJpbmcgY29tcG9uZW50cyBkaXJlY3RseSBpbnRvIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSByZW5kZXJpbmcgaW50byBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3BPblJlY292ZXJhYmxlRXJyb3IoKSB7Ly8gVGhpcyBpc24ndCByZWFjaGFibGUgYmVjYXVzZSBvblJlY292ZXJhYmxlRXJyb3IgaXNuJ3QgY2FsbGVkIGluIHRoZVxuICAvLyBsZWdhY3kgQVBJLlxufVxuXG5mdW5jdGlvbiBsZWdhY3lDcmVhdGVSb290RnJvbURPTUNvbnRhaW5lcihjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaywgaXNIeWRyYXRpb25Db250YWluZXIpIHtcbiAgaWYgKGlzSHlkcmF0aW9uQ29udGFpbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbiAgICAgICAgb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBjcmVhdGVIeWRyYXRpb25Db250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBjYWxsYmFjaywgY29udGFpbmVyLCBMZWdhY3lSb290LCBudWxsLCAvLyBoeWRyYXRpb25DYWxsYmFja3NcbiAgICBmYWxzZSwgLy8gaXNTdHJpY3RNb2RlXG4gICAgZmFsc2UsIC8vIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsXG4gICAgJycsIC8vIGlkZW50aWZpZXJQcmVmaXhcbiAgICBub29wT25SZWNvdmVyYWJsZUVycm9yKTtcbiAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IHJvb3Q7XG4gICAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gICAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgZmx1c2hTeW5jKCk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmlyc3QgY2xlYXIgYW55IGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgdmFyIHJvb3RTaWJsaW5nO1xuXG4gICAgd2hpbGUgKHJvb3RTaWJsaW5nID0gY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHJvb3RTaWJsaW5nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX29yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShfcm9vdCk7XG5cbiAgICAgICAgX29yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBfcm9vdCA9IGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXIsIExlZ2FjeVJvb3QsIG51bGwsIC8vIGh5ZHJhdGlvbkNhbGxiYWNrc1xuICAgIGZhbHNlLCAvLyBpc1N0cmljdE1vZGVcbiAgICBmYWxzZSwgLy8gY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSxcbiAgICAnJywgLy8gaWRlbnRpZmllclByZWZpeFxuICAgIG5vb3BPblJlY292ZXJhYmxlRXJyb3IpO1xuXG4gICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSBfcm9vdDtcbiAgICBtYXJrQ29udGFpbmVyQXNSb290KF9yb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG5cbiAgICB2YXIgX3Jvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcblxuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKF9yb290Q29udGFpbmVyRWxlbWVudCk7IC8vIEluaXRpYWwgbW91bnQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkLlxuXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZUNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIF9yb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3Jvb3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGNoaWxkcmVuLCBjb250YWluZXIsIGZvcmNlSHlkcmF0ZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIHRvcExldmVsVXBkYXRlV2FybmluZ3MoY29udGFpbmVyKTtcbiAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLCAncmVuZGVyJyk7XG4gIH1cblxuICB2YXIgbWF5YmVSb290ID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gIHZhciByb290O1xuXG4gIGlmICghbWF5YmVSb290KSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIHJvb3QgPSBsZWdhY3lDcmVhdGVSb290RnJvbURPTUNvbnRhaW5lcihjb250YWluZXIsIGNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrLCBmb3JjZUh5ZHJhdGUpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QgPSBtYXliZVJvb3Q7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9IC8vIFVwZGF0ZVxuXG5cbiAgICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgcmV0dXJuIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbn1cblxudmFyIGRpZFdhcm5BYm91dEZpbmRET01Ob2RlID0gZmFsc2U7XG5mdW5jdGlvbiBmaW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpIHtcbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RmluZERPTU5vZGUpIHtcbiAgICAgIGRpZFdhcm5BYm91dEZpbmRET01Ob2RlID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ2ZpbmRET01Ob2RlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciAnICsgJ3JlbGVhc2UuIEluc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCAnICsgJ3RvIHJlZmVyZW5jZS4gTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnKTtcbiAgICB9XG5cbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lciQzLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIuc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyO1xuXG4gICAgICBpZiAoIXdhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgZmluZERPTU5vZGUgaW5zaWRlIGl0cyByZW5kZXIoKS4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShvd25lci50eXBlKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgb3duZXIuc3RhdGVOb2RlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50Lm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICByZXR1cm4gY29tcG9uZW50T3JFbGVtZW50O1xuICB9XG5cbiAge1xuICAgIHJldHVybiBmaW5kSG9zdEluc3RhbmNlV2l0aFdhcm5pbmcoY29tcG9uZW50T3JFbGVtZW50LCAnZmluZERPTU5vZGUnKTtcbiAgfVxufVxuZnVuY3Rpb24gaHlkcmF0ZShlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00uaHlkcmF0ZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIFJlYWN0IDE4LiBVc2UgaHlkcmF0ZVJvb3QgJyArICdpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvIHRoZSBuZXcgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyAnICsgXCJpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgMTcuIExlYXJuIFwiICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00uaHlkcmF0ZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KT8nKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogdGhyb3cgb3Igd2FybiBpZiB3ZSBjb3VsZG4ndCBoeWRyYXRlP1xuXG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgdHJ1ZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gcmVuZGVyKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS5yZW5kZXIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiBSZWFjdCAxOC4gVXNlIGNyZWF0ZVJvb3QgJyArICdpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvIHRoZSBuZXcgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyAnICsgXCJpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgMTcuIExlYXJuIFwiICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnJlbmRlcihlbGVtZW50KT8nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCBmYWxzZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCAnICsgJ2luIFJlYWN0IDE4LiBDb25zaWRlciB1c2luZyBhIHBvcnRhbCBpbnN0ZWFkLiBVbnRpbCB5b3Ugc3dpdGNoIHRvICcgKyBcInRoZSBjcmVhdGVSb290IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgaWYgaXQncyBydW5uaW5nIFJlYWN0IFwiICsgJzE3LiBMZWFybiBtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXJOb2RlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIGlmIChwYXJlbnRDb21wb25lbnQgPT0gbnVsbCB8fCAhaGFzKHBhcmVudENvbXBvbmVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcmVudENvbXBvbmVudCBtdXN0IGJlIGEgdmFsaWQgUmVhY3QgQ29tcG9uZW50Jyk7XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBmYWxzZSwgY2FsbGJhY2spO1xufVxudmFyIGRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUgPSBmYWxzZTtcbmZ1bmN0aW9uIHVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUpIHtcbiAgICAgIGRpZFdhcm5BYm91dFVubW91bnRDb21wb25lbnRBdE5vZGUgPSB0cnVlO1xuXG4gICAgICBlcnJvcigndW5tb3VudENvbXBvbmVudEF0Tm9kZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlICcgKyAnbmV4dCBtYWpvciByZWxlYXNlLiBTd2l0Y2ggdG8gdGhlIGNyZWF0ZVJvb3QgQVBJLiBMZWFybiAnICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bm1vdW50Q29tcG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIERpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QudW5tb3VudCgpPycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgIHtcbiAgICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgIHZhciByZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QgPSByb290RWwgJiYgIWdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKTtcblxuICAgICAgaWYgKHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH0gLy8gVW5tb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGBkZWxldGUgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXJgXG4gICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAvLyBnZXQgYHRydWVgIHR3aWNlLiBUaGF0J3MgcHJvYmFibHkgZmluZT9cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHZhciBfcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKF9yb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShfcm9vdEVsKSk7IC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5zZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uJDEpO1xuc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEpO1xuc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShydW5XaXRoUHJpb3JpdHkpO1xuXG57XG4gIGlmICh0eXBlb2YgTWFwICE9PSAnZnVuY3Rpb24nIHx8IC8vICRGbG93SXNzdWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgTWFwIGhhcyBubyBwcm90b3R5cGVcbiAgTWFwLnByb3RvdHlwZSA9PSBudWxsIHx8IHR5cGVvZiBNYXAucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFNldCBoYXMgbm8gcHJvdG90eXBlXG4gIFNldC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5jbGVhciAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgZXJyb3IoJ1JlYWN0IGRlcGVuZHMgb24gTWFwIGFuZCBTZXQgYnVpbHQtaW4gdHlwZXMuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxscycpO1xuICB9XG59XG5cbnNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihyZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMpO1xuc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlcyQxLCBkaXNjcmV0ZVVwZGF0ZXMsIGZsdXNoU3luYyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbCQxKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfSAvLyBUT0RPOiBwYXNzIFJlYWN0RE9NIHBvcnRhbCBpbXBsZW1lbnRhdGlvbiBhcyB0aGlyZCBhcmd1bWVudFxuICAvLyAkRmxvd0ZpeE1lIFRoZSBGbG93IHR5cGUgaXMgb3BhcXVlIGJ1dCB0aGVyZSdzIG5vIHdheSB0byBhY3R1YWxseSBjcmVhdGUgaXQuXG5cblxuICByZXR1cm4gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIsIG51bGwsIGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spO1xufVxuXG52YXIgSW50ZXJuYWxzID0ge1xuICB1c2luZ0NsaWVudEVudHJ5UG9pbnQ6IGZhbHNlLFxuICAvLyBLZWVwIGluIHN5bmMgd2l0aCBSZWFjdFRlc3RVdGlscy5qcy5cbiAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi5cbiAgRXZlbnRzOiBbZ2V0SW5zdGFuY2VGcm9tTm9kZSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSwgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSwgZW5xdWV1ZVN0YXRlUmVzdG9yZSwgcmVzdG9yZVN0YXRlSWZOZWVkZWQsIGJhdGNoZWRVcGRhdGVzJDFdXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290JDEoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHtcbiAgICBpZiAoIUludGVybmFscy51c2luZ0NsaWVudEVudHJ5UG9pbnQgJiYgIWZhbHNlKSB7XG4gICAgICBlcnJvcignWW91IGFyZSBpbXBvcnRpbmcgY3JlYXRlUm9vdCBmcm9tIFwicmVhY3QtZG9tXCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3Ugc2hvdWxkIGluc3RlYWQgaW1wb3J0IGl0IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gaHlkcmF0ZVJvb3QkMShjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykge1xuICB7XG4gICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICFmYWxzZSkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGh5ZHJhdGVSb290IGZyb20gXCJyZWFjdC1kb21cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpO1xufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmZ1bmN0aW9uIGZsdXNoU3luYyQxKGZuKSB7XG4gIHtcbiAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgIGVycm9yKCdmbHVzaFN5bmMgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIGxpZmVjeWNsZSBtZXRob2QuIFJlYWN0IGNhbm5vdCAnICsgJ2ZsdXNoIHdoZW4gUmVhY3QgaXMgYWxyZWFkeSByZW5kZXJpbmcuIENvbnNpZGVyIG1vdmluZyB0aGlzIGNhbGwgdG8gJyArICdhIHNjaGVkdWxlciB0YXNrIG9yIG1pY3JvIHRhc2suJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsdXNoU3luYyhmbik7XG59XG52YXIgZm91bmREZXZUb29scyA9IGluamVjdEludG9EZXZUb29scyh7XG4gIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgYnVuZGxlVHlwZTogIDEgLFxuICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sXG4gIHJlbmRlcmVyUGFja2FnZU5hbWU6ICdyZWFjdC1kb20nXG59KTtcblxue1xuICBpZiAoIWZvdW5kRGV2VG9vbHMgJiYgY2FuVXNlRE9NICYmIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmKSB7XG4gICAgLy8gSWYgd2UncmUgaW4gQ2hyb21lIG9yIEZpcmVmb3gsIHByb3ZpZGUgYSBkb3dubG9hZCBsaW5rIGlmIG5vdCBpbnN0YWxsZWQuXG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkge1xuICAgICAgdmFyIHByb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sOyAvLyBEb24ndCB3YXJuIGluIGV4b3RpYyBjYXNlcyBsaWtlIGNocm9tZS1leHRlbnNpb246Ly8uXG5cbiAgICAgIGlmICgvXihodHRwcz98ZmlsZSk6JC8udGVzdChwcm90b2NvbCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuICAgICAgICBjb25zb2xlLmluZm8oJyVjRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyArIChwcm90b2NvbCA9PT0gJ2ZpbGU6JyA/ICdcXG5Zb3UgbWlnaHQgbmVlZCB0byB1c2UgYSBsb2NhbCBIVFRQIHNlcnZlciAoaW5zdGVhZCBvZiBmaWxlOi8vKTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMtZmFxJyA6ICcnKSwgJ2ZvbnQtd2VpZ2h0OmJvbGQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IEludGVybmFscztcbmV4cG9ydHMuY3JlYXRlUG9ydGFsID0gY3JlYXRlUG9ydGFsJDE7XG5leHBvcnRzLmNyZWF0ZVJvb3QgPSBjcmVhdGVSb290JDE7XG5leHBvcnRzLmZpbmRET01Ob2RlID0gZmluZERPTU5vZGU7XG5leHBvcnRzLmZsdXNoU3luYyA9IGZsdXNoU3luYyQxO1xuZXhwb3J0cy5oeWRyYXRlID0gaHlkcmF0ZTtcbmV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBoeWRyYXRlUm9vdCQxO1xuZXhwb3J0cy5yZW5kZXIgPSByZW5kZXI7XG5leHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGUgPSB1bm1vdW50Q29tcG9uZW50QXROb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyA9IGJhdGNoZWRVcGRhdGVzJDE7XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG0gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGV4cG9ydHMuY3JlYXRlUm9vdCA9IG0uY3JlYXRlUm9vdDtcbiAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IG0uaHlkcmF0ZVJvb3Q7XG59IGVsc2Uge1xuICB2YXIgaSA9IG0uX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG4gIGV4cG9ydHMuY3JlYXRlUm9vdCA9IGZ1bmN0aW9uKGMsIG8pIHtcbiAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtLmNyZWF0ZVJvb3QoYywgbyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gZmFsc2U7XG4gICAgfVxuICB9O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gZnVuY3Rpb24oYywgaCwgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uaHlkcmF0ZVJvb3QoYywgaCwgbyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gZmFsc2U7XG4gICAgfVxuICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBjaGVja0RDRSgpIHtcbiAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuICBpZiAoXG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIFRoaXMgYnJhbmNoIGlzIHVucmVhY2hhYmxlIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZFxuICAgIC8vIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgY29uZGl0aW9uIGlzIHRydWUgb25seSBpbiBkZXZlbG9wbWVudC5cbiAgICAvLyBUaGVyZWZvcmUgaWYgdGhlIGJyYW5jaCBpcyBzdGlsbCBoZXJlLCBkZWFkIGNvZGUgZWxpbWluYXRpb24gd2Fzbid0XG4gICAgLy8gcHJvcGVybHkgYXBwbGllZC5cbiAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIG1lc3NhZ2UuIFJlYWN0IERldlRvb2xzIHJlbGllcyBvbiBpdC4gQWxzbyBtYWtlIHN1cmVcbiAgICAvLyB0aGlzIG1lc3NhZ2UgZG9lc24ndCBvY2N1ciBlbHNld2hlcmUgaW4gdGhpcyBmdW5jdGlvbiwgb3IgaXQgd2lsbCBjYXVzZVxuICAgIC8vIGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdeX14nKTtcbiAgfVxuICB0cnkge1xuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb2RlIGFib3ZlIGhhcyBiZWVuIGRlYWQgY29kZSBlbGltaW5hdGVkIChEQ0UnZCkuXG4gICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKGNoZWNrRENFKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gRGV2VG9vbHMgc2hvdWxkbid0IGNyYXNoIFJlYWN0LCBubyBtYXR0ZXIgd2hhdC5cbiAgICAvLyBXZSBzaG91bGQgc3RpbGwgcmVwb3J0IGluIGNhc2Ugd2UgYnJlYWsgdGhpcyBjb2RlLlxuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAvLyBEQ0UgY2hlY2sgc2hvdWxkIGhhcHBlbiBiZWZvcmUgUmVhY3RET00gYnVuZGxlIGV4ZWN1dGVzIHNvIHRoYXRcbiAgLy8gRGV2VG9vbHMgY2FuIHJlcG9ydCBiYWQgbWluaWZpY2F0aW9uIGR1cmluZyBpbmplY3Rpb24uXG4gIGNoZWNrRENFKCk7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyA9IGZhbHNlO1xudmFyIGVuYWJsZVByb2ZpbGluZyA9IGZhbHNlO1xudmFyIGZyYW1lWWllbGRNcyA9IDU7XG5cbmZ1bmN0aW9uIHB1c2goaGVhcCwgbm9kZSkge1xuICB2YXIgaW5kZXggPSBoZWFwLmxlbmd0aDtcbiAgaGVhcC5wdXNoKG5vZGUpO1xuICBzaWZ0VXAoaGVhcCwgbm9kZSwgaW5kZXgpO1xufVxuZnVuY3Rpb24gcGVlayhoZWFwKSB7XG4gIHJldHVybiBoZWFwLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBoZWFwWzBdO1xufVxuZnVuY3Rpb24gcG9wKGhlYXApIHtcbiAgaWYgKGhlYXAubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZmlyc3QgPSBoZWFwWzBdO1xuICB2YXIgbGFzdCA9IGhlYXAucG9wKCk7XG5cbiAgaWYgKGxhc3QgIT09IGZpcnN0KSB7XG4gICAgaGVhcFswXSA9IGxhc3Q7XG4gICAgc2lmdERvd24oaGVhcCwgbGFzdCwgMCk7XG4gIH1cblxuICByZXR1cm4gZmlyc3Q7XG59XG5cbmZ1bmN0aW9uIHNpZnRVcChoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG5cbiAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgIHZhciBwYXJlbnRJbmRleCA9IGluZGV4IC0gMSA+Pj4gMTtcbiAgICB2YXIgcGFyZW50ID0gaGVhcFtwYXJlbnRJbmRleF07XG5cbiAgICBpZiAoY29tcGFyZShwYXJlbnQsIG5vZGUpID4gMCkge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBsYXJnZXIuIFN3YXAgcG9zaXRpb25zLlxuICAgICAgaGVhcFtwYXJlbnRJbmRleF0gPSBub2RlO1xuICAgICAgaGVhcFtpbmRleF0gPSBwYXJlbnQ7XG4gICAgICBpbmRleCA9IHBhcmVudEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcGFyZW50IGlzIHNtYWxsZXIuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNpZnREb3duKGhlYXAsIG5vZGUsIGkpIHtcbiAgdmFyIGluZGV4ID0gaTtcbiAgdmFyIGxlbmd0aCA9IGhlYXAubGVuZ3RoO1xuICB2YXIgaGFsZkxlbmd0aCA9IGxlbmd0aCA+Pj4gMTtcblxuICB3aGlsZSAoaW5kZXggPCBoYWxmTGVuZ3RoKSB7XG4gICAgdmFyIGxlZnRJbmRleCA9IChpbmRleCArIDEpICogMiAtIDE7XG4gICAgdmFyIGxlZnQgPSBoZWFwW2xlZnRJbmRleF07XG4gICAgdmFyIHJpZ2h0SW5kZXggPSBsZWZ0SW5kZXggKyAxO1xuICAgIHZhciByaWdodCA9IGhlYXBbcmlnaHRJbmRleF07IC8vIElmIHRoZSBsZWZ0IG9yIHJpZ2h0IG5vZGUgaXMgc21hbGxlciwgc3dhcCB3aXRoIHRoZSBzbWFsbGVyIG9mIHRob3NlLlxuXG4gICAgaWYgKGNvbXBhcmUobGVmdCwgbm9kZSkgPCAwKSB7XG4gICAgICBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBsZWZ0KSA8IDApIHtcbiAgICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gbGVmdDtcbiAgICAgICAgaGVhcFtsZWZ0SW5kZXhdID0gbm9kZTtcbiAgICAgICAgaW5kZXggPSBsZWZ0SW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyaWdodEluZGV4IDwgbGVuZ3RoICYmIGNvbXBhcmUocmlnaHQsIG5vZGUpIDwgMCkge1xuICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgaW5kZXggPSByaWdodEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGNoaWxkIGlzIHNtYWxsZXIuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAvLyBDb21wYXJlIHNvcnQgaW5kZXggZmlyc3QsIHRoZW4gdGFzayBpZC5cbiAgdmFyIGRpZmYgPSBhLnNvcnRJbmRleCAtIGIuc29ydEluZGV4O1xuICByZXR1cm4gZGlmZiAhPT0gMCA/IGRpZmYgOiBhLmlkIC0gYi5pZDtcbn1cblxuLy8gVE9ETzogVXNlIHN5bWJvbHM/XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSAxO1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gMjtcbnZhciBOb3JtYWxQcmlvcml0eSA9IDM7XG52YXIgTG93UHJpb3JpdHkgPSA0O1xudmFyIElkbGVQcmlvcml0eSA9IDU7XG5cbmZ1bmN0aW9uIG1hcmtUYXNrRXJyb3JlZCh0YXNrLCBtcykge1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cblxudmFyIGhhc1BlcmZvcm1hbmNlTm93ID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nO1xuXG5pZiAoaGFzUGVyZm9ybWFuY2VOb3cpIHtcbiAgdmFyIGxvY2FsUGVyZm9ybWFuY2UgPSBwZXJmb3JtYW5jZTtcblxuICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbG9jYWxQZXJmb3JtYW5jZS5ub3coKTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBsb2NhbERhdGUgPSBEYXRlO1xuICB2YXIgaW5pdGlhbFRpbWUgPSBsb2NhbERhdGUubm93KCk7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsRGF0ZS5ub3coKSAtIGluaXRpYWxUaW1lO1xuICB9O1xufSAvLyBNYXggMzEgYml0IGludGVnZXIuIFRoZSBtYXggaW50ZWdlciBzaXplIGluIFY4IGZvciAzMi1iaXQgc3lzdGVtcy5cbi8vIE1hdGgucG93KDIsIDMwKSAtIDFcbi8vIDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXG5cblxudmFyIG1heFNpZ25lZDMxQml0SW50ID0gMTA3Mzc0MTgyMzsgLy8gVGltZXMgb3V0IGltbWVkaWF0ZWx5XG5cbnZhciBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVCA9IC0xOyAvLyBFdmVudHVhbGx5IHRpbWVzIG91dFxuXG52YXIgVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUID0gMjUwO1xudmFyIE5PUk1BTF9QUklPUklUWV9USU1FT1VUID0gNTAwMDtcbnZhciBMT1dfUFJJT1JJVFlfVElNRU9VVCA9IDEwMDAwOyAvLyBOZXZlciB0aW1lcyBvdXRcblxudmFyIElETEVfUFJJT1JJVFlfVElNRU9VVCA9IG1heFNpZ25lZDMxQml0SW50OyAvLyBUYXNrcyBhcmUgc3RvcmVkIG9uIGEgbWluIGhlYXBcblxudmFyIHRhc2tRdWV1ZSA9IFtdO1xudmFyIHRpbWVyUXVldWUgPSBbXTsgLy8gSW5jcmVtZW50aW5nIGlkIGNvdW50ZXIuIFVzZWQgdG8gbWFpbnRhaW4gaW5zZXJ0aW9uIG9yZGVyLlxuXG52YXIgdGFza0lkQ291bnRlciA9IDE7IC8vIFBhdXNpbmcgdGhlIHNjaGVkdWxlciBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbnZhciBjdXJyZW50VGFzayA9IG51bGw7XG52YXIgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTsgLy8gVGhpcyBpcyBzZXQgd2hpbGUgcGVyZm9ybWluZyB3b3JrLCB0byBwcmV2ZW50IHJlLWVudHJhbmNlLlxuXG52YXIgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xudmFyIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG52YXIgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlOyAvLyBDYXB0dXJlIGxvY2FsIHJlZmVyZW5jZXMgdG8gbmF0aXZlIEFQSXMsIGluIGNhc2UgYSBwb2x5ZmlsbCBvdmVycmlkZXMgdGhlbS5cblxudmFyIGxvY2FsU2V0VGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IG51bGw7XG52YXIgbG9jYWxDbGVhclRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogbnVsbDtcbnZhciBsb2NhbFNldEltbWVkaWF0ZSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnID8gc2V0SW1tZWRpYXRlIDogbnVsbDsgLy8gSUUgYW5kIE5vZGUuanMgKyBqc2RvbVxuXG52YXIgaXNJbnB1dFBlbmRpbmcgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZyAhPT0gdW5kZWZpbmVkICYmIG5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nICE9PSB1bmRlZmluZWQgPyBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKSA6IG51bGw7XG5cbmZ1bmN0aW9uIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpIHtcbiAgLy8gQ2hlY2sgZm9yIHRhc2tzIHRoYXQgYXJlIG5vIGxvbmdlciBkZWxheWVkIGFuZCBhZGQgdGhlbSB0byB0aGUgcXVldWUuXG4gIHZhciB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgd2hpbGUgKHRpbWVyICE9PSBudWxsKSB7XG4gICAgaWYgKHRpbWVyLmNhbGxiYWNrID09PSBudWxsKSB7XG4gICAgICAvLyBUaW1lciB3YXMgY2FuY2VsbGVkLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgIH0gZWxzZSBpZiAodGltZXIuc3RhcnRUaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaW1lciBmaXJlZC4gVHJhbnNmZXIgdG8gdGhlIHRhc2sgcXVldWUuXG4gICAgICBwb3AodGltZXJRdWV1ZSk7XG4gICAgICB0aW1lci5zb3J0SW5kZXggPSB0aW1lci5leHBpcmF0aW9uVGltZTtcbiAgICAgIHB1c2godGFza1F1ZXVlLCB0aW1lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbWFpbmluZyB0aW1lcnMgYXJlIHBlbmRpbmcuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoY3VycmVudFRpbWUpIHtcbiAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcblxuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkKSB7XG4gICAgaWYgKHBlZWsodGFza1F1ZXVlKSAhPT0gbnVsbCkge1xuICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3RUaW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hXb3JrKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG5cblxuICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgLy8gV2Ugc2NoZWR1bGVkIGEgdGltZW91dCBidXQgaXQncyBubyBsb25nZXIgbmVlZGVkLiBDYW5jZWwgaXQuXG4gICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7XG4gIH1cblxuICBpc1BlcmZvcm1pbmdXb3JrID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgaWYgKGVuYWJsZVByb2ZpbGluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gICAgICAgICAgbWFya1Rhc2tFcnJvcmVkKGN1cnJlbnRUYXNrLCBjdXJyZW50VGltZSk7XG4gICAgICAgICAgY3VycmVudFRhc2suaXNRdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjYXRjaCBpbiBwcm9kIGNvZGUgcGF0aC5cbiAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRUYXNrID0gbnVsbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICBpc1BlcmZvcm1pbmdXb3JrID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gaW5pdGlhbFRpbWU7XG4gIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcblxuICB3aGlsZSAoY3VycmVudFRhc2sgIT09IG51bGwgJiYgIShlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgKSkge1xuICAgIGlmIChjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA+IGN1cnJlbnRUaW1lICYmICghaGFzVGltZVJlbWFpbmluZyB8fCBzaG91bGRZaWVsZFRvSG9zdCgpKSkge1xuICAgICAgLy8gVGhpcyBjdXJyZW50VGFzayBoYXNuJ3QgZXhwaXJlZCwgYW5kIHdlJ3ZlIHJlYWNoZWQgdGhlIGRlYWRsaW5lLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGNhbGxiYWNrID0gY3VycmVudFRhc2suY2FsbGJhY2s7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IG51bGw7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRUYXNrLnByaW9yaXR5TGV2ZWw7XG4gICAgICB2YXIgZGlkVXNlckNhbGxiYWNrVGltZW91dCA9IGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lO1xuXG4gICAgICB2YXIgY29udGludWF0aW9uQ2FsbGJhY2sgPSBjYWxsYmFjayhkaWRVc2VyQ2FsbGJhY2tUaW1lb3V0KTtcbiAgICAgIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcblxuICAgICAgaWYgKHR5cGVvZiBjb250aW51YXRpb25DYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IGNvbnRpbnVhdGlvbkNhbGxiYWNrO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpZiAoY3VycmVudFRhc2sgPT09IHBlZWsodGFza1F1ZXVlKSkge1xuICAgICAgICAgIHBvcCh0YXNrUXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICB9XG5cbiAgICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcbiAgfSAvLyBSZXR1cm4gd2hldGhlciB0aGVyZSdzIGFkZGl0aW9uYWwgd29ya1xuXG5cbiAgaWYgKGN1cnJlbnRUYXNrICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHtcbiAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5TGV2ZWwsIGV2ZW50SGFuZGxlcikge1xuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICB9XG5cbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZlbnRIYW5kbGVyKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfbmV4dChldmVudEhhbmRsZXIpIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWw7XG5cbiAgc3dpdGNoIChjdXJyZW50UHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgICAgLy8gU2hpZnQgZG93biB0byBub3JtYWwgcHJpb3JpdHlcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEFueXRoaW5nIGxvd2VyIHRoYW4gbm9ybWFsIHByaW9yaXR5IHNob3VsZCByZW1haW4gYXQgdGhlIGN1cnJlbnQgbGV2ZWwuXG4gICAgICBwcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3dyYXBDYWxsYmFjayhjYWxsYmFjaykge1xuICB2YXIgcGFyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoaXMgaXMgYSBmb3JrIG9mIHJ1bldpdGhQcmlvcml0eSwgaW5saW5lZCBmb3IgcGVyZm9ybWFuY2UuXG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcGFyZW50UHJpb3JpdHlMZXZlbDtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gIHZhciBzdGFydFRpbWU7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsKSB7XG4gICAgdmFyIGRlbGF5ID0gb3B0aW9ucy5kZWxheTtcblxuICAgIGlmICh0eXBlb2YgZGVsYXkgPT09ICdudW1iZXInICYmIGRlbGF5ID4gMCkge1xuICAgICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWUgKyBkZWxheTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICB9XG5cbiAgdmFyIHRpbWVvdXQ7XG5cbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IElETEVfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBMT1dfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBkZWZhdWx0OlxuICAgICAgdGltZW91dCA9IE5PUk1BTF9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyB0aW1lb3V0O1xuICB2YXIgbmV3VGFzayA9IHtcbiAgICBpZDogdGFza0lkQ291bnRlcisrLFxuICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICBwcmlvcml0eUxldmVsOiBwcmlvcml0eUxldmVsLFxuICAgIHN0YXJ0VGltZTogc3RhcnRUaW1lLFxuICAgIGV4cGlyYXRpb25UaW1lOiBleHBpcmF0aW9uVGltZSxcbiAgICBzb3J0SW5kZXg6IC0xXG4gIH07XG5cbiAgaWYgKHN0YXJ0VGltZSA+IGN1cnJlbnRUaW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGRlbGF5ZWQgdGFzay5cbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IHN0YXJ0VGltZTtcbiAgICBwdXNoKHRpbWVyUXVldWUsIG5ld1Rhc2spO1xuXG4gICAgaWYgKHBlZWsodGFza1F1ZXVlKSA9PT0gbnVsbCAmJiBuZXdUYXNrID09PSBwZWVrKHRpbWVyUXVldWUpKSB7XG4gICAgICAvLyBBbGwgdGFza3MgYXJlIGRlbGF5ZWQsIGFuZCB0aGlzIGlzIHRoZSB0YXNrIHdpdGggdGhlIGVhcmxpZXN0IGRlbGF5LlxuICAgICAgaWYgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGFuIGV4aXN0aW5nIHRpbWVvdXQuXG4gICAgICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIH0gLy8gU2NoZWR1bGUgYSB0aW1lb3V0LlxuXG5cbiAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBzdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5ld1Rhc2suc29ydEluZGV4ID0gZXhwaXJhdGlvblRpbWU7XG4gICAgcHVzaCh0YXNrUXVldWUsIG5ld1Rhc2spO1xuICAgIC8vIHdhaXQgdW50aWwgdGhlIG5leHQgdGltZSB3ZSB5aWVsZC5cblxuXG4gICAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykge1xuICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdUYXNrO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbigpIHtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY29udGludWVFeGVjdXRpb24oKSB7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykge1xuICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUoKSB7XG4gIHJldHVybiBwZWVrKHRhc2tRdWV1ZSk7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrKHRhc2spIHtcbiAgLy8gcmVtb3ZlIGZyb20gdGhlIHF1ZXVlIGJlY2F1c2UgeW91IGNhbid0IHJlbW92ZSBhcmJpdHJhcnkgbm9kZXMgZnJvbSBhblxuICAvLyBhcnJheSBiYXNlZCBoZWFwLCBvbmx5IHRoZSBmaXJzdCBvbmUuKVxuXG5cbiAgdGFzay5jYWxsYmFjayA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsKCkge1xuICByZXR1cm4gY3VycmVudFByaW9yaXR5TGV2ZWw7XG59XG5cbnZhciBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xudmFyIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG52YXIgdGFza1RpbWVvdXRJRCA9IC0xOyAvLyBTY2hlZHVsZXIgcGVyaW9kaWNhbGx5IHlpZWxkcyBpbiBjYXNlIHRoZXJlIGlzIG90aGVyIHdvcmsgb24gdGhlIG1haW5cbi8vIHRocmVhZCwgbGlrZSB1c2VyIGV2ZW50cy4gQnkgZGVmYXVsdCwgaXQgeWllbGRzIG11bHRpcGxlIHRpbWVzIHBlciBmcmFtZS5cbi8vIEl0IGRvZXMgbm90IGF0dGVtcHQgdG8gYWxpZ24gd2l0aCBmcmFtZSBib3VuZGFyaWVzLCBzaW5jZSBtb3N0IHRhc2tzIGRvbid0XG4vLyBuZWVkIHRvIGJlIGZyYW1lIGFsaWduZWQ7IGZvciB0aG9zZSB0aGF0IGRvLCB1c2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxuXG52YXIgZnJhbWVJbnRlcnZhbCA9IGZyYW1lWWllbGRNcztcbnZhciBzdGFydFRpbWUgPSAtMTtcblxuZnVuY3Rpb24gc2hvdWxkWWllbGRUb0hvc3QoKSB7XG4gIHZhciB0aW1lRWxhcHNlZCA9IGV4cG9ydHMudW5zdGFibGVfbm93KCkgLSBzdGFydFRpbWU7XG5cbiAgaWYgKHRpbWVFbGFwc2VkIDwgZnJhbWVJbnRlcnZhbCkge1xuICAgIC8vIFRoZSBtYWluIHRocmVhZCBoYXMgb25seSBiZWVuIGJsb2NrZWQgZm9yIGEgcmVhbGx5IHNob3J0IGFtb3VudCBvZiB0aW1lO1xuICAgIC8vIHNtYWxsZXIgdGhhbiBhIHNpbmdsZSBmcmFtZS4gRG9uJ3QgeWllbGQgeWV0LlxuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIGJlZW4gYmxvY2tlZCBmb3IgYSBub24tbmVnbGlnaWJsZSBhbW91bnQgb2YgdGltZS4gV2VcblxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UGFpbnQoKSB7XG5cbn1cblxuZnVuY3Rpb24gZm9yY2VGcmFtZVJhdGUoZnBzKSB7XG4gIGlmIChmcHMgPCAwIHx8IGZwcyA+IDEyNSkge1xuICAgIC8vIFVzaW5nIGNvbnNvbGVbJ2Vycm9yJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuICAgIGNvbnNvbGVbJ2Vycm9yJ10oJ2ZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCAnICsgJ2ZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZwcyA+IDApIHtcbiAgICBmcmFtZUludGVydmFsID0gTWF0aC5mbG9vcigxMDAwIC8gZnBzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXNldCB0aGUgZnJhbWVyYXRlXG4gICAgZnJhbWVJbnRlcnZhbCA9IGZyYW1lWWllbGRNcztcbiAgfVxufVxuXG52YXIgcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICBpZiAoc2NoZWR1bGVkSG9zdENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgc3RhcnQgdGltZSBzbyB3ZSBjYW4gbWVhc3VyZSBob3cgbG9uZyB0aGUgbWFpbiB0aHJlYWRcbiAgICAvLyBoYXMgYmVlbiBibG9ja2VkLlxuXG4gICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gICAgdmFyIGhhc1RpbWVSZW1haW5pbmcgPSB0cnVlOyAvLyBJZiBhIHNjaGVkdWxlciB0YXNrIHRocm93cywgZXhpdCB0aGUgY3VycmVudCBicm93c2VyIHRhc2sgc28gdGhlXG4gICAgLy8gZXJyb3IgY2FuIGJlIG9ic2VydmVkLlxuICAgIC8vXG4gICAgLy8gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgYSB0cnktY2F0Y2gsIHNpbmNlIHRoYXQgbWFrZXMgc29tZSBkZWJ1Z2dpbmdcbiAgICAvLyB0ZWNobmlxdWVzIGhhcmRlci4gSW5zdGVhZCwgaWYgYHNjaGVkdWxlZEhvc3RDYWxsYmFja2AgZXJyb3JzLCB0aGVuXG4gICAgLy8gYGhhc01vcmVXb3JrYCB3aWxsIHJlbWFpbiB0cnVlLCBhbmQgd2UnbGwgY29udGludWUgdGhlIHdvcmsgbG9vcC5cblxuICAgIHZhciBoYXNNb3JlV29yayA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgaGFzTW9yZVdvcmsgPSBzY2hlZHVsZWRIb3N0Q2FsbGJhY2soaGFzVGltZVJlbWFpbmluZywgY3VycmVudFRpbWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoaGFzTW9yZVdvcmspIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHdvcmssIHNjaGVkdWxlIHRoZSBuZXh0IG1lc3NhZ2UgZXZlbnQgYXQgdGhlIGVuZFxuICAgICAgICAvLyBvZiB0aGUgcHJlY2VkaW5nIG9uZS5cbiAgICAgICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG4gIH0gLy8gWWllbGRpbmcgdG8gdGhlIGJyb3dzZXIgd2lsbCBnaXZlIGl0IGEgY2hhbmNlIHRvIHBhaW50LCBzbyB3ZSBjYW5cbn07XG5cbnZhciBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZTtcblxuaWYgKHR5cGVvZiBsb2NhbFNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBOb2RlLmpzIGFuZCBvbGQgSUUuXG4gIC8vIFRoZXJlJ3MgYSBmZXcgcmVhc29ucyBmb3Igd2h5IHdlIHByZWZlciBzZXRJbW1lZGlhdGUuXG4gIC8vXG4gIC8vIFVubGlrZSBNZXNzYWdlQ2hhbm5lbCwgaXQgZG9lc24ndCBwcmV2ZW50IGEgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgLy8gKEV2ZW4gdGhvdWdoIHRoaXMgaXMgYSBET00gZm9yayBvZiB0aGUgU2NoZWR1bGVyLCB5b3UgY291bGQgZ2V0IGhlcmVcbiAgLy8gd2l0aCBhIG1peCBvZiBOb2RlLmpzIDE1Kywgd2hpY2ggaGFzIGEgTWVzc2FnZUNoYW5uZWwsIGFuZCBqc2RvbS4pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjA3NTZcbiAgLy9cbiAgLy8gQnV0IGFsc28sIGl0IHJ1bnMgZWFybGllciB3aGljaCBpcyB0aGUgc2VtYW50aWMgd2Ugd2FudC5cbiAgLy8gSWYgb3RoZXIgYnJvd3NlcnMgZXZlciBpbXBsZW1lbnQgaXQsIGl0J3MgYmV0dGVyIHRvIHVzZSBpdC5cbiAgLy8gQWx0aG91Z2ggYm90aCBvZiB0aGVzZSB3b3VsZCBiZSBpbmZlcmlvciB0byBuYXRpdmUgc2NoZWR1bGluZy5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbG9jYWxTZXRJbW1lZGlhdGUocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKTtcbiAgfTtcbn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBET00gYW5kIFdvcmtlciBlbnZpcm9ubWVudHMuXG4gIC8vIFdlIHByZWZlciBNZXNzYWdlQ2hhbm5lbCBiZWNhdXNlIG9mIHRoZSA0bXMgc2V0VGltZW91dCBjbGFtcGluZy5cbiAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgdmFyIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZTtcblxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBwb3J0LnBvc3RNZXNzYWdlKG51bGwpO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gV2Ugc2hvdWxkIG9ubHkgZmFsbGJhY2sgaGVyZSBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0VGltZW91dChwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUsIDApO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0SG9zdENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gIGlmICghaXNNZXNzYWdlTG9vcFJ1bm5pbmcpIHtcbiAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IHRydWU7XG4gICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXF1ZXN0SG9zdFRpbWVvdXQoY2FsbGJhY2ssIG1zKSB7XG4gIHRhc2tUaW1lb3V0SUQgPSBsb2NhbFNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKGV4cG9ydHMudW5zdGFibGVfbm93KCkpO1xuICB9LCBtcyk7XG59XG5cbmZ1bmN0aW9uIGNhbmNlbEhvc3RUaW1lb3V0KCkge1xuICBsb2NhbENsZWFyVGltZW91dCh0YXNrVGltZW91dElEKTtcbiAgdGFza1RpbWVvdXRJRCA9IC0xO1xufVxuXG52YXIgdW5zdGFibGVfcmVxdWVzdFBhaW50ID0gcmVxdWVzdFBhaW50O1xudmFyIHVuc3RhYmxlX1Byb2ZpbGluZyA9ICBudWxsO1xuXG5leHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHkgPSBMb3dQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfUHJvZmlsaW5nID0gdW5zdGFibGVfUHJvZmlsaW5nO1xuZXhwb3J0cy51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayA9IHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbiA9IHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZSA9IGZvcmNlRnJhbWVSYXRlO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCA9IHVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSA9IHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9uZXh0ID0gdW5zdGFibGVfbmV4dDtcbmV4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb24gPSB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50ID0gdW5zdGFibGVfcmVxdWVzdFBhaW50O1xuZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkgPSB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2sgPSB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZCA9IHNob3VsZFlpZWxkVG9Ib3N0O1xuZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2sgPSB1bnN0YWJsZV93cmFwQ2FsbGJhY2s7XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRyYWdnYWJsZUNvcmVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX0RyYWdnYWJsZUNvcmUuZGVmYXVsdDtcbiAgfVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9wcm9wVHlwZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcbnZhciBfcmVhY3REb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xudmFyIF9jbHN4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xzeFwiKSk7XG52YXIgX2RvbUZucyA9IHJlcXVpcmUoXCIuL3V0aWxzL2RvbUZuc1wiKTtcbnZhciBfcG9zaXRpb25GbnMgPSByZXF1aXJlKFwiLi91dGlscy9wb3NpdGlvbkZuc1wiKTtcbnZhciBfc2hpbXMgPSByZXF1aXJlKFwiLi91dGlscy9zaGltc1wiKTtcbnZhciBfRHJhZ2dhYmxlQ29yZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRHJhZ2dhYmxlQ29yZVwiKSk7XG52YXIgX2xvZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXRpbHMvbG9nXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChrZXkgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgeyBpZiAodHlwZW9mIGlucHV0ICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7IHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgeyB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTsgaWYgKHR5cGVvZiByZXMgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfSAvKjo6IGltcG9ydCB0eXBlIHtDb250cm9sUG9zaXRpb24sIFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uLCBEcmFnZ2FibGVDb3JlUHJvcHMsIERyYWdnYWJsZUNvcmVEZWZhdWx0UHJvcHN9IGZyb20gJy4vRHJhZ2dhYmxlQ29yZSc7Ki9cbi8qOjogaW1wb3J0IHR5cGUge0JvdW5kcywgRHJhZ2dhYmxlRXZlbnRIYW5kbGVyfSBmcm9tICcuL3V0aWxzL3R5cGVzJzsqL1xuLyo6OiBpbXBvcnQgdHlwZSB7RWxlbWVudCBhcyBSZWFjdEVsZW1lbnR9IGZyb20gJ3JlYWN0JzsqL1xuLyo6OiB0eXBlIERyYWdnYWJsZVN0YXRlID0ge1xuICBkcmFnZ2luZzogYm9vbGVhbixcbiAgZHJhZ2dlZDogYm9vbGVhbixcbiAgeDogbnVtYmVyLCB5OiBudW1iZXIsXG4gIHNsYWNrWDogbnVtYmVyLCBzbGFja1k6IG51bWJlcixcbiAgaXNFbGVtZW50U1ZHOiBib29sZWFuLFxuICBwcmV2UHJvcHNQb3NpdGlvbjogP0NvbnRyb2xQb3NpdGlvbixcbn07Ki9cbi8qOjogZXhwb3J0IHR5cGUgRHJhZ2dhYmxlRGVmYXVsdFByb3BzID0ge1xuICAuLi5EcmFnZ2FibGVDb3JlRGVmYXVsdFByb3BzLFxuICBheGlzOiAnYm90aCcgfCAneCcgfCAneScgfCAnbm9uZScsXG4gIGJvdW5kczogQm91bmRzIHwgc3RyaW5nIHwgZmFsc2UsXG4gIGRlZmF1bHRDbGFzc05hbWU6IHN0cmluZyxcbiAgZGVmYXVsdENsYXNzTmFtZURyYWdnaW5nOiBzdHJpbmcsXG4gIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2VkOiBzdHJpbmcsXG4gIGRlZmF1bHRQb3NpdGlvbjogQ29udHJvbFBvc2l0aW9uLFxuICBzY2FsZTogbnVtYmVyLFxufTsqL1xuLyo6OiBleHBvcnQgdHlwZSBEcmFnZ2FibGVQcm9wcyA9IHtcbiAgLi4uRHJhZ2dhYmxlQ29yZVByb3BzLFxuICAuLi5EcmFnZ2FibGVEZWZhdWx0UHJvcHMsXG4gIHBvc2l0aW9uT2Zmc2V0OiBQb3NpdGlvbk9mZnNldENvbnRyb2xQb3NpdGlvbixcbiAgcG9zaXRpb246IENvbnRyb2xQb3NpdGlvbixcbn07Ki9cbi8vXG4vLyBEZWZpbmUgPERyYWdnYWJsZT5cbi8vXG5jbGFzcyBEcmFnZ2FibGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgLyo6OiA8RHJhZ2dhYmxlUHJvcHMsIERyYWdnYWJsZVN0YXRlPiove1xuICAvLyBSZWFjdCAxNi4zK1xuICAvLyBBcml0eSAocHJvcHMsIHN0YXRlKVxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKF9yZWYgLyo6OiAqLywgX3JlZjIgLyo6OiAqLykgLyo6ID9QYXJ0aWFsPERyYWdnYWJsZVN0YXRlPiove1xuICAgIGxldCB7XG4gICAgICBwb3NpdGlvblxuICAgIH0gLyo6IERyYWdnYWJsZVByb3BzKi8gPSBfcmVmIC8qOiBEcmFnZ2FibGVQcm9wcyovO1xuICAgIGxldCB7XG4gICAgICBwcmV2UHJvcHNQb3NpdGlvblxuICAgIH0gLyo6IERyYWdnYWJsZVN0YXRlKi8gPSBfcmVmMiAvKjogRHJhZ2dhYmxlU3RhdGUqLztcbiAgICAvLyBTZXQgeC95IGlmIGEgbmV3IHBvc2l0aW9uIGlzIHByb3ZpZGVkIGluIHByb3BzIHRoYXQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHByZXZpb3VzLlxuICAgIGlmIChwb3NpdGlvbiAmJiAoIXByZXZQcm9wc1Bvc2l0aW9uIHx8IHBvc2l0aW9uLnggIT09IHByZXZQcm9wc1Bvc2l0aW9uLnggfHwgcG9zaXRpb24ueSAhPT0gcHJldlByb3BzUG9zaXRpb24ueSkpIHtcbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGU6IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAlaicsIHtcbiAgICAgICAgcG9zaXRpb24sXG4gICAgICAgIHByZXZQcm9wc1Bvc2l0aW9uXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHBvc2l0aW9uLngsXG4gICAgICAgIHk6IHBvc2l0aW9uLnksXG4gICAgICAgIHByZXZQcm9wc1Bvc2l0aW9uOiB7XG4gICAgICAgICAgLi4ucG9zaXRpb25cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3RydWN0b3IocHJvcHMgLyo6IERyYWdnYWJsZVByb3BzKi8pIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25EcmFnU3RhcnRcIiwgKGUsIGNvcmVEYXRhKSA9PiB7XG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlOiBvbkRyYWdTdGFydDogJWonLCBjb3JlRGF0YSk7XG5cbiAgICAgIC8vIFNob3J0LWNpcmN1aXQgaWYgdXNlcidzIGNhbGxiYWNrIGtpbGxlZCBpdC5cbiAgICAgIGNvbnN0IHNob3VsZFN0YXJ0ID0gdGhpcy5wcm9wcy5vblN0YXJ0KGUsICgwLCBfcG9zaXRpb25GbnMuY3JlYXRlRHJhZ2dhYmxlRGF0YSkodGhpcywgY29yZURhdGEpKTtcbiAgICAgIC8vIEtpbGxzIHN0YXJ0IGV2ZW50IG9uIGNvcmUgYXMgd2VsbCwgc28gbW92ZSBoYW5kbGVycyBhcmUgbmV2ZXIgYm91bmQuXG4gICAgICBpZiAoc2hvdWxkU3RhcnQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmc6IHRydWUsXG4gICAgICAgIGRyYWdnZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uRHJhZ1wiLCAoZSwgY29yZURhdGEpID0+IHtcbiAgICAgIGlmICghdGhpcy5zdGF0ZS5kcmFnZ2luZykgcmV0dXJuIGZhbHNlO1xuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZTogb25EcmFnOiAlaicsIGNvcmVEYXRhKTtcbiAgICAgIGNvbnN0IHVpRGF0YSA9ICgwLCBfcG9zaXRpb25GbnMuY3JlYXRlRHJhZ2dhYmxlRGF0YSkodGhpcywgY29yZURhdGEpO1xuICAgICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgIHg6IHVpRGF0YS54LFxuICAgICAgICB5OiB1aURhdGEueSxcbiAgICAgICAgc2xhY2tYOiAwLFxuICAgICAgICBzbGFja1k6IDBcbiAgICAgIH07XG5cbiAgICAgIC8vIEtlZXAgd2l0aGluIGJvdW5kcy5cbiAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcykge1xuICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHggYW5kIHkuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHlcbiAgICAgICAgfSA9IG5ld1N0YXRlO1xuXG4gICAgICAgIC8vIEFkZCBzbGFjayB0byB0aGUgdmFsdWVzIHVzZWQgdG8gY2FsY3VsYXRlIGJvdW5kIHBvc2l0aW9uLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgaWZcbiAgICAgICAgLy8gd2Ugc3RhcnQgcmVtb3Zpbmcgc2xhY2ssIHRoZSBlbGVtZW50IHdvbid0IHJlYWN0IHRvIGl0IHJpZ2h0IGF3YXkgdW50aWwgaXQncyBiZWVuXG4gICAgICAgIC8vIGNvbXBsZXRlbHkgcmVtb3ZlZC5cbiAgICAgICAgbmV3U3RhdGUueCArPSB0aGlzLnN0YXRlLnNsYWNrWDtcbiAgICAgICAgbmV3U3RhdGUueSArPSB0aGlzLnN0YXRlLnNsYWNrWTtcblxuICAgICAgICAvLyBHZXQgYm91bmQgcG9zaXRpb24uIFRoaXMgd2lsbCBjZWlsL2Zsb29yIHRoZSB4IGFuZCB5IHdpdGhpbiB0aGUgYm91bmRhcmllcy5cbiAgICAgICAgY29uc3QgW25ld1N0YXRlWCwgbmV3U3RhdGVZXSA9ICgwLCBfcG9zaXRpb25GbnMuZ2V0Qm91bmRQb3NpdGlvbikodGhpcywgbmV3U3RhdGUueCwgbmV3U3RhdGUueSk7XG4gICAgICAgIG5ld1N0YXRlLnggPSBuZXdTdGF0ZVg7XG4gICAgICAgIG5ld1N0YXRlLnkgPSBuZXdTdGF0ZVk7XG5cbiAgICAgICAgLy8gUmVjYWxjdWxhdGUgc2xhY2sgYnkgbm90aW5nIGhvdyBtdWNoIHdhcyBzaGF2ZWQgYnkgdGhlIGJvdW5kUG9zaXRpb24gaGFuZGxlci5cbiAgICAgICAgbmV3U3RhdGUuc2xhY2tYID0gdGhpcy5zdGF0ZS5zbGFja1ggKyAoeCAtIG5ld1N0YXRlLngpO1xuICAgICAgICBuZXdTdGF0ZS5zbGFja1kgPSB0aGlzLnN0YXRlLnNsYWNrWSArICh5IC0gbmV3U3RhdGUueSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBldmVudCB3ZSBmaXJlIHRvIHJlZmxlY3Qgd2hhdCByZWFsbHkgaGFwcGVuZWQgYWZ0ZXIgYm91bmRzIHRvb2sgZWZmZWN0LlxuICAgICAgICB1aURhdGEueCA9IG5ld1N0YXRlLng7XG4gICAgICAgIHVpRGF0YS55ID0gbmV3U3RhdGUueTtcbiAgICAgICAgdWlEYXRhLmRlbHRhWCA9IG5ld1N0YXRlLnggLSB0aGlzLnN0YXRlLng7XG4gICAgICAgIHVpRGF0YS5kZWx0YVkgPSBuZXdTdGF0ZS55IC0gdGhpcy5zdGF0ZS55O1xuICAgICAgfVxuXG4gICAgICAvLyBTaG9ydC1jaXJjdWl0IGlmIHVzZXIncyBjYWxsYmFjayBraWxsZWQgaXQuXG4gICAgICBjb25zdCBzaG91bGRVcGRhdGUgPSB0aGlzLnByb3BzLm9uRHJhZyhlLCB1aURhdGEpO1xuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uRHJhZ1N0b3BcIiwgKGUsIGNvcmVEYXRhKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc3RhdGUuZHJhZ2dpbmcpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gU2hvcnQtY2lyY3VpdCBpZiB1c2VyJ3MgY2FsbGJhY2sga2lsbGVkIGl0LlxuICAgICAgY29uc3Qgc2hvdWxkQ29udGludWUgPSB0aGlzLnByb3BzLm9uU3RvcChlLCAoMCwgX3Bvc2l0aW9uRm5zLmNyZWF0ZURyYWdnYWJsZURhdGEpKHRoaXMsIGNvcmVEYXRhKSk7XG4gICAgICBpZiAoc2hvdWxkQ29udGludWUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlOiBvbkRyYWdTdG9wOiAlaicsIGNvcmVEYXRhKTtcbiAgICAgIGNvbnN0IG5ld1N0YXRlIC8qOiBQYXJ0aWFsPERyYWdnYWJsZVN0YXRlPiovID0ge1xuICAgICAgICBkcmFnZ2luZzogZmFsc2UsXG4gICAgICAgIHNsYWNrWDogMCxcbiAgICAgICAgc2xhY2tZOiAwXG4gICAgICB9O1xuXG4gICAgICAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCBjb21wb25lbnQsIHRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24gd2lsbCBiZSB0b1xuICAgICAgLy8gcmV2ZXJ0IGJhY2sgdG8gdGhlIG9sZCBwb3NpdGlvbi4gV2UgZXhwZWN0IGEgaGFuZGxlciBvbiBgb25EcmFnU3RvcGAsIGF0IHRoZSBsZWFzdC5cbiAgICAgIGNvbnN0IGNvbnRyb2xsZWQgPSBCb29sZWFuKHRoaXMucHJvcHMucG9zaXRpb24pO1xuICAgICAgaWYgKGNvbnRyb2xsZWQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHgsXG4gICAgICAgICAgeVxuICAgICAgICB9ID0gdGhpcy5wcm9wcy5wb3NpdGlvbjtcbiAgICAgICAgbmV3U3RhdGUueCA9IHg7XG4gICAgICAgIG5ld1N0YXRlLnkgPSB5O1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBjdXJyZW50bHkgZHJhZ2dpbmcuXG4gICAgICBkcmFnZ2luZzogZmFsc2UsXG4gICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGJlZW4gZHJhZ2dlZCBiZWZvcmUuXG4gICAgICBkcmFnZ2VkOiBmYWxzZSxcbiAgICAgIC8vIEN1cnJlbnQgdHJhbnNmb3JtIHggYW5kIHkuXG4gICAgICB4OiBwcm9wcy5wb3NpdGlvbiA/IHByb3BzLnBvc2l0aW9uLnggOiBwcm9wcy5kZWZhdWx0UG9zaXRpb24ueCxcbiAgICAgIHk6IHByb3BzLnBvc2l0aW9uID8gcHJvcHMucG9zaXRpb24ueSA6IHByb3BzLmRlZmF1bHRQb3NpdGlvbi55LFxuICAgICAgcHJldlByb3BzUG9zaXRpb246IHtcbiAgICAgICAgLi4ucHJvcHMucG9zaXRpb25cbiAgICAgIH0sXG4gICAgICAvLyBVc2VkIGZvciBjb21wZW5zYXRpbmcgZm9yIG91dC1vZi1ib3VuZHMgZHJhZ3NcbiAgICAgIHNsYWNrWDogMCxcbiAgICAgIHNsYWNrWTogMCxcbiAgICAgIC8vIENhbiBvbmx5IGRldGVybWluZSBpZiBTVkcgYWZ0ZXIgbW91bnRpbmdcbiAgICAgIGlzRWxlbWVudFNWRzogZmFsc2VcbiAgICB9O1xuICAgIGlmIChwcm9wcy5wb3NpdGlvbiAmJiAhKHByb3BzLm9uRHJhZyB8fCBwcm9wcy5vblN0b3ApKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKCdBIGBwb3NpdGlvbmAgd2FzIGFwcGxpZWQgdG8gdGhpcyA8RHJhZ2dhYmxlPiwgd2l0aG91dCBkcmFnIGhhbmRsZXJzLiBUaGlzIHdpbGwgbWFrZSB0aGlzICcgKyAnY29tcG9uZW50IGVmZmVjdGl2ZWx5IHVuZHJhZ2dhYmxlLiBQbGVhc2UgYXR0YWNoIGBvbkRyYWdgIG9yIGBvblN0b3BgIGhhbmRsZXJzIHNvIHlvdSBjYW4gYWRqdXN0IHRoZSAnICsgJ2Bwb3NpdGlvbmAgb2YgdGhpcyBlbGVtZW50LicpO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGVsZW1lbnQgcGFzc2VkIGlzIGFuIGluc3RhbmNlb2YgU1ZHRWxlbWVudFxuICAgIGlmICh0eXBlb2Ygd2luZG93LlNWR0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZmluZERPTU5vZGUoKSBpbnN0YW5jZW9mIHdpbmRvdy5TVkdFbGVtZW50KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNFbGVtZW50U1ZHOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkcmFnZ2luZzogZmFsc2VcbiAgICB9KTsgLy8gcHJldmVudHMgaW52YXJpYW50IGlmIHVubW91bnRlZCB3aGlsZSBkcmFnZ2luZ1xuICB9XG5cbiAgLy8gUmVhY3QgU3RyaWN0IE1vZGUgY29tcGF0aWJpbGl0eTogaWYgYG5vZGVSZWZgIGlzIHBhc3NlZCwgd2Ugd2lsbCB1c2UgaXQgaW5zdGVhZCBvZiB0cnlpbmcgdG8gZmluZFxuICAvLyB0aGUgdW5kZXJseWluZyBET00gbm9kZSBvdXJzZWx2ZXMuIFNlZSB0aGUgUkVBRE1FIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICBmaW5kRE9NTm9kZSgpIC8qOiA/SFRNTEVsZW1lbnQqL3tcbiAgICB2YXIgX3RoaXMkcHJvcHMkbm9kZVJlZiRjLCBfdGhpcyRwcm9wcztcbiAgICByZXR1cm4gKF90aGlzJHByb3BzJG5vZGVSZWYkYyA9IChfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMpID09PSBudWxsIHx8IF90aGlzJHByb3BzID09PSB2b2lkIDAgfHwgKF90aGlzJHByb3BzID0gX3RoaXMkcHJvcHMubm9kZVJlZikgPT09IG51bGwgfHwgX3RoaXMkcHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHByb3BzLmN1cnJlbnQpICE9PSBudWxsICYmIF90aGlzJHByb3BzJG5vZGVSZWYkYyAhPT0gdm9pZCAwID8gX3RoaXMkcHJvcHMkbm9kZVJlZiRjIDogX3JlYWN0RG9tLmRlZmF1bHQuZmluZERPTU5vZGUodGhpcyk7XG4gIH1cbiAgcmVuZGVyKCkgLyo6IFJlYWN0RWxlbWVudDxhbnk+Ki97XG4gICAgY29uc3Qge1xuICAgICAgYXhpcyxcbiAgICAgIGJvdW5kcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgZGVmYXVsdFBvc2l0aW9uLFxuICAgICAgZGVmYXVsdENsYXNzTmFtZSxcbiAgICAgIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2luZyxcbiAgICAgIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2VkLFxuICAgICAgcG9zaXRpb24sXG4gICAgICBwb3NpdGlvbk9mZnNldCxcbiAgICAgIHNjYWxlLFxuICAgICAgLi4uZHJhZ2dhYmxlQ29yZVByb3BzXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHN0eWxlID0ge307XG4gICAgbGV0IHN2Z1RyYW5zZm9ybSA9IG51bGw7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGNvbnRyb2xsZWQsIHdlIGRvbid0IHdhbnQgdG8gbW92ZSBpdCAtIHVubGVzcyBpdCdzIGRyYWdnaW5nLlxuICAgIGNvbnN0IGNvbnRyb2xsZWQgPSBCb29sZWFuKHBvc2l0aW9uKTtcbiAgICBjb25zdCBkcmFnZ2FibGUgPSAhY29udHJvbGxlZCB8fCB0aGlzLnN0YXRlLmRyYWdnaW5nO1xuICAgIGNvbnN0IHZhbGlkUG9zaXRpb24gPSBwb3NpdGlvbiB8fCBkZWZhdWx0UG9zaXRpb247XG4gICAgY29uc3QgdHJhbnNmb3JtT3B0cyA9IHtcbiAgICAgIC8vIFNldCBsZWZ0IGlmIGhvcml6b250YWwgZHJhZyBpcyBlbmFibGVkXG4gICAgICB4OiAoMCwgX3Bvc2l0aW9uRm5zLmNhbkRyYWdYKSh0aGlzKSAmJiBkcmFnZ2FibGUgPyB0aGlzLnN0YXRlLnggOiB2YWxpZFBvc2l0aW9uLngsXG4gICAgICAvLyBTZXQgdG9wIGlmIHZlcnRpY2FsIGRyYWcgaXMgZW5hYmxlZFxuICAgICAgeTogKDAsIF9wb3NpdGlvbkZucy5jYW5EcmFnWSkodGhpcykgJiYgZHJhZ2dhYmxlID8gdGhpcy5zdGF0ZS55IDogdmFsaWRQb3NpdGlvbi55XG4gICAgfTtcblxuICAgIC8vIElmIHRoaXMgZWxlbWVudCB3YXMgU1ZHLCB3ZSB1c2UgdGhlIGB0cmFuc2Zvcm1gIGF0dHJpYnV0ZS5cbiAgICBpZiAodGhpcy5zdGF0ZS5pc0VsZW1lbnRTVkcpIHtcbiAgICAgIHN2Z1RyYW5zZm9ybSA9ICgwLCBfZG9tRm5zLmNyZWF0ZVNWR1RyYW5zZm9ybSkodHJhbnNmb3JtT3B0cywgcG9zaXRpb25PZmZzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgYSBDU1MgdHJhbnNmb3JtIHRvIG1vdmUgdGhlIGVsZW1lbnQgYXJvdW5kLiBUaGlzIGFsbG93cyB1cyB0byBtb3ZlIHRoZSBlbGVtZW50IGFyb3VuZFxuICAgICAgLy8gd2l0aG91dCB3b3JyeWluZyBhYm91dCB3aGV0aGVyIG9yIG5vdCBpdCBpcyByZWxhdGl2ZWx5IG9yIGFic29sdXRlbHkgcG9zaXRpb25lZC5cbiAgICAgIC8vIElmIHRoZSBpdGVtIHlvdSBhcmUgZHJhZ2dpbmcgYWxyZWFkeSBoYXMgYSB0cmFuc2Zvcm0gc2V0LCB3cmFwIGl0IGluIGEgPHNwYW4+IHNvIDxEcmFnZ2FibGU+XG4gICAgICAvLyBoYXMgYSBjbGVhbiBzbGF0ZS5cbiAgICAgIHN0eWxlID0gKDAsIF9kb21GbnMuY3JlYXRlQ1NTVHJhbnNmb3JtKSh0cmFuc2Zvcm1PcHRzLCBwb3NpdGlvbk9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gTWFyayB3aXRoIGNsYXNzIHdoaWxlIGRyYWdnaW5nXG4gICAgY29uc3QgY2xhc3NOYW1lID0gKDAsIF9jbHN4LmRlZmF1bHQpKGNoaWxkcmVuLnByb3BzLmNsYXNzTmFtZSB8fCAnJywgZGVmYXVsdENsYXNzTmFtZSwge1xuICAgICAgW2RlZmF1bHRDbGFzc05hbWVEcmFnZ2luZ106IHRoaXMuc3RhdGUuZHJhZ2dpbmcsXG4gICAgICBbZGVmYXVsdENsYXNzTmFtZURyYWdnZWRdOiB0aGlzLnN0YXRlLmRyYWdnZWRcbiAgICB9KTtcblxuICAgIC8vIFJldXNlIHRoZSBjaGlsZCBwcm92aWRlZFxuICAgIC8vIFRoaXMgbWFrZXMgaXQgZmxleGlibGUgdG8gdXNlIHdoYXRldmVyIGVsZW1lbnQgaXMgd2FudGVkIChkaXYsIHVsLCBldGMpXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9EcmFnZ2FibGVDb3JlLmRlZmF1bHQsIF9leHRlbmRzKHt9LCBkcmFnZ2FibGVDb3JlUHJvcHMsIHtcbiAgICAgIG9uU3RhcnQ6IHRoaXMub25EcmFnU3RhcnQsXG4gICAgICBvbkRyYWc6IHRoaXMub25EcmFnLFxuICAgICAgb25TdG9wOiB0aGlzLm9uRHJhZ1N0b3BcbiAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKSwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBzdHlsZToge1xuICAgICAgICAuLi5jaGlsZHJlbi5wcm9wcy5zdHlsZSxcbiAgICAgICAgLi4uc3R5bGVcbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm06IHN2Z1RyYW5zZm9ybVxuICAgIH0pKTtcbiAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRHJhZ2dhYmxlO1xuX2RlZmluZVByb3BlcnR5KERyYWdnYWJsZSwgXCJkaXNwbGF5TmFtZVwiLCAnRHJhZ2dhYmxlJyk7XG5fZGVmaW5lUHJvcGVydHkoRHJhZ2dhYmxlLCBcInByb3BUeXBlc1wiLCB7XG4gIC8vIEFjY2VwdHMgYWxsIHByb3BzIDxEcmFnZ2FibGVDb3JlPiBhY2NlcHRzLlxuICAuLi5fRHJhZ2dhYmxlQ29yZS5kZWZhdWx0LnByb3BUeXBlcyxcbiAgLyoqXG4gICAqIGBheGlzYCBkZXRlcm1pbmVzIHdoaWNoIGF4aXMgdGhlIGRyYWdnYWJsZSBjYW4gbW92ZS5cbiAgICpcbiAgICogIE5vdGUgdGhhdCBhbGwgY2FsbGJhY2tzIHdpbGwgc3RpbGwgcmV0dXJuIGRhdGEgYXMgbm9ybWFsLiBUaGlzIG9ubHlcbiAgICogIGNvbnRyb2xzIGZsdXNoaW5nIHRvIHRoZSBET00uXG4gICAqXG4gICAqICdib3RoJyBhbGxvd3MgbW92ZW1lbnQgaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5LlxuICAgKiAneCcgbGltaXRzIG1vdmVtZW50IHRvIGhvcml6b250YWwgYXhpcy5cbiAgICogJ3knIGxpbWl0cyBtb3ZlbWVudCB0byB2ZXJ0aWNhbCBheGlzLlxuICAgKiAnbm9uZScgbGltaXRzIGFsbCBtb3ZlbWVudC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gJ2JvdGgnLlxuICAgKi9cbiAgYXhpczogX3Byb3BUeXBlcy5kZWZhdWx0Lm9uZU9mKFsnYm90aCcsICd4JywgJ3knLCAnbm9uZSddKSxcbiAgLyoqXG4gICAqIGBib3VuZHNgIGRldGVybWluZXMgdGhlIHJhbmdlIG9mIG1vdmVtZW50IGF2YWlsYWJsZSB0byB0aGUgZWxlbWVudC5cbiAgICogQXZhaWxhYmxlIHZhbHVlcyBhcmU6XG4gICAqXG4gICAqICdwYXJlbnQnIHJlc3RyaWN0cyBtb3ZlbWVudCB3aXRoaW4gdGhlIERyYWdnYWJsZSdzIHBhcmVudCBub2RlLlxuICAgKlxuICAgKiBBbHRlcm5hdGl2ZWx5LCBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcywgYWxsIG9mIHdoaWNoIGFyZSBvcHRpb25hbDpcbiAgICpcbiAgICoge2xlZnQ6IExFRlRfQk9VTkQsIHJpZ2h0OiBSSUdIVF9CT1VORCwgYm90dG9tOiBCT1RUT01fQk9VTkQsIHRvcDogVE9QX0JPVU5EfVxuICAgKlxuICAgKiBBbGwgdmFsdWVzIGFyZSBpbiBweC5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganN4XG4gICAqICAgbGV0IEFwcCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAqICAgICAgICAgcmV0dXJuIChcbiAgICogICAgICAgICAgICA8RHJhZ2dhYmxlIGJvdW5kcz17e3JpZ2h0OiAzMDAsIGJvdHRvbTogMzAwfX0+XG4gICAqICAgICAgICAgICAgICA8ZGl2PkNvbnRlbnQ8L2Rpdj5cbiAgICogICAgICAgICAgIDwvRHJhZ2dhYmxlPlxuICAgKiAgICAgICAgICk7XG4gICAqICAgICAgIH1cbiAgICogICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBib3VuZHM6IF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZlR5cGUoW19wcm9wVHlwZXMuZGVmYXVsdC5zaGFwZSh7XG4gICAgbGVmdDogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlcixcbiAgICByaWdodDogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlcixcbiAgICB0b3A6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsXG4gICAgYm90dG9tOiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyXG4gIH0pLCBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLCBfcHJvcFR5cGVzLmRlZmF1bHQub25lT2YoW2ZhbHNlXSldKSxcbiAgZGVmYXVsdENsYXNzTmFtZTogX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZyxcbiAgZGVmYXVsdENsYXNzTmFtZURyYWdnaW5nOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICBkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dlZDogX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZyxcbiAgLyoqXG4gICAqIGBkZWZhdWx0UG9zaXRpb25gIHNwZWNpZmllcyB0aGUgeCBhbmQgeSB0aGF0IHRoZSBkcmFnZ2VkIGl0ZW0gc2hvdWxkIHN0YXJ0IGF0XG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiAgICAgIGxldCBBcHAgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgKiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICogICAgICAgICAgICAgICAgICA8RHJhZ2dhYmxlIGRlZmF1bHRQb3NpdGlvbj17e3g6IDI1LCB5OiAyNX19PlxuICAgKiAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pkkgc3RhcnQgd2l0aCB0cmFuc2Zvcm1YOiAyNXB4IGFuZCB0cmFuc2Zvcm1ZOiAyNXB4OzwvZGl2PlxuICAgKiAgICAgICAgICAgICAgICAgIDwvRHJhZ2dhYmxlPlxuICAgKiAgICAgICAgICAgICAgKTtcbiAgICogICAgICAgICAgfVxuICAgKiAgICAgIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGRlZmF1bHRQb3NpdGlvbjogX3Byb3BUeXBlcy5kZWZhdWx0LnNoYXBlKHtcbiAgICB4OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLFxuICAgIHk6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXJcbiAgfSksXG4gIHBvc2l0aW9uT2Zmc2V0OiBfcHJvcFR5cGVzLmRlZmF1bHQuc2hhcGUoe1xuICAgIHg6IF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZlR5cGUoW19wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsIF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmddKSxcbiAgICB5OiBfcHJvcFR5cGVzLmRlZmF1bHQub25lT2ZUeXBlKFtfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLCBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nXSlcbiAgfSksXG4gIC8qKlxuICAgKiBgcG9zaXRpb25gLCBpZiBwcmVzZW50LCBkZWZpbmVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiAgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBmb3JtIGVsZW1lbnRzIGluIFJlYWN0IHdvcmsgLSBpZiBubyBgcG9zaXRpb25gIGlzIHN1cHBsaWVkLCB0aGUgY29tcG9uZW50XG4gICAqICBpcyB1bmNvbnRyb2xsZWQuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiAgICAgIGxldCBBcHAgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgKiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICogICAgICAgICAgICAgICAgICA8RHJhZ2dhYmxlIHBvc2l0aW9uPXt7eDogMjUsIHk6IDI1fX0+XG4gICAqICAgICAgICAgICAgICAgICAgICAgIDxkaXY+SSBzdGFydCB3aXRoIHRyYW5zZm9ybVg6IDI1cHggYW5kIHRyYW5zZm9ybVk6IDI1cHg7PC9kaXY+XG4gICAqICAgICAgICAgICAgICAgICAgPC9EcmFnZ2FibGU+XG4gICAqICAgICAgICAgICAgICApO1xuICAgKiAgICAgICAgICB9XG4gICAqICAgICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcG9zaXRpb246IF9wcm9wVHlwZXMuZGVmYXVsdC5zaGFwZSh7XG4gICAgeDogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlcixcbiAgICB5OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyXG4gIH0pLFxuICAvKipcbiAgICogVGhlc2UgcHJvcGVydGllcyBzaG91bGQgYmUgZGVmaW5lZCBvbiB0aGUgY2hpbGQsIG5vdCBoZXJlLlxuICAgKi9cbiAgY2xhc3NOYW1lOiBfc2hpbXMuZG9udFNldE1lLFxuICBzdHlsZTogX3NoaW1zLmRvbnRTZXRNZSxcbiAgdHJhbnNmb3JtOiBfc2hpbXMuZG9udFNldE1lXG59KTtcbl9kZWZpbmVQcm9wZXJ0eShEcmFnZ2FibGUsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgLi4uX0RyYWdnYWJsZUNvcmUuZGVmYXVsdC5kZWZhdWx0UHJvcHMsXG4gIGF4aXM6ICdib3RoJyxcbiAgYm91bmRzOiBmYWxzZSxcbiAgZGVmYXVsdENsYXNzTmFtZTogJ3JlYWN0LWRyYWdnYWJsZScsXG4gIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2luZzogJ3JlYWN0LWRyYWdnYWJsZS1kcmFnZ2luZycsXG4gIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2VkOiAncmVhY3QtZHJhZ2dhYmxlLWRyYWdnZWQnLFxuICBkZWZhdWx0UG9zaXRpb246IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfSxcbiAgc2NhbGU6IDFcbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfcHJvcFR5cGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSk7XG52YXIgX3JlYWN0RG9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3QtZG9tXCIpKTtcbnZhciBfZG9tRm5zID0gcmVxdWlyZShcIi4vdXRpbHMvZG9tRm5zXCIpO1xudmFyIF9wb3NpdGlvbkZucyA9IHJlcXVpcmUoXCIuL3V0aWxzL3Bvc2l0aW9uRm5zXCIpO1xudmFyIF9zaGltcyA9IHJlcXVpcmUoXCIuL3V0aWxzL3NoaW1zXCIpO1xudmFyIF9sb2cgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V0aWxzL2xvZ1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgdmFyIGNhY2hlTm9kZUludGVyb3AgPSBuZXcgV2Vha01hcCgpOyByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChub2RlSW50ZXJvcCkgeyByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7IH0pKG5vZGVJbnRlcm9wKTsgfVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkgeyBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG4vKjo6IGltcG9ydCB0eXBlIHtFdmVudEhhbmRsZXIsIE1vdXNlVG91Y2hFdmVudH0gZnJvbSAnLi91dGlscy90eXBlcyc7Ki9cbi8qOjogaW1wb3J0IHR5cGUge0VsZW1lbnQgYXMgUmVhY3RFbGVtZW50fSBmcm9tICdyZWFjdCc7Ki9cbi8vIFNpbXBsZSBhYnN0cmFjdGlvbiBmb3IgZHJhZ2dpbmcgZXZlbnRzIG5hbWVzLlxuY29uc3QgZXZlbnRzRm9yID0ge1xuICB0b3VjaDoge1xuICAgIHN0YXJ0OiAndG91Y2hzdGFydCcsXG4gICAgbW92ZTogJ3RvdWNobW92ZScsXG4gICAgc3RvcDogJ3RvdWNoZW5kJ1xuICB9LFxuICBtb3VzZToge1xuICAgIHN0YXJ0OiAnbW91c2Vkb3duJyxcbiAgICBtb3ZlOiAnbW91c2Vtb3ZlJyxcbiAgICBzdG9wOiAnbW91c2V1cCdcbiAgfVxufTtcblxuLy8gRGVmYXVsdCB0byBtb3VzZSBldmVudHMuXG5sZXQgZHJhZ0V2ZW50Rm9yID0gZXZlbnRzRm9yLm1vdXNlO1xuLyo6OiBleHBvcnQgdHlwZSBEcmFnZ2FibGVEYXRhID0ge1xuICBub2RlOiBIVE1MRWxlbWVudCxcbiAgeDogbnVtYmVyLCB5OiBudW1iZXIsXG4gIGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcixcbiAgbGFzdFg6IG51bWJlciwgbGFzdFk6IG51bWJlcixcbn07Ki9cbi8qOjogZXhwb3J0IHR5cGUgRHJhZ2dhYmxlRXZlbnRIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQsIGRhdGE6IERyYWdnYWJsZURhdGEpID0+IHZvaWQgfCBmYWxzZTsqL1xuLyo6OiBleHBvcnQgdHlwZSBDb250cm9sUG9zaXRpb24gPSB7eDogbnVtYmVyLCB5OiBudW1iZXJ9OyovXG4vKjo6IGV4cG9ydCB0eXBlIFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uID0ge3g6IG51bWJlcnxzdHJpbmcsIHk6IG51bWJlcnxzdHJpbmd9OyovXG4vKjo6IGV4cG9ydCB0eXBlIERyYWdnYWJsZUNvcmVEZWZhdWx0UHJvcHMgPSB7XG4gIGFsbG93QW55Q2xpY2s6IGJvb2xlYW4sXG4gIGRpc2FibGVkOiBib29sZWFuLFxuICBlbmFibGVVc2VyU2VsZWN0SGFjazogYm9vbGVhbixcbiAgb25TdGFydDogRHJhZ2dhYmxlRXZlbnRIYW5kbGVyLFxuICBvbkRyYWc6IERyYWdnYWJsZUV2ZW50SGFuZGxlcixcbiAgb25TdG9wOiBEcmFnZ2FibGVFdmVudEhhbmRsZXIsXG4gIG9uTW91c2VEb3duOiAoZTogTW91c2VFdmVudCkgPT4gdm9pZCxcbiAgc2NhbGU6IG51bWJlcixcbn07Ki9cbi8qOjogZXhwb3J0IHR5cGUgRHJhZ2dhYmxlQ29yZVByb3BzID0ge1xuICAuLi5EcmFnZ2FibGVDb3JlRGVmYXVsdFByb3BzLFxuICBjYW5jZWw6IHN0cmluZyxcbiAgY2hpbGRyZW46IFJlYWN0RWxlbWVudDxhbnk+LFxuICBvZmZzZXRQYXJlbnQ6IEhUTUxFbGVtZW50LFxuICBncmlkOiBbbnVtYmVyLCBudW1iZXJdLFxuICBoYW5kbGU6IHN0cmluZyxcbiAgbm9kZVJlZj86ID9SZWFjdC5FbGVtZW50UmVmPGFueT4sXG59OyovXG4vL1xuLy8gRGVmaW5lIDxEcmFnZ2FibGVDb3JlPi5cbi8vXG4vLyA8RHJhZ2dhYmxlQ29yZT4gaXMgZm9yIGFkdmFuY2VkIHVzYWdlIG9mIDxEcmFnZ2FibGU+LiBJdCBtYWludGFpbnMgbWluaW1hbCBpbnRlcm5hbCBzdGF0ZSBzbyBpdCBjYW5cbi8vIHdvcmsgd2VsbCB3aXRoIGxpYnJhcmllcyB0aGF0IHJlcXVpcmUgbW9yZSBjb250cm9sIG92ZXIgdGhlIGVsZW1lbnQuXG4vL1xuXG5jbGFzcyBEcmFnZ2FibGVDb3JlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IC8qOjogPERyYWdnYWJsZUNvcmVQcm9wcz4qL3tcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJkcmFnZ2luZ1wiLCBmYWxzZSk7XG4gICAgLy8gVXNlZCB3aGlsZSBkcmFnZ2luZyB0byBkZXRlcm1pbmUgZGVsdGFzLlxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImxhc3RYXCIsIE5hTik7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibGFzdFlcIiwgTmFOKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0b3VjaElkZW50aWZpZXJcIiwgbnVsbCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibW91bnRlZFwiLCBmYWxzZSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaGFuZGxlRHJhZ1N0YXJ0XCIsIGUgPT4ge1xuICAgICAgLy8gTWFrZSBpdCBwb3NzaWJsZSB0byBhdHRhY2ggZXZlbnQgaGFuZGxlcnMgb24gdG9wIG9mIHRoaXMgb25lLlxuICAgICAgdGhpcy5wcm9wcy5vbk1vdXNlRG93bihlKTtcblxuICAgICAgLy8gT25seSBhY2NlcHQgbGVmdC1jbGlja3MuXG4gICAgICBpZiAoIXRoaXMucHJvcHMuYWxsb3dBbnlDbGljayAmJiB0eXBlb2YgZS5idXR0b24gPT09ICdudW1iZXInICYmIGUuYnV0dG9uICE9PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEdldCBub2Rlcy4gQmUgc3VyZSB0byBncmFiIHJlbGF0aXZlIGRvY3VtZW50IChjb3VsZCBiZSBpZnJhbWVkKVxuICAgICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLmZpbmRET01Ob2RlKCk7XG4gICAgICBpZiAoIXRoaXNOb2RlIHx8ICF0aGlzTm9kZS5vd25lckRvY3VtZW50IHx8ICF0aGlzTm9kZS5vd25lckRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCc8RHJhZ2dhYmxlQ29yZT4gbm90IG1vdW50ZWQgb24gRHJhZ1N0YXJ0IScpO1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBvd25lckRvY3VtZW50XG4gICAgICB9ID0gdGhpc05vZGU7XG5cbiAgICAgIC8vIFNob3J0IGNpcmN1aXQgaWYgaGFuZGxlIG9yIGNhbmNlbCBwcm9wIHdhcyBwcm92aWRlZCBhbmQgc2VsZWN0b3IgZG9lc24ndCBtYXRjaC5cbiAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkIHx8ICEoZS50YXJnZXQgaW5zdGFuY2VvZiBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lk5vZGUpIHx8IHRoaXMucHJvcHMuaGFuZGxlICYmICEoMCwgX2RvbUZucy5tYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG8pKGUudGFyZ2V0LCB0aGlzLnByb3BzLmhhbmRsZSwgdGhpc05vZGUpIHx8IHRoaXMucHJvcHMuY2FuY2VsICYmICgwLCBfZG9tRm5zLm1hdGNoZXNTZWxlY3RvckFuZFBhcmVudHNUbykoZS50YXJnZXQsIHRoaXMucHJvcHMuY2FuY2VsLCB0aGlzTm9kZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmV2ZW50IHNjcm9sbGluZyBvbiBtb2JpbGUgZGV2aWNlcywgbGlrZSBpcGFkL2lwaG9uZS5cbiAgICAgIC8vIEltcG9ydGFudCB0aGF0IHRoaXMgaXMgYWZ0ZXIgaGFuZGxlL2NhbmNlbC5cbiAgICAgIGlmIChlLnR5cGUgPT09ICd0b3VjaHN0YXJ0JykgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAvLyBTZXQgdG91Y2ggaWRlbnRpZmllciBpbiBjb21wb25lbnQgc3RhdGUgaWYgdGhpcyBpcyBhIHRvdWNoIGV2ZW50LiBUaGlzIGFsbG93cyB1cyB0b1xuICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBpbmRpdmlkdWFsIHRvdWNoZXMgb24gbXVsdGl0b3VjaCBzY3JlZW5zIGJ5IGlkZW50aWZ5aW5nIHdoaWNoXG4gICAgICAvLyB0b3VjaHBvaW50IHdhcyBzZXQgdG8gdGhpcyBlbGVtZW50LlxuICAgICAgY29uc3QgdG91Y2hJZGVudGlmaWVyID0gKDAsIF9kb21GbnMuZ2V0VG91Y2hJZGVudGlmaWVyKShlKTtcbiAgICAgIHRoaXMudG91Y2hJZGVudGlmaWVyID0gdG91Y2hJZGVudGlmaWVyO1xuXG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgZHJhZyBwb2ludCBmcm9tIHRoZSBldmVudC4gVGhpcyBpcyB1c2VkIGFzIHRoZSBvZmZzZXQuXG4gICAgICBjb25zdCBwb3NpdGlvbiA9ICgwLCBfcG9zaXRpb25GbnMuZ2V0Q29udHJvbFBvc2l0aW9uKShlLCB0b3VjaElkZW50aWZpZXIsIHRoaXMpO1xuICAgICAgaWYgKHBvc2l0aW9uID09IG51bGwpIHJldHVybjsgLy8gbm90IHBvc3NpYmxlIGJ1dCBzYXRpc2ZpZXMgZmxvd1xuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gcG9zaXRpb247XG5cbiAgICAgIC8vIENyZWF0ZSBhbiBldmVudCBvYmplY3Qgd2l0aCBhbGwgdGhlIGRhdGEgcGFyZW50cyBuZWVkIHRvIG1ha2UgYSBkZWNpc2lvbiBoZXJlLlxuICAgICAgY29uc3QgY29yZUV2ZW50ID0gKDAsIF9wb3NpdGlvbkZucy5jcmVhdGVDb3JlRGF0YSkodGhpcywgeCwgeSk7XG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlQ29yZTogaGFuZGxlRHJhZ1N0YXJ0OiAlaicsIGNvcmVFdmVudCk7XG5cbiAgICAgIC8vIENhbGwgZXZlbnQgaGFuZGxlci4gSWYgaXQgcmV0dXJucyBleHBsaWNpdCBmYWxzZSwgY2FuY2VsLlxuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ2NhbGxpbmcnLCB0aGlzLnByb3BzLm9uU3RhcnQpO1xuICAgICAgY29uc3Qgc2hvdWxkVXBkYXRlID0gdGhpcy5wcm9wcy5vblN0YXJ0KGUsIGNvcmVFdmVudCk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSBmYWxzZSB8fCB0aGlzLm1vdW50ZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIC8vIEFkZCBhIHN0eWxlIHRvIHRoZSBib2R5IHRvIGRpc2FibGUgdXNlci1zZWxlY3QuIFRoaXMgcHJldmVudHMgdGV4dCBmcm9tXG4gICAgICAvLyBiZWluZyBzZWxlY3RlZCBhbGwgb3ZlciB0aGUgcGFnZS5cbiAgICAgIGlmICh0aGlzLnByb3BzLmVuYWJsZVVzZXJTZWxlY3RIYWNrKSAoMCwgX2RvbUZucy5hZGRVc2VyU2VsZWN0U3R5bGVzKShvd25lckRvY3VtZW50KTtcblxuICAgICAgLy8gSW5pdGlhdGUgZHJhZ2dpbmcuIFNldCB0aGUgY3VycmVudCB4IGFuZCB5IGFzIG9mZnNldHNcbiAgICAgIC8vIHNvIHdlIGtub3cgaG93IG11Y2ggd2UndmUgbW92ZWQgZHVyaW5nIHRoZSBkcmFnLiBUaGlzIGFsbG93cyB1c1xuICAgICAgLy8gdG8gZHJhZyBlbGVtZW50cyBhcm91bmQgZXZlbiBpZiB0aGV5IGhhdmUgYmVlbiBtb3ZlZCwgd2l0aG91dCBpc3N1ZS5cbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5sYXN0WCA9IHg7XG4gICAgICB0aGlzLmxhc3RZID0geTtcblxuICAgICAgLy8gQWRkIGV2ZW50cyB0byB0aGUgZG9jdW1lbnQgZGlyZWN0bHkgc28gd2UgY2F0Y2ggd2hlbiB0aGUgdXNlcidzIG1vdXNlL3RvdWNoIG1vdmVzIG91dHNpZGUgb2ZcbiAgICAgIC8vIHRoaXMgZWxlbWVudC4gV2UgdXNlIGRpZmZlcmVudCBldmVudHMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHdlIGhhdmUgZGV0ZWN0ZWQgdGhhdCB0aGlzXG4gICAgICAvLyBpcyBhIHRvdWNoLWNhcGFibGUgZGV2aWNlLlxuICAgICAgKDAsIF9kb21GbnMuYWRkRXZlbnQpKG93bmVyRG9jdW1lbnQsIGRyYWdFdmVudEZvci5tb3ZlLCB0aGlzLmhhbmRsZURyYWcpO1xuICAgICAgKDAsIF9kb21GbnMuYWRkRXZlbnQpKG93bmVyRG9jdW1lbnQsIGRyYWdFdmVudEZvci5zdG9wLCB0aGlzLmhhbmRsZURyYWdTdG9wKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJoYW5kbGVEcmFnXCIsIGUgPT4ge1xuICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGRyYWcgcG9pbnQgZnJvbSB0aGUgZXZlbnQuIFRoaXMgaXMgdXNlZCBhcyB0aGUgb2Zmc2V0LlxuICAgICAgY29uc3QgcG9zaXRpb24gPSAoMCwgX3Bvc2l0aW9uRm5zLmdldENvbnRyb2xQb3NpdGlvbikoZSwgdGhpcy50b3VjaElkZW50aWZpZXIsIHRoaXMpO1xuICAgICAgaWYgKHBvc2l0aW9uID09IG51bGwpIHJldHVybjtcbiAgICAgIGxldCB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSBwb3NpdGlvbjtcblxuICAgICAgLy8gU25hcCB0byBncmlkIGlmIHByb3AgaGFzIGJlZW4gcHJvdmlkZWRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucHJvcHMuZ3JpZCkpIHtcbiAgICAgICAgbGV0IGRlbHRhWCA9IHggLSB0aGlzLmxhc3RYLFxuICAgICAgICAgIGRlbHRhWSA9IHkgLSB0aGlzLmxhc3RZO1xuICAgICAgICBbZGVsdGFYLCBkZWx0YVldID0gKDAsIF9wb3NpdGlvbkZucy5zbmFwVG9HcmlkKSh0aGlzLnByb3BzLmdyaWQsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgICAgaWYgKCFkZWx0YVggJiYgIWRlbHRhWSkgcmV0dXJuOyAvLyBza2lwIHVzZWxlc3MgZHJhZ1xuICAgICAgICB4ID0gdGhpcy5sYXN0WCArIGRlbHRhWCwgeSA9IHRoaXMubGFzdFkgKyBkZWx0YVk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb3JlRXZlbnQgPSAoMCwgX3Bvc2l0aW9uRm5zLmNyZWF0ZUNvcmVEYXRhKSh0aGlzLCB4LCB5KTtcbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGVDb3JlOiBoYW5kbGVEcmFnOiAlaicsIGNvcmVFdmVudCk7XG5cbiAgICAgIC8vIENhbGwgZXZlbnQgaGFuZGxlci4gSWYgaXQgcmV0dXJucyBleHBsaWNpdCBmYWxzZSwgdHJpZ2dlciBlbmQuXG4gICAgICBjb25zdCBzaG91bGRVcGRhdGUgPSB0aGlzLnByb3BzLm9uRHJhZyhlLCBjb3JlRXZlbnQpO1xuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gZmFsc2UgfHwgdGhpcy5tb3VudGVkID09PSBmYWxzZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vICRGbG93SWdub3JlXG4gICAgICAgICAgdGhpcy5oYW5kbGVEcmFnU3RvcChuZXcgTW91c2VFdmVudCgnbW91c2V1cCcpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gT2xkIGJyb3dzZXJzXG4gICAgICAgICAgY29uc3QgZXZlbnQgPSAoKGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpIC8qOiBhbnkqLykgLyo6IE1vdXNlVG91Y2hFdmVudCovKTtcbiAgICAgICAgICAvLyBJIHNlZSB3aHkgdGhpcyBpbnNhbml0eSB3YXMgZGVwcmVjYXRlZFxuICAgICAgICAgIC8vICRGbG93SWdub3JlXG4gICAgICAgICAgZXZlbnQuaW5pdE1vdXNlRXZlbnQoJ21vdXNldXAnLCB0cnVlLCB0cnVlLCB3aW5kb3csIDAsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZURyYWdTdG9wKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RYID0geDtcbiAgICAgIHRoaXMubGFzdFkgPSB5O1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImhhbmRsZURyYWdTdG9wXCIsIGUgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgICBjb25zdCBwb3NpdGlvbiA9ICgwLCBfcG9zaXRpb25GbnMuZ2V0Q29udHJvbFBvc2l0aW9uKShlLCB0aGlzLnRvdWNoSWRlbnRpZmllciwgdGhpcyk7XG4gICAgICBpZiAocG9zaXRpb24gPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgbGV0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHBvc2l0aW9uO1xuXG4gICAgICAvLyBTbmFwIHRvIGdyaWQgaWYgcHJvcCBoYXMgYmVlbiBwcm92aWRlZFxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5wcm9wcy5ncmlkKSkge1xuICAgICAgICBsZXQgZGVsdGFYID0geCAtIHRoaXMubGFzdFggfHwgMDtcbiAgICAgICAgbGV0IGRlbHRhWSA9IHkgLSB0aGlzLmxhc3RZIHx8IDA7XG4gICAgICAgIFtkZWx0YVgsIGRlbHRhWV0gPSAoMCwgX3Bvc2l0aW9uRm5zLnNuYXBUb0dyaWQpKHRoaXMucHJvcHMuZ3JpZCwgZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgICB4ID0gdGhpcy5sYXN0WCArIGRlbHRhWCwgeSA9IHRoaXMubGFzdFkgKyBkZWx0YVk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb3JlRXZlbnQgPSAoMCwgX3Bvc2l0aW9uRm5zLmNyZWF0ZUNvcmVEYXRhKSh0aGlzLCB4LCB5KTtcblxuICAgICAgLy8gQ2FsbCBldmVudCBoYW5kbGVyXG4gICAgICBjb25zdCBzaG91bGRDb250aW51ZSA9IHRoaXMucHJvcHMub25TdG9wKGUsIGNvcmVFdmVudCk7XG4gICAgICBpZiAoc2hvdWxkQ29udGludWUgPT09IGZhbHNlIHx8IHRoaXMubW91bnRlZCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHRoaXNOb2RlID0gdGhpcy5maW5kRE9NTm9kZSgpO1xuICAgICAgaWYgKHRoaXNOb2RlKSB7XG4gICAgICAgIC8vIFJlbW92ZSB1c2VyLXNlbGVjdCBoYWNrXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmVuYWJsZVVzZXJTZWxlY3RIYWNrKSAoMCwgX2RvbUZucy5yZW1vdmVVc2VyU2VsZWN0U3R5bGVzKSh0aGlzTm9kZS5vd25lckRvY3VtZW50KTtcbiAgICAgIH1cbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGVDb3JlOiBoYW5kbGVEcmFnU3RvcDogJWonLCBjb3JlRXZlbnQpO1xuXG4gICAgICAvLyBSZXNldCB0aGUgZWwuXG4gICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RYID0gTmFOO1xuICAgICAgdGhpcy5sYXN0WSA9IE5hTjtcbiAgICAgIGlmICh0aGlzTm9kZSkge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZUNvcmU6IFJlbW92aW5nIGhhbmRsZXJzJyk7XG4gICAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KSh0aGlzTm9kZS5vd25lckRvY3VtZW50LCBkcmFnRXZlbnRGb3IubW92ZSwgdGhpcy5oYW5kbGVEcmFnKTtcbiAgICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKHRoaXNOb2RlLm93bmVyRG9jdW1lbnQsIGRyYWdFdmVudEZvci5zdG9wLCB0aGlzLmhhbmRsZURyYWdTdG9wKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvbk1vdXNlRG93blwiLCBlID0+IHtcbiAgICAgIGRyYWdFdmVudEZvciA9IGV2ZW50c0Zvci5tb3VzZTsgLy8gb24gdG91Y2hzY3JlZW4gbGFwdG9wcyB3ZSBjb3VsZCBzd2l0Y2ggYmFjayB0byBtb3VzZVxuXG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVEcmFnU3RhcnQoZSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25Nb3VzZVVwXCIsIGUgPT4ge1xuICAgICAgZHJhZ0V2ZW50Rm9yID0gZXZlbnRzRm9yLm1vdXNlO1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRHJhZ1N0b3AoZSk7XG4gICAgfSk7XG4gICAgLy8gU2FtZSBhcyBvbk1vdXNlRG93biAoc3RhcnQgZHJhZyksIGJ1dCBub3cgY29uc2lkZXIgdGhpcyBhIHRvdWNoIGRldmljZS5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvblRvdWNoU3RhcnRcIiwgZSA9PiB7XG4gICAgICAvLyBXZSdyZSBvbiBhIHRvdWNoIGRldmljZSBub3csIHNvIGNoYW5nZSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgIGRyYWdFdmVudEZvciA9IGV2ZW50c0Zvci50b3VjaDtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZURyYWdTdGFydChlKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvblRvdWNoRW5kXCIsIGUgPT4ge1xuICAgICAgLy8gV2UncmUgb24gYSB0b3VjaCBkZXZpY2Ugbm93LCBzbyBjaGFuZ2UgdGhlIGV2ZW50IGhhbmRsZXJzXG4gICAgICBkcmFnRXZlbnRGb3IgPSBldmVudHNGb3IudG91Y2g7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVEcmFnU3RvcChlKTtcbiAgICB9KTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgIC8vIFRvdWNoIGhhbmRsZXJzIG11c3QgYmUgYWRkZWQgd2l0aCB7cGFzc2l2ZTogZmFsc2V9IHRvIGJlIGNhbmNlbGFibGUuXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wMS9zY3JvbGxpbmctaW50ZXJ2ZW50aW9uXG4gICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLmZpbmRET01Ob2RlKCk7XG4gICAgaWYgKHRoaXNOb2RlKSB7XG4gICAgICAoMCwgX2RvbUZucy5hZGRFdmVudCkodGhpc05vZGUsIGV2ZW50c0Zvci50b3VjaC5zdGFydCwgdGhpcy5vblRvdWNoU3RhcnQsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICAvLyBSZW1vdmUgYW55IGxlZnRvdmVyIGV2ZW50IGhhbmRsZXJzLiBSZW1vdmUgYm90aCB0b3VjaCBhbmQgbW91c2UgaGFuZGxlcnMgaW4gY2FzZVxuICAgIC8vIHNvbWUgYnJvd3NlciBxdWlyayBjYXVzZWQgYSB0b3VjaCBldmVudCB0byBmaXJlIGR1cmluZyBhIG1vdXNlIG1vdmUsIG9yIHZpY2UgdmVyc2EuXG4gICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLmZpbmRET01Ob2RlKCk7XG4gICAgaWYgKHRoaXNOb2RlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG93bmVyRG9jdW1lbnRcbiAgICAgIH0gPSB0aGlzTm9kZTtcbiAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KShvd25lckRvY3VtZW50LCBldmVudHNGb3IubW91c2UubW92ZSwgdGhpcy5oYW5kbGVEcmFnKTtcbiAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KShvd25lckRvY3VtZW50LCBldmVudHNGb3IudG91Y2gubW92ZSwgdGhpcy5oYW5kbGVEcmFnKTtcbiAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KShvd25lckRvY3VtZW50LCBldmVudHNGb3IubW91c2Uuc3RvcCwgdGhpcy5oYW5kbGVEcmFnU3RvcCk7XG4gICAgICAoMCwgX2RvbUZucy5yZW1vdmVFdmVudCkob3duZXJEb2N1bWVudCwgZXZlbnRzRm9yLnRvdWNoLnN0b3AsIHRoaXMuaGFuZGxlRHJhZ1N0b3ApO1xuICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKHRoaXNOb2RlLCBldmVudHNGb3IudG91Y2guc3RhcnQsIHRoaXMub25Ub3VjaFN0YXJ0LCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLnByb3BzLmVuYWJsZVVzZXJTZWxlY3RIYWNrKSAoMCwgX2RvbUZucy5yZW1vdmVVc2VyU2VsZWN0U3R5bGVzKShvd25lckRvY3VtZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWFjdCBTdHJpY3QgTW9kZSBjb21wYXRpYmlsaXR5OiBpZiBgbm9kZVJlZmAgaXMgcGFzc2VkLCB3ZSB3aWxsIHVzZSBpdCBpbnN0ZWFkIG9mIHRyeWluZyB0byBmaW5kXG4gIC8vIHRoZSB1bmRlcmx5aW5nIERPTSBub2RlIG91cnNlbHZlcy4gU2VlIHRoZSBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gIGZpbmRET01Ob2RlKCkgLyo6ID9IVE1MRWxlbWVudCove1xuICAgIHZhciBfdGhpcyRwcm9wcywgX3RoaXMkcHJvcHMyO1xuICAgIHJldHVybiAoX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzKSAhPT0gbnVsbCAmJiBfdGhpcyRwcm9wcyAhPT0gdm9pZCAwICYmIF90aGlzJHByb3BzLm5vZGVSZWYgPyAoX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcykgPT09IG51bGwgfHwgX3RoaXMkcHJvcHMyID09PSB2b2lkIDAgfHwgKF90aGlzJHByb3BzMiA9IF90aGlzJHByb3BzMi5ub2RlUmVmKSA9PT0gbnVsbCB8fCBfdGhpcyRwcm9wczIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHByb3BzMi5jdXJyZW50IDogX3JlYWN0RG9tLmRlZmF1bHQuZmluZERPTU5vZGUodGhpcyk7XG4gIH1cbiAgcmVuZGVyKCkgLyo6IFJlYWN0LkVsZW1lbnQ8YW55Piove1xuICAgIC8vIFJldXNlIHRoZSBjaGlsZCBwcm92aWRlZFxuICAgIC8vIFRoaXMgbWFrZXMgaXQgZmxleGlibGUgdG8gdXNlIHdoYXRldmVyIGVsZW1lbnQgaXMgd2FudGVkIChkaXYsIHVsLCBldGMpXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoUmVhY3QuQ2hpbGRyZW4ub25seSh0aGlzLnByb3BzLmNoaWxkcmVuKSwge1xuICAgICAgLy8gTm90ZTogbW91c2VNb3ZlIGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgc28gaXQgd2lsbCBzdGlsbCBmdW5jdGlvblxuICAgICAgLy8gd2hlbiB0aGUgdXNlciBkcmFncyBxdWlja2x5IGFuZCBsZWF2ZXMgdGhlIGJvdW5kcyBvZiB0aGUgZWxlbWVudC5cbiAgICAgIG9uTW91c2VEb3duOiB0aGlzLm9uTW91c2VEb3duLFxuICAgICAgb25Nb3VzZVVwOiB0aGlzLm9uTW91c2VVcCxcbiAgICAgIC8vIG9uVG91Y2hTdGFydCBpcyBhZGRlZCBvbiBgY29tcG9uZW50RGlkTW91bnRgIHNvIHRoZXkgY2FuIGJlIGFkZGVkIHdpdGhcbiAgICAgIC8vIHtwYXNzaXZlOiBmYWxzZX0sIHdoaWNoIGFsbG93cyBpdCB0byBjYW5jZWwuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxNy8wMS9zY3JvbGxpbmctaW50ZXJ2ZW50aW9uXG4gICAgICBvblRvdWNoRW5kOiB0aGlzLm9uVG91Y2hFbmRcbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRHJhZ2dhYmxlQ29yZTtcbl9kZWZpbmVQcm9wZXJ0eShEcmFnZ2FibGVDb3JlLCBcImRpc3BsYXlOYW1lXCIsICdEcmFnZ2FibGVDb3JlJyk7XG5fZGVmaW5lUHJvcGVydHkoRHJhZ2dhYmxlQ29yZSwgXCJwcm9wVHlwZXNcIiwge1xuICAvKipcbiAgICogYGFsbG93QW55Q2xpY2tgIGFsbG93cyBkcmFnZ2luZyB1c2luZyBhbnkgbW91c2UgYnV0dG9uLlxuICAgKiBCeSBkZWZhdWx0LCB3ZSBvbmx5IGFjY2VwdCB0aGUgbGVmdCBidXR0b24uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBhbGxvd0FueUNsaWNrOiBfcHJvcFR5cGVzLmRlZmF1bHQuYm9vbCxcbiAgY2hpbGRyZW46IF9wcm9wVHlwZXMuZGVmYXVsdC5ub2RlLmlzUmVxdWlyZWQsXG4gIC8qKlxuICAgKiBgZGlzYWJsZWRgLCBpZiB0cnVlLCBzdG9wcyB0aGUgPERyYWdnYWJsZT4gZnJvbSBkcmFnZ2luZy4gQWxsIGhhbmRsZXJzLFxuICAgKiB3aXRoIHRoZSBleGNlcHRpb24gb2YgYG9uTW91c2VEb3duYCwgd2lsbCBub3QgZmlyZS5cbiAgICovXG4gIGRpc2FibGVkOiBfcHJvcFR5cGVzLmRlZmF1bHQuYm9vbCxcbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHdlIGFkZCAndXNlci1zZWxlY3Q6bm9uZScgYXR0cmlidXRlcyB0byB0aGUgZG9jdW1lbnQgYm9keVxuICAgKiB0byBwcmV2ZW50IHVnbHkgdGV4dCBzZWxlY3Rpb24gZHVyaW5nIGRyYWcuIElmIHRoaXMgaXMgY2F1c2luZyBwcm9ibGVtc1xuICAgKiBmb3IgeW91ciBhcHAsIHNldCB0aGlzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBlbmFibGVVc2VyU2VsZWN0SGFjazogX3Byb3BUeXBlcy5kZWZhdWx0LmJvb2wsXG4gIC8qKlxuICAgKiBgb2Zmc2V0UGFyZW50YCwgaWYgc2V0LCB1c2VzIHRoZSBwYXNzZWQgRE9NIG5vZGUgdG8gY29tcHV0ZSBkcmFnIG9mZnNldHNcbiAgICogaW5zdGVhZCBvZiB1c2luZyB0aGUgcGFyZW50IG5vZGUuXG4gICAqL1xuICBvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uIChwcm9wcyAvKjogRHJhZ2dhYmxlQ29yZVByb3BzKi8sIHByb3BOYW1lIC8qOiAkS2V5czxEcmFnZ2FibGVDb3JlUHJvcHM+Ki8pIHtcbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdICYmIHByb3BzW3Byb3BOYW1lXS5ub2RlVHlwZSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEcmFnZ2FibGVcXCdzIG9mZnNldFBhcmVudCBtdXN0IGJlIGEgRE9NIE5vZGUuJyk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogYGdyaWRgIHNwZWNpZmllcyB0aGUgeCBhbmQgeSB0aGF0IGRyYWdnaW5nIHNob3VsZCBzbmFwIHRvLlxuICAgKi9cbiAgZ3JpZDogX3Byb3BUeXBlcy5kZWZhdWx0LmFycmF5T2YoX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlciksXG4gIC8qKlxuICAgKiBgaGFuZGxlYCBzcGVjaWZpZXMgYSBzZWxlY3RvciB0byBiZSB1c2VkIGFzIHRoZSBoYW5kbGUgdGhhdCBpbml0aWF0ZXMgZHJhZy5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganN4XG4gICAqICAgbGV0IEFwcCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAqICAgICAgICAgcmV0dXJuIChcbiAgICogICAgICAgICAgICA8RHJhZ2dhYmxlIGhhbmRsZT1cIi5oYW5kbGVcIj5cbiAgICogICAgICAgICAgICAgIDxkaXY+XG4gICAqICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoYW5kbGVcIj5DbGljayBtZSB0byBkcmFnPC9kaXY+XG4gICAqICAgICAgICAgICAgICAgICAgPGRpdj5UaGlzIGlzIHNvbWUgb3RoZXIgY29udGVudDwvZGl2PlxuICAgKiAgICAgICAgICAgICAgPC9kaXY+XG4gICAqICAgICAgICAgICA8L0RyYWdnYWJsZT5cbiAgICogICAgICAgICApO1xuICAgKiAgICAgICB9XG4gICAqICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgaGFuZGxlOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICAvKipcbiAgICogYGNhbmNlbGAgc3BlY2lmaWVzIGEgc2VsZWN0b3IgdG8gYmUgdXNlZCB0byBwcmV2ZW50IGRyYWcgaW5pdGlhbGl6YXRpb24uXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiAgIGxldCBBcHAgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgKiAgICAgICAgICAgcmV0dXJuKFxuICAgKiAgICAgICAgICAgICAgIDxEcmFnZ2FibGUgY2FuY2VsPVwiLmNhbmNlbFwiPlxuICAgKiAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgKiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2FuY2VsXCI+WW91IGNhbid0IGRyYWcgZnJvbSBoZXJlPC9kaXY+XG4gICAqICAgICAgICAgICAgICAgICAgICAgPGRpdj5EcmFnZ2luZyBoZXJlIHdvcmtzIGZpbmU8L2Rpdj5cbiAgICogICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAqICAgICAgICAgICAgICAgPC9EcmFnZ2FibGU+XG4gICAqICAgICAgICAgICApO1xuICAgKiAgICAgICB9XG4gICAqICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgY2FuY2VsOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICAvKiBJZiBydW5uaW5nIGluIFJlYWN0IFN0cmljdCBtb2RlLCBSZWFjdERPTS5maW5kRE9NTm9kZSgpIGlzIGRlcHJlY2F0ZWQuXG4gICAqIFVuZm9ydHVuYXRlbHksIGluIG9yZGVyIGZvciA8RHJhZ2dhYmxlPiB0byB3b3JrIHByb3Blcmx5LCB3ZSBuZWVkIHJhdyBhY2Nlc3NcbiAgICogdG8gdGhlIHVuZGVybHlpbmcgRE9NIG5vZGUuIElmIHlvdSB3YW50IHRvIGF2b2lkIHRoZSB3YXJuaW5nLCBwYXNzIGEgYG5vZGVSZWZgXG4gICAqIGFzIGluIHRoaXMgZXhhbXBsZTpcbiAgICpcbiAgICogZnVuY3Rpb24gTXlDb21wb25lbnQoKSB7XG4gICAqICAgY29uc3Qgbm9kZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICogICByZXR1cm4gKFxuICAgKiAgICAgPERyYWdnYWJsZSBub2RlUmVmPXtub2RlUmVmfT5cbiAgICogICAgICAgPGRpdiByZWY9e25vZGVSZWZ9PkV4YW1wbGUgVGFyZ2V0PC9kaXY+XG4gICAqICAgICA8L0RyYWdnYWJsZT5cbiAgICogICApO1xuICAgKiB9XG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFyYml0cmFyaWx5IG5lc3RlZCBjb21wb25lbnRzLCBzbyBsb25nIGFzIHRoZSByZWYgZW5kcyB1cFxuICAgKiBwb2ludGluZyB0byB0aGUgYWN0dWFsIGNoaWxkIERPTSBub2RlIGFuZCBub3QgYSBjdXN0b20gY29tcG9uZW50LlxuICAgKi9cbiAgbm9kZVJlZjogX3Byb3BUeXBlcy5kZWZhdWx0Lm9iamVjdCxcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGRyYWdnaW5nIHN0YXJ0cy5cbiAgICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBib29sZWFuIGZhbHNlLCBkcmFnZ2luZyB3aWxsIGJlIGNhbmNlbGVkLlxuICAgKi9cbiAgb25TdGFydDogX3Byb3BUeXBlcy5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hpbGUgZHJhZ2dpbmcuXG4gICAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYm9vbGVhbiBmYWxzZSwgZHJhZ2dpbmcgd2lsbCBiZSBjYW5jZWxlZC5cbiAgICovXG4gIG9uRHJhZzogX3Byb3BUeXBlcy5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBkcmFnZ2luZyBzdG9wcy5cbiAgICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBib29sZWFuIGZhbHNlLCB0aGUgZHJhZyB3aWxsIHJlbWFpbiBhY3RpdmUuXG4gICAqL1xuICBvblN0b3A6IF9wcm9wVHlwZXMuZGVmYXVsdC5mdW5jLFxuICAvKipcbiAgICogQSB3b3JrYXJvdW5kIG9wdGlvbiB3aGljaCBjYW4gYmUgcGFzc2VkIGlmIG9uTW91c2VEb3duIG5lZWRzIHRvIGJlIGFjY2Vzc2VkLFxuICAgKiBzaW5jZSBpdCdsbCBhbHdheXMgYmUgYmxvY2tlZCAoYXMgdGhlcmUgaXMgaW50ZXJuYWwgdXNlIG9mIG9uTW91c2VEb3duKVxuICAgKi9cbiAgb25Nb3VzZURvd246IF9wcm9wVHlwZXMuZGVmYXVsdC5mdW5jLFxuICAvKipcbiAgICogYHNjYWxlYCwgaWYgc2V0LCBhcHBsaWVzIHNjYWxpbmcgd2hpbGUgZHJhZ2dpbmcgYW4gZWxlbWVudFxuICAgKi9cbiAgc2NhbGU6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsXG4gIC8qKlxuICAgKiBUaGVzZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZWZpbmVkIG9uIHRoZSBjaGlsZCwgbm90IGhlcmUuXG4gICAqL1xuICBjbGFzc05hbWU6IF9zaGltcy5kb250U2V0TWUsXG4gIHN0eWxlOiBfc2hpbXMuZG9udFNldE1lLFxuICB0cmFuc2Zvcm06IF9zaGltcy5kb250U2V0TWVcbn0pO1xuX2RlZmluZVByb3BlcnR5KERyYWdnYWJsZUNvcmUsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgYWxsb3dBbnlDbGljazogZmFsc2UsXG4gIC8vIGJ5IGRlZmF1bHQgb25seSBhY2NlcHQgbGVmdCBjbGlja1xuICBkaXNhYmxlZDogZmFsc2UsXG4gIGVuYWJsZVVzZXJTZWxlY3RIYWNrOiB0cnVlLFxuICBvblN0YXJ0OiBmdW5jdGlvbiAoKSB7fSxcbiAgb25EcmFnOiBmdW5jdGlvbiAoKSB7fSxcbiAgb25TdG9wOiBmdW5jdGlvbiAoKSB7fSxcbiAgb25Nb3VzZURvd246IGZ1bmN0aW9uICgpIHt9LFxuICBzY2FsZTogMVxufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmNvbnN0IHtcbiAgZGVmYXVsdDogRHJhZ2dhYmxlLFxuICBEcmFnZ2FibGVDb3JlXG59ID0gcmVxdWlyZSgnLi9EcmFnZ2FibGUnKTtcblxuLy8gUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBsaWIgZXhwb3J0ZWQgPERyYWdnYWJsZT4gYXMgdGhlIHJvb3QgZXhwb3J0LiBBcyB0byBuby0vLyB0aGVtLCBvciBUeXBlU2NyaXB0LCB3ZSBleHBvcnQgKmJvdGgqIGFzIHRoZSByb290IGFuZCBhcyAnZGVmYXVsdCcuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL216YWJyaXNraWUvcmVhY3QtZHJhZ2dhYmxlL3B1bGwvMjU0XG4vLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL216YWJyaXNraWUvcmVhY3QtZHJhZ2dhYmxlL2lzc3Vlcy8yNjZcbm1vZHVsZS5leHBvcnRzID0gRHJhZ2dhYmxlO1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IERyYWdnYWJsZTtcbm1vZHVsZS5leHBvcnRzLkRyYWdnYWJsZUNvcmUgPSBEcmFnZ2FibGVDb3JlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5hZGRDbGFzc05hbWUgPSBhZGRDbGFzc05hbWU7XG5leHBvcnRzLmFkZEV2ZW50ID0gYWRkRXZlbnQ7XG5leHBvcnRzLmFkZFVzZXJTZWxlY3RTdHlsZXMgPSBhZGRVc2VyU2VsZWN0U3R5bGVzO1xuZXhwb3J0cy5jcmVhdGVDU1NUcmFuc2Zvcm0gPSBjcmVhdGVDU1NUcmFuc2Zvcm07XG5leHBvcnRzLmNyZWF0ZVNWR1RyYW5zZm9ybSA9IGNyZWF0ZVNWR1RyYW5zZm9ybTtcbmV4cG9ydHMuZ2V0VG91Y2ggPSBnZXRUb3VjaDtcbmV4cG9ydHMuZ2V0VG91Y2hJZGVudGlmaWVyID0gZ2V0VG91Y2hJZGVudGlmaWVyO1xuZXhwb3J0cy5nZXRUcmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uO1xuZXhwb3J0cy5pbm5lckhlaWdodCA9IGlubmVySGVpZ2h0O1xuZXhwb3J0cy5pbm5lcldpZHRoID0gaW5uZXJXaWR0aDtcbmV4cG9ydHMubWF0Y2hlc1NlbGVjdG9yID0gbWF0Y2hlc1NlbGVjdG9yO1xuZXhwb3J0cy5tYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG8gPSBtYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG87XG5leHBvcnRzLm9mZnNldFhZRnJvbVBhcmVudCA9IG9mZnNldFhZRnJvbVBhcmVudDtcbmV4cG9ydHMub3V0ZXJIZWlnaHQgPSBvdXRlckhlaWdodDtcbmV4cG9ydHMub3V0ZXJXaWR0aCA9IG91dGVyV2lkdGg7XG5leHBvcnRzLnJlbW92ZUNsYXNzTmFtZSA9IHJlbW92ZUNsYXNzTmFtZTtcbmV4cG9ydHMucmVtb3ZlRXZlbnQgPSByZW1vdmVFdmVudDtcbmV4cG9ydHMucmVtb3ZlVXNlclNlbGVjdFN0eWxlcyA9IHJlbW92ZVVzZXJTZWxlY3RTdHlsZXM7XG52YXIgX3NoaW1zID0gcmVxdWlyZShcIi4vc2hpbXNcIik7XG52YXIgX2dldFByZWZpeCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2dldFByZWZpeFwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChrZXkgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cbi8qOjogaW1wb3J0IHR5cGUge0NvbnRyb2xQb3NpdGlvbiwgUG9zaXRpb25PZmZzZXRDb250cm9sUG9zaXRpb24sIE1vdXNlVG91Y2hFdmVudH0gZnJvbSAnLi90eXBlcyc7Ki9cbmxldCBtYXRjaGVzU2VsZWN0b3JGdW5jID0gJyc7XG5mdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IoZWwgLyo6IE5vZGUqLywgc2VsZWN0b3IgLyo6IHN0cmluZyovKSAvKjogYm9vbGVhbiove1xuICBpZiAoIW1hdGNoZXNTZWxlY3RvckZ1bmMpIHtcbiAgICBtYXRjaGVzU2VsZWN0b3JGdW5jID0gKDAsIF9zaGltcy5maW5kSW5BcnJheSkoWydtYXRjaGVzJywgJ3dlYmtpdE1hdGNoZXNTZWxlY3RvcicsICdtb3pNYXRjaGVzU2VsZWN0b3InLCAnbXNNYXRjaGVzU2VsZWN0b3InLCAnb01hdGNoZXNTZWxlY3RvciddLCBmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAvLyAkRmxvd0lnbm9yZTogRG9lc24ndCB0aGluayBlbGVtZW50cyBhcmUgaW5kZXhhYmxlXG4gICAgICByZXR1cm4gKDAsIF9zaGltcy5pc0Z1bmN0aW9uKShlbFttZXRob2RdKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIE1pZ2h0IG5vdCBiZSBmb3VuZCBlbnRpcmVseSAobm90IGFuIEVsZW1lbnQ/KSAtIGluIHRoYXQgY2FzZSwgYmFpbFxuICAvLyAkRmxvd0lnbm9yZTogRG9lc24ndCB0aGluayBlbGVtZW50cyBhcmUgaW5kZXhhYmxlXG4gIGlmICghKDAsIF9zaGltcy5pc0Z1bmN0aW9uKShlbFttYXRjaGVzU2VsZWN0b3JGdW5jXSkpIHJldHVybiBmYWxzZTtcblxuICAvLyAkRmxvd0lnbm9yZTogRG9lc24ndCB0aGluayBlbGVtZW50cyBhcmUgaW5kZXhhYmxlXG4gIHJldHVybiBlbFttYXRjaGVzU2VsZWN0b3JGdW5jXShzZWxlY3Rvcik7XG59XG5cbi8vIFdvcmtzIHVwIHRoZSB0cmVlIHRvIHRoZSBkcmFnZ2FibGUgaXRzZWxmIGF0dGVtcHRpbmcgdG8gbWF0Y2ggc2VsZWN0b3IuXG5mdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG8oZWwgLyo6IE5vZGUqLywgc2VsZWN0b3IgLyo6IHN0cmluZyovLCBiYXNlTm9kZSAvKjogTm9kZSovKSAvKjogYm9vbGVhbiove1xuICBsZXQgbm9kZSA9IGVsO1xuICBkbyB7XG4gICAgaWYgKG1hdGNoZXNTZWxlY3Rvcihub2RlLCBzZWxlY3RvcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChub2RlID09PSBiYXNlTm9kZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vICRGbG93SWdub3JlW2luY29tcGF0aWJsZS10eXBlXVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gIH0gd2hpbGUgKG5vZGUpO1xuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBhZGRFdmVudChlbCAvKjogP05vZGUqLywgZXZlbnQgLyo6IHN0cmluZyovLCBoYW5kbGVyIC8qOiBGdW5jdGlvbiovLCBpbnB1dE9wdGlvbnMgLyo6IE9iamVjdCovKSAvKjogdm9pZCove1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAuLi5pbnB1dE9wdGlvbnNcbiAgfTtcbiAgLy8gJEZsb3dJZ25vcmVbbWV0aG9kLXVuYmluZGluZ11cbiAgaWYgKGVsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmIChlbC5hdHRhY2hFdmVudCkge1xuICAgIGVsLmF0dGFjaEV2ZW50KCdvbicgKyBldmVudCwgaGFuZGxlcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gJEZsb3dJZ25vcmU6IERvZXNuJ3QgdGhpbmsgZWxlbWVudHMgYXJlIGluZGV4YWJsZVxuICAgIGVsWydvbicgKyBldmVudF0gPSBoYW5kbGVyO1xuICB9XG59XG5mdW5jdGlvbiByZW1vdmVFdmVudChlbCAvKjogP05vZGUqLywgZXZlbnQgLyo6IHN0cmluZyovLCBoYW5kbGVyIC8qOiBGdW5jdGlvbiovLCBpbnB1dE9wdGlvbnMgLyo6IE9iamVjdCovKSAvKjogdm9pZCove1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAuLi5pbnB1dE9wdGlvbnNcbiAgfTtcbiAgLy8gJEZsb3dJZ25vcmVbbWV0aG9kLXVuYmluZGluZ11cbiAgaWYgKGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmIChlbC5kZXRhY2hFdmVudCkge1xuICAgIGVsLmRldGFjaEV2ZW50KCdvbicgKyBldmVudCwgaGFuZGxlcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gJEZsb3dJZ25vcmU6IERvZXNuJ3QgdGhpbmsgZWxlbWVudHMgYXJlIGluZGV4YWJsZVxuICAgIGVsWydvbicgKyBldmVudF0gPSBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBvdXRlckhlaWdodChub2RlIC8qOiBIVE1MRWxlbWVudCovKSAvKjogbnVtYmVyKi97XG4gIC8vIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IGV4Y2x1ZGluZyBtYXJnaW4gZm9yIG91ciBjYWxjdWxhdGlvbnMsIHNpbmNlIHdlIGFyZSB1c2luZ1xuICAvLyBvZmZzZXRUb3Agd2hpY2ggaXMgaW5jbHVkaW5nIG1hcmdpbi4gU2VlIGdldEJvdW5kUG9zaXRpb25cbiAgbGV0IGhlaWdodCA9IG5vZGUuY2xpZW50SGVpZ2h0O1xuICBjb25zdCBjb21wdXRlZFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gIGhlaWdodCArPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCk7XG4gIGhlaWdodCArPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCk7XG4gIHJldHVybiBoZWlnaHQ7XG59XG5mdW5jdGlvbiBvdXRlcldpZHRoKG5vZGUgLyo6IEhUTUxFbGVtZW50Ki8pIC8qOiBudW1iZXIqL3tcbiAgLy8gVGhpcyBpcyBkZWxpYmVyYXRlbHkgZXhjbHVkaW5nIG1hcmdpbiBmb3Igb3VyIGNhbGN1bGF0aW9ucywgc2luY2Ugd2UgYXJlIHVzaW5nXG4gIC8vIG9mZnNldExlZnQgd2hpY2ggaXMgaW5jbHVkaW5nIG1hcmdpbi4gU2VlIGdldEJvdW5kUG9zaXRpb25cbiAgbGV0IHdpZHRoID0gbm9kZS5jbGllbnRXaWR0aDtcbiAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICB3aWR0aCArPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpO1xuICB3aWR0aCArPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5ib3JkZXJSaWdodFdpZHRoKTtcbiAgcmV0dXJuIHdpZHRoO1xufVxuZnVuY3Rpb24gaW5uZXJIZWlnaHQobm9kZSAvKjogSFRNTEVsZW1lbnQqLykgLyo6IG51bWJlciove1xuICBsZXQgaGVpZ2h0ID0gbm9kZS5jbGllbnRIZWlnaHQ7XG4gIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgaGVpZ2h0IC09ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3ApO1xuICBoZWlnaHQgLT0gKDAsIF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUucGFkZGluZ0JvdHRvbSk7XG4gIHJldHVybiBoZWlnaHQ7XG59XG5mdW5jdGlvbiBpbm5lcldpZHRoKG5vZGUgLyo6IEhUTUxFbGVtZW50Ki8pIC8qOiBudW1iZXIqL3tcbiAgbGV0IHdpZHRoID0gbm9kZS5jbGllbnRXaWR0aDtcbiAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICB3aWR0aCAtPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5wYWRkaW5nTGVmdCk7XG4gIHdpZHRoIC09ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLnBhZGRpbmdSaWdodCk7XG4gIHJldHVybiB3aWR0aDtcbn1cbi8qOjogaW50ZXJmYWNlIEV2ZW50V2l0aE9mZnNldCB7XG4gIGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyXG59Ki9cbi8vIEdldCBmcm9tIG9mZnNldFBhcmVudFxuZnVuY3Rpb24gb2Zmc2V0WFlGcm9tUGFyZW50KGV2dCAvKjogRXZlbnRXaXRoT2Zmc2V0Ki8sIG9mZnNldFBhcmVudCAvKjogSFRNTEVsZW1lbnQqLywgc2NhbGUgLyo6IG51bWJlciovKSAvKjogQ29udHJvbFBvc2l0aW9uKi97XG4gIGNvbnN0IGlzQm9keSA9IG9mZnNldFBhcmVudCA9PT0gb2Zmc2V0UGFyZW50Lm93bmVyRG9jdW1lbnQuYm9keTtcbiAgY29uc3Qgb2Zmc2V0UGFyZW50UmVjdCA9IGlzQm9keSA/IHtcbiAgICBsZWZ0OiAwLFxuICAgIHRvcDogMFxuICB9IDogb2Zmc2V0UGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB4ID0gKGV2dC5jbGllbnRYICsgb2Zmc2V0UGFyZW50LnNjcm9sbExlZnQgLSBvZmZzZXRQYXJlbnRSZWN0LmxlZnQpIC8gc2NhbGU7XG4gIGNvbnN0IHkgPSAoZXZ0LmNsaWVudFkgKyBvZmZzZXRQYXJlbnQuc2Nyb2xsVG9wIC0gb2Zmc2V0UGFyZW50UmVjdC50b3ApIC8gc2NhbGU7XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDU1NUcmFuc2Zvcm0oY29udHJvbFBvcyAvKjogQ29udHJvbFBvc2l0aW9uKi8sIHBvc2l0aW9uT2Zmc2V0IC8qOiBQb3NpdGlvbk9mZnNldENvbnRyb2xQb3NpdGlvbiovKSAvKjogT2JqZWN0Ki97XG4gIGNvbnN0IHRyYW5zbGF0aW9uID0gZ2V0VHJhbnNsYXRpb24oY29udHJvbFBvcywgcG9zaXRpb25PZmZzZXQsICdweCcpO1xuICByZXR1cm4ge1xuICAgIFsoMCwgX2dldFByZWZpeC5icm93c2VyUHJlZml4VG9LZXkpKCd0cmFuc2Zvcm0nLCBfZ2V0UHJlZml4LmRlZmF1bHQpXTogdHJhbnNsYXRpb25cbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNWR1RyYW5zZm9ybShjb250cm9sUG9zIC8qOiBDb250cm9sUG9zaXRpb24qLywgcG9zaXRpb25PZmZzZXQgLyo6IFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uKi8pIC8qOiBzdHJpbmcqL3tcbiAgY29uc3QgdHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbihjb250cm9sUG9zLCBwb3NpdGlvbk9mZnNldCwgJycpO1xuICByZXR1cm4gdHJhbnNsYXRpb247XG59XG5mdW5jdGlvbiBnZXRUcmFuc2xhdGlvbihfcmVmIC8qOjogKi8sIHBvc2l0aW9uT2Zmc2V0IC8qOiBQb3NpdGlvbk9mZnNldENvbnRyb2xQb3NpdGlvbiovLCB1bml0U3VmZml4IC8qOiBzdHJpbmcqLykgLyo6IHN0cmluZyove1xuICBsZXQge1xuICAgIHgsXG4gICAgeVxuICB9IC8qOiBDb250cm9sUG9zaXRpb24qLyA9IF9yZWYgLyo6IENvbnRyb2xQb3NpdGlvbiovO1xuICBsZXQgdHJhbnNsYXRpb24gPSBcInRyYW5zbGF0ZShcIi5jb25jYXQoeCkuY29uY2F0KHVuaXRTdWZmaXgsIFwiLFwiKS5jb25jYXQoeSkuY29uY2F0KHVuaXRTdWZmaXgsIFwiKVwiKTtcbiAgaWYgKHBvc2l0aW9uT2Zmc2V0KSB7XG4gICAgY29uc3QgZGVmYXVsdFggPSBcIlwiLmNvbmNhdCh0eXBlb2YgcG9zaXRpb25PZmZzZXQueCA9PT0gJ3N0cmluZycgPyBwb3NpdGlvbk9mZnNldC54IDogcG9zaXRpb25PZmZzZXQueCArIHVuaXRTdWZmaXgpO1xuICAgIGNvbnN0IGRlZmF1bHRZID0gXCJcIi5jb25jYXQodHlwZW9mIHBvc2l0aW9uT2Zmc2V0LnkgPT09ICdzdHJpbmcnID8gcG9zaXRpb25PZmZzZXQueSA6IHBvc2l0aW9uT2Zmc2V0LnkgKyB1bml0U3VmZml4KTtcbiAgICB0cmFuc2xhdGlvbiA9IFwidHJhbnNsYXRlKFwiLmNvbmNhdChkZWZhdWx0WCwgXCIsIFwiKS5jb25jYXQoZGVmYXVsdFksIFwiKVwiKSArIHRyYW5zbGF0aW9uO1xuICB9XG4gIHJldHVybiB0cmFuc2xhdGlvbjtcbn1cbmZ1bmN0aW9uIGdldFRvdWNoKGUgLyo6IE1vdXNlVG91Y2hFdmVudCovLCBpZGVudGlmaWVyIC8qOiBudW1iZXIqLykgLyo6ID97Y2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXJ9Ki97XG4gIHJldHVybiBlLnRhcmdldFRvdWNoZXMgJiYgKDAsIF9zaGltcy5maW5kSW5BcnJheSkoZS50YXJnZXRUb3VjaGVzLCB0ID0+IGlkZW50aWZpZXIgPT09IHQuaWRlbnRpZmllcikgfHwgZS5jaGFuZ2VkVG91Y2hlcyAmJiAoMCwgX3NoaW1zLmZpbmRJbkFycmF5KShlLmNoYW5nZWRUb3VjaGVzLCB0ID0+IGlkZW50aWZpZXIgPT09IHQuaWRlbnRpZmllcik7XG59XG5mdW5jdGlvbiBnZXRUb3VjaElkZW50aWZpZXIoZSAvKjogTW91c2VUb3VjaEV2ZW50Ki8pIC8qOiA/bnVtYmVyKi97XG4gIGlmIChlLnRhcmdldFRvdWNoZXMgJiYgZS50YXJnZXRUb3VjaGVzWzBdKSByZXR1cm4gZS50YXJnZXRUb3VjaGVzWzBdLmlkZW50aWZpZXI7XG4gIGlmIChlLmNoYW5nZWRUb3VjaGVzICYmIGUuY2hhbmdlZFRvdWNoZXNbMF0pIHJldHVybiBlLmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXI7XG59XG5cbi8vIFVzZXItc2VsZWN0IEhhY2tzOlxuLy9cbi8vIFVzZWZ1bCBmb3IgcHJldmVudGluZyBibHVlIGhpZ2hsaWdodHMgYWxsIG92ZXIgZXZlcnl0aGluZyB3aGVuIGRyYWdnaW5nLlxuXG4vLyBOb3RlIHdlJ3JlIHBhc3NpbmcgYGRvY3VtZW50YCBiL2Mgd2UgY291bGQgYmUgaWZyYW1lZFxuZnVuY3Rpb24gYWRkVXNlclNlbGVjdFN0eWxlcyhkb2MgLyo6ID9Eb2N1bWVudCovKSB7XG4gIGlmICghZG9jKSByZXR1cm47XG4gIGxldCBzdHlsZUVsID0gZG9jLmdldEVsZW1lbnRCeUlkKCdyZWFjdC1kcmFnZ2FibGUtc3R5bGUtZWwnKTtcbiAgaWYgKCFzdHlsZUVsKSB7XG4gICAgc3R5bGVFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWwudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgc3R5bGVFbC5pZCA9ICdyZWFjdC1kcmFnZ2FibGUtc3R5bGUtZWwnO1xuICAgIHN0eWxlRWwuaW5uZXJIVE1MID0gJy5yZWFjdC1kcmFnZ2FibGUtdHJhbnNwYXJlbnQtc2VsZWN0aW9uICo6Oi1tb3otc2VsZWN0aW9uIHthbGw6IGluaGVyaXQ7fVxcbic7XG4gICAgc3R5bGVFbC5pbm5lckhUTUwgKz0gJy5yZWFjdC1kcmFnZ2FibGUtdHJhbnNwYXJlbnQtc2VsZWN0aW9uICo6OnNlbGVjdGlvbiB7YWxsOiBpbmhlcml0O31cXG4nO1xuICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHN0eWxlRWwpO1xuICB9XG4gIGlmIChkb2MuYm9keSkgYWRkQ2xhc3NOYW1lKGRvYy5ib2R5LCAncmVhY3QtZHJhZ2dhYmxlLXRyYW5zcGFyZW50LXNlbGVjdGlvbicpO1xufVxuZnVuY3Rpb24gcmVtb3ZlVXNlclNlbGVjdFN0eWxlcyhkb2MgLyo6ID9Eb2N1bWVudCovKSB7XG4gIGlmICghZG9jKSByZXR1cm47XG4gIHRyeSB7XG4gICAgaWYgKGRvYy5ib2R5KSByZW1vdmVDbGFzc05hbWUoZG9jLmJvZHksICdyZWFjdC1kcmFnZ2FibGUtdHJhbnNwYXJlbnQtc2VsZWN0aW9uJyk7XG4gICAgLy8gJEZsb3dJZ25vcmU6IElFXG4gICAgaWYgKGRvYy5zZWxlY3Rpb24pIHtcbiAgICAgIC8vICRGbG93SWdub3JlOiBJRVxuICAgICAgZG9jLnNlbGVjdGlvbi5lbXB0eSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1vdmUgc2VsZWN0aW9uIGNhdXNlZCBieSBzY3JvbGwsIHVubGVzcyBpdCdzIGEgZm9jdXNlZCBpbnB1dFxuICAgICAgLy8gKHdlIHVzZSBkb2MuZGVmYXVsdFZpZXcgaW4gY2FzZSB3ZSdyZSBpbiBhbiBpZnJhbWUpXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSAoZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdykuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50eXBlICE9PSAnQ2FyZXQnKSB7XG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBwcm9iYWJseSBJRVxuICB9XG59XG5mdW5jdGlvbiBhZGRDbGFzc05hbWUoZWwgLyo6IEhUTUxFbGVtZW50Ki8sIGNsYXNzTmFtZSAvKjogc3RyaW5nKi8pIHtcbiAgaWYgKGVsLmNsYXNzTGlzdCkge1xuICAgIGVsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWVsLmNsYXNzTmFtZS5tYXRjaChuZXcgUmVnRXhwKFwiKD86XnxcXFxccylcIi5jb25jYXQoY2xhc3NOYW1lLCBcIig/IVxcXFxTKVwiKSkpKSB7XG4gICAgICBlbC5jbGFzc05hbWUgKz0gXCIgXCIuY29uY2F0KGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZW1vdmVDbGFzc05hbWUoZWwgLyo6IEhUTUxFbGVtZW50Ki8sIGNsYXNzTmFtZSAvKjogc3RyaW5nKi8pIHtcbiAgaWYgKGVsLmNsYXNzTGlzdCkge1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKFwiKD86XnxcXFxccylcIi5jb25jYXQoY2xhc3NOYW1lLCBcIig/IVxcXFxTKVwiKSwgJ2cnKSwgJycpO1xuICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmJyb3dzZXJQcmVmaXhUb0tleSA9IGJyb3dzZXJQcmVmaXhUb0tleTtcbmV4cG9ydHMuYnJvd3NlclByZWZpeFRvU3R5bGUgPSBicm93c2VyUHJlZml4VG9TdHlsZTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmV4cG9ydHMuZ2V0UHJlZml4ID0gZ2V0UHJlZml4O1xuY29uc3QgcHJlZml4ZXMgPSBbJ01veicsICdXZWJraXQnLCAnTycsICdtcyddO1xuZnVuY3Rpb24gZ2V0UHJlZml4KCkgLyo6IHN0cmluZyove1xuICB2YXIgX3dpbmRvdyRkb2N1bWVudDtcbiAgbGV0IHByb3AgLyo6IHN0cmluZyovID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAndHJhbnNmb3JtJztcbiAgLy8gRW5zdXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgdGhlcmUgaXMgYWN0dWFsbHkgYSBnbG9iYWxcbiAgLy8gYHdpbmRvd2Agb2JqXG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuICcnO1xuXG4gIC8vIElmIHdlJ3JlIGluIGEgcHNldWRvLWJyb3dzZXIgc2VydmVyLXNpZGUgZW52aXJvbm1lbnQsIHRoaXMgYWNjZXNzXG4gIC8vIHBhdGggbWF5IG5vdCBleGlzdCwgc28gYmFpbCBvdXQgaWYgaXQgZG9lc24ndC5cbiAgY29uc3Qgc3R5bGUgPSAoX3dpbmRvdyRkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCkgPT09IG51bGwgfHwgX3dpbmRvdyRkb2N1bWVudCA9PT0gdm9pZCAwIHx8IChfd2luZG93JGRvY3VtZW50ID0gX3dpbmRvdyRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpID09PSBudWxsIHx8IF93aW5kb3ckZG9jdW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3ckZG9jdW1lbnQuc3R5bGU7XG4gIGlmICghc3R5bGUpIHJldHVybiAnJztcbiAgaWYgKHByb3AgaW4gc3R5bGUpIHJldHVybiAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChicm93c2VyUHJlZml4VG9LZXkocHJvcCwgcHJlZml4ZXNbaV0pIGluIHN0eWxlKSByZXR1cm4gcHJlZml4ZXNbaV07XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuZnVuY3Rpb24gYnJvd3NlclByZWZpeFRvS2V5KHByb3AgLyo6IHN0cmluZyovLCBwcmVmaXggLyo6IHN0cmluZyovKSAvKjogc3RyaW5nKi97XG4gIHJldHVybiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgpLmNvbmNhdChrZWJhYlRvVGl0bGVDYXNlKHByb3ApKSA6IHByb3A7XG59XG5mdW5jdGlvbiBicm93c2VyUHJlZml4VG9TdHlsZShwcm9wIC8qOiBzdHJpbmcqLywgcHJlZml4IC8qOiBzdHJpbmcqLykgLyo6IHN0cmluZyove1xuICByZXR1cm4gcHJlZml4ID8gXCItXCIuY29uY2F0KHByZWZpeC50b0xvd2VyQ2FzZSgpLCBcIi1cIikuY29uY2F0KHByb3ApIDogcHJvcDtcbn1cbmZ1bmN0aW9uIGtlYmFiVG9UaXRsZUNhc2Uoc3RyIC8qOiBzdHJpbmcqLykgLyo6IHN0cmluZyove1xuICBsZXQgb3V0ID0gJyc7XG4gIGxldCBzaG91bGRDYXBpdGFsaXplID0gdHJ1ZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc2hvdWxkQ2FwaXRhbGl6ZSkge1xuICAgICAgb3V0ICs9IHN0cltpXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgc2hvdWxkQ2FwaXRhbGl6ZSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSAnLScpIHtcbiAgICAgIHNob3VsZENhcGl0YWxpemUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gc3RyW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyBEZWZhdWx0IGV4cG9ydCBpcyB0aGUgcHJlZml4IGl0c2VsZiwgbGlrZSAnTW96JywgJ1dlYmtpdCcsIGV0Y1xuLy8gTm90ZSB0aGF0IHlvdSBtYXkgaGF2ZSB0byByZS10ZXN0IGZvciBjZXJ0YWluIHRoaW5nczsgZm9yIGluc3RhbmNlLCBDaHJvbWUgNTBcbi8vIGNhbiBoYW5kbGUgdW5wcmVmaXhlZCBgdHJhbnNmb3JtYCwgYnV0IG5vdCB1bnByZWZpeGVkIGB1c2VyLXNlbGVjdGBcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IChnZXRQcmVmaXgoKSAvKjogc3RyaW5nKi8pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gbG9nO1xuLyplc2xpbnQgbm8tY29uc29sZTowKi9cbmZ1bmN0aW9uIGxvZygpIHtcbiAgaWYgKHVuZGVmaW5lZCkgY29uc29sZS5sb2coLi4uYXJndW1lbnRzKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2FuRHJhZ1ggPSBjYW5EcmFnWDtcbmV4cG9ydHMuY2FuRHJhZ1kgPSBjYW5EcmFnWTtcbmV4cG9ydHMuY3JlYXRlQ29yZURhdGEgPSBjcmVhdGVDb3JlRGF0YTtcbmV4cG9ydHMuY3JlYXRlRHJhZ2dhYmxlRGF0YSA9IGNyZWF0ZURyYWdnYWJsZURhdGE7XG5leHBvcnRzLmdldEJvdW5kUG9zaXRpb24gPSBnZXRCb3VuZFBvc2l0aW9uO1xuZXhwb3J0cy5nZXRDb250cm9sUG9zaXRpb24gPSBnZXRDb250cm9sUG9zaXRpb247XG5leHBvcnRzLnNuYXBUb0dyaWQgPSBzbmFwVG9HcmlkO1xudmFyIF9zaGltcyA9IHJlcXVpcmUoXCIuL3NoaW1zXCIpO1xudmFyIF9kb21GbnMgPSByZXF1aXJlKFwiLi9kb21GbnNcIik7XG4vKjo6IGltcG9ydCB0eXBlIERyYWdnYWJsZSBmcm9tICcuLi9EcmFnZ2FibGUnOyovXG4vKjo6IGltcG9ydCB0eXBlIHtCb3VuZHMsIENvbnRyb2xQb3NpdGlvbiwgRHJhZ2dhYmxlRGF0YSwgTW91c2VUb3VjaEV2ZW50fSBmcm9tICcuL3R5cGVzJzsqL1xuLyo6OiBpbXBvcnQgdHlwZSBEcmFnZ2FibGVDb3JlIGZyb20gJy4uL0RyYWdnYWJsZUNvcmUnOyovXG5mdW5jdGlvbiBnZXRCb3VuZFBvc2l0aW9uKGRyYWdnYWJsZSAvKjogRHJhZ2dhYmxlKi8sIHggLyo6IG51bWJlciovLCB5IC8qOiBudW1iZXIqLykgLyo6IFtudW1iZXIsIG51bWJlcl0qL3tcbiAgLy8gSWYgbm8gYm91bmRzLCBzaG9ydC1jaXJjdWl0IGFuZCBtb3ZlIG9uXG4gIGlmICghZHJhZ2dhYmxlLnByb3BzLmJvdW5kcykgcmV0dXJuIFt4LCB5XTtcblxuICAvLyBDbG9uZSBuZXcgYm91bmRzXG4gIGxldCB7XG4gICAgYm91bmRzXG4gIH0gPSBkcmFnZ2FibGUucHJvcHM7XG4gIGJvdW5kcyA9IHR5cGVvZiBib3VuZHMgPT09ICdzdHJpbmcnID8gYm91bmRzIDogY2xvbmVCb3VuZHMoYm91bmRzKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmRET01Ob2RlKGRyYWdnYWJsZSk7XG4gIGlmICh0eXBlb2YgYm91bmRzID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHtcbiAgICAgIG93bmVyRG9jdW1lbnRcbiAgICB9ID0gbm9kZTtcbiAgICBjb25zdCBvd25lcldpbmRvdyA9IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgbGV0IGJvdW5kTm9kZTtcbiAgICBpZiAoYm91bmRzID09PSAncGFyZW50Jykge1xuICAgICAgYm91bmROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3VuZE5vZGUgPSBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYm91bmRzKTtcbiAgICB9XG4gICAgaWYgKCEoYm91bmROb2RlIGluc3RhbmNlb2Ygb3duZXJXaW5kb3cuSFRNTEVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdW5kcyBzZWxlY3RvciBcIicgKyBib3VuZHMgKyAnXCIgY291bGQgbm90IGZpbmQgYW4gZWxlbWVudC4nKTtcbiAgICB9XG4gICAgY29uc3QgYm91bmROb2RlRWwgLyo6IEhUTUxFbGVtZW50Ki8gPSBib3VuZE5vZGU7IC8vIGZvciBGbG93LCBjYW4ndCBzZWVtIHRvIHJlZmluZSBjb3JyZWN0bHlcbiAgICBjb25zdCBub2RlU3R5bGUgPSBvd25lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgIGNvbnN0IGJvdW5kTm9kZVN0eWxlID0gb3duZXJXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShib3VuZE5vZGVFbCk7XG4gICAgLy8gQ29tcHV0ZSBib3VuZHMuIFRoaXMgaXMgYSBwYWluIHdpdGggcGFkZGluZyBhbmQgb2Zmc2V0cyBidXQgdGhpcyBnZXRzIGl0IGV4YWN0bHkgcmlnaHQuXG4gICAgYm91bmRzID0ge1xuICAgICAgbGVmdDogLW5vZGUub2Zmc2V0TGVmdCArICgwLCBfc2hpbXMuaW50KShib3VuZE5vZGVTdHlsZS5wYWRkaW5nTGVmdCkgKyAoMCwgX3NoaW1zLmludCkobm9kZVN0eWxlLm1hcmdpbkxlZnQpLFxuICAgICAgdG9wOiAtbm9kZS5vZmZzZXRUb3AgKyAoMCwgX3NoaW1zLmludCkoYm91bmROb2RlU3R5bGUucGFkZGluZ1RvcCkgKyAoMCwgX3NoaW1zLmludCkobm9kZVN0eWxlLm1hcmdpblRvcCksXG4gICAgICByaWdodDogKDAsIF9kb21GbnMuaW5uZXJXaWR0aCkoYm91bmROb2RlRWwpIC0gKDAsIF9kb21GbnMub3V0ZXJXaWR0aCkobm9kZSkgLSBub2RlLm9mZnNldExlZnQgKyAoMCwgX3NoaW1zLmludCkoYm91bmROb2RlU3R5bGUucGFkZGluZ1JpZ2h0KSAtICgwLCBfc2hpbXMuaW50KShub2RlU3R5bGUubWFyZ2luUmlnaHQpLFxuICAgICAgYm90dG9tOiAoMCwgX2RvbUZucy5pbm5lckhlaWdodCkoYm91bmROb2RlRWwpIC0gKDAsIF9kb21GbnMub3V0ZXJIZWlnaHQpKG5vZGUpIC0gbm9kZS5vZmZzZXRUb3AgKyAoMCwgX3NoaW1zLmludCkoYm91bmROb2RlU3R5bGUucGFkZGluZ0JvdHRvbSkgLSAoMCwgX3NoaW1zLmludCkobm9kZVN0eWxlLm1hcmdpbkJvdHRvbSlcbiAgICB9O1xuICB9XG5cbiAgLy8gS2VlcCB4IGFuZCB5IGJlbG93IHJpZ2h0IGFuZCBib3R0b20gbGltaXRzLi4uXG4gIGlmICgoMCwgX3NoaW1zLmlzTnVtKShib3VuZHMucmlnaHQpKSB4ID0gTWF0aC5taW4oeCwgYm91bmRzLnJpZ2h0KTtcbiAgaWYgKCgwLCBfc2hpbXMuaXNOdW0pKGJvdW5kcy5ib3R0b20pKSB5ID0gTWF0aC5taW4oeSwgYm91bmRzLmJvdHRvbSk7XG5cbiAgLy8gQnV0IGFib3ZlIGxlZnQgYW5kIHRvcCBsaW1pdHMuXG4gIGlmICgoMCwgX3NoaW1zLmlzTnVtKShib3VuZHMubGVmdCkpIHggPSBNYXRoLm1heCh4LCBib3VuZHMubGVmdCk7XG4gIGlmICgoMCwgX3NoaW1zLmlzTnVtKShib3VuZHMudG9wKSkgeSA9IE1hdGgubWF4KHksIGJvdW5kcy50b3ApO1xuICByZXR1cm4gW3gsIHldO1xufVxuZnVuY3Rpb24gc25hcFRvR3JpZChncmlkIC8qOiBbbnVtYmVyLCBudW1iZXJdKi8sIHBlbmRpbmdYIC8qOiBudW1iZXIqLywgcGVuZGluZ1kgLyo6IG51bWJlciovKSAvKjogW251bWJlciwgbnVtYmVyXSove1xuICBjb25zdCB4ID0gTWF0aC5yb3VuZChwZW5kaW5nWCAvIGdyaWRbMF0pICogZ3JpZFswXTtcbiAgY29uc3QgeSA9IE1hdGgucm91bmQocGVuZGluZ1kgLyBncmlkWzFdKSAqIGdyaWRbMV07XG4gIHJldHVybiBbeCwgeV07XG59XG5mdW5jdGlvbiBjYW5EcmFnWChkcmFnZ2FibGUgLyo6IERyYWdnYWJsZSovKSAvKjogYm9vbGVhbiove1xuICByZXR1cm4gZHJhZ2dhYmxlLnByb3BzLmF4aXMgPT09ICdib3RoJyB8fCBkcmFnZ2FibGUucHJvcHMuYXhpcyA9PT0gJ3gnO1xufVxuZnVuY3Rpb24gY2FuRHJhZ1koZHJhZ2dhYmxlIC8qOiBEcmFnZ2FibGUqLykgLyo6IGJvb2xlYW4qL3tcbiAgcmV0dXJuIGRyYWdnYWJsZS5wcm9wcy5heGlzID09PSAnYm90aCcgfHwgZHJhZ2dhYmxlLnByb3BzLmF4aXMgPT09ICd5Jztcbn1cblxuLy8gR2V0IHt4LCB5fSBwb3NpdGlvbnMgZnJvbSBldmVudC5cbmZ1bmN0aW9uIGdldENvbnRyb2xQb3NpdGlvbihlIC8qOiBNb3VzZVRvdWNoRXZlbnQqLywgdG91Y2hJZGVudGlmaWVyIC8qOiA/bnVtYmVyKi8sIGRyYWdnYWJsZUNvcmUgLyo6IERyYWdnYWJsZUNvcmUqLykgLyo6ID9Db250cm9sUG9zaXRpb24qL3tcbiAgY29uc3QgdG91Y2hPYmogPSB0eXBlb2YgdG91Y2hJZGVudGlmaWVyID09PSAnbnVtYmVyJyA/ICgwLCBfZG9tRm5zLmdldFRvdWNoKShlLCB0b3VjaElkZW50aWZpZXIpIDogbnVsbDtcbiAgaWYgKHR5cGVvZiB0b3VjaElkZW50aWZpZXIgPT09ICdudW1iZXInICYmICF0b3VjaE9iaikgcmV0dXJuIG51bGw7IC8vIG5vdCB0aGUgcmlnaHQgdG91Y2hcbiAgY29uc3Qgbm9kZSA9IGZpbmRET01Ob2RlKGRyYWdnYWJsZUNvcmUpO1xuICAvLyBVc2VyIGNhbiBwcm92aWRlIGFuIG9mZnNldFBhcmVudCBpZiBkZXNpcmVkLlxuICBjb25zdCBvZmZzZXRQYXJlbnQgPSBkcmFnZ2FibGVDb3JlLnByb3BzLm9mZnNldFBhcmVudCB8fCBub2RlLm9mZnNldFBhcmVudCB8fCBub2RlLm93bmVyRG9jdW1lbnQuYm9keTtcbiAgcmV0dXJuICgwLCBfZG9tRm5zLm9mZnNldFhZRnJvbVBhcmVudCkodG91Y2hPYmogfHwgZSwgb2Zmc2V0UGFyZW50LCBkcmFnZ2FibGVDb3JlLnByb3BzLnNjYWxlKTtcbn1cblxuLy8gQ3JlYXRlIGFuIGRhdGEgb2JqZWN0IGV4cG9zZWQgYnkgPERyYWdnYWJsZUNvcmU+J3MgZXZlbnRzXG5mdW5jdGlvbiBjcmVhdGVDb3JlRGF0YShkcmFnZ2FibGUgLyo6IERyYWdnYWJsZUNvcmUqLywgeCAvKjogbnVtYmVyKi8sIHkgLyo6IG51bWJlciovKSAvKjogRHJhZ2dhYmxlRGF0YSove1xuICBjb25zdCBpc1N0YXJ0ID0gISgwLCBfc2hpbXMuaXNOdW0pKGRyYWdnYWJsZS5sYXN0WCk7XG4gIGNvbnN0IG5vZGUgPSBmaW5kRE9NTm9kZShkcmFnZ2FibGUpO1xuICBpZiAoaXNTdGFydCkge1xuICAgIC8vIElmIHRoaXMgaXMgb3VyIGZpcnN0IG1vdmUsIHVzZSB0aGUgeCBhbmQgeSBhcyBsYXN0IGNvb3Jkcy5cbiAgICByZXR1cm4ge1xuICAgICAgbm9kZSxcbiAgICAgIGRlbHRhWDogMCxcbiAgICAgIGRlbHRhWTogMCxcbiAgICAgIGxhc3RYOiB4LFxuICAgICAgbGFzdFk6IHksXG4gICAgICB4LFxuICAgICAgeVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlIGNhbGN1bGF0ZSBwcm9wZXIgdmFsdWVzLlxuICAgIHJldHVybiB7XG4gICAgICBub2RlLFxuICAgICAgZGVsdGFYOiB4IC0gZHJhZ2dhYmxlLmxhc3RYLFxuICAgICAgZGVsdGFZOiB5IC0gZHJhZ2dhYmxlLmxhc3RZLFxuICAgICAgbGFzdFg6IGRyYWdnYWJsZS5sYXN0WCxcbiAgICAgIGxhc3RZOiBkcmFnZ2FibGUubGFzdFksXG4gICAgICB4LFxuICAgICAgeVxuICAgIH07XG4gIH1cbn1cblxuLy8gQ3JlYXRlIGFuIGRhdGEgZXhwb3NlZCBieSA8RHJhZ2dhYmxlPidzIGV2ZW50c1xuZnVuY3Rpb24gY3JlYXRlRHJhZ2dhYmxlRGF0YShkcmFnZ2FibGUgLyo6IERyYWdnYWJsZSovLCBjb3JlRGF0YSAvKjogRHJhZ2dhYmxlRGF0YSovKSAvKjogRHJhZ2dhYmxlRGF0YSove1xuICBjb25zdCBzY2FsZSA9IGRyYWdnYWJsZS5wcm9wcy5zY2FsZTtcbiAgcmV0dXJuIHtcbiAgICBub2RlOiBjb3JlRGF0YS5ub2RlLFxuICAgIHg6IGRyYWdnYWJsZS5zdGF0ZS54ICsgY29yZURhdGEuZGVsdGFYIC8gc2NhbGUsXG4gICAgeTogZHJhZ2dhYmxlLnN0YXRlLnkgKyBjb3JlRGF0YS5kZWx0YVkgLyBzY2FsZSxcbiAgICBkZWx0YVg6IGNvcmVEYXRhLmRlbHRhWCAvIHNjYWxlLFxuICAgIGRlbHRhWTogY29yZURhdGEuZGVsdGFZIC8gc2NhbGUsXG4gICAgbGFzdFg6IGRyYWdnYWJsZS5zdGF0ZS54LFxuICAgIGxhc3RZOiBkcmFnZ2FibGUuc3RhdGUueVxuICB9O1xufVxuXG4vLyBBIGxvdCBmYXN0ZXIgdGhhbiBzdHJpbmdpZnkvcGFyc2VcbmZ1bmN0aW9uIGNsb25lQm91bmRzKGJvdW5kcyAvKjogQm91bmRzKi8pIC8qOiBCb3VuZHMqL3tcbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiBib3VuZHMubGVmdCxcbiAgICB0b3A6IGJvdW5kcy50b3AsXG4gICAgcmlnaHQ6IGJvdW5kcy5yaWdodCxcbiAgICBib3R0b206IGJvdW5kcy5ib3R0b21cbiAgfTtcbn1cbmZ1bmN0aW9uIGZpbmRET01Ob2RlKGRyYWdnYWJsZSAvKjogRHJhZ2dhYmxlIHwgRHJhZ2dhYmxlQ29yZSovKSAvKjogSFRNTEVsZW1lbnQqL3tcbiAgY29uc3Qgbm9kZSA9IGRyYWdnYWJsZS5maW5kRE9NTm9kZSgpO1xuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJzxEcmFnZ2FibGVDb3JlPjogVW5tb3VudGVkIGR1cmluZyBldmVudCEnKTtcbiAgfVxuICAvLyAkRmxvd0lnbm9yZSB3ZSBjYW4ndCBhc3NlcnQgb24gSFRNTEVsZW1lbnQgZHVlIHRvIHRlc3RzLi4uIEZJWE1FXG4gIHJldHVybiBub2RlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kb250U2V0TWUgPSBkb250U2V0TWU7XG5leHBvcnRzLmZpbmRJbkFycmF5ID0gZmluZEluQXJyYXk7XG5leHBvcnRzLmludCA9IGludDtcbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5leHBvcnRzLmlzTnVtID0gaXNOdW07XG4vLyBAY3JlZGl0cyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9yb2dvemhuaWtvZmYvYTQzY2ZlZDI3YzQxZTRlNjhjZGNcbmZ1bmN0aW9uIGZpbmRJbkFycmF5KGFycmF5IC8qOiBBcnJheTxhbnk+IHwgVG91Y2hMaXN0Ki8sIGNhbGxiYWNrIC8qOiBGdW5jdGlvbiovKSAvKjogYW55Ki97XG4gIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChjYWxsYmFjay5hcHBseShjYWxsYmFjaywgW2FycmF5W2ldLCBpLCBhcnJheV0pKSByZXR1cm4gYXJyYXlbaV07XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuYyAvKjogYW55Ki8pIC8qOiBib29sZWFuICVjaGVja3MqL3tcbiAgLy8gJEZsb3dJZ25vcmVbbWV0aG9kLXVuYmluZGluZ11cbiAgcmV0dXJuIHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmdW5jKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cbmZ1bmN0aW9uIGlzTnVtKG51bSAvKjogYW55Ki8pIC8qOiBib29sZWFuICVjaGVja3MqL3tcbiAgcmV0dXJuIHR5cGVvZiBudW0gPT09ICdudW1iZXInICYmICFpc05hTihudW0pO1xufVxuZnVuY3Rpb24gaW50KGEgLyo6IHN0cmluZyovKSAvKjogbnVtYmVyKi97XG4gIHJldHVybiBwYXJzZUludChhLCAxMCk7XG59XG5mdW5jdGlvbiBkb250U2V0TWUocHJvcHMgLyo6IE9iamVjdCovLCBwcm9wTmFtZSAvKjogc3RyaW5nKi8sIGNvbXBvbmVudE5hbWUgLyo6IHN0cmluZyovKSAvKjogP0Vycm9yKi97XG4gIGlmIChwcm9wc1twcm9wTmFtZV0pIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFwiSW52YWxpZCBwcm9wIFwiLmNvbmNhdChwcm9wTmFtZSwgXCIgcGFzc2VkIHRvIFwiKS5jb25jYXQoY29tcG9uZW50TmFtZSwgXCIgLSBkbyBub3Qgc2V0IHRoaXMsIHNldCBpdCBvbiB0aGUgY2hpbGQuXCIpKTtcbiAgfVxufSIsImZ1bmN0aW9uIHIoZSl7dmFyIHQsZixuPVwiXCI7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGV8fFwibnVtYmVyXCI9PXR5cGVvZiBlKW4rPWU7ZWxzZSBpZihcIm9iamVjdFwiPT10eXBlb2YgZSlpZihBcnJheS5pc0FycmF5KGUpKWZvcih0PTA7dDxlLmxlbmd0aDt0KyspZVt0XSYmKGY9cihlW3RdKSkmJihuJiYobis9XCIgXCIpLG4rPWYpO2Vsc2UgZm9yKHQgaW4gZSllW3RdJiYobiYmKG4rPVwiIFwiKSxuKz10KTtyZXR1cm4gbn1leHBvcnQgZnVuY3Rpb24gY2xzeCgpe2Zvcih2YXIgZSx0LGY9MCxuPVwiXCI7Zjxhcmd1bWVudHMubGVuZ3RoOykoZT1hcmd1bWVudHNbZisrXSkmJih0PXIoZSkpJiYobiYmKG4rPVwiIFwiKSxuKz10KTtyZXR1cm4gbn1leHBvcnQgZGVmYXVsdCBjbHN4OyIsIi8qIGdsb2JhbCBNYXA6cmVhZG9ubHksIFNldDpyZWFkb25seSwgQXJyYXlCdWZmZXI6cmVhZG9ubHkgKi9cblxudmFyIGhhc0VsZW1lbnRUeXBlID0gdHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnO1xudmFyIGhhc01hcCA9IHR5cGVvZiBNYXAgPT09ICdmdW5jdGlvbic7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBoYXNBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiAhIUFycmF5QnVmZmVyLmlzVmlldztcblxuLy8gTm90ZTogV2UgKipkb24ndCoqIG5lZWQgYGVudkhhc0JpZ0ludDY0QXJyYXlgIGluIGZkZSBlczYvaW5kZXguanNcblxuZnVuY3Rpb24gZXF1YWwoYSwgYikge1xuICAvLyBTVEFSVDogZmFzdC1kZWVwLWVxdWFsIGVzNi9pbmRleC5qcyAzLjEuM1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKGEgJiYgYiAmJiB0eXBlb2YgYSA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PSAnb2JqZWN0Jykge1xuICAgIGlmIChhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgbGVuZ3RoLCBpLCBrZXlzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgICAgaWYgKCFlcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU1RBUlQ6IE1vZGlmaWNhdGlvbnM6XG4gICAgLy8gMS4gRXh0cmEgYGhhczxUeXBlPiAmJmAgaGVscGVycyBpbiBpbml0aWFsIGNvbmRpdGlvbiBhbGxvdyBlczYgY29kZVxuICAgIC8vICAgIHRvIGNvLWV4aXN0IHdpdGggZXM1LlxuICAgIC8vIDIuIFJlcGxhY2UgYGZvciBvZmAgd2l0aCBlczUgY29tcGxpYW50IGl0ZXJhdGlvbiB1c2luZyBgZm9yYC5cbiAgICAvLyAgICBCYXNpY2FsbHksIHRha2U6XG4gICAgLy9cbiAgICAvLyAgICBgYGBqc1xuICAgIC8vICAgIGZvciAoaSBvZiBhLmVudHJpZXMoKSlcbiAgICAvLyAgICAgIGlmICghYi5oYXMoaVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICBgYGBcbiAgICAvL1xuICAgIC8vICAgIC4uLiBhbmQgY29udmVydCB0bzpcbiAgICAvL1xuICAgIC8vICAgIGBgYGpzXG4gICAgLy8gICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAvLyAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgIC8vICAgICAgaWYgKCFiLmhhcyhpLnZhbHVlWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgIGBgYFxuICAgIC8vXG4gICAgLy8gICAgKipOb3RlKio6IGBpYCBhY2Nlc3Mgc3dpdGNoZXMgdG8gYGkudmFsdWVgLlxuICAgIHZhciBpdDtcbiAgICBpZiAoaGFzTWFwICYmIChhIGluc3RhbmNlb2YgTWFwKSAmJiAoYiBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWVxdWFsKGkudmFsdWVbMV0sIGIuZ2V0KGkudmFsdWVbMF0pKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NldCAmJiAoYSBpbnN0YW5jZW9mIFNldCkgJiYgKGIgaW5zdGFuY2VvZiBTZXQpKSB7XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRU5EOiBNb2RpZmljYXRpb25zXG5cbiAgICBpZiAoaGFzQXJyYXlCdWZmZXIgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGEpICYmIEFycmF5QnVmZmVyLmlzVmlldyhiKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgLy8gU1RBUlQ6IE1vZGlmaWNhdGlvbnM6XG4gICAgLy8gQXBwbHkgZ3VhcmRzIGZvciBgT2JqZWN0LmNyZWF0ZShudWxsKWAgaGFuZGxpbmcuIFNlZTpcbiAgICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3JtaWRhYmxlTGFicy9yZWFjdC1mYXN0LWNvbXBhcmUvaXNzdWVzLzY0XG4gICAgLy8gLSBodHRwczovL2dpdGh1Yi5jb20vZXBvYmVyZXpraW4vZmFzdC1kZWVwLWVxdWFsL2lzc3Vlcy80OVxuICAgIGlmIChhLnZhbHVlT2YgIT09IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZiAmJiB0eXBlb2YgYS52YWx1ZU9mID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBiLnZhbHVlT2YgPT09ICdmdW5jdGlvbicpIHJldHVybiBhLnZhbHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7XG4gICAgaWYgKGEudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgJiYgdHlwZW9mIGEudG9TdHJpbmcgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGIudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHJldHVybiBhLnRvU3RyaW5nKCkgPT09IGIudG9TdHJpbmcoKTtcbiAgICAvLyBFTkQ6IE1vZGlmaWNhdGlvbnNcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gRU5EOiBmYXN0LWRlZXAtZXF1YWxcblxuICAgIC8vIFNUQVJUOiByZWFjdC1mYXN0LWNvbXBhcmVcbiAgICAvLyBjdXN0b20gaGFuZGxpbmcgZm9yIERPTSBlbGVtZW50c1xuICAgIGlmIChoYXNFbGVtZW50VHlwZSAmJiBhIGluc3RhbmNlb2YgRWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gY3VzdG9tIGhhbmRsaW5nIGZvciBSZWFjdC9QcmVhY3RcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIGlmICgoa2V5c1tpXSA9PT0gJ19vd25lcicgfHwga2V5c1tpXSA9PT0gJ19fdicgfHwga2V5c1tpXSA9PT0gJ19fbycpICYmIGEuJCR0eXBlb2YpIHtcbiAgICAgICAgLy8gUmVhY3Qtc3BlY2lmaWM6IGF2b2lkIHRyYXZlcnNpbmcgUmVhY3QgZWxlbWVudHMnIF9vd25lclxuICAgICAgICAvLyBQcmVhY3Qtc3BlY2lmaWM6IGF2b2lkIHRyYXZlcnNpbmcgUHJlYWN0IGVsZW1lbnRzJyBfX3YgYW5kIF9fb1xuICAgICAgICAvLyAgICBfX3YgPSAkX29yaWdpbmFsIC8gJF92bm9kZVxuICAgICAgICAvLyAgICBfX28gPSAkX293bmVyXG4gICAgICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgY29udGFpbiBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCBhcmUgbm90IG5lZWRlZCB3aGVuXG4gICAgICAgIC8vIGNvbXBhcmluZyB0aGUgYWN0dWFsIGVsZW1lbnRzIChhbmQgbm90IHRoZWlyIG93bmVycylcbiAgICAgICAgLy8gLiQkdHlwZW9mIGFuZCAuX3N0b3JlIG9uIGp1c3QgcmVhc29uYWJsZSBtYXJrZXJzIG9mIGVsZW1lbnRzXG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGFsbCBvdGhlciBwcm9wZXJ0aWVzIHNob3VsZCBiZSB0cmF2ZXJzZWQgYXMgdXN1YWxcbiAgICAgIGlmICghZXF1YWwoYVtrZXlzW2ldXSwgYltrZXlzW2ldXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRU5EOiByZWFjdC1mYXN0LWNvbXBhcmVcblxuICAgIC8vIFNUQVJUOiBmYXN0LWRlZXAtZXF1YWxcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG59XG4vLyBlbmQgZmFzdC1kZWVwLWVxdWFsXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNFcXVhbChhLCBiKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVxdWFsKGEsIGIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoKGVycm9yLm1lc3NhZ2UgfHwgJycpLm1hdGNoKC9zdGFja3xyZWN1cnNpb24vaSkpKSB7XG4gICAgICAvLyB3YXJuIG9uIGNpcmN1bGFyIHJlZmVyZW5jZXMsIGRvbid0IGNyYXNoXG4gICAgICAvLyBicm93c2VycyBnaXZlIHRoaXMgZGlmZmVyZW50IGVycm9ycyBuYW1lIGFuZCBtZXNzYWdlczpcbiAgICAgIC8vIGNocm9tZS9zYWZhcmk6IFwiUmFuZ2VFcnJvclwiLCBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCJcbiAgICAgIC8vIGZpcmVmb3g6IFwiSW50ZXJuYWxFcnJvclwiLCB0b28gbXVjaCByZWN1cnNpb25cIlxuICAgICAgLy8gZWRnZTogXCJFcnJvclwiLCBcIk91dCBvZiBzdGFjayBzcGFjZVwiXG4gICAgICBjb25zb2xlLndhcm4oJ3JlYWN0LWZhc3QtY29tcGFyZSBjYW5ub3QgaGFuZGxlIGNpcmN1bGFyIHJlZnMnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gc29tZSBvdGhlciBlcnJvci4gd2Ugc2hvdWxkIGRlZmluaXRlbHkga25vdyBhYm91dCB0aGVzZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJ2ZvY3VzLWxvY2svY29uc3RhbnRzJztcbmltcG9ydCB7IGlubGluZVByb3AgfSBmcm9tICcuL3V0aWwnO1xudmFyIEF1dG9Gb2N1c0luc2lkZSA9IGZ1bmN0aW9uIEF1dG9Gb2N1c0luc2lkZShfcmVmKSB7XG4gIHZhciBfcmVmJGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICBkaXNhYmxlZCA9IF9yZWYkZGlzYWJsZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRkaXNhYmxlZCxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgX3JlZiRjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBjbGFzc05hbWUgPSBfcmVmJGNsYXNzTmFtZSA9PT0gdm9pZCAwID8gdW5kZWZpbmVkIDogX3JlZiRjbGFzc05hbWU7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgaW5saW5lUHJvcChjb25zdGFudHMuRk9DVVNfQVVUTywgIWRpc2FibGVkKSwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0pLCBjaGlsZHJlbik7XG59O1xuQXV0b0ZvY3VzSW5zaWRlLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBBdXRvRm9jdXNJbnNpZGU7IiwiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGb2N1c0xvY2tVSSBmcm9tICcuL0xvY2snO1xuaW1wb3J0IEZvY3VzVHJhcCBmcm9tICcuL1RyYXAnO1xudmFyIEZvY3VzTG9ja0NvbWJpbmF0aW9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRm9jdXNMb2NrVUlDb21iaW5hdGlvbihwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0xvY2tVSSwgX2V4dGVuZHMoe1xuICAgIHNpZGVDYXI6IEZvY3VzVHJhcCxcbiAgICByZWY6IHJlZlxuICB9LCBwcm9wcykpO1xufSk7XG52YXIgX3JlZiA9IEZvY3VzTG9ja1VJLnByb3BUeXBlcyB8fCB7fSxcbiAgc2lkZUNhciA9IF9yZWYuc2lkZUNhcixcbiAgcHJvcFR5cGVzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgW1wic2lkZUNhclwiXSk7XG5Gb2N1c0xvY2tDb21iaW5hdGlvbi5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBwcm9wVHlwZXMgOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEZvY3VzTG9ja0NvbWJpbmF0aW9uOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5leHBvcnQgdmFyIGhpZGRlbkd1YXJkID0ge1xuICB3aWR0aDogJzFweCcsXG4gIGhlaWdodDogJzBweCcsXG4gIHBhZGRpbmc6IDAsXG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgcG9zaXRpb246ICdmaXhlZCcsXG4gIHRvcDogJzFweCcsXG4gIGxlZnQ6ICcxcHgnXG59O1xudmFyIEluRm9jdXNHdWFyZCA9IGZ1bmN0aW9uIEluRm9jdXNHdWFyZChfcmVmKSB7XG4gIHZhciBfcmVmJGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBjaGlsZHJlbiA9IF9yZWYkY2hpbGRyZW4gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJGNoaWxkcmVuO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiZ3VhcmQtZmlyc3RcIixcbiAgICBcImRhdGEtZm9jdXMtZ3VhcmRcIjogdHJ1ZSxcbiAgICBcImRhdGEtZm9jdXMtYXV0by1ndWFyZFwiOiB0cnVlLFxuICAgIHN0eWxlOiBoaWRkZW5HdWFyZFxuICB9KSwgY2hpbGRyZW4sIGNoaWxkcmVuICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiZ3VhcmQtbGFzdFwiLFxuICAgIFwiZGF0YS1mb2N1cy1ndWFyZFwiOiB0cnVlLFxuICAgIFwiZGF0YS1mb2N1cy1hdXRvLWd1YXJkXCI6IHRydWUsXG4gICAgc3R5bGU6IGhpZGRlbkd1YXJkXG4gIH0pKTtcbn07XG5JbkZvY3VzR3VhcmQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGVcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEluRm9jdXNHdWFyZDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnZm9jdXMtbG9jay9jb25zdGFudHMnO1xuaW1wb3J0IHsgaW5saW5lUHJvcCB9IGZyb20gJy4vdXRpbCc7XG52YXIgRnJlZUZvY3VzSW5zaWRlID0gZnVuY3Rpb24gRnJlZUZvY3VzSW5zaWRlKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBpbmxpbmVQcm9wKGNvbnN0YW50cy5GT0NVU19BTExPVywgdHJ1ZSksIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9KSwgY2hpbGRyZW4pO1xufTtcbkZyZWVGb2N1c0luc2lkZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEZyZWVGb2N1c0luc2lkZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IG5vZGUsIGJvb2wsIHN0cmluZywgYW55LCBhcnJheU9mLCBvbmVPZlR5cGUsIG9iamVjdCwgZnVuYyB9IGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJ2ZvY3VzLWxvY2svY29uc3RhbnRzJztcbmltcG9ydCB7IHVzZU1lcmdlUmVmcyB9IGZyb20gJ3VzZS1jYWxsYmFjay1yZWYnO1xuaW1wb3J0IHsgaGlkZGVuR3VhcmQgfSBmcm9tICcuL0ZvY3VzR3VhcmQnO1xuaW1wb3J0IHsgbWVkaXVtRm9jdXMsIG1lZGl1bUJsdXIsIG1lZGl1bVNpZGVjYXIgfSBmcm9tICcuL21lZGl1bSc7XG5pbXBvcnQgeyBmb2N1c1Njb3BlIH0gZnJvbSAnLi9zY29wZSc7XG52YXIgZW1wdHlBcnJheSA9IFtdO1xudmFyIEZvY3VzTG9jayA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZvY3VzTG9ja1VJKHByb3BzLCBwYXJlbnRSZWYpIHtcbiAgdmFyIF9leHRlbmRzMjtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgcmVhbE9ic2VydmVkID0gX1JlYWN0JHVzZVN0YXRlWzBdLFxuICAgIHNldE9ic2VydmVkID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuICB2YXIgb2JzZXJ2ZWQgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGlzQWN0aXZlID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdmFyIG9yaWdpbmFsRm9jdXNlZEVsZW1lbnQgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUyID0gUmVhY3QudXNlU3RhdGUoe30pLFxuICAgIHVwZGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIF9wcm9wcyRkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIGRpc2FibGVkID0gX3Byb3BzJGRpc2FibGVkID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlZCxcbiAgICBfcHJvcHMkbm9Gb2N1c0d1YXJkcyA9IHByb3BzLm5vRm9jdXNHdWFyZHMsXG4gICAgbm9Gb2N1c0d1YXJkcyA9IF9wcm9wcyRub0ZvY3VzR3VhcmRzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRub0ZvY3VzR3VhcmRzLFxuICAgIF9wcm9wcyRwZXJzaXN0ZW50Rm9jdSA9IHByb3BzLnBlcnNpc3RlbnRGb2N1cyxcbiAgICBwZXJzaXN0ZW50Rm9jdXMgPSBfcHJvcHMkcGVyc2lzdGVudEZvY3UgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHBlcnNpc3RlbnRGb2N1LFxuICAgIF9wcm9wcyRjcm9zc0ZyYW1lID0gcHJvcHMuY3Jvc3NGcmFtZSxcbiAgICBjcm9zc0ZyYW1lID0gX3Byb3BzJGNyb3NzRnJhbWUgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkY3Jvc3NGcmFtZSxcbiAgICBfcHJvcHMkYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgIGF1dG9Gb2N1cyA9IF9wcm9wcyRhdXRvRm9jdXMgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkYXV0b0ZvY3VzLFxuICAgIGFsbG93VGV4dFNlbGVjdGlvbiA9IHByb3BzLmFsbG93VGV4dFNlbGVjdGlvbixcbiAgICBncm91cCA9IHByb3BzLmdyb3VwLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICB3aGl0ZUxpc3QgPSBwcm9wcy53aGl0ZUxpc3QsXG4gICAgaGFzUG9zaXRpdmVJbmRpY2VzID0gcHJvcHMuaGFzUG9zaXRpdmVJbmRpY2VzLFxuICAgIF9wcm9wcyRzaGFyZHMgPSBwcm9wcy5zaGFyZHMsXG4gICAgc2hhcmRzID0gX3Byb3BzJHNoYXJkcyA9PT0gdm9pZCAwID8gZW1wdHlBcnJheSA6IF9wcm9wcyRzaGFyZHMsXG4gICAgX3Byb3BzJGFzID0gcHJvcHMuYXMsXG4gICAgQ29udGFpbmVyID0gX3Byb3BzJGFzID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRhcyxcbiAgICBfcHJvcHMkbG9ja1Byb3BzID0gcHJvcHMubG9ja1Byb3BzLFxuICAgIGNvbnRhaW5lclByb3BzID0gX3Byb3BzJGxvY2tQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkbG9ja1Byb3BzLFxuICAgIFNpZGVDYXIgPSBwcm9wcy5zaWRlQ2FyLFxuICAgIF9wcm9wcyRyZXR1cm5Gb2N1cyA9IHByb3BzLnJldHVybkZvY3VzLFxuICAgIHNob3VsZFJldHVybkZvY3VzID0gX3Byb3BzJHJldHVybkZvY3VzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRyZXR1cm5Gb2N1cyxcbiAgICBmb2N1c09wdGlvbnMgPSBwcm9wcy5mb2N1c09wdGlvbnMsXG4gICAgb25BY3RpdmF0aW9uQ2FsbGJhY2sgPSBwcm9wcy5vbkFjdGl2YXRpb24sXG4gICAgb25EZWFjdGl2YXRpb25DYWxsYmFjayA9IHByb3BzLm9uRGVhY3RpdmF0aW9uO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKHt9KSxcbiAgICBpZCA9IF9SZWFjdCR1c2VTdGF0ZTNbMF07XG4gIHZhciBvbkFjdGl2YXRpb24gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBjYXB0dXJlRm9jdXNSZXN0b3JlID0gX3JlZi5jYXB0dXJlRm9jdXNSZXN0b3JlO1xuICAgIGlmICghb3JpZ2luYWxGb2N1c2VkRWxlbWVudC5jdXJyZW50KSB7XG4gICAgICB2YXIgX2RvY3VtZW50O1xuICAgICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSAoX2RvY3VtZW50ID0gZG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIG9yaWdpbmFsRm9jdXNlZEVsZW1lbnQuY3VycmVudCA9IGFjdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoYWN0aXZlRWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICBvcmlnaW5hbEZvY3VzZWRFbGVtZW50LmN1cnJlbnQgPSBjYXB0dXJlRm9jdXNSZXN0b3JlKGFjdGl2ZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob2JzZXJ2ZWQuY3VycmVudCAmJiBvbkFjdGl2YXRpb25DYWxsYmFjaykge1xuICAgICAgb25BY3RpdmF0aW9uQ2FsbGJhY2sob2JzZXJ2ZWQuY3VycmVudCk7XG4gICAgfVxuICAgIGlzQWN0aXZlLmN1cnJlbnQgPSB0cnVlO1xuICAgIHVwZGF0ZSgpO1xuICB9LCBbb25BY3RpdmF0aW9uQ2FsbGJhY2tdKTtcbiAgdmFyIG9uRGVhY3RpdmF0aW9uID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGlzQWN0aXZlLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBpZiAob25EZWFjdGl2YXRpb25DYWxsYmFjaykge1xuICAgICAgb25EZWFjdGl2YXRpb25DYWxsYmFjayhvYnNlcnZlZC5jdXJyZW50KTtcbiAgICB9XG4gICAgdXBkYXRlKCk7XG4gIH0sIFtvbkRlYWN0aXZhdGlvbkNhbGxiYWNrXSk7XG4gIHZhciByZXR1cm5Gb2N1cyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChhbGxvd0RlZmVyKSB7XG4gICAgdmFyIGZvY3VzUmVzdG9yZSA9IG9yaWdpbmFsRm9jdXNlZEVsZW1lbnQuY3VycmVudDtcbiAgICBpZiAoZm9jdXNSZXN0b3JlKSB7XG4gICAgICB2YXIgcmV0dXJuRm9jdXNUbyA9ICh0eXBlb2YgZm9jdXNSZXN0b3JlID09PSAnZnVuY3Rpb24nID8gZm9jdXNSZXN0b3JlKCkgOiBmb2N1c1Jlc3RvcmUpIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICB2YXIgaG93VG9SZXR1cm5Gb2N1cyA9IHR5cGVvZiBzaG91bGRSZXR1cm5Gb2N1cyA9PT0gJ2Z1bmN0aW9uJyA/IHNob3VsZFJldHVybkZvY3VzKHJldHVybkZvY3VzVG8pIDogc2hvdWxkUmV0dXJuRm9jdXM7XG4gICAgICBpZiAoaG93VG9SZXR1cm5Gb2N1cykge1xuICAgICAgICB2YXIgcmV0dXJuRm9jdXNPcHRpb25zID0gdHlwZW9mIGhvd1RvUmV0dXJuRm9jdXMgPT09ICdvYmplY3QnID8gaG93VG9SZXR1cm5Gb2N1cyA6IHVuZGVmaW5lZDtcbiAgICAgICAgb3JpZ2luYWxGb2N1c2VkRWxlbWVudC5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKGFsbG93RGVmZXIpIHtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5Gb2N1c1RvLmZvY3VzKHJldHVybkZvY3VzT3B0aW9ucyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuRm9jdXNUby5mb2N1cyhyZXR1cm5Gb2N1c09wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCBbc2hvdWxkUmV0dXJuRm9jdXNdKTtcbiAgdmFyIG9uRm9jdXMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoaXNBY3RpdmUuY3VycmVudCkge1xuICAgICAgbWVkaXVtRm9jdXMudXNlTWVkaXVtKGV2ZW50KTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgdmFyIG9uQmx1ciA9IG1lZGl1bUJsdXIudXNlTWVkaXVtO1xuICB2YXIgc2V0T2JzZXJ2ZU5vZGUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3T2JzZXJ2ZWQpIHtcbiAgICBpZiAob2JzZXJ2ZWQuY3VycmVudCAhPT0gbmV3T2JzZXJ2ZWQpIHtcbiAgICAgIG9ic2VydmVkLmN1cnJlbnQgPSBuZXdPYnNlcnZlZDtcbiAgICAgIHNldE9ic2VydmVkKG5ld09ic2VydmVkKTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAodHlwZW9mIGFsbG93VGV4dFNlbGVjdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignUmVhY3QtRm9jdXMtTG9jazogYWxsb3dUZXh0U2VsZWN0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIGVuYWJsZWQgYnkgZGVmYXVsdCcpO1xuICAgIH1cbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFvYnNlcnZlZC5jdXJyZW50ICYmIHR5cGVvZiBDb250YWluZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZvY3VzTG9jazogY291bGQgbm90IG9idGFpbiByZWYgdG8gaW50ZXJuYWwgbm9kZScpO1xuICAgICAgfVxuICAgIH0sIFtdKTtcbiAgfVxuICB2YXIgbG9ja1Byb3BzID0gX2V4dGVuZHMoKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbY29uc3RhbnRzLkZPQ1VTX0RJU0FCTEVEXSA9IGRpc2FibGVkICYmICdkaXNhYmxlZCcsIF9leHRlbmRzMltjb25zdGFudHMuRk9DVVNfR1JPVVBdID0gZ3JvdXAsIF9leHRlbmRzMiksIGNvbnRhaW5lclByb3BzKTtcbiAgdmFyIGhhc0xlYWRpbmdHdWFyZHMgPSBub0ZvY3VzR3VhcmRzICE9PSB0cnVlO1xuICB2YXIgaGFzVGFpbGluZ0d1YXJkcyA9IGhhc0xlYWRpbmdHdWFyZHMgJiYgbm9Gb2N1c0d1YXJkcyAhPT0gJ3RhaWwnO1xuICB2YXIgbWVyZ2VkUmVmID0gdXNlTWVyZ2VSZWZzKFtwYXJlbnRSZWYsIHNldE9ic2VydmVOb2RlXSk7XG4gIHZhciBmb2N1c1Njb3BlVmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb2JzZXJ2ZWQ6IG9ic2VydmVkLFxuICAgICAgc2hhcmRzOiBzaGFyZHMsXG4gICAgICBlbmFibGVkOiAhZGlzYWJsZWQsXG4gICAgICBhY3RpdmU6IGlzQWN0aXZlLmN1cnJlbnRcbiAgICB9O1xuICB9LCBbZGlzYWJsZWQsIGlzQWN0aXZlLmN1cnJlbnQsIHNoYXJkcywgcmVhbE9ic2VydmVkXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgaGFzTGVhZGluZ0d1YXJkcyAmJiBbXG4gIC8qI19fUFVSRV9fKi9cbiAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBcImd1YXJkLWZpcnN0XCIsXG4gICAgXCJkYXRhLWZvY3VzLWd1YXJkXCI6IHRydWUsXG4gICAgdGFiSW5kZXg6IGRpc2FibGVkID8gLTEgOiAwLFxuICAgIHN0eWxlOiBoaWRkZW5HdWFyZFxuICB9KSwgaGFzUG9zaXRpdmVJbmRpY2VzID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJndWFyZC1uZWFyZXN0XCIsXG4gICAgXCJkYXRhLWZvY3VzLWd1YXJkXCI6IHRydWUsXG4gICAgdGFiSW5kZXg6IGRpc2FibGVkID8gLTEgOiAxLFxuICAgIHN0eWxlOiBoaWRkZW5HdWFyZFxuICB9KSA6IG51bGxdLCAhZGlzYWJsZWQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2lkZUNhciwge1xuICAgIGlkOiBpZCxcbiAgICBzaWRlQ2FyOiBtZWRpdW1TaWRlY2FyLFxuICAgIG9ic2VydmVkOiByZWFsT2JzZXJ2ZWQsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIHBlcnNpc3RlbnRGb2N1czogcGVyc2lzdGVudEZvY3VzLFxuICAgIGNyb3NzRnJhbWU6IGNyb3NzRnJhbWUsXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgd2hpdGVMaXN0OiB3aGl0ZUxpc3QsXG4gICAgc2hhcmRzOiBzaGFyZHMsXG4gICAgb25BY3RpdmF0aW9uOiBvbkFjdGl2YXRpb24sXG4gICAgb25EZWFjdGl2YXRpb246IG9uRGVhY3RpdmF0aW9uLFxuICAgIHJldHVybkZvY3VzOiByZXR1cm5Gb2N1cyxcbiAgICBmb2N1c09wdGlvbnM6IGZvY3VzT3B0aW9uc1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGFpbmVyLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiBtZXJnZWRSZWZcbiAgfSwgbG9ja1Byb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgb25CbHVyOiBvbkJsdXIsXG4gICAgb25Gb2N1czogb25Gb2N1c1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoZm9jdXNTY29wZS5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBmb2N1c1Njb3BlVmFsdWVcbiAgfSwgY2hpbGRyZW4pKSwgaGFzVGFpbGluZ0d1YXJkcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgXCJkYXRhLWZvY3VzLWd1YXJkXCI6IHRydWUsXG4gICAgdGFiSW5kZXg6IGRpc2FibGVkID8gLTEgOiAwLFxuICAgIHN0eWxlOiBoaWRkZW5HdWFyZFxuICB9KSk7XG59KTtcbkZvY3VzTG9jay5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIGNoaWxkcmVuOiBub2RlLFxuICBkaXNhYmxlZDogYm9vbCxcbiAgcmV0dXJuRm9jdXM6IG9uZU9mVHlwZShbYm9vbCwgb2JqZWN0LCBmdW5jXSksXG4gIGZvY3VzT3B0aW9uczogb2JqZWN0LFxuICBub0ZvY3VzR3VhcmRzOiBib29sLFxuICBoYXNQb3NpdGl2ZUluZGljZXM6IGJvb2wsXG4gIGFsbG93VGV4dFNlbGVjdGlvbjogYm9vbCxcbiAgYXV0b0ZvY3VzOiBib29sLFxuICBwZXJzaXN0ZW50Rm9jdXM6IGJvb2wsXG4gIGNyb3NzRnJhbWU6IGJvb2wsXG4gIGdyb3VwOiBzdHJpbmcsXG4gIGNsYXNzTmFtZTogc3RyaW5nLFxuICB3aGl0ZUxpc3Q6IGZ1bmMsXG4gIHNoYXJkczogYXJyYXlPZihhbnkpLFxuICBhczogb25lT2ZUeXBlKFtzdHJpbmcsIGZ1bmMsIG9iamVjdF0pLFxuICBsb2NrUHJvcHM6IG9iamVjdCxcbiAgb25BY3RpdmF0aW9uOiBmdW5jLFxuICBvbkRlYWN0aXZhdGlvbjogZnVuYyxcbiAgc2lkZUNhcjogYW55LmlzUmVxdWlyZWRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEZvY3VzTG9jazsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnZm9jdXMtbG9jay9jb25zdGFudHMnO1xuaW1wb3J0IHsgaW5saW5lUHJvcCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBtZWRpdW1FZmZlY3QgfSBmcm9tICcuL21lZGl1bSc7XG5leHBvcnQgdmFyIHVzZUZvY3VzSW5zaWRlID0gZnVuY3Rpb24gdXNlRm9jdXNJbnNpZGUob2JzZXJ2ZWRSZWYpIHtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZW5hYmxlZCA9IHRydWU7XG4gICAgbWVkaXVtRWZmZWN0LnVzZU1lZGl1bShmdW5jdGlvbiAoY2FyKSB7XG4gICAgICB2YXIgb2JzZXJ2ZWQgPSBvYnNlcnZlZFJlZiAmJiBvYnNlcnZlZFJlZi5jdXJyZW50O1xuICAgICAgaWYgKGVuYWJsZWQgJiYgb2JzZXJ2ZWQpIHtcbiAgICAgICAgaWYgKCFjYXIuZm9jdXNJbnNpZGUob2JzZXJ2ZWQpKSB7XG4gICAgICAgICAgY2FyLm1vdmVGb2N1c0luc2lkZShvYnNlcnZlZCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZW5hYmxlZCA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtvYnNlcnZlZFJlZl0pO1xufTtcbmZ1bmN0aW9uIE1vdmVGb2N1c0luc2lkZShfcmVmKSB7XG4gIHZhciBfcmVmJGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICBpc0Rpc2FibGVkID0gX3JlZiRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJGRpc2FibGVkLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdXNlRm9jdXNJbnNpZGUoaXNEaXNhYmxlZCA/IHVuZGVmaW5lZCA6IHJlZik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgaW5saW5lUHJvcChjb25zdGFudHMuRk9DVVNfQVVUTywgIWlzRGlzYWJsZWQpLCB7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSksIGNoaWxkcmVuKTtcbn1cbk1vdmVGb2N1c0luc2lkZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgTW92ZUZvY3VzSW5zaWRlOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgd2l0aFNpZGVFZmZlY3QgZnJvbSAncmVhY3QtY2xpZW50c2lkZS1lZmZlY3QnO1xuaW1wb3J0IHsgbW92ZUZvY3VzSW5zaWRlLCBmb2N1c0luc2lkZSwgZm9jdXNJc0hpZGRlbiwgZXhwYW5kRm9jdXNhYmxlTm9kZXMsIGZvY3VzTmV4dEVsZW1lbnQsIGZvY3VzUHJldkVsZW1lbnQsIGZvY3VzRmlyc3RFbGVtZW50LCBmb2N1c0xhc3RFbGVtZW50LCBjYXB0dXJlRm9jdXNSZXN0b3JlIH0gZnJvbSAnZm9jdXMtbG9jayc7XG5pbXBvcnQgeyBkZWZlckFjdGlvbiwgZXh0cmFjdFJlZiB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBtZWRpdW1Gb2N1cywgbWVkaXVtQmx1ciwgbWVkaXVtRWZmZWN0IH0gZnJvbSAnLi9tZWRpdW0nO1xudmFyIGZvY3VzT25Cb2R5ID0gZnVuY3Rpb24gZm9jdXNPbkJvZHkoKSB7XG4gIHJldHVybiBkb2N1bWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBkb2N1bWVudC5ib2R5O1xufTtcbnZhciBpc0ZyZWVGb2N1cyA9IGZ1bmN0aW9uIGlzRnJlZUZvY3VzKCkge1xuICByZXR1cm4gZm9jdXNPbkJvZHkoKSB8fCBmb2N1c0lzSGlkZGVuKCk7XG59O1xudmFyIGxhc3RBY3RpdmVUcmFwID0gbnVsbDtcbnZhciBsYXN0QWN0aXZlRm9jdXMgPSBudWxsO1xudmFyIGxhc3RQb3J0YWxlZEVsZW1lbnQgPSBudWxsO1xudmFyIGZvY3VzV2FzT3V0c2lkZVdpbmRvdyA9IGZhbHNlO1xudmFyIGRlZmF1bHRXaGl0ZWxpc3QgPSBmdW5jdGlvbiBkZWZhdWx0V2hpdGVsaXN0KCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgZm9jdXNXaGl0ZWxpc3RlZCA9IGZ1bmN0aW9uIGZvY3VzV2hpdGVsaXN0ZWQoYWN0aXZlRWxlbWVudCkge1xuICByZXR1cm4gKGxhc3RBY3RpdmVUcmFwLndoaXRlTGlzdCB8fCBkZWZhdWx0V2hpdGVsaXN0KShhY3RpdmVFbGVtZW50KTtcbn07XG52YXIgcmVjb3JkUG9ydGFsID0gZnVuY3Rpb24gcmVjb3JkUG9ydGFsKG9ic2VydmVyTm9kZSwgcG9ydGFsZWRFbGVtZW50KSB7XG4gIGxhc3RQb3J0YWxlZEVsZW1lbnQgPSB7XG4gICAgb2JzZXJ2ZXJOb2RlOiBvYnNlcnZlck5vZGUsXG4gICAgcG9ydGFsZWRFbGVtZW50OiBwb3J0YWxlZEVsZW1lbnRcbiAgfTtcbn07XG52YXIgZm9jdXNJc1BvcnRhbGVkUGFpciA9IGZ1bmN0aW9uIGZvY3VzSXNQb3J0YWxlZFBhaXIoZWxlbWVudCkge1xuICByZXR1cm4gbGFzdFBvcnRhbGVkRWxlbWVudCAmJiBsYXN0UG9ydGFsZWRFbGVtZW50LnBvcnRhbGVkRWxlbWVudCA9PT0gZWxlbWVudDtcbn07XG5mdW5jdGlvbiBhdXRvR3VhcmQoc3RhcnRJbmRleCwgZW5kLCBzdGVwLCBhbGxOb2Rlcykge1xuICB2YXIgbGFzdEd1YXJkID0gbnVsbDtcbiAgdmFyIGkgPSBzdGFydEluZGV4O1xuICBkbyB7XG4gICAgdmFyIGl0ZW0gPSBhbGxOb2Rlc1tpXTtcbiAgICBpZiAoaXRlbS5ndWFyZCkge1xuICAgICAgaWYgKGl0ZW0ubm9kZS5kYXRhc2V0LmZvY3VzQXV0b0d1YXJkKSB7XG4gICAgICAgIGxhc3RHdWFyZCA9IGl0ZW07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpdGVtLmxvY2tJdGVtKSB7XG4gICAgICBpZiAoaSAhPT0gc3RhcnRJbmRleCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0R3VhcmQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH0gd2hpbGUgKChpICs9IHN0ZXApICE9PSBlbmQpO1xuICBpZiAobGFzdEd1YXJkKSB7XG4gICAgbGFzdEd1YXJkLm5vZGUudGFiSW5kZXggPSAwO1xuICB9XG59XG52YXIgZm9jdXNXYXNPdXRzaWRlID0gZnVuY3Rpb24gZm9jdXNXYXNPdXRzaWRlKGNyb3NzRnJhbWVPcHRpb24pIHtcbiAgaWYgKGNyb3NzRnJhbWVPcHRpb24pIHtcbiAgICByZXR1cm4gQm9vbGVhbihmb2N1c1dhc091dHNpZGVXaW5kb3cpO1xuICB9XG4gIHJldHVybiBmb2N1c1dhc091dHNpZGVXaW5kb3cgPT09ICdtZWFud2hpbGUnO1xufTtcbnZhciBjaGVja0luSG9zdCA9IGZ1bmN0aW9uIGNoZWNrSW5Ib3N0KGNoZWNrLCBlbCwgYm91bmRhcnkpIHtcbiAgcmV0dXJuIGVsICYmIChlbC5ob3N0ID09PSBjaGVjayAmJiAoIWVsLmFjdGl2ZUVsZW1lbnQgfHwgYm91bmRhcnkuY29udGFpbnMoZWwuYWN0aXZlRWxlbWVudCkpIHx8IGVsLnBhcmVudE5vZGUgJiYgY2hlY2tJbkhvc3QoY2hlY2ssIGVsLnBhcmVudE5vZGUsIGJvdW5kYXJ5KSk7XG59O1xudmFyIHdpdGhpbkhvc3QgPSBmdW5jdGlvbiB3aXRoaW5Ib3N0KGFjdGl2ZUVsZW1lbnQsIHdvcmtpbmdBcmVhKSB7XG4gIHJldHVybiB3b3JraW5nQXJlYS5zb21lKGZ1bmN0aW9uIChhcmVhKSB7XG4gICAgcmV0dXJuIGNoZWNrSW5Ib3N0KGFjdGl2ZUVsZW1lbnQsIGFyZWEsIGFyZWEpO1xuICB9KTtcbn07XG52YXIgYWN0aXZhdGVUcmFwID0gZnVuY3Rpb24gYWN0aXZhdGVUcmFwKCkge1xuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmIChsYXN0QWN0aXZlVHJhcCkge1xuICAgIHZhciBfbGFzdEFjdGl2ZVRyYXAgPSBsYXN0QWN0aXZlVHJhcCxcbiAgICAgIG9ic2VydmVkID0gX2xhc3RBY3RpdmVUcmFwLm9ic2VydmVkLFxuICAgICAgcGVyc2lzdGVudEZvY3VzID0gX2xhc3RBY3RpdmVUcmFwLnBlcnNpc3RlbnRGb2N1cyxcbiAgICAgIGF1dG9Gb2N1cyA9IF9sYXN0QWN0aXZlVHJhcC5hdXRvRm9jdXMsXG4gICAgICBzaGFyZHMgPSBfbGFzdEFjdGl2ZVRyYXAuc2hhcmRzLFxuICAgICAgY3Jvc3NGcmFtZSA9IF9sYXN0QWN0aXZlVHJhcC5jcm9zc0ZyYW1lLFxuICAgICAgZm9jdXNPcHRpb25zID0gX2xhc3RBY3RpdmVUcmFwLmZvY3VzT3B0aW9ucztcbiAgICB2YXIgd29ya2luZ05vZGUgPSBvYnNlcnZlZCB8fCBsYXN0UG9ydGFsZWRFbGVtZW50ICYmIGxhc3RQb3J0YWxlZEVsZW1lbnQucG9ydGFsZWRFbGVtZW50O1xuICAgIHZhciBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBpZiAod29ya2luZ05vZGUpIHtcbiAgICAgIHZhciB3b3JraW5nQXJlYSA9IFt3b3JraW5nTm9kZV0uY29uY2F0KHNoYXJkcy5tYXAoZXh0cmFjdFJlZikuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCBmb2N1c1doaXRlbGlzdGVkKGFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIGlmIChwZXJzaXN0ZW50Rm9jdXMgfHwgZm9jdXNXYXNPdXRzaWRlKGNyb3NzRnJhbWUpIHx8ICFpc0ZyZWVGb2N1cygpIHx8ICFsYXN0QWN0aXZlRm9jdXMgJiYgYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgaWYgKHdvcmtpbmdOb2RlICYmICEoZm9jdXNJbnNpZGUod29ya2luZ0FyZWEpIHx8IGFjdGl2ZUVsZW1lbnQgJiYgd2l0aGluSG9zdChhY3RpdmVFbGVtZW50LCB3b3JraW5nQXJlYSkgfHwgZm9jdXNJc1BvcnRhbGVkUGFpcihhY3RpdmVFbGVtZW50LCB3b3JraW5nTm9kZSkpKSB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQgJiYgIWxhc3RBY3RpdmVGb2N1cyAmJiBhY3RpdmVFbGVtZW50ICYmICFhdXRvRm9jdXMpIHtcbiAgICAgICAgICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQuYmx1cikge1xuICAgICAgICAgICAgICAgIGFjdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IG1vdmVGb2N1c0luc2lkZSh3b3JraW5nQXJlYSwgbGFzdEFjdGl2ZUZvY3VzLCB7XG4gICAgICAgICAgICAgICAgZm9jdXNPcHRpb25zOiBmb2N1c09wdGlvbnNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGxhc3RQb3J0YWxlZEVsZW1lbnQgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9jdXNXYXNPdXRzaWRlV2luZG93ID0gZmFsc2U7XG4gICAgICAgICAgbGFzdEFjdGl2ZUZvY3VzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRvY3VtZW50ICYmIGFjdGl2ZUVsZW1lbnQgIT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtZm9jdXMtYXV0by1ndWFyZF0nKSkge1xuICAgICAgICB2YXIgbmV3QWN0aXZlRWxlbWVudCA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHZhciBhbGxOb2RlcyA9IGV4cGFuZEZvY3VzYWJsZU5vZGVzKHdvcmtpbmdBcmVhKTtcbiAgICAgICAgdmFyIGZvY3VzZWRJbmRleCA9IGFsbE5vZGVzLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBub2RlID0gX3JlZi5ub2RlO1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9KS5pbmRleE9mKG5ld0FjdGl2ZUVsZW1lbnQpO1xuICAgICAgICBpZiAoZm9jdXNlZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICBhbGxOb2Rlcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgICB2YXIgZ3VhcmQgPSBfcmVmMi5ndWFyZCxcbiAgICAgICAgICAgICAgbm9kZSA9IF9yZWYyLm5vZGU7XG4gICAgICAgICAgICByZXR1cm4gZ3VhcmQgJiYgbm9kZS5kYXRhc2V0LmZvY3VzQXV0b0d1YXJkO1xuICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IF9yZWYzLm5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYkluZGV4Jyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXV0b0d1YXJkKGZvY3VzZWRJbmRleCwgYWxsTm9kZXMubGVuZ3RoLCArMSwgYWxsTm9kZXMpO1xuICAgICAgICAgIGF1dG9HdWFyZChmb2N1c2VkSW5kZXgsIC0xLCAtMSwgYWxsTm9kZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIG9uVHJhcCA9IGZ1bmN0aW9uIG9uVHJhcChldmVudCkge1xuICBpZiAoYWN0aXZhdGVUcmFwKCkgJiYgZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59O1xudmFyIG9uQmx1ciA9IGZ1bmN0aW9uIG9uQmx1cigpIHtcbiAgcmV0dXJuIGRlZmVyQWN0aW9uKGFjdGl2YXRlVHJhcCk7XG59O1xudmFyIG9uRm9jdXMgPSBmdW5jdGlvbiBvbkZvY3VzKGV2ZW50KSB7XG4gIHZhciBzb3VyY2UgPSBldmVudC50YXJnZXQ7XG4gIHZhciBjdXJyZW50Tm9kZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGlmICghY3VycmVudE5vZGUuY29udGFpbnMoc291cmNlKSkge1xuICAgIHJlY29yZFBvcnRhbChjdXJyZW50Tm9kZSwgc291cmNlKTtcbiAgfVxufTtcbnZhciBGb2N1c1dhdGNoZXIgPSBmdW5jdGlvbiBGb2N1c1dhdGNoZXIoKSB7XG4gIHJldHVybiBudWxsO1xufTtcbnZhciBGb2N1c1RyYXAgPSBmdW5jdGlvbiBGb2N1c1RyYXAoX3JlZjQpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZjQuY2hpbGRyZW47XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgb25CbHVyOiBvbkJsdXIsXG4gICAgb25Gb2N1czogb25Gb2N1c1xuICB9LCBjaGlsZHJlbik7XG59O1xuRm9jdXNUcmFwLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWRcbn0gOiB7fTtcbnZhciBvbldpbmRvd0JsdXIgPSBmdW5jdGlvbiBvbldpbmRvd0JsdXIoKSB7XG4gIGZvY3VzV2FzT3V0c2lkZVdpbmRvdyA9ICdqdXN0JztcbiAgZGVmZXJBY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgIGZvY3VzV2FzT3V0c2lkZVdpbmRvdyA9ICdtZWFud2hpbGUnO1xuICB9KTtcbn07XG52YXIgYXR0YWNoSGFuZGxlciA9IGZ1bmN0aW9uIGF0dGFjaEhhbmRsZXIoKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvblRyYXApO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uQmx1cik7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgb25XaW5kb3dCbHVyKTtcbn07XG52YXIgZGV0YWNoSGFuZGxlciA9IGZ1bmN0aW9uIGRldGFjaEhhbmRsZXIoKSB7XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvblRyYXApO1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uQmx1cik7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgb25XaW5kb3dCbHVyKTtcbn07XG5mdW5jdGlvbiByZWR1Y2VQcm9wc1RvU3RhdGUocHJvcHNMaXN0KSB7XG4gIHJldHVybiBwcm9wc0xpc3QuZmlsdGVyKGZ1bmN0aW9uIChfcmVmNSkge1xuICAgIHZhciBkaXNhYmxlZCA9IF9yZWY1LmRpc2FibGVkO1xuICAgIHJldHVybiAhZGlzYWJsZWQ7XG4gIH0pO1xufVxudmFyIGZvY3VzTG9ja0FQSSA9IHtcbiAgbW92ZUZvY3VzSW5zaWRlOiBtb3ZlRm9jdXNJbnNpZGUsXG4gIGZvY3VzSW5zaWRlOiBmb2N1c0luc2lkZSxcbiAgZm9jdXNOZXh0RWxlbWVudDogZm9jdXNOZXh0RWxlbWVudCxcbiAgZm9jdXNQcmV2RWxlbWVudDogZm9jdXNQcmV2RWxlbWVudCxcbiAgZm9jdXNGaXJzdEVsZW1lbnQ6IGZvY3VzRmlyc3RFbGVtZW50LFxuICBmb2N1c0xhc3RFbGVtZW50OiBmb2N1c0xhc3RFbGVtZW50LFxuICBjYXB0dXJlRm9jdXNSZXN0b3JlOiBjYXB0dXJlRm9jdXNSZXN0b3JlXG59O1xuZnVuY3Rpb24gaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCh0cmFwcykge1xuICB2YXIgdHJhcCA9IHRyYXBzLnNsaWNlKC0xKVswXTtcbiAgaWYgKHRyYXAgJiYgIWxhc3RBY3RpdmVUcmFwKSB7XG4gICAgYXR0YWNoSGFuZGxlcigpO1xuICB9XG4gIHZhciBsYXN0VHJhcCA9IGxhc3RBY3RpdmVUcmFwO1xuICB2YXIgc2FtZVRyYXAgPSBsYXN0VHJhcCAmJiB0cmFwICYmIHRyYXAuaWQgPT09IGxhc3RUcmFwLmlkO1xuICBsYXN0QWN0aXZlVHJhcCA9IHRyYXA7XG4gIGlmIChsYXN0VHJhcCAmJiAhc2FtZVRyYXApIHtcbiAgICBsYXN0VHJhcC5vbkRlYWN0aXZhdGlvbigpO1xuICAgIGlmICghdHJhcHMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmNikge1xuICAgICAgdmFyIGlkID0gX3JlZjYuaWQ7XG4gICAgICByZXR1cm4gaWQgPT09IGxhc3RUcmFwLmlkO1xuICAgIH0pLmxlbmd0aCkge1xuICAgICAgbGFzdFRyYXAucmV0dXJuRm9jdXMoIXRyYXApO1xuICAgIH1cbiAgfVxuICBpZiAodHJhcCkge1xuICAgIGxhc3RBY3RpdmVGb2N1cyA9IG51bGw7XG4gICAgaWYgKCFzYW1lVHJhcCB8fCBsYXN0VHJhcC5vYnNlcnZlZCAhPT0gdHJhcC5vYnNlcnZlZCkge1xuICAgICAgdHJhcC5vbkFjdGl2YXRpb24oZm9jdXNMb2NrQVBJKTtcbiAgICB9XG4gICAgYWN0aXZhdGVUcmFwKHRydWUpO1xuICAgIGRlZmVyQWN0aW9uKGFjdGl2YXRlVHJhcCk7XG4gIH0gZWxzZSB7XG4gICAgZGV0YWNoSGFuZGxlcigpO1xuICAgIGxhc3RBY3RpdmVGb2N1cyA9IG51bGw7XG4gIH1cbn1cbm1lZGl1bUZvY3VzLmFzc2lnblN5bmNNZWRpdW0ob25Gb2N1cyk7XG5tZWRpdW1CbHVyLmFzc2lnbk1lZGl1bShvbkJsdXIpO1xubWVkaXVtRWZmZWN0LmFzc2lnbk1lZGl1bShmdW5jdGlvbiAoY2IpIHtcbiAgcmV0dXJuIGNiKGZvY3VzTG9ja0FQSSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTaWRlRWZmZWN0KHJlZHVjZVByb3BzVG9TdGF0ZSwgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCkoRm9jdXNXYXRjaGVyKTsiLCJpbXBvcnQgRm9jdXNMb2NrVUkgZnJvbSAnLi9Mb2NrJztcbmltcG9ydCBBdXRvRm9jdXNJbnNpZGUgZnJvbSAnLi9BdXRvRm9jdXNJbnNpZGUnO1xuaW1wb3J0IE1vdmVGb2N1c0luc2lkZSwgeyB1c2VGb2N1c0luc2lkZSB9IGZyb20gJy4vTW92ZUZvY3VzSW5zaWRlJztcbmltcG9ydCBGcmVlRm9jdXNJbnNpZGUgZnJvbSAnLi9GcmVlRm9jdXNJbnNpZGUnO1xuaW1wb3J0IEluRm9jdXNHdWFyZCBmcm9tICcuL0ZvY3VzR3VhcmQnO1xuaW1wb3J0IHsgdXNlRm9jdXNDb250cm9sbGVyLCB1c2VGb2N1c1Njb3BlIH0gZnJvbSAnLi91c2UtZm9jdXMtc2NvcGUnO1xuaW1wb3J0IHsgdXNlRm9jdXNTdGF0ZSB9IGZyb20gJy4vdXNlLWZvY3VzLXN0YXRlJztcbmV4cG9ydCB7IEF1dG9Gb2N1c0luc2lkZSwgTW92ZUZvY3VzSW5zaWRlLCBGcmVlRm9jdXNJbnNpZGUsIEluRm9jdXNHdWFyZCwgRm9jdXNMb2NrVUksIHVzZUZvY3VzSW5zaWRlLCB1c2VGb2N1c0NvbnRyb2xsZXIsIHVzZUZvY3VzU2NvcGUsIHVzZUZvY3VzU3RhdGUgfTtcbmV4cG9ydCBkZWZhdWx0IEZvY3VzTG9ja1VJOyIsImltcG9ydCBGb2N1c0xvY2sgZnJvbSAnLi9Db21iaW5hdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL1VJJztcbmV4cG9ydCBkZWZhdWx0IEZvY3VzTG9jazsiLCJpbXBvcnQgeyBjcmVhdGVNZWRpdW0sIGNyZWF0ZVNpZGVjYXJNZWRpdW0gfSBmcm9tICd1c2Utc2lkZWNhcic7XG5leHBvcnQgdmFyIG1lZGl1bUZvY3VzID0gY3JlYXRlTWVkaXVtKHt9LCBmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgdGFyZ2V0ID0gX3JlZi50YXJnZXQsXG4gICAgY3VycmVudFRhcmdldCA9IF9yZWYuY3VycmVudFRhcmdldDtcbiAgcmV0dXJuIHtcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICBjdXJyZW50VGFyZ2V0OiBjdXJyZW50VGFyZ2V0XG4gIH07XG59KTtcbmV4cG9ydCB2YXIgbWVkaXVtQmx1ciA9IGNyZWF0ZU1lZGl1bSgpO1xuZXhwb3J0IHZhciBtZWRpdW1FZmZlY3QgPSBjcmVhdGVNZWRpdW0oKTtcbmV4cG9ydCB2YXIgbWVkaXVtU2lkZWNhciA9IGNyZWF0ZVNpZGVjYXJNZWRpdW0oe1xuICBhc3luYzogdHJ1ZSxcbiAgc3NyOiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG59KTsiLCJleHBvcnQgdmFyIGNyZWF0ZU5hbm9FdmVudHMgPSBmdW5jdGlvbiBjcmVhdGVOYW5vRXZlbnRzKCkge1xuICByZXR1cm4ge1xuICAgIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMCwgY2FsbGJhY2tzID0gdGhpcy5ldmVudHNbZXZlbnRdIHx8IFtdLCBsZW5ndGggPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KGNhbGxiYWNrcywgYXJncyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBldmVudHM6IHt9LFxuICAgIG9uOiBmdW5jdGlvbiBvbihldmVudCwgY2IpIHtcbiAgICAgIHZhciBfdGhpcyRldmVudHMsXG4gICAgICAgIF90aGlzID0gdGhpcztcbiAgICAgICgoX3RoaXMkZXZlbnRzID0gdGhpcy5ldmVudHMpW2V2ZW50XSB8fCAoX3RoaXMkZXZlbnRzW2V2ZW50XSA9IFtdKSkucHVzaChjYik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMkZXZlbnRzJGV2ZW50O1xuICAgICAgICBfdGhpcy5ldmVudHNbZXZlbnRdID0gKF90aGlzJGV2ZW50cyRldmVudCA9IF90aGlzLmV2ZW50c1tldmVudF0pID09IG51bGwgPyB2b2lkIDAgOiBfdGhpcyRldmVudHMkZXZlbnQuZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgcmV0dXJuIGNiICE9PSBpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTsiLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBmb2N1c1Njb3BlID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZvY3VzU2NvcGUgfSBmcm9tICcuL3Njb3BlJztcbmltcG9ydCB7IG1lZGl1bUVmZmVjdCB9IGZyb20gJy4vbWVkaXVtJztcbmltcG9ydCB7IGV4dHJhY3RSZWYgfSBmcm9tICcuL3V0aWwnO1xudmFyIGNvbGxhcHNlUmVmcyA9IGZ1bmN0aW9uIGNvbGxhcHNlUmVmcyhzaGFyZHMpIHtcbiAgcmV0dXJuIHNoYXJkcy5tYXAoZXh0cmFjdFJlZikuZmlsdGVyKEJvb2xlYW4pO1xufTtcbnZhciB3aXRoTWVkaXVtID0gZnVuY3Rpb24gd2l0aE1lZGl1bShmbikge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICByZXR1cm4gbWVkaXVtRWZmZWN0LnVzZU1lZGl1bShmdW5jdGlvbiAoKSB7XG4gICAgICByZXNvbHZlKGZuLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKSk7XG4gICAgfSk7XG4gIH0pO1xufTtcbmV4cG9ydCB2YXIgdXNlRm9jdXNDb250cm9sbGVyID0gZnVuY3Rpb24gdXNlRm9jdXNDb250cm9sbGVyKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc2hhcmRzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHNoYXJkc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICBpZiAoIXNoYXJkcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUZvY3VzQ29udHJvbGxlciByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdGFyZ2V0IGVsZW1lbnQnKTtcbiAgfVxuICB2YXIgcmVmID0gdXNlUmVmKHNoYXJkcyk7XG4gIHJlZi5jdXJyZW50ID0gc2hhcmRzO1xuICByZXR1cm4gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF1dG9Gb2N1czogZnVuY3Rpb24gYXV0b0ZvY3VzKGZvY3VzT3B0aW9ucykge1xuICAgICAgICBpZiAoZm9jdXNPcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgICAgICBmb2N1c09wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2l0aE1lZGl1bShmdW5jdGlvbiAoY2FyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhci5tb3ZlRm9jdXNJbnNpZGUoY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KSwgbnVsbCwgZm9jdXNPcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZm9jdXNOZXh0OiBmdW5jdGlvbiBmb2N1c05leHQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gd2l0aE1lZGl1bShmdW5jdGlvbiAoY2FyKSB7XG4gICAgICAgICAgY2FyLm1vdmVGb2N1c0luc2lkZShjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpLCBudWxsKTtcbiAgICAgICAgICBjYXIuZm9jdXNOZXh0RWxlbWVudChkb2N1bWVudC5hY3RpdmVFbGVtZW50LCBfZXh0ZW5kcyh7XG4gICAgICAgICAgICBzY29wZTogY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KVxuICAgICAgICAgIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZm9jdXNQcmV2OiBmdW5jdGlvbiBmb2N1c1ByZXYob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gd2l0aE1lZGl1bShmdW5jdGlvbiAoY2FyKSB7XG4gICAgICAgICAgY2FyLm1vdmVGb2N1c0luc2lkZShjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpLCBudWxsKTtcbiAgICAgICAgICBjYXIuZm9jdXNQcmV2RWxlbWVudChkb2N1bWVudC5hY3RpdmVFbGVtZW50LCBfZXh0ZW5kcyh7XG4gICAgICAgICAgICBzY29wZTogY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KVxuICAgICAgICAgIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZm9jdXNGaXJzdDogZnVuY3Rpb24gZm9jdXNGaXJzdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB3aXRoTWVkaXVtKGZ1bmN0aW9uIChjYXIpIHtcbiAgICAgICAgICBjYXIuZm9jdXNGaXJzdEVsZW1lbnQoY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KSwgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZvY3VzTGFzdDogZnVuY3Rpb24gZm9jdXNMYXN0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhNZWRpdW0oZnVuY3Rpb24gKGNhcikge1xuICAgICAgICAgIGNhci5mb2N1c0xhc3RFbGVtZW50KGNvbGxhcHNlUmVmcyhyZWYuY3VycmVudCksIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG59O1xuZXhwb3J0IHZhciB1c2VGb2N1c1Njb3BlID0gZnVuY3Rpb24gdXNlRm9jdXNTY29wZSgpIHtcbiAgdmFyIHNjb3BlID0gdXNlQ29udGV4dChmb2N1c1Njb3BlKTtcbiAgaWYgKCFzY29wZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRm9jdXNMb2NrIGlzIHJlcXVpcmVkIHRvIG9wZXJhdGUgd2l0aCBGb2N1c1Njb3BlJyk7XG4gIH1cbiAgcmV0dXJuIHVzZUZvY3VzQ29udHJvbGxlci5hcHBseSh2b2lkIDAsIFtzY29wZS5vYnNlcnZlZF0uY29uY2F0KHNjb3BlLnNoYXJkcykpO1xufTsiLCJpbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlTmFub0V2ZW50cyB9IGZyb20gJy4vbmFuby1ldmVudHMnO1xudmFyIG1haW5idXMgPSBjcmVhdGVOYW5vRXZlbnRzKCk7XG52YXIgc3Vic2NyaWJlQ291bnRlciA9IDA7XG52YXIgb25Gb2N1c0luID0gZnVuY3Rpb24gb25Gb2N1c0luKGV2ZW50KSB7XG4gIHJldHVybiBtYWluYnVzLmVtaXQoJ2Fzc2lnbicsIGV2ZW50LnRhcmdldCk7XG59O1xudmFyIG9uRm9jdXNPdXQgPSBmdW5jdGlvbiBvbkZvY3VzT3V0KGV2ZW50KSB7XG4gIHJldHVybiBtYWluYnVzLmVtaXQoJ3Jlc2V0JywgZXZlbnQudGFyZ2V0KTtcbn07XG52YXIgdXNlRG9jdW1lbnRGb2N1c1N1YnNjcmliZSA9IGZ1bmN0aW9uIHVzZURvY3VtZW50Rm9jdXNTdWJzY3JpYmUoKSB7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzdWJzY3JpYmVDb3VudGVyKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgb25Gb2N1c0luKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25Gb2N1c091dCk7XG4gICAgfVxuICAgIHN1YnNjcmliZUNvdW50ZXIgKz0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgc3Vic2NyaWJlQ291bnRlciAtPSAxO1xuICAgICAgaWYgKCFzdWJzY3JpYmVDb3VudGVyKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvbkZvY3VzSW4pO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXNPdXQpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcbn07XG52YXIgZ2V0Rm9jdXNTdGF0ZSA9IGZ1bmN0aW9uIGdldEZvY3VzU3RhdGUodGFyZ2V0LCBjdXJyZW50KSB7XG4gIGlmICh0YXJnZXQgPT09IGN1cnJlbnQpIHtcbiAgICByZXR1cm4gJ3NlbGYnO1xuICB9XG4gIGlmIChjdXJyZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICByZXR1cm4gJ3dpdGhpbic7XG4gIH1cbiAgcmV0dXJuICd3aXRoaW4tYm91bmRhcnknO1xufTtcbmV4cG9ydCB2YXIgdXNlRm9jdXNTdGF0ZSA9IGZ1bmN0aW9uIHVzZUZvY3VzU3RhdGUoY2FsbGJhY2tzKSB7XG4gIGlmIChjYWxsYmFja3MgPT09IHZvaWQgMCkge1xuICAgIGNhbGxiYWNrcyA9IHt9O1xuICB9XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgYWN0aXZlID0gX3VzZVN0YXRlWzBdLFxuICAgIHNldEFjdGl2ZSA9IF91c2VTdGF0ZVsxXTtcbiAgdmFyIF91c2VTdGF0ZTIgPSB1c2VTdGF0ZSgnJyksXG4gICAgc3RhdGUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldFN0YXRlID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIHJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGZvY3VzU3RhdGUgPSB1c2VSZWYoe30pO1xuICB2YXIgc3RhdGVUcmFja2VyID0gdXNlUmVmKGZhbHNlKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBpc0FscmVhZHlGb2N1c2VkID0gcmVmLmN1cnJlbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfHwgcmVmLmN1cnJlbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gICAgICBzZXRBY3RpdmUoaXNBbHJlYWR5Rm9jdXNlZCk7XG4gICAgICBzZXRTdGF0ZShnZXRGb2N1c1N0YXRlKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIHJlZi5jdXJyZW50KSk7XG4gICAgICBpZiAoaXNBbHJlYWR5Rm9jdXNlZCAmJiBjYWxsYmFja3Mub25Gb2N1cykge1xuICAgICAgICBjYWxsYmFja3Mub25Gb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW10pO1xuICB2YXIgb25Gb2N1cyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChlKSB7XG4gICAgZm9jdXNTdGF0ZS5jdXJyZW50ID0ge1xuICAgICAgZm9jdXNlZDogdHJ1ZSxcbiAgICAgIHN0YXRlOiBnZXRGb2N1c1N0YXRlKGUudGFyZ2V0LCBlLmN1cnJlbnRUYXJnZXQpXG4gICAgfTtcbiAgfSwgW10pO1xuICB1c2VEb2N1bWVudEZvY3VzU3Vic2NyaWJlKCk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZvdXQgPSBtYWluYnVzLm9uKCdyZXNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvY3VzU3RhdGUuY3VycmVudCA9IHt9O1xuICAgIH0pO1xuICAgIHZhciBmaW4gPSBtYWluYnVzLm9uKCdhc3NpZ24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBmb2N1c1N0YXRlLmN1cnJlbnQuZm9jdXNlZCB8fCBmYWxzZTtcbiAgICAgIHNldEFjdGl2ZShuZXdTdGF0ZSk7XG4gICAgICBzZXRTdGF0ZShmb2N1c1N0YXRlLmN1cnJlbnQuc3RhdGUgfHwgJycpO1xuICAgICAgaWYgKG5ld1N0YXRlICE9PSBzdGF0ZVRyYWNrZXIuY3VycmVudCkge1xuICAgICAgICBzdGF0ZVRyYWNrZXIuY3VycmVudCA9IG5ld1N0YXRlO1xuICAgICAgICBpZiAobmV3U3RhdGUpIHtcbiAgICAgICAgICBjYWxsYmFja3Mub25Gb2N1cyAmJiBjYWxsYmFja3Mub25Gb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrcy5vbkJsdXIgJiYgY2FsbGJhY2tzLm9uQmx1cigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvdXQoKTtcbiAgICAgIGZpbigpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIHtcbiAgICBhY3RpdmU6IGFjdGl2ZSxcbiAgICBzdGF0ZTogc3RhdGUsXG4gICAgb25Gb2N1czogb25Gb2N1cyxcbiAgICByZWY6IHJlZlxuICB9O1xufTsiLCJleHBvcnQgZnVuY3Rpb24gZGVmZXJBY3Rpb24oYWN0aW9uKSB7XG4gIHNldFRpbWVvdXQoYWN0aW9uLCAxKTtcbn1cbmV4cG9ydCB2YXIgaW5saW5lUHJvcCA9IGZ1bmN0aW9uIGlubGluZVByb3AobmFtZSwgdmFsdWUpIHtcbiAgdmFyIG9iaiA9IHt9O1xuICBvYmpbbmFtZV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn07XG5leHBvcnQgdmFyIGV4dHJhY3RSZWYgPSBmdW5jdGlvbiBleHRyYWN0UmVmKHJlZikge1xuICByZXR1cm4gcmVmICYmICdjdXJyZW50JyBpbiByZWYgPyByZWYuY3VycmVudCA6IHJlZjtcbn07IiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB3aXRoU2lkZUVmZmVjdCBmcm9tICdyZWFjdC1zaWRlLWVmZmVjdCc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdyZWFjdC1mYXN0LWNvbXBhcmUnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBvYmplY3RBc3NpZ24gZnJvbSAnb2JqZWN0LWFzc2lnbic7XG5cbnZhciBBVFRSSUJVVEVfTkFNRVMgPSB7XG4gICAgQk9EWTogXCJib2R5QXR0cmlidXRlc1wiLFxuICAgIEhUTUw6IFwiaHRtbEF0dHJpYnV0ZXNcIixcbiAgICBUSVRMRTogXCJ0aXRsZUF0dHJpYnV0ZXNcIlxufTtcblxudmFyIFRBR19OQU1FUyA9IHtcbiAgICBCQVNFOiBcImJhc2VcIixcbiAgICBCT0RZOiBcImJvZHlcIixcbiAgICBIRUFEOiBcImhlYWRcIixcbiAgICBIVE1MOiBcImh0bWxcIixcbiAgICBMSU5LOiBcImxpbmtcIixcbiAgICBNRVRBOiBcIm1ldGFcIixcbiAgICBOT1NDUklQVDogXCJub3NjcmlwdFwiLFxuICAgIFNDUklQVDogXCJzY3JpcHRcIixcbiAgICBTVFlMRTogXCJzdHlsZVwiLFxuICAgIFRJVExFOiBcInRpdGxlXCJcbn07XG5cbnZhciBWQUxJRF9UQUdfTkFNRVMgPSBPYmplY3Qua2V5cyhUQUdfTkFNRVMpLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBUQUdfTkFNRVNbbmFtZV07XG59KTtcblxudmFyIFRBR19QUk9QRVJUSUVTID0ge1xuICAgIENIQVJTRVQ6IFwiY2hhcnNldFwiLFxuICAgIENTU19URVhUOiBcImNzc1RleHRcIixcbiAgICBIUkVGOiBcImhyZWZcIixcbiAgICBIVFRQRVFVSVY6IFwiaHR0cC1lcXVpdlwiLFxuICAgIElOTkVSX0hUTUw6IFwiaW5uZXJIVE1MXCIsXG4gICAgSVRFTV9QUk9QOiBcIml0ZW1wcm9wXCIsXG4gICAgTkFNRTogXCJuYW1lXCIsXG4gICAgUFJPUEVSVFk6IFwicHJvcGVydHlcIixcbiAgICBSRUw6IFwicmVsXCIsXG4gICAgU1JDOiBcInNyY1wiLFxuICAgIFRBUkdFVDogXCJ0YXJnZXRcIlxufTtcblxudmFyIFJFQUNUX1RBR19NQVAgPSB7XG4gICAgYWNjZXNza2V5OiBcImFjY2Vzc0tleVwiLFxuICAgIGNoYXJzZXQ6IFwiY2hhclNldFwiLFxuICAgIGNsYXNzOiBcImNsYXNzTmFtZVwiLFxuICAgIGNvbnRlbnRlZGl0YWJsZTogXCJjb250ZW50RWRpdGFibGVcIixcbiAgICBjb250ZXh0bWVudTogXCJjb250ZXh0TWVudVwiLFxuICAgIFwiaHR0cC1lcXVpdlwiOiBcImh0dHBFcXVpdlwiLFxuICAgIGl0ZW1wcm9wOiBcIml0ZW1Qcm9wXCIsXG4gICAgdGFiaW5kZXg6IFwidGFiSW5kZXhcIlxufTtcblxudmFyIEhFTE1FVF9QUk9QUyA9IHtcbiAgICBERUZBVUxUX1RJVExFOiBcImRlZmF1bHRUaXRsZVwiLFxuICAgIERFRkVSOiBcImRlZmVyXCIsXG4gICAgRU5DT0RFX1NQRUNJQUxfQ0hBUkFDVEVSUzogXCJlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyc1wiLFxuICAgIE9OX0NIQU5HRV9DTElFTlRfU1RBVEU6IFwib25DaGFuZ2VDbGllbnRTdGF0ZVwiLFxuICAgIFRJVExFX1RFTVBMQVRFOiBcInRpdGxlVGVtcGxhdGVcIlxufTtcblxudmFyIEhUTUxfVEFHX01BUCA9IE9iamVjdC5rZXlzKFJFQUNUX1RBR19NQVApLnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgICBvYmpbUkVBQ1RfVEFHX01BUFtrZXldXSA9IGtleTtcbiAgICByZXR1cm4gb2JqO1xufSwge30pO1xuXG52YXIgU0VMRl9DTE9TSU5HX1RBR1MgPSBbVEFHX05BTUVTLk5PU0NSSVBULCBUQUdfTkFNRVMuU0NSSVBULCBUQUdfTkFNRVMuU1RZTEVdO1xuXG52YXIgSEVMTUVUX0FUVFJJQlVURSA9IFwiZGF0YS1yZWFjdC1oZWxtZXRcIjtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmo7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59O1xuXG52YXIgY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG52YXIgaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59O1xuXG52YXIgb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzKSB7XG4gIHZhciB0YXJnZXQgPSB7fTtcblxuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7XG4gICAgdGFyZ2V0W2ldID0gb2JqW2ldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gZnVuY3Rpb24gKHNlbGYsIGNhbGwpIHtcbiAgaWYgKCFzZWxmKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7XG59O1xuXG52YXIgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnMgPSBmdW5jdGlvbiBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVycyhzdHIpIHtcbiAgICB2YXIgZW5jb2RlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuXG4gICAgaWYgKGVuY29kZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhzdHIpO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvPi9nLCBcIiZndDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIikucmVwbGFjZSgvJy9nLCBcIiYjeDI3O1wiKTtcbn07XG5cbnZhciBnZXRUaXRsZUZyb21Qcm9wc0xpc3QgPSBmdW5jdGlvbiBnZXRUaXRsZUZyb21Qcm9wc0xpc3QocHJvcHNMaXN0KSB7XG4gICAgdmFyIGlubmVybW9zdFRpdGxlID0gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBUQUdfTkFNRVMuVElUTEUpO1xuICAgIHZhciBpbm5lcm1vc3RUZW1wbGF0ZSA9IGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgSEVMTUVUX1BST1BTLlRJVExFX1RFTVBMQVRFKTtcblxuICAgIGlmIChpbm5lcm1vc3RUZW1wbGF0ZSAmJiBpbm5lcm1vc3RUaXRsZSkge1xuICAgICAgICAvLyB1c2UgZnVuY3Rpb24gYXJnIHRvIGF2b2lkIG5lZWQgdG8gZXNjYXBlICQgY2hhcmFjdGVyc1xuICAgICAgICByZXR1cm4gaW5uZXJtb3N0VGVtcGxhdGUucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5uZXJtb3N0VGl0bGUpID8gaW5uZXJtb3N0VGl0bGUuam9pbihcIlwiKSA6IGlubmVybW9zdFRpdGxlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgaW5uZXJtb3N0RGVmYXVsdFRpdGxlID0gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuREVGQVVMVF9USVRMRSk7XG5cbiAgICByZXR1cm4gaW5uZXJtb3N0VGl0bGUgfHwgaW5uZXJtb3N0RGVmYXVsdFRpdGxlIHx8IHVuZGVmaW5lZDtcbn07XG5cbnZhciBnZXRPbkNoYW5nZUNsaWVudFN0YXRlID0gZnVuY3Rpb24gZ2V0T25DaGFuZ2VDbGllbnRTdGF0ZShwcm9wc0xpc3QpIHtcbiAgICByZXR1cm4gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuT05fQ0hBTkdFX0NMSUVOVF9TVEFURSkgfHwgZnVuY3Rpb24gKCkge307XG59O1xuXG52YXIgZ2V0QXR0cmlidXRlc0Zyb21Qcm9wc0xpc3QgPSBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdCh0YWdUeXBlLCBwcm9wc0xpc3QpIHtcbiAgICByZXR1cm4gcHJvcHNMaXN0LmZpbHRlcihmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwcm9wc1t0YWdUeXBlXSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgIHJldHVybiBwcm9wc1t0YWdUeXBlXTtcbiAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHRhZ0F0dHJzLCBjdXJyZW50KSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgdGFnQXR0cnMsIGN1cnJlbnQpO1xuICAgIH0sIHt9KTtcbn07XG5cbnZhciBnZXRCYXNlVGFnRnJvbVByb3BzTGlzdCA9IGZ1bmN0aW9uIGdldEJhc2VUYWdGcm9tUHJvcHNMaXN0KHByaW1hcnlBdHRyaWJ1dGVzLCBwcm9wc0xpc3QpIHtcbiAgICByZXR1cm4gcHJvcHNMaXN0LmZpbHRlcihmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwcm9wc1tUQUdfTkFNRVMuQkFTRV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICByZXR1cm4gcHJvcHNbVEFHX05BTUVTLkJBU0VdO1xuICAgIH0pLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGlubmVybW9zdEJhc2VUYWcsIHRhZykge1xuICAgICAgICBpZiAoIWlubmVybW9zdEJhc2VUYWcubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRhZyk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVLZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBsb3dlckNhc2VBdHRyaWJ1dGVLZXkgPSBhdHRyaWJ1dGVLZXkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5QXR0cmlidXRlcy5pbmRleE9mKGxvd2VyQ2FzZUF0dHJpYnV0ZUtleSkgIT09IC0xICYmIHRhZ1tsb3dlckNhc2VBdHRyaWJ1dGVLZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcm1vc3RCYXNlVGFnLmNvbmNhdCh0YWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbm5lcm1vc3RCYXNlVGFnO1xuICAgIH0sIFtdKTtcbn07XG5cbnZhciBnZXRUYWdzRnJvbVByb3BzTGlzdCA9IGZ1bmN0aW9uIGdldFRhZ3NGcm9tUHJvcHNMaXN0KHRhZ05hbWUsIHByaW1hcnlBdHRyaWJ1dGVzLCBwcm9wc0xpc3QpIHtcbiAgICAvLyBDYWxjdWxhdGUgbGlzdCBvZiB0YWdzLCBnaXZpbmcgcHJpb3JpdHkgaW5uZXJtb3N0IGNvbXBvbmVudCAoZW5kIG9mIHRoZSBwcm9wc2xpc3QpXG4gICAgdmFyIGFwcHJvdmVkU2VlblRhZ3MgPSB7fTtcblxuICAgIHJldHVybiBwcm9wc0xpc3QuZmlsdGVyKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wc1t0YWdOYW1lXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcHNbdGFnTmFtZV0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHdhcm4oXCJIZWxtZXQ6IFwiICsgdGFnTmFtZSArIFwiIHNob3VsZCBiZSBvZiB0eXBlIFxcXCJBcnJheVxcXCIuIEluc3RlYWQgZm91bmQgdHlwZSBcXFwiXCIgKyBfdHlwZW9mKHByb3BzW3RhZ05hbWVdKSArIFwiXFxcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICByZXR1cm4gcHJvcHNbdGFnTmFtZV07XG4gICAgfSkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoYXBwcm92ZWRUYWdzLCBpbnN0YW5jZVRhZ3MpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlU2VlblRhZ3MgPSB7fTtcblxuICAgICAgICBpbnN0YW5jZVRhZ3MuZmlsdGVyKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICAgIHZhciBwcmltYXJ5QXR0cmlidXRlS2V5ID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0YWcpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZUtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGxvd2VyQ2FzZUF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZUtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBydWxlIHdpdGggbGluayB0YWdzLCBzaW5jZSByZWwgYW5kIGhyZWYgYXJlIGJvdGggcHJpbWFyeSB0YWdzLCByZWwgdGFrZXMgcHJpb3JpdHlcbiAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUF0dHJpYnV0ZXMuaW5kZXhPZihsb3dlckNhc2VBdHRyaWJ1dGVLZXkpICE9PSAtMSAmJiAhKHByaW1hcnlBdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLlJFTCAmJiB0YWdbcHJpbWFyeUF0dHJpYnV0ZUtleV0udG9Mb3dlckNhc2UoKSA9PT0gXCJjYW5vbmljYWxcIikgJiYgIShsb3dlckNhc2VBdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLlJFTCAmJiB0YWdbbG93ZXJDYXNlQXR0cmlidXRlS2V5XS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUF0dHJpYnV0ZUtleSA9IGxvd2VyQ2FzZUF0dHJpYnV0ZUtleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBpbm5lckhUTUwgd2hpY2ggZG9lc24ndCB3b3JrIGxvd2VyY2FzZWRcbiAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUF0dHJpYnV0ZXMuaW5kZXhPZihhdHRyaWJ1dGVLZXkpICE9PSAtMSAmJiAoYXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MIHx8IGF0dHJpYnV0ZUtleSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQgfHwgYXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5JVEVNX1BST1ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlBdHRyaWJ1dGVLZXkgPSBhdHRyaWJ1dGVLZXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXByaW1hcnlBdHRyaWJ1dGVLZXkgfHwgIXRhZ1twcmltYXJ5QXR0cmlidXRlS2V5XSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdGFnW3ByaW1hcnlBdHRyaWJ1dGVLZXldLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmICghYXBwcm92ZWRTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XSkge1xuICAgICAgICAgICAgICAgIGFwcHJvdmVkU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpbnN0YW5jZVNlZW5UYWdzW3ByaW1hcnlBdHRyaWJ1dGVLZXldKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWFwcHJvdmVkU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV1bdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XVt2YWx1ZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHByb3ZlZFRhZ3MucHVzaCh0YWcpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBVcGRhdGUgc2VlbiB0YWdzIHdpdGggdGFncyBmcm9tIHRoaXMgaW5zdGFuY2VcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhpbnN0YW5jZVNlZW5UYWdzKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYXR0cmlidXRlS2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgIHZhciB0YWdVbmlvbiA9IG9iamVjdEFzc2lnbih7fSwgYXBwcm92ZWRTZWVuVGFnc1thdHRyaWJ1dGVLZXldLCBpbnN0YW5jZVNlZW5UYWdzW2F0dHJpYnV0ZUtleV0pO1xuXG4gICAgICAgICAgICBhcHByb3ZlZFNlZW5UYWdzW2F0dHJpYnV0ZUtleV0gPSB0YWdVbmlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcHByb3ZlZFRhZ3M7XG4gICAgfSwgW10pLnJldmVyc2UoKTtcbn07XG5cbnZhciBnZXRJbm5lcm1vc3RQcm9wZXJ0eSA9IGZ1bmN0aW9uIGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgcHJvcGVydHkpIHtcbiAgICBmb3IgKHZhciBpID0gcHJvcHNMaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHByb3BzTGlzdFtpXTtcblxuICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHNbcHJvcGVydHldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgcmVkdWNlUHJvcHNUb1N0YXRlID0gZnVuY3Rpb24gcmVkdWNlUHJvcHNUb1N0YXRlKHByb3BzTGlzdCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGJhc2VUYWc6IGdldEJhc2VUYWdGcm9tUHJvcHNMaXN0KFtUQUdfUFJPUEVSVElFUy5IUkVGLCBUQUdfUFJPUEVSVElFUy5UQVJHRVRdLCBwcm9wc0xpc3QpLFxuICAgICAgICBib2R5QXR0cmlidXRlczogZ2V0QXR0cmlidXRlc0Zyb21Qcm9wc0xpc3QoQVRUUklCVVRFX05BTUVTLkJPRFksIHByb3BzTGlzdCksXG4gICAgICAgIGRlZmVyOiBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIEhFTE1FVF9QUk9QUy5ERUZFUiksXG4gICAgICAgIGVuY29kZTogZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuRU5DT0RFX1NQRUNJQUxfQ0hBUkFDVEVSUyksXG4gICAgICAgIGh0bWxBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdChBVFRSSUJVVEVfTkFNRVMuSFRNTCwgcHJvcHNMaXN0KSxcbiAgICAgICAgbGlua1RhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5MSU5LLCBbVEFHX1BST1BFUlRJRVMuUkVMLCBUQUdfUFJPUEVSVElFUy5IUkVGXSwgcHJvcHNMaXN0KSxcbiAgICAgICAgbWV0YVRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5NRVRBLCBbVEFHX1BST1BFUlRJRVMuTkFNRSwgVEFHX1BST1BFUlRJRVMuQ0hBUlNFVCwgVEFHX1BST1BFUlRJRVMuSFRUUEVRVUlWLCBUQUdfUFJPUEVSVElFUy5QUk9QRVJUWSwgVEFHX1BST1BFUlRJRVMuSVRFTV9QUk9QXSwgcHJvcHNMaXN0KSxcbiAgICAgICAgbm9zY3JpcHRUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuTk9TQ1JJUFQsIFtUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MXSwgcHJvcHNMaXN0KSxcbiAgICAgICAgb25DaGFuZ2VDbGllbnRTdGF0ZTogZ2V0T25DaGFuZ2VDbGllbnRTdGF0ZShwcm9wc0xpc3QpLFxuICAgICAgICBzY3JpcHRUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuU0NSSVBULCBbVEFHX1BST1BFUlRJRVMuU1JDLCBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MXSwgcHJvcHNMaXN0KSxcbiAgICAgICAgc3R5bGVUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuU1RZTEUsIFtUQUdfUFJPUEVSVElFUy5DU1NfVEVYVF0sIHByb3BzTGlzdCksXG4gICAgICAgIHRpdGxlOiBnZXRUaXRsZUZyb21Qcm9wc0xpc3QocHJvcHNMaXN0KSxcbiAgICAgICAgdGl0bGVBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdChBVFRSSUJVVEVfTkFNRVMuVElUTEUsIHByb3BzTGlzdClcbiAgICB9O1xufTtcblxudmFyIHJhZlBvbHlmaWxsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjbG9jayA9IERhdGUubm93KCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUaW1lIC0gY2xvY2sgPiAxNikge1xuICAgICAgICAgICAgY2xvY2sgPSBjdXJyZW50VGltZTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGN1cnJlbnRUaW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJhZlBvbHlmaWxsKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgfTtcbn0oKTtcblxudmFyIGNhZlBvbHlmaWxsID0gZnVuY3Rpb24gY2FmUG9seWZpbGwoaWQpIHtcbiAgICByZXR1cm4gY2xlYXJUaW1lb3V0KGlkKTtcbn07XG5cbnZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgcmFmUG9seWZpbGwgOiBnbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHJhZlBvbHlmaWxsO1xuXG52YXIgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgY2FmUG9seWZpbGwgOiBnbG9iYWwuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgY2FmUG9seWZpbGw7XG5cbnZhciB3YXJuID0gZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgICByZXR1cm4gY29uc29sZSAmJiB0eXBlb2YgY29uc29sZS53YXJuID09PSBcImZ1bmN0aW9uXCIgJiYgY29uc29sZS53YXJuKG1zZyk7XG59O1xuXG52YXIgX2hlbG1ldENhbGxiYWNrID0gbnVsbDtcblxudmFyIGhhbmRsZUNsaWVudFN0YXRlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2xpZW50U3RhdGVDaGFuZ2UobmV3U3RhdGUpIHtcbiAgICBpZiAoX2hlbG1ldENhbGxiYWNrKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKF9oZWxtZXRDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgaWYgKG5ld1N0YXRlLmRlZmVyKSB7XG4gICAgICAgIF9oZWxtZXRDYWxsYmFjayA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb21taXRUYWdDaGFuZ2VzKG5ld1N0YXRlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX2hlbG1ldENhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb21taXRUYWdDaGFuZ2VzKG5ld1N0YXRlKTtcbiAgICAgICAgX2hlbG1ldENhbGxiYWNrID0gbnVsbDtcbiAgICB9XG59O1xuXG52YXIgY29tbWl0VGFnQ2hhbmdlcyA9IGZ1bmN0aW9uIGNvbW1pdFRhZ0NoYW5nZXMobmV3U3RhdGUsIGNiKSB7XG4gICAgdmFyIGJhc2VUYWcgPSBuZXdTdGF0ZS5iYXNlVGFnLFxuICAgICAgICBib2R5QXR0cmlidXRlcyA9IG5ld1N0YXRlLmJvZHlBdHRyaWJ1dGVzLFxuICAgICAgICBodG1sQXR0cmlidXRlcyA9IG5ld1N0YXRlLmh0bWxBdHRyaWJ1dGVzLFxuICAgICAgICBsaW5rVGFncyA9IG5ld1N0YXRlLmxpbmtUYWdzLFxuICAgICAgICBtZXRhVGFncyA9IG5ld1N0YXRlLm1ldGFUYWdzLFxuICAgICAgICBub3NjcmlwdFRhZ3MgPSBuZXdTdGF0ZS5ub3NjcmlwdFRhZ3MsXG4gICAgICAgIG9uQ2hhbmdlQ2xpZW50U3RhdGUgPSBuZXdTdGF0ZS5vbkNoYW5nZUNsaWVudFN0YXRlLFxuICAgICAgICBzY3JpcHRUYWdzID0gbmV3U3RhdGUuc2NyaXB0VGFncyxcbiAgICAgICAgc3R5bGVUYWdzID0gbmV3U3RhdGUuc3R5bGVUYWdzLFxuICAgICAgICB0aXRsZSA9IG5ld1N0YXRlLnRpdGxlLFxuICAgICAgICB0aXRsZUF0dHJpYnV0ZXMgPSBuZXdTdGF0ZS50aXRsZUF0dHJpYnV0ZXM7XG5cbiAgICB1cGRhdGVBdHRyaWJ1dGVzKFRBR19OQU1FUy5CT0RZLCBib2R5QXR0cmlidXRlcyk7XG4gICAgdXBkYXRlQXR0cmlidXRlcyhUQUdfTkFNRVMuSFRNTCwgaHRtbEF0dHJpYnV0ZXMpO1xuXG4gICAgdXBkYXRlVGl0bGUodGl0bGUsIHRpdGxlQXR0cmlidXRlcyk7XG5cbiAgICB2YXIgdGFnVXBkYXRlcyA9IHtcbiAgICAgICAgYmFzZVRhZzogdXBkYXRlVGFncyhUQUdfTkFNRVMuQkFTRSwgYmFzZVRhZyksXG4gICAgICAgIGxpbmtUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5MSU5LLCBsaW5rVGFncyksXG4gICAgICAgIG1ldGFUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5NRVRBLCBtZXRhVGFncyksXG4gICAgICAgIG5vc2NyaXB0VGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuTk9TQ1JJUFQsIG5vc2NyaXB0VGFncyksXG4gICAgICAgIHNjcmlwdFRhZ3M6IHVwZGF0ZVRhZ3MoVEFHX05BTUVTLlNDUklQVCwgc2NyaXB0VGFncyksXG4gICAgICAgIHN0eWxlVGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuU1RZTEUsIHN0eWxlVGFncylcbiAgICB9O1xuXG4gICAgdmFyIGFkZGVkVGFncyA9IHt9O1xuICAgIHZhciByZW1vdmVkVGFncyA9IHt9O1xuXG4gICAgT2JqZWN0LmtleXModGFnVXBkYXRlcykuZm9yRWFjaChmdW5jdGlvbiAodGFnVHlwZSkge1xuICAgICAgICB2YXIgX3RhZ1VwZGF0ZXMkdGFnVHlwZSA9IHRhZ1VwZGF0ZXNbdGFnVHlwZV0sXG4gICAgICAgICAgICBuZXdUYWdzID0gX3RhZ1VwZGF0ZXMkdGFnVHlwZS5uZXdUYWdzLFxuICAgICAgICAgICAgb2xkVGFncyA9IF90YWdVcGRhdGVzJHRhZ1R5cGUub2xkVGFncztcblxuXG4gICAgICAgIGlmIChuZXdUYWdzLmxlbmd0aCkge1xuICAgICAgICAgICAgYWRkZWRUYWdzW3RhZ1R5cGVdID0gbmV3VGFncztcbiAgICAgICAgfVxuICAgICAgICBpZiAob2xkVGFncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlbW92ZWRUYWdzW3RhZ1R5cGVdID0gdGFnVXBkYXRlc1t0YWdUeXBlXS5vbGRUYWdzO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBjYiAmJiBjYigpO1xuXG4gICAgb25DaGFuZ2VDbGllbnRTdGF0ZShuZXdTdGF0ZSwgYWRkZWRUYWdzLCByZW1vdmVkVGFncyk7XG59O1xuXG52YXIgZmxhdHRlbkFycmF5ID0gZnVuY3Rpb24gZmxhdHRlbkFycmF5KHBvc3NpYmxlQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwb3NzaWJsZUFycmF5KSA/IHBvc3NpYmxlQXJyYXkuam9pbihcIlwiKSA6IHBvc3NpYmxlQXJyYXk7XG59O1xuXG52YXIgdXBkYXRlVGl0bGUgPSBmdW5jdGlvbiB1cGRhdGVUaXRsZSh0aXRsZSwgYXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgdGl0bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnQudGl0bGUgIT09IHRpdGxlKSB7XG4gICAgICAgIGRvY3VtZW50LnRpdGxlID0gZmxhdHRlbkFycmF5KHRpdGxlKTtcbiAgICB9XG5cbiAgICB1cGRhdGVBdHRyaWJ1dGVzKFRBR19OQU1FUy5USVRMRSwgYXR0cmlidXRlcyk7XG59O1xuXG52YXIgdXBkYXRlQXR0cmlidXRlcyA9IGZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXModGFnTmFtZSwgYXR0cmlidXRlcykge1xuICAgIHZhciBlbGVtZW50VGFnID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSlbMF07XG5cbiAgICBpZiAoIWVsZW1lbnRUYWcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBoZWxtZXRBdHRyaWJ1dGVTdHJpbmcgPSBlbGVtZW50VGFnLmdldEF0dHJpYnV0ZShIRUxNRVRfQVRUUklCVVRFKTtcbiAgICB2YXIgaGVsbWV0QXR0cmlidXRlcyA9IGhlbG1ldEF0dHJpYnV0ZVN0cmluZyA/IGhlbG1ldEF0dHJpYnV0ZVN0cmluZy5zcGxpdChcIixcIikgOiBbXTtcbiAgICB2YXIgYXR0cmlidXRlc1RvUmVtb3ZlID0gW10uY29uY2F0KGhlbG1ldEF0dHJpYnV0ZXMpO1xuICAgIHZhciBhdHRyaWJ1dGVLZXlzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUtleXNbaV07XG4gICAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlXSB8fCBcIlwiO1xuXG4gICAgICAgIGlmIChlbGVtZW50VGFnLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgZWxlbWVudFRhZy5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGVsbWV0QXR0cmlidXRlcy5pbmRleE9mKGF0dHJpYnV0ZSkgPT09IC0xKSB7XG4gICAgICAgICAgICBoZWxtZXRBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRleFRvU2F2ZSA9IGF0dHJpYnV0ZXNUb1JlbW92ZS5pbmRleE9mKGF0dHJpYnV0ZSk7XG4gICAgICAgIGlmIChpbmRleFRvU2F2ZSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNUb1JlbW92ZS5zcGxpY2UoaW5kZXhUb1NhdmUsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kgPSBhdHRyaWJ1dGVzVG9SZW1vdmUubGVuZ3RoIC0gMTsgX2kgPj0gMDsgX2ktLSkge1xuICAgICAgICBlbGVtZW50VGFnLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVzVG9SZW1vdmVbX2ldKTtcbiAgICB9XG5cbiAgICBpZiAoaGVsbWV0QXR0cmlidXRlcy5sZW5ndGggPT09IGF0dHJpYnV0ZXNUb1JlbW92ZS5sZW5ndGgpIHtcbiAgICAgICAgZWxlbWVudFRhZy5yZW1vdmVBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSk7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50VGFnLmdldEF0dHJpYnV0ZShIRUxNRVRfQVRUUklCVVRFKSAhPT0gYXR0cmlidXRlS2V5cy5qb2luKFwiLFwiKSkge1xuICAgICAgICBlbGVtZW50VGFnLnNldEF0dHJpYnV0ZShIRUxNRVRfQVRUUklCVVRFLCBhdHRyaWJ1dGVLZXlzLmpvaW4oXCIsXCIpKTtcbiAgICB9XG59O1xuXG52YXIgdXBkYXRlVGFncyA9IGZ1bmN0aW9uIHVwZGF0ZVRhZ3ModHlwZSwgdGFncykge1xuICAgIHZhciBoZWFkRWxlbWVudCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihUQUdfTkFNRVMuSEVBRCk7XG4gICAgdmFyIHRhZ05vZGVzID0gaGVhZEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCh0eXBlICsgXCJbXCIgKyBIRUxNRVRfQVRUUklCVVRFICsgXCJdXCIpO1xuICAgIHZhciBvbGRUYWdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGFnTm9kZXMpO1xuICAgIHZhciBuZXdUYWdzID0gW107XG4gICAgdmFyIGluZGV4VG9EZWxldGUgPSB2b2lkIDA7XG5cbiAgICBpZiAodGFncyAmJiB0YWdzLmxlbmd0aCkge1xuICAgICAgICB0YWdzLmZvckVhY2goZnVuY3Rpb24gKHRhZykge1xuICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBhdHRyaWJ1dGUgaW4gdGFnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZy5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLklOTkVSX0hUTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MID0gdGFnLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLkNTU19URVhUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3RWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSB0YWcuY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0YWcuY3NzVGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdHlwZW9mIHRhZ1thdHRyaWJ1dGVdID09PSBcInVuZGVmaW5lZFwiID8gXCJcIiA6IHRhZ1thdHRyaWJ1dGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKEhFTE1FVF9BVFRSSUJVVEUsIFwidHJ1ZVwiKTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGEgZHVwbGljYXRlIHRhZyBmcm9tIGRvbVRhZ3N0b1JlbW92ZSwgc28gaXQgaXNuJ3QgY2xlYXJlZC5cbiAgICAgICAgICAgIGlmIChvbGRUYWdzLnNvbWUoZnVuY3Rpb24gKGV4aXN0aW5nVGFnLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIGluZGV4VG9EZWxldGUgPSBpbmRleDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudC5pc0VxdWFsTm9kZShleGlzdGluZ1RhZyk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIG9sZFRhZ3Muc3BsaWNlKGluZGV4VG9EZWxldGUsIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdUYWdzLnB1c2gobmV3RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9sZFRhZ3MuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHJldHVybiB0YWcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YWcpO1xuICAgIH0pO1xuICAgIG5ld1RhZ3MuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHJldHVybiBoZWFkRWxlbWVudC5hcHBlbmRDaGlsZCh0YWcpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgb2xkVGFnczogb2xkVGFncyxcbiAgICAgICAgbmV3VGFnczogbmV3VGFnc1xuICAgIH07XG59O1xuXG52YXIgZ2VuZXJhdGVFbGVtZW50QXR0cmlidXRlc0FzU3RyaW5nID0gZnVuY3Rpb24gZ2VuZXJhdGVFbGVtZW50QXR0cmlidXRlc0FzU3RyaW5nKGF0dHJpYnV0ZXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlcykucmVkdWNlKGZ1bmN0aW9uIChzdHIsIGtleSkge1xuICAgICAgICB2YXIgYXR0ciA9IHR5cGVvZiBhdHRyaWJ1dGVzW2tleV0gIT09IFwidW5kZWZpbmVkXCIgPyBrZXkgKyBcIj1cXFwiXCIgKyBhdHRyaWJ1dGVzW2tleV0gKyBcIlxcXCJcIiA6IFwiXCIgKyBrZXk7XG4gICAgICAgIHJldHVybiBzdHIgPyBzdHIgKyBcIiBcIiArIGF0dHIgOiBhdHRyO1xuICAgIH0sIFwiXCIpO1xufTtcblxudmFyIGdlbmVyYXRlVGl0bGVBc1N0cmluZyA9IGZ1bmN0aW9uIGdlbmVyYXRlVGl0bGVBc1N0cmluZyh0eXBlLCB0aXRsZSwgYXR0cmlidXRlcywgZW5jb2RlKSB7XG4gICAgdmFyIGF0dHJpYnV0ZVN0cmluZyA9IGdlbmVyYXRlRWxlbWVudEF0dHJpYnV0ZXNBc1N0cmluZyhhdHRyaWJ1dGVzKTtcbiAgICB2YXIgZmxhdHRlbmVkVGl0bGUgPSBmbGF0dGVuQXJyYXkodGl0bGUpO1xuICAgIHJldHVybiBhdHRyaWJ1dGVTdHJpbmcgPyBcIjxcIiArIHR5cGUgKyBcIiBcIiArIEhFTE1FVF9BVFRSSUJVVEUgKyBcIj1cXFwidHJ1ZVxcXCIgXCIgKyBhdHRyaWJ1dGVTdHJpbmcgKyBcIj5cIiArIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzKGZsYXR0ZW5lZFRpdGxlLCBlbmNvZGUpICsgXCI8L1wiICsgdHlwZSArIFwiPlwiIDogXCI8XCIgKyB0eXBlICsgXCIgXCIgKyBIRUxNRVRfQVRUUklCVVRFICsgXCI9XFxcInRydWVcXFwiPlwiICsgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnMoZmxhdHRlbmVkVGl0bGUsIGVuY29kZSkgKyBcIjwvXCIgKyB0eXBlICsgXCI+XCI7XG59O1xuXG52YXIgZ2VuZXJhdGVUYWdzQXNTdHJpbmcgPSBmdW5jdGlvbiBnZW5lcmF0ZVRhZ3NBc1N0cmluZyh0eXBlLCB0YWdzLCBlbmNvZGUpIHtcbiAgICByZXR1cm4gdGFncy5yZWR1Y2UoZnVuY3Rpb24gKHN0ciwgdGFnKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVIdG1sID0gT2JqZWN0LmtleXModGFnKS5maWx0ZXIoZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgcmV0dXJuICEoYXR0cmlidXRlID09PSBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MIHx8IGF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQpO1xuICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHN0cmluZywgYXR0cmlidXRlKSB7XG4gICAgICAgICAgICB2YXIgYXR0ciA9IHR5cGVvZiB0YWdbYXR0cmlidXRlXSA9PT0gXCJ1bmRlZmluZWRcIiA/IGF0dHJpYnV0ZSA6IGF0dHJpYnV0ZSArIFwiPVxcXCJcIiArIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzKHRhZ1thdHRyaWJ1dGVdLCBlbmNvZGUpICsgXCJcXFwiXCI7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nID8gc3RyaW5nICsgXCIgXCIgKyBhdHRyIDogYXR0cjtcbiAgICAgICAgfSwgXCJcIik7XG5cbiAgICAgICAgdmFyIHRhZ0NvbnRlbnQgPSB0YWcuaW5uZXJIVE1MIHx8IHRhZy5jc3NUZXh0IHx8IFwiXCI7XG5cbiAgICAgICAgdmFyIGlzU2VsZkNsb3NpbmcgPSBTRUxGX0NMT1NJTkdfVEFHUy5pbmRleE9mKHR5cGUpID09PSAtMTtcblxuICAgICAgICByZXR1cm4gc3RyICsgXCI8XCIgKyB0eXBlICsgXCIgXCIgKyBIRUxNRVRfQVRUUklCVVRFICsgXCI9XFxcInRydWVcXFwiIFwiICsgYXR0cmlidXRlSHRtbCArIChpc1NlbGZDbG9zaW5nID8gXCIvPlwiIDogXCI+XCIgKyB0YWdDb250ZW50ICsgXCI8L1wiICsgdHlwZSArIFwiPlwiKTtcbiAgICB9LCBcIlwiKTtcbn07XG5cbnZhciBjb252ZXJ0RWxlbWVudEF0dHJpYnV0ZXN0b1JlYWN0UHJvcHMgPSBmdW5jdGlvbiBjb252ZXJ0RWxlbWVudEF0dHJpYnV0ZXN0b1JlYWN0UHJvcHMoYXR0cmlidXRlcykge1xuICAgIHZhciBpbml0UHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgICAgICAgb2JqW1JFQUNUX1RBR19NQVBba2V5XSB8fCBrZXldID0gYXR0cmlidXRlc1trZXldO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sIGluaXRQcm9wcyk7XG59O1xuXG52YXIgY29udmVydFJlYWN0UHJvcHN0b0h0bWxBdHRyaWJ1dGVzID0gZnVuY3Rpb24gY29udmVydFJlYWN0UHJvcHN0b0h0bWxBdHRyaWJ1dGVzKHByb3BzKSB7XG4gICAgdmFyIGluaXRBdHRyaWJ1dGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm9wcykucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAgICAgICBvYmpbSFRNTF9UQUdfTUFQW2tleV0gfHwga2V5XSA9IHByb3BzW2tleV07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSwgaW5pdEF0dHJpYnV0ZXMpO1xufTtcblxudmFyIGdlbmVyYXRlVGl0bGVBc1JlYWN0Q29tcG9uZW50ID0gZnVuY3Rpb24gZ2VuZXJhdGVUaXRsZUFzUmVhY3RDb21wb25lbnQodHlwZSwgdGl0bGUsIGF0dHJpYnV0ZXMpIHtcbiAgICB2YXIgX2luaXRQcm9wcztcblxuICAgIC8vIGFzc2lnbmluZyBpbnRvIGFuIGFycmF5IHRvIGRlZmluZSB0b1N0cmluZyBmdW5jdGlvbiBvbiBpdFxuICAgIHZhciBpbml0UHJvcHMgPSAoX2luaXRQcm9wcyA9IHtcbiAgICAgICAga2V5OiB0aXRsZVxuICAgIH0sIF9pbml0UHJvcHNbSEVMTUVUX0FUVFJJQlVURV0gPSB0cnVlLCBfaW5pdFByb3BzKTtcbiAgICB2YXIgcHJvcHMgPSBjb252ZXJ0RWxlbWVudEF0dHJpYnV0ZXN0b1JlYWN0UHJvcHMoYXR0cmlidXRlcywgaW5pdFByb3BzKTtcblxuICAgIHJldHVybiBbUmVhY3QuY3JlYXRlRWxlbWVudChUQUdfTkFNRVMuVElUTEUsIHByb3BzLCB0aXRsZSldO1xufTtcblxudmFyIGdlbmVyYXRlVGFnc0FzUmVhY3RDb21wb25lbnQgPSBmdW5jdGlvbiBnZW5lcmF0ZVRhZ3NBc1JlYWN0Q29tcG9uZW50KHR5cGUsIHRhZ3MpIHtcbiAgICByZXR1cm4gdGFncy5tYXAoZnVuY3Rpb24gKHRhZywgaSkge1xuICAgICAgICB2YXIgX21hcHBlZFRhZztcblxuICAgICAgICB2YXIgbWFwcGVkVGFnID0gKF9tYXBwZWRUYWcgPSB7XG4gICAgICAgICAgICBrZXk6IGlcbiAgICAgICAgfSwgX21hcHBlZFRhZ1tIRUxNRVRfQVRUUklCVVRFXSA9IHRydWUsIF9tYXBwZWRUYWcpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHRhZykuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICB2YXIgbWFwcGVkQXR0cmlidXRlID0gUkVBQ1RfVEFHX01BUFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTtcblxuICAgICAgICAgICAgaWYgKG1hcHBlZEF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuSU5ORVJfSFRNTCB8fCBtYXBwZWRBdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLkNTU19URVhUKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSB0YWcuaW5uZXJIVE1MIHx8IHRhZy5jc3NUZXh0O1xuICAgICAgICAgICAgICAgIG1hcHBlZFRhZy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9IHsgX19odG1sOiBjb250ZW50IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hcHBlZFRhZ1ttYXBwZWRBdHRyaWJ1dGVdID0gdGFnW2F0dHJpYnV0ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHR5cGUsIG1hcHBlZFRhZyk7XG4gICAgfSk7XG59O1xuXG52YXIgZ2V0TWV0aG9kc0ZvclRhZyA9IGZ1bmN0aW9uIGdldE1ldGhvZHNGb3JUYWcodHlwZSwgdGFncywgZW5jb2RlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgVEFHX05BTUVTLlRJVExFOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b0NvbXBvbmVudDogZnVuY3Rpb24gdG9Db21wb25lbnQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVRpdGxlQXNSZWFjdENvbXBvbmVudCh0eXBlLCB0YWdzLnRpdGxlLCB0YWdzLnRpdGxlQXR0cmlidXRlcywgZW5jb2RlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGl0bGVBc1N0cmluZyh0eXBlLCB0YWdzLnRpdGxlLCB0YWdzLnRpdGxlQXR0cmlidXRlcywgZW5jb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEFUVFJJQlVURV9OQU1FUy5CT0RZOlxuICAgICAgICBjYXNlIEFUVFJJQlVURV9OQU1FUy5IVE1MOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b0NvbXBvbmVudDogZnVuY3Rpb24gdG9Db21wb25lbnQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0RWxlbWVudEF0dHJpYnV0ZXN0b1JlYWN0UHJvcHModGFncyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUVsZW1lbnRBdHRyaWJ1dGVzQXNTdHJpbmcodGFncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9Db21wb25lbnQ6IGZ1bmN0aW9uIHRvQ29tcG9uZW50KCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVUYWdzQXNSZWFjdENvbXBvbmVudCh0eXBlLCB0YWdzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGFnc0FzU3RyaW5nKHR5cGUsIHRhZ3MsIGVuY29kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICB9XG59O1xuXG52YXIgbWFwU3RhdGVPblNlcnZlciA9IGZ1bmN0aW9uIG1hcFN0YXRlT25TZXJ2ZXIoX3JlZikge1xuICAgIHZhciBiYXNlVGFnID0gX3JlZi5iYXNlVGFnLFxuICAgICAgICBib2R5QXR0cmlidXRlcyA9IF9yZWYuYm9keUF0dHJpYnV0ZXMsXG4gICAgICAgIGVuY29kZSA9IF9yZWYuZW5jb2RlLFxuICAgICAgICBodG1sQXR0cmlidXRlcyA9IF9yZWYuaHRtbEF0dHJpYnV0ZXMsXG4gICAgICAgIGxpbmtUYWdzID0gX3JlZi5saW5rVGFncyxcbiAgICAgICAgbWV0YVRhZ3MgPSBfcmVmLm1ldGFUYWdzLFxuICAgICAgICBub3NjcmlwdFRhZ3MgPSBfcmVmLm5vc2NyaXB0VGFncyxcbiAgICAgICAgc2NyaXB0VGFncyA9IF9yZWYuc2NyaXB0VGFncyxcbiAgICAgICAgc3R5bGVUYWdzID0gX3JlZi5zdHlsZVRhZ3MsXG4gICAgICAgIF9yZWYkdGl0bGUgPSBfcmVmLnRpdGxlLFxuICAgICAgICB0aXRsZSA9IF9yZWYkdGl0bGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBfcmVmJHRpdGxlLFxuICAgICAgICB0aXRsZUF0dHJpYnV0ZXMgPSBfcmVmLnRpdGxlQXR0cmlidXRlcztcbiAgICByZXR1cm4ge1xuICAgICAgICBiYXNlOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5CQVNFLCBiYXNlVGFnLCBlbmNvZGUpLFxuICAgICAgICBib2R5QXR0cmlidXRlczogZ2V0TWV0aG9kc0ZvclRhZyhBVFRSSUJVVEVfTkFNRVMuQk9EWSwgYm9keUF0dHJpYnV0ZXMsIGVuY29kZSksXG4gICAgICAgIGh0bWxBdHRyaWJ1dGVzOiBnZXRNZXRob2RzRm9yVGFnKEFUVFJJQlVURV9OQU1FUy5IVE1MLCBodG1sQXR0cmlidXRlcywgZW5jb2RlKSxcbiAgICAgICAgbGluazogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuTElOSywgbGlua1RhZ3MsIGVuY29kZSksXG4gICAgICAgIG1ldGE6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLk1FVEEsIG1ldGFUYWdzLCBlbmNvZGUpLFxuICAgICAgICBub3NjcmlwdDogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuTk9TQ1JJUFQsIG5vc2NyaXB0VGFncywgZW5jb2RlKSxcbiAgICAgICAgc2NyaXB0OiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5TQ1JJUFQsIHNjcmlwdFRhZ3MsIGVuY29kZSksXG4gICAgICAgIHN0eWxlOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5TVFlMRSwgc3R5bGVUYWdzLCBlbmNvZGUpLFxuICAgICAgICB0aXRsZTogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuVElUTEUsIHsgdGl0bGU6IHRpdGxlLCB0aXRsZUF0dHJpYnV0ZXM6IHRpdGxlQXR0cmlidXRlcyB9LCBlbmNvZGUpXG4gICAgfTtcbn07XG5cbnZhciBIZWxtZXQgPSBmdW5jdGlvbiBIZWxtZXQoQ29tcG9uZW50KSB7XG4gICAgdmFyIF9jbGFzcywgX3RlbXA7XG5cbiAgICByZXR1cm4gX3RlbXAgPSBfY2xhc3MgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgICAgICBpbmhlcml0cyhIZWxtZXRXcmFwcGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICAgICAgICBmdW5jdGlvbiBIZWxtZXRXcmFwcGVyKCkge1xuICAgICAgICAgICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSGVsbWV0V3JhcHBlcik7XG4gICAgICAgICAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgICAgICB9XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuICFpc0VxdWFsKHRoaXMucHJvcHMsIG5leHRQcm9wcyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUubWFwTmVzdGVkQ2hpbGRyZW5Ub1Byb3BzID0gZnVuY3Rpb24gbWFwTmVzdGVkQ2hpbGRyZW5Ub1Byb3BzKGNoaWxkLCBuZXN0ZWRDaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKCFuZXN0ZWRDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5TQ1JJUFQ6XG4gICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuTk9TQ1JJUFQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IG5lc3RlZENoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5TVFlMRTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQ6IG5lc3RlZENoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIjxcIiArIGNoaWxkLnR5cGUgKyBcIiAvPiBlbGVtZW50cyBhcmUgc2VsZi1jbG9zaW5nIGFuZCBjYW4gbm90IGNvbnRhaW4gY2hpbGRyZW4uIFJlZmVyIHRvIG91ciBBUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLmZsYXR0ZW5BcnJheVR5cGVDaGlsZHJlbiA9IGZ1bmN0aW9uIGZsYXR0ZW5BcnJheVR5cGVDaGlsZHJlbihfcmVmKSB7XG4gICAgICAgICAgICB2YXIgX2JhYmVsSGVscGVycyRleHRlbmRzO1xuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBfcmVmLmNoaWxkLFxuICAgICAgICAgICAgICAgIGFycmF5VHlwZUNoaWxkcmVuID0gX3JlZi5hcnJheVR5cGVDaGlsZHJlbixcbiAgICAgICAgICAgICAgICBuZXdDaGlsZFByb3BzID0gX3JlZi5uZXdDaGlsZFByb3BzLFxuICAgICAgICAgICAgICAgIG5lc3RlZENoaWxkcmVuID0gX3JlZi5uZXN0ZWRDaGlsZHJlbjtcblxuICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBhcnJheVR5cGVDaGlsZHJlbiwgKF9iYWJlbEhlbHBlcnMkZXh0ZW5kcyA9IHt9LCBfYmFiZWxIZWxwZXJzJGV4dGVuZHNbY2hpbGQudHlwZV0gPSBbXS5jb25jYXQoYXJyYXlUeXBlQ2hpbGRyZW5bY2hpbGQudHlwZV0gfHwgW10sIFtfZXh0ZW5kcyh7fSwgbmV3Q2hpbGRQcm9wcywgdGhpcy5tYXBOZXN0ZWRDaGlsZHJlblRvUHJvcHMoY2hpbGQsIG5lc3RlZENoaWxkcmVuKSldKSwgX2JhYmVsSGVscGVycyRleHRlbmRzKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUubWFwT2JqZWN0VHlwZUNoaWxkcmVuID0gZnVuY3Rpb24gbWFwT2JqZWN0VHlwZUNoaWxkcmVuKF9yZWYyKSB7XG4gICAgICAgICAgICB2YXIgX2JhYmVsSGVscGVycyRleHRlbmRzMiwgX2JhYmVsSGVscGVycyRleHRlbmRzMztcblxuICAgICAgICAgICAgdmFyIGNoaWxkID0gX3JlZjIuY2hpbGQsXG4gICAgICAgICAgICAgICAgbmV3UHJvcHMgPSBfcmVmMi5uZXdQcm9wcyxcbiAgICAgICAgICAgICAgICBuZXdDaGlsZFByb3BzID0gX3JlZjIubmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbiA9IF9yZWYyLm5lc3RlZENoaWxkcmVuO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5USVRMRTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywgKF9iYWJlbEhlbHBlcnMkZXh0ZW5kczIgPSB7fSwgX2JhYmVsSGVscGVycyRleHRlbmRzMltjaGlsZC50eXBlXSA9IG5lc3RlZENoaWxkcmVuLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMyLnRpdGxlQXR0cmlidXRlcyA9IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKSwgX2JhYmVsSGVscGVycyRleHRlbmRzMikpO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuQk9EWTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUF0dHJpYnV0ZXM6IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLkhUTUw6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgbmV3UHJvcHMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzOiBfZXh0ZW5kcyh7fSwgbmV3Q2hpbGRQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgbmV3UHJvcHMsIChfYmFiZWxIZWxwZXJzJGV4dGVuZHMzID0ge30sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczNbY2hpbGQudHlwZV0gPSBfZXh0ZW5kcyh7fSwgbmV3Q2hpbGRQcm9wcyksIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczMpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5tYXBBcnJheVR5cGVDaGlsZHJlblRvUHJvcHMgPSBmdW5jdGlvbiBtYXBBcnJheVR5cGVDaGlsZHJlblRvUHJvcHMoYXJyYXlUeXBlQ2hpbGRyZW4sIG5ld1Byb3BzKSB7XG4gICAgICAgICAgICB2YXIgbmV3RmxhdHRlbmVkUHJvcHMgPSBfZXh0ZW5kcyh7fSwgbmV3UHJvcHMpO1xuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcnJheVR5cGVDaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAoYXJyYXlDaGlsZE5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2JhYmVsSGVscGVycyRleHRlbmRzNDtcblxuICAgICAgICAgICAgICAgIG5ld0ZsYXR0ZW5lZFByb3BzID0gX2V4dGVuZHMoe30sIG5ld0ZsYXR0ZW5lZFByb3BzLCAoX2JhYmVsSGVscGVycyRleHRlbmRzNCA9IHt9LCBfYmFiZWxIZWxwZXJzJGV4dGVuZHM0W2FycmF5Q2hpbGROYW1lXSA9IGFycmF5VHlwZUNoaWxkcmVuW2FycmF5Q2hpbGROYW1lXSwgX2JhYmVsSGVscGVycyRleHRlbmRzNCkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXdGbGF0dGVuZWRQcm9wcztcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS53YXJuT25JbnZhbGlkQ2hpbGRyZW4gPSBmdW5jdGlvbiB3YXJuT25JbnZhbGlkQ2hpbGRyZW4oY2hpbGQsIG5lc3RlZENoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFWQUxJRF9UQUdfTkFNRVMuc29tZShmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQudHlwZSA9PT0gbmFtZTtcbiAgICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkLnR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhcm4oXCJZb3UgbWF5IGJlIGF0dGVtcHRpbmcgdG8gbmVzdCA8SGVsbWV0PiBjb21wb25lbnRzIHdpdGhpbiBlYWNoIG90aGVyLCB3aGljaCBpcyBub3QgYWxsb3dlZC4gUmVmZXIgdG8gb3VyIEFQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2FybihcIk9ubHkgZWxlbWVudHMgdHlwZXMgXCIgKyBWQUxJRF9UQUdfTkFNRVMuam9pbihcIiwgXCIpICsgXCIgYXJlIGFsbG93ZWQuIEhlbG1ldCBkb2VzIG5vdCBzdXBwb3J0IHJlbmRlcmluZyA8XCIgKyBjaGlsZC50eXBlICsgXCI+IGVsZW1lbnRzLiBSZWZlciB0byBvdXIgQVBJIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobmVzdGVkQ2hpbGRyZW4gJiYgdHlwZW9mIG5lc3RlZENoaWxkcmVuICE9PSBcInN0cmluZ1wiICYmICghQXJyYXkuaXNBcnJheShuZXN0ZWRDaGlsZHJlbikgfHwgbmVzdGVkQ2hpbGRyZW4uc29tZShmdW5jdGlvbiAobmVzdGVkQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBuZXN0ZWRDaGlsZCAhPT0gXCJzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICB9KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGVsbWV0IGV4cGVjdHMgYSBzdHJpbmcgYXMgYSBjaGlsZCBvZiA8XCIgKyBjaGlsZC50eXBlICsgXCI+LiBEaWQgeW91IGZvcmdldCB0byB3cmFwIHlvdXIgY2hpbGRyZW4gaW4gYnJhY2VzPyAoIDxcIiArIGNoaWxkLnR5cGUgKyBcIj57YGB9PC9cIiArIGNoaWxkLnR5cGUgKyBcIj4gKSBSZWZlciB0byBvdXIgQVBJIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLm1hcENoaWxkcmVuVG9Qcm9wcyA9IGZ1bmN0aW9uIG1hcENoaWxkcmVuVG9Qcm9wcyhjaGlsZHJlbiwgbmV3UHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgICAgICB2YXIgYXJyYXlUeXBlQ2hpbGRyZW4gPSB7fTtcblxuICAgICAgICAgICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZCB8fCAhY2hpbGQucHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBfY2hpbGQkcHJvcHMgPSBjaGlsZC5wcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ2hpbGRyZW4gPSBfY2hpbGQkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkUHJvcHMgPSBvYmplY3RXaXRob3V0UHJvcGVydGllcyhfY2hpbGQkcHJvcHMsIFtcImNoaWxkcmVuXCJdKTtcblxuICAgICAgICAgICAgICAgIHZhciBuZXdDaGlsZFByb3BzID0gY29udmVydFJlYWN0UHJvcHN0b0h0bWxBdHRyaWJ1dGVzKGNoaWxkUHJvcHMpO1xuXG4gICAgICAgICAgICAgICAgX3RoaXMyLndhcm5PbkludmFsaWRDaGlsZHJlbihjaGlsZCwgbmVzdGVkQ2hpbGRyZW4pO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLkxJTks6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLk1FVEE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLk5PU0NSSVBUOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5TQ1JJUFQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLlNUWUxFOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlQ2hpbGRyZW4gPSBfdGhpczIuZmxhdHRlbkFycmF5VHlwZUNoaWxkcmVuKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZDogY2hpbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlQ2hpbGRyZW46IGFycmF5VHlwZUNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkUHJvcHM6IG5ld0NoaWxkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ2hpbGRyZW46IG5lc3RlZENoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wcyA9IF90aGlzMi5tYXBPYmplY3RUeXBlQ2hpbGRyZW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkOiBjaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wczogbmV3UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRQcm9wczogbmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbjogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG5ld1Byb3BzID0gdGhpcy5tYXBBcnJheVR5cGVDaGlsZHJlblRvUHJvcHMoYXJyYXlUeXBlQ2hpbGRyZW4sIG5ld1Byb3BzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdQcm9wcztcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICBwcm9wcyA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgW1wiY2hpbGRyZW5cIl0pO1xuXG4gICAgICAgICAgICB2YXIgbmV3UHJvcHMgPSBfZXh0ZW5kcyh7fSwgcHJvcHMpO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBuZXdQcm9wcyA9IHRoaXMubWFwQ2hpbGRyZW5Ub1Byb3BzKGNoaWxkcmVuLCBuZXdQcm9wcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgbmV3UHJvcHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNyZWF0ZUNsYXNzKEhlbG1ldFdyYXBwZXIsIG51bGwsIFt7XG4gICAgICAgICAgICBrZXk6IFwiY2FuVXNlRE9NXCIsXG5cblxuICAgICAgICAgICAgLy8gQ29tcG9uZW50LnBlZWsgY29tZXMgZnJvbSByZWFjdC1zaWRlLWVmZmVjdDpcbiAgICAgICAgICAgIC8vIEZvciB0ZXN0aW5nLCB5b3UgbWF5IHVzZSBhIHN0YXRpYyBwZWVrKCkgbWV0aG9kIGF2YWlsYWJsZSBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50LlxuICAgICAgICAgICAgLy8gSXQgbGV0cyB5b3UgZ2V0IHRoZSBjdXJyZW50IHN0YXRlIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBtb3VudGVkIGluc3RhbmNlIHN0YWNrLlxuICAgICAgICAgICAgLy8gRG9u4oCZdCB1c2UgaXQgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4gdGVzdGluZy5cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYmFzZToge1widGFyZ2V0XCI6IFwiX2JsYW5rXCIsIFwiaHJlZlwiOiBcImh0dHA6Ly9teXNpdGUuY29tL1wifVxuICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGJvZHlBdHRyaWJ1dGVzOiB7XCJjbGFzc05hbWVcIjogXCJyb290XCJ9XG4gICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGVmYXVsdFRpdGxlOiBcIkRlZmF1bHQgVGl0bGVcIlxuICAgICAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBkZWZlcjogdHJ1ZVxuICAgICAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogdHJ1ZVxuICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGh0bWxBdHRyaWJ1dGVzOiB7XCJsYW5nXCI6IFwiZW5cIiwgXCJhbXBcIjogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbGluazogW3tcInJlbFwiOiBcImNhbm9uaWNhbFwiLCBcImhyZWZcIjogXCJodHRwOi8vbXlzaXRlLmNvbS9leGFtcGxlXCJ9XVxuICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbWV0YTogW3tcIm5hbWVcIjogXCJkZXNjcmlwdGlvblwiLCBcImNvbnRlbnRcIjogXCJUZXN0IGRlc2NyaXB0aW9uXCJ9XVxuICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbm9zY3JpcHQ6IFt7XCJpbm5lckhUTUxcIjogXCI8aW1nIHNyYz0naHR0cDovL215c2l0ZS5jb20vanMvdGVzdC5qcydcIn1dXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkNoYW5nZUNsaWVudFN0YXRlOiBcIihuZXdTdGF0ZSkgPT4gY29uc29sZS5sb2cobmV3U3RhdGUpXCJcbiAgICAgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHNjcmlwdDogW3tcInR5cGVcIjogXCJ0ZXh0L2phdmFzY3JpcHRcIiwgXCJzcmNcIjogXCJodHRwOi8vbXlzaXRlLmNvbS9qcy90ZXN0LmpzXCJ9XVxuICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3R5bGU6IFt7XCJ0eXBlXCI6IFwidGV4dC9jc3NcIiwgXCJjc3NUZXh0XCI6IFwiZGl2IHsgZGlzcGxheTogYmxvY2s7IGNvbG9yOiBibHVlOyB9XCJ9XVxuICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRpdGxlOiBcIlRpdGxlXCJcbiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0aXRsZUF0dHJpYnV0ZXM6IHtcIml0ZW1wcm9wXCI6IFwibmFtZVwifVxuICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHRpdGxlVGVtcGxhdGU6IFwiTXlTaXRlLmNvbSAtICVzXCJcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEoY2FuVXNlRE9NKSB7XG4gICAgICAgICAgICAgICAgQ29tcG9uZW50LmNhblVzZURPTSA9IGNhblVzZURPTTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfV0pO1xuICAgICAgICByZXR1cm4gSGVsbWV0V3JhcHBlcjtcbiAgICB9KFJlYWN0LkNvbXBvbmVudCksIF9jbGFzcy5wcm9wVHlwZXMgPSB7XG4gICAgICAgIGJhc2U6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgIGJvZHlBdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm5vZGUpLCBQcm9wVHlwZXMubm9kZV0pLFxuICAgICAgICBkZWZhdWx0VGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgIGRlZmVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnM6IFByb3BUeXBlcy5ib29sLFxuICAgICAgICBodG1sQXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgbGluazogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgICAgIG1ldGE6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuICAgICAgICBub3NjcmlwdDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgICAgIG9uQ2hhbmdlQ2xpZW50U3RhdGU6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBzY3JpcHQ6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuICAgICAgICBzdHlsZTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgICAgIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICB0aXRsZUF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgIHRpdGxlVGVtcGxhdGU6IFByb3BUeXBlcy5zdHJpbmdcbiAgICB9LCBfY2xhc3MuZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBkZWZlcjogdHJ1ZSxcbiAgICAgICAgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnM6IHRydWVcbiAgICB9LCBfY2xhc3MucGVlayA9IENvbXBvbmVudC5wZWVrLCBfY2xhc3MucmV3aW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWFwcGVkU3RhdGUgPSBDb21wb25lbnQucmV3aW5kKCk7XG4gICAgICAgIGlmICghbWFwcGVkU3RhdGUpIHtcbiAgICAgICAgICAgIC8vIHByb3ZpZGUgZmFsbGJhY2sgaWYgbWFwcGVkU3RhdGUgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgICBtYXBwZWRTdGF0ZSA9IG1hcFN0YXRlT25TZXJ2ZXIoe1xuICAgICAgICAgICAgICAgIGJhc2VUYWc6IFtdLFxuICAgICAgICAgICAgICAgIGJvZHlBdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICAgICAgICBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlczoge30sXG4gICAgICAgICAgICAgICAgbGlua1RhZ3M6IFtdLFxuICAgICAgICAgICAgICAgIG1ldGFUYWdzOiBbXSxcbiAgICAgICAgICAgICAgICBub3NjcmlwdFRhZ3M6IFtdLFxuICAgICAgICAgICAgICAgIHNjcmlwdFRhZ3M6IFtdLFxuICAgICAgICAgICAgICAgIHN0eWxlVGFnczogW10sXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgdGl0bGVBdHRyaWJ1dGVzOiB7fVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFwcGVkU3RhdGU7XG4gICAgfSwgX3RlbXA7XG59O1xuXG52YXIgTnVsbENvbXBvbmVudCA9IGZ1bmN0aW9uIE51bGxDb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgSGVsbWV0U2lkZUVmZmVjdHMgPSB3aXRoU2lkZUVmZmVjdChyZWR1Y2VQcm9wc1RvU3RhdGUsIGhhbmRsZUNsaWVudFN0YXRlQ2hhbmdlLCBtYXBTdGF0ZU9uU2VydmVyKShOdWxsQ29tcG9uZW50KTtcblxudmFyIEhlbG1ldEV4cG9ydCA9IEhlbG1ldChIZWxtZXRTaWRlRWZmZWN0cyk7XG5IZWxtZXRFeHBvcnQucmVuZGVyU3RhdGljID0gSGVsbWV0RXhwb3J0LnJld2luZDtcblxuZXhwb3J0IGRlZmF1bHQgSGVsbWV0RXhwb3J0O1xuZXhwb3J0IHsgSGVsbWV0RXhwb3J0IGFzIEhlbG1ldCB9O1xuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc2VydmVyX2NvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG4vLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nXG4vLyBpc3N1ZXMgaW4gREVWIGJ1aWxkcy5cblxudmFyIGVuYWJsZURlYnVnVHJhY2luZyA9IGZhbHNlOyAvLyBUcmFjayB3aGljaCBGaWJlcihzKSBzY2hlZHVsZSByZW5kZXIgd29yay5cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgU3VzcGVuc2VMaXN0ID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTgrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQ29uY3VycmVudE1vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTgrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VMaXN0KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbn1cblxuZXhwb3J0cy5Db250ZXh0Q29uc3VtZXIgPSBDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IENvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuRWxlbWVudCA9IEVsZW1lbnQ7XG5leHBvcnRzLkZvcndhcmRSZWYgPSBGb3J3YXJkUmVmO1xuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuZXhwb3J0cy5MYXp5ID0gTGF6eTtcbmV4cG9ydHMuTWVtbyA9IE1lbW87XG5leHBvcnRzLlBvcnRhbCA9IFBvcnRhbDtcbmV4cG9ydHMuUHJvZmlsZXIgPSBQcm9maWxlcjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFN0cmljdE1vZGU7XG5leHBvcnRzLlN1c3BlbnNlID0gU3VzcGVuc2U7XG5leHBvcnRzLlN1c3BlbnNlTGlzdCA9IFN1c3BlbnNlTGlzdDtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1N1c3BlbnNlTGlzdCA9IGlzU3VzcGVuc2VMaXN0O1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0IHtjcmVhdGVFbGVtZW50LENvbXBvbmVudH1mcm9tJ3JlYWN0JztpbXBvcnQge2ZpbmRET01Ob2RlfWZyb20ncmVhY3QtZG9tJztmdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG5cbiAgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufS8qKlxuICogQ2hlY2sgd2hldGhlciBzb21lIERPTSBub2RlIGlzIG91ciBDb21wb25lbnQncyBub2RlLlxuICovXG5mdW5jdGlvbiBpc05vZGVGb3VuZChjdXJyZW50LCBjb21wb25lbnROb2RlLCBpZ25vcmVDbGFzcykge1xuICBpZiAoY3VycmVudCA9PT0gY29tcG9uZW50Tm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIFNWRyA8dXNlLz4gZWxlbWVudHMgZG8gbm90IHRlY2huaWNhbGx5IHJlc2lkZSBpbiB0aGUgcmVuZGVyZWQgRE9NLCBzb1xuICAvLyB0aGV5IGRvIG5vdCBoYXZlIGNsYXNzTGlzdCBkaXJlY3RseSwgYnV0IHRoZXkgb2ZmZXIgYSBsaW5rIHRvIHRoZWlyXG4gIC8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudCwgd2hpY2ggY2FuIGhhdmUgY2xhc3NMaXN0LiBUaGlzIGV4dHJhIGNoZWNrIGlzIGZvclxuICAvLyB0aGF0IGNhc2UuXG4gIC8vIFNlZTogaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvc3RydWN0Lmh0bWwjSW50ZXJmYWNlU1ZHVXNlRWxlbWVudFxuICAvLyBEaXNjdXNzaW9uOiBodHRwczovL2dpdGh1Yi5jb20vUG9tYXgvcmVhY3Qtb25jbGlja291dHNpZGUvcHVsbC8xN1xuXG5cbiAgaWYgKGN1cnJlbnQuY29ycmVzcG9uZGluZ0VsZW1lbnQpIHtcbiAgICByZXR1cm4gY3VycmVudC5jb3JyZXNwb25kaW5nRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoaWdub3JlQ2xhc3MpO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGlnbm9yZUNsYXNzKTtcbn1cbi8qKlxuICogVHJ5IHRvIGZpbmQgb3VyIG5vZGUgaW4gYSBoaWVyYXJjaHkgb2Ygbm9kZXMsIHJldHVybmluZyB0aGUgZG9jdW1lbnRcbiAqIG5vZGUgYXMgaGlnaGVzdCBub2RlIGlmIG91ciBub2RlIGlzIG5vdCBmb3VuZCBpbiB0aGUgcGF0aCB1cC5cbiAqL1xuXG5mdW5jdGlvbiBmaW5kSGlnaGVzdChjdXJyZW50LCBjb21wb25lbnROb2RlLCBpZ25vcmVDbGFzcykge1xuICBpZiAoY3VycmVudCA9PT0gY29tcG9uZW50Tm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIHNvdXJjZT1sb2NhbCB0aGVuIHRoaXMgZXZlbnQgY2FtZSBmcm9tICdzb21ld2hlcmUnXG4gIC8vIGluc2lkZSBhbmQgc2hvdWxkIGJlIGlnbm9yZWQuIFdlIGNvdWxkIGhhbmRsZSB0aGlzIHdpdGhcbiAgLy8gYSBsYXllcmVkIGFwcHJvYWNoLCB0b28sIGJ1dCB0aGF0IHJlcXVpcmVzIGdvaW5nIGJhY2sgdG9cbiAgLy8gdGhpbmtpbmcgaW4gdGVybXMgb2YgRG9tIG5vZGUgbmVzdGluZywgcnVubmluZyBjb3VudGVyXG4gIC8vIHRvIFJlYWN0J3MgJ3lvdSBzaG91bGRuJ3QgY2FyZSBhYm91dCB0aGUgRE9NJyBwaGlsb3NvcGh5LlxuICAvLyBBbHNvIGNvdmVyIHNoYWRvd1Jvb3Qgbm9kZSBieSBjaGVja2luZyBjdXJyZW50Lmhvc3RcblxuXG4gIHdoaWxlIChjdXJyZW50LnBhcmVudE5vZGUgfHwgY3VycmVudC5ob3N0KSB7XG4gICAgLy8gT25seSBjaGVjayBub3JtYWwgbm9kZSB3aXRob3V0IHNoYWRvd1Jvb3RcbiAgICBpZiAoY3VycmVudC5wYXJlbnROb2RlICYmIGlzTm9kZUZvdW5kKGN1cnJlbnQsIGNvbXBvbmVudE5vZGUsIGlnbm9yZUNsYXNzKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZSB8fCBjdXJyZW50Lmhvc3Q7XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGJyb3dzZXIgc2Nyb2xsYmFyIHdhcyBjbGlja2VkXG4gKi9cblxuZnVuY3Rpb24gY2xpY2tlZFNjcm9sbGJhcihldnQpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCA8PSBldnQuY2xpZW50WCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IDw9IGV2dC5jbGllbnRZO1xufS8vIGlkZWFsbHkgd2lsbCBnZXQgcmVwbGFjZWQgd2l0aCBleHRlcm5hbCBkZXBcbi8vIHdoZW4gcmFmcmV4L2RldGVjdC1wYXNzaXZlLWV2ZW50cyM0IGFuZCByYWZyZXgvZGV0ZWN0LXBhc3NpdmUtZXZlbnRzIzUgZ2V0IG1lcmdlZCBpblxudmFyIHRlc3RQYXNzaXZlRXZlbnRTdXBwb3J0ID0gZnVuY3Rpb24gdGVzdFBhc3NpdmVFdmVudFN1cHBvcnQoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGFzc2l2ZSA9IGZhbHNlO1xuICB2YXIgb3B0aW9ucyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBwYXNzaXZlID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZUV2ZW50U3VwcG9ydCcsIG5vb3AsIG9wdGlvbnMpO1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmVFdmVudFN1cHBvcnQnLCBub29wLCBvcHRpb25zKTtcbiAgcmV0dXJuIHBhc3NpdmU7XG59O2Z1bmN0aW9uIGF1dG9JbmMoc2VlZCkge1xuICBpZiAoc2VlZCA9PT0gdm9pZCAwKSB7XG4gICAgc2VlZCA9IDA7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiArK3NlZWQ7XG4gIH07XG59XG5cbnZhciB1aWQgPSBhdXRvSW5jKCk7dmFyIHBhc3NpdmVFdmVudFN1cHBvcnQ7XG52YXIgaGFuZGxlcnNNYXAgPSB7fTtcbnZhciBlbmFibGVkSW5zdGFuY2VzID0ge307XG52YXIgdG91Y2hFdmVudHMgPSBbJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJ107XG52YXIgSUdOT1JFX0NMQVNTX05BTUUgPSAnaWdub3JlLXJlYWN0LW9uY2xpY2tvdXRzaWRlJztcbi8qKlxuICogT3B0aW9ucyBmb3IgYWRkRXZlbnRIYW5kbGVyIGFuZCByZW1vdmVFdmVudEhhbmRsZXJcbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudEhhbmRsZXJPcHRpb25zKGluc3RhbmNlLCBldmVudE5hbWUpIHtcbiAgdmFyIGhhbmRsZXJPcHRpb25zID0ge307XG4gIHZhciBpc1RvdWNoRXZlbnQgPSB0b3VjaEV2ZW50cy5pbmRleE9mKGV2ZW50TmFtZSkgIT09IC0xO1xuXG4gIGlmIChpc1RvdWNoRXZlbnQgJiYgcGFzc2l2ZUV2ZW50U3VwcG9ydCkge1xuICAgIGhhbmRsZXJPcHRpb25zLnBhc3NpdmUgPSAhaW5zdGFuY2UucHJvcHMucHJldmVudERlZmF1bHQ7XG4gIH1cblxuICByZXR1cm4gaGFuZGxlck9wdGlvbnM7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHRoZSBIT0MgZnVuY3Rpb24gdGhhdCB5b3UnbGwgdXNlXG4gKiBpbiBvcmRlciB0byBpbXBhcnQgb25PdXRzaWRlQ2xpY2sgbGlzdGVuaW5nIHRvIGFuXG4gKiBhcmJpdHJhcnkgY29tcG9uZW50LiBJdCBnZXRzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZVxuICogYm9vdHN0cmFwcGluZyBjb2RlIHRvIHlpZWxkIGFuIGluc3RhbmNlIG9mIHRoZVxuICogb25DbGlja091dHNpZGVIT0MgZnVuY3Rpb24gZGVmaW5lZCBpbnNpZGUgc2V0dXBIT0MoKS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9uQ2xpY2tPdXRzaWRlSE9DKFdyYXBwZWRDb21wb25lbnQsIGNvbmZpZykge1xuICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICB2YXIgY29tcG9uZW50TmFtZSA9IFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICByZXR1cm4gX3RlbXAgPSBfY2xhc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBfaW5oZXJpdHNMb29zZShvbkNsaWNrT3V0c2lkZSwgX0NvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBvbkNsaWNrT3V0c2lkZShwcm9wcykge1xuICAgICAgdmFyIF90aGlzO1xuXG4gICAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcblxuICAgICAgX3RoaXMuX19vdXRzaWRlQ2xpY2tIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmICh0eXBlb2YgX3RoaXMuX19jbGlja091dHNpZGVIYW5kbGVyUHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIF90aGlzLl9fY2xpY2tPdXRzaWRlSGFuZGxlclByb3AoZXZlbnQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGluc3RhbmNlID0gX3RoaXMuZ2V0SW5zdGFuY2UoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLnByb3BzLmhhbmRsZUNsaWNrT3V0c2lkZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGluc3RhbmNlLnByb3BzLmhhbmRsZUNsaWNrT3V0c2lkZShldmVudCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5oYW5kbGVDbGlja091dHNpZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpbnN0YW5jZS5oYW5kbGVDbGlja091dHNpZGUoZXZlbnQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyYXBwZWRDb21wb25lbnQ6IFwiICsgY29tcG9uZW50TmFtZSArIFwiIGxhY2tzIGEgaGFuZGxlQ2xpY2tPdXRzaWRlKGV2ZW50KSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBvdXRzaWRlIGNsaWNrIGV2ZW50cy5cIik7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5fX2dldENvbXBvbmVudE5vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IF90aGlzLmdldEluc3RhbmNlKCk7XG5cbiAgICAgICAgaWYgKGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnLnNldENsaWNrT3V0c2lkZVJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBjb25maWcuc2V0Q2xpY2tPdXRzaWRlUmVmKCkoaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zZXRDbGlja091dHNpZGVSZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc2V0Q2xpY2tPdXRzaWRlUmVmKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmluZERPTU5vZGUoaW5zdGFuY2UpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuZW5hYmxlT25DbGlja091dHNpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IGVuYWJsZWRJbnN0YW5jZXNbX3RoaXMuX3VpZF0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHBhc3NpdmVFdmVudFN1cHBvcnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcGFzc2l2ZUV2ZW50U3VwcG9ydCA9IHRlc3RQYXNzaXZlRXZlbnRTdXBwb3J0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBlbmFibGVkSW5zdGFuY2VzW190aGlzLl91aWRdID0gdHJ1ZTtcbiAgICAgICAgdmFyIGV2ZW50cyA9IF90aGlzLnByb3BzLmV2ZW50VHlwZXM7XG5cbiAgICAgICAgaWYgKCFldmVudHMuZm9yRWFjaCkge1xuICAgICAgICAgIGV2ZW50cyA9IFtldmVudHNdO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFuZGxlcnNNYXBbX3RoaXMuX3VpZF0gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoX3RoaXMuY29tcG9uZW50Tm9kZSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICAgIGlmIChfdGhpcy5pbml0VGltZVN0YW1wID4gZXZlbnQudGltZVN0YW1wKSByZXR1cm47XG5cbiAgICAgICAgICBpZiAoX3RoaXMucHJvcHMucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF90aGlzLnByb3BzLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF90aGlzLnByb3BzLmV4Y2x1ZGVTY3JvbGxiYXIgJiYgY2xpY2tlZFNjcm9sbGJhcihldmVudCkpIHJldHVybjtcbiAgICAgICAgICB2YXIgY3VycmVudCA9IGV2ZW50LmNvbXBvc2VkICYmIGV2ZW50LmNvbXBvc2VkUGF0aCAmJiBldmVudC5jb21wb3NlZFBhdGgoKS5zaGlmdCgpIHx8IGV2ZW50LnRhcmdldDtcblxuICAgICAgICAgIGlmIChmaW5kSGlnaGVzdChjdXJyZW50LCBfdGhpcy5jb21wb25lbnROb2RlLCBfdGhpcy5wcm9wcy5vdXRzaWRlQ2xpY2tJZ25vcmVDbGFzcykgIT09IGRvY3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMuX19vdXRzaWRlQ2xpY2tIYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgfTtcblxuICAgICAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXJzTWFwW190aGlzLl91aWRdLCBnZXRFdmVudEhhbmRsZXJPcHRpb25zKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBldmVudE5hbWUpKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5kaXNhYmxlT25DbGlja091dHNpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlbGV0ZSBlbmFibGVkSW5zdGFuY2VzW190aGlzLl91aWRdO1xuICAgICAgICB2YXIgZm4gPSBoYW5kbGVyc01hcFtfdGhpcy5fdWlkXTtcblxuICAgICAgICBpZiAoZm4gJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHZhciBldmVudHMgPSBfdGhpcy5wcm9wcy5ldmVudFR5cGVzO1xuXG4gICAgICAgICAgaWYgKCFldmVudHMuZm9yRWFjaCkge1xuICAgICAgICAgICAgZXZlbnRzID0gW2V2ZW50c107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmbiwgZ2V0RXZlbnRIYW5kbGVyT3B0aW9ucyhfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgZXZlbnROYW1lKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZGVsZXRlIGhhbmRsZXJzTWFwW190aGlzLl91aWRdO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5nZXRSZWYgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5pbnN0YW5jZVJlZiA9IHJlZjtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl91aWQgPSB1aWQoKTtcbiAgICAgIF90aGlzLmluaXRUaW1lU3RhbXAgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWNjZXNzIHRoZSBXcmFwcGVkQ29tcG9uZW50J3MgaW5zdGFuY2UuXG4gICAgICovXG5cblxuICAgIHZhciBfcHJvdG8gPSBvbkNsaWNrT3V0c2lkZS5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8uZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbiBnZXRJbnN0YW5jZSgpIHtcbiAgICAgIGlmIChXcmFwcGVkQ29tcG9uZW50LnByb3RvdHlwZSAmJiAhV3JhcHBlZENvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZiA9IHRoaXMuaW5zdGFuY2VSZWY7XG4gICAgICByZXR1cm4gcmVmLmdldEluc3RhbmNlID8gcmVmLmdldEluc3RhbmNlKCkgOiByZWY7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBjbGljayBsaXN0ZW5lcnMgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQsXG4gICAgICogbGlua2VkIHRvIHRoaXMgY29tcG9uZW50J3Mgc3RhdGUuXG4gICAgICovXG4gICAgX3Byb3RvLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAvLyBJZiB3ZSBhcmUgaW4gYW4gZW52aXJvbm1lbnQgd2l0aG91dCBhIERPTSBzdWNoXG4gICAgICAvLyBhcyBzaGFsbG93IHJlbmRlcmluZyBvciBzbmFwc2hvdHMgdGhlbiB3ZSBleGl0XG4gICAgICAvLyBlYXJseSB0byBwcmV2ZW50IGFueSB1bmhhbmRsZWQgZXJyb3JzIGJlaW5nIHRocm93bi5cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8ICFkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5nZXRJbnN0YW5jZSgpO1xuXG4gICAgICBpZiAoY29uZmlnICYmIHR5cGVvZiBjb25maWcuaGFuZGxlQ2xpY2tPdXRzaWRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuX19jbGlja091dHNpZGVIYW5kbGVyUHJvcCA9IGNvbmZpZy5oYW5kbGVDbGlja091dHNpZGUoaW5zdGFuY2UpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fX2NsaWNrT3V0c2lkZUhhbmRsZXJQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JhcHBlZENvbXBvbmVudDogXCIgKyBjb21wb25lbnROYW1lICsgXCIgbGFja3MgYSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBvdXRzaWRlIGNsaWNrIGV2ZW50cyBzcGVjaWZpZWQgYnkgdGhlIGhhbmRsZUNsaWNrT3V0c2lkZSBjb25maWcgb3B0aW9uLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbXBvbmVudE5vZGUgPSB0aGlzLl9fZ2V0Q29tcG9uZW50Tm9kZSgpOyAvLyByZXR1cm4gZWFybHkgc28gd2UgZG9udCBpbml0aWF0ZSBvbkNsaWNrT3V0c2lkZVxuXG4gICAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlT25DbGlja091dHNpZGUpIHJldHVybjtcbiAgICAgIHRoaXMuZW5hYmxlT25DbGlja091dHNpZGUoKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50Tm9kZSA9IHRoaXMuX19nZXRDb21wb25lbnROb2RlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgZG9jdW1lbnQncyBldmVudCBsaXN0ZW5lcnMgZm9yIHRoaXMgY29tcG9uZW50XG4gICAgICovXG4gICAgO1xuXG4gICAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLmRpc2FibGVPbkNsaWNrT3V0c2lkZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYW4gYmUgY2FsbGVkIHRvIGV4cGxpY2l0bHkgZW5hYmxlIGV2ZW50IGxpc3RlbmluZ1xuICAgICAqIGZvciBjbGlja3MgYW5kIHRvdWNoZXMgb3V0c2lkZSBvZiB0aGlzIGVsZW1lbnQuXG4gICAgICovXG4gICAgO1xuXG4gICAgLyoqXG4gICAgICogUGFzcy10aHJvdWdoIHJlbmRlclxuICAgICAqL1xuICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgICAgX3RoaXMkcHJvcHMuZXhjbHVkZVNjcm9sbGJhcjtcbiAgICAgICAgICB2YXIgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfdGhpcyRwcm9wcywgW1wiZXhjbHVkZVNjcm9sbGJhclwiXSk7XG5cbiAgICAgIGlmIChXcmFwcGVkQ29tcG9uZW50LnByb3RvdHlwZSAmJiBXcmFwcGVkQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KSB7XG4gICAgICAgIHByb3BzLnJlZiA9IHRoaXMuZ2V0UmVmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcHMud3JhcHBlZFJlZiA9IHRoaXMuZ2V0UmVmO1xuICAgICAgfVxuXG4gICAgICBwcm9wcy5kaXNhYmxlT25DbGlja091dHNpZGUgPSB0aGlzLmRpc2FibGVPbkNsaWNrT3V0c2lkZTtcbiAgICAgIHByb3BzLmVuYWJsZU9uQ2xpY2tPdXRzaWRlID0gdGhpcy5lbmFibGVPbkNsaWNrT3V0c2lkZTtcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIHByb3BzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG9uQ2xpY2tPdXRzaWRlO1xuICB9KENvbXBvbmVudCksIF9jbGFzcy5kaXNwbGF5TmFtZSA9IFwiT25DbGlja091dHNpZGUoXCIgKyBjb21wb25lbnROYW1lICsgXCIpXCIsIF9jbGFzcy5kZWZhdWx0UHJvcHMgPSB7XG4gICAgZXZlbnRUeXBlczogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLFxuICAgIGV4Y2x1ZGVTY3JvbGxiYXI6IGNvbmZpZyAmJiBjb25maWcuZXhjbHVkZVNjcm9sbGJhciB8fCBmYWxzZSxcbiAgICBvdXRzaWRlQ2xpY2tJZ25vcmVDbGFzczogSUdOT1JFX0NMQVNTX05BTUUsXG4gICAgcHJldmVudERlZmF1bHQ6IGZhbHNlLFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZmFsc2VcbiAgfSwgX2NsYXNzLmdldENsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBXcmFwcGVkQ29tcG9uZW50LmdldENsYXNzID8gV3JhcHBlZENvbXBvbmVudC5nZXRDbGFzcygpIDogV3JhcHBlZENvbXBvbmVudDtcbiAgfSwgX3RlbXA7XG59ZXhwb3J0IGRlZmF1bHQgb25DbGlja091dHNpZGVIT0M7ZXhwb3J0e0lHTk9SRV9DTEFTU19OQU1FfTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzdHlsZVNpbmdsZXRvbiB9IGZyb20gJ3JlYWN0LXN0eWxlLXNpbmdsZXRvbic7XG5pbXBvcnQgeyBmdWxsV2lkdGhDbGFzc05hbWUsIHplcm9SaWdodENsYXNzTmFtZSwgbm9TY3JvbGxiYXJzQ2xhc3NOYW1lLCByZW1vdmVkQmFyU2l6ZVZhcmlhYmxlIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0R2FwV2lkdGggfSBmcm9tICcuL3V0aWxzJztcbnZhciBTdHlsZSA9IHN0eWxlU2luZ2xldG9uKCk7XG4vLyBpbXBvcnRhbnQgdGlwIC0gb25jZSB3ZSBtZWFzdXJlIHNjcm9sbEJhciB3aWR0aCBhbmQgcmVtb3ZlIHRoZW1cbi8vIHdlIGNvdWxkIG5vdCByZXBlYXQgdGhpcyBvcGVyYXRpb25cbi8vIHRodXMgd2UgYXJlIHVzaW5nIHN0eWxlLXNpbmdsZXRvbiAtIG9ubHkgdGhlIGZpcnN0IFwieWV0IGNvcnJlY3RcIiBzdHlsZSB3aWxsIGJlIGFwcGxpZWQuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24gKF9hLCBhbGxvd1JlbGF0aXZlLCBnYXBNb2RlLCBpbXBvcnRhbnQpIHtcbiAgICB2YXIgbGVmdCA9IF9hLmxlZnQsIHRvcCA9IF9hLnRvcCwgcmlnaHQgPSBfYS5yaWdodCwgZ2FwID0gX2EuZ2FwO1xuICAgIGlmIChnYXBNb2RlID09PSB2b2lkIDApIHsgZ2FwTW9kZSA9ICdtYXJnaW4nOyB9XG4gICAgcmV0dXJuIFwiXFxuICAuXCIuY29uY2F0KG5vU2Nyb2xsYmFyc0NsYXNzTmFtZSwgXCIge1xcbiAgIG92ZXJmbG93OiBoaWRkZW4gXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgIHBhZGRpbmctcmlnaHQ6IFwiKS5jb25jYXQoZ2FwLCBcInB4IFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gIH1cXG4gIGJvZHkge1xcbiAgICBvdmVyZmxvdzogaGlkZGVuIFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjtcXG4gICAgXCIpLmNvbmNhdChbXG4gICAgICAgIGFsbG93UmVsYXRpdmUgJiYgXCJwb3NpdGlvbjogcmVsYXRpdmUgXCIuY29uY2F0KGltcG9ydGFudCwgXCI7XCIpLFxuICAgICAgICBnYXBNb2RlID09PSAnbWFyZ2luJyAmJlxuICAgICAgICAgICAgXCJcXG4gICAgcGFkZGluZy1sZWZ0OiBcIi5jb25jYXQobGVmdCwgXCJweDtcXG4gICAgcGFkZGluZy10b3A6IFwiKS5jb25jYXQodG9wLCBcInB4O1xcbiAgICBwYWRkaW5nLXJpZ2h0OiBcIikuY29uY2F0KHJpZ2h0LCBcInB4O1xcbiAgICBtYXJnaW4tbGVmdDowO1xcbiAgICBtYXJnaW4tdG9wOjA7XFxuICAgIG1hcmdpbi1yaWdodDogXCIpLmNvbmNhdChnYXAsIFwicHggXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgICBcIiksXG4gICAgICAgIGdhcE1vZGUgPT09ICdwYWRkaW5nJyAmJiBcInBhZGRpbmctcmlnaHQ6IFwiLmNvbmNhdChnYXAsIFwicHggXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1wiKSxcbiAgICBdXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmpvaW4oJycpLCBcIlxcbiAgfVxcbiAgXFxuICAuXCIpLmNvbmNhdCh6ZXJvUmlnaHRDbGFzc05hbWUsIFwiIHtcXG4gICAgcmlnaHQ6IFwiKS5jb25jYXQoZ2FwLCBcInB4IFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gIH1cXG4gIFxcbiAgLlwiKS5jb25jYXQoZnVsbFdpZHRoQ2xhc3NOYW1lLCBcIiB7XFxuICAgIG1hcmdpbi1yaWdodDogXCIpLmNvbmNhdChnYXAsIFwicHggXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgfVxcbiAgXFxuICAuXCIpLmNvbmNhdCh6ZXJvUmlnaHRDbGFzc05hbWUsIFwiIC5cIikuY29uY2F0KHplcm9SaWdodENsYXNzTmFtZSwgXCIge1xcbiAgICByaWdodDogMCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICB9XFxuICBcXG4gIC5cIikuY29uY2F0KGZ1bGxXaWR0aENsYXNzTmFtZSwgXCIgLlwiKS5jb25jYXQoZnVsbFdpZHRoQ2xhc3NOYW1lLCBcIiB7XFxuICAgIG1hcmdpbi1yaWdodDogMCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICB9XFxuICBcXG4gIGJvZHkge1xcbiAgICBcIikuY29uY2F0KHJlbW92ZWRCYXJTaXplVmFyaWFibGUsIFwiOiBcIikuY29uY2F0KGdhcCwgXCJweDtcXG4gIH1cXG5cIik7XG59O1xuLyoqXG4gKiBSZW1vdmVzIHBhZ2Ugc2Nyb2xsYmFyIGFuZCBibG9ja3MgcGFnZSBzY3JvbGwgd2hlbiBtb3VudGVkXG4gKi9cbmV4cG9ydCB2YXIgUmVtb3ZlU2Nyb2xsQmFyID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgdmFyIG5vUmVsYXRpdmUgPSBwcm9wcy5ub1JlbGF0aXZlLCBub0ltcG9ydGFudCA9IHByb3BzLm5vSW1wb3J0YW50LCBfYSA9IHByb3BzLmdhcE1vZGUsIGdhcE1vZGUgPSBfYSA9PT0gdm9pZCAwID8gJ21hcmdpbicgOiBfYTtcbiAgICAvKlxuICAgICBnYXAgd2lsbCBiZSBtZWFzdXJlZCBvbiBldmVyeSBjb21wb25lbnQgbW91bnRcbiAgICAgaG93ZXZlciBpdCB3aWxsIGJlIHVzZWQgb25seSBieSB0aGUgXCJmaXJzdFwiIGludm9jYXRpb25cbiAgICAgZHVlIHRvIHNpbmdsZXRvbiBuYXR1cmUgb2YgPFN0eWxlXG4gICAgICovXG4gICAgdmFyIGdhcCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0R2FwV2lkdGgoZ2FwTW9kZSk7IH0sIFtnYXBNb2RlXSk7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3R5bGUsIHsgc3R5bGVzOiBnZXRTdHlsZXMoZ2FwLCAhbm9SZWxhdGl2ZSwgZ2FwTW9kZSwgIW5vSW1wb3J0YW50ID8gJyFpbXBvcnRhbnQnIDogJycpIH0pO1xufTtcbiIsImV4cG9ydCB2YXIgemVyb1JpZ2h0Q2xhc3NOYW1lID0gJ3JpZ2h0LXNjcm9sbC1iYXItcG9zaXRpb24nO1xuZXhwb3J0IHZhciBmdWxsV2lkdGhDbGFzc05hbWUgPSAnd2lkdGgtYmVmb3JlLXNjcm9sbC1iYXInO1xuZXhwb3J0IHZhciBub1Njcm9sbGJhcnNDbGFzc05hbWUgPSAnd2l0aC1zY3JvbGwtYmFycy1oaWRkZW4nO1xuLyoqXG4gKiBOYW1lIG9mIGEgQ1NTIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIGFtb3VudCBvZiBcImhpZGRlblwiIHNjcm9sbGJhclxuICogISBtaWdodCBiZSB1bmRlZmluZWQgISB1c2Ugd2lsbCBmYWxsYmFjayFcbiAqL1xuZXhwb3J0IHZhciByZW1vdmVkQmFyU2l6ZVZhcmlhYmxlID0gJy0tcmVtb3ZlZC1ib2R5LXNjcm9sbC1iYXItc2l6ZSc7XG4iLCJpbXBvcnQgeyBSZW1vdmVTY3JvbGxCYXIgfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQgeyB6ZXJvUmlnaHRDbGFzc05hbWUsIGZ1bGxXaWR0aENsYXNzTmFtZSwgbm9TY3JvbGxiYXJzQ2xhc3NOYW1lLCByZW1vdmVkQmFyU2l6ZVZhcmlhYmxlIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0R2FwV2lkdGggfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB7IFJlbW92ZVNjcm9sbEJhciwgemVyb1JpZ2h0Q2xhc3NOYW1lLCBmdWxsV2lkdGhDbGFzc05hbWUsIG5vU2Nyb2xsYmFyc0NsYXNzTmFtZSwgcmVtb3ZlZEJhclNpemVWYXJpYWJsZSwgZ2V0R2FwV2lkdGgsIH07XG4iLCJleHBvcnQgdmFyIHplcm9HYXAgPSB7XG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgZ2FwOiAwLFxufTtcbnZhciBwYXJzZSA9IGZ1bmN0aW9uICh4KSB7IHJldHVybiBwYXJzZUludCh4IHx8ICcnLCAxMCkgfHwgMDsgfTtcbnZhciBnZXRPZmZzZXQgPSBmdW5jdGlvbiAoZ2FwTW9kZSkge1xuICAgIHZhciBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpO1xuICAgIHZhciBsZWZ0ID0gY3NbZ2FwTW9kZSA9PT0gJ3BhZGRpbmcnID8gJ3BhZGRpbmdMZWZ0JyA6ICdtYXJnaW5MZWZ0J107XG4gICAgdmFyIHRvcCA9IGNzW2dhcE1vZGUgPT09ICdwYWRkaW5nJyA/ICdwYWRkaW5nVG9wJyA6ICdtYXJnaW5Ub3AnXTtcbiAgICB2YXIgcmlnaHQgPSBjc1tnYXBNb2RlID09PSAncGFkZGluZycgPyAncGFkZGluZ1JpZ2h0JyA6ICdtYXJnaW5SaWdodCddO1xuICAgIHJldHVybiBbcGFyc2UobGVmdCksIHBhcnNlKHRvcCksIHBhcnNlKHJpZ2h0KV07XG59O1xuZXhwb3J0IHZhciBnZXRHYXBXaWR0aCA9IGZ1bmN0aW9uIChnYXBNb2RlKSB7XG4gICAgaWYgKGdhcE1vZGUgPT09IHZvaWQgMCkgeyBnYXBNb2RlID0gJ21hcmdpbic7IH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHplcm9HYXA7XG4gICAgfVxuICAgIHZhciBvZmZzZXRzID0gZ2V0T2Zmc2V0KGdhcE1vZGUpO1xuICAgIHZhciBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHZhciB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IG9mZnNldHNbMF0sXG4gICAgICAgIHRvcDogb2Zmc2V0c1sxXSxcbiAgICAgICAgcmlnaHQ6IG9mZnNldHNbMl0sXG4gICAgICAgIGdhcDogTWF0aC5tYXgoMCwgd2luZG93V2lkdGggLSBkb2N1bWVudFdpZHRoICsgb2Zmc2V0c1syXSAtIG9mZnNldHNbMF0pLFxuICAgIH07XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlbW92ZVNjcm9sbCB9IGZyb20gJy4vVUknO1xuaW1wb3J0IFNpZGVDYXIgZnJvbSAnLi9zaWRlY2FyJztcbnZhciBSZWFjdFJlbW92ZVNjcm9sbCA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHsgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlbW92ZVNjcm9sbCwgX19hc3NpZ24oe30sIHByb3BzLCB7IHJlZjogcmVmLCBzaWRlQ2FyOiBTaWRlQ2FyIH0pKSk7IH0pO1xuUmVhY3RSZW1vdmVTY3JvbGwuY2xhc3NOYW1lcyA9IFJlbW92ZVNjcm9sbC5jbGFzc05hbWVzO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3RSZW1vdmVTY3JvbGw7XG4iLCJpbXBvcnQgeyBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZW1vdmVTY3JvbGxCYXIgfSBmcm9tICdyZWFjdC1yZW1vdmUtc2Nyb2xsLWJhcic7XG5pbXBvcnQgeyBzdHlsZVNpbmdsZXRvbiB9IGZyb20gJ3JlYWN0LXN0eWxlLXNpbmdsZXRvbic7XG5pbXBvcnQgeyBub25QYXNzaXZlIH0gZnJvbSAnLi9hZ2dyZXNpdmVDYXB0dXJlJztcbmltcG9ydCB7IGhhbmRsZVNjcm9sbCwgbG9jYXRpb25Db3VsZEJlU2Nyb2xsZWQgfSBmcm9tICcuL2hhbmRsZVNjcm9sbCc7XG5leHBvcnQgdmFyIGdldFRvdWNoWFkgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2NoYW5nZWRUb3VjaGVzJyBpbiBldmVudCA/IFtldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYLCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZXSA6IFswLCAwXTtcbn07XG5leHBvcnQgdmFyIGdldERlbHRhWFkgPSBmdW5jdGlvbiAoZXZlbnQpIHsgcmV0dXJuIFtldmVudC5kZWx0YVgsIGV2ZW50LmRlbHRhWV07IH07XG52YXIgZXh0cmFjdFJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICByZXR1cm4gcmVmICYmICdjdXJyZW50JyBpbiByZWYgPyByZWYuY3VycmVudCA6IHJlZjtcbn07XG52YXIgZGVsdGFDb21wYXJlID0gZnVuY3Rpb24gKHgsIHkpIHsgcmV0dXJuIHhbMF0gPT09IHlbMF0gJiYgeFsxXSA9PT0geVsxXTsgfTtcbnZhciBnZW5lcmF0ZVN0eWxlID0gZnVuY3Rpb24gKGlkKSB7IHJldHVybiBcIlxcbiAgLmJsb2NrLWludGVyYWN0aXZpdHktXCIuY29uY2F0KGlkLCBcIiB7cG9pbnRlci1ldmVudHM6IG5vbmU7fVxcbiAgLmFsbG93LWludGVyYWN0aXZpdHktXCIpLmNvbmNhdChpZCwgXCIge3BvaW50ZXItZXZlbnRzOiBhbGw7fVxcblwiKTsgfTtcbnZhciBpZENvdW50ZXIgPSAwO1xudmFyIGxvY2tTdGFjayA9IFtdO1xuZXhwb3J0IGZ1bmN0aW9uIFJlbW92ZVNjcm9sbFNpZGVDYXIocHJvcHMpIHtcbiAgICB2YXIgc2hvdWxkUHJldmVudFF1ZXVlID0gUmVhY3QudXNlUmVmKFtdKTtcbiAgICB2YXIgdG91Y2hTdGFydFJlZiA9IFJlYWN0LnVzZVJlZihbMCwgMF0pO1xuICAgIHZhciBhY3RpdmVBeGlzID0gUmVhY3QudXNlUmVmKCk7XG4gICAgdmFyIGlkID0gUmVhY3QudXNlU3RhdGUoaWRDb3VudGVyKyspWzBdO1xuICAgIHZhciBTdHlsZSA9IFJlYWN0LnVzZVN0YXRlKHN0eWxlU2luZ2xldG9uKVswXTtcbiAgICB2YXIgbGFzdFByb3BzID0gUmVhY3QudXNlUmVmKHByb3BzKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBsYXN0UHJvcHMuY3VycmVudCA9IHByb3BzO1xuICAgIH0sIFtwcm9wc10pO1xuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChwcm9wcy5pbmVydCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKFwiYmxvY2staW50ZXJhY3Rpdml0eS1cIi5jb25jYXQoaWQpKTtcbiAgICAgICAgICAgIHZhciBhbGxvd18xID0gX19zcHJlYWRBcnJheShbcHJvcHMubG9ja1JlZi5jdXJyZW50XSwgKHByb3BzLnNoYXJkcyB8fCBbXSkubWFwKGV4dHJhY3RSZWYpLCB0cnVlKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgICAgICBhbGxvd18xLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5jbGFzc0xpc3QuYWRkKFwiYWxsb3ctaW50ZXJhY3Rpdml0eS1cIi5jb25jYXQoaWQpKTsgfSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShcImJsb2NrLWludGVyYWN0aXZpdHktXCIuY29uY2F0KGlkKSk7XG4gICAgICAgICAgICAgICAgYWxsb3dfMS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuY2xhc3NMaXN0LnJlbW92ZShcImFsbG93LWludGVyYWN0aXZpdHktXCIuY29uY2F0KGlkKSk7IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfSwgW3Byb3BzLmluZXJ0LCBwcm9wcy5sb2NrUmVmLmN1cnJlbnQsIHByb3BzLnNoYXJkc10pO1xuICAgIHZhciBzaG91bGRDYW5jZWxFdmVudCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCwgcGFyZW50KSB7XG4gICAgICAgIGlmICgndG91Y2hlcycgaW4gZXZlbnQgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiAhbGFzdFByb3BzLmN1cnJlbnQuYWxsb3dQaW5jaFpvb207XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRvdWNoID0gZ2V0VG91Y2hYWShldmVudCk7XG4gICAgICAgIHZhciB0b3VjaFN0YXJ0ID0gdG91Y2hTdGFydFJlZi5jdXJyZW50O1xuICAgICAgICB2YXIgZGVsdGFYID0gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOiB0b3VjaFN0YXJ0WzBdIC0gdG91Y2hbMF07XG4gICAgICAgIHZhciBkZWx0YVkgPSAnZGVsdGFZJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWSA6IHRvdWNoU3RhcnRbMV0gLSB0b3VjaFsxXTtcbiAgICAgICAgdmFyIGN1cnJlbnRBeGlzO1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICB2YXIgbW92ZURpcmVjdGlvbiA9IE1hdGguYWJzKGRlbHRhWCkgPiBNYXRoLmFicyhkZWx0YVkpID8gJ2gnIDogJ3YnO1xuICAgICAgICAvLyBhbGxvdyBob3Jpem9udGFsIHRvdWNoIG1vdmUgb24gUmFuZ2UgaW5wdXRzLiBUaGV5IHdpbGwgbm90IGNhdXNlIGFueSBzY3JvbGxcbiAgICAgICAgaWYgKCd0b3VjaGVzJyBpbiBldmVudCAmJiBtb3ZlRGlyZWN0aW9uID09PSAnaCcgJiYgdGFyZ2V0LnR5cGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FuQmVTY3JvbGxlZEluTWFpbkRpcmVjdGlvbiA9IGxvY2F0aW9uQ291bGRCZVNjcm9sbGVkKG1vdmVEaXJlY3Rpb24sIHRhcmdldCk7XG4gICAgICAgIGlmICghY2FuQmVTY3JvbGxlZEluTWFpbkRpcmVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbkJlU2Nyb2xsZWRJbk1haW5EaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGN1cnJlbnRBeGlzID0gbW92ZURpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRBeGlzID0gbW92ZURpcmVjdGlvbiA9PT0gJ3YnID8gJ2gnIDogJ3YnO1xuICAgICAgICAgICAgY2FuQmVTY3JvbGxlZEluTWFpbkRpcmVjdGlvbiA9IGxvY2F0aW9uQ291bGRCZVNjcm9sbGVkKG1vdmVEaXJlY3Rpb24sIHRhcmdldCk7XG4gICAgICAgICAgICAvLyBvdGhlciBheGlzIG1pZ2h0IGJlIG5vdCBzY3JvbGxhYmxlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjYW5CZVNjcm9sbGVkSW5NYWluRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhY3RpdmVBeGlzLmN1cnJlbnQgJiYgJ2NoYW5nZWRUb3VjaGVzJyBpbiBldmVudCAmJiAoZGVsdGFYIHx8IGRlbHRhWSkpIHtcbiAgICAgICAgICAgIGFjdGl2ZUF4aXMuY3VycmVudCA9IGN1cnJlbnRBeGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VycmVudEF4aXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjYW5jZWxpbmdBeGlzID0gYWN0aXZlQXhpcy5jdXJyZW50IHx8IGN1cnJlbnRBeGlzO1xuICAgICAgICByZXR1cm4gaGFuZGxlU2Nyb2xsKGNhbmNlbGluZ0F4aXMsIHBhcmVudCwgZXZlbnQsIGNhbmNlbGluZ0F4aXMgPT09ICdoJyA/IGRlbHRhWCA6IGRlbHRhWSwgdHJ1ZSk7XG4gICAgfSwgW10pO1xuICAgIHZhciBzaG91bGRQcmV2ZW50ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKF9ldmVudCkge1xuICAgICAgICB2YXIgZXZlbnQgPSBfZXZlbnQ7XG4gICAgICAgIGlmICghbG9ja1N0YWNrLmxlbmd0aCB8fCBsb2NrU3RhY2tbbG9ja1N0YWNrLmxlbmd0aCAtIDFdICE9PSBTdHlsZSkge1xuICAgICAgICAgICAgLy8gbm90IHRoZSBsYXN0IGFjdGl2ZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZWx0YSA9ICdkZWx0YVknIGluIGV2ZW50ID8gZ2V0RGVsdGFYWShldmVudCkgOiBnZXRUb3VjaFhZKGV2ZW50KTtcbiAgICAgICAgdmFyIHNvdXJjZUV2ZW50ID0gc2hvdWxkUHJldmVudFF1ZXVlLmN1cnJlbnQuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLm5hbWUgPT09IGV2ZW50LnR5cGUgJiYgKGUudGFyZ2V0ID09PSBldmVudC50YXJnZXQgfHwgZXZlbnQudGFyZ2V0ID09PSBlLnNoYWRvd1BhcmVudCkgJiYgZGVsdGFDb21wYXJlKGUuZGVsdGEsIGRlbHRhKTsgfSlbMF07XG4gICAgICAgIC8vIHNlbGYgZXZlbnQsIGFuZCBzaG91bGQgYmUgY2FuY2VsZWRcbiAgICAgICAgaWYgKHNvdXJjZUV2ZW50ICYmIHNvdXJjZUV2ZW50LnNob3VsZCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIG91dHNpZGUgb3Igc2hhcmQgZXZlbnRcbiAgICAgICAgaWYgKCFzb3VyY2VFdmVudCkge1xuICAgICAgICAgICAgdmFyIHNoYXJkTm9kZXMgPSAobGFzdFByb3BzLmN1cnJlbnQuc2hhcmRzIHx8IFtdKVxuICAgICAgICAgICAgICAgIC5tYXAoZXh0cmFjdFJlZilcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5jb250YWlucyhldmVudC50YXJnZXQpOyB9KTtcbiAgICAgICAgICAgIHZhciBzaG91bGRTdG9wID0gc2hhcmROb2Rlcy5sZW5ndGggPiAwID8gc2hvdWxkQ2FuY2VsRXZlbnQoZXZlbnQsIHNoYXJkTm9kZXNbMF0pIDogIWxhc3RQcm9wcy5jdXJyZW50Lm5vSXNvbGF0aW9uO1xuICAgICAgICAgICAgaWYgKHNob3VsZFN0b3ApIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICB2YXIgc2hvdWxkQ2FuY2VsID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5hbWUsIGRlbHRhLCB0YXJnZXQsIHNob3VsZCkge1xuICAgICAgICB2YXIgZXZlbnQgPSB7IG5hbWU6IG5hbWUsIGRlbHRhOiBkZWx0YSwgdGFyZ2V0OiB0YXJnZXQsIHNob3VsZDogc2hvdWxkLCBzaGFkb3dQYXJlbnQ6IGdldE91dGVybW9zdFNoYWRvd1BhcmVudCh0YXJnZXQpIH07XG4gICAgICAgIHNob3VsZFByZXZlbnRRdWV1ZS5jdXJyZW50LnB1c2goZXZlbnQpO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNob3VsZFByZXZlbnRRdWV1ZS5jdXJyZW50ID0gc2hvdWxkUHJldmVudFF1ZXVlLmN1cnJlbnQuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlICE9PSBldmVudDsgfSk7XG4gICAgICAgIH0sIDEpO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgc2Nyb2xsVG91Y2hTdGFydCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB0b3VjaFN0YXJ0UmVmLmN1cnJlbnQgPSBnZXRUb3VjaFhZKGV2ZW50KTtcbiAgICAgICAgYWN0aXZlQXhpcy5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgc2Nyb2xsV2hlZWwgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc2hvdWxkQ2FuY2VsKGV2ZW50LnR5cGUsIGdldERlbHRhWFkoZXZlbnQpLCBldmVudC50YXJnZXQsIHNob3VsZENhbmNlbEV2ZW50KGV2ZW50LCBwcm9wcy5sb2NrUmVmLmN1cnJlbnQpKTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIHNjcm9sbFRvdWNoTW92ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBzaG91bGRDYW5jZWwoZXZlbnQudHlwZSwgZ2V0VG91Y2hYWShldmVudCksIGV2ZW50LnRhcmdldCwgc2hvdWxkQ2FuY2VsRXZlbnQoZXZlbnQsIHByb3BzLmxvY2tSZWYuY3VycmVudCkpO1xuICAgIH0sIFtdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBsb2NrU3RhY2sucHVzaChTdHlsZSk7XG4gICAgICAgIHByb3BzLnNldENhbGxiYWNrcyh7XG4gICAgICAgICAgICBvblNjcm9sbENhcHR1cmU6IHNjcm9sbFdoZWVsLFxuICAgICAgICAgICAgb25XaGVlbENhcHR1cmU6IHNjcm9sbFdoZWVsLFxuICAgICAgICAgICAgb25Ub3VjaE1vdmVDYXB0dXJlOiBzY3JvbGxUb3VjaE1vdmUsXG4gICAgICAgIH0pO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHNob3VsZFByZXZlbnQsIG5vblBhc3NpdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBzaG91bGRQcmV2ZW50LCBub25QYXNzaXZlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNjcm9sbFRvdWNoU3RhcnQsIG5vblBhc3NpdmUpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbG9ja1N0YWNrID0gbG9ja1N0YWNrLmZpbHRlcihmdW5jdGlvbiAoaW5zdCkgeyByZXR1cm4gaW5zdCAhPT0gU3R5bGU7IH0pO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBzaG91bGRQcmV2ZW50LCBub25QYXNzaXZlKTtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNob3VsZFByZXZlbnQsIG5vblBhc3NpdmUpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNjcm9sbFRvdWNoU3RhcnQsIG5vblBhc3NpdmUpO1xuICAgICAgICB9O1xuICAgIH0sIFtdKTtcbiAgICB2YXIgcmVtb3ZlU2Nyb2xsQmFyID0gcHJvcHMucmVtb3ZlU2Nyb2xsQmFyLCBpbmVydCA9IHByb3BzLmluZXJ0O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgaW5lcnQgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFN0eWxlLCB7IHN0eWxlczogZ2VuZXJhdGVTdHlsZShpZCkgfSkgOiBudWxsLFxuICAgICAgICByZW1vdmVTY3JvbGxCYXIgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFJlbW92ZVNjcm9sbEJhciwgeyBnYXBNb2RlOiBwcm9wcy5nYXBNb2RlIH0pIDogbnVsbCkpO1xufVxuZnVuY3Rpb24gZ2V0T3V0ZXJtb3N0U2hhZG93UGFyZW50KG5vZGUpIHtcbiAgICB2YXIgc2hhZG93UGFyZW50ID0gbnVsbDtcbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgIHNoYWRvd1BhcmVudCA9IG5vZGUuaG9zdDtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvd1BhcmVudDtcbn1cbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZ1bGxXaWR0aENsYXNzTmFtZSwgemVyb1JpZ2h0Q2xhc3NOYW1lIH0gZnJvbSAncmVhY3QtcmVtb3ZlLXNjcm9sbC1iYXIvY29uc3RhbnRzJztcbmltcG9ydCB7IHVzZU1lcmdlUmVmcyB9IGZyb20gJ3VzZS1jYWxsYmFjay1yZWYnO1xuaW1wb3J0IHsgZWZmZWN0Q2FyIH0gZnJvbSAnLi9tZWRpdW0nO1xudmFyIG5vdGhpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuO1xufTtcbi8qKlxuICogUmVtb3ZlcyBzY3JvbGxiYXIgZnJvbSB0aGUgcGFnZSBhbmQgY29udGFpbiB0aGUgc2Nyb2xsIHdpdGhpbiB0aGUgTG9ja1xuICovXG52YXIgUmVtb3ZlU2Nyb2xsID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHBhcmVudFJlZikge1xuICAgIHZhciByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgdmFyIF9hID0gUmVhY3QudXNlU3RhdGUoe1xuICAgICAgICBvblNjcm9sbENhcHR1cmU6IG5vdGhpbmcsXG4gICAgICAgIG9uV2hlZWxDYXB0dXJlOiBub3RoaW5nLFxuICAgICAgICBvblRvdWNoTW92ZUNhcHR1cmU6IG5vdGhpbmcsXG4gICAgfSksIGNhbGxiYWNrcyA9IF9hWzBdLCBzZXRDYWxsYmFja3MgPSBfYVsxXTtcbiAgICB2YXIgZm9yd2FyZFByb3BzID0gcHJvcHMuZm9yd2FyZFByb3BzLCBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLCBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsIHJlbW92ZVNjcm9sbEJhciA9IHByb3BzLnJlbW92ZVNjcm9sbEJhciwgZW5hYmxlZCA9IHByb3BzLmVuYWJsZWQsIHNoYXJkcyA9IHByb3BzLnNoYXJkcywgc2lkZUNhciA9IHByb3BzLnNpZGVDYXIsIG5vSXNvbGF0aW9uID0gcHJvcHMubm9Jc29sYXRpb24sIGluZXJ0ID0gcHJvcHMuaW5lcnQsIGFsbG93UGluY2hab29tID0gcHJvcHMuYWxsb3dQaW5jaFpvb20sIF9iID0gcHJvcHMuYXMsIENvbnRhaW5lciA9IF9iID09PSB2b2lkIDAgPyAnZGl2JyA6IF9iLCBnYXBNb2RlID0gcHJvcHMuZ2FwTW9kZSwgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wiZm9yd2FyZFByb3BzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJyZW1vdmVTY3JvbGxCYXJcIiwgXCJlbmFibGVkXCIsIFwic2hhcmRzXCIsIFwic2lkZUNhclwiLCBcIm5vSXNvbGF0aW9uXCIsIFwiaW5lcnRcIiwgXCJhbGxvd1BpbmNoWm9vbVwiLCBcImFzXCIsIFwiZ2FwTW9kZVwiXSk7XG4gICAgdmFyIFNpZGVDYXIgPSBzaWRlQ2FyO1xuICAgIHZhciBjb250YWluZXJSZWYgPSB1c2VNZXJnZVJlZnMoW3JlZiwgcGFyZW50UmVmXSk7XG4gICAgdmFyIGNvbnRhaW5lclByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHJlc3QpLCBjYWxsYmFja3MpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgZW5hYmxlZCAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChTaWRlQ2FyLCB7IHNpZGVDYXI6IGVmZmVjdENhciwgcmVtb3ZlU2Nyb2xsQmFyOiByZW1vdmVTY3JvbGxCYXIsIHNoYXJkczogc2hhcmRzLCBub0lzb2xhdGlvbjogbm9Jc29sYXRpb24sIGluZXJ0OiBpbmVydCwgc2V0Q2FsbGJhY2tzOiBzZXRDYWxsYmFja3MsIGFsbG93UGluY2hab29tOiAhIWFsbG93UGluY2hab29tLCBsb2NrUmVmOiByZWYsIGdhcE1vZGU6IGdhcE1vZGUgfSkpLFxuICAgICAgICBmb3J3YXJkUHJvcHMgPyAoUmVhY3QuY2xvbmVFbGVtZW50KFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29udGFpbmVyUHJvcHMpLCB7IHJlZjogY29udGFpbmVyUmVmIH0pKSkgOiAoUmVhY3QuY3JlYXRlRWxlbWVudChDb250YWluZXIsIF9fYXNzaWduKHt9LCBjb250YWluZXJQcm9wcywgeyBjbGFzc05hbWU6IGNsYXNzTmFtZSwgcmVmOiBjb250YWluZXJSZWYgfSksIGNoaWxkcmVuKSkpKTtcbn0pO1xuUmVtb3ZlU2Nyb2xsLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIHJlbW92ZVNjcm9sbEJhcjogdHJ1ZSxcbiAgICBpbmVydDogZmFsc2UsXG59O1xuUmVtb3ZlU2Nyb2xsLmNsYXNzTmFtZXMgPSB7XG4gICAgZnVsbFdpZHRoOiBmdWxsV2lkdGhDbGFzc05hbWUsXG4gICAgemVyb1JpZ2h0OiB6ZXJvUmlnaHRDbGFzc05hbWUsXG59O1xuZXhwb3J0IHsgUmVtb3ZlU2Nyb2xsIH07XG4iLCJ2YXIgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcGFzc2l2ZVN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydCB2YXIgbm9uUGFzc2l2ZSA9IHBhc3NpdmVTdXBwb3J0ZWQgPyB7IHBhc3NpdmU6IGZhbHNlIH0gOiBmYWxzZTtcbiIsInZhciBhbHdheXNDb250YWluc1Njcm9sbCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gdGV4dGFyZWEgd2lsbCBhbHdheXMgX2NvbnRhaW5fIHNjcm9sbCBpbnNpZGUgc2VsZi4gSXQgb25seSBjYW4gYmUgaGlkZGVuXG4gICAgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJztcbn07XG52YXIgZWxlbWVudENhbkJlU2Nyb2xsZWQgPSBmdW5jdGlvbiAobm9kZSwgb3ZlcmZsb3cpIHtcbiAgICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgcmV0dXJuIChcbiAgICAvLyBub3Qtbm90LXNjcm9sbGFibGVcbiAgICBzdHlsZXNbb3ZlcmZsb3ddICE9PSAnaGlkZGVuJyAmJlxuICAgICAgICAvLyBjb250YWlucyBzY3JvbGwgaW5zaWRlIHNlbGZcbiAgICAgICAgIShzdHlsZXMub3ZlcmZsb3dZID09PSBzdHlsZXMub3ZlcmZsb3dYICYmICFhbHdheXNDb250YWluc1Njcm9sbChub2RlKSAmJiBzdHlsZXNbb3ZlcmZsb3ddID09PSAndmlzaWJsZScpKTtcbn07XG52YXIgZWxlbWVudENvdWxkQmVWU2Nyb2xsZWQgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gZWxlbWVudENhbkJlU2Nyb2xsZWQobm9kZSwgJ292ZXJmbG93WScpOyB9O1xudmFyIGVsZW1lbnRDb3VsZEJlSFNjcm9sbGVkID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGVsZW1lbnRDYW5CZVNjcm9sbGVkKG5vZGUsICdvdmVyZmxvd1gnKTsgfTtcbmV4cG9ydCB2YXIgbG9jYXRpb25Db3VsZEJlU2Nyb2xsZWQgPSBmdW5jdGlvbiAoYXhpcywgbm9kZSkge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHZhciBjdXJyZW50ID0gbm9kZTtcbiAgICBkbyB7XG4gICAgICAgIC8vIFNraXAgb3ZlciBzaGFkb3cgcm9vdFxuICAgICAgICBpZiAodHlwZW9mIFNoYWRvd1Jvb3QgIT09ICd1bmRlZmluZWQnICYmIGN1cnJlbnQgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc1Njcm9sbGFibGUgPSBlbGVtZW50Q291bGRCZVNjcm9sbGVkKGF4aXMsIGN1cnJlbnQpO1xuICAgICAgICBpZiAoaXNTY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBnZXRTY3JvbGxWYXJpYWJsZXMoYXhpcywgY3VycmVudCksIHMgPSBfYVsxXSwgZCA9IF9hWzJdO1xuICAgICAgICAgICAgaWYgKHMgPiBkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTtcbiAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IG93bmVyRG9jdW1lbnQuYm9keSk7XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbnZhciBnZXRWU2Nyb2xsVmFyaWFibGVzID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHNjcm9sbFRvcCA9IF9hLnNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0ID0gX2Euc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgPSBfYS5jbGllbnRIZWlnaHQ7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc2Nyb2xsVG9wLFxuICAgICAgICBzY3JvbGxIZWlnaHQsXG4gICAgICAgIGNsaWVudEhlaWdodCxcbiAgICBdO1xufTtcbnZhciBnZXRIU2Nyb2xsVmFyaWFibGVzID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHNjcm9sbExlZnQgPSBfYS5zY3JvbGxMZWZ0LCBzY3JvbGxXaWR0aCA9IF9hLnNjcm9sbFdpZHRoLCBjbGllbnRXaWR0aCA9IF9hLmNsaWVudFdpZHRoO1xuICAgIHJldHVybiBbXG4gICAgICAgIHNjcm9sbExlZnQsXG4gICAgICAgIHNjcm9sbFdpZHRoLFxuICAgICAgICBjbGllbnRXaWR0aCxcbiAgICBdO1xufTtcbnZhciBlbGVtZW50Q291bGRCZVNjcm9sbGVkID0gZnVuY3Rpb24gKGF4aXMsIG5vZGUpIHtcbiAgICByZXR1cm4gYXhpcyA9PT0gJ3YnID8gZWxlbWVudENvdWxkQmVWU2Nyb2xsZWQobm9kZSkgOiBlbGVtZW50Q291bGRCZUhTY3JvbGxlZChub2RlKTtcbn07XG52YXIgZ2V0U2Nyb2xsVmFyaWFibGVzID0gZnVuY3Rpb24gKGF4aXMsIG5vZGUpIHtcbiAgICByZXR1cm4gYXhpcyA9PT0gJ3YnID8gZ2V0VlNjcm9sbFZhcmlhYmxlcyhub2RlKSA6IGdldEhTY3JvbGxWYXJpYWJsZXMobm9kZSk7XG59O1xudmFyIGdldERpcmVjdGlvbkZhY3RvciA9IGZ1bmN0aW9uIChheGlzLCBkaXJlY3Rpb24pIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZWxlbWVudCdzIGRpcmVjdGlvbiBpcyBydGwgKHJpZ2h0LXRvLWxlZnQpLCB0aGVuIHNjcm9sbExlZnQgaXMgMCB3aGVuIHRoZSBzY3JvbGxiYXIgaXMgYXQgaXRzIHJpZ2h0bW9zdCBwb3NpdGlvbixcbiAgICAgKiBhbmQgdGhlbiBpbmNyZWFzaW5nbHkgbmVnYXRpdmUgYXMgeW91IHNjcm9sbCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQuXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9zY3JvbGxMZWZ0XG4gICAgICovXG4gICAgcmV0dXJuIGF4aXMgPT09ICdoJyAmJiBkaXJlY3Rpb24gPT09ICdydGwnID8gLTEgOiAxO1xufTtcbmV4cG9ydCB2YXIgaGFuZGxlU2Nyb2xsID0gZnVuY3Rpb24gKGF4aXMsIGVuZFRhcmdldCwgZXZlbnQsIHNvdXJjZURlbHRhLCBub092ZXJzY3JvbGwpIHtcbiAgICB2YXIgZGlyZWN0aW9uRmFjdG9yID0gZ2V0RGlyZWN0aW9uRmFjdG9yKGF4aXMsIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVuZFRhcmdldCkuZGlyZWN0aW9uKTtcbiAgICB2YXIgZGVsdGEgPSBkaXJlY3Rpb25GYWN0b3IgKiBzb3VyY2VEZWx0YTtcbiAgICAvLyBmaW5kIHNjcm9sbGFibGUgdGFyZ2V0XG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB2YXIgdGFyZ2V0SW5Mb2NrID0gZW5kVGFyZ2V0LmNvbnRhaW5zKHRhcmdldCk7XG4gICAgdmFyIHNob3VsZENhbmNlbFNjcm9sbCA9IGZhbHNlO1xuICAgIHZhciBpc0RlbHRhUG9zaXRpdmUgPSBkZWx0YSA+IDA7XG4gICAgdmFyIGF2YWlsYWJsZVNjcm9sbCA9IDA7XG4gICAgdmFyIGF2YWlsYWJsZVNjcm9sbFRvcCA9IDA7XG4gICAgZG8ge1xuICAgICAgICB2YXIgX2EgPSBnZXRTY3JvbGxWYXJpYWJsZXMoYXhpcywgdGFyZ2V0KSwgcG9zaXRpb24gPSBfYVswXSwgc2Nyb2xsXzEgPSBfYVsxXSwgY2FwYWNpdHkgPSBfYVsyXTtcbiAgICAgICAgdmFyIGVsZW1lbnRTY3JvbGwgPSBzY3JvbGxfMSAtIGNhcGFjaXR5IC0gZGlyZWN0aW9uRmFjdG9yICogcG9zaXRpb247XG4gICAgICAgIGlmIChwb3NpdGlvbiB8fCBlbGVtZW50U2Nyb2xsKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudENvdWxkQmVTY3JvbGxlZChheGlzLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlU2Nyb2xsICs9IGVsZW1lbnRTY3JvbGw7XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlU2Nyb2xsVG9wICs9IHBvc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgfSB3aGlsZSAoXG4gICAgLy8gcG9ydGFsZWQgY29udGVudFxuICAgICghdGFyZ2V0SW5Mb2NrICYmIHRhcmdldCAhPT0gZG9jdW1lbnQuYm9keSkgfHxcbiAgICAgICAgLy8gc2VsZiBjb250ZW50XG4gICAgICAgICh0YXJnZXRJbkxvY2sgJiYgKGVuZFRhcmdldC5jb250YWlucyh0YXJnZXQpIHx8IGVuZFRhcmdldCA9PT0gdGFyZ2V0KSkpO1xuICAgIC8vIGhhbmRsZSBlcHNpbG9uIGFyb3VuZCAwIChub24gc3RhbmRhcmQgem9vbSBsZXZlbHMpXG4gICAgaWYgKGlzRGVsdGFQb3NpdGl2ZSAmJlxuICAgICAgICAoKG5vT3ZlcnNjcm9sbCAmJiBNYXRoLmFicyhhdmFpbGFibGVTY3JvbGwpIDwgMSkgfHwgKCFub092ZXJzY3JvbGwgJiYgZGVsdGEgPiBhdmFpbGFibGVTY3JvbGwpKSkge1xuICAgICAgICBzaG91bGRDYW5jZWxTY3JvbGwgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICghaXNEZWx0YVBvc2l0aXZlICYmXG4gICAgICAgICgobm9PdmVyc2Nyb2xsICYmIE1hdGguYWJzKGF2YWlsYWJsZVNjcm9sbFRvcCkgPCAxKSB8fCAoIW5vT3ZlcnNjcm9sbCAmJiAtZGVsdGEgPiBhdmFpbGFibGVTY3JvbGxUb3ApKSkge1xuICAgICAgICBzaG91bGRDYW5jZWxTY3JvbGwgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gc2hvdWxkQ2FuY2VsU2Nyb2xsO1xufTtcbiIsImltcG9ydCB7IGNyZWF0ZVNpZGVjYXJNZWRpdW0gfSBmcm9tICd1c2Utc2lkZWNhcic7XG5leHBvcnQgdmFyIGVmZmVjdENhciA9IGNyZWF0ZVNpZGVjYXJNZWRpdW0oKTtcbiIsImltcG9ydCB7IGV4cG9ydFNpZGVjYXIgfSBmcm9tICd1c2Utc2lkZWNhcic7XG5pbXBvcnQgeyBSZW1vdmVTY3JvbGxTaWRlQ2FyIH0gZnJvbSAnLi9TaWRlRWZmZWN0JztcbmltcG9ydCB7IGVmZmVjdENhciB9IGZyb20gJy4vbWVkaXVtJztcbmV4cG9ydCBkZWZhdWx0IGV4cG9ydFNpZGVjYXIoZWZmZWN0Q2FyLCBSZW1vdmVTY3JvbGxTaWRlQ2FyKTtcbiIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRHJhZ2dhYmxlIGZyb20gJ3JlYWN0LWRyYWdnYWJsZSc7XG5pbXBvcnQgeyBSZXNpemFibGUgfSBmcm9tICdyZS1yZXNpemFibGUnO1xuaW1wb3J0IHsgZmx1c2hTeW5jIH0gZnJvbSAncmVhY3QtZG9tJztcblxuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxudmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxuXG52YXIgcmVzaXphYmxlU3R5bGUgPSB7XG4gICAgd2lkdGg6IFwiYXV0b1wiLFxuICAgIGhlaWdodDogXCJhdXRvXCIsXG4gICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgIHRvcDogMCxcbiAgICBsZWZ0OiAwLFxufTtcbnZhciBnZXRFbmFibGVSZXNpemluZ0J5RmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7IHJldHVybiAoe1xuICAgIGJvdHRvbTogZmxhZyxcbiAgICBib3R0b21MZWZ0OiBmbGFnLFxuICAgIGJvdHRvbVJpZ2h0OiBmbGFnLFxuICAgIGxlZnQ6IGZsYWcsXG4gICAgcmlnaHQ6IGZsYWcsXG4gICAgdG9wOiBmbGFnLFxuICAgIHRvcExlZnQ6IGZsYWcsXG4gICAgdG9wUmlnaHQ6IGZsYWcsXG59KTsgfTtcbnZhciBSbmQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJuZCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSbmQocHJvcHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnJlc2l6aW5nUG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgX3RoaXMub2Zmc2V0RnJvbVBhcmVudCA9IHsgbGVmdDogMCwgdG9wOiAwIH07XG4gICAgICAgIF90aGlzLnJlc2l6YWJsZUVsZW1lbnQgPSB7IGN1cnJlbnQ6IG51bGwgfTtcbiAgICAgICAgX3RoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHJlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGJvdW5kczoge1xuICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXhXaWR0aDogcHJvcHMubWF4V2lkdGgsXG4gICAgICAgICAgICBtYXhIZWlnaHQ6IHByb3BzLm1heEhlaWdodCxcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMub25SZXNpemVTdGFydCA9IF90aGlzLm9uUmVzaXplU3RhcnQuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uUmVzaXplID0gX3RoaXMub25SZXNpemUuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uUmVzaXplU3RvcCA9IF90aGlzLm9uUmVzaXplU3RvcC5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25EcmFnU3RhcnQgPSBfdGhpcy5vbkRyYWdTdGFydC5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25EcmFnID0gX3RoaXMub25EcmFnLmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5vbkRyYWdTdG9wID0gX3RoaXMub25EcmFnU3RvcC5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMuZ2V0TWF4U2l6ZXNGcm9tUHJvcHMgPSBfdGhpcy5nZXRNYXhTaXplc0Zyb21Qcm9wcy5iaW5kKF90aGlzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSbmQucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldEZyb21QYXJlbnQoKTtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5vZmZzZXRGcm9tUGFyZW50LCBsZWZ0ID0gX2EubGVmdCwgdG9wID0gX2EudG9wO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLmdldERyYWdnYWJsZVBvc2l0aW9uKCksIHggPSBfYi54LCB5ID0gX2IueTtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgeDogeCAtIGxlZnQsXG4gICAgICAgICAgICB5OiB5IC0gdG9wLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSEFDSzogQXBwbHkgcG9zaXRpb24gYWRqdXN0bWVudFxuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgfTtcbiAgICAvLyBIQUNLOiBUbyBnZXQgYHJlYWN0LWRyYWdnYWJsZWAgc3RhdGUgeCBhbmQgeS5cbiAgICBSbmQucHJvdG90eXBlLmdldERyYWdnYWJsZVBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmRyYWdnYWJsZS5zdGF0ZSwgeCA9IF9hLngsIHkgPSBfYS55O1xuICAgICAgICByZXR1cm4geyB4OiB4LCB5OiB5IH07XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXphYmxlICYmIHRoaXMucmVzaXphYmxlLnBhcmVudE5vZGU7XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLmdldFBhcmVudFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6YWJsZS5nZXRQYXJlbnRTaXplKCk7XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLmdldE1heFNpemVzRnJvbVByb3BzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWF4V2lkdGggPSB0eXBlb2YgdGhpcy5wcm9wcy5tYXhXaWR0aCA9PT0gXCJ1bmRlZmluZWRcIiA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogdGhpcy5wcm9wcy5tYXhXaWR0aDtcbiAgICAgICAgdmFyIG1heEhlaWdodCA9IHR5cGVvZiB0aGlzLnByb3BzLm1heEhlaWdodCA9PT0gXCJ1bmRlZmluZWRcIiA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogdGhpcy5wcm9wcy5tYXhIZWlnaHQ7XG4gICAgICAgIHJldHVybiB7IG1heFdpZHRoOiBtYXhXaWR0aCwgbWF4SGVpZ2h0OiBtYXhIZWlnaHQgfTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUuZ2V0U2VsZkVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6YWJsZSAmJiB0aGlzLnJlc2l6YWJsZS5yZXNpemFibGU7XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLmdldE9mZnNldEhlaWdodCA9IGZ1bmN0aW9uIChib3VuZGFyeSkge1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLnByb3BzLnNjYWxlO1xuICAgICAgICBzd2l0Y2ggKHRoaXMucHJvcHMuYm91bmRzKSB7XG4gICAgICAgICAgICBjYXNlIFwid2luZG93XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCAvIHNjYWxlO1xuICAgICAgICAgICAgY2FzZSBcImJvZHlcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQgLyBzY2FsZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJvdW5kYXJ5Lm9mZnNldEhlaWdodDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5nZXRPZmZzZXRXaWR0aCA9IGZ1bmN0aW9uIChib3VuZGFyeSkge1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLnByb3BzLnNjYWxlO1xuICAgICAgICBzd2l0Y2ggKHRoaXMucHJvcHMuYm91bmRzKSB7XG4gICAgICAgICAgICBjYXNlIFwid2luZG93XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoIC8gc2NhbGU7XG4gICAgICAgICAgICBjYXNlIFwiYm9keVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoIC8gc2NhbGU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBib3VuZGFyeS5vZmZzZXRXaWR0aDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5vbkRyYWdTdGFydCA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uRHJhZ1N0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uRHJhZ1N0YXJ0KGUsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLmdldERyYWdnYWJsZVBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHBvcztcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmJvdW5kcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMucHJvcHMuc2NhbGU7XG4gICAgICAgIHZhciBib3VuZGFyeTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSBcInBhcmVudFwiKSB7XG4gICAgICAgICAgICBib3VuZGFyeSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJib2R5XCIpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRSZWN0XzEgPSBwYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50TGVmdF8xID0gcGFyZW50UmVjdF8xLmxlZnQ7XG4gICAgICAgICAgICB2YXIgcGFyZW50VG9wXzEgPSBwYXJlbnRSZWN0XzEudG9wO1xuICAgICAgICAgICAgdmFyIGJvZHlSZWN0ID0gZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHZhciBsZWZ0XzEgPSAtKHBhcmVudExlZnRfMSAtIHBhcmVudC5vZmZzZXRMZWZ0ICogc2NhbGUgLSBib2R5UmVjdC5sZWZ0KSAvIHNjYWxlO1xuICAgICAgICAgICAgdmFyIHRvcF8xID0gLShwYXJlbnRUb3BfMSAtIHBhcmVudC5vZmZzZXRUb3AgKiBzY2FsZSAtIGJvZHlSZWN0LnRvcCkgLyBzY2FsZTtcbiAgICAgICAgICAgIHZhciByaWdodCA9IChkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoIC0gdGhpcy5yZXNpemFibGUuc2l6ZS53aWR0aCAqIHNjYWxlKSAvIHNjYWxlICsgbGVmdF8xO1xuICAgICAgICAgICAgdmFyIGJvdHRvbSA9IChkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCAtIHRoaXMucmVzaXphYmxlLnNpemUuaGVpZ2h0ICogc2NhbGUpIC8gc2NhbGUgKyB0b3BfMTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFN0YXRlKHsgYm91bmRzOiB7IHRvcDogdG9wXzEsIHJpZ2h0OiByaWdodCwgYm90dG9tOiBib3R0b20sIGxlZnQ6IGxlZnRfMSB9IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSBcIndpbmRvd1wiKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHZhciBwYXJlbnRSZWN0XzIgPSBwYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50TGVmdF8yID0gcGFyZW50UmVjdF8yLmxlZnQ7XG4gICAgICAgICAgICB2YXIgcGFyZW50VG9wXzIgPSBwYXJlbnRSZWN0XzIudG9wO1xuICAgICAgICAgICAgdmFyIGxlZnRfMiA9IC0ocGFyZW50TGVmdF8yIC0gcGFyZW50Lm9mZnNldExlZnQgKiBzY2FsZSkgLyBzY2FsZTtcbiAgICAgICAgICAgIHZhciB0b3BfMiA9IC0ocGFyZW50VG9wXzIgLSBwYXJlbnQub2Zmc2V0VG9wICogc2NhbGUpIC8gc2NhbGU7XG4gICAgICAgICAgICB2YXIgcmlnaHQgPSAod2luZG93LmlubmVyV2lkdGggLSB0aGlzLnJlc2l6YWJsZS5zaXplLndpZHRoICogc2NhbGUpIC8gc2NhbGUgKyBsZWZ0XzI7XG4gICAgICAgICAgICB2YXIgYm90dG9tID0gKHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMucmVzaXphYmxlLnNpemUuaGVpZ2h0ICogc2NhbGUpIC8gc2NhbGUgKyB0b3BfMjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFN0YXRlKHsgYm91bmRzOiB7IHRvcDogdG9wXzIsIHJpZ2h0OiByaWdodCwgYm90dG9tOiBib3R0b20sIGxlZnQ6IGxlZnRfMiB9IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgYm91bmRhcnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMucHJvcHMuYm91bmRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICBib3VuZGFyeSA9IHRoaXMucHJvcHMuYm91bmRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGJvdW5kYXJ5IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHx8ICEocGFyZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJvdW5kYXJ5UmVjdCA9IGJvdW5kYXJ5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB2YXIgYm91bmRhcnlMZWZ0ID0gYm91bmRhcnlSZWN0LmxlZnQ7XG4gICAgICAgIHZhciBib3VuZGFyeVRvcCA9IGJvdW5kYXJ5UmVjdC50b3A7XG4gICAgICAgIHZhciBwYXJlbnRSZWN0ID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB2YXIgcGFyZW50TGVmdCA9IHBhcmVudFJlY3QubGVmdDtcbiAgICAgICAgdmFyIHBhcmVudFRvcCA9IHBhcmVudFJlY3QudG9wO1xuICAgICAgICB2YXIgbGVmdCA9IChib3VuZGFyeUxlZnQgLSBwYXJlbnRMZWZ0KSAvIHNjYWxlO1xuICAgICAgICB2YXIgdG9wID0gYm91bmRhcnlUb3AgLSBwYXJlbnRUb3A7XG4gICAgICAgIGlmICghdGhpcy5yZXNpemFibGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0RnJvbVBhcmVudCgpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXRGcm9tUGFyZW50O1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGJvdW5kczoge1xuICAgICAgICAgICAgICAgIHRvcDogdG9wIC0gb2Zmc2V0LnRvcCxcbiAgICAgICAgICAgICAgICByaWdodDogbGVmdCArIChib3VuZGFyeS5vZmZzZXRXaWR0aCAtIHRoaXMucmVzaXphYmxlLnNpemUud2lkdGgpIC0gb2Zmc2V0LmxlZnQgLyBzY2FsZSxcbiAgICAgICAgICAgICAgICBib3R0b206IHRvcCArIChib3VuZGFyeS5vZmZzZXRIZWlnaHQgLSB0aGlzLnJlc2l6YWJsZS5zaXplLmhlaWdodCkgLSBvZmZzZXQudG9wLFxuICAgICAgICAgICAgICAgIGxlZnQ6IGxlZnQgLSBvZmZzZXQubGVmdCAvIHNjYWxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLm9uRHJhZyA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5vbkRyYWcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBfYSA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudCwgbGVmdCA9IF9hLmxlZnQsIHRvcCA9IF9hLnRvcDtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmRyYWdBeGlzIHx8IHRoaXMucHJvcHMuZHJhZ0F4aXMgPT09IFwiYm90aFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vbkRyYWcoZSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRhdGEpLCB7IHg6IGRhdGEueCArIGxlZnQsIHk6IGRhdGEueSArIHRvcCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5kcmFnQXhpcyA9PT0gXCJ4XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLm9uRHJhZyhlLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGF0YSksIHsgeDogZGF0YS54ICsgbGVmdCwgeTogdGhpcy5vcmlnaW5hbFBvc2l0aW9uLnkgKyB0b3AsIGRlbHRhWTogMCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5kcmFnQXhpcyA9PT0gXCJ5XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLm9uRHJhZyhlLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGF0YSksIHsgeDogdGhpcy5vcmlnaW5hbFBvc2l0aW9uLnggKyBsZWZ0LCB5OiBkYXRhLnkgKyB0b3AsIGRlbHRhWDogMCB9KSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUub25EcmFnU3RvcCA9IGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5vbkRyYWdTdG9wKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQsIGxlZnQgPSBfYS5sZWZ0LCB0b3AgPSBfYS50b3A7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5kcmFnQXhpcyB8fCB0aGlzLnByb3BzLmRyYWdBeGlzID09PSBcImJvdGhcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25EcmFnU3RvcChlLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGF0YSksIHsgeDogZGF0YS54ICsgbGVmdCwgeTogZGF0YS55ICsgdG9wIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmRyYWdBeGlzID09PSBcInhcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25EcmFnU3RvcChlLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGF0YSksIHsgeDogZGF0YS54ICsgbGVmdCwgeTogdGhpcy5vcmlnaW5hbFBvc2l0aW9uLnkgKyB0b3AsIGRlbHRhWTogMCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5kcmFnQXhpcyA9PT0gXCJ5XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLm9uRHJhZ1N0b3AoZSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRhdGEpLCB7IHg6IHRoaXMub3JpZ2luYWxQb3NpdGlvbi54ICsgbGVmdCwgeTogZGF0YS55ICsgdG9wLCBkZWx0YVg6IDAgfSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLm9uUmVzaXplU3RhcnQgPSBmdW5jdGlvbiAoZSwgZGlyLCBlbGVtZW50UmVmKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcmVzaXppbmc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLnByb3BzLnNjYWxlO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXRGcm9tUGFyZW50O1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5nZXREcmFnZ2FibGVQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLnJlc2l6aW5nUG9zaXRpb24gPSB7IHg6IHBvcy54ICsgb2Zmc2V0LmxlZnQsIHk6IHBvcy55ICsgb2Zmc2V0LnRvcCB9O1xuICAgICAgICB0aGlzLm9yaWdpbmFsUG9zaXRpb24gPSBwb3M7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcykge1xuICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gdGhpcy5nZXRQYXJlbnQoKTtcbiAgICAgICAgICAgIHZhciBib3VuZGFyeSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJwYXJlbnRcIikge1xuICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gcGFyZW50XzE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJib2R5XCIpIHtcbiAgICAgICAgICAgICAgICBib3VuZGFyeSA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJ3aW5kb3dcIikge1xuICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gd2luZG93O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMucHJvcHMuYm91bmRzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgYm91bmRhcnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMucHJvcHMuYm91bmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHRoaXMucHJvcHMuYm91bmRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHNlbGZfMSA9IHRoaXMuZ2V0U2VsZkVsZW1lbnQoKTtcbiAgICAgICAgICAgIGlmIChzZWxmXzEgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgKGJvdW5kYXJ5IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgYm91bmRhcnkgPT09IHdpbmRvdykgJiZcbiAgICAgICAgICAgICAgICBwYXJlbnRfMSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5nZXRNYXhTaXplc0Zyb21Qcm9wcygpLCBtYXhXaWR0aCA9IF9hLm1heFdpZHRoLCBtYXhIZWlnaHQgPSBfYS5tYXhIZWlnaHQ7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudFNpemUgPSB0aGlzLmdldFBhcmVudFNpemUoKTtcbiAgICAgICAgICAgICAgICBpZiAobWF4V2lkdGggJiYgdHlwZW9mIG1heFdpZHRoID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXhXaWR0aC5lbmRzV2l0aChcIiVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYXRpbyA9IE51bWJlcihtYXhXaWR0aC5yZXBsYWNlKFwiJVwiLCBcIlwiKSkgLyAxMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IHBhcmVudFNpemUud2lkdGggKiByYXRpbztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXhXaWR0aC5lbmRzV2l0aChcInB4XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IE51bWJlcihtYXhXaWR0aC5yZXBsYWNlKFwicHhcIiwgXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtYXhIZWlnaHQgJiYgdHlwZW9mIG1heEhlaWdodCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF4SGVpZ2h0LmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhdGlvID0gTnVtYmVyKG1heEhlaWdodC5yZXBsYWNlKFwiJVwiLCBcIlwiKSkgLyAxMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBwYXJlbnRTaXplLmhlaWdodCAqIHJhdGlvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1heEhlaWdodC5lbmRzV2l0aChcInB4XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBOdW1iZXIobWF4SGVpZ2h0LnJlcGxhY2UoXCJweFwiLCBcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHNlbGZSZWN0ID0gc2VsZl8xLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHZhciBzZWxmTGVmdCA9IHNlbGZSZWN0LmxlZnQ7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGZUb3AgPSBzZWxmUmVjdC50b3A7XG4gICAgICAgICAgICAgICAgdmFyIGJvdW5kYXJ5UmVjdCA9IHRoaXMucHJvcHMuYm91bmRzID09PSBcIndpbmRvd1wiID8geyBsZWZ0OiAwLCB0b3A6IDAgfSA6IGJvdW5kYXJ5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHZhciBib3VuZGFyeUxlZnQgPSBib3VuZGFyeVJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICB2YXIgYm91bmRhcnlUb3AgPSBib3VuZGFyeVJlY3QudG9wO1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRXaWR0aCA9IHRoaXMuZ2V0T2Zmc2V0V2lkdGgoYm91bmRhcnkpO1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRIZWlnaHQgPSB0aGlzLmdldE9mZnNldEhlaWdodChib3VuZGFyeSk7XG4gICAgICAgICAgICAgICAgdmFyIGhhc0xlZnQgPSBkaXIudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChcImxlZnRcIik7XG4gICAgICAgICAgICAgICAgdmFyIGhhc1JpZ2h0ID0gZGlyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoXCJyaWdodFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzVG9wID0gZGlyLnN0YXJ0c1dpdGgoXCJ0b3BcIik7XG4gICAgICAgICAgICAgICAgdmFyIGhhc0JvdHRvbSA9IGRpci5zdGFydHNXaXRoKFwiYm90dG9tXCIpO1xuICAgICAgICAgICAgICAgIGlmICgoaGFzTGVmdCB8fCBoYXNUb3ApICYmIHRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSAoc2VsZkxlZnQgLSBib3VuZGFyeUxlZnQpIC8gc2NhbGUgKyB0aGlzLnJlc2l6YWJsZS5zaXplLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgbWF4V2lkdGg6IG1heCA+IE51bWJlcihtYXhXaWR0aCkgPyBtYXhXaWR0aCA6IG1heCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSU5GTzogVG8gc2V0IGJvdW5kcyBpbiBgbG9jayBhc3BlY3QgcmF0aW8gd2l0aCBib3VuZHNgIGNhc2UuIFNlZSBhbHNvIHRoYXQgc3RvcnkuXG4gICAgICAgICAgICAgICAgaWYgKGhhc1JpZ2h0IHx8ICh0aGlzLnByb3BzLmxvY2tBc3BlY3RSYXRpbyAmJiAhaGFzTGVmdCAmJiAhaGFzVG9wKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4ID0gb2Zmc2V0V2lkdGggKyAoYm91bmRhcnlMZWZ0IC0gc2VsZkxlZnQpIC8gc2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBtYXhXaWR0aDogbWF4ID4gTnVtYmVyKG1heFdpZHRoKSA/IG1heFdpZHRoIDogbWF4IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGhhc1RvcCB8fCBoYXNMZWZ0KSAmJiB0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4ID0gKHNlbGZUb3AgLSBib3VuZGFyeVRvcCkgLyBzY2FsZSArIHRoaXMucmVzaXphYmxlLnNpemUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogbWF4ID4gTnVtYmVyKG1heEhlaWdodCkgPyBtYXhIZWlnaHQgOiBtYXgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJTkZPOiBUbyBzZXQgYm91bmRzIGluIGBsb2NrIGFzcGVjdCByYXRpbyB3aXRoIGJvdW5kc2AgY2FzZS4gU2VlIGFsc28gdGhhdCBzdG9yeS5cbiAgICAgICAgICAgICAgICBpZiAoaGFzQm90dG9tIHx8ICh0aGlzLnByb3BzLmxvY2tBc3BlY3RSYXRpbyAmJiAhaGFzVG9wICYmICFoYXNMZWZ0KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4ID0gb2Zmc2V0SGVpZ2h0ICsgKGJvdW5kYXJ5VG9wIC0gc2VsZlRvcCkgLyBzY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG1heCA+IE51bWJlcihtYXhIZWlnaHQpID8gbWF4SGVpZ2h0IDogbWF4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogdGhpcy5wcm9wcy5tYXhXaWR0aCxcbiAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IHRoaXMucHJvcHMubWF4SGVpZ2h0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25SZXNpemVTdGFydCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vblJlc2l6ZVN0YXJ0KGUsIGRpciwgZWxlbWVudFJlZik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUub25SZXNpemUgPSBmdW5jdGlvbiAoZSwgZGlyZWN0aW9uLCBlbGVtZW50UmVmLCBkZWx0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBJTkZPOiBBcHBseSB4IGFuZCB5IHBvc2l0aW9uIGFkanVzdG1lbnRzIGNhdXNlZCBieSByZXNpemluZyB0byBkcmFnZ2FibGVcbiAgICAgICAgdmFyIG5ld1BvcyA9IHsgeDogdGhpcy5vcmlnaW5hbFBvc2l0aW9uLngsIHk6IHRoaXMub3JpZ2luYWxQb3NpdGlvbi55IH07XG4gICAgICAgIHZhciBsZWZ0ID0gLWRlbHRhLndpZHRoO1xuICAgICAgICB2YXIgdG9wID0gLWRlbHRhLmhlaWdodDtcbiAgICAgICAgdmFyIGRpcmVjdGlvbnMgPSBbXCJ0b3BcIiwgXCJsZWZ0XCIsIFwidG9wTGVmdFwiLCBcImJvdHRvbUxlZnRcIiwgXCJ0b3BSaWdodFwiXTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbnMuaW5jbHVkZXMoZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gXCJib3R0b21MZWZ0XCIpIHtcbiAgICAgICAgICAgICAgICBuZXdQb3MueCArPSBsZWZ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09PSBcInRvcFJpZ2h0XCIpIHtcbiAgICAgICAgICAgICAgICBuZXdQb3MueSArPSB0b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdQb3MueCArPSBsZWZ0O1xuICAgICAgICAgICAgICAgIG5ld1Bvcy55ICs9IHRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgZHJhZ2dhYmxlU3RhdGUgPSB0aGlzLmRyYWdnYWJsZS5zdGF0ZTtcbiAgICAgICAgaWYgKG5ld1Bvcy54ICE9PSBkcmFnZ2FibGVTdGF0ZS54IHx8IG5ld1Bvcy55ICE9PSBkcmFnZ2FibGVTdGF0ZS55KSB7XG4gICAgICAgICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmRyYWdnYWJsZS5zZXRTdGF0ZShuZXdQb3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVPZmZzZXRGcm9tUGFyZW50KCk7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQ7XG4gICAgICAgIHZhciB4ID0gdGhpcy5nZXREcmFnZ2FibGVQb3NpdGlvbigpLnggKyBvZmZzZXQubGVmdDtcbiAgICAgICAgdmFyIHkgPSB0aGlzLmdldERyYWdnYWJsZVBvc2l0aW9uKCkueSArIG9mZnNldC50b3A7XG4gICAgICAgIHRoaXMucmVzaXppbmdQb3NpdGlvbiA9IHsgeDogeCwgeTogeSB9O1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMub25SZXNpemUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucHJvcHMub25SZXNpemUoZSwgZGlyZWN0aW9uLCBlbGVtZW50UmVmLCBkZWx0YSwge1xuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5vblJlc2l6ZVN0b3AgPSBmdW5jdGlvbiAoZSwgZGlyZWN0aW9uLCBlbGVtZW50UmVmLCBkZWx0YSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHJlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0TWF4U2l6ZXNGcm9tUHJvcHMoKSwgbWF4V2lkdGggPSBfYS5tYXhXaWR0aCwgbWF4SGVpZ2h0ID0gX2EubWF4SGVpZ2h0O1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgbWF4V2lkdGg6IG1heFdpZHRoLCBtYXhIZWlnaHQ6IG1heEhlaWdodCB9KTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25SZXNpemVTdG9wKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uUmVzaXplU3RvcChlLCBkaXJlY3Rpb24sIGVsZW1lbnRSZWYsIGRlbHRhLCB0aGlzLnJlc2l6aW5nUG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLnVwZGF0ZVNpemUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlc2l6YWJsZS51cGRhdGVTaXplKHsgd2lkdGg6IHNpemUud2lkdGgsIGhlaWdodDogc2l6ZS5oZWlnaHQgfSk7XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9uID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlLnNldFN0YXRlKHBvc2l0aW9uKTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUudXBkYXRlT2Zmc2V0RnJvbVBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5wcm9wcy5zY2FsZTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcy5nZXRTZWxmRWxlbWVudCgpO1xuICAgICAgICBpZiAoIXBhcmVudCB8fCBzZWxmID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50UmVjdCA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIHBhcmVudExlZnQgPSBwYXJlbnRSZWN0LmxlZnQ7XG4gICAgICAgIHZhciBwYXJlbnRUb3AgPSBwYXJlbnRSZWN0LnRvcDtcbiAgICAgICAgdmFyIHNlbGZSZWN0ID0gc2VsZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5nZXREcmFnZ2FibGVQb3NpdGlvbigpO1xuICAgICAgICB2YXIgc2Nyb2xsTGVmdCA9IHBhcmVudC5zY3JvbGxMZWZ0O1xuICAgICAgICB2YXIgc2Nyb2xsVG9wID0gcGFyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgdGhpcy5vZmZzZXRGcm9tUGFyZW50ID0ge1xuICAgICAgICAgICAgbGVmdDogc2VsZlJlY3QubGVmdCAtIHBhcmVudExlZnQgKyBzY3JvbGxMZWZ0IC0gcG9zaXRpb24ueCAqIHNjYWxlLFxuICAgICAgICAgICAgdG9wOiBzZWxmUmVjdC50b3AgLSBwYXJlbnRUb3AgKyBzY3JvbGxUb3AgLSBwb3NpdGlvbi55ICogc2NhbGUsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgZGlzYWJsZURyYWdnaW5nID0gX2EuZGlzYWJsZURyYWdnaW5nLCBzdHlsZSA9IF9hLnN0eWxlLCBkcmFnSGFuZGxlQ2xhc3NOYW1lID0gX2EuZHJhZ0hhbmRsZUNsYXNzTmFtZSwgcG9zaXRpb24gPSBfYS5wb3NpdGlvbiwgb25Nb3VzZURvd24gPSBfYS5vbk1vdXNlRG93biwgb25Nb3VzZVVwID0gX2Eub25Nb3VzZVVwLCBkcmFnQXhpcyA9IF9hLmRyYWdBeGlzLCBkcmFnR3JpZCA9IF9hLmRyYWdHcmlkLCBib3VuZHMgPSBfYS5ib3VuZHMsIGVuYWJsZVVzZXJTZWxlY3RIYWNrID0gX2EuZW5hYmxlVXNlclNlbGVjdEhhY2ssIGNhbmNlbCA9IF9hLmNhbmNlbCwgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgb25SZXNpemVTdGFydCA9IF9hLm9uUmVzaXplU3RhcnQsIG9uUmVzaXplID0gX2Eub25SZXNpemUsIG9uUmVzaXplU3RvcCA9IF9hLm9uUmVzaXplU3RvcCwgb25EcmFnU3RhcnQgPSBfYS5vbkRyYWdTdGFydCwgb25EcmFnID0gX2Eub25EcmFnLCBvbkRyYWdTdG9wID0gX2Eub25EcmFnU3RvcCwgcmVzaXplSGFuZGxlU3R5bGVzID0gX2EucmVzaXplSGFuZGxlU3R5bGVzLCByZXNpemVIYW5kbGVDbGFzc2VzID0gX2EucmVzaXplSGFuZGxlQ2xhc3NlcywgcmVzaXplSGFuZGxlQ29tcG9uZW50ID0gX2EucmVzaXplSGFuZGxlQ29tcG9uZW50LCBlbmFibGVSZXNpemluZyA9IF9hLmVuYWJsZVJlc2l6aW5nLCByZXNpemVHcmlkID0gX2EucmVzaXplR3JpZCwgcmVzaXplSGFuZGxlV3JhcHBlckNsYXNzID0gX2EucmVzaXplSGFuZGxlV3JhcHBlckNsYXNzLCByZXNpemVIYW5kbGVXcmFwcGVyU3R5bGUgPSBfYS5yZXNpemVIYW5kbGVXcmFwcGVyU3R5bGUsIHNjYWxlID0gX2Euc2NhbGUsIGFsbG93QW55Q2xpY2sgPSBfYS5hbGxvd0FueUNsaWNrLCByZXNpemFibGVQcm9wcyA9IF9fcmVzdChfYSwgW1wiZGlzYWJsZURyYWdnaW5nXCIsIFwic3R5bGVcIiwgXCJkcmFnSGFuZGxlQ2xhc3NOYW1lXCIsIFwicG9zaXRpb25cIiwgXCJvbk1vdXNlRG93blwiLCBcIm9uTW91c2VVcFwiLCBcImRyYWdBeGlzXCIsIFwiZHJhZ0dyaWRcIiwgXCJib3VuZHNcIiwgXCJlbmFibGVVc2VyU2VsZWN0SGFja1wiLCBcImNhbmNlbFwiLCBcImNoaWxkcmVuXCIsIFwib25SZXNpemVTdGFydFwiLCBcIm9uUmVzaXplXCIsIFwib25SZXNpemVTdG9wXCIsIFwib25EcmFnU3RhcnRcIiwgXCJvbkRyYWdcIiwgXCJvbkRyYWdTdG9wXCIsIFwicmVzaXplSGFuZGxlU3R5bGVzXCIsIFwicmVzaXplSGFuZGxlQ2xhc3Nlc1wiLCBcInJlc2l6ZUhhbmRsZUNvbXBvbmVudFwiLCBcImVuYWJsZVJlc2l6aW5nXCIsIFwicmVzaXplR3JpZFwiLCBcInJlc2l6ZUhhbmRsZVdyYXBwZXJDbGFzc1wiLCBcInJlc2l6ZUhhbmRsZVdyYXBwZXJTdHlsZVwiLCBcInNjYWxlXCIsIFwiYWxsb3dBbnlDbGlja1wiXSk7XG4gICAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSB0aGlzLnByb3BzLmRlZmF1bHQgPyBfX2Fzc2lnbih7fSwgdGhpcy5wcm9wcy5kZWZhdWx0KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUmVtb3ZlIHVua25vd24gcHJvcHMsIHNlZSBhbHNvIGh0dHBzOi8vcmVhY3Rqcy5vcmcvd2FybmluZ3MvdW5rbm93bi1wcm9wLmh0bWxcbiAgICAgICAgZGVsZXRlIHJlc2l6YWJsZVByb3BzLmRlZmF1bHQ7XG4gICAgICAgIHZhciBjdXJzb3JTdHlsZSA9IGRpc2FibGVEcmFnZ2luZyB8fCBkcmFnSGFuZGxlQ2xhc3NOYW1lID8geyBjdXJzb3I6IFwiYXV0b1wiIH0gOiB7IGN1cnNvcjogXCJtb3ZlXCIgfTtcbiAgICAgICAgdmFyIGlubmVyU3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzaXphYmxlU3R5bGUpLCBjdXJzb3JTdHlsZSksIHN0eWxlKTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5vZmZzZXRGcm9tUGFyZW50LCBsZWZ0ID0gX2IubGVmdCwgdG9wID0gX2IudG9wO1xuICAgICAgICB2YXIgZHJhZ2dhYmxlUG9zaXRpb247XG4gICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgZHJhZ2dhYmxlUG9zaXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeDogcG9zaXRpb24ueCAtIGxlZnQsXG4gICAgICAgICAgICAgICAgeTogcG9zaXRpb24ueSAtIHRvcCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gSU5GTzogTWFrZSB1bmNvbnRvcm9sbGVkIGNvbXBvbmVudCB3aGVuIHJlc2l6aW5nIHRvIGNvbnRyb2wgcG9zaXRpb24gYnkgc2V0UG9zdGlvbi5cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuc3RhdGUucmVzaXppbmcgPyB1bmRlZmluZWQgOiBkcmFnZ2FibGVQb3NpdGlvbjtcbiAgICAgICAgdmFyIGRyYWdBeGlzT3JVbmRlZmluZWQgPSB0aGlzLnN0YXRlLnJlc2l6aW5nID8gXCJib3RoXCIgOiBkcmFnQXhpcztcbiAgICAgICAgcmV0dXJuIChjcmVhdGVFbGVtZW50KERyYWdnYWJsZSwgeyByZWY6IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgX3RoaXMuZHJhZ2dhYmxlID0gYztcbiAgICAgICAgICAgIH0sIGhhbmRsZTogZHJhZ0hhbmRsZUNsYXNzTmFtZSA/IFwiLlwiLmNvbmNhdChkcmFnSGFuZGxlQ2xhc3NOYW1lKSA6IHVuZGVmaW5lZCwgZGVmYXVsdFBvc2l0aW9uOiBkZWZhdWx0VmFsdWUsIG9uTW91c2VEb3duOiBvbk1vdXNlRG93biwgXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBvbk1vdXNlVXA6IG9uTW91c2VVcCwgb25TdGFydDogdGhpcy5vbkRyYWdTdGFydCwgb25EcmFnOiB0aGlzLm9uRHJhZywgb25TdG9wOiB0aGlzLm9uRHJhZ1N0b3AsIGF4aXM6IGRyYWdBeGlzT3JVbmRlZmluZWQsIGRpc2FibGVkOiBkaXNhYmxlRHJhZ2dpbmcsIGdyaWQ6IGRyYWdHcmlkLCBib3VuZHM6IGJvdW5kcyA/IHRoaXMuc3RhdGUuYm91bmRzIDogdW5kZWZpbmVkLCBwb3NpdGlvbjogcG9zLCBlbmFibGVVc2VyU2VsZWN0SGFjazogZW5hYmxlVXNlclNlbGVjdEhhY2ssIGNhbmNlbDogY2FuY2VsLCBzY2FsZTogc2NhbGUsIGFsbG93QW55Q2xpY2s6IGFsbG93QW55Q2xpY2ssIG5vZGVSZWY6IHRoaXMucmVzaXphYmxlRWxlbWVudCB9LFxuICAgICAgICAgICAgY3JlYXRlRWxlbWVudChSZXNpemFibGUsIF9fYXNzaWduKHt9LCByZXNpemFibGVQcm9wcywgeyByZWY6IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVzaXphYmxlID0gYztcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVzaXphYmxlRWxlbWVudC5jdXJyZW50ID0gYy5yZXNpemFibGU7XG4gICAgICAgICAgICAgICAgfSwgZGVmYXVsdFNpemU6IGRlZmF1bHRWYWx1ZSwgc2l6ZTogdGhpcy5wcm9wcy5zaXplLCBlbmFibGU6IHR5cGVvZiBlbmFibGVSZXNpemluZyA9PT0gXCJib29sZWFuXCIgPyBnZXRFbmFibGVSZXNpemluZ0J5RmxhZyhlbmFibGVSZXNpemluZykgOiBlbmFibGVSZXNpemluZywgb25SZXNpemVTdGFydDogdGhpcy5vblJlc2l6ZVN0YXJ0LCBvblJlc2l6ZTogdGhpcy5vblJlc2l6ZSwgb25SZXNpemVTdG9wOiB0aGlzLm9uUmVzaXplU3RvcCwgc3R5bGU6IGlubmVyU3R5bGUsIG1pbldpZHRoOiB0aGlzLnByb3BzLm1pbldpZHRoLCBtaW5IZWlnaHQ6IHRoaXMucHJvcHMubWluSGVpZ2h0LCBtYXhXaWR0aDogdGhpcy5zdGF0ZS5yZXNpemluZyA/IHRoaXMuc3RhdGUubWF4V2lkdGggOiB0aGlzLnByb3BzLm1heFdpZHRoLCBtYXhIZWlnaHQ6IHRoaXMuc3RhdGUucmVzaXppbmcgPyB0aGlzLnN0YXRlLm1heEhlaWdodCA6IHRoaXMucHJvcHMubWF4SGVpZ2h0LCBncmlkOiByZXNpemVHcmlkLCBoYW5kbGVXcmFwcGVyQ2xhc3M6IHJlc2l6ZUhhbmRsZVdyYXBwZXJDbGFzcywgaGFuZGxlV3JhcHBlclN0eWxlOiByZXNpemVIYW5kbGVXcmFwcGVyU3R5bGUsIGxvY2tBc3BlY3RSYXRpbzogdGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW8sIGxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGg6IHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aCwgbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQ6IHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQsIGhhbmRsZVN0eWxlczogcmVzaXplSGFuZGxlU3R5bGVzLCBoYW5kbGVDbGFzc2VzOiByZXNpemVIYW5kbGVDbGFzc2VzLCBoYW5kbGVDb21wb25lbnQ6IHJlc2l6ZUhhbmRsZUNvbXBvbmVudCwgc2NhbGU6IHRoaXMucHJvcHMuc2NhbGUgfSksIGNoaWxkcmVuKSkpO1xuICAgIH07XG4gICAgUm5kLmRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgbWF4V2lkdGg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICBtYXhIZWlnaHQ6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgb25SZXNpemVTdGFydDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvblJlc2l6ZTogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvblJlc2l6ZVN0b3A6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25EcmFnU3RhcnQ6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25EcmFnOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uRHJhZ1N0b3A6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICB9O1xuICAgIHJldHVybiBSbmQ7XG59KFB1cmVDb21wb25lbnQpKTtcblxuZXhwb3J0IHsgUm5kIH07XG4iLCJpbXBvcnQgeyBjbmIgfSBmcm9tICdjbmJ1aWxkZXInO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgem9vbUxldmVsIH0gZnJvbSAnem9vbS1sZXZlbCc7XG5pbXBvcnQgeyBEcmFnZ2FibGVDb3JlIH0gZnJvbSAncmVhY3QtZHJhZ2dhYmxlJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG52YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICB9LCBfdHlwZW9mKG9iaik7XG59XG5cbnZhciBkb2MgPSAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoZG9jdW1lbnQpKSA9PT0gJ29iamVjdCcgPyBkb2N1bWVudCA6IG51bGw7XG52YXIgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbnZhciBpc1VuZGVmID0gZnVuY3Rpb24gaXNVbmRlZih2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCc7XG59O1xudmFyIGlzRnVuID0gZnVuY3Rpb24gaXNGdW4odikge1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdmdW5jdGlvbic7XG59O1xudmFyIGlzTnVtID0gZnVuY3Rpb24gaXNOdW0odikge1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gV2lsbCByZXR1cm4gcmVuZGVyZXIgcmVzdWx0IGlmIHByZXNlbnRlZCwgZGl2IGVsZW1lbnQgb3RoZXJ3aXNlLlxyXG4gKiBJZiByZW5kZXJlciBpcyBwcmVzZW50ZWQgaXQnbGwgcmVjZWl2ZSBgZWxlbWVudFJlZmAgZnVuY3Rpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMgSFRNTEVsZW1lbnQncyByZWYuXHJcbiAqXHJcbiAqIEBwYXJhbSBwcm9wcyB7RWxlbWVudFByb3BzV2l0aEVsZW1lbnRSZWZBbmRSZW5kZXJlcn1cclxuICogQHBhcmFtIGVsZW1lbnRSZWYge0VsZW1lbnRSZWZ9XHJcbiAqL1xuXG52YXIgcmVuZGVyRGl2V2l0aFJlbmRlcmVyID0gZnVuY3Rpb24gcmVuZGVyRGl2V2l0aFJlbmRlcmVyKHByb3BzLCBlbGVtZW50UmVmKSB7XG4gIGlmIChpc0Z1bihwcm9wcy5yZW5kZXJlcikpIHtcbiAgICBwcm9wcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcbiAgICB2YXIgcmVuZGVyZXIgPSBwcm9wcy5yZW5kZXJlcjtcbiAgICBkZWxldGUgcHJvcHMucmVuZGVyZXI7XG4gICAgcmV0dXJuIHJlbmRlcmVyKHByb3BzKTtcbiAgfVxuXG4gIGRlbGV0ZSBwcm9wcy5lbGVtZW50UmVmO1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICByZWY6IGVsZW1lbnRSZWZcbiAgfSkpO1xufTtcblxudmFyIGdldElubmVyU2l6ZSA9IGZ1bmN0aW9uIGdldElubmVyU2l6ZShlbCwgZGltZW5zaW9uLCBwYWRkaW5nMSwgcGFkZGluZzIpIHtcbiAgdmFyIHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoZWwpO1xuXG4gIGlmIChzdHlsZXMuYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgKE51bWJlci5wYXJzZUZsb2F0KHN0eWxlc1tkaW1lbnNpb25dKSB8fCAwKSAtIChOdW1iZXIucGFyc2VGbG9hdChzdHlsZXNbcGFkZGluZzFdKSB8fCAwKSAtIChOdW1iZXIucGFyc2VGbG9hdChzdHlsZXNbcGFkZGluZzJdKSB8fCAwKSk7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzW2RpbWVuc2lvbl0pIHx8IDA7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gZWxlbWVudCdzIGhlaWdodCB3aXRob3V0IHBhZGRpbmdcclxuICovXG5cblxudmFyIGdldElubmVySGVpZ2h0ID0gZnVuY3Rpb24gZ2V0SW5uZXJIZWlnaHQoZWwpIHtcbiAgcmV0dXJuIGdldElubmVyU2l6ZShlbCwgJ2hlaWdodCcsICdwYWRkaW5nVG9wJywgJ3BhZGRpbmdCb3R0b20nKTtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIFJldHVybiBlbGVtZW50J3Mgd2lkdGggd2l0aG91dCBwYWRkaW5nXHJcbiAqL1xuXG52YXIgZ2V0SW5uZXJXaWR0aCA9IGZ1bmN0aW9uIGdldElubmVyV2lkdGgoZWwpIHtcbiAgcmV0dXJuIGdldElubmVyU2l6ZShlbCwgJ3dpZHRoJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdSaWdodCcpO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIHVuaXF1ZSBVVUlEIHY0XHJcbiAqL1xuXG52YXIgdXVpZCA9IGZ1bmN0aW9uIHV1aWQoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tc2hhZG93XG4gIHZhciB1dWlkID0gJyc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSsrKSB7XG4gICAgc3dpdGNoIChpKSB7XG4gICAgICBjYXNlIDg6XG4gICAgICBjYXNlIDIwOlxuICAgICAgICB7XG4gICAgICAgICAgdXVpZCArPSBcIi1cIi5jb25jYXQoTWF0aC50cnVuYyhNYXRoLnJhbmRvbSgpICogMTYpLnRvU3RyaW5nKDE2KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAxMjpcbiAgICAgICAge1xuICAgICAgICAgIHV1aWQgKz0gJy00JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDE2OlxuICAgICAgICB7XG4gICAgICAgICAgdXVpZCArPSBcIi1cIi5jb25jYXQoKE1hdGgucmFuZG9tKCkgKiAxNiB8IDAgJiAzIHwgOCkudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgdXVpZCArPSBNYXRoLnRydW5jKE1hdGgucmFuZG9tKCkgKiAxNikudG9TdHJpbmcoMTYpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHV1aWQ7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDYWxjdWxhdGUgdGh1bWIgc2l6ZSBmb3IgZ2l2ZW4gdmlld3BvcnQgYW5kIHRyYWNrIHBhcmFtZXRlcnNcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGNvbnRlbnRTaXplIC0gU2Nyb2xsYWJsZSBjb250ZW50IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHZpZXdwb3J0U2l6ZSAtIFZpZXdwb3J0IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHRyYWNrU2l6ZSAtIFRyYWNrIHNpemUgdGh1bWIgY2FuIG1vdmVcclxuICogQHBhcmFtIHtudW1iZXJ9IG1pbmltYWxTaXplIC0gTWluaW1hbCB0aHVtYidzIHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IG1heGltYWxTaXplIC0gTWF4aW1hbCB0aHVtYidzIHNpemVcclxuICovXG5cbnZhciBjYWxjVGh1bWJTaXplID0gZnVuY3Rpb24gY2FsY1RodW1iU2l6ZShjb250ZW50U2l6ZSwgdmlld3BvcnRTaXplLCB0cmFja1NpemUsIG1pbmltYWxTaXplLCBtYXhpbWFsU2l6ZSkge1xuICBpZiAodmlld3BvcnRTaXplID49IGNvbnRlbnRTaXplKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICB2YXIgdGh1bWJTaXplID0gdmlld3BvcnRTaXplIC8gY29udGVudFNpemUgKiB0cmFja1NpemU7XG5cbiAgaWYgKGlzTnVtKG1heGltYWxTaXplKSkge1xuICAgIHRodW1iU2l6ZSA9IE1hdGgubWluKG1heGltYWxTaXplLCB0aHVtYlNpemUpO1xuICB9XG5cbiAgaWYgKGlzTnVtKG1pbmltYWxTaXplKSkge1xuICAgIHRodW1iU2l6ZSA9IE1hdGgubWF4KG1pbmltYWxTaXplLCB0aHVtYlNpemUpO1xuICB9XG5cbiAgcmV0dXJuIHRodW1iU2l6ZTtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIENhbGN1bGF0ZSB0aHVtYiBvZmZzZXQgZm9yIGdpdmVuIHZpZXdwb3J0LCB0cmFjayBhbmQgdGh1bWIgcGFyYW1ldGVyc1xyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY29udGVudFNpemUgLSBTY3JvbGxhYmxlIGNvbnRlbnQgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmlld3BvcnRTaXplIC0gVmlld3BvcnQgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdHJhY2tTaXplIC0gVHJhY2sgc2l6ZSB0aHVtYiBjYW4gbW92ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdGh1bWJTaXplIC0gVGh1bWIgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gc2Nyb2xsIC0gU2Nyb2xsIHZhbHVlIHRvIHJlcHJlc2VudFxyXG4gKi9cblxudmFyIGNhbGNUaHVtYk9mZnNldCA9IGZ1bmN0aW9uIGNhbGNUaHVtYk9mZnNldChjb250ZW50U2l6ZSwgdmlld3BvcnRTaXplLCB0cmFja1NpemUsIHRodW1iU2l6ZSwgc2Nyb2xsKSB7XG4gIGlmICghc2Nyb2xsIHx8ICF0aHVtYlNpemUgfHwgdmlld3BvcnRTaXplID49IGNvbnRlbnRTaXplKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gKHRyYWNrU2l6ZSAtIHRodW1iU2l6ZSkgKiBzY3JvbGwgLyAoY29udGVudFNpemUgLSB2aWV3cG9ydFNpemUpO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2FsY3VsYXRlIHNjcm9sbCBmb3IgZ2l2ZW4gdmlld3BvcnQsIHRyYWNrIGFuZCB0aHVtYiBwYXJhbWV0ZXJzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb250ZW50U2l6ZSAtIFNjcm9sbGFibGUgY29udGVudCBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2aWV3cG9ydFNpemUgLSBWaWV3cG9ydCBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0cmFja1NpemUgLSBUcmFjayBzaXplIHRodW1iIGNhbiBtb3ZlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aHVtYlNpemUgLSBUaHVtYiBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aHVtYk9mZnNldCAtIFRodW1iJ3Mgb2Zmc2V0IHJlcHJlc2VudGluZyB0aGUgc2Nyb2xsXHJcbiAqL1xuXG52YXIgY2FsY1Njcm9sbEZvclRodW1iT2Zmc2V0ID0gZnVuY3Rpb24gY2FsY1Njcm9sbEZvclRodW1iT2Zmc2V0KGNvbnRlbnRTaXplLCB2aWV3cG9ydFNpemUsIHRyYWNrU2l6ZSwgdGh1bWJTaXplLCB0aHVtYk9mZnNldCkge1xuICBpZiAoIXRodW1iT2Zmc2V0IHx8ICF0aHVtYlNpemUgfHwgdmlld3BvcnRTaXplID49IGNvbnRlbnRTaXplKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gdGh1bWJPZmZzZXQgKiAoY29udGVudFNpemUgLSB2aWV3cG9ydFNpemUpIC8gKHRyYWNrU2l6ZSAtIHRodW1iU2l6ZSk7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHNjcm9sbGJhciB3aWR0aCBzcGVjaWZpYyBmb3IgY3VycmVudCBlbnZpcm9ubWVudC4gQ2FuIHJldHVybiB1bmRlZmluZWQgaWYgRE9NIGlzIG5vdCByZWFkeSB5ZXQuXHJcbiAqL1xuXG52YXIgZ2V0U2Nyb2xsYmFyV2lkdGggPSBmdW5jdGlvbiBnZXRTY3JvbGxiYXJXaWR0aChmb3JjZSkge1xuICBpZiAoZm9yY2UgPT09IHZvaWQgMCkge1xuICAgIGZvcmNlID0gZmFsc2U7XG4gIH1cblxuICBpZiAoIWRvYykge1xuICAgIGdldFNjcm9sbGJhcldpZHRoLl9jYWNoZSA9IDA7XG4gICAgcmV0dXJuIGdldFNjcm9sbGJhcldpZHRoLl9jYWNoZTtcbiAgfVxuXG4gIGlmICghZm9yY2UgJiYgIWlzVW5kZWYoZ2V0U2Nyb2xsYmFyV2lkdGguX2NhY2hlKSkge1xuICAgIHJldHVybiBnZXRTY3JvbGxiYXJXaWR0aC5fY2FjaGU7XG4gIH1cblxuICB2YXIgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAncG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwcHg7aGVpZ2h0OjEwMHB4O3RvcDotOTk5cHg7bGVmdDotOTk5cHg7b3ZlcmZsb3c6c2Nyb2xsOycpO1xuICBkb2MuYm9keS5hcHBlbmQoZWwpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4gIGlmIChlbC5jbGllbnRXaWR0aCA9PT0gMCkge1xuICAgIC8vIERvIG5vdCBldmVuIGNhY2hlIHRoaXMgdmFsdWUgYmVjYXVzZSB0aGVyZSBpcyBubyBjYWxjdWxhdGlvbnMuIElzc3VlIGh0dHBzOi8vZ2l0aHViLmNvbS94b2JvdHlpL3JlYWN0LXNjcm9sbGJhcnMtY3VzdG9tL2lzc3Vlcy8xMjNcbiAgICBlbC5yZW1vdmUoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBnZXRTY3JvbGxiYXJXaWR0aC5fY2FjaGUgPSAxMDAgLSBlbC5jbGllbnRXaWR0aDtcbiAgZWwucmVtb3ZlKCk7XG4gIHJldHVybiBnZXRTY3JvbGxiYXJXaWR0aC5fY2FjaGU7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBEZXRlY3QgbmVlZCBvZiBob3Jpem9udGFsIHNjcm9sbCByZXZlcnNlIHdoaWxlIFJUTC5cclxuICovXG5cbnZhciBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsID0gZnVuY3Rpb24gc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbChmb3JjZSkge1xuICBpZiAoZm9yY2UgPT09IHZvaWQgMCkge1xuICAgIGZvcmNlID0gZmFsc2U7XG4gIH1cblxuICBpZiAoIWZvcmNlICYmICFpc1VuZGVmKHNob3VsZFJldmVyc2VSdGxTY3JvbGwuX2NhY2hlKSkge1xuICAgIHJldHVybiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsLl9jYWNoZTtcbiAgfVxuXG4gIGlmICghZG9jKSB7XG4gICAgc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbC5fY2FjaGUgPSBmYWxzZTtcbiAgICByZXR1cm4gc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbC5fY2FjaGU7XG4gIH1cblxuICB2YXIgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHZhciBjaGlsZCA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZWwuYXBwZW5kKGNoaWxkKTtcbiAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsICdwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDBweDtoZWlnaHQ6MTAwcHg7dG9wOi05OTlweDtsZWZ0Oi05OTlweDtvdmVyZmxvdzpzY3JvbGw7ZGlyZWN0aW9uOnJ0bCcpO1xuICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOjEwMDBweDtoZWlnaHQ6MTAwMHB4Jyk7XG4gIGRvYy5ib2R5LmFwcGVuZChlbCk7XG4gIGVsLnNjcm9sbExlZnQgPSAtNTA7XG4gIHNob3VsZFJldmVyc2VSdGxTY3JvbGwuX2NhY2hlID0gZWwuc2Nyb2xsTGVmdCA9PT0gLTUwO1xuICBlbC5yZW1vdmUoKTtcbiAgcmV0dXJuIHNob3VsZFJldmVyc2VSdGxTY3JvbGwuX2NhY2hlO1xufTtcblxudmFyIEVtaXR0ciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEVtaXR0cihtYXhIYW5kbGVycykge1xuICAgIGlmIChtYXhIYW5kbGVycyA9PT0gdm9pZCAwKSB7XG4gICAgICBtYXhIYW5kbGVycyA9IDEwO1xuICAgIH1cblxuICAgIHRoaXMuc2V0TWF4SGFuZGxlcnMobWF4SGFuZGxlcnMpO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIEVtaXR0ci5fY2FsbEV2ZW50SGFuZGxlcnMgPSBmdW5jdGlvbiAoZW1pdHRlciwgaGFuZGxlcnMsIGFyZ3MpIHtcbiAgICBpZiAoIWhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChoYW5kbGVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIFJlZmxlY3QuYXBwbHkoaGFuZGxlcnNbMF0sIGVtaXR0ZXIsIGFyZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhhbmRsZXJzID0gX19zcHJlYWRBcnJheShbXSwgaGFuZGxlcnMsIHRydWUpO1xuICAgIHZhciBpZHg7XG5cbiAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGhhbmRsZXJzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgIFJlZmxlY3QuYXBwbHkoaGFuZGxlcnNbaWR4XSwgZW1pdHRlciwgYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUuc2V0TWF4SGFuZGxlcnMgPSBmdW5jdGlvbiAoY291bnQpIHtcbiAgICBpZiAoIWlzTnVtKGNvdW50KSB8fCBjb3VudCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgbWF4SGFuZGxlcnMgdG8gYmUgYSBwb3NpdGl2ZSBudW1iZXIsIGdvdCAnXCIuY29uY2F0KGNvdW50LCBcIicgb2YgdHlwZSBcIikuY29uY2F0KF90eXBlb2YoY291bnQpKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4SGFuZGxlcnMgPSBjb3VudDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLmdldE1heEhhbmRsZXJzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhIYW5kbGVycztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICBpZiAoX3R5cGVvZih0aGlzLl9oYW5kbGVyc1tuYW1lXSkgIT09ICdvYmplY3QnIHx8ICFBcnJheS5pc0FycmF5KHRoaXMuX2hhbmRsZXJzW25hbWVdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIEVtaXR0ci5fY2FsbEV2ZW50SGFuZGxlcnModGhpcywgdGhpcy5faGFuZGxlcnNbbmFtZV0sIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgRW1pdHRyLl9hZGRIYW5kbGVyKHRoaXMsIG5hbWUsIGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5wcmVwZW5kT24gPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIEVtaXR0ci5fYWRkSGFuZGxlcih0aGlzLCBuYW1lLCBoYW5kbGVyLCB0cnVlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgaWYgKCFpc0Z1bihoYW5kbGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGV2ZW50IGhhbmRsZXIgdG8gYmUgYSBmdW5jdGlvbiwgZ290IFwiLmNvbmNhdChfdHlwZW9mKGhhbmRsZXIpKSk7XG4gICAgfVxuXG4gICAgRW1pdHRyLl9hZGRIYW5kbGVyKHRoaXMsIG5hbWUsIHRoaXMuX3dyYXBPbmNlSGFuZGxlcihuYW1lLCBoYW5kbGVyKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLnByZXBlbmRPbmNlID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAoIWlzRnVuKGhhbmRsZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgZXZlbnQgaGFuZGxlciB0byBiZSBhIGZ1bmN0aW9uLCBnb3QgXCIuY29uY2F0KF90eXBlb2YoaGFuZGxlcikpKTtcbiAgICB9XG5cbiAgICBFbWl0dHIuX2FkZEhhbmRsZXIodGhpcywgbmFtZSwgdGhpcy5fd3JhcE9uY2VIYW5kbGVyKG5hbWUsIGhhbmRsZXIpLCB0cnVlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBFbWl0dHIuX3JlbW92ZUhhbmRsZXIodGhpcywgbmFtZSwgaGFuZGxlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLnJlbW92ZUFsbEhhbmRsZXJzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX2hhbmRsZXJzO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB2YXIgcmVtb3ZlSGFuZGxlcnMgPSBoYW5kbGVycy5yZW1vdmVIYW5kbGVyO1xuICAgIGRlbGV0ZSBoYW5kbGVycy5yZW1vdmVIYW5kbGVyO1xuICAgIHZhciBpZHg7XG4gICAgdmFyIGV2ZW50TmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pbixuby1yZXN0cmljdGVkLXN5bnRheFxuXG4gICAgZm9yIChldmVudE5hbWUgaW4gaGFuZGxlcnMpIHtcbiAgICAgIGZvciAoaWR4ID0gaGFuZGxlcnNbZXZlbnROYW1lXS5sZW5ndGggLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgRW1pdHRyLl9jYWxsRXZlbnRIYW5kbGVycyh0aGlzLCByZW1vdmVIYW5kbGVycywgW2V2ZW50TmFtZSwgaGFuZGxlcnNbZXZlbnROYW1lXVtpZHhdLmhhbmRsZXIgfHwgaGFuZGxlcnNbZXZlbnROYW1lXVtpZHhdXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5fd3JhcE9uY2VIYW5kbGVyID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICB2YXIgb25jZVN0YXRlID0ge1xuICAgICAgZmlyZWQ6IGZhbHNlLFxuICAgICAgaGFuZGxlcjogaGFuZGxlcixcbiAgICAgIHdyYXBwZWRIYW5kbGVyOiB1bmRlZmluZWQsXG4gICAgICBlbWl0dGVyOiB0aGlzLFxuICAgICAgZXZlbnQ6IG5hbWVcbiAgICB9O1xuXG4gICAgdmFyIHdyYXBwZWRIYW5kbGVyID0gRW1pdHRyLl9vbmNlV3JhcHBlci5iaW5kKG9uY2VTdGF0ZSk7XG5cbiAgICBvbmNlU3RhdGUud3JhcHBlZEhhbmRsZXIgPSB3cmFwcGVkSGFuZGxlcjtcbiAgICB3cmFwcGVkSGFuZGxlci5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB3cmFwcGVkSGFuZGxlci5ldmVudCA9IG5hbWU7XG4gICAgcmV0dXJuIHdyYXBwZWRIYW5kbGVyO1xuICB9O1xuXG4gIEVtaXR0ci5fYWRkSGFuZGxlciA9IGZ1bmN0aW9uIChlbWl0dGVyLCBuYW1lLCBoYW5kbGVyLCBwcmVwZW5kKSB7XG4gICAgaWYgKHByZXBlbmQgPT09IHZvaWQgMCkge1xuICAgICAgcHJlcGVuZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaXNGdW4oaGFuZGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBldmVudCBoYW5kbGVyIHRvIGJlIGEgZnVuY3Rpb24sIGdvdCBcIi5jb25jYXQoX3R5cGVvZihoYW5kbGVyKSkpO1xuICAgIH1cblxuICAgIGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdID0gZW1pdHRlci5faGFuZGxlcnNbbmFtZV0gfHwgW107XG4gICAgZW1pdHRlci5lbWl0KCdhZGRIYW5kbGVyJywgbmFtZSwgaGFuZGxlcik7XG5cbiAgICBpZiAocHJlcGVuZCkge1xuICAgICAgZW1pdHRlci5faGFuZGxlcnNbbmFtZV0udW5zaGlmdChoYW5kbGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5faGFuZGxlcnNbbmFtZV0ucHVzaChoYW5kbGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW1pdHRlcjtcbiAgfTtcblxuICBFbWl0dHIuX29uY2VXcmFwcGVyID0gZnVuY3Rpb24gX29uY2VXcmFwcGVyKCkge1xuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5maXJlZCkge1xuICAgICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgICB0aGlzLmVtaXR0ZXIub2ZmKHRoaXMuZXZlbnQsIHRoaXMud3JhcHBlZEhhbmRsZXIpO1xuICAgICAgUmVmbGVjdC5hcHBseSh0aGlzLmhhbmRsZXIsIHRoaXMuZW1pdHRlciwgYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIEVtaXR0ci5fcmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uIChlbWl0dGVyLCBuYW1lLCBoYW5kbGVyKSB7XG4gICAgaWYgKCFpc0Z1bihoYW5kbGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGV2ZW50IGhhbmRsZXIgdG8gYmUgYSBmdW5jdGlvbiwgZ290IFwiLmNvbmNhdChfdHlwZW9mKGhhbmRsZXIpKSk7XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWYoZW1pdHRlci5faGFuZGxlcnNbbmFtZV0pIHx8ICFlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBlbWl0dGVyO1xuICAgIH1cblxuICAgIHZhciBpZHggPSAtMTtcblxuICAgIGlmIChlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVswXSA9PT0gaGFuZGxlciB8fCBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVswXS5oYW5kbGVyID09PSBoYW5kbGVyKSB7XG4gICAgICAgIGlkeCA9IDA7XG4gICAgICAgIGhhbmRsZXIgPSBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVswXS5oYW5kbGVyIHx8IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGlkeCA9IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdLmxlbmd0aCAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICBpZiAoZW1pdHRlci5faGFuZGxlcnNbbmFtZV1baWR4XSA9PT0gaGFuZGxlciB8fCBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVtpZHhdLmhhbmRsZXIgPT09IGhhbmRsZXIpIHtcbiAgICAgICAgICBoYW5kbGVyID0gZW1pdHRlci5faGFuZGxlcnNbbmFtZV1baWR4XS5oYW5kbGVyIHx8IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdW2lkeF07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGVtaXR0ZXI7XG4gICAgfVxuXG4gICAgaWYgKGlkeCA9PT0gMCkge1xuICAgICAgZW1pdHRlci5faGFuZGxlcnNbbmFtZV0uc2hpZnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5faGFuZGxlcnNbbmFtZV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgfVxuXG4gICAgZW1pdHRlci5lbWl0KCdyZW1vdmVIYW5kbGVyJywgbmFtZSwgaGFuZGxlcik7XG4gICAgcmV0dXJuIGVtaXR0ZXI7XG4gIH07XG5cbiAgcmV0dXJuIEVtaXR0cjtcbn0oKTtcblxudmFyIFJBRkxvb3AgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSQUZMb29wKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTGlzdCBvZiB0YXJnZXRzIHRvIHVwZGF0ZVxyXG4gICAgICovXG5cblxuICAgIHRoaXMudGFyZ2V0cyA9IFtdO1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIElEIG9mIHJlcXVlc3RlZCBhbmltYXRpb24gZnJhbWUuIFZhbHVhYmxlIG9ubHkgaWYgbG9vcCBpcyBhY3RpdmUgYW5kIGhhcyBpdGVtcyB0byBpdGVyYXRlLlxyXG4gICAgICovXG5cbiAgICB0aGlzLmFuaW1hdGlvbkZyYW1lSUQgPSAwO1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIExvb3AncyBzdGF0ZS5cclxuICAgICAqL1xuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTdGFydCB0aGUgbG9vcCBpZiBpdCB3YXNuJ3QgeWV0LlxyXG4gICAgICovXG5cbiAgICB0aGlzLnN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5faXNBY3RpdmUgJiYgX3RoaXMudGFyZ2V0cy5sZW5ndGgpIHtcbiAgICAgICAgX3RoaXMuX2lzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgaWYgKF90aGlzLmFuaW1hdGlvbkZyYW1lSUQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKF90aGlzLmFuaW1hdGlvbkZyYW1lSUQpO1xuICAgICAgICBfdGhpcy5hbmltYXRpb25GcmFtZUlEID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnJhZkNhbGxiYWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU3RvcCB0aGUgbG9vcCBpZiBpcyB3YXMgYWN0aXZlLlxyXG4gICAgICovXG5cblxuICAgIHRoaXMuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5faXNBY3RpdmUpIHtcbiAgICAgICAgX3RoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGlmIChfdGhpcy5hbmltYXRpb25GcmFtZUlEKSBjYW5jZWxBbmltYXRpb25GcmFtZShfdGhpcy5hbmltYXRpb25GcmFtZUlEKTtcbiAgICAgICAgX3RoaXMuYW5pbWF0aW9uRnJhbWVJRCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZCB0YXJnZXQgdG8gdGhlIGl0ZXJhdGlvbiBsaXN0IGlmIGl0J3Mgbm90IHRoZXJlLlxyXG4gICAgICovXG5cblxuICAgIHRoaXMuYWRkVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgc2lsZW50KSB7XG4gICAgICBpZiAoc2lsZW50ID09PSB2b2lkIDApIHtcbiAgICAgICAgc2lsZW50ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghX3RoaXMudGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpKSB7XG4gICAgICAgIF90aGlzLnRhcmdldHMucHVzaCh0YXJnZXQpO1xuXG4gICAgICAgIGlmIChfdGhpcy50YXJnZXRzLmxlbmd0aCA9PT0gMSAmJiAhc2lsZW50KSBfdGhpcy5zdGFydCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmUgdGFyZ2V0IGZyb20gaXRlcmF0aW9uIGxpc3QgaWYgaXQgd2FzIHRoZXJlLlxyXG4gICAgICovXG5cblxuICAgIHRoaXMucmVtb3ZlVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgdmFyIGlkeCA9IF90aGlzLnRhcmdldHMuaW5kZXhPZih0YXJnZXQpO1xuXG4gICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICBfdGhpcy50YXJnZXRzLnNwbGljZShpZHgsIDEpO1xuXG4gICAgICAgIGlmIChfdGhpcy50YXJnZXRzLmxlbmd0aCA9PT0gMCkgX3RoaXMuc3RvcCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsYmFjayB0aGF0IGNhbGxlZCBlYWNoIGFuaW1hdGlvbiBmcmFtZS5cclxuICAgICAqL1xuXG5cbiAgICB0aGlzLnJhZkNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5faXNBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3RoaXMudGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIV90aGlzLnRhcmdldHNbaV0uX3VubW91bnRlZCkgX3RoaXMudGFyZ2V0c1tpXS51cGRhdGUoKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuYW5pbWF0aW9uRnJhbWVJRCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShfdGhpcy5yYWZDYWxsYmFjayk7XG4gICAgICByZXR1cm4gX3RoaXMuYW5pbWF0aW9uRnJhbWVJRDtcbiAgICB9O1xuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJBRkxvb3AucHJvdG90eXBlLCBcImlzQWN0aXZlXCIsIHtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBMb29wJ3Mgc3RhdGUuXHJcbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuIFJBRkxvb3A7XG59KCk7XG52YXIgTG9vcCA9IG5ldyBSQUZMb29wKCk7XG5cbnZhciBBWElTX0RJUkVDVElPTjtcblxuKGZ1bmN0aW9uIChBWElTX0RJUkVDVElPTikge1xuICBBWElTX0RJUkVDVElPTltcIlhcIl0gPSBcInhcIjtcbiAgQVhJU19ESVJFQ1RJT05bXCJZXCJdID0gXCJ5XCI7XG59KShBWElTX0RJUkVDVElPTiB8fCAoQVhJU19ESVJFQ1RJT04gPSB7fSkpO1xuXG52YXIgVFJBQ0tfQ0xJQ0tfQkVIQVZJT1I7XG5cbihmdW5jdGlvbiAoVFJBQ0tfQ0xJQ0tfQkVIQVZJT1IpIHtcbiAgVFJBQ0tfQ0xJQ0tfQkVIQVZJT1JbXCJKVU1QXCJdID0gXCJqdW1wXCI7XG4gIFRSQUNLX0NMSUNLX0JFSEFWSU9SW1wiU1RFUFwiXSA9IFwic3RlcFwiO1xufSkoVFJBQ0tfQ0xJQ0tfQkVIQVZJT1IgfHwgKFRSQUNLX0NMSUNLX0JFSEFWSU9SID0ge30pKTtcblxudmFyIFNjcm9sbGJhclRodW1iID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKFNjcm9sbGJhclRodW1iLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIFNjcm9sbGJhclRodW1iKCkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgX3RoaXMuaW5pdGlhbE9mZnNldFggPSAwO1xuICAgIF90aGlzLmluaXRpYWxPZmZzZXRZID0gMDtcbiAgICBfdGhpcy5lbGVtZW50UmVmSGFjayA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICAgIF90aGlzLmxhc3REcmFnRGF0YSA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgZGVsdGFYOiAwLFxuICAgICAgZGVsdGFZOiAwLFxuICAgICAgbGFzdFg6IDAsXG4gICAgICBsYXN0WTogMFxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVPbkRyYWdTdGFydCA9IGZ1bmN0aW9uIChldiwgZGF0YSkge1xuICAgICAgaWYgKCFfdGhpcy5lbGVtZW50KSB7XG4gICAgICAgIF90aGlzLmhhbmRsZU9uRHJhZ1N0b3AoZXYsIGRhdGEpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgICBfdGhpcy5wcmV2VXNlclNlbGVjdCA9IGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdDtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnO1xuICAgICAgICBfdGhpcy5wcmV2T25TZWxlY3RTdGFydCA9IGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQ7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0JywgU2Nyb2xsYmFyVGh1bWIuc2VsZWN0U3RhcnRSZXBsYWNlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkRyYWdTdGFydCkge1xuICAgICAgICBfdGhpcy5wcm9wcy5vbkRyYWdTdGFydChfdGhpcy5sYXN0RHJhZ0RhdGEgPSB7XG4gICAgICAgICAgeDogZGF0YS54IC0gX3RoaXMuaW5pdGlhbE9mZnNldFgsXG4gICAgICAgICAgeTogZGF0YS55IC0gX3RoaXMuaW5pdGlhbE9mZnNldFksXG4gICAgICAgICAgbGFzdFg6IGRhdGEubGFzdFggLSBfdGhpcy5pbml0aWFsT2Zmc2V0WCxcbiAgICAgICAgICBsYXN0WTogZGF0YS5sYXN0WSAtIF90aGlzLmluaXRpYWxPZmZzZXRZLFxuICAgICAgICAgIGRlbHRhWDogZGF0YS5kZWx0YVgsXG4gICAgICAgICAgZGVsdGFZOiBkYXRhLmRlbHRhWVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcmFnZ2luZycpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVPbkRyYWcgPSBmdW5jdGlvbiAoZXYsIGRhdGEpIHtcbiAgICAgIGlmICghX3RoaXMuZWxlbWVudCkge1xuICAgICAgICBfdGhpcy5oYW5kbGVPbkRyYWdTdG9wKGV2LCBkYXRhKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkRyYWcpIHtcbiAgICAgICAgX3RoaXMucHJvcHMub25EcmFnKF90aGlzLmxhc3REcmFnRGF0YSA9IHtcbiAgICAgICAgICB4OiBkYXRhLnggLSBfdGhpcy5pbml0aWFsT2Zmc2V0WCxcbiAgICAgICAgICB5OiBkYXRhLnkgLSBfdGhpcy5pbml0aWFsT2Zmc2V0WSxcbiAgICAgICAgICBsYXN0WDogZGF0YS5sYXN0WCAtIF90aGlzLmluaXRpYWxPZmZzZXRYLFxuICAgICAgICAgIGxhc3RZOiBkYXRhLmxhc3RZIC0gX3RoaXMuaW5pdGlhbE9mZnNldFksXG4gICAgICAgICAgZGVsdGFYOiBkYXRhLmRlbHRhWCxcbiAgICAgICAgICBkZWx0YVk6IGRhdGEuZGVsdGFZXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVPbkRyYWdTdG9wID0gZnVuY3Rpb24gKGV2LCBkYXRhKSB7XG4gICAgICB2YXIgcmVzdWx0RGF0YSA9IGRhdGEgPyB7XG4gICAgICAgIHg6IGRhdGEueCAtIF90aGlzLmluaXRpYWxPZmZzZXRYLFxuICAgICAgICB5OiBkYXRhLnkgLSBfdGhpcy5pbml0aWFsT2Zmc2V0WSxcbiAgICAgICAgbGFzdFg6IGRhdGEubGFzdFggLSBfdGhpcy5pbml0aWFsT2Zmc2V0WCxcbiAgICAgICAgbGFzdFk6IGRhdGEubGFzdFkgLSBfdGhpcy5pbml0aWFsT2Zmc2V0WSxcbiAgICAgICAgZGVsdGFYOiBkYXRhLmRlbHRhWCxcbiAgICAgICAgZGVsdGFZOiBkYXRhLmRlbHRhWVxuICAgICAgfSA6IF90aGlzLmxhc3REcmFnRGF0YTtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkRyYWdFbmQpIF90aGlzLnByb3BzLm9uRHJhZ0VuZChyZXN1bHREYXRhKTtcbiAgICAgIGlmIChfdGhpcy5lbGVtZW50KSBfdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdnaW5nJyk7XG5cbiAgICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gX3RoaXMucHJldlVzZXJTZWxlY3Q7XG5cbiAgICAgICAgaWYgKF90aGlzLnByZXZPblNlbGVjdFN0YXJ0KSB7XG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBfdGhpcy5wcmV2T25TZWxlY3RTdGFydCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5wcmV2T25TZWxlY3RTdGFydCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmluaXRpYWxPZmZzZXRYID0gMDtcbiAgICAgIF90aGlzLmluaXRpYWxPZmZzZXRZID0gMDtcbiAgICAgIF90aGlzLmxhc3REcmFnRGF0YSA9IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgZGVsdGFYOiAwLFxuICAgICAgICBkZWx0YVk6IDAsXG4gICAgICAgIGxhc3RYOiAwLFxuICAgICAgICBsYXN0WTogMFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlT25Nb3VzZURvd24gPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgIGlmICghX3RoaXMuZWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKCFpc1VuZGVmKGV2Lm9mZnNldFgpKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIF90aGlzLmluaXRpYWxPZmZzZXRYID0gZXYub2Zmc2V0WDtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgICAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WSA9IGV2Lm9mZnNldFk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVjdCA9IF90aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldFggPSAoZXYuY2xpZW50WCB8fCBldi50b3VjaGVzWzBdLmNsaWVudFgpIC0gcmVjdC5sZWZ0O1xuICAgICAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WSA9IChldi5jbGllbnRZIHx8IGV2LnRvdWNoZXNbMF0uY2xpZW50WSkgLSByZWN0LnRvcDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy5lbGVtZW50UmVmKSkgX3RoaXMucHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgX3RoaXMuZWxlbWVudCA9IHJlZjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuXG4gICAgICBfdGhpcy5lbGVtZW50UmVmSGFjay5jdXJyZW50ID0gcmVmO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBTY3JvbGxiYXJUaHVtYi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCI8U2Nyb2xsYmFyVGh1bWI+IEVsZW1lbnQgd2FzIG5vdCBjcmVhdGVkLiBQb3NzaWJseSB5b3UgaGF2ZW4ndCBwcm92aWRlZCBIVE1MRGl2RWxlbWVudCB0byByZW5kZXJlcidzIGBlbGVtZW50UmVmYCBmdW5jdGlvbi5cIik7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgU2Nyb2xsYmFyVGh1bWIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaGFuZGxlT25EcmFnU3RvcCgpO1xuICAgIHRoaXMuZWxlbWVudFJlZihudWxsKTtcbiAgfTtcblxuICBTY3JvbGxiYXJUaHVtYi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMucHJvcHM7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5lbGVtZW50UmVmO1xuICAgICAgICB2YXIgYXhpcyA9IF9hLmF4aXM7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vbkRyYWc7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vbkRyYWdFbmQ7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vbkRyYWdTdGFydDtcbiAgICAgICAgdmFyIHByb3BzID0gX19yZXN0KF9hLCBbXCJlbGVtZW50UmVmXCIsIFwiYXhpc1wiLCBcIm9uRHJhZ1wiLCBcIm9uRHJhZ0VuZFwiLCBcIm9uRHJhZ1N0YXJ0XCJdKTtcblxuICAgIHByb3BzLmNsYXNzTmFtZSA9IGNuYignU2Nyb2xsYmFyc0N1c3RvbS1UaHVtYicsIGF4aXMgPT09IEFYSVNfRElSRUNUSU9OLlggPyAnU2Nyb2xsYmFyc0N1c3RvbS1UaHVtYlgnIDogJ1Njcm9sbGJhcnNDdXN0b20tVGh1bWJZJywgcHJvcHMuY2xhc3NOYW1lKTtcblxuICAgIGlmIChwcm9wcy5yZW5kZXJlcikge1xuICAgICAgcHJvcHMuYXhpcyA9IGF4aXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRHJhZ2dhYmxlQ29yZSwge1xuICAgICAgYWxsb3dBbnlDbGljazogZmFsc2UsXG4gICAgICBlbmFibGVVc2VyU2VsZWN0SGFjazogZmFsc2UsXG4gICAgICBvbk1vdXNlRG93bjogdGhpcy5oYW5kbGVPbk1vdXNlRG93bixcbiAgICAgIG9uRHJhZzogdGhpcy5oYW5kbGVPbkRyYWcsXG4gICAgICBvblN0YXJ0OiB0aGlzLmhhbmRsZU9uRHJhZ1N0YXJ0LFxuICAgICAgb25TdG9wOiB0aGlzLmhhbmRsZU9uRHJhZ1N0b3AsXG4gICAgICBub2RlUmVmOiB0aGlzLmVsZW1lbnRSZWZIYWNrXG4gICAgfSwgcmVuZGVyRGl2V2l0aFJlbmRlcmVyKHByb3BzLCB0aGlzLmVsZW1lbnRSZWYpKTtcbiAgfTtcblxuICBTY3JvbGxiYXJUaHVtYi5zZWxlY3RTdGFydFJlcGxhY2VyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICByZXR1cm4gU2Nyb2xsYmFyVGh1bWI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBTY3JvbGxiYXJUcmFjayA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhTY3JvbGxiYXJUcmFjaywgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBTY3JvbGxiYXJUcmFjaygpIHtcbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcblxuICAgIF90aGlzLmVsZW1lbnQgPSBudWxsO1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy5lbGVtZW50UmVmKSkgX3RoaXMucHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgX3RoaXMuZWxlbWVudCA9IHJlZjtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgIGlmICghZXYgfHwgIV90aGlzLmVsZW1lbnQgfHwgZXYuYnV0dG9uICE9PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLm9uQ2xpY2spICYmIGV2LnRhcmdldCA9PT0gX3RoaXMuZWxlbWVudCkge1xuICAgICAgICBpZiAoIWlzVW5kZWYoZXYub2Zmc2V0WCkpIHtcbiAgICAgICAgICBfdGhpcy5wcm9wcy5vbkNsaWNrKGV2LCB7XG4gICAgICAgICAgICBheGlzOiBfdGhpcy5wcm9wcy5heGlzLFxuICAgICAgICAgICAgb2Zmc2V0OiBfdGhpcy5wcm9wcy5heGlzID09PSBBWElTX0RJUkVDVElPTi5YID8gZXYub2Zmc2V0WCA6IGV2Lm9mZnNldFlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdXBwb3J0IGZvciBvbGQgYnJvd3NlcnNcblxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgdmFyIHJlY3QgPSBfdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICAgICAgICAgIF90aGlzLnByb3BzLm9uQ2xpY2soZXYsIHtcbiAgICAgICAgICAgIGF4aXM6IF90aGlzLnByb3BzLmF4aXMsXG4gICAgICAgICAgICBvZmZzZXQ6IF90aGlzLnByb3BzLmF4aXMgPT09IEFYSVNfRElSRUNUSU9OLlggPyAoZXYuY2xpZW50WCB8fCBldi50b3VjaGVzWzBdLmNsaWVudFgpIC0gcmVjdC5sZWZ0IDogKGV2LmNsaWVudFkgfHwgZXYudG91Y2hlc1swXS5jbGllbnRZKSAtIHJlY3QudG9wXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFNjcm9sbGJhclRyYWNrLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgd2FzIG5vdCBjcmVhdGVkLiBQb3NzaWJseSB5b3UgaGF2ZW4ndCBwcm92aWRlZCBIVE1MRGl2RWxlbWVudCB0byByZW5kZXJlcidzIGBlbGVtZW50UmVmYCBmdW5jdGlvbi5cIik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgfTtcblxuICBTY3JvbGxiYXJUcmFjay5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGljayk7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5lbGVtZW50UmVmKG51bGwpO1xuICAgIH1cbiAgfTtcblxuICBTY3JvbGxiYXJUcmFjay5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMucHJvcHM7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5lbGVtZW50UmVmO1xuICAgICAgICB2YXIgYXhpcyA9IF9hLmF4aXM7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vbkNsaWNrO1xuICAgICAgICB2YXIgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcImVsZW1lbnRSZWZcIiwgXCJheGlzXCIsIFwib25DbGlja1wiXSk7XG5cbiAgICBwcm9wcy5jbGFzc05hbWUgPSBjbmIoJ1Njcm9sbGJhcnNDdXN0b20tVHJhY2snLCBheGlzID09PSBBWElTX0RJUkVDVElPTi5YID8gJ1Njcm9sbGJhcnNDdXN0b20tVHJhY2tYJyA6ICdTY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWScsIHByb3BzLmNsYXNzTmFtZSk7XG5cbiAgICBpZiAocHJvcHMucmVuZGVyZXIpIHtcbiAgICAgIHByb3BzLmF4aXMgPSBheGlzO1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJEaXZXaXRoUmVuZGVyZXIocHJvcHMsIHRoaXMuZWxlbWVudFJlZik7XG4gIH07XG5cbiAgcmV0dXJuIFNjcm9sbGJhclRyYWNrO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG52YXIgc3R5bGUgPSB7XG4gIGhvbGRlcjoge1xuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIHdpZHRoOiAnMTAwJScsXG4gICAgaGVpZ2h0OiAnMTAwJSdcbiAgfSxcbiAgd3JhcHBlcjoge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRvcDogMCxcbiAgICBsZWZ0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICByaWdodDogMFxuICB9LFxuICBjb250ZW50OiB7XG4gICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCdcbiAgfSxcbiAgdHJhY2s6IHtcbiAgICBjb21tb246IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgYm9yZGVyUmFkaXVzOiA0LFxuICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMCwwLDAsLjEpJyxcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgIH0sXG4gICAgeDoge1xuICAgICAgaGVpZ2h0OiAxMCxcbiAgICAgIHdpZHRoOiAnY2FsYygxMDAlIC0gMjBweCknLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgbGVmdDogMTBcbiAgICB9LFxuICAgIHk6IHtcbiAgICAgIHdpZHRoOiAxMCxcbiAgICAgIGhlaWdodDogJ2NhbGMoMTAwJSAtIDIwcHgpJyxcbiAgICAgIHRvcDogMTBcbiAgICB9XG4gIH0sXG4gIHRodW1iOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIGJvcmRlclJhZGl1czogNCxcbiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLC40KSdcbiAgICB9LFxuICAgIHg6IHtcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgd2lkdGg6IDBcbiAgICB9LFxuICAgIHk6IHtcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9XG4gIH1cbn07XG5cbnZhciBwYWdlWm9vbUxldmVsID0gaXNCcm93c2VyID8gem9vbUxldmVsKCkgOiAxO1xuXG5pZiAoaXNCcm93c2VyKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgcGFnZVpvb21MZXZlbCA9IHpvb21MZXZlbCgpO1xuICB9LCB7XG4gICAgcGFzc2l2ZTogdHJ1ZVxuICB9KTtcbn1cblxudmFyIFNjcm9sbGJhckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgcGFyZW50U2Nyb2xsYmFyOiBudWxsXG59KTtcblxudmFyIFNjcm9sbGJhciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhTY3JvbGxiYXIsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gU2Nyb2xsYmFyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpIHx8IHRoaXM7XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1cnJlbnQgc2Nyb2xsLXJlbGF0ZWQgdmFsdWVzLjxici8+XHJcbiAgICAgKiBJZiA8aT5mb3JjZTwvaT4gaWYgdHJ1dGh5IC0gd2lsbCByZWNhbGN1bGF0ZSB0aGVtIGluc3RlYWQgb2YgcmV0dXJuaW5nIGNhY2hlZCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiBTY3JvbGxTdGF0ZVxyXG4gICAgICovXG5cblxuICAgIF90aGlzLmdldFNjcm9sbFN0YXRlID0gZnVuY3Rpb24gKGZvcmNlKSB7XG4gICAgICBpZiAoZm9yY2UgPT09IHZvaWQgMCkge1xuICAgICAgICBmb3JjZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsVmFsdWVzICYmICFmb3JjZSkge1xuICAgICAgICByZXR1cm4gX19hc3NpZ24oe30sIF90aGlzLnNjcm9sbFZhbHVlcyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzY3JvbGxTdGF0ZSA9IHtcbiAgICAgICAgY2xpZW50SGVpZ2h0OiAwLFxuICAgICAgICBjbGllbnRXaWR0aDogMCxcbiAgICAgICAgY29udGVudFNjcm9sbEhlaWdodDogMCxcbiAgICAgICAgY29udGVudFNjcm9sbFdpZHRoOiAwLFxuICAgICAgICBzY3JvbGxIZWlnaHQ6IDAsXG4gICAgICAgIHNjcm9sbFdpZHRoOiAwLFxuICAgICAgICBzY3JvbGxUb3A6IDAsXG4gICAgICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgICAgIHNjcm9sbFlCbG9ja2VkOiBmYWxzZSxcbiAgICAgICAgc2Nyb2xsWEJsb2NrZWQ6IGZhbHNlLFxuICAgICAgICBzY3JvbGxZUG9zc2libGU6IGZhbHNlLFxuICAgICAgICBzY3JvbGxYUG9zc2libGU6IGZhbHNlLFxuICAgICAgICB0cmFja1lWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgdHJhY2tYVmlzaWJsZTogZmFsc2UsXG4gICAgICAgIHpvb21MZXZlbDogcGFnZVpvb21MZXZlbCAqIDEsXG4gICAgICAgIGlzUlRMOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgICB2YXIgcHJvcHMgPSBfdGhpcy5wcm9wcztcbiAgICAgIHNjcm9sbFN0YXRlLmlzUlRMID0gX3RoaXMuc3RhdGUuaXNSVEw7XG4gICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxZQmxvY2tlZCA9IHByb3BzLm5vU2Nyb2xsIHx8IHByb3BzLm5vU2Nyb2xsWTtcbiAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbFhCbG9ja2VkID0gcHJvcHMubm9TY3JvbGwgfHwgcHJvcHMubm9TY3JvbGxYO1xuXG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHNjcm9sbFN0YXRlLmNsaWVudEhlaWdodCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIHNjcm9sbFN0YXRlLmNsaWVudFdpZHRoID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxIZWlnaHQgPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxXaWR0aCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgICAgc2Nyb2xsU3RhdGUuc2Nyb2xsVG9wID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgICAgc2Nyb2xsU3RhdGUuc2Nyb2xsTGVmdCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxZUG9zc2libGUgPSAhc2Nyb2xsU3RhdGUuc2Nyb2xsWUJsb2NrZWQgJiYgc2Nyb2xsU3RhdGUuc2Nyb2xsSGVpZ2h0ID4gc2Nyb2xsU3RhdGUuY2xpZW50SGVpZ2h0O1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxYUG9zc2libGUgPSAhc2Nyb2xsU3RhdGUuc2Nyb2xsWEJsb2NrZWQgJiYgc2Nyb2xsU3RhdGUuc2Nyb2xsV2lkdGggPiBzY3JvbGxTdGF0ZS5jbGllbnRXaWR0aDtcbiAgICAgICAgc2Nyb2xsU3RhdGUudHJhY2tZVmlzaWJsZSA9IHNjcm9sbFN0YXRlLnNjcm9sbFlQb3NzaWJsZSB8fCBwcm9wcy5wZXJtYW5lbnRUcmFja3MgfHwgcHJvcHMucGVybWFuZW50VHJhY2tZO1xuICAgICAgICBzY3JvbGxTdGF0ZS50cmFja1hWaXNpYmxlID0gc2Nyb2xsU3RhdGUuc2Nyb2xsWFBvc3NpYmxlIHx8IHByb3BzLnBlcm1hbmVudFRyYWNrcyB8fCBwcm9wcy5wZXJtYW5lbnRUcmFja1g7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5jb250ZW50RWxlbWVudCkge1xuICAgICAgICBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsSGVpZ2h0ID0gX3RoaXMuY29udGVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsV2lkdGggPSBfdGhpcy5jb250ZW50RWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNjcm9sbFN0YXRlO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2Nyb2xsIHRvIHRvcCBib3JkZXJcclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5zY3JvbGxUb1RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNjcm9sbCB0byBsZWZ0IGJvcmRlclxyXG4gICAgICovXG5cblxuICAgIF90aGlzLnNjcm9sbFRvTGVmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTY3JvbGwgdG8gYm90dG9tIGJvcmRlclxyXG4gICAgICovXG5cblxuICAgIF90aGlzLnNjcm9sbFRvQm90dG9tID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbEhlaWdodCAtIF90aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNjcm9sbCB0byByaWdodCBib3JkZXJcclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5zY3JvbGxUb1JpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxXaWR0aCAtIF90aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0IHRoZSBzY3JvbGxzIGF0IGdpdmVuIGNvb3JkaW5hdGVzLjxici8+XHJcbiAgICAgKiBJZiBjb29yZGluYXRlIGlzIHVuZGVmaW5lZCAtIGN1cnJlbnQgc2Nyb2xsIHZhbHVlIHdpbGwgcGVyc2lzdC5cclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5zY3JvbGxUbyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIGlmIChpc051bSh4KSkgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSB4O1xuICAgICAgICBpZiAoaXNOdW0oeSkpIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSB5O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDZW50ZXIgdGhlIHZpZXdwb3J0IGF0IGdpdmVuIGNvb3JkaW5hdGVzLjxici8+XHJcbiAgICAgKiBJZiBjb29yZGluYXRlIGlzIHVuZGVmaW5lZCAtIGN1cnJlbnQgc2Nyb2xsIHZhbHVlIHdpbGwgcGVyc2lzdC5cclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5jZW50ZXJBdCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIGlmIChpc051bSh4KSkgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSB4IC0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudFdpZHRoIC8gMjtcbiAgICAgICAgaWYgKGlzTnVtKHkpKSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0geSAtIF90aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRIZWlnaHQgLyAyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcblxuICAgIF90aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uIChmb3JjZSkge1xuICAgICAgaWYgKGZvcmNlID09PSB2b2lkIDApIHtcbiAgICAgICAgZm9yY2UgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBhdXRvZGV0ZWN0IGRpcmVjdGlvbiBpZiBub3QgZGVmaW5lZFxuXG5cbiAgICAgIGlmIChpc1VuZGVmKF90aGlzLnN0YXRlLmlzUlRMKSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNSVEw6IGdldENvbXB1dGVkU3R5bGUoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KS5kaXJlY3Rpb24gPT09ICdydGwnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBfdGhpcy5nZXRTY3JvbGxTdGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2Nyb2xsU3RhdGUgPSBfdGhpcy5nZXRTY3JvbGxTdGF0ZSh0cnVlKTtcblxuICAgICAgdmFyIHByZXZTY3JvbGxTdGF0ZSA9IF9fYXNzaWduKHt9LCBfdGhpcy5zY3JvbGxWYWx1ZXMpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBfdGhpcy5wcm9wcztcbiAgICAgIHZhciBiaXRtYXNrID0gMDtcblxuICAgICAgaWYgKCFmb3JjZSkge1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLmNsaWVudEhlaWdodCAhPT0gc2Nyb2xsU3RhdGUuY2xpZW50SGVpZ2h0KSBiaXRtYXNrIHw9IE1hdGgudHJ1bmMoMSk7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuY2xpZW50V2lkdGggIT09IHNjcm9sbFN0YXRlLmNsaWVudFdpZHRoKSBiaXRtYXNrIHw9IDEgPDwgMTtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxIZWlnaHQgIT09IHNjcm9sbFN0YXRlLnNjcm9sbEhlaWdodCkgYml0bWFzayB8PSAxIDw8IDI7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsV2lkdGggIT09IHNjcm9sbFN0YXRlLnNjcm9sbFdpZHRoKSBiaXRtYXNrIHw9IDEgPDwgMztcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxUb3AgIT09IHNjcm9sbFN0YXRlLnNjcm9sbFRvcCkgYml0bWFzayB8PSAxIDw8IDQ7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsTGVmdCkgYml0bWFzayB8PSAxIDw8IDU7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWUJsb2NrZWQgIT09IHNjcm9sbFN0YXRlLnNjcm9sbFlCbG9ja2VkKSBiaXRtYXNrIHw9IDEgPDwgNjtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxYQmxvY2tlZCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsWEJsb2NrZWQpIGJpdG1hc2sgfD0gMSA8PCA3O1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbFlQb3NzaWJsZSAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsWVBvc3NpYmxlKSBiaXRtYXNrIHw9IDEgPDwgODtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxYUG9zc2libGUgIT09IHNjcm9sbFN0YXRlLnNjcm9sbFhQb3NzaWJsZSkgYml0bWFzayB8PSAxIDw8IDk7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUudHJhY2tZVmlzaWJsZSAhPT0gc2Nyb2xsU3RhdGUudHJhY2tZVmlzaWJsZSkgYml0bWFzayB8PSAxIDw8IDEwO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnRyYWNrWFZpc2libGUgIT09IHNjcm9sbFN0YXRlLnRyYWNrWFZpc2libGUpIGJpdG1hc2sgfD0gMSA8PCAxMTtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5pc1JUTCAhPT0gc2Nyb2xsU3RhdGUuaXNSVEwpIGJpdG1hc2sgfD0gMSA8PCAxMjtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsSGVpZ2h0ICE9PSBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsSGVpZ2h0KSBiaXRtYXNrIHw9IDEgPDwgMTM7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbFdpZHRoICE9PSBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsV2lkdGgpIGJpdG1hc2sgfD0gMSA8PCAxNDtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS56b29tTGV2ZWwgIT09IHNjcm9sbFN0YXRlLnpvb21MZXZlbCkgYml0bWFzayB8PSAxIDw8IDE1OyAvLyBpZiBub3QgZm9yY2VkIGFuZCBub3RoaW5nIGhhcyBjaGFuZ2VkIC0gc2tpcCB0aGlzIHVwZGF0ZVxuXG4gICAgICAgIGlmIChiaXRtYXNrID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZTY3JvbGxTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYml0bWFzayA9IDMyNzY3O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXByb3BzLm5hdGl2ZSAmJiBfdGhpcy5ob2xkZXJFbGVtZW50KSB7XG4gICAgICAgIGlmIChiaXRtYXNrICYgMSA8PCAxMyAmJiAocHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVzVG9Ib2xkZXIgfHwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVZVG9Ib2xkZXIpKSB7XG4gICAgICAgICAgX3RoaXMuaG9sZGVyRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIlwiLmNvbmNhdChzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsSGVpZ2h0LCBcInB4XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJpdG1hc2sgJiAxIDw8IDE0ICYmIChwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVhUb0hvbGRlcikpIHtcbiAgICAgICAgICBfdGhpcy5ob2xkZXJFbGVtZW50LnN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQoc2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbFdpZHRoLCBcInB4XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWVRvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWFRvSG9sZGVyKSB7XG4gICAgICAgICAgaWYgKCFzY3JvbGxTdGF0ZS5jbGllbnRIZWlnaHQgJiYgc2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbEhlaWdodCB8fCAhc2Nyb2xsU3RhdGUuY2xpZW50V2lkdGggJiYgc2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIGlmIHNjcm9sbGJhcnMgdmlzaWJpbGl0eSBoYXMgY2hhbmdlZFxuXG5cbiAgICAgIGlmIChiaXRtYXNrICYgMSA8PCAxMCB8fCBiaXRtYXNrICYgMSA8PCAxMSkge1xuICAgICAgICBwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWUJsb2NrZWQgPSBzY3JvbGxTdGF0ZS5zY3JvbGxZQmxvY2tlZDtcbiAgICAgICAgcHJldlNjcm9sbFN0YXRlLnNjcm9sbFhCbG9ja2VkID0gc2Nyb2xsU3RhdGUuc2Nyb2xsWEJsb2NrZWQ7XG4gICAgICAgIHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxZUG9zc2libGUgPSBzY3JvbGxTdGF0ZS5zY3JvbGxZUG9zc2libGU7XG4gICAgICAgIHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxYUG9zc2libGUgPSBzY3JvbGxTdGF0ZS5zY3JvbGxYUG9zc2libGU7XG5cbiAgICAgICAgaWYgKF90aGlzLnRyYWNrWUVsZW1lbnQgJiYgYml0bWFzayAmIDEgPDwgMTApIHtcbiAgICAgICAgICBfdGhpcy50cmFja1lFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBzY3JvbGxTdGF0ZS50cmFja1lWaXNpYmxlID8gJycgOiAnbm9uZSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXMudHJhY2tYRWxlbWVudCAmJiBiaXRtYXNrICYgMSA8PCAxMSkge1xuICAgICAgICAgIF90aGlzLnRyYWNrWEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHNjcm9sbFN0YXRlLnRyYWNrWFZpc2libGUgPyAnJyA6ICdub25lJztcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnNjcm9sbFZhbHVlcyA9IHByZXZTY3JvbGxTdGF0ZTtcblxuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgdHJhY2tZVmlzaWJsZTogX3RoaXMuc2Nyb2xsVmFsdWVzLnRyYWNrWVZpc2libGUgPSBzY3JvbGxTdGF0ZS50cmFja1lWaXNpYmxlLFxuICAgICAgICAgIHRyYWNrWFZpc2libGU6IF90aGlzLnNjcm9sbFZhbHVlcy50cmFja1hWaXNpYmxlID0gc2Nyb2xsU3RhdGUudHJhY2tYVmlzaWJsZVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIChwcm9wcy5uYXRpdmUgPyBfdGhpcy51cGRhdGVyTmF0aXZlIDogX3RoaXMudXBkYXRlckN1c3RvbSkoYml0bWFzaywgc2Nyb2xsU3RhdGUpO1xuICAgICAgX3RoaXMuc2Nyb2xsVmFsdWVzID0gc2Nyb2xsU3RhdGU7XG5cbiAgICAgIGlmICghcHJvcHMubmF0aXZlICYmIGJpdG1hc2sgJiAxIDw8IDE1KSB7XG4gICAgICAgIGdldFNjcm9sbGJhcldpZHRoKHRydWUpO1xuXG4gICAgICAgIF90aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmV2ZW50RW1pdHRlci5lbWl0KCd1cGRhdGUnLCBfX2Fzc2lnbih7fSwgc2Nyb2xsU3RhdGUpLCBwcmV2U2Nyb2xsU3RhdGUpO1xuXG4gICAgICBpZiAoYml0bWFzayAmIDEgPDwgNCB8fCBiaXRtYXNrICYgMSA8PCA1KSBfdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCgnc2Nyb2xsJywgX19hc3NpZ24oe30sIHNjcm9sbFN0YXRlKSwgcHJldlNjcm9sbFN0YXRlKTtcbiAgICAgIHJldHVybiBfdGhpcy5zY3JvbGxWYWx1ZXM7XG4gICAgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcblxuXG4gICAgX3RoaXMudXBkYXRlck5hdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGp1c3QgZm9yIGZ1dHVyZVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIF90aGlzLnVwZGF0ZXJDdXN0b20gPSBmdW5jdGlvbiAoYml0bWFzaywgc2Nyb2xsVmFsdWVzKSB7XG4gICAgICB2YXIgcHJvcHMgPSBfdGhpcy5wcm9wcztcblxuICAgICAgaWYgKF90aGlzLnRyYWNrWUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKF90aGlzLnRodW1iWUVsZW1lbnQgJiYgKGJpdG1hc2sgJiBNYXRoLnRydW5jKDEpIHx8IGJpdG1hc2sgJiAxIDw8IDIgfHwgYml0bWFzayAmIDEgPDwgNCB8fCBiaXRtYXNrICYgMSA8PCA2IHx8IGJpdG1hc2sgJiAxIDw8IDgpKSB7XG4gICAgICAgICAgaWYgKHNjcm9sbFZhbHVlcy5zY3JvbGxZUG9zc2libGUpIHtcbiAgICAgICAgICAgIHZhciB0cmFja0lubmVyU2l6ZSA9IGdldElubmVySGVpZ2h0KF90aGlzLnRyYWNrWUVsZW1lbnQpO1xuICAgICAgICAgICAgdmFyIHRodW1iU2l6ZSA9IGNhbGNUaHVtYlNpemUoc2Nyb2xsVmFsdWVzLnNjcm9sbEhlaWdodCwgc2Nyb2xsVmFsdWVzLmNsaWVudEhlaWdodCwgdHJhY2tJbm5lclNpemUsIHByb3BzLm1pbmltYWxUaHVtYllTaXplIHx8IHByb3BzLm1pbmltYWxUaHVtYlNpemUsIHByb3BzLm1heGltYWxUaHVtYllTaXplIHx8IHByb3BzLm1heGltYWxUaHVtYlNpemUpO1xuICAgICAgICAgICAgdmFyIHRodW1iT2Zmc2V0ID0gY2FsY1RodW1iT2Zmc2V0KHNjcm9sbFZhbHVlcy5zY3JvbGxIZWlnaHQsIHNjcm9sbFZhbHVlcy5jbGllbnRIZWlnaHQsIHRyYWNrSW5uZXJTaXplLCB0aHVtYlNpemUsIHNjcm9sbFZhbHVlcy5zY3JvbGxUb3ApO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJZRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVkoXCIuY29uY2F0KHRodW1iT2Zmc2V0LCBcInB4KVwiKTtcbiAgICAgICAgICAgIF90aGlzLnRodW1iWUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQodGh1bWJTaXplLCBcInB4XCIpO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJZRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLnRodW1iWUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgICAgICBfdGhpcy50aHVtYllFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJZRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMudHJhY2tYRWxlbWVudCkge1xuICAgICAgICBpZiAoX3RoaXMudGh1bWJYRWxlbWVudCAmJiAoYml0bWFzayAmIDEgPDwgMSB8fCBiaXRtYXNrICYgMSA8PCAzIHx8IGJpdG1hc2sgJiAxIDw8IDUgfHwgYml0bWFzayAmIDEgPDwgNyB8fCBiaXRtYXNrICYgMSA8PCA5IHx8IGJpdG1hc2sgJiAxIDw8IDEyKSkge1xuICAgICAgICAgIGlmIChzY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlKSB7XG4gICAgICAgICAgICB2YXIgdHJhY2tJbm5lclNpemUgPSBnZXRJbm5lcldpZHRoKF90aGlzLnRyYWNrWEVsZW1lbnQpO1xuICAgICAgICAgICAgdmFyIHRodW1iU2l6ZSA9IGNhbGNUaHVtYlNpemUoc2Nyb2xsVmFsdWVzLnNjcm9sbFdpZHRoLCBzY3JvbGxWYWx1ZXMuY2xpZW50V2lkdGgsIHRyYWNrSW5uZXJTaXplLCBwcm9wcy5taW5pbWFsVGh1bWJYU2l6ZSB8fCBwcm9wcy5taW5pbWFsVGh1bWJTaXplLCBwcm9wcy5tYXhpbWFsVGh1bWJYU2l6ZSB8fCBwcm9wcy5tYXhpbWFsVGh1bWJTaXplKTtcbiAgICAgICAgICAgIHZhciB0aHVtYk9mZnNldCA9IGNhbGNUaHVtYk9mZnNldChzY3JvbGxWYWx1ZXMuc2Nyb2xsV2lkdGgsIHNjcm9sbFZhbHVlcy5jbGllbnRXaWR0aCwgdHJhY2tJbm5lclNpemUsIHRodW1iU2l6ZSwgc2Nyb2xsVmFsdWVzLnNjcm9sbExlZnQpO1xuXG4gICAgICAgICAgICBpZiAoX3RoaXMuc3RhdGUuaXNSVEwgJiYgc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbCgpKSB7XG4gICAgICAgICAgICAgIHRodW1iT2Zmc2V0ICs9IHRyYWNrSW5uZXJTaXplIC0gdGh1bWJTaXplO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpcy50aHVtYlhFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IFwidHJhbnNsYXRlWChcIi5jb25jYXQodGh1bWJPZmZzZXQsIFwicHgpXCIpO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJYRWxlbWVudC5zdHlsZS53aWR0aCA9IFwiXCIuY29uY2F0KHRodW1iU2l6ZSwgXCJweFwiKTtcbiAgICAgICAgICAgIF90aGlzLnRodW1iWEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy50aHVtYlhFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJYRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwcHgnO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJYRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZkhvbGRlciA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLmhvbGRlckVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZXcmFwcGVyID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMud3JhcHBlckVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy53cmFwcGVyUHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMud3JhcHBlclByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZlNjcm9sbGVyID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMuc2Nyb2xsZXJQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy5zY3JvbGxlclByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZkNvbnRlbnQgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy5jb250ZW50RWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLmNvbnRlbnRQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy5jb250ZW50UHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmVHJhY2tYID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMudHJhY2tYRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLnRyYWNrWFByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRyYWNrWFByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZlRyYWNrWSA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLnRyYWNrWUVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy50cmFja1lQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy50cmFja1lQcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZUaHVtYlggPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy50aHVtYlhFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMudGh1bWJYUHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudGh1bWJYUHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmVGh1bWJZID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMudGh1bWJZRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLnRodW1iWVByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRodW1iWVByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVHJhY2tYQ2xpY2sgPSBmdW5jdGlvbiAoZXYsIHZhbHVlcykge1xuICAgICAgaWYgKF90aGlzLnByb3BzLnRyYWNrWFByb3BzLm9uQ2xpY2spIHtcbiAgICAgICAgX3RoaXMucHJvcHMudHJhY2tYUHJvcHMub25DbGljayhldiwgdmFsdWVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgIV90aGlzLnRyYWNrWEVsZW1lbnQgfHwgIV90aGlzLnRodW1iWEVsZW1lbnQgfHwgIV90aGlzLnNjcm9sbFZhbHVlcyB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFhQb3NzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgdmFyIHRodW1iU2l6ZSA9IF90aGlzLnRodW1iWEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICB2YXIgdHJhY2tJbm5lclNpemUgPSBnZXRJbm5lcldpZHRoKF90aGlzLnRyYWNrWEVsZW1lbnQpO1xuICAgICAgdmFyIHRodW1iT2Zmc2V0ID0gKF90aGlzLnNjcm9sbFZhbHVlcy5pc1JUTCAmJiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsKCkgPyB2YWx1ZXMub2Zmc2V0ICsgdGh1bWJTaXplIC8gMiAtIHRyYWNrSW5uZXJTaXplIDogdmFsdWVzLm9mZnNldCAtIHRodW1iU2l6ZSAvIDIpIC0gKE51bWJlci5wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoX3RoaXMudHJhY2tYRWxlbWVudCkucGFkZGluZ0xlZnQpIHx8IDApO1xuICAgICAgdmFyIHRhcmdldCA9IGNhbGNTY3JvbGxGb3JUaHVtYk9mZnNldChfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsV2lkdGgsIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRXaWR0aCwgdHJhY2tJbm5lclNpemUsIHRodW1iU2l6ZSwgdGh1bWJPZmZzZXQpO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMudHJhY2tDbGlja0JlaGF2aW9yID09PSBUUkFDS19DTElDS19CRUhBVklPUi5TVEVQKSB7XG4gICAgICAgIHRhcmdldCA9IChfdGhpcy5zY3JvbGxWYWx1ZXMuaXNSVEwgPyBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsTGVmdCA+IHRhcmdldCA6IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxMZWZ0IDwgdGFyZ2V0KSA/IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxMZWZ0ICsgX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudFdpZHRoIDogX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbExlZnQgLSBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50V2lkdGg7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0gdGFyZ2V0O1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmFja1lDbGljayA9IGZ1bmN0aW9uIChldiwgdmFsdWVzKSB7XG4gICAgICBpZiAoX3RoaXMucHJvcHMudHJhY2tZUHJvcHMub25DbGljaykgX3RoaXMucHJvcHMudHJhY2tZUHJvcHMub25DbGljayhldiwgdmFsdWVzKTtcblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgIV90aGlzLnRyYWNrWUVsZW1lbnQgfHwgIV90aGlzLnRodW1iWUVsZW1lbnQgfHwgIV90aGlzLnNjcm9sbFZhbHVlcyB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFlQb3NzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgdmFyIHRodW1iU2l6ZSA9IF90aGlzLnRodW1iWUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgdmFyIHRhcmdldCA9IGNhbGNTY3JvbGxGb3JUaHVtYk9mZnNldChfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsSGVpZ2h0LCBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50SGVpZ2h0LCBnZXRJbm5lckhlaWdodChfdGhpcy50cmFja1lFbGVtZW50KSwgdGh1bWJTaXplLCB2YWx1ZXMub2Zmc2V0IC0gdGh1bWJTaXplIC8gMikgLSAoTnVtYmVyLnBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShfdGhpcy50cmFja1lFbGVtZW50KS5wYWRkaW5nVG9wKSB8fCAwKTtcblxuICAgICAgaWYgKF90aGlzLnByb3BzLnRyYWNrQ2xpY2tCZWhhdmlvciA9PT0gVFJBQ0tfQ0xJQ0tfQkVIQVZJT1IuSlVNUCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gdGFyZ2V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxUb3AgPCB0YXJnZXQgPyBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsVG9wICsgX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudEhlaWdodCA6IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxUb3AgLSBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50SGVpZ2h0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmFja1lNb3VzZVdoZWVsID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICB2YXIgcHJvcHMgPSBfdGhpcy5wcm9wcztcblxuICAgICAgaWYgKHByb3BzLnRyYWNrWVByb3BzICYmIHByb3BzLnRyYWNrWVByb3BzLm9uV2hlZWwpIHtcbiAgICAgICAgcHJvcHMudHJhY2tZUHJvcHMub25XaGVlbChldik7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5kaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZyB8fCBwcm9wcy5kaXNhYmxlVHJhY2tZTW91c2V3aGVlbFNjcm9sbGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFlCbG9ja2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2Nyb2xsVG9wICs9IGV2LmRlbHRhWTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVHJhY2tYTW91c2VXaGVlbCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgdmFyIHByb3BzID0gX3RoaXMucHJvcHM7XG5cbiAgICAgIGlmIChwcm9wcy50cmFja1hQcm9wcyAmJiBwcm9wcy50cmFja1hQcm9wcy5vbldoZWVsKSB7XG4gICAgICAgIHByb3BzLnRyYWNrWFByb3BzLm9uV2hlZWwoZXYpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuZGlzYWJsZVRyYWNrc01vdXNld2hlZWxTY3JvbGxpbmcgfHwgcHJvcHMuZGlzYWJsZVRyYWNrWE1vdXNld2hlZWxTY3JvbGxpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uKCk7XG5cbiAgICAgIGlmICghX3RoaXMuc2Nyb2xsZXJFbGVtZW50IHx8IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxYQmxvY2tlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNjcm9sbExlZnQgKz0gZXYuZGVsdGFYO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUaHVtYlhEcmFnID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgaWYgKCFfdGhpcy50cmFja1hFbGVtZW50IHx8ICFfdGhpcy50aHVtYlhFbGVtZW50IHx8ICFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgIV90aGlzLnNjcm9sbFZhbHVlcyB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFhQb3NzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgdmFyIHRyYWNrUmVjdCA9IF90aGlzLnRyYWNrWEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIHZhciBzdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKF90aGlzLnRyYWNrWEVsZW1lbnQpO1xuICAgICAgdmFyIHBhZGRpbmdMZWZ0ID0gTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdMZWZ0KSB8fCAwO1xuICAgICAgdmFyIHBhZGRpbmdSaWdodCA9IE51bWJlci5wYXJzZUZsb2F0KHN0eWxlcy5wYWRkaW5nUmlnaHQpIHx8IDA7XG4gICAgICB2YXIgdHJhY2tJbm5lclNpemUgPSB0cmFja1JlY3Qud2lkdGggLSBwYWRkaW5nTGVmdCAtIHBhZGRpbmdSaWdodDtcbiAgICAgIHZhciB0aHVtYlNpemUgPSBfdGhpcy50aHVtYlhFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgdmFyIG9mZnNldCA9IF90aGlzLnNjcm9sbFZhbHVlcy5pc1JUTCAmJiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsKCkgPyBkYXRhLnggKyB0aHVtYlNpemUgLSB0cmFja0lubmVyU2l6ZSArIHBhZGRpbmdMZWZ0IDogZGF0YS5sYXN0WCAtIHBhZGRpbmdMZWZ0O1xuICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSBjYWxjU2Nyb2xsRm9yVGh1bWJPZmZzZXQoX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFdpZHRoLCBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50V2lkdGgsIHRyYWNrSW5uZXJTaXplLCB0aHVtYlNpemUsIG9mZnNldCk7XG5cbiAgICAgIGlmICgoX2EgPSBfdGhpcy5wcm9wcy50aHVtYlhQcm9wcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uRHJhZykge1xuICAgICAgICBfdGhpcy5wcm9wcy50aHVtYlhQcm9wcy5vbkRyYWcoZGF0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRodW1iWERyYWdFbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBfdGhpcy5oYW5kbGVUaHVtYlhEcmFnKGRhdGEpO1xuXG4gICAgICBpZiAoKF9hID0gX3RoaXMucHJvcHMudGh1bWJYUHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkRyYWdFbmQpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudGh1bWJYUHJvcHMub25EcmFnRW5kKGRhdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUaHVtYllEcmFnID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgIV90aGlzLnRyYWNrWUVsZW1lbnQgfHwgIV90aGlzLnRodW1iWUVsZW1lbnQgfHwgIV90aGlzLnNjcm9sbFZhbHVlcyB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFlQb3NzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgdmFyIHRyYWNrUmVjdCA9IF90aGlzLnRyYWNrWUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIHZhciBzdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKF90aGlzLnRyYWNrWUVsZW1lbnQpO1xuICAgICAgdmFyIHBhZGRpbmdUb3AgPSBOdW1iZXIucGFyc2VGbG9hdChzdHlsZXMucGFkZGluZ1RvcCkgfHwgMDtcbiAgICAgIHZhciBwYWRkaW5nQm90dG9tID0gTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdCb3R0b20pIHx8IDA7XG4gICAgICB2YXIgdHJhY2tJbm5lclNpemUgPSB0cmFja1JlY3QuaGVpZ2h0IC0gcGFkZGluZ1RvcCAtIHBhZGRpbmdCb3R0b207XG4gICAgICB2YXIgdGh1bWJTaXplID0gX3RoaXMudGh1bWJZRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB2YXIgb2Zmc2V0ID0gZGF0YS55IC0gcGFkZGluZ1RvcDtcbiAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSBjYWxjU2Nyb2xsRm9yVGh1bWJPZmZzZXQoX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbEhlaWdodCwgX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudEhlaWdodCwgdHJhY2tJbm5lclNpemUsIHRodW1iU2l6ZSwgb2Zmc2V0KTtcblxuICAgICAgaWYgKChfYSA9IF90aGlzLnByb3BzLnRodW1iWVByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25EcmFnKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRodW1iWVByb3BzLm9uRHJhZyhkYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVGh1bWJZRHJhZ0VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICB2YXIgX2E7XG5cbiAgICAgIF90aGlzLmhhbmRsZVRodW1iWURyYWcoZGF0YSk7XG5cbiAgICAgIGlmICgoX2EgPSBfdGhpcy5wcm9wcy50aHVtYllQcm9wcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uRHJhZ0VuZCkge1xuICAgICAgICBfdGhpcy5wcm9wcy50aHVtYllQcm9wcy5vbkRyYWdFbmQoZGF0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVNjcm9sbGVyU2Nyb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuICAgIH07XG5cbiAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uVE8pIHtcbiAgICAgICAgX3RoaXMuZXZlbnRFbWl0dGVyLmVtaXQoJ3Njcm9sbFN0YXJ0JywgX3RoaXMuZ2V0U2Nyb2xsU3RhdGUoKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KF90aGlzLl9zY3JvbGxEZXRlY3Rpb25UTyk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb25UTyA9IGlzQnJvd3NlciA/IHdpbmRvdy5zZXRUaW1lb3V0KF90aGlzLl9zY3JvbGxEZXRlY3Rpb25DYWxsYmFjaywgX3RoaXMucHJvcHMuc2Nyb2xsRGV0ZWN0aW9uVGhyZXNob2xkIHx8IDApIDogbnVsbDtcbiAgICB9O1xuXG4gICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvblRPID0gbnVsbDtcblxuICAgICAgX3RoaXMuZXZlbnRFbWl0dGVyLmVtaXQoJ3Njcm9sbFN0b3AnLCBfdGhpcy5nZXRTY3JvbGxTdGF0ZSgpKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICB0cmFja1hWaXNpYmxlOiBmYWxzZSxcbiAgICAgIHRyYWNrWVZpc2libGU6IGZhbHNlLFxuICAgICAgaXNSVEw6IHByb3BzLnJ0bFxuICAgIH07XG4gICAgX3RoaXMuc2Nyb2xsVmFsdWVzID0gX3RoaXMuZ2V0U2Nyb2xsU3RhdGUodHJ1ZSk7XG4gICAgX3RoaXMuZXZlbnRFbWl0dGVyID0gbmV3IEVtaXR0cigxNSk7XG4gICAgaWYgKHByb3BzLm9uVXBkYXRlKSBfdGhpcy5ldmVudEVtaXR0ZXIub24oJ3VwZGF0ZScsIHByb3BzLm9uVXBkYXRlKTtcbiAgICBpZiAocHJvcHMub25TY3JvbGwpIF90aGlzLmV2ZW50RW1pdHRlci5vbignc2Nyb2xsJywgcHJvcHMub25TY3JvbGwpO1xuICAgIGlmIChwcm9wcy5vblNjcm9sbFN0YXJ0KSBfdGhpcy5ldmVudEVtaXR0ZXIub24oJ3Njcm9sbFN0YXJ0JywgcHJvcHMub25TY3JvbGxTdGFydCk7XG4gICAgaWYgKHByb3BzLm9uU2Nyb2xsU3RvcCkgX3RoaXMuZXZlbnRFbWl0dGVyLm9uKCdzY3JvbGxTdG9wJywgcHJvcHMub25TY3JvbGxTdG9wKTtcbiAgICBfdGhpcy5pZCA9IHV1aWQoKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJzY3JvbGxUb3BcIiwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9zb3J0LWNvbXBcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHRvcCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNjcm9sbGJhci5wcm90b3R5cGUsIFwic2Nyb2xsTGVmdFwiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQobGVmdCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSBsZWZ0O1xuICAgICAgfVxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJzY3JvbGxIZWlnaHRcIiwge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJzY3JvbGxXaWR0aFwiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNjcm9sbGJhci5wcm90b3R5cGUsIFwiY2xpZW50SGVpZ2h0XCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxlckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNjcm9sbGJhci5wcm90b3R5cGUsIFwiY2xpZW50V2lkdGhcIiwge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9zb3J0LWNvbXBcblxuICBTY3JvbGxiYXIuY2FsY3VsYXRlU3R5bGVzID0gZnVuY3Rpb24gKHByb3BzLCBzdGF0ZSwgc2Nyb2xsVmFsdWVzLCBzY3JvbGxiYXJXaWR0aCkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcblxuICAgIHZhciB1c2VEZWZhdWx0U3R5bGVzID0gIXByb3BzLm5vRGVmYXVsdFN0eWxlcztcbiAgICByZXR1cm4ge1xuICAgICAgaG9sZGVyOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS5ob2xkZXIpLCB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICB9KSwgcHJvcHMuc3R5bGUpLFxuICAgICAgd3JhcHBlcjogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHVzZURlZmF1bHRTdHlsZXMgJiYgX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlLndyYXBwZXIpLCAhcHJvcHMuZGlzYWJsZVRyYWNrc1dpZHRoQ29tcGVuc2F0aW9uICYmICFwcm9wcy5kaXNhYmxlVHJhY2tZV2lkdGhDb21wZW5zYXRpb24gJiYgKF9hID0ge30sIF9hW3N0YXRlLmlzUlRMID8gJ2xlZnQnIDogJ3JpZ2h0J10gPSBzdGF0ZS50cmFja1lWaXNpYmxlID8gMTAgOiAwLCBfYSkpLCAhcHJvcHMuZGlzYWJsZVRyYWNrc1dpZHRoQ29tcGVuc2F0aW9uICYmICFwcm9wcy5kaXNhYmxlVHJhY2tYV2lkdGhDb21wZW5zYXRpb24gJiYge1xuICAgICAgICBib3R0b206IHN0YXRlLnRyYWNrWFZpc2libGUgPyAxMCA6IDBcbiAgICAgIH0pKSwgcHJvcHMud3JhcHBlclByb3BzLnN0eWxlKSwge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgICB9KSxcbiAgICAgIGNvbnRlbnQ6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLmNvbnRlbnQpLCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVlUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVhUb0hvbGRlciA/IHtcbiAgICAgICAgZGlzcGxheTogJ3RhYmxlLWNlbGwnXG4gICAgICB9IDoge1xuICAgICAgICBwYWRkaW5nOiAwLjA1IC8vIG5lZWRlZCB0byBkaXNhYmxlIG1hcmdpbiBjb2xsYXBzaW5nIHdpdGhvdXQgZmxleGJveGVzLCBvdGhlciBwb3NzaWJsZSBzb2x1dGlvbnMgaGVyZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3MTg2MzQvaG93LXRvLWRpc2FibGUtbWFyZ2luLWNvbGxhcHNpbmdcblxuICAgICAgfSksIHVzZURlZmF1bHRTdHlsZXMgJiYgIShwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVlUb0hvbGRlcikgJiYge1xuICAgICAgICBtaW5IZWlnaHQ6ICcxMDAlJ1xuICAgICAgfSksIHVzZURlZmF1bHRTdHlsZXMgJiYgIShwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVhUb0hvbGRlcikgJiYge1xuICAgICAgICBtaW5XaWR0aDogJzEwMCUnXG4gICAgICB9KSwgcHJvcHMuY29udGVudFByb3BzLnN0eWxlKSxcbiAgICAgIHNjcm9sbGVyOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbigoX2IgPSB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgIHBhZGRpbmdCb3R0b206ICFzY3JvbGxiYXJXaWR0aCAmJiBzY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlID8gcHJvcHMuZmFsbGJhY2tTY3JvbGxiYXJXaWR0aCA6IHVuZGVmaW5lZFxuICAgICAgfSwgX2Jbc3RhdGUuaXNSVEwgPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCddID0gIXNjcm9sbGJhcldpZHRoICYmIHNjcm9sbFZhbHVlcy5zY3JvbGxZUG9zc2libGUgPyBwcm9wcy5mYWxsYmFja1Njcm9sbGJhcldpZHRoIDogdW5kZWZpbmVkLCBfYiksIHByb3BzLnNjcm9sbGVyUHJvcHMuc3R5bGUpLCAhaXNVbmRlZihwcm9wcy5ydGwpICYmIHtcbiAgICAgICAgZGlyZWN0aW9uOiBwcm9wcy5ydGwgPyAncnRsJyA6ICdsdHInXG4gICAgICB9KSwgcHJvcHMubW9tZW50dW0gJiYge1xuICAgICAgICBXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogJ3RvdWNoJ1xuICAgICAgfSksIChfYyA9IHtcbiAgICAgICAgb3ZlcmZsb3dZOiBzY3JvbGxWYWx1ZXMuc2Nyb2xsWVBvc3NpYmxlID8gJ3Njcm9sbCcgOiAnaGlkZGVuJyxcbiAgICAgICAgb3ZlcmZsb3dYOiBzY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlID8gJ3Njcm9sbCcgOiAnaGlkZGVuJyxcbiAgICAgICAgbWFyZ2luQm90dG9tOiBzY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlID8gLShzY3JvbGxiYXJXaWR0aCB8fCBwcm9wcy5mYWxsYmFja1Njcm9sbGJhcldpZHRoKSAtIE51bWJlcihzY3JvbGxWYWx1ZXMuem9vbUxldmVsICE9PSAxKSA6IHVuZGVmaW5lZFxuICAgICAgfSwgX2Nbc3RhdGUuaXNSVEwgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnXSA9IHNjcm9sbFZhbHVlcy5zY3JvbGxZUG9zc2libGUgPyAtKHNjcm9sbGJhcldpZHRoIHx8IHByb3BzLmZhbGxiYWNrU2Nyb2xsYmFyV2lkdGgpIC0gTnVtYmVyKHNjcm9sbFZhbHVlcy56b29tTGV2ZWwgIT09IDEpIDogdW5kZWZpbmVkLCBfYykpLFxuICAgICAgdHJhY2tYOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50cmFjay5jb21tb24pLCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRyYWNrLngpLCBwcm9wcy50cmFja1hQcm9wcy5zdHlsZSksICFzdGF0ZS50cmFja1hWaXNpYmxlICYmIHtcbiAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICB9KSxcbiAgICAgIHRyYWNrWTogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudHJhY2suY29tbW9uKSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50cmFjay55KSwgdXNlRGVmYXVsdFN0eWxlcyAmJiAoX2QgPSB7fSwgX2Rbc3RhdGUuaXNSVEwgPyAnbGVmdCcgOiAncmlnaHQnXSA9IDAsIF9kKSksIHByb3BzLnRyYWNrWVByb3BzLnN0eWxlKSwgIXN0YXRlLnRyYWNrWVZpc2libGUgJiYge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgIH0pLFxuICAgICAgdGh1bWJYOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50aHVtYi5jb21tb24pLCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRodW1iLngpLCBwcm9wcy50aHVtYlhQcm9wcy5zdHlsZSksXG4gICAgICB0aHVtYlk6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRodW1iLmNvbW1vbiksIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudGh1bWIueSksIHByb3BzLnRodW1iWVByb3BzLnN0eWxlKVxuICAgIH07XG4gIH07XG5cbiAgU2Nyb2xsYmFyLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2Nyb2xsZXIgZWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb250ZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbnRlbnQgZWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAoIXByb3BzLm5hdGl2ZSAmJiAhcHJvcHMubW9iaWxlTmF0aXZlKSB7XG4gICAgICAvLyBUb0RvOiBtb3ZlIG5hdGl2ZSBzdGF0ZSB0byB0aGUgc3RhdGUgc28gaXQgY2FuIGJlIHN5bmNocm9uaXplZFxuICAgICAgaWYgKCF0aGlzLmhvbGRlckVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaG9sZGVyIGVsZW1lbnQgd2FzIG5vdCBjcmVhdGVkLiBQb3NzaWJseSB5b3UgaGF2ZW4ndCBwcm92aWRlZCBIVE1MRGl2RWxlbWVudCB0byByZW5kZXJlcidzIGBlbGVtZW50UmVmYCBmdW5jdGlvbi5cIik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy53cmFwcGVyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3cmFwcGVyIGVsZW1lbnQgd2FzIG5vdCBjcmVhdGVkLiBQb3NzaWJseSB5b3UgaGF2ZW4ndCBwcm92aWRlZCBIVE1MRGl2RWxlbWVudCB0byByZW5kZXJlcidzIGBlbGVtZW50UmVmYCBmdW5jdGlvbi5cIik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgTG9vcC5hZGRUYXJnZXQodGhpcyk7XG5cbiAgICBpZiAoIWlzVW5kZWYocHJvcHMuc2Nyb2xsVG9wKSkge1xuICAgICAgdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gcHJvcHMuc2Nyb2xsVG9wO1xuICAgIH1cblxuICAgIGlmICghaXNVbmRlZihwcm9wcy5zY3JvbGxMZWZ0KSkge1xuICAgICAgdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IHByb3BzLnNjcm9sbExlZnQ7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGUodHJ1ZSk7XG4gIH07XG5cbiAgU2Nyb2xsYmFyLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBMb29wLnJlbW92ZVRhcmdldCh0aGlzKTtcbiAgfTtcblxuICBTY3JvbGxiYXIucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIGlmICghdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKHByb3BzLnJ0bCAhPT0gcHJldlByb3BzLnJ0bCAmJiBwcm9wcy5ydGwgIT09IHRoaXMuc3RhdGUuaXNSVEwpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc1JUTDogcHJvcHMucnRsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5pc1JUTCAhPT0gcHJldlN0YXRlLmlzUlRMKSB7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGlmICghaXNVbmRlZihwcm9wcy5zY3JvbGxUb3ApICYmIHByb3BzLnNjcm9sbFRvcCAhPT0gdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wKSB7XG4gICAgICB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSBwcm9wcy5zY3JvbGxUb3A7XG4gICAgfVxuXG4gICAgaWYgKCFpc1VuZGVmKHByb3BzLnNjcm9sbExlZnQpICYmIHByb3BzLnNjcm9sbExlZnQgIT09IHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQpIHtcbiAgICAgIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSBwcm9wcy5zY3JvbGxMZWZ0O1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMub25VcGRhdGUgIT09IHByb3BzLm9uVXBkYXRlKSB7XG4gICAgICBpZiAocHJldlByb3BzLm9uVXBkYXRlKSB0aGlzLmV2ZW50RW1pdHRlci5vZmYoJ3VwZGF0ZScsIHByZXZQcm9wcy5vblVwZGF0ZSk7XG4gICAgICBpZiAocHJvcHMub25VcGRhdGUpIHRoaXMuZXZlbnRFbWl0dGVyLm9uKCd1cGRhdGUnLCBwcm9wcy5vblVwZGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5vblNjcm9sbCAhPT0gcHJvcHMub25TY3JvbGwpIHtcbiAgICAgIGlmIChwcmV2UHJvcHMub25TY3JvbGwpIHRoaXMuZXZlbnRFbWl0dGVyLm9mZignc2Nyb2xsJywgcHJldlByb3BzLm9uU2Nyb2xsKTtcbiAgICAgIGlmIChwcm9wcy5vblNjcm9sbCkgdGhpcy5ldmVudEVtaXR0ZXIub24oJ3Njcm9sbCcsIHByb3BzLm9uU2Nyb2xsKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLm9uU2Nyb2xsU3RhcnQgIT09IHByb3BzLm9uU2Nyb2xsU3RhcnQpIHtcbiAgICAgIGlmIChwcmV2UHJvcHMub25TY3JvbGxTdGFydCkgdGhpcy5ldmVudEVtaXR0ZXIub2ZmKCdzY3JvbGxTdGFydCcsIHByZXZQcm9wcy5vblNjcm9sbFN0YXJ0KTtcbiAgICAgIGlmIChwcm9wcy5vblNjcm9sbFN0YXJ0KSB0aGlzLmV2ZW50RW1pdHRlci5vbignc2Nyb2xsU3RhcnQnLCBwcm9wcy5vblNjcm9sbFN0YXJ0KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLm9uU2Nyb2xsU3RvcCAhPT0gcHJvcHMub25TY3JvbGxTdG9wKSB7XG4gICAgICBpZiAocHJldlByb3BzLm9uU2Nyb2xsU3RvcCkgdGhpcy5ldmVudEVtaXR0ZXIub2ZmKCdzY3JvbGxTdG9wJywgcHJldlByb3BzLm9uU2Nyb2xsU3RvcCk7XG4gICAgICBpZiAocHJvcHMub25TY3JvbGxTdG9wKSB0aGlzLmV2ZW50RW1pdHRlci5vbignc2Nyb2xsU3RvcCcsIHByb3BzLm9uU2Nyb2xsU3RvcCk7XG4gICAgfVxuICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvc29ydC1jb21wXG5cblxuICBTY3JvbGxiYXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2EgPSB0aGlzLnByb3BzLFxuICAgICAgICBjcmVhdGVDb250ZXh0ID0gX2EuY3JlYXRlQ29udGV4dCxcbiAgICAgICAgcnRsID0gX2EucnRsLFxuICAgICAgICBuYXRpdmUgPSBfYS5uYXRpdmUsXG4gICAgICAgIG1vYmlsZU5hdGl2ZSA9IF9hLm1vYmlsZU5hdGl2ZSxcbiAgICAgICAgbW9tZW50dW0gPSBfYS5tb21lbnR1bTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm5vRGVmYXVsdFN0eWxlcztcbiAgICAgICAgdmFyIGRpc2FibGVUcmFja3NNb3VzZXdoZWVsU2Nyb2xsaW5nID0gX2EuZGlzYWJsZVRyYWNrc01vdXNld2hlZWxTY3JvbGxpbmcsXG4gICAgICAgIGRpc2FibGVUcmFja1hNb3VzZXdoZWVsU2Nyb2xsaW5nID0gX2EuZGlzYWJsZVRyYWNrWE1vdXNld2hlZWxTY3JvbGxpbmcsXG4gICAgICAgIGRpc2FibGVUcmFja1lNb3VzZXdoZWVsU2Nyb2xsaW5nID0gX2EuZGlzYWJsZVRyYWNrWU1vdXNld2hlZWxTY3JvbGxpbmc7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5kaXNhYmxlVHJhY2tzV2lkdGhDb21wZW5zYXRpb247XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5kaXNhYmxlVHJhY2tYV2lkdGhDb21wZW5zYXRpb247XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5kaXNhYmxlVHJhY2tZV2lkdGhDb21wZW5zYXRpb247XG4gICAgICAgIHZhciBub1Njcm9sbFggPSBfYS5ub1Njcm9sbFgsXG4gICAgICAgIG5vU2Nyb2xsWSA9IF9hLm5vU2Nyb2xsWSxcbiAgICAgICAgbm9TY3JvbGwgPSBfYS5ub1Njcm9sbCxcbiAgICAgICAgcGVybWFuZW50VHJhY2tYID0gX2EucGVybWFuZW50VHJhY2tYLFxuICAgICAgICBwZXJtYW5lbnRUcmFja1kgPSBfYS5wZXJtYW5lbnRUcmFja1ksXG4gICAgICAgIHBlcm1hbmVudFRyYWNrcyA9IF9hLnBlcm1hbmVudFRyYWNrcyxcbiAgICAgICAgcmVtb3ZlVHJhY2tzV2hlbk5vdFVzZWQgPSBfYS5yZW1vdmVUcmFja3NXaGVuTm90VXNlZCxcbiAgICAgICAgcmVtb3ZlVHJhY2tZV2hlbk5vdFVzZWQgPSBfYS5yZW1vdmVUcmFja1lXaGVuTm90VXNlZCxcbiAgICAgICAgcmVtb3ZlVHJhY2tYV2hlbk5vdFVzZWQgPSBfYS5yZW1vdmVUcmFja1hXaGVuTm90VXNlZDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm1pbmltYWxUaHVtYlNpemU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5tYXhpbWFsVGh1bWJTaXplO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EubWluaW1hbFRodW1iWFNpemU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5tYXhpbWFsVGh1bWJYU2l6ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm1pbmltYWxUaHVtYllTaXplO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EubWF4aW1hbFRodW1iWVNpemU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5mYWxsYmFja1Njcm9sbGJhcldpZHRoO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Euc2Nyb2xsVG9wO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Euc2Nyb2xsTGVmdDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLnRyYWNrQ2xpY2tCZWhhdmlvcjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLnNjcm9sbERldGVjdGlvblRocmVzaG9sZDtcbiAgICAgICAgdmFyIHByb3BzV3JhcHBlclByb3BzID0gX2Eud3JhcHBlclByb3BzLFxuICAgICAgICBwcm9wc1Njcm9sbGVyUHJvcHMgPSBfYS5zY3JvbGxlclByb3BzLFxuICAgICAgICBwcm9wc0NvbnRlbnRQcm9wcyA9IF9hLmNvbnRlbnRQcm9wcyxcbiAgICAgICAgcHJvcHNUcmFja1hQcm9wcyA9IF9hLnRyYWNrWFByb3BzLFxuICAgICAgICBwcm9wc1RyYWNrWVByb3BzID0gX2EudHJhY2tZUHJvcHMsXG4gICAgICAgIHByb3BzVGh1bWJYUHJvcHMgPSBfYS50aHVtYlhQcm9wcyxcbiAgICAgICAgcHJvcHNUaHVtYllQcm9wcyA9IF9hLnRodW1iWVByb3BzLFxuICAgICAgICBwcm9wc1Njcm9sbGJhcldpZHRoID0gX2Euc2Nyb2xsYmFyV2lkdGg7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5lbGVtZW50UmVmO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eub25VcGRhdGU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vblNjcm9sbDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uU2Nyb2xsU3RhcnQ7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vblNjcm9sbFN0b3A7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlcjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLnRyYW5zbGF0ZUNvbnRlbnRTaXplWVRvSG9sZGVyO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EudHJhbnNsYXRlQ29udGVudFNpemVYVG9Ib2xkZXI7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgICAgICBwcm9wc0hvbGRlclByb3BzID0gX19yZXN0KF9hLCBbXCJjcmVhdGVDb250ZXh0XCIsIFwicnRsXCIsIFwibmF0aXZlXCIsIFwibW9iaWxlTmF0aXZlXCIsIFwibW9tZW50dW1cIiwgXCJub0RlZmF1bHRTdHlsZXNcIiwgXCJkaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZ1wiLCBcImRpc2FibGVUcmFja1hNb3VzZXdoZWVsU2Nyb2xsaW5nXCIsIFwiZGlzYWJsZVRyYWNrWU1vdXNld2hlZWxTY3JvbGxpbmdcIiwgXCJkaXNhYmxlVHJhY2tzV2lkdGhDb21wZW5zYXRpb25cIiwgXCJkaXNhYmxlVHJhY2tYV2lkdGhDb21wZW5zYXRpb25cIiwgXCJkaXNhYmxlVHJhY2tZV2lkdGhDb21wZW5zYXRpb25cIiwgXCJub1Njcm9sbFhcIiwgXCJub1Njcm9sbFlcIiwgXCJub1Njcm9sbFwiLCBcInBlcm1hbmVudFRyYWNrWFwiLCBcInBlcm1hbmVudFRyYWNrWVwiLCBcInBlcm1hbmVudFRyYWNrc1wiLCBcInJlbW92ZVRyYWNrc1doZW5Ob3RVc2VkXCIsIFwicmVtb3ZlVHJhY2tZV2hlbk5vdFVzZWRcIiwgXCJyZW1vdmVUcmFja1hXaGVuTm90VXNlZFwiLCBcIm1pbmltYWxUaHVtYlNpemVcIiwgXCJtYXhpbWFsVGh1bWJTaXplXCIsIFwibWluaW1hbFRodW1iWFNpemVcIiwgXCJtYXhpbWFsVGh1bWJYU2l6ZVwiLCBcIm1pbmltYWxUaHVtYllTaXplXCIsIFwibWF4aW1hbFRodW1iWVNpemVcIiwgXCJmYWxsYmFja1Njcm9sbGJhcldpZHRoXCIsIFwic2Nyb2xsVG9wXCIsIFwic2Nyb2xsTGVmdFwiLCBcInRyYWNrQ2xpY2tCZWhhdmlvclwiLCBcInNjcm9sbERldGVjdGlvblRocmVzaG9sZFwiLCBcIndyYXBwZXJQcm9wc1wiLCBcInNjcm9sbGVyUHJvcHNcIiwgXCJjb250ZW50UHJvcHNcIiwgXCJ0cmFja1hQcm9wc1wiLCBcInRyYWNrWVByb3BzXCIsIFwidGh1bWJYUHJvcHNcIiwgXCJ0aHVtYllQcm9wc1wiLCBcInNjcm9sbGJhcldpZHRoXCIsIFwiZWxlbWVudFJlZlwiLCBcIm9uVXBkYXRlXCIsIFwib25TY3JvbGxcIiwgXCJvblNjcm9sbFN0YXJ0XCIsIFwib25TY3JvbGxTdG9wXCIsIFwidHJhbnNsYXRlQ29udGVudFNpemVzVG9Ib2xkZXJcIiwgXCJ0cmFuc2xhdGVDb250ZW50U2l6ZVlUb0hvbGRlclwiLCBcInRyYW5zbGF0ZUNvbnRlbnRTaXplWFRvSG9sZGVyXCIsIFwiY2hpbGRyZW5cIl0pO1xuXG4gICAgdmFyIHNjcm9sbGJhcldpZHRoID0gIWlzVW5kZWYocHJvcHNTY3JvbGxiYXJXaWR0aCkgPyBwcm9wc1Njcm9sbGJhcldpZHRoIDogZ2V0U2Nyb2xsYmFyV2lkdGgoKSB8fCAwO1xuXG4gICAgaWYgKG5hdGl2ZSB8fCAhc2Nyb2xsYmFyV2lkdGggJiYgbW9iaWxlTmF0aXZlKSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZIb2xkZXIobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZXcmFwcGVyKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmVHJhY2tYKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmVHJhY2tZKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmVGh1bWJYKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmVGh1bWJZKG51bGwpO1xuXG4gICAgICB2YXIgY29udGVudFByb3BzXzEgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNDb250ZW50UHJvcHMpLCB7XG4gICAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tQ29udGVudCcsXG4gICAgICAgIGNsYXNzTmFtZTogY25iKCdTY3JvbGxiYXJzQ3VzdG9tLUNvbnRlbnQnLCBwcm9wc0NvbnRlbnRQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc2Nyb2xsZXJQcm9wc18xID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzSG9sZGVyUHJvcHMpLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY25iKCdTY3JvbGxiYXJzQ3VzdG9tIG5hdGl2ZScsIHRoaXMuc3RhdGUudHJhY2tZVmlzaWJsZSAmJiAndHJhY2tZVmlzaWJsZScsIHRoaXMuc3RhdGUudHJhY2tYVmlzaWJsZSAmJiAndHJhY2tYVmlzaWJsZScsIHRoaXMuc3RhdGUuaXNSVEwgJiYgJ3J0bCcsIHByb3BzSG9sZGVyUHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgICAgc3R5bGU6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc0hvbGRlclByb3BzLnN0eWxlKSwgIWlzVW5kZWYocnRsKSAmJiB7XG4gICAgICAgICAgZGlyZWN0aW9uOiBydGwgPyAncnRsJyA6ICdsdHInXG4gICAgICAgIH0pLCBtb21lbnR1bSAmJiB7XG4gICAgICAgICAgV2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc6ICd0b3VjaCdcbiAgICAgICAgfSksIHtcbiAgICAgICAgICBvdmVyZmxvd1g6IG5vU2Nyb2xsIHx8IG5vU2Nyb2xsWCA/ICdoaWRkZW4nIDogcGVybWFuZW50VHJhY2tzIHx8IHBlcm1hbmVudFRyYWNrWCA/ICdzY3JvbGwnIDogJ2F1dG8nLFxuICAgICAgICAgIG92ZXJmbG93WTogbm9TY3JvbGwgfHwgbm9TY3JvbGxZID8gJ2hpZGRlbicgOiBwZXJtYW5lbnRUcmFja3MgfHwgcGVybWFuZW50VHJhY2tZID8gJ3Njcm9sbCcgOiAnYXV0bydcbiAgICAgICAgfSksXG4gICAgICAgIG9uU2Nyb2xsOiB0aGlzLmhhbmRsZVNjcm9sbGVyU2Nyb2xsLFxuICAgICAgICBjaGlsZHJlbjogcmVuZGVyRGl2V2l0aFJlbmRlcmVyKGNvbnRlbnRQcm9wc18xLCB0aGlzLmVsZW1lbnRSZWZDb250ZW50KSxcbiAgICAgICAgcmVuZGVyZXI6IHByb3BzU2Nyb2xsZXJQcm9wcy5yZW5kZXJlcixcbiAgICAgICAgZWxlbWVudFJlZjogcHJvcHNTY3JvbGxlclByb3BzLmVsZW1lbnRSZWZcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVuZGVyRGl2V2l0aFJlbmRlcmVyKHNjcm9sbGVyUHJvcHNfMSwgdGhpcy5lbGVtZW50UmVmU2Nyb2xsZXIpO1xuICAgIH1cblxuICAgIHZhciBzdHlsZXMgPSBTY3JvbGxiYXIuY2FsY3VsYXRlU3R5bGVzKHRoaXMucHJvcHMsIHRoaXMuc3RhdGUsIHRoaXMuc2Nyb2xsVmFsdWVzLCBzY3JvbGxiYXJXaWR0aCk7XG4gICAgdmFyIGhvbGRlckNoaWxkcmVuID0gW107XG5cbiAgICB2YXIgY29udGVudFByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzQ29udGVudFByb3BzKSwge1xuICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1Db250ZW50JyxcbiAgICAgIGNsYXNzTmFtZTogY25iKCdTY3JvbGxiYXJzQ3VzdG9tLUNvbnRlbnQnLCBwcm9wc0NvbnRlbnRQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHN0eWxlcy5jb250ZW50LFxuICAgICAgY2hpbGRyZW46IGNyZWF0ZUNvbnRleHQgPyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvanN4LW5vLWNvbnN0cnVjdGVkLWNvbnRleHQtdmFsdWVzXG4gICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGJhckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwYXJlbnRTY3JvbGxiYXI6IHRoaXNcbiAgICAgICAgfVxuICAgICAgfSwgY2hpbGRyZW4pIDogY2hpbGRyZW5cbiAgICB9KTtcblxuICAgIHZhciBzY3JvbGxlclByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzU2Nyb2xsZXJQcm9wcyksIHtcbiAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tU2Nyb2xsZXInLFxuICAgICAgY2xhc3NOYW1lOiBjbmIoJ1Njcm9sbGJhcnNDdXN0b20tU2Nyb2xsZXInLCBwcm9wc1Njcm9sbGVyUHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBzdHlsZXMuc2Nyb2xsZXIsXG4gICAgICBjaGlsZHJlbjogcmVuZGVyRGl2V2l0aFJlbmRlcmVyKGNvbnRlbnRQcm9wcywgdGhpcy5lbGVtZW50UmVmQ29udGVudCksXG4gICAgICBvblNjcm9sbDogdGhpcy5oYW5kbGVTY3JvbGxlclNjcm9sbFxuICAgIH0pO1xuXG4gICAgdmFyIHdyYXBwZXJQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc1dyYXBwZXJQcm9wcyksIHtcbiAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tV3JhcHBlcicsXG4gICAgICBjbGFzc05hbWU6IGNuYignU2Nyb2xsYmFyc0N1c3RvbS1XcmFwcGVyJywgcHJvcHNXcmFwcGVyUHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBzdHlsZXMud3JhcHBlcixcbiAgICAgIGNoaWxkcmVuOiByZW5kZXJEaXZXaXRoUmVuZGVyZXIoc2Nyb2xsZXJQcm9wcywgdGhpcy5lbGVtZW50UmVmU2Nyb2xsZXIpXG4gICAgfSk7XG5cbiAgICBob2xkZXJDaGlsZHJlbi5wdXNoKHJlbmRlckRpdldpdGhSZW5kZXJlcih3cmFwcGVyUHJvcHMsIHRoaXMuZWxlbWVudFJlZldyYXBwZXIpKTtcblxuICAgIGlmICh0aGlzLnN0YXRlLnRyYWNrWVZpc2libGUgfHwgIXJlbW92ZVRyYWNrc1doZW5Ob3RVc2VkICYmICFyZW1vdmVUcmFja1lXaGVuTm90VXNlZCkge1xuICAgICAgdmFyIHRodW1iWVByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzVGh1bWJZUHJvcHMpLCB7XG4gICAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tVGh1bWJZJyxcbiAgICAgICAgc3R5bGU6IHN0eWxlcy50aHVtYlksXG4gICAgICAgIGVsZW1lbnRSZWY6IHRoaXMuZWxlbWVudFJlZlRodW1iWSxcbiAgICAgICAgb25EcmFnOiB0aGlzLmhhbmRsZVRodW1iWURyYWcsXG4gICAgICAgIG9uRHJhZ0VuZDogdGhpcy5oYW5kbGVUaHVtYllEcmFnRW5kLFxuICAgICAgICBheGlzOiBBWElTX0RJUkVDVElPTi5ZXG4gICAgICB9KTtcblxuICAgICAgdmFyIHRyYWNrWVByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzVHJhY2tZUHJvcHMpLCB7XG4gICAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tVHJhY2tZJyxcbiAgICAgICAgc3R5bGU6IHN0eWxlcy50cmFja1ksXG4gICAgICAgIGVsZW1lbnRSZWY6IHRoaXMuZWxlbWVudFJlZlRyYWNrWSxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVUcmFja1lDbGlja1xuICAgICAgfSksIChkaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZyB8fCBkaXNhYmxlVHJhY2tZTW91c2V3aGVlbFNjcm9sbGluZykgJiYge1xuICAgICAgICBvbldoZWVsOiB0aGlzLmhhbmRsZVRyYWNrWU1vdXNlV2hlZWxcbiAgICAgIH0pLCB7XG4gICAgICAgIGF4aXM6IEFYSVNfRElSRUNUSU9OLllcbiAgICAgIH0pO1xuXG4gICAgICB0cmFja1lQcm9wcy5jaGlsZHJlbiA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsYmFyVGh1bWIsIF9fYXNzaWduKHt9LCB0aHVtYllQcm9wcykpO1xuICAgICAgaG9sZGVyQ2hpbGRyZW4ucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGJhclRyYWNrLCBfX2Fzc2lnbih7fSwgdHJhY2tZUHJvcHMpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRyYWNrWShudWxsKTtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRodW1iWShudWxsKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS50cmFja1hWaXNpYmxlIHx8ICFyZW1vdmVUcmFja3NXaGVuTm90VXNlZCAmJiAhcmVtb3ZlVHJhY2tYV2hlbk5vdFVzZWQpIHtcbiAgICAgIHZhciB0aHVtYlhQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc1RodW1iWFByb3BzKSwge1xuICAgICAgICBrZXk6ICdTY3JvbGxiYXJzQ3VzdG9tLVRodW1iWCcsXG4gICAgICAgIHN0eWxlOiBzdHlsZXMudGh1bWJYLFxuICAgICAgICBlbGVtZW50UmVmOiB0aGlzLmVsZW1lbnRSZWZUaHVtYlgsXG4gICAgICAgIG9uRHJhZzogdGhpcy5oYW5kbGVUaHVtYlhEcmFnLFxuICAgICAgICBvbkRyYWdFbmQ6IHRoaXMuaGFuZGxlVGh1bWJYRHJhZ0VuZCxcbiAgICAgICAgYXhpczogQVhJU19ESVJFQ1RJT04uWFxuICAgICAgfSk7XG5cbiAgICAgIHZhciB0cmFja1hQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc1RyYWNrWFByb3BzKSwge1xuICAgICAgICBrZXk6ICdTY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWCcsXG4gICAgICAgIHN0eWxlOiBzdHlsZXMudHJhY2tYLFxuICAgICAgICBlbGVtZW50UmVmOiB0aGlzLmVsZW1lbnRSZWZUcmFja1gsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlVHJhY2tYQ2xpY2tcbiAgICAgIH0pLCAoZGlzYWJsZVRyYWNrc01vdXNld2hlZWxTY3JvbGxpbmcgfHwgZGlzYWJsZVRyYWNrWE1vdXNld2hlZWxTY3JvbGxpbmcpICYmIHtcbiAgICAgICAgb25XaGVlbDogdGhpcy5oYW5kbGVUcmFja1hNb3VzZVdoZWVsXG4gICAgICB9KSwge1xuICAgICAgICBheGlzOiBBWElTX0RJUkVDVElPTi5YXG4gICAgICB9KTtcblxuICAgICAgdHJhY2tYUHJvcHMuY2hpbGRyZW4gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGJhclRodW1iLCBfX2Fzc2lnbih7fSwgdGh1bWJYUHJvcHMpKTtcbiAgICAgIGhvbGRlckNoaWxkcmVuLnB1c2goUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxiYXJUcmFjaywgX19hc3NpZ24oe30sIHRyYWNrWFByb3BzKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUcmFja1gobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUaHVtYlgobnVsbCk7XG4gICAgfVxuXG4gICAgdmFyIGhvbGRlclByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzSG9sZGVyUHJvcHMpLCB7XG4gICAgICBjbGFzc05hbWU6IGNuYignU2Nyb2xsYmFyc0N1c3RvbScsIHRoaXMuc3RhdGUudHJhY2tZVmlzaWJsZSAmJiAndHJhY2tZVmlzaWJsZScsIHRoaXMuc3RhdGUudHJhY2tYVmlzaWJsZSAmJiAndHJhY2tYVmlzaWJsZScsIHRoaXMuc3RhdGUuaXNSVEwgJiYgJ3J0bCcsIHByb3BzSG9sZGVyUHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBzdHlsZXMuaG9sZGVyLFxuICAgICAgY2hpbGRyZW46IGhvbGRlckNoaWxkcmVuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVuZGVyRGl2V2l0aFJlbmRlcmVyKGhvbGRlclByb3BzLCB0aGlzLmVsZW1lbnRSZWZIb2xkZXIpO1xuICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvc3RhdGljLXByb3BlcnR5LXBsYWNlbWVudFxuXG5cbiAgU2Nyb2xsYmFyLmNvbnRleHRUeXBlID0gU2Nyb2xsYmFyQ29udGV4dDsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3N0YXRpYy1wcm9wZXJ0eS1wbGFjZW1lbnRcblxuICBTY3JvbGxiYXIuZGVmYXVsdFByb3BzID0ge1xuICAgIG1vbWVudHVtOiB0cnVlLFxuICAgIG1pbmltYWxUaHVtYlNpemU6IDMwLFxuICAgIGZhbGxiYWNrU2Nyb2xsYmFyV2lkdGg6IDIwLFxuICAgIHRyYWNrQ2xpY2tCZWhhdmlvcjogVFJBQ0tfQ0xJQ0tfQkVIQVZJT1IuSlVNUCxcbiAgICBzY3JvbGxEZXRlY3Rpb25UaHJlc2hvbGQ6IDEwMCxcbiAgICB3cmFwcGVyUHJvcHM6IHt9LFxuICAgIHNjcm9sbGVyUHJvcHM6IHt9LFxuICAgIGNvbnRlbnRQcm9wczoge30sXG4gICAgdHJhY2tYUHJvcHM6IHt9LFxuICAgIHRyYWNrWVByb3BzOiB7fSxcbiAgICB0aHVtYlhQcm9wczoge30sXG4gICAgdGh1bWJZUHJvcHM6IHt9XG4gIH07XG4gIHJldHVybiBTY3JvbGxiYXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydCB7IFNjcm9sbGJhciwgU2Nyb2xsYmFyQ29udGV4dCwgU2Nyb2xsYmFyIGFzIGRlZmF1bHQgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0IChleCkgeyByZXR1cm4gKGV4ICYmICh0eXBlb2YgZXggPT09ICdvYmplY3QnKSAmJiAnZGVmYXVsdCcgaW4gZXgpID8gZXhbJ2RlZmF1bHQnXSA6IGV4OyB9XG5cbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgUmVhY3RfX2RlZmF1bHQgPSBfaW50ZXJvcERlZmF1bHQoUmVhY3QpO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbmZ1bmN0aW9uIHdpdGhTaWRlRWZmZWN0KHJlZHVjZVByb3BzVG9TdGF0ZSwgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCwgbWFwU3RhdGVPblNlcnZlcikge1xuICBpZiAodHlwZW9mIHJlZHVjZVByb3BzVG9TdGF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVkdWNlUHJvcHNUb1N0YXRlIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbWFwU3RhdGVPblNlcnZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1hcFN0YXRlT25TZXJ2ZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG1hcFN0YXRlT25TZXJ2ZXIgdG8gZWl0aGVyIGJlIHVuZGVmaW5lZCBvciBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIHJldHVybiBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKFdyYXBwZWRDb21wb25lbnQpIHtcbiAgICBpZiAodHlwZW9mIFdyYXBwZWRDb21wb25lbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgV3JhcHBlZENvbXBvbmVudCB0byBiZSBhIFJlYWN0IGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbW91bnRlZEluc3RhbmNlcyA9IFtdO1xuICAgIHZhciBzdGF0ZTtcblxuICAgIGZ1bmN0aW9uIGVtaXRDaGFuZ2UoKSB7XG4gICAgICBzdGF0ZSA9IHJlZHVjZVByb3BzVG9TdGF0ZShtb3VudGVkSW5zdGFuY2VzLm1hcChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnByb3BzO1xuICAgICAgfSkpO1xuXG4gICAgICBpZiAoU2lkZUVmZmVjdC5jYW5Vc2VET00pIHtcbiAgICAgICAgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudChzdGF0ZSk7XG4gICAgICB9IGVsc2UgaWYgKG1hcFN0YXRlT25TZXJ2ZXIpIHtcbiAgICAgICAgc3RhdGUgPSBtYXBTdGF0ZU9uU2VydmVyKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgU2lkZUVmZmVjdCA9XG4gICAgLyojX19QVVJFX18qL1xuICAgIGZ1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzTG9vc2UoU2lkZUVmZmVjdCwgX1B1cmVDb21wb25lbnQpO1xuXG4gICAgICBmdW5jdGlvbiBTaWRlRWZmZWN0KCkge1xuICAgICAgICByZXR1cm4gX1B1cmVDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgdG8gdXNlIGRpc3BsYXlOYW1lIG9mIHdyYXBwZWQgY29tcG9uZW50XG4gICAgICAvLyBFeHBvc2UgY2FuVXNlRE9NIHNvIHRlc3RzIGNhbiBtb25rZXlwYXRjaCBpdFxuICAgICAgU2lkZUVmZmVjdC5wZWVrID0gZnVuY3Rpb24gcGVlaygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfTtcblxuICAgICAgU2lkZUVmZmVjdC5yZXdpbmQgPSBmdW5jdGlvbiByZXdpbmQoKSB7XG4gICAgICAgIGlmIChTaWRlRWZmZWN0LmNhblVzZURPTSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG1heSBvbmx5IGNhbGwgcmV3aW5kKCkgb24gdGhlIHNlcnZlci4gQ2FsbCBwZWVrKCkgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWNvcmRlZFN0YXRlID0gc3RhdGU7XG4gICAgICAgIHN0YXRlID0gdW5kZWZpbmVkO1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzID0gW107XG4gICAgICAgIHJldHVybiByZWNvcmRlZFN0YXRlO1xuICAgICAgfTtcblxuICAgICAgdmFyIF9wcm90byA9IFNpZGVFZmZlY3QucHJvdG90eXBlO1xuXG4gICAgICBfcHJvdG8uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9IGZ1bmN0aW9uIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgICAgIG1vdW50ZWRJbnN0YW5jZXMucHVzaCh0aGlzKTtcbiAgICAgICAgZW1pdENoYW5nZSgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgICAgZW1pdENoYW5nZSgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IG1vdW50ZWRJbnN0YW5jZXMuaW5kZXhPZih0aGlzKTtcbiAgICAgICAgbW91bnRlZEluc3RhbmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCB0aGlzLnByb3BzKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBTaWRlRWZmZWN0O1xuICAgIH0oUmVhY3QuUHVyZUNvbXBvbmVudCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoU2lkZUVmZmVjdCwgXCJkaXNwbGF5TmFtZVwiLCBcIlNpZGVFZmZlY3QoXCIgKyBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSArIFwiKVwiKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShTaWRlRWZmZWN0LCBcImNhblVzZURPTVwiLCBjYW5Vc2VET00pO1xuXG4gICAgcmV0dXJuIFNpZGVFZmZlY3Q7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2l0aFNpZGVFZmZlY3Q7XG4iLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpLHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwic2lnbmF0dXJlX3BhZFwiKSxyZXF1aXJlKFwidHJpbS1jYW52YXNcIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wicHJvcC10eXBlc1wiLFwicmVhY3RcIixcInNpZ25hdHVyZV9wYWRcIixcInRyaW0tY2FudmFzXCJdLHQpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuU2lnbmF0dXJlQ2FudmFzPXQocmVxdWlyZShcInByb3AtdHlwZXNcIikscmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJzaWduYXR1cmVfcGFkXCIpLHJlcXVpcmUoXCJ0cmltLWNhbnZhc1wiKSk6ZS5TaWduYXR1cmVDYW52YXM9dChlW1wicHJvcC10eXBlc1wiXSxlLnJlYWN0LGUuc2lnbmF0dXJlX3BhZCxlW1widHJpbS1jYW52YXNcIl0pfSh0aGlzLGZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgYT1uW3JdPXtleHBvcnRzOnt9LGlkOnIsbG9hZGVkOiExfTtyZXR1cm4gZVtyXS5jYWxsKGEuZXhwb3J0cyxhLGEuZXhwb3J0cyx0KSxhLmxvYWRlZD0hMCxhLmV4cG9ydHN9dmFyIG49e307cmV0dXJuIHQubT1lLHQuYz1uLHQucD1cIlwiLHQoMCl9KFtmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19ZnVuY3Rpb24gYShlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKXQuaW5kZXhPZihyKT49MHx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJihuW3JdPWVbcl0pO3JldHVybiBufWZ1bmN0aW9uIG8oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIGkoZSx0KXtpZighZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIXR8fFwib2JqZWN0XCIhPXR5cGVvZiB0JiZcImZ1bmN0aW9uXCIhPXR5cGVvZiB0P2U6dH1mdW5jdGlvbiB1KGUsdCl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sYz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXJldHVybiBmdW5jdGlvbih0LG4scil7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksciYmZSh0LHIpLHR9fSgpLGY9bigxKSxwPXIoZiksbD1uKDIpLGQ9cihsKSx2PW4oMyksaD1yKHYpLF89big0KSxnPXIoXyksbT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIGUsbixyLHU7byh0aGlzLHQpO2Zvcih2YXIgcz1hcmd1bWVudHMubGVuZ3RoLGM9QXJyYXkocyksZj0wO2Y8cztmKyspY1tmXT1hcmd1bWVudHNbZl07cmV0dXJuIG49cj1pKHRoaXMsKGU9dC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuY2FsbC5hcHBseShlLFt0aGlzXS5jb25jYXQoYykpKSxyLl9zaWdQYWQ9bnVsbCxyLl9leGNsdWRlT3VyUHJvcHM9ZnVuY3Rpb24oKXt2YXIgZT1yLnByb3BzLHQ9KGUuY2FudmFzUHJvcHMsZS5jbGVhck9uUmVzaXplLGEoZSxbXCJjYW52YXNQcm9wc1wiLFwiY2xlYXJPblJlc2l6ZVwiXSkpO3JldHVybiB0fSxyLmdldENhbnZhcz1mdW5jdGlvbigpe3JldHVybiByLl9jYW52YXN9LHIuZ2V0VHJpbW1lZENhbnZhcz1mdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7cmV0dXJuIGUud2lkdGg9ci5fY2FudmFzLndpZHRoLGUuaGVpZ2h0PXIuX2NhbnZhcy5oZWlnaHQsZS5nZXRDb250ZXh0KFwiMmRcIikuZHJhd0ltYWdlKHIuX2NhbnZhcywwLDApLCgwLGcuZGVmYXVsdCkoZSl9LHIuZ2V0U2lnbmF0dXJlUGFkPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX3NpZ1BhZH0sci5fY2hlY2tDbGVhck9uUmVzaXplPWZ1bmN0aW9uKCl7ci5wcm9wcy5jbGVhck9uUmVzaXplJiZyLl9yZXNpemVDYW52YXMoKX0sci5fcmVzaXplQ2FudmFzPWZ1bmN0aW9uKCl7dmFyIGU9ci5wcm9wcy5jYW52YXNQcm9wc3x8e30sdD1lLndpZHRoLG49ZS5oZWlnaHQ7aWYoIXR8fCFuKXt2YXIgYT1yLl9jYW52YXMsbz1NYXRoLm1heCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSwxKTt0fHwoYS53aWR0aD1hLm9mZnNldFdpZHRoKm8pLG58fChhLmhlaWdodD1hLm9mZnNldEhlaWdodCpvKSxhLmdldENvbnRleHQoXCIyZFwiKS5zY2FsZShvLG8pLHIuY2xlYXIoKX19LHIub249ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixyLl9jaGVja0NsZWFyT25SZXNpemUpLHIuX3NpZ1BhZC5vbigpfSxyLm9mZj1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHIuX2NoZWNrQ2xlYXJPblJlc2l6ZSksci5fc2lnUGFkLm9mZigpfSxyLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX3NpZ1BhZC5jbGVhcigpfSxyLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gci5fc2lnUGFkLmlzRW1wdHkoKX0sci5mcm9tRGF0YVVSTD1mdW5jdGlvbihlLHQpe3JldHVybiByLl9zaWdQYWQuZnJvbURhdGFVUkwoZSx0KX0sci50b0RhdGFVUkw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5fc2lnUGFkLnRvRGF0YVVSTChlLHQpfSxyLmZyb21EYXRhPWZ1bmN0aW9uKGUpe3JldHVybiByLl9zaWdQYWQuZnJvbURhdGEoZSl9LHIudG9EYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX3NpZ1BhZC50b0RhdGEoKX0sdT1uLGkocix1KX1yZXR1cm4gdSh0LGUpLGModCxbe2tleTpcImNvbXBvbmVudERpZE1vdW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9zaWdQYWQ9bmV3IGguZGVmYXVsdCh0aGlzLl9jYW52YXMsdGhpcy5fZXhjbHVkZU91clByb3BzKCkpLHRoaXMuX3Jlc2l6ZUNhbnZhcygpLHRoaXMub24oKX19LHtrZXk6XCJjb21wb25lbnRXaWxsVW5tb3VudFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5vZmYoKX19LHtrZXk6XCJjb21wb25lbnREaWRVcGRhdGVcIix2YWx1ZTpmdW5jdGlvbigpe09iamVjdC5hc3NpZ24odGhpcy5fc2lnUGFkLHRoaXMuX2V4Y2x1ZGVPdXJQcm9wcygpKX19LHtrZXk6XCJyZW5kZXJcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnByb3BzLmNhbnZhc1Byb3BzO3JldHVybiBkLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiLHMoe3JlZjpmdW5jdGlvbih0KXtlLl9jYW52YXM9dH19LHQpKX19XSksdH0obC5Db21wb25lbnQpO20ucHJvcFR5cGVzPXt2ZWxvY2l0eUZpbHRlcldlaWdodDpwLmRlZmF1bHQubnVtYmVyLG1pbldpZHRoOnAuZGVmYXVsdC5udW1iZXIsbWF4V2lkdGg6cC5kZWZhdWx0Lm51bWJlcixtaW5EaXN0YW5jZTpwLmRlZmF1bHQubnVtYmVyLGRvdFNpemU6cC5kZWZhdWx0Lm9uZU9mVHlwZShbcC5kZWZhdWx0Lm51bWJlcixwLmRlZmF1bHQuZnVuY10pLHBlbkNvbG9yOnAuZGVmYXVsdC5zdHJpbmcsdGhyb3R0bGU6cC5kZWZhdWx0Lm51bWJlcixvbkVuZDpwLmRlZmF1bHQuZnVuYyxvbkJlZ2luOnAuZGVmYXVsdC5mdW5jLGNhbnZhc1Byb3BzOnAuZGVmYXVsdC5vYmplY3QsY2xlYXJPblJlc2l6ZTpwLmRlZmF1bHQuYm9vbH0sbS5kZWZhdWx0UHJvcHM9e2NsZWFyT25SZXNpemU6ITB9LHQuZGVmYXVsdD1tfSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1lfSxmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1ufSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1yfV0pfSk7IiwiaW1wb3J0IHsgc3R5bGVIb29rU2luZ2xldG9uIH0gZnJvbSAnLi9ob29rJztcbi8qKlxuICogY3JlYXRlIGEgQ29tcG9uZW50IHRvIGFkZCBzdHlsZXMgb24gZGVtYW5kXG4gKiAtIHN0eWxlcyBhcmUgYWRkZWQgd2hlbiBmaXJzdCBpbnN0YW5jZSBpcyBtb3VudGVkXG4gKiAtIHN0eWxlcyBhcmUgcmVtb3ZlZCB3aGVuIHRoZSBsYXN0IGluc3RhbmNlIGlzIHVubW91bnRlZFxuICogLSBjaGFuZ2luZyBzdHlsZXMgaW4gcnVudGltZSBkb2VzIG5vdGhpbmcgdW5sZXNzIGR5bmFtaWMgaXMgc2V0LiBCdXQgd2l0aCBtdWx0aXBsZSBjb21wb25lbnRzIHRoYXQgY2FuIGxlYWQgdG8gdGhlIHVuZGVmaW5lZCBiZWhhdmlvclxuICovXG5leHBvcnQgdmFyIHN0eWxlU2luZ2xldG9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB1c2VTdHlsZSA9IHN0eWxlSG9va1NpbmdsZXRvbigpO1xuICAgIHZhciBTaGVldCA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgc3R5bGVzID0gX2Euc3R5bGVzLCBkeW5hbWljID0gX2EuZHluYW1pYztcbiAgICAgICAgdXNlU3R5bGUoc3R5bGVzLCBkeW5hbWljKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gU2hlZXQ7XG59O1xuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgc3R5bGVzaGVldFNpbmdsZXRvbiB9IGZyb20gJy4vc2luZ2xldG9uJztcbi8qKlxuICogY3JlYXRlcyBhIGhvb2sgdG8gY29udHJvbCBzdHlsZSBzaW5nbGV0b25cbiAqIEBzZWUge0BsaW5rIHN0eWxlU2luZ2xldG9ufSBmb3IgYSBzYWZlciBjb21wb25lbnQgdmVyc2lvblxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgdXNlU3R5bGUgPSBzdHlsZUhvb2tTaW5nbGV0b24oKTtcbiAqIC8vL1xuICogdXNlU3R5bGUoJ2JvZHkgeyBvdmVyZmxvdzogaGlkZGVufScpO1xuICovXG5leHBvcnQgdmFyIHN0eWxlSG9va1NpbmdsZXRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2hlZXQgPSBzdHlsZXNoZWV0U2luZ2xldG9uKCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsZXMsIGlzRHluYW1pYykge1xuICAgICAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2hlZXQuYWRkKHN0eWxlcyk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNoZWV0LnJlbW92ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSwgW3N0eWxlcyAmJiBpc0R5bmFtaWNdKTtcbiAgICB9O1xufTtcbiIsImV4cG9ydCB7IHN0eWxlU2luZ2xldG9uIH0gZnJvbSAnLi9jb21wb25lbnQnO1xuZXhwb3J0IHsgc3R5bGVzaGVldFNpbmdsZXRvbiB9IGZyb20gJy4vc2luZ2xldG9uJztcbmV4cG9ydCB7IHN0eWxlSG9va1NpbmdsZXRvbiB9IGZyb20gJy4vaG9vayc7XG4iLCJpbXBvcnQgeyBnZXROb25jZSB9IGZyb20gJ2dldC1ub25jZSc7XG5mdW5jdGlvbiBtYWtlU3R5bGVUYWcoKSB7XG4gICAgaWYgKCFkb2N1bWVudClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgdmFyIHRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgdGFnLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgIHZhciBub25jZSA9IGdldE5vbmNlKCk7XG4gICAgaWYgKG5vbmNlKSB7XG4gICAgICAgIHRhZy5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGFnO1xufVxuZnVuY3Rpb24gaW5qZWN0U3R5bGVzKHRhZywgY3NzKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0YWcuc3R5bGVTaGVldCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRhZy5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0YWcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5zZXJ0U3R5bGVUYWcodGFnKSB7XG4gICAgdmFyIGhlYWQgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XG4gICAgaGVhZC5hcHBlbmRDaGlsZCh0YWcpO1xufVxuZXhwb3J0IHZhciBzdHlsZXNoZWV0U2luZ2xldG9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICB2YXIgc3R5bGVzaGVldCA9IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkOiBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyID09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoKHN0eWxlc2hlZXQgPSBtYWtlU3R5bGVUYWcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0U3R5bGVzKHN0eWxlc2hlZXQsIHN0eWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U3R5bGVUYWcoc3R5bGVzaGVldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvdW50ZXItLTtcbiAgICAgICAgICAgIGlmICghY291bnRlciAmJiBzdHlsZXNoZWV0KSB7XG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldC5wYXJlbnROb2RlICYmIHN0eWxlc2hlZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZXNoZWV0KTtcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufTtcbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWpzeC1ydW50aW1lLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5Jyk7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbmZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICB7XG4gICAge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDsgLy8gU2V0IHRoZSBkaXNwYXRjaGVyIGluIERFViBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgY2FsbCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uXG4gICAgLy8gZm9yIHdhcm5pbmdzLlxuXG4gICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYSkge1xuICByZXR1cm4gaXNBcnJheUltcGwoYSk7XG59XG5cbi8qXG4gKiBUaGUgYCcnICsgdmFsdWVgIHBhdHRlcm4gKHVzZWQgaW4gaW4gcGVyZi1zZW5zaXRpdmUgY29kZSkgdGhyb3dzIGZvciBTeW1ib2xcbiAqIGFuZCBUZW1wb3JhbC4qIHR5cGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjIwNjQuXG4gKlxuICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB3aWxsIHRocm93IGFuIGVhc2llci10by11bmRlcnN0YW5kLFxuICogZWFzaWVyLXRvLWRlYnVnIGV4Y2VwdGlvbiB3aXRoIGEgY2xlYXIgZXJyb3JzIG1lc3NhZ2UgbWVzc2FnZSBleHBsYWluaW5nIHRoZVxuICogcHJvYmxlbS4gKEluc3RlYWQgb2YgYSBjb25mdXNpbmcgZXhjZXB0aW9uIHRocm93biBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uXG4gKiBvZiB0aGUgYHZhbHVlYCBvYmplY3QpLlxuICovXG4vLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuZnVuY3Rpb24gdHlwZU5hbWUodmFsdWUpIHtcbiAge1xuICAgIC8vIHRvU3RyaW5nVGFnIGlzIG5lZWRlZCBmb3IgbmFtZXNwYWNlZCB0eXBlcyBsaWtlIFRlbXBvcmFsLkluc3RhbnRcbiAgICB2YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZztcbiAgICB2YXIgdHlwZSA9IGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JztcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxufSAvLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuXG5cbmZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gIHtcbiAgICB0cnkge1xuICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQnc1xuICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LFxuICAvLyBET00gYXR0cmlidXRlLCBDU1MgcHJvcGVydHksIHN0cmluZyByZWYsIGV0Yy4pIGFuZCB3aGVuIFJlYWN0IHRyaWVkIHRvXG4gIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuICAvL1xuICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZXMgdGhhdCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIGFyZSBgU3ltYm9sYCBpbnN0YW5jZXNcbiAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGFcbiAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzXG4gIC8vIGV4Y2VwdGlvbi4gKExpYnJhcnkgYXV0aG9ycyBkbyB0aGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyBidWlsdC1pblxuICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b21cbiAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLilcbiAgLy9cbiAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuXG4gIC8vXG4gIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuXG4gIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dFxuICAvLyB0aGF0IHNob3dzIHRoZSB0eXBlIChTeW1ib2wsIFRlbXBvcmFsLlBsYWluRGF0ZSwgZXRjLikgdGhhdCBjYXVzZWQgdGhlXG4gIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHNcbiAgLy8gYW5jZXN0b3IgY29tcG9uZW50cyB3aGVyZSB0aGUgZXhjZXB0aW9uIGhhcHBlbmVkLlxuICAvL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duO1xudmFyIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG5cbntcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnLCBzZWxmKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpLCBjb25maWcucmVmKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5cblxudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3dzIHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9OyAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmYWxzZVxuICAgIH0pOyAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNlbGZcbiAgICB9KTsgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzb3VyY2VcbiAgICB9KTtcblxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JmY3MvcHVsbC8xMDdcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cblxuZnVuY3Rpb24ganN4REVWKHR5cGUsIGNvbmZpZywgbWF5YmVLZXksIHNvdXJjZSwgc2VsZikge1xuICB7XG4gICAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgICB2YXIgcHJvcHMgPSB7fTtcbiAgICB2YXIga2V5ID0gbnVsbDtcbiAgICB2YXIgcmVmID0gbnVsbDsgLy8gQ3VycmVudGx5LCBrZXkgY2FuIGJlIHNwcmVhZCBpbiBhcyBhIHByb3AuIFRoaXMgY2F1c2VzIGEgcG90ZW50aWFsXG4gICAgLy8gaXNzdWUgaWYga2V5IGlzIGFsc28gZXhwbGljaXRseSBkZWNsYXJlZCAoaWUuIDxkaXYgey4uLnByb3BzfSBrZXk9XCJIaVwiIC8+XG4gICAgLy8gb3IgPGRpdiBrZXk9XCJIaVwiIHsuLi5wcm9wc30gLz4gKS4gV2Ugd2FudCB0byBkZXByZWNhdGUga2V5IHNwcmVhZCxcbiAgICAvLyBidXQgYXMgYW4gaW50ZXJtZWRpYXJ5IHN0ZXAsIHdlIHdpbGwgdXNlIGpzeERFViBmb3IgZXZlcnl0aGluZyBleGNlcHRcbiAgICAvLyA8ZGl2IHsuLi5wcm9wc30ga2V5PVwiSGlcIiAvPiwgYmVjYXVzZSB3ZSBhcmVuJ3QgY3VycmVudGx5IGFibGUgdG8gdGVsbCBpZlxuICAgIC8vIGtleSBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIHRvIGJlIHVuZGVmaW5lZCBvciBub3QuXG5cbiAgICBpZiAobWF5YmVLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1heWJlS2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBtYXliZUtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnLCBzZWxmKTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgICBpZiAodHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtleSB8fCByZWYpIHtcbiAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAge1xuICAgIGlmIChSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQpIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAge1xuICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB7XG4gICAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICAgIGlmICghaW5mbykge1xuICAgICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG5cbiAgICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfVxufVxuLyoqXG4gKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuXG4gKiBUaGlzIGVsZW1lbnQgaXMgaW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmVcbiAqIHJlb3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFyZSByZXF1aXJlZCB0b1xuICogaGF2ZSBhIFwia2V5XCIgcHJvcGVydHkgYXNzaWduZWQgdG8gaXQuIEVycm9yIHN0YXR1c2VzIGFyZSBjYWNoZWQgc28gYSB3YXJuaW5nXG4gKiB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGhhdCByZXF1aXJlcyBhIGtleS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICB7XG4gICAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gICAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAgIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICAgIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50KSB7XG4gICAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICAgIH1cblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCk7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5KG5vZGUpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcblxuICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICAvLyBUaGlzIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiBhIHZhbGlkIGxvY2F0aW9uLlxuICAgICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gbm9kZS5lbnRyaWVzKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTsgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcblxuICAgICAgdmFyIF9uYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dEtleVNwcmVhZCA9IHt9O1xuZnVuY3Rpb24ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgaXNTdGF0aWNDaGlsZHJlbiwgc291cmNlLCBzZWxmKSB7XG4gIHtcbiAgICB2YXIgdmFsaWRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpOyAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAgIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpO1xuXG4gICAgICBpZiAoc291cmNlSW5mbykge1xuICAgICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHlwZVN0cmluZztcblxuICAgICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgICAgICB0eXBlU3RyaW5nID0gJ2FycmF5JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICAgIGluZm8gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IGV4cG9ydCBhIEpTWCBsaXRlcmFsIGluc3RlYWQgb2YgYSBjb21wb25lbnQ/JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICAgIH1cblxuICAgICAgZXJyb3IoJ1JlYWN0LmpzeDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG5cbiAgICB2YXIgZWxlbWVudCA9IGpzeERFVih0eXBlLCBwcm9wcywga2V5LCBzb3VyY2UsIHNlbGYpOyAvLyBUaGUgcmVzdWx0IGNhbiBiZSBudWxsaXNoIGlmIGEgbW9jayBvciBhIGN1c3RvbSBmdW5jdGlvbiBpcyB1c2VkLlxuICAgIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICAgIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gICAgLy8gV2UgZG9uJ3Qgd2FudCBleGNlcHRpb24gYmVoYXZpb3IgdG8gZGlmZmVyIGJldHdlZW4gZGV2IGFuZCBwcm9kLlxuICAgIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gICAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgICBpZiAodmFsaWRUeXBlKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcblxuICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGlzU3RhdGljQ2hpbGRyZW4pIHtcbiAgICAgICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW5baV0sIHR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IoJ1JlYWN0LmpzeDogU3RhdGljIGNoaWxkcmVuIHNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXkuICcgKyAnWW91IGFyZSBsaWtlbHkgZXhwbGljaXRseSBjYWxsaW5nIFJlYWN0LmpzeHMgb3IgUmVhY3QuanN4REVWLiAnICsgJ1VzZSB0aGUgQmFiZWwgdHJhbnNmb3JtIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGNoaWxkcmVuLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3BzLCAna2V5JykpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocHJvcHMpLmZpbHRlcihmdW5jdGlvbiAoaykge1xuICAgICAgICAgIHJldHVybiBrICE9PSAna2V5JztcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBiZWZvcmVFeGFtcGxlID0ga2V5cy5sZW5ndGggPiAwID8gJ3trZXk6IHNvbWVLZXksICcgKyBrZXlzLmpvaW4oJzogLi4uLCAnKSArICc6IC4uLn0nIDogJ3trZXk6IHNvbWVLZXl9JztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEtleVNwcmVhZFtjb21wb25lbnROYW1lICsgYmVmb3JlRXhhbXBsZV0pIHtcbiAgICAgICAgICB2YXIgYWZ0ZXJFeGFtcGxlID0ga2V5cy5sZW5ndGggPiAwID8gJ3snICsga2V5cy5qb2luKCc6IC4uLiwgJykgKyAnOiAuLi59JyA6ICd7fSc7XG5cbiAgICAgICAgICBlcnJvcignQSBwcm9wcyBvYmplY3QgY29udGFpbmluZyBhIFwia2V5XCIgcHJvcCBpcyBiZWluZyBzcHJlYWQgaW50byBKU1g6XFxuJyArICcgIGxldCBwcm9wcyA9ICVzO1xcbicgKyAnICA8JXMgey4uLnByb3BzfSAvPlxcbicgKyAnUmVhY3Qga2V5cyBtdXN0IGJlIHBhc3NlZCBkaXJlY3RseSB0byBKU1ggd2l0aG91dCB1c2luZyBzcHJlYWQ6XFxuJyArICcgIGxldCBwcm9wcyA9ICVzO1xcbicgKyAnICA8JXMga2V5PXtzb21lS2V5fSB7Li4ucHJvcHN9IC8+JywgYmVmb3JlRXhhbXBsZSwgY29tcG9uZW50TmFtZSwgYWZ0ZXJFeGFtcGxlLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICAgIGRpZFdhcm5BYm91dEtleVNwcmVhZFtjb21wb25lbnROYW1lICsgYmVmb3JlRXhhbXBsZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbn0gLy8gVGhlc2UgdHdvIGZ1bmN0aW9ucyBleGlzdCB0byBzdGlsbCBnZXQgY2hpbGQgd2FybmluZ3MgaW4gZGV2XG4vLyBldmVuIHdpdGggdGhlIHByb2QgdHJhbnNmb3JtLiBUaGlzIG1lYW5zIHRoYXQganN4REVWIGlzIHB1cmVseVxuLy8gb3B0LWluIGJlaGF2aW9yIGZvciBiZXR0ZXIgbWVzc2FnZXMgYnV0IHRoYXQgd2Ugd29uJ3Qgc3RvcFxuLy8gZ2l2aW5nIHlvdSB3YXJuaW5ncyBpZiB5b3UgdXNlIHByb2R1Y3Rpb24gYXBpcy5cblxuZnVuY3Rpb24ganN4V2l0aFZhbGlkYXRpb25TdGF0aWModHlwZSwgcHJvcHMsIGtleSkge1xuICB7XG4gICAgcmV0dXJuIGpzeFdpdGhWYWxpZGF0aW9uKHR5cGUsIHByb3BzLCBrZXksIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvbkR5bmFtaWModHlwZSwgcHJvcHMsIGtleSkge1xuICB7XG4gICAgcmV0dXJuIGpzeFdpdGhWYWxpZGF0aW9uKHR5cGUsIHByb3BzLCBrZXksIGZhbHNlKTtcbiAgfVxufVxuXG52YXIganN4ID0gIGpzeFdpdGhWYWxpZGF0aW9uRHluYW1pYyA7IC8vIHdlIG1heSB3YW50IHRvIHNwZWNpYWwgY2FzZSBqc3hzIGludGVybmFsbHkgdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygc3RhdGljIGNoaWxkcmVuLlxuLy8gZm9yIG5vdyB3ZSBjYW4gc2hpcCBpZGVudGljYWwgcHJvZCBmdW5jdGlvbnNcblxudmFyIGpzeHMgPSAganN4V2l0aFZhbGlkYXRpb25TdGF0aWMgO1xuXG5leHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbmV4cG9ydHMuanN4ID0ganN4O1xuZXhwb3J0cy5qc3hzID0ganN4cztcbiAgfSkoKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0VmVyc2lvbiA9ICcxOC4zLjEnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGRpc3BhdGNoZXIuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgYmF0Y2gncyBjb25maWd1cmF0aW9uIHN1Y2ggYXMgaG93IGxvbmcgYW4gdXBkYXRlXG4gKiBzaG91bGQgc3VzcGVuZCBmb3IgaWYgaXQgbmVlZHMgdG8uXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IHtcbiAgdHJhbnNpdGlvbjogbnVsbFxufTtcblxudmFyIFJlYWN0Q3VycmVudEFjdFF1ZXVlID0ge1xuICBjdXJyZW50OiBudWxsLFxuICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLlxuICBpc0JhdGNoaW5nTGVnYWN5OiBmYWxzZSxcbiAgZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGU6IGZhbHNlXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IG93bmVyLlxuICpcbiAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNob3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmVcbiAqIGN1cnJlbnRseSBiZWluZyBjb25zdHJ1Y3RlZC5cbiAqL1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0ge307XG52YXIgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IG51bGw7XG5mdW5jdGlvbiBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spIHtcbiAge1xuICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgfVxufVxuXG57XG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lID0gZnVuY3Rpb24gKHN0YWNrKSB7XG4gICAge1xuICAgICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICAgIH1cbiAgfTsgLy8gU3RhY2sgaW1wbGVtZW50YXRpb24gaW5qZWN0ZWQgYnkgdGhlIGN1cnJlbnQgcmVuZGVyZXIuXG5cblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFjayA9ICcnOyAvLyBBZGQgYW4gZXh0cmEgdG9wIGZyYW1lIHdoaWxlIGFuIGVsZW1lbnQgaXMgYmVpbmcgdmFsaWRhdGVkXG5cbiAgICBpZiAoY3VycmVudEV4dHJhU3RhY2tGcmFtZSkge1xuICAgICAgc3RhY2sgKz0gY3VycmVudEV4dHJhU3RhY2tGcmFtZTtcbiAgICB9IC8vIERlbGVnYXRlIHRvIHRoZSBpbmplY3RlZCByZW5kZXJlci1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuXG5cbiAgICB2YXIgaW1wbCA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrO1xuXG4gICAgaWYgKGltcGwpIHtcbiAgICAgIHN0YWNrICs9IGltcGwoKSB8fCAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2s7XG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG52YXIgZW5hYmxlQ2FjaGVFbGVtZW50ID0gZmFsc2U7XG52YXIgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgPSBmYWxzZTsgLy8gTm8ga25vd24gYnVncywgYnV0IG5lZWRzIHBlcmZvcm1hbmNlIHRlc3RpbmdcblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcbi8vIHN0dWZmLiBJbnRlbmRlZCB0byBlbmFibGUgUmVhY3QgY29yZSBtZW1iZXJzIHRvIG1vcmUgZWFzaWx5IGRlYnVnIHNjaGVkdWxpbmdcbi8vIGlzc3VlcyBpbiBERVYgYnVpbGRzLlxuXG52YXIgZW5hYmxlRGVidWdUcmFjaW5nID0gZmFsc2U7IC8vIFRyYWNrIHdoaWNoIEZpYmVyKHMpIHNjaGVkdWxlIHJlbmRlciB3b3JrLlxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyXG59O1xuXG57XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlO1xufVxuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge307XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICB2YXIgX2NvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBfY29uc3RydWN0b3IgJiYgKF9jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBfY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnO1xuICAgIHZhciB3YXJuaW5nS2V5ID0gY29tcG9uZW50TmFtZSArIFwiLlwiICsgY2FsbGVyTmFtZTtcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlcnJvcihcIkNhbid0IGNhbGwgJXMgb24gYSBjb21wb25lbnQgdGhhdCBpcyBub3QgeWV0IG1vdW50ZWQuIFwiICsgJ1RoaXMgaXMgYSBuby1vcCwgYnV0IGl0IG1pZ2h0IGluZGljYXRlIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uICcgKyAnSW5zdGVhZCwgYXNzaWduIHRvIGB0aGlzLnN0YXRlYCBkaXJlY3RseSBvciBkZWZpbmUgYSBgc3RhdGUgPSB7fTtgICcgKyAnY2xhc3MgcHJvcGVydHkgd2l0aCB0aGUgZGVzaXJlZCBzdGF0ZSBpbiB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gdHJ1ZTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xuXG5cbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbkNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnZnVuY3Rpb24nICYmIHBhcnRpYWxTdGF0ZSAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhICcgKyAnZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLicpO1xuICB9XG5cbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbn07XG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG59O1xuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cblxuXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcblxuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHtcbiAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkge1xuICAgICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1lXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cblxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbi8qKlxuICogQ29udmVuaWVuY2UgY29tcG9uZW50IHdpdGggZGVmYXVsdCBzaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBzQ1UuXG4gKi9cblxuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDsgLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5cbmFzc2lnbihwdXJlQ29tcG9uZW50UHJvdG90eXBlLCBDb21wb25lbnQucHJvdG90eXBlKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG4vLyBhbiBpbW11dGFibGUgb2JqZWN0IHdpdGggYSBzaW5nbGUgbXV0YWJsZSB2YWx1ZVxuZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuICB2YXIgcmVmT2JqZWN0ID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcblxuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLCBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biwgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgY29uZmlnLl9fc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gY29uZmlnLl9fc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjcmVhdGVlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gIHZhciBwcm9wcyA9IHt9O1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG5cbiAgICAgIHtcbiAgICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCBcIiArIGVsZW1lbnQgKyBcIi5cIik7XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuXG5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuXG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0ga2V5LnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcblxuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgZWxlbWVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBlbGVtZW50IEEgZWxlbWVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEtleShlbGVtZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJiBlbGVtZW50ICE9PSBudWxsICYmIGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICB7XG4gICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXNjYXBlKCcnICsgZWxlbWVudC5rZXkpO1xuICB9IC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG5cblxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG5mdW5jdGlvbiBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuYW1lU29GYXIsIGNhbGxiYWNrKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSBmYWxzZTtcblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgc3dpdGNoIChjaGlsZHJlbi4kJHR5cGVvZikge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIGlmIChpbnZva2VDYWxsYmFjaykge1xuICAgIHZhciBfY2hpbGQgPSBjaGlsZHJlbjtcbiAgICB2YXIgbWFwcGVkQ2hpbGQgPSBjYWxsYmFjayhfY2hpbGQpOyAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3M6XG5cbiAgICB2YXIgY2hpbGRLZXkgPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0RWxlbWVudEtleShfY2hpbGQsIDApIDogbmFtZVNvRmFyO1xuXG4gICAgaWYgKGlzQXJyYXkobWFwcGVkQ2hpbGQpKSB7XG4gICAgICB2YXIgZXNjYXBlZENoaWxkS2V5ID0gJyc7XG5cbiAgICAgIGlmIChjaGlsZEtleSAhPSBudWxsKSB7XG4gICAgICAgIGVzY2FwZWRDaGlsZEtleSA9IGVzY2FwZVVzZXJQcm92aWRlZEtleShjaGlsZEtleSkgKyAnLyc7XG4gICAgICB9XG5cbiAgICAgIG1hcEludG9BcnJheShtYXBwZWRDaGlsZCwgYXJyYXksIGVzY2FwZWRDaGlsZEtleSwgJycsIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgYGlmYCBzdGF0ZW1lbnQgaGVyZSBwcmV2ZW50cyBhdXRvLWRpc2FibGluZyBvZiB0aGUgc2FmZVxuICAgICAgICAgIC8vIGNvZXJjaW9uIEVTTGludCBydWxlLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGRpc2FibGUgaXQgYmVsb3cuXG4gICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5XG4gICAgICAgICAgaWYgKG1hcHBlZENoaWxkLmtleSAmJiAoIV9jaGlsZCB8fCBfY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1hcHBlZENoaWxkLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWFwcGVkQ2hpbGQgPSBjbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsIC8vIEtlZXAgYm90aCB0aGUgKG1hcHBlZCkgYW5kIG9sZCBrZXlzIGlmIHRoZXkgZGlmZmVyLCBqdXN0IGFzXG4gICAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlblxuICAgICAgICBlc2NhcGVkUHJlZml4ICsgKCAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgbWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkgPyAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIGV4aXN0aW5nIGVsZW1lbnQncyBrZXkgY2FuIGJlIGEgbnVtYmVyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoJycgKyBtYXBwZWRDaGlsZC5rZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpO1xuICAgICAgfVxuXG4gICAgICBhcnJheS5wdXNoKG1hcHBlZENoaWxkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cblxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGl0ZXJhYmxlQ2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gPT09IGl0ZXJhYmxlQ2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgICAgd2FybignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlQ2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaWkgPSAwO1xuXG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgY291bnQgPSAwO1xuICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgbiA9IDA7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmdcbiAgfSk7XG4gIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yRWFjaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nLlxuICB9LCBmb3JFYWNoQ29udGV4dCk7XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pIHx8IFtdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKSB7XG4gIC8vIFRPRE86IFNlY29uZCBhcmd1bWVudCB1c2VkIHRvIGJlIGFuIG9wdGlvbmFsIGBjYWxjdWxhdGVDaGFuZ2VkQml0c2BcbiAgLy8gZnVuY3Rpb24uIFdhcm4gdG8gcmVzZXJ2ZSBmb3IgZnV0dXJlIHVzZT9cbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsLFxuICAgIC8vIEFkZCB0aGVzZSB0byB1c2Ugc2FtZSBoaWRkZW4gY2xhc3MgaW4gVk0gYXMgU2VydmVyQ29udGV4dFxuICAgIF9kZWZhdWx0VmFsdWU6IG51bGwsXG4gICAgX2dsb2JhbE5hbWU6IG51bGxcbiAgfTtcbiAgY29udGV4dC5Qcm92aWRlciA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfUFJPVklERVJfVFlQRSxcbiAgICBfY29udGV4dDogY29udGV4dFxuICB9O1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IGZhbHNlO1xuXG4gIHtcbiAgICAvLyBBIHNlcGFyYXRlIG9iamVjdCwgYnV0IHByb3hpZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBvYmplY3QgZm9yXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGhhcyBhIGRpZmZlcmVudCAkJHR5cGVvZiwgc28gd2UgY2FuIHByb3Blcmx5XG4gICAgLy8gd2FybiBmb3IgdGhlIGluY29ycmVjdCB1c2FnZSBvZiBDb250ZXh0IGFzIGEgQ29uc3VtZXIuXG4gICAgdmFyIENvbnN1bWVyID0ge1xuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0XG4gICAgfTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbm90IHNldHRpbmcgYSB2YWx1ZSwgd2hpY2ggaXMgaW50ZW50aW9uYWwgaGVyZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ29uc3VtZXIsIHtcbiAgICAgIFByb3ZpZGVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Qcm92aWRlcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Qcm92aWRlcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Qcm92aWRlcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX1Byb3ZpZGVyKSB7XG4gICAgICAgICAgY29udGV4dC5Qcm92aWRlciA9IF9Qcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IF9jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlMjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlMjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZTIpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfdGhyZWFkQ291bnQ6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3RocmVhZENvdW50O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfdGhyZWFkQ291bnQpIHtcbiAgICAgICAgICBjb250ZXh0Ll90aHJlYWRDb3VudCA9IF90aHJlYWRDb3VudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIENvbnN1bWVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Db25zdW1lcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Db25zdW1lcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlOYW1lOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpc3BsYXlOYW1lO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChkaXNwbGF5TmFtZSkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIpIHtcbiAgICAgICAgICAgIHdhcm4oJ1NldHRpbmcgYGRpc3BsYXlOYW1lYCBvbiBDb250ZXh0LkNvbnN1bWVyIGhhcyBubyBlZmZlY3QuICcgKyBcIllvdSBzaG91bGQgc2V0IGl0IGRpcmVjdGx5IG9uIHRoZSBjb250ZXh0IHdpdGggQ29udGV4dC5kaXNwbGF5TmFtZSA9ICclcycuXCIsIGRpc3BsYXlOYW1lKTtcblxuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pOyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBtaXNzaW5nIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgZGVmaW5lUHJvcGVydHlcblxuICAgIGNvbnRleHQuQ29uc3VtZXIgPSBDb25zdW1lcjtcbiAgfVxuXG4gIHtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSBudWxsO1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlcjIgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbnZhciBVbmluaXRpYWxpemVkID0gLTE7XG52YXIgUGVuZGluZyA9IDA7XG52YXIgUmVzb2x2ZWQgPSAxO1xudmFyIFJlamVjdGVkID0gMjtcblxuZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHtcbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgIHZhciBjdG9yID0gcGF5bG9hZC5fcmVzdWx0O1xuICAgIHZhciB0aGVuYWJsZSA9IGN0b3IoKTsgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAvLyBUaGlzIG1pZ2h0IHRocm93IGVpdGhlciBiZWNhdXNlIGl0J3MgbWlzc2luZyBvciB0aHJvd3MuIElmIHNvLCB3ZSB0cmVhdCBpdFxuICAgIC8vIGFzIHN0aWxsIHVuaW5pdGlhbGl6ZWQgYW5kIHRyeSBhZ2FpbiBuZXh0IHRpbWUuIFdoaWNoIGlzIHRoZSBzYW1lIGFzIHdoYXRcbiAgICAvLyBoYXBwZW5zIGlmIHRoZSBjdG9yIG9yIGFueSB3cmFwcGVycyBwcm9jZXNzaW5nIHRoZSBjdG9yIHRocm93cy4gVGhpcyBtaWdodFxuICAgIC8vIGVuZCB1cCBmaXhpbmcgaXQgaWYgdGhlIHJlc29sdXRpb24gd2FzIGEgY29uY3VycmVuY3kgYnVnLlxuXG4gICAgdGhlbmFibGUudGhlbihmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVzb2x2ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZXNvbHZlZC5fc3RhdHVzID0gUmVzb2x2ZWQ7XG4gICAgICAgIHJlc29sdmVkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3Q7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZWplY3RlZC5fc3RhdHVzID0gUmVqZWN0ZWQ7XG4gICAgICAgIHJlamVjdGVkLl9yZXN1bHQgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIC8vIEluIGNhc2UsIHdlJ3JlIHN0aWxsIHVuaW5pdGlhbGl6ZWQsIHRoZW4gd2UncmUgd2FpdGluZyBmb3IgdGhlIHRoZW5hYmxlXG4gICAgICAvLyB0byByZXNvbHZlLiBTZXQgaXQgYXMgcGVuZGluZyBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICB2YXIgcGVuZGluZyA9IHBheWxvYWQ7XG4gICAgICBwZW5kaW5nLl9zdGF0dXMgPSBQZW5kaW5nO1xuICAgICAgcGVuZGluZy5fcmVzdWx0ID0gdGhlbmFibGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUmVzb2x2ZWQpIHtcbiAgICB2YXIgbW9kdWxlT2JqZWN0ID0gcGF5bG9hZC5fcmVzdWx0O1xuXG4gICAge1xuICAgICAgaWYgKG1vZHVsZU9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXAnICsgJ29ydCgpIGNhbGwuICcgKyAnSW5zdGVhZCByZWNlaXZlZDogJXNcXG5cXG5Zb3VyIGNvZGUgc2hvdWxkIGxvb2sgbGlrZTogXFxuICAnICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2NvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXAnICsgXCJvcnQoJy4vTXlDb21wb25lbnQnKSlcXG5cXG5cIiArICdEaWQgeW91IGFjY2lkZW50YWxseSBwdXQgY3VybHkgYnJhY2VzIGFyb3VuZCB0aGUgaW1wb3J0PycsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKCEoJ2RlZmF1bHQnIGluIG1vZHVsZU9iamVjdCkpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVPYmplY3QuZGVmYXVsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBwYXlsb2FkLl9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGF6eShjdG9yKSB7XG4gIHZhciBwYXlsb2FkID0ge1xuICAgIC8vIFdlIHVzZSB0aGVzZSBmaWVsZHMgdG8gc3RvcmUgdGhlIHJlc3VsdC5cbiAgICBfc3RhdHVzOiBVbmluaXRpYWxpemVkLFxuICAgIF9yZXN1bHQ6IGN0b3JcbiAgfTtcbiAgdmFyIGxhenlUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9MQVpZX1RZUEUsXG4gICAgX3BheWxvYWQ6IHBheWxvYWQsXG4gICAgX2luaXQ6IGxhenlJbml0aWFsaXplclxuICB9O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIGp1c3Qgc2V0IGl0IG9uIHRoZSBvYmplY3QuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICB2YXIgcHJvcFR5cGVzOyAvLyAkRmxvd0ZpeE1lXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsYXp5VHlwZSwge1xuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9wcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3RGVmYXVsdFByb3BzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYGRlZmF1bHRQcm9wc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIGRlZmF1bHRQcm9wcyA9IG5ld0RlZmF1bHRQcm9wczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAnZGVmYXVsdFByb3BzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvcFR5cGVzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BUeXBlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UHJvcFR5cGVzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIHByb3BUeXBlcyA9IG5ld1Byb3BUeXBlczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAncHJvcFR5cGVzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbGF6eVR5cGU7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSZWYocmVuZGVyKSB7XG4gIHtcbiAgICBpZiAocmVuZGVyICE9IG51bGwgJiYgcmVuZGVyLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCByZWNlaXZlZCBhIGBtZW1vYCAnICsgJ2NvbXBvbmVudC4gSW5zdGVhZCBvZiBmb3J3YXJkUmVmKG1lbW8oLi4uKSksIHVzZSAnICsgJ21lbW8oZm9yd2FyZFJlZiguLi4pKS4nKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCB3YXMgZ2l2ZW4gJXMuJywgcmVuZGVyID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHJlbmRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZW5kZXIubGVuZ3RoICE9PSAwICYmIHJlbmRlci5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBhY2NlcHQgZXhhY3RseSB0d28gcGFyYW1ldGVyczogcHJvcHMgYW5kIHJlZi4gJXMnLCByZW5kZXIubGVuZ3RoID09PSAxID8gJ0RpZCB5b3UgZm9yZ2V0IHRvIHVzZSB0aGUgcmVmIHBhcmFtZXRlcj8nIDogJ0FueSBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVuZGVyICE9IG51bGwpIHtcbiAgICAgIGlmIChyZW5kZXIuZGVmYXVsdFByb3BzICE9IG51bGwgfHwgcmVuZGVyLnByb3BUeXBlcyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgZG8gbm90IHN1cHBvcnQgcHJvcFR5cGVzIG9yIGRlZmF1bHRQcm9wcy4gJyArICdEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIGEgUmVhY3QgY29tcG9uZW50PycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICByZW5kZXI6IHJlbmRlclxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXJlbmRlci5uYW1lICYmICFyZW5kZXIuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1lbW8odHlwZSwgY29tcGFyZSkge1xuICB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkpIHtcbiAgICAgIGVycm9yKCdtZW1vOiBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGNvbXBvbmVudC4gSW5zdGVhZCAnICsgJ3JlY2VpdmVkOiAlcycsIHR5cGUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0Lm1lbW8oKHByb3BzKSA9PiB7Li4ufSk7XG4gICAgICAgIC8vIFRoaXMga2luZCBvZiBpbm5lciBmdW5jdGlvbiBpcyBub3QgdXNlZCBlbHNld2hlcmUgc28gdGhlIHNpZGUgZWZmZWN0IGlzIG9rYXkuXG5cbiAgICAgICAgaWYgKCF0eXBlLm5hbWUgJiYgIXR5cGUuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICB0eXBlLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRUeXBlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7XG5cbiAge1xuICAgIGlmIChkaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvcicgKyAnIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4nICsgJzIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4nICsgJzMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLicpO1xuICAgIH1cbiAgfSAvLyBXaWxsIHJlc3VsdCBpbiBhIG51bGwgYWNjZXNzIGVycm9yIGlmIGFjY2Vzc2VkIG91dHNpZGUgcmVuZGVyIHBoYXNlLiBXZVxuICAvLyBpbnRlbnRpb25hbGx5IGRvbid0IHRocm93IG91ciBvd24gZXJyb3IgYmVjYXVzZSB0aGlzIGlzIGluIGEgaG90IHBhdGguXG4gIC8vIEFsc28gaGVscHMgZW5zdXJlIHRoaXMgaXMgaW5saW5lZC5cblxuXG4gIHJldHVybiBkaXNwYXRjaGVyO1xufVxuZnVuY3Rpb24gdXNlQ29udGV4dChDb250ZXh0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcblxuICB7XG4gICAgLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuICAgIGlmIChDb250ZXh0Ll9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZWFsQ29udGV4dCA9IENvbnRleHQuX2NvbnRleHQ7IC8vIERvbid0IGRlZHVwbGljYXRlIGJlY2F1c2UgdGhpcyBsZWdpdGltYXRlbHkgY2F1c2VzIGJ1Z3NcbiAgICAgIC8vIGFuZCBub2JvZHkgc2hvdWxkIGJlIHVzaW5nIHRoaXMgaW4gZXhpc3RpbmcgY29kZS5cblxuICAgICAgaWYgKHJlYWxDb250ZXh0LkNvbnN1bWVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Db25zdW1lcikgaXMgbm90IHN1cHBvcnRlZCwgbWF5IGNhdXNlIGJ1Z3MsIGFuZCB3aWxsIGJlICcgKyAncmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9IGVsc2UgaWYgKHJlYWxDb250ZXh0LlByb3ZpZGVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Qcm92aWRlcikgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ29udGV4dChDb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG59XG5mdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xufVxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VNZW1vKGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZU1lbW8oY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gIHtcbiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICB9XG59XG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVRyYW5zaXRpb24oKTtcbn1cbmZ1bmN0aW9uIHVzZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUlkKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUlkKCk7XG59XG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbn1cblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICB2YXIgbGluZU51bWJlciA9IHNvdXJjZS5saW5lTnVtYmVyO1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMoZWxlbWVudFByb3BzKSB7XG4gIGlmIChlbGVtZW50UHJvcHMgIT09IG51bGwgJiYgZWxlbWVudFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oZWxlbWVudFByb3BzLl9fc291cmNlKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG5cblxudmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICBpZiAoIWluZm8pIHtcbiAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZm87XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIGlmICghZWxlbWVudC5fc3RvcmUgfHwgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkIHx8IGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgfVxuXG4gIHtcbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IHRydWU7IC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG5cbiAgICAgIHZhciBfbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgICAgZXJyb3IoJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIF9uYW1lIHx8ICdVbmtub3duJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiAhdHlwZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJyk7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGEgZnJhZ21lbnQsIHZhbGlkYXRlIHRoYXQgaXQgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2l0aCBmcmFnbWVudCBwcm9wc1xuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGZyYWdtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZnJhZ21lbnQpIHtcbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcblxuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhZ21lbnQucmVmICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKHByb3BzKTtcblxuICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gIGlmICh2YWxpZFR5cGUpIHtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24odHlwZSkge1xuICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpO1xuICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5KSB7XG4gICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7XG5cbiAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7XG4gICAgfSAvLyBMZWdhY3kgaG9vazogcmVtb3ZlIGl0XG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbihlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNjb3BlLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSB7fTtcbiAgdmFyIGN1cnJlbnRUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2NvcGUoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gZmFsc2U7XG52YXIgZW5xdWV1ZVRhc2tJbXBsID0gbnVsbDtcbmZ1bmN0aW9uIGVucXVldWVUYXNrKHRhc2spIHtcbiAgaWYgKGVucXVldWVUYXNrSW1wbCA9PT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICAvLyByZWFkIHJlcXVpcmUgb2ZmIHRoZSBtb2R1bGUgb2JqZWN0IHRvIGdldCBhcm91bmQgdGhlIGJ1bmRsZXJzLlxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIGRldGVjdCBhIHJlcXVpcmUgYW5kIGJ1bmRsZSBhIE5vZGUgcG9seWZpbGwuXG4gICAgICB2YXIgcmVxdWlyZVN0cmluZyA9ICgncmVxdWlyZScgKyBNYXRoLnJhbmRvbSgpKS5zbGljZSgwLCA3KTtcbiAgICAgIHZhciBub2RlUmVxdWlyZSA9IG1vZHVsZSAmJiBtb2R1bGVbcmVxdWlyZVN0cmluZ107IC8vIGFzc3VtaW5nIHdlJ3JlIGluIG5vZGUsIGxldCdzIHRyeSB0byBnZXQgbm9kZSdzXG4gICAgICAvLyB2ZXJzaW9uIG9mIHNldEltbWVkaWF0ZSwgYnlwYXNzaW5nIGZha2UgdGltZXJzIGlmIGFueS5cblxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gbm9kZVJlcXVpcmUuY2FsbChtb2R1bGUsICd0aW1lcnMnKS5zZXRJbW1lZGlhdGU7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgLy8gd2UncmUgaW4gYSBicm93c2VyXG4gICAgICAvLyB3ZSBjYW4ndCB1c2UgcmVndWxhciB0aW1lcnMgYmVjYXVzZSB0aGV5IG1heSBzdGlsbCBiZSBmYWtlZFxuICAgICAgLy8gc28gd2UgdHJ5IE1lc3NhZ2VDaGFubmVsK3Bvc3RNZXNzYWdlIGluc3RlYWRcbiAgICAgIGVucXVldWVUYXNrSW1wbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBlcnJvcignVGhpcyBicm93c2VyIGRvZXMgbm90IGhhdmUgYSBNZXNzYWdlQ2hhbm5lbCBpbXBsZW1lbnRhdGlvbiwgJyArICdzbyBlbnF1ZXVpbmcgdGFza3MgdmlhIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pIHdpbGwgZmFpbC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzICcgKyAnaWYgeW91IGVuY291bnRlciB0aGlzIHdhcm5pbmcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW5xdWV1ZVRhc2tJbXBsKHRhc2spO1xufVxuXG52YXIgYWN0U2NvcGVEZXB0aCA9IDA7XG52YXIgZGlkV2Fybk5vQXdhaXRBY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGFjdChjYWxsYmFjaykge1xuICB7XG4gICAgLy8gYGFjdGAgY2FsbHMgY2FuIGJlIG5lc3RlZCwgc28gd2UgdHJhY2sgdGhlIGRlcHRoLiBUaGlzIHJlcHJlc2VudHMgdGhlXG4gICAgLy8gbnVtYmVyIG9mIGBhY3RgIHNjb3BlcyBvbiB0aGUgc3RhY2suXG4gICAgdmFyIHByZXZBY3RTY29wZURlcHRoID0gYWN0U2NvcGVEZXB0aDtcbiAgICBhY3RTY29wZURlcHRoKys7XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgb3V0ZXJtb3N0IGBhY3RgIHNjb3BlLiBJbml0aWFsaXplIHRoZSBxdWV1ZS4gVGhlIHJlY29uY2lsZXJcbiAgICAgIC8vIHdpbGwgZGV0ZWN0IHRoZSBxdWV1ZSBhbmQgdXNlIGl0IGluc3RlYWQgb2YgU2NoZWR1bGVyLlxuICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgIH1cblxuICAgIHZhciBwcmV2SXNCYXRjaGluZ0xlZ2FjeSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3k7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLiBPbmx5XG4gICAgICAvLyBzZXQgdG8gYHRydWVgIHdoaWxlIHRoZSBnaXZlbiBjYWxsYmFjayBpcyBleGVjdXRlZCwgbm90IGZvciB1cGRhdGVzXG4gICAgICAvLyB0cmlnZ2VyZWQgZHVyaW5nIGFuIGFzeW5jIGV2ZW50LCBiZWNhdXNlIHRoaXMgaXMgaG93IHRoZSBsZWdhY3lcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIGBhY3RgIGJlaGF2ZWQuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKCk7IC8vIFJlcGxpY2F0ZSBiZWhhdmlvciBvZiBvcmlnaW5hbCBgYWN0YCBpbXBsZW1lbnRhdGlvbiBpbiBsZWdhY3kgbW9kZSxcbiAgICAgIC8vIHdoaWNoIGZsdXNoZWQgdXBkYXRlcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgc2NvcGUgZnVuY3Rpb24gZXhpdHMsIGV2ZW5cbiAgICAgIC8vIGlmIGl0J3MgYW4gYXN5bmMgZnVuY3Rpb24uXG5cbiAgICAgIGlmICghcHJldklzQmF0Y2hpbmdMZWdhY3kgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gcHJldklzQmF0Y2hpbmdMZWdhY3k7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0aGVuYWJsZVJlc3VsdCA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIGFuIGFzeW5jIGZ1bmN0aW9uIChpLmUuIHJldHVybmVkIGEgcHJvbWlzZSkuIFdhaXRcbiAgICAgIC8vIGZvciBpdCB0byByZXNvbHZlIGJlZm9yZSBleGl0aW5nIHRoZSBjdXJyZW50IHNjb3BlLlxuXG4gICAgICB2YXIgd2FzQXdhaXRlZCA9IGZhbHNlO1xuICAgICAgdmFyIHRoZW5hYmxlID0ge1xuICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgd2FzQXdhaXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhlbmFibGVSZXN1bHQudGhlbihmdW5jdGlvbiAocmV0dXJuVmFsdWUpIHtcbiAgICAgICAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgICAgICAgLy8gV2UndmUgZXhpdGVkIHRoZSBvdXRlcm1vc3QgYWN0IHNjb3BlLiBSZWN1cnNpdmVseSBmbHVzaCB0aGVcbiAgICAgICAgICAgICAgLy8gcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLlxuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAge1xuICAgICAgICBpZiAoIWRpZFdhcm5Ob0F3YWl0QWN0ICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge30pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF3YXNBd2FpdGVkKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5Ob0F3YWl0QWN0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBlcnJvcignWW91IGNhbGxlZCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aXRob3V0IGF3YWl0LiAnICsgJ1RoaXMgY291bGQgbGVhZCB0byB1bmV4cGVjdGVkIHRlc3RpbmcgYmVoYXZpb3VyLCAnICsgJ2ludGVybGVhdmluZyBtdWx0aXBsZSBhY3QgY2FsbHMgYW5kIG1peGluZyB0aGVpciAnICsgJ3Njb3Blcy4gJyArICdZb3Ugc2hvdWxkIC0gYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLik7Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWUgPSByZXN1bHQ7IC8vIFRoZSBjYWxsYmFjayBpcyBub3QgYW4gYXN5bmMgZnVuY3Rpb24uIEV4aXQgdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgIC8vIGltbWVkaWF0ZWx5LCB3aXRob3V0IGF3YWl0aW5nLlxuXG4gICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG5cbiAgICAgIGlmIChhY3RTY29wZURlcHRoID09PSAwKSB7XG4gICAgICAgIC8vIEV4aXRpbmcgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIEZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF9xdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKF9xdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUoX3F1ZXVlKTtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSAvLyBSZXR1cm4gYSB0aGVuYWJsZS4gSWYgdGhlIHVzZXIgYXdhaXRzIGl0LCB3ZSdsbCBmbHVzaCBhZ2FpbiBpblxuICAgICAgICAvLyBjYXNlIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkIGJ5IGEgbWljcm90YXNrLlxuXG5cbiAgICAgICAgdmFyIF90aGVuYWJsZSA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAvLyBDb25maXJtIHdlIGhhdmVuJ3QgcmUtZW50ZXJlZCBhbm90aGVyIGBhY3RgIHNjb3BlLCBpbiBjYXNlXG4gICAgICAgICAgICAvLyB0aGUgdXNlciBkb2VzIHNvbWV0aGluZyB3ZWlyZCBsaWtlIGF3YWl0IHRoZSB0aGVuYWJsZVxuICAgICAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMuXG4gICAgICAgICAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbHVzaCB0aGUgcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2luY2Ugd2UncmUgaW5zaWRlIGEgbmVzdGVkIGBhY3RgIHNjb3BlLCB0aGUgcmV0dXJuZWQgdGhlbmFibGVcbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmVzb2x2ZXMuIFRoZSBvdXRlciBzY29wZSB3aWxsIGZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF90aGVuYWJsZTIgPSB7XG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpIHtcbiAge1xuICAgIGlmIChwcmV2QWN0U2NvcGVEZXB0aCAhPT0gYWN0U2NvcGVEZXB0aCAtIDEpIHtcbiAgICAgIGVycm9yKCdZb3Ugc2VlbSB0byBoYXZlIG92ZXJsYXBwaW5nIGFjdCgpIGNhbGxzLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnQmUgc3VyZSB0byBhd2FpdCBwcmV2aW91cyBhY3QoKSBjYWxscyBiZWZvcmUgbWFraW5nIGEgbmV3IG9uZS4gJyk7XG4gICAgfVxuXG4gICAgYWN0U2NvcGVEZXB0aCA9IHByZXZBY3RTY29wZURlcHRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCkge1xuICB7XG4gICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIGVucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBObyBhZGRpdGlvbmFsIHdvcmsgd2FzIHNjaGVkdWxlZC4gRmluaXNoLlxuICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gS2VlcCBmbHVzaGluZyB3b3JrIHVudGlsIHRoZXJlJ3Mgbm9uZSBsZWZ0LlxuICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBpc0ZsdXNoaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsdXNoQWN0UXVldWUocXVldWUpIHtcbiAge1xuICAgIGlmICghaXNGbHVzaGluZykge1xuICAgICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICAgIHF1ZXVlID0gcXVldWUuc2xpY2UoaSArIDEpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGNyZWF0ZUVsZW1lbnQkMSA9ICBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbiA7XG52YXIgQ2hpbGRyZW4gPSB7XG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXksXG4gIG9ubHk6IG9ubHlDaGlsZFxufTtcblxuZXhwb3J0cy5DaGlsZHJlbiA9IENoaWxkcmVuO1xuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbmV4cG9ydHMuUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gUHVyZUNvbXBvbmVudDtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG5leHBvcnRzLlN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBSZWFjdFNoYXJlZEludGVybmFscztcbmV4cG9ydHMuYWN0ID0gYWN0O1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ7XG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZvcndhcmRSZWYgPSBmb3J3YXJkUmVmO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5sYXp5ID0gbGF6eTtcbmV4cG9ydHMubWVtbyA9IG1lbW87XG5leHBvcnRzLnN0YXJ0VHJhbnNpdGlvbiA9IHN0YXJ0VHJhbnNpdGlvbjtcbmV4cG9ydHMudW5zdGFibGVfYWN0ID0gYWN0O1xuZXhwb3J0cy51c2VDYWxsYmFjayA9IHVzZUNhbGxiYWNrO1xuZXhwb3J0cy51c2VDb250ZXh0ID0gdXNlQ29udGV4dDtcbmV4cG9ydHMudXNlRGVidWdWYWx1ZSA9IHVzZURlYnVnVmFsdWU7XG5leHBvcnRzLnVzZURlZmVycmVkVmFsdWUgPSB1c2VEZWZlcnJlZFZhbHVlO1xuZXhwb3J0cy51c2VFZmZlY3QgPSB1c2VFZmZlY3Q7XG5leHBvcnRzLnVzZUlkID0gdXNlSWQ7XG5leHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSB1c2VJbXBlcmF0aXZlSGFuZGxlO1xuZXhwb3J0cy51c2VJbnNlcnRpb25FZmZlY3QgPSB1c2VJbnNlcnRpb25FZmZlY3Q7XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdCA9IHVzZUxheW91dEVmZmVjdDtcbmV4cG9ydHMudXNlTWVtbyA9IHVzZU1lbW87XG5leHBvcnRzLnVzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyO1xuZXhwb3J0cy51c2VSZWYgPSB1c2VSZWY7XG5leHBvcnRzLnVzZVN0YXRlID0gdXNlU3RhdGU7XG5leHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlID0gdXNlU3luY0V4dGVybmFsU3RvcmU7XG5leHBvcnRzLnVzZVRyYW5zaXRpb24gPSB1c2VUcmFuc2l0aW9uO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0ICdmb2N1cy1vdXRsaW5lLW1hbmFnZXInO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZVJlZiwgQ29tcG9uZW50LCBjcmVhdGVSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY24gZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgc2Nyb2xsU21vb3RoIGZyb20gJ3Njcm9sbC1zbW9vdGgnO1xuaW1wb3J0IFNjcm9sbHBhcmVudCBmcm9tICdzY3JvbGxwYXJlbnQnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC5kZWJvdW5jZSc7XG5pbXBvcnQgRm9jdXNMb2NrIGZyb20gJ3JlYWN0LWZvY3VzLWxvY2snO1xuaW1wb3J0IHN0eWxlZCwgeyBjcmVhdGVHbG9iYWxTdHlsZSB9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tICdyZWFjdC1kb20nO1xuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSB7XG4gIChudWxsID09IGEgfHwgYSA+IHIubGVuZ3RoKSAmJiAoYSA9IHIubGVuZ3RoKTtcbiAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07XG4gIHJldHVybiBuO1xufVxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocikpIHJldHVybiByO1xufVxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChlKSB7XG4gIGlmICh2b2lkIDAgPT09IGUpIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgcmV0dXJuIGU7XG59XG5mdW5jdGlvbiBfY2FsbFN1cGVyKHQsIG8sIGUpIHtcbiAgcmV0dXJuIG8gPSBfZ2V0UHJvdG90eXBlT2YobyksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSA/IFJlZmxlY3QuY29uc3RydWN0KG8sIGUgfHwgW10sIF9nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3RvcikgOiBvLmFwcGx5KHQsIGUpKTtcbn1cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhhLCBuKSB7XG4gIGlmICghKGEgaW5zdGFuY2VvZiBuKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHIpIHtcbiAgZm9yICh2YXIgdCA9IDA7IHQgPCByLmxlbmd0aDsgdCsrKSB7XG4gICAgdmFyIG8gPSByW3RdO1xuICAgIG8uZW51bWVyYWJsZSA9IG8uZW51bWVyYWJsZSB8fCAhMSwgby5jb25maWd1cmFibGUgPSAhMCwgXCJ2YWx1ZVwiIGluIG8gJiYgKG8ud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBfdG9Qcm9wZXJ0eUtleShvLmtleSksIG8pO1xuICB9XG59XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoZSwgciwgdCkge1xuICByZXR1cm4gciAmJiBfZGVmaW5lUHJvcGVydGllcyhlLnByb3RvdHlwZSwgciksIHQgJiYgX2RlZmluZVByb3BlcnRpZXMoZSwgdCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6ICExXG4gIH0pLCBlO1xufVxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIociwgZSkge1xuICB2YXIgdCA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07XG4gIGlmICghdCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHIpIHx8ICh0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIpKSB8fCBlICYmIHIgJiYgXCJudW1iZXJcIiA9PSB0eXBlb2Ygci5sZW5ndGgpIHtcbiAgICAgIHQgJiYgKHIgPSB0KTtcbiAgICAgIHZhciBuID0gMCxcbiAgICAgICAgRiA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgczogRixcbiAgICAgICAgbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBuID49IHIubGVuZ3RoID8ge1xuICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgZG9uZTogITEsXG4gICAgICAgICAgICB2YWx1ZTogcltuKytdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZTogZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICB0aHJvdyByO1xuICAgICAgICB9LFxuICAgICAgICBmOiBGXG4gICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG4gIH1cbiAgdmFyIG8sXG4gICAgYSA9ICEwLFxuICAgIHUgPSAhMTtcbiAgcmV0dXJuIHtcbiAgICBzOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0ID0gdC5jYWxsKHIpO1xuICAgIH0sXG4gICAgbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHIgPSB0Lm5leHQoKTtcbiAgICAgIHJldHVybiBhID0gci5kb25lLCByO1xuICAgIH0sXG4gICAgZTogZnVuY3Rpb24gKHIpIHtcbiAgICAgIHUgPSAhMCwgbyA9IHI7XG4gICAgfSxcbiAgICBmOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhIHx8IG51bGwgPT0gdC5yZXR1cm4gfHwgdC5yZXR1cm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmICh1KSB0aHJvdyBvO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7XG4gIHJldHVybiAociA9IF90b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpIHtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7XG4gIH0sIF9nZXRQcm90b3R5cGVPZih0KTtcbn1cbmZ1bmN0aW9uIF9pbmhlcml0cyh0LCBlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUgJiYgbnVsbCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogdCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICB9XG4gIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZSAmJiBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICB0cnkge1xuICAgIHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgfSBjYXRjaCAodCkge31cbiAgcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXQ7XG4gIH0pKCk7XG59XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQociwgbCkge1xuICB2YXIgdCA9IG51bGwgPT0gciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdO1xuICBpZiAobnVsbCAhPSB0KSB7XG4gICAgdmFyIGUsXG4gICAgICBuLFxuICAgICAgaSxcbiAgICAgIHUsXG4gICAgICBhID0gW10sXG4gICAgICBmID0gITAsXG4gICAgICBvID0gITE7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpID0gKHQgPSB0LmNhbGwocikpLm5leHQsIDAgPT09IGwpIHtcbiAgICAgICAgaWYgKE9iamVjdCh0KSAhPT0gdCkgcmV0dXJuO1xuICAgICAgICBmID0gITE7XG4gICAgICB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7XG4gICAgfSBjYXRjaCAocikge1xuICAgICAgbyA9ICEwLCBuID0gcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFmICYmIG51bGwgIT0gdC5yZXR1cm4gJiYgKHUgPSB0LnJldHVybigpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobykgdGhyb3cgbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cbn1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHtcbiAgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7XG4gICAgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pO1xuICB9XG4gIHJldHVybiB0O1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIoZSkge1xuICBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykge1xuICAgIHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTtcbiAgICByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCwgZSkge1xuICBpZiAoZSAmJiAoXCJvYmplY3RcIiA9PSB0eXBlb2YgZSB8fCBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUpKSByZXR1cm4gZTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KTtcbn1cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LCBlKSB7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0O1xuICB9LCBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShyLCBlKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMocikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGUpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBlKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7XG59XG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKGUsIHQpIHtcbiAgcmV0dXJuIHQgfHwgKHQgPSBlLnNsaWNlKDApKSwgT2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCB7XG4gICAgcmF3OiB7XG4gICAgICB2YWx1ZTogT2JqZWN0LmZyZWV6ZSh0KVxuICAgIH1cbiAgfSkpO1xufVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHtcbiAgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIHQgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkge1xuICAgIHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiBpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHtcbiAgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IHR5cGVvZiBpID8gaSA6IGkgKyBcIlwiO1xufVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIsIGEpIHtcbiAgaWYgKHIpIHtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgcikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KHIsIGEpO1xuICAgIHZhciB0ID0ge30udG9TdHJpbmcuY2FsbChyKS5zbGljZSg4LCAtMSk7XG4gICAgcmV0dXJuIFwiT2JqZWN0XCIgPT09IHQgJiYgci5jb25zdHJ1Y3RvciAmJiAodCA9IHIuY29uc3RydWN0b3IubmFtZSksIFwiTWFwXCIgPT09IHQgfHwgXCJTZXRcIiA9PT0gdCA/IEFycmF5LmZyb20ocikgOiBcIkFyZ3VtZW50c1wiID09PSB0IHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHQpID8gX2FycmF5TGlrZVRvQXJyYXkociwgYSkgOiB2b2lkIDA7XG4gIH1cbn1cblxudmFyIF90ZW1wbGF0ZU9iamVjdCQ5O1xudmFyIEdsb2JhbFN0eWxlID0gY3JlYXRlR2xvYmFsU3R5bGUoX3RlbXBsYXRlT2JqZWN0JDkgfHwgKF90ZW1wbGF0ZU9iamVjdCQ5ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIC5mb2N1cy1vdXRsaW5lLWhpZGRlbiA6Zm9jdXMge1xcbiAgICAgIG91dGxpbmU6IG5vbmU7XFxuICB9XFxuXCJdKSkpO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDg7XG52YXIgU3ZnQnV0dG9uID0gc3R5bGVkLmJ1dHRvbihfdGVtcGxhdGVPYmplY3QkOCB8fCAoX3RlbXBsYXRlT2JqZWN0JDggPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgZGlzcGxheTogYmxvY2s7XFxuICBwYWRkaW5nOiAwO1xcbiAgYm9yZGVyOiAwO1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIGZvbnQtc2l6ZTogMDtcXG4gIGN1cnNvcjogXCIsIFwiO1xcblwiXSkpLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmRpc2FibGVkID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJztcbn0pO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDcsIF90ZW1wbGF0ZU9iamVjdDI7XG52YXIgTGFiZWwgPSBzdHlsZWQuc3BhbihfdGVtcGxhdGVPYmplY3QkNyB8fCAoX3RlbXBsYXRlT2JqZWN0JDcgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgZm9udC1zaXplOiAxMnB4O1xcbiAgbGluZS1oZWlnaHQ6IDE7XFxuXCJdKSkpO1xuZnVuY3Rpb24gQXJyb3coX3JlZikge1xuICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgb25DbGljayA9IF9yZWYub25DbGljayxcbiAgICBpbnZlcnRlZCA9IF9yZWYuaW52ZXJ0ZWQsXG4gICAgbGFiZWwgPSBfcmVmLmxhYmVsLFxuICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN2Z0J1dHRvbiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgXCJkYXRhLXRvdXItZWxlbVwiOiBcIlwiLmNvbmNhdChpbnZlcnRlZCA/ICdyaWdodCcgOiAnbGVmdCcsIFwiLWFycm93XCIpLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZFxuICB9LCBsYWJlbCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExhYmVsLCBudWxsLCBsYWJlbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgdmlld0JveDogXCIwIDAgMTguNCAxNC40XCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBpbnZlcnRlZCA/ICdNMTcgNy4ySDFNMTAuOCAxTDE3IDcuMmwtNi4yIDYuMicgOiAnTTEuNCA3LjJoMTZNNy42IDFMMS40IDcuMmw2LjIgNi4yJyxcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBzdHJva2U6IFwiY3VycmVudENvbG9yXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMlwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VNaXRlcmxpbWl0OiBcIjEwXCJcbiAgfSkpKTtcbn1cbkFycm93LnByb3BUeXBlcyA9IHtcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGludmVydGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgbGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2xcbn07XG52YXIgQXJyb3ckMSA9IHN0eWxlZChBcnJvdykoX3RlbXBsYXRlT2JqZWN0MiB8fCAoX3RlbXBsYXRlT2JqZWN0MiA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBjb2xvcjogXCIsIFwiO1xcblxcbiAgXCIsIFwiO1xcbiAgXCIsIFwiO1xcblxcbiAgJjpob3ZlciB7XFxuICAgIGNvbG9yOiBcIiwgXCI7XFxuICB9XFxuXCJdKSksIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuZGlzYWJsZWQgPyAnI2NhY2NjZScgOiAnIzY0NjQ2NCc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmludmVydGVkID8gJ21hcmdpbi1sZWZ0OiAyNHB4OycgOiAnbWFyZ2luLXJpZ2h0OiAyNHB4Oyc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuICFwcm9wcy5sYWJlbCAmJiBcIlxcbiAgICB3aWR0aDogMTZweDtcXG4gICAgaGVpZ2h0OiAxMnB4O1xcbiAgICBmbGV4OiAwIDAgMTZweDtcXG4gIFwiO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5kaXNhYmxlZCA/ICcjY2FjY2NlJyA6ICcjMDAwJztcbn0pO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDY7XG5mdW5jdGlvbiBDbG9zZShfcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgIGFyaWFMYWJlbCA9IF9yZWYuYXJpYUxhYmVsO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ZnQnV0dG9uLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBcImFyaWEtbGFiZWxcIjogYXJpYUxhYmVsXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB2aWV3Qm94OiBcIjAgMCA5LjEgOS4xXCIsXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlLFxuICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIGQ6IFwiTTUuOSA0LjVsMi44LTIuOGMuNC0uNC40LTEgMC0xLjQtLjQtLjQtMS0uNC0xLjQgMEw0LjUgMy4xIDEuNy4zQzEuMy0uMS43LS4xLjMuM2MtLjQuNC0uNCAxIDAgMS40bDIuOCAyLjhMLjMgNy40Yy0uNC40LS40IDEgMCAxLjQuMi4yLjQuMy43LjNzLjUtLjEuNy0uM0w0LjUgNmwyLjggMi44Yy4zLjIuNS4zLjguM3MuNS0uMS43LS4zYy40LS40LjQtMSAwLTEuNEw1LjkgNC41elwiXG4gIH0pKSk7XG59XG5DbG9zZS5wcm9wVHlwZXMgPSB7XG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBhcmlhTGFiZWw6IFByb3BUeXBlcy5zdHJpbmdcbn07XG52YXIgU3R5bGVkQ2xvc2UgPSBzdHlsZWQoQ2xvc2UpKF90ZW1wbGF0ZU9iamVjdCQ2IHx8IChfdGVtcGxhdGVPYmplY3QkNiA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDIycHg7XFxuICByaWdodDogMjJweDtcXG4gIHdpZHRoOiA5cHg7XFxuICBoZWlnaHQ6IDlweDtcXG4gIGNvbG9yOiAjNWU1ZTVlO1xcbiAgJjpob3ZlciB7XFxuICAgIGNvbG9yOiAjMDAwO1xcbiAgfVxcblwiXSkpKTtcblxuZnVuY3Rpb24gZ2V0Tm9kZVJlY3Qobm9kZSkge1xuICB2YXIgX25vZGUkZ2V0Qm91bmRpbmdDbGllID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICB0b3AgPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUudG9wLFxuICAgIHJpZ2h0ID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLnJpZ2h0LFxuICAgIGJvdHRvbSA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS5ib3R0b20sXG4gICAgbGVmdCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS5sZWZ0LFxuICAgIHdpZHRoID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLndpZHRoLFxuICAgIGhlaWdodCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS5oZWlnaHQ7XG4gIHJldHVybiB7XG4gICAgdG9wOiB0b3AsXG4gICAgcmlnaHQ6IHJpZ2h0LFxuICAgIGJvdHRvbTogYm90dG9tLFxuICAgIGxlZnQ6IGxlZnQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59XG5mdW5jdGlvbiBnZXRIaWdobGlnaHRlZFJlY3Qobm9kZSwgc3RlcCkge1xuICBpZiAoIXN0ZXAuaGlnaGxpZ2h0ZWRTZWxlY3RvcnMpIHtcbiAgICByZXR1cm4gZ2V0Tm9kZVJlY3Qobm9kZSk7XG4gIH1cbiAgdmFyIGF0dHJzID0gZ2V0Tm9kZVJlY3Qobm9kZSk7XG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzdGVwLmhpZ2hsaWdodGVkU2VsZWN0b3JzKSxcbiAgICBfc3RlcDtcbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIHNlbGVjdG9yID0gX3N0ZXAudmFsdWU7XG4gICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnIHx8IGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcmVjdCA9IGdldE5vZGVSZWN0KGVsZW1lbnQpO1xuICAgICAgaWYgKHJlY3QudG9wIDwgYXR0cnMudG9wKSB7XG4gICAgICAgIGF0dHJzLnRvcCA9IHJlY3QudG9wO1xuICAgICAgfVxuICAgICAgaWYgKHJlY3QucmlnaHQgPiBhdHRycy5yaWdodCkge1xuICAgICAgICBhdHRycy5yaWdodCA9IHJlY3QucmlnaHQ7XG4gICAgICB9XG4gICAgICBpZiAocmVjdC5ib3R0b20gPiBhdHRycy5ib3R0b20pIHtcbiAgICAgICAgYXR0cnMuYm90dG9tID0gcmVjdC5ib3R0b207XG4gICAgICB9XG4gICAgICBpZiAocmVjdC5sZWZ0IDwgYXR0cnMubGVmdCkge1xuICAgICAgICBhdHRycy5sZWZ0ID0gcmVjdC5sZWZ0O1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IuZigpO1xuICB9XG4gIGF0dHJzLndpZHRoID0gYXR0cnMucmlnaHQgLSBhdHRycy5sZWZ0O1xuICBhdHRycy5oZWlnaHQgPSBhdHRycy5ib3R0b20gLSBhdHRycy50b3A7XG4gIHJldHVybiBhdHRycztcbn1cbmZ1bmN0aW9uIGluVmlldyhfcmVmKSB7XG4gIHZhciB0b3AgPSBfcmVmLnRvcCxcbiAgICByaWdodCA9IF9yZWYucmlnaHQsXG4gICAgYm90dG9tID0gX3JlZi5ib3R0b20sXG4gICAgbGVmdCA9IF9yZWYubGVmdCxcbiAgICB3ID0gX3JlZi53LFxuICAgIGggPSBfcmVmLmgsXG4gICAgX3JlZiR0aHJlc2hvbGQgPSBfcmVmLnRocmVzaG9sZCxcbiAgICB0aHJlc2hvbGQgPSBfcmVmJHRocmVzaG9sZCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkdGhyZXNob2xkO1xuICByZXR1cm4gdG9wID49IDAgKyB0aHJlc2hvbGQgJiYgbGVmdCA+PSAwICsgdGhyZXNob2xkICYmIGJvdHRvbSA8PSBoIC0gdGhyZXNob2xkICYmIHJpZ2h0IDw9IHcgLSB0aHJlc2hvbGQ7XG59XG5mdW5jdGlvbiBpc0JvZHkobm9kZSkge1xuICByZXR1cm4gbm9kZSA9PT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpIHx8IG5vZGUgPT09IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKTtcbn1cbnZhciBpc0hvcml6ID0gZnVuY3Rpb24gaXNIb3Jpeihwb3MpIHtcbiAgcmV0dXJuIC8obGVmdHxyaWdodCkvLnRlc3QocG9zKTtcbn07XG52YXIgaXNPdXRzaWRlWCA9IGZ1bmN0aW9uIGlzT3V0c2lkZVgodmFsLCB3aW5kb3dXaWR0aCkge1xuICByZXR1cm4gdmFsID4gd2luZG93V2lkdGg7XG59O1xudmFyIGlzT3V0c2lkZVkgPSBmdW5jdGlvbiBpc091dHNpZGVZKHZhbCwgd2luZG93SGVpZ2h0KSB7XG4gIHJldHVybiB2YWwgPiB3aW5kb3dIZWlnaHQ7XG59O1xudmFyIHNhZmUgPSBmdW5jdGlvbiBzYWZlKHN1bSkge1xuICByZXR1cm4gc3VtIDwgMCA/IDAgOiBzdW07XG59O1xuZnVuY3Rpb24gYmVzdFBvc2l0aW9uT2YocG9zaXRpb25zKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwb3NpdGlvbnMpLm1hcChmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogcCxcbiAgICAgIHZhbHVlOiBwb3NpdGlvbnNbcF1cbiAgICB9O1xuICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIudmFsdWUgLSBhLnZhbHVlO1xuICB9KS5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gcC5wb3NpdGlvbjtcbiAgfSk7XG59XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkNTtcbnZhciBHdWlkZSA9IHN0eWxlZC5kaXYoX3RlbXBsYXRlT2JqZWN0JDUgfHwgKF90ZW1wbGF0ZU9iamVjdCQ1ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIC0tcmVhY3RvdXItYWNjZW50OiBcIiwgXCI7XFxuICBcIiwgXCJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIHotaW5kZXg6IDEwMDAwMDA7XFxuXFxuICB0cmFuc2Zvcm06IFwiLCBcIjtcXG5cIl0pKSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5hY2NlbnRDb2xvcjtcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuZGVmYXVsdFN0eWxlcyA/IFwiXFxuICBtYXgtd2lkdGg6IDMzMXB4O1xcbiAgbWluLXdpZHRoOiAxNTBweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDQwcHg7XFxuICBib3JkZXItcmFkaXVzOiBcIi5jb25jYXQocHJvcHMucm91bmRlZCwgXCJweDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICBwYWRkaW5nOiAyNHB4IDMwcHg7XFxuICBib3gtc2hhZG93OiAwIDAuNWVtIDNlbSByZ2JhKDAsIDAsIDAsIDAuMyk7XFxuICBjb2xvcjogaW5oZXJpdDtcXG4gIFwiKSA6ICcnO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciB0YXJnZXRUb3AgPSBwcm9wcy50YXJnZXRUb3AsXG4gICAgdGFyZ2V0UmlnaHQgPSBwcm9wcy50YXJnZXRSaWdodCxcbiAgICB0YXJnZXRCb3R0b20gPSBwcm9wcy50YXJnZXRCb3R0b20sXG4gICAgdGFyZ2V0TGVmdCA9IHByb3BzLnRhcmdldExlZnQsXG4gICAgd2luZG93V2lkdGggPSBwcm9wcy53aW5kb3dXaWR0aCxcbiAgICB3aW5kb3dIZWlnaHQgPSBwcm9wcy53aW5kb3dIZWlnaHQsXG4gICAgaGVscGVyV2lkdGggPSBwcm9wcy5oZWxwZXJXaWR0aCxcbiAgICBoZWxwZXJIZWlnaHQgPSBwcm9wcy5oZWxwZXJIZWlnaHQsXG4gICAgaGVscGVyUG9zaXRpb24gPSBwcm9wcy5oZWxwZXJQb3NpdGlvbixcbiAgICBwYWRkaW5nID0gcHJvcHMucGFkZGluZztcbiAgdmFyIGF2YWlsYWJsZSA9IHtcbiAgICBsZWZ0OiB0YXJnZXRMZWZ0LFxuICAgIHJpZ2h0OiB3aW5kb3dXaWR0aCAtIHRhcmdldFJpZ2h0LFxuICAgIHRvcDogdGFyZ2V0VG9wLFxuICAgIGJvdHRvbTogd2luZG93SGVpZ2h0IC0gdGFyZ2V0Qm90dG9tXG4gIH07XG4gIHZhciBjb3VsZFBvc2l0aW9uQXQgPSBmdW5jdGlvbiBjb3VsZFBvc2l0aW9uQXQocG9zaXRpb24pIHtcbiAgICByZXR1cm4gYXZhaWxhYmxlW3Bvc2l0aW9uXSA+IChpc0hvcml6KHBvc2l0aW9uKSA/IGhlbHBlcldpZHRoICsgcGFkZGluZyAqIDIgOiBoZWxwZXJIZWlnaHQgKyBwYWRkaW5nICogMik7XG4gIH07XG4gIHZhciBhdXRvUG9zaXRpb24gPSBmdW5jdGlvbiBhdXRvUG9zaXRpb24oY29vcmRzKSB7XG4gICAgdmFyIHBvc2l0aW9uc09yZGVyID0gYmVzdFBvc2l0aW9uT2YoYXZhaWxhYmxlKTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBvc2l0aW9uc09yZGVyLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoY291bGRQb3NpdGlvbkF0KHBvc2l0aW9uc09yZGVyW2pdKSkge1xuICAgICAgICByZXR1cm4gY29vcmRzW3Bvc2l0aW9uc09yZGVyW2pdXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvb3Jkcy5jZW50ZXI7XG4gIH07XG4gIHZhciBwb3MgPSBmdW5jdGlvbiBwb3MoaGVscGVyUG9zaXRpb24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWxwZXJQb3NpdGlvbikpIHtcbiAgICAgIHZhciBpc091dFggPSBpc091dHNpZGVYKGhlbHBlclBvc2l0aW9uWzBdLCB3aW5kb3dXaWR0aCk7XG4gICAgICB2YXIgaXNPdXRZID0gaXNPdXRzaWRlWShoZWxwZXJQb3NpdGlvblsxXSwgd2luZG93SGVpZ2h0KTtcbiAgICAgIHZhciB3YXJuID0gZnVuY3Rpb24gd2FybihheGlzLCBudW0pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiXCIuY29uY2F0KGF4aXMsIFwiOlwiKS5jb25jYXQobnVtLCBcIiBpcyBvdXRzaWRlIHdpbmRvdywgZmFsbGluZyBiYWNrIHRvIGNlbnRlclwiKSk7XG4gICAgICB9O1xuICAgICAgaWYgKGlzT3V0WCkgd2FybigneCcsIGhlbHBlclBvc2l0aW9uWzBdKTtcbiAgICAgIGlmIChpc091dFkpIHdhcm4oJ3knLCBoZWxwZXJQb3NpdGlvblsxXSk7XG4gICAgICByZXR1cm4gW2lzT3V0WCA/IHdpbmRvd1dpZHRoIC8gMiAtIGhlbHBlcldpZHRoIC8gMiA6IGhlbHBlclBvc2l0aW9uWzBdLCBpc091dFkgPyB3aW5kb3dIZWlnaHQgLyAyIC0gaGVscGVySGVpZ2h0IC8gMiA6IGhlbHBlclBvc2l0aW9uWzFdXTtcbiAgICB9XG4gICAgdmFyIGhYID0gaXNPdXRzaWRlWCh0YXJnZXRMZWZ0ICsgaGVscGVyV2lkdGgsIHdpbmRvd1dpZHRoKSA/IGlzT3V0c2lkZVgodGFyZ2V0UmlnaHQgKyBwYWRkaW5nLCB3aW5kb3dXaWR0aCkgPyB0YXJnZXRSaWdodCAtIGhlbHBlcldpZHRoIDogdGFyZ2V0UmlnaHQgLSBoZWxwZXJXaWR0aCArIHBhZGRpbmcgOiB0YXJnZXRMZWZ0IC0gcGFkZGluZztcbiAgICB2YXIgeCA9IGhYID4gcGFkZGluZyA/IGhYIDogcGFkZGluZztcbiAgICB2YXIgaFkgPSBpc091dHNpZGVZKHRhcmdldFRvcCArIGhlbHBlckhlaWdodCwgd2luZG93SGVpZ2h0KSA/IGlzT3V0c2lkZVkodGFyZ2V0Qm90dG9tICsgcGFkZGluZywgd2luZG93SGVpZ2h0KSA/IHRhcmdldEJvdHRvbSAtIGhlbHBlckhlaWdodCA6IHRhcmdldEJvdHRvbSAtIGhlbHBlckhlaWdodCArIHBhZGRpbmcgOiB0YXJnZXRUb3AgLSBwYWRkaW5nO1xuICAgIHZhciB5ID0gaFkgPiBwYWRkaW5nID8gaFkgOiBwYWRkaW5nO1xuICAgIHZhciBjb29yZHMgPSB7XG4gICAgICB0b3A6IFt4LCB0YXJnZXRUb3AgLSBoZWxwZXJIZWlnaHQgLSBwYWRkaW5nICogMl0sXG4gICAgICByaWdodDogW3RhcmdldFJpZ2h0ICsgcGFkZGluZyAqIDIsIHldLFxuICAgICAgYm90dG9tOiBbeCwgdGFyZ2V0Qm90dG9tICsgcGFkZGluZyAqIDJdLFxuICAgICAgbGVmdDogW3RhcmdldExlZnQgLSBoZWxwZXJXaWR0aCAtIHBhZGRpbmcgKiAyLCB5XSxcbiAgICAgIGNlbnRlcjogW3dpbmRvd1dpZHRoIC8gMiAtIGhlbHBlcldpZHRoIC8gMiwgd2luZG93SGVpZ2h0IC8gMiAtIGhlbHBlckhlaWdodCAvIDJdXG4gICAgfTtcbiAgICBpZiAoaGVscGVyUG9zaXRpb24gPT09ICdjZW50ZXInIHx8IGNvdWxkUG9zaXRpb25BdChoZWxwZXJQb3NpdGlvbikpIHtcbiAgICAgIHJldHVybiBjb29yZHNbaGVscGVyUG9zaXRpb25dO1xuICAgIH1cbiAgICByZXR1cm4gYXV0b1Bvc2l0aW9uKGNvb3Jkcyk7XG4gIH07XG4gIHZhciBwID0gcG9zKGhlbHBlclBvc2l0aW9uKTtcbiAgcmV0dXJuIFwidHJhbnNsYXRlKFwiLmNvbmNhdChNYXRoLnJvdW5kKHBbMF0pLCBcInB4LCBcIikuY29uY2F0KE1hdGgucm91bmQocFsxXSksIFwicHgpXCIpO1xufSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkNDtcbnZhciBCYWRnZSA9IHN0eWxlZC5zcGFuKF90ZW1wbGF0ZU9iamVjdCQ0IHx8IChfdGVtcGxhdGVPYmplY3QkNCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcbiAgYmFja2dyb3VuZDogdmFyKC0tcmVhY3RvdXItYWNjZW50KTtcXG4gIGJhY2tncm91bmQ6IFwiLCBcIjtcXG4gIGhlaWdodDogMS44NzVlbTtcXG4gIGxpbmUtaGVpZ2h0OiAyO1xcbiAgcGFkZGluZy1sZWZ0OiAwLjgxMjVlbTtcXG4gIHBhZGRpbmctcmlnaHQ6IDAuODEyNWVtO1xcbiAgZm9udC1zaXplOiAxZW07XFxuICBib3JkZXItcmFkaXVzOiAxLjYyNWVtO1xcbiAgY29sb3I6IHdoaXRlO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgYm94LXNoYWRvdzogMCAwLjI1ZW0gMC41ZW0gcmdiYSgwLCAwLCAwLCAwLjMpO1xcbiAgdG9wOiAtMC44MTI1ZW07XFxuICBsZWZ0OiAtMC44MTI1ZW07XFxuXCJdKSksIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuYWNjZW50Q29sb3I7XG59KTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCQzO1xudmFyIENvbnRyb2xzID0gc3R5bGVkLmRpdihfdGVtcGxhdGVPYmplY3QkMyB8fCAoX3RlbXBsYXRlT2JqZWN0JDMgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgZGlzcGxheTogZmxleDtcXG4gIG1hcmdpbi10b3A6IDI0cHg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuXCJdKSkpO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDI7XG52YXIgTmF2aWdhdGlvbiA9IHN0eWxlZC5uYXYoX3RlbXBsYXRlT2JqZWN0JDIgfHwgKF90ZW1wbGF0ZU9iamVjdCQyID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIGNvdW50ZXItcmVzZXQ6IGRvdDtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBmbGV4LXdyYXA6IHdyYXA7XFxuXCJdKSkpO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDE7XG52YXIgRG90ID0gc3R5bGVkLmJ1dHRvbihfdGVtcGxhdGVPYmplY3QkMSB8fCAoX3RlbXBsYXRlT2JqZWN0JDEgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgY291bnRlci1pbmNyZW1lbnQ6IGRvdDtcXG4gIHdpZHRoOiA4cHg7XFxuICBoZWlnaHQ6IDhweDtcXG4gIGJvcmRlcjogXCIsIFwiO1xcblxcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcXG4gIHBhZGRpbmc6IDA7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG1hcmdpbjogNHB4O1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzLCB0cmFuc2Zvcm0gMC4zcztcXG4gIGN1cnNvcjogXCIsIFwiO1xcbiAgdHJhbnNmb3JtOiBzY2FsZShcIiwgXCIpO1xcblxcbiAgY29sb3I6IFwiLCBcIjtcXG4gIGJhY2tncm91bmQ6IFwiLCBcIjtcXG5cXG4gIGNvbG9yOiBcIiwgXCI7XFxuICBiYWNrZ3JvdW5kOiBcIiwgXCI7XFxuXFxuICAmOmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGNvdW50ZXIoZG90KTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IGNhbGMoMTAwJSArIDAuMjVlbSk7XFxuICAgIGxlZnQ6IDUwJTtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMWVtKTtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgZGlzcGxheTogXCIsIFwiO1xcbiAgfVxcblxcbiAgJjpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcXG5cXG4gICAgJjpiZWZvcmUge1xcbiAgICAgIG9wYWNpdHk6IDAuNTtcXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtMnB4KTtcXG4gICAgfVxcbiAgfVxcblwiXSkpLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmN1cnJlbnQgPT09IHByb3BzLmluZGV4ID8gJzAnIDogJzFweCBzb2xpZCAjY2FjY2NlJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuZGlzYWJsZWQgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5jdXJyZW50ID09PSBwcm9wcy5pbmRleCA/IDEuMjUgOiAxO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5jdXJyZW50ID09PSBwcm9wcy5pbmRleCA/ICd2YXIoLS1yZWFjdG91ci1hY2NlbnQpJyA6ICcjY2FjY2NlJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuY3VycmVudCA9PT0gcHJvcHMuaW5kZXggPyAndmFyKC0tcmVhY3RvdXItYWNjZW50KScgOiAnbm9uZSc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmN1cnJlbnQgPT09IHByb3BzLmluZGV4ID8gcHJvcHMuYWNjZW50Q29sb3IgOiAnI2NhY2NjZSc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmN1cnJlbnQgPT09IHByb3BzLmluZGV4ID8gcHJvcHMuYWNjZW50Q29sb3IgOiAnbm9uZSc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLnNob3dOdW1iZXIgPyAnYmxvY2snIDogJ25vbmUnO1xufSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3Q7XG52YXIgU3ZnTWFza1dyYXBwZXIgPSBzdHlsZWQuZGl2KF90ZW1wbGF0ZU9iamVjdCB8fCAoX3RlbXBsYXRlT2JqZWN0ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIG9wYWNpdHk6IFwiLCBcIjtcXG4gIGNvbG9yOiBcIiwgXCI7XFxuICB3aWR0aDogMTAwJTtcXG4gIGxlZnQ6IDA7XFxuICB0b3A6IDA7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBwb3NpdGlvbjogZml4ZWQ7XFxuICB6LWluZGV4OiA5OTk5OTtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcblwiXSkpLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuICFwcm9wcy5tYXNrQ2xhc3NOYW1lICYmIDAuNztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gIXByb3BzLm1hc2tDbGFzc05hbWUgJiYgJyMwMDAnO1xufSk7XG5mdW5jdGlvbiBTdmdNYXNrKF9yZWYpIHtcbiAgdmFyIHdpbmRvd1dpZHRoID0gX3JlZi53aW5kb3dXaWR0aCxcbiAgICB3aW5kb3dIZWlnaHQgPSBfcmVmLndpbmRvd0hlaWdodCxcbiAgICB0YXJnZXRXaWR0aCA9IF9yZWYudGFyZ2V0V2lkdGgsXG4gICAgdGFyZ2V0SGVpZ2h0ID0gX3JlZi50YXJnZXRIZWlnaHQsXG4gICAgdGFyZ2V0VG9wID0gX3JlZi50YXJnZXRUb3AsXG4gICAgdGFyZ2V0TGVmdCA9IF9yZWYudGFyZ2V0TGVmdCxcbiAgICBwYWRkaW5nID0gX3JlZi5wYWRkaW5nLFxuICAgIHJvdW5kZWQgPSBfcmVmLnJvdW5kZWQsXG4gICAgcm91bmRlZFN0ZXAgPSBfcmVmLnJvdW5kZWRTdGVwLFxuICAgIGRpc2FibGVJbnRlcmFjdGlvbiA9IF9yZWYuZGlzYWJsZUludGVyYWN0aW9uLFxuICAgIGRpc2FibGVJbnRlcmFjdGlvbkNsYXNzTmFtZSA9IF9yZWYuZGlzYWJsZUludGVyYWN0aW9uQ2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2ssXG4gICAgaGlnaGxpZ2h0ZWRCb3JkZXIgPSBfcmVmLmhpZ2hsaWdodGVkQm9yZGVyO1xuICB2YXIgd2lkdGggPSBzYWZlKHRhcmdldFdpZHRoICsgcGFkZGluZyAqIDIpO1xuICB2YXIgaGVpZ2h0ID0gc2FmZSh0YXJnZXRIZWlnaHQgKyBwYWRkaW5nICogMik7XG4gIHZhciB0b3AgPSBzYWZlKHRhcmdldFRvcCAtIHBhZGRpbmcpO1xuICB2YXIgbGVmdCA9IHNhZmUodGFyZ2V0TGVmdCAtIHBhZGRpbmcpO1xuICB2YXIgcm91bmRlZFJhZGl1cyA9IHJvdW5kZWRTdGVwID8gTWF0aC5taW4od2lkdGggLyAyLCBoZWlnaHQgLyAyKSA6IHJvdW5kZWQ7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdmdNYXNrV3JhcHBlciwge1xuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgbWFza0NsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB3aWR0aDogd2luZG93V2lkdGgsXG4gICAgaGVpZ2h0OiB3aW5kb3dIZWlnaHQsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJtYXNrXCIsIHtcbiAgICBpZDogXCJtYXNrLW1haW5cIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3aWR0aDogd2luZG93V2lkdGgsXG4gICAgaGVpZ2h0OiB3aW5kb3dIZWlnaHQsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IGxlZnQsXG4gICAgeTogdG9wLFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBmaWxsOiBcImJsYWNrXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogbGVmdCAtIDEsXG4gICAgeTogdG9wIC0gMSxcbiAgICB3aWR0aDogcm91bmRlZFJhZGl1cyxcbiAgICBoZWlnaHQ6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IGxlZnQgKyByb3VuZGVkUmFkaXVzLFxuICAgIGN5OiB0b3AgKyByb3VuZGVkUmFkaXVzLFxuICAgIHI6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJibGFja1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IGxlZnQgKyB3aWR0aCAtIHJvdW5kZWRSYWRpdXMgKyAxLFxuICAgIHk6IHRvcCAtIDEsXG4gICAgd2lkdGg6IHJvdW5kZWRSYWRpdXMsXG4gICAgaGVpZ2h0OiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiBsZWZ0ICsgd2lkdGggLSByb3VuZGVkUmFkaXVzLFxuICAgIGN5OiB0b3AgKyByb3VuZGVkUmFkaXVzLFxuICAgIHI6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJibGFja1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IGxlZnQgLSAxLFxuICAgIHk6IHRvcCArIGhlaWdodCAtIHJvdW5kZWRSYWRpdXMgKyAxLFxuICAgIHdpZHRoOiByb3VuZGVkUmFkaXVzLFxuICAgIGhlaWdodDogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogbGVmdCArIHJvdW5kZWRSYWRpdXMsXG4gICAgY3k6IHRvcCArIGhlaWdodCAtIHJvdW5kZWRSYWRpdXMsXG4gICAgcjogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcImJsYWNrXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogbGVmdCArIHdpZHRoIC0gcm91bmRlZFJhZGl1cyArIDEsXG4gICAgeTogdG9wICsgaGVpZ2h0IC0gcm91bmRlZFJhZGl1cyArIDEsXG4gICAgd2lkdGg6IHJvdW5kZWRSYWRpdXMsXG4gICAgaGVpZ2h0OiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiBsZWZ0ICsgd2lkdGggLSByb3VuZGVkUmFkaXVzLFxuICAgIGN5OiB0b3AgKyBoZWlnaHQgLSByb3VuZGVkUmFkaXVzLFxuICAgIHI6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJibGFjayBcIlxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2xpcFBhdGhcIiwge1xuICAgIGlkOiBcImNsaXAtcGF0aFwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHRvcFxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiAwLFxuICAgIHk6IHRvcCxcbiAgICB3aWR0aDogbGVmdCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiB0YXJnZXRMZWZ0ICsgdGFyZ2V0V2lkdGggKyBwYWRkaW5nLFxuICAgIHk6IHRvcCxcbiAgICB3aWR0aDogc2FmZSh3aW5kb3dXaWR0aCAtIHRhcmdldFdpZHRoIC0gbGVmdCksXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMCxcbiAgICB5OiB0YXJnZXRUb3AgKyB0YXJnZXRIZWlnaHQgKyBwYWRkaW5nLFxuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHNhZmUod2luZG93SGVpZ2h0IC0gdGFyZ2V0SGVpZ2h0IC0gdG9wKVxuICB9KSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3aWR0aDogd2luZG93V2lkdGgsXG4gICAgaGVpZ2h0OiB3aW5kb3dIZWlnaHQsXG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIixcbiAgICBtYXNrOiBcInVybCgjbWFzay1tYWluKVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3aWR0aDogd2luZG93V2lkdGgsXG4gICAgaGVpZ2h0OiB3aW5kb3dIZWlnaHQsXG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIixcbiAgICBjbGlwUGF0aDogXCJ1cmwoI2NsaXAtcGF0aClcIixcbiAgICBwb2ludGVyRXZlbnRzOiBcImF1dG9cIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiBsZWZ0LFxuICAgIHk6IHRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgcG9pbnRlckV2ZW50czogXCJhdXRvXCIsXG4gICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiLFxuICAgIGRpc3BsYXk6IGRpc2FibGVJbnRlcmFjdGlvbiA/ICdibG9jaycgOiAnbm9uZScsXG4gICAgY2xhc3NOYW1lOiBkaXNhYmxlSW50ZXJhY3Rpb25DbGFzc05hbWVcbiAgfSksIGhpZ2hsaWdodGVkQm9yZGVyICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogc2FmZShsZWZ0ICsgaGlnaGxpZ2h0ZWRCb3JkZXIud2lkdGggLyAyLjApLFxuICAgIHk6IHNhZmUodG9wICsgaGlnaGxpZ2h0ZWRCb3JkZXIud2lkdGggLyAyLjApLFxuICAgIHdpZHRoOiBzYWZlKHdpZHRoIC0gaGlnaGxpZ2h0ZWRCb3JkZXIud2lkdGgpLFxuICAgIGhlaWdodDogc2FmZShoZWlnaHQgLSBoaWdobGlnaHRlZEJvcmRlci53aWR0aCksXG4gICAgcG9pbnRlckV2ZW50czogXCJhdXRvXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgc3Ryb2tlV2lkdGg6IGhpZ2hsaWdodGVkQm9yZGVyLndpZHRoLFxuICAgIHN0cm9rZTogaGlnaGxpZ2h0ZWRCb3JkZXIuY29sb3IsXG4gICAgcng6IHJvdW5kZWRSYWRpdXMgLSAyXG4gIH0pKSk7XG59XG5TdmdNYXNrLnByb3BUeXBlcyA9IHtcbiAgd2luZG93V2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgd2luZG93SGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHRhcmdldFdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHRhcmdldEhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB0YXJnZXRUb3A6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdGFyZ2V0TGVmdDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBwYWRkaW5nOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHJvdW5kZWQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcm91bmRlZFN0ZXA6IFByb3BUeXBlcy5ib29sLFxuICBkaXNhYmxlSW50ZXJhY3Rpb246IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGRpc2FibGVJbnRlcmFjdGlvbkNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBoaWdobGlnaHRlZEJvcmRlcjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBjb2xvcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWRcbiAgfSlcbn07XG5cbnZhciBSZWFjdG91clJlc2l6ZU9ic2VydmVyID0gKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBzdGVwID0gX3JlZi5zdGVwLFxuICAgIHJlZnJlc2ggPSBfcmVmLnJlZnJlc2g7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSgwKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBtdXRhdGlvbnNDb3VudGVyID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRNdXRhdGlvbnNDb3VudGVyID0gX3VzZVN0YXRlMlsxXTtcblxuICAvLyBvbmx5IHVzZSB0byBub3RpZnkgbWFpbiBsb2dpYyBiZWxvd1xuICAvLyB0aGF0IGEgcmVzaXplT2JzZXJ2YWJsZSBoYXMgYmVlbiBhZGRlZCB0byBET00gKG9yIHJlbW92ZWQgZnJvbSBpdClcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN0ZXAucmVzaXplT2JzZXJ2YWJsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGluY3JlbWVudE11dGF0aW9uc0NvdW50ZXJJZk9ic2VydmFibGUgPSBmdW5jdGlvbiBpbmNyZW1lbnRNdXRhdGlvbnNDb3VudGVySWZPYnNlcnZhYmxlKG5vZGVzKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobm9kZXMpLFxuICAgICAgICBfc3RlcDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgICAgIHZhciBub2RlID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgaWYgKCFub2RlLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiAxOyAvLyBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZm91bmQgPSBzdGVwLnJlc2l6ZU9ic2VydmFibGVzLmZpbmQoZnVuY3Rpb24gKG9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLm1hdGNoZXMob2JzZXJ2YWJsZSkgfHwgbm9kZS5xdWVyeVNlbGVjdG9yKG9ic2VydmFibGUpICE9IG51bGw7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICBzZXRNdXRhdGlvbnNDb3VudGVyKG11dGF0aW9uc0NvdW50ZXIgKyAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgaWYgKF9sb29wKCkpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnNMaXN0KSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG11dGF0aW9uc0xpc3QpLFxuICAgICAgICBfc3RlcDI7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBtdXRhdGlvbiA9IF9zdGVwMi52YWx1ZTtcbiAgICAgICAgICBpZiAoMCAhPT0gbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGluY3JlbWVudE11dGF0aW9uc0NvdW50ZXJJZk9ic2VydmFibGUobXV0YXRpb24uYWRkZWROb2Rlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgwICE9PSBtdXRhdGlvbi5yZW1vdmVkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpbmNyZW1lbnRNdXRhdGlvbnNDb3VudGVySWZPYnNlcnZhYmxlKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IyLmYoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgb2JzZXJ2YWJsZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5O1xuICAgIHZhciBjb25maWcgPSB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgfTtcbiAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUob2JzZXJ2YWJsZSwgY29uZmlnKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfSwgW3N0ZXAsIG11dGF0aW9uc0NvdW50ZXJdKTtcblxuICAvLyB0aGUgbWFpbiBsb2dpYyBpcyBoZXJlXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzdGVwLnJlc2l6ZU9ic2VydmFibGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykge1xuICAgICAgcmVmcmVzaCgpO1xuICAgIH0pO1xuICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc3RlcC5yZXNpemVPYnNlcnZhYmxlcyksXG4gICAgICBfc3RlcDM7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBvYnNlcnZhYmxlID0gX3N0ZXAzLnZhbHVlO1xuICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob2JzZXJ2YWJsZSk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2l0ZXJhdG9yMy5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvcjMuZigpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH0sIFtzdGVwLCBtdXRhdGlvbnNDb3VudGVyXSk7XG4gIHJldHVybiBudWxsO1xufSk7XG5cbnZhciBSZWFjdG91ck11dGF0aW9uT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyIHN0ZXAgPSBfcmVmLnN0ZXAsXG4gICAgcmVmcmVzaCA9IF9yZWYucmVmcmVzaDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN0ZXAubXV0YXRpb25PYnNlcnZhYmxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcmVmcmVzaEhpZ2hsaWdodGVkUmVnaW9uSWZPYnNlcnZhYmxlID0gZnVuY3Rpb24gcmVmcmVzaEhpZ2hsaWdodGVkUmVnaW9uSWZPYnNlcnZhYmxlKG5vZGVzKSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobm9kZXMpLFxuICAgICAgICBfc3RlcDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgICAgIHZhciBub2RlID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgaWYgKCFub2RlLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiAxOyAvLyBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZm91bmQgPSBzdGVwLm11dGF0aW9uT2JzZXJ2YWJsZXMuZmluZChmdW5jdGlvbiAob2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWF0Y2hlcyhvYnNlcnZhYmxlKSB8fCBub2RlLnF1ZXJ5U2VsZWN0b3Iob2JzZXJ2YWJsZSkgIT0gbnVsbDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIHJlZnJlc2goKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgaWYgKF9sb29wKCkpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnNMaXN0KSB7XG4gICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG11dGF0aW9uc0xpc3QpLFxuICAgICAgICBfc3RlcDI7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBtdXRhdGlvbiA9IF9zdGVwMi52YWx1ZTtcbiAgICAgICAgICBpZiAoMCAhPT0gbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlZnJlc2hIaWdobGlnaHRlZFJlZ2lvbklmT2JzZXJ2YWJsZShtdXRhdGlvbi5hZGRlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDAgIT09IG11dGF0aW9uLnJlbW92ZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlZnJlc2hIaWdobGlnaHRlZFJlZ2lvbklmT2JzZXJ2YWJsZShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIG9ic2VydmFibGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTtcbiAgICB2YXIgY29uZmlnID0ge1xuICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZVxuICAgIH07XG4gICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG9ic2VydmFibGUsIGNvbmZpZyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH0sIFtzdGVwXSk7XG4gIHJldHVybiBudWxsO1xufSk7XG5cbmZ1bmN0aW9uIFBvcnRhbChfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHZhciByZWYgPSB1c2VSZWYobnVsbCk7XG4gIGlmIChyZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHJlZi5jdXJyZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcmVmLmN1cnJlbnQuc2V0QXR0cmlidXRlKCdpZCcsICdfX19yZWFjdG91cicpO1xuICB9XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyZWYuY3VycmVudCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtyZWZdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHJlZi5jdXJyZW50KTtcbn1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgZGlzYWJsZUZvY3VzTG9jazogUHJvcFR5cGVzLmJvb2wsXG4gIGJhZGdlQ29udGVudDogUHJvcFR5cGVzLmZ1bmMsXG4gIGhpZ2hsaWdodGVkTWFza0NsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ub2RlLCBQcm9wVHlwZXMuZWxlbWVudF0pLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsb3NlQnV0dG9uQXJpYUxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjbG9zZVdpdGhNYXNrOiBQcm9wVHlwZXMuYm9vbCxcbiAgaW5WaWV3VGhyZXNob2xkOiBQcm9wVHlwZXMubnVtYmVyLFxuICBpc09wZW46IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGxhc3RTdGVwTmV4dEJ1dHRvbjogUHJvcFR5cGVzLm5vZGUsXG4gIG1hc2tDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIG1hc2tTcGFjZTogUHJvcFR5cGVzLm51bWJlcixcbiAgbmV4dEJ1dHRvbjogUHJvcFR5cGVzLm5vZGUsXG4gIG9uQWZ0ZXJPcGVuOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25CZWZvcmVDbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uUmVxdWVzdENsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgcHJldkJ1dHRvbjogUHJvcFR5cGVzLm5vZGUsXG4gIHNjcm9sbER1cmF0aW9uOiBQcm9wVHlwZXMubnVtYmVyLFxuICBzY3JvbGxPZmZzZXQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIHNob3dCdXR0b25zOiBQcm9wVHlwZXMuYm9vbCxcbiAgc2hvd0Nsb3NlQnV0dG9uOiBQcm9wVHlwZXMuYm9vbCxcbiAgc2hvd05hdmlnYXRpb246IFByb3BUeXBlcy5ib29sLFxuICBzaG93TmF2aWdhdGlvbk51bWJlcjogUHJvcFR5cGVzLmJvb2wsXG4gIHNob3dOdW1iZXI6IFByb3BUeXBlcy5ib29sLFxuICBzdGFydEF0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBnb1RvU3RlcDogUHJvcFR5cGVzLm51bWJlcixcbiAgZ2V0Q3VycmVudFN0ZXA6IFByb3BUeXBlcy5mdW5jLFxuICBuZXh0U3RlcDogUHJvcFR5cGVzLmZ1bmMsXG4gIHByZXZTdGVwOiBQcm9wVHlwZXMuZnVuYyxcbiAgc3RlcHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZSh7XG4gICAgc2VsZWN0b3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY29udGVudDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm5vZGUsIFByb3BUeXBlcy5lbGVtZW50LCBQcm9wVHlwZXMuZnVuY10pLmlzUmVxdWlyZWQsXG4gICAgcG9zaXRpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLCBQcm9wVHlwZXMub25lT2YoWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnLCAnY2VudGVyJ10pXSksXG4gICAgYWN0aW9uOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBzdGVwSW50ZXJhY3Rpb246IFByb3BUeXBlcy5ib29sLFxuICAgIG5hdkRvdEFyaWFMYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICByb3VuZGVkU3RlcDogUHJvcFR5cGVzLmJvb2xcbiAgfSkpLFxuICB1cGRhdGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHVwZGF0ZURlbGF5OiBQcm9wVHlwZXMubnVtYmVyLFxuICBkaXNhYmxlSW50ZXJhY3Rpb246IFByb3BUeXBlcy5ib29sLFxuICBkaXNhYmxlRG90c05hdmlnYXRpb246IFByb3BUeXBlcy5ib29sLFxuICBkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2YoWydlc2MnLCAncmlnaHQnLCAnbGVmdCddKSksIFByb3BUeXBlcy5ib29sXSksXG4gIHJvdW5kZWQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIGFjY2VudENvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBoaWdobGlnaHRlZEJvcmRlcjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBjb2xvcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWRcbiAgfSlcbn07XG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBkaXNhYmxlRm9jdXNMb2NrOiBmYWxzZSxcbiAgc2hvd05hdmlnYXRpb246IHRydWUsXG4gIHNob3dOYXZpZ2F0aW9uTnVtYmVyOiB0cnVlLFxuICBzaG93QnV0dG9uczogdHJ1ZSxcbiAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICBjbG9zZUJ1dHRvbkFyaWFMYWJlbDogJ0Nsb3NlJyxcbiAgc2hvd051bWJlcjogdHJ1ZSxcbiAgc2Nyb2xsRHVyYXRpb246IDEsXG4gIG1hc2tTcGFjZTogMTAsXG4gIHVwZGF0ZURlbGF5OiAxLFxuICBkaXNhYmxlSW50ZXJhY3Rpb246IGZhbHNlLFxuICByb3VuZGVkOiAwLFxuICBhY2NlbnRDb2xvcjogJyMwMDdhZmYnLFxuICBjbG9zZVdpdGhNYXNrOiB0cnVlXG59O1xuXG52YXIgQ04gPSB7XG4gIG1hc2s6IHtcbiAgICBiYXNlOiAncmVhY3RvdXJfX21hc2snLFxuICAgIGlzT3BlbjogJ3JlYWN0b3VyX19tYXNrLS1pcy1vcGVuJyxcbiAgICBkaXNhYmxlSW50ZXJhY3Rpb246ICdyZWFjdG91cl9fbWFzay0tZGlzYWJsZS1pbnRlcmFjdGlvbidcbiAgfSxcbiAgaGVscGVyOiB7XG4gICAgYmFzZTogJ3JlYWN0b3VyX19oZWxwZXInLFxuICAgIGlzT3BlbjogJ3JlYWN0b3VyX19oZWxwZXItLWlzLW9wZW4nXG4gIH0sXG4gIGRvdDoge1xuICAgIGJhc2U6ICdyZWFjdG91cl9fZG90JyxcbiAgICBhY3RpdmU6ICdyZWFjdG91cl9fZG90LS1pcy1hY3RpdmUnXG4gIH1cbn07XG5cbnZhciBUb3VyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIFRvdXIoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb3VyKTtcbiAgICBfdGhpcyA9IF9jYWxsU3VwZXIodGhpcywgVG91cik7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcInVubG9ja0ZvY3VzXCIsIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmb2N1c1VubG9ja2VkOiB0cnVlXG4gICAgICB9LCBjYWxsYmFjaygpKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwic2hvd1N0ZXBcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5oZWxwZXIgfHwgIV90aGlzLmhlbHBlci5jdXJyZW50KSByZXR1cm47XG4gICAgICB2YXIgc3RlcHMgPSBfdGhpcy5wcm9wcy5zdGVwcztcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IF90aGlzLnN0YXRlLFxuICAgICAgICBjdXJyZW50ID0gX3RoaXMkc3RhdGUuY3VycmVudCxcbiAgICAgICAgZm9jdXNVbmxvY2tlZCA9IF90aGlzJHN0YXRlLmZvY3VzVW5sb2NrZWQ7XG4gICAgICBpZiAoZm9jdXNVbmxvY2tlZCkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZm9jdXNVbmxvY2tlZDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgc3RlcCA9IHN0ZXBzW2N1cnJlbnRdO1xuICAgICAgdmFyIG5vZGUgPSBzdGVwLnNlbGVjdG9yID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzdGVwLnNlbGVjdG9yKSA6IG51bGw7XG4gICAgICB2YXIgc3RlcENhbGxiYWNrID0gZnVuY3Rpb24gc3RlcENhbGxiYWNrKG8pIHtcbiAgICAgICAgaWYgKHN0ZXAuYWN0aW9uICYmIHR5cGVvZiBzdGVwLmFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIF90aGlzLnVubG9ja0ZvY3VzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwLmFjdGlvbihvKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChzdGVwLm9ic2VydmUpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc3RlcC5vYnNlcnZlKTtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICBpZiAocHJldlN0YXRlLm9ic2VydmVyKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcHJldlN0YXRlLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXI6IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnMpIHtcbiAgICAgICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG11dGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdmFyIGNiID0gZnVuY3Rpb24gY2IoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGVwQ2FsbGJhY2sobXV0YXRpb24uYWRkZWROb2Rlc1swXSk7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5jYWxjdWxhdGVOb2RlKG11dGF0aW9uLmFkZGVkTm9kZXNbMF0sIHN0ZXAsIGNiKTtcbiAgICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0JyAmJiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdmFyIF9jYiA9IGZ1bmN0aW9uIF9jYigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXBDYWxsYmFjayhub2RlKTtcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBfdGhpcy5jYWxjdWxhdGVOb2RlKG5vZGUsIHN0ZXAsIF9jYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5zdGF0ZS5vYnNlcnZlci5vYnNlcnZlKHRhcmdldCwgY29uZmlnKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoX3RoaXMuc3RhdGUub2JzZXJ2ZXIpIHtcbiAgICAgICAgICBfdGhpcy5zdGF0ZS5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgb2JzZXJ2ZXI6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgdmFyIGNiID0gZnVuY3Rpb24gY2IoKSB7XG4gICAgICAgICAgcmV0dXJuIHN0ZXBDYWxsYmFjayhub2RlKTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuY2FsY3VsYXRlTm9kZShub2RlLCBzdGVwLCBjYik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZShzZXROb2RlU3RhdGUobnVsbCwgc3RlcCwgX3RoaXMuaGVscGVyLmN1cnJlbnQpLCBzdGVwQ2FsbGJhY2spO1xuICAgICAgICBzdGVwLnNlbGVjdG9yICYmIGNvbnNvbGUud2FybihcIkRvZXNuJ3QgZmluZCBhIERPTSBub2RlICdcIi5jb25jYXQoc3RlcC5zZWxlY3RvciwgXCInLiBQbGVhc2UgY2hlY2sgdGhlICdzdGVwcycgVG91ciBwcm9wIEFycmF5IGF0IHBvc2l0aW9uIFwiKS5jb25jYXQoY3VycmVudCwgXCIuXCIpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiY2FsY3VsYXRlTm9kZVwiLCBmdW5jdGlvbiAobm9kZSwgc3RlcCwgY2IpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICBzY3JvbGxEdXJhdGlvbiA9IF90aGlzJHByb3BzLnNjcm9sbER1cmF0aW9uLFxuICAgICAgICBpblZpZXdUaHJlc2hvbGQgPSBfdGhpcyRwcm9wcy5pblZpZXdUaHJlc2hvbGQsXG4gICAgICAgIHNjcm9sbE9mZnNldCA9IF90aGlzJHByb3BzLnNjcm9sbE9mZnNldDtcbiAgICAgIHZhciBhdHRycyA9IGdldEhpZ2hsaWdodGVkUmVjdChub2RlLCBzdGVwKTtcbiAgICAgIHZhciB3ID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgICAgIHZhciBoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuICAgICAgaWYgKCFpblZpZXcoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGF0dHJzKSwge30sIHtcbiAgICAgICAgdzogdyxcbiAgICAgICAgaDogaCxcbiAgICAgICAgdGhyZXNob2xkOiBpblZpZXdUaHJlc2hvbGRcbiAgICAgIH0pKSkge1xuICAgICAgICB2YXIgcGFyZW50U2Nyb2xsID0gU2Nyb2xscGFyZW50KG5vZGUpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gc2Nyb2xsT2Zmc2V0ID8gc2Nyb2xsT2Zmc2V0IDogYXR0cnMuaGVpZ2h0ID4gaCA/IC0yNSA6IC0oaCAvIDIpICsgYXR0cnMuaGVpZ2h0IC8gMjtcbiAgICAgICAgc2Nyb2xsU21vb3RoLnRvKG5vZGUsIHtcbiAgICAgICAgICBjb250ZXh0OiBpc0JvZHkocGFyZW50U2Nyb2xsKSA/IHdpbmRvdyA6IHBhcmVudFNjcm9sbCxcbiAgICAgICAgICBkdXJhdGlvbjogc2Nyb2xsRHVyYXRpb24sXG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG5kKSB7XG4gICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZShzZXROb2RlU3RhdGUobmQsIHN0ZXAsIF90aGlzLmhlbHBlci5jdXJyZW50KSwgY2IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZShzZXROb2RlU3RhdGUobm9kZSwgc3RlcCwgX3RoaXMuaGVscGVyLmN1cnJlbnQpLCBjYik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcInJlY2FsY3VsYXRlTm9kZVwiLCBmdW5jdGlvbiAoc3RlcCkge1xuICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHN0ZXAuc2VsZWN0b3IpO1xuICAgICAgdmFyIHN0ZXBDYWxsYmFjayA9IGZ1bmN0aW9uIHN0ZXBDYWxsYmFjayhvKSB7XG4gICAgICAgIGlmIChzdGVwLmFjdGlvbiAmJiB0eXBlb2Ygc3RlcC5hY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBfdGhpcy51bmxvY2tGb2N1cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcC5hY3Rpb24obyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBfdGhpcy5jYWxjdWxhdGVOb2RlKG5vZGUsIHN0ZXAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHN0ZXBDYWxsYmFjayhub2RlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJtYXNrQ2xpY2tIYW5kbGVyXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgIGNsb3NlV2l0aE1hc2sgPSBfdGhpcyRwcm9wczIuY2xvc2VXaXRoTWFzayxcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2UgPSBfdGhpcyRwcm9wczIub25SZXF1ZXN0Q2xvc2U7XG4gICAgICBpZiAoY2xvc2VXaXRoTWFzayAmJiAhZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKENOLm1hc2suZGlzYWJsZUludGVyYWN0aW9uKSkge1xuICAgICAgICBvblJlcXVlc3RDbG9zZShlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwibmV4dFN0ZXBcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICBzdGVwcyA9IF90aGlzJHByb3BzMy5zdGVwcyxcbiAgICAgICAgZ2V0Q3VycmVudFN0ZXAgPSBfdGhpcyRwcm9wczMuZ2V0Q3VycmVudFN0ZXA7XG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBuZXh0U3RlcCA9IHByZXZTdGF0ZS5jdXJyZW50IDwgc3RlcHMubGVuZ3RoIC0gMSA/IHByZXZTdGF0ZS5jdXJyZW50ICsgMSA6IHByZXZTdGF0ZS5jdXJyZW50O1xuICAgICAgICBpZiAodHlwZW9mIGdldEN1cnJlbnRTdGVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2V0Q3VycmVudFN0ZXAobmV4dFN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY3VycmVudDogbmV4dFN0ZXBcbiAgICAgICAgfTtcbiAgICAgIH0sIF90aGlzLnNob3dTdGVwKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwicHJldlN0ZXBcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGdldEN1cnJlbnRTdGVwID0gX3RoaXMucHJvcHMuZ2V0Q3VycmVudFN0ZXA7XG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBuZXh0U3RlcCA9IHByZXZTdGF0ZS5jdXJyZW50ID4gMCA/IHByZXZTdGF0ZS5jdXJyZW50IC0gMSA6IHByZXZTdGF0ZS5jdXJyZW50O1xuICAgICAgICBpZiAodHlwZW9mIGdldEN1cnJlbnRTdGVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2V0Q3VycmVudFN0ZXAobmV4dFN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY3VycmVudDogbmV4dFN0ZXBcbiAgICAgICAgfTtcbiAgICAgIH0sIF90aGlzLnNob3dTdGVwKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiZ290b1N0ZXBcIiwgZnVuY3Rpb24gKG4pIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgc3RlcHMgPSBfdGhpcyRwcm9wczQuc3RlcHMsXG4gICAgICAgIGdldEN1cnJlbnRTdGVwID0gX3RoaXMkcHJvcHM0LmdldEN1cnJlbnRTdGVwO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICB2YXIgbmV4dFN0ZXAgPSBzdGVwc1tuXSA/IG4gOiBwcmV2U3RhdGUuY3VycmVudDtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRDdXJyZW50U3RlcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGdldEN1cnJlbnRTdGVwKG5leHRTdGVwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGN1cnJlbnQ6IG5leHRTdGVwXG4gICAgICAgIH07XG4gICAgICB9LCBfdGhpcy5zaG93U3RlcCk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcImtleURvd25IYW5kbGVyXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG9uUmVxdWVzdENsb3NlID0gX3RoaXMkcHJvcHM1Lm9uUmVxdWVzdENsb3NlLFxuICAgICAgICBuZXh0U3RlcCA9IF90aGlzJHByb3BzNS5uZXh0U3RlcCxcbiAgICAgICAgcHJldlN0ZXAgPSBfdGhpcyRwcm9wczUucHJldlN0ZXAsXG4gICAgICAgIGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb24gPSBfdGhpcyRwcm9wczUuZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbjtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaXNFc2NEaXNhYmxlZCwgaXNSaWdodERpc2FibGVkLCBpc0xlZnREaXNhYmxlZDtcbiAgICAgIGlmIChkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uKSB7XG4gICAgICAgIGlzRXNjRGlzYWJsZWQgPSBkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uLmluY2x1ZGVzKCdlc2MnKTtcbiAgICAgICAgaXNSaWdodERpc2FibGVkID0gZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbi5pbmNsdWRlcygncmlnaHQnKTtcbiAgICAgICAgaXNMZWZ0RGlzYWJsZWQgPSBkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uLmluY2x1ZGVzKCdsZWZ0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSAyNyAmJiAhaXNFc2NEaXNhYmxlZCkge1xuICAgICAgICAvLyBlc2NcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvblJlcXVlc3RDbG9zZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzkgJiYgIWlzUmlnaHREaXNhYmxlZCkge1xuICAgICAgICAvLyByaWdodFxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHR5cGVvZiBuZXh0U3RlcCA9PT0gJ2Z1bmN0aW9uJyA/IG5leHRTdGVwKCkgOiBfdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgfVxuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMzcgJiYgIWlzTGVmdERpc2FibGVkKSB7XG4gICAgICAgIC8vIGxlZnRcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0eXBlb2YgcHJldlN0ZXAgPT09ICdmdW5jdGlvbicgPyBwcmV2U3RlcCgpIDogX3RoaXMucHJldlN0ZXAoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzT3BlbjogZmFsc2UsXG4gICAgICBjdXJyZW50OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDAsXG4gICAgICB3OiAwLFxuICAgICAgaDogMCxcbiAgICAgIGluRE9NOiBmYWxzZSxcbiAgICAgIG9ic2VydmVyOiBudWxsLFxuICAgICAgZm9jdXNVbmxvY2tlZDogZmFsc2VcbiAgICB9O1xuICAgIF90aGlzLmhlbHBlciA9IC8qI19fUFVSRV9fKi9jcmVhdGVSZWYoKTtcbiAgICBfdGhpcy5oZWxwZXJFbGVtZW50ID0gbnVsbDtcbiAgICBfdGhpcy5kZWJvdW5jZWRTaG93U3RlcCA9IGRlYm91bmNlKF90aGlzLnNob3dTdGVwLCA3MCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIF9pbmhlcml0cyhUb3VyLCBfQ29tcG9uZW50KTtcbiAgcmV0dXJuIF9jcmVhdGVDbGFzcyhUb3VyLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczYgPSB0aGlzLnByb3BzLFxuICAgICAgICBpc09wZW4gPSBfdGhpcyRwcm9wczYuaXNPcGVuLFxuICAgICAgICBzdGFydEF0ID0gX3RoaXMkcHJvcHM2LnN0YXJ0QXQ7XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIHRoaXMub3BlbihzdGFydEF0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM3ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgaXNPcGVuID0gX3RoaXMkcHJvcHM3LmlzT3BlbixcbiAgICAgICAgdXBkYXRlID0gX3RoaXMkcHJvcHM3LnVwZGF0ZSxcbiAgICAgICAgdXBkYXRlRGVsYXkgPSBfdGhpcyRwcm9wczcudXBkYXRlRGVsYXk7XG4gICAgICBpZiAoIWlzT3BlbiAmJiBuZXh0UHJvcHMuaXNPcGVuKSB7XG4gICAgICAgIHRoaXMub3BlbihuZXh0UHJvcHMuc3RhcnRBdCk7XG4gICAgICB9IGVsc2UgaWYgKGlzT3BlbiAmJiAhbmV4dFByb3BzLmlzT3Blbikge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNPcGVuICYmIHVwZGF0ZSAhPT0gbmV4dFByb3BzLnVwZGF0ZSkge1xuICAgICAgICBpZiAobmV4dFByb3BzLnN0ZXBzW3RoaXMuc3RhdGUuY3VycmVudF0pIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMuc2hvd1N0ZXAsIHVwZGF0ZURlbGF5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uUmVxdWVzdENsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc09wZW4gJiYgbmV4dFByb3BzLmlzT3BlbiAmJiB0aGlzLnN0YXRlLmN1cnJlbnQgIT09IG5leHRQcm9wcy5nb1RvU3RlcCkge1xuICAgICAgICB0aGlzLmdvdG9TdGVwKG5leHRQcm9wcy5nb1RvU3RlcCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdmFyIGlzT3BlbiA9IHRoaXMucHJvcHMuaXNPcGVuO1xuICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGF0ZS5vYnNlcnZlcikge1xuICAgICAgICB0aGlzLnN0YXRlLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib3BlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHN0YXJ0QXQpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgdmFyIG9uQWZ0ZXJPcGVuID0gdGhpcy5wcm9wcy5vbkFmdGVyT3BlbjtcbiAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgICAgICBjdXJyZW50OiBzdGFydEF0ICE9PSB1bmRlZmluZWQgPyBzdGFydEF0IDogcHJldlN0YXRlLmN1cnJlbnRcbiAgICAgICAgfTtcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0VGltZW91dChfdGhpczIuc2hvd1N0ZXAsIDEpO1xuICAgICAgICBfdGhpczIuaGVscGVyRWxlbWVudCA9IF90aGlzMi5oZWxwZXIuY3VycmVudDtcbiAgICAgICAgaWYgKCFfdGhpczIucHJvcHMuZGlzYWJsZUZvY3VzTG9jaykgX3RoaXMyLmhlbHBlci5jdXJyZW50LmZvY3VzKCk7XG4gICAgICAgIGlmIChvbkFmdGVyT3Blbikge1xuICAgICAgICAgIG9uQWZ0ZXJPcGVuKF90aGlzMi5oZWxwZXJFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5kZWJvdW5jZWRTaG93U3RlcCwgZmFsc2UpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleURvd25IYW5kbGVyLCBmYWxzZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIGlmIChwcmV2U3RhdGUub2JzZXJ2ZXIpIHtcbiAgICAgICAgICBwcmV2U3RhdGUub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgICBvYnNlcnZlcjogbnVsbFxuICAgICAgICB9O1xuICAgICAgfSwgdGhpcy5vbkJlZm9yZUNsb3NlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmRlYm91bmNlZFNob3dTdGVwKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlEb3duSGFuZGxlcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uQmVmb3JlQ2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25CZWZvcmVDbG9zZSgpIHtcbiAgICAgIHZhciBvbkJlZm9yZUNsb3NlID0gdGhpcy5wcm9wcy5vbkJlZm9yZUNsb3NlO1xuICAgICAgaWYgKG9uQmVmb3JlQ2xvc2UpIHtcbiAgICAgICAgb25CZWZvcmVDbG9zZSh0aGlzLmhlbHBlckVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM4ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHM4LmNsYXNzTmFtZSxcbiAgICAgICAgc3RlcHMgPSBfdGhpcyRwcm9wczguc3RlcHMsXG4gICAgICAgIG1hc2tDbGFzc05hbWUgPSBfdGhpcyRwcm9wczgubWFza0NsYXNzTmFtZSxcbiAgICAgICAgc2hvd0J1dHRvbnMgPSBfdGhpcyRwcm9wczguc2hvd0J1dHRvbnMsXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbiA9IF90aGlzJHByb3BzOC5zaG93Q2xvc2VCdXR0b24sXG4gICAgICAgIGNsb3NlQnV0dG9uQXJpYUxhYmVsID0gX3RoaXMkcHJvcHM4LmNsb3NlQnV0dG9uQXJpYUxhYmVsLFxuICAgICAgICBzaG93TmF2aWdhdGlvbiA9IF90aGlzJHByb3BzOC5zaG93TmF2aWdhdGlvbixcbiAgICAgICAgc2hvd05hdmlnYXRpb25OdW1iZXIgPSBfdGhpcyRwcm9wczguc2hvd05hdmlnYXRpb25OdW1iZXIsXG4gICAgICAgIHNob3dOdW1iZXIgPSBfdGhpcyRwcm9wczguc2hvd051bWJlcixcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2UgPSBfdGhpcyRwcm9wczgub25SZXF1ZXN0Q2xvc2UsXG4gICAgICAgIG1hc2tTcGFjZSA9IF90aGlzJHByb3BzOC5tYXNrU3BhY2UsXG4gICAgICAgIGxhc3RTdGVwTmV4dEJ1dHRvbiA9IF90aGlzJHByb3BzOC5sYXN0U3RlcE5leHRCdXR0b24sXG4gICAgICAgIG5leHRCdXR0b24gPSBfdGhpcyRwcm9wczgubmV4dEJ1dHRvbixcbiAgICAgICAgcHJldkJ1dHRvbiA9IF90aGlzJHByb3BzOC5wcmV2QnV0dG9uLFxuICAgICAgICBiYWRnZUNvbnRlbnQgPSBfdGhpcyRwcm9wczguYmFkZ2VDb250ZW50LFxuICAgICAgICBoaWdobGlnaHRlZE1hc2tDbGFzc05hbWUgPSBfdGhpcyRwcm9wczguaGlnaGxpZ2h0ZWRNYXNrQ2xhc3NOYW1lLFxuICAgICAgICBkaXNhYmxlSW50ZXJhY3Rpb24gPSBfdGhpcyRwcm9wczguZGlzYWJsZUludGVyYWN0aW9uLFxuICAgICAgICBkaXNhYmxlRG90c05hdmlnYXRpb24gPSBfdGhpcyRwcm9wczguZGlzYWJsZURvdHNOYXZpZ2F0aW9uLFxuICAgICAgICBuZXh0U3RlcCA9IF90aGlzJHByb3BzOC5uZXh0U3RlcCxcbiAgICAgICAgcHJldlN0ZXAgPSBfdGhpcyRwcm9wczgucHJldlN0ZXAsXG4gICAgICAgIHJvdW5kZWQgPSBfdGhpcyRwcm9wczgucm91bmRlZCxcbiAgICAgICAgYWNjZW50Q29sb3IgPSBfdGhpcyRwcm9wczguYWNjZW50Q29sb3IsXG4gICAgICAgIEN1c3RvbUhlbHBlciA9IF90aGlzJHByb3BzOC5DdXN0b21IZWxwZXIsXG4gICAgICAgIGRpc2FibGVGb2N1c0xvY2sgPSBfdGhpcyRwcm9wczguZGlzYWJsZUZvY3VzTG9jayxcbiAgICAgICAgaGlnaGxpZ2h0ZWRCb3JkZXIgPSBfdGhpcyRwcm9wczguaGlnaGxpZ2h0ZWRCb3JkZXI7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUyID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgaXNPcGVuID0gX3RoaXMkc3RhdGUyLmlzT3BlbixcbiAgICAgICAgY3VycmVudCA9IF90aGlzJHN0YXRlMi5jdXJyZW50LFxuICAgICAgICBpbkRPTSA9IF90aGlzJHN0YXRlMi5pbkRPTSxcbiAgICAgICAgdGFyZ2V0VG9wID0gX3RoaXMkc3RhdGUyLnRvcCxcbiAgICAgICAgdGFyZ2V0UmlnaHQgPSBfdGhpcyRzdGF0ZTIucmlnaHQsXG4gICAgICAgIHRhcmdldEJvdHRvbSA9IF90aGlzJHN0YXRlMi5ib3R0b20sXG4gICAgICAgIHRhcmdldExlZnQgPSBfdGhpcyRzdGF0ZTIubGVmdCxcbiAgICAgICAgdGFyZ2V0V2lkdGggPSBfdGhpcyRzdGF0ZTIud2lkdGgsXG4gICAgICAgIHRhcmdldEhlaWdodCA9IF90aGlzJHN0YXRlMi5oZWlnaHQsXG4gICAgICAgIHdpbmRvd1dpZHRoID0gX3RoaXMkc3RhdGUyLncsXG4gICAgICAgIHdpbmRvd0hlaWdodCA9IF90aGlzJHN0YXRlMi5oLFxuICAgICAgICBoZWxwZXJXaWR0aCA9IF90aGlzJHN0YXRlMi5oZWxwZXJXaWR0aCxcbiAgICAgICAgaGVscGVySGVpZ2h0ID0gX3RoaXMkc3RhdGUyLmhlbHBlckhlaWdodCxcbiAgICAgICAgaGVscGVyUG9zaXRpb24gPSBfdGhpcyRzdGF0ZTIuaGVscGVyUG9zaXRpb247XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3J0YWwsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdsb2JhbFN0eWxlLCBudWxsKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3RvdXJSZXNpemVPYnNlcnZlciwge1xuICAgICAgICAgIHN0ZXA6IHN0ZXBzW2N1cnJlbnRdLFxuICAgICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLnJlY2FsY3VsYXRlTm9kZShzdGVwc1tjdXJyZW50XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3RvdXJNdXRhdGlvbk9ic2VydmVyLCB7XG4gICAgICAgICAgc3RlcDogc3RlcHNbY3VycmVudF0sXG4gICAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMucmVjYWxjdWxhdGVOb2RlKHN0ZXBzW2N1cnJlbnRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdmdNYXNrLCB7XG4gICAgICAgICAgb25DbGljazogdGhpcy5tYXNrQ2xpY2tIYW5kbGVyLFxuICAgICAgICAgIGZvcndhcmRSZWY6IGZ1bmN0aW9uIGZvcndhcmRSZWYoYykge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5tYXNrID0gYztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdpbmRvd1dpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICAgICAgICB3aW5kb3dIZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICAgICAgICB0YXJnZXRXaWR0aDogdGFyZ2V0V2lkdGgsXG4gICAgICAgICAgdGFyZ2V0SGVpZ2h0OiB0YXJnZXRIZWlnaHQsXG4gICAgICAgICAgdGFyZ2V0VG9wOiB0YXJnZXRUb3AsXG4gICAgICAgICAgdGFyZ2V0TGVmdDogdGFyZ2V0TGVmdCxcbiAgICAgICAgICBwYWRkaW5nOiBtYXNrU3BhY2UsXG4gICAgICAgICAgcm91bmRlZDogcm91bmRlZCxcbiAgICAgICAgICByb3VuZGVkU3RlcDogc3RlcHNbY3VycmVudF0ucm91bmRlZFN0ZXAsXG4gICAgICAgICAgY2xhc3NOYW1lOiBtYXNrQ2xhc3NOYW1lLFxuICAgICAgICAgIGRpc2FibGVJbnRlcmFjdGlvbjogc3RlcHNbY3VycmVudF0uc3RlcEludGVyYWN0aW9uID09PSBmYWxzZSB8fCBkaXNhYmxlSW50ZXJhY3Rpb24gPyAhc3RlcHNbY3VycmVudF0uc3RlcEludGVyYWN0aW9uIDogZGlzYWJsZUludGVyYWN0aW9uLFxuICAgICAgICAgIGRpc2FibGVJbnRlcmFjdGlvbkNsYXNzTmFtZTogXCJcIi5jb25jYXQoQ04ubWFzay5kaXNhYmxlSW50ZXJhY3Rpb24sIFwiIFwiKS5jb25jYXQoaGlnaGxpZ2h0ZWRNYXNrQ2xhc3NOYW1lKSxcbiAgICAgICAgICBoaWdobGlnaHRlZEJvcmRlcjogaGlnaGxpZ2h0ZWRCb3JkZXJcbiAgICAgICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzTG9jaywge1xuICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlRm9jdXNMb2NrLFxuICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2VcbiAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoR3VpZGUsIHtcbiAgICAgICAgICByZWY6IHRoaXMuaGVscGVyLFxuICAgICAgICAgIHRhcmdldEhlaWdodDogdGFyZ2V0SGVpZ2h0LFxuICAgICAgICAgIHRhcmdldFdpZHRoOiB0YXJnZXRXaWR0aCxcbiAgICAgICAgICB0YXJnZXRUb3A6IHRhcmdldFRvcCxcbiAgICAgICAgICB0YXJnZXRSaWdodDogdGFyZ2V0UmlnaHQsXG4gICAgICAgICAgdGFyZ2V0Qm90dG9tOiB0YXJnZXRCb3R0b20sXG4gICAgICAgICAgdGFyZ2V0TGVmdDogdGFyZ2V0TGVmdCxcbiAgICAgICAgICB3aW5kb3dXaWR0aDogd2luZG93V2lkdGgsXG4gICAgICAgICAgd2luZG93SGVpZ2h0OiB3aW5kb3dIZWlnaHQsXG4gICAgICAgICAgaGVscGVyV2lkdGg6IGhlbHBlcldpZHRoLFxuICAgICAgICAgIGhlbHBlckhlaWdodDogaGVscGVySGVpZ2h0LFxuICAgICAgICAgIGhlbHBlclBvc2l0aW9uOiBoZWxwZXJQb3NpdGlvbixcbiAgICAgICAgICBwYWRkaW5nOiBtYXNrU3BhY2UsXG4gICAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnQsXG4gICAgICAgICAgc3R5bGU6IHN0ZXBzW2N1cnJlbnRdLnN0eWxlID8gc3RlcHNbY3VycmVudF0uc3R5bGUgOiB7fSxcbiAgICAgICAgICByb3VuZGVkOiByb3VuZGVkLFxuICAgICAgICAgIGNsYXNzTmFtZTogY24oQ04uaGVscGVyLmJhc2UsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBDTi5oZWxwZXIuaXNPcGVuLCBpc09wZW4pKSxcbiAgICAgICAgICBhY2NlbnRDb2xvcjogYWNjZW50Q29sb3IsXG4gICAgICAgICAgZGVmYXVsdFN0eWxlczogIUN1c3RvbUhlbHBlcixcbiAgICAgICAgICByb2xlOiBcImRpYWxvZ1wiXG4gICAgICAgIH0sIEN1c3RvbUhlbHBlciA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEN1c3RvbUhlbHBlciwge1xuICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnQsXG4gICAgICAgICAgdG90YWxTdGVwczogc3RlcHMubGVuZ3RoLFxuICAgICAgICAgIGdvdG9TdGVwOiB0aGlzLmdvdG9TdGVwLFxuICAgICAgICAgIGNsb3NlOiBvblJlcXVlc3RDbG9zZSxcbiAgICAgICAgICBjb250ZW50OiBzdGVwc1tjdXJyZW50XSAmJiAodHlwZW9mIHN0ZXBzW2N1cnJlbnRdLmNvbnRlbnQgPT09ICdmdW5jdGlvbicgPyBzdGVwc1tjdXJyZW50XS5jb250ZW50KHtcbiAgICAgICAgICAgIGNsb3NlOiBvblJlcXVlc3RDbG9zZSxcbiAgICAgICAgICAgIGdvVG86IHRoaXMuZ290b1N0ZXAsXG4gICAgICAgICAgICBpbkRPTTogaW5ET00sXG4gICAgICAgICAgICBzdGVwOiBjdXJyZW50ICsgMVxuICAgICAgICAgIH0pIDogc3RlcHNbY3VycmVudF0uY29udGVudClcbiAgICAgICAgfSwgdGhpcy5wcm9wcy5jaGlsZHJlbikgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgdGhpcy5wcm9wcy5jaGlsZHJlbiwgc3RlcHNbY3VycmVudF0gJiYgKHR5cGVvZiBzdGVwc1tjdXJyZW50XS5jb250ZW50ID09PSAnZnVuY3Rpb24nID8gc3RlcHNbY3VycmVudF0uY29udGVudCh7XG4gICAgICAgICAgY2xvc2U6IG9uUmVxdWVzdENsb3NlLFxuICAgICAgICAgIGdvVG86IHRoaXMuZ290b1N0ZXAsXG4gICAgICAgICAgaW5ET006IGluRE9NLFxuICAgICAgICAgIHN0ZXA6IGN1cnJlbnQgKyAxXG4gICAgICAgIH0pIDogc3RlcHNbY3VycmVudF0uY29udGVudCksIHNob3dOdW1iZXIgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFkZ2UsIHtcbiAgICAgICAgICBcImRhdGEtdG91ci1lbGVtXCI6IFwiYmFkZ2VcIixcbiAgICAgICAgICBhY2NlbnRDb2xvcjogYWNjZW50Q29sb3JcbiAgICAgICAgfSwgdHlwZW9mIGJhZGdlQ29udGVudCA9PT0gJ2Z1bmN0aW9uJyA/IGJhZGdlQ29udGVudChjdXJyZW50ICsgMSwgc3RlcHMubGVuZ3RoKSA6IGN1cnJlbnQgKyAxKSwgKHNob3dCdXR0b25zIHx8IHNob3dOYXZpZ2F0aW9uKSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250cm9scywge1xuICAgICAgICAgIFwiZGF0YS10b3VyLWVsZW1cIjogXCJjb250cm9sc1wiXG4gICAgICAgIH0sIHNob3dCdXR0b25zICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFycm93JDEsIHtcbiAgICAgICAgICBvbkNsaWNrOiB0eXBlb2YgcHJldlN0ZXAgPT09ICdmdW5jdGlvbicgPyBwcmV2U3RlcCA6IHRoaXMucHJldlN0ZXAsXG4gICAgICAgICAgZGlzYWJsZWQ6IGN1cnJlbnQgPT09IDAsXG4gICAgICAgICAgbGFiZWw6IHByZXZCdXR0b24gPyBwcmV2QnV0dG9uIDogbnVsbFxuICAgICAgICB9KSwgc2hvd05hdmlnYXRpb24gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTmF2aWdhdGlvbiwge1xuICAgICAgICAgIFwiZGF0YS10b3VyLWVsZW1cIjogXCJuYXZpZ2F0aW9uXCJcbiAgICAgICAgfSwgc3RlcHMubWFwKGZ1bmN0aW9uIChzLCBpKSB7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvdCwge1xuICAgICAgICAgICAga2V5OiBcIlwiLmNvbmNhdChzLnNlbGVjdG9yID8gcy5zZWxlY3RvciA6ICd1bmRlZicsIFwiX1wiKS5jb25jYXQoaSksXG4gICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLmdvdG9TdGVwKGkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnQsXG4gICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgIGFjY2VudENvbG9yOiBhY2NlbnRDb2xvcixcbiAgICAgICAgICAgIGRpc2FibGVkOiBjdXJyZW50ID09PSBpIHx8IGRpc2FibGVEb3RzTmF2aWdhdGlvbixcbiAgICAgICAgICAgIHNob3dOdW1iZXI6IHNob3dOYXZpZ2F0aW9uTnVtYmVyLFxuICAgICAgICAgICAgXCJkYXRhLXRvdXItZWxlbVwiOiBcImRvdFwiLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBjbihDTi5kb3QuYmFzZSwgX2RlZmluZVByb3BlcnR5KHt9LCBDTi5kb3QuYWN0aXZlLCBjdXJyZW50ID09PSBpKSksXG4gICAgICAgICAgICBcImFyaWEtbGFiZWxcIjogcy5uYXZEb3RBcmlhTGFiZWxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpLCBzaG93QnV0dG9ucyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBcnJvdyQxLCB7XG4gICAgICAgICAgb25DbGljazogY3VycmVudCA9PT0gc3RlcHMubGVuZ3RoIC0gMSA/IGxhc3RTdGVwTmV4dEJ1dHRvbiA/IG9uUmVxdWVzdENsb3NlIDogZnVuY3Rpb24gKCkge30gOiB0eXBlb2YgbmV4dFN0ZXAgPT09ICdmdW5jdGlvbicgPyBuZXh0U3RlcCA6IHRoaXMubmV4dFN0ZXAsXG4gICAgICAgICAgZGlzYWJsZWQ6ICFsYXN0U3RlcE5leHRCdXR0b24gJiYgY3VycmVudCA9PT0gc3RlcHMubGVuZ3RoIC0gMSxcbiAgICAgICAgICBpbnZlcnRlZDogdHJ1ZSxcbiAgICAgICAgICBsYWJlbDogbGFzdFN0ZXBOZXh0QnV0dG9uICYmIGN1cnJlbnQgPT09IHN0ZXBzLmxlbmd0aCAtIDEgPyBsYXN0U3RlcE5leHRCdXR0b24gOiBuZXh0QnV0dG9uID8gbmV4dEJ1dHRvbiA6IG51bGxcbiAgICAgICAgfSkpLCBzaG93Q2xvc2VCdXR0b24gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3R5bGVkQ2xvc2UsIHtcbiAgICAgICAgICBvbkNsaWNrOiBvblJlcXVlc3RDbG9zZSxcbiAgICAgICAgICBjbGFzc05hbWU6IFwicmVhY3RvdXJfX2Nsb3NlXCIsXG4gICAgICAgICAgYXJpYUxhYmVsOiBjbG9zZUJ1dHRvbkFyaWFMYWJlbFxuICAgICAgICB9KSkpKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1dKTtcbn0oQ29tcG9uZW50KTtcbnZhciBzZXROb2RlU3RhdGUgPSBmdW5jdGlvbiBzZXROb2RlU3RhdGUobm9kZSwgc3RlcCwgaGVscGVyKSB7XG4gIGlmICghaGVscGVyKSByZXR1cm47XG4gIHZhciB3ID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcbiAgdmFyIGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG4gIHZhciBfaHgkZ2V0Tm9kZVJlY3QgPSBnZXROb2RlUmVjdChoZWxwZXIpLFxuICAgIGhlbHBlcldpZHRoID0gX2h4JGdldE5vZGVSZWN0LndpZHRoLFxuICAgIGhlbHBlckhlaWdodCA9IF9oeCRnZXROb2RlUmVjdC5oZWlnaHQ7XG4gIHZhciBhdHRycyA9IHtcbiAgICB0b3A6IGggKyAxMCxcbiAgICByaWdodDogdyAvIDIgKyA5LFxuICAgIGJvdHRvbTogaCAvIDIgKyA5LFxuICAgIGxlZnQ6IHcgLyAyIC0gaGVscGVyV2lkdGggLyAyLFxuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMCxcbiAgICB3OiB3LFxuICAgIGg6IGgsXG4gICAgaGVscGVyUG9zaXRpb246ICdjZW50ZXInXG4gIH07XG4gIGlmIChub2RlKSB7XG4gICAgYXR0cnMgPSBnZXRIaWdobGlnaHRlZFJlY3Qobm9kZSwgc3RlcCk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe1xuICAgICAgdzogdyxcbiAgICAgIGg6IGgsXG4gICAgICBoZWxwZXJXaWR0aDogaGVscGVyV2lkdGgsXG4gICAgICBoZWxwZXJIZWlnaHQ6IGhlbHBlckhlaWdodCxcbiAgICAgIGhlbHBlclBvc2l0aW9uOiBzdGVwLnBvc2l0aW9uXG4gICAgfSwgYXR0cnMpLCB7fSwge1xuICAgICAgaW5ET006IG5vZGUgPyB0cnVlIDogZmFsc2VcbiAgICB9KTtcbiAgfTtcbn07XG5Ub3VyLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblRvdXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnQgZGVmYXVsdCBUb3VyO1xuZXhwb3J0IHsgQXJyb3ckMSBhcyBBcnJvdywgQmFkZ2UsIFN0eWxlZENsb3NlIGFzIENsb3NlLCBDb250cm9scywgRG90LCBOYXZpZ2F0aW9uIH07XG4iLCIvKiFcbiAgQ29weXJpZ2h0IChjKSAyMDE4IEplZCBXYXRzb24uXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlXG4gIGh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXNcbiovXG4vKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgaGFzT3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cblx0ZnVuY3Rpb24gY2xhc3NOYW1lcygpIHtcblx0XHR2YXIgY2xhc3NlcyA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cdFx0XHRpZiAoIWFyZykgY29udGludWU7XG5cblx0XHRcdHZhciBhcmdUeXBlID0gdHlwZW9mIGFyZztcblxuXHRcdFx0aWYgKGFyZ1R5cGUgPT09ICdzdHJpbmcnIHx8IGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaChhcmcpO1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcblx0XHRcdFx0aWYgKGFyZy5sZW5ndGgpIHtcblx0XHRcdFx0XHR2YXIgaW5uZXIgPSBjbGFzc05hbWVzLmFwcGx5KG51bGwsIGFyZyk7XG5cdFx0XHRcdFx0aWYgKGlubmVyKSB7XG5cdFx0XHRcdFx0XHRjbGFzc2VzLnB1c2goaW5uZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhcmdUeXBlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRpZiAoYXJnLnRvU3RyaW5nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7XG5cdFx0XHRcdFx0Zm9yICh2YXIga2V5IGluIGFyZykge1xuXHRcdFx0XHRcdFx0aWYgKGhhc093bi5jYWxsKGFyZywga2V5KSAmJiBhcmdba2V5XSkge1xuXHRcdFx0XHRcdFx0XHRjbGFzc2VzLnB1c2goa2V5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGFyZy50b1N0cmluZygpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdGNsYXNzTmFtZXMuZGVmYXVsdCA9IGNsYXNzTmFtZXM7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWVzO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyByZWdpc3RlciBhcyAnY2xhc3NuYW1lcycsIGNvbnNpc3RlbnQgd2l0aCBucG0gcGFja2FnZSBuYW1lXG5cdFx0ZGVmaW5lKCdjbGFzc25hbWVzJywgW10sIGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBjbGFzc05hbWVzO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5jbGFzc05hbWVzID0gY2xhc3NOYW1lcztcblx0fVxufSgpKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZ2V0U3RhY2sgUmV0dXJucyB0aGUgY29tcG9uZW50IHN0YWNrLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBnZXRTdGFjaykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcihcbiAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICAgICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAnICtcbiAgICAgICAgICAgIGxvY2F0aW9uICsgJyBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJyArIHR5cGVvZiBlcnJvciArICcuICcgK1xuICAgICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArXG4gICAgICAgICAgICAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlO1xuXG4gICAgICAgICAgdmFyIHN0YWNrID0gZ2V0U3RhY2sgPyBnZXRTdGFjaygpIDogJyc7XG5cbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnRmFpbGVkICcgKyBsb2NhdGlvbiArICcgdHlwZTogJyArIGVycm9yLm1lc3NhZ2UgKyAoc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogJycpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc2V0cyB3YXJuaW5nIGNhY2hlIHdoZW4gdGVzdGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tQcm9wVHlwZXM7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbnZhciBjaGVja1Byb3BUeXBlcyA9IHJlcXVpcmUoJy4vY2hlY2tQcm9wVHlwZXMnKTtcblxudmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfTtcbn1cblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgLyogZ2xvYmFsIFN5bWJvbCAqL1xuICB2YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG4gIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuXG4gICAqXG4gICAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBhcyBjb250ZXh0OlxuICAgKlxuICAgKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICAgKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpO1xuICAgKiAgICAgICAuLi5cbiAgICogICAgIH1cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gICAqIEByZXR1cm4gez9mdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gbWF5YmVJdGVyYWJsZSAmJiAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBtZXRob2RzIHRoYXQgYWxsb3cgZGVjbGFyYXRpb24gYW5kIHZhbGlkYXRpb24gb2YgcHJvcHMgdGhhdCBhcmVcbiAgICogc3VwcGxpZWQgdG8gUmVhY3QgY29tcG9uZW50cy4gRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICB2YXIgUHJvcHMgPSByZXF1aXJlKCdSZWFjdFByb3BUeXBlcycpO1xuICAgKiAgIHZhciBNeUFydGljbGUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIHByb3AgbmFtZWQgXCJkZXNjcmlwdGlvblwiLlxuICAgKiAgICAgICBkZXNjcmlwdGlvbjogUHJvcHMuc3RyaW5nLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHJlcXVpcmVkIGVudW0gcHJvcCBuYW1lZCBcImNhdGVnb3J5XCIuXG4gICAqICAgICAgIGNhdGVnb3J5OiBQcm9wcy5vbmVPZihbJ05ld3MnLCdQaG90b3MnXSkuaXNSZXF1aXJlZCxcbiAgICpcbiAgICogICAgICAgLy8gQSBwcm9wIG5hbWVkIFwiZGlhbG9nXCIgdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBEaWFsb2cuXG4gICAqICAgICAgIGRpYWxvZzogUHJvcHMuaW5zdGFuY2VPZihEaWFsb2cpLmlzUmVxdWlyZWRcbiAgICogICAgIH0sXG4gICAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkgeyAuLi4gfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBBIG1vcmUgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZXNlIG1ldGhvZHMgYXJlIHVzZWQ6XG4gICAqXG4gICAqICAgdHlwZSA6PSBhcnJheXxib29sfGZ1bmN8b2JqZWN0fG51bWJlcnxzdHJpbmd8b25lT2YoWy4uLl0pfGluc3RhbmNlT2YoLi4uKVxuICAgKiAgIGRlY2wgOj0gUmVhY3RQcm9wVHlwZXMue3R5cGV9KC5pc1JlcXVpcmVkKT9cbiAgICpcbiAgICogRWFjaCBhbmQgZXZlcnkgZGVjbGFyYXRpb24gcHJvZHVjZXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gVGhpc1xuICAgKiBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICB2YXIgTXlMaW5rID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgb3IgVVJJIHByb3AgbmFtZWQgXCJocmVmXCIuXG4gICAqICAgICAgaHJlZjogZnVuY3Rpb24ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAqICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgKiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmXG4gICAqICAgICAgICAgICAgIShwcm9wVmFsdWUgaW5zdGFuY2VvZiBVUkkpKSB7XG4gICAqICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFuIFVSSSBmb3IgJyArIHByb3BOYW1lICsgJyBpbiAnICtcbiAgICogICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAqICAgICAgICAgICk7XG4gICAqICAgICAgICB9XG4gICAqICAgICAgfVxuICAgKiAgICB9LFxuICAgKiAgICByZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn1cbiAgICogIH0pO1xuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cbiAgdmFyIEFOT05ZTU9VUyA9ICc8PGFub255bW91cz4+JztcblxuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSxcbiAgICBib29sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYm9vbGVhbicpLFxuICAgIGZ1bmM6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdmdW5jdGlvbicpLFxuICAgIG51bWJlcjogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLFxuICAgIG9iamVjdDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ29iamVjdCcpLFxuICAgIHN0cmluZzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N0cmluZycpLFxuICAgIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5bWJvbCcpLFxuXG4gICAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLFxuICAgIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcixcbiAgICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSxcbiAgICBlbGVtZW50VHlwZTogY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpLFxuICAgIGluc3RhbmNlT2Y6IGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIsXG4gICAgbm9kZTogY3JlYXRlTm9kZUNoZWNrZXIoKSxcbiAgICBvYmplY3RPZjogY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcixcbiAgICBvbmVPZjogY3JlYXRlRW51bVR5cGVDaGVja2VyLFxuICAgIG9uZU9mVHlwZTogY3JlYXRlVW5pb25UeXBlQ2hlY2tlcixcbiAgICBzaGFwZTogY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcixcbiAgICBleGFjdDogY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcixcbiAgfTtcblxuICAvKipcbiAgICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAgICovXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi9cbiAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgICB9XG4gIH1cbiAgLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovXG5cbiAgLyoqXG4gICAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGxcbiAgICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZlciwgd2UgZG9uJ3QgdXNlIHJlYWxcbiAgICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbVxuICAgKiBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSBpZiB0aGV5IGFyZSBjcmVhdGVkIHRvbyBvZnRlbiwgc3VjaCBhcyB3aGF0XG4gICAqIGhhcHBlbnMgaW4gb25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC5cbiAgICovXG4gIGZ1bmN0aW9uIFByb3BUeXBlRXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG4gIC8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy5cbiAgUHJvcFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPSAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgICAgaWYgKHNlY3JldCAhPT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgICAgaWYgKHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgICAgICAgICAvLyBOZXcgYmVoYXZpb3Igb25seSBmb3IgdXNlcnMgb2YgYHByb3AtdHlwZXNgIHBhY2thZ2VcbiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgJ1VzZSBgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKClgIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAgICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICAgICAgICApO1xuICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE9sZCBiZWhhdmlvciBmb3IgcGVvcGxlIHVzaW5nIFJlYWN0LlByb3BUeXBlc1xuICAgICAgICAgIHZhciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldICYmXG4gICAgICAgICAgICAvLyBBdm9pZCBzcGFtbWluZyB0aGUgY29uc29sZSBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIG5vdCBhY3Rpb25hYmxlIGV4Y2VwdCBmb3IgbGliIGF1dGhvcnNcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50IDwgM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgICAnWW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGEgUmVhY3QuUHJvcFR5cGVzIHZhbGlkYXRpb24gJyArXG4gICAgICAgICAgICAgICdmdW5jdGlvbiBmb3IgdGhlIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgcHJvcCBvbiBgJyArIGNvbXBvbmVudE5hbWUgICsgJ2AuIFRoaXMgaXMgZGVwcmVjYXRlZCAnICtcbiAgICAgICAgICAgICAgJ2FuZCB3aWxsIHRocm93IGluIHRoZSBzdGFuZGFsb25lIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICAgJ1lvdSBtYXkgYmUgc2VlaW5nIHRoaXMgd2FybmluZyBkdWUgdG8gYSB0aGlyZC1wYXJ0eSBQcm9wVHlwZXMgJyArXG4gICAgICAgICAgICAgICdsaWJyYXJ5LiBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWRvbnQtY2FsbC1wcm9wdHlwZXMgJyArICdmb3IgZGV0YWlscy4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkICcgKyAoJ2luIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGBudWxsYC4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYHVuZGVmaW5lZGAuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7XG4gICAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKGV4cGVjdGVkVHlwZSkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICAgIC8vIGBwcm9wVmFsdWVgIGJlaW5nIGluc3RhbmNlIG9mLCBzYXksIGRhdGUvcmVnZXhwLCBwYXNzIHRoZSAnb2JqZWN0J1xuICAgICAgICAvLyBjaGVjaywgYnV0IHdlIGNhbiBvZmZlciBhIG1vcmUgcHJlY2lzZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gJ29mIHR5cGUgYG9iamVjdGAnLlxuICAgICAgICB2YXIgcHJlY2lzZVR5cGUgPSBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByZWNpc2VUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdgJyArIGV4cGVjdGVkVHlwZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQW55VHlwZUNoZWNrZXIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIGFycmF5T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gYXJyYXkuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJ1snICsgaSArICddJywgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlVHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFSZWFjdElzLmlzVmFsaWRFbGVtZW50VHlwZShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudCB0eXBlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcihleHBlY3RlZENsYXNzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIShwcm9wc1twcm9wTmFtZV0gaW5zdGFuY2VvZiBleHBlY3RlZENsYXNzKSkge1xuICAgICAgICB2YXIgZXhwZWN0ZWRDbGFzc05hbWUgPSBleHBlY3RlZENsYXNzLm5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgICB2YXIgYWN0dWFsQ2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHByb3BzW3Byb3BOYW1lXSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIGFjdHVhbENsYXNzTmFtZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnaW5zdGFuY2Ugb2YgYCcgKyBleHBlY3RlZENsYXNzTmFtZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRW51bVR5cGVDaGVja2VyKGV4cGVjdGVkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWVzKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnRzIHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBhcnJheSwgZ290ICcgKyBhcmd1bWVudHMubGVuZ3RoICsgJyBhcmd1bWVudHMuICcgK1xuICAgICAgICAgICAgJ0EgY29tbW9uIG1pc3Rha2UgaXMgdG8gd3JpdGUgb25lT2YoeCwgeSwgeikgaW5zdGVhZCBvZiBvbmVPZihbeCwgeSwgel0pLidcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gYXJyYXkuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGlzKHByb3BWYWx1ZSwgZXhwZWN0ZWRWYWx1ZXNbaV0pKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkVmFsdWVzLCBmdW5jdGlvbiByZXBsYWNlcihrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBTdHJpbmcocHJvcFZhbHVlKSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBvbmUgb2YgJyArIHZhbHVlc1N0cmluZyArICcuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHByb3BWYWx1ZSkge1xuICAgICAgICBpZiAoaGFzKHByb3BWYWx1ZSwga2V5KSkge1xuICAgICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlVW5pb25UeXBlQ2hlY2tlcihhcnJheU9mVHlwZUNoZWNrZXJzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5T2ZUeXBlQ2hlY2tlcnMpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZSwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLiBFeHBlY3RlZCBhbiBhcnJheSBvZiBjaGVjayBmdW5jdGlvbnMsIGJ1dCAnICtcbiAgICAgICAgICAncmVjZWl2ZWQgJyArIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyhjaGVja2VyKSArICcgYXQgaW5kZXggJyArIGkgKyAnLidcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgICBpZiAoY2hlY2tlcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVOb2RlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghaXNOb2RlKHByb3BzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdE5vZGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc2hhcGVUeXBlcykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKCFjaGVja2VyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBhbGwga2V5cyBpbiBjYXNlIHNvbWUgYXJlIHJlcXVpcmVkIGJ1dCBtaXNzaW5nIGZyb21cbiAgICAgIC8vIHByb3BzLlxuICAgICAgdmFyIGFsbEtleXMgPSBhc3NpZ24oe30sIHByb3BzW3Byb3BOYW1lXSwgc2hhcGVUeXBlcyk7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gYWxsS2V5cykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKCFjaGVja2VyKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgICAgICAgJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGtleSBgJyArIGtleSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLicgK1xuICAgICAgICAgICAgJ1xcbkJhZCBvYmplY3Q6ICcgKyBKU09OLnN0cmluZ2lmeShwcm9wc1twcm9wTmFtZV0sIG51bGwsICcgICcpICtcbiAgICAgICAgICAgICdcXG5WYWxpZCBrZXlzOiAnICsgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHNoYXBlVHlwZXMpLCBudWxsLCAnICAnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAhcHJvcFZhbHVlO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8IGlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuICAgICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50cnlbMV0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpIHtcbiAgICAvLyBOYXRpdmUgU3ltYm9sLlxuICAgIGlmIChwcm9wVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGZhbHN5IHZhbHVlIGNhbid0IGJlIGEgU3ltYm9sXG4gICAgaWYgKCFwcm9wVmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJ1xuICAgIGlmIChwcm9wVmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBub24tc3BlYyBjb21wbGlhbnQgU3ltYm9scyB3aGljaCBhcmUgcG9seWZpbGxlZC5cbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEVxdWl2YWxlbnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJlZ2V4cC5cbiAgZnVuY3Rpb24gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKSB7XG4gICAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9XG4gICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgLy8gT2xkIHdlYmtpdHMgKGF0IGxlYXN0IHVudGlsIEFuZHJvaWQgNC4wKSByZXR1cm4gJ2Z1bmN0aW9uJyByYXRoZXIgdGhhblxuICAgICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgICAvLyBwYXNzZXMgUHJvcFR5cGVzLm9iamVjdC5cbiAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgLy8gU2VlIGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuXG4gIGZ1bmN0aW9uIGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyB8fCBwcm9wVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJyArIHByb3BWYWx1ZTtcbiAgICB9XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgfSBlbHNlIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuICdyZWdleHAnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcG9zdGZpeGVkIHRvIGEgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIHR5cGUuXG4gIC8vIEZvciBleGFtcGxlLCBcInVuZGVmaW5lZFwiIG9yIFwib2YgdHlwZSBhcnJheVwiXG4gIGZ1bmN0aW9uIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcmV0dXJuICdhbiAnICsgdHlwZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICdyZWdleHAnOlxuICAgICAgICByZXR1cm4gJ2EgJyArIHR5cGU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCwgaWYgYW55LlxuICBmdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7XG4gICAgaWYgKCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICByZXR1cm4gQU5PTllNT1VTO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGNoZWNrUHJvcFR5cGVzO1xuICBSZWFjdFByb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGNoZWNrUHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlO1xuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogUmVnZXhQYXJzZXJcbiAqIFBhcnNlcyBhIHN0cmluZyBpbnB1dC5cbiAqXG4gKiBAbmFtZSBSZWdleFBhcnNlclxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBpbnB1dCB0aGF0IHNob3VsZCBiZSBwYXJzZWQgYXMgcmVndWxhclxuICogZXhwcmVzc2lvbi5cbiAqIEByZXR1cm4ge1JlZ0V4cH0gVGhlIHBhcnNlZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gKi9cbnZhciBSZWdleFBhcnNlciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgLy8gVmFsaWRhdGUgaW5wdXRcbiAgICBpZiAodHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQuIElucHV0IG11c3QgYmUgYSBzdHJpbmdcIik7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgaW5wdXRcbiAgICB2YXIgbSA9IGlucHV0Lm1hdGNoKC8oXFwvPykoLispXFwxKFthLXpdKikvaSk7XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIG1hdGNoLCB0aHJvdyBhbiBlcnJvclxuICAgIGlmICghbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3JtYXQuXCIpO1xuICAgIH1cblxuICAgIC8vIEZpbHRlciB2YWxpZCBmbGFnczogJ2cnLCAnaScsICdtJywgJ3MnLCAndScsIGFuZCAneSdcbiAgICB2YXIgdmFsaWRGbGFncyA9IEFycmF5LmZyb20obmV3IFNldChtWzNdKSkuZmlsdGVyKGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHJldHVybiBcImdpbXN1eVwiLmluY2x1ZGVzKGZsYWcpO1xuICAgIH0pLmpvaW4oXCJcIik7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgIHJldHVybiBuZXcgUmVnRXhwKG1bMl0sIHZhbGlkRmxhZ3MpO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfc2Nyb2xsU21vb3RoID0gcmVxdWlyZSgnLi9zY3JvbGxTbW9vdGgnKTtcblxudmFyIF9zY3JvbGxTbW9vdGgyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2Nyb2xsU21vb3RoKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICBfcmVmJHF1ZXJ5ID0gX3JlZi5xdWVyeSxcbiAgICAgIHF1ZXJ5ID0gX3JlZiRxdWVyeSA9PT0gdW5kZWZpbmVkID8gJ1tocmVmXj1cIiNcIl06bm90KFtocmVmPVwiI1wiXScgOiBfcmVmJHF1ZXJ5LFxuICAgICAgX3JlZiRtYXRjaCA9IF9yZWYubWF0Y2gsXG4gICAgICBtYXRjaCA9IF9yZWYkbWF0Y2ggPT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0Lmhhc2guc3Vic3RyaW5nKDEpKTtcbiAgfSA6IF9yZWYkbWF0Y2gsXG4gICAgICBfcmVmJGhhc2hDaGFuZ2UgPSBfcmVmLmhhc2hDaGFuZ2UsXG4gICAgICBoYXNoQ2hhbmdlID0gX3JlZiRoYXNoQ2hhbmdlID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZiRoYXNoQ2hhbmdlLFxuICAgICAgc2Nyb2xsU21vb3RoQ29uZmlnID0gX3JlZi5zY3JvbGxTbW9vdGhDb25maWc7XG5cbiAgdmFyIGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxdWVyeSk7XG4gIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcihlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBkZXN0ID0gbWF0Y2goZS50YXJnZXQpO1xuXG4gICAgaWYgKCFkZXN0KSByZXR1cm47XG5cbiAgICBpZiAoaGFzaENoYW5nZSkge1xuICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgbnVsbCwgJyMnICsgZGVzdC5pZCk7XG4gICAgfVxuXG4gICAgKDAsIF9zY3JvbGxTbW9vdGgyLmRlZmF1bHQpKGRlc3QsIF9leHRlbmRzKHt9LCBzY3JvbGxTbW9vdGhDb25maWcpKTtcbiAgfTtcblxuICBBcnJheS5mcm9tKGxpbmtzKS5tYXAoZnVuY3Rpb24gKGxpbmspIHtcbiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlciwgZmFsc2UpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zY3JvbGxTbW9vdGggPSByZXF1aXJlKCcuL3Njcm9sbFNtb290aCcpO1xuXG52YXIgX3Njcm9sbFNtb290aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zY3JvbGxTbW9vdGgpO1xuXG52YXIgX3Rvb2xzID0gcmVxdWlyZSgnLi90b29scycpO1xuXG52YXIgX2FuY2hvclNjcm9sbCA9IHJlcXVpcmUoJy4vYW5jaG9yU2Nyb2xsJyk7XG5cbnZhciBfYW5jaG9yU2Nyb2xsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FuY2hvclNjcm9sbCk7XG5cbnZhciBfb2JzZXJ2ZSA9IHJlcXVpcmUoJy4vb2JzZXJ2ZScpO1xuXG52YXIgX29ic2VydmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JzZXJ2ZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgdG86IF9zY3JvbGxTbW9vdGgyLmRlZmF1bHQsXG4gIGNhbGNFbmRQb2ludDogX3Rvb2xzLmNhbGNFbmRQb2ludCxcbiAgYW5jaG9yU2Nyb2xsOiBfYW5jaG9yU2Nyb2xsMi5kZWZhdWx0LFxuICBvYnNlcnZlOiBfb2JzZXJ2ZTIuZGVmYXVsdFxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgX3JlZiRhY3RpdmVDbGFzcyA9IF9yZWYuYWN0aXZlQ2xhc3MsXG4gICAgICBhY3RpdmVDbGFzcyA9IF9yZWYkYWN0aXZlQ2xhc3MgPT09IHVuZGVmaW5lZCA/ICdhY3RpdmUnIDogX3JlZiRhY3RpdmVDbGFzcyxcbiAgICAgIF9yZWYkcXVlcnkgPSBfcmVmLnF1ZXJ5LFxuICAgICAgcXVlcnkgPSBfcmVmJHF1ZXJ5ID09PSB1bmRlZmluZWQgPyAnW2hyZWZePVwiI1wiXTpub3QoW2hyZWY9XCIjXCJdKTpub3QoW2hyZWY9XCIjMFwiXSknIDogX3JlZiRxdWVyeSxcbiAgICAgIF9yZWYkdGhyZXNob2xkID0gX3JlZi50aHJlc2hvbGQsXG4gICAgICB0aHJlc2hvbGQgPSBfcmVmJHRocmVzaG9sZCA9PT0gdW5kZWZpbmVkID8gWzAuMjUsIDAuNSwgMC43NV0gOiBfcmVmJHRocmVzaG9sZCxcbiAgICAgIF9yZWYkZGV0ZWN0VHlwZSA9IF9yZWYuZGV0ZWN0VHlwZSxcbiAgICAgIGRldGVjdFR5cGUgPSBfcmVmJGRldGVjdFR5cGUgPT09IHVuZGVmaW5lZCA/ICdtYXgnIDogX3JlZiRkZXRlY3RUeXBlO1xuXG4gIHZhciBvcHRpb25zID0geyB0aHJlc2hvbGQ6IHRocmVzaG9sZCB9O1xuXG4gIHZhciByZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzKTtcbiAgfTtcbiAgdmFyIGFkZENsYXNzID0gZnVuY3Rpb24gYWRkQ2xhc3Mobm9kZSkge1xuICAgIHJldHVybiBub2RlLmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xuICB9O1xuXG4gIHZhciB1bnNldEFsbEFjdGl2ZXMgPSBmdW5jdGlvbiB1bnNldEFsbEFjdGl2ZXMoKSB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBhY3RpdmVDbGFzcykuZm9yRWFjaChyZW1vdmVDbGFzcyk7XG4gIH07XG5cbiAgdmFyIHNldEFjdGl2ZSA9IGZ1bmN0aW9uIHNldEFjdGl2ZShhY3RpdmVOb2RlKSB7XG4gICAgdW5zZXRBbGxBY3RpdmVzKCk7XG4gICAgYWRkQ2xhc3MoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYVtocmVmPVwiIycgKyBhY3RpdmVOb2RlLmlkICsgJ1wiXScpKTtcbiAgfTtcblxuICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjayhlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgaWYgKGVudHJ5LmludGVyc2VjdGlvblJhdGlvID49IE1hdGhbZGV0ZWN0VHlwZV0uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KHRocmVzaG9sZCkpKSB7XG4gICAgICAgIHNldEFjdGl2ZShlbnRyeS50YXJnZXQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBsaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpO1xuICB2YXIgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIG9wdGlvbnMpO1xuICB2YXIgb2JzZXJ2ZVRhcmdldCA9IGZ1bmN0aW9uIG9ic2VydmVUYXJnZXQobGluaykge1xuICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGxpbmsuaGFzaC5zbGljZSgxKSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXQpO1xuICB9O1xuXG4gIGxpbmtzLmZvckVhY2gob2JzZXJ2ZVRhcmdldCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG52YXIgX3Rvb2xzID0gcmVxdWlyZShcIi4vdG9vbHNcIik7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgX3JlZiRkdXJhdGlvbiA9IF9yZWYuZHVyYXRpb24sXG4gICAgICBkdXJhdGlvbiA9IF9yZWYkZHVyYXRpb24gPT09IHVuZGVmaW5lZCA/IDUwMCA6IF9yZWYkZHVyYXRpb24sXG4gICAgICBfcmVmJGNvbnRleHQgPSBfcmVmLmNvbnRleHQsXG4gICAgICBjb250ZXh0ID0gX3JlZiRjb250ZXh0ID09PSB1bmRlZmluZWQgPyB3aW5kb3cgOiBfcmVmJGNvbnRleHQsXG4gICAgICBfcmVmJG9mZnNldCA9IF9yZWYub2Zmc2V0LFxuICAgICAgb2Zmc2V0ID0gX3JlZiRvZmZzZXQgPT09IHVuZGVmaW5lZCA/IDAgOiBfcmVmJG9mZnNldCxcbiAgICAgIF9yZWYkZWFzZSA9IF9yZWYuZWFzZSxcbiAgICAgIGVhc2UgPSBfcmVmJGVhc2UgPT09IHVuZGVmaW5lZCA/IFwiZWFzZUluT3V0Q3ViaWNcIiA6IF9yZWYkZWFzZSxcbiAgICAgIGNhbGxiYWNrID0gX3JlZi5jYWxsYmFjaztcblxuICBpZiAoKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZih3aW5kb3cpKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuO1xuXG4gIHZhciBzdGFydCA9IGNvbnRleHQuc2Nyb2xsVG9wICE9PSBudWxsICYmIGNvbnRleHQuc2Nyb2xsVG9wICE9PSB1bmRlZmluZWQgPyBjb250ZXh0LnNjcm9sbFRvcCA6IHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgdmFyIGVuZCA9ICgwLCBfdG9vbHMuY2FsY0VuZFBvaW50KSh0YXJnZXQsIGNvbnRleHQsIG9mZnNldCk7XG4gIHZhciBjbG9jayA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICB2YXIgckFGID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTtcblxuICB2YXIgdGljayA9IGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgdmFyIGVsYXBzZWQgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGNsb2NrO1xuICAgIHZhciBwb3MgPSAoMCwgX3Rvb2xzLnNldFBvc2l0aW9uKShzdGFydCwgZW5kLCBlbGFwc2VkLCBkdXJhdGlvbiwgZWFzZSk7XG4gICAgaWYgKGNvbnRleHQgIT09IHdpbmRvdykge1xuICAgICAgY29udGV4dC5zY3JvbGxUb3AgPSBwb3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5zY3JvbGwoMCwgcG9zKTtcbiAgICB9XG5cbiAgICBpZiAoZWxhcHNlZCA+IGR1cmF0aW9uKSB7XG4gICAgICB0eXBlb2YgY2FsbGJhY2sgPT09IFwiZnVuY3Rpb25cIiAmJiBjYWxsYmFjayh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByQUYodGljayk7XG4gICAgfVxuICB9O1xuXG4gIHRpY2soKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xudmFyIGVhc2VGdW5jdGlvbnMgPSBleHBvcnRzLmVhc2VGdW5jdGlvbnMgPSB7XG4gIGxpbmVhcjogZnVuY3Rpb24gbGluZWFyKHQpIHtcbiAgICByZXR1cm4gdDtcbiAgfSxcbiAgZWFzZUluUXVhZDogZnVuY3Rpb24gZWFzZUluUXVhZCh0KSB7XG4gICAgcmV0dXJuIHQgKiB0O1xuICB9LFxuICBlYXNlT3V0UXVhZDogZnVuY3Rpb24gZWFzZU91dFF1YWQodCkge1xuICAgIHJldHVybiB0ICogKDIgLSB0KTtcbiAgfSxcbiAgZWFzZUluT3V0UXVhZDogZnVuY3Rpb24gZWFzZUluT3V0UXVhZCh0KSB7XG4gICAgcmV0dXJuIHQgPCAuNSA/IDIgKiB0ICogdCA6IC0xICsgKDQgLSAyICogdCkgKiB0O1xuICB9LFxuICBlYXNlSW5DdWJpYzogZnVuY3Rpb24gZWFzZUluQ3ViaWModCkge1xuICAgIHJldHVybiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VPdXRDdWJpYzogZnVuY3Rpb24gZWFzZU91dEN1YmljKHQpIHtcbiAgICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xuICB9LFxuICBlYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24gZWFzZUluT3V0Q3ViaWModCkge1xuICAgIHJldHVybiB0IDwgLjUgPyA0ICogdCAqIHQgKiB0IDogKHQgLSAxKSAqICgyICogdCAtIDIpICogKDIgKiB0IC0gMikgKyAxO1xuICB9LFxuICBlYXNlSW5RdWFydDogZnVuY3Rpb24gZWFzZUluUXVhcnQodCkge1xuICAgIHJldHVybiB0ICogdCAqIHQgKiB0O1xuICB9LFxuICBlYXNlT3V0UXVhcnQ6IGZ1bmN0aW9uIGVhc2VPdXRRdWFydCh0KSB7XG4gICAgcmV0dXJuIDEgLSAtLXQgKiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VJbk91dFF1YXJ0OiBmdW5jdGlvbiBlYXNlSW5PdXRRdWFydCh0KSB7XG4gICAgcmV0dXJuIHQgPCAuNSA/IDggKiB0ICogdCAqIHQgKiB0IDogMSAtIDggKiAtLXQgKiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VJblF1aW50OiBmdW5jdGlvbiBlYXNlSW5RdWludCh0KSB7XG4gICAgcmV0dXJuIHQgKiB0ICogdCAqIHQgKiB0O1xuICB9LFxuICBlYXNlT3V0UXVpbnQ6IGZ1bmN0aW9uIGVhc2VPdXRRdWludCh0KSB7XG4gICAgcmV0dXJuIDEgKyAtLXQgKiB0ICogdCAqIHQgKiB0O1xuICB9LFxuICBlYXNlSW5PdXRRdWludDogZnVuY3Rpb24gZWFzZUluT3V0UXVpbnQodCkge1xuICAgIHJldHVybiB0IDwgLjUgPyAxNiAqIHQgKiB0ICogdCAqIHQgKiB0IDogMSArIDE2ICogLS10ICogdCAqIHQgKiB0ICogdDtcbiAgfVxufTtcblxudmFyIGlzTnVtZXJpYyA9IGV4cG9ydHMuaXNOdW1lcmljID0gZnVuY3Rpb24gaXNOdW1lcmljKG4pIHtcbiAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcbn07XG5cbnZhciBzZXRQb3NpdGlvbiA9IGV4cG9ydHMuc2V0UG9zaXRpb24gPSBmdW5jdGlvbiBzZXRQb3NpdGlvbihiZWdpbiwgZW5kLCBlbGFwc2VkLCBkdXJhdGlvbikge1xuICB2YXIgZWFzZSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogJ2Vhc2VJbk91dEN1YmljJztcblxuICByZXR1cm4gZWxhcHNlZCA+IGR1cmF0aW9uID8gZW5kIDogYmVnaW4gKyAoZW5kIC0gYmVnaW4pICogZWFzZUZ1bmN0aW9uc1tlYXNlXShlbGFwc2VkIC8gZHVyYXRpb24pO1xufTtcblxudmFyIGNhbGNFbmRQb2ludCA9IGV4cG9ydHMuY2FsY0VuZFBvaW50ID0gZnVuY3Rpb24gY2FsY0VuZFBvaW50KHRhcmdldCkge1xuICB2YXIgY29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogd2luZG93O1xuICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwO1xuXG4gIGlmIChpc051bWVyaWModGFyZ2V0KSkge1xuICAgIHJldHVybiBwYXJzZUludCh0YXJnZXQpICsgb2Zmc2V0O1xuICB9XG5cbiAgdmFyIHkgPSBjb250ZXh0ID09PSB3aW5kb3cgfHwgY29udGV4dCA9PT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ID8gd2luZG93LnBhZ2VZT2Zmc2V0IDogY29udGV4dC5zY3JvbGxUb3AgLSBjb250ZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcblxuICB2YXIgZGlzdGFuY2UgPSB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2h0bWwnID8gLXkgOiB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgeTtcblxuICByZXR1cm4gZGlzdGFuY2UgKyBvZmZzZXQ7XG59OyIsIihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoW10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICByb290LlNjcm9sbHBhcmVudCA9IGZhY3RvcnkoKTtcbiAgfVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gIHZhciByZWdleCA9IC8oYXV0b3xzY3JvbGwpLztcblxuICB2YXIgcGFyZW50cyA9IGZ1bmN0aW9uIChub2RlLCBwcykge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUgPT09IG51bGwpIHsgcmV0dXJuIHBzOyB9XG5cbiAgICByZXR1cm4gcGFyZW50cyhub2RlLnBhcmVudE5vZGUsIHBzLmNvbmNhdChbbm9kZV0pKTtcbiAgfTtcblxuICB2YXIgc3R5bGUgPSBmdW5jdGlvbiAobm9kZSwgcHJvcCkge1xuICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUocHJvcCk7XG4gIH07XG5cbiAgdmFyIG92ZXJmbG93ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gc3R5bGUobm9kZSwgXCJvdmVyZmxvd1wiKSArIHN0eWxlKG5vZGUsIFwib3ZlcmZsb3cteVwiKSArIHN0eWxlKG5vZGUsIFwib3ZlcmZsb3cteFwiKTtcbiAgfTtcblxuICB2YXIgc2Nyb2xsID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgIHJldHVybiByZWdleC50ZXN0KG92ZXJmbG93KG5vZGUpKTtcbiAgfTtcblxuICB2YXIgc2Nyb2xsUGFyZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gO1xuICAgIH1cblxuICAgIHZhciBwcyA9IHBhcmVudHMobm9kZS5wYXJlbnROb2RlLCBbXSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAoc2Nyb2xsKHBzW2ldKSkge1xuICAgICAgICByZXR1cm4gcHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9O1xuXG4gIHJldHVybiBzY3JvbGxQYXJlbnQ7XG59KSk7XG4iLCIvL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCLCBjb21wYXJlLCBjb21wYXJlQ29udGV4dCkge1xuICB2YXIgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgb2JqQSwgb2JqQikgOiB2b2lkIDA7XG5cbiAgaWYgKHJldCAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuICEhcmV0O1xuICB9XG5cbiAgaWYgKG9iakEgPT09IG9iakIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gXCJvYmplY3RcIiB8fCAhb2JqQSB8fCB0eXBlb2Ygb2JqQiAhPT0gXCJvYmplY3RcIiB8fCAhb2JqQikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYkhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5iaW5kKG9iakIpO1xuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGtleXNBLmxlbmd0aDsgaWR4KyspIHtcbiAgICB2YXIga2V5ID0ga2V5c0FbaWR4XTtcblxuICAgIGlmICghYkhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVBID0gb2JqQVtrZXldO1xuICAgIHZhciB2YWx1ZUIgPSBvYmpCW2tleV07XG5cbiAgICByZXQgPSBjb21wYXJlID8gY29tcGFyZS5jYWxsKGNvbXBhcmVDb250ZXh0LCB2YWx1ZUEsIHZhbHVlQiwga2V5KSA6IHZvaWQgMDtcblxuICAgIGlmIChyZXQgPT09IGZhbHNlIHx8IChyZXQgPT09IHZvaWQgMCAmJiB2YWx1ZUEgIT09IHZhbHVlQikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9yZWFjdC1kYXRlcGlja2VyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9yZWFjdC1kYXRlcGlja2VyLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaW5kZXguY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaW5kZXguY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9vcGVuc2lnbmRyaXZlLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL29wZW5zaWduZHJpdmUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zaWduYXR1cmUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc2lnbmF0dXJlLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0U3R5bGVFbGVtZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KG9iai5zdXBwb3J0cywgXCIpIHtcIik7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwiQGxheWVyXCIuY29uY2F0KG9iai5sYXllci5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KG9iai5sYXllcikgOiBcIlwiLCBcIiB7XCIpO1xuICB9XG4gIGNzcyArPSBvYmouY3NzO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcbiAgaWYgKHNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSksIFwiICovXCIpO1xuICB9XG5cbiAgLy8gRm9yIG9sZCBJRVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuICBpZiAoc3R5bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge30sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgfTtcbiAgfVxuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZG9tQVBJOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50KSB7XG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiaW1wb3J0e3R5cGVPZiBhcyBlLGlzRWxlbWVudCBhcyB0LGlzVmFsaWRFbGVtZW50VHlwZSBhcyBufWZyb21cInJlYWN0LWlzXCI7aW1wb3J0IHIse3VzZVN0YXRlIGFzIG8sdXNlQ29udGV4dCBhcyBzLHVzZU1lbW8gYXMgaSx1c2VFZmZlY3QgYXMgYSx1c2VSZWYgYXMgYyxjcmVhdGVFbGVtZW50IGFzIHUsdXNlTGF5b3V0RWZmZWN0IGFzIGx9ZnJvbVwicmVhY3RcIjtpbXBvcnQgZCBmcm9tXCJzaGFsbG93ZXF1YWxcIjtpbXBvcnQgaCBmcm9tXCJAZW1vdGlvbi9zdHlsaXNcIjtpbXBvcnQgcCBmcm9tXCJAZW1vdGlvbi91bml0bGVzc1wiO2ltcG9ydCBmIGZyb21cIkBlbW90aW9uL2lzLXByb3AtdmFsaWRcIjtpbXBvcnQgbSBmcm9tXCJob2lzdC1ub24tcmVhY3Qtc3RhdGljc1wiO2Z1bmN0aW9uIHkoKXtyZXR1cm4oeT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciB2PWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtlWzBdXSxyPTAsbz10Lmxlbmd0aDtyPG87cis9MSluLnB1c2godFtyXSxlW3IrMV0pO3JldHVybiBufSxnPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dCYmXCJvYmplY3RcIj09dHlwZW9mIHQmJlwiW29iamVjdCBPYmplY3RdXCI9PT0odC50b1N0cmluZz90LnRvU3RyaW5nKCk6T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKSYmIWUodCl9LFM9T2JqZWN0LmZyZWV6ZShbXSksdz1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBFKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGV9ZnVuY3Rpb24gYihlKXtyZXR1cm5cInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInN0cmluZ1wiPT10eXBlb2YgZSYmZXx8ZS5kaXNwbGF5TmFtZXx8ZS5uYW1lfHxcIkNvbXBvbmVudFwifWZ1bmN0aW9uIF8oZSl7cmV0dXJuIGUmJlwic3RyaW5nXCI9PXR5cGVvZiBlLnN0eWxlZENvbXBvbmVudElkfXZhciBOPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBwcm9jZXNzJiZ2b2lkIDAhPT1wcm9jZXNzLmVudiYmKHByb2Nlc3MuZW52LlJFQUNUX0FQUF9TQ19BVFRSfHxwcm9jZXNzLmVudi5TQ19BVFRSKXx8XCJkYXRhLXN0eWxlZFwiLEE9XCI1LjMuMTFcIixDPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJlwiSFRNTEVsZW1lbnRcImluIHdpbmRvdyxJPUJvb2xlYW4oXCJib29sZWFuXCI9PXR5cGVvZiBTQ19ESVNBQkxFX1NQRUVEWT9TQ19ESVNBQkxFX1NQRUVEWTpcInVuZGVmaW5lZFwiIT10eXBlb2YgcHJvY2VzcyYmdm9pZCAwIT09cHJvY2Vzcy5lbnYmJih2b2lkIDAhPT1wcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfRElTQUJMRV9TUEVFRFkmJlwiXCIhPT1wcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfRElTQUJMRV9TUEVFRFk/XCJmYWxzZVwiIT09cHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NDX0RJU0FCTEVfU1BFRURZJiZwcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfRElTQUJMRV9TUEVFRFk6dm9pZCAwIT09cHJvY2Vzcy5lbnYuU0NfRElTQUJMRV9TUEVFRFkmJlwiXCIhPT1wcm9jZXNzLmVudi5TQ19ESVNBQkxFX1NQRUVEWT9cImZhbHNlXCIhPT1wcm9jZXNzLmVudi5TQ19ESVNBQkxFX1NQRUVEWSYmcHJvY2Vzcy5lbnYuU0NfRElTQUJMRV9TUEVFRFk6XCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOVikpLFA9e30sTz1cInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WP3sxOlwiQ2Fubm90IGNyZWF0ZSBzdHlsZWQtY29tcG9uZW50IGZvciBjb21wb25lbnQ6ICVzLlxcblxcblwiLDI6XCJDYW4ndCBjb2xsZWN0IHN0eWxlcyBvbmNlIHlvdSd2ZSBjb25zdW1lZCBhIGBTZXJ2ZXJTdHlsZVNoZWV0YCdzIHN0eWxlcyEgYFNlcnZlclN0eWxlU2hlZXRgIGlzIGEgb25lIG9mZiBpbnN0YW5jZSBmb3IgZWFjaCBzZXJ2ZXItc2lkZSByZW5kZXIgY3ljbGUuXFxuXFxuLSBBcmUgeW91IHRyeWluZyB0byByZXVzZSBpdCBhY3Jvc3MgcmVuZGVycz9cXG4tIEFyZSB5b3UgYWNjaWRlbnRhbGx5IGNhbGxpbmcgY29sbGVjdFN0eWxlcyB0d2ljZT9cXG5cXG5cIiwzOlwiU3RyZWFtaW5nIFNTUiBpcyBvbmx5IHN1cHBvcnRlZCBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQ7IFBsZWFzZSBkbyBub3QgdHJ5IHRvIGNhbGwgdGhpcyBtZXRob2QgaW4gdGhlIGJyb3dzZXIuXFxuXFxuXCIsNDpcIlRoZSBgU3R5bGVTaGVldE1hbmFnZXJgIGV4cGVjdHMgYSB2YWxpZCB0YXJnZXQgb3Igc2hlZXQgcHJvcCFcXG5cXG4tIERvZXMgdGhpcyBlcnJvciBvY2N1ciBvbiB0aGUgY2xpZW50IGFuZCBpcyB5b3VyIHRhcmdldCBmYWxzeT9cXG4tIERvZXMgdGhpcyBlcnJvciBvY2N1ciBvbiB0aGUgc2VydmVyIGFuZCBpcyB0aGUgc2hlZXQgZmFsc3k/XFxuXFxuXCIsNTpcIlRoZSBjbG9uZSBtZXRob2QgY2Fubm90IGJlIHVzZWQgb24gdGhlIGNsaWVudCFcXG5cXG4tIEFyZSB5b3UgcnVubmluZyBpbiBhIGNsaWVudC1saWtlIGVudmlyb25tZW50IG9uIHRoZSBzZXJ2ZXI/XFxuLSBBcmUgeW91IHRyeWluZyB0byBydW4gU1NSIG9uIHRoZSBjbGllbnQ/XFxuXFxuXCIsNjpcIlRyeWluZyB0byBpbnNlcnQgYSBuZXcgc3R5bGUgdGFnLCBidXQgdGhlIGdpdmVuIE5vZGUgaXMgdW5tb3VudGVkIVxcblxcbi0gQXJlIHlvdSB1c2luZyBhIGN1c3RvbSB0YXJnZXQgdGhhdCBpc24ndCBtb3VudGVkP1xcbi0gRG9lcyB5b3VyIGRvY3VtZW50IG5vdCBoYXZlIGEgdmFsaWQgaGVhZCBlbGVtZW50P1xcbi0gSGF2ZSB5b3UgYWNjaWRlbnRhbGx5IHJlbW92ZWQgYSBzdHlsZSB0YWcgbWFudWFsbHk/XFxuXFxuXCIsNzonVGhlbWVQcm92aWRlcjogUGxlYXNlIHJldHVybiBhbiBvYmplY3QgZnJvbSB5b3VyIFwidGhlbWVcIiBwcm9wIGZ1bmN0aW9uLCBlLmcuXFxuXFxuYGBganNcXG50aGVtZT17KCkgPT4gKHt9KX1cXG5gYGBcXG5cXG4nLDg6J1RoZW1lUHJvdmlkZXI6IFBsZWFzZSBtYWtlIHlvdXIgXCJ0aGVtZVwiIHByb3AgYW4gb2JqZWN0LlxcblxcbicsOTpcIk1pc3NpbmcgZG9jdW1lbnQgYDxoZWFkPmBcXG5cXG5cIiwxMDpcIkNhbm5vdCBmaW5kIGEgU3R5bGVTaGVldCBpbnN0YW5jZS4gVXN1YWxseSB0aGlzIGhhcHBlbnMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvcGllcyBvZiBzdHlsZWQtY29tcG9uZW50cyBsb2FkZWQgYXQgb25jZS4gQ2hlY2sgb3V0IHRoaXMgaXNzdWUgZm9yIGhvdyB0byB0cm91Ymxlc2hvb3QgYW5kIGZpeCB0aGUgY29tbW9uIGNhc2VzIHdoZXJlIHRoaXMgc2l0dWF0aW9uIGNhbiBoYXBwZW46IGh0dHBzOi8vZ2l0aHViLmNvbS9zdHlsZWQtY29tcG9uZW50cy9zdHlsZWQtY29tcG9uZW50cy9pc3N1ZXMvMTk0MSNpc3N1ZWNvbW1lbnQtNDE3ODYyMDIxXFxuXFxuXCIsMTE6XCJfVGhpcyBlcnJvciB3YXMgcmVwbGFjZWQgd2l0aCBhIGRldi10aW1lIHdhcm5pbmcsIGl0IHdpbGwgYmUgZGVsZXRlZCBmb3IgdjQgZmluYWwuXyBbY3JlYXRlR2xvYmFsU3R5bGVdIHJlY2VpdmVkIGNoaWxkcmVuIHdoaWNoIHdpbGwgbm90IGJlIHJlbmRlcmVkLiBQbGVhc2UgdXNlIHRoZSBjb21wb25lbnQgd2l0aG91dCBwYXNzaW5nIGNoaWxkcmVuIGVsZW1lbnRzLlxcblxcblwiLDEyOlwiSXQgc2VlbXMgeW91IGFyZSBpbnRlcnBvbGF0aW5nIGEga2V5ZnJhbWUgZGVjbGFyYXRpb24gKCVzKSBpbnRvIGFuIHVudGFnZ2VkIHN0cmluZy4gVGhpcyB3YXMgc3VwcG9ydGVkIGluIHN0eWxlZC1jb21wb25lbnRzIHYzLCBidXQgaXMgbm90IGxvbmdlciBzdXBwb3J0ZWQgaW4gdjQgYXMga2V5ZnJhbWVzIGFyZSBub3cgaW5qZWN0ZWQgb24tZGVtYW5kLiBQbGVhc2Ugd3JhcCB5b3VyIHN0cmluZyBpbiB0aGUgY3NzXFxcXGBcXFxcYCBoZWxwZXIgd2hpY2ggZW5zdXJlcyB0aGUgc3R5bGVzIGFyZSBpbmplY3RlZCBjb3JyZWN0bHkuIFNlZSBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9hcGkjY3NzXFxuXFxuXCIsMTM6XCIlcyBpcyBub3QgYSBzdHlsZWQgY29tcG9uZW50IGFuZCBjYW5ub3QgYmUgcmVmZXJyZWQgdG8gdmlhIGNvbXBvbmVudCBzZWxlY3Rvci4gU2VlIGh0dHBzOi8vd3d3LnN0eWxlZC1jb21wb25lbnRzLmNvbS9kb2NzL2FkdmFuY2VkI3JlZmVycmluZy10by1vdGhlci1jb21wb25lbnRzIGZvciBtb3JlIGRldGFpbHMuXFxuXFxuXCIsMTQ6J1RoZW1lUHJvdmlkZXI6IFwidGhlbWVcIiBwcm9wIGlzIHJlcXVpcmVkLlxcblxcbicsMTU6XCJBIHN0eWxpcyBwbHVnaW4gaGFzIGJlZW4gc3VwcGxpZWQgdGhhdCBpcyBub3QgbmFtZWQuIFdlIG5lZWQgYSBuYW1lIGZvciBlYWNoIHBsdWdpbiB0byBiZSBhYmxlIHRvIHByZXZlbnQgc3R5bGluZyBjb2xsaXNpb25zIGJldHdlZW4gZGlmZmVyZW50IHN0eWxpcyBjb25maWd1cmF0aW9ucyB3aXRoaW4gdGhlIHNhbWUgYXBwLiBCZWZvcmUgeW91IHBhc3MgeW91ciBwbHVnaW4gdG8gYDxTdHlsZVNoZWV0TWFuYWdlciBzdHlsaXNQbHVnaW5zPXtbXX0+YCwgcGxlYXNlIG1ha2Ugc3VyZSBlYWNoIHBsdWdpbiBpcyB1bmlxdWVseS1uYW1lZCwgZS5nLlxcblxcbmBgYGpzXFxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGltcG9ydGVkUGx1Z2luLCAnbmFtZScsIHsgdmFsdWU6ICdzb21lLXVuaXF1ZS1uYW1lJyB9KTtcXG5gYGBcXG5cXG5cIiwxNjpcIlJlYWNoZWQgdGhlIGxpbWl0IG9mIGhvdyBtYW55IHN0eWxlZCBjb21wb25lbnRzIG1heSBiZSBjcmVhdGVkIGF0IGdyb3VwICVzLlxcbllvdSBtYXkgb25seSBjcmVhdGUgdXAgdG8gMSwwNzMsNzQxLDgyNCBjb21wb25lbnRzLiBJZiB5b3UncmUgY3JlYXRpbmcgY29tcG9uZW50cyBkeW5hbWljYWxseSxcXG5hcyBmb3IgaW5zdGFuY2UgaW4geW91ciByZW5kZXIgbWV0aG9kIHRoZW4geW91IG1heSBiZSBydW5uaW5nIGludG8gdGhpcyBsaW1pdGF0aW9uLlxcblxcblwiLDE3OlwiQ1NTU3R5bGVTaGVldCBjb3VsZCBub3QgYmUgZm91bmQgb24gSFRNTFN0eWxlRWxlbWVudC5cXG5IYXMgc3R5bGVkLWNvbXBvbmVudHMnIHN0eWxlIHRhZyBiZWVuIHVubW91bnRlZCBvciBhbHRlcmVkIGJ5IGFub3RoZXIgc2NyaXB0P1xcblwifTp7fTtmdW5jdGlvbiBSKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx0PVtdLG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rPTEpdC5wdXNoKG48MHx8YXJndW1lbnRzLmxlbmd0aDw9bj92b2lkIDA6YXJndW1lbnRzW25dKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtlPWUucmVwbGFjZSgvJVthLXpdLyx0KX0pKSxlfWZ1bmN0aW9uIEQoZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodD4xP3QtMTowKSxyPTE7cjx0O3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3Rocm93XCJwcm9kdWN0aW9uXCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOVj9uZXcgRXJyb3IoXCJBbiBlcnJvciBvY2N1cnJlZC4gU2VlIGh0dHBzOi8vZ2l0LmlvL0pVSWFFI1wiK2UrXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIrKG4ubGVuZ3RoPjA/XCIgQXJnczogXCIrbi5qb2luKFwiLCBcIik6XCJcIikpOm5ldyBFcnJvcihSLmFwcGx5KHZvaWQgMCxbT1tlXV0uY29uY2F0KG4pKS50cmltKCkpfXZhciBqPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLmdyb3VwU2l6ZXM9bmV3IFVpbnQzMkFycmF5KDUxMiksdGhpcy5sZW5ndGg9NTEyLHRoaXMudGFnPWV9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuaW5kZXhPZkdyb3VwPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49MDtuPGU7bisrKXQrPXRoaXMuZ3JvdXBTaXplc1tuXTtyZXR1cm4gdH0sdC5pbnNlcnRSdWxlcz1mdW5jdGlvbihlLHQpe2lmKGU+PXRoaXMuZ3JvdXBTaXplcy5sZW5ndGgpe2Zvcih2YXIgbj10aGlzLmdyb3VwU2l6ZXMscj1uLmxlbmd0aCxvPXI7ZT49bzspKG88PD0xKTwwJiZEKDE2LFwiXCIrZSk7dGhpcy5ncm91cFNpemVzPW5ldyBVaW50MzJBcnJheShvKSx0aGlzLmdyb3VwU2l6ZXMuc2V0KG4pLHRoaXMubGVuZ3RoPW87Zm9yKHZhciBzPXI7czxvO3MrKyl0aGlzLmdyb3VwU2l6ZXNbc109MH1mb3IodmFyIGk9dGhpcy5pbmRleE9mR3JvdXAoZSsxKSxhPTAsYz10Lmxlbmd0aDthPGM7YSsrKXRoaXMudGFnLmluc2VydFJ1bGUoaSx0W2FdKSYmKHRoaXMuZ3JvdXBTaXplc1tlXSsrLGkrKyl9LHQuY2xlYXJHcm91cD1mdW5jdGlvbihlKXtpZihlPHRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmdyb3VwU2l6ZXNbZV0sbj10aGlzLmluZGV4T2ZHcm91cChlKSxyPW4rdDt0aGlzLmdyb3VwU2l6ZXNbZV09MDtmb3IodmFyIG89bjtvPHI7bysrKXRoaXMudGFnLmRlbGV0ZVJ1bGUobil9fSx0LmdldEdyb3VwPWZ1bmN0aW9uKGUpe3ZhciB0PVwiXCI7aWYoZT49dGhpcy5sZW5ndGh8fDA9PT10aGlzLmdyb3VwU2l6ZXNbZV0pcmV0dXJuIHQ7Zm9yKHZhciBuPXRoaXMuZ3JvdXBTaXplc1tlXSxyPXRoaXMuaW5kZXhPZkdyb3VwKGUpLG89cituLHM9cjtzPG87cysrKXQrPXRoaXMudGFnLmdldFJ1bGUocykrXCIvKiFzYyovXFxuXCI7cmV0dXJuIHR9LGV9KCksVD1uZXcgTWFwLHg9bmV3IE1hcCxrPTEsVj1mdW5jdGlvbihlKXtpZihULmhhcyhlKSlyZXR1cm4gVC5nZXQoZSk7Zm9yKDt4LmhhcyhrKTspaysrO3ZhciB0PWsrKztyZXR1cm5cInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiYoKDB8dCk8MHx8dD4xPDwzMCkmJkQoMTYsXCJcIit0KSxULnNldChlLHQpLHguc2V0KHQsZSksdH0sQj1mdW5jdGlvbihlKXtyZXR1cm4geC5nZXQoZSl9LHo9ZnVuY3Rpb24oZSx0KXt0Pj1rJiYoaz10KzEpLFQuc2V0KGUsdCkseC5zZXQodCxlKX0sTT1cInN0eWxlW1wiK04rJ11bZGF0YS1zdHlsZWQtdmVyc2lvbj1cIjUuMy4xMVwiXScsRz1uZXcgUmVnRXhwKFwiXlwiK04rJ1xcXFwuZyhcXFxcZCspXFxcXFtpZD1cIihbXFxcXHdcXFxcZC1dKylcIlxcXFxdLio/XCIoW15cIl0qKScpLEw9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcixvPW4uc3BsaXQoXCIsXCIpLHM9MCxpPW8ubGVuZ3RoO3M8aTtzKyspKHI9b1tzXSkmJmUucmVnaXN0ZXJOYW1lKHQscil9LEY9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49KHQudGV4dENvbnRlbnR8fFwiXCIpLnNwbGl0KFwiLyohc2MqL1xcblwiKSxyPVtdLG89MCxzPW4ubGVuZ3RoO288cztvKyspe3ZhciBpPW5bb10udHJpbSgpO2lmKGkpe3ZhciBhPWkubWF0Y2goRyk7aWYoYSl7dmFyIGM9MHxwYXJzZUludChhWzFdLDEwKSx1PWFbMl07MCE9PWMmJih6KHUsYyksTChlLHUsYVszXSksZS5nZXRUYWcoKS5pbnNlcnRSdWxlcyhjLHIpKSxyLmxlbmd0aD0wfWVsc2Ugci5wdXNoKGkpfX19LFk9ZnVuY3Rpb24oKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgX193ZWJwYWNrX25vbmNlX18/X193ZWJwYWNrX25vbmNlX186bnVsbH0scT1mdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5oZWFkLG49ZXx8dCxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKSxvPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmNoaWxkTm9kZXMsbj10Lmxlbmd0aDtuPj0wO24tLSl7dmFyIHI9dFtuXTtpZihyJiYxPT09ci5ub2RlVHlwZSYmci5oYXNBdHRyaWJ1dGUoTikpcmV0dXJuIHJ9fShuKSxzPXZvaWQgMCE9PW8/by5uZXh0U2libGluZzpudWxsO3Iuc2V0QXR0cmlidXRlKE4sXCJhY3RpdmVcIiksci5zZXRBdHRyaWJ1dGUoXCJkYXRhLXN0eWxlZC12ZXJzaW9uXCIsXCI1LjMuMTFcIik7dmFyIGk9WSgpO3JldHVybiBpJiZyLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsaSksbi5pbnNlcnRCZWZvcmUocixzKSxyfSxIPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt2YXIgdD10aGlzLmVsZW1lbnQ9cShlKTt0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKSx0aGlzLnNoZWV0PWZ1bmN0aW9uKGUpe2lmKGUuc2hlZXQpcmV0dXJuIGUuc2hlZXQ7Zm9yKHZhciB0PWRvY3VtZW50LnN0eWxlU2hlZXRzLG49MCxyPXQubGVuZ3RoO248cjtuKyspe3ZhciBvPXRbbl07aWYoby5vd25lck5vZGU9PT1lKXJldHVybiBvfUQoMTcpfSh0KSx0aGlzLmxlbmd0aD0wfXZhciB0PWUucHJvdG90eXBlO3JldHVybiB0Lmluc2VydFJ1bGU9ZnVuY3Rpb24oZSx0KXt0cnl7cmV0dXJuIHRoaXMuc2hlZXQuaW5zZXJ0UnVsZSh0LGUpLHRoaXMubGVuZ3RoKyssITB9Y2F0Y2goZSl7cmV0dXJuITF9fSx0LmRlbGV0ZVJ1bGU9ZnVuY3Rpb24oZSl7dGhpcy5zaGVldC5kZWxldGVSdWxlKGUpLHRoaXMubGVuZ3RoLS19LHQuZ2V0UnVsZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNoZWV0LmNzc1J1bGVzW2VdO3JldHVybiB2b2lkIDAhPT10JiZcInN0cmluZ1wiPT10eXBlb2YgdC5jc3NUZXh0P3QuY3NzVGV4dDpcIlwifSxlfSgpLCQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3ZhciB0PXRoaXMuZWxlbWVudD1xKGUpO3RoaXMubm9kZXM9dC5jaGlsZE5vZGVzLHRoaXMubGVuZ3RoPTB9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuaW5zZXJ0UnVsZT1mdW5jdGlvbihlLHQpe2lmKGU8PXRoaXMubGVuZ3RoJiZlPj0wKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0KSxyPXRoaXMubm9kZXNbZV07cmV0dXJuIHRoaXMuZWxlbWVudC5pbnNlcnRCZWZvcmUobixyfHxudWxsKSx0aGlzLmxlbmd0aCsrLCEwfXJldHVybiExfSx0LmRlbGV0ZVJ1bGU9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMubm9kZXNbZV0pLHRoaXMubGVuZ3RoLS19LHQuZ2V0UnVsZT1mdW5jdGlvbihlKXtyZXR1cm4gZTx0aGlzLmxlbmd0aD90aGlzLm5vZGVzW2VdLnRleHRDb250ZW50OlwiXCJ9LGV9KCksVz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5ydWxlcz1bXSx0aGlzLmxlbmd0aD0wfXZhciB0PWUucHJvdG90eXBlO3JldHVybiB0Lmluc2VydFJ1bGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZTw9dGhpcy5sZW5ndGgmJih0aGlzLnJ1bGVzLnNwbGljZShlLDAsdCksdGhpcy5sZW5ndGgrKywhMCl9LHQuZGVsZXRlUnVsZT1mdW5jdGlvbihlKXt0aGlzLnJ1bGVzLnNwbGljZShlLDEpLHRoaXMubGVuZ3RoLS19LHQuZ2V0UnVsZT1mdW5jdGlvbihlKXtyZXR1cm4gZTx0aGlzLmxlbmd0aD90aGlzLnJ1bGVzW2VdOlwiXCJ9LGV9KCksVT1DLEo9e2lzU2VydmVyOiFDLHVzZUNTU09NSW5qZWN0aW9uOiFJfSxYPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7dm9pZCAwPT09ZSYmKGU9dyksdm9pZCAwPT09dCYmKHQ9e30pLHRoaXMub3B0aW9ucz15KHt9LEose30sZSksdGhpcy5ncz10LHRoaXMubmFtZXM9bmV3IE1hcChuKSx0aGlzLnNlcnZlcj0hIWUuaXNTZXJ2ZXIsIXRoaXMuc2VydmVyJiZDJiZVJiYoVT0hMSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChNKSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXt2YXIgbz10W25dO28mJlwiYWN0aXZlXCIhPT1vLmdldEF0dHJpYnV0ZShOKSYmKEYoZSxvKSxvLnBhcmVudE5vZGUmJm8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKSl9fSh0aGlzKSl9ZS5yZWdpc3RlcklkPWZ1bmN0aW9uKGUpe3JldHVybiBWKGUpfTt2YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5yZWNvbnN0cnVjdFdpdGhPcHRpb25zPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPSEwKSxuZXcgZSh5KHt9LHRoaXMub3B0aW9ucyx7fSx0KSx0aGlzLmdzLG4mJnRoaXMubmFtZXN8fHZvaWQgMCl9LHQuYWxsb2NhdGVHU0luc3RhbmNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdzW2VdPSh0aGlzLmdzW2VdfHwwKSsxfSx0LmdldFRhZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRhZ3x8KHRoaXMudGFnPShuPSh0PXRoaXMub3B0aW9ucykuaXNTZXJ2ZXIscj10LnVzZUNTU09NSW5qZWN0aW9uLG89dC50YXJnZXQsZT1uP25ldyBXKG8pOnI/bmV3IEgobyk6bmV3ICQobyksbmV3IGooZSkpKTt2YXIgZSx0LG4scixvfSx0Lmhhc05hbWVGb3JJZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm5hbWVzLmhhcyhlKSYmdGhpcy5uYW1lcy5nZXQoZSkuaGFzKHQpfSx0LnJlZ2lzdGVyTmFtZT1mdW5jdGlvbihlLHQpe2lmKFYoZSksdGhpcy5uYW1lcy5oYXMoZSkpdGhpcy5uYW1lcy5nZXQoZSkuYWRkKHQpO2Vsc2V7dmFyIG49bmV3IFNldDtuLmFkZCh0KSx0aGlzLm5hbWVzLnNldChlLG4pfX0sdC5pbnNlcnRSdWxlcz1mdW5jdGlvbihlLHQsbil7dGhpcy5yZWdpc3Rlck5hbWUoZSx0KSx0aGlzLmdldFRhZygpLmluc2VydFJ1bGVzKFYoZSksbil9LHQuY2xlYXJOYW1lcz1mdW5jdGlvbihlKXt0aGlzLm5hbWVzLmhhcyhlKSYmdGhpcy5uYW1lcy5nZXQoZSkuY2xlYXIoKX0sdC5jbGVhclJ1bGVzPWZ1bmN0aW9uKGUpe3RoaXMuZ2V0VGFnKCkuY2xlYXJHcm91cChWKGUpKSx0aGlzLmNsZWFyTmFtZXMoZSl9LHQuY2xlYXJUYWc9ZnVuY3Rpb24oKXt0aGlzLnRhZz12b2lkIDB9LHQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuZ2V0VGFnKCksbj10Lmxlbmd0aCxyPVwiXCIsbz0wO288bjtvKyspe3ZhciBzPUIobyk7aWYodm9pZCAwIT09cyl7dmFyIGk9ZS5uYW1lcy5nZXQocyksYT10LmdldEdyb3VwKG8pO2lmKGkmJmEmJmkuc2l6ZSl7dmFyIGM9TitcIi5nXCIrbysnW2lkPVwiJytzKydcIl0nLHU9XCJcIjt2b2lkIDAhPT1pJiZpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UubGVuZ3RoPjAmJih1Kz1lK1wiLFwiKX0pKSxyKz1cIlwiK2ErYysne2NvbnRlbnQ6XCInK3UrJ1wifS8qIXNjKi9cXG4nfX19cmV0dXJuIHJ9KHRoaXMpfSxlfSgpLFo9LyhhKShkKS9naSxLPWZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUrKGU+MjU/Mzk6OTcpKX07ZnVuY3Rpb24gUShlKXt2YXIgdCxuPVwiXCI7Zm9yKHQ9TWF0aC5hYnMoZSk7dD41Mjt0PXQvNTJ8MCluPUsodCU1MikrbjtyZXR1cm4oSyh0JTUyKStuKS5yZXBsYWNlKFosXCIkMS0kMlwiKX12YXIgZWU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dC5sZW5ndGg7bjspZT0zMyplXnQuY2hhckNvZGVBdCgtLW4pO3JldHVybiBlfSx0ZT1mdW5jdGlvbihlKXtyZXR1cm4gZWUoNTM4MSxlKX07ZnVuY3Rpb24gbmUoZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kz0xKXt2YXIgbj1lW3RdO2lmKEUobikmJiFfKG4pKXJldHVybiExfXJldHVybiEwfXZhciByZT10ZShcIjUuMy4xMVwiKSxvZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4pe3RoaXMucnVsZXM9ZSx0aGlzLnN0YXRpY1J1bGVzSWQ9XCJcIix0aGlzLmlzU3RhdGljPVwicHJvZHVjdGlvblwiPT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJih2b2lkIDA9PT1ufHxuLmlzU3RhdGljKSYmbmUoZSksdGhpcy5jb21wb25lbnRJZD10LHRoaXMuYmFzZUhhc2g9ZWUocmUsdCksdGhpcy5iYXNlU3R5bGU9bixYLnJlZ2lzdGVySWQodCl9cmV0dXJuIGUucHJvdG90eXBlLmdlbmVyYXRlQW5kSW5qZWN0U3R5bGVzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmNvbXBvbmVudElkLG89W107aWYodGhpcy5iYXNlU3R5bGUmJm8ucHVzaCh0aGlzLmJhc2VTdHlsZS5nZW5lcmF0ZUFuZEluamVjdFN0eWxlcyhlLHQsbikpLHRoaXMuaXNTdGF0aWMmJiFuLmhhc2gpaWYodGhpcy5zdGF0aWNSdWxlc0lkJiZ0Lmhhc05hbWVGb3JJZChyLHRoaXMuc3RhdGljUnVsZXNJZCkpby5wdXNoKHRoaXMuc3RhdGljUnVsZXNJZCk7ZWxzZXt2YXIgcz1fZSh0aGlzLnJ1bGVzLGUsdCxuKS5qb2luKFwiXCIpLGk9UShlZSh0aGlzLmJhc2VIYXNoLHMpPj4+MCk7aWYoIXQuaGFzTmFtZUZvcklkKHIsaSkpe3ZhciBhPW4ocyxcIi5cIitpLHZvaWQgMCxyKTt0Lmluc2VydFJ1bGVzKHIsaSxhKX1vLnB1c2goaSksdGhpcy5zdGF0aWNSdWxlc0lkPWl9ZWxzZXtmb3IodmFyIGM9dGhpcy5ydWxlcy5sZW5ndGgsdT1lZSh0aGlzLmJhc2VIYXNoLG4uaGFzaCksbD1cIlwiLGQ9MDtkPGM7ZCsrKXt2YXIgaD10aGlzLnJ1bGVzW2RdO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBoKWwrPWgsXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmKHU9ZWUodSxoK2QpKTtlbHNlIGlmKGgpe3ZhciBwPV9lKGgsZSx0LG4pLGY9QXJyYXkuaXNBcnJheShwKT9wLmpvaW4oXCJcIik6cDt1PWVlKHUsZitkKSxsKz1mfX1pZihsKXt2YXIgbT1RKHU+Pj4wKTtpZighdC5oYXNOYW1lRm9ySWQocixtKSl7dmFyIHk9bihsLFwiLlwiK20sdm9pZCAwLHIpO3QuaW5zZXJ0UnVsZXMocixtLHkpfW8ucHVzaChtKX19cmV0dXJuIG8uam9pbihcIiBcIil9LGV9KCksc2U9L15cXHMqXFwvXFwvLiokL2dtLGllPVtcIjpcIixcIltcIixcIi5cIixcIiNcIl07ZnVuY3Rpb24gYWUoZSl7dmFyIHQsbixyLG8scz12b2lkIDA9PT1lP3c6ZSxpPXMub3B0aW9ucyxhPXZvaWQgMD09PWk/dzppLGM9cy5wbHVnaW5zLHU9dm9pZCAwPT09Yz9TOmMsbD1uZXcgaChhKSxkPVtdLHA9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtpZih0KXRyeXtlKHQrXCJ9XCIpfWNhdGNoKGUpe319cmV0dXJuIGZ1bmN0aW9uKG4scixvLHMsaSxhLGMsdSxsLGQpe3N3aXRjaChuKXtjYXNlIDE6aWYoMD09PWwmJjY0PT09ci5jaGFyQ29kZUF0KDApKXJldHVybiBlKHIrXCI7XCIpLFwiXCI7YnJlYWs7Y2FzZSAyOmlmKDA9PT11KXJldHVybiByK1wiLyp8Ki9cIjticmVhaztjYXNlIDM6c3dpdGNoKHUpe2Nhc2UgMTAyOmNhc2UgMTEyOnJldHVybiBlKG9bMF0rciksXCJcIjtkZWZhdWx0OnJldHVybiByKygwPT09ZD9cIi8qfCovXCI6XCJcIil9Y2FzZS0yOnIuc3BsaXQoXCIvKnwqL31cIikuZm9yRWFjaCh0KX19fSgoZnVuY3Rpb24oZSl7ZC5wdXNoKGUpfSkpLGY9ZnVuY3Rpb24oZSxyLHMpe3JldHVybiAwPT09ciYmLTEhPT1pZS5pbmRleE9mKHNbbi5sZW5ndGhdKXx8cy5tYXRjaChvKT9lOlwiLlwiK3R9O2Z1bmN0aW9uIG0oZSxzLGksYSl7dm9pZCAwPT09YSYmKGE9XCImXCIpO3ZhciBjPWUucmVwbGFjZShzZSxcIlwiKSx1PXMmJmk/aStcIiBcIitzK1wiIHsgXCIrYytcIiB9XCI6YztyZXR1cm4gdD1hLG49cyxyPW5ldyBSZWdFeHAoXCJcXFxcXCIrbitcIlxcXFxiXCIsXCJnXCIpLG89bmV3IFJlZ0V4cChcIihcXFxcXCIrbitcIlxcXFxiKXsyLH1cIiksbChpfHwhcz9cIlwiOnMsdSl9cmV0dXJuIGwudXNlKFtdLmNvbmNhdCh1LFtmdW5jdGlvbihlLHQsbyl7Mj09PWUmJm8ubGVuZ3RoJiZvWzBdLmxhc3RJbmRleE9mKG4pPjAmJihvWzBdPW9bMF0ucmVwbGFjZShyLGYpKX0scCxmdW5jdGlvbihlKXtpZigtMj09PWUpe3ZhciB0PWQ7cmV0dXJuIGQ9W10sdH19XSkpLG0uaGFzaD11Lmxlbmd0aD91LnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5uYW1lfHxEKDE1KSxlZShlLHQubmFtZSl9KSw1MzgxKS50b1N0cmluZygpOlwiXCIsbX12YXIgY2U9ci5jcmVhdGVDb250ZXh0KCksdWU9Y2UuQ29uc3VtZXIsbGU9ci5jcmVhdGVDb250ZXh0KCksZGU9KGxlLkNvbnN1bWVyLG5ldyBYKSxoZT1hZSgpO2Z1bmN0aW9uIHBlKCl7cmV0dXJuIHMoY2UpfHxkZX1mdW5jdGlvbiBmZSgpe3JldHVybiBzKGxlKXx8aGV9ZnVuY3Rpb24gbWUoZSl7dmFyIHQ9byhlLnN0eWxpc1BsdWdpbnMpLG49dFswXSxzPXRbMV0sYz1wZSgpLHU9aSgoZnVuY3Rpb24oKXt2YXIgdD1jO3JldHVybiBlLnNoZWV0P3Q9ZS5zaGVldDplLnRhcmdldCYmKHQ9dC5yZWNvbnN0cnVjdFdpdGhPcHRpb25zKHt0YXJnZXQ6ZS50YXJnZXR9LCExKSksZS5kaXNhYmxlQ1NTT01JbmplY3Rpb24mJih0PXQucmVjb25zdHJ1Y3RXaXRoT3B0aW9ucyh7dXNlQ1NTT01JbmplY3Rpb246ITF9KSksdH0pLFtlLmRpc2FibGVDU1NPTUluamVjdGlvbixlLnNoZWV0LGUudGFyZ2V0XSksbD1pKChmdW5jdGlvbigpe3JldHVybiBhZSh7b3B0aW9uczp7cHJlZml4OiFlLmRpc2FibGVWZW5kb3JQcmVmaXhlc30scGx1Z2luczpufSl9KSxbZS5kaXNhYmxlVmVuZG9yUHJlZml4ZXMsbl0pO3JldHVybiBhKChmdW5jdGlvbigpe2QobixlLnN0eWxpc1BsdWdpbnMpfHxzKGUuc3R5bGlzUGx1Z2lucyl9KSxbZS5zdHlsaXNQbHVnaW5zXSksci5jcmVhdGVFbGVtZW50KGNlLlByb3ZpZGVyLHt2YWx1ZTp1fSxyLmNyZWF0ZUVsZW1lbnQobGUuUHJvdmlkZXIse3ZhbHVlOmx9LFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlY/ci5DaGlsZHJlbi5vbmx5KGUuY2hpbGRyZW4pOmUuY2hpbGRyZW4pKX12YXIgeWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7dmFyIG49dGhpczt0aGlzLmluamVjdD1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PXQmJih0PWhlKTt2YXIgcj1uLm5hbWUrdC5oYXNoO2UuaGFzTmFtZUZvcklkKG4uaWQscil8fGUuaW5zZXJ0UnVsZXMobi5pZCxyLHQobi5ydWxlcyxyLFwiQGtleWZyYW1lc1wiKSl9LHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gRCgxMixTdHJpbmcobi5uYW1lKSl9LHRoaXMubmFtZT1lLHRoaXMuaWQ9XCJzYy1rZXlmcmFtZXMtXCIrZSx0aGlzLnJ1bGVzPXR9cmV0dXJuIGUucHJvdG90eXBlLmdldE5hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWhlKSx0aGlzLm5hbWUrZS5oYXNofSxlfSgpLHZlPS8oW0EtWl0pLyxnZT0vKFtBLVpdKS9nLFNlPS9ebXMtLyx3ZT1mdW5jdGlvbihlKXtyZXR1cm5cIi1cIitlLnRvTG93ZXJDYXNlKCl9O2Z1bmN0aW9uIEVlKGUpe3JldHVybiB2ZS50ZXN0KGUpP2UucmVwbGFjZShnZSx3ZSkucmVwbGFjZShTZSxcIi1tcy1cIik6ZX12YXIgYmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV8fCExPT09ZXx8XCJcIj09PWV9O2Z1bmN0aW9uIF9lKGUsbixyLG8pe2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgcyxpPVtdLGE9MCxjPWUubGVuZ3RoO2E8YzthKz0xKVwiXCIhPT0ocz1fZShlW2FdLG4scixvKSkmJihBcnJheS5pc0FycmF5KHMpP2kucHVzaC5hcHBseShpLHMpOmkucHVzaChzKSk7cmV0dXJuIGl9aWYoYmUoZSkpcmV0dXJuXCJcIjtpZihfKGUpKXJldHVyblwiLlwiK2Uuc3R5bGVkQ29tcG9uZW50SWQ7aWYoRShlKSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YobD1lKXx8bC5wcm90b3R5cGUmJmwucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnR8fCFuKXJldHVybiBlO3ZhciB1PWUobik7cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmdCh1KSYmY29uc29sZS53YXJuKGIoZSkrXCIgaXMgbm90IGEgc3R5bGVkIGNvbXBvbmVudCBhbmQgY2Fubm90IGJlIHJlZmVycmVkIHRvIHZpYSBjb21wb25lbnQgc2VsZWN0b3IuIFNlZSBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9hZHZhbmNlZCNyZWZlcnJpbmctdG8tb3RoZXItY29tcG9uZW50cyBmb3IgbW9yZSBkZXRhaWxzLlwiKSxfZSh1LG4scixvKX12YXIgbDtyZXR1cm4gZSBpbnN0YW5jZW9mIHllP3I/KGUuaW5qZWN0KHIsbyksZS5nZXROYW1lKG8pKTplOmcoZSk/ZnVuY3Rpb24gZSh0LG4pe3ZhciByLG8scz1bXTtmb3IodmFyIGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiYhYmUodFtpXSkmJihBcnJheS5pc0FycmF5KHRbaV0pJiZ0W2ldLmlzQ3NzfHxFKHRbaV0pP3MucHVzaChFZShpKStcIjpcIix0W2ldLFwiO1wiKTpnKHRbaV0pP3MucHVzaC5hcHBseShzLGUodFtpXSxpKSk6cy5wdXNoKEVlKGkpK1wiOiBcIisocj1pLG51bGw9PShvPXRbaV0pfHxcImJvb2xlYW5cIj09dHlwZW9mIG98fFwiXCI9PT1vP1wiXCI6XCJudW1iZXJcIiE9dHlwZW9mIG98fDA9PT1vfHxyIGluIHB8fHIuc3RhcnRzV2l0aChcIi0tXCIpP1N0cmluZyhvKS50cmltKCk6bytcInB4XCIpK1wiO1wiKSk7cmV0dXJuIG4/W24rXCIge1wiXS5jb25jYXQocyxbXCJ9XCJdKTpzfShlKTplLnRvU3RyaW5nKCl9dmFyIE5lPWZ1bmN0aW9uKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiYoZS5pc0Nzcz0hMCksZX07ZnVuY3Rpb24gQWUoZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodD4xP3QtMTowKSxyPTE7cjx0O3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3JldHVybiBFKGUpfHxnKGUpP05lKF9lKHYoUyxbZV0uY29uY2F0KG4pKSkpOjA9PT1uLmxlbmd0aCYmMT09PWUubGVuZ3RoJiZcInN0cmluZ1wiPT10eXBlb2YgZVswXT9lOk5lKF9lKHYoZSxuKSkpfXZhciBDZT0vaW52YWxpZCBob29rIGNhbGwvaSxJZT1uZXcgU2V0LFBlPWZ1bmN0aW9uKGUsdCl7aWYoXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOVil7dmFyIG49XCJUaGUgY29tcG9uZW50IFwiK2UrKHQ/JyB3aXRoIHRoZSBpZCBvZiBcIicrdCsnXCInOlwiXCIpK1wiIGhhcyBiZWVuIGNyZWF0ZWQgZHluYW1pY2FsbHkuXFxuWW91IG1heSBzZWUgdGhpcyB3YXJuaW5nIGJlY2F1c2UgeW91J3ZlIGNhbGxlZCBzdHlsZWQgaW5zaWRlIGFub3RoZXIgY29tcG9uZW50LlxcblRvIHJlc29sdmUgdGhpcyBvbmx5IGNyZWF0ZSBuZXcgU3R5bGVkQ29tcG9uZW50cyBvdXRzaWRlIG9mIGFueSByZW5kZXIgbWV0aG9kIGFuZCBmdW5jdGlvbiBjb21wb25lbnQuXCIscj1jb25zb2xlLmVycm9yO3RyeXt2YXIgbz0hMDtjb25zb2xlLmVycm9yPWZ1bmN0aW9uKGUpe2lmKENlLnRlc3QoZSkpbz0hMSxJZS5kZWxldGUobik7ZWxzZXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxzPW5ldyBBcnJheSh0PjE/dC0xOjApLGk9MTtpPHQ7aSsrKXNbaS0xXT1hcmd1bWVudHNbaV07ci5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdChzKSl9fSxjKCksbyYmIUllLmhhcyhuKSYmKGNvbnNvbGUud2FybihuKSxJZS5hZGQobikpfWNhdGNoKGUpe0NlLnRlc3QoZS5tZXNzYWdlKSYmSWUuZGVsZXRlKG4pfWZpbmFsbHl7Y29uc29sZS5lcnJvcj1yfX19LE9lPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49dyksZS50aGVtZSE9PW4udGhlbWUmJmUudGhlbWV8fHR8fG4udGhlbWV9LFJlPS9bIVwiIyQlJicoKSorLC4vOjs8PT4/QFtcXFxcXFxdXmB7fH1+LV0rL2csRGU9LyheLXwtJCkvZztmdW5jdGlvbiBqZShlKXtyZXR1cm4gZS5yZXBsYWNlKFJlLFwiLVwiKS5yZXBsYWNlKERlLFwiXCIpfXZhciBUZT1mdW5jdGlvbihlKXtyZXR1cm4gUSh0ZShlKT4+PjApfTtmdW5jdGlvbiB4ZShlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZSYmKFwicHJvZHVjdGlvblwiPT09cHJvY2Vzcy5lbnYuTk9ERV9FTlZ8fGUuY2hhckF0KDApPT09ZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSl9dmFyIGtlPWZ1bmN0aW9uKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGV8fFwib2JqZWN0XCI9PXR5cGVvZiBlJiZudWxsIT09ZSYmIUFycmF5LmlzQXJyYXkoZSl9LFZlPWZ1bmN0aW9uKGUpe3JldHVyblwiX19wcm90b19fXCIhPT1lJiZcImNvbnN0cnVjdG9yXCIhPT1lJiZcInByb3RvdHlwZVwiIT09ZX07ZnVuY3Rpb24gQmUoZSx0LG4pe3ZhciByPWVbbl07a2UodCkmJmtlKHIpP3plKHIsdCk6ZVtuXT10fWZ1bmN0aW9uIHplKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCkscj0xO3I8dDtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtmb3IodmFyIG89MCxzPW47bzxzLmxlbmd0aDtvKyspe3ZhciBpPXNbb107aWYoa2UoaSkpZm9yKHZhciBhIGluIGkpVmUoYSkmJkJlKGUsaVthXSxhKX1yZXR1cm4gZX12YXIgTWU9ci5jcmVhdGVDb250ZXh0KCksR2U9TWUuQ29uc3VtZXI7ZnVuY3Rpb24gTGUoZSl7dmFyIHQ9cyhNZSksbj1pKChmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQpe2lmKCFlKXJldHVybiBEKDE0KTtpZihFKGUpKXt2YXIgbj1lKHQpO3JldHVyblwicHJvZHVjdGlvblwiPT09cHJvY2Vzcy5lbnYuTk9ERV9FTlZ8fG51bGwhPT1uJiYhQXJyYXkuaXNBcnJheShuKSYmXCJvYmplY3RcIj09dHlwZW9mIG4/bjpEKDcpfXJldHVybiBBcnJheS5pc0FycmF5KGUpfHxcIm9iamVjdFwiIT10eXBlb2YgZT9EKDgpOnQ/eSh7fSx0LHt9LGUpOmV9KGUudGhlbWUsdCl9KSxbZS50aGVtZSx0XSk7cmV0dXJuIGUuY2hpbGRyZW4/ci5jcmVhdGVFbGVtZW50KE1lLlByb3ZpZGVyLHt2YWx1ZTpufSxlLmNoaWxkcmVuKTpudWxsfXZhciBGZT17fTtmdW5jdGlvbiBZZShlLHQsbil7dmFyIG89XyhlKSxpPSF4ZShlKSxhPXQuYXR0cnMsYz12b2lkIDA9PT1hP1M6YSxsPXQuY29tcG9uZW50SWQsZD12b2lkIDA9PT1sP2Z1bmN0aW9uKGUsdCl7dmFyIG49XCJzdHJpbmdcIiE9dHlwZW9mIGU/XCJzY1wiOmplKGUpO0ZlW25dPShGZVtuXXx8MCkrMTt2YXIgcj1uK1wiLVwiK1RlKFwiNS4zLjExXCIrbitGZVtuXSk7cmV0dXJuIHQ/dCtcIi1cIityOnJ9KHQuZGlzcGxheU5hbWUsdC5wYXJlbnRDb21wb25lbnRJZCk6bCxoPXQuZGlzcGxheU5hbWUscD12b2lkIDA9PT1oP2Z1bmN0aW9uKGUpe3JldHVybiB4ZShlKT9cInN0eWxlZC5cIitlOlwiU3R5bGVkKFwiK2IoZSkrXCIpXCJ9KGUpOmgsdj10LmRpc3BsYXlOYW1lJiZ0LmNvbXBvbmVudElkP2plKHQuZGlzcGxheU5hbWUpK1wiLVwiK3QuY29tcG9uZW50SWQ6dC5jb21wb25lbnRJZHx8ZCxnPW8mJmUuYXR0cnM/QXJyYXkucHJvdG90eXBlLmNvbmNhdChlLmF0dHJzLGMpLmZpbHRlcihCb29sZWFuKTpjLE49dC5zaG91bGRGb3J3YXJkUHJvcDtvJiZlLnNob3VsZEZvcndhcmRQcm9wJiYoTj10LnNob3VsZEZvcndhcmRQcm9wP2Z1bmN0aW9uKG4scixvKXtyZXR1cm4gZS5zaG91bGRGb3J3YXJkUHJvcChuLHIsbykmJnQuc2hvdWxkRm9yd2FyZFByb3AobixyLG8pfTplLnNob3VsZEZvcndhcmRQcm9wKTt2YXIgQSxDPW5ldyBvZShuLHYsbz9lLmNvbXBvbmVudFN0eWxlOnZvaWQgMCksST1DLmlzU3RhdGljJiYwPT09Yy5sZW5ndGgsUD1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1lLmF0dHJzLGk9ZS5jb21wb25lbnRTdHlsZSxhPWUuZGVmYXVsdFByb3BzLGM9ZS5mb2xkZWRDb21wb25lbnRJZHMsbD1lLnNob3VsZEZvcndhcmRQcm9wLGQ9ZS5zdHlsZWRDb21wb25lbnRJZCxoPWUudGFyZ2V0LHA9ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PWUmJihlPXcpO3ZhciByPXkoe30sdCx7dGhlbWU6ZX0pLG89e307cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQsbixzLGk9ZTtmb3IodCBpbiBFKGkpJiYoaT1pKHIpKSxpKXJbdF09b1t0XT1cImNsYXNzTmFtZVwiPT09dD8obj1vW3RdLHM9aVt0XSxuJiZzP24rXCIgXCIrczpufHxzKTppW3RdfSkpLFtyLG9dfShPZSh0LHMoTWUpLGEpfHx3LHQsbyksbT1wWzBdLHY9cFsxXSxnPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXBlKCkscz1mZSgpLGk9dD9lLmdlbmVyYXRlQW5kSW5qZWN0U3R5bGVzKHcsbyxzKTplLmdlbmVyYXRlQW5kSW5qZWN0U3R5bGVzKG4sbyxzKTtyZXR1cm5cInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiYhdCYmciYmcihpKSxpfShpLHIsbSxcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WP2Uud2FyblRvb01hbnlDbGFzc2VzOnZvaWQgMCksUz1uLGI9di4kYXN8fHQuJGFzfHx2LmFzfHx0LmFzfHxoLF89eGUoYiksTj12IT09dD95KHt9LHQse30sdik6dCxBPXt9O2Zvcih2YXIgQyBpbiBOKVwiJFwiIT09Q1swXSYmXCJhc1wiIT09QyYmKFwiZm9yd2FyZGVkQXNcIj09PUM/QS5hcz1OW0NdOihsP2woQyxmLGIpOiFffHxmKEMpKSYmKEFbQ109TltDXSkpO3JldHVybiB0LnN0eWxlJiZ2LnN0eWxlIT09dC5zdHlsZSYmKEEuc3R5bGU9eSh7fSx0LnN0eWxlLHt9LHYuc3R5bGUpKSxBLmNsYXNzTmFtZT1BcnJheS5wcm90b3R5cGUuY29uY2F0KGMsZCxnIT09ZD9nOm51bGwsdC5jbGFzc05hbWUsdi5jbGFzc05hbWUpLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKSxBLnJlZj1TLHUoYixBKX0oQSxlLHQsSSl9O3JldHVybiBQLmRpc3BsYXlOYW1lPXAsKEE9ci5mb3J3YXJkUmVmKFApKS5hdHRycz1nLEEuY29tcG9uZW50U3R5bGU9QyxBLmRpc3BsYXlOYW1lPXAsQS5zaG91bGRGb3J3YXJkUHJvcD1OLEEuZm9sZGVkQ29tcG9uZW50SWRzPW8/QXJyYXkucHJvdG90eXBlLmNvbmNhdChlLmZvbGRlZENvbXBvbmVudElkcyxlLnN0eWxlZENvbXBvbmVudElkKTpTLEEuc3R5bGVkQ29tcG9uZW50SWQ9dixBLnRhcmdldD1vP2UudGFyZ2V0OmUsQS53aXRoQ29tcG9uZW50PWZ1bmN0aW9uKGUpe3ZhciByPXQuY29tcG9uZW50SWQsbz1mdW5jdGlvbihlLHQpe2lmKG51bGw9PWUpcmV0dXJue307dmFyIG4scixvPXt9LHM9T2JqZWN0LmtleXMoZSk7Zm9yKHI9MDtyPHMubGVuZ3RoO3IrKyluPXNbcl0sdC5pbmRleE9mKG4pPj0wfHwob1tuXT1lW25dKTtyZXR1cm4gb30odCxbXCJjb21wb25lbnRJZFwiXSkscz1yJiZyK1wiLVwiKyh4ZShlKT9lOmplKGIoZSkpKTtyZXR1cm4gWWUoZSx5KHt9LG8se2F0dHJzOmcsY29tcG9uZW50SWQ6c30pLG4pfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQSxcImRlZmF1bHRQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9sZGVkRGVmYXVsdFByb3BzfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZm9sZGVkRGVmYXVsdFByb3BzPW8/emUoe30sZS5kZWZhdWx0UHJvcHMsdCk6dH19KSxcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiYoUGUocCx2KSxBLndhcm5Ub29NYW55Q2xhc3Nlcz1mdW5jdGlvbihlLHQpe3ZhciBuPXt9LHI9ITE7cmV0dXJuIGZ1bmN0aW9uKG8pe2lmKCFyJiYobltvXT0hMCxPYmplY3Qua2V5cyhuKS5sZW5ndGg+PTIwMCkpe3ZhciBzPXQ/JyB3aXRoIHRoZSBpZCBvZiBcIicrdCsnXCInOlwiXCI7Y29uc29sZS53YXJuKFwiT3ZlciAyMDAgY2xhc3NlcyB3ZXJlIGdlbmVyYXRlZCBmb3IgY29tcG9uZW50IFwiK2UrcytcIi5cXG5Db25zaWRlciB1c2luZyB0aGUgYXR0cnMgbWV0aG9kLCB0b2dldGhlciB3aXRoIGEgc3R5bGUgb2JqZWN0IGZvciBmcmVxdWVudGx5IGNoYW5nZWQgc3R5bGVzLlxcbkV4YW1wbGU6XFxuICBjb25zdCBDb21wb25lbnQgPSBzdHlsZWQuZGl2LmF0dHJzKHByb3BzID0+ICh7XFxuICAgIHN0eWxlOiB7XFxuICAgICAgYmFja2dyb3VuZDogcHJvcHMuYmFja2dyb3VuZCxcXG4gICAgfSxcXG4gIH0pKWB3aWR0aDogMTAwJTtgXFxuXFxuICA8Q29tcG9uZW50IC8+XCIpLHI9ITAsbj17fX19fShwLHYpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQSxcInRvU3RyaW5nXCIse3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuXCIuXCIrQS5zdHlsZWRDb21wb25lbnRJZH19KSxpJiZtKEEsZSx7YXR0cnM6ITAsY29tcG9uZW50U3R5bGU6ITAsZGlzcGxheU5hbWU6ITAsZm9sZGVkQ29tcG9uZW50SWRzOiEwLHNob3VsZEZvcndhcmRQcm9wOiEwLHN0eWxlZENvbXBvbmVudElkOiEwLHRhcmdldDohMCx3aXRoQ29tcG9uZW50OiEwfSksQX12YXIgcWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIGUodCxyLG8pe2lmKHZvaWQgMD09PW8mJihvPXcpLCFuKHIpKXJldHVybiBEKDEsU3RyaW5nKHIpKTt2YXIgcz1mdW5jdGlvbigpe3JldHVybiB0KHIsbyxBZS5hcHBseSh2b2lkIDAsYXJndW1lbnRzKSl9O3JldHVybiBzLndpdGhDb25maWc9ZnVuY3Rpb24obil7cmV0dXJuIGUodCxyLHkoe30sbyx7fSxuKSl9LHMuYXR0cnM9ZnVuY3Rpb24obil7cmV0dXJuIGUodCxyLHkoe30sbyx7YXR0cnM6QXJyYXkucHJvdG90eXBlLmNvbmNhdChvLmF0dHJzLG4pLmZpbHRlcihCb29sZWFuKX0pKX0sc30oWWUsZSl9O1tcImFcIixcImFiYnJcIixcImFkZHJlc3NcIixcImFyZWFcIixcImFydGljbGVcIixcImFzaWRlXCIsXCJhdWRpb1wiLFwiYlwiLFwiYmFzZVwiLFwiYmRpXCIsXCJiZG9cIixcImJpZ1wiLFwiYmxvY2txdW90ZVwiLFwiYm9keVwiLFwiYnJcIixcImJ1dHRvblwiLFwiY2FudmFzXCIsXCJjYXB0aW9uXCIsXCJjaXRlXCIsXCJjb2RlXCIsXCJjb2xcIixcImNvbGdyb3VwXCIsXCJkYXRhXCIsXCJkYXRhbGlzdFwiLFwiZGRcIixcImRlbFwiLFwiZGV0YWlsc1wiLFwiZGZuXCIsXCJkaWFsb2dcIixcImRpdlwiLFwiZGxcIixcImR0XCIsXCJlbVwiLFwiZW1iZWRcIixcImZpZWxkc2V0XCIsXCJmaWdjYXB0aW9uXCIsXCJmaWd1cmVcIixcImZvb3RlclwiLFwiZm9ybVwiLFwiaDFcIixcImgyXCIsXCJoM1wiLFwiaDRcIixcImg1XCIsXCJoNlwiLFwiaGVhZFwiLFwiaGVhZGVyXCIsXCJoZ3JvdXBcIixcImhyXCIsXCJodG1sXCIsXCJpXCIsXCJpZnJhbWVcIixcImltZ1wiLFwiaW5wdXRcIixcImluc1wiLFwia2JkXCIsXCJrZXlnZW5cIixcImxhYmVsXCIsXCJsZWdlbmRcIixcImxpXCIsXCJsaW5rXCIsXCJtYWluXCIsXCJtYXBcIixcIm1hcmtcIixcIm1hcnF1ZWVcIixcIm1lbnVcIixcIm1lbnVpdGVtXCIsXCJtZXRhXCIsXCJtZXRlclwiLFwibmF2XCIsXCJub3NjcmlwdFwiLFwib2JqZWN0XCIsXCJvbFwiLFwib3B0Z3JvdXBcIixcIm9wdGlvblwiLFwib3V0cHV0XCIsXCJwXCIsXCJwYXJhbVwiLFwicGljdHVyZVwiLFwicHJlXCIsXCJwcm9ncmVzc1wiLFwicVwiLFwicnBcIixcInJ0XCIsXCJydWJ5XCIsXCJzXCIsXCJzYW1wXCIsXCJzY3JpcHRcIixcInNlY3Rpb25cIixcInNlbGVjdFwiLFwic21hbGxcIixcInNvdXJjZVwiLFwic3BhblwiLFwic3Ryb25nXCIsXCJzdHlsZVwiLFwic3ViXCIsXCJzdW1tYXJ5XCIsXCJzdXBcIixcInRhYmxlXCIsXCJ0Ym9keVwiLFwidGRcIixcInRleHRhcmVhXCIsXCJ0Zm9vdFwiLFwidGhcIixcInRoZWFkXCIsXCJ0aW1lXCIsXCJ0aXRsZVwiLFwidHJcIixcInRyYWNrXCIsXCJ1XCIsXCJ1bFwiLFwidmFyXCIsXCJ2aWRlb1wiLFwid2JyXCIsXCJjaXJjbGVcIixcImNsaXBQYXRoXCIsXCJkZWZzXCIsXCJlbGxpcHNlXCIsXCJmb3JlaWduT2JqZWN0XCIsXCJnXCIsXCJpbWFnZVwiLFwibGluZVwiLFwibGluZWFyR3JhZGllbnRcIixcIm1hcmtlclwiLFwibWFza1wiLFwicGF0aFwiLFwicGF0dGVyblwiLFwicG9seWdvblwiLFwicG9seWxpbmVcIixcInJhZGlhbEdyYWRpZW50XCIsXCJyZWN0XCIsXCJzdG9wXCIsXCJzdmdcIixcInRleHRcIixcInRleHRQYXRoXCIsXCJ0c3BhblwiXS5mb3JFYWNoKChmdW5jdGlvbihlKXtxZVtlXT1xZShlKX0pKTt2YXIgSGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7dGhpcy5ydWxlcz1lLHRoaXMuY29tcG9uZW50SWQ9dCx0aGlzLmlzU3RhdGljPW5lKGUpLFgucmVnaXN0ZXJJZCh0aGlzLmNvbXBvbmVudElkKzEpfXZhciB0PWUucHJvdG90eXBlO3JldHVybiB0LmNyZWF0ZVN0eWxlcz1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1yKF9lKHRoaXMucnVsZXMsdCxuLHIpLmpvaW4oXCJcIiksXCJcIikscz10aGlzLmNvbXBvbmVudElkK2U7bi5pbnNlcnRSdWxlcyhzLHMsbyl9LHQucmVtb3ZlU3R5bGVzPWZ1bmN0aW9uKGUsdCl7dC5jbGVhclJ1bGVzKHRoaXMuY29tcG9uZW50SWQrZSl9LHQucmVuZGVyU3R5bGVzPWZ1bmN0aW9uKGUsdCxuLHIpe2U+MiYmWC5yZWdpc3RlcklkKHRoaXMuY29tcG9uZW50SWQrZSksdGhpcy5yZW1vdmVTdHlsZXMoZSxuKSx0aGlzLmNyZWF0ZVN0eWxlcyhlLHQsbixyKX0sZX0oKTtmdW5jdGlvbiAkZShlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0PjE/dC0xOjApLG89MTtvPHQ7bysrKW5bby0xXT1hcmd1bWVudHNbb107dmFyIGk9QWUuYXBwbHkodm9pZCAwLFtlXS5jb25jYXQobikpLGE9XCJzYy1nbG9iYWwtXCIrVGUoSlNPTi5zdHJpbmdpZnkoaSkpLHU9bmV3IEhlKGksYSk7ZnVuY3Rpb24gZChlKXt2YXIgdD1wZSgpLG49ZmUoKSxvPXMoTWUpLGQ9Yyh0LmFsbG9jYXRlR1NJbnN0YW5jZShhKSkuY3VycmVudDtyZXR1cm5cInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZyLkNoaWxkcmVuLmNvdW50KGUuY2hpbGRyZW4pJiZjb25zb2xlLndhcm4oXCJUaGUgZ2xvYmFsIHN0eWxlIGNvbXBvbmVudCBcIithK1wiIHdhcyBnaXZlbiBjaGlsZCBKU1guIGNyZWF0ZUdsb2JhbFN0eWxlIGRvZXMgbm90IHJlbmRlciBjaGlsZHJlbi5cIiksXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmaS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZSYmLTEhPT1lLmluZGV4T2YoXCJAaW1wb3J0XCIpfSkpJiZjb25zb2xlLndhcm4oXCJQbGVhc2UgZG8gbm90IHVzZSBAaW1wb3J0IENTUyBzeW50YXggaW4gY3JlYXRlR2xvYmFsU3R5bGUgYXQgdGhpcyB0aW1lLCBhcyB0aGUgQ1NTT00gQVBJcyB3ZSB1c2UgaW4gcHJvZHVjdGlvbiBkbyBub3QgaGFuZGxlIGl0IHdlbGwuIEluc3RlYWQsIHdlIHJlY29tbWVuZCB1c2luZyBhIGxpYnJhcnkgc3VjaCBhcyByZWFjdC1oZWxtZXQgdG8gaW5qZWN0IGEgdHlwaWNhbCA8bGluaz4gbWV0YSB0YWcgdG8gdGhlIHN0eWxlc2hlZXQsIG9yIHNpbXBseSBlbWJlZGRpbmcgaXQgbWFudWFsbHkgaW4geW91ciBpbmRleC5odG1sIDxoZWFkPiBzZWN0aW9uIGZvciBhIHNpbXBsZXIgYXBwLlwiKSx0LnNlcnZlciYmaChkLGUsdCxvLG4pLGwoKGZ1bmN0aW9uKCl7aWYoIXQuc2VydmVyKXJldHVybiBoKGQsZSx0LG8sbiksZnVuY3Rpb24oKXtyZXR1cm4gdS5yZW1vdmVTdHlsZXMoZCx0KX19KSxbZCxlLHQsbyxuXSksbnVsbH1mdW5jdGlvbiBoKGUsdCxuLHIsbyl7aWYodS5pc1N0YXRpYyl1LnJlbmRlclN0eWxlcyhlLFAsbixvKTtlbHNle3ZhciBzPXkoe30sdCx7dGhlbWU6T2UodCxyLGQuZGVmYXVsdFByb3BzKX0pO3UucmVuZGVyU3R5bGVzKGUscyxuLG8pfX1yZXR1cm5cInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZQZShhKSxyLm1lbW8oZCl9ZnVuY3Rpb24gV2UoZSl7XCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG5hdmlnYXRvciYmXCJSZWFjdE5hdGl2ZVwiPT09bmF2aWdhdG9yLnByb2R1Y3QmJmNvbnNvbGUud2FybihcImBrZXlmcmFtZXNgIGNhbm5vdCBiZSB1c2VkIG9uIFJlYWN0TmF0aXZlLCBvbmx5IG9uIHRoZSB3ZWIuIFRvIGRvIGFuaW1hdGlvbiBpbiBSZWFjdE5hdGl2ZSBwbGVhc2UgdXNlIEFuaW1hdGVkLlwiKTtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0PjE/dC0xOjApLHI9MTtyPHQ7cisrKW5bci0xXT1hcmd1bWVudHNbcl07dmFyIG89QWUuYXBwbHkodm9pZCAwLFtlXS5jb25jYXQobikpLmpvaW4oXCJcIikscz1UZShvKTtyZXR1cm4gbmV3IHllKHMsbyl9dmFyIFVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXM7dGhpcy5fZW1pdFNoZWV0Q1NTPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5pbnN0YW5jZS50b1N0cmluZygpO2lmKCF0KXJldHVyblwiXCI7dmFyIG49WSgpO3JldHVyblwiPHN0eWxlIFwiK1tuJiYnbm9uY2U9XCInK24rJ1wiJyxOKyc9XCJ0cnVlXCInLCdkYXRhLXN0eWxlZC12ZXJzaW9uPVwiNS4zLjExXCInXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIikrXCI+XCIrdCtcIjwvc3R5bGU+XCJ9LHRoaXMuZ2V0U3R5bGVUYWdzPWZ1bmN0aW9uKCl7cmV0dXJuIGUuc2VhbGVkP0QoMik6ZS5fZW1pdFNoZWV0Q1NTKCl9LHRoaXMuZ2V0U3R5bGVFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIHQ7aWYoZS5zZWFsZWQpcmV0dXJuIEQoMik7dmFyIG49KCh0PXt9KVtOXT1cIlwiLHRbXCJkYXRhLXN0eWxlZC12ZXJzaW9uXCJdPVwiNS4zLjExXCIsdC5kYW5nZXJvdXNseVNldElubmVySFRNTD17X19odG1sOmUuaW5zdGFuY2UudG9TdHJpbmcoKX0sdCksbz1ZKCk7cmV0dXJuIG8mJihuLm5vbmNlPW8pLFtyLmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiLHkoe30sbix7a2V5Olwic2MtMC0wXCJ9KSldfSx0aGlzLnNlYWw9ZnVuY3Rpb24oKXtlLnNlYWxlZD0hMH0sdGhpcy5pbnN0YW5jZT1uZXcgWCh7aXNTZXJ2ZXI6ITB9KSx0aGlzLnNlYWxlZD0hMX12YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5jb2xsZWN0U3R5bGVzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNlYWxlZD9EKDIpOnIuY3JlYXRlRWxlbWVudChtZSx7c2hlZXQ6dGhpcy5pbnN0YW5jZX0sZSl9LHQuaW50ZXJsZWF2ZVdpdGhOb2RlU3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiBEKDMpfSxlfSgpLEplPWZ1bmN0aW9uKGUpe3ZhciB0PXIuZm9yd2FyZFJlZigoZnVuY3Rpb24odCxuKXt2YXIgbz1zKE1lKSxpPWUuZGVmYXVsdFByb3BzLGE9T2UodCxvLGkpO3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJnZvaWQgMD09PWEmJmNvbnNvbGUud2FybignW3dpdGhUaGVtZV0gWW91IGFyZSBub3QgdXNpbmcgYSBUaGVtZVByb3ZpZGVyIG5vciBwYXNzaW5nIGEgdGhlbWUgcHJvcCBvciBhIHRoZW1lIGluIGRlZmF1bHRQcm9wcyBpbiBjb21wb25lbnQgY2xhc3MgXCInK2IoZSkrJ1wiJyksci5jcmVhdGVFbGVtZW50KGUseSh7fSx0LHt0aGVtZTphLHJlZjpufSkpfSkpO3JldHVybiBtKHQsZSksdC5kaXNwbGF5TmFtZT1cIldpdGhUaGVtZShcIitiKGUpK1wiKVwiLHR9LFhlPWZ1bmN0aW9uKCl7cmV0dXJuIHMoTWUpfSxaZT17U3R5bGVTaGVldDpYLG1hc3RlclNoZWV0OmRlfTtcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiZcIlJlYWN0TmF0aXZlXCI9PT1uYXZpZ2F0b3IucHJvZHVjdCYmY29uc29sZS53YXJuKFwiSXQgbG9va3MgbGlrZSB5b3UndmUgaW1wb3J0ZWQgJ3N0eWxlZC1jb21wb25lbnRzJyBvbiBSZWFjdCBOYXRpdmUuXFxuUGVyaGFwcyB5b3UncmUgbG9va2luZyB0byBpbXBvcnQgJ3N0eWxlZC1jb21wb25lbnRzL25hdGl2ZSc/XFxuUmVhZCBtb3JlIGFib3V0IHRoaXMgYXQgaHR0cHM6Ly93d3cuc3R5bGVkLWNvbXBvbmVudHMuY29tL2RvY3MvYmFzaWNzI3JlYWN0LW5hdGl2ZVwiKSxcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInRlc3RcIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYod2luZG93W1wiX19zdHlsZWQtY29tcG9uZW50cy1pbml0X19cIl09d2luZG93W1wiX19zdHlsZWQtY29tcG9uZW50cy1pbml0X19cIl18fDAsMT09PXdpbmRvd1tcIl9fc3R5bGVkLWNvbXBvbmVudHMtaW5pdF9fXCJdJiZjb25zb2xlLndhcm4oXCJJdCBsb29rcyBsaWtlIHRoZXJlIGFyZSBzZXZlcmFsIGluc3RhbmNlcyBvZiAnc3R5bGVkLWNvbXBvbmVudHMnIGluaXRpYWxpemVkIGluIHRoaXMgYXBwbGljYXRpb24uIFRoaXMgbWF5IGNhdXNlIGR5bmFtaWMgc3R5bGVzIHRvIG5vdCByZW5kZXIgcHJvcGVybHksIGVycm9ycyBkdXJpbmcgdGhlIHJlaHlkcmF0aW9uIHByb2Nlc3MsIGEgbWlzc2luZyB0aGVtZSBwcm9wLCBhbmQgbWFrZXMgeW91ciBhcHBsaWNhdGlvbiBiaWdnZXIgd2l0aG91dCBnb29kIHJlYXNvbi5cXG5cXG5TZWUgaHR0cHM6Ly9zLWMuc2gvMkJBWHplZCBmb3IgbW9yZSBpbmZvLlwiKSx3aW5kb3dbXCJfX3N0eWxlZC1jb21wb25lbnRzLWluaXRfX1wiXSs9MSk7ZXhwb3J0IGRlZmF1bHQgcWU7ZXhwb3J0e1VlIGFzIFNlcnZlclN0eWxlU2hlZXQsdWUgYXMgU3R5bGVTaGVldENvbnN1bWVyLGNlIGFzIFN0eWxlU2hlZXRDb250ZXh0LG1lIGFzIFN0eWxlU2hlZXRNYW5hZ2VyLEdlIGFzIFRoZW1lQ29uc3VtZXIsTWUgYXMgVGhlbWVDb250ZXh0LExlIGFzIFRoZW1lUHJvdmlkZXIsWmUgYXMgX19QUklWQVRFX18sJGUgYXMgY3JlYXRlR2xvYmFsU3R5bGUsQWUgYXMgY3NzLF8gYXMgaXNTdHlsZWRDb21wb25lbnQsV2UgYXMga2V5ZnJhbWVzLFhlIGFzIHVzZVRoZW1lLEEgYXMgdmVyc2lvbixKZSBhcyB3aXRoVGhlbWV9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3R5bGVkLWNvbXBvbmVudHMuYnJvd3Nlci5lc20uanMubWFwXG4iLCJ2YXIgdW5pdGxlc3NLZXlzID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogMSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IDEsXG4gIGJvcmRlckltYWdlU2xpY2U6IDEsXG4gIGJvcmRlckltYWdlV2lkdGg6IDEsXG4gIGJveEZsZXg6IDEsXG4gIGJveEZsZXhHcm91cDogMSxcbiAgYm94T3JkaW5hbEdyb3VwOiAxLFxuICBjb2x1bW5Db3VudDogMSxcbiAgY29sdW1uczogMSxcbiAgZmxleDogMSxcbiAgZmxleEdyb3c6IDEsXG4gIGZsZXhQb3NpdGl2ZTogMSxcbiAgZmxleFNocmluazogMSxcbiAgZmxleE5lZ2F0aXZlOiAxLFxuICBmbGV4T3JkZXI6IDEsXG4gIGdyaWRSb3c6IDEsXG4gIGdyaWRSb3dFbmQ6IDEsXG4gIGdyaWRSb3dTcGFuOiAxLFxuICBncmlkUm93U3RhcnQ6IDEsXG4gIGdyaWRDb2x1bW46IDEsXG4gIGdyaWRDb2x1bW5FbmQ6IDEsXG4gIGdyaWRDb2x1bW5TcGFuOiAxLFxuICBncmlkQ29sdW1uU3RhcnQ6IDEsXG4gIG1zR3JpZFJvdzogMSxcbiAgbXNHcmlkUm93U3BhbjogMSxcbiAgbXNHcmlkQ29sdW1uOiAxLFxuICBtc0dyaWRDb2x1bW5TcGFuOiAxLFxuICBmb250V2VpZ2h0OiAxLFxuICBsaW5lSGVpZ2h0OiAxLFxuICBvcGFjaXR5OiAxLFxuICBvcmRlcjogMSxcbiAgb3JwaGFuczogMSxcbiAgdGFiU2l6ZTogMSxcbiAgd2lkb3dzOiAxLFxuICB6SW5kZXg6IDEsXG4gIHpvb206IDEsXG4gIFdlYmtpdExpbmVDbGFtcDogMSxcbiAgLy8gU1ZHLXJlbGF0ZWQgcHJvcGVydGllc1xuICBmaWxsT3BhY2l0eTogMSxcbiAgZmxvb2RPcGFjaXR5OiAxLFxuICBzdG9wT3BhY2l0eTogMSxcbiAgc3Ryb2tlRGFzaGFycmF5OiAxLFxuICBzdHJva2VEYXNob2Zmc2V0OiAxLFxuICBzdHJva2VNaXRlcmxpbWl0OiAxLFxuICBzdHJva2VPcGFjaXR5OiAxLFxuICBzdHJva2VXaWR0aDogMVxufTtcblxuZXhwb3J0IGRlZmF1bHQgdW5pdGxlc3NLZXlzO1xuIiwiLyohXG4qIHRhYmJhYmxlIDYuMi4wXG4qIEBsaWNlbnNlIE1JVCwgaHR0cHM6Ly9naXRodWIuY29tL2ZvY3VzLXRyYXAvdGFiYmFibGUvYmxvYi9tYXN0ZXIvTElDRU5TRVxuKi9cbi8vIE5PVEU6IHNlcGFyYXRlIGA6bm90KClgIHNlbGVjdG9ycyBoYXMgYnJvYWRlciBicm93c2VyIHN1cHBvcnQgdGhhbiB0aGUgbmV3ZXJcbi8vICBgOm5vdChbaW5lcnRdLCBbaW5lcnRdICopYCAoRmViIDIwMjMpXG4vLyBDQVJFRlVMOiBKU0RvbSBkb2VzIG5vdCBzdXBwb3J0IGA6bm90KFtpbmVydF0gKilgIGFzIGEgc2VsZWN0b3I7IHVzaW5nIGl0IGNhdXNlc1xuLy8gIHRoZSBlbnRpcmUgcXVlcnkgdG8gZmFpbCwgcmVzdWx0aW5nIGluIG5vIG5vZGVzIGZvdW5kLCB3aGljaCB3aWxsIGJyZWFrIGEgbG90XG4vLyAgb2YgdGhpbmdzLi4uIHNvIHdlIGhhdmUgdG8gcmVseSBvbiBKUyB0byBpZGVudGlmeSBub2RlcyBpbnNpZGUgYW4gaW5lcnQgY29udGFpbmVyXG52YXIgY2FuZGlkYXRlU2VsZWN0b3JzID0gWydpbnB1dDpub3QoW2luZXJ0XSknLCAnc2VsZWN0Om5vdChbaW5lcnRdKScsICd0ZXh0YXJlYTpub3QoW2luZXJ0XSknLCAnYVtocmVmXTpub3QoW2luZXJ0XSknLCAnYnV0dG9uOm5vdChbaW5lcnRdKScsICdbdGFiaW5kZXhdOm5vdChzbG90KTpub3QoW2luZXJ0XSknLCAnYXVkaW9bY29udHJvbHNdOm5vdChbaW5lcnRdKScsICd2aWRlb1tjb250cm9sc106bm90KFtpbmVydF0pJywgJ1tjb250ZW50ZWRpdGFibGVdOm5vdChbY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIl0pOm5vdChbaW5lcnRdKScsICdkZXRhaWxzPnN1bW1hcnk6Zmlyc3Qtb2YtdHlwZTpub3QoW2luZXJ0XSknLCAnZGV0YWlsczpub3QoW2luZXJ0XSknXTtcbnZhciBjYW5kaWRhdGVTZWxlY3RvciA9IC8qICNfX1BVUkVfXyAqL2NhbmRpZGF0ZVNlbGVjdG9ycy5qb2luKCcsJyk7XG52YXIgTm9FbGVtZW50ID0gdHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnO1xudmFyIG1hdGNoZXMgPSBOb0VsZW1lbnQgPyBmdW5jdGlvbiAoKSB7fSA6IEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgfHwgRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1xudmFyIGdldFJvb3ROb2RlID0gIU5vRWxlbWVudCAmJiBFbGVtZW50LnByb3RvdHlwZS5nZXRSb290Tm9kZSA/IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIHZhciBfZWxlbWVudCRnZXRSb290Tm9kZTtcbiAgcmV0dXJuIGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9lbGVtZW50JGdldFJvb3ROb2RlID0gZWxlbWVudC5nZXRSb290Tm9kZSkgPT09IG51bGwgfHwgX2VsZW1lbnQkZ2V0Um9vdE5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lbGVtZW50JGdldFJvb3ROb2RlLmNhbGwoZWxlbWVudCk7XG59IDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWxlbWVudC5vd25lckRvY3VtZW50O1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgbm9kZSBpcyBpbmVydCBvciBpbiBhbiBpbmVydCBhbmNlc3Rvci5cbiAqIEBwYXJhbSB7RWxlbWVudH0gW25vZGVdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtsb29rVXBdIElmIHRydWUgYW5kIGBub2RlYCBpcyBub3QgaW5lcnQsIGxvb2tzIHVwIGF0IGFuY2VzdG9ycyB0b1xuICogIHNlZSBpZiBhbnkgb2YgdGhlbSBhcmUgaW5lcnQuIElmIGZhbHNlLCBvbmx5IGBub2RlYCBpdHNlbGYgaXMgY29uc2lkZXJlZC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGluZXJ0IGl0c2VsZiBvciBieSB3YXkgb2YgYmVpbmcgaW4gYW4gaW5lcnQgYW5jZXN0b3IuXG4gKiAgRmFsc2UgaWYgYG5vZGVgIGlzIGZhbHN5LlxuICovXG52YXIgaXNJbmVydCA9IGZ1bmN0aW9uIGlzSW5lcnQobm9kZSwgbG9va1VwKSB7XG4gIHZhciBfbm9kZSRnZXRBdHRyaWJ1dGU7XG4gIGlmIChsb29rVXAgPT09IHZvaWQgMCkge1xuICAgIGxvb2tVcCA9IHRydWU7XG4gIH1cbiAgLy8gQ0FSRUZVTDogSlNEb20gZG9lcyBub3Qgc3VwcG9ydCBpbmVydCBhdCBhbGwsIHNvIHdlIGNhbid0IHVzZSB0aGUgYEhUTUxFbGVtZW50LmluZXJ0YFxuICAvLyAgSlMgQVBJIHByb3BlcnR5OyB3ZSBoYXZlIHRvIGNoZWNrIHRoZSBhdHRyaWJ1dGUsIHdoaWNoIGNhbiBlaXRoZXIgYmUgZW1wdHkgb3IgJ3RydWUnO1xuICAvLyAgaWYgaXQncyBgbnVsbGAgKG5vdCBzcGVjaWZpZWQpIG9yICdmYWxzZScsIGl0J3MgYW4gYWN0aXZlIGVsZW1lbnRcbiAgdmFyIGluZXJ0QXR0ID0gbm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX25vZGUkZ2V0QXR0cmlidXRlID0gbm9kZS5nZXRBdHRyaWJ1dGUpID09PSBudWxsIHx8IF9ub2RlJGdldEF0dHJpYnV0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX25vZGUkZ2V0QXR0cmlidXRlLmNhbGwobm9kZSwgJ2luZXJ0Jyk7XG4gIHZhciBpbmVydCA9IGluZXJ0QXR0ID09PSAnJyB8fCBpbmVydEF0dCA9PT0gJ3RydWUnO1xuXG4gIC8vIE5PVEU6IHRoaXMgY291bGQgYWxzbyBiZSBoYW5kbGVkIHdpdGggYG5vZGUubWF0Y2hlcygnW2luZXJ0XSwgOmlzKFtpbmVydF0gKiknKWBcbiAgLy8gIGlmIGl0IHdlcmVuJ3QgZm9yIGBtYXRjaGVzKClgIG5vdCBiZWluZyBhIGZ1bmN0aW9uIG9uIHNoYWRvdyByb290czsgdGhlIGZvbGxvd2luZ1xuICAvLyAgY29kZSB3b3JrcyBmb3IgYW55IGtpbmQgb2Ygbm9kZVxuICAvLyBDQVJFRlVMOiBKU0RvbSBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBjZXJ0YWluIHNlbGVjdG9ycyBsaWtlIGA6bm90KFtpbmVydF0gKilgXG4gIC8vICBzbyBpdCBsaWtlbHkgd291bGQgbm90IHN1cHBvcnQgYDppcyhbaW5lcnRdICopYCBlaXRoZXIuLi5cbiAgdmFyIHJlc3VsdCA9IGluZXJ0IHx8IGxvb2tVcCAmJiBub2RlICYmIGlzSW5lcnQobm9kZS5wYXJlbnROb2RlKTsgLy8gcmVjdXJzaXZlXG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIG5vZGUncyBjb250ZW50IGlzIGVkaXRhYmxlLlxuICogQHBhcmFtIHtFbGVtZW50fSBbbm9kZV1cbiAqIEByZXR1cm5zIFRydWUgaWYgaXQncyBjb250ZW50LWVkaXRhYmxlOyBmYWxzZSBpZiBpdCdzIG5vdCBvciBgbm9kZWAgaXMgZmFsc3kuXG4gKi9cbnZhciBpc0NvbnRlbnRFZGl0YWJsZSA9IGZ1bmN0aW9uIGlzQ29udGVudEVkaXRhYmxlKG5vZGUpIHtcbiAgdmFyIF9ub2RlJGdldEF0dHJpYnV0ZTI7XG4gIC8vIENBUkVGVUw6IEpTRG9tIGRvZXMgbm90IHN1cHBvcnQgdGhlIGBIVE1MRWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZWAgQVBJIHNvIHdlIGhhdmVcbiAgLy8gIHRvIHVzZSB0aGUgYXR0cmlidXRlIGRpcmVjdGx5IHRvIGNoZWNrIGZvciB0aGlzLCB3aGljaCBjYW4gZWl0aGVyIGJlIGVtcHR5IG9yICd0cnVlJztcbiAgLy8gIGlmIGl0J3MgYG51bGxgIChub3Qgc3BlY2lmaWVkKSBvciAnZmFsc2UnLCBpdCdzIGEgbm9uLWVkaXRhYmxlIGVsZW1lbnRcbiAgdmFyIGF0dFZhbHVlID0gbm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX25vZGUkZ2V0QXR0cmlidXRlMiA9IG5vZGUuZ2V0QXR0cmlidXRlKSA9PT0gbnVsbCB8fCBfbm9kZSRnZXRBdHRyaWJ1dGUyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbm9kZSRnZXRBdHRyaWJ1dGUyLmNhbGwobm9kZSwgJ2NvbnRlbnRlZGl0YWJsZScpO1xuICByZXR1cm4gYXR0VmFsdWUgPT09ICcnIHx8IGF0dFZhbHVlID09PSAndHJ1ZSc7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgY29udGFpbmVyIHRvIGNoZWNrIGluXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVDb250YWluZXIgYWRkIGNvbnRhaW5lciB0byBjaGVja1xuICogQHBhcmFtIHsobm9kZTogRWxlbWVudCkgPT4gYm9vbGVhbn0gZmlsdGVyIGZpbHRlciBjYW5kaWRhdGVzXG4gKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICovXG52YXIgZ2V0Q2FuZGlkYXRlcyA9IGZ1bmN0aW9uIGdldENhbmRpZGF0ZXMoZWwsIGluY2x1ZGVDb250YWluZXIsIGZpbHRlcikge1xuICAvLyBldmVuIGlmIGBpbmNsdWRlQ29udGFpbmVyPWZhbHNlYCwgd2Ugc3RpbGwgaGF2ZSB0byBjaGVjayBpdCBmb3IgaW5lcnRuZXNzIGJlY2F1c2VcbiAgLy8gIGlmIGl0J3MgaW5lcnQsIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGluZXJ0XG4gIGlmIChpc0luZXJ0KGVsKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgY2FuZGlkYXRlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShlbC5xdWVyeVNlbGVjdG9yQWxsKGNhbmRpZGF0ZVNlbGVjdG9yKSk7XG4gIGlmIChpbmNsdWRlQ29udGFpbmVyICYmIG1hdGNoZXMuY2FsbChlbCwgY2FuZGlkYXRlU2VsZWN0b3IpKSB7XG4gICAgY2FuZGlkYXRlcy51bnNoaWZ0KGVsKTtcbiAgfVxuICBjYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5maWx0ZXIoZmlsdGVyKTtcbiAgcmV0dXJuIGNhbmRpZGF0ZXM7XG59O1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRTaGFkb3dSb290XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgdG8gY2hlY2sgZm9yIHNoYWRvdyByb290XG4gKiBAcmV0dXJucyB7U2hhZG93Um9vdHxib29sZWFufSBTaGFkb3dSb290IGlmIGF2YWlsYWJsZSBvciBib29sZWFuIGluZGljYXRpbmcgaWYgYSBzaGFkb3dSb290IGlzIGF0dGFjaGVkIGJ1dCBub3QgYXZhaWxhYmxlLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNoYWRvd1Jvb3RGaWx0ZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gc2hhZG93SG9zdE5vZGUgdGhlIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgc2hhZG93IGNvbnRlbnRcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGEgc2hhZG93IHJvb3QgY291bGQgcG90ZW50aWFsbHkgY29udGFpbiB2YWxpZCBjYW5kaWRhdGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FuZGlkYXRlU2NvcGVcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gc2NvcGVQYXJlbnQgY29udGFpbnMgaW5uZXIgY2FuZGlkYXRlc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGNhbmRpZGF0ZXMgbGlzdCBvZiBjYW5kaWRhdGVzIGZvdW5kIGluIHRoZSBzY29wZSBwYXJlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEl0ZXJhdGl2ZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7R2V0U2hhZG93Um9vdHxib29sZWFufSBnZXRTaGFkb3dSb290IHRydWUgaWYgc2hhZG93IHN1cHBvcnQgaXMgZW5hYmxlZDsgZmFsc3kgaWYgbm90O1xuICogIGlmIGEgZnVuY3Rpb24sIGltcGxpZXMgc2hhZG93IHN1cHBvcnQgaXMgZW5hYmxlZCBhbmQgZWl0aGVyIHJldHVybnMgdGhlIHNoYWRvdyByb290IG9mIGFuIGVsZW1lbnRcbiAqICBvciBhIGJvb2xlYW4gc3RhdGluZyBpZiBpdCBoYXMgYW4gdW5kaXNjbG9zZWQgc2hhZG93IHJvb3RcbiAqIEBwcm9wZXJ0eSB7KG5vZGU6IEVsZW1lbnQpID0+IGJvb2xlYW59IGZpbHRlciBmaWx0ZXIgY2FuZGlkYXRlc1xuICogQHByb3BlcnR5IHtib29sZWFufSBmbGF0dGVuIGlmIHRydWUgdGhlbiByZXN1bHQgd2lsbCBmbGF0dGVuIGFueSBDYW5kaWRhdGVTY29wZSBpbnRvIHRoZSByZXR1cm5lZCBsaXN0XG4gKiBAcHJvcGVydHkge1NoYWRvd1Jvb3RGaWx0ZXJ9IHNoYWRvd1Jvb3RGaWx0ZXIgZmlsdGVyIHNoYWRvdyByb290cztcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudFtdfSBlbGVtZW50cyBsaXN0IG9mIGVsZW1lbnQgY29udGFpbmVycyB0byBtYXRjaCBjYW5kaWRhdGVzIGZyb21cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUNvbnRhaW5lciBhZGQgY29udGFpbmVyIGxpc3QgdG8gY2hlY2tcbiAqIEBwYXJhbSB7SXRlcmF0aXZlT3B0aW9uc30gb3B0aW9uc1xuICogQHJldHVybnMge0FycmF5LjxFbGVtZW50fENhbmRpZGF0ZVNjb3BlPn1cbiAqL1xudmFyIGdldENhbmRpZGF0ZXNJdGVyYXRpdmVseSA9IGZ1bmN0aW9uIGdldENhbmRpZGF0ZXNJdGVyYXRpdmVseShlbGVtZW50cywgaW5jbHVkZUNvbnRhaW5lciwgb3B0aW9ucykge1xuICB2YXIgY2FuZGlkYXRlcyA9IFtdO1xuICB2YXIgZWxlbWVudHNUb0NoZWNrID0gQXJyYXkuZnJvbShlbGVtZW50cyk7XG4gIHdoaWxlIChlbGVtZW50c1RvQ2hlY2subGVuZ3RoKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1RvQ2hlY2suc2hpZnQoKTtcbiAgICBpZiAoaXNJbmVydChlbGVtZW50LCBmYWxzZSkpIHtcbiAgICAgIC8vIG5vIG5lZWQgdG8gbG9vayB1cCBzaW5jZSB3ZSdyZSBkcmlsbGluZyBkb3duXG4gICAgICAvLyBhbnl0aGluZyBpbnNpZGUgdGhpcyBjb250YWluZXIgd2lsbCBhbHNvIGJlIGluZXJ0XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NMT1QnKSB7XG4gICAgICAvLyBhZGQgc2hhZG93IGRvbSBzbG90IHNjb3BlIChzbG90IGl0c2VsZiBjYW5ub3QgYmUgZm9jdXNhYmxlKVxuICAgICAgdmFyIGFzc2lnbmVkID0gZWxlbWVudC5hc3NpZ25lZEVsZW1lbnRzKCk7XG4gICAgICB2YXIgY29udGVudCA9IGFzc2lnbmVkLmxlbmd0aCA/IGFzc2lnbmVkIDogZWxlbWVudC5jaGlsZHJlbjtcbiAgICAgIHZhciBuZXN0ZWRDYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5KGNvbnRlbnQsIHRydWUsIG9wdGlvbnMpO1xuICAgICAgaWYgKG9wdGlvbnMuZmxhdHRlbikge1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2guYXBwbHkoY2FuZGlkYXRlcywgbmVzdGVkQ2FuZGlkYXRlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICAgIHNjb3BlUGFyZW50OiBlbGVtZW50LFxuICAgICAgICAgIGNhbmRpZGF0ZXM6IG5lc3RlZENhbmRpZGF0ZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNoZWNrIGNhbmRpZGF0ZSBlbGVtZW50XG4gICAgICB2YXIgdmFsaWRDYW5kaWRhdGUgPSBtYXRjaGVzLmNhbGwoZWxlbWVudCwgY2FuZGlkYXRlU2VsZWN0b3IpO1xuICAgICAgaWYgKHZhbGlkQ2FuZGlkYXRlICYmIG9wdGlvbnMuZmlsdGVyKGVsZW1lbnQpICYmIChpbmNsdWRlQ29udGFpbmVyIHx8ICFlbGVtZW50cy5pbmNsdWRlcyhlbGVtZW50KSkpIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBpdGVyYXRlIG92ZXIgc2hhZG93IGNvbnRlbnQgaWYgcG9zc2libGVcbiAgICAgIHZhciBzaGFkb3dSb290ID0gZWxlbWVudC5zaGFkb3dSb290IHx8XG4gICAgICAvLyBjaGVjayBmb3IgYW4gdW5kaXNjbG9zZWQgc2hhZG93XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5nZXRTaGFkb3dSb290ID09PSAnZnVuY3Rpb24nICYmIG9wdGlvbnMuZ2V0U2hhZG93Um9vdChlbGVtZW50KTtcblxuICAgICAgLy8gbm8gaW5lcnQgbG9vayB1cCBiZWNhdXNlIHdlJ3JlIGFscmVhZHkgZHJpbGxpbmcgZG93biBhbmQgY2hlY2tpbmcgZm9yIGluZXJ0bmVzc1xuICAgICAgLy8gIG9uIHRoZSB3YXkgZG93biwgc28gYWxsIGNvbnRhaW5lcnMgdG8gdGhpcyByb290IG5vZGUgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuXG4gICAgICAvLyAgdmV0dGVkIGFzIG5vbi1pbmVydFxuICAgICAgdmFyIHZhbGlkU2hhZG93Um9vdCA9ICFpc0luZXJ0KHNoYWRvd1Jvb3QsIGZhbHNlKSAmJiAoIW9wdGlvbnMuc2hhZG93Um9vdEZpbHRlciB8fCBvcHRpb25zLnNoYWRvd1Jvb3RGaWx0ZXIoZWxlbWVudCkpO1xuICAgICAgaWYgKHNoYWRvd1Jvb3QgJiYgdmFsaWRTaGFkb3dSb290KSB7XG4gICAgICAgIC8vIGFkZCBzaGFkb3cgZG9tIHNjb3BlIElJRiBhIHNoYWRvdyByb290IG5vZGUgd2FzIGdpdmVuOyBvdGhlcndpc2UsIGFuIHVuZGlzY2xvc2VkXG4gICAgICAgIC8vICBzaGFkb3cgZXhpc3RzLCBzbyBsb29rIGF0IGxpZ2h0IGRvbSBjaGlsZHJlbiBhcyBmYWxsYmFjayBCVVQgY3JlYXRlIGEgc2NvcGUgZm9yIGFueVxuICAgICAgICAvLyAgY2hpbGQgY2FuZGlkYXRlcyBmb3VuZCBiZWNhdXNlIHRoZXkncmUgbGlrZWx5IHNsb3R0ZWQgZWxlbWVudHMgKGVsZW1lbnRzIHRoYXQgYXJlXG4gICAgICAgIC8vICBjaGlsZHJlbiBvZiB0aGUgd2ViIGNvbXBvbmVudCBlbGVtZW50ICh3aGljaCBoYXMgdGhlIHNoYWRvdyksIGluIHRoZSBsaWdodCBkb20sIGJ1dFxuICAgICAgICAvLyAgc2xvdHRlZCBzb21ld2hlcmUgX2luc2lkZV8gdGhlIHVuZGlzY2xvc2VkIHNoYWRvdykgLS0gdGhlIHNjb3BlIGlzIGNyZWF0ZWQgYmVsb3csXG4gICAgICAgIC8vICBfYWZ0ZXJfIHdlIHJldHVybiBmcm9tIHRoaXMgcmVjdXJzaXZlIGNhbGxcbiAgICAgICAgdmFyIF9uZXN0ZWRDYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5KHNoYWRvd1Jvb3QgPT09IHRydWUgPyBlbGVtZW50LmNoaWxkcmVuIDogc2hhZG93Um9vdC5jaGlsZHJlbiwgdHJ1ZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChvcHRpb25zLmZsYXR0ZW4pIHtcbiAgICAgICAgICBjYW5kaWRhdGVzLnB1c2guYXBwbHkoY2FuZGlkYXRlcywgX25lc3RlZENhbmRpZGF0ZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgICAgICBzY29wZVBhcmVudDogZWxlbWVudCxcbiAgICAgICAgICAgIGNhbmRpZGF0ZXM6IF9uZXN0ZWRDYW5kaWRhdGVzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoZXJlJ3Mgbm90IHNoYWRvdyBzbyBqdXN0IGRpZyBpbnRvIHRoZSBlbGVtZW50J3MgKGxpZ2h0IGRvbSkgY2hpbGRyZW5cbiAgICAgICAgLy8gIF9fd2l0aG91dF9fIGdpdmluZyB0aGUgZWxlbWVudCBzcGVjaWFsIHNjb3BlIHRyZWF0bWVudFxuICAgICAgICBlbGVtZW50c1RvQ2hlY2sudW5zaGlmdC5hcHBseShlbGVtZW50c1RvQ2hlY2ssIGVsZW1lbnQuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIERldGVybWluZXMgaWYgdGhlIG5vZGUgaGFzIGFuIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGB0YWJpbmRleGAgYXR0cmlidXRlLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgc287IGZhbHNlIGlmIG5vdC5cbiAqL1xudmFyIGhhc1RhYkluZGV4ID0gZnVuY3Rpb24gaGFzVGFiSW5kZXgobm9kZSkge1xuICByZXR1cm4gIWlzTmFOKHBhcnNlSW50KG5vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpLCAxMCkpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIHRhYiBpbmRleCBvZiBhIGdpdmVuIG5vZGUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUYWIgb3JkZXIgKG5lZ2F0aXZlLCAwLCBvciBwb3NpdGl2ZSBudW1iZXIpLlxuICogQHRocm93cyB7RXJyb3J9IElmIGBub2RlYCBpcyBmYWxzeS5cbiAqL1xudmFyIGdldFRhYkluZGV4ID0gZnVuY3Rpb24gZ2V0VGFiSW5kZXgobm9kZSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG5vZGUgcHJvdmlkZWQnKTtcbiAgfVxuICBpZiAobm9kZS50YWJJbmRleCA8IDApIHtcbiAgICAvLyBpbiBDaHJvbWUsIDxkZXRhaWxzLz4sIDxhdWRpbyBjb250cm9scy8+IGFuZCA8dmlkZW8gY29udHJvbHMvPiBlbGVtZW50cyBnZXQgYSBkZWZhdWx0XG4gICAgLy8gYHRhYkluZGV4YCBvZiAtMSB3aGVuIHRoZSAndGFiaW5kZXgnIGF0dHJpYnV0ZSBpc24ndCBzcGVjaWZpZWQgaW4gdGhlIERPTSxcbiAgICAvLyB5ZXQgdGhleSBhcmUgc3RpbGwgcGFydCBvZiB0aGUgcmVndWxhciB0YWIgb3JkZXI7IGluIEZGLCB0aGV5IGdldCBhIGRlZmF1bHRcbiAgICAvLyBgdGFiSW5kZXhgIG9mIDA7IHNpbmNlIENocm9tZSBzdGlsbCBwdXRzIHRob3NlIGVsZW1lbnRzIGluIHRoZSByZWd1bGFyIHRhYlxuICAgIC8vIG9yZGVyLCBjb25zaWRlciB0aGVpciB0YWIgaW5kZXggdG8gYmUgMC5cbiAgICAvLyBBbHNvIGJyb3dzZXJzIGRvIG5vdCByZXR1cm4gYHRhYkluZGV4YCBjb3JyZWN0bHkgZm9yIGNvbnRlbnRFZGl0YWJsZSBub2RlcztcbiAgICAvLyBzbyBpZiB0aGV5IGRvbid0IGhhdmUgYSB0YWJpbmRleCBhdHRyaWJ1dGUgc3BlY2lmaWNhbGx5IHNldCwgYXNzdW1lIGl0J3MgMC5cbiAgICBpZiAoKC9eKEFVRElPfFZJREVPfERFVEFJTFMpJC8udGVzdChub2RlLnRhZ05hbWUpIHx8IGlzQ29udGVudEVkaXRhYmxlKG5vZGUpKSAmJiAhaGFzVGFiSW5kZXgobm9kZSkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9kZS50YWJJbmRleDtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHRoZSB0YWIgaW5kZXggb2YgYSBnaXZlbiBub2RlIF9fZm9yIHNvcnQgb3JkZXIgcHVycG9zZXNfXy5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU2NvcGVdIFRydWUgZm9yIGEgY3VzdG9tIGVsZW1lbnQgd2l0aCBzaGFkb3cgcm9vdCBvciBzbG90IHRoYXQsIGJ5IGRlZmF1bHQsXG4gKiAgaGFzIHRhYkluZGV4IC0xLCBidXQgbmVlZHMgdG8gYmUgc29ydGVkIGJ5IGRvY3VtZW50IG9yZGVyIGluIG9yZGVyIGZvciBpdHMgY29udGVudCB0byBiZVxuICogIGluc2VydGVkIGludG8gdGhlIGNvcnJlY3Qgc29ydCBwb3NpdGlvbi5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRhYiBvcmRlciAobmVnYXRpdmUsIDAsIG9yIHBvc2l0aXZlIG51bWJlcikuXG4gKi9cbnZhciBnZXRTb3J0T3JkZXJUYWJJbmRleCA9IGZ1bmN0aW9uIGdldFNvcnRPcmRlclRhYkluZGV4KG5vZGUsIGlzU2NvcGUpIHtcbiAgdmFyIHRhYkluZGV4ID0gZ2V0VGFiSW5kZXgobm9kZSk7XG4gIGlmICh0YWJJbmRleCA8IDAgJiYgaXNTY29wZSAmJiAhaGFzVGFiSW5kZXgobm9kZSkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gdGFiSW5kZXg7XG59O1xudmFyIHNvcnRPcmRlcmVkVGFiYmFibGVzID0gZnVuY3Rpb24gc29ydE9yZGVyZWRUYWJiYWJsZXMoYSwgYikge1xuICByZXR1cm4gYS50YWJJbmRleCA9PT0gYi50YWJJbmRleCA/IGEuZG9jdW1lbnRPcmRlciAtIGIuZG9jdW1lbnRPcmRlciA6IGEudGFiSW5kZXggLSBiLnRhYkluZGV4O1xufTtcbnZhciBpc0lucHV0ID0gZnVuY3Rpb24gaXNJbnB1dChub2RlKSB7XG4gIHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdJTlBVVCc7XG59O1xudmFyIGlzSGlkZGVuSW5wdXQgPSBmdW5jdGlvbiBpc0hpZGRlbklucHV0KG5vZGUpIHtcbiAgcmV0dXJuIGlzSW5wdXQobm9kZSkgJiYgbm9kZS50eXBlID09PSAnaGlkZGVuJztcbn07XG52YXIgaXNEZXRhaWxzV2l0aFN1bW1hcnkgPSBmdW5jdGlvbiBpc0RldGFpbHNXaXRoU3VtbWFyeShub2RlKSB7XG4gIHZhciByID0gbm9kZS50YWdOYW1lID09PSAnREVUQUlMUycgJiYgQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KG5vZGUuY2hpbGRyZW4pLnNvbWUoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkLnRhZ05hbWUgPT09ICdTVU1NQVJZJztcbiAgfSk7XG4gIHJldHVybiByO1xufTtcbnZhciBnZXRDaGVja2VkUmFkaW8gPSBmdW5jdGlvbiBnZXRDaGVja2VkUmFkaW8obm9kZXMsIGZvcm0pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChub2Rlc1tpXS5jaGVja2VkICYmIG5vZGVzW2ldLmZvcm0gPT09IGZvcm0pIHtcbiAgICAgIHJldHVybiBub2Rlc1tpXTtcbiAgICB9XG4gIH1cbn07XG52YXIgaXNUYWJiYWJsZVJhZGlvID0gZnVuY3Rpb24gaXNUYWJiYWJsZVJhZGlvKG5vZGUpIHtcbiAgaWYgKCFub2RlLm5hbWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgcmFkaW9TY29wZSA9IG5vZGUuZm9ybSB8fCBnZXRSb290Tm9kZShub2RlKTtcbiAgdmFyIHF1ZXJ5UmFkaW9zID0gZnVuY3Rpb24gcXVlcnlSYWRpb3MobmFtZSkge1xuICAgIHJldHVybiByYWRpb1Njb3BlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXVtuYW1lPVwiJyArIG5hbWUgKyAnXCJdJyk7XG4gIH07XG4gIHZhciByYWRpb1NldDtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuQ1NTICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LkNTUy5lc2NhcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByYWRpb1NldCA9IHF1ZXJ5UmFkaW9zKHdpbmRvdy5DU1MuZXNjYXBlKG5vZGUubmFtZSkpO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICByYWRpb1NldCA9IHF1ZXJ5UmFkaW9zKG5vZGUubmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcignTG9va3MgbGlrZSB5b3UgaGF2ZSBhIHJhZGlvIGJ1dHRvbiB3aXRoIGEgbmFtZSBhdHRyaWJ1dGUgY29udGFpbmluZyBpbnZhbGlkIENTUyBzZWxlY3RvciBjaGFyYWN0ZXJzIGFuZCBuZWVkIHRoZSBDU1MuZXNjYXBlIHBvbHlmaWxsOiAlcycsIGVyci5tZXNzYWdlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgdmFyIGNoZWNrZWQgPSBnZXRDaGVja2VkUmFkaW8ocmFkaW9TZXQsIG5vZGUuZm9ybSk7XG4gIHJldHVybiAhY2hlY2tlZCB8fCBjaGVja2VkID09PSBub2RlO1xufTtcbnZhciBpc1JhZGlvID0gZnVuY3Rpb24gaXNSYWRpbyhub2RlKSB7XG4gIHJldHVybiBpc0lucHV0KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ3JhZGlvJztcbn07XG52YXIgaXNOb25UYWJiYWJsZVJhZGlvID0gZnVuY3Rpb24gaXNOb25UYWJiYWJsZVJhZGlvKG5vZGUpIHtcbiAgcmV0dXJuIGlzUmFkaW8obm9kZSkgJiYgIWlzVGFiYmFibGVSYWRpbyhub2RlKTtcbn07XG5cbi8vIGRldGVybWluZXMgaWYgYSBub2RlIGlzIHVsdGltYXRlbHkgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdydzIGRvY3VtZW50XG52YXIgaXNOb2RlQXR0YWNoZWQgPSBmdW5jdGlvbiBpc05vZGVBdHRhY2hlZChub2RlKSB7XG4gIHZhciBfbm9kZVJvb3Q7XG4gIC8vIFRoZSByb290IG5vZGUgaXMgdGhlIHNoYWRvdyByb290IGlmIHRoZSBub2RlIGlzIGluIGEgc2hhZG93IERPTTsgc29tZSBkb2N1bWVudCBvdGhlcndpc2VcbiAgLy8gIChidXQgTk9UIF90aGVfIGRvY3VtZW50OyBzZWUgc2Vjb25kICdJZicgY29tbWVudCBiZWxvdyBmb3IgbW9yZSkuXG4gIC8vIElmIHJvb3ROb2RlIGlzIHNoYWRvdyByb290LCBpdCdsbCBoYXZlIGEgaG9zdCwgd2hpY2ggaXMgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHNoYWRvd1xuICAvLyAgaXMgYXR0YWNoZWQsIGFuZCB0aGUgb25lIHdlIG5lZWQgdG8gY2hlY2sgaWYgaXQncyBpbiB0aGUgZG9jdW1lbnQgb3Igbm90IChiZWNhdXNlIHRoZVxuICAvLyAgc2hhZG93LCBhbmQgYWxsIG5vZGVzIGl0IGNvbnRhaW5zLCBpcyBuZXZlciBjb25zaWRlcmVkIGluIHRoZSBkb2N1bWVudCBzaW5jZSBzaGFkb3dzXG4gIC8vICBiZWhhdmUgbGlrZSBzZWxmLWNvbnRhaW5lZCBET01zOyBidXQgaWYgdGhlIHNoYWRvdydzIEhPU1QsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIGRvY3VtZW50LFxuICAvLyAgaXMgaGlkZGVuLCBvciBpcyBub3QgaW4gdGhlIGRvY3VtZW50IGl0c2VsZiBidXQgaXMgZGV0YWNoZWQsIGl0IHdpbGwgYWZmZWN0IHRoZSBzaGFkb3cnc1xuICAvLyAgdmlzaWJpbGl0eSwgaW5jbHVkaW5nIGFsbCB0aGUgbm9kZXMgaXQgY29udGFpbnMpLiBUaGUgaG9zdCBjb3VsZCBiZSBhbnkgbm9ybWFsIG5vZGUsXG4gIC8vICBvciBhIGN1c3RvbSBlbGVtZW50IChpLmUuIHdlYiBjb21wb25lbnQpLiBFaXRoZXIgd2F5LCB0aGF0J3MgdGhlIG9uZSB0aGF0IGlzIGNvbnNpZGVyZWRcbiAgLy8gIHBhcnQgb2YgdGhlIGRvY3VtZW50LCBub3QgdGhlIHNoYWRvdyByb290LCBub3IgYW55IG9mIGl0cyBjaGlsZHJlbiAoaS5lLiB0aGUgbm9kZSBiZWluZ1xuICAvLyAgdGVzdGVkKS5cbiAgLy8gVG8gZnVydGhlciBjb21wbGljYXRlIHRoaW5ncywgd2UgaGF2ZSB0byBsb29rIGFsbCB0aGUgd2F5IHVwIHVudGlsIHdlIGZpbmQgYSBzaGFkb3cgSE9TVFxuICAvLyAgdGhhdCBpcyBhdHRhY2hlZCAob3IgZmluZCBub25lKSBiZWNhdXNlIHRoZSBub2RlIG1pZ2h0IGJlIGluIG5lc3RlZCBzaGFkb3dzLi4uXG4gIC8vIElmIHJvb3ROb2RlIGlzIG5vdCBhIHNoYWRvdyByb290LCBpdCB3b24ndCBoYXZlIGEgaG9zdCwgYW5kIHNvIHJvb3ROb2RlIHNob3VsZCBiZSB0aGVcbiAgLy8gIGRvY3VtZW50IChwZXIgdGhlIGRvY3MpIGFuZCB3aGlsZSBpdCdzIGEgRG9jdW1lbnQtdHlwZSBvYmplY3QsIHRoYXQgZG9jdW1lbnQgZG9lcyBub3RcbiAgLy8gIGFwcGVhciB0byBiZSB0aGUgc2FtZSBhcyB0aGUgbm9kZSdzIGBvd25lckRvY3VtZW50YCBmb3Igc29tZSByZWFzb24sIHNvIGl0J3Mgc2FmZXJcbiAgLy8gIHRvIGlnbm9yZSB0aGUgcm9vdE5vZGUgYXQgdGhpcyBwb2ludCwgYW5kIHVzZSBgbm9kZS5vd25lckRvY3VtZW50YC4gT3RoZXJ3aXNlLFxuICAvLyAgdXNpbmcgYHJvb3ROb2RlLmNvbnRhaW5zKG5vZGUpYCB3aWxsIF9hbHdheXNfIGJlIHRydWUgd2UnbGwgZ2V0IGZhbHNlLXBvc2l0aXZlcyB3aGVuXG4gIC8vICBub2RlIGlzIGFjdHVhbGx5IGRldGFjaGVkLlxuICAvLyBOT1RFOiBJZiBgbm9kZVJvb3RIb3N0YCBvciBgbm9kZWAgaGFwcGVucyB0byBiZSB0aGUgYGRvY3VtZW50YCBpdHNlbGYgKHdoaWNoIGlzIHBvc3NpYmxlXG4gIC8vICBpZiBhIHRhYmJhYmxlL2ZvY3VzYWJsZSBub2RlIHdhcyBxdWlja2x5IGFkZGVkIHRvIHRoZSBET00sIGZvY3VzZWQsIGFuZCB0aGVuIHJlbW92ZWRcbiAgLy8gIGZyb20gdGhlIERPTSBhcyBpbiBodHRwczovL2dpdGh1Yi5jb20vZm9jdXMtdHJhcC9mb2N1cy10cmFwLXJlYWN0L2lzc3Vlcy85MDUpLCB0aGVuXG4gIC8vICBgb3duZXJEb2N1bWVudGAgd2lsbCBiZSBgbnVsbGAsIGhlbmNlIHRoZSBvcHRpb25hbCBjaGFpbmluZyBvbiBpdC5cbiAgdmFyIG5vZGVSb290ID0gbm9kZSAmJiBnZXRSb290Tm9kZShub2RlKTtcbiAgdmFyIG5vZGVSb290SG9zdCA9IChfbm9kZVJvb3QgPSBub2RlUm9vdCkgPT09IG51bGwgfHwgX25vZGVSb290ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbm9kZVJvb3QuaG9zdDtcblxuICAvLyBpbiBzb21lIGNhc2VzLCBhIGRldGFjaGVkIG5vZGUgd2lsbCByZXR1cm4gaXRzZWxmIGFzIHRoZSByb290IGluc3RlYWQgb2YgYSBkb2N1bWVudCBvclxuICAvLyAgc2hhZG93IHJvb3Qgb2JqZWN0LCBpbiB3aGljaCBjYXNlLCB3ZSBzaG91bGRuJ3QgdHJ5IHRvIGxvb2sgZnVydGhlciB1cCB0aGUgaG9zdCBjaGFpblxuICB2YXIgYXR0YWNoZWQgPSBmYWxzZTtcbiAgaWYgKG5vZGVSb290ICYmIG5vZGVSb290ICE9PSBub2RlKSB7XG4gICAgdmFyIF9ub2RlUm9vdEhvc3QsIF9ub2RlUm9vdEhvc3Qkb3duZXJEbywgX25vZGUkb3duZXJEb2N1bWVudDtcbiAgICBhdHRhY2hlZCA9ICEhKChfbm9kZVJvb3RIb3N0ID0gbm9kZVJvb3RIb3N0KSAhPT0gbnVsbCAmJiBfbm9kZVJvb3RIb3N0ICE9PSB2b2lkIDAgJiYgKF9ub2RlUm9vdEhvc3Qkb3duZXJEbyA9IF9ub2RlUm9vdEhvc3Qub3duZXJEb2N1bWVudCkgIT09IG51bGwgJiYgX25vZGVSb290SG9zdCRvd25lckRvICE9PSB2b2lkIDAgJiYgX25vZGVSb290SG9zdCRvd25lckRvLmNvbnRhaW5zKG5vZGVSb290SG9zdCkgfHwgbm9kZSAhPT0gbnVsbCAmJiBub2RlICE9PSB2b2lkIDAgJiYgKF9ub2RlJG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQpICE9PSBudWxsICYmIF9ub2RlJG93bmVyRG9jdW1lbnQgIT09IHZvaWQgMCAmJiBfbm9kZSRvd25lckRvY3VtZW50LmNvbnRhaW5zKG5vZGUpKTtcbiAgICB3aGlsZSAoIWF0dGFjaGVkICYmIG5vZGVSb290SG9zdCkge1xuICAgICAgdmFyIF9ub2RlUm9vdDIsIF9ub2RlUm9vdEhvc3QyLCBfbm9kZVJvb3RIb3N0MiRvd25lckQ7XG4gICAgICAvLyBzaW5jZSBpdCdzIG5vdCBhdHRhY2hlZCBhbmQgd2UgaGF2ZSBhIHJvb3QgaG9zdCwgdGhlIG5vZGUgTVVTVCBiZSBpbiBhIG5lc3RlZCBzaGFkb3cgRE9NLFxuICAgICAgLy8gIHdoaWNoIG1lYW5zIHdlIG5lZWQgdG8gZ2V0IHRoZSBob3N0J3MgaG9zdCBhbmQgY2hlY2sgaWYgdGhhdCBwYXJlbnQgaG9zdCBpcyBjb250YWluZWRcbiAgICAgIC8vICBpbiAoaS5lLiBhdHRhY2hlZCB0bykgdGhlIGRvY3VtZW50XG4gICAgICBub2RlUm9vdCA9IGdldFJvb3ROb2RlKG5vZGVSb290SG9zdCk7XG4gICAgICBub2RlUm9vdEhvc3QgPSAoX25vZGVSb290MiA9IG5vZGVSb290KSA9PT0gbnVsbCB8fCBfbm9kZVJvb3QyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbm9kZVJvb3QyLmhvc3Q7XG4gICAgICBhdHRhY2hlZCA9ICEhKChfbm9kZVJvb3RIb3N0MiA9IG5vZGVSb290SG9zdCkgIT09IG51bGwgJiYgX25vZGVSb290SG9zdDIgIT09IHZvaWQgMCAmJiAoX25vZGVSb290SG9zdDIkb3duZXJEID0gX25vZGVSb290SG9zdDIub3duZXJEb2N1bWVudCkgIT09IG51bGwgJiYgX25vZGVSb290SG9zdDIkb3duZXJEICE9PSB2b2lkIDAgJiYgX25vZGVSb290SG9zdDIkb3duZXJELmNvbnRhaW5zKG5vZGVSb290SG9zdCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXR0YWNoZWQ7XG59O1xudmFyIGlzWmVyb0FyZWEgPSBmdW5jdGlvbiBpc1plcm9BcmVhKG5vZGUpIHtcbiAgdmFyIF9ub2RlJGdldEJvdW5kaW5nQ2xpZSA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgd2lkdGggPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUud2lkdGgsXG4gICAgaGVpZ2h0ID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLmhlaWdodDtcbiAgcmV0dXJuIHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMDtcbn07XG52YXIgaXNIaWRkZW4gPSBmdW5jdGlvbiBpc0hpZGRlbihub2RlLCBfcmVmKSB7XG4gIHZhciBkaXNwbGF5Q2hlY2sgPSBfcmVmLmRpc3BsYXlDaGVjayxcbiAgICBnZXRTaGFkb3dSb290ID0gX3JlZi5nZXRTaGFkb3dSb290O1xuICAvLyBOT1RFOiB2aXNpYmlsaXR5IHdpbGwgYmUgYHVuZGVmaW5lZGAgaWYgbm9kZSBpcyBkZXRhY2hlZCBmcm9tIHRoZSBkb2N1bWVudFxuICAvLyAgKHNlZSBub3RlcyBhYm91dCB0aGlzIGZ1cnRoZXIgZG93biksIHdoaWNoIG1lYW5zIHdlIHdpbGwgY29uc2lkZXIgaXQgdmlzaWJsZVxuICAvLyAgKHRoaXMgaXMgbGVnYWN5IGJlaGF2aW9yIGZyb20gYSB2ZXJ5IGxvbmcgd2F5IGJhY2spXG4gIC8vIE5PVEU6IHdlIGNoZWNrIHRoaXMgcmVnYXJkbGVzcyBvZiBgZGlzcGxheUNoZWNrPVwibm9uZVwiYCBiZWNhdXNlIHRoaXMgaXMgYVxuICAvLyAgX3Zpc2liaWxpdHlfIGNoZWNrLCBub3QgYSBfZGlzcGxheV8gY2hlY2tcbiAgaWYgKGdldENvbXB1dGVkU3R5bGUobm9kZSkudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaXNEaXJlY3RTdW1tYXJ5ID0gbWF0Y2hlcy5jYWxsKG5vZGUsICdkZXRhaWxzPnN1bW1hcnk6Zmlyc3Qtb2YtdHlwZScpO1xuICB2YXIgbm9kZVVuZGVyRGV0YWlscyA9IGlzRGlyZWN0U3VtbWFyeSA/IG5vZGUucGFyZW50RWxlbWVudCA6IG5vZGU7XG4gIGlmIChtYXRjaGVzLmNhbGwobm9kZVVuZGVyRGV0YWlscywgJ2RldGFpbHM6bm90KFtvcGVuXSkgKicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFkaXNwbGF5Q2hlY2sgfHwgZGlzcGxheUNoZWNrID09PSAnZnVsbCcgfHwgZGlzcGxheUNoZWNrID09PSAnbGVnYWN5LWZ1bGwnKSB7XG4gICAgaWYgKHR5cGVvZiBnZXRTaGFkb3dSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBmaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBjb25zaWRlciB0aGUgbm9kZSB0byBiZSBpbiBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgYW5kIHVzZSB0aGVcbiAgICAgIC8vICAnbm9uLXplcm8tYXJlYScgZmFsbGJhY2tcbiAgICAgIHZhciBvcmlnaW5hbE5vZGUgPSBub2RlO1xuICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgdmFyIHBhcmVudEVsZW1lbnQgPSBub2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIHZhciByb290Tm9kZSA9IGdldFJvb3ROb2RlKG5vZGUpO1xuICAgICAgICBpZiAocGFyZW50RWxlbWVudCAmJiAhcGFyZW50RWxlbWVudC5zaGFkb3dSb290ICYmIGdldFNoYWRvd1Jvb3QocGFyZW50RWxlbWVudCkgPT09IHRydWUgLy8gY2hlY2sgaWYgdGhlcmUncyBhbiB1bmRpc2Nsb3NlZCBzaGFkb3dcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gbm9kZSBoYXMgYW4gdW5kaXNjbG9zZWQgc2hhZG93IHdoaWNoIG1lYW5zIHdlIGNhbiBvbmx5IHRyZWF0IGl0IGFzIGEgYmxhY2sgYm94LCBzbyB3ZVxuICAgICAgICAgIC8vICBmYWxsIGJhY2sgdG8gYSBub24temVyby1hcmVhIHRlc3RcbiAgICAgICAgICByZXR1cm4gaXNaZXJvQXJlYShub2RlKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmFzc2lnbmVkU2xvdCkge1xuICAgICAgICAgIC8vIGl0ZXJhdGUgdXAgc2xvdFxuICAgICAgICAgIG5vZGUgPSBub2RlLmFzc2lnbmVkU2xvdDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFyZW50RWxlbWVudCAmJiByb290Tm9kZSAhPT0gbm9kZS5vd25lckRvY3VtZW50KSB7XG4gICAgICAgICAgLy8gY3Jvc3Mgc2hhZG93IGJvdW5kYXJ5XG4gICAgICAgICAgbm9kZSA9IHJvb3ROb2RlLmhvc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaXRlcmF0ZSB1cCBub3JtYWwgZG9tXG4gICAgICAgICAgbm9kZSA9IHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5vZGUgPSBvcmlnaW5hbE5vZGU7XG4gICAgfVxuICAgIC8vIGVsc2UsIGBnZXRTaGFkb3dSb290YCBtaWdodCBiZSB0cnVlLCBidXQgYWxsIHRoYXQgZG9lcyBpcyBlbmFibGUgc2hhZG93IERPTSBzdXBwb3J0XG4gICAgLy8gIChpLmUuIGl0IGRvZXMgbm90IGFsc28gcHJlc3VtZSB0aGF0IGFsbCBub2RlcyBtaWdodCBoYXZlIHVuZGlzY2xvc2VkIHNoYWRvd3MpOyBvclxuICAgIC8vICBpdCBtaWdodCBiZSBhIGZhbHN5IHZhbHVlLCB3aGljaCBtZWFucyBzaGFkb3cgRE9NIHN1cHBvcnQgaXMgZGlzYWJsZWRcblxuICAgIC8vIFNpbmNlIHdlIGRpZG4ndCBmaW5kIGl0IHNpdHRpbmcgaW4gYW4gdW5kaXNjbG9zZWQgc2hhZG93IChvciBzaGFkb3dzIGFyZSBkaXNhYmxlZClcbiAgICAvLyAgbm93IHdlIGNhbiBqdXN0IHRlc3QgdG8gc2VlIGlmIGl0IHdvdWxkIG5vcm1hbGx5IGJlIHZpc2libGUgb3Igbm90LCBwcm92aWRlZCBpdCdzXG4gICAgLy8gIGF0dGFjaGVkIHRvIHRoZSBtYWluIGRvY3VtZW50LlxuICAgIC8vIE5PVEU6IFdlIG11c3QgY29uc2lkZXIgY2FzZSB3aGVyZSBub2RlIGlzIGluc2lkZSBhIHNoYWRvdyBET00gYW5kIGdpdmVuIGRpcmVjdGx5IHRvXG4gICAgLy8gIGBpc1RhYmJhYmxlKClgIG9yIGBpc0ZvY3VzYWJsZSgpYCAtLSByZWdhcmRsZXNzIG9mIGBnZXRTaGFkb3dSb290YCBvcHRpb24gc2V0dGluZy5cblxuICAgIGlmIChpc05vZGVBdHRhY2hlZChub2RlKSkge1xuICAgICAgLy8gdGhpcyB3b3JrcyB3aGVyZXZlciB0aGUgbm9kZSBpczogaWYgdGhlcmUncyBhdCBsZWFzdCBvbmUgY2xpZW50IHJlY3QsIGl0J3NcbiAgICAgIC8vICBzb21laG93IGRpc3BsYXllZDsgaXQgYWxzbyBjb3ZlcnMgdGhlIENTUyAnZGlzcGxheTogY29udGVudHMnIGNhc2Ugd2hlcmUgdGhlXG4gICAgICAvLyAgbm9kZSBpdHNlbGYgaXMgaGlkZGVuIGluIHBsYWNlIG9mIGl0cyBjb250ZW50czsgYW5kIHRoZXJlJ3Mgbm8gbmVlZCB0byBzZWFyY2hcbiAgICAgIC8vICB1cCB0aGUgaGllcmFyY2h5IGVpdGhlclxuICAgICAgcmV0dXJuICFub2RlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIEVsc2UsIHRoZSBub2RlIGlzbid0IGF0dGFjaGVkIHRvIHRoZSBkb2N1bWVudCwgd2hpY2ggbWVhbnMgdGhlIGBnZXRDbGllbnRSZWN0cygpYFxuICAgIC8vICBBUEkgd2lsbCBfX2Fsd2F5c19fIHJldHVybiB6ZXJvIHJlY3RzICh0aGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlLCBpZiBSZWFjdFxuICAgIC8vICBpcyB1c2VkIHRvIHJlbmRlciBub2RlcyBvbnRvIGEgZGV0YWNoZWQgdHJlZSwgYXMgY29uZmlybWVkIGluIHRoaXMgdGhyZWFkOlxuICAgIC8vICBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzkxMTcjaXNzdWVjb21tZW50LTI4NDIyODg3MClcbiAgICAvL1xuICAgIC8vIEl0IGFsc28gbWVhbnMgdGhhdCBldmVuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpLmRpc3BsYXkgd2lsbCByZXR1cm4gYHVuZGVmaW5lZGBcbiAgICAvLyAgYmVjYXVzZSBzdHlsZXMgYXJlIG9ubHkgY29tcHV0ZWQgZm9yIG5vZGVzIHRoYXQgYXJlIGluIHRoZSBkb2N1bWVudC5cbiAgICAvL1xuICAgIC8vIE5PVEU6IFRISVMgSEFTIEJFRU4gVEhFIENBU0UgRk9SIFlFQVJTLiBJdCBpcyBub3QgbmV3LCBub3IgaXMgaXQgY2F1c2VkIGJ5IHRhYmJhYmxlXG4gICAgLy8gIHNvbWVob3cuIFRob3VnaCBpdCB3YXMgbmV2ZXIgc3RhdGVkIG9mZmljaWFsbHksIGFueW9uZSB3aG8gaGFzIGV2ZXIgdXNlZCB0YWJiYWJsZVxuICAgIC8vICBBUElzIG9uIG5vZGVzIGluIGRldGFjaGVkIGNvbnRhaW5lcnMgaGFzIGFjdHVhbGx5IGltcGxpY2l0bHkgdXNlZCB0YWJiYWJsZSBpbiB3aGF0XG4gICAgLy8gIHdhcyBsYXRlciAoYXMgb2YgdjUuMi4wIG9uIEFwciA5LCAyMDIxKSBjYWxsZWQgYGRpc3BsYXlDaGVjaz1cIm5vbmVcImAgbW9kZSAtLSBlc3NlbnRpYWxseVxuICAgIC8vICBjb25zaWRlcmluZyBfX2V2ZXJ5dGhpbmdfXyB0byBiZSB2aXNpYmxlIGJlY2F1c2Ugb2YgdGhlIGlubmFiaWxpdHkgdG8gZGV0ZXJtaW5lIHN0eWxlcy5cbiAgICAvL1xuICAgIC8vIHY2LjAuMDogQXMgb2YgdGhpcyBtYWpvciByZWxlYXNlLCB0aGUgZGVmYXVsdCAnZnVsbCcgb3B0aW9uIF9fbm8gbG9uZ2VyIHRyZWF0cyBkZXRhY2hlZFxuICAgIC8vICBub2RlcyBhcyB2aXNpYmxlIHdpdGggdGhlICdub25lJyBmYWxsYmFjay5fX1xuICAgIGlmIChkaXNwbGF5Q2hlY2sgIT09ICdsZWdhY3ktZnVsbCcpIHtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBoaWRkZW5cbiAgICB9XG4gICAgLy8gZWxzZSwgZmFsbGJhY2sgdG8gJ25vbmUnIG1vZGUgYW5kIGNvbnNpZGVyIHRoZSBub2RlIHZpc2libGVcbiAgfSBlbHNlIGlmIChkaXNwbGF5Q2hlY2sgPT09ICdub24temVyby1hcmVhJykge1xuICAgIC8vIE5PVEU6IEV2ZW4gdGhvdWdoIHRoaXMgdGVzdHMgdGhhdCB0aGUgbm9kZSdzIGNsaWVudCByZWN0IGlzIG5vbi16ZXJvIHRvIGRldGVybWluZVxuICAgIC8vICB3aGV0aGVyIGl0J3MgZGlzcGxheWVkLCBhbmQgdGhhdCBhIGRldGFjaGVkIG5vZGUgd2lsbCBfX2Fsd2F5c19fIGhhdmUgYSB6ZXJvLWFyZWFcbiAgICAvLyAgY2xpZW50IHJlY3QsIHdlIGRvbid0IHNwZWNpYWwtY2FzZSBmb3Igd2hldGhlciB0aGUgbm9kZSBpcyBhdHRhY2hlZCBvciBub3QuIEluXG4gICAgLy8gIHRoaXMgbW9kZSwgd2UgZG8gd2FudCB0byBjb25zaWRlciBub2RlcyB0aGF0IGhhdmUgYSB6ZXJvIGFyZWEgdG8gYmUgaGlkZGVuIGF0IGFsbFxuICAgIC8vICB0aW1lcywgYW5kIHRoYXQgaW5jbHVkZXMgYXR0YWNoZWQgb3Igbm90LlxuICAgIHJldHVybiBpc1plcm9BcmVhKG5vZGUpO1xuICB9XG5cbiAgLy8gdmlzaWJsZSwgYXMgZmFyIGFzIHdlIGNhbiB0ZWxsLCBvciBwZXIgY3VycmVudCBgZGlzcGxheUNoZWNrPW5vbmVgIG1vZGUsIHdlIGFzc3VtZVxuICAvLyAgaXQncyB2aXNpYmxlXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8vIGZvcm0gZmllbGRzIChuZXN0ZWQpIGluc2lkZSBhIGRpc2FibGVkIGZpZWxkc2V0IGFyZSBub3QgZm9jdXNhYmxlL3RhYmJhYmxlXG4vLyAgdW5sZXNzIHRoZXkgYXJlIGluIHRoZSBfZmlyc3RfIDxsZWdlbmQ+IGVsZW1lbnQgb2YgdGhlIHRvcC1tb3N0IGRpc2FibGVkXG4vLyAgZmllbGRzZXRcbnZhciBpc0Rpc2FibGVkRnJvbUZpZWxkc2V0ID0gZnVuY3Rpb24gaXNEaXNhYmxlZEZyb21GaWVsZHNldChub2RlKSB7XG4gIGlmICgvXihJTlBVVHxCVVRUT058U0VMRUNUfFRFWFRBUkVBKSQvLnRlc3Qobm9kZS50YWdOYW1lKSkge1xuICAgIHZhciBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgIC8vIGNoZWNrIGlmIGBub2RlYCBpcyBjb250YWluZWQgaW4gYSBkaXNhYmxlZCA8ZmllbGRzZXQ+XG4gICAgd2hpbGUgKHBhcmVudE5vZGUpIHtcbiAgICAgIGlmIChwYXJlbnROb2RlLnRhZ05hbWUgPT09ICdGSUVMRFNFVCcgJiYgcGFyZW50Tm9kZS5kaXNhYmxlZCkge1xuICAgICAgICAvLyBsb29rIGZvciB0aGUgZmlyc3QgPGxlZ2VuZD4gYW1vbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBkaXNhYmxlZCA8ZmllbGRzZXQ+XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50Tm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjaGlsZCA9IHBhcmVudE5vZGUuY2hpbGRyZW4uaXRlbShpKTtcbiAgICAgICAgICAvLyB3aGVuIHRoZSBmaXJzdCA8bGVnZW5kPiAoaW4gZG9jdW1lbnQgb3JkZXIpIGlzIGZvdW5kXG4gICAgICAgICAgaWYgKGNoaWxkLnRhZ05hbWUgPT09ICdMRUdFTkQnKSB7XG4gICAgICAgICAgICAvLyBpZiBpdHMgcGFyZW50IDxmaWVsZHNldD4gaXMgbm90IG5lc3RlZCBpbiBhbm90aGVyIGRpc2FibGVkIDxmaWVsZHNldD4sXG4gICAgICAgICAgICAvLyByZXR1cm4gd2hldGhlciBgbm9kZWAgaXMgYSBkZXNjZW5kYW50IG9mIGl0cyBmaXJzdCA8bGVnZW5kPlxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMuY2FsbChwYXJlbnROb2RlLCAnZmllbGRzZXRbZGlzYWJsZWRdIConKSA/IHRydWUgOiAhY2hpbGQuY29udGFpbnMobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRoZSBkaXNhYmxlZCA8ZmllbGRzZXQ+IGNvbnRhaW5pbmcgYG5vZGVgIGhhcyBubyA8bGVnZW5kPlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gZWxzZSwgbm9kZSdzIHRhYmJhYmxlL2ZvY3VzYWJsZSBzdGF0ZSBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IGEgZmllbGRzZXQnc1xuICAvLyAgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZVxuICByZXR1cm4gZmFsc2U7XG59O1xudmFyIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUgPSBmdW5jdGlvbiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG9wdGlvbnMsIG5vZGUpIHtcbiAgaWYgKG5vZGUuZGlzYWJsZWQgfHxcbiAgLy8gd2UgbXVzdCBkbyBhbiBpbmVydCBsb29rIHVwIHRvIGZpbHRlciBvdXQgYW55IGVsZW1lbnRzIGluc2lkZSBhbiBpbmVydCBhbmNlc3RvclxuICAvLyAgYmVjYXVzZSB3ZSdyZSBsaW1pdGVkIGluIHRoZSB0eXBlIG9mIHNlbGVjdG9ycyB3ZSBjYW4gdXNlIGluIEpTRG9tIChzZWUgcmVsYXRlZFxuICAvLyAgbm90ZSByZWxhdGVkIHRvIGBjYW5kaWRhdGVTZWxlY3RvcnNgKVxuICBpc0luZXJ0KG5vZGUpIHx8IGlzSGlkZGVuSW5wdXQobm9kZSkgfHwgaXNIaWRkZW4obm9kZSwgb3B0aW9ucykgfHxcbiAgLy8gRm9yIGEgZGV0YWlscyBlbGVtZW50IHdpdGggYSBzdW1tYXJ5LCB0aGUgc3VtbWFyeSBlbGVtZW50IGdldHMgdGhlIGZvY3VzXG4gIGlzRGV0YWlsc1dpdGhTdW1tYXJ5KG5vZGUpIHx8IGlzRGlzYWJsZWRGcm9tRmllbGRzZXQobm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZShvcHRpb25zLCBub2RlKSB7XG4gIGlmIChpc05vblRhYmJhYmxlUmFkaW8obm9kZSkgfHwgZ2V0VGFiSW5kZXgobm9kZSkgPCAwIHx8ICFpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG9wdGlvbnMsIG5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBpc1ZhbGlkU2hhZG93Um9vdFRhYmJhYmxlID0gZnVuY3Rpb24gaXNWYWxpZFNoYWRvd1Jvb3RUYWJiYWJsZShzaGFkb3dIb3N0Tm9kZSkge1xuICB2YXIgdGFiSW5kZXggPSBwYXJzZUludChzaGFkb3dIb3N0Tm9kZS5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JyksIDEwKTtcbiAgaWYgKGlzTmFOKHRhYkluZGV4KSB8fCB0YWJJbmRleCA+PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gSWYgYSBjdXN0b20gZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgbmVnYXRpdmUgdGFiaW5kZXgsXG4gIC8vIGJyb3dzZXJzIHdpbGwgbm90IGFsbG93IHRhYiB0YXJnZXRpbmcgc2FpZCBlbGVtZW50J3MgY2hpbGRyZW4uXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheS48RWxlbWVudHxDYW5kaWRhdGVTY29wZT59IGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIEVsZW1lbnRbXVxuICovXG52YXIgc29ydEJ5T3JkZXIgPSBmdW5jdGlvbiBzb3J0QnlPcmRlcihjYW5kaWRhdGVzKSB7XG4gIHZhciByZWd1bGFyVGFiYmFibGVzID0gW107XG4gIHZhciBvcmRlcmVkVGFiYmFibGVzID0gW107XG4gIGNhbmRpZGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgIHZhciBpc1Njb3BlID0gISFpdGVtLnNjb3BlUGFyZW50O1xuICAgIHZhciBlbGVtZW50ID0gaXNTY29wZSA/IGl0ZW0uc2NvcGVQYXJlbnQgOiBpdGVtO1xuICAgIHZhciBjYW5kaWRhdGVUYWJpbmRleCA9IGdldFNvcnRPcmRlclRhYkluZGV4KGVsZW1lbnQsIGlzU2NvcGUpO1xuICAgIHZhciBlbGVtZW50cyA9IGlzU2NvcGUgPyBzb3J0QnlPcmRlcihpdGVtLmNhbmRpZGF0ZXMpIDogZWxlbWVudDtcbiAgICBpZiAoY2FuZGlkYXRlVGFiaW5kZXggPT09IDApIHtcbiAgICAgIGlzU2NvcGUgPyByZWd1bGFyVGFiYmFibGVzLnB1c2guYXBwbHkocmVndWxhclRhYmJhYmxlcywgZWxlbWVudHMpIDogcmVndWxhclRhYmJhYmxlcy5wdXNoKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcmRlcmVkVGFiYmFibGVzLnB1c2goe1xuICAgICAgICBkb2N1bWVudE9yZGVyOiBpLFxuICAgICAgICB0YWJJbmRleDogY2FuZGlkYXRlVGFiaW5kZXgsXG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGlzU2NvcGU6IGlzU2NvcGUsXG4gICAgICAgIGNvbnRlbnQ6IGVsZW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3JkZXJlZFRhYmJhYmxlcy5zb3J0KHNvcnRPcmRlcmVkVGFiYmFibGVzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgc29ydGFibGUpIHtcbiAgICBzb3J0YWJsZS5pc1Njb3BlID8gYWNjLnB1c2guYXBwbHkoYWNjLCBzb3J0YWJsZS5jb250ZW50KSA6IGFjYy5wdXNoKHNvcnRhYmxlLmNvbnRlbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdKS5jb25jYXQocmVndWxhclRhYmJhYmxlcyk7XG59O1xudmFyIHRhYmJhYmxlID0gZnVuY3Rpb24gdGFiYmFibGUoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgY2FuZGlkYXRlcztcbiAgaWYgKG9wdGlvbnMuZ2V0U2hhZG93Um9vdCkge1xuICAgIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoW2NvbnRhaW5lcl0sIG9wdGlvbnMuaW5jbHVkZUNvbnRhaW5lciwge1xuICAgICAgZmlsdGVyOiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yVGFiYmFibGUuYmluZChudWxsLCBvcHRpb25zKSxcbiAgICAgIGZsYXR0ZW46IGZhbHNlLFxuICAgICAgZ2V0U2hhZG93Um9vdDogb3B0aW9ucy5nZXRTaGFkb3dSb290LFxuICAgICAgc2hhZG93Um9vdEZpbHRlcjogaXNWYWxpZFNoYWRvd1Jvb3RUYWJiYWJsZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzKGNvbnRhaW5lciwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCBpc05vZGVNYXRjaGluZ1NlbGVjdG9yVGFiYmFibGUuYmluZChudWxsLCBvcHRpb25zKSk7XG4gIH1cbiAgcmV0dXJuIHNvcnRCeU9yZGVyKGNhbmRpZGF0ZXMpO1xufTtcbnZhciBmb2N1c2FibGUgPSBmdW5jdGlvbiBmb2N1c2FibGUoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgY2FuZGlkYXRlcztcbiAgaWYgKG9wdGlvbnMuZ2V0U2hhZG93Um9vdCkge1xuICAgIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoW2NvbnRhaW5lcl0sIG9wdGlvbnMuaW5jbHVkZUNvbnRhaW5lciwge1xuICAgICAgZmlsdGVyOiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlLmJpbmQobnVsbCwgb3B0aW9ucyksXG4gICAgICBmbGF0dGVuOiB0cnVlLFxuICAgICAgZ2V0U2hhZG93Um9vdDogb3B0aW9ucy5nZXRTaGFkb3dSb290XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXMoY29udGFpbmVyLCBvcHRpb25zLmluY2x1ZGVDb250YWluZXIsIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUuYmluZChudWxsLCBvcHRpb25zKSk7XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZXM7XG59O1xudmFyIGlzVGFiYmFibGUgPSBmdW5jdGlvbiBpc1RhYmJhYmxlKG5vZGUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gbm9kZSBwcm92aWRlZCcpO1xuICB9XG4gIGlmIChtYXRjaGVzLmNhbGwobm9kZSwgY2FuZGlkYXRlU2VsZWN0b3IpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlKG9wdGlvbnMsIG5vZGUpO1xufTtcbnZhciBmb2N1c2FibGVDYW5kaWRhdGVTZWxlY3RvciA9IC8qICNfX1BVUkVfXyAqL2NhbmRpZGF0ZVNlbGVjdG9ycy5jb25jYXQoJ2lmcmFtZScpLmpvaW4oJywnKTtcbnZhciBpc0ZvY3VzYWJsZSA9IGZ1bmN0aW9uIGlzRm9jdXNhYmxlKG5vZGUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gbm9kZSBwcm92aWRlZCcpO1xuICB9XG4gIGlmIChtYXRjaGVzLmNhbGwobm9kZSwgZm9jdXNhYmxlQ2FuZGlkYXRlU2VsZWN0b3IpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZShvcHRpb25zLCBub2RlKTtcbn07XG5cbmV4cG9ydCB7IGZvY3VzYWJsZSwgZ2V0VGFiSW5kZXgsIGlzRm9jdXNhYmxlLCBpc1RhYmJhYmxlLCB0YWJiYWJsZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtLmpzLm1hcFxuIiwiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sdCk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy50cmltQ2FudmFzPXQoKTplLnRyaW1DYW52YXM9dCgpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7aWYocltuXSlyZXR1cm4gcltuXS5leHBvcnRzO3ZhciBvPXJbbl09e2V4cG9ydHM6e30saWQ6bixsb2FkZWQ6ITF9O3JldHVybiBlW25dLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHQpLG8ubG9hZGVkPSEwLG8uZXhwb3J0c312YXIgcj17fTtyZXR1cm4gdC5tPWUsdC5jPXIsdC5wPVwiXCIsdCgwKX0oW2Z1bmN0aW9uKGUsdCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcihlKXt2YXIgdD1lLmdldENvbnRleHQoXCIyZFwiKSxyPWUud2lkdGgsbj1lLmhlaWdodCxvPXQuZ2V0SW1hZ2VEYXRhKDAsMCxyLG4pLmRhdGEsZj1hKCEwLHIsbixvKSxpPWEoITEscixuLG8pLGM9dSghMCxyLG4sbyksZD11KCExLHIsbixvKSxwPWQtYysxLGw9aS1mKzEscz10LmdldEltYWdlRGF0YShjLGYscCxsKTtyZXR1cm4gZS53aWR0aD1wLGUuaGVpZ2h0PWwsdC5jbGVhclJlY3QoMCwwLHAsbCksdC5wdXRJbWFnZURhdGEocywwLDApLGV9ZnVuY3Rpb24gbihlLHQscixuKXtyZXR1cm57cmVkOm5bNCoocip0K2UpXSxncmVlbjpuWzQqKHIqdCtlKSsxXSxibHVlOm5bNCoocip0K2UpKzJdLGFscGhhOm5bNCoocip0K2UpKzNdfX1mdW5jdGlvbiBvKGUsdCxyLG8pe3JldHVybiBuKGUsdCxyLG8pLmFscGhhfWZ1bmN0aW9uIGEoZSx0LHIsbil7Zm9yKHZhciBhPWU/MTotMSx1PWU/MDpyLTEsZj11O2U/ZjxyOmY+LTE7Zis9YSlmb3IodmFyIGk9MDtpPHQ7aSsrKWlmKG8oaSxmLHQsbikpcmV0dXJuIGY7cmV0dXJuIG51bGx9ZnVuY3Rpb24gdShlLHQscixuKXtmb3IodmFyIGE9ZT8xOi0xLHU9ZT8wOnQtMSxmPXU7ZT9mPHQ6Zj4tMTtmKz1hKWZvcih2YXIgaT0wO2k8cjtpKyspaWYobyhmLGksdCxuKSlyZXR1cm4gZjtyZXR1cm4gbnVsbH1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LmRlZmF1bHQ9cn1dKX0pOyIsIi8qKlxuICogQXNzaWducyBhIHZhbHVlIGZvciBhIGdpdmVuIHJlZiwgbm8gbWF0dGVyIG9mIHRoZSByZWYgZm9ybWF0XG4gKiBAcGFyYW0ge1JlZk9iamVjdH0gcmVmIC0gYSBjYWxsYmFjayBmdW5jdGlvbiBvciByZWYgb2JqZWN0XG4gKiBAcGFyYW0gdmFsdWUgLSBhIG5ldyB2YWx1ZVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS91c2UtY2FsbGJhY2stcmVmI2Fzc2lnbnJlZlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJlZk9iamVjdCA9IHVzZVJlZigpO1xuICogY29uc3QgcmVmRm4gPSAocmVmKSA9PiB7Li4uLn1cbiAqXG4gKiBhc3NpZ25SZWYocmVmT2JqZWN0LCBcInJlZlZhbHVlXCIpO1xuICogYXNzaWduUmVmKHJlZkZuLCBcInJlZlZhbHVlXCIpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduUmVmKHJlZiwgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZWYodmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZWYpIHtcbiAgICAgICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZjtcbn1cbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGFzc2lnblJlZiB9IGZyb20gJy4vYXNzaWduUmVmJztcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmIH0gZnJvbSAnLi91c2VSZWYnO1xudmFyIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IFJlYWN0LnVzZUxheW91dEVmZmVjdCA6IFJlYWN0LnVzZUVmZmVjdDtcbnZhciBjdXJyZW50VmFsdWVzID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogTWVyZ2VzIHR3byBvciBtb3JlIHJlZnMgdG9nZXRoZXIgcHJvdmlkaW5nIGEgc2luZ2xlIGludGVyZmFjZSB0byBzZXQgdGhlaXIgdmFsdWVcbiAqIEBwYXJhbSB7UmVmT2JqZWN0fFJlZn0gcmVmc1xuICogQHJldHVybnMge011dGFibGVSZWZPYmplY3R9IC0gYSBuZXcgcmVmLCB3aGljaCB0cmFuc2xhdGVzIGFsbCBjaGFuZ2VzIHRvIHtyZWZzfVxuICpcbiAqIEBzZWUge0BsaW5rIG1lcmdlUmVmc30gYSB2ZXJzaW9uIHdpdGhvdXQgYnVpdC1pbiBtZW1vaXphdGlvblxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L3VzZS1jYWxsYmFjay1yZWYjdXNlbWVyZ2VyZWZzXG4gKiBAZXhhbXBsZVxuICogY29uc3QgQ29tcG9uZW50ID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICogICBjb25zdCBvd25SZWYgPSB1c2VSZWYoKTtcbiAqICAgY29uc3QgZG9tUmVmID0gdXNlTWVyZ2VSZWZzKFtyZWYsIG93blJlZl0pOyAvLyDwn5GIIG1lcmdlIHRvZ2V0aGVyXG4gKiAgIHJldHVybiA8ZGl2IHJlZj17ZG9tUmVmfT4uLi48L2Rpdj5cbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1lcmdlUmVmcyhyZWZzLCBkZWZhdWx0VmFsdWUpIHtcbiAgICB2YXIgY2FsbGJhY2tSZWYgPSB1c2VDYWxsYmFja1JlZihkZWZhdWx0VmFsdWUgfHwgbnVsbCwgZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiByZWZzLmZvckVhY2goZnVuY3Rpb24gKHJlZikgeyByZXR1cm4gYXNzaWduUmVmKHJlZiwgbmV3VmFsdWUpOyB9KTtcbiAgICB9KTtcbiAgICAvLyBoYW5kbGUgcmVmcyBjaGFuZ2VzIC0gYWRkZWQgb3IgcmVtb3ZlZFxuICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb2xkVmFsdWUgPSBjdXJyZW50VmFsdWVzLmdldChjYWxsYmFja1JlZik7XG4gICAgICAgIGlmIChvbGRWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIHByZXZSZWZzXzEgPSBuZXcgU2V0KG9sZFZhbHVlKTtcbiAgICAgICAgICAgIHZhciBuZXh0UmVmc18xID0gbmV3IFNldChyZWZzKTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50XzEgPSBjYWxsYmFja1JlZi5jdXJyZW50O1xuICAgICAgICAgICAgcHJldlJlZnNfMS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW5leHRSZWZzXzEuaGFzKHJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzaWduUmVmKHJlZiwgbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXh0UmVmc18xLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgICAgICAgICAgIGlmICghcHJldlJlZnNfMS5oYXMocmVmKSkge1xuICAgICAgICAgICAgICAgICAgICBhc3NpZ25SZWYocmVmLCBjdXJyZW50XzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRWYWx1ZXMuc2V0KGNhbGxiYWNrUmVmLCByZWZzKTtcbiAgICB9LCBbcmVmc10pO1xuICAgIHJldHVybiBjYWxsYmFja1JlZjtcbn1cbiIsImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBjcmVhdGVzIGEgTXV0YWJsZVJlZiB3aXRoIHJlZiBjaGFuZ2UgY2FsbGJhY2tcbiAqIEBwYXJhbSBpbml0aWFsVmFsdWUgLSBpbml0aWFsIHJlZiB2YWx1ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBhIGNhbGxiYWNrIHRvIHJ1biB3aGVuIHZhbHVlIGNoYW5nZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcmVmID0gdXNlQ2FsbGJhY2tSZWYoMCwgKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgPT4gY29uc29sZS5sb2cob2xkVmFsdWUsICctPicsIG5ld1ZhbHVlKTtcbiAqIHJlZi5jdXJyZW50ID0gMTtcbiAqIC8vIHByaW50cyAwIC0+IDFcbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9ob29rcy1yZWZlcmVuY2UuaHRtbCN1c2VyZWZcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS91c2UtY2FsbGJhY2stcmVmI3VzZWNhbGxiYWNrcmVmLS0tdG8tcmVwbGFjZS1yZWFjdHVzZXJlZlxuICogQHJldHVybnMge011dGFibGVSZWZPYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDYWxsYmFja1JlZihpbml0aWFsVmFsdWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHJlZiA9IHVzZVN0YXRlKGZ1bmN0aW9uICgpIHsgcmV0dXJuICh7XG4gICAgICAgIC8vIHZhbHVlXG4gICAgICAgIHZhbHVlOiBpbml0aWFsVmFsdWUsXG4gICAgICAgIC8vIGxhc3QgY2FsbGJhY2tcbiAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgICAvLyBcIm1lbW9pemVkXCIgcHVibGljIGludGVyZmFjZVxuICAgICAgICBmYWNhZGU6IHtcbiAgICAgICAgICAgIGdldCBjdXJyZW50KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWYudmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0IGN1cnJlbnQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdCA9IHJlZi52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJlZi5jYWxsYmFjayh2YWx1ZSwgbGFzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9KTsgfSlbMF07XG4gICAgLy8gdXBkYXRlIGNhbGxiYWNrXG4gICAgcmVmLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgcmV0dXJuIHJlZi5mYWNhZGU7XG59XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgU2lkZUNhciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBzaWRlQ2FyID0gX2Euc2lkZUNhciwgcmVzdCA9IF9fcmVzdChfYSwgW1wic2lkZUNhclwiXSk7XG4gICAgaWYgKCFzaWRlQ2FyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2lkZWNhcjogcGxlYXNlIHByb3ZpZGUgYHNpZGVDYXJgIHByb3BlcnR5IHRvIGltcG9ydCB0aGUgcmlnaHQgY2FyJyk7XG4gICAgfVxuICAgIHZhciBUYXJnZXQgPSBzaWRlQ2FyLnJlYWQoKTtcbiAgICBpZiAoIVRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpZGVjYXIgbWVkaXVtIG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChUYXJnZXQsIF9fYXNzaWduKHt9LCByZXN0KSk7XG59O1xuU2lkZUNhci5pc1NpZGVDYXJFeHBvcnQgPSB0cnVlO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFNpZGVjYXIobWVkaXVtLCBleHBvcnRlZCkge1xuICAgIG1lZGl1bS51c2VNZWRpdW0oZXhwb3J0ZWQpO1xuICAgIHJldHVybiBTaWRlQ2FyO1xufVxuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmZ1bmN0aW9uIEl0b0koYSkge1xuICAgIHJldHVybiBhO1xufVxuZnVuY3Rpb24gaW5uZXJDcmVhdGVNZWRpdW0oZGVmYXVsdHMsIG1pZGRsZXdhcmUpIHtcbiAgICBpZiAobWlkZGxld2FyZSA9PT0gdm9pZCAwKSB7IG1pZGRsZXdhcmUgPSBJdG9JOyB9XG4gICAgdmFyIGJ1ZmZlciA9IFtdO1xuICAgIHZhciBhc3NpZ25lZCA9IGZhbHNlO1xuICAgIHZhciBtZWRpdW0gPSB7XG4gICAgICAgIHJlYWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChhc3NpZ25lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2lkZWNhcjogY291bGQgbm90IGByZWFkYCBmcm9tIGFuIGBhc3NpZ25lZGAgbWVkaXVtLiBgcmVhZGAgY291bGQgYmUgdXNlZCBvbmx5IHdpdGggYHVzZU1lZGl1bWAuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXJbYnVmZmVyLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgICB9LFxuICAgICAgICB1c2VNZWRpdW06IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICB2YXIgaXRlbSA9IG1pZGRsZXdhcmUoZGF0YSwgYXNzaWduZWQpO1xuICAgICAgICAgICAgYnVmZmVyLnB1c2goaXRlbSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggIT09IGl0ZW07IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgYXNzaWduU3luY01lZGl1bTogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICBhc3NpZ25lZCA9IHRydWU7XG4gICAgICAgICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBjYnMgPSBidWZmZXI7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gW107XG4gICAgICAgICAgICAgICAgY2JzLmZvckVhY2goY2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyID0ge1xuICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uICh4KSB7IHJldHVybiBjYih4KTsgfSxcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJ1ZmZlcjsgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGFzc2lnbk1lZGl1bTogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICBhc3NpZ25lZCA9IHRydWU7XG4gICAgICAgICAgICB2YXIgcGVuZGluZ1F1ZXVlID0gW107XG4gICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBjYnMgPSBidWZmZXI7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gW107XG4gICAgICAgICAgICAgICAgY2JzLmZvckVhY2goY2IpO1xuICAgICAgICAgICAgICAgIHBlbmRpbmdRdWV1ZSA9IGJ1ZmZlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBleGVjdXRlUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNicyA9IHBlbmRpbmdRdWV1ZTtcbiAgICAgICAgICAgICAgICBwZW5kaW5nUXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICBjYnMuZm9yRWFjaChjYik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGN5Y2xlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihleGVjdXRlUXVldWUpOyB9O1xuICAgICAgICAgICAgY3ljbGUoKTtcbiAgICAgICAgICAgIGJ1ZmZlciA9IHtcbiAgICAgICAgICAgICAgICBwdXNoOiBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUXVldWUucHVzaCh4KTtcbiAgICAgICAgICAgICAgICAgICAgY3ljbGUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24gKGZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUXVldWUgPSBwZW5kaW5nUXVldWUuZmlsdGVyKGZpbHRlcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gbWVkaXVtO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lZGl1bShkZWZhdWx0cywgbWlkZGxld2FyZSkge1xuICAgIGlmIChtaWRkbGV3YXJlID09PSB2b2lkIDApIHsgbWlkZGxld2FyZSA9IEl0b0k7IH1cbiAgICByZXR1cm4gaW5uZXJDcmVhdGVNZWRpdW0oZGVmYXVsdHMsIG1pZGRsZXdhcmUpO1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaWRlY2FyTWVkaXVtKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHZhciBtZWRpdW0gPSBpbm5lckNyZWF0ZU1lZGl1bShudWxsKTtcbiAgICBtZWRpdW0ub3B0aW9ucyA9IF9fYXNzaWduKHsgYXN5bmM6IHRydWUsIHNzcjogZmFsc2UgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG1lZGl1bTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXdpdGgtc2VsZWN0b3IuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIG9iamVjdElzID0gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGlzO1xuXG52YXIgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBSZWFjdC51c2VTeW5jRXh0ZXJuYWxTdG9yZTtcblxuLy8gZm9yIENvbW1vbkpTIGludGVyb3AuXG5cbnZhciB1c2VSZWYgPSBSZWFjdC51c2VSZWYsXG4gICAgdXNlRWZmZWN0ID0gUmVhY3QudXNlRWZmZWN0LFxuICAgIHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vLFxuICAgIHVzZURlYnVnVmFsdWUgPSBSZWFjdC51c2VEZWJ1Z1ZhbHVlOyAvLyBTYW1lIGFzIHVzZVN5bmNFeHRlcm5hbFN0b3JlLCBidXQgc3VwcG9ydHMgc2VsZWN0b3IgYW5kIGlzRXF1YWwgYXJndW1lbnRzLlxuXG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcihzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCwgc2VsZWN0b3IsIGlzRXF1YWwpIHtcbiAgLy8gVXNlIHRoaXMgdG8gdHJhY2sgdGhlIHJlbmRlcmVkIHNuYXBzaG90LlxuICB2YXIgaW5zdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGluc3Q7XG5cbiAgaWYgKGluc3RSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgIGluc3QgPSB7XG4gICAgICBoYXNWYWx1ZTogZmFsc2UsXG4gICAgICB2YWx1ZTogbnVsbFxuICAgIH07XG4gICAgaW5zdFJlZi5jdXJyZW50ID0gaW5zdDtcbiAgfSBlbHNlIHtcbiAgICBpbnN0ID0gaW5zdFJlZi5jdXJyZW50O1xuICB9XG5cbiAgdmFyIF91c2VNZW1vID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gVHJhY2sgdGhlIG1lbW9pemVkIHN0YXRlIHVzaW5nIGNsb3N1cmUgdmFyaWFibGVzIHRoYXQgYXJlIGxvY2FsIHRvIHRoaXNcbiAgICAvLyBtZW1vaXplZCBpbnN0YW5jZSBvZiBhIGdldFNuYXBzaG90IGZ1bmN0aW9uLiBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBhXG4gICAgLy8gdXNlUmVmIGhvb2ssIGJlY2F1c2UgdGhhdCBzdGF0ZSB3b3VsZCBiZSBzaGFyZWQgYWNyb3NzIGFsbCBjb25jdXJyZW50XG4gICAgLy8gY29waWVzIG9mIHRoZSBob29rL2NvbXBvbmVudC5cbiAgICB2YXIgaGFzTWVtbyA9IGZhbHNlO1xuICAgIHZhciBtZW1vaXplZFNuYXBzaG90O1xuICAgIHZhciBtZW1vaXplZFNlbGVjdGlvbjtcblxuICAgIHZhciBtZW1vaXplZFNlbGVjdG9yID0gZnVuY3Rpb24gKG5leHRTbmFwc2hvdCkge1xuICAgICAgaWYgKCFoYXNNZW1vKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIHRoZSBob29rIGlzIGNhbGxlZCwgdGhlcmUgaXMgbm8gbWVtb2l6ZWQgcmVzdWx0LlxuICAgICAgICBoYXNNZW1vID0gdHJ1ZTtcbiAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcblxuICAgICAgICB2YXIgX25leHRTZWxlY3Rpb24gPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuXG4gICAgICAgIGlmIChpc0VxdWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBFdmVuIGlmIHRoZSBzZWxlY3RvciBoYXMgY2hhbmdlZCwgdGhlIGN1cnJlbnRseSByZW5kZXJlZCBzZWxlY3Rpb25cbiAgICAgICAgICAvLyBtYXkgYmUgZXF1YWwgdG8gdGhlIG5ldyBzZWxlY3Rpb24uIFdlIHNob3VsZCBhdHRlbXB0IHRvIHJldXNlIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgdmFsdWUgaWYgcG9zc2libGUsIHRvIHByZXNlcnZlIGRvd25zdHJlYW0gbWVtb2l6YXRpb25zLlxuICAgICAgICAgIGlmIChpbnN0Lmhhc1ZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGluc3QudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChpc0VxdWFsKGN1cnJlbnRTZWxlY3Rpb24sIF9uZXh0U2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICBtZW1vaXplZFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1lbW9pemVkU2VsZWN0aW9uID0gX25leHRTZWxlY3Rpb247XG4gICAgICAgIHJldHVybiBfbmV4dFNlbGVjdGlvbjtcbiAgICAgIH0gLy8gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgdGhlIHByZXZpb3VzIGludm9jYXRpb24ncyByZXN1bHQuXG5cblxuICAgICAgLy8gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgdGhlIHByZXZpb3VzIGludm9jYXRpb24ncyByZXN1bHQuXG4gICAgICB2YXIgcHJldlNuYXBzaG90ID0gbWVtb2l6ZWRTbmFwc2hvdDtcbiAgICAgIHZhciBwcmV2U2VsZWN0aW9uID0gbWVtb2l6ZWRTZWxlY3Rpb247XG5cbiAgICAgIGlmIChvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCkpIHtcbiAgICAgICAgLy8gVGhlIHNuYXBzaG90IGlzIHRoZSBzYW1lIGFzIGxhc3QgdGltZS4gUmV1c2UgdGhlIHByZXZpb3VzIHNlbGVjdGlvbi5cbiAgICAgICAgcmV0dXJuIHByZXZTZWxlY3Rpb247XG4gICAgICB9IC8vIFRoZSBzbmFwc2hvdCBoYXMgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBjb21wdXRlIGEgbmV3IHNlbGVjdGlvbi5cblxuXG4gICAgICAvLyBUaGUgc25hcHNob3QgaGFzIGNoYW5nZWQsIHNvIHdlIG5lZWQgdG8gY29tcHV0ZSBhIG5ldyBzZWxlY3Rpb24uXG4gICAgICB2YXIgbmV4dFNlbGVjdGlvbiA9IHNlbGVjdG9yKG5leHRTbmFwc2hvdCk7IC8vIElmIGEgY3VzdG9tIGlzRXF1YWwgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHVzZSB0aGF0IHRvIGNoZWNrIGlmIHRoZSBkYXRhXG4gICAgICAvLyBoYXMgY2hhbmdlZC4gSWYgaXQgaGFzbid0LCByZXR1cm4gdGhlIHByZXZpb3VzIHNlbGVjdGlvbi4gVGhhdCBzaWduYWxzXG4gICAgICAvLyB0byBSZWFjdCB0aGF0IHRoZSBzZWxlY3Rpb25zIGFyZSBjb25jZXB0dWFsbHkgZXF1YWwsIGFuZCB3ZSBjYW4gYmFpbFxuICAgICAgLy8gb3V0IG9mIHJlbmRlcmluZy5cblxuICAgICAgLy8gSWYgYSBjdXN0b20gaXNFcXVhbCBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdXNlIHRoYXQgdG8gY2hlY2sgaWYgdGhlIGRhdGFcbiAgICAgIC8vIGhhcyBjaGFuZ2VkLiBJZiBpdCBoYXNuJ3QsIHJldHVybiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLiBUaGF0IHNpZ25hbHNcbiAgICAgIC8vIHRvIFJlYWN0IHRoYXQgdGhlIHNlbGVjdGlvbnMgYXJlIGNvbmNlcHR1YWxseSBlcXVhbCwgYW5kIHdlIGNhbiBiYWlsXG4gICAgICAvLyBvdXQgb2YgcmVuZGVyaW5nLlxuICAgICAgaWYgKGlzRXF1YWwgIT09IHVuZGVmaW5lZCAmJiBpc0VxdWFsKHByZXZTZWxlY3Rpb24sIG5leHRTZWxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBwcmV2U2VsZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICBtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90O1xuICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24gPSBuZXh0U2VsZWN0aW9uO1xuICAgICAgcmV0dXJuIG5leHRTZWxlY3Rpb247XG4gICAgfTsgLy8gQXNzaWduaW5nIHRoaXMgdG8gYSBjb25zdGFudCBzbyB0aGF0IEZsb3cga25vd3MgaXQgY2FuJ3QgY2hhbmdlLlxuXG5cbiAgICAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0YW50IHNvIHRoYXQgRmxvdyBrbm93cyBpdCBjYW4ndCBjaGFuZ2UuXG4gICAgdmFyIG1heWJlR2V0U2VydmVyU25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGdldFNlcnZlclNuYXBzaG90O1xuXG4gICAgdmFyIGdldFNuYXBzaG90V2l0aFNlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG1lbW9pemVkU2VsZWN0b3IoZ2V0U25hcHNob3QoKSk7XG4gICAgfTtcblxuICAgIHZhciBnZXRTZXJ2ZXJTbmFwc2hvdFdpdGhTZWxlY3RvciA9IG1heWJlR2V0U2VydmVyU25hcHNob3QgPT09IG51bGwgPyB1bmRlZmluZWQgOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihtYXliZUdldFNlcnZlclNuYXBzaG90KCkpO1xuICAgIH07XG4gICAgcmV0dXJuIFtnZXRTbmFwc2hvdFdpdGhTZWxlY3RvciwgZ2V0U2VydmVyU25hcHNob3RXaXRoU2VsZWN0b3JdO1xuICB9LCBbZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90LCBzZWxlY3RvciwgaXNFcXVhbF0pLFxuICAgICAgZ2V0U2VsZWN0aW9uID0gX3VzZU1lbW9bMF0sXG4gICAgICBnZXRTZXJ2ZXJTZWxlY3Rpb24gPSBfdXNlTWVtb1sxXTtcblxuICB2YXIgdmFsdWUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNlbGVjdGlvbiwgZ2V0U2VydmVyU2VsZWN0aW9uKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpbnN0Lmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICBpbnN0LnZhbHVlID0gdmFsdWU7XG4gIH0sIFt2YWx1ZV0pO1xuICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3I7XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS13aXRoLXNlbGVjdG9yLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXdpdGgtc2VsZWN0b3IuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTUFYXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9tYXguZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOSUxcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX25pbC5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInBhcnNlXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wYXJzZS5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInN0cmluZ2lmeVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfc3RyaW5naWZ5LmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjFcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3YuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2MVRvVjZcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3YxVG9WLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3YyLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3YzLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3Y0LmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjZcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3Y1LmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjZUb1YxXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF92NlRvVi5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInY3XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF92Ni5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInZhbGlkYXRlXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF92YWxpZGF0ZS5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInZlcnNpb25cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3ZlcnNpb24uZGVmYXVsdDtcbiAgfVxufSk7XG52YXIgX21heCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbWF4LmpzXCIpKTtcbnZhciBfbmlsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9uaWwuanNcIikpO1xudmFyIF9wYXJzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFyc2UuanNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKSk7XG52YXIgX3YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YxLmpzXCIpKTtcbnZhciBfdjFUb1YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YxVG9WNi5qc1wiKSk7XG52YXIgX3YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92My5qc1wiKSk7XG52YXIgX3YzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92NC5qc1wiKSk7XG52YXIgX3Y0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92NS5qc1wiKSk7XG52YXIgX3Y1ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92Ni5qc1wiKSk7XG52YXIgX3Y2VG9WID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92NlRvVjEuanNcIikpO1xudmFyIF92NiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjcuanNcIikpO1xudmFyIF92YWxpZGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdmFsaWRhdGUuanNcIikpO1xudmFyIF92ZXJzaW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92ZXJzaW9uLmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9ICdmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmYnOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuLypcbiAqIEJyb3dzZXItY29tcGF0aWJsZSBKYXZhU2NyaXB0IE1ENVxuICpcbiAqIE1vZGlmaWNhdGlvbiBvZiBKYXZhU2NyaXB0IE1ENVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvSmF2YVNjcmlwdC1NRDVcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb25cbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2VcbiAqIERpZ2VzdCBBbGdvcml0aG0sIGFzIGRlZmluZWQgaW4gUkZDIDEzMjEuXG4gKiBWZXJzaW9uIDIuMiBDb3B5cmlnaHQgKEMpIFBhdWwgSm9obnN0b24gMTk5OSAtIDIwMDlcbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIG1vcmUgaW5mby5cbiAqL1xuZnVuY3Rpb24gbWQ1KGJ5dGVzKSB7XG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShtc2cubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgICAgYnl0ZXNbaV0gPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1kNVRvSGV4RW5jb2RlZEFycmF5KHdvcmRzVG9NZDUoYnl0ZXNUb1dvcmRzKGJ5dGVzKSwgYnl0ZXMubGVuZ3RoICogOCkpO1xufVxuXG4vKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGFuIGFycmF5IG9mIGJ5dGVzXG4gKi9cbmZ1bmN0aW9uIG1kNVRvSGV4RW5jb2RlZEFycmF5KGlucHV0KSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgdmFyIGxlbmd0aDMyID0gaW5wdXQubGVuZ3RoICogMzI7XG4gIHZhciBoZXhUYWIgPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoMzI7IGkgKz0gOCkge1xuICAgIHZhciB4ID0gaW5wdXRbaSA+PiA1XSA+Pj4gaSAlIDMyICYgMHhmZjtcbiAgICB2YXIgaGV4ID0gcGFyc2VJbnQoaGV4VGFiLmNoYXJBdCh4ID4+PiA0ICYgMHgwZikgKyBoZXhUYWIuY2hhckF0KHggJiAweDBmKSwgMTYpO1xuICAgIG91dHB1dC5wdXNoKGhleCk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgb3V0cHV0IGxlbmd0aCB3aXRoIHBhZGRpbmcgYW5kIGJpdCBsZW5ndGhcbiAqL1xuZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoOCkge1xuICByZXR1cm4gKGlucHV0TGVuZ3RoOCArIDY0ID4+PiA5IDw8IDQpICsgMTQgKyAxO1xufVxuXG4vKlxuICogQ2FsY3VsYXRlIHRoZSBNRDUgb2YgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcywgYW5kIGEgYml0IGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gd29yZHNUb01kNSh4LCBsZW4pIHtcbiAgLyogYXBwZW5kIHBhZGRpbmcgKi9cbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCBsZW4gJSAzMjtcbiAgeFtnZXRPdXRwdXRMZW5ndGgobGVuKSAtIDFdID0gbGVuO1xuICB2YXIgYSA9IDE3MzI1ODQxOTM7XG4gIHZhciBiID0gLTI3MTczMzg3OTtcbiAgdmFyIGMgPSAtMTczMjU4NDE5NDtcbiAgdmFyIGQgPSAyNzE3MzM4Nzg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICB2YXIgb2xkYSA9IGE7XG4gICAgdmFyIG9sZGIgPSBiO1xuICAgIHZhciBvbGRjID0gYztcbiAgICB2YXIgb2xkZCA9IGQ7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaV0sIDcsIC02ODA4NzY5MzYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxXSwgMTIsIC0zODk1NjQ1ODYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTcsIDYwNjEwNTgxOSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDNdLCAyMiwgLTEwNDQ1MjUzMzApO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNywgLTE3NjQxODg5Nyk7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDVdLCAxMiwgMTIwMDA4MDQyNik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNywgLTE0NzMyMzEzNDEpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyA3XSwgMjIsIC00NTcwNTk4Myk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA3LCAxNzcwMDM1NDE2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTcsIC00MjA2Myk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDExXSwgMjIsIC0xOTkwNDA0MTYyKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA3LCAxODA0NjAzNjgyKTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMTNdLCAxMiwgLTQwMzQxMTAxKTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNywgLTE1MDIwMDIyOTApO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxNV0sIDIyLCAxMjM2NTM1MzI5KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMV0sIDUsIC0xNjU3OTY1MTApO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyA2XSwgOSwgLTEwNjk1MDE2MzIpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE0LCA2NDM3MTc3MTMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2ldLCAyMCwgLTM3Mzg5NzMwMik7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA1LCAtNzAxNTU4NjkxKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTBdLCA5LCAzODAxNjA4Myk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTQsIC02NjA0NzgzMzUpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA0XSwgMjAsIC00MDU1Mzc4NDgpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNSwgNTY4NDQ2NDM4KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTRdLCA5LCAtMTAxOTgwMzY5MCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNCwgLTE4NzM2Mzk2MSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDhdLCAyMCwgMTE2MzUzMTUwMSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNSwgLTE0NDQ2ODE0NjcpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAyXSwgOSwgLTUxNDAzNzg0KTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgN10sIDE0LCAxNzM1MzI4NDczKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgMTJdLCAyMCwgLTE5MjY2MDc3MzQpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNCwgLTM3ODU1OCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE2LCAxODM5MDMwNTYyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMV0sIDQsIC0xNTMwOTkyMDYwKTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgNF0sIDExLCAxMjcyODkzMzUzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgN10sIDE2LCAtMTU1NDk3NjMyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDQsIDY4MTI3OTE3NCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaV0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgNl0sIDIzLCA3NjAyOTE4OSk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDldLCA0LCAtNjQwMzY0NDg3KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgMTJdLCAxMSwgLTQyMTgxNTgzNSk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTYsIDUzMDc0MjUyMCk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDJdLCAyMywgLTk5NTMzODY1MSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaV0sIDYsIC0xOTg2MzA4NDQpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyA3XSwgMTAsIDExMjY4OTE0MTUpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE1LCAtMTQxNjM1NDkwNSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDVdLCAyMSwgLTU3NDM0MDU1KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA2LCAxNzAwNDg1NTcxKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgM10sIDEwLCAtMTg5NDk4NjYwNik7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTUsIC0xMDUxNTIzKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMV0sIDIxLCAtMjA1NDkyMjc5OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA2LCAxODczMzEzMzU5KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTVdLCAxMCwgLTMwNjExNzQ0KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE1LCAtMTU2MDE5ODM4MCk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDEzXSwgMjEsIDEzMDkxNTE2NDkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNiwgLTE0NTUyMzA3MCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDExXSwgMTAsIC0xMTIwMjEwMzc5KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE1LCA3MTg3ODcyNTkpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA5XSwgMjEsIC0zNDM0ODU1NTEpO1xuICAgIGEgPSBzYWZlQWRkKGEsIG9sZGEpO1xuICAgIGIgPSBzYWZlQWRkKGIsIG9sZGIpO1xuICAgIGMgPSBzYWZlQWRkKGMsIG9sZGMpO1xuICAgIGQgPSBzYWZlQWRkKGQsIG9sZGQpO1xuICB9XG4gIHJldHVybiBbYSwgYiwgYywgZF07XG59XG5cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IGJ5dGVzIHRvIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHNcbiAqIENoYXJhY3RlcnMgPjI1NSBoYXZlIHRoZWlyIGhpZ2gtYnl0ZSBzaWxlbnRseSBpZ25vcmVkLlxuICovXG5mdW5jdGlvbiBieXRlc1RvV29yZHMoaW5wdXQpIHtcbiAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgbGVuZ3RoOCA9IGlucHV0Lmxlbmd0aCAqIDg7XG4gIHZhciBvdXRwdXQgPSBuZXcgVWludDMyQXJyYXkoZ2V0T3V0cHV0TGVuZ3RoKGxlbmd0aDgpKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg4OyBpICs9IDgpIHtcbiAgICBvdXRwdXRbaSA+PiA1XSB8PSAoaW5wdXRbaSAvIDhdICYgMHhmZikgPDwgaSAlIDMyO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qXG4gKiBBZGQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeMzIuIFRoaXMgdXNlcyAxNi1iaXQgb3BlcmF0aW9ucyBpbnRlcm5hbGx5XG4gKiB0byB3b3JrIGFyb3VuZCBidWdzIGluIHNvbWUgSlMgaW50ZXJwcmV0ZXJzLlxuICovXG5mdW5jdGlvbiBzYWZlQWRkKHgsIHkpIHtcbiAgdmFyIGxzdyA9ICh4ICYgMHhmZmZmKSArICh5ICYgMHhmZmZmKTtcbiAgdmFyIG1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpO1xuICByZXR1cm4gbXN3IDw8IDE2IHwgbHN3ICYgMHhmZmZmO1xufVxuXG4vKlxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxuICovXG5mdW5jdGlvbiBiaXRSb3RhdGVMZWZ0KG51bSwgY250KSB7XG4gIHJldHVybiBudW0gPDwgY250IHwgbnVtID4+PiAzMiAtIGNudDtcbn1cblxuLypcbiAqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIGZvdXIgYmFzaWMgb3BlcmF0aW9ucyB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKi9cbmZ1bmN0aW9uIG1kNWNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gIHJldHVybiBzYWZlQWRkKGJpdFJvdGF0ZUxlZnQoc2FmZUFkZChzYWZlQWRkKGEsIHEpLCBzYWZlQWRkKHgsIHQpKSwgcyksIGIpO1xufVxuZnVuY3Rpb24gbWQ1ZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBjIHwgfmIgJiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cbmZ1bmN0aW9uIG1kNWdnKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgZCB8IGMgJiB+ZCwgYSwgYiwgeCwgcywgdCk7XG59XG5mdW5jdGlvbiBtZDVoaChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cbmZ1bmN0aW9uIG1kNWlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihjIF4gKGIgfCB+ZCksIGEsIGIsIHgsIHMsIHQpO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gbWQ1OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIHJhbmRvbVVVSUQgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCAmJiBjcnlwdG8ucmFuZG9tVVVJRC5iaW5kKGNyeXB0byk7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB7XG4gIHJhbmRvbVVVSURcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJzsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfdmFsaWRhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3ZhbGlkYXRlLmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbmZ1bmN0aW9uIHBhcnNlKHV1aWQpIHtcbiAgaWYgKCEoMCwgX3ZhbGlkYXRlLmRlZmF1bHQpKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIFVVSUQnKTtcbiAgfVxuICB2YXIgdjtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDE2KTtcblxuICAvLyBQYXJzZSAjIyMjIyMjIy0uLi4uLS4uLi4tLi4uLi0uLi4uLi4uLi4uLi5cbiAgYXJyWzBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDAsIDgpLCAxNikpID4+PiAyNDtcbiAgYXJyWzFdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMl0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7XG5cbiAgLy8gUGFyc2UgLi4uLi4uLi4tIyMjIy0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG4gIGFycls0XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDg7XG4gIGFycls1XSA9IHYgJiAweGZmO1xuXG4gIC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tIyMjIy0uLi4uLS4uLi4uLi4uLi4uLlxuICBhcnJbNl0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gODtcbiAgYXJyWzddID0gdiAmIDB4ZmY7XG5cbiAgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLSMjIyMtLi4uLi4uLi4uLi4uXG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjtcblxuICAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLS4uLi4tLi4uLi0jIyMjIyMjIyMjIyNcbiAgLy8gKFVzZSBcIi9cIiB0byBhdm9pZCAzMi1iaXQgdHJ1bmNhdGlvbiB3aGVuIGJpdC1zaGlmdGluZyBoaWdoLW9yZGVyIGJ5dGVzKVxuICBhcnJbMTBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzExXSA9IHYgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMl0gPSB2ID4+PiAyNCAmIDB4ZmY7XG4gIGFyclsxM10gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsxNF0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuICByZXR1cm4gYXJyO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gcGFyc2U7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSAvXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLThdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMHxmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmYpJC9pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gcm5nO1xuLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG5cbnZhciBnZXRSYW5kb21WYWx1ZXM7XG52YXIgcm5kczggPSBuZXcgVWludDhBcnJheSgxNik7XG5mdW5jdGlvbiBybmcoKSB7XG4gIC8vIGxhenkgbG9hZCBzbyB0aGF0IGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gcG9seWZpbGwgaGF2ZSBhIGNoYW5jZSB0byBkbyBzb1xuICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0byBpbXBsZW1lbnRhdGlvbi5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pO1xuICAgIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuLy8gQWRhcHRlZCBmcm9tIENocmlzIFZlbmVzcycgU0hBMSBjb2RlIGF0XG4vLyBodHRwOi8vd3d3Lm1vdmFibGUtdHlwZS5jby51ay9zY3JpcHRzL3NoYTEuaHRtbFxuZnVuY3Rpb24gZihzLCB4LCB5LCB6KSB7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiB4ICYgeSBeIH54ICYgejtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiB4ICYgeSBeIHggJiB6IF4geSAmIHo7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIHggXiB5IF4gejtcbiAgfVxufVxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5mdW5jdGlvbiBzaGExKGJ5dGVzKSB7XG4gIHZhciBLID0gWzB4NWE4Mjc5OTksIDB4NmVkOWViYTEsIDB4OGYxYmJjZGMsIDB4Y2E2MmMxZDZdO1xuICB2YXIgSCA9IFsweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLCAweDEwMzI1NDc2LCAweGMzZDJlMWYwXTtcbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cbiAgYnl0ZXMucHVzaCgweDgwKTtcbiAgdmFyIGwgPSBieXRlcy5sZW5ndGggLyA0ICsgMjtcbiAgdmFyIE4gPSBNYXRoLmNlaWwobCAvIDE2KTtcbiAgdmFyIE0gPSBuZXcgQXJyYXkoTik7XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBOOyArK19pKSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50MzJBcnJheSgxNik7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuICAgIE1bX2ldID0gYXJyO1xuICB9XG4gIE1bTiAtIDFdWzE0XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggLyBNYXRoLnBvdygyLCAzMik7XG4gIE1bTiAtIDFdWzE0XSA9IE1hdGguZmxvb3IoTVtOIC0gMV1bMTRdKTtcbiAgTVtOIC0gMV1bMTVdID0gKGJ5dGVzLmxlbmd0aCAtIDEpICogOCAmIDB4ZmZmZmZmZmY7XG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuICAgIGZvciAodmFyIHQgPSAwOyB0IDwgMTY7ICsrdCkge1xuICAgICAgV1t0XSA9IE1bX2kyXVt0XTtcbiAgICB9XG4gICAgZm9yICh2YXIgX3QgPSAxNjsgX3QgPCA4MDsgKytfdCkge1xuICAgICAgV1tfdF0gPSBST1RMKFdbX3QgLSAzXSBeIFdbX3QgLSA4XSBeIFdbX3QgLSAxNF0gXiBXW190IC0gMTZdLCAxKTtcbiAgICB9XG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcbiAgICBmb3IgKHZhciBfdDIgPSAwOyBfdDIgPCA4MDsgKytfdDIpIHtcbiAgICAgIHZhciBzID0gTWF0aC5mbG9vcihfdDIgLyAyMCk7XG4gICAgICB2YXIgVCA9IFJPVEwoYSwgNSkgKyBmKHMsIGIsIGMsIGQpICsgZSArIEtbc10gKyBXW190Ml0gPj4+IDA7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9IFJPVEwoYiwgMzApID4+PiAwO1xuICAgICAgYiA9IGE7XG4gICAgICBhID0gVDtcbiAgICB9XG4gICAgSFswXSA9IEhbMF0gKyBhID4+PiAwO1xuICAgIEhbMV0gPSBIWzFdICsgYiA+Pj4gMDtcbiAgICBIWzJdID0gSFsyXSArIGMgPj4+IDA7XG4gICAgSFszXSA9IEhbM10gKyBkID4+PiAwO1xuICAgIEhbNF0gPSBIWzRdICsgZSA+Pj4gMDtcbiAgfVxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gc2hhMTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmV4cG9ydHMudW5zYWZlU3RyaW5naWZ5ID0gdW5zYWZlU3RyaW5naWZ5O1xudmFyIF92YWxpZGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdmFsaWRhdGUuanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG52YXIgYnl0ZVRvSGV4ID0gW107XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zbGljZSgxKSk7XG59XG5mdW5jdGlvbiB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gIC8vIE5vdGU6IEJlIGNhcmVmdWwgZWRpdGluZyB0aGlzIGNvZGUhICBJdCdzIGJlZW4gdHVuZWQgZm9yIHBlcmZvcm1hbmNlXG4gIC8vIGFuZCB3b3JrcyBpbiB3YXlzIHlvdSBtYXkgbm90IGV4cGVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZC9wdWxsLzQzNFxuICAvL1xuICAvLyBOb3RlIHRvIGZ1dHVyZS1zZWxmOiBObywgeW91IGNhbid0IHJlbW92ZSB0aGUgYHRvTG93ZXJDYXNlKClgIGNhbGwuXG4gIC8vIFJFRjogaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNjc3I2lzc3VlY29tbWVudC0xNzU3MzUxMzUxXG4gIHJldHVybiAoYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAzXV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA2XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDddXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA5XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDExXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEzXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE1XV0pLnRvTG93ZXJDYXNlKCk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gIHZhciB1dWlkID0gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0KTtcbiAgLy8gQ29uc2lzdGVuY3kgY2hlY2sgZm9yIHZhbGlkIFVVSUQuICBJZiB0aGlzIHRocm93cywgaXQncyBsaWtlbHkgZHVlIHRvIG9uZVxuICAvLyBvZiB0aGUgZm9sbG93aW5nOlxuICAvLyAtIE9uZSBvciBtb3JlIGlucHV0IGFycmF5IHZhbHVlcyBkb24ndCBtYXAgdG8gYSBoZXggb2N0ZXQgKGxlYWRpbmcgdG9cbiAgLy8gXCJ1bmRlZmluZWRcIiBpbiB0aGUgdXVpZClcbiAgLy8gLSBJbnZhbGlkIGlucHV0IHZhbHVlcyBmb3IgdGhlIFJGQyBgdmVyc2lvbmAgb3IgYHZhcmlhbnRgIGZpZWxkc1xuICBpZiAoISgwLCBfdmFsaWRhdGUuZGVmYXVsdCkodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCcpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gc3RyaW5naWZ5OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9ybmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JuZy5qc1wiKSk7XG52YXIgX3N0cmluZ2lmeSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbi8vICoqYHYxKClgIC0gR2VuZXJhdGUgdGltZS1iYXNlZCBVVUlEKipcbi8vXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vTGlvc0svVVVJRC5qc1xuLy8gYW5kIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91dWlkLmh0bWxcblxudmFyIF9ub2RlSWQ7XG52YXIgX2Nsb2Nrc2VxO1xuXG4vLyBQcmV2aW91cyB1dWlkIGNyZWF0aW9uIHRpbWVcbnZhciBfbGFzdE1TZWNzID0gMDtcbnZhciBfbGFzdE5TZWNzID0gMDtcblxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCBmb3IgQVBJIGRldGFpbHNcbmZ1bmN0aW9uIHYxKG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuICB2YXIgYiA9IGJ1ZiB8fCBuZXcgQXJyYXkoMTYpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIG5vZGUgPSBvcHRpb25zLm5vZGU7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXE7XG5cbiAgLy8gdjEgb25seTogVXNlIGNhY2hlZCBgbm9kZWAgYW5kIGBjbG9ja3NlcWAgdmFsdWVzXG4gIGlmICghb3B0aW9ucy5fdjYpIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIG5vZGUgPSBfbm9kZUlkO1xuICAgIH1cbiAgICBpZiAoY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgICAgY2xvY2tzZXEgPSBfY2xvY2tzZXE7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIHdlIG5lZWQgZW50cm9weS4gIFdlIGRvIHRoaXMgbGF6aWx5IHRvIG1pbmltaXplIGlzc3Vlc1xuICAvLyByZWxhdGVkIHRvIGluc3VmZmljaWVudCBzeXN0ZW0gZW50cm9weS4gIFNlZSAjMTg5XG4gIGlmIChub2RlID09IG51bGwgfHwgY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgIHZhciBzZWVkQnl0ZXMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgX3JuZy5kZWZhdWx0KSgpO1xuXG4gICAgLy8gUmFuZG9taXplIG5vZGVcbiAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICBub2RlID0gW3NlZWRCeXRlc1swXSwgc2VlZEJ5dGVzWzFdLCBzZWVkQnl0ZXNbMl0sIHNlZWRCeXRlc1szXSwgc2VlZEJ5dGVzWzRdLCBzZWVkQnl0ZXNbNV1dO1xuXG4gICAgICAvLyB2MSBvbmx5OiBjYWNoZSBub2RlIHZhbHVlIGZvciByZXVzZVxuICAgICAgaWYgKCFfbm9kZUlkICYmICFvcHRpb25zLl92Nikge1xuICAgICAgICAvLyBwZXIgUkZDNDEyMiA0LjU6IFNldCBNQUMgbXVsdGljYXN0IGJpdCAodjEgb25seSlcbiAgICAgICAgbm9kZVswXSB8PSAweDAxOyAvLyBTZXQgbXVsdGljYXN0IGJpdFxuXG4gICAgICAgIF9ub2RlSWQgPSBub2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJhbmRvbWl6ZSBjbG9ja3NlcVxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC4yLjIsIHJhbmRvbWl6ZSAoMTQgYml0KSBjbG9ja3NlcVxuICAgICAgY2xvY2tzZXEgPSAoc2VlZEJ5dGVzWzZdIDw8IDggfCBzZWVkQnl0ZXNbN10pICYgMHgzZmZmO1xuICAgICAgaWYgKF9jbG9ja3NlcSA9PT0gdW5kZWZpbmVkICYmICFvcHRpb25zLl92Nikge1xuICAgICAgICBfY2xvY2tzZXEgPSBjbG9ja3NlcTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyB2MSAmIHY2IHRpbWVzdGFtcHMgYXJlIDEwMCBuYW5vLXNlY29uZCB1bml0cyBzaW5jZSB0aGUgR3JlZ29yaWFuIGVwb2NoLFxuICAvLyAoMTU4Mi0xMC0xNSAwMDowMCkuICBKU051bWJlcnMgYXJlbid0IHByZWNpc2UgZW5vdWdoIGZvciB0aGlzLCBzbyB0aW1lIGlzXG4gIC8vIGhhbmRsZWQgaW50ZXJuYWxseSBhcyAnbXNlY3MnIChpbnRlZ2VyIG1pbGxpc2Vjb25kcykgYW5kICduc2VjcydcbiAgLy8gKDEwMC1uYW5vc2Vjb25kcyBvZmZzZXQgZnJvbSBtc2Vjcykgc2luY2UgdW5peCBlcG9jaCwgMTk3MC0wMS0wMSAwMDowMC5cbiAgdmFyIG1zZWNzID0gb3B0aW9ucy5tc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tc2VjcyA6IERhdGUubm93KCk7XG5cbiAgLy8gUGVyIDQuMi4xLjIsIHVzZSBjb3VudCBvZiB1dWlkJ3MgZ2VuZXJhdGVkIGR1cmluZyB0aGUgY3VycmVudCBjbG9ja1xuICAvLyBjeWNsZSB0byBzaW11bGF0ZSBoaWdoZXIgcmVzb2x1dGlvbiBjbG9ja1xuICB2YXIgbnNlY3MgPSBvcHRpb25zLm5zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5zZWNzIDogX2xhc3ROU2VjcyArIDE7XG5cbiAgLy8gVGltZSBzaW5jZSBsYXN0IHV1aWQgY3JlYXRpb24gKGluIG1zZWNzKVxuICB2YXIgZHQgPSBtc2VjcyAtIF9sYXN0TVNlY3MgKyAobnNlY3MgLSBfbGFzdE5TZWNzKSAvIDEwMDAwO1xuXG4gIC8vIFBlciA0LjIuMS4yLCBCdW1wIGNsb2Nrc2VxIG9uIGNsb2NrIHJlZ3Jlc3Npb25cbiAgaWYgKGR0IDwgMCAmJiBvcHRpb25zLmNsb2Nrc2VxID09PSB1bmRlZmluZWQpIHtcbiAgICBjbG9ja3NlcSA9IGNsb2Nrc2VxICsgMSAmIDB4M2ZmZjtcbiAgfVxuXG4gIC8vIFJlc2V0IG5zZWNzIGlmIGNsb2NrIHJlZ3Jlc3NlcyAobmV3IGNsb2Nrc2VxKSBvciB3ZSd2ZSBtb3ZlZCBvbnRvIGEgbmV3XG4gIC8vIHRpbWUgaW50ZXJ2YWxcbiAgaWYgKChkdCA8IDAgfHwgbXNlY3MgPiBfbGFzdE1TZWNzKSAmJiBvcHRpb25zLm5zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBuc2VjcyA9IDA7XG4gIH1cblxuICAvLyBQZXIgNC4yLjEuMiBUaHJvdyBlcnJvciBpZiB0b28gbWFueSB1dWlkcyBhcmUgcmVxdWVzdGVkXG4gIGlmIChuc2VjcyA+PSAxMDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInV1aWQudjEoKTogQ2FuJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjXCIpO1xuICB9XG4gIF9sYXN0TVNlY3MgPSBtc2VjcztcbiAgX2xhc3ROU2VjcyA9IG5zZWNzO1xuICBfY2xvY2tzZXEgPSBjbG9ja3NlcTtcblxuICAvLyBQZXIgNC4xLjQgLSBDb252ZXJ0IGZyb20gdW5peCBlcG9jaCB0byBHcmVnb3JpYW4gZXBvY2hcbiAgbXNlY3MgKz0gMTIyMTkyOTI4MDAwMDA7XG5cbiAgLy8gYHRpbWVfbG93YFxuICB2YXIgdGwgPSAoKG1zZWNzICYgMHhmZmZmZmZmKSAqIDEwMDAwICsgbnNlY3MpICUgMHgxMDAwMDAwMDA7XG4gIGJbaSsrXSA9IHRsID4+PiAyNCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiAxNiAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdGwgJiAweGZmO1xuXG4gIC8vIGB0aW1lX21pZGBcbiAgdmFyIHRtaCA9IG1zZWNzIC8gMHgxMDAwMDAwMDAgKiAxMDAwMCAmIDB4ZmZmZmZmZjtcbiAgYltpKytdID0gdG1oID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdG1oICYgMHhmZjtcblxuICAvLyBgdGltZV9oaWdoX2FuZF92ZXJzaW9uYFxuICBiW2krK10gPSB0bWggPj4+IDI0ICYgMHhmIHwgMHgxMDsgLy8gaW5jbHVkZSB2ZXJzaW9uXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMTYgJiAweGZmO1xuXG4gIC8vIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYCAoUGVyIDQuMi4yIC0gaW5jbHVkZSB2YXJpYW50KVxuICBiW2krK10gPSBjbG9ja3NlcSA+Pj4gOCB8IDB4ODA7XG5cbiAgLy8gYGNsb2NrX3NlcV9sb3dgXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjtcblxuICAvLyBgbm9kZWBcbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cbiAgcmV0dXJuIGJ1ZiB8fCAoMCwgX3N0cmluZ2lmeS51bnNhZmVTdHJpbmdpZnkpKGIpO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdjE7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2MVRvVjY7XG52YXIgX3BhcnNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZS5qc1wiKSk7XG52YXIgX3N0cmluZ2lmeSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbi8qKlxuICogQ29udmVydCBhIHYxIFVVSUQgdG8gYSB2NiBVVUlEXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gdXVpZCAtIFRoZSB2MSBVVUlEIHRvIGNvbnZlcnQgdG8gdjZcbiAqIEByZXR1cm5zIHtzdHJpbmd8VWludDhBcnJheX0gVGhlIHY2IFVVSUQgYXMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgYHV1aWRgIGFyZ1xuICogKHN0cmluZyBvciBVaW50OEFycmF5KVxuICovXG5mdW5jdGlvbiB2MVRvVjYodXVpZCkge1xuICB2YXIgdjFCeXRlcyA9IHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyA/ICgwLCBfcGFyc2UuZGVmYXVsdCkodXVpZCkgOiB1dWlkO1xuICB2YXIgdjZCeXRlcyA9IF92MVRvVjYodjFCeXRlcyk7XG4gIHJldHVybiB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgPyAoMCwgX3N0cmluZ2lmeS51bnNhZmVTdHJpbmdpZnkpKHY2Qnl0ZXMpIDogdjZCeXRlcztcbn1cblxuLy8gRG8gdGhlIGZpZWxkIHRyYW5zZm9ybWF0aW9uIG5lZWRlZCBmb3IgdjEgLT4gdjZcbmZ1bmN0aW9uIF92MVRvVjYodjFCeXRlcywgcmFuZG9taXplID0gZmFsc2UpIHtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkub2YoKHYxQnl0ZXNbNl0gJiAweDBmKSA8PCA0IHwgdjFCeXRlc1s3XSA+PiA0ICYgMHgwZiwgKHYxQnl0ZXNbN10gJiAweDBmKSA8PCA0IHwgKHYxQnl0ZXNbNF0gJiAweGYwKSA+PiA0LCAodjFCeXRlc1s0XSAmIDB4MGYpIDw8IDQgfCAodjFCeXRlc1s1XSAmIDB4ZjApID4+IDQsICh2MUJ5dGVzWzVdICYgMHgwZikgPDwgNCB8ICh2MUJ5dGVzWzBdICYgMHhmMCkgPj4gNCwgKHYxQnl0ZXNbMF0gJiAweDBmKSA8PCA0IHwgKHYxQnl0ZXNbMV0gJiAweGYwKSA+PiA0LCAodjFCeXRlc1sxXSAmIDB4MGYpIDw8IDQgfCAodjFCeXRlc1syXSAmIDB4ZjApID4+IDQsIDB4NjAgfCB2MUJ5dGVzWzJdICYgMHgwZiwgdjFCeXRlc1szXSwgdjFCeXRlc1s4XSwgdjFCeXRlc1s5XSwgdjFCeXRlc1sxMF0sIHYxQnl0ZXNbMTFdLCB2MUJ5dGVzWzEyXSwgdjFCeXRlc1sxM10sIHYxQnl0ZXNbMTRdLCB2MUJ5dGVzWzE1XSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YzNS5qc1wiKSk7XG52YXIgX21kID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9tZDUuanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxudmFyIHYzID0gKDAsIF92LmRlZmF1bHQpKCd2MycsIDB4MzAsIF9tZC5kZWZhdWx0KTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHYzOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5VUkwgPSBleHBvcnRzLkROUyA9IHZvaWQgMDtcbmV4cG9ydHMuZGVmYXVsdCA9IHYzNTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xudmFyIF9wYXJzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFyc2UuanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOyAvLyBVVEY4IGVzY2FwZVxuXG4gIHZhciBieXRlcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xuICB9XG4gIHJldHVybiBieXRlcztcbn1cbnZhciBETlMgPSBleHBvcnRzLkROUyA9ICc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xudmFyIFVSTCA9IGV4cG9ydHMuVVJMID0gJzZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5mdW5jdGlvbiB2MzUobmFtZSwgdmVyc2lvbiwgaGFzaGZ1bmMpIHtcbiAgZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKHZhbHVlLCBuYW1lc3BhY2UsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgdmFyIF9uYW1lc3BhY2U7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gc3RyaW5nVG9CeXRlcyh2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXNwYWNlID0gKDAsIF9wYXJzZS5kZWZhdWx0KShuYW1lc3BhY2UpO1xuICAgIH1cbiAgICBpZiAoKChfbmFtZXNwYWNlID0gbmFtZXNwYWNlKSA9PT0gbnVsbCB8fCBfbmFtZXNwYWNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbmFtZXNwYWNlLmxlbmd0aCkgIT09IDE2KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ05hbWVzcGFjZSBtdXN0IGJlIGFycmF5LWxpa2UgKDE2IGl0ZXJhYmxlIGludGVnZXIgdmFsdWVzLCAwLTI1NSknKTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIGhhc2ggb2YgbmFtZXNwYWNlIGFuZCB2YWx1ZSwgUGVyIDQuM1xuICAgIC8vIEZ1dHVyZTogVXNlIHNwcmVhZCBzeW50YXggd2hlbiBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcywgZS5nLiBgYnl0ZXMgPVxuICAgIC8vIGhhc2hmdW5jKFsuLi5uYW1lc3BhY2UsIC4uLiB2YWx1ZV0pYFxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2ICsgdmFsdWUubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQobmFtZXNwYWNlKTtcbiAgICBieXRlcy5zZXQodmFsdWUsIG5hbWVzcGFjZS5sZW5ndGgpO1xuICAgIGJ5dGVzID0gaGFzaGZ1bmMoYnl0ZXMpO1xuICAgIGJ5dGVzWzZdID0gYnl0ZXNbNl0gJiAweDBmIHwgdmVyc2lvbjtcbiAgICBieXRlc1s4XSA9IGJ5dGVzWzhdICYgMHgzZiB8IDB4ODA7XG4gICAgaWYgKGJ1Zikge1xuICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICB9XG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIF9zdHJpbmdpZnkudW5zYWZlU3RyaW5naWZ5KShieXRlcyk7XG4gIH1cblxuICAvLyBGdW5jdGlvbiNuYW1lIGlzIG5vdCBzZXR0YWJsZSBvbiBzb21lIHBsYXRmb3JtcyAoIzI3MClcbiAgdHJ5IHtcbiAgICBnZW5lcmF0ZVVVSUQubmFtZSA9IG5hbWU7XG4gIH0gY2F0Y2ggKGVycikge31cblxuICAvLyBGb3IgQ29tbW9uSlMgZGVmYXVsdCBleHBvcnQgc3VwcG9ydFxuICBnZW5lcmF0ZVVVSUQuRE5TID0gRE5TO1xuICBnZW5lcmF0ZVVVSUQuVVJMID0gVVJMO1xuICByZXR1cm4gZ2VuZXJhdGVVVUlEO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9uYXRpdmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL25hdGl2ZS5qc1wiKSk7XG52YXIgX3JuZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcm5nLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgaWYgKF9uYXRpdmUuZGVmYXVsdC5yYW5kb21VVUlEICYmICFidWYgJiYgIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gX25hdGl2ZS5kZWZhdWx0LnJhbmRvbVVVSUQoKTtcbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgX3JuZy5kZWZhdWx0KSgpO1xuXG4gIC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcbiAgcm5kc1s2XSA9IHJuZHNbNl0gJiAweDBmIHwgMHg0MDtcbiAgcm5kc1s4XSA9IHJuZHNbOF0gJiAweDNmIHwgMHg4MDtcblxuICAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcbiAgaWYgKGJ1Zikge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuICByZXR1cm4gKDAsIF9zdHJpbmdpZnkudW5zYWZlU3RyaW5naWZ5KShybmRzKTtcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHY0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF92ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92MzUuanNcIikpO1xudmFyIF9zaGEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3NoYTEuanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxudmFyIHY1ID0gKDAsIF92LmRlZmF1bHQpKCd2NScsIDB4NTAsIF9zaGEuZGVmYXVsdCk7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2NTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHY2O1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG52YXIgX3YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YxLmpzXCIpKTtcbnZhciBfdjFUb1YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YxVG9WNi5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7IHJldHVybiAociA9IF90b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHsgdmFsdWU6IHQsIGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAgfSkgOiBlW3JdID0gdCwgZTsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gdHlwZW9mIGkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiBpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXk9fSBidWZcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0XG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiB2NihvcHRpb25zID0ge30sIGJ1Ziwgb2Zmc2V0ID0gMCkge1xuICAvLyB2NiBpcyB2MSB3aXRoIGRpZmZlcmVudCBmaWVsZCBsYXlvdXQsIHNvIHdlIHN0YXJ0IHdpdGggYSB2MSBVVUlELCBhbGJlaXRcbiAgLy8gd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgYmVoYXZpb3IgYXJvdW5kIGhvdyB0aGUgY2xvY2tfc2VxIGFuZCBub2RlIGZpZWxkc1xuICAvLyBhcmUgcmFuZG9taXplZCwgd2hpY2ggaXMgd2h5IHdlIGNhbGwgdjEgd2l0aCBfdjY6IHRydWUuXG4gIHZhciBieXRlcyA9ICgwLCBfdi5kZWZhdWx0KShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbnMpLCB7fSwge1xuICAgIF92NjogdHJ1ZVxuICB9KSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTtcblxuICAvLyBSZW9yZGVyIHRoZSBmaWVsZHMgdG8gdjYgbGF5b3V0LlxuICBieXRlcyA9ICgwLCBfdjFUb1YuZGVmYXVsdCkoYnl0ZXMpO1xuXG4gIC8vIFJldHVybiBhcyBhIGJ5dGUgYXJyYXkgaWYgcmVxdWVzdGVkXG4gIGlmIChidWYpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IGJ5dGVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG4gIHJldHVybiAoMCwgX3N0cmluZ2lmeS51bnNhZmVTdHJpbmdpZnkpKGJ5dGVzKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHY2VG9WMTtcbnZhciBfcGFyc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuLyoqXG4gKiBDb252ZXJ0IGEgdjYgVVVJRCB0byBhIHYxIFVVSURcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xVaW50OEFycmF5fSB1dWlkIC0gVGhlIHY2IFVVSUQgdG8gY29udmVydCB0byB2NlxuICogQHJldHVybnMge3N0cmluZ3xVaW50OEFycmF5fSBUaGUgdjEgVVVJRCBhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBgdXVpZGAgYXJnXG4gKiAoc3RyaW5nIG9yIFVpbnQ4QXJyYXkpXG4gKi9cbmZ1bmN0aW9uIHY2VG9WMSh1dWlkKSB7XG4gIHZhciB2NkJ5dGVzID0gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIF9wYXJzZS5kZWZhdWx0KSh1dWlkKSA6IHV1aWQ7XG4gIHZhciB2MUJ5dGVzID0gX3Y2VG9WMSh2NkJ5dGVzKTtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyA/ICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkodjFCeXRlcykgOiB2MUJ5dGVzO1xufVxuXG4vLyBEbyB0aGUgZmllbGQgdHJhbnNmb3JtYXRpb24gbmVlZGVkIGZvciB2NiAtPiB2MVxuZnVuY3Rpb24gX3Y2VG9WMSh2NkJ5dGVzKSB7XG4gIHJldHVybiBVaW50OEFycmF5Lm9mKCh2NkJ5dGVzWzNdICYgMHgwZikgPDwgNCB8IHY2Qnl0ZXNbNF0gPj4gNCAmIDB4MGYsICh2NkJ5dGVzWzRdICYgMHgwZikgPDwgNCB8ICh2NkJ5dGVzWzVdICYgMHhmMCkgPj4gNCwgKHY2Qnl0ZXNbNV0gJiAweDBmKSA8PCA0IHwgdjZCeXRlc1s2XSAmIDB4MGYsIHY2Qnl0ZXNbN10sICh2NkJ5dGVzWzFdICYgMHgwZikgPDwgNCB8ICh2NkJ5dGVzWzJdICYgMHhmMCkgPj4gNCwgKHY2Qnl0ZXNbMl0gJiAweDBmKSA8PCA0IHwgKHY2Qnl0ZXNbM10gJiAweGYwKSA+PiA0LCAweDEwIHwgKHY2Qnl0ZXNbMF0gJiAweGYwKSA+PiA0LCAodjZCeXRlc1swXSAmIDB4MGYpIDw8IDQgfCAodjZCeXRlc1sxXSAmIDB4ZjApID4+IDQsIHY2Qnl0ZXNbOF0sIHY2Qnl0ZXNbOV0sIHY2Qnl0ZXNbMTBdLCB2NkJ5dGVzWzExXSwgdjZCeXRlc1sxMl0sIHY2Qnl0ZXNbMTNdLCB2NkJ5dGVzWzE0XSwgdjZCeXRlc1sxNV0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9ybmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JuZy5qc1wiKSk7XG52YXIgX3N0cmluZ2lmeSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbi8qKlxuICogVVVJRCBWNyAtIFVuaXggRXBvY2ggdGltZS1iYXNlZCBVVUlEXG4gKlxuICogVGhlIElFVEYgaGFzIHB1Ymxpc2hlZCBSRkM5NTYyLCBpbnRyb2R1Y2luZyAzIG5ldyBVVUlEIHZlcnNpb25zICg2LDcsOCkuIFRoaXNcbiAqIGltcGxlbWVudGF0aW9uIG9mIFY3IGlzIGJhc2VkIG9uIHRoZSBhY2NlcHRlZCwgdGhvdWdoIG5vdCB5ZXQgYXBwcm92ZWQsXG4gKiByZXZpc2lvbnMuXG4gKlxuICogUkZDIDk1NjI6aHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzk1NjIuaHRtbCBVbml2ZXJzYWxseSBVbmlxdWVcbiAqIElEZW50aWZpZXJzIChVVUlEcylcblxuICpcbiAqIFNhbXBsZSBWNyB2YWx1ZTpcbiAqIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5NTYyLmh0bWwjbmFtZS1leGFtcGxlLW9mLWEtdXVpZHY3LXZhbHVlXG4gKlxuICogTW9ub3RvbmljIEJpdCBMYXlvdXQ6IFJGQyByZmM5NTYyLjYuMiBNZXRob2QgMSwgRGVkaWNhdGVkIENvdW50ZXIgQml0cyByZWY6XG4gKiAgICAgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzk1NjIuaHRtbCNzZWN0aW9uLTYuMi01LjFcbiAqXG4gKiAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMgMCAxIDIgMyA0IDUgNlxuICogICA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxXG4gKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICB1bml4X3RzX21zICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gKiAgfCAgICAgICAgICB1bml4X3RzX21zICAgICAgICAgICB8ICB2ZXIgIHwgICAgICAgIHNlcV9oaSAgICAgICAgIHxcbiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICogIHx2YXJ8ICAgICAgICAgICAgICAgc2VxX2xvdyAgICAgICAgICAgICAgIHwgICAgICAgIHJhbmQgICAgICAgICB8XG4gKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gKlxuICogc2VxIGlzIGEgMzEgYml0IHNlcmlhbGl6ZWQgY291bnRlcjsgY29tcHJpc2VkIG9mIDEyIGJpdCBzZXFfaGkgYW5kIDE5IGJpdFxuICogc2VxX2xvdywgYW5kIHJhbmRvbWx5IGluaXRpYWxpemVkIHVwb24gdGltZXN0YW1wIGNoYW5nZS4gMzEgYml0IGNvdW50ZXIgc2l6ZVxuICogd2FzIHNlbGVjdGVkIGFzIGFueSBiaXR3aXNlIG9wZXJhdGlvbnMgaW4gbm9kZSBhcmUgZG9uZSBhcyBfc2lnbmVkXyAzMiBiaXRcbiAqIGludHMuIHdlIGV4Y2x1ZGUgdGhlIHNpZ24gYml0LlxuICovXG5cbnZhciBfc2VxTG93ID0gbnVsbDtcbnZhciBfc2VxSGlnaCA9IG51bGw7XG52YXIgX21zZWNzID0gMDtcbmZ1bmN0aW9uIHY3KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIGluaXRpYWxpemUgYnVmZmVyIGFuZCBwb2ludGVyXG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuICB2YXIgYiA9IGJ1ZiB8fCBuZXcgVWludDhBcnJheSgxNik7XG5cbiAgLy8gcm5kcyBpcyBVaW50OEFycmF5KDE2KSBmaWxsZWQgd2l0aCByYW5kb20gYnl0ZXNcbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgX3JuZy5kZWZhdWx0KSgpO1xuXG4gIC8vIG1pbGxpc2Vjb25kcyBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwXG4gIHZhciBtc2VjcyA9IG9wdGlvbnMubXNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubXNlY3MgOiBEYXRlLm5vdygpO1xuXG4gIC8vIHNlcSBpcyB1c2VyIHByb3ZpZGVkIDMxIGJpdCBjb3VudGVyXG4gIHZhciBzZXEgPSBvcHRpb25zLnNlcSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zZXEgOiBudWxsO1xuXG4gIC8vIGluaXRpYWxpemUgbG9jYWwgc2VxIGhpZ2gvbG93IHBhcnRzXG4gIHZhciBzZXFIaWdoID0gX3NlcUhpZ2g7XG4gIHZhciBzZXFMb3cgPSBfc2VxTG93O1xuXG4gIC8vIGNoZWNrIGlmIGNsb2NrIGhhcyBhZHZhbmNlZCBhbmQgdXNlciBoYXMgbm90IHByb3ZpZGVkIG1zZWNzXG4gIGlmIChtc2VjcyA+IF9tc2VjcyAmJiBvcHRpb25zLm1zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBfbXNlY3MgPSBtc2VjcztcblxuICAgIC8vIHVubGVzcyB1c2VyIHByb3ZpZGVkIHNlcSwgcmVzZXQgc2VxIHBhcnRzXG4gICAgaWYgKHNlcSAhPT0gbnVsbCkge1xuICAgICAgc2VxSGlnaCA9IG51bGw7XG4gICAgICBzZXFMb3cgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGhhdmUgYSB1c2VyIHByb3ZpZGVkIHNlcVxuICBpZiAoc2VxICE9PSBudWxsKSB7XG4gICAgLy8gdHJpbSBwcm92aWRlZCBzZXEgdG8gMzEgYml0cyBvZiB2YWx1ZSwgYXZvaWRpbmcgb3ZlcmZsb3dcbiAgICBpZiAoc2VxID4gMHg3ZmZmZmZmZikge1xuICAgICAgc2VxID0gMHg3ZmZmZmZmZjtcbiAgICB9XG5cbiAgICAvLyBzcGxpdCBwcm92aWRlZCBzZXEgaW50byBoaWdoL2xvdyBwYXJ0c1xuICAgIHNlcUhpZ2ggPSBzZXEgPj4+IDE5ICYgMHhmZmY7XG4gICAgc2VxTG93ID0gc2VxICYgMHg3ZmZmZjtcbiAgfVxuXG4gIC8vIHJhbmRvbWx5IGluaXRpYWxpemUgc2VxXG4gIGlmIChzZXFIaWdoID09PSBudWxsIHx8IHNlcUxvdyA9PT0gbnVsbCkge1xuICAgIHNlcUhpZ2ggPSBybmRzWzZdICYgMHg3ZjtcbiAgICBzZXFIaWdoID0gc2VxSGlnaCA8PCA4IHwgcm5kc1s3XTtcbiAgICBzZXFMb3cgPSBybmRzWzhdICYgMHgzZjsgLy8gcGFkIGZvciB2YXJcbiAgICBzZXFMb3cgPSBzZXFMb3cgPDwgOCB8IHJuZHNbOV07XG4gICAgc2VxTG93ID0gc2VxTG93IDw8IDUgfCBybmRzWzEwXSA+Pj4gMztcbiAgfVxuXG4gIC8vIGluY3JlbWVudCBzZXEgaWYgd2l0aGluIG1zZWNzIHdpbmRvd1xuICBpZiAobXNlY3MgKyAxMDAwMCA+IF9tc2VjcyAmJiBzZXEgPT09IG51bGwpIHtcbiAgICBpZiAoKytzZXFMb3cgPiAweDdmZmZmKSB7XG4gICAgICBzZXFMb3cgPSAwO1xuICAgICAgaWYgKCsrc2VxSGlnaCA+IDB4ZmZmKSB7XG4gICAgICAgIHNlcUhpZ2ggPSAwO1xuXG4gICAgICAgIC8vIGluY3JlbWVudCBpbnRlcm5hbCBfbXNlY3MuIHRoaXMgYWxsb3dzIHVzIHRvIGNvbnRpbnVlIGluY3JlbWVudGluZ1xuICAgICAgICAvLyB3aGlsZSBzdGF5aW5nIG1vbm90b25pYy4gTm90ZSwgb25jZSB3ZSBoaXQgMTBrIG1pbGxpc2Vjb25kcyBiZXlvbmQgc3lzdGVtXG4gICAgICAgIC8vIGNsb2NrLCB3ZSB3aWxsIHJlc2V0IGJyZWFraW5nIG1vbm90b25pY2l0eSAoYWZ0ZXIgKDJeMzEpKjEwMDAwIGdlbmVyYXRpb25zKVxuICAgICAgICBfbXNlY3MrKztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzZXR0aW5nOyB3ZSBoYXZlIGFkdmFuY2VkIG1vcmUgdGhhblxuICAgIC8vIDEwayBtaWxsaXNlY29uZHMgYmV5b25kIHN5c3RlbSBjbG9ja1xuICAgIF9tc2VjcyA9IG1zZWNzO1xuICB9XG4gIF9zZXFIaWdoID0gc2VxSGlnaDtcbiAgX3NlcUxvdyA9IHNlcUxvdztcblxuICAvLyBbYnl0ZXMgMC01XSA0OCBiaXRzIG9mIGxvY2FsIHRpbWVzdGFtcFxuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYltpKytdID0gX21zZWNzIC8gMHgxMDAwMDAwMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMDAwMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMDAwICYgMHhmZjtcbiAgYltpKytdID0gX21zZWNzIC8gMHgxMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgJiAweGZmO1xuXG4gIC8vIFtieXRlIDZdIC0gc2V0IDQgYml0cyBvZiB2ZXJzaW9uICg3KSB3aXRoIGZpcnN0IDQgYml0cyBzZXFfaGlcbiAgYltpKytdID0gc2VxSGlnaCA+Pj4gNCAmIDB4MGYgfCAweDcwO1xuXG4gIC8vIFtieXRlIDddIHJlbWFpbmluZyA4IGJpdHMgb2Ygc2VxX2hpXG4gIGJbaSsrXSA9IHNlcUhpZ2ggJiAweGZmO1xuXG4gIC8vIFtieXRlIDhdIC0gdmFyaWFudCAoMiBiaXRzKSwgZmlyc3QgNiBiaXRzIHNlcV9sb3dcbiAgYltpKytdID0gc2VxTG93ID4+PiAxMyAmIDB4M2YgfCAweDgwO1xuXG4gIC8vIFtieXRlIDldIDggYml0cyBzZXFfbG93XG4gIGJbaSsrXSA9IHNlcUxvdyA+Pj4gNSAmIDB4ZmY7XG5cbiAgLy8gW2J5dGUgMTBdIHJlbWFpbmluZyA1IGJpdHMgc2VxX2xvdywgMyBiaXRzIHJhbmRvbVxuICBiW2krK10gPSBzZXFMb3cgPDwgMyAmIDB4ZmYgfCBybmRzWzEwXSAmIDB4MDc7XG5cbiAgLy8gW2J5dGVzIDExLTE1XSBhbHdheXMgcmFuZG9tXG4gIGJbaSsrXSA9IHJuZHNbMTFdO1xuICBiW2krK10gPSBybmRzWzEyXTtcbiAgYltpKytdID0gcm5kc1sxM107XG4gIGJbaSsrXSA9IHJuZHNbMTRdO1xuICBiW2krK10gPSBybmRzWzE1XTtcbiAgcmV0dXJuIGJ1ZiB8fCAoMCwgX3N0cmluZ2lmeS51bnNhZmVTdHJpbmdpZnkpKGIpO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdjc7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3JlZ2V4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9yZWdleC5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiB2YWxpZGF0ZSh1dWlkKSB7XG4gIHJldHVybiB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgJiYgX3JlZ2V4LmRlZmF1bHQudGVzdCh1dWlkKTtcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHZhbGlkYXRlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF92YWxpZGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdmFsaWRhdGUuanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghKDAsIF92YWxpZGF0ZS5kZWZhdWx0KSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE1KSwgMTYpO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdmVyc2lvbjsiLCIvKipcbiAqIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIGBwcmUtcHVibGlzaC5qc2AuXG4gKiBEbyBub3QgbWFudWFsbHkgZWRpdC5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCJhcmVhXCI6IHRydWUsXG4gIFwiYmFzZVwiOiB0cnVlLFxuICBcImJyXCI6IHRydWUsXG4gIFwiY29sXCI6IHRydWUsXG4gIFwiZW1iZWRcIjogdHJ1ZSxcbiAgXCJoclwiOiB0cnVlLFxuICBcImltZ1wiOiB0cnVlLFxuICBcImlucHV0XCI6IHRydWUsXG4gIFwibGlua1wiOiB0cnVlLFxuICBcIm1ldGFcIjogdHJ1ZSxcbiAgXCJwYXJhbVwiOiB0cnVlLFxuICBcInNvdXJjZVwiOiB0cnVlLFxuICBcInRyYWNrXCI6IHRydWUsXG4gIFwid2JyXCI6IHRydWVcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIF9fREVWX18gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nO1xuXG52YXIgd2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChfX0RFVl9fKSB7XG4gIHZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbiBwcmludFdhcm5pbmcoZm9ybWF0LCBhcmdzKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gPiAxID8gbGVuIC0gMSA6IDApO1xuICAgIGZvciAodmFyIGtleSA9IDE7IGtleSA8IGxlbjsga2V5KyspIHtcbiAgICAgIGFyZ3Nba2V5IC0gMV0gPSBhcmd1bWVudHNba2V5XTtcbiAgICB9XG4gICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICtcbiAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICB9KTtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9XG5cbiAgd2FybmluZyA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhcmdzKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gPiAyID8gbGVuIC0gMiA6IDApO1xuICAgIGZvciAodmFyIGtleSA9IDI7IGtleSA8IGxlbjsga2V5KyspIHtcbiAgICAgIGFyZ3Nba2V5IC0gMl0gPSBhcmd1bWVudHNba2V5XTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgK1xuICAgICAgICAgICdtZXNzYWdlIGFyZ3VtZW50J1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHByaW50V2FybmluZy5hcHBseShudWxsLCBbZm9ybWF0XS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd3cyBkb2VzIG5vdCB3b3JrIGluIHRoZSBicm93c2VyLiBCcm93c2VyIGNsaWVudHMgbXVzdCB1c2UgdGhlIG5hdGl2ZSAnICtcbiAgICAgICdXZWJTb2NrZXQgb2JqZWN0J1xuICApO1xufTtcbiIsImZ1bmN0aW9uIGUoZSxpLHQsbyl7Zm9yKDtpPj10JiYhZShcIihtaW4tcmVzb2x1dGlvbjogXCIraS9vK1wiZHBweClcIikubWF0Y2hlczspaS0tO3JldHVybiBpfWZ1bmN0aW9uIGkoaSl7aWYodm9pZCAwPT09aSYmKGk9d2luZG93KSwhaSlyZXR1cm4gMTtpZih2b2lkIDAhPT1pLmRldmljZVBpeGVsUmF0aW8pcmV0dXJuIGkuZGV2aWNlUGl4ZWxSYXRpbzt2YXIgdD1pLmRvY3VtZW50LmZyYW1lcztyZXR1cm4gdm9pZCAwIT09dD92b2lkIDAhPT10LmRldmljZVBpeGVsUmF0aW8/dC5kZXZpY2VQaXhlbFJhdGlvOnQuc2NyZWVuLmRldmljZVhEUEkvdC5zY3JlZW4uc3lzdGVtWERQSTp2b2lkIDAhPT1pLm1hdGNoTWVkaWE/ZnVuY3Rpb24oaSl7Zm9yKHZhciB0PWkubWF0Y2hNZWRpYSxvPTEwLG49LjEscj0xLGE9byxjPTA7Yzw0O2MrKylvPShhPTEwKmUodCxvLG4scikpKzksbj1hLHIqPTEwO3JldHVybiBhL3J9KGkpOjF9ZnVuY3Rpb24gdChlLHQpe3ZhciBvPShlIGluc3RhbmNlb2YgRWxlbWVudD9nZXRDb21wdXRlZFN0eWxlKGUpLnpvb206ZS56b29tKXx8MTtyZXR1cm4gaSh0KSooXCJzdHJpbmdcIj09dHlwZW9mIG8/cGFyc2VGbG9hdChvKTpvKX1leHBvcnR7dCBhcyBlbGVtZW50Wm9vbUxldmVsLGkgYXMgem9vbUxldmVsfTtcbiIsIi8qIChpZ25vcmVkKSAqLyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvZnJvbVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvYmluZFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2VudHJpZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9ldmVyeVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2ZpbHRlclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2ZpbmQtaW5kZXhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9maW5kXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9pbmNsdWRlc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uva2V5c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL21hcFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3JlZHVjZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3NsaWNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc29ydFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3NwbGljZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3N0YXJ0cy13aXRoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvdmFsdWVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvanNvbi9zdHJpbmdpZnlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9tYXBcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9udW1iZXIvaXMtaW50ZWdlclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9hc3NpZ25cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvY3JlYXRlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9lbnRyaWVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2ZyZWV6ZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9rZXlzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvcGFyc2UtaW50XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvcHJvbWlzZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL3NldC1pbnRlcnZhbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL3NldC10aW1lb3V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvc2V0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvd2Vhay1tYXBcIik7IiwidmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL2ZlYXR1cmVzL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanNcIik7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoXCIuL3RvUHJvcGVydHlLZXkuanNcIik7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkge1xuICByZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gX09iamVjdCRkZWZpbmVQcm9wZXJ0eShlLCByLCB7XG4gICAgdmFsdWU6IHQsXG4gICAgZW51bWVyYWJsZTogITAsXG4gICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICB3cml0YWJsZTogITBcbiAgfSkgOiBlW3JdID0gdCwgZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7XG4gIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7XG4gICAgXCJkZWZhdWx0XCI6IGVcbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfU3ltYm9sJHRvUHJpbWl0aXZlID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9mZWF0dXJlcy9zeW1ib2wvdG8tcHJpbWl0aXZlLmpzXCIpO1xudmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi90eXBlb2YuanNcIilbXCJkZWZhdWx0XCJdO1xuZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDtcbiAgdmFyIGUgPSB0W19TeW1ib2wkdG9QcmltaXRpdmVdO1xuICBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHRvUHJpbWl0aXZlLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi90eXBlb2YuanNcIilbXCJkZWZhdWx0XCJdO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZShcIi4vdG9QcmltaXRpdmUuanNcIik7XG5mdW5jdGlvbiB0b1Byb3BlcnR5S2V5KHQpIHtcbiAgdmFyIGkgPSB0b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTtcbiAgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjtcbn1cbm1vZHVsZS5leHBvcnRzID0gdG9Qcm9wZXJ0eUtleSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfU3ltYm9sID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9mZWF0dXJlcy9zeW1ib2wvaW5kZXguanNcIik7XG52YXIgX1N5bWJvbCRpdGVyYXRvciA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvZmVhdHVyZXMvc3ltYm9sL2l0ZXJhdG9yLmpzXCIpO1xuZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgX1N5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBfU3ltYm9sJGl0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG87XG4gIH0gOiBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgX1N5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBfU3ltYm9sICYmIG8gIT09IF9TeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvO1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMpLCBfdHlwZW9mKG8pO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL3N0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL3N0YWJsZS9zeW1ib2wnKTtcblxucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuZnVuY3Rpb24ubWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5hc3luYy1kaXNwb3NlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuZGlzcG9zZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLm1ldGFkYXRhJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL3N0YWJsZS9zeW1ib2wvaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhYmxlL3N5bWJvbC90by1wcmltaXRpdmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5mcm9tJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5mcm9tO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguQXJyYXkuaXNBcnJheTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0Jyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2NvbmNhdCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2VudHJpZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZXZlcnknKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZXZlcnknKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2ZpbHRlcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5maW5kLWluZGV4Jyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2ZpbmRJbmRleCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5maW5kJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2ZpbmQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2gnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZm9yRWFjaCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcycpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdpbmNsdWRlcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pbmRleC1vZicpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdpbmRleE9mJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAna2V5cycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5tYXAnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnbWFwJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZScpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdyZWR1Y2UnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuc2xpY2UnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnc2xpY2UnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuc29ydCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdzb3J0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LnNwbGljZScpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdzcGxpY2UnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICd2YWx1ZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuZnVuY3Rpb24uYmluZCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdGdW5jdGlvbicsICdiaW5kJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vZnVuY3Rpb24vdmlydHVhbC9iaW5kJyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmJpbmQ7XG4gIHJldHVybiBpdCA9PT0gRnVuY3Rpb25Qcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoRnVuY3Rpb25Qcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEZ1bmN0aW9uUHJvdG90eXBlLmJpbmQpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2NvbmNhdCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5jb25jYXQ7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmNvbmNhdCkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvZXZlcnknKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuZXZlcnk7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmV2ZXJ5KSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9maWx0ZXInKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuZmlsdGVyO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5maWx0ZXIpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2ZpbmQtaW5kZXgnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuZmluZEluZGV4O1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5maW5kSW5kZXgpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2ZpbmQnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuZmluZDtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuZmluZCkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIGFycmF5TWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9pbmNsdWRlcycpO1xudmFyIHN0cmluZ01ldGhvZCA9IHJlcXVpcmUoJy4uL3N0cmluZy92aXJ0dWFsL2luY2x1ZGVzJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcbnZhciBTdHJpbmdQcm90b3R5cGUgPSBTdHJpbmcucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuaW5jbHVkZXM7XG4gIGlmIChpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmluY2x1ZGVzKSkgcmV0dXJuIGFycmF5TWV0aG9kO1xuICBpZiAodHlwZW9mIGl0ID09ICdzdHJpbmcnIHx8IGl0ID09PSBTdHJpbmdQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoU3RyaW5nUHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBTdHJpbmdQcm90b3R5cGUuaW5jbHVkZXMpKSB7XG4gICAgcmV0dXJuIHN0cmluZ01ldGhvZDtcbiAgfSByZXR1cm4gb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2luZGV4LW9mJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmluZGV4T2Y7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmluZGV4T2YpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL21hcCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5tYXA7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLm1hcCkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvcmVkdWNlJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LnJlZHVjZTtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUucmVkdWNlKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9zbGljZScpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5zbGljZTtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuc2xpY2UpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL3NvcnQnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuc29ydDtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuc29ydCkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvc3BsaWNlJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LnNwbGljZTtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuc3BsaWNlKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vc3RyaW5nL3ZpcnR1YWwvc3RhcnRzLXdpdGgnKTtcblxudmFyIFN0cmluZ1Byb3RvdHlwZSA9IFN0cmluZy5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5zdGFydHNXaXRoO1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzdHJpbmcnIHx8IGl0ID09PSBTdHJpbmdQcm90b3R5cGVcbiAgICB8fCAoaXNQcm90b3R5cGVPZihTdHJpbmdQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IFN0cmluZ1Byb3RvdHlwZS5zdGFydHNXaXRoKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmRhdGUudG8tanNvbicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGFwcGx5ID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1qc29uIC0tIHNhZmVcbmlmICghcGF0aC5KU09OKSBwYXRoLkpTT04gPSB7IHN0cmluZ2lmeTogSlNPTi5zdHJpbmdpZnkgfTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3RyaW5naWZ5KGl0LCByZXBsYWNlciwgc3BhY2UpIHtcbiAgcmV0dXJuIGFwcGx5KHBhdGguSlNPTi5zdHJpbmdpZnksIG51bGwsIGFyZ3VtZW50cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5tYXAnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubWFwLmdyb3VwLWJ5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5NYXA7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNJbnRlZ2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuYXNzaWduO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuY3JlYXRlJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbnZhciBPYmplY3QgPSBwYXRoLk9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGUoUCwgRCkge1xuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShQLCBEKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxudmFyIE9iamVjdCA9IHBhdGguT2JqZWN0O1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcbn07XG5cbmlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkuc2hhbSkgZGVmaW5lUHJvcGVydHkuc2hhbSA9IHRydWU7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZW50cmllcztcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmZyZWV6ZScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmZyZWV6ZTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG52YXIgT2JqZWN0ID0gcGF0aC5PYmplY3Q7XG5cbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpO1xufTtcblxuaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2hhbSkgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLnNoYW0gPSB0cnVlO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3Qua2V5cycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmtleXM7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnBhcnNlLWludCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGgucGFyc2VJbnQ7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFueScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLndpdGgtcmVzb2x2ZXJzJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlByb21pc2U7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnNldC5kaWZmZXJlbmNlLnYyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnNldC5pbnRlcnNlY3Rpb24udjInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LmlzLWRpc2pvaW50LWZyb20udjInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LmlzLXN1YnNldC1vZi52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuaXMtc3VwZXJzZXQtb2YudjInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LnN5bW1ldHJpYy1kaWZmZXJlbmNlLnYyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnNldC51bmlvbi52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlNldDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ1N0cmluZycsICdpbmNsdWRlcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGgnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnU3RyaW5nJywgJ3N0YXJ0c1dpdGgnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24nKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLmhhcy1pbnN0YW5jZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gtYWxsJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5yZXBsYWNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5zZWFyY2gnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnNwZWNpZXMnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC50by1wcmltaXRpdmUnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnRvLXN0cmluZy10YWcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmpzb24udG8tc3RyaW5nLXRhZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucmVmbGVjdC50by1zdHJpbmctdGFnJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5TeW1ib2w7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvcicpO1xudmFyIFdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUuZignaXRlcmF0b3InKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuZGF0ZS50by1wcmltaXRpdmUnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZScpO1xudmFyIFdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUuZigndG9QcmltaXRpdmUnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy53ZWFrLW1hcCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguV2Vha01hcDtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vZnVsbC9vYmplY3QvZGVmaW5lLXByb3BlcnR5Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL2Z1bGwvc3ltYm9sJyk7XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL2Z1bGwvc3ltYm9sL2l0ZXJhdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL2Z1bGwvc3ltYm9sL3RvLXByaW1pdGl2ZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2FjdHVhbC9vYmplY3QvZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2FjdHVhbC9zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5pcy1yZWdpc3RlcmVkLXN5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXdlbGwta25vd24tc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuY3VzdG9tLW1hdGNoZXInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5vYnNlcnZhYmxlJyk7XG4vLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXJlZ2lzdGVyZWQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5pcy13ZWxsLWtub3duJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wubWF0Y2hlcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLm1ldGFkYXRhLWtleScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLnBhdHRlcm4tbWF0Y2gnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5yZXBsYWNlLWFsbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9hY3R1YWwvc3ltYm9sL2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2FjdHVhbC9zeW1ib2wvdG8tcHJpbWl0aXZlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NhbGxhYmxlKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IElzQ29uc3RydWN0b3IoYXJndW1lbnQpIGlzIHRydWVgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Bvc3NpYmxlUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXBvc3NpYmxlLXByb3RvdHlwZScpO1xuXG52YXIgJFN0cmluZyA9IFN0cmluZztcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNQb3NzaWJsZVByb3RvdHlwZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBzZXQgXCIgKyAkU3RyaW5nKGFyZ3VtZW50KSArICcgYXMgYSBwcm90b3R5cGUnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gUGVyZm9ybSA/IFJlcXVpcmVJbnRlcm5hbFNsb3QoTSwgW1tTZXREYXRhXV0pXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ID09ICdvYmplY3QnICYmICdzaXplJyBpbiBpdCAmJiAnaGFzJyBpbiBpdCAmJiAnYWRkJyBpbiBpdCAmJiAnZGVsZXRlJyBpbiBpdCAmJiAna2V5cycgaW4gaXQpIHJldHVybiBpdDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoaXQpICsgJyBpcyBub3QgYSBzZXQnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBQcm90b3R5cGUpIHtcbiAgaWYgKGlzUHJvdG90eXBlT2YoUHJvdG90eXBlLCBpdCkpIHJldHVybiBpdDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgJFN0cmluZyA9IFN0cmluZztcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBUeXBlKGFyZ3VtZW50KSBpcyBPYmplY3RgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNPYmplY3QoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKCRTdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gRkYyNi0gYnVnOiBBcnJheUJ1ZmZlcnMgYXJlIG5vbi1leHRlbnNpYmxlLCBidXQgT2JqZWN0LmlzRXh0ZW5zaWJsZSBkb2VzIG5vdCByZXBvcnQgaXRcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig4KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSwgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBpZiAoT2JqZWN0LmlzRXh0ZW5zaWJsZShidWZmZXIpKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVmZmVyLCAnYScsIHsgdmFsdWU6IDggfSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRmb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZvckVhY2g7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG5cbnZhciBTVFJJQ1RfTUVUSE9EID0gYXJyYXlNZXRob2RJc1N0cmljdCgnZm9yRWFjaCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxubW9kdWxlLmV4cG9ydHMgPSAhU1RSSUNUX01FVEhPRCA/IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgcmV0dXJuICRmb3JFYWNoKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1wcm90b3R5cGUtZm9yZWFjaCAtLSBzYWZlXG59IDogW10uZm9yRWFjaDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgaXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvcicpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yJyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG52YXIgJEFycmF5ID0gQXJyYXk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgdmFyIElTX0NPTlNUUlVDVE9SID0gaXNDb25zdHJ1Y3Rvcih0aGlzKTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgaWYgKG1hcHBpbmcpIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzTGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yLCBuZXh0LCB2YWx1ZTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICYmICEodGhpcyA9PT0gJEFycmF5ICYmIGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyYXRvck1ldGhvZCkpKSB7XG4gICAgcmVzdWx0ID0gSVNfQ09OU1RSVUNUT1IgPyBuZXcgdGhpcygpIDogW107XG4gICAgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihPLCBpdGVyYXRvck1ldGhvZCk7XG4gICAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gICAgZm9yICg7IShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgIHZhbHVlID0gbWFwcGluZyA/IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWU7XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHJlc3VsdCA9IElTX0NPTlNUUlVDVE9SID8gbmV3IHRoaXMobGVuZ3RoKSA6ICRBcnJheShsZW5ndGgpO1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT09IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgICBpZiAodmFsdWUgIT09IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGZvckVhY2gsIG1hcCwgZmlsdGVyLCBzb21lLCBldmVyeSwgZmluZCwgZmluZEluZGV4LCBmaWx0ZXJSZWplY3QgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09PSAxO1xuICB2YXIgSVNfRklMVEVSID0gVFlQRSA9PT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09PSA0O1xuICB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT09IDY7XG4gIHZhciBJU19GSUxURVJfUkVKRUNUID0gVFlQRSA9PT0gNztcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0LCBzcGVjaWZpY0NyZWF0ZSkge1xuICAgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpO1xuICAgIHZhciBzZWxmID0gSW5kZXhlZE9iamVjdChPKTtcbiAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2Uoc2VsZik7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIHRoYXQpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgICB2YXIgdGFyZ2V0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSIHx8IElTX0ZJTFRFUl9SRUpFQ1QgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWx1ZSwgcmVzdWx0O1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikge1xuICAgICAgdmFsdWUgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHRhcmdldFtpbmRleF0gPSByZXN1bHQ7IC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsdWU7ICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiBwdXNoKHRhcmdldCwgdmFsdWUpOyAgICAgIC8vIGZpbHRlclxuICAgICAgICB9IGVsc2Ugc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgIC8vIGV2ZXJ5XG4gICAgICAgICAgY2FzZSA3OiBwdXNoKHRhcmdldCwgdmFsdWUpOyAgICAgIC8vIGZpbHRlclJlamVjdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4gIG1hcDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuICBmaWx0ZXI6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuICBzb21lOiBjcmVhdGVNZXRob2QoMyksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5ldmVyeVxuICBldmVyeTogY3JlYXRlTWV0aG9kKDQpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4gIGZpbmQ6IGNyZWF0ZU1ldGhvZCg1KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyUmVqZWN0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXJyYXktZmlsdGVyaW5nXG4gIGZpbHRlclJlamVjdDogY3JlYXRlTWV0aG9kKDcpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC12OC12ZXJzaW9uJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIC8vIFdlIGNhbid0IHVzZSB0aGlzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc3XG4gIHJldHVybiBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gYXJyYXkuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGZvbzogMSB9O1xuICAgIH07XG4gICAgcmV0dXJuIGFycmF5W01FVEhPRF9OQU1FXShCb29sZWFuKS5mb28gIT09IDE7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgYXJndW1lbnQpIHtcbiAgdmFyIG1ldGhvZCA9IFtdW01FVEhPRF9OQU1FXTtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgbWV0aG9kLmNhbGwobnVsbCwgYXJndW1lbnQgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSwgMSk7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFJFRFVDRV9FTVBUWSA9ICdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJztcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IHJlZHVjZSwgcmVkdWNlUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19SSUdIVCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c0xlbmd0aCwgbWVtbykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhhdCk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICBhQ2FsbGFibGUoY2FsbGJhY2tmbik7XG4gICAgaWYgKGxlbmd0aCA9PT0gMCAmJiBhcmd1bWVudHNMZW5ndGggPCAyKSB0aHJvdyBuZXcgJFR5cGVFcnJvcihSRURVQ0VfRU1QVFkpO1xuICAgIHZhciBpbmRleCA9IElTX1JJR0hUID8gbGVuZ3RoIC0gMSA6IDA7XG4gICAgdmFyIGkgPSBJU19SSUdIVCA/IC0xIDogMTtcbiAgICBpZiAoYXJndW1lbnRzTGVuZ3RoIDwgMikgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgICAgIG1lbW8gPSBzZWxmW2luZGV4XTtcbiAgICAgICAgaW5kZXggKz0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpbmRleCArPSBpO1xuICAgICAgaWYgKElTX1JJR0hUID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICAgIHRocm93IG5ldyAkVHlwZUVycm9yKFJFRFVDRV9FTVBUWSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoO0lTX1JJR0hUID8gaW5kZXggPj0gMCA6IGxlbmd0aCA+IGluZGV4OyBpbmRleCArPSBpKSBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgbWVtbyA9IGNhbGxiYWNrZm4obWVtbywgc2VsZltpbmRleF0sIGluZGV4LCBPKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbW87XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VcbiAgbGVmdDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZXJpZ2h0XG4gIHJpZ2h0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIFNhZmFyaSA8IDEzIGRvZXMgbm90IHRocm93IGFuIGVycm9yIGluIHRoaXMgY2FzZVxudmFyIFNJTEVOVF9PTl9OT05fV1JJVEFCTEVfTEVOR1RIX1NFVCA9IERFU0NSSVBUT1JTICYmICFmdW5jdGlvbiAoKSB7XG4gIC8vIG1ha2VzIG5vIHNlbnNlIHdpdGhvdXQgcHJvcGVyIHN0cmljdCBtb2RlIHN1cHBvcnRcbiAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB3cml0YWJsZTogZmFsc2UgfSkubGVuZ3RoID0gMTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3I7XG4gIH1cbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPyBmdW5jdGlvbiAoTywgbGVuZ3RoKSB7XG4gIGlmIChpc0FycmF5KE8pICYmICFnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgJ2xlbmd0aCcpLndyaXRhYmxlKSB7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgnKTtcbiAgfSByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59IDogZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzKFtdLnNsaWNlKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbnZhciBzb3J0ID0gZnVuY3Rpb24gKGFycmF5LCBjb21wYXJlZm4pIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOCkge1xuICAgIC8vIGluc2VydGlvbiBzb3J0XG4gICAgdmFyIGkgPSAxO1xuICAgIHZhciBlbGVtZW50LCBqO1xuXG4gICAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICAgIGogPSBpO1xuICAgICAgZWxlbWVudCA9IGFycmF5W2ldO1xuICAgICAgd2hpbGUgKGogJiYgY29tcGFyZWZuKGFycmF5W2ogLSAxXSwgZWxlbWVudCkgPiAwKSB7XG4gICAgICAgIGFycmF5W2pdID0gYXJyYXlbLS1qXTtcbiAgICAgIH1cbiAgICAgIGlmIChqICE9PSBpKyspIGFycmF5W2pdID0gZWxlbWVudDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gbWVyZ2Ugc29ydFxuICAgIHZhciBtaWRkbGUgPSBmbG9vcihsZW5ndGggLyAyKTtcbiAgICB2YXIgbGVmdCA9IHNvcnQoYXJyYXlTbGljZShhcnJheSwgMCwgbWlkZGxlKSwgY29tcGFyZWZuKTtcbiAgICB2YXIgcmlnaHQgPSBzb3J0KGFycmF5U2xpY2UoYXJyYXksIG1pZGRsZSksIGNvbXBhcmVmbik7XG4gICAgdmFyIGxsZW5ndGggPSBsZWZ0Lmxlbmd0aDtcbiAgICB2YXIgcmxlbmd0aCA9IHJpZ2h0Lmxlbmd0aDtcbiAgICB2YXIgbGluZGV4ID0gMDtcbiAgICB2YXIgcmluZGV4ID0gMDtcblxuICAgIHdoaWxlIChsaW5kZXggPCBsbGVuZ3RoIHx8IHJpbmRleCA8IHJsZW5ndGgpIHtcbiAgICAgIGFycmF5W2xpbmRleCArIHJpbmRleF0gPSAobGluZGV4IDwgbGxlbmd0aCAmJiByaW5kZXggPCBybGVuZ3RoKVxuICAgICAgICA/IGNvbXBhcmVmbihsZWZ0W2xpbmRleF0sIHJpZ2h0W3JpbmRleF0pIDw9IDAgPyBsZWZ0W2xpbmRleCsrXSA6IHJpZ2h0W3JpbmRleCsrXVxuICAgICAgICA6IGxpbmRleCA8IGxsZW5ndGggPyBsZWZ0W2xpbmRleCsrXSA6IHJpZ2h0W3JpbmRleCsrXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3InKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciAkQXJyYXkgPSBBcnJheTtcblxuLy8gYSBwYXJ0IG9mIGBBcnJheVNwZWNpZXNDcmVhdGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXkpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsQXJyYXkpKSB7XG4gICAgQyA9IG9yaWdpbmFsQXJyYXkuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAoaXNDb25zdHJ1Y3RvcihDKSAmJiAoQyA9PT0gJEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/ICRBcnJheSA6IEM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFycmF5U3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3InKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKGFycmF5U3BlY2llc0NvbnN0cnVjdG9yKG9yaWdpbmFsQXJyYXkpKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtZXRob2ROYW1lLCBudW1BcmdzKSB7XG4gIHJldHVybiBudW1BcmdzID09PSAxID8gZnVuY3Rpb24gKG9iamVjdCwgYXJnKSB7XG4gICAgcmV0dXJuIG9iamVjdFttZXRob2ROYW1lXShhcmcpO1xuICB9IDogZnVuY3Rpb24gKG9iamVjdCwgYXJnMSwgYXJnMikge1xuICAgIHJldHVybiBvYmplY3RbbWV0aG9kTmFtZV0oYXJnMSwgYXJnMik7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20sIG5vLXRocm93LWxpdGVyYWwgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICB0cnkge1xuICAgIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgcmV0dXJuIGZhbHNlOyB9IC8vIHdvcmthcm91bmQgb2Ygb2xkIFdlYktpdCArIGBldmFsYCBidWdcbiAgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIG9iamVjdFtJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogSVRFUkFUSU9OX1NVUFBPUlQgPSB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBleGVjKG9iamVjdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIElURVJBVElPTl9TVVBQT1JUO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoe30udG9TdHJpbmcpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gc3RyaW5nU2xpY2UodG9TdHJpbmcoaXQpLCA4LCAtMSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdyhmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9ICRPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWdcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PT0gJ09iamVjdCcgJiYgaXNDYWxsYWJsZShPLmNhbGxlZSkgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yJyk7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lJyk7XG52YXIgY3JlYXRlSXRlclJlc3VsdE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlci1yZXN1bHQtb2JqZWN0Jyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLmZhc3RLZXk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIFByb3RvdHlwZSk7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAgICAgaW5kZXg6IGNyZWF0ZShudWxsKSxcbiAgICAgICAgZmlyc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkLFxuICAgICAgICBzaXplOiAwXG4gICAgICB9KTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMpIHRoYXQuc2l6ZSA9IDA7XG4gICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0ZXJhYmxlKSkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIFByb3RvdHlwZSA9IENvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIHZhciBkZWZpbmUgPSBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICB2YXIgcHJldmlvdXMsIGluZGV4O1xuICAgICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmxhc3QgPSBlbnRyeSA9IHtcbiAgICAgICAgICBpbmRleDogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cyA9IHN0YXRlLmxhc3QsXG4gICAgICAgICAgbmV4dDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlbW92ZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGlmICghc3RhdGUuZmlyc3QpIHN0YXRlLmZpcnN0ID0gZW50cnk7XG4gICAgICAgIGlmIChwcmV2aW91cykgcHJldmlvdXMubmV4dCA9IGVudHJ5O1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUrKztcbiAgICAgICAgZWxzZSB0aGF0LnNpemUrKztcbiAgICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfTtcblxuICAgIHZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAvLyBmYXN0IGNhc2VcbiAgICAgIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgICAgIHZhciBlbnRyeTtcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gc3RhdGUuaW5kZXhbaW5kZXhdO1xuICAgICAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gICAgICBmb3IgKGVudHJ5ID0gc3RhdGUuZmlyc3Q7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm5leHQpIHtcbiAgICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KSByZXR1cm4gZW50cnk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRlZmluZUJ1aWx0SW5zKFByb3RvdHlwZSwge1xuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuY2xlYXIoKWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmNsZWFyXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuY2xlYXJcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgICB2YXIgZW50cnkgPSBzdGF0ZS5maXJzdDtcbiAgICAgICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGVudHJ5LnByZXZpb3VzKSBlbnRyeS5wcmV2aW91cyA9IGVudHJ5LnByZXZpb3VzLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZpcnN0ID0gc3RhdGUubGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3RhdGUuaW5kZXggPSBjcmVhdGUobnVsbCk7XG4gICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZSA9IDA7XG4gICAgICAgIGVsc2UgdGhhdC5zaXplID0gMDtcbiAgICAgIH0sXG4gICAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS5kZWxldGUoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmRlbGV0ZVxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmRlbGV0ZVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm5leHQ7XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgICBkZWxldGUgc3RhdGUuaW5kZXhbZW50cnkuaW5kZXhdO1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm5leHQgPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnByZXZpb3VzID0gcHJldjtcbiAgICAgICAgICBpZiAoc3RhdGUuZmlyc3QgPT09IGVudHJ5KSBzdGF0ZS5maXJzdCA9IG5leHQ7XG4gICAgICAgICAgaWYgKHN0YXRlLmxhc3QgPT09IGVudHJ5KSBzdGF0ZS5sYXN0ID0gcHJldjtcbiAgICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUtLTtcbiAgICAgICAgICBlbHNlIHRoYXQuc2l6ZS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5mb3JlYWNoXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuZm9yZWFjaFxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7XG4gICAgICAgICAgYm91bmRGdW5jdGlvbihlbnRyeS52YWx1ZSwgZW50cnkua2V5LCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGB7IE1hcCwgU2V0fS5wcm90b3R5cGUuaGFzKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5oYXNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5oYXNcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGVmaW5lQnVpbHRJbnMoUHJvdG90eXBlLCBJU19NQVAgPyB7XG4gICAgICAvLyBgTWFwLnByb3RvdHlwZS5nZXQoa2V5KWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZ2V0XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnZhbHVlO1xuICAgICAgfSxcbiAgICAgIC8vIGBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuc2V0XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyBgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5hZGRcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykuc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH0sXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApIHtcbiAgICB2YXIgSVRFUkFUT1JfTkFNRSA9IENPTlNUUlVDVE9SX05BTUUgKyAnIEl0ZXJhdG9yJztcbiAgICB2YXIgZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuICAgIHZhciBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKElURVJBVE9SX05BTUUpO1xuICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLnsga2V5cywgdmFsdWVzLCBlbnRyaWVzLCBAQGl0ZXJhdG9yIH0oKWAgbWV0aG9kc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5lbnRyaWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmtleXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUudmFsdWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLUBAaXRlcmF0b3JcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuZW50cmllc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5rZXlzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLnZhbHVlc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4gICAgZGVmaW5lSXRlcmF0b3IoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICAgIHR5cGU6IElURVJBVE9SX05BTUUsXG4gICAgICAgIHRhcmdldDogaXRlcmF0ZWQsXG4gICAgICAgIHN0YXRlOiBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZShpdGVyYXRlZCksXG4gICAgICAgIGtpbmQ6IGtpbmQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlKHRoaXMpO1xuICAgICAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kO1xuICAgICAgdmFyIGVudHJ5ID0gc3RhdGUubGFzdDtcbiAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpIGVudHJ5ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCFzdGF0ZS50YXJnZXQgfHwgIShzdGF0ZS5sYXN0ID0gZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm5leHQgOiBzdGF0ZS5zdGF0ZS5maXJzdCkpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdCh1bmRlZmluZWQsIHRydWUpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT09ICdrZXlzJykgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QoZW50cnkua2V5LCBmYWxzZSk7XG4gICAgICBpZiAoa2luZCA9PT0gJ3ZhbHVlcycpIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KGVudHJ5LnZhbHVlLCBmYWxzZSk7XG4gICAgICByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdChbZW50cnkua2V5LCBlbnRyeS52YWx1ZV0sIGZhbHNlKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZVtAQHNwZWNpZXNdYCBhY2Nlc3NvcnNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1tYXAtQEBzcGVjaWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXQtc2V0LUBAc3BlY2llc1xuICAgIHNldFNwZWNpZXMoQ09OU1RSVUNUT1JfTkFNRSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucycpO1xudmFyIGdldFdlYWtEYXRhID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJykuZ2V0V2Vha0RhdGE7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgQXJyYXlJdGVyYXRpb25Nb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yO1xudmFyIGZpbmQgPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kO1xudmFyIGZpbmRJbmRleCA9IEFycmF5SXRlcmF0aW9uTW9kdWxlLmZpbmRJbmRleDtcbnZhciBzcGxpY2UgPSB1bmN1cnJ5VGhpcyhbXS5zcGxpY2UpO1xudmFyIGlkID0gMDtcblxuLy8gZmFsbGJhY2sgZm9yIHVuY2F1Z2h0IGZyb3plbiBrZXlzXG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZnJvemVuIHx8IChzdGF0ZS5mcm96ZW4gPSBuZXcgVW5jYXVnaHRGcm96ZW5TdG9yZSgpKTtcbn07XG5cbnZhciBVbmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVudHJpZXMgPSBbXTtcbn07XG5cbnZhciBmaW5kVW5jYXVnaHRGcm96ZW4gPSBmdW5jdGlvbiAoc3RvcmUsIGtleSkge1xuICByZXR1cm4gZmluZChzdG9yZS5lbnRyaWVzLCBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgfSk7XG59O1xuXG5VbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZSA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSByZXR1cm4gZW50cnlbMV07XG4gIH0sXG4gIGhhczogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSBlbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5lbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXgodGhpcy5lbnRyaWVzLCBmdW5jdGlvbiAoaXQpIHtcbiAgICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICAgIH0pO1xuICAgIGlmICh+aW5kZXgpIHNwbGljZSh0aGlzLmVudHJpZXMsIGluZGV4LCAxKTtcbiAgICByZXR1cm4gISF+aW5kZXg7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBQcm90b3R5cGUpO1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7XG4gICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsXG4gICAgICAgIGlkOiBpZCsrLFxuICAgICAgICBmcm96ZW46IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0ZXJhYmxlKSkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIFByb3RvdHlwZSA9IENvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIHZhciBkZWZpbmUgPSBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoYW5PYmplY3Qoa2V5KSwgdHJ1ZSk7XG4gICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgZWxzZSBkYXRhW3N0YXRlLmlkXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgfTtcblxuICAgIGRlZmluZUJ1aWx0SW5zKFByb3RvdHlwZSwge1xuICAgICAgLy8gYHsgV2Vha01hcCwgV2Vha1NldCB9LnByb3RvdHlwZS5kZWxldGUoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLnByb3RvdHlwZS5kZWxldGVcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha3NldC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpO1xuICAgICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpWydkZWxldGUnXShrZXkpO1xuICAgICAgICByZXR1cm4gZGF0YSAmJiBoYXNPd24oZGF0YSwgc3RhdGUuaWQpICYmIGRlbGV0ZSBkYXRhW3N0YXRlLmlkXTtcbiAgICAgIH0sXG4gICAgICAvLyBgeyBXZWFrTWFwLCBXZWFrU2V0IH0ucHJvdG90eXBlLmhhcyhrZXkpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWttYXAucHJvdG90eXBlLmhhc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrc2V0LnByb3RvdHlwZS5oYXNcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpO1xuICAgICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLmhhcyhrZXkpO1xuICAgICAgICByZXR1cm4gZGF0YSAmJiBoYXNPd24oZGF0YSwgc3RhdGUuaWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGVmaW5lQnVpbHRJbnMoUHJvdG90eXBlLCBJU19NQVAgPyB7XG4gICAgICAvLyBgV2Vha01hcC5wcm90b3R5cGUuZ2V0KGtleSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLnByb3RvdHlwZS5nZXRcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLmdldChrZXkpO1xuICAgICAgICAgIHJldHVybiBkYXRhID8gZGF0YVtzdGF0ZS5pZF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC5wcm90b3R5cGUuc2V0XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIC8vIGBXZWFrU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha3NldC5wcm90b3R5cGUuYWRkXG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIHZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5mb3JFYWNoO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSwgd3JhcHBlciwgY29tbW9uKSB7XG4gIHZhciBJU19NQVAgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ01hcCcpICE9PSAtMTtcbiAgdmFyIElTX1dFQUsgPSBDT05TVFJVQ1RPUl9OQU1FLmluZGV4T2YoJ1dlYWsnKSAhPT0gLTE7XG4gIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7XG4gIHZhciBOYXRpdmVDb25zdHJ1Y3RvciA9IGdsb2JhbFRoaXNbQ09OU1RSVUNUT1JfTkFNRV07XG4gIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHZhciBleHBvcnRlZCA9IHt9O1xuICB2YXIgQ29uc3RydWN0b3I7XG5cbiAgaWYgKCFERVNDUklQVE9SUyB8fCAhaXNDYWxsYWJsZShOYXRpdmVDb25zdHJ1Y3RvcilcbiAgICB8fCAhKElTX1dFQUsgfHwgTmF0aXZlUHJvdG90eXBlLmZvckVhY2ggJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCkuZW50cmllcygpLm5leHQoKTsgfSkpXG4gICkge1xuICAgIC8vIGNyZWF0ZSBjb2xsZWN0aW9uIGNvbnN0cnVjdG9yXG4gICAgQ29uc3RydWN0b3IgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZS5lbmFibGUoKTtcbiAgfSBlbHNlIHtcbiAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKHRhcmdldCwgaXRlcmFibGUpIHtcbiAgICAgIHNldEludGVybmFsU3RhdGUoYW5JbnN0YW5jZSh0YXJnZXQsIFByb3RvdHlwZSksIHtcbiAgICAgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAgICAgY29sbGVjdGlvbjogbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKClcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpdGVyYWJsZSkpIGl0ZXJhdGUoaXRlcmFibGUsIHRhcmdldFtBRERFUl0sIHsgdGhhdDogdGFyZ2V0LCBBU19FTlRSSUVTOiBJU19NQVAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgUHJvdG90eXBlID0gQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4gICAgdmFyIGdldEludGVybmFsU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuXG4gICAgZm9yRWFjaChbJ2FkZCcsICdjbGVhcicsICdkZWxldGUnLCAnZm9yRWFjaCcsICdnZXQnLCAnaGFzJywgJ3NldCcsICdrZXlzJywgJ3ZhbHVlcycsICdlbnRyaWVzJ10sIGZ1bmN0aW9uIChLRVkpIHtcbiAgICAgIHZhciBJU19BRERFUiA9IEtFWSA9PT0gJ2FkZCcgfHwgS0VZID09PSAnc2V0JztcbiAgICAgIGlmIChLRVkgaW4gTmF0aXZlUHJvdG90eXBlICYmICEoSVNfV0VBSyAmJiBLRVkgPT09ICdjbGVhcicpKSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShQcm90b3R5cGUsIEtFWSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICB2YXIgY29sbGVjdGlvbiA9IGdldEludGVybmFsU3RhdGUodGhpcykuY29sbGVjdGlvbjtcbiAgICAgICAgICBpZiAoIUlTX0FEREVSICYmIElTX1dFQUsgJiYgIWlzT2JqZWN0KGEpKSByZXR1cm4gS0VZID09PSAnZ2V0JyA/IHVuZGVmaW5lZCA6IGZhbHNlO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBjb2xsZWN0aW9uW0tFWV0oYSA9PT0gMCA/IDAgOiBhLCBiKTtcbiAgICAgICAgICByZXR1cm4gSVNfQURERVIgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIElTX1dFQUsgfHwgZGVmaW5lUHJvcGVydHkoUHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5jb2xsZWN0aW9uLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgZmFsc2UsIHRydWUpO1xuXG4gIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gQ29uc3RydWN0b3I7XG4gICQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCBleHBvcnRlZCk7XG5cbiAgaWYgKCFJU19XRUFLKSBjb21tb24uc2V0U3Ryb25nKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlLCBleGNlcHRpb25zKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzT3duKHRhcmdldCwga2V5KSAmJiAhKGV4Y2VwdGlvbnMgJiYgaGFzT3duKGV4Y2VwdGlvbnMsIGtleSkpKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgfVxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIHZhciByZWdleHAgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgIHRyeSB7XG4gICAgICByZWdleHBbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gICAgfSBjYXRjaCAoZXJyb3IyKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICBGLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG51bGw7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0cHJvdG90eXBlb2YgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRigpKSAhPT0gRi5wcm90b3R5cGU7XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGBDcmVhdGVJdGVyUmVzdWx0T2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlaXRlcnJlc3VsdG9iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUsIGRvbmUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiBkb25lIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBrZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtrZXldID0gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgcGFkU3RhcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZCcpLnN0YXJ0O1xuXG52YXIgJFJhbmdlRXJyb3IgPSBSYW5nZUVycm9yO1xudmFyICRpc0Zpbml0ZSA9IGlzRmluaXRlO1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIERhdGVQcm90b3R5cGUgPSBEYXRlLnByb3RvdHlwZTtcbnZhciBuYXRpdmVEYXRlVG9JU09TdHJpbmcgPSBEYXRlUHJvdG90eXBlLnRvSVNPU3RyaW5nO1xudmFyIHRoaXNUaW1lVmFsdWUgPSB1bmN1cnJ5VGhpcyhEYXRlUHJvdG90eXBlLmdldFRpbWUpO1xudmFyIGdldFVUQ0RhdGUgPSB1bmN1cnJ5VGhpcyhEYXRlUHJvdG90eXBlLmdldFVUQ0RhdGUpO1xudmFyIGdldFVUQ0Z1bGxZZWFyID0gdW5jdXJyeVRoaXMoRGF0ZVByb3RvdHlwZS5nZXRVVENGdWxsWWVhcik7XG52YXIgZ2V0VVRDSG91cnMgPSB1bmN1cnJ5VGhpcyhEYXRlUHJvdG90eXBlLmdldFVUQ0hvdXJzKTtcbnZhciBnZXRVVENNaWxsaXNlY29uZHMgPSB1bmN1cnJ5VGhpcyhEYXRlUHJvdG90eXBlLmdldFVUQ01pbGxpc2Vjb25kcyk7XG52YXIgZ2V0VVRDTWludXRlcyA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VVRDTWludXRlcyk7XG52YXIgZ2V0VVRDTW9udGggPSB1bmN1cnJ5VGhpcyhEYXRlUHJvdG90eXBlLmdldFVUQ01vbnRoKTtcbnZhciBnZXRVVENTZWNvbmRzID0gdW5jdXJyeVRoaXMoRGF0ZVByb3RvdHlwZS5nZXRVVENTZWNvbmRzKTtcblxuLy8gYERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZGF0ZS5wcm90b3R5cGUudG9pc29zdHJpbmdcbi8vIFBoYW50b21KUyAvIG9sZCBXZWJLaXQgZmFpbHMgaGVyZTpcbm1vZHVsZS5leHBvcnRzID0gKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5hdGl2ZURhdGVUb0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKC01ZTEzIC0gMSkpICE9PSAnMDM4NS0wNy0yNVQwNzowNjozOS45OTlaJztcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIG5hdGl2ZURhdGVUb0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKE5hTikpO1xufSkpID8gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7XG4gIGlmICghJGlzRmluaXRlKHRoaXNUaW1lVmFsdWUodGhpcykpKSB0aHJvdyBuZXcgJFJhbmdlRXJyb3IoJ0ludmFsaWQgdGltZSB2YWx1ZScpO1xuICB2YXIgZGF0ZSA9IHRoaXM7XG4gIHZhciB5ZWFyID0gZ2V0VVRDRnVsbFllYXIoZGF0ZSk7XG4gIHZhciBtaWxsaXNlY29uZHMgPSBnZXRVVENNaWxsaXNlY29uZHMoZGF0ZSk7XG4gIHZhciBzaWduID0geWVhciA8IDAgPyAnLScgOiB5ZWFyID4gOTk5OSA/ICcrJyA6ICcnO1xuICByZXR1cm4gc2lnbiArIHBhZFN0YXJ0KGFicyh5ZWFyKSwgc2lnbiA/IDYgOiA0LCAwKSArXG4gICAgJy0nICsgcGFkU3RhcnQoZ2V0VVRDTW9udGgoZGF0ZSkgKyAxLCAyLCAwKSArXG4gICAgJy0nICsgcGFkU3RhcnQoZ2V0VVRDRGF0ZShkYXRlKSwgMiwgMCkgK1xuICAgICdUJyArIHBhZFN0YXJ0KGdldFVUQ0hvdXJzKGRhdGUpLCAyLCAwKSArXG4gICAgJzonICsgcGFkU3RhcnQoZ2V0VVRDTWludXRlcyhkYXRlKSwgMiwgMCkgK1xuICAgICc6JyArIHBhZFN0YXJ0KGdldFVUQ1NlY29uZHMoZGF0ZSksIDIsIDApICtcbiAgICAnLicgKyBwYWRTdGFydChtaWxsaXNlY29uZHMsIDMsIDApICtcbiAgICAnWic7XG59IDogbmF0aXZlRGF0ZVRvSVNPU3RyaW5nO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBuYW1lLCBkZXNjcmlwdG9yKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eS5mKHRhcmdldCwgbmFtZSwgZGVzY3JpcHRvcik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZW51bWVyYWJsZSkgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGFyZ2V0LCBrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIG9wdGlvbnMpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudW5zYWZlICYmIHRhcmdldFtrZXldKSB0YXJnZXRba2V5XSA9IHNyY1trZXldO1xuICAgIGVsc2UgZGVmaW5lQnVpbHRJbih0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpO1xuICB9IHJldHVybiB0YXJnZXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFRoaXNba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgUCkge1xuICBpZiAoIWRlbGV0ZSBPW1BdKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignQ2Fubm90IGRlbGV0ZSBwcm9wZXJ0eSAnICsgdHJ5VG9TdHJpbmcoUCkgKyAnIG9mICcgKyB0cnlUb1N0cmluZyhPKSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIERldGVjdCBJRTgncyBpbmNvbXBsZXRlIGRlZmluZVByb3BlcnR5IGltcGxlbWVudGF0aW9uXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSlbMV0gIT09IDc7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBFWElTVFMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSAweDFGRkZGRkZGRkZGRkZGOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA+IE1BWF9TQUZFX0lOVEVHRVIpIHRocm93ICRUeXBlRXJyb3IoJ01heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCcpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaXRlcmFibGUgRE9NIGNvbGxlY3Rpb25zXG4vLyBmbGFnIC0gYGl0ZXJhYmxlYCBpbnRlcmZhY2UgLSAnZW50cmllcycsICdrZXlzJywgJ3ZhbHVlcycsICdmb3JFYWNoJyBtZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IDAsXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IDAsXG4gIENTU1ZhbHVlTGlzdDogMCxcbiAgQ2xpZW50UmVjdExpc3Q6IDAsXG4gIERPTVJlY3RMaXN0OiAwLFxuICBET01TdHJpbmdMaXN0OiAwLFxuICBET01Ub2tlbkxpc3Q6IDEsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiAwLFxuICBGaWxlTGlzdDogMCxcbiAgSFRNTEFsbENvbGxlY3Rpb246IDAsXG4gIEhUTUxDb2xsZWN0aW9uOiAwLFxuICBIVE1MRm9ybUVsZW1lbnQ6IDAsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiAwLFxuICBNZWRpYUxpc3Q6IDAsXG4gIE1pbWVUeXBlQXJyYXk6IDAsXG4gIE5hbWVkTm9kZU1hcDogMCxcbiAgTm9kZUxpc3Q6IDEsXG4gIFBhaW50UmVxdWVzdExpc3Q6IDAsXG4gIFBsdWdpbjogMCxcbiAgUGx1Z2luQXJyYXk6IDAsXG4gIFNWR0xlbmd0aExpc3Q6IDAsXG4gIFNWR051bWJlckxpc3Q6IDAsXG4gIFNWR1BhdGhTZWdMaXN0OiAwLFxuICBTVkdQb2ludExpc3Q6IDAsXG4gIFNWR1N0cmluZ0xpc3Q6IDAsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IDAsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IDAsXG4gIFN0eWxlU2hlZXRMaXN0OiAwLFxuICBUZXh0VHJhY2tDdWVMaXN0OiAwLFxuICBUZXh0VHJhY2tMaXN0OiAwLFxuICBUb3VjaExpc3Q6IDBcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gW1xuICAnY29uc3RydWN0b3InLFxuICAnaGFzT3duUHJvcGVydHknLFxuICAnaXNQcm90b3R5cGVPZicsXG4gICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJ1xuXTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdXNlci1hZ2VudCcpO1xuXG52YXIgZmlyZWZveCA9IHVzZXJBZ2VudC5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS9pKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIWZpcmVmb3ggJiYgK2ZpcmVmb3hbMV07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVUEgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC9NU0lFfFRyaWRlbnQvLnRlc3QoVUEpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gL2lwYWR8aXBob25lfGlwb2QvaS50ZXN0KHVzZXJBZ2VudCkgJiYgdHlwZW9mIFBlYmJsZSAhPSAndW5kZWZpbmVkJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdXNlci1hZ2VudCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVkb3Mvbm8tdnVsbmVyYWJsZSAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IC8oPzppcGFkfGlwaG9uZXxpcG9kKS4qYXBwbGV3ZWJraXQvaS50ZXN0KHVzZXJBZ2VudCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgRU5WSVJPTk1FTlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBFTlZJUk9OTUVOVCA9PT0gJ05PREUnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gL3dlYjBzKD8hLipjaHJvbWUpL2kudGVzdCh1c2VyQWdlbnQpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcblxudmFyIG5hdmlnYXRvciA9IGdsb2JhbFRoaXMubmF2aWdhdG9yO1xudmFyIHVzZXJBZ2VudCA9IG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVzZXJBZ2VudCA/IFN0cmluZyh1c2VyQWdlbnQpIDogJyc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50Jyk7XG5cbnZhciBwcm9jZXNzID0gZ2xvYmFsVGhpcy5wcm9jZXNzO1xudmFyIERlbm8gPSBnbG9iYWxUaGlzLkRlbm87XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnMgfHwgRGVubyAmJiBEZW5vLnZlcnNpb247XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODtcbnZhciBtYXRjaCwgdmVyc2lvbjtcblxuaWYgKHY4KSB7XG4gIG1hdGNoID0gdjguc3BsaXQoJy4nKTtcbiAgLy8gaW4gb2xkIENocm9tZSwgdmVyc2lvbnMgb2YgVjggaXNuJ3QgVjggPSBDaHJvbWUgLyAxMFxuICAvLyBidXQgdGhlaXIgY29ycmVjdCB2ZXJzaW9ucyBhcmUgbm90IGludGVyZXN0aW5nIGZvciB1c1xuICB2ZXJzaW9uID0gbWF0Y2hbMF0gPiAwICYmIG1hdGNoWzBdIDwgNCA/IDEgOiArKG1hdGNoWzBdICsgbWF0Y2hbMV0pO1xufVxuXG4vLyBCcm93c2VyRlMgTm9kZUpTIGBwcm9jZXNzYCBwb2x5ZmlsbCBpbmNvcnJlY3RseSBzZXQgYC52OGAgdG8gYDAuMGBcbi8vIHNvIGNoZWNrIGB1c2VyQWdlbnRgIGV2ZW4gaWYgYC52OGAgZXhpc3RzLCBidXQgMFxuaWYgKCF2ZXJzaW9uICYmIHVzZXJBZ2VudCkge1xuICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7XG4gICAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgIGlmIChtYXRjaCkgdmVyc2lvbiA9ICttYXRjaFsxXTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb247XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcblxudmFyIHdlYmtpdCA9IHVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcXC8oXFxkKylcXC4vKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIXdlYmtpdCAmJiArd2Via2l0WzFdO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZ2xvYmFsIEJ1biwgRGVubyAtLSBkZXRlY3Rpb24gKi9cbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG5cbnZhciB1c2VyQWdlbnRTdGFydHNXaXRoID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gdXNlckFnZW50LnNsaWNlKDAsIHN0cmluZy5sZW5ndGgpID09PSBzdHJpbmc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoKSB7XG4gIGlmICh1c2VyQWdlbnRTdGFydHNXaXRoKCdCdW4vJykpIHJldHVybiAnQlVOJztcbiAgaWYgKHVzZXJBZ2VudFN0YXJ0c1dpdGgoJ0Nsb3VkZmxhcmUtV29ya2VycycpKSByZXR1cm4gJ0NMT1VERkxBUkUnO1xuICBpZiAodXNlckFnZW50U3RhcnRzV2l0aCgnRGVuby8nKSkgcmV0dXJuICdERU5PJztcbiAgaWYgKHVzZXJBZ2VudFN0YXJ0c1dpdGgoJ05vZGUuanMvJykpIHJldHVybiAnTk9ERSc7XG4gIGlmIChnbG9iYWxUaGlzLkJ1biAmJiB0eXBlb2YgQnVuLnZlcnNpb24gPT0gJ3N0cmluZycpIHJldHVybiAnQlVOJztcbiAgaWYgKGdsb2JhbFRoaXMuRGVubyAmJiB0eXBlb2YgRGVuby52ZXJzaW9uID09ICdvYmplY3QnKSByZXR1cm4gJ0RFTk8nO1xuICBpZiAoY2xhc3NvZihnbG9iYWxUaGlzLnByb2Nlc3MpID09PSAncHJvY2VzcycpIHJldHVybiAnTk9ERSc7XG4gIGlmIChnbG9iYWxUaGlzLndpbmRvdyAmJiBnbG9iYWxUaGlzLmRvY3VtZW50KSByZXR1cm4gJ0JST1dTRVInO1xuICByZXR1cm4gJ1JFU1QnO1xufSkoKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyICRFcnJvciA9IEVycm9yO1xudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcblxudmFyIFRFU1QgPSAoZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gU3RyaW5nKG5ldyAkRXJyb3IoYXJnKS5zdGFjayk7IH0pKCd6eGNhc2QnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWRvcy9uby12dWxuZXJhYmxlIC0tIHNhZmVcbnZhciBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlkgPSAvXFxuXFxzKmF0IFteOl0qOlteXFxuXSovO1xudmFyIElTX1Y4X09SX0NIQUtSQV9TVEFDSyA9IFY4X09SX0NIQUtSQV9TVEFDS19FTlRSWS50ZXN0KFRFU1QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdGFjaywgZHJvcEVudHJpZXMpIHtcbiAgaWYgKElTX1Y4X09SX0NIQUtSQV9TVEFDSyAmJiB0eXBlb2Ygc3RhY2sgPT0gJ3N0cmluZycgJiYgISRFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSkge1xuICAgIHdoaWxlIChkcm9wRW50cmllcy0tKSBzdGFjayA9IHJlcGxhY2Uoc3RhY2ssIFY4X09SX0NIQUtSQV9TVEFDS19FTlRSWSwgJycpO1xuICB9IHJldHVybiBzdGFjaztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGNsZWFyRXJyb3JTdGFjayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhcicpO1xudmFyIEVSUk9SX1NUQUNLX0lOU1RBTExBQkxFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGxhYmxlJyk7XG5cbi8vIG5vbi1zdGFuZGFyZCBWOFxudmFyIGNhcHR1cmVTdGFja1RyYWNlID0gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGVycm9yLCBDLCBzdGFjaywgZHJvcEVudHJpZXMpIHtcbiAgaWYgKEVSUk9SX1NUQUNLX0lOU1RBTExBQkxFKSB7XG4gICAgaWYgKGNhcHR1cmVTdGFja1RyYWNlKSBjYXB0dXJlU3RhY2tUcmFjZShlcnJvciwgQyk7XG4gICAgZWxzZSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZXJyb3IsICdzdGFjaycsIGNsZWFyRXJyb3JTdGFjayhzdGFjaywgZHJvcEVudHJpZXMpKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcignYScpO1xuICBpZiAoISgnc3RhY2snIGluIGVycm9yKSkgcmV0dXJuIHRydWU7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICdzdGFjaycsIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCA3KSk7XG4gIHJldHVybiBlcnJvci5zdGFjayAhPT0gNztcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG4vLyBhZGQgZGVidWdnaW5nIGluZm9cbnJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxudmFyIHdyYXBDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChOYXRpdmVDb25zdHJ1Y3Rvcikge1xuICB2YXIgV3JhcHBlciA9IGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBXcmFwcGVyKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCk7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcihhKTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKGEsIGIpO1xuICAgICAgfSByZXR1cm4gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKGEsIGIsIGMpO1xuICAgIH0gcmV0dXJuIGFwcGx5KE5hdGl2ZUNvbnN0cnVjdG9yLCB0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuICBXcmFwcGVyLnByb3RvdHlwZSA9IE5hdGl2ZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgcmV0dXJuIFdyYXBwZXI7XG59O1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgICAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLmRvbnRDYWxsR2V0U2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuICBvcHRpb25zLm5hbWUgICAgICAgICAgIC0gdGhlIC5uYW1lIG9mIHRoZSBmdW5jdGlvbiBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0aGUga2V5XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgUFJPVE8gPSBvcHRpb25zLnByb3RvO1xuXG4gIHZhciBuYXRpdmVTb3VyY2UgPSBHTE9CQUwgPyBnbG9iYWxUaGlzIDogU1RBVElDID8gZ2xvYmFsVGhpc1tUQVJHRVRdIDogZ2xvYmFsVGhpc1tUQVJHRVRdICYmIGdsb2JhbFRoaXNbVEFSR0VUXS5wcm90b3R5cGU7XG5cbiAgdmFyIHRhcmdldCA9IEdMT0JBTCA/IHBhdGggOiBwYXRoW1RBUkdFVF0gfHwgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHBhdGgsIFRBUkdFVCwge30pW1RBUkdFVF07XG4gIHZhciB0YXJnZXRQcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlO1xuXG4gIHZhciBGT1JDRUQsIFVTRV9OQVRJVkUsIFZJUlRVQUxfUFJPVE9UWVBFO1xuICB2YXIga2V5LCBzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHksIG5hdGl2ZVByb3BlcnR5LCByZXN1bHRQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcblxuICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBGT1JDRUQgPSBpc0ZvcmNlZChHTE9CQUwgPyBrZXkgOiBUQVJHRVQgKyAoU1RBVElDID8gJy4nIDogJyMnKSArIGtleSwgb3B0aW9ucy5mb3JjZWQpO1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIFVTRV9OQVRJVkUgPSAhRk9SQ0VEICYmIG5hdGl2ZVNvdXJjZSAmJiBoYXNPd24obmF0aXZlU291cmNlLCBrZXkpO1xuXG4gICAgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTtcblxuICAgIGlmIChVU0VfTkFUSVZFKSBpZiAob3B0aW9ucy5kb250Q2FsbEdldFNldCkge1xuICAgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihuYXRpdmVTb3VyY2UsIGtleSk7XG4gICAgICBuYXRpdmVQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbiAgICB9IGVsc2UgbmF0aXZlUHJvcGVydHkgPSBuYXRpdmVTb3VyY2Vba2V5XTtcblxuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgaW1wbGVtZW50YXRpb25cbiAgICBzb3VyY2VQcm9wZXJ0eSA9IChVU0VfTkFUSVZFICYmIG5hdGl2ZVByb3BlcnR5KSA/IG5hdGl2ZVByb3BlcnR5IDogc291cmNlW2tleV07XG5cbiAgICBpZiAoIUZPUkNFRCAmJiAhUFJPVE8gJiYgdHlwZW9mIHRhcmdldFByb3BlcnR5ID09IHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSkgY29udGludWU7XG5cbiAgICAvLyBiaW5kIG1ldGhvZHMgdG8gZ2xvYmFsIGZvciBjYWxsaW5nIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBpZiAob3B0aW9ucy5iaW5kICYmIFVTRV9OQVRJVkUpIHJlc3VsdFByb3BlcnR5ID0gYmluZChzb3VyY2VQcm9wZXJ0eSwgZ2xvYmFsVGhpcyk7XG4gICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZXMgaW4gdGhpcyB2ZXJzaW9uXG4gICAgZWxzZSBpZiAob3B0aW9ucy53cmFwICYmIFVTRV9OQVRJVkUpIHJlc3VsdFByb3BlcnR5ID0gd3JhcENvbnN0cnVjdG9yKHNvdXJjZVByb3BlcnR5KTtcbiAgICAvLyBtYWtlIHN0YXRpYyB2ZXJzaW9ucyBmb3IgcHJvdG90eXBlIG1ldGhvZHNcbiAgICBlbHNlIGlmIChQUk9UTyAmJiBpc0NhbGxhYmxlKHNvdXJjZVByb3BlcnR5KSkgcmVzdWx0UHJvcGVydHkgPSB1bmN1cnJ5VGhpcyhzb3VyY2VQcm9wZXJ0eSk7XG4gICAgLy8gZGVmYXVsdCBjYXNlXG4gICAgZWxzZSByZXN1bHRQcm9wZXJ0eSA9IHNvdXJjZVByb3BlcnR5O1xuXG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHNvdXJjZVByb3BlcnR5ICYmIHNvdXJjZVByb3BlcnR5LnNoYW0pIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHJlc3VsdFByb3BlcnR5LCAnc2hhbScsIHRydWUpO1xuICAgIH1cblxuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgcmVzdWx0UHJvcGVydHkpO1xuXG4gICAgaWYgKFBST1RPKSB7XG4gICAgICBWSVJUVUFMX1BST1RPVFlQRSA9IFRBUkdFVCArICdQcm90b3R5cGUnO1xuICAgICAgaWYgKCFoYXNPd24ocGF0aCwgVklSVFVBTF9QUk9UT1RZUEUpKSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShwYXRoLCBWSVJUVUFMX1BST1RPVFlQRSwge30pO1xuICAgICAgfVxuICAgICAgLy8gZXhwb3J0IHZpcnR1YWwgcHJvdG90eXBlIG1ldGhvZHNcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShwYXRoW1ZJUlRVQUxfUFJPVE9UWVBFXSwga2V5LCBzb3VyY2VQcm9wZXJ0eSk7XG4gICAgICAvLyBleHBvcnQgcmVhbCBwcm90b3R5cGUgbWV0aG9kc1xuICAgICAgaWYgKG9wdGlvbnMucmVhbCAmJiB0YXJnZXRQcm90b3R5cGUgJiYgKEZPUkNFRCB8fCAhdGFyZ2V0UHJvdG90eXBlW2tleV0pKSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0YXJnZXRQcm90b3R5cGUsIGtleSwgc291cmNlUHJvcGVydHkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSwgZXMvbm8tb2JqZWN0LXByZXZlbnRleHRlbnNpb25zIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX0JJTkQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUnKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGFwcGx5ID0gRnVuY3Rpb25Qcm90b3R5cGUuYXBwbHk7XG52YXIgY2FsbCA9IEZ1bmN0aW9uUHJvdG90eXBlLmNhbGw7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1yZWZsZWN0IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFJlZmxlY3QgPT0gJ29iamVjdCcgJiYgUmVmbGVjdC5hcHBseSB8fCAoTkFUSVZFX0JJTkQgPyBjYWxsLmJpbmQoYXBwbHkpIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FsbC5hcHBseShhcHBseSwgYXJndW1lbnRzKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciBiaW5kID0gdW5jdXJyeVRoaXModW5jdXJyeVRoaXMuYmluZCk7XG5cbi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQpIHtcbiAgYUNhbGxhYmxlKGZuKTtcbiAgcmV0dXJuIHRoYXQgPT09IHVuZGVmaW5lZCA/IGZuIDogTkFUSVZFX0JJTkQgPyBiaW5kKGZuLCB0aGF0KSA6IGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWZ1bmN0aW9uLXByb3RvdHlwZS1iaW5kIC0tIHNhZmVcbiAgdmFyIHRlc3QgPSAoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KS5iaW5kKCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgLS0gc2FmZVxuICByZXR1cm4gdHlwZW9mIHRlc3QgIT0gJ2Z1bmN0aW9uJyB8fCB0ZXN0Lmhhc093blByb3BlcnR5KCdwcm90b3R5cGUnKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG52YXIgTkFUSVZFX0JJTkQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUnKTtcblxudmFyICRGdW5jdGlvbiA9IEZ1bmN0aW9uO1xudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG52YXIgam9pbiA9IHVuY3VycnlUaGlzKFtdLmpvaW4pO1xudmFyIGZhY3RvcmllcyA9IHt9O1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24gKEMsIGFyZ3NMZW5ndGgsIGFyZ3MpIHtcbiAgaWYgKCFoYXNPd24oZmFjdG9yaWVzLCBhcmdzTGVuZ3RoKSkge1xuICAgIHZhciBsaXN0ID0gW107XG4gICAgdmFyIGkgPSAwO1xuICAgIGZvciAoOyBpIDwgYXJnc0xlbmd0aDsgaSsrKSBsaXN0W2ldID0gJ2FbJyArIGkgKyAnXSc7XG4gICAgZmFjdG9yaWVzW2FyZ3NMZW5ndGhdID0gJEZ1bmN0aW9uKCdDLGEnLCAncmV0dXJuIG5ldyBDKCcgKyBqb2luKGxpc3QsICcsJykgKyAnKScpO1xuICB9IHJldHVybiBmYWN0b3JpZXNbYXJnc0xlbmd0aF0oQywgYXJncyk7XG59O1xuXG4vLyBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYmluZFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWZ1bmN0aW9uLXByb3RvdHlwZS1iaW5kIC0tIGRldGVjdGlvblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfQklORCA/ICRGdW5jdGlvbi5iaW5kIDogZnVuY3Rpb24gYmluZCh0aGF0IC8qICwgLi4uYXJncyAqLykge1xuICB2YXIgRiA9IGFDYWxsYWJsZSh0aGlzKTtcbiAgdmFyIFByb3RvdHlwZSA9IEYucHJvdG90eXBlO1xuICB2YXIgcGFydEFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cywgMSk7XG4gIHZhciBib3VuZEZ1bmN0aW9uID0gZnVuY3Rpb24gYm91bmQoLyogYXJncy4uLiAqLykge1xuICAgIHZhciBhcmdzID0gY29uY2F0KHBhcnRBcmdzLCBhcnJheVNsaWNlKGFyZ3VtZW50cykpO1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgYm91bmRGdW5jdGlvbiA/IGNvbnN0cnVjdChGLCBhcmdzLmxlbmd0aCwgYXJncykgOiBGLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9O1xuICBpZiAoaXNPYmplY3QoUHJvdG90eXBlKSkgYm91bmRGdW5jdGlvbi5wcm90b3R5cGUgPSBQcm90b3R5cGU7XG4gIHJldHVybiBib3VuZEZ1bmN0aW9uO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBOQVRJVkVfQklORCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZScpO1xuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9CSU5EID8gY2FsbC5iaW5kKGNhbGwpIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FsbC5hcHBseShjYWxsLCBhcmd1bWVudHMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXREZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIEVYSVNUUyA9IGhhc093bihGdW5jdGlvblByb3RvdHlwZSwgJ25hbWUnKTtcbi8vIGFkZGl0aW9uYWwgcHJvdGVjdGlvbiBmcm9tIG1pbmlmaWVkIC8gbWFuZ2xlZCAvIGRyb3BwZWQgZnVuY3Rpb24gbmFtZXNcbnZhciBQUk9QRVIgPSBFWElTVFMgJiYgKGZ1bmN0aW9uIHNvbWV0aGluZygpIHsgLyogZW1wdHkgKi8gfSkubmFtZSA9PT0gJ3NvbWV0aGluZyc7XG52YXIgQ09ORklHVVJBQkxFID0gRVhJU1RTICYmICghREVTQ1JJUFRPUlMgfHwgKERFU0NSSVBUT1JTICYmIGdldERlc2NyaXB0b3IoRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJykuY29uZmlndXJhYmxlKSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBFWElTVFM6IEVYSVNUUyxcbiAgUFJPUEVSOiBQUk9QRVIsXG4gIENPTkZJR1VSQUJMRTogQ09ORklHVVJBQkxFXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCBtZXRob2QpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG4gICAgcmV0dXJuIHVuY3VycnlUaGlzKGFDYWxsYWJsZShPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwga2V5KVttZXRob2RdKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbikge1xuICAvLyBOYXNob3JuIGJ1ZzpcbiAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTEyOFxuICAvLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xMTMwXG4gIGlmIChjbGFzc29mUmF3KGZuKSA9PT0gJ0Z1bmN0aW9uJykgcmV0dXJuIHVuY3VycnlUaGlzKGZuKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX0JJTkQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUnKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xudmFyIHVuY3VycnlUaGlzV2l0aEJpbmQgPSBOQVRJVkVfQklORCAmJiBGdW5jdGlvblByb3RvdHlwZS5iaW5kLmJpbmQoY2FsbCwgY2FsbCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX0JJTkQgPyB1bmN1cnJ5VGhpc1dpdGhCaW5kIDogZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNhbGwuYXBwbHkoZm4sIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1IsIE1FVEhPRCkge1xuICB2YXIgTmFtZXNwYWNlID0gcGF0aFtDT05TVFJVQ1RPUiArICdQcm90b3R5cGUnXTtcbiAgdmFyIHB1cmVNZXRob2QgPSBOYW1lc3BhY2UgJiYgTmFtZXNwYWNlW01FVEhPRF07XG4gIGlmIChwdXJlTWV0aG9kKSByZXR1cm4gcHVyZU1ldGhvZDtcbiAgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsVGhpc1tDT05TVFJVQ1RPUl07XG4gIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHJldHVybiBOYXRpdmVQcm90b3R5cGUgJiYgTmF0aXZlUHJvdG90eXBlW01FVEhPRF07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFyaWFibGUpIHtcbiAgcmV0dXJuIGlzQ2FsbGFibGUodmFyaWFibGUpID8gdmFyaWFibGUgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24ocGF0aFtuYW1lc3BhY2VdKSB8fCBhRnVuY3Rpb24oZ2xvYmFsVGhpc1tuYW1lc3BhY2VdKVxuICAgIDogcGF0aFtuYW1lc3BhY2VdICYmIHBhdGhbbmFtZXNwYWNlXVttZXRob2RdIHx8IGdsb2JhbFRoaXNbbmFtZXNwYWNlXSAmJiBnbG9iYWxUaGlzW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBgR2V0SXRlcmF0b3JEaXJlY3Qob2JqKWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycy8jc2VjLWdldGl0ZXJhdG9yZGlyZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHtcbiAgICBpdGVyYXRvcjogb2JqLFxuICAgIG5leHQ6IG9iai5uZXh0LFxuICAgIGRvbmU6IGZhbHNlXG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpdCkpIHJldHVybiBnZXRNZXRob2QoaXQsIElURVJBVE9SKVxuICAgIHx8IGdldE1ldGhvZChpdCwgJ0BAaXRlcmF0b3InKVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50LCB1c2luZ0l0ZXJhdG9yKSB7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZ2V0SXRlcmF0b3JNZXRob2QoYXJndW1lbnQpIDogdXNpbmdJdGVyYXRvcjtcbiAgaWYgKGFDYWxsYWJsZShpdGVyYXRvck1ldGhvZCkpIHJldHVybiBhbk9iamVjdChjYWxsKGl0ZXJhdG9yTWV0aG9kLCBhcmd1bWVudCkpO1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVwbGFjZXIpIHtcbiAgaWYgKGlzQ2FsbGFibGUocmVwbGFjZXIpKSByZXR1cm4gcmVwbGFjZXI7XG4gIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJldHVybjtcbiAgdmFyIHJhd0xlbmd0aCA9IHJlcGxhY2VyLmxlbmd0aDtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXdMZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGVtZW50ID0gcmVwbGFjZXJbaV07XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnKSBwdXNoKGtleXMsIGVsZW1lbnQpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09ICdudW1iZXInIHx8IGNsYXNzb2YoZWxlbWVudCkgPT09ICdOdW1iZXInIHx8IGNsYXNzb2YoZWxlbWVudCkgPT09ICdTdHJpbmcnKSBwdXNoKGtleXMsIHRvU3RyaW5nKGVsZW1lbnQpKTtcbiAgfVxuICB2YXIga2V5c0xlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgcm9vdCA9IHRydWU7XG4gIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIGlmIChyb290KSB7XG4gICAgICByb290ID0gZmFsc2U7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KHRoaXMpKSByZXR1cm4gdmFsdWU7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzTGVuZ3RoOyBqKyspIGlmIChrZXlzW2pdID09PSBrZXkpIHJldHVybiB2YWx1ZTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xuXG4vLyBgR2V0TWV0aG9kYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChWLCBQKSB7XG4gIHZhciBmdW5jID0gVltQXTtcbiAgcmV0dXJuIGlzTnVsbE9yVW5kZWZpbmVkKGZ1bmMpID8gdW5kZWZpbmVkIDogYUNhbGxhYmxlKGZ1bmMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xudmFyIGdldEl0ZXJhdG9yRGlyZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1kaXJlY3QnKTtcblxudmFyIElOVkFMSURfU0laRSA9ICdJbnZhbGlkIHNpemUnO1xudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xudmFyIG1heCA9IE1hdGgubWF4O1xuXG52YXIgU2V0UmVjb3JkID0gZnVuY3Rpb24gKHNldCwgaW50U2l6ZSkge1xuICB0aGlzLnNldCA9IHNldDtcbiAgdGhpcy5zaXplID0gbWF4KGludFNpemUsIDApO1xuICB0aGlzLmhhcyA9IGFDYWxsYWJsZShzZXQuaGFzKTtcbiAgdGhpcy5rZXlzID0gYUNhbGxhYmxlKHNldC5rZXlzKTtcbn07XG5cblNldFJlY29yZC5wcm90b3R5cGUgPSB7XG4gIGdldEl0ZXJhdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEl0ZXJhdG9yRGlyZWN0KGFuT2JqZWN0KGNhbGwodGhpcy5rZXlzLCB0aGlzLnNldCkpKTtcbiAgfSxcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBjYWxsKHRoaXMuaGFzLCB0aGlzLnNldCwgaXQpO1xuICB9XG59O1xuXG4vLyBgR2V0U2V0UmVjb3JkYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1zZXQtbWV0aG9kcy8jc2VjLWdldHNldHJlY29yZFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIGFuT2JqZWN0KG9iaik7XG4gIHZhciBudW1TaXplID0gK29iai5zaXplO1xuICAvLyBOT1RFOiBJZiBzaXplIGlzIHVuZGVmaW5lZCwgdGhlbiBudW1TaXplIHdpbGwgYmUgTmFOXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gIGlmIChudW1TaXplICE9PSBudW1TaXplKSB0aHJvdyBuZXcgJFR5cGVFcnJvcihJTlZBTElEX1NJWkUpO1xuICB2YXIgaW50U2l6ZSA9IHRvSW50ZWdlck9ySW5maW5pdHkobnVtU2l6ZSk7XG4gIGlmIChpbnRTaXplIDwgMCkgdGhyb3cgbmV3ICRSYW5nZUVycm9yKElOVkFMSURfU0laRSk7XG4gIHJldHVybiBuZXcgU2V0UmVjb3JkKG9iaiwgaW50U2l6ZSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNoZWNrID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAmJiBpdC5NYXRoID09PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWdsb2JhbC10aGlzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIGdsb2JhbFRoaXMgPT0gJ29iamVjdCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gc2FmZVxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHxcbiAgY2hlY2sodHlwZW9mIHRoaXMgPT0gJ29iamVjdCcgJiYgdGhpcykgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIGZhbGxiYWNrXG4gIChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHt9Lmhhc093blByb3BlcnR5KTtcblxuLy8gYEhhc093blByb3BlcnR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaGFzb3ducHJvcGVydHlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaGFzb3duIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0Lmhhc093biB8fCBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkodG9PYmplY3QoaXQpLCBrZXkpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0ge307XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgLS0gc2FmZVxuICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rcyB0byBJRTggZm9yIGl0cyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPT0gNztcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3Ncbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgLS0gc2FmZVxuICByZXR1cm4gISRPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mKGl0KSA9PT0gJ1N0cmluZycgPyBzcGxpdChpdCwgJycpIDogJE9iamVjdChpdCk7XG59IDogJE9iamVjdDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbnZhciBmdW5jdGlvblRvU3RyaW5nID0gdW5jdXJyeVRoaXMoRnVuY3Rpb24udG9TdHJpbmcpO1xuXG4vLyB0aGlzIGhlbHBlciBicm9rZW4gaW4gYGNvcmUtanNAMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyXG5pZiAoIWlzQ2FsbGFibGUoc3RvcmUuaW5zcGVjdFNvdXJjZSkpIHtcbiAgc3RvcmUuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBmdW5jdGlvblRvU3RyaW5nKGl0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcblxuLy8gYEluc3RhbGxFcnJvckNhdXNlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1lcnJvci1jYXVzZS8jc2VjLWVycm9yb2JqZWN0cy1pbnN0YWxsLWVycm9yLWNhdXNlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBvcHRpb25zKSB7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSAmJiAnY2F1c2UnIGluIG9wdGlvbnMpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywgJ2NhdXNlJywgb3B0aW9ucy5jYXVzZSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsJyk7XG52YXIgaXNFeHRlbnNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1leHRlbnNpYmxlJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG5cbnZhciBSRVFVSVJFRCA9IGZhbHNlO1xudmFyIE1FVEFEQVRBID0gdWlkKCdtZXRhJyk7XG52YXIgaWQgPSAwO1xuXG52YXIgc2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgZGVmaW5lUHJvcGVydHkoaXQsIE1FVEFEQVRBLCB7IHZhbHVlOiB7XG4gICAgb2JqZWN0SUQ6ICdPJyArIGlkKyssIC8vIG9iamVjdCBJRFxuICAgIHdlYWtEYXRhOiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IH0pO1xufTtcblxudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gYSBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghaGFzT3duKGl0LCBNRVRBREFUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YWRhdGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFEQVRBXS5vYmplY3RJRDtcbn07XG5cbnZhciBnZXRXZWFrRGF0YSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzT3duKGl0LCBNRVRBREFUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YWRhdGEoaXQpO1xuICAvLyByZXR1cm4gdGhlIHN0b3JlIG9mIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFEQVRBXS53ZWFrRGF0YTtcbn07XG5cbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWklORyAmJiBSRVFVSVJFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXNPd24oaXQsIE1FVEFEQVRBKSkgc2V0TWV0YWRhdGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG52YXIgZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICBtZXRhLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbiAgUkVRVUlSRUQgPSB0cnVlO1xuICB2YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZjtcbiAgdmFyIHNwbGljZSA9IHVuY3VycnlUaGlzKFtdLnNwbGljZSk7XG4gIHZhciB0ZXN0ID0ge307XG4gIHRlc3RbTUVUQURBVEFdID0gMTtcblxuICAvLyBwcmV2ZW50IGV4cG9zaW5nIG9mIG1ldGFkYXRhIGtleVxuICBpZiAoZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0KS5sZW5ndGgpIHtcbiAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICAgIHZhciByZXN1bHQgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSByZXN1bHQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHJlc3VsdFtpXSA9PT0gTUVUQURBVEEpIHtcbiAgICAgICAgICBzcGxpY2UocmVzdWx0LCBpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAkKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHtcbiAgICAgIGdldE93blByb3BlcnR5TmFtZXM6IGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbE1vZHVsZS5mXG4gICAgfSk7XG4gIH1cbn07XG5cbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIGVuYWJsZTogZW5hYmxlLFxuICBmYXN0S2V5OiBmYXN0S2V5LFxuICBnZXRXZWFrRGF0YTogZ2V0V2Vha0RhdGEsXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcblxuaGlkZGVuS2V5c1tNRVRBREFUQV0gPSB0cnVlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24nKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQgPSAnT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbFRoaXMuVHlwZUVycm9yO1xudmFyIFdlYWtNYXAgPSBnbG9iYWxUaGlzLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCB8fCBzaGFyZWQuc3RhdGUpIHtcbiAgdmFyIHN0b3JlID0gc2hhcmVkLnN0YXRlIHx8IChzaGFyZWQuc3RhdGUgPSBuZXcgV2Vha01hcCgpKTtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1hc3NpZ24gLS0gcHJvdG90eXBlIG1ldGhvZHMgcHJvdGVjdGlvbiAqL1xuICBzdG9yZS5nZXQgPSBzdG9yZS5nZXQ7XG4gIHN0b3JlLmhhcyA9IHN0b3JlLmhhcztcbiAgc3RvcmUuc2V0ID0gc3RvcmUuc2V0O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtYXNzaWduIC0tIHByb3RvdHlwZSBtZXRob2RzIHByb3RlY3Rpb24gKi9cbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChzdG9yZS5oYXMoaXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEKTtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICBzdG9yZS5zZXQoaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBzdG9yZS5nZXQoaXQpIHx8IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gc3RvcmUuaGFzKGl0KTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBTVEFURSA9IHNoYXJlZEtleSgnc3RhdGUnKTtcbiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlO1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgaWYgKGhhc093bihpdCwgU1RBVEUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEKTtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoaXQsIFNUQVRFLCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaGFzT3duKGl0LCBTVEFURSkgPyBpdFtTVEFURV0gOiB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICBoYXM6IGhhcyxcbiAgZW5mb3JjZTogZW5mb3JjZSxcbiAgZ2V0dGVyRm9yOiBnZXR0ZXJGb3Jcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG90eXBlW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG5cbi8vIGBJc0FycmF5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNhcnJheVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWlzYXJyYXkgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoYXJndW1lbnQpID09PSAnQXJyYXknO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtSXNIVE1MRERBLWludGVybmFsLXNsb3RcbnZhciBkb2N1bWVudEFsbCA9IHR5cGVvZiBkb2N1bWVudCA9PSAnb2JqZWN0JyAmJiBkb2N1bWVudC5hbGw7XG5cbi8vIGBJc0NhbGxhYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNjYWxsYWJsZVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tdHlwZW9mLXVuZGVmaW5lZCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgZG9jdW1lbnRBbGwgPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnRBbGwgIT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbicgfHwgYXJndW1lbnQgPT09IGRvY3VtZW50QWxsO1xufSA6IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbic7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBjb25zdHJ1Y3QgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ2NvbnN0cnVjdCcpO1xudmFyIGNvbnN0cnVjdG9yUmVnRXhwID0gL15cXHMqKD86Y2xhc3N8ZnVuY3Rpb24pXFxiLztcbnZhciBleGVjID0gdW5jdXJyeVRoaXMoY29uc3RydWN0b3JSZWdFeHAuZXhlYyk7XG52YXIgSU5DT1JSRUNUX1RPX1NUUklORyA9ICFjb25zdHJ1Y3RvclJlZ0V4cC50ZXN0KG5vb3ApO1xuXG52YXIgaXNDb25zdHJ1Y3Rvck1vZGVybiA9IGZ1bmN0aW9uIGlzQ29uc3RydWN0b3IoYXJndW1lbnQpIHtcbiAgaWYgKCFpc0NhbGxhYmxlKGFyZ3VtZW50KSkgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0cnVjdChub29wLCBbXSwgYXJndW1lbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxudmFyIGlzQ29uc3RydWN0b3JMZWdhY3kgPSBmdW5jdGlvbiBpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG4gIGlmICghaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBmYWxzZTtcbiAgc3dpdGNoIChjbGFzc29mKGFyZ3VtZW50KSkge1xuICAgIGNhc2UgJ0FzeW5jRnVuY3Rpb24nOlxuICAgIGNhc2UgJ0dlbmVyYXRvckZ1bmN0aW9uJzpcbiAgICBjYXNlICdBc3luY0dlbmVyYXRvckZ1bmN0aW9uJzogcmV0dXJuIGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gd2UgY2FuJ3QgY2hlY2sgLnByb3RvdHlwZSBzaW5jZSBjb25zdHJ1Y3RvcnMgcHJvZHVjZWQgYnkgLmJpbmQgaGF2ZW4ndCBpdFxuICAgIC8vIGBGdW5jdGlvbiN0b1N0cmluZ2AgdGhyb3dzIG9uIHNvbWUgYnVpbHQtaXQgZnVuY3Rpb24gaW4gc29tZSBsZWdhY3kgZW5naW5lc1xuICAgIC8vIChmb3IgZXhhbXBsZSwgYERPTVF1YWRgIGFuZCBzaW1pbGFyIGluIEZGNDEtKVxuICAgIHJldHVybiBJTkNPUlJFQ1RfVE9fU1RSSU5HIHx8ICEhZXhlYyhjb25zdHJ1Y3RvclJlZ0V4cCwgaW5zcGVjdFNvdXJjZShhcmd1bWVudCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5pc0NvbnN0cnVjdG9yTGVnYWN5LnNoYW0gPSB0cnVlO1xuXG4vLyBgSXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gIWNvbnN0cnVjdCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBjYWxsZWQ7XG4gIHJldHVybiBpc0NvbnN0cnVjdG9yTW9kZXJuKGlzQ29uc3RydWN0b3JNb2Rlcm4uY2FsbClcbiAgICB8fCAhaXNDb25zdHJ1Y3Rvck1vZGVybihPYmplY3QpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oZnVuY3Rpb24gKCkgeyBjYWxsZWQgPSB0cnVlOyB9KVxuICAgIHx8IGNhbGxlZDtcbn0pID8gaXNDb25zdHJ1Y3RvckxlZ2FjeSA6IGlzQ29uc3RydWN0b3JNb2Rlcm47XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT09IE5BVElWRSA/IGZhbHNlXG4gICAgOiBpc0NhbGxhYmxlKGRldGVjdGlvbikgPyBmYWlscyhkZXRlY3Rpb24pXG4gICAgOiAhIWRldGVjdGlvbjtcbn07XG5cbnZhciBub3JtYWxpemUgPSBpc0ZvcmNlZC5ub3JtYWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHJldHVybiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlcGxhY2VtZW50LCAnLicpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgZGF0YSA9IGlzRm9yY2VkLmRhdGEgPSB7fTtcbnZhciBOQVRJVkUgPSBpc0ZvcmNlZC5OQVRJVkUgPSAnTic7XG52YXIgUE9MWUZJTEwgPSBpc0ZvcmNlZC5QT0xZRklMTCA9ICdQJztcblxubW9kdWxlLmV4cG9ydHMgPSBpc0ZvcmNlZDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYElzSW50ZWdyYWxOdW1iZXJgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2ludGVncmFsbnVtYmVyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbnVtYmVyLWlzaW50ZWdlciAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc0ludGVnZXIgfHwgZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KSB7XG4gIHJldHVybiAhaXNPYmplY3QoaXQpICYmIGlzRmluaXRlKGl0KSAmJiBmbG9vcihpdCkgPT09IGl0O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIHdlIGNhbid0IHVzZSBqdXN0IGBpdCA9PSBudWxsYCBzaW5jZSBvZiBgZG9jdW1lbnQuYWxsYCBzcGVjaWFsIGNhc2Vcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtSXNIVE1MRERBLWludGVybmFsLXNsb3QtYWVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IG51bGwgfHwgaXQgPT09IHVuZGVmaW5lZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiBpc0NhbGxhYmxlKGl0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBpc09iamVjdChhcmd1bWVudCkgfHwgYXJndW1lbnQgPT09IG51bGw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSB0cnVlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG4vLyBgSXNSZWdFeHBgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc3JlZ2V4cFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY2xhc3NvZihpdCkgPT09ICdSZWdFeHAnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbm1vZHVsZS5leHBvcnRzID0gVVNFX1NZTUJPTF9BU19VSUQgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyICRTeW1ib2wgPSBnZXRCdWlsdEluKCdTeW1ib2wnKTtcbiAgcmV0dXJuIGlzQ2FsbGFibGUoJFN5bWJvbCkgJiYgaXNQcm90b3R5cGVPZigkU3ltYm9sLnByb3RvdHlwZSwgJE9iamVjdChpdCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVjb3JkLCBmbiwgSVRFUkFUT1JfSU5TVEVBRF9PRl9SRUNPUkQpIHtcbiAgdmFyIGl0ZXJhdG9yID0gSVRFUkFUT1JfSU5TVEVBRF9PRl9SRUNPUkQgPyByZWNvcmQgOiByZWNvcmQuaXRlcmF0b3I7XG4gIHZhciBuZXh0ID0gcmVjb3JkLm5leHQ7XG4gIHZhciBzdGVwLCByZXN1bHQ7XG4gIHdoaWxlICghKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZSkge1xuICAgIHJlc3VsdCA9IGZuKHN0ZXAudmFsdWUpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBnZXRJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3InKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHtcbiAgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDtcbiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xuXG52YXIgUmVzdWx0UHJvdG90eXBlID0gUmVzdWx0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIHVuYm91bmRGdW5jdGlvbiwgb3B0aW9ucykge1xuICB2YXIgdGhhdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGF0O1xuICB2YXIgQVNfRU5UUklFUyA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5BU19FTlRSSUVTKTtcbiAgdmFyIElTX1JFQ09SRCA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JU19SRUNPUkQpO1xuICB2YXIgSVNfSVRFUkFUT1IgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfSVRFUkFUT1IpO1xuICB2YXIgSU5URVJSVVBURUQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSU5URVJSVVBURUQpO1xuICB2YXIgZm4gPSBiaW5kKHVuYm91bmRGdW5jdGlvbiwgdGhhdCk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIG5leHQsIHN0ZXA7XG5cbiAgdmFyIHN0b3AgPSBmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgaWYgKGl0ZXJhdG9yKSBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgY29uZGl0aW9uKTtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCBjb25kaXRpb24pO1xuICB9O1xuXG4gIHZhciBjYWxsRm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoQVNfRU5UUklFUykge1xuICAgICAgYW5PYmplY3QodmFsdWUpO1xuICAgICAgcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWVbMF0sIHZhbHVlWzFdLCBzdG9wKSA6IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgfSByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZSwgc3RvcCkgOiBmbih2YWx1ZSk7XG4gIH07XG5cbiAgaWYgKElTX1JFQ09SRCkge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGUuaXRlcmF0b3I7XG4gIH0gZWxzZSBpZiAoSVNfSVRFUkFUT1IpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJGbiA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0ZXJhYmxlKTtcbiAgICBpZiAoIWl0ZXJGbikgdGhyb3cgbmV3ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoaXRlcmFibGUpICsgJyBpcyBub3QgaXRlcmFibGUnKTtcbiAgICAvLyBvcHRpbWlzYXRpb24gZm9yIGFycmF5IGl0ZXJhdG9yc1xuICAgIGlmIChpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlckZuKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGl0ZXJhYmxlKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ID0gY2FsbEZuKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgaXNQcm90b3R5cGVPZihSZXN1bHRQcm90b3R5cGUsIHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbiAgICB9XG4gICAgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihpdGVyYWJsZSwgaXRlckZuKTtcbiAgfVxuXG4gIG5leHQgPSBJU19SRUNPUkQgPyBpdGVyYWJsZS5uZXh0IDogaXRlcmF0b3IubmV4dDtcbiAgd2hpbGUgKCEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGNhbGxGbihzdGVwLnZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ3Rocm93JywgZXJyb3IpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgaXNQcm90b3R5cGVPZihSZXN1bHRQcm90b3R5cGUsIHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBnZXRNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwga2luZCwgdmFsdWUpIHtcbiAgdmFyIGlubmVyUmVzdWx0LCBpbm5lckVycm9yO1xuICBhbk9iamVjdChpdGVyYXRvcik7XG4gIHRyeSB7XG4gICAgaW5uZXJSZXN1bHQgPSBnZXRNZXRob2QoaXRlcmF0b3IsICdyZXR1cm4nKTtcbiAgICBpZiAoIWlubmVyUmVzdWx0KSB7XG4gICAgICBpZiAoa2luZCA9PT0gJ3Rocm93JykgdGhyb3cgdmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlubmVyUmVzdWx0ID0gY2FsbChpbm5lclJlc3VsdCwgaXRlcmF0b3IpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlubmVyRXJyb3IgPSB0cnVlO1xuICAgIGlubmVyUmVzdWx0ID0gZXJyb3I7XG4gIH1cbiAgaWYgKGtpbmQgPT09ICd0aHJvdycpIHRocm93IHZhbHVlO1xuICBpZiAoaW5uZXJFcnJvcikgdGhyb3cgaW5uZXJSZXN1bHQ7XG4gIGFuT2JqZWN0KGlubmVyUmVzdWx0KTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCwgRU5VTUVSQUJMRV9ORVhUKSB7XG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoKyFFTlVNRVJBQkxFX05FWFQsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvckNvbnN0cnVjdG9yLCBUT19TVFJJTkdfVEFHLCBmYWxzZSwgdHJ1ZSk7XG4gIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gIHJldHVybiBJdGVyYXRvckNvbnN0cnVjdG9yO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1uYW1lJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEl0ZXJhdG9yc0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKTtcblxudmFyIFBST1BFUl9GVU5DVElPTl9OQU1FID0gRnVuY3Rpb25OYW1lLlBST1BFUjtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5DT05GSUdVUkFCTEU7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBJdGVyYXRvcnNDb3JlLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBJdGVyYXRvcnNDb3JlLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlM7XG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcbnZhciBFTlRSSUVTID0gJ2VudHJpZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhYmxlLCBOQU1FLCBJdGVyYXRvckNvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuXG4gIHZhciBnZXRJdGVyYXRpb25NZXRob2QgPSBmdW5jdGlvbiAoS0lORCkge1xuICAgIGlmIChLSU5EID09PSBERUZBVUxUICYmIGRlZmF1bHRJdGVyYXRvcikgcmV0dXJuIGRlZmF1bHRJdGVyYXRvcjtcbiAgICBpZiAoIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgS0lORCAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG5cbiAgICBzd2l0Y2ggKEtJTkQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIEVOVFJJRVM6IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT09ICdBcnJheScgPyBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzIHx8IG5hdGl2ZUl0ZXJhdG9yIDogbmF0aXZlSXRlcmF0b3I7XG4gIHZhciBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIG1ldGhvZHMsIEtFWTtcblxuICAvLyBmaXggbmF0aXZlXG4gIGlmIChhbnlOYXRpdmVJdGVyYXRvcikge1xuICAgIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGFueU5hdGl2ZUl0ZXJhdG9yLmNhbGwobmV3IEl0ZXJhYmxlKCkpKTtcbiAgICBpZiAoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICBpZiAoIUlTX1BVUkUgJiYgZ2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlKSAhPT0gSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgc2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FsbGFibGUoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSkpIHtcbiAgICAgICAgICBkZWZpbmVCdWlsdEluKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5LnByb3RvdHlwZS57IHZhbHVlcywgQEBpdGVyYXRvciB9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoUFJPUEVSX0ZVTkNUSU9OX05BTUUgJiYgREVGQVVMVCA9PT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIGlmICghSVNfUFVSRSAmJiBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCAnbmFtZScsIFZBTFVFUyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBjYWxsKG5hdGl2ZUl0ZXJhdG9yLCB0aGlzKTsgfTtcbiAgICB9XG4gIH1cblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgZGVmaW5lQnVpbHRJbihJdGVyYWJsZVByb3RvdHlwZSwgS0VZLCBtZXRob2RzW0tFWV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSAkKHsgdGFyZ2V0OiBOQU1FLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB9LCBtZXRob2RzKTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICBkZWZpbmVCdWlsdEluKEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yLCB7IG5hbWU6IERFRkFVTFQgfSk7XG4gIH1cbiAgSXRlcmF0b3JzW05BTUVdID0gZGVmYXVsdEl0ZXJhdG9yO1xuXG4gIHJldHVybiBtZXRob2RzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVgIG9iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdFxudmFyIEl0ZXJhdG9yUHJvdG90eXBlLCBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUsIGFycmF5SXRlcmF0b3I7XG5cbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLWFycmF5LXByb3RvdHlwZS1rZXlzIC0tIHNhZmUgKi9cbmlmIChbXS5rZXlzKSB7XG4gIGFycmF5SXRlcmF0b3IgPSBbXS5rZXlzKCk7XG4gIC8vIFNhZmFyaSA4IGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlO1xuICBlbHNlIHtcbiAgICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7XG4gICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cbn1cblxudmFyIE5FV19JVEVSQVRPUl9QUk9UT1RZUEUgPSAhaXNPYmplY3QoSXRlcmF0b3JQcm90b3R5cGUpIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgLy8gRkY0NC0gbGVnYWN5IGl0ZXJhdG9ycyBjYXNlXG4gIHJldHVybiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0uY2FsbCh0ZXN0KSAhPT0gdGVzdDtcbn0pO1xuXG5pZiAoTkVXX0lURVJBVE9SX1BST1RPVFlQRSkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbmVsc2UgaWYgKElTX1BVUkUpIEl0ZXJhdG9yUHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtQEBpdGVyYXRvclxuaWYgKCFpc0NhbGxhYmxlKEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSkpIHtcbiAgZGVmaW5lQnVpbHRJbihJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsXG4gIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlNcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xuXG4vLyBgTGVuZ3RoT2ZBcnJheUxpa2VgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1sZW5ndGhvZmFycmF5bGlrZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0b0xlbmd0aChvYmoubGVuZ3RoKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBjYWxsZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbGVyJyk7XG5cbnZhciBNYXAgPSBnZXRCdWlsdEluKCdNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1hcDogTWFwLFxuICBzZXQ6IGNhbGxlcignc2V0JywgMiksXG4gIGdldDogY2FsbGVyKCdnZXQnLCAxKSxcbiAgaGFzOiBjYWxsZXIoJ2hhcycsIDEpLFxuICByZW1vdmU6IGNhbGxlcignZGVsZXRlJywgMSksXG4gIHByb3RvOiBNYXAucHJvdG90eXBlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgTWF0aC50cnVuY2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hdGgudHJ1bmNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1tYXRoLXRydW5jIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gTWF0aC50cnVuYyB8fCBmdW5jdGlvbiB0cnVuYyh4KSB7XG4gIHZhciBuID0gK3g7XG4gIHJldHVybiAobiA+IDAgPyBmbG9vciA6IGNlaWwpKG4pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgc2FmZUdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2FmZS1nZXQtYnVpbHQtaW4nKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIFF1ZXVlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3F1ZXVlJyk7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLWlvcycpO1xudmFyIElTX0lPU19QRUJCTEUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtaW9zLXBlYmJsZScpO1xudmFyIElTX1dFQk9TX1dFQktJVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy13ZWJvcy13ZWJraXQnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLW5vZGUnKTtcblxudmFyIE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWxUaGlzLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsVGhpcy5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsVGhpcy5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWxUaGlzLlByb21pc2U7XG52YXIgbWljcm90YXNrID0gc2FmZUdldEJ1aWx0SW4oJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgbm90aWZ5LCB0b2dnbGUsIG5vZGUsIHByb21pc2UsIHRoZW47XG5cbi8vIG1vZGVybiBlbmdpbmVzIGhhdmUgcXVldWVNaWNyb3Rhc2sgbWV0aG9kXG5pZiAoIW1pY3JvdGFzaykge1xuICB2YXIgcXVldWUgPSBuZXcgUXVldWUoKTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKElTX05PREUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoZm4gPSBxdWV1ZS5nZXQoKSkgdHJ5IHtcbiAgICAgIGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChxdWV1ZS5oZWFkKSBub3RpZnkoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIC8vIGFsc28gZXhjZXB0IFdlYk9TIFdlYmtpdCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODk4XG4gIGlmICghSVNfSU9TICYmICFJU19OT0RFICYmICFJU19XRUJPU19XRUJLSVQgJiYgTXV0YXRpb25PYnNlcnZlciAmJiBkb2N1bWVudCkge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKCFJU19JT1NfUEVCQkxFICYmIFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgLy8gd29ya2Fyb3VuZCBvZiBXZWJLaXQgfiBpT1MgU2FmYXJpIDEwLjEgYnVnXG4gICAgcHJvbWlzZS5jb25zdHJ1Y3RvciA9IFByb21pc2U7XG4gICAgdGhlbiA9IGJpbmQocHJvbWlzZS50aGVuLCBwcm9taXNlKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBOb2RlLmpzIHdpdGhvdXQgcHJvbWlzZXNcbiAgfSBlbHNlIGlmIChJU19OT0RFKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnZVxuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICAvLyBgd2VicGFja2AgZGV2IHNlcnZlciBidWcgb24gSUUgZ2xvYmFsIG1ldGhvZHMgLSB1c2UgYmluZChmbiwgZ2xvYmFsKVxuICAgIG1hY3JvdGFzayA9IGJpbmQobWFjcm90YXNrLCBnbG9iYWxUaGlzKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBtYWNyb3Rhc2soZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICBtaWNyb3Rhc2sgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICBpZiAoIXF1ZXVlLmhlYWQpIG5vdGlmeSgpO1xuICAgIHF1ZXVlLmFkZChmbik7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWljcm90YXNrO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyAkVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhQ2FsbGFibGUocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUNhbGxhYmxlKHJlamVjdCk7XG59O1xuXG4vLyBgTmV3UHJvbWlzZUNhcGFiaWxpdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1uZXdwcm9taXNlY2FwYWJpbGl0eVxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCwgJGRlZmF1bHQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID09PSB1bmRlZmluZWQgPyBhcmd1bWVudHMubGVuZ3RoIDwgMiA/ICcnIDogJGRlZmF1bHQgOiB0b1N0cmluZyhhcmd1bWVudCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGlzUmVnRXhwKGl0KSkge1xuICAgIHRocm93IG5ldyAkVHlwZUVycm9yKFwiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zXCIpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgdHJpbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyICRwYXJzZUludCA9IGdsb2JhbFRoaXMucGFyc2VJbnQ7XG52YXIgU3ltYm9sID0gZ2xvYmFsVGhpcy5TeW1ib2w7XG52YXIgSVRFUkFUT1IgPSBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIGhleCA9IC9eWystXT8weC9pO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcyhoZXguZXhlYyk7XG52YXIgRk9SQ0VEID0gJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzB4MTYnKSAhPT0gMjJcbiAgLy8gTVMgRWRnZSAxOC0gYnJva2VuIHdpdGggYm94ZWQgc3ltYm9sc1xuICB8fCAoSVRFUkFUT1IgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsgJHBhcnNlSW50KE9iamVjdChJVEVSQVRPUikpOyB9KSk7XG5cbi8vIGBwYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXBhcnNlaW50LXN0cmluZy1yYWRpeFxubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4KSB7XG4gIHZhciBTID0gdHJpbSh0b1N0cmluZyhzdHJpbmcpKTtcbiAgcmV0dXJuICRwYXJzZUludChTLCAocmFkaXggPj4+IDApIHx8IChleGVjKGhleCwgUykgPyAxNiA6IDEwKSk7XG59IDogJHBhcnNlSW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gc2FmZVxudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHNob3VsZCBoYXZlIGNvcnJlY3Qgb3JkZXIgb2Ygb3BlcmF0aW9ucyAoRWRnZSBidWcpXG4gIGlmIChERVNDUklQVE9SUyAmJiAkYXNzaWduKHsgYjogMSB9LCAkYXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ2InLCB7XG4gICAgICAgIHZhbHVlOiAzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1zeW1ib2wgLS0gc2FmZVxuICB2YXIgc3ltYm9sID0gU3ltYm9sKCdhc3NpZ24gZGV0ZWN0aW9uJyk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW3N5bWJvbF0gIT09IDcgfHwgb2JqZWN0S2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT09IGFscGhhYmV0O1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjtcbiAgd2hpbGUgKGFyZ3VtZW50c0xlbmd0aCA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJbmRleGVkT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBjb25jYXQob2JqZWN0S2V5cyhTKSwgZ2V0T3duUHJvcGVydHlTeW1ib2xzKFMpKSA6IG9iamVjdEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSB7XG4gICAgICBrZXkgPSBrZXlzW2orK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IGNhbGwocHJvcGVydHlJc0VudW1lcmFibGUsIFMsIGtleSkpIFRba2V5XSA9IFNba2V5XTtcbiAgICB9XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGdsb2JhbCBBY3RpdmVYT2JqZWN0IC0tIG9sZCBJRSwgV1NIICovXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG5cbnZhciBHVCA9ICc+JztcbnZhciBMVCA9ICc8JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBTQ1JJUFQgPSAnc2NyaXB0JztcbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcblxudmFyIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cbnZhciBzY3JpcHRUYWcgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4gTFQgKyBTQ1JJUFQgKyBHVCArIGNvbnRlbnQgKyBMVCArICcvJyArIFNDUklQVCArIEdUO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIEFjdGl2ZVggT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYID0gZnVuY3Rpb24gKGFjdGl2ZVhEb2N1bWVudCkge1xuICBhY3RpdmVYRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCcnKSk7XG4gIGFjdGl2ZVhEb2N1bWVudC5jbG9zZSgpO1xuICB2YXIgdGVtcCA9IGFjdGl2ZVhEb2N1bWVudC5wYXJlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1hc3NpZ25tZW50IC0tIGF2b2lkIG1lbW9yeSBsZWFrXG4gIGFjdGl2ZVhEb2N1bWVudCA9IG51bGw7XG4gIHJldHVybiB0ZW1wO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gIHZhciBKUyA9ICdqYXZhJyArIFNDUklQVCArICc6JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDc1XG4gIGlmcmFtZS5zcmMgPSBTdHJpbmcoSlMpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnZG9jdW1lbnQuRj1PYmplY3QnKSk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIHJldHVybiBpZnJhbWVEb2N1bWVudC5GO1xufTtcblxuLy8gQ2hlY2sgZm9yIGRvY3VtZW50LmRvbWFpbiBhbmQgYWN0aXZlIHggc3VwcG9ydFxuLy8gTm8gbmVlZCB0byB1c2UgYWN0aXZlIHggYXBwcm9hY2ggd2hlbiBkb2N1bWVudC5kb21haW4gaXMgbm90IHNldFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMTUwXG4vLyB2YXJpYXRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2tpdGNhbWJyaWRnZS9lczUtc2hpbS9jb21taXQvNGY3MzhhYzA2NjM0NlxuLy8gYXZvaWQgSUUgR0MgYnVnXG52YXIgYWN0aXZlWERvY3VtZW50O1xudmFyIE51bGxQcm90b09iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBhY3RpdmVYRG9jdW1lbnQgPSBuZXcgQWN0aXZlWE9iamVjdCgnaHRtbGZpbGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogaWdub3JlICovIH1cbiAgTnVsbFByb3RvT2JqZWN0ID0gdHlwZW9mIGRvY3VtZW50ICE9ICd1bmRlZmluZWQnXG4gICAgPyBkb2N1bWVudC5kb21haW4gJiYgYWN0aXZlWERvY3VtZW50XG4gICAgICA/IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KSAvLyBvbGQgSUVcbiAgICAgIDogTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lKClcbiAgICA6IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KTsgLy8gV1NIXG4gIHZhciBsZW5ndGggPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIE51bGxQcm90b09iamVjdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2xlbmd0aF1dO1xuICByZXR1cm4gTnVsbFByb3RvT2JqZWN0KCk7XG59O1xuXG5oaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7XG5cbi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1jcmVhdGUgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5Q29uc3RydWN0b3IoKTtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IE51bGxQcm90b09iamVjdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZGVmaW5lUHJvcGVydGllc01vZHVsZS5mKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdjgtcHJvdG90eXBlLWRlZmluZS1idWcnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnRpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0aWVzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTICYmICFWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIgcHJvcHMgPSB0b0luZGV4ZWRPYmplY3QoUHJvcGVydGllcyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5ID0ga2V5c1tpbmRleCsrXSwgcHJvcHNba2V5XSk7XG4gIHJldHVybiBPO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdjgtcHJvdG90eXBlLWRlZmluZS1idWcnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBFTlVNRVJBQkxFID0gJ2VudW1lcmFibGUnO1xudmFyIENPTkZJR1VSQUJMRSA9ICdjb25maWd1cmFibGUnO1xudmFyIFdSSVRBQkxFID0gJ3dyaXRhYmxlJztcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eVxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyA/IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKHR5cGVvZiBPID09PSAnZnVuY3Rpb24nICYmIFAgPT09ICdwcm90b3R5cGUnICYmICd2YWx1ZScgaW4gQXR0cmlidXRlcyAmJiBXUklUQUJMRSBpbiBBdHRyaWJ1dGVzICYmICFBdHRyaWJ1dGVzW1dSSVRBQkxFXSkge1xuICAgIHZhciBjdXJyZW50ID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTtcbiAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50W1dSSVRBQkxFXSkge1xuICAgICAgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gICAgICBBdHRyaWJ1dGVzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IENPTkZJR1VSQUJMRSBpbiBBdHRyaWJ1dGVzID8gQXR0cmlidXRlc1tDT05GSUdVUkFCTEVdIDogY3VycmVudFtDT05GSUdVUkFCTEVdLFxuICAgICAgICBlbnVtZXJhYmxlOiBFTlVNRVJBQkxFIGluIEF0dHJpYnV0ZXMgPyBBdHRyaWJ1dGVzW0VOVU1FUkFCTEVdIDogY3VycmVudFtFTlVNRVJBQkxFXSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgfSByZXR1cm4gJGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xufSA6ICRkZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzT3duKE8sIFApKSByZXR1cm4gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKCFjYWxsKHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYsIE8sIFApLCBPW1BdKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlICovXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJykuZjtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBhcnJheVNsaWNlKHdpbmRvd05hbWVzKTtcbiAgfVxufTtcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIGNsYXNzb2YoaXQpID09PSAnV2luZG93J1xuICAgID8gZ2V0V2luZG93TmFtZXMoaXQpXG4gICAgOiAkZ2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoaXQpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG52YXIgaGlkZGVuS2V5cyA9IGVudW1CdWdLZXlzLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHluYW1lc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eW5hbWVzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGhpZGRlbktleXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyIE9iamVjdFByb3RvdHlwZSA9ICRPYmplY3QucHJvdG90eXBlO1xuXG4vLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldHByb3RvdHlwZW9mIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID8gJE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIHZhciBvYmplY3QgPSB0b09iamVjdChPKTtcbiAgaWYgKGhhc093bihvYmplY3QsIElFX1BST1RPKSkgcmV0dXJuIG9iamVjdFtJRV9QUk9UT107XG4gIHZhciBjb25zdHJ1Y3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgaWYgKGlzQ2FsbGFibGUoY29uc3RydWN0b3IpICYmIG9iamVjdCBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgJE9iamVjdCA/IE9iamVjdFByb3RvdHlwZSA6IG51bGw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIEFSUkFZX0JVRkZFUl9OT05fRVhURU5TSUJMRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1idWZmZXItbm9uLWV4dGVuc2libGUnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyICRpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7ICRpc0V4dGVuc2libGUoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmlzRXh0ZW5zaWJsZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5pc2V4dGVuc2libGVcbm1vZHVsZS5leHBvcnRzID0gKEZBSUxTX09OX1BSSU1JVElWRVMgfHwgQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFKSA/IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFICYmIGNsYXNzb2YoaXQpID09PSAnQXJyYXlCdWZmZXInKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZShpdCkgOiB0cnVlO1xufSA6ICRpc0V4dGVuc2libGU7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoe30uaXNQcm90b3R5cGVPZik7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBpbmRleE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJykuaW5kZXhPZjtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pICFoYXNPd24oaGlkZGVuS2V5cywga2V5KSAmJiBoYXNPd24oTywga2V5KSAmJiBwdXNoKHJlc3VsdCwga2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhc093bihPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCBwdXNoKHJlc3VsdCwga2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5rZXlzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWtleXMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICEkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAtLSBzYWZlICovXG52YXIgdW5jdXJyeVRoaXNBY2Nlc3NvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtYWNjZXNzb3InKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIGFQb3NzaWJsZVByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qtc2V0cHJvdG90eXBlb2YgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gZnVuY3Rpb24gKCkge1xuICB2YXIgQ09SUkVDVF9TRVRURVIgPSBmYWxzZTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdmFyIHNldHRlcjtcbiAgdHJ5IHtcbiAgICBzZXR0ZXIgPSB1bmN1cnJ5VGhpc0FjY2Vzc29yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nLCAnc2V0Jyk7XG4gICAgc2V0dGVyKHRlc3QsIFtdKTtcbiAgICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKE8pO1xuICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7XG4gICAgaWYgKCFpc09iamVjdChPKSkgcmV0dXJuIE87XG4gICAgaWYgKENPUlJFQ1RfU0VUVEVSKSBzZXR0ZXIoTywgcHJvdG8pO1xuICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICByZXR1cm4gTztcbiAgfTtcbn0oKSA6IHVuZGVmaW5lZCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIG9iamVjdEdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpLmY7XG5cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHVuY3VycnlUaGlzKCRwcm9wZXJ0eUlzRW51bWVyYWJsZSk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG4vLyBpbiBzb21lIElFIHZlcnNpb25zLCBgcHJvcGVydHlJc0VudW1lcmFibGVgIHJldHVybnMgaW5jb3JyZWN0IHJlc3VsdCBvbiBpbnRlZ2VyIGtleXNcbi8vIG9mIGBudWxsYCBwcm90b3R5cGUgb2JqZWN0c1xudmFyIElFX0JVRyA9IERFU0NSSVBUT1JTICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1jcmVhdGUgLS0gc2FmZVxuICB2YXIgTyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIE9bMl0gPSAyO1xuICByZXR1cm4gIXByb3BlcnR5SXNFbnVtZXJhYmxlKE8sIDIpO1xufSk7XG5cbi8vIGBPYmplY3QueyBlbnRyaWVzLCB2YWx1ZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUT19FTlRSSUVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChpdCk7XG4gICAgdmFyIGtleXMgPSBvYmplY3RLZXlzKE8pO1xuICAgIHZhciBJRV9XT1JLQVJPVU5EID0gSUVfQlVHICYmIG9iamVjdEdldFByb3RvdHlwZU9mKE8pID09PSBudWxsO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGkpIHtcbiAgICAgIGtleSA9IGtleXNbaSsrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgKElFX1dPUktBUk9VTkQgPyBrZXkgaW4gTyA6IHByb3BlcnR5SXNFbnVtZXJhYmxlKE8sIGtleSkpKSB7XG4gICAgICAgIHB1c2gocmVzdWx0LCBUT19FTlRSSUVTID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYE9iamVjdC5lbnRyaWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZW50cmllc1xuICBlbnRyaWVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBPYmplY3QudmFsdWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QudmFsdWVzXG4gIHZhbHVlczogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyB7fS50b1N0cmluZyA6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBPcmRpbmFyeVRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb3JkaW5hcnl0b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChwcmVmID09PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoaXNDYWxsYWJsZShmbiA9IGlucHV0LnZhbHVlT2YpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAocHJlZiAhPT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpO1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gY29uY2F0KGtleXMsIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgdmFsdWU6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCB2YWx1ZTogZXJyb3IgfTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBFTlZJUk9OTUVOVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIFY4X1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdjgtdmVyc2lvbicpO1xuXG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciBTVUJDTEFTU0lORyA9IGZhbHNlO1xudmFyIE5BVElWRV9QUk9NSVNFX1JFSkVDVElPTl9FVkVOVCA9IGlzQ2FsbGFibGUoZ2xvYmFsVGhpcy5Qcm9taXNlUmVqZWN0aW9uRXZlbnQpO1xuXG52YXIgRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgPSBpc0ZvcmNlZCgnUHJvbWlzZScsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFID0gaW5zcGVjdFNvdXJjZShOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IpO1xuICB2YXIgR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSA9IFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFICE9PSBTdHJpbmcoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgLy8gVjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgLy8gV2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgaWYgKCFHTE9CQUxfQ09SRV9KU19QUk9NSVNFICYmIFY4X1ZFUlNJT04gPT09IDY2KSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgbmVlZCBQcm9taXNlI3sgY2F0Y2gsIGZpbmFsbHkgfSBpbiB0aGUgcHVyZSB2ZXJzaW9uIGZvciBwcmV2ZW50aW5nIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgaWYgKElTX1BVUkUgJiYgIShOYXRpdmVQcm9taXNlUHJvdG90eXBlWydjYXRjaCddICYmIE5hdGl2ZVByb21pc2VQcm90b3R5cGVbJ2ZpbmFsbHknXSkpIHJldHVybiB0cnVlO1xuICAvLyBXZSBjYW4ndCB1c2UgQEBzcGVjaWVzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxuICBpZiAoIVY4X1ZFUlNJT04gfHwgVjhfVkVSU0lPTiA8IDUxIHx8ICEvbmF0aXZlIGNvZGUvLnRlc3QoUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UpKSB7XG4gICAgLy8gRGV0ZWN0IGNvcnJlY3RuZXNzIG9mIHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSgxKTsgfSk7XG4gICAgdmFyIEZha2VQcm9taXNlID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICAgIGV4ZWMoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xuICAgIH07XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gcHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9O1xuICAgIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7XG4gICAgU1VCQ0xBU1NJTkcgPSBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlO1xuICAgIGlmICghU1VCQ0xBU1NJTkcpIHJldHVybiB0cnVlO1xuICAvLyBVbmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gIH0gcmV0dXJuICFHTE9CQUxfQ09SRV9KU19QUk9NSVNFICYmIChFTlZJUk9OTUVOVCA9PT0gJ0JST1dTRVInIHx8IEVOVklST05NRU5UID09PSAnREVOTycpICYmICFOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQ7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENPTlNUUlVDVE9SOiBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUixcbiAgUkVKRUNUSU9OX0VWRU5UOiBOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQsXG4gIFNVQkNMQVNTSU5HOiBTVUJDTEFTU0lOR1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsVGhpcy5Qcm9taXNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3InKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG52YXIgRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKS5DT05TVFJVQ1RPUjtcblxubW9kdWxlLmV4cG9ydHMgPSBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IuYWxsKGl0ZXJhYmxlKS50aGVuKHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmhlYWQgPSBudWxsO1xuICB0aGlzLnRhaWwgPSBudWxsO1xufTtcblxuUXVldWUucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIGVudHJ5ID0geyBpdGVtOiBpdGVtLCBuZXh0OiBudWxsIH07XG4gICAgdmFyIHRhaWwgPSB0aGlzLnRhaWw7XG4gICAgaWYgKHRhaWwpIHRhaWwubmV4dCA9IGVudHJ5O1xuICAgIGVsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgdGhpcy50YWlsID0gZW50cnk7XG4gIH0sXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbnRyeSA9IHRoaXMuaGVhZDtcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIHZhciBuZXh0ID0gdGhpcy5oZWFkID0gZW50cnkubmV4dDtcbiAgICAgIGlmIChuZXh0ID09PSBudWxsKSB0aGlzLnRhaWwgPSBudWxsO1xuICAgICAgcmV0dXJuIGVudHJ5Lml0ZW07XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFF1ZXVlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc051bGxPclVuZGVmaW5lZChpdCkpIHRocm93IG5ldyAkVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBBdm9pZCBOb2RlSlMgZXhwZXJpbWVudGFsIHdhcm5pbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuIGdsb2JhbFRoaXNbbmFtZV07XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbFRoaXMsIG5hbWUpO1xuICByZXR1cm4gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHknKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgRU5WSVJPTk1FTlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQnKTtcbnZhciBVU0VSX0FHRU5UID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG52YXIgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aCcpO1xuXG52YXIgRnVuY3Rpb24gPSBnbG9iYWxUaGlzLkZ1bmN0aW9uO1xuLy8gZGlydHkgSUU5LSBhbmQgQnVuIDAuMy4wLSBjaGVja3NcbnZhciBXUkFQID0gL01TSUUgLlxcLi8udGVzdChVU0VSX0FHRU5UKSB8fCBFTlZJUk9OTUVOVCA9PT0gJ0JVTicgJiYgKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlcnNpb24gPSBnbG9iYWxUaGlzLkJ1bi52ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiB2ZXJzaW9uLmxlbmd0aCA8IDMgfHwgdmVyc2lvblswXSA9PT0gJzAnICYmICh2ZXJzaW9uWzFdIDwgMyB8fCB2ZXJzaW9uWzFdID09PSAnMycgJiYgdmVyc2lvblsyXSA9PT0gJzAnKTtcbn0pKCk7XG5cbi8vIElFOS0gLyBCdW4gMC4zLjAtIHNldFRpbWVvdXQgLyBzZXRJbnRlcnZhbCAvIHNldEltbWVkaWF0ZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZml4XG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS90aW1lcnMtYW5kLXVzZXItcHJvbXB0cy5odG1sI3RpbWVyc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy8xNjMzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzY2hlZHVsZXIsIGhhc1RpbWVBcmcpIHtcbiAgdmFyIGZpcnN0UGFyYW1JbmRleCA9IGhhc1RpbWVBcmcgPyAyIDogMTtcbiAgcmV0dXJuIFdSQVAgPyBmdW5jdGlvbiAoaGFuZGxlciwgdGltZW91dCAvKiAsIC4uLmFyZ3VtZW50cyAqLykge1xuICAgIHZhciBib3VuZEFyZ3MgPSB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKSA+IGZpcnN0UGFyYW1JbmRleDtcbiAgICB2YXIgZm4gPSBpc0NhbGxhYmxlKGhhbmRsZXIpID8gaGFuZGxlciA6IEZ1bmN0aW9uKGhhbmRsZXIpO1xuICAgIHZhciBwYXJhbXMgPSBib3VuZEFyZ3MgPyBhcnJheVNsaWNlKGFyZ3VtZW50cywgZmlyc3RQYXJhbUluZGV4KSA6IFtdO1xuICAgIHZhciBjYWxsYmFjayA9IGJvdW5kQXJncyA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwcGx5KGZuLCB0aGlzLCBwYXJhbXMpO1xuICAgIH0gOiBmbjtcbiAgICByZXR1cm4gaGFzVGltZUFyZyA/IHNjaGVkdWxlcihjYWxsYmFjaywgdGltZW91dCkgOiBzY2hlZHVsZXIoY2FsbGJhY2spO1xuICB9IDogc2NoZWR1bGVyO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBTZXRIZWxwZXJzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaXRlcmF0ZScpO1xuXG52YXIgU2V0ID0gU2V0SGVscGVycy5TZXQ7XG52YXIgYWRkID0gU2V0SGVscGVycy5hZGQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IFNldCgpO1xuICBpdGVyYXRlKHNldCwgZnVuY3Rpb24gKGl0KSB7XG4gICAgYWRkKHJlc3VsdCwgaXQpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYVNldCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXNldCcpO1xudmFyIFNldEhlbHBlcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWhlbHBlcnMnKTtcbnZhciBjbG9uZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtY2xvbmUnKTtcbnZhciBzaXplID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zaXplJyk7XG52YXIgZ2V0U2V0UmVjb3JkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1zZXQtcmVjb3JkJyk7XG52YXIgaXRlcmF0ZVNldCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaXRlcmF0ZScpO1xudmFyIGl0ZXJhdGVTaW1wbGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZS1zaW1wbGUnKTtcblxudmFyIGhhcyA9IFNldEhlbHBlcnMuaGFzO1xudmFyIHJlbW92ZSA9IFNldEhlbHBlcnMucmVtb3ZlO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5kaWZmZXJlbmNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRpZmZlcmVuY2Uob3RoZXIpIHtcbiAgdmFyIE8gPSBhU2V0KHRoaXMpO1xuICB2YXIgb3RoZXJSZWMgPSBnZXRTZXRSZWNvcmQob3RoZXIpO1xuICB2YXIgcmVzdWx0ID0gY2xvbmUoTyk7XG4gIGlmIChzaXplKE8pIDw9IG90aGVyUmVjLnNpemUpIGl0ZXJhdGVTZXQoTywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAob3RoZXJSZWMuaW5jbHVkZXMoZSkpIHJlbW92ZShyZXN1bHQsIGUpO1xuICB9KTtcbiAgZWxzZSBpdGVyYXRlU2ltcGxlKG90aGVyUmVjLmdldEl0ZXJhdG9yKCksIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGhhcyhPLCBlKSkgcmVtb3ZlKHJlc3VsdCwgZSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGNhbGxlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsZXInKTtcblxudmFyIFNldCA9IGdldEJ1aWx0SW4oJ1NldCcpO1xudmFyIFNldFByb3RvdHlwZSA9IFNldC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBTZXQ6IFNldCxcbiAgYWRkOiBjYWxsZXIoJ2FkZCcsIDEpLFxuICBoYXM6IGNhbGxlcignaGFzJywgMSksXG4gIHJlbW92ZTogY2FsbGVyKCdkZWxldGUnLCAxKSxcbiAgcHJvdG86IFNldFByb3RvdHlwZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Etc2V0Jyk7XG52YXIgU2V0SGVscGVycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaGVscGVycycpO1xudmFyIHNpemUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNpemUnKTtcbnZhciBnZXRTZXRSZWNvcmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1yZWNvcmQnKTtcbnZhciBpdGVyYXRlU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pdGVyYXRlJyk7XG52YXIgaXRlcmF0ZVNpbXBsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlLXNpbXBsZScpO1xuXG52YXIgU2V0ID0gU2V0SGVscGVycy5TZXQ7XG52YXIgYWRkID0gU2V0SGVscGVycy5hZGQ7XG52YXIgaGFzID0gU2V0SGVscGVycy5oYXM7XG5cbi8vIGBTZXQucHJvdG90eXBlLmludGVyc2VjdGlvbmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbnRlcnNlY3Rpb24ob3RoZXIpIHtcbiAgdmFyIE8gPSBhU2V0KHRoaXMpO1xuICB2YXIgb3RoZXJSZWMgPSBnZXRTZXRSZWNvcmQob3RoZXIpO1xuICB2YXIgcmVzdWx0ID0gbmV3IFNldCgpO1xuXG4gIGlmIChzaXplKE8pID4gb3RoZXJSZWMuc2l6ZSkge1xuICAgIGl0ZXJhdGVTaW1wbGUob3RoZXJSZWMuZ2V0SXRlcmF0b3IoKSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChoYXMoTywgZSkpIGFkZChyZXN1bHQsIGUpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJhdGVTZXQoTywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChvdGhlclJlYy5pbmNsdWRlcyhlKSkgYWRkKHJlc3VsdCwgZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Etc2V0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzJykuaGFzO1xudmFyIHNpemUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNpemUnKTtcbnZhciBnZXRTZXRSZWNvcmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1yZWNvcmQnKTtcbnZhciBpdGVyYXRlU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pdGVyYXRlJyk7XG52YXIgaXRlcmF0ZVNpbXBsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlLXNpbXBsZScpO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuaXNEaXNqb2ludEZyb21gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXQtbWV0aG9kcy8jU2V0LnByb3RvdHlwZS5pc0Rpc2pvaW50RnJvbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Rpc2pvaW50RnJvbShvdGhlcikge1xuICB2YXIgTyA9IGFTZXQodGhpcyk7XG4gIHZhciBvdGhlclJlYyA9IGdldFNldFJlY29yZChvdGhlcik7XG4gIGlmIChzaXplKE8pIDw9IG90aGVyUmVjLnNpemUpIHJldHVybiBpdGVyYXRlU2V0KE8sIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKG90aGVyUmVjLmluY2x1ZGVzKGUpKSByZXR1cm4gZmFsc2U7XG4gIH0sIHRydWUpICE9PSBmYWxzZTtcbiAgdmFyIGl0ZXJhdG9yID0gb3RoZXJSZWMuZ2V0SXRlcmF0b3IoKTtcbiAgcmV0dXJuIGl0ZXJhdGVTaW1wbGUoaXRlcmF0b3IsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGhhcyhPLCBlKSkgcmV0dXJuIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICdub3JtYWwnLCBmYWxzZSk7XG4gIH0pICE9PSBmYWxzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYVNldCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXNldCcpO1xudmFyIHNpemUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNpemUnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pdGVyYXRlJyk7XG52YXIgZ2V0U2V0UmVjb3JkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1zZXQtcmVjb3JkJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmlzU3Vic2V0T2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXQtbWV0aG9kcy8jU2V0LnByb3RvdHlwZS5pc1N1YnNldE9mXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzU3Vic2V0T2Yob3RoZXIpIHtcbiAgdmFyIE8gPSBhU2V0KHRoaXMpO1xuICB2YXIgb3RoZXJSZWMgPSBnZXRTZXRSZWNvcmQob3RoZXIpO1xuICBpZiAoc2l6ZShPKSA+IG90aGVyUmVjLnNpemUpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGl0ZXJhdGUoTywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIW90aGVyUmVjLmluY2x1ZGVzKGUpKSByZXR1cm4gZmFsc2U7XG4gIH0sIHRydWUpICE9PSBmYWxzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYVNldCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXNldCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaGVscGVycycpLmhhcztcbnZhciBzaXplID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zaXplJyk7XG52YXIgZ2V0U2V0UmVjb3JkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1zZXQtcmVjb3JkJyk7XG52YXIgaXRlcmF0ZVNpbXBsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlLXNpbXBsZScpO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuaXNTdXBlcnNldE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0LW1ldGhvZHMvI1NldC5wcm90b3R5cGUuaXNTdXBlcnNldE9mXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzU3VwZXJzZXRPZihvdGhlcikge1xuICB2YXIgTyA9IGFTZXQodGhpcyk7XG4gIHZhciBvdGhlclJlYyA9IGdldFNldFJlY29yZChvdGhlcik7XG4gIGlmIChzaXplKE8pIDwgb3RoZXJSZWMuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgaXRlcmF0b3IgPSBvdGhlclJlYy5nZXRJdGVyYXRvcigpO1xuICByZXR1cm4gaXRlcmF0ZVNpbXBsZShpdGVyYXRvciwgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIWhhcyhPLCBlKSkgcmV0dXJuIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICdub3JtYWwnLCBmYWxzZSk7XG4gIH0pICE9PSBmYWxzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXRlcmF0ZVNpbXBsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlLXNpbXBsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXQsIGZuLCBpbnRlcnJ1cHRpYmxlKSB7XG4gIHJldHVybiBpbnRlcnJ1cHRpYmxlID8gaXRlcmF0ZVNpbXBsZShzZXQua2V5cygpLCBmbiwgdHJ1ZSkgOiBzZXQuZm9yRWFjaChmbik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgcmV0dXJuIHNldC5zaXplO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3InKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FKSB7XG4gIHZhciBDb25zdHJ1Y3RvciA9IGdldEJ1aWx0SW4oQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgaWYgKERFU0NSSVBUT1JTICYmIENvbnN0cnVjdG9yICYmICFDb25zdHJ1Y3RvcltTUEVDSUVTXSkge1xuICAgIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihDb25zdHJ1Y3RvciwgU1BFQ0lFUywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gICAgfSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYVNldCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXNldCcpO1xudmFyIFNldEhlbHBlcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWhlbHBlcnMnKTtcbnZhciBjbG9uZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtY2xvbmUnKTtcbnZhciBnZXRTZXRSZWNvcmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1yZWNvcmQnKTtcbnZhciBpdGVyYXRlU2ltcGxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlJyk7XG5cbnZhciBhZGQgPSBTZXRIZWxwZXJzLmFkZDtcbnZhciBoYXMgPSBTZXRIZWxwZXJzLmhhcztcbnZhciByZW1vdmUgPSBTZXRIZWxwZXJzLnJlbW92ZTtcblxuLy8gYFNldC5wcm90b3R5cGUuc3ltbWV0cmljRGlmZmVyZW5jZWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzeW1tZXRyaWNEaWZmZXJlbmNlKG90aGVyKSB7XG4gIHZhciBPID0gYVNldCh0aGlzKTtcbiAgdmFyIGtleXNJdGVyID0gZ2V0U2V0UmVjb3JkKG90aGVyKS5nZXRJdGVyYXRvcigpO1xuICB2YXIgcmVzdWx0ID0gY2xvbmUoTyk7XG4gIGl0ZXJhdGVTaW1wbGUoa2V5c0l0ZXIsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGhhcyhPLCBlKSkgcmVtb3ZlKHJlc3VsdCwgZSk7XG4gICAgZWxzZSBhZGQocmVzdWx0LCBlKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMsIFNFVF9NRVRIT0QpIHtcbiAgdmFyIHRhcmdldCA9IFNUQVRJQyA/IGl0IDogaXQgJiYgaXQucHJvdG90eXBlO1xuICBpZiAodGFyZ2V0KSB7XG4gICAgaWYgKCFoYXNPd24odGFyZ2V0LCBUT19TVFJJTkdfVEFHKSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBUT19TVFJJTkdfVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IFRBRyB9KTtcbiAgICB9XG4gICAgaWYgKFNFVF9NRVRIT0QgJiYgIVRPX1NUUklOR19UQUdfU1VQUE9SVCkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRhcmdldCwgJ3RvU3RyaW5nJywgdG9TdHJpbmcpO1xuICAgIH1cbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Etc2V0Jyk7XG52YXIgYWRkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzJykuYWRkO1xudmFyIGNsb25lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1jbG9uZScpO1xudmFyIGdldFNldFJlY29yZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc2V0LXJlY29yZCcpO1xudmFyIGl0ZXJhdGVTaW1wbGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZS1zaW1wbGUnKTtcblxuLy8gYFNldC5wcm90b3R5cGUudW5pb25gIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdW5pb24ob3RoZXIpIHtcbiAgdmFyIE8gPSBhU2V0KHRoaXMpO1xuICB2YXIga2V5c0l0ZXIgPSBnZXRTZXRSZWNvcmQob3RoZXIpLmdldEl0ZXJhdG9yKCk7XG4gIHZhciByZXN1bHQgPSBjbG9uZShPKTtcbiAgaXRlcmF0ZVNpbXBsZShrZXlzSXRlciwgZnVuY3Rpb24gKGl0KSB7XG4gICAgYWRkKHJlc3VsdCwgaXQpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHknKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWxUaGlzW1NIQVJFRF0gfHwgZGVmaW5lR2xvYmFsUHJvcGVydHkoU0hBUkVELCB7fSk7XG5cbihzdG9yZS52ZXJzaW9ucyB8fCAoc3RvcmUudmVyc2lvbnMgPSBbXSkpLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4zOC4wJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDE0LTIwMjQgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknLFxuICBsaWNlbnNlOiAnaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My4zOC4wL0xJQ0VOU0UnLFxuICBzb3VyY2U6ICdodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcydcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgfHwge30pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jb25zdHJ1Y3RvcicpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCBpc051bGxPclVuZGVmaW5lZChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUNvbnN0cnVjdG9yKFMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBjaGFyQ29kZUF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckNvZGVBdCk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoQ09OVkVSVF9UT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgcG9zKSB7XG4gICAgdmFyIFMgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyT3JJbmZpbml0eShwb3MpO1xuICAgIHZhciBzaXplID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBzaXplKSByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBmaXJzdCA9IGNoYXJDb2RlQXQoUywgcG9zaXRpb24pO1xuICAgIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemVcbiAgICAgIHx8IChzZWNvbmQgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uICsgMSkpIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRlxuICAgICAgICA/IENPTlZFUlRfVE9fU1RSSU5HXG4gICAgICAgICAgPyBjaGFyQXQoUywgcG9zaXRpb24pXG4gICAgICAgICAgOiBmaXJzdFxuICAgICAgICA6IENPTlZFUlRfVE9fU1RSSU5HXG4gICAgICAgICAgPyBzdHJpbmdTbGljZShTLCBwb3NpdGlvbiwgcG9zaXRpb24gKyAyKVxuICAgICAgICAgIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5jb2RlcG9pbnRhdFxuICBjb2RlQXQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxuICBjaGFyQXQ6IGNyZWF0ZU1ldGhvZCh0cnVlKVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgJHJlcGVhdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcmVwZWF0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyIHJlcGVhdCA9IHVuY3VycnlUaGlzKCRyZXBlYXQpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgcGFkU3RhcnQsIHBhZEVuZCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0VORCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcpIHtcbiAgICB2YXIgUyA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTtcbiAgICB2YXIgaW50TWF4TGVuZ3RoID0gdG9MZW5ndGgobWF4TGVuZ3RoKTtcbiAgICB2YXIgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpbGxTdHIgPSBmaWxsU3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiB0b1N0cmluZyhmaWxsU3RyaW5nKTtcbiAgICB2YXIgZmlsbExlbiwgc3RyaW5nRmlsbGVyO1xuICAgIGlmIChpbnRNYXhMZW5ndGggPD0gc3RyaW5nTGVuZ3RoIHx8IGZpbGxTdHIgPT09ICcnKSByZXR1cm4gUztcbiAgICBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoO1xuICAgIHN0cmluZ0ZpbGxlciA9IHJlcGVhdChmaWxsU3RyLCBjZWlsKGZpbGxMZW4gLyBmaWxsU3RyLmxlbmd0aCkpO1xuICAgIGlmIChzdHJpbmdGaWxsZXIubGVuZ3RoID4gZmlsbExlbikgc3RyaW5nRmlsbGVyID0gc3RyaW5nU2xpY2Uoc3RyaW5nRmlsbGVyLCAwLCBmaWxsTGVuKTtcbiAgICByZXR1cm4gSVNfRU5EID8gUyArIHN0cmluZ0ZpbGxlciA6IHN0cmluZ0ZpbGxlciArIFM7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucGFkc3RhcnRcbiAgc3RhcnQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnBhZEVuZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRlbmRcbiAgZW5kOiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUucmVwZWF0YCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVwZWF0KGNvdW50KSB7XG4gIHZhciBzdHIgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICB2YXIgbiA9IHRvSW50ZWdlck9ySW5maW5pdHkoY291bnQpO1xuICBpZiAobiA8IDAgfHwgbiA9PT0gSW5maW5pdHkpIHRocm93IG5ldyAkUmFuZ2VFcnJvcignV3JvbmcgbnVtYmVyIG9mIHJlcGV0aXRpb25zJyk7XG4gIGZvciAoO24gPiAwOyAobiA+Pj49IDEpICYmIChzdHIgKz0gc3RyKSkgaWYgKG4gJiAxKSByZXN1bHQgKz0gc3RyO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgbHRyaW0gPSBSZWdFeHAoJ15bJyArIHdoaXRlc3BhY2VzICsgJ10rJyk7XG52YXIgcnRyaW0gPSBSZWdFeHAoJyhefFteJyArIHdoaXRlc3BhY2VzICsgJ10pWycgKyB3aGl0ZXNwYWNlcyArICddKyQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltLCB0cmltU3RhcnQsIHRyaW1FbmQsIHRyaW1MZWZ0LCB0cmltUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMpIHtcbiAgICB2YXIgc3RyaW5nID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIGlmIChUWVBFICYgMSkgc3RyaW5nID0gcmVwbGFjZShzdHJpbmcsIGx0cmltLCAnJyk7XG4gICAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgcnRyaW0sICckMScpO1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltTGVmdCwgdHJpbVN0YXJ0IH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1zdGFydFxuICBzdGFydDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1SaWdodCwgdHJpbUVuZCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4gIGVuZDogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS50cmltYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1cbiAgdHJpbTogY3JlYXRlTWV0aG9kKDMpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC12OC12ZXJzaW9uJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG5cbnZhciAkU3RyaW5nID0gZ2xvYmFsVGhpcy5TdHJpbmc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG5tb2R1bGUuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgc3ltYm9sID0gU3ltYm9sKCdzeW1ib2wgZGV0ZWN0aW9uJyk7XG4gIC8vIENocm9tZSAzOCBTeW1ib2wgaGFzIGluY29ycmVjdCB0b1N0cmluZyBjb252ZXJzaW9uXG4gIC8vIGBnZXQtb3duLXByb3BlcnR5LXN5bWJvbHNgIHBvbHlmaWxsIHN5bWJvbHMgY29udmVydGVkIHRvIG9iamVjdCBhcmUgbm90IFN5bWJvbCBpbnN0YW5jZXNcbiAgLy8gbmI6IERvIG5vdCBjYWxsIGBTdHJpbmdgIGRpcmVjdGx5IHRvIGF2b2lkIHRoaXMgYmVpbmcgb3B0aW1pemVkIG91dCB0byBgc3ltYm9sKycnYCB3aGljaCB3aWxsLFxuICAvLyBvZiBjb3Vyc2UsIGZhaWwuXG4gIHJldHVybiAhJFN0cmluZyhzeW1ib2wpIHx8ICEoT2JqZWN0KHN5bWJvbCkgaW5zdGFuY2VvZiBTeW1ib2wpIHx8XG4gICAgLy8gQ2hyb21lIDM4LTQwIHN5bWJvbHMgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSBET00gY29sbGVjdGlvbnMgcHJvdG90eXBlcyB0byBpbnN0YW5jZXNcbiAgICAhU3ltYm9sLnNoYW0gJiYgVjhfVkVSU0lPTiAmJiBWOF9WRVJTSU9OIDwgNDE7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgU3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJyk7XG4gIHZhciBTeW1ib2xQcm90b3R5cGUgPSBTeW1ib2wgJiYgU3ltYm9sLnByb3RvdHlwZTtcbiAgdmFyIHZhbHVlT2YgPSBTeW1ib2xQcm90b3R5cGUgJiYgU3ltYm9sUHJvdG90eXBlLnZhbHVlT2Y7XG4gIHZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbiAgaWYgKFN5bWJvbFByb3RvdHlwZSAmJiAhU3ltYm9sUHJvdG90eXBlW1RPX1BSSU1JVElWRV0pIHtcbiAgICAvLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wucHJvdG90eXBlLUBAdG9wcmltaXRpdmVcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIC5sZW5ndGhcbiAgICBkZWZpbmVCdWlsdEluKFN5bWJvbFByb3RvdHlwZSwgVE9fUFJJTUlUSVZFLCBmdW5jdGlvbiAoaGludCkge1xuICAgICAgcmV0dXJuIGNhbGwodmFsdWVPZiwgdGhpcyk7XG4gICAgfSwgeyBhcml0eTogMSB9KTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgU3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJyk7XG52YXIga2V5Rm9yID0gU3ltYm9sLmtleUZvcjtcbnZhciB0aGlzU3ltYm9sVmFsdWUgPSB1bmN1cnJ5VGhpcyhTeW1ib2wucHJvdG90eXBlLnZhbHVlT2YpO1xuXG4vLyBgU3ltYm9sLmlzUmVnaXN0ZXJlZFN5bWJvbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtc3ltYm9sLXByZWRpY2F0ZXMvI3NlYy1zeW1ib2wtaXNyZWdpc3RlcmVkc3ltYm9sXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbC5pc1JlZ2lzdGVyZWRTeW1ib2wgfHwgZnVuY3Rpb24gaXNSZWdpc3RlcmVkU3ltYm9sKHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGtleUZvcih0aGlzU3ltYm9sVmFsdWUodmFsdWUpKSAhPT0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xudmFyICRpc1dlbGxLbm93blN5bWJvbCA9IFN5bWJvbC5pc1dlbGxLbm93blN5bWJvbDtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0QnVpbHRJbignT2JqZWN0JywgJ2dldE93blByb3BlcnR5TmFtZXMnKTtcbnZhciB0aGlzU3ltYm9sVmFsdWUgPSB1bmN1cnJ5VGhpcyhTeW1ib2wucHJvdG90eXBlLnZhbHVlT2YpO1xudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG5cbmZvciAodmFyIGkgPSAwLCBzeW1ib2xLZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhTeW1ib2wpLCBzeW1ib2xLZXlzTGVuZ3RoID0gc3ltYm9sS2V5cy5sZW5ndGg7IGkgPCBzeW1ib2xLZXlzTGVuZ3RoOyBpKyspIHtcbiAgLy8gc29tZSBvbGQgZW5naW5lcyB0aHJvd3Mgb24gYWNjZXNzIHRvIHNvbWUga2V5cyBsaWtlIGBhcmd1bWVudHNgIG9yIGBjYWxsZXJgXG4gIHRyeSB7XG4gICAgdmFyIHN5bWJvbEtleSA9IHN5bWJvbEtleXNbaV07XG4gICAgaWYgKGlzU3ltYm9sKFN5bWJvbFtzeW1ib2xLZXldKSkgd2VsbEtub3duU3ltYm9sKHN5bWJvbEtleSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn1cblxuLy8gYFN5bWJvbC5pc1dlbGxLbm93blN5bWJvbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtc3ltYm9sLXByZWRpY2F0ZXMvI3NlYy1zeW1ib2wtaXN3ZWxsa25vd25zeW1ib2xcbi8vIFdlIHNob3VsZCBwYXRjaCBpdCBmb3IgbmV3bHkgYWRkZWQgd2VsbC1rbm93biBzeW1ib2xzLiBJZiBpdCdzIG5vdCByZXF1aXJlZCwgdGhpcyBtb2R1bGUganVzdCB3aWxsIG5vdCBiZSBpbmplY3RlZFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1dlbGxLbm93blN5bWJvbCh2YWx1ZSkge1xuICBpZiAoJGlzV2VsbEtub3duU3ltYm9sICYmICRpc1dlbGxLbm93blN5bWJvbCh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIHZhciBzeW1ib2wgPSB0aGlzU3ltYm9sVmFsdWUodmFsdWUpO1xuICAgIGZvciAodmFyIGogPSAwLCBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhXZWxsS25vd25TeW1ib2xzU3RvcmUpLCBrZXlzTGVuZ3RoID0ga2V5cy5sZW5ndGg7IGogPCBrZXlzTGVuZ3RoOyBqKyspIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXEgLS0gcG9seWZpbGxlZCBzeW1ib2xzIGNhc2VcbiAgICAgIGlmIChXZWxsS25vd25TeW1ib2xzU3RvcmVba2V5c1tqXV0gPT0gc3ltYm9sKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcblxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHNhZmUgKi9cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX1NZTUJPTCAmJiAhIVN5bWJvbFsnZm9yJ10gJiYgISFTeW1ib2wua2V5Rm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGgnKTtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtaW9zJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1ub2RlJyk7XG5cbnZhciBzZXQgPSBnbG9iYWxUaGlzLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbFRoaXMuY2xlYXJJbW1lZGlhdGU7XG52YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbnZhciBEaXNwYXRjaCA9IGdsb2JhbFRoaXMuRGlzcGF0Y2g7XG52YXIgRnVuY3Rpb24gPSBnbG9iYWxUaGlzLkZ1bmN0aW9uO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsVGhpcy5NZXNzYWdlQ2hhbm5lbDtcbnZhciBTdHJpbmcgPSBnbG9iYWxUaGlzLlN0cmluZztcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyICRsb2NhdGlvbiwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG5cbmZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVubyB0aHJvd3MgYSBSZWZlcmVuY2VFcnJvciBvbiBgbG9jYXRpb25gIGFjY2VzcyB3aXRob3V0IGAtLWxvY2F0aW9uYCBmbGFnXG4gICRsb2NhdGlvbiA9IGdsb2JhbFRoaXMubG9jYXRpb247XG59KTtcblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICBpZiAoaGFzT3duKHF1ZXVlLCBpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcnVuKGlkKTtcbiAgfTtcbn07XG5cbnZhciBldmVudExpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bihldmVudC5kYXRhKTtcbn07XG5cbnZhciBnbG9iYWxQb3N0TWVzc2FnZURlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpblxuICBnbG9iYWxUaGlzLnBvc3RNZXNzYWdlKFN0cmluZyhpZCksICRsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyAkbG9jYXRpb24uaG9zdCk7XG59O1xuXG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldCB8fCAhY2xlYXIpIHtcbiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGhhbmRsZXIpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIgZm4gPSBpc0NhbGxhYmxlKGhhbmRsZXIpID8gaGFuZGxlciA6IEZ1bmN0aW9uKGhhbmRsZXIpO1xuICAgIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMsIDEpO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBhcHBseShmbiwgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhciA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChJU19OT0RFKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2socnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIC8vIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjI0XG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwgJiYgIUlTX0lPUykge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGV2ZW50TGlzdGVuZXI7XG4gICAgZGVmZXIgPSBiaW5kKHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChcbiAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIgJiZcbiAgICBpc0NhbGxhYmxlKGdsb2JhbFRoaXMucG9zdE1lc3NhZ2UpICYmXG4gICAgIWdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cyAmJlxuICAgICRsb2NhdGlvbiAmJiAkbG9jYXRpb24ucHJvdG9jb2wgIT09ICdmaWxlOicgJiZcbiAgICAhZmFpbHMoZ2xvYmFsUG9zdE1lc3NhZ2VEZWZlcilcbiAgKSB7XG4gICAgZGVmZXIgPSBnbG9iYWxQb3N0TWVzc2FnZURlZmVyO1xuICAgIGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihpbnRlZ2VyLCBsZW5ndGgpLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlck9ySW5maW5pdHkoaW5kZXgpO1xuICByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRydW5jID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hdGgtdHJ1bmMnKTtcblxuLy8gYFRvSW50ZWdlck9ySW5maW5pdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJvcmluZmluaXR5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgbnVtYmVyID0gK2FyZ3VtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICByZXR1cm4gbnVtYmVyICE9PSBudW1iZXIgfHwgbnVtYmVyID09PSAwID8gMCA6IHRydW5jKG51bWJlcik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvbGVuZ3RoXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgbGVuID0gdG9JbnRlZ2VyT3JJbmZpbml0eShhcmd1bWVudCk7XG4gIHJldHVybiBsZW4gPiAwID8gbWluKGxlbiwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuICRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcbnZhciBnZXRNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LW1ldGhvZCcpO1xudmFyIG9yZGluYXJ5VG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xudmFyIFRPX1BSSU1JVElWRSA9IHdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTtcblxuLy8gYFRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0LCBwcmVmKSB7XG4gIGlmICghaXNPYmplY3QoaW5wdXQpIHx8IGlzU3ltYm9sKGlucHV0KSkgcmV0dXJuIGlucHV0O1xuICB2YXIgZXhvdGljVG9QcmltID0gZ2V0TWV0aG9kKGlucHV0LCBUT19QUklNSVRJVkUpO1xuICB2YXIgcmVzdWx0O1xuICBpZiAoZXhvdGljVG9QcmltKSB7XG4gICAgaWYgKHByZWYgPT09IHVuZGVmaW5lZCkgcHJlZiA9ICdkZWZhdWx0JztcbiAgICByZXN1bHQgPSBjYWxsKGV4b3RpY1RvUHJpbSwgaW5wdXQsIHByZWYpO1xuICAgIGlmICghaXNPYmplY3QocmVzdWx0KSB8fCBpc1N5bWJvbChyZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICAgIHRocm93IG5ldyAkVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuICB9XG4gIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnbnVtYmVyJztcbiAgcmV0dXJuIG9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIHByZWYpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcblxuLy8gYFRvUHJvcGVydHlLZXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3Byb3BlcnR5a2V5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsICdzdHJpbmcnKTtcbiAgcmV0dXJuIGlzU3ltYm9sKGtleSkgPyBrZXkgOiBrZXkgKyAnJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIHRlc3QgPSB7fTtcblxudGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6JztcblxubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxudmFyICRTdHJpbmcgPSBTdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ1N5bWJvbCcpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG4gIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJFN0cmluZyA9IFN0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gJFN0cmluZyhhcmd1bWVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuICdPYmplY3QnO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyAoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgdG9TdHJpbmcoKytpZCArIHBvc3RmaXgsIDM2KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gVjggfiBDaHJvbWUgMzYtXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMzM0XG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgJ3Byb3RvdHlwZScsIHtcbiAgICB2YWx1ZTogNDIsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pLnByb3RvdHlwZSAhPT0gNDI7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXNzZWQsIHJlcXVpcmVkKSB7XG4gIGlmIChwYXNzZWQgPCByZXF1aXJlZCkgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ05vdCBlbm91Z2ggYXJndW1lbnRzJyk7XG4gIHJldHVybiBwYXNzZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsVGhpcy5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQ2FsbGFibGUoV2Vha01hcCkgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFN0cmluZyhXZWFrTWFwKSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLXdyYXBwZWQnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSkge1xuICB2YXIgU3ltYm9sID0gcGF0aC5TeW1ib2wgfHwgKHBhdGguU3ltYm9sID0ge30pO1xuICBpZiAoIWhhc093bihTeW1ib2wsIE5BTUUpKSBkZWZpbmVQcm9wZXJ0eShTeW1ib2wsIE5BTUUsIHtcbiAgICB2YWx1ZTogd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKE5BTUUpXG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuZXhwb3J0cy5mID0gd2VsbEtub3duU3ltYm9sO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIFN5bWJvbCA9IGdsb2JhbFRoaXMuU3ltYm9sO1xudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgY3JlYXRlV2VsbEtub3duU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBTeW1ib2xbJ2ZvciddIHx8IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXNPd24oV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSkge1xuICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IE5BVElWRV9TWU1CT0wgJiYgaGFzT3duKFN5bWJvbCwgbmFtZSlcbiAgICAgID8gU3ltYm9sW25hbWVdXG4gICAgICA6IGNyZWF0ZVdlbGxLbm93blN5bWJvbCgnU3ltYm9sLicgKyBuYW1lKTtcbiAgfSByZXR1cm4gV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGEgc3RyaW5nIG9mIGFsbCB2YWxpZCB1bmljb2RlIHdoaXRlc3BhY2VzXG5tb2R1bGUuZXhwb3J0cyA9ICdcXHUwMDA5XFx1MDAwQVxcdTAwMEJcXHUwMDBDXFx1MDAwRFxcdTAwMjBcXHUwMEEwXFx1MTY4MFxcdTIwMDBcXHUyMDAxXFx1MjAwMicgK1xuICAnXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgaW5zdGFsbEVycm9yQ2F1c2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zdGFsbC1lcnJvci1jYXVzZScpO1xudmFyIGluc3RhbGxFcnJvclN0YWNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBub3JtYWxpemVTdHJpbmdBcmd1bWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyICRFcnJvciA9IEVycm9yO1xudmFyIHB1c2ggPSBbXS5wdXNoO1xuXG52YXIgJEFnZ3JlZ2F0ZUVycm9yID0gZnVuY3Rpb24gQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBtZXNzYWdlIC8qICwgb3B0aW9ucyAqLykge1xuICB2YXIgaXNJbnN0YW5jZSA9IGlzUHJvdG90eXBlT2YoQWdncmVnYXRlRXJyb3JQcm90b3R5cGUsIHRoaXMpO1xuICB2YXIgdGhhdDtcbiAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgdGhhdCA9IHNldFByb3RvdHlwZU9mKG5ldyAkRXJyb3IoKSwgaXNJbnN0YW5jZSA/IGdldFByb3RvdHlwZU9mKHRoaXMpIDogQWdncmVnYXRlRXJyb3JQcm90b3R5cGUpO1xuICB9IGVsc2Uge1xuICAgIHRoYXQgPSBpc0luc3RhbmNlID8gdGhpcyA6IGNyZWF0ZShBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSk7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsIFRPX1NUUklOR19UQUcsICdFcnJvcicpO1xuICB9XG4gIGlmIChtZXNzYWdlICE9PSB1bmRlZmluZWQpIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0aGF0LCAnbWVzc2FnZScsIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KG1lc3NhZ2UpKTtcbiAgaW5zdGFsbEVycm9yU3RhY2sodGhhdCwgJEFnZ3JlZ2F0ZUVycm9yLCB0aGF0LnN0YWNrLCAxKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSBpbnN0YWxsRXJyb3JDYXVzZSh0aGF0LCBhcmd1bWVudHNbMl0pO1xuICB2YXIgZXJyb3JzQXJyYXkgPSBbXTtcbiAgaXRlcmF0ZShlcnJvcnMsIHB1c2gsIHsgdGhhdDogZXJyb3JzQXJyYXkgfSk7XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0aGF0LCAnZXJyb3JzJywgZXJyb3JzQXJyYXkpO1xuICByZXR1cm4gdGhhdDtcbn07XG5cbmlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoJEFnZ3JlZ2F0ZUVycm9yLCAkRXJyb3IpO1xuZWxzZSBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKCRBZ2dyZWdhdGVFcnJvciwgJEVycm9yLCB7IG5hbWU6IHRydWUgfSk7XG5cbnZhciBBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSA9ICRBZ2dyZWdhdGVFcnJvci5wcm90b3R5cGUgPSBjcmVhdGUoJEVycm9yLnByb3RvdHlwZSwge1xuICBjb25zdHJ1Y3RvcjogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsICRBZ2dyZWdhdGVFcnJvciksXG4gIG1lc3NhZ2U6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCAnJyksXG4gIG5hbWU6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCAnQWdncmVnYXRlRXJyb3InKVxufSk7XG5cbi8vIGBBZ2dyZWdhdGVFcnJvcmAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYWdncmVnYXRlLWVycm9yLWNvbnN0cnVjdG9yXG4kKHsgZ2xvYmFsOiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgYXJpdHk6IDIgfSwge1xuICBBZ2dyZWdhdGVFcnJvcjogJEFnZ3JlZ2F0ZUVycm9yXG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5jb25zdHJ1Y3RvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlcicpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXY4LXZlcnNpb24nKTtcblxudmFyIElTX0NPTkNBVF9TUFJFQURBQkxFID0gd2VsbEtub3duU3ltYm9sKCdpc0NvbmNhdFNwcmVhZGFibGUnKTtcblxuLy8gV2UgY2FuJ3QgdXNlIHRoaXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzXG4vLyBkZW9wdGltaXphdGlvbiBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxudmFyIElTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQgPSBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBhcnJheSA9IFtdO1xuICBhcnJheVtJU19DT05DQVRfU1BSRUFEQUJMRV0gPSBmYWxzZTtcbiAgcmV0dXJuIGFycmF5LmNvbmNhdCgpWzBdICE9PSBhcnJheTtcbn0pO1xuXG52YXIgaXNDb25jYXRTcHJlYWRhYmxlID0gZnVuY3Rpb24gKE8pIHtcbiAgaWYgKCFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgc3ByZWFkYWJsZSA9IE9bSVNfQ09OQ0FUX1NQUkVBREFCTEVdO1xuICByZXR1cm4gc3ByZWFkYWJsZSAhPT0gdW5kZWZpbmVkID8gISFzcHJlYWRhYmxlIDogaXNBcnJheShPKTtcbn07XG5cbnZhciBGT1JDRUQgPSAhSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCB8fCAhYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnY29uY2F0Jyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuY29uY2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmNvbmNhdFxuLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQGlzQ29uY2F0U3ByZWFkYWJsZSBhbmQgQEBzcGVjaWVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgYXJpdHk6IDEsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgY29uY2F0OiBmdW5jdGlvbiBjb25jYXQoYXJnKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGksIGssIGxlbmd0aCwgbGVuLCBFO1xuICAgIGZvciAoaSA9IC0xLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIEUgPSBpID09PSAtMSA/IE8gOiBhcmd1bWVudHNbaV07XG4gICAgICBpZiAoaXNDb25jYXRTcHJlYWRhYmxlKEUpKSB7XG4gICAgICAgIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKEUpO1xuICAgICAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobiArIGxlbik7XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBsZW47IGsrKywgbisrKSBpZiAoayBpbiBFKSBjcmVhdGVQcm9wZXJ0eShBLCBuLCBFW2tdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlcihuICsgMSk7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KEEsIG4rKywgRSk7XG4gICAgICB9XG4gICAgfVxuICAgIEEubGVuZ3RoID0gbjtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZXZlcnkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZXZlcnk7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG5cbnZhciBTVFJJQ1RfTUVUSE9EID0gYXJyYXlNZXRob2RJc1N0cmljdCgnZXZlcnknKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5ldmVyeVxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIVNUUklDVF9NRVRIT0QgfSwge1xuICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJGV2ZXJ5KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZmlsdGVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZpbHRlcjtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0Jyk7XG5cbnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnZmlsdGVyJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFIQVNfU1BFQ0lFU19TVVBQT1JUIH0sIHtcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJGZpbHRlcih0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGZpbmRJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5maW5kSW5kZXg7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcblxudmFyIEZJTkRfSU5ERVggPSAnZmluZEluZGV4JztcbnZhciBTS0lQU19IT0xFUyA9IHRydWU7XG5cbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWZpbmRpbmRleCAtLSB0ZXN0aW5nXG5pZiAoRklORF9JTkRFWCBpbiBbXSkgQXJyYXkoMSlbRklORF9JTkRFWF0oZnVuY3Rpb24gKCkgeyBTS0lQU19IT0xFUyA9IGZhbHNlOyB9KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZGluZGV4XG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTS0lQU19IT0xFUyB9LCB7XG4gIGZpbmRJbmRleDogZnVuY3Rpb24gZmluZEluZGV4KGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kSW5kZXgodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcyhGSU5EX0lOREVYKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZpbmQ7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcblxudmFyIEZJTkQgPSAnZmluZCc7XG52YXIgU0tJUFNfSE9MRVMgPSB0cnVlO1xuXG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LXByb3RvdHlwZS1maW5kIC0tIHRlc3RpbmdcbmlmIChGSU5EIGluIFtdKSBBcnJheSgxKVtGSU5EXShmdW5jdGlvbiAoKSB7IFNLSVBTX0hPTEVTID0gZmFsc2U7IH0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogU0tJUFNfSE9MRVMgfSwge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoRklORCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWZvcmVhY2ggLS0gc2FmZVxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogW10uZm9yRWFjaCAhPT0gZm9yRWFjaCB9LCB7XG4gIGZvckVhY2g6IGZvckVhY2hcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgZnJvbTogZnJvbVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkaW5jbHVkZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmNsdWRlcztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG5cbi8vIEZGOTkrIGJ1Z1xudmFyIEJST0tFTl9PTl9TUEFSU0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1wcm90b3R5cGUtaW5jbHVkZXMgLS0gZGV0ZWN0aW9uXG4gIHJldHVybiAhQXJyYXkoMSkuaW5jbHVkZXMoKTtcbn0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCUk9LRU5fT05fU1BBUlNFIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1hcnJheS1wcm90b3R5cGUtaW5kZXhvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZScpO1xudmFyICRpbmRleE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJykuaW5kZXhPZjtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcblxudmFyIG5hdGl2ZUluZGV4T2YgPSB1bmN1cnJ5VGhpcyhbXS5pbmRleE9mKTtcblxudmFyIE5FR0FUSVZFX1pFUk8gPSAhIW5hdGl2ZUluZGV4T2YgJiYgMSAvIG5hdGl2ZUluZGV4T2YoWzFdLCAxLCAtMCkgPCAwO1xudmFyIEZPUkNFRCA9IE5FR0FUSVZFX1pFUk8gfHwgIWFycmF5TWV0aG9kSXNTdHJpY3QoJ2luZGV4T2YnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICB2YXIgZnJvbUluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE5FR0FUSVZFX1pFUk9cbiAgICAgIC8vIGNvbnZlcnQgLTAgdG8gKzBcbiAgICAgID8gbmF0aXZlSW5kZXhPZih0aGlzLCBzZWFyY2hFbGVtZW50LCBmcm9tSW5kZXgpIHx8IDBcbiAgICAgIDogJGluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgZnJvbUluZGV4KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG5cbi8vIGBBcnJheS5pc0FycmF5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuaXNhcnJheVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzQXJyYXk6IGlzQXJyYXlcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUnKTtcbnZhciBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgQVJSQVlfSVRFUkFUT1IgPSAnQXJyYXkgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoQVJSQVlfSVRFUkFUT1IpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZW50cmllc1xuLy8gYEFycmF5LnByb3RvdHlwZS5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnZhbHVlc1xuLy8gYEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4vLyBgQ3JlYXRlQXJyYXlJdGVyYXRvcmAgaW50ZXJuYWwgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVhcnJheWl0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciB0YXJnZXQgPSBzdGF0ZS50YXJnZXQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuICBzd2l0Y2ggKHN0YXRlLmtpbmQpIHtcbiAgICBjYXNlICdrZXlzJzogcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QoaW5kZXgsIGZhbHNlKTtcbiAgICBjYXNlICd2YWx1ZXMnOiByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdCh0YXJnZXRbaW5kZXhdLCBmYWxzZSk7XG4gIH0gcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QoW2luZGV4LCB0YXJnZXRbaW5kZXhdXSwgZmFsc2UpO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRldW5tYXBwZWRhcmd1bWVudHNvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlbWFwcGVkYXJndW1lbnRzb2JqZWN0XG52YXIgdmFsdWVzID0gSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG5cbi8vIFY4IH4gQ2hyb21lIDQ1LSBidWdcbmlmICghSVNfUFVSRSAmJiBERVNDUklQVE9SUyAmJiB2YWx1ZXMubmFtZSAhPT0gJ3ZhbHVlcycpIHRyeSB7XG4gIGRlZmluZVByb3BlcnR5KHZhbHVlcywgJ25hbWUnLCB7IHZhbHVlOiAndmFsdWVzJyB9KTtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRtYXAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykubWFwO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcblxudmFyIEhBU19TUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdtYXAnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAc3BlY2llc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfSwge1xuICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkbWFwKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkcmVkdWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXJlZHVjZScpLmxlZnQ7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG52YXIgQ0hST01FX1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdjgtdmVyc2lvbicpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtbm9kZScpO1xuXG4vLyBDaHJvbWUgODAtODIgaGFzIGEgY3JpdGljYWwgYnVnXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDQ5OTgyXG52YXIgQ0hST01FX0JVRyA9ICFJU19OT0RFICYmIENIUk9NRV9WRVJTSU9OID4gNzkgJiYgQ0hST01FX1ZFUlNJT04gPCA4MztcbnZhciBGT1JDRUQgPSBDSFJPTUVfQlVHIHx8ICFhcnJheU1ldGhvZElzU3RyaWN0KCdyZWR1Y2UnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgcmV0dXJuICRyZWR1Y2UodGhpcywgY2FsbGJhY2tmbiwgbGVuZ3RoLCBsZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgaXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvcicpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydCcpO1xudmFyIG5hdGl2ZVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG5cbnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnc2xpY2UnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciAkQXJyYXkgPSBBcnJheTtcbnZhciBtYXggPSBNYXRoLm1heDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5zbGljZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zbGljZVxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0c1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfSwge1xuICBzbGljZTogZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICB2YXIgayA9IHRvQWJzb2x1dGVJbmRleChzdGFydCwgbGVuZ3RoKTtcbiAgICB2YXIgZmluID0gdG9BYnNvbHV0ZUluZGV4KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kLCBsZW5ndGgpO1xuICAgIC8vIGlubGluZSBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBmb3IgdXNhZ2UgbmF0aXZlIGBBcnJheSNzbGljZWAgd2hlcmUgaXQncyBwb3NzaWJsZVxuICAgIHZhciBDb25zdHJ1Y3RvciwgcmVzdWx0LCBuO1xuICAgIGlmIChpc0FycmF5KE8pKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IE8uY29uc3RydWN0b3I7XG4gICAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgICAgaWYgKGlzQ29uc3RydWN0b3IoQ29uc3RydWN0b3IpICYmIChDb25zdHJ1Y3RvciA9PT0gJEFycmF5IHx8IGlzQXJyYXkoQ29uc3RydWN0b3IucHJvdG90eXBlKSkpIHtcbiAgICAgICAgQ29uc3RydWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KENvbnN0cnVjdG9yKSkge1xuICAgICAgICBDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yW1NQRUNJRVNdO1xuICAgICAgICBpZiAoQ29uc3RydWN0b3IgPT09IG51bGwpIENvbnN0cnVjdG9yID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKENvbnN0cnVjdG9yID09PSAkQXJyYXkgfHwgQ29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbmF0aXZlU2xpY2UoTywgaywgZmluKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0ID0gbmV3IChDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkID8gJEFycmF5IDogQ29uc3RydWN0b3IpKG1heChmaW4gLSBrLCAwKSk7XG4gICAgZm9yIChuID0gMDsgayA8IGZpbjsgaysrLCBuKyspIGlmIChrIGluIE8pIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgbiwgT1trXSk7XG4gICAgcmVzdWx0Lmxlbmd0aCA9IG47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG52YXIgZGVsZXRlUHJvcGVydHlPclRocm93ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlbGV0ZS1wcm9wZXJ0eS1vci10aHJvdycpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaW50ZXJuYWxTb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNvcnQnKTtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcbnZhciBGRiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1mZi12ZXJzaW9uJyk7XG52YXIgSUVfT1JfRURHRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1pZS1vci1lZGdlJyk7XG52YXIgVjggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdjgtdmVyc2lvbicpO1xudmFyIFdFQktJVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC13ZWJraXQtdmVyc2lvbicpO1xuXG52YXIgdGVzdCA9IFtdO1xudmFyIG5hdGl2ZVNvcnQgPSB1bmN1cnJ5VGhpcyh0ZXN0LnNvcnQpO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyh0ZXN0LnB1c2gpO1xuXG4vLyBJRTgtXG52YXIgRkFJTFNfT05fVU5ERUZJTkVEID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICB0ZXN0LnNvcnQodW5kZWZpbmVkKTtcbn0pO1xuLy8gVjggYnVnXG52YXIgRkFJTFNfT05fTlVMTCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdGVzdC5zb3J0KG51bGwpO1xufSk7XG4vLyBPbGQgV2ViS2l0XG52YXIgU1RSSUNUX01FVEhPRCA9IGFycmF5TWV0aG9kSXNTdHJpY3QoJ3NvcnQnKTtcblxudmFyIFNUQUJMRV9TT1JUID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZmVhdHVyZSBkZXRlY3Rpb24gY2FuIGJlIHRvbyBzbG93LCBzbyBjaGVjayBlbmdpbmVzIHZlcnNpb25zXG4gIGlmIChWOCkgcmV0dXJuIFY4IDwgNzA7XG4gIGlmIChGRiAmJiBGRiA+IDMpIHJldHVybjtcbiAgaWYgKElFX09SX0VER0UpIHJldHVybiB0cnVlO1xuICBpZiAoV0VCS0lUKSByZXR1cm4gV0VCS0lUIDwgNjAzO1xuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgdmFyIGNvZGUsIGNociwgdmFsdWUsIGluZGV4O1xuXG4gIC8vIGdlbmVyYXRlIGFuIGFycmF5IHdpdGggbW9yZSA1MTIgZWxlbWVudHMgKENoYWtyYSBhbmQgb2xkIFY4IGZhaWxzIG9ubHkgaW4gdGhpcyBjYXNlKVxuICBmb3IgKGNvZGUgPSA2NTsgY29kZSA8IDc2OyBjb2RlKyspIHtcbiAgICBjaHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuXG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlIDY2OiBjYXNlIDY5OiBjYXNlIDcwOiBjYXNlIDcyOiB2YWx1ZSA9IDM7IGJyZWFrO1xuICAgICAgY2FzZSA2ODogY2FzZSA3MTogdmFsdWUgPSA0OyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHZhbHVlID0gMjtcbiAgICB9XG5cbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0NzsgaW5kZXgrKykge1xuICAgICAgdGVzdC5wdXNoKHsgazogY2hyICsgaW5kZXgsIHY6IHZhbHVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRlc3Quc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYi52IC0gYS52OyB9KTtcblxuICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0ZXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNociA9IHRlc3RbaW5kZXhdLmsuY2hhckF0KDApO1xuICAgIGlmIChyZXN1bHQuY2hhckF0KHJlc3VsdC5sZW5ndGggLSAxKSAhPT0gY2hyKSByZXN1bHQgKz0gY2hyO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCAhPT0gJ0RHQkVGSEFDSUpLJztcbn0pO1xuXG52YXIgRk9SQ0VEID0gRkFJTFNfT05fVU5ERUZJTkVEIHx8ICFGQUlMU19PTl9OVUxMIHx8ICFTVFJJQ1RfTUVUSE9EIHx8ICFTVEFCTEVfU09SVDtcblxudmFyIGdldFNvcnRDb21wYXJlID0gZnVuY3Rpb24gKGNvbXBhcmVmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gLTE7XG4gICAgaWYgKHggPT09IHVuZGVmaW5lZCkgcmV0dXJuIDE7XG4gICAgaWYgKGNvbXBhcmVmbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gK2NvbXBhcmVmbih4LCB5KSB8fCAwO1xuICAgIHJldHVybiB0b1N0cmluZyh4KSA+IHRvU3RyaW5nKHkpID8gMSA6IC0xO1xuICB9O1xufTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5zb3J0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvcnRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7XG4gICAgaWYgKGNvbXBhcmVmbiAhPT0gdW5kZWZpbmVkKSBhQ2FsbGFibGUoY29tcGFyZWZuKTtcblxuICAgIHZhciBhcnJheSA9IHRvT2JqZWN0KHRoaXMpO1xuXG4gICAgaWYgKFNUQUJMRV9TT1JUKSByZXR1cm4gY29tcGFyZWZuID09PSB1bmRlZmluZWQgPyBuYXRpdmVTb3J0KGFycmF5KSA6IG5hdGl2ZVNvcnQoYXJyYXksIGNvbXBhcmVmbik7XG5cbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB2YXIgYXJyYXlMZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShhcnJheSk7XG4gICAgdmFyIGl0ZW1zTGVuZ3RoLCBpbmRleDtcblxuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGFycmF5TGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoaW5kZXggaW4gYXJyYXkpIHB1c2goaXRlbXMsIGFycmF5W2luZGV4XSk7XG4gICAgfVxuXG4gICAgaW50ZXJuYWxTb3J0KGl0ZW1zLCBnZXRTb3J0Q29tcGFyZShjb21wYXJlZm4pKTtcblxuICAgIGl0ZW1zTGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoaXRlbXMpO1xuICAgIGluZGV4ID0gMDtcblxuICAgIHdoaWxlIChpbmRleCA8IGl0ZW1zTGVuZ3RoKSBhcnJheVtpbmRleF0gPSBpdGVtc1tpbmRleCsrXTtcbiAgICB3aGlsZSAoaW5kZXggPCBhcnJheUxlbmd0aCkgZGVsZXRlUHJvcGVydHlPclRocm93KGFycmF5LCBpbmRleCsrKTtcblxuICAgIHJldHVybiBhcnJheTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIHNldEFycmF5TGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGgnKTtcbnZhciBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlcicpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWxldGUtcHJvcGVydHktb3ItdGhyb3cnKTtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0Jyk7XG5cbnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnc3BsaWNlJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc3BsaWNlXG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAc3BlY2llc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfSwge1xuICBzcGxpY2U6IGZ1bmN0aW9uIHNwbGljZShzdGFydCwgZGVsZXRlQ291bnQgLyogLCAuLi5pdGVtcyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBhY3R1YWxTdGFydCA9IHRvQWJzb2x1dGVJbmRleChzdGFydCwgbGVuKTtcbiAgICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgaW5zZXJ0Q291bnQsIGFjdHVhbERlbGV0ZUNvdW50LCBBLCBrLCBmcm9tLCB0bztcbiAgICBpZiAoYXJndW1lbnRzTGVuZ3RoID09PSAwKSB7XG4gICAgICBpbnNlcnRDb3VudCA9IGFjdHVhbERlbGV0ZUNvdW50ID0gMDtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50c0xlbmd0aCA9PT0gMSkge1xuICAgICAgaW5zZXJ0Q291bnQgPSAwO1xuICAgICAgYWN0dWFsRGVsZXRlQ291bnQgPSBsZW4gLSBhY3R1YWxTdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zZXJ0Q291bnQgPSBhcmd1bWVudHNMZW5ndGggLSAyO1xuICAgICAgYWN0dWFsRGVsZXRlQ291bnQgPSBtaW4obWF4KHRvSW50ZWdlck9ySW5maW5pdHkoZGVsZXRlQ291bnQpLCAwKSwgbGVuIC0gYWN0dWFsU3RhcnQpO1xuICAgIH1cbiAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobGVuICsgaW5zZXJ0Q291bnQgLSBhY3R1YWxEZWxldGVDb3VudCk7XG4gICAgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCBhY3R1YWxEZWxldGVDb3VudCk7XG4gICAgZm9yIChrID0gMDsgayA8IGFjdHVhbERlbGV0ZUNvdW50OyBrKyspIHtcbiAgICAgIGZyb20gPSBhY3R1YWxTdGFydCArIGs7XG4gICAgICBpZiAoZnJvbSBpbiBPKSBjcmVhdGVQcm9wZXJ0eShBLCBrLCBPW2Zyb21dKTtcbiAgICB9XG4gICAgQS5sZW5ndGggPSBhY3R1YWxEZWxldGVDb3VudDtcbiAgICBpZiAoaW5zZXJ0Q291bnQgPCBhY3R1YWxEZWxldGVDb3VudCkge1xuICAgICAgZm9yIChrID0gYWN0dWFsU3RhcnQ7IGsgPCBsZW4gLSBhY3R1YWxEZWxldGVDb3VudDsgaysrKSB7XG4gICAgICAgIGZyb20gPSBrICsgYWN0dWFsRGVsZXRlQ291bnQ7XG4gICAgICAgIHRvID0gayArIGluc2VydENvdW50O1xuICAgICAgICBpZiAoZnJvbSBpbiBPKSBPW3RvXSA9IE9bZnJvbV07XG4gICAgICAgIGVsc2UgZGVsZXRlUHJvcGVydHlPclRocm93KE8sIHRvKTtcbiAgICAgIH1cbiAgICAgIGZvciAoayA9IGxlbjsgayA+IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50ICsgaW5zZXJ0Q291bnQ7IGstLSkgZGVsZXRlUHJvcGVydHlPclRocm93KE8sIGsgLSAxKTtcbiAgICB9IGVsc2UgaWYgKGluc2VydENvdW50ID4gYWN0dWFsRGVsZXRlQ291bnQpIHtcbiAgICAgIGZvciAoayA9IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50OyBrID4gYWN0dWFsU3RhcnQ7IGstLSkge1xuICAgICAgICBmcm9tID0gayArIGFjdHVhbERlbGV0ZUNvdW50IC0gMTtcbiAgICAgICAgdG8gPSBrICsgaW5zZXJ0Q291bnQgLSAxO1xuICAgICAgICBpZiAoZnJvbSBpbiBPKSBPW3RvXSA9IE9bZnJvbV07XG4gICAgICAgIGVsc2UgZGVsZXRlUHJvcGVydHlPclRocm93KE8sIHRvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChrID0gMDsgayA8IGluc2VydENvdW50OyBrKyspIHtcbiAgICAgIE9bayArIGFjdHVhbFN0YXJ0XSA9IGFyZ3VtZW50c1trICsgMl07XG4gICAgfVxuICAgIHNldEFycmF5TGVuZ3RoKE8sIGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50ICsgaW5zZXJ0Q291bnQpO1xuICAgIHJldHVybiBBO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIHRvSVNPU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RhdGUtdG8taXNvLXN0cmluZycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IERhdGUoTmFOKS50b0pTT04oKSAhPT0gbnVsbFxuICAgIHx8IGNhbGwoRGF0ZS5wcm90b3R5cGUudG9KU09OLCB7IHRvSVNPU3RyaW5nOiBmdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9IH0pICE9PSAxO1xufSk7XG5cbi8vIGBEYXRlLnByb3RvdHlwZS50b0pTT05gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1kYXRlLnByb3RvdHlwZS50b2pzb25cbiQoeyB0YXJnZXQ6ICdEYXRlJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oa2V5KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgcHYgPSB0b1ByaW1pdGl2ZShPLCAnbnVtYmVyJyk7XG4gICAgcmV0dXJuIHR5cGVvZiBwdiA9PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUocHYpID8gbnVsbCA6XG4gICAgICAoISgndG9JU09TdHJpbmcnIGluIE8pICYmIGNsYXNzb2YoTykgPT09ICdEYXRlJykgPyBjYWxsKHRvSVNPU3RyaW5nLCBPKSA6IE8udG9JU09TdHJpbmcoKTtcbiAgfVxufSk7XG4iLCIvLyBlbXB0eVxuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZCcpO1xuXG4vLyBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYmluZFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWZ1bmN0aW9uLXByb3RvdHlwZS1iaW5kIC0tIGRldGVjdGlvblxuJCh7IHRhcmdldDogJ0Z1bmN0aW9uJywgcHJvdG86IHRydWUsIGZvcmNlZDogRnVuY3Rpb24uYmluZCAhPT0gYmluZCB9LCB7XG4gIGJpbmQ6IGJpbmRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xudmFyIGFycmF5U2xpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2UnKTtcbnZhciBnZXRSZXBsYWNlckZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1qc29uLXJlcGxhY2VyLWZ1bmN0aW9uJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcygvLi8uZXhlYyk7XG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBjaGFyQ29kZUF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckNvZGVBdCk7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIG51bWJlclRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxudmFyIHRlc3RlciA9IC9bXFx1RDgwMC1cXHVERkZGXS9nO1xudmFyIGxvdyA9IC9eW1xcdUQ4MDAtXFx1REJGRl0kLztcbnZhciBoaSA9IC9eW1xcdURDMDAtXFx1REZGRl0kLztcblxudmFyIFdST05HX1NZTUJPTFNfQ09OVkVSU0lPTiA9ICFOQVRJVkVfU1lNQk9MIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpKCdzdHJpbmdpZnkgZGV0ZWN0aW9uJyk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIHJldHVybiAkc3RyaW5naWZ5KFtzeW1ib2xdKSAhPT0gJ1tudWxsXSdcbiAgICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgICB8fCAkc3RyaW5naWZ5KHsgYTogc3ltYm9sIH0pICE9PSAne30nXG4gICAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgICB8fCAkc3RyaW5naWZ5KE9iamVjdChzeW1ib2wpKSAhPT0gJ3t9Jztcbn0pO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC13ZWxsLWZvcm1lZC1zdHJpbmdpZnlcbnZhciBJTExfRk9STUVEX1VOSUNPREUgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAkc3RyaW5naWZ5KCdcXHVERjA2XFx1RDgzNCcpICE9PSAnXCJcXFxcdWRmMDZcXFxcdWQ4MzRcIidcbiAgICB8fCAkc3RyaW5naWZ5KCdcXHVERUFEJykgIT09ICdcIlxcXFx1ZGVhZFwiJztcbn0pO1xuXG52YXIgc3RyaW5naWZ5V2l0aFN5bWJvbHNGaXggPSBmdW5jdGlvbiAoaXQsIHJlcGxhY2VyKSB7XG4gIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMpO1xuICB2YXIgJHJlcGxhY2VyID0gZ2V0UmVwbGFjZXJGdW5jdGlvbihyZXBsYWNlcik7XG4gIGlmICghaXNDYWxsYWJsZSgkcmVwbGFjZXIpICYmIChpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICBhcmdzWzFdID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAvLyBzb21lIG9sZCBpbXBsZW1lbnRhdGlvbnMgKGxpa2UgV2ViS2l0KSBjb3VsZCBwYXNzIG51bWJlcnMgYXMga2V5c1xuICAgIGlmIChpc0NhbGxhYmxlKCRyZXBsYWNlcikpIHZhbHVlID0gY2FsbCgkcmVwbGFjZXIsIHRoaXMsICRTdHJpbmcoa2V5KSwgdmFsdWUpO1xuICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIH07XG4gIHJldHVybiBhcHBseSgkc3RyaW5naWZ5LCBudWxsLCBhcmdzKTtcbn07XG5cbnZhciBmaXhJbGxGb3JtZWQgPSBmdW5jdGlvbiAobWF0Y2gsIG9mZnNldCwgc3RyaW5nKSB7XG4gIHZhciBwcmV2ID0gY2hhckF0KHN0cmluZywgb2Zmc2V0IC0gMSk7XG4gIHZhciBuZXh0ID0gY2hhckF0KHN0cmluZywgb2Zmc2V0ICsgMSk7XG4gIGlmICgoZXhlYyhsb3csIG1hdGNoKSAmJiAhZXhlYyhoaSwgbmV4dCkpIHx8IChleGVjKGhpLCBtYXRjaCkgJiYgIWV4ZWMobG93LCBwcmV2KSkpIHtcbiAgICByZXR1cm4gJ1xcXFx1JyArIG51bWJlclRvU3RyaW5nKGNoYXJDb2RlQXQobWF0Y2gsIDApLCAxNik7XG4gIH0gcmV0dXJuIG1hdGNoO1xufTtcblxuaWYgKCRzdHJpbmdpZnkpIHtcbiAgLy8gYEpTT04uc3RyaW5naWZ5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnN0cmluZ2lmeVxuICAkKHsgdGFyZ2V0OiAnSlNPTicsIHN0YXQ6IHRydWUsIGFyaXR5OiAzLCBmb3JjZWQ6IFdST05HX1NZTUJPTFNfQ09OVkVSU0lPTiB8fCBJTExfRk9STUVEX1VOSUNPREUgfSwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICAgICAgdmFyIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cyk7XG4gICAgICB2YXIgcmVzdWx0ID0gYXBwbHkoV1JPTkdfU1lNQk9MU19DT05WRVJTSU9OID8gc3RyaW5naWZ5V2l0aFN5bWJvbHNGaXggOiAkc3RyaW5naWZ5LCBudWxsLCBhcmdzKTtcbiAgICAgIHJldHVybiBJTExfRk9STUVEX1VOSUNPREUgJiYgdHlwZW9mIHJlc3VsdCA9PSAnc3RyaW5nJyA/IHJlcGxhY2UocmVzdWx0LCB0ZXN0ZXIsIGZpeElsbEZvcm1lZCkgOiByZXN1bHQ7XG4gICAgfVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcblxuLy8gSlNPTltAQHRvU3RyaW5nVGFnXSBwcm9wZXJ0eVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLUBAdG9zdHJpbmd0YWdcbnNldFRvU3RyaW5nVGFnKGdsb2JhbFRoaXMuSlNPTiwgJ0pTT04nLCB0cnVlKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uU3Ryb25nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIGBNYXBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC1vYmplY3RzXG5jb2xsZWN0aW9uKCdNYXAnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIGNvbGxlY3Rpb25TdHJvbmcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIE1hcEhlbHBlcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWFwLWhlbHBlcnMnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgTWFwID0gTWFwSGVscGVycy5NYXA7XG52YXIgaGFzID0gTWFwSGVscGVycy5oYXM7XG52YXIgZ2V0ID0gTWFwSGVscGVycy5nZXQ7XG52YXIgc2V0ID0gTWFwSGVscGVycy5zZXQ7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG52YXIgRE9FU19OT1RfV09SS19XSVRIX1BSSU1JVElWRVMgPSBJU19QVVJFIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE1hcC5ncm91cEJ5KCdhYicsIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBpdDtcbiAgfSkuZ2V0KCdhJykubGVuZ3RoICE9PSAxO1xufSk7XG5cbi8vIGBNYXAuZ3JvdXBCeWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1ncm91cGluZ1xuJCh7IHRhcmdldDogJ01hcCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBET0VTX05PVF9XT1JLX1dJVEhfUFJJTUlUSVZFUyB9LCB7XG4gIGdyb3VwQnk6IGZ1bmN0aW9uIGdyb3VwQnkoaXRlbXMsIGNhbGxiYWNrZm4pIHtcbiAgICByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0ZW1zKTtcbiAgICBhQ2FsbGFibGUoY2FsbGJhY2tmbik7XG4gICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgayA9IDA7XG4gICAgaXRlcmF0ZShpdGVtcywgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB2YXIga2V5ID0gY2FsbGJhY2tmbih2YWx1ZSwgaysrKTtcbiAgICAgIGlmICghaGFzKG1hcCwga2V5KSkgc2V0KG1hcCwga2V5LCBbdmFsdWVdKTtcbiAgICAgIGVsc2UgcHVzaChnZXQobWFwLCBrZXkpLCB2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHJlcGxhY2VkIHRvIG1vZHVsZSBiZWxvd1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5tYXAuY29uc3RydWN0b3InKTtcbiIsIi8vIGVtcHR5XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0ludGVncmFsTnVtYmVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlcicpO1xuXG4vLyBgTnVtYmVyLmlzSW50ZWdlcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXJcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNJbnRlZ2VyOiBpc0ludGVncmFsTnVtYmVyXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtYXNzaWduJyk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBhcml0eTogMiwgZm9yY2VkOiBPYmplY3QuYXNzaWduICE9PSBhc3NpZ24gfSwge1xuICBhc3NpZ246IGFzc2lnblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBjcmVhdGU6IGNyZWF0ZVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAhPT0gZGVmaW5lUHJvcGVydHksIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIGRlZmluZVByb3BlcnR5OiBkZWZpbmVQcm9wZXJ0eVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZW50cmllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXknKS5lbnRyaWVzO1xuXG4vLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZW50cmllc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKE8pIHtcbiAgICByZXR1cm4gJGVudHJpZXMoTyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgRlJFRVpJTkcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnJlZXppbmcnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG9uRnJlZXplID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJykub25GcmVlemU7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZnJlZXplIC0tIHNhZmVcbnZhciAkZnJlZXplID0gT2JqZWN0LmZyZWV6ZTtcbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyAkZnJlZXplKDEpOyB9KTtcblxuLy8gYE9iamVjdC5mcmVlemVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZnJlZXplXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTLCBzaGFtOiAhRlJFRVpJTkcgfSwge1xuICBmcmVlemU6IGZ1bmN0aW9uIGZyZWV6ZShpdCkge1xuICAgIHJldHVybiAkZnJlZXplICYmIGlzT2JqZWN0KGl0KSA/ICRmcmVlemUob25GcmVlemUoaXQpKSA6IGl0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBGT1JDRUQgPSAhREVTQ1JJUFRPUlMgfHwgZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodG9JbmRleGVkT2JqZWN0KGl0KSwga2V5KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG5cbi8vIFY4IH4gQ2hyb21lIDM4IGFuZCAzOSBgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc2AgZmFpbHMgb24gcHJpbWl0aXZlc1xuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzQ0M1xudmFyIEZPUkNFRCA9ICFOQVRJVkVfU1lNQk9MIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHsgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmYoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eXN5bWJvbHNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIGdldE93blByb3BlcnR5U3ltYm9sczogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gICAgdmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5U3ltYm9scyA/ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHModG9PYmplY3QoaXQpKSA6IFtdO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbmF0aXZlR2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVHZXRQcm90b3R5cGVPZigxKTsgfSk7XG5cbi8vIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2ZcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMsIHNoYW06ICFDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgfSwge1xuICBnZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YoaXQpIHtcbiAgICByZXR1cm4gbmF0aXZlR2V0UHJvdG90eXBlT2YodG9PYmplY3QoaXQpKTtcbiAgfVxufSk7XG5cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIG5hdGl2ZUtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlS2V5cygxKTsgfSk7XG5cbi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5rZXlzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTIH0sIHtcbiAga2V5czogZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKHRvT2JqZWN0KGl0KSk7XG4gIH1cbn0pO1xuIiwiLy8gZW1wdHlcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRwYXJzZUludCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50Jyk7XG5cbi8vIGBwYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXBhcnNlaW50LXN0cmluZy1yYWRpeFxuJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBwYXJzZUludCAhPT0gJHBhcnNlSW50IH0sIHtcbiAgcGFyc2VJbnQ6ICRwYXJzZUludFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbicpO1xuXG4vLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxzZXR0bGVkXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICBhbGxTZXR0bGVkOiBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwocHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVycm9yIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1zdGF0aWNzLWluY29ycmVjdC1pdGVyYXRpb24nKTtcblxuLy8gYFByb21pc2UuYWxsYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKCRwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1zdGF0aWNzLWluY29ycmVjdC1pdGVyYXRpb24nKTtcblxudmFyIFBST01JU0VfQU5ZX0VSUk9SID0gJ05vIG9uZSBwcm9taXNlIHJlc29sdmVkJztcblxuLy8gYFByb21pc2UuYW55YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbnlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGFueTogZnVuY3Rpb24gYW55KGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBBZ2dyZWdhdGVFcnJvciA9IGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJyk7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgdmFyIGFscmVhZHlSZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeVJlamVjdGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5UmVqZWN0ZWQgfHwgYWxyZWFkeVJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlSZWplY3RlZCB8fCBhbHJlYWR5UmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5UmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGVycm9yc1tpbmRleF0gPSBlcnJvcjtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZWplY3QobmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKS5DT05TVFJVQ1RPUjtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3InKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xuXG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiwgcmVhbDogdHJ1ZSB9LCB7XG4gICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjY2F0Y2hgIHByb3Blcmx5IHdvcmtzIHdpdGggcGF0Y2hlZCBgUHJvbWlzZSN0aGVuYFxuaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKSkge1xuICB2YXIgbWV0aG9kID0gZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnY2F0Y2gnXTtcbiAgaWYgKE5hdGl2ZVByb21pc2VQcm90b3R5cGVbJ2NhdGNoJ10gIT09IG1ldGhvZCkge1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ2NhdGNoJywgbWV0aG9kLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1ub2RlJyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21pY3JvdGFzaycpO1xudmFyIGhvc3RSZXBvcnRFcnJvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzJyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgUXVldWUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcXVldWUnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yJyk7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IFByb21pc2VDb25zdHJ1Y3RvckRldGVjdGlvbi5DT05TVFJVQ1RPUjtcbnZhciBOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQgPSBQcm9taXNlQ29uc3RydWN0b3JEZXRlY3Rpb24uUkVKRUNUSU9OX0VWRU5UO1xudmFyIE5BVElWRV9QUk9NSVNFX1NVQkNMQVNTSU5HID0gUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uLlNVQkNMQVNTSU5HO1xudmFyIGdldEludGVybmFsUHJvbWlzZVN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoUFJPTUlTRSk7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIE5hdGl2ZVByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgJiYgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3I7XG52YXIgUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VQcm90b3R5cGU7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsVGhpcy5UeXBlRXJyb3I7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xudmFyIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5O1xuXG52YXIgRElTUEFUQ0hfRVZFTlQgPSAhIShkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFdmVudCAmJiBnbG9iYWxUaGlzLmRpc3BhdGNoRXZlbnQpO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xuXG52YXIgSW50ZXJuYWwsIE93blByb21pc2VDYXBhYmlsaXR5LCBQcm9taXNlV3JhcHBlciwgbmF0aXZlVGhlbjtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgaXNDYWxsYWJsZSh0aGVuID0gaXQudGhlbikgPyB0aGVuIDogZmFsc2U7XG59O1xuXG52YXIgY2FsbFJlYWN0aW9uID0gZnVuY3Rpb24gKHJlYWN0aW9uLCBzdGF0ZSkge1xuICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT09IEZVTEZJTExFRDtcbiAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gIHRyeSB7XG4gICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgaWYgKHN0YXRlLnJlamVjdGlvbiA9PT0gVU5IQU5ETEVEKSBvbkhhbmRsZVVuaGFuZGxlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICB9XG4gICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBjYW4gdGhyb3dcbiAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICBjYWxsKHRoZW4sIHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgIHJlamVjdChlcnJvcik7XG4gIH1cbn07XG5cbnZhciBub3RpZnkgPSBmdW5jdGlvbiAoc3RhdGUsIGlzUmVqZWN0KSB7XG4gIGlmIChzdGF0ZS5ub3RpZmllZCkgcmV0dXJuO1xuICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlYWN0aW9ucyA9IHN0YXRlLnJlYWN0aW9ucztcbiAgICB2YXIgcmVhY3Rpb247XG4gICAgd2hpbGUgKHJlYWN0aW9uID0gcmVhY3Rpb25zLmdldCgpKSB7XG4gICAgICBjYWxsUmVhY3Rpb24ocmVhY3Rpb24sIHN0YXRlKTtcbiAgICB9XG4gICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXN0YXRlLnJlamVjdGlvbikgb25VbmhhbmRsZWQoc3RhdGUpO1xuICB9KTtcbn07XG5cbnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikge1xuICB2YXIgZXZlbnQsIGhhbmRsZXI7XG4gIGlmIChESVNQQVRDSF9FVkVOVCkge1xuICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZXZlbnQucmVhc29uID0gcmVhc29uO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgZ2xvYmFsVGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfSBlbHNlIGV2ZW50ID0geyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHJlYXNvbiB9O1xuICBpZiAoIU5BVElWRV9QUk9NSVNFX1JFSkVDVElPTl9FVkVOVCAmJiAoaGFuZGxlciA9IGdsb2JhbFRoaXNbJ29uJyArIG5hbWVdKSkgaGFuZGxlcihldmVudCk7XG4gIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7XG59O1xuXG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY2FsbCh0YXNrLCBnbG9iYWxUaGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBzdGF0ZS5yZWplY3Rpb24gPSBJU19OT0RFIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY2FsbCh0YXNrLCBnbG9iYWxUaGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgaWYgKElTX05PREUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFJFSkVDVElPTl9IQU5ETEVELCBwcm9taXNlLCBzdGF0ZS52YWx1ZSk7XG4gIH0pO1xufTtcblxudmFyIGJpbmQgPSBmdW5jdGlvbiAoZm4sIHN0YXRlLCB1bndyYXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGZuKHN0YXRlLCB2YWx1ZSwgdW53cmFwKTtcbiAgfTtcbn07XG5cbnZhciBpbnRlcm5hbFJlamVjdCA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7XG4gIG5vdGlmeShzdGF0ZSwgdHJ1ZSk7XG59O1xuXG52YXIgaW50ZXJuYWxSZXNvbHZlID0gZnVuY3Rpb24gKHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7XG4gIGlmIChzdGF0ZS5kb25lKSByZXR1cm47XG4gIHN0YXRlLmRvbmUgPSB0cnVlO1xuICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhdGUuZmFjYWRlID09PSB2YWx1ZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGwodGhlbiwgdmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdCh3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUikge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICBhQ2FsbGFibGUoZXhlY3V0b3IpO1xuICAgIGNhbGwoSW50ZXJuYWwsIHRoaXMpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBQcm9taXNlUHJvdG90eXBlID0gUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIHR5cGU6IFBST01JU0UsXG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkOiBmYWxzZSxcbiAgICAgIHBhcmVudDogZmFsc2UsXG4gICAgICByZWFjdGlvbnM6IG5ldyBRdWV1ZSgpLFxuICAgICAgcmVqZWN0aW9uOiBmYWxzZSxcbiAgICAgIHN0YXRlOiBQRU5ESU5HLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuXG4gIEludGVybmFsLnByb3RvdHlwZSA9IGRlZmluZUJ1aWx0SW4oUHJvbWlzZVByb3RvdHlwZSwgJ3RoZW4nLCBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvcikpO1xuICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgcmVhY3Rpb24ub2sgPSBpc0NhbGxhYmxlKG9uRnVsZmlsbGVkKSA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICByZWFjdGlvbi5mYWlsID0gaXNDYWxsYWJsZShvblJlamVjdGVkKSAmJiBvblJlamVjdGVkO1xuICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdGUuc3RhdGUgPT09IFBFTkRJTkcpIHN0YXRlLnJlYWN0aW9ucy5hZGQocmVhY3Rpb24pO1xuICAgIGVsc2UgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxSZWFjdGlvbihyZWFjdGlvbiwgc3RhdGUpO1xuICAgIH0pO1xuICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICB9KTtcblxuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHByb21pc2UpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gYmluZChpbnRlcm5hbFJlc29sdmUsIHN0YXRlKTtcbiAgICB0aGlzLnJlamVjdCA9IGJpbmQoaW50ZXJuYWxSZWplY3QsIHN0YXRlKTtcbiAgfTtcblxuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSBQcm9taXNlQ29uc3RydWN0b3IgfHwgQyA9PT0gUHJvbWlzZVdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcblxuICBpZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IpICYmIE5hdGl2ZVByb21pc2VQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBuYXRpdmVUaGVuID0gTmF0aXZlUHJvbWlzZVByb3RvdHlwZS50aGVuO1xuXG4gICAgaWYgKCFOQVRJVkVfUFJPTUlTRV9TVUJDTEFTU0lORykge1xuICAgICAgLy8gbWFrZSBgUHJvbWlzZSN0aGVuYCByZXR1cm4gYSBwb2x5ZmlsbGVkIGBQcm9taXNlYCBmb3IgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJc1xuICAgICAgZGVmaW5lQnVpbHRJbihOYXRpdmVQcm9taXNlUHJvdG90eXBlLCAndGhlbicsIGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VDb25zdHJ1Y3RvcihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgY2FsbChuYXRpdmVUaGVuLCB0aGF0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NDBcbiAgICAgIH0sIHsgdW5zYWZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIG1ha2UgYC5jb25zdHJ1Y3RvciA9PT0gUHJvbWlzZWAgd29yayBmb3IgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJc1xuICAgIHRyeSB7XG4gICAgICBkZWxldGUgTmF0aXZlUHJvbWlzZVByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcbiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbiAgICAvLyBtYWtlIGBpbnN0YW5jZW9mIFByb21pc2VgIHdvcmsgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIHNldFByb3RvdHlwZU9mKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsIFByb21pc2VQcm90b3R5cGUpO1xuICAgIH1cbiAgfVxufVxuXG4kKHsgZ2xvYmFsOiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiB9LCB7XG4gIFByb21pc2U6IFByb21pc2VDb25zdHJ1Y3RvclxufSk7XG5cbnNldFRvU3RyaW5nVGFnKFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSwgZmFsc2UsIHRydWUpO1xuc2V0U3BlY2llcyhQUk9NSVNFKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvcicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xuXG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4vLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjlcbnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tdGhlbmFibGUgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogTk9OX0dFTkVSSUMgfSwge1xuICAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gaXNDYWxsYWJsZShvbkZpbmFsbHkpO1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseSxcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHlcbiAgICApO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjZmluYWxseWAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG5pZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IpKSB7XG4gIHZhciBtZXRob2QgPSBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J107XG4gIGlmIChOYXRpdmVQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10gIT09IG1ldGhvZCkge1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ2ZpbmFsbHknLCBtZXRob2QsIHsgdW5zYWZlOiB0cnVlIH0pO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHNwbGl0IHRvIG1vZHVsZXMgbGlzdGVkIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZS5hbGwnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZS5jYXRjaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5wcm9taXNlLnJhY2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZS5yZWplY3QnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZS5yZXNvbHZlJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbicpO1xuXG4vLyBgUHJvbWlzZS5yYWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yYWNlXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgY2FsbCgkcHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKS5DT05TVFJVQ1RPUjtcblxuLy8gYFByb21pc2UucmVqZWN0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZWplY3RcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiB9LCB7XG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYodGhpcyk7XG4gICAgdmFyIGNhcGFiaWxpdHlSZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICBjYXBhYmlsaXR5UmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3InKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpLkNPTlNUUlVDVE9SO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZScpO1xuXG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yV3JhcHBlciA9IGdldEJ1aWx0SW4oJ1Byb21pc2UnKTtcbnZhciBDSEVDS19XUkFQUEVSID0gSVNfUFVSRSAmJiAhRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1I7XG5cbi8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIH0sIHtcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKENIRUNLX1dSQVBQRVIgJiYgdGhpcyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yV3JhcHBlciA/IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxuLy8gYFByb21pc2Uud2l0aFJlc29sdmVyc2AgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLXdpdGgtcmVzb2x2ZXJzXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICB3aXRoUmVzb2x2ZXJzOiBmdW5jdGlvbiB3aXRoUmVzb2x2ZXJzKCkge1xuICAgIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYodGhpcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb21pc2U6IHByb21pc2VDYXBhYmlsaXR5LnByb21pc2UsXG4gICAgICByZXNvbHZlOiBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlLFxuICAgICAgcmVqZWN0OiBwcm9taXNlQ2FwYWJpbGl0eS5yZWplY3RcbiAgICB9O1xuICB9XG59KTtcbiIsIi8vIGVtcHR5XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY29sbGVjdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uJyk7XG52YXIgY29sbGVjdGlvblN0cm9uZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZycpO1xuXG4vLyBgU2V0YCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQtb2JqZWN0c1xuY29sbGVjdGlvbignU2V0JywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFNldCgpIHsgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCBjb2xsZWN0aW9uU3Ryb25nKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGRpZmZlcmVuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWRpZmZlcmVuY2UnKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmRpZmZlcmVuY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgnZGlmZmVyZW5jZScpIH0sIHtcbiAgZGlmZmVyZW5jZTogZGlmZmVyZW5jZVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGludGVyc2VjdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaW50ZXJzZWN0aW9uJyk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtbWV0aG9kLWFjY2VwdC1zZXQtbGlrZScpO1xuXG52YXIgSU5DT1JSRUNUID0gIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ2ludGVyc2VjdGlvbicpIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20sIGVzL25vLXNldCAtLSB0ZXN0aW5nXG4gIHJldHVybiBTdHJpbmcoQXJyYXkuZnJvbShuZXcgU2V0KFsxLCAyLCAzXSkuaW50ZXJzZWN0aW9uKG5ldyBTZXQoWzMsIDJdKSkpKSAhPT0gJzMsMic7XG59KTtcblxuLy8gYFNldC5wcm90b3R5cGUuaW50ZXJzZWN0aW9uYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUIH0sIHtcbiAgaW50ZXJzZWN0aW9uOiBpbnRlcnNlY3Rpb25cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNEaXNqb2ludEZyb20gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWlzLWRpc2pvaW50LWZyb20nKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmlzRGlzam9pbnRGcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ2lzRGlzam9pbnRGcm9tJykgfSwge1xuICBpc0Rpc2pvaW50RnJvbTogaXNEaXNqb2ludEZyb21cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNTdWJzZXRPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaXMtc3Vic2V0LW9mJyk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtbWV0aG9kLWFjY2VwdC1zZXQtbGlrZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pc1N1YnNldE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ2lzU3Vic2V0T2YnKSB9LCB7XG4gIGlzU3Vic2V0T2Y6IGlzU3Vic2V0T2Zcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNTdXBlcnNldE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pcy1zdXBlcnNldC1vZicpO1xudmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LW1ldGhvZC1hY2NlcHQtc2V0LWxpa2UnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuaXNTdXBlcnNldE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ2lzU3VwZXJzZXRPZicpIH0sIHtcbiAgaXNTdXBlcnNldE9mOiBpc1N1cGVyc2V0T2Zcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbW9kdWxlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyByZXBsYWNlZCB0byBtb2R1bGUgYmVsb3dcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc2V0LmNvbnN0cnVjdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBzeW1tZXRyaWNEaWZmZXJlbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zeW1tZXRyaWMtZGlmZmVyZW5jZScpO1xudmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LW1ldGhvZC1hY2NlcHQtc2V0LWxpa2UnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuc3ltbWV0cmljRGlmZmVyZW5jZWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdzeW1tZXRyaWNEaWZmZXJlbmNlJykgfSwge1xuICBzeW1tZXRyaWNEaWZmZXJlbmNlOiBzeW1tZXRyaWNEaWZmZXJlbmNlXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHVuaW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC11bmlvbicpO1xudmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LW1ldGhvZC1hY2NlcHQtc2V0LWxpa2UnKTtcblxuLy8gYFNldC5wcm90b3R5cGUudW5pb25gIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgndW5pb24nKSB9LCB7XG4gIHVuaW9uOiB1bmlvblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBub3RBUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcblxudmFyIHN0cmluZ0luZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIWNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdpbmNsdWRlcycpIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX5zdHJpbmdJbmRleE9mKFxuICAgICAgdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSksXG4gICAgICB0b1N0cmluZyhub3RBUmVnRXhwKHNlYXJjaFN0cmluZykpLFxuICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjaGFyQXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZScpLmNoYXJBdDtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lJyk7XG52YXIgY3JlYXRlSXRlclJlc3VsdE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlci1yZXN1bHQtb2JqZWN0Jyk7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5kZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogU1RSSU5HX0lURVJBVE9SLFxuICAgIHN0cmluZzogdG9TdHJpbmcoaXRlcmF0ZWQpLFxuICAgIGluZGV4OiAwXG4gIH0pO1xuLy8gYCVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpO1xuICBzdGF0ZS5pbmRleCArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHBvaW50LCBmYWxzZSk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgbm90QVJlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ub3QtYS1yZWdleHAnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxudmFyIENPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDID0gY29ycmVjdElzUmVnRXhwTG9naWMoJ3N0YXJ0c1dpdGgnKTtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL3B1bGwvNzAyXG52YXIgTUROX1BPTFlGSUxMX0JVRyA9ICFJU19QVVJFICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyAmJiAhIWZ1bmN0aW9uICgpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nLnByb3RvdHlwZSwgJ3N0YXJ0c1dpdGgnKTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGU7XG59KCk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnN0YXJ0c3dpdGhcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgfSwge1xuICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHZhciB0aGF0ID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgbm90QVJlZ0V4cChzZWFyY2hTdHJpbmcpO1xuICAgIHZhciBpbmRleCA9IHRvTGVuZ3RoKG1pbihhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdGhhdC5sZW5ndGgpKTtcbiAgICB2YXIgc2VhcmNoID0gdG9TdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gc3RyaW5nU2xpY2UodGhhdCwgaW5kZXgsIGluZGV4ICsgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLmFzeW5jSXRlcmF0b3JgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5hc3luY2l0ZXJhdG9yXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2FzeW5jSXRlcmF0b3InKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xudmFyICR0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBuYXRpdmVPYmplY3RDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLXdyYXBwZWQnKTtcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG52YXIgZGVmaW5lU3ltYm9sVG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWRlZmluZS10by1wcmltaXRpdmUnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciAkZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5mb3JFYWNoO1xuXG52YXIgSElEREVOID0gc2hhcmVkS2V5KCdoaWRkZW4nKTtcbnZhciBTWU1CT0wgPSAnU3ltYm9sJztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU1lNQk9MKTtcblxudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdFtQUk9UT1RZUEVdO1xudmFyICRTeW1ib2wgPSBnbG9iYWxUaGlzLlN5bWJvbDtcbnZhciBTeW1ib2xQcm90b3R5cGUgPSAkU3ltYm9sICYmICRTeW1ib2xbUFJPVE9UWVBFXTtcbnZhciBSYW5nZUVycm9yID0gZ2xvYmFsVGhpcy5SYW5nZUVycm9yO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbFRoaXMuVHlwZUVycm9yO1xudmFyIFFPYmplY3QgPSBnbG9iYWxUaGlzLlFPYmplY3Q7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWwuZjtcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmY7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG52YXIgQWxsU3ltYm9scyA9IHNoYXJlZCgnc3ltYm9scycpO1xudmFyIE9iamVjdFByb3RvdHlwZVN5bWJvbHMgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKTtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xuXG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbnZhciBVU0VfU0VUVEVSID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgZmFsbGJhY2tEZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIHZhciBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yID0gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgUCk7XG4gIGlmIChPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKSBkZWxldGUgT2JqZWN0UHJvdG90eXBlW1BdO1xuICBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgaWYgKE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgJiYgTyAhPT0gT2JqZWN0UHJvdG90eXBlKSB7XG4gICAgbmF0aXZlRGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlLCBQLCBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKTtcbiAgfVxufTtcblxudmFyIHNldFN5bWJvbERlc2NyaXB0b3IgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RDcmVhdGUobmF0aXZlRGVmaW5lUHJvcGVydHkoe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkodGhpcywgJ2EnLCB7IHZhbHVlOiA3IH0pLmE7IH1cbiAgfSkpLmEgIT09IDc7XG59KSA/IGZhbGxiYWNrRGVmaW5lUHJvcGVydHkgOiBuYXRpdmVEZWZpbmVQcm9wZXJ0eTtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnLCBkZXNjcmlwdGlvbikge1xuICB2YXIgc3ltYm9sID0gQWxsU3ltYm9sc1t0YWddID0gbmF0aXZlT2JqZWN0Q3JlYXRlKFN5bWJvbFByb3RvdHlwZSk7XG4gIHNldEludGVybmFsU3RhdGUoc3ltYm9sLCB7XG4gICAgdHlwZTogU1lNQk9MLFxuICAgIHRhZzogdGFnLFxuICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvblxuICB9KTtcbiAgaWYgKCFERVNDUklQVE9SUykgc3ltYm9sLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gIHJldHVybiBzeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBpZiAoTyA9PT0gT2JqZWN0UHJvdG90eXBlKSAkZGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCwgQXR0cmlidXRlcyk7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5ID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChoYXNPd24oQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghQXR0cmlidXRlcy5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhc093bihPLCBISURERU4pKSBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBISURERU4sIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBuYXRpdmVPYmplY3RDcmVhdGUobnVsbCkpKTtcbiAgICAgIE9bSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhc093bihPLCBISURERU4pICYmIE9bSElEREVOXVtrZXldKSBPW0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgQXR0cmlidXRlcyA9IG5hdGl2ZU9iamVjdENyZWF0ZShBdHRyaWJ1dGVzLCB7IGVudW1lcmFibGU6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCBmYWxzZSkgfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzY3JpcHRvcihPLCBrZXksIEF0dHJpYnV0ZXMpO1xuICB9IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBrZXksIEF0dHJpYnV0ZXMpO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIgcHJvcGVydGllcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKHByb3BlcnRpZXMpLmNvbmNhdCgkZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByb3BlcnRpZXMpKTtcbiAgJGZvckVhY2goa2V5cywgZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICghREVTQ1JJUFRPUlMgfHwgY2FsbCgkcHJvcGVydHlJc0VudW1lcmFibGUsIHByb3BlcnRpZXMsIGtleSkpICRkZWZpbmVQcm9wZXJ0eShPLCBrZXksIHByb3BlcnRpZXNba2V5XSk7XG4gIH0pO1xuICByZXR1cm4gTztcbn07XG5cbnZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IG5hdGl2ZU9iamVjdENyZWF0ZShPKSA6ICRkZWZpbmVQcm9wZXJ0aWVzKG5hdGl2ZU9iamVjdENyZWF0ZShPKSwgUHJvcGVydGllcyk7XG59O1xuXG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgUCA9IHRvUHJvcGVydHlLZXkoVik7XG4gIHZhciBlbnVtZXJhYmxlID0gY2FsbChuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSwgdGhpcywgUCk7XG4gIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzT3duKEFsbFN5bWJvbHMsIFApICYmICFoYXNPd24oT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVudW1lcmFibGUgfHwgIWhhc093bih0aGlzLCBQKSB8fCAhaGFzT3duKEFsbFN5bWJvbHMsIFApIHx8IGhhc093bih0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtQXVxuICAgID8gZW51bWVyYWJsZSA6IHRydWU7XG59O1xuXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIHZhciBpdCA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgdmFyIGtleSA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG90eXBlICYmIGhhc093bihBbGxTeW1ib2xzLCBrZXkpICYmICFoYXNPd24oT2JqZWN0UHJvdG90eXBlU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgZGVzY3JpcHRvciA9IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KTtcbiAgaWYgKGRlc2NyaXB0b3IgJiYgaGFzT3duKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXNPd24oaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkge1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGRlc2NyaXB0b3I7XG59O1xuXG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgdmFyIG5hbWVzID0gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoTykpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFoYXNPd24oQWxsU3ltYm9scywga2V5KSAmJiAhaGFzT3duKGhpZGRlbktleXMsIGtleSkpIHB1c2gocmVzdWx0LCBrZXkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gKE8pIHtcbiAgdmFyIElTX09CSkVDVF9QUk9UT1RZUEUgPSBPID09PSBPYmplY3RQcm90b3R5cGU7XG4gIHZhciBuYW1lcyA9IG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMoSVNfT0JKRUNUX1BST1RPVFlQRSA/IE9iamVjdFByb3RvdHlwZVN5bWJvbHMgOiB0b0luZGV4ZWRPYmplY3QoTykpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKGhhc093bihBbGxTeW1ib2xzLCBrZXkpICYmICghSVNfT0JKRUNUX1BST1RPVFlQRSB8fCBoYXNPd24oT2JqZWN0UHJvdG90eXBlLCBrZXkpKSkge1xuICAgICAgcHVzaChyZXN1bHQsIEFsbFN5bWJvbHNba2V5XSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIGBTeW1ib2xgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC1jb25zdHJ1Y3RvclxuaWYgKCFOQVRJVkVfU1lNQk9MKSB7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgaWYgKGlzUHJvdG90eXBlT2YoU3ltYm9sUHJvdG90eXBlLCB0aGlzKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gIWFyZ3VtZW50cy5sZW5ndGggfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAkdG9TdHJpbmcoYXJndW1lbnRzWzBdKTtcbiAgICB2YXIgdGFnID0gdWlkKGRlc2NyaXB0aW9uKTtcbiAgICB2YXIgc2V0dGVyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB2YXIgJHRoaXMgPSB0aGlzID09PSB1bmRlZmluZWQgPyBnbG9iYWxUaGlzIDogdGhpcztcbiAgICAgIGlmICgkdGhpcyA9PT0gT2JqZWN0UHJvdG90eXBlKSBjYWxsKHNldHRlciwgT2JqZWN0UHJvdG90eXBlU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKGhhc093bigkdGhpcywgSElEREVOKSAmJiBoYXNPd24oJHRoaXNbSElEREVOXSwgdGFnKSkgJHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB2YWx1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRTeW1ib2xEZXNjcmlwdG9yKCR0aGlzLCB0YWcsIGRlc2NyaXB0b3IpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICAgIGZhbGxiYWNrRGVmaW5lUHJvcGVydHkoJHRoaXMsIHRhZywgZGVzY3JpcHRvcik7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoREVTQ1JJUFRPUlMgJiYgVVNFX1NFVFRFUikgc2V0U3ltYm9sRGVzY3JpcHRvcihPYmplY3RQcm90b3R5cGUsIHRhZywgeyBjb25maWd1cmFibGU6IHRydWUsIHNldDogc2V0dGVyIH0pO1xuICAgIHJldHVybiB3cmFwKHRhZywgZGVzY3JpcHRpb24pO1xuICB9O1xuXG4gIFN5bWJvbFByb3RvdHlwZSA9ICRTeW1ib2xbUFJPVE9UWVBFXTtcblxuICBkZWZpbmVCdWlsdEluKFN5bWJvbFByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykudGFnO1xuICB9KTtcblxuICBkZWZpbmVCdWlsdEluKCRTeW1ib2wsICd3aXRob3V0U2V0dGVyJywgZnVuY3Rpb24gKGRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIHdyYXAodWlkKGRlc2NyaXB0aW9uKSwgZGVzY3JpcHRpb24pO1xuICB9KTtcblxuICBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mID0gJGRlZmluZVByb3BlcnR5O1xuICBkZWZpbmVQcm9wZXJ0aWVzTW9kdWxlLmYgPSAkZGVmaW5lUHJvcGVydGllcztcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWwuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbiAgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gd3JhcCh3ZWxsS25vd25TeW1ib2wobmFtZSksIG5hbWUpO1xuICB9O1xuXG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLVN5bWJvbC1kZXNjcmlwdGlvblxuICAgIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihTeW1ib2xQcm90b3R5cGUsICdkZXNjcmlwdGlvbicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLmRlc2NyaXB0aW9uO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghSVNfUFVSRSkge1xuICAgICAgZGVmaW5lQnVpbHRJbihPYmplY3RQcm90b3R5cGUsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgeyB1bnNhZmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG5cbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MLCBzaGFtOiAhTkFUSVZFX1NZTUJPTCB9LCB7XG4gIFN5bWJvbDogJFN5bWJvbFxufSk7XG5cbiRmb3JFYWNoKG9iamVjdEtleXMoV2VsbEtub3duU3ltYm9sc1N0b3JlKSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgZGVmaW5lV2VsbEtub3duU3ltYm9sKG5hbWUpO1xufSk7XG5cbiQoeyB0YXJnZXQ6IFNZTUJPTCwgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCB9LCB7XG4gIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeyBVU0VfU0VUVEVSID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IFVTRV9TRVRURVIgPSBmYWxzZTsgfVxufSk7XG5cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICAvLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyBgT2JqZWN0LmRlZmluZVByb3BlcnRpZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvcnNcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yXG59KTtcblxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wgfSwge1xuICAvLyBgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzXG59KTtcblxuLy8gYFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wucHJvdG90eXBlLUBAdG9wcmltaXRpdmVcbmRlZmluZVN5bWJvbFRvUHJpbWl0aXZlKCk7XG5cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddYCBwcm9wZXJ0eVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wucHJvdG90eXBlLUBAdG9zdHJpbmd0YWdcbnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsIFNZTUJPTCk7XG5cbmhpZGRlbktleXNbSElEREVOXSA9IHRydWU7XG4iLCIvLyBlbXB0eVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MX1JFR0lTVFJZID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1yZWdpc3RyeS1kZXRlY3Rpb24nKTtcblxudmFyIFN0cmluZ1RvU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N0cmluZy10by1zeW1ib2wtcmVnaXN0cnknKTtcbnZhciBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5Jyk7XG5cbi8vIGBTeW1ib2wuZm9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLmZvclxuJCh7IHRhcmdldDogJ1N5bWJvbCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0xfUkVHSVNUUlkgfSwge1xuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBzdHJpbmcgPSB0b1N0cmluZyhrZXkpO1xuICAgIGlmIChoYXNPd24oU3RyaW5nVG9TeW1ib2xSZWdpc3RyeSwgc3RyaW5nKSkgcmV0dXJuIFN0cmluZ1RvU3ltYm9sUmVnaXN0cnlbc3RyaW5nXTtcbiAgICB2YXIgc3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJykoc3RyaW5nKTtcbiAgICBTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5W3N0cmluZ10gPSBzeW1ib2w7XG4gICAgU3ltYm9sVG9TdHJpbmdSZWdpc3RyeVtzeW1ib2xdID0gc3RyaW5nO1xuICAgIHJldHVybiBzeW1ib2w7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5oYXNJbnN0YW5jZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLmhhc2luc3RhbmNlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2hhc0luc3RhbmNlJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLmlzY29uY2F0c3ByZWFkYWJsZVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdpc0NvbmNhdFNwcmVhZGFibGUnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuaXRlcmF0b3JgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5pdGVyYXRvclxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbW9kdWxlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyBzcGxpdCB0byBtb2R1bGVzIGxpc3RlZCBiZWxvd1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zeW1ib2wuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3ltYm9sLmZvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zeW1ib2wua2V5LWZvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgTkFUSVZFX1NZTUJPTF9SRUdJU1RSWSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtcmVnaXN0cnktZGV0ZWN0aW9uJyk7XG5cbnZhciBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5Jyk7XG5cbi8vIGBTeW1ib2wua2V5Rm9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLmtleWZvclxuJCh7IHRhcmdldDogJ1N5bWJvbCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0xfUkVHSVNUUlkgfSwge1xuICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihzeW0pIHtcbiAgICBpZiAoIWlzU3ltYm9sKHN5bSkpIHRocm93IG5ldyBUeXBlRXJyb3IodHJ5VG9TdHJpbmcoc3ltKSArICcgaXMgbm90IGEgc3ltYm9sJyk7XG4gICAgaWYgKGhhc093bihTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5LCBzeW0pKSByZXR1cm4gU3ltYm9sVG9TdHJpbmdSZWdpc3RyeVtzeW1dO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wubWF0Y2hBbGxgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5tYXRjaGFsbFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtYXRjaEFsbCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5tYXRjaGAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLm1hdGNoXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLnJlcGxhY2VgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5yZXBsYWNlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuc2VhcmNoYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuc2VhcmNoXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3NlYXJjaCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5zcGVjaWVzYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuc3BlY2llc1xuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLnNwbGl0YCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuc3BsaXRcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnc3BsaXQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG52YXIgZGVmaW5lU3ltYm9sVG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWRlZmluZS10by1wcmltaXRpdmUnKTtcblxuLy8gYFN5bWJvbC50b1ByaW1pdGl2ZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnRvcHJpbWl0aXZlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvcHJpbWl0aXZlXG5kZWZpbmVTeW1ib2xUb1ByaW1pdGl2ZSgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG5cbi8vIGBTeW1ib2wudG9TdHJpbmdUYWdgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC50b3N0cmluZ3RhZ1xuZGVmaW5lV2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG4vLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXWAgcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnXG5zZXRUb1N0cmluZ1RhZyhnZXRCdWlsdEluKCdTeW1ib2wnKSwgJ1N5bWJvbCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC51bnNjb3BhYmxlc2Agd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnVuc2NvcGFibGVzXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgRlJFRVpJTkcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnJlZXppbmcnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucycpO1xudmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKTtcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uV2VhayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpLmVuZm9yY2U7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2Vhay1tYXAtYmFzaWMtZGV0ZWN0aW9uJyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWlzYXJyYXkgLS0gc2FmZVxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyIGlzRXh0ZW5zaWJsZSA9ICRPYmplY3QuaXNFeHRlbnNpYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2Zyb3plbiAtLSBzYWZlXG52YXIgaXNGcm96ZW4gPSAkT2JqZWN0LmlzRnJvemVuO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc3NlYWxlZCAtLSBzYWZlXG52YXIgaXNTZWFsZWQgPSAkT2JqZWN0LmlzU2VhbGVkO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1mcmVlemUgLS0gc2FmZVxudmFyIGZyZWV6ZSA9ICRPYmplY3QuZnJlZXplO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZWFsIC0tIHNhZmVcbnZhciBzZWFsID0gJE9iamVjdC5zZWFsO1xuXG52YXIgSVNfSUUxMSA9ICFnbG9iYWxUaGlzLkFjdGl2ZVhPYmplY3QgJiYgJ0FjdGl2ZVhPYmplY3QnIGluIGdsb2JhbFRoaXM7XG52YXIgSW50ZXJuYWxXZWFrTWFwO1xuXG52YXIgd3JhcHBlciA9IGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICB9O1xufTtcblxuLy8gYFdlYWtNYXBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWttYXAtY29uc3RydWN0b3JcbnZhciAkV2Vha01hcCA9IGNvbGxlY3Rpb24oJ1dlYWtNYXAnLCB3cmFwcGVyLCBjb2xsZWN0aW9uV2Vhayk7XG52YXIgV2Vha01hcFByb3RvdHlwZSA9ICRXZWFrTWFwLnByb3RvdHlwZTtcbnZhciBuYXRpdmVTZXQgPSB1bmN1cnJ5VGhpcyhXZWFrTWFwUHJvdG90eXBlLnNldCk7XG5cbi8vIENoYWtyYSBFZGdlIGJ1ZzogYWRkaW5nIGZyb3plbiBhcnJheXMgdG8gV2Vha01hcCB1bmZyZWV6ZSB0aGVtXG52YXIgaGFzTVNFZGdlRnJlZXppbmdCdWcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBGUkVFWklORyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZyb3plbkFycmF5ID0gZnJlZXplKFtdKTtcbiAgICBuYXRpdmVTZXQobmV3ICRXZWFrTWFwKCksIGZyb3plbkFycmF5LCAxKTtcbiAgICByZXR1cm4gIWlzRnJvemVuKGZyb3plbkFycmF5KTtcbiAgfSk7XG59O1xuXG4vLyBJRTExIFdlYWtNYXAgZnJvemVuIGtleXMgZml4XG4vLyBXZSBjYW4ndCB1c2UgZmVhdHVyZSBkZXRlY3Rpb24gYmVjYXVzZSBpdCBjcmFzaCBzb21lIG9sZCBJRSBidWlsZHNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80ODVcbmlmIChOQVRJVkVfV0VBS19NQVApIGlmIChJU19JRTExKSB7XG4gIEludGVybmFsV2Vha01hcCA9IGNvbGxlY3Rpb25XZWFrLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsICdXZWFrTWFwJywgdHJ1ZSk7XG4gIEludGVybmFsTWV0YWRhdGFNb2R1bGUuZW5hYmxlKCk7XG4gIHZhciBuYXRpdmVEZWxldGUgPSB1bmN1cnJ5VGhpcyhXZWFrTWFwUHJvdG90eXBlWydkZWxldGUnXSk7XG4gIHZhciBuYXRpdmVIYXMgPSB1bmN1cnJ5VGhpcyhXZWFrTWFwUHJvdG90eXBlLmhhcyk7XG4gIHZhciBuYXRpdmVHZXQgPSB1bmN1cnJ5VGhpcyhXZWFrTWFwUHJvdG90eXBlLmdldCk7XG4gIGRlZmluZUJ1aWx0SW5zKFdlYWtNYXBQcm90b3R5cGUsIHtcbiAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlRGVsZXRlKHRoaXMsIGtleSkgfHwgc3RhdGUuZnJvemVuWydkZWxldGUnXShrZXkpO1xuICAgICAgfSByZXR1cm4gbmF0aXZlRGVsZXRlKHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUhhcyh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plbi5oYXMoa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZUhhcyh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVIYXModGhpcywga2V5KSA/IG5hdGl2ZUdldCh0aGlzLCBrZXkpIDogc3RhdGUuZnJvemVuLmdldChrZXkpO1xuICAgICAgfSByZXR1cm4gbmF0aXZlR2V0KHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIG5hdGl2ZUhhcyh0aGlzLCBrZXkpID8gbmF0aXZlU2V0KHRoaXMsIGtleSwgdmFsdWUpIDogc3RhdGUuZnJvemVuLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBuYXRpdmVTZXQodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0pO1xuLy8gQ2hha3JhIEVkZ2UgZnJvemVuIGtleXMgZml4XG59IGVsc2UgaWYgKGhhc01TRWRnZUZyZWV6aW5nQnVnKCkpIHtcbiAgZGVmaW5lQnVpbHRJbnMoV2Vha01hcFByb3RvdHlwZSwge1xuICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBhcnJheUludGVncml0eUxldmVsO1xuICAgICAgaWYgKGlzQXJyYXkoa2V5KSkge1xuICAgICAgICBpZiAoaXNGcm96ZW4oa2V5KSkgYXJyYXlJbnRlZ3JpdHlMZXZlbCA9IGZyZWV6ZTtcbiAgICAgICAgZWxzZSBpZiAoaXNTZWFsZWQoa2V5KSkgYXJyYXlJbnRlZ3JpdHlMZXZlbCA9IHNlYWw7XG4gICAgICB9XG4gICAgICBuYXRpdmVTZXQodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoYXJyYXlJbnRlZ3JpdHlMZXZlbCkgYXJyYXlJbnRlZ3JpdHlMZXZlbChrZXkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLndlYWstbWFwLmNvbnN0cnVjdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG5cbnZhciBNRVRBREFUQSA9IHdlbGxLbm93blN5bWJvbCgnbWV0YWRhdGEnKTtcbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLy8gRnVuY3Rpb24ucHJvdG90eXBlW0BAbWV0YWRhdGFdXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1kZWNvcmF0b3ItbWV0YWRhdGFcbmlmIChGdW5jdGlvblByb3RvdHlwZVtNRVRBREFUQV0gPT09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eShGdW5jdGlvblByb3RvdHlwZSwgTUVUQURBVEEsIHtcbiAgICB2YWx1ZTogbnVsbFxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuYXN5bmNEaXNwb3NlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXN5bmMtZXhwbGljaXQtcmVzb3VyY2UtbWFuYWdlbWVudFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdhc3luY0Rpc3Bvc2UnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuY3VzdG9tTWF0Y2hlcmAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXBhdHRlcm4tbWF0Y2hpbmdcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnY3VzdG9tTWF0Y2hlcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5kaXNwb3NlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZXhwbGljaXQtcmVzb3VyY2UtbWFuYWdlbWVudFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdkaXNwb3NlJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc1JlZ2lzdGVyZWRTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWlzLXJlZ2lzdGVyZWQnKTtcblxuLy8gYFN5bWJvbC5pc1JlZ2lzdGVyZWRTeW1ib2xgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLXN5bWJvbC1wcmVkaWNhdGVzLyNzZWMtc3ltYm9sLWlzcmVnaXN0ZXJlZHN5bWJvbFxuJCh7IHRhcmdldDogJ1N5bWJvbCcsIHN0YXQ6IHRydWUgfSwge1xuICBpc1JlZ2lzdGVyZWRTeW1ib2w6IGlzUmVnaXN0ZXJlZFN5bWJvbFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc1JlZ2lzdGVyZWRTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWlzLXJlZ2lzdGVyZWQnKTtcblxuLy8gYFN5bWJvbC5pc1JlZ2lzdGVyZWRgIG1ldGhvZFxuLy8gb2Jzb2xldGUgdmVyc2lvbiBvZiBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtc3ltYm9sLXByZWRpY2F0ZXMvI3NlYy1zeW1ib2wtaXNyZWdpc3RlcmVkc3ltYm9sXG4kKHsgdGFyZ2V0OiAnU3ltYm9sJywgc3RhdDogdHJ1ZSwgbmFtZTogJ2lzUmVnaXN0ZXJlZFN5bWJvbCcgfSwge1xuICBpc1JlZ2lzdGVyZWQ6IGlzUmVnaXN0ZXJlZFN5bWJvbFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc1dlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtaXMtd2VsbC1rbm93bicpO1xuXG4vLyBgU3ltYm9sLmlzV2VsbEtub3duU3ltYm9sYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1zeW1ib2wtcHJlZGljYXRlcy8jc2VjLXN5bWJvbC1pc3dlbGxrbm93bnN5bWJvbFxuLy8gV2Ugc2hvdWxkIHBhdGNoIGl0IGZvciBuZXdseSBhZGRlZCB3ZWxsLWtub3duIHN5bWJvbHMuIElmIGl0J3Mgbm90IHJlcXVpcmVkLCB0aGlzIG1vZHVsZSBqdXN0IHdpbGwgbm90IGJlIGluamVjdGVkXG4kKHsgdGFyZ2V0OiAnU3ltYm9sJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHtcbiAgaXNXZWxsS25vd25TeW1ib2w6IGlzV2VsbEtub3duU3ltYm9sXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1pcy13ZWxsLWtub3duJyk7XG5cbi8vIGBTeW1ib2wuaXNXZWxsS25vd25gIG1ldGhvZFxuLy8gb2Jzb2xldGUgdmVyc2lvbiBvZiBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtc3ltYm9sLXByZWRpY2F0ZXMvI3NlYy1zeW1ib2wtaXN3ZWxsa25vd25zeW1ib2xcbi8vIFdlIHNob3VsZCBwYXRjaCBpdCBmb3IgbmV3bHkgYWRkZWQgd2VsbC1rbm93biBzeW1ib2xzLiBJZiBpdCdzIG5vdCByZXF1aXJlZCwgdGhpcyBtb2R1bGUganVzdCB3aWxsIG5vdCBiZSBpbmplY3RlZFxuJCh7IHRhcmdldDogJ1N5bWJvbCcsIHN0YXQ6IHRydWUsIG5hbWU6ICdpc1dlbGxLbm93blN5bWJvbCcsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gIGlzV2VsbEtub3duOiBpc1dlbGxLbm93blN5bWJvbFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLm1hdGNoZXJgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wYXR0ZXJuLW1hdGNoaW5nXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoZXInKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLm1ldGFkYXRhS2V5YCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZGVjb3JhdG9yLW1ldGFkYXRhXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ21ldGFkYXRhS2V5Jyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLm1ldGFkYXRhYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZGVjb3JhdG9yc1xuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtZXRhZGF0YScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5vYnNlcnZhYmxlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdvYnNlcnZhYmxlJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiByZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5wYXR0ZXJuTWF0Y2hgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wYXR0ZXJuLW1hdGNoaW5nXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3BhdHRlcm5NYXRjaCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogcmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbmRlZmluZVdlbGxLbm93blN5bWJvbCgncmVwbGFjZUFsbCcpO1xuIiwiLy8gZW1wdHlcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBET01JdGVyYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcycpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxuZm9yICh2YXIgQ09MTEVDVElPTl9OQU1FIGluIERPTUl0ZXJhYmxlcykge1xuICBzZXRUb1N0cmluZ1RhZyhnbG9iYWxUaGlzW0NPTExFQ1RJT05fTkFNRV0sIENPTExFQ1RJT05fTkFNRSk7XG4gIEl0ZXJhdG9yc1tDT0xMRUNUSU9OX05BTUVdID0gSXRlcmF0b3JzLkFycmF5O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHNjaGVkdWxlcnNGaXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2NoZWR1bGVycy1maXgnKTtcblxudmFyIHNldEludGVydmFsID0gc2NoZWR1bGVyc0ZpeChnbG9iYWxUaGlzLnNldEludGVydmFsLCB0cnVlKTtcblxuLy8gQnVuIC8gSUU5LSBzZXRJbnRlcnZhbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZml4XG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS90aW1lcnMtYW5kLXVzZXItcHJvbXB0cy5odG1sI2RvbS1zZXRpbnRlcnZhbFxuJCh7IGdsb2JhbDogdHJ1ZSwgYmluZDogdHJ1ZSwgZm9yY2VkOiBnbG9iYWxUaGlzLnNldEludGVydmFsICE9PSBzZXRJbnRlcnZhbCB9LCB7XG4gIHNldEludGVydmFsOiBzZXRJbnRlcnZhbFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgc2NoZWR1bGVyc0ZpeCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zY2hlZHVsZXJzLWZpeCcpO1xuXG52YXIgc2V0VGltZW91dCA9IHNjaGVkdWxlcnNGaXgoZ2xvYmFsVGhpcy5zZXRUaW1lb3V0LCB0cnVlKTtcblxuLy8gQnVuIC8gSUU5LSBzZXRUaW1lb3V0IGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmaXhcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjZG9tLXNldHRpbWVvdXRcbiQoeyBnbG9iYWw6IHRydWUsIGJpbmQ6IHRydWUsIGZvcmNlZDogZ2xvYmFsVGhpcy5zZXRUaW1lb3V0ICE9PSBzZXRUaW1lb3V0IH0sIHtcbiAgc2V0VGltZW91dDogc2V0VGltZW91dFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHNwbGl0IHRvIG1vZHVsZXMgbGlzdGVkIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5zZXQtaW50ZXJ2YWwnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnNldC10aW1lb3V0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvYXJyYXkvZnJvbScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9hcnJheS9pcy1hcnJheScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi8uLi9lcy9hcnJheS92aXJ0dWFsL2VudHJpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vLi4vZXMvYXJyYXkvdmlydHVhbC9mb3ItZWFjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi8uLi9lcy9hcnJheS92aXJ0dWFsL2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vLi4vZXMvYXJyYXkvdmlydHVhbC92YWx1ZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2UvYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9jb25jYXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvZW50cmllcycpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbnZhciBET01JdGVyYWJsZXMgPSB7XG4gIERPTVRva2VuTGlzdDogdHJ1ZSxcbiAgTm9kZUxpc3Q6IHRydWVcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5lbnRyaWVzO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5lbnRyaWVzKVxuICAgIHx8IGhhc093bihET01JdGVyYWJsZXMsIGNsYXNzb2YoaXQpKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2UvZXZlcnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2UvZmlsdGVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2ZpbmQtaW5kZXgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2UvZmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvZm9yLWVhY2gnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbnZhciBET01JdGVyYWJsZXMgPSB7XG4gIERPTVRva2VuTGlzdDogdHJ1ZSxcbiAgTm9kZUxpc3Q6IHRydWVcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5mb3JFYWNoO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5mb3JFYWNoKVxuICAgIHx8IGhhc093bihET01JdGVyYWJsZXMsIGNsYXNzb2YoaXQpKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2UvaW5jbHVkZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2UvaW5kZXgtb2YnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwva2V5cycpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbnZhciBET01JdGVyYWJsZXMgPSB7XG4gIERPTVRva2VuTGlzdDogdHJ1ZSxcbiAgTm9kZUxpc3Q6IHRydWVcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5rZXlzO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5rZXlzKVxuICAgIHx8IGhhc093bihET01JdGVyYWJsZXMsIGNsYXNzb2YoaXQpKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2UvbWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL3JlZHVjZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9zbGljZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9zb3J0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL3NwbGljZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9zdGFydHMtd2l0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC92YWx1ZXMnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIE5vZGVMaXN0OiB0cnVlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQudmFsdWVzO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS52YWx1ZXMpXG4gICAgfHwgaGFzT3duKERPTUl0ZXJhYmxlcywgY2xhc3NvZihpdCkpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9qc29uL3N0cmluZ2lmeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9tYXAnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9udW1iZXIvaXMtaW50ZWdlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9vYmplY3QvYXNzaWduJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9jcmVhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9vYmplY3QvZW50cmllcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9vYmplY3QvZnJlZXplJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvb2JqZWN0L2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vZXMvcGFyc2UtaW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL3Byb21pc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnRpbWVycycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguc2V0SW50ZXJ2YWw7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi50aW1lcnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLnNldFRpbWVvdXQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvc2V0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvc3ltYm9sL2l0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvc3ltYm9sL3RvLXByaW1pdGl2ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy93ZWFrLW1hcCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiaW1wb3J0IHRvUHJvcGVydHlLZXkgZnJvbSBcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHtcbiAgcmV0dXJuIChyID0gdG9Qcm9wZXJ0eUtleShyKSkgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCB7XG4gICAgdmFsdWU6IHQsXG4gICAgZW51bWVyYWJsZTogITAsXG4gICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICB3cml0YWJsZTogITBcbiAgfSkgOiBlW3JdID0gdCwgZTtcbn1cbmV4cG9ydCB7IF9kZWZpbmVQcm9wZXJ0eSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7XG4gICAgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHtcbiAgICAgIHZhciB0ID0gYXJndW1lbnRzW2VdO1xuICAgICAgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgeyBfZXh0ZW5kcyBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSh0LCBvKSB7XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSksIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gdCwgc2V0UHJvdG90eXBlT2YodCwgbyk7XG59XG5leHBvcnQgeyBfaW5oZXJpdHNMb29zZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IGRlZmluZVByb3BlcnR5IGZyb20gXCIuL2RlZmluZVByb3BlcnR5LmpzXCI7XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHtcbiAgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7XG4gICAgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pO1xuICB9XG4gIHJldHVybiB0O1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIoZSkge1xuICBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykge1xuICAgIHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTtcbiAgICByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7XG4gICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGU7XG59XG5leHBvcnQgeyBfb2JqZWN0U3ByZWFkMiBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UociwgZSkge1xuICBpZiAobnVsbCA9PSByKSByZXR1cm4ge307XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIG4gaW4gcikgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwociwgbikpIHtcbiAgICBpZiAoZS5pbmNsdWRlcyhuKSkgY29udGludWU7XG4gICAgdFtuXSA9IHJbbl07XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5leHBvcnQgeyBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQsIGUpIHtcbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyA9IGUsIHQ7XG4gIH0sIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmV4cG9ydCB7IF9zZXRQcm90b3R5cGVPZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkge1xuICAgIHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxuZXhwb3J0IHsgdG9QcmltaXRpdmUgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IHRvUHJpbWl0aXZlIGZyb20gXCIuL3RvUHJpbWl0aXZlLmpzXCI7XG5mdW5jdGlvbiB0b1Byb3BlcnR5S2V5KHQpIHtcbiAgdmFyIGkgPSB0b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTtcbiAgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjtcbn1cbmV4cG9ydCB7IHRvUHJvcGVydHlLZXkgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF90eXBlb2Yobykge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiB0eXBlb2YgbztcbiAgfSA6IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87XG4gIH0sIF90eXBlb2Yobyk7XG59XG5leHBvcnQgeyBfdHlwZW9mIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgeyBnZXRTaWRlQXhpcywgZ2V0QWxpZ25tZW50QXhpcywgZ2V0QXhpc0xlbmd0aCwgZ2V0U2lkZSwgZ2V0QWxpZ25tZW50LCBldmFsdWF0ZSwgZ2V0UGFkZGluZ09iamVjdCwgcmVjdFRvQ2xpZW50UmVjdCwgbWluLCBjbGFtcCwgcGxhY2VtZW50cywgZ2V0QWxpZ25tZW50U2lkZXMsIGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50LCBnZXRPcHBvc2l0ZVBsYWNlbWVudCwgZ2V0RXhwYW5kZWRQbGFjZW1lbnRzLCBnZXRPcHBvc2l0ZUF4aXNQbGFjZW1lbnRzLCBzaWRlcywgbWF4LCBnZXRPcHBvc2l0ZUF4aXMgfSBmcm9tICdAZmxvYXRpbmctdWkvdXRpbHMnO1xuZXhwb3J0IHsgcmVjdFRvQ2xpZW50UmVjdCB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscyc7XG5cbmZ1bmN0aW9uIGNvbXB1dGVDb29yZHNGcm9tUGxhY2VtZW50KF9yZWYsIHBsYWNlbWVudCwgcnRsKSB7XG4gIGxldCB7XG4gICAgcmVmZXJlbmNlLFxuICAgIGZsb2F0aW5nXG4gIH0gPSBfcmVmO1xuICBjb25zdCBzaWRlQXhpcyA9IGdldFNpZGVBeGlzKHBsYWNlbWVudCk7XG4gIGNvbnN0IGFsaWdubWVudEF4aXMgPSBnZXRBbGlnbm1lbnRBeGlzKHBsYWNlbWVudCk7XG4gIGNvbnN0IGFsaWduTGVuZ3RoID0gZ2V0QXhpc0xlbmd0aChhbGlnbm1lbnRBeGlzKTtcbiAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgY29uc3QgaXNWZXJ0aWNhbCA9IHNpZGVBeGlzID09PSAneSc7XG4gIGNvbnN0IGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBmbG9hdGluZy53aWR0aCAvIDI7XG4gIGNvbnN0IGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZmxvYXRpbmcuaGVpZ2h0IC8gMjtcbiAgY29uc3QgY29tbW9uQWxpZ24gPSByZWZlcmVuY2VbYWxpZ25MZW5ndGhdIC8gMiAtIGZsb2F0aW5nW2FsaWduTGVuZ3RoXSAvIDI7XG4gIGxldCBjb29yZHM7XG4gIHN3aXRjaCAoc2lkZSkge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICBjb29yZHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZmxvYXRpbmcuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgY29vcmRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgY29vcmRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCAtIGZsb2F0aW5nLndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG4gIHN3aXRjaCAoZ2V0QWxpZ25tZW50KHBsYWNlbWVudCkpIHtcbiAgICBjYXNlICdzdGFydCc6XG4gICAgICBjb29yZHNbYWxpZ25tZW50QXhpc10gLT0gY29tbW9uQWxpZ24gKiAocnRsICYmIGlzVmVydGljYWwgPyAtMSA6IDEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW5kJzpcbiAgICAgIGNvb3Jkc1thbGlnbm1lbnRBeGlzXSArPSBjb21tb25BbGlnbiAqIChydGwgJiYgaXNWZXJ0aWNhbCA/IC0xIDogMSk7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gY29vcmRzO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBgeGAgYW5kIGB5YCBjb29yZGluYXRlcyB0aGF0IHdpbGwgcGxhY2UgdGhlIGZsb2F0aW5nIGVsZW1lbnRcbiAqIG5leHQgdG8gYSBnaXZlbiByZWZlcmVuY2UgZWxlbWVudC5cbiAqXG4gKiBUaGlzIGV4cG9ydCBkb2VzIG5vdCBoYXZlIGFueSBgcGxhdGZvcm1gIGludGVyZmFjZSBsb2dpYy4gWW91IHdpbGwgbmVlZCB0b1xuICogd3JpdGUgb25lIGZvciB0aGUgcGxhdGZvcm0geW91IGFyZSB1c2luZyBGbG9hdGluZyBVSSB3aXRoLlxuICovXG5jb25zdCBjb21wdXRlUG9zaXRpb24gPSBhc3luYyAocmVmZXJlbmNlLCBmbG9hdGluZywgY29uZmlnKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBwbGFjZW1lbnQgPSAnYm90dG9tJyxcbiAgICBzdHJhdGVneSA9ICdhYnNvbHV0ZScsXG4gICAgbWlkZGxld2FyZSA9IFtdLFxuICAgIHBsYXRmb3JtXG4gIH0gPSBjb25maWc7XG4gIGNvbnN0IHZhbGlkTWlkZGxld2FyZSA9IG1pZGRsZXdhcmUuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBydGwgPSBhd2FpdCAocGxhdGZvcm0uaXNSVEwgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzUlRMKGZsb2F0aW5nKSk7XG4gIGxldCByZWN0cyA9IGF3YWl0IHBsYXRmb3JtLmdldEVsZW1lbnRSZWN0cyh7XG4gICAgcmVmZXJlbmNlLFxuICAgIGZsb2F0aW5nLFxuICAgIHN0cmF0ZWd5XG4gIH0pO1xuICBsZXQge1xuICAgIHgsXG4gICAgeVxuICB9ID0gY29tcHV0ZUNvb3Jkc0Zyb21QbGFjZW1lbnQocmVjdHMsIHBsYWNlbWVudCwgcnRsKTtcbiAgbGV0IHN0YXRlZnVsUGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICBsZXQgbWlkZGxld2FyZURhdGEgPSB7fTtcbiAgbGV0IHJlc2V0Q291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkTWlkZGxld2FyZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBmblxuICAgIH0gPSB2YWxpZE1pZGRsZXdhcmVbaV07XG4gICAgY29uc3Qge1xuICAgICAgeDogbmV4dFgsXG4gICAgICB5OiBuZXh0WSxcbiAgICAgIGRhdGEsXG4gICAgICByZXNldFxuICAgIH0gPSBhd2FpdCBmbih7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIGluaXRpYWxQbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudDogc3RhdGVmdWxQbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneSxcbiAgICAgIG1pZGRsZXdhcmVEYXRhLFxuICAgICAgcmVjdHMsXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIHJlZmVyZW5jZSxcbiAgICAgICAgZmxvYXRpbmdcbiAgICAgIH1cbiAgICB9KTtcbiAgICB4ID0gbmV4dFggIT0gbnVsbCA/IG5leHRYIDogeDtcbiAgICB5ID0gbmV4dFkgIT0gbnVsbCA/IG5leHRZIDogeTtcbiAgICBtaWRkbGV3YXJlRGF0YSA9IHtcbiAgICAgIC4uLm1pZGRsZXdhcmVEYXRhLFxuICAgICAgW25hbWVdOiB7XG4gICAgICAgIC4uLm1pZGRsZXdhcmVEYXRhW25hbWVdLFxuICAgICAgICAuLi5kYXRhXG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAocmVzZXQgJiYgcmVzZXRDb3VudCA8PSA1MCkge1xuICAgICAgcmVzZXRDb3VudCsrO1xuICAgICAgaWYgKHR5cGVvZiByZXNldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHJlc2V0LnBsYWNlbWVudCkge1xuICAgICAgICAgIHN0YXRlZnVsUGxhY2VtZW50ID0gcmVzZXQucGxhY2VtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNldC5yZWN0cykge1xuICAgICAgICAgIHJlY3RzID0gcmVzZXQucmVjdHMgPT09IHRydWUgPyBhd2FpdCBwbGF0Zm9ybS5nZXRFbGVtZW50UmVjdHMoe1xuICAgICAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICAgICAgZmxvYXRpbmcsXG4gICAgICAgICAgICBzdHJhdGVneVxuICAgICAgICAgIH0pIDogcmVzZXQucmVjdHM7XG4gICAgICAgIH1cbiAgICAgICAgKHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHlcbiAgICAgICAgfSA9IGNvbXB1dGVDb29yZHNGcm9tUGxhY2VtZW50KHJlY3RzLCBzdGF0ZWZ1bFBsYWNlbWVudCwgcnRsKSk7XG4gICAgICB9XG4gICAgICBpID0gLTE7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5LFxuICAgIHBsYWNlbWVudDogc3RhdGVmdWxQbGFjZW1lbnQsXG4gICAgc3RyYXRlZ3ksXG4gICAgbWlkZGxld2FyZURhdGFcbiAgfTtcbn07XG5cbi8qKlxuICogUmVzb2x2ZXMgd2l0aCBhbiBvYmplY3Qgb2Ygb3ZlcmZsb3cgc2lkZSBvZmZzZXRzIHRoYXQgZGV0ZXJtaW5lIGhvdyBtdWNoIHRoZVxuICogZWxlbWVudCBpcyBvdmVyZmxvd2luZyBhIGdpdmVuIGNsaXBwaW5nIGJvdW5kYXJ5IG9uIGVhY2ggc2lkZS5cbiAqIC0gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgYm91bmRhcnkgYnkgdGhhdCBudW1iZXIgb2YgcGl4ZWxzXG4gKiAtIG5lZ2F0aXZlID0gaG93IG1hbnkgcGl4ZWxzIGxlZnQgYmVmb3JlIGl0IHdpbGwgb3ZlcmZsb3dcbiAqIC0gMCA9IGxpZXMgZmx1c2ggd2l0aCB0aGUgYm91bmRhcnlcbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9kZXRlY3RPdmVyZmxvd1xuICovXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgb3B0aW9ucykge1xuICB2YXIgX2F3YWl0JHBsYXRmb3JtJGlzRWxlO1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgcGxhdGZvcm0sXG4gICAgcmVjdHMsXG4gICAgZWxlbWVudHMsXG4gICAgc3RyYXRlZ3lcbiAgfSA9IHN0YXRlO1xuICBjb25zdCB7XG4gICAgYm91bmRhcnkgPSAnY2xpcHBpbmdBbmNlc3RvcnMnLFxuICAgIHJvb3RCb3VuZGFyeSA9ICd2aWV3cG9ydCcsXG4gICAgZWxlbWVudENvbnRleHQgPSAnZmxvYXRpbmcnLFxuICAgIGFsdEJvdW5kYXJ5ID0gZmFsc2UsXG4gICAgcGFkZGluZyA9IDBcbiAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcbiAgY29uc3QgcGFkZGluZ09iamVjdCA9IGdldFBhZGRpbmdPYmplY3QocGFkZGluZyk7XG4gIGNvbnN0IGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gJ2Zsb2F0aW5nJyA/ICdyZWZlcmVuY2UnIDogJ2Zsb2F0aW5nJztcbiAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2FsdEJvdW5kYXJ5ID8gYWx0Q29udGV4dCA6IGVsZW1lbnRDb250ZXh0XTtcbiAgY29uc3QgY2xpcHBpbmdDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChhd2FpdCBwbGF0Zm9ybS5nZXRDbGlwcGluZ1JlY3Qoe1xuICAgIGVsZW1lbnQ6ICgoX2F3YWl0JHBsYXRmb3JtJGlzRWxlID0gYXdhaXQgKHBsYXRmb3JtLmlzRWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNFbGVtZW50KGVsZW1lbnQpKSkgIT0gbnVsbCA/IF9hd2FpdCRwbGF0Zm9ybSRpc0VsZSA6IHRydWUpID8gZWxlbWVudCA6IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgfHwgKGF3YWl0IChwbGF0Zm9ybS5nZXREb2N1bWVudEVsZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldERvY3VtZW50RWxlbWVudChlbGVtZW50cy5mbG9hdGluZykpKSxcbiAgICBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnksXG4gICAgc3RyYXRlZ3lcbiAgfSkpO1xuICBjb25zdCByZWN0ID0gZWxlbWVudENvbnRleHQgPT09ICdmbG9hdGluZycgPyB7XG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoOiByZWN0cy5mbG9hdGluZy53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3RzLmZsb2F0aW5nLmhlaWdodFxuICB9IDogcmVjdHMucmVmZXJlbmNlO1xuICBjb25zdCBvZmZzZXRQYXJlbnQgPSBhd2FpdCAocGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5nZXRPZmZzZXRQYXJlbnQoZWxlbWVudHMuZmxvYXRpbmcpKTtcbiAgY29uc3Qgb2Zmc2V0U2NhbGUgPSAoYXdhaXQgKHBsYXRmb3JtLmlzRWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNFbGVtZW50KG9mZnNldFBhcmVudCkpKSA/IChhd2FpdCAocGxhdGZvcm0uZ2V0U2NhbGUgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldFNjYWxlKG9mZnNldFBhcmVudCkpKSB8fCB7XG4gICAgeDogMSxcbiAgICB5OiAxXG4gIH0gOiB7XG4gICAgeDogMSxcbiAgICB5OiAxXG4gIH07XG4gIGNvbnN0IGVsZW1lbnRDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChwbGF0Zm9ybS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCA/IGF3YWl0IHBsYXRmb3JtLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0KHtcbiAgICBlbGVtZW50cyxcbiAgICByZWN0LFxuICAgIG9mZnNldFBhcmVudCxcbiAgICBzdHJhdGVneVxuICB9KSA6IHJlY3QpO1xuICByZXR1cm4ge1xuICAgIHRvcDogKGNsaXBwaW5nQ2xpZW50UmVjdC50b3AgLSBlbGVtZW50Q2xpZW50UmVjdC50b3AgKyBwYWRkaW5nT2JqZWN0LnRvcCkgLyBvZmZzZXRTY2FsZS55LFxuICAgIGJvdHRvbTogKGVsZW1lbnRDbGllbnRSZWN0LmJvdHRvbSAtIGNsaXBwaW5nQ2xpZW50UmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSkgLyBvZmZzZXRTY2FsZS55LFxuICAgIGxlZnQ6IChjbGlwcGluZ0NsaWVudFJlY3QubGVmdCAtIGVsZW1lbnRDbGllbnRSZWN0LmxlZnQgKyBwYWRkaW5nT2JqZWN0LmxlZnQpIC8gb2Zmc2V0U2NhbGUueCxcbiAgICByaWdodDogKGVsZW1lbnRDbGllbnRSZWN0LnJpZ2h0IC0gY2xpcHBpbmdDbGllbnRSZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodCkgLyBvZmZzZXRTY2FsZS54XG4gIH07XG59XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhbiBpbm5lciBlbGVtZW50IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHNvIHRoYXQgaXRcbiAqIGFwcGVhcnMgY2VudGVyZWQgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2Fycm93XG4gKi9cbmNvbnN0IGFycm93ID0gb3B0aW9ucyA9PiAoe1xuICBuYW1lOiAnYXJyb3cnLFxuICBvcHRpb25zLFxuICBhc3luYyBmbihzdGF0ZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgcGxhY2VtZW50LFxuICAgICAgcmVjdHMsXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgbWlkZGxld2FyZURhdGFcbiAgICB9ID0gc3RhdGU7XG4gICAgLy8gU2luY2UgYGVsZW1lbnRgIGlzIHJlcXVpcmVkLCB3ZSBkb24ndCBQYXJ0aWFsPD4gdGhlIHR5cGUuXG4gICAgY29uc3Qge1xuICAgICAgZWxlbWVudCxcbiAgICAgIHBhZGRpbmcgPSAwXG4gICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKSB8fCB7fTtcbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHBhZGRpbmdPYmplY3QgPSBnZXRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpO1xuICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfTtcbiAgICBjb25zdCBheGlzID0gZ2V0QWxpZ25tZW50QXhpcyhwbGFjZW1lbnQpO1xuICAgIGNvbnN0IGxlbmd0aCA9IGdldEF4aXNMZW5ndGgoYXhpcyk7XG4gICAgY29uc3QgYXJyb3dEaW1lbnNpb25zID0gYXdhaXQgcGxhdGZvcm0uZ2V0RGltZW5zaW9ucyhlbGVtZW50KTtcbiAgICBjb25zdCBpc1lBeGlzID0gYXhpcyA9PT0gJ3knO1xuICAgIGNvbnN0IG1pblByb3AgPSBpc1lBeGlzID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgY29uc3QgbWF4UHJvcCA9IGlzWUF4aXMgPyAnYm90dG9tJyA6ICdyaWdodCc7XG4gICAgY29uc3QgY2xpZW50UHJvcCA9IGlzWUF4aXMgPyAnY2xpZW50SGVpZ2h0JyA6ICdjbGllbnRXaWR0aCc7XG4gICAgY29uc3QgZW5kRGlmZiA9IHJlY3RzLnJlZmVyZW5jZVtsZW5ndGhdICsgcmVjdHMucmVmZXJlbmNlW2F4aXNdIC0gY29vcmRzW2F4aXNdIC0gcmVjdHMuZmxvYXRpbmdbbGVuZ3RoXTtcbiAgICBjb25zdCBzdGFydERpZmYgPSBjb29yZHNbYXhpc10gLSByZWN0cy5yZWZlcmVuY2VbYXhpc107XG4gICAgY29uc3QgYXJyb3dPZmZzZXRQYXJlbnQgPSBhd2FpdCAocGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5nZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkpO1xuICAgIGxldCBjbGllbnRTaXplID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBhcnJvd09mZnNldFBhcmVudFtjbGllbnRQcm9wXSA6IDA7XG5cbiAgICAvLyBET00gcGxhdGZvcm0gY2FuIHJldHVybiBgd2luZG93YCBhcyB0aGUgYG9mZnNldFBhcmVudGAuXG4gICAgaWYgKCFjbGllbnRTaXplIHx8ICEoYXdhaXQgKHBsYXRmb3JtLmlzRWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNFbGVtZW50KGFycm93T2Zmc2V0UGFyZW50KSkpKSB7XG4gICAgICBjbGllbnRTaXplID0gZWxlbWVudHMuZmxvYXRpbmdbY2xpZW50UHJvcF0gfHwgcmVjdHMuZmxvYXRpbmdbbGVuZ3RoXTtcbiAgICB9XG4gICAgY29uc3QgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7XG5cbiAgICAvLyBJZiB0aGUgcGFkZGluZyBpcyBsYXJnZSBlbm91Z2ggdGhhdCBpdCBjYXVzZXMgdGhlIGFycm93IHRvIG5vIGxvbmdlciBiZVxuICAgIC8vIGNlbnRlcmVkLCBtb2RpZnkgdGhlIHBhZGRpbmcgc28gdGhhdCBpdCBpcyBjZW50ZXJlZC5cbiAgICBjb25zdCBsYXJnZXN0UG9zc2libGVQYWRkaW5nID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd0RpbWVuc2lvbnNbbGVuZ3RoXSAvIDIgLSAxO1xuICAgIGNvbnN0IG1pblBhZGRpbmcgPSBtaW4ocGFkZGluZ09iamVjdFttaW5Qcm9wXSwgbGFyZ2VzdFBvc3NpYmxlUGFkZGluZyk7XG4gICAgY29uc3QgbWF4UGFkZGluZyA9IG1pbihwYWRkaW5nT2JqZWN0W21heFByb3BdLCBsYXJnZXN0UG9zc2libGVQYWRkaW5nKTtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgZmxvYXRpbmcgZWxlbWVudCBpZiB0aGUgY2VudGVyXG4gICAgLy8gcG9pbnQgaXMgb3V0c2lkZSB0aGUgZmxvYXRpbmcgZWxlbWVudCdzIGJvdW5kcy5cbiAgICBjb25zdCBtaW4kMSA9IG1pblBhZGRpbmc7XG4gICAgY29uc3QgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93RGltZW5zaW9uc1tsZW5ndGhdIC0gbWF4UGFkZGluZztcbiAgICBjb25zdCBjZW50ZXIgPSBjbGllbnRTaXplIC8gMiAtIGFycm93RGltZW5zaW9uc1tsZW5ndGhdIC8gMiArIGNlbnRlclRvUmVmZXJlbmNlO1xuICAgIGNvbnN0IG9mZnNldCA9IGNsYW1wKG1pbiQxLCBjZW50ZXIsIG1heCk7XG5cbiAgICAvLyBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsIGVub3VnaCB0aGF0IHRoZSBhcnJvdydzIHBhZGRpbmcgY2F1c2VzIGl0IHRvXG4gICAgLy8gdG8gcG9pbnQgdG8gbm90aGluZyBmb3IgYW4gYWxpZ25lZCBwbGFjZW1lbnQsIGFkanVzdCB0aGUgb2Zmc2V0IG9mIHRoZVxuICAgIC8vIGZsb2F0aW5nIGVsZW1lbnQgaXRzZWxmLiBUbyBlbnN1cmUgYHNoaWZ0KClgIGNvbnRpbnVlcyB0byB0YWtlIGFjdGlvbixcbiAgICAvLyBhIHNpbmdsZSByZXNldCBpcyBwZXJmb3JtZWQgd2hlbiB0aGlzIGlzIHRydWUuXG4gICAgY29uc3Qgc2hvdWxkQWRkT2Zmc2V0ID0gIW1pZGRsZXdhcmVEYXRhLmFycm93ICYmIGdldEFsaWdubWVudChwbGFjZW1lbnQpICE9IG51bGwgJiYgY2VudGVyICE9PSBvZmZzZXQgJiYgcmVjdHMucmVmZXJlbmNlW2xlbmd0aF0gLyAyIC0gKGNlbnRlciA8IG1pbiQxID8gbWluUGFkZGluZyA6IG1heFBhZGRpbmcpIC0gYXJyb3dEaW1lbnNpb25zW2xlbmd0aF0gLyAyIDwgMDtcbiAgICBjb25zdCBhbGlnbm1lbnRPZmZzZXQgPSBzaG91bGRBZGRPZmZzZXQgPyBjZW50ZXIgPCBtaW4kMSA/IGNlbnRlciAtIG1pbiQxIDogY2VudGVyIC0gbWF4IDogMDtcbiAgICByZXR1cm4ge1xuICAgICAgW2F4aXNdOiBjb29yZHNbYXhpc10gKyBhbGlnbm1lbnRPZmZzZXQsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFtheGlzXTogb2Zmc2V0LFxuICAgICAgICBjZW50ZXJPZmZzZXQ6IGNlbnRlciAtIG9mZnNldCAtIGFsaWdubWVudE9mZnNldCxcbiAgICAgICAgLi4uKHNob3VsZEFkZE9mZnNldCAmJiB7XG4gICAgICAgICAgYWxpZ25tZW50T2Zmc2V0XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgcmVzZXQ6IHNob3VsZEFkZE9mZnNldFxuICAgIH07XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBnZXRQbGFjZW1lbnRMaXN0KGFsaWdubWVudCwgYXV0b0FsaWdubWVudCwgYWxsb3dlZFBsYWNlbWVudHMpIHtcbiAgY29uc3QgYWxsb3dlZFBsYWNlbWVudHNTb3J0ZWRCeUFsaWdubWVudCA9IGFsaWdubWVudCA/IFsuLi5hbGxvd2VkUGxhY2VtZW50cy5maWx0ZXIocGxhY2VtZW50ID0+IGdldEFsaWdubWVudChwbGFjZW1lbnQpID09PSBhbGlnbm1lbnQpLCAuLi5hbGxvd2VkUGxhY2VtZW50cy5maWx0ZXIocGxhY2VtZW50ID0+IGdldEFsaWdubWVudChwbGFjZW1lbnQpICE9PSBhbGlnbm1lbnQpXSA6IGFsbG93ZWRQbGFjZW1lbnRzLmZpbHRlcihwbGFjZW1lbnQgPT4gZ2V0U2lkZShwbGFjZW1lbnQpID09PSBwbGFjZW1lbnQpO1xuICByZXR1cm4gYWxsb3dlZFBsYWNlbWVudHNTb3J0ZWRCeUFsaWdubWVudC5maWx0ZXIocGxhY2VtZW50ID0+IHtcbiAgICBpZiAoYWxpZ25tZW50KSB7XG4gICAgICByZXR1cm4gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCkgPT09IGFsaWdubWVudCB8fCAoYXV0b0FsaWdubWVudCA/IGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50KHBsYWNlbWVudCkgIT09IHBsYWNlbWVudCA6IGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgY2hvb3NpbmcgdGhlIHBsYWNlbWVudFxuICogdGhhdCBoYXMgdGhlIG1vc3Qgc3BhY2UgYXZhaWxhYmxlIGF1dG9tYXRpY2FsbHksIHdpdGhvdXQgbmVlZGluZyB0byBzcGVjaWZ5IGFcbiAqIHByZWZlcnJlZCBwbGFjZW1lbnQuIEFsdGVybmF0aXZlIHRvIGBmbGlwYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hdXRvUGxhY2VtZW50XG4gKi9cbmNvbnN0IGF1dG9QbGFjZW1lbnQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2F1dG9QbGFjZW1lbnQnLFxuICAgIG9wdGlvbnMsXG4gICAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkYXV0b1AsIF9taWRkbGV3YXJlRGF0YSRhdXRvUDIsIF9wbGFjZW1lbnRzVGhhdEZpdE9uRTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIG1pZGRsZXdhcmVEYXRhLFxuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBlbGVtZW50c1xuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjcm9zc0F4aXMgPSBmYWxzZSxcbiAgICAgICAgYWxpZ25tZW50LFxuICAgICAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMsXG4gICAgICAgIGF1dG9BbGlnbm1lbnQgPSB0cnVlLFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBjb25zdCBwbGFjZW1lbnRzJDEgPSBhbGlnbm1lbnQgIT09IHVuZGVmaW5lZCB8fCBhbGxvd2VkUGxhY2VtZW50cyA9PT0gcGxhY2VtZW50cyA/IGdldFBsYWNlbWVudExpc3QoYWxpZ25tZW50IHx8IG51bGwsIGF1dG9BbGlnbm1lbnQsIGFsbG93ZWRQbGFjZW1lbnRzKSA6IGFsbG93ZWRQbGFjZW1lbnRzO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9ICgoX21pZGRsZXdhcmVEYXRhJGF1dG9QID0gbWlkZGxld2FyZURhdGEuYXV0b1BsYWNlbWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRhdXRvUC5pbmRleCkgfHwgMDtcbiAgICAgIGNvbnN0IGN1cnJlbnRQbGFjZW1lbnQgPSBwbGFjZW1lbnRzJDFbY3VycmVudEluZGV4XTtcbiAgICAgIGlmIChjdXJyZW50UGxhY2VtZW50ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgYWxpZ25tZW50U2lkZXMgPSBnZXRBbGlnbm1lbnRTaWRlcyhjdXJyZW50UGxhY2VtZW50LCByZWN0cywgYXdhaXQgKHBsYXRmb3JtLmlzUlRMID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc1JUTChlbGVtZW50cy5mbG9hdGluZykpKTtcblxuICAgICAgLy8gTWFrZSBgY29tcHV0ZUNvb3Jkc2Agc3RhcnQgZnJvbSB0aGUgcmlnaHQgcGxhY2UuXG4gICAgICBpZiAocGxhY2VtZW50ICE9PSBjdXJyZW50UGxhY2VtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50cyQxWzBdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE92ZXJmbG93cyA9IFtvdmVyZmxvd1tnZXRTaWRlKGN1cnJlbnRQbGFjZW1lbnQpXSwgb3ZlcmZsb3dbYWxpZ25tZW50U2lkZXNbMF1dLCBvdmVyZmxvd1thbGlnbm1lbnRTaWRlc1sxXV1dO1xuICAgICAgY29uc3QgYWxsT3ZlcmZsb3dzID0gWy4uLigoKF9taWRkbGV3YXJlRGF0YSRhdXRvUDIgPSBtaWRkbGV3YXJlRGF0YS5hdXRvUGxhY2VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJGF1dG9QMi5vdmVyZmxvd3MpIHx8IFtdKSwge1xuICAgICAgICBwbGFjZW1lbnQ6IGN1cnJlbnRQbGFjZW1lbnQsXG4gICAgICAgIG92ZXJmbG93czogY3VycmVudE92ZXJmbG93c1xuICAgICAgfV07XG4gICAgICBjb25zdCBuZXh0UGxhY2VtZW50ID0gcGxhY2VtZW50cyQxW2N1cnJlbnRJbmRleCArIDFdO1xuXG4gICAgICAvLyBUaGVyZSBhcmUgbW9yZSBwbGFjZW1lbnRzIHRvIGNoZWNrLlxuICAgICAgaWYgKG5leHRQbGFjZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4ICsgMSxcbiAgICAgICAgICAgIG92ZXJmbG93czogYWxsT3ZlcmZsb3dzXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcGxhY2VtZW50OiBuZXh0UGxhY2VtZW50XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcGxhY2VtZW50c1NvcnRlZEJ5TW9zdFNwYWNlID0gYWxsT3ZlcmZsb3dzLm1hcChkID0+IHtcbiAgICAgICAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KGQucGxhY2VtZW50KTtcbiAgICAgICAgcmV0dXJuIFtkLnBsYWNlbWVudCwgYWxpZ25tZW50ICYmIGNyb3NzQXhpcyA/XG4gICAgICAgIC8vIENoZWNrIGFsb25nIHRoZSBtYWluQXhpcyBhbmQgbWFpbiBjcm9zc0F4aXMgc2lkZS5cbiAgICAgICAgZC5vdmVyZmxvd3Muc2xpY2UoMCwgMikucmVkdWNlKChhY2MsIHYpID0+IGFjYyArIHYsIDApIDpcbiAgICAgICAgLy8gQ2hlY2sgb25seSB0aGUgbWFpbkF4aXMuXG4gICAgICAgIGQub3ZlcmZsb3dzWzBdLCBkLm92ZXJmbG93c107XG4gICAgICB9KS5zb3J0KChhLCBiKSA9PiBhWzFdIC0gYlsxXSk7XG4gICAgICBjb25zdCBwbGFjZW1lbnRzVGhhdEZpdE9uRWFjaFNpZGUgPSBwbGFjZW1lbnRzU29ydGVkQnlNb3N0U3BhY2UuZmlsdGVyKGQgPT4gZFsyXS5zbGljZSgwLFxuICAgICAgLy8gQWxpZ25lZCBwbGFjZW1lbnRzIHNob3VsZCBub3QgY2hlY2sgdGhlaXIgb3Bwb3NpdGUgY3Jvc3NBeGlzXG4gICAgICAvLyBzaWRlLlxuICAgICAgZ2V0QWxpZ25tZW50KGRbMF0pID8gMiA6IDMpLmV2ZXJ5KHYgPT4gdiA8PSAwKSk7XG4gICAgICBjb25zdCByZXNldFBsYWNlbWVudCA9ICgoX3BsYWNlbWVudHNUaGF0Rml0T25FID0gcGxhY2VtZW50c1RoYXRGaXRPbkVhY2hTaWRlWzBdKSA9PSBudWxsID8gdm9pZCAwIDogX3BsYWNlbWVudHNUaGF0Rml0T25FWzBdKSB8fCBwbGFjZW1lbnRzU29ydGVkQnlNb3N0U3BhY2VbMF1bMF07XG4gICAgICBpZiAocmVzZXRQbGFjZW1lbnQgIT09IHBsYWNlbWVudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGluZGV4OiBjdXJyZW50SW5kZXggKyAxLFxuICAgICAgICAgICAgb3ZlcmZsb3dzOiBhbGxPdmVyZmxvd3NcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICBwbGFjZW1lbnQ6IHJlc2V0UGxhY2VtZW50XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IGZsaXBwaW5nIHRoZSBgcGxhY2VtZW50YFxuICogaW4gb3JkZXIgdG8ga2VlcCBpdCBpbiB2aWV3IHdoZW4gdGhlIHByZWZlcnJlZCBwbGFjZW1lbnQocykgd2lsbCBvdmVyZmxvdyB0aGVcbiAqIGNsaXBwaW5nIGJvdW5kYXJ5LiBBbHRlcm5hdGl2ZSB0byBgYXV0b1BsYWNlbWVudGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvZmxpcFxuICovXG5jb25zdCBmbGlwID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdmbGlwJyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICB2YXIgX21pZGRsZXdhcmVEYXRhJGFycm93LCBfbWlkZGxld2FyZURhdGEkZmxpcDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBtaWRkbGV3YXJlRGF0YSxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIGluaXRpYWxQbGFjZW1lbnQsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBlbGVtZW50c1xuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBtYWluQXhpczogY2hlY2tNYWluQXhpcyA9IHRydWUsXG4gICAgICAgIGNyb3NzQXhpczogY2hlY2tDcm9zc0F4aXMgPSB0cnVlLFxuICAgICAgICBmYWxsYmFja1BsYWNlbWVudHM6IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyxcbiAgICAgICAgZmFsbGJhY2tTdHJhdGVneSA9ICdiZXN0Rml0JyxcbiAgICAgICAgZmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbiA9ICdub25lJyxcbiAgICAgICAgZmxpcEFsaWdubWVudCA9IHRydWUsXG4gICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICAgICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcblxuICAgICAgLy8gSWYgYSByZXNldCBieSB0aGUgYXJyb3cgd2FzIGNhdXNlZCBkdWUgdG8gYW4gYWxpZ25tZW50IG9mZnNldCBiZWluZ1xuICAgICAgLy8gYWRkZWQsIHdlIHNob3VsZCBza2lwIGFueSBsb2dpYyBub3cgc2luY2UgYGZsaXAoKWAgaGFzIGFscmVhZHkgZG9uZSBpdHNcbiAgICAgIC8vIHdvcmsuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzI1NDkjaXNzdWVjb21tZW50LTE3MTk2MDE2NDNcbiAgICAgIGlmICgoX21pZGRsZXdhcmVEYXRhJGFycm93ID0gbWlkZGxld2FyZURhdGEuYXJyb3cpICE9IG51bGwgJiYgX21pZGRsZXdhcmVEYXRhJGFycm93LmFsaWdubWVudE9mZnNldCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICBjb25zdCBzaWRlID0gZ2V0U2lkZShwbGFjZW1lbnQpO1xuICAgICAgY29uc3QgaW5pdGlhbFNpZGVBeGlzID0gZ2V0U2lkZUF4aXMoaW5pdGlhbFBsYWNlbWVudCk7XG4gICAgICBjb25zdCBpc0Jhc2VQbGFjZW1lbnQgPSBnZXRTaWRlKGluaXRpYWxQbGFjZW1lbnQpID09PSBpbml0aWFsUGxhY2VtZW50O1xuICAgICAgY29uc3QgcnRsID0gYXdhaXQgKHBsYXRmb3JtLmlzUlRMID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc1JUTChlbGVtZW50cy5mbG9hdGluZykpO1xuICAgICAgY29uc3QgZmFsbGJhY2tQbGFjZW1lbnRzID0gc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzIHx8IChpc0Jhc2VQbGFjZW1lbnQgfHwgIWZsaXBBbGlnbm1lbnQgPyBbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQoaW5pdGlhbFBsYWNlbWVudCldIDogZ2V0RXhwYW5kZWRQbGFjZW1lbnRzKGluaXRpYWxQbGFjZW1lbnQpKTtcbiAgICAgIGNvbnN0IGhhc0ZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb24gPSBmYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uICE9PSAnbm9uZSc7XG4gICAgICBpZiAoIXNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyAmJiBoYXNGYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uKSB7XG4gICAgICAgIGZhbGxiYWNrUGxhY2VtZW50cy5wdXNoKC4uLmdldE9wcG9zaXRlQXhpc1BsYWNlbWVudHMoaW5pdGlhbFBsYWNlbWVudCwgZmxpcEFsaWdubWVudCwgZmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbiwgcnRsKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwbGFjZW1lbnRzID0gW2luaXRpYWxQbGFjZW1lbnQsIC4uLmZhbGxiYWNrUGxhY2VtZW50c107XG4gICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzID0gW107XG4gICAgICBsZXQgb3ZlcmZsb3dzRGF0YSA9ICgoX21pZGRsZXdhcmVEYXRhJGZsaXAgPSBtaWRkbGV3YXJlRGF0YS5mbGlwKSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJGZsaXAub3ZlcmZsb3dzKSB8fCBbXTtcbiAgICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICAgIG92ZXJmbG93cy5wdXNoKG92ZXJmbG93W3NpZGVdKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVja0Nyb3NzQXhpcykge1xuICAgICAgICBjb25zdCBzaWRlcyA9IGdldEFsaWdubWVudFNpZGVzKHBsYWNlbWVudCwgcmVjdHMsIHJ0bCk7XG4gICAgICAgIG92ZXJmbG93cy5wdXNoKG92ZXJmbG93W3NpZGVzWzBdXSwgb3ZlcmZsb3dbc2lkZXNbMV1dKTtcbiAgICAgIH1cbiAgICAgIG92ZXJmbG93c0RhdGEgPSBbLi4ub3ZlcmZsb3dzRGF0YSwge1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG92ZXJmbG93c1xuICAgICAgfV07XG5cbiAgICAgIC8vIE9uZSBvciBtb3JlIHNpZGVzIGlzIG92ZXJmbG93aW5nLlxuICAgICAgaWYgKCFvdmVyZmxvd3MuZXZlcnkoc2lkZSA9PiBzaWRlIDw9IDApKSB7XG4gICAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkZmxpcDIsIF9vdmVyZmxvd3NEYXRhJGZpbHRlcjtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gKCgoX21pZGRsZXdhcmVEYXRhJGZsaXAyID0gbWlkZGxld2FyZURhdGEuZmxpcCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRmbGlwMi5pbmRleCkgfHwgMCkgKyAxO1xuICAgICAgICBjb25zdCBuZXh0UGxhY2VtZW50ID0gcGxhY2VtZW50c1tuZXh0SW5kZXhdO1xuICAgICAgICBpZiAobmV4dFBsYWNlbWVudCkge1xuICAgICAgICAgIC8vIFRyeSBuZXh0IHBsYWNlbWVudCBhbmQgcmUtcnVuIHRoZSBsaWZlY3ljbGUuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgaW5kZXg6IG5leHRJbmRleCxcbiAgICAgICAgICAgICAgb3ZlcmZsb3dzOiBvdmVyZmxvd3NEYXRhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgICAgcGxhY2VtZW50OiBuZXh0UGxhY2VtZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpcnN0LCBmaW5kIHRoZSBjYW5kaWRhdGVzIHRoYXQgZml0IG9uIHRoZSBtYWluQXhpcyBzaWRlIG9mIG92ZXJmbG93LFxuICAgICAgICAvLyB0aGVuIGZpbmQgdGhlIHBsYWNlbWVudCB0aGF0IGZpdHMgdGhlIGJlc3Qgb24gdGhlIG1haW4gY3Jvc3NBeGlzIHNpZGUuXG4gICAgICAgIGxldCByZXNldFBsYWNlbWVudCA9IChfb3ZlcmZsb3dzRGF0YSRmaWx0ZXIgPSBvdmVyZmxvd3NEYXRhLmZpbHRlcihkID0+IGQub3ZlcmZsb3dzWzBdIDw9IDApLnNvcnQoKGEsIGIpID0+IGEub3ZlcmZsb3dzWzFdIC0gYi5vdmVyZmxvd3NbMV0pWzBdKSA9PSBudWxsID8gdm9pZCAwIDogX292ZXJmbG93c0RhdGEkZmlsdGVyLnBsYWNlbWVudDtcblxuICAgICAgICAvLyBPdGhlcndpc2UgZmFsbGJhY2suXG4gICAgICAgIGlmICghcmVzZXRQbGFjZW1lbnQpIHtcbiAgICAgICAgICBzd2l0Y2ggKGZhbGxiYWNrU3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Jlc3RGaXQnOlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIF9vdmVyZmxvd3NEYXRhJGZpbHRlcjI7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gKF9vdmVyZmxvd3NEYXRhJGZpbHRlcjIgPSBvdmVyZmxvd3NEYXRhLmZpbHRlcihkID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChoYXNGYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTaWRlQXhpcyA9IGdldFNpZGVBeGlzKGQucGxhY2VtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTaWRlQXhpcyA9PT0gaW5pdGlhbFNpZGVBeGlzIHx8XG4gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGJpYXMgdG8gdGhlIGB5YCBzaWRlIGF4aXMgZHVlIHRvIGhvcml6b250YWxcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVhZGluZyBkaXJlY3Rpb25zIGZhdm9yaW5nIGdyZWF0ZXIgd2lkdGguXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTaWRlQXhpcyA9PT0gJ3knO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSkubWFwKGQgPT4gW2QucGxhY2VtZW50LCBkLm92ZXJmbG93cy5maWx0ZXIob3ZlcmZsb3cgPT4gb3ZlcmZsb3cgPiAwKS5yZWR1Y2UoKGFjYywgb3ZlcmZsb3cpID0+IGFjYyArIG92ZXJmbG93LCAwKV0pLnNvcnQoKGEsIGIpID0+IGFbMV0gLSBiWzFdKVswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9vdmVyZmxvd3NEYXRhJGZpbHRlcjJbMF07XG4gICAgICAgICAgICAgICAgaWYgKHBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgcmVzZXRQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdpbml0aWFsUGxhY2VtZW50JzpcbiAgICAgICAgICAgICAgcmVzZXRQbGFjZW1lbnQgPSBpbml0aWFsUGxhY2VtZW50O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYWNlbWVudCAhPT0gcmVzZXRQbGFjZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgICAgcGxhY2VtZW50OiByZXNldFBsYWNlbWVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG59O1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogb3ZlcmZsb3cudG9wIC0gcmVjdC5oZWlnaHQsXG4gICAgcmlnaHQ6IG92ZXJmbG93LnJpZ2h0IC0gcmVjdC53aWR0aCxcbiAgICBib3R0b206IG92ZXJmbG93LmJvdHRvbSAtIHJlY3QuaGVpZ2h0LFxuICAgIGxlZnQ6IG92ZXJmbG93LmxlZnQgLSByZWN0LndpZHRoXG4gIH07XG59XG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIHNpZGVzLnNvbWUoc2lkZSA9PiBvdmVyZmxvd1tzaWRlXSA+PSAwKTtcbn1cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBoaWRlIHRoZSBmbG9hdGluZyBlbGVtZW50IGluIGFwcGxpY2FibGUgc2l0dWF0aW9ucywgc3VjaCBhc1xuICogd2hlbiBpdCBpcyBub3QgaW4gdGhlIHNhbWUgY2xpcHBpbmcgY29udGV4dCBhcyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaGlkZVxuICovXG5jb25zdCBoaWRlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdoaWRlJyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJlY3RzXG4gICAgICB9ID0gc3RhdGU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0cmF0ZWd5ID0gJ3JlZmVyZW5jZUhpZGRlbicsXG4gICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICAgICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcbiAgICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHtcbiAgICAgICAgY2FzZSAncmVmZXJlbmNlSGlkZGVuJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICAgICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyxcbiAgICAgICAgICAgICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdHMucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VIaWRkZW5PZmZzZXRzOiBvZmZzZXRzLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZUhpZGRlbjogaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG9mZnNldHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdlc2NhcGVkJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICAgICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyxcbiAgICAgICAgICAgICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0cy5mbG9hdGluZyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZXNjYXBlZE9mZnNldHM6IG9mZnNldHMsXG4gICAgICAgICAgICAgICAgZXNjYXBlZDogaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG9mZnNldHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxuZnVuY3Rpb24gZ2V0Qm91bmRpbmdSZWN0KHJlY3RzKSB7XG4gIGNvbnN0IG1pblggPSBtaW4oLi4ucmVjdHMubWFwKHJlY3QgPT4gcmVjdC5sZWZ0KSk7XG4gIGNvbnN0IG1pblkgPSBtaW4oLi4ucmVjdHMubWFwKHJlY3QgPT4gcmVjdC50b3ApKTtcbiAgY29uc3QgbWF4WCA9IG1heCguLi5yZWN0cy5tYXAocmVjdCA9PiByZWN0LnJpZ2h0KSk7XG4gIGNvbnN0IG1heFkgPSBtYXgoLi4ucmVjdHMubWFwKHJlY3QgPT4gcmVjdC5ib3R0b20pKTtcbiAgcmV0dXJuIHtcbiAgICB4OiBtaW5YLFxuICAgIHk6IG1pblksXG4gICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgIGhlaWdodDogbWF4WSAtIG1pbllcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFJlY3RzQnlMaW5lKHJlY3RzKSB7XG4gIGNvbnN0IHNvcnRlZFJlY3RzID0gcmVjdHMuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiBhLnkgLSBiLnkpO1xuICBjb25zdCBncm91cHMgPSBbXTtcbiAgbGV0IHByZXZSZWN0ID0gbnVsbDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRSZWN0cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHJlY3QgPSBzb3J0ZWRSZWN0c1tpXTtcbiAgICBpZiAoIXByZXZSZWN0IHx8IHJlY3QueSAtIHByZXZSZWN0LnkgPiBwcmV2UmVjdC5oZWlnaHQgLyAyKSB7XG4gICAgICBncm91cHMucHVzaChbcmVjdF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBncm91cHNbZ3JvdXBzLmxlbmd0aCAtIDFdLnB1c2gocmVjdCk7XG4gICAgfVxuICAgIHByZXZSZWN0ID0gcmVjdDtcbiAgfVxuICByZXR1cm4gZ3JvdXBzLm1hcChyZWN0ID0+IHJlY3RUb0NsaWVudFJlY3QoZ2V0Qm91bmRpbmdSZWN0KHJlY3QpKSk7XG59XG4vKipcbiAqIFByb3ZpZGVzIGltcHJvdmVkIHBvc2l0aW9uaW5nIGZvciBpbmxpbmUgcmVmZXJlbmNlIGVsZW1lbnRzIHRoYXQgY2FuIHNwYW5cbiAqIG92ZXIgbXVsdGlwbGUgbGluZXMsIHN1Y2ggYXMgaHlwZXJsaW5rcyBvciByYW5nZSBzZWxlY3Rpb25zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2lubGluZVxuICovXG5jb25zdCBpbmxpbmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2lubGluZScsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICByZWN0cyxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIHN0cmF0ZWd5XG4gICAgICB9ID0gc3RhdGU7XG4gICAgICAvLyBBIE1vdXNlRXZlbnQncyBjbGllbnR7WCxZfSBjb29yZHMgY2FuIGJlIHVwIHRvIDIgcGl4ZWxzIG9mZiBhXG4gICAgICAvLyBDbGllbnRSZWN0J3MgYm91bmRzLCBkZXNwaXRlIHRoZSBldmVudCBsaXN0ZW5lciBiZWluZyB0cmlnZ2VyZWQuIEFcbiAgICAgIC8vIHBhZGRpbmcgb2YgMiBzZWVtcyB0byBoYW5kbGUgdGhpcyBpc3N1ZS5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGFkZGluZyA9IDIsXG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBjb25zdCBuYXRpdmVDbGllbnRSZWN0cyA9IEFycmF5LmZyb20oKGF3YWl0IChwbGF0Zm9ybS5nZXRDbGllbnRSZWN0cyA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0Q2xpZW50UmVjdHMoZWxlbWVudHMucmVmZXJlbmNlKSkpIHx8IFtdKTtcbiAgICAgIGNvbnN0IGNsaWVudFJlY3RzID0gZ2V0UmVjdHNCeUxpbmUobmF0aXZlQ2xpZW50UmVjdHMpO1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSByZWN0VG9DbGllbnRSZWN0KGdldEJvdW5kaW5nUmVjdChuYXRpdmVDbGllbnRSZWN0cykpO1xuICAgICAgY29uc3QgcGFkZGluZ09iamVjdCA9IGdldFBhZGRpbmdPYmplY3QocGFkZGluZyk7XG4gICAgICBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSB0d28gcmVjdHMgYW5kIHRoZXkgYXJlIGRpc2pvaW5lZC5cbiAgICAgICAgaWYgKGNsaWVudFJlY3RzLmxlbmd0aCA9PT0gMiAmJiBjbGllbnRSZWN0c1swXS5sZWZ0ID4gY2xpZW50UmVjdHNbMV0ucmlnaHQgJiYgeCAhPSBudWxsICYmIHkgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IHJlY3QgaW4gd2hpY2ggdGhlIHBvaW50IGlzIGZ1bGx5IGluc2lkZS5cbiAgICAgICAgICByZXR1cm4gY2xpZW50UmVjdHMuZmluZChyZWN0ID0+IHggPiByZWN0LmxlZnQgLSBwYWRkaW5nT2JqZWN0LmxlZnQgJiYgeCA8IHJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0ICYmIHkgPiByZWN0LnRvcCAtIHBhZGRpbmdPYmplY3QudG9wICYmIHkgPCByZWN0LmJvdHRvbSArIHBhZGRpbmdPYmplY3QuYm90dG9tKSB8fCBmYWxsYmFjaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZXJlIGFyZSAyIG9yIG1vcmUgY29ubmVjdGVkIHJlY3RzLlxuICAgICAgICBpZiAoY2xpZW50UmVjdHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICBpZiAoZ2V0U2lkZUF4aXMocGxhY2VtZW50KSA9PT0gJ3knKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFJlY3QgPSBjbGllbnRSZWN0c1swXTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RSZWN0ID0gY2xpZW50UmVjdHNbY2xpZW50UmVjdHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBpc1RvcCA9IGdldFNpZGUocGxhY2VtZW50KSA9PT0gJ3RvcCc7XG4gICAgICAgICAgICBjb25zdCB0b3AgPSBmaXJzdFJlY3QudG9wO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gbGFzdFJlY3QuYm90dG9tO1xuICAgICAgICAgICAgY29uc3QgbGVmdCA9IGlzVG9wID8gZmlyc3RSZWN0LmxlZnQgOiBsYXN0UmVjdC5sZWZ0O1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBpc1RvcCA/IGZpcnN0UmVjdC5yaWdodCA6IGxhc3RSZWN0LnJpZ2h0O1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICAgIGJvdHRvbSxcbiAgICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgICAgcmlnaHQsXG4gICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgIHg6IGxlZnQsXG4gICAgICAgICAgICAgIHk6IHRvcFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaXNMZWZ0U2lkZSA9IGdldFNpZGUocGxhY2VtZW50KSA9PT0gJ2xlZnQnO1xuICAgICAgICAgIGNvbnN0IG1heFJpZ2h0ID0gbWF4KC4uLmNsaWVudFJlY3RzLm1hcChyZWN0ID0+IHJlY3QucmlnaHQpKTtcbiAgICAgICAgICBjb25zdCBtaW5MZWZ0ID0gbWluKC4uLmNsaWVudFJlY3RzLm1hcChyZWN0ID0+IHJlY3QubGVmdCkpO1xuICAgICAgICAgIGNvbnN0IG1lYXN1cmVSZWN0cyA9IGNsaWVudFJlY3RzLmZpbHRlcihyZWN0ID0+IGlzTGVmdFNpZGUgPyByZWN0LmxlZnQgPT09IG1pbkxlZnQgOiByZWN0LnJpZ2h0ID09PSBtYXhSaWdodCk7XG4gICAgICAgICAgY29uc3QgdG9wID0gbWVhc3VyZVJlY3RzWzBdLnRvcDtcbiAgICAgICAgICBjb25zdCBib3R0b20gPSBtZWFzdXJlUmVjdHNbbWVhc3VyZVJlY3RzLmxlbmd0aCAtIDFdLmJvdHRvbTtcbiAgICAgICAgICBjb25zdCBsZWZ0ID0gbWluTGVmdDtcbiAgICAgICAgICBjb25zdCByaWdodCA9IG1heFJpZ2h0O1xuICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgYm90dG9tLFxuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICB4OiBsZWZ0LFxuICAgICAgICAgICAgeTogdG9wXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNldFJlY3RzID0gYXdhaXQgcGxhdGZvcm0uZ2V0RWxlbWVudFJlY3RzKHtcbiAgICAgICAgcmVmZXJlbmNlOiB7XG4gICAgICAgICAgZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG4gICAgICAgIH0sXG4gICAgICAgIGZsb2F0aW5nOiBlbGVtZW50cy5mbG9hdGluZyxcbiAgICAgICAgc3RyYXRlZ3lcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlY3RzLnJlZmVyZW5jZS54ICE9PSByZXNldFJlY3RzLnJlZmVyZW5jZS54IHx8IHJlY3RzLnJlZmVyZW5jZS55ICE9PSByZXNldFJlY3RzLnJlZmVyZW5jZS55IHx8IHJlY3RzLnJlZmVyZW5jZS53aWR0aCAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2Uud2lkdGggfHwgcmVjdHMucmVmZXJlbmNlLmhlaWdodCAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2UuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHJlY3RzOiByZXNldFJlY3RzXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbn07XG5cbi8vIEZvciB0eXBlIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LCB0aGUgYE9mZnNldE9wdGlvbnNgIHR5cGUgd2FzIGFsc29cbi8vIERlcml2YWJsZS5cblxuYXN5bmMgZnVuY3Rpb24gY29udmVydFZhbHVlVG9Db29yZHMoc3RhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIHBsYWNlbWVudCxcbiAgICBwbGF0Zm9ybSxcbiAgICBlbGVtZW50c1xuICB9ID0gc3RhdGU7XG4gIGNvbnN0IHJ0bCA9IGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKTtcbiAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCk7XG4gIGNvbnN0IGlzVmVydGljYWwgPSBnZXRTaWRlQXhpcyhwbGFjZW1lbnQpID09PSAneSc7XG4gIGNvbnN0IG1haW5BeGlzTXVsdGkgPSBbJ2xlZnQnLCAndG9wJ10uaW5jbHVkZXMoc2lkZSkgPyAtMSA6IDE7XG4gIGNvbnN0IGNyb3NzQXhpc011bHRpID0gcnRsICYmIGlzVmVydGljYWwgPyAtMSA6IDE7XG4gIGNvbnN0IHJhd1ZhbHVlID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgbGV0IHtcbiAgICBtYWluQXhpcyxcbiAgICBjcm9zc0F4aXMsXG4gICAgYWxpZ25tZW50QXhpc1xuICB9ID0gdHlwZW9mIHJhd1ZhbHVlID09PSAnbnVtYmVyJyA/IHtcbiAgICBtYWluQXhpczogcmF3VmFsdWUsXG4gICAgY3Jvc3NBeGlzOiAwLFxuICAgIGFsaWdubWVudEF4aXM6IG51bGxcbiAgfSA6IHtcbiAgICBtYWluQXhpczogMCxcbiAgICBjcm9zc0F4aXM6IDAsXG4gICAgYWxpZ25tZW50QXhpczogbnVsbCxcbiAgICAuLi5yYXdWYWx1ZVxuICB9O1xuICBpZiAoYWxpZ25tZW50ICYmIHR5cGVvZiBhbGlnbm1lbnRBeGlzID09PSAnbnVtYmVyJykge1xuICAgIGNyb3NzQXhpcyA9IGFsaWdubWVudCA9PT0gJ2VuZCcgPyBhbGlnbm1lbnRBeGlzICogLTEgOiBhbGlnbm1lbnRBeGlzO1xuICB9XG4gIHJldHVybiBpc1ZlcnRpY2FsID8ge1xuICAgIHg6IGNyb3NzQXhpcyAqIGNyb3NzQXhpc011bHRpLFxuICAgIHk6IG1haW5BeGlzICogbWFpbkF4aXNNdWx0aVxuICB9IDoge1xuICAgIHg6IG1haW5BeGlzICogbWFpbkF4aXNNdWx0aSxcbiAgICB5OiBjcm9zc0F4aXMgKiBjcm9zc0F4aXNNdWx0aVxuICB9O1xufVxuXG4vKipcbiAqIE1vZGlmaWVzIHRoZSBwbGFjZW1lbnQgYnkgdHJhbnNsYXRpbmcgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYWxvbmcgdGhlXG4gKiBzcGVjaWZpZWQgYXhlcy5cbiAqIEEgbnVtYmVyIChzaG9ydGhhbmQgZm9yIGBtYWluQXhpc2Agb3IgZGlzdGFuY2UpLCBvciBhbiBheGVzIGNvbmZpZ3VyYXRpb25cbiAqIG9iamVjdCBtYXkgYmUgcGFzc2VkLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL29mZnNldFxuICovXG5jb25zdCBvZmZzZXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IDA7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICB2YXIgX21pZGRsZXdhcmVEYXRhJG9mZnNlLCBfbWlkZGxld2FyZURhdGEkYXJyb3c7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgbWlkZGxld2FyZURhdGFcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IGRpZmZDb29yZHMgPSBhd2FpdCBjb252ZXJ0VmFsdWVUb0Nvb3JkcyhzdGF0ZSwgb3B0aW9ucyk7XG5cbiAgICAgIC8vIElmIHRoZSBwbGFjZW1lbnQgaXMgdGhlIHNhbWUgYW5kIHRoZSBhcnJvdyBjYXVzZWQgYW4gYWxpZ25tZW50IG9mZnNldFxuICAgICAgLy8gdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGNoYW5nZSB0aGUgcG9zaXRpb25pbmcgY29vcmRpbmF0ZXMuXG4gICAgICBpZiAocGxhY2VtZW50ID09PSAoKF9taWRkbGV3YXJlRGF0YSRvZmZzZSA9IG1pZGRsZXdhcmVEYXRhLm9mZnNldCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRvZmZzZS5wbGFjZW1lbnQpICYmIChfbWlkZGxld2FyZURhdGEkYXJyb3cgPSBtaWRkbGV3YXJlRGF0YS5hcnJvdykgIT0gbnVsbCAmJiBfbWlkZGxld2FyZURhdGEkYXJyb3cuYWxpZ25tZW50T2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHggKyBkaWZmQ29vcmRzLngsXG4gICAgICAgIHk6IHkgKyBkaWZmQ29vcmRzLnksXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAuLi5kaWZmQ29vcmRzLFxuICAgICAgICAgIHBsYWNlbWVudFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IHNoaWZ0aW5nIGl0IGluIG9yZGVyIHRvXG4gKiBrZWVwIGl0IGluIHZpZXcgd2hlbiBpdCB3aWxsIG92ZXJmbG93IHRoZSBjbGlwcGluZyBib3VuZGFyeS5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9zaGlmdFxuICovXG5jb25zdCBzaGlmdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnc2hpZnQnLFxuICAgIG9wdGlvbnMsXG4gICAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgcGxhY2VtZW50XG4gICAgICB9ID0gc3RhdGU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1haW5BeGlzOiBjaGVja01haW5BeGlzID0gdHJ1ZSxcbiAgICAgICAgY3Jvc3NBeGlzOiBjaGVja0Nyb3NzQXhpcyA9IGZhbHNlLFxuICAgICAgICBsaW1pdGVyID0ge1xuICAgICAgICAgIGZuOiBfcmVmID0+IHtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgIHlcbiAgICAgICAgICAgIH0gPSBfcmVmO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICAgICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfTtcbiAgICAgIGNvbnN0IG92ZXJmbG93ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIGRldGVjdE92ZXJmbG93T3B0aW9ucyk7XG4gICAgICBjb25zdCBjcm9zc0F4aXMgPSBnZXRTaWRlQXhpcyhnZXRTaWRlKHBsYWNlbWVudCkpO1xuICAgICAgY29uc3QgbWFpbkF4aXMgPSBnZXRPcHBvc2l0ZUF4aXMoY3Jvc3NBeGlzKTtcbiAgICAgIGxldCBtYWluQXhpc0Nvb3JkID0gY29vcmRzW21haW5BeGlzXTtcbiAgICAgIGxldCBjcm9zc0F4aXNDb29yZCA9IGNvb3Jkc1tjcm9zc0F4aXNdO1xuICAgICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgICAgY29uc3QgbWluU2lkZSA9IG1haW5BeGlzID09PSAneScgPyAndG9wJyA6ICdsZWZ0JztcbiAgICAgICAgY29uc3QgbWF4U2lkZSA9IG1haW5BeGlzID09PSAneScgPyAnYm90dG9tJyA6ICdyaWdodCc7XG4gICAgICAgIGNvbnN0IG1pbiA9IG1haW5BeGlzQ29vcmQgKyBvdmVyZmxvd1ttaW5TaWRlXTtcbiAgICAgICAgY29uc3QgbWF4ID0gbWFpbkF4aXNDb29yZCAtIG92ZXJmbG93W21heFNpZGVdO1xuICAgICAgICBtYWluQXhpc0Nvb3JkID0gY2xhbXAobWluLCBtYWluQXhpc0Nvb3JkLCBtYXgpO1xuICAgICAgfVxuICAgICAgaWYgKGNoZWNrQ3Jvc3NBeGlzKSB7XG4gICAgICAgIGNvbnN0IG1pblNpZGUgPSBjcm9zc0F4aXMgPT09ICd5JyA/ICd0b3AnIDogJ2xlZnQnO1xuICAgICAgICBjb25zdCBtYXhTaWRlID0gY3Jvc3NBeGlzID09PSAneScgPyAnYm90dG9tJyA6ICdyaWdodCc7XG4gICAgICAgIGNvbnN0IG1pbiA9IGNyb3NzQXhpc0Nvb3JkICsgb3ZlcmZsb3dbbWluU2lkZV07XG4gICAgICAgIGNvbnN0IG1heCA9IGNyb3NzQXhpc0Nvb3JkIC0gb3ZlcmZsb3dbbWF4U2lkZV07XG4gICAgICAgIGNyb3NzQXhpc0Nvb3JkID0gY2xhbXAobWluLCBjcm9zc0F4aXNDb29yZCwgbWF4KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxpbWl0ZWRDb29yZHMgPSBsaW1pdGVyLmZuKHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIFttYWluQXhpc106IG1haW5BeGlzQ29vcmQsXG4gICAgICAgIFtjcm9zc0F4aXNdOiBjcm9zc0F4aXNDb29yZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5saW1pdGVkQ29vcmRzLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgeDogbGltaXRlZENvb3Jkcy54IC0geCxcbiAgICAgICAgICB5OiBsaW1pdGVkQ29vcmRzLnkgLSB5XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcbi8qKlxuICogQnVpbHQtaW4gYGxpbWl0ZXJgIHRoYXQgd2lsbCBzdG9wIGBzaGlmdCgpYCBhdCBhIGNlcnRhaW4gcG9pbnQuXG4gKi9cbmNvbnN0IGxpbWl0U2hpZnQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgb3B0aW9ucyxcbiAgICBmbihzdGF0ZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIHJlY3RzLFxuICAgICAgICBtaWRkbGV3YXJlRGF0YVxuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBvZmZzZXQgPSAwLFxuICAgICAgICBtYWluQXhpczogY2hlY2tNYWluQXhpcyA9IHRydWUsXG4gICAgICAgIGNyb3NzQXhpczogY2hlY2tDcm9zc0F4aXMgPSB0cnVlXG4gICAgICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuICAgICAgY29uc3QgY29vcmRzID0ge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9O1xuICAgICAgY29uc3QgY3Jvc3NBeGlzID0gZ2V0U2lkZUF4aXMocGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IG1haW5BeGlzID0gZ2V0T3Bwb3NpdGVBeGlzKGNyb3NzQXhpcyk7XG4gICAgICBsZXQgbWFpbkF4aXNDb29yZCA9IGNvb3Jkc1ttYWluQXhpc107XG4gICAgICBsZXQgY3Jvc3NBeGlzQ29vcmQgPSBjb29yZHNbY3Jvc3NBeGlzXTtcbiAgICAgIGNvbnN0IHJhd09mZnNldCA9IGV2YWx1YXRlKG9mZnNldCwgc3RhdGUpO1xuICAgICAgY29uc3QgY29tcHV0ZWRPZmZzZXQgPSB0eXBlb2YgcmF3T2Zmc2V0ID09PSAnbnVtYmVyJyA/IHtcbiAgICAgICAgbWFpbkF4aXM6IHJhd09mZnNldCxcbiAgICAgICAgY3Jvc3NBeGlzOiAwXG4gICAgICB9IDoge1xuICAgICAgICBtYWluQXhpczogMCxcbiAgICAgICAgY3Jvc3NBeGlzOiAwLFxuICAgICAgICAuLi5yYXdPZmZzZXRcbiAgICAgIH07XG4gICAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgICBjb25zdCBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgICAgICBjb25zdCBsaW1pdE1pbiA9IHJlY3RzLnJlZmVyZW5jZVttYWluQXhpc10gLSByZWN0cy5mbG9hdGluZ1tsZW5dICsgY29tcHV0ZWRPZmZzZXQubWFpbkF4aXM7XG4gICAgICAgIGNvbnN0IGxpbWl0TWF4ID0gcmVjdHMucmVmZXJlbmNlW21haW5BeGlzXSArIHJlY3RzLnJlZmVyZW5jZVtsZW5dIC0gY29tcHV0ZWRPZmZzZXQubWFpbkF4aXM7XG4gICAgICAgIGlmIChtYWluQXhpc0Nvb3JkIDwgbGltaXRNaW4pIHtcbiAgICAgICAgICBtYWluQXhpc0Nvb3JkID0gbGltaXRNaW47XG4gICAgICAgIH0gZWxzZSBpZiAobWFpbkF4aXNDb29yZCA+IGxpbWl0TWF4KSB7XG4gICAgICAgICAgbWFpbkF4aXNDb29yZCA9IGxpbWl0TWF4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tDcm9zc0F4aXMpIHtcbiAgICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRvZmZzZSwgX21pZGRsZXdhcmVEYXRhJG9mZnNlMjtcbiAgICAgICAgY29uc3QgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICAgICAgY29uc3QgaXNPcmlnaW5TaWRlID0gWyd0b3AnLCAnbGVmdCddLmluY2x1ZGVzKGdldFNpZGUocGxhY2VtZW50KSk7XG4gICAgICAgIGNvbnN0IGxpbWl0TWluID0gcmVjdHMucmVmZXJlbmNlW2Nyb3NzQXhpc10gLSByZWN0cy5mbG9hdGluZ1tsZW5dICsgKGlzT3JpZ2luU2lkZSA/ICgoX21pZGRsZXdhcmVEYXRhJG9mZnNlID0gbWlkZGxld2FyZURhdGEub2Zmc2V0KSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJG9mZnNlW2Nyb3NzQXhpc10pIHx8IDAgOiAwKSArIChpc09yaWdpblNpZGUgPyAwIDogY29tcHV0ZWRPZmZzZXQuY3Jvc3NBeGlzKTtcbiAgICAgICAgY29uc3QgbGltaXRNYXggPSByZWN0cy5yZWZlcmVuY2VbY3Jvc3NBeGlzXSArIHJlY3RzLnJlZmVyZW5jZVtsZW5dICsgKGlzT3JpZ2luU2lkZSA/IDAgOiAoKF9taWRkbGV3YXJlRGF0YSRvZmZzZTIgPSBtaWRkbGV3YXJlRGF0YS5vZmZzZXQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkb2Zmc2UyW2Nyb3NzQXhpc10pIHx8IDApIC0gKGlzT3JpZ2luU2lkZSA/IGNvbXB1dGVkT2Zmc2V0LmNyb3NzQXhpcyA6IDApO1xuICAgICAgICBpZiAoY3Jvc3NBeGlzQ29vcmQgPCBsaW1pdE1pbikge1xuICAgICAgICAgIGNyb3NzQXhpc0Nvb3JkID0gbGltaXRNaW47XG4gICAgICAgIH0gZWxzZSBpZiAoY3Jvc3NBeGlzQ29vcmQgPiBsaW1pdE1heCkge1xuICAgICAgICAgIGNyb3NzQXhpc0Nvb3JkID0gbGltaXRNYXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIFttYWluQXhpc106IG1haW5BeGlzQ29vcmQsXG4gICAgICAgIFtjcm9zc0F4aXNdOiBjcm9zc0F4aXNDb29yZFxuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdGhhdCBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCDigJRcbiAqIGZvciBpbnN0YW5jZSwgcHJldmVudCBpdCBmcm9tIG92ZXJmbG93aW5nIHRoZSBjbGlwcGluZyBib3VuZGFyeSBvciBtYXRjaCB0aGVcbiAqIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9zaXplXG4gKi9cbmNvbnN0IHNpemUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3NpemUnLFxuICAgIG9wdGlvbnMsXG4gICAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICByZWN0cyxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGVsZW1lbnRzXG4gICAgICB9ID0gc3RhdGU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFwcGx5ID0gKCkgPT4ge30sXG4gICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICAgICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIGRldGVjdE92ZXJmbG93T3B0aW9ucyk7XG4gICAgICBjb25zdCBzaWRlID0gZ2V0U2lkZShwbGFjZW1lbnQpO1xuICAgICAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCk7XG4gICAgICBjb25zdCBpc1lBeGlzID0gZ2V0U2lkZUF4aXMocGxhY2VtZW50KSA9PT0gJ3knO1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9ID0gcmVjdHMuZmxvYXRpbmc7XG4gICAgICBsZXQgaGVpZ2h0U2lkZTtcbiAgICAgIGxldCB3aWR0aFNpZGU7XG4gICAgICBpZiAoc2lkZSA9PT0gJ3RvcCcgfHwgc2lkZSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgaGVpZ2h0U2lkZSA9IHNpZGU7XG4gICAgICAgIHdpZHRoU2lkZSA9IGFsaWdubWVudCA9PT0gKChhd2FpdCAocGxhdGZvcm0uaXNSVEwgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzUlRMKGVsZW1lbnRzLmZsb2F0aW5nKSkpID8gJ3N0YXJ0JyA6ICdlbmQnKSA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aWR0aFNpZGUgPSBzaWRlO1xuICAgICAgICBoZWlnaHRTaWRlID0gYWxpZ25tZW50ID09PSAnZW5kJyA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXhpbXVtQ2xpcHBpbmdIZWlnaHQgPSBoZWlnaHQgLSBvdmVyZmxvdy50b3AgLSBvdmVyZmxvdy5ib3R0b207XG4gICAgICBjb25zdCBtYXhpbXVtQ2xpcHBpbmdXaWR0aCA9IHdpZHRoIC0gb3ZlcmZsb3cubGVmdCAtIG92ZXJmbG93LnJpZ2h0O1xuICAgICAgY29uc3Qgb3ZlcmZsb3dBdmFpbGFibGVIZWlnaHQgPSBtaW4oaGVpZ2h0IC0gb3ZlcmZsb3dbaGVpZ2h0U2lkZV0sIG1heGltdW1DbGlwcGluZ0hlaWdodCk7XG4gICAgICBjb25zdCBvdmVyZmxvd0F2YWlsYWJsZVdpZHRoID0gbWluKHdpZHRoIC0gb3ZlcmZsb3dbd2lkdGhTaWRlXSwgbWF4aW11bUNsaXBwaW5nV2lkdGgpO1xuICAgICAgY29uc3Qgbm9TaGlmdCA9ICFzdGF0ZS5taWRkbGV3YXJlRGF0YS5zaGlmdDtcbiAgICAgIGxldCBhdmFpbGFibGVIZWlnaHQgPSBvdmVyZmxvd0F2YWlsYWJsZUhlaWdodDtcbiAgICAgIGxldCBhdmFpbGFibGVXaWR0aCA9IG92ZXJmbG93QXZhaWxhYmxlV2lkdGg7XG4gICAgICBpZiAoaXNZQXhpcykge1xuICAgICAgICBhdmFpbGFibGVXaWR0aCA9IGFsaWdubWVudCB8fCBub1NoaWZ0ID8gbWluKG92ZXJmbG93QXZhaWxhYmxlV2lkdGgsIG1heGltdW1DbGlwcGluZ1dpZHRoKSA6IG1heGltdW1DbGlwcGluZ1dpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXZhaWxhYmxlSGVpZ2h0ID0gYWxpZ25tZW50IHx8IG5vU2hpZnQgPyBtaW4ob3ZlcmZsb3dBdmFpbGFibGVIZWlnaHQsIG1heGltdW1DbGlwcGluZ0hlaWdodCkgOiBtYXhpbXVtQ2xpcHBpbmdIZWlnaHQ7XG4gICAgICB9XG4gICAgICBpZiAobm9TaGlmdCAmJiAhYWxpZ25tZW50KSB7XG4gICAgICAgIGNvbnN0IHhNaW4gPSBtYXgob3ZlcmZsb3cubGVmdCwgMCk7XG4gICAgICAgIGNvbnN0IHhNYXggPSBtYXgob3ZlcmZsb3cucmlnaHQsIDApO1xuICAgICAgICBjb25zdCB5TWluID0gbWF4KG92ZXJmbG93LnRvcCwgMCk7XG4gICAgICAgIGNvbnN0IHlNYXggPSBtYXgob3ZlcmZsb3cuYm90dG9tLCAwKTtcbiAgICAgICAgaWYgKGlzWUF4aXMpIHtcbiAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IHdpZHRoIC0gMiAqICh4TWluICE9PSAwIHx8IHhNYXggIT09IDAgPyB4TWluICsgeE1heCA6IG1heChvdmVyZmxvdy5sZWZ0LCBvdmVyZmxvdy5yaWdodCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF2YWlsYWJsZUhlaWdodCA9IGhlaWdodCAtIDIgKiAoeU1pbiAhPT0gMCB8fCB5TWF4ICE9PSAwID8geU1pbiArIHlNYXggOiBtYXgob3ZlcmZsb3cudG9wLCBvdmVyZmxvdy5ib3R0b20pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgYXBwbHkoe1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgYXZhaWxhYmxlV2lkdGgsXG4gICAgICAgIGF2YWlsYWJsZUhlaWdodFxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXh0RGltZW5zaW9ucyA9IGF3YWl0IHBsYXRmb3JtLmdldERpbWVuc2lvbnMoZWxlbWVudHMuZmxvYXRpbmcpO1xuICAgICAgaWYgKHdpZHRoICE9PSBuZXh0RGltZW5zaW9ucy53aWR0aCB8fCBoZWlnaHQgIT09IG5leHREaW1lbnNpb25zLmhlaWdodCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICByZWN0czogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnQgeyBhcnJvdywgYXV0b1BsYWNlbWVudCwgY29tcHV0ZVBvc2l0aW9uLCBkZXRlY3RPdmVyZmxvdywgZmxpcCwgaGlkZSwgaW5saW5lLCBsaW1pdFNoaWZ0LCBvZmZzZXQsIHNoaWZ0LCBzaXplIH07XG4iLCJpbXBvcnQgeyByZWN0VG9DbGllbnRSZWN0LCBkZXRlY3RPdmVyZmxvdyBhcyBkZXRlY3RPdmVyZmxvdyQxLCBvZmZzZXQgYXMgb2Zmc2V0JDEsIGF1dG9QbGFjZW1lbnQgYXMgYXV0b1BsYWNlbWVudCQxLCBzaGlmdCBhcyBzaGlmdCQxLCBmbGlwIGFzIGZsaXAkMSwgc2l6ZSBhcyBzaXplJDEsIGhpZGUgYXMgaGlkZSQxLCBhcnJvdyBhcyBhcnJvdyQxLCBpbmxpbmUgYXMgaW5saW5lJDEsIGxpbWl0U2hpZnQgYXMgbGltaXRTaGlmdCQxLCBjb21wdXRlUG9zaXRpb24gYXMgY29tcHV0ZVBvc2l0aW9uJDEgfSBmcm9tICdAZmxvYXRpbmctdWkvY29yZSc7XG5pbXBvcnQgeyByb3VuZCwgY3JlYXRlQ29vcmRzLCBtYXgsIG1pbiwgZmxvb3IgfSBmcm9tICdAZmxvYXRpbmctdWkvdXRpbHMnO1xuaW1wb3J0IHsgZ2V0Q29tcHV0ZWRTdHlsZSwgaXNIVE1MRWxlbWVudCwgaXNFbGVtZW50LCBnZXRXaW5kb3csIGlzV2ViS2l0LCBnZXRGcmFtZUVsZW1lbnQsIGdldERvY3VtZW50RWxlbWVudCwgaXNUb3BMYXllciwgZ2V0Tm9kZU5hbWUsIGlzT3ZlcmZsb3dFbGVtZW50LCBnZXROb2RlU2Nyb2xsLCBnZXRPdmVyZmxvd0FuY2VzdG9ycywgZ2V0UGFyZW50Tm9kZSwgaXNMYXN0VHJhdmVyc2FibGVOb2RlLCBpc0NvbnRhaW5pbmdCbG9jaywgaXNUYWJsZUVsZW1lbnQsIGdldENvbnRhaW5pbmdCbG9jayB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscy9kb20nO1xuZXhwb3J0IHsgZ2V0T3ZlcmZsb3dBbmNlc3RvcnMgfSBmcm9tICdAZmxvYXRpbmctdWkvdXRpbHMvZG9tJztcblxuZnVuY3Rpb24gZ2V0Q3NzRGltZW5zaW9ucyhlbGVtZW50KSB7XG4gIGNvbnN0IGNzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIC8vIEluIHRlc3RpbmcgZW52aXJvbm1lbnRzLCB0aGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgcHJvcGVydGllcyBhcmUgZW1wdHlcbiAgLy8gc3RyaW5ncyBmb3IgU1ZHIGVsZW1lbnRzLCByZXR1cm5pbmcgTmFOLiBGYWxsYmFjayB0byBgMGAgaW4gdGhpcyBjYXNlLlxuICBsZXQgd2lkdGggPSBwYXJzZUZsb2F0KGNzcy53aWR0aCkgfHwgMDtcbiAgbGV0IGhlaWdodCA9IHBhcnNlRmxvYXQoY3NzLmhlaWdodCkgfHwgMDtcbiAgY29uc3QgaGFzT2Zmc2V0ID0gaXNIVE1MRWxlbWVudChlbGVtZW50KTtcbiAgY29uc3Qgb2Zmc2V0V2lkdGggPSBoYXNPZmZzZXQgPyBlbGVtZW50Lm9mZnNldFdpZHRoIDogd2lkdGg7XG4gIGNvbnN0IG9mZnNldEhlaWdodCA9IGhhc09mZnNldCA/IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IDogaGVpZ2h0O1xuICBjb25zdCBzaG91bGRGYWxsYmFjayA9IHJvdW5kKHdpZHRoKSAhPT0gb2Zmc2V0V2lkdGggfHwgcm91bmQoaGVpZ2h0KSAhPT0gb2Zmc2V0SGVpZ2h0O1xuICBpZiAoc2hvdWxkRmFsbGJhY2spIHtcbiAgICB3aWR0aCA9IG9mZnNldFdpZHRoO1xuICAgIGhlaWdodCA9IG9mZnNldEhlaWdodDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICAkOiBzaG91bGRGYWxsYmFja1xuICB9O1xufVxuXG5mdW5jdGlvbiB1bndyYXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuICFpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50LmNvbnRleHRFbGVtZW50IDogZWxlbWVudDtcbn1cblxuZnVuY3Rpb24gZ2V0U2NhbGUoZWxlbWVudCkge1xuICBjb25zdCBkb21FbGVtZW50ID0gdW53cmFwRWxlbWVudChlbGVtZW50KTtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGRvbUVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNvb3JkcygxKTtcbiAgfVxuICBjb25zdCByZWN0ID0gZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICAkXG4gIH0gPSBnZXRDc3NEaW1lbnNpb25zKGRvbUVsZW1lbnQpO1xuICBsZXQgeCA9ICgkID8gcm91bmQocmVjdC53aWR0aCkgOiByZWN0LndpZHRoKSAvIHdpZHRoO1xuICBsZXQgeSA9ICgkID8gcm91bmQocmVjdC5oZWlnaHQpIDogcmVjdC5oZWlnaHQpIC8gaGVpZ2h0O1xuXG4gIC8vIDAsIE5hTiwgb3IgSW5maW5pdHkgc2hvdWxkIGFsd2F5cyBmYWxsYmFjayB0byAxLlxuXG4gIGlmICgheCB8fCAhTnVtYmVyLmlzRmluaXRlKHgpKSB7XG4gICAgeCA9IDE7XG4gIH1cbiAgaWYgKCF5IHx8ICFOdW1iZXIuaXNGaW5pdGUoeSkpIHtcbiAgICB5ID0gMTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeVxuICB9O1xufVxuXG5jb25zdCBub09mZnNldHMgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29vcmRzKDApO1xuZnVuY3Rpb24gZ2V0VmlzdWFsT2Zmc2V0cyhlbGVtZW50KSB7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgaWYgKCFpc1dlYktpdCgpIHx8ICF3aW4udmlzdWFsVmlld3BvcnQpIHtcbiAgICByZXR1cm4gbm9PZmZzZXRzO1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogd2luLnZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQsXG4gICAgeTogd2luLnZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcFxuICB9O1xufVxuZnVuY3Rpb24gc2hvdWxkQWRkVmlzdWFsT2Zmc2V0cyhlbGVtZW50LCBpc0ZpeGVkLCBmbG9hdGluZ09mZnNldFBhcmVudCkge1xuICBpZiAoaXNGaXhlZCA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZCA9IGZhbHNlO1xuICB9XG4gIGlmICghZmxvYXRpbmdPZmZzZXRQYXJlbnQgfHwgaXNGaXhlZCAmJiBmbG9hdGluZ09mZnNldFBhcmVudCAhPT0gZ2V0V2luZG93KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBpc0ZpeGVkO1xufVxuXG5mdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgaW5jbHVkZVNjYWxlLCBpc0ZpeGVkU3RyYXRlZ3ksIG9mZnNldFBhcmVudCkge1xuICBpZiAoaW5jbHVkZVNjYWxlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlU2NhbGUgPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNGaXhlZFN0cmF0ZWd5ID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkU3RyYXRlZ3kgPSBmYWxzZTtcbiAgfVxuICBjb25zdCBjbGllbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgZG9tRWxlbWVudCA9IHVud3JhcEVsZW1lbnQoZWxlbWVudCk7XG4gIGxldCBzY2FsZSA9IGNyZWF0ZUNvb3JkcygxKTtcbiAgaWYgKGluY2x1ZGVTY2FsZSkge1xuICAgIGlmIChvZmZzZXRQYXJlbnQpIHtcbiAgICAgIGlmIChpc0VsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgICBzY2FsZSA9IGdldFNjYWxlKG9mZnNldFBhcmVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjYWxlID0gZ2V0U2NhbGUoZWxlbWVudCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHZpc3VhbE9mZnNldHMgPSBzaG91bGRBZGRWaXN1YWxPZmZzZXRzKGRvbUVsZW1lbnQsIGlzRml4ZWRTdHJhdGVneSwgb2Zmc2V0UGFyZW50KSA/IGdldFZpc3VhbE9mZnNldHMoZG9tRWxlbWVudCkgOiBjcmVhdGVDb29yZHMoMCk7XG4gIGxldCB4ID0gKGNsaWVudFJlY3QubGVmdCArIHZpc3VhbE9mZnNldHMueCkgLyBzY2FsZS54O1xuICBsZXQgeSA9IChjbGllbnRSZWN0LnRvcCArIHZpc3VhbE9mZnNldHMueSkgLyBzY2FsZS55O1xuICBsZXQgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoIC8gc2NhbGUueDtcbiAgbGV0IGhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0IC8gc2NhbGUueTtcbiAgaWYgKGRvbUVsZW1lbnQpIHtcbiAgICBjb25zdCB3aW4gPSBnZXRXaW5kb3coZG9tRWxlbWVudCk7XG4gICAgY29uc3Qgb2Zmc2V0V2luID0gb2Zmc2V0UGFyZW50ICYmIGlzRWxlbWVudChvZmZzZXRQYXJlbnQpID8gZ2V0V2luZG93KG9mZnNldFBhcmVudCkgOiBvZmZzZXRQYXJlbnQ7XG4gICAgbGV0IGN1cnJlbnRXaW4gPSB3aW47XG4gICAgbGV0IGN1cnJlbnRJRnJhbWUgPSBnZXRGcmFtZUVsZW1lbnQoY3VycmVudFdpbik7XG4gICAgd2hpbGUgKGN1cnJlbnRJRnJhbWUgJiYgb2Zmc2V0UGFyZW50ICYmIG9mZnNldFdpbiAhPT0gY3VycmVudFdpbikge1xuICAgICAgY29uc3QgaWZyYW1lU2NhbGUgPSBnZXRTY2FsZShjdXJyZW50SUZyYW1lKTtcbiAgICAgIGNvbnN0IGlmcmFtZVJlY3QgPSBjdXJyZW50SUZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50SUZyYW1lKTtcbiAgICAgIGNvbnN0IGxlZnQgPSBpZnJhbWVSZWN0LmxlZnQgKyAoY3VycmVudElGcmFtZS5jbGllbnRMZWZ0ICsgcGFyc2VGbG9hdChjc3MucGFkZGluZ0xlZnQpKSAqIGlmcmFtZVNjYWxlLng7XG4gICAgICBjb25zdCB0b3AgPSBpZnJhbWVSZWN0LnRvcCArIChjdXJyZW50SUZyYW1lLmNsaWVudFRvcCArIHBhcnNlRmxvYXQoY3NzLnBhZGRpbmdUb3ApKSAqIGlmcmFtZVNjYWxlLnk7XG4gICAgICB4ICo9IGlmcmFtZVNjYWxlLng7XG4gICAgICB5ICo9IGlmcmFtZVNjYWxlLnk7XG4gICAgICB3aWR0aCAqPSBpZnJhbWVTY2FsZS54O1xuICAgICAgaGVpZ2h0ICo9IGlmcmFtZVNjYWxlLnk7XG4gICAgICB4ICs9IGxlZnQ7XG4gICAgICB5ICs9IHRvcDtcbiAgICAgIGN1cnJlbnRXaW4gPSBnZXRXaW5kb3coY3VycmVudElGcmFtZSk7XG4gICAgICBjdXJyZW50SUZyYW1lID0gZ2V0RnJhbWVFbGVtZW50KGN1cnJlbnRXaW4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVjdFRvQ2xpZW50UmVjdCh7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9KTtcbn1cblxuZnVuY3Rpb24gY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3QoX3JlZikge1xuICBsZXQge1xuICAgIGVsZW1lbnRzLFxuICAgIHJlY3QsXG4gICAgb2Zmc2V0UGFyZW50LFxuICAgIHN0cmF0ZWd5XG4gIH0gPSBfcmVmO1xuICBjb25zdCBpc0ZpeGVkID0gc3RyYXRlZ3kgPT09ICdmaXhlZCc7XG4gIGNvbnN0IGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICBjb25zdCB0b3BMYXllciA9IGVsZW1lbnRzID8gaXNUb3BMYXllcihlbGVtZW50cy5mbG9hdGluZykgOiBmYWxzZTtcbiAgaWYgKG9mZnNldFBhcmVudCA9PT0gZG9jdW1lbnRFbGVtZW50IHx8IHRvcExheWVyICYmIGlzRml4ZWQpIHtcbiAgICByZXR1cm4gcmVjdDtcbiAgfVxuICBsZXQgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIGxldCBzY2FsZSA9IGNyZWF0ZUNvb3JkcygxKTtcbiAgY29uc3Qgb2Zmc2V0cyA9IGNyZWF0ZUNvb3JkcygwKTtcbiAgY29uc3QgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IGlzT3ZlcmZsb3dFbGVtZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgY29uc3Qgb2Zmc2V0UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQpO1xuICAgICAgc2NhbGUgPSBnZXRTY2FsZShvZmZzZXRQYXJlbnQpO1xuICAgICAgb2Zmc2V0cy54ID0gb2Zmc2V0UmVjdC54ICsgb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgPSBvZmZzZXRSZWN0LnkgKyBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoOiByZWN0LndpZHRoICogc2NhbGUueCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0ICogc2NhbGUueSxcbiAgICB4OiByZWN0LnggKiBzY2FsZS54IC0gc2Nyb2xsLnNjcm9sbExlZnQgKiBzY2FsZS54ICsgb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QueSAqIHNjYWxlLnkgLSBzY3JvbGwuc2Nyb2xsVG9wICogc2NhbGUueSArIG9mZnNldHMueVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0cyhlbGVtZW50KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKSk7XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCkge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGdldE5vZGVTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdDtcbn1cblxuLy8gR2V0cyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgZG9jdW1lbnQgYXJlYSwgZXZlbiBleHRlbmRpbmcgb3V0c2lkZVxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZS5cbmZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIGNvbnN0IGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIGNvbnN0IHNjcm9sbCA9IGdldE5vZGVTY3JvbGwoZWxlbWVudCk7XG4gIGNvbnN0IGJvZHkgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuYm9keTtcbiAgY29uc3Qgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keS5zY3JvbGxXaWR0aCwgYm9keS5jbGllbnRXaWR0aCk7XG4gIGNvbnN0IGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkuc2Nyb2xsSGVpZ2h0LCBib2R5LmNsaWVudEhlaWdodCk7XG4gIGxldCB4ID0gLXNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgY29uc3QgeSA9IC1zY3JvbGwuc2Nyb2xsVG9wO1xuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5KS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keS5jbGllbnRXaWR0aCkgLSB3aWR0aDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4LFxuICAgIHlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgY29uc3QgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgY29uc3QgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIGxldCB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIGxldCBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgbGV0IHggPSAwO1xuICBsZXQgeSA9IDA7XG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0O1xuICAgIGNvbnN0IHZpc3VhbFZpZXdwb3J0QmFzZWQgPSBpc1dlYktpdCgpO1xuICAgIGlmICghdmlzdWFsVmlld3BvcnRCYXNlZCB8fCB2aXN1YWxWaWV3cG9ydEJhc2VkICYmIHN0cmF0ZWd5ID09PSAnZml4ZWQnKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9O1xufVxuXG4vLyBSZXR1cm5zIHRoZSBpbm5lciBjbGllbnQgcmVjdCwgc3VidHJhY3Rpbmcgc2Nyb2xsYmFycyBpZiBwcmVzZW50LlxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgY29uc3QgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCB0cnVlLCBzdHJhdGVneSA9PT0gJ2ZpeGVkJyk7XG4gIGNvbnN0IHRvcCA9IGNsaWVudFJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIGNvbnN0IGxlZnQgPSBjbGllbnRSZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIGNvbnN0IHNjYWxlID0gaXNIVE1MRWxlbWVudChlbGVtZW50KSA/IGdldFNjYWxlKGVsZW1lbnQpIDogY3JlYXRlQ29vcmRzKDEpO1xuICBjb25zdCB3aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGggKiBzY2FsZS54O1xuICBjb25zdCBoZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodCAqIHNjYWxlLnk7XG4gIGNvbnN0IHggPSBsZWZ0ICogc2NhbGUueDtcbiAgY29uc3QgeSA9IHRvcCAqIHNjYWxlLnk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21DbGlwcGluZ0FuY2VzdG9yKGVsZW1lbnQsIGNsaXBwaW5nQW5jZXN0b3IsIHN0cmF0ZWd5KSB7XG4gIGxldCByZWN0O1xuICBpZiAoY2xpcHBpbmdBbmNlc3RvciA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgIHJlY3QgPSBnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpO1xuICB9IGVsc2UgaWYgKGNsaXBwaW5nQW5jZXN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICByZWN0ID0gZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSk7XG4gIH0gZWxzZSBpZiAoaXNFbGVtZW50KGNsaXBwaW5nQW5jZXN0b3IpKSB7XG4gICAgcmVjdCA9IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nQW5jZXN0b3IsIHN0cmF0ZWd5KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB2aXN1YWxPZmZzZXRzID0gZ2V0VmlzdWFsT2Zmc2V0cyhlbGVtZW50KTtcbiAgICByZWN0ID0ge1xuICAgICAgLi4uY2xpcHBpbmdBbmNlc3RvcixcbiAgICAgIHg6IGNsaXBwaW5nQW5jZXN0b3IueCAtIHZpc3VhbE9mZnNldHMueCxcbiAgICAgIHk6IGNsaXBwaW5nQW5jZXN0b3IueSAtIHZpc3VhbE9mZnNldHMueVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlY3RUb0NsaWVudFJlY3QocmVjdCk7XG59XG5mdW5jdGlvbiBoYXNGaXhlZFBvc2l0aW9uQW5jZXN0b3IoZWxlbWVudCwgc3RvcE5vZGUpIHtcbiAgY29uc3QgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG4gIGlmIChwYXJlbnROb2RlID09PSBzdG9wTm9kZSB8fCAhaXNFbGVtZW50KHBhcmVudE5vZGUpIHx8IGlzTGFzdFRyYXZlcnNhYmxlTm9kZShwYXJlbnROb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnROb2RlKS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJyB8fCBoYXNGaXhlZFBvc2l0aW9uQW5jZXN0b3IocGFyZW50Tm9kZSwgc3RvcE5vZGUpO1xufVxuXG4vLyBBIFwiY2xpcHBpbmcgYW5jZXN0b3JcIiBpcyBhbiBgb3ZlcmZsb3dgIGVsZW1lbnQgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIGNoaWxkIGVsZW1lbnRzLiBUaGlzIHJldHVybnMgYWxsIGNsaXBwaW5nIGFuY2VzdG9yc1xuLy8gb2YgdGhlIGdpdmVuIGVsZW1lbnQgdXAgdGhlIHRyZWUuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ0VsZW1lbnRBbmNlc3RvcnMoZWxlbWVudCwgY2FjaGUpIHtcbiAgY29uc3QgY2FjaGVkUmVzdWx0ID0gY2FjaGUuZ2V0KGVsZW1lbnQpO1xuICBpZiAoY2FjaGVkUmVzdWx0KSB7XG4gICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgfVxuICBsZXQgcmVzdWx0ID0gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZWxlbWVudCwgW10sIGZhbHNlKS5maWx0ZXIoZWwgPT4gaXNFbGVtZW50KGVsKSAmJiBnZXROb2RlTmFtZShlbCkgIT09ICdib2R5Jyk7XG4gIGxldCBjdXJyZW50Q29udGFpbmluZ0Jsb2NrQ29tcHV0ZWRTdHlsZSA9IG51bGw7XG4gIGNvbnN0IGVsZW1lbnRJc0ZpeGVkID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJztcbiAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudElzRml4ZWQgPyBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIDogZWxlbWVudDtcblxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ29udGFpbmluZ19ibG9jayNpZGVudGlmeWluZ190aGVfY29udGFpbmluZ19ibG9ja1xuICB3aGlsZSAoaXNFbGVtZW50KGN1cnJlbnROb2RlKSAmJiAhaXNMYXN0VHJhdmVyc2FibGVOb2RlKGN1cnJlbnROb2RlKSkge1xuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGN1cnJlbnROb2RlKTtcbiAgICBjb25zdCBjdXJyZW50Tm9kZUlzQ29udGFpbmluZyA9IGlzQ29udGFpbmluZ0Jsb2NrKGN1cnJlbnROb2RlKTtcbiAgICBpZiAoIWN1cnJlbnROb2RlSXNDb250YWluaW5nICYmIGNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIGN1cnJlbnRDb250YWluaW5nQmxvY2tDb21wdXRlZFN0eWxlID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkRHJvcEN1cnJlbnROb2RlID0gZWxlbWVudElzRml4ZWQgPyAhY3VycmVudE5vZGVJc0NvbnRhaW5pbmcgJiYgIWN1cnJlbnRDb250YWluaW5nQmxvY2tDb21wdXRlZFN0eWxlIDogIWN1cnJlbnROb2RlSXNDb250YWluaW5nICYmIGNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICdzdGF0aWMnICYmICEhY3VycmVudENvbnRhaW5pbmdCbG9ja0NvbXB1dGVkU3R5bGUgJiYgWydhYnNvbHV0ZScsICdmaXhlZCddLmluY2x1ZGVzKGN1cnJlbnRDb250YWluaW5nQmxvY2tDb21wdXRlZFN0eWxlLnBvc2l0aW9uKSB8fCBpc092ZXJmbG93RWxlbWVudChjdXJyZW50Tm9kZSkgJiYgIWN1cnJlbnROb2RlSXNDb250YWluaW5nICYmIGhhc0ZpeGVkUG9zaXRpb25BbmNlc3RvcihlbGVtZW50LCBjdXJyZW50Tm9kZSk7XG4gICAgaWYgKHNob3VsZERyb3BDdXJyZW50Tm9kZSkge1xuICAgICAgLy8gRHJvcCBub24tY29udGFpbmluZyBibG9ja3MuXG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKGFuY2VzdG9yID0+IGFuY2VzdG9yICE9PSBjdXJyZW50Tm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlY29yZCBsYXN0IGNvbnRhaW5pbmcgYmxvY2sgZm9yIG5leHQgaXRlcmF0aW9uLlxuICAgICAgY3VycmVudENvbnRhaW5pbmdCbG9ja0NvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlO1xuICAgIH1cbiAgICBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoY3VycmVudE5vZGUpO1xuICB9XG4gIGNhY2hlLnNldChlbGVtZW50LCByZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBhbmNlc3RvcnMuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoX3JlZikge1xuICBsZXQge1xuICAgIGVsZW1lbnQsXG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5LFxuICAgIHN0cmF0ZWd5XG4gIH0gPSBfcmVmO1xuICBjb25zdCBlbGVtZW50Q2xpcHBpbmdBbmNlc3RvcnMgPSBib3VuZGFyeSA9PT0gJ2NsaXBwaW5nQW5jZXN0b3JzJyA/IGlzVG9wTGF5ZXIoZWxlbWVudCkgPyBbXSA6IGdldENsaXBwaW5nRWxlbWVudEFuY2VzdG9ycyhlbGVtZW50LCB0aGlzLl9jKSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIGNvbnN0IGNsaXBwaW5nQW5jZXN0b3JzID0gWy4uLmVsZW1lbnRDbGlwcGluZ0FuY2VzdG9ycywgcm9vdEJvdW5kYXJ5XTtcbiAgY29uc3QgZmlyc3RDbGlwcGluZ0FuY2VzdG9yID0gY2xpcHBpbmdBbmNlc3RvcnNbMF07XG4gIGNvbnN0IGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nQW5jZXN0b3JzLnJlZHVjZSgoYWNjUmVjdCwgY2xpcHBpbmdBbmNlc3RvcikgPT4ge1xuICAgIGNvbnN0IHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbUNsaXBwaW5nQW5jZXN0b3IoZWxlbWVudCwgY2xpcHBpbmdBbmNlc3Rvciwgc3RyYXRlZ3kpO1xuICAgIGFjY1JlY3QudG9wID0gbWF4KHJlY3QudG9wLCBhY2NSZWN0LnRvcCk7XG4gICAgYWNjUmVjdC5yaWdodCA9IG1pbihyZWN0LnJpZ2h0LCBhY2NSZWN0LnJpZ2h0KTtcbiAgICBhY2NSZWN0LmJvdHRvbSA9IG1pbihyZWN0LmJvdHRvbSwgYWNjUmVjdC5ib3R0b20pO1xuICAgIGFjY1JlY3QubGVmdCA9IG1heChyZWN0LmxlZnQsIGFjY1JlY3QubGVmdCk7XG4gICAgcmV0dXJuIGFjY1JlY3Q7XG4gIH0sIGdldENsaWVudFJlY3RGcm9tQ2xpcHBpbmdBbmNlc3RvcihlbGVtZW50LCBmaXJzdENsaXBwaW5nQW5jZXN0b3IsIHN0cmF0ZWd5KSk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IGNsaXBwaW5nUmVjdC5yaWdodCAtIGNsaXBwaW5nUmVjdC5sZWZ0LFxuICAgIGhlaWdodDogY2xpcHBpbmdSZWN0LmJvdHRvbSAtIGNsaXBwaW5nUmVjdC50b3AsXG4gICAgeDogY2xpcHBpbmdSZWN0LmxlZnQsXG4gICAgeTogY2xpcHBpbmdSZWN0LnRvcFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXREaW1lbnNpb25zKGVsZW1lbnQpIHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodFxuICB9ID0gZ2V0Q3NzRGltZW5zaW9ucyhlbGVtZW50KTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVjdFJlbGF0aXZlVG9PZmZzZXRQYXJlbnQoZWxlbWVudCwgb2Zmc2V0UGFyZW50LCBzdHJhdGVneSkge1xuICBjb25zdCBpc09mZnNldFBhcmVudEFuRWxlbWVudCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgY29uc3QgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIGNvbnN0IGlzRml4ZWQgPSBzdHJhdGVneSA9PT0gJ2ZpeGVkJztcbiAgY29uc3QgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCB0cnVlLCBpc0ZpeGVkLCBvZmZzZXRQYXJlbnQpO1xuICBsZXQgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIGNvbnN0IG9mZnNldHMgPSBjcmVhdGVDb29yZHMoMCk7XG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IGlzT3ZlcmZsb3dFbGVtZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG4gICAgaWYgKGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50KSB7XG4gICAgICBjb25zdCBvZmZzZXRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCwgdHJ1ZSwgaXNGaXhlZCwgb2Zmc2V0UGFyZW50KTtcbiAgICAgIG9mZnNldHMueCA9IG9mZnNldFJlY3QueCArIG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ID0gb2Zmc2V0UmVjdC55ICsgb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBjb25zdCB4ID0gcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLng7XG4gIGNvbnN0IHkgPSByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnk7XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNTdGF0aWNQb3NpdGlvbmVkKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnO1xufVxuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQsIHBvbHlmaWxsKSB7XG4gIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHBvbHlmaWxsKSB7XG4gICAgcmV0dXJuIHBvbHlmaWxsKGVsZW1lbnQpO1xuICB9XG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn1cblxuLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cbmZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50LCBwb2x5ZmlsbCkge1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIGlmIChpc1RvcExheWVyKGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIHdpbjtcbiAgfVxuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBsZXQgc3ZnT2Zmc2V0UGFyZW50ID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICB3aGlsZSAoc3ZnT2Zmc2V0UGFyZW50ICYmICFpc0xhc3RUcmF2ZXJzYWJsZU5vZGUoc3ZnT2Zmc2V0UGFyZW50KSkge1xuICAgICAgaWYgKGlzRWxlbWVudChzdmdPZmZzZXRQYXJlbnQpICYmICFpc1N0YXRpY1Bvc2l0aW9uZWQoc3ZnT2Zmc2V0UGFyZW50KSkge1xuICAgICAgICByZXR1cm4gc3ZnT2Zmc2V0UGFyZW50O1xuICAgICAgfVxuICAgICAgc3ZnT2Zmc2V0UGFyZW50ID0gZ2V0UGFyZW50Tm9kZShzdmdPZmZzZXRQYXJlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gd2luO1xuICB9XG4gIGxldCBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQsIHBvbHlmaWxsKTtcbiAgd2hpbGUgKG9mZnNldFBhcmVudCAmJiBpc1RhYmxlRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGlzU3RhdGljUG9zaXRpb25lZChvZmZzZXRQYXJlbnQpKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQsIHBvbHlmaWxsKTtcbiAgfVxuICBpZiAob2Zmc2V0UGFyZW50ICYmIGlzTGFzdFRyYXZlcnNhYmxlTm9kZShvZmZzZXRQYXJlbnQpICYmIGlzU3RhdGljUG9zaXRpb25lZChvZmZzZXRQYXJlbnQpICYmICFpc0NvbnRhaW5pbmdCbG9jayhvZmZzZXRQYXJlbnQpKSB7XG4gICAgcmV0dXJuIHdpbjtcbiAgfVxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW47XG59XG5cbmNvbnN0IGdldEVsZW1lbnRSZWN0cyA9IGFzeW5jIGZ1bmN0aW9uIChkYXRhKSB7XG4gIGNvbnN0IGdldE9mZnNldFBhcmVudEZuID0gdGhpcy5nZXRPZmZzZXRQYXJlbnQgfHwgZ2V0T2Zmc2V0UGFyZW50O1xuICBjb25zdCBnZXREaW1lbnNpb25zRm4gPSB0aGlzLmdldERpbWVuc2lvbnM7XG4gIGNvbnN0IGZsb2F0aW5nRGltZW5zaW9ucyA9IGF3YWl0IGdldERpbWVuc2lvbnNGbihkYXRhLmZsb2F0aW5nKTtcbiAgcmV0dXJuIHtcbiAgICByZWZlcmVuY2U6IGdldFJlY3RSZWxhdGl2ZVRvT2Zmc2V0UGFyZW50KGRhdGEucmVmZXJlbmNlLCBhd2FpdCBnZXRPZmZzZXRQYXJlbnRGbihkYXRhLmZsb2F0aW5nKSwgZGF0YS5zdHJhdGVneSksXG4gICAgZmxvYXRpbmc6IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgd2lkdGg6IGZsb2F0aW5nRGltZW5zaW9ucy53aWR0aCxcbiAgICAgIGhlaWdodDogZmxvYXRpbmdEaW1lbnNpb25zLmhlaWdodFxuICAgIH1cbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGlzUlRMKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZGlyZWN0aW9uID09PSAncnRsJztcbn1cblxuY29uc3QgcGxhdGZvcm0gPSB7XG4gIGNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0LFxuICBnZXREb2N1bWVudEVsZW1lbnQsXG4gIGdldENsaXBwaW5nUmVjdCxcbiAgZ2V0T2Zmc2V0UGFyZW50LFxuICBnZXRFbGVtZW50UmVjdHMsXG4gIGdldENsaWVudFJlY3RzLFxuICBnZXREaW1lbnNpb25zLFxuICBnZXRTY2FsZSxcbiAgaXNFbGVtZW50LFxuICBpc1JUTFxufTtcblxuLy8gaHR0cHM6Ly9zYW10aG9yLmF1LzIwMjEvb2JzZXJ2aW5nLWRvbS9cbmZ1bmN0aW9uIG9ic2VydmVNb3ZlKGVsZW1lbnQsIG9uTW92ZSkge1xuICBsZXQgaW8gPSBudWxsO1xuICBsZXQgdGltZW91dElkO1xuICBjb25zdCByb290ID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHZhciBfaW87XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgKF9pbyA9IGlvKSA9PSBudWxsIHx8IF9pby5kaXNjb25uZWN0KCk7XG4gICAgaW8gPSBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIHJlZnJlc2goc2tpcCwgdGhyZXNob2xkKSB7XG4gICAgaWYgKHNraXAgPT09IHZvaWQgMCkge1xuICAgICAgc2tpcCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhyZXNob2xkID09PSB2b2lkIDApIHtcbiAgICAgIHRocmVzaG9sZCA9IDE7XG4gICAgfVxuICAgIGNsZWFudXAoKTtcbiAgICBjb25zdCB7XG4gICAgICBsZWZ0LFxuICAgICAgdG9wLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoIXNraXApIHtcbiAgICAgIG9uTW92ZSgpO1xuICAgIH1cbiAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5zZXRUb3AgPSBmbG9vcih0b3ApO1xuICAgIGNvbnN0IGluc2V0UmlnaHQgPSBmbG9vcihyb290LmNsaWVudFdpZHRoIC0gKGxlZnQgKyB3aWR0aCkpO1xuICAgIGNvbnN0IGluc2V0Qm90dG9tID0gZmxvb3Iocm9vdC5jbGllbnRIZWlnaHQgLSAodG9wICsgaGVpZ2h0KSk7XG4gICAgY29uc3QgaW5zZXRMZWZ0ID0gZmxvb3IobGVmdCk7XG4gICAgY29uc3Qgcm9vdE1hcmdpbiA9IC1pbnNldFRvcCArIFwicHggXCIgKyAtaW5zZXRSaWdodCArIFwicHggXCIgKyAtaW5zZXRCb3R0b20gKyBcInB4IFwiICsgLWluc2V0TGVmdCArIFwicHhcIjtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcm9vdE1hcmdpbixcbiAgICAgIHRocmVzaG9sZDogbWF4KDAsIG1pbigxLCB0aHJlc2hvbGQpKSB8fCAxXG4gICAgfTtcbiAgICBsZXQgaXNGaXJzdFVwZGF0ZSA9IHRydWU7XG4gICAgZnVuY3Rpb24gaGFuZGxlT2JzZXJ2ZShlbnRyaWVzKSB7XG4gICAgICBjb25zdCByYXRpbyA9IGVudHJpZXNbMF0uaW50ZXJzZWN0aW9uUmF0aW87XG4gICAgICBpZiAocmF0aW8gIT09IHRocmVzaG9sZCkge1xuICAgICAgICBpZiAoIWlzRmlyc3RVcGRhdGUpIHtcbiAgICAgICAgICByZXR1cm4gcmVmcmVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmF0aW8pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgcmVmZXJlbmNlIGlzIGNsaXBwZWQsIHRoZSByYXRpbyBpcyAwLiBUaHJvdHRsZSB0aGUgcmVmcmVzaFxuICAgICAgICAgIC8vIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiB1cGRhdGVzLlxuICAgICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaChmYWxzZSwgMWUtNyk7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmcmVzaChmYWxzZSwgcmF0aW8pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpc0ZpcnN0VXBkYXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT2xkZXIgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCBhIGBkb2N1bWVudGAgYXMgdGhlIHJvb3QgYW5kIHdpbGwgdGhyb3cgYW5cbiAgICAvLyBlcnJvci5cbiAgICB0cnkge1xuICAgICAgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoaGFuZGxlT2JzZXJ2ZSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAvLyBIYW5kbGUgPGlmcmFtZT5zXG4gICAgICAgIHJvb3Q6IHJvb3Qub3duZXJEb2N1bWVudFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoaGFuZGxlT2JzZXJ2ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlvLm9ic2VydmUoZWxlbWVudCk7XG4gIH1cbiAgcmVmcmVzaCh0cnVlKTtcbiAgcmV0dXJuIGNsZWFudXA7XG59XG5cbi8qKlxuICogQXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGVuIG5lY2Vzc2FyeS5cbiAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzIG1vdW50ZWQgb24gdGhlIERPTSBvclxuICogdmlzaWJsZSBvbiB0aGUgc2NyZWVuLlxuICogQHJldHVybnMgY2xlYW51cCBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBpbnZva2VkIHdoZW4gdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXNcbiAqIHJlbW92ZWQgZnJvbSB0aGUgRE9NIG9yIGhpZGRlbiBmcm9tIHRoZSBzY3JlZW4uXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXV0b1VwZGF0ZVxuICovXG5mdW5jdGlvbiBhdXRvVXBkYXRlKHJlZmVyZW5jZSwgZmxvYXRpbmcsIHVwZGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBhbmNlc3RvclNjcm9sbCA9IHRydWUsXG4gICAgYW5jZXN0b3JSZXNpemUgPSB0cnVlLFxuICAgIGVsZW1lbnRSZXNpemUgPSB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicsXG4gICAgbGF5b3V0U2hpZnQgPSB0eXBlb2YgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicsXG4gICAgYW5pbWF0aW9uRnJhbWUgPSBmYWxzZVxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcmVmZXJlbmNlRWwgPSB1bndyYXBFbGVtZW50KHJlZmVyZW5jZSk7XG4gIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yU2Nyb2xsIHx8IGFuY2VzdG9yUmVzaXplID8gWy4uLihyZWZlcmVuY2VFbCA/IGdldE92ZXJmbG93QW5jZXN0b3JzKHJlZmVyZW5jZUVsKSA6IFtdKSwgLi4uZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZmxvYXRpbmcpXSA6IFtdO1xuICBhbmNlc3RvcnMuZm9yRWFjaChhbmNlc3RvciA9PiB7XG4gICAgYW5jZXN0b3JTY3JvbGwgJiYgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgYW5jZXN0b3JSZXNpemUgJiYgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlKTtcbiAgfSk7XG4gIGNvbnN0IGNsZWFudXBJbyA9IHJlZmVyZW5jZUVsICYmIGxheW91dFNoaWZ0ID8gb2JzZXJ2ZU1vdmUocmVmZXJlbmNlRWwsIHVwZGF0ZSkgOiBudWxsO1xuICBsZXQgcmVvYnNlcnZlRnJhbWUgPSAtMTtcbiAgbGV0IHJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgaWYgKGVsZW1lbnRSZXNpemUpIHtcbiAgICByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihfcmVmID0+IHtcbiAgICAgIGxldCBbZmlyc3RFbnRyeV0gPSBfcmVmO1xuICAgICAgaWYgKGZpcnN0RW50cnkgJiYgZmlyc3RFbnRyeS50YXJnZXQgPT09IHJlZmVyZW5jZUVsICYmIHJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICAgIC8vIFByZXZlbnQgdXBkYXRlIGxvb3BzIHdoZW4gdXNpbmcgdGhlIGBzaXplYCBtaWRkbGV3YXJlLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzE3NDBcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKGZsb2F0aW5nKTtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmVvYnNlcnZlRnJhbWUpO1xuICAgICAgICByZW9ic2VydmVGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgdmFyIF9yZXNpemVPYnNlcnZlcjtcbiAgICAgICAgICAoX3Jlc2l6ZU9ic2VydmVyID0gcmVzaXplT2JzZXJ2ZXIpID09IG51bGwgfHwgX3Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoZmxvYXRpbmcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZSgpO1xuICAgIH0pO1xuICAgIGlmIChyZWZlcmVuY2VFbCAmJiAhYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUocmVmZXJlbmNlRWwpO1xuICAgIH1cbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGZsb2F0aW5nKTtcbiAgfVxuICBsZXQgZnJhbWVJZDtcbiAgbGV0IHByZXZSZWZSZWN0ID0gYW5pbWF0aW9uRnJhbWUgPyBnZXRCb3VuZGluZ0NsaWVudFJlY3QocmVmZXJlbmNlKSA6IG51bGw7XG4gIGlmIChhbmltYXRpb25GcmFtZSkge1xuICAgIGZyYW1lTG9vcCgpO1xuICB9XG4gIGZ1bmN0aW9uIGZyYW1lTG9vcCgpIHtcbiAgICBjb25zdCBuZXh0UmVmUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChyZWZlcmVuY2UpO1xuICAgIGlmIChwcmV2UmVmUmVjdCAmJiAobmV4dFJlZlJlY3QueCAhPT0gcHJldlJlZlJlY3QueCB8fCBuZXh0UmVmUmVjdC55ICE9PSBwcmV2UmVmUmVjdC55IHx8IG5leHRSZWZSZWN0LndpZHRoICE9PSBwcmV2UmVmUmVjdC53aWR0aCB8fCBuZXh0UmVmUmVjdC5oZWlnaHQgIT09IHByZXZSZWZSZWN0LmhlaWdodCkpIHtcbiAgICAgIHVwZGF0ZSgpO1xuICAgIH1cbiAgICBwcmV2UmVmUmVjdCA9IG5leHRSZWZSZWN0O1xuICAgIGZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWVMb29wKTtcbiAgfVxuICB1cGRhdGUoKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICB2YXIgX3Jlc2l6ZU9ic2VydmVyMjtcbiAgICBhbmNlc3RvcnMuZm9yRWFjaChhbmNlc3RvciA9PiB7XG4gICAgICBhbmNlc3RvclNjcm9sbCAmJiBhbmNlc3Rvci5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGUpO1xuICAgICAgYW5jZXN0b3JSZXNpemUgJiYgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlKTtcbiAgICB9KTtcbiAgICBjbGVhbnVwSW8gPT0gbnVsbCB8fCBjbGVhbnVwSW8oKTtcbiAgICAoX3Jlc2l6ZU9ic2VydmVyMiA9IHJlc2l6ZU9ic2VydmVyKSA9PSBudWxsIHx8IF9yZXNpemVPYnNlcnZlcjIuZGlzY29ubmVjdCgpO1xuICAgIHJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgICBpZiAoYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGZyYW1lSWQpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBvZiBvdmVyZmxvdyBzaWRlIG9mZnNldHMgdGhhdCBkZXRlcm1pbmUgaG93IG11Y2ggdGhlXG4gKiBlbGVtZW50IGlzIG92ZXJmbG93aW5nIGEgZ2l2ZW4gY2xpcHBpbmcgYm91bmRhcnkgb24gZWFjaCBzaWRlLlxuICogLSBwb3NpdGl2ZSA9IG92ZXJmbG93aW5nIHRoZSBib3VuZGFyeSBieSB0aGF0IG51bWJlciBvZiBwaXhlbHNcbiAqIC0gbmVnYXRpdmUgPSBob3cgbWFueSBwaXhlbHMgbGVmdCBiZWZvcmUgaXQgd2lsbCBvdmVyZmxvd1xuICogLSAwID0gbGllcyBmbHVzaCB3aXRoIHRoZSBib3VuZGFyeVxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2RldGVjdE92ZXJmbG93XG4gKi9cbmNvbnN0IGRldGVjdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3ckMTtcblxuLyoqXG4gKiBNb2RpZmllcyB0aGUgcGxhY2VtZW50IGJ5IHRyYW5zbGF0aW5nIHRoZSBmbG9hdGluZyBlbGVtZW50IGFsb25nIHRoZVxuICogc3BlY2lmaWVkIGF4ZXMuXG4gKiBBIG51bWJlciAoc2hvcnRoYW5kIGZvciBgbWFpbkF4aXNgIG9yIGRpc3RhbmNlKSwgb3IgYW4gYXhlcyBjb25maWd1cmF0aW9uXG4gKiBvYmplY3QgbWF5IGJlIHBhc3NlZC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9vZmZzZXRcbiAqL1xuY29uc3Qgb2Zmc2V0ID0gb2Zmc2V0JDE7XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IGNob29zaW5nIHRoZSBwbGFjZW1lbnRcbiAqIHRoYXQgaGFzIHRoZSBtb3N0IHNwYWNlIGF2YWlsYWJsZSBhdXRvbWF0aWNhbGx5LCB3aXRob3V0IG5lZWRpbmcgdG8gc3BlY2lmeSBhXG4gKiBwcmVmZXJyZWQgcGxhY2VtZW50LiBBbHRlcm5hdGl2ZSB0byBgZmxpcGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXV0b1BsYWNlbWVudFxuICovXG5jb25zdCBhdXRvUGxhY2VtZW50ID0gYXV0b1BsYWNlbWVudCQxO1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBzaGlmdGluZyBpdCBpbiBvcmRlciB0b1xuICoga2VlcCBpdCBpbiB2aWV3IHdoZW4gaXQgd2lsbCBvdmVyZmxvdyB0aGUgY2xpcHBpbmcgYm91bmRhcnkuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2hpZnRcbiAqL1xuY29uc3Qgc2hpZnQgPSBzaGlmdCQxO1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBmbGlwcGluZyB0aGUgYHBsYWNlbWVudGBcbiAqIGluIG9yZGVyIHRvIGtlZXAgaXQgaW4gdmlldyB3aGVuIHRoZSBwcmVmZXJyZWQgcGxhY2VtZW50KHMpIHdpbGwgb3ZlcmZsb3cgdGhlXG4gKiBjbGlwcGluZyBib3VuZGFyeS4gQWx0ZXJuYXRpdmUgdG8gYGF1dG9QbGFjZW1lbnRgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2ZsaXBcbiAqL1xuY29uc3QgZmxpcCA9IGZsaXAkMTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRoYXQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQg4oCUXG4gKiBmb3IgaW5zdGFuY2UsIHByZXZlbnQgaXQgZnJvbSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgYm91bmRhcnkgb3IgbWF0Y2ggdGhlXG4gKiB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2l6ZVxuICovXG5jb25zdCBzaXplID0gc2l6ZSQxO1xuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gaGlkZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBpbiBhcHBsaWNhYmxlIHNpdHVhdGlvbnMsIHN1Y2ggYXNcbiAqIHdoZW4gaXQgaXMgbm90IGluIHRoZSBzYW1lIGNsaXBwaW5nIGNvbnRleHQgYXMgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2hpZGVcbiAqL1xuY29uc3QgaGlkZSA9IGhpZGUkMTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIHBvc2l0aW9uIGFuIGlubmVyIGVsZW1lbnQgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgc28gdGhhdCBpdFxuICogYXBwZWFycyBjZW50ZXJlZCB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXJyb3dcbiAqL1xuY29uc3QgYXJyb3cgPSBhcnJvdyQxO1xuXG4vKipcbiAqIFByb3ZpZGVzIGltcHJvdmVkIHBvc2l0aW9uaW5nIGZvciBpbmxpbmUgcmVmZXJlbmNlIGVsZW1lbnRzIHRoYXQgY2FuIHNwYW5cbiAqIG92ZXIgbXVsdGlwbGUgbGluZXMsIHN1Y2ggYXMgaHlwZXJsaW5rcyBvciByYW5nZSBzZWxlY3Rpb25zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2lubGluZVxuICovXG5jb25zdCBpbmxpbmUgPSBpbmxpbmUkMTtcblxuLyoqXG4gKiBCdWlsdC1pbiBgbGltaXRlcmAgdGhhdCB3aWxsIHN0b3AgYHNoaWZ0KClgIGF0IGEgY2VydGFpbiBwb2ludC5cbiAqL1xuY29uc3QgbGltaXRTaGlmdCA9IGxpbWl0U2hpZnQkMTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMgdGhhdCB3aWxsIHBsYWNlIHRoZSBmbG9hdGluZyBlbGVtZW50XG4gKiBuZXh0IHRvIGEgZ2l2ZW4gcmVmZXJlbmNlIGVsZW1lbnQuXG4gKi9cbmNvbnN0IGNvbXB1dGVQb3NpdGlvbiA9IChyZWZlcmVuY2UsIGZsb2F0aW5nLCBvcHRpb25zKSA9PiB7XG4gIC8vIFRoaXMgY2FjaGVzIHRoZSBleHBlbnNpdmUgYGdldENsaXBwaW5nRWxlbWVudEFuY2VzdG9yc2AgZnVuY3Rpb24gc28gdGhhdFxuICAvLyBtdWx0aXBsZSBsaWZlY3ljbGUgcmVzZXRzIHJlLXVzZSB0aGUgc2FtZSByZXN1bHQuIEl0IG9ubHkgbGl2ZXMgZm9yIGFcbiAgLy8gc2luZ2xlIGNhbGwuIElmIG90aGVyIGZ1bmN0aW9ucyBiZWNvbWUgZXhwZW5zaXZlLCB3ZSBjYW4gYWRkIHRoZW0gYXMgd2VsbC5cbiAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7XG4gICAgcGxhdGZvcm0sXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICBjb25zdCBwbGF0Zm9ybVdpdGhDYWNoZSA9IHtcbiAgICAuLi5tZXJnZWRPcHRpb25zLnBsYXRmb3JtLFxuICAgIF9jOiBjYWNoZVxuICB9O1xuICByZXR1cm4gY29tcHV0ZVBvc2l0aW9uJDEocmVmZXJlbmNlLCBmbG9hdGluZywge1xuICAgIC4uLm1lcmdlZE9wdGlvbnMsXG4gICAgcGxhdGZvcm06IHBsYXRmb3JtV2l0aENhY2hlXG4gIH0pO1xufTtcblxuZXhwb3J0IHsgYXJyb3csIGF1dG9QbGFjZW1lbnQsIGF1dG9VcGRhdGUsIGNvbXB1dGVQb3NpdGlvbiwgZGV0ZWN0T3ZlcmZsb3csIGZsaXAsIGhpZGUsIGlubGluZSwgbGltaXRTaGlmdCwgb2Zmc2V0LCBwbGF0Zm9ybSwgc2hpZnQsIHNpemUgfTtcbiIsImltcG9ydCB7IGNvbXB1dGVQb3NpdGlvbiwgYXJyb3cgYXMgYXJyb3ckMiwgb2Zmc2V0IGFzIG9mZnNldCQxLCBzaGlmdCBhcyBzaGlmdCQxLCBsaW1pdFNoaWZ0IGFzIGxpbWl0U2hpZnQkMSwgZmxpcCBhcyBmbGlwJDEsIHNpemUgYXMgc2l6ZSQxLCBhdXRvUGxhY2VtZW50IGFzIGF1dG9QbGFjZW1lbnQkMSwgaGlkZSBhcyBoaWRlJDEsIGlubGluZSBhcyBpbmxpbmUkMSB9IGZyb20gJ0BmbG9hdGluZy11aS9kb20nO1xuZXhwb3J0IHsgYXV0b1VwZGF0ZSwgY29tcHV0ZVBvc2l0aW9uLCBkZXRlY3RPdmVyZmxvdywgZ2V0T3ZlcmZsb3dBbmNlc3RvcnMsIHBsYXRmb3JtIH0gZnJvbSAnQGZsb2F0aW5nLXVpL2RvbSc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbnZhciBpbmRleCA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyB1c2VMYXlvdXRFZmZlY3QgOiB1c2VFZmZlY3Q7XG5cbi8vIEZvcmsgb2YgYGZhc3QtZGVlcC1lcXVhbGAgdGhhdCBvbmx5IGRvZXMgdGhlIGNvbXBhcmlzb25zIHdlIG5lZWQgYW5kIGNvbXBhcmVzXG4vLyBmdW5jdGlvbnNcbmZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIGEgPT09ICdmdW5jdGlvbicgJiYgYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBsZXQgbGVuZ3RoO1xuICBsZXQgaTtcbiAgbGV0IGtleXM7XG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiW2ldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICBpZiAoIXt9Lmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5c1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoa2V5ID09PSAnX293bmVyJyAmJiBhLiQkdHlwZW9mKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFkZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbn1cblxuZnVuY3Rpb24gZ2V0RFBSKGVsZW1lbnQpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgY29uc3Qgd2luID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgcmV0dXJuIHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG59XG5cbmZ1bmN0aW9uIHJvdW5kQnlEUFIoZWxlbWVudCwgdmFsdWUpIHtcbiAgY29uc3QgZHByID0gZ2V0RFBSKGVsZW1lbnQpO1xuICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIGRwcikgLyBkcHI7XG59XG5cbmZ1bmN0aW9uIHVzZUxhdGVzdFJlZih2YWx1ZSkge1xuICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYodmFsdWUpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZWY7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhIGZsb2F0aW5nIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlRmxvYXRpbmdcbiAqL1xuZnVuY3Rpb24gdXNlRmxvYXRpbmcob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBwbGFjZW1lbnQgPSAnYm90dG9tJyxcbiAgICBzdHJhdGVneSA9ICdhYnNvbHV0ZScsXG4gICAgbWlkZGxld2FyZSA9IFtdLFxuICAgIHBsYXRmb3JtLFxuICAgIGVsZW1lbnRzOiB7XG4gICAgICByZWZlcmVuY2U6IGV4dGVybmFsUmVmZXJlbmNlLFxuICAgICAgZmxvYXRpbmc6IGV4dGVybmFsRmxvYXRpbmdcbiAgICB9ID0ge30sXG4gICAgdHJhbnNmb3JtID0gdHJ1ZSxcbiAgICB3aGlsZUVsZW1lbnRzTW91bnRlZCxcbiAgICBvcGVuXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBbZGF0YSwgc2V0RGF0YV0gPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHN0cmF0ZWd5LFxuICAgIHBsYWNlbWVudCxcbiAgICBtaWRkbGV3YXJlRGF0YToge30sXG4gICAgaXNQb3NpdGlvbmVkOiBmYWxzZVxuICB9KTtcbiAgY29uc3QgW2xhdGVzdE1pZGRsZXdhcmUsIHNldExhdGVzdE1pZGRsZXdhcmVdID0gUmVhY3QudXNlU3RhdGUobWlkZGxld2FyZSk7XG4gIGlmICghZGVlcEVxdWFsKGxhdGVzdE1pZGRsZXdhcmUsIG1pZGRsZXdhcmUpKSB7XG4gICAgc2V0TGF0ZXN0TWlkZGxld2FyZShtaWRkbGV3YXJlKTtcbiAgfVxuICBjb25zdCBbX3JlZmVyZW5jZSwgX3NldFJlZmVyZW5jZV0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW19mbG9hdGluZywgX3NldEZsb2F0aW5nXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBzZXRSZWZlcmVuY2UgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBpZiAobm9kZSAhPT0gcmVmZXJlbmNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJlZmVyZW5jZVJlZi5jdXJyZW50ID0gbm9kZTtcbiAgICAgIF9zZXRSZWZlcmVuY2Uobm9kZSk7XG4gICAgfVxuICB9LCBbXSk7XG4gIGNvbnN0IHNldEZsb2F0aW5nID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgaWYgKG5vZGUgIT09IGZsb2F0aW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgIGZsb2F0aW5nUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgX3NldEZsb2F0aW5nKG5vZGUpO1xuICAgIH1cbiAgfSwgW10pO1xuICBjb25zdCByZWZlcmVuY2VFbCA9IGV4dGVybmFsUmVmZXJlbmNlIHx8IF9yZWZlcmVuY2U7XG4gIGNvbnN0IGZsb2F0aW5nRWwgPSBleHRlcm5hbEZsb2F0aW5nIHx8IF9mbG9hdGluZztcbiAgY29uc3QgcmVmZXJlbmNlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBmbG9hdGluZ1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgZGF0YVJlZiA9IFJlYWN0LnVzZVJlZihkYXRhKTtcbiAgY29uc3QgaGFzV2hpbGVFbGVtZW50c01vdW50ZWQgPSB3aGlsZUVsZW1lbnRzTW91bnRlZCAhPSBudWxsO1xuICBjb25zdCB3aGlsZUVsZW1lbnRzTW91bnRlZFJlZiA9IHVzZUxhdGVzdFJlZih3aGlsZUVsZW1lbnRzTW91bnRlZCk7XG4gIGNvbnN0IHBsYXRmb3JtUmVmID0gdXNlTGF0ZXN0UmVmKHBsYXRmb3JtKTtcbiAgY29uc3QgdXBkYXRlID0gUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghcmVmZXJlbmNlUmVmLmN1cnJlbnQgfHwgIWZsb2F0aW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgcGxhY2VtZW50LFxuICAgICAgc3RyYXRlZ3ksXG4gICAgICBtaWRkbGV3YXJlOiBsYXRlc3RNaWRkbGV3YXJlXG4gICAgfTtcbiAgICBpZiAocGxhdGZvcm1SZWYuY3VycmVudCkge1xuICAgICAgY29uZmlnLnBsYXRmb3JtID0gcGxhdGZvcm1SZWYuY3VycmVudDtcbiAgICB9XG4gICAgY29tcHV0ZVBvc2l0aW9uKHJlZmVyZW5jZVJlZi5jdXJyZW50LCBmbG9hdGluZ1JlZi5jdXJyZW50LCBjb25maWcpLnRoZW4oZGF0YSA9PiB7XG4gICAgICBjb25zdCBmdWxsRGF0YSA9IHtcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgaXNQb3NpdGlvbmVkOiB0cnVlXG4gICAgICB9O1xuICAgICAgaWYgKGlzTW91bnRlZFJlZi5jdXJyZW50ICYmICFkZWVwRXF1YWwoZGF0YVJlZi5jdXJyZW50LCBmdWxsRGF0YSkpIHtcbiAgICAgICAgZGF0YVJlZi5jdXJyZW50ID0gZnVsbERhdGE7XG4gICAgICAgIFJlYWN0RE9NLmZsdXNoU3luYygoKSA9PiB7XG4gICAgICAgICAgc2V0RGF0YShmdWxsRGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbbGF0ZXN0TWlkZGxld2FyZSwgcGxhY2VtZW50LCBzdHJhdGVneSwgcGxhdGZvcm1SZWZdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChvcGVuID09PSBmYWxzZSAmJiBkYXRhUmVmLmN1cnJlbnQuaXNQb3NpdGlvbmVkKSB7XG4gICAgICBkYXRhUmVmLmN1cnJlbnQuaXNQb3NpdGlvbmVkID0gZmFsc2U7XG4gICAgICBzZXREYXRhKGRhdGEgPT4gKHtcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgaXNQb3NpdGlvbmVkOiBmYWxzZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfSwgW29wZW5dKTtcbiAgY29uc3QgaXNNb3VudGVkUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlzTW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaXNNb3VudGVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAocmVmZXJlbmNlRWwpIHJlZmVyZW5jZVJlZi5jdXJyZW50ID0gcmVmZXJlbmNlRWw7XG4gICAgaWYgKGZsb2F0aW5nRWwpIGZsb2F0aW5nUmVmLmN1cnJlbnQgPSBmbG9hdGluZ0VsO1xuICAgIGlmIChyZWZlcmVuY2VFbCAmJiBmbG9hdGluZ0VsKSB7XG4gICAgICBpZiAod2hpbGVFbGVtZW50c01vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm4gd2hpbGVFbGVtZW50c01vdW50ZWRSZWYuY3VycmVudChyZWZlcmVuY2VFbCwgZmxvYXRpbmdFbCwgdXBkYXRlKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZSgpO1xuICAgIH1cbiAgfSwgW3JlZmVyZW5jZUVsLCBmbG9hdGluZ0VsLCB1cGRhdGUsIHdoaWxlRWxlbWVudHNNb3VudGVkUmVmLCBoYXNXaGlsZUVsZW1lbnRzTW91bnRlZF0pO1xuICBjb25zdCByZWZzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlUmVmLFxuICAgIGZsb2F0aW5nOiBmbG9hdGluZ1JlZixcbiAgICBzZXRSZWZlcmVuY2UsXG4gICAgc2V0RmxvYXRpbmdcbiAgfSksIFtzZXRSZWZlcmVuY2UsIHNldEZsb2F0aW5nXSk7XG4gIGNvbnN0IGVsZW1lbnRzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlRWwsXG4gICAgZmxvYXRpbmc6IGZsb2F0aW5nRWxcbiAgfSksIFtyZWZlcmVuY2VFbCwgZmxvYXRpbmdFbF0pO1xuICBjb25zdCBmbG9hdGluZ1N0eWxlcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGluaXRpYWxTdHlsZXMgPSB7XG4gICAgICBwb3NpdGlvbjogc3RyYXRlZ3ksXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwXG4gICAgfTtcbiAgICBpZiAoIWVsZW1lbnRzLmZsb2F0aW5nKSB7XG4gICAgICByZXR1cm4gaW5pdGlhbFN0eWxlcztcbiAgICB9XG4gICAgY29uc3QgeCA9IHJvdW5kQnlEUFIoZWxlbWVudHMuZmxvYXRpbmcsIGRhdGEueCk7XG4gICAgY29uc3QgeSA9IHJvdW5kQnlEUFIoZWxlbWVudHMuZmxvYXRpbmcsIGRhdGEueSk7XG4gICAgaWYgKHRyYW5zZm9ybSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5pdGlhbFN0eWxlcyxcbiAgICAgICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZShcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4KVwiLFxuICAgICAgICAuLi4oZ2V0RFBSKGVsZW1lbnRzLmZsb2F0aW5nKSA+PSAxLjUgJiYge1xuICAgICAgICAgIHdpbGxDaGFuZ2U6ICd0cmFuc2Zvcm0nXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IHN0cmF0ZWd5LFxuICAgICAgbGVmdDogeCxcbiAgICAgIHRvcDogeVxuICAgIH07XG4gIH0sIFtzdHJhdGVneSwgdHJhbnNmb3JtLCBlbGVtZW50cy5mbG9hdGluZywgZGF0YS54LCBkYXRhLnldKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5kYXRhLFxuICAgIHVwZGF0ZSxcbiAgICByZWZzLFxuICAgIGVsZW1lbnRzLFxuICAgIGZsb2F0aW5nU3R5bGVzXG4gIH0pLCBbZGF0YSwgdXBkYXRlLCByZWZzLCBlbGVtZW50cywgZmxvYXRpbmdTdHlsZXNdKTtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIHBvc2l0aW9uIGFuIGlubmVyIGVsZW1lbnQgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgc28gdGhhdCBpdFxuICogYXBwZWFycyBjZW50ZXJlZCB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBUaGlzIHdyYXBzIHRoZSBjb3JlIGBhcnJvd2AgbWlkZGxld2FyZSB0byBhbGxvdyBSZWFjdCByZWZzIGFzIHRoZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2Fycm93XG4gKi9cbmNvbnN0IGFycm93JDEgPSBvcHRpb25zID0+IHtcbiAgZnVuY3Rpb24gaXNSZWYodmFsdWUpIHtcbiAgICByZXR1cm4ge30uaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2N1cnJlbnQnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdhcnJvdycsXG4gICAgb3B0aW9ucyxcbiAgICBmbihzdGF0ZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBlbGVtZW50LFxuICAgICAgICBwYWRkaW5nXG4gICAgICB9ID0gdHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zKHN0YXRlKSA6IG9wdGlvbnM7XG4gICAgICBpZiAoZWxlbWVudCAmJiBpc1JlZihlbGVtZW50KSkge1xuICAgICAgICBpZiAoZWxlbWVudC5jdXJyZW50ICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gYXJyb3ckMih7XG4gICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LmN1cnJlbnQsXG4gICAgICAgICAgICBwYWRkaW5nXG4gICAgICAgICAgfSkuZm4oc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBhcnJvdyQyKHtcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIHBhZGRpbmdcbiAgICAgICAgfSkuZm4oc3RhdGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogTW9kaWZpZXMgdGhlIHBsYWNlbWVudCBieSB0cmFuc2xhdGluZyB0aGUgZmxvYXRpbmcgZWxlbWVudCBhbG9uZyB0aGVcbiAqIHNwZWNpZmllZCBheGVzLlxuICogQSBudW1iZXIgKHNob3J0aGFuZCBmb3IgYG1haW5BeGlzYCBvciBkaXN0YW5jZSksIG9yIGFuIGF4ZXMgY29uZmlndXJhdGlvblxuICogb2JqZWN0IG1heSBiZSBwYXNzZWQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvb2Zmc2V0XG4gKi9cbmNvbnN0IG9mZnNldCA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5vZmZzZXQkMShvcHRpb25zKSxcbiAgb3B0aW9uczogW29wdGlvbnMsIGRlcHNdXG59KTtcblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgc2hpZnRpbmcgaXQgaW4gb3JkZXIgdG9cbiAqIGtlZXAgaXQgaW4gdmlldyB3aGVuIGl0IHdpbGwgb3ZlcmZsb3cgdGhlIGNsaXBwaW5nIGJvdW5kYXJ5LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3NoaWZ0XG4gKi9cbmNvbnN0IHNoaWZ0ID0gKG9wdGlvbnMsIGRlcHMpID0+ICh7XG4gIC4uLnNoaWZ0JDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogQnVpbHQtaW4gYGxpbWl0ZXJgIHRoYXQgd2lsbCBzdG9wIGBzaGlmdCgpYCBhdCBhIGNlcnRhaW4gcG9pbnQuXG4gKi9cbmNvbnN0IGxpbWl0U2hpZnQgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4ubGltaXRTaGlmdCQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBmbGlwcGluZyB0aGUgYHBsYWNlbWVudGBcbiAqIGluIG9yZGVyIHRvIGtlZXAgaXQgaW4gdmlldyB3aGVuIHRoZSBwcmVmZXJyZWQgcGxhY2VtZW50KHMpIHdpbGwgb3ZlcmZsb3cgdGhlXG4gKiBjbGlwcGluZyBib3VuZGFyeS4gQWx0ZXJuYXRpdmUgdG8gYGF1dG9QbGFjZW1lbnRgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2ZsaXBcbiAqL1xuY29uc3QgZmxpcCA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5mbGlwJDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0aGF0IGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IOKAlFxuICogZm9yIGluc3RhbmNlLCBwcmV2ZW50IGl0IGZyb20gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIGJvdW5kYXJ5IG9yIG1hdGNoIHRoZVxuICogd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3NpemVcbiAqL1xuY29uc3Qgc2l6ZSA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5zaXplJDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IGNob29zaW5nIHRoZSBwbGFjZW1lbnRcbiAqIHRoYXQgaGFzIHRoZSBtb3N0IHNwYWNlIGF2YWlsYWJsZSBhdXRvbWF0aWNhbGx5LCB3aXRob3V0IG5lZWRpbmcgdG8gc3BlY2lmeSBhXG4gKiBwcmVmZXJyZWQgcGxhY2VtZW50LiBBbHRlcm5hdGl2ZSB0byBgZmxpcGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXV0b1BsYWNlbWVudFxuICovXG5jb25zdCBhdXRvUGxhY2VtZW50ID0gKG9wdGlvbnMsIGRlcHMpID0+ICh7XG4gIC4uLmF1dG9QbGFjZW1lbnQkMShvcHRpb25zKSxcbiAgb3B0aW9uczogW29wdGlvbnMsIGRlcHNdXG59KTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIGhpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaW4gYXBwbGljYWJsZSBzaXR1YXRpb25zLCBzdWNoIGFzXG4gKiB3aGVuIGl0IGlzIG5vdCBpbiB0aGUgc2FtZSBjbGlwcGluZyBjb250ZXh0IGFzIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9oaWRlXG4gKi9cbmNvbnN0IGhpZGUgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4uaGlkZSQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG4vKipcbiAqIFByb3ZpZGVzIGltcHJvdmVkIHBvc2l0aW9uaW5nIGZvciBpbmxpbmUgcmVmZXJlbmNlIGVsZW1lbnRzIHRoYXQgY2FuIHNwYW5cbiAqIG92ZXIgbXVsdGlwbGUgbGluZXMsIHN1Y2ggYXMgaHlwZXJsaW5rcyBvciByYW5nZSBzZWxlY3Rpb25zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2lubGluZVxuICovXG5jb25zdCBpbmxpbmUgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4uaW5saW5lJDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhbiBpbm5lciBlbGVtZW50IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHNvIHRoYXQgaXRcbiAqIGFwcGVhcnMgY2VudGVyZWQgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogVGhpcyB3cmFwcyB0aGUgY29yZSBgYXJyb3dgIG1pZGRsZXdhcmUgdG8gYWxsb3cgUmVhY3QgcmVmcyBhcyB0aGUgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hcnJvd1xuICovXG5jb25zdCBhcnJvdyA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5hcnJvdyQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG5leHBvcnQgeyBhcnJvdywgYXV0b1BsYWNlbWVudCwgZmxpcCwgaGlkZSwgaW5saW5lLCBsaW1pdFNoaWZ0LCBvZmZzZXQsIHNoaWZ0LCBzaXplLCB1c2VGbG9hdGluZyB9O1xuIiwiaW1wb3J0IHsgaXNTaGFkb3dSb290LCBpc0hUTUxFbGVtZW50IH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzL2RvbSc7XG5cbmZ1bmN0aW9uIGFjdGl2ZUVsZW1lbnQoZG9jKSB7XG4gIGxldCBhY3RpdmVFbGVtZW50ID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gIHdoaWxlICgoKF9hY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudCkgPT0gbnVsbCB8fCAoX2FjdGl2ZUVsZW1lbnQgPSBfYWN0aXZlRWxlbWVudC5zaGFkb3dSb290KSA9PSBudWxsID8gdm9pZCAwIDogX2FjdGl2ZUVsZW1lbnQuYWN0aXZlRWxlbWVudCkgIT0gbnVsbCkge1xuICAgIHZhciBfYWN0aXZlRWxlbWVudDtcbiAgICBhY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudC5zaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIGlmICghcGFyZW50IHx8ICFjaGlsZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlID09IG51bGwgPyB2b2lkIDAgOiBjaGlsZC5nZXRSb290Tm9kZSgpO1xuXG4gIC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcbiAgaWYgKHBhcmVudC5jb250YWlucyhjaGlsZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGlmIChyb290Tm9kZSAmJiBpc1NoYWRvd1Jvb3Qocm9vdE5vZGUpKSB7XG4gICAgbGV0IG5leHQgPSBjaGlsZDtcbiAgICB3aGlsZSAobmV4dCkge1xuICAgICAgaWYgKHBhcmVudCA9PT0gbmV4dCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgIH1cbiAgfVxuXG4gIC8vIEdpdmUgdXAsIHRoZSByZXN1bHQgaXMgZmFsc2VcbiAgcmV0dXJuIGZhbHNlO1xufVxuLy8gQXZvaWQgQ2hyb21lIERldlRvb2xzIGJsdWUgd2FybmluZy5cbmZ1bmN0aW9uIGdldFBsYXRmb3JtKCkge1xuICBjb25zdCB1YURhdGEgPSBuYXZpZ2F0b3IudXNlckFnZW50RGF0YTtcbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5wbGF0Zm9ybSkge1xuICAgIHJldHVybiB1YURhdGEucGxhdGZvcm07XG4gIH1cbiAgcmV0dXJuIG5hdmlnYXRvci5wbGF0Zm9ybTtcbn1cbmZ1bmN0aW9uIGdldFVzZXJBZ2VudCgpIHtcbiAgY29uc3QgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG4gIGlmICh1YURhdGEgJiYgQXJyYXkuaXNBcnJheSh1YURhdGEuYnJhbmRzKSkge1xuICAgIHJldHVybiB1YURhdGEuYnJhbmRzLm1hcChfcmVmID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGJyYW5kLFxuICAgICAgICB2ZXJzaW9uXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIHJldHVybiBicmFuZCArIFwiL1wiICsgdmVyc2lvbjtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cbiAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7XG59XG5cbi8vIExpY2Vuc2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9hZG9iZS9yZWFjdC1zcGVjdHJ1bS9ibG9iL2IzNWQ1YzAyZmU5MDBiYWRjY2QwY2YxYThmMjNiYjU5MzQxOWYyMzgvcGFja2FnZXMvQHJlYWN0LWFyaWEvdXRpbHMvc3JjL2lzVmlydHVhbEV2ZW50LnRzXG5mdW5jdGlvbiBpc1ZpcnR1YWxDbGljayhldmVudCkge1xuICAvLyBGSVhNRTogRmlyZWZveCBpcyBub3cgZW1pdHRpbmcgYSBkZXByZWNhdGlvbiB3YXJuaW5nIGZvciBgbW96SW5wdXRTb3VyY2VgLlxuICAvLyBUcnkgdG8gZmluZCBhIHdvcmthcm91bmQgZm9yIHRoaXMuIGByZWFjdC1hcmlhYCBzb3VyY2Ugc3RpbGwgaGFzIHRoZSBjaGVjay5cbiAgaWYgKGV2ZW50Lm1veklucHV0U291cmNlID09PSAwICYmIGV2ZW50LmlzVHJ1c3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc0FuZHJvaWQoKSAmJiBldmVudC5wb2ludGVyVHlwZSkge1xuICAgIHJldHVybiBldmVudC50eXBlID09PSAnY2xpY2snICYmIGV2ZW50LmJ1dHRvbnMgPT09IDE7XG4gIH1cbiAgcmV0dXJuIGV2ZW50LmRldGFpbCA9PT0gMCAmJiAhZXZlbnQucG9pbnRlclR5cGU7XG59XG5mdW5jdGlvbiBpc1ZpcnR1YWxQb2ludGVyRXZlbnQoZXZlbnQpIHtcbiAgaWYgKGlzSlNET00oKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gIWlzQW5kcm9pZCgpICYmIGV2ZW50LndpZHRoID09PSAwICYmIGV2ZW50LmhlaWdodCA9PT0gMCB8fCBpc0FuZHJvaWQoKSAmJiBldmVudC53aWR0aCA9PT0gMSAmJiBldmVudC5oZWlnaHQgPT09IDEgJiYgZXZlbnQucHJlc3N1cmUgPT09IDAgJiYgZXZlbnQuZGV0YWlsID09PSAwICYmIGV2ZW50LnBvaW50ZXJUeXBlID09PSAnbW91c2UnIHx8XG4gIC8vIGlPUyBWb2ljZU92ZXIgcmV0dXJucyAwLjMzM+KAoiBmb3Igd2lkdGgvaGVpZ2h0LlxuICBldmVudC53aWR0aCA8IDEgJiYgZXZlbnQuaGVpZ2h0IDwgMSAmJiBldmVudC5wcmVzc3VyZSA9PT0gMCAmJiBldmVudC5kZXRhaWwgPT09IDAgJiYgZXZlbnQucG9pbnRlclR5cGUgPT09ICd0b3VjaCc7XG59XG5mdW5jdGlvbiBpc1NhZmFyaSgpIHtcbiAgLy8gQ2hyb21lIERldlRvb2xzIGRvZXMgbm90IGNvbXBsYWluIGFib3V0IG5hdmlnYXRvci52ZW5kb3JcbiAgcmV0dXJuIC9hcHBsZS9pLnRlc3QobmF2aWdhdG9yLnZlbmRvcik7XG59XG5mdW5jdGlvbiBpc0FuZHJvaWQoKSB7XG4gIGNvbnN0IHJlID0gL2FuZHJvaWQvaTtcbiAgcmV0dXJuIHJlLnRlc3QoZ2V0UGxhdGZvcm0oKSkgfHwgcmUudGVzdChnZXRVc2VyQWdlbnQoKSk7XG59XG5mdW5jdGlvbiBpc01hYygpIHtcbiAgcmV0dXJuIGdldFBsYXRmb3JtKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdtYWMnKSAmJiAhbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzO1xufVxuZnVuY3Rpb24gaXNKU0RPTSgpIHtcbiAgcmV0dXJuIGdldFVzZXJBZ2VudCgpLmluY2x1ZGVzKCdqc2RvbS8nKTtcbn1cbmZ1bmN0aW9uIGlzTW91c2VMaWtlUG9pbnRlclR5cGUocG9pbnRlclR5cGUsIHN0cmljdCkge1xuICAvLyBPbiBzb21lIExpbnV4IG1hY2hpbmVzIHdpdGggQ2hyb21pdW0sIG1vdXNlIGlucHV0cyByZXR1cm4gYSBgcG9pbnRlclR5cGVgXG4gIC8vIG9mIFwicGVuXCI6IGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMjAxNVxuICBjb25zdCB2YWx1ZXMgPSBbJ21vdXNlJywgJ3BlbiddO1xuICBpZiAoIXN0cmljdCkge1xuICAgIHZhbHVlcy5wdXNoKCcnLCB1bmRlZmluZWQpO1xuICB9XG4gIHJldHVybiB2YWx1ZXMuaW5jbHVkZXMocG9pbnRlclR5cGUpO1xufVxuZnVuY3Rpb24gaXNSZWFjdEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiAnbmF0aXZlRXZlbnQnIGluIGV2ZW50O1xufVxuZnVuY3Rpb24gaXNSb290RWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50Lm1hdGNoZXMoJ2h0bWwsYm9keScpO1xufVxuZnVuY3Rpb24gZ2V0RG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gKG5vZGUgPT0gbnVsbCA/IHZvaWQgMCA6IG5vZGUub3duZXJEb2N1bWVudCkgfHwgZG9jdW1lbnQ7XG59XG5mdW5jdGlvbiBpc0V2ZW50VGFyZ2V0V2l0aGluKGV2ZW50LCBub2RlKSB7XG4gIGlmIChub2RlID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCdjb21wb3NlZFBhdGgnIGluIGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKG5vZGUpO1xuICB9XG5cbiAgLy8gVFMgdGhpbmtzIGBldmVudGAgaXMgb2YgdHlwZSBuZXZlciBhcyBpdCBhc3N1bWVzIGFsbCBicm93c2VycyBzdXBwb3J0IGNvbXBvc2VkUGF0aCwgYnV0IGJyb3dzZXJzIHdpdGhvdXQgc2hhZG93IGRvbSBkb24ndFxuICBjb25zdCBlID0gZXZlbnQ7XG4gIHJldHVybiBlLnRhcmdldCAhPSBudWxsICYmIG5vZGUuY29udGFpbnMoZS50YXJnZXQpO1xufVxuZnVuY3Rpb24gZ2V0VGFyZ2V0KGV2ZW50KSB7XG4gIGlmICgnY29tcG9zZWRQYXRoJyBpbiBldmVudCkge1xuICAgIHJldHVybiBldmVudC5jb21wb3NlZFBhdGgoKVswXTtcbiAgfVxuXG4gIC8vIFRTIHRoaW5rcyBgZXZlbnRgIGlzIG9mIHR5cGUgbmV2ZXIgYXMgaXQgYXNzdW1lcyBhbGwgYnJvd3NlcnMgc3VwcG9ydFxuICAvLyBgY29tcG9zZWRQYXRoKClgLCBidXQgYnJvd3NlcnMgd2l0aG91dCBzaGFkb3cgRE9NIGRvbid0LlxuICByZXR1cm4gZXZlbnQudGFyZ2V0O1xufVxuY29uc3QgVFlQRUFCTEVfU0VMRUNUT1IgPSBcImlucHV0Om5vdChbdHlwZT0naGlkZGVuJ10pOm5vdChbZGlzYWJsZWRdKSxcIiArIFwiW2NvbnRlbnRlZGl0YWJsZV06bm90KFtjb250ZW50ZWRpdGFibGU9J2ZhbHNlJ10pLHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKVwiO1xuZnVuY3Rpb24gaXNUeXBlYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gaXNIVE1MRWxlbWVudChlbGVtZW50KSAmJiBlbGVtZW50Lm1hdGNoZXMoVFlQRUFCTEVfU0VMRUNUT1IpO1xufVxuZnVuY3Rpb24gc3RvcEV2ZW50KGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufVxuZnVuY3Rpb24gaXNUeXBlYWJsZUNvbWJvYm94KGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnY29tYm9ib3gnICYmIGlzVHlwZWFibGVFbGVtZW50KGVsZW1lbnQpO1xufVxuXG5leHBvcnQgeyBUWVBFQUJMRV9TRUxFQ1RPUiwgYWN0aXZlRWxlbWVudCwgY29udGFpbnMsIGdldERvY3VtZW50LCBnZXRQbGF0Zm9ybSwgZ2V0VGFyZ2V0LCBnZXRVc2VyQWdlbnQsIGlzQW5kcm9pZCwgaXNFdmVudFRhcmdldFdpdGhpbiwgaXNKU0RPTSwgaXNNYWMsIGlzTW91c2VMaWtlUG9pbnRlclR5cGUsIGlzUmVhY3RFdmVudCwgaXNSb290RWxlbWVudCwgaXNTYWZhcmksIGlzVHlwZWFibGVDb21ib2JveCwgaXNUeXBlYWJsZUVsZW1lbnQsIGlzVmlydHVhbENsaWNrLCBpc1ZpcnR1YWxQb2ludGVyRXZlbnQsIHN0b3BFdmVudCB9O1xuIiwiZnVuY3Rpb24gZ2V0Tm9kZU5hbWUobm9kZSkge1xuICBpZiAoaXNOb2RlKG5vZGUpKSB7XG4gICAgcmV0dXJuIChub2RlLm5vZGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIC8vIE1vY2tlZCBub2RlcyBpbiB0ZXN0aW5nIGVudmlyb25tZW50cyBtYXkgbm90IGJlIGluc3RhbmNlcyBvZiBOb2RlLiBCeVxuICAvLyByZXR1cm5pbmcgYCNkb2N1bWVudGAgYW4gaW5maW5pdGUgbG9vcCB3b24ndCBvY2N1ci5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yMzE3XG4gIHJldHVybiAnI2RvY3VtZW50Jztcbn1cbmZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIHZhciBfbm9kZSRvd25lckRvY3VtZW50O1xuICByZXR1cm4gKG5vZGUgPT0gbnVsbCB8fCAoX25vZGUkb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIHx8IHdpbmRvdztcbn1cbmZ1bmN0aW9uIGdldERvY3VtZW50RWxlbWVudChub2RlKSB7XG4gIHZhciBfcmVmO1xuICByZXR1cm4gKF9yZWYgPSAoaXNOb2RlKG5vZGUpID8gbm9kZS5vd25lckRvY3VtZW50IDogbm9kZS5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX3JlZi5kb2N1bWVudEVsZW1lbnQ7XG59XG5mdW5jdGlvbiBpc05vZGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgTm9kZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuTm9kZTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHZhbHVlIGluc3RhbmNlb2YgZ2V0V2luZG93KHZhbHVlKS5FbGVtZW50O1xufVxuZnVuY3Rpb24gaXNIVE1MRWxlbWVudCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuSFRNTEVsZW1lbnQ7XG59XG5mdW5jdGlvbiBpc1NoYWRvd1Jvb3QodmFsdWUpIHtcbiAgLy8gQnJvd3NlcnMgd2l0aG91dCBgU2hhZG93Um9vdGAgc3VwcG9ydC5cbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBTaGFkb3dSb290IHx8IHZhbHVlIGluc3RhbmNlb2YgZ2V0V2luZG93KHZhbHVlKS5TaGFkb3dSb290O1xufVxuZnVuY3Rpb24gaXNPdmVyZmxvd0VsZW1lbnQoZWxlbWVudCkge1xuICBjb25zdCB7XG4gICAgb3ZlcmZsb3csXG4gICAgb3ZlcmZsb3dYLFxuICAgIG92ZXJmbG93WSxcbiAgICBkaXNwbGF5XG4gIH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICByZXR1cm4gL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVufGNsaXAvLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpICYmICFbJ2lubGluZScsICdjb250ZW50cyddLmluY2x1ZGVzKGRpc3BsYXkpO1xufVxuZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluY2x1ZGVzKGdldE5vZGVOYW1lKGVsZW1lbnQpKTtcbn1cbmZ1bmN0aW9uIGlzVG9wTGF5ZXIoZWxlbWVudCkge1xuICByZXR1cm4gWyc6cG9wb3Zlci1vcGVuJywgJzptb2RhbCddLnNvbWUoc2VsZWN0b3IgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGlzQ29udGFpbmluZ0Jsb2NrKGVsZW1lbnRPckNzcykge1xuICBjb25zdCB3ZWJraXQgPSBpc1dlYktpdCgpO1xuICBjb25zdCBjc3MgPSBpc0VsZW1lbnQoZWxlbWVudE9yQ3NzKSA/IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudE9yQ3NzKSA6IGVsZW1lbnRPckNzcztcblxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ29udGFpbmluZ19ibG9jayNpZGVudGlmeWluZ190aGVfY29udGFpbmluZ19ibG9ja1xuICByZXR1cm4gY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IChjc3MuY29udGFpbmVyVHlwZSA/IGNzcy5jb250YWluZXJUeXBlICE9PSAnbm9ybWFsJyA6IGZhbHNlKSB8fCAhd2Via2l0ICYmIChjc3MuYmFja2Ryb3BGaWx0ZXIgPyBjc3MuYmFja2Ryb3BGaWx0ZXIgIT09ICdub25lJyA6IGZhbHNlKSB8fCAhd2Via2l0ICYmIChjc3MuZmlsdGVyID8gY3NzLmZpbHRlciAhPT0gJ25vbmUnIDogZmFsc2UpIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJywgJ2ZpbHRlciddLnNvbWUodmFsdWUgPT4gKGNzcy53aWxsQ2hhbmdlIHx8ICcnKS5pbmNsdWRlcyh2YWx1ZSkpIHx8IFsncGFpbnQnLCAnbGF5b3V0JywgJ3N0cmljdCcsICdjb250ZW50J10uc29tZSh2YWx1ZSA9PiAoY3NzLmNvbnRhaW4gfHwgJycpLmluY2x1ZGVzKHZhbHVlKSk7XG59XG5mdW5jdGlvbiBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkge1xuICBsZXQgY3VycmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgIWlzTGFzdFRyYXZlcnNhYmxlTm9kZShjdXJyZW50Tm9kZSkpIHtcbiAgICBpZiAoaXNDb250YWluaW5nQmxvY2soY3VycmVudE5vZGUpKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIGlmIChpc1RvcExheWVyKGN1cnJlbnROb2RlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShjdXJyZW50Tm9kZSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBpc1dlYktpdCgpIHtcbiAgaWYgKHR5cGVvZiBDU1MgPT09ICd1bmRlZmluZWQnIHx8ICFDU1Muc3VwcG9ydHMpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIENTUy5zdXBwb3J0cygnLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXInLCAnbm9uZScpO1xufVxuZnVuY3Rpb24gaXNMYXN0VHJhdmVyc2FibGVOb2RlKG5vZGUpIHtcbiAgcmV0dXJuIFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluY2x1ZGVzKGdldE5vZGVOYW1lKG5vZGUpKTtcbn1cbmZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59XG5mdW5jdGlvbiBnZXROb2RlU2Nyb2xsKGVsZW1lbnQpIHtcbiAgaWYgKGlzRWxlbWVudChlbGVtZW50KSkge1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnNjcm9sbExlZnQsXG4gICAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsWCxcbiAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsWVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShub2RlKSB7XG4gIGlmIChnZXROb2RlTmFtZShub2RlKSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID1cbiAgLy8gU3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGUuXG4gIG5vZGUuYXNzaWduZWRTbG90IHx8XG4gIC8vIERPTSBFbGVtZW50IGRldGVjdGVkLlxuICBub2RlLnBhcmVudE5vZGUgfHxcbiAgLy8gU2hhZG93Um9vdCBkZXRlY3RlZC5cbiAgaXNTaGFkb3dSb290KG5vZGUpICYmIG5vZGUuaG9zdCB8fFxuICAvLyBGYWxsYmFjay5cbiAgZ2V0RG9jdW1lbnRFbGVtZW50KG5vZGUpO1xuICByZXR1cm4gaXNTaGFkb3dSb290KHJlc3VsdCkgPyByZXN1bHQuaG9zdCA6IHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldE5lYXJlc3RPdmVyZmxvd0FuY2VzdG9yKG5vZGUpIHtcbiAgY29uc3QgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUobm9kZSk7XG4gIGlmIChpc0xhc3RUcmF2ZXJzYWJsZU5vZGUocGFyZW50Tm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50ID8gbm9kZS5vd25lckRvY3VtZW50LmJvZHkgOiBub2RlLmJvZHk7XG4gIH1cbiAgaWYgKGlzSFRNTEVsZW1lbnQocGFyZW50Tm9kZSkgJiYgaXNPdmVyZmxvd0VsZW1lbnQocGFyZW50Tm9kZSkpIHtcbiAgICByZXR1cm4gcGFyZW50Tm9kZTtcbiAgfVxuICByZXR1cm4gZ2V0TmVhcmVzdE92ZXJmbG93QW5jZXN0b3IocGFyZW50Tm9kZSk7XG59XG5mdW5jdGlvbiBnZXRPdmVyZmxvd0FuY2VzdG9ycyhub2RlLCBsaXN0LCB0cmF2ZXJzZUlmcmFtZXMpIHtcbiAgdmFyIF9ub2RlJG93bmVyRG9jdW1lbnQyO1xuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG4gIGlmICh0cmF2ZXJzZUlmcmFtZXMgPT09IHZvaWQgMCkge1xuICAgIHRyYXZlcnNlSWZyYW1lcyA9IHRydWU7XG4gIH1cbiAgY29uc3Qgc2Nyb2xsYWJsZUFuY2VzdG9yID0gZ2V0TmVhcmVzdE92ZXJmbG93QW5jZXN0b3Iobm9kZSk7XG4gIGNvbnN0IGlzQm9keSA9IHNjcm9sbGFibGVBbmNlc3RvciA9PT0gKChfbm9kZSRvd25lckRvY3VtZW50MiA9IG5vZGUub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJG93bmVyRG9jdW1lbnQyLmJvZHkpO1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsYWJsZUFuY2VzdG9yKTtcbiAgaWYgKGlzQm9keSkge1xuICAgIGNvbnN0IGZyYW1lRWxlbWVudCA9IGdldEZyYW1lRWxlbWVudCh3aW4pO1xuICAgIHJldHVybiBsaXN0LmNvbmNhdCh3aW4sIHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSwgaXNPdmVyZmxvd0VsZW1lbnQoc2Nyb2xsYWJsZUFuY2VzdG9yKSA/IHNjcm9sbGFibGVBbmNlc3RvciA6IFtdLCBmcmFtZUVsZW1lbnQgJiYgdHJhdmVyc2VJZnJhbWVzID8gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZnJhbWVFbGVtZW50KSA6IFtdKTtcbiAgfVxuICByZXR1cm4gbGlzdC5jb25jYXQoc2Nyb2xsYWJsZUFuY2VzdG9yLCBnZXRPdmVyZmxvd0FuY2VzdG9ycyhzY3JvbGxhYmxlQW5jZXN0b3IsIFtdLCB0cmF2ZXJzZUlmcmFtZXMpKTtcbn1cbmZ1bmN0aW9uIGdldEZyYW1lRWxlbWVudCh3aW4pIHtcbiAgcmV0dXJuIHdpbi5wYXJlbnQgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHdpbi5wYXJlbnQpID8gd2luLmZyYW1lRWxlbWVudCA6IG51bGw7XG59XG5cbmV4cG9ydCB7IGdldENvbXB1dGVkU3R5bGUsIGdldENvbnRhaW5pbmdCbG9jaywgZ2V0RG9jdW1lbnRFbGVtZW50LCBnZXRGcmFtZUVsZW1lbnQsIGdldE5lYXJlc3RPdmVyZmxvd0FuY2VzdG9yLCBnZXROb2RlTmFtZSwgZ2V0Tm9kZVNjcm9sbCwgZ2V0T3ZlcmZsb3dBbmNlc3RvcnMsIGdldFBhcmVudE5vZGUsIGdldFdpbmRvdywgaXNDb250YWluaW5nQmxvY2ssIGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCwgaXNMYXN0VHJhdmVyc2FibGVOb2RlLCBpc05vZGUsIGlzT3ZlcmZsb3dFbGVtZW50LCBpc1NoYWRvd1Jvb3QsIGlzVGFibGVFbGVtZW50LCBpc1RvcExheWVyLCBpc1dlYktpdCB9O1xuIiwiLyoqXG4gKiBDdXN0b20gcG9zaXRpb25pbmcgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdmlydHVhbC1lbGVtZW50c1xuICovXG5cbmNvbnN0IHNpZGVzID0gWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXTtcbmNvbnN0IGFsaWdubWVudHMgPSBbJ3N0YXJ0JywgJ2VuZCddO1xuY29uc3QgcGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9zaWRlcy5yZWR1Y2UoKGFjYywgc2lkZSkgPT4gYWNjLmNvbmNhdChzaWRlLCBzaWRlICsgXCItXCIgKyBhbGlnbm1lbnRzWzBdLCBzaWRlICsgXCItXCIgKyBhbGlnbm1lbnRzWzFdKSwgW10pO1xuY29uc3QgbWluID0gTWF0aC5taW47XG5jb25zdCBtYXggPSBNYXRoLm1heDtcbmNvbnN0IHJvdW5kID0gTWF0aC5yb3VuZDtcbmNvbnN0IGZsb29yID0gTWF0aC5mbG9vcjtcbmNvbnN0IGNyZWF0ZUNvb3JkcyA9IHYgPT4gKHtcbiAgeDogdixcbiAgeTogdlxufSk7XG5jb25zdCBvcHBvc2l0ZVNpZGVNYXAgPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIGJvdHRvbTogJ3RvcCcsXG4gIHRvcDogJ2JvdHRvbSdcbn07XG5jb25zdCBvcHBvc2l0ZUFsaWdubWVudE1hcCA9IHtcbiAgc3RhcnQ6ICdlbmQnLFxuICBlbmQ6ICdzdGFydCdcbn07XG5mdW5jdGlvbiBjbGFtcChzdGFydCwgdmFsdWUsIGVuZCkge1xuICByZXR1cm4gbWF4KHN0YXJ0LCBtaW4odmFsdWUsIGVuZCkpO1xufVxuZnVuY3Rpb24gZXZhbHVhdGUodmFsdWUsIHBhcmFtKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZShwYXJhbSkgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFNpZGUocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbn1cbmZ1bmN0aW9uIGdldEFsaWdubWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xufVxuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn1cbmZ1bmN0aW9uIGdldEF4aXNMZW5ndGgoYXhpcykge1xuICByZXR1cm4gYXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xufVxuZnVuY3Rpb24gZ2V0U2lkZUF4aXMocGxhY2VtZW50KSB7XG4gIHJldHVybiBbJ3RvcCcsICdib3R0b20nXS5pbmNsdWRlcyhnZXRTaWRlKHBsYWNlbWVudCkpID8gJ3knIDogJ3gnO1xufVxuZnVuY3Rpb24gZ2V0QWxpZ25tZW50QXhpcyhwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGdldE9wcG9zaXRlQXhpcyhnZXRTaWRlQXhpcyhwbGFjZW1lbnQpKTtcbn1cbmZ1bmN0aW9uIGdldEFsaWdubWVudFNpZGVzKHBsYWNlbWVudCwgcmVjdHMsIHJ0bCkge1xuICBpZiAocnRsID09PSB2b2lkIDApIHtcbiAgICBydGwgPSBmYWxzZTtcbiAgfVxuICBjb25zdCBhbGlnbm1lbnQgPSBnZXRBbGlnbm1lbnQocGxhY2VtZW50KTtcbiAgY29uc3QgYWxpZ25tZW50QXhpcyA9IGdldEFsaWdubWVudEF4aXMocGxhY2VtZW50KTtcbiAgY29uc3QgbGVuZ3RoID0gZ2V0QXhpc0xlbmd0aChhbGlnbm1lbnRBeGlzKTtcbiAgbGV0IG1haW5BbGlnbm1lbnRTaWRlID0gYWxpZ25tZW50QXhpcyA9PT0gJ3gnID8gYWxpZ25tZW50ID09PSAocnRsID8gJ2VuZCcgOiAnc3RhcnQnKSA/ICdyaWdodCcgOiAnbGVmdCcgOiBhbGlnbm1lbnQgPT09ICdzdGFydCcgPyAnYm90dG9tJyA6ICd0b3AnO1xuICBpZiAocmVjdHMucmVmZXJlbmNlW2xlbmd0aF0gPiByZWN0cy5mbG9hdGluZ1tsZW5ndGhdKSB7XG4gICAgbWFpbkFsaWdubWVudFNpZGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluQWxpZ25tZW50U2lkZSk7XG4gIH1cbiAgcmV0dXJuIFttYWluQWxpZ25tZW50U2lkZSwgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpbkFsaWdubWVudFNpZGUpXTtcbn1cbmZ1bmN0aW9uIGdldEV4cGFuZGVkUGxhY2VtZW50cyhwbGFjZW1lbnQpIHtcbiAgY29uc3Qgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIGFsaWdubWVudCA9PiBvcHBvc2l0ZUFsaWdubWVudE1hcFthbGlnbm1lbnRdKTtcbn1cbmZ1bmN0aW9uIGdldFNpZGVMaXN0KHNpZGUsIGlzU3RhcnQsIHJ0bCkge1xuICBjb25zdCBsciA9IFsnbGVmdCcsICdyaWdodCddO1xuICBjb25zdCBybCA9IFsncmlnaHQnLCAnbGVmdCddO1xuICBjb25zdCB0YiA9IFsndG9wJywgJ2JvdHRvbSddO1xuICBjb25zdCBidCA9IFsnYm90dG9tJywgJ3RvcCddO1xuICBzd2l0Y2ggKHNpZGUpIHtcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBpZiAocnRsKSByZXR1cm4gaXNTdGFydCA/IHJsIDogbHI7XG4gICAgICByZXR1cm4gaXNTdGFydCA/IGxyIDogcmw7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgcmV0dXJuIGlzU3RhcnQgPyB0YiA6IGJ0O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gW107XG4gIH1cbn1cbmZ1bmN0aW9uIGdldE9wcG9zaXRlQXhpc1BsYWNlbWVudHMocGxhY2VtZW50LCBmbGlwQWxpZ25tZW50LCBkaXJlY3Rpb24sIHJ0bCkge1xuICBjb25zdCBhbGlnbm1lbnQgPSBnZXRBbGlnbm1lbnQocGxhY2VtZW50KTtcbiAgbGV0IGxpc3QgPSBnZXRTaWRlTGlzdChnZXRTaWRlKHBsYWNlbWVudCksIGRpcmVjdGlvbiA9PT0gJ3N0YXJ0JywgcnRsKTtcbiAgaWYgKGFsaWdubWVudCkge1xuICAgIGxpc3QgPSBsaXN0Lm1hcChzaWRlID0+IHNpZGUgKyBcIi1cIiArIGFsaWdubWVudCk7XG4gICAgaWYgKGZsaXBBbGlnbm1lbnQpIHtcbiAgICAgIGxpc3QgPSBsaXN0LmNvbmNhdChsaXN0Lm1hcChnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGlzdDtcbn1cbmZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBzaWRlID0+IG9wcG9zaXRlU2lkZU1hcFtzaWRlXSk7XG59XG5mdW5jdGlvbiBleHBhbmRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgLi4ucGFkZGluZ1xuICB9O1xufVxuZnVuY3Rpb24gZ2V0UGFkZGluZ09iamVjdChwYWRkaW5nKSB7XG4gIHJldHVybiB0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBleHBhbmRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpIDoge1xuICAgIHRvcDogcGFkZGluZyxcbiAgICByaWdodDogcGFkZGluZyxcbiAgICBib3R0b206IHBhZGRpbmcsXG4gICAgbGVmdDogcGFkZGluZ1xuICB9O1xufVxuZnVuY3Rpb24gcmVjdFRvQ2xpZW50UmVjdChyZWN0KSB7XG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0gPSByZWN0O1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB0b3A6IHksXG4gICAgbGVmdDogeCxcbiAgICByaWdodDogeCArIHdpZHRoLFxuICAgIGJvdHRvbTogeSArIGhlaWdodCxcbiAgICB4LFxuICAgIHlcbiAgfTtcbn1cblxuZXhwb3J0IHsgYWxpZ25tZW50cywgY2xhbXAsIGNyZWF0ZUNvb3JkcywgZXZhbHVhdGUsIGV4cGFuZFBhZGRpbmdPYmplY3QsIGZsb29yLCBnZXRBbGlnbm1lbnQsIGdldEFsaWdubWVudEF4aXMsIGdldEFsaWdubWVudFNpZGVzLCBnZXRBeGlzTGVuZ3RoLCBnZXRFeHBhbmRlZFBsYWNlbWVudHMsIGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50LCBnZXRPcHBvc2l0ZUF4aXMsIGdldE9wcG9zaXRlQXhpc1BsYWNlbWVudHMsIGdldE9wcG9zaXRlUGxhY2VtZW50LCBnZXRQYWRkaW5nT2JqZWN0LCBnZXRTaWRlLCBnZXRTaWRlQXhpcywgbWF4LCBtaW4sIHBsYWNlbWVudHMsIHJlY3RUb0NsaWVudFJlY3QsIHJvdW5kLCBzaWRlcyB9O1xuIiwiLy8gcGFja2FnZXMvY29yZS9wcmltaXRpdmUvc3JjL3ByaW1pdGl2ZS50c3hcbmZ1bmN0aW9uIGNvbXBvc2VFdmVudEhhbmRsZXJzKG9yaWdpbmFsRXZlbnRIYW5kbGVyLCBvdXJFdmVudEhhbmRsZXIsIHsgY2hlY2tGb3JEZWZhdWx0UHJldmVudGVkID0gdHJ1ZSB9ID0ge30pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgb3JpZ2luYWxFdmVudEhhbmRsZXI/LihldmVudCk7XG4gICAgaWYgKGNoZWNrRm9yRGVmYXVsdFByZXZlbnRlZCA9PT0gZmFsc2UgfHwgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybiBvdXJFdmVudEhhbmRsZXI/LihldmVudCk7XG4gICAgfVxuICB9O1xufVxuZXhwb3J0IHtcbiAgY29tcG9zZUV2ZW50SGFuZGxlcnNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC9hcnJvdy9zcmMvQXJyb3cudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBOQU1FID0gXCJBcnJvd1wiO1xudmFyIEFycm93ID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IGNoaWxkcmVuLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1LCAuLi5hcnJvd1Byb3BzIH0gPSBwcm9wcztcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgUHJpbWl0aXZlLnN2ZyxcbiAgICB7XG4gICAgICAuLi5hcnJvd1Byb3BzLFxuICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHZpZXdCb3g6IFwiMCAwIDMwIDEwXCIsXG4gICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiBcIm5vbmVcIixcbiAgICAgIGNoaWxkcmVuOiBwcm9wcy5hc0NoaWxkID8gY2hpbGRyZW4gOiAvKiBAX19QVVJFX18gKi8ganN4KFwicG9seWdvblwiLCB7IHBvaW50czogXCIwLDAgMzAsMCAxNSwxMFwiIH0pXG4gICAgfVxuICApO1xufSk7XG5BcnJvdy5kaXNwbGF5TmFtZSA9IE5BTUU7XG52YXIgUm9vdCA9IEFycm93O1xuZXhwb3J0IHtcbiAgQXJyb3csXG4gIFJvb3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvY29sbGVjdGlvbi9zcmMvQ29sbGVjdGlvbi50c3hcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHRTY29wZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29udGV4dFwiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZWRSZWZzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnNcIjtcbmltcG9ydCB7IFNsb3QgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXNsb3RcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZnVuY3Rpb24gY3JlYXRlQ29sbGVjdGlvbihuYW1lKSB7XG4gIGNvbnN0IFBST1ZJREVSX05BTUUgPSBuYW1lICsgXCJDb2xsZWN0aW9uUHJvdmlkZXJcIjtcbiAgY29uc3QgW2NyZWF0ZUNvbGxlY3Rpb25Db250ZXh0LCBjcmVhdGVDb2xsZWN0aW9uU2NvcGVdID0gY3JlYXRlQ29udGV4dFNjb3BlKFBST1ZJREVSX05BTUUpO1xuICBjb25zdCBbQ29sbGVjdGlvblByb3ZpZGVySW1wbCwgdXNlQ29sbGVjdGlvbkNvbnRleHRdID0gY3JlYXRlQ29sbGVjdGlvbkNvbnRleHQoXG4gICAgUFJPVklERVJfTkFNRSxcbiAgICB7IGNvbGxlY3Rpb25SZWY6IHsgY3VycmVudDogbnVsbCB9LCBpdGVtTWFwOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpIH1cbiAgKTtcbiAgY29uc3QgQ29sbGVjdGlvblByb3ZpZGVyID0gKHByb3BzKSA9PiB7XG4gICAgY29uc3QgeyBzY29wZSwgY2hpbGRyZW4gfSA9IHByb3BzO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBpdGVtTWFwID0gUmVhY3QudXNlUmVmKC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpLmN1cnJlbnQ7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goQ29sbGVjdGlvblByb3ZpZGVySW1wbCwgeyBzY29wZSwgaXRlbU1hcCwgY29sbGVjdGlvblJlZjogcmVmLCBjaGlsZHJlbiB9KTtcbiAgfTtcbiAgQ29sbGVjdGlvblByb3ZpZGVyLmRpc3BsYXlOYW1lID0gUFJPVklERVJfTkFNRTtcbiAgY29uc3QgQ09MTEVDVElPTl9TTE9UX05BTUUgPSBuYW1lICsgXCJDb2xsZWN0aW9uU2xvdFwiO1xuICBjb25zdCBDb2xsZWN0aW9uU2xvdCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gICAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICAgIGNvbnN0IHsgc2NvcGUsIGNoaWxkcmVuIH0gPSBwcm9wcztcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb2xsZWN0aW9uQ29udGV4dChDT0xMRUNUSU9OX1NMT1RfTkFNRSwgc2NvcGUpO1xuICAgICAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgY29udGV4dC5jb2xsZWN0aW9uUmVmKTtcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFNsb3QsIHsgcmVmOiBjb21wb3NlZFJlZnMsIGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgKTtcbiAgQ29sbGVjdGlvblNsb3QuZGlzcGxheU5hbWUgPSBDT0xMRUNUSU9OX1NMT1RfTkFNRTtcbiAgY29uc3QgSVRFTV9TTE9UX05BTUUgPSBuYW1lICsgXCJDb2xsZWN0aW9uSXRlbVNsb3RcIjtcbiAgY29uc3QgSVRFTV9EQVRBX0FUVFIgPSBcImRhdGEtcmFkaXgtY29sbGVjdGlvbi1pdGVtXCI7XG4gIGNvbnN0IENvbGxlY3Rpb25JdGVtU2xvdCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gICAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICAgIGNvbnN0IHsgc2NvcGUsIGNoaWxkcmVuLCAuLi5pdGVtRGF0YSB9ID0gcHJvcHM7XG4gICAgICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICAgICAgY29uc3QgY29udGV4dCA9IHVzZUNvbGxlY3Rpb25Db250ZXh0KElURU1fU0xPVF9OQU1FLCBzY29wZSk7XG4gICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb250ZXh0Lml0ZW1NYXAuc2V0KHJlZiwgeyByZWYsIC4uLml0ZW1EYXRhIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4gdm9pZCBjb250ZXh0Lml0ZW1NYXAuZGVsZXRlKHJlZik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFNsb3QsIHsgLi4ueyBbSVRFTV9EQVRBX0FUVFJdOiBcIlwiIH0sIHJlZjogY29tcG9zZWRSZWZzLCBjaGlsZHJlbiB9KTtcbiAgICB9XG4gICk7XG4gIENvbGxlY3Rpb25JdGVtU2xvdC5kaXNwbGF5TmFtZSA9IElURU1fU0xPVF9OQU1FO1xuICBmdW5jdGlvbiB1c2VDb2xsZWN0aW9uKHNjb3BlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZUNvbGxlY3Rpb25Db250ZXh0KG5hbWUgKyBcIkNvbGxlY3Rpb25Db25zdW1lclwiLCBzY29wZSk7XG4gICAgY29uc3QgZ2V0SXRlbXMgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uTm9kZSA9IGNvbnRleHQuY29sbGVjdGlvblJlZi5jdXJyZW50O1xuICAgICAgaWYgKCFjb2xsZWN0aW9uTm9kZSkgcmV0dXJuIFtdO1xuICAgICAgY29uc3Qgb3JkZXJlZE5vZGVzID0gQXJyYXkuZnJvbShjb2xsZWN0aW9uTm9kZS5xdWVyeVNlbGVjdG9yQWxsKGBbJHtJVEVNX0RBVEFfQVRUUn1dYCkpO1xuICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKGNvbnRleHQuaXRlbU1hcC52YWx1ZXMoKSk7XG4gICAgICBjb25zdCBvcmRlcmVkSXRlbXMgPSBpdGVtcy5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gb3JkZXJlZE5vZGVzLmluZGV4T2YoYS5yZWYuY3VycmVudCkgLSBvcmRlcmVkTm9kZXMuaW5kZXhPZihiLnJlZi5jdXJyZW50KVxuICAgICAgKTtcbiAgICAgIHJldHVybiBvcmRlcmVkSXRlbXM7XG4gICAgfSwgW2NvbnRleHQuY29sbGVjdGlvblJlZiwgY29udGV4dC5pdGVtTWFwXSk7XG4gICAgcmV0dXJuIGdldEl0ZW1zO1xuICB9XG4gIHJldHVybiBbXG4gICAgeyBQcm92aWRlcjogQ29sbGVjdGlvblByb3ZpZGVyLCBTbG90OiBDb2xsZWN0aW9uU2xvdCwgSXRlbVNsb3Q6IENvbGxlY3Rpb25JdGVtU2xvdCB9LFxuICAgIHVzZUNvbGxlY3Rpb24sXG4gICAgY3JlYXRlQ29sbGVjdGlvblNjb3BlXG4gIF07XG59XG5leHBvcnQge1xuICBjcmVhdGVDb2xsZWN0aW9uXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvY29tcG9zZS1yZWZzL3NyYy9jb21wb3NlUmVmcy50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gc2V0UmVmKHJlZiwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJlZih2YWx1ZSk7XG4gIH0gZWxzZSBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdm9pZCAwKSB7XG4gICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gY29tcG9zZVJlZnMoLi4ucmVmcykge1xuICByZXR1cm4gKG5vZGUpID0+IHJlZnMuZm9yRWFjaCgocmVmKSA9PiBzZXRSZWYocmVmLCBub2RlKSk7XG59XG5mdW5jdGlvbiB1c2VDb21wb3NlZFJlZnMoLi4ucmVmcykge1xuICByZXR1cm4gUmVhY3QudXNlQ2FsbGJhY2soY29tcG9zZVJlZnMoLi4ucmVmcyksIHJlZnMpO1xufVxuZXhwb3J0IHtcbiAgY29tcG9zZVJlZnMsXG4gIHVzZUNvbXBvc2VkUmVmc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L2NvbnRleHQvc3JjL2NyZWF0ZUNvbnRleHQudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZnVuY3Rpb24gY3JlYXRlQ29udGV4dDIocm9vdENvbXBvbmVudE5hbWUsIGRlZmF1bHRDb250ZXh0KSB7XG4gIGNvbnN0IENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KGRlZmF1bHRDb250ZXh0KTtcbiAgZnVuY3Rpb24gUHJvdmlkZXIocHJvcHMpIHtcbiAgICBjb25zdCB7IGNoaWxkcmVuLCAuLi5jb250ZXh0IH0gPSBwcm9wcztcbiAgICBjb25zdCB2YWx1ZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gY29udGV4dCwgT2JqZWN0LnZhbHVlcyhjb250ZXh0KSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZSwgY2hpbGRyZW4gfSk7XG4gIH1cbiAgZnVuY3Rpb24gdXNlQ29udGV4dDIoY29uc3VtZXJOYW1lKSB7XG4gICAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29udGV4dCk7XG4gICAgaWYgKGNvbnRleHQpIHJldHVybiBjb250ZXh0O1xuICAgIGlmIChkZWZhdWx0Q29udGV4dCAhPT0gdm9pZCAwKSByZXR1cm4gZGVmYXVsdENvbnRleHQ7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBcXGAke2NvbnN1bWVyTmFtZX1cXGAgbXVzdCBiZSB1c2VkIHdpdGhpbiBcXGAke3Jvb3RDb21wb25lbnROYW1lfVxcYGApO1xuICB9XG4gIFByb3ZpZGVyLmRpc3BsYXlOYW1lID0gcm9vdENvbXBvbmVudE5hbWUgKyBcIlByb3ZpZGVyXCI7XG4gIHJldHVybiBbUHJvdmlkZXIsIHVzZUNvbnRleHQyXTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHRTY29wZShzY29wZU5hbWUsIGNyZWF0ZUNvbnRleHRTY29wZURlcHMgPSBbXSkge1xuICBsZXQgZGVmYXVsdENvbnRleHRzID0gW107XG4gIGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQzKHJvb3RDb21wb25lbnROYW1lLCBkZWZhdWx0Q29udGV4dCkge1xuICAgIGNvbnN0IEJhc2VDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChkZWZhdWx0Q29udGV4dCk7XG4gICAgY29uc3QgaW5kZXggPSBkZWZhdWx0Q29udGV4dHMubGVuZ3RoO1xuICAgIGRlZmF1bHRDb250ZXh0cyA9IFsuLi5kZWZhdWx0Q29udGV4dHMsIGRlZmF1bHRDb250ZXh0XTtcbiAgICBmdW5jdGlvbiBQcm92aWRlcihwcm9wcykge1xuICAgICAgY29uc3QgeyBzY29wZSwgY2hpbGRyZW4sIC4uLmNvbnRleHQgfSA9IHByb3BzO1xuICAgICAgY29uc3QgQ29udGV4dCA9IHNjb3BlPy5bc2NvcGVOYW1lXVtpbmRleF0gfHwgQmFzZUNvbnRleHQ7XG4gICAgICBjb25zdCB2YWx1ZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gY29udGV4dCwgT2JqZWN0LnZhbHVlcyhjb250ZXh0KSk7XG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlLCBjaGlsZHJlbiB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXNlQ29udGV4dDIoY29uc3VtZXJOYW1lLCBzY29wZSkge1xuICAgICAgY29uc3QgQ29udGV4dCA9IHNjb3BlPy5bc2NvcGVOYW1lXVtpbmRleF0gfHwgQmFzZUNvbnRleHQ7XG4gICAgICBjb25zdCBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0KTtcbiAgICAgIGlmIChjb250ZXh0KSByZXR1cm4gY29udGV4dDtcbiAgICAgIGlmIChkZWZhdWx0Q29udGV4dCAhPT0gdm9pZCAwKSByZXR1cm4gZGVmYXVsdENvbnRleHQ7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYCR7Y29uc3VtZXJOYW1lfVxcYCBtdXN0IGJlIHVzZWQgd2l0aGluIFxcYCR7cm9vdENvbXBvbmVudE5hbWV9XFxgYCk7XG4gICAgfVxuICAgIFByb3ZpZGVyLmRpc3BsYXlOYW1lID0gcm9vdENvbXBvbmVudE5hbWUgKyBcIlByb3ZpZGVyXCI7XG4gICAgcmV0dXJuIFtQcm92aWRlciwgdXNlQ29udGV4dDJdO1xuICB9XG4gIGNvbnN0IGNyZWF0ZVNjb3BlID0gKCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlQ29udGV4dHMgPSBkZWZhdWx0Q29udGV4dHMubWFwKChkZWZhdWx0Q29udGV4dCkgPT4ge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUNvbnRleHQoZGVmYXVsdENvbnRleHQpO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiB1c2VTY29wZShzY29wZSkge1xuICAgICAgY29uc3QgY29udGV4dHMgPSBzY29wZT8uW3Njb3BlTmFtZV0gfHwgc2NvcGVDb250ZXh0cztcbiAgICAgIHJldHVybiBSZWFjdC51c2VNZW1vKFxuICAgICAgICAoKSA9PiAoeyBbYF9fc2NvcGUke3Njb3BlTmFtZX1gXTogeyAuLi5zY29wZSwgW3Njb3BlTmFtZV06IGNvbnRleHRzIH0gfSksXG4gICAgICAgIFtzY29wZSwgY29udGV4dHNdXG4gICAgICApO1xuICAgIH07XG4gIH07XG4gIGNyZWF0ZVNjb3BlLnNjb3BlTmFtZSA9IHNjb3BlTmFtZTtcbiAgcmV0dXJuIFtjcmVhdGVDb250ZXh0MywgY29tcG9zZUNvbnRleHRTY29wZXMoY3JlYXRlU2NvcGUsIC4uLmNyZWF0ZUNvbnRleHRTY29wZURlcHMpXTtcbn1cbmZ1bmN0aW9uIGNvbXBvc2VDb250ZXh0U2NvcGVzKC4uLnNjb3Blcykge1xuICBjb25zdCBiYXNlU2NvcGUgPSBzY29wZXNbMF07XG4gIGlmIChzY29wZXMubGVuZ3RoID09PSAxKSByZXR1cm4gYmFzZVNjb3BlO1xuICBjb25zdCBjcmVhdGVTY29wZSA9ICgpID0+IHtcbiAgICBjb25zdCBzY29wZUhvb2tzID0gc2NvcGVzLm1hcCgoY3JlYXRlU2NvcGUyKSA9PiAoe1xuICAgICAgdXNlU2NvcGU6IGNyZWF0ZVNjb3BlMigpLFxuICAgICAgc2NvcGVOYW1lOiBjcmVhdGVTY29wZTIuc2NvcGVOYW1lXG4gICAgfSkpO1xuICAgIHJldHVybiBmdW5jdGlvbiB1c2VDb21wb3NlZFNjb3BlcyhvdmVycmlkZVNjb3Blcykge1xuICAgICAgY29uc3QgbmV4dFNjb3BlcyA9IHNjb3BlSG9va3MucmVkdWNlKChuZXh0U2NvcGVzMiwgeyB1c2VTY29wZSwgc2NvcGVOYW1lIH0pID0+IHtcbiAgICAgICAgY29uc3Qgc2NvcGVQcm9wcyA9IHVzZVNjb3BlKG92ZXJyaWRlU2NvcGVzKTtcbiAgICAgICAgY29uc3QgY3VycmVudFNjb3BlID0gc2NvcGVQcm9wc1tgX19zY29wZSR7c2NvcGVOYW1lfWBdO1xuICAgICAgICByZXR1cm4geyAuLi5uZXh0U2NvcGVzMiwgLi4uY3VycmVudFNjb3BlIH07XG4gICAgICB9LCB7fSk7XG4gICAgICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiAoeyBbYF9fc2NvcGUke2Jhc2VTY29wZS5zY29wZU5hbWV9YF06IG5leHRTY29wZXMgfSksIFtuZXh0U2NvcGVzXSk7XG4gICAgfTtcbiAgfTtcbiAgY3JlYXRlU2NvcGUuc2NvcGVOYW1lID0gYmFzZVNjb3BlLnNjb3BlTmFtZTtcbiAgcmV0dXJuIGNyZWF0ZVNjb3BlO1xufVxuZXhwb3J0IHtcbiAgY3JlYXRlQ29udGV4dDIgYXMgY3JlYXRlQ29udGV4dCxcbiAgY3JlYXRlQ29udGV4dFNjb3BlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvZGlyZWN0aW9uL3NyYy9EaXJlY3Rpb24udHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIERpcmVjdGlvbkNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHZvaWQgMCk7XG52YXIgRGlyZWN0aW9uUHJvdmlkZXIgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBkaXIsIGNoaWxkcmVuIH0gPSBwcm9wcztcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goRGlyZWN0aW9uQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogZGlyLCBjaGlsZHJlbiB9KTtcbn07XG5mdW5jdGlvbiB1c2VEaXJlY3Rpb24obG9jYWxEaXIpIHtcbiAgY29uc3QgZ2xvYmFsRGlyID0gUmVhY3QudXNlQ29udGV4dChEaXJlY3Rpb25Db250ZXh0KTtcbiAgcmV0dXJuIGxvY2FsRGlyIHx8IGdsb2JhbERpciB8fCBcImx0clwiO1xufVxudmFyIFByb3ZpZGVyID0gRGlyZWN0aW9uUHJvdmlkZXI7XG5leHBvcnQge1xuICBEaXJlY3Rpb25Qcm92aWRlcixcbiAgUHJvdmlkZXIsXG4gIHVzZURpcmVjdGlvblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9kaXNtaXNzYWJsZS1sYXllci9zcmMvRGlzbWlzc2FibGVMYXllci50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY29tcG9zZUV2ZW50SGFuZGxlcnMgfSBmcm9tIFwiQHJhZGl4LXVpL3ByaW1pdGl2ZVwiO1xuaW1wb3J0IHsgUHJpbWl0aXZlLCBkaXNwYXRjaERpc2NyZXRlQ3VzdG9tRXZlbnQgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZVwiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZWRSZWZzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnNcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmXCI7XG5pbXBvcnQgeyB1c2VFc2NhcGVLZXlkb3duIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtZXNjYXBlLWtleWRvd25cIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIERJU01JU1NBQkxFX0xBWUVSX05BTUUgPSBcIkRpc21pc3NhYmxlTGF5ZXJcIjtcbnZhciBDT05URVhUX1VQREFURSA9IFwiZGlzbWlzc2FibGVMYXllci51cGRhdGVcIjtcbnZhciBQT0lOVEVSX0RPV05fT1VUU0lERSA9IFwiZGlzbWlzc2FibGVMYXllci5wb2ludGVyRG93bk91dHNpZGVcIjtcbnZhciBGT0NVU19PVVRTSURFID0gXCJkaXNtaXNzYWJsZUxheWVyLmZvY3VzT3V0c2lkZVwiO1xudmFyIG9yaWdpbmFsQm9keVBvaW50ZXJFdmVudHM7XG52YXIgRGlzbWlzc2FibGVMYXllckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgbGF5ZXJzOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLFxuICBsYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZDogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgYnJhbmNoZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KClcbn0pO1xudmFyIERpc21pc3NhYmxlTGF5ZXIgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cyA9IGZhbHNlLFxuICAgICAgb25Fc2NhcGVLZXlEb3duLFxuICAgICAgb25Qb2ludGVyRG93bk91dHNpZGUsXG4gICAgICBvbkZvY3VzT3V0c2lkZSxcbiAgICAgIG9uSW50ZXJhY3RPdXRzaWRlLFxuICAgICAgb25EaXNtaXNzLFxuICAgICAgLi4ubGF5ZXJQcm9wc1xuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChEaXNtaXNzYWJsZUxheWVyQ29udGV4dCk7XG4gICAgY29uc3QgW25vZGUsIHNldE5vZGVdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gICAgY29uc3Qgb3duZXJEb2N1bWVudCA9IG5vZGU/Lm93bmVyRG9jdW1lbnQgPz8gZ2xvYmFsVGhpcz8uZG9jdW1lbnQ7XG4gICAgY29uc3QgWywgZm9yY2VdID0gUmVhY3QudXNlU3RhdGUoe30pO1xuICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIChub2RlMikgPT4gc2V0Tm9kZShub2RlMikpO1xuICAgIGNvbnN0IGxheWVycyA9IEFycmF5LmZyb20oY29udGV4dC5sYXllcnMpO1xuICAgIGNvbnN0IFtoaWdoZXN0TGF5ZXJXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZF0gPSBbLi4uY29udGV4dC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZF0uc2xpY2UoLTEpO1xuICAgIGNvbnN0IGhpZ2hlc3RMYXllcldpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkSW5kZXggPSBsYXllcnMuaW5kZXhPZihoaWdoZXN0TGF5ZXJXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZCk7XG4gICAgY29uc3QgaW5kZXggPSBub2RlID8gbGF5ZXJzLmluZGV4T2Yobm9kZSkgOiAtMTtcbiAgICBjb25zdCBpc0JvZHlQb2ludGVyRXZlbnRzRGlzYWJsZWQgPSBjb250ZXh0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemUgPiAwO1xuICAgIGNvbnN0IGlzUG9pbnRlckV2ZW50c0VuYWJsZWQgPSBpbmRleCA+PSBoaWdoZXN0TGF5ZXJXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZEluZGV4O1xuICAgIGNvbnN0IHBvaW50ZXJEb3duT3V0c2lkZSA9IHVzZVBvaW50ZXJEb3duT3V0c2lkZSgoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGNvbnN0IGlzUG9pbnRlckRvd25PbkJyYW5jaCA9IFsuLi5jb250ZXh0LmJyYW5jaGVzXS5zb21lKChicmFuY2gpID0+IGJyYW5jaC5jb250YWlucyh0YXJnZXQpKTtcbiAgICAgIGlmICghaXNQb2ludGVyRXZlbnRzRW5hYmxlZCB8fCBpc1BvaW50ZXJEb3duT25CcmFuY2gpIHJldHVybjtcbiAgICAgIG9uUG9pbnRlckRvd25PdXRzaWRlPy4oZXZlbnQpO1xuICAgICAgb25JbnRlcmFjdE91dHNpZGU/LihldmVudCk7XG4gICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIG9uRGlzbWlzcz8uKCk7XG4gICAgfSwgb3duZXJEb2N1bWVudCk7XG4gICAgY29uc3QgZm9jdXNPdXRzaWRlID0gdXNlRm9jdXNPdXRzaWRlKChldmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgY29uc3QgaXNGb2N1c0luQnJhbmNoID0gWy4uLmNvbnRleHQuYnJhbmNoZXNdLnNvbWUoKGJyYW5jaCkgPT4gYnJhbmNoLmNvbnRhaW5zKHRhcmdldCkpO1xuICAgICAgaWYgKGlzRm9jdXNJbkJyYW5jaCkgcmV0dXJuO1xuICAgICAgb25Gb2N1c091dHNpZGU/LihldmVudCk7XG4gICAgICBvbkludGVyYWN0T3V0c2lkZT8uKGV2ZW50KTtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgb25EaXNtaXNzPy4oKTtcbiAgICB9LCBvd25lckRvY3VtZW50KTtcbiAgICB1c2VFc2NhcGVLZXlkb3duKChldmVudCkgPT4ge1xuICAgICAgY29uc3QgaXNIaWdoZXN0TGF5ZXIgPSBpbmRleCA9PT0gY29udGV4dC5sYXllcnMuc2l6ZSAtIDE7XG4gICAgICBpZiAoIWlzSGlnaGVzdExheWVyKSByZXR1cm47XG4gICAgICBvbkVzY2FwZUtleURvd24/LihldmVudCk7XG4gICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgJiYgb25EaXNtaXNzKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9uRGlzbWlzcygpO1xuICAgICAgfVxuICAgIH0sIG93bmVyRG9jdW1lbnQpO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIW5vZGUpIHJldHVybjtcbiAgICAgIGlmIChkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHMpIHtcbiAgICAgICAgaWYgKGNvbnRleHQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIG9yaWdpbmFsQm9keVBvaW50ZXJFdmVudHMgPSBvd25lckRvY3VtZW50LmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cztcbiAgICAgICAgICBvd25lckRvY3VtZW50LmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuYWRkKG5vZGUpO1xuICAgICAgfVxuICAgICAgY29udGV4dC5sYXllcnMuYWRkKG5vZGUpO1xuICAgICAgZGlzcGF0Y2hVcGRhdGUoKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHMgJiYgY29udGV4dC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplID09PSAxKSB7XG4gICAgICAgICAgb3duZXJEb2N1bWVudC5ib2R5LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBvcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sIFtub2RlLCBvd25lckRvY3VtZW50LCBkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHMsIGNvbnRleHRdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgICAgIGNvbnRleHQubGF5ZXJzLmRlbGV0ZShub2RlKTtcbiAgICAgICAgY29udGV4dC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5kZWxldGUobm9kZSk7XG4gICAgICAgIGRpc3BhdGNoVXBkYXRlKCk7XG4gICAgICB9O1xuICAgIH0sIFtub2RlLCBjb250ZXh0XSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZVVwZGF0ZSA9ICgpID0+IGZvcmNlKHt9KTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ09OVEVYVF9VUERBVEUsIGhhbmRsZVVwZGF0ZSk7XG4gICAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihDT05URVhUX1VQREFURSwgaGFuZGxlVXBkYXRlKTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBQcmltaXRpdmUuZGl2LFxuICAgICAge1xuICAgICAgICAuLi5sYXllclByb3BzLFxuICAgICAgICByZWY6IGNvbXBvc2VkUmVmcyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiBpc0JvZHlQb2ludGVyRXZlbnRzRGlzYWJsZWQgPyBpc1BvaW50ZXJFdmVudHNFbmFibGVkID8gXCJhdXRvXCIgOiBcIm5vbmVcIiA6IHZvaWQgMCxcbiAgICAgICAgICAuLi5wcm9wcy5zdHlsZVxuICAgICAgICB9LFxuICAgICAgICBvbkZvY3VzQ2FwdHVyZTogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Gb2N1c0NhcHR1cmUsIGZvY3VzT3V0c2lkZS5vbkZvY3VzQ2FwdHVyZSksXG4gICAgICAgIG9uQmx1ckNhcHR1cmU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uQmx1ckNhcHR1cmUsIGZvY3VzT3V0c2lkZS5vbkJsdXJDYXB0dXJlKSxcbiAgICAgICAgb25Qb2ludGVyRG93bkNhcHR1cmU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKFxuICAgICAgICAgIHByb3BzLm9uUG9pbnRlckRvd25DYXB0dXJlLFxuICAgICAgICAgIHBvaW50ZXJEb3duT3V0c2lkZS5vblBvaW50ZXJEb3duQ2FwdHVyZVxuICAgICAgICApXG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcbkRpc21pc3NhYmxlTGF5ZXIuZGlzcGxheU5hbWUgPSBESVNNSVNTQUJMRV9MQVlFUl9OQU1FO1xudmFyIEJSQU5DSF9OQU1FID0gXCJEaXNtaXNzYWJsZUxheWVyQnJhbmNoXCI7XG52YXIgRGlzbWlzc2FibGVMYXllckJyYW5jaCA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzbWlzc2FibGVMYXllckNvbnRleHQpO1xuICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIHJlZik7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IHJlZi5jdXJyZW50O1xuICAgIGlmIChub2RlKSB7XG4gICAgICBjb250ZXh0LmJyYW5jaGVzLmFkZChub2RlKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnRleHQuYnJhbmNoZXMuZGVsZXRlKG5vZGUpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtjb250ZXh0LmJyYW5jaGVzXSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFByaW1pdGl2ZS5kaXYsIHsgLi4ucHJvcHMsIHJlZjogY29tcG9zZWRSZWZzIH0pO1xufSk7XG5EaXNtaXNzYWJsZUxheWVyQnJhbmNoLmRpc3BsYXlOYW1lID0gQlJBTkNIX05BTUU7XG5mdW5jdGlvbiB1c2VQb2ludGVyRG93bk91dHNpZGUob25Qb2ludGVyRG93bk91dHNpZGUsIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzPy5kb2N1bWVudCkge1xuICBjb25zdCBoYW5kbGVQb2ludGVyRG93bk91dHNpZGUgPSB1c2VDYWxsYmFja1JlZihvblBvaW50ZXJEb3duT3V0c2lkZSk7XG4gIGNvbnN0IGlzUG9pbnRlckluc2lkZVJlYWN0VHJlZVJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGhhbmRsZUNsaWNrUmVmID0gUmVhY3QudXNlUmVmKCgpID0+IHtcbiAgfSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlUG9pbnRlckRvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50YXJnZXQgJiYgIWlzUG9pbnRlckluc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGxldCBoYW5kbGVBbmREaXNwYXRjaFBvaW50ZXJEb3duT3V0c2lkZUV2ZW50MiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGhhbmRsZUFuZERpc3BhdGNoQ3VzdG9tRXZlbnQoXG4gICAgICAgICAgICBQT0lOVEVSX0RPV05fT1VUU0lERSxcbiAgICAgICAgICAgIGhhbmRsZVBvaW50ZXJEb3duT3V0c2lkZSxcbiAgICAgICAgICAgIGV2ZW50RGV0YWlsLFxuICAgICAgICAgICAgeyBkaXNjcmV0ZTogdHJ1ZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGhhbmRsZUFuZERpc3BhdGNoUG9pbnRlckRvd25PdXRzaWRlRXZlbnQgPSBoYW5kbGVBbmREaXNwYXRjaFBvaW50ZXJEb3duT3V0c2lkZUV2ZW50MjtcbiAgICAgICAgY29uc3QgZXZlbnREZXRhaWwgPSB7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50IH07XG4gICAgICAgIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gXCJ0b3VjaFwiKSB7XG4gICAgICAgICAgb3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2tSZWYuY3VycmVudCk7XG4gICAgICAgICAgaGFuZGxlQ2xpY2tSZWYuY3VycmVudCA9IGhhbmRsZUFuZERpc3BhdGNoUG9pbnRlckRvd25PdXRzaWRlRXZlbnQyO1xuICAgICAgICAgIG93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrUmVmLmN1cnJlbnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYW5kbGVBbmREaXNwYXRjaFBvaW50ZXJEb3duT3V0c2lkZUV2ZW50MigpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGlja1JlZi5jdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGlzUG9pbnRlckluc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfTtcbiAgICBjb25zdCB0aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgb3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgaGFuZGxlUG9pbnRlckRvd24pO1xuICAgIH0sIDApO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgb3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgb3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2tSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW293bmVyRG9jdW1lbnQsIGhhbmRsZVBvaW50ZXJEb3duT3V0c2lkZV0pO1xuICByZXR1cm4ge1xuICAgIC8vIGVuc3VyZXMgd2UgY2hlY2sgUmVhY3QgY29tcG9uZW50IHRyZWUgKG5vdCBqdXN0IERPTSB0cmVlKVxuICAgIG9uUG9pbnRlckRvd25DYXB0dXJlOiAoKSA9PiBpc1BvaW50ZXJJbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudCA9IHRydWVcbiAgfTtcbn1cbmZ1bmN0aW9uIHVzZUZvY3VzT3V0c2lkZShvbkZvY3VzT3V0c2lkZSwgb3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXM/LmRvY3VtZW50KSB7XG4gIGNvbnN0IGhhbmRsZUZvY3VzT3V0c2lkZSA9IHVzZUNhbGxiYWNrUmVmKG9uRm9jdXNPdXRzaWRlKTtcbiAgY29uc3QgaXNGb2N1c0luc2lkZVJlYWN0VHJlZVJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlRm9jdXMgPSAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50YXJnZXQgJiYgIWlzRm9jdXNJbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCBldmVudERldGFpbCA9IHsgb3JpZ2luYWxFdmVudDogZXZlbnQgfTtcbiAgICAgICAgaGFuZGxlQW5kRGlzcGF0Y2hDdXN0b21FdmVudChGT0NVU19PVVRTSURFLCBoYW5kbGVGb2N1c091dHNpZGUsIGV2ZW50RGV0YWlsLCB7XG4gICAgICAgICAgZGlzY3JldGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgb3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCBoYW5kbGVGb2N1cyk7XG4gICAgcmV0dXJuICgpID0+IG93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgaGFuZGxlRm9jdXMpO1xuICB9LCBbb3duZXJEb2N1bWVudCwgaGFuZGxlRm9jdXNPdXRzaWRlXSk7XG4gIHJldHVybiB7XG4gICAgb25Gb2N1c0NhcHR1cmU6ICgpID0+IGlzRm9jdXNJbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudCA9IHRydWUsXG4gICAgb25CbHVyQ2FwdHVyZTogKCkgPT4gaXNGb2N1c0luc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50ID0gZmFsc2VcbiAgfTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoVXBkYXRlKCkge1xuICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudChDT05URVhUX1VQREFURSk7XG4gIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuZnVuY3Rpb24gaGFuZGxlQW5kRGlzcGF0Y2hDdXN0b21FdmVudChuYW1lLCBoYW5kbGVyLCBkZXRhaWwsIHsgZGlzY3JldGUgfSkge1xuICBjb25zdCB0YXJnZXQgPSBkZXRhaWwub3JpZ2luYWxFdmVudC50YXJnZXQ7XG4gIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KG5hbWUsIHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IHRydWUsIGRldGFpbCB9KTtcbiAgaWYgKGhhbmRsZXIpIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgaWYgKGRpc2NyZXRlKSB7XG4gICAgZGlzcGF0Y2hEaXNjcmV0ZUN1c3RvbUV2ZW50KHRhcmdldCwgZXZlbnQpO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfVxufVxudmFyIFJvb3QgPSBEaXNtaXNzYWJsZUxheWVyO1xudmFyIEJyYW5jaCA9IERpc21pc3NhYmxlTGF5ZXJCcmFuY2g7XG5leHBvcnQge1xuICBCcmFuY2gsXG4gIERpc21pc3NhYmxlTGF5ZXIsXG4gIERpc21pc3NhYmxlTGF5ZXJCcmFuY2gsXG4gIFJvb3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvZHJvcGRvd24tbWVudS9zcmMvRHJvcGRvd25NZW51LnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjb21wb3NlRXZlbnRIYW5kbGVycyB9IGZyb20gXCJAcmFkaXgtdWkvcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyBjb21wb3NlUmVmcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzXCI7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0U2NvcGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbnRleHRcIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsYWJsZVN0YXRlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtY29udHJvbGxhYmxlLXN0YXRlXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZVwiO1xuaW1wb3J0ICogYXMgTWVudVByaW1pdGl2ZSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LW1lbnVcIjtcbmltcG9ydCB7IGNyZWF0ZU1lbnVTY29wZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtbWVudVwiO1xuaW1wb3J0IHsgdXNlSWQgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWlkXCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBEUk9QRE9XTl9NRU5VX05BTUUgPSBcIkRyb3Bkb3duTWVudVwiO1xudmFyIFtjcmVhdGVEcm9wZG93bk1lbnVDb250ZXh0LCBjcmVhdGVEcm9wZG93bk1lbnVTY29wZV0gPSBjcmVhdGVDb250ZXh0U2NvcGUoXG4gIERST1BET1dOX01FTlVfTkFNRSxcbiAgW2NyZWF0ZU1lbnVTY29wZV1cbik7XG52YXIgdXNlTWVudVNjb3BlID0gY3JlYXRlTWVudVNjb3BlKCk7XG52YXIgW0Ryb3Bkb3duTWVudVByb3ZpZGVyLCB1c2VEcm9wZG93bk1lbnVDb250ZXh0XSA9IGNyZWF0ZURyb3Bkb3duTWVudUNvbnRleHQoRFJPUERPV05fTUVOVV9OQU1FKTtcbnZhciBEcm9wZG93bk1lbnUgPSAocHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIF9fc2NvcGVEcm9wZG93bk1lbnUsXG4gICAgY2hpbGRyZW4sXG4gICAgZGlyLFxuICAgIG9wZW46IG9wZW5Qcm9wLFxuICAgIGRlZmF1bHRPcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBtb2RhbCA9IHRydWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIGNvbnN0IHRyaWdnZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IFtvcGVuID0gZmFsc2UsIHNldE9wZW5dID0gdXNlQ29udHJvbGxhYmxlU3RhdGUoe1xuICAgIHByb3A6IG9wZW5Qcm9wLFxuICAgIGRlZmF1bHRQcm9wOiBkZWZhdWx0T3BlbixcbiAgICBvbkNoYW5nZTogb25PcGVuQ2hhbmdlXG4gIH0pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICBEcm9wZG93bk1lbnVQcm92aWRlcixcbiAgICB7XG4gICAgICBzY29wZTogX19zY29wZURyb3Bkb3duTWVudSxcbiAgICAgIHRyaWdnZXJJZDogdXNlSWQoKSxcbiAgICAgIHRyaWdnZXJSZWYsXG4gICAgICBjb250ZW50SWQ6IHVzZUlkKCksXG4gICAgICBvcGVuLFxuICAgICAgb25PcGVuQ2hhbmdlOiBzZXRPcGVuLFxuICAgICAgb25PcGVuVG9nZ2xlOiBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiBzZXRPcGVuKChwcmV2T3BlbikgPT4gIXByZXZPcGVuKSwgW3NldE9wZW5dKSxcbiAgICAgIG1vZGFsLFxuICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5Sb290LCB7IC4uLm1lbnVTY29wZSwgb3Blbiwgb25PcGVuQ2hhbmdlOiBzZXRPcGVuLCBkaXIsIG1vZGFsLCBjaGlsZHJlbiB9KVxuICAgIH1cbiAgKTtcbn07XG5Ecm9wZG93bk1lbnUuZGlzcGxheU5hbWUgPSBEUk9QRE9XTl9NRU5VX05BTUU7XG52YXIgVFJJR0dFUl9OQU1FID0gXCJEcm9wZG93bk1lbnVUcmlnZ2VyXCI7XG52YXIgRHJvcGRvd25NZW51VHJpZ2dlciA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCBkaXNhYmxlZCA9IGZhbHNlLCAuLi50cmlnZ2VyUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VEcm9wZG93bk1lbnVDb250ZXh0KFRSSUdHRVJfTkFNRSwgX19zY29wZURyb3Bkb3duTWVudSk7XG4gICAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuQW5jaG9yLCB7IGFzQ2hpbGQ6IHRydWUsIC4uLm1lbnVTY29wZSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBQcmltaXRpdmUuYnV0dG9uLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBpZDogY29udGV4dC50cmlnZ2VySWQsXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiBcIm1lbnVcIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IGNvbnRleHQub3BlbixcbiAgICAgICAgXCJhcmlhLWNvbnRyb2xzXCI6IGNvbnRleHQub3BlbiA/IGNvbnRleHQuY29udGVudElkIDogdm9pZCAwLFxuICAgICAgICBcImRhdGEtc3RhdGVcIjogY29udGV4dC5vcGVuID8gXCJvcGVuXCIgOiBcImNsb3NlZFwiLFxuICAgICAgICBcImRhdGEtZGlzYWJsZWRcIjogZGlzYWJsZWQgPyBcIlwiIDogdm9pZCAwLFxuICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgLi4udHJpZ2dlclByb3BzLFxuICAgICAgICByZWY6IGNvbXBvc2VSZWZzKGZvcndhcmRlZFJlZiwgY29udGV4dC50cmlnZ2VyUmVmKSxcbiAgICAgICAgb25Qb2ludGVyRG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Qb2ludGVyRG93biwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiBldmVudC5idXR0b24gPT09IDAgJiYgZXZlbnQuY3RybEtleSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnRleHQub25PcGVuVG9nZ2xlKCk7XG4gICAgICAgICAgICBpZiAoIWNvbnRleHQub3BlbikgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBvbktleURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uS2V5RG93biwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgICAgICAgaWYgKFtcIkVudGVyXCIsIFwiIFwiXS5pbmNsdWRlcyhldmVudC5rZXkpKSBjb250ZXh0Lm9uT3BlblRvZ2dsZSgpO1xuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IFwiQXJyb3dEb3duXCIpIGNvbnRleHQub25PcGVuQ2hhbmdlKHRydWUpO1xuICAgICAgICAgIGlmIChbXCJFbnRlclwiLCBcIiBcIiwgXCJBcnJvd0Rvd25cIl0uaW5jbHVkZXMoZXZlbnQua2V5KSkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICApIH0pO1xuICB9XG4pO1xuRHJvcGRvd25NZW51VHJpZ2dlci5kaXNwbGF5TmFtZSA9IFRSSUdHRVJfTkFNRTtcbnZhciBQT1JUQUxfTkFNRSA9IFwiRHJvcGRvd25NZW51UG9ydGFsXCI7XG52YXIgRHJvcGRvd25NZW51UG9ydGFsID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4ucG9ydGFsUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuUG9ydGFsLCB7IC4uLm1lbnVTY29wZSwgLi4ucG9ydGFsUHJvcHMgfSk7XG59O1xuRHJvcGRvd25NZW51UG9ydGFsLmRpc3BsYXlOYW1lID0gUE9SVEFMX05BTUU7XG52YXIgQ09OVEVOVF9OQU1FID0gXCJEcm9wZG93bk1lbnVDb250ZW50XCI7XG52YXIgRHJvcGRvd25NZW51Q29udGVudCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5jb250ZW50UHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VEcm9wZG93bk1lbnVDb250ZXh0KENPTlRFTlRfTkFNRSwgX19zY29wZURyb3Bkb3duTWVudSk7XG4gICAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICAgIGNvbnN0IGhhc0ludGVyYWN0ZWRPdXRzaWRlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIE1lbnVQcmltaXRpdmUuQ29udGVudCxcbiAgICAgIHtcbiAgICAgICAgaWQ6IGNvbnRleHQuY29udGVudElkLFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiBjb250ZXh0LnRyaWdnZXJJZCxcbiAgICAgICAgLi4ubWVudVNjb3BlLFxuICAgICAgICAuLi5jb250ZW50UHJvcHMsXG4gICAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgICBvbkNsb3NlQXV0b0ZvY3VzOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkNsb3NlQXV0b0ZvY3VzLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoIWhhc0ludGVyYWN0ZWRPdXRzaWRlUmVmLmN1cnJlbnQpIGNvbnRleHQudHJpZ2dlclJlZi5jdXJyZW50Py5mb2N1cygpO1xuICAgICAgICAgIGhhc0ludGVyYWN0ZWRPdXRzaWRlUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KSxcbiAgICAgICAgb25JbnRlcmFjdE91dHNpZGU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uSW50ZXJhY3RPdXRzaWRlLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbEV2ZW50ID0gZXZlbnQuZGV0YWlsLm9yaWdpbmFsRXZlbnQ7XG4gICAgICAgICAgY29uc3QgY3RybExlZnRDbGljayA9IG9yaWdpbmFsRXZlbnQuYnV0dG9uID09PSAwICYmIG9yaWdpbmFsRXZlbnQuY3RybEtleSA9PT0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBpc1JpZ2h0Q2xpY2sgPSBvcmlnaW5hbEV2ZW50LmJ1dHRvbiA9PT0gMiB8fCBjdHJsTGVmdENsaWNrO1xuICAgICAgICAgIGlmICghY29udGV4dC5tb2RhbCB8fCBpc1JpZ2h0Q2xpY2spIGhhc0ludGVyYWN0ZWRPdXRzaWRlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9KSxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAuLi5wcm9wcy5zdHlsZSxcbiAgICAgICAgICAvLyByZS1uYW1lc3BhY2UgZXhwb3NlZCBjb250ZW50IGN1c3RvbSBwcm9wZXJ0aWVzXG4gICAgICAgICAgLi4ue1xuICAgICAgICAgICAgXCItLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luXCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLXRyYW5zZm9ybS1vcmlnaW4pXCIsXG4gICAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS1jb250ZW50LWF2YWlsYWJsZS13aWR0aFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtd2lkdGgpXCIsXG4gICAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHRcIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLWhlaWdodClcIixcbiAgICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LXRyaWdnZXItd2lkdGhcIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItYW5jaG9yLXdpZHRoKVwiLFxuICAgICAgICAgICAgXCItLXJhZGl4LWRyb3Bkb3duLW1lbnUtdHJpZ2dlci1oZWlnaHRcIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItYW5jaG9yLWhlaWdodClcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5Ecm9wZG93bk1lbnVDb250ZW50LmRpc3BsYXlOYW1lID0gQ09OVEVOVF9OQU1FO1xudmFyIEdST1VQX05BTUUgPSBcIkRyb3Bkb3duTWVudUdyb3VwXCI7XG52YXIgRHJvcGRvd25NZW51R3JvdXAgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4uZ3JvdXBQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuR3JvdXAsIHsgLi4ubWVudVNjb3BlLCAuLi5ncm91cFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfVxuKTtcbkRyb3Bkb3duTWVudUdyb3VwLmRpc3BsYXlOYW1lID0gR1JPVVBfTkFNRTtcbnZhciBMQUJFTF9OQU1FID0gXCJEcm9wZG93bk1lbnVMYWJlbFwiO1xudmFyIERyb3Bkb3duTWVudUxhYmVsID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLmxhYmVsUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLkxhYmVsLCB7IC4uLm1lbnVTY29wZSwgLi4ubGFiZWxQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH1cbik7XG5Ecm9wZG93bk1lbnVMYWJlbC5kaXNwbGF5TmFtZSA9IExBQkVMX05BTUU7XG52YXIgSVRFTV9OQU1FID0gXCJEcm9wZG93bk1lbnVJdGVtXCI7XG52YXIgRHJvcGRvd25NZW51SXRlbSA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5pdGVtUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLkl0ZW0sIHsgLi4ubWVudVNjb3BlLCAuLi5pdGVtUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9XG4pO1xuRHJvcGRvd25NZW51SXRlbS5kaXNwbGF5TmFtZSA9IElURU1fTkFNRTtcbnZhciBDSEVDS0JPWF9JVEVNX05BTUUgPSBcIkRyb3Bkb3duTWVudUNoZWNrYm94SXRlbVwiO1xudmFyIERyb3Bkb3duTWVudUNoZWNrYm94SXRlbSA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5jaGVja2JveEl0ZW1Qcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5DaGVja2JveEl0ZW0sIHsgLi4ubWVudVNjb3BlLCAuLi5jaGVja2JveEl0ZW1Qcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG59KTtcbkRyb3Bkb3duTWVudUNoZWNrYm94SXRlbS5kaXNwbGF5TmFtZSA9IENIRUNLQk9YX0lURU1fTkFNRTtcbnZhciBSQURJT19HUk9VUF9OQU1FID0gXCJEcm9wZG93bk1lbnVSYWRpb0dyb3VwXCI7XG52YXIgRHJvcGRvd25NZW51UmFkaW9Hcm91cCA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5yYWRpb0dyb3VwUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuUmFkaW9Hcm91cCwgeyAuLi5tZW51U2NvcGUsIC4uLnJhZGlvR3JvdXBQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG59KTtcbkRyb3Bkb3duTWVudVJhZGlvR3JvdXAuZGlzcGxheU5hbWUgPSBSQURJT19HUk9VUF9OQU1FO1xudmFyIFJBRElPX0lURU1fTkFNRSA9IFwiRHJvcGRvd25NZW51UmFkaW9JdGVtXCI7XG52YXIgRHJvcGRvd25NZW51UmFkaW9JdGVtID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLnJhZGlvSXRlbVByb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLlJhZGlvSXRlbSwgeyAuLi5tZW51U2NvcGUsIC4uLnJhZGlvSXRlbVByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbn0pO1xuRHJvcGRvd25NZW51UmFkaW9JdGVtLmRpc3BsYXlOYW1lID0gUkFESU9fSVRFTV9OQU1FO1xudmFyIElORElDQVRPUl9OQU1FID0gXCJEcm9wZG93bk1lbnVJdGVtSW5kaWNhdG9yXCI7XG52YXIgRHJvcGRvd25NZW51SXRlbUluZGljYXRvciA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5pdGVtSW5kaWNhdG9yUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuSXRlbUluZGljYXRvciwgeyAuLi5tZW51U2NvcGUsIC4uLml0ZW1JbmRpY2F0b3JQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG59KTtcbkRyb3Bkb3duTWVudUl0ZW1JbmRpY2F0b3IuZGlzcGxheU5hbWUgPSBJTkRJQ0FUT1JfTkFNRTtcbnZhciBTRVBBUkFUT1JfTkFNRSA9IFwiRHJvcGRvd25NZW51U2VwYXJhdG9yXCI7XG52YXIgRHJvcGRvd25NZW51U2VwYXJhdG9yID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLnNlcGFyYXRvclByb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLlNlcGFyYXRvciwgeyAuLi5tZW51U2NvcGUsIC4uLnNlcGFyYXRvclByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbn0pO1xuRHJvcGRvd25NZW51U2VwYXJhdG9yLmRpc3BsYXlOYW1lID0gU0VQQVJBVE9SX05BTUU7XG52YXIgQVJST1dfTkFNRSA9IFwiRHJvcGRvd25NZW51QXJyb3dcIjtcbnZhciBEcm9wZG93bk1lbnVBcnJvdyA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5hcnJvd1Byb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5BcnJvdywgeyAuLi5tZW51U2NvcGUsIC4uLmFycm93UHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9XG4pO1xuRHJvcGRvd25NZW51QXJyb3cuZGlzcGxheU5hbWUgPSBBUlJPV19OQU1FO1xudmFyIERyb3Bkb3duTWVudVN1YiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIGNoaWxkcmVuLCBvcGVuOiBvcGVuUHJvcCwgb25PcGVuQ2hhbmdlLCBkZWZhdWx0T3BlbiB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgY29uc3QgW29wZW4gPSBmYWxzZSwgc2V0T3Blbl0gPSB1c2VDb250cm9sbGFibGVTdGF0ZSh7XG4gICAgcHJvcDogb3BlblByb3AsXG4gICAgZGVmYXVsdFByb3A6IGRlZmF1bHRPcGVuLFxuICAgIG9uQ2hhbmdlOiBvbk9wZW5DaGFuZ2VcbiAgfSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuU3ViLCB7IC4uLm1lbnVTY29wZSwgb3Blbiwgb25PcGVuQ2hhbmdlOiBzZXRPcGVuLCBjaGlsZHJlbiB9KTtcbn07XG52YXIgU1VCX1RSSUdHRVJfTkFNRSA9IFwiRHJvcGRvd25NZW51U3ViVHJpZ2dlclwiO1xudmFyIERyb3Bkb3duTWVudVN1YlRyaWdnZXIgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4uc3ViVHJpZ2dlclByb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLlN1YlRyaWdnZXIsIHsgLi4ubWVudVNjb3BlLCAuLi5zdWJUcmlnZ2VyUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xufSk7XG5Ecm9wZG93bk1lbnVTdWJUcmlnZ2VyLmRpc3BsYXlOYW1lID0gU1VCX1RSSUdHRVJfTkFNRTtcbnZhciBTVUJfQ09OVEVOVF9OQU1FID0gXCJEcm9wZG93bk1lbnVTdWJDb250ZW50XCI7XG52YXIgRHJvcGRvd25NZW51U3ViQ29udGVudCA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5zdWJDb250ZW50UHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgIE1lbnVQcmltaXRpdmUuU3ViQ29udGVudCxcbiAgICB7XG4gICAgICAuLi5tZW51U2NvcGUsXG4gICAgICAuLi5zdWJDb250ZW50UHJvcHMsXG4gICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIC4uLnByb3BzLnN0eWxlLFxuICAgICAgICAvLyByZS1uYW1lc3BhY2UgZXhwb3NlZCBjb250ZW50IGN1c3RvbSBwcm9wZXJ0aWVzXG4gICAgICAgIC4uLntcbiAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW5cIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbilcIixcbiAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS1jb250ZW50LWF2YWlsYWJsZS13aWR0aFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtd2lkdGgpXCIsXG4gICAgICAgICAgXCItLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0XCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS1oZWlnaHQpXCIsXG4gICAgICAgICAgXCItLXJhZGl4LWRyb3Bkb3duLW1lbnUtdHJpZ2dlci13aWR0aFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgpXCIsXG4gICAgICAgICAgXCItLXJhZGl4LWRyb3Bkb3duLW1lbnUtdHJpZ2dlci1oZWlnaHRcIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItYW5jaG9yLWhlaWdodClcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICApO1xufSk7XG5Ecm9wZG93bk1lbnVTdWJDb250ZW50LmRpc3BsYXlOYW1lID0gU1VCX0NPTlRFTlRfTkFNRTtcbnZhciBSb290MiA9IERyb3Bkb3duTWVudTtcbnZhciBUcmlnZ2VyID0gRHJvcGRvd25NZW51VHJpZ2dlcjtcbnZhciBQb3J0YWwyID0gRHJvcGRvd25NZW51UG9ydGFsO1xudmFyIENvbnRlbnQyID0gRHJvcGRvd25NZW51Q29udGVudDtcbnZhciBHcm91cDIgPSBEcm9wZG93bk1lbnVHcm91cDtcbnZhciBMYWJlbDIgPSBEcm9wZG93bk1lbnVMYWJlbDtcbnZhciBJdGVtMiA9IERyb3Bkb3duTWVudUl0ZW07XG52YXIgQ2hlY2tib3hJdGVtMiA9IERyb3Bkb3duTWVudUNoZWNrYm94SXRlbTtcbnZhciBSYWRpb0dyb3VwMiA9IERyb3Bkb3duTWVudVJhZGlvR3JvdXA7XG52YXIgUmFkaW9JdGVtMiA9IERyb3Bkb3duTWVudVJhZGlvSXRlbTtcbnZhciBJdGVtSW5kaWNhdG9yMiA9IERyb3Bkb3duTWVudUl0ZW1JbmRpY2F0b3I7XG52YXIgU2VwYXJhdG9yMiA9IERyb3Bkb3duTWVudVNlcGFyYXRvcjtcbnZhciBBcnJvdzIgPSBEcm9wZG93bk1lbnVBcnJvdztcbnZhciBTdWIyID0gRHJvcGRvd25NZW51U3ViO1xudmFyIFN1YlRyaWdnZXIyID0gRHJvcGRvd25NZW51U3ViVHJpZ2dlcjtcbnZhciBTdWJDb250ZW50MiA9IERyb3Bkb3duTWVudVN1YkNvbnRlbnQ7XG5leHBvcnQge1xuICBBcnJvdzIgYXMgQXJyb3csXG4gIENoZWNrYm94SXRlbTIgYXMgQ2hlY2tib3hJdGVtLFxuICBDb250ZW50MiBhcyBDb250ZW50LFxuICBEcm9wZG93bk1lbnUsXG4gIERyb3Bkb3duTWVudUFycm93LFxuICBEcm9wZG93bk1lbnVDaGVja2JveEl0ZW0sXG4gIERyb3Bkb3duTWVudUNvbnRlbnQsXG4gIERyb3Bkb3duTWVudUdyb3VwLFxuICBEcm9wZG93bk1lbnVJdGVtLFxuICBEcm9wZG93bk1lbnVJdGVtSW5kaWNhdG9yLFxuICBEcm9wZG93bk1lbnVMYWJlbCxcbiAgRHJvcGRvd25NZW51UG9ydGFsLFxuICBEcm9wZG93bk1lbnVSYWRpb0dyb3VwLFxuICBEcm9wZG93bk1lbnVSYWRpb0l0ZW0sXG4gIERyb3Bkb3duTWVudVNlcGFyYXRvcixcbiAgRHJvcGRvd25NZW51U3ViLFxuICBEcm9wZG93bk1lbnVTdWJDb250ZW50LFxuICBEcm9wZG93bk1lbnVTdWJUcmlnZ2VyLFxuICBEcm9wZG93bk1lbnVUcmlnZ2VyLFxuICBHcm91cDIgYXMgR3JvdXAsXG4gIEl0ZW0yIGFzIEl0ZW0sXG4gIEl0ZW1JbmRpY2F0b3IyIGFzIEl0ZW1JbmRpY2F0b3IsXG4gIExhYmVsMiBhcyBMYWJlbCxcbiAgUG9ydGFsMiBhcyBQb3J0YWwsXG4gIFJhZGlvR3JvdXAyIGFzIFJhZGlvR3JvdXAsXG4gIFJhZGlvSXRlbTIgYXMgUmFkaW9JdGVtLFxuICBSb290MiBhcyBSb290LFxuICBTZXBhcmF0b3IyIGFzIFNlcGFyYXRvcixcbiAgU3ViMiBhcyBTdWIsXG4gIFN1YkNvbnRlbnQyIGFzIFN1YkNvbnRlbnQsXG4gIFN1YlRyaWdnZXIyIGFzIFN1YlRyaWdnZXIsXG4gIFRyaWdnZXIsXG4gIGNyZWF0ZURyb3Bkb3duTWVudVNjb3BlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L2ZvY3VzLWd1YXJkcy9zcmMvRm9jdXNHdWFyZHMudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBjb3VudCA9IDA7XG5mdW5jdGlvbiBGb2N1c0d1YXJkcyhwcm9wcykge1xuICB1c2VGb2N1c0d1YXJkcygpO1xuICByZXR1cm4gcHJvcHMuY2hpbGRyZW47XG59XG5mdW5jdGlvbiB1c2VGb2N1c0d1YXJkcygpIHtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBlZGdlR3VhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLXJhZGl4LWZvY3VzLWd1YXJkXVwiKTtcbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWRnZUd1YXJkc1swXSA/PyBjcmVhdGVGb2N1c0d1YXJkKCkpO1xuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYmVmb3JlZW5kXCIsIGVkZ2VHdWFyZHNbMV0gPz8gY3JlYXRlRm9jdXNHdWFyZCgpKTtcbiAgICBjb3VudCsrO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLXJhZGl4LWZvY3VzLWd1YXJkXVwiKS5mb3JFYWNoKChub2RlKSA9PiBub2RlLnJlbW92ZSgpKTtcbiAgICAgIH1cbiAgICAgIGNvdW50LS07XG4gICAgfTtcbiAgfSwgW10pO1xufVxuZnVuY3Rpb24gY3JlYXRlRm9jdXNHdWFyZCgpIHtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtcmFkaXgtZm9jdXMtZ3VhcmRcIiwgXCJcIik7XG4gIGVsZW1lbnQudGFiSW5kZXggPSAwO1xuICBlbGVtZW50LnN0eWxlLmNzc1RleHQgPSBcIm91dGxpbmU6IG5vbmU7IG9wYWNpdHk6IDA7IHBvc2l0aW9uOiBmaXhlZDsgcG9pbnRlci1ldmVudHM6IG5vbmVcIjtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG52YXIgUm9vdCA9IEZvY3VzR3VhcmRzO1xuZXhwb3J0IHtcbiAgRm9jdXNHdWFyZHMsXG4gIFJvb3QsXG4gIHVzZUZvY3VzR3VhcmRzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L2ZvY3VzLXNjb3BlL3NyYy9Gb2N1c1Njb3BlLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wcmltaXRpdmVcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmXCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBBVVRPRk9DVVNfT05fTU9VTlQgPSBcImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Nb3VudFwiO1xudmFyIEFVVE9GT0NVU19PTl9VTk1PVU5UID0gXCJmb2N1c1Njb3BlLmF1dG9Gb2N1c09uVW5tb3VudFwiO1xudmFyIEVWRU5UX09QVElPTlMgPSB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlIH07XG52YXIgRk9DVVNfU0NPUEVfTkFNRSA9IFwiRm9jdXNTY29wZVwiO1xudmFyIEZvY3VzU2NvcGUgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBsb29wID0gZmFsc2UsXG4gICAgdHJhcHBlZCA9IGZhbHNlLFxuICAgIG9uTW91bnRBdXRvRm9jdXM6IG9uTW91bnRBdXRvRm9jdXNQcm9wLFxuICAgIG9uVW5tb3VudEF1dG9Gb2N1czogb25Vbm1vdW50QXV0b0ZvY3VzUHJvcCxcbiAgICAuLi5zY29wZVByb3BzXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgW2NvbnRhaW5lciwgc2V0Q29udGFpbmVyXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBvbk1vdW50QXV0b0ZvY3VzID0gdXNlQ2FsbGJhY2tSZWYob25Nb3VudEF1dG9Gb2N1c1Byb3ApO1xuICBjb25zdCBvblVubW91bnRBdXRvRm9jdXMgPSB1c2VDYWxsYmFja1JlZihvblVubW91bnRBdXRvRm9jdXNQcm9wKTtcbiAgY29uc3QgbGFzdEZvY3VzZWRFbGVtZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCAobm9kZSkgPT4gc2V0Q29udGFpbmVyKG5vZGUpKTtcbiAgY29uc3QgZm9jdXNTY29wZSA9IFJlYWN0LnVzZVJlZih7XG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICBwYXVzZSgpIHtcbiAgICAgIHRoaXMucGF1c2VkID0gdHJ1ZTtcbiAgICB9LFxuICAgIHJlc3VtZSgpIHtcbiAgICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XG4gICAgfVxuICB9KS5jdXJyZW50O1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0cmFwcGVkKSB7XG4gICAgICBsZXQgaGFuZGxlRm9jdXNJbjIgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBpZiAoZm9jdXNTY29wZS5wYXVzZWQgfHwgIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgIGlmIChjb250YWluZXIuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICAgIGxhc3RGb2N1c2VkRWxlbWVudFJlZi5jdXJyZW50ID0gdGFyZ2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvY3VzKGxhc3RGb2N1c2VkRWxlbWVudFJlZi5jdXJyZW50LCB7IHNlbGVjdDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSwgaGFuZGxlRm9jdXNPdXQyID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaWYgKGZvY3VzU2NvcGUucGF1c2VkIHx8ICFjb250YWluZXIpIHJldHVybjtcbiAgICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgIGlmIChyZWxhdGVkVGFyZ2V0ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlmICghY29udGFpbmVyLmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgZm9jdXMobGFzdEZvY3VzZWRFbGVtZW50UmVmLmN1cnJlbnQsIHsgc2VsZWN0OiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBoYW5kbGVNdXRhdGlvbnMyID0gZnVuY3Rpb24obXV0YXRpb25zKSB7XG4gICAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGZvY3VzZWRFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zKSB7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2Rlcy5sZW5ndGggPiAwKSBmb2N1cyhjb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGhhbmRsZUZvY3VzSW4gPSBoYW5kbGVGb2N1c0luMiwgaGFuZGxlRm9jdXNPdXQgPSBoYW5kbGVGb2N1c091dDIsIGhhbmRsZU11dGF0aW9ucyA9IGhhbmRsZU11dGF0aW9uczI7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCBoYW5kbGVGb2N1c0luMik7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgaGFuZGxlRm9jdXNPdXQyKTtcbiAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihoYW5kbGVNdXRhdGlvbnMyKTtcbiAgICAgIGlmIChjb250YWluZXIpIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgaGFuZGxlRm9jdXNJbjIpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgaGFuZGxlRm9jdXNPdXQyKTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW3RyYXBwZWQsIGNvbnRhaW5lciwgZm9jdXNTY29wZS5wYXVzZWRdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICBmb2N1c1Njb3Blc1N0YWNrLmFkZChmb2N1c1Njb3BlKTtcbiAgICAgIGNvbnN0IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBoYXNGb2N1c2VkQ2FuZGlkYXRlID0gY29udGFpbmVyLmNvbnRhaW5zKHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCk7XG4gICAgICBpZiAoIWhhc0ZvY3VzZWRDYW5kaWRhdGUpIHtcbiAgICAgICAgY29uc3QgbW91bnRFdmVudCA9IG5ldyBDdXN0b21FdmVudChBVVRPRk9DVVNfT05fTU9VTlQsIEVWRU5UX09QVElPTlMpO1xuICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihBVVRPRk9DVVNfT05fTU9VTlQsIG9uTW91bnRBdXRvRm9jdXMpO1xuICAgICAgICBjb250YWluZXIuZGlzcGF0Y2hFdmVudChtb3VudEV2ZW50KTtcbiAgICAgICAgaWYgKCFtb3VudEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICBmb2N1c0ZpcnN0KHJlbW92ZUxpbmtzKGdldFRhYmJhYmxlQ2FuZGlkYXRlcyhjb250YWluZXIpKSwgeyBzZWxlY3Q6IHRydWUgfSk7XG4gICAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCkge1xuICAgICAgICAgICAgZm9jdXMoY29udGFpbmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKEFVVE9GT0NVU19PTl9NT1VOVCwgb25Nb3VudEF1dG9Gb2N1cyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVubW91bnRFdmVudCA9IG5ldyBDdXN0b21FdmVudChBVVRPRk9DVVNfT05fVU5NT1VOVCwgRVZFTlRfT1BUSU9OUyk7XG4gICAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoQVVUT0ZPQ1VTX09OX1VOTU9VTlQsIG9uVW5tb3VudEF1dG9Gb2N1cyk7XG4gICAgICAgICAgY29udGFpbmVyLmRpc3BhdGNoRXZlbnQodW5tb3VudEV2ZW50KTtcbiAgICAgICAgICBpZiAoIXVubW91bnRFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICBmb2N1cyhwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPz8gZG9jdW1lbnQuYm9keSwgeyBzZWxlY3Q6IHRydWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKEFVVE9GT0NVU19PTl9VTk1PVU5ULCBvblVubW91bnRBdXRvRm9jdXMpO1xuICAgICAgICAgIGZvY3VzU2NvcGVzU3RhY2sucmVtb3ZlKGZvY3VzU2NvcGUpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbY29udGFpbmVyLCBvbk1vdW50QXV0b0ZvY3VzLCBvblVubW91bnRBdXRvRm9jdXMsIGZvY3VzU2NvcGVdKTtcbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgaWYgKCFsb29wICYmICF0cmFwcGVkKSByZXR1cm47XG4gICAgICBpZiAoZm9jdXNTY29wZS5wYXVzZWQpIHJldHVybjtcbiAgICAgIGNvbnN0IGlzVGFiS2V5ID0gZXZlbnQua2V5ID09PSBcIlRhYlwiICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50Lm1ldGFLZXk7XG4gICAgICBjb25zdCBmb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoaXNUYWJLZXkgJiYgZm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyMiA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgbGFzdF0gPSBnZXRUYWJiYWJsZUVkZ2VzKGNvbnRhaW5lcjIpO1xuICAgICAgICBjb25zdCBoYXNUYWJiYWJsZUVsZW1lbnRzSW5zaWRlID0gZmlyc3QgJiYgbGFzdDtcbiAgICAgICAgaWYgKCFoYXNUYWJiYWJsZUVsZW1lbnRzSW5zaWRlKSB7XG4gICAgICAgICAgaWYgKGZvY3VzZWRFbGVtZW50ID09PSBjb250YWluZXIyKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgZm9jdXNlZEVsZW1lbnQgPT09IGxhc3QpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAobG9vcCkgZm9jdXMoZmlyc3QsIHsgc2VsZWN0OiB0cnVlIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgZm9jdXNlZEVsZW1lbnQgPT09IGZpcnN0KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaWYgKGxvb3ApIGZvY3VzKGxhc3QsIHsgc2VsZWN0OiB0cnVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2xvb3AsIHRyYXBwZWQsIGZvY3VzU2NvcGUucGF1c2VkXVxuICApO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQcmltaXRpdmUuZGl2LCB7IHRhYkluZGV4OiAtMSwgLi4uc2NvcGVQcm9wcywgcmVmOiBjb21wb3NlZFJlZnMsIG9uS2V5RG93bjogaGFuZGxlS2V5RG93biB9KTtcbn0pO1xuRm9jdXNTY29wZS5kaXNwbGF5TmFtZSA9IEZPQ1VTX1NDT1BFX05BTUU7XG5mdW5jdGlvbiBmb2N1c0ZpcnN0KGNhbmRpZGF0ZXMsIHsgc2VsZWN0ID0gZmFsc2UgfSA9IHt9KSB7XG4gIGNvbnN0IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBmb2N1cyhjYW5kaWRhdGUsIHsgc2VsZWN0IH0pO1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpIHJldHVybjtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VGFiYmFibGVFZGdlcyhjb250YWluZXIpIHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IGdldFRhYmJhYmxlQ2FuZGlkYXRlcyhjb250YWluZXIpO1xuICBjb25zdCBmaXJzdCA9IGZpbmRWaXNpYmxlKGNhbmRpZGF0ZXMsIGNvbnRhaW5lcik7XG4gIGNvbnN0IGxhc3QgPSBmaW5kVmlzaWJsZShjYW5kaWRhdGVzLnJldmVyc2UoKSwgY29udGFpbmVyKTtcbiAgcmV0dXJuIFtmaXJzdCwgbGFzdF07XG59XG5mdW5jdGlvbiBnZXRUYWJiYWJsZUNhbmRpZGF0ZXMoY29udGFpbmVyKSB7XG4gIGNvbnN0IG5vZGVzID0gW107XG4gIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoY29udGFpbmVyLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCwge1xuICAgIGFjY2VwdE5vZGU6IChub2RlKSA9PiB7XG4gICAgICBjb25zdCBpc0hpZGRlbklucHV0ID0gbm9kZS50YWdOYW1lID09PSBcIklOUFVUXCIgJiYgbm9kZS50eXBlID09PSBcImhpZGRlblwiO1xuICAgICAgaWYgKG5vZGUuZGlzYWJsZWQgfHwgbm9kZS5oaWRkZW4gfHwgaXNIaWRkZW5JbnB1dCkgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX1NLSVA7XG4gICAgICByZXR1cm4gbm9kZS50YWJJbmRleCA+PSAwID8gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUIDogTm9kZUZpbHRlci5GSUxURVJfU0tJUDtcbiAgICB9XG4gIH0pO1xuICB3aGlsZSAod2Fsa2VyLm5leHROb2RlKCkpIG5vZGVzLnB1c2god2Fsa2VyLmN1cnJlbnROb2RlKTtcbiAgcmV0dXJuIG5vZGVzO1xufVxuZnVuY3Rpb24gZmluZFZpc2libGUoZWxlbWVudHMsIGNvbnRhaW5lcikge1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBpZiAoIWlzSGlkZGVuKGVsZW1lbnQsIHsgdXBUbzogY29udGFpbmVyIH0pKSByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuZnVuY3Rpb24gaXNIaWRkZW4obm9kZSwgeyB1cFRvIH0pIHtcbiAgaWYgKGdldENvbXB1dGVkU3R5bGUobm9kZSkudmlzaWJpbGl0eSA9PT0gXCJoaWRkZW5cIikgcmV0dXJuIHRydWU7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKHVwVG8gIT09IHZvaWQgMCAmJiBub2RlID09PSB1cFRvKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGdldENvbXB1dGVkU3R5bGUobm9kZSkuZGlzcGxheSA9PT0gXCJub25lXCIpIHJldHVybiB0cnVlO1xuICAgIG5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNTZWxlY3RhYmxlSW5wdXQoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgXCJzZWxlY3RcIiBpbiBlbGVtZW50O1xufVxuZnVuY3Rpb24gZm9jdXMoZWxlbWVudCwgeyBzZWxlY3QgPSBmYWxzZSB9ID0ge30pIHtcbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5mb2N1cykge1xuICAgIGNvbnN0IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgZWxlbWVudC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgaWYgKGVsZW1lbnQgIT09IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCAmJiBpc1NlbGVjdGFibGVJbnB1dChlbGVtZW50KSAmJiBzZWxlY3QpXG4gICAgICBlbGVtZW50LnNlbGVjdCgpO1xuICB9XG59XG52YXIgZm9jdXNTY29wZXNTdGFjayA9IGNyZWF0ZUZvY3VzU2NvcGVzU3RhY2soKTtcbmZ1bmN0aW9uIGNyZWF0ZUZvY3VzU2NvcGVzU3RhY2soKSB7XG4gIGxldCBzdGFjayA9IFtdO1xuICByZXR1cm4ge1xuICAgIGFkZChmb2N1c1Njb3BlKSB7XG4gICAgICBjb25zdCBhY3RpdmVGb2N1c1Njb3BlID0gc3RhY2tbMF07XG4gICAgICBpZiAoZm9jdXNTY29wZSAhPT0gYWN0aXZlRm9jdXNTY29wZSkge1xuICAgICAgICBhY3RpdmVGb2N1c1Njb3BlPy5wYXVzZSgpO1xuICAgICAgfVxuICAgICAgc3RhY2sgPSBhcnJheVJlbW92ZShzdGFjaywgZm9jdXNTY29wZSk7XG4gICAgICBzdGFjay51bnNoaWZ0KGZvY3VzU2NvcGUpO1xuICAgIH0sXG4gICAgcmVtb3ZlKGZvY3VzU2NvcGUpIHtcbiAgICAgIHN0YWNrID0gYXJyYXlSZW1vdmUoc3RhY2ssIGZvY3VzU2NvcGUpO1xuICAgICAgc3RhY2tbMF0/LnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGFycmF5UmVtb3ZlKGFycmF5LCBpdGVtKSB7XG4gIGNvbnN0IHVwZGF0ZWRBcnJheSA9IFsuLi5hcnJheV07XG4gIGNvbnN0IGluZGV4ID0gdXBkYXRlZEFycmF5LmluZGV4T2YoaXRlbSk7XG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICB1cGRhdGVkQXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuICByZXR1cm4gdXBkYXRlZEFycmF5O1xufVxuZnVuY3Rpb24gcmVtb3ZlTGlua3MoaXRlbXMpIHtcbiAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS50YWdOYW1lICE9PSBcIkFcIik7XG59XG52YXIgUm9vdCA9IEZvY3VzU2NvcGU7XG5leHBvcnQge1xuICBGb2N1c1Njb3BlLFxuICBSb290XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvaWQvc3JjL2lkLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1sYXlvdXQtZWZmZWN0XCI7XG52YXIgdXNlUmVhY3RJZCA9IFJlYWN0W1widXNlSWRcIi50b1N0cmluZygpXSB8fCAoKCkgPT4gdm9pZCAwKTtcbnZhciBjb3VudCA9IDA7XG5mdW5jdGlvbiB1c2VJZChkZXRlcm1pbmlzdGljSWQpIHtcbiAgY29uc3QgW2lkLCBzZXRJZF0gPSBSZWFjdC51c2VTdGF0ZSh1c2VSZWFjdElkKCkpO1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZGV0ZXJtaW5pc3RpY0lkKSBzZXRJZCgocmVhY3RJZCkgPT4gcmVhY3RJZCA/PyBTdHJpbmcoY291bnQrKykpO1xuICB9LCBbZGV0ZXJtaW5pc3RpY0lkXSk7XG4gIHJldHVybiBkZXRlcm1pbmlzdGljSWQgfHwgKGlkID8gYHJhZGl4LSR7aWR9YCA6IFwiXCIpO1xufVxuZXhwb3J0IHtcbiAgdXNlSWRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvbWVudS9zcmMvTWVudS50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY29tcG9zZUV2ZW50SGFuZGxlcnMgfSBmcm9tIFwiQHJhZGl4LXVpL3ByaW1pdGl2ZVwiO1xuaW1wb3J0IHsgY3JlYXRlQ29sbGVjdGlvbiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29sbGVjdGlvblwiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZWRSZWZzLCBjb21wb3NlUmVmcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzXCI7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0U2NvcGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbnRleHRcIjtcbmltcG9ydCB7IHVzZURpcmVjdGlvbiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtZGlyZWN0aW9uXCI7XG5pbXBvcnQgeyBEaXNtaXNzYWJsZUxheWVyIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1kaXNtaXNzYWJsZS1sYXllclwiO1xuaW1wb3J0IHsgdXNlRm9jdXNHdWFyZHMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWZvY3VzLWd1YXJkc1wiO1xuaW1wb3J0IHsgRm9jdXNTY29wZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtZm9jdXMtc2NvcGVcIjtcbmltcG9ydCB7IHVzZUlkIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1pZFwiO1xuaW1wb3J0ICogYXMgUG9wcGVyUHJpbWl0aXZlIGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcG9wcGVyXCI7XG5pbXBvcnQgeyBjcmVhdGVQb3BwZXJTY29wZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcG9wcGVyXCI7XG5pbXBvcnQgeyBQb3J0YWwgYXMgUG9ydGFsUHJpbWl0aXZlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wb3J0YWxcIjtcbmltcG9ydCB7IFByZXNlbmNlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wcmVzZW5jZVwiO1xuaW1wb3J0IHsgUHJpbWl0aXZlLCBkaXNwYXRjaERpc2NyZXRlQ3VzdG9tRXZlbnQgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZVwiO1xuaW1wb3J0ICogYXMgUm92aW5nRm9jdXNHcm91cCBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXJvdmluZy1mb2N1c1wiO1xuaW1wb3J0IHsgY3JlYXRlUm92aW5nRm9jdXNHcm91cFNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1yb3ZpbmctZm9jdXNcIjtcbmltcG9ydCB7IFNsb3QgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXNsb3RcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmXCI7XG5pbXBvcnQgeyBoaWRlT3RoZXJzIH0gZnJvbSBcImFyaWEtaGlkZGVuXCI7XG5pbXBvcnQgeyBSZW1vdmVTY3JvbGwgfSBmcm9tIFwicmVhY3QtcmVtb3ZlLXNjcm9sbFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgU0VMRUNUSU9OX0tFWVMgPSBbXCJFbnRlclwiLCBcIiBcIl07XG52YXIgRklSU1RfS0VZUyA9IFtcIkFycm93RG93blwiLCBcIlBhZ2VVcFwiLCBcIkhvbWVcIl07XG52YXIgTEFTVF9LRVlTID0gW1wiQXJyb3dVcFwiLCBcIlBhZ2VEb3duXCIsIFwiRW5kXCJdO1xudmFyIEZJUlNUX0xBU1RfS0VZUyA9IFsuLi5GSVJTVF9LRVlTLCAuLi5MQVNUX0tFWVNdO1xudmFyIFNVQl9PUEVOX0tFWVMgPSB7XG4gIGx0cjogWy4uLlNFTEVDVElPTl9LRVlTLCBcIkFycm93UmlnaHRcIl0sXG4gIHJ0bDogWy4uLlNFTEVDVElPTl9LRVlTLCBcIkFycm93TGVmdFwiXVxufTtcbnZhciBTVUJfQ0xPU0VfS0VZUyA9IHtcbiAgbHRyOiBbXCJBcnJvd0xlZnRcIl0sXG4gIHJ0bDogW1wiQXJyb3dSaWdodFwiXVxufTtcbnZhciBNRU5VX05BTUUgPSBcIk1lbnVcIjtcbnZhciBbQ29sbGVjdGlvbiwgdXNlQ29sbGVjdGlvbiwgY3JlYXRlQ29sbGVjdGlvblNjb3BlXSA9IGNyZWF0ZUNvbGxlY3Rpb24oTUVOVV9OQU1FKTtcbnZhciBbY3JlYXRlTWVudUNvbnRleHQsIGNyZWF0ZU1lbnVTY29wZV0gPSBjcmVhdGVDb250ZXh0U2NvcGUoTUVOVV9OQU1FLCBbXG4gIGNyZWF0ZUNvbGxlY3Rpb25TY29wZSxcbiAgY3JlYXRlUG9wcGVyU2NvcGUsXG4gIGNyZWF0ZVJvdmluZ0ZvY3VzR3JvdXBTY29wZVxuXSk7XG52YXIgdXNlUG9wcGVyU2NvcGUgPSBjcmVhdGVQb3BwZXJTY29wZSgpO1xudmFyIHVzZVJvdmluZ0ZvY3VzR3JvdXBTY29wZSA9IGNyZWF0ZVJvdmluZ0ZvY3VzR3JvdXBTY29wZSgpO1xudmFyIFtNZW51UHJvdmlkZXIsIHVzZU1lbnVDb250ZXh0XSA9IGNyZWF0ZU1lbnVDb250ZXh0KE1FTlVfTkFNRSk7XG52YXIgW01lbnVSb290UHJvdmlkZXIsIHVzZU1lbnVSb290Q29udGV4dF0gPSBjcmVhdGVNZW51Q29udGV4dChNRU5VX05BTUUpO1xudmFyIE1lbnUgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlTWVudSwgb3BlbiA9IGZhbHNlLCBjaGlsZHJlbiwgZGlyLCBvbk9wZW5DaGFuZ2UsIG1vZGFsID0gdHJ1ZSB9ID0gcHJvcHM7XG4gIGNvbnN0IHBvcHBlclNjb3BlID0gdXNlUG9wcGVyU2NvcGUoX19zY29wZU1lbnUpO1xuICBjb25zdCBbY29udGVudCwgc2V0Q29udGVudF0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgaXNVc2luZ0tleWJvYXJkUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgaGFuZGxlT3BlbkNoYW5nZSA9IHVzZUNhbGxiYWNrUmVmKG9uT3BlbkNoYW5nZSk7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IHVzZURpcmVjdGlvbihkaXIpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSAoKSA9PiB7XG4gICAgICBpc1VzaW5nS2V5Ym9hcmRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgaGFuZGxlUG9pbnRlciwgeyBjYXB0dXJlOiB0cnVlLCBvbmNlOiB0cnVlIH0pO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIGhhbmRsZVBvaW50ZXIsIHsgY2FwdHVyZTogdHJ1ZSwgb25jZTogdHJ1ZSB9KTtcbiAgICB9O1xuICAgIGNvbnN0IGhhbmRsZVBvaW50ZXIgPSAoKSA9PiBpc1VzaW5nS2V5Ym9hcmRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93biwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZVBvaW50ZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBoYW5kbGVQb2ludGVyLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQb3BwZXJQcmltaXRpdmUuUm9vdCwgeyAuLi5wb3BwZXJTY29wZSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgTWVudVByb3ZpZGVyLFxuICAgIHtcbiAgICAgIHNjb3BlOiBfX3Njb3BlTWVudSxcbiAgICAgIG9wZW4sXG4gICAgICBvbk9wZW5DaGFuZ2U6IGhhbmRsZU9wZW5DaGFuZ2UsXG4gICAgICBjb250ZW50LFxuICAgICAgb25Db250ZW50Q2hhbmdlOiBzZXRDb250ZW50LFxuICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgIE1lbnVSb290UHJvdmlkZXIsXG4gICAgICAgIHtcbiAgICAgICAgICBzY29wZTogX19zY29wZU1lbnUsXG4gICAgICAgICAgb25DbG9zZTogUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4gaGFuZGxlT3BlbkNoYW5nZShmYWxzZSksIFtoYW5kbGVPcGVuQ2hhbmdlXSksXG4gICAgICAgICAgaXNVc2luZ0tleWJvYXJkUmVmLFxuICAgICAgICAgIGRpcjogZGlyZWN0aW9uLFxuICAgICAgICAgIG1vZGFsLFxuICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gICkgfSk7XG59O1xuTWVudS5kaXNwbGF5TmFtZSA9IE1FTlVfTkFNRTtcbnZhciBBTkNIT1JfTkFNRSA9IFwiTWVudUFuY2hvclwiO1xudmFyIE1lbnVBbmNob3IgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZU1lbnUsIC4uLmFuY2hvclByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBwb3BwZXJTY29wZSA9IHVzZVBvcHBlclNjb3BlKF9fc2NvcGVNZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQb3BwZXJQcmltaXRpdmUuQW5jaG9yLCB7IC4uLnBvcHBlclNjb3BlLCAuLi5hbmNob3JQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH1cbik7XG5NZW51QW5jaG9yLmRpc3BsYXlOYW1lID0gQU5DSE9SX05BTUU7XG52YXIgUE9SVEFMX05BTUUgPSBcIk1lbnVQb3J0YWxcIjtcbnZhciBbUG9ydGFsUHJvdmlkZXIsIHVzZVBvcnRhbENvbnRleHRdID0gY3JlYXRlTWVudUNvbnRleHQoUE9SVEFMX05BTUUsIHtcbiAgZm9yY2VNb3VudDogdm9pZCAwXG59KTtcbnZhciBNZW51UG9ydGFsID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZU1lbnUsIGZvcmNlTW91bnQsIGNoaWxkcmVuLCBjb250YWluZXIgfSA9IHByb3BzO1xuICBjb25zdCBjb250ZXh0ID0gdXNlTWVudUNvbnRleHQoUE9SVEFMX05BTUUsIF9fc2NvcGVNZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUG9ydGFsUHJvdmlkZXIsIHsgc2NvcGU6IF9fc2NvcGVNZW51LCBmb3JjZU1vdW50LCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChQcmVzZW5jZSwgeyBwcmVzZW50OiBmb3JjZU1vdW50IHx8IGNvbnRleHQub3BlbiwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goUG9ydGFsUHJpbWl0aXZlLCB7IGFzQ2hpbGQ6IHRydWUsIGNvbnRhaW5lciwgY2hpbGRyZW4gfSkgfSkgfSk7XG59O1xuTWVudVBvcnRhbC5kaXNwbGF5TmFtZSA9IFBPUlRBTF9OQU1FO1xudmFyIENPTlRFTlRfTkFNRSA9IFwiTWVudUNvbnRlbnRcIjtcbnZhciBbTWVudUNvbnRlbnRQcm92aWRlciwgdXNlTWVudUNvbnRlbnRDb250ZXh0XSA9IGNyZWF0ZU1lbnVDb250ZXh0KENPTlRFTlRfTkFNRSk7XG52YXIgTWVudUNvbnRlbnQgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHBvcnRhbENvbnRleHQgPSB1c2VQb3J0YWxDb250ZXh0KENPTlRFTlRfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHsgZm9yY2VNb3VudCA9IHBvcnRhbENvbnRleHQuZm9yY2VNb3VudCwgLi4uY29udGVudFByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlTWVudUNvbnRleHQoQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3Qgcm9vdENvbnRleHQgPSB1c2VNZW51Um9vdENvbnRleHQoQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goQ29sbGVjdGlvbi5Qcm92aWRlciwgeyBzY29wZTogcHJvcHMuX19zY29wZU1lbnUsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFByZXNlbmNlLCB7IHByZXNlbnQ6IGZvcmNlTW91bnQgfHwgY29udGV4dC5vcGVuLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChDb2xsZWN0aW9uLlNsb3QsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVNZW51LCBjaGlsZHJlbjogcm9vdENvbnRleHQubW9kYWwgPyAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVSb290Q29udGVudE1vZGFsLCB7IC4uLmNvbnRlbnRQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSkgOiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVSb290Q29udGVudE5vbk1vZGFsLCB7IC4uLmNvbnRlbnRQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSkgfSkgfSkgfSk7XG4gIH1cbik7XG52YXIgTWVudVJvb3RDb250ZW50TW9kYWwgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VNZW51Q29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgcmVmKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgY29udGVudCA9IHJlZi5jdXJyZW50O1xuICAgICAgaWYgKGNvbnRlbnQpIHJldHVybiBoaWRlT3RoZXJzKGNvbnRlbnQpO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIE1lbnVDb250ZW50SW1wbCxcbiAgICAgIHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICB0cmFwRm9jdXM6IGNvbnRleHQub3BlbixcbiAgICAgICAgZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOiBjb250ZXh0Lm9wZW4sXG4gICAgICAgIGRpc2FibGVPdXRzaWRlU2Nyb2xsOiB0cnVlLFxuICAgICAgICBvbkZvY3VzT3V0c2lkZTogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgcHJvcHMub25Gb2N1c091dHNpZGUsXG4gICAgICAgICAgKGV2ZW50KSA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpLFxuICAgICAgICAgIHsgY2hlY2tGb3JEZWZhdWx0UHJldmVudGVkOiBmYWxzZSB9XG4gICAgICAgICksXG4gICAgICAgIG9uRGlzbWlzczogKCkgPT4gY29udGV4dC5vbk9wZW5DaGFuZ2UoZmFsc2UpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcbnZhciBNZW51Um9vdENvbnRlbnROb25Nb2RhbCA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZU1lbnVDb250ZXh0KENPTlRFTlRfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICBNZW51Q29udGVudEltcGwsXG4gICAge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgIHRyYXBGb2N1czogZmFsc2UsXG4gICAgICBkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6IGZhbHNlLFxuICAgICAgZGlzYWJsZU91dHNpZGVTY3JvbGw6IGZhbHNlLFxuICAgICAgb25EaXNtaXNzOiAoKSA9PiBjb250ZXh0Lm9uT3BlbkNoYW5nZShmYWxzZSlcbiAgICB9XG4gICk7XG59KTtcbnZhciBNZW51Q29udGVudEltcGwgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIF9fc2NvcGVNZW51LFxuICAgICAgbG9vcCA9IGZhbHNlLFxuICAgICAgdHJhcEZvY3VzLFxuICAgICAgb25PcGVuQXV0b0ZvY3VzLFxuICAgICAgb25DbG9zZUF1dG9Gb2N1cyxcbiAgICAgIGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cyxcbiAgICAgIG9uRW50cnlGb2N1cyxcbiAgICAgIG9uRXNjYXBlS2V5RG93bixcbiAgICAgIG9uUG9pbnRlckRvd25PdXRzaWRlLFxuICAgICAgb25Gb2N1c091dHNpZGUsXG4gICAgICBvbkludGVyYWN0T3V0c2lkZSxcbiAgICAgIG9uRGlzbWlzcyxcbiAgICAgIGRpc2FibGVPdXRzaWRlU2Nyb2xsLFxuICAgICAgLi4uY29udGVudFByb3BzXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VNZW51Q29udGV4dChDT05URU5UX05BTUUsIF9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByb290Q29udGV4dCA9IHVzZU1lbnVSb290Q29udGV4dChDT05URU5UX05BTUUsIF9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBwb3BwZXJTY29wZSA9IHVzZVBvcHBlclNjb3BlKF9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByb3ZpbmdGb2N1c0dyb3VwU2NvcGUgPSB1c2VSb3ZpbmdGb2N1c0dyb3VwU2NvcGUoX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IGdldEl0ZW1zID0gdXNlQ29sbGVjdGlvbihfX3Njb3BlTWVudSk7XG4gICAgY29uc3QgW2N1cnJlbnRJdGVtSWQsIHNldEN1cnJlbnRJdGVtSWRdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gICAgY29uc3QgY29udGVudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCBjb250ZW50UmVmLCBjb250ZXh0Lm9uQ29udGVudENoYW5nZSk7XG4gICAgY29uc3QgdGltZXJSZWYgPSBSZWFjdC51c2VSZWYoMCk7XG4gICAgY29uc3Qgc2VhcmNoUmVmID0gUmVhY3QudXNlUmVmKFwiXCIpO1xuICAgIGNvbnN0IHBvaW50ZXJHcmFjZVRpbWVyUmVmID0gUmVhY3QudXNlUmVmKDApO1xuICAgIGNvbnN0IHBvaW50ZXJHcmFjZUludGVudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBwb2ludGVyRGlyUmVmID0gUmVhY3QudXNlUmVmKFwicmlnaHRcIik7XG4gICAgY29uc3QgbGFzdFBvaW50ZXJYUmVmID0gUmVhY3QudXNlUmVmKDApO1xuICAgIGNvbnN0IFNjcm9sbExvY2tXcmFwcGVyID0gZGlzYWJsZU91dHNpZGVTY3JvbGwgPyBSZW1vdmVTY3JvbGwgOiBSZWFjdC5GcmFnbWVudDtcbiAgICBjb25zdCBzY3JvbGxMb2NrV3JhcHBlclByb3BzID0gZGlzYWJsZU91dHNpZGVTY3JvbGwgPyB7IGFzOiBTbG90LCBhbGxvd1BpbmNoWm9vbTogdHJ1ZSB9IDogdm9pZCAwO1xuICAgIGNvbnN0IGhhbmRsZVR5cGVhaGVhZFNlYXJjaCA9IChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHNlYXJjaFJlZi5jdXJyZW50ICsga2V5O1xuICAgICAgY29uc3QgaXRlbXMgPSBnZXRJdGVtcygpLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uZGlzYWJsZWQpO1xuICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgY29uc3QgY3VycmVudE1hdGNoID0gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5yZWYuY3VycmVudCA9PT0gY3VycmVudEl0ZW0pPy50ZXh0VmFsdWU7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBpdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0udGV4dFZhbHVlKTtcbiAgICAgIGNvbnN0IG5leHRNYXRjaCA9IGdldE5leHRNYXRjaCh2YWx1ZXMsIHNlYXJjaCwgY3VycmVudE1hdGNoKTtcbiAgICAgIGNvbnN0IG5ld0l0ZW0gPSBpdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLnRleHRWYWx1ZSA9PT0gbmV4dE1hdGNoKT8ucmVmLmN1cnJlbnQ7XG4gICAgICAoZnVuY3Rpb24gdXBkYXRlU2VhcmNoKHZhbHVlKSB7XG4gICAgICAgIHNlYXJjaFJlZi5jdXJyZW50ID0gdmFsdWU7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJSZWYuY3VycmVudCk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gXCJcIikgdGltZXJSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHVwZGF0ZVNlYXJjaChcIlwiKSwgMWUzKTtcbiAgICAgIH0pKHNlYXJjaCk7XG4gICAgICBpZiAobmV3SXRlbSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IG5ld0l0ZW0uZm9jdXMoKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgcmV0dXJuICgpID0+IHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJSZWYuY3VycmVudCk7XG4gICAgfSwgW10pO1xuICAgIHVzZUZvY3VzR3VhcmRzKCk7XG4gICAgY29uc3QgaXNQb2ludGVyTW92aW5nVG9TdWJtZW51ID0gUmVhY3QudXNlQ2FsbGJhY2soKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBpc01vdmluZ1Rvd2FyZHMgPSBwb2ludGVyRGlyUmVmLmN1cnJlbnQgPT09IHBvaW50ZXJHcmFjZUludGVudFJlZi5jdXJyZW50Py5zaWRlO1xuICAgICAgcmV0dXJuIGlzTW92aW5nVG93YXJkcyAmJiBpc1BvaW50ZXJJbkdyYWNlQXJlYShldmVudCwgcG9pbnRlckdyYWNlSW50ZW50UmVmLmN1cnJlbnQ/LmFyZWEpO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIE1lbnVDb250ZW50UHJvdmlkZXIsXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiBfX3Njb3BlTWVudSxcbiAgICAgICAgc2VhcmNoUmVmLFxuICAgICAgICBvbkl0ZW1FbnRlcjogUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNQb2ludGVyTW92aW5nVG9TdWJtZW51KGV2ZW50KSkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtpc1BvaW50ZXJNb3ZpbmdUb1N1Ym1lbnVdXG4gICAgICAgICksXG4gICAgICAgIG9uSXRlbUxlYXZlOiBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1BvaW50ZXJNb3ZpbmdUb1N1Ym1lbnUoZXZlbnQpKSByZXR1cm47XG4gICAgICAgICAgICBjb250ZW50UmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgICAgICBzZXRDdXJyZW50SXRlbUlkKG51bGwpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW2lzUG9pbnRlck1vdmluZ1RvU3VibWVudV1cbiAgICAgICAgKSxcbiAgICAgICAgb25UcmlnZ2VyTGVhdmU6IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgICAgICAgIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzUG9pbnRlck1vdmluZ1RvU3VibWVudShldmVudCkpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbaXNQb2ludGVyTW92aW5nVG9TdWJtZW51XVxuICAgICAgICApLFxuICAgICAgICBwb2ludGVyR3JhY2VUaW1lclJlZixcbiAgICAgICAgb25Qb2ludGVyR3JhY2VJbnRlbnRDaGFuZ2U6IFJlYWN0LnVzZUNhbGxiYWNrKChpbnRlbnQpID0+IHtcbiAgICAgICAgICBwb2ludGVyR3JhY2VJbnRlbnRSZWYuY3VycmVudCA9IGludGVudDtcbiAgICAgICAgfSwgW10pLFxuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChTY3JvbGxMb2NrV3JhcHBlciwgeyAuLi5zY3JvbGxMb2NrV3JhcHBlclByb3BzLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICBGb2N1c1Njb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFzQ2hpbGQ6IHRydWUsXG4gICAgICAgICAgICB0cmFwcGVkOiB0cmFwRm9jdXMsXG4gICAgICAgICAgICBvbk1vdW50QXV0b0ZvY3VzOiBjb21wb3NlRXZlbnRIYW5kbGVycyhvbk9wZW5BdXRvRm9jdXMsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBjb250ZW50UmVmLmN1cnJlbnQ/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgb25Vbm1vdW50QXV0b0ZvY3VzOiBvbkNsb3NlQXV0b0ZvY3VzLFxuICAgICAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgICAgIERpc21pc3NhYmxlTGF5ZXIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhc0NoaWxkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cyxcbiAgICAgICAgICAgICAgICBvbkVzY2FwZUtleURvd24sXG4gICAgICAgICAgICAgICAgb25Qb2ludGVyRG93bk91dHNpZGUsXG4gICAgICAgICAgICAgICAgb25Gb2N1c091dHNpZGUsXG4gICAgICAgICAgICAgICAgb25JbnRlcmFjdE91dHNpZGUsXG4gICAgICAgICAgICAgICAgb25EaXNtaXNzLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgICAgICAgICAgUm92aW5nRm9jdXNHcm91cC5Sb290LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhc0NoaWxkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAuLi5yb3ZpbmdGb2N1c0dyb3VwU2NvcGUsXG4gICAgICAgICAgICAgICAgICAgIGRpcjogcm9vdENvbnRleHQuZGlyLFxuICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgICAgICAgICAgICBsb29wLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFiU3RvcElkOiBjdXJyZW50SXRlbUlkLFxuICAgICAgICAgICAgICAgICAgICBvbkN1cnJlbnRUYWJTdG9wSWRDaGFuZ2U6IHNldEN1cnJlbnRJdGVtSWQsXG4gICAgICAgICAgICAgICAgICAgIG9uRW50cnlGb2N1czogY29tcG9zZUV2ZW50SGFuZGxlcnMob25FbnRyeUZvY3VzLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvb3RDb250ZXh0LmlzVXNpbmdLZXlib2FyZFJlZi5jdXJyZW50KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudFNjcm9sbE9uRW50cnlGb2N1czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgICAgICAgICAgICAgUG9wcGVyUHJpbWl0aXZlLkNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZTogXCJtZW51XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkYXRhLXN0YXRlXCI6IGdldE9wZW5TdGF0ZShjb250ZXh0Lm9wZW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkYXRhLXJhZGl4LW1lbnUtY29udGVudFwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyOiByb290Q29udGV4dC5kaXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5wb3BwZXJTY29wZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNvbnRlbnRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHsgb3V0bGluZTogXCJub25lXCIsIC4uLmNvbnRlbnRQcm9wcy5zdHlsZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhjb250ZW50UHJvcHMub25LZXlEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0tleURvd25JbnNpZGUgPSB0YXJnZXQuY2xvc2VzdChcIltkYXRhLXJhZGl4LW1lbnUtY29udGVudF1cIikgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTW9kaWZpZXJLZXkgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5tZXRhS2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0NoYXJhY3RlcktleSA9IGV2ZW50LmtleS5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0tleURvd25JbnNpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIlRhYlwiKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNNb2RpZmllcktleSAmJiBpc0NoYXJhY3RlcktleSkgaGFuZGxlVHlwZWFoZWFkU2VhcmNoKGV2ZW50LmtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGNvbnRlbnRSZWYuY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gY29udGVudCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZJUlNUX0xBU1RfS0VZUy5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0SXRlbXMoKS5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmRpc2FibGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlTm9kZXMgPSBpdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0ucmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTEFTVF9LRVlTLmluY2x1ZGVzKGV2ZW50LmtleSkpIGNhbmRpZGF0ZU5vZGVzLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNGaXJzdChjYW5kaWRhdGVOb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQmx1cjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25CbHVyLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFldmVudC5jdXJyZW50VGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVyUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFJlZi5jdXJyZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBvblBvaW50ZXJNb3ZlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMub25Qb2ludGVyTW92ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbk1vdXNlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludGVyWEhhc0NoYW5nZWQgPSBsYXN0UG9pbnRlclhSZWYuY3VycmVudCAhPT0gZXZlbnQuY2xpZW50WDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC5jb250YWlucyh0YXJnZXQpICYmIHBvaW50ZXJYSGFzQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RGlyID0gZXZlbnQuY2xpZW50WCA+IGxhc3RQb2ludGVyWFJlZi5jdXJyZW50ID8gXCJyaWdodFwiIDogXCJsZWZ0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyRGlyUmVmLmN1cnJlbnQgPSBuZXdEaXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UG9pbnRlclhSZWYuY3VycmVudCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgKSB9KVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5NZW51Q29udGVudC5kaXNwbGF5TmFtZSA9IENPTlRFTlRfTkFNRTtcbnZhciBHUk9VUF9OQU1FID0gXCJNZW51R3JvdXBcIjtcbnZhciBNZW51R3JvdXAgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZU1lbnUsIC4uLmdyb3VwUHJvcHMgfSA9IHByb3BzO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFByaW1pdGl2ZS5kaXYsIHsgcm9sZTogXCJncm91cFwiLCAuLi5ncm91cFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfVxuKTtcbk1lbnVHcm91cC5kaXNwbGF5TmFtZSA9IEdST1VQX05BTUU7XG52YXIgTEFCRUxfTkFNRSA9IFwiTWVudUxhYmVsXCI7XG52YXIgTWVudUxhYmVsID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVNZW51LCAuLi5sYWJlbFByb3BzIH0gPSBwcm9wcztcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQcmltaXRpdmUuZGl2LCB7IC4uLmxhYmVsUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9XG4pO1xuTWVudUxhYmVsLmRpc3BsYXlOYW1lID0gTEFCRUxfTkFNRTtcbnZhciBJVEVNX05BTUUgPSBcIk1lbnVJdGVtXCI7XG52YXIgSVRFTV9TRUxFQ1QgPSBcIm1lbnUuaXRlbVNlbGVjdFwiO1xudmFyIE1lbnVJdGVtID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IGRpc2FibGVkID0gZmFsc2UsIG9uU2VsZWN0LCAuLi5pdGVtUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCByb290Q29udGV4dCA9IHVzZU1lbnVSb290Q29udGV4dChJVEVNX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IHVzZU1lbnVDb250ZW50Q29udGV4dChJVEVNX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICAgIGNvbnN0IGlzUG9pbnRlckRvd25SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgIGNvbnN0IGhhbmRsZVNlbGVjdCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG1lbnVJdGVtID0gcmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIWRpc2FibGVkICYmIG1lbnVJdGVtKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1TZWxlY3RFdmVudCA9IG5ldyBDdXN0b21FdmVudChJVEVNX1NFTEVDVCwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICBtZW51SXRlbS5hZGRFdmVudExpc3RlbmVyKElURU1fU0VMRUNULCAoZXZlbnQpID0+IG9uU2VsZWN0Py4oZXZlbnQpLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIGRpc3BhdGNoRGlzY3JldGVDdXN0b21FdmVudChtZW51SXRlbSwgaXRlbVNlbGVjdEV2ZW50KTtcbiAgICAgICAgaWYgKGl0ZW1TZWxlY3RFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgaXNQb2ludGVyRG93blJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcm9vdENvbnRleHQub25DbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIE1lbnVJdGVtSW1wbCxcbiAgICAgIHtcbiAgICAgICAgLi4uaXRlbVByb3BzLFxuICAgICAgICByZWY6IGNvbXBvc2VkUmVmcyxcbiAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgIG9uQ2xpY2s6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uQ2xpY2ssIGhhbmRsZVNlbGVjdCksXG4gICAgICAgIG9uUG9pbnRlckRvd246IChldmVudCkgPT4ge1xuICAgICAgICAgIHByb3BzLm9uUG9pbnRlckRvd24/LihldmVudCk7XG4gICAgICAgICAgaXNQb2ludGVyRG93blJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Qb2ludGVyVXA6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uUG9pbnRlclVwLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoIWlzUG9pbnRlckRvd25SZWYuY3VycmVudCkgZXZlbnQuY3VycmVudFRhcmdldD8uY2xpY2soKTtcbiAgICAgICAgfSksXG4gICAgICAgIG9uS2V5RG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25LZXlEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBpc1R5cGluZ0FoZWFkID0gY29udGVudENvbnRleHQuc2VhcmNoUmVmLmN1cnJlbnQgIT09IFwiXCI7XG4gICAgICAgICAgaWYgKGRpc2FibGVkIHx8IGlzVHlwaW5nQWhlYWQgJiYgZXZlbnQua2V5ID09PSBcIiBcIikgcmV0dXJuO1xuICAgICAgICAgIGlmIChTRUxFQ1RJT05fS0VZUy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0LmNsaWNrKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xuTWVudUl0ZW0uZGlzcGxheU5hbWUgPSBJVEVNX05BTUU7XG52YXIgTWVudUl0ZW1JbXBsID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVNZW51LCBkaXNhYmxlZCA9IGZhbHNlLCB0ZXh0VmFsdWUsIC4uLml0ZW1Qcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGVudENvbnRleHQgPSB1c2VNZW51Q29udGVudENvbnRleHQoSVRFTV9OQU1FLCBfX3Njb3BlTWVudSk7XG4gICAgY29uc3Qgcm92aW5nRm9jdXNHcm91cFNjb3BlID0gdXNlUm92aW5nRm9jdXNHcm91cFNjb3BlKF9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgcmVmKTtcbiAgICBjb25zdCBbaXNGb2N1c2VkLCBzZXRJc0ZvY3VzZWRdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFt0ZXh0Q29udGVudCwgc2V0VGV4dENvbnRlbnRdID0gUmVhY3QudXNlU3RhdGUoXCJcIik7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG1lbnVJdGVtID0gcmVmLmN1cnJlbnQ7XG4gICAgICBpZiAobWVudUl0ZW0pIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoKG1lbnVJdGVtLnRleHRDb250ZW50ID8/IFwiXCIpLnRyaW0oKSk7XG4gICAgICB9XG4gICAgfSwgW2l0ZW1Qcm9wcy5jaGlsZHJlbl0pO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgQ29sbGVjdGlvbi5JdGVtU2xvdCxcbiAgICAgIHtcbiAgICAgICAgc2NvcGU6IF9fc2NvcGVNZW51LFxuICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgdGV4dFZhbHVlOiB0ZXh0VmFsdWUgPz8gdGV4dENvbnRlbnQsXG4gICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFJvdmluZ0ZvY3VzR3JvdXAuSXRlbSwgeyBhc0NoaWxkOiB0cnVlLCAuLi5yb3ZpbmdGb2N1c0dyb3VwU2NvcGUsIGZvY3VzYWJsZTogIWRpc2FibGVkLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICBQcmltaXRpdmUuZGl2LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJvbGU6IFwibWVudWl0ZW1cIixcbiAgICAgICAgICAgIFwiZGF0YS1oaWdobGlnaHRlZFwiOiBpc0ZvY3VzZWQgPyBcIlwiIDogdm9pZCAwLFxuICAgICAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IGRpc2FibGVkIHx8IHZvaWQgMCxcbiAgICAgICAgICAgIFwiZGF0YS1kaXNhYmxlZFwiOiBkaXNhYmxlZCA/IFwiXCIgOiB2b2lkIDAsXG4gICAgICAgICAgICAuLi5pdGVtUHJvcHMsXG4gICAgICAgICAgICByZWY6IGNvbXBvc2VkUmVmcyxcbiAgICAgICAgICAgIG9uUG9pbnRlck1vdmU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKFxuICAgICAgICAgICAgICBwcm9wcy5vblBvaW50ZXJNb3ZlLFxuICAgICAgICAgICAgICB3aGVuTW91c2UoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50Q29udGV4dC5vbkl0ZW1MZWF2ZShldmVudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnRDb250ZXh0Lm9uSXRlbUVudGVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG9uUG9pbnRlckxlYXZlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICAgICAgcHJvcHMub25Qb2ludGVyTGVhdmUsXG4gICAgICAgICAgICAgIHdoZW5Nb3VzZSgoZXZlbnQpID0+IGNvbnRlbnRDb250ZXh0Lm9uSXRlbUxlYXZlKGV2ZW50KSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBvbkZvY3VzOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkZvY3VzLCAoKSA9PiBzZXRJc0ZvY3VzZWQodHJ1ZSkpLFxuICAgICAgICAgICAgb25CbHVyOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkJsdXIsICgpID0+IHNldElzRm9jdXNlZChmYWxzZSkpXG4gICAgICAgICAgfVxuICAgICAgICApIH0pXG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcbnZhciBDSEVDS0JPWF9JVEVNX05BTUUgPSBcIk1lbnVDaGVja2JveEl0ZW1cIjtcbnZhciBNZW51Q2hlY2tib3hJdGVtID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IGNoZWNrZWQgPSBmYWxzZSwgb25DaGVja2VkQ2hhbmdlLCAuLi5jaGVja2JveEl0ZW1Qcm9wcyB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goSXRlbUluZGljYXRvclByb3ZpZGVyLCB7IHNjb3BlOiBwcm9wcy5fX3Njb3BlTWVudSwgY2hlY2tlZCwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBNZW51SXRlbSxcbiAgICAgIHtcbiAgICAgICAgcm9sZTogXCJtZW51aXRlbWNoZWNrYm94XCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IGlzSW5kZXRlcm1pbmF0ZShjaGVja2VkKSA/IFwibWl4ZWRcIiA6IGNoZWNrZWQsXG4gICAgICAgIC4uLmNoZWNrYm94SXRlbVByb3BzLFxuICAgICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgICAgXCJkYXRhLXN0YXRlXCI6IGdldENoZWNrZWRTdGF0ZShjaGVja2VkKSxcbiAgICAgICAgb25TZWxlY3Q6IGNvbXBvc2VFdmVudEhhbmRsZXJzKFxuICAgICAgICAgIGNoZWNrYm94SXRlbVByb3BzLm9uU2VsZWN0LFxuICAgICAgICAgICgpID0+IG9uQ2hlY2tlZENoYW5nZT8uKGlzSW5kZXRlcm1pbmF0ZShjaGVja2VkKSA/IHRydWUgOiAhY2hlY2tlZCksXG4gICAgICAgICAgeyBjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgICkgfSk7XG4gIH1cbik7XG5NZW51Q2hlY2tib3hJdGVtLmRpc3BsYXlOYW1lID0gQ0hFQ0tCT1hfSVRFTV9OQU1FO1xudmFyIFJBRElPX0dST1VQX05BTUUgPSBcIk1lbnVSYWRpb0dyb3VwXCI7XG52YXIgW1JhZGlvR3JvdXBQcm92aWRlciwgdXNlUmFkaW9Hcm91cENvbnRleHRdID0gY3JlYXRlTWVudUNvbnRleHQoXG4gIFJBRElPX0dST1VQX05BTUUsXG4gIHsgdmFsdWU6IHZvaWQgMCwgb25WYWx1ZUNoYW5nZTogKCkgPT4ge1xuICB9IH1cbik7XG52YXIgTWVudVJhZGlvR3JvdXAgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgdmFsdWUsIG9uVmFsdWVDaGFuZ2UsIC4uLmdyb3VwUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGhhbmRsZVZhbHVlQ2hhbmdlID0gdXNlQ2FsbGJhY2tSZWYob25WYWx1ZUNoYW5nZSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUmFkaW9Hcm91cFByb3ZpZGVyLCB7IHNjb3BlOiBwcm9wcy5fX3Njb3BlTWVudSwgdmFsdWUsIG9uVmFsdWVDaGFuZ2U6IGhhbmRsZVZhbHVlQ2hhbmdlLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChNZW51R3JvdXAsIHsgLi4uZ3JvdXBQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSkgfSk7XG4gIH1cbik7XG5NZW51UmFkaW9Hcm91cC5kaXNwbGF5TmFtZSA9IFJBRElPX0dST1VQX05BTUU7XG52YXIgUkFESU9fSVRFTV9OQU1FID0gXCJNZW51UmFkaW9JdGVtXCI7XG52YXIgTWVudVJhZGlvSXRlbSA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZSwgLi4ucmFkaW9JdGVtUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VSYWRpb0dyb3VwQ29udGV4dChSQURJT19JVEVNX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBjaGVja2VkID0gdmFsdWUgPT09IGNvbnRleHQudmFsdWU7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goSXRlbUluZGljYXRvclByb3ZpZGVyLCB7IHNjb3BlOiBwcm9wcy5fX3Njb3BlTWVudSwgY2hlY2tlZCwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBNZW51SXRlbSxcbiAgICAgIHtcbiAgICAgICAgcm9sZTogXCJtZW51aXRlbXJhZGlvXCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IGNoZWNrZWQsXG4gICAgICAgIC4uLnJhZGlvSXRlbVByb3BzLFxuICAgICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgICAgXCJkYXRhLXN0YXRlXCI6IGdldENoZWNrZWRTdGF0ZShjaGVja2VkKSxcbiAgICAgICAgb25TZWxlY3Q6IGNvbXBvc2VFdmVudEhhbmRsZXJzKFxuICAgICAgICAgIHJhZGlvSXRlbVByb3BzLm9uU2VsZWN0LFxuICAgICAgICAgICgpID0+IGNvbnRleHQub25WYWx1ZUNoYW5nZT8uKHZhbHVlKSxcbiAgICAgICAgICB7IGNoZWNrRm9yRGVmYXVsdFByZXZlbnRlZDogZmFsc2UgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgKSB9KTtcbiAgfVxuKTtcbk1lbnVSYWRpb0l0ZW0uZGlzcGxheU5hbWUgPSBSQURJT19JVEVNX05BTUU7XG52YXIgSVRFTV9JTkRJQ0FUT1JfTkFNRSA9IFwiTWVudUl0ZW1JbmRpY2F0b3JcIjtcbnZhciBbSXRlbUluZGljYXRvclByb3ZpZGVyLCB1c2VJdGVtSW5kaWNhdG9yQ29udGV4dF0gPSBjcmVhdGVNZW51Q29udGV4dChcbiAgSVRFTV9JTkRJQ0FUT1JfTkFNRSxcbiAgeyBjaGVja2VkOiBmYWxzZSB9XG4pO1xudmFyIE1lbnVJdGVtSW5kaWNhdG9yID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVNZW51LCBmb3JjZU1vdW50LCAuLi5pdGVtSW5kaWNhdG9yUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGluZGljYXRvckNvbnRleHQgPSB1c2VJdGVtSW5kaWNhdG9yQ29udGV4dChJVEVNX0lORElDQVRPUl9OQU1FLCBfX3Njb3BlTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBQcmVzZW5jZSxcbiAgICAgIHtcbiAgICAgICAgcHJlc2VudDogZm9yY2VNb3VudCB8fCBpc0luZGV0ZXJtaW5hdGUoaW5kaWNhdG9yQ29udGV4dC5jaGVja2VkKSB8fCBpbmRpY2F0b3JDb250ZXh0LmNoZWNrZWQgPT09IHRydWUsXG4gICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgIFByaW1pdGl2ZS5zcGFuLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLml0ZW1JbmRpY2F0b3JQcm9wcyxcbiAgICAgICAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgICAgICAgXCJkYXRhLXN0YXRlXCI6IGdldENoZWNrZWRTdGF0ZShpbmRpY2F0b3JDb250ZXh0LmNoZWNrZWQpXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcbk1lbnVJdGVtSW5kaWNhdG9yLmRpc3BsYXlOYW1lID0gSVRFTV9JTkRJQ0FUT1JfTkFNRTtcbnZhciBTRVBBUkFUT1JfTkFNRSA9IFwiTWVudVNlcGFyYXRvclwiO1xudmFyIE1lbnVTZXBhcmF0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZU1lbnUsIC4uLnNlcGFyYXRvclByb3BzIH0gPSBwcm9wcztcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIFByaW1pdGl2ZS5kaXYsXG4gICAgICB7XG4gICAgICAgIHJvbGU6IFwic2VwYXJhdG9yXCIsXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIixcbiAgICAgICAgLi4uc2VwYXJhdG9yUHJvcHMsXG4gICAgICAgIHJlZjogZm9yd2FyZGVkUmVmXG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcbk1lbnVTZXBhcmF0b3IuZGlzcGxheU5hbWUgPSBTRVBBUkFUT1JfTkFNRTtcbnZhciBBUlJPV19OQU1FID0gXCJNZW51QXJyb3dcIjtcbnZhciBNZW51QXJyb3cgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZU1lbnUsIC4uLmFycm93UHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IHBvcHBlclNjb3BlID0gdXNlUG9wcGVyU2NvcGUoX19zY29wZU1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFBvcHBlclByaW1pdGl2ZS5BcnJvdywgeyAuLi5wb3BwZXJTY29wZSwgLi4uYXJyb3dQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH1cbik7XG5NZW51QXJyb3cuZGlzcGxheU5hbWUgPSBBUlJPV19OQU1FO1xudmFyIFNVQl9OQU1FID0gXCJNZW51U3ViXCI7XG52YXIgW01lbnVTdWJQcm92aWRlciwgdXNlTWVudVN1YkNvbnRleHRdID0gY3JlYXRlTWVudUNvbnRleHQoU1VCX05BTUUpO1xudmFyIE1lbnVTdWIgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlTWVudSwgY2hpbGRyZW4sIG9wZW4gPSBmYWxzZSwgb25PcGVuQ2hhbmdlIH0gPSBwcm9wcztcbiAgY29uc3QgcGFyZW50TWVudUNvbnRleHQgPSB1c2VNZW51Q29udGV4dChTVUJfTkFNRSwgX19zY29wZU1lbnUpO1xuICBjb25zdCBwb3BwZXJTY29wZSA9IHVzZVBvcHBlclNjb3BlKF9fc2NvcGVNZW51KTtcbiAgY29uc3QgW3RyaWdnZXIsIHNldFRyaWdnZXJdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtjb250ZW50LCBzZXRDb250ZW50XSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBoYW5kbGVPcGVuQ2hhbmdlID0gdXNlQ2FsbGJhY2tSZWYob25PcGVuQ2hhbmdlKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocGFyZW50TWVudUNvbnRleHQub3BlbiA9PT0gZmFsc2UpIGhhbmRsZU9wZW5DaGFuZ2UoZmFsc2UpO1xuICAgIHJldHVybiAoKSA9PiBoYW5kbGVPcGVuQ2hhbmdlKGZhbHNlKTtcbiAgfSwgW3BhcmVudE1lbnVDb250ZXh0Lm9wZW4sIGhhbmRsZU9wZW5DaGFuZ2VdKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUG9wcGVyUHJpbWl0aXZlLlJvb3QsIHsgLi4ucG9wcGVyU2NvcGUsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgIE1lbnVQcm92aWRlcixcbiAgICB7XG4gICAgICBzY29wZTogX19zY29wZU1lbnUsXG4gICAgICBvcGVuLFxuICAgICAgb25PcGVuQ2hhbmdlOiBoYW5kbGVPcGVuQ2hhbmdlLFxuICAgICAgY29udGVudCxcbiAgICAgIG9uQ29udGVudENoYW5nZTogc2V0Q29udGVudCxcbiAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICBNZW51U3ViUHJvdmlkZXIsXG4gICAgICAgIHtcbiAgICAgICAgICBzY29wZTogX19zY29wZU1lbnUsXG4gICAgICAgICAgY29udGVudElkOiB1c2VJZCgpLFxuICAgICAgICAgIHRyaWdnZXJJZDogdXNlSWQoKSxcbiAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgIG9uVHJpZ2dlckNoYW5nZTogc2V0VHJpZ2dlcixcbiAgICAgICAgICBjaGlsZHJlblxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICApIH0pO1xufTtcbk1lbnVTdWIuZGlzcGxheU5hbWUgPSBTVUJfTkFNRTtcbnZhciBTVUJfVFJJR0dFUl9OQU1FID0gXCJNZW51U3ViVHJpZ2dlclwiO1xudmFyIE1lbnVTdWJUcmlnZ2VyID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlTWVudUNvbnRleHQoU1VCX1RSSUdHRVJfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gdXNlTWVudVJvb3RDb250ZXh0KFNVQl9UUklHR0VSX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBzdWJDb250ZXh0ID0gdXNlTWVudVN1YkNvbnRleHQoU1VCX1RSSUdHRVJfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IGNvbnRlbnRDb250ZXh0ID0gdXNlTWVudUNvbnRlbnRDb250ZXh0KFNVQl9UUklHR0VSX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBvcGVuVGltZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgeyBwb2ludGVyR3JhY2VUaW1lclJlZiwgb25Qb2ludGVyR3JhY2VJbnRlbnRDaGFuZ2UgfSA9IGNvbnRlbnRDb250ZXh0O1xuICAgIGNvbnN0IHNjb3BlID0geyBfX3Njb3BlTWVudTogcHJvcHMuX19zY29wZU1lbnUgfTtcbiAgICBjb25zdCBjbGVhck9wZW5UaW1lciA9IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIGlmIChvcGVuVGltZXJSZWYuY3VycmVudCkgd2luZG93LmNsZWFyVGltZW91dChvcGVuVGltZXJSZWYuY3VycmVudCk7XG4gICAgICBvcGVuVGltZXJSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfSwgW10pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiBjbGVhck9wZW5UaW1lciwgW2NsZWFyT3BlblRpbWVyXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHBvaW50ZXJHcmFjZVRpbWVyID0gcG9pbnRlckdyYWNlVGltZXJSZWYuY3VycmVudDtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocG9pbnRlckdyYWNlVGltZXIpO1xuICAgICAgICBvblBvaW50ZXJHcmFjZUludGVudENoYW5nZShudWxsKTtcbiAgICAgIH07XG4gICAgfSwgW3BvaW50ZXJHcmFjZVRpbWVyUmVmLCBvblBvaW50ZXJHcmFjZUludGVudENoYW5nZV0pO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVBbmNob3IsIHsgYXNDaGlsZDogdHJ1ZSwgLi4uc2NvcGUsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudUl0ZW1JbXBsLFxuICAgICAge1xuICAgICAgICBpZDogc3ViQ29udGV4dC50cmlnZ2VySWQsXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiBcIm1lbnVcIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IGNvbnRleHQub3BlbixcbiAgICAgICAgXCJhcmlhLWNvbnRyb2xzXCI6IHN1YkNvbnRleHQuY29udGVudElkLFxuICAgICAgICBcImRhdGEtc3RhdGVcIjogZ2V0T3BlblN0YXRlKGNvbnRleHQub3BlbiksXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICByZWY6IGNvbXBvc2VSZWZzKGZvcndhcmRlZFJlZiwgc3ViQ29udGV4dC5vblRyaWdnZXJDaGFuZ2UpLFxuICAgICAgICBvbkNsaWNrOiAoZXZlbnQpID0+IHtcbiAgICAgICAgICBwcm9wcy5vbkNsaWNrPy4oZXZlbnQpO1xuICAgICAgICAgIGlmIChwcm9wcy5kaXNhYmxlZCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG4gICAgICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5mb2N1cygpO1xuICAgICAgICAgIGlmICghY29udGV4dC5vcGVuKSBjb250ZXh0Lm9uT3BlbkNoYW5nZSh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Qb2ludGVyTW92ZTogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgcHJvcHMub25Qb2ludGVyTW92ZSxcbiAgICAgICAgICB3aGVuTW91c2UoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb250ZW50Q29udGV4dC5vbkl0ZW1FbnRlcihldmVudCk7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFwcm9wcy5kaXNhYmxlZCAmJiAhY29udGV4dC5vcGVuICYmICFvcGVuVGltZXJSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICBjb250ZW50Q29udGV4dC5vblBvaW50ZXJHcmFjZUludGVudENoYW5nZShudWxsKTtcbiAgICAgICAgICAgICAgb3BlblRpbWVyUmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5vbk9wZW5DaGFuZ2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgY2xlYXJPcGVuVGltZXIoKTtcbiAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgICBvblBvaW50ZXJMZWF2ZTogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgcHJvcHMub25Qb2ludGVyTGVhdmUsXG4gICAgICAgICAgd2hlbk1vdXNlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJPcGVuVGltZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRSZWN0ID0gY29udGV4dC5jb250ZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGlmIChjb250ZW50UmVjdCkge1xuICAgICAgICAgICAgICBjb25zdCBzaWRlID0gY29udGV4dC5jb250ZW50Py5kYXRhc2V0LnNpZGU7XG4gICAgICAgICAgICAgIGNvbnN0IHJpZ2h0U2lkZSA9IHNpZGUgPT09IFwicmlnaHRcIjtcbiAgICAgICAgICAgICAgY29uc3QgYmxlZWQgPSByaWdodFNpZGUgPyAtNSA6IDU7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnROZWFyRWRnZSA9IGNvbnRlbnRSZWN0W3JpZ2h0U2lkZSA/IFwibGVmdFwiIDogXCJyaWdodFwiXTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGVudEZhckVkZ2UgPSBjb250ZW50UmVjdFtyaWdodFNpZGUgPyBcInJpZ2h0XCIgOiBcImxlZnRcIl07XG4gICAgICAgICAgICAgIGNvbnRlbnRDb250ZXh0Lm9uUG9pbnRlckdyYWNlSW50ZW50Q2hhbmdlKHtcbiAgICAgICAgICAgICAgICBhcmVhOiBbXG4gICAgICAgICAgICAgICAgICAvLyBBcHBseSBhIGJsZWVkIG9uIGNsaWVudFggdG8gZW5zdXJlIHRoYXQgb3VyIGV4aXQgcG9pbnQgaXNcbiAgICAgICAgICAgICAgICAgIC8vIGNvbnNpc3RlbnRseSB3aXRoaW4gcG9seWdvbiBib3VuZHNcbiAgICAgICAgICAgICAgICAgIHsgeDogZXZlbnQuY2xpZW50WCArIGJsZWVkLCB5OiBldmVudC5jbGllbnRZIH0sXG4gICAgICAgICAgICAgICAgICB7IHg6IGNvbnRlbnROZWFyRWRnZSwgeTogY29udGVudFJlY3QudG9wIH0sXG4gICAgICAgICAgICAgICAgICB7IHg6IGNvbnRlbnRGYXJFZGdlLCB5OiBjb250ZW50UmVjdC50b3AgfSxcbiAgICAgICAgICAgICAgICAgIHsgeDogY29udGVudEZhckVkZ2UsIHk6IGNvbnRlbnRSZWN0LmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgICAgeyB4OiBjb250ZW50TmVhckVkZ2UsIHk6IGNvbnRlbnRSZWN0LmJvdHRvbSB9XG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBzaWRlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHBvaW50ZXJHcmFjZVRpbWVyUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICBwb2ludGVyR3JhY2VUaW1lclJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgKCkgPT4gY29udGVudENvbnRleHQub25Qb2ludGVyR3JhY2VJbnRlbnRDaGFuZ2UobnVsbCksXG4gICAgICAgICAgICAgICAgMzAwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250ZW50Q29udGV4dC5vblRyaWdnZXJMZWF2ZShldmVudCk7XG4gICAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG4gICAgICAgICAgICAgIGNvbnRlbnRDb250ZXh0Lm9uUG9pbnRlckdyYWNlSW50ZW50Q2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIG9uS2V5RG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25LZXlEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBpc1R5cGluZ0FoZWFkID0gY29udGVudENvbnRleHQuc2VhcmNoUmVmLmN1cnJlbnQgIT09IFwiXCI7XG4gICAgICAgICAgaWYgKHByb3BzLmRpc2FibGVkIHx8IGlzVHlwaW5nQWhlYWQgJiYgZXZlbnQua2V5ID09PSBcIiBcIikgcmV0dXJuO1xuICAgICAgICAgIGlmIChTVUJfT1BFTl9LRVlTW3Jvb3RDb250ZXh0LmRpcl0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgICAgICAgY29udGV4dC5vbk9wZW5DaGFuZ2UodHJ1ZSk7XG4gICAgICAgICAgICBjb250ZXh0LmNvbnRlbnQ/LmZvY3VzKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICApIH0pO1xuICB9XG4pO1xuTWVudVN1YlRyaWdnZXIuZGlzcGxheU5hbWUgPSBTVUJfVFJJR0dFUl9OQU1FO1xudmFyIFNVQl9DT05URU5UX05BTUUgPSBcIk1lbnVTdWJDb250ZW50XCI7XG52YXIgTWVudVN1YkNvbnRlbnQgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHBvcnRhbENvbnRleHQgPSB1c2VQb3J0YWxDb250ZXh0KENPTlRFTlRfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHsgZm9yY2VNb3VudCA9IHBvcnRhbENvbnRleHQuZm9yY2VNb3VudCwgLi4uc3ViQ29udGVudFByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlTWVudUNvbnRleHQoQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3Qgcm9vdENvbnRleHQgPSB1c2VNZW51Um9vdENvbnRleHQoQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3Qgc3ViQ29udGV4dCA9IHVzZU1lbnVTdWJDb250ZXh0KFNVQl9DT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgcmVmKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb2xsZWN0aW9uLlByb3ZpZGVyLCB7IHNjb3BlOiBwcm9wcy5fX3Njb3BlTWVudSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goUHJlc2VuY2UsIHsgcHJlc2VudDogZm9yY2VNb3VudCB8fCBjb250ZXh0Lm9wZW4sIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KENvbGxlY3Rpb24uU2xvdCwgeyBzY29wZTogcHJvcHMuX19zY29wZU1lbnUsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudUNvbnRlbnRJbXBsLFxuICAgICAge1xuICAgICAgICBpZDogc3ViQ29udGV4dC5jb250ZW50SWQsXG4gICAgICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IHN1YkNvbnRleHQudHJpZ2dlcklkLFxuICAgICAgICAuLi5zdWJDb250ZW50UHJvcHMsXG4gICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICBhbGlnbjogXCJzdGFydFwiLFxuICAgICAgICBzaWRlOiByb290Q29udGV4dC5kaXIgPT09IFwicnRsXCIgPyBcImxlZnRcIiA6IFwicmlnaHRcIixcbiAgICAgICAgZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOiBmYWxzZSxcbiAgICAgICAgZGlzYWJsZU91dHNpZGVTY3JvbGw6IGZhbHNlLFxuICAgICAgICB0cmFwRm9jdXM6IGZhbHNlLFxuICAgICAgICBvbk9wZW5BdXRvRm9jdXM6IChldmVudCkgPT4ge1xuICAgICAgICAgIGlmIChyb290Q29udGV4dC5pc1VzaW5nS2V5Ym9hcmRSZWYuY3VycmVudCkgcmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DbG9zZUF1dG9Gb2N1czogKGV2ZW50KSA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpLFxuICAgICAgICBvbkZvY3VzT3V0c2lkZTogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Gb2N1c091dHNpZGUsIChldmVudCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC50YXJnZXQgIT09IHN1YkNvbnRleHQudHJpZ2dlcikgY29udGV4dC5vbk9wZW5DaGFuZ2UoZmFsc2UpO1xuICAgICAgICB9KSxcbiAgICAgICAgb25Fc2NhcGVLZXlEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkVzY2FwZUtleURvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgIHJvb3RDb250ZXh0Lm9uQ2xvc2UoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KSxcbiAgICAgICAgb25LZXlEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbktleURvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzS2V5RG93bkluc2lkZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgICBjb25zdCBpc0Nsb3NlS2V5ID0gU1VCX0NMT1NFX0tFWVNbcm9vdENvbnRleHQuZGlyXS5pbmNsdWRlcyhldmVudC5rZXkpO1xuICAgICAgICAgIGlmIChpc0tleURvd25JbnNpZGUgJiYgaXNDbG9zZUtleSkge1xuICAgICAgICAgICAgY29udGV4dC5vbk9wZW5DaGFuZ2UoZmFsc2UpO1xuICAgICAgICAgICAgc3ViQ29udGV4dC50cmlnZ2VyPy5mb2N1cygpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgKSB9KSB9KSB9KTtcbiAgfVxuKTtcbk1lbnVTdWJDb250ZW50LmRpc3BsYXlOYW1lID0gU1VCX0NPTlRFTlRfTkFNRTtcbmZ1bmN0aW9uIGdldE9wZW5TdGF0ZShvcGVuKSB7XG4gIHJldHVybiBvcGVuID8gXCJvcGVuXCIgOiBcImNsb3NlZFwiO1xufVxuZnVuY3Rpb24gaXNJbmRldGVybWluYXRlKGNoZWNrZWQpIHtcbiAgcmV0dXJuIGNoZWNrZWQgPT09IFwiaW5kZXRlcm1pbmF0ZVwiO1xufVxuZnVuY3Rpb24gZ2V0Q2hlY2tlZFN0YXRlKGNoZWNrZWQpIHtcbiAgcmV0dXJuIGlzSW5kZXRlcm1pbmF0ZShjaGVja2VkKSA/IFwiaW5kZXRlcm1pbmF0ZVwiIDogY2hlY2tlZCA/IFwiY2hlY2tlZFwiIDogXCJ1bmNoZWNrZWRcIjtcbn1cbmZ1bmN0aW9uIGZvY3VzRmlyc3QoY2FuZGlkYXRlcykge1xuICBjb25zdCBQUkVWSU9VU0xZX0ZPQ1VTRURfRUxFTUVOVCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAoY2FuZGlkYXRlID09PSBQUkVWSU9VU0xZX0ZPQ1VTRURfRUxFTUVOVCkgcmV0dXJuO1xuICAgIGNhbmRpZGF0ZS5mb2N1cygpO1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBQUkVWSU9VU0xZX0ZPQ1VTRURfRUxFTUVOVCkgcmV0dXJuO1xuICB9XG59XG5mdW5jdGlvbiB3cmFwQXJyYXkoYXJyYXksIHN0YXJ0SW5kZXgpIHtcbiAgcmV0dXJuIGFycmF5Lm1hcCgoXywgaW5kZXgpID0+IGFycmF5WyhzdGFydEluZGV4ICsgaW5kZXgpICUgYXJyYXkubGVuZ3RoXSk7XG59XG5mdW5jdGlvbiBnZXROZXh0TWF0Y2godmFsdWVzLCBzZWFyY2gsIGN1cnJlbnRNYXRjaCkge1xuICBjb25zdCBpc1JlcGVhdGVkID0gc2VhcmNoLmxlbmd0aCA+IDEgJiYgQXJyYXkuZnJvbShzZWFyY2gpLmV2ZXJ5KChjaGFyKSA9PiBjaGFyID09PSBzZWFyY2hbMF0pO1xuICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gaXNSZXBlYXRlZCA/IHNlYXJjaFswXSA6IHNlYXJjaDtcbiAgY29uc3QgY3VycmVudE1hdGNoSW5kZXggPSBjdXJyZW50TWF0Y2ggPyB2YWx1ZXMuaW5kZXhPZihjdXJyZW50TWF0Y2gpIDogLTE7XG4gIGxldCB3cmFwcGVkVmFsdWVzID0gd3JhcEFycmF5KHZhbHVlcywgTWF0aC5tYXgoY3VycmVudE1hdGNoSW5kZXgsIDApKTtcbiAgY29uc3QgZXhjbHVkZUN1cnJlbnRNYXRjaCA9IG5vcm1hbGl6ZWRTZWFyY2gubGVuZ3RoID09PSAxO1xuICBpZiAoZXhjbHVkZUN1cnJlbnRNYXRjaCkgd3JhcHBlZFZhbHVlcyA9IHdyYXBwZWRWYWx1ZXMuZmlsdGVyKCh2KSA9PiB2ICE9PSBjdXJyZW50TWF0Y2gpO1xuICBjb25zdCBuZXh0TWF0Y2ggPSB3cmFwcGVkVmFsdWVzLmZpbmQoXG4gICAgKHZhbHVlKSA9PiB2YWx1ZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobm9ybWFsaXplZFNlYXJjaC50b0xvd2VyQ2FzZSgpKVxuICApO1xuICByZXR1cm4gbmV4dE1hdGNoICE9PSBjdXJyZW50TWF0Y2ggPyBuZXh0TWF0Y2ggOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBpc1BvaW50SW5Qb2x5Z29uKHBvaW50LCBwb2x5Z29uKSB7XG4gIGNvbnN0IHsgeCwgeSB9ID0gcG9pbnQ7XG4gIGxldCBpbnNpZGUgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDAsIGogPSBwb2x5Z29uLmxlbmd0aCAtIDE7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaiA9IGkrKykge1xuICAgIGNvbnN0IHhpID0gcG9seWdvbltpXS54O1xuICAgIGNvbnN0IHlpID0gcG9seWdvbltpXS55O1xuICAgIGNvbnN0IHhqID0gcG9seWdvbltqXS54O1xuICAgIGNvbnN0IHlqID0gcG9seWdvbltqXS55O1xuICAgIGNvbnN0IGludGVyc2VjdCA9IHlpID4geSAhPT0geWogPiB5ICYmIHggPCAoeGogLSB4aSkgKiAoeSAtIHlpKSAvICh5aiAtIHlpKSArIHhpO1xuICAgIGlmIChpbnRlcnNlY3QpIGluc2lkZSA9ICFpbnNpZGU7XG4gIH1cbiAgcmV0dXJuIGluc2lkZTtcbn1cbmZ1bmN0aW9uIGlzUG9pbnRlckluR3JhY2VBcmVhKGV2ZW50LCBhcmVhKSB7XG4gIGlmICghYXJlYSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjdXJzb3JQb3MgPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfTtcbiAgcmV0dXJuIGlzUG9pbnRJblBvbHlnb24oY3Vyc29yUG9zLCBhcmVhKTtcbn1cbmZ1bmN0aW9uIHdoZW5Nb3VzZShoYW5kbGVyKSB7XG4gIHJldHVybiAoZXZlbnQpID0+IGV2ZW50LnBvaW50ZXJUeXBlID09PSBcIm1vdXNlXCIgPyBoYW5kbGVyKGV2ZW50KSA6IHZvaWQgMDtcbn1cbnZhciBSb290MyA9IE1lbnU7XG52YXIgQW5jaG9yMiA9IE1lbnVBbmNob3I7XG52YXIgUG9ydGFsID0gTWVudVBvcnRhbDtcbnZhciBDb250ZW50MiA9IE1lbnVDb250ZW50O1xudmFyIEdyb3VwID0gTWVudUdyb3VwO1xudmFyIExhYmVsID0gTWVudUxhYmVsO1xudmFyIEl0ZW0yID0gTWVudUl0ZW07XG52YXIgQ2hlY2tib3hJdGVtID0gTWVudUNoZWNrYm94SXRlbTtcbnZhciBSYWRpb0dyb3VwID0gTWVudVJhZGlvR3JvdXA7XG52YXIgUmFkaW9JdGVtID0gTWVudVJhZGlvSXRlbTtcbnZhciBJdGVtSW5kaWNhdG9yID0gTWVudUl0ZW1JbmRpY2F0b3I7XG52YXIgU2VwYXJhdG9yID0gTWVudVNlcGFyYXRvcjtcbnZhciBBcnJvdzIgPSBNZW51QXJyb3c7XG52YXIgU3ViID0gTWVudVN1YjtcbnZhciBTdWJUcmlnZ2VyID0gTWVudVN1YlRyaWdnZXI7XG52YXIgU3ViQ29udGVudCA9IE1lbnVTdWJDb250ZW50O1xuZXhwb3J0IHtcbiAgQW5jaG9yMiBhcyBBbmNob3IsXG4gIEFycm93MiBhcyBBcnJvdyxcbiAgQ2hlY2tib3hJdGVtLFxuICBDb250ZW50MiBhcyBDb250ZW50LFxuICBHcm91cCxcbiAgSXRlbTIgYXMgSXRlbSxcbiAgSXRlbUluZGljYXRvcixcbiAgTGFiZWwsXG4gIE1lbnUsXG4gIE1lbnVBbmNob3IsXG4gIE1lbnVBcnJvdyxcbiAgTWVudUNoZWNrYm94SXRlbSxcbiAgTWVudUNvbnRlbnQsXG4gIE1lbnVHcm91cCxcbiAgTWVudUl0ZW0sXG4gIE1lbnVJdGVtSW5kaWNhdG9yLFxuICBNZW51TGFiZWwsXG4gIE1lbnVQb3J0YWwsXG4gIE1lbnVSYWRpb0dyb3VwLFxuICBNZW51UmFkaW9JdGVtLFxuICBNZW51U2VwYXJhdG9yLFxuICBNZW51U3ViLFxuICBNZW51U3ViQ29udGVudCxcbiAgTWVudVN1YlRyaWdnZXIsXG4gIFBvcnRhbCxcbiAgUmFkaW9Hcm91cCxcbiAgUmFkaW9JdGVtLFxuICBSb290MyBhcyBSb290LFxuICBTZXBhcmF0b3IsXG4gIFN1YixcbiAgU3ViQ29udGVudCxcbiAgU3ViVHJpZ2dlcixcbiAgY3JlYXRlTWVudVNjb3BlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L3BvcHBlci9zcmMvUG9wcGVyLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICB1c2VGbG9hdGluZyxcbiAgYXV0b1VwZGF0ZSxcbiAgb2Zmc2V0LFxuICBzaGlmdCxcbiAgbGltaXRTaGlmdCxcbiAgaGlkZSxcbiAgYXJyb3cgYXMgZmxvYXRpbmdVSWFycm93LFxuICBmbGlwLFxuICBzaXplXG59IGZyb20gXCJAZmxvYXRpbmctdWkvcmVhY3QtZG9tXCI7XG5pbXBvcnQgKiBhcyBBcnJvd1ByaW1pdGl2ZSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWFycm93XCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dFNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZVwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWZcIjtcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3RcIjtcbmltcG9ydCB7IHVzZVNpemUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1zaXplXCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBTSURFX09QVElPTlMgPSBbXCJ0b3BcIiwgXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIl07XG52YXIgQUxJR05fT1BUSU9OUyA9IFtcInN0YXJ0XCIsIFwiY2VudGVyXCIsIFwiZW5kXCJdO1xudmFyIFBPUFBFUl9OQU1FID0gXCJQb3BwZXJcIjtcbnZhciBbY3JlYXRlUG9wcGVyQ29udGV4dCwgY3JlYXRlUG9wcGVyU2NvcGVdID0gY3JlYXRlQ29udGV4dFNjb3BlKFBPUFBFUl9OQU1FKTtcbnZhciBbUG9wcGVyUHJvdmlkZXIsIHVzZVBvcHBlckNvbnRleHRdID0gY3JlYXRlUG9wcGVyQ29udGV4dChQT1BQRVJfTkFNRSk7XG52YXIgUG9wcGVyID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZVBvcHBlciwgY2hpbGRyZW4gfSA9IHByb3BzO1xuICBjb25zdCBbYW5jaG9yLCBzZXRBbmNob3JdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFBvcHBlclByb3ZpZGVyLCB7IHNjb3BlOiBfX3Njb3BlUG9wcGVyLCBhbmNob3IsIG9uQW5jaG9yQ2hhbmdlOiBzZXRBbmNob3IsIGNoaWxkcmVuIH0pO1xufTtcblBvcHBlci5kaXNwbGF5TmFtZSA9IFBPUFBFUl9OQU1FO1xudmFyIEFOQ0hPUl9OQU1FID0gXCJQb3BwZXJBbmNob3JcIjtcbnZhciBQb3BwZXJBbmNob3IgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZVBvcHBlciwgdmlydHVhbFJlZiwgLi4uYW5jaG9yUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VQb3BwZXJDb250ZXh0KEFOQ0hPUl9OQU1FLCBfX3Njb3BlUG9wcGVyKTtcbiAgICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgcmVmKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgY29udGV4dC5vbkFuY2hvckNoYW5nZSh2aXJ0dWFsUmVmPy5jdXJyZW50IHx8IHJlZi5jdXJyZW50KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmlydHVhbFJlZiA/IG51bGwgOiAvKiBAX19QVVJFX18gKi8ganN4KFByaW1pdGl2ZS5kaXYsIHsgLi4uYW5jaG9yUHJvcHMsIHJlZjogY29tcG9zZWRSZWZzIH0pO1xuICB9XG4pO1xuUG9wcGVyQW5jaG9yLmRpc3BsYXlOYW1lID0gQU5DSE9SX05BTUU7XG52YXIgQ09OVEVOVF9OQU1FID0gXCJQb3BwZXJDb250ZW50XCI7XG52YXIgW1BvcHBlckNvbnRlbnRQcm92aWRlciwgdXNlQ29udGVudENvbnRleHRdID0gY3JlYXRlUG9wcGVyQ29udGV4dChDT05URU5UX05BTUUpO1xudmFyIFBvcHBlckNvbnRlbnQgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIF9fc2NvcGVQb3BwZXIsXG4gICAgICBzaWRlID0gXCJib3R0b21cIixcbiAgICAgIHNpZGVPZmZzZXQgPSAwLFxuICAgICAgYWxpZ24gPSBcImNlbnRlclwiLFxuICAgICAgYWxpZ25PZmZzZXQgPSAwLFxuICAgICAgYXJyb3dQYWRkaW5nID0gMCxcbiAgICAgIGF2b2lkQ29sbGlzaW9ucyA9IHRydWUsXG4gICAgICBjb2xsaXNpb25Cb3VuZGFyeSA9IFtdLFxuICAgICAgY29sbGlzaW9uUGFkZGluZzogY29sbGlzaW9uUGFkZGluZ1Byb3AgPSAwLFxuICAgICAgc3RpY2t5ID0gXCJwYXJ0aWFsXCIsXG4gICAgICBoaWRlV2hlbkRldGFjaGVkID0gZmFsc2UsXG4gICAgICB1cGRhdGVQb3NpdGlvblN0cmF0ZWd5ID0gXCJvcHRpbWl6ZWRcIixcbiAgICAgIG9uUGxhY2VkLFxuICAgICAgLi4uY29udGVudFByb3BzXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VQb3BwZXJDb250ZXh0KENPTlRFTlRfTkFNRSwgX19zY29wZVBvcHBlcik7XG4gICAgY29uc3QgW2NvbnRlbnQsIHNldENvbnRlbnRdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gICAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgKG5vZGUpID0+IHNldENvbnRlbnQobm9kZSkpO1xuICAgIGNvbnN0IFthcnJvdywgc2V0QXJyb3ddID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gICAgY29uc3QgYXJyb3dTaXplID0gdXNlU2l6ZShhcnJvdyk7XG4gICAgY29uc3QgYXJyb3dXaWR0aCA9IGFycm93U2l6ZT8ud2lkdGggPz8gMDtcbiAgICBjb25zdCBhcnJvd0hlaWdodCA9IGFycm93U2l6ZT8uaGVpZ2h0ID8/IDA7XG4gICAgY29uc3QgZGVzaXJlZFBsYWNlbWVudCA9IHNpZGUgKyAoYWxpZ24gIT09IFwiY2VudGVyXCIgPyBcIi1cIiArIGFsaWduIDogXCJcIik7XG4gICAgY29uc3QgY29sbGlzaW9uUGFkZGluZyA9IHR5cGVvZiBjb2xsaXNpb25QYWRkaW5nUHJvcCA9PT0gXCJudW1iZXJcIiA/IGNvbGxpc2lvblBhZGRpbmdQcm9wIDogeyB0b3A6IDAsIHJpZ2h0OiAwLCBib3R0b206IDAsIGxlZnQ6IDAsIC4uLmNvbGxpc2lvblBhZGRpbmdQcm9wIH07XG4gICAgY29uc3QgYm91bmRhcnkgPSBBcnJheS5pc0FycmF5KGNvbGxpc2lvbkJvdW5kYXJ5KSA/IGNvbGxpc2lvbkJvdW5kYXJ5IDogW2NvbGxpc2lvbkJvdW5kYXJ5XTtcbiAgICBjb25zdCBoYXNFeHBsaWNpdEJvdW5kYXJpZXMgPSBib3VuZGFyeS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGRldGVjdE92ZXJmbG93T3B0aW9ucyA9IHtcbiAgICAgIHBhZGRpbmc6IGNvbGxpc2lvblBhZGRpbmcsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnkuZmlsdGVyKGlzTm90TnVsbCksXG4gICAgICAvLyB3aXRoIGBzdHJhdGVneTogJ2ZpeGVkJ2AsIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIGdldCBpdCB0byByZXNwZWN0IGJvdW5kYXJpZXNcbiAgICAgIGFsdEJvdW5kYXJ5OiBoYXNFeHBsaWNpdEJvdW5kYXJpZXNcbiAgICB9O1xuICAgIGNvbnN0IHsgcmVmcywgZmxvYXRpbmdTdHlsZXMsIHBsYWNlbWVudCwgaXNQb3NpdGlvbmVkLCBtaWRkbGV3YXJlRGF0YSB9ID0gdXNlRmxvYXRpbmcoe1xuICAgICAgLy8gZGVmYXVsdCB0byBgZml4ZWRgIHN0cmF0ZWd5IHNvIHVzZXJzIGRvbid0IGhhdmUgdG8gcGljayBhbmQgd2UgYWxzbyBhdm9pZCBmb2N1cyBzY3JvbGwgaXNzdWVzXG4gICAgICBzdHJhdGVneTogXCJmaXhlZFwiLFxuICAgICAgcGxhY2VtZW50OiBkZXNpcmVkUGxhY2VtZW50LFxuICAgICAgd2hpbGVFbGVtZW50c01vdW50ZWQ6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSBhdXRvVXBkYXRlKC4uLmFyZ3MsIHtcbiAgICAgICAgICBhbmltYXRpb25GcmFtZTogdXBkYXRlUG9zaXRpb25TdHJhdGVneSA9PT0gXCJhbHdheXNcIlxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsZWFudXA7XG4gICAgICB9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiBjb250ZXh0LmFuY2hvclxuICAgICAgfSxcbiAgICAgIG1pZGRsZXdhcmU6IFtcbiAgICAgICAgb2Zmc2V0KHsgbWFpbkF4aXM6IHNpZGVPZmZzZXQgKyBhcnJvd0hlaWdodCwgYWxpZ25tZW50QXhpczogYWxpZ25PZmZzZXQgfSksXG4gICAgICAgIGF2b2lkQ29sbGlzaW9ucyAmJiBzaGlmdCh7XG4gICAgICAgICAgbWFpbkF4aXM6IHRydWUsXG4gICAgICAgICAgY3Jvc3NBeGlzOiBmYWxzZSxcbiAgICAgICAgICBsaW1pdGVyOiBzdGlja3kgPT09IFwicGFydGlhbFwiID8gbGltaXRTaGlmdCgpIDogdm9pZCAwLFxuICAgICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICAgICAgICB9KSxcbiAgICAgICAgYXZvaWRDb2xsaXNpb25zICYmIGZsaXAoeyAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnMgfSksXG4gICAgICAgIHNpemUoe1xuICAgICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyxcbiAgICAgICAgICBhcHBseTogKHsgZWxlbWVudHMsIHJlY3RzLCBhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0IH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgd2lkdGg6IGFuY2hvcldpZHRoLCBoZWlnaHQ6IGFuY2hvckhlaWdodCB9ID0gcmVjdHMucmVmZXJlbmNlO1xuICAgICAgICAgICAgY29uc3QgY29udGVudFN0eWxlID0gZWxlbWVudHMuZmxvYXRpbmcuc3R5bGU7XG4gICAgICAgICAgICBjb250ZW50U3R5bGUuc2V0UHJvcGVydHkoXCItLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtd2lkdGhcIiwgYCR7YXZhaWxhYmxlV2lkdGh9cHhgKTtcbiAgICAgICAgICAgIGNvbnRlbnRTdHlsZS5zZXRQcm9wZXJ0eShcIi0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS1oZWlnaHRcIiwgYCR7YXZhaWxhYmxlSGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICBjb250ZW50U3R5bGUuc2V0UHJvcGVydHkoXCItLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGhcIiwgYCR7YW5jaG9yV2lkdGh9cHhgKTtcbiAgICAgICAgICAgIGNvbnRlbnRTdHlsZS5zZXRQcm9wZXJ0eShcIi0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHRcIiwgYCR7YW5jaG9ySGVpZ2h0fXB4YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgYXJyb3cgJiYgZmxvYXRpbmdVSWFycm93KHsgZWxlbWVudDogYXJyb3csIHBhZGRpbmc6IGFycm93UGFkZGluZyB9KSxcbiAgICAgICAgdHJhbnNmb3JtT3JpZ2luKHsgYXJyb3dXaWR0aCwgYXJyb3dIZWlnaHQgfSksXG4gICAgICAgIGhpZGVXaGVuRGV0YWNoZWQgJiYgaGlkZSh7IHN0cmF0ZWd5OiBcInJlZmVyZW5jZUhpZGRlblwiLCAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnMgfSlcbiAgICAgIF1cbiAgICB9KTtcbiAgICBjb25zdCBbcGxhY2VkU2lkZSwgcGxhY2VkQWxpZ25dID0gZ2V0U2lkZUFuZEFsaWduRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICAgIGNvbnN0IGhhbmRsZVBsYWNlZCA9IHVzZUNhbGxiYWNrUmVmKG9uUGxhY2VkKTtcbiAgICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKGlzUG9zaXRpb25lZCkge1xuICAgICAgICBoYW5kbGVQbGFjZWQ/LigpO1xuICAgICAgfVxuICAgIH0sIFtpc1Bvc2l0aW9uZWQsIGhhbmRsZVBsYWNlZF0pO1xuICAgIGNvbnN0IGFycm93WCA9IG1pZGRsZXdhcmVEYXRhLmFycm93Py54O1xuICAgIGNvbnN0IGFycm93WSA9IG1pZGRsZXdhcmVEYXRhLmFycm93Py55O1xuICAgIGNvbnN0IGNhbm5vdENlbnRlckFycm93ID0gbWlkZGxld2FyZURhdGEuYXJyb3c/LmNlbnRlck9mZnNldCAhPT0gMDtcbiAgICBjb25zdCBbY29udGVudFpJbmRleCwgc2V0Q29udGVudFpJbmRleF0gPSBSZWFjdC51c2VTdGF0ZSgpO1xuICAgIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoY29udGVudCkgc2V0Q29udGVudFpJbmRleCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjb250ZW50KS56SW5kZXgpO1xuICAgIH0sIFtjb250ZW50XSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBcImRpdlwiLFxuICAgICAge1xuICAgICAgICByZWY6IHJlZnMuc2V0RmxvYXRpbmcsXG4gICAgICAgIFwiZGF0YS1yYWRpeC1wb3BwZXItY29udGVudC13cmFwcGVyXCI6IFwiXCIsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgLi4uZmxvYXRpbmdTdHlsZXMsXG4gICAgICAgICAgdHJhbnNmb3JtOiBpc1Bvc2l0aW9uZWQgPyBmbG9hdGluZ1N0eWxlcy50cmFuc2Zvcm0gOiBcInRyYW5zbGF0ZSgwLCAtMjAwJSlcIixcbiAgICAgICAgICAvLyBrZWVwIG9mZiB0aGUgcGFnZSB3aGVuIG1lYXN1cmluZ1xuICAgICAgICAgIG1pbldpZHRoOiBcIm1heC1jb250ZW50XCIsXG4gICAgICAgICAgekluZGV4OiBjb250ZW50WkluZGV4LFxuICAgICAgICAgIFtcIi0tcmFkaXgtcG9wcGVyLXRyYW5zZm9ybS1vcmlnaW5cIl06IFtcbiAgICAgICAgICAgIG1pZGRsZXdhcmVEYXRhLnRyYW5zZm9ybU9yaWdpbj8ueCxcbiAgICAgICAgICAgIG1pZGRsZXdhcmVEYXRhLnRyYW5zZm9ybU9yaWdpbj8ueVxuICAgICAgICAgIF0uam9pbihcIiBcIiksXG4gICAgICAgICAgLy8gaGlkZSB0aGUgY29udGVudCBpZiB1c2luZyB0aGUgaGlkZSBtaWRkbGV3YXJlIGFuZCBzaG91bGQgYmUgaGlkZGVuXG4gICAgICAgICAgLy8gc2V0IHZpc2liaWxpdHkgdG8gaGlkZGVuIGFuZCBkaXNhYmxlIHBvaW50ZXIgZXZlbnRzIHNvIHRoZSBVSSBiZWhhdmVzXG4gICAgICAgICAgLy8gYXMgaWYgdGhlIFBvcHBlckNvbnRlbnQgaXNuJ3QgdGhlcmUgYXQgYWxsXG4gICAgICAgICAgLi4ubWlkZGxld2FyZURhdGEuaGlkZT8ucmVmZXJlbmNlSGlkZGVuICYmIHtcbiAgICAgICAgICAgIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsXG4gICAgICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGlyOiBwcm9wcy5kaXIsXG4gICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgIFBvcHBlckNvbnRlbnRQcm92aWRlcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY29wZTogX19zY29wZVBvcHBlcixcbiAgICAgICAgICAgIHBsYWNlZFNpZGUsXG4gICAgICAgICAgICBvbkFycm93Q2hhbmdlOiBzZXRBcnJvdyxcbiAgICAgICAgICAgIGFycm93WCxcbiAgICAgICAgICAgIGFycm93WSxcbiAgICAgICAgICAgIHNob3VsZEhpZGVBcnJvdzogY2Fubm90Q2VudGVyQXJyb3csXG4gICAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICAgICAgUHJpbWl0aXZlLmRpdixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwiZGF0YS1zaWRlXCI6IHBsYWNlZFNpZGUsXG4gICAgICAgICAgICAgICAgXCJkYXRhLWFsaWduXCI6IHBsYWNlZEFsaWduLFxuICAgICAgICAgICAgICAgIC4uLmNvbnRlbnRQcm9wcyxcbiAgICAgICAgICAgICAgICByZWY6IGNvbXBvc2VkUmVmcyxcbiAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgLi4uY29udGVudFByb3BzLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIFBvcHBlckNvbnRlbnQgaGFzbid0IGJlZW4gcGxhY2VkIHlldCAobm90IGFsbCBtZWFzdXJlbWVudHMgZG9uZSlcbiAgICAgICAgICAgICAgICAgIC8vIHdlIHByZXZlbnQgYW5pbWF0aW9ucyBzbyB0aGF0IHVzZXJzJ3MgYW5pbWF0aW9uIGRvbid0IGtpY2sgaW4gdG9vIGVhcmx5IHJlZmVycmluZyB3cm9uZyBzaWRlc1xuICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiAhaXNQb3NpdGlvbmVkID8gXCJub25lXCIgOiB2b2lkIDBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xuUG9wcGVyQ29udGVudC5kaXNwbGF5TmFtZSA9IENPTlRFTlRfTkFNRTtcbnZhciBBUlJPV19OQU1FID0gXCJQb3BwZXJBcnJvd1wiO1xudmFyIE9QUE9TSVRFX1NJREUgPSB7XG4gIHRvcDogXCJib3R0b21cIixcbiAgcmlnaHQ6IFwibGVmdFwiLFxuICBib3R0b206IFwidG9wXCIsXG4gIGxlZnQ6IFwicmlnaHRcIlxufTtcbnZhciBQb3BwZXJBcnJvdyA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gUG9wcGVyQXJyb3cyKHByb3BzLCBmb3J3YXJkZWRSZWYpIHtcbiAgY29uc3QgeyBfX3Njb3BlUG9wcGVyLCAuLi5hcnJvd1Byb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgY29udGVudENvbnRleHQgPSB1c2VDb250ZW50Q29udGV4dChBUlJPV19OQU1FLCBfX3Njb3BlUG9wcGVyKTtcbiAgY29uc3QgYmFzZVNpZGUgPSBPUFBPU0lURV9TSURFW2NvbnRlbnRDb250ZXh0LnBsYWNlZFNpZGVdO1xuICByZXR1cm4gKFxuICAgIC8vIHdlIGhhdmUgdG8gdXNlIGFuIGV4dHJhIHdyYXBwZXIgYmVjYXVzZSBgUmVzaXplT2JzZXJ2ZXJgICh1c2VkIGJ5IGB1c2VTaXplYClcbiAgICAvLyBkb2Vzbid0IHJlcG9ydCBzaXplIGFzIHdlJ2QgZXhwZWN0IG9uIFNWRyBlbGVtZW50cy5cbiAgICAvLyBpdCByZXBvcnRzIHRoZWlyIGJvdW5kaW5nIGJveCB3aGljaCBpcyBlZmZlY3RpdmVseSB0aGUgbGFyZ2VzdCBwYXRoIGluc2lkZSB0aGUgU1ZHLlxuICAgIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBcInNwYW5cIixcbiAgICAgIHtcbiAgICAgICAgcmVmOiBjb250ZW50Q29udGV4dC5vbkFycm93Q2hhbmdlLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgbGVmdDogY29udGVudENvbnRleHQuYXJyb3dYLFxuICAgICAgICAgIHRvcDogY29udGVudENvbnRleHQuYXJyb3dZLFxuICAgICAgICAgIFtiYXNlU2lkZV06IDAsXG4gICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiB7XG4gICAgICAgICAgICB0b3A6IFwiXCIsXG4gICAgICAgICAgICByaWdodDogXCIwIDBcIixcbiAgICAgICAgICAgIGJvdHRvbTogXCJjZW50ZXIgMFwiLFxuICAgICAgICAgICAgbGVmdDogXCIxMDAlIDBcIlxuICAgICAgICAgIH1bY29udGVudENvbnRleHQucGxhY2VkU2lkZV0sXG4gICAgICAgICAgdHJhbnNmb3JtOiB7XG4gICAgICAgICAgICB0b3A6IFwidHJhbnNsYXRlWSgxMDAlKVwiLFxuICAgICAgICAgICAgcmlnaHQ6IFwidHJhbnNsYXRlWSg1MCUpIHJvdGF0ZSg5MGRlZykgdHJhbnNsYXRlWCgtNTAlKVwiLFxuICAgICAgICAgICAgYm90dG9tOiBgcm90YXRlKDE4MGRlZylgLFxuICAgICAgICAgICAgbGVmdDogXCJ0cmFuc2xhdGVZKDUwJSkgcm90YXRlKC05MGRlZykgdHJhbnNsYXRlWCg1MCUpXCJcbiAgICAgICAgICB9W2NvbnRlbnRDb250ZXh0LnBsYWNlZFNpZGVdLFxuICAgICAgICAgIHZpc2liaWxpdHk6IGNvbnRlbnRDb250ZXh0LnNob3VsZEhpZGVBcnJvdyA/IFwiaGlkZGVuXCIgOiB2b2lkIDBcbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgQXJyb3dQcmltaXRpdmUuUm9vdCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5hcnJvd1Byb3BzLFxuICAgICAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAuLi5hcnJvd1Byb3BzLnN0eWxlLFxuICAgICAgICAgICAgICAvLyBlbnN1cmVzIHRoZSBlbGVtZW50IGNhbiBiZSBtZWFzdXJlZCBjb3JyZWN0bHkgKG1vc3RseSBmb3IgaWYgU1ZHKVxuICAgICAgICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICApXG4gICk7XG59KTtcblBvcHBlckFycm93LmRpc3BsYXlOYW1lID0gQVJST1dfTkFNRTtcbmZ1bmN0aW9uIGlzTm90TnVsbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGw7XG59XG52YXIgdHJhbnNmb3JtT3JpZ2luID0gKG9wdGlvbnMpID0+ICh7XG4gIG5hbWU6IFwidHJhbnNmb3JtT3JpZ2luXCIsXG4gIG9wdGlvbnMsXG4gIGZuKGRhdGEpIHtcbiAgICBjb25zdCB7IHBsYWNlbWVudCwgcmVjdHMsIG1pZGRsZXdhcmVEYXRhIH0gPSBkYXRhO1xuICAgIGNvbnN0IGNhbm5vdENlbnRlckFycm93ID0gbWlkZGxld2FyZURhdGEuYXJyb3c/LmNlbnRlck9mZnNldCAhPT0gMDtcbiAgICBjb25zdCBpc0Fycm93SGlkZGVuID0gY2Fubm90Q2VudGVyQXJyb3c7XG4gICAgY29uc3QgYXJyb3dXaWR0aCA9IGlzQXJyb3dIaWRkZW4gPyAwIDogb3B0aW9ucy5hcnJvd1dpZHRoO1xuICAgIGNvbnN0IGFycm93SGVpZ2h0ID0gaXNBcnJvd0hpZGRlbiA/IDAgOiBvcHRpb25zLmFycm93SGVpZ2h0O1xuICAgIGNvbnN0IFtwbGFjZWRTaWRlLCBwbGFjZWRBbGlnbl0gPSBnZXRTaWRlQW5kQWxpZ25Gcm9tUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gICAgY29uc3Qgbm9BcnJvd0FsaWduID0geyBzdGFydDogXCIwJVwiLCBjZW50ZXI6IFwiNTAlXCIsIGVuZDogXCIxMDAlXCIgfVtwbGFjZWRBbGlnbl07XG4gICAgY29uc3QgYXJyb3dYQ2VudGVyID0gKG1pZGRsZXdhcmVEYXRhLmFycm93Py54ID8/IDApICsgYXJyb3dXaWR0aCAvIDI7XG4gICAgY29uc3QgYXJyb3dZQ2VudGVyID0gKG1pZGRsZXdhcmVEYXRhLmFycm93Py55ID8/IDApICsgYXJyb3dIZWlnaHQgLyAyO1xuICAgIGxldCB4ID0gXCJcIjtcbiAgICBsZXQgeSA9IFwiXCI7XG4gICAgaWYgKHBsYWNlZFNpZGUgPT09IFwiYm90dG9tXCIpIHtcbiAgICAgIHggPSBpc0Fycm93SGlkZGVuID8gbm9BcnJvd0FsaWduIDogYCR7YXJyb3dYQ2VudGVyfXB4YDtcbiAgICAgIHkgPSBgJHstYXJyb3dIZWlnaHR9cHhgO1xuICAgIH0gZWxzZSBpZiAocGxhY2VkU2lkZSA9PT0gXCJ0b3BcIikge1xuICAgICAgeCA9IGlzQXJyb3dIaWRkZW4gPyBub0Fycm93QWxpZ24gOiBgJHthcnJvd1hDZW50ZXJ9cHhgO1xuICAgICAgeSA9IGAke3JlY3RzLmZsb2F0aW5nLmhlaWdodCArIGFycm93SGVpZ2h0fXB4YDtcbiAgICB9IGVsc2UgaWYgKHBsYWNlZFNpZGUgPT09IFwicmlnaHRcIikge1xuICAgICAgeCA9IGAkey1hcnJvd0hlaWdodH1weGA7XG4gICAgICB5ID0gaXNBcnJvd0hpZGRlbiA/IG5vQXJyb3dBbGlnbiA6IGAke2Fycm93WUNlbnRlcn1weGA7XG4gICAgfSBlbHNlIGlmIChwbGFjZWRTaWRlID09PSBcImxlZnRcIikge1xuICAgICAgeCA9IGAke3JlY3RzLmZsb2F0aW5nLndpZHRoICsgYXJyb3dIZWlnaHR9cHhgO1xuICAgICAgeSA9IGlzQXJyb3dIaWRkZW4gPyBub0Fycm93QWxpZ24gOiBgJHthcnJvd1lDZW50ZXJ9cHhgO1xuICAgIH1cbiAgICByZXR1cm4geyBkYXRhOiB7IHgsIHkgfSB9O1xuICB9XG59KTtcbmZ1bmN0aW9uIGdldFNpZGVBbmRBbGlnbkZyb21QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIGNvbnN0IFtzaWRlLCBhbGlnbiA9IFwiY2VudGVyXCJdID0gcGxhY2VtZW50LnNwbGl0KFwiLVwiKTtcbiAgcmV0dXJuIFtzaWRlLCBhbGlnbl07XG59XG52YXIgUm9vdDIgPSBQb3BwZXI7XG52YXIgQW5jaG9yID0gUG9wcGVyQW5jaG9yO1xudmFyIENvbnRlbnQgPSBQb3BwZXJDb250ZW50O1xudmFyIEFycm93ID0gUG9wcGVyQXJyb3c7XG5leHBvcnQge1xuICBBTElHTl9PUFRJT05TLFxuICBBbmNob3IsXG4gIEFycm93LFxuICBDb250ZW50LFxuICBQb3BwZXIsXG4gIFBvcHBlckFuY2hvcixcbiAgUG9wcGVyQXJyb3csXG4gIFBvcHBlckNvbnRlbnQsXG4gIFJvb3QyIGFzIFJvb3QsXG4gIFNJREVfT1BUSU9OUyxcbiAgY3JlYXRlUG9wcGVyU2NvcGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvcG9ydGFsL3NyYy9Qb3J0YWwudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZVwiO1xuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtbGF5b3V0LWVmZmVjdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgUE9SVEFMX05BTUUgPSBcIlBvcnRhbFwiO1xudmFyIFBvcnRhbCA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBjb250YWluZXI6IGNvbnRhaW5lclByb3AsIC4uLnBvcnRhbFByb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgW21vdW50ZWQsIHNldE1vdW50ZWRdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4gc2V0TW91bnRlZCh0cnVlKSwgW10pO1xuICBjb25zdCBjb250YWluZXIgPSBjb250YWluZXJQcm9wIHx8IG1vdW50ZWQgJiYgZ2xvYmFsVGhpcz8uZG9jdW1lbnQ/LmJvZHk7XG4gIHJldHVybiBjb250YWluZXIgPyBSZWFjdERPTS5jcmVhdGVQb3J0YWwoLyogQF9fUFVSRV9fICovIGpzeChQcmltaXRpdmUuZGl2LCB7IC4uLnBvcnRhbFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KSwgY29udGFpbmVyKSA6IG51bGw7XG59KTtcblBvcnRhbC5kaXNwbGF5TmFtZSA9IFBPUlRBTF9OQU1FO1xudmFyIFJvb3QgPSBQb3J0YWw7XG5leHBvcnQge1xuICBQb3J0YWwsXG4gIFJvb3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvcHJlc2VuY2Uvc3JjL1ByZXNlbmNlLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QyIGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZWRSZWZzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnNcIjtcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3RcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvcHJlc2VuY2Uvc3JjL3VzZVN0YXRlTWFjaGluZS50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gdXNlU3RhdGVNYWNoaW5lKGluaXRpYWxTdGF0ZSwgbWFjaGluZSkge1xuICByZXR1cm4gUmVhY3QudXNlUmVkdWNlcigoc3RhdGUsIGV2ZW50KSA9PiB7XG4gICAgY29uc3QgbmV4dFN0YXRlID0gbWFjaGluZVtzdGF0ZV1bZXZlbnRdO1xuICAgIHJldHVybiBuZXh0U3RhdGUgPz8gc3RhdGU7XG4gIH0sIGluaXRpYWxTdGF0ZSk7XG59XG5cbi8vIHBhY2thZ2VzL3JlYWN0L3ByZXNlbmNlL3NyYy9QcmVzZW5jZS50c3hcbnZhciBQcmVzZW5jZSA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHByZXNlbnQsIGNoaWxkcmVuIH0gPSBwcm9wcztcbiAgY29uc3QgcHJlc2VuY2UgPSB1c2VQcmVzZW5jZShwcmVzZW50KTtcbiAgY29uc3QgY2hpbGQgPSB0eXBlb2YgY2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIiA/IGNoaWxkcmVuKHsgcHJlc2VudDogcHJlc2VuY2UuaXNQcmVzZW50IH0pIDogUmVhY3QyLkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICBjb25zdCByZWYgPSB1c2VDb21wb3NlZFJlZnMocHJlc2VuY2UucmVmLCBnZXRFbGVtZW50UmVmKGNoaWxkKSk7XG4gIGNvbnN0IGZvcmNlTW91bnQgPSB0eXBlb2YgY2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIjtcbiAgcmV0dXJuIGZvcmNlTW91bnQgfHwgcHJlc2VuY2UuaXNQcmVzZW50ID8gUmVhY3QyLmNsb25lRWxlbWVudChjaGlsZCwgeyByZWYgfSkgOiBudWxsO1xufTtcblByZXNlbmNlLmRpc3BsYXlOYW1lID0gXCJQcmVzZW5jZVwiO1xuZnVuY3Rpb24gdXNlUHJlc2VuY2UocHJlc2VudCkge1xuICBjb25zdCBbbm9kZSwgc2V0Tm9kZV0gPSBSZWFjdDIudXNlU3RhdGUoKTtcbiAgY29uc3Qgc3R5bGVzUmVmID0gUmVhY3QyLnVzZVJlZih7fSk7XG4gIGNvbnN0IHByZXZQcmVzZW50UmVmID0gUmVhY3QyLnVzZVJlZihwcmVzZW50KTtcbiAgY29uc3QgcHJldkFuaW1hdGlvbk5hbWVSZWYgPSBSZWFjdDIudXNlUmVmKFwibm9uZVwiKTtcbiAgY29uc3QgaW5pdGlhbFN0YXRlID0gcHJlc2VudCA/IFwibW91bnRlZFwiIDogXCJ1bm1vdW50ZWRcIjtcbiAgY29uc3QgW3N0YXRlLCBzZW5kXSA9IHVzZVN0YXRlTWFjaGluZShpbml0aWFsU3RhdGUsIHtcbiAgICBtb3VudGVkOiB7XG4gICAgICBVTk1PVU5UOiBcInVubW91bnRlZFwiLFxuICAgICAgQU5JTUFUSU9OX09VVDogXCJ1bm1vdW50U3VzcGVuZGVkXCJcbiAgICB9LFxuICAgIHVubW91bnRTdXNwZW5kZWQ6IHtcbiAgICAgIE1PVU5UOiBcIm1vdW50ZWRcIixcbiAgICAgIEFOSU1BVElPTl9FTkQ6IFwidW5tb3VudGVkXCJcbiAgICB9LFxuICAgIHVubW91bnRlZDoge1xuICAgICAgTU9VTlQ6IFwibW91bnRlZFwiXG4gICAgfVxuICB9KTtcbiAgUmVhY3QyLnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3VycmVudEFuaW1hdGlvbk5hbWUgPSBnZXRBbmltYXRpb25OYW1lKHN0eWxlc1JlZi5jdXJyZW50KTtcbiAgICBwcmV2QW5pbWF0aW9uTmFtZVJlZi5jdXJyZW50ID0gc3RhdGUgPT09IFwibW91bnRlZFwiID8gY3VycmVudEFuaW1hdGlvbk5hbWUgOiBcIm5vbmVcIjtcbiAgfSwgW3N0YXRlXSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc3R5bGVzID0gc3R5bGVzUmVmLmN1cnJlbnQ7XG4gICAgY29uc3Qgd2FzUHJlc2VudCA9IHByZXZQcmVzZW50UmVmLmN1cnJlbnQ7XG4gICAgY29uc3QgaGFzUHJlc2VudENoYW5nZWQgPSB3YXNQcmVzZW50ICE9PSBwcmVzZW50O1xuICAgIGlmIChoYXNQcmVzZW50Q2hhbmdlZCkge1xuICAgICAgY29uc3QgcHJldkFuaW1hdGlvbk5hbWUgPSBwcmV2QW5pbWF0aW9uTmFtZVJlZi5jdXJyZW50O1xuICAgICAgY29uc3QgY3VycmVudEFuaW1hdGlvbk5hbWUgPSBnZXRBbmltYXRpb25OYW1lKHN0eWxlcyk7XG4gICAgICBpZiAocHJlc2VudCkge1xuICAgICAgICBzZW5kKFwiTU9VTlRcIik7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRBbmltYXRpb25OYW1lID09PSBcIm5vbmVcIiB8fCBzdHlsZXM/LmRpc3BsYXkgPT09IFwibm9uZVwiKSB7XG4gICAgICAgIHNlbmQoXCJVTk1PVU5UXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaXNBbmltYXRpbmcgPSBwcmV2QW5pbWF0aW9uTmFtZSAhPT0gY3VycmVudEFuaW1hdGlvbk5hbWU7XG4gICAgICAgIGlmICh3YXNQcmVzZW50ICYmIGlzQW5pbWF0aW5nKSB7XG4gICAgICAgICAgc2VuZChcIkFOSU1BVElPTl9PVVRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VuZChcIlVOTU9VTlRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByZXZQcmVzZW50UmVmLmN1cnJlbnQgPSBwcmVzZW50O1xuICAgIH1cbiAgfSwgW3ByZXNlbnQsIHNlbmRdKTtcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAobm9kZSkge1xuICAgICAgY29uc3QgaGFuZGxlQW5pbWF0aW9uRW5kID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRBbmltYXRpb25OYW1lID0gZ2V0QW5pbWF0aW9uTmFtZShzdHlsZXNSZWYuY3VycmVudCk7XG4gICAgICAgIGNvbnN0IGlzQ3VycmVudEFuaW1hdGlvbiA9IGN1cnJlbnRBbmltYXRpb25OYW1lLmluY2x1ZGVzKGV2ZW50LmFuaW1hdGlvbk5hbWUpO1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBub2RlICYmIGlzQ3VycmVudEFuaW1hdGlvbikge1xuICAgICAgICAgIFJlYWN0RE9NLmZsdXNoU3luYygoKSA9PiBzZW5kKFwiQU5JTUFUSU9OX0VORFwiKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBoYW5kbGVBbmltYXRpb25TdGFydCA9IChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBub2RlKSB7XG4gICAgICAgICAgcHJldkFuaW1hdGlvbk5hbWVSZWYuY3VycmVudCA9IGdldEFuaW1hdGlvbk5hbWUoc3R5bGVzUmVmLmN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKFwiYW5pbWF0aW9uc3RhcnRcIiwgaGFuZGxlQW5pbWF0aW9uU3RhcnQpO1xuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKFwiYW5pbWF0aW9uY2FuY2VsXCIsIGhhbmRsZUFuaW1hdGlvbkVuZCk7XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbmltYXRpb25lbmRcIiwgaGFuZGxlQW5pbWF0aW9uRW5kKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFuaW1hdGlvbnN0YXJ0XCIsIGhhbmRsZUFuaW1hdGlvblN0YXJ0KTtcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiYW5pbWF0aW9uY2FuY2VsXCIsIGhhbmRsZUFuaW1hdGlvbkVuZCk7XG4gICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFuaW1hdGlvbmVuZFwiLCBoYW5kbGVBbmltYXRpb25FbmQpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZChcIkFOSU1BVElPTl9FTkRcIik7XG4gICAgfVxuICB9LCBbbm9kZSwgc2VuZF0pO1xuICByZXR1cm4ge1xuICAgIGlzUHJlc2VudDogW1wibW91bnRlZFwiLCBcInVubW91bnRTdXNwZW5kZWRcIl0uaW5jbHVkZXMoc3RhdGUpLFxuICAgIHJlZjogUmVhY3QyLnVzZUNhbGxiYWNrKChub2RlMikgPT4ge1xuICAgICAgaWYgKG5vZGUyKSBzdHlsZXNSZWYuY3VycmVudCA9IGdldENvbXB1dGVkU3R5bGUobm9kZTIpO1xuICAgICAgc2V0Tm9kZShub2RlMik7XG4gICAgfSwgW10pXG4gIH07XG59XG5mdW5jdGlvbiBnZXRBbmltYXRpb25OYW1lKHN0eWxlcykge1xuICByZXR1cm4gc3R5bGVzPy5hbmltYXRpb25OYW1lIHx8IFwibm9uZVwiO1xufVxuZnVuY3Rpb24gZ2V0RWxlbWVudFJlZihlbGVtZW50KSB7XG4gIGxldCBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVsZW1lbnQucHJvcHMsIFwicmVmXCIpPy5nZXQ7XG4gIGxldCBtYXlXYXJuID0gZ2V0dGVyICYmIFwiaXNSZWFjdFdhcm5pbmdcIiBpbiBnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nO1xuICBpZiAobWF5V2Fybikge1xuICAgIHJldHVybiBlbGVtZW50LnJlZjtcbiAgfVxuICBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVsZW1lbnQsIFwicmVmXCIpPy5nZXQ7XG4gIG1heVdhcm4gPSBnZXR0ZXIgJiYgXCJpc1JlYWN0V2FybmluZ1wiIGluIGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmc7XG4gIGlmIChtYXlXYXJuKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQucHJvcHMucmVmO1xuICB9XG4gIHJldHVybiBlbGVtZW50LnByb3BzLnJlZiB8fCBlbGVtZW50LnJlZjtcbn1cbmV4cG9ydCB7XG4gIFByZXNlbmNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvcHJpbWl0aXZlL3NyYy9QcmltaXRpdmUudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IFNsb3QgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXNsb3RcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIE5PREVTID0gW1xuICBcImFcIixcbiAgXCJidXR0b25cIixcbiAgXCJkaXZcIixcbiAgXCJmb3JtXCIsXG4gIFwiaDJcIixcbiAgXCJoM1wiLFxuICBcImltZ1wiLFxuICBcImlucHV0XCIsXG4gIFwibGFiZWxcIixcbiAgXCJsaVwiLFxuICBcIm5hdlwiLFxuICBcIm9sXCIsXG4gIFwicFwiLFxuICBcInNwYW5cIixcbiAgXCJzdmdcIixcbiAgXCJ1bFwiXG5dO1xudmFyIFByaW1pdGl2ZSA9IE5PREVTLnJlZHVjZSgocHJpbWl0aXZlLCBub2RlKSA9PiB7XG4gIGNvbnN0IE5vZGUgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBhc0NoaWxkLCAuLi5wcmltaXRpdmVQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgQ29tcCA9IGFzQ2hpbGQgPyBTbG90IDogbm9kZTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgd2luZG93W1N5bWJvbC5mb3IoXCJyYWRpeC11aVwiKV0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb21wLCB7IC4uLnByaW1pdGl2ZVByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfSk7XG4gIE5vZGUuZGlzcGxheU5hbWUgPSBgUHJpbWl0aXZlLiR7bm9kZX1gO1xuICByZXR1cm4geyAuLi5wcmltaXRpdmUsIFtub2RlXTogTm9kZSB9O1xufSwge30pO1xuZnVuY3Rpb24gZGlzcGF0Y2hEaXNjcmV0ZUN1c3RvbUV2ZW50KHRhcmdldCwgZXZlbnQpIHtcbiAgaWYgKHRhcmdldCkgUmVhY3RET00uZmx1c2hTeW5jKCgpID0+IHRhcmdldC5kaXNwYXRjaEV2ZW50KGV2ZW50KSk7XG59XG52YXIgUm9vdCA9IFByaW1pdGl2ZTtcbmV4cG9ydCB7XG4gIFByaW1pdGl2ZSxcbiAgUm9vdCxcbiAgZGlzcGF0Y2hEaXNjcmV0ZUN1c3RvbUV2ZW50XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L3JvdmluZy1mb2N1cy9zcmMvUm92aW5nRm9jdXNHcm91cC50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY29tcG9zZUV2ZW50SGFuZGxlcnMgfSBmcm9tIFwiQHJhZGl4LXVpL3ByaW1pdGl2ZVwiO1xuaW1wb3J0IHsgY3JlYXRlQ29sbGVjdGlvbiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29sbGVjdGlvblwiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZWRSZWZzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHRTY29wZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29udGV4dFwiO1xuaW1wb3J0IHsgdXNlSWQgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWlkXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZVwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWZcIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsYWJsZVN0YXRlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtY29udHJvbGxhYmxlLXN0YXRlXCI7XG5pbXBvcnQgeyB1c2VEaXJlY3Rpb24gfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWRpcmVjdGlvblwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgRU5UUllfRk9DVVMgPSBcInJvdmluZ0ZvY3VzR3JvdXAub25FbnRyeUZvY3VzXCI7XG52YXIgRVZFTlRfT1BUSU9OUyA9IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IHRydWUgfTtcbnZhciBHUk9VUF9OQU1FID0gXCJSb3ZpbmdGb2N1c0dyb3VwXCI7XG52YXIgW0NvbGxlY3Rpb24sIHVzZUNvbGxlY3Rpb24sIGNyZWF0ZUNvbGxlY3Rpb25TY29wZV0gPSBjcmVhdGVDb2xsZWN0aW9uKEdST1VQX05BTUUpO1xudmFyIFtjcmVhdGVSb3ZpbmdGb2N1c0dyb3VwQ29udGV4dCwgY3JlYXRlUm92aW5nRm9jdXNHcm91cFNjb3BlXSA9IGNyZWF0ZUNvbnRleHRTY29wZShcbiAgR1JPVVBfTkFNRSxcbiAgW2NyZWF0ZUNvbGxlY3Rpb25TY29wZV1cbik7XG52YXIgW1JvdmluZ0ZvY3VzUHJvdmlkZXIsIHVzZVJvdmluZ0ZvY3VzQ29udGV4dF0gPSBjcmVhdGVSb3ZpbmdGb2N1c0dyb3VwQ29udGV4dChHUk9VUF9OQU1FKTtcbnZhciBSb3ZpbmdGb2N1c0dyb3VwID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb2xsZWN0aW9uLlByb3ZpZGVyLCB7IHNjb3BlOiBwcm9wcy5fX3Njb3BlUm92aW5nRm9jdXNHcm91cCwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goQ29sbGVjdGlvbi5TbG90LCB7IHNjb3BlOiBwcm9wcy5fX3Njb3BlUm92aW5nRm9jdXNHcm91cCwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goUm92aW5nRm9jdXNHcm91cEltcGwsIHsgLi4ucHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pIH0pIH0pO1xuICB9XG4pO1xuUm92aW5nRm9jdXNHcm91cC5kaXNwbGF5TmFtZSA9IEdST1VQX05BTUU7XG52YXIgUm92aW5nRm9jdXNHcm91cEltcGwgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBfX3Njb3BlUm92aW5nRm9jdXNHcm91cCxcbiAgICBvcmllbnRhdGlvbixcbiAgICBsb29wID0gZmFsc2UsXG4gICAgZGlyLFxuICAgIGN1cnJlbnRUYWJTdG9wSWQ6IGN1cnJlbnRUYWJTdG9wSWRQcm9wLFxuICAgIGRlZmF1bHRDdXJyZW50VGFiU3RvcElkLFxuICAgIG9uQ3VycmVudFRhYlN0b3BJZENoYW5nZSxcbiAgICBvbkVudHJ5Rm9jdXMsXG4gICAgcHJldmVudFNjcm9sbE9uRW50cnlGb2N1cyA9IGZhbHNlLFxuICAgIC4uLmdyb3VwUHJvcHNcbiAgfSA9IHByb3BzO1xuICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIHJlZik7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IHVzZURpcmVjdGlvbihkaXIpO1xuICBjb25zdCBbY3VycmVudFRhYlN0b3BJZCA9IG51bGwsIHNldEN1cnJlbnRUYWJTdG9wSWRdID0gdXNlQ29udHJvbGxhYmxlU3RhdGUoe1xuICAgIHByb3A6IGN1cnJlbnRUYWJTdG9wSWRQcm9wLFxuICAgIGRlZmF1bHRQcm9wOiBkZWZhdWx0Q3VycmVudFRhYlN0b3BJZCxcbiAgICBvbkNoYW5nZTogb25DdXJyZW50VGFiU3RvcElkQ2hhbmdlXG4gIH0pO1xuICBjb25zdCBbaXNUYWJiaW5nQmFja091dCwgc2V0SXNUYWJiaW5nQmFja091dF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGhhbmRsZUVudHJ5Rm9jdXMgPSB1c2VDYWxsYmFja1JlZihvbkVudHJ5Rm9jdXMpO1xuICBjb25zdCBnZXRJdGVtcyA9IHVzZUNvbGxlY3Rpb24oX19zY29wZVJvdmluZ0ZvY3VzR3JvdXApO1xuICBjb25zdCBpc0NsaWNrRm9jdXNSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBbZm9jdXNhYmxlSXRlbXNDb3VudCwgc2V0Rm9jdXNhYmxlSXRlbXNDb3VudF0gPSBSZWFjdC51c2VTdGF0ZSgwKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBub2RlID0gcmVmLmN1cnJlbnQ7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihFTlRSWV9GT0NVUywgaGFuZGxlRW50cnlGb2N1cyk7XG4gICAgICByZXR1cm4gKCkgPT4gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEVOVFJZX0ZPQ1VTLCBoYW5kbGVFbnRyeUZvY3VzKTtcbiAgICB9XG4gIH0sIFtoYW5kbGVFbnRyeUZvY3VzXSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgIFJvdmluZ0ZvY3VzUHJvdmlkZXIsXG4gICAge1xuICAgICAgc2NvcGU6IF9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwLFxuICAgICAgb3JpZW50YXRpb24sXG4gICAgICBkaXI6IGRpcmVjdGlvbixcbiAgICAgIGxvb3AsXG4gICAgICBjdXJyZW50VGFiU3RvcElkLFxuICAgICAgb25JdGVtRm9jdXM6IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgICAgICAodGFiU3RvcElkKSA9PiBzZXRDdXJyZW50VGFiU3RvcElkKHRhYlN0b3BJZCksXG4gICAgICAgIFtzZXRDdXJyZW50VGFiU3RvcElkXVxuICAgICAgKSxcbiAgICAgIG9uSXRlbVNoaWZ0VGFiOiBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiBzZXRJc1RhYmJpbmdCYWNrT3V0KHRydWUpLCBbXSksXG4gICAgICBvbkZvY3VzYWJsZUl0ZW1BZGQ6IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgICAgICAoKSA9PiBzZXRGb2N1c2FibGVJdGVtc0NvdW50KChwcmV2Q291bnQpID0+IHByZXZDb3VudCArIDEpLFxuICAgICAgICBbXVxuICAgICAgKSxcbiAgICAgIG9uRm9jdXNhYmxlSXRlbVJlbW92ZTogUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgICAgICgpID0+IHNldEZvY3VzYWJsZUl0ZW1zQ291bnQoKHByZXZDb3VudCkgPT4gcHJldkNvdW50IC0gMSksXG4gICAgICAgIFtdXG4gICAgICApLFxuICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgIFByaW1pdGl2ZS5kaXYsXG4gICAgICAgIHtcbiAgICAgICAgICB0YWJJbmRleDogaXNUYWJiaW5nQmFja091dCB8fCBmb2N1c2FibGVJdGVtc0NvdW50ID09PSAwID8gLTEgOiAwLFxuICAgICAgICAgIFwiZGF0YS1vcmllbnRhdGlvblwiOiBvcmllbnRhdGlvbixcbiAgICAgICAgICAuLi5ncm91cFByb3BzLFxuICAgICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICAgIHN0eWxlOiB7IG91dGxpbmU6IFwibm9uZVwiLCAuLi5wcm9wcy5zdHlsZSB9LFxuICAgICAgICAgIG9uTW91c2VEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbk1vdXNlRG93biwgKCkgPT4ge1xuICAgICAgICAgICAgaXNDbGlja0ZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uRm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uRm9jdXMsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNLZXlib2FyZEZvY3VzID0gIWlzQ2xpY2tGb2N1c1JlZi5jdXJyZW50O1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldCAmJiBpc0tleWJvYXJkRm9jdXMgJiYgIWlzVGFiYmluZ0JhY2tPdXQpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnlGb2N1c0V2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEVOVFJZX0ZPQ1VTLCBFVkVOVF9PUFRJT05TKTtcbiAgICAgICAgICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5kaXNwYXRjaEV2ZW50KGVudHJ5Rm9jdXNFdmVudCk7XG4gICAgICAgICAgICAgIGlmICghZW50cnlGb2N1c0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IGdldEl0ZW1zKCkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmZvY3VzYWJsZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlSXRlbSA9IGl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uYWN0aXZlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IGl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGN1cnJlbnRUYWJTdG9wSWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZUl0ZW1zID0gW2FjdGl2ZUl0ZW0sIGN1cnJlbnRJdGVtLCAuLi5pdGVtc10uZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgQm9vbGVhblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlTm9kZXMgPSBjYW5kaWRhdGVJdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0ucmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGZvY3VzRmlyc3QoY2FuZGlkYXRlTm9kZXMsIHByZXZlbnRTY3JvbGxPbkVudHJ5Rm9jdXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc0NsaWNrRm9jdXNSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uQmx1cjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25CbHVyLCAoKSA9PiBzZXRJc1RhYmJpbmdCYWNrT3V0KGZhbHNlKSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgKTtcbn0pO1xudmFyIElURU1fTkFNRSA9IFwiUm92aW5nRm9jdXNHcm91cEl0ZW1cIjtcbnZhciBSb3ZpbmdGb2N1c0dyb3VwSXRlbSA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgX19zY29wZVJvdmluZ0ZvY3VzR3JvdXAsXG4gICAgICBmb2N1c2FibGUgPSB0cnVlLFxuICAgICAgYWN0aXZlID0gZmFsc2UsXG4gICAgICB0YWJTdG9wSWQsXG4gICAgICAuLi5pdGVtUHJvcHNcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgYXV0b0lkID0gdXNlSWQoKTtcbiAgICBjb25zdCBpZCA9IHRhYlN0b3BJZCB8fCBhdXRvSWQ7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZVJvdmluZ0ZvY3VzQ29udGV4dChJVEVNX05BTUUsIF9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwKTtcbiAgICBjb25zdCBpc0N1cnJlbnRUYWJTdG9wID0gY29udGV4dC5jdXJyZW50VGFiU3RvcElkID09PSBpZDtcbiAgICBjb25zdCBnZXRJdGVtcyA9IHVzZUNvbGxlY3Rpb24oX19zY29wZVJvdmluZ0ZvY3VzR3JvdXApO1xuICAgIGNvbnN0IHsgb25Gb2N1c2FibGVJdGVtQWRkLCBvbkZvY3VzYWJsZUl0ZW1SZW1vdmUgfSA9IGNvbnRleHQ7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmIChmb2N1c2FibGUpIHtcbiAgICAgICAgb25Gb2N1c2FibGVJdGVtQWRkKCk7XG4gICAgICAgIHJldHVybiAoKSA9PiBvbkZvY3VzYWJsZUl0ZW1SZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9LCBbZm9jdXNhYmxlLCBvbkZvY3VzYWJsZUl0ZW1BZGQsIG9uRm9jdXNhYmxlSXRlbVJlbW92ZV0pO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgQ29sbGVjdGlvbi5JdGVtU2xvdCxcbiAgICAgIHtcbiAgICAgICAgc2NvcGU6IF9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwLFxuICAgICAgICBpZCxcbiAgICAgICAgZm9jdXNhYmxlLFxuICAgICAgICBhY3RpdmUsXG4gICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgIFByaW1pdGl2ZS5zcGFuLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhYkluZGV4OiBpc0N1cnJlbnRUYWJTdG9wID8gMCA6IC0xLFxuICAgICAgICAgICAgXCJkYXRhLW9yaWVudGF0aW9uXCI6IGNvbnRleHQub3JpZW50YXRpb24sXG4gICAgICAgICAgICAuLi5pdGVtUHJvcHMsXG4gICAgICAgICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgICAgICAgIG9uTW91c2VEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbk1vdXNlRG93biwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmICghZm9jdXNhYmxlKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBlbHNlIGNvbnRleHQub25JdGVtRm9jdXMoaWQpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBvbkZvY3VzOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkZvY3VzLCAoKSA9PiBjb250ZXh0Lm9uSXRlbUZvY3VzKGlkKSksXG4gICAgICAgICAgICBvbktleURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uS2V5RG93biwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IFwiVGFiXCIgJiYgZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lm9uSXRlbVNoaWZ0VGFiKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgIT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHJldHVybjtcbiAgICAgICAgICAgICAgY29uc3QgZm9jdXNJbnRlbnQgPSBnZXRGb2N1c0ludGVudChldmVudCwgY29udGV4dC5vcmllbnRhdGlvbiwgY29udGV4dC5kaXIpO1xuICAgICAgICAgICAgICBpZiAoZm9jdXNJbnRlbnQgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50LnNoaWZ0S2V5KSByZXR1cm47XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IGdldEl0ZW1zKCkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmZvY3VzYWJsZSk7XG4gICAgICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZU5vZGVzID0gaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZm9jdXNJbnRlbnQgPT09IFwibGFzdFwiKSBjYW5kaWRhdGVOb2Rlcy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNJbnRlbnQgPT09IFwicHJldlwiIHx8IGZvY3VzSW50ZW50ID09PSBcIm5leHRcIikge1xuICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzSW50ZW50ID09PSBcInByZXZcIikgY2FuZGlkYXRlTm9kZXMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gY2FuZGlkYXRlTm9kZXMuaW5kZXhPZihldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZU5vZGVzID0gY29udGV4dC5sb29wID8gd3JhcEFycmF5KGNhbmRpZGF0ZU5vZGVzLCBjdXJyZW50SW5kZXggKyAxKSA6IGNhbmRpZGF0ZU5vZGVzLnNsaWNlKGN1cnJlbnRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGZvY3VzRmlyc3QoY2FuZGlkYXRlTm9kZXMpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xuUm92aW5nRm9jdXNHcm91cEl0ZW0uZGlzcGxheU5hbWUgPSBJVEVNX05BTUU7XG52YXIgTUFQX0tFWV9UT19GT0NVU19JTlRFTlQgPSB7XG4gIEFycm93TGVmdDogXCJwcmV2XCIsXG4gIEFycm93VXA6IFwicHJldlwiLFxuICBBcnJvd1JpZ2h0OiBcIm5leHRcIixcbiAgQXJyb3dEb3duOiBcIm5leHRcIixcbiAgUGFnZVVwOiBcImZpcnN0XCIsXG4gIEhvbWU6IFwiZmlyc3RcIixcbiAgUGFnZURvd246IFwibGFzdFwiLFxuICBFbmQ6IFwibGFzdFwiXG59O1xuZnVuY3Rpb24gZ2V0RGlyZWN0aW9uQXdhcmVLZXkoa2V5LCBkaXIpIHtcbiAgaWYgKGRpciAhPT0gXCJydGxcIikgcmV0dXJuIGtleTtcbiAgcmV0dXJuIGtleSA9PT0gXCJBcnJvd0xlZnRcIiA/IFwiQXJyb3dSaWdodFwiIDoga2V5ID09PSBcIkFycm93UmlnaHRcIiA/IFwiQXJyb3dMZWZ0XCIgOiBrZXk7XG59XG5mdW5jdGlvbiBnZXRGb2N1c0ludGVudChldmVudCwgb3JpZW50YXRpb24sIGRpcikge1xuICBjb25zdCBrZXkgPSBnZXREaXJlY3Rpb25Bd2FyZUtleShldmVudC5rZXksIGRpcik7XG4gIGlmIChvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiICYmIFtcIkFycm93TGVmdFwiLCBcIkFycm93UmlnaHRcIl0uaW5jbHVkZXMoa2V5KSkgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKG9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiAmJiBbXCJBcnJvd1VwXCIsIFwiQXJyb3dEb3duXCJdLmluY2x1ZGVzKGtleSkpIHJldHVybiB2b2lkIDA7XG4gIHJldHVybiBNQVBfS0VZX1RPX0ZPQ1VTX0lOVEVOVFtrZXldO1xufVxuZnVuY3Rpb24gZm9jdXNGaXJzdChjYW5kaWRhdGVzLCBwcmV2ZW50U2Nyb2xsID0gZmFsc2UpIHtcbiAgY29uc3QgUFJFVklPVVNMWV9GT0NVU0VEX0VMRU1FTlQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKGNhbmRpZGF0ZSA9PT0gUFJFVklPVVNMWV9GT0NVU0VEX0VMRU1FTlQpIHJldHVybjtcbiAgICBjYW5kaWRhdGUuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsIH0pO1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBQUkVWSU9VU0xZX0ZPQ1VTRURfRUxFTUVOVCkgcmV0dXJuO1xuICB9XG59XG5mdW5jdGlvbiB3cmFwQXJyYXkoYXJyYXksIHN0YXJ0SW5kZXgpIHtcbiAgcmV0dXJuIGFycmF5Lm1hcCgoXywgaW5kZXgpID0+IGFycmF5WyhzdGFydEluZGV4ICsgaW5kZXgpICUgYXJyYXkubGVuZ3RoXSk7XG59XG52YXIgUm9vdCA9IFJvdmluZ0ZvY3VzR3JvdXA7XG52YXIgSXRlbSA9IFJvdmluZ0ZvY3VzR3JvdXBJdGVtO1xuZXhwb3J0IHtcbiAgSXRlbSxcbiAgUm9vdCxcbiAgUm92aW5nRm9jdXNHcm91cCxcbiAgUm92aW5nRm9jdXNHcm91cEl0ZW0sXG4gIGNyZWF0ZVJvdmluZ0ZvY3VzR3JvdXBTY29wZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L3Nsb3Qvc3JjL1Nsb3QudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWZzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnNcIjtcbmltcG9ydCB7IEZyYWdtZW50LCBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBTbG90ID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IGNoaWxkcmVuLCAuLi5zbG90UHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBjaGlsZHJlbkFycmF5ID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbik7XG4gIGNvbnN0IHNsb3R0YWJsZSA9IGNoaWxkcmVuQXJyYXkuZmluZChpc1Nsb3R0YWJsZSk7XG4gIGlmIChzbG90dGFibGUpIHtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gc2xvdHRhYmxlLnByb3BzLmNoaWxkcmVuO1xuICAgIGNvbnN0IG5ld0NoaWxkcmVuID0gY2hpbGRyZW5BcnJheS5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoY2hpbGQgPT09IHNsb3R0YWJsZSkge1xuICAgICAgICBpZiAoUmVhY3QuQ2hpbGRyZW4uY291bnQobmV3RWxlbWVudCkgPiAxKSByZXR1cm4gUmVhY3QuQ2hpbGRyZW4ub25seShudWxsKTtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmlzVmFsaWRFbGVtZW50KG5ld0VsZW1lbnQpID8gbmV3RWxlbWVudC5wcm9wcy5jaGlsZHJlbiA6IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goU2xvdENsb25lLCB7IC4uLnNsb3RQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYsIGNoaWxkcmVuOiBSZWFjdC5pc1ZhbGlkRWxlbWVudChuZXdFbGVtZW50KSA/IFJlYWN0LmNsb25lRWxlbWVudChuZXdFbGVtZW50LCB2b2lkIDAsIG5ld0NoaWxkcmVuKSA6IG51bGwgfSk7XG4gIH1cbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goU2xvdENsb25lLCB7IC4uLnNsb3RQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYsIGNoaWxkcmVuIH0pO1xufSk7XG5TbG90LmRpc3BsYXlOYW1lID0gXCJTbG90XCI7XG52YXIgU2xvdENsb25lID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IGNoaWxkcmVuLCAuLi5zbG90UHJvcHMgfSA9IHByb3BzO1xuICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgY29uc3QgY2hpbGRyZW5SZWYgPSBnZXRFbGVtZW50UmVmKGNoaWxkcmVuKTtcbiAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICAuLi5tZXJnZVByb3BzKHNsb3RQcm9wcywgY2hpbGRyZW4ucHJvcHMpLFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmVmOiBmb3J3YXJkZWRSZWYgPyBjb21wb3NlUmVmcyhmb3J3YXJkZWRSZWYsIGNoaWxkcmVuUmVmKSA6IGNoaWxkcmVuUmVmXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSA+IDEgPyBSZWFjdC5DaGlsZHJlbi5vbmx5KG51bGwpIDogbnVsbDtcbn0pO1xuU2xvdENsb25lLmRpc3BsYXlOYW1lID0gXCJTbG90Q2xvbmVcIjtcbnZhciBTbG90dGFibGUgPSAoeyBjaGlsZHJlbiB9KSA9PiB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KEZyYWdtZW50LCB7IGNoaWxkcmVuIH0pO1xufTtcbmZ1bmN0aW9uIGlzU2xvdHRhYmxlKGNoaWxkKSB7XG4gIHJldHVybiBSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkgJiYgY2hpbGQudHlwZSA9PT0gU2xvdHRhYmxlO1xufVxuZnVuY3Rpb24gbWVyZ2VQcm9wcyhzbG90UHJvcHMsIGNoaWxkUHJvcHMpIHtcbiAgY29uc3Qgb3ZlcnJpZGVQcm9wcyA9IHsgLi4uY2hpbGRQcm9wcyB9O1xuICBmb3IgKGNvbnN0IHByb3BOYW1lIGluIGNoaWxkUHJvcHMpIHtcbiAgICBjb25zdCBzbG90UHJvcFZhbHVlID0gc2xvdFByb3BzW3Byb3BOYW1lXTtcbiAgICBjb25zdCBjaGlsZFByb3BWYWx1ZSA9IGNoaWxkUHJvcHNbcHJvcE5hbWVdO1xuICAgIGNvbnN0IGlzSGFuZGxlciA9IC9eb25bQS1aXS8udGVzdChwcm9wTmFtZSk7XG4gICAgaWYgKGlzSGFuZGxlcikge1xuICAgICAgaWYgKHNsb3RQcm9wVmFsdWUgJiYgY2hpbGRQcm9wVmFsdWUpIHtcbiAgICAgICAgb3ZlcnJpZGVQcm9wc1twcm9wTmFtZV0gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIGNoaWxkUHJvcFZhbHVlKC4uLmFyZ3MpO1xuICAgICAgICAgIHNsb3RQcm9wVmFsdWUoLi4uYXJncyk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHNsb3RQcm9wVmFsdWUpIHtcbiAgICAgICAgb3ZlcnJpZGVQcm9wc1twcm9wTmFtZV0gPSBzbG90UHJvcFZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcE5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgb3ZlcnJpZGVQcm9wc1twcm9wTmFtZV0gPSB7IC4uLnNsb3RQcm9wVmFsdWUsIC4uLmNoaWxkUHJvcFZhbHVlIH07XG4gICAgfSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gXCJjbGFzc05hbWVcIikge1xuICAgICAgb3ZlcnJpZGVQcm9wc1twcm9wTmFtZV0gPSBbc2xvdFByb3BWYWx1ZSwgY2hpbGRQcm9wVmFsdWVdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgLi4uc2xvdFByb3BzLCAuLi5vdmVycmlkZVByb3BzIH07XG59XG5mdW5jdGlvbiBnZXRFbGVtZW50UmVmKGVsZW1lbnQpIHtcbiAgbGV0IGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZWxlbWVudC5wcm9wcywgXCJyZWZcIik/LmdldDtcbiAgbGV0IG1heVdhcm4gPSBnZXR0ZXIgJiYgXCJpc1JlYWN0V2FybmluZ1wiIGluIGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmc7XG4gIGlmIChtYXlXYXJuKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQucmVmO1xuICB9XG4gIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZWxlbWVudCwgXCJyZWZcIik/LmdldDtcbiAgbWF5V2FybiA9IGdldHRlciAmJiBcImlzUmVhY3RXYXJuaW5nXCIgaW4gZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZztcbiAgaWYgKG1heVdhcm4pIHtcbiAgICByZXR1cm4gZWxlbWVudC5wcm9wcy5yZWY7XG4gIH1cbiAgcmV0dXJuIGVsZW1lbnQucHJvcHMucmVmIHx8IGVsZW1lbnQucmVmO1xufVxudmFyIFJvb3QgPSBTbG90O1xuZXhwb3J0IHtcbiAgUm9vdCxcbiAgU2xvdCxcbiAgU2xvdHRhYmxlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvdXNlLWNhbGxiYWNrLXJlZi9zcmMvdXNlQ2FsbGJhY2tSZWYudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmZ1bmN0aW9uIHVzZUNhbGxiYWNrUmVmKGNhbGxiYWNrKSB7XG4gIGNvbnN0IGNhbGxiYWNrUmVmID0gUmVhY3QudXNlUmVmKGNhbGxiYWNrKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjYWxsYmFja1JlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG4gIH0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiAoLi4uYXJncykgPT4gY2FsbGJhY2tSZWYuY3VycmVudD8uKC4uLmFyZ3MpLCBbXSk7XG59XG5leHBvcnQge1xuICB1c2VDYWxsYmFja1JlZlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L3VzZS1jb250cm9sbGFibGUtc3RhdGUvc3JjL3VzZUNvbnRyb2xsYWJsZVN0YXRlLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZlwiO1xuZnVuY3Rpb24gdXNlQ29udHJvbGxhYmxlU3RhdGUoe1xuICBwcm9wLFxuICBkZWZhdWx0UHJvcCxcbiAgb25DaGFuZ2UgPSAoKSA9PiB7XG4gIH1cbn0pIHtcbiAgY29uc3QgW3VuY29udHJvbGxlZFByb3AsIHNldFVuY29udHJvbGxlZFByb3BdID0gdXNlVW5jb250cm9sbGVkU3RhdGUoeyBkZWZhdWx0UHJvcCwgb25DaGFuZ2UgfSk7XG4gIGNvbnN0IGlzQ29udHJvbGxlZCA9IHByb3AgIT09IHZvaWQgMDtcbiAgY29uc3QgdmFsdWUgPSBpc0NvbnRyb2xsZWQgPyBwcm9wIDogdW5jb250cm9sbGVkUHJvcDtcbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2tSZWYob25DaGFuZ2UpO1xuICBjb25zdCBzZXRWYWx1ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgIChuZXh0VmFsdWUpID0+IHtcbiAgICAgIGlmIChpc0NvbnRyb2xsZWQpIHtcbiAgICAgICAgY29uc3Qgc2V0dGVyID0gbmV4dFZhbHVlO1xuICAgICAgICBjb25zdCB2YWx1ZTIgPSB0eXBlb2YgbmV4dFZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBzZXR0ZXIocHJvcCkgOiBuZXh0VmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZTIgIT09IHByb3ApIGhhbmRsZUNoYW5nZSh2YWx1ZTIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0VW5jb250cm9sbGVkUHJvcChuZXh0VmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2lzQ29udHJvbGxlZCwgcHJvcCwgc2V0VW5jb250cm9sbGVkUHJvcCwgaGFuZGxlQ2hhbmdlXVxuICApO1xuICByZXR1cm4gW3ZhbHVlLCBzZXRWYWx1ZV07XG59XG5mdW5jdGlvbiB1c2VVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gIGRlZmF1bHRQcm9wLFxuICBvbkNoYW5nZVxufSkge1xuICBjb25zdCB1bmNvbnRyb2xsZWRTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGRlZmF1bHRQcm9wKTtcbiAgY29uc3QgW3ZhbHVlXSA9IHVuY29udHJvbGxlZFN0YXRlO1xuICBjb25zdCBwcmV2VmFsdWVSZWYgPSBSZWFjdC51c2VSZWYodmFsdWUpO1xuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFja1JlZihvbkNoYW5nZSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHByZXZWYWx1ZVJlZi5jdXJyZW50ICE9PSB2YWx1ZSkge1xuICAgICAgaGFuZGxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIHByZXZWYWx1ZVJlZi5jdXJyZW50ID0gdmFsdWU7XG4gICAgfVxuICB9LCBbdmFsdWUsIHByZXZWYWx1ZVJlZiwgaGFuZGxlQ2hhbmdlXSk7XG4gIHJldHVybiB1bmNvbnRyb2xsZWRTdGF0ZTtcbn1cbmV4cG9ydCB7XG4gIHVzZUNvbnRyb2xsYWJsZVN0YXRlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvdXNlLWVzY2FwZS1rZXlkb3duL3NyYy91c2VFc2NhcGVLZXlkb3duLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZlwiO1xuZnVuY3Rpb24gdXNlRXNjYXBlS2V5ZG93bihvbkVzY2FwZUtleURvd25Qcm9wLCBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcz8uZG9jdW1lbnQpIHtcbiAgY29uc3Qgb25Fc2NhcGVLZXlEb3duID0gdXNlQ2FsbGJhY2tSZWYob25Fc2NhcGVLZXlEb3duUHJvcCk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBvbkVzY2FwZUtleURvd24oZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG4gICAgb3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgcmV0dXJuICgpID0+IG93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93biwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9LCBbb25Fc2NhcGVLZXlEb3duLCBvd25lckRvY3VtZW50XSk7XG59XG5leHBvcnQge1xuICB1c2VFc2NhcGVLZXlkb3duXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvdXNlLWxheW91dC1lZmZlY3Qvc3JjL3VzZUxheW91dEVmZmVjdC50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIHVzZUxheW91dEVmZmVjdDIgPSBCb29sZWFuKGdsb2JhbFRoaXM/LmRvY3VtZW50KSA/IFJlYWN0LnVzZUxheW91dEVmZmVjdCA6ICgpID0+IHtcbn07XG5leHBvcnQge1xuICB1c2VMYXlvdXRFZmZlY3QyIGFzIHVzZUxheW91dEVmZmVjdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L3VzZS1zaXplL3NyYy91c2VTaXplLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1sYXlvdXQtZWZmZWN0XCI7XG5mdW5jdGlvbiB1c2VTaXplKGVsZW1lbnQpIHtcbiAgY29uc3QgW3NpemUsIHNldFNpemVdID0gUmVhY3QudXNlU3RhdGUodm9pZCAwKTtcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgc2V0U2l6ZSh7IHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLCBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IH0pO1xuICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzWzBdO1xuICAgICAgICBsZXQgd2lkdGg7XG4gICAgICAgIGxldCBoZWlnaHQ7XG4gICAgICAgIGlmIChcImJvcmRlckJveFNpemVcIiBpbiBlbnRyeSkge1xuICAgICAgICAgIGNvbnN0IGJvcmRlclNpemVFbnRyeSA9IGVudHJ5W1wiYm9yZGVyQm94U2l6ZVwiXTtcbiAgICAgICAgICBjb25zdCBib3JkZXJTaXplID0gQXJyYXkuaXNBcnJheShib3JkZXJTaXplRW50cnkpID8gYm9yZGVyU2l6ZUVudHJ5WzBdIDogYm9yZGVyU2l6ZUVudHJ5O1xuICAgICAgICAgIHdpZHRoID0gYm9yZGVyU2l6ZVtcImlubGluZVNpemVcIl07XG4gICAgICAgICAgaGVpZ2h0ID0gYm9yZGVyU2l6ZVtcImJsb2NrU2l6ZVwiXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgaGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgICB9KTtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBib3g6IFwiYm9yZGVyLWJveFwiIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0U2l6ZSh2b2lkIDApO1xuICAgIH1cbiAgfSwgW2VsZW1lbnRdKTtcbiAgcmV0dXJuIHNpemU7XG59XG5leHBvcnQge1xuICB1c2VTaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzLCBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycywgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvbiAqLyBpbXBvcnQgeyBtYWtlUmVxdWVzdENhbGwsIG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lciB9IGZyb20gJy4vbWFrZVJlcXVlc3RDYWxsLmpzJztcbmV4cG9ydCBjbGFzcyBBc2FwUXVldWUge1xuICAgIC8vIFVzZSB0aGUgZmFzdGVzdCBtZWFucyBwb3NzaWJsZSB0byBleGVjdXRlIGEgdGFzayBpbiBpdHMgb3duIHR1cm4sIHdpdGhcbiAgICAvLyBwcmlvcml0eSBvdmVyIG90aGVyIGV2ZW50cyBpbmNsdWRpbmcgSU8sIGFuaW1hdGlvbiwgcmVmbG93LCBhbmQgcmVkcmF3XG4gICAgLy8gZXZlbnRzIGluIGJyb3dzZXJzLlxuICAgIC8vXG4gICAgLy8gQW4gZXhjZXB0aW9uIHRocm93biBieSBhIHRhc2sgd2lsbCBwZXJtYW5lbnRseSBpbnRlcnJ1cHQgdGhlIHByb2Nlc3Npbmcgb2ZcbiAgICAvLyBzdWJzZXF1ZW50IHRhc2tzLiBUaGUgaGlnaGVyIGxldmVsIGBhc2FwYCBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgaWYgYW5cbiAgICAvLyBleGNlcHRpb24gaXMgdGhyb3duIGJ5IGEgdGFzaywgdGhhdCB0aGUgdGFzayBxdWV1ZSB3aWxsIGNvbnRpbnVlIGZsdXNoaW5nIGFzXG4gICAgLy8gc29vbiBhcyBwb3NzaWJsZSwgYnV0IGlmIHlvdSB1c2UgYHJhd0FzYXBgIGRpcmVjdGx5LCB5b3UgYXJlIHJlc3BvbnNpYmxlIHRvXG4gICAgLy8gZWl0aGVyIGVuc3VyZSB0aGF0IG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHlvdXIgdGFzaywgb3IgdG8gbWFudWFsbHlcbiAgICAvLyBjYWxsIGByYXdBc2FwLnJlcXVlc3RGbHVzaGAgaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93bi5cbiAgICBlbnF1ZXVlVGFzayh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHsgcXVldWU6IHEgLCByZXF1ZXN0Rmx1c2ggIH0gPSB0aGlzO1xuICAgICAgICBpZiAoIXEubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXF1ZXN0Rmx1c2goKTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVxdWl2YWxlbnQgdG8gcHVzaCwgYnV0IGF2b2lkcyBhIGZ1bmN0aW9uIGNhbGwuXG4gICAgICAgIHFbcS5sZW5ndGhdID0gdGFzaztcbiAgICB9XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICAvLyBXZSBxdWV1ZSBlcnJvcnMgdG8gZW5zdXJlIHRoZXkgYXJlIHRocm93biBpbiByaWdodCBvcmRlciAoRklGTykuXG4gICAgICAgIC8vIEFycmF5LWFzLXF1ZXVlIGlzIGdvb2QgZW5vdWdoIGhlcmUsIHNpbmNlIHdlIGFyZSBqdXN0IGRlYWxpbmcgd2l0aCBleGNlcHRpb25zLlxuICAgICAgICB0aGlzLnBlbmRpbmdFcnJvcnMgPSBbXTtcbiAgICAgICAgLy8gT25jZSBhIGZsdXNoIGhhcyBiZWVuIHJlcXVlc3RlZCwgbm8gZnVydGhlciBjYWxscyB0byBgcmVxdWVzdEZsdXNoYCBhcmVcbiAgICAgICAgLy8gbmVjZXNzYXJ5IHVudGlsIHRoZSBuZXh0IGBmbHVzaGAgY29tcGxldGVzLlxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZmx1c2hpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSBuZXh0IHRhc2sgdG8gZXhlY3V0ZSBpbiB0aGUgdGFzayBxdWV1ZS4gVGhpcyBpc1xuICAgICAgICAvLyBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0byBgZmx1c2hgIHNvIHRoYXQgaXQgY2FuIGJlIHJlc3VtZWQgaWZcbiAgICAgICAgLy8gYSB0YXNrIHRocm93cyBhbiBleGNlcHRpb24uXG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICAvLyBJZiBhIHRhc2sgc2NoZWR1bGVzIGFkZGl0aW9uYWwgdGFza3MgcmVjdXJzaXZlbHksIHRoZSB0YXNrIHF1ZXVlIGNhbiBncm93XG4gICAgICAgIC8vIHVuYm91bmRlZC4gVG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvbiwgdGhlIHRhc2sgcXVldWUgd2lsbCBwZXJpb2RpY2FsbHlcbiAgICAgICAgLy8gdHJ1bmNhdGUgYWxyZWFkeS1jb21wbGV0ZWQgdGFza3MuXG4gICAgICAgIHRoaXMuY2FwYWNpdHkgPSAxMDI0O1xuICAgICAgICAvLyBUaGUgZmx1c2ggZnVuY3Rpb24gcHJvY2Vzc2VzIGFsbCB0YXNrcyB0aGF0IGhhdmUgYmVlbiBzY2hlZHVsZWQgd2l0aFxuICAgICAgICAvLyBgcmF3QXNhcGAgdW5sZXNzIGFuZCB1bnRpbCBvbmUgb2YgdGhvc2UgdGFza3MgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAgICAgICAgLy8gSWYgYSB0YXNrIHRocm93cyBhbiBleGNlcHRpb24sIGBmbHVzaGAgZW5zdXJlcyB0aGF0IGl0cyBzdGF0ZSB3aWxsIHJlbWFpblxuICAgICAgICAvLyBjb25zaXN0ZW50IGFuZCB3aWxsIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZiB3aGVuIGNhbGxlZCBhZ2Fpbi5cbiAgICAgICAgLy8gSG93ZXZlciwgYGZsdXNoYCBkb2VzIG5vdCBtYWtlIGFueSBhcnJhbmdlbWVudHMgdG8gYmUgY2FsbGVkIGFnYWluIGlmIGFuXG4gICAgICAgIC8vIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG4gICAgICAgIHRoaXMuZmx1c2ggPSAoKT0+e1xuICAgICAgICAgICAgY29uc3QgeyBxdWV1ZTogcSAgfSA9IHRoaXM7XG4gICAgICAgICAgICB3aGlsZSh0aGlzLmluZGV4IDwgcS5sZW5ndGgpe1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICAgICAgICAgICAgLy8gQWR2YW5jZSB0aGUgaW5kZXggYmVmb3JlIGNhbGxpbmcgdGhlIHRhc2suIFRoaXMgZW5zdXJlcyB0aGF0IHdlIHdpbGxcbiAgICAgICAgICAgICAgICAvLyBiZWdpbiBmbHVzaGluZyBvbiB0aGUgbmV4dCB0YXNrIHRoZSB0YXNrIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgICAgICAgICAgcVtjdXJyZW50SW5kZXhdLmNhbGwoKTtcbiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGxlYWtpbmcgbWVtb3J5IGZvciBsb25nIGNoYWlucyBvZiByZWN1cnNpdmUgY2FsbHMgdG8gYGFzYXBgLlxuICAgICAgICAgICAgICAgIC8vIElmIHdlIGNhbGwgYGFzYXBgIHdpdGhpbiB0YXNrcyBzY2hlZHVsZWQgYnkgYGFzYXBgLCB0aGUgcXVldWUgd2lsbFxuICAgICAgICAgICAgICAgIC8vIGdyb3csIGJ1dCB0byBhdm9pZCBhbiBPKG4pIHdhbGsgZm9yIGV2ZXJ5IHRhc2sgd2UgZXhlY3V0ZSwgd2UgZG9uJ3RcbiAgICAgICAgICAgICAgICAvLyBzaGlmdCB0YXNrcyBvZmYgdGhlIHF1ZXVlIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGV4ZWN1dGVkLlxuICAgICAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIHBlcmlvZGljYWxseSBzaGlmdCAxMDI0IHRhc2tzIG9mZiB0aGUgcXVldWUuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPiB0aGlzLmNhcGFjaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1hbnVhbGx5IHNoaWZ0IGFsbCB2YWx1ZXMgc3RhcnRpbmcgYXQgdGhlIGluZGV4IGJhY2sgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgcXVldWUuXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgc2NhbiA9IDAsIG5ld0xlbmd0aCA9IHEubGVuZ3RoIC0gdGhpcy5pbmRleDsgc2NhbiA8IG5ld0xlbmd0aDsgc2NhbisrKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHFbc2Nhbl0gPSBxW3NjYW4gKyB0aGlzLmluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBxLmxlbmd0aCAtPSB0aGlzLmluZGV4O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hpbmcgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gSW4gYSB3ZWIgYnJvd3NlciwgZXhjZXB0aW9ucyBhcmUgbm90IGZhdGFsLiBIb3dldmVyLCB0byBhdm9pZFxuICAgICAgICAvLyBzbG93aW5nIGRvd24gdGhlIHF1ZXVlIG9mIHBlbmRpbmcgdGFza3MsIHdlIHJldGhyb3cgdGhlIGVycm9yIGluIGFcbiAgICAgICAgLy8gbG93ZXIgcHJpb3JpdHkgdHVybi5cbiAgICAgICAgdGhpcy5yZWdpc3RlclBlbmRpbmdFcnJvciA9IChlcnIpPT57XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdFcnJvcnMucHVzaChlcnIpO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0RXJyb3JUaHJvdygpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBgcmVxdWVzdEZsdXNoYCByZXF1ZXN0cyB0aGF0IHRoZSBoaWdoIHByaW9yaXR5IGV2ZW50IHF1ZXVlIGJlIGZsdXNoZWQgYXNcbiAgICAgICAgLy8gc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgLy8gVGhpcyBpcyB1c2VmdWwgdG8gcHJldmVudCBhbiBlcnJvciB0aHJvd24gaW4gYSB0YXNrIGZyb20gc3RhbGxpbmcgdGhlIGV2ZW50XG4gICAgICAgIC8vIHF1ZXVlIGlmIHRoZSBleGNlcHRpb24gaGFuZGxlZCBieSBOb2RlLmpz4oCZc1xuICAgICAgICAvLyBgcHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uXCIpYCBvciBieSBhIGRvbWFpbi5cbiAgICAgICAgLy8gYHJlcXVlc3RGbHVzaGAgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIGNvbGxlY3RlZCBmcm9tXG4gICAgICAgIC8vIGV2ZXJ5IGF2YWlsYWJsZSBTYXVjZUxhYnMgU2VsZW5pdW0gd2ViIGRyaXZlciB3b3JrZXIgYXQgdGltZSBvZiB3cml0aW5nLlxuICAgICAgICAvLyBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xbUctNVVZR3VwNXF4R2RFTVdraFA2QldDejA1M05VYjJFMVFvVVRVMTZ1QS9lZGl0I2dpZD03ODM3MjQ1OTNcbiAgICAgICAgdGhpcy5yZXF1ZXN0Rmx1c2ggPSBtYWtlUmVxdWVzdENhbGwodGhpcy5mbHVzaCk7XG4gICAgICAgIHRoaXMucmVxdWVzdEVycm9yVGhyb3cgPSBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXIoKCk9PntcbiAgICAgICAgICAgIC8vIFRocm93IGZpcnN0IGVycm9yXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IHRoaXMucGVuZGluZ0Vycm9ycy5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59IC8vIFRoZSBtZXNzYWdlIGNoYW5uZWwgdGVjaG5pcXVlIHdhcyBkaXNjb3ZlcmVkIGJ5IE1hbHRlIFVibCBhbmQgd2FzIHRoZVxuIC8vIG9yaWdpbmFsIGZvdW5kYXRpb24gZm9yIHRoaXMgbGlicmFyeS5cbiAvLyBodHRwOi8vd3d3Lm5vbmJsb2NraW5nLmlvLzIwMTEvMDYvd2luZG93bmV4dHRpY2suaHRtbFxuIC8vIFNhZmFyaSA2LjAuNSAoYXQgbGVhc3QpIGludGVybWl0dGVudGx5IGZhaWxzIHRvIGNyZWF0ZSBtZXNzYWdlIHBvcnRzIG9uIGFcbiAvLyBwYWdlJ3MgZmlyc3QgbG9hZC4gVGhhbmtmdWxseSwgdGhpcyB2ZXJzaW9uIG9mIFNhZmFyaSBzdXBwb3J0c1xuIC8vIE11dGF0aW9uT2JzZXJ2ZXJzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGZhbGwgYmFjayBpbiB0aGF0IGNhc2UuXG4gLy8gZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbU1lc3NhZ2VDaGFubmVsKGNhbGxiYWNrKSB7XG4gLy8gICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gLy8gICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gY2FsbGJhY2s7XG4gLy8gICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAvLyAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gLy8gICAgIH07XG4gLy8gfVxuIC8vIEZvciByZWFzb25zIGV4cGxhaW5lZCBhYm92ZSwgd2UgYXJlIGFsc28gdW5hYmxlIHRvIHVzZSBgc2V0SW1tZWRpYXRlYFxuIC8vIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLlxuIC8vIEV2ZW4gaWYgd2Ugd2VyZSwgdGhlcmUgaXMgYW5vdGhlciBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAuXG4gLy8gSXQgaXMgbm90IHN1ZmZpY2llbnQgdG8gYXNzaWduIGBzZXRJbW1lZGlhdGVgIHRvIGByZXF1ZXN0Rmx1c2hgIGJlY2F1c2VcbiAvLyBgc2V0SW1tZWRpYXRlYCBtdXN0IGJlIGNhbGxlZCAqYnkgbmFtZSogYW5kIHRoZXJlZm9yZSBtdXN0IGJlIHdyYXBwZWQgaW4gYVxuIC8vIGNsb3N1cmUuXG4gLy8gTmV2ZXIgZm9yZ2V0LlxuIC8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21TZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbiAvLyAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuIC8vICAgICAgICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAvLyAgICAgfTtcbiAvLyB9XG4gLy8gU2FmYXJpIDYuMCBoYXMgYSBwcm9ibGVtIHdoZXJlIHRpbWVycyB3aWxsIGdldCBsb3N0IHdoaWxlIHRoZSB1c2VyIGlzXG4gLy8gc2Nyb2xsaW5nLiBUaGlzIHByb2JsZW0gZG9lcyBub3QgaW1wYWN0IEFTQVAgYmVjYXVzZSBTYWZhcmkgNi4wIHN1cHBvcnRzXG4gLy8gbXV0YXRpb24gb2JzZXJ2ZXJzLCBzbyB0aGF0IGltcGxlbWVudGF0aW9uIGlzIHVzZWQgaW5zdGVhZC5cbiAvLyBIb3dldmVyLCBpZiB3ZSBldmVyIGVsZWN0IHRvIHVzZSB0aW1lcnMgaW4gU2FmYXJpLCB0aGUgcHJldmFsZW50IHdvcmstYXJvdW5kXG4gLy8gaXMgdG8gYWRkIGEgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyIHRoYXQgY2FsbHMgZm9yIGEgZmx1c2guXG4gLy8gYHNldFRpbWVvdXRgIGRvZXMgbm90IGNhbGwgdGhlIHBhc3NlZCBjYWxsYmFjayBpZiB0aGUgZGVsYXkgaXMgbGVzcyB0aGFuXG4gLy8gYXBwcm94aW1hdGVseSA3IGluIHdlYiB3b3JrZXJzIGluIEZpcmVmb3ggOCB0aHJvdWdoIDE4LCBhbmQgc29tZXRpbWVzIG5vdFxuIC8vIGV2ZW4gdGhlbi5cbiAvLyBUaGlzIGlzIGZvciBgYXNhcC5qc2Agb25seS5cbiAvLyBJdHMgbmFtZSB3aWxsIGJlIHBlcmlvZGljYWxseSByYW5kb21pemVkIHRvIGJyZWFrIGFueSBjb2RlIHRoYXQgZGVwZW5kcyBvblxuIC8vIC8vIGl0cyBleGlzdGVuY2UuXG4gLy8gcmF3QXNhcC5tYWtlUmVxdWVzdENhbGxGcm9tVGltZXIgPSBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXJcbiAvLyBBU0FQIHdhcyBvcmlnaW5hbGx5IGEgbmV4dFRpY2sgc2hpbSBpbmNsdWRlZCBpbiBRLiBUaGlzIHdhcyBmYWN0b3JlZCBvdXRcbiAvLyBpbnRvIHRoaXMgQVNBUCBwYWNrYWdlLiBJdCB3YXMgbGF0ZXIgYWRhcHRlZCB0byBSU1ZQIHdoaWNoIG1hZGUgZnVydGhlclxuIC8vIGFtZW5kbWVudHMuIFRoZXNlIGRlY2lzaW9ucywgcGFydGljdWxhcmx5IHRvIG1hcmdpbmFsaXplIE1lc3NhZ2VDaGFubmVsIGFuZFxuIC8vIHRvIGNhcHR1cmUgdGhlIE11dGF0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaW4gYSBjbG9zdXJlLCB3ZXJlIGludGVncmF0ZWRcbiAvLyBiYWNrIGludG8gQVNBUCBwcm9wZXIuXG4gLy8gaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vcnN2cC5qcy9ibG9iL2NkZGY3MjMyNTQ2YTljZjg1ODUyNGI3NWNkZTZmOWVkZjcyNjIwYTcvbGliL3JzdnAvYXNhcC5qc1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc2FwUXVldWUuanMubWFwIiwiLy8gYGNhbGxgLCBqdXN0IGxpa2UgYSBmdW5jdGlvbi5cbmV4cG9ydCBjbGFzcyBSYXdUYXNrIHtcbiAgICBjYWxsKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy50YXNrICYmIHRoaXMudGFzaygpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgfSBmaW5hbGx5e1xuICAgICAgICAgICAgdGhpcy50YXNrID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMucmVsZWFzZSh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihvbkVycm9yLCByZWxlYXNlKXtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gb25FcnJvcjtcbiAgICAgICAgdGhpcy5yZWxlYXNlID0gcmVsZWFzZTtcbiAgICAgICAgdGhpcy50YXNrID0gbnVsbDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhd1Rhc2suanMubWFwIiwiaW1wb3J0IHsgUmF3VGFzayB9IGZyb20gJy4vUmF3VGFzay5qcyc7XG5leHBvcnQgY2xhc3MgVGFza0ZhY3Rvcnkge1xuICAgIGNyZWF0ZSh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHRhc2tzID0gdGhpcy5mcmVlVGFza3M7XG4gICAgICAgIGNvbnN0IHQxID0gdGFza3MubGVuZ3RoID8gdGFza3MucG9wKCkgOiBuZXcgUmF3VGFzayh0aGlzLm9uRXJyb3IsICh0KT0+dGFza3NbdGFza3MubGVuZ3RoXSA9IHRcbiAgICAgICAgKTtcbiAgICAgICAgdDEudGFzayA9IHRhc2s7XG4gICAgICAgIHJldHVybiB0MTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iob25FcnJvcil7XG4gICAgICAgIHRoaXMub25FcnJvciA9IG9uRXJyb3I7XG4gICAgICAgIHRoaXMuZnJlZVRhc2tzID0gW107XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYXNrRmFjdG9yeS5qcy5tYXAiLCJpbXBvcnQgeyBBc2FwUXVldWUgfSBmcm9tICcuL0FzYXBRdWV1ZS5qcyc7XG5pbXBvcnQgeyBUYXNrRmFjdG9yeSB9IGZyb20gJy4vVGFza0ZhY3RvcnkuanMnO1xuY29uc3QgYXNhcFF1ZXVlID0gbmV3IEFzYXBRdWV1ZSgpO1xuY29uc3QgdGFza0ZhY3RvcnkgPSBuZXcgVGFza0ZhY3RvcnkoYXNhcFF1ZXVlLnJlZ2lzdGVyUGVuZGluZ0Vycm9yKTtcbi8qKlxuICogQ2FsbHMgYSB0YXNrIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgcmV0dXJuaW5nLCBpbiBpdHMgb3duIGV2ZW50LCB3aXRoIHByaW9yaXR5XG4gKiBvdmVyIG90aGVyIGV2ZW50cyBsaWtlIGFuaW1hdGlvbiwgcmVmbG93LCBhbmQgcmVwYWludC4gQW4gZXJyb3IgdGhyb3duIGZyb20gYW5cbiAqIGV2ZW50IHdpbGwgbm90IGludGVycnVwdCwgbm9yIGV2ZW4gc3Vic3RhbnRpYWxseSBzbG93IGRvd24gdGhlIHByb2Nlc3Npbmcgb2ZcbiAqIG90aGVyIGV2ZW50cywgYnV0IHdpbGwgYmUgcmF0aGVyIHBvc3Rwb25lZCB0byBhIGxvd2VyIHByaW9yaXR5IGV2ZW50LlxuICogQHBhcmFtIHt7Y2FsbH19IHRhc2sgQSBjYWxsYWJsZSBvYmplY3QsIHR5cGljYWxseSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm9cbiAqIGFyZ3VtZW50cy5cbiAqLyBleHBvcnQgZnVuY3Rpb24gYXNhcCh0YXNrKSB7XG4gICAgYXNhcFF1ZXVlLmVucXVldWVUYXNrKHRhc2tGYWN0b3J5LmNyZWF0ZSh0YXNrKSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzYXAuanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9hc2FwLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQXNhcFF1ZXVlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFza0ZhY3RvcnkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIFNhZmFyaSA2IGFuZCA2LjEgZm9yIGRlc2t0b3AsIGlQYWQsIGFuZCBpUGhvbmUgYXJlIHRoZSBvbmx5IGJyb3dzZXJzIHRoYXRcbi8vIGhhdmUgV2ViS2l0TXV0YXRpb25PYnNlcnZlciBidXQgbm90IHVuLXByZWZpeGVkIE11dGF0aW9uT2JzZXJ2ZXIuXG4vLyBNdXN0IHVzZSBgZ2xvYmFsYCBvciBgc2VsZmAgaW5zdGVhZCBvZiBgd2luZG93YCB0byB3b3JrIGluIGJvdGggZnJhbWVzIGFuZCB3ZWJcbi8vIHdvcmtlcnMuIGBnbG9iYWxgIGlzIGEgcHJvdmlzaW9uIG9mIEJyb3dzZXJpZnksIE1yLCBNcnMsIG9yIE1vcC5cbi8qIGdsb2JhbHMgc2VsZiAqLyBjb25zdCBzY29wZSA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogc2VsZjtcbmNvbnN0IEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID0gc2NvcGUuTXV0YXRpb25PYnNlcnZlciB8fCBzY29wZS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcihjYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgLy8gV2UgZGlzcGF0Y2ggYSB0aW1lb3V0IHdpdGggYSBzcGVjaWZpZWQgZGVsYXkgb2YgMCBmb3IgZW5naW5lcyB0aGF0XG4gICAgICAgIC8vIGNhbiByZWxpYWJseSBhY2NvbW1vZGF0ZSB0aGF0IHJlcXVlc3QuIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHNuYXBwZWRcbiAgICAgICAgLy8gdG8gYSA0IG1pbGlzZWNvbmQgZGVsYXksIGJ1dCBvbmNlIHdlJ3JlIGZsdXNoaW5nLCB0aGVyZSdzIG5vIGRlbGF5XG4gICAgICAgIC8vIGJldHdlZW4gZXZlbnRzLlxuICAgICAgICBjb25zdCB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChoYW5kbGVUaW1lciwgMCk7XG4gICAgICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHRoaXMgdGltZXIgZ2V0cyBmcmVxdWVudGx5IGRyb3BwZWQgaW4gRmlyZWZveFxuICAgICAgICAvLyB3b3JrZXJzLCB3ZSBlbmxpc3QgYW4gaW50ZXJ2YWwgaGFuZGxlIHRoYXQgd2lsbCB0cnkgdG8gZmlyZVxuICAgICAgICAvLyBhbiBldmVudCAyMCB0aW1lcyBwZXIgc2Vjb25kIHVudGlsIGl0IHN1Y2NlZWRzLlxuICAgICAgICBjb25zdCBpbnRlcnZhbEhhbmRsZSA9IHNldEludGVydmFsKGhhbmRsZVRpbWVyLCA1MCk7XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVRpbWVyKCkge1xuICAgICAgICAgICAgLy8gV2hpY2hldmVyIHRpbWVyIHN1Y2NlZWRzIHdpbGwgY2FuY2VsIGJvdGggdGltZXJzIGFuZFxuICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgY2FsbGJhY2suXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSGFuZGxlKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLy8gVG8gcmVxdWVzdCBhIGhpZ2ggcHJpb3JpdHkgZXZlbnQsIHdlIGluZHVjZSBhIG11dGF0aW9uIG9ic2VydmVyIGJ5IHRvZ2dsaW5nXG4vLyB0aGUgdGV4dCBvZiBhIHRleHQgbm9kZSBiZXR3ZWVuIFwiMVwiIGFuZCBcIi0xXCIuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbU11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spIHtcbiAgICBsZXQgdG9nZ2xlID0gMTtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBCcm93c2VyTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKG5vZGUsIHtcbiAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgdG9nZ2xlID0gLXRvZ2dsZTtcbiAgICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlO1xuICAgIH07XG59XG5leHBvcnQgY29uc3QgbWFrZVJlcXVlc3RDYWxsID0gdHlwZW9mIEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID09PSAnZnVuY3Rpb24nID8gLy8gcmVsaWFibHkgZXZlcnl3aGVyZSB0aGV5IGFyZSBpbXBsZW1lbnRlZC5cbi8vIFRoZXkgYXJlIGltcGxlbWVudGVkIGluIGFsbCBtb2Rlcm4gYnJvd3NlcnMuXG4vL1xuLy8gLSBBbmRyb2lkIDQtNC4zXG4vLyAtIENocm9tZSAyNi0zNFxuLy8gLSBGaXJlZm94IDE0LTI5XG4vLyAtIEludGVybmV0IEV4cGxvcmVyIDExXG4vLyAtIGlQYWQgU2FmYXJpIDYtNy4xXG4vLyAtIGlQaG9uZSBTYWZhcmkgNy03LjFcbi8vIC0gU2FmYXJpIDYtN1xubWFrZVJlcXVlc3RDYWxsRnJvbU11dGF0aW9uT2JzZXJ2ZXIgOiAvLyB0YXNrIHF1ZXVlLCBhcmUgaW1wbGVtZW50ZWQgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAsIFNhZmFyaSA1LjAtMSwgYW5kIE9wZXJhXG4vLyAxMS0xMiwgYW5kIGluIHdlYiB3b3JrZXJzIGluIG1hbnkgZW5naW5lcy5cbi8vIEFsdGhvdWdoIG1lc3NhZ2UgY2hhbm5lbHMgeWllbGQgdG8gYW55IHF1ZXVlZCByZW5kZXJpbmcgYW5kIElPIHRhc2tzLCB0aGV5XG4vLyB3b3VsZCBiZSBiZXR0ZXIgdGhhbiBpbXBvc2luZyB0aGUgNG1zIGRlbGF5IG9mIHRpbWVycy5cbi8vIEhvd2V2ZXIsIHRoZXkgZG8gbm90IHdvcmsgcmVsaWFibHkgaW4gSW50ZXJuZXQgRXhwbG9yZXIgb3IgU2FmYXJpLlxuLy8gSW50ZXJuZXQgRXhwbG9yZXIgMTAgaXMgdGhlIG9ubHkgYnJvd3NlciB0aGF0IGhhcyBzZXRJbW1lZGlhdGUgYnV0IGRvZXNcbi8vIG5vdCBoYXZlIE11dGF0aW9uT2JzZXJ2ZXJzLlxuLy8gQWx0aG91Z2ggc2V0SW1tZWRpYXRlIHlpZWxkcyB0byB0aGUgYnJvd3NlcidzIHJlbmRlcmVyLCBpdCB3b3VsZCBiZVxuLy8gcHJlZmVycmFibGUgdG8gZmFsbGluZyBiYWNrIHRvIHNldFRpbWVvdXQgc2luY2UgaXQgZG9lcyBub3QgaGF2ZVxuLy8gdGhlIG1pbmltdW0gNG1zIHBlbmFsdHkuXG4vLyBVbmZvcnR1bmF0ZWx5IHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAgTW9iaWxlIChhbmRcbi8vIERlc2t0b3AgdG8gYSBsZXNzZXIgZXh0ZW50KSB0aGF0IHJlbmRlcnMgYm90aCBzZXRJbW1lZGlhdGUgYW5kXG4vLyBNZXNzYWdlQ2hhbm5lbCB1c2VsZXNzIGZvciB0aGUgcHVycG9zZXMgb2YgQVNBUC5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvcS9pc3N1ZXMvMzk2XG4vLyBUaW1lcnMgYXJlIGltcGxlbWVudGVkIHVuaXZlcnNhbGx5LlxuLy8gV2UgZmFsbCBiYWNrIHRvIHRpbWVycyBpbiB3b3JrZXJzIGluIG1vc3QgZW5naW5lcywgYW5kIGluIGZvcmVncm91bmRcbi8vIGNvbnRleHRzIGluIHRoZSBmb2xsb3dpbmcgYnJvd3NlcnMuXG4vLyBIb3dldmVyLCBub3RlIHRoYXQgZXZlbiB0aGlzIHNpbXBsZSBjYXNlIHJlcXVpcmVzIG51YW5jZXMgdG8gb3BlcmF0ZSBpbiBhXG4vLyBicm9hZCBzcGVjdHJ1bSBvZiBicm93c2Vycy5cbi8vXG4vLyAtIEZpcmVmb3ggMy0xM1xuLy8gLSBJbnRlcm5ldCBFeHBsb3JlciA2LTlcbi8vIC0gaVBhZCBTYWZhcmkgNC4zXG4vLyAtIEx5bnggMi44Ljdcbm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcjtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFrZVJlcXVlc3RDYWxsLmpzLm1hcCIsImV4cG9ydCB7IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCIsIi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovIGV4cG9ydCBmdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoaXNQcm9kdWN0aW9uKCkpIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICsgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYXJnSW5kZXggPSAwO1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgfVxuICAgICAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDEgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICAgICAgO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1Byb2R1Y3Rpb24oKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudlsnTk9ERV9FTlYnXSA9PT0gJ3Byb2R1Y3Rpb24nO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyBzcmMvaW5kZXgudHNcbmV4cG9ydCAqIGZyb20gXCJyZWR1eFwiO1xuaW1wb3J0IHsgcHJvZHVjZSwgY3VycmVudCBhcyBjdXJyZW50MywgZnJlZXplLCBvcmlnaW5hbCBhcyBvcmlnaW5hbDIsIGlzRHJhZnQgYXMgaXNEcmFmdDUgfSBmcm9tIFwiaW1tZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdG9yLCBjcmVhdGVTZWxlY3RvckNyZWF0b3IgYXMgY3JlYXRlU2VsZWN0b3JDcmVhdG9yMiwgbHJ1TWVtb2l6ZSwgd2Vha01hcE1lbW9pemUgYXMgd2Vha01hcE1lbW9pemUyIH0gZnJvbSBcInJlc2VsZWN0XCI7XG5cbi8vIHNyYy9jcmVhdGVEcmFmdFNhZmVTZWxlY3Rvci50c1xuaW1wb3J0IHsgY3VycmVudCwgaXNEcmFmdCB9IGZyb20gXCJpbW1lclwiO1xuaW1wb3J0IHsgY3JlYXRlU2VsZWN0b3JDcmVhdG9yLCB3ZWFrTWFwTWVtb2l6ZSB9IGZyb20gXCJyZXNlbGVjdFwiO1xudmFyIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yQ3JlYXRvciA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IGNyZWF0ZVNlbGVjdG9yMiA9IGNyZWF0ZVNlbGVjdG9yQ3JlYXRvciguLi5hcmdzKTtcbiAgY29uc3QgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IyID0gT2JqZWN0LmFzc2lnbigoLi4uYXJnczIpID0+IHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yMiguLi5hcmdzMik7XG4gICAgY29uc3Qgd3JhcHBlZFNlbGVjdG9yID0gKHZhbHVlLCAuLi5yZXN0KSA9PiBzZWxlY3Rvcihpc0RyYWZ0KHZhbHVlKSA/IGN1cnJlbnQodmFsdWUpIDogdmFsdWUsIC4uLnJlc3QpO1xuICAgIE9iamVjdC5hc3NpZ24od3JhcHBlZFNlbGVjdG9yLCBzZWxlY3Rvcik7XG4gICAgcmV0dXJuIHdyYXBwZWRTZWxlY3RvcjtcbiAgfSwge1xuICAgIHdpdGhUeXBlczogKCkgPT4gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IyXG4gIH0pO1xuICByZXR1cm4gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IyO1xufTtcbnZhciBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvciA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvckNyZWF0b3Iod2Vha01hcE1lbW9pemUpO1xuXG4vLyBzcmMvY29uZmlndXJlU3RvcmUudHNcbmltcG9ydCB7IGFwcGx5TWlkZGxld2FyZSwgY3JlYXRlU3RvcmUsIGNvbXBvc2UgYXMgY29tcG9zZTIsIGNvbWJpbmVSZWR1Y2VycywgaXNQbGFpbk9iamVjdCBhcyBpc1BsYWluT2JqZWN0MiB9IGZyb20gXCJyZWR1eFwiO1xuXG4vLyBzcmMvZGV2dG9vbHNFeHRlbnNpb24udHNcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tIFwicmVkdXhcIjtcbnZhciBjb21wb3NlV2l0aERldlRvb2xzID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fID8gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXyA6IGZ1bmN0aW9uKCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09IFwib2JqZWN0XCIpIHJldHVybiBjb21wb3NlO1xuICByZXR1cm4gY29tcG9zZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufTtcbnZhciBkZXZUb29sc0VuaGFuY2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyA/IHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fIDogZnVuY3Rpb24oKSB7XG4gIHJldHVybiBmdW5jdGlvbihub29wMykge1xuICAgIHJldHVybiBub29wMztcbiAgfTtcbn07XG5cbi8vIHNyYy9nZXREZWZhdWx0TWlkZGxld2FyZS50c1xuaW1wb3J0IHsgdGh1bmsgYXMgdGh1bmtNaWRkbGV3YXJlLCB3aXRoRXh0cmFBcmd1bWVudCB9IGZyb20gXCJyZWR1eC10aHVua1wiO1xuXG4vLyBzcmMvY3JlYXRlQWN0aW9uLnRzXG5pbXBvcnQgeyBpc0FjdGlvbiB9IGZyb20gXCJyZWR1eFwiO1xuXG4vLyBzcmMvdHNIZWxwZXJzLnRzXG52YXIgaGFzTWF0Y2hGdW5jdGlvbiA9ICh2KSA9PiB7XG4gIHJldHVybiB2ICYmIHR5cGVvZiB2Lm1hdGNoID09PSBcImZ1bmN0aW9uXCI7XG59O1xuXG4vLyBzcmMvY3JlYXRlQWN0aW9uLnRzXG5mdW5jdGlvbiBjcmVhdGVBY3Rpb24odHlwZSwgcHJlcGFyZUFjdGlvbikge1xuICBmdW5jdGlvbiBhY3Rpb25DcmVhdG9yKC4uLmFyZ3MpIHtcbiAgICBpZiAocHJlcGFyZUFjdGlvbikge1xuICAgICAgbGV0IHByZXBhcmVkID0gcHJlcGFyZUFjdGlvbiguLi5hcmdzKTtcbiAgICAgIGlmICghcHJlcGFyZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMCkgOiBcInByZXBhcmVBY3Rpb24gZGlkIG5vdCByZXR1cm4gYW4gb2JqZWN0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgcGF5bG9hZDogcHJlcGFyZWQucGF5bG9hZCxcbiAgICAgICAgLi4uXCJtZXRhXCIgaW4gcHJlcGFyZWQgJiYge1xuICAgICAgICAgIG1ldGE6IHByZXBhcmVkLm1ldGFcbiAgICAgICAgfSxcbiAgICAgICAgLi4uXCJlcnJvclwiIGluIHByZXBhcmVkICYmIHtcbiAgICAgICAgICBlcnJvcjogcHJlcGFyZWQuZXJyb3JcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGUsXG4gICAgICBwYXlsb2FkOiBhcmdzWzBdXG4gICAgfTtcbiAgfVxuICBhY3Rpb25DcmVhdG9yLnRvU3RyaW5nID0gKCkgPT4gYCR7dHlwZX1gO1xuICBhY3Rpb25DcmVhdG9yLnR5cGUgPSB0eXBlO1xuICBhY3Rpb25DcmVhdG9yLm1hdGNoID0gKGFjdGlvbikgPT4gaXNBY3Rpb24oYWN0aW9uKSAmJiBhY3Rpb24udHlwZSA9PT0gdHlwZTtcbiAgcmV0dXJuIGFjdGlvbkNyZWF0b3I7XG59XG5mdW5jdGlvbiBpc0FjdGlvbkNyZWF0b3IoYWN0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSBcImZ1bmN0aW9uXCIgJiYgXCJ0eXBlXCIgaW4gYWN0aW9uICYmIC8vIGhhc01hdGNoRnVuY3Rpb24gb25seSB3YW50cyBNYXRjaGVycyBidXQgSSBkb24ndCBzZWUgdGhlIHBvaW50IGluIHJld3JpdGluZyBpdFxuICBoYXNNYXRjaEZ1bmN0aW9uKGFjdGlvbik7XG59XG5mdW5jdGlvbiBpc0ZTQShhY3Rpb24pIHtcbiAgcmV0dXJuIGlzQWN0aW9uKGFjdGlvbikgJiYgT2JqZWN0LmtleXMoYWN0aW9uKS5ldmVyeShpc1ZhbGlkS2V5KTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRLZXkoa2V5KSB7XG4gIHJldHVybiBbXCJ0eXBlXCIsIFwicGF5bG9hZFwiLCBcImVycm9yXCIsIFwibWV0YVwiXS5pbmRleE9mKGtleSkgPiAtMTtcbn1cblxuLy8gc3JjL2FjdGlvbkNyZWF0b3JJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBnZXRNZXNzYWdlKHR5cGUpIHtcbiAgY29uc3Qgc3BsaXRUeXBlID0gdHlwZSA/IGAke3R5cGV9YC5zcGxpdChcIi9cIikgOiBbXTtcbiAgY29uc3QgYWN0aW9uTmFtZSA9IHNwbGl0VHlwZVtzcGxpdFR5cGUubGVuZ3RoIC0gMV0gfHwgXCJhY3Rpb25DcmVhdG9yXCI7XG4gIHJldHVybiBgRGV0ZWN0ZWQgYW4gYWN0aW9uIGNyZWF0b3Igd2l0aCB0eXBlIFwiJHt0eXBlIHx8IFwidW5rbm93blwifVwiIGJlaW5nIGRpc3BhdGNoZWQuIFxuTWFrZSBzdXJlIHlvdSdyZSBjYWxsaW5nIHRoZSBhY3Rpb24gY3JlYXRvciBiZWZvcmUgZGlzcGF0Y2hpbmcsIGkuZS4gXFxgZGlzcGF0Y2goJHthY3Rpb25OYW1lfSgpKVxcYCBpbnN0ZWFkIG9mIFxcYGRpc3BhdGNoKCR7YWN0aW9uTmFtZX0pXFxgLiBUaGlzIGlzIG5lY2Vzc2FyeSBldmVuIGlmIHRoZSBhY3Rpb24gaGFzIG5vIHBheWxvYWQuYDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFjdGlvbkNyZWF0b3JJbnZhcmlhbnRNaWRkbGV3YXJlKG9wdGlvbnMgPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiBuZXh0KGFjdGlvbik7XG4gIH1cbiAgY29uc3Qge1xuICAgIGlzQWN0aW9uQ3JlYXRvcjogaXNBY3Rpb25DcmVhdG9yMiA9IGlzQWN0aW9uQ3JlYXRvclxuICB9ID0gb3B0aW9ucztcbiAgcmV0dXJuICgpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgaWYgKGlzQWN0aW9uQ3JlYXRvcjIoYWN0aW9uKSkge1xuICAgICAgY29uc29sZS53YXJuKGdldE1lc3NhZ2UoYWN0aW9uLnR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgfTtcbn1cblxuLy8gc3JjL3V0aWxzLnRzXG5pbXBvcnQgeyBwcm9kdWNlIGFzIGNyZWF0ZU5leHRTdGF0ZSwgaXNEcmFmdGFibGUgfSBmcm9tIFwiaW1tZXJcIjtcbmZ1bmN0aW9uIGdldFRpbWVNZWFzdXJlVXRpbHMobWF4RGVsYXksIGZuTmFtZSkge1xuICBsZXQgZWxhcHNlZCA9IDA7XG4gIHJldHVybiB7XG4gICAgbWVhc3VyZVRpbWUoZm4pIHtcbiAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBEYXRlLm5vdygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjb25zdCBmaW5pc2hlZCA9IERhdGUubm93KCk7XG4gICAgICAgIGVsYXBzZWQgKz0gZmluaXNoZWQgLSBzdGFydGVkO1xuICAgICAgfVxuICAgIH0sXG4gICAgd2FybklmRXhjZWVkZWQoKSB7XG4gICAgICBpZiAoZWxhcHNlZCA+IG1heERlbGF5KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHtmbk5hbWV9IHRvb2sgJHtlbGFwc2VkfW1zLCB3aGljaCBpcyBtb3JlIHRoYW4gdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICR7bWF4RGVsYXl9bXMuIFxuSWYgeW91ciBzdGF0ZSBvciBhY3Rpb25zIGFyZSB2ZXJ5IGxhcmdlLCB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSB0aGUgbWlkZGxld2FyZSBhcyBpdCBtaWdodCBjYXVzZSB0b28gbXVjaCBvZiBhIHNsb3dkb3duIGluIGRldmVsb3BtZW50IG1vZGUuIFNlZSBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL2FwaS9nZXREZWZhdWx0TWlkZGxld2FyZSBmb3IgaW5zdHJ1Y3Rpb25zLlxuSXQgaXMgZGlzYWJsZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMsIHNvIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoYXQuYCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZmluZChpdGVyYWJsZSwgY29tcGFyYXRvcikge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGl0ZXJhYmxlKSB7XG4gICAgaWYgKGNvbXBhcmF0b3IoZW50cnkpKSB7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2b2lkIDA7XG59XG52YXIgVHVwbGUgPSBjbGFzcyBfVHVwbGUgZXh0ZW5kcyBBcnJheSB7XG4gIGNvbnN0cnVjdG9yKC4uLml0ZW1zKSB7XG4gICAgc3VwZXIoLi4uaXRlbXMpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBfVHVwbGUucHJvdG90eXBlKTtcbiAgfVxuICBzdGF0aWMgZ2V0IFtTeW1ib2wuc3BlY2llc10oKSB7XG4gICAgcmV0dXJuIF9UdXBsZTtcbiAgfVxuICBjb25jYXQoLi4uYXJyKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNvbmNhdC5hcHBseSh0aGlzLCBhcnIpO1xuICB9XG4gIHByZXBlbmQoLi4uYXJyKSB7XG4gICAgaWYgKGFyci5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcnJbMF0pKSB7XG4gICAgICByZXR1cm4gbmV3IF9UdXBsZSguLi5hcnJbMF0uY29uY2F0KHRoaXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBfVHVwbGUoLi4uYXJyLmNvbmNhdCh0aGlzKSk7XG4gIH1cbn07XG5mdW5jdGlvbiBmcmVlemVEcmFmdGFibGUodmFsKSB7XG4gIHJldHVybiBpc0RyYWZ0YWJsZSh2YWwpID8gY3JlYXRlTmV4dFN0YXRlKHZhbCwgKCkgPT4ge1xuICB9KSA6IHZhbDtcbn1cbmZ1bmN0aW9uIGVtcGxhY2UobWFwLCBrZXksIGhhbmRsZXIpIHtcbiAgaWYgKG1hcC5oYXMoa2V5KSkge1xuICAgIGxldCB2YWx1ZSA9IG1hcC5nZXQoa2V5KTtcbiAgICBpZiAoaGFuZGxlci51cGRhdGUpIHtcbiAgICAgIHZhbHVlID0gaGFuZGxlci51cGRhdGUodmFsdWUsIGtleSwgbWFwKTtcbiAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoIWhhbmRsZXIuaW5zZXJ0KSB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBcIk5vIGluc2VydCBwcm92aWRlZCBmb3Iga2V5IG5vdCBhbHJlYWR5IGluIG1hcFwiKTtcbiAgY29uc3QgaW5zZXJ0ZWQgPSBoYW5kbGVyLmluc2VydChrZXksIG1hcCk7XG4gIG1hcC5zZXQoa2V5LCBpbnNlcnRlZCk7XG4gIHJldHVybiBpbnNlcnRlZDtcbn1cblxuLy8gc3JjL2ltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gaXNJbW11dGFibGVEZWZhdWx0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT0gbnVsbCB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpO1xufVxuZnVuY3Rpb24gdHJhY2tGb3JNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCBvYmopIHtcbiAgY29uc3QgdHJhY2tlZFByb3BlcnRpZXMgPSB0cmFja1Byb3BlcnRpZXMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCBvYmopO1xuICByZXR1cm4ge1xuICAgIGRldGVjdE11dGF0aW9ucygpIHtcbiAgICAgIHJldHVybiBkZXRlY3RNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCB0cmFja2VkUHJvcGVydGllcywgb2JqKTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiB0cmFja1Byb3BlcnRpZXMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzID0gW10sIG9iaiwgcGF0aCA9IFwiXCIsIGNoZWNrZWRPYmplY3RzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkge1xuICBjb25zdCB0cmFja2VkID0ge1xuICAgIHZhbHVlOiBvYmpcbiAgfTtcbiAgaWYgKCFpc0ltbXV0YWJsZShvYmopICYmICFjaGVja2VkT2JqZWN0cy5oYXMob2JqKSkge1xuICAgIGNoZWNrZWRPYmplY3RzLmFkZChvYmopO1xuICAgIHRyYWNrZWQuY2hpbGRyZW4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGggPyBwYXRoICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgICBpZiAoaWdub3JlUGF0aHMubGVuZ3RoICYmIGlnbm9yZVBhdGhzLmluZGV4T2YoY2hpbGRQYXRoKSAhPT0gLTEpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0cmFja2VkLmNoaWxkcmVuW2tleV0gPSB0cmFja1Byb3BlcnRpZXMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCBvYmpba2V5XSwgY2hpbGRQYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRyYWNrZWQ7XG59XG5mdW5jdGlvbiBkZXRlY3RNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZWRQYXRocyA9IFtdLCB0cmFja2VkUHJvcGVydHksIG9iaiwgc2FtZVBhcmVudFJlZiA9IGZhbHNlLCBwYXRoID0gXCJcIikge1xuICBjb25zdCBwcmV2T2JqID0gdHJhY2tlZFByb3BlcnR5ID8gdHJhY2tlZFByb3BlcnR5LnZhbHVlIDogdm9pZCAwO1xuICBjb25zdCBzYW1lUmVmID0gcHJldk9iaiA9PT0gb2JqO1xuICBpZiAoc2FtZVBhcmVudFJlZiAmJiAhc2FtZVJlZiAmJiAhTnVtYmVyLmlzTmFOKG9iaikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2FzTXV0YXRlZDogdHJ1ZSxcbiAgICAgIHBhdGhcbiAgICB9O1xuICB9XG4gIGlmIChpc0ltbXV0YWJsZShwcmV2T2JqKSB8fCBpc0ltbXV0YWJsZShvYmopKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhc011dGF0ZWQ6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjb25zdCBrZXlzVG9EZXRlY3QgPSB7fTtcbiAgZm9yIChsZXQga2V5IGluIHRyYWNrZWRQcm9wZXJ0eS5jaGlsZHJlbikge1xuICAgIGtleXNUb0RldGVjdFtrZXldID0gdHJ1ZTtcbiAgfVxuICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAga2V5c1RvRGV0ZWN0W2tleV0gPSB0cnVlO1xuICB9XG4gIGNvbnN0IGhhc0lnbm9yZWRQYXRocyA9IGlnbm9yZWRQYXRocy5sZW5ndGggPiAwO1xuICBmb3IgKGxldCBrZXkgaW4ga2V5c1RvRGV0ZWN0KSB7XG4gICAgY29uc3QgbmVzdGVkUGF0aCA9IHBhdGggPyBwYXRoICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgaWYgKGhhc0lnbm9yZWRQYXRocykge1xuICAgICAgY29uc3QgaGFzTWF0Y2hlcyA9IGlnbm9yZWRQYXRocy5zb21lKChpZ25vcmVkKSA9PiB7XG4gICAgICAgIGlmIChpZ25vcmVkIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgcmV0dXJuIGlnbm9yZWQudGVzdChuZXN0ZWRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVzdGVkUGF0aCA9PT0gaWdub3JlZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGhhc01hdGNoZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlZFBhdGhzLCB0cmFja2VkUHJvcGVydHkuY2hpbGRyZW5ba2V5XSwgb2JqW2tleV0sIHNhbWVSZWYsIG5lc3RlZFBhdGgpO1xuICAgIGlmIChyZXN1bHQud2FzTXV0YXRlZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB3YXNNdXRhdGVkOiBmYWxzZVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKG9wdGlvbnMgPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiBuZXh0KGFjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHN0cmluZ2lmeTIgPSBmdW5jdGlvbihvYmosIHNlcmlhbGl6ZXIsIGluZGVudCwgZGVjeWNsZXIpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIGdldFNlcmlhbGl6ZTIoc2VyaWFsaXplciwgZGVjeWNsZXIpLCBpbmRlbnQpO1xuICAgIH0sIGdldFNlcmlhbGl6ZTIgPSBmdW5jdGlvbihzZXJpYWxpemVyLCBkZWN5Y2xlcikge1xuICAgICAgbGV0IHN0YWNrID0gW10sIGtleXMgPSBbXTtcbiAgICAgIGlmICghZGVjeWNsZXIpIGRlY3ljbGVyID0gZnVuY3Rpb24oXywgdmFsdWUpIHtcbiAgICAgICAgaWYgKHN0YWNrWzBdID09PSB2YWx1ZSkgcmV0dXJuIFwiW0NpcmN1bGFyIH5dXCI7XG4gICAgICAgIHJldHVybiBcIltDaXJjdWxhciB+LlwiICsga2V5cy5zbGljZSgwLCBzdGFjay5pbmRleE9mKHZhbHVlKSkuam9pbihcIi5cIikgKyBcIl1cIjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciB0aGlzUG9zID0gc3RhY2suaW5kZXhPZih0aGlzKTtcbiAgICAgICAgICB+dGhpc1BvcyA/IHN0YWNrLnNwbGljZSh0aGlzUG9zICsgMSkgOiBzdGFjay5wdXNoKHRoaXMpO1xuICAgICAgICAgIH50aGlzUG9zID8ga2V5cy5zcGxpY2UodGhpc1BvcywgSW5maW5pdHksIGtleSkgOiBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICBpZiAofnN0YWNrLmluZGV4T2YodmFsdWUpKSB2YWx1ZSA9IGRlY3ljbGVyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBzdGFjay5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIgPT0gbnVsbCA/IHZhbHVlIDogc2VyaWFsaXplci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBzdHJpbmdpZnkgPSBzdHJpbmdpZnkyLCBnZXRTZXJpYWxpemUgPSBnZXRTZXJpYWxpemUyO1xuICAgIGxldCB7XG4gICAgICBpc0ltbXV0YWJsZSA9IGlzSW1tdXRhYmxlRGVmYXVsdCxcbiAgICAgIGlnbm9yZWRQYXRocyxcbiAgICAgIHdhcm5BZnRlciA9IDMyXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgdHJhY2sgPSB0cmFja0Zvck11dGF0aW9ucy5iaW5kKG51bGwsIGlzSW1tdXRhYmxlLCBpZ25vcmVkUGF0aHMpO1xuICAgIHJldHVybiAoe1xuICAgICAgZ2V0U3RhdGVcbiAgICB9KSA9PiB7XG4gICAgICBsZXQgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgbGV0IHRyYWNrZXIgPSB0cmFjayhzdGF0ZSk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgcmV0dXJuIChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lYXN1cmVVdGlscyA9IGdldFRpbWVNZWFzdXJlVXRpbHMod2FybkFmdGVyLCBcIkltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZVwiKTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgcmVzdWx0ID0gdHJhY2tlci5kZXRlY3RNdXRhdGlvbnMoKTtcbiAgICAgICAgICB0cmFja2VyID0gdHJhY2soc3RhdGUpO1xuICAgICAgICAgIGlmIChyZXN1bHQud2FzTXV0YXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTkpIDogYEEgc3RhdGUgbXV0YXRpb24gd2FzIGRldGVjdGVkIGJldHdlZW4gZGlzcGF0Y2hlcywgaW4gdGhlIHBhdGggJyR7cmVzdWx0LnBhdGggfHwgXCJcIn0nLiAgVGhpcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yLiAoaHR0cHM6Ly9yZWR1eC5qcy5vcmcvc3R5bGUtZ3VpZGUvc3R5bGUtZ3VpZGUjZG8tbm90LW11dGF0ZS1zdGF0ZSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkaXNwYXRjaGVkQWN0aW9uID0gbmV4dChhY3Rpb24pO1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICByZXN1bHQgPSB0cmFja2VyLmRldGVjdE11dGF0aW9ucygpO1xuICAgICAgICAgIHRyYWNrZXIgPSB0cmFjayhzdGF0ZSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC53YXNNdXRhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyMCkgOiBgQSBzdGF0ZSBtdXRhdGlvbiB3YXMgZGV0ZWN0ZWQgaW5zaWRlIGEgZGlzcGF0Y2gsIGluIHRoZSBwYXRoOiAke3Jlc3VsdC5wYXRoIHx8IFwiXCJ9LiBUYWtlIGEgbG9vayBhdCB0aGUgcmVkdWNlcihzKSBoYW5kbGluZyB0aGUgYWN0aW9uICR7c3RyaW5naWZ5MihhY3Rpb24pfS4gKGh0dHBzOi8vcmVkdXguanMub3JnL3N0eWxlLWd1aWRlL3N0eWxlLWd1aWRlI2RvLW5vdC1tdXRhdGUtc3RhdGUpYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLndhcm5JZkV4Y2VlZGVkKCk7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaGVkQWN0aW9uO1xuICAgICAgfTtcbiAgICB9O1xuICB9XG59XG5cbi8vIHNyYy9zZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUudHNcbmltcG9ydCB7IGlzQWN0aW9uIGFzIGlzQWN0aW9uMiwgaXNQbGFpbk9iamVjdCB9IGZyb20gXCJyZWR1eFwiO1xuZnVuY3Rpb24gaXNQbGFpbih2YWwpIHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCB0eXBlID09PSBcInN0cmluZ1wiIHx8IHR5cGUgPT09IFwiYm9vbGVhblwiIHx8IHR5cGUgPT09IFwibnVtYmVyXCIgfHwgQXJyYXkuaXNBcnJheSh2YWwpIHx8IGlzUGxhaW5PYmplY3QodmFsKTtcbn1cbmZ1bmN0aW9uIGZpbmROb25TZXJpYWxpemFibGVWYWx1ZSh2YWx1ZSwgcGF0aCA9IFwiXCIsIGlzU2VyaWFsaXphYmxlID0gaXNQbGFpbiwgZ2V0RW50cmllcywgaWdub3JlZFBhdGhzID0gW10sIGNhY2hlKSB7XG4gIGxldCBmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZTtcbiAgaWYgKCFpc1NlcmlhbGl6YWJsZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5UGF0aDogcGF0aCB8fCBcIjxyb290PlwiLFxuICAgICAgdmFsdWVcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGNhY2hlPy5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGVudHJpZXMgPSBnZXRFbnRyaWVzICE9IG51bGwgPyBnZXRFbnRyaWVzKHZhbHVlKSA6IE9iamVjdC5lbnRyaWVzKHZhbHVlKTtcbiAgY29uc3QgaGFzSWdub3JlZFBhdGhzID0gaWdub3JlZFBhdGhzLmxlbmd0aCA+IDA7XG4gIGZvciAoY29uc3QgW2tleSwgbmVzdGVkVmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBuZXN0ZWRQYXRoID0gcGF0aCA/IHBhdGggKyBcIi5cIiArIGtleSA6IGtleTtcbiAgICBpZiAoaGFzSWdub3JlZFBhdGhzKSB7XG4gICAgICBjb25zdCBoYXNNYXRjaGVzID0gaWdub3JlZFBhdGhzLnNvbWUoKGlnbm9yZWQpID0+IHtcbiAgICAgICAgaWYgKGlnbm9yZWQgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICByZXR1cm4gaWdub3JlZC50ZXN0KG5lc3RlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXN0ZWRQYXRoID09PSBpZ25vcmVkO1xuICAgICAgfSk7XG4gICAgICBpZiAoaGFzTWF0Y2hlcykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpc1NlcmlhbGl6YWJsZShuZXN0ZWRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleVBhdGg6IG5lc3RlZFBhdGgsXG4gICAgICAgIHZhbHVlOiBuZXN0ZWRWYWx1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuZXN0ZWRWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZm91bmROZXN0ZWRTZXJpYWxpemFibGUgPSBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUobmVzdGVkVmFsdWUsIG5lc3RlZFBhdGgsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkUGF0aHMsIGNhY2hlKTtcbiAgICAgIGlmIChmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZSkge1xuICAgICAgICByZXR1cm4gZm91bmROZXN0ZWRTZXJpYWxpemFibGU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjYWNoZSAmJiBpc05lc3RlZEZyb3plbih2YWx1ZSkpIGNhY2hlLmFkZCh2YWx1ZSk7XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzTmVzdGVkRnJvemVuKHZhbHVlKSB7XG4gIGlmICghT2JqZWN0LmlzRnJvemVuKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IG5lc3RlZFZhbHVlIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiBuZXN0ZWRWYWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBuZXN0ZWRWYWx1ZSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgaWYgKCFpc05lc3RlZEZyb3plbihuZXN0ZWRWYWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4gbmV4dChhY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHtcbiAgICAgIGlzU2VyaWFsaXphYmxlID0gaXNQbGFpbixcbiAgICAgIGdldEVudHJpZXMsXG4gICAgICBpZ25vcmVkQWN0aW9ucyA9IFtdLFxuICAgICAgaWdub3JlZEFjdGlvblBhdGhzID0gW1wibWV0YS5hcmdcIiwgXCJtZXRhLmJhc2VRdWVyeU1ldGFcIl0sXG4gICAgICBpZ25vcmVkUGF0aHMgPSBbXSxcbiAgICAgIHdhcm5BZnRlciA9IDMyLFxuICAgICAgaWdub3JlU3RhdGUgPSBmYWxzZSxcbiAgICAgIGlnbm9yZUFjdGlvbnMgPSBmYWxzZSxcbiAgICAgIGRpc2FibGVDYWNoZSA9IGZhbHNlXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY2FjaGUgPSAhZGlzYWJsZUNhY2hlICYmIFdlYWtTZXQgPyAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gKHN0b3JlQVBJKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgICAgaWYgKCFpc0FjdGlvbjIoYWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgY29uc3QgbWVhc3VyZVV0aWxzID0gZ2V0VGltZU1lYXN1cmVVdGlscyh3YXJuQWZ0ZXIsIFwiU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlXCIpO1xuICAgICAgaWYgKCFpZ25vcmVBY3Rpb25zICYmICEoaWdub3JlZEFjdGlvbnMubGVuZ3RoICYmIGlnbm9yZWRBY3Rpb25zLmluZGV4T2YoYWN0aW9uLnR5cGUpICE9PSAtMSkpIHtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlID0gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKGFjdGlvbiwgXCJcIiwgaXNTZXJpYWxpemFibGUsIGdldEVudHJpZXMsIGlnbm9yZWRBY3Rpb25QYXRocywgY2FjaGUpO1xuICAgICAgICAgIGlmIChmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGtleVBhdGgsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9ID0gZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEEgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZSB3YXMgZGV0ZWN0ZWQgaW4gYW4gYWN0aW9uLCBpbiB0aGUgcGF0aDogXFxgJHtrZXlQYXRofVxcYC4gVmFsdWU6YCwgdmFsdWUsIFwiXFxuVGFrZSBhIGxvb2sgYXQgdGhlIGxvZ2ljIHRoYXQgZGlzcGF0Y2hlZCB0aGlzIGFjdGlvbjogXCIsIGFjdGlvbiwgXCJcXG4oU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2ZhcS9hY3Rpb25zI3doeS1zaG91bGQtdHlwZS1iZS1hLXN0cmluZy1vci1hdC1sZWFzdC1zZXJpYWxpemFibGUtd2h5LXNob3VsZC1teS1hY3Rpb24tdHlwZXMtYmUtY29uc3RhbnRzKVwiLCBcIlxcbihUbyBhbGxvdyBub24tc2VyaWFsaXphYmxlIHZhbHVlcyBzZWU6IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvdXNhZ2UvdXNhZ2UtZ3VpZGUjd29ya2luZy13aXRoLW5vbi1zZXJpYWxpemFibGUtZGF0YSlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghaWdub3JlU3RhdGUpIHtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JlQVBJLmdldFN0YXRlKCk7XG4gICAgICAgICAgY29uc3QgZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlID0gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKHN0YXRlLCBcIlwiLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZFBhdGhzLCBjYWNoZSk7XG4gICAgICAgICAgaWYgKGZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBrZXlQYXRoLFxuICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSA9IGZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEEgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIHN0YXRlLCBpbiB0aGUgcGF0aDogXFxgJHtrZXlQYXRofVxcYC4gVmFsdWU6YCwgdmFsdWUsIGBcblRha2UgYSBsb29rIGF0IHRoZSByZWR1Y2VyKHMpIGhhbmRsaW5nIHRoaXMgYWN0aW9uIHR5cGU6ICR7YWN0aW9uLnR5cGV9LlxuKFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9mYXEvb3JnYW5pemluZy1zdGF0ZSNjYW4taS1wdXQtZnVuY3Rpb25zLXByb21pc2VzLW9yLW90aGVyLW5vbi1zZXJpYWxpemFibGUtaXRlbXMtaW4tbXktc3RvcmUtc3RhdGUpYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLndhcm5JZkV4Y2VlZGVkKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cbn1cblxuLy8gc3JjL2dldERlZmF1bHRNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBpc0Jvb2xlYW4oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwiYm9vbGVhblwiO1xufVxudmFyIGJ1aWxkR2V0RGVmYXVsdE1pZGRsZXdhcmUgPSAoKSA9PiBmdW5jdGlvbiBnZXREZWZhdWx0TWlkZGxld2FyZShvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICB0aHVuayA9IHRydWUsXG4gICAgaW1tdXRhYmxlQ2hlY2sgPSB0cnVlLFxuICAgIHNlcmlhbGl6YWJsZUNoZWNrID0gdHJ1ZSxcbiAgICBhY3Rpb25DcmVhdG9yQ2hlY2sgPSB0cnVlXG4gIH0gPSBvcHRpb25zID8/IHt9O1xuICBsZXQgbWlkZGxld2FyZUFycmF5ID0gbmV3IFR1cGxlKCk7XG4gIGlmICh0aHVuaykge1xuICAgIGlmIChpc0Jvb2xlYW4odGh1bmspKSB7XG4gICAgICBtaWRkbGV3YXJlQXJyYXkucHVzaCh0aHVua01pZGRsZXdhcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaWRkbGV3YXJlQXJyYXkucHVzaCh3aXRoRXh0cmFBcmd1bWVudCh0aHVuay5leHRyYUFyZ3VtZW50KSk7XG4gICAgfVxuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAoaW1tdXRhYmxlQ2hlY2spIHtcbiAgICAgIGxldCBpbW11dGFibGVPcHRpb25zID0ge307XG4gICAgICBpZiAoIWlzQm9vbGVhbihpbW11dGFibGVDaGVjaykpIHtcbiAgICAgICAgaW1tdXRhYmxlT3B0aW9ucyA9IGltbXV0YWJsZUNoZWNrO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZUFycmF5LnVuc2hpZnQoY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKGltbXV0YWJsZU9wdGlvbnMpKTtcbiAgICB9XG4gICAgaWYgKHNlcmlhbGl6YWJsZUNoZWNrKSB7XG4gICAgICBsZXQgc2VyaWFsaXphYmxlT3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKCFpc0Jvb2xlYW4oc2VyaWFsaXphYmxlQ2hlY2spKSB7XG4gICAgICAgIHNlcmlhbGl6YWJsZU9wdGlvbnMgPSBzZXJpYWxpemFibGVDaGVjaztcbiAgICAgIH1cbiAgICAgIG1pZGRsZXdhcmVBcnJheS5wdXNoKGNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShzZXJpYWxpemFibGVPcHRpb25zKSk7XG4gICAgfVxuICAgIGlmIChhY3Rpb25DcmVhdG9yQ2hlY2spIHtcbiAgICAgIGxldCBhY3Rpb25DcmVhdG9yT3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKCFpc0Jvb2xlYW4oYWN0aW9uQ3JlYXRvckNoZWNrKSkge1xuICAgICAgICBhY3Rpb25DcmVhdG9yT3B0aW9ucyA9IGFjdGlvbkNyZWF0b3JDaGVjaztcbiAgICAgIH1cbiAgICAgIG1pZGRsZXdhcmVBcnJheS51bnNoaWZ0KGNyZWF0ZUFjdGlvbkNyZWF0b3JJbnZhcmlhbnRNaWRkbGV3YXJlKGFjdGlvbkNyZWF0b3JPcHRpb25zKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtaWRkbGV3YXJlQXJyYXk7XG59O1xuXG4vLyBzcmMvYXV0b0JhdGNoRW5oYW5jZXIudHNcbnZhciBTSE9VTERfQVVUT0JBVENIID0gXCJSVEtfYXV0b0JhdGNoXCI7XG52YXIgcHJlcGFyZUF1dG9CYXRjaGVkID0gKCkgPT4gKHBheWxvYWQpID0+ICh7XG4gIHBheWxvYWQsXG4gIG1ldGE6IHtcbiAgICBbU0hPVUxEX0FVVE9CQVRDSF06IHRydWVcbiAgfVxufSk7XG52YXIgY3JlYXRlUXVldWVXaXRoVGltZXIgPSAodGltZW91dCkgPT4ge1xuICByZXR1cm4gKG5vdGlmeSkgPT4ge1xuICAgIHNldFRpbWVvdXQobm90aWZ5LCB0aW1lb3V0KTtcbiAgfTtcbn07XG52YXIgckFGID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA6IGNyZWF0ZVF1ZXVlV2l0aFRpbWVyKDEwKTtcbnZhciBhdXRvQmF0Y2hFbmhhbmNlciA9IChvcHRpb25zID0ge1xuICB0eXBlOiBcInJhZlwiXG59KSA9PiAobmV4dCkgPT4gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3Qgc3RvcmUgPSBuZXh0KC4uLmFyZ3MpO1xuICBsZXQgbm90aWZ5aW5nID0gdHJ1ZTtcbiAgbGV0IHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrID0gZmFsc2U7XG4gIGxldCBub3RpZmljYXRpb25RdWV1ZWQgPSBmYWxzZTtcbiAgY29uc3QgbGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3QgcXVldWVDYWxsYmFjayA9IG9wdGlvbnMudHlwZSA9PT0gXCJ0aWNrXCIgPyBxdWV1ZU1pY3JvdGFzayA6IG9wdGlvbnMudHlwZSA9PT0gXCJyYWZcIiA/IHJBRiA6IG9wdGlvbnMudHlwZSA9PT0gXCJjYWxsYmFja1wiID8gb3B0aW9ucy5xdWV1ZU5vdGlmaWNhdGlvbiA6IGNyZWF0ZVF1ZXVlV2l0aFRpbWVyKG9wdGlvbnMudGltZW91dCk7XG4gIGNvbnN0IG5vdGlmeUxpc3RlbmVycyA9ICgpID0+IHtcbiAgICBub3RpZmljYXRpb25RdWV1ZWQgPSBmYWxzZTtcbiAgICBpZiAoc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2spIHtcbiAgICAgIHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrID0gZmFsc2U7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobCkgPT4gbCgpKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdG9yZSwge1xuICAgIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGBzdG9yZS5zdWJzY3JpYmVgIG1ldGhvZCB0byBrZWVwIG9yaWdpbmFsIGxpc3RlbmVyc1xuICAgIC8vIGZyb20gcnVubmluZyBpZiB3ZSdyZSBkZWxheWluZyBub3RpZmljYXRpb25zXG4gICAgc3Vic2NyaWJlKGxpc3RlbmVyMikge1xuICAgICAgY29uc3Qgd3JhcHBlZExpc3RlbmVyID0gKCkgPT4gbm90aWZ5aW5nICYmIGxpc3RlbmVyMigpO1xuICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUod3JhcHBlZExpc3RlbmVyKTtcbiAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIyKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIyKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICAvLyBPdmVycmlkZSB0aGUgYmFzZSBgc3RvcmUuZGlzcGF0Y2hgIG1ldGhvZCBzbyB0aGF0IHdlIGNhbiBjaGVjayBhY3Rpb25zXG4gICAgLy8gZm9yIHRoZSBgc2hvdWxkQXV0b0JhdGNoYCBmbGFnIGFuZCBkZXRlcm1pbmUgaWYgYmF0Y2hpbmcgaXMgYWN0aXZlXG4gICAgZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBub3RpZnlpbmcgPSAhYWN0aW9uPy5tZXRhPy5bU0hPVUxEX0FVVE9CQVRDSF07XG4gICAgICAgIHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrID0gIW5vdGlmeWluZztcbiAgICAgICAgaWYgKHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrKSB7XG4gICAgICAgICAgaWYgKCFub3RpZmljYXRpb25RdWV1ZWQpIHtcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvblF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICBxdWV1ZUNhbGxiYWNrKG5vdGlmeUxpc3RlbmVycyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdG9yZS5kaXNwYXRjaChhY3Rpb24pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgbm90aWZ5aW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLy8gc3JjL2dldERlZmF1bHRFbmhhbmNlcnMudHNcbnZhciBidWlsZEdldERlZmF1bHRFbmhhbmNlcnMgPSAobWlkZGxld2FyZUVuaGFuY2VyKSA9PiBmdW5jdGlvbiBnZXREZWZhdWx0RW5oYW5jZXJzKG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIGF1dG9CYXRjaCA9IHRydWVcbiAgfSA9IG9wdGlvbnMgPz8ge307XG4gIGxldCBlbmhhbmNlckFycmF5ID0gbmV3IFR1cGxlKG1pZGRsZXdhcmVFbmhhbmNlcik7XG4gIGlmIChhdXRvQmF0Y2gpIHtcbiAgICBlbmhhbmNlckFycmF5LnB1c2goYXV0b0JhdGNoRW5oYW5jZXIodHlwZW9mIGF1dG9CYXRjaCA9PT0gXCJvYmplY3RcIiA/IGF1dG9CYXRjaCA6IHZvaWQgMCkpO1xuICB9XG4gIHJldHVybiBlbmhhbmNlckFycmF5O1xufTtcblxuLy8gc3JjL2NvbmZpZ3VyZVN0b3JlLnRzXG5mdW5jdGlvbiBjb25maWd1cmVTdG9yZShvcHRpb25zKSB7XG4gIGNvbnN0IGdldERlZmF1bHRNaWRkbGV3YXJlID0gYnVpbGRHZXREZWZhdWx0TWlkZGxld2FyZSgpO1xuICBjb25zdCB7XG4gICAgcmVkdWNlciA9IHZvaWQgMCxcbiAgICBtaWRkbGV3YXJlLFxuICAgIGRldlRvb2xzID0gdHJ1ZSxcbiAgICBwcmVsb2FkZWRTdGF0ZSA9IHZvaWQgMCxcbiAgICBlbmhhbmNlcnMgPSB2b2lkIDBcbiAgfSA9IG9wdGlvbnMgfHwge307XG4gIGxldCByb290UmVkdWNlcjtcbiAgaWYgKHR5cGVvZiByZWR1Y2VyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByb290UmVkdWNlciA9IHJlZHVjZXI7XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdDIocmVkdWNlcikpIHtcbiAgICByb290UmVkdWNlciA9IGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2VyKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiYHJlZHVjZXJgIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQsIGFuZCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0IG9mIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gY29tYmluZVJlZHVjZXJzXCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgbWlkZGxld2FyZSAmJiB0eXBlb2YgbWlkZGxld2FyZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcImBtaWRkbGV3YXJlYCBmaWVsZCBtdXN0IGJlIGEgY2FsbGJhY2tcIik7XG4gIH1cbiAgbGV0IGZpbmFsTWlkZGxld2FyZTtcbiAgaWYgKHR5cGVvZiBtaWRkbGV3YXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBmaW5hbE1pZGRsZXdhcmUgPSBtaWRkbGV3YXJlKGdldERlZmF1bHRNaWRkbGV3YXJlKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFBcnJheS5pc0FycmF5KGZpbmFsTWlkZGxld2FyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMpIDogXCJ3aGVuIHVzaW5nIGEgbWlkZGxld2FyZSBidWlsZGVyIGZ1bmN0aW9uLCBhbiBhcnJheSBvZiBtaWRkbGV3YXJlIG11c3QgYmUgcmV0dXJuZWRcIik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZpbmFsTWlkZGxld2FyZSA9IGdldERlZmF1bHRNaWRkbGV3YXJlKCk7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBmaW5hbE1pZGRsZXdhcmUuc29tZSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gIT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiZWFjaCBtaWRkbGV3YXJlIHByb3ZpZGVkIHRvIGNvbmZpZ3VyZVN0b3JlIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgfVxuICBsZXQgZmluYWxDb21wb3NlID0gY29tcG9zZTI7XG4gIGlmIChkZXZUb29scykge1xuICAgIGZpbmFsQ29tcG9zZSA9IGNvbXBvc2VXaXRoRGV2VG9vbHMoe1xuICAgICAgLy8gRW5hYmxlIGNhcHR1cmUgb2Ygc3RhY2sgdHJhY2VzIGZvciBkaXNwYXRjaGVkIFJlZHV4IGFjdGlvbnNcbiAgICAgIHRyYWNlOiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIsXG4gICAgICAuLi50eXBlb2YgZGV2VG9vbHMgPT09IFwib2JqZWN0XCIgJiYgZGV2VG9vbHNcbiAgICB9KTtcbiAgfVxuICBjb25zdCBtaWRkbGV3YXJlRW5oYW5jZXIgPSBhcHBseU1pZGRsZXdhcmUoLi4uZmluYWxNaWRkbGV3YXJlKTtcbiAgY29uc3QgZ2V0RGVmYXVsdEVuaGFuY2VycyA9IGJ1aWxkR2V0RGVmYXVsdEVuaGFuY2VycyhtaWRkbGV3YXJlRW5oYW5jZXIpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGVuaGFuY2VycyAmJiB0eXBlb2YgZW5oYW5jZXJzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6IFwiYGVuaGFuY2Vyc2AgZmllbGQgbXVzdCBiZSBhIGNhbGxiYWNrXCIpO1xuICB9XG4gIGxldCBzdG9yZUVuaGFuY2VycyA9IHR5cGVvZiBlbmhhbmNlcnMgPT09IFwiZnVuY3Rpb25cIiA/IGVuaGFuY2VycyhnZXREZWZhdWx0RW5oYW5jZXJzKSA6IGdldERlZmF1bHRFbmhhbmNlcnMoKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhQXJyYXkuaXNBcnJheShzdG9yZUVuaGFuY2VycykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg2KSA6IFwiYGVuaGFuY2Vyc2AgY2FsbGJhY2sgbXVzdCByZXR1cm4gYW4gYXJyYXlcIik7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBzdG9yZUVuaGFuY2Vycy5zb21lKChpdGVtKSA9PiB0eXBlb2YgaXRlbSAhPT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogXCJlYWNoIGVuaGFuY2VyIHByb3ZpZGVkIHRvIGNvbmZpZ3VyZVN0b3JlIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGZpbmFsTWlkZGxld2FyZS5sZW5ndGggJiYgIXN0b3JlRW5oYW5jZXJzLmluY2x1ZGVzKG1pZGRsZXdhcmVFbmhhbmNlcikpIHtcbiAgICBjb25zb2xlLmVycm9yKFwibWlkZGxld2FyZXMgd2VyZSBwcm92aWRlZCwgYnV0IG1pZGRsZXdhcmUgZW5oYW5jZXIgd2FzIG5vdCBpbmNsdWRlZCBpbiBmaW5hbCBlbmhhbmNlcnMgLSBtYWtlIHN1cmUgdG8gY2FsbCBgZ2V0RGVmYXVsdEVuaGFuY2Vyc2BcIik7XG4gIH1cbiAgY29uc3QgY29tcG9zZWRFbmhhbmNlciA9IGZpbmFsQ29tcG9zZSguLi5zdG9yZUVuaGFuY2Vycyk7XG4gIHJldHVybiBjcmVhdGVTdG9yZShyb290UmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGNvbXBvc2VkRW5oYW5jZXIpO1xufVxuXG4vLyBzcmMvY3JlYXRlUmVkdWNlci50c1xuaW1wb3J0IHsgcHJvZHVjZSBhcyBjcmVhdGVOZXh0U3RhdGUyLCBpc0RyYWZ0IGFzIGlzRHJhZnQyLCBpc0RyYWZ0YWJsZSBhcyBpc0RyYWZ0YWJsZTIgfSBmcm9tIFwiaW1tZXJcIjtcblxuLy8gc3JjL21hcEJ1aWxkZXJzLnRzXG5mdW5jdGlvbiBleGVjdXRlUmVkdWNlckJ1aWxkZXJDYWxsYmFjayhidWlsZGVyQ2FsbGJhY2spIHtcbiAgY29uc3QgYWN0aW9uc01hcCA9IHt9O1xuICBjb25zdCBhY3Rpb25NYXRjaGVycyA9IFtdO1xuICBsZXQgZGVmYXVsdENhc2VSZWR1Y2VyO1xuICBjb25zdCBidWlsZGVyID0ge1xuICAgIGFkZENhc2UodHlwZU9yQWN0aW9uQ3JlYXRvciwgcmVkdWNlcikge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBpZiAoYWN0aW9uTWF0Y2hlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI2KSA6IFwiYGJ1aWxkZXIuYWRkQ2FzZWAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZE1hdGNoZXJgXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyNykgOiBcImBidWlsZGVyLmFkZENhc2VgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWBcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdHlwZU9yQWN0aW9uQ3JlYXRvciA9PT0gXCJzdHJpbmdcIiA/IHR5cGVPckFjdGlvbkNyZWF0b3IgOiB0eXBlT3JBY3Rpb25DcmVhdG9yLnR5cGU7XG4gICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjgpIDogXCJgYnVpbGRlci5hZGRDYXNlYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYW4gZW1wdHkgYWN0aW9uIHR5cGVcIik7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSBpbiBhY3Rpb25zTWFwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI5KSA6IGBcXGBidWlsZGVyLmFkZENhc2VcXGAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIHR3byByZWR1Y2VycyBmb3IgdGhlIHNhbWUgYWN0aW9uIHR5cGUgJyR7dHlwZX0nYCk7XG4gICAgICB9XG4gICAgICBhY3Rpb25zTWFwW3R5cGVdID0gcmVkdWNlcjtcbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH0sXG4gICAgYWRkTWF0Y2hlcihtYXRjaGVyLCByZWR1Y2VyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMCkgOiBcImBidWlsZGVyLmFkZE1hdGNoZXJgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWBcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFjdGlvbk1hdGNoZXJzLnB1c2goe1xuICAgICAgICBtYXRjaGVyLFxuICAgICAgICByZWR1Y2VyXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH0sXG4gICAgYWRkRGVmYXVsdENhc2UocmVkdWNlcikge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBpZiAoZGVmYXVsdENhc2VSZWR1Y2VyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzEpIDogXCJgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWAgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2VcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlZmF1bHRDYXNlUmVkdWNlciA9IHJlZHVjZXI7XG4gICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9XG4gIH07XG4gIGJ1aWxkZXJDYWxsYmFjayhidWlsZGVyKTtcbiAgcmV0dXJuIFthY3Rpb25zTWFwLCBhY3Rpb25NYXRjaGVycywgZGVmYXVsdENhc2VSZWR1Y2VyXTtcbn1cblxuLy8gc3JjL2NyZWF0ZVJlZHVjZXIudHNcbmZ1bmN0aW9uIGlzU3RhdGVGdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVkdWNlcihpbml0aWFsU3RhdGUsIG1hcE9yQnVpbGRlckNhbGxiYWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAodHlwZW9mIG1hcE9yQnVpbGRlckNhbGxiYWNrID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg4KSA6IFwiVGhlIG9iamVjdCBub3RhdGlvbiBmb3IgYGNyZWF0ZVJlZHVjZXJgIGhhcyBiZWVuIHJlbW92ZWQuIFBsZWFzZSB1c2UgdGhlICdidWlsZGVyIGNhbGxiYWNrJyBub3RhdGlvbiBpbnN0ZWFkOiBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL2FwaS9jcmVhdGVSZWR1Y2VyXCIpO1xuICAgIH1cbiAgfVxuICBsZXQgW2FjdGlvbnNNYXAsIGZpbmFsQWN0aW9uTWF0Y2hlcnMsIGZpbmFsRGVmYXVsdENhc2VSZWR1Y2VyXSA9IGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKG1hcE9yQnVpbGRlckNhbGxiYWNrKTtcbiAgbGV0IGdldEluaXRpYWxTdGF0ZTtcbiAgaWYgKGlzU3RhdGVGdW5jdGlvbihpbml0aWFsU3RhdGUpKSB7XG4gICAgZ2V0SW5pdGlhbFN0YXRlID0gKCkgPT4gZnJlZXplRHJhZnRhYmxlKGluaXRpYWxTdGF0ZSgpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmcm96ZW5Jbml0aWFsU3RhdGUgPSBmcmVlemVEcmFmdGFibGUoaW5pdGlhbFN0YXRlKTtcbiAgICBnZXRJbml0aWFsU3RhdGUgPSAoKSA9PiBmcm96ZW5Jbml0aWFsU3RhdGU7XG4gIH1cbiAgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZSA9IGdldEluaXRpYWxTdGF0ZSgpLCBhY3Rpb24pIHtcbiAgICBsZXQgY2FzZVJlZHVjZXJzID0gW2FjdGlvbnNNYXBbYWN0aW9uLnR5cGVdLCAuLi5maW5hbEFjdGlvbk1hdGNoZXJzLmZpbHRlcigoe1xuICAgICAgbWF0Y2hlclxuICAgIH0pID0+IG1hdGNoZXIoYWN0aW9uKSkubWFwKCh7XG4gICAgICByZWR1Y2VyOiByZWR1Y2VyMlxuICAgIH0pID0+IHJlZHVjZXIyKV07XG4gICAgaWYgKGNhc2VSZWR1Y2Vycy5maWx0ZXIoKGNyKSA9PiAhIWNyKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhc2VSZWR1Y2VycyA9IFtmaW5hbERlZmF1bHRDYXNlUmVkdWNlcl07XG4gICAgfVxuICAgIHJldHVybiBjYXNlUmVkdWNlcnMucmVkdWNlKChwcmV2aW91c1N0YXRlLCBjYXNlUmVkdWNlcikgPT4ge1xuICAgICAgaWYgKGNhc2VSZWR1Y2VyKSB7XG4gICAgICAgIGlmIChpc0RyYWZ0MihwcmV2aW91c1N0YXRlKSkge1xuICAgICAgICAgIGNvbnN0IGRyYWZ0ID0gcHJldmlvdXNTdGF0ZTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYXNlUmVkdWNlcihkcmFmdCwgYWN0aW9uKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1N0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0RyYWZ0YWJsZTIocHJldmlvdXNTdGF0ZSkpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYXNlUmVkdWNlcihwcmV2aW91c1N0YXRlLCBhY3Rpb24pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg5KSA6IFwiQSBjYXNlIHJlZHVjZXIgb24gYSBub24tZHJhZnRhYmxlIHZhbHVlIG11c3Qgbm90IHJldHVybiB1bmRlZmluZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZU5leHRTdGF0ZTIocHJldmlvdXNTdGF0ZSwgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2FzZVJlZHVjZXIoZHJhZnQsIGFjdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcmV2aW91c1N0YXRlO1xuICAgIH0sIHN0YXRlKTtcbiAgfVxuICByZWR1Y2VyLmdldEluaXRpYWxTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZTtcbiAgcmV0dXJuIHJlZHVjZXI7XG59XG5cbi8vIHNyYy9tYXRjaGVycy50c1xudmFyIG1hdGNoZXMgPSAobWF0Y2hlciwgYWN0aW9uKSA9PiB7XG4gIGlmIChoYXNNYXRjaEZ1bmN0aW9uKG1hdGNoZXIpKSB7XG4gICAgcmV0dXJuIG1hdGNoZXIubWF0Y2goYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbWF0Y2hlcihhY3Rpb24pO1xuICB9XG59O1xuZnVuY3Rpb24gaXNBbnlPZiguLi5tYXRjaGVycykge1xuICByZXR1cm4gKGFjdGlvbikgPT4ge1xuICAgIHJldHVybiBtYXRjaGVycy5zb21lKChtYXRjaGVyKSA9PiBtYXRjaGVzKG1hdGNoZXIsIGFjdGlvbikpO1xuICB9O1xufVxuZnVuY3Rpb24gaXNBbGxPZiguLi5tYXRjaGVycykge1xuICByZXR1cm4gKGFjdGlvbikgPT4ge1xuICAgIHJldHVybiBtYXRjaGVycy5ldmVyeSgobWF0Y2hlcikgPT4gbWF0Y2hlcyhtYXRjaGVyLCBhY3Rpb24pKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgdmFsaWRTdGF0dXMpIHtcbiAgaWYgKCFhY3Rpb24gfHwgIWFjdGlvbi5tZXRhKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGhhc1ZhbGlkUmVxdWVzdElkID0gdHlwZW9mIGFjdGlvbi5tZXRhLnJlcXVlc3RJZCA9PT0gXCJzdHJpbmdcIjtcbiAgY29uc3QgaGFzVmFsaWRSZXF1ZXN0U3RhdHVzID0gdmFsaWRTdGF0dXMuaW5kZXhPZihhY3Rpb24ubWV0YS5yZXF1ZXN0U3RhdHVzKSA+IC0xO1xuICByZXR1cm4gaGFzVmFsaWRSZXF1ZXN0SWQgJiYgaGFzVmFsaWRSZXF1ZXN0U3RhdHVzO1xufVxuZnVuY3Rpb24gaXNBc3luY1RodW5rQXJyYXkoYSkge1xuICByZXR1cm4gdHlwZW9mIGFbMF0gPT09IFwiZnVuY3Rpb25cIiAmJiBcInBlbmRpbmdcIiBpbiBhWzBdICYmIFwiZnVsZmlsbGVkXCIgaW4gYVswXSAmJiBcInJlamVjdGVkXCIgaW4gYVswXTtcbn1cbmZ1bmN0aW9uIGlzUGVuZGluZyguLi5hc3luY1RodW5rcykge1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhY3Rpb24pID0+IGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wicGVuZGluZ1wiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNQZW5kaW5nKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLm1hcCgoYXN5bmNUaHVuaykgPT4gYXN5bmNUaHVuay5wZW5kaW5nKSk7XG59XG5mdW5jdGlvbiBpc1JlamVjdGVkKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJyZWplY3RlZFwiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNSZWplY3RlZCgpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5tYXAoKGFzeW5jVGh1bmspID0+IGFzeW5jVGh1bmsucmVqZWN0ZWQpKTtcbn1cbmZ1bmN0aW9uIGlzUmVqZWN0ZWRXaXRoVmFsdWUoLi4uYXN5bmNUaHVua3MpIHtcbiAgY29uc3QgaGFzRmxhZyA9IChhY3Rpb24pID0+IHtcbiAgICByZXR1cm4gYWN0aW9uICYmIGFjdGlvbi5tZXRhICYmIGFjdGlvbi5tZXRhLnJlamVjdGVkV2l0aFZhbHVlO1xuICB9O1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGlzQWxsT2YoaXNSZWplY3RlZCguLi5hc3luY1RodW5rcyksIGhhc0ZsYWcpO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzUmVqZWN0ZWRXaXRoVmFsdWUoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQWxsT2YoaXNSZWplY3RlZCguLi5hc3luY1RodW5rcyksIGhhc0ZsYWcpO1xufVxuZnVuY3Rpb24gaXNGdWxmaWxsZWQoLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcImZ1bGZpbGxlZFwiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNGdWxmaWxsZWQoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQW55T2YoLi4uYXN5bmNUaHVua3MubWFwKChhc3luY1RodW5rKSA9PiBhc3luY1RodW5rLmZ1bGZpbGxlZCkpO1xufVxuZnVuY3Rpb24gaXNBc3luY1RodW5rQWN0aW9uKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJwZW5kaW5nXCIsIFwiZnVsZmlsbGVkXCIsIFwicmVqZWN0ZWRcIl0pO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzQXN5bmNUaHVua0FjdGlvbigpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5mbGF0TWFwKChhc3luY1RodW5rKSA9PiBbYXN5bmNUaHVuay5wZW5kaW5nLCBhc3luY1RodW5rLnJlamVjdGVkLCBhc3luY1RodW5rLmZ1bGZpbGxlZF0pKTtcbn1cblxuLy8gc3JjL25hbm9pZC50c1xudmFyIHVybEFscGhhYmV0ID0gXCJNb2R1bGVTeW1iaGFzT3duUHItMDEyMzQ1Njc4OUFCQ0RFRkdITlJWZmdjdGlVdnpfS3FZVEprTHhwWlhJalFXXCI7XG52YXIgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuICBsZXQgaWQgPSBcIlwiO1xuICBsZXQgaSA9IHNpemU7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBpZCArPSB1cmxBbHBoYWJldFtNYXRoLnJhbmRvbSgpICogNjQgfCAwXTtcbiAgfVxuICByZXR1cm4gaWQ7XG59O1xuXG4vLyBzcmMvY3JlYXRlQXN5bmNUaHVuay50c1xudmFyIGNvbW1vblByb3BlcnRpZXMgPSBbXCJuYW1lXCIsIFwibWVzc2FnZVwiLCBcInN0YWNrXCIsIFwiY29kZVwiXTtcbnZhciBSZWplY3RXaXRoVmFsdWUgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHBheWxvYWQsIG1ldGEpIHtcbiAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgIHRoaXMubWV0YSA9IG1ldGE7XG4gIH1cbiAgLypcbiAgdHlwZS1vbmx5IHByb3BlcnR5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gUmVqZWN0V2l0aFZhbHVlIGFuZCBGdWxmaWxsV2l0aE1ldGFcbiAgZG9lcyBub3QgZXhpc3QgYXQgcnVudGltZVxuICAqL1xuICBfdHlwZTtcbn07XG52YXIgRnVsZmlsbFdpdGhNZXRhID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihwYXlsb2FkLCBtZXRhKSB7XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICB9XG4gIC8qXG4gIHR5cGUtb25seSBwcm9wZXJ0eSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIFJlamVjdFdpdGhWYWx1ZSBhbmQgRnVsZmlsbFdpdGhNZXRhXG4gIGRvZXMgbm90IGV4aXN0IGF0IHJ1bnRpbWVcbiAgKi9cbiAgX3R5cGU7XG59O1xudmFyIG1pbmlTZXJpYWxpemVFcnJvciA9ICh2YWx1ZSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc2ltcGxlRXJyb3IgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGNvbW1vblByb3BlcnRpZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWVbcHJvcGVydHldID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHNpbXBsZUVycm9yW3Byb3BlcnR5XSA9IHZhbHVlW3Byb3BlcnR5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNpbXBsZUVycm9yO1xuICB9XG4gIHJldHVybiB7XG4gICAgbWVzc2FnZTogU3RyaW5nKHZhbHVlKVxuICB9O1xufTtcbnZhciBjcmVhdGVBc3luY1RodW5rID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB7XG4gIGZ1bmN0aW9uIGNyZWF0ZUFzeW5jVGh1bmsyKHR5cGVQcmVmaXgsIHBheWxvYWRDcmVhdG9yLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZnVsZmlsbGVkID0gY3JlYXRlQWN0aW9uKHR5cGVQcmVmaXggKyBcIi9mdWxmaWxsZWRcIiwgKHBheWxvYWQsIHJlcXVlc3RJZCwgYXJnLCBtZXRhKSA9PiAoe1xuICAgICAgcGF5bG9hZCxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgLi4ubWV0YSB8fCB7fSxcbiAgICAgICAgYXJnLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHJlcXVlc3RTdGF0dXM6IFwiZnVsZmlsbGVkXCJcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgY29uc3QgcGVuZGluZyA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvcGVuZGluZ1wiLCAocmVxdWVzdElkLCBhcmcsIG1ldGEpID0+ICh7XG4gICAgICBwYXlsb2FkOiB2b2lkIDAsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLm1ldGEgfHwge30sXG4gICAgICAgIGFyZyxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICByZXF1ZXN0U3RhdHVzOiBcInBlbmRpbmdcIlxuICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCByZWplY3RlZCA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvcmVqZWN0ZWRcIiwgKGVycm9yLCByZXF1ZXN0SWQsIGFyZywgcGF5bG9hZCwgbWV0YSkgPT4gKHtcbiAgICAgIHBheWxvYWQsXG4gICAgICBlcnJvcjogKG9wdGlvbnMgJiYgb3B0aW9ucy5zZXJpYWxpemVFcnJvciB8fCBtaW5pU2VyaWFsaXplRXJyb3IpKGVycm9yIHx8IFwiUmVqZWN0ZWRcIiksXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLm1ldGEgfHwge30sXG4gICAgICAgIGFyZyxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICByZWplY3RlZFdpdGhWYWx1ZTogISFwYXlsb2FkLFxuICAgICAgICByZXF1ZXN0U3RhdHVzOiBcInJlamVjdGVkXCIsXG4gICAgICAgIGFib3J0ZWQ6IGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIixcbiAgICAgICAgY29uZGl0aW9uOiBlcnJvcj8ubmFtZSA9PT0gXCJDb25kaXRpb25FcnJvclwiXG4gICAgICB9XG4gICAgfSkpO1xuICAgIGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoYXJnKSB7XG4gICAgICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSwgZXh0cmEpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gb3B0aW9ucz8uaWRHZW5lcmF0b3IgPyBvcHRpb25zLmlkR2VuZXJhdG9yKGFyZykgOiBuYW5vaWQoKTtcbiAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBsZXQgYWJvcnRIYW5kbGVyO1xuICAgICAgICBsZXQgYWJvcnRSZWFzb247XG4gICAgICAgIGZ1bmN0aW9uIGFib3J0KHJlYXNvbikge1xuICAgICAgICAgIGFib3J0UmVhc29uID0gcmVhc29uO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAgICAgICBsZXQgZmluYWxBY3Rpb247XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjb25kaXRpb25SZXN1bHQgPSBvcHRpb25zPy5jb25kaXRpb24/LihhcmcsIHtcbiAgICAgICAgICAgICAgZ2V0U3RhdGUsXG4gICAgICAgICAgICAgIGV4dHJhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKGNvbmRpdGlvblJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ID0gYXdhaXQgY29uZGl0aW9uUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvblJlc3VsdCA9PT0gZmFsc2UgfHwgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgIHRocm93IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbmRpdGlvbkVycm9yXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJBYm9ydGVkIGR1ZSB0byBjb25kaXRpb24gY2FsbGJhY2sgcmV0dXJuaW5nIGZhbHNlLlwiXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhYm9ydGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgYWJvcnRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcIkFib3J0RXJyb3JcIixcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGFib3J0UmVhc29uIHx8IFwiQWJvcnRlZFwiXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHBlbmRpbmcocmVxdWVzdElkLCBhcmcsIG9wdGlvbnM/LmdldFBlbmRpbmdNZXRhPy4oe1xuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBnZXRTdGF0ZSxcbiAgICAgICAgICAgICAgZXh0cmFcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICBmaW5hbEFjdGlvbiA9IGF3YWl0IFByb21pc2UucmFjZShbYWJvcnRlZFByb21pc2UsIFByb21pc2UucmVzb2x2ZShwYXlsb2FkQ3JlYXRvcihhcmcsIHtcbiAgICAgICAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgICAgICAgIGdldFN0YXRlLFxuICAgICAgICAgICAgICBleHRyYSxcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAgIGFib3J0LFxuICAgICAgICAgICAgICByZWplY3RXaXRoVmFsdWU6ICh2YWx1ZSwgbWV0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVqZWN0V2l0aFZhbHVlKHZhbHVlLCBtZXRhKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVsZmlsbFdpdGhWYWx1ZTogKHZhbHVlLCBtZXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdWxmaWxsV2l0aE1ldGEodmFsdWUsIG1ldGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZWplY3RXaXRoVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEZ1bGZpbGxXaXRoTWV0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmdWxmaWxsZWQocmVzdWx0LnBheWxvYWQsIHJlcXVlc3RJZCwgYXJnLCByZXN1bHQubWV0YSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bGZpbGxlZChyZXN1bHQsIHJlcXVlc3RJZCwgYXJnKTtcbiAgICAgICAgICAgIH0pXSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBmaW5hbEFjdGlvbiA9IGVyciBpbnN0YW5jZW9mIFJlamVjdFdpdGhWYWx1ZSA/IHJlamVjdGVkKG51bGwsIHJlcXVlc3RJZCwgYXJnLCBlcnIucGF5bG9hZCwgZXJyLm1ldGEpIDogcmVqZWN0ZWQoZXJyLCByZXF1ZXN0SWQsIGFyZyk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChhYm9ydEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRIYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc2tpcERpc3BhdGNoID0gb3B0aW9ucyAmJiAhb3B0aW9ucy5kaXNwYXRjaENvbmRpdGlvblJlamVjdGlvbiAmJiByZWplY3RlZC5tYXRjaChmaW5hbEFjdGlvbikgJiYgZmluYWxBY3Rpb24ubWV0YS5jb25kaXRpb247XG4gICAgICAgICAgaWYgKCFza2lwRGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGZpbmFsQWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpbmFsQWN0aW9uO1xuICAgICAgICB9KCk7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHByb21pc2UsIHtcbiAgICAgICAgICBhYm9ydCxcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgYXJnLFxuICAgICAgICAgIHVud3JhcCgpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4odW53cmFwUmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWN0aW9uQ3JlYXRvciwge1xuICAgICAgcGVuZGluZyxcbiAgICAgIHJlamVjdGVkLFxuICAgICAgZnVsZmlsbGVkLFxuICAgICAgc2V0dGxlZDogaXNBbnlPZihyZWplY3RlZCwgZnVsZmlsbGVkKSxcbiAgICAgIHR5cGVQcmVmaXhcbiAgICB9KTtcbiAgfVxuICBjcmVhdGVBc3luY1RodW5rMi53aXRoVHlwZXMgPSAoKSA9PiBjcmVhdGVBc3luY1RodW5rMjtcbiAgcmV0dXJuIGNyZWF0ZUFzeW5jVGh1bmsyO1xufSkoKTtcbmZ1bmN0aW9uIHVud3JhcFJlc3VsdChhY3Rpb24pIHtcbiAgaWYgKGFjdGlvbi5tZXRhICYmIGFjdGlvbi5tZXRhLnJlamVjdGVkV2l0aFZhbHVlKSB7XG4gICAgdGhyb3cgYWN0aW9uLnBheWxvYWQ7XG4gIH1cbiAgaWYgKGFjdGlvbi5lcnJvcikge1xuICAgIHRocm93IGFjdGlvbi5lcnJvcjtcbiAgfVxuICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG59XG5mdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuLy8gc3JjL2NyZWF0ZVNsaWNlLnRzXG52YXIgYXN5bmNUaHVua1N5bWJvbCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwicnRrLXNsaWNlLWNyZWF0ZWFzeW5jdGh1bmtcIik7XG52YXIgYXN5bmNUaHVua0NyZWF0b3IgPSB7XG4gIFthc3luY1RodW5rU3ltYm9sXTogY3JlYXRlQXN5bmNUaHVua1xufTtcbnZhciBSZWR1Y2VyVHlwZSA9IC8qIEBfX1BVUkVfXyAqLyAoKFJlZHVjZXJUeXBlMikgPT4ge1xuICBSZWR1Y2VyVHlwZTJbXCJyZWR1Y2VyXCJdID0gXCJyZWR1Y2VyXCI7XG4gIFJlZHVjZXJUeXBlMltcInJlZHVjZXJXaXRoUHJlcGFyZVwiXSA9IFwicmVkdWNlcldpdGhQcmVwYXJlXCI7XG4gIFJlZHVjZXJUeXBlMltcImFzeW5jVGh1bmtcIl0gPSBcImFzeW5jVGh1bmtcIjtcbiAgcmV0dXJuIFJlZHVjZXJUeXBlMjtcbn0pKFJlZHVjZXJUeXBlIHx8IHt9KTtcbmZ1bmN0aW9uIGdldFR5cGUoc2xpY2UsIGFjdGlvbktleSkge1xuICByZXR1cm4gYCR7c2xpY2V9LyR7YWN0aW9uS2V5fWA7XG59XG5mdW5jdGlvbiBidWlsZENyZWF0ZVNsaWNlKHtcbiAgY3JlYXRvcnNcbn0gPSB7fSkge1xuICBjb25zdCBjQVQgPSBjcmVhdG9ycz8uYXN5bmNUaHVuaz8uW2FzeW5jVGh1bmtTeW1ib2xdO1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlU2xpY2UyKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgcmVkdWNlclBhdGggPSBuYW1lXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMSkgOiBcImBuYW1lYCBpcyBhIHJlcXVpcmVkIG9wdGlvbiBmb3IgY3JlYXRlU2xpY2VcIik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbml0aWFsU3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiWW91IG11c3QgcHJvdmlkZSBhbiBgaW5pdGlhbFN0YXRlYCB2YWx1ZSB0aGF0IGlzIG5vdCBgdW5kZWZpbmVkYC4gWW91IG1heSBoYXZlIG1pc3NwZWxsZWQgYGluaXRpYWxTdGF0ZWBcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlZHVjZXJzID0gKHR5cGVvZiBvcHRpb25zLnJlZHVjZXJzID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLnJlZHVjZXJzKGJ1aWxkUmVkdWNlckNyZWF0b3JzKCkpIDogb3B0aW9ucy5yZWR1Y2VycykgfHwge307XG4gICAgY29uc3QgcmVkdWNlck5hbWVzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBzbGljZUNhc2VSZWR1Y2Vyc0J5TmFtZToge30sXG4gICAgICBzbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZToge30sXG4gICAgICBhY3Rpb25DcmVhdG9yczoge30sXG4gICAgICBzbGljZU1hdGNoZXJzOiBbXVxuICAgIH07XG4gICAgY29uc3QgY29udGV4dE1ldGhvZHMgPSB7XG4gICAgICBhZGRDYXNlKHR5cGVPckFjdGlvbkNyZWF0b3IsIHJlZHVjZXIyKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdHlwZU9yQWN0aW9uQ3JlYXRvciA9PT0gXCJzdHJpbmdcIiA/IHR5cGVPckFjdGlvbkNyZWF0b3IgOiB0eXBlT3JBY3Rpb25DcmVhdG9yLnR5cGU7XG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEyKSA6IFwiYGNvbnRleHQuYWRkQ2FzZWAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGFjdGlvbiB0eXBlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlIGluIGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMykgOiBcImBjb250ZXh0LmFkZENhc2VgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCB0d28gcmVkdWNlcnMgZm9yIHRoZSBzYW1lIGFjdGlvbiB0eXBlOiBcIiArIHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGVbdHlwZV0gPSByZWR1Y2VyMjtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfSxcbiAgICAgIGFkZE1hdGNoZXIobWF0Y2hlciwgcmVkdWNlcjIpIHtcbiAgICAgICAgY29udGV4dC5zbGljZU1hdGNoZXJzLnB1c2goe1xuICAgICAgICAgIG1hdGNoZXIsXG4gICAgICAgICAgcmVkdWNlcjogcmVkdWNlcjJcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH0sXG4gICAgICBleHBvc2VBY3Rpb24obmFtZTIsIGFjdGlvbkNyZWF0b3IpIHtcbiAgICAgICAgY29udGV4dC5hY3Rpb25DcmVhdG9yc1tuYW1lMl0gPSBhY3Rpb25DcmVhdG9yO1xuICAgICAgICByZXR1cm4gY29udGV4dE1ldGhvZHM7XG4gICAgICB9LFxuICAgICAgZXhwb3NlQ2FzZVJlZHVjZXIobmFtZTIsIHJlZHVjZXIyKSB7XG4gICAgICAgIGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeU5hbWVbbmFtZTJdID0gcmVkdWNlcjI7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlZHVjZXJOYW1lcy5mb3JFYWNoKChyZWR1Y2VyTmFtZSkgPT4ge1xuICAgICAgY29uc3QgcmVkdWNlckRlZmluaXRpb24gPSByZWR1Y2Vyc1tyZWR1Y2VyTmFtZV07XG4gICAgICBjb25zdCByZWR1Y2VyRGV0YWlscyA9IHtcbiAgICAgICAgcmVkdWNlck5hbWUsXG4gICAgICAgIHR5cGU6IGdldFR5cGUobmFtZSwgcmVkdWNlck5hbWUpLFxuICAgICAgICBjcmVhdGVOb3RhdGlvbjogdHlwZW9mIG9wdGlvbnMucmVkdWNlcnMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgfTtcbiAgICAgIGlmIChpc0FzeW5jVGh1bmtTbGljZVJlZHVjZXJEZWZpbml0aW9uKHJlZHVjZXJEZWZpbml0aW9uKSkge1xuICAgICAgICBoYW5kbGVUaHVua0Nhc2VSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGV0YWlscywgcmVkdWNlckRlZmluaXRpb24sIGNvbnRleHRNZXRob2RzLCBjQVQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFuZGxlTm9ybWFsUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRldGFpbHMsIHJlZHVjZXJEZWZpbml0aW9uLCBjb250ZXh0TWV0aG9kcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gYnVpbGRSZWR1Y2VyKCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZXh0cmFSZWR1Y2VycyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE0KSA6IFwiVGhlIG9iamVjdCBub3RhdGlvbiBmb3IgYGNyZWF0ZVNsaWNlLmV4dHJhUmVkdWNlcnNgIGhhcyBiZWVuIHJlbW92ZWQuIFBsZWFzZSB1c2UgdGhlICdidWlsZGVyIGNhbGxiYWNrJyBub3RhdGlvbiBpbnN0ZWFkOiBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL2FwaS9jcmVhdGVTbGljZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgW2V4dHJhUmVkdWNlcnMgPSB7fSwgYWN0aW9uTWF0Y2hlcnMgPSBbXSwgZGVmYXVsdENhc2VSZWR1Y2VyID0gdm9pZCAwXSA9IHR5cGVvZiBvcHRpb25zLmV4dHJhUmVkdWNlcnMgPT09IFwiZnVuY3Rpb25cIiA/IGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKG9wdGlvbnMuZXh0cmFSZWR1Y2VycykgOiBbb3B0aW9ucy5leHRyYVJlZHVjZXJzXTtcbiAgICAgIGNvbnN0IGZpbmFsQ2FzZVJlZHVjZXJzID0ge1xuICAgICAgICAuLi5leHRyYVJlZHVjZXJzLFxuICAgICAgICAuLi5jb250ZXh0LnNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlZHVjZXIob3B0aW9ucy5pbml0aWFsU3RhdGUsIChidWlsZGVyKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBmaW5hbENhc2VSZWR1Y2Vycykge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkQ2FzZShrZXksIGZpbmFsQ2FzZVJlZHVjZXJzW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHNNIG9mIGNvbnRleHQuc2xpY2VNYXRjaGVycykge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkTWF0Y2hlcihzTS5tYXRjaGVyLCBzTS5yZWR1Y2VyKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBtIG9mIGFjdGlvbk1hdGNoZXJzKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGRNYXRjaGVyKG0ubWF0Y2hlciwgbS5yZWR1Y2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdENhc2VSZWR1Y2VyKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGREZWZhdWx0Q2FzZShkZWZhdWx0Q2FzZVJlZHVjZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0U2VsZiA9IChzdGF0ZSkgPT4gc3RhdGU7XG4gICAgY29uc3QgaW5qZWN0ZWRTZWxlY3RvckNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICBsZXQgX3JlZHVjZXI7XG4gICAgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICBpZiAoIV9yZWR1Y2VyKSBfcmVkdWNlciA9IGJ1aWxkUmVkdWNlcigpO1xuICAgICAgcmV0dXJuIF9yZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgICBpZiAoIV9yZWR1Y2VyKSBfcmVkdWNlciA9IGJ1aWxkUmVkdWNlcigpO1xuICAgICAgcmV0dXJuIF9yZWR1Y2VyLmdldEluaXRpYWxTdGF0ZSgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlU2VsZWN0b3JQcm9wcyhyZWR1Y2VyUGF0aDIsIGluamVjdGVkID0gZmFsc2UpIHtcbiAgICAgIGZ1bmN0aW9uIHNlbGVjdFNsaWNlKHN0YXRlKSB7XG4gICAgICAgIGxldCBzbGljZVN0YXRlID0gc3RhdGVbcmVkdWNlclBhdGgyXTtcbiAgICAgICAgaWYgKHR5cGVvZiBzbGljZVN0YXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaWYgKGluamVjdGVkKSB7XG4gICAgICAgICAgICBzbGljZVN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6IFwic2VsZWN0U2xpY2UgcmV0dXJuZWQgdW5kZWZpbmVkIGZvciBhbiB1bmluamVjdGVkIHNsaWNlIHJlZHVjZXJcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzbGljZVN0YXRlO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gZ2V0U2VsZWN0b3JzKHNlbGVjdFN0YXRlID0gc2VsZWN0U2VsZikge1xuICAgICAgICBjb25zdCBzZWxlY3RvckNhY2hlID0gZW1wbGFjZShpbmplY3RlZFNlbGVjdG9yQ2FjaGUsIGluamVjdGVkLCB7XG4gICAgICAgICAgaW5zZXJ0OiAoKSA9PiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVtcGxhY2Uoc2VsZWN0b3JDYWNoZSwgc2VsZWN0U3RhdGUsIHtcbiAgICAgICAgICBpbnNlcnQ6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBbbmFtZTIsIHNlbGVjdG9yXSBvZiBPYmplY3QuZW50cmllcyhvcHRpb25zLnNlbGVjdG9ycyA/PyB7fSkpIHtcbiAgICAgICAgICAgICAgbWFwW25hbWUyXSA9IHdyYXBTZWxlY3RvcihzZWxlY3Rvciwgc2VsZWN0U3RhdGUsIGdldEluaXRpYWxTdGF0ZSwgaW5qZWN0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVkdWNlclBhdGg6IHJlZHVjZXJQYXRoMixcbiAgICAgICAgZ2V0U2VsZWN0b3JzLFxuICAgICAgICBnZXQgc2VsZWN0b3JzKCkge1xuICAgICAgICAgIHJldHVybiBnZXRTZWxlY3RvcnMoc2VsZWN0U2xpY2UpO1xuICAgICAgICB9LFxuICAgICAgICBzZWxlY3RTbGljZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2xpY2UgPSB7XG4gICAgICBuYW1lLFxuICAgICAgcmVkdWNlcixcbiAgICAgIGFjdGlvbnM6IGNvbnRleHQuYWN0aW9uQ3JlYXRvcnMsXG4gICAgICBjYXNlUmVkdWNlcnM6IGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeU5hbWUsXG4gICAgICBnZXRJbml0aWFsU3RhdGUsXG4gICAgICAuLi5tYWtlU2VsZWN0b3JQcm9wcyhyZWR1Y2VyUGF0aCksXG4gICAgICBpbmplY3RJbnRvKGluamVjdGFibGUsIHtcbiAgICAgICAgcmVkdWNlclBhdGg6IHBhdGhPcHQsXG4gICAgICAgIC4uLmNvbmZpZ1xuICAgICAgfSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG5ld1JlZHVjZXJQYXRoID0gcGF0aE9wdCA/PyByZWR1Y2VyUGF0aDtcbiAgICAgICAgaW5qZWN0YWJsZS5pbmplY3Qoe1xuICAgICAgICAgIHJlZHVjZXJQYXRoOiBuZXdSZWR1Y2VyUGF0aCxcbiAgICAgICAgICByZWR1Y2VyXG4gICAgICAgIH0sIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc2xpY2UsXG4gICAgICAgICAgLi4ubWFrZVNlbGVjdG9yUHJvcHMobmV3UmVkdWNlclBhdGgsIHRydWUpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gc2xpY2U7XG4gIH07XG59XG5mdW5jdGlvbiB3cmFwU2VsZWN0b3Ioc2VsZWN0b3IsIHNlbGVjdFN0YXRlLCBnZXRJbml0aWFsU3RhdGUsIGluamVjdGVkKSB7XG4gIGZ1bmN0aW9uIHdyYXBwZXIocm9vdFN0YXRlLCAuLi5hcmdzKSB7XG4gICAgbGV0IHNsaWNlU3RhdGUgPSBzZWxlY3RTdGF0ZShyb290U3RhdGUpO1xuICAgIGlmICh0eXBlb2Ygc2xpY2VTdGF0ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKGluamVjdGVkKSB7XG4gICAgICAgIHNsaWNlU3RhdGUgPSBnZXRJbml0aWFsU3RhdGUoKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSA6IFwic2VsZWN0U3RhdGUgcmV0dXJuZWQgdW5kZWZpbmVkIGZvciBhbiB1bmluamVjdGVkIHNsaWNlIHJlZHVjZXJcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RvcihzbGljZVN0YXRlLCAuLi5hcmdzKTtcbiAgfVxuICB3cmFwcGVyLnVud3JhcHBlZCA9IHNlbGVjdG9yO1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbnZhciBjcmVhdGVTbGljZSA9IC8qIEBfX1BVUkVfXyAqLyBidWlsZENyZWF0ZVNsaWNlKCk7XG5mdW5jdGlvbiBidWlsZFJlZHVjZXJDcmVhdG9ycygpIHtcbiAgZnVuY3Rpb24gYXN5bmNUaHVuayhwYXlsb2FkQ3JlYXRvciwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9yZWR1Y2VyRGVmaW5pdGlvblR5cGU6IFwiYXN5bmNUaHVua1wiIC8qIGFzeW5jVGh1bmsgKi8sXG4gICAgICBwYXlsb2FkQ3JlYXRvcixcbiAgICAgIC4uLmNvbmZpZ1xuICAgIH07XG4gIH1cbiAgYXN5bmNUaHVuay53aXRoVHlwZXMgPSAoKSA9PiBhc3luY1RodW5rO1xuICByZXR1cm4ge1xuICAgIHJlZHVjZXIoY2FzZVJlZHVjZXIpIHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgLy8gaGFjayBzbyB0aGUgd3JhcHBpbmcgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG9yaWdpbmFsXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzbyB0aGUgYHJlZHVjZXJEZWZpbml0aW9uVHlwZWAgaXMgbm90IGFzc2lnbmVkIHRvIHRoZSBvcmlnaW5hbFxuICAgICAgICBbY2FzZVJlZHVjZXIubmFtZV0oLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiBjYXNlUmVkdWNlciguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfVtjYXNlUmVkdWNlci5uYW1lXSwge1xuICAgICAgICBfcmVkdWNlckRlZmluaXRpb25UeXBlOiBcInJlZHVjZXJcIiAvKiByZWR1Y2VyICovXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByZXBhcmVkUmVkdWNlcihwcmVwYXJlLCByZWR1Y2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfcmVkdWNlckRlZmluaXRpb25UeXBlOiBcInJlZHVjZXJXaXRoUHJlcGFyZVwiIC8qIHJlZHVjZXJXaXRoUHJlcGFyZSAqLyxcbiAgICAgICAgcHJlcGFyZSxcbiAgICAgICAgcmVkdWNlclxuICAgICAgfTtcbiAgICB9LFxuICAgIGFzeW5jVGh1bmtcbiAgfTtcbn1cbmZ1bmN0aW9uIGhhbmRsZU5vcm1hbFJlZHVjZXJEZWZpbml0aW9uKHtcbiAgdHlwZSxcbiAgcmVkdWNlck5hbWUsXG4gIGNyZWF0ZU5vdGF0aW9uXG59LCBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZSwgY29udGV4dCkge1xuICBsZXQgY2FzZVJlZHVjZXI7XG4gIGxldCBwcmVwYXJlQ2FsbGJhY2s7XG4gIGlmIChcInJlZHVjZXJcIiBpbiBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZSkge1xuICAgIGlmIChjcmVhdGVOb3RhdGlvbiAmJiAhaXNDYXNlUmVkdWNlcldpdGhQcmVwYXJlRGVmaW5pdGlvbihtYXliZVJlZHVjZXJXaXRoUHJlcGFyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE3KSA6IFwiUGxlYXNlIHVzZSB0aGUgYGNyZWF0ZS5wcmVwYXJlZFJlZHVjZXJgIG5vdGF0aW9uIGZvciBwcmVwYXJlZCBhY3Rpb24gY3JlYXRvcnMgd2l0aCB0aGUgYGNyZWF0ZWAgbm90YXRpb24uXCIpO1xuICAgIH1cbiAgICBjYXNlUmVkdWNlciA9IG1heWJlUmVkdWNlcldpdGhQcmVwYXJlLnJlZHVjZXI7XG4gICAgcHJlcGFyZUNhbGxiYWNrID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUucHJlcGFyZTtcbiAgfSBlbHNlIHtcbiAgICBjYXNlUmVkdWNlciA9IG1heWJlUmVkdWNlcldpdGhQcmVwYXJlO1xuICB9XG4gIGNvbnRleHQuYWRkQ2FzZSh0eXBlLCBjYXNlUmVkdWNlcikuZXhwb3NlQ2FzZVJlZHVjZXIocmVkdWNlck5hbWUsIGNhc2VSZWR1Y2VyKS5leHBvc2VBY3Rpb24ocmVkdWNlck5hbWUsIHByZXBhcmVDYWxsYmFjayA/IGNyZWF0ZUFjdGlvbih0eXBlLCBwcmVwYXJlQ2FsbGJhY2spIDogY3JlYXRlQWN0aW9uKHR5cGUpKTtcbn1cbmZ1bmN0aW9uIGlzQXN5bmNUaHVua1NsaWNlUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRlZmluaXRpb24pIHtcbiAgcmV0dXJuIHJlZHVjZXJEZWZpbml0aW9uLl9yZWR1Y2VyRGVmaW5pdGlvblR5cGUgPT09IFwiYXN5bmNUaHVua1wiIC8qIGFzeW5jVGh1bmsgKi87XG59XG5mdW5jdGlvbiBpc0Nhc2VSZWR1Y2VyV2l0aFByZXBhcmVEZWZpbml0aW9uKHJlZHVjZXJEZWZpbml0aW9uKSB7XG4gIHJldHVybiByZWR1Y2VyRGVmaW5pdGlvbi5fcmVkdWNlckRlZmluaXRpb25UeXBlID09PSBcInJlZHVjZXJXaXRoUHJlcGFyZVwiIC8qIHJlZHVjZXJXaXRoUHJlcGFyZSAqLztcbn1cbmZ1bmN0aW9uIGhhbmRsZVRodW5rQ2FzZVJlZHVjZXJEZWZpbml0aW9uKHtcbiAgdHlwZSxcbiAgcmVkdWNlck5hbWVcbn0sIHJlZHVjZXJEZWZpbml0aW9uLCBjb250ZXh0LCBjQVQpIHtcbiAgaWYgKCFjQVQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxOCkgOiBcIkNhbm5vdCB1c2UgYGNyZWF0ZS5hc3luY1RodW5rYCBpbiB0aGUgYnVpbHQtaW4gYGNyZWF0ZVNsaWNlYC4gVXNlIGBidWlsZENyZWF0ZVNsaWNlKHsgY3JlYXRvcnM6IHsgYXN5bmNUaHVuazogYXN5bmNUaHVua0NyZWF0b3IgfSB9KWAgdG8gY3JlYXRlIGEgY3VzdG9taXNlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTbGljZWAuXCIpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBwYXlsb2FkQ3JlYXRvcixcbiAgICBmdWxmaWxsZWQsXG4gICAgcGVuZGluZyxcbiAgICByZWplY3RlZCxcbiAgICBzZXR0bGVkLFxuICAgIG9wdGlvbnNcbiAgfSA9IHJlZHVjZXJEZWZpbml0aW9uO1xuICBjb25zdCB0aHVuayA9IGNBVCh0eXBlLCBwYXlsb2FkQ3JlYXRvciwgb3B0aW9ucyk7XG4gIGNvbnRleHQuZXhwb3NlQWN0aW9uKHJlZHVjZXJOYW1lLCB0aHVuayk7XG4gIGlmIChmdWxmaWxsZWQpIHtcbiAgICBjb250ZXh0LmFkZENhc2UodGh1bmsuZnVsZmlsbGVkLCBmdWxmaWxsZWQpO1xuICB9XG4gIGlmIChwZW5kaW5nKSB7XG4gICAgY29udGV4dC5hZGRDYXNlKHRodW5rLnBlbmRpbmcsIHBlbmRpbmcpO1xuICB9XG4gIGlmIChyZWplY3RlZCkge1xuICAgIGNvbnRleHQuYWRkQ2FzZSh0aHVuay5yZWplY3RlZCwgcmVqZWN0ZWQpO1xuICB9XG4gIGlmIChzZXR0bGVkKSB7XG4gICAgY29udGV4dC5hZGRNYXRjaGVyKHRodW5rLnNldHRsZWQsIHNldHRsZWQpO1xuICB9XG4gIGNvbnRleHQuZXhwb3NlQ2FzZVJlZHVjZXIocmVkdWNlck5hbWUsIHtcbiAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCB8fCBub29wLFxuICAgIHBlbmRpbmc6IHBlbmRpbmcgfHwgbm9vcCxcbiAgICByZWplY3RlZDogcmVqZWN0ZWQgfHwgbm9vcCxcbiAgICBzZXR0bGVkOiBzZXR0bGVkIHx8IG5vb3BcbiAgfSk7XG59XG5mdW5jdGlvbiBub29wKCkge1xufVxuXG4vLyBzcmMvZW50aXRpZXMvZW50aXR5X3N0YXRlLnRzXG5mdW5jdGlvbiBnZXRJbml0aWFsRW50aXR5U3RhdGUoKSB7XG4gIHJldHVybiB7XG4gICAgaWRzOiBbXSxcbiAgICBlbnRpdGllczoge31cbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxTdGF0ZUZhY3Rvcnkoc3RhdGVBZGFwdGVyKSB7XG4gIGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZShhZGRpdGlvbmFsU3RhdGUgPSB7fSwgZW50aXRpZXMpIHtcbiAgICBjb25zdCBzdGF0ZSA9IE9iamVjdC5hc3NpZ24oZ2V0SW5pdGlhbEVudGl0eVN0YXRlKCksIGFkZGl0aW9uYWxTdGF0ZSk7XG4gICAgcmV0dXJuIGVudGl0aWVzID8gc3RhdGVBZGFwdGVyLnNldEFsbChzdGF0ZSwgZW50aXRpZXMpIDogc3RhdGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZXRJbml0aWFsU3RhdGVcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3N0YXRlX3NlbGVjdG9ycy50c1xuZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JzRmFjdG9yeSgpIHtcbiAgZnVuY3Rpb24gZ2V0U2VsZWN0b3JzKHNlbGVjdFN0YXRlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBjcmVhdGVTZWxlY3RvcjogY3JlYXRlU2VsZWN0b3IyID0gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBzZWxlY3RJZHMgPSAoc3RhdGUpID0+IHN0YXRlLmlkcztcbiAgICBjb25zdCBzZWxlY3RFbnRpdGllcyA9IChzdGF0ZSkgPT4gc3RhdGUuZW50aXRpZXM7XG4gICAgY29uc3Qgc2VsZWN0QWxsID0gY3JlYXRlU2VsZWN0b3IyKHNlbGVjdElkcywgc2VsZWN0RW50aXRpZXMsIChpZHMsIGVudGl0aWVzKSA9PiBpZHMubWFwKChpZCkgPT4gZW50aXRpZXNbaWRdKSk7XG4gICAgY29uc3Qgc2VsZWN0SWQgPSAoXywgaWQpID0+IGlkO1xuICAgIGNvbnN0IHNlbGVjdEJ5SWQgPSAoZW50aXRpZXMsIGlkKSA9PiBlbnRpdGllc1tpZF07XG4gICAgY29uc3Qgc2VsZWN0VG90YWwgPSBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0SWRzLCAoaWRzKSA9PiBpZHMubGVuZ3RoKTtcbiAgICBpZiAoIXNlbGVjdFN0YXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWxlY3RJZHMsXG4gICAgICAgIHNlbGVjdEVudGl0aWVzLFxuICAgICAgICBzZWxlY3RBbGwsXG4gICAgICAgIHNlbGVjdFRvdGFsLFxuICAgICAgICBzZWxlY3RCeUlkOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0RW50aXRpZXMsIHNlbGVjdElkLCBzZWxlY3RCeUlkKVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzID0gY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RFbnRpdGllcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdElkczogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RJZHMpLFxuICAgICAgc2VsZWN0RW50aXRpZXM6IHNlbGVjdEdsb2JhbGl6ZWRFbnRpdGllcyxcbiAgICAgIHNlbGVjdEFsbDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RBbGwpLFxuICAgICAgc2VsZWN0VG90YWw6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RTdGF0ZSwgc2VsZWN0VG90YWwpLFxuICAgICAgc2VsZWN0QnlJZDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdEdsb2JhbGl6ZWRFbnRpdGllcywgc2VsZWN0SWQsIHNlbGVjdEJ5SWQpXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldFNlbGVjdG9yc1xuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvc3RhdGVfYWRhcHRlci50c1xuaW1wb3J0IHsgcHJvZHVjZSBhcyBjcmVhdGVOZXh0U3RhdGUzLCBpc0RyYWZ0IGFzIGlzRHJhZnQzIH0gZnJvbSBcImltbWVyXCI7XG52YXIgaXNEcmFmdFR5cGVkID0gaXNEcmFmdDM7XG5mdW5jdGlvbiBjcmVhdGVTaW5nbGVBcmd1bWVudFN0YXRlT3BlcmF0b3IobXV0YXRvcikge1xuICBjb25zdCBvcGVyYXRvciA9IGNyZWF0ZVN0YXRlT3BlcmF0b3IoKF8sIHN0YXRlKSA9PiBtdXRhdG9yKHN0YXRlKSk7XG4gIHJldHVybiBmdW5jdGlvbiBvcGVyYXRpb24oc3RhdGUpIHtcbiAgICByZXR1cm4gb3BlcmF0b3Ioc3RhdGUsIHZvaWQgMCk7XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVTdGF0ZU9wZXJhdG9yKG11dGF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9wZXJhdGlvbihzdGF0ZSwgYXJnKSB7XG4gICAgZnVuY3Rpb24gaXNQYXlsb2FkQWN0aW9uQXJndW1lbnQoYXJnMikge1xuICAgICAgcmV0dXJuIGlzRlNBKGFyZzIpO1xuICAgIH1cbiAgICBjb25zdCBydW5NdXRhdG9yID0gKGRyYWZ0KSA9PiB7XG4gICAgICBpZiAoaXNQYXlsb2FkQWN0aW9uQXJndW1lbnQoYXJnKSkge1xuICAgICAgICBtdXRhdG9yKGFyZy5wYXlsb2FkLCBkcmFmdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhdG9yKGFyZywgZHJhZnQpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGlzRHJhZnRUeXBlZChzdGF0ZSkpIHtcbiAgICAgIHJ1bk11dGF0b3Ioc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlTmV4dFN0YXRlMyhzdGF0ZSwgcnVuTXV0YXRvcik7XG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy91dGlscy50c1xuaW1wb3J0IHsgY3VycmVudCBhcyBjdXJyZW50MiwgaXNEcmFmdCBhcyBpc0RyYWZ0NCB9IGZyb20gXCJpbW1lclwiO1xuZnVuY3Rpb24gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKSB7XG4gIGNvbnN0IGtleSA9IHNlbGVjdElkKGVudGl0eSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYga2V5ID09PSB2b2lkIDApIHtcbiAgICBjb25zb2xlLndhcm4oXCJUaGUgZW50aXR5IHBhc3NlZCB0byB0aGUgYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCB1bmRlZmluZWQuXCIsIFwiWW91IHNob3VsZCBwcm9iYWJseSBwcm92aWRlIHlvdXIgb3duIGBzZWxlY3RJZGAgaW1wbGVtZW50YXRpb24uXCIsIFwiVGhlIGVudGl0eSB0aGF0IHdhcyBwYXNzZWQ6XCIsIGVudGl0eSwgXCJUaGUgYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbjpcIiwgc2VsZWN0SWQudG9TdHJpbmcoKSk7XG4gIH1cbiAgcmV0dXJuIGtleTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUVudGl0aWVzQXJyYXkoZW50aXRpZXMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGVudGl0aWVzKSkge1xuICAgIGVudGl0aWVzID0gT2JqZWN0LnZhbHVlcyhlbnRpdGllcyk7XG4gIH1cbiAgcmV0dXJuIGVudGl0aWVzO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudCh2YWx1ZSkge1xuICByZXR1cm4gaXNEcmFmdDQodmFsdWUpID8gY3VycmVudDIodmFsdWUpIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzcGxpdEFkZGVkVXBkYXRlZEVudGl0aWVzKG5ld0VudGl0aWVzLCBzZWxlY3RJZCwgc3RhdGUpIHtcbiAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgY29uc3QgZXhpc3RpbmdJZHNBcnJheSA9IGdldEN1cnJlbnQoc3RhdGUuaWRzKTtcbiAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KGV4aXN0aW5nSWRzQXJyYXkpO1xuICBjb25zdCBhZGRlZCA9IFtdO1xuICBjb25zdCB1cGRhdGVkID0gW107XG4gIGZvciAoY29uc3QgZW50aXR5IG9mIG5ld0VudGl0aWVzKSB7XG4gICAgY29uc3QgaWQgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xuICAgIGlmIChleGlzdGluZ0lkcy5oYXMoaWQpKSB7XG4gICAgICB1cGRhdGVkLnB1c2goe1xuICAgICAgICBpZCxcbiAgICAgICAgY2hhbmdlczogZW50aXR5XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkZWQucHVzaChlbnRpdHkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2FkZGVkLCB1cGRhdGVkLCBleGlzdGluZ0lkc0FycmF5XTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3Vuc29ydGVkX3N0YXRlX2FkYXB0ZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZVVuc29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkKSB7XG4gIGZ1bmN0aW9uIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIGNvbnN0IGtleSA9IHNlbGVjdElkVmFsdWUoZW50aXR5LCBzZWxlY3RJZCk7XG4gICAgaWYgKGtleSBpbiBzdGF0ZS5lbnRpdGllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZS5pZHMucHVzaChrZXkpO1xuICAgIHN0YXRlLmVudGl0aWVzW2tleV0gPSBlbnRpdHk7XG4gIH1cbiAgZnVuY3Rpb24gYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBuZXdFbnRpdGllcykge1xuICAgICAgYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgY29uc3Qga2V5ID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcbiAgICBpZiAoIShrZXkgaW4gc3RhdGUuZW50aXRpZXMpKSB7XG4gICAgICBzdGF0ZS5pZHMucHVzaChrZXkpO1xuICAgIH1cbiAgICA7XG4gICAgc3RhdGUuZW50aXRpZXNba2V5XSA9IGVudGl0eTtcbiAgfVxuICBmdW5jdGlvbiBzZXRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIG5ld0VudGl0aWVzKSB7XG4gICAgICBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRBbGxNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgc3RhdGUuaWRzID0gW107XG4gICAgc3RhdGUuZW50aXRpZXMgPSB7fTtcbiAgICBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZU9uZU11dGFibHkoa2V5LCBzdGF0ZSkge1xuICAgIHJldHVybiByZW1vdmVNYW55TXV0YWJseShba2V5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZU1hbnlNdXRhYmx5KGtleXMsIHN0YXRlKSB7XG4gICAgbGV0IGRpZE11dGF0ZSA9IGZhbHNlO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5IGluIHN0YXRlLmVudGl0aWVzKSB7XG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1trZXldO1xuICAgICAgICBkaWRNdXRhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChkaWRNdXRhdGUpIHtcbiAgICAgIHN0YXRlLmlkcyA9IHN0YXRlLmlkcy5maWx0ZXIoKGlkKSA9PiBpZCBpbiBzdGF0ZS5lbnRpdGllcyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZUFsbE11dGFibHkoc3RhdGUpIHtcbiAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB7XG4gICAgICBpZHM6IFtdLFxuICAgICAgZW50aXRpZXM6IHt9XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gdGFrZU5ld0tleShrZXlzLCB1cGRhdGUsIHN0YXRlKSB7XG4gICAgY29uc3Qgb3JpZ2luYWwzID0gc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICBpZiAob3JpZ2luYWwzID09PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZCA9IE9iamVjdC5hc3NpZ24oe30sIG9yaWdpbmFsMywgdXBkYXRlLmNoYW5nZXMpO1xuICAgIGNvbnN0IG5ld0tleSA9IHNlbGVjdElkVmFsdWUodXBkYXRlZCwgc2VsZWN0SWQpO1xuICAgIGNvbnN0IGhhc05ld0tleSA9IG5ld0tleSAhPT0gdXBkYXRlLmlkO1xuICAgIGlmIChoYXNOZXdLZXkpIHtcbiAgICAgIGtleXNbdXBkYXRlLmlkXSA9IG5ld0tleTtcbiAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xuICAgIH1cbiAgICA7XG4gICAgc3RhdGUuZW50aXRpZXNbbmV3S2V5XSA9IHVwZGF0ZWQ7XG4gICAgcmV0dXJuIGhhc05ld0tleTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVPbmVNdXRhYmx5KHVwZGF0ZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBkYXRlTWFueU11dGFibHkoW3VwZGF0ZV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVzLCBzdGF0ZSkge1xuICAgIGNvbnN0IG5ld0tleXMgPSB7fTtcbiAgICBjb25zdCB1cGRhdGVzUGVyRW50aXR5ID0ge307XG4gICAgdXBkYXRlcy5mb3JFYWNoKCh1cGRhdGUpID0+IHtcbiAgICAgIGlmICh1cGRhdGUuaWQgaW4gc3RhdGUuZW50aXRpZXMpIHtcbiAgICAgICAgdXBkYXRlc1BlckVudGl0eVt1cGRhdGUuaWRdID0ge1xuICAgICAgICAgIGlkOiB1cGRhdGUuaWQsXG4gICAgICAgICAgLy8gU3ByZWFkcyBpZ25vcmUgZmFsc3kgdmFsdWVzLCBzbyB0aGlzIHdvcmtzIGV2ZW4gaWYgdGhlcmUgaXNuJ3RcbiAgICAgICAgICAvLyBhbiBleGlzdGluZyB1cGRhdGUgYWxyZWFkeSBhdCB0aGlzIGtleVxuICAgICAgICAgIGNoYW5nZXM6IHtcbiAgICAgICAgICAgIC4uLnVwZGF0ZXNQZXJFbnRpdHlbdXBkYXRlLmlkXT8uY2hhbmdlcyxcbiAgICAgICAgICAgIC4uLnVwZGF0ZS5jaGFuZ2VzXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHVwZGF0ZXMgPSBPYmplY3QudmFsdWVzKHVwZGF0ZXNQZXJFbnRpdHkpO1xuICAgIGNvbnN0IGRpZE11dGF0ZUVudGl0aWVzID0gdXBkYXRlcy5sZW5ndGggPiAwO1xuICAgIGlmIChkaWRNdXRhdGVFbnRpdGllcykge1xuICAgICAgY29uc3QgZGlkTXV0YXRlSWRzID0gdXBkYXRlcy5maWx0ZXIoKHVwZGF0ZSkgPT4gdGFrZU5ld0tleShuZXdLZXlzLCB1cGRhdGUsIHN0YXRlKSkubGVuZ3RoID4gMDtcbiAgICAgIGlmIChkaWRNdXRhdGVJZHMpIHtcbiAgICAgICAgc3RhdGUuaWRzID0gT2JqZWN0LnZhbHVlcyhzdGF0ZS5lbnRpdGllcykubWFwKChlKSA9PiBzZWxlY3RJZFZhbHVlKGUsIHNlbGVjdElkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHVwc2VydE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIHJldHVybiB1cHNlcnRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHVwc2VydE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIGNvbnN0IFthZGRlZCwgdXBkYXRlZF0gPSBzcGxpdEFkZGVkVXBkYXRlZEVudGl0aWVzKG5ld0VudGl0aWVzLCBzZWxlY3RJZCwgc3RhdGUpO1xuICAgIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZWQsIHN0YXRlKTtcbiAgICBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVtb3ZlQWxsOiBjcmVhdGVTaW5nbGVBcmd1bWVudFN0YXRlT3BlcmF0b3IocmVtb3ZlQWxsTXV0YWJseSksXG4gICAgYWRkT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE9uZU11dGFibHkpLFxuICAgIGFkZE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkTWFueU11dGFibHkpLFxuICAgIHNldE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRPbmVNdXRhYmx5KSxcbiAgICBzZXRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE1hbnlNdXRhYmx5KSxcbiAgICBzZXRBbGw6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0QWxsTXV0YWJseSksXG4gICAgdXBkYXRlT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU9uZU11dGFibHkpLFxuICAgIHVwZGF0ZU1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlTWFueU11dGFibHkpLFxuICAgIHVwc2VydE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRPbmVNdXRhYmx5KSxcbiAgICB1cHNlcnRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE1hbnlNdXRhYmx5KSxcbiAgICByZW1vdmVPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IocmVtb3ZlT25lTXV0YWJseSksXG4gICAgcmVtb3ZlTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihyZW1vdmVNYW55TXV0YWJseSlcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3NvcnRlZF9zdGF0ZV9hZGFwdGVyLnRzXG5mdW5jdGlvbiBmaW5kSW5zZXJ0SW5kZXgoc29ydGVkSXRlbXMsIGl0ZW0sIGNvbXBhcmlzb25GdW5jdGlvbikge1xuICBsZXQgbG93SW5kZXggPSAwO1xuICBsZXQgaGlnaEluZGV4ID0gc29ydGVkSXRlbXMubGVuZ3RoO1xuICB3aGlsZSAobG93SW5kZXggPCBoaWdoSW5kZXgpIHtcbiAgICBsZXQgbWlkZGxlSW5kZXggPSBsb3dJbmRleCArIGhpZ2hJbmRleCA+Pj4gMTtcbiAgICBjb25zdCBjdXJyZW50SXRlbSA9IHNvcnRlZEl0ZW1zW21pZGRsZUluZGV4XTtcbiAgICBjb25zdCByZXMgPSBjb21wYXJpc29uRnVuY3Rpb24oaXRlbSwgY3VycmVudEl0ZW0pO1xuICAgIGlmIChyZXMgPj0gMCkge1xuICAgICAgbG93SW5kZXggPSBtaWRkbGVJbmRleCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpZ2hJbmRleCA9IG1pZGRsZUluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbG93SW5kZXg7XG59XG5mdW5jdGlvbiBpbnNlcnQoc29ydGVkSXRlbXMsIGl0ZW0sIGNvbXBhcmlzb25GdW5jdGlvbikge1xuICBjb25zdCBpbnNlcnRBdEluZGV4ID0gZmluZEluc2VydEluZGV4KHNvcnRlZEl0ZW1zLCBpdGVtLCBjb21wYXJpc29uRnVuY3Rpb24pO1xuICBzb3J0ZWRJdGVtcy5zcGxpY2UoaW5zZXJ0QXRJbmRleCwgMCwgaXRlbSk7XG4gIHJldHVybiBzb3J0ZWRJdGVtcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCwgY29tcGFyZXIpIHtcbiAgY29uc3Qge1xuICAgIHJlbW92ZU9uZSxcbiAgICByZW1vdmVNYW55LFxuICAgIHJlbW92ZUFsbFxuICB9ID0gY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpO1xuICBmdW5jdGlvbiBhZGRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICByZXR1cm4gYWRkTWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUsIGV4aXN0aW5nSWRzKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBjb25zdCBleGlzdGluZ0tleXMgPSBuZXcgU2V0KGV4aXN0aW5nSWRzID8/IGdldEN1cnJlbnQoc3RhdGUuaWRzKSk7XG4gICAgY29uc3QgbW9kZWxzID0gbmV3RW50aXRpZXMuZmlsdGVyKChtb2RlbCkgPT4gIWV4aXN0aW5nS2V5cy5oYXMoc2VsZWN0SWRWYWx1ZShtb2RlbCwgc2VsZWN0SWQpKSk7XG4gICAgaWYgKG1vZGVscy5sZW5ndGggIT09IDApIHtcbiAgICAgIG1lcmdlRnVuY3Rpb24oc3RhdGUsIG1vZGVscyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIHJldHVybiBzZXRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHNldE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgaWYgKG5ld0VudGl0aWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG5ld0VudGl0aWVzKSB7XG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1tzZWxlY3RJZChpdGVtKV07XG4gICAgICB9XG4gICAgICBtZXJnZUZ1bmN0aW9uKHN0YXRlLCBuZXdFbnRpdGllcyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldEFsbE11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBzdGF0ZS5lbnRpdGllcyA9IHt9O1xuICAgIHN0YXRlLmlkcyA9IFtdO1xuICAgIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSwgW10pO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZU9uZU11dGFibHkodXBkYXRlLCBzdGF0ZSkge1xuICAgIHJldHVybiB1cGRhdGVNYW55TXV0YWJseShbdXBkYXRlXSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZXMsIHN0YXRlKSB7XG4gICAgbGV0IGFwcGxpZWRVcGRhdGVzID0gZmFsc2U7XG4gICAgbGV0IHJlcGxhY2VkSWRzID0gZmFsc2U7XG4gICAgZm9yIChsZXQgdXBkYXRlIG9mIHVwZGF0ZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgICBpZiAoIWVudGl0eSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGFwcGxpZWRVcGRhdGVzID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5hc3NpZ24oZW50aXR5LCB1cGRhdGUuY2hhbmdlcyk7XG4gICAgICBjb25zdCBuZXdJZCA9IHNlbGVjdElkKGVudGl0eSk7XG4gICAgICBpZiAodXBkYXRlLmlkICE9PSBuZXdJZCkge1xuICAgICAgICByZXBsYWNlZElkcyA9IHRydWU7XG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xuICAgICAgICBjb25zdCBvbGRJbmRleCA9IHN0YXRlLmlkcy5pbmRleE9mKHVwZGF0ZS5pZCk7XG4gICAgICAgIHN0YXRlLmlkc1tvbGRJbmRleF0gPSBuZXdJZDtcbiAgICAgICAgc3RhdGUuZW50aXRpZXNbbmV3SWRdID0gZW50aXR5O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXBwbGllZFVwZGF0ZXMpIHtcbiAgICAgIG1lcmdlRnVuY3Rpb24oc3RhdGUsIFtdLCBhcHBsaWVkVXBkYXRlcywgcmVwbGFjZWRJZHMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBzZXJ0TWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBjb25zdCBbYWRkZWQsIHVwZGF0ZWQsIGV4aXN0aW5nSWRzQXJyYXldID0gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKTtcbiAgICBpZiAodXBkYXRlZC5sZW5ndGgpIHtcbiAgICAgIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZWQsIHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKGFkZGVkLmxlbmd0aCkge1xuICAgICAgYWRkTWFueU11dGFibHkoYWRkZWQsIHN0YXRlLCBleGlzdGluZ0lkc0FycmF5KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYXJlQXJyYXlzRXF1YWwoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSA9PT0gYltpXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgbWVyZ2VGdW5jdGlvbiA9IChzdGF0ZSwgYWRkZWRJdGVtcywgYXBwbGllZFVwZGF0ZXMsIHJlcGxhY2VkSWRzKSA9PiB7XG4gICAgY29uc3QgY3VycmVudEVudGl0aWVzID0gZ2V0Q3VycmVudChzdGF0ZS5lbnRpdGllcyk7XG4gICAgY29uc3QgY3VycmVudElkcyA9IGdldEN1cnJlbnQoc3RhdGUuaWRzKTtcbiAgICBjb25zdCBzdGF0ZUVudGl0aWVzID0gc3RhdGUuZW50aXRpZXM7XG4gICAgbGV0IGlkcyA9IGN1cnJlbnRJZHM7XG4gICAgaWYgKHJlcGxhY2VkSWRzKSB7XG4gICAgICBpZHMgPSBuZXcgU2V0KGN1cnJlbnRJZHMpO1xuICAgIH1cbiAgICBsZXQgc29ydGVkRW50aXRpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gY3VycmVudEVudGl0aWVzW2lkXTtcbiAgICAgIGlmIChlbnRpdHkpIHtcbiAgICAgICAgc29ydGVkRW50aXRpZXMucHVzaChlbnRpdHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB3YXNQcmV2aW91c2x5RW1wdHkgPSBzb3J0ZWRFbnRpdGllcy5sZW5ndGggPT09IDA7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGFkZGVkSXRlbXMpIHtcbiAgICAgIHN0YXRlRW50aXRpZXNbc2VsZWN0SWQoaXRlbSldID0gaXRlbTtcbiAgICAgIGlmICghd2FzUHJldmlvdXNseUVtcHR5KSB7XG4gICAgICAgIGluc2VydChzb3J0ZWRFbnRpdGllcywgaXRlbSwgY29tcGFyZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAod2FzUHJldmlvdXNseUVtcHR5KSB7XG4gICAgICBzb3J0ZWRFbnRpdGllcyA9IGFkZGVkSXRlbXMuc2xpY2UoKS5zb3J0KGNvbXBhcmVyKTtcbiAgICB9IGVsc2UgaWYgKGFwcGxpZWRVcGRhdGVzKSB7XG4gICAgICBzb3J0ZWRFbnRpdGllcy5zb3J0KGNvbXBhcmVyKTtcbiAgICB9XG4gICAgY29uc3QgbmV3U29ydGVkSWRzID0gc29ydGVkRW50aXRpZXMubWFwKHNlbGVjdElkKTtcbiAgICBpZiAoIWFyZUFycmF5c0VxdWFsKGN1cnJlbnRJZHMsIG5ld1NvcnRlZElkcykpIHtcbiAgICAgIHN0YXRlLmlkcyA9IG5ld1NvcnRlZElkcztcbiAgICB9XG4gIH07XG4gIHJldHVybiB7XG4gICAgcmVtb3ZlT25lLFxuICAgIHJlbW92ZU1hbnksXG4gICAgcmVtb3ZlQWxsLFxuICAgIGFkZE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRPbmVNdXRhYmx5KSxcbiAgICB1cGRhdGVPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlT25lTXV0YWJseSksXG4gICAgdXBzZXJ0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE9uZU11dGFibHkpLFxuICAgIHNldE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRPbmVNdXRhYmx5KSxcbiAgICBzZXRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE1hbnlNdXRhYmx5KSxcbiAgICBzZXRBbGw6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0QWxsTXV0YWJseSksXG4gICAgYWRkTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRNYW55TXV0YWJseSksXG4gICAgdXBkYXRlTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVNYW55TXV0YWJseSksXG4gICAgdXBzZXJ0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRNYW55TXV0YWJseSlcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL2NyZWF0ZV9hZGFwdGVyLnRzXG5mdW5jdGlvbiBjcmVhdGVFbnRpdHlBZGFwdGVyKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgc2VsZWN0SWQsXG4gICAgc29ydENvbXBhcmVyXG4gIH0gPSB7XG4gICAgc29ydENvbXBhcmVyOiBmYWxzZSxcbiAgICBzZWxlY3RJZDogKGluc3RhbmNlKSA9PiBpbnN0YW5jZS5pZCxcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIGNvbnN0IHN0YXRlQWRhcHRlciA9IHNvcnRDb21wYXJlciA/IGNyZWF0ZVNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCwgc29ydENvbXBhcmVyKSA6IGNyZWF0ZVVuc29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkKTtcbiAgY29uc3Qgc3RhdGVGYWN0b3J5ID0gY3JlYXRlSW5pdGlhbFN0YXRlRmFjdG9yeShzdGF0ZUFkYXB0ZXIpO1xuICBjb25zdCBzZWxlY3RvcnNGYWN0b3J5ID0gY3JlYXRlU2VsZWN0b3JzRmFjdG9yeSgpO1xuICByZXR1cm4ge1xuICAgIHNlbGVjdElkLFxuICAgIHNvcnRDb21wYXJlcixcbiAgICAuLi5zdGF0ZUZhY3RvcnksXG4gICAgLi4uc2VsZWN0b3JzRmFjdG9yeSxcbiAgICAuLi5zdGF0ZUFkYXB0ZXJcbiAgfTtcbn1cblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS9pbmRleC50c1xuaW1wb3J0IHsgaXNBY3Rpb24gYXMgaXNBY3Rpb24zIH0gZnJvbSBcInJlZHV4XCI7XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvZXhjZXB0aW9ucy50c1xudmFyIHRhc2sgPSBcInRhc2tcIjtcbnZhciBsaXN0ZW5lciA9IFwibGlzdGVuZXJcIjtcbnZhciBjb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xudmFyIGNhbmNlbGxlZCA9IFwiY2FuY2VsbGVkXCI7XG52YXIgdGFza0NhbmNlbGxlZCA9IGB0YXNrLSR7Y2FuY2VsbGVkfWA7XG52YXIgdGFza0NvbXBsZXRlZCA9IGB0YXNrLSR7Y29tcGxldGVkfWA7XG52YXIgbGlzdGVuZXJDYW5jZWxsZWQgPSBgJHtsaXN0ZW5lcn0tJHtjYW5jZWxsZWR9YDtcbnZhciBsaXN0ZW5lckNvbXBsZXRlZCA9IGAke2xpc3RlbmVyfS0ke2NvbXBsZXRlZH1gO1xudmFyIFRhc2tBYm9ydEVycm9yID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihjb2RlKSB7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBgJHt0YXNrfSAke2NhbmNlbGxlZH0gKHJlYXNvbjogJHtjb2RlfSlgO1xuICB9XG4gIG5hbWUgPSBcIlRhc2tBYm9ydEVycm9yXCI7XG4gIG1lc3NhZ2U7XG59O1xuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL3V0aWxzLnRzXG52YXIgYXNzZXJ0RnVuY3Rpb24gPSAoZnVuYywgZXhwZWN0ZWQpID0+IHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMikgOiBgJHtleHBlY3RlZH0gaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgfVxufTtcbnZhciBub29wMiA9ICgpID0+IHtcbn07XG52YXIgY2F0Y2hSZWplY3Rpb24gPSAocHJvbWlzZSwgb25FcnJvciA9IG5vb3AyKSA9PiB7XG4gIHByb21pc2UuY2F0Y2gob25FcnJvcik7XG4gIHJldHVybiBwcm9taXNlO1xufTtcbnZhciBhZGRBYm9ydFNpZ25hbExpc3RlbmVyID0gKGFib3J0U2lnbmFsLCBjYWxsYmFjaykgPT4ge1xuICBhYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgY2FsbGJhY2ssIHtcbiAgICBvbmNlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gKCkgPT4gYWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGNhbGxiYWNrKTtcbn07XG52YXIgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbiA9IChhYm9ydENvbnRyb2xsZXIsIHJlYXNvbikgPT4ge1xuICBjb25zdCBzaWduYWwgPSBhYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCEoXCJyZWFzb25cIiBpbiBzaWduYWwpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNpZ25hbCwgXCJyZWFzb25cIiwge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiByZWFzb24sXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIDtcbiAgYWJvcnRDb250cm9sbGVyLmFib3J0KHJlYXNvbik7XG59O1xuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL3Rhc2sudHNcbnZhciB2YWxpZGF0ZUFjdGl2ZSA9IChzaWduYWwpID0+IHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgY29uc3Qge1xuICAgICAgcmVhc29uXG4gICAgfSA9IHNpZ25hbDtcbiAgICB0aHJvdyBuZXcgVGFza0Fib3J0RXJyb3IocmVhc29uKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHJhY2VXaXRoU2lnbmFsKHNpZ25hbCwgcHJvbWlzZSkge1xuICBsZXQgY2xlYW51cCA9IG5vb3AyO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG5vdGlmeVJlamVjdGlvbiA9ICgpID0+IHJlamVjdChuZXcgVGFza0Fib3J0RXJyb3Ioc2lnbmFsLnJlYXNvbikpO1xuICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgbm90aWZ5UmVqZWN0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNsZWFudXAgPSBhZGRBYm9ydFNpZ25hbExpc3RlbmVyKHNpZ25hbCwgbm90aWZ5UmVqZWN0aW9uKTtcbiAgICBwcm9taXNlLmZpbmFsbHkoKCkgPT4gY2xlYW51cCgpKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIGNsZWFudXAgPSBub29wMjtcbiAgfSk7XG59XG52YXIgcnVuVGFzayA9IGFzeW5jICh0YXNrMiwgY2xlYW5VcCkgPT4ge1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGFzazIoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBcIm9rXCIsXG4gICAgICB2YWx1ZVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogZXJyb3IgaW5zdGFuY2VvZiBUYXNrQWJvcnRFcnJvciA/IFwiY2FuY2VsbGVkXCIgOiBcInJlamVjdGVkXCIsXG4gICAgICBlcnJvclxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYW5VcD8uKCk7XG4gIH1cbn07XG52YXIgY3JlYXRlUGF1c2UgPSAoc2lnbmFsKSA9PiB7XG4gIHJldHVybiAocHJvbWlzZSkgPT4ge1xuICAgIHJldHVybiBjYXRjaFJlamVjdGlvbihyYWNlV2l0aFNpZ25hbChzaWduYWwsIHByb21pc2UpLnRoZW4oKG91dHB1dCkgPT4ge1xuICAgICAgdmFsaWRhdGVBY3RpdmUoc2lnbmFsKTtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSkpO1xuICB9O1xufTtcbnZhciBjcmVhdGVEZWxheSA9IChzaWduYWwpID0+IHtcbiAgY29uc3QgcGF1c2UgPSBjcmVhdGVQYXVzZShzaWduYWwpO1xuICByZXR1cm4gKHRpbWVvdXRNcykgPT4ge1xuICAgIHJldHVybiBwYXVzZShuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aW1lb3V0TXMpKSk7XG4gIH07XG59O1xuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL2luZGV4LnRzXG52YXIge1xuICBhc3NpZ25cbn0gPSBPYmplY3Q7XG52YXIgSU5URVJOQUxfTklMX1RPS0VOID0ge307XG52YXIgYWxtID0gXCJsaXN0ZW5lck1pZGRsZXdhcmVcIjtcbnZhciBjcmVhdGVGb3JrID0gKHBhcmVudEFib3J0U2lnbmFsLCBwYXJlbnRCbG9ja2luZ1Byb21pc2VzKSA9PiB7XG4gIGNvbnN0IGxpbmtDb250cm9sbGVycyA9IChjb250cm9sbGVyKSA9PiBhZGRBYm9ydFNpZ25hbExpc3RlbmVyKHBhcmVudEFib3J0U2lnbmFsLCAoKSA9PiBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNvbnRyb2xsZXIsIHBhcmVudEFib3J0U2lnbmFsLnJlYXNvbikpO1xuICByZXR1cm4gKHRhc2tFeGVjdXRvciwgb3B0cykgPT4ge1xuICAgIGFzc2VydEZ1bmN0aW9uKHRhc2tFeGVjdXRvciwgXCJ0YXNrRXhlY3V0b3JcIik7XG4gICAgY29uc3QgY2hpbGRBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgbGlua0NvbnRyb2xsZXJzKGNoaWxkQWJvcnRDb250cm9sbGVyKTtcbiAgICBjb25zdCByZXN1bHQgPSBydW5UYXNrKGFzeW5jICgpID0+IHtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKHBhcmVudEFib3J0U2lnbmFsKTtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICBjb25zdCByZXN1bHQyID0gYXdhaXQgdGFza0V4ZWN1dG9yKHtcbiAgICAgICAgcGF1c2U6IGNyZWF0ZVBhdXNlKGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgIGRlbGF5OiBjcmVhdGVEZWxheShjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWwpLFxuICAgICAgICBzaWduYWw6IGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbFxuICAgICAgfSk7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgcmV0dXJuIHJlc3VsdDI7XG4gICAgfSwgKCkgPT4gYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjaGlsZEFib3J0Q29udHJvbGxlciwgdGFza0NvbXBsZXRlZCkpO1xuICAgIGlmIChvcHRzPy5hdXRvSm9pbikge1xuICAgICAgcGFyZW50QmxvY2tpbmdQcm9taXNlcy5wdXNoKHJlc3VsdC5jYXRjaChub29wMikpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0OiBjcmVhdGVQYXVzZShwYXJlbnRBYm9ydFNpZ25hbCkocmVzdWx0KSxcbiAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjaGlsZEFib3J0Q29udHJvbGxlciwgdGFza0NhbmNlbGxlZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn07XG52YXIgY3JlYXRlVGFrZVBhdHRlcm4gPSAoc3RhcnRMaXN0ZW5pbmcsIHNpZ25hbCkgPT4ge1xuICBjb25zdCB0YWtlID0gYXN5bmMgKHByZWRpY2F0ZSwgdGltZW91dCkgPT4ge1xuICAgIHZhbGlkYXRlQWN0aXZlKHNpZ25hbCk7XG4gICAgbGV0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgIH07XG4gICAgY29uc3QgdHVwbGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHN0b3BMaXN0ZW5pbmcgPSBzdGFydExpc3RlbmluZyh7XG4gICAgICAgIHByZWRpY2F0ZSxcbiAgICAgICAgZWZmZWN0OiAoYWN0aW9uLCBsaXN0ZW5lckFwaSkgPT4ge1xuICAgICAgICAgIGxpc3RlbmVyQXBpLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgcmVzb2x2ZShbYWN0aW9uLCBsaXN0ZW5lckFwaS5nZXRTdGF0ZSgpLCBsaXN0ZW5lckFwaS5nZXRPcmlnaW5hbFN0YXRlKCldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICAgICAgc3RvcExpc3RlbmluZygpO1xuICAgICAgICByZWplY3QoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbdHVwbGVQcm9taXNlXTtcbiAgICBpZiAodGltZW91dCAhPSBudWxsKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXQsIG51bGwpKSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByYWNlV2l0aFNpZ25hbChzaWduYWwsIFByb21pc2UucmFjZShwcm9taXNlcykpO1xuICAgICAgdmFsaWRhdGVBY3RpdmUoc2lnbmFsKTtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gKHByZWRpY2F0ZSwgdGltZW91dCkgPT4gY2F0Y2hSZWplY3Rpb24odGFrZShwcmVkaWNhdGUsIHRpbWVvdXQpKTtcbn07XG52YXIgZ2V0TGlzdGVuZXJFbnRyeVByb3BzRnJvbSA9IChvcHRpb25zKSA9PiB7XG4gIGxldCB7XG4gICAgdHlwZSxcbiAgICBhY3Rpb25DcmVhdG9yLFxuICAgIG1hdGNoZXIsXG4gICAgcHJlZGljYXRlLFxuICAgIGVmZmVjdFxuICB9ID0gb3B0aW9ucztcbiAgaWYgKHR5cGUpIHtcbiAgICBwcmVkaWNhdGUgPSBjcmVhdGVBY3Rpb24odHlwZSkubWF0Y2g7XG4gIH0gZWxzZSBpZiAoYWN0aW9uQ3JlYXRvcikge1xuICAgIHR5cGUgPSBhY3Rpb25DcmVhdG9yLnR5cGU7XG4gICAgcHJlZGljYXRlID0gYWN0aW9uQ3JlYXRvci5tYXRjaDtcbiAgfSBlbHNlIGlmIChtYXRjaGVyKSB7XG4gICAgcHJlZGljYXRlID0gbWF0Y2hlcjtcbiAgfSBlbHNlIGlmIChwcmVkaWNhdGUpIHtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyMSkgOiBcIkNyZWF0aW5nIG9yIHJlbW92aW5nIGEgbGlzdGVuZXIgcmVxdWlyZXMgb25lIG9mIHRoZSBrbm93biBmaWVsZHMgZm9yIG1hdGNoaW5nIGFuIGFjdGlvblwiKTtcbiAgfVxuICBhc3NlcnRGdW5jdGlvbihlZmZlY3QsIFwib3B0aW9ucy5saXN0ZW5lclwiKTtcbiAgcmV0dXJuIHtcbiAgICBwcmVkaWNhdGUsXG4gICAgdHlwZSxcbiAgICBlZmZlY3RcbiAgfTtcbn07XG52YXIgY3JlYXRlTGlzdGVuZXJFbnRyeSA9IC8qIEBfX1BVUkVfXyAqLyBhc3NpZ24oKG9wdGlvbnMpID0+IHtcbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcHJlZGljYXRlLFxuICAgIGVmZmVjdFxuICB9ID0gZ2V0TGlzdGVuZXJFbnRyeVByb3BzRnJvbShvcHRpb25zKTtcbiAgY29uc3QgaWQgPSBuYW5vaWQoKTtcbiAgY29uc3QgZW50cnkgPSB7XG4gICAgaWQsXG4gICAgZWZmZWN0LFxuICAgIHR5cGUsXG4gICAgcHJlZGljYXRlLFxuICAgIHBlbmRpbmc6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksXG4gICAgdW5zdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIyKSA6IFwiVW5zdWJzY3JpYmUgbm90IGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGVudHJ5O1xufSwge1xuICB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZUxpc3RlbmVyRW50cnlcbn0pO1xudmFyIGNhbmNlbEFjdGl2ZUxpc3RlbmVycyA9IChlbnRyeSkgPT4ge1xuICBlbnRyeS5wZW5kaW5nLmZvckVhY2goKGNvbnRyb2xsZXIpID0+IHtcbiAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNvbnRyb2xsZXIsIGxpc3RlbmVyQ2FuY2VsbGVkKTtcbiAgfSk7XG59O1xudmFyIGNyZWF0ZUNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlID0gKGxpc3RlbmVyTWFwKSA9PiB7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgbGlzdGVuZXJNYXAuZm9yRWFjaChjYW5jZWxBY3RpdmVMaXN0ZW5lcnMpO1xuICAgIGxpc3RlbmVyTWFwLmNsZWFyKCk7XG4gIH07XG59O1xudmFyIHNhZmVseU5vdGlmeUVycm9yID0gKGVycm9ySGFuZGxlciwgZXJyb3JUb05vdGlmeSwgZXJyb3JJbmZvKSA9PiB7XG4gIHRyeSB7XG4gICAgZXJyb3JIYW5kbGVyKGVycm9yVG9Ob3RpZnksIGVycm9ySW5mbyk7XG4gIH0gY2F0Y2ggKGVycm9ySGFuZGxlckVycm9yKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvckhhbmRsZXJFcnJvcjtcbiAgICB9LCAwKTtcbiAgfVxufTtcbnZhciBhZGRMaXN0ZW5lciA9IC8qIEBfX1BVUkVfXyAqLyBhc3NpZ24oLyogQF9fUFVSRV9fICovIGNyZWF0ZUFjdGlvbihgJHthbG19L2FkZGApLCB7XG4gIHdpdGhUeXBlczogKCkgPT4gYWRkTGlzdGVuZXJcbn0pO1xudmFyIGNsZWFyQWxsTGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUFjdGlvbihgJHthbG19L3JlbW92ZUFsbGApO1xudmFyIHJlbW92ZUxpc3RlbmVyID0gLyogQF9fUFVSRV9fICovIGFzc2lnbigvKiBAX19QVVJFX18gKi8gY3JlYXRlQWN0aW9uKGAke2FsbX0vcmVtb3ZlYCksIHtcbiAgd2l0aFR5cGVzOiAoKSA9PiByZW1vdmVMaXN0ZW5lclxufSk7XG52YXIgZGVmYXVsdEVycm9ySGFuZGxlciA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoYCR7YWxtfS9lcnJvcmAsIC4uLmFyZ3MpO1xufTtcbnZhciBjcmVhdGVMaXN0ZW5lck1pZGRsZXdhcmUgPSAobWlkZGxld2FyZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCBsaXN0ZW5lck1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IHtcbiAgICBleHRyYSxcbiAgICBvbkVycm9yID0gZGVmYXVsdEVycm9ySGFuZGxlclxuICB9ID0gbWlkZGxld2FyZU9wdGlvbnM7XG4gIGFzc2VydEZ1bmN0aW9uKG9uRXJyb3IsIFwib25FcnJvclwiKTtcbiAgY29uc3QgaW5zZXJ0RW50cnkgPSAoZW50cnkpID0+IHtcbiAgICBlbnRyeS51bnN1YnNjcmliZSA9ICgpID0+IGxpc3RlbmVyTWFwLmRlbGV0ZShlbnRyeS5pZCk7XG4gICAgbGlzdGVuZXJNYXAuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgcmV0dXJuIChjYW5jZWxPcHRpb25zKSA9PiB7XG4gICAgICBlbnRyeS51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKGNhbmNlbE9wdGlvbnM/LmNhbmNlbEFjdGl2ZSkge1xuICAgICAgICBjYW5jZWxBY3RpdmVMaXN0ZW5lcnMoZW50cnkpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG4gIGNvbnN0IHN0YXJ0TGlzdGVuaW5nID0gKG9wdGlvbnMpID0+IHtcbiAgICBsZXQgZW50cnkgPSBmaW5kKEFycmF5LmZyb20obGlzdGVuZXJNYXAudmFsdWVzKCkpLCAoZXhpc3RpbmdFbnRyeSkgPT4gZXhpc3RpbmdFbnRyeS5lZmZlY3QgPT09IG9wdGlvbnMuZWZmZWN0KTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICBlbnRyeSA9IGNyZWF0ZUxpc3RlbmVyRW50cnkob3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBpbnNlcnRFbnRyeShlbnRyeSk7XG4gIH07XG4gIGFzc2lnbihzdGFydExpc3RlbmluZywge1xuICAgIHdpdGhUeXBlczogKCkgPT4gc3RhcnRMaXN0ZW5pbmdcbiAgfSk7XG4gIGNvbnN0IHN0b3BMaXN0ZW5pbmcgPSAob3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGUsXG4gICAgICBlZmZlY3QsXG4gICAgICBwcmVkaWNhdGVcbiAgICB9ID0gZ2V0TGlzdGVuZXJFbnRyeVByb3BzRnJvbShvcHRpb25zKTtcbiAgICBjb25zdCBlbnRyeSA9IGZpbmQoQXJyYXkuZnJvbShsaXN0ZW5lck1hcC52YWx1ZXMoKSksIChlbnRyeTIpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoUHJlZGljYXRlT3JUeXBlID0gdHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIgPyBlbnRyeTIudHlwZSA9PT0gdHlwZSA6IGVudHJ5Mi5wcmVkaWNhdGUgPT09IHByZWRpY2F0ZTtcbiAgICAgIHJldHVybiBtYXRjaFByZWRpY2F0ZU9yVHlwZSAmJiBlbnRyeTIuZWZmZWN0ID09PSBlZmZlY3Q7XG4gICAgfSk7XG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICBlbnRyeS51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKG9wdGlvbnMuY2FuY2VsQWN0aXZlKSB7XG4gICAgICAgIGNhbmNlbEFjdGl2ZUxpc3RlbmVycyhlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhIWVudHJ5O1xuICB9O1xuICBhc3NpZ24oc3RvcExpc3RlbmluZywge1xuICAgIHdpdGhUeXBlczogKCkgPT4gc3RvcExpc3RlbmluZ1xuICB9KTtcbiAgY29uc3Qgbm90aWZ5TGlzdGVuZXIgPSBhc3luYyAoZW50cnksIGFjdGlvbiwgYXBpLCBnZXRPcmlnaW5hbFN0YXRlKSA9PiB7XG4gICAgY29uc3QgaW50ZXJuYWxUYXNrQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB0YWtlID0gY3JlYXRlVGFrZVBhdHRlcm4oc3RhcnRMaXN0ZW5pbmcsIGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICBjb25zdCBhdXRvSm9pblByb21pc2VzID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGVudHJ5LnBlbmRpbmcuYWRkKGludGVybmFsVGFza0NvbnRyb2xsZXIpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKGVudHJ5LmVmZmVjdChcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICAvLyBVc2UgYXNzaWduKCkgcmF0aGVyIHRoYW4gLi4uIHRvIGF2b2lkIGV4dHJhIGhlbHBlciBmdW5jdGlvbnMgYWRkZWQgdG8gYnVuZGxlXG4gICAgICAgIGFzc2lnbih7fSwgYXBpLCB7XG4gICAgICAgICAgZ2V0T3JpZ2luYWxTdGF0ZSxcbiAgICAgICAgICBjb25kaXRpb246IChwcmVkaWNhdGUsIHRpbWVvdXQpID0+IHRha2UocHJlZGljYXRlLCB0aW1lb3V0KS50aGVuKEJvb2xlYW4pLFxuICAgICAgICAgIHRha2UsXG4gICAgICAgICAgZGVsYXk6IGNyZWF0ZURlbGF5KGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgICBwYXVzZTogY3JlYXRlUGF1c2UoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpLFxuICAgICAgICAgIGV4dHJhLFxuICAgICAgICAgIHNpZ25hbDogaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgZm9yazogY3JlYXRlRm9yayhpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCwgYXV0b0pvaW5Qcm9taXNlcyksXG4gICAgICAgICAgdW5zdWJzY3JpYmU6IGVudHJ5LnVuc3Vic2NyaWJlLFxuICAgICAgICAgIHN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXJNYXAuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjYW5jZWxBY3RpdmVMaXN0ZW5lcnM6ICgpID0+IHtcbiAgICAgICAgICAgIGVudHJ5LnBlbmRpbmcuZm9yRWFjaCgoY29udHJvbGxlciwgXywgc2V0KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9PSBpbnRlcm5hbFRhc2tDb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjb250cm9sbGVyLCBsaXN0ZW5lckNhbmNlbGxlZCk7XG4gICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oaW50ZXJuYWxUYXNrQ29udHJvbGxlciwgbGlzdGVuZXJDYW5jZWxsZWQpO1xuICAgICAgICAgICAgZW50cnkucGVuZGluZy5kZWxldGUoaW50ZXJuYWxUYXNrQ29udHJvbGxlcik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aHJvd0lmQ2FuY2VsbGVkOiAoKSA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0ZUFjdGl2ZShpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKSk7XG4gICAgfSBjYXRjaCAobGlzdGVuZXJFcnJvcikge1xuICAgICAgaWYgKCEobGlzdGVuZXJFcnJvciBpbnN0YW5jZW9mIFRhc2tBYm9ydEVycm9yKSkge1xuICAgICAgICBzYWZlbHlOb3RpZnlFcnJvcihvbkVycm9yLCBsaXN0ZW5lckVycm9yLCB7XG4gICAgICAgICAgcmFpc2VkQnk6IFwiZWZmZWN0XCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGF1dG9Kb2luUHJvbWlzZXMpO1xuICAgICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihpbnRlcm5hbFRhc2tDb250cm9sbGVyLCBsaXN0ZW5lckNvbXBsZXRlZCk7XG4gICAgICBlbnRyeS5wZW5kaW5nLmRlbGV0ZShpbnRlcm5hbFRhc2tDb250cm9sbGVyKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlID0gY3JlYXRlQ2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUobGlzdGVuZXJNYXApO1xuICBjb25zdCBtaWRkbGV3YXJlID0gKGFwaSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAoIWlzQWN0aW9uMyhhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgIH1cbiAgICBpZiAoYWRkTGlzdGVuZXIubWF0Y2goYWN0aW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXJ0TGlzdGVuaW5nKGFjdGlvbi5wYXlsb2FkKTtcbiAgICB9XG4gICAgaWYgKGNsZWFyQWxsTGlzdGVuZXJzLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIGNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZW1vdmVMaXN0ZW5lci5tYXRjaChhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gc3RvcExpc3RlbmluZyhhY3Rpb24ucGF5bG9hZCk7XG4gICAgfVxuICAgIGxldCBvcmlnaW5hbFN0YXRlID0gYXBpLmdldFN0YXRlKCk7XG4gICAgY29uc3QgZ2V0T3JpZ2luYWxTdGF0ZSA9ICgpID0+IHtcbiAgICAgIGlmIChvcmlnaW5hbFN0YXRlID09PSBJTlRFUk5BTF9OSUxfVE9LRU4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjMpIDogYCR7YWxtfTogZ2V0T3JpZ2luYWxTdGF0ZSBjYW4gb25seSBiZSBjYWxsZWQgc3luY2hyb25vdXNseWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9yaWdpbmFsU3RhdGU7XG4gICAgfTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBuZXh0KGFjdGlvbik7XG4gICAgICBpZiAobGlzdGVuZXJNYXAuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gYXBpLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyRW50cmllcyA9IEFycmF5LmZyb20obGlzdGVuZXJNYXAudmFsdWVzKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RlbmVyRW50cmllcykge1xuICAgICAgICAgIGxldCBydW5MaXN0ZW5lciA9IGZhbHNlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBydW5MaXN0ZW5lciA9IGVudHJ5LnByZWRpY2F0ZShhY3Rpb24sIGN1cnJlbnRTdGF0ZSwgb3JpZ2luYWxTdGF0ZSk7XG4gICAgICAgICAgfSBjYXRjaCAocHJlZGljYXRlRXJyb3IpIHtcbiAgICAgICAgICAgIHJ1bkxpc3RlbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBzYWZlbHlOb3RpZnlFcnJvcihvbkVycm9yLCBwcmVkaWNhdGVFcnJvciwge1xuICAgICAgICAgICAgICByYWlzZWRCeTogXCJwcmVkaWNhdGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcnVuTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub3RpZnlMaXN0ZW5lcihlbnRyeSwgYWN0aW9uLCBhcGksIGdldE9yaWdpbmFsU3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG9yaWdpbmFsU3RhdGUgPSBJTlRFUk5BTF9OSUxfVE9LRU47XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWlkZGxld2FyZSxcbiAgICBzdGFydExpc3RlbmluZyxcbiAgICBzdG9wTGlzdGVuaW5nLFxuICAgIGNsZWFyTGlzdGVuZXJzOiBjbGVhckxpc3RlbmVyTWlkZGxld2FyZVxuICB9O1xufTtcblxuLy8gc3JjL2R5bmFtaWNNaWRkbGV3YXJlL2luZGV4LnRzXG5pbXBvcnQgeyBjb21wb3NlIGFzIGNvbXBvc2UzIH0gZnJvbSBcInJlZHV4XCI7XG52YXIgY3JlYXRlTWlkZGxld2FyZUVudHJ5ID0gKG1pZGRsZXdhcmUpID0+ICh7XG4gIGlkOiBuYW5vaWQoKSxcbiAgbWlkZGxld2FyZSxcbiAgYXBwbGllZDogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKVxufSk7XG52YXIgbWF0Y2hJbnN0YW5jZSA9IChpbnN0YW5jZUlkKSA9PiAoYWN0aW9uKSA9PiBhY3Rpb24/Lm1ldGE/Lmluc3RhbmNlSWQgPT09IGluc3RhbmNlSWQ7XG52YXIgY3JlYXRlRHluYW1pY01pZGRsZXdhcmUgPSAoKSA9PiB7XG4gIGNvbnN0IGluc3RhbmNlSWQgPSBuYW5vaWQoKTtcbiAgY29uc3QgbWlkZGxld2FyZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IHdpdGhNaWRkbGV3YXJlID0gT2JqZWN0LmFzc2lnbihjcmVhdGVBY3Rpb24oXCJkeW5hbWljTWlkZGxld2FyZS9hZGRcIiwgKC4uLm1pZGRsZXdhcmVzKSA9PiAoe1xuICAgIHBheWxvYWQ6IG1pZGRsZXdhcmVzLFxuICAgIG1ldGE6IHtcbiAgICAgIGluc3RhbmNlSWRcbiAgICB9XG4gIH0pKSwge1xuICAgIHdpdGhUeXBlczogKCkgPT4gd2l0aE1pZGRsZXdhcmVcbiAgfSk7XG4gIGNvbnN0IGFkZE1pZGRsZXdhcmUgPSBPYmplY3QuYXNzaWduKGZ1bmN0aW9uIGFkZE1pZGRsZXdhcmUyKC4uLm1pZGRsZXdhcmVzKSB7XG4gICAgbWlkZGxld2FyZXMuZm9yRWFjaCgobWlkZGxld2FyZTIpID0+IHtcbiAgICAgIGxldCBlbnRyeSA9IGZpbmQoQXJyYXkuZnJvbShtaWRkbGV3YXJlTWFwLnZhbHVlcygpKSwgKGVudHJ5MikgPT4gZW50cnkyLm1pZGRsZXdhcmUgPT09IG1pZGRsZXdhcmUyKTtcbiAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgZW50cnkgPSBjcmVhdGVNaWRkbGV3YXJlRW50cnkobWlkZGxld2FyZTIpO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZU1hcC5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICB9KTtcbiAgfSwge1xuICAgIHdpdGhUeXBlczogKCkgPT4gYWRkTWlkZGxld2FyZVxuICB9KTtcbiAgY29uc3QgZ2V0RmluYWxNaWRkbGV3YXJlID0gKGFwaSkgPT4ge1xuICAgIGNvbnN0IGFwcGxpZWRNaWRkbGV3YXJlID0gQXJyYXkuZnJvbShtaWRkbGV3YXJlTWFwLnZhbHVlcygpKS5tYXAoKGVudHJ5KSA9PiBlbXBsYWNlKGVudHJ5LmFwcGxpZWQsIGFwaSwge1xuICAgICAgaW5zZXJ0OiAoKSA9PiBlbnRyeS5taWRkbGV3YXJlKGFwaSlcbiAgICB9KSk7XG4gICAgcmV0dXJuIGNvbXBvc2UzKC4uLmFwcGxpZWRNaWRkbGV3YXJlKTtcbiAgfTtcbiAgY29uc3QgaXNXaXRoTWlkZGxld2FyZSA9IGlzQWxsT2Yod2l0aE1pZGRsZXdhcmUsIG1hdGNoSW5zdGFuY2UoaW5zdGFuY2VJZCkpO1xuICBjb25zdCBtaWRkbGV3YXJlID0gKGFwaSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAoaXNXaXRoTWlkZGxld2FyZShhY3Rpb24pKSB7XG4gICAgICBhZGRNaWRkbGV3YXJlKC4uLmFjdGlvbi5wYXlsb2FkKTtcbiAgICAgIHJldHVybiBhcGkuZGlzcGF0Y2g7XG4gICAgfVxuICAgIHJldHVybiBnZXRGaW5hbE1pZGRsZXdhcmUoYXBpKShuZXh0KShhY3Rpb24pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIG1pZGRsZXdhcmUsXG4gICAgYWRkTWlkZGxld2FyZSxcbiAgICB3aXRoTWlkZGxld2FyZSxcbiAgICBpbnN0YW5jZUlkXG4gIH07XG59O1xuXG4vLyBzcmMvY29tYmluZVNsaWNlcy50c1xuaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzIGFzIGNvbWJpbmVSZWR1Y2VyczIgfSBmcm9tIFwicmVkdXhcIjtcbnZhciBpc1NsaWNlTGlrZSA9IChtYXliZVNsaWNlTGlrZSkgPT4gXCJyZWR1Y2VyUGF0aFwiIGluIG1heWJlU2xpY2VMaWtlICYmIHR5cGVvZiBtYXliZVNsaWNlTGlrZS5yZWR1Y2VyUGF0aCA9PT0gXCJzdHJpbmdcIjtcbnZhciBnZXRSZWR1Y2VycyA9IChzbGljZXMpID0+IHNsaWNlcy5mbGF0TWFwKChzbGljZU9yTWFwKSA9PiBpc1NsaWNlTGlrZShzbGljZU9yTWFwKSA/IFtbc2xpY2VPck1hcC5yZWR1Y2VyUGF0aCwgc2xpY2VPck1hcC5yZWR1Y2VyXV0gOiBPYmplY3QuZW50cmllcyhzbGljZU9yTWFwKSk7XG52YXIgT1JJR0lOQUxfU1RBVEUgPSBTeW1ib2wuZm9yKFwicnRrLXN0YXRlLXByb3h5LW9yaWdpbmFsXCIpO1xudmFyIGlzU3RhdGVQcm94eSA9ICh2YWx1ZSkgPT4gISF2YWx1ZSAmJiAhIXZhbHVlW09SSUdJTkFMX1NUQVRFXTtcbnZhciBzdGF0ZVByb3h5TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG52YXIgY3JlYXRlU3RhdGVQcm94eSA9IChzdGF0ZSwgcmVkdWNlck1hcCkgPT4gZW1wbGFjZShzdGF0ZVByb3h5TWFwLCBzdGF0ZSwge1xuICBpbnNlcnQ6ICgpID0+IG5ldyBQcm94eShzdGF0ZSwge1xuICAgIGdldDogKHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpID0+IHtcbiAgICAgIGlmIChwcm9wID09PSBPUklHSU5BTF9TVEFURSkgcmV0dXJuIHRhcmdldDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc3QgcmVkdWNlciA9IHJlZHVjZXJNYXBbcHJvcC50b1N0cmluZygpXTtcbiAgICAgICAgaWYgKHJlZHVjZXIpIHtcbiAgICAgICAgICBjb25zdCByZWR1Y2VyUmVzdWx0ID0gcmVkdWNlcih2b2lkIDAsIHtcbiAgICAgICAgICAgIHR5cGU6IG5hbm9pZCgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZWR1Y2VyUmVzdWx0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyNCkgOiBgVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7cHJvcC50b1N0cmluZygpfVwiIHJldHVybmVkIHVuZGVmaW5lZCB3aGVuIGNhbGxlZCBmb3Igc2VsZWN0b3IoKS4gSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgeW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlZHVjZXJSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9KVxufSk7XG52YXIgb3JpZ2luYWwgPSAoc3RhdGUpID0+IHtcbiAgaWYgKCFpc1N0YXRlUHJveHkoc3RhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjUpIDogXCJvcmlnaW5hbCBtdXN0IGJlIHVzZWQgb24gc3RhdGUgUHJveHlcIik7XG4gIH1cbiAgcmV0dXJuIHN0YXRlW09SSUdJTkFMX1NUQVRFXTtcbn07XG52YXIgbm9vcFJlZHVjZXIgPSAoc3RhdGUgPSB7fSkgPT4gc3RhdGU7XG5mdW5jdGlvbiBjb21iaW5lU2xpY2VzKC4uLnNsaWNlcykge1xuICBjb25zdCByZWR1Y2VyTWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKGdldFJlZHVjZXJzKHNsaWNlcykpO1xuICBjb25zdCBnZXRSZWR1Y2VyID0gKCkgPT4gT2JqZWN0LmtleXMocmVkdWNlck1hcCkubGVuZ3RoID8gY29tYmluZVJlZHVjZXJzMihyZWR1Y2VyTWFwKSA6IG5vb3BSZWR1Y2VyO1xuICBsZXQgcmVkdWNlciA9IGdldFJlZHVjZXIoKTtcbiAgZnVuY3Rpb24gY29tYmluZWRSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgICByZXR1cm4gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgfVxuICBjb21iaW5lZFJlZHVjZXIud2l0aExhenlMb2FkZWRTbGljZXMgPSAoKSA9PiBjb21iaW5lZFJlZHVjZXI7XG4gIGNvbnN0IGluamVjdCA9IChzbGljZSwgY29uZmlnID0ge30pID0+IHtcbiAgICBjb25zdCB7XG4gICAgICByZWR1Y2VyUGF0aCxcbiAgICAgIHJlZHVjZXI6IHJlZHVjZXJUb0luamVjdFxuICAgIH0gPSBzbGljZTtcbiAgICBjb25zdCBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXJNYXBbcmVkdWNlclBhdGhdO1xuICAgIGlmICghY29uZmlnLm92ZXJyaWRlRXhpc3RpbmcgJiYgY3VycmVudFJlZHVjZXIgJiYgY3VycmVudFJlZHVjZXIgIT09IHJlZHVjZXJUb0luamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgY2FsbGVkIFxcYGluamVjdFxcYCB0byBvdmVycmlkZSBhbHJlYWR5LWV4aXN0aW5nIHJlZHVjZXIgJHtyZWR1Y2VyUGF0aH0gd2l0aG91dCBzcGVjaWZ5aW5nIFxcYG92ZXJyaWRlRXhpc3Rpbmc6IHRydWVcXGBgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21iaW5lZFJlZHVjZXI7XG4gICAgfVxuICAgIHJlZHVjZXJNYXBbcmVkdWNlclBhdGhdID0gcmVkdWNlclRvSW5qZWN0O1xuICAgIHJlZHVjZXIgPSBnZXRSZWR1Y2VyKCk7XG4gICAgcmV0dXJuIGNvbWJpbmVkUmVkdWNlcjtcbiAgfTtcbiAgY29uc3Qgc2VsZWN0b3IgPSBPYmplY3QuYXNzaWduKGZ1bmN0aW9uIG1ha2VTZWxlY3RvcihzZWxlY3RvckZuLCBzZWxlY3RTdGF0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBzZWxlY3RvcjIoc3RhdGUsIC4uLmFyZ3MpIHtcbiAgICAgIHJldHVybiBzZWxlY3RvckZuKGNyZWF0ZVN0YXRlUHJveHkoc2VsZWN0U3RhdGUgPyBzZWxlY3RTdGF0ZShzdGF0ZSwgLi4uYXJncykgOiBzdGF0ZSwgcmVkdWNlck1hcCksIC4uLmFyZ3MpO1xuICAgIH07XG4gIH0sIHtcbiAgICBvcmlnaW5hbFxuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oY29tYmluZWRSZWR1Y2VyLCB7XG4gICAgaW5qZWN0LFxuICAgIHNlbGVjdG9yXG4gIH0pO1xufVxuXG4vLyBzcmMvZm9ybWF0UHJvZEVycm9yTWVzc2FnZS50c1xuZnVuY3Rpb24gZm9ybWF0UHJvZEVycm9yTWVzc2FnZShjb2RlKSB7XG4gIHJldHVybiBgTWluaWZpZWQgUmVkdXggVG9vbGtpdCBlcnJvciAjJHtjb2RlfTsgdmlzaXQgaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy9FcnJvcnM/Y29kZT0ke2NvZGV9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMuIGA7XG59XG5leHBvcnQge1xuICBSZWR1Y2VyVHlwZSxcbiAgU0hPVUxEX0FVVE9CQVRDSCxcbiAgVGFza0Fib3J0RXJyb3IsXG4gIFR1cGxlLFxuICBhZGRMaXN0ZW5lcixcbiAgYXN5bmNUaHVua0NyZWF0b3IsXG4gIGF1dG9CYXRjaEVuaGFuY2VyLFxuICBidWlsZENyZWF0ZVNsaWNlLFxuICBjbGVhckFsbExpc3RlbmVycyxcbiAgY29tYmluZVNsaWNlcyxcbiAgY29uZmlndXJlU3RvcmUsXG4gIGNyZWF0ZUFjdGlvbixcbiAgY3JlYXRlQWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUsXG4gIGNyZWF0ZUFzeW5jVGh1bmssXG4gIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yLFxuICBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvckNyZWF0b3IsXG4gIGNyZWF0ZUR5bmFtaWNNaWRkbGV3YXJlLFxuICBjcmVhdGVFbnRpdHlBZGFwdGVyLFxuICBjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUsXG4gIGNyZWF0ZUxpc3RlbmVyTWlkZGxld2FyZSxcbiAgcHJvZHVjZSBhcyBjcmVhdGVOZXh0U3RhdGUsXG4gIGNyZWF0ZVJlZHVjZXIsXG4gIGNyZWF0ZVNlbGVjdG9yLFxuICBjcmVhdGVTZWxlY3RvckNyZWF0b3IyIGFzIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcixcbiAgY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLFxuICBjcmVhdGVTbGljZSxcbiAgY3VycmVudDMgYXMgY3VycmVudCxcbiAgZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlLFxuICBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlLFxuICBmcmVlemUsXG4gIGlzQWN0aW9uQ3JlYXRvcixcbiAgaXNBbGxPZixcbiAgaXNBbnlPZixcbiAgaXNBc3luY1RodW5rQWN0aW9uLFxuICBpc0RyYWZ0NSBhcyBpc0RyYWZ0LFxuICBpc0ZTQSBhcyBpc0ZsdXhTdGFuZGFyZEFjdGlvbixcbiAgaXNGdWxmaWxsZWQsXG4gIGlzSW1tdXRhYmxlRGVmYXVsdCxcbiAgaXNQZW5kaW5nLFxuICBpc1BsYWluLFxuICBpc1JlamVjdGVkLFxuICBpc1JlamVjdGVkV2l0aFZhbHVlLFxuICBscnVNZW1vaXplLFxuICBtaW5pU2VyaWFsaXplRXJyb3IsXG4gIG5hbm9pZCxcbiAgb3JpZ2luYWwyIGFzIG9yaWdpbmFsLFxuICBwcmVwYXJlQXV0b0JhdGNoZWQsXG4gIHJlbW92ZUxpc3RlbmVyLFxuICB1bndyYXBSZXN1bHQsXG4gIHdlYWtNYXBNZW1vaXplMiBhcyB3ZWFrTWFwTWVtb2l6ZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZHV4LXRvb2xraXQubW9kZXJuLm1qcy5tYXAiLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IGh0dHBBZGFwdGVyIGZyb20gJy4vaHR0cC5qcyc7XG5pbXBvcnQgeGhyQWRhcHRlciBmcm9tICcuL3hoci5qcyc7XG5pbXBvcnQgZmV0Y2hBZGFwdGVyIGZyb20gJy4vZmV0Y2guanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuXG5jb25zdCBrbm93bkFkYXB0ZXJzID0ge1xuICBodHRwOiBodHRwQWRhcHRlcixcbiAgeGhyOiB4aHJBZGFwdGVyLFxuICBmZXRjaDogZmV0Y2hBZGFwdGVyXG59XG5cbnV0aWxzLmZvckVhY2goa25vd25BZGFwdGVycywgKGZuLCB2YWx1ZSkgPT4ge1xuICBpZiAoZm4pIHtcbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHt2YWx1ZX0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICdhZGFwdGVyTmFtZScsIHt2YWx1ZX0pO1xuICB9XG59KTtcblxuY29uc3QgcmVuZGVyUmVhc29uID0gKHJlYXNvbikgPT4gYC0gJHtyZWFzb259YDtcblxuY29uc3QgaXNSZXNvbHZlZEhhbmRsZSA9IChhZGFwdGVyKSA9PiB1dGlscy5pc0Z1bmN0aW9uKGFkYXB0ZXIpIHx8IGFkYXB0ZXIgPT09IG51bGwgfHwgYWRhcHRlciA9PT0gZmFsc2U7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZ2V0QWRhcHRlcjogKGFkYXB0ZXJzKSA9PiB7XG4gICAgYWRhcHRlcnMgPSB1dGlscy5pc0FycmF5KGFkYXB0ZXJzKSA/IGFkYXB0ZXJzIDogW2FkYXB0ZXJzXTtcblxuICAgIGNvbnN0IHtsZW5ndGh9ID0gYWRhcHRlcnM7XG4gICAgbGV0IG5hbWVPckFkYXB0ZXI7XG4gICAgbGV0IGFkYXB0ZXI7XG5cbiAgICBjb25zdCByZWplY3RlZFJlYXNvbnMgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVPckFkYXB0ZXIgPSBhZGFwdGVyc1tpXTtcbiAgICAgIGxldCBpZDtcblxuICAgICAgYWRhcHRlciA9IG5hbWVPckFkYXB0ZXI7XG5cbiAgICAgIGlmICghaXNSZXNvbHZlZEhhbmRsZShuYW1lT3JBZGFwdGVyKSkge1xuICAgICAgICBhZGFwdGVyID0ga25vd25BZGFwdGVyc1soaWQgPSBTdHJpbmcobmFtZU9yQWRhcHRlcikpLnRvTG93ZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChhZGFwdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgVW5rbm93biBhZGFwdGVyICcke2lkfSdgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmVqZWN0ZWRSZWFzb25zW2lkIHx8ICcjJyArIGldID0gYWRhcHRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWFkYXB0ZXIpIHtcblxuICAgICAgY29uc3QgcmVhc29ucyA9IE9iamVjdC5lbnRyaWVzKHJlamVjdGVkUmVhc29ucylcbiAgICAgICAgLm1hcCgoW2lkLCBzdGF0ZV0pID0+IGBhZGFwdGVyICR7aWR9IGAgK1xuICAgICAgICAgIChzdGF0ZSA9PT0gZmFsc2UgPyAnaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQnIDogJ2lzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkJylcbiAgICAgICAgKTtcblxuICAgICAgbGV0IHMgPSBsZW5ndGggP1xuICAgICAgICAocmVhc29ucy5sZW5ndGggPiAxID8gJ3NpbmNlIDpcXG4nICsgcmVhc29ucy5tYXAocmVuZGVyUmVhc29uKS5qb2luKCdcXG4nKSA6ICcgJyArIHJlbmRlclJlYXNvbihyZWFzb25zWzBdKSkgOlxuICAgICAgICAnYXMgbm8gYWRhcHRlciBzcGVjaWZpZWQnO1xuXG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgYFRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgYCArIHMsXG4gICAgICAgICdFUlJfTk9UX1NVUFBPUlQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhZGFwdGVyO1xuICB9LFxuICBhZGFwdGVyczoga25vd25BZGFwdGVyc1xufVxuIiwiaW1wb3J0IHBsYXRmb3JtIGZyb20gXCIuLi9wbGF0Zm9ybS9pbmRleC5qc1wiO1xuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuaW1wb3J0IGNvbXBvc2VTaWduYWxzIGZyb20gXCIuLi9oZWxwZXJzL2NvbXBvc2VTaWduYWxzLmpzXCI7XG5pbXBvcnQge3RyYWNrU3RyZWFtfSBmcm9tIFwiLi4vaGVscGVycy90cmFja1N0cmVhbS5qc1wiO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi4vY29yZS9BeGlvc0hlYWRlcnMuanNcIjtcbmltcG9ydCB7cHJvZ3Jlc3NFdmVudFJlZHVjZXIsIHByb2dyZXNzRXZlbnREZWNvcmF0b3IsIGFzeW5jRGVjb3JhdG9yfSBmcm9tIFwiLi4vaGVscGVycy9wcm9ncmVzc0V2ZW50UmVkdWNlci5qc1wiO1xuaW1wb3J0IHJlc29sdmVDb25maWcgZnJvbSBcIi4uL2hlbHBlcnMvcmVzb2x2ZUNvbmZpZy5qc1wiO1xuaW1wb3J0IHNldHRsZSBmcm9tIFwiLi4vY29yZS9zZXR0bGUuanNcIjtcblxuY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IHR5cGVvZiBmZXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbic7XG5jb25zdCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZCAmJiB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICdmdW5jdGlvbic7XG5cbi8vIHVzZWQgb25seSBpbnNpZGUgdGhlIGZldGNoIGFkYXB0ZXJcbmNvbnN0IGVuY29kZVRleHQgPSBpc0ZldGNoU3VwcG9ydGVkICYmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicgP1xuICAgICgoZW5jb2RlcikgPT4gKHN0cikgPT4gZW5jb2Rlci5lbmNvZGUoc3RyKSkobmV3IFRleHRFbmNvZGVyKCkpIDpcbiAgICBhc3luYyAoc3RyKSA9PiBuZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVzcG9uc2Uoc3RyKS5hcnJheUJ1ZmZlcigpKVxuKTtcblxuY29uc3QgdGVzdCA9IChmbiwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIWZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuY29uc3Qgc3VwcG9ydHNSZXF1ZXN0U3RyZWFtID0gaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJiB0ZXN0KCgpID0+IHtcbiAgbGV0IGR1cGxleEFjY2Vzc2VkID0gZmFsc2U7XG5cbiAgY29uc3QgaGFzQ29udGVudFR5cGUgPSBuZXcgUmVxdWVzdChwbGF0Zm9ybS5vcmlnaW4sIHtcbiAgICBib2R5OiBuZXcgUmVhZGFibGVTdHJlYW0oKSxcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBnZXQgZHVwbGV4KCkge1xuICAgICAgZHVwbGV4QWNjZXNzZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuICdoYWxmJztcbiAgICB9LFxuICB9KS5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJyk7XG5cbiAgcmV0dXJuIGR1cGxleEFjY2Vzc2VkICYmICFoYXNDb250ZW50VHlwZTtcbn0pO1xuXG5jb25zdCBERUZBVUxUX0NIVU5LX1NJWkUgPSA2NCAqIDEwMjQ7XG5cbmNvbnN0IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gPSBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkICYmXG4gIHRlc3QoKCkgPT4gdXRpbHMuaXNSZWFkYWJsZVN0cmVhbShuZXcgUmVzcG9uc2UoJycpLmJvZHkpKTtcblxuXG5jb25zdCByZXNvbHZlcnMgPSB7XG4gIHN0cmVhbTogc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAoKHJlcykgPT4gcmVzLmJvZHkpXG59O1xuXG5pc0ZldGNoU3VwcG9ydGVkICYmICgoKHJlcykgPT4ge1xuICBbJ3RleHQnLCAnYXJyYXlCdWZmZXInLCAnYmxvYicsICdmb3JtRGF0YScsICdzdHJlYW0nXS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICFyZXNvbHZlcnNbdHlwZV0gJiYgKHJlc29sdmVyc1t0eXBlXSA9IHV0aWxzLmlzRnVuY3Rpb24ocmVzW3R5cGVdKSA/IChyZXMpID0+IHJlc1t0eXBlXSgpIDpcbiAgICAgIChfLCBjb25maWcpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoYFJlc3BvbnNlIHR5cGUgJyR7dHlwZX0nIGlzIG5vdCBzdXBwb3J0ZWRgLCBBeGlvc0Vycm9yLkVSUl9OT1RfU1VQUE9SVCwgY29uZmlnKTtcbiAgICAgIH0pXG4gIH0pO1xufSkobmV3IFJlc3BvbnNlKSk7XG5cbmNvbnN0IGdldEJvZHlMZW5ndGggPSBhc3luYyAoYm9keSkgPT4ge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZih1dGlscy5pc0Jsb2IoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5zaXplO1xuICB9XG5cbiAgaWYodXRpbHMuaXNTcGVjQ29tcGxpYW50Rm9ybShib2R5KSkge1xuICAgIHJldHVybiAoYXdhaXQgbmV3IFJlcXVlc3QoYm9keSkuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzLmlzQXJyYXlCdWZmZXJWaWV3KGJvZHkpIHx8IHV0aWxzLmlzQXJyYXlCdWZmZXIoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5ieXRlTGVuZ3RoO1xuICB9XG5cbiAgaWYodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoYm9keSkpIHtcbiAgICBib2R5ID0gYm9keSArICcnO1xuICB9XG5cbiAgaWYodXRpbHMuaXNTdHJpbmcoYm9keSkpIHtcbiAgICByZXR1cm4gKGF3YWl0IGVuY29kZVRleHQoYm9keSkpLmJ5dGVMZW5ndGg7XG4gIH1cbn1cblxuY29uc3QgcmVzb2x2ZUJvZHlMZW5ndGggPSBhc3luYyAoaGVhZGVycywgYm9keSkgPT4ge1xuICBjb25zdCBsZW5ndGggPSB1dGlscy50b0Zpbml0ZU51bWJlcihoZWFkZXJzLmdldENvbnRlbnRMZW5ndGgoKSk7XG5cbiAgcmV0dXJuIGxlbmd0aCA9PSBudWxsID8gZ2V0Qm9keUxlbmd0aChib2R5KSA6IGxlbmd0aDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNGZXRjaFN1cHBvcnRlZCAmJiAoYXN5bmMgKGNvbmZpZykgPT4ge1xuICBsZXQge1xuICAgIHVybCxcbiAgICBtZXRob2QsXG4gICAgZGF0YSxcbiAgICBzaWduYWwsXG4gICAgY2FuY2VsVG9rZW4sXG4gICAgdGltZW91dCxcbiAgICBvbkRvd25sb2FkUHJvZ3Jlc3MsXG4gICAgb25VcGxvYWRQcm9ncmVzcyxcbiAgICByZXNwb25zZVR5cGUsXG4gICAgaGVhZGVycyxcbiAgICB3aXRoQ3JlZGVudGlhbHMgPSAnc2FtZS1vcmlnaW4nLFxuICAgIGZldGNoT3B0aW9uc1xuICB9ID0gcmVzb2x2ZUNvbmZpZyhjb25maWcpO1xuXG4gIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSA/IChyZXNwb25zZVR5cGUgKyAnJykudG9Mb3dlckNhc2UoKSA6ICd0ZXh0JztcblxuICBsZXQgW2NvbXBvc2VkU2lnbmFsLCBzdG9wVGltZW91dF0gPSAoc2lnbmFsIHx8IGNhbmNlbFRva2VuIHx8IHRpbWVvdXQpID9cbiAgICBjb21wb3NlU2lnbmFscyhbc2lnbmFsLCBjYW5jZWxUb2tlbl0sIHRpbWVvdXQpIDogW107XG5cbiAgbGV0IGZpbmlzaGVkLCByZXF1ZXN0O1xuXG4gIGNvbnN0IG9uRmluaXNoID0gKCkgPT4ge1xuICAgICFmaW5pc2hlZCAmJiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbXBvc2VkU2lnbmFsICYmIGNvbXBvc2VkU2lnbmFsLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG5cbiAgICBmaW5pc2hlZCA9IHRydWU7XG4gIH1cblxuICBsZXQgcmVxdWVzdENvbnRlbnRMZW5ndGg7XG5cbiAgdHJ5IHtcbiAgICBpZiAoXG4gICAgICBvblVwbG9hZFByb2dyZXNzICYmIHN1cHBvcnRzUmVxdWVzdFN0cmVhbSAmJiBtZXRob2QgIT09ICdnZXQnICYmIG1ldGhvZCAhPT0gJ2hlYWQnICYmXG4gICAgICAocmVxdWVzdENvbnRlbnRMZW5ndGggPSBhd2FpdCByZXNvbHZlQm9keUxlbmd0aChoZWFkZXJzLCBkYXRhKSkgIT09IDBcbiAgICApIHtcbiAgICAgIGxldCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgZHVwbGV4OiBcImhhbGZcIlxuICAgICAgfSk7XG5cbiAgICAgIGxldCBjb250ZW50VHlwZUhlYWRlcjtcblxuICAgICAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkgJiYgKGNvbnRlbnRUeXBlSGVhZGVyID0gX3JlcXVlc3QuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSkge1xuICAgICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSGVhZGVyKVxuICAgICAgfVxuXG4gICAgICBpZiAoX3JlcXVlc3QuYm9keSkge1xuICAgICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gcHJvZ3Jlc3NFdmVudERlY29yYXRvcihcbiAgICAgICAgICByZXF1ZXN0Q29udGVudExlbmd0aCxcbiAgICAgICAgICBwcm9ncmVzc0V2ZW50UmVkdWNlcihhc3luY0RlY29yYXRvcihvblVwbG9hZFByb2dyZXNzKSlcbiAgICAgICAgKTtcblxuICAgICAgICBkYXRhID0gdHJhY2tTdHJlYW0oX3JlcXVlc3QuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvblByb2dyZXNzLCBmbHVzaCwgZW5jb2RlVGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF1dGlscy5pc1N0cmluZyh3aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICB3aXRoQ3JlZGVudGlhbHMgPSB3aXRoQ3JlZGVudGlhbHMgPyAnaW5jbHVkZScgOiAnb21pdCc7XG4gICAgfVxuXG4gICAgLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIHRocm93cyB3aGVuIGNyZWRlbnRpYWxzIGFyZSBkZWZpbmVkXG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG91ZGZsYXJlL3dvcmtlcmQvaXNzdWVzLzkwMlxuICAgIGNvbnN0IGlzQ3JlZGVudGlhbHNTdXBwb3J0ZWQgPSBcImNyZWRlbnRpYWxzXCIgaW4gUmVxdWVzdC5wcm90b3R5cGU7IFxuICAgIHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIHtcbiAgICAgIC4uLmZldGNoT3B0aW9ucyxcbiAgICAgIHNpZ25hbDogY29tcG9zZWRTaWduYWwsXG4gICAgICBtZXRob2Q6IG1ldGhvZC50b1VwcGVyQ2FzZSgpLFxuICAgICAgaGVhZGVyczogaGVhZGVycy5ub3JtYWxpemUoKS50b0pTT04oKSxcbiAgICAgIGJvZHk6IGRhdGEsXG4gICAgICBkdXBsZXg6IFwiaGFsZlwiLFxuICAgICAgY3JlZGVudGlhbHM6IGlzQ3JlZGVudGlhbHNTdXBwb3J0ZWQgPyB3aXRoQ3JlZGVudGlhbHMgOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuXG4gICAgY29uc3QgaXNTdHJlYW1SZXNwb25zZSA9IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gJiYgKHJlc3BvbnNlVHlwZSA9PT0gJ3N0cmVhbScgfHwgcmVzcG9uc2VUeXBlID09PSAncmVzcG9uc2UnKTtcblxuICAgIGlmIChzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChvbkRvd25sb2FkUHJvZ3Jlc3MgfHwgaXNTdHJlYW1SZXNwb25zZSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcblxuICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IHJlc3BvbnNlW3Byb3BdO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKTtcblxuICAgICAgY29uc3QgW29uUHJvZ3Jlc3MsIGZsdXNoXSA9IG9uRG93bmxvYWRQcm9ncmVzcyAmJiBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yKFxuICAgICAgICByZXNwb25zZUNvbnRlbnRMZW5ndGgsXG4gICAgICAgIHByb2dyZXNzRXZlbnRSZWR1Y2VyKGFzeW5jRGVjb3JhdG9yKG9uRG93bmxvYWRQcm9ncmVzcyksIHRydWUpXG4gICAgICApIHx8IFtdO1xuXG4gICAgICByZXNwb25zZSA9IG5ldyBSZXNwb25zZShcbiAgICAgICAgdHJhY2tTdHJlYW0ocmVzcG9uc2UuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvblByb2dyZXNzLCAoKSA9PiB7XG4gICAgICAgICAgZmx1c2ggJiYgZmx1c2goKTtcbiAgICAgICAgICBpc1N0cmVhbVJlc3BvbnNlICYmIG9uRmluaXNoKCk7XG4gICAgICAgIH0sIGVuY29kZVRleHQpLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSB8fCAndGV4dCc7XG5cbiAgICBsZXQgcmVzcG9uc2VEYXRhID0gYXdhaXQgcmVzb2x2ZXJzW3V0aWxzLmZpbmRLZXkocmVzb2x2ZXJzLCByZXNwb25zZVR5cGUpIHx8ICd0ZXh0J10ocmVzcG9uc2UsIGNvbmZpZyk7XG5cbiAgICAhaXNTdHJlYW1SZXNwb25zZSAmJiBvbkZpbmlzaCgpO1xuXG4gICAgc3RvcFRpbWVvdXQgJiYgc3RvcFRpbWVvdXQoKTtcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgaGVhZGVyczogQXhpb3NIZWFkZXJzLmZyb20ocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH0pXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgb25GaW5pc2goKTtcblxuICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdUeXBlRXJyb3InICYmIC9mZXRjaC9pLnRlc3QoZXJyLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKFxuICAgICAgICBuZXcgQXhpb3NFcnJvcignTmV0d29yayBFcnJvcicsIEF4aW9zRXJyb3IuRVJSX05FVFdPUkssIGNvbmZpZywgcmVxdWVzdCksXG4gICAgICAgIHtcbiAgICAgICAgICBjYXVzZTogZXJyLmNhdXNlIHx8IGVyclxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuXG4gICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGVyciwgZXJyICYmIGVyci5jb2RlLCBjb25maWcsIHJlcXVlc3QpO1xuICB9XG59KTtcblxuXG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgc2V0dGxlIGZyb20gJy4vLi4vY29yZS9zZXR0bGUuanMnO1xuaW1wb3J0IHRyYW5zaXRpb25hbERlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzL3RyYW5zaXRpb25hbC5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IHBhcnNlUHJvdG9jb2wgZnJvbSAnLi4vaGVscGVycy9wYXJzZVByb3RvY29sLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcbmltcG9ydCB7cHJvZ3Jlc3NFdmVudFJlZHVjZXJ9IGZyb20gJy4uL2hlbHBlcnMvcHJvZ3Jlc3NFdmVudFJlZHVjZXIuanMnO1xuaW1wb3J0IHJlc29sdmVDb25maWcgZnJvbSBcIi4uL2hlbHBlcnMvcmVzb2x2ZUNvbmZpZy5qc1wiO1xuXG5jb25zdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgZGVmYXVsdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgJiYgZnVuY3Rpb24gKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNvbnN0IF9jb25maWcgPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG4gICAgbGV0IHJlcXVlc3REYXRhID0gX2NvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oX2NvbmZpZy5oZWFkZXJzKS5ub3JtYWxpemUoKTtcbiAgICBsZXQge3Jlc3BvbnNlVHlwZSwgb25VcGxvYWRQcm9ncmVzcywgb25Eb3dubG9hZFByb2dyZXNzfSA9IF9jb25maWc7XG4gICAgbGV0IG9uQ2FuY2VsZWQ7XG4gICAgbGV0IHVwbG9hZFRocm90dGxlZCwgZG93bmxvYWRUaHJvdHRsZWQ7XG4gICAgbGV0IGZsdXNoVXBsb2FkLCBmbHVzaERvd25sb2FkO1xuXG4gICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgIGZsdXNoVXBsb2FkICYmIGZsdXNoVXBsb2FkKCk7IC8vIGZsdXNoIGV2ZW50c1xuICAgICAgZmx1c2hEb3dubG9hZCAmJiBmbHVzaERvd25sb2FkKCk7IC8vIGZsdXNoIGV2ZW50c1xuXG4gICAgICBfY29uZmlnLmNhbmNlbFRva2VuICYmIF9jb25maWcuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG5cbiAgICAgIF9jb25maWcuc2lnbmFsICYmIF9jb25maWcuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIHJlcXVlc3Qub3BlbihfY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBfY29uZmlnLnVybCwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCBpbiBNU1xuICAgIHJlcXVlc3QudGltZW91dCA9IF9jb25maWcudGltZW91dDtcblxuICAgIGZ1bmN0aW9uIG9ubG9hZGVuZCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oXG4gICAgICAgICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgJiYgcmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9ICFyZXNwb25zZVR5cGUgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgfHwgcmVzcG9uc2VUeXBlID09PSAnanNvbicgP1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGV4dCA6IHJlcXVlc3QucmVzcG9uc2U7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0XG4gICAgICB9O1xuXG4gICAgICBzZXR0bGUoZnVuY3Rpb24gX3Jlc29sdmUodmFsdWUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uIF9yZWplY3QoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCByZXNwb25zZSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICgnb25sb2FkZW5kJyBpbiByZXF1ZXN0KSB7XG4gICAgICAvLyBVc2Ugb25sb2FkZW5kIGlmIGF2YWlsYWJsZVxuICAgICAgcmVxdWVzdC5vbmxvYWRlbmQgPSBvbmxvYWRlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGUgdG8gZW11bGF0ZSBvbmxvYWRlbmRcbiAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBXaXRoIG9uZSBleGNlcHRpb246IHJlcXVlc3QgdGhhdCB1c2luZyBmaWxlOiBwcm90b2NvbCwgbW9zdCBicm93c2Vyc1xuICAgICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWFkeXN0YXRlIGhhbmRsZXIgaXMgY2FsbGluZyBiZWZvcmUgb25lcnJvciBvciBvbnRpbWVvdXQgaGFuZGxlcnMsXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBjYWxsIG9ubG9hZGVuZCBvbiB0aGUgbmV4dCAndGljaydcbiAgICAgICAgc2V0VGltZW91dChvbmxvYWRlbmQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgcmVxdWVzdC5vbmFib3J0ID0gZnVuY3Rpb24gaGFuZGxlQWJvcnQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcsIEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELCBjb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcbiAgICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgICAgLy8gb25lcnJvciBzaG91bGQgb25seSBmaXJlIGlmIGl0J3MgYSBuZXR3b3JrIGVycm9yXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgbGV0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBfY29uZmlnLnRpbWVvdXQgPyAndGltZW91dCBvZiAnICsgX2NvbmZpZy50aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJyA6ICd0aW1lb3V0IGV4Y2VlZGVkJztcbiAgICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IF9jb25maWcudHJhbnNpdGlvbmFsIHx8IHRyYW5zaXRpb25hbERlZmF1bHRzO1xuICAgICAgaWYgKF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICB0cmFuc2l0aW9uYWwuY2xhcmlmeVRpbWVvdXRFcnJvciA/IEF4aW9zRXJyb3IuRVRJTUVET1VUIDogQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gUmVtb3ZlIENvbnRlbnQtVHlwZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICAgIHJlcXVlc3REYXRhID09PSB1bmRlZmluZWQgJiYgcmVxdWVzdEhlYWRlcnMuc2V0Q29udGVudFR5cGUobnVsbCk7XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycy50b0pTT04oKSwgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoX2NvbmZpZy53aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9ICEhX2NvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gX2NvbmZpZy5yZXNwb25zZVR5cGU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHByb2dyZXNzIGlmIG5lZWRlZFxuICAgIGlmIChvbkRvd25sb2FkUHJvZ3Jlc3MpIHtcbiAgICAgIChbZG93bmxvYWRUaHJvdHRsZWQsIGZsdXNoRG93bmxvYWRdID0gcHJvZ3Jlc3NFdmVudFJlZHVjZXIob25Eb3dubG9hZFByb2dyZXNzLCB0cnVlKSk7XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgZG93bmxvYWRUaHJvdHRsZWQpO1xuICAgIH1cblxuICAgIC8vIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB1cGxvYWQgZXZlbnRzXG4gICAgaWYgKG9uVXBsb2FkUHJvZ3Jlc3MgJiYgcmVxdWVzdC51cGxvYWQpIHtcbiAgICAgIChbdXBsb2FkVGhyb3R0bGVkLCBmbHVzaFVwbG9hZF0gPSBwcm9ncmVzc0V2ZW50UmVkdWNlcihvblVwbG9hZFByb2dyZXNzKSk7XG5cbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdXBsb2FkVGhyb3R0bGVkKTtcblxuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVuZCcsIGZsdXNoVXBsb2FkKTtcbiAgICB9XG5cbiAgICBpZiAoX2NvbmZpZy5jYW5jZWxUb2tlbiB8fCBfY29uZmlnLnNpZ25hbCkge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIG9uQ2FuY2VsZWQgPSBjYW5jZWwgPT4ge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCFjYW5jZWwgfHwgY2FuY2VsLnR5cGUgPyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcsIHJlcXVlc3QpIDogY2FuY2VsKTtcbiAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIF9jb25maWcuY2FuY2VsVG9rZW4gJiYgX2NvbmZpZy5jYW5jZWxUb2tlbi5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG4gICAgICBpZiAoX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgX2NvbmZpZy5zaWduYWwuYWJvcnRlZCA/IG9uQ2FuY2VsZWQoKSA6IF9jb25maWcuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG9jb2wgPSBwYXJzZVByb3RvY29sKF9jb25maWcudXJsKTtcblxuICAgIGlmIChwcm90b2NvbCAmJiBwbGF0Zm9ybS5wcm90b2NvbHMuaW5kZXhPZihwcm90b2NvbCkgPT09IC0xKSB7XG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1Vuc3VwcG9ydGVkIHByb3RvY29sICcgKyBwcm90b2NvbCArICc6JywgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIGNvbmZpZykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCBiaW5kIGZyb20gJy4vaGVscGVycy9iaW5kLmpzJztcbmltcG9ydCBBeGlvcyBmcm9tICcuL2NvcmUvQXhpb3MuanMnO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gJy4vY29yZS9tZXJnZUNvbmZpZy5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgZm9ybURhdGFUb0pTT04gZnJvbSAnLi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbFRva2VuIGZyb20gJy4vY2FuY2VsL0NhbmNlbFRva2VuLmpzJztcbmltcG9ydCBpc0NhbmNlbCBmcm9tICcuL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQge1ZFUlNJT059IGZyb20gJy4vZW52L2RhdGEuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi9oZWxwZXJzL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHNwcmVhZCBmcm9tICcuL2hlbHBlcnMvc3ByZWFkLmpzJztcbmltcG9ydCBpc0F4aW9zRXJyb3IgZnJvbSAnLi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuL2NvcmUvQXhpb3NIZWFkZXJzLmpzXCI7XG5pbXBvcnQgYWRhcHRlcnMgZnJvbSAnLi9hZGFwdGVycy9hZGFwdGVycy5qcyc7XG5pbXBvcnQgSHR0cFN0YXR1c0NvZGUgZnJvbSAnLi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm5zIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICBjb25zdCBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MucHJvdG90eXBlLCBjb250ZXh0LCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIGNvbnRleHQsIG51bGwsIHthbGxPd25LZXlzOiB0cnVlfSk7XG5cbiAgLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuICBpbnN0YW5jZS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UobWVyZ2VDb25maWcoZGVmYXVsdENvbmZpZywgaW5zdGFuY2VDb25maWcpKTtcbiAgfTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxuY29uc3QgYXhpb3MgPSBjcmVhdGVJbnN0YW5jZShkZWZhdWx0cyk7XG5cbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxuYXhpb3MuQXhpb3MgPSBBeGlvcztcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWxlZEVycm9yID0gQ2FuY2VsZWRFcnJvcjtcbmF4aW9zLkNhbmNlbFRva2VuID0gQ2FuY2VsVG9rZW47XG5heGlvcy5pc0NhbmNlbCA9IGlzQ2FuY2VsO1xuYXhpb3MuVkVSU0lPTiA9IFZFUlNJT047XG5heGlvcy50b0Zvcm1EYXRhID0gdG9Gb3JtRGF0YTtcblxuLy8gRXhwb3NlIEF4aW9zRXJyb3IgY2xhc3NcbmF4aW9zLkF4aW9zRXJyb3IgPSBBeGlvc0Vycm9yO1xuXG4vLyBhbGlhcyBmb3IgQ2FuY2VsZWRFcnJvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuYXhpb3MuQ2FuY2VsID0gYXhpb3MuQ2FuY2VsZWRFcnJvcjtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcblxuYXhpb3Muc3ByZWFkID0gc3ByZWFkO1xuXG4vLyBFeHBvc2UgaXNBeGlvc0Vycm9yXG5heGlvcy5pc0F4aW9zRXJyb3IgPSBpc0F4aW9zRXJyb3I7XG5cbi8vIEV4cG9zZSBtZXJnZUNvbmZpZ1xuYXhpb3MubWVyZ2VDb25maWcgPSBtZXJnZUNvbmZpZztcblxuYXhpb3MuQXhpb3NIZWFkZXJzID0gQXhpb3NIZWFkZXJzO1xuXG5heGlvcy5mb3JtVG9KU09OID0gdGhpbmcgPT4gZm9ybURhdGFUb0pTT04odXRpbHMuaXNIVE1MRm9ybSh0aGluZykgPyBuZXcgRm9ybURhdGEodGhpbmcpIDogdGhpbmcpO1xuXG5heGlvcy5nZXRBZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcjtcblxuYXhpb3MuSHR0cFN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzQ29kZTtcblxuYXhpb3MuZGVmYXVsdCA9IGF4aW9zO1xuXG4vLyB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBoYXZlIGEgZGVmYXVsdCBleHBvcnRcbmV4cG9ydCBkZWZhdWx0IGF4aW9zXG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vQ2FuY2VsZWRFcnJvci5qcyc7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge0NhbmNlbFRva2VufVxuICovXG5jbGFzcyBDYW5jZWxUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlUHJvbWlzZTtcblxuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXM7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuKGNhbmNlbCA9PiB7XG4gICAgICBpZiAoIXRva2VuLl9saXN0ZW5lcnMpIHJldHVybjtcblxuICAgICAgbGV0IGkgPSB0b2tlbi5fbGlzdGVuZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgdG9rZW4uX2xpc3RlbmVyc1tpXShjYW5jZWwpO1xuICAgICAgfVxuICAgICAgdG9rZW4uX2xpc3RlbmVycyA9IG51bGw7XG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuID0gb25mdWxmaWxsZWQgPT4ge1xuICAgICAgbGV0IF9yZXNvbHZlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdG9rZW4uc3Vic2NyaWJlKHJlc29sdmUpO1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB9KS50aGVuKG9uZnVsZmlsbGVkKTtcblxuICAgICAgcHJvbWlzZS5jYW5jZWwgPSBmdW5jdGlvbiByZWplY3QoKSB7XG4gICAgICAgIHRva2VuLnVuc3Vic2NyaWJlKF9yZXNvbHZlKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gICAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCk7XG4gICAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICAgKi9cbiAgdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIHRocm93IHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBuZXcgYENhbmNlbFRva2VuYCBhbmQgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCxcbiAgICogY2FuY2VscyB0aGUgYENhbmNlbFRva2VuYC5cbiAgICovXG4gIHN0YXRpYyBzb3VyY2UoKSB7XG4gICAgbGV0IGNhbmNlbDtcbiAgICBjb25zdCB0b2tlbiA9IG5ldyBDYW5jZWxUb2tlbihmdW5jdGlvbiBleGVjdXRvcihjKSB7XG4gICAgICBjYW5jZWwgPSBjO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbixcbiAgICAgIGNhbmNlbFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FuY2VsVG9rZW47XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIEEgYENhbmNlbGVkRXJyb3JgIGlzIGFuIG9iamVjdCB0aGF0IGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBjYW5jZWxlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3Q9fSByZXF1ZXN0IFRoZSByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm5zIHtDYW5jZWxlZEVycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsZWRFcnJvcihtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gIEF4aW9zRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlID09IG51bGwgPyAnY2FuY2VsZWQnIDogbWVzc2FnZSwgQXhpb3NFcnJvci5FUlJfQ0FOQ0VMRUQsIGNvbmZpZywgcmVxdWVzdCk7XG4gIHRoaXMubmFtZSA9ICdDYW5jZWxlZEVycm9yJztcbn1cblxudXRpbHMuaW5oZXJpdHMoQ2FuY2VsZWRFcnJvciwgQXhpb3NFcnJvciwge1xuICBfX0NBTkNFTF9fOiB0cnVlXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FuY2VsZWRFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNDYW5jZWwodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9fQ0FOQ0VMX18pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgYnVpbGRVUkwgZnJvbSAnLi4vaGVscGVycy9idWlsZFVSTC5qcyc7XG5pbXBvcnQgSW50ZXJjZXB0b3JNYW5hZ2VyIGZyb20gJy4vSW50ZXJjZXB0b3JNYW5hZ2VyLmpzJztcbmltcG9ydCBkaXNwYXRjaFJlcXVlc3QgZnJvbSAnLi9kaXNwYXRjaFJlcXVlc3QuanMnO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gJy4vbWVyZ2VDb25maWcuanMnO1xuaW1wb3J0IGJ1aWxkRnVsbFBhdGggZnJvbSAnLi9idWlsZEZ1bGxQYXRoLmpzJztcbmltcG9ydCB2YWxpZGF0b3IgZnJvbSAnLi4vaGVscGVycy92YWxpZGF0b3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuL0F4aW9zSGVhZGVycy5qcyc7XG5cbmNvbnN0IHZhbGlkYXRvcnMgPSB2YWxpZGF0b3IudmFsaWRhdG9ycztcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuY2xhc3MgQXhpb3Mge1xuICBjb25zdHJ1Y3RvcihpbnN0YW5jZUNvbmZpZykge1xuICAgIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZztcbiAgICB0aGlzLmludGVyY2VwdG9ycyA9IHtcbiAgICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGEgcmVxdWVzdFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGNvbmZpZ09yVXJsIFRoZSBjb25maWcgc3BlY2lmaWMgZm9yIHRoaXMgcmVxdWVzdCAobWVyZ2VkIHdpdGggdGhpcy5kZWZhdWx0cylcbiAgICogQHBhcmFtIHs/T2JqZWN0fSBjb25maWdcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGxldCBkdW1teTtcblxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA/IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGR1bW15ID0ge30pIDogKGR1bW15ID0gbmV3IEVycm9yKCkpO1xuXG4gICAgICAgIC8vIHNsaWNlIG9mZiB0aGUgRXJyb3I6IC4uLiBsaW5lXG4gICAgICAgIGNvbnN0IHN0YWNrID0gZHVtbXkuc3RhY2sgPyBkdW1teS5zdGFjay5yZXBsYWNlKC9eLitcXG4vLCAnJykgOiAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIWVyci5zdGFjaykge1xuICAgICAgICAgICAgZXJyLnN0YWNrID0gc3RhY2s7XG4gICAgICAgICAgICAvLyBtYXRjaCB3aXRob3V0IHRoZSAyIHRvcCBzdGFjayBsaW5lc1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2sgJiYgIVN0cmluZyhlcnIuc3RhY2spLmVuZHNXaXRoKHN0YWNrLnJlcGxhY2UoL14uK1xcbi4rXFxuLywgJycpKSkge1xuICAgICAgICAgICAgZXJyLnN0YWNrICs9ICdcXG4nICsgc3RhY2tcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBpZ25vcmUgdGhlIGNhc2Ugd2hlcmUgXCJzdGFja1wiIGlzIGFuIHVuLXdyaXRhYmxlIHByb3BlcnR5XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIF9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICAvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXG4gICAgaWYgKHR5cGVvZiBjb25maWdPclVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgIGNvbmZpZy51cmwgPSBjb25maWdPclVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnID0gY29uZmlnT3JVcmwgfHwge307XG4gICAgfVxuXG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAgIGNvbnN0IHt0cmFuc2l0aW9uYWwsIHBhcmFtc1NlcmlhbGl6ZXIsIGhlYWRlcnN9ID0gY29uZmlnO1xuXG4gICAgaWYgKHRyYW5zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyh0cmFuc2l0aW9uYWwsIHtcbiAgICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGZvcmNlZEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICBjbGFyaWZ5VGltZW91dEVycm9yOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pXG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtc1NlcmlhbGl6ZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zU2VyaWFsaXplcikpIHtcbiAgICAgICAgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIgPSB7XG4gICAgICAgICAgc2VyaWFsaXplOiBwYXJhbXNTZXJpYWxpemVyXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHBhcmFtc1NlcmlhbGl6ZXIsIHtcbiAgICAgICAgICBlbmNvZGU6IHZhbGlkYXRvcnMuZnVuY3Rpb24sXG4gICAgICAgICAgc2VyaWFsaXplOiB2YWxpZGF0b3JzLmZ1bmN0aW9uXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBjb25maWcubWV0aG9kXG4gICAgY29uZmlnLm1ldGhvZCA9IChjb25maWcubWV0aG9kIHx8IHRoaXMuZGVmYXVsdHMubWV0aG9kIHx8ICdnZXQnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gICAgbGV0IGNvbnRleHRIZWFkZXJzID0gaGVhZGVycyAmJiB1dGlscy5tZXJnZShcbiAgICAgIGhlYWRlcnMuY29tbW9uLFxuICAgICAgaGVhZGVyc1tjb25maWcubWV0aG9kXVxuICAgICk7XG5cbiAgICBoZWFkZXJzICYmIHV0aWxzLmZvckVhY2goXG4gICAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICAgIChtZXRob2QpID0+IHtcbiAgICAgICAgZGVsZXRlIGhlYWRlcnNbbWV0aG9kXTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuY29uY2F0KGNvbnRleHRIZWFkZXJzLCBoZWFkZXJzKTtcblxuICAgIC8vIGZpbHRlciBvdXQgc2tpcHBlZCBpbnRlcmNlcHRvcnNcbiAgICBjb25zdCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIGxldCBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSB0cnVlO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiB1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcmNlcHRvci5ydW5XaGVuID09PSAnZnVuY3Rpb24nICYmIGludGVyY2VwdG9yLnJ1bldoZW4oY29uZmlnKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3Iuc3luY2hyb25vdXM7XG5cbiAgICAgIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uIHB1c2hSZXNwb25zZUludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgICAgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnB1c2goaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gICAgfSk7XG5cbiAgICBsZXQgcHJvbWlzZTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IGxlbjtcblxuICAgIGlmICghc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzKSB7XG4gICAgICBjb25zdCBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QuYmluZCh0aGlzKSwgdW5kZWZpbmVkXTtcbiAgICAgIGNoYWluLnVuc2hpZnQuYXBwbHkoY2hhaW4sIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGNoYWluLnB1c2guYXBwbHkoY2hhaW4sIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBsZW4gPSBjaGFpbi5sZW5ndGg7XG5cbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcblxuICAgICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbltpKytdLCBjaGFpbltpKytdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgbGVuID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgbGV0IG5ld0NvbmZpZyA9IGNvbmZpZztcblxuICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIGNvbnN0IG9uRnVsZmlsbGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIGNvbnN0IG9uUmVqZWN0ZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbltpKytdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3Q29uZmlnID0gb25GdWxmaWxsZWQobmV3Q29uZmlnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG9uUmVqZWN0ZWQuY2FsbCh0aGlzLCBlcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBwcm9taXNlID0gZGlzcGF0Y2hSZXF1ZXN0LmNhbGwodGhpcywgbmV3Q29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG5cbiAgICBpID0gMDtcbiAgICBsZW4gPSByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4ocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluW2krK10sIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGdldFVyaShjb25maWcpIHtcbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYnVpbGRGdWxsUGF0aChjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gICAgcmV0dXJuIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG4gIH1cbn1cblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBkYXRhOiAoY29uZmlnIHx8IHt9KS5kYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVIVFRQTWV0aG9kKGlzRm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBodHRwTWV0aG9kKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGlzRm9ybSA/IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gICAgICAgIH0gOiB7fSxcbiAgICAgICAgdXJsLFxuICAgICAgICBkYXRhXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfVxuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZ2VuZXJhdGVIVFRQTWV0aG9kKCk7XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZCArICdGb3JtJ10gPSBnZW5lcmF0ZUhUVFBNZXRob2QodHJ1ZSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3M7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29uZmlnXSBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5mdW5jdGlvbiBBeGlvc0Vycm9yKG1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgRXJyb3IuY2FsbCh0aGlzKTtcblxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgfVxuXG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMubmFtZSA9ICdBeGlvc0Vycm9yJztcbiAgY29kZSAmJiAodGhpcy5jb2RlID0gY29kZSk7XG4gIGNvbmZpZyAmJiAodGhpcy5jb25maWcgPSBjb25maWcpO1xuICByZXF1ZXN0ICYmICh0aGlzLnJlcXVlc3QgPSByZXF1ZXN0KTtcbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIHRoaXMuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzID8gcmVzcG9uc2Uuc3RhdHVzIDogbnVsbDtcbiAgfVxufVxuXG51dGlscy5pbmhlcml0cyhBeGlvc0Vycm9yLCBFcnJvciwge1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RhbmRhcmRcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIC8vIE1pY3Jvc29mdFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBudW1iZXI6IHRoaXMubnVtYmVyLFxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWUsXG4gICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG4gICAgICBjb2x1bW5OdW1iZXI6IHRoaXMuY29sdW1uTnVtYmVyLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2ssXG4gICAgICAvLyBBeGlvc1xuICAgICAgY29uZmlnOiB1dGlscy50b0pTT05PYmplY3QodGhpcy5jb25maWcpLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1c1xuICAgIH07XG4gIH1cbn0pO1xuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc0Vycm9yLnByb3RvdHlwZTtcbmNvbnN0IGRlc2NyaXB0b3JzID0ge307XG5cbltcbiAgJ0VSUl9CQURfT1BUSU9OX1ZBTFVFJyxcbiAgJ0VSUl9CQURfT1BUSU9OJyxcbiAgJ0VDT05OQUJPUlRFRCcsXG4gICdFVElNRURPVVQnLFxuICAnRVJSX05FVFdPUksnLFxuICAnRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUycsXG4gICdFUlJfREVQUkVDQVRFRCcsXG4gICdFUlJfQkFEX1JFU1BPTlNFJyxcbiAgJ0VSUl9CQURfUkVRVUVTVCcsXG4gICdFUlJfQ0FOQ0VMRUQnLFxuICAnRVJSX05PVF9TVVBQT1JUJyxcbiAgJ0VSUl9JTlZBTElEX1VSTCdcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5dLmZvckVhY2goY29kZSA9PiB7XG4gIGRlc2NyaXB0b3JzW2NvZGVdID0ge3ZhbHVlOiBjb2RlfTtcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhBeGlvc0Vycm9yLCBkZXNjcmlwdG9ycyk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCAnaXNBeGlvc0Vycm9yJywge3ZhbHVlOiB0cnVlfSk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5BeGlvc0Vycm9yLmZyb20gPSAoZXJyb3IsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UsIGN1c3RvbVByb3BzKSA9PiB7XG4gIGNvbnN0IGF4aW9zRXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7XG5cbiAgdXRpbHMudG9GbGF0T2JqZWN0KGVycm9yLCBheGlvc0Vycm9yLCBmdW5jdGlvbiBmaWx0ZXIob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAhPT0gRXJyb3IucHJvdG90eXBlO1xuICB9LCBwcm9wID0+IHtcbiAgICByZXR1cm4gcHJvcCAhPT0gJ2lzQXhpb3NFcnJvcic7XG4gIH0pO1xuXG4gIEF4aW9zRXJyb3IuY2FsbChheGlvc0Vycm9yLCBlcnJvci5tZXNzYWdlLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKTtcblxuICBheGlvc0Vycm9yLmNhdXNlID0gZXJyb3I7XG5cbiAgYXhpb3NFcnJvci5uYW1lID0gZXJyb3IubmFtZTtcblxuICBjdXN0b21Qcm9wcyAmJiBPYmplY3QuYXNzaWduKGF4aW9zRXJyb3IsIGN1c3RvbVByb3BzKTtcblxuICByZXR1cm4gYXhpb3NFcnJvcjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF4aW9zRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgcGFyc2VIZWFkZXJzIGZyb20gJy4uL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzJztcblxuY29uc3QgJGludGVybmFscyA9IFN5bWJvbCgnaW50ZXJuYWxzJyk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpIHtcbiAgcmV0dXJuIGhlYWRlciAmJiBTdHJpbmcoaGVhZGVyKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHV0aWxzLmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKG5vcm1hbGl6ZVZhbHVlKSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVG9rZW5zKHN0cikge1xuICBjb25zdCB0b2tlbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBjb25zdCB0b2tlbnNSRSA9IC8oW15cXHMsOz1dKylcXHMqKD86PVxccyooW14sO10rKSk/L2c7XG4gIGxldCBtYXRjaDtcblxuICB3aGlsZSAoKG1hdGNoID0gdG9rZW5zUkUuZXhlYyhzdHIpKSkge1xuICAgIHRva2Vuc1ttYXRjaFsxXV0gPSBtYXRjaFsyXTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmNvbnN0IGlzVmFsaWRIZWFkZXJOYW1lID0gKHN0cikgPT4gL15bLV9hLXpBLVowLTleYHx+LCEjJCUmJyorLl0rJC8udGVzdChzdHIudHJpbSgpKTtcblxuZnVuY3Rpb24gbWF0Y2hIZWFkZXJWYWx1ZShjb250ZXh0LCB2YWx1ZSwgaGVhZGVyLCBmaWx0ZXIsIGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICBpZiAodXRpbHMuaXNGdW5jdGlvbihmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMsIHZhbHVlLCBoZWFkZXIpO1xuICB9XG5cbiAgaWYgKGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICAgIHZhbHVlID0gaGVhZGVyO1xuICB9XG5cbiAgaWYgKCF1dGlscy5pc1N0cmluZyh2YWx1ZSkpIHJldHVybjtcblxuICBpZiAodXRpbHMuaXNTdHJpbmcoZmlsdGVyKSkge1xuICAgIHJldHVybiB2YWx1ZS5pbmRleE9mKGZpbHRlcikgIT09IC0xO1xuICB9XG5cbiAgaWYgKHV0aWxzLmlzUmVnRXhwKGZpbHRlcikpIHtcbiAgICByZXR1cm4gZmlsdGVyLnRlc3QodmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEhlYWRlcihoZWFkZXIpIHtcbiAgcmV0dXJuIGhlYWRlci50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oW2EtelxcZF0pKFxcdyopL2csICh3LCBjaGFyLCBzdHIpID0+IHtcbiAgICAgIHJldHVybiBjaGFyLnRvVXBwZXJDYXNlKCkgKyBzdHI7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWNjZXNzb3JzKG9iaiwgaGVhZGVyKSB7XG4gIGNvbnN0IGFjY2Vzc29yTmFtZSA9IHV0aWxzLnRvQ2FtZWxDYXNlKCcgJyArIGhlYWRlcik7XG5cbiAgWydnZXQnLCAnc2V0JywgJ2hhcyddLmZvckVhY2gobWV0aG9kTmFtZSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbWV0aG9kTmFtZSArIGFjY2Vzc29yTmFtZSwge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0uY2FsbCh0aGlzLCBoZWFkZXIsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9KTtcbn1cblxuY2xhc3MgQXhpb3NIZWFkZXJzIHtcbiAgY29uc3RydWN0b3IoaGVhZGVycykge1xuICAgIGhlYWRlcnMgJiYgdGhpcy5zZXQoaGVhZGVycyk7XG4gIH1cblxuICBzZXQoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSwgcmV3cml0ZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gc2V0SGVhZGVyKF92YWx1ZSwgX2hlYWRlciwgX3Jld3JpdGUpIHtcbiAgICAgIGNvbnN0IGxIZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmICghbEhlYWRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkoc2VsZiwgbEhlYWRlcik7XG5cbiAgICAgIGlmKCFrZXkgfHwgc2VsZltrZXldID09PSB1bmRlZmluZWQgfHwgX3Jld3JpdGUgPT09IHRydWUgfHwgKF9yZXdyaXRlID09PSB1bmRlZmluZWQgJiYgc2VsZltrZXldICE9PSBmYWxzZSkpIHtcbiAgICAgICAgc2VsZltrZXkgfHwgX2hlYWRlcl0gPSBub3JtYWxpemVWYWx1ZShfdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldEhlYWRlcnMgPSAoaGVhZGVycywgX3Jld3JpdGUpID0+XG4gICAgICB1dGlscy5mb3JFYWNoKGhlYWRlcnMsIChfdmFsdWUsIF9oZWFkZXIpID0+IHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSk7XG5cbiAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChoZWFkZXIpIHx8IGhlYWRlciBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpIHtcbiAgICAgIHNldEhlYWRlcnMoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSlcbiAgICB9IGVsc2UgaWYodXRpbHMuaXNTdHJpbmcoaGVhZGVyKSAmJiAoaGVhZGVyID0gaGVhZGVyLnRyaW0oKSkgJiYgIWlzVmFsaWRIZWFkZXJOYW1lKGhlYWRlcikpIHtcbiAgICAgIHNldEhlYWRlcnMocGFyc2VIZWFkZXJzKGhlYWRlciksIHZhbHVlT3JSZXdyaXRlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzSGVhZGVycyhoZWFkZXIpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBoZWFkZXIuZW50cmllcygpKSB7XG4gICAgICAgIHNldEhlYWRlcih2YWx1ZSwga2V5LCByZXdyaXRlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyICE9IG51bGwgJiYgc2V0SGVhZGVyKHZhbHVlT3JSZXdyaXRlLCBoZWFkZXIsIHJld3JpdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0KGhlYWRlciwgcGFyc2VyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgICAgaWYgKCFwYXJzZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyc2VyID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5zKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscy5pc0Z1bmN0aW9uKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmNhbGwodGhpcywgdmFsdWUsIGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNSZWdFeHAocGFyc2VyKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZXIuZXhlYyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhcyhoZWFkZXIsIG1hdGNoZXIpIHtcbiAgICBoZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoaGVhZGVyKTtcblxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkodGhpcywgaGVhZGVyKTtcblxuICAgICAgcmV0dXJuICEhKGtleSAmJiB0aGlzW2tleV0gIT09IHVuZGVmaW5lZCAmJiAoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlcikpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBkZWxldGUoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIGRlbGV0ZUhlYWRlcihfaGVhZGVyKSB7XG4gICAgICBfaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoX2hlYWRlcikge1xuICAgICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHNlbGYsIF9oZWFkZXIpO1xuXG4gICAgICAgIGlmIChrZXkgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUoc2VsZiwgc2VsZltrZXldLCBrZXksIG1hdGNoZXIpKSkge1xuICAgICAgICAgIGRlbGV0ZSBzZWxmW2tleV07XG5cbiAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0FycmF5KGhlYWRlcikpIHtcbiAgICAgIGhlYWRlci5mb3JFYWNoKGRlbGV0ZUhlYWRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZUhlYWRlcihoZWFkZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgY2xlYXIobWF0Y2hlcikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlciwgdHJ1ZSkpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNba2V5XTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBub3JtYWxpemUoZm9ybWF0KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuXG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleShoZWFkZXJzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHNlbGZba2V5XSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgZGVsZXRlIHNlbGZbaGVhZGVyXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gZm9ybWF0ID8gZm9ybWF0SGVhZGVyKGhlYWRlcikgOiBTdHJpbmcoaGVhZGVyKS50cmltKCk7XG5cbiAgICAgIGlmIChub3JtYWxpemVkICE9PSBoZWFkZXIpIHtcbiAgICAgICAgZGVsZXRlIHNlbGZbaGVhZGVyXTtcbiAgICAgIH1cblxuICAgICAgc2VsZltub3JtYWxpemVkXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcblxuICAgICAgaGVhZGVyc1tub3JtYWxpemVkXSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvbmNhdCguLi50YXJnZXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsIC4uLnRhcmdldHMpO1xuICB9XG5cbiAgdG9KU09OKGFzU3RyaW5ncykge1xuICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICB1dGlscy5mb3JFYWNoKHRoaXMsICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgICB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSBmYWxzZSAmJiAob2JqW2hlYWRlcl0gPSBhc1N0cmluZ3MgJiYgdXRpbHMuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKCcsICcpIDogdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChbaGVhZGVyLCB2YWx1ZV0pID0+IGhlYWRlciArICc6ICcgKyB2YWx1ZSkuam9pbignXFxuJyk7XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdBeGlvc0hlYWRlcnMnO1xuICB9XG5cbiAgc3RhdGljIGZyb20odGhpbmcpIHtcbiAgICByZXR1cm4gdGhpbmcgaW5zdGFuY2VvZiB0aGlzID8gdGhpbmcgOiBuZXcgdGhpcyh0aGluZyk7XG4gIH1cblxuICBzdGF0aWMgY29uY2F0KGZpcnN0LCAuLi50YXJnZXRzKSB7XG4gICAgY29uc3QgY29tcHV0ZWQgPSBuZXcgdGhpcyhmaXJzdCk7XG5cbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4gY29tcHV0ZWQuc2V0KHRhcmdldCkpO1xuXG4gICAgcmV0dXJuIGNvbXB1dGVkO1xuICB9XG5cbiAgc3RhdGljIGFjY2Vzc29yKGhlYWRlcikge1xuICAgIGNvbnN0IGludGVybmFscyA9IHRoaXNbJGludGVybmFsc10gPSAodGhpc1skaW50ZXJuYWxzXSA9IHtcbiAgICAgIGFjY2Vzc29yczoge31cbiAgICB9KTtcblxuICAgIGNvbnN0IGFjY2Vzc29ycyA9IGludGVybmFscy5hY2Nlc3NvcnM7XG4gICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5wcm90b3R5cGU7XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVBY2Nlc3NvcihfaGVhZGVyKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWFjY2Vzc29yc1tsSGVhZGVyXSkge1xuICAgICAgICBidWlsZEFjY2Vzc29ycyhwcm90b3R5cGUsIF9oZWFkZXIpO1xuICAgICAgICBhY2Nlc3NvcnNbbEhlYWRlcl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHV0aWxzLmlzQXJyYXkoaGVhZGVyKSA/IGhlYWRlci5mb3JFYWNoKGRlZmluZUFjY2Vzc29yKSA6IGRlZmluZUFjY2Vzc29yKGhlYWRlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5BeGlvc0hlYWRlcnMuYWNjZXNzb3IoWydDb250ZW50LVR5cGUnLCAnQ29udGVudC1MZW5ndGgnLCAnQWNjZXB0JywgJ0FjY2VwdC1FbmNvZGluZycsICdVc2VyLUFnZW50JywgJ0F1dGhvcml6YXRpb24nXSk7XG5cbi8vIHJlc2VydmVkIG5hbWVzIGhvdGZpeFxudXRpbHMucmVkdWNlRGVzY3JpcHRvcnMoQXhpb3NIZWFkZXJzLnByb3RvdHlwZSwgKHt2YWx1ZX0sIGtleSkgPT4ge1xuICBsZXQgbWFwcGVkID0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7IC8vIG1hcCBgc2V0YCA9PiBgU2V0YFxuICByZXR1cm4ge1xuICAgIGdldDogKCkgPT4gdmFsdWUsXG4gICAgc2V0KGhlYWRlclZhbHVlKSB7XG4gICAgICB0aGlzW21hcHBlZF0gPSBoZWFkZXJWYWx1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG51dGlscy5mcmVlemVNZXRob2RzKEF4aW9zSGVhZGVycyk7XG5cbmV4cG9ydCBkZWZhdWx0IEF4aW9zSGVhZGVycztcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuXG5jbGFzcyBJbnRlcmNlcHRvck1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAgICovXG4gIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkLCBvcHRpb25zKSB7XG4gICAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICAgIGZ1bGZpbGxlZCxcbiAgICAgIHJlamVjdGVkLFxuICAgICAgc3luY2hyb25vdXM6IG9wdGlvbnMgPyBvcHRpb25zLnN5bmNocm9ub3VzIDogZmFsc2UsXG4gICAgICBydW5XaGVuOiBvcHRpb25zID8gb3B0aW9ucy5ydW5XaGVuIDogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGludGVyY2VwdG9yIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAgICpcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW50ZXJjZXB0b3Igd2FzIHJlbW92ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAqL1xuICBlamVjdChpZCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgICAgdGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgaW50ZXJjZXB0b3JzIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAgICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZm9yRWFjaChmbikge1xuICAgIHV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgICAgaWYgKGggIT09IG51bGwpIHtcbiAgICAgICAgZm4oaCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJjZXB0b3JNYW5hZ2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgaXNBYnNvbHV0ZVVSTCBmcm9tICcuLi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanMnO1xuaW1wb3J0IGNvbWJpbmVVUkxzIGZyb20gJy4uL2hlbHBlcnMvY29tYmluZVVSTHMuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBmdWxsIHBhdGhcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpIHtcbiAgaWYgKGJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKSkge1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB0cmFuc2Zvcm1EYXRhIGZyb20gJy4vdHJhbnNmb3JtRGF0YS5qcyc7XG5pbXBvcnQgaXNDYW5jZWwgZnJvbSAnLi4vY2FuY2VsL2lzQ2FuY2VsLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tICcuLi9jYW5jZWwvQ2FuY2VsZWRFcnJvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcbmltcG9ydCBhZGFwdGVycyBmcm9tIFwiLi4vYWRhcHRlcnMvYWRhcHRlcnMuanNcIjtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsZWRFcnJvcmAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc2lnbmFsICYmIGNvbmZpZy5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbmZpZy5oZWFkZXJzKTtcblxuICAvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXG4gIGNvbmZpZy5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgIGNvbmZpZyxcbiAgICBjb25maWcudHJhbnNmb3JtUmVxdWVzdFxuICApO1xuXG4gIGlmIChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10uaW5kZXhPZihjb25maWcubWV0aG9kKSAhPT0gLTEpIHtcbiAgICBjb25maWcuaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywgZmFsc2UpO1xuICB9XG5cbiAgY29uc3QgYWRhcHRlciA9IGFkYXB0ZXJzLmdldEFkYXB0ZXIoY29uZmlnLmFkYXB0ZXIgfHwgZGVmYXVsdHMuYWRhcHRlcik7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgICBjb25maWcsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICByZXNwb25zZVxuICAgICk7XG5cbiAgICByZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20ocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0sIGZ1bmN0aW9uIG9uQWRhcHRlclJlamVjdGlvbihyZWFzb24pIHtcbiAgICBpZiAoIWlzQ2FuY2VsKHJlYXNvbikpIHtcbiAgICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLnJlc3BvbnNlKSB7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20ocmVhc29uLnJlc3BvbnNlLmhlYWRlcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSBcIi4vQXhpb3NIZWFkZXJzLmpzXCI7XG5cbmNvbnN0IGhlYWRlcnNUb09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgaW5zdGFuY2VvZiBBeGlvc0hlYWRlcnMgPyB7IC4uLnRoaW5nIH0gOiB0aGluZztcblxuLyoqXG4gKiBDb25maWctc3BlY2lmaWMgbWVyZ2UtZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIG5ldyBjb25maWctb2JqZWN0XG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzFcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXG4gKlxuICogQHJldHVybnMge09iamVjdH0gTmV3IG9iamVjdCByZXN1bHRpbmcgZnJvbSBtZXJnaW5nIGNvbmZpZzIgdG8gY29uZmlnMVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgY29uc3QgY29uZmlnID0ge307XG5cbiAgZnVuY3Rpb24gZ2V0TWVyZ2VkVmFsdWUodGFyZ2V0LCBzb3VyY2UsIGNhc2VsZXNzKSB7XG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QodGFyZ2V0KSAmJiB1dGlscy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZS5jYWxsKHtjYXNlbGVzc30sIHRhcmdldCwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHV0aWxzLm1lcmdlKHt9LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEZWVwUHJvcGVydGllcyhhLCBiLCBjYXNlbGVzcykge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiLCBjYXNlbGVzcyk7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEsIGNhc2VsZXNzKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gdmFsdWVGcm9tQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGIpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEaXJlY3RLZXlzKGEsIGIsIHByb3ApIHtcbiAgICBpZiAocHJvcCBpbiBjb25maWcyKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYik7XG4gICAgfSBlbHNlIGlmIChwcm9wIGluIGNvbmZpZzEpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1lcmdlTWFwID0ge1xuICAgIHVybDogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBtZXRob2Q6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgZGF0YTogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBiYXNlVVJMOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcGFyYW1zU2VyaWFsaXplcjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRpbWVvdXRNZXNzYWdlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHdpdGhDcmVkZW50aWFsczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoWFNSRlRva2VuOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGFkYXB0ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcmVzcG9uc2VUeXBlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHhzcmZDb29raWVOYW1lOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHhzcmZIZWFkZXJOYW1lOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGRlY29tcHJlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Q29udGVudExlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBtYXhCb2R5TGVuZ3RoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGJlZm9yZVJlZGlyZWN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zcG9ydDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBodHRwQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cHNBZ2VudDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBjYW5jZWxUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBzb2NrZXRQYXRoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlRW5jb2Rpbmc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdmFsaWRhdGVTdGF0dXM6IG1lcmdlRGlyZWN0S2V5cyxcbiAgICBoZWFkZXJzOiAoYSwgYikgPT4gbWVyZ2VEZWVwUHJvcGVydGllcyhoZWFkZXJzVG9PYmplY3QoYSksIGhlYWRlcnNUb09iamVjdChiKSwgdHJ1ZSlcbiAgfTtcblxuICB1dGlscy5mb3JFYWNoKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZzEsIGNvbmZpZzIpKSwgZnVuY3Rpb24gY29tcHV0ZUNvbmZpZ1ZhbHVlKHByb3ApIHtcbiAgICBjb25zdCBtZXJnZSA9IG1lcmdlTWFwW3Byb3BdIHx8IG1lcmdlRGVlcFByb3BlcnRpZXM7XG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSBtZXJnZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdLCBwcm9wKTtcbiAgICAodXRpbHMuaXNVbmRlZmluZWQoY29uZmlnVmFsdWUpICYmIG1lcmdlICE9PSBtZXJnZURpcmVjdEtleXMpIHx8IChjb25maWdbcHJvcF0gPSBjb25maWdWYWx1ZSk7XG4gIH0pO1xuXG4gIHJldHVybiBjb25maWc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4vQXhpb3NFcnJvci5qcyc7XG5cbi8qKlxuICogUmVzb2x2ZSBvciByZWplY3QgYSBQcm9taXNlIGJhc2VkIG9uIHJlc3BvbnNlIHN0YXR1cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlIEEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdCBBIGZ1bmN0aW9uIHRoYXQgcmVqZWN0cyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge29iamVjdH0gVGhlIHJlc3BvbnNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICBjb25zdCB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCFyZXNwb25zZS5zdGF0dXMgfHwgIXZhbGlkYXRlU3RhdHVzIHx8IHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAnUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgW0F4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0VdW01hdGguZmxvb3IocmVzcG9uc2Uuc3RhdHVzIC8gMTAwKSAtIDRdLFxuICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzL2luZGV4LmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSAnLi4vY29yZS9BeGlvc0hlYWRlcnMuanMnO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgZGF0YSBmb3IgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcGFyYW0gez9PYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBkYXRhXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZm5zLCByZXNwb25zZSkge1xuICBjb25zdCBjb25maWcgPSB0aGlzIHx8IGRlZmF1bHRzO1xuICBjb25zdCBjb250ZXh0ID0gcmVzcG9uc2UgfHwgY29uZmlnO1xuICBjb25zdCBoZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oY29udGV4dC5oZWFkZXJzKTtcbiAgbGV0IGRhdGEgPSBjb250ZXh0LmRhdGE7XG5cbiAgdXRpbHMuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIGRhdGEgPSBmbi5jYWxsKGNvbmZpZywgZGF0YSwgaGVhZGVycy5ub3JtYWxpemUoKSwgcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiB1bmRlZmluZWQpO1xuICB9KTtcblxuICBoZWFkZXJzLm5vcm1hbGl6ZSgpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCB0cmFuc2l0aW9uYWxEZWZhdWx0cyBmcm9tICcuL3RyYW5zaXRpb25hbC5qcyc7XG5pbXBvcnQgdG9Gb3JtRGF0YSBmcm9tICcuLi9oZWxwZXJzL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IHRvVVJMRW5jb2RlZEZvcm0gZnJvbSAnLi4vaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgZm9ybURhdGFUb0pTT04gZnJvbSAnLi4vaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyc7XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcsIHRyaWVzIHRvIHBhcnNlIGl0LCBhbmQgaWYgaXQgZmFpbHMsIGl0IHJldHVybnMgdGhlIHN0cmluZ2lmaWVkIHZlcnNpb25cbiAqIG9mIHRoZSBpbnB1dFxuICpcbiAqIEBwYXJhbSB7YW55fSByYXdWYWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBzdHJpbmdpZmllZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcnNlciAtIEEgZnVuY3Rpb24gdGhhdCBwYXJzZXMgYSBzdHJpbmcgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZW5jb2RlciAtIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZhbHVlIGFuZCByZXR1cm5zIGEgc3RyaW5nLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgc3RyaW5naWZpZWQgdmVyc2lvbiBvZiB0aGUgcmF3VmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeVNhZmVseShyYXdWYWx1ZSwgcGFyc2VyLCBlbmNvZGVyKSB7XG4gIGlmICh1dGlscy5pc1N0cmluZyhyYXdWYWx1ZSkpIHtcbiAgICB0cnkge1xuICAgICAgKHBhcnNlciB8fCBKU09OLnBhcnNlKShyYXdWYWx1ZSk7XG4gICAgICByZXR1cm4gdXRpbHMudHJpbShyYXdWYWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUubmFtZSAhPT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoZW5jb2RlciB8fCBKU09OLnN0cmluZ2lmeSkocmF3VmFsdWUpO1xufVxuXG5jb25zdCBkZWZhdWx0cyA9IHtcblxuICB0cmFuc2l0aW9uYWw6IHRyYW5zaXRpb25hbERlZmF1bHRzLFxuXG4gIGFkYXB0ZXI6IFsneGhyJywgJ2h0dHAnLCAnZmV0Y2gnXSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzLmdldENvbnRlbnRUeXBlKCkgfHwgJyc7XG4gICAgY29uc3QgaGFzSlNPTkNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpID4gLTE7XG4gICAgY29uc3QgaXNPYmplY3RQYXlsb2FkID0gdXRpbHMuaXNPYmplY3QoZGF0YSk7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkICYmIHV0aWxzLmlzSFRNTEZvcm0oZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoZGF0YSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNGb3JtRGF0YSA9IHV0aWxzLmlzRm9ybURhdGEoZGF0YSk7XG5cbiAgICBpZiAoaXNGb3JtRGF0YSkge1xuICAgICAgcmV0dXJuIGhhc0pTT05Db250ZW50VHlwZSA/IEpTT04uc3RyaW5naWZ5KGZvcm1EYXRhVG9KU09OKGRhdGEpKSA6IGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc1N0cmVhbShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNGaWxlKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0Jsb2IoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzUmVhZGFibGVTdHJlYW0oZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcsIGZhbHNlKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgbGV0IGlzRmlsZUxpc3Q7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCB0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGlzRmlsZUxpc3QgPSB1dGlscy5pc0ZpbGVMaXN0KGRhdGEpKSB8fCBjb250ZW50VHlwZS5pbmRleE9mKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykgPiAtMSkge1xuICAgICAgICBjb25zdCBfRm9ybURhdGEgPSB0aGlzLmVudiAmJiB0aGlzLmVudi5Gb3JtRGF0YTtcblxuICAgICAgICByZXR1cm4gdG9Gb3JtRGF0YShcbiAgICAgICAgICBpc0ZpbGVMaXN0ID8geydmaWxlc1tdJzogZGF0YX0gOiBkYXRhLFxuICAgICAgICAgIF9Gb3JtRGF0YSAmJiBuZXcgX0Zvcm1EYXRhKCksXG4gICAgICAgICAgdGhpcy5mb3JtU2VyaWFsaXplclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc09iamVjdFBheWxvYWQgfHwgaGFzSlNPTkNvbnRlbnRUeXBlICkge1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24vanNvbicsIGZhbHNlKTtcbiAgICAgIHJldHVybiBzdHJpbmdpZnlTYWZlbHkoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIHRyYW5zZm9ybVJlc3BvbnNlOiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2UoZGF0YSkge1xuICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IHRoaXMudHJhbnNpdGlvbmFsIHx8IGRlZmF1bHRzLnRyYW5zaXRpb25hbDtcbiAgICBjb25zdCBmb3JjZWRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuZm9yY2VkSlNPTlBhcnNpbmc7XG4gICAgY29uc3QgSlNPTlJlcXVlc3RlZCA9IHRoaXMucmVzcG9uc2VUeXBlID09PSAnanNvbic7XG5cbiAgICBpZiAodXRpbHMuaXNSZXNwb25zZShkYXRhKSB8fCB1dGlscy5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiB1dGlscy5pc1N0cmluZyhkYXRhKSAmJiAoKGZvcmNlZEpTT05QYXJzaW5nICYmICF0aGlzLnJlc3BvbnNlVHlwZSkgfHwgSlNPTlJlcXVlc3RlZCkpIHtcbiAgICAgIGNvbnN0IHNpbGVudEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5zaWxlbnRKU09OUGFyc2luZztcbiAgICAgIGNvbnN0IHN0cmljdEpTT05QYXJzaW5nID0gIXNpbGVudEpTT05QYXJzaW5nICYmIEpTT05SZXF1ZXN0ZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoc3RyaWN0SlNPTlBhcnNpbmcpIHtcbiAgICAgICAgICBpZiAoZS5uYW1lID09PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgICAgICB0aHJvdyBBeGlvc0Vycm9yLmZyb20oZSwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLCB0aGlzLCBudWxsLCB0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcbiAgbWF4Qm9keUxlbmd0aDogLTEsXG5cbiAgZW52OiB7XG4gICAgRm9ybURhdGE6IHBsYXRmb3JtLmNsYXNzZXMuRm9ybURhdGEsXG4gICAgQmxvYjogcGxhdGZvcm0uY2xhc3Nlcy5CbG9iXG4gIH0sXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfSxcblxuICBoZWFkZXJzOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicsXG4gICAgICAnQ29udGVudC1UeXBlJzogdW5kZWZpbmVkXG4gICAgfVxuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIChtZXRob2QpID0+IHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdHM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZVxufTtcbiIsImV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIxLjcuNVwiOyIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi90b0Zvcm1EYXRhLmpzJztcblxuLyoqXG4gKiBJdCBlbmNvZGVzIGEgc3RyaW5nIGJ5IHJlcGxhY2luZyBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgaW4gdGhlIHVucmVzZXJ2ZWQgc2V0IHdpdGhcbiAqIHRoZWlyIHBlcmNlbnQtZW5jb2RlZCBlcXVpdmFsZW50c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIGVuY29kZS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZShzdHIpIHtcbiAgY29uc3QgY2hhck1hcCA9IHtcbiAgICAnISc6ICclMjEnLFxuICAgIFwiJ1wiOiAnJTI3JyxcbiAgICAnKCc6ICclMjgnLFxuICAgICcpJzogJyUyOScsXG4gICAgJ34nOiAnJTdFJyxcbiAgICAnJTIwJzogJysnLFxuICAgICclMDAnOiAnXFx4MDAnXG4gIH07XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKX5dfCUyMHwlMDAvZywgZnVuY3Rpb24gcmVwbGFjZXIobWF0Y2gpIHtcbiAgICByZXR1cm4gY2hhck1hcFttYXRjaF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcGFyYW1zIG9iamVjdCBhbmQgY29udmVydHMgaXQgdG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnZlcnRlZCB0byBhIEZvcm1EYXRhIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIEF4aW9zIGNvbnN0cnVjdG9yLlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpIHtcbiAgdGhpcy5fcGFpcnMgPSBbXTtcblxuICBwYXJhbXMgJiYgdG9Gb3JtRGF0YShwYXJhbXMsIHRoaXMsIG9wdGlvbnMpO1xufVxuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc1VSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGU7XG5cbnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5fcGFpcnMucHVzaChbbmFtZSwgdmFsdWVdKTtcbn07XG5cbnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGVuY29kZXIpIHtcbiAgY29uc3QgX2VuY29kZSA9IGVuY29kZXIgPyBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBlbmNvZGVyLmNhbGwodGhpcywgdmFsdWUsIGVuY29kZSk7XG4gIH0gOiBlbmNvZGU7XG5cbiAgcmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbiBlYWNoKHBhaXIpIHtcbiAgICByZXR1cm4gX2VuY29kZShwYWlyWzBdKSArICc9JyArIF9lbmNvZGUocGFpclsxXSk7XG4gIH0sICcnKS5qb2luKCcmJyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc1VSTFNlYXJjaFBhcmFtcztcbiIsImNvbnN0IEh0dHBTdGF0dXNDb2RlID0ge1xuICBDb250aW51ZTogMTAwLFxuICBTd2l0Y2hpbmdQcm90b2NvbHM6IDEwMSxcbiAgUHJvY2Vzc2luZzogMTAyLFxuICBFYXJseUhpbnRzOiAxMDMsXG4gIE9rOiAyMDAsXG4gIENyZWF0ZWQ6IDIwMSxcbiAgQWNjZXB0ZWQ6IDIwMixcbiAgTm9uQXV0aG9yaXRhdGl2ZUluZm9ybWF0aW9uOiAyMDMsXG4gIE5vQ29udGVudDogMjA0LFxuICBSZXNldENvbnRlbnQ6IDIwNSxcbiAgUGFydGlhbENvbnRlbnQ6IDIwNixcbiAgTXVsdGlTdGF0dXM6IDIwNyxcbiAgQWxyZWFkeVJlcG9ydGVkOiAyMDgsXG4gIEltVXNlZDogMjI2LFxuICBNdWx0aXBsZUNob2ljZXM6IDMwMCxcbiAgTW92ZWRQZXJtYW5lbnRseTogMzAxLFxuICBGb3VuZDogMzAyLFxuICBTZWVPdGhlcjogMzAzLFxuICBOb3RNb2RpZmllZDogMzA0LFxuICBVc2VQcm94eTogMzA1LFxuICBVbnVzZWQ6IDMwNixcbiAgVGVtcG9yYXJ5UmVkaXJlY3Q6IDMwNyxcbiAgUGVybWFuZW50UmVkaXJlY3Q6IDMwOCxcbiAgQmFkUmVxdWVzdDogNDAwLFxuICBVbmF1dGhvcml6ZWQ6IDQwMSxcbiAgUGF5bWVudFJlcXVpcmVkOiA0MDIsXG4gIEZvcmJpZGRlbjogNDAzLFxuICBOb3RGb3VuZDogNDA0LFxuICBNZXRob2ROb3RBbGxvd2VkOiA0MDUsXG4gIE5vdEFjY2VwdGFibGU6IDQwNixcbiAgUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOiA0MDcsXG4gIFJlcXVlc3RUaW1lb3V0OiA0MDgsXG4gIENvbmZsaWN0OiA0MDksXG4gIEdvbmU6IDQxMCxcbiAgTGVuZ3RoUmVxdWlyZWQ6IDQxMSxcbiAgUHJlY29uZGl0aW9uRmFpbGVkOiA0MTIsXG4gIFBheWxvYWRUb29MYXJnZTogNDEzLFxuICBVcmlUb29Mb25nOiA0MTQsXG4gIFVuc3VwcG9ydGVkTWVkaWFUeXBlOiA0MTUsXG4gIFJhbmdlTm90U2F0aXNmaWFibGU6IDQxNixcbiAgRXhwZWN0YXRpb25GYWlsZWQ6IDQxNyxcbiAgSW1BVGVhcG90OiA0MTgsXG4gIE1pc2RpcmVjdGVkUmVxdWVzdDogNDIxLFxuICBVbnByb2Nlc3NhYmxlRW50aXR5OiA0MjIsXG4gIExvY2tlZDogNDIzLFxuICBGYWlsZWREZXBlbmRlbmN5OiA0MjQsXG4gIFRvb0Vhcmx5OiA0MjUsXG4gIFVwZ3JhZGVSZXF1aXJlZDogNDI2LFxuICBQcmVjb25kaXRpb25SZXF1aXJlZDogNDI4LFxuICBUb29NYW55UmVxdWVzdHM6IDQyOSxcbiAgUmVxdWVzdEhlYWRlckZpZWxkc1Rvb0xhcmdlOiA0MzEsXG4gIFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOiA0NTEsXG4gIEludGVybmFsU2VydmVyRXJyb3I6IDUwMCxcbiAgTm90SW1wbGVtZW50ZWQ6IDUwMSxcbiAgQmFkR2F0ZXdheTogNTAyLFxuICBTZXJ2aWNlVW5hdmFpbGFibGU6IDUwMyxcbiAgR2F0ZXdheVRpbWVvdXQ6IDUwNCxcbiAgSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6IDUwNSxcbiAgVmFyaWFudEFsc29OZWdvdGlhdGVzOiA1MDYsXG4gIEluc3VmZmljaWVudFN0b3JhZ2U6IDUwNyxcbiAgTG9vcERldGVjdGVkOiA1MDgsXG4gIE5vdEV4dGVuZGVkOiA1MTAsXG4gIE5ldHdvcmtBdXRoZW50aWNhdGlvblJlcXVpcmVkOiA1MTEsXG59O1xuXG5PYmplY3QuZW50cmllcyhIdHRwU3RhdHVzQ29kZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gIEh0dHBTdGF0dXNDb2RlW3ZhbHVlXSA9IGtleTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBIdHRwU3RhdHVzQ29kZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc1VSTFNlYXJjaFBhcmFtcyBmcm9tICcuLi9oZWxwZXJzL0F4aW9zVVJMU2VhcmNoUGFyYW1zLmpzJztcblxuLyoqXG4gKiBJdCByZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHRoZSBjaGFyYWN0ZXJzIGA6YCwgYCRgLCBgLGAsIGArYCwgYFtgLCBhbmQgYF1gIHdpdGggdGhlaXJcbiAqIFVSSSBlbmNvZGVkIGNvdW50ZXJwYXJ0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgVGhlIHZhbHVlIHRvIGJlIGVuY29kZWQuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZSh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgIHJlcGxhY2UoLyUzQS9naSwgJzonKS5cbiAgICByZXBsYWNlKC8lMjQvZywgJyQnKS5cbiAgICByZXBsYWNlKC8lMkMvZ2ksICcsJykuXG4gICAgcmVwbGFjZSgvJTIwL2csICcrJykuXG4gICAgcmVwbGFjZSgvJTVCL2dpLCAnWycpLlxuICAgIHJlcGxhY2UoLyU1RC9naSwgJ10nKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFVSTCBieSBhcHBlbmRpbmcgcGFyYW1zIHRvIHRoZSBlbmRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1zIHRvIGJlIGFwcGVuZGVkXG4gKiBAcGFyYW0gez9vYmplY3R9IG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHVybFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZFVSTCh1cmwsIHBhcmFtcywgb3B0aW9ucykge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIFxuICBjb25zdCBfZW5jb2RlID0gb3B0aW9ucyAmJiBvcHRpb25zLmVuY29kZSB8fCBlbmNvZGU7XG5cbiAgY29uc3Qgc2VyaWFsaXplRm4gPSBvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplO1xuXG4gIGxldCBzZXJpYWxpemVkUGFyYW1zO1xuXG4gIGlmIChzZXJpYWxpemVGbikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBzZXJpYWxpemVGbihwYXJhbXMsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSB1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpID9cbiAgICAgIHBhcmFtcy50b1N0cmluZygpIDpcbiAgICAgIG5ldyBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpLnRvU3RyaW5nKF9lbmNvZGUpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICBjb25zdCBoYXNobWFya0luZGV4ID0gdXJsLmluZGV4T2YoXCIjXCIpO1xuXG4gICAgaWYgKGhhc2htYXJrSW5kZXggIT09IC0xKSB7XG4gICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaG1hcmtJbmRleCk7XG4gICAgfVxuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlbGF0aXZlVVJMKSB7XG4gIHJldHVybiByZWxhdGl2ZVVSTFxuICAgID8gYmFzZVVSTC5yZXBsYWNlKC9cXC8/XFwvJC8sICcnKSArICcvJyArIHJlbGF0aXZlVVJMLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgOiBiYXNlVVJMO1xufVxuIiwiaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSBcIi4uL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzXCI7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5cbmNvbnN0IGNvbXBvc2VTaWduYWxzID0gKHNpZ25hbHMsIHRpbWVvdXQpID0+IHtcbiAgbGV0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgbGV0IGFib3J0ZWQ7XG5cbiAgY29uc3Qgb25hYm9ydCA9IGZ1bmN0aW9uIChjYW5jZWwpIHtcbiAgICBpZiAoIWFib3J0ZWQpIHtcbiAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgIGNvbnN0IGVyciA9IGNhbmNlbCBpbnN0YW5jZW9mIEVycm9yID8gY2FuY2VsIDogdGhpcy5yZWFzb247XG4gICAgICBjb250cm9sbGVyLmFib3J0KGVyciBpbnN0YW5jZW9mIEF4aW9zRXJyb3IgPyBlcnIgOiBuZXcgQ2FuY2VsZWRFcnJvcihlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyKSk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHRpbWVyID0gdGltZW91dCAmJiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBvbmFib3J0KG5ldyBBeGlvc0Vycm9yKGB0aW1lb3V0ICR7dGltZW91dH0gb2YgbXMgZXhjZWVkZWRgLCBBeGlvc0Vycm9yLkVUSU1FRE9VVCkpXG4gIH0sIHRpbWVvdXQpXG5cbiAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgaWYgKHNpZ25hbHMpIHtcbiAgICAgIHRpbWVyICYmIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgICBzaWduYWxzLmZvckVhY2goc2lnbmFsID0+IHtcbiAgICAgICAgc2lnbmFsICYmXG4gICAgICAgIChzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lciA/IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uYWJvcnQpIDogc2lnbmFsLnVuc3Vic2NyaWJlKG9uYWJvcnQpKTtcbiAgICAgIH0pO1xuICAgICAgc2lnbmFscyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2lnbmFscy5mb3JFYWNoKChzaWduYWwpID0+IHNpZ25hbCAmJiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbmFib3J0KSk7XG5cbiAgY29uc3Qge3NpZ25hbH0gPSBjb250cm9sbGVyO1xuXG4gIHNpZ25hbC51bnN1YnNjcmliZSA9IHVuc3Vic2NyaWJlO1xuXG4gIHJldHVybiBbc2lnbmFsLCAoKSA9PiB7XG4gICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB0aW1lciA9IG51bGw7XG4gIH1dO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb21wb3NlU2lnbmFscztcbiIsImltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gIHtcbiAgICB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICAgIGNvbnN0IGNvb2tpZSA9IFtuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKV07XG5cbiAgICAgIHV0aWxzLmlzTnVtYmVyKGV4cGlyZXMpICYmIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcblxuICAgICAgdXRpbHMuaXNTdHJpbmcocGF0aCkgJiYgY29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xuXG4gICAgICB1dGlscy5pc1N0cmluZyhkb21haW4pICYmIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG5cbiAgICAgIHNlY3VyZSA9PT0gdHJ1ZSAmJiBjb29raWUucHVzaCgnc2VjdXJlJyk7XG5cbiAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgIH0sXG5cbiAgICByZWFkKG5hbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gICAgfSxcblxuICAgIHJlbW92ZShuYW1lKSB7XG4gICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuICAgIH1cbiAgfVxuXG4gIDpcblxuICAvLyBOb24tc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIHtcbiAgICB3cml0ZSgpIHt9LFxuICAgIHJlYWQoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHJlbW92ZSgpIHt9XG4gIH07XG5cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBJdCB0YWtlcyBhIHN0cmluZyBsaWtlIGBmb29beF1beV1bel1gIGFuZCByZXR1cm5zIGFuIGFycmF5IGxpa2UgYFsnZm9vJywgJ3gnLCAneScsICd6J11cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQcm9wUGF0aChuYW1lKSB7XG4gIC8vIGZvb1t4XVt5XVt6XVxuICAvLyBmb28ueC55LnpcbiAgLy8gZm9vLXgteS16XG4gIC8vIGZvbyB4IHkgelxuICByZXR1cm4gdXRpbHMubWF0Y2hBbGwoL1xcdyt8XFxbKFxcdyopXS9nLCBuYW1lKS5tYXAobWF0Y2ggPT4ge1xuICAgIHJldHVybiBtYXRjaFswXSA9PT0gJ1tdJyA/ICcnIDogbWF0Y2hbMV0gfHwgbWF0Y2hbMF07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gYXJyYXkgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYXJyIC0gVGhlIGFycmF5IHRvIGNvbnZlcnQgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBhcyB0aGUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5VG9PYmplY3QoYXJyKSB7XG4gIGNvbnN0IG9iaiA9IHt9O1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYXJyKTtcbiAgbGV0IGk7XG4gIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICBsZXQga2V5O1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBrZXkgPSBrZXlzW2ldO1xuICAgIG9ialtrZXldID0gYXJyW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIEZvcm1EYXRhIG9iamVjdCBhbmQgcmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1EYXRhIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gY29udmVydCB0byBKU09OLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3Q8c3RyaW5nLCBhbnk+IHwgbnVsbH0gVGhlIGNvbnZlcnRlZCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGZvcm1EYXRhVG9KU09OKGZvcm1EYXRhKSB7XG4gIGZ1bmN0aW9uIGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0LCBpbmRleCkge1xuICAgIGxldCBuYW1lID0gcGF0aFtpbmRleCsrXTtcblxuICAgIGlmIChuYW1lID09PSAnX19wcm90b19fJykgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBpc051bWVyaWNLZXkgPSBOdW1iZXIuaXNGaW5pdGUoK25hbWUpO1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID49IHBhdGgubGVuZ3RoO1xuICAgIG5hbWUgPSAhbmFtZSAmJiB1dGlscy5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQubGVuZ3RoIDogbmFtZTtcblxuICAgIGlmIChpc0xhc3QpIHtcbiAgICAgIGlmICh1dGlscy5oYXNPd25Qcm9wKHRhcmdldCwgbmFtZSkpIHtcbiAgICAgICAgdGFyZ2V0W25hbWVdID0gW3RhcmdldFtuYW1lXSwgdmFsdWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W25hbWVdID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0W25hbWVdIHx8ICF1dGlscy5pc09iamVjdCh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldFtuYW1lXSwgaW5kZXgpO1xuXG4gICAgaWYgKHJlc3VsdCAmJiB1dGlscy5pc0FycmF5KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IGFycmF5VG9PYmplY3QodGFyZ2V0W25hbWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgfVxuXG4gIGlmICh1dGlscy5pc0Zvcm1EYXRhKGZvcm1EYXRhKSAmJiB1dGlscy5pc0Z1bmN0aW9uKGZvcm1EYXRhLmVudHJpZXMpKSB7XG4gICAgY29uc3Qgb2JqID0ge307XG5cbiAgICB1dGlscy5mb3JFYWNoRW50cnkoZm9ybURhdGEsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgYnVpbGRQYXRoKHBhcnNlUHJvcFBhdGgobmFtZSksIHZhbHVlLCBvYmosIDApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmb3JtRGF0YVRvSlNPTjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNBYnNvbHV0ZVVSTCh1cmwpIHtcbiAgLy8gQSBVUkwgaXMgY29uc2lkZXJlZCBhYnNvbHV0ZSBpZiBpdCBiZWdpbnMgd2l0aCBcIjxzY2hlbWU+Oi8vXCIgb3IgXCIvL1wiIChwcm90b2NvbC1yZWxhdGl2ZSBVUkwpLlxuICAvLyBSRkMgMzk4NiBkZWZpbmVzIHNjaGVtZSBuYW1lIGFzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBiZWdpbm5pbmcgd2l0aCBhIGxldHRlciBhbmQgZm9sbG93ZWRcbiAgLy8gYnkgYW55IGNvbWJpbmF0aW9uIG9mIGxldHRlcnMsIGRpZ2l0cywgcGx1cywgcGVyaW9kLCBvciBoeXBoZW4uXG4gIHJldHVybiAvXihbYS16XVthLXpcXGQrXFwtLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGFuIGVycm9yIHRocm93biBieSBBeGlvc1xuICpcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYXlsb2FkIGlzIGFuIGVycm9yIHRocm93biBieSBBeGlvcywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQXhpb3NFcnJvcihwYXlsb2FkKSB7XG4gIHJldHVybiB1dGlscy5pc09iamVjdChwYXlsb2FkKSAmJiAocGF5bG9hZC5pc0F4aW9zRXJyb3IgPT09IHRydWUpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4vLyBTdGFuZGFyZCBicm93c2VyIGVudnMgaGF2ZSBmdWxsIHN1cHBvcnQgb2YgdGhlIEFQSXMgbmVlZGVkIHRvIHRlc3Rcbi8vIHdoZXRoZXIgdGhlIHJlcXVlc3QgVVJMIGlzIG9mIHRoZSBzYW1lIG9yaWdpbiBhcyBjdXJyZW50IGxvY2F0aW9uLlxuICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIGNvbnN0IG1zaWUgPSBwbGF0Zm9ybS5uYXZpZ2F0b3IgJiYgLyhtc2llfHRyaWRlbnQpL2kudGVzdChwbGF0Zm9ybS5uYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICBjb25zdCB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsZXQgb3JpZ2luVVJMO1xuXG4gICAgLyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdHMgY29tcG9uZW50c1xuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSBwYXJzZWRcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgKi9cbiAgICBmdW5jdGlvbiByZXNvbHZlVVJMKHVybCkge1xuICAgICAgbGV0IGhyZWYgPSB1cmw7XG5cbiAgICAgIGlmIChtc2llKSB7XG4gICAgICAgIC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcbiAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG4gICAgICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmO1xuICAgICAgfVxuXG4gICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuICAgICAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlsc1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcbiAgICAgICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdDogdXJsUGFyc2luZ05vZGUuaG9zdCxcbiAgICAgICAgc2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuICAgICAgICBoYXNoOiB1cmxQYXJzaW5nTm9kZS5oYXNoID8gdXJsUGFyc2luZ05vZGUuaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLFxuICAgICAgICBob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG4gICAgICAgIHBhdGhuYW1lOiAodXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpID9cbiAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgb3JpZ2luVVJMID0gcmVzb2x2ZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbiAgICAvKipcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVUkwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9ICh1dGlscy5pc1N0cmluZyhyZXF1ZXN0VVJMKSkgPyByZXNvbHZlVVJMKHJlcXVlc3RVUkwpIDogcmVxdWVzdFVSTDtcbiAgICAgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiZcbiAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVVJMLmhvc3QpO1xuICAgIH07XG4gIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudnMgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH0pKCk7XG4iLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3RyaWN0XG5leHBvcnQgZGVmYXVsdCBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbi8vIFJhd0F4aW9zSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbmNvbnN0IGlnbm9yZUR1cGxpY2F0ZU9mID0gdXRpbHMudG9PYmplY3RTZXQoW1xuICAnYWdlJywgJ2F1dGhvcml6YXRpb24nLCAnY29udGVudC1sZW5ndGgnLCAnY29udGVudC10eXBlJywgJ2V0YWcnLFxuICAnZXhwaXJlcycsICdmcm9tJywgJ2hvc3QnLCAnaWYtbW9kaWZpZWQtc2luY2UnLCAnaWYtdW5tb2RpZmllZC1zaW5jZScsXG4gICdsYXN0LW1vZGlmaWVkJywgJ2xvY2F0aW9uJywgJ21heC1mb3J3YXJkcycsICdwcm94eS1hdXRob3JpemF0aW9uJyxcbiAgJ3JlZmVyZXInLCAncmV0cnktYWZ0ZXInLCAndXNlci1hZ2VudCdcbl0pO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcmF3SGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKlxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xuZXhwb3J0IGRlZmF1bHQgcmF3SGVhZGVycyA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHt9O1xuICBsZXQga2V5O1xuICBsZXQgdmFsO1xuICBsZXQgaTtcblxuICByYXdIZWFkZXJzICYmIHJhd0hlYWRlcnMuc3BsaXQoJ1xcbicpLmZvckVhY2goZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gbGluZS5zdWJzdHJpbmcoMCwgaSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gbGluZS5zdWJzdHJpbmcoaSArIDEpLnRyaW0oKTtcblxuICAgIGlmICgha2V5IHx8IChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZltrZXldKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgaWYgKHBhcnNlZFtrZXldKSB7XG4gICAgICAgIHBhcnNlZFtrZXldLnB1c2godmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gW3ZhbF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VQcm90b2NvbCh1cmwpIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbLStcXHddezEsMjV9KSg6P1xcL1xcL3w6KS8uZXhlYyh1cmwpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG59XG4iLCJpbXBvcnQgc3BlZWRvbWV0ZXIgZnJvbSBcIi4vc3BlZWRvbWV0ZXIuanNcIjtcbmltcG9ydCB0aHJvdHRsZSBmcm9tIFwiLi90aHJvdHRsZS5qc1wiO1xuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi91dGlscy5qc1wiO1xuXG5leHBvcnQgY29uc3QgcHJvZ3Jlc3NFdmVudFJlZHVjZXIgPSAobGlzdGVuZXIsIGlzRG93bmxvYWRTdHJlYW0sIGZyZXEgPSAzKSA9PiB7XG4gIGxldCBieXRlc05vdGlmaWVkID0gMDtcbiAgY29uc3QgX3NwZWVkb21ldGVyID0gc3BlZWRvbWV0ZXIoNTAsIDI1MCk7XG5cbiAgcmV0dXJuIHRocm90dGxlKGUgPT4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGUubG9hZGVkO1xuICAgIGNvbnN0IHRvdGFsID0gZS5sZW5ndGhDb21wdXRhYmxlID8gZS50b3RhbCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9ncmVzc0J5dGVzID0gbG9hZGVkIC0gYnl0ZXNOb3RpZmllZDtcbiAgICBjb25zdCByYXRlID0gX3NwZWVkb21ldGVyKHByb2dyZXNzQnl0ZXMpO1xuICAgIGNvbnN0IGluUmFuZ2UgPSBsb2FkZWQgPD0gdG90YWw7XG5cbiAgICBieXRlc05vdGlmaWVkID0gbG9hZGVkO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGxvYWRlZCxcbiAgICAgIHRvdGFsLFxuICAgICAgcHJvZ3Jlc3M6IHRvdGFsID8gKGxvYWRlZCAvIHRvdGFsKSA6IHVuZGVmaW5lZCxcbiAgICAgIGJ5dGVzOiBwcm9ncmVzc0J5dGVzLFxuICAgICAgcmF0ZTogcmF0ZSA/IHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBlc3RpbWF0ZWQ6IHJhdGUgJiYgdG90YWwgJiYgaW5SYW5nZSA/ICh0b3RhbCAtIGxvYWRlZCkgLyByYXRlIDogdW5kZWZpbmVkLFxuICAgICAgZXZlbnQ6IGUsXG4gICAgICBsZW5ndGhDb21wdXRhYmxlOiB0b3RhbCAhPSBudWxsLFxuICAgICAgW2lzRG93bmxvYWRTdHJlYW0gPyAnZG93bmxvYWQnIDogJ3VwbG9hZCddOiB0cnVlXG4gICAgfTtcblxuICAgIGxpc3RlbmVyKGRhdGEpO1xuICB9LCBmcmVxKTtcbn1cblxuZXhwb3J0IGNvbnN0IHByb2dyZXNzRXZlbnREZWNvcmF0b3IgPSAodG90YWwsIHRocm90dGxlZCkgPT4ge1xuICBjb25zdCBsZW5ndGhDb21wdXRhYmxlID0gdG90YWwgIT0gbnVsbDtcblxuICByZXR1cm4gWyhsb2FkZWQpID0+IHRocm90dGxlZFswXSh7XG4gICAgbGVuZ3RoQ29tcHV0YWJsZSxcbiAgICB0b3RhbCxcbiAgICBsb2FkZWRcbiAgfSksIHRocm90dGxlZFsxXV07XG59XG5cbmV4cG9ydCBjb25zdCBhc3luY0RlY29yYXRvciA9IChmbikgPT4gKC4uLmFyZ3MpID0+IHV0aWxzLmFzYXAoKCkgPT4gZm4oLi4uYXJncykpO1xuIiwiaW1wb3J0IHBsYXRmb3JtIGZyb20gXCIuLi9wbGF0Zm9ybS9pbmRleC5qc1wiO1xuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IGlzVVJMU2FtZU9yaWdpbiBmcm9tIFwiLi9pc1VSTFNhbWVPcmlnaW4uanNcIjtcbmltcG9ydCBjb29raWVzIGZyb20gXCIuL2Nvb2tpZXMuanNcIjtcbmltcG9ydCBidWlsZEZ1bGxQYXRoIGZyb20gXCIuLi9jb3JlL2J1aWxkRnVsbFBhdGguanNcIjtcbmltcG9ydCBtZXJnZUNvbmZpZyBmcm9tIFwiLi4vY29yZS9tZXJnZUNvbmZpZy5qc1wiO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi4vY29yZS9BeGlvc0hlYWRlcnMuanNcIjtcbmltcG9ydCBidWlsZFVSTCBmcm9tIFwiLi9idWlsZFVSTC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoY29uZmlnKSA9PiB7XG4gIGNvbnN0IG5ld0NvbmZpZyA9IG1lcmdlQ29uZmlnKHt9LCBjb25maWcpO1xuXG4gIGxldCB7ZGF0YSwgd2l0aFhTUkZUb2tlbiwgeHNyZkhlYWRlck5hbWUsIHhzcmZDb29raWVOYW1lLCBoZWFkZXJzLCBhdXRofSA9IG5ld0NvbmZpZztcblxuICBuZXdDb25maWcuaGVhZGVycyA9IGhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShoZWFkZXJzKTtcblxuICBuZXdDb25maWcudXJsID0gYnVpbGRVUkwoYnVpbGRGdWxsUGF0aChuZXdDb25maWcuYmFzZVVSTCwgbmV3Q29uZmlnLnVybCksIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcblxuICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gIGlmIChhdXRoKSB7XG4gICAgaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArXG4gICAgICBidG9hKChhdXRoLnVzZXJuYW1lIHx8ICcnKSArICc6JyArIChhdXRoLnBhc3N3b3JkID8gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgucGFzc3dvcmQpKSA6ICcnKSlcbiAgICApO1xuICB9XG5cbiAgbGV0IGNvbnRlbnRUeXBlO1xuXG4gIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpKSB7XG4gICAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiB8fCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUodW5kZWZpbmVkKTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH0gZWxzZSBpZiAoKGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpKSAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIGZpeCBzZW1pY29sb24gZHVwbGljYXRpb24gaXNzdWUgZm9yIFJlYWN0TmF0aXZlIEZvcm1EYXRhIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBbdHlwZSwgLi4udG9rZW5zXSA9IGNvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKS5tYXAodG9rZW4gPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoW3R5cGUgfHwgJ211bHRpcGFydC9mb3JtLWRhdGEnLCAuLi50b2tlbnNdLmpvaW4oJzsgJykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB4c3JmIGhlYWRlclxuICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cblxuICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52KSB7XG4gICAgd2l0aFhTUkZUb2tlbiAmJiB1dGlscy5pc0Z1bmN0aW9uKHdpdGhYU1JGVG9rZW4pICYmICh3aXRoWFNSRlRva2VuID0gd2l0aFhTUkZUb2tlbihuZXdDb25maWcpKTtcblxuICAgIGlmICh3aXRoWFNSRlRva2VuIHx8ICh3aXRoWFNSRlRva2VuICE9PSBmYWxzZSAmJiBpc1VSTFNhbWVPcmlnaW4obmV3Q29uZmlnLnVybCkpKSB7XG4gICAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAgIGNvbnN0IHhzcmZWYWx1ZSA9IHhzcmZIZWFkZXJOYW1lICYmIHhzcmZDb29raWVOYW1lICYmIGNvb2tpZXMucmVhZCh4c3JmQ29va2llTmFtZSk7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgaGVhZGVycy5zZXQoeHNyZkhlYWRlck5hbWUsIHhzcmZWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0NvbmZpZztcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENhbGN1bGF0ZSBkYXRhIG1heFJhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2FtcGxlc0NvdW50PSAxMF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbbWluPSAxMDAwXVxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBzcGVlZG9tZXRlcihzYW1wbGVzQ291bnQsIG1pbikge1xuICBzYW1wbGVzQ291bnQgPSBzYW1wbGVzQ291bnQgfHwgMTA7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGNvbnN0IHRpbWVzdGFtcHMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgbGV0IGhlYWQgPSAwO1xuICBsZXQgdGFpbCA9IDA7XG4gIGxldCBmaXJzdFNhbXBsZVRTO1xuXG4gIG1pbiA9IG1pbiAhPT0gdW5kZWZpbmVkID8gbWluIDogMTAwMDtcblxuICByZXR1cm4gZnVuY3Rpb24gcHVzaChjaHVua0xlbmd0aCkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICBjb25zdCBzdGFydGVkQXQgPSB0aW1lc3RhbXBzW3RhaWxdO1xuXG4gICAgaWYgKCFmaXJzdFNhbXBsZVRTKSB7XG4gICAgICBmaXJzdFNhbXBsZVRTID0gbm93O1xuICAgIH1cblxuICAgIGJ5dGVzW2hlYWRdID0gY2h1bmtMZW5ndGg7XG4gICAgdGltZXN0YW1wc1toZWFkXSA9IG5vdztcblxuICAgIGxldCBpID0gdGFpbDtcbiAgICBsZXQgYnl0ZXNDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAoaSAhPT0gaGVhZCkge1xuICAgICAgYnl0ZXNDb3VudCArPSBieXRlc1tpKytdO1xuICAgICAgaSA9IGkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaGVhZCA9IChoZWFkICsgMSkgJSBzYW1wbGVzQ291bnQ7XG5cbiAgICBpZiAoaGVhZCA9PT0gdGFpbCkge1xuICAgICAgdGFpbCA9ICh0YWlsICsgMSkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaWYgKG5vdyAtIGZpcnN0U2FtcGxlVFMgPCBtaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXNzZWQgPSBzdGFydGVkQXQgJiYgbm93IC0gc3RhcnRlZEF0O1xuXG4gICAgcmV0dXJuIHBhc3NlZCA/IE1hdGgucm91bmQoYnl0ZXNDb3VudCAqIDEwMDAgLyBwYXNzZWQpIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBzcGVlZG9tZXRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIHZhciBhcmdzID0gWzEsIDIsIDNdO1xuICogIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gKiAgYGBgXG4gKlxuICogV2l0aCBgc3ByZWFkYCB0aGlzIGV4YW1wbGUgY2FuIGJlIHJlLXdyaXR0ZW4uXG4gKlxuICogIGBgYGpzXG4gKiAgc3ByZWFkKGZ1bmN0aW9uKHgsIHksIHopIHt9KShbMSwgMiwgM10pO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59XG4iLCIvKipcbiAqIFRocm90dGxlIGRlY29yYXRvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmcmVxXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUoZm4sIGZyZXEpIHtcbiAgbGV0IHRpbWVzdGFtcCA9IDA7XG4gIGxldCB0aHJlc2hvbGQgPSAxMDAwIC8gZnJlcTtcbiAgbGV0IGxhc3RBcmdzO1xuICBsZXQgdGltZXI7XG5cbiAgY29uc3QgaW52b2tlID0gKGFyZ3MsIG5vdyA9IERhdGUubm93KCkpID0+IHtcbiAgICB0aW1lc3RhbXAgPSBub3c7XG4gICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gIH1cblxuICBjb25zdCB0aHJvdHRsZWQgPSAoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcGFzc2VkID0gbm93IC0gdGltZXN0YW1wO1xuICAgIGlmICggcGFzc2VkID49IHRocmVzaG9sZCkge1xuICAgICAgaW52b2tlKGFyZ3MsIG5vdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RBcmdzID0gYXJncztcbiAgICAgIGlmICghdGltZXIpIHtcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aW1lciA9IG51bGw7XG4gICAgICAgICAgaW52b2tlKGxhc3RBcmdzKVxuICAgICAgICB9LCB0aHJlc2hvbGQgLSBwYXNzZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZsdXNoID0gKCkgPT4gbGFzdEFyZ3MgJiYgaW52b2tlKGxhc3RBcmdzKTtcblxuICByZXR1cm4gW3Rocm90dGxlZCwgZmx1c2hdO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0aHJvdHRsZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG4vLyB0ZW1wb3JhcnkgaG90Zml4IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMgdW50aWwgQXhpb3NVUkxTZWFyY2hQYXJhbXMgaXMgcmVmYWN0b3JlZFxuaW1wb3J0IFBsYXRmb3JtRm9ybURhdGEgZnJvbSAnLi4vcGxhdGZvcm0vbm9kZS9jbGFzc2VzL0Zvcm1EYXRhLmpzJztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0aGluZyBpcyBhIGFycmF5IG9yIGpzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGhpbmcgLSBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIGJlIHZpc2l0ZWQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmlzaXRhYmxlKHRoaW5nKSB7XG4gIHJldHVybiB1dGlscy5pc1BsYWluT2JqZWN0KHRoaW5nKSB8fCB1dGlscy5pc0FycmF5KHRoaW5nKTtcbn1cblxuLyoqXG4gKiBJdCByZW1vdmVzIHRoZSBicmFja2V0cyBmcm9tIHRoZSBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgcGFyYW1ldGVyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBrZXkgd2l0aG91dCB0aGUgYnJhY2tldHMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUJyYWNrZXRzKGtleSkge1xuICByZXR1cm4gdXRpbHMuZW5kc1dpdGgoa2V5LCAnW10nKSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXRoLCBhIGtleSwgYW5kIGEgYm9vbGVhbiwgYW5kIHJldHVybnMgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBjdXJyZW50IG9iamVjdCBiZWluZyBpdGVyYXRlZCBvdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRvdHMgLSBJZiB0cnVlLCB0aGUga2V5IHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBkb3RzIGluc3RlYWQgb2YgYnJhY2tldHMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICovXG5mdW5jdGlvbiByZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuIGtleTtcbiAgcmV0dXJuIHBhdGguY29uY2F0KGtleSkubWFwKGZ1bmN0aW9uIGVhY2godG9rZW4sIGkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICB0b2tlbiA9IHJlbW92ZUJyYWNrZXRzKHRva2VuKTtcbiAgICByZXR1cm4gIWRvdHMgJiYgaSA/ICdbJyArIHRva2VuICsgJ10nIDogdG9rZW47XG4gIH0pLmpvaW4oZG90cyA/ICcuJyA6ICcnKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgYXJyYXkgaXMgYW4gYXJyYXkgYW5kIG5vbmUgb2YgaXRzIGVsZW1lbnRzIGFyZSB2aXNpdGFibGUsIHRoZW4gaXQncyBhIGZsYXQgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGbGF0QXJyYXkoYXJyKSB7XG4gIHJldHVybiB1dGlscy5pc0FycmF5KGFycikgJiYgIWFyci5zb21lKGlzVmlzaXRhYmxlKTtcbn1cblxuY29uc3QgcHJlZGljYXRlcyA9IHV0aWxzLnRvRmxhdE9iamVjdCh1dGlscywge30sIG51bGwsIGZ1bmN0aW9uIGZpbHRlcihwcm9wKSB7XG4gIHJldHVybiAvXmlzW0EtWl0vLnRlc3QocHJvcCk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgZGF0YSBvYmplY3QgdG8gRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0gez9PYmplY3R9IFtmb3JtRGF0YV1cbiAqIEBwYXJhbSB7P09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy52aXNpdG9yXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tZXRhVG9rZW5zID0gdHJ1ZV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZG90cyA9IGZhbHNlXVxuICogQHBhcmFtIHs/Qm9vbGVhbn0gW29wdGlvbnMuaW5kZXhlcyA9IGZhbHNlXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKiovXG5cbi8qKlxuICogSXQgY29udmVydHMgYW4gb2JqZWN0IGludG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gY29udmVydCB0byBmb3JtIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgLSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHRvRm9ybURhdGEob2JqLCBmb3JtRGF0YSwgb3B0aW9ucykge1xuICBpZiAoIXV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBmb3JtRGF0YSA9IGZvcm1EYXRhIHx8IG5ldyAoUGxhdGZvcm1Gb3JtRGF0YSB8fCBGb3JtRGF0YSkoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgb3B0aW9ucyA9IHV0aWxzLnRvRmxhdE9iamVjdChvcHRpb25zLCB7XG4gICAgbWV0YVRva2VuczogdHJ1ZSxcbiAgICBkb3RzOiBmYWxzZSxcbiAgICBpbmRleGVzOiBmYWxzZVxuICB9LCBmYWxzZSwgZnVuY3Rpb24gZGVmaW5lZChvcHRpb24sIHNvdXJjZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICAgIHJldHVybiAhdXRpbHMuaXNVbmRlZmluZWQoc291cmNlW29wdGlvbl0pO1xuICB9KTtcblxuICBjb25zdCBtZXRhVG9rZW5zID0gb3B0aW9ucy5tZXRhVG9rZW5zO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgY29uc3QgdmlzaXRvciA9IG9wdGlvbnMudmlzaXRvciB8fCBkZWZhdWx0VmlzaXRvcjtcbiAgY29uc3QgZG90cyA9IG9wdGlvbnMuZG90cztcbiAgY29uc3QgaW5kZXhlcyA9IG9wdGlvbnMuaW5kZXhlcztcbiAgY29uc3QgX0Jsb2IgPSBvcHRpb25zLkJsb2IgfHwgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIEJsb2I7XG4gIGNvbnN0IHVzZUJsb2IgPSBfQmxvYiAmJiB1dGlscy5pc1NwZWNDb21wbGlhbnRGb3JtKGZvcm1EYXRhKTtcblxuICBpZiAoIXV0aWxzLmlzRnVuY3Rpb24odmlzaXRvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2aXNpdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJyc7XG5cbiAgICBpZiAodXRpbHMuaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VCbG9iICYmIHV0aWxzLmlzQmxvYih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdCbG9iIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhIEJ1ZmZlciBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyKHZhbHVlKSB8fCB1dGlscy5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdXNlQmxvYiAmJiB0eXBlb2YgQmxvYiA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBCbG9iKFt2YWx1ZV0pIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZpc2l0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBrZXlcbiAgICogQHBhcmFtIHtBcnJheTxTdHJpbmd8TnVtYmVyPn0gcGF0aFxuICAgKiBAdGhpcyB7Rm9ybURhdGF9XG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgZWFjaCBwcm9wIG9mIHRoZSB2YWx1ZSByZWN1cnNpdmVseVxuICAgKi9cbiAgZnVuY3Rpb24gZGVmYXVsdFZpc2l0b3IodmFsdWUsIGtleSwgcGF0aCkge1xuICAgIGxldCBhcnIgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhcGF0aCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodXRpbHMuZW5kc1dpdGgoa2V5LCAne30nKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gbWV0YVRva2VucyA/IGtleSA6IGtleS5zbGljZSgwLCAtMik7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICh1dGlscy5pc0FycmF5KHZhbHVlKSAmJiBpc0ZsYXRBcnJheSh2YWx1ZSkpIHx8XG4gICAgICAgICgodXRpbHMuaXNGaWxlTGlzdCh2YWx1ZSkgfHwgdXRpbHMuZW5kc1dpdGgoa2V5LCAnW10nKSkgJiYgKGFyciA9IHV0aWxzLnRvQXJyYXkodmFsdWUpKVxuICAgICAgICApKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSByZW1vdmVCcmFja2V0cyhrZXkpO1xuXG4gICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uIGVhY2goZWwsIGluZGV4KSB7XG4gICAgICAgICAgISh1dGlscy5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgaW5kZXhlcyA9PT0gdHJ1ZSA/IHJlbmRlcktleShba2V5XSwgaW5kZXgsIGRvdHMpIDogKGluZGV4ZXMgPT09IG51bGwgPyBrZXkgOiBrZXkgKyAnW10nKSxcbiAgICAgICAgICAgIGNvbnZlcnRWYWx1ZShlbClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1Zpc2l0YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvcm1EYXRhLmFwcGVuZChyZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSwgY29udmVydFZhbHVlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzdGFjayA9IFtdO1xuXG4gIGNvbnN0IGV4cG9zZWRIZWxwZXJzID0gT2JqZWN0LmFzc2lnbihwcmVkaWNhdGVzLCB7XG4gICAgZGVmYXVsdFZpc2l0b3IsXG4gICAgY29udmVydFZhbHVlLFxuICAgIGlzVmlzaXRhYmxlXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGJ1aWxkKHZhbHVlLCBwYXRoKSB7XG4gICAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgaWYgKHN0YWNrLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAnICsgcGF0aC5qb2luKCcuJykpO1xuICAgIH1cblxuICAgIHN0YWNrLnB1c2godmFsdWUpO1xuXG4gICAgdXRpbHMuZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24gZWFjaChlbCwga2V5KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSAhKHV0aWxzLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgdmlzaXRvci5jYWxsKFxuICAgICAgICBmb3JtRGF0YSwgZWwsIHV0aWxzLmlzU3RyaW5nKGtleSkgPyBrZXkudHJpbSgpIDoga2V5LCBwYXRoLCBleHBvc2VkSGVscGVyc1xuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICBidWlsZChlbCwgcGF0aCA/IHBhdGguY29uY2F0KGtleSkgOiBba2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgfVxuXG4gIGlmICghdXRpbHMuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RhdGEgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuXG4gIGJ1aWxkKG9iaik7XG5cbiAgcmV0dXJuIGZvcm1EYXRhO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b0Zvcm1EYXRhO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi90b0Zvcm1EYXRhLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvVVJMRW5jb2RlZEZvcm0oZGF0YSwgb3B0aW9ucykge1xuICByZXR1cm4gdG9Gb3JtRGF0YShkYXRhLCBuZXcgcGxhdGZvcm0uY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMoKSwgT2JqZWN0LmFzc2lnbih7XG4gICAgdmlzaXRvcjogZnVuY3Rpb24odmFsdWUsIGtleSwgcGF0aCwgaGVscGVycykge1xuICAgICAgaWYgKHBsYXRmb3JtLmlzTm9kZSAmJiB1dGlscy5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoa2V5LCB2YWx1ZS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoZWxwZXJzLmRlZmF1bHRWaXNpdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9LCBvcHRpb25zKSk7XG59XG4iLCJcbmV4cG9ydCBjb25zdCBzdHJlYW1DaHVuayA9IGZ1bmN0aW9uKiAoY2h1bmssIGNodW5rU2l6ZSkge1xuICBsZXQgbGVuID0gY2h1bmsuYnl0ZUxlbmd0aDtcblxuICBpZiAoIWNodW5rU2l6ZSB8fCBsZW4gPCBjaHVua1NpemUpIHtcbiAgICB5aWVsZCBjaHVuaztcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgcG9zID0gMDtcbiAgbGV0IGVuZDtcblxuICB3aGlsZSAocG9zIDwgbGVuKSB7XG4gICAgZW5kID0gcG9zICsgY2h1bmtTaXplO1xuICAgIHlpZWxkIGNodW5rLnNsaWNlKHBvcywgZW5kKTtcbiAgICBwb3MgPSBlbmQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlYWRCeXRlcyA9IGFzeW5jIGZ1bmN0aW9uKiAoaXRlcmFibGUsIGNodW5rU2l6ZSwgZW5jb2RlKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCogc3RyZWFtQ2h1bmsoQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSA/IGNodW5rIDogKGF3YWl0IGVuY29kZShTdHJpbmcoY2h1bmspKSksIGNodW5rU2l6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHRyYWNrU3RyZWFtID0gKHN0cmVhbSwgY2h1bmtTaXplLCBvblByb2dyZXNzLCBvbkZpbmlzaCwgZW5jb2RlKSA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gcmVhZEJ5dGVzKHN0cmVhbSwgY2h1bmtTaXplLCBlbmNvZGUpO1xuXG4gIGxldCBieXRlcyA9IDA7XG4gIGxldCBkb25lO1xuICBsZXQgX29uRmluaXNoID0gKGUpID0+IHtcbiAgICBpZiAoIWRvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgb25GaW5pc2ggJiYgb25GaW5pc2goZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7ZG9uZSwgdmFsdWV9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICBfb25GaW5pc2goKTtcbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxlbiA9IHZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICAgICAgbGV0IGxvYWRlZEJ5dGVzID0gYnl0ZXMgKz0gbGVuO1xuICAgICAgICAgIG9uUHJvZ3Jlc3MobG9hZGVkQnl0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9vbkZpbmlzaChlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSxcbiAgICBjYW5jZWwocmVhc29uKSB7XG4gICAgICBfb25GaW5pc2gocmVhc29uKTtcbiAgICAgIHJldHVybiBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBoaWdoV2F0ZXJNYXJrOiAyXG4gIH0pXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7VkVSU0lPTn0gZnJvbSAnLi4vZW52L2RhdGEuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcblxuY29uc3QgdmFsaWRhdG9ycyA9IHt9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuWydvYmplY3QnLCAnYm9vbGVhbicsICdudW1iZXInLCAnZnVuY3Rpb24nLCAnc3RyaW5nJywgJ3N5bWJvbCddLmZvckVhY2goKHR5cGUsIGkpID0+IHtcbiAgdmFsaWRhdG9yc1t0eXBlXSA9IGZ1bmN0aW9uIHZhbGlkYXRvcih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IHR5cGUgfHwgJ2EnICsgKGkgPCAxID8gJ24gJyA6ICcgJykgKyB0eXBlO1xuICB9O1xufSk7XG5cbmNvbnN0IGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yIC0gc2V0IHRvIGZhbHNlIGlmIHRoZSB0cmFuc2l0aW9uYWwgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWRcbiAqIEBwYXJhbSB7c3RyaW5nP30gdmVyc2lvbiAtIGRlcHJlY2F0ZWQgdmVyc2lvbiAvIHJlbW92ZWQgc2luY2UgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG52YWxpZGF0b3JzLnRyYW5zaXRpb25hbCA9IGZ1bmN0aW9uIHRyYW5zaXRpb25hbCh2YWxpZGF0b3IsIHZlcnNpb24sIG1lc3NhZ2UpIHtcbiAgZnVuY3Rpb24gZm9ybWF0TWVzc2FnZShvcHQsIGRlc2MpIHtcbiAgICByZXR1cm4gJ1tBeGlvcyB2JyArIFZFUlNJT04gKyAnXSBUcmFuc2l0aW9uYWwgb3B0aW9uIFxcJycgKyBvcHQgKyAnXFwnJyArIGRlc2MgKyAobWVzc2FnZSA/ICcuICcgKyBtZXNzYWdlIDogJycpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuICh2YWx1ZSwgb3B0LCBvcHRzKSA9PiB7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKG9wdCwgJyBoYXMgYmVlbiByZW1vdmVkJyArICh2ZXJzaW9uID8gJyBpbiAnICsgdmVyc2lvbiA6ICcnKSksXG4gICAgICAgIEF4aW9zRXJyb3IuRVJSX0RFUFJFQ0FURURcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24gJiYgIWRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdKSB7XG4gICAgICBkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIG9wdCxcbiAgICAgICAgICAnIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdicgKyB2ZXJzaW9uICsgJyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSdcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yID8gdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdHMpIDogdHJ1ZTtcbiAgfTtcbn07XG5cbi8qKlxuICogQXNzZXJ0IG9iamVjdCdzIHByb3BlcnRpZXMgdHlwZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gc2NoZW1hXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBhbGxvd1Vua25vd25cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGFzc2VydE9wdGlvbnMob3B0aW9ucywgc2NoZW1hLCBhbGxvd1Vua25vd24pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JywgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIGNvbnN0IG9wdCA9IGtleXNbaV07XG4gICAgY29uc3QgdmFsaWRhdG9yID0gc2NoZW1hW29wdF07XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW29wdF07XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRpb25zKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbiAnICsgb3B0ICsgJyBtdXN0IGJlICcgKyByZXN1bHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhbGxvd1Vua25vd24gIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdVbmtub3duIG9wdGlvbiAnICsgb3B0LCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBhc3NlcnRPcHRpb25zLFxuICB2YWxpZGF0b3JzXG59O1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyA/IEJsb2IgOiBudWxsXG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcgPyBGb3JtRGF0YSA6IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc1VSTFNlYXJjaFBhcmFtcyBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL0F4aW9zVVJMU2VhcmNoUGFyYW1zLmpzJztcbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnID8gVVJMU2VhcmNoUGFyYW1zIDogQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG4iLCJpbXBvcnQgVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4vY2xhc3Nlcy9VUkxTZWFyY2hQYXJhbXMuanMnXG5pbXBvcnQgRm9ybURhdGEgZnJvbSAnLi9jbGFzc2VzL0Zvcm1EYXRhLmpzJ1xuaW1wb3J0IEJsb2IgZnJvbSAnLi9jbGFzc2VzL0Jsb2IuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaXNCcm93c2VyOiB0cnVlLFxuICBjbGFzc2VzOiB7XG4gICAgVVJMU2VhcmNoUGFyYW1zLFxuICAgIEZvcm1EYXRhLFxuICAgIEJsb2JcbiAgfSxcbiAgcHJvdG9jb2xzOiBbJ2h0dHAnLCAnaHR0cHMnLCAnZmlsZScsICdibG9iJywgJ3VybCcsICdkYXRhJ11cbn07XG4iLCJjb25zdCBoYXNCcm93c2VyRW52ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcblxuY29uc3QgX25hdmlnYXRvciA9IHR5cGVvZiBuYXZpZ2F0b3IgPT09ICdvYmplY3QnICYmIG5hdmlnYXRvciB8fCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50XG4gKlxuICogVGhpcyBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlciwgYW5kIHJlYWN0LW5hdGl2ZS5cbiAqIEJvdGggZW52aXJvbm1lbnRzIHN1cHBvcnQgWE1MSHR0cFJlcXVlc3QsIGJ1dCBub3QgZnVsbHkgc3RhbmRhcmQgZ2xvYmFscy5cbiAqXG4gKiB3ZWIgd29ya2VyczpcbiAqICB0eXBlb2Ygd2luZG93IC0+IHVuZGVmaW5lZFxuICogIHR5cGVvZiBkb2N1bWVudCAtPiB1bmRlZmluZWRcbiAqXG4gKiByZWFjdC1uYXRpdmU6XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ1JlYWN0TmF0aXZlJ1xuICogbmF0aXZlc2NyaXB0XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ05hdGl2ZVNjcmlwdCcgb3IgJ05TJ1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBoYXNTdGFuZGFyZEJyb3dzZXJFbnYgPSBoYXNCcm93c2VyRW52ICYmXG4gICghX25hdmlnYXRvciB8fCBbJ1JlYWN0TmF0aXZlJywgJ05hdGl2ZVNjcmlwdCcsICdOUyddLmluZGV4T2YoX25hdmlnYXRvci5wcm9kdWN0KSA8IDApO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciB3ZWJXb3JrZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBBbHRob3VnaCB0aGUgYGlzU3RhbmRhcmRCcm93c2VyRW52YCBtZXRob2QgaW5kaWNhdGVzIHRoYXRcbiAqIGBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlcmAsIHRoZSBXZWJXb3JrZXIgd2lsbCBzdGlsbCBiZVxuICogZmlsdGVyZWQgb3V0IGR1ZSB0byBpdHMganVkZ21lbnQgc3RhbmRhcmRcbiAqIGB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnYC5cbiAqIFRoaXMgbGVhZHMgdG8gYSBwcm9ibGVtIHdoZW4gYXhpb3MgcG9zdCBgRm9ybURhdGFgIGluIHdlYldvcmtlclxuICovXG5jb25zdCBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYgPSAoKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUgJiZcbiAgICB0eXBlb2Ygc2VsZi5pbXBvcnRTY3JpcHRzID09PSAnZnVuY3Rpb24nXG4gICk7XG59KSgpO1xuXG5jb25zdCBvcmlnaW4gPSBoYXNCcm93c2VyRW52ICYmIHdpbmRvdy5sb2NhdGlvbi5ocmVmIHx8ICdodHRwOi8vbG9jYWxob3N0JztcblxuZXhwb3J0IHtcbiAgaGFzQnJvd3NlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52LFxuICBoYXNTdGFuZGFyZEJyb3dzZXJFbnYsXG4gIF9uYXZpZ2F0b3IgYXMgbmF2aWdhdG9yLFxuICBvcmlnaW5cbn1cbiIsImltcG9ydCBwbGF0Zm9ybSBmcm9tICcuL25vZGUvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9jb21tb24vdXRpbHMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC4uLnV0aWxzLFxuICAuLi5wbGF0Zm9ybVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgYmluZCBmcm9tICcuL2hlbHBlcnMvYmluZC5qcyc7XG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbmNvbnN0IHt0b1N0cmluZ30gPSBPYmplY3QucHJvdG90eXBlO1xuY29uc3Qge2dldFByb3RvdHlwZU9mfSA9IE9iamVjdDtcblxuY29uc3Qga2luZE9mID0gKGNhY2hlID0+IHRoaW5nID0+IHtcbiAgICBjb25zdCBzdHIgPSB0b1N0cmluZy5jYWxsKHRoaW5nKTtcbiAgICByZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IHN0ci5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKSk7XG59KShPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuY29uc3Qga2luZE9mVGVzdCA9ICh0eXBlKSA9PiB7XG4gIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAodGhpbmcpID0+IGtpbmRPZih0aGluZykgPT09IHR5cGVcbn1cblxuY29uc3QgdHlwZU9mVGVzdCA9IHR5cGUgPT4gdGhpbmcgPT4gdHlwZW9mIHRoaW5nID09PSB0eXBlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3Qge2lzQXJyYXl9ID0gQXJyYXk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNVbmRlZmluZWQgPSB0eXBlT2ZUZXN0KCd1bmRlZmluZWQnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0J1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsKSAmJiB2YWwuY29uc3RydWN0b3IgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbC5jb25zdHJ1Y3RvcilcbiAgICAmJiBpc0Z1bmN0aW9uKHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcikgJiYgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNBcnJheUJ1ZmZlciA9IGtpbmRPZlRlc3QoJ0FycmF5QnVmZmVyJyk7XG5cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICBsZXQgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmIChpc0FycmF5QnVmZmVyKHZhbC5idWZmZXIpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyaW5nXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyaW5nID0gdHlwZU9mVGVzdCgnc3RyaW5nJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGdW5jdGlvbiA9IHR5cGVPZlRlc3QoJ2Z1bmN0aW9uJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNOdW1iZXIgPSB0eXBlT2ZUZXN0KCdudW1iZXInKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNPYmplY3QgPSAodGhpbmcpID0+IHRoaW5nICE9PSBudWxsICYmIHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCb29sZWFuXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCb29sZWFuLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCb29sZWFuID0gdGhpbmcgPT4gdGhpbmcgPT09IHRydWUgfHwgdGhpbmcgPT09IGZhbHNlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsKSA9PiB7XG4gIGlmIChraW5kT2YodmFsKSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZih2YWwpO1xuICByZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbCkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIERhdGVcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRGF0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRGF0ZSA9IGtpbmRPZlRlc3QoJ0RhdGUnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZSA9IGtpbmRPZlRlc3QoJ0ZpbGUnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJsb2JcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQmxvYiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQmxvYiA9IGtpbmRPZlRlc3QoJ0Jsb2InKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVMaXN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0ZpbGVMaXN0ID0ga2luZE9mVGVzdCgnRmlsZUxpc3QnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJlYW0sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1N0cmVhbSA9ICh2YWwpID0+IGlzT2JqZWN0KHZhbCkgJiYgaXNGdW5jdGlvbih2YWwucGlwZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBGb3JtRGF0YSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRm9ybURhdGEgPSAodGhpbmcpID0+IHtcbiAgbGV0IGtpbmQ7XG4gIHJldHVybiB0aGluZyAmJiAoXG4gICAgKHR5cGVvZiBGb3JtRGF0YSA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGluZyBpbnN0YW5jZW9mIEZvcm1EYXRhKSB8fCAoXG4gICAgICBpc0Z1bmN0aW9uKHRoaW5nLmFwcGVuZCkgJiYgKFxuICAgICAgICAoa2luZCA9IGtpbmRPZih0aGluZykpID09PSAnZm9ybWRhdGEnIHx8XG4gICAgICAgIC8vIGRldGVjdCBmb3JtLWRhdGEgaW5zdGFuY2VcbiAgICAgICAgKGtpbmQgPT09ICdvYmplY3QnICYmIGlzRnVuY3Rpb24odGhpbmcudG9TdHJpbmcpICYmIHRoaW5nLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IEZvcm1EYXRhXScpXG4gICAgICApXG4gICAgKVxuICApXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IGtpbmRPZlRlc3QoJ1VSTFNlYXJjaFBhcmFtcycpO1xuXG5jb25zdCBbaXNSZWFkYWJsZVN0cmVhbSwgaXNSZXF1ZXN0LCBpc1Jlc3BvbnNlLCBpc0hlYWRlcnNdID0gWydSZWFkYWJsZVN0cmVhbScsICdSZXF1ZXN0JywgJ1Jlc3BvbnNlJywgJ0hlYWRlcnMnXS5tYXAoa2luZE9mVGVzdCk7XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmNvbnN0IHRyaW0gPSAoc3RyKSA9PiBzdHIudHJpbSA/XG4gIHN0ci50cmltKCkgOiBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csICcnKTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXMgPSBmYWxzZV1cbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbiwge2FsbE93bktleXMgPSBmYWxzZX0gPSB7fSkge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpO1xuICBsZXQgbDtcblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAoaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgY29uc3Qga2V5cyA9IGFsbE93bktleXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iaiwga2V5KSB7XG4gIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgbGV0IF9rZXk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgX2tleSA9IGtleXNbaV07XG4gICAgaWYgKGtleSA9PT0gX2tleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gX2tleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IF9nbG9iYWwgPSAoKCkgPT4ge1xuICAvKmVzbGludCBuby11bmRlZjowKi9cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZ2xvYmFsVGhpcztcbiAgcmV0dXJuIHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbClcbn0pKCk7XG5cbmNvbnN0IGlzQ29udGV4dERlZmluZWQgPSAoY29udGV4dCkgPT4gIWlzVW5kZWZpbmVkKGNvbnRleHQpICYmIGNvbnRleHQgIT09IF9nbG9iYWw7XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgY29uc3Qge2Nhc2VsZXNzfSA9IGlzQ29udGV4dERlZmluZWQodGhpcykgJiYgdGhpcyB8fCB7fTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGNvbnN0IGFzc2lnblZhbHVlID0gKHZhbCwga2V5KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gY2FzZWxlc3MgJiYgZmluZEtleShyZXN1bHQsIGtleSkgfHwga2V5O1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHJlc3VsdFt0YXJnZXRLZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2UocmVzdWx0W3RhcmdldEtleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGFyZ3VtZW50c1tpXSAmJiBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFthbGxPd25LZXlzXVxuICogQHJldHVybnMge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5jb25zdCBleHRlbmQgPSAoYSwgYiwgdGhpc0FyZywge2FsbE93bktleXN9PSB7fSkgPT4ge1xuICBmb3JFYWNoKGIsICh2YWwsIGtleSkgPT4ge1xuICAgIGlmICh0aGlzQXJnICYmIGlzRnVuY3Rpb24odmFsKSkge1xuICAgICAgYVtrZXldID0gYmluZCh2YWwsIHRoaXNBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhW2tleV0gPSB2YWw7XG4gICAgfVxuICB9LCB7YWxsT3duS2V5c30pO1xuICByZXR1cm4gYTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYnl0ZSBvcmRlciBtYXJrZXIuIFRoaXMgY2F0Y2hlcyBFRiBCQiBCRiAodGhlIFVURi04IEJPTSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCB3aXRoIEJPTVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGNvbnRlbnQgdmFsdWUgd2l0aG91dCBCT01cbiAqL1xuY29uc3Qgc3RyaXBCT00gPSAoY29udGVudCkgPT4ge1xuICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtvYmplY3R9IFtkZXNjcmlwdG9yc11cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgaW5oZXJpdHMgPSAoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IsIHByb3BzLCBkZXNjcmlwdG9ycykgPT4ge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RydWN0b3IsICdzdXBlcicsIHtcbiAgICB2YWx1ZTogc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGVcbiAgfSk7XG4gIHByb3BzICYmIE9iamVjdC5hc3NpZ24oY29uc3RydWN0b3IucHJvdG90eXBlLCBwcm9wcyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvYmplY3Qgd2l0aCBkZWVwIHByb3RvdHlwZSBjaGFpbiB0byBhIGZsYXQgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlT2JqIHNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGVzdE9ial1cbiAqIEBwYXJhbSB7RnVuY3Rpb258Qm9vbGVhbn0gW2ZpbHRlcl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wRmlsdGVyXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IHRvRmxhdE9iamVjdCA9IChzb3VyY2VPYmosIGRlc3RPYmosIGZpbHRlciwgcHJvcEZpbHRlcikgPT4ge1xuICBsZXQgcHJvcHM7XG4gIGxldCBpO1xuICBsZXQgcHJvcDtcbiAgY29uc3QgbWVyZ2VkID0ge307XG5cbiAgZGVzdE9iaiA9IGRlc3RPYmogfHwge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBpZiAoc291cmNlT2JqID09IG51bGwpIHJldHVybiBkZXN0T2JqO1xuXG4gIGRvIHtcbiAgICBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZU9iaik7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgaWYgKCghcHJvcEZpbHRlciB8fCBwcm9wRmlsdGVyKHByb3AsIHNvdXJjZU9iaiwgZGVzdE9iaikpICYmICFtZXJnZWRbcHJvcF0pIHtcbiAgICAgICAgZGVzdE9ialtwcm9wXSA9IHNvdXJjZU9ialtwcm9wXTtcbiAgICAgICAgbWVyZ2VkW3Byb3BdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlT2JqID0gZmlsdGVyICE9PSBmYWxzZSAmJiBnZXRQcm90b3R5cGVPZihzb3VyY2VPYmopO1xuICB9IHdoaWxlIChzb3VyY2VPYmogJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKHNvdXJjZU9iaiwgZGVzdE9iaikpICYmIHNvdXJjZU9iaiAhPT0gT2JqZWN0LnByb3RvdHlwZSk7XG5cbiAgcmV0dXJuIGRlc3RPYmo7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3RyaW5nIGVuZHMgd2l0aCB0aGUgY2hhcmFjdGVycyBvZiBhIHNwZWNpZmllZCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VhcmNoU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gW3Bvc2l0aW9uPSAwXVxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBlbmRzV2l0aCA9IChzdHIsIHNlYXJjaFN0cmluZywgcG9zaXRpb24pID0+IHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHBvc2l0aW9uID4gc3RyLmxlbmd0aCkge1xuICAgIHBvc2l0aW9uID0gc3RyLmxlbmd0aDtcbiAgfVxuICBwb3NpdGlvbiAtPSBzZWFyY2hTdHJpbmcubGVuZ3RoO1xuICBjb25zdCBsYXN0SW5kZXggPSBzdHIuaW5kZXhPZihzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKTtcbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gLTEgJiYgbGFzdEluZGV4ID09PSBwb3NpdGlvbjtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGZyb20gYXJyYXkgbGlrZSBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqXG4gKiBAcGFyYW0geyp9IFt0aGluZ11cbiAqXG4gKiBAcmV0dXJucyB7P0FycmF5fVxuICovXG5jb25zdCB0b0FycmF5ID0gKHRoaW5nKSA9PiB7XG4gIGlmICghdGhpbmcpIHJldHVybiBudWxsO1xuICBpZiAoaXNBcnJheSh0aGluZykpIHJldHVybiB0aGluZztcbiAgbGV0IGkgPSB0aGluZy5sZW5ndGg7XG4gIGlmICghaXNOdW1iZXIoaSkpIHJldHVybiBudWxsO1xuICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgYXJyW2ldID0gdGhpbmdbaV07XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLyoqXG4gKiBDaGVja2luZyBpZiB0aGUgVWludDhBcnJheSBleGlzdHMgYW5kIGlmIGl0IGRvZXMsIGl0IHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGVcbiAqIHRoaW5nIHBhc3NlZCBpbiBpcyBhbiBpbnN0YW5jZSBvZiBVaW50OEFycmF5XG4gKlxuICogQHBhcmFtIHtUeXBlZEFycmF5fVxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbmNvbnN0IGlzVHlwZWRBcnJheSA9IChUeXBlZEFycmF5ID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuIHRoaW5nID0+IHtcbiAgICByZXR1cm4gVHlwZWRBcnJheSAmJiB0aGluZyBpbnN0YW5jZW9mIFR5cGVkQXJyYXk7XG4gIH07XG59KSh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheSkpO1xuXG4vKipcbiAqIEZvciBlYWNoIGVudHJ5IGluIHRoZSBvYmplY3QsIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGtleSBhbmQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8YW55LCBhbnk+fSBvYmogLSBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW50cnkuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGZvckVhY2hFbnRyeSA9IChvYmosIGZuKSA9PiB7XG4gIGNvbnN0IGdlbmVyYXRvciA9IG9iaiAmJiBvYmpbU3ltYm9sLml0ZXJhdG9yXTtcblxuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvci5jYWxsKG9iaik7XG5cbiAgbGV0IHJlc3VsdDtcblxuICB3aGlsZSAoKHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKSkgJiYgIXJlc3VsdC5kb25lKSB7XG4gICAgY29uc3QgcGFpciA9IHJlc3VsdC52YWx1ZTtcbiAgICBmbi5jYWxsKG9iaiwgcGFpclswXSwgcGFpclsxXSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgYSBzdHJpbmcsIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgbWF0Y2hlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdFeHAgLSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBzZWFyY2guXG4gKlxuICogQHJldHVybnMge0FycmF5PGJvb2xlYW4+fVxuICovXG5jb25zdCBtYXRjaEFsbCA9IChyZWdFeHAsIHN0cikgPT4ge1xuICBsZXQgbWF0Y2hlcztcbiAgY29uc3QgYXJyID0gW107XG5cbiAgd2hpbGUgKChtYXRjaGVzID0gcmVnRXhwLmV4ZWMoc3RyKSkgIT09IG51bGwpIHtcbiAgICBhcnIucHVzaChtYXRjaGVzKTtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59XG5cbi8qIENoZWNraW5nIGlmIHRoZSBraW5kT2ZUZXN0IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhbiBIVE1MRm9ybUVsZW1lbnQuICovXG5jb25zdCBpc0hUTUxGb3JtID0ga2luZE9mVGVzdCgnSFRNTEZvcm1FbGVtZW50Jyk7XG5cbmNvbnN0IHRvQ2FtZWxDYXNlID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX1xcc10oW2EtelxcZF0pKFxcdyopL2csXG4gICAgZnVuY3Rpb24gcmVwbGFjZXIobSwgcDEsIHAyKSB7XG4gICAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKSArIHAyO1xuICAgIH1cbiAgKTtcbn07XG5cbi8qIENyZWF0aW5nIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBwcm9wZXJ0eS4gKi9cbmNvbnN0IGhhc093blByb3BlcnR5ID0gKCh7aGFzT3duUHJvcGVydHl9KSA9PiAob2JqLCBwcm9wKSA9PiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpKE9iamVjdC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNSZWdFeHAgPSBraW5kT2ZUZXN0KCdSZWdFeHAnKTtcblxuY29uc3QgcmVkdWNlRGVzY3JpcHRvcnMgPSAob2JqLCByZWR1Y2VyKSA9PiB7XG4gIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKTtcbiAgY29uc3QgcmVkdWNlZERlc2NyaXB0b3JzID0ge307XG5cbiAgZm9yRWFjaChkZXNjcmlwdG9ycywgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICBsZXQgcmV0O1xuICAgIGlmICgocmV0ID0gcmVkdWNlcihkZXNjcmlwdG9yLCBuYW1lLCBvYmopKSAhPT0gZmFsc2UpIHtcbiAgICAgIHJlZHVjZWREZXNjcmlwdG9yc1tuYW1lXSA9IHJldCB8fCBkZXNjcmlwdG9yO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqLCByZWR1Y2VkRGVzY3JpcHRvcnMpO1xufVxuXG4vKipcbiAqIE1ha2VzIGFsbCBtZXRob2RzIHJlYWQtb25seVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICovXG5cbmNvbnN0IGZyZWV6ZU1ldGhvZHMgPSAob2JqKSA9PiB7XG4gIHJlZHVjZURlc2NyaXB0b3JzKG9iaiwgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICAvLyBza2lwIHJlc3RyaWN0ZWQgcHJvcHMgaW4gc3RyaWN0IG1vZGVcbiAgICBpZiAoaXNGdW5jdGlvbihvYmopICYmIFsnYXJndW1lbnRzJywgJ2NhbGxlcicsICdjYWxsZWUnXS5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gb2JqW25hbWVdO1xuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7XG5cbiAgICBpZiAoJ3dyaXRhYmxlJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkZXNjcmlwdG9yLnNldCkge1xuICAgICAgZGVzY3JpcHRvci5zZXQgPSAoKSA9PiB7XG4gICAgICAgIHRocm93IEVycm9yKCdDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCBcXCcnICsgbmFtZSArICdcXCcnKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgdG9PYmplY3RTZXQgPSAoYXJyYXlPclN0cmluZywgZGVsaW1pdGVyKSA9PiB7XG4gIGNvbnN0IG9iaiA9IHt9O1xuXG4gIGNvbnN0IGRlZmluZSA9IChhcnIpID0+IHtcbiAgICBhcnIuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICBvYmpbdmFsdWVdID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQXJyYXkoYXJyYXlPclN0cmluZykgPyBkZWZpbmUoYXJyYXlPclN0cmluZykgOiBkZWZpbmUoU3RyaW5nKGFycmF5T3JTdHJpbmcpLnNwbGl0KGRlbGltaXRlcikpO1xuXG4gIHJldHVybiBvYmo7XG59XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuXG5jb25zdCB0b0Zpbml0ZU51bWJlciA9ICh2YWx1ZSwgZGVmYXVsdFZhbHVlKSA9PiB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSA9ICt2YWx1ZSkgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbn1cblxuY29uc3QgQUxQSEEgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonXG5cbmNvbnN0IERJR0lUID0gJzAxMjM0NTY3ODknO1xuXG5jb25zdCBBTFBIQUJFVCA9IHtcbiAgRElHSVQsXG4gIEFMUEhBLFxuICBBTFBIQV9ESUdJVDogQUxQSEEgKyBBTFBIQS50b1VwcGVyQ2FzZSgpICsgRElHSVRcbn1cblxuY29uc3QgZ2VuZXJhdGVTdHJpbmcgPSAoc2l6ZSA9IDE2LCBhbHBoYWJldCA9IEFMUEhBQkVULkFMUEhBX0RJR0lUKSA9PiB7XG4gIGxldCBzdHIgPSAnJztcbiAgY29uc3Qge2xlbmd0aH0gPSBhbHBoYWJldDtcbiAgd2hpbGUgKHNpemUtLSkge1xuICAgIHN0ciArPSBhbHBoYWJldFtNYXRoLnJhbmRvbSgpICogbGVuZ3RofDBdXG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIElmIHRoZSB0aGluZyBpcyBhIEZvcm1EYXRhIG9iamVjdCwgcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB0aGluZyAtIFRoZSB0aGluZyB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTcGVjQ29tcGxpYW50Rm9ybSh0aGluZykge1xuICByZXR1cm4gISEodGhpbmcgJiYgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIHRoaW5nW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdGb3JtRGF0YScgJiYgdGhpbmdbU3ltYm9sLml0ZXJhdG9yXSk7XG59XG5cbmNvbnN0IHRvSlNPTk9iamVjdCA9IChvYmopID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgQXJyYXkoMTApO1xuXG4gIGNvbnN0IHZpc2l0ID0gKHNvdXJjZSwgaSkgPT4ge1xuXG4gICAgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIGlmIChzdGFjay5pbmRleE9mKHNvdXJjZSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmKCEoJ3RvSlNPTicgaW4gc291cmNlKSkge1xuICAgICAgICBzdGFja1tpXSA9IHNvdXJjZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcblxuICAgICAgICBmb3JFYWNoKHNvdXJjZSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCByZWR1Y2VkVmFsdWUgPSB2aXNpdCh2YWx1ZSwgaSArIDEpO1xuICAgICAgICAgICFpc1VuZGVmaW5lZChyZWR1Y2VkVmFsdWUpICYmICh0YXJnZXRba2V5XSA9IHJlZHVjZWRWYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YWNrW2ldID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHJldHVybiB2aXNpdChvYmosIDApO1xufVxuXG5jb25zdCBpc0FzeW5jRm4gPSBraW5kT2ZUZXN0KCdBc3luY0Z1bmN0aW9uJyk7XG5cbmNvbnN0IGlzVGhlbmFibGUgPSAodGhpbmcpID0+XG4gIHRoaW5nICYmIChpc09iamVjdCh0aGluZykgfHwgaXNGdW5jdGlvbih0aGluZykpICYmIGlzRnVuY3Rpb24odGhpbmcudGhlbikgJiYgaXNGdW5jdGlvbih0aGluZy5jYXRjaCk7XG5cbi8vIG9yaWdpbmFsIGNvZGVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EaWdpdGFsQnJhaW5KUy9BeGlvc1Byb21pc2UvYmxvYi8xNmRlYWIxMzcxMGVjMDk3Nzk5MjIxMzFmM2ZhNTk1NDMyMGY4M2FiL2xpYi91dGlscy5qcyNMMTEtTDM0XG5cbmNvbnN0IF9zZXRJbW1lZGlhdGUgPSAoKHNldEltbWVkaWF0ZVN1cHBvcnRlZCwgcG9zdE1lc3NhZ2VTdXBwb3J0ZWQpID0+IHtcbiAgaWYgKHNldEltbWVkaWF0ZVN1cHBvcnRlZCkge1xuICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gIH1cblxuICByZXR1cm4gcG9zdE1lc3NhZ2VTdXBwb3J0ZWQgPyAoKHRva2VuLCBjYWxsYmFja3MpID0+IHtcbiAgICBfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsICh7c291cmNlLCBkYXRhfSkgPT4ge1xuICAgICAgaWYgKHNvdXJjZSA9PT0gX2dsb2JhbCAmJiBkYXRhID09PSB0b2tlbikge1xuICAgICAgICBjYWxsYmFja3MubGVuZ3RoICYmIGNhbGxiYWNrcy5zaGlmdCgpKCk7XG4gICAgICB9XG4gICAgfSwgZmFsc2UpO1xuXG4gICAgcmV0dXJuIChjYikgPT4ge1xuICAgICAgY2FsbGJhY2tzLnB1c2goY2IpO1xuICAgICAgX2dsb2JhbC5wb3N0TWVzc2FnZSh0b2tlbiwgXCIqXCIpO1xuICAgIH1cbiAgfSkoYGF4aW9zQCR7TWF0aC5yYW5kb20oKX1gLCBbXSkgOiAoY2IpID0+IHNldFRpbWVvdXQoY2IpO1xufSkoXG4gIHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicsXG4gIGlzRnVuY3Rpb24oX2dsb2JhbC5wb3N0TWVzc2FnZSlcbik7XG5cbmNvbnN0IGFzYXAgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgIT09ICd1bmRlZmluZWQnID9cbiAgcXVldWVNaWNyb3Rhc2suYmluZChfZ2xvYmFsKSA6ICggdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MubmV4dFRpY2sgfHwgX3NldEltbWVkaWF0ZSk7XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKlxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmcsXG4gIGlzTnVtYmVyLFxuICBpc0Jvb2xlYW4sXG4gIGlzT2JqZWN0LFxuICBpc1BsYWluT2JqZWN0LFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1JlcXVlc3QsXG4gIGlzUmVzcG9uc2UsXG4gIGlzSGVhZGVycyxcbiAgaXNVbmRlZmluZWQsXG4gIGlzRGF0ZSxcbiAgaXNGaWxlLFxuICBpc0Jsb2IsXG4gIGlzUmVnRXhwLFxuICBpc0Z1bmN0aW9uLFxuICBpc1N0cmVhbSxcbiAgaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzVHlwZWRBcnJheSxcbiAgaXNGaWxlTGlzdCxcbiAgZm9yRWFjaCxcbiAgbWVyZ2UsXG4gIGV4dGVuZCxcbiAgdHJpbSxcbiAgc3RyaXBCT00sXG4gIGluaGVyaXRzLFxuICB0b0ZsYXRPYmplY3QsXG4gIGtpbmRPZixcbiAga2luZE9mVGVzdCxcbiAgZW5kc1dpdGgsXG4gIHRvQXJyYXksXG4gIGZvckVhY2hFbnRyeSxcbiAgbWF0Y2hBbGwsXG4gIGlzSFRNTEZvcm0sXG4gIGhhc093blByb3BlcnR5LFxuICBoYXNPd25Qcm9wOiBoYXNPd25Qcm9wZXJ0eSwgLy8gYW4gYWxpYXMgdG8gYXZvaWQgRVNMaW50IG5vLXByb3RvdHlwZS1idWlsdGlucyBkZXRlY3Rpb25cbiAgcmVkdWNlRGVzY3JpcHRvcnMsXG4gIGZyZWV6ZU1ldGhvZHMsXG4gIHRvT2JqZWN0U2V0LFxuICB0b0NhbWVsQ2FzZSxcbiAgbm9vcCxcbiAgdG9GaW5pdGVOdW1iZXIsXG4gIGZpbmRLZXksXG4gIGdsb2JhbDogX2dsb2JhbCxcbiAgaXNDb250ZXh0RGVmaW5lZCxcbiAgQUxQSEFCRVQsXG4gIGdlbmVyYXRlU3RyaW5nLFxuICBpc1NwZWNDb21wbGlhbnRGb3JtLFxuICB0b0pTT05PYmplY3QsXG4gIGlzQXN5bmNGbixcbiAgaXNUaGVuYWJsZSxcbiAgc2V0SW1tZWRpYXRlOiBfc2V0SW1tZWRpYXRlLFxuICBhc2FwXG59O1xuIiwiZnVuY3Rpb24gcihlKXt2YXIgdCxmLG49XCJcIjtpZihcInN0cmluZ1wiPT10eXBlb2YgZXx8XCJudW1iZXJcIj09dHlwZW9mIGUpbis9ZTtlbHNlIGlmKFwib2JqZWN0XCI9PXR5cGVvZiBlKWlmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciBvPWUubGVuZ3RoO2Zvcih0PTA7dDxvO3QrKyllW3RdJiYoZj1yKGVbdF0pKSYmKG4mJihuKz1cIiBcIiksbis9Zil9ZWxzZSBmb3IoZiBpbiBlKWVbZl0mJihuJiYobis9XCIgXCIpLG4rPWYpO3JldHVybiBufWV4cG9ydCBmdW5jdGlvbiBjbHN4KCl7Zm9yKHZhciBlLHQsZj0wLG49XCJcIixvPWFyZ3VtZW50cy5sZW5ndGg7ZjxvO2YrKykoZT1hcmd1bWVudHNbZl0pJiYodD1yKGUpKSYmKG4mJihuKz1cIiBcIiksbis9dCk7cmV0dXJuIG59ZXhwb3J0IGRlZmF1bHQgY2xzeDsiLCJ2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZmluZChpdGVyLCB0YXIsIGtleSkge1xuXHRmb3IgKGtleSBvZiBpdGVyLmtleXMoKSkge1xuXHRcdGlmIChkZXF1YWwoa2V5LCB0YXIpKSByZXR1cm4ga2V5O1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXF1YWwoZm9vLCBiYXIpIHtcblx0dmFyIGN0b3IsIGxlbiwgdG1wO1xuXHRpZiAoZm9vID09PSBiYXIpIHJldHVybiB0cnVlO1xuXG5cdGlmIChmb28gJiYgYmFyICYmIChjdG9yPWZvby5jb25zdHJ1Y3RvcikgPT09IGJhci5jb25zdHJ1Y3Rvcikge1xuXHRcdGlmIChjdG9yID09PSBEYXRlKSByZXR1cm4gZm9vLmdldFRpbWUoKSA9PT0gYmFyLmdldFRpbWUoKTtcblx0XHRpZiAoY3RvciA9PT0gUmVnRXhwKSByZXR1cm4gZm9vLnRvU3RyaW5nKCkgPT09IGJhci50b1N0cmluZygpO1xuXG5cdFx0aWYgKGN0b3IgPT09IEFycmF5KSB7XG5cdFx0XHRpZiAoKGxlbj1mb28ubGVuZ3RoKSA9PT0gYmFyLmxlbmd0aCkge1xuXHRcdFx0XHR3aGlsZSAobGVuLS0gJiYgZGVxdWFsKGZvb1tsZW5dLCBiYXJbbGVuXSkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGxlbiA9PT0gLTE7XG5cdFx0fVxuXG5cdFx0aWYgKGN0b3IgPT09IFNldCkge1xuXHRcdFx0aWYgKGZvby5zaXplICE9PSBiYXIuc2l6ZSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGxlbiBvZiBmb28pIHtcblx0XHRcdFx0dG1wID0gbGVuO1xuXHRcdFx0XHRpZiAodG1wICYmIHR5cGVvZiB0bXAgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdFx0dG1wID0gZmluZChiYXIsIHRtcCk7XG5cdFx0XHRcdFx0aWYgKCF0bXApIHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIWJhci5oYXModG1wKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGN0b3IgPT09IE1hcCkge1xuXHRcdFx0aWYgKGZvby5zaXplICE9PSBiYXIuc2l6ZSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGxlbiBvZiBmb28pIHtcblx0XHRcdFx0dG1wID0gbGVuWzBdO1xuXHRcdFx0XHRpZiAodG1wICYmIHR5cGVvZiB0bXAgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdFx0dG1wID0gZmluZChiYXIsIHRtcCk7XG5cdFx0XHRcdFx0aWYgKCF0bXApIHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIWRlcXVhbChsZW5bMV0sIGJhci5nZXQodG1wKSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChjdG9yID09PSBBcnJheUJ1ZmZlcikge1xuXHRcdFx0Zm9vID0gbmV3IFVpbnQ4QXJyYXkoZm9vKTtcblx0XHRcdGJhciA9IG5ldyBVaW50OEFycmF5KGJhcik7XG5cdFx0fSBlbHNlIGlmIChjdG9yID09PSBEYXRhVmlldykge1xuXHRcdFx0aWYgKChsZW49Zm9vLmJ5dGVMZW5ndGgpID09PSBiYXIuYnl0ZUxlbmd0aCkge1xuXHRcdFx0XHR3aGlsZSAobGVuLS0gJiYgZm9vLmdldEludDgobGVuKSA9PT0gYmFyLmdldEludDgobGVuKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbGVuID09PSAtMTtcblx0XHR9XG5cblx0XHRpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGZvbykpIHtcblx0XHRcdGlmICgobGVuPWZvby5ieXRlTGVuZ3RoKSA9PT0gYmFyLmJ5dGVMZW5ndGgpIHtcblx0XHRcdFx0d2hpbGUgKGxlbi0tICYmIGZvb1tsZW5dID09PSBiYXJbbGVuXSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbGVuID09PSAtMTtcblx0XHR9XG5cblx0XHRpZiAoIWN0b3IgfHwgdHlwZW9mIGZvbyA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGxlbiA9IDA7XG5cdFx0XHRmb3IgKGN0b3IgaW4gZm9vKSB7XG5cdFx0XHRcdGlmIChoYXMuY2FsbChmb28sIGN0b3IpICYmICsrbGVuICYmICFoYXMuY2FsbChiYXIsIGN0b3IpKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdGlmICghKGN0b3IgaW4gYmFyKSB8fCAhZGVxdWFsKGZvb1tjdG9yXSwgYmFyW2N0b3JdKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIE9iamVjdC5rZXlzKGJhcikubGVuZ3RoID09PSBsZW47XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZvbyAhPT0gZm9vICYmIGJhciAhPT0gYmFyO1xufVxuIiwiaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnQHJlYWN0LWRuZC9pbnZhcmlhbnQnO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuLi8uLi91dGlscy9qc191dGlscy5qcyc7XG5pbXBvcnQgeyBzZXRDbGllbnRPZmZzZXQgfSBmcm9tICcuL2xvY2FsL3NldENsaWVudE9mZnNldC5qcyc7XG5pbXBvcnQgeyBCRUdJTl9EUkFHLCBJTklUX0NPT1JEUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuY29uc3QgUmVzZXRDb29yZGluYXRlc0FjdGlvbiA9IHtcbiAgICB0eXBlOiBJTklUX0NPT1JEUyxcbiAgICBwYXlsb2FkOiB7XG4gICAgICAgIGNsaWVudE9mZnNldDogbnVsbCxcbiAgICAgICAgc291cmNlQ2xpZW50T2Zmc2V0OiBudWxsXG4gICAgfVxufTtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCZWdpbkRyYWcobWFuYWdlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiBiZWdpbkRyYWcoc291cmNlSWRzID0gW10sIG9wdGlvbnMgPSB7XG4gICAgICAgIHB1Ymxpc2hTb3VyY2U6IHRydWVcbiAgICB9KSB7XG4gICAgICAgIGNvbnN0IHsgcHVibGlzaFNvdXJjZSA9dHJ1ZSAsIGNsaWVudE9mZnNldCAsIGdldFNvdXJjZUNsaWVudE9mZnNldCAsICB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvcigpO1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IG1hbmFnZXIuZ2V0UmVnaXN0cnkoKTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29vcmRpbmF0ZXMgdXNpbmcgdGhlIGNsaWVudCBvZmZzZXRcbiAgICAgICAgbWFuYWdlci5kaXNwYXRjaChzZXRDbGllbnRPZmZzZXQoY2xpZW50T2Zmc2V0KSk7XG4gICAgICAgIHZlcmlmeUludmFyaWFudHMoc291cmNlSWRzLCBtb25pdG9yLCByZWdpc3RyeSk7XG4gICAgICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIHNvdXJjZVxuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IGdldERyYWdnYWJsZVNvdXJjZShzb3VyY2VJZHMsIG1vbml0b3IpO1xuICAgICAgICBpZiAoc291cmNlSWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgbWFuYWdlci5kaXNwYXRjaChSZXNldENvb3JkaW5hdGVzQWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBjbGllbnQgb2Zmc2V0XG4gICAgICAgIGxldCBzb3VyY2VDbGllbnRPZmZzZXQgPSBudWxsO1xuICAgICAgICBpZiAoY2xpZW50T2Zmc2V0KSB7XG4gICAgICAgICAgICBpZiAoIWdldFNvdXJjZUNsaWVudE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0U291cmNlQ2xpZW50T2Zmc2V0IG11c3QgYmUgZGVmaW5lZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmVyaWZ5R2V0U291cmNlQ2xpZW50T2Zmc2V0SXNGdW5jdGlvbihnZXRTb3VyY2VDbGllbnRPZmZzZXQpO1xuICAgICAgICAgICAgc291cmNlQ2xpZW50T2Zmc2V0ID0gZ2V0U291cmNlQ2xpZW50T2Zmc2V0KHNvdXJjZUlkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBmdWxsIGNvb3JkaW5hdGVzXG4gICAgICAgIG1hbmFnZXIuZGlzcGF0Y2goc2V0Q2xpZW50T2Zmc2V0KGNsaWVudE9mZnNldCwgc291cmNlQ2xpZW50T2Zmc2V0KSk7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHJlZ2lzdHJ5LmdldFNvdXJjZShzb3VyY2VJZCk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBzb3VyY2UuYmVnaW5EcmFnKG1vbml0b3IsIHNvdXJjZUlkKTtcbiAgICAgICAgLy8gSWYgc291cmNlLmJlZ2luRHJhZyByZXR1cm5zIG51bGwsIHRoaXMgaXMgYW4gaW5kaWNhdG9yIHRvIGNhbmNlbCB0aGUgZHJhZ1xuICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZlcmlmeUl0ZW1Jc09iamVjdChpdGVtKTtcbiAgICAgICAgcmVnaXN0cnkucGluU291cmNlKHNvdXJjZUlkKTtcbiAgICAgICAgY29uc3QgaXRlbVR5cGUgPSByZWdpc3RyeS5nZXRTb3VyY2VUeXBlKHNvdXJjZUlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IEJFR0lOX0RSQUcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUsXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXQ6IGNsaWVudE9mZnNldCB8fCBudWxsLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNsaWVudE9mZnNldDogc291cmNlQ2xpZW50T2Zmc2V0IHx8IG51bGwsXG4gICAgICAgICAgICAgICAgaXNTb3VyY2VQdWJsaWM6ICEhcHVibGlzaFNvdXJjZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG59XG5mdW5jdGlvbiB2ZXJpZnlJbnZhcmlhbnRzKHNvdXJjZUlkcywgbW9uaXRvciwgcmVnaXN0cnkpIHtcbiAgICBpbnZhcmlhbnQoIW1vbml0b3IuaXNEcmFnZ2luZygpLCAnQ2Fubm90IGNhbGwgYmVnaW5EcmFnIHdoaWxlIGRyYWdnaW5nLicpO1xuICAgIHNvdXJjZUlkcy5mb3JFYWNoKGZ1bmN0aW9uKHNvdXJjZUlkKSB7XG4gICAgICAgIGludmFyaWFudChyZWdpc3RyeS5nZXRTb3VyY2Uoc291cmNlSWQpLCAnRXhwZWN0ZWQgc291cmNlSWRzIHRvIGJlIHJlZ2lzdGVyZWQuJyk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiB2ZXJpZnlHZXRTb3VyY2VDbGllbnRPZmZzZXRJc0Z1bmN0aW9uKGdldFNvdXJjZUNsaWVudE9mZnNldCkge1xuICAgIGludmFyaWFudCh0eXBlb2YgZ2V0U291cmNlQ2xpZW50T2Zmc2V0ID09PSAnZnVuY3Rpb24nLCAnV2hlbiBjbGllbnRPZmZzZXQgaXMgcHJvdmlkZWQsIGdldFNvdXJjZUNsaWVudE9mZnNldCBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG59XG5mdW5jdGlvbiB2ZXJpZnlJdGVtSXNPYmplY3QoaXRlbSkge1xuICAgIGludmFyaWFudChpc09iamVjdChpdGVtKSwgJ0l0ZW0gbXVzdCBiZSBhbiBvYmplY3QuJyk7XG59XG5mdW5jdGlvbiBnZXREcmFnZ2FibGVTb3VyY2Uoc291cmNlSWRzLCBtb25pdG9yKSB7XG4gICAgbGV0IHNvdXJjZUlkID0gbnVsbDtcbiAgICBmb3IobGV0IGkgPSBzb3VyY2VJZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuICAgICAgICBpZiAobW9uaXRvci5jYW5EcmFnU291cmNlKHNvdXJjZUlkc1tpXSkpIHtcbiAgICAgICAgICAgIHNvdXJjZUlkID0gc291cmNlSWRzW2ldO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZUlkO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1iZWdpbkRyYWcuanMubWFwIiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICAgICAgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uKHN5bSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0ByZWFjdC1kbmQvaW52YXJpYW50JztcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvanNfdXRpbHMuanMnO1xuaW1wb3J0IHsgRFJPUCB9IGZyb20gJy4vdHlwZXMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURyb3AobWFuYWdlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiBkcm9wKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yKCk7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gbWFuYWdlci5nZXRSZWdpc3RyeSgpO1xuICAgICAgICB2ZXJpZnlJbnZhcmlhbnRzKG1vbml0b3IpO1xuICAgICAgICBjb25zdCB0YXJnZXRJZHMgPSBnZXREcm9wcGFibGVUYXJnZXRzKG1vbml0b3IpO1xuICAgICAgICAvLyBNdWx0aXBsZSBhY3Rpb25zIGFyZSBkaXNwYXRjaGVkIGhlcmUsIHdoaWNoIGlzIHdoeSB0aGlzIGRvZXNuJ3QgcmV0dXJuIGFuIGFjdGlvblxuICAgICAgICB0YXJnZXRJZHMuZm9yRWFjaCgodGFyZ2V0SWQsIGluZGV4KT0+e1xuICAgICAgICAgICAgY29uc3QgZHJvcFJlc3VsdCA9IGRldGVybWluZURyb3BSZXN1bHQodGFyZ2V0SWQsIGluZGV4LCByZWdpc3RyeSwgbW9uaXRvcik7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogRFJPUCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgIGRyb3BSZXN1bHQ6IF9vYmplY3RTcHJlYWQoe30sIG9wdGlvbnMsIGRyb3BSZXN1bHQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1hbmFnZXIuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHZlcmlmeUludmFyaWFudHMobW9uaXRvcikge1xuICAgIGludmFyaWFudChtb25pdG9yLmlzRHJhZ2dpbmcoKSwgJ0Nhbm5vdCBjYWxsIGRyb3Agd2hpbGUgbm90IGRyYWdnaW5nLicpO1xuICAgIGludmFyaWFudCghbW9uaXRvci5kaWREcm9wKCksICdDYW5ub3QgY2FsbCBkcm9wIHR3aWNlIGR1cmluZyBvbmUgZHJhZyBvcGVyYXRpb24uJyk7XG59XG5mdW5jdGlvbiBkZXRlcm1pbmVEcm9wUmVzdWx0KHRhcmdldElkLCBpbmRleCwgcmVnaXN0cnksIG1vbml0b3IpIHtcbiAgICBjb25zdCB0YXJnZXQgPSByZWdpc3RyeS5nZXRUYXJnZXQodGFyZ2V0SWQpO1xuICAgIGxldCBkcm9wUmVzdWx0ID0gdGFyZ2V0ID8gdGFyZ2V0LmRyb3AobW9uaXRvciwgdGFyZ2V0SWQpIDogdW5kZWZpbmVkO1xuICAgIHZlcmlmeURyb3BSZXN1bHRUeXBlKGRyb3BSZXN1bHQpO1xuICAgIGlmICh0eXBlb2YgZHJvcFJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZHJvcFJlc3VsdCA9IGluZGV4ID09PSAwID8ge30gOiBtb25pdG9yLmdldERyb3BSZXN1bHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRyb3BSZXN1bHQ7XG59XG5mdW5jdGlvbiB2ZXJpZnlEcm9wUmVzdWx0VHlwZShkcm9wUmVzdWx0KSB7XG4gICAgaW52YXJpYW50KHR5cGVvZiBkcm9wUmVzdWx0ID09PSAndW5kZWZpbmVkJyB8fCBpc09iamVjdChkcm9wUmVzdWx0KSwgJ0Ryb3AgcmVzdWx0IG11c3QgZWl0aGVyIGJlIGFuIG9iamVjdCBvciB1bmRlZmluZWQuJyk7XG59XG5mdW5jdGlvbiBnZXREcm9wcGFibGVUYXJnZXRzKG1vbml0b3IpIHtcbiAgICBjb25zdCB0YXJnZXRJZHMgPSBtb25pdG9yLmdldFRhcmdldElkcygpLmZpbHRlcihtb25pdG9yLmNhbkRyb3BPblRhcmdldCwgbW9uaXRvcik7XG4gICAgdGFyZ2V0SWRzLnJldmVyc2UoKTtcbiAgICByZXR1cm4gdGFyZ2V0SWRzO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kcm9wLmpzLm1hcCIsImltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0ByZWFjdC1kbmQvaW52YXJpYW50JztcbmltcG9ydCB7IEVORF9EUkFHIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW5kRHJhZyhtYW5hZ2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGVuZERyYWcoKSB7XG4gICAgICAgIGNvbnN0IG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3IoKTtcbiAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBtYW5hZ2VyLmdldFJlZ2lzdHJ5KCk7XG4gICAgICAgIHZlcmlmeUlzRHJhZ2dpbmcobW9uaXRvcik7XG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gbW9uaXRvci5nZXRTb3VyY2VJZCgpO1xuICAgICAgICBpZiAoc291cmNlSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gcmVnaXN0cnkuZ2V0U291cmNlKHNvdXJjZUlkLCB0cnVlKTtcbiAgICAgICAgICAgIHNvdXJjZS5lbmREcmFnKG1vbml0b3IsIHNvdXJjZUlkKTtcbiAgICAgICAgICAgIHJlZ2lzdHJ5LnVucGluU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IEVORF9EUkFHXG4gICAgICAgIH07XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHZlcmlmeUlzRHJhZ2dpbmcobW9uaXRvcikge1xuICAgIGludmFyaWFudChtb25pdG9yLmlzRHJhZ2dpbmcoKSwgJ0Nhbm5vdCBjYWxsIGVuZERyYWcgd2hpbGUgbm90IGRyYWdnaW5nLicpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbmREcmFnLmpzLm1hcCIsImltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0ByZWFjdC1kbmQvaW52YXJpYW50JztcbmltcG9ydCB7IG1hdGNoZXNUeXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvbWF0Y2hlc1R5cGUuanMnO1xuaW1wb3J0IHsgSE9WRVIgfSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIb3ZlcihtYW5hZ2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGhvdmVyKHRhcmdldElkc0FyZywgeyBjbGllbnRPZmZzZXQgIH0gPSB7fSkge1xuICAgICAgICB2ZXJpZnlUYXJnZXRJZHNJc0FycmF5KHRhcmdldElkc0FyZyk7XG4gICAgICAgIGNvbnN0IHRhcmdldElkcyA9IHRhcmdldElkc0FyZy5zbGljZSgwKTtcbiAgICAgICAgY29uc3QgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvcigpO1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IG1hbmFnZXIuZ2V0UmVnaXN0cnkoKTtcbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW1UeXBlID0gbW9uaXRvci5nZXRJdGVtVHlwZSgpO1xuICAgICAgICByZW1vdmVOb25NYXRjaGluZ1RhcmdldElkcyh0YXJnZXRJZHMsIHJlZ2lzdHJ5LCBkcmFnZ2VkSXRlbVR5cGUpO1xuICAgICAgICBjaGVja0ludmFyaWFudHModGFyZ2V0SWRzLCBtb25pdG9yLCByZWdpc3RyeSk7XG4gICAgICAgIGhvdmVyQWxsVGFyZ2V0cyh0YXJnZXRJZHMsIG1vbml0b3IsIHJlZ2lzdHJ5KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IEhPVkVSLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIHRhcmdldElkcyxcbiAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXQ6IGNsaWVudE9mZnNldCB8fCBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHZlcmlmeVRhcmdldElkc0lzQXJyYXkodGFyZ2V0SWRzQXJnKSB7XG4gICAgaW52YXJpYW50KEFycmF5LmlzQXJyYXkodGFyZ2V0SWRzQXJnKSwgJ0V4cGVjdGVkIHRhcmdldElkcyB0byBiZSBhbiBhcnJheS4nKTtcbn1cbmZ1bmN0aW9uIGNoZWNrSW52YXJpYW50cyh0YXJnZXRJZHMsIG1vbml0b3IsIHJlZ2lzdHJ5KSB7XG4gICAgaW52YXJpYW50KG1vbml0b3IuaXNEcmFnZ2luZygpLCAnQ2Fubm90IGNhbGwgaG92ZXIgd2hpbGUgbm90IGRyYWdnaW5nLicpO1xuICAgIGludmFyaWFudCghbW9uaXRvci5kaWREcm9wKCksICdDYW5ub3QgY2FsbCBob3ZlciBhZnRlciBkcm9wLicpO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0YXJnZXRJZHMubGVuZ3RoOyBpKyspe1xuICAgICAgICBjb25zdCB0YXJnZXRJZCA9IHRhcmdldElkc1tpXTtcbiAgICAgICAgaW52YXJpYW50KHRhcmdldElkcy5sYXN0SW5kZXhPZih0YXJnZXRJZCkgPT09IGksICdFeHBlY3RlZCB0YXJnZXRJZHMgdG8gYmUgdW5pcXVlIGluIHRoZSBwYXNzZWQgYXJyYXkuJyk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHJlZ2lzdHJ5LmdldFRhcmdldCh0YXJnZXRJZCk7XG4gICAgICAgIGludmFyaWFudCh0YXJnZXQsICdFeHBlY3RlZCB0YXJnZXRJZHMgdG8gYmUgcmVnaXN0ZXJlZC4nKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW1vdmVOb25NYXRjaGluZ1RhcmdldElkcyh0YXJnZXRJZHMsIHJlZ2lzdHJ5LCBkcmFnZ2VkSXRlbVR5cGUpIHtcbiAgICAvLyBSZW1vdmUgdGhvc2UgdGFyZ2V0SWRzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIHRhcmdldFR5cGUuICBUaGlzXG4gICAgLy8gZml4ZXMgc2hhbGxvdyBpc092ZXIgd2hpY2ggd291bGQgb25seSBiZSBub24tc2hhbGxvdyBiZWNhdXNlIG9mXG4gICAgLy8gbm9uLW1hdGNoaW5nIHRhcmdldHMuXG4gICAgZm9yKGxldCBpID0gdGFyZ2V0SWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcbiAgICAgICAgY29uc3QgdGFyZ2V0SWQgPSB0YXJnZXRJZHNbaV07XG4gICAgICAgIGNvbnN0IHRhcmdldFR5cGUgPSByZWdpc3RyeS5nZXRUYXJnZXRUeXBlKHRhcmdldElkKTtcbiAgICAgICAgaWYgKCFtYXRjaGVzVHlwZSh0YXJnZXRUeXBlLCBkcmFnZ2VkSXRlbVR5cGUpKSB7XG4gICAgICAgICAgICB0YXJnZXRJZHMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaG92ZXJBbGxUYXJnZXRzKHRhcmdldElkcywgbW9uaXRvciwgcmVnaXN0cnkpIHtcbiAgICAvLyBGaW5hbGx5IGNhbGwgaG92ZXIgb24gYWxsIG1hdGNoaW5nIHRhcmdldHMuXG4gICAgdGFyZ2V0SWRzLmZvckVhY2goZnVuY3Rpb24odGFyZ2V0SWQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcmVnaXN0cnkuZ2V0VGFyZ2V0KHRhcmdldElkKTtcbiAgICAgICAgdGFyZ2V0LmhvdmVyKG1vbml0b3IsIHRhcmdldElkKTtcbiAgICB9KTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aG92ZXIuanMubWFwIiwiaW1wb3J0IHsgY3JlYXRlQmVnaW5EcmFnIH0gZnJvbSAnLi9iZWdpbkRyYWcuanMnO1xuaW1wb3J0IHsgY3JlYXRlRHJvcCB9IGZyb20gJy4vZHJvcC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVFbmREcmFnIH0gZnJvbSAnLi9lbmREcmFnLmpzJztcbmltcG9ydCB7IGNyZWF0ZUhvdmVyIH0gZnJvbSAnLi9ob3Zlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQdWJsaXNoRHJhZ1NvdXJjZSB9IGZyb20gJy4vcHVibGlzaERyYWdTb3VyY2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRHJhZ0Ryb3BBY3Rpb25zKG1hbmFnZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBiZWdpbkRyYWc6IGNyZWF0ZUJlZ2luRHJhZyhtYW5hZ2VyKSxcbiAgICAgICAgcHVibGlzaERyYWdTb3VyY2U6IGNyZWF0ZVB1Ymxpc2hEcmFnU291cmNlKG1hbmFnZXIpLFxuICAgICAgICBob3ZlcjogY3JlYXRlSG92ZXIobWFuYWdlciksXG4gICAgICAgIGRyb3A6IGNyZWF0ZURyb3AobWFuYWdlciksXG4gICAgICAgIGVuZERyYWc6IGNyZWF0ZUVuZERyYWcobWFuYWdlcilcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBJTklUX0NPT1JEUyB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBzZXRDbGllbnRPZmZzZXQoY2xpZW50T2Zmc2V0LCBzb3VyY2VDbGllbnRPZmZzZXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBJTklUX0NPT1JEUyxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgc291cmNlQ2xpZW50T2Zmc2V0OiBzb3VyY2VDbGllbnRPZmZzZXQgfHwgbnVsbCxcbiAgICAgICAgICAgIGNsaWVudE9mZnNldDogY2xpZW50T2Zmc2V0IHx8IG51bGxcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNldENsaWVudE9mZnNldC5qcy5tYXAiLCJpbXBvcnQgeyBQVUJMSVNIX0RSQUdfU09VUkNFIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHVibGlzaERyYWdTb3VyY2UobWFuYWdlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiBwdWJsaXNoRHJhZ1NvdXJjZSgpIHtcbiAgICAgICAgY29uc3QgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvcigpO1xuICAgICAgICBpZiAobW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogUFVCTElTSF9EUkFHX1NPVVJDRVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVibGlzaERyYWdTb3VyY2UuanMubWFwIiwiZXhwb3J0IGNvbnN0IElOSVRfQ09PUkRTID0gJ2RuZC1jb3JlL0lOSVRfQ09PUkRTJztcbmV4cG9ydCBjb25zdCBCRUdJTl9EUkFHID0gJ2RuZC1jb3JlL0JFR0lOX0RSQUcnO1xuZXhwb3J0IGNvbnN0IFBVQkxJU0hfRFJBR19TT1VSQ0UgPSAnZG5kLWNvcmUvUFVCTElTSF9EUkFHX1NPVVJDRSc7XG5leHBvcnQgY29uc3QgSE9WRVIgPSAnZG5kLWNvcmUvSE9WRVInO1xuZXhwb3J0IGNvbnN0IERST1AgPSAnZG5kLWNvcmUvRFJPUCc7XG5leHBvcnQgY29uc3QgRU5EX0RSQUcgPSAnZG5kLWNvcmUvRU5EX0RSQUcnO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCJleHBvcnQgY29uc3QgQUREX1NPVVJDRSA9ICdkbmQtY29yZS9BRERfU09VUkNFJztcbmV4cG9ydCBjb25zdCBBRERfVEFSR0VUID0gJ2RuZC1jb3JlL0FERF9UQVJHRVQnO1xuZXhwb3J0IGNvbnN0IFJFTU9WRV9TT1VSQ0UgPSAnZG5kLWNvcmUvUkVNT1ZFX1NPVVJDRSc7XG5leHBvcnQgY29uc3QgUkVNT1ZFX1RBUkdFVCA9ICdkbmQtY29yZS9SRU1PVkVfVEFSR0VUJztcbmV4cG9ydCBmdW5jdGlvbiBhZGRTb3VyY2Uoc291cmNlSWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBBRERfU09VUkNFLFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBzb3VyY2VJZFxuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhZGRUYXJnZXQodGFyZ2V0SWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBBRERfVEFSR0VULFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICB0YXJnZXRJZFxuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTb3VyY2Uoc291cmNlSWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBSRU1PVkVfU09VUkNFLFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBzb3VyY2VJZFxuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVUYXJnZXQodGFyZ2V0SWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBSRU1PVkVfVEFSR0VULFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICB0YXJnZXRJZFxuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVnaXN0cnkuanMubWFwIiwiaW1wb3J0IHsgY3JlYXRlRHJhZ0Ryb3BBY3Rpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9kcmFnRHJvcC9pbmRleC5qcyc7XG5leHBvcnQgY2xhc3MgRHJhZ0Ryb3BNYW5hZ2VySW1wbCB7XG4gICAgcmVjZWl2ZUJhY2tlbmQoYmFja2VuZCkge1xuICAgICAgICB0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xuICAgIH1cbiAgICBnZXRNb25pdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb25pdG9yO1xuICAgIH1cbiAgICBnZXRCYWNrZW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYWNrZW5kO1xuICAgIH1cbiAgICBnZXRSZWdpc3RyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9uaXRvci5yZWdpc3RyeTtcbiAgICB9XG4gICAgZ2V0QWN0aW9ucygpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzICovIGNvbnN0IG1hbmFnZXIgPSB0aGlzO1xuICAgICAgICBjb25zdCB7IGRpc3BhdGNoICB9ID0gdGhpcy5zdG9yZTtcbiAgICAgICAgZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvbkNyZWF0b3IuYXBwbHkobWFuYWdlciwgYXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGFjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3Rpb25zID0gY3JlYXRlRHJhZ0Ryb3BBY3Rpb25zKHRoaXMpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYWN0aW9ucykucmVkdWNlKChib3VuZEFjdGlvbnMsIGtleSk9PntcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvbnNba2V5XTtcbiAgICAgICAgICAgIGJvdW5kQWN0aW9uc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBib3VuZEFjdGlvbnM7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG4gICAgZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc3RvcmUsIG1vbml0b3Ipe1xuICAgICAgICB0aGlzLmlzU2V0VXAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYW5kbGVSZWZDb3VudENoYW5nZSA9ICgpPT57XG4gICAgICAgICAgICBjb25zdCBzaG91bGRTZXRVcCA9IHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5yZWZDb3VudCA+IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5iYWNrZW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFNldFVwICYmICF0aGlzLmlzU2V0VXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kLnNldHVwKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZXRVcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc2hvdWxkU2V0VXAgJiYgdGhpcy5pc1NldFVwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja2VuZC50ZWFyZG93bigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2V0VXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTtcbiAgICAgICAgdGhpcy5tb25pdG9yID0gbW9uaXRvcjtcbiAgICAgICAgc3RvcmUuc3Vic2NyaWJlKHRoaXMuaGFuZGxlUmVmQ291bnRDaGFuZ2UpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RHJhZ0Ryb3BNYW5hZ2VySW1wbC5qcy5tYXAiLCJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAcmVhY3QtZG5kL2ludmFyaWFudCc7XG5pbXBvcnQgeyBnZXREaWZmZXJlbmNlRnJvbUluaXRpYWxPZmZzZXQsIGdldFNvdXJjZUNsaWVudE9mZnNldCB9IGZyb20gJy4uL3V0aWxzL2Nvb3Jkcy5qcyc7XG5pbXBvcnQgeyBhcmVEaXJ0eSB9IGZyb20gJy4uL3V0aWxzL2RpcnRpbmVzcy5qcyc7XG5pbXBvcnQgeyBtYXRjaGVzVHlwZSB9IGZyb20gJy4uL3V0aWxzL21hdGNoZXNUeXBlLmpzJztcbmV4cG9ydCBjbGFzcyBEcmFnRHJvcE1vbml0b3JJbXBsIHtcbiAgICBzdWJzY3JpYmVUb1N0YXRlQ2hhbmdlKGxpc3RlbmVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBoYW5kbGVySWRzICB9ID0gb3B0aW9ucztcbiAgICAgICAgaW52YXJpYW50KHR5cGVvZiBsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJywgJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICAgICAgaW52YXJpYW50KHR5cGVvZiBoYW5kbGVySWRzID09PSAndW5kZWZpbmVkJyB8fCBBcnJheS5pc0FycmF5KGhhbmRsZXJJZHMpLCAnaGFuZGxlcklkcywgd2hlbiBzcGVjaWZpZWQsIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncy4nKTtcbiAgICAgICAgbGV0IHByZXZTdGF0ZUlkID0gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLnN0YXRlSWQ7XG4gICAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICgpPT57XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZUlkID0gc3RhdGUuc3RhdGVJZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FuU2tpcExpc3RlbmVyID0gY3VycmVudFN0YXRlSWQgPT09IHByZXZTdGF0ZUlkIHx8IGN1cnJlbnRTdGF0ZUlkID09PSBwcmV2U3RhdGVJZCArIDEgJiYgIWFyZURpcnR5KHN0YXRlLmRpcnR5SGFuZGxlcklkcywgaGFuZGxlcklkcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5Ta2lwTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHl7XG4gICAgICAgICAgICAgICAgcHJldlN0YXRlSWQgPSBjdXJyZW50U3RhdGVJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICAgIHN1YnNjcmliZVRvT2Zmc2V0Q2hhbmdlKGxpc3RlbmVyKSB7XG4gICAgICAgIGludmFyaWFudCh0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicsICdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgICAgIGxldCBwcmV2aW91c1N0YXRlID0gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPZmZzZXQ7XG4gICAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICgpPT57XG4gICAgICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldDtcbiAgICAgICAgICAgIGlmIChuZXh0U3RhdGUgPT09IHByZXZpb3VzU3RhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2aW91c1N0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgICAgICAgbGlzdGVuZXIoKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICAgIGNhbkRyYWdTb3VyY2Uoc291cmNlSWQpIHtcbiAgICAgICAgaWYgKCFzb3VyY2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMucmVnaXN0cnkuZ2V0U291cmNlKHNvdXJjZUlkKTtcbiAgICAgICAgaW52YXJpYW50KHNvdXJjZSwgYEV4cGVjdGVkIHRvIGZpbmQgYSB2YWxpZCBzb3VyY2UuIHNvdXJjZUlkPSR7c291cmNlSWR9YCk7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2UuY2FuRHJhZyh0aGlzLCBzb3VyY2VJZCk7XG4gICAgfVxuICAgIGNhbkRyb3BPblRhcmdldCh0YXJnZXRJZCkge1xuICAgICAgICAvLyB1bmRlZmluZWQgb24gaW5pdGlhbCByZW5kZXJcbiAgICAgICAgaWYgKCF0YXJnZXRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVnaXN0cnkuZ2V0VGFyZ2V0KHRhcmdldElkKTtcbiAgICAgICAgaW52YXJpYW50KHRhcmdldCwgYEV4cGVjdGVkIHRvIGZpbmQgYSB2YWxpZCB0YXJnZXQuIHRhcmdldElkPSR7dGFyZ2V0SWR9YCk7XG4gICAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKCkgfHwgdGhpcy5kaWREcm9wKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXRUeXBlID0gdGhpcy5yZWdpc3RyeS5nZXRUYXJnZXRUeXBlKHRhcmdldElkKTtcbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW1UeXBlID0gdGhpcy5nZXRJdGVtVHlwZSgpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1R5cGUodGFyZ2V0VHlwZSwgZHJhZ2dlZEl0ZW1UeXBlKSAmJiB0YXJnZXQuY2FuRHJvcCh0aGlzLCB0YXJnZXRJZCk7XG4gICAgfVxuICAgIGlzRHJhZ2dpbmcoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZ2V0SXRlbVR5cGUoKSk7XG4gICAgfVxuICAgIGlzRHJhZ2dpbmdTb3VyY2Uoc291cmNlSWQpIHtcbiAgICAgICAgLy8gdW5kZWZpbmVkIG9uIGluaXRpYWwgcmVuZGVyXG4gICAgICAgIGlmICghc291cmNlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlZ2lzdHJ5LmdldFNvdXJjZShzb3VyY2VJZCwgdHJ1ZSk7XG4gICAgICAgIGludmFyaWFudChzb3VyY2UsIGBFeHBlY3RlZCB0byBmaW5kIGEgdmFsaWQgc291cmNlLiBzb3VyY2VJZD0ke3NvdXJjZUlkfWApO1xuICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpIHx8ICF0aGlzLmlzU291cmNlUHVibGljKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gdGhpcy5yZWdpc3RyeS5nZXRTb3VyY2VUeXBlKHNvdXJjZUlkKTtcbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW1UeXBlID0gdGhpcy5nZXRJdGVtVHlwZSgpO1xuICAgICAgICBpZiAoc291cmNlVHlwZSAhPT0gZHJhZ2dlZEl0ZW1UeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZS5pc0RyYWdnaW5nKHRoaXMsIHNvdXJjZUlkKTtcbiAgICB9XG4gICAgaXNPdmVyVGFyZ2V0KHRhcmdldElkLCBvcHRpb25zID0ge1xuICAgICAgICBzaGFsbG93OiBmYWxzZVxuICAgIH0pIHtcbiAgICAgICAgLy8gdW5kZWZpbmVkIG9uIGluaXRpYWwgcmVuZGVyXG4gICAgICAgIGlmICghdGFyZ2V0SWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNoYWxsb3cgIH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFyZ2V0VHlwZSA9IHRoaXMucmVnaXN0cnkuZ2V0VGFyZ2V0VHlwZSh0YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IGRyYWdnZWRJdGVtVHlwZSA9IHRoaXMuZ2V0SXRlbVR5cGUoKTtcbiAgICAgICAgaWYgKGRyYWdnZWRJdGVtVHlwZSAmJiAhbWF0Y2hlc1R5cGUodGFyZ2V0VHlwZSwgZHJhZ2dlZEl0ZW1UeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldElkcyA9IHRoaXMuZ2V0VGFyZ2V0SWRzKCk7XG4gICAgICAgIGlmICghdGFyZ2V0SWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGFyZ2V0SWRzLmluZGV4T2YodGFyZ2V0SWQpO1xuICAgICAgICBpZiAoc2hhbGxvdykge1xuICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09PSB0YXJnZXRJZHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRleCA+IC0xO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldEl0ZW1UeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPcGVyYXRpb24uaXRlbVR5cGU7XG4gICAgfVxuICAgIGdldEl0ZW0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09wZXJhdGlvbi5pdGVtO1xuICAgIH1cbiAgICBnZXRTb3VyY2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT3BlcmF0aW9uLnNvdXJjZUlkO1xuICAgIH1cbiAgICBnZXRUYXJnZXRJZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09wZXJhdGlvbi50YXJnZXRJZHM7XG4gICAgfVxuICAgIGdldERyb3BSZXN1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09wZXJhdGlvbi5kcm9wUmVzdWx0O1xuICAgIH1cbiAgICBkaWREcm9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPcGVyYXRpb24uZGlkRHJvcDtcbiAgICB9XG4gICAgaXNTb3VyY2VQdWJsaWMoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT3BlcmF0aW9uLmlzU291cmNlUHVibGljKTtcbiAgICB9XG4gICAgZ2V0SW5pdGlhbENsaWVudE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT2Zmc2V0LmluaXRpYWxDbGllbnRPZmZzZXQ7XG4gICAgfVxuICAgIGdldEluaXRpYWxTb3VyY2VDbGllbnRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldC5pbml0aWFsU291cmNlQ2xpZW50T2Zmc2V0O1xuICAgIH1cbiAgICBnZXRDbGllbnRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldC5jbGllbnRPZmZzZXQ7XG4gICAgfVxuICAgIGdldFNvdXJjZUNsaWVudE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNvdXJjZUNsaWVudE9mZnNldCh0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldCk7XG4gICAgfVxuICAgIGdldERpZmZlcmVuY2VGcm9tSW5pdGlhbE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIGdldERpZmZlcmVuY2VGcm9tSW5pdGlhbE9mZnNldCh0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHN0b3JlLCByZWdpc3RyeSl7XG4gICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RHJhZ0Ryb3BNb25pdG9ySW1wbC5qcy5tYXAiLCJpbXBvcnQgeyBhc2FwIH0gZnJvbSAnQHJlYWN0LWRuZC9hc2FwJztcbmltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0ByZWFjdC1kbmQvaW52YXJpYW50JztcbmltcG9ydCB7IGFkZFNvdXJjZSwgYWRkVGFyZ2V0LCByZW1vdmVTb3VyY2UsIHJlbW92ZVRhcmdldCB9IGZyb20gJy4uL2FjdGlvbnMvcmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVTb3VyY2VDb250cmFjdCwgdmFsaWRhdGVUYXJnZXRDb250cmFjdCwgdmFsaWRhdGVUeXBlIH0gZnJvbSAnLi4vY29udHJhY3RzLmpzJztcbmltcG9ydCB7IEhhbmRsZXJSb2xlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy5qcyc7XG5pbXBvcnQgeyBnZXROZXh0VW5pcXVlSWQgfSBmcm9tICcuLi91dGlscy9nZXROZXh0VW5pcXVlSWQuanMnO1xuZnVuY3Rpb24gZ2V0TmV4dEhhbmRsZXJJZChyb2xlKSB7XG4gICAgY29uc3QgaWQgPSBnZXROZXh0VW5pcXVlSWQoKS50b1N0cmluZygpO1xuICAgIHN3aXRjaChyb2xlKXtcbiAgICAgICAgY2FzZSBIYW5kbGVyUm9sZS5TT1VSQ0U6XG4gICAgICAgICAgICByZXR1cm4gYFMke2lkfWA7XG4gICAgICAgIGNhc2UgSGFuZGxlclJvbGUuVEFSR0VUOlxuICAgICAgICAgICAgcmV0dXJuIGBUJHtpZH1gO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEhhbmRsZXIgUm9sZTogJHtyb2xlfWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlUm9sZUZyb21IYW5kbGVySWQoaGFuZGxlcklkKSB7XG4gICAgc3dpdGNoKGhhbmRsZXJJZFswXSl7XG4gICAgICAgIGNhc2UgJ1MnOlxuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZXJSb2xlLlNPVVJDRTtcbiAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICByZXR1cm4gSGFuZGxlclJvbGUuVEFSR0VUO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgaGFuZGxlciBJRDogJHtoYW5kbGVySWR9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWFwQ29udGFpbnNWYWx1ZShtYXAsIHNlYXJjaFZhbHVlKSB7XG4gICAgY29uc3QgZW50cmllcyA9IG1hcC5lbnRyaWVzKCk7XG4gICAgbGV0IGlzRG9uZSA9IGZhbHNlO1xuICAgIGRvIHtcbiAgICAgICAgY29uc3QgeyBkb25lICwgdmFsdWU6IFssIHZhbHVlXSAsICB9ID0gZW50cmllcy5uZXh0KCk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlzRG9uZSA9ICEhZG9uZTtcbiAgICB9d2hpbGUgKCFpc0RvbmUpXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGNsYXNzIEhhbmRsZXJSZWdpc3RyeUltcGwge1xuICAgIGFkZFNvdXJjZSh0eXBlLCBzb3VyY2UpIHtcbiAgICAgICAgdmFsaWRhdGVUeXBlKHR5cGUpO1xuICAgICAgICB2YWxpZGF0ZVNvdXJjZUNvbnRyYWN0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gdGhpcy5hZGRIYW5kbGVyKEhhbmRsZXJSb2xlLlNPVVJDRSwgdHlwZSwgc291cmNlKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChhZGRTb3VyY2Uoc291cmNlSWQpKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUlkO1xuICAgIH1cbiAgICBhZGRUYXJnZXQodHlwZSwgdGFyZ2V0KSB7XG4gICAgICAgIHZhbGlkYXRlVHlwZSh0eXBlLCB0cnVlKTtcbiAgICAgICAgdmFsaWRhdGVUYXJnZXRDb250cmFjdCh0YXJnZXQpO1xuICAgICAgICBjb25zdCB0YXJnZXRJZCA9IHRoaXMuYWRkSGFuZGxlcihIYW5kbGVyUm9sZS5UQVJHRVQsIHR5cGUsIHRhcmdldCk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goYWRkVGFyZ2V0KHRhcmdldElkKSk7XG4gICAgICAgIHJldHVybiB0YXJnZXRJZDtcbiAgICB9XG4gICAgY29udGFpbnNIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIG1hcENvbnRhaW5zVmFsdWUodGhpcy5kcmFnU291cmNlcywgaGFuZGxlcikgfHwgbWFwQ29udGFpbnNWYWx1ZSh0aGlzLmRyb3BUYXJnZXRzLCBoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0U291cmNlKHNvdXJjZUlkLCBpbmNsdWRlUGlubmVkID0gZmFsc2UpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNTb3VyY2VJZChzb3VyY2VJZCksICdFeHBlY3RlZCBhIHZhbGlkIHNvdXJjZSBJRC4nKTtcbiAgICAgICAgY29uc3QgaXNQaW5uZWQgPSBpbmNsdWRlUGlubmVkICYmIHNvdXJjZUlkID09PSB0aGlzLnBpbm5lZFNvdXJjZUlkO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBpc1Bpbm5lZCA/IHRoaXMucGlubmVkU291cmNlIDogdGhpcy5kcmFnU291cmNlcy5nZXQoc291cmNlSWQpO1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgICBnZXRUYXJnZXQodGFyZ2V0SWQpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNUYXJnZXRJZCh0YXJnZXRJZCksICdFeHBlY3RlZCBhIHZhbGlkIHRhcmdldCBJRC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcFRhcmdldHMuZ2V0KHRhcmdldElkKTtcbiAgICB9XG4gICAgZ2V0U291cmNlVHlwZShzb3VyY2VJZCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1NvdXJjZUlkKHNvdXJjZUlkKSwgJ0V4cGVjdGVkIGEgdmFsaWQgc291cmNlIElELicpO1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlcy5nZXQoc291cmNlSWQpO1xuICAgIH1cbiAgICBnZXRUYXJnZXRUeXBlKHRhcmdldElkKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzVGFyZ2V0SWQodGFyZ2V0SWQpLCAnRXhwZWN0ZWQgYSB2YWxpZCB0YXJnZXQgSUQuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVzLmdldCh0YXJnZXRJZCk7XG4gICAgfVxuICAgIGlzU291cmNlSWQoaGFuZGxlcklkKSB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBwYXJzZVJvbGVGcm9tSGFuZGxlcklkKGhhbmRsZXJJZCk7XG4gICAgICAgIHJldHVybiByb2xlID09PSBIYW5kbGVyUm9sZS5TT1VSQ0U7XG4gICAgfVxuICAgIGlzVGFyZ2V0SWQoaGFuZGxlcklkKSB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBwYXJzZVJvbGVGcm9tSGFuZGxlcklkKGhhbmRsZXJJZCk7XG4gICAgICAgIHJldHVybiByb2xlID09PSBIYW5kbGVyUm9sZS5UQVJHRVQ7XG4gICAgfVxuICAgIHJlbW92ZVNvdXJjZShzb3VyY2VJZCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5nZXRTb3VyY2Uoc291cmNlSWQpLCAnRXhwZWN0ZWQgYW4gZXhpc3Rpbmcgc291cmNlLicpO1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJlbW92ZVNvdXJjZShzb3VyY2VJZCkpO1xuICAgICAgICBhc2FwKCgpPT57XG4gICAgICAgICAgICB0aGlzLmRyYWdTb3VyY2VzLmRlbGV0ZShzb3VyY2VJZCk7XG4gICAgICAgICAgICB0aGlzLnR5cGVzLmRlbGV0ZShzb3VyY2VJZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXQodGFyZ2V0SWQpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuZ2V0VGFyZ2V0KHRhcmdldElkKSwgJ0V4cGVjdGVkIGFuIGV4aXN0aW5nIHRhcmdldC4nKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChyZW1vdmVUYXJnZXQodGFyZ2V0SWQpKTtcbiAgICAgICAgdGhpcy5kcm9wVGFyZ2V0cy5kZWxldGUodGFyZ2V0SWQpO1xuICAgICAgICB0aGlzLnR5cGVzLmRlbGV0ZSh0YXJnZXRJZCk7XG4gICAgfVxuICAgIHBpblNvdXJjZShzb3VyY2VJZCkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmdldFNvdXJjZShzb3VyY2VJZCk7XG4gICAgICAgIGludmFyaWFudChzb3VyY2UsICdFeHBlY3RlZCBhbiBleGlzdGluZyBzb3VyY2UuJyk7XG4gICAgICAgIHRoaXMucGlubmVkU291cmNlSWQgPSBzb3VyY2VJZDtcbiAgICAgICAgdGhpcy5waW5uZWRTb3VyY2UgPSBzb3VyY2U7XG4gICAgfVxuICAgIHVucGluU291cmNlKCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5waW5uZWRTb3VyY2UsICdObyBzb3VyY2UgaXMgcGlubmVkIGF0IHRoZSB0aW1lLicpO1xuICAgICAgICB0aGlzLnBpbm5lZFNvdXJjZUlkID0gbnVsbDtcbiAgICAgICAgdGhpcy5waW5uZWRTb3VyY2UgPSBudWxsO1xuICAgIH1cbiAgICBhZGRIYW5kbGVyKHJvbGUsIHR5cGUsIGhhbmRsZXIpIHtcbiAgICAgICAgY29uc3QgaWQgPSBnZXROZXh0SGFuZGxlcklkKHJvbGUpO1xuICAgICAgICB0aGlzLnR5cGVzLnNldChpZCwgdHlwZSk7XG4gICAgICAgIGlmIChyb2xlID09PSBIYW5kbGVyUm9sZS5TT1VSQ0UpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1NvdXJjZXMuc2V0KGlkLCBoYW5kbGVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBIYW5kbGVyUm9sZS5UQVJHRVQpIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcFRhcmdldHMuc2V0KGlkLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHN0b3JlKXtcbiAgICAgICAgdGhpcy50eXBlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5kcm9wVGFyZ2V0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5waW5uZWRTb3VyY2VJZCA9IG51bGw7XG4gICAgICAgIHRoaXMucGlubmVkU291cmNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SGFuZGxlclJlZ2lzdHJ5SW1wbC5qcy5tYXAiLCJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAcmVhY3QtZG5kL2ludmFyaWFudCc7XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTb3VyY2VDb250cmFjdChzb3VyY2UpIHtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHNvdXJjZS5jYW5EcmFnID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgY2FuRHJhZyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIGludmFyaWFudCh0eXBlb2Ygc291cmNlLmJlZ2luRHJhZyA9PT0gJ2Z1bmN0aW9uJywgJ0V4cGVjdGVkIGJlZ2luRHJhZyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIGludmFyaWFudCh0eXBlb2Ygc291cmNlLmVuZERyYWcgPT09ICdmdW5jdGlvbicsICdFeHBlY3RlZCBlbmREcmFnIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUYXJnZXRDb250cmFjdCh0YXJnZXQpIHtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHRhcmdldC5jYW5Ecm9wID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgY2FuRHJvcCB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIGludmFyaWFudCh0eXBlb2YgdGFyZ2V0LmhvdmVyID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgaG92ZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHRhcmdldC5kcm9wID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgYmVnaW5EcmFnIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUeXBlKHR5cGUsIGFsbG93QXJyYXkpIHtcbiAgICBpZiAoYWxsb3dBcnJheSAmJiBBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICAgIHR5cGUuZm9yRWFjaCgodCk9PnZhbGlkYXRlVHlwZSh0LCBmYWxzZSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnZhcmlhbnQodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnc3ltYm9sJywgYWxsb3dBcnJheSA/ICdUeXBlIGNhbiBvbmx5IGJlIGEgc3RyaW5nLCBhIHN5bWJvbCwgb3IgYW4gYXJyYXkgb2YgZWl0aGVyLicgOiAnVHlwZSBjYW4gb25seSBiZSBhIHN0cmluZyBvciBhIHN5bWJvbC4nKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udHJhY3RzLmpzLm1hcCIsImltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BNYW5hZ2VySW1wbCB9IGZyb20gJy4vY2xhc3Nlcy9EcmFnRHJvcE1hbmFnZXJJbXBsLmpzJztcbmltcG9ydCB7IERyYWdEcm9wTW9uaXRvckltcGwgfSBmcm9tICcuL2NsYXNzZXMvRHJhZ0Ryb3BNb25pdG9ySW1wbC5qcyc7XG5pbXBvcnQgeyBIYW5kbGVyUmVnaXN0cnlJbXBsIH0gZnJvbSAnLi9jbGFzc2VzL0hhbmRsZXJSZWdpc3RyeUltcGwuanMnO1xuaW1wb3J0IHsgcmVkdWNlIH0gZnJvbSAnLi9yZWR1Y2Vycy9pbmRleC5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRHJhZ0Ryb3BNYW5hZ2VyKGJhY2tlbmRGYWN0b3J5LCBnbG9iYWxDb250ZXh0ID0gdW5kZWZpbmVkLCBiYWNrZW5kT3B0aW9ucyA9IHt9LCBkZWJ1Z01vZGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IHN0b3JlID0gbWFrZVN0b3JlSW5zdGFuY2UoZGVidWdNb2RlKTtcbiAgICBjb25zdCBtb25pdG9yID0gbmV3IERyYWdEcm9wTW9uaXRvckltcGwoc3RvcmUsIG5ldyBIYW5kbGVyUmVnaXN0cnlJbXBsKHN0b3JlKSk7XG4gICAgY29uc3QgbWFuYWdlciA9IG5ldyBEcmFnRHJvcE1hbmFnZXJJbXBsKHN0b3JlLCBtb25pdG9yKTtcbiAgICBjb25zdCBiYWNrZW5kID0gYmFja2VuZEZhY3RvcnkobWFuYWdlciwgZ2xvYmFsQ29udGV4dCwgYmFja2VuZE9wdGlvbnMpO1xuICAgIG1hbmFnZXIucmVjZWl2ZUJhY2tlbmQoYmFja2VuZCk7XG4gICAgcmV0dXJuIG1hbmFnZXI7XG59XG5mdW5jdGlvbiBtYWtlU3RvcmVJbnN0YW5jZShkZWJ1Z01vZGUpIHtcbiAgICAvLyBUT0RPOiBpZiB3ZSBldmVyIG1ha2UgYSByZWFjdC1uYXRpdmUgdmVyc2lvbiBvZiB0aGlzLFxuICAgIC8vIHdlJ2xsIG5lZWQgdG8gY29uc2lkZXIgaG93IHRvIHB1bGwgb2ZmIGRldi10b29saW5nXG4gICAgY29uc3QgcmVkdXhEZXZUb29scyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fO1xuICAgIHJldHVybiBjcmVhdGVTdG9yZShyZWR1Y2UsIGRlYnVnTW9kZSAmJiByZWR1eERldlRvb2xzICYmIHJlZHV4RGV2VG9vbHMoe1xuICAgICAgICBuYW1lOiAnZG5kLWNvcmUnLFxuICAgICAgICBpbnN0YW5jZUlkOiAnZG5kLWNvcmUnXG4gICAgfSkpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jcmVhdGVEcmFnRHJvcE1hbmFnZXIuanMubWFwIiwiZXhwb3J0IHZhciBIYW5kbGVyUm9sZTtcbihmdW5jdGlvbihIYW5kbGVyUm9sZSkge1xuICAgIEhhbmRsZXJSb2xlW1wiU09VUkNFXCJdID0gXCJTT1VSQ0VcIjtcbiAgICBIYW5kbGVyUm9sZVtcIlRBUkdFVFwiXSA9IFwiVEFSR0VUXCI7XG59KShIYW5kbGVyUm9sZSB8fCAoSGFuZGxlclJvbGUgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcmZhY2VzLmpzLm1hcCIsImltcG9ydCB7IEJFR0lOX0RSQUcsIERST1AsIEVORF9EUkFHLCBIT1ZFUiwgUFVCTElTSF9EUkFHX1NPVVJDRSB9IGZyb20gJy4uL2FjdGlvbnMvZHJhZ0Ryb3AvaW5kZXguanMnO1xuaW1wb3J0IHsgQUREX1NPVVJDRSwgQUREX1RBUkdFVCwgUkVNT1ZFX1NPVVJDRSwgUkVNT1ZFX1RBUkdFVCB9IGZyb20gJy4uL2FjdGlvbnMvcmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgQUxMLCBOT05FIH0gZnJvbSAnLi4vdXRpbHMvZGlydGluZXNzLmpzJztcbmltcG9ydCB7IGFyZUFycmF5c0VxdWFsIH0gZnJvbSAnLi4vdXRpbHMvZXF1YWxpdHkuanMnO1xuaW1wb3J0IHsgeG9yIH0gZnJvbSAnLi4vdXRpbHMvanNfdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZSgvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5fc3RhdGUgPSBOT05FLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2goYWN0aW9uLnR5cGUpe1xuICAgICAgICBjYXNlIEhPVkVSOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQUREX1NPVVJDRTpcbiAgICAgICAgY2FzZSBBRERfVEFSR0VUOlxuICAgICAgICBjYXNlIFJFTU9WRV9UQVJHRVQ6XG4gICAgICAgIGNhc2UgUkVNT1ZFX1NPVVJDRTpcbiAgICAgICAgICAgIHJldHVybiBOT05FO1xuICAgICAgICBjYXNlIEJFR0lOX0RSQUc6XG4gICAgICAgIGNhc2UgUFVCTElTSF9EUkFHX1NPVVJDRTpcbiAgICAgICAgY2FzZSBFTkRfRFJBRzpcbiAgICAgICAgY2FzZSBEUk9QOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIEFMTDtcbiAgICB9XG4gICAgY29uc3QgeyB0YXJnZXRJZHMgPVtdICwgcHJldlRhcmdldElkcyA9W10gIH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICBjb25zdCByZXN1bHQgPSB4b3IodGFyZ2V0SWRzLCBwcmV2VGFyZ2V0SWRzKTtcbiAgICBjb25zdCBkaWRDaGFuZ2UgPSByZXN1bHQubGVuZ3RoID4gMCB8fCAhYXJlQXJyYXlzRXF1YWwodGFyZ2V0SWRzLCBwcmV2VGFyZ2V0SWRzKTtcbiAgICBpZiAoIWRpZENoYW5nZSkge1xuICAgICAgICByZXR1cm4gTk9ORTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgdGhlIHRhcmdldCBpZHMgYXQgdGhlIGlubmVybW9zdCBwb3NpdGlvbi4gSWYgdGhleSBhcmUgdmFsaWQsIGFkZCB0aGVtXG4gICAgLy8gdG8gdGhlIHJlc3VsdFxuICAgIGNvbnN0IHByZXZJbm5lcm1vc3RUYXJnZXRJZCA9IHByZXZUYXJnZXRJZHNbcHJldlRhcmdldElkcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBpbm5lcm1vc3RUYXJnZXRJZCA9IHRhcmdldElkc1t0YXJnZXRJZHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKHByZXZJbm5lcm1vc3RUYXJnZXRJZCAhPT0gaW5uZXJtb3N0VGFyZ2V0SWQpIHtcbiAgICAgICAgaWYgKHByZXZJbm5lcm1vc3RUYXJnZXRJZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocHJldklubmVybW9zdFRhcmdldElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5uZXJtb3N0VGFyZ2V0SWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGlubmVybW9zdFRhcmdldElkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXJ0eUhhbmRsZXJJZHMuanMubWFwIiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICAgICAgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uKHN5bSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmltcG9ydCB7IEJFR0lOX0RSQUcsIERST1AsIEVORF9EUkFHLCBIT1ZFUiwgSU5JVF9DT09SRFMgfSBmcm9tICcuLi9hY3Rpb25zL2RyYWdEcm9wL2luZGV4LmpzJztcbmltcG9ydCB7IGFyZUNvb3Jkc0VxdWFsIH0gZnJvbSAnLi4vdXRpbHMvZXF1YWxpdHkuanMnO1xuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICAgIGluaXRpYWxTb3VyY2VDbGllbnRPZmZzZXQ6IG51bGwsXG4gICAgaW5pdGlhbENsaWVudE9mZnNldDogbnVsbCxcbiAgICBjbGllbnRPZmZzZXQ6IG51bGxcbn07XG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgICBjb25zdCB7IHBheWxvYWQgIH0gPSBhY3Rpb247XG4gICAgc3dpdGNoKGFjdGlvbi50eXBlKXtcbiAgICAgICAgY2FzZSBJTklUX0NPT1JEUzpcbiAgICAgICAgY2FzZSBCRUdJTl9EUkFHOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpbml0aWFsU291cmNlQ2xpZW50T2Zmc2V0OiBwYXlsb2FkLnNvdXJjZUNsaWVudE9mZnNldCxcbiAgICAgICAgICAgICAgICBpbml0aWFsQ2xpZW50T2Zmc2V0OiBwYXlsb2FkLmNsaWVudE9mZnNldCxcbiAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXQ6IHBheWxvYWQuY2xpZW50T2Zmc2V0XG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEhPVkVSOlxuICAgICAgICAgICAgaWYgKGFyZUNvb3Jkc0VxdWFsKHN0YXRlLmNsaWVudE9mZnNldCwgcGF5bG9hZC5jbGllbnRPZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7XG4gICAgICAgICAgICAgICAgY2xpZW50T2Zmc2V0OiBwYXlsb2FkLmNsaWVudE9mZnNldFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgRU5EX0RSQUc6XG4gICAgICAgIGNhc2UgRFJPUDpcbiAgICAgICAgICAgIHJldHVybiBpbml0aWFsU3RhdGU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kcmFnT2Zmc2V0LmpzLm1hcCIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgICBmb3IodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbihzeW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5pbXBvcnQgeyBCRUdJTl9EUkFHLCBEUk9QLCBFTkRfRFJBRywgSE9WRVIsIFBVQkxJU0hfRFJBR19TT1VSQ0UgfSBmcm9tICcuLi9hY3Rpb25zL2RyYWdEcm9wL2luZGV4LmpzJztcbmltcG9ydCB7IFJFTU9WRV9UQVJHRVQgfSBmcm9tICcuLi9hY3Rpb25zL3JlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IHdpdGhvdXQgfSBmcm9tICcuLi91dGlscy9qc191dGlscy5qcyc7XG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgaXRlbVR5cGU6IG51bGwsXG4gICAgaXRlbTogbnVsbCxcbiAgICBzb3VyY2VJZDogbnVsbCxcbiAgICB0YXJnZXRJZHM6IFtdLFxuICAgIGRyb3BSZXN1bHQ6IG51bGwsXG4gICAgZGlkRHJvcDogZmFsc2UsXG4gICAgaXNTb3VyY2VQdWJsaWM6IG51bGxcbn07XG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHtcbiAgICBjb25zdCB7IHBheWxvYWQgIH0gPSBhY3Rpb247XG4gICAgc3dpdGNoKGFjdGlvbi50eXBlKXtcbiAgICAgICAgY2FzZSBCRUdJTl9EUkFHOlxuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGU6IHBheWxvYWQuaXRlbVR5cGUsXG4gICAgICAgICAgICAgICAgaXRlbTogcGF5bG9hZC5pdGVtLFxuICAgICAgICAgICAgICAgIHNvdXJjZUlkOiBwYXlsb2FkLnNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIGlzU291cmNlUHVibGljOiBwYXlsb2FkLmlzU291cmNlUHVibGljLFxuICAgICAgICAgICAgICAgIGRyb3BSZXN1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgZGlkRHJvcDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFBVQkxJU0hfRFJBR19TT1VSQ0U6XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHtcbiAgICAgICAgICAgICAgICBpc1NvdXJjZVB1YmxpYzogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgSE9WRVI6XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRJZHM6IHBheWxvYWQudGFyZ2V0SWRzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBSRU1PVkVfVEFSR0VUOlxuICAgICAgICAgICAgaWYgKHN0YXRlLnRhcmdldElkcy5pbmRleE9mKHBheWxvYWQudGFyZ2V0SWQpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICAgICAgICAgIHRhcmdldElkczogd2l0aG91dChzdGF0ZS50YXJnZXRJZHMsIHBheWxvYWQudGFyZ2V0SWQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBEUk9QOlxuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7XG4gICAgICAgICAgICAgICAgZHJvcFJlc3VsdDogcGF5bG9hZC5kcm9wUmVzdWx0LFxuICAgICAgICAgICAgICAgIGRpZERyb3A6IHRydWUsXG4gICAgICAgICAgICAgICAgdGFyZ2V0SWRzOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgRU5EX0RSQUc6XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZTogbnVsbCxcbiAgICAgICAgICAgICAgICBpdGVtOiBudWxsLFxuICAgICAgICAgICAgICAgIHNvdXJjZUlkOiBudWxsLFxuICAgICAgICAgICAgICAgIGRyb3BSZXN1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgZGlkRHJvcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNTb3VyY2VQdWJsaWM6IG51bGwsXG4gICAgICAgICAgICAgICAgdGFyZ2V0SWRzOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kcmFnT3BlcmF0aW9uLmpzLm1hcCIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgICBmb3IodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbihzeW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5pbXBvcnQgeyBnZXQgfSBmcm9tICcuLi91dGlscy9qc191dGlscy5qcyc7XG5pbXBvcnQgeyByZWR1Y2UgYXMgZGlydHlIYW5kbGVySWRzIH0gZnJvbSAnLi9kaXJ0eUhhbmRsZXJJZHMuanMnO1xuaW1wb3J0IHsgcmVkdWNlIGFzIGRyYWdPZmZzZXQgfSBmcm9tICcuL2RyYWdPZmZzZXQuanMnO1xuaW1wb3J0IHsgcmVkdWNlIGFzIGRyYWdPcGVyYXRpb24gfSBmcm9tICcuL2RyYWdPcGVyYXRpb24uanMnO1xuaW1wb3J0IHsgcmVkdWNlIGFzIHJlZkNvdW50IH0gZnJvbSAnLi9yZWZDb3VudC5qcyc7XG5pbXBvcnQgeyByZWR1Y2UgYXMgc3RhdGVJZCB9IGZyb20gJy4vc3RhdGVJZC5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKHN0YXRlID0ge30sIGFjdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRpcnR5SGFuZGxlcklkczogZGlydHlIYW5kbGVySWRzKHN0YXRlLmRpcnR5SGFuZGxlcklkcywge1xuICAgICAgICAgICAgdHlwZTogYWN0aW9uLnR5cGUsXG4gICAgICAgICAgICBwYXlsb2FkOiBfb2JqZWN0U3ByZWFkKHt9LCBhY3Rpb24ucGF5bG9hZCwge1xuICAgICAgICAgICAgICAgIHByZXZUYXJnZXRJZHM6IGdldChzdGF0ZSwgJ2RyYWdPcGVyYXRpb24udGFyZ2V0SWRzJywgW10pXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KSxcbiAgICAgICAgZHJhZ09mZnNldDogZHJhZ09mZnNldChzdGF0ZS5kcmFnT2Zmc2V0LCBhY3Rpb24pLFxuICAgICAgICByZWZDb3VudDogcmVmQ291bnQoc3RhdGUucmVmQ291bnQsIGFjdGlvbiksXG4gICAgICAgIGRyYWdPcGVyYXRpb246IGRyYWdPcGVyYXRpb24oc3RhdGUuZHJhZ09wZXJhdGlvbiwgYWN0aW9uKSxcbiAgICAgICAgc3RhdGVJZDogc3RhdGVJZChzdGF0ZS5zdGF0ZUlkKVxuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IEFERF9TT1VSQ0UsIEFERF9UQVJHRVQsIFJFTU9WRV9TT1VSQ0UsIFJFTU9WRV9UQVJHRVQgfSBmcm9tICcuLi9hY3Rpb25zL3JlZ2lzdHJ5LmpzJztcbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2Uoc3RhdGUgPSAwLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2goYWN0aW9uLnR5cGUpe1xuICAgICAgICBjYXNlIEFERF9TT1VSQ0U6XG4gICAgICAgIGNhc2UgQUREX1RBUkdFVDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZSArIDE7XG4gICAgICAgIGNhc2UgUkVNT1ZFX1NPVVJDRTpcbiAgICAgICAgY2FzZSBSRU1PVkVfVEFSR0VUOlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIC0gMTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZkNvdW50LmpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiByZWR1Y2Uoc3RhdGUgPSAwKSB7XG4gICAgcmV0dXJuIHN0YXRlICsgMTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RhdGVJZC5qcy5tYXAiLCIvKipcbiAqIENvb3JkaW5hdGUgYWRkaXRpb25cbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBjb29yZGluYXRlXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGNvb3JkaW5hdGVcbiAqLyBleHBvcnQgZnVuY3Rpb24gYWRkKGEsIGIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBhLnggKyBiLngsXG4gICAgICAgIHk6IGEueSArIGIueVxuICAgIH07XG59XG4vKipcbiAqIENvb3JkaW5hdGUgc3VidHJhY3Rpb25cbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBjb29yZGluYXRlXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGNvb3JkaW5hdGVcbiAqLyBleHBvcnQgZnVuY3Rpb24gc3VidHJhY3QoYSwgYikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGEueCAtIGIueCxcbiAgICAgICAgeTogYS55IC0gYi55XG4gICAgfTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY2FydGVzaWFuIGRpc3RhbmNlIG9mIHRoZSBkcmFnIHNvdXJjZSBjb21wb25lbnQncyBwb3NpdGlvbiwgYmFzZWQgb24gaXRzIHBvc2l0aW9uXG4gKiBhdCB0aGUgdGltZSB3aGVuIHRoZSBjdXJyZW50IGRyYWcgb3BlcmF0aW9uIGhhcyBzdGFydGVkLCBhbmQgdGhlIG1vdmVtZW50IGRpZmZlcmVuY2UuXG4gKlxuICogUmV0dXJucyBudWxsIGlmIG5vIGl0ZW0gaXMgYmVpbmcgZHJhZ2dlZC5cbiAqXG4gKiBAcGFyYW0gc3RhdGUgVGhlIG9mZnNldCBzdGF0ZSB0byBjb21wdXRlIGZyb21cbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlQ2xpZW50T2Zmc2V0KHN0YXRlKSB7XG4gICAgY29uc3QgeyBjbGllbnRPZmZzZXQgLCBpbml0aWFsQ2xpZW50T2Zmc2V0ICwgaW5pdGlhbFNvdXJjZUNsaWVudE9mZnNldCAgfSA9IHN0YXRlO1xuICAgIGlmICghY2xpZW50T2Zmc2V0IHx8ICFpbml0aWFsQ2xpZW50T2Zmc2V0IHx8ICFpbml0aWFsU291cmNlQ2xpZW50T2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gc3VidHJhY3QoYWRkKGNsaWVudE9mZnNldCwgaW5pdGlhbFNvdXJjZUNsaWVudE9mZnNldCksIGluaXRpYWxDbGllbnRPZmZzZXQpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSB4LHkgb2Zmc2V0IGJldHdlZW4gdGhlIGNsaWVudCBvZmZzZXQgYW5kIHRoZSBpbml0aWFsIGNsaWVudCBvZmZzZXRcbiAqXG4gKiBAcGFyYW0gc3RhdGUgVGhlIG9mZnNldCBzdGF0ZSB0byBjb21wdXRlIGZyb21cbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0RGlmZmVyZW5jZUZyb21Jbml0aWFsT2Zmc2V0KHN0YXRlKSB7XG4gICAgY29uc3QgeyBjbGllbnRPZmZzZXQgLCBpbml0aWFsQ2xpZW50T2Zmc2V0ICB9ID0gc3RhdGU7XG4gICAgaWYgKCFjbGllbnRPZmZzZXQgfHwgIWluaXRpYWxDbGllbnRPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBzdWJ0cmFjdChjbGllbnRPZmZzZXQsIGluaXRpYWxDbGllbnRPZmZzZXQpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb29yZHMuanMubWFwIiwiaW1wb3J0IHsgaW50ZXJzZWN0aW9uIH0gZnJvbSAnLi9qc191dGlscy5qcyc7XG5leHBvcnQgY29uc3QgTk9ORSA9IFtdO1xuZXhwb3J0IGNvbnN0IEFMTCA9IFtdO1xuTk9ORS5fX0lTX05PTkVfXyA9IHRydWU7XG5BTEwuX19JU19BTExfXyA9IHRydWU7XG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGhhbmRsZXIgSURzIGFyZSBkaXJ0eSBvciBub3QuXG4gKlxuICogQHBhcmFtIGRpcnR5SWRzIFRoZSBzZXQgb2YgZGlydHkgaGFuZGxlciBpZHNcbiAqIEBwYXJhbSBoYW5kbGVySWRzIFRoZSBzZXQgb2YgaGFuZGxlciBpZHMgdG8gY2hlY2tcbiAqLyBleHBvcnQgZnVuY3Rpb24gYXJlRGlydHkoZGlydHlJZHMsIGhhbmRsZXJJZHMpIHtcbiAgICBpZiAoZGlydHlJZHMgPT09IE5PTkUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGlydHlJZHMgPT09IEFMTCB8fCB0eXBlb2YgaGFuZGxlcklkcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGNvbW1vbklkcyA9IGludGVyc2VjdGlvbihoYW5kbGVySWRzLCBkaXJ0eUlkcyk7XG4gICAgcmV0dXJuIGNvbW1vbklkcy5sZW5ndGggPiAwO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXJ0aW5lc3MuanMubWFwIiwiZXhwb3J0IGNvbnN0IHN0cmljdEVxdWFsaXR5ID0gKGEsIGIpPT5hID09PSBiXG47XG4vKipcbiAqIERldGVybWluZSBpZiB0d28gY2FydGVzaWFuIGNvb3JkaW5hdGUgb2Zmc2V0cyBhcmUgZXF1YWxcbiAqIEBwYXJhbSBvZmZzZXRBXG4gKiBAcGFyYW0gb2Zmc2V0QlxuICovIGV4cG9ydCBmdW5jdGlvbiBhcmVDb29yZHNFcXVhbChvZmZzZXRBLCBvZmZzZXRCKSB7XG4gICAgaWYgKCFvZmZzZXRBICYmICFvZmZzZXRCKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIW9mZnNldEEgfHwgIW9mZnNldEIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBvZmZzZXRBLnggPT09IG9mZnNldEIueCAmJiBvZmZzZXRBLnkgPT09IG9mZnNldEIueTtcbiAgICB9XG59XG4vKipcbiAqIERldGVybWluZXMgaWYgdHdvIGFycmF5cyBvZiBpdGVtcyBhcmUgZXF1YWxcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBhcnJheSBvZiBpdGVtc1xuICogQHBhcmFtIGIgVGhlIHNlY29uZCBhcnJheSBvZiBpdGVtc1xuICovIGV4cG9ydCBmdW5jdGlvbiBhcmVBcnJheXNFcXVhbChhLCBiLCBpc0VxdWFsID0gc3RyaWN0RXF1YWxpdHkpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpe1xuICAgICAgICBpZiAoIWlzRXF1YWwoYVtpXSwgYltpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXF1YWxpdHkuanMubWFwIiwibGV0IG5leHRVbmlxdWVJZCA9IDA7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dFVuaXF1ZUlkKCkge1xuICAgIHJldHVybiBuZXh0VW5pcXVlSWQrKztcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0TmV4dFVuaXF1ZUlkLmpzLm1hcCIsIi8vIGNoZWFwIGxvZGFzaCByZXBsYWNlbWVudHNcbi8qKlxuICogZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgXy5nZXRcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSBwYXRoXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldChvYmosIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChhLCBjKT0+YSAmJiBhW2NdID8gYVtjXSA6IGRlZmF1bHRWYWx1ZSB8fCBudWxsXG4gICAgLCBvYmopO1xufVxuLyoqXG4gKiBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBfLndpdGhvdXRcbiAqLyBleHBvcnQgZnVuY3Rpb24gd2l0aG91dChpdGVtcywgaXRlbSkge1xuICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGkpPT5pICE9PSBpdGVtXG4gICAgKTtcbn1cbi8qKlxuICogZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgXy5pc1N0cmluZ1xuICogQHBhcmFtIGlucHV0XG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKGlucHV0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7XG59XG4vKipcbiAqIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIF8uaXNTdHJpbmdcbiAqIEBwYXJhbSBpbnB1dFxuICovIGV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChpbnB1dCkge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnO1xufVxuLyoqXG4gKiByZXBsYWNlbWVudCBmb3IgXy54b3JcbiAqIEBwYXJhbSBpdGVtc0FcbiAqIEBwYXJhbSBpdGVtc0JcbiAqLyBleHBvcnQgZnVuY3Rpb24geG9yKGl0ZW1zQSwgaXRlbXNCKSB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGluc2VydEl0ZW0gPSAoaXRlbSk9PntcbiAgICAgICAgbWFwLnNldChpdGVtLCBtYXAuaGFzKGl0ZW0pID8gbWFwLmdldChpdGVtKSArIDEgOiAxKTtcbiAgICB9O1xuICAgIGl0ZW1zQS5mb3JFYWNoKGluc2VydEl0ZW0pO1xuICAgIGl0ZW1zQi5mb3JFYWNoKGluc2VydEl0ZW0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIG1hcC5mb3JFYWNoKChjb3VudCwga2V5KT0+e1xuICAgICAgICBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiByZXBsYWNlbWVudCBmb3IgXy5pbnRlcnNlY3Rpb25cbiAqIEBwYXJhbSBpdGVtc0FcbiAqIEBwYXJhbSBpdGVtc0JcbiAqLyBleHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0aW9uKGl0ZW1zQSwgaXRlbXNCKSB7XG4gICAgcmV0dXJuIGl0ZW1zQS5maWx0ZXIoKHQpPT5pdGVtc0IuaW5kZXhPZih0KSA+IC0xXG4gICAgKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9anNfdXRpbHMuanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNUeXBlKHRhcmdldFR5cGUsIGRyYWdnZWRJdGVtVHlwZSkge1xuICAgIGlmIChkcmFnZ2VkSXRlbVR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFR5cGUgPT09IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldFR5cGUpID8gdGFyZ2V0VHlwZS5zb21lKCh0KT0+dCA9PT0gZHJhZ2dlZEl0ZW1UeXBlXG4gICAgKSA6IHRhcmdldFR5cGUgPT09IGRyYWdnZWRJdGVtVHlwZTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0Y2hlc1R5cGUuanMubWFwIiwiY29uc3Qge1xuICBzbGljZSxcbiAgZm9yRWFjaFxufSA9IFtdO1xuZnVuY3Rpb24gZGVmYXVsdHMob2JqKSB7XG4gIGZvckVhY2guY2FsbChzbGljZS5jYWxsKGFyZ3VtZW50cywgMSksIHNvdXJjZSA9PiB7XG4gICAgaWYgKHNvdXJjZSkge1xuICAgICAgZm9yIChjb25zdCBwcm9wIGluIHNvdXJjZSkge1xuICAgICAgICBpZiAob2JqW3Byb3BdID09PSB1bmRlZmluZWQpIG9ialtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb2JqO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuY29uc3QgZmllbGRDb250ZW50UmVnRXhwID0gL15bXFx1MDAwOVxcdTAwMjAtXFx1MDA3ZVxcdTAwODAtXFx1MDBmZl0rJC87XG5jb25zdCBzZXJpYWxpemVDb29raWUgPSAobmFtZSwgdmFsLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IG9wdCA9IG9wdGlvbnMgfHwge307XG4gIG9wdC5wYXRoID0gb3B0LnBhdGggfHwgJy8nO1xuICBjb25zdCB2YWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudCh2YWwpO1xuICBsZXQgc3RyID0gYCR7bmFtZX09JHt2YWx1ZX1gO1xuICBpZiAob3B0Lm1heEFnZSA+IDApIHtcbiAgICBjb25zdCBtYXhBZ2UgPSBvcHQubWF4QWdlIC0gMDtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKG1heEFnZSkpIHRocm93IG5ldyBFcnJvcignbWF4QWdlIHNob3VsZCBiZSBhIE51bWJlcicpO1xuICAgIHN0ciArPSBgOyBNYXgtQWdlPSR7TWF0aC5mbG9vcihtYXhBZ2UpfWA7XG4gIH1cbiAgaWYgKG9wdC5kb21haW4pIHtcbiAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG9wdC5kb21haW4pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gZG9tYWluIGlzIGludmFsaWQnKTtcbiAgICB9XG4gICAgc3RyICs9IGA7IERvbWFpbj0ke29wdC5kb21haW59YDtcbiAgfVxuICBpZiAob3B0LnBhdGgpIHtcbiAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG9wdC5wYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHBhdGggaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICBzdHIgKz0gYDsgUGF0aD0ke29wdC5wYXRofWA7XG4gIH1cbiAgaWYgKG9wdC5leHBpcmVzKSB7XG4gICAgaWYgKHR5cGVvZiBvcHQuZXhwaXJlcy50b1VUQ1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIGV4cGlyZXMgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICBzdHIgKz0gYDsgRXhwaXJlcz0ke29wdC5leHBpcmVzLnRvVVRDU3RyaW5nKCl9YDtcbiAgfVxuICBpZiAob3B0Lmh0dHBPbmx5KSBzdHIgKz0gJzsgSHR0cE9ubHknO1xuICBpZiAob3B0LnNlY3VyZSkgc3RyICs9ICc7IFNlY3VyZSc7XG4gIGlmIChvcHQuc2FtZVNpdGUpIHtcbiAgICBjb25zdCBzYW1lU2l0ZSA9IHR5cGVvZiBvcHQuc2FtZVNpdGUgPT09ICdzdHJpbmcnID8gb3B0LnNhbWVTaXRlLnRvTG93ZXJDYXNlKCkgOiBvcHQuc2FtZVNpdGU7XG4gICAgc3dpdGNoIChzYW1lU2l0ZSkge1xuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9U3RyaWN0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsYXgnOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9TGF4JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdHJpY3QnOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9U3RyaWN0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPU5vbmUnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBzYW1lU2l0ZSBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuY29uc3QgY29va2llID0ge1xuICBjcmVhdGUobmFtZSwgdmFsdWUsIG1pbnV0ZXMsIGRvbWFpbikge1xuICAgIGxldCBjb29raWVPcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB7XG4gICAgICBwYXRoOiAnLycsXG4gICAgICBzYW1lU2l0ZTogJ3N0cmljdCdcbiAgICB9O1xuICAgIGlmIChtaW51dGVzKSB7XG4gICAgICBjb29raWVPcHRpb25zLmV4cGlyZXMgPSBuZXcgRGF0ZSgpO1xuICAgICAgY29va2llT3B0aW9ucy5leHBpcmVzLnNldFRpbWUoY29va2llT3B0aW9ucy5leHBpcmVzLmdldFRpbWUoKSArIG1pbnV0ZXMgKiA2MCAqIDEwMDApO1xuICAgIH1cbiAgICBpZiAoZG9tYWluKSBjb29raWVPcHRpb25zLmRvbWFpbiA9IGRvbWFpbjtcbiAgICBkb2N1bWVudC5jb29raWUgPSBzZXJpYWxpemVDb29raWUobmFtZSwgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSwgY29va2llT3B0aW9ucyk7XG4gIH0sXG4gIHJlYWQobmFtZSkge1xuICAgIGNvbnN0IG5hbWVFUSA9IGAke25hbWV9PWA7XG4gICAgY29uc3QgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYyA9IGNhW2ldO1xuICAgICAgd2hpbGUgKGMuY2hhckF0KDApID09PSAnICcpIGMgPSBjLnN1YnN0cmluZygxLCBjLmxlbmd0aCk7XG4gICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT09IDApIHJldHVybiBjLnN1YnN0cmluZyhuYW1lRVEubGVuZ3RoLCBjLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICByZW1vdmUobmFtZSkge1xuICAgIHRoaXMuY3JlYXRlKG5hbWUsICcnLCAtMSk7XG4gIH1cbn07XG52YXIgY29va2llJDEgPSB7XG4gIG5hbWU6ICdjb29raWUnLFxuICAvLyBEZWNvbnN0cnVjdCB0aGUgb3B0aW9ucyBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIGxvb2t1cENvb2tpZSBwcm9wZXJ0eVxuICBsb29rdXAoX3JlZikge1xuICAgIGxldCB7XG4gICAgICBsb29rdXBDb29raWVcbiAgICB9ID0gX3JlZjtcbiAgICBpZiAobG9va3VwQ29va2llICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBjb29raWUucmVhZChsb29rdXBDb29raWUpIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSxcbiAgLy8gRGVjb25zdHJ1Y3QgdGhlIG9wdGlvbnMgb2JqZWN0IGFuZCBleHRyYWN0IHRoZSBsb29rdXBDb29raWUsIGNvb2tpZU1pbnV0ZXMsIGNvb2tpZURvbWFpbiwgYW5kIGNvb2tpZU9wdGlvbnMgcHJvcGVydGllc1xuICBjYWNoZVVzZXJMYW5ndWFnZShsbmcsIF9yZWYyKSB7XG4gICAgbGV0IHtcbiAgICAgIGxvb2t1cENvb2tpZSxcbiAgICAgIGNvb2tpZU1pbnV0ZXMsXG4gICAgICBjb29raWVEb21haW4sXG4gICAgICBjb29raWVPcHRpb25zXG4gICAgfSA9IF9yZWYyO1xuICAgIGlmIChsb29rdXBDb29raWUgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29va2llLmNyZWF0ZShsb29rdXBDb29raWUsIGxuZywgY29va2llTWludXRlcywgY29va2llRG9tYWluLCBjb29raWVPcHRpb25zKTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBxdWVyeXN0cmluZyA9IHtcbiAgbmFtZTogJ3F1ZXJ5c3RyaW5nJyxcbiAgLy8gRGVjb25zdHJ1Y3QgdGhlIG9wdGlvbnMgb2JqZWN0IGFuZCBleHRyYWN0IHRoZSBsb29rdXBRdWVyeXN0cmluZyBwcm9wZXJ0eVxuICBsb29rdXAoX3JlZikge1xuICAgIGxldCB7XG4gICAgICBsb29rdXBRdWVyeXN0cmluZ1xuICAgIH0gPSBfcmVmO1xuICAgIGxldCBmb3VuZDtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIHNlYXJjaFxuICAgICAgfSA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgIGlmICghd2luZG93LmxvY2F0aW9uLnNlYXJjaCAmJiB3aW5kb3cubG9jYXRpb24uaGFzaD8uaW5kZXhPZignPycpID4gLTEpIHtcbiAgICAgICAgc2VhcmNoID0gd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKHdpbmRvdy5sb2NhdGlvbi5oYXNoLmluZGV4T2YoJz8nKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBxdWVyeSA9IHNlYXJjaC5zdWJzdHJpbmcoMSk7XG4gICAgICBjb25zdCBwYXJhbXMgPSBxdWVyeS5zcGxpdCgnJicpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcG9zID0gcGFyYW1zW2ldLmluZGV4T2YoJz0nKTtcbiAgICAgICAgaWYgKHBvcyA+IDApIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBwYXJhbXNbaV0uc3Vic3RyaW5nKDAsIHBvcyk7XG4gICAgICAgICAgaWYgKGtleSA9PT0gbG9va3VwUXVlcnlzdHJpbmcpIHtcbiAgICAgICAgICAgIGZvdW5kID0gcGFyYW1zW2ldLnN1YnN0cmluZyhwb3MgKyAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG59O1xuXG5sZXQgaGFzTG9jYWxTdG9yYWdlU3VwcG9ydCA9IG51bGw7XG5jb25zdCBsb2NhbFN0b3JhZ2VBdmFpbGFibGUgPSAoKSA9PiB7XG4gIGlmIChoYXNMb2NhbFN0b3JhZ2VTdXBwb3J0ICE9PSBudWxsKSByZXR1cm4gaGFzTG9jYWxTdG9yYWdlU3VwcG9ydDtcbiAgdHJ5IHtcbiAgICBoYXNMb2NhbFN0b3JhZ2VTdXBwb3J0ID0gd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubG9jYWxTdG9yYWdlICE9PSBudWxsO1xuICAgIGNvbnN0IHRlc3RLZXkgPSAnaTE4bmV4dC50cmFuc2xhdGUuYm9vJztcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdEtleSwgJ2ZvbycpO1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0S2V5KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhc0xvY2FsU3RvcmFnZVN1cHBvcnQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gaGFzTG9jYWxTdG9yYWdlU3VwcG9ydDtcbn07XG52YXIgbG9jYWxTdG9yYWdlID0ge1xuICBuYW1lOiAnbG9jYWxTdG9yYWdlJyxcbiAgLy8gRGVjb25zdHJ1Y3QgdGhlIG9wdGlvbnMgb2JqZWN0IGFuZCBleHRyYWN0IHRoZSBsb29rdXBMb2NhbFN0b3JhZ2UgcHJvcGVydHlcbiAgbG9va3VwKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgbG9va3VwTG9jYWxTdG9yYWdlXG4gICAgfSA9IF9yZWY7XG4gICAgaWYgKGxvb2t1cExvY2FsU3RvcmFnZSAmJiBsb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShsb29rdXBMb2NhbFN0b3JhZ2UpIHx8IHVuZGVmaW5lZDsgLy8gVW5kZWZpbmVkIGVuc3VyZXMgdHlwZSBjb25zaXN0ZW5jeSB3aXRoIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb25cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LFxuICAvLyBEZWNvbnN0cnVjdCB0aGUgb3B0aW9ucyBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIGxvb2t1cExvY2FsU3RvcmFnZSBwcm9wZXJ0eVxuICBjYWNoZVVzZXJMYW5ndWFnZShsbmcsIF9yZWYyKSB7XG4gICAgbGV0IHtcbiAgICAgIGxvb2t1cExvY2FsU3RvcmFnZVxuICAgIH0gPSBfcmVmMjtcbiAgICBpZiAobG9va3VwTG9jYWxTdG9yYWdlICYmIGxvY2FsU3RvcmFnZUF2YWlsYWJsZSgpKSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0obG9va3VwTG9jYWxTdG9yYWdlLCBsbmcpO1xuICAgIH1cbiAgfVxufTtcblxubGV0IGhhc1Nlc3Npb25TdG9yYWdlU3VwcG9ydCA9IG51bGw7XG5jb25zdCBzZXNzaW9uU3RvcmFnZUF2YWlsYWJsZSA9ICgpID0+IHtcbiAgaWYgKGhhc1Nlc3Npb25TdG9yYWdlU3VwcG9ydCAhPT0gbnVsbCkgcmV0dXJuIGhhc1Nlc3Npb25TdG9yYWdlU3VwcG9ydDtcbiAgdHJ5IHtcbiAgICBoYXNTZXNzaW9uU3RvcmFnZVN1cHBvcnQgPSB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5zZXNzaW9uU3RvcmFnZSAhPT0gbnVsbDtcbiAgICBjb25zdCB0ZXN0S2V5ID0gJ2kxOG5leHQudHJhbnNsYXRlLmJvbyc7XG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGVzdEtleSwgJ2ZvbycpO1xuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3RLZXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaGFzU2Vzc2lvblN0b3JhZ2VTdXBwb3J0ID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGhhc1Nlc3Npb25TdG9yYWdlU3VwcG9ydDtcbn07XG52YXIgc2Vzc2lvblN0b3JhZ2UgPSB7XG4gIG5hbWU6ICdzZXNzaW9uU3RvcmFnZScsXG4gIGxvb2t1cChfcmVmKSB7XG4gICAgbGV0IHtcbiAgICAgIGxvb2t1cFNlc3Npb25TdG9yYWdlXG4gICAgfSA9IF9yZWY7XG4gICAgaWYgKGxvb2t1cFNlc3Npb25TdG9yYWdlICYmIHNlc3Npb25TdG9yYWdlQXZhaWxhYmxlKCkpIHtcbiAgICAgIHJldHVybiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShsb29rdXBTZXNzaW9uU3RvcmFnZSkgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LFxuICBjYWNoZVVzZXJMYW5ndWFnZShsbmcsIF9yZWYyKSB7XG4gICAgbGV0IHtcbiAgICAgIGxvb2t1cFNlc3Npb25TdG9yYWdlXG4gICAgfSA9IF9yZWYyO1xuICAgIGlmIChsb29rdXBTZXNzaW9uU3RvcmFnZSAmJiBzZXNzaW9uU3RvcmFnZUF2YWlsYWJsZSgpKSB7XG4gICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShsb29rdXBTZXNzaW9uU3RvcmFnZSwgbG5nKTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBuYXZpZ2F0b3IkMSA9IHtcbiAgbmFtZTogJ25hdmlnYXRvcicsXG4gIGxvb2t1cChvcHRpb25zKSB7XG4gICAgY29uc3QgZm91bmQgPSBbXTtcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGFuZ3VhZ2VzLFxuICAgICAgICB1c2VyTGFuZ3VhZ2UsXG4gICAgICAgIGxhbmd1YWdlXG4gICAgICB9ID0gbmF2aWdhdG9yO1xuICAgICAgaWYgKGxhbmd1YWdlcykge1xuICAgICAgICAvLyBjaHJvbWUgb25seTsgbm90IGFuIGFycmF5LCBzbyBjYW4ndCB1c2UgLnB1c2guYXBwbHkgaW5zdGVhZCBvZiBpdGVyYXRpbmdcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYW5ndWFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBmb3VuZC5wdXNoKGxhbmd1YWdlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh1c2VyTGFuZ3VhZ2UpIHtcbiAgICAgICAgZm91bmQucHVzaCh1c2VyTGFuZ3VhZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICAgIGZvdW5kLnB1c2gobGFuZ3VhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmQubGVuZ3RoID4gMCA/IGZvdW5kIDogdW5kZWZpbmVkO1xuICB9XG59O1xuXG52YXIgaHRtbFRhZyA9IHtcbiAgbmFtZTogJ2h0bWxUYWcnLFxuICAvLyBEZWNvbnN0cnVjdCB0aGUgb3B0aW9ucyBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIGh0bWxUYWcgcHJvcGVydHlcbiAgbG9va3VwKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgaHRtbFRhZ1xuICAgIH0gPSBfcmVmO1xuICAgIGxldCBmb3VuZDtcbiAgICBjb25zdCBpbnRlcm5hbEh0bWxUYWcgPSBodG1sVGFnIHx8ICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogbnVsbCk7XG4gICAgaWYgKGludGVybmFsSHRtbFRhZyAmJiB0eXBlb2YgaW50ZXJuYWxIdG1sVGFnLmdldEF0dHJpYnV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm91bmQgPSBpbnRlcm5hbEh0bWxUYWcuZ2V0QXR0cmlidXRlKCdsYW5nJyk7XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbiAgfVxufTtcblxudmFyIHBhdGggPSB7XG4gIG5hbWU6ICdwYXRoJyxcbiAgLy8gRGVjb25zdHJ1Y3QgdGhlIG9wdGlvbnMgb2JqZWN0IGFuZCBleHRyYWN0IHRoZSBsb29rdXBGcm9tUGF0aEluZGV4IHByb3BlcnR5XG4gIGxvb2t1cChfcmVmKSB7XG4gICAgbGV0IHtcbiAgICAgIGxvb2t1cEZyb21QYXRoSW5kZXhcbiAgICB9ID0gX3JlZjtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUubWF0Y2goL1xcLyhbYS16QS1aLV0qKS9nKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGFuZ3VhZ2UpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGluZGV4ID0gdHlwZW9mIGxvb2t1cEZyb21QYXRoSW5kZXggPT09ICdudW1iZXInID8gbG9va3VwRnJvbVBhdGhJbmRleCA6IDA7XG4gICAgcmV0dXJuIGxhbmd1YWdlW2luZGV4XT8ucmVwbGFjZSgnLycsICcnKTtcbiAgfVxufTtcblxudmFyIHN1YmRvbWFpbiA9IHtcbiAgbmFtZTogJ3N1YmRvbWFpbicsXG4gIGxvb2t1cChfcmVmKSB7XG4gICAgbGV0IHtcbiAgICAgIGxvb2t1cEZyb21TdWJkb21haW5JbmRleFxuICAgIH0gPSBfcmVmO1xuICAgIC8vIElmIGdpdmVuIGdldCB0aGUgc3ViZG9tYWluIGluZGV4IGVsc2UgMVxuICAgIGNvbnN0IGludGVybmFsTG9va3VwRnJvbVN1YmRvbWFpbkluZGV4ID0gdHlwZW9mIGxvb2t1cEZyb21TdWJkb21haW5JbmRleCA9PT0gJ251bWJlcicgPyBsb29rdXBGcm9tU3ViZG9tYWluSW5kZXggKyAxIDogMTtcbiAgICAvLyBnZXQgYWxsIG1hdGNoZXMgaWYgd2luZG93LmxvY2F0aW9uLiBpcyBleGlzdGluZ1xuICAgIC8vIGZpcnN0IGl0ZW0gb2YgbWF0Y2ggaXMgdGhlIG1hdGNoIGl0c2VsZiBhbmQgdGhlIHNlY29uZCBpcyB0aGUgZmlyc3QgZ3JvdXAgbWF0Y2ggd2hpY2ggc2hvdWxkIGJlIHRoZSBmaXJzdCBzdWJkb21haW4gbWF0Y2hcbiAgICAvLyBpcyB0aGUgaG9zdG5hbWUgbm8gcHVibGljIGRvbWFpbiBnZXQgdGhlIG9yIG9wdGlvbiBvZiBsb2NhbGhvc3RcbiAgICBjb25zdCBsYW5ndWFnZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5sb2NhdGlvbj8uaG9zdG5hbWU/Lm1hdGNoKC9eKFxcd3syLDV9KVxcLigoW2EtejAtOS1dezEsNjN9XFwuW2Etel17Miw2fSl8bG9jYWxob3N0KS9pKTtcblxuICAgIC8vIGlmIHRoZXJlIGlzIG5vIG1hdGNoIChudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgaWYgKCFsYW5ndWFnZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyByZXR1cm4gdGhlIGdpdmVuIGdyb3VwIG1hdGNoXG4gICAgcmV0dXJuIGxhbmd1YWdlW2ludGVybmFsTG9va3VwRnJvbVN1YmRvbWFpbkluZGV4XTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdHMoKSB7XG4gIHJldHVybiB7XG4gICAgb3JkZXI6IFsncXVlcnlzdHJpbmcnLCAnY29va2llJywgJ2xvY2FsU3RvcmFnZScsICdzZXNzaW9uU3RvcmFnZScsICduYXZpZ2F0b3InLCAnaHRtbFRhZyddLFxuICAgIGxvb2t1cFF1ZXJ5c3RyaW5nOiAnbG5nJyxcbiAgICBsb29rdXBDb29raWU6ICdpMThuZXh0JyxcbiAgICBsb29rdXBMb2NhbFN0b3JhZ2U6ICdpMThuZXh0TG5nJyxcbiAgICBsb29rdXBTZXNzaW9uU3RvcmFnZTogJ2kxOG5leHRMbmcnLFxuICAgIC8vIGNhY2hlIHVzZXIgbGFuZ3VhZ2VcbiAgICBjYWNoZXM6IFsnbG9jYWxTdG9yYWdlJ10sXG4gICAgZXhjbHVkZUNhY2hlRm9yOiBbJ2NpbW9kZSddLFxuICAgIC8vIGNvb2tpZU1pbnV0ZXM6IDEwLFxuICAgIC8vIGNvb2tpZURvbWFpbjogJ215RG9tYWluJ1xuXG4gICAgY29udmVydERldGVjdGVkTGFuZ3VhZ2U6IGwgPT4gbFxuICB9O1xufVxuY2xhc3MgQnJvd3NlciB7XG4gIGNvbnN0cnVjdG9yKHNlcnZpY2VzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHRoaXMudHlwZSA9ICdsYW5ndWFnZURldGVjdG9yJztcbiAgICB0aGlzLmRldGVjdG9ycyA9IHt9O1xuICAgIHRoaXMuaW5pdChzZXJ2aWNlcywgb3B0aW9ucyk7XG4gIH1cbiAgaW5pdChzZXJ2aWNlcykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBsZXQgaTE4bk9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHRoaXMuc2VydmljZXMgPSBzZXJ2aWNlcyB8fCB7XG4gICAgICBsYW5ndWFnZVV0aWxzOiB7fVxuICAgIH07IC8vIHRoaXMgd2F5IHRoZSBsYW5ndWFnZSBkZXRlY3RvciBjYW4gYmUgdXNlZCB3aXRob3V0IGkxOG5leHRcbiAgICB0aGlzLm9wdGlvbnMgPSBkZWZhdWx0cyhvcHRpb25zLCB0aGlzLm9wdGlvbnMgfHwge30sIGdldERlZmF1bHRzKCkpO1xuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmNvbnZlcnREZXRlY3RlZExhbmd1YWdlID09PSAnc3RyaW5nJyAmJiB0aGlzLm9wdGlvbnMuY29udmVydERldGVjdGVkTGFuZ3VhZ2UuaW5kZXhPZignMTU4OTcnKSA+IC0xKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuY29udmVydERldGVjdGVkTGFuZ3VhZ2UgPSBsID0+IGwucmVwbGFjZSgnLScsICdfJyk7XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvb2t1cEZyb21VcmxJbmRleCkgdGhpcy5vcHRpb25zLmxvb2t1cEZyb21QYXRoSW5kZXggPSB0aGlzLm9wdGlvbnMubG9va3VwRnJvbVVybEluZGV4O1xuICAgIHRoaXMuaTE4bk9wdGlvbnMgPSBpMThuT3B0aW9ucztcbiAgICB0aGlzLmFkZERldGVjdG9yKGNvb2tpZSQxKTtcbiAgICB0aGlzLmFkZERldGVjdG9yKHF1ZXJ5c3RyaW5nKTtcbiAgICB0aGlzLmFkZERldGVjdG9yKGxvY2FsU3RvcmFnZSk7XG4gICAgdGhpcy5hZGREZXRlY3RvcihzZXNzaW9uU3RvcmFnZSk7XG4gICAgdGhpcy5hZGREZXRlY3RvcihuYXZpZ2F0b3IkMSk7XG4gICAgdGhpcy5hZGREZXRlY3RvcihodG1sVGFnKTtcbiAgICB0aGlzLmFkZERldGVjdG9yKHBhdGgpO1xuICAgIHRoaXMuYWRkRGV0ZWN0b3Ioc3ViZG9tYWluKTtcbiAgfVxuICBhZGREZXRlY3RvcihkZXRlY3Rvcikge1xuICAgIHRoaXMuZGV0ZWN0b3JzW2RldGVjdG9yLm5hbWVdID0gZGV0ZWN0b3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZGV0ZWN0KGRldGVjdGlvbk9yZGVyKSB7XG4gICAgaWYgKCFkZXRlY3Rpb25PcmRlcikgZGV0ZWN0aW9uT3JkZXIgPSB0aGlzLm9wdGlvbnMub3JkZXI7XG4gICAgbGV0IGRldGVjdGVkID0gW107XG4gICAgZGV0ZWN0aW9uT3JkZXIuZm9yRWFjaChkZXRlY3Rvck5hbWUgPT4ge1xuICAgICAgaWYgKHRoaXMuZGV0ZWN0b3JzW2RldGVjdG9yTmFtZV0pIHtcbiAgICAgICAgbGV0IGxvb2t1cCA9IHRoaXMuZGV0ZWN0b3JzW2RldGVjdG9yTmFtZV0ubG9va3VwKHRoaXMub3B0aW9ucyk7XG4gICAgICAgIGlmIChsb29rdXAgJiYgdHlwZW9mIGxvb2t1cCA9PT0gJ3N0cmluZycpIGxvb2t1cCA9IFtsb29rdXBdO1xuICAgICAgICBpZiAobG9va3VwKSBkZXRlY3RlZCA9IGRldGVjdGVkLmNvbmNhdChsb29rdXApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRldGVjdGVkID0gZGV0ZWN0ZWQubWFwKGQgPT4gdGhpcy5vcHRpb25zLmNvbnZlcnREZXRlY3RlZExhbmd1YWdlKGQpKTtcbiAgICBpZiAodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEJlc3RNYXRjaEZyb21Db2RlcykgcmV0dXJuIGRldGVjdGVkOyAvLyBuZXcgaTE4bmV4dCB2MTkuNS4wXG4gICAgcmV0dXJuIGRldGVjdGVkLmxlbmd0aCA+IDAgPyBkZXRlY3RlZFswXSA6IG51bGw7IC8vIGEgbGl0dGxlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgfVxuXG4gIGNhY2hlVXNlckxhbmd1YWdlKGxuZywgY2FjaGVzKSB7XG4gICAgaWYgKCFjYWNoZXMpIGNhY2hlcyA9IHRoaXMub3B0aW9ucy5jYWNoZXM7XG4gICAgaWYgKCFjYWNoZXMpIHJldHVybjtcbiAgICBpZiAodGhpcy5vcHRpb25zLmV4Y2x1ZGVDYWNoZUZvciAmJiB0aGlzLm9wdGlvbnMuZXhjbHVkZUNhY2hlRm9yLmluZGV4T2YobG5nKSA+IC0xKSByZXR1cm47XG4gICAgY2FjaGVzLmZvckVhY2goY2FjaGVOYW1lID0+IHtcbiAgICAgIGlmICh0aGlzLmRldGVjdG9yc1tjYWNoZU5hbWVdKSB0aGlzLmRldGVjdG9yc1tjYWNoZU5hbWVdLmNhY2hlVXNlckxhbmd1YWdlKGxuZywgdGhpcy5vcHRpb25zKTtcbiAgICB9KTtcbiAgfVxufVxuQnJvd3Nlci50eXBlID0gJ2xhbmd1YWdlRGV0ZWN0b3InO1xuXG5leHBvcnQgeyBCcm93c2VyIGFzIGRlZmF1bHQgfTtcbiIsImNvbnN0IGNvbnNvbGVMb2dnZXIgPSB7XG4gIHR5cGU6ICdsb2dnZXInLFxuICBsb2coYXJncykge1xuICAgIHRoaXMub3V0cHV0KCdsb2cnLCBhcmdzKTtcbiAgfSxcbiAgd2FybihhcmdzKSB7XG4gICAgdGhpcy5vdXRwdXQoJ3dhcm4nLCBhcmdzKTtcbiAgfSxcbiAgZXJyb3IoYXJncykge1xuICAgIHRoaXMub3V0cHV0KCdlcnJvcicsIGFyZ3MpO1xuICB9LFxuICBvdXRwdXQodHlwZSwgYXJncykge1xuICAgIGlmIChjb25zb2xlICYmIGNvbnNvbGVbdHlwZV0pIGNvbnNvbGVbdHlwZV0uYXBwbHkoY29uc29sZSwgYXJncyk7XG4gIH1cbn07XG5jbGFzcyBMb2dnZXIge1xuICBjb25zdHJ1Y3Rvcihjb25jcmV0ZUxvZ2dlcikge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB0aGlzLmluaXQoY29uY3JldGVMb2dnZXIsIG9wdGlvbnMpO1xuICB9XG4gIGluaXQoY29uY3JldGVMb2dnZXIpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgdGhpcy5wcmVmaXggPSBvcHRpb25zLnByZWZpeCB8fCAnaTE4bmV4dDonO1xuICAgIHRoaXMubG9nZ2VyID0gY29uY3JldGVMb2dnZXIgfHwgY29uc29sZUxvZ2dlcjtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuICB9XG4gIGxvZygpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcndhcmQoYXJncywgJ2xvZycsICcnLCB0cnVlKTtcbiAgfVxuICB3YXJuKCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mb3J3YXJkKGFyZ3MsICd3YXJuJywgJycsIHRydWUpO1xuICB9XG4gIGVycm9yKCkge1xuICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgYXJnc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mb3J3YXJkKGFyZ3MsICdlcnJvcicsICcnKTtcbiAgfVxuICBkZXByZWNhdGUoKSB7XG4gICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICBhcmdzW19rZXk0XSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcndhcmQoYXJncywgJ3dhcm4nLCAnV0FSTklORyBERVBSRUNBVEVEOiAnLCB0cnVlKTtcbiAgfVxuICBmb3J3YXJkKGFyZ3MsIGx2bCwgcHJlZml4LCBkZWJ1Z09ubHkpIHtcbiAgICBpZiAoZGVidWdPbmx5ICYmICF0aGlzLmRlYnVnKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSBhcmdzWzBdID0gYCR7cHJlZml4fSR7dGhpcy5wcmVmaXh9ICR7YXJnc1swXX1gO1xuICAgIHJldHVybiB0aGlzLmxvZ2dlcltsdmxdKGFyZ3MpO1xuICB9XG4gIGNyZWF0ZShtb2R1bGVOYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBMb2dnZXIodGhpcy5sb2dnZXIsIHtcbiAgICAgIC4uLntcbiAgICAgICAgcHJlZml4OiBgJHt0aGlzLnByZWZpeH06JHttb2R1bGVOYW1lfTpgXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5vcHRpb25zXG4gICAgfSk7XG4gIH1cbiAgY2xvbmUob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMub3B0aW9ucztcbiAgICBvcHRpb25zLnByZWZpeCA9IG9wdGlvbnMucHJlZml4IHx8IHRoaXMucHJlZml4O1xuICAgIHJldHVybiBuZXcgTG9nZ2VyKHRoaXMubG9nZ2VyLCBvcHRpb25zKTtcbiAgfVxufVxudmFyIGJhc2VMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbmNsYXNzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMub2JzZXJ2ZXJzID0ge307XG4gIH1cbiAgb24oZXZlbnRzLCBsaXN0ZW5lcikge1xuICAgIGV2ZW50cy5zcGxpdCgnICcpLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgaWYgKCF0aGlzLm9ic2VydmVyc1tldmVudF0pIHRoaXMub2JzZXJ2ZXJzW2V2ZW50XSA9IG5ldyBNYXAoKTtcbiAgICAgIGNvbnN0IG51bUxpc3RlbmVycyA9IHRoaXMub2JzZXJ2ZXJzW2V2ZW50XS5nZXQobGlzdGVuZXIpIHx8IDA7XG4gICAgICB0aGlzLm9ic2VydmVyc1tldmVudF0uc2V0KGxpc3RlbmVyLCBudW1MaXN0ZW5lcnMgKyAxKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvZmYoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVyc1tldmVudF0pIHJldHVybjtcbiAgICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgICBkZWxldGUgdGhpcy5vYnNlcnZlcnNbZXZlbnRdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9ic2VydmVyc1tldmVudF0uZGVsZXRlKGxpc3RlbmVyKTtcbiAgfVxuICBlbWl0KGV2ZW50KSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIGlmICh0aGlzLm9ic2VydmVyc1tldmVudF0pIHtcbiAgICAgIGNvbnN0IGNsb25lZCA9IEFycmF5LmZyb20odGhpcy5vYnNlcnZlcnNbZXZlbnRdLmVudHJpZXMoKSk7XG4gICAgICBjbG9uZWQuZm9yRWFjaChfcmVmID0+IHtcbiAgICAgICAgbGV0IFtvYnNlcnZlciwgbnVtVGltZXNBZGRlZF0gPSBfcmVmO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVRpbWVzQWRkZWQ7IGkrKykge1xuICAgICAgICAgIG9ic2VydmVyKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXJzWycqJ10pIHtcbiAgICAgIGNvbnN0IGNsb25lZCA9IEFycmF5LmZyb20odGhpcy5vYnNlcnZlcnNbJyonXS5lbnRyaWVzKCkpO1xuICAgICAgY2xvbmVkLmZvckVhY2goX3JlZjIgPT4ge1xuICAgICAgICBsZXQgW29ic2VydmVyLCBudW1UaW1lc0FkZGVkXSA9IF9yZWYyO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVRpbWVzQWRkZWQ7IGkrKykge1xuICAgICAgICAgIG9ic2VydmVyLmFwcGx5KG9ic2VydmVyLCBbZXZlbnQsIC4uLmFyZ3NdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGRlZmVyID0gKCkgPT4ge1xuICBsZXQgcmVzO1xuICBsZXQgcmVqO1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlcyA9IHJlc29sdmU7XG4gICAgcmVqID0gcmVqZWN0O1xuICB9KTtcbiAgcHJvbWlzZS5yZXNvbHZlID0gcmVzO1xuICBwcm9taXNlLnJlamVjdCA9IHJlajtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xuY29uc3QgbWFrZVN0cmluZyA9IG9iamVjdCA9PiB7XG4gIGlmIChvYmplY3QgPT0gbnVsbCkgcmV0dXJuICcnO1xuICByZXR1cm4gJycgKyBvYmplY3Q7XG59O1xuY29uc3QgY29weSA9IChhLCBzLCB0KSA9PiB7XG4gIGEuZm9yRWFjaChtID0+IHtcbiAgICBpZiAoc1ttXSkgdFttXSA9IHNbbV07XG4gIH0pO1xufTtcbmNvbnN0IGxhc3RPZlBhdGhTZXBhcmF0b3JSZWdFeHAgPSAvIyMjL2c7XG5jb25zdCBjbGVhbktleSA9IGtleSA9PiBrZXkgJiYga2V5LmluZGV4T2YoJyMjIycpID4gLTEgPyBrZXkucmVwbGFjZShsYXN0T2ZQYXRoU2VwYXJhdG9yUmVnRXhwLCAnLicpIDoga2V5O1xuY29uc3QgY2FuTm90VHJhdmVyc2VEZWVwZXIgPSBvYmplY3QgPT4gIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0ID09PSAnc3RyaW5nJztcbmNvbnN0IGdldExhc3RPZlBhdGggPSAob2JqZWN0LCBwYXRoLCBFbXB0eSkgPT4ge1xuICBjb25zdCBzdGFjayA9IHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJyA/IHBhdGggOiBwYXRoLnNwbGl0KCcuJyk7XG4gIGxldCBzdGFja0luZGV4ID0gMDtcbiAgd2hpbGUgKHN0YWNrSW5kZXggPCBzdGFjay5sZW5ndGggLSAxKSB7XG4gICAgaWYgKGNhbk5vdFRyYXZlcnNlRGVlcGVyKG9iamVjdCkpIHJldHVybiB7fTtcbiAgICBjb25zdCBrZXkgPSBjbGVhbktleShzdGFja1tzdGFja0luZGV4XSk7XG4gICAgaWYgKCFvYmplY3Rba2V5XSAmJiBFbXB0eSkgb2JqZWN0W2tleV0gPSBuZXcgRW1wdHkoKTtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iamVjdCA9IHt9O1xuICAgIH1cbiAgICArK3N0YWNrSW5kZXg7XG4gIH1cbiAgaWYgKGNhbk5vdFRyYXZlcnNlRGVlcGVyKG9iamVjdCkpIHJldHVybiB7fTtcbiAgcmV0dXJuIHtcbiAgICBvYmo6IG9iamVjdCxcbiAgICBrOiBjbGVhbktleShzdGFja1tzdGFja0luZGV4XSlcbiAgfTtcbn07XG5jb25zdCBzZXRQYXRoID0gKG9iamVjdCwgcGF0aCwgbmV3VmFsdWUpID0+IHtcbiAgY29uc3Qge1xuICAgIG9iaixcbiAgICBrXG4gIH0gPSBnZXRMYXN0T2ZQYXRoKG9iamVjdCwgcGF0aCwgT2JqZWN0KTtcbiAgaWYgKG9iaiAhPT0gdW5kZWZpbmVkIHx8IHBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgb2JqW2tdID0gbmV3VmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBlID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICBsZXQgcCA9IHBhdGguc2xpY2UoMCwgcGF0aC5sZW5ndGggLSAxKTtcbiAgbGV0IGxhc3QgPSBnZXRMYXN0T2ZQYXRoKG9iamVjdCwgcCwgT2JqZWN0KTtcbiAgd2hpbGUgKGxhc3Qub2JqID09PSB1bmRlZmluZWQgJiYgcC5sZW5ndGgpIHtcbiAgICBlID0gYCR7cFtwLmxlbmd0aCAtIDFdfS4ke2V9YDtcbiAgICBwID0gcC5zbGljZSgwLCBwLmxlbmd0aCAtIDEpO1xuICAgIGxhc3QgPSBnZXRMYXN0T2ZQYXRoKG9iamVjdCwgcCwgT2JqZWN0KTtcbiAgICBpZiAobGFzdCAmJiBsYXN0Lm9iaiAmJiB0eXBlb2YgbGFzdC5vYmpbYCR7bGFzdC5rfS4ke2V9YF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsYXN0Lm9iaiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgbGFzdC5vYmpbYCR7bGFzdC5rfS4ke2V9YF0gPSBuZXdWYWx1ZTtcbn07XG5jb25zdCBwdXNoUGF0aCA9IChvYmplY3QsIHBhdGgsIG5ld1ZhbHVlLCBjb25jYXQpID0+IHtcbiAgY29uc3Qge1xuICAgIG9iaixcbiAgICBrXG4gIH0gPSBnZXRMYXN0T2ZQYXRoKG9iamVjdCwgcGF0aCwgT2JqZWN0KTtcbiAgb2JqW2tdID0gb2JqW2tdIHx8IFtdO1xuICBvYmpba10ucHVzaChuZXdWYWx1ZSk7XG59O1xuY29uc3QgZ2V0UGF0aCA9IChvYmplY3QsIHBhdGgpID0+IHtcbiAgY29uc3Qge1xuICAgIG9iaixcbiAgICBrXG4gIH0gPSBnZXRMYXN0T2ZQYXRoKG9iamVjdCwgcGF0aCk7XG4gIGlmICghb2JqKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gb2JqW2tdO1xufTtcbmNvbnN0IGdldFBhdGhXaXRoRGVmYXVsdHMgPSAoZGF0YSwgZGVmYXVsdERhdGEsIGtleSkgPT4ge1xuICBjb25zdCB2YWx1ZSA9IGdldFBhdGgoZGF0YSwga2V5KTtcbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGdldFBhdGgoZGVmYXVsdERhdGEsIGtleSk7XG59O1xuY29uc3QgZGVlcEV4dGVuZCA9ICh0YXJnZXQsIHNvdXJjZSwgb3ZlcndyaXRlKSA9PiB7XG4gIGZvciAoY29uc3QgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICBpZiAocHJvcCAhPT0gJ19fcHJvdG9fXycgJiYgcHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgaWYgKHByb3AgaW4gdGFyZ2V0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W3Byb3BdID09PSAnc3RyaW5nJyB8fCB0YXJnZXRbcHJvcF0gaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIHNvdXJjZVtwcm9wXSA9PT0gJ3N0cmluZycgfHwgc291cmNlW3Byb3BdIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgICAgaWYgKG92ZXJ3cml0ZSkgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlZXBFeHRlbmQodGFyZ2V0W3Byb3BdLCBzb3VyY2VbcHJvcF0sIG92ZXJ3cml0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5jb25zdCByZWdleEVzY2FwZSA9IHN0ciA9PiBzdHIucmVwbGFjZSgvW1xcLVxcW1xcXVxcL1xce1xcfVxcKFxcKVxcKlxcK1xcP1xcLlxcXFxcXF5cXCRcXHxdL2csICdcXFxcJCYnKTtcbnZhciBfZW50aXR5TWFwID0ge1xuICAnJic6ICcmYW1wOycsXG4gICc8JzogJyZsdDsnLFxuICAnPic6ICcmZ3Q7JyxcbiAgJ1wiJzogJyZxdW90OycsXG4gIFwiJ1wiOiAnJiMzOTsnLFxuICAnLyc6ICcmI3gyRjsnXG59O1xuY29uc3QgZXNjYXBlID0gZGF0YSA9PiB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGF0YS5yZXBsYWNlKC9bJjw+XCInXFwvXS9nLCBzID0+IF9lbnRpdHlNYXBbc10pO1xuICB9XG4gIHJldHVybiBkYXRhO1xufTtcbmNsYXNzIFJlZ0V4cENhY2hlIHtcbiAgY29uc3RydWN0b3IoY2FwYWNpdHkpIHtcbiAgICB0aGlzLmNhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgdGhpcy5yZWdFeHBNYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5yZWdFeHBRdWV1ZSA9IFtdO1xuICB9XG4gIGdldFJlZ0V4cChwYXR0ZXJuKSB7XG4gICAgY29uc3QgcmVnRXhwRnJvbUNhY2hlID0gdGhpcy5yZWdFeHBNYXAuZ2V0KHBhdHRlcm4pO1xuICAgIGlmIChyZWdFeHBGcm9tQ2FjaGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlZ0V4cEZyb21DYWNoZTtcbiAgICB9XG4gICAgY29uc3QgcmVnRXhwTmV3ID0gbmV3IFJlZ0V4cChwYXR0ZXJuKTtcbiAgICBpZiAodGhpcy5yZWdFeHBRdWV1ZS5sZW5ndGggPT09IHRoaXMuY2FwYWNpdHkpIHtcbiAgICAgIHRoaXMucmVnRXhwTWFwLmRlbGV0ZSh0aGlzLnJlZ0V4cFF1ZXVlLnNoaWZ0KCkpO1xuICAgIH1cbiAgICB0aGlzLnJlZ0V4cE1hcC5zZXQocGF0dGVybiwgcmVnRXhwTmV3KTtcbiAgICB0aGlzLnJlZ0V4cFF1ZXVlLnB1c2gocGF0dGVybik7XG4gICAgcmV0dXJuIHJlZ0V4cE5ldztcbiAgfVxufVxuY29uc3QgY2hhcnMgPSBbJyAnLCAnLCcsICc/JywgJyEnLCAnOyddO1xuY29uc3QgbG9va3NMaWtlT2JqZWN0UGF0aFJlZ0V4cENhY2hlID0gbmV3IFJlZ0V4cENhY2hlKDIwKTtcbmNvbnN0IGxvb2tzTGlrZU9iamVjdFBhdGggPSAoa2V5LCBuc1NlcGFyYXRvciwga2V5U2VwYXJhdG9yKSA9PiB7XG4gIG5zU2VwYXJhdG9yID0gbnNTZXBhcmF0b3IgfHwgJyc7XG4gIGtleVNlcGFyYXRvciA9IGtleVNlcGFyYXRvciB8fCAnJztcbiAgY29uc3QgcG9zc2libGVDaGFycyA9IGNoYXJzLmZpbHRlcihjID0+IG5zU2VwYXJhdG9yLmluZGV4T2YoYykgPCAwICYmIGtleVNlcGFyYXRvci5pbmRleE9mKGMpIDwgMCk7XG4gIGlmIChwb3NzaWJsZUNoYXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHIgPSBsb29rc0xpa2VPYmplY3RQYXRoUmVnRXhwQ2FjaGUuZ2V0UmVnRXhwKGAoJHtwb3NzaWJsZUNoYXJzLm1hcChjID0+IGMgPT09ICc/JyA/ICdcXFxcPycgOiBjKS5qb2luKCd8Jyl9KWApO1xuICBsZXQgbWF0Y2hlZCA9ICFyLnRlc3Qoa2V5KTtcbiAgaWYgKCFtYXRjaGVkKSB7XG4gICAgY29uc3Qga2kgPSBrZXkuaW5kZXhPZihrZXlTZXBhcmF0b3IpO1xuICAgIGlmIChraSA+IDAgJiYgIXIudGVzdChrZXkuc3Vic3RyaW5nKDAsIGtpKSkpIHtcbiAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0Y2hlZDtcbn07XG5jb25zdCBkZWVwRmluZCA9IGZ1bmN0aW9uIChvYmosIHBhdGgpIHtcbiAgbGV0IGtleVNlcGFyYXRvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogJy4nO1xuICBpZiAoIW9iaikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG9ialtwYXRoXSkgcmV0dXJuIG9ialtwYXRoXTtcbiAgY29uc3QgdG9rZW5zID0gcGF0aC5zcGxpdChrZXlTZXBhcmF0b3IpO1xuICBsZXQgY3VycmVudCA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOykge1xuICAgIGlmICghY3VycmVudCB8fCB0eXBlb2YgY3VycmVudCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGxldCBuZXh0O1xuICAgIGxldCBuZXh0UGF0aCA9ICcnO1xuICAgIGZvciAobGV0IGogPSBpOyBqIDwgdG9rZW5zLmxlbmd0aDsgKytqKSB7XG4gICAgICBpZiAoaiAhPT0gaSkge1xuICAgICAgICBuZXh0UGF0aCArPSBrZXlTZXBhcmF0b3I7XG4gICAgICB9XG4gICAgICBuZXh0UGF0aCArPSB0b2tlbnNbal07XG4gICAgICBuZXh0ID0gY3VycmVudFtuZXh0UGF0aF07XG4gICAgICBpZiAobmV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddLmluZGV4T2YodHlwZW9mIG5leHQpID4gLTEgJiYgaiA8IHRva2Vucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaSArPSBqIC0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjdXJyZW50ID0gbmV4dDtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn07XG5jb25zdCBnZXRDbGVhbmVkQ29kZSA9IGNvZGUgPT4ge1xuICBpZiAoY29kZSAmJiBjb2RlLmluZGV4T2YoJ18nKSA+IDApIHJldHVybiBjb2RlLnJlcGxhY2UoJ18nLCAnLScpO1xuICByZXR1cm4gY29kZTtcbn07XG5cbmNsYXNzIFJlc291cmNlU3RvcmUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHtcbiAgICAgIG5zOiBbJ3RyYW5zbGF0aW9uJ10sXG4gICAgICBkZWZhdWx0TlM6ICd0cmFuc2xhdGlvbidcbiAgICB9O1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kYXRhID0gZGF0YSB8fCB7fTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIGlmICh0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IgPSAnLic7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIGFkZE5hbWVzcGFjZXMobnMpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm5zLmluZGV4T2YobnMpIDwgMCkge1xuICAgICAgdGhpcy5vcHRpb25zLm5zLnB1c2gobnMpO1xuICAgIH1cbiAgfVxuICByZW1vdmVOYW1lc3BhY2VzKG5zKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9wdGlvbnMubnMuaW5kZXhPZihucyk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuICBnZXRSZXNvdXJjZShsbmcsIG5zLCBrZXkpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgY29uc3Qga2V5U2VwYXJhdG9yID0gb3B0aW9ucy5rZXlTZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMua2V5U2VwYXJhdG9yIDogdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjtcbiAgICBjb25zdCBpZ25vcmVKU09OU3RydWN0dXJlID0gb3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUgOiB0aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZTtcbiAgICBsZXQgcGF0aDtcbiAgICBpZiAobG5nLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICBwYXRoID0gbG5nLnNwbGl0KCcuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGggPSBbbG5nLCBuc107XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgICBwYXRoLnB1c2goLi4ua2V5KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXlTZXBhcmF0b3IpIHtcbiAgICAgICAgICBwYXRoLnB1c2goLi4ua2V5LnNwbGl0KGtleVNlcGFyYXRvcikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGgucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGdldFBhdGgodGhpcy5kYXRhLCBwYXRoKTtcbiAgICBpZiAoIXJlc3VsdCAmJiAhbnMgJiYgIWtleSAmJiBsbmcuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgIGxuZyA9IHBhdGhbMF07XG4gICAgICBucyA9IHBhdGhbMV07XG4gICAgICBrZXkgPSBwYXRoLnNsaWNlKDIpLmpvaW4oJy4nKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCB8fCAhaWdub3JlSlNPTlN0cnVjdHVyZSB8fCB0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykgcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4gZGVlcEZpbmQodGhpcy5kYXRhICYmIHRoaXMuZGF0YVtsbmddICYmIHRoaXMuZGF0YVtsbmddW25zXSwga2V5LCBrZXlTZXBhcmF0b3IpO1xuICB9XG4gIGFkZFJlc291cmNlKGxuZywgbnMsIGtleSwgdmFsdWUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDoge1xuICAgICAgc2lsZW50OiBmYWxzZVxuICAgIH07XG4gICAgY29uc3Qga2V5U2VwYXJhdG9yID0gb3B0aW9ucy5rZXlTZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMua2V5U2VwYXJhdG9yIDogdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjtcbiAgICBsZXQgcGF0aCA9IFtsbmcsIG5zXTtcbiAgICBpZiAoa2V5KSBwYXRoID0gcGF0aC5jb25jYXQoa2V5U2VwYXJhdG9yID8ga2V5LnNwbGl0KGtleVNlcGFyYXRvcikgOiBrZXkpO1xuICAgIGlmIChsbmcuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgIHBhdGggPSBsbmcuc3BsaXQoJy4nKTtcbiAgICAgIHZhbHVlID0gbnM7XG4gICAgICBucyA9IHBhdGhbMV07XG4gICAgfVxuICAgIHRoaXMuYWRkTmFtZXNwYWNlcyhucyk7XG4gICAgc2V0UGF0aCh0aGlzLmRhdGEsIHBhdGgsIHZhbHVlKTtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB0aGlzLmVtaXQoJ2FkZGVkJywgbG5nLCBucywga2V5LCB2YWx1ZSk7XG4gIH1cbiAgYWRkUmVzb3VyY2VzKGxuZywgbnMsIHJlc291cmNlcykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7XG4gICAgICBzaWxlbnQ6IGZhbHNlXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IG0gaW4gcmVzb3VyY2VzKSB7XG4gICAgICBpZiAodHlwZW9mIHJlc291cmNlc1ttXSA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheShyZXNvdXJjZXNbbV0pKSB0aGlzLmFkZFJlc291cmNlKGxuZywgbnMsIG0sIHJlc291cmNlc1ttXSwge1xuICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB0aGlzLmVtaXQoJ2FkZGVkJywgbG5nLCBucywgcmVzb3VyY2VzKTtcbiAgfVxuICBhZGRSZXNvdXJjZUJ1bmRsZShsbmcsIG5zLCByZXNvdXJjZXMsIGRlZXAsIG92ZXJ3cml0ZSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB7XG4gICAgICBzaWxlbnQ6IGZhbHNlLFxuICAgICAgc2tpcENvcHk6IGZhbHNlXG4gICAgfTtcbiAgICBsZXQgcGF0aCA9IFtsbmcsIG5zXTtcbiAgICBpZiAobG5nLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICBwYXRoID0gbG5nLnNwbGl0KCcuJyk7XG4gICAgICBkZWVwID0gcmVzb3VyY2VzO1xuICAgICAgcmVzb3VyY2VzID0gbnM7XG4gICAgICBucyA9IHBhdGhbMV07XG4gICAgfVxuICAgIHRoaXMuYWRkTmFtZXNwYWNlcyhucyk7XG4gICAgbGV0IHBhY2sgPSBnZXRQYXRoKHRoaXMuZGF0YSwgcGF0aCkgfHwge307XG4gICAgaWYgKCFvcHRpb25zLnNraXBDb3B5KSByZXNvdXJjZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc291cmNlcykpO1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBkZWVwRXh0ZW5kKHBhY2ssIHJlc291cmNlcywgb3ZlcndyaXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFjayA9IHtcbiAgICAgICAgLi4ucGFjayxcbiAgICAgICAgLi4ucmVzb3VyY2VzXG4gICAgICB9O1xuICAgIH1cbiAgICBzZXRQYXRoKHRoaXMuZGF0YSwgcGF0aCwgcGFjayk7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkgdGhpcy5lbWl0KCdhZGRlZCcsIGxuZywgbnMsIHJlc291cmNlcyk7XG4gIH1cbiAgcmVtb3ZlUmVzb3VyY2VCdW5kbGUobG5nLCBucykge1xuICAgIGlmICh0aGlzLmhhc1Jlc291cmNlQnVuZGxlKGxuZywgbnMpKSB7XG4gICAgICBkZWxldGUgdGhpcy5kYXRhW2xuZ11bbnNdO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZU5hbWVzcGFjZXMobnMpO1xuICAgIHRoaXMuZW1pdCgncmVtb3ZlZCcsIGxuZywgbnMpO1xuICB9XG4gIGhhc1Jlc291cmNlQnVuZGxlKGxuZywgbnMpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZShsbmcsIG5zKSAhPT0gdW5kZWZpbmVkO1xuICB9XG4gIGdldFJlc291cmNlQnVuZGxlKGxuZywgbnMpIHtcbiAgICBpZiAoIW5zKSBucyA9IHRoaXMub3B0aW9ucy5kZWZhdWx0TlM7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJID09PSAndjEnKSByZXR1cm4ge1xuICAgICAgLi4ue30sXG4gICAgICAuLi50aGlzLmdldFJlc291cmNlKGxuZywgbnMpXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZShsbmcsIG5zKTtcbiAgfVxuICBnZXREYXRhQnlMYW5ndWFnZShsbmcpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhW2xuZ107XG4gIH1cbiAgaGFzTGFuZ3VhZ2VTb21lVHJhbnNsYXRpb25zKGxuZykge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFCeUxhbmd1YWdlKGxuZyk7XG4gICAgY29uc3QgbiA9IGRhdGEgJiYgT2JqZWN0LmtleXMoZGF0YSkgfHwgW107XG4gICAgcmV0dXJuICEhbi5maW5kKHYgPT4gZGF0YVt2XSAmJiBPYmplY3Qua2V5cyhkYXRhW3ZdKS5sZW5ndGggPiAwKTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgfVxufVxuXG52YXIgcG9zdFByb2Nlc3NvciA9IHtcbiAgcHJvY2Vzc29yczoge30sXG4gIGFkZFBvc3RQcm9jZXNzb3IobW9kdWxlKSB7XG4gICAgdGhpcy5wcm9jZXNzb3JzW21vZHVsZS5uYW1lXSA9IG1vZHVsZTtcbiAgfSxcbiAgaGFuZGxlKHByb2Nlc3NvcnMsIHZhbHVlLCBrZXksIG9wdGlvbnMsIHRyYW5zbGF0b3IpIHtcbiAgICBwcm9jZXNzb3JzLmZvckVhY2gocHJvY2Vzc29yID0+IHtcbiAgICAgIGlmICh0aGlzLnByb2Nlc3NvcnNbcHJvY2Vzc29yXSkgdmFsdWUgPSB0aGlzLnByb2Nlc3NvcnNbcHJvY2Vzc29yXS5wcm9jZXNzKHZhbHVlLCBrZXksIG9wdGlvbnMsIHRyYW5zbGF0b3IpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufTtcblxuY29uc3QgY2hlY2tlZExvYWRlZEZvciA9IHt9O1xuY2xhc3MgVHJhbnNsYXRvciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yKHNlcnZpY2VzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHN1cGVyKCk7XG4gICAgY29weShbJ3Jlc291cmNlU3RvcmUnLCAnbGFuZ3VhZ2VVdGlscycsICdwbHVyYWxSZXNvbHZlcicsICdpbnRlcnBvbGF0b3InLCAnYmFja2VuZENvbm5lY3RvcicsICdpMThuRm9ybWF0JywgJ3V0aWxzJ10sIHNlcnZpY2VzLCB0aGlzKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIGlmICh0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IgPSAnLic7XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyID0gYmFzZUxvZ2dlci5jcmVhdGUoJ3RyYW5zbGF0b3InKTtcbiAgfVxuICBjaGFuZ2VMYW5ndWFnZShsbmcpIHtcbiAgICBpZiAobG5nKSB0aGlzLmxhbmd1YWdlID0gbG5nO1xuICB9XG4gIGV4aXN0cyhrZXkpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgICAgaW50ZXJwb2xhdGlvbjoge31cbiAgICB9O1xuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmUoa2V5LCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmVzb2x2ZWQgJiYgcmVzb2x2ZWQucmVzICE9PSB1bmRlZmluZWQ7XG4gIH1cbiAgZXh0cmFjdEZyb21LZXkoa2V5LCBvcHRpb25zKSB7XG4gICAgbGV0IG5zU2VwYXJhdG9yID0gb3B0aW9ucy5uc1NlcGFyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5uc1NlcGFyYXRvciA6IHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtcbiAgICBpZiAobnNTZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkgbnNTZXBhcmF0b3IgPSAnOic7XG4gICAgY29uc3Qga2V5U2VwYXJhdG9yID0gb3B0aW9ucy5rZXlTZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMua2V5U2VwYXJhdG9yIDogdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjtcbiAgICBsZXQgbmFtZXNwYWNlcyA9IG9wdGlvbnMubnMgfHwgdGhpcy5vcHRpb25zLmRlZmF1bHROUyB8fCBbXTtcbiAgICBjb25zdCB3b3VsZENoZWNrRm9yTnNJbktleSA9IG5zU2VwYXJhdG9yICYmIGtleS5pbmRleE9mKG5zU2VwYXJhdG9yKSA+IC0xO1xuICAgIGNvbnN0IHNlZW1zTmF0dXJhbExhbmd1YWdlID0gIXRoaXMub3B0aW9ucy51c2VyRGVmaW5lZEtleVNlcGFyYXRvciAmJiAhb3B0aW9ucy5rZXlTZXBhcmF0b3IgJiYgIXRoaXMub3B0aW9ucy51c2VyRGVmaW5lZE5zU2VwYXJhdG9yICYmICFvcHRpb25zLm5zU2VwYXJhdG9yICYmICFsb29rc0xpa2VPYmplY3RQYXRoKGtleSwgbnNTZXBhcmF0b3IsIGtleVNlcGFyYXRvcik7XG4gICAgaWYgKHdvdWxkQ2hlY2tGb3JOc0luS2V5ICYmICFzZWVtc05hdHVyYWxMYW5ndWFnZSkge1xuICAgICAgY29uc3QgbSA9IGtleS5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtcbiAgICAgIGlmIChtICYmIG0ubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuYW1lc3BhY2VzXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJ0cyA9IGtleS5zcGxpdChuc1NlcGFyYXRvcik7XG4gICAgICBpZiAobnNTZXBhcmF0b3IgIT09IGtleVNlcGFyYXRvciB8fCBuc1NlcGFyYXRvciA9PT0ga2V5U2VwYXJhdG9yICYmIHRoaXMub3B0aW9ucy5ucy5pbmRleE9mKHBhcnRzWzBdKSA+IC0xKSBuYW1lc3BhY2VzID0gcGFydHMuc2hpZnQoKTtcbiAgICAgIGtleSA9IHBhcnRzLmpvaW4oa2V5U2VwYXJhdG9yKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJykgbmFtZXNwYWNlcyA9IFtuYW1lc3BhY2VzXTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5LFxuICAgICAgbmFtZXNwYWNlc1xuICAgIH07XG4gIH1cbiAgdHJhbnNsYXRlKGtleXMsIG9wdGlvbnMsIGxhc3RLZXkpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnICYmIHRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcikge1xuICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihhcmd1bWVudHMpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKSBvcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gICAgaWYgKGtleXMgPT09IHVuZGVmaW5lZCB8fCBrZXlzID09PSBudWxsKSByZXR1cm4gJyc7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleXMpKSBrZXlzID0gW1N0cmluZyhrZXlzKV07XG4gICAgY29uc3QgcmV0dXJuRGV0YWlscyA9IG9wdGlvbnMucmV0dXJuRGV0YWlscyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5yZXR1cm5EZXRhaWxzIDogdGhpcy5vcHRpb25zLnJldHVybkRldGFpbHM7XG4gICAgY29uc3Qga2V5U2VwYXJhdG9yID0gb3B0aW9ucy5rZXlTZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMua2V5U2VwYXJhdG9yIDogdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjtcbiAgICBjb25zdCB7XG4gICAgICBrZXksXG4gICAgICBuYW1lc3BhY2VzXG4gICAgfSA9IHRoaXMuZXh0cmFjdEZyb21LZXkoa2V5c1trZXlzLmxlbmd0aCAtIDFdLCBvcHRpb25zKTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBuYW1lc3BhY2VzW25hbWVzcGFjZXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbG5nID0gb3B0aW9ucy5sbmcgfHwgdGhpcy5sYW5ndWFnZTtcbiAgICBjb25zdCBhcHBlbmROYW1lc3BhY2VUb0NJTW9kZSA9IG9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGUgfHwgdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlO1xuICAgIGlmIChsbmcgJiYgbG5nLnRvTG93ZXJDYXNlKCkgPT09ICdjaW1vZGUnKSB7XG4gICAgICBpZiAoYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGUpIHtcbiAgICAgICAgY29uc3QgbnNTZXBhcmF0b3IgPSBvcHRpb25zLm5zU2VwYXJhdG9yIHx8IHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtcbiAgICAgICAgaWYgKHJldHVybkRldGFpbHMpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzOiBgJHtuYW1lc3BhY2V9JHtuc1NlcGFyYXRvcn0ke2tleX1gLFxuICAgICAgICAgICAgdXNlZEtleToga2V5LFxuICAgICAgICAgICAgZXhhY3RVc2VkS2V5OiBrZXksXG4gICAgICAgICAgICB1c2VkTG5nOiBsbmcsXG4gICAgICAgICAgICB1c2VkTlM6IG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHVzZWRQYXJhbXM6IHRoaXMuZ2V0VXNlZFBhcmFtc0RldGFpbHMob3B0aW9ucylcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtuYW1lc3BhY2V9JHtuc1NlcGFyYXRvcn0ke2tleX1gO1xuICAgICAgfVxuICAgICAgaWYgKHJldHVybkRldGFpbHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXM6IGtleSxcbiAgICAgICAgICB1c2VkS2V5OiBrZXksXG4gICAgICAgICAgZXhhY3RVc2VkS2V5OiBrZXksXG4gICAgICAgICAgdXNlZExuZzogbG5nLFxuICAgICAgICAgIHVzZWROUzogbmFtZXNwYWNlLFxuICAgICAgICAgIHVzZWRQYXJhbXM6IHRoaXMuZ2V0VXNlZFBhcmFtc0RldGFpbHMob3B0aW9ucylcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlKGtleXMsIG9wdGlvbnMpO1xuICAgIGxldCByZXMgPSByZXNvbHZlZCAmJiByZXNvbHZlZC5yZXM7XG4gICAgY29uc3QgcmVzVXNlZEtleSA9IHJlc29sdmVkICYmIHJlc29sdmVkLnVzZWRLZXkgfHwga2V5O1xuICAgIGNvbnN0IHJlc0V4YWN0VXNlZEtleSA9IHJlc29sdmVkICYmIHJlc29sdmVkLmV4YWN0VXNlZEtleSB8fCBrZXk7XG4gICAgY29uc3QgcmVzVHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkocmVzKTtcbiAgICBjb25zdCBub09iamVjdCA9IFsnW29iamVjdCBOdW1iZXJdJywgJ1tvYmplY3QgRnVuY3Rpb25dJywgJ1tvYmplY3QgUmVnRXhwXSddO1xuICAgIGNvbnN0IGpvaW5BcnJheXMgPSBvcHRpb25zLmpvaW5BcnJheXMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuam9pbkFycmF5cyA6IHRoaXMub3B0aW9ucy5qb2luQXJyYXlzO1xuICAgIGNvbnN0IGhhbmRsZUFzT2JqZWN0SW5JMThuRm9ybWF0ID0gIXRoaXMuaTE4bkZvcm1hdCB8fCB0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3Q7XG4gICAgY29uc3QgaGFuZGxlQXNPYmplY3QgPSB0eXBlb2YgcmVzICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcmVzICE9PSAnYm9vbGVhbicgJiYgdHlwZW9mIHJlcyAhPT0gJ251bWJlcic7XG4gICAgaWYgKGhhbmRsZUFzT2JqZWN0SW5JMThuRm9ybWF0ICYmIHJlcyAmJiBoYW5kbGVBc09iamVjdCAmJiBub09iamVjdC5pbmRleE9mKHJlc1R5cGUpIDwgMCAmJiAhKHR5cGVvZiBqb2luQXJyYXlzID09PSAnc3RyaW5nJyAmJiBBcnJheS5pc0FycmF5KHJlcykpKSB7XG4gICAgICBpZiAoIW9wdGlvbnMucmV0dXJuT2JqZWN0cyAmJiAhdGhpcy5vcHRpb25zLnJldHVybk9iamVjdHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybignYWNjZXNzaW5nIGFuIG9iamVjdCAtIGJ1dCByZXR1cm5PYmplY3RzIG9wdGlvbnMgaXMgbm90IGVuYWJsZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgciA9IHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIgPyB0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyKHJlc1VzZWRLZXksIHJlcywge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgbnM6IG5hbWVzcGFjZXNcbiAgICAgICAgfSkgOiBga2V5ICcke2tleX0gKCR7dGhpcy5sYW5ndWFnZX0pJyByZXR1cm5lZCBhbiBvYmplY3QgaW5zdGVhZCBvZiBzdHJpbmcuYDtcbiAgICAgICAgaWYgKHJldHVybkRldGFpbHMpIHtcbiAgICAgICAgICByZXNvbHZlZC5yZXMgPSByO1xuICAgICAgICAgIHJlc29sdmVkLnVzZWRQYXJhbXMgPSB0aGlzLmdldFVzZWRQYXJhbXNEZXRhaWxzKG9wdGlvbnMpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH1cbiAgICAgIGlmIChrZXlTZXBhcmF0b3IpIHtcbiAgICAgICAgY29uc3QgcmVzVHlwZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHJlcyk7XG4gICAgICAgIGNvbnN0IGNvcHkgPSByZXNUeXBlSXNBcnJheSA/IFtdIDoge307XG4gICAgICAgIGNvbnN0IG5ld0tleVRvVXNlID0gcmVzVHlwZUlzQXJyYXkgPyByZXNFeGFjdFVzZWRLZXkgOiByZXNVc2VkS2V5O1xuICAgICAgICBmb3IgKGNvbnN0IG0gaW4gcmVzKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXMsIG0pKSB7XG4gICAgICAgICAgICBjb25zdCBkZWVwS2V5ID0gYCR7bmV3S2V5VG9Vc2V9JHtrZXlTZXBhcmF0b3J9JHttfWA7XG4gICAgICAgICAgICBjb3B5W21dID0gdGhpcy50cmFuc2xhdGUoZGVlcEtleSwge1xuICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAuLi57XG4gICAgICAgICAgICAgICAgam9pbkFycmF5czogZmFsc2UsXG4gICAgICAgICAgICAgICAgbnM6IG5hbWVzcGFjZXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY29weVttXSA9PT0gZGVlcEtleSkgY29weVttXSA9IHJlc1ttXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzID0gY29weTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhhbmRsZUFzT2JqZWN0SW5JMThuRm9ybWF0ICYmIHR5cGVvZiBqb2luQXJyYXlzID09PSAnc3RyaW5nJyAmJiBBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgIHJlcyA9IHJlcy5qb2luKGpvaW5BcnJheXMpO1xuICAgICAgaWYgKHJlcykgcmVzID0gdGhpcy5leHRlbmRUcmFuc2xhdGlvbihyZXMsIGtleXMsIG9wdGlvbnMsIGxhc3RLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdXNlZERlZmF1bHQgPSBmYWxzZTtcbiAgICAgIGxldCB1c2VkS2V5ID0gZmFsc2U7XG4gICAgICBjb25zdCBuZWVkc1BsdXJhbEhhbmRsaW5nID0gb3B0aW9ucy5jb3VudCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNvdW50ICE9PSAnc3RyaW5nJztcbiAgICAgIGNvbnN0IGhhc0RlZmF1bHRWYWx1ZSA9IFRyYW5zbGF0b3IuaGFzRGVmYXVsdFZhbHVlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlU3VmZml4ID0gbmVlZHNQbHVyYWxIYW5kbGluZyA/IHRoaXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KGxuZywgb3B0aW9ucy5jb3VudCwgb3B0aW9ucykgOiAnJztcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZVN1ZmZpeE9yZGluYWxGYWxsYmFjayA9IG9wdGlvbnMub3JkaW5hbCAmJiBuZWVkc1BsdXJhbEhhbmRsaW5nID8gdGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgobG5nLCBvcHRpb25zLmNvdW50LCB7XG4gICAgICAgIG9yZGluYWw6IGZhbHNlXG4gICAgICB9KSA6ICcnO1xuICAgICAgY29uc3QgbmVlZHNaZXJvU3VmZml4TG9va3VwID0gbmVlZHNQbHVyYWxIYW5kbGluZyAmJiAhb3B0aW9ucy5vcmRpbmFsICYmIG9wdGlvbnMuY291bnQgPT09IDAgJiYgdGhpcy5wbHVyYWxSZXNvbHZlci5zaG91bGRVc2VJbnRsQXBpKCk7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBuZWVkc1plcm9TdWZmaXhMb29rdXAgJiYgb3B0aW9uc1tgZGVmYXVsdFZhbHVlJHt0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yfXplcm9gXSB8fCBvcHRpb25zW2BkZWZhdWx0VmFsdWUke2RlZmF1bHRWYWx1ZVN1ZmZpeH1gXSB8fCBvcHRpb25zW2BkZWZhdWx0VmFsdWUke2RlZmF1bHRWYWx1ZVN1ZmZpeE9yZGluYWxGYWxsYmFja31gXSB8fCBvcHRpb25zLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmICghdGhpcy5pc1ZhbGlkTG9va3VwKHJlcykgJiYgaGFzRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHVzZWREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgcmVzID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRMb29rdXAocmVzKSkge1xuICAgICAgICB1c2VkS2V5ID0gdHJ1ZTtcbiAgICAgICAgcmVzID0ga2V5O1xuICAgICAgfVxuICAgICAgY29uc3QgbWlzc2luZ0tleU5vVmFsdWVGYWxsYmFja1RvS2V5ID0gb3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkgfHwgdGhpcy5vcHRpb25zLm1pc3NpbmdLZXlOb1ZhbHVlRmFsbGJhY2tUb0tleTtcbiAgICAgIGNvbnN0IHJlc0Zvck1pc3NpbmcgPSBtaXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkgJiYgdXNlZEtleSA/IHVuZGVmaW5lZCA6IHJlcztcbiAgICAgIGNvbnN0IHVwZGF0ZU1pc3NpbmcgPSBoYXNEZWZhdWx0VmFsdWUgJiYgZGVmYXVsdFZhbHVlICE9PSByZXMgJiYgdGhpcy5vcHRpb25zLnVwZGF0ZU1pc3Npbmc7XG4gICAgICBpZiAodXNlZEtleSB8fCB1c2VkRGVmYXVsdCB8fCB1cGRhdGVNaXNzaW5nKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyh1cGRhdGVNaXNzaW5nID8gJ3VwZGF0ZUtleScgOiAnbWlzc2luZ0tleScsIGxuZywgbmFtZXNwYWNlLCBrZXksIHVwZGF0ZU1pc3NpbmcgPyBkZWZhdWx0VmFsdWUgOiByZXMpO1xuICAgICAgICBpZiAoa2V5U2VwYXJhdG9yKSB7XG4gICAgICAgICAgY29uc3QgZmsgPSB0aGlzLnJlc29sdmUoa2V5LCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAga2V5U2VwYXJhdG9yOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChmayAmJiBmay5yZXMpIHRoaXMubG9nZ2VyLndhcm4oJ1NlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbG5ncyA9IFtdO1xuICAgICAgICBjb25zdCBmYWxsYmFja0xuZ3MgPSB0aGlzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcsIG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8gPT09ICdmYWxsYmFjaycgJiYgZmFsbGJhY2tMbmdzICYmIGZhbGxiYWNrTG5nc1swXSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmFsbGJhY2tMbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsbmdzLnB1c2goZmFsbGJhY2tMbmdzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8gPT09ICdhbGwnKSB7XG4gICAgICAgICAgbG5ncyA9IHRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkob3B0aW9ucy5sbmcgfHwgdGhpcy5sYW5ndWFnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG5ncy5wdXNoKG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbmQgPSAobCwgaywgc3BlY2lmaWNEZWZhdWx0VmFsdWUpID0+IHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0Rm9yTWlzc2luZyA9IGhhc0RlZmF1bHRWYWx1ZSAmJiBzcGVjaWZpY0RlZmF1bHRWYWx1ZSAhPT0gcmVzID8gc3BlY2lmaWNEZWZhdWx0VmFsdWUgOiByZXNGb3JNaXNzaW5nO1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcihsLCBuYW1lc3BhY2UsIGssIGRlZmF1bHRGb3JNaXNzaW5nLCB1cGRhdGVNaXNzaW5nLCBvcHRpb25zKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYmFja2VuZENvbm5lY3RvciAmJiB0aGlzLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyhsLCBuYW1lc3BhY2UsIGssIGRlZmF1bHRGb3JNaXNzaW5nLCB1cGRhdGVNaXNzaW5nLCBvcHRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5lbWl0KCdtaXNzaW5nS2V5JywgbCwgbmFtZXNwYWNlLCBrLCByZXMpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1BsdXJhbHMgJiYgbmVlZHNQbHVyYWxIYW5kbGluZykge1xuICAgICAgICAgICAgbG5ncy5mb3JFYWNoKGxhbmd1YWdlID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3VmZml4ZXMgPSB0aGlzLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeGVzKGxhbmd1YWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgaWYgKG5lZWRzWmVyb1N1ZmZpeExvb2t1cCAmJiBvcHRpb25zW2BkZWZhdWx0VmFsdWUke3RoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3J9emVyb2BdICYmIHN1ZmZpeGVzLmluZGV4T2YoYCR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn16ZXJvYCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgc3VmZml4ZXMucHVzaChgJHt0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yfXplcm9gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdWZmaXhlcy5mb3JFYWNoKHN1ZmZpeCA9PiB7XG4gICAgICAgICAgICAgICAgc2VuZChbbGFuZ3VhZ2VdLCBrZXkgKyBzdWZmaXgsIG9wdGlvbnNbYGRlZmF1bHRWYWx1ZSR7c3VmZml4fWBdIHx8IGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbmQobG5ncywga2V5LCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzID0gdGhpcy5leHRlbmRUcmFuc2xhdGlvbihyZXMsIGtleXMsIG9wdGlvbnMsIHJlc29sdmVkLCBsYXN0S2V5KTtcbiAgICAgIGlmICh1c2VkS2V5ICYmIHJlcyA9PT0ga2V5ICYmIHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXkpIHJlcyA9IGAke25hbWVzcGFjZX06JHtrZXl9YDtcbiAgICAgIGlmICgodXNlZEtleSB8fCB1c2VkRGVmYXVsdCkgJiYgdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJICE9PSAndjEnKSB7XG4gICAgICAgICAgcmVzID0gdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIodGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSA/IGAke25hbWVzcGFjZX06JHtrZXl9YCA6IGtleSwgdXNlZERlZmF1bHQgPyByZXMgOiB1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcyA9IHRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyKHJlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJldHVybkRldGFpbHMpIHtcbiAgICAgIHJlc29sdmVkLnJlcyA9IHJlcztcbiAgICAgIHJlc29sdmVkLnVzZWRQYXJhbXMgPSB0aGlzLmdldFVzZWRQYXJhbXNEZXRhaWxzKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGV4dGVuZFRyYW5zbGF0aW9uKHJlcywga2V5LCBvcHRpb25zLCByZXNvbHZlZCwgbGFzdEtleSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgaWYgKHRoaXMuaTE4bkZvcm1hdCAmJiB0aGlzLmkxOG5Gb3JtYXQucGFyc2UpIHtcbiAgICAgIHJlcyA9IHRoaXMuaTE4bkZvcm1hdC5wYXJzZShyZXMsIHtcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgfSwgb3B0aW9ucy5sbmcgfHwgdGhpcy5sYW5ndWFnZSB8fCByZXNvbHZlZC51c2VkTG5nLCByZXNvbHZlZC51c2VkTlMsIHJlc29sdmVkLnVzZWRLZXksIHtcbiAgICAgICAgcmVzb2x2ZWRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuc2tpcEludGVycG9sYXRpb24pIHtcbiAgICAgIGlmIChvcHRpb25zLmludGVycG9sYXRpb24pIHRoaXMuaW50ZXJwb2xhdG9yLmluaXQoe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAuLi57XG4gICAgICAgICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgICAgICAgLi4udGhpcy5vcHRpb25zLmludGVycG9sYXRpb24sXG4gICAgICAgICAgICAuLi5vcHRpb25zLmludGVycG9sYXRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2tpcE9uVmFyaWFibGVzID0gdHlwZW9mIHJlcyA9PT0gJ3N0cmluZycgJiYgKG9wdGlvbnMgJiYgb3B0aW9ucy5pbnRlcnBvbGF0aW9uICYmIG9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMgOiB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMpO1xuICAgICAgbGV0IG5lc3RCZWY7XG4gICAgICBpZiAoc2tpcE9uVmFyaWFibGVzKSB7XG4gICAgICAgIGNvbnN0IG5iID0gcmVzLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO1xuICAgICAgICBuZXN0QmVmID0gbmIgJiYgbmIubGVuZ3RoO1xuICAgICAgfVxuICAgICAgbGV0IGRhdGEgPSBvcHRpb25zLnJlcGxhY2UgJiYgdHlwZW9mIG9wdGlvbnMucmVwbGFjZSAhPT0gJ3N0cmluZycgPyBvcHRpb25zLnJlcGxhY2UgOiBvcHRpb25zO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpIGRhdGEgPSB7XG4gICAgICAgIC4uLnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsXG4gICAgICAgIC4uLmRhdGFcbiAgICAgIH07XG4gICAgICByZXMgPSB0aGlzLmludGVycG9sYXRvci5pbnRlcnBvbGF0ZShyZXMsIGRhdGEsIG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2UgfHwgcmVzb2x2ZWQudXNlZExuZywgb3B0aW9ucyk7XG4gICAgICBpZiAoc2tpcE9uVmFyaWFibGVzKSB7XG4gICAgICAgIGNvbnN0IG5hID0gcmVzLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO1xuICAgICAgICBjb25zdCBuZXN0QWZ0ID0gbmEgJiYgbmEubGVuZ3RoO1xuICAgICAgICBpZiAobmVzdEJlZiA8IG5lc3RBZnQpIG9wdGlvbnMubmVzdCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHRpb25zLmxuZyAmJiB0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSAhPT0gJ3YxJyAmJiByZXNvbHZlZCAmJiByZXNvbHZlZC5yZXMpIG9wdGlvbnMubG5nID0gdGhpcy5sYW5ndWFnZSB8fCByZXNvbHZlZC51c2VkTG5nO1xuICAgICAgaWYgKG9wdGlvbnMubmVzdCAhPT0gZmFsc2UpIHJlcyA9IHRoaXMuaW50ZXJwb2xhdG9yLm5lc3QocmVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RLZXkgJiYgbGFzdEtleVswXSA9PT0gYXJnc1swXSAmJiAhb3B0aW9ucy5jb250ZXh0KSB7XG4gICAgICAgICAgX3RoaXMubG9nZ2VyLndhcm4oYEl0IHNlZW1zIHlvdSBhcmUgbmVzdGluZyByZWN1cnNpdmVseSBrZXk6ICR7YXJnc1swXX0gaW4ga2V5OiAke2tleVswXX1gKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXMudHJhbnNsYXRlKC4uLmFyZ3MsIGtleSk7XG4gICAgICB9LCBvcHRpb25zKTtcbiAgICAgIGlmIChvcHRpb25zLmludGVycG9sYXRpb24pIHRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCk7XG4gICAgfVxuICAgIGNvbnN0IHBvc3RQcm9jZXNzID0gb3B0aW9ucy5wb3N0UHJvY2VzcyB8fCB0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3M7XG4gICAgY29uc3QgcG9zdFByb2Nlc3Nvck5hbWVzID0gdHlwZW9mIHBvc3RQcm9jZXNzID09PSAnc3RyaW5nJyA/IFtwb3N0UHJvY2Vzc10gOiBwb3N0UHJvY2VzcztcbiAgICBpZiAocmVzICE9PSB1bmRlZmluZWQgJiYgcmVzICE9PSBudWxsICYmIHBvc3RQcm9jZXNzb3JOYW1lcyAmJiBwb3N0UHJvY2Vzc29yTmFtZXMubGVuZ3RoICYmIG9wdGlvbnMuYXBwbHlQb3N0UHJvY2Vzc29yICE9PSBmYWxzZSkge1xuICAgICAgcmVzID0gcG9zdFByb2Nlc3Nvci5oYW5kbGUocG9zdFByb2Nlc3Nvck5hbWVzLCByZXMsIGtleSwgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5wb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZCA/IHtcbiAgICAgICAgaTE4blJlc29sdmVkOiB7XG4gICAgICAgICAgLi4ucmVzb2x2ZWQsXG4gICAgICAgICAgdXNlZFBhcmFtczogdGhpcy5nZXRVc2VkUGFyYW1zRGV0YWlscyhvcHRpb25zKVxuICAgICAgICB9LFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9IDogb3B0aW9ucywgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcmVzb2x2ZShrZXlzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGxldCBmb3VuZDtcbiAgICBsZXQgdXNlZEtleTtcbiAgICBsZXQgZXhhY3RVc2VkS2V5O1xuICAgIGxldCB1c2VkTG5nO1xuICAgIGxldCB1c2VkTlM7XG4gICAgaWYgKHR5cGVvZiBrZXlzID09PSAnc3RyaW5nJykga2V5cyA9IFtrZXlzXTtcbiAgICBrZXlzLmZvckVhY2goayA9PiB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkTG9va3VwKGZvdW5kKSkgcmV0dXJuO1xuICAgICAgY29uc3QgZXh0cmFjdGVkID0gdGhpcy5leHRyYWN0RnJvbUtleShrLCBvcHRpb25zKTtcbiAgICAgIGNvbnN0IGtleSA9IGV4dHJhY3RlZC5rZXk7XG4gICAgICB1c2VkS2V5ID0ga2V5O1xuICAgICAgbGV0IG5hbWVzcGFjZXMgPSBleHRyYWN0ZWQubmFtZXNwYWNlcztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tOUykgbmFtZXNwYWNlcyA9IG5hbWVzcGFjZXMuY29uY2F0KHRoaXMub3B0aW9ucy5mYWxsYmFja05TKTtcbiAgICAgIGNvbnN0IG5lZWRzUGx1cmFsSGFuZGxpbmcgPSBvcHRpb25zLmNvdW50ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuY291bnQgIT09ICdzdHJpbmcnO1xuICAgICAgY29uc3QgbmVlZHNaZXJvU3VmZml4TG9va3VwID0gbmVlZHNQbHVyYWxIYW5kbGluZyAmJiAhb3B0aW9ucy5vcmRpbmFsICYmIG9wdGlvbnMuY291bnQgPT09IDAgJiYgdGhpcy5wbHVyYWxSZXNvbHZlci5zaG91bGRVc2VJbnRsQXBpKCk7XG4gICAgICBjb25zdCBuZWVkc0NvbnRleHRIYW5kbGluZyA9IG9wdGlvbnMuY29udGV4dCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnbnVtYmVyJykgJiYgb3B0aW9ucy5jb250ZXh0ICE9PSAnJztcbiAgICAgIGNvbnN0IGNvZGVzID0gb3B0aW9ucy5sbmdzID8gb3B0aW9ucy5sbmdzIDogdGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvcHRpb25zLmxuZyB8fCB0aGlzLmxhbmd1YWdlLCBvcHRpb25zLmZhbGxiYWNrTG5nKTtcbiAgICAgIG5hbWVzcGFjZXMuZm9yRWFjaChucyA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWRMb29rdXAoZm91bmQpKSByZXR1cm47XG4gICAgICAgIHVzZWROUyA9IG5zO1xuICAgICAgICBpZiAoIWNoZWNrZWRMb2FkZWRGb3JbYCR7Y29kZXNbMF19LSR7bnN9YF0gJiYgdGhpcy51dGlscyAmJiB0aGlzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSAmJiAhdGhpcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UodXNlZE5TKSkge1xuICAgICAgICAgIGNoZWNrZWRMb2FkZWRGb3JbYCR7Y29kZXNbMF19LSR7bnN9YF0gPSB0cnVlO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGtleSBcIiR7dXNlZEtleX1cIiBmb3IgbGFuZ3VhZ2VzIFwiJHtjb2Rlcy5qb2luKCcsICcpfVwiIHdvbid0IGdldCByZXNvbHZlZCBhcyBuYW1lc3BhY2UgXCIke3VzZWROU31cIiB3YXMgbm90IHlldCBsb2FkZWRgLCAnVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29kZXMuZm9yRWFjaChjb2RlID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkTG9va3VwKGZvdW5kKSkgcmV0dXJuO1xuICAgICAgICAgIHVzZWRMbmcgPSBjb2RlO1xuICAgICAgICAgIGNvbnN0IGZpbmFsS2V5cyA9IFtrZXldO1xuICAgICAgICAgIGlmICh0aGlzLmkxOG5Gb3JtYXQgJiYgdGhpcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMpIHtcbiAgICAgICAgICAgIHRoaXMuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKGZpbmFsS2V5cywga2V5LCBjb2RlLCBucywgb3B0aW9ucyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwbHVyYWxTdWZmaXg7XG4gICAgICAgICAgICBpZiAobmVlZHNQbHVyYWxIYW5kbGluZykgcGx1cmFsU3VmZml4ID0gdGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoY29kZSwgb3B0aW9ucy5jb3VudCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCB6ZXJvU3VmZml4ID0gYCR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn16ZXJvYDtcbiAgICAgICAgICAgIGNvbnN0IG9yZGluYWxQcmVmaXggPSBgJHt0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yfW9yZGluYWwke3RoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3J9YDtcbiAgICAgICAgICAgIGlmIChuZWVkc1BsdXJhbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICAgIGZpbmFsS2V5cy5wdXNoKGtleSArIHBsdXJhbFN1ZmZpeCk7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLm9yZGluYWwgJiYgcGx1cmFsU3VmZml4LmluZGV4T2Yob3JkaW5hbFByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBmaW5hbEtleXMucHVzaChrZXkgKyBwbHVyYWxTdWZmaXgucmVwbGFjZShvcmRpbmFsUHJlZml4LCB0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG5lZWRzWmVyb1N1ZmZpeExvb2t1cCkge1xuICAgICAgICAgICAgICAgIGZpbmFsS2V5cy5wdXNoKGtleSArIHplcm9TdWZmaXgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmVlZHNDb250ZXh0SGFuZGxpbmcpIHtcbiAgICAgICAgICAgICAgY29uc3QgY29udGV4dEtleSA9IGAke2tleX0ke3RoaXMub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yfSR7b3B0aW9ucy5jb250ZXh0fWA7XG4gICAgICAgICAgICAgIGZpbmFsS2V5cy5wdXNoKGNvbnRleHRLZXkpO1xuICAgICAgICAgICAgICBpZiAobmVlZHNQbHVyYWxIYW5kbGluZykge1xuICAgICAgICAgICAgICAgIGZpbmFsS2V5cy5wdXNoKGNvbnRleHRLZXkgKyBwbHVyYWxTdWZmaXgpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm9yZGluYWwgJiYgcGx1cmFsU3VmZml4LmluZGV4T2Yob3JkaW5hbFByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsS2V5cy5wdXNoKGNvbnRleHRLZXkgKyBwbHVyYWxTdWZmaXgucmVwbGFjZShvcmRpbmFsUHJlZml4LCB0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZWVkc1plcm9TdWZmaXhMb29rdXApIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsS2V5cy5wdXNoKGNvbnRleHRLZXkgKyB6ZXJvU3VmZml4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHBvc3NpYmxlS2V5O1xuICAgICAgICAgIHdoaWxlIChwb3NzaWJsZUtleSA9IGZpbmFsS2V5cy5wb3AoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRMb29rdXAoZm91bmQpKSB7XG4gICAgICAgICAgICAgIGV4YWN0VXNlZEtleSA9IHBvc3NpYmxlS2V5O1xuICAgICAgICAgICAgICBmb3VuZCA9IHRoaXMuZ2V0UmVzb3VyY2UoY29kZSwgbnMsIHBvc3NpYmxlS2V5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlczogZm91bmQsXG4gICAgICB1c2VkS2V5LFxuICAgICAgZXhhY3RVc2VkS2V5LFxuICAgICAgdXNlZExuZyxcbiAgICAgIHVzZWROU1xuICAgIH07XG4gIH1cbiAgaXNWYWxpZExvb2t1cChyZXMpIHtcbiAgICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgJiYgISghdGhpcy5vcHRpb25zLnJldHVybk51bGwgJiYgcmVzID09PSBudWxsKSAmJiAhKCF0aGlzLm9wdGlvbnMucmV0dXJuRW1wdHlTdHJpbmcgJiYgcmVzID09PSAnJyk7XG4gIH1cbiAgZ2V0UmVzb3VyY2UoY29kZSwgbnMsIGtleSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICBpZiAodGhpcy5pMThuRm9ybWF0ICYmIHRoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZSkgcmV0dXJuIHRoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZShjb2RlLCBucywga2V5LCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVN0b3JlLmdldFJlc291cmNlKGNvZGUsIG5zLCBrZXksIG9wdGlvbnMpO1xuICB9XG4gIGdldFVzZWRQYXJhbXNEZXRhaWxzKCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjb25zdCBvcHRpb25zS2V5cyA9IFsnZGVmYXVsdFZhbHVlJywgJ29yZGluYWwnLCAnY29udGV4dCcsICdyZXBsYWNlJywgJ2xuZycsICdsbmdzJywgJ2ZhbGxiYWNrTG5nJywgJ25zJywgJ2tleVNlcGFyYXRvcicsICduc1NlcGFyYXRvcicsICdyZXR1cm5PYmplY3RzJywgJ3JldHVybkRldGFpbHMnLCAnam9pbkFycmF5cycsICdwb3N0UHJvY2VzcycsICdpbnRlcnBvbGF0aW9uJ107XG4gICAgY29uc3QgdXNlT3B0aW9uc1JlcGxhY2VGb3JEYXRhID0gb3B0aW9ucy5yZXBsYWNlICYmIHR5cGVvZiBvcHRpb25zLnJlcGxhY2UgIT09ICdzdHJpbmcnO1xuICAgIGxldCBkYXRhID0gdXNlT3B0aW9uc1JlcGxhY2VGb3JEYXRhID8gb3B0aW9ucy5yZXBsYWNlIDogb3B0aW9ucztcbiAgICBpZiAodXNlT3B0aW9uc1JlcGxhY2VGb3JEYXRhICYmIHR5cGVvZiBvcHRpb25zLmNvdW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZGF0YS5jb3VudCA9IG9wdGlvbnMuY291bnQ7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzKSB7XG4gICAgICBkYXRhID0ge1xuICAgICAgICAuLi50aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzLFxuICAgICAgICAuLi5kYXRhXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXVzZU9wdGlvbnNSZXBsYWNlRm9yRGF0YSkge1xuICAgICAgZGF0YSA9IHtcbiAgICAgICAgLi4uZGF0YVxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIG9wdGlvbnNLZXlzKSB7XG4gICAgICAgIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIHN0YXRpYyBoYXNEZWZhdWx0VmFsdWUob3B0aW9ucykge1xuICAgIGNvbnN0IHByZWZpeCA9ICdkZWZhdWx0VmFsdWUnO1xuICAgIGZvciAoY29uc3Qgb3B0aW9uIGluIG9wdGlvbnMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgb3B0aW9uKSAmJiBwcmVmaXggPT09IG9wdGlvbi5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgJiYgdW5kZWZpbmVkICE9PSBvcHRpb25zW29wdGlvbl0pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5jb25zdCBjYXBpdGFsaXplID0gc3RyaW5nID0+IHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbmNsYXNzIExhbmd1YWdlVXRpbCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuc3VwcG9ydGVkTG5ncyA9IHRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzIHx8IGZhbHNlO1xuICAgIHRoaXMubG9nZ2VyID0gYmFzZUxvZ2dlci5jcmVhdGUoJ2xhbmd1YWdlVXRpbHMnKTtcbiAgfVxuICBnZXRTY3JpcHRQYXJ0RnJvbUNvZGUoY29kZSkge1xuICAgIGNvZGUgPSBnZXRDbGVhbmVkQ29kZShjb2RlKTtcbiAgICBpZiAoIWNvZGUgfHwgY29kZS5pbmRleE9mKCctJykgPCAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBwID0gY29kZS5zcGxpdCgnLScpO1xuICAgIGlmIChwLmxlbmd0aCA9PT0gMikgcmV0dXJuIG51bGw7XG4gICAgcC5wb3AoKTtcbiAgICBpZiAocFtwLmxlbmd0aCAtIDFdLnRvTG93ZXJDYXNlKCkgPT09ICd4JykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHAuam9pbignLScpKTtcbiAgfVxuICBnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShjb2RlKSB7XG4gICAgY29kZSA9IGdldENsZWFuZWRDb2RlKGNvZGUpO1xuICAgIGlmICghY29kZSB8fCBjb2RlLmluZGV4T2YoJy0nKSA8IDApIHJldHVybiBjb2RlO1xuICAgIGNvbnN0IHAgPSBjb2RlLnNwbGl0KCctJyk7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHBbMF0pO1xuICB9XG4gIGZvcm1hdExhbmd1YWdlQ29kZShjb2RlKSB7XG4gICAgaWYgKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJyAmJiBjb2RlLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICBjb25zdCBzcGVjaWFsQ2FzZXMgPSBbJ2hhbnMnLCAnaGFudCcsICdsYXRuJywgJ2N5cmwnLCAnY2FucycsICdtb25nJywgJ2FyYWInXTtcbiAgICAgIGxldCBwID0gY29kZS5zcGxpdCgnLScpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmcpIHtcbiAgICAgICAgcCA9IHAubWFwKHBhcnQgPT4gcGFydC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH0gZWxzZSBpZiAocC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcFswXSA9IHBbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcFsxXSA9IHBbMV0udG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKHNwZWNpYWxDYXNlcy5pbmRleE9mKHBbMV0udG9Mb3dlckNhc2UoKSkgPiAtMSkgcFsxXSA9IGNhcGl0YWxpemUocFsxXS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH0gZWxzZSBpZiAocC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcFswXSA9IHBbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHBbMV0ubGVuZ3RoID09PSAyKSBwWzFdID0gcFsxXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAocFswXSAhPT0gJ3NnbicgJiYgcFsyXS5sZW5ndGggPT09IDIpIHBbMl0gPSBwWzJdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGlmIChzcGVjaWFsQ2FzZXMuaW5kZXhPZihwWzFdLnRvTG93ZXJDYXNlKCkpID4gLTEpIHBbMV0gPSBjYXBpdGFsaXplKHBbMV0udG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmIChzcGVjaWFsQ2FzZXMuaW5kZXhPZihwWzJdLnRvTG93ZXJDYXNlKCkpID4gLTEpIHBbMl0gPSBjYXBpdGFsaXplKHBbMl0udG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcC5qb2luKCctJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY2xlYW5Db2RlIHx8IHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmcgPyBjb2RlLnRvTG93ZXJDYXNlKCkgOiBjb2RlO1xuICB9XG4gIGlzU3VwcG9ydGVkQ29kZShjb2RlKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkID09PSAnbGFuZ3VhZ2VPbmx5JyB8fCB0aGlzLm9wdGlvbnMubm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzKSB7XG4gICAgICBjb2RlID0gdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShjb2RlKTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLnN1cHBvcnRlZExuZ3MgfHwgIXRoaXMuc3VwcG9ydGVkTG5ncy5sZW5ndGggfHwgdGhpcy5zdXBwb3J0ZWRMbmdzLmluZGV4T2YoY29kZSkgPiAtMTtcbiAgfVxuICBnZXRCZXN0TWF0Y2hGcm9tQ29kZXMoY29kZXMpIHtcbiAgICBpZiAoIWNvZGVzKSByZXR1cm4gbnVsbDtcbiAgICBsZXQgZm91bmQ7XG4gICAgY29kZXMuZm9yRWFjaChjb2RlID0+IHtcbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgICAgY29uc3QgY2xlYW5lZExuZyA9IHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGNvZGUpO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyB8fCB0aGlzLmlzU3VwcG9ydGVkQ29kZShjbGVhbmVkTG5nKSkgZm91bmQgPSBjbGVhbmVkTG5nO1xuICAgIH0pO1xuICAgIGlmICghZm91bmQgJiYgdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MpIHtcbiAgICAgIGNvZGVzLmZvckVhY2goY29kZSA9PiB7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBsbmdPbmx5ID0gdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShjb2RlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNTdXBwb3J0ZWRDb2RlKGxuZ09ubHkpKSByZXR1cm4gZm91bmQgPSBsbmdPbmx5O1xuICAgICAgICBmb3VuZCA9IHRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzLmZpbmQoc3VwcG9ydGVkTG5nID0+IHtcbiAgICAgICAgICBpZiAoc3VwcG9ydGVkTG5nID09PSBsbmdPbmx5KSByZXR1cm4gc3VwcG9ydGVkTG5nO1xuICAgICAgICAgIGlmIChzdXBwb3J0ZWRMbmcuaW5kZXhPZignLScpIDwgMCAmJiBsbmdPbmx5LmluZGV4T2YoJy0nKSA8IDApIHJldHVybjtcbiAgICAgICAgICBpZiAoc3VwcG9ydGVkTG5nLmluZGV4T2YoJy0nKSA+IDAgJiYgbG5nT25seS5pbmRleE9mKCctJykgPCAwICYmIHN1cHBvcnRlZExuZy5zdWJzdHJpbmcoMCwgc3VwcG9ydGVkTG5nLmluZGV4T2YoJy0nKSkgPT09IGxuZ09ubHkpIHJldHVybiBzdXBwb3J0ZWRMbmc7XG4gICAgICAgICAgaWYgKHN1cHBvcnRlZExuZy5pbmRleE9mKGxuZ09ubHkpID09PSAwICYmIGxuZ09ubHkubGVuZ3RoID4gMSkgcmV0dXJuIHN1cHBvcnRlZExuZztcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFmb3VuZCkgZm91bmQgPSB0aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cbiAgZ2V0RmFsbGJhY2tDb2RlcyhmYWxsYmFja3MsIGNvZGUpIHtcbiAgICBpZiAoIWZhbGxiYWNrcykgcmV0dXJuIFtdO1xuICAgIGlmICh0eXBlb2YgZmFsbGJhY2tzID09PSAnZnVuY3Rpb24nKSBmYWxsYmFja3MgPSBmYWxsYmFja3MoY29kZSk7XG4gICAgaWYgKHR5cGVvZiBmYWxsYmFja3MgPT09ICdzdHJpbmcnKSBmYWxsYmFja3MgPSBbZmFsbGJhY2tzXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmYWxsYmFja3MpKSByZXR1cm4gZmFsbGJhY2tzO1xuICAgIGlmICghY29kZSkgcmV0dXJuIGZhbGxiYWNrcy5kZWZhdWx0IHx8IFtdO1xuICAgIGxldCBmb3VuZCA9IGZhbGxiYWNrc1tjb2RlXTtcbiAgICBpZiAoIWZvdW5kKSBmb3VuZCA9IGZhbGxiYWNrc1t0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShjb2RlKV07XG4gICAgaWYgKCFmb3VuZCkgZm91bmQgPSBmYWxsYmFja3NbdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoY29kZSldO1xuICAgIGlmICghZm91bmQpIGZvdW5kID0gZmFsbGJhY2tzW3RoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoY29kZSldO1xuICAgIGlmICghZm91bmQpIGZvdW5kID0gZmFsbGJhY2tzLmRlZmF1bHQ7XG4gICAgcmV0dXJuIGZvdW5kIHx8IFtdO1xuICB9XG4gIHRvUmVzb2x2ZUhpZXJhcmNoeShjb2RlLCBmYWxsYmFja0NvZGUpIHtcbiAgICBjb25zdCBmYWxsYmFja0NvZGVzID0gdGhpcy5nZXRGYWxsYmFja0NvZGVzKGZhbGxiYWNrQ29kZSB8fCB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcgfHwgW10sIGNvZGUpO1xuICAgIGNvbnN0IGNvZGVzID0gW107XG4gICAgY29uc3QgYWRkQ29kZSA9IGMgPT4ge1xuICAgICAgaWYgKCFjKSByZXR1cm47XG4gICAgICBpZiAodGhpcy5pc1N1cHBvcnRlZENvZGUoYykpIHtcbiAgICAgICAgY29kZXMucHVzaChjKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYHJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAke2N9YCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIChjb2RlLmluZGV4T2YoJy0nKSA+IC0xIHx8IGNvZGUuaW5kZXhPZignXycpID4gLTEpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmxvYWQgIT09ICdsYW5ndWFnZU9ubHknKSBhZGRDb2RlKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGNvZGUpKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9hZCAhPT0gJ2xhbmd1YWdlT25seScgJiYgdGhpcy5vcHRpb25zLmxvYWQgIT09ICdjdXJyZW50T25seScpIGFkZENvZGUodGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUoY29kZSkpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkICE9PSAnY3VycmVudE9ubHknKSBhZGRDb2RlKHRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoY29kZSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBhZGRDb2RlKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGNvZGUpKTtcbiAgICB9XG4gICAgZmFsbGJhY2tDb2Rlcy5mb3JFYWNoKGZjID0+IHtcbiAgICAgIGlmIChjb2Rlcy5pbmRleE9mKGZjKSA8IDApIGFkZENvZGUodGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoZmMpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29kZXM7XG4gIH1cbn1cblxubGV0IHNldHMgPSBbe1xuICBsbmdzOiBbJ2FjaCcsICdhaycsICdhbScsICdhcm4nLCAnYnInLCAnZmlsJywgJ2d1bicsICdsbicsICdtZmUnLCAnbWcnLCAnbWknLCAnb2MnLCAncHQnLCAncHQtQlInLCAndGcnLCAndGwnLCAndGknLCAndHInLCAndXonLCAnd2EnXSxcbiAgbnI6IFsxLCAyXSxcbiAgZmM6IDFcbn0sIHtcbiAgbG5nczogWydhZicsICdhbicsICdhc3QnLCAnYXonLCAnYmcnLCAnYm4nLCAnY2EnLCAnZGEnLCAnZGUnLCAnZGV2JywgJ2VsJywgJ2VuJywgJ2VvJywgJ2VzJywgJ2V0JywgJ2V1JywgJ2ZpJywgJ2ZvJywgJ2Z1cicsICdmeScsICdnbCcsICdndScsICdoYScsICdoaScsICdodScsICdoeScsICdpYScsICdpdCcsICdraycsICdrbicsICdrdScsICdsYicsICdtYWknLCAnbWwnLCAnbW4nLCAnbXInLCAnbmFoJywgJ25hcCcsICduYicsICduZScsICdubCcsICdubicsICdubycsICduc28nLCAncGEnLCAncGFwJywgJ3BtcycsICdwcycsICdwdC1QVCcsICdybScsICdzY28nLCAnc2UnLCAnc2knLCAnc28nLCAnc29uJywgJ3NxJywgJ3N2JywgJ3N3JywgJ3RhJywgJ3RlJywgJ3RrJywgJ3VyJywgJ3lvJ10sXG4gIG5yOiBbMSwgMl0sXG4gIGZjOiAyXG59LCB7XG4gIGxuZ3M6IFsnYXknLCAnYm8nLCAnY2dnJywgJ2ZhJywgJ2h0JywgJ2lkJywgJ2phJywgJ2pibycsICdrYScsICdrbScsICdrbycsICdreScsICdsbycsICdtcycsICdzYWgnLCAnc3UnLCAndGgnLCAndHQnLCAndWcnLCAndmknLCAnd28nLCAnemgnXSxcbiAgbnI6IFsxXSxcbiAgZmM6IDNcbn0sIHtcbiAgbG5nczogWydiZScsICdicycsICdjbnInLCAnZHonLCAnaHInLCAncnUnLCAnc3InLCAndWsnXSxcbiAgbnI6IFsxLCAyLCA1XSxcbiAgZmM6IDRcbn0sIHtcbiAgbG5nczogWydhciddLFxuICBucjogWzAsIDEsIDIsIDMsIDExLCAxMDBdLFxuICBmYzogNVxufSwge1xuICBsbmdzOiBbJ2NzJywgJ3NrJ10sXG4gIG5yOiBbMSwgMiwgNV0sXG4gIGZjOiA2XG59LCB7XG4gIGxuZ3M6IFsnY3NiJywgJ3BsJ10sXG4gIG5yOiBbMSwgMiwgNV0sXG4gIGZjOiA3XG59LCB7XG4gIGxuZ3M6IFsnY3knXSxcbiAgbnI6IFsxLCAyLCAzLCA4XSxcbiAgZmM6IDhcbn0sIHtcbiAgbG5nczogWydmciddLFxuICBucjogWzEsIDJdLFxuICBmYzogOVxufSwge1xuICBsbmdzOiBbJ2dhJ10sXG4gIG5yOiBbMSwgMiwgMywgNywgMTFdLFxuICBmYzogMTBcbn0sIHtcbiAgbG5nczogWydnZCddLFxuICBucjogWzEsIDIsIDMsIDIwXSxcbiAgZmM6IDExXG59LCB7XG4gIGxuZ3M6IFsnaXMnXSxcbiAgbnI6IFsxLCAyXSxcbiAgZmM6IDEyXG59LCB7XG4gIGxuZ3M6IFsnanYnXSxcbiAgbnI6IFswLCAxXSxcbiAgZmM6IDEzXG59LCB7XG4gIGxuZ3M6IFsna3cnXSxcbiAgbnI6IFsxLCAyLCAzLCA0XSxcbiAgZmM6IDE0XG59LCB7XG4gIGxuZ3M6IFsnbHQnXSxcbiAgbnI6IFsxLCAyLCAxMF0sXG4gIGZjOiAxNVxufSwge1xuICBsbmdzOiBbJ2x2J10sXG4gIG5yOiBbMSwgMiwgMF0sXG4gIGZjOiAxNlxufSwge1xuICBsbmdzOiBbJ21rJ10sXG4gIG5yOiBbMSwgMl0sXG4gIGZjOiAxN1xufSwge1xuICBsbmdzOiBbJ21uayddLFxuICBucjogWzAsIDEsIDJdLFxuICBmYzogMThcbn0sIHtcbiAgbG5nczogWydtdCddLFxuICBucjogWzEsIDIsIDExLCAyMF0sXG4gIGZjOiAxOVxufSwge1xuICBsbmdzOiBbJ29yJ10sXG4gIG5yOiBbMiwgMV0sXG4gIGZjOiAyXG59LCB7XG4gIGxuZ3M6IFsncm8nXSxcbiAgbnI6IFsxLCAyLCAyMF0sXG4gIGZjOiAyMFxufSwge1xuICBsbmdzOiBbJ3NsJ10sXG4gIG5yOiBbNSwgMSwgMiwgM10sXG4gIGZjOiAyMVxufSwge1xuICBsbmdzOiBbJ2hlJywgJ2l3J10sXG4gIG5yOiBbMSwgMiwgMjAsIDIxXSxcbiAgZmM6IDIyXG59XTtcbmxldCBfcnVsZXNQbHVyYWxzVHlwZXMgPSB7XG4gIDE6IG4gPT4gTnVtYmVyKG4gPiAxKSxcbiAgMjogbiA9PiBOdW1iZXIobiAhPSAxKSxcbiAgMzogbiA9PiAwLFxuICA0OiBuID0+IE51bWJlcihuICUgMTAgPT0gMSAmJiBuICUgMTAwICE9IDExID8gMCA6IG4gJSAxMCA+PSAyICYmIG4gJSAxMCA8PSA0ICYmIChuICUgMTAwIDwgMTAgfHwgbiAlIDEwMCA+PSAyMCkgPyAxIDogMiksXG4gIDU6IG4gPT4gTnVtYmVyKG4gPT0gMCA/IDAgOiBuID09IDEgPyAxIDogbiA9PSAyID8gMiA6IG4gJSAxMDAgPj0gMyAmJiBuICUgMTAwIDw9IDEwID8gMyA6IG4gJSAxMDAgPj0gMTEgPyA0IDogNSksXG4gIDY6IG4gPT4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuID49IDIgJiYgbiA8PSA0ID8gMSA6IDIpLFxuICA3OiBuID0+IE51bWJlcihuID09IDEgPyAwIDogbiAlIDEwID49IDIgJiYgbiAlIDEwIDw9IDQgJiYgKG4gJSAxMDAgPCAxMCB8fCBuICUgMTAwID49IDIwKSA/IDEgOiAyKSxcbiAgODogbiA9PiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPT0gMiA/IDEgOiBuICE9IDggJiYgbiAhPSAxMSA/IDIgOiAzKSxcbiAgOTogbiA9PiBOdW1iZXIobiA+PSAyKSxcbiAgMTA6IG4gPT4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuID09IDIgPyAxIDogbiA8IDcgPyAyIDogbiA8IDExID8gMyA6IDQpLFxuICAxMTogbiA9PiBOdW1iZXIobiA9PSAxIHx8IG4gPT0gMTEgPyAwIDogbiA9PSAyIHx8IG4gPT0gMTIgPyAxIDogbiA+IDIgJiYgbiA8IDIwID8gMiA6IDMpLFxuICAxMjogbiA9PiBOdW1iZXIobiAlIDEwICE9IDEgfHwgbiAlIDEwMCA9PSAxMSksXG4gIDEzOiBuID0+IE51bWJlcihuICE9PSAwKSxcbiAgMTQ6IG4gPT4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuID09IDIgPyAxIDogbiA9PSAzID8gMiA6IDMpLFxuICAxNTogbiA9PiBOdW1iZXIobiAlIDEwID09IDEgJiYgbiAlIDEwMCAhPSAxMSA/IDAgOiBuICUgMTAgPj0gMiAmJiAobiAlIDEwMCA8IDEwIHx8IG4gJSAxMDAgPj0gMjApID8gMSA6IDIpLFxuICAxNjogbiA9PiBOdW1iZXIobiAlIDEwID09IDEgJiYgbiAlIDEwMCAhPSAxMSA/IDAgOiBuICE9PSAwID8gMSA6IDIpLFxuICAxNzogbiA9PiBOdW1iZXIobiA9PSAxIHx8IG4gJSAxMCA9PSAxICYmIG4gJSAxMDAgIT0gMTEgPyAwIDogMSksXG4gIDE4OiBuID0+IE51bWJlcihuID09IDAgPyAwIDogbiA9PSAxID8gMSA6IDIpLFxuICAxOTogbiA9PiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPT0gMCB8fCBuICUgMTAwID4gMSAmJiBuICUgMTAwIDwgMTEgPyAxIDogbiAlIDEwMCA+IDEwICYmIG4gJSAxMDAgPCAyMCA/IDIgOiAzKSxcbiAgMjA6IG4gPT4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuID09IDAgfHwgbiAlIDEwMCA+IDAgJiYgbiAlIDEwMCA8IDIwID8gMSA6IDIpLFxuICAyMTogbiA9PiBOdW1iZXIobiAlIDEwMCA9PSAxID8gMSA6IG4gJSAxMDAgPT0gMiA/IDIgOiBuICUgMTAwID09IDMgfHwgbiAlIDEwMCA9PSA0ID8gMyA6IDApLFxuICAyMjogbiA9PiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPT0gMiA/IDEgOiAobiA8IDAgfHwgbiA+IDEwKSAmJiBuICUgMTAgPT0gMCA/IDIgOiAzKVxufTtcbmNvbnN0IG5vbkludGxWZXJzaW9ucyA9IFsndjEnLCAndjInLCAndjMnXTtcbmNvbnN0IGludGxWZXJzaW9ucyA9IFsndjQnXTtcbmNvbnN0IHN1ZmZpeGVzT3JkZXIgPSB7XG4gIHplcm86IDAsXG4gIG9uZTogMSxcbiAgdHdvOiAyLFxuICBmZXc6IDMsXG4gIG1hbnk6IDQsXG4gIG90aGVyOiA1XG59O1xuY29uc3QgY3JlYXRlUnVsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IHJ1bGVzID0ge307XG4gIHNldHMuZm9yRWFjaChzZXQgPT4ge1xuICAgIHNldC5sbmdzLmZvckVhY2gobCA9PiB7XG4gICAgICBydWxlc1tsXSA9IHtcbiAgICAgICAgbnVtYmVyczogc2V0Lm5yLFxuICAgICAgICBwbHVyYWxzOiBfcnVsZXNQbHVyYWxzVHlwZXNbc2V0LmZjXVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBydWxlcztcbn07XG5jbGFzcyBQbHVyYWxSZXNvbHZlciB7XG4gIGNvbnN0cnVjdG9yKGxhbmd1YWdlVXRpbHMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgdGhpcy5sYW5ndWFnZVV0aWxzID0gbGFuZ3VhZ2VVdGlscztcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMubG9nZ2VyID0gYmFzZUxvZ2dlci5jcmVhdGUoJ3BsdXJhbFJlc29sdmVyJyk7XG4gICAgaWYgKCghdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OIHx8IGludGxWZXJzaW9ucy5pbmNsdWRlcyh0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04pKSAmJiAodHlwZW9mIEludGwgPT09ICd1bmRlZmluZWQnIHx8ICFJbnRsLlBsdXJhbFJ1bGVzKSkge1xuICAgICAgdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OID0gJ3YzJztcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdZb3VyIGVudmlyb25tZW50IHNlZW1zIG5vdCB0byBiZSBJbnRsIEFQSSBjb21wYXRpYmxlLCB1c2UgYW4gSW50bC5QbHVyYWxSdWxlcyBwb2x5ZmlsbC4gV2lsbCBmYWxsYmFjayB0byB0aGUgY29tcGF0aWJpbGl0eUpTT04gdjMgZm9ybWF0IGhhbmRsaW5nLicpO1xuICAgIH1cbiAgICB0aGlzLnJ1bGVzID0gY3JlYXRlUnVsZXMoKTtcbiAgICB0aGlzLnBsdXJhbFJ1bGVzQ2FjaGUgPSB7fTtcbiAgfVxuICBhZGRSdWxlKGxuZywgb2JqKSB7XG4gICAgdGhpcy5ydWxlc1tsbmddID0gb2JqO1xuICB9XG4gIGNsZWFyQ2FjaGUoKSB7XG4gICAgdGhpcy5wbHVyYWxSdWxlc0NhY2hlID0ge307XG4gIH1cbiAgZ2V0UnVsZShjb2RlKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGlmICh0aGlzLnNob3VsZFVzZUludGxBcGkoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xlYW5lZENvZGUgPSBnZXRDbGVhbmVkQ29kZShjb2RlID09PSAnZGV2JyA/ICdlbicgOiBjb2RlKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IG9wdGlvbnMub3JkaW5hbCA/ICdvcmRpbmFsJyA6ICdjYXJkaW5hbCc7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNsZWFuZWRDb2RlLFxuICAgICAgICAgIHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjYWNoZUtleSBpbiB0aGlzLnBsdXJhbFJ1bGVzQ2FjaGUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wbHVyYWxSdWxlc0NhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlID0gbmV3IEludGwuUGx1cmFsUnVsZXMoY2xlYW5lZENvZGUsIHtcbiAgICAgICAgICB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBsdXJhbFJ1bGVzQ2FjaGVbY2FjaGVLZXldID0gcnVsZTtcbiAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ydWxlc1tjb2RlXSB8fCB0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShjb2RlKV07XG4gIH1cbiAgbmVlZHNQbHVyYWwoY29kZSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjb25zdCBydWxlID0gdGhpcy5nZXRSdWxlKGNvZGUsIG9wdGlvbnMpO1xuICAgIGlmICh0aGlzLnNob3VsZFVzZUludGxBcGkoKSkge1xuICAgICAgcmV0dXJuIHJ1bGUgJiYgcnVsZS5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLmxlbmd0aCA+IDE7XG4gICAgfVxuICAgIHJldHVybiBydWxlICYmIHJ1bGUubnVtYmVycy5sZW5ndGggPiAxO1xuICB9XG4gIGdldFBsdXJhbEZvcm1zT2ZLZXkoY29kZSwga2V5KSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHJldHVybiB0aGlzLmdldFN1ZmZpeGVzKGNvZGUsIG9wdGlvbnMpLm1hcChzdWZmaXggPT4gYCR7a2V5fSR7c3VmZml4fWApO1xuICB9XG4gIGdldFN1ZmZpeGVzKGNvZGUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuZ2V0UnVsZShjb2RlLCBvcHRpb25zKTtcbiAgICBpZiAoIXJ1bGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpKSB7XG4gICAgICByZXR1cm4gcnVsZS5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoKHBsdXJhbENhdGVnb3J5MSwgcGx1cmFsQ2F0ZWdvcnkyKSA9PiBzdWZmaXhlc09yZGVyW3BsdXJhbENhdGVnb3J5MV0gLSBzdWZmaXhlc09yZGVyW3BsdXJhbENhdGVnb3J5Ml0pLm1hcChwbHVyYWxDYXRlZ29yeSA9PiBgJHt0aGlzLm9wdGlvbnMucHJlcGVuZH0ke29wdGlvbnMub3JkaW5hbCA/IGBvcmRpbmFsJHt0aGlzLm9wdGlvbnMucHJlcGVuZH1gIDogJyd9JHtwbHVyYWxDYXRlZ29yeX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJ1bGUubnVtYmVycy5tYXAobnVtYmVyID0+IHRoaXMuZ2V0U3VmZml4KGNvZGUsIG51bWJlciwgb3B0aW9ucykpO1xuICB9XG4gIGdldFN1ZmZpeChjb2RlLCBjb3VudCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBjb25zdCBydWxlID0gdGhpcy5nZXRSdWxlKGNvZGUsIG9wdGlvbnMpO1xuICAgIGlmIChydWxlKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRVc2VJbnRsQXBpKCkpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMub3B0aW9ucy5wcmVwZW5kfSR7b3B0aW9ucy5vcmRpbmFsID8gYG9yZGluYWwke3RoaXMub3B0aW9ucy5wcmVwZW5kfWAgOiAnJ30ke3J1bGUuc2VsZWN0KGNvdW50KX1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlKHJ1bGUsIGNvdW50KTtcbiAgICB9XG4gICAgdGhpcy5sb2dnZXIud2Fybihgbm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAke2NvZGV9YCk7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGdldFN1ZmZpeFJldHJvQ29tcGF0aWJsZShydWxlLCBjb3VudCkge1xuICAgIGNvbnN0IGlkeCA9IHJ1bGUubm9BYnMgPyBydWxlLnBsdXJhbHMoY291bnQpIDogcnVsZS5wbHVyYWxzKE1hdGguYWJzKGNvdW50KSk7XG4gICAgbGV0IHN1ZmZpeCA9IHJ1bGUubnVtYmVyc1tpZHhdO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXggJiYgcnVsZS5udW1iZXJzLmxlbmd0aCA9PT0gMiAmJiBydWxlLm51bWJlcnNbMF0gPT09IDEpIHtcbiAgICAgIGlmIChzdWZmaXggPT09IDIpIHtcbiAgICAgICAgc3VmZml4ID0gJ3BsdXJhbCc7XG4gICAgICB9IGVsc2UgaWYgKHN1ZmZpeCA9PT0gMSkge1xuICAgICAgICBzdWZmaXggPSAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmV0dXJuU3VmZml4ID0gKCkgPT4gdGhpcy5vcHRpb25zLnByZXBlbmQgJiYgc3VmZml4LnRvU3RyaW5nKCkgPyB0aGlzLm9wdGlvbnMucHJlcGVuZCArIHN1ZmZpeC50b1N0cmluZygpIDogc3VmZml4LnRvU3RyaW5nKCk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTiA9PT0gJ3YxJykge1xuICAgICAgaWYgKHN1ZmZpeCA9PT0gMSkgcmV0dXJuICcnO1xuICAgICAgaWYgKHR5cGVvZiBzdWZmaXggPT09ICdudW1iZXInKSByZXR1cm4gYF9wbHVyYWxfJHtzdWZmaXgudG9TdHJpbmcoKX1gO1xuICAgICAgcmV0dXJuIHJldHVyblN1ZmZpeCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OID09PSAndjInKSB7XG4gICAgICByZXR1cm4gcmV0dXJuU3VmZml4KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXggJiYgcnVsZS5udW1iZXJzLmxlbmd0aCA9PT0gMiAmJiBydWxlLm51bWJlcnNbMF0gPT09IDEpIHtcbiAgICAgIHJldHVybiByZXR1cm5TdWZmaXgoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wcmVwZW5kICYmIGlkeC50b1N0cmluZygpID8gdGhpcy5vcHRpb25zLnByZXBlbmQgKyBpZHgudG9TdHJpbmcoKSA6IGlkeC50b1N0cmluZygpO1xuICB9XG4gIHNob3VsZFVzZUludGxBcGkoKSB7XG4gICAgcmV0dXJuICFub25JbnRsVmVyc2lvbnMuaW5jbHVkZXModGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKTtcbiAgfVxufVxuXG5jb25zdCBkZWVwRmluZFdpdGhEZWZhdWx0cyA9IGZ1bmN0aW9uIChkYXRhLCBkZWZhdWx0RGF0YSwga2V5KSB7XG4gIGxldCBrZXlTZXBhcmF0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICcuJztcbiAgbGV0IGlnbm9yZUpTT05TdHJ1Y3R1cmUgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gIGxldCBwYXRoID0gZ2V0UGF0aFdpdGhEZWZhdWx0cyhkYXRhLCBkZWZhdWx0RGF0YSwga2V5KTtcbiAgaWYgKCFwYXRoICYmIGlnbm9yZUpTT05TdHJ1Y3R1cmUgJiYgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXRoID0gZGVlcEZpbmQoZGF0YSwga2V5LCBrZXlTZXBhcmF0b3IpO1xuICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHBhdGggPSBkZWVwRmluZChkZWZhdWx0RGF0YSwga2V5LCBrZXlTZXBhcmF0b3IpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufTtcbmNvbnN0IHJlZ2V4U2FmZSA9IHZhbCA9PiB2YWwucmVwbGFjZSgvXFwkL2csICckJCQkJyk7XG5jbGFzcyBJbnRlcnBvbGF0b3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdGhpcy5sb2dnZXIgPSBiYXNlTG9nZ2VyLmNyZWF0ZSgnaW50ZXJwb2xhdG9yJyk7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmZvcm1hdCA9IG9wdGlvbnMuaW50ZXJwb2xhdGlvbiAmJiBvcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0IHx8ICh2YWx1ZSA9PiB2YWx1ZSk7XG4gICAgdGhpcy5pbml0KG9wdGlvbnMpO1xuICB9XG4gIGluaXQoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGlmICghb3B0aW9ucy5pbnRlcnBvbGF0aW9uKSBvcHRpb25zLmludGVycG9sYXRpb24gPSB7XG4gICAgICBlc2NhcGVWYWx1ZTogdHJ1ZVxuICAgIH07XG4gICAgY29uc3Qge1xuICAgICAgZXNjYXBlOiBlc2NhcGUkMSxcbiAgICAgIGVzY2FwZVZhbHVlLFxuICAgICAgdXNlUmF3VmFsdWVUb0VzY2FwZSxcbiAgICAgIHByZWZpeCxcbiAgICAgIHByZWZpeEVzY2FwZWQsXG4gICAgICBzdWZmaXgsXG4gICAgICBzdWZmaXhFc2NhcGVkLFxuICAgICAgZm9ybWF0U2VwYXJhdG9yLFxuICAgICAgdW5lc2NhcGVTdWZmaXgsXG4gICAgICB1bmVzY2FwZVByZWZpeCxcbiAgICAgIG5lc3RpbmdQcmVmaXgsXG4gICAgICBuZXN0aW5nUHJlZml4RXNjYXBlZCxcbiAgICAgIG5lc3RpbmdTdWZmaXgsXG4gICAgICBuZXN0aW5nU3VmZml4RXNjYXBlZCxcbiAgICAgIG5lc3RpbmdPcHRpb25zU2VwYXJhdG9yLFxuICAgICAgbWF4UmVwbGFjZXMsXG4gICAgICBhbHdheXNGb3JtYXRcbiAgICB9ID0gb3B0aW9ucy5pbnRlcnBvbGF0aW9uO1xuICAgIHRoaXMuZXNjYXBlID0gZXNjYXBlJDEgIT09IHVuZGVmaW5lZCA/IGVzY2FwZSQxIDogZXNjYXBlO1xuICAgIHRoaXMuZXNjYXBlVmFsdWUgPSBlc2NhcGVWYWx1ZSAhPT0gdW5kZWZpbmVkID8gZXNjYXBlVmFsdWUgOiB0cnVlO1xuICAgIHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZSA9IHVzZVJhd1ZhbHVlVG9Fc2NhcGUgIT09IHVuZGVmaW5lZCA/IHVzZVJhd1ZhbHVlVG9Fc2NhcGUgOiBmYWxzZTtcbiAgICB0aGlzLnByZWZpeCA9IHByZWZpeCA/IHJlZ2V4RXNjYXBlKHByZWZpeCkgOiBwcmVmaXhFc2NhcGVkIHx8ICd7eyc7XG4gICAgdGhpcy5zdWZmaXggPSBzdWZmaXggPyByZWdleEVzY2FwZShzdWZmaXgpIDogc3VmZml4RXNjYXBlZCB8fCAnfX0nO1xuICAgIHRoaXMuZm9ybWF0U2VwYXJhdG9yID0gZm9ybWF0U2VwYXJhdG9yIHx8ICcsJztcbiAgICB0aGlzLnVuZXNjYXBlUHJlZml4ID0gdW5lc2NhcGVTdWZmaXggPyAnJyA6IHVuZXNjYXBlUHJlZml4IHx8ICctJztcbiAgICB0aGlzLnVuZXNjYXBlU3VmZml4ID0gdGhpcy51bmVzY2FwZVByZWZpeCA/ICcnIDogdW5lc2NhcGVTdWZmaXggfHwgJyc7XG4gICAgdGhpcy5uZXN0aW5nUHJlZml4ID0gbmVzdGluZ1ByZWZpeCA/IHJlZ2V4RXNjYXBlKG5lc3RpbmdQcmVmaXgpIDogbmVzdGluZ1ByZWZpeEVzY2FwZWQgfHwgcmVnZXhFc2NhcGUoJyR0KCcpO1xuICAgIHRoaXMubmVzdGluZ1N1ZmZpeCA9IG5lc3RpbmdTdWZmaXggPyByZWdleEVzY2FwZShuZXN0aW5nU3VmZml4KSA6IG5lc3RpbmdTdWZmaXhFc2NhcGVkIHx8IHJlZ2V4RXNjYXBlKCcpJyk7XG4gICAgdGhpcy5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvciA9IG5lc3RpbmdPcHRpb25zU2VwYXJhdG9yIHx8ICcsJztcbiAgICB0aGlzLm1heFJlcGxhY2VzID0gbWF4UmVwbGFjZXMgfHwgMTAwMDtcbiAgICB0aGlzLmFsd2F5c0Zvcm1hdCA9IGFsd2F5c0Zvcm1hdCAhPT0gdW5kZWZpbmVkID8gYWx3YXlzRm9ybWF0IDogZmFsc2U7XG4gICAgdGhpcy5yZXNldFJlZ0V4cCgpO1xuICB9XG4gIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMpIHRoaXMuaW5pdCh0aGlzLm9wdGlvbnMpO1xuICB9XG4gIHJlc2V0UmVnRXhwKCkge1xuICAgIGNvbnN0IGdldE9yUmVzZXRSZWdFeHAgPSAoZXhpc3RpbmdSZWdFeHAsIHBhdHRlcm4pID0+IHtcbiAgICAgIGlmIChleGlzdGluZ1JlZ0V4cCAmJiBleGlzdGluZ1JlZ0V4cC5zb3VyY2UgPT09IHBhdHRlcm4pIHtcbiAgICAgICAgZXhpc3RpbmdSZWdFeHAubGFzdEluZGV4ID0gMDtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nUmVnRXhwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocGF0dGVybiwgJ2cnKTtcbiAgICB9O1xuICAgIHRoaXMucmVnZXhwID0gZ2V0T3JSZXNldFJlZ0V4cCh0aGlzLnJlZ2V4cCwgYCR7dGhpcy5wcmVmaXh9KC4rPykke3RoaXMuc3VmZml4fWApO1xuICAgIHRoaXMucmVnZXhwVW5lc2NhcGUgPSBnZXRPclJlc2V0UmVnRXhwKHRoaXMucmVnZXhwVW5lc2NhcGUsIGAke3RoaXMucHJlZml4fSR7dGhpcy51bmVzY2FwZVByZWZpeH0oLis/KSR7dGhpcy51bmVzY2FwZVN1ZmZpeH0ke3RoaXMuc3VmZml4fWApO1xuICAgIHRoaXMubmVzdGluZ1JlZ2V4cCA9IGdldE9yUmVzZXRSZWdFeHAodGhpcy5uZXN0aW5nUmVnZXhwLCBgJHt0aGlzLm5lc3RpbmdQcmVmaXh9KC4rPykke3RoaXMubmVzdGluZ1N1ZmZpeH1gKTtcbiAgfVxuICBpbnRlcnBvbGF0ZShzdHIsIGRhdGEsIGxuZywgb3B0aW9ucykge1xuICAgIGxldCBtYXRjaDtcbiAgICBsZXQgdmFsdWU7XG4gICAgbGV0IHJlcGxhY2VzO1xuICAgIGNvbnN0IGRlZmF1bHREYXRhID0gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uICYmIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMgfHwge307XG4gICAgY29uc3QgaGFuZGxlRm9ybWF0ID0ga2V5ID0+IHtcbiAgICAgIGlmIChrZXkuaW5kZXhPZih0aGlzLmZvcm1hdFNlcGFyYXRvcikgPCAwKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBkZWVwRmluZFdpdGhEZWZhdWx0cyhkYXRhLCBkZWZhdWx0RGF0YSwga2V5LCB0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLCB0aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFsd2F5c0Zvcm1hdCA/IHRoaXMuZm9ybWF0KHBhdGgsIHVuZGVmaW5lZCwgbG5nLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgIGludGVycG9sYXRpb25rZXk6IGtleVxuICAgICAgICB9KSA6IHBhdGg7XG4gICAgICB9XG4gICAgICBjb25zdCBwID0ga2V5LnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKTtcbiAgICAgIGNvbnN0IGsgPSBwLnNoaWZ0KCkudHJpbSgpO1xuICAgICAgY29uc3QgZiA9IHAuam9pbih0aGlzLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KGRlZXBGaW5kV2l0aERlZmF1bHRzKGRhdGEsIGRlZmF1bHREYXRhLCBrLCB0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLCB0aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSksIGYsIGxuZywge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAuLi5kYXRhLFxuICAgICAgICBpbnRlcnBvbGF0aW9ua2V5OiBrXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMucmVzZXRSZWdFeHAoKTtcbiAgICBjb25zdCBtaXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIgPSBvcHRpb25zICYmIG9wdGlvbnMubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyIHx8IHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXI7XG4gICAgY29uc3Qgc2tpcE9uVmFyaWFibGVzID0gb3B0aW9ucyAmJiBvcHRpb25zLmludGVycG9sYXRpb24gJiYgb3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyA6IHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztcbiAgICBjb25zdCB0b2RvcyA9IFt7XG4gICAgICByZWdleDogdGhpcy5yZWdleHBVbmVzY2FwZSxcbiAgICAgIHNhZmVWYWx1ZTogdmFsID0+IHJlZ2V4U2FmZSh2YWwpXG4gICAgfSwge1xuICAgICAgcmVnZXg6IHRoaXMucmVnZXhwLFxuICAgICAgc2FmZVZhbHVlOiB2YWwgPT4gdGhpcy5lc2NhcGVWYWx1ZSA/IHJlZ2V4U2FmZSh0aGlzLmVzY2FwZSh2YWwpKSA6IHJlZ2V4U2FmZSh2YWwpXG4gICAgfV07XG4gICAgdG9kb3MuZm9yRWFjaCh0b2RvID0+IHtcbiAgICAgIHJlcGxhY2VzID0gMDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IHRvZG8ucmVnZXguZXhlYyhzdHIpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRWYXIgPSBtYXRjaFsxXS50cmltKCk7XG4gICAgICAgIHZhbHVlID0gaGFuZGxlRm9ybWF0KG1hdGNoZWRWYXIpO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgbWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gbWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyKHN0ciwgbWF0Y2gsIG9wdGlvbnMpO1xuICAgICAgICAgICAgdmFsdWUgPSB0eXBlb2YgdGVtcCA9PT0gJ3N0cmluZycgPyB0ZW1wIDogJyc7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCBtYXRjaGVkVmFyKSkge1xuICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgICB9IGVsc2UgaWYgKHNraXBPblZhcmlhYmxlcykge1xuICAgICAgICAgICAgdmFsdWUgPSBtYXRjaFswXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSAke21hdGNoZWRWYXJ9IGZvciBpbnRlcnBvbGF0aW5nICR7c3RyfWApO1xuICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyAmJiAhdGhpcy51c2VSYXdWYWx1ZVRvRXNjYXBlKSB7XG4gICAgICAgICAgdmFsdWUgPSBtYWtlU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzYWZlVmFsdWUgPSB0b2RvLnNhZmVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKG1hdGNoWzBdLCBzYWZlVmFsdWUpO1xuICAgICAgICBpZiAoc2tpcE9uVmFyaWFibGVzKSB7XG4gICAgICAgICAgdG9kby5yZWdleC5sYXN0SW5kZXggKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIHRvZG8ucmVnZXgubGFzdEluZGV4IC09IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2RvLnJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmVwbGFjZXMrKztcbiAgICAgICAgaWYgKHJlcGxhY2VzID49IHRoaXMubWF4UmVwbGFjZXMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgbmVzdChzdHIsIGZjKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIGxldCBtYXRjaDtcbiAgICBsZXQgdmFsdWU7XG4gICAgbGV0IGNsb25lZE9wdGlvbnM7XG4gICAgY29uc3QgaGFuZGxlSGFzT3B0aW9ucyA9IChrZXksIGluaGVyaXRlZE9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IHNlcCA9IHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7XG4gICAgICBpZiAoa2V5LmluZGV4T2Yoc2VwKSA8IDApIHJldHVybiBrZXk7XG4gICAgICBjb25zdCBjID0ga2V5LnNwbGl0KG5ldyBSZWdFeHAoYCR7c2VwfVsgXSp7YCkpO1xuICAgICAgbGV0IG9wdGlvbnNTdHJpbmcgPSBgeyR7Y1sxXX1gO1xuICAgICAga2V5ID0gY1swXTtcbiAgICAgIG9wdGlvbnNTdHJpbmcgPSB0aGlzLmludGVycG9sYXRlKG9wdGlvbnNTdHJpbmcsIGNsb25lZE9wdGlvbnMpO1xuICAgICAgY29uc3QgbWF0Y2hlZFNpbmdsZVF1b3RlcyA9IG9wdGlvbnNTdHJpbmcubWF0Y2goLycvZyk7XG4gICAgICBjb25zdCBtYXRjaGVkRG91YmxlUXVvdGVzID0gb3B0aW9uc1N0cmluZy5tYXRjaCgvXCIvZyk7XG4gICAgICBpZiAobWF0Y2hlZFNpbmdsZVF1b3RlcyAmJiBtYXRjaGVkU2luZ2xlUXVvdGVzLmxlbmd0aCAlIDIgPT09IDAgJiYgIW1hdGNoZWREb3VibGVRdW90ZXMgfHwgbWF0Y2hlZERvdWJsZVF1b3Rlcy5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICAgIG9wdGlvbnNTdHJpbmcgPSBvcHRpb25zU3RyaW5nLnJlcGxhY2UoLycvZywgJ1wiJyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjbG9uZWRPcHRpb25zID0gSlNPTi5wYXJzZShvcHRpb25zU3RyaW5nKTtcbiAgICAgICAgaWYgKGluaGVyaXRlZE9wdGlvbnMpIGNsb25lZE9wdGlvbnMgPSB7XG4gICAgICAgICAgLi4uaW5oZXJpdGVkT3B0aW9ucyxcbiAgICAgICAgICAuLi5jbG9uZWRPcHRpb25zXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGZhaWxlZCBwYXJzaW5nIG9wdGlvbnMgc3RyaW5nIGluIG5lc3RpbmcgZm9yIGtleSAke2tleX1gLCBlKTtcbiAgICAgICAgcmV0dXJuIGAke2tleX0ke3NlcH0ke29wdGlvbnNTdHJpbmd9YDtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRpb25zLmRlZmF1bHRWYWx1ZSAmJiBjbG9uZWRPcHRpb25zLmRlZmF1bHRWYWx1ZS5pbmRleE9mKHRoaXMucHJlZml4KSA+IC0xKSBkZWxldGUgY2xvbmVkT3B0aW9ucy5kZWZhdWx0VmFsdWU7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgd2hpbGUgKG1hdGNoID0gdGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWMoc3RyKSkge1xuICAgICAgbGV0IGZvcm1hdHRlcnMgPSBbXTtcbiAgICAgIGNsb25lZE9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICAgIH07XG4gICAgICBjbG9uZWRPcHRpb25zID0gY2xvbmVkT3B0aW9ucy5yZXBsYWNlICYmIHR5cGVvZiBjbG9uZWRPcHRpb25zLnJlcGxhY2UgIT09ICdzdHJpbmcnID8gY2xvbmVkT3B0aW9ucy5yZXBsYWNlIDogY2xvbmVkT3B0aW9ucztcbiAgICAgIGNsb25lZE9wdGlvbnMuYXBwbHlQb3N0UHJvY2Vzc29yID0gZmFsc2U7XG4gICAgICBkZWxldGUgY2xvbmVkT3B0aW9ucy5kZWZhdWx0VmFsdWU7XG4gICAgICBsZXQgZG9SZWR1Y2UgPSBmYWxzZTtcbiAgICAgIGlmIChtYXRjaFswXS5pbmRleE9mKHRoaXMuZm9ybWF0U2VwYXJhdG9yKSAhPT0gLTEgJiYgIS97Lip9Ly50ZXN0KG1hdGNoWzFdKSkge1xuICAgICAgICBjb25zdCByID0gbWF0Y2hbMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcChlbGVtID0+IGVsZW0udHJpbSgpKTtcbiAgICAgICAgbWF0Y2hbMV0gPSByLnNoaWZ0KCk7XG4gICAgICAgIGZvcm1hdHRlcnMgPSByO1xuICAgICAgICBkb1JlZHVjZSA9IHRydWU7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IGZjKGhhbmRsZUhhc09wdGlvbnMuY2FsbCh0aGlzLCBtYXRjaFsxXS50cmltKCksIGNsb25lZE9wdGlvbnMpLCBjbG9uZWRPcHRpb25zKTtcbiAgICAgIGlmICh2YWx1ZSAmJiBtYXRjaFswXSA9PT0gc3RyICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB2YWx1ZSA9IG1ha2VTdHJpbmcodmFsdWUpO1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBtaXNzZWQgdG8gcmVzb2x2ZSAke21hdGNoWzFdfSBmb3IgbmVzdGluZyAke3N0cn1gKTtcbiAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICAgIGlmIChkb1JlZHVjZSkge1xuICAgICAgICB2YWx1ZSA9IGZvcm1hdHRlcnMucmVkdWNlKCh2LCBmKSA9PiB0aGlzLmZvcm1hdCh2LCBmLCBvcHRpb25zLmxuZywge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgaW50ZXJwb2xhdGlvbmtleTogbWF0Y2hbMV0udHJpbSgpXG4gICAgICAgIH0pLCB2YWx1ZS50cmltKCkpO1xuICAgICAgfVxuICAgICAgc3RyID0gc3RyLnJlcGxhY2UobWF0Y2hbMF0sIHZhbHVlKTtcbiAgICAgIHRoaXMucmVnZXhwLmxhc3RJbmRleCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuY29uc3QgcGFyc2VGb3JtYXRTdHIgPSBmb3JtYXRTdHIgPT4ge1xuICBsZXQgZm9ybWF0TmFtZSA9IGZvcm1hdFN0ci50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgY29uc3QgZm9ybWF0T3B0aW9ucyA9IHt9O1xuICBpZiAoZm9ybWF0U3RyLmluZGV4T2YoJygnKSA+IC0xKSB7XG4gICAgY29uc3QgcCA9IGZvcm1hdFN0ci5zcGxpdCgnKCcpO1xuICAgIGZvcm1hdE5hbWUgPSBwWzBdLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IG9wdFN0ciA9IHBbMV0uc3Vic3RyaW5nKDAsIHBbMV0ubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGZvcm1hdE5hbWUgPT09ICdjdXJyZW5jeScgJiYgb3B0U3RyLmluZGV4T2YoJzonKSA8IDApIHtcbiAgICAgIGlmICghZm9ybWF0T3B0aW9ucy5jdXJyZW5jeSkgZm9ybWF0T3B0aW9ucy5jdXJyZW5jeSA9IG9wdFN0ci50cmltKCk7XG4gICAgfSBlbHNlIGlmIChmb3JtYXROYW1lID09PSAncmVsYXRpdmV0aW1lJyAmJiBvcHRTdHIuaW5kZXhPZignOicpIDwgMCkge1xuICAgICAgaWYgKCFmb3JtYXRPcHRpb25zLnJhbmdlKSBmb3JtYXRPcHRpb25zLnJhbmdlID0gb3B0U3RyLnRyaW0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0cyA9IG9wdFN0ci5zcGxpdCgnOycpO1xuICAgICAgb3B0cy5mb3JFYWNoKG9wdCA9PiB7XG4gICAgICAgIGlmIChvcHQpIHtcbiAgICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IG9wdC5zcGxpdCgnOicpO1xuICAgICAgICAgIGNvbnN0IHZhbCA9IHJlc3Quam9pbignOicpLnRyaW0oKS5yZXBsYWNlKC9eJyt8JyskL2csICcnKTtcbiAgICAgICAgICBjb25zdCB0cmltbWVkS2V5ID0ga2V5LnRyaW0oKTtcbiAgICAgICAgICBpZiAoIWZvcm1hdE9wdGlvbnNbdHJpbW1lZEtleV0pIGZvcm1hdE9wdGlvbnNbdHJpbW1lZEtleV0gPSB2YWw7XG4gICAgICAgICAgaWYgKHZhbCA9PT0gJ2ZhbHNlJykgZm9ybWF0T3B0aW9uc1t0cmltbWVkS2V5XSA9IGZhbHNlO1xuICAgICAgICAgIGlmICh2YWwgPT09ICd0cnVlJykgZm9ybWF0T3B0aW9uc1t0cmltbWVkS2V5XSA9IHRydWU7XG4gICAgICAgICAgaWYgKCFpc05hTih2YWwpKSBmb3JtYXRPcHRpb25zW3RyaW1tZWRLZXldID0gcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGZvcm1hdE5hbWUsXG4gICAgZm9ybWF0T3B0aW9uc1xuICB9O1xufTtcbmNvbnN0IGNyZWF0ZUNhY2hlZEZvcm1hdHRlciA9IGZuID0+IHtcbiAgY29uc3QgY2FjaGUgPSB7fTtcbiAgcmV0dXJuICh2YWwsIGxuZywgb3B0aW9ucykgPT4ge1xuICAgIGxldCBvcHRGb3JDYWNoZSA9IG9wdGlvbnM7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5pbnRlcnBvbGF0aW9ua2V5ICYmIG9wdGlvbnMuZm9ybWF0UGFyYW1zICYmIG9wdGlvbnMuZm9ybWF0UGFyYW1zW29wdGlvbnMuaW50ZXJwb2xhdGlvbmtleV0gJiYgb3B0aW9uc1tvcHRpb25zLmludGVycG9sYXRpb25rZXldKSB7XG4gICAgICBvcHRGb3JDYWNoZSA9IHtcbiAgICAgICAgLi4ub3B0Rm9yQ2FjaGUsXG4gICAgICAgIFtvcHRpb25zLmludGVycG9sYXRpb25rZXldOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IGxuZyArIEpTT04uc3RyaW5naWZ5KG9wdEZvckNhY2hlKTtcbiAgICBsZXQgZm9ybWF0dGVyID0gY2FjaGVba2V5XTtcbiAgICBpZiAoIWZvcm1hdHRlcikge1xuICAgICAgZm9ybWF0dGVyID0gZm4oZ2V0Q2xlYW5lZENvZGUobG5nKSwgb3B0aW9ucyk7XG4gICAgICBjYWNoZVtrZXldID0gZm9ybWF0dGVyO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybWF0dGVyKHZhbCk7XG4gIH07XG59O1xuY2xhc3MgRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHRoaXMubG9nZ2VyID0gYmFzZUxvZ2dlci5jcmVhdGUoJ2Zvcm1hdHRlcicpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5mb3JtYXRzID0ge1xuICAgICAgbnVtYmVyOiBjcmVhdGVDYWNoZWRGb3JtYXR0ZXIoKGxuZywgb3B0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsbmcsIHtcbiAgICAgICAgICAuLi5vcHRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWwgPT4gZm9ybWF0dGVyLmZvcm1hdCh2YWwpO1xuICAgICAgfSksXG4gICAgICBjdXJyZW5jeTogY3JlYXRlQ2FjaGVkRm9ybWF0dGVyKChsbmcsIG9wdCkgPT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG5nLCB7XG4gICAgICAgICAgLi4ub3B0LFxuICAgICAgICAgIHN0eWxlOiAnY3VycmVuY3knXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmFsID0+IGZvcm1hdHRlci5mb3JtYXQodmFsKTtcbiAgICAgIH0pLFxuICAgICAgZGF0ZXRpbWU6IGNyZWF0ZUNhY2hlZEZvcm1hdHRlcigobG5nLCBvcHQpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG5nLCB7XG4gICAgICAgICAgLi4ub3B0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmFsID0+IGZvcm1hdHRlci5mb3JtYXQodmFsKTtcbiAgICAgIH0pLFxuICAgICAgcmVsYXRpdmV0aW1lOiBjcmVhdGVDYWNoZWRGb3JtYXR0ZXIoKGxuZywgb3B0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsbmcsIHtcbiAgICAgICAgICAuLi5vcHRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWwgPT4gZm9ybWF0dGVyLmZvcm1hdCh2YWwsIG9wdC5yYW5nZSB8fCAnZGF5Jyk7XG4gICAgICB9KSxcbiAgICAgIGxpc3Q6IGNyZWF0ZUNhY2hlZEZvcm1hdHRlcigobG5nLCBvcHQpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuTGlzdEZvcm1hdChsbmcsIHtcbiAgICAgICAgICAuLi5vcHRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWwgPT4gZm9ybWF0dGVyLmZvcm1hdCh2YWwpO1xuICAgICAgfSlcbiAgICB9O1xuICAgIHRoaXMuaW5pdChvcHRpb25zKTtcbiAgfVxuICBpbml0KHNlcnZpY2VzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHtcbiAgICAgIGludGVycG9sYXRpb246IHt9XG4gICAgfTtcbiAgICBjb25zdCBpT3B0cyA9IG9wdGlvbnMuaW50ZXJwb2xhdGlvbjtcbiAgICB0aGlzLmZvcm1hdFNlcGFyYXRvciA9IGlPcHRzLmZvcm1hdFNlcGFyYXRvciA/IGlPcHRzLmZvcm1hdFNlcGFyYXRvciA6IGlPcHRzLmZvcm1hdFNlcGFyYXRvciB8fCAnLCc7XG4gIH1cbiAgYWRkKG5hbWUsIGZjKSB7XG4gICAgdGhpcy5mb3JtYXRzW25hbWUudG9Mb3dlckNhc2UoKS50cmltKCldID0gZmM7XG4gIH1cbiAgYWRkQ2FjaGVkKG5hbWUsIGZjKSB7XG4gICAgdGhpcy5mb3JtYXRzW25hbWUudG9Mb3dlckNhc2UoKS50cmltKCldID0gY3JlYXRlQ2FjaGVkRm9ybWF0dGVyKGZjKTtcbiAgfVxuICBmb3JtYXQodmFsdWUsIGZvcm1hdCwgbG5nKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIGNvbnN0IGZvcm1hdHMgPSBmb3JtYXQuc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpO1xuICAgIGlmIChmb3JtYXRzLmxlbmd0aCA+IDEgJiYgZm9ybWF0c1swXS5pbmRleE9mKCcoJykgPiAxICYmIGZvcm1hdHNbMF0uaW5kZXhPZignKScpIDwgMCAmJiBmb3JtYXRzLmZpbmQoZiA9PiBmLmluZGV4T2YoJyknKSA+IC0xKSkge1xuICAgICAgY29uc3QgbGFzdEluZGV4ID0gZm9ybWF0cy5maW5kSW5kZXgoZiA9PiBmLmluZGV4T2YoJyknKSA+IC0xKTtcbiAgICAgIGZvcm1hdHNbMF0gPSBbZm9ybWF0c1swXSwgLi4uZm9ybWF0cy5zcGxpY2UoMSwgbGFzdEluZGV4KV0uam9pbih0aGlzLmZvcm1hdFNlcGFyYXRvcik7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1hdHMucmVkdWNlKChtZW0sIGYpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZm9ybWF0TmFtZSxcbiAgICAgICAgZm9ybWF0T3B0aW9uc1xuICAgICAgfSA9IHBhcnNlRm9ybWF0U3RyKGYpO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0c1tmb3JtYXROYW1lXSkge1xuICAgICAgICBsZXQgZm9ybWF0dGVkID0gbWVtO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHZhbE9wdGlvbnMgPSBvcHRpb25zICYmIG9wdGlvbnMuZm9ybWF0UGFyYW1zICYmIG9wdGlvbnMuZm9ybWF0UGFyYW1zW29wdGlvbnMuaW50ZXJwb2xhdGlvbmtleV0gfHwge307XG4gICAgICAgICAgY29uc3QgbCA9IHZhbE9wdGlvbnMubG9jYWxlIHx8IHZhbE9wdGlvbnMubG5nIHx8IG9wdGlvbnMubG9jYWxlIHx8IG9wdGlvbnMubG5nIHx8IGxuZztcbiAgICAgICAgICBmb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdHNbZm9ybWF0TmFtZV0obWVtLCBsLCB7XG4gICAgICAgICAgICAuLi5mb3JtYXRPcHRpb25zLFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIC4uLnZhbE9wdGlvbnNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0dGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgdGhlcmUgd2FzIG5vIGZvcm1hdCBmdW5jdGlvbiBmb3IgJHtmb3JtYXROYW1lfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1lbTtcbiAgICB9LCB2YWx1ZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jb25zdCByZW1vdmVQZW5kaW5nID0gKHEsIG5hbWUpID0+IHtcbiAgaWYgKHEucGVuZGluZ1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVsZXRlIHEucGVuZGluZ1tuYW1lXTtcbiAgICBxLnBlbmRpbmdDb3VudC0tO1xuICB9XG59O1xuY2xhc3MgQ29ubmVjdG9yIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IoYmFja2VuZCwgc3RvcmUsIHNlcnZpY2VzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5iYWNrZW5kID0gYmFja2VuZDtcbiAgICB0aGlzLnN0b3JlID0gc3RvcmU7XG4gICAgdGhpcy5zZXJ2aWNlcyA9IHNlcnZpY2VzO1xuICAgIHRoaXMubGFuZ3VhZ2VVdGlscyA9IHNlcnZpY2VzLmxhbmd1YWdlVXRpbHM7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXIuY3JlYXRlKCdiYWNrZW5kQ29ubmVjdG9yJyk7XG4gICAgdGhpcy53YWl0aW5nUmVhZHMgPSBbXTtcbiAgICB0aGlzLm1heFBhcmFsbGVsUmVhZHMgPSBvcHRpb25zLm1heFBhcmFsbGVsUmVhZHMgfHwgMTA7XG4gICAgdGhpcy5yZWFkaW5nQ2FsbHMgPSAwO1xuICAgIHRoaXMubWF4UmV0cmllcyA9IG9wdGlvbnMubWF4UmV0cmllcyA+PSAwID8gb3B0aW9ucy5tYXhSZXRyaWVzIDogNTtcbiAgICB0aGlzLnJldHJ5VGltZW91dCA9IG9wdGlvbnMucmV0cnlUaW1lb3V0ID49IDEgPyBvcHRpb25zLnJldHJ5VGltZW91dCA6IDM1MDtcbiAgICB0aGlzLnN0YXRlID0ge307XG4gICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgIGlmICh0aGlzLmJhY2tlbmQgJiYgdGhpcy5iYWNrZW5kLmluaXQpIHtcbiAgICAgIHRoaXMuYmFja2VuZC5pbml0KHNlcnZpY2VzLCBvcHRpb25zLmJhY2tlbmQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBxdWV1ZUxvYWQobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHRvTG9hZCA9IHt9O1xuICAgIGNvbnN0IHBlbmRpbmcgPSB7fTtcbiAgICBjb25zdCB0b0xvYWRMYW5ndWFnZXMgPSB7fTtcbiAgICBjb25zdCB0b0xvYWROYW1lc3BhY2VzID0ge307XG4gICAgbGFuZ3VhZ2VzLmZvckVhY2gobG5nID0+IHtcbiAgICAgIGxldCBoYXNBbGxOYW1lc3BhY2VzID0gdHJ1ZTtcbiAgICAgIG5hbWVzcGFjZXMuZm9yRWFjaChucyA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBgJHtsbmd9fCR7bnN9YDtcbiAgICAgICAgaWYgKCFvcHRpb25zLnJlbG9hZCAmJiB0aGlzLnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKGxuZywgbnMpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVtuYW1lXSA9IDI7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZVtuYW1lXSA8IDApIDsgZWxzZSBpZiAodGhpcy5zdGF0ZVtuYW1lXSA9PT0gMSkge1xuICAgICAgICAgIGlmIChwZW5kaW5nW25hbWVdID09PSB1bmRlZmluZWQpIHBlbmRpbmdbbmFtZV0gPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSAxO1xuICAgICAgICAgIGhhc0FsbE5hbWVzcGFjZXMgPSBmYWxzZTtcbiAgICAgICAgICBpZiAocGVuZGluZ1tuYW1lXSA9PT0gdW5kZWZpbmVkKSBwZW5kaW5nW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodG9Mb2FkW25hbWVdID09PSB1bmRlZmluZWQpIHRvTG9hZFtuYW1lXSA9IHRydWU7XG4gICAgICAgICAgaWYgKHRvTG9hZE5hbWVzcGFjZXNbbnNdID09PSB1bmRlZmluZWQpIHRvTG9hZE5hbWVzcGFjZXNbbnNdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIWhhc0FsbE5hbWVzcGFjZXMpIHRvTG9hZExhbmd1YWdlc1tsbmddID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBpZiAoT2JqZWN0LmtleXModG9Mb2FkKS5sZW5ndGggfHwgT2JqZWN0LmtleXMocGVuZGluZykubGVuZ3RoKSB7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goe1xuICAgICAgICBwZW5kaW5nLFxuICAgICAgICBwZW5kaW5nQ291bnQ6IE9iamVjdC5rZXlzKHBlbmRpbmcpLmxlbmd0aCxcbiAgICAgICAgbG9hZGVkOiB7fSxcbiAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgY2FsbGJhY2tcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdG9Mb2FkOiBPYmplY3Qua2V5cyh0b0xvYWQpLFxuICAgICAgcGVuZGluZzogT2JqZWN0LmtleXMocGVuZGluZyksXG4gICAgICB0b0xvYWRMYW5ndWFnZXM6IE9iamVjdC5rZXlzKHRvTG9hZExhbmd1YWdlcyksXG4gICAgICB0b0xvYWROYW1lc3BhY2VzOiBPYmplY3Qua2V5cyh0b0xvYWROYW1lc3BhY2VzKVxuICAgIH07XG4gIH1cbiAgbG9hZGVkKG5hbWUsIGVyciwgZGF0YSkge1xuICAgIGNvbnN0IHMgPSBuYW1lLnNwbGl0KCd8Jyk7XG4gICAgY29uc3QgbG5nID0gc1swXTtcbiAgICBjb25zdCBucyA9IHNbMV07XG4gICAgaWYgKGVycikgdGhpcy5lbWl0KCdmYWlsZWRMb2FkaW5nJywgbG5nLCBucywgZXJyKTtcbiAgICBpZiAoIWVyciAmJiBkYXRhKSB7XG4gICAgICB0aGlzLnN0b3JlLmFkZFJlc291cmNlQnVuZGxlKGxuZywgbnMsIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG4gICAgICAgIHNraXBDb3B5OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZVtuYW1lXSA9IGVyciA/IC0xIDogMjtcbiAgICBpZiAoZXJyICYmIGRhdGEpIHRoaXMuc3RhdGVbbmFtZV0gPSAwO1xuICAgIGNvbnN0IGxvYWRlZCA9IHt9O1xuICAgIHRoaXMucXVldWUuZm9yRWFjaChxID0+IHtcbiAgICAgIHB1c2hQYXRoKHEubG9hZGVkLCBbbG5nXSwgbnMpO1xuICAgICAgcmVtb3ZlUGVuZGluZyhxLCBuYW1lKTtcbiAgICAgIGlmIChlcnIpIHEuZXJyb3JzLnB1c2goZXJyKTtcbiAgICAgIGlmIChxLnBlbmRpbmdDb3VudCA9PT0gMCAmJiAhcS5kb25lKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHEubG9hZGVkKS5mb3JFYWNoKGwgPT4ge1xuICAgICAgICAgIGlmICghbG9hZGVkW2xdKSBsb2FkZWRbbF0gPSB7fTtcbiAgICAgICAgICBjb25zdCBsb2FkZWRLZXlzID0gcS5sb2FkZWRbbF07XG4gICAgICAgICAgaWYgKGxvYWRlZEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2FkZWRLZXlzLmZvckVhY2gobiA9PiB7XG4gICAgICAgICAgICAgIGlmIChsb2FkZWRbbF1bbl0gPT09IHVuZGVmaW5lZCkgbG9hZGVkW2xdW25dID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHEuZG9uZSA9IHRydWU7XG4gICAgICAgIGlmIChxLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBxLmNhbGxiYWNrKHEuZXJyb3JzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxLmNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmVtaXQoJ2xvYWRlZCcsIGxvYWRlZCk7XG4gICAgdGhpcy5xdWV1ZSA9IHRoaXMucXVldWUuZmlsdGVyKHEgPT4gIXEuZG9uZSk7XG4gIH1cbiAgcmVhZChsbmcsIG5zLCBmY05hbWUpIHtcbiAgICBsZXQgdHJpZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDA7XG4gICAgbGV0IHdhaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRoaXMucmV0cnlUaW1lb3V0O1xuICAgIGxldCBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ID8gYXJndW1lbnRzWzVdIDogdW5kZWZpbmVkO1xuICAgIGlmICghbG5nLmxlbmd0aCkgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHt9KTtcbiAgICBpZiAodGhpcy5yZWFkaW5nQ2FsbHMgPj0gdGhpcy5tYXhQYXJhbGxlbFJlYWRzKSB7XG4gICAgICB0aGlzLndhaXRpbmdSZWFkcy5wdXNoKHtcbiAgICAgICAgbG5nLFxuICAgICAgICBucyxcbiAgICAgICAgZmNOYW1lLFxuICAgICAgICB0cmllZCxcbiAgICAgICAgd2FpdCxcbiAgICAgICAgY2FsbGJhY2tcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlYWRpbmdDYWxscysrO1xuICAgIGNvbnN0IHJlc29sdmVyID0gKGVyciwgZGF0YSkgPT4ge1xuICAgICAgdGhpcy5yZWFkaW5nQ2FsbHMtLTtcbiAgICAgIGlmICh0aGlzLndhaXRpbmdSZWFkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLndhaXRpbmdSZWFkcy5zaGlmdCgpO1xuICAgICAgICB0aGlzLnJlYWQobmV4dC5sbmcsIG5leHQubnMsIG5leHQuZmNOYW1lLCBuZXh0LnRyaWVkLCBuZXh0LndhaXQsIG5leHQuY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgaWYgKGVyciAmJiBkYXRhICYmIHRyaWVkIDwgdGhpcy5tYXhSZXRyaWVzKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVhZC5jYWxsKHRoaXMsIGxuZywgbnMsIGZjTmFtZSwgdHJpZWQgKyAxLCB3YWl0ICogMiwgY2FsbGJhY2spO1xuICAgICAgICB9LCB3YWl0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyLCBkYXRhKTtcbiAgICB9O1xuICAgIGNvbnN0IGZjID0gdGhpcy5iYWNrZW5kW2ZjTmFtZV0uYmluZCh0aGlzLmJhY2tlbmQpO1xuICAgIGlmIChmYy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHIgPSBmYyhsbmcsIG5zKTtcbiAgICAgICAgaWYgKHIgJiYgdHlwZW9mIHIudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHIudGhlbihkYXRhID0+IHJlc29sdmVyKG51bGwsIGRhdGEpKS5jYXRjaChyZXNvbHZlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZXIobnVsbCwgcik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXNvbHZlcihlcnIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZmMobG5nLCBucywgcmVzb2x2ZXIpO1xuICB9XG4gIHByZXBhcmVMb2FkaW5nKGxhbmd1YWdlcywgbmFtZXNwYWNlcykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBsZXQgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMyA/IGFyZ3VtZW50c1szXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXRoaXMuYmFja2VuZCkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybignTm8gYmFja2VuZCB3YXMgYWRkZWQgdmlhIGkxOG5leHQudXNlLiBXaWxsIG5vdCBsb2FkIHJlc291cmNlcy4nKTtcbiAgICAgIHJldHVybiBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGxhbmd1YWdlcyA9PT0gJ3N0cmluZycpIGxhbmd1YWdlcyA9IHRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobGFuZ3VhZ2VzKTtcbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnKSBuYW1lc3BhY2VzID0gW25hbWVzcGFjZXNdO1xuICAgIGNvbnN0IHRvTG9hZCA9IHRoaXMucXVldWVMb2FkKGxhbmd1YWdlcywgbmFtZXNwYWNlcywgb3B0aW9ucywgY2FsbGJhY2spO1xuICAgIGlmICghdG9Mb2FkLnRvTG9hZC5sZW5ndGgpIHtcbiAgICAgIGlmICghdG9Mb2FkLnBlbmRpbmcubGVuZ3RoKSBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRvTG9hZC50b0xvYWQuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIHRoaXMubG9hZE9uZShuYW1lKTtcbiAgICB9KTtcbiAgfVxuICBsb2FkKGxhbmd1YWdlcywgbmFtZXNwYWNlcywgY2FsbGJhY2spIHtcbiAgICB0aGlzLnByZXBhcmVMb2FkaW5nKGxhbmd1YWdlcywgbmFtZXNwYWNlcywge30sIGNhbGxiYWNrKTtcbiAgfVxuICByZWxvYWQobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzLCBjYWxsYmFjaykge1xuICAgIHRoaXMucHJlcGFyZUxvYWRpbmcobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzLCB7XG4gICAgICByZWxvYWQ6IHRydWVcbiAgICB9LCBjYWxsYmFjayk7XG4gIH1cbiAgbG9hZE9uZShuYW1lKSB7XG4gICAgbGV0IHByZWZpeCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJyc7XG4gICAgY29uc3QgcyA9IG5hbWUuc3BsaXQoJ3wnKTtcbiAgICBjb25zdCBsbmcgPSBzWzBdO1xuICAgIGNvbnN0IG5zID0gc1sxXTtcbiAgICB0aGlzLnJlYWQobG5nLCBucywgJ3JlYWQnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgaWYgKGVycikgdGhpcy5sb2dnZXIud2FybihgJHtwcmVmaXh9bG9hZGluZyBuYW1lc3BhY2UgJHtuc30gZm9yIGxhbmd1YWdlICR7bG5nfSBmYWlsZWRgLCBlcnIpO1xuICAgICAgaWYgKCFlcnIgJiYgZGF0YSkgdGhpcy5sb2dnZXIubG9nKGAke3ByZWZpeH1sb2FkZWQgbmFtZXNwYWNlICR7bnN9IGZvciBsYW5ndWFnZSAke2xuZ31gLCBkYXRhKTtcbiAgICAgIHRoaXMubG9hZGVkKG5hbWUsIGVyciwgZGF0YSk7XG4gICAgfSk7XG4gIH1cbiAgc2F2ZU1pc3NpbmcobGFuZ3VhZ2VzLCBuYW1lc3BhY2UsIGtleSwgZmFsbGJhY2tWYWx1ZSwgaXNVcGRhdGUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDoge307XG4gICAgbGV0IGNsYiA9IGFyZ3VtZW50cy5sZW5ndGggPiA2ICYmIGFyZ3VtZW50c1s2XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzZdIDogKCkgPT4ge307XG4gICAgaWYgKHRoaXMuc2VydmljZXMudXRpbHMgJiYgdGhpcy5zZXJ2aWNlcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UgJiYgIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKG5hbWVzcGFjZSkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGRpZCBub3Qgc2F2ZSBrZXkgXCIke2tleX1cIiBhcyB0aGUgbmFtZXNwYWNlIFwiJHtuYW1lc3BhY2V9XCIgd2FzIG5vdCB5ZXQgbG9hZGVkYCwgJ1RoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhIScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsIHx8IGtleSA9PT0gJycpIHJldHVybjtcbiAgICBpZiAodGhpcy5iYWNrZW5kICYmIHRoaXMuYmFja2VuZC5jcmVhdGUpIHtcbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGlzVXBkYXRlXG4gICAgICB9O1xuICAgICAgY29uc3QgZmMgPSB0aGlzLmJhY2tlbmQuY3JlYXRlLmJpbmQodGhpcy5iYWNrZW5kKTtcbiAgICAgIGlmIChmYy5sZW5ndGggPCA2KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHI7XG4gICAgICAgICAgaWYgKGZjLmxlbmd0aCA9PT0gNSkge1xuICAgICAgICAgICAgciA9IGZjKGxhbmd1YWdlcywgbmFtZXNwYWNlLCBrZXksIGZhbGxiYWNrVmFsdWUsIG9wdHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByID0gZmMobGFuZ3VhZ2VzLCBuYW1lc3BhY2UsIGtleSwgZmFsbGJhY2tWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyICYmIHR5cGVvZiByLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHIudGhlbihkYXRhID0+IGNsYihudWxsLCBkYXRhKSkuY2F0Y2goY2xiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xiKG51bGwsIHIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY2xiKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZjKGxhbmd1YWdlcywgbmFtZXNwYWNlLCBrZXksIGZhbGxiYWNrVmFsdWUsIGNsYiwgb3B0cyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghbGFuZ3VhZ2VzIHx8ICFsYW5ndWFnZXNbMF0pIHJldHVybjtcbiAgICB0aGlzLnN0b3JlLmFkZFJlc291cmNlKGxhbmd1YWdlc1swXSwgbmFtZXNwYWNlLCBrZXksIGZhbGxiYWNrVmFsdWUpO1xuICB9XG59XG5cbmNvbnN0IGdldCA9ICgpID0+ICh7XG4gIGRlYnVnOiBmYWxzZSxcbiAgaW5pdEltbWVkaWF0ZTogdHJ1ZSxcbiAgbnM6IFsndHJhbnNsYXRpb24nXSxcbiAgZGVmYXVsdE5TOiBbJ3RyYW5zbGF0aW9uJ10sXG4gIGZhbGxiYWNrTG5nOiBbJ2RldiddLFxuICBmYWxsYmFja05TOiBmYWxzZSxcbiAgc3VwcG9ydGVkTG5nczogZmFsc2UsXG4gIG5vbkV4cGxpY2l0U3VwcG9ydGVkTG5nczogZmFsc2UsXG4gIGxvYWQ6ICdhbGwnLFxuICBwcmVsb2FkOiBmYWxzZSxcbiAgc2ltcGxpZnlQbHVyYWxTdWZmaXg6IHRydWUsXG4gIGtleVNlcGFyYXRvcjogJy4nLFxuICBuc1NlcGFyYXRvcjogJzonLFxuICBwbHVyYWxTZXBhcmF0b3I6ICdfJyxcbiAgY29udGV4dFNlcGFyYXRvcjogJ18nLFxuICBwYXJ0aWFsQnVuZGxlZExhbmd1YWdlczogZmFsc2UsXG4gIHNhdmVNaXNzaW5nOiBmYWxzZSxcbiAgdXBkYXRlTWlzc2luZzogZmFsc2UsXG4gIHNhdmVNaXNzaW5nVG86ICdmYWxsYmFjaycsXG4gIHNhdmVNaXNzaW5nUGx1cmFsczogdHJ1ZSxcbiAgbWlzc2luZ0tleUhhbmRsZXI6IGZhbHNlLFxuICBtaXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXI6IGZhbHNlLFxuICBwb3N0UHJvY2VzczogZmFsc2UsXG4gIHBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkOiBmYWxzZSxcbiAgcmV0dXJuTnVsbDogZmFsc2UsXG4gIHJldHVybkVtcHR5U3RyaW5nOiB0cnVlLFxuICByZXR1cm5PYmplY3RzOiBmYWxzZSxcbiAgam9pbkFycmF5czogZmFsc2UsXG4gIHJldHVybmVkT2JqZWN0SGFuZGxlcjogZmFsc2UsXG4gIHBhcnNlTWlzc2luZ0tleUhhbmRsZXI6IGZhbHNlLFxuICBhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6IGZhbHNlLFxuICBhcHBlbmROYW1lc3BhY2VUb0NJTW9kZTogZmFsc2UsXG4gIG92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyOiBhcmdzID0+IHtcbiAgICBsZXQgcmV0ID0ge307XG4gICAgaWYgKHR5cGVvZiBhcmdzWzFdID09PSAnb2JqZWN0JykgcmV0ID0gYXJnc1sxXTtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMV0gPT09ICdzdHJpbmcnKSByZXQuZGVmYXVsdFZhbHVlID0gYXJnc1sxXTtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMl0gPT09ICdzdHJpbmcnKSByZXQudERlc2NyaXB0aW9uID0gYXJnc1syXTtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMl0gPT09ICdvYmplY3QnIHx8IHR5cGVvZiBhcmdzWzNdID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGFyZ3NbM10gfHwgYXJnc1syXTtcbiAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgcmV0W2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcbiAgaW50ZXJwb2xhdGlvbjoge1xuICAgIGVzY2FwZVZhbHVlOiB0cnVlLFxuICAgIGZvcm1hdDogdmFsdWUgPT4gdmFsdWUsXG4gICAgcHJlZml4OiAne3snLFxuICAgIHN1ZmZpeDogJ319JyxcbiAgICBmb3JtYXRTZXBhcmF0b3I6ICcsJyxcbiAgICB1bmVzY2FwZVByZWZpeDogJy0nLFxuICAgIG5lc3RpbmdQcmVmaXg6ICckdCgnLFxuICAgIG5lc3RpbmdTdWZmaXg6ICcpJyxcbiAgICBuZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjogJywnLFxuICAgIG1heFJlcGxhY2VzOiAxMDAwLFxuICAgIHNraXBPblZhcmlhYmxlczogdHJ1ZVxuICB9XG59KTtcbmNvbnN0IHRyYW5zZm9ybU9wdGlvbnMgPSBvcHRpb25zID0+IHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLm5zID09PSAnc3RyaW5nJykgb3B0aW9ucy5ucyA9IFtvcHRpb25zLm5zXTtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmZhbGxiYWNrTG5nID09PSAnc3RyaW5nJykgb3B0aW9ucy5mYWxsYmFja0xuZyA9IFtvcHRpb25zLmZhbGxiYWNrTG5nXTtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmZhbGxiYWNrTlMgPT09ICdzdHJpbmcnKSBvcHRpb25zLmZhbGxiYWNrTlMgPSBbb3B0aW9ucy5mYWxsYmFja05TXTtcbiAgaWYgKG9wdGlvbnMuc3VwcG9ydGVkTG5ncyAmJiBvcHRpb25zLnN1cHBvcnRlZExuZ3MuaW5kZXhPZignY2ltb2RlJykgPCAwKSB7XG4gICAgb3B0aW9ucy5zdXBwb3J0ZWRMbmdzID0gb3B0aW9ucy5zdXBwb3J0ZWRMbmdzLmNvbmNhdChbJ2NpbW9kZSddKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbmNvbnN0IGJpbmRNZW1iZXJGdW5jdGlvbnMgPSBpbnN0ID0+IHtcbiAgY29uc3QgbWVtcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnN0KSk7XG4gIG1lbXMuZm9yRWFjaChtZW0gPT4ge1xuICAgIGlmICh0eXBlb2YgaW5zdFttZW1dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbnN0W21lbV0gPSBpbnN0W21lbV0uYmluZChpbnN0KTtcbiAgICB9XG4gIH0pO1xufTtcbmNsYXNzIEkxOG4gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgbGV0IGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm9wdGlvbnMgPSB0cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnMpO1xuICAgIHRoaXMuc2VydmljZXMgPSB7fTtcbiAgICB0aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXI7XG4gICAgdGhpcy5tb2R1bGVzID0ge1xuICAgICAgZXh0ZXJuYWw6IFtdXG4gICAgfTtcbiAgICBiaW5kTWVtYmVyRnVuY3Rpb25zKHRoaXMpO1xuICAgIGlmIChjYWxsYmFjayAmJiAhdGhpcy5pc0luaXRpYWxpemVkICYmICFvcHRpb25zLmlzQ2xvbmUpIHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGUpIHtcbiAgICAgICAgdGhpcy5pbml0KG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pbml0KG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuICBpbml0KCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGxldCBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNJbml0aWFsaXppbmcgPSB0cnVlO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuZGVmYXVsdE5TICYmIG9wdGlvbnMuZGVmYXVsdE5TICE9PSBmYWxzZSAmJiBvcHRpb25zLm5zKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMubnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG9wdGlvbnMuZGVmYXVsdE5TID0gb3B0aW9ucy5ucztcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5ucy5pbmRleE9mKCd0cmFuc2xhdGlvbicpIDwgMCkge1xuICAgICAgICBvcHRpb25zLmRlZmF1bHROUyA9IG9wdGlvbnMubnNbMF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRlZk9wdHMgPSBnZXQoKTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5kZWZPcHRzLFxuICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgLi4udHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zKVxuICAgIH07XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJICE9PSAndjEnKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiA9IHtcbiAgICAgICAgLi4uZGVmT3B0cy5pbnRlcnBvbGF0aW9uLFxuICAgICAgICAuLi50aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvblxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMua2V5U2VwYXJhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZEtleVNlcGFyYXRvciA9IG9wdGlvbnMua2V5U2VwYXJhdG9yO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5uc1NlcGFyYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvciA9IG9wdGlvbnMubnNTZXBhcmF0b3I7XG4gICAgfVxuICAgIGNvbnN0IGNyZWF0ZUNsYXNzT25EZW1hbmQgPSBDbGFzc09yT2JqZWN0ID0+IHtcbiAgICAgIGlmICghQ2xhc3NPck9iamVjdCkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAodHlwZW9mIENsYXNzT3JPYmplY3QgPT09ICdmdW5jdGlvbicpIHJldHVybiBuZXcgQ2xhc3NPck9iamVjdCgpO1xuICAgICAgcmV0dXJuIENsYXNzT3JPYmplY3Q7XG4gICAgfTtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5pc0Nsb25lKSB7XG4gICAgICBpZiAodGhpcy5tb2R1bGVzLmxvZ2dlcikge1xuICAgICAgICBiYXNlTG9nZ2VyLmluaXQoY3JlYXRlQ2xhc3NPbkRlbWFuZCh0aGlzLm1vZHVsZXMubG9nZ2VyKSwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VMb2dnZXIuaW5pdChudWxsLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgbGV0IGZvcm1hdHRlcjtcbiAgICAgIGlmICh0aGlzLm1vZHVsZXMuZm9ybWF0dGVyKSB7XG4gICAgICAgIGZvcm1hdHRlciA9IHRoaXMubW9kdWxlcy5mb3JtYXR0ZXI7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBmb3JtYXR0ZXIgPSBGb3JtYXR0ZXI7XG4gICAgICB9XG4gICAgICBjb25zdCBsdSA9IG5ldyBMYW5ndWFnZVV0aWwodGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMuc3RvcmUgPSBuZXcgUmVzb3VyY2VTdG9yZSh0aGlzLm9wdGlvbnMucmVzb3VyY2VzLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgY29uc3QgcyA9IHRoaXMuc2VydmljZXM7XG4gICAgICBzLmxvZ2dlciA9IGJhc2VMb2dnZXI7XG4gICAgICBzLnJlc291cmNlU3RvcmUgPSB0aGlzLnN0b3JlO1xuICAgICAgcy5sYW5ndWFnZVV0aWxzID0gbHU7XG4gICAgICBzLnBsdXJhbFJlc29sdmVyID0gbmV3IFBsdXJhbFJlc29sdmVyKGx1LCB7XG4gICAgICAgIHByZXBlbmQ6IHRoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsXG4gICAgICAgIGNvbXBhdGliaWxpdHlKU09OOiB0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04sXG4gICAgICAgIHNpbXBsaWZ5UGx1cmFsU3VmZml4OiB0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXhcbiAgICAgIH0pO1xuICAgICAgaWYgKGZvcm1hdHRlciAmJiAoIXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCB8fCB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQgPT09IGRlZk9wdHMuaW50ZXJwb2xhdGlvbi5mb3JtYXQpKSB7XG4gICAgICAgIHMuZm9ybWF0dGVyID0gY3JlYXRlQ2xhc3NPbkRlbWFuZChmb3JtYXR0ZXIpO1xuICAgICAgICBzLmZvcm1hdHRlci5pbml0KHMsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCA9IHMuZm9ybWF0dGVyLmZvcm1hdC5iaW5kKHMuZm9ybWF0dGVyKTtcbiAgICAgIH1cbiAgICAgIHMuaW50ZXJwb2xhdG9yID0gbmV3IEludGVycG9sYXRvcih0aGlzLm9wdGlvbnMpO1xuICAgICAgcy51dGlscyA9IHtcbiAgICAgICAgaGFzTG9hZGVkTmFtZXNwYWNlOiB0aGlzLmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKHRoaXMpXG4gICAgICB9O1xuICAgICAgcy5iYWNrZW5kQ29ubmVjdG9yID0gbmV3IENvbm5lY3RvcihjcmVhdGVDbGFzc09uRGVtYW5kKHRoaXMubW9kdWxlcy5iYWNrZW5kKSwgcy5yZXNvdXJjZVN0b3JlLCBzLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgcy5iYWNrZW5kQ29ubmVjdG9yLm9uKCcqJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yKSB7XG4gICAgICAgIHMubGFuZ3VhZ2VEZXRlY3RvciA9IGNyZWF0ZUNsYXNzT25EZW1hbmQodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpO1xuICAgICAgICBpZiAocy5sYW5ndWFnZURldGVjdG9yLmluaXQpIHMubGFuZ3VhZ2VEZXRlY3Rvci5pbml0KHMsIHRoaXMub3B0aW9ucy5kZXRlY3Rpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpIHtcbiAgICAgICAgcy5pMThuRm9ybWF0ID0gY3JlYXRlQ2xhc3NPbkRlbWFuZCh0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCk7XG4gICAgICAgIGlmIChzLmkxOG5Gb3JtYXQuaW5pdCkgcy5pMThuRm9ybWF0LmluaXQodGhpcyk7XG4gICAgICB9XG4gICAgICB0aGlzLnRyYW5zbGF0b3IgPSBuZXcgVHJhbnNsYXRvcih0aGlzLnNlcnZpY2VzLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgdGhpcy50cmFuc2xhdG9yLm9uKCcqJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2gobSA9PiB7XG4gICAgICAgIGlmIChtLmluaXQpIG0uaW5pdCh0aGlzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmZvcm1hdCA9IHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdDtcbiAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IG5vb3A7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyAmJiAhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yICYmICF0aGlzLm9wdGlvbnMubG5nKSB7XG4gICAgICBjb25zdCBjb2RlcyA9IHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7XG4gICAgICBpZiAoY29kZXMubGVuZ3RoID4gMCAmJiBjb2Rlc1swXSAhPT0gJ2RldicpIHRoaXMub3B0aW9ucy5sbmcgPSBjb2Rlc1swXTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IgJiYgIXRoaXMub3B0aW9ucy5sbmcpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ2luaXQ6IG5vIGxhbmd1YWdlRGV0ZWN0b3IgaXMgdXNlZCBhbmQgbm8gbG5nIGlzIGRlZmluZWQnKTtcbiAgICB9XG4gICAgY29uc3Qgc3RvcmVBcGkgPSBbJ2dldFJlc291cmNlJywgJ2hhc1Jlc291cmNlQnVuZGxlJywgJ2dldFJlc291cmNlQnVuZGxlJywgJ2dldERhdGFCeUxhbmd1YWdlJ107XG4gICAgc3RvcmVBcGkuZm9yRWFjaChmY05hbWUgPT4ge1xuICAgICAgdGhpc1tmY05hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuc3RvcmVbZmNOYW1lXSguLi5hcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBzdG9yZUFwaUNoYWluZWQgPSBbJ2FkZFJlc291cmNlJywgJ2FkZFJlc291cmNlcycsICdhZGRSZXNvdXJjZUJ1bmRsZScsICdyZW1vdmVSZXNvdXJjZUJ1bmRsZSddO1xuICAgIHN0b3JlQXBpQ2hhaW5lZC5mb3JFYWNoKGZjTmFtZSA9PiB7XG4gICAgICB0aGlzW2ZjTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnN0b3JlW2ZjTmFtZV0oLi4uYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgY29uc3QgbG9hZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbmlzaCA9IChlcnIsIHQpID0+IHtcbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemluZyA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkICYmICF0aGlzLmluaXRpYWxpemVkU3RvcmVPbmNlKSB0aGlzLmxvZ2dlci53YXJuKCdpbml0OiBpMThuZXh0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIFlvdSBzaG91bGQgY2FsbCBpbml0IGp1c3Qgb25jZSEnKTtcbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaXNDbG9uZSkgdGhpcy5sb2dnZXIubG9nKCdpbml0aWFsaXplZCcsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZW1pdCgnaW5pdGlhbGl6ZWQnLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHQpO1xuICAgICAgICBjYWxsYmFjayhlcnIsIHQpO1xuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmxhbmd1YWdlcyAmJiB0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSAhPT0gJ3YxJyAmJiAhdGhpcy5pc0luaXRpYWxpemVkKSByZXR1cm4gZmluaXNoKG51bGwsIHRoaXMudC5iaW5kKHRoaXMpKTtcbiAgICAgIHRoaXMuY2hhbmdlTGFuZ3VhZ2UodGhpcy5vcHRpb25zLmxuZywgZmluaXNoKTtcbiAgICB9O1xuICAgIGlmICh0aGlzLm9wdGlvbnMucmVzb3VyY2VzIHx8ICF0aGlzLm9wdGlvbnMuaW5pdEltbWVkaWF0ZSkge1xuICAgICAgbG9hZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KGxvYWQsIDApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmZXJyZWQ7XG4gIH1cbiAgbG9hZFJlc291cmNlcyhsYW5ndWFnZSkge1xuICAgIGxldCBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbm9vcDtcbiAgICBsZXQgdXNlZENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgY29uc3QgdXNlZExuZyA9IHR5cGVvZiBsYW5ndWFnZSA9PT0gJ3N0cmluZycgPyBsYW5ndWFnZSA6IHRoaXMubGFuZ3VhZ2U7XG4gICAgaWYgKHR5cGVvZiBsYW5ndWFnZSA9PT0gJ2Z1bmN0aW9uJykgdXNlZENhbGxiYWNrID0gbGFuZ3VhZ2U7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMucmVzb3VyY2VzIHx8IHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcykge1xuICAgICAgaWYgKHVzZWRMbmcgJiYgdXNlZExuZy50b0xvd2VyQ2FzZSgpID09PSAnY2ltb2RlJyAmJiAoIXRoaXMub3B0aW9ucy5wcmVsb2FkIHx8IHRoaXMub3B0aW9ucy5wcmVsb2FkLmxlbmd0aCA9PT0gMCkpIHJldHVybiB1c2VkQ2FsbGJhY2soKTtcbiAgICAgIGNvbnN0IHRvTG9hZCA9IFtdO1xuICAgICAgY29uc3QgYXBwZW5kID0gbG5nID0+IHtcbiAgICAgICAgaWYgKCFsbmcpIHJldHVybjtcbiAgICAgICAgaWYgKGxuZyA9PT0gJ2NpbW9kZScpIHJldHVybjtcbiAgICAgICAgY29uc3QgbG5ncyA9IHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobG5nKTtcbiAgICAgICAgbG5ncy5mb3JFYWNoKGwgPT4ge1xuICAgICAgICAgIGlmIChsID09PSAnY2ltb2RlJykgcmV0dXJuO1xuICAgICAgICAgIGlmICh0b0xvYWQuaW5kZXhPZihsKSA8IDApIHRvTG9hZC5wdXNoKGwpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBpZiAoIXVzZWRMbmcpIHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tzID0gdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtcbiAgICAgICAgZmFsbGJhY2tzLmZvckVhY2gobCA9PiBhcHBlbmQobCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZW5kKHVzZWRMbmcpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcmVsb2FkKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2gobCA9PiBhcHBlbmQobCkpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmxvYWQodG9Mb2FkLCB0aGlzLm9wdGlvbnMubnMsIGUgPT4ge1xuICAgICAgICBpZiAoIWUgJiYgIXRoaXMucmVzb2x2ZWRMYW5ndWFnZSAmJiB0aGlzLmxhbmd1YWdlKSB0aGlzLnNldFJlc29sdmVkTGFuZ3VhZ2UodGhpcy5sYW5ndWFnZSk7XG4gICAgICAgIHVzZWRDYWxsYmFjayhlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VkQ2FsbGJhY2sobnVsbCk7XG4gICAgfVxuICB9XG4gIHJlbG9hZFJlc291cmNlcyhsbmdzLCBucywgY2FsbGJhY2spIHtcbiAgICBjb25zdCBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgaWYgKHR5cGVvZiBsbmdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IGxuZ3M7XG4gICAgICBsbmdzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG5zO1xuICAgICAgbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghbG5ncykgbG5ncyA9IHRoaXMubGFuZ3VhZ2VzO1xuICAgIGlmICghbnMpIG5zID0gdGhpcy5vcHRpb25zLm5zO1xuICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gbm9vcDtcbiAgICB0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IucmVsb2FkKGxuZ3MsIG5zLCBlcnIgPT4ge1xuICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGVmZXJyZWQ7XG4gIH1cbiAgdXNlKG1vZHVsZSkge1xuICAgIGlmICghbW9kdWxlKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBhcmUgcGFzc2luZyBhbiB1bmRlZmluZWQgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKScpO1xuICAgIGlmICghbW9kdWxlLnR5cGUpIHRocm93IG5ldyBFcnJvcignWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKScpO1xuICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJ2JhY2tlbmQnKSB7XG4gICAgICB0aGlzLm1vZHVsZXMuYmFja2VuZCA9IG1vZHVsZTtcbiAgICB9XG4gICAgaWYgKG1vZHVsZS50eXBlID09PSAnbG9nZ2VyJyB8fCBtb2R1bGUubG9nICYmIG1vZHVsZS53YXJuICYmIG1vZHVsZS5lcnJvcikge1xuICAgICAgdGhpcy5tb2R1bGVzLmxvZ2dlciA9IG1vZHVsZTtcbiAgICB9XG4gICAgaWYgKG1vZHVsZS50eXBlID09PSAnbGFuZ3VhZ2VEZXRlY3RvcicpIHtcbiAgICAgIHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yID0gbW9kdWxlO1xuICAgIH1cbiAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdpMThuRm9ybWF0Jykge1xuICAgICAgdGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQgPSBtb2R1bGU7XG4gICAgfVxuICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJ3Bvc3RQcm9jZXNzb3InKSB7XG4gICAgICBwb3N0UHJvY2Vzc29yLmFkZFBvc3RQcm9jZXNzb3IobW9kdWxlKTtcbiAgICB9XG4gICAgaWYgKG1vZHVsZS50eXBlID09PSAnZm9ybWF0dGVyJykge1xuICAgICAgdGhpcy5tb2R1bGVzLmZvcm1hdHRlciA9IG1vZHVsZTtcbiAgICB9XG4gICAgaWYgKG1vZHVsZS50eXBlID09PSAnM3JkUGFydHknKSB7XG4gICAgICB0aGlzLm1vZHVsZXMuZXh0ZXJuYWwucHVzaChtb2R1bGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBzZXRSZXNvbHZlZExhbmd1YWdlKGwpIHtcbiAgICBpZiAoIWwgfHwgIXRoaXMubGFuZ3VhZ2VzKSByZXR1cm47XG4gICAgaWYgKFsnY2ltb2RlJywgJ2RldiddLmluZGV4T2YobCkgPiAtMSkgcmV0dXJuO1xuICAgIGZvciAobGV0IGxpID0gMDsgbGkgPCB0aGlzLmxhbmd1YWdlcy5sZW5ndGg7IGxpKyspIHtcbiAgICAgIGNvbnN0IGxuZ0luTG5ncyA9IHRoaXMubGFuZ3VhZ2VzW2xpXTtcbiAgICAgIGlmIChbJ2NpbW9kZScsICdkZXYnXS5pbmRleE9mKGxuZ0luTG5ncykgPiAtMSkgY29udGludWU7XG4gICAgICBpZiAodGhpcy5zdG9yZS5oYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMobG5nSW5MbmdzKSkge1xuICAgICAgICB0aGlzLnJlc29sdmVkTGFuZ3VhZ2UgPSBsbmdJbkxuZ3M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjaGFuZ2VMYW5ndWFnZShsbmcsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgdGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbyA9IGxuZztcbiAgICBjb25zdCBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgdGhpcy5lbWl0KCdsYW5ndWFnZUNoYW5naW5nJywgbG5nKTtcbiAgICBjb25zdCBzZXRMbmdQcm9wcyA9IGwgPT4ge1xuICAgICAgdGhpcy5sYW5ndWFnZSA9IGw7XG4gICAgICB0aGlzLmxhbmd1YWdlcyA9IHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobCk7XG4gICAgICB0aGlzLnJlc29sdmVkTGFuZ3VhZ2UgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnNldFJlc29sdmVkTGFuZ3VhZ2UobCk7XG4gICAgfTtcbiAgICBjb25zdCBkb25lID0gKGVyciwgbCkgPT4ge1xuICAgICAgaWYgKGwpIHtcbiAgICAgICAgc2V0TG5nUHJvcHMobCk7XG4gICAgICAgIHRoaXMudHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShsKTtcbiAgICAgICAgdGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5lbWl0KCdsYW5ndWFnZUNoYW5nZWQnLCBsKTtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKCdsYW5ndWFnZUNoYW5nZWQnLCBsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG8gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBkZWZlcnJlZC5yZXNvbHZlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi50KC4uLmFyZ3VtZW50cyk7XG4gICAgICB9KTtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZXJyLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIudCguLi5hcmd1bWVudHMpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBzZXRMbmcgPSBsbmdzID0+IHtcbiAgICAgIGlmICghbG5nICYmICFsbmdzICYmIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvcikgbG5ncyA9IFtdO1xuICAgICAgY29uc3QgbCA9IHR5cGVvZiBsbmdzID09PSAnc3RyaW5nJyA/IGxuZ3MgOiB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKGxuZ3MpO1xuICAgICAgaWYgKGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxhbmd1YWdlKSB7XG4gICAgICAgICAgc2V0TG5nUHJvcHMobCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnRyYW5zbGF0b3IubGFuZ3VhZ2UpIHRoaXMudHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShsKTtcbiAgICAgICAgaWYgKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciAmJiB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuY2FjaGVVc2VyTGFuZ3VhZ2UpIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5jYWNoZVVzZXJMYW5ndWFnZShsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZFJlc291cmNlcyhsLCBlcnIgPT4ge1xuICAgICAgICBkb25lKGVyciwgbCk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGlmICghbG5nICYmIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciAmJiAhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jKSB7XG4gICAgICBzZXRMbmcodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdCgpKTtcbiAgICB9IGVsc2UgaWYgKCFsbmcgJiYgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yICYmIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYykge1xuICAgICAgaWYgKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKS50aGVuKHNldExuZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KHNldExuZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldExuZyhsbmcpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmZXJyZWQ7XG4gIH1cbiAgZ2V0Rml4ZWRUKGxuZywgbnMsIGtleVByZWZpeCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgIGNvbnN0IGZpeGVkVCA9IGZ1bmN0aW9uIChrZXksIG9wdHMpIHtcbiAgICAgIGxldCBvcHRpb25zO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3QgPSBuZXcgQXJyYXkoX2xlbjMgPiAyID8gX2xlbjMgLSAyIDogMCksIF9rZXkzID0gMjsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgICAgIHJlc3RbX2tleTMgLSAyXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucyA9IF90aGlzMy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKFtrZXksIG9wdHNdLmNvbmNhdChyZXN0KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgIC4uLm9wdHNcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMubG5nID0gb3B0aW9ucy5sbmcgfHwgZml4ZWRULmxuZztcbiAgICAgIG9wdGlvbnMubG5ncyA9IG9wdGlvbnMubG5ncyB8fCBmaXhlZFQubG5ncztcbiAgICAgIG9wdGlvbnMubnMgPSBvcHRpb25zLm5zIHx8IGZpeGVkVC5ucztcbiAgICAgIGlmIChvcHRpb25zLmtleVByZWZpeCAhPT0gJycpIG9wdGlvbnMua2V5UHJlZml4ID0gb3B0aW9ucy5rZXlQcmVmaXggfHwga2V5UHJlZml4IHx8IGZpeGVkVC5rZXlQcmVmaXg7XG4gICAgICBjb25zdCBrZXlTZXBhcmF0b3IgPSBfdGhpczMub3B0aW9ucy5rZXlTZXBhcmF0b3IgfHwgJy4nO1xuICAgICAgbGV0IHJlc3VsdEtleTtcbiAgICAgIGlmIChvcHRpb25zLmtleVByZWZpeCAmJiBBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgcmVzdWx0S2V5ID0ga2V5Lm1hcChrID0+IGAke29wdGlvbnMua2V5UHJlZml4fSR7a2V5U2VwYXJhdG9yfSR7a31gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdEtleSA9IG9wdGlvbnMua2V5UHJlZml4ID8gYCR7b3B0aW9ucy5rZXlQcmVmaXh9JHtrZXlTZXBhcmF0b3J9JHtrZXl9YCA6IGtleTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGhpczMudChyZXN1bHRLZXksIG9wdGlvbnMpO1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiBsbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmaXhlZFQubG5nID0gbG5nO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaXhlZFQubG5ncyA9IGxuZztcbiAgICB9XG4gICAgZml4ZWRULm5zID0gbnM7XG4gICAgZml4ZWRULmtleVByZWZpeCA9IGtleVByZWZpeDtcbiAgICByZXR1cm4gZml4ZWRUO1xuICB9XG4gIHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRvciAmJiB0aGlzLnRyYW5zbGF0b3IudHJhbnNsYXRlKC4uLmFyZ3VtZW50cyk7XG4gIH1cbiAgZXhpc3RzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0b3IgJiYgdGhpcy50cmFuc2xhdG9yLmV4aXN0cyguLi5hcmd1bWVudHMpO1xuICB9XG4gIHNldERlZmF1bHROYW1lc3BhY2UobnMpIHtcbiAgICB0aGlzLm9wdGlvbnMuZGVmYXVsdE5TID0gbnM7XG4gIH1cbiAgaGFzTG9hZGVkTmFtZXNwYWNlKG5zKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG5leHQgd2FzIG5vdCBpbml0aWFsaXplZCcsIHRoaXMubGFuZ3VhZ2VzKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmxhbmd1YWdlcyB8fCAhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5JywgdGhpcy5sYW5ndWFnZXMpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBsbmcgPSBvcHRpb25zLmxuZyB8fCB0aGlzLnJlc29sdmVkTGFuZ3VhZ2UgfHwgdGhpcy5sYW5ndWFnZXNbMF07XG4gICAgY29uc3QgZmFsbGJhY2tMbmcgPSB0aGlzLm9wdGlvbnMgPyB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcgOiBmYWxzZTtcbiAgICBjb25zdCBsYXN0TG5nID0gdGhpcy5sYW5ndWFnZXNbdGhpcy5sYW5ndWFnZXMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGxuZy50b0xvd2VyQ2FzZSgpID09PSAnY2ltb2RlJykgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgbG9hZE5vdFBlbmRpbmcgPSAobCwgbikgPT4ge1xuICAgICAgY29uc3QgbG9hZFN0YXRlID0gdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnN0YXRlW2Ake2x9fCR7bn1gXTtcbiAgICAgIHJldHVybiBsb2FkU3RhdGUgPT09IC0xIHx8IGxvYWRTdGF0ZSA9PT0gMCB8fCBsb2FkU3RhdGUgPT09IDI7XG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5wcmVjaGVjaykge1xuICAgICAgY29uc3QgcHJlUmVzdWx0ID0gb3B0aW9ucy5wcmVjaGVjayh0aGlzLCBsb2FkTm90UGVuZGluZyk7XG4gICAgICBpZiAocHJlUmVzdWx0ICE9PSB1bmRlZmluZWQpIHJldHVybiBwcmVSZXN1bHQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc1Jlc291cmNlQnVuZGxlKGxuZywgbnMpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5iYWNrZW5kIHx8IHRoaXMub3B0aW9ucy5yZXNvdXJjZXMgJiYgIXRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGxvYWROb3RQZW5kaW5nKGxuZywgbnMpICYmICghZmFsbGJhY2tMbmcgfHwgbG9hZE5vdFBlbmRpbmcobGFzdExuZywgbnMpKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxvYWROYW1lc3BhY2VzKG5zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ucykge1xuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5zID09PSAnc3RyaW5nJykgbnMgPSBbbnNdO1xuICAgIG5zLmZvckVhY2gobiA9PiB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5zLmluZGV4T2YobikgPCAwKSB0aGlzLm9wdGlvbnMubnMucHVzaChuKTtcbiAgICB9KTtcbiAgICB0aGlzLmxvYWRSZXNvdXJjZXMoZXJyID0+IHtcbiAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGVmZXJyZWQ7XG4gIH1cbiAgbG9hZExhbmd1YWdlcyhsbmdzLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICBpZiAodHlwZW9mIGxuZ3MgPT09ICdzdHJpbmcnKSBsbmdzID0gW2xuZ3NdO1xuICAgIGNvbnN0IHByZWxvYWRlZCA9IHRoaXMub3B0aW9ucy5wcmVsb2FkIHx8IFtdO1xuICAgIGNvbnN0IG5ld0xuZ3MgPSBsbmdzLmZpbHRlcihsbmcgPT4gcHJlbG9hZGVkLmluZGV4T2YobG5nKSA8IDAgJiYgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmlzU3VwcG9ydGVkQ29kZShsbmcpKTtcbiAgICBpZiAoIW5ld0xuZ3MubGVuZ3RoKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucy5wcmVsb2FkID0gcHJlbG9hZGVkLmNvbmNhdChuZXdMbmdzKTtcbiAgICB0aGlzLmxvYWRSZXNvdXJjZXMoZXJyID0+IHtcbiAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGVmZXJyZWQ7XG4gIH1cbiAgZGlyKGxuZykge1xuICAgIGlmICghbG5nKSBsbmcgPSB0aGlzLnJlc29sdmVkTGFuZ3VhZ2UgfHwgKHRoaXMubGFuZ3VhZ2VzICYmIHRoaXMubGFuZ3VhZ2VzLmxlbmd0aCA+IDAgPyB0aGlzLmxhbmd1YWdlc1swXSA6IHRoaXMubGFuZ3VhZ2UpO1xuICAgIGlmICghbG5nKSByZXR1cm4gJ3J0bCc7XG4gICAgY29uc3QgcnRsTG5ncyA9IFsnYXInLCAnc2h1JywgJ3NxcicsICdzc2gnLCAneGFhJywgJ3loZCcsICd5dWQnLCAnYWFvJywgJ2FiaCcsICdhYnYnLCAnYWNtJywgJ2FjcScsICdhY3cnLCAnYWN4JywgJ2FjeScsICdhZGYnLCAnYWRzJywgJ2FlYicsICdhZWMnLCAnYWZiJywgJ2FqcCcsICdhcGMnLCAnYXBkJywgJ2FyYicsICdhcnEnLCAnYXJzJywgJ2FyeScsICdhcnonLCAnYXV6JywgJ2F2bCcsICdheWgnLCAnYXlsJywgJ2F5bicsICdheXAnLCAnYmJ6JywgJ3BnYScsICdoZScsICdpdycsICdwcycsICdwYnQnLCAncGJ1JywgJ3BzdCcsICdwcnAnLCAncHJkJywgJ3VnJywgJ3VyJywgJ3lkZCcsICd5ZHMnLCAneWloJywgJ2ppJywgJ3lpJywgJ2hibycsICdtZW4nLCAneG1uJywgJ2ZhJywgJ2pwcicsICdwZW8nLCAncGVzJywgJ3BycycsICdkdicsICdzYW0nLCAnY2tiJ107XG4gICAgY29uc3QgbGFuZ3VhZ2VVdGlscyA9IHRoaXMuc2VydmljZXMgJiYgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzIHx8IG5ldyBMYW5ndWFnZVV0aWwoZ2V0KCkpO1xuICAgIHJldHVybiBydGxMbmdzLmluZGV4T2YobGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShsbmcpKSA+IC0xIHx8IGxuZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJy1hcmFiJykgPiAxID8gJ3J0bCcgOiAnbHRyJztcbiAgfVxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGxldCBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBuZXcgSTE4bihvcHRpb25zLCBjYWxsYmFjayk7XG4gIH1cbiAgY2xvbmVJbnN0YW5jZSgpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgbGV0IGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBub29wO1xuICAgIGNvbnN0IGZvcmtSZXNvdXJjZVN0b3JlID0gb3B0aW9ucy5mb3JrUmVzb3VyY2VTdG9yZTtcbiAgICBpZiAoZm9ya1Jlc291cmNlU3RvcmUpIGRlbGV0ZSBvcHRpb25zLmZvcmtSZXNvdXJjZVN0b3JlO1xuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7XG4gICAgICAuLi50aGlzLm9wdGlvbnMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgLi4ue1xuICAgICAgICBpc0Nsb25lOiB0cnVlXG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBjbG9uZSA9IG5ldyBJMThuKG1lcmdlZE9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zLmRlYnVnICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5wcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xvbmUubG9nZ2VyID0gY2xvbmUubG9nZ2VyLmNsb25lKG9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBtZW1iZXJzVG9Db3B5ID0gWydzdG9yZScsICdzZXJ2aWNlcycsICdsYW5ndWFnZSddO1xuICAgIG1lbWJlcnNUb0NvcHkuZm9yRWFjaChtID0+IHtcbiAgICAgIGNsb25lW21dID0gdGhpc1ttXTtcbiAgICB9KTtcbiAgICBjbG9uZS5zZXJ2aWNlcyA9IHtcbiAgICAgIC4uLnRoaXMuc2VydmljZXNcbiAgICB9O1xuICAgIGNsb25lLnNlcnZpY2VzLnV0aWxzID0ge1xuICAgICAgaGFzTG9hZGVkTmFtZXNwYWNlOiBjbG9uZS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChjbG9uZSlcbiAgICB9O1xuICAgIGlmIChmb3JrUmVzb3VyY2VTdG9yZSkge1xuICAgICAgY2xvbmUuc3RvcmUgPSBuZXcgUmVzb3VyY2VTdG9yZSh0aGlzLnN0b3JlLmRhdGEsIG1lcmdlZE9wdGlvbnMpO1xuICAgICAgY2xvbmUuc2VydmljZXMucmVzb3VyY2VTdG9yZSA9IGNsb25lLnN0b3JlO1xuICAgIH1cbiAgICBjbG9uZS50cmFuc2xhdG9yID0gbmV3IFRyYW5zbGF0b3IoY2xvbmUuc2VydmljZXMsIG1lcmdlZE9wdGlvbnMpO1xuICAgIGNsb25lLnRyYW5zbGF0b3Iub24oJyonLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNCA+IDEgPyBfbGVuNCAtIDEgOiAwKSwgX2tleTQgPSAxOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICAgIGFyZ3NbX2tleTQgLSAxXSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgICB9XG4gICAgICBjbG9uZS5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICB9KTtcbiAgICBjbG9uZS5pbml0KG1lcmdlZE9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICBjbG9uZS50cmFuc2xhdG9yLm9wdGlvbnMgPSBtZXJnZWRPcHRpb25zO1xuICAgIGNsb25lLnRyYW5zbGF0b3IuYmFja2VuZENvbm5lY3Rvci5zZXJ2aWNlcy51dGlscyA9IHtcbiAgICAgIGhhc0xvYWRlZE5hbWVzcGFjZTogY2xvbmUuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoY2xvbmUpXG4gICAgfTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICBzdG9yZTogdGhpcy5zdG9yZSxcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgbGFuZ3VhZ2VzOiB0aGlzLmxhbmd1YWdlcyxcbiAgICAgIHJlc29sdmVkTGFuZ3VhZ2U6IHRoaXMucmVzb2x2ZWRMYW5ndWFnZVxuICAgIH07XG4gIH1cbn1cbmNvbnN0IGluc3RhbmNlID0gSTE4bi5jcmVhdGVJbnN0YW5jZSgpO1xuaW5zdGFuY2UuY3JlYXRlSW5zdGFuY2UgPSBJMThuLmNyZWF0ZUluc3RhbmNlO1xuXG5jb25zdCBjcmVhdGVJbnN0YW5jZSA9IGluc3RhbmNlLmNyZWF0ZUluc3RhbmNlO1xuY29uc3QgZGlyID0gaW5zdGFuY2UuZGlyO1xuY29uc3QgaW5pdCA9IGluc3RhbmNlLmluaXQ7XG5jb25zdCBsb2FkUmVzb3VyY2VzID0gaW5zdGFuY2UubG9hZFJlc291cmNlcztcbmNvbnN0IHJlbG9hZFJlc291cmNlcyA9IGluc3RhbmNlLnJlbG9hZFJlc291cmNlcztcbmNvbnN0IHVzZSA9IGluc3RhbmNlLnVzZTtcbmNvbnN0IGNoYW5nZUxhbmd1YWdlID0gaW5zdGFuY2UuY2hhbmdlTGFuZ3VhZ2U7XG5jb25zdCBnZXRGaXhlZFQgPSBpbnN0YW5jZS5nZXRGaXhlZFQ7XG5jb25zdCB0ID0gaW5zdGFuY2UudDtcbmNvbnN0IGV4aXN0cyA9IGluc3RhbmNlLmV4aXN0cztcbmNvbnN0IHNldERlZmF1bHROYW1lc3BhY2UgPSBpbnN0YW5jZS5zZXREZWZhdWx0TmFtZXNwYWNlO1xuY29uc3QgaGFzTG9hZGVkTmFtZXNwYWNlID0gaW5zdGFuY2UuaGFzTG9hZGVkTmFtZXNwYWNlO1xuY29uc3QgbG9hZE5hbWVzcGFjZXMgPSBpbnN0YW5jZS5sb2FkTmFtZXNwYWNlcztcbmNvbnN0IGxvYWRMYW5ndWFnZXMgPSBpbnN0YW5jZS5sb2FkTGFuZ3VhZ2VzO1xuXG5leHBvcnQgeyBjaGFuZ2VMYW5ndWFnZSwgY3JlYXRlSW5zdGFuY2UsIGluc3RhbmNlIGFzIGRlZmF1bHQsIGRpciwgZXhpc3RzLCBnZXRGaXhlZFQsIGhhc0xvYWRlZE5hbWVzcGFjZSwgaW5pdCwgbG9hZExhbmd1YWdlcywgbG9hZE5hbWVzcGFjZXMsIGxvYWRSZXNvdXJjZXMsIHJlbG9hZFJlc291cmNlcywgc2V0RGVmYXVsdE5hbWVzcGFjZSwgdCwgdXNlIH07XG4iLCJmdW5jdGlvbiBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlIC0gZmlsZSBzaXplIGhhY2tzXG4gICAgICAgIHJlcXVlc3Qub25jb21wbGV0ZSA9IHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgLSBmaWxlIHNpemUgaGFja3NcbiAgICAgICAgcmVxdWVzdC5vbmFib3J0ID0gcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlU3RvcmUoZGJOYW1lLCBzdG9yZU5hbWUpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oZGJOYW1lKTtcbiAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHJlcXVlc3QucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG4gICAgY29uc3QgZGJwID0gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0KTtcbiAgICByZXR1cm4gKHR4TW9kZSwgY2FsbGJhY2spID0+IGRicC50aGVuKChkYikgPT4gY2FsbGJhY2soZGIudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCB0eE1vZGUpLm9iamVjdFN0b3JlKHN0b3JlTmFtZSkpKTtcbn1cbmxldCBkZWZhdWx0R2V0U3RvcmVGdW5jO1xuZnVuY3Rpb24gZGVmYXVsdEdldFN0b3JlKCkge1xuICAgIGlmICghZGVmYXVsdEdldFN0b3JlRnVuYykge1xuICAgICAgICBkZWZhdWx0R2V0U3RvcmVGdW5jID0gY3JlYXRlU3RvcmUoJ2tleXZhbC1zdG9yZScsICdrZXl2YWwnKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRHZXRTdG9yZUZ1bmM7XG59XG4vKipcbiAqIEdldCBhIHZhbHVlIGJ5IGl0cyBrZXkuXG4gKlxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIGdldChrZXksIGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWRvbmx5JywgKHN0b3JlKSA9PiBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLmdldChrZXkpKSk7XG59XG4vKipcbiAqIFNldCBhIHZhbHVlIHdpdGggYSBrZXkuXG4gKlxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUsIGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4ge1xuICAgICAgICBzdG9yZS5wdXQodmFsdWUsIGtleSk7XG4gICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLnRyYW5zYWN0aW9uKTtcbiAgICB9KTtcbn1cbi8qKlxuICogU2V0IG11bHRpcGxlIHZhbHVlcyBhdCBvbmNlLiBUaGlzIGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgc2V0KCkgbXVsdGlwbGUgdGltZXMuXG4gKiBJdCdzIGFsc28gYXRvbWljIOKAkyBpZiBvbmUgb2YgdGhlIHBhaXJzIGNhbid0IGJlIGFkZGVkLCBub25lIHdpbGwgYmUgYWRkZWQuXG4gKlxuICogQHBhcmFtIGVudHJpZXMgQXJyYXkgb2YgZW50cmllcywgd2hlcmUgZWFjaCBlbnRyeSBpcyBhbiBhcnJheSBvZiBgW2tleSwgdmFsdWVdYC5cbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBzZXRNYW55KGVudHJpZXMsIGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4ge1xuICAgICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBzdG9yZS5wdXQoZW50cnlbMV0sIGVudHJ5WzBdKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLnRyYW5zYWN0aW9uKTtcbiAgICB9KTtcbn1cbi8qKlxuICogR2V0IG11bHRpcGxlIHZhbHVlcyBieSB0aGVpciBrZXlzXG4gKlxuICogQHBhcmFtIGtleXNcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBnZXRNYW55KGtleXMsIGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWRvbmx5JywgKHN0b3JlKSA9PiBQcm9taXNlLmFsbChrZXlzLm1hcCgoa2V5KSA9PiBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLmdldChrZXkpKSkpKTtcbn1cbi8qKlxuICogVXBkYXRlIGEgdmFsdWUuIFRoaXMgbGV0cyB5b3Ugc2VlIHRoZSBvbGQgdmFsdWUgYW5kIHVwZGF0ZSBpdCBhcyBhbiBhdG9taWMgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSB1cGRhdGVyIEEgY2FsbGJhY2sgdGhhdCB0YWtlcyB0aGUgb2xkIHZhbHVlIGFuZCByZXR1cm5zIGEgbmV3IHZhbHVlLlxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZShrZXksIHVwZGF0ZXIsIGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gXG4gICAgLy8gTmVlZCB0byBjcmVhdGUgdGhlIHByb21pc2UgbWFudWFsbHkuXG4gICAgLy8gSWYgSSB0cnkgdG8gY2hhaW4gcHJvbWlzZXMsIHRoZSB0cmFuc2FjdGlvbiBjbG9zZXMgaW4gYnJvd3NlcnNcbiAgICAvLyB0aGF0IHVzZSBhIHByb21pc2UgcG9seWZpbGwgKElFMTAvMTEpLlxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgc3RvcmUuZ2V0KGtleSkub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5wdXQodXBkYXRlcih0aGlzLnJlc3VsdCksIGtleSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLnRyYW5zYWN0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSkpO1xufVxuLyoqXG4gKiBEZWxldGUgYSBwYXJ0aWN1bGFyIGtleSBmcm9tIHRoZSBzdG9yZS5cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gZGVsKGtleSwgY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICAgIHN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS50cmFuc2FjdGlvbik7XG4gICAgfSk7XG59XG4vKipcbiAqIERlbGV0ZSBtdWx0aXBsZSBrZXlzIGF0IG9uY2UuXG4gKlxuICogQHBhcmFtIGtleXMgTGlzdCBvZiBrZXlzIHRvIGRlbGV0ZS5cbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBkZWxNYW55KGtleXMsIGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4ge1xuICAgICAgICBrZXlzLmZvckVhY2goKGtleSkgPT4gc3RvcmUuZGVsZXRlKGtleSkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS50cmFuc2FjdGlvbik7XG4gICAgfSk7XG59XG4vKipcbiAqIENsZWFyIGFsbCB2YWx1ZXMgaW4gdGhlIHN0b3JlLlxuICpcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBjbGVhcihjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUudHJhbnNhY3Rpb24pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZWFjaEN1cnNvcihzdG9yZSwgY2FsbGJhY2spIHtcbiAgICBzdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYWxsYmFjayh0aGlzLnJlc3VsdCk7XG4gICAgICAgIHRoaXMucmVzdWx0LmNvbnRpbnVlKCk7XG4gICAgfTtcbiAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS50cmFuc2FjdGlvbik7XG59XG4vKipcbiAqIEdldCBhbGwga2V5cyBpbiB0aGUgc3RvcmUuXG4gKlxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIGtleXMoY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZG9ubHknLCAoc3RvcmUpID0+IHtcbiAgICAgICAgLy8gRmFzdCBwYXRoIGZvciBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgaWYgKHN0b3JlLmdldEFsbEtleXMpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLmdldEFsbEtleXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgICAgcmV0dXJuIGVhY2hDdXJzb3Ioc3RvcmUsIChjdXJzb3IpID0+IGl0ZW1zLnB1c2goY3Vyc29yLmtleSkpLnRoZW4oKCkgPT4gaXRlbXMpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBHZXQgYWxsIHZhbHVlcyBpbiB0aGUgc3RvcmUuXG4gKlxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkb25seScsIChzdG9yZSkgPT4ge1xuICAgICAgICAvLyBGYXN0IHBhdGggZm9yIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpZiAoc3RvcmUuZ2V0QWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS5nZXRBbGwoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgICAgcmV0dXJuIGVhY2hDdXJzb3Ioc3RvcmUsIChjdXJzb3IpID0+IGl0ZW1zLnB1c2goY3Vyc29yLnZhbHVlKSkudGhlbigoKSA9PiBpdGVtcyk7XG4gICAgfSk7XG59XG4vKipcbiAqIEdldCBhbGwgZW50cmllcyBpbiB0aGUgc3RvcmUuIEVhY2ggZW50cnkgaXMgYW4gYXJyYXkgb2YgYFtrZXksIHZhbHVlXWAuXG4gKlxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIGVudHJpZXMoY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZG9ubHknLCAoc3RvcmUpID0+IHtcbiAgICAgICAgLy8gRmFzdCBwYXRoIGZvciBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgLy8gKGFsdGhvdWdoLCBob3BlZnVsbHkgd2UnbGwgZ2V0IGEgc2ltcGxlciBwYXRoIHNvbWUgZGF5KVxuICAgICAgICBpZiAoc3RvcmUuZ2V0QWxsICYmIHN0b3JlLmdldEFsbEtleXMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS5nZXRBbGxLZXlzKCkpLFxuICAgICAgICAgICAgICAgIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUuZ2V0QWxsKCkpLFxuICAgICAgICAgICAgXSkudGhlbigoW2tleXMsIHZhbHVlc10pID0+IGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHZhbHVlc1tpXV0pKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWRvbmx5JywgKHN0b3JlKSA9PiBlYWNoQ3Vyc29yKHN0b3JlLCAoY3Vyc29yKSA9PiBpdGVtcy5wdXNoKFtjdXJzb3Iua2V5LCBjdXJzb3IudmFsdWVdKSkudGhlbigoKSA9PiBpdGVtcykpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgeyBjbGVhciwgY3JlYXRlU3RvcmUsIGRlbCwgZGVsTWFueSwgZW50cmllcywgZ2V0LCBnZXRNYW55LCBrZXlzLCBwcm9taXNpZnlSZXF1ZXN0LCBzZXQsIHNldE1hbnksIHVwZGF0ZSwgdmFsdWVzIH07XG4iLCIvLyBzcmMvdXRpbHMvZW52LnRzXG52YXIgTk9USElORyA9IFN5bWJvbC5mb3IoXCJpbW1lci1ub3RoaW5nXCIpO1xudmFyIERSQUZUQUJMRSA9IFN5bWJvbC5mb3IoXCJpbW1lci1kcmFmdGFibGVcIik7XG52YXIgRFJBRlRfU1RBVEUgPSBTeW1ib2wuZm9yKFwiaW1tZXItc3RhdGVcIik7XG5cbi8vIHNyYy91dGlscy9lcnJvcnMudHNcbnZhciBlcnJvcnMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBbXG4gIC8vIEFsbCBlcnJvciBjb2Rlcywgc3RhcnRpbmcgYnkgMDpcbiAgZnVuY3Rpb24ocGx1Z2luKSB7XG4gICAgcmV0dXJuIGBUaGUgcGx1Z2luIGZvciAnJHtwbHVnaW59JyBoYXMgbm90IGJlZW4gbG9hZGVkIGludG8gSW1tZXIuIFRvIGVuYWJsZSB0aGUgcGx1Z2luLCBpbXBvcnQgYW5kIGNhbGwgXFxgZW5hYmxlJHtwbHVnaW59KClcXGAgd2hlbiBpbml0aWFsaXppbmcgeW91ciBhcHBsaWNhdGlvbi5gO1xuICB9LFxuICBmdW5jdGlvbih0aGluZykge1xuICAgIHJldHVybiBgcHJvZHVjZSBjYW4gb25seSBiZSBjYWxsZWQgb24gdGhpbmdzIHRoYXQgYXJlIGRyYWZ0YWJsZTogcGxhaW4gb2JqZWN0cywgYXJyYXlzLCBNYXAsIFNldCBvciBjbGFzc2VzIHRoYXQgYXJlIG1hcmtlZCB3aXRoICdbaW1tZXJhYmxlXTogdHJ1ZScuIEdvdCAnJHt0aGluZ30nYDtcbiAgfSxcbiAgXCJUaGlzIG9iamVjdCBoYXMgYmVlbiBmcm96ZW4gYW5kIHNob3VsZCBub3QgYmUgbXV0YXRlZFwiLFxuICBmdW5jdGlvbihkYXRhKSB7XG4gICAgcmV0dXJuIFwiQ2Fubm90IHVzZSBhIHByb3h5IHRoYXQgaGFzIGJlZW4gcmV2b2tlZC4gRGlkIHlvdSBwYXNzIGFuIG9iamVjdCBmcm9tIGluc2lkZSBhbiBpbW1lciBmdW5jdGlvbiB0byBhbiBhc3luYyBwcm9jZXNzPyBcIiArIGRhdGE7XG4gIH0sXG4gIFwiQW4gaW1tZXIgcHJvZHVjZXIgcmV0dXJuZWQgYSBuZXcgdmFsdWUgKmFuZCogbW9kaWZpZWQgaXRzIGRyYWZ0LiBFaXRoZXIgcmV0dXJuIGEgbmV3IHZhbHVlICpvciogbW9kaWZ5IHRoZSBkcmFmdC5cIixcbiAgXCJJbW1lciBmb3JiaWRzIGNpcmN1bGFyIHJlZmVyZW5jZXNcIixcbiAgXCJUaGUgZmlyc3Qgb3Igc2Vjb25kIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb25cIixcbiAgXCJUaGUgdGhpcmQgYXJndW1lbnQgdG8gYHByb2R1Y2VgIG11c3QgYmUgYSBmdW5jdGlvbiBvciB1bmRlZmluZWRcIixcbiAgXCJGaXJzdCBhcmd1bWVudCB0byBgY3JlYXRlRHJhZnRgIG11c3QgYmUgYSBwbGFpbiBvYmplY3QsIGFuIGFycmF5LCBvciBhbiBpbW1lcmFibGUgb2JqZWN0XCIsXG4gIFwiRmlyc3QgYXJndW1lbnQgdG8gYGZpbmlzaERyYWZ0YCBtdXN0IGJlIGEgZHJhZnQgcmV0dXJuZWQgYnkgYGNyZWF0ZURyYWZ0YFwiLFxuICBmdW5jdGlvbih0aGluZykge1xuICAgIHJldHVybiBgJ2N1cnJlbnQnIGV4cGVjdHMgYSBkcmFmdCwgZ290OiAke3RoaW5nfWA7XG4gIH0sXG4gIFwiT2JqZWN0LmRlZmluZVByb3BlcnR5KCkgY2Fubm90IGJlIHVzZWQgb24gYW4gSW1tZXIgZHJhZnRcIixcbiAgXCJPYmplY3Quc2V0UHJvdG90eXBlT2YoKSBjYW5ub3QgYmUgdXNlZCBvbiBhbiBJbW1lciBkcmFmdFwiLFxuICBcIkltbWVyIG9ubHkgc3VwcG9ydHMgZGVsZXRpbmcgYXJyYXkgaW5kaWNlc1wiLFxuICBcIkltbWVyIG9ubHkgc3VwcG9ydHMgc2V0dGluZyBhcnJheSBpbmRpY2VzIGFuZCB0aGUgJ2xlbmd0aCcgcHJvcGVydHlcIixcbiAgZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gYCdvcmlnaW5hbCcgZXhwZWN0cyBhIGRyYWZ0LCBnb3Q6ICR7dGhpbmd9YDtcbiAgfVxuICAvLyBOb3RlOiBpZiBtb3JlIGVycm9ycyBhcmUgYWRkZWQsIHRoZSBlcnJvck9mZnNldCBpbiBQYXRjaGVzLnRzIHNob3VsZCBiZSBpbmNyZWFzZWRcbiAgLy8gU2VlIFBhdGNoZXMudHMgZm9yIGFkZGl0aW9uYWwgZXJyb3JzXG5dIDogW107XG5mdW5jdGlvbiBkaWUoZXJyb3IsIC4uLmFyZ3MpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGNvbnN0IGUgPSBlcnJvcnNbZXJyb3JdO1xuICAgIGNvbnN0IG1zZyA9IHR5cGVvZiBlID09PSBcImZ1bmN0aW9uXCIgPyBlLmFwcGx5KG51bGwsIGFyZ3MpIDogZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFtJbW1lcl0gJHttc2d9YCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBbSW1tZXJdIG1pbmlmaWVkIGVycm9yIG5yOiAke2Vycm9yfS4gRnVsbCBlcnJvciBhdDogaHR0cHM6Ly9iaXQubHkvM2NYRUtXZmBcbiAgKTtcbn1cblxuLy8gc3JjL3V0aWxzL2NvbW1vbi50c1xudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuZnVuY3Rpb24gaXNEcmFmdCh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiAhIXZhbHVlW0RSQUZUX1NUQVRFXTtcbn1cbmZ1bmN0aW9uIGlzRHJhZnRhYmxlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgISF2YWx1ZVtEUkFGVEFCTEVdIHx8ICEhdmFsdWUuY29uc3RydWN0b3I/LltEUkFGVEFCTEVdIHx8IGlzTWFwKHZhbHVlKSB8fCBpc1NldCh2YWx1ZSk7XG59XG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IudG9TdHJpbmcoKTtcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgQ3RvciA9IE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCBcImNvbnN0cnVjdG9yXCIpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICBpZiAoQ3RvciA9PT0gT2JqZWN0KVxuICAgIHJldHVybiB0cnVlO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gXCJmdW5jdGlvblwiICYmIEZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoQ3RvcikgPT09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5mdW5jdGlvbiBvcmlnaW5hbCh2YWx1ZSkge1xuICBpZiAoIWlzRHJhZnQodmFsdWUpKVxuICAgIGRpZSgxNSwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWVbRFJBRlRfU1RBVEVdLmJhc2VfO1xufVxuZnVuY3Rpb24gZWFjaChvYmosIGl0ZXIpIHtcbiAgaWYgKGdldEFyY2h0eXBlKG9iaikgPT09IDAgLyogT2JqZWN0ICovKSB7XG4gICAgUmVmbGVjdC5vd25LZXlzKG9iaikuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpdGVyKGtleSwgb2JqW2tleV0sIG9iaik7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqLmZvckVhY2goKGVudHJ5LCBpbmRleCkgPT4gaXRlcihpbmRleCwgZW50cnksIG9iaikpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRBcmNodHlwZSh0aGluZykge1xuICBjb25zdCBzdGF0ZSA9IHRoaW5nW0RSQUZUX1NUQVRFXTtcbiAgcmV0dXJuIHN0YXRlID8gc3RhdGUudHlwZV8gOiBBcnJheS5pc0FycmF5KHRoaW5nKSA/IDEgLyogQXJyYXkgKi8gOiBpc01hcCh0aGluZykgPyAyIC8qIE1hcCAqLyA6IGlzU2V0KHRoaW5nKSA/IDMgLyogU2V0ICovIDogMCAvKiBPYmplY3QgKi87XG59XG5mdW5jdGlvbiBoYXModGhpbmcsIHByb3ApIHtcbiAgcmV0dXJuIGdldEFyY2h0eXBlKHRoaW5nKSA9PT0gMiAvKiBNYXAgKi8gPyB0aGluZy5oYXMocHJvcCkgOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpbmcsIHByb3ApO1xufVxuZnVuY3Rpb24gZ2V0KHRoaW5nLCBwcm9wKSB7XG4gIHJldHVybiBnZXRBcmNodHlwZSh0aGluZykgPT09IDIgLyogTWFwICovID8gdGhpbmcuZ2V0KHByb3ApIDogdGhpbmdbcHJvcF07XG59XG5mdW5jdGlvbiBzZXQodGhpbmcsIHByb3BPck9sZFZhbHVlLCB2YWx1ZSkge1xuICBjb25zdCB0ID0gZ2V0QXJjaHR5cGUodGhpbmcpO1xuICBpZiAodCA9PT0gMiAvKiBNYXAgKi8pXG4gICAgdGhpbmcuc2V0KHByb3BPck9sZFZhbHVlLCB2YWx1ZSk7XG4gIGVsc2UgaWYgKHQgPT09IDMgLyogU2V0ICovKSB7XG4gICAgdGhpbmcuYWRkKHZhbHVlKTtcbiAgfSBlbHNlXG4gICAgdGhpbmdbcHJvcE9yT2xkVmFsdWVdID0gdmFsdWU7XG59XG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzTWFwKHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgTWFwO1xufVxuZnVuY3Rpb24gaXNTZXQodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBTZXQ7XG59XG5mdW5jdGlvbiBsYXRlc3Qoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmNvcHlfIHx8IHN0YXRlLmJhc2VfO1xufVxuZnVuY3Rpb24gc2hhbGxvd0NvcHkoYmFzZSwgc3RyaWN0KSB7XG4gIGlmIChpc01hcChiYXNlKSkge1xuICAgIHJldHVybiBuZXcgTWFwKGJhc2UpO1xuICB9XG4gIGlmIChpc1NldChiYXNlKSkge1xuICAgIHJldHVybiBuZXcgU2V0KGJhc2UpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2UpKVxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChiYXNlKTtcbiAgY29uc3QgaXNQbGFpbiA9IGlzUGxhaW5PYmplY3QoYmFzZSk7XG4gIGlmIChzdHJpY3QgPT09IHRydWUgfHwgc3RyaWN0ID09PSBcImNsYXNzX29ubHlcIiAmJiAhaXNQbGFpbikge1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoYmFzZSk7XG4gICAgZGVsZXRlIGRlc2NyaXB0b3JzW0RSQUZUX1NUQVRFXTtcbiAgICBsZXQga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhkZXNjcmlwdG9ycyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgY29uc3QgZGVzYyA9IGRlc2NyaXB0b3JzW2tleV07XG4gICAgICBpZiAoZGVzYy53cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZGVzYy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkZXNjLmdldCB8fCBkZXNjLnNldClcbiAgICAgICAgZGVzY3JpcHRvcnNba2V5XSA9IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgLy8gY291bGQgbGl2ZSB3aXRoICEhZGVzYy5zZXQgYXMgd2VsbCBoZXJlLi4uXG4gICAgICAgICAgZW51bWVyYWJsZTogZGVzYy5lbnVtZXJhYmxlLFxuICAgICAgICAgIHZhbHVlOiBiYXNlW2tleV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2V0UHJvdG90eXBlT2YoYmFzZSksIGRlc2NyaXB0b3JzKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKGJhc2UpO1xuICAgIGlmIChwcm90byAhPT0gbnVsbCAmJiBpc1BsYWluKSB7XG4gICAgICByZXR1cm4geyAuLi5iYXNlIH07XG4gICAgfVxuICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUocHJvdG8pO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG9iaiwgYmFzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZyZWV6ZShvYmosIGRlZXAgPSBmYWxzZSkge1xuICBpZiAoaXNGcm96ZW4ob2JqKSB8fCBpc0RyYWZ0KG9iaikgfHwgIWlzRHJhZnRhYmxlKG9iaikpXG4gICAgcmV0dXJuIG9iajtcbiAgaWYgKGdldEFyY2h0eXBlKG9iaikgPiAxKSB7XG4gICAgb2JqLnNldCA9IG9iai5hZGQgPSBvYmouY2xlYXIgPSBvYmouZGVsZXRlID0gZG9udE11dGF0ZUZyb3plbkNvbGxlY3Rpb25zO1xuICB9XG4gIE9iamVjdC5mcmVlemUob2JqKTtcbiAgaWYgKGRlZXApXG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IGZyZWV6ZSh2YWx1ZSwgdHJ1ZSkpO1xuICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gZG9udE11dGF0ZUZyb3plbkNvbGxlY3Rpb25zKCkge1xuICBkaWUoMik7XG59XG5mdW5jdGlvbiBpc0Zyb3plbihvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5pc0Zyb3plbihvYmopO1xufVxuXG4vLyBzcmMvdXRpbHMvcGx1Z2lucy50c1xudmFyIHBsdWdpbnMgPSB7fTtcbmZ1bmN0aW9uIGdldFBsdWdpbihwbHVnaW5LZXkpIHtcbiAgY29uc3QgcGx1Z2luID0gcGx1Z2luc1twbHVnaW5LZXldO1xuICBpZiAoIXBsdWdpbikge1xuICAgIGRpZSgwLCBwbHVnaW5LZXkpO1xuICB9XG4gIHJldHVybiBwbHVnaW47XG59XG5mdW5jdGlvbiBsb2FkUGx1Z2luKHBsdWdpbktleSwgaW1wbGVtZW50YXRpb24pIHtcbiAgaWYgKCFwbHVnaW5zW3BsdWdpbktleV0pXG4gICAgcGx1Z2luc1twbHVnaW5LZXldID0gaW1wbGVtZW50YXRpb247XG59XG5cbi8vIHNyYy9jb3JlL3Njb3BlLnRzXG52YXIgY3VycmVudFNjb3BlO1xuZnVuY3Rpb24gZ2V0Q3VycmVudFNjb3BlKCkge1xuICByZXR1cm4gY3VycmVudFNjb3BlO1xufVxuZnVuY3Rpb24gY3JlYXRlU2NvcGUocGFyZW50XywgaW1tZXJfKSB7XG4gIHJldHVybiB7XG4gICAgZHJhZnRzXzogW10sXG4gICAgcGFyZW50XyxcbiAgICBpbW1lcl8sXG4gICAgLy8gV2hlbmV2ZXIgdGhlIG1vZGlmaWVkIGRyYWZ0IGNvbnRhaW5zIGEgZHJhZnQgZnJvbSBhbm90aGVyIHNjb3BlLCB3ZVxuICAgIC8vIG5lZWQgdG8gcHJldmVudCBhdXRvLWZyZWV6aW5nIHNvIHRoZSB1bm93bmVkIGRyYWZ0IGNhbiBiZSBmaW5hbGl6ZWQuXG4gICAgY2FuQXV0b0ZyZWV6ZV86IHRydWUsXG4gICAgdW5maW5hbGl6ZWREcmFmdHNfOiAwXG4gIH07XG59XG5mdW5jdGlvbiB1c2VQYXRjaGVzSW5TY29wZShzY29wZSwgcGF0Y2hMaXN0ZW5lcikge1xuICBpZiAocGF0Y2hMaXN0ZW5lcikge1xuICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIik7XG4gICAgc2NvcGUucGF0Y2hlc18gPSBbXTtcbiAgICBzY29wZS5pbnZlcnNlUGF0Y2hlc18gPSBbXTtcbiAgICBzY29wZS5wYXRjaExpc3RlbmVyXyA9IHBhdGNoTGlzdGVuZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHJldm9rZVNjb3BlKHNjb3BlKSB7XG4gIGxlYXZlU2NvcGUoc2NvcGUpO1xuICBzY29wZS5kcmFmdHNfLmZvckVhY2gocmV2b2tlRHJhZnQpO1xuICBzY29wZS5kcmFmdHNfID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGxlYXZlU2NvcGUoc2NvcGUpIHtcbiAgaWYgKHNjb3BlID09PSBjdXJyZW50U2NvcGUpIHtcbiAgICBjdXJyZW50U2NvcGUgPSBzY29wZS5wYXJlbnRfO1xuICB9XG59XG5mdW5jdGlvbiBlbnRlclNjb3BlKGltbWVyMikge1xuICByZXR1cm4gY3VycmVudFNjb3BlID0gY3JlYXRlU2NvcGUoY3VycmVudFNjb3BlLCBpbW1lcjIpO1xufVxuZnVuY3Rpb24gcmV2b2tlRHJhZnQoZHJhZnQpIHtcbiAgY29uc3Qgc3RhdGUgPSBkcmFmdFtEUkFGVF9TVEFURV07XG4gIGlmIChzdGF0ZS50eXBlXyA9PT0gMCAvKiBPYmplY3QgKi8gfHwgc3RhdGUudHlwZV8gPT09IDEgLyogQXJyYXkgKi8pXG4gICAgc3RhdGUucmV2b2tlXygpO1xuICBlbHNlXG4gICAgc3RhdGUucmV2b2tlZF8gPSB0cnVlO1xufVxuXG4vLyBzcmMvY29yZS9maW5hbGl6ZS50c1xuZnVuY3Rpb24gcHJvY2Vzc1Jlc3VsdChyZXN1bHQsIHNjb3BlKSB7XG4gIHNjb3BlLnVuZmluYWxpemVkRHJhZnRzXyA9IHNjb3BlLmRyYWZ0c18ubGVuZ3RoO1xuICBjb25zdCBiYXNlRHJhZnQgPSBzY29wZS5kcmFmdHNfWzBdO1xuICBjb25zdCBpc1JlcGxhY2VkID0gcmVzdWx0ICE9PSB2b2lkIDAgJiYgcmVzdWx0ICE9PSBiYXNlRHJhZnQ7XG4gIGlmIChpc1JlcGxhY2VkKSB7XG4gICAgaWYgKGJhc2VEcmFmdFtEUkFGVF9TVEFURV0ubW9kaWZpZWRfKSB7XG4gICAgICByZXZva2VTY29wZShzY29wZSk7XG4gICAgICBkaWUoNCk7XG4gICAgfVxuICAgIGlmIChpc0RyYWZ0YWJsZShyZXN1bHQpKSB7XG4gICAgICByZXN1bHQgPSBmaW5hbGl6ZShzY29wZSwgcmVzdWx0KTtcbiAgICAgIGlmICghc2NvcGUucGFyZW50XylcbiAgICAgICAgbWF5YmVGcmVlemUoc2NvcGUsIHJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChzY29wZS5wYXRjaGVzXykge1xuICAgICAgZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5nZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18oXG4gICAgICAgIGJhc2VEcmFmdFtEUkFGVF9TVEFURV0uYmFzZV8sXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgc2NvcGUucGF0Y2hlc18sXG4gICAgICAgIHNjb3BlLmludmVyc2VQYXRjaGVzX1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gZmluYWxpemUoc2NvcGUsIGJhc2VEcmFmdCwgW10pO1xuICB9XG4gIHJldm9rZVNjb3BlKHNjb3BlKTtcbiAgaWYgKHNjb3BlLnBhdGNoZXNfKSB7XG4gICAgc2NvcGUucGF0Y2hMaXN0ZW5lcl8oc2NvcGUucGF0Y2hlc18sIHNjb3BlLmludmVyc2VQYXRjaGVzXyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdCAhPT0gTk9USElORyA/IHJlc3VsdCA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGZpbmFsaXplKHJvb3RTY29wZSwgdmFsdWUsIHBhdGgpIHtcbiAgaWYgKGlzRnJvemVuKHZhbHVlKSlcbiAgICByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IHN0YXRlID0gdmFsdWVbRFJBRlRfU1RBVEVdO1xuICBpZiAoIXN0YXRlKSB7XG4gICAgZWFjaChcbiAgICAgIHZhbHVlLFxuICAgICAgKGtleSwgY2hpbGRWYWx1ZSkgPT4gZmluYWxpemVQcm9wZXJ0eShyb290U2NvcGUsIHN0YXRlLCB2YWx1ZSwga2V5LCBjaGlsZFZhbHVlLCBwYXRoKVxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChzdGF0ZS5zY29wZV8gIT09IHJvb3RTY29wZSlcbiAgICByZXR1cm4gdmFsdWU7XG4gIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgbWF5YmVGcmVlemUocm9vdFNjb3BlLCBzdGF0ZS5iYXNlXywgdHJ1ZSk7XG4gICAgcmV0dXJuIHN0YXRlLmJhc2VfO1xuICB9XG4gIGlmICghc3RhdGUuZmluYWxpemVkXykge1xuICAgIHN0YXRlLmZpbmFsaXplZF8gPSB0cnVlO1xuICAgIHN0YXRlLnNjb3BlXy51bmZpbmFsaXplZERyYWZ0c18tLTtcbiAgICBjb25zdCByZXN1bHQgPSBzdGF0ZS5jb3B5XztcbiAgICBsZXQgcmVzdWx0RWFjaCA9IHJlc3VsdDtcbiAgICBsZXQgaXNTZXQyID0gZmFsc2U7XG4gICAgaWYgKHN0YXRlLnR5cGVfID09PSAzIC8qIFNldCAqLykge1xuICAgICAgcmVzdWx0RWFjaCA9IG5ldyBTZXQocmVzdWx0KTtcbiAgICAgIHJlc3VsdC5jbGVhcigpO1xuICAgICAgaXNTZXQyID0gdHJ1ZTtcbiAgICB9XG4gICAgZWFjaChcbiAgICAgIHJlc3VsdEVhY2gsXG4gICAgICAoa2V5LCBjaGlsZFZhbHVlKSA9PiBmaW5hbGl6ZVByb3BlcnR5KHJvb3RTY29wZSwgc3RhdGUsIHJlc3VsdCwga2V5LCBjaGlsZFZhbHVlLCBwYXRoLCBpc1NldDIpXG4gICAgKTtcbiAgICBtYXliZUZyZWV6ZShyb290U2NvcGUsIHJlc3VsdCwgZmFsc2UpO1xuICAgIGlmIChwYXRoICYmIHJvb3RTY29wZS5wYXRjaGVzXykge1xuICAgICAgZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5nZW5lcmF0ZVBhdGNoZXNfKFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcm9vdFNjb3BlLnBhdGNoZXNfLFxuICAgICAgICByb290U2NvcGUuaW52ZXJzZVBhdGNoZXNfXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RhdGUuY29weV87XG59XG5mdW5jdGlvbiBmaW5hbGl6ZVByb3BlcnR5KHJvb3RTY29wZSwgcGFyZW50U3RhdGUsIHRhcmdldE9iamVjdCwgcHJvcCwgY2hpbGRWYWx1ZSwgcm9vdFBhdGgsIHRhcmdldElzU2V0KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgY2hpbGRWYWx1ZSA9PT0gdGFyZ2V0T2JqZWN0KVxuICAgIGRpZSg1KTtcbiAgaWYgKGlzRHJhZnQoY2hpbGRWYWx1ZSkpIHtcbiAgICBjb25zdCBwYXRoID0gcm9vdFBhdGggJiYgcGFyZW50U3RhdGUgJiYgcGFyZW50U3RhdGUudHlwZV8gIT09IDMgLyogU2V0ICovICYmIC8vIFNldCBvYmplY3RzIGFyZSBhdG9taWMgc2luY2UgdGhleSBoYXZlIG5vIGtleXMuXG4gICAgIWhhcyhwYXJlbnRTdGF0ZS5hc3NpZ25lZF8sIHByb3ApID8gcm9vdFBhdGguY29uY2F0KHByb3ApIDogdm9pZCAwO1xuICAgIGNvbnN0IHJlcyA9IGZpbmFsaXplKHJvb3RTY29wZSwgY2hpbGRWYWx1ZSwgcGF0aCk7XG4gICAgc2V0KHRhcmdldE9iamVjdCwgcHJvcCwgcmVzKTtcbiAgICBpZiAoaXNEcmFmdChyZXMpKSB7XG4gICAgICByb290U2NvcGUuY2FuQXV0b0ZyZWV6ZV8gPSBmYWxzZTtcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0YXJnZXRJc1NldCkge1xuICAgIHRhcmdldE9iamVjdC5hZGQoY2hpbGRWYWx1ZSk7XG4gIH1cbiAgaWYgKGlzRHJhZnRhYmxlKGNoaWxkVmFsdWUpICYmICFpc0Zyb3plbihjaGlsZFZhbHVlKSkge1xuICAgIGlmICghcm9vdFNjb3BlLmltbWVyXy5hdXRvRnJlZXplXyAmJiByb290U2NvcGUudW5maW5hbGl6ZWREcmFmdHNfIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmaW5hbGl6ZShyb290U2NvcGUsIGNoaWxkVmFsdWUpO1xuICAgIGlmICgoIXBhcmVudFN0YXRlIHx8ICFwYXJlbnRTdGF0ZS5zY29wZV8ucGFyZW50XykgJiYgdHlwZW9mIHByb3AgIT09IFwic3ltYm9sXCIgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRhcmdldE9iamVjdCwgcHJvcCkpXG4gICAgICBtYXliZUZyZWV6ZShyb290U2NvcGUsIGNoaWxkVmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiBtYXliZUZyZWV6ZShzY29wZSwgdmFsdWUsIGRlZXAgPSBmYWxzZSkge1xuICBpZiAoIXNjb3BlLnBhcmVudF8gJiYgc2NvcGUuaW1tZXJfLmF1dG9GcmVlemVfICYmIHNjb3BlLmNhbkF1dG9GcmVlemVfKSB7XG4gICAgZnJlZXplKHZhbHVlLCBkZWVwKTtcbiAgfVxufVxuXG4vLyBzcmMvY29yZS9wcm94eS50c1xuZnVuY3Rpb24gY3JlYXRlUHJveHlQcm94eShiYXNlLCBwYXJlbnQpIHtcbiAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYmFzZSk7XG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIHR5cGVfOiBpc0FycmF5ID8gMSAvKiBBcnJheSAqLyA6IDAgLyogT2JqZWN0ICovLFxuICAgIC8vIFRyYWNrIHdoaWNoIHByb2R1Y2UgY2FsbCB0aGlzIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICBzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcbiAgICAvLyBUcnVlIGZvciBib3RoIHNoYWxsb3cgYW5kIGRlZXAgY2hhbmdlcy5cbiAgICBtb2RpZmllZF86IGZhbHNlLFxuICAgIC8vIFVzZWQgZHVyaW5nIGZpbmFsaXphdGlvbi5cbiAgICBmaW5hbGl6ZWRfOiBmYWxzZSxcbiAgICAvLyBUcmFjayB3aGljaCBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBhc3NpZ25lZCAodHJ1ZSkgb3IgZGVsZXRlZCAoZmFsc2UpLlxuICAgIGFzc2lnbmVkXzoge30sXG4gICAgLy8gVGhlIHBhcmVudCBkcmFmdCBzdGF0ZS5cbiAgICBwYXJlbnRfOiBwYXJlbnQsXG4gICAgLy8gVGhlIGJhc2Ugc3RhdGUuXG4gICAgYmFzZV86IGJhc2UsXG4gICAgLy8gVGhlIGJhc2UgcHJveHkuXG4gICAgZHJhZnRfOiBudWxsLFxuICAgIC8vIHNldCBiZWxvd1xuICAgIC8vIFRoZSBiYXNlIGNvcHkgd2l0aCBhbnkgdXBkYXRlZCB2YWx1ZXMuXG4gICAgY29weV86IG51bGwsXG4gICAgLy8gQ2FsbGVkIGJ5IHRoZSBgcHJvZHVjZWAgZnVuY3Rpb24uXG4gICAgcmV2b2tlXzogbnVsbCxcbiAgICBpc01hbnVhbF86IGZhbHNlXG4gIH07XG4gIGxldCB0YXJnZXQgPSBzdGF0ZTtcbiAgbGV0IHRyYXBzID0gb2JqZWN0VHJhcHM7XG4gIGlmIChpc0FycmF5KSB7XG4gICAgdGFyZ2V0ID0gW3N0YXRlXTtcbiAgICB0cmFwcyA9IGFycmF5VHJhcHM7XG4gIH1cbiAgY29uc3QgeyByZXZva2UsIHByb3h5IH0gPSBQcm94eS5yZXZvY2FibGUodGFyZ2V0LCB0cmFwcyk7XG4gIHN0YXRlLmRyYWZ0XyA9IHByb3h5O1xuICBzdGF0ZS5yZXZva2VfID0gcmV2b2tlO1xuICByZXR1cm4gcHJveHk7XG59XG52YXIgb2JqZWN0VHJhcHMgPSB7XG4gIGdldChzdGF0ZSwgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSBEUkFGVF9TVEFURSlcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICBjb25zdCBzb3VyY2UgPSBsYXRlc3Qoc3RhdGUpO1xuICAgIGlmICghaGFzKHNvdXJjZSwgcHJvcCkpIHtcbiAgICAgIHJldHVybiByZWFkUHJvcEZyb21Qcm90byhzdGF0ZSwgc291cmNlLCBwcm9wKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2VbcHJvcF07XG4gICAgaWYgKHN0YXRlLmZpbmFsaXplZF8gfHwgIWlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHBlZWsoc3RhdGUuYmFzZV8sIHByb3ApKSB7XG4gICAgICBwcmVwYXJlQ29weShzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGUuY29weV9bcHJvcF0gPSBjcmVhdGVQcm94eSh2YWx1ZSwgc3RhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG4gIGhhcyhzdGF0ZSwgcHJvcCkge1xuICAgIHJldHVybiBwcm9wIGluIGxhdGVzdChzdGF0ZSk7XG4gIH0sXG4gIG93bktleXMoc3RhdGUpIHtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKGxhdGVzdChzdGF0ZSkpO1xuICB9LFxuICBzZXQoc3RhdGUsIHByb3AsIHZhbHVlKSB7XG4gICAgY29uc3QgZGVzYyA9IGdldERlc2NyaXB0b3JGcm9tUHJvdG8obGF0ZXN0KHN0YXRlKSwgcHJvcCk7XG4gICAgaWYgKGRlc2M/LnNldCkge1xuICAgICAgZGVzYy5zZXQuY2FsbChzdGF0ZS5kcmFmdF8sIHZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuICAgICAgY29uc3QgY3VycmVudDIgPSBwZWVrKGxhdGVzdChzdGF0ZSksIHByb3ApO1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gY3VycmVudDI/LltEUkFGVF9TVEFURV07XG4gICAgICBpZiAoY3VycmVudFN0YXRlICYmIGN1cnJlbnRTdGF0ZS5iYXNlXyA9PT0gdmFsdWUpIHtcbiAgICAgICAgc3RhdGUuY29weV9bcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfW3Byb3BdID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzKHZhbHVlLCBjdXJyZW50MikgJiYgKHZhbHVlICE9PSB2b2lkIDAgfHwgaGFzKHN0YXRlLmJhc2VfLCBwcm9wKSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgcHJlcGFyZUNvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY29weV9bcHJvcF0gPT09IHZhbHVlICYmIC8vIHNwZWNpYWwgY2FzZTogaGFuZGxlIG5ldyBwcm9wcyB3aXRoIHZhbHVlICd1bmRlZmluZWQnXG4gICAgKHZhbHVlICE9PSB2b2lkIDAgfHwgcHJvcCBpbiBzdGF0ZS5jb3B5XykgfHwgLy8gc3BlY2lhbCBjYXNlOiBOYU5cbiAgICBOdW1iZXIuaXNOYU4odmFsdWUpICYmIE51bWJlci5pc05hTihzdGF0ZS5jb3B5X1twcm9wXSkpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBzdGF0ZS5jb3B5X1twcm9wXSA9IHZhbHVlO1xuICAgIHN0YXRlLmFzc2lnbmVkX1twcm9wXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KHN0YXRlLCBwcm9wKSB7XG4gICAgaWYgKHBlZWsoc3RhdGUuYmFzZV8sIHByb3ApICE9PSB2b2lkIDAgfHwgcHJvcCBpbiBzdGF0ZS5iYXNlXykge1xuICAgICAgc3RhdGUuYXNzaWduZWRfW3Byb3BdID0gZmFsc2U7XG4gICAgICBwcmVwYXJlQ29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBzdGF0ZS5hc3NpZ25lZF9bcHJvcF07XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3B5Xykge1xuICAgICAgZGVsZXRlIHN0YXRlLmNvcHlfW3Byb3BdO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLy8gTm90ZTogV2UgbmV2ZXIgY29lcmNlIGBkZXNjLnZhbHVlYCBpbnRvIGFuIEltbWVyIGRyYWZ0LCBiZWNhdXNlIHdlIGNhbid0IG1ha2VcbiAgLy8gdGhlIHNhbWUgZ3VhcmFudGVlIGluIEVTNSBtb2RlLlxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3RhdGUsIHByb3ApIHtcbiAgICBjb25zdCBvd25lciA9IGxhdGVzdChzdGF0ZSk7XG4gICAgY29uc3QgZGVzYyA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG93bmVyLCBwcm9wKTtcbiAgICBpZiAoIWRlc2MpXG4gICAgICByZXR1cm4gZGVzYztcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHN0YXRlLnR5cGVfICE9PSAxIC8qIEFycmF5ICovIHx8IHByb3AgIT09IFwibGVuZ3RoXCIsXG4gICAgICBlbnVtZXJhYmxlOiBkZXNjLmVudW1lcmFibGUsXG4gICAgICB2YWx1ZTogb3duZXJbcHJvcF1cbiAgICB9O1xuICB9LFxuICBkZWZpbmVQcm9wZXJ0eSgpIHtcbiAgICBkaWUoMTEpO1xuICB9LFxuICBnZXRQcm90b3R5cGVPZihzdGF0ZSkge1xuICAgIHJldHVybiBnZXRQcm90b3R5cGVPZihzdGF0ZS5iYXNlXyk7XG4gIH0sXG4gIHNldFByb3RvdHlwZU9mKCkge1xuICAgIGRpZSgxMik7XG4gIH1cbn07XG52YXIgYXJyYXlUcmFwcyA9IHt9O1xuZWFjaChvYmplY3RUcmFwcywgKGtleSwgZm4pID0+IHtcbiAgYXJyYXlUcmFwc1trZXldID0gZnVuY3Rpb24oKSB7XG4gICAgYXJndW1lbnRzWzBdID0gYXJndW1lbnRzWzBdWzBdO1xuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufSk7XG5hcnJheVRyYXBzLmRlbGV0ZVByb3BlcnR5ID0gZnVuY3Rpb24oc3RhdGUsIHByb3ApIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBpc05hTihwYXJzZUludChwcm9wKSkpXG4gICAgZGllKDEzKTtcbiAgcmV0dXJuIGFycmF5VHJhcHMuc2V0LmNhbGwodGhpcywgc3RhdGUsIHByb3AsIHZvaWQgMCk7XG59O1xuYXJyYXlUcmFwcy5zZXQgPSBmdW5jdGlvbihzdGF0ZSwgcHJvcCwgdmFsdWUpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBwcm9wICE9PSBcImxlbmd0aFwiICYmIGlzTmFOKHBhcnNlSW50KHByb3ApKSlcbiAgICBkaWUoMTQpO1xuICByZXR1cm4gb2JqZWN0VHJhcHMuc2V0LmNhbGwodGhpcywgc3RhdGVbMF0sIHByb3AsIHZhbHVlLCBzdGF0ZVswXSk7XG59O1xuZnVuY3Rpb24gcGVlayhkcmFmdCwgcHJvcCkge1xuICBjb25zdCBzdGF0ZSA9IGRyYWZ0W0RSQUZUX1NUQVRFXTtcbiAgY29uc3Qgc291cmNlID0gc3RhdGUgPyBsYXRlc3Qoc3RhdGUpIDogZHJhZnQ7XG4gIHJldHVybiBzb3VyY2VbcHJvcF07XG59XG5mdW5jdGlvbiByZWFkUHJvcEZyb21Qcm90byhzdGF0ZSwgc291cmNlLCBwcm9wKSB7XG4gIGNvbnN0IGRlc2MgPSBnZXREZXNjcmlwdG9yRnJvbVByb3RvKHNvdXJjZSwgcHJvcCk7XG4gIHJldHVybiBkZXNjID8gYHZhbHVlYCBpbiBkZXNjID8gZGVzYy52YWx1ZSA6IChcbiAgICAvLyBUaGlzIGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UsIGlmIHRoZSBwcm9wIGlzIGEgZ2V0dGVyIGRlZmluZWQgYnkgdGhlXG4gICAgLy8gcHJvdG90eXBlLCB3ZSBzaG91bGQgaW52b2tlIGl0IHdpdGggdGhlIGRyYWZ0IGFzIGNvbnRleHQhXG4gICAgZGVzYy5nZXQ/LmNhbGwoc3RhdGUuZHJhZnRfKVxuICApIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhzb3VyY2UsIHByb3ApIHtcbiAgaWYgKCEocHJvcCBpbiBzb3VyY2UpKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGxldCBwcm90byA9IGdldFByb3RvdHlwZU9mKHNvdXJjZSk7XG4gIHdoaWxlIChwcm90bykge1xuICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBwcm9wKTtcbiAgICBpZiAoZGVzYylcbiAgICAgIHJldHVybiBkZXNjO1xuICAgIHByb3RvID0gZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiB2b2lkIDA7XG59XG5mdW5jdGlvbiBtYXJrQ2hhbmdlZChzdGF0ZSkge1xuICBpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuICAgIHN0YXRlLm1vZGlmaWVkXyA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnBhcmVudF8pIHtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlLnBhcmVudF8pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZUNvcHkoc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgIHN0YXRlLmNvcHlfID0gc2hhbGxvd0NvcHkoXG4gICAgICBzdGF0ZS5iYXNlXyxcbiAgICAgIHN0YXRlLnNjb3BlXy5pbW1lcl8udXNlU3RyaWN0U2hhbGxvd0NvcHlfXG4gICAgKTtcbiAgfVxufVxuXG4vLyBzcmMvY29yZS9pbW1lckNsYXNzLnRzXG52YXIgSW1tZXIyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmF1dG9GcmVlemVfID0gdHJ1ZTtcbiAgICB0aGlzLnVzZVN0cmljdFNoYWxsb3dDb3B5XyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcHJvZHVjZWAgZnVuY3Rpb24gdGFrZXMgYSB2YWx1ZSBhbmQgYSBcInJlY2lwZSBmdW5jdGlvblwiICh3aG9zZVxuICAgICAqIHJldHVybiB2YWx1ZSBvZnRlbiBkZXBlbmRzIG9uIHRoZSBiYXNlIHN0YXRlKS4gVGhlIHJlY2lwZSBmdW5jdGlvbiBpc1xuICAgICAqIGZyZWUgdG8gbXV0YXRlIGl0cyBmaXJzdCBhcmd1bWVudCBob3dldmVyIGl0IHdhbnRzLiBBbGwgbXV0YXRpb25zIGFyZVxuICAgICAqIG9ubHkgZXZlciBhcHBsaWVkIHRvIGEgX19jb3B5X18gb2YgdGhlIGJhc2Ugc3RhdGUuXG4gICAgICpcbiAgICAgKiBQYXNzIG9ubHkgYSBmdW5jdGlvbiB0byBjcmVhdGUgYSBcImN1cnJpZWQgcHJvZHVjZXJcIiB3aGljaCByZWxpZXZlcyB5b3VcbiAgICAgKiBmcm9tIHBhc3NpbmcgdGhlIHJlY2lwZSBmdW5jdGlvbiBldmVyeSB0aW1lLlxuICAgICAqXG4gICAgICogT25seSBwbGFpbiBvYmplY3RzIGFuZCBhcnJheXMgYXJlIG1hZGUgbXV0YWJsZS4gQWxsIG90aGVyIG9iamVjdHMgYXJlXG4gICAgICogY29uc2lkZXJlZCB1bmNvcHlhYmxlLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBmdW5jdGlvbiBpcyBfX2JvdW5kX18gdG8gaXRzIGBJbW1lcmAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2FueX0gYmFzZSAtIHRoZSBpbml0aWFsIHN0YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVjaXBlIC0gZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhIHByb3h5IG9mIHRoZSBiYXNlIHN0YXRlIGFzIGZpcnN0IGFyZ3VtZW50IGFuZCB3aGljaCBjYW4gYmUgZnJlZWx5IG1vZGlmaWVkXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGF0Y2hMaXN0ZW5lciAtIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbGwgdGhlIHBhdGNoZXMgcHJvZHVjZWQgaGVyZVxuICAgICAqIEByZXR1cm5zIHthbnl9IGEgbmV3IHN0YXRlLCBvciB0aGUgaW5pdGlhbCBzdGF0ZSBpZiBub3RoaW5nIHdhcyBtb2RpZmllZFxuICAgICAqL1xuICAgIHRoaXMucHJvZHVjZSA9IChiYXNlLCByZWNpcGUsIHBhdGNoTGlzdGVuZXIpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgYmFzZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiByZWNpcGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCBkZWZhdWx0QmFzZSA9IHJlY2lwZTtcbiAgICAgICAgcmVjaXBlID0gYmFzZTtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjdXJyaWVkUHJvZHVjZShiYXNlMiA9IGRlZmF1bHRCYXNlLCAuLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYucHJvZHVjZShiYXNlMiwgKGRyYWZ0KSA9PiByZWNpcGUuY2FsbCh0aGlzLCBkcmFmdCwgLi4uYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZWNpcGUgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZGllKDYpO1xuICAgICAgaWYgKHBhdGNoTGlzdGVuZXIgIT09IHZvaWQgMCAmJiB0eXBlb2YgcGF0Y2hMaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBkaWUoNyk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgaWYgKGlzRHJhZnRhYmxlKGJhc2UpKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gZW50ZXJTY29wZSh0aGlzKTtcbiAgICAgICAgY29uc3QgcHJveHkgPSBjcmVhdGVQcm94eShiYXNlLCB2b2lkIDApO1xuICAgICAgICBsZXQgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlY2lwZShwcm94eSk7XG4gICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoaGFzRXJyb3IpXG4gICAgICAgICAgICByZXZva2VTY29wZShzY29wZSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGVhdmVTY29wZShzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdChyZXN1bHQsIHNjb3BlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWJhc2UgfHwgdHlwZW9mIGJhc2UgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVjaXBlKGJhc2UpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApXG4gICAgICAgICAgcmVzdWx0ID0gYmFzZTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gTk9USElORylcbiAgICAgICAgICByZXN1bHQgPSB2b2lkIDA7XG4gICAgICAgIGlmICh0aGlzLmF1dG9GcmVlemVfKVxuICAgICAgICAgIGZyZWV6ZShyZXN1bHQsIHRydWUpO1xuICAgICAgICBpZiAocGF0Y2hMaXN0ZW5lcikge1xuICAgICAgICAgIGNvbnN0IHAgPSBbXTtcbiAgICAgICAgICBjb25zdCBpcCA9IFtdO1xuICAgICAgICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKGJhc2UsIHJlc3VsdCwgcCwgaXApO1xuICAgICAgICAgIHBhdGNoTGlzdGVuZXIocCwgaXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2VcbiAgICAgICAgZGllKDEsIGJhc2UpO1xuICAgIH07XG4gICAgdGhpcy5wcm9kdWNlV2l0aFBhdGNoZXMgPSAoYmFzZSwgcmVjaXBlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGJhc2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gKHN0YXRlLCAuLi5hcmdzKSA9PiB0aGlzLnByb2R1Y2VXaXRoUGF0Y2hlcyhzdGF0ZSwgKGRyYWZ0KSA9PiBiYXNlKGRyYWZ0LCAuLi5hcmdzKSk7XG4gICAgICB9XG4gICAgICBsZXQgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXM7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnByb2R1Y2UoYmFzZSwgcmVjaXBlLCAocCwgaXApID0+IHtcbiAgICAgICAgcGF0Y2hlcyA9IHA7XG4gICAgICAgIGludmVyc2VQYXRjaGVzID0gaXA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbcmVzdWx0LCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlc107XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIGNvbmZpZz8uYXV0b0ZyZWV6ZSA9PT0gXCJib29sZWFuXCIpXG4gICAgICB0aGlzLnNldEF1dG9GcmVlemUoY29uZmlnLmF1dG9GcmVlemUpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnPy51c2VTdHJpY3RTaGFsbG93Q29weSA9PT0gXCJib29sZWFuXCIpXG4gICAgICB0aGlzLnNldFVzZVN0cmljdFNoYWxsb3dDb3B5KGNvbmZpZy51c2VTdHJpY3RTaGFsbG93Q29weSk7XG4gIH1cbiAgY3JlYXRlRHJhZnQoYmFzZSkge1xuICAgIGlmICghaXNEcmFmdGFibGUoYmFzZSkpXG4gICAgICBkaWUoOCk7XG4gICAgaWYgKGlzRHJhZnQoYmFzZSkpXG4gICAgICBiYXNlID0gY3VycmVudChiYXNlKTtcbiAgICBjb25zdCBzY29wZSA9IGVudGVyU2NvcGUodGhpcyk7XG4gICAgY29uc3QgcHJveHkgPSBjcmVhdGVQcm94eShiYXNlLCB2b2lkIDApO1xuICAgIHByb3h5W0RSQUZUX1NUQVRFXS5pc01hbnVhbF8gPSB0cnVlO1xuICAgIGxlYXZlU2NvcGUoc2NvcGUpO1xuICAgIHJldHVybiBwcm94eTtcbiAgfVxuICBmaW5pc2hEcmFmdChkcmFmdCwgcGF0Y2hMaXN0ZW5lcikge1xuICAgIGNvbnN0IHN0YXRlID0gZHJhZnQgJiYgZHJhZnRbRFJBRlRfU1RBVEVdO1xuICAgIGlmICghc3RhdGUgfHwgIXN0YXRlLmlzTWFudWFsXylcbiAgICAgIGRpZSg5KTtcbiAgICBjb25zdCB7IHNjb3BlXzogc2NvcGUgfSA9IHN0YXRlO1xuICAgIHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKTtcbiAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdCh2b2lkIDAsIHNjb3BlKTtcbiAgfVxuICAvKipcbiAgICogUGFzcyB0cnVlIHRvIGF1dG9tYXRpY2FsbHkgZnJlZXplIGFsbCBjb3BpZXMgY3JlYXRlZCBieSBJbW1lci5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgYXV0by1mcmVlemluZyBpcyBlbmFibGVkLlxuICAgKi9cbiAgc2V0QXV0b0ZyZWV6ZSh2YWx1ZSkge1xuICAgIHRoaXMuYXV0b0ZyZWV6ZV8gPSB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogUGFzcyB0cnVlIHRvIGVuYWJsZSBzdHJpY3Qgc2hhbGxvdyBjb3B5LlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBpbW1lciBkb2VzIG5vdCBjb3B5IHRoZSBvYmplY3QgZGVzY3JpcHRvcnMgc3VjaCBhcyBnZXR0ZXIsIHNldHRlciBhbmQgbm9uLWVudW1yYWJsZSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkodmFsdWUpIHtcbiAgICB0aGlzLnVzZVN0cmljdFNoYWxsb3dDb3B5XyA9IHZhbHVlO1xuICB9XG4gIGFwcGx5UGF0Y2hlcyhiYXNlLCBwYXRjaGVzKSB7XG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gcGF0Y2hlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgcGF0Y2ggPSBwYXRjaGVzW2ldO1xuICAgICAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAwICYmIHBhdGNoLm9wID09PSBcInJlcGxhY2VcIikge1xuICAgICAgICBiYXNlID0gcGF0Y2gudmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA+IC0xKSB7XG4gICAgICBwYXRjaGVzID0gcGF0Y2hlcy5zbGljZShpICsgMSk7XG4gICAgfVxuICAgIGNvbnN0IGFwcGx5UGF0Y2hlc0ltcGwgPSBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmFwcGx5UGF0Y2hlc187XG4gICAgaWYgKGlzRHJhZnQoYmFzZSkpIHtcbiAgICAgIHJldHVybiBhcHBseVBhdGNoZXNJbXBsKGJhc2UsIHBhdGNoZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcm9kdWNlKFxuICAgICAgYmFzZSxcbiAgICAgIChkcmFmdCkgPT4gYXBwbHlQYXRjaGVzSW1wbChkcmFmdCwgcGF0Y2hlcylcbiAgICApO1xuICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlUHJveHkodmFsdWUsIHBhcmVudCkge1xuICBjb25zdCBkcmFmdCA9IGlzTWFwKHZhbHVlKSA/IGdldFBsdWdpbihcIk1hcFNldFwiKS5wcm94eU1hcF8odmFsdWUsIHBhcmVudCkgOiBpc1NldCh2YWx1ZSkgPyBnZXRQbHVnaW4oXCJNYXBTZXRcIikucHJveHlTZXRfKHZhbHVlLCBwYXJlbnQpIDogY3JlYXRlUHJveHlQcm94eSh2YWx1ZSwgcGFyZW50KTtcbiAgY29uc3Qgc2NvcGUgPSBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCk7XG4gIHNjb3BlLmRyYWZ0c18ucHVzaChkcmFmdCk7XG4gIHJldHVybiBkcmFmdDtcbn1cblxuLy8gc3JjL2NvcmUvY3VycmVudC50c1xuZnVuY3Rpb24gY3VycmVudCh2YWx1ZSkge1xuICBpZiAoIWlzRHJhZnQodmFsdWUpKVxuICAgIGRpZSgxMCwgdmFsdWUpO1xuICByZXR1cm4gY3VycmVudEltcGwodmFsdWUpO1xufVxuZnVuY3Rpb24gY3VycmVudEltcGwodmFsdWUpIHtcbiAgaWYgKCFpc0RyYWZ0YWJsZSh2YWx1ZSkgfHwgaXNGcm96ZW4odmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgY29uc3Qgc3RhdGUgPSB2YWx1ZVtEUkFGVF9TVEFURV07XG4gIGxldCBjb3B5O1xuICBpZiAoc3RhdGUpIHtcbiAgICBpZiAoIXN0YXRlLm1vZGlmaWVkXylcbiAgICAgIHJldHVybiBzdGF0ZS5iYXNlXztcbiAgICBzdGF0ZS5maW5hbGl6ZWRfID0gdHJ1ZTtcbiAgICBjb3B5ID0gc2hhbGxvd0NvcHkodmFsdWUsIHN0YXRlLnNjb3BlXy5pbW1lcl8udXNlU3RyaWN0U2hhbGxvd0NvcHlfKTtcbiAgfSBlbHNlIHtcbiAgICBjb3B5ID0gc2hhbGxvd0NvcHkodmFsdWUsIHRydWUpO1xuICB9XG4gIGVhY2goY29weSwgKGtleSwgY2hpbGRWYWx1ZSkgPT4ge1xuICAgIHNldChjb3B5LCBrZXksIGN1cnJlbnRJbXBsKGNoaWxkVmFsdWUpKTtcbiAgfSk7XG4gIGlmIChzdGF0ZSkge1xuICAgIHN0YXRlLmZpbmFsaXplZF8gPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLy8gc3JjL3BsdWdpbnMvcGF0Y2hlcy50c1xuZnVuY3Rpb24gZW5hYmxlUGF0Y2hlcygpIHtcbiAgY29uc3QgZXJyb3JPZmZzZXQgPSAxNjtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGVycm9ycy5wdXNoKFxuICAgICAgJ1NldHMgY2Fubm90IGhhdmUgXCJyZXBsYWNlXCIgcGF0Y2hlcy4nLFxuICAgICAgZnVuY3Rpb24ob3ApIHtcbiAgICAgICAgcmV0dXJuIFwiVW5zdXBwb3J0ZWQgcGF0Y2ggb3BlcmF0aW9uOiBcIiArIG9wO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIFwiQ2Fubm90IGFwcGx5IHBhdGNoLCBwYXRoIGRvZXNuJ3QgcmVzb2x2ZTogXCIgKyBwYXRoO1xuICAgICAgfSxcbiAgICAgIFwiUGF0Y2hpbmcgcmVzZXJ2ZWQgYXR0cmlidXRlcyBsaWtlIF9fcHJvdG9fXywgcHJvdG90eXBlIGFuZCBjb25zdHJ1Y3RvciBpcyBub3QgYWxsb3dlZFwiXG4gICAgKTtcbiAgfVxuICBjb25zdCBSRVBMQUNFID0gXCJyZXBsYWNlXCI7XG4gIGNvbnN0IEFERCA9IFwiYWRkXCI7XG4gIGNvbnN0IFJFTU9WRSA9IFwicmVtb3ZlXCI7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlUGF0Y2hlc18oc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIHN3aXRjaCAoc3RhdGUudHlwZV8pIHtcbiAgICAgIGNhc2UgMCAvKiBPYmplY3QgKi86XG4gICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVQYXRjaGVzRnJvbUFzc2lnbmVkKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGJhc2VQYXRoLFxuICAgICAgICAgIHBhdGNoZXMsXG4gICAgICAgICAgaW52ZXJzZVBhdGNoZXNcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgMSAvKiBBcnJheSAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlQXJyYXlQYXRjaGVzKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpO1xuICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlU2V0UGF0Y2hlcyhcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICBwYXRjaGVzLFxuICAgICAgICAgIGludmVyc2VQYXRjaGVzXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlQXJyYXlQYXRjaGVzKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBsZXQgeyBiYXNlXywgYXNzaWduZWRfIH0gPSBzdGF0ZTtcbiAgICBsZXQgY29weV8gPSBzdGF0ZS5jb3B5XztcbiAgICBpZiAoY29weV8ubGVuZ3RoIDwgYmFzZV8ubGVuZ3RoKSB7XG4gICAgICA7XG4gICAgICBbYmFzZV8sIGNvcHlfXSA9IFtjb3B5XywgYmFzZV9dO1xuICAgICAgW3BhdGNoZXMsIGludmVyc2VQYXRjaGVzXSA9IFtpbnZlcnNlUGF0Y2hlcywgcGF0Y2hlc107XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFzZV8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhc3NpZ25lZF9baV0gJiYgY29weV9baV0gIT09IGJhc2VfW2ldKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogUkVQTEFDRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIC8vIE5lZWQgdG8gbWF5YmUgY2xvbmUgaXQsIGFzIGl0IGNhbiBpbiBmYWN0IGJlIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICAgIC8vIGR1ZSB0byB0aGUgYmFzZS9jb3B5IGludmVyc2lvbiBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvblxuICAgICAgICAgIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChjb3B5X1tpXSlcbiAgICAgICAgfSk7XG4gICAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKGJhc2VfW2ldKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IGJhc2VfLmxlbmd0aDsgaSA8IGNvcHlfLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICBvcDogQURELFxuICAgICAgICBwYXRoLFxuICAgICAgICAvLyBOZWVkIHRvIG1heWJlIGNsb25lIGl0LCBhcyBpdCBjYW4gaW4gZmFjdCBiZSB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICAgICAgLy8gZHVlIHRvIHRoZSBiYXNlL2NvcHkgaW52ZXJzaW9uIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgICAgIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChjb3B5X1tpXSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gY29weV8ubGVuZ3RoIC0gMTsgYmFzZV8ubGVuZ3RoIDw9IGk7IC0taSkge1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaCh7XG4gICAgICAgIG9wOiBSRU1PVkUsXG4gICAgICAgIHBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZVBhdGNoZXNGcm9tQXNzaWduZWQoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIGNvbnN0IHsgYmFzZV8sIGNvcHlfIH0gPSBzdGF0ZTtcbiAgICBlYWNoKHN0YXRlLmFzc2lnbmVkXywgKGtleSwgYXNzaWduZWRWYWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ1ZhbHVlID0gZ2V0KGJhc2VfLCBrZXkpO1xuICAgICAgY29uc3QgdmFsdWUgPSBnZXQoY29weV8sIGtleSk7XG4gICAgICBjb25zdCBvcCA9ICFhc3NpZ25lZFZhbHVlID8gUkVNT1ZFIDogaGFzKGJhc2VfLCBrZXkpID8gUkVQTEFDRSA6IEFERDtcbiAgICAgIGlmIChvcmlnVmFsdWUgPT09IHZhbHVlICYmIG9wID09PSBSRVBMQUNFKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KGtleSk7XG4gICAgICBwYXRjaGVzLnB1c2gob3AgPT09IFJFTU9WRSA/IHsgb3AsIHBhdGggfSA6IHsgb3AsIHBhdGgsIHZhbHVlIH0pO1xuICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaChcbiAgICAgICAgb3AgPT09IEFERCA/IHsgb3A6IFJFTU9WRSwgcGF0aCB9IDogb3AgPT09IFJFTU9WRSA/IHsgb3A6IEFERCwgcGF0aCwgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKG9yaWdWYWx1ZSkgfSA6IHsgb3A6IFJFUExBQ0UsIHBhdGgsIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChvcmlnVmFsdWUpIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVTZXRQYXRjaGVzKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBsZXQgeyBiYXNlXywgY29weV8gfSA9IHN0YXRlO1xuICAgIGxldCBpID0gMDtcbiAgICBiYXNlXy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFjb3B5Xy5oYXModmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogUkVNT1ZFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGludmVyc2VQYXRjaGVzLnVuc2hpZnQoe1xuICAgICAgICAgIG9wOiBBREQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9KTtcbiAgICBpID0gMDtcbiAgICBjb3B5Xy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFiYXNlXy5oYXModmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogQURELFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGludmVyc2VQYXRjaGVzLnVuc2hpZnQoe1xuICAgICAgICAgIG9wOiBSRU1PVkUsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18oYmFzZVZhbHVlLCByZXBsYWNlbWVudCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICBwYXRoOiBbXSxcbiAgICAgIHZhbHVlOiByZXBsYWNlbWVudCA9PT0gTk9USElORyA/IHZvaWQgMCA6IHJlcGxhY2VtZW50XG4gICAgfSk7XG4gICAgaW52ZXJzZVBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogUkVQTEFDRSxcbiAgICAgIHBhdGg6IFtdLFxuICAgICAgdmFsdWU6IGJhc2VWYWx1ZVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGFwcGx5UGF0Y2hlc18oZHJhZnQsIHBhdGNoZXMpIHtcbiAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICBjb25zdCB7IHBhdGgsIG9wIH0gPSBwYXRjaDtcbiAgICAgIGxldCBiYXNlID0gZHJhZnQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFR5cGUgPSBnZXRBcmNodHlwZShiYXNlKTtcbiAgICAgICAgbGV0IHAgPSBwYXRoW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHAgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHAgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBwID0gXCJcIiArIHA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwYXJlbnRUeXBlID09PSAwIC8qIE9iamVjdCAqLyB8fCBwYXJlbnRUeXBlID09PSAxIC8qIEFycmF5ICovKSAmJiAocCA9PT0gXCJfX3Byb3RvX19cIiB8fCBwID09PSBcImNvbnN0cnVjdG9yXCIpKVxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDMpO1xuICAgICAgICBpZiAodHlwZW9mIGJhc2UgPT09IFwiZnVuY3Rpb25cIiAmJiBwID09PSBcInByb3RvdHlwZVwiKVxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDMpO1xuICAgICAgICBiYXNlID0gZ2V0KGJhc2UsIHApO1xuICAgICAgICBpZiAodHlwZW9mIGJhc2UgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMiwgcGF0aC5qb2luKFwiL1wiKSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlID0gZ2V0QXJjaHR5cGUoYmFzZSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRlZXBDbG9uZVBhdGNoVmFsdWUocGF0Y2gudmFsdWUpO1xuICAgICAgY29uc3Qga2V5ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgICAgc3dpdGNoIChvcCkge1xuICAgICAgICBjYXNlIFJFUExBQ0U6XG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBBREQ6XG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDEgLyogQXJyYXkgKi86XG4gICAgICAgICAgICAgIHJldHVybiBrZXkgPT09IFwiLVwiID8gYmFzZS5wdXNoKHZhbHVlKSA6IGJhc2Uuc3BsaWNlKGtleSwgMCwgdmFsdWUpO1xuICAgICAgICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Uuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuYWRkKHZhbHVlKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgUkVNT1ZFOlxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAxIC8qIEFycmF5ICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5zcGxpY2Uoa2V5LCAxKTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZGVsZXRlKHBhdGNoLnZhbHVlKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBkZWxldGUgYmFzZVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAxLCBvcCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRyYWZ0O1xuICB9XG4gIGZ1bmN0aW9uIGRlZXBDbG9uZVBhdGNoVmFsdWUob2JqKSB7XG4gICAgaWYgKCFpc0RyYWZ0YWJsZShvYmopKVxuICAgICAgcmV0dXJuIG9iajtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKVxuICAgICAgcmV0dXJuIG9iai5tYXAoZGVlcENsb25lUGF0Y2hWYWx1ZSk7XG4gICAgaWYgKGlzTWFwKG9iaikpXG4gICAgICByZXR1cm4gbmV3IE1hcChcbiAgICAgICAgQXJyYXkuZnJvbShvYmouZW50cmllcygpKS5tYXAoKFtrLCB2XSkgPT4gW2ssIGRlZXBDbG9uZVBhdGNoVmFsdWUodildKVxuICAgICAgKTtcbiAgICBpZiAoaXNTZXQob2JqKSlcbiAgICAgIHJldHVybiBuZXcgU2V0KEFycmF5LmZyb20ob2JqKS5tYXAoZGVlcENsb25lUGF0Y2hWYWx1ZSkpO1xuICAgIGNvbnN0IGNsb25lZCA9IE9iamVjdC5jcmVhdGUoZ2V0UHJvdG90eXBlT2Yob2JqKSk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKVxuICAgICAgY2xvbmVkW2tleV0gPSBkZWVwQ2xvbmVQYXRjaFZhbHVlKG9ialtrZXldKTtcbiAgICBpZiAoaGFzKG9iaiwgRFJBRlRBQkxFKSlcbiAgICAgIGNsb25lZFtEUkFGVEFCTEVdID0gb2JqW0RSQUZUQUJMRV07XG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxuICBmdW5jdGlvbiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChvYmopIHtcbiAgICBpZiAoaXNEcmFmdChvYmopKSB7XG4gICAgICByZXR1cm4gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmopO1xuICAgIH0gZWxzZVxuICAgICAgcmV0dXJuIG9iajtcbiAgfVxuICBsb2FkUGx1Z2luKFwiUGF0Y2hlc1wiLCB7XG4gICAgYXBwbHlQYXRjaGVzXyxcbiAgICBnZW5lcmF0ZVBhdGNoZXNfLFxuICAgIGdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzX1xuICB9KTtcbn1cblxuLy8gc3JjL3BsdWdpbnMvbWFwc2V0LnRzXG5mdW5jdGlvbiBlbmFibGVNYXBTZXQoKSB7XG4gIGNsYXNzIERyYWZ0TWFwIGV4dGVuZHMgTWFwIHtcbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIHBhcmVudCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXNbRFJBRlRfU1RBVEVdID0ge1xuICAgICAgICB0eXBlXzogMiAvKiBNYXAgKi8sXG4gICAgICAgIHBhcmVudF86IHBhcmVudCxcbiAgICAgICAgc2NvcGVfOiBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCksXG4gICAgICAgIG1vZGlmaWVkXzogZmFsc2UsXG4gICAgICAgIGZpbmFsaXplZF86IGZhbHNlLFxuICAgICAgICBjb3B5Xzogdm9pZCAwLFxuICAgICAgICBhc3NpZ25lZF86IHZvaWQgMCxcbiAgICAgICAgYmFzZV86IHRhcmdldCxcbiAgICAgICAgZHJhZnRfOiB0aGlzLFxuICAgICAgICBpc01hbnVhbF86IGZhbHNlLFxuICAgICAgICByZXZva2VkXzogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuc2l6ZTtcbiAgICB9XG4gICAgaGFzKGtleSkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuaGFzKGtleSk7XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghbGF0ZXN0KHN0YXRlKS5oYXMoa2V5KSB8fCBsYXRlc3Qoc3RhdGUpLmdldChrZXkpICE9PSB2YWx1ZSkge1xuICAgICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIHRydWUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICBpZiAoIXRoaXMuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICBpZiAoc3RhdGUuYmFzZV8uaGFzKGtleSkpIHtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmNvcHlfLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAobGF0ZXN0KHN0YXRlKS5zaXplKSB7XG4gICAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgICBlYWNoKHN0YXRlLmJhc2VfLCAoa2V5KSA9PiB7XG4gICAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvckVhY2goY2IsIHRoaXNBcmcpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBsYXRlc3Qoc3RhdGUpLmZvckVhY2goKF92YWx1ZSwga2V5LCBfbWFwKSA9PiB7XG4gICAgICAgIGNiLmNhbGwodGhpc0FyZywgdGhpcy5nZXQoa2V5KSwga2V5LCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQoa2V5KSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gbGF0ZXN0KHN0YXRlKS5nZXQoa2V5KTtcbiAgICAgIGlmIChzdGF0ZS5maW5hbGl6ZWRfIHx8ICFpc0RyYWZ0YWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlICE9PSBzdGF0ZS5iYXNlXy5nZXQoa2V5KSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkcmFmdCA9IGNyZWF0ZVByb3h5KHZhbHVlLCBzdGF0ZSk7XG4gICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICBzdGF0ZS5jb3B5Xy5zZXQoa2V5LCBkcmFmdCk7XG4gICAgICByZXR1cm4gZHJhZnQ7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5rZXlzKCk7XG4gICAgfVxuICAgIHZhbHVlcygpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5rZXlzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gdGhpcy52YWx1ZXMoKSxcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHIgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHIuZG9uZSlcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoci52YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBlbnRyaWVzKCkge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLmtleXMoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB0aGlzLmVudHJpZXMoKSxcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHIgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHIuZG9uZSlcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoci52YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IFtyLnZhbHVlLCB2YWx1ZV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBbKERSQUZUX1NUQVRFLCBTeW1ib2wuaXRlcmF0b3IpXSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJveHlNYXBfKHRhcmdldCwgcGFyZW50KSB7XG4gICAgcmV0dXJuIG5ldyBEcmFmdE1hcCh0YXJnZXQsIHBhcmVudCk7XG4gIH1cbiAgZnVuY3Rpb24gcHJlcGFyZU1hcENvcHkoc3RhdGUpIHtcbiAgICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgICBzdGF0ZS5hc3NpZ25lZF8gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgc3RhdGUuY29weV8gPSBuZXcgTWFwKHN0YXRlLmJhc2VfKTtcbiAgICB9XG4gIH1cbiAgY2xhc3MgRHJhZnRTZXQgZXh0ZW5kcyBTZXQge1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgcGFyZW50KSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpc1tEUkFGVF9TVEFURV0gPSB7XG4gICAgICAgIHR5cGVfOiAzIC8qIFNldCAqLyxcbiAgICAgICAgcGFyZW50XzogcGFyZW50LFxuICAgICAgICBzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcbiAgICAgICAgbW9kaWZpZWRfOiBmYWxzZSxcbiAgICAgICAgZmluYWxpemVkXzogZmFsc2UsXG4gICAgICAgIGNvcHlfOiB2b2lkIDAsXG4gICAgICAgIGJhc2VfOiB0YXJnZXQsXG4gICAgICAgIGRyYWZ0XzogdGhpcyxcbiAgICAgICAgZHJhZnRzXzogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSxcbiAgICAgICAgcmV2b2tlZF86IGZhbHNlLFxuICAgICAgICBpc01hbnVhbF86IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLnNpemU7XG4gICAgfVxuICAgIGhhcyh2YWx1ZSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5iYXNlXy5oYXModmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmNvcHlfLmhhcyh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHN0YXRlLmRyYWZ0c18uaGFzKHZhbHVlKSAmJiBzdGF0ZS5jb3B5Xy5oYXMoc3RhdGUuZHJhZnRzXy5nZXQodmFsdWUpKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGFkZCh2YWx1ZSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAoIXRoaXMuaGFzKHZhbHVlKSkge1xuICAgICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuY29weV8uYWRkKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZWxldGUodmFsdWUpIHtcbiAgICAgIGlmICghdGhpcy5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfLmRlbGV0ZSh2YWx1ZSkgfHwgKHN0YXRlLmRyYWZ0c18uaGFzKHZhbHVlKSA/IHN0YXRlLmNvcHlfLmRlbGV0ZShzdGF0ZS5kcmFmdHNfLmdldCh2YWx1ZSkpIDogKFxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBmYWxzZVxuICAgICAgKSk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAobGF0ZXN0KHN0YXRlKS5zaXplKSB7XG4gICAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YWx1ZXMoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5Xy52YWx1ZXMoKTtcbiAgICB9XG4gICAgZW50cmllcygpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfLmVudHJpZXMoKTtcbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpO1xuICAgIH1cbiAgICBbKERSQUZUX1NUQVRFLCBTeW1ib2wuaXRlcmF0b3IpXSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpO1xuICAgIH1cbiAgICBmb3JFYWNoKGNiLCB0aGlzQXJnKSB7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMudmFsdWVzKCk7XG4gICAgICBsZXQgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICBjYi5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgcmVzdWx0LnZhbHVlLCB0aGlzKTtcbiAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwcm94eVNldF8odGFyZ2V0LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gbmV3IERyYWZ0U2V0KHRhcmdldCwgcGFyZW50KTtcbiAgfVxuICBmdW5jdGlvbiBwcmVwYXJlU2V0Q29weShzdGF0ZSkge1xuICAgIGlmICghc3RhdGUuY29weV8pIHtcbiAgICAgIHN0YXRlLmNvcHlfID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICAgIHN0YXRlLmJhc2VfLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpc0RyYWZ0YWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBkcmFmdCA9IGNyZWF0ZVByb3h5KHZhbHVlLCBzdGF0ZSk7XG4gICAgICAgICAgc3RhdGUuZHJhZnRzXy5zZXQodmFsdWUsIGRyYWZ0KTtcbiAgICAgICAgICBzdGF0ZS5jb3B5Xy5hZGQoZHJhZnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLmNvcHlfLmFkZCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhc3NlcnRVbnJldm9rZWQoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUucmV2b2tlZF8pXG4gICAgICBkaWUoMywgSlNPTi5zdHJpbmdpZnkobGF0ZXN0KHN0YXRlKSkpO1xuICB9XG4gIGxvYWRQbHVnaW4oXCJNYXBTZXRcIiwgeyBwcm94eU1hcF8sIHByb3h5U2V0XyB9KTtcbn1cblxuLy8gc3JjL2ltbWVyLnRzXG52YXIgaW1tZXIgPSBuZXcgSW1tZXIyKCk7XG52YXIgcHJvZHVjZSA9IGltbWVyLnByb2R1Y2U7XG52YXIgcHJvZHVjZVdpdGhQYXRjaGVzID0gaW1tZXIucHJvZHVjZVdpdGhQYXRjaGVzLmJpbmQoXG4gIGltbWVyXG4pO1xudmFyIHNldEF1dG9GcmVlemUgPSBpbW1lci5zZXRBdXRvRnJlZXplLmJpbmQoaW1tZXIpO1xudmFyIHNldFVzZVN0cmljdFNoYWxsb3dDb3B5ID0gaW1tZXIuc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkuYmluZChpbW1lcik7XG52YXIgYXBwbHlQYXRjaGVzID0gaW1tZXIuYXBwbHlQYXRjaGVzLmJpbmQoaW1tZXIpO1xudmFyIGNyZWF0ZURyYWZ0ID0gaW1tZXIuY3JlYXRlRHJhZnQuYmluZChpbW1lcik7XG52YXIgZmluaXNoRHJhZnQgPSBpbW1lci5maW5pc2hEcmFmdC5iaW5kKGltbWVyKTtcbmZ1bmN0aW9uIGNhc3REcmFmdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBjYXN0SW1tdXRhYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmV4cG9ydCB7XG4gIEltbWVyMiBhcyBJbW1lcixcbiAgYXBwbHlQYXRjaGVzLFxuICBjYXN0RHJhZnQsXG4gIGNhc3RJbW11dGFibGUsXG4gIGNyZWF0ZURyYWZ0LFxuICBjdXJyZW50LFxuICBlbmFibGVNYXBTZXQsXG4gIGVuYWJsZVBhdGNoZXMsXG4gIGZpbmlzaERyYWZ0LFxuICBmcmVlemUsXG4gIERSQUZUQUJMRSBhcyBpbW1lcmFibGUsXG4gIGlzRHJhZnQsXG4gIGlzRHJhZnRhYmxlLFxuICBOT1RISU5HIGFzIG5vdGhpbmcsXG4gIG9yaWdpbmFsLFxuICBwcm9kdWNlLFxuICBwcm9kdWNlV2l0aFBhdGNoZXMsXG4gIHNldEF1dG9GcmVlemUsXG4gIHNldFVzZVN0cmljdFNoYWxsb3dDb3B5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW1tZXIubWpzLm1hcCIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ha2VDYW5jZWxsYWJsZVByb21pc2UocHJvbWlzZSkge1xuICAgIHZhciBpc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgIHZhciB3cmFwcGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgcHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiAhaXNDYW5jZWxsZWQgJiYgcmVzb2x2ZSh2YWx1ZSk7IH0pXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7IHJldHVybiAhaXNDYW5jZWxsZWQgJiYgcmVqZWN0KGVycm9yKTsgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZTogd3JhcHBlZFByb21pc2UsXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICB9LFxuICAgIH07XG59XG4iLCJ2YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG4vLyBBcyBkZWZpbmVkIG9uIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBldmVudHM6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9ldmVudHMuaHRtbFxuZXhwb3J0IHZhciBjbGlwYm9hcmRFdmVudHMgPSBbJ29uQ29weScsICdvbkN1dCcsICdvblBhc3RlJ107XG5leHBvcnQgdmFyIGNvbXBvc2l0aW9uRXZlbnRzID0gW1xuICAgICdvbkNvbXBvc2l0aW9uRW5kJyxcbiAgICAnb25Db21wb3NpdGlvblN0YXJ0JyxcbiAgICAnb25Db21wb3NpdGlvblVwZGF0ZScsXG5dO1xuZXhwb3J0IHZhciBmb2N1c0V2ZW50cyA9IFsnb25Gb2N1cycsICdvbkJsdXInXTtcbmV4cG9ydCB2YXIgZm9ybUV2ZW50cyA9IFsnb25JbnB1dCcsICdvbkludmFsaWQnLCAnb25SZXNldCcsICdvblN1Ym1pdCddO1xuZXhwb3J0IHZhciBpbWFnZUV2ZW50cyA9IFsnb25Mb2FkJywgJ29uRXJyb3InXTtcbmV4cG9ydCB2YXIga2V5Ym9hcmRFdmVudHMgPSBbJ29uS2V5RG93bicsICdvbktleVByZXNzJywgJ29uS2V5VXAnXTtcbmV4cG9ydCB2YXIgbWVkaWFFdmVudHMgPSBbXG4gICAgJ29uQWJvcnQnLFxuICAgICdvbkNhblBsYXknLFxuICAgICdvbkNhblBsYXlUaHJvdWdoJyxcbiAgICAnb25EdXJhdGlvbkNoYW5nZScsXG4gICAgJ29uRW1wdGllZCcsXG4gICAgJ29uRW5jcnlwdGVkJyxcbiAgICAnb25FbmRlZCcsXG4gICAgJ29uRXJyb3InLFxuICAgICdvbkxvYWRlZERhdGEnLFxuICAgICdvbkxvYWRlZE1ldGFkYXRhJyxcbiAgICAnb25Mb2FkU3RhcnQnLFxuICAgICdvblBhdXNlJyxcbiAgICAnb25QbGF5JyxcbiAgICAnb25QbGF5aW5nJyxcbiAgICAnb25Qcm9ncmVzcycsXG4gICAgJ29uUmF0ZUNoYW5nZScsXG4gICAgJ29uU2Vla2VkJyxcbiAgICAnb25TZWVraW5nJyxcbiAgICAnb25TdGFsbGVkJyxcbiAgICAnb25TdXNwZW5kJyxcbiAgICAnb25UaW1lVXBkYXRlJyxcbiAgICAnb25Wb2x1bWVDaGFuZ2UnLFxuICAgICdvbldhaXRpbmcnLFxuXTtcbmV4cG9ydCB2YXIgbW91c2VFdmVudHMgPSBbXG4gICAgJ29uQ2xpY2snLFxuICAgICdvbkNvbnRleHRNZW51JyxcbiAgICAnb25Eb3VibGVDbGljaycsXG4gICAgJ29uTW91c2VEb3duJyxcbiAgICAnb25Nb3VzZUVudGVyJyxcbiAgICAnb25Nb3VzZUxlYXZlJyxcbiAgICAnb25Nb3VzZU1vdmUnLFxuICAgICdvbk1vdXNlT3V0JyxcbiAgICAnb25Nb3VzZU92ZXInLFxuICAgICdvbk1vdXNlVXAnLFxuXTtcbmV4cG9ydCB2YXIgZHJhZ0V2ZW50cyA9IFtcbiAgICAnb25EcmFnJyxcbiAgICAnb25EcmFnRW5kJyxcbiAgICAnb25EcmFnRW50ZXInLFxuICAgICdvbkRyYWdFeGl0JyxcbiAgICAnb25EcmFnTGVhdmUnLFxuICAgICdvbkRyYWdPdmVyJyxcbiAgICAnb25EcmFnU3RhcnQnLFxuICAgICdvbkRyb3AnLFxuXTtcbmV4cG9ydCB2YXIgc2VsZWN0aW9uRXZlbnRzID0gWydvblNlbGVjdCddO1xuZXhwb3J0IHZhciB0b3VjaEV2ZW50cyA9IFsnb25Ub3VjaENhbmNlbCcsICdvblRvdWNoRW5kJywgJ29uVG91Y2hNb3ZlJywgJ29uVG91Y2hTdGFydCddO1xuZXhwb3J0IHZhciBwb2ludGVyRXZlbnRzID0gW1xuICAgICdvblBvaW50ZXJEb3duJyxcbiAgICAnb25Qb2ludGVyTW92ZScsXG4gICAgJ29uUG9pbnRlclVwJyxcbiAgICAnb25Qb2ludGVyQ2FuY2VsJyxcbiAgICAnb25Hb3RQb2ludGVyQ2FwdHVyZScsXG4gICAgJ29uTG9zdFBvaW50ZXJDYXB0dXJlJyxcbiAgICAnb25Qb2ludGVyRW50ZXInLFxuICAgICdvblBvaW50ZXJMZWF2ZScsXG4gICAgJ29uUG9pbnRlck92ZXInLFxuICAgICdvblBvaW50ZXJPdXQnLFxuXTtcbmV4cG9ydCB2YXIgdWlFdmVudHMgPSBbJ29uU2Nyb2xsJ107XG5leHBvcnQgdmFyIHdoZWVsRXZlbnRzID0gWydvbldoZWVsJ107XG5leHBvcnQgdmFyIGFuaW1hdGlvbkV2ZW50cyA9IFtcbiAgICAnb25BbmltYXRpb25TdGFydCcsXG4gICAgJ29uQW5pbWF0aW9uRW5kJyxcbiAgICAnb25BbmltYXRpb25JdGVyYXRpb24nLFxuXTtcbmV4cG9ydCB2YXIgdHJhbnNpdGlvbkV2ZW50cyA9IFsnb25UcmFuc2l0aW9uRW5kJ107XG5leHBvcnQgdmFyIG90aGVyRXZlbnRzID0gWydvblRvZ2dsZSddO1xuZXhwb3J0IHZhciBjaGFuZ2VFdmVudHMgPSBbJ29uQ2hhbmdlJ107XG5leHBvcnQgdmFyIGFsbEV2ZW50cyA9IF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBjbGlwYm9hcmRFdmVudHMsIHRydWUpLCBjb21wb3NpdGlvbkV2ZW50cywgdHJ1ZSksIGZvY3VzRXZlbnRzLCB0cnVlKSwgZm9ybUV2ZW50cywgdHJ1ZSksIGltYWdlRXZlbnRzLCB0cnVlKSwga2V5Ym9hcmRFdmVudHMsIHRydWUpLCBtZWRpYUV2ZW50cywgdHJ1ZSksIG1vdXNlRXZlbnRzLCB0cnVlKSwgZHJhZ0V2ZW50cywgdHJ1ZSksIHNlbGVjdGlvbkV2ZW50cywgdHJ1ZSksIHRvdWNoRXZlbnRzLCB0cnVlKSwgcG9pbnRlckV2ZW50cywgdHJ1ZSksIHVpRXZlbnRzLCB0cnVlKSwgd2hlZWxFdmVudHMsIHRydWUpLCBhbmltYXRpb25FdmVudHMsIHRydWUpLCB0cmFuc2l0aW9uRXZlbnRzLCB0cnVlKSwgY2hhbmdlRXZlbnRzLCB0cnVlKSwgb3RoZXJFdmVudHMsIHRydWUpO1xuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG9uLWV2ZW50IGNhbGxiYWNrIHByb3BzIGN1cnJpZWQgd2l0aCBwcm92aWRlZCBhcmdzLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BzIHBhc3NlZCB0byBhIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb249fSBnZXRBcmdzIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFyZ3VtZW50KHMpIG9uLWV2ZW50IGNhbGxiYWNrc1xuICogICBzaGFsbCBiZSBjdXJyaWVkIHdpdGguXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ha2VFdmVudFByb3BzKHByb3BzLCBnZXRBcmdzKSB7XG4gICAgdmFyIGV2ZW50UHJvcHMgPSB7fTtcbiAgICBhbGxFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgIHZhciBldmVudEhhbmRsZXIgPSBwcm9wc1tldmVudE5hbWVdO1xuICAgICAgICBpZiAoIWV2ZW50SGFuZGxlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXRBcmdzKSB7XG4gICAgICAgICAgICBldmVudFByb3BzW2V2ZW50TmFtZV0gPSAoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50SGFuZGxlcihldmVudCwgZ2V0QXJncyhldmVudE5hbWUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXZlbnRQcm9wc1tldmVudE5hbWVdID0gZXZlbnRIYW5kbGVyO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGV2ZW50UHJvcHM7XG59XG4iLCIvKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBtZXJnZXMgUmVhY3QgcmVmcyBpbnRvIG9uZS5cbiAqIFN1cHBvcnRzIGJvdGggZnVuY3Rpb25zIGFuZCByZWYgb2JqZWN0cyBjcmVhdGVkIHVzaW5nIGNyZWF0ZVJlZigpIGFuZCB1c2VSZWYoKS5cbiAqXG4gKiBVc2FnZTpcbiAqIGBgYHRzeFxuICogPGRpdiByZWY9e21lcmdlUmVmcyhyZWYxLCByZWYyLCByZWYzKX0gLz5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7KFJlYWN0LlJlZjxUPiB8IHVuZGVmaW5lZClbXX0gaW5wdXRSZWZzIEFycmF5IG9mIHJlZnNcbiAqIEByZXR1cm5zIHtSZWFjdC5SZWY8VD4gfCBSZWFjdC5SZWZDYWxsYmFjazxUPn0gTWVyZ2VkIHJlZnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VSZWZzKCkge1xuICAgIHZhciBpbnB1dFJlZnMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBpbnB1dFJlZnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIGZpbHRlcmVkSW5wdXRSZWZzID0gaW5wdXRSZWZzLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoZmlsdGVyZWRJbnB1dFJlZnMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgdmFyIGZpcnN0UmVmID0gZmlsdGVyZWRJbnB1dFJlZnNbMF07XG4gICAgICAgIHJldHVybiBmaXJzdFJlZiB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkUmVmcyhyZWYpIHtcbiAgICAgICAgZmlsdGVyZWRJbnB1dFJlZnMuZm9yRWFjaChmdW5jdGlvbiAoaW5wdXRSZWYpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXRSZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpbnB1dFJlZihyZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXRSZWYpIHtcbiAgICAgICAgICAgICAgICBpbnB1dFJlZi5jdXJyZW50ID0gcmVmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuIiwiLyoqXG4gKiBAbGljc3RhcnQgVGhlIGZvbGxvd2luZyBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGVcbiAqIEphdmFTY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2VcbiAqXG4gKiBDb3B5cmlnaHQgMjAyMyBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogQGxpY2VuZCBUaGUgYWJvdmUgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlXG4gKiBKYXZhU2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlXG4gKi9cblxuLyoqKioqKi8gLy8gVGhlIHJlcXVpcmUgc2NvcGVcbi8qKioqKiovIHZhciBfX3dlYnBhY2tfcmVxdWlyZV9fID0ge307XG4vKioqKioqLyBcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi9cbi8qKioqKiovICgoKSA9PiB7XG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcbi8qKioqKiovIFx0XHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG4vKioqKioqLyBcdFx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcbi8qKioqKiovIFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqLyB9KSgpO1xuLyoqKioqKi8gXG4vKioqKioqLyAvKiB3ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kICovXG4vKioqKioqLyAoKCkgPT4ge1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpXG4vKioqKioqLyB9KSgpO1xuLyoqKioqKi8gXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBnbG9iYWxUaGlzLnBkZmpzTGliID0ge307XG5cbi8vIEVYUE9SVFNcbl9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4gIEFib3J0RXhjZXB0aW9uOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQWJvcnRFeGNlcHRpb24pLFxuICBBbm5vdGF0aW9uRWRpdG9yTGF5ZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIpLFxuICBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZTogKCkgPT4gKC8qIHJlZXhwb3J0ICovIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlKSxcbiAgQW5ub3RhdGlvbkVkaXRvclR5cGU6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBBbm5vdGF0aW9uRWRpdG9yVHlwZSksXG4gIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyKSxcbiAgQW5ub3RhdGlvbkxheWVyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQW5ub3RhdGlvbkxheWVyKSxcbiAgQW5ub3RhdGlvbk1vZGU6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBBbm5vdGF0aW9uTW9kZSksXG4gIENNYXBDb21wcmVzc2lvblR5cGU6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBDTWFwQ29tcHJlc3Npb25UeXBlKSxcbiAgQ29sb3JQaWNrZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBDb2xvclBpY2tlciksXG4gIERPTVNWR0ZhY3Rvcnk6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBET01TVkdGYWN0b3J5KSxcbiAgRHJhd0xheWVyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gRHJhd0xheWVyKSxcbiAgRmVhdHVyZVRlc3Q6ICgpID0+ICgvKiByZWV4cG9ydCAqLyB1dGlsX0ZlYXR1cmVUZXN0KSxcbiAgR2xvYmFsV29ya2VyT3B0aW9uczogKCkgPT4gKC8qIHJlZXhwb3J0ICovIEdsb2JhbFdvcmtlck9wdGlvbnMpLFxuICBJbWFnZUtpbmQ6ICgpID0+ICgvKiByZWV4cG9ydCAqLyB1dGlsX0ltYWdlS2luZCksXG4gIEludmFsaWRQREZFeGNlcHRpb246ICgpID0+ICgvKiByZWV4cG9ydCAqLyBJbnZhbGlkUERGRXhjZXB0aW9uKSxcbiAgTWlzc2luZ1BERkV4Y2VwdGlvbjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIE1pc3NpbmdQREZFeGNlcHRpb24pLFxuICBPUFM6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBPUFMpLFxuICBPdXRsaW5lcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIE91dGxpbmVyKSxcbiAgUERGRGF0YVJhbmdlVHJhbnNwb3J0OiAoKSA9PiAoLyogcmVleHBvcnQgKi8gUERGRGF0YVJhbmdlVHJhbnNwb3J0KSxcbiAgUERGRGF0ZVN0cmluZzogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFBERkRhdGVTdHJpbmcpLFxuICBQREZXb3JrZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBQREZXb3JrZXIpLFxuICBQYXNzd29yZFJlc3BvbnNlczogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFBhc3N3b3JkUmVzcG9uc2VzKSxcbiAgUGVybWlzc2lvbkZsYWc6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBQZXJtaXNzaW9uRmxhZyksXG4gIFBpeGVsc1BlckluY2g6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBQaXhlbHNQZXJJbmNoKSxcbiAgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKSxcbiAgVGV4dExheWVyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gVGV4dExheWVyKSxcbiAgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKSxcbiAgVXRpbDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFV0aWwpLFxuICBWZXJib3NpdHlMZXZlbDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFZlcmJvc2l0eUxldmVsKSxcbiAgWGZhTGF5ZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBYZmFMYXllciksXG4gIGJ1aWxkOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gYnVpbGQpLFxuICBjcmVhdGVWYWxpZEFic29sdXRlVXJsOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCksXG4gIGZldGNoRGF0YTogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGZldGNoRGF0YSksXG4gIGdldERvY3VtZW50OiAoKSA9PiAoLyogcmVleHBvcnQgKi8gZ2V0RG9jdW1lbnQpLFxuICBnZXRGaWxlbmFtZUZyb21Vcmw6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBnZXRGaWxlbmFtZUZyb21VcmwpLFxuICBnZXRQZGZGaWxlbmFtZUZyb21Vcmw6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBnZXRQZGZGaWxlbmFtZUZyb21VcmwpLFxuICBnZXRYZmFQYWdlVmlld3BvcnQ6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBnZXRYZmFQYWdlVmlld3BvcnQpLFxuICBpc0RhdGFTY2hlbWU6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBpc0RhdGFTY2hlbWUpLFxuICBpc1BkZkZpbGU6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBpc1BkZkZpbGUpLFxuICBub0NvbnRleHRNZW51OiAoKSA9PiAoLyogcmVleHBvcnQgKi8gbm9Db250ZXh0TWVudSksXG4gIG5vcm1hbGl6ZVVuaWNvZGU6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBub3JtYWxpemVVbmljb2RlKSxcbiAgcmVuZGVyVGV4dExheWVyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gcmVuZGVyVGV4dExheWVyKSxcbiAgc2V0TGF5ZXJEaW1lbnNpb25zOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gc2V0TGF5ZXJEaW1lbnNpb25zKSxcbiAgc2hhZG93OiAoKSA9PiAoLyogcmVleHBvcnQgKi8gc2hhZG93KSxcbiAgdXBkYXRlVGV4dExheWVyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gdXBkYXRlVGV4dExheWVyKSxcbiAgdmVyc2lvbjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIHZlcnNpb24pXG59KTtcblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3NoYXJlZC91dGlsLmpzXG5jb25zdCBpc05vZGVKUyA9IHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MgKyBcIlwiID09PSBcIltvYmplY3QgcHJvY2Vzc11cIiAmJiAhcHJvY2Vzcy52ZXJzaW9ucy5udyAmJiAhKHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24gJiYgcHJvY2Vzcy50eXBlICYmIHByb2Nlc3MudHlwZSAhPT0gXCJicm93c2VyXCIpO1xuY29uc3QgSURFTlRJVFlfTUFUUklYID0gWzEsIDAsIDAsIDEsIDAsIDBdO1xuY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVggPSBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXTtcbmNvbnN0IE1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFID0gMTBlNjtcbmNvbnN0IExJTkVfRkFDVE9SID0gMS4zNTtcbmNvbnN0IExJTkVfREVTQ0VOVF9GQUNUT1IgPSAwLjM1O1xuY29uc3QgQkFTRUxJTkVfRkFDVE9SID0gTElORV9ERVNDRU5UX0ZBQ1RPUiAvIExJTkVfRkFDVE9SO1xuY29uc3QgUmVuZGVyaW5nSW50ZW50RmxhZyA9IHtcbiAgQU5ZOiAweDAxLFxuICBESVNQTEFZOiAweDAyLFxuICBQUklOVDogMHgwNCxcbiAgU0FWRTogMHgwOCxcbiAgQU5OT1RBVElPTlNfRk9STVM6IDB4MTAsXG4gIEFOTk9UQVRJT05TX1NUT1JBR0U6IDB4MjAsXG4gIEFOTk9UQVRJT05TX0RJU0FCTEU6IDB4NDAsXG4gIE9QTElTVDogMHgxMDBcbn07XG5jb25zdCBBbm5vdGF0aW9uTW9kZSA9IHtcbiAgRElTQUJMRTogMCxcbiAgRU5BQkxFOiAxLFxuICBFTkFCTEVfRk9STVM6IDIsXG4gIEVOQUJMRV9TVE9SQUdFOiAzXG59O1xuY29uc3QgQW5ub3RhdGlvbkVkaXRvclByZWZpeCA9IFwicGRmanNfaW50ZXJuYWxfZWRpdG9yX1wiO1xuY29uc3QgQW5ub3RhdGlvbkVkaXRvclR5cGUgPSB7XG4gIERJU0FCTEU6IC0xLFxuICBOT05FOiAwLFxuICBGUkVFVEVYVDogMyxcbiAgSElHSExJR0hUOiA5LFxuICBTVEFNUDogMTMsXG4gIElOSzogMTVcbn07XG5jb25zdCBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSA9IHtcbiAgUkVTSVpFOiAxLFxuICBDUkVBVEU6IDIsXG4gIEZSRUVURVhUX1NJWkU6IDExLFxuICBGUkVFVEVYVF9DT0xPUjogMTIsXG4gIEZSRUVURVhUX09QQUNJVFk6IDEzLFxuICBJTktfQ09MT1I6IDIxLFxuICBJTktfVEhJQ0tORVNTOiAyMixcbiAgSU5LX09QQUNJVFk6IDIzLFxuICBISUdITElHSFRfQ09MT1I6IDMxLFxuICBISUdITElHSFRfREVGQVVMVF9DT0xPUjogMzIsXG4gIEhJR0hMSUdIVF9USElDS05FU1M6IDMzLFxuICBISUdITElHSFRfRlJFRTogMzQsXG4gIEhJR0hMSUdIVF9TSE9XX0FMTDogMzVcbn07XG5jb25zdCBQZXJtaXNzaW9uRmxhZyA9IHtcbiAgUFJJTlQ6IDB4MDQsXG4gIE1PRElGWV9DT05URU5UUzogMHgwOCxcbiAgQ09QWTogMHgxMCxcbiAgTU9ESUZZX0FOTk9UQVRJT05TOiAweDIwLFxuICBGSUxMX0lOVEVSQUNUSVZFX0ZPUk1TOiAweDEwMCxcbiAgQ09QWV9GT1JfQUNDRVNTSUJJTElUWTogMHgyMDAsXG4gIEFTU0VNQkxFOiAweDQwMCxcbiAgUFJJTlRfSElHSF9RVUFMSVRZOiAweDgwMFxufTtcbmNvbnN0IFRleHRSZW5kZXJpbmdNb2RlID0ge1xuICBGSUxMOiAwLFxuICBTVFJPS0U6IDEsXG4gIEZJTExfU1RST0tFOiAyLFxuICBJTlZJU0lCTEU6IDMsXG4gIEZJTExfQUREX1RPX1BBVEg6IDQsXG4gIFNUUk9LRV9BRERfVE9fUEFUSDogNSxcbiAgRklMTF9TVFJPS0VfQUREX1RPX1BBVEg6IDYsXG4gIEFERF9UT19QQVRIOiA3LFxuICBGSUxMX1NUUk9LRV9NQVNLOiAzLFxuICBBRERfVE9fUEFUSF9GTEFHOiA0XG59O1xuY29uc3QgdXRpbF9JbWFnZUtpbmQgPSB7XG4gIEdSQVlTQ0FMRV8xQlBQOiAxLFxuICBSR0JfMjRCUFA6IDIsXG4gIFJHQkFfMzJCUFA6IDNcbn07XG5jb25zdCBBbm5vdGF0aW9uVHlwZSA9IHtcbiAgVEVYVDogMSxcbiAgTElOSzogMixcbiAgRlJFRVRFWFQ6IDMsXG4gIExJTkU6IDQsXG4gIFNRVUFSRTogNSxcbiAgQ0lSQ0xFOiA2LFxuICBQT0xZR09OOiA3LFxuICBQT0xZTElORTogOCxcbiAgSElHSExJR0hUOiA5LFxuICBVTkRFUkxJTkU6IDEwLFxuICBTUVVJR0dMWTogMTEsXG4gIFNUUklLRU9VVDogMTIsXG4gIFNUQU1QOiAxMyxcbiAgQ0FSRVQ6IDE0LFxuICBJTks6IDE1LFxuICBQT1BVUDogMTYsXG4gIEZJTEVBVFRBQ0hNRU5UOiAxNyxcbiAgU09VTkQ6IDE4LFxuICBNT1ZJRTogMTksXG4gIFdJREdFVDogMjAsXG4gIFNDUkVFTjogMjEsXG4gIFBSSU5URVJNQVJLOiAyMixcbiAgVFJBUE5FVDogMjMsXG4gIFdBVEVSTUFSSzogMjQsXG4gIFRIUkVFRDogMjUsXG4gIFJFREFDVDogMjZcbn07XG5jb25zdCBBbm5vdGF0aW9uUmVwbHlUeXBlID0ge1xuICBHUk9VUDogXCJHcm91cFwiLFxuICBSRVBMWTogXCJSXCJcbn07XG5jb25zdCBBbm5vdGF0aW9uRmxhZyA9IHtcbiAgSU5WSVNJQkxFOiAweDAxLFxuICBISURERU46IDB4MDIsXG4gIFBSSU5UOiAweDA0LFxuICBOT1pPT006IDB4MDgsXG4gIE5PUk9UQVRFOiAweDEwLFxuICBOT1ZJRVc6IDB4MjAsXG4gIFJFQURPTkxZOiAweDQwLFxuICBMT0NLRUQ6IDB4ODAsXG4gIFRPR0dMRU5PVklFVzogMHgxMDAsXG4gIExPQ0tFRENPTlRFTlRTOiAweDIwMFxufTtcbmNvbnN0IEFubm90YXRpb25GaWVsZEZsYWcgPSB7XG4gIFJFQURPTkxZOiAweDAwMDAwMDEsXG4gIFJFUVVJUkVEOiAweDAwMDAwMDIsXG4gIE5PRVhQT1JUOiAweDAwMDAwMDQsXG4gIE1VTFRJTElORTogMHgwMDAxMDAwLFxuICBQQVNTV09SRDogMHgwMDAyMDAwLFxuICBOT1RPR0dMRVRPT0ZGOiAweDAwMDQwMDAsXG4gIFJBRElPOiAweDAwMDgwMDAsXG4gIFBVU0hCVVRUT046IDB4MDAxMDAwMCxcbiAgQ09NQk86IDB4MDAyMDAwMCxcbiAgRURJVDogMHgwMDQwMDAwLFxuICBTT1JUOiAweDAwODAwMDAsXG4gIEZJTEVTRUxFQ1Q6IDB4MDEwMDAwMCxcbiAgTVVMVElTRUxFQ1Q6IDB4MDIwMDAwMCxcbiAgRE9OT1RTUEVMTENIRUNLOiAweDA0MDAwMDAsXG4gIERPTk9UU0NST0xMOiAweDA4MDAwMDAsXG4gIENPTUI6IDB4MTAwMDAwMCxcbiAgUklDSFRFWFQ6IDB4MjAwMDAwMCxcbiAgUkFESU9TSU5VTklTT046IDB4MjAwMDAwMCxcbiAgQ09NTUlUT05TRUxDSEFOR0U6IDB4NDAwMDAwMFxufTtcbmNvbnN0IEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSB7XG4gIFNPTElEOiAxLFxuICBEQVNIRUQ6IDIsXG4gIEJFVkVMRUQ6IDMsXG4gIElOU0VUOiA0LFxuICBVTkRFUkxJTkU6IDVcbn07XG5jb25zdCBBbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlID0ge1xuICBFOiBcIk1vdXNlIEVudGVyXCIsXG4gIFg6IFwiTW91c2UgRXhpdFwiLFxuICBEOiBcIk1vdXNlIERvd25cIixcbiAgVTogXCJNb3VzZSBVcFwiLFxuICBGbzogXCJGb2N1c1wiLFxuICBCbDogXCJCbHVyXCIsXG4gIFBPOiBcIlBhZ2VPcGVuXCIsXG4gIFBDOiBcIlBhZ2VDbG9zZVwiLFxuICBQVjogXCJQYWdlVmlzaWJsZVwiLFxuICBQSTogXCJQYWdlSW52aXNpYmxlXCIsXG4gIEs6IFwiS2V5c3Ryb2tlXCIsXG4gIEY6IFwiRm9ybWF0XCIsXG4gIFY6IFwiVmFsaWRhdGVcIixcbiAgQzogXCJDYWxjdWxhdGVcIlxufTtcbmNvbnN0IERvY3VtZW50QWN0aW9uRXZlbnRUeXBlID0ge1xuICBXQzogXCJXaWxsQ2xvc2VcIixcbiAgV1M6IFwiV2lsbFNhdmVcIixcbiAgRFM6IFwiRGlkU2F2ZVwiLFxuICBXUDogXCJXaWxsUHJpbnRcIixcbiAgRFA6IFwiRGlkUHJpbnRcIlxufTtcbmNvbnN0IFBhZ2VBY3Rpb25FdmVudFR5cGUgPSB7XG4gIE86IFwiUGFnZU9wZW5cIixcbiAgQzogXCJQYWdlQ2xvc2VcIlxufTtcbmNvbnN0IFZlcmJvc2l0eUxldmVsID0ge1xuICBFUlJPUlM6IDAsXG4gIFdBUk5JTkdTOiAxLFxuICBJTkZPUzogNVxufTtcbmNvbnN0IENNYXBDb21wcmVzc2lvblR5cGUgPSB7XG4gIE5PTkU6IDAsXG4gIEJJTkFSWTogMVxufTtcbmNvbnN0IE9QUyA9IHtcbiAgZGVwZW5kZW5jeTogMSxcbiAgc2V0TGluZVdpZHRoOiAyLFxuICBzZXRMaW5lQ2FwOiAzLFxuICBzZXRMaW5lSm9pbjogNCxcbiAgc2V0TWl0ZXJMaW1pdDogNSxcbiAgc2V0RGFzaDogNixcbiAgc2V0UmVuZGVyaW5nSW50ZW50OiA3LFxuICBzZXRGbGF0bmVzczogOCxcbiAgc2V0R1N0YXRlOiA5LFxuICBzYXZlOiAxMCxcbiAgcmVzdG9yZTogMTEsXG4gIHRyYW5zZm9ybTogMTIsXG4gIG1vdmVUbzogMTMsXG4gIGxpbmVUbzogMTQsXG4gIGN1cnZlVG86IDE1LFxuICBjdXJ2ZVRvMjogMTYsXG4gIGN1cnZlVG8zOiAxNyxcbiAgY2xvc2VQYXRoOiAxOCxcbiAgcmVjdGFuZ2xlOiAxOSxcbiAgc3Ryb2tlOiAyMCxcbiAgY2xvc2VTdHJva2U6IDIxLFxuICBmaWxsOiAyMixcbiAgZW9GaWxsOiAyMyxcbiAgZmlsbFN0cm9rZTogMjQsXG4gIGVvRmlsbFN0cm9rZTogMjUsXG4gIGNsb3NlRmlsbFN0cm9rZTogMjYsXG4gIGNsb3NlRU9GaWxsU3Ryb2tlOiAyNyxcbiAgZW5kUGF0aDogMjgsXG4gIGNsaXA6IDI5LFxuICBlb0NsaXA6IDMwLFxuICBiZWdpblRleHQ6IDMxLFxuICBlbmRUZXh0OiAzMixcbiAgc2V0Q2hhclNwYWNpbmc6IDMzLFxuICBzZXRXb3JkU3BhY2luZzogMzQsXG4gIHNldEhTY2FsZTogMzUsXG4gIHNldExlYWRpbmc6IDM2LFxuICBzZXRGb250OiAzNyxcbiAgc2V0VGV4dFJlbmRlcmluZ01vZGU6IDM4LFxuICBzZXRUZXh0UmlzZTogMzksXG4gIG1vdmVUZXh0OiA0MCxcbiAgc2V0TGVhZGluZ01vdmVUZXh0OiA0MSxcbiAgc2V0VGV4dE1hdHJpeDogNDIsXG4gIG5leHRMaW5lOiA0MyxcbiAgc2hvd1RleHQ6IDQ0LFxuICBzaG93U3BhY2VkVGV4dDogNDUsXG4gIG5leHRMaW5lU2hvd1RleHQ6IDQ2LFxuICBuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDogNDcsXG4gIHNldENoYXJXaWR0aDogNDgsXG4gIHNldENoYXJXaWR0aEFuZEJvdW5kczogNDksXG4gIHNldFN0cm9rZUNvbG9yU3BhY2U6IDUwLFxuICBzZXRGaWxsQ29sb3JTcGFjZTogNTEsXG4gIHNldFN0cm9rZUNvbG9yOiA1MixcbiAgc2V0U3Ryb2tlQ29sb3JOOiA1MyxcbiAgc2V0RmlsbENvbG9yOiA1NCxcbiAgc2V0RmlsbENvbG9yTjogNTUsXG4gIHNldFN0cm9rZUdyYXk6IDU2LFxuICBzZXRGaWxsR3JheTogNTcsXG4gIHNldFN0cm9rZVJHQkNvbG9yOiA1OCxcbiAgc2V0RmlsbFJHQkNvbG9yOiA1OSxcbiAgc2V0U3Ryb2tlQ01ZS0NvbG9yOiA2MCxcbiAgc2V0RmlsbENNWUtDb2xvcjogNjEsXG4gIHNoYWRpbmdGaWxsOiA2MixcbiAgYmVnaW5JbmxpbmVJbWFnZTogNjMsXG4gIGJlZ2luSW1hZ2VEYXRhOiA2NCxcbiAgZW5kSW5saW5lSW1hZ2U6IDY1LFxuICBwYWludFhPYmplY3Q6IDY2LFxuICBtYXJrUG9pbnQ6IDY3LFxuICBtYXJrUG9pbnRQcm9wczogNjgsXG4gIGJlZ2luTWFya2VkQ29udGVudDogNjksXG4gIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiA3MCxcbiAgZW5kTWFya2VkQ29udGVudDogNzEsXG4gIGJlZ2luQ29tcGF0OiA3MixcbiAgZW5kQ29tcGF0OiA3MyxcbiAgcGFpbnRGb3JtWE9iamVjdEJlZ2luOiA3NCxcbiAgcGFpbnRGb3JtWE9iamVjdEVuZDogNzUsXG4gIGJlZ2luR3JvdXA6IDc2LFxuICBlbmRHcm91cDogNzcsXG4gIGJlZ2luQW5ub3RhdGlvbjogODAsXG4gIGVuZEFubm90YXRpb246IDgxLFxuICBwYWludEltYWdlTWFza1hPYmplY3Q6IDgzLFxuICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogODQsXG4gIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSxcbiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IDg2LFxuICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiA4NyxcbiAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LFxuICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6IDg5LFxuICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IDkwLFxuICBjb25zdHJ1Y3RQYXRoOiA5MVxufTtcbmNvbnN0IFBhc3N3b3JkUmVzcG9uc2VzID0ge1xuICBORUVEX1BBU1NXT1JEOiAxLFxuICBJTkNPUlJFQ1RfUEFTU1dPUkQ6IDJcbn07XG5sZXQgdmVyYm9zaXR5ID0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1M7XG5mdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbChsZXZlbCkge1xuICBpZiAoTnVtYmVyLmlzSW50ZWdlcihsZXZlbCkpIHtcbiAgICB2ZXJib3NpdHkgPSBsZXZlbDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKSB7XG4gIHJldHVybiB2ZXJib3NpdHk7XG59XG5mdW5jdGlvbiBpbmZvKG1zZykge1xuICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLklORk9TKSB7XG4gICAgY29uc29sZS5sb2coYEluZm86ICR7bXNnfWApO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuKG1zZykge1xuICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTKSB7XG4gICAgY29uc29sZS5sb2coYFdhcm5pbmc6ICR7bXNnfWApO1xuICB9XG59XG5mdW5jdGlvbiB1bnJlYWNoYWJsZShtc2cpIHtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59XG5mdW5jdGlvbiBhc3NlcnQoY29uZCwgbXNnKSB7XG4gIGlmICghY29uZCkge1xuICAgIHVucmVhY2hhYmxlKG1zZyk7XG4gIH1cbn1cbmZ1bmN0aW9uIF9pc1ZhbGlkUHJvdG9jb2wodXJsKSB7XG4gIHN3aXRjaCAodXJsPy5wcm90b2NvbCkge1xuICAgIGNhc2UgXCJodHRwOlwiOlxuICAgIGNhc2UgXCJodHRwczpcIjpcbiAgICBjYXNlIFwiZnRwOlwiOlxuICAgIGNhc2UgXCJtYWlsdG86XCI6XG4gICAgY2FzZSBcInRlbDpcIjpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwodXJsLCBiYXNlVXJsID0gbnVsbCwgb3B0aW9ucyA9IG51bGwpIHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0cnkge1xuICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiB1cmwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChvcHRpb25zLmFkZERlZmF1bHRQcm90b2NvbCAmJiB1cmwuc3RhcnRzV2l0aChcInd3dy5cIikpIHtcbiAgICAgICAgY29uc3QgZG90cyA9IHVybC5tYXRjaCgvXFwuL2cpO1xuICAgICAgICBpZiAoZG90cz8ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICB1cmwgPSBgaHR0cDovLyR7dXJsfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnRyeUNvbnZlcnRFbmNvZGluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHVybCA9IHN0cmluZ1RvVVRGOFN0cmluZyh1cmwpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFic29sdXRlVXJsID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTtcbiAgICBpZiAoX2lzVmFsaWRQcm90b2NvbChhYnNvbHV0ZVVybCkpIHtcbiAgICAgIHJldHVybiBhYnNvbHV0ZVVybDtcbiAgICB9XG4gIH0gY2F0Y2gge31cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBzaGFkb3cob2JqLCBwcm9wLCB2YWx1ZSwgbm9uU2VyaWFsaXphYmxlID0gZmFsc2UpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwge1xuICAgIHZhbHVlLFxuICAgIGVudW1lcmFibGU6ICFub25TZXJpYWxpemFibGUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuY29uc3QgQmFzZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCkge1xuICBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUV4Y2VwdGlvbikge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRXhjZXB0aW9uLlwiKTtcbiAgICB9XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIEJhc2VFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG4gIEJhc2VFeGNlcHRpb24uY29uc3RydWN0b3IgPSBCYXNlRXhjZXB0aW9uO1xuICByZXR1cm4gQmFzZUV4Y2VwdGlvbjtcbn0oKTtcbmNsYXNzIFBhc3N3b3JkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgY29kZSkge1xuICAgIHN1cGVyKG1zZywgXCJQYXNzd29yZEV4Y2VwdGlvblwiKTtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG5jbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnLCBkZXRhaWxzKSB7XG4gICAgc3VwZXIobXNnLCBcIlVua25vd25FcnJvckV4Y2VwdGlvblwiKTtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICB9XG59XG5jbGFzcyBJbnZhbGlkUERGRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKG1zZywgXCJJbnZhbGlkUERGRXhjZXB0aW9uXCIpO1xuICB9XG59XG5jbGFzcyBNaXNzaW5nUERGRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKG1zZywgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCIpO1xuICB9XG59XG5jbGFzcyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnLCBzdGF0dXMpIHtcbiAgICBzdXBlcihtc2csIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCIpO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICB9XG59XG5jbGFzcyBGb3JtYXRFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICBzdXBlcihtc2csIFwiRm9ybWF0RXJyb3JcIik7XG4gIH1cbn1cbmNsYXNzIEFib3J0RXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKG1zZywgXCJBYm9ydEV4Y2VwdGlvblwiKTtcbiAgfVxufVxuZnVuY3Rpb24gYnl0ZXNUb1N0cmluZyhieXRlcykge1xuICBpZiAodHlwZW9mIGJ5dGVzICE9PSBcIm9iamVjdFwiIHx8IGJ5dGVzPy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIHVucmVhY2hhYmxlKFwiSW52YWxpZCBhcmd1bWVudCBmb3IgYnl0ZXNUb1N0cmluZ1wiKTtcbiAgfVxuICBjb25zdCBsZW5ndGggPSBieXRlcy5sZW5ndGg7XG4gIGNvbnN0IE1BWF9BUkdVTUVOVF9DT1VOVCA9IDgxOTI7XG4gIGlmIChsZW5ndGggPCBNQVhfQVJHVU1FTlRfQ09VTlQpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcyk7XG4gIH1cbiAgY29uc3Qgc3RyQnVmID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IE1BWF9BUkdVTUVOVF9DT1VOVCkge1xuICAgIGNvbnN0IGNodW5rRW5kID0gTWF0aC5taW4oaSArIE1BWF9BUkdVTUVOVF9DT1VOVCwgbGVuZ3RoKTtcbiAgICBjb25zdCBjaHVuayA9IGJ5dGVzLnN1YmFycmF5KGksIGNodW5rRW5kKTtcbiAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7XG4gIH1cbiAgcmV0dXJuIHN0ckJ1Zi5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICB1bnJlYWNoYWJsZShcIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXNcIik7XG4gIH1cbiAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuZnVuY3Rpb24gc3RyaW5nMzIodmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gMjQgJiAweGZmLCB2YWx1ZSA+PiAxNiAmIDB4ZmYsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpO1xufVxuZnVuY3Rpb24gb2JqZWN0U2l6ZShvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoO1xufVxuZnVuY3Rpb24gb2JqZWN0RnJvbU1hcChtYXApIHtcbiAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbWFwKSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKSB7XG4gIGNvbnN0IGJ1ZmZlcjggPSBuZXcgVWludDhBcnJheSg0KTtcbiAgYnVmZmVyOFswXSA9IDE7XG4gIGNvbnN0IHZpZXczMiA9IG5ldyBVaW50MzJBcnJheShidWZmZXI4LmJ1ZmZlciwgMCwgMSk7XG4gIHJldHVybiB2aWV3MzJbMF0gPT09IDE7XG59XG5mdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKSB7XG4gIHRyeSB7XG4gICAgbmV3IEZ1bmN0aW9uKFwiXCIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmNsYXNzIHV0aWxfRmVhdHVyZVRlc3Qge1xuICBzdGF0aWMgZ2V0IGlzTGl0dGxlRW5kaWFuKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc0xpdHRsZUVuZGlhblwiLCBpc0xpdHRsZUVuZGlhbigpKTtcbiAgfVxuICBzdGF0aWMgZ2V0IGlzRXZhbFN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNFdmFsU3VwcG9ydGVkXCIsIGlzRXZhbFN1cHBvcnRlZCgpKTtcbiAgfVxuICBzdGF0aWMgZ2V0IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZFwiLCB0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSBcInVuZGVmaW5lZFwiKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHBsYXRmb3JtKCkge1xuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBuYXZpZ2F0b3I/LnBsYXRmb3JtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicGxhdGZvcm1cIiwge1xuICAgICAgICBpc01hYzogbmF2aWdhdG9yLnBsYXRmb3JtLmluY2x1ZGVzKFwiTWFjXCIpXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInBsYXRmb3JtXCIsIHtcbiAgICAgIGlzTWFjOiBmYWxzZVxuICAgIH0pO1xuICB9XG4gIHN0YXRpYyBnZXQgaXNDU1NSb3VuZFN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNDU1NSb3VuZFN1cHBvcnRlZFwiLCBnbG9iYWxUaGlzLkNTUz8uc3VwcG9ydHM/LihcIndpZHRoOiByb3VuZCgxLjVweCwgMXB4KVwiKSk7XG4gIH1cbn1cbmNvbnN0IGhleE51bWJlcnMgPSBBcnJheS5mcm9tKEFycmF5KDI1Nikua2V5cygpLCBuID0+IG4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSk7XG5jbGFzcyBVdGlsIHtcbiAgc3RhdGljIG1ha2VIZXhDb2xvcihyLCBnLCBiKSB7XG4gICAgcmV0dXJuIGAjJHtoZXhOdW1iZXJzW3JdfSR7aGV4TnVtYmVyc1tnXX0ke2hleE51bWJlcnNbYl19YDtcbiAgfVxuICBzdGF0aWMgc2NhbGVNaW5NYXgodHJhbnNmb3JtLCBtaW5NYXgpIHtcbiAgICBsZXQgdGVtcDtcbiAgICBpZiAodHJhbnNmb3JtWzBdKSB7XG4gICAgICBpZiAodHJhbnNmb3JtWzBdIDwgMCkge1xuICAgICAgICB0ZW1wID0gbWluTWF4WzBdO1xuICAgICAgICBtaW5NYXhbMF0gPSBtaW5NYXhbMl07XG4gICAgICAgIG1pbk1heFsyXSA9IHRlbXA7XG4gICAgICB9XG4gICAgICBtaW5NYXhbMF0gKj0gdHJhbnNmb3JtWzBdO1xuICAgICAgbWluTWF4WzJdICo9IHRyYW5zZm9ybVswXTtcbiAgICAgIGlmICh0cmFuc2Zvcm1bM10gPCAwKSB7XG4gICAgICAgIHRlbXAgPSBtaW5NYXhbMV07XG4gICAgICAgIG1pbk1heFsxXSA9IG1pbk1heFszXTtcbiAgICAgICAgbWluTWF4WzNdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIG1pbk1heFsxXSAqPSB0cmFuc2Zvcm1bM107XG4gICAgICBtaW5NYXhbM10gKj0gdHJhbnNmb3JtWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wID0gbWluTWF4WzBdO1xuICAgICAgbWluTWF4WzBdID0gbWluTWF4WzFdO1xuICAgICAgbWluTWF4WzFdID0gdGVtcDtcbiAgICAgIHRlbXAgPSBtaW5NYXhbMl07XG4gICAgICBtaW5NYXhbMl0gPSBtaW5NYXhbM107XG4gICAgICBtaW5NYXhbM10gPSB0ZW1wO1xuICAgICAgaWYgKHRyYW5zZm9ybVsxXSA8IDApIHtcbiAgICAgICAgdGVtcCA9IG1pbk1heFsxXTtcbiAgICAgICAgbWluTWF4WzFdID0gbWluTWF4WzNdO1xuICAgICAgICBtaW5NYXhbM10gPSB0ZW1wO1xuICAgICAgfVxuICAgICAgbWluTWF4WzFdICo9IHRyYW5zZm9ybVsxXTtcbiAgICAgIG1pbk1heFszXSAqPSB0cmFuc2Zvcm1bMV07XG4gICAgICBpZiAodHJhbnNmb3JtWzJdIDwgMCkge1xuICAgICAgICB0ZW1wID0gbWluTWF4WzBdO1xuICAgICAgICBtaW5NYXhbMF0gPSBtaW5NYXhbMl07XG4gICAgICAgIG1pbk1heFsyXSA9IHRlbXA7XG4gICAgICB9XG4gICAgICBtaW5NYXhbMF0gKj0gdHJhbnNmb3JtWzJdO1xuICAgICAgbWluTWF4WzJdICo9IHRyYW5zZm9ybVsyXTtcbiAgICB9XG4gICAgbWluTWF4WzBdICs9IHRyYW5zZm9ybVs0XTtcbiAgICBtaW5NYXhbMV0gKz0gdHJhbnNmb3JtWzVdO1xuICAgIG1pbk1heFsyXSArPSB0cmFuc2Zvcm1bNF07XG4gICAgbWluTWF4WzNdICs9IHRyYW5zZm9ybVs1XTtcbiAgfVxuICBzdGF0aWMgdHJhbnNmb3JtKG0xLCBtMikge1xuICAgIHJldHVybiBbbTFbMF0gKiBtMlswXSArIG0xWzJdICogbTJbMV0sIG0xWzFdICogbTJbMF0gKyBtMVszXSAqIG0yWzFdLCBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSwgbTFbMV0gKiBtMlsyXSArIG0xWzNdICogbTJbM10sIG0xWzBdICogbTJbNF0gKyBtMVsyXSAqIG0yWzVdICsgbTFbNF0sIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV1dO1xuICB9XG4gIHN0YXRpYyBhcHBseVRyYW5zZm9ybShwLCBtKSB7XG4gICAgY29uc3QgeHQgPSBwWzBdICogbVswXSArIHBbMV0gKiBtWzJdICsgbVs0XTtcbiAgICBjb25zdCB5dCA9IHBbMF0gKiBtWzFdICsgcFsxXSAqIG1bM10gKyBtWzVdO1xuICAgIHJldHVybiBbeHQsIHl0XTtcbiAgfVxuICBzdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHAsIG0pIHtcbiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTtcbiAgICBjb25zdCB4dCA9IChwWzBdICogbVszXSAtIHBbMV0gKiBtWzJdICsgbVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkO1xuICAgIGNvbnN0IHl0ID0gKC1wWzBdICogbVsxXSArIHBbMV0gKiBtWzBdICsgbVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkO1xuICAgIHJldHVybiBbeHQsIHl0XTtcbiAgfVxuICBzdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3gociwgbSkge1xuICAgIGNvbnN0IHAxID0gdGhpcy5hcHBseVRyYW5zZm9ybShyLCBtKTtcbiAgICBjb25zdCBwMiA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0oci5zbGljZSgyLCA0KSwgbSk7XG4gICAgY29uc3QgcDMgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFtyWzBdLCByWzNdXSwgbSk7XG4gICAgY29uc3QgcDQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7XG4gICAgcmV0dXJuIFtNYXRoLm1pbihwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWluKHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSwgTWF0aC5tYXgocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1heChwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSldO1xuICB9XG4gIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKG0pIHtcbiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTtcbiAgICByZXR1cm4gW21bM10gLyBkLCAtbVsxXSAvIGQsIC1tWzJdIC8gZCwgbVswXSAvIGQsIChtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQsIChtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGRdO1xuICB9XG4gIHN0YXRpYyBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtKSB7XG4gICAgY29uc3QgdHJhbnNwb3NlID0gW21bMF0sIG1bMl0sIG1bMV0sIG1bM11dO1xuICAgIGNvbnN0IGEgPSBtWzBdICogdHJhbnNwb3NlWzBdICsgbVsxXSAqIHRyYW5zcG9zZVsyXTtcbiAgICBjb25zdCBiID0gbVswXSAqIHRyYW5zcG9zZVsxXSArIG1bMV0gKiB0cmFuc3Bvc2VbM107XG4gICAgY29uc3QgYyA9IG1bMl0gKiB0cmFuc3Bvc2VbMF0gKyBtWzNdICogdHJhbnNwb3NlWzJdO1xuICAgIGNvbnN0IGQgPSBtWzJdICogdHJhbnNwb3NlWzFdICsgbVszXSAqIHRyYW5zcG9zZVszXTtcbiAgICBjb25zdCBmaXJzdCA9IChhICsgZCkgLyAyO1xuICAgIGNvbnN0IHNlY29uZCA9IE1hdGguc3FydCgoYSArIGQpICoqIDIgLSA0ICogKGEgKiBkIC0gYyAqIGIpKSAvIDI7XG4gICAgY29uc3Qgc3ggPSBmaXJzdCArIHNlY29uZCB8fCAxO1xuICAgIGNvbnN0IHN5ID0gZmlyc3QgLSBzZWNvbmQgfHwgMTtcbiAgICByZXR1cm4gW01hdGguc3FydChzeCksIE1hdGguc3FydChzeSldO1xuICB9XG4gIHN0YXRpYyBub3JtYWxpemVSZWN0KHJlY3QpIHtcbiAgICBjb25zdCByID0gcmVjdC5zbGljZSgwKTtcbiAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHtcbiAgICAgIHJbMF0gPSByZWN0WzJdO1xuICAgICAgclsyXSA9IHJlY3RbMF07XG4gICAgfVxuICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkge1xuICAgICAgclsxXSA9IHJlY3RbM107XG4gICAgICByWzNdID0gcmVjdFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgc3RhdGljIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHtcbiAgICBjb25zdCB4TG93ID0gTWF0aC5tYXgoTWF0aC5taW4ocmVjdDFbMF0sIHJlY3QxWzJdKSwgTWF0aC5taW4ocmVjdDJbMF0sIHJlY3QyWzJdKSk7XG4gICAgY29uc3QgeEhpZ2ggPSBNYXRoLm1pbihNYXRoLm1heChyZWN0MVswXSwgcmVjdDFbMl0pLCBNYXRoLm1heChyZWN0MlswXSwgcmVjdDJbMl0pKTtcbiAgICBpZiAoeExvdyA+IHhIaWdoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeUxvdyA9IE1hdGgubWF4KE1hdGgubWluKHJlY3QxWzFdLCByZWN0MVszXSksIE1hdGgubWluKHJlY3QyWzFdLCByZWN0MlszXSkpO1xuICAgIGNvbnN0IHlIaWdoID0gTWF0aC5taW4oTWF0aC5tYXgocmVjdDFbMV0sIHJlY3QxWzNdKSwgTWF0aC5tYXgocmVjdDJbMV0sIHJlY3QyWzNdKSk7XG4gICAgaWYgKHlMb3cgPiB5SGlnaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBbeExvdywgeUxvdywgeEhpZ2gsIHlIaWdoXTtcbiAgfVxuICBzdGF0aWMgI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIHQsIG1pbk1heCkge1xuICAgIGlmICh0IDw9IDAgfHwgdCA+PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG10ID0gMSAtIHQ7XG4gICAgY29uc3QgdHQgPSB0ICogdDtcbiAgICBjb25zdCB0dHQgPSB0dCAqIHQ7XG4gICAgY29uc3QgeCA9IG10ICogKG10ICogKG10ICogeDAgKyAzICogdCAqIHgxKSArIDMgKiB0dCAqIHgyKSArIHR0dCAqIHgzO1xuICAgIGNvbnN0IHkgPSBtdCAqIChtdCAqIChtdCAqIHkwICsgMyAqIHQgKiB5MSkgKyAzICogdHQgKiB5MikgKyB0dHQgKiB5MztcbiAgICBtaW5NYXhbMF0gPSBNYXRoLm1pbihtaW5NYXhbMF0sIHgpO1xuICAgIG1pbk1heFsxXSA9IE1hdGgubWluKG1pbk1heFsxXSwgeSk7XG4gICAgbWluTWF4WzJdID0gTWF0aC5tYXgobWluTWF4WzJdLCB4KTtcbiAgICBtaW5NYXhbM10gPSBNYXRoLm1heChtaW5NYXhbM10sIHkpO1xuICB9XG4gIHN0YXRpYyAjZ2V0RXh0cmVtdW0oeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCBhLCBiLCBjLCBtaW5NYXgpIHtcbiAgICBpZiAoTWF0aC5hYnMoYSkgPCAxZS0xMikge1xuICAgICAgaWYgKE1hdGguYWJzKGIpID49IDFlLTEyKSB7XG4gICAgICAgIHRoaXMuI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIC1jIC8gYiwgbWluTWF4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVsdGEgPSBiICoqIDIgLSA0ICogYyAqIGE7XG4gICAgaWYgKGRlbHRhIDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcXJ0RGVsdGEgPSBNYXRoLnNxcnQoZGVsdGEpO1xuICAgIGNvbnN0IGEyID0gMiAqIGE7XG4gICAgdGhpcy4jZ2V0RXh0cmVtdW1PbkN1cnZlKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgKC1iICsgc3FydERlbHRhKSAvIGEyLCBtaW5NYXgpO1xuICAgIHRoaXMuI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsICgtYiAtIHNxcnREZWx0YSkgLyBhMiwgbWluTWF4KTtcbiAgfVxuICBzdGF0aWMgYmV6aWVyQm91bmRpbmdCb3goeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCBtaW5NYXgpIHtcbiAgICBpZiAobWluTWF4KSB7XG4gICAgICBtaW5NYXhbMF0gPSBNYXRoLm1pbihtaW5NYXhbMF0sIHgwLCB4Myk7XG4gICAgICBtaW5NYXhbMV0gPSBNYXRoLm1pbihtaW5NYXhbMV0sIHkwLCB5Myk7XG4gICAgICBtaW5NYXhbMl0gPSBNYXRoLm1heChtaW5NYXhbMl0sIHgwLCB4Myk7XG4gICAgICBtaW5NYXhbM10gPSBNYXRoLm1heChtaW5NYXhbM10sIHkwLCB5Myk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pbk1heCA9IFtNYXRoLm1pbih4MCwgeDMpLCBNYXRoLm1pbih5MCwgeTMpLCBNYXRoLm1heCh4MCwgeDMpLCBNYXRoLm1heCh5MCwgeTMpXTtcbiAgICB9XG4gICAgdGhpcy4jZ2V0RXh0cmVtdW0oeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCAzICogKC14MCArIDMgKiAoeDEgLSB4MikgKyB4MyksIDYgKiAoeDAgLSAyICogeDEgKyB4MiksIDMgKiAoeDEgLSB4MCksIG1pbk1heCk7XG4gICAgdGhpcy4jZ2V0RXh0cmVtdW0oeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCAzICogKC15MCArIDMgKiAoeTEgLSB5MikgKyB5MyksIDYgKiAoeTAgLSAyICogeTEgKyB5MiksIDMgKiAoeTEgLSB5MCksIG1pbk1heCk7XG4gICAgcmV0dXJuIG1pbk1heDtcbiAgfVxufVxuY29uc3QgUERGU3RyaW5nVHJhbnNsYXRlVGFibGUgPSAoLyogdW51c2VkIHB1cmUgZXhwcmVzc2lvbiBvciBzdXBlciAqLyBudWxsICYmIChbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgyZDgsIDB4MmM3LCAweDJjNiwgMHgyZDksIDB4MmRkLCAweDJkYiwgMHgyZGEsIDB4MmRjLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDIwMjIsIDB4MjAyMCwgMHgyMDIxLCAweDIwMjYsIDB4MjAxNCwgMHgyMDEzLCAweDE5MiwgMHgyMDQ0LCAweDIwMzksIDB4MjAzYSwgMHgyMjEyLCAweDIwMzAsIDB4MjAxZSwgMHgyMDFjLCAweDIwMWQsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWEsIDB4MjEyMiwgMHhmYjAxLCAweGZiMDIsIDB4MTQxLCAweDE1MiwgMHgxNjAsIDB4MTc4LCAweDE3ZCwgMHgxMzEsIDB4MTQyLCAweDE1MywgMHgxNjEsIDB4MTdlLCAwLCAweDIwYWNdKSk7XG5mdW5jdGlvbiBzdHJpbmdUb1BERlN0cmluZyhzdHIpIHtcbiAgaWYgKHN0clswXSA+PSBcIlxceEVGXCIpIHtcbiAgICBsZXQgZW5jb2Rpbmc7XG4gICAgaWYgKHN0clswXSA9PT0gXCJcXHhGRVwiICYmIHN0clsxXSA9PT0gXCJcXHhGRlwiKSB7XG4gICAgICBlbmNvZGluZyA9IFwidXRmLTE2YmVcIjtcbiAgICAgIGlmIChzdHIubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RyWzBdID09PSBcIlxceEZGXCIgJiYgc3RyWzFdID09PSBcIlxceEZFXCIpIHtcbiAgICAgIGVuY29kaW5nID0gXCJ1dGYtMTZsZVwiO1xuICAgICAgaWYgKHN0ci5sZW5ndGggJSAyID09PSAxKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zbGljZSgwLCAtMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdHJbMF0gPT09IFwiXFx4RUZcIiAmJiBzdHJbMV0gPT09IFwiXFx4QkJcIiAmJiBzdHJbMl0gPT09IFwiXFx4QkZcIikge1xuICAgICAgZW5jb2RpbmcgPSBcInV0Zi04XCI7XG4gICAgfVxuICAgIGlmIChlbmNvZGluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZywge1xuICAgICAgICAgIGZhdGFsOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJpbmdUb0J5dGVzKHN0cik7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIpO1xuICAgICAgICBpZiAoIWRlY29kZWQuaW5jbHVkZXMoXCJcXHgxYlwiKSkge1xuICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWNvZGVkLnJlcGxhY2VBbGwoL1xceDFiW15cXHgxYl0qKD86XFx4MWJ8JCkvZywgXCJcIik7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICB3YXJuKGBzdHJpbmdUb1BERlN0cmluZzogXCIke2V4fVwiLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBzdHJCdWYgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3RyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICBjb25zdCBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjaGFyQ29kZSA9PT0gMHgxYikge1xuICAgICAgd2hpbGUgKCsraSA8IGlpICYmIHN0ci5jaGFyQ29kZUF0KGkpICE9PSAweDFiKSB7fVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtjaGFyQ29kZV07XG4gICAgc3RyQnVmLnB1c2goY29kZSA/IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkgOiBzdHIuY2hhckF0KGkpKTtcbiAgfVxuICByZXR1cm4gc3RyQnVmLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiBzdHJpbmdUb1VURjhTdHJpbmcoc3RyKSB7XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpO1xufVxuZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKHN0cikge1xuICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpO1xufVxuZnVuY3Rpb24gaXNBcnJheUVxdWFsKGFycjEsIGFycjIpIHtcbiAgaWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMCwgaWkgPSBhcnIxLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICBpZiAoYXJyMVtpXSAhPT0gYXJyMltpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGdldE1vZGlmaWNhdGlvbkRhdGUoZGF0ZSA9IG5ldyBEYXRlKCkpIHtcbiAgY29uc3QgYnVmZmVyID0gW2RhdGUuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLCAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksIGRhdGUuZ2V0VVRDRGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ1NlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKV07XG4gIHJldHVybiBidWZmZXIuam9pbihcIlwiKTtcbn1cbmxldCBOb3JtYWxpemVSZWdleCA9IG51bGw7XG5sZXQgTm9ybWFsaXphdGlvbk1hcCA9IG51bGw7XG5mdW5jdGlvbiBub3JtYWxpemVVbmljb2RlKHN0cikge1xuICBpZiAoIU5vcm1hbGl6ZVJlZ2V4KSB7XG4gICAgTm9ybWFsaXplUmVnZXggPSAvKFtcXHUwMGEwXFx1MDBiNVxcdTAzN2VcXHUwZWIzXFx1MjAwMC1cXHUyMDBhXFx1MjAyZlxcdTIxMjZcXHVmYjAwLVxcdWZiMDRcXHVmYjA2XFx1ZmIyMC1cXHVmYjM2XFx1ZmIzOC1cXHVmYjNjXFx1ZmIzZVxcdWZiNDAtXFx1ZmI0MVxcdWZiNDMtXFx1ZmI0NFxcdWZiNDYtXFx1ZmJhMVxcdWZiYTQtXFx1ZmJhOVxcdWZiYWUtXFx1ZmJiMVxcdWZiZDMtXFx1ZmJkY1xcdWZiZGUtXFx1ZmJlN1xcdWZiZWEtXFx1ZmJmOFxcdWZiZmMtXFx1ZmJmZFxcdWZjMDAtXFx1ZmM1ZFxcdWZjNjQtXFx1ZmNmMVxcdWZjZjUtXFx1ZmQzZFxcdWZkODhcXHVmZGY0XFx1ZmRmYS1cXHVmZGZiXFx1ZmU3MVxcdWZlNzdcXHVmZTc5XFx1ZmU3YlxcdWZlN2RdKyl8KFxcdWZiMDUrKS9ndTtcbiAgICBOb3JtYWxpemF0aW9uTWFwID0gbmV3IE1hcChbW1wi76yFXCIsIFwixb90XCJdXSk7XG4gIH1cbiAgcmV0dXJuIHN0ci5yZXBsYWNlQWxsKE5vcm1hbGl6ZVJlZ2V4LCAoXywgcDEsIHAyKSA9PiBwMSA/IHAxLm5vcm1hbGl6ZShcIk5GS0NcIikgOiBOb3JtYWxpemF0aW9uTWFwLmdldChwMikpO1xufVxuZnVuY3Rpb24gZ2V0VXVpZCgpIHtcbiAgaWYgKHR5cGVvZiBjcnlwdG8gIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGNyeXB0bz8ucmFuZG9tVVVJRCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cbiAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgY3J5cHRvPy5nZXRSYW5kb21WYWx1ZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYnVmKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICAgIGJ1ZltpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1NSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBieXRlc1RvU3RyaW5nKGJ1Zik7XG59XG5jb25zdCBBbm5vdGF0aW9uUHJlZml4ID0gXCJwZGZqc19pbnRlcm5hbF9pZF9cIjtcbmNvbnN0IEZvbnRSZW5kZXJPcHMgPSB7XG4gIEJFWklFUl9DVVJWRV9UTzogMCxcbiAgTU9WRV9UTzogMSxcbiAgTElORV9UTzogMixcbiAgUVVBRFJBVElDX0NVUlZFX1RPOiAzLFxuICBSRVNUT1JFOiA0LFxuICBTQVZFOiA1LFxuICBTQ0FMRTogNixcbiAgVFJBTlNGT1JNOiA3LFxuICBUUkFOU0xBVEU6IDhcbn07XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2Jhc2VfZmFjdG9yeS5qc1xuXG5jbGFzcyBCYXNlRmlsdGVyRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRmlsdGVyRmFjdG9yeSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRmlsdGVyRmFjdG9yeS5cIik7XG4gICAgfVxuICB9XG4gIGFkZEZpbHRlcihtYXBzKSB7XG4gICAgcmV0dXJuIFwibm9uZVwiO1xuICB9XG4gIGFkZEhDTUZpbHRlcihmZ0NvbG9yLCBiZ0NvbG9yKSB7XG4gICAgcmV0dXJuIFwibm9uZVwiO1xuICB9XG4gIGFkZEFscGhhRmlsdGVyKG1hcCkge1xuICAgIHJldHVybiBcIm5vbmVcIjtcbiAgfVxuICBhZGRMdW1pbm9zaXR5RmlsdGVyKG1hcCkge1xuICAgIHJldHVybiBcIm5vbmVcIjtcbiAgfVxuICBhZGRIaWdobGlnaHRIQ01GaWx0ZXIoZmlsdGVyTmFtZSwgZmdDb2xvciwgYmdDb2xvciwgbmV3RmdDb2xvciwgbmV3QmdDb2xvcikge1xuICAgIHJldHVybiBcIm5vbmVcIjtcbiAgfVxuICBkZXN0cm95KGtlZXBIQ00gPSBmYWxzZSkge31cbn1cbmNsYXNzIEJhc2VDYW52YXNGYWN0b3J5IHtcbiAgI2VuYWJsZUhXQSA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgZW5hYmxlSFdBID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VDYW52YXNGYWN0b3J5KSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDYW52YXNGYWN0b3J5LlwiKTtcbiAgICB9XG4gICAgdGhpcy4jZW5hYmxlSFdBID0gZW5hYmxlSFdBO1xuICB9XG4gIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2FudmFzIHNpemVcIik7XG4gICAgfVxuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2NyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICByZXR1cm4ge1xuICAgICAgY2FudmFzLFxuICAgICAgY29udGV4dDogY2FudmFzLmdldENvbnRleHQoXCIyZFwiLCB7XG4gICAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogIXRoaXMuI2VuYWJsZUhXQVxuICAgICAgfSlcbiAgICB9O1xuICB9XG4gIHJlc2V0KGNhbnZhc0FuZENvbnRleHQsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAoIWNhbnZhc0FuZENvbnRleHQuY2FudmFzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW52YXMgaXMgbm90IHNwZWNpZmllZFwiKTtcbiAgICB9XG4gICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2FudmFzIHNpemVcIik7XG4gICAgfVxuICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG4gIGRlc3Ryb3koY2FudmFzQW5kQ29udGV4dCkge1xuICAgIGlmICghY2FudmFzQW5kQ29udGV4dC5jYW52YXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbnZhcyBpcyBub3Qgc3BlY2lmaWVkXCIpO1xuICAgIH1cbiAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy53aWR0aCA9IDA7XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcyA9IG51bGw7XG4gICAgY2FudmFzQW5kQ29udGV4dC5jb250ZXh0ID0gbnVsbDtcbiAgfVxuICBfY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgX2NyZWF0ZUNhbnZhc2AgY2FsbGVkLlwiKTtcbiAgfVxufVxuY2xhc3MgQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGJhc2VVcmwgPSBudWxsLFxuICAgIGlzQ29tcHJlc3NlZCA9IHRydWVcbiAgfSkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ01hcFJlYWRlckZhY3RvcnkpIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUNNYXBSZWFkZXJGYWN0b3J5LlwiKTtcbiAgICB9XG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybDtcbiAgICB0aGlzLmlzQ29tcHJlc3NlZCA9IGlzQ29tcHJlc3NlZDtcbiAgfVxuICBhc3luYyBmZXRjaCh7XG4gICAgbmFtZVxuICB9KSB7XG4gICAgaWYgKCF0aGlzLmJhc2VVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIENNYXAgXCJiYXNlVXJsXCIgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkLCBlbnN1cmUgdGhhdCAnICsgJ3RoZSBcImNNYXBVcmxcIiBhbmQgXCJjTWFwUGFja2VkXCIgQVBJIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLicpO1xuICAgIH1cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNNYXAgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZVVybCArIG5hbWUgKyAodGhpcy5pc0NvbXByZXNzZWQgPyBcIi5iY21hcFwiIDogXCJcIik7XG4gICAgY29uc3QgY29tcHJlc3Npb25UeXBlID0gdGhpcy5pc0NvbXByZXNzZWQgPyBDTWFwQ29tcHJlc3Npb25UeXBlLkJJTkFSWSA6IENNYXBDb21wcmVzc2lvblR5cGUuTk9ORTtcbiAgICByZXR1cm4gdGhpcy5fZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKS5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCAke3RoaXMuaXNDb21wcmVzc2VkID8gXCJiaW5hcnkgXCIgOiBcIlwifUNNYXAgYXQ6ICR7dXJsfWApO1xuICAgIH0pO1xuICB9XG4gIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLlwiKTtcbiAgfVxufVxuY2xhc3MgQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGJhc2VVcmwgPSBudWxsXG4gIH0pIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5KSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeS5cIik7XG4gICAgfVxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gIH1cbiAgYXN5bmMgZmV0Y2goe1xuICAgIGZpbGVuYW1lXG4gIH0pIHtcbiAgICBpZiAoIXRoaXMuYmFzZVVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc3RhbmRhcmQgZm9udCBcImJhc2VVcmxcIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0ICcgKyAndGhlIFwic3RhbmRhcmRGb250RGF0YVVybFwiIEFQSSBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQuJyk7XG4gICAgfVxuICAgIGlmICghZmlsZW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZvbnQgZmlsZW5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmJhc2VVcmx9JHtmaWxlbmFtZX1gO1xuICAgIHJldHVybiB0aGlzLl9mZXRjaERhdGEodXJsKS5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCBmb250IGRhdGEgYXQ6ICR7dXJsfWApO1xuICAgIH0pO1xuICB9XG4gIF9mZXRjaERhdGEodXJsKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYF9mZXRjaERhdGFgIGNhbGxlZC5cIik7XG4gIH1cbn1cbmNsYXNzIEJhc2VTVkdGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VTVkdGYWN0b3J5KSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTVkdGYWN0b3J5LlwiKTtcbiAgICB9XG4gIH1cbiAgY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHNraXBEaW1lbnNpb25zID0gZmFsc2UpIHtcbiAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBTVkcgZGltZW5zaW9uc1wiKTtcbiAgICB9XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5fY3JlYXRlU1ZHKFwic3ZnOnN2Z1wiKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKFwidmVyc2lvblwiLCBcIjEuMVwiKTtcbiAgICBpZiAoIXNraXBEaW1lbnNpb25zKSB7XG4gICAgICBzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGh9cHhgKTtcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0fXB4YCk7XG4gICAgfVxuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJwcmVzZXJ2ZUFzcGVjdFJhdGlvXCIsIFwibm9uZVwiKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICAgIHJldHVybiBzdmc7XG4gIH1cbiAgY3JlYXRlRWxlbWVudCh0eXBlKSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGVcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVTVkcodHlwZSk7XG4gIH1cbiAgX2NyZWF0ZVNWRyh0eXBlKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYF9jcmVhdGVTVkdgIGNhbGxlZC5cIik7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZGlzcGxheV91dGlscy5qc1xuXG5cbmNvbnN0IFNWR19OUyA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtcbmNsYXNzIFBpeGVsc1BlckluY2gge1xuICBzdGF0aWMgQ1NTID0gOTYuMDtcbiAgc3RhdGljIFBERiA9IDcyLjA7XG4gIHN0YXRpYyBQREZfVE9fQ1NTX1VOSVRTID0gdGhpcy5DU1MgLyB0aGlzLlBERjtcbn1cbmNsYXNzIERPTUZpbHRlckZhY3RvcnkgZXh0ZW5kcyBCYXNlRmlsdGVyRmFjdG9yeSB7XG4gICNfY2FjaGU7XG4gICNfZGVmcztcbiAgI2RvY0lkO1xuICAjZG9jdW1lbnQ7XG4gICNfaGNtQ2FjaGU7XG4gICNpZCA9IDA7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBkb2NJZCxcbiAgICBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudFxuICB9ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI2RvY0lkID0gZG9jSWQ7XG4gICAgdGhpcy4jZG9jdW1lbnQgPSBvd25lckRvY3VtZW50O1xuICB9XG4gIGdldCAjY2FjaGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jYWNoZSB8fD0gbmV3IE1hcCgpO1xuICB9XG4gIGdldCAjaGNtQ2FjaGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI19oY21DYWNoZSB8fD0gbmV3IE1hcCgpO1xuICB9XG4gIGdldCAjZGVmcygpIHtcbiAgICBpZiAoIXRoaXMuI19kZWZzKSB7XG4gICAgICBjb25zdCBkaXYgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdHlsZVxuICAgICAgfSA9IGRpdjtcbiAgICAgIHN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgc3R5bGUuY29udGFpbiA9IFwic3RyaWN0XCI7XG4gICAgICBzdHlsZS53aWR0aCA9IHN0eWxlLmhlaWdodCA9IDA7XG4gICAgICBzdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgIHN0eWxlLnRvcCA9IHN0eWxlLmxlZnQgPSAwO1xuICAgICAgc3R5bGUuekluZGV4ID0gLTE7XG4gICAgICBjb25zdCBzdmcgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCAwKTtcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgMCk7XG4gICAgICB0aGlzLiNfZGVmcyA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZGVmc1wiKTtcbiAgICAgIGRpdi5hcHBlbmQoc3ZnKTtcbiAgICAgIHN2Zy5hcHBlbmQodGhpcy4jX2RlZnMpO1xuICAgICAgdGhpcy4jZG9jdW1lbnQuYm9keS5hcHBlbmQoZGl2KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI19kZWZzO1xuICB9XG4gICNjcmVhdGVUYWJsZXMobWFwcykge1xuICAgIGlmIChtYXBzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgbWFwUiA9IG1hcHNbMF07XG4gICAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgICAgICAgYnVmZmVyW2ldID0gbWFwUltpXSAvIDI1NTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhYmxlID0gYnVmZmVyLmpvaW4oXCIsXCIpO1xuICAgICAgcmV0dXJuIFt0YWJsZSwgdGFibGUsIHRhYmxlXTtcbiAgICB9XG4gICAgY29uc3QgW21hcFIsIG1hcEcsIG1hcEJdID0gbWFwcztcbiAgICBjb25zdCBidWZmZXJSID0gbmV3IEFycmF5KDI1Nik7XG4gICAgY29uc3QgYnVmZmVyRyA9IG5ldyBBcnJheSgyNTYpO1xuICAgIGNvbnN0IGJ1ZmZlckIgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICBidWZmZXJSW2ldID0gbWFwUltpXSAvIDI1NTtcbiAgICAgIGJ1ZmZlckdbaV0gPSBtYXBHW2ldIC8gMjU1O1xuICAgICAgYnVmZmVyQltpXSA9IG1hcEJbaV0gLyAyNTU7XG4gICAgfVxuICAgIHJldHVybiBbYnVmZmVyUi5qb2luKFwiLFwiKSwgYnVmZmVyRy5qb2luKFwiLFwiKSwgYnVmZmVyQi5qb2luKFwiLFwiKV07XG4gIH1cbiAgYWRkRmlsdGVyKG1hcHMpIHtcbiAgICBpZiAoIW1hcHMpIHtcbiAgICAgIHJldHVybiBcIm5vbmVcIjtcbiAgICB9XG4gICAgbGV0IHZhbHVlID0gdGhpcy4jY2FjaGUuZ2V0KG1hcHMpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBbdGFibGVSLCB0YWJsZUcsIHRhYmxlQl0gPSB0aGlzLiNjcmVhdGVUYWJsZXMobWFwcyk7XG4gICAgY29uc3Qga2V5ID0gbWFwcy5sZW5ndGggPT09IDEgPyB0YWJsZVIgOiBgJHt0YWJsZVJ9JHt0YWJsZUd9JHt0YWJsZUJ9YDtcbiAgICB2YWx1ZSA9IHRoaXMuI2NhY2hlLmdldChrZXkpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy4jY2FjaGUuc2V0KG1hcHMsIHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBgZ18ke3RoaXMuI2RvY0lkfV90cmFuc2Zlcl9tYXBfJHt0aGlzLiNpZCsrfWA7XG4gICAgY29uc3QgdXJsID0gYHVybCgjJHtpZH0pYDtcbiAgICB0aGlzLiNjYWNoZS5zZXQobWFwcywgdXJsKTtcbiAgICB0aGlzLiNjYWNoZS5zZXQoa2V5LCB1cmwpO1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuI2NyZWF0ZUZpbHRlcihpZCk7XG4gICAgdGhpcy4jYWRkVHJhbnNmZXJNYXBDb252ZXJzaW9uKHRhYmxlUiwgdGFibGVHLCB0YWJsZUIsIGZpbHRlcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBhZGRIQ01GaWx0ZXIoZmdDb2xvciwgYmdDb2xvcikge1xuICAgIGNvbnN0IGtleSA9IGAke2ZnQ29sb3J9LSR7YmdDb2xvcn1gO1xuICAgIGNvbnN0IGZpbHRlck5hbWUgPSBcImJhc2VcIjtcbiAgICBsZXQgaW5mbyA9IHRoaXMuI2hjbUNhY2hlLmdldChmaWx0ZXJOYW1lKTtcbiAgICBpZiAoaW5mbz8ua2V5ID09PSBrZXkpIHtcbiAgICAgIHJldHVybiBpbmZvLnVybDtcbiAgICB9XG4gICAgaWYgKGluZm8pIHtcbiAgICAgIGluZm8uZmlsdGVyPy5yZW1vdmUoKTtcbiAgICAgIGluZm8ua2V5ID0ga2V5O1xuICAgICAgaW5mby51cmwgPSBcIm5vbmVcIjtcbiAgICAgIGluZm8uZmlsdGVyID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyA9IHtcbiAgICAgICAga2V5LFxuICAgICAgICB1cmw6IFwibm9uZVwiLFxuICAgICAgICBmaWx0ZXI6IG51bGxcbiAgICAgIH07XG4gICAgICB0aGlzLiNoY21DYWNoZS5zZXQoZmlsdGVyTmFtZSwgaW5mbyk7XG4gICAgfVxuICAgIGlmICghZmdDb2xvciB8fCAhYmdDb2xvcikge1xuICAgICAgcmV0dXJuIGluZm8udXJsO1xuICAgIH1cbiAgICBjb25zdCBmZ1JHQiA9IHRoaXMuI2dldFJHQihmZ0NvbG9yKTtcbiAgICBmZ0NvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoLi4uZmdSR0IpO1xuICAgIGNvbnN0IGJnUkdCID0gdGhpcy4jZ2V0UkdCKGJnQ29sb3IpO1xuICAgIGJnQ29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5iZ1JHQik7XG4gICAgdGhpcy4jZGVmcy5zdHlsZS5jb2xvciA9IFwiXCI7XG4gICAgaWYgKGZnQ29sb3IgPT09IFwiIzAwMDAwMFwiICYmIGJnQ29sb3IgPT09IFwiI2ZmZmZmZlwiIHx8IGZnQ29sb3IgPT09IGJnQ29sb3IpIHtcbiAgICAgIHJldHVybiBpbmZvLnVybDtcbiAgICB9XG4gICAgY29uc3QgbWFwID0gbmV3IEFycmF5KDI1Nik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMjU1OyBpKyspIHtcbiAgICAgIGNvbnN0IHggPSBpIC8gMjU1O1xuICAgICAgbWFwW2ldID0geCA8PSAwLjAzOTI4ID8geCAvIDEyLjkyIDogKCh4ICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNDtcbiAgICB9XG4gICAgY29uc3QgdGFibGUgPSBtYXAuam9pbihcIixcIik7XG4gICAgY29uc3QgaWQgPSBgZ18ke3RoaXMuI2RvY0lkfV9oY21fZmlsdGVyYDtcbiAgICBjb25zdCBmaWx0ZXIgPSBpbmZvLmZpbHRlciA9IHRoaXMuI2NyZWF0ZUZpbHRlcihpZCk7XG4gICAgdGhpcy4jYWRkVHJhbnNmZXJNYXBDb252ZXJzaW9uKHRhYmxlLCB0YWJsZSwgdGFibGUsIGZpbHRlcik7XG4gICAgdGhpcy4jYWRkR3JheUNvbnZlcnNpb24oZmlsdGVyKTtcbiAgICBjb25zdCBnZXRTdGVwcyA9IChjLCBuKSA9PiB7XG4gICAgICBjb25zdCBzdGFydCA9IGZnUkdCW2NdIC8gMjU1O1xuICAgICAgY29uc3QgZW5kID0gYmdSR0JbY10gLyAyNTU7XG4gICAgICBjb25zdCBhcnIgPSBuZXcgQXJyYXkobiArIDEpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IHN0YXJ0ICsgaSAvIG4gKiAoZW5kIC0gc3RhcnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyci5qb2luKFwiLFwiKTtcbiAgICB9O1xuICAgIHRoaXMuI2FkZFRyYW5zZmVyTWFwQ29udmVyc2lvbihnZXRTdGVwcygwLCA1KSwgZ2V0U3RlcHMoMSwgNSksIGdldFN0ZXBzKDIsIDUpLCBmaWx0ZXIpO1xuICAgIGluZm8udXJsID0gYHVybCgjJHtpZH0pYDtcbiAgICByZXR1cm4gaW5mby51cmw7XG4gIH1cbiAgYWRkQWxwaGFGaWx0ZXIobWFwKSB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy4jY2FjaGUuZ2V0KG1hcCk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IFt0YWJsZUFdID0gdGhpcy4jY3JlYXRlVGFibGVzKFttYXBdKTtcbiAgICBjb25zdCBrZXkgPSBgYWxwaGFfJHt0YWJsZUF9YDtcbiAgICB2YWx1ZSA9IHRoaXMuI2NhY2hlLmdldChrZXkpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy4jY2FjaGUuc2V0KG1hcCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGBnXyR7dGhpcy4jZG9jSWR9X2FscGhhX21hcF8ke3RoaXMuI2lkKyt9YDtcbiAgICBjb25zdCB1cmwgPSBgdXJsKCMke2lkfSlgO1xuICAgIHRoaXMuI2NhY2hlLnNldChtYXAsIHVybCk7XG4gICAgdGhpcy4jY2FjaGUuc2V0KGtleSwgdXJsKTtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLiNjcmVhdGVGaWx0ZXIoaWQpO1xuICAgIHRoaXMuI2FkZFRyYW5zZmVyTWFwQWxwaGFDb252ZXJzaW9uKHRhYmxlQSwgZmlsdGVyKTtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIGFkZEx1bWlub3NpdHlGaWx0ZXIobWFwKSB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy4jY2FjaGUuZ2V0KG1hcCB8fCBcImx1bWlub3NpdHlcIik7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGxldCB0YWJsZUEsIGtleTtcbiAgICBpZiAobWFwKSB7XG4gICAgICBbdGFibGVBXSA9IHRoaXMuI2NyZWF0ZVRhYmxlcyhbbWFwXSk7XG4gICAgICBrZXkgPSBgbHVtaW5vc2l0eV8ke3RhYmxlQX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXkgPSBcImx1bWlub3NpdHlcIjtcbiAgICB9XG4gICAgdmFsdWUgPSB0aGlzLiNjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuI2NhY2hlLnNldChtYXAsIHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBgZ18ke3RoaXMuI2RvY0lkfV9sdW1pbm9zaXR5X21hcF8ke3RoaXMuI2lkKyt9YDtcbiAgICBjb25zdCB1cmwgPSBgdXJsKCMke2lkfSlgO1xuICAgIHRoaXMuI2NhY2hlLnNldChtYXAsIHVybCk7XG4gICAgdGhpcy4jY2FjaGUuc2V0KGtleSwgdXJsKTtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLiNjcmVhdGVGaWx0ZXIoaWQpO1xuICAgIHRoaXMuI2FkZEx1bWlub3NpdHlDb252ZXJzaW9uKGZpbHRlcik7XG4gICAgaWYgKG1hcCkge1xuICAgICAgdGhpcy4jYWRkVHJhbnNmZXJNYXBBbHBoYUNvbnZlcnNpb24odGFibGVBLCBmaWx0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIGFkZEhpZ2hsaWdodEhDTUZpbHRlcihmaWx0ZXJOYW1lLCBmZ0NvbG9yLCBiZ0NvbG9yLCBuZXdGZ0NvbG9yLCBuZXdCZ0NvbG9yKSB7XG4gICAgY29uc3Qga2V5ID0gYCR7ZmdDb2xvcn0tJHtiZ0NvbG9yfS0ke25ld0ZnQ29sb3J9LSR7bmV3QmdDb2xvcn1gO1xuICAgIGxldCBpbmZvID0gdGhpcy4jaGNtQ2FjaGUuZ2V0KGZpbHRlck5hbWUpO1xuICAgIGlmIChpbmZvPy5rZXkgPT09IGtleSkge1xuICAgICAgcmV0dXJuIGluZm8udXJsO1xuICAgIH1cbiAgICBpZiAoaW5mbykge1xuICAgICAgaW5mby5maWx0ZXI/LnJlbW92ZSgpO1xuICAgICAgaW5mby5rZXkgPSBrZXk7XG4gICAgICBpbmZvLnVybCA9IFwibm9uZVwiO1xuICAgICAgaW5mby5maWx0ZXIgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmZvID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIHVybDogXCJub25lXCIsXG4gICAgICAgIGZpbHRlcjogbnVsbFxuICAgICAgfTtcbiAgICAgIHRoaXMuI2hjbUNhY2hlLnNldChmaWx0ZXJOYW1lLCBpbmZvKTtcbiAgICB9XG4gICAgaWYgKCFmZ0NvbG9yIHx8ICFiZ0NvbG9yKSB7XG4gICAgICByZXR1cm4gaW5mby51cmw7XG4gICAgfVxuICAgIGNvbnN0IFtmZ1JHQiwgYmdSR0JdID0gW2ZnQ29sb3IsIGJnQ29sb3JdLm1hcCh0aGlzLiNnZXRSR0IuYmluZCh0aGlzKSk7XG4gICAgbGV0IGZnR3JheSA9IE1hdGgucm91bmQoMC4yMTI2ICogZmdSR0JbMF0gKyAwLjcxNTIgKiBmZ1JHQlsxXSArIDAuMDcyMiAqIGZnUkdCWzJdKTtcbiAgICBsZXQgYmdHcmF5ID0gTWF0aC5yb3VuZCgwLjIxMjYgKiBiZ1JHQlswXSArIDAuNzE1MiAqIGJnUkdCWzFdICsgMC4wNzIyICogYmdSR0JbMl0pO1xuICAgIGxldCBbbmV3RmdSR0IsIG5ld0JnUkdCXSA9IFtuZXdGZ0NvbG9yLCBuZXdCZ0NvbG9yXS5tYXAodGhpcy4jZ2V0UkdCLmJpbmQodGhpcykpO1xuICAgIGlmIChiZ0dyYXkgPCBmZ0dyYXkpIHtcbiAgICAgIFtmZ0dyYXksIGJnR3JheSwgbmV3RmdSR0IsIG5ld0JnUkdCXSA9IFtiZ0dyYXksIGZnR3JheSwgbmV3QmdSR0IsIG5ld0ZnUkdCXTtcbiAgICB9XG4gICAgdGhpcy4jZGVmcy5zdHlsZS5jb2xvciA9IFwiXCI7XG4gICAgY29uc3QgZ2V0U3RlcHMgPSAoZmcsIGJnLCBuKSA9PiB7XG4gICAgICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICAgIGNvbnN0IHN0ZXAgPSAoYmdHcmF5IC0gZmdHcmF5KSAvIG47XG4gICAgICBjb25zdCBuZXdTdGFydCA9IGZnIC8gMjU1O1xuICAgICAgY29uc3QgbmV3U3RlcCA9IChiZyAtIGZnKSAvICgyNTUgKiBuKTtcbiAgICAgIGxldCBwcmV2ID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG47IGkrKykge1xuICAgICAgICBjb25zdCBrID0gTWF0aC5yb3VuZChmZ0dyYXkgKyBpICogc3RlcCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbmV3U3RhcnQgKyBpICogbmV3U3RlcDtcbiAgICAgICAgZm9yIChsZXQgaiA9IHByZXY7IGogPD0gazsgaisrKSB7XG4gICAgICAgICAgYXJyW2pdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcHJldiA9IGsgKyAxO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHByZXY7IGkgPCAyNTY7IGkrKykge1xuICAgICAgICBhcnJbaV0gPSBhcnJbcHJldiAtIDFdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyci5qb2luKFwiLFwiKTtcbiAgICB9O1xuICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1faGNtXyR7ZmlsdGVyTmFtZX1fZmlsdGVyYDtcbiAgICBjb25zdCBmaWx0ZXIgPSBpbmZvLmZpbHRlciA9IHRoaXMuI2NyZWF0ZUZpbHRlcihpZCk7XG4gICAgdGhpcy4jYWRkR3JheUNvbnZlcnNpb24oZmlsdGVyKTtcbiAgICB0aGlzLiNhZGRUcmFuc2Zlck1hcENvbnZlcnNpb24oZ2V0U3RlcHMobmV3RmdSR0JbMF0sIG5ld0JnUkdCWzBdLCA1KSwgZ2V0U3RlcHMobmV3RmdSR0JbMV0sIG5ld0JnUkdCWzFdLCA1KSwgZ2V0U3RlcHMobmV3RmdSR0JbMl0sIG5ld0JnUkdCWzJdLCA1KSwgZmlsdGVyKTtcbiAgICBpbmZvLnVybCA9IGB1cmwoIyR7aWR9KWA7XG4gICAgcmV0dXJuIGluZm8udXJsO1xuICB9XG4gIGRlc3Ryb3koa2VlcEhDTSA9IGZhbHNlKSB7XG4gICAgaWYgKGtlZXBIQ00gJiYgdGhpcy4jaGNtQ2FjaGUuc2l6ZSAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jX2RlZnMpIHtcbiAgICAgIHRoaXMuI19kZWZzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmUoKTtcbiAgICAgIHRoaXMuI19kZWZzID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuI19jYWNoZSkge1xuICAgICAgdGhpcy4jX2NhY2hlLmNsZWFyKCk7XG4gICAgICB0aGlzLiNfY2FjaGUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLiNpZCA9IDA7XG4gIH1cbiAgI2FkZEx1bWlub3NpdHlDb252ZXJzaW9uKGZpbHRlcikge1xuICAgIGNvbnN0IGZlQ29sb3JNYXRyaXggPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZlQ29sb3JNYXRyaXhcIik7XG4gICAgZmVDb2xvck1hdHJpeC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwibWF0cml4XCIpO1xuICAgIGZlQ29sb3JNYXRyaXguc2V0QXR0cmlidXRlKFwidmFsdWVzXCIsIFwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4zIDAuNTkgMC4xMSAwIDBcIik7XG4gICAgZmlsdGVyLmFwcGVuZChmZUNvbG9yTWF0cml4KTtcbiAgfVxuICAjYWRkR3JheUNvbnZlcnNpb24oZmlsdGVyKSB7XG4gICAgY29uc3QgZmVDb2xvck1hdHJpeCA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmVDb2xvck1hdHJpeFwiKTtcbiAgICBmZUNvbG9yTWF0cml4LnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJtYXRyaXhcIik7XG4gICAgZmVDb2xvck1hdHJpeC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZXNcIiwgXCIwLjIxMjYgMC43MTUyIDAuMDcyMiAwIDAgMC4yMTI2IDAuNzE1MiAwLjA3MjIgMCAwIDAuMjEyNiAwLjcxNTIgMC4wNzIyIDAgMCAwIDAgMCAxIDBcIik7XG4gICAgZmlsdGVyLmFwcGVuZChmZUNvbG9yTWF0cml4KTtcbiAgfVxuICAjY3JlYXRlRmlsdGVyKGlkKSB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJmaWx0ZXJcIik7XG4gICAgZmlsdGVyLnNldEF0dHJpYnV0ZShcImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVyc1wiLCBcInNSR0JcIik7XG4gICAgZmlsdGVyLnNldEF0dHJpYnV0ZShcImlkXCIsIGlkKTtcbiAgICB0aGlzLiNkZWZzLmFwcGVuZChmaWx0ZXIpO1xuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cbiAgI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBmdW5jLCB0YWJsZSkge1xuICAgIGNvbnN0IGZlRnVuYyA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIGZ1bmMpO1xuICAgIGZlRnVuYy5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiZGlzY3JldGVcIik7XG4gICAgZmVGdW5jLnNldEF0dHJpYnV0ZShcInRhYmxlVmFsdWVzXCIsIHRhYmxlKTtcbiAgICBmZUNvbXBvbmVudFRyYW5zZmVyLmFwcGVuZChmZUZ1bmMpO1xuICB9XG4gICNhZGRUcmFuc2Zlck1hcENvbnZlcnNpb24oclRhYmxlLCBnVGFibGUsIGJUYWJsZSwgZmlsdGVyKSB7XG4gICAgY29uc3QgZmVDb21wb25lbnRUcmFuc2ZlciA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmVDb21wb25lbnRUcmFuc2ZlclwiKTtcbiAgICBmaWx0ZXIuYXBwZW5kKGZlQ29tcG9uZW50VHJhbnNmZXIpO1xuICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY1JcIiwgclRhYmxlKTtcbiAgICB0aGlzLiNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgXCJmZUZ1bmNHXCIsIGdUYWJsZSk7XG4gICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jQlwiLCBiVGFibGUpO1xuICB9XG4gICNhZGRUcmFuc2Zlck1hcEFscGhhQ29udmVyc2lvbihhVGFibGUsIGZpbHRlcikge1xuICAgIGNvbnN0IGZlQ29tcG9uZW50VHJhbnNmZXIgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZlQ29tcG9uZW50VHJhbnNmZXJcIik7XG4gICAgZmlsdGVyLmFwcGVuZChmZUNvbXBvbmVudFRyYW5zZmVyKTtcbiAgICB0aGlzLiNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgXCJmZUZ1bmNBXCIsIGFUYWJsZSk7XG4gIH1cbiAgI2dldFJHQihjb2xvcikge1xuICAgIHRoaXMuI2RlZnMuc3R5bGUuY29sb3IgPSBjb2xvcjtcbiAgICByZXR1cm4gZ2V0UkdCKGdldENvbXB1dGVkU3R5bGUodGhpcy4jZGVmcykuZ2V0UHJvcGVydHlWYWx1ZShcImNvbG9yXCIpKTtcbiAgfVxufVxuY2xhc3MgRE9NQ2FudmFzRmFjdG9yeSBleHRlbmRzIEJhc2VDYW52YXNGYWN0b3J5IHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50LFxuICAgIGVuYWJsZUhXQSA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIGVuYWJsZUhXQVxuICAgIH0pO1xuICAgIHRoaXMuX2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDtcbiAgfVxuICBfY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgcmV0dXJuIGNhbnZhcztcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKHVybCwgdHlwZSA9IFwidGV4dFwiKSB7XG4gIGlmIChpc1ZhbGlkRmV0Y2hVcmwodXJsLCBkb2N1bWVudC5iYXNlVVJJKSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcImFycmF5YnVmZmVyXCI6XG4gICAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgY2FzZSBcImJsb2JcIjpcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJsb2IoKTtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgcmVxdWVzdC5vcGVuKFwiR0VUXCIsIHVybCwgdHJ1ZSk7XG4gICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSB0eXBlO1xuICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCB8fCByZXF1ZXN0LnN0YXR1cyA9PT0gMCkge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZWplY3QobmV3IEVycm9yKHJlcXVlc3Quc3RhdHVzVGV4dCkpO1xuICAgIH07XG4gICAgcmVxdWVzdC5zZW5kKG51bGwpO1xuICB9KTtcbn1cbmNsYXNzIERPTUNNYXBSZWFkZXJGYWN0b3J5IGV4dGVuZHMgQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHtcbiAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuICAgIHJldHVybiBmZXRjaERhdGEodXJsLCB0aGlzLmlzQ29tcHJlc3NlZCA/IFwiYXJyYXlidWZmZXJcIiA6IFwidGV4dFwiKS50aGVuKGRhdGEgPT4gKHtcbiAgICAgIGNNYXBEYXRhOiBkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBuZXcgVWludDhBcnJheShkYXRhKSA6IHN0cmluZ1RvQnl0ZXMoZGF0YSksXG4gICAgICBjb21wcmVzc2lvblR5cGVcbiAgICB9KSk7XG4gIH1cbn1cbmNsYXNzIERPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IGV4dGVuZHMgQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IHtcbiAgX2ZldGNoRGF0YSh1cmwpIHtcbiAgICByZXR1cm4gZmV0Y2hEYXRhKHVybCwgXCJhcnJheWJ1ZmZlclwiKS50aGVuKGRhdGEgPT4gbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICB9XG59XG5jbGFzcyBET01TVkdGYWN0b3J5IGV4dGVuZHMgQmFzZVNWR0ZhY3Rvcnkge1xuICBfY3JlYXRlU1ZHKHR5cGUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgdHlwZSk7XG4gIH1cbn1cbmNsYXNzIFBhZ2VWaWV3cG9ydCB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICB2aWV3Qm94LFxuICAgIHNjYWxlLFxuICAgIHJvdGF0aW9uLFxuICAgIG9mZnNldFggPSAwLFxuICAgIG9mZnNldFkgPSAwLFxuICAgIGRvbnRGbGlwID0gZmFsc2VcbiAgfSkge1xuICAgIHRoaXMudmlld0JveCA9IHZpZXdCb3g7XG4gICAgdGhpcy5zY2FsZSA9IHNjYWxlO1xuICAgIHRoaXMucm90YXRpb24gPSByb3RhdGlvbjtcbiAgICB0aGlzLm9mZnNldFggPSBvZmZzZXRYO1xuICAgIHRoaXMub2Zmc2V0WSA9IG9mZnNldFk7XG4gICAgY29uc3QgY2VudGVyWCA9ICh2aWV3Qm94WzJdICsgdmlld0JveFswXSkgLyAyO1xuICAgIGNvbnN0IGNlbnRlclkgPSAodmlld0JveFszXSArIHZpZXdCb3hbMV0pIC8gMjtcbiAgICBsZXQgcm90YXRlQSwgcm90YXRlQiwgcm90YXRlQywgcm90YXRlRDtcbiAgICByb3RhdGlvbiAlPSAzNjA7XG4gICAgaWYgKHJvdGF0aW9uIDwgMCkge1xuICAgICAgcm90YXRpb24gKz0gMzYwO1xuICAgIH1cbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcm90YXRlQSA9IC0xO1xuICAgICAgICByb3RhdGVCID0gMDtcbiAgICAgICAgcm90YXRlQyA9IDA7XG4gICAgICAgIHJvdGF0ZUQgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJvdGF0ZUEgPSAwO1xuICAgICAgICByb3RhdGVCID0gMTtcbiAgICAgICAgcm90YXRlQyA9IDE7XG4gICAgICAgIHJvdGF0ZUQgPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByb3RhdGVBID0gMDtcbiAgICAgICAgcm90YXRlQiA9IC0xO1xuICAgICAgICByb3RhdGVDID0gLTE7XG4gICAgICAgIHJvdGF0ZUQgPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcm90YXRlQSA9IDE7XG4gICAgICAgIHJvdGF0ZUIgPSAwO1xuICAgICAgICByb3RhdGVDID0gMDtcbiAgICAgICAgcm90YXRlRCA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhZ2VWaWV3cG9ydDogSW52YWxpZCByb3RhdGlvbiwgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDkwIGRlZ3JlZXMuXCIpO1xuICAgIH1cbiAgICBpZiAoZG9udEZsaXApIHtcbiAgICAgIHJvdGF0ZUMgPSAtcm90YXRlQztcbiAgICAgIHJvdGF0ZUQgPSAtcm90YXRlRDtcbiAgICB9XG4gICAgbGV0IG9mZnNldENhbnZhc1gsIG9mZnNldENhbnZhc1k7XG4gICAgbGV0IHdpZHRoLCBoZWlnaHQ7XG4gICAgaWYgKHJvdGF0ZUEgPT09IDApIHtcbiAgICAgIG9mZnNldENhbnZhc1ggPSBNYXRoLmFicyhjZW50ZXJZIC0gdmlld0JveFsxXSkgKiBzY2FsZSArIG9mZnNldFg7XG4gICAgICBvZmZzZXRDYW52YXNZID0gTWF0aC5hYnMoY2VudGVyWCAtIHZpZXdCb3hbMF0pICogc2NhbGUgKyBvZmZzZXRZO1xuICAgICAgd2lkdGggPSAodmlld0JveFszXSAtIHZpZXdCb3hbMV0pICogc2NhbGU7XG4gICAgICBoZWlnaHQgPSAodmlld0JveFsyXSAtIHZpZXdCb3hbMF0pICogc2NhbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9mZnNldENhbnZhc1ggPSBNYXRoLmFicyhjZW50ZXJYIC0gdmlld0JveFswXSkgKiBzY2FsZSArIG9mZnNldFg7XG4gICAgICBvZmZzZXRDYW52YXNZID0gTWF0aC5hYnMoY2VudGVyWSAtIHZpZXdCb3hbMV0pICogc2NhbGUgKyBvZmZzZXRZO1xuICAgICAgd2lkdGggPSAodmlld0JveFsyXSAtIHZpZXdCb3hbMF0pICogc2NhbGU7XG4gICAgICBoZWlnaHQgPSAodmlld0JveFszXSAtIHZpZXdCb3hbMV0pICogc2NhbGU7XG4gICAgfVxuICAgIHRoaXMudHJhbnNmb3JtID0gW3JvdGF0ZUEgKiBzY2FsZSwgcm90YXRlQiAqIHNjYWxlLCByb3RhdGVDICogc2NhbGUsIHJvdGF0ZUQgKiBzY2FsZSwgb2Zmc2V0Q2FudmFzWCAtIHJvdGF0ZUEgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVDICogc2NhbGUgKiBjZW50ZXJZLCBvZmZzZXRDYW52YXNZIC0gcm90YXRlQiAqIHNjYWxlICogY2VudGVyWCAtIHJvdGF0ZUQgKiBzY2FsZSAqIGNlbnRlclldO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuICBnZXQgcmF3RGltcygpIHtcbiAgICBjb25zdCB7XG4gICAgICB2aWV3Qm94XG4gICAgfSA9IHRoaXM7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInJhd0RpbXNcIiwge1xuICAgICAgcGFnZVdpZHRoOiB2aWV3Qm94WzJdIC0gdmlld0JveFswXSxcbiAgICAgIHBhZ2VIZWlnaHQ6IHZpZXdCb3hbM10gLSB2aWV3Qm94WzFdLFxuICAgICAgcGFnZVg6IHZpZXdCb3hbMF0sXG4gICAgICBwYWdlWTogdmlld0JveFsxXVxuICAgIH0pO1xuICB9XG4gIGNsb25lKHtcbiAgICBzY2FsZSA9IHRoaXMuc2NhbGUsXG4gICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uLFxuICAgIG9mZnNldFggPSB0aGlzLm9mZnNldFgsXG4gICAgb2Zmc2V0WSA9IHRoaXMub2Zmc2V0WSxcbiAgICBkb250RmxpcCA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIHJldHVybiBuZXcgUGFnZVZpZXdwb3J0KHtcbiAgICAgIHZpZXdCb3g6IHRoaXMudmlld0JveC5zbGljZSgpLFxuICAgICAgc2NhbGUsXG4gICAgICByb3RhdGlvbixcbiAgICAgIG9mZnNldFgsXG4gICAgICBvZmZzZXRZLFxuICAgICAgZG9udEZsaXBcbiAgICB9KTtcbiAgfVxuICBjb252ZXJ0VG9WaWV3cG9ydFBvaW50KHgsIHkpIHtcbiAgICByZXR1cm4gVXRpbC5hcHBseVRyYW5zZm9ybShbeCwgeV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgfVxuICBjb252ZXJ0VG9WaWV3cG9ydFJlY3RhbmdsZShyZWN0KSB7XG4gICAgY29uc3QgdG9wTGVmdCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JlY3RbMF0sIHJlY3RbMV1dLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgY29uc3QgYm90dG9tUmlnaHQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyZWN0WzJdLCByZWN0WzNdXSwgdGhpcy50cmFuc2Zvcm0pO1xuICAgIHJldHVybiBbdG9wTGVmdFswXSwgdG9wTGVmdFsxXSwgYm90dG9tUmlnaHRbMF0sIGJvdHRvbVJpZ2h0WzFdXTtcbiAgfVxuICBjb252ZXJ0VG9QZGZQb2ludCh4LCB5KSB7XG4gICAgcmV0dXJuIFV0aWwuYXBwbHlJbnZlcnNlVHJhbnNmb3JtKFt4LCB5XSwgdGhpcy50cmFuc2Zvcm0pO1xuICB9XG59XG5jbGFzcyBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnLCBleHRyYURlbGF5ID0gMCkge1xuICAgIHN1cGVyKG1zZywgXCJSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb25cIik7XG4gICAgdGhpcy5leHRyYURlbGF5ID0gZXh0cmFEZWxheTtcbiAgfVxufVxuZnVuY3Rpb24gaXNEYXRhU2NoZW1lKHVybCkge1xuICBjb25zdCBpaSA9IHVybC5sZW5ndGg7XG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKGkgPCBpaSAmJiB1cmxbaV0udHJpbSgpID09PSBcIlwiKSB7XG4gICAgaSsrO1xuICB9XG4gIHJldHVybiB1cmwuc3Vic3RyaW5nKGksIGkgKyA1KS50b0xvd2VyQ2FzZSgpID09PSBcImRhdGE6XCI7XG59XG5mdW5jdGlvbiBpc1BkZkZpbGUoZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHR5cGVvZiBmaWxlbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiAvXFwucGRmJC9pLnRlc3QoZmlsZW5hbWUpO1xufVxuZnVuY3Rpb24gZ2V0RmlsZW5hbWVGcm9tVXJsKHVybCkge1xuICBbdXJsXSA9IHVybC5zcGxpdCgvWyM/XS8sIDEpO1xuICByZXR1cm4gdXJsLnN1YnN0cmluZyh1cmwubGFzdEluZGV4T2YoXCIvXCIpICsgMSk7XG59XG5mdW5jdGlvbiBnZXRQZGZGaWxlbmFtZUZyb21VcmwodXJsLCBkZWZhdWx0RmlsZW5hbWUgPSBcImRvY3VtZW50LnBkZlwiKSB7XG4gIGlmICh0eXBlb2YgdXJsICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRGaWxlbmFtZTtcbiAgfVxuICBpZiAoaXNEYXRhU2NoZW1lKHVybCkpIHtcbiAgICB3YXJuKCdnZXRQZGZGaWxlbmFtZUZyb21Vcmw6IGlnbm9yZSBcImRhdGE6XCItVVJMIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLicpO1xuICAgIHJldHVybiBkZWZhdWx0RmlsZW5hbWU7XG4gIH1cbiAgY29uc3QgcmVVUkkgPSAvXig/Oig/OlteOl0rOik/XFwvXFwvW14vXSspPyhbXj8jXSopKFxcP1teI10qKT8oIy4qKT8kLztcbiAgY29uc3QgcmVGaWxlbmFtZSA9IC9bXi8/Iz1dK1xcLnBkZlxcYig/IS4qXFwucGRmXFxiKS9pO1xuICBjb25zdCBzcGxpdFVSSSA9IHJlVVJJLmV4ZWModXJsKTtcbiAgbGV0IHN1Z2dlc3RlZEZpbGVuYW1lID0gcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzFdKSB8fCByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbMl0pIHx8IHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVszXSk7XG4gIGlmIChzdWdnZXN0ZWRGaWxlbmFtZSkge1xuICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gc3VnZ2VzdGVkRmlsZW5hbWVbMF07XG4gICAgaWYgKHN1Z2dlc3RlZEZpbGVuYW1lLmluY2x1ZGVzKFwiJVwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3VnZ2VzdGVkRmlsZW5hbWUgPSByZUZpbGVuYW1lLmV4ZWMoZGVjb2RlVVJJQ29tcG9uZW50KHN1Z2dlc3RlZEZpbGVuYW1lKSlbMF07XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWdnZXN0ZWRGaWxlbmFtZSB8fCBkZWZhdWx0RmlsZW5hbWU7XG59XG5jbGFzcyBTdGF0VGltZXIge1xuICBzdGFydGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGltZXMgPSBbXTtcbiAgdGltZShuYW1lKSB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5zdGFydGVkKSB7XG4gICAgICB3YXJuKGBUaW1lciBpcyBhbHJlYWR5IHJ1bm5pbmcgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5zdGFydGVkW25hbWVdID0gRGF0ZS5ub3coKTtcbiAgfVxuICB0aW1lRW5kKG5hbWUpIHtcbiAgICBpZiAoIShuYW1lIGluIHRoaXMuc3RhcnRlZCkpIHtcbiAgICAgIHdhcm4oYFRpbWVyIGhhcyBub3QgYmVlbiBzdGFydGVkIGZvciAke25hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMudGltZXMucHVzaCh7XG4gICAgICBuYW1lLFxuICAgICAgc3RhcnQ6IHRoaXMuc3RhcnRlZFtuYW1lXSxcbiAgICAgIGVuZDogRGF0ZS5ub3coKVxuICAgIH0pO1xuICAgIGRlbGV0ZSB0aGlzLnN0YXJ0ZWRbbmFtZV07XG4gIH1cbiAgdG9TdHJpbmcoKSB7XG4gICAgY29uc3Qgb3V0QnVmID0gW107XG4gICAgbGV0IGxvbmdlc3QgPSAwO1xuICAgIGZvciAoY29uc3Qge1xuICAgICAgbmFtZVxuICAgIH0gb2YgdGhpcy50aW1lcykge1xuICAgICAgbG9uZ2VzdCA9IE1hdGgubWF4KG5hbWUubGVuZ3RoLCBsb25nZXN0KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgc3RhcnQsXG4gICAgICBlbmRcbiAgICB9IG9mIHRoaXMudGltZXMpIHtcbiAgICAgIG91dEJ1Zi5wdXNoKGAke25hbWUucGFkRW5kKGxvbmdlc3QpfSAke2VuZCAtIHN0YXJ0fW1zXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBvdXRCdWYuam9pbihcIlwiKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNWYWxpZEZldGNoVXJsKHVybCwgYmFzZVVybCkge1xuICB0cnkge1xuICAgIGNvbnN0IHtcbiAgICAgIHByb3RvY29sXG4gICAgfSA9IGJhc2VVcmwgPyBuZXcgVVJMKHVybCwgYmFzZVVybCkgOiBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIHByb3RvY29sID09PSBcImh0dHA6XCIgfHwgcHJvdG9jb2wgPT09IFwiaHR0cHM6XCI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gbm9Db250ZXh0TWVudShlKSB7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbn1cbmZ1bmN0aW9uIGRlcHJlY2F0ZWQoZGV0YWlscykge1xuICBjb25zb2xlLmxvZyhcIkRlcHJlY2F0ZWQgQVBJIHVzYWdlOiBcIiArIGRldGFpbHMpO1xufVxubGV0IHBkZkRhdGVTdHJpbmdSZWdleDtcbmNsYXNzIFBERkRhdGVTdHJpbmcge1xuICBzdGF0aWMgdG9EYXRlT2JqZWN0KGlucHV0KSB7XG4gICAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwZGZEYXRlU3RyaW5nUmVnZXggfHw9IG5ldyBSZWdFeHAoXCJeRDpcIiArIFwiKFxcXFxkezR9KVwiICsgXCIoXFxcXGR7Mn0pP1wiICsgXCIoXFxcXGR7Mn0pP1wiICsgXCIoXFxcXGR7Mn0pP1wiICsgXCIoXFxcXGR7Mn0pP1wiICsgXCIoXFxcXGR7Mn0pP1wiICsgXCIoW1p8K3wtXSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIic/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIic/XCIpO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBwZGZEYXRlU3RyaW5nUmVnZXguZXhlYyhpbnB1dCk7XG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeWVhciA9IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKTtcbiAgICBsZXQgbW9udGggPSBwYXJzZUludChtYXRjaGVzWzJdLCAxMCk7XG4gICAgbW9udGggPSBtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyID8gbW9udGggLSAxIDogMDtcbiAgICBsZXQgZGF5ID0gcGFyc2VJbnQobWF0Y2hlc1szXSwgMTApO1xuICAgIGRheSA9IGRheSA+PSAxICYmIGRheSA8PSAzMSA/IGRheSA6IDE7XG4gICAgbGV0IGhvdXIgPSBwYXJzZUludChtYXRjaGVzWzRdLCAxMCk7XG4gICAgaG91ciA9IGhvdXIgPj0gMCAmJiBob3VyIDw9IDIzID8gaG91ciA6IDA7XG4gICAgbGV0IG1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbNV0sIDEwKTtcbiAgICBtaW51dGUgPSBtaW51dGUgPj0gMCAmJiBtaW51dGUgPD0gNTkgPyBtaW51dGUgOiAwO1xuICAgIGxldCBzZWNvbmQgPSBwYXJzZUludChtYXRjaGVzWzZdLCAxMCk7XG4gICAgc2Vjb25kID0gc2Vjb25kID49IDAgJiYgc2Vjb25kIDw9IDU5ID8gc2Vjb25kIDogMDtcbiAgICBjb25zdCB1bml2ZXJzYWxUaW1lUmVsYXRpb24gPSBtYXRjaGVzWzddIHx8IFwiWlwiO1xuICAgIGxldCBvZmZzZXRIb3VyID0gcGFyc2VJbnQobWF0Y2hlc1s4XSwgMTApO1xuICAgIG9mZnNldEhvdXIgPSBvZmZzZXRIb3VyID49IDAgJiYgb2Zmc2V0SG91ciA8PSAyMyA/IG9mZnNldEhvdXIgOiAwO1xuICAgIGxldCBvZmZzZXRNaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzldLCAxMCkgfHwgMDtcbiAgICBvZmZzZXRNaW51dGUgPSBvZmZzZXRNaW51dGUgPj0gMCAmJiBvZmZzZXRNaW51dGUgPD0gNTkgPyBvZmZzZXRNaW51dGUgOiAwO1xuICAgIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09IFwiLVwiKSB7XG4gICAgICBob3VyICs9IG9mZnNldEhvdXI7XG4gICAgICBtaW51dGUgKz0gb2Zmc2V0TWludXRlO1xuICAgIH0gZWxzZSBpZiAodW5pdmVyc2FsVGltZVJlbGF0aW9uID09PSBcIitcIikge1xuICAgICAgaG91ciAtPSBvZmZzZXRIb3VyO1xuICAgICAgbWludXRlIC09IG9mZnNldE1pbnV0ZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFhmYVBhZ2VWaWV3cG9ydCh4ZmFQYWdlLCB7XG4gIHNjYWxlID0gMSxcbiAgcm90YXRpb24gPSAwXG59KSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfSA9IHhmYVBhZ2UuYXR0cmlidXRlcy5zdHlsZTtcbiAgY29uc3Qgdmlld0JveCA9IFswLCAwLCBwYXJzZUludCh3aWR0aCksIHBhcnNlSW50KGhlaWdodCldO1xuICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgdmlld0JveCxcbiAgICBzY2FsZSxcbiAgICByb3RhdGlvblxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldFJHQihjb2xvcikge1xuICBpZiAoY29sb3Iuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICBjb25zdCBjb2xvclJHQiA9IHBhcnNlSW50KGNvbG9yLnNsaWNlKDEpLCAxNik7XG4gICAgcmV0dXJuIFsoY29sb3JSR0IgJiAweGZmMDAwMCkgPj4gMTYsIChjb2xvclJHQiAmIDB4MDBmZjAwKSA+PiA4LCBjb2xvclJHQiAmIDB4MDAwMGZmXTtcbiAgfVxuICBpZiAoY29sb3Iuc3RhcnRzV2l0aChcInJnYihcIikpIHtcbiAgICByZXR1cm4gY29sb3Iuc2xpY2UoNCwgLTEpLnNwbGl0KFwiLFwiKS5tYXAoeCA9PiBwYXJzZUludCh4KSk7XG4gIH1cbiAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2JhKFwiKSkge1xuICAgIHJldHVybiBjb2xvci5zbGljZSg1LCAtMSkuc3BsaXQoXCIsXCIpLm1hcCh4ID0+IHBhcnNlSW50KHgpKS5zbGljZSgwLCAzKTtcbiAgfVxuICB3YXJuKGBOb3QgYSB2YWxpZCBjb2xvciBmb3JtYXQ6IFwiJHtjb2xvcn1cImApO1xuICByZXR1cm4gWzAsIDAsIDBdO1xufVxuZnVuY3Rpb24gZ2V0Q29sb3JWYWx1ZXMoY29sb3JzKSB7XG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmQoc3Bhbik7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBjb2xvcnMua2V5cygpKSB7XG4gICAgc3Bhbi5zdHlsZS5jb2xvciA9IG5hbWU7XG4gICAgY29uc3QgY29tcHV0ZWRDb2xvciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHNwYW4pLmNvbG9yO1xuICAgIGNvbG9ycy5zZXQobmFtZSwgZ2V0UkdCKGNvbXB1dGVkQ29sb3IpKTtcbiAgfVxuICBzcGFuLnJlbW92ZSgpO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpIHtcbiAgY29uc3Qge1xuICAgIGEsXG4gICAgYixcbiAgICBjLFxuICAgIGQsXG4gICAgZSxcbiAgICBmXG4gIH0gPSBjdHguZ2V0VHJhbnNmb3JtKCk7XG4gIHJldHVybiBbYSwgYiwgYywgZCwgZSwgZl07XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShjdHgpIHtcbiAgY29uc3Qge1xuICAgIGEsXG4gICAgYixcbiAgICBjLFxuICAgIGQsXG4gICAgZSxcbiAgICBmXG4gIH0gPSBjdHguZ2V0VHJhbnNmb3JtKCkuaW52ZXJ0U2VsZigpO1xuICByZXR1cm4gW2EsIGIsIGMsIGQsIGUsIGZdO1xufVxuZnVuY3Rpb24gc2V0TGF5ZXJEaW1lbnNpb25zKGRpdiwgdmlld3BvcnQsIG11c3RGbGlwID0gZmFsc2UsIG11c3RSb3RhdGUgPSB0cnVlKSB7XG4gIGlmICh2aWV3cG9ydCBpbnN0YW5jZW9mIFBhZ2VWaWV3cG9ydCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHBhZ2VXaWR0aCxcbiAgICAgIHBhZ2VIZWlnaHRcbiAgICB9ID0gdmlld3BvcnQucmF3RGltcztcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSBkaXY7XG4gICAgY29uc3QgdXNlUm91bmQgPSB1dGlsX0ZlYXR1cmVUZXN0LmlzQ1NTUm91bmRTdXBwb3J0ZWQ7XG4gICAgY29uc3QgdyA9IGB2YXIoLS1zY2FsZS1mYWN0b3IpICogJHtwYWdlV2lkdGh9cHhgLFxuICAgICAgaCA9IGB2YXIoLS1zY2FsZS1mYWN0b3IpICogJHtwYWdlSGVpZ2h0fXB4YDtcbiAgICBjb25zdCB3aWR0aFN0ciA9IHVzZVJvdW5kID8gYHJvdW5kKCR7d30sIDFweClgIDogYGNhbGMoJHt3fSlgLFxuICAgICAgaGVpZ2h0U3RyID0gdXNlUm91bmQgPyBgcm91bmQoJHtofSwgMXB4KWAgOiBgY2FsYygke2h9KWA7XG4gICAgaWYgKCFtdXN0RmxpcCB8fCB2aWV3cG9ydC5yb3RhdGlvbiAlIDE4MCA9PT0gMCkge1xuICAgICAgc3R5bGUud2lkdGggPSB3aWR0aFN0cjtcbiAgICAgIHN0eWxlLmhlaWdodCA9IGhlaWdodFN0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUud2lkdGggPSBoZWlnaHRTdHI7XG4gICAgICBzdHlsZS5oZWlnaHQgPSB3aWR0aFN0cjtcbiAgICB9XG4gIH1cbiAgaWYgKG11c3RSb3RhdGUpIHtcbiAgICBkaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsIHZpZXdwb3J0LnJvdGF0aW9uKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3IvdG9vbGJhci5qc1xuXG5jbGFzcyBFZGl0b3JUb29sYmFyIHtcbiAgI3Rvb2xiYXIgPSBudWxsO1xuICAjY29sb3JQaWNrZXIgPSBudWxsO1xuICAjZWRpdG9yO1xuICAjYnV0dG9ucyA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKGVkaXRvcikge1xuICAgIHRoaXMuI2VkaXRvciA9IGVkaXRvcjtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgZWRpdFRvb2xiYXIgPSB0aGlzLiN0b29sYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlZGl0VG9vbGJhci5jbGFzc05hbWUgPSBcImVkaXRUb29sYmFyXCI7XG4gICAgZWRpdFRvb2xiYXIuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInRvb2xiYXJcIik7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy4jZWRpdG9yLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICBlZGl0VG9vbGJhci5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgZWRpdFRvb2xiYXIuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIEVkaXRvclRvb2xiYXIuI3BvaW50ZXJEb3duLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBjb25zdCBidXR0b25zID0gdGhpcy4jYnV0dG9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgYnV0dG9ucy5jbGFzc05hbWUgPSBcImJ1dHRvbnNcIjtcbiAgICBlZGl0VG9vbGJhci5hcHBlbmQoYnV0dG9ucyk7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLiNlZGl0b3IudG9vbGJhclBvc2l0aW9uO1xuICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdHlsZVxuICAgICAgfSA9IGVkaXRUb29sYmFyO1xuICAgICAgY29uc3QgeCA9IHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLmRpcmVjdGlvbiA9PT0gXCJsdHJcIiA/IDEgLSBwb3NpdGlvblswXSA6IHBvc2l0aW9uWzBdO1xuICAgICAgc3R5bGUuaW5zZXRJbmxpbmVFbmQgPSBgJHsxMDAgKiB4fSVgO1xuICAgICAgc3R5bGUudG9wID0gYGNhbGMoJHsxMDAgKiBwb3NpdGlvblsxXX0lICsgdmFyKC0tZWRpdG9yLXRvb2xiYXItdmVydC1vZmZzZXQpKWA7XG4gICAgfVxuICAgIHRoaXMuI2FkZERlbGV0ZUJ1dHRvbigpO1xuICAgIHJldHVybiBlZGl0VG9vbGJhcjtcbiAgfVxuICBzdGF0aWMgI3BvaW50ZXJEb3duKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG4gICNmb2N1c0luKGUpIHtcbiAgICB0aGlzLiNlZGl0b3IuX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IGZhbHNlO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG4gICNmb2N1c091dChlKSB7XG4gICAgdGhpcy4jZWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSB0cnVlO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG4gICNhZGRMaXN0ZW5lcnNUb0VsZW1lbnQoZWxlbWVudCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCB0aGlzLiNmb2N1c0luLmJpbmQodGhpcyksIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCB0aGlzLiNmb2N1c091dC5iaW5kKHRoaXMpLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICB0aGlzLiN0b29sYmFyLmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG4gICAgdGhpcy4jY29sb3JQaWNrZXI/LmhpZGVEcm9wZG93bigpO1xuICB9XG4gIHNob3coKSB7XG4gICAgdGhpcy4jdG9vbGJhci5jbGFzc0xpc3QucmVtb3ZlKFwiaGlkZGVuXCIpO1xuICB9XG4gICNhZGREZWxldGVCdXR0b24oKSB7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICBidXR0b24uY2xhc3NOYW1lID0gXCJkZWxldGVcIjtcbiAgICBidXR0b24udGFiSW5kZXggPSAwO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgYHBkZmpzLWVkaXRvci1yZW1vdmUtJHt0aGlzLiNlZGl0b3IuZWRpdG9yVHlwZX0tYnV0dG9uYCk7XG4gICAgdGhpcy4jYWRkTGlzdGVuZXJzVG9FbGVtZW50KGJ1dHRvbik7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBlID0+IHtcbiAgICAgIHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLmRlbGV0ZSgpO1xuICAgIH0sIHtcbiAgICAgIHNpZ25hbDogdGhpcy4jZWRpdG9yLl91aU1hbmFnZXIuX3NpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuI2J1dHRvbnMuYXBwZW5kKGJ1dHRvbik7XG4gIH1cbiAgZ2V0ICNkaXZpZGVyKCkge1xuICAgIGNvbnN0IGRpdmlkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRpdmlkZXIuY2xhc3NOYW1lID0gXCJkaXZpZGVyXCI7XG4gICAgcmV0dXJuIGRpdmlkZXI7XG4gIH1cbiAgYWRkQWx0VGV4dEJ1dHRvbihidXR0b24pIHtcbiAgICB0aGlzLiNhZGRMaXN0ZW5lcnNUb0VsZW1lbnQoYnV0dG9uKTtcbiAgICB0aGlzLiNidXR0b25zLnByZXBlbmQoYnV0dG9uLCB0aGlzLiNkaXZpZGVyKTtcbiAgfVxuICBhZGRDb2xvclBpY2tlcihjb2xvclBpY2tlcikge1xuICAgIHRoaXMuI2NvbG9yUGlja2VyID0gY29sb3JQaWNrZXI7XG4gICAgY29uc3QgYnV0dG9uID0gY29sb3JQaWNrZXIucmVuZGVyQnV0dG9uKCk7XG4gICAgdGhpcy4jYWRkTGlzdGVuZXJzVG9FbGVtZW50KGJ1dHRvbik7XG4gICAgdGhpcy4jYnV0dG9ucy5wcmVwZW5kKGJ1dHRvbiwgdGhpcy4jZGl2aWRlcik7XG4gIH1cbiAgcmVtb3ZlKCkge1xuICAgIHRoaXMuI3Rvb2xiYXIucmVtb3ZlKCk7XG4gICAgdGhpcy4jY29sb3JQaWNrZXI/LmRlc3Ryb3koKTtcbiAgICB0aGlzLiNjb2xvclBpY2tlciA9IG51bGw7XG4gIH1cbn1cbmNsYXNzIEhpZ2hsaWdodFRvb2xiYXIge1xuICAjYnV0dG9ucyA9IG51bGw7XG4gICN0b29sYmFyID0gbnVsbDtcbiAgI3VpTWFuYWdlcjtcbiAgY29uc3RydWN0b3IodWlNYW5hZ2VyKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyID0gdWlNYW5hZ2VyO1xuICB9XG4gICNyZW5kZXIoKSB7XG4gICAgY29uc3QgZWRpdFRvb2xiYXIgPSB0aGlzLiN0b29sYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlZGl0VG9vbGJhci5jbGFzc05hbWUgPSBcImVkaXRUb29sYmFyXCI7XG4gICAgZWRpdFRvb2xiYXIuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInRvb2xiYXJcIik7XG4gICAgZWRpdFRvb2xiYXIuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbDogdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWxcbiAgICB9KTtcbiAgICBjb25zdCBidXR0b25zID0gdGhpcy4jYnV0dG9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgYnV0dG9ucy5jbGFzc05hbWUgPSBcImJ1dHRvbnNcIjtcbiAgICBlZGl0VG9vbGJhci5hcHBlbmQoYnV0dG9ucyk7XG4gICAgdGhpcy4jYWRkSGlnaGxpZ2h0QnV0dG9uKCk7XG4gICAgcmV0dXJuIGVkaXRUb29sYmFyO1xuICB9XG4gICNnZXRMYXN0UG9pbnQoYm94ZXMsIGlzTFRSKSB7XG4gICAgbGV0IGxhc3RZID0gMDtcbiAgICBsZXQgbGFzdFggPSAwO1xuICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICBjb25zdCB5ID0gYm94LnkgKyBib3guaGVpZ2h0O1xuICAgICAgaWYgKHkgPCBsYXN0WSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHggPSBib3gueCArIChpc0xUUiA/IGJveC53aWR0aCA6IDApO1xuICAgICAgaWYgKHkgPiBsYXN0WSkge1xuICAgICAgICBsYXN0WCA9IHg7XG4gICAgICAgIGxhc3RZID0geTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNMVFIpIHtcbiAgICAgICAgaWYgKHggPiBsYXN0WCkge1xuICAgICAgICAgIGxhc3RYID0geDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh4IDwgbGFzdFgpIHtcbiAgICAgICAgbGFzdFggPSB4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2lzTFRSID8gMSAtIGxhc3RYIDogbGFzdFgsIGxhc3RZXTtcbiAgfVxuICBzaG93KHBhcmVudCwgYm94ZXMsIGlzTFRSKSB7XG4gICAgY29uc3QgW3gsIHldID0gdGhpcy4jZ2V0TGFzdFBvaW50KGJveGVzLCBpc0xUUik7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy4jdG9vbGJhciB8fD0gdGhpcy4jcmVuZGVyKCk7XG4gICAgcGFyZW50LmFwcGVuZCh0aGlzLiN0b29sYmFyKTtcbiAgICBzdHlsZS5pbnNldElubGluZUVuZCA9IGAkezEwMCAqIHh9JWA7XG4gICAgc3R5bGUudG9wID0gYGNhbGMoJHsxMDAgKiB5fSUgKyB2YXIoLS1lZGl0b3ItdG9vbGJhci12ZXJ0LW9mZnNldCkpYDtcbiAgfVxuICBoaWRlKCkge1xuICAgIHRoaXMuI3Rvb2xiYXIucmVtb3ZlKCk7XG4gIH1cbiAgI2FkZEhpZ2hsaWdodEJ1dHRvbigpIHtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbi5jbGFzc05hbWUgPSBcImhpZ2hsaWdodEJ1dHRvblwiO1xuICAgIGJ1dHRvbi50YWJJbmRleCA9IDA7XG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBgcGRmanMtaGlnaGxpZ2h0LWZsb2F0aW5nLWJ1dHRvbjFgKTtcbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgYnV0dG9uLmFwcGVuZChzcGFuKTtcbiAgICBzcGFuLmNsYXNzTmFtZSA9IFwidmlzdWFsbHlIaWRkZW5cIjtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLWhpZ2hsaWdodC1mbG9hdGluZy1idXR0b24tbGFiZWxcIik7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci5oaWdobGlnaHRTZWxlY3Rpb24oXCJmbG9hdGluZ19idXR0b25cIik7XG4gICAgfSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy4jYnV0dG9ucy5hcHBlbmQoYnV0dG9uKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3IvdG9vbHMuanNcblxuXG5cbmZ1bmN0aW9uIGJpbmRFdmVudHMob2JqLCBlbGVtZW50LCBuYW1lcykge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgb2JqW25hbWVdLmJpbmQob2JqKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG9wYWNpdHlUb0hleChvcGFjaXR5KSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKE1hdGgubWluKDI1NSwgTWF0aC5tYXgoMSwgMjU1ICogb3BhY2l0eSkpKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpO1xufVxuY2xhc3MgSWRNYW5hZ2VyIHtcbiAgI2lkID0gMDtcbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiBgJHtBbm5vdGF0aW9uRWRpdG9yUHJlZml4fSR7dGhpcy4jaWQrK31gO1xuICB9XG59XG5jbGFzcyBJbWFnZU1hbmFnZXIge1xuICAjYmFzZUlkID0gZ2V0VXVpZCgpO1xuICAjaWQgPSAwO1xuICAjY2FjaGUgPSBudWxsO1xuICBzdGF0aWMgZ2V0IF9pc1NWR0ZpdHRpbmdDYW52YXMoKSB7XG4gICAgY29uc3Qgc3ZnID0gYGRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PVVURi04LDxzdmcgdmlld0JveD1cIjAgMCAxIDFcIiB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIxXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxyZWN0IHdpZHRoPVwiMVwiIGhlaWdodD1cIjFcIiBzdHlsZT1cImZpbGw6cmVkO1wiLz48L3N2Zz5gO1xuICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoMSwgMyk7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiLCB7XG4gICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgIGltYWdlLnNyYyA9IHN2ZztcbiAgICBjb25zdCBwcm9taXNlID0gaW1hZ2UuZGVjb2RlKCkudGhlbigoKSA9PiB7XG4gICAgICBjdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwLCAxLCAxLCAwLCAwLCAxLCAzKTtcbiAgICAgIHJldHVybiBuZXcgVWludDMyQXJyYXkoY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhLmJ1ZmZlcilbMF0gPT09IDA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9pc1NWR0ZpdHRpbmdDYW52YXNcIiwgcHJvbWlzZSk7XG4gIH1cbiAgYXN5bmMgI2dldChrZXksIHJhd0RhdGEpIHtcbiAgICB0aGlzLiNjYWNoZSB8fD0gbmV3IE1hcCgpO1xuICAgIGxldCBkYXRhID0gdGhpcy4jY2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZGF0YT8uYml0bWFwKSB7XG4gICAgICBkYXRhLnJlZkNvdW50ZXIgKz0gMTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgZGF0YSB8fD0ge1xuICAgICAgICBiaXRtYXA6IG51bGwsXG4gICAgICAgIGlkOiBgaW1hZ2VfJHt0aGlzLiNiYXNlSWR9XyR7dGhpcy4jaWQrK31gLFxuICAgICAgICByZWZDb3VudGVyOiAwLFxuICAgICAgICBpc1N2ZzogZmFsc2VcbiAgICAgIH07XG4gICAgICBsZXQgaW1hZ2U7XG4gICAgICBpZiAodHlwZW9mIHJhd0RhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZGF0YS51cmwgPSByYXdEYXRhO1xuICAgICAgICBpbWFnZSA9IGF3YWl0IGZldGNoRGF0YShyYXdEYXRhLCBcImJsb2JcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbWFnZSA9IGRhdGEuZmlsZSA9IHJhd0RhdGE7XG4gICAgICB9XG4gICAgICBpZiAoaW1hZ2UudHlwZSA9PT0gXCJpbWFnZS9zdmcreG1sXCIpIHtcbiAgICAgICAgY29uc3QgbXVzdFJlbW92ZUFzcGVjdFJhdGlvUHJvbWlzZSA9IEltYWdlTWFuYWdlci5faXNTVkdGaXR0aW5nQ2FudmFzO1xuICAgICAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGNvbnN0IGltYWdlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBpbWFnZUVsZW1lbnQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgZGF0YS5iaXRtYXAgPSBpbWFnZUVsZW1lbnQ7XG4gICAgICAgICAgICBkYXRhLmlzU3ZnID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gZGF0YS5zdmdVcmwgPSBmaWxlUmVhZGVyLnJlc3VsdDtcbiAgICAgICAgICAgIGltYWdlRWxlbWVudC5zcmMgPSAoYXdhaXQgbXVzdFJlbW92ZUFzcGVjdFJhdGlvUHJvbWlzZSkgPyBgJHt1cmx9I3N2Z1ZpZXcocHJlc2VydmVBc3BlY3RSYXRpbyhub25lKSlgIDogdXJsO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaW1hZ2VFbGVtZW50Lm9uZXJyb3IgPSBmaWxlUmVhZGVyLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoaW1hZ2UpO1xuICAgICAgICBhd2FpdCBpbWFnZVByb21pc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhLmJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGltYWdlKTtcbiAgICAgIH1cbiAgICAgIGRhdGEucmVmQ291bnRlciA9IDE7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIGRhdGEgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLiNjYWNoZS5zZXQoa2V5LCBkYXRhKTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy4jY2FjaGUuc2V0KGRhdGEuaWQsIGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICBhc3luYyBnZXRGcm9tRmlsZShmaWxlKSB7XG4gICAgY29uc3Qge1xuICAgICAgbGFzdE1vZGlmaWVkLFxuICAgICAgbmFtZSxcbiAgICAgIHNpemUsXG4gICAgICB0eXBlXG4gICAgfSA9IGZpbGU7XG4gICAgcmV0dXJuIHRoaXMuI2dldChgJHtsYXN0TW9kaWZpZWR9XyR7bmFtZX1fJHtzaXplfV8ke3R5cGV9YCwgZmlsZSk7XG4gIH1cbiAgYXN5bmMgZ2V0RnJvbVVybCh1cmwpIHtcbiAgICByZXR1cm4gdGhpcy4jZ2V0KHVybCwgdXJsKTtcbiAgfVxuICBhc3luYyBnZXRGcm9tSWQoaWQpIHtcbiAgICB0aGlzLiNjYWNoZSB8fD0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLiNjYWNoZS5nZXQoaWQpO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChkYXRhLmJpdG1hcCkge1xuICAgICAgZGF0YS5yZWZDb3VudGVyICs9IDE7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKGRhdGEuZmlsZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbUZpbGUoZGF0YS5maWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0RnJvbVVybChkYXRhLnVybCk7XG4gIH1cbiAgZ2V0U3ZnVXJsKGlkKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuI2NhY2hlLmdldChpZCk7XG4gICAgaWYgKCFkYXRhPy5pc1N2Zykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBkYXRhLnN2Z1VybDtcbiAgfVxuICBkZWxldGVJZChpZCkge1xuICAgIHRoaXMuI2NhY2hlIHx8PSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuI2NhY2hlLmdldChpZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRhdGEucmVmQ291bnRlciAtPSAxO1xuICAgIGlmIChkYXRhLnJlZkNvdW50ZXIgIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGF0YS5iaXRtYXAgPSBudWxsO1xuICB9XG4gIGlzVmFsaWRJZChpZCkge1xuICAgIHJldHVybiBpZC5zdGFydHNXaXRoKGBpbWFnZV8ke3RoaXMuI2Jhc2VJZH1fYCk7XG4gIH1cbn1cbmNsYXNzIENvbW1hbmRNYW5hZ2VyIHtcbiAgI2NvbW1hbmRzID0gW107XG4gICNsb2NrZWQgPSBmYWxzZTtcbiAgI21heFNpemU7XG4gICNwb3NpdGlvbiA9IC0xO1xuICBjb25zdHJ1Y3RvcihtYXhTaXplID0gMTI4KSB7XG4gICAgdGhpcy4jbWF4U2l6ZSA9IG1heFNpemU7XG4gIH1cbiAgYWRkKHtcbiAgICBjbWQsXG4gICAgdW5kbyxcbiAgICBwb3N0LFxuICAgIG11c3RFeGVjLFxuICAgIHR5cGUgPSBOYU4sXG4gICAgb3ZlcndyaXRlSWZTYW1lVHlwZSA9IGZhbHNlLFxuICAgIGtlZXBVbmRvID0gZmFsc2VcbiAgfSkge1xuICAgIGlmIChtdXN0RXhlYykge1xuICAgICAgY21kKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNsb2NrZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2F2ZSA9IHtcbiAgICAgIGNtZCxcbiAgICAgIHVuZG8sXG4gICAgICBwb3N0LFxuICAgICAgdHlwZVxuICAgIH07XG4gICAgaWYgKHRoaXMuI3Bvc2l0aW9uID09PSAtMSkge1xuICAgICAgaWYgKHRoaXMuI2NvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy4jY29tbWFuZHMubGVuZ3RoID0gMDtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3Bvc2l0aW9uID0gMDtcbiAgICAgIHRoaXMuI2NvbW1hbmRzLnB1c2goc2F2ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvdmVyd3JpdGVJZlNhbWVUeXBlICYmIHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXS50eXBlID09PSB0eXBlKSB7XG4gICAgICBpZiAoa2VlcFVuZG8pIHtcbiAgICAgICAgc2F2ZS51bmRvID0gdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dLnVuZG87XG4gICAgICB9XG4gICAgICB0aGlzLiNjb21tYW5kc1t0aGlzLiNwb3NpdGlvbl0gPSBzYXZlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gdGhpcy4jcG9zaXRpb24gKyAxO1xuICAgIGlmIChuZXh0ID09PSB0aGlzLiNtYXhTaXplKSB7XG4gICAgICB0aGlzLiNjb21tYW5kcy5zcGxpY2UoMCwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI3Bvc2l0aW9uID0gbmV4dDtcbiAgICAgIGlmIChuZXh0IDwgdGhpcy4jY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuI2NvbW1hbmRzLnNwbGljZShuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jY29tbWFuZHMucHVzaChzYXZlKTtcbiAgfVxuICB1bmRvKCkge1xuICAgIGlmICh0aGlzLiNwb3NpdGlvbiA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jbG9ja2VkID0gdHJ1ZTtcbiAgICBjb25zdCB7XG4gICAgICB1bmRvLFxuICAgICAgcG9zdFxuICAgIH0gPSB0aGlzLiNjb21tYW5kc1t0aGlzLiNwb3NpdGlvbl07XG4gICAgdW5kbygpO1xuICAgIHBvc3Q/LigpO1xuICAgIHRoaXMuI2xvY2tlZCA9IGZhbHNlO1xuICAgIHRoaXMuI3Bvc2l0aW9uIC09IDE7XG4gIH1cbiAgcmVkbygpIHtcbiAgICBpZiAodGhpcy4jcG9zaXRpb24gPCB0aGlzLiNjb21tYW5kcy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLiNwb3NpdGlvbiArPSAxO1xuICAgICAgdGhpcy4jbG9ja2VkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY21kLFxuICAgICAgICBwb3N0XG4gICAgICB9ID0gdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dO1xuICAgICAgY21kKCk7XG4gICAgICBwb3N0Py4oKTtcbiAgICAgIHRoaXMuI2xvY2tlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBoYXNTb21ldGhpbmdUb1VuZG8oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Bvc2l0aW9uICE9PSAtMTtcbiAgfVxuICBoYXNTb21ldGhpbmdUb1JlZG8oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Bvc2l0aW9uIDwgdGhpcy4jY29tbWFuZHMubGVuZ3RoIC0gMTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuI2NvbW1hbmRzID0gbnVsbDtcbiAgfVxufVxuY2xhc3MgS2V5Ym9hcmRNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoY2FsbGJhY2tzKSB7XG4gICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmFsbEtleXMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gdXRpbF9GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICBmb3IgKGNvbnN0IFtrZXlzLCBjYWxsYmFjaywgb3B0aW9ucyA9IHt9XSBvZiBjYWxsYmFja3MpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgaXNNYWNLZXkgPSBrZXkuc3RhcnRzV2l0aChcIm1hYytcIik7XG4gICAgICAgIGlmIChpc01hYyAmJiBpc01hY0tleSkge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLnNldChrZXkuc2xpY2UoNCksIHtcbiAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWxsS2V5cy5hZGQoa2V5LnNwbGl0KFwiK1wiKS5hdCgtMSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc01hYyAmJiAhaXNNYWNLZXkpIHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmFsbEtleXMuYWRkKGtleS5zcGxpdChcIitcIikuYXQoLTEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAjc2VyaWFsaXplKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgdGhpcy5idWZmZXIucHVzaChcImFsdFwiKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2goXCJjdHJsXCIpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQubWV0YUtleSkge1xuICAgICAgdGhpcy5idWZmZXIucHVzaChcIm1ldGFcIik7XG4gICAgfVxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5idWZmZXIucHVzaChcInNoaWZ0XCIpO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlci5wdXNoKGV2ZW50LmtleSk7XG4gICAgY29uc3Qgc3RyID0gdGhpcy5idWZmZXIuam9pbihcIitcIik7XG4gICAgdGhpcy5idWZmZXIubGVuZ3RoID0gMDtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIGV4ZWMoc2VsZiwgZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuYWxsS2V5cy5oYXMoZXZlbnQua2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmZvID0gdGhpcy5jYWxsYmFja3MuZ2V0KHRoaXMuI3NlcmlhbGl6ZShldmVudCkpO1xuICAgIGlmICghaW5mbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjYWxsYmFjayxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgYnViYmxlcyA9IGZhbHNlLFxuICAgICAgICBhcmdzID0gW10sXG4gICAgICAgIGNoZWNrZXIgPSBudWxsXG4gICAgICB9XG4gICAgfSA9IGluZm87XG4gICAgaWYgKGNoZWNrZXIgJiYgIWNoZWNrZXIoc2VsZiwgZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxiYWNrLmJpbmQoc2VsZiwgLi4uYXJncywgZXZlbnQpKCk7XG4gICAgaWYgKCFidWJibGVzKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG59XG5jbGFzcyBDb2xvck1hbmFnZXIge1xuICBzdGF0aWMgX2NvbG9yc01hcHBpbmcgPSBuZXcgTWFwKFtbXCJDYW52YXNUZXh0XCIsIFswLCAwLCAwXV0sIFtcIkNhbnZhc1wiLCBbMjU1LCAyNTUsIDI1NV1dXSk7XG4gIGdldCBfY29sb3JzKCkge1xuICAgIGNvbnN0IGNvbG9ycyA9IG5ldyBNYXAoW1tcIkNhbnZhc1RleHRcIiwgbnVsbF0sIFtcIkNhbnZhc1wiLCBudWxsXV0pO1xuICAgIGdldENvbG9yVmFsdWVzKGNvbG9ycyk7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9jb2xvcnNcIiwgY29sb3JzKTtcbiAgfVxuICBjb252ZXJ0KGNvbG9yKSB7XG4gICAgY29uc3QgcmdiID0gZ2V0UkdCKGNvbG9yKTtcbiAgICBpZiAoIXdpbmRvdy5tYXRjaE1lZGlhKFwiKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSlcIikubWF0Y2hlcykge1xuICAgICAgcmV0dXJuIHJnYjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbbmFtZSwgUkdCXSBvZiB0aGlzLl9jb2xvcnMpIHtcbiAgICAgIGlmIChSR0IuZXZlcnkoKHgsIGkpID0+IHggPT09IHJnYltpXSkpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yTWFuYWdlci5fY29sb3JzTWFwcGluZy5nZXQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZ2I7XG4gIH1cbiAgZ2V0SGV4Q29kZShuYW1lKSB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5fY29sb3JzLmdldChuYW1lKTtcbiAgICBpZiAoIXJnYikge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuICAgIHJldHVybiBVdGlsLm1ha2VIZXhDb2xvciguLi5yZ2IpO1xuICB9XG59XG5jbGFzcyBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyIHtcbiAgI2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgI2FjdGl2ZUVkaXRvciA9IG51bGw7XG4gICNhbGxFZGl0b3JzID0gbmV3IE1hcCgpO1xuICAjYWxsTGF5ZXJzID0gbmV3IE1hcCgpO1xuICAjYWx0VGV4dE1hbmFnZXIgPSBudWxsO1xuICAjYW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsO1xuICAjY2hhbmdlZEV4aXN0aW5nQW5ub3RhdGlvbnMgPSBudWxsO1xuICAjY29tbWFuZE1hbmFnZXIgPSBuZXcgQ29tbWFuZE1hbmFnZXIoKTtcbiAgI2N1cnJlbnRQYWdlSW5kZXggPSAwO1xuICAjZGVsZXRlZEFubm90YXRpb25zRWxlbWVudElkcyA9IG5ldyBTZXQoKTtcbiAgI2RyYWdnaW5nRWRpdG9ycyA9IG51bGw7XG4gICNlZGl0b3JUeXBlcyA9IG51bGw7XG4gICNlZGl0b3JzVG9SZXNjYWxlID0gbmV3IFNldCgpO1xuICAjZW5hYmxlSGlnaGxpZ2h0RmxvYXRpbmdCdXR0b24gPSBmYWxzZTtcbiAgI2ZpbHRlckZhY3RvcnkgPSBudWxsO1xuICAjZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkID0gbnVsbDtcbiAgI2hpZ2hsaWdodENvbG9ycyA9IG51bGw7XG4gICNoaWdobGlnaHRXaGVuU2hpZnRVcCA9IGZhbHNlO1xuICAjaGlnaGxpZ2h0VG9vbGJhciA9IG51bGw7XG4gICNpZE1hbmFnZXIgPSBuZXcgSWRNYW5hZ2VyKCk7XG4gICNpc0VuYWJsZWQgPSBmYWxzZTtcbiAgI2lzV2FpdGluZyA9IGZhbHNlO1xuICAjbGFzdEFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAjbWFpbkhpZ2hsaWdodENvbG9yUGlja2VyID0gbnVsbDtcbiAgI21sTWFuYWdlciA9IG51bGw7XG4gICNtb2RlID0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORTtcbiAgI3NlbGVjdGVkRWRpdG9ycyA9IG5ldyBTZXQoKTtcbiAgI3NlbGVjdGVkVGV4dE5vZGUgPSBudWxsO1xuICAjcGFnZUNvbG9ycyA9IG51bGw7XG4gICNzaG93QWxsU3RhdGVzID0gbnVsbDtcbiAgI2JvdW5kQmx1ciA9IHRoaXMuYmx1ci5iaW5kKHRoaXMpO1xuICAjYm91bmRGb2N1cyA9IHRoaXMuZm9jdXMuYmluZCh0aGlzKTtcbiAgI2JvdW5kQ29weSA9IHRoaXMuY29weS5iaW5kKHRoaXMpO1xuICAjYm91bmRDdXQgPSB0aGlzLmN1dC5iaW5kKHRoaXMpO1xuICAjYm91bmRQYXN0ZSA9IHRoaXMucGFzdGUuYmluZCh0aGlzKTtcbiAgI2JvdW5kS2V5ZG93biA9IHRoaXMua2V5ZG93bi5iaW5kKHRoaXMpO1xuICAjYm91bmRLZXl1cCA9IHRoaXMua2V5dXAuYmluZCh0aGlzKTtcbiAgI2JvdW5kT25FZGl0aW5nQWN0aW9uID0gdGhpcy5vbkVkaXRpbmdBY3Rpb24uYmluZCh0aGlzKTtcbiAgI2JvdW5kT25QYWdlQ2hhbmdpbmcgPSB0aGlzLm9uUGFnZUNoYW5naW5nLmJpbmQodGhpcyk7XG4gICNib3VuZE9uU2NhbGVDaGFuZ2luZyA9IHRoaXMub25TY2FsZUNoYW5naW5nLmJpbmQodGhpcyk7XG4gICNib3VuZE9uUm90YXRpb25DaGFuZ2luZyA9IHRoaXMub25Sb3RhdGlvbkNoYW5naW5nLmJpbmQodGhpcyk7XG4gICNwcmV2aW91c1N0YXRlcyA9IHtcbiAgICBpc0VkaXRpbmc6IGZhbHNlLFxuICAgIGlzRW1wdHk6IHRydWUsXG4gICAgaGFzU29tZXRoaW5nVG9VbmRvOiBmYWxzZSxcbiAgICBoYXNTb21ldGhpbmdUb1JlZG86IGZhbHNlLFxuICAgIGhhc1NlbGVjdGVkRWRpdG9yOiBmYWxzZSxcbiAgICBoYXNTZWxlY3RlZFRleHQ6IGZhbHNlXG4gIH07XG4gICN0cmFuc2xhdGlvbiA9IFswLCAwXTtcbiAgI3RyYW5zbGF0aW9uVGltZW91dElkID0gbnVsbDtcbiAgI2NvbnRhaW5lciA9IG51bGw7XG4gICN2aWV3ZXIgPSBudWxsO1xuICBzdGF0aWMgVFJBTlNMQVRFX1NNQUxMID0gMTtcbiAgc3RhdGljIFRSQU5TTEFURV9CSUcgPSAxMDtcbiAgc3RhdGljIGdldCBfa2V5Ym9hcmRNYW5hZ2VyKCkge1xuICAgIGNvbnN0IHByb3RvID0gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5wcm90b3R5cGU7XG4gICAgY29uc3QgYXJyb3dDaGVja2VyID0gc2VsZiA9PiBzZWxmLiNjb250YWluZXIuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50YWdOYW1lICE9PSBcIkJVVFRPTlwiICYmIHNlbGYuaGFzU29tZXRoaW5nVG9Db250cm9sKCk7XG4gICAgY29uc3QgdGV4dElucHV0Q2hlY2tlciA9IChfc2VsZiwge1xuICAgICAgdGFyZ2V0OiBlbFxuICAgIH0pID0+IHtcbiAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHR5cGVcbiAgICAgICAgfSA9IGVsO1xuICAgICAgICByZXR1cm4gdHlwZSAhPT0gXCJ0ZXh0XCIgJiYgdHlwZSAhPT0gXCJudW1iZXJcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgY29uc3Qgc21hbGwgPSB0aGlzLlRSQU5TTEFURV9TTUFMTDtcbiAgICBjb25zdCBiaWcgPSB0aGlzLlRSQU5TTEFURV9CSUc7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9rZXlib2FyZE1hbmFnZXJcIiwgbmV3IEtleWJvYXJkTWFuYWdlcihbW1tcImN0cmwrYVwiLCBcIm1hYyttZXRhK2FcIl0sIHByb3RvLnNlbGVjdEFsbCwge1xuICAgICAgY2hlY2tlcjogdGV4dElucHV0Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCt6XCIsIFwibWFjK21ldGErelwiXSwgcHJvdG8udW5kbywge1xuICAgICAgY2hlY2tlcjogdGV4dElucHV0Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCt5XCIsIFwiY3RybCtzaGlmdCt6XCIsIFwibWFjK21ldGErc2hpZnQrelwiLCBcImN0cmwrc2hpZnQrWlwiLCBcIm1hYyttZXRhK3NoaWZ0K1pcIl0sIHByb3RvLnJlZG8sIHtcbiAgICAgIGNoZWNrZXI6IHRleHRJbnB1dENoZWNrZXJcbiAgICB9XSwgW1tcIkJhY2tzcGFjZVwiLCBcImFsdCtCYWNrc3BhY2VcIiwgXCJjdHJsK0JhY2tzcGFjZVwiLCBcInNoaWZ0K0JhY2tzcGFjZVwiLCBcIm1hYytCYWNrc3BhY2VcIiwgXCJtYWMrYWx0K0JhY2tzcGFjZVwiLCBcIm1hYytjdHJsK0JhY2tzcGFjZVwiLCBcIkRlbGV0ZVwiLCBcImN0cmwrRGVsZXRlXCIsIFwic2hpZnQrRGVsZXRlXCIsIFwibWFjK0RlbGV0ZVwiXSwgcHJvdG8uZGVsZXRlLCB7XG4gICAgICBjaGVja2VyOiB0ZXh0SW5wdXRDaGVja2VyXG4gICAgfV0sIFtbXCJFbnRlclwiLCBcIm1hYytFbnRlclwiXSwgcHJvdG8uYWRkTmV3RWRpdG9yRnJvbUtleWJvYXJkLCB7XG4gICAgICBjaGVja2VyOiAoc2VsZiwge1xuICAgICAgICB0YXJnZXQ6IGVsXG4gICAgICB9KSA9PiAhKGVsIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQpICYmIHNlbGYuI2NvbnRhaW5lci5jb250YWlucyhlbCkgJiYgIXNlbGYuaXNFbnRlckhhbmRsZWRcbiAgICB9XSwgW1tcIiBcIiwgXCJtYWMrIFwiXSwgcHJvdG8uYWRkTmV3RWRpdG9yRnJvbUtleWJvYXJkLCB7XG4gICAgICBjaGVja2VyOiAoc2VsZiwge1xuICAgICAgICB0YXJnZXQ6IGVsXG4gICAgICB9KSA9PiAhKGVsIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQpICYmIHNlbGYuI2NvbnRhaW5lci5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KVxuICAgIH1dLCBbW1wiRXNjYXBlXCIsIFwibWFjK0VzY2FwZVwiXSwgcHJvdG8udW5zZWxlY3RBbGxdLCBbW1wiQXJyb3dMZWZ0XCIsIFwibWFjK0Fycm93TGVmdFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbLXNtYWxsLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd0xlZnRcIiwgXCJtYWMrc2hpZnQrQXJyb3dMZWZ0XCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFstYmlnLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiQXJyb3dSaWdodFwiLCBcIm1hYytBcnJvd1JpZ2h0XCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFtzbWFsbCwgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dSaWdodFwiLCBcIm1hYytzaGlmdCtBcnJvd1JpZ2h0XCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFtiaWcsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJBcnJvd1VwXCIsIFwibWFjK0Fycm93VXBcIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogWzAsIC1zbWFsbF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dVcFwiLCBcIm1hYytzaGlmdCtBcnJvd1VwXCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFswLCAtYmlnXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiQXJyb3dEb3duXCIsIFwibWFjK0Fycm93RG93blwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbMCwgc21hbGxdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93RG93blwiLCBcIm1hYytzaGlmdCtBcnJvd0Rvd25cIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogWzAsIGJpZ10sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XV0pKTtcbiAgfVxuICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIHZpZXdlciwgYWx0VGV4dE1hbmFnZXIsIGV2ZW50QnVzLCBwZGZEb2N1bWVudCwgcGFnZUNvbG9ycywgaGlnaGxpZ2h0Q29sb3JzLCBlbmFibGVIaWdobGlnaHRGbG9hdGluZ0J1dHRvbiwgbWxNYW5hZ2VyKSB7XG4gICAgdGhpcy5fc2lnbmFsID0gdGhpcy4jYWJvcnRDb250cm9sbGVyLnNpZ25hbDtcbiAgICB0aGlzLiNjb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy4jdmlld2VyID0gdmlld2VyO1xuICAgIHRoaXMuI2FsdFRleHRNYW5hZ2VyID0gYWx0VGV4dE1hbmFnZXI7XG4gICAgdGhpcy5fZXZlbnRCdXMgPSBldmVudEJ1cztcbiAgICB0aGlzLl9ldmVudEJ1cy5fb24oXCJlZGl0aW5nYWN0aW9uXCIsIHRoaXMuI2JvdW5kT25FZGl0aW5nQWN0aW9uKTtcbiAgICB0aGlzLl9ldmVudEJ1cy5fb24oXCJwYWdlY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblBhZ2VDaGFuZ2luZyk7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29uKFwic2NhbGVjaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uU2NhbGVDaGFuZ2luZyk7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29uKFwicm90YXRpb25jaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uUm90YXRpb25DaGFuZ2luZyk7XG4gICAgdGhpcy4jYWRkU2VsZWN0aW9uTGlzdGVuZXIoKTtcbiAgICB0aGlzLiNhZGREcmFnQW5kRHJvcExpc3RlbmVycygpO1xuICAgIHRoaXMuI2FkZEtleWJvYXJkTWFuYWdlcigpO1xuICAgIHRoaXMuI2Fubm90YXRpb25TdG9yYWdlID0gcGRmRG9jdW1lbnQuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgdGhpcy4jZmlsdGVyRmFjdG9yeSA9IHBkZkRvY3VtZW50LmZpbHRlckZhY3Rvcnk7XG4gICAgdGhpcy4jcGFnZUNvbG9ycyA9IHBhZ2VDb2xvcnM7XG4gICAgdGhpcy4jaGlnaGxpZ2h0Q29sb3JzID0gaGlnaGxpZ2h0Q29sb3JzIHx8IG51bGw7XG4gICAgdGhpcy4jZW5hYmxlSGlnaGxpZ2h0RmxvYXRpbmdCdXR0b24gPSBlbmFibGVIaWdobGlnaHRGbG9hdGluZ0J1dHRvbjtcbiAgICB0aGlzLiNtbE1hbmFnZXIgPSBtbE1hbmFnZXIgfHwgbnVsbDtcbiAgICB0aGlzLnZpZXdQYXJhbWV0ZXJzID0ge1xuICAgICAgcmVhbFNjYWxlOiBQaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFMsXG4gICAgICByb3RhdGlvbjogMFxuICAgIH07XG4gICAgdGhpcy5pc1NoaWZ0S2V5RG93biA9IGZhbHNlO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4jYWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMuI2Fib3J0Q29udHJvbGxlciA9IG51bGw7XG4gICAgdGhpcy5fc2lnbmFsID0gbnVsbDtcbiAgICB0aGlzLl9ldmVudEJ1cy5fb2ZmKFwiZWRpdGluZ2FjdGlvblwiLCB0aGlzLiNib3VuZE9uRWRpdGluZ0FjdGlvbik7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29mZihcInBhZ2VjaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uUGFnZUNoYW5naW5nKTtcbiAgICB0aGlzLl9ldmVudEJ1cy5fb2ZmKFwic2NhbGVjaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uU2NhbGVDaGFuZ2luZyk7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29mZihcInJvdGF0aW9uY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblJvdGF0aW9uQ2hhbmdpbmcpO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG4gICAgICBsYXllci5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMuI2FsbExheWVycy5jbGVhcigpO1xuICAgIHRoaXMuI2FsbEVkaXRvcnMuY2xlYXIoKTtcbiAgICB0aGlzLiNlZGl0b3JzVG9SZXNjYWxlLmNsZWFyKCk7XG4gICAgdGhpcy4jYWN0aXZlRWRpdG9yID0gbnVsbDtcbiAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuY2xlYXIoKTtcbiAgICB0aGlzLiNjb21tYW5kTWFuYWdlci5kZXN0cm95KCk7XG4gICAgdGhpcy4jYWx0VGV4dE1hbmFnZXI/LmRlc3Ryb3koKTtcbiAgICB0aGlzLiNoaWdobGlnaHRUb29sYmFyPy5oaWRlKCk7XG4gICAgdGhpcy4jaGlnaGxpZ2h0VG9vbGJhciA9IG51bGw7XG4gICAgaWYgKHRoaXMuI2ZvY3VzTWFpbkNvbnRhaW5lclRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2ZvY3VzTWFpbkNvbnRhaW5lclRpbWVvdXRJZCk7XG4gICAgICB0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0cmFuc2xhdGlvblRpbWVvdXRJZCk7XG4gICAgICB0aGlzLiN0cmFuc2xhdGlvblRpbWVvdXRJZCA9IG51bGw7XG4gICAgfVxuICB9XG4gIGFzeW5jIG1sR3Vlc3MoZGF0YSkge1xuICAgIHJldHVybiB0aGlzLiNtbE1hbmFnZXI/Lmd1ZXNzKGRhdGEpIHx8IG51bGw7XG4gIH1cbiAgZ2V0IGhhc01MTWFuYWdlcigpIHtcbiAgICByZXR1cm4gISF0aGlzLiNtbE1hbmFnZXI7XG4gIH1cbiAgZ2V0IGhjbUZpbHRlcigpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaGNtRmlsdGVyXCIsIHRoaXMuI3BhZ2VDb2xvcnMgPyB0aGlzLiNmaWx0ZXJGYWN0b3J5LmFkZEhDTUZpbHRlcih0aGlzLiNwYWdlQ29sb3JzLmZvcmVncm91bmQsIHRoaXMuI3BhZ2VDb2xvcnMuYmFja2dyb3VuZCkgOiBcIm5vbmVcIik7XG4gIH1cbiAgZ2V0IGRpcmVjdGlvbigpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiZGlyZWN0aW9uXCIsIGdldENvbXB1dGVkU3R5bGUodGhpcy4jY29udGFpbmVyKS5kaXJlY3Rpb24pO1xuICB9XG4gIGdldCBoaWdobGlnaHRDb2xvcnMoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImhpZ2hsaWdodENvbG9yc1wiLCB0aGlzLiNoaWdobGlnaHRDb2xvcnMgPyBuZXcgTWFwKHRoaXMuI2hpZ2hsaWdodENvbG9ycy5zcGxpdChcIixcIikubWFwKHBhaXIgPT4gcGFpci5zcGxpdChcIj1cIikubWFwKHggPT4geC50cmltKCkpKSkgOiBudWxsKTtcbiAgfVxuICBnZXQgaGlnaGxpZ2h0Q29sb3JOYW1lcygpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaGlnaGxpZ2h0Q29sb3JOYW1lc1wiLCB0aGlzLmhpZ2hsaWdodENvbG9ycyA/IG5ldyBNYXAoQXJyYXkuZnJvbSh0aGlzLmhpZ2hsaWdodENvbG9ycywgZSA9PiBlLnJldmVyc2UoKSkpIDogbnVsbCk7XG4gIH1cbiAgc2V0TWFpbkhpZ2hsaWdodENvbG9yUGlja2VyKGNvbG9yUGlja2VyKSB7XG4gICAgdGhpcy4jbWFpbkhpZ2hsaWdodENvbG9yUGlja2VyID0gY29sb3JQaWNrZXI7XG4gIH1cbiAgZWRpdEFsdFRleHQoZWRpdG9yKSB7XG4gICAgdGhpcy4jYWx0VGV4dE1hbmFnZXI/LmVkaXRBbHRUZXh0KHRoaXMsIGVkaXRvcik7XG4gIH1cbiAgb25QYWdlQ2hhbmdpbmcoe1xuICAgIHBhZ2VOdW1iZXJcbiAgfSkge1xuICAgIHRoaXMuI2N1cnJlbnRQYWdlSW5kZXggPSBwYWdlTnVtYmVyIC0gMTtcbiAgfVxuICBmb2N1c01haW5Db250YWluZXIoKSB7XG4gICAgdGhpcy4jY29udGFpbmVyLmZvY3VzKCk7XG4gIH1cbiAgZmluZFBhcmVudCh4LCB5KSB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeDogbGF5ZXJYLFxuICAgICAgICB5OiBsYXllclksXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0gPSBsYXllci5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoeCA+PSBsYXllclggJiYgeCA8PSBsYXllclggKyB3aWR0aCAmJiB5ID49IGxheWVyWSAmJiB5IDw9IGxheWVyWSArIGhlaWdodCkge1xuICAgICAgICByZXR1cm4gbGF5ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGRpc2FibGVVc2VyU2VsZWN0KHZhbHVlID0gZmFsc2UpIHtcbiAgICB0aGlzLiN2aWV3ZXIuY2xhc3NMaXN0LnRvZ2dsZShcIm5vVXNlclNlbGVjdFwiLCB2YWx1ZSk7XG4gIH1cbiAgYWRkU2hvdWxkUmVzY2FsZShlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3JzVG9SZXNjYWxlLmFkZChlZGl0b3IpO1xuICB9XG4gIHJlbW92ZVNob3VsZFJlc2NhbGUoZWRpdG9yKSB7XG4gICAgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZS5kZWxldGUoZWRpdG9yKTtcbiAgfVxuICBvblNjYWxlQ2hhbmdpbmcoe1xuICAgIHNjYWxlXG4gIH0pIHtcbiAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgdGhpcy52aWV3UGFyYW1ldGVycy5yZWFsU2NhbGUgPSBzY2FsZSAqIFBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUztcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzVG9SZXNjYWxlKSB7XG4gICAgICBlZGl0b3Iub25TY2FsZUNoYW5naW5nKCk7XG4gICAgfVxuICB9XG4gIG9uUm90YXRpb25DaGFuZ2luZyh7XG4gICAgcGFnZXNSb3RhdGlvblxuICB9KSB7XG4gICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuICAgIHRoaXMudmlld1BhcmFtZXRlcnMucm90YXRpb24gPSBwYWdlc1JvdGF0aW9uO1xuICB9XG4gICNnZXRBbmNob3JFbGVtZW50Rm9yU2VsZWN0aW9uKHtcbiAgICBhbmNob3JOb2RlXG4gIH0pIHtcbiAgICByZXR1cm4gYW5jaG9yTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgPyBhbmNob3JOb2RlLnBhcmVudEVsZW1lbnQgOiBhbmNob3JOb2RlO1xuICB9XG4gIGhpZ2hsaWdodFNlbGVjdGlvbihtZXRob2RPZkNyZWF0aW9uID0gXCJcIikge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBhbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXRcbiAgICB9ID0gc2VsZWN0aW9uO1xuICAgIGNvbnN0IHRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcbiAgICBjb25zdCBhbmNob3JFbGVtZW50ID0gdGhpcy4jZ2V0QW5jaG9yRWxlbWVudEZvclNlbGVjdGlvbihzZWxlY3Rpb24pO1xuICAgIGNvbnN0IHRleHRMYXllciA9IGFuY2hvckVsZW1lbnQuY2xvc2VzdChcIi50ZXh0TGF5ZXJcIik7XG4gICAgY29uc3QgYm94ZXMgPSB0aGlzLmdldFNlbGVjdGlvbkJveGVzKHRleHRMYXllcik7XG4gICAgaWYgKCFib3hlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWxlY3Rpb24uZW1wdHkoKTtcbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJzaG93YW5ub3RhdGlvbmVkaXRvcnVpXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBtb2RlOiBBbm5vdGF0aW9uRWRpdG9yVHlwZS5ISUdITElHSFRcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zaG93QWxsRWRpdG9ycyhcImhpZ2hsaWdodFwiLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChsYXllci5oYXNUZXh0TGF5ZXIodGV4dExheWVyKSkge1xuICAgICAgICBsYXllci5jcmVhdGVBbmRBZGROZXdFZGl0b3Ioe1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9LCBmYWxzZSwge1xuICAgICAgICAgIG1ldGhvZE9mQ3JlYXRpb24sXG4gICAgICAgICAgYm94ZXMsXG4gICAgICAgICAgYW5jaG9yTm9kZSxcbiAgICAgICAgICBhbmNob3JPZmZzZXQsXG4gICAgICAgICAgZm9jdXNOb2RlLFxuICAgICAgICAgIGZvY3VzT2Zmc2V0LFxuICAgICAgICAgIHRleHRcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAjZGlzcGxheUhpZ2hsaWdodFRvb2xiYXIoKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLmlzQ29sbGFwc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFuY2hvckVsZW1lbnQgPSB0aGlzLiNnZXRBbmNob3JFbGVtZW50Rm9yU2VsZWN0aW9uKHNlbGVjdGlvbik7XG4gICAgY29uc3QgdGV4dExheWVyID0gYW5jaG9yRWxlbWVudC5jbG9zZXN0KFwiLnRleHRMYXllclwiKTtcbiAgICBjb25zdCBib3hlcyA9IHRoaXMuZ2V0U2VsZWN0aW9uQm94ZXModGV4dExheWVyKTtcbiAgICBpZiAoIWJveGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2hpZ2hsaWdodFRvb2xiYXIgfHw9IG5ldyBIaWdobGlnaHRUb29sYmFyKHRoaXMpO1xuICAgIHRoaXMuI2hpZ2hsaWdodFRvb2xiYXIuc2hvdyh0ZXh0TGF5ZXIsIGJveGVzLCB0aGlzLmRpcmVjdGlvbiA9PT0gXCJsdHJcIik7XG4gIH1cbiAgYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZShlZGl0b3IpIHtcbiAgICBpZiAoIWVkaXRvci5pc0VtcHR5KCkgJiYgdGhpcy4jYW5ub3RhdGlvblN0b3JhZ2UgJiYgIXRoaXMuI2Fubm90YXRpb25TdG9yYWdlLmhhcyhlZGl0b3IuaWQpKSB7XG4gICAgICB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZShlZGl0b3IuaWQsIGVkaXRvcik7XG4gICAgfVxuICB9XG4gICNzZWxlY3Rpb25DaGFuZ2UoKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLmlzQ29sbGFwc2VkKSB7XG4gICAgICBpZiAodGhpcy4jc2VsZWN0ZWRUZXh0Tm9kZSkge1xuICAgICAgICB0aGlzLiNoaWdobGlnaHRUb29sYmFyPy5oaWRlKCk7XG4gICAgICAgIHRoaXMuI3NlbGVjdGVkVGV4dE5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICAgICAgaGFzU2VsZWN0ZWRUZXh0OiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYW5jaG9yTm9kZVxuICAgIH0gPSBzZWxlY3Rpb247XG4gICAgaWYgKGFuY2hvck5vZGUgPT09IHRoaXMuI3NlbGVjdGVkVGV4dE5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYW5jaG9yRWxlbWVudCA9IHRoaXMuI2dldEFuY2hvckVsZW1lbnRGb3JTZWxlY3Rpb24oc2VsZWN0aW9uKTtcbiAgICBjb25zdCB0ZXh0TGF5ZXIgPSBhbmNob3JFbGVtZW50LmNsb3Nlc3QoXCIudGV4dExheWVyXCIpO1xuICAgIGlmICghdGV4dExheWVyKSB7XG4gICAgICBpZiAodGhpcy4jc2VsZWN0ZWRUZXh0Tm9kZSkge1xuICAgICAgICB0aGlzLiNoaWdobGlnaHRUb29sYmFyPy5oaWRlKCk7XG4gICAgICAgIHRoaXMuI3NlbGVjdGVkVGV4dE5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICAgICAgaGFzU2VsZWN0ZWRUZXh0OiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaGlnaGxpZ2h0VG9vbGJhcj8uaGlkZSgpO1xuICAgIHRoaXMuI3NlbGVjdGVkVGV4dE5vZGUgPSBhbmNob3JOb2RlO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NlbGVjdGVkVGV4dDogdHJ1ZVxuICAgIH0pO1xuICAgIGlmICh0aGlzLiNtb2RlICE9PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5ISUdITElHSFQgJiYgdGhpcy4jbW9kZSAhPT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUKSB7XG4gICAgICB0aGlzLnNob3dBbGxFZGl0b3JzKFwiaGlnaGxpZ2h0XCIsIHRydWUsIHRydWUpO1xuICAgIH1cbiAgICB0aGlzLiNoaWdobGlnaHRXaGVuU2hpZnRVcCA9IHRoaXMuaXNTaGlmdEtleURvd247XG4gICAgaWYgKCF0aGlzLmlzU2hpZnRLZXlEb3duKSB7XG4gICAgICBjb25zdCBzaWduYWwgPSB0aGlzLl9zaWduYWw7XG4gICAgICBjb25zdCBwb2ludGVydXAgPSBlID0+IHtcbiAgICAgICAgaWYgKGUudHlwZSA9PT0gXCJwb2ludGVydXBcIiAmJiBlLmJ1dHRvbiAhPT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBwb2ludGVydXApO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgcG9pbnRlcnVwKTtcbiAgICAgICAgaWYgKGUudHlwZSA9PT0gXCJwb2ludGVydXBcIikge1xuICAgICAgICAgIHRoaXMuI29uU2VsZWN0RW5kKFwibWFpbl90b29sYmFyXCIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlcnVwLCB7XG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgcG9pbnRlcnVwLCB7XG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gICNvblNlbGVjdEVuZChtZXRob2RPZkNyZWF0aW9uID0gXCJcIikge1xuICAgIGlmICh0aGlzLiNtb2RlID09PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5ISUdITElHSFQpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0U2VsZWN0aW9uKG1ldGhvZE9mQ3JlYXRpb24pO1xuICAgIH0gZWxzZSBpZiAodGhpcy4jZW5hYmxlSGlnaGxpZ2h0RmxvYXRpbmdCdXR0b24pIHtcbiAgICAgIHRoaXMuI2Rpc3BsYXlIaWdobGlnaHRUb29sYmFyKCk7XG4gICAgfVxuICB9XG4gICNhZGRTZWxlY3Rpb25MaXN0ZW5lcigpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHRoaXMuI3NlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX3NpZ25hbFxuICAgIH0pO1xuICB9XG4gICNhZGRGb2N1c01hbmFnZXIoKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fc2lnbmFsO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy4jYm91bmRGb2N1cywge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI2JvdW5kQmx1ciwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgI3JlbW92ZUZvY3VzTWFuYWdlcigpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI2JvdW5kRm9jdXMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNib3VuZEJsdXIpO1xuICB9XG4gIGJsdXIoKSB7XG4gICAgdGhpcy5pc1NoaWZ0S2V5RG93biA9IGZhbHNlO1xuICAgIGlmICh0aGlzLiNoaWdobGlnaHRXaGVuU2hpZnRVcCkge1xuICAgICAgdGhpcy4jaGlnaGxpZ2h0V2hlblNoaWZ0VXAgPSBmYWxzZTtcbiAgICAgIHRoaXMuI29uU2VsZWN0RW5kKFwibWFpbl90b29sYmFyXCIpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFjdGl2ZUVsZW1lbnRcbiAgICB9ID0gZG9jdW1lbnQ7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICBpZiAoZWRpdG9yLmRpdi5jb250YWlucyhhY3RpdmVFbGVtZW50KSkge1xuICAgICAgICB0aGlzLiNsYXN0QWN0aXZlRWxlbWVudCA9IFtlZGl0b3IsIGFjdGl2ZUVsZW1lbnRdO1xuICAgICAgICBlZGl0b3IuX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9jdXMoKSB7XG4gICAgaWYgKCF0aGlzLiNsYXN0QWN0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbbGFzdEVkaXRvciwgbGFzdEFjdGl2ZUVsZW1lbnRdID0gdGhpcy4jbGFzdEFjdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy4jbGFzdEFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAgIGxhc3RBY3RpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsICgpID0+IHtcbiAgICAgIGxhc3RFZGl0b3IuX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IHRydWU7XG4gICAgfSwge1xuICAgICAgb25jZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fc2lnbmFsXG4gICAgfSk7XG4gICAgbGFzdEFjdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuICAjYWRkS2V5Ym9hcmRNYW5hZ2VyKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3NpZ25hbDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlkb3duLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHRoaXMuI2JvdW5kS2V5dXAsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gICNyZW1vdmVLZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5ZG93bik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCB0aGlzLiNib3VuZEtleXVwKTtcbiAgfVxuICAjYWRkQ29weVBhc3RlTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3NpZ25hbDtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29weVwiLCB0aGlzLiNib3VuZENvcHksIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjdXRcIiwgdGhpcy4jYm91bmRDdXQsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCB0aGlzLiNib3VuZFBhc3RlLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICAjcmVtb3ZlQ29weVBhc3RlTGlzdGVuZXJzKCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb3B5XCIsIHRoaXMuI2JvdW5kQ29weSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImN1dFwiLCB0aGlzLiNib3VuZEN1dCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBhc3RlXCIsIHRoaXMuI2JvdW5kUGFzdGUpO1xuICB9XG4gICNhZGREcmFnQW5kRHJvcExpc3RlbmVycygpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl9zaWduYWw7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIHRoaXMuZHJhZ092ZXIuYmluZCh0aGlzKSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImRyb3BcIiwgdGhpcy5kcm9wLmJpbmQodGhpcyksIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gIGFkZEVkaXRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy4jYWRkS2V5Ym9hcmRNYW5hZ2VyKCk7XG4gICAgdGhpcy4jYWRkQ29weVBhc3RlTGlzdGVuZXJzKCk7XG4gIH1cbiAgcmVtb3ZlRWRpdExpc3RlbmVycygpIHtcbiAgICB0aGlzLiNyZW1vdmVLZXlib2FyZE1hbmFnZXIoKTtcbiAgICB0aGlzLiNyZW1vdmVDb3B5UGFzdGVMaXN0ZW5lcnMoKTtcbiAgfVxuICBkcmFnT3ZlcihldmVudCkge1xuICAgIGZvciAoY29uc3Qge1xuICAgICAgdHlwZVxuICAgIH0gb2YgZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zKSB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgdGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgICAgaWYgKGVkaXRvclR5cGUuaXNIYW5kbGluZ01pbWVGb3JQYXN0aW5nKHR5cGUpKSB7XG4gICAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcImNvcHlcIjtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBkcm9wKGV2ZW50KSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIHRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICAgIGlmIChlZGl0b3JUeXBlLmlzSGFuZGxpbmdNaW1lRm9yUGFzdGluZyhpdGVtLnR5cGUpKSB7XG4gICAgICAgICAgZWRpdG9yVHlwZS5wYXN0ZShpdGVtLCB0aGlzLmN1cnJlbnRMYXllcik7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29weShldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy4jYWN0aXZlRWRpdG9yPy5jb21taXRPclJlbW92ZSgpO1xuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWRpdG9ycyA9IFtdO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IGVkaXRvci5zZXJpYWxpemUodHJ1ZSk7XG4gICAgICBpZiAoc2VyaWFsaXplZCkge1xuICAgICAgICBlZGl0b3JzLnB1c2goc2VyaWFsaXplZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlZGl0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJhcHBsaWNhdGlvbi9wZGZqc1wiLCBKU09OLnN0cmluZ2lmeShlZGl0b3JzKSk7XG4gIH1cbiAgY3V0KGV2ZW50KSB7XG4gICAgdGhpcy5jb3B5KGV2ZW50KTtcbiAgICB0aGlzLmRlbGV0ZSgpO1xuICB9XG4gIHBhc3RlKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB7XG4gICAgICBjbGlwYm9hcmREYXRhXG4gICAgfSA9IGV2ZW50O1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBjbGlwYm9hcmREYXRhLml0ZW1zKSB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgdGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgICAgaWYgKGVkaXRvclR5cGUuaXNIYW5kbGluZ01pbWVGb3JQYXN0aW5nKGl0ZW0udHlwZSkpIHtcbiAgICAgICAgICBlZGl0b3JUeXBlLnBhc3RlKGl0ZW0sIHRoaXMuY3VycmVudExheWVyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGRhdGEgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJhcHBsaWNhdGlvbi9wZGZqc1wiKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB3YXJuKGBwYXN0ZTogXCIke2V4Lm1lc3NhZ2V9XCIuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmN1cnJlbnRMYXllcjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbmV3RWRpdG9ycyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZGF0YSkge1xuICAgICAgICBjb25zdCBkZXNlcmlhbGl6ZWRFZGl0b3IgPSBsYXllci5kZXNlcmlhbGl6ZShlZGl0b3IpO1xuICAgICAgICBpZiAoIWRlc2VyaWFsaXplZEVkaXRvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBuZXdFZGl0b3JzLnB1c2goZGVzZXJpYWxpemVkRWRpdG9yKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNtZCA9ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgbmV3RWRpdG9ycykge1xuICAgICAgICAgIHRoaXMuI2FkZEVkaXRvclRvTGF5ZXIoZWRpdG9yKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzZWxlY3RFZGl0b3JzKG5ld0VkaXRvcnMpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHVuZG8gPSAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIG5ld0VkaXRvcnMpIHtcbiAgICAgICAgICBlZGl0b3IucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgY21kLFxuICAgICAgICB1bmRvLFxuICAgICAgICBtdXN0RXhlYzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHdhcm4oYHBhc3RlOiBcIiR7ZXgubWVzc2FnZX1cIi5gKTtcbiAgICB9XG4gIH1cbiAga2V5ZG93bihldmVudCkge1xuICAgIGlmICghdGhpcy5pc1NoaWZ0S2V5RG93biAmJiBldmVudC5rZXkgPT09IFwiU2hpZnRcIikge1xuICAgICAgdGhpcy5pc1NoaWZ0S2V5RG93biA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLiNtb2RlICE9PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FICYmICF0aGlzLmlzRWRpdG9ySGFuZGxpbmdLZXlib2FyZCkge1xuICAgICAgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5fa2V5Ym9hcmRNYW5hZ2VyLmV4ZWModGhpcywgZXZlbnQpO1xuICAgIH1cbiAgfVxuICBrZXl1cChldmVudCkge1xuICAgIGlmICh0aGlzLmlzU2hpZnRLZXlEb3duICYmIGV2ZW50LmtleSA9PT0gXCJTaGlmdFwiKSB7XG4gICAgICB0aGlzLmlzU2hpZnRLZXlEb3duID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy4jaGlnaGxpZ2h0V2hlblNoaWZ0VXApIHtcbiAgICAgICAgdGhpcy4jaGlnaGxpZ2h0V2hlblNoaWZ0VXAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jb25TZWxlY3RFbmQoXCJtYWluX3Rvb2xiYXJcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG9uRWRpdGluZ0FjdGlvbih7XG4gICAgbmFtZVxuICB9KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlIFwidW5kb1wiOlxuICAgICAgY2FzZSBcInJlZG9cIjpcbiAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgIGNhc2UgXCJzZWxlY3RBbGxcIjpcbiAgICAgICAgdGhpc1tuYW1lXSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJoaWdobGlnaHRTZWxlY3Rpb25cIjpcbiAgICAgICAgdGhpcy5oaWdobGlnaHRTZWxlY3Rpb24oXCJjb250ZXh0X21lbnVcIik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAjZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoZGV0YWlscykge1xuICAgIGNvbnN0IGhhc0NoYW5nZWQgPSBPYmplY3QuZW50cmllcyhkZXRhaWxzKS5zb21lKChba2V5LCB2YWx1ZV0pID0+IHRoaXMuI3ByZXZpb3VzU3RhdGVzW2tleV0gIT09IHZhbHVlKTtcbiAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9yc3RhdGVzY2hhbmdlZFwiLCB7XG4gICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgZGV0YWlsczogT2JqZWN0LmFzc2lnbih0aGlzLiNwcmV2aW91c1N0YXRlcywgZGV0YWlscylcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuI21vZGUgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVCAmJiBkZXRhaWxzLmhhc1NlbGVjdGVkRWRpdG9yID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKFtbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0ZSRUUsIHRydWVdXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gICNkaXNwYXRjaFVwZGF0ZVVJKGRldGFpbHMpIHtcbiAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaChcImFubm90YXRpb25lZGl0b3JwYXJhbXNjaGFuZ2VkXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIGRldGFpbHNcbiAgICB9KTtcbiAgfVxuICBzZXRFZGl0aW5nU3RhdGUoaXNFZGl0aW5nKSB7XG4gICAgaWYgKGlzRWRpdGluZykge1xuICAgICAgdGhpcy4jYWRkRm9jdXNNYW5hZ2VyKCk7XG4gICAgICB0aGlzLiNhZGRDb3B5UGFzdGVMaXN0ZW5lcnMoKTtcbiAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgICAgaXNFZGl0aW5nOiB0aGlzLiNtb2RlICE9PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FLFxuICAgICAgICBpc0VtcHR5OiB0aGlzLiNpc0VtcHR5KCksXG4gICAgICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogdGhpcy4jY29tbWFuZE1hbmFnZXIuaGFzU29tZXRoaW5nVG9VbmRvKCksXG4gICAgICAgIGhhc1NvbWV0aGluZ1RvUmVkbzogdGhpcy4jY29tbWFuZE1hbmFnZXIuaGFzU29tZXRoaW5nVG9SZWRvKCksXG4gICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI3JlbW92ZUZvY3VzTWFuYWdlcigpO1xuICAgICAgdGhpcy4jcmVtb3ZlQ29weVBhc3RlTGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICAgIGlzRWRpdGluZzogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kaXNhYmxlVXNlclNlbGVjdChmYWxzZSk7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyRWRpdG9yVHlwZXModHlwZXMpIHtcbiAgICBpZiAodGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jZWRpdG9yVHlwZXMgPSB0eXBlcztcbiAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgdGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoZWRpdG9yVHlwZS5kZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKTtcbiAgICB9XG4gIH1cbiAgZ2V0SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lkTWFuYWdlci5pZDtcbiAgfVxuICBnZXQgY3VycmVudExheWVyKCkge1xuICAgIHJldHVybiB0aGlzLiNhbGxMYXllcnMuZ2V0KHRoaXMuI2N1cnJlbnRQYWdlSW5kZXgpO1xuICB9XG4gIGdldExheWVyKHBhZ2VJbmRleCkge1xuICAgIHJldHVybiB0aGlzLiNhbGxMYXllcnMuZ2V0KHBhZ2VJbmRleCk7XG4gIH1cbiAgZ2V0IGN1cnJlbnRQYWdlSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRQYWdlSW5kZXg7XG4gIH1cbiAgYWRkTGF5ZXIobGF5ZXIpIHtcbiAgICB0aGlzLiNhbGxMYXllcnMuc2V0KGxheWVyLnBhZ2VJbmRleCwgbGF5ZXIpO1xuICAgIGlmICh0aGlzLiNpc0VuYWJsZWQpIHtcbiAgICAgIGxheWVyLmVuYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXllci5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG4gIHJlbW92ZUxheWVyKGxheWVyKSB7XG4gICAgdGhpcy4jYWxsTGF5ZXJzLmRlbGV0ZShsYXllci5wYWdlSW5kZXgpO1xuICB9XG4gIHVwZGF0ZU1vZGUobW9kZSwgZWRpdElkID0gbnVsbCwgaXNGcm9tS2V5Ym9hcmQgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLiNtb2RlID09PSBtb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI21vZGUgPSBtb2RlO1xuICAgIGlmIChtb2RlID09PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FKSB7XG4gICAgICB0aGlzLnNldEVkaXRpbmdTdGF0ZShmYWxzZSk7XG4gICAgICB0aGlzLiNkaXNhYmxlQWxsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0RWRpdGluZ1N0YXRlKHRydWUpO1xuICAgIHRoaXMuI2VuYWJsZUFsbCgpO1xuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuICAgICAgbGF5ZXIudXBkYXRlTW9kZShtb2RlKTtcbiAgICB9XG4gICAgaWYgKCFlZGl0SWQgJiYgaXNGcm9tS2V5Ym9hcmQpIHtcbiAgICAgIHRoaXMuYWRkTmV3RWRpdG9yRnJvbUtleWJvYXJkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZWRpdElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCA9PT0gZWRpdElkKSB7XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQoZWRpdG9yKTtcbiAgICAgICAgZWRpdG9yLmVudGVySW5FZGl0TW9kZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgYWRkTmV3RWRpdG9yRnJvbUtleWJvYXJkKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRMYXllci5jYW5DcmVhdGVOZXdFbXB0eUVkaXRvcigpKSB7XG4gICAgICB0aGlzLmN1cnJlbnRMYXllci5hZGROZXdFZGl0b3IoKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlVG9vbGJhcihtb2RlKSB7XG4gICAgaWYgKG1vZGUgPT09IHRoaXMuI21vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJzd2l0Y2hhbm5vdGF0aW9uZWRpdG9ybW9kZVwiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBtb2RlXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKCF0aGlzLiNlZGl0b3JUeXBlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuQ1JFQVRFOlxuICAgICAgICB0aGlzLmN1cnJlbnRMYXllci5hZGROZXdFZGl0b3IoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfREVGQVVMVF9DT0xPUjpcbiAgICAgICAgdGhpcy4jbWFpbkhpZ2hsaWdodENvbG9yUGlja2VyPy51cGRhdGVDb2xvcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfU0hPV19BTEw6XG4gICAgICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKFwicmVwb3J0dGVsZW1ldHJ5XCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgdHlwZTogXCJlZGl0aW5nXCIsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwiaGlnaGxpZ2h0XCIsXG4gICAgICAgICAgICAgIGFjdGlvbjogXCJ0b2dnbGVfdmlzaWJpbGl0eVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgKHRoaXMuI3Nob3dBbGxTdGF0ZXMgfHw9IG5ldyBNYXAoKSkuc2V0KHR5cGUsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5zaG93QWxsRWRpdG9ycyhcImhpZ2hsaWdodFwiLCB2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGVkaXRvci51cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgdGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgIGVkaXRvclR5cGUudXBkYXRlRGVmYXVsdFBhcmFtcyh0eXBlLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHNob3dBbGxFZGl0b3JzKHR5cGUsIHZpc2libGUsIHVwZGF0ZUJ1dHRvbiA9IGZhbHNlKSB7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jYWxsRWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVkaXRvci5lZGl0b3JUeXBlID09PSB0eXBlKSB7XG4gICAgICAgIGVkaXRvci5zaG93KHZpc2libGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuI3Nob3dBbGxTdGF0ZXM/LmdldChBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfU0hPV19BTEwpID8/IHRydWU7XG4gICAgaWYgKHN0YXRlICE9PSB2aXNpYmxlKSB7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKFtbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX1NIT1dfQUxMLCB2aXNpYmxlXV0pO1xuICAgIH1cbiAgfVxuICBlbmFibGVXYWl0aW5nKG11c3RXYWl0ID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy4jaXNXYWl0aW5nID09PSBtdXN0V2FpdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNpc1dhaXRpbmcgPSBtdXN0V2FpdDtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKG11c3RXYWl0KSB7XG4gICAgICAgIGxheWVyLmRpc2FibGVDbGljaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGF5ZXIuZW5hYmxlQ2xpY2soKTtcbiAgICAgIH1cbiAgICAgIGxheWVyLmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwid2FpdGluZ1wiLCBtdXN0V2FpdCk7XG4gICAgfVxuICB9XG4gICNlbmFibGVBbGwoKSB7XG4gICAgaWYgKCF0aGlzLiNpc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuI2lzRW5hYmxlZCA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuICAgICAgICBsYXllci5lbmFibGUoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgICAgZWRpdG9yLmVuYWJsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAjZGlzYWJsZUFsbCgpIHtcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XG4gICAgaWYgKHRoaXMuI2lzRW5hYmxlZCkge1xuICAgICAgdGhpcy4jaXNFbmFibGVkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuICAgICAgICBsYXllci5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICAgIGVkaXRvci5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldEVkaXRvcnMocGFnZUluZGV4KSB7XG4gICAgY29uc3QgZWRpdG9ycyA9IFtdO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChlZGl0b3IucGFnZUluZGV4ID09PSBwYWdlSW5kZXgpIHtcbiAgICAgICAgZWRpdG9ycy5wdXNoKGVkaXRvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlZGl0b3JzO1xuICB9XG4gIGdldEVkaXRvcihpZCkge1xuICAgIHJldHVybiB0aGlzLiNhbGxFZGl0b3JzLmdldChpZCk7XG4gIH1cbiAgYWRkRWRpdG9yKGVkaXRvcikge1xuICAgIHRoaXMuI2FsbEVkaXRvcnMuc2V0KGVkaXRvci5pZCwgZWRpdG9yKTtcbiAgfVxuICByZW1vdmVFZGl0b3IoZWRpdG9yKSB7XG4gICAgaWYgKGVkaXRvci5kaXYuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIGlmICh0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2ZvY3VzTWFpbkNvbnRhaW5lclRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgICB0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5mb2N1c01haW5Db250YWluZXIoKTtcbiAgICAgICAgdGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkID0gbnVsbDtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgICB0aGlzLiNhbGxFZGl0b3JzLmRlbGV0ZShlZGl0b3IuaWQpO1xuICAgIHRoaXMudW5zZWxlY3QoZWRpdG9yKTtcbiAgICBpZiAoIWVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkIHx8ICF0aGlzLiNkZWxldGVkQW5ub3RhdGlvbnNFbGVtZW50SWRzLmhhcyhlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCkpIHtcbiAgICAgIHRoaXMuI2Fubm90YXRpb25TdG9yYWdlPy5yZW1vdmUoZWRpdG9yLmlkKTtcbiAgICB9XG4gIH1cbiAgYWRkRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRvcikge1xuICAgIHRoaXMuI2RlbGV0ZWRBbm5vdGF0aW9uc0VsZW1lbnRJZHMuYWRkKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICB0aGlzLmFkZENoYW5nZWRFeGlzdGluZ0Fubm90YXRpb24oZWRpdG9yKTtcbiAgICBlZGl0b3IuZGVsZXRlZCA9IHRydWU7XG4gIH1cbiAgaXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgIHJldHVybiB0aGlzLiNkZWxldGVkQW5ub3RhdGlvbnNFbGVtZW50SWRzLmhhcyhhbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgfVxuICByZW1vdmVEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZWRpdG9yKSB7XG4gICAgdGhpcy4jZGVsZXRlZEFubm90YXRpb25zRWxlbWVudElkcy5kZWxldGUoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpO1xuICAgIHRoaXMucmVtb3ZlQ2hhbmdlZEV4aXN0aW5nQW5ub3RhdGlvbihlZGl0b3IpO1xuICAgIGVkaXRvci5kZWxldGVkID0gZmFsc2U7XG4gIH1cbiAgI2FkZEVkaXRvclRvTGF5ZXIoZWRpdG9yKSB7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLiNhbGxMYXllcnMuZ2V0KGVkaXRvci5wYWdlSW5kZXgpO1xuICAgIGlmIChsYXllcikge1xuICAgICAgbGF5ZXIuYWRkT3JSZWJ1aWxkKGVkaXRvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRWRpdG9yKGVkaXRvcik7XG4gICAgICB0aGlzLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgc2V0QWN0aXZlRWRpdG9yKGVkaXRvcikge1xuICAgIGlmICh0aGlzLiNhY3RpdmVFZGl0b3IgPT09IGVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhY3RpdmVFZGl0b3IgPSBlZGl0b3I7XG4gICAgaWYgKGVkaXRvcikge1xuICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3IucHJvcGVydGllc1RvVXBkYXRlKTtcbiAgICB9XG4gIH1cbiAgZ2V0ICNsYXN0U2VsZWN0ZWRFZGl0b3IoKSB7XG4gICAgbGV0IGVkID0gbnVsbDtcbiAgICBmb3IgKGVkIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge31cbiAgICByZXR1cm4gZWQ7XG4gIH1cbiAgdXBkYXRlVUkoZWRpdG9yKSB7XG4gICAgaWYgKHRoaXMuI2xhc3RTZWxlY3RlZEVkaXRvciA9PT0gZWRpdG9yKSB7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKGVkaXRvci5wcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgIH1cbiAgfVxuICB0b2dnbGVTZWxlY3RlZChlZGl0b3IpIHtcbiAgICBpZiAodGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmhhcyhlZGl0b3IpKSB7XG4gICAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuZGVsZXRlKGVkaXRvcik7XG4gICAgICBlZGl0b3IudW5zZWxlY3QoKTtcbiAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRoaXMuaGFzU2VsZWN0aW9uXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmFkZChlZGl0b3IpO1xuICAgIGVkaXRvci5zZWxlY3QoKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKGVkaXRvci5wcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgc2V0U2VsZWN0ZWQoZWRpdG9yKSB7XG4gICAgZm9yIChjb25zdCBlZCBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGlmIChlZCAhPT0gZWRpdG9yKSB7XG4gICAgICAgIGVkLnVuc2VsZWN0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5jbGVhcigpO1xuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5hZGQoZWRpdG9yKTtcbiAgICBlZGl0b3Iuc2VsZWN0KCk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3IucHJvcGVydGllc1RvVXBkYXRlKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTZWxlY3RlZEVkaXRvcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIGlzU2VsZWN0ZWQoZWRpdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5oYXMoZWRpdG9yKTtcbiAgfVxuICBnZXQgZmlyc3RTZWxlY3RlZEVkaXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgfVxuICB1bnNlbGVjdChlZGl0b3IpIHtcbiAgICBlZGl0b3IudW5zZWxlY3QoKTtcbiAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuZGVsZXRlKGVkaXRvcik7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRoaXMuaGFzU2VsZWN0aW9uXG4gICAgfSk7XG4gIH1cbiAgZ2V0IGhhc1NlbGVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLnNpemUgIT09IDA7XG4gIH1cbiAgZ2V0IGlzRW50ZXJIYW5kbGVkKCkge1xuICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuc2l6ZSA9PT0gMSAmJiB0aGlzLmZpcnN0U2VsZWN0ZWRFZGl0b3IuaXNFbnRlckhhbmRsZWQ7XG4gIH1cbiAgdW5kbygpIHtcbiAgICB0aGlzLiNjb21tYW5kTWFuYWdlci51bmRvKCk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiB0aGlzLiNjb21tYW5kTWFuYWdlci5oYXNTb21ldGhpbmdUb1VuZG8oKSxcbiAgICAgIGhhc1NvbWV0aGluZ1RvUmVkbzogdHJ1ZSxcbiAgICAgIGlzRW1wdHk6IHRoaXMuI2lzRW1wdHkoKVxuICAgIH0pO1xuICB9XG4gIHJlZG8oKSB7XG4gICAgdGhpcy4jY29tbWFuZE1hbmFnZXIucmVkbygpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogdHJ1ZSxcbiAgICAgIGhhc1NvbWV0aGluZ1RvUmVkbzogdGhpcy4jY29tbWFuZE1hbmFnZXIuaGFzU29tZXRoaW5nVG9SZWRvKCksXG4gICAgICBpc0VtcHR5OiB0aGlzLiNpc0VtcHR5KClcbiAgICB9KTtcbiAgfVxuICBhZGRDb21tYW5kcyhwYXJhbXMpIHtcbiAgICB0aGlzLiNjb21tYW5kTWFuYWdlci5hZGQocGFyYW1zKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTb21ldGhpbmdUb1VuZG86IHRydWUsXG4gICAgICBoYXNTb21ldGhpbmdUb1JlZG86IGZhbHNlLFxuICAgICAgaXNFbXB0eTogdGhpcy4jaXNFbXB0eSgpXG4gICAgfSk7XG4gIH1cbiAgI2lzRW1wdHkoKSB7XG4gICAgaWYgKHRoaXMuI2FsbEVkaXRvcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLiNhbGxFZGl0b3JzLnNpemUgPT09IDEpIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRvci5pc0VtcHR5KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBkZWxldGUoKSB7XG4gICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWRpdG9ycyA9IFsuLi50aGlzLiNzZWxlY3RlZEVkaXRvcnNdO1xuICAgIGNvbnN0IGNtZCA9ICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcbiAgICAgICAgZWRpdG9yLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgdW5kbyA9ICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcbiAgICAgICAgdGhpcy4jYWRkRWRpdG9yVG9MYXllcihlZGl0b3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQsXG4gICAgICB1bmRvLFxuICAgICAgbXVzdEV4ZWM6IHRydWVcbiAgICB9KTtcbiAgfVxuICBjb21taXRPclJlbW92ZSgpIHtcbiAgICB0aGlzLiNhY3RpdmVFZGl0b3I/LmNvbW1pdE9yUmVtb3ZlKCk7XG4gIH1cbiAgaGFzU29tZXRoaW5nVG9Db250cm9sKCkge1xuICAgIHJldHVybiB0aGlzLiNhY3RpdmVFZGl0b3IgfHwgdGhpcy5oYXNTZWxlY3Rpb247XG4gIH1cbiAgI3NlbGVjdEVkaXRvcnMoZWRpdG9ycykge1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgZWRpdG9yLnVuc2VsZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcbiAgICAgIGlmIChlZGl0b3IuaXNFbXB0eSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmFkZChlZGl0b3IpO1xuICAgICAgZWRpdG9yLnNlbGVjdCgpO1xuICAgIH1cbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTZWxlY3RlZEVkaXRvcjogdGhpcy5oYXNTZWxlY3Rpb25cbiAgICB9KTtcbiAgfVxuICBzZWxlY3RBbGwoKSB7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICBlZGl0b3IuY29tbWl0KCk7XG4gICAgfVxuICAgIHRoaXMuI3NlbGVjdEVkaXRvcnModGhpcy4jYWxsRWRpdG9ycy52YWx1ZXMoKSk7XG4gIH1cbiAgdW5zZWxlY3RBbGwoKSB7XG4gICAgaWYgKHRoaXMuI2FjdGl2ZUVkaXRvcikge1xuICAgICAgdGhpcy4jYWN0aXZlRWRpdG9yLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICBpZiAodGhpcy4jbW9kZSAhPT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICBlZGl0b3IudW5zZWxlY3QoKTtcbiAgICB9XG4gICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmNsZWFyKCk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IGZhbHNlXG4gICAgfSk7XG4gIH1cbiAgdHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzKHgsIHksIG5vQ29tbWl0ID0gZmFsc2UpIHtcbiAgICBpZiAoIW5vQ29tbWl0KSB7XG4gICAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jdHJhbnNsYXRpb25bMF0gKz0geDtcbiAgICB0aGlzLiN0cmFuc2xhdGlvblsxXSArPSB5O1xuICAgIGNvbnN0IFt0b3RhbFgsIHRvdGFsWV0gPSB0aGlzLiN0cmFuc2xhdGlvbjtcbiAgICBjb25zdCBlZGl0b3JzID0gWy4uLnRoaXMuI3NlbGVjdGVkRWRpdG9yc107XG4gICAgY29uc3QgVElNRV9UT19XQUlUID0gMTAwMDtcbiAgICBpZiAodGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0cmFuc2xhdGlvblRpbWVvdXRJZCk7XG4gICAgfVxuICAgIHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiN0cmFuc2xhdGlvblRpbWVvdXRJZCA9IG51bGw7XG4gICAgICB0aGlzLiN0cmFuc2xhdGlvblswXSA9IHRoaXMuI3RyYW5zbGF0aW9uWzFdID0gMDtcbiAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jYWxsRWRpdG9ycy5oYXMoZWRpdG9yLmlkKSkge1xuICAgICAgICAgICAgICBlZGl0b3IudHJhbnNsYXRlSW5QYWdlKHRvdGFsWCwgdG90YWxZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jYWxsRWRpdG9ycy5oYXMoZWRpdG9yLmlkKSkge1xuICAgICAgICAgICAgICBlZGl0b3IudHJhbnNsYXRlSW5QYWdlKC10b3RhbFgsIC10b3RhbFkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbXVzdEV4ZWM6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9LCBUSU1FX1RPX1dBSVQpO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcbiAgICAgIGVkaXRvci50cmFuc2xhdGVJblBhZ2UoeCwgeSk7XG4gICAgfVxuICB9XG4gIHNldFVwRHJhZ1Nlc3Npb24oKSB7XG4gICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVVc2VyU2VsZWN0KHRydWUpO1xuICAgIHRoaXMuI2RyYWdnaW5nRWRpdG9ycyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIHRoaXMuI2RyYWdnaW5nRWRpdG9ycy5zZXQoZWRpdG9yLCB7XG4gICAgICAgIHNhdmVkWDogZWRpdG9yLngsXG4gICAgICAgIHNhdmVkWTogZWRpdG9yLnksXG4gICAgICAgIHNhdmVkUGFnZUluZGV4OiBlZGl0b3IucGFnZUluZGV4LFxuICAgICAgICBuZXdYOiAwLFxuICAgICAgICBuZXdZOiAwLFxuICAgICAgICBuZXdQYWdlSW5kZXg6IC0xXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZW5kRHJhZ1Nlc3Npb24oKSB7XG4gICAgaWYgKCF0aGlzLiNkcmFnZ2luZ0VkaXRvcnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlVXNlclNlbGVjdChmYWxzZSk7XG4gICAgY29uc3QgbWFwID0gdGhpcy4jZHJhZ2dpbmdFZGl0b3JzO1xuICAgIHRoaXMuI2RyYWdnaW5nRWRpdG9ycyA9IG51bGw7XG4gICAgbGV0IG11c3RCZUFkZGVkSW5VbmRvU3RhY2sgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFt7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHBhZ2VJbmRleFxuICAgIH0sIHZhbHVlXSBvZiBtYXApIHtcbiAgICAgIHZhbHVlLm5ld1ggPSB4O1xuICAgICAgdmFsdWUubmV3WSA9IHk7XG4gICAgICB2YWx1ZS5uZXdQYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgICBtdXN0QmVBZGRlZEluVW5kb1N0YWNrIHx8PSB4ICE9PSB2YWx1ZS5zYXZlZFggfHwgeSAhPT0gdmFsdWUuc2F2ZWRZIHx8IHBhZ2VJbmRleCAhPT0gdmFsdWUuc2F2ZWRQYWdlSW5kZXg7XG4gICAgfVxuICAgIGlmICghbXVzdEJlQWRkZWRJblVuZG9TdGFjaykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBtb3ZlID0gKGVkaXRvciwgeCwgeSwgcGFnZUluZGV4KSA9PiB7XG4gICAgICBpZiAodGhpcy4jYWxsRWRpdG9ycy5oYXMoZWRpdG9yLmlkKSkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLiNhbGxMYXllcnMuZ2V0KHBhZ2VJbmRleCk7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICBlZGl0b3IuX3NldFBhcmVudEFuZFBvc2l0aW9uKHBhcmVudCwgeCwgeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWRpdG9yLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICAgICAgICBlZGl0b3IueCA9IHg7XG4gICAgICAgICAgZWRpdG9yLnkgPSB5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtlZGl0b3IsIHtcbiAgICAgICAgICBuZXdYLFxuICAgICAgICAgIG5ld1ksXG4gICAgICAgICAgbmV3UGFnZUluZGV4XG4gICAgICAgIH1dIG9mIG1hcCkge1xuICAgICAgICAgIG1vdmUoZWRpdG9yLCBuZXdYLCBuZXdZLCBuZXdQYWdlSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtlZGl0b3IsIHtcbiAgICAgICAgICBzYXZlZFgsXG4gICAgICAgICAgc2F2ZWRZLFxuICAgICAgICAgIHNhdmVkUGFnZUluZGV4XG4gICAgICAgIH1dIG9mIG1hcCkge1xuICAgICAgICAgIG1vdmUoZWRpdG9yLCBzYXZlZFgsIHNhdmVkWSwgc2F2ZWRQYWdlSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbXVzdEV4ZWM6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBkcmFnU2VsZWN0ZWRFZGl0b3JzKHR4LCB0eSkge1xuICAgIGlmICghdGhpcy4jZHJhZ2dpbmdFZGl0b3JzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2RyYWdnaW5nRWRpdG9ycy5rZXlzKCkpIHtcbiAgICAgIGVkaXRvci5kcmFnKHR4LCB0eSk7XG4gICAgfVxuICB9XG4gIHJlYnVpbGQoZWRpdG9yKSB7XG4gICAgaWYgKGVkaXRvci5wYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZ2V0TGF5ZXIoZWRpdG9yLnBhZ2VJbmRleCk7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5jaGFuZ2VQYXJlbnQoZWRpdG9yKTtcbiAgICAgICAgcGFyZW50LmFkZE9yUmVidWlsZChlZGl0b3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGRFZGl0b3IoZWRpdG9yKTtcbiAgICAgICAgdGhpcy5hZGRUb0Fubm90YXRpb25TdG9yYWdlKGVkaXRvcik7XG4gICAgICAgIGVkaXRvci5yZWJ1aWxkKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVkaXRvci5wYXJlbnQuYWRkT3JSZWJ1aWxkKGVkaXRvcik7XG4gICAgfVxuICB9XG4gIGdldCBpc0VkaXRvckhhbmRsaW5nS2V5Ym9hcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlKCk/LnNob3VsZEdldEtleWJvYXJkRXZlbnRzKCkgfHwgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLnNpemUgPT09IDEgJiYgdGhpcy5maXJzdFNlbGVjdGVkRWRpdG9yLnNob3VsZEdldEtleWJvYXJkRXZlbnRzKCk7XG4gIH1cbiAgaXNBY3RpdmUoZWRpdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuI2FjdGl2ZUVkaXRvciA9PT0gZWRpdG9yO1xuICB9XG4gIGdldEFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jYWN0aXZlRWRpdG9yO1xuICB9XG4gIGdldE1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI21vZGU7XG4gIH1cbiAgZ2V0IGltYWdlTWFuYWdlcigpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaW1hZ2VNYW5hZ2VyXCIsIG5ldyBJbWFnZU1hbmFnZXIoKSk7XG4gIH1cbiAgZ2V0U2VsZWN0aW9uQm94ZXModGV4dExheWVyKSB7XG4gICAgaWYgKCF0ZXh0TGF5ZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGlmICghdGV4dExheWVyLmNvbnRhaW5zKHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgeDogbGF5ZXJYLFxuICAgICAgeTogbGF5ZXJZLFxuICAgICAgd2lkdGg6IHBhcmVudFdpZHRoLFxuICAgICAgaGVpZ2h0OiBwYXJlbnRIZWlnaHRcbiAgICB9ID0gdGV4dExheWVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCByb3RhdG9yO1xuICAgIHN3aXRjaCAodGV4dExheWVyLmdldEF0dHJpYnV0ZShcImRhdGEtbWFpbi1yb3RhdGlvblwiKSkge1xuICAgICAgY2FzZSBcIjkwXCI6XG4gICAgICAgIHJvdGF0b3IgPSAoeCwgeSwgdywgaCkgPT4gKHtcbiAgICAgICAgICB4OiAoeSAtIGxheWVyWSkgLyBwYXJlbnRIZWlnaHQsXG4gICAgICAgICAgeTogMSAtICh4ICsgdyAtIGxheWVyWCkgLyBwYXJlbnRXaWR0aCxcbiAgICAgICAgICB3aWR0aDogaCAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICBoZWlnaHQ6IHcgLyBwYXJlbnRXaWR0aFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiMTgwXCI6XG4gICAgICAgIHJvdGF0b3IgPSAoeCwgeSwgdywgaCkgPT4gKHtcbiAgICAgICAgICB4OiAxIC0gKHggKyB3IC0gbGF5ZXJYKSAvIHBhcmVudFdpZHRoLFxuICAgICAgICAgIHk6IDEgLSAoeSArIGggLSBsYXllclkpIC8gcGFyZW50SGVpZ2h0LFxuICAgICAgICAgIHdpZHRoOiB3IC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBoIC8gcGFyZW50SGVpZ2h0XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCIyNzBcIjpcbiAgICAgICAgcm90YXRvciA9ICh4LCB5LCB3LCBoKSA9PiAoe1xuICAgICAgICAgIHg6IDEgLSAoeSArIGggLSBsYXllclkpIC8gcGFyZW50SGVpZ2h0LFxuICAgICAgICAgIHk6ICh4IC0gbGF5ZXJYKSAvIHBhcmVudFdpZHRoLFxuICAgICAgICAgIHdpZHRoOiBoIC8gcGFyZW50SGVpZ2h0LFxuICAgICAgICAgIGhlaWdodDogdyAvIHBhcmVudFdpZHRoXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJvdGF0b3IgPSAoeCwgeSwgdywgaCkgPT4gKHtcbiAgICAgICAgICB4OiAoeCAtIGxheWVyWCkgLyBwYXJlbnRXaWR0aCxcbiAgICAgICAgICB5OiAoeSAtIGxheWVyWSkgLyBwYXJlbnRIZWlnaHQsXG4gICAgICAgICAgd2lkdGg6IHcgLyBwYXJlbnRXaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGggLyBwYXJlbnRIZWlnaHRcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBib3hlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNlbGVjdGlvbi5yYW5nZUNvdW50OyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdChpKTtcbiAgICAgIGlmIChyYW5nZS5jb2xsYXBzZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgfSBvZiByYW5nZS5nZXRDbGllbnRSZWN0cygpKSB7XG4gICAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBib3hlcy5wdXNoKHJvdGF0b3IoeCwgeSwgd2lkdGgsIGhlaWdodCkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYm94ZXMubGVuZ3RoID09PSAwID8gbnVsbCA6IGJveGVzO1xuICB9XG4gIGFkZENoYW5nZWRFeGlzdGluZ0Fubm90YXRpb24oe1xuICAgIGFubm90YXRpb25FbGVtZW50SWQsXG4gICAgaWRcbiAgfSkge1xuICAgICh0aGlzLiNjaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9ucyB8fD0gbmV3IE1hcCgpKS5zZXQoYW5ub3RhdGlvbkVsZW1lbnRJZCwgaWQpO1xuICB9XG4gIHJlbW92ZUNoYW5nZWRFeGlzdGluZ0Fubm90YXRpb24oe1xuICAgIGFubm90YXRpb25FbGVtZW50SWRcbiAgfSkge1xuICAgIHRoaXMuI2NoYW5nZWRFeGlzdGluZ0Fubm90YXRpb25zPy5kZWxldGUoYW5ub3RhdGlvbkVsZW1lbnRJZCk7XG4gIH1cbiAgcmVuZGVyQW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbikge1xuICAgIGNvbnN0IGVkaXRvcklkID0gdGhpcy4jY2hhbmdlZEV4aXN0aW5nQW5ub3RhdGlvbnM/LmdldChhbm5vdGF0aW9uLmRhdGEuaWQpO1xuICAgIGlmICghZWRpdG9ySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy4jYW5ub3RhdGlvblN0b3JhZ2UuZ2V0UmF3VmFsdWUoZWRpdG9ySWQpO1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiNtb2RlID09PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FICYmICFlZGl0b3IuaGFzQmVlbk1vZGlmaWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVkaXRvci5yZW5kZXJBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3IvYWx0X3RleHQuanNcblxuY2xhc3MgQWx0VGV4dCB7XG4gICNhbHRUZXh0ID0gXCJcIjtcbiAgI2FsdFRleHREZWNvcmF0aXZlID0gZmFsc2U7XG4gICNhbHRUZXh0QnV0dG9uID0gbnVsbDtcbiAgI2FsdFRleHRUb29sdGlwID0gbnVsbDtcbiAgI2FsdFRleHRUb29sdGlwVGltZW91dCA9IG51bGw7XG4gICNhbHRUZXh0V2FzRnJvbUtleUJvYXJkID0gZmFsc2U7XG4gICNlZGl0b3IgPSBudWxsO1xuICBzdGF0aWMgX2wxMG5Qcm9taXNlID0gbnVsbDtcbiAgY29uc3RydWN0b3IoZWRpdG9yKSB7XG4gICAgdGhpcy4jZWRpdG9yID0gZWRpdG9yO1xuICB9XG4gIHN0YXRpYyBpbml0aWFsaXplKGwxMG5Qcm9taXNlKSB7XG4gICAgQWx0VGV4dC5fbDEwblByb21pc2UgfHw9IGwxMG5Qcm9taXNlO1xuICB9XG4gIGFzeW5jIHJlbmRlcigpIHtcbiAgICBjb25zdCBhbHRUZXh0ID0gdGhpcy4jYWx0VGV4dEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYWx0VGV4dC5jbGFzc05hbWUgPSBcImFsdFRleHRcIjtcbiAgICBjb25zdCBtc2cgPSBhd2FpdCBBbHRUZXh0Ll9sMTBuUHJvbWlzZS5nZXQoXCJwZGZqcy1lZGl0b3ItYWx0LXRleHQtYnV0dG9uLWxhYmVsXCIpO1xuICAgIGFsdFRleHQudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgYWx0VGV4dC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG1zZyk7XG4gICAgYWx0VGV4dC50YWJJbmRleCA9IFwiMFwiO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgYWx0VGV4dC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgYWx0VGV4dC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgZXZlbnQgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCksIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGNvbnN0IG9uQ2xpY2sgPSBldmVudCA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy4jZWRpdG9yLl91aU1hbmFnZXIuZWRpdEFsdFRleHQodGhpcy4jZWRpdG9yKTtcbiAgICB9O1xuICAgIGFsdFRleHQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIG9uQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBhbHRUZXh0LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGFsdFRleHQgJiYgZXZlbnQua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgdGhpcy4jYWx0VGV4dFdhc0Zyb21LZXlCb2FyZCA9IHRydWU7XG4gICAgICAgIG9uQ2xpY2soZXZlbnQpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuI3NldFN0YXRlKCk7XG4gICAgcmV0dXJuIGFsdFRleHQ7XG4gIH1cbiAgZmluaXNoKCkge1xuICAgIGlmICghdGhpcy4jYWx0VGV4dEJ1dHRvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhbHRUZXh0QnV0dG9uLmZvY3VzKHtcbiAgICAgIGZvY3VzVmlzaWJsZTogdGhpcy4jYWx0VGV4dFdhc0Zyb21LZXlCb2FyZFxuICAgIH0pO1xuICAgIHRoaXMuI2FsdFRleHRXYXNGcm9tS2V5Qm9hcmQgPSBmYWxzZTtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy4jYWx0VGV4dCAmJiAhdGhpcy4jYWx0VGV4dERlY29yYXRpdmU7XG4gIH1cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsdFRleHQ6IHRoaXMuI2FsdFRleHQsXG4gICAgICBkZWNvcmF0aXZlOiB0aGlzLiNhbHRUZXh0RGVjb3JhdGl2ZVxuICAgIH07XG4gIH1cbiAgc2V0IGRhdGEoe1xuICAgIGFsdFRleHQsXG4gICAgZGVjb3JhdGl2ZVxuICB9KSB7XG4gICAgaWYgKHRoaXMuI2FsdFRleHQgPT09IGFsdFRleHQgJiYgdGhpcy4jYWx0VGV4dERlY29yYXRpdmUgPT09IGRlY29yYXRpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYWx0VGV4dCA9IGFsdFRleHQ7XG4gICAgdGhpcy4jYWx0VGV4dERlY29yYXRpdmUgPSBkZWNvcmF0aXZlO1xuICAgIHRoaXMuI3NldFN0YXRlKCk7XG4gIH1cbiAgdG9nZ2xlKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIGlmICghdGhpcy4jYWx0VGV4dEJ1dHRvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWVuYWJsZWQgJiYgdGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0KTtcbiAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuI2FsdFRleHRCdXR0b24uZGlzYWJsZWQgPSAhZW5hYmxlZDtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuI2FsdFRleHRCdXR0b24/LnJlbW92ZSgpO1xuICAgIHRoaXMuI2FsdFRleHRCdXR0b24gPSBudWxsO1xuICAgIHRoaXMuI2FsdFRleHRUb29sdGlwID0gbnVsbDtcbiAgfVxuICBhc3luYyAjc2V0U3RhdGUoKSB7XG4gICAgY29uc3QgYnV0dG9uID0gdGhpcy4jYWx0VGV4dEJ1dHRvbjtcbiAgICBpZiAoIWJ1dHRvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2FsdFRleHQgJiYgIXRoaXMuI2FsdFRleHREZWNvcmF0aXZlKSB7XG4gICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZShcImRvbmVcIik7XG4gICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcD8ucmVtb3ZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiZG9uZVwiKTtcbiAgICBBbHRUZXh0Ll9sMTBuUHJvbWlzZS5nZXQoXCJwZGZqcy1lZGl0b3ItYWx0LXRleHQtZWRpdC1idXR0b24tbGFiZWxcIikudGhlbihtc2cgPT4ge1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgbXNnKTtcbiAgICB9KTtcbiAgICBsZXQgdG9vbHRpcCA9IHRoaXMuI2FsdFRleHRUb29sdGlwO1xuICAgIGlmICghdG9vbHRpcCkge1xuICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXAgPSB0b29sdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICB0b29sdGlwLmNsYXNzTmFtZSA9IFwidG9vbHRpcFwiO1xuICAgICAgdG9vbHRpcC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwidG9vbHRpcFwiKTtcbiAgICAgIGNvbnN0IGlkID0gdG9vbHRpcC5pZCA9IGBhbHQtdGV4dC10b29sdGlwLSR7dGhpcy4jZWRpdG9yLmlkfWA7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiLCBpZCk7XG4gICAgICBjb25zdCBERUxBWV9UT19TSE9XX1RPT0xUSVAgPSAxMDA7XG4gICAgICBjb25zdCBzaWduYWwgPSB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQpO1xuICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAgICAgfSwge1xuICAgICAgICBvbmNlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXAuY2xhc3NMaXN0LmFkZChcInNob3dcIik7XG4gICAgICAgICAgdGhpcy4jZWRpdG9yLl9yZXBvcnRUZWxlbWV0cnkoe1xuICAgICAgICAgICAgYWN0aW9uOiBcImFsdF90ZXh0X3Rvb2x0aXBcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBERUxBWV9UT19TSE9XX1RPT0xUSVApO1xuICAgICAgfSwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQpO1xuICAgICAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXA/LmNsYXNzTGlzdC5yZW1vdmUoXCJzaG93XCIpO1xuICAgICAgfSwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0b29sdGlwLmlubmVyVGV4dCA9IHRoaXMuI2FsdFRleHREZWNvcmF0aXZlID8gYXdhaXQgQWx0VGV4dC5fbDEwblByb21pc2UuZ2V0KFwicGRmanMtZWRpdG9yLWFsdC10ZXh0LWRlY29yYXRpdmUtdG9vbHRpcFwiKSA6IHRoaXMuI2FsdFRleHQ7XG4gICAgaWYgKCF0b29sdGlwLnBhcmVudE5vZGUpIHtcbiAgICAgIGJ1dHRvbi5hcHBlbmQodG9vbHRpcCk7XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLiNlZGl0b3IuZ2V0SW1hZ2VGb3JBbHRUZXh0KCk7XG4gICAgZWxlbWVudD8uc2V0QXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiLCB0b29sdGlwLmlkKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3IvZWRpdG9yLmpzXG5cblxuXG5cblxuY2xhc3MgQW5ub3RhdGlvbkVkaXRvciB7XG4gICNhY2Nlc3NpYmlsaXR5RGF0YSA9IG51bGw7XG4gICNhbGxSZXNpemVyRGl2cyA9IG51bGw7XG4gICNhbHRUZXh0ID0gbnVsbDtcbiAgI2Rpc2FibGVkID0gZmFsc2U7XG4gICNrZWVwQXNwZWN0UmF0aW8gPSBmYWxzZTtcbiAgI3Jlc2l6ZXJzRGl2ID0gbnVsbDtcbiAgI3NhdmVkRGltZW5zaW9ucyA9IG51bGw7XG4gICNib3VuZEZvY3VzaW4gPSB0aGlzLmZvY3VzaW4uYmluZCh0aGlzKTtcbiAgI2JvdW5kRm9jdXNvdXQgPSB0aGlzLmZvY3Vzb3V0LmJpbmQodGhpcyk7XG4gICNlZGl0VG9vbGJhciA9IG51bGw7XG4gICNmb2N1c2VkUmVzaXplck5hbWUgPSBcIlwiO1xuICAjaGFzQmVlbkNsaWNrZWQgPSBmYWxzZTtcbiAgI2luaXRpYWxQb3NpdGlvbiA9IG51bGw7XG4gICNpc0VkaXRpbmcgPSBmYWxzZTtcbiAgI2lzSW5FZGl0TW9kZSA9IGZhbHNlO1xuICAjaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkID0gZmFsc2U7XG4gICNtb3ZlSW5ET01UaW1lb3V0ID0gbnVsbDtcbiAgI3ByZXZEcmFnWCA9IDA7XG4gICNwcmV2RHJhZ1kgPSAwO1xuICAjdGVsZW1ldHJ5VGltZW91dHMgPSBudWxsO1xuICBfaW5pdGlhbE9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBfaXNWaXNpYmxlID0gdHJ1ZTtcbiAgX3VpTWFuYWdlciA9IG51bGw7XG4gIF9mb2N1c0V2ZW50c0FsbG93ZWQgPSB0cnVlO1xuICBfbDEwblByb21pc2UgPSBudWxsO1xuICAjaXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgI3pJbmRleCA9IEFubm90YXRpb25FZGl0b3IuX3pJbmRleCsrO1xuICBzdGF0aWMgX2JvcmRlckxpbmVXaWR0aCA9IC0xO1xuICBzdGF0aWMgX2NvbG9yTWFuYWdlciA9IG5ldyBDb2xvck1hbmFnZXIoKTtcbiAgc3RhdGljIF96SW5kZXggPSAxO1xuICBzdGF0aWMgX3RlbGVtZXRyeVRpbWVvdXQgPSAxMDAwO1xuICBzdGF0aWMgZ2V0IF9yZXNpemVyS2V5Ym9hcmRNYW5hZ2VyKCkge1xuICAgIGNvbnN0IHJlc2l6ZSA9IEFubm90YXRpb25FZGl0b3IucHJvdG90eXBlLl9yZXNpemVXaXRoS2V5Ym9hcmQ7XG4gICAgY29uc3Qgc21hbGwgPSBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLlRSQU5TTEFURV9TTUFMTDtcbiAgICBjb25zdCBiaWcgPSBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLlRSQU5TTEFURV9CSUc7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9yZXNpemVyS2V5Ym9hcmRNYW5hZ2VyXCIsIG5ldyBLZXlib2FyZE1hbmFnZXIoW1tbXCJBcnJvd0xlZnRcIiwgXCJtYWMrQXJyb3dMZWZ0XCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFstc21hbGwsIDBdXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93TGVmdFwiLCBcIm1hYytzaGlmdCtBcnJvd0xlZnRcIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogWy1iaWcsIDBdXG4gICAgfV0sIFtbXCJBcnJvd1JpZ2h0XCIsIFwibWFjK0Fycm93UmlnaHRcIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogW3NtYWxsLCAwXVxuICAgIH1dLCBbW1wiY3RybCtBcnJvd1JpZ2h0XCIsIFwibWFjK3NoaWZ0K0Fycm93UmlnaHRcIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogW2JpZywgMF1cbiAgICB9XSwgW1tcIkFycm93VXBcIiwgXCJtYWMrQXJyb3dVcFwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbMCwgLXNtYWxsXVxuICAgIH1dLCBbW1wiY3RybCtBcnJvd1VwXCIsIFwibWFjK3NoaWZ0K0Fycm93VXBcIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogWzAsIC1iaWddXG4gICAgfV0sIFtbXCJBcnJvd0Rvd25cIiwgXCJtYWMrQXJyb3dEb3duXCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFswLCBzbWFsbF1cbiAgICB9XSwgW1tcImN0cmwrQXJyb3dEb3duXCIsIFwibWFjK3NoaWZ0K0Fycm93RG93blwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbMCwgYmlnXVxuICAgIH1dLCBbW1wiRXNjYXBlXCIsIFwibWFjK0VzY2FwZVwiXSwgQW5ub3RhdGlvbkVkaXRvci5wcm90b3R5cGUuX3N0b3BSZXNpemluZ1dpdGhLZXlib2FyZF1dKSk7XG4gIH1cbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBBbm5vdGF0aW9uRWRpdG9yKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEFubm90YXRpb25FZGl0b3IuXCIpO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudCA9IHBhcmFtZXRlcnMucGFyZW50O1xuICAgIHRoaXMuaWQgPSBwYXJhbWV0ZXJzLmlkO1xuICAgIHRoaXMud2lkdGggPSB0aGlzLmhlaWdodCA9IG51bGw7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBwYXJhbWV0ZXJzLnBhcmVudC5wYWdlSW5kZXg7XG4gICAgdGhpcy5uYW1lID0gcGFyYW1ldGVycy5uYW1lO1xuICAgIHRoaXMuZGl2ID0gbnVsbDtcbiAgICB0aGlzLl91aU1hbmFnZXIgPSBwYXJhbWV0ZXJzLnVpTWFuYWdlcjtcbiAgICB0aGlzLmFubm90YXRpb25FbGVtZW50SWQgPSBudWxsO1xuICAgIHRoaXMuX3dpbGxLZWVwQXNwZWN0UmF0aW8gPSBmYWxzZTtcbiAgICB0aGlzLl9pbml0aWFsT3B0aW9ucy5pc0NlbnRlcmVkID0gcGFyYW1ldGVycy5pc0NlbnRlcmVkO1xuICAgIHRoaXMuX3N0cnVjdFRyZWVQYXJlbnRJZCA9IG51bGw7XG4gICAgY29uc3Qge1xuICAgICAgcm90YXRpb24sXG4gICAgICByYXdEaW1zOiB7XG4gICAgICAgIHBhZ2VXaWR0aCxcbiAgICAgICAgcGFnZUhlaWdodCxcbiAgICAgICAgcGFnZVgsXG4gICAgICAgIHBhZ2VZXG4gICAgICB9XG4gICAgfSA9IHRoaXMucGFyZW50LnZpZXdwb3J0O1xuICAgIHRoaXMucm90YXRpb24gPSByb3RhdGlvbjtcbiAgICB0aGlzLnBhZ2VSb3RhdGlvbiA9ICgzNjAgKyByb3RhdGlvbiAtIHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycy5yb3RhdGlvbikgJSAzNjA7XG4gICAgdGhpcy5wYWdlRGltZW5zaW9ucyA9IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdO1xuICAgIHRoaXMucGFnZVRyYW5zbGF0aW9uID0gW3BhZ2VYLCBwYWdlWV07XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMueCA9IHBhcmFtZXRlcnMueCAvIHdpZHRoO1xuICAgIHRoaXMueSA9IHBhcmFtZXRlcnMueSAvIGhlaWdodDtcbiAgICB0aGlzLmlzQXR0YWNoZWRUb0RPTSA9IGZhbHNlO1xuICAgIHRoaXMuZGVsZXRlZCA9IGZhbHNlO1xuICB9XG4gIGdldCBlZGl0b3JUeXBlKCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3IuX3R5cGU7XG4gIH1cbiAgc3RhdGljIGdldCBfZGVmYXVsdExpbmVDb2xvcigpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2RlZmF1bHRMaW5lQ29sb3JcIiwgdGhpcy5fY29sb3JNYW5hZ2VyLmdldEhleENvZGUoXCJDYW52YXNUZXh0XCIpKTtcbiAgfVxuICBzdGF0aWMgZGVsZXRlQW5ub3RhdGlvbkVsZW1lbnQoZWRpdG9yKSB7XG4gICAgY29uc3QgZmFrZUVkaXRvciA9IG5ldyBGYWtlRWRpdG9yKHtcbiAgICAgIGlkOiBlZGl0b3IucGFyZW50LmdldE5leHRJZCgpLFxuICAgICAgcGFyZW50OiBlZGl0b3IucGFyZW50LFxuICAgICAgdWlNYW5hZ2VyOiBlZGl0b3IuX3VpTWFuYWdlclxuICAgIH0pO1xuICAgIGZha2VFZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCA9IGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkO1xuICAgIGZha2VFZGl0b3IuZGVsZXRlZCA9IHRydWU7XG4gICAgZmFrZUVkaXRvci5fdWlNYW5hZ2VyLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoZmFrZUVkaXRvcik7XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwbiwgX3VpTWFuYWdlciwgb3B0aW9ucykge1xuICAgIEFubm90YXRpb25FZGl0b3IuX2wxMG5Qcm9taXNlIHx8PSBuZXcgTWFwKFtcInBkZmpzLWVkaXRvci1hbHQtdGV4dC1idXR0b24tbGFiZWxcIiwgXCJwZGZqcy1lZGl0b3ItYWx0LXRleHQtZWRpdC1idXR0b24tbGFiZWxcIiwgXCJwZGZqcy1lZGl0b3ItYWx0LXRleHQtZGVjb3JhdGl2ZS10b29sdGlwXCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtdG9wTGVmdFwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLXRvcE1pZGRsZVwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLXRvcFJpZ2h0XCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtbWlkZGxlUmlnaHRcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC1ib3R0b21SaWdodFwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLWJvdHRvbU1pZGRsZVwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLWJvdHRvbUxlZnRcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC1taWRkbGVMZWZ0XCJdLm1hcChzdHIgPT4gW3N0ciwgbDEwbi5nZXQoc3RyLnJlcGxhY2VBbGwoLyhbQS1aXSkvZywgYyA9PiBgLSR7Yy50b0xvd2VyQ2FzZSgpfWApKV0pKTtcbiAgICBpZiAob3B0aW9ucz8uc3RyaW5ncykge1xuICAgICAgZm9yIChjb25zdCBzdHIgb2Ygb3B0aW9ucy5zdHJpbmdzKSB7XG4gICAgICAgIEFubm90YXRpb25FZGl0b3IuX2wxMG5Qcm9taXNlLnNldChzdHIsIGwxMG4uZ2V0KHN0cikpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoQW5ub3RhdGlvbkVkaXRvci5fYm9yZGVyTGluZVdpZHRoICE9PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICBBbm5vdGF0aW9uRWRpdG9yLl9ib3JkZXJMaW5lV2lkdGggPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLW91dGxpbmUtd2lkdGhcIikpIHx8IDA7XG4gIH1cbiAgc3RhdGljIHVwZGF0ZURlZmF1bHRQYXJhbXMoX3R5cGUsIF92YWx1ZSkge31cbiAgc3RhdGljIGdldCBkZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBzdGF0aWMgaXNIYW5kbGluZ01pbWVGb3JQYXN0aW5nKG1pbWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3RhdGljIHBhc3RlKGl0ZW0sIHBhcmVudCkge1xuICAgIHVucmVhY2hhYmxlKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIGdldCBwcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGdldCBfaXNEcmFnZ2FibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lzRHJhZ2dhYmxlO1xuICB9XG4gIHNldCBfaXNEcmFnZ2FibGUodmFsdWUpIHtcbiAgICB0aGlzLiNpc0RyYWdnYWJsZSA9IHZhbHVlO1xuICAgIHRoaXMuZGl2Py5jbGFzc0xpc3QudG9nZ2xlKFwiZHJhZ2dhYmxlXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgaXNFbnRlckhhbmRsZWQoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY2VudGVyKCkge1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICBzd2l0Y2ggKHRoaXMucGFyZW50Um90YXRpb24pIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHRoaXMueCAtPSB0aGlzLmhlaWdodCAqIHBhZ2VIZWlnaHQgLyAocGFnZVdpZHRoICogMik7XG4gICAgICAgIHRoaXMueSArPSB0aGlzLndpZHRoICogcGFnZVdpZHRoIC8gKHBhZ2VIZWlnaHQgKiAyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgdGhpcy54ICs9IHRoaXMud2lkdGggLyAyO1xuICAgICAgICB0aGlzLnkgKz0gdGhpcy5oZWlnaHQgLyAyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICB0aGlzLnggKz0gdGhpcy5oZWlnaHQgKiBwYWdlSGVpZ2h0IC8gKHBhZ2VXaWR0aCAqIDIpO1xuICAgICAgICB0aGlzLnkgLT0gdGhpcy53aWR0aCAqIHBhZ2VXaWR0aCAvIChwYWdlSGVpZ2h0ICogMik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy54IC09IHRoaXMud2lkdGggLyAyO1xuICAgICAgICB0aGlzLnkgLT0gdGhpcy5oZWlnaHQgLyAyO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICB9XG4gIGFkZENvbW1hbmRzKHBhcmFtcykge1xuICAgIHRoaXMuX3VpTWFuYWdlci5hZGRDb21tYW5kcyhwYXJhbXMpO1xuICB9XG4gIGdldCBjdXJyZW50TGF5ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VpTWFuYWdlci5jdXJyZW50TGF5ZXI7XG4gIH1cbiAgc2V0SW5CYWNrZ3JvdW5kKCkge1xuICAgIHRoaXMuZGl2LnN0eWxlLnpJbmRleCA9IDA7XG4gIH1cbiAgc2V0SW5Gb3JlZ3JvdW5kKCkge1xuICAgIHRoaXMuZGl2LnN0eWxlLnpJbmRleCA9IHRoaXMuI3pJbmRleDtcbiAgfVxuICBzZXRQYXJlbnQocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5wYWdlSW5kZXggPSBwYXJlbnQucGFnZUluZGV4O1xuICAgICAgdGhpcy5wYWdlRGltZW5zaW9ucyA9IHBhcmVudC5wYWdlRGltZW5zaW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jc3RvcFJlc2l6aW5nKCk7XG4gICAgfVxuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB9XG4gIGZvY3VzaW4oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2ZvY3VzRXZlbnRzQWxsb3dlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2hhc0JlZW5DbGlja2VkKSB7XG4gICAgICB0aGlzLnBhcmVudC5zZXRTZWxlY3RlZCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jaGFzQmVlbkNsaWNrZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZm9jdXNvdXQoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2ZvY3VzRXZlbnRzQWxsb3dlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgaWYgKHRhcmdldD8uY2xvc2VzdChgIyR7dGhpcy5pZH1gKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghdGhpcy5wYXJlbnQ/LmlzTXVsdGlwbGVTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICB9XG4gIH1cbiAgY29tbWl0T3JSZW1vdmUoKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLnJlbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbW1pdCgpO1xuICAgIH1cbiAgfVxuICBjb21taXQoKSB7XG4gICAgdGhpcy5hZGRUb0Fubm90YXRpb25TdG9yYWdlKCk7XG4gIH1cbiAgYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpIHtcbiAgICB0aGlzLl91aU1hbmFnZXIuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSh0aGlzKTtcbiAgfVxuICBzZXRBdCh4LCB5LCB0eCwgdHkpIHtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgW3R4LCB0eV0gPSB0aGlzLnNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKHR4LCB0eSk7XG4gICAgdGhpcy54ID0gKHggKyB0eCkgLyB3aWR0aDtcbiAgICB0aGlzLnkgPSAoeSArIHR5KSAvIGhlaWdodDtcbiAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gIH1cbiAgI3RyYW5zbGF0ZShbd2lkdGgsIGhlaWdodF0sIHgsIHkpIHtcbiAgICBbeCwgeV0gPSB0aGlzLnNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKHgsIHkpO1xuICAgIHRoaXMueCArPSB4IC8gd2lkdGg7XG4gICAgdGhpcy55ICs9IHkgLyBoZWlnaHQ7XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICB9XG4gIHRyYW5zbGF0ZSh4LCB5KSB7XG4gICAgdGhpcy4jdHJhbnNsYXRlKHRoaXMucGFyZW50RGltZW5zaW9ucywgeCwgeSk7XG4gIH1cbiAgdHJhbnNsYXRlSW5QYWdlKHgsIHkpIHtcbiAgICB0aGlzLiNpbml0aWFsUG9zaXRpb24gfHw9IFt0aGlzLngsIHRoaXMueV07XG4gICAgdGhpcy4jdHJhbnNsYXRlKHRoaXMucGFnZURpbWVuc2lvbnMsIHgsIHkpO1xuICAgIHRoaXMuZGl2LnNjcm9sbEludG9WaWV3KHtcbiAgICAgIGJsb2NrOiBcIm5lYXJlc3RcIlxuICAgIH0pO1xuICB9XG4gIGRyYWcodHgsIHR5KSB7XG4gICAgdGhpcy4jaW5pdGlhbFBvc2l0aW9uIHx8PSBbdGhpcy54LCB0aGlzLnldO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLnggKz0gdHggLyBwYXJlbnRXaWR0aDtcbiAgICB0aGlzLnkgKz0gdHkgLyBwYXJlbnRIZWlnaHQ7XG4gICAgaWYgKHRoaXMucGFyZW50ICYmICh0aGlzLnggPCAwIHx8IHRoaXMueCA+IDEgfHwgdGhpcy55IDwgMCB8fCB0aGlzLnkgPiAxKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAodGhpcy5wYXJlbnQuZmluZE5ld1BhcmVudCh0aGlzLCB4LCB5KSkge1xuICAgICAgICB0aGlzLnggLT0gTWF0aC5mbG9vcih0aGlzLngpO1xuICAgICAgICB0aGlzLnkgLT0gTWF0aC5mbG9vcih0aGlzLnkpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCBbYngsIGJ5XSA9IHRoaXMuZ2V0QmFzZVRyYW5zbGF0aW9uKCk7XG4gICAgeCArPSBieDtcbiAgICB5ICs9IGJ5O1xuICAgIHRoaXMuZGl2LnN0eWxlLmxlZnQgPSBgJHsoMTAwICogeCkudG9GaXhlZCgyKX0lYDtcbiAgICB0aGlzLmRpdi5zdHlsZS50b3AgPSBgJHsoMTAwICogeSkudG9GaXhlZCgyKX0lYDtcbiAgICB0aGlzLmRpdi5zY3JvbGxJbnRvVmlldyh7XG4gICAgICBibG9jazogXCJuZWFyZXN0XCJcbiAgICB9KTtcbiAgfVxuICBnZXQgX2hhc0JlZW5Nb3ZlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLiNpbml0aWFsUG9zaXRpb24gJiYgKHRoaXMuI2luaXRpYWxQb3NpdGlvblswXSAhPT0gdGhpcy54IHx8IHRoaXMuI2luaXRpYWxQb3NpdGlvblsxXSAhPT0gdGhpcy55KTtcbiAgfVxuICBnZXRCYXNlVHJhbnNsYXRpb24oKSB7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIGNvbnN0IHtcbiAgICAgIF9ib3JkZXJMaW5lV2lkdGhcbiAgICB9ID0gQW5ub3RhdGlvbkVkaXRvcjtcbiAgICBjb25zdCB4ID0gX2JvcmRlckxpbmVXaWR0aCAvIHBhcmVudFdpZHRoO1xuICAgIGNvbnN0IHkgPSBfYm9yZGVyTGluZVdpZHRoIC8gcGFyZW50SGVpZ2h0O1xuICAgIHN3aXRjaCAodGhpcy5yb3RhdGlvbikge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIFsteCwgeV07XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4gW3gsIC15XTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbLXgsIC15XTtcbiAgICB9XG4gIH1cbiAgZ2V0IF9tdXN0Rml4UG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZml4QW5kU2V0UG9zaXRpb24ocm90YXRpb24gPSB0aGlzLnJvdGF0aW9uKSB7XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgIGxldCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IHRoaXM7XG4gICAgd2lkdGggKj0gcGFnZVdpZHRoO1xuICAgIGhlaWdodCAqPSBwYWdlSGVpZ2h0O1xuICAgIHggKj0gcGFnZVdpZHRoO1xuICAgIHkgKj0gcGFnZUhlaWdodDtcbiAgICBpZiAodGhpcy5fbXVzdEZpeFBvc2l0aW9uKSB7XG4gICAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZVdpZHRoIC0gd2lkdGgsIHgpKTtcbiAgICAgICAgICB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZUhlaWdodCAtIGhlaWdodCwgeSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgIHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwYWdlV2lkdGggLSBoZWlnaHQsIHgpKTtcbiAgICAgICAgICB5ID0gTWF0aC5taW4ocGFnZUhlaWdodCwgTWF0aC5tYXgod2lkdGgsIHkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgeCA9IE1hdGgubWluKHBhZ2VXaWR0aCwgTWF0aC5tYXgod2lkdGgsIHgpKTtcbiAgICAgICAgICB5ID0gTWF0aC5taW4ocGFnZUhlaWdodCwgTWF0aC5tYXgoaGVpZ2h0LCB5KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgIHggPSBNYXRoLm1pbihwYWdlV2lkdGgsIE1hdGgubWF4KGhlaWdodCwgeCkpO1xuICAgICAgICAgIHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwYWdlSGVpZ2h0IC0gd2lkdGgsIHkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy54ID0geCAvPSBwYWdlV2lkdGg7XG4gICAgdGhpcy55ID0geSAvPSBwYWdlSGVpZ2h0O1xuICAgIGNvbnN0IFtieCwgYnldID0gdGhpcy5nZXRCYXNlVHJhbnNsYXRpb24oKTtcbiAgICB4ICs9IGJ4O1xuICAgIHkgKz0gYnk7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy5kaXY7XG4gICAgc3R5bGUubGVmdCA9IGAkeygxMDAgKiB4KS50b0ZpeGVkKDIpfSVgO1xuICAgIHN0eWxlLnRvcCA9IGAkeygxMDAgKiB5KS50b0ZpeGVkKDIpfSVgO1xuICAgIHRoaXMubW92ZUluRE9NKCk7XG4gIH1cbiAgc3RhdGljICNyb3RhdGVQb2ludCh4LCB5LCBhbmdsZSkge1xuICAgIHN3aXRjaCAoYW5nbGUpIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJldHVybiBbeSwgLXhdO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiBbLXgsIC15XTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4gWy15LCB4XTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICB9XG4gIHNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4gQW5ub3RhdGlvbkVkaXRvci4jcm90YXRlUG9pbnQoeCwgeSwgdGhpcy5wYXJlbnRSb3RhdGlvbik7XG4gIH1cbiAgcGFnZVRyYW5zbGF0aW9uVG9TY3JlZW4oeCwgeSkge1xuICAgIHJldHVybiBBbm5vdGF0aW9uRWRpdG9yLiNyb3RhdGVQb2ludCh4LCB5LCAzNjAgLSB0aGlzLnBhcmVudFJvdGF0aW9uKTtcbiAgfVxuICAjZ2V0Um90YXRpb25NYXRyaXgocm90YXRpb24pIHtcbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgICAgICAgIHJldHVybiBbMCwgLXBhZ2VXaWR0aCAvIHBhZ2VIZWlnaHQsIHBhZ2VIZWlnaHQgLyBwYWdlV2lkdGgsIDBdO1xuICAgICAgICB9XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIFstMSwgMCwgMCwgLTFdO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgICAgICAgcmV0dXJuIFswLCBwYWdlV2lkdGggLyBwYWdlSGVpZ2h0LCAtcGFnZUhlaWdodCAvIHBhZ2VXaWR0aCwgMF07XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbMSwgMCwgMCwgMV07XG4gICAgfVxuICB9XG4gIGdldCBwYXJlbnRTY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLnJlYWxTY2FsZTtcbiAgfVxuICBnZXQgcGFyZW50Um90YXRpb24oKSB7XG4gICAgcmV0dXJuICh0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucm90YXRpb24gKyB0aGlzLnBhZ2VSb3RhdGlvbikgJSAzNjA7XG4gIH1cbiAgZ2V0IHBhcmVudERpbWVuc2lvbnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgcGFyZW50U2NhbGUsXG4gICAgICBwYWdlRGltZW5zaW9uczogW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF1cbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCBzY2FsZWRXaWR0aCA9IHBhZ2VXaWR0aCAqIHBhcmVudFNjYWxlO1xuICAgIGNvbnN0IHNjYWxlZEhlaWdodCA9IHBhZ2VIZWlnaHQgKiBwYXJlbnRTY2FsZTtcbiAgICByZXR1cm4gdXRpbF9GZWF0dXJlVGVzdC5pc0NTU1JvdW5kU3VwcG9ydGVkID8gW01hdGgucm91bmQoc2NhbGVkV2lkdGgpLCBNYXRoLnJvdW5kKHNjYWxlZEhlaWdodCldIDogW3NjYWxlZFdpZHRoLCBzY2FsZWRIZWlnaHRdO1xuICB9XG4gIHNldERpbXMod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IGAkeygxMDAgKiB3aWR0aCAvIHBhcmVudFdpZHRoKS50b0ZpeGVkKDIpfSVgO1xuICAgIGlmICghdGhpcy4ja2VlcEFzcGVjdFJhdGlvKSB7XG4gICAgICB0aGlzLmRpdi5zdHlsZS5oZWlnaHQgPSBgJHsoMTAwICogaGVpZ2h0IC8gcGFyZW50SGVpZ2h0KS50b0ZpeGVkKDIpfSVgO1xuICAgIH1cbiAgfVxuICBmaXhEaW1zKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuZGl2O1xuICAgIGNvbnN0IHtcbiAgICAgIGhlaWdodCxcbiAgICAgIHdpZHRoXG4gICAgfSA9IHN0eWxlO1xuICAgIGNvbnN0IHdpZHRoUGVyY2VudCA9IHdpZHRoLmVuZHNXaXRoKFwiJVwiKTtcbiAgICBjb25zdCBoZWlnaHRQZXJjZW50ID0gIXRoaXMuI2tlZXBBc3BlY3RSYXRpbyAmJiBoZWlnaHQuZW5kc1dpdGgoXCIlXCIpO1xuICAgIGlmICh3aWR0aFBlcmNlbnQgJiYgaGVpZ2h0UGVyY2VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgaWYgKCF3aWR0aFBlcmNlbnQpIHtcbiAgICAgIHN0eWxlLndpZHRoID0gYCR7KDEwMCAqIHBhcnNlRmxvYXQod2lkdGgpIC8gcGFyZW50V2lkdGgpLnRvRml4ZWQoMil9JWA7XG4gICAgfVxuICAgIGlmICghdGhpcy4ja2VlcEFzcGVjdFJhdGlvICYmICFoZWlnaHRQZXJjZW50KSB7XG4gICAgICBzdHlsZS5oZWlnaHQgPSBgJHsoMTAwICogcGFyc2VGbG9hdChoZWlnaHQpIC8gcGFyZW50SGVpZ2h0KS50b0ZpeGVkKDIpfSVgO1xuICAgIH1cbiAgfVxuICBnZXRJbml0aWFsVHJhbnNsYXRpb24oKSB7XG4gICAgcmV0dXJuIFswLCAwXTtcbiAgfVxuICAjY3JlYXRlUmVzaXplcnMoKSB7XG4gICAgaWYgKHRoaXMuI3Jlc2l6ZXJzRGl2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3Jlc2l6ZXJzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLiNyZXNpemVyc0Rpdi5jbGFzc0xpc3QuYWRkKFwicmVzaXplcnNcIik7XG4gICAgY29uc3QgY2xhc3NlcyA9IHRoaXMuX3dpbGxLZWVwQXNwZWN0UmF0aW8gPyBbXCJ0b3BMZWZ0XCIsIFwidG9wUmlnaHRcIiwgXCJib3R0b21SaWdodFwiLCBcImJvdHRvbUxlZnRcIl0gOiBbXCJ0b3BMZWZ0XCIsIFwidG9wTWlkZGxlXCIsIFwidG9wUmlnaHRcIiwgXCJtaWRkbGVSaWdodFwiLCBcImJvdHRvbVJpZ2h0XCIsIFwiYm90dG9tTWlkZGxlXCIsIFwiYm90dG9tTGVmdFwiLCBcIm1pZGRsZUxlZnRcIl07XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIGNsYXNzZXMpIHtcbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0aGlzLiNyZXNpemVyc0Rpdi5hcHBlbmQoZGl2KTtcbiAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKFwicmVzaXplclwiLCBuYW1lKTtcbiAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLXJlc2l6ZXItbmFtZVwiLCBuYW1lKTtcbiAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jcmVzaXplclBvaW50ZXJkb3duLmJpbmQodGhpcywgbmFtZSksIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgICAgZGl2LnRhYkluZGV4ID0gLTE7XG4gICAgfVxuICAgIHRoaXMuZGl2LnByZXBlbmQodGhpcy4jcmVzaXplcnNEaXYpO1xuICB9XG4gICNyZXNpemVyUG9pbnRlcmRvd24obmFtZSwgZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTWFjXG4gICAgfSA9IHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5jdHJsS2V5ICYmIGlzTWFjKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FsdFRleHQ/LnRvZ2dsZShmYWxzZSk7XG4gICAgY29uc3QgYm91bmRSZXNpemVyUG9pbnRlcm1vdmUgPSB0aGlzLiNyZXNpemVyUG9pbnRlcm1vdmUuYmluZCh0aGlzLCBuYW1lKTtcbiAgICBjb25zdCBzYXZlZERyYWdnYWJsZSA9IHRoaXMuX2lzRHJhZ2dhYmxlO1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgY29uc3QgcG9pbnRlck1vdmVPcHRpb25zID0ge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBzaWduYWxcbiAgICB9O1xuICAgIHRoaXMucGFyZW50LnRvZ2dsZVBvaW50ZXJFdmVudHMoZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgYm91bmRSZXNpemVyUG9pbnRlcm1vdmUsIHBvaW50ZXJNb3ZlT3B0aW9ucyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBjb25zdCBzYXZlZFggPSB0aGlzLng7XG4gICAgY29uc3Qgc2F2ZWRZID0gdGhpcy55O1xuICAgIGNvbnN0IHNhdmVkV2lkdGggPSB0aGlzLndpZHRoO1xuICAgIGNvbnN0IHNhdmVkSGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgY29uc3Qgc2F2ZWRQYXJlbnRDdXJzb3IgPSB0aGlzLnBhcmVudC5kaXYuc3R5bGUuY3Vyc29yO1xuICAgIGNvbnN0IHNhdmVkQ3Vyc29yID0gdGhpcy5kaXYuc3R5bGUuY3Vyc29yO1xuICAgIHRoaXMuZGl2LnN0eWxlLmN1cnNvciA9IHRoaXMucGFyZW50LmRpdi5zdHlsZS5jdXJzb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShldmVudC50YXJnZXQpLmN1cnNvcjtcbiAgICBjb25zdCBwb2ludGVyVXBDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMucGFyZW50LnRvZ2dsZVBvaW50ZXJFdmVudHModHJ1ZSk7XG4gICAgICB0aGlzLiNhbHRUZXh0Py50b2dnbGUodHJ1ZSk7XG4gICAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IHNhdmVkRHJhZ2dhYmxlO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlclVwQ2FsbGJhY2spO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJVcENhbGxiYWNrKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgYm91bmRSZXNpemVyUG9pbnRlcm1vdmUsIHBvaW50ZXJNb3ZlT3B0aW9ucyk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUpO1xuICAgICAgdGhpcy5wYXJlbnQuZGl2LnN0eWxlLmN1cnNvciA9IHNhdmVkUGFyZW50Q3Vyc29yO1xuICAgICAgdGhpcy5kaXYuc3R5bGUuY3Vyc29yID0gc2F2ZWRDdXJzb3I7XG4gICAgICB0aGlzLiNhZGRSZXNpemVUb1VuZG9TdGFjayhzYXZlZFgsIHNhdmVkWSwgc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlclVwQ2FsbGJhY2ssIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVyVXBDYWxsYmFjaywge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgI2FkZFJlc2l6ZVRvVW5kb1N0YWNrKHNhdmVkWCwgc2F2ZWRZLCBzYXZlZFdpZHRoLCBzYXZlZEhlaWdodCkge1xuICAgIGNvbnN0IG5ld1ggPSB0aGlzLng7XG4gICAgY29uc3QgbmV3WSA9IHRoaXMueTtcbiAgICBjb25zdCBuZXdXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgY29uc3QgbmV3SGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgaWYgKG5ld1ggPT09IHNhdmVkWCAmJiBuZXdZID09PSBzYXZlZFkgJiYgbmV3V2lkdGggPT09IHNhdmVkV2lkdGggJiYgbmV3SGVpZ2h0ID09PSBzYXZlZEhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICB0aGlzLndpZHRoID0gbmV3V2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICAgICAgICB0aGlzLnggPSBuZXdYO1xuICAgICAgICB0aGlzLnkgPSBuZXdZO1xuICAgICAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgIHRoaXMuc2V0RGltcyhwYXJlbnRXaWR0aCAqIG5ld1dpZHRoLCBwYXJlbnRIZWlnaHQgKiBuZXdIZWlnaHQpO1xuICAgICAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgICB9LFxuICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICB0aGlzLndpZHRoID0gc2F2ZWRXaWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBzYXZlZEhlaWdodDtcbiAgICAgICAgdGhpcy54ID0gc2F2ZWRYO1xuICAgICAgICB0aGlzLnkgPSBzYXZlZFk7XG4gICAgICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgdGhpcy5zZXREaW1zKHBhcmVudFdpZHRoICogc2F2ZWRXaWR0aCwgcGFyZW50SGVpZ2h0ICogc2F2ZWRIZWlnaHQpO1xuICAgICAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgICB9LFxuICAgICAgbXVzdEV4ZWM6IHRydWVcbiAgICB9KTtcbiAgfVxuICAjcmVzaXplclBvaW50ZXJtb3ZlKG5hbWUsIGV2ZW50KSB7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIGNvbnN0IHNhdmVkWCA9IHRoaXMueDtcbiAgICBjb25zdCBzYXZlZFkgPSB0aGlzLnk7XG4gICAgY29uc3Qgc2F2ZWRXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgY29uc3Qgc2F2ZWRIZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICBjb25zdCBtaW5XaWR0aCA9IEFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUgLyBwYXJlbnRXaWR0aDtcbiAgICBjb25zdCBtaW5IZWlnaHQgPSBBbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFIC8gcGFyZW50SGVpZ2h0O1xuICAgIGNvbnN0IHJvdW5kID0geCA9PiBNYXRoLnJvdW5kKHggKiAxMDAwMCkgLyAxMDAwMDtcbiAgICBjb25zdCByb3RhdGlvbk1hdHJpeCA9IHRoaXMuI2dldFJvdGF0aW9uTWF0cml4KHRoaXMucm90YXRpb24pO1xuICAgIGNvbnN0IHRyYW5zZiA9ICh4LCB5KSA9PiBbcm90YXRpb25NYXRyaXhbMF0gKiB4ICsgcm90YXRpb25NYXRyaXhbMl0gKiB5LCByb3RhdGlvbk1hdHJpeFsxXSAqIHggKyByb3RhdGlvbk1hdHJpeFszXSAqIHldO1xuICAgIGNvbnN0IGludlJvdGF0aW9uTWF0cml4ID0gdGhpcy4jZ2V0Um90YXRpb25NYXRyaXgoMzYwIC0gdGhpcy5yb3RhdGlvbik7XG4gICAgY29uc3QgaW52VHJhbnNmID0gKHgsIHkpID0+IFtpbnZSb3RhdGlvbk1hdHJpeFswXSAqIHggKyBpbnZSb3RhdGlvbk1hdHJpeFsyXSAqIHksIGludlJvdGF0aW9uTWF0cml4WzFdICogeCArIGludlJvdGF0aW9uTWF0cml4WzNdICogeV07XG4gICAgbGV0IGdldFBvaW50O1xuICAgIGxldCBnZXRPcHBvc2l0ZTtcbiAgICBsZXQgaXNEaWFnb25hbCA9IGZhbHNlO1xuICAgIGxldCBpc0hvcml6b250YWwgPSBmYWxzZTtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgXCJ0b3BMZWZ0XCI6XG4gICAgICAgIGlzRGlhZ29uYWwgPSB0cnVlO1xuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbMCwgMF07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFt3LCBoXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9wTWlkZGxlXCI6XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFt3IC8gMiwgMF07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFt3IC8gMiwgaF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvcFJpZ2h0XCI6XG4gICAgICAgIGlzRGlhZ29uYWwgPSB0cnVlO1xuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbdywgMF07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFswLCBoXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWlkZGxlUmlnaHRcIjpcbiAgICAgICAgaXNIb3Jpem9udGFsID0gdHJ1ZTtcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gW3csIGggLyAyXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gWzAsIGggLyAyXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYm90dG9tUmlnaHRcIjpcbiAgICAgICAgaXNEaWFnb25hbCA9IHRydWU7XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFt3LCBoXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gWzAsIDBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJib3R0b21NaWRkbGVcIjpcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gW3cgLyAyLCBoXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gW3cgLyAyLCAwXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYm90dG9tTGVmdFwiOlxuICAgICAgICBpc0RpYWdvbmFsID0gdHJ1ZTtcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gWzAsIGhdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbdywgMF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1pZGRsZUxlZnRcIjpcbiAgICAgICAgaXNIb3Jpem9udGFsID0gdHJ1ZTtcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gWzAsIGggLyAyXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gW3csIGggLyAyXTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IHBvaW50ID0gZ2V0UG9pbnQoc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpO1xuICAgIGNvbnN0IG9wcG9zaXRlUG9pbnQgPSBnZXRPcHBvc2l0ZShzYXZlZFdpZHRoLCBzYXZlZEhlaWdodCk7XG4gICAgbGV0IHRyYW5zZk9wcG9zaXRlUG9pbnQgPSB0cmFuc2YoLi4ub3Bwb3NpdGVQb2ludCk7XG4gICAgY29uc3Qgb3Bwb3NpdGVYID0gcm91bmQoc2F2ZWRYICsgdHJhbnNmT3Bwb3NpdGVQb2ludFswXSk7XG4gICAgY29uc3Qgb3Bwb3NpdGVZID0gcm91bmQoc2F2ZWRZICsgdHJhbnNmT3Bwb3NpdGVQb2ludFsxXSk7XG4gICAgbGV0IHJhdGlvWCA9IDE7XG4gICAgbGV0IHJhdGlvWSA9IDE7XG4gICAgbGV0IFtkZWx0YVgsIGRlbHRhWV0gPSB0aGlzLnNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKGV2ZW50Lm1vdmVtZW50WCwgZXZlbnQubW92ZW1lbnRZKTtcbiAgICBbZGVsdGFYLCBkZWx0YVldID0gaW52VHJhbnNmKGRlbHRhWCAvIHBhcmVudFdpZHRoLCBkZWx0YVkgLyBwYXJlbnRIZWlnaHQpO1xuICAgIGlmIChpc0RpYWdvbmFsKSB7XG4gICAgICBjb25zdCBvbGREaWFnID0gTWF0aC5oeXBvdChzYXZlZFdpZHRoLCBzYXZlZEhlaWdodCk7XG4gICAgICByYXRpb1ggPSByYXRpb1kgPSBNYXRoLm1heChNYXRoLm1pbihNYXRoLmh5cG90KG9wcG9zaXRlUG9pbnRbMF0gLSBwb2ludFswXSAtIGRlbHRhWCwgb3Bwb3NpdGVQb2ludFsxXSAtIHBvaW50WzFdIC0gZGVsdGFZKSAvIG9sZERpYWcsIDEgLyBzYXZlZFdpZHRoLCAxIC8gc2F2ZWRIZWlnaHQpLCBtaW5XaWR0aCAvIHNhdmVkV2lkdGgsIG1pbkhlaWdodCAvIHNhdmVkSGVpZ2h0KTtcbiAgICB9IGVsc2UgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgcmF0aW9YID0gTWF0aC5tYXgobWluV2lkdGgsIE1hdGgubWluKDEsIE1hdGguYWJzKG9wcG9zaXRlUG9pbnRbMF0gLSBwb2ludFswXSAtIGRlbHRhWCkpKSAvIHNhdmVkV2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhdGlvWSA9IE1hdGgubWF4KG1pbkhlaWdodCwgTWF0aC5taW4oMSwgTWF0aC5hYnMob3Bwb3NpdGVQb2ludFsxXSAtIHBvaW50WzFdIC0gZGVsdGFZKSkpIC8gc2F2ZWRIZWlnaHQ7XG4gICAgfVxuICAgIGNvbnN0IG5ld1dpZHRoID0gcm91bmQoc2F2ZWRXaWR0aCAqIHJhdGlvWCk7XG4gICAgY29uc3QgbmV3SGVpZ2h0ID0gcm91bmQoc2F2ZWRIZWlnaHQgKiByYXRpb1kpO1xuICAgIHRyYW5zZk9wcG9zaXRlUG9pbnQgPSB0cmFuc2YoLi4uZ2V0T3Bwb3NpdGUobmV3V2lkdGgsIG5ld0hlaWdodCkpO1xuICAgIGNvbnN0IG5ld1ggPSBvcHBvc2l0ZVggLSB0cmFuc2ZPcHBvc2l0ZVBvaW50WzBdO1xuICAgIGNvbnN0IG5ld1kgPSBvcHBvc2l0ZVkgLSB0cmFuc2ZPcHBvc2l0ZVBvaW50WzFdO1xuICAgIHRoaXMud2lkdGggPSBuZXdXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IG5ld0hlaWdodDtcbiAgICB0aGlzLnggPSBuZXdYO1xuICAgIHRoaXMueSA9IG5ld1k7XG4gICAgdGhpcy5zZXREaW1zKHBhcmVudFdpZHRoICogbmV3V2lkdGgsIHBhcmVudEhlaWdodCAqIG5ld0hlaWdodCk7XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICB9XG4gIGFsdFRleHRGaW5pc2goKSB7XG4gICAgdGhpcy4jYWx0VGV4dD8uZmluaXNoKCk7XG4gIH1cbiAgYXN5bmMgYWRkRWRpdFRvb2xiYXIoKSB7XG4gICAgaWYgKHRoaXMuI2VkaXRUb29sYmFyIHx8IHRoaXMuI2lzSW5FZGl0TW9kZSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2VkaXRUb29sYmFyO1xuICAgIH1cbiAgICB0aGlzLiNlZGl0VG9vbGJhciA9IG5ldyBFZGl0b3JUb29sYmFyKHRoaXMpO1xuICAgIHRoaXMuZGl2LmFwcGVuZCh0aGlzLiNlZGl0VG9vbGJhci5yZW5kZXIoKSk7XG4gICAgaWYgKHRoaXMuI2FsdFRleHQpIHtcbiAgICAgIHRoaXMuI2VkaXRUb29sYmFyLmFkZEFsdFRleHRCdXR0b24oYXdhaXQgdGhpcy4jYWx0VGV4dC5yZW5kZXIoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNlZGl0VG9vbGJhcjtcbiAgfVxuICByZW1vdmVFZGl0VG9vbGJhcigpIHtcbiAgICBpZiAoIXRoaXMuI2VkaXRUb29sYmFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2VkaXRUb29sYmFyLnJlbW92ZSgpO1xuICAgIHRoaXMuI2VkaXRUb29sYmFyID0gbnVsbDtcbiAgICB0aGlzLiNhbHRUZXh0Py5kZXN0cm95KCk7XG4gIH1cbiAgZ2V0Q2xpZW50RGltZW5zaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIH1cbiAgYXN5bmMgYWRkQWx0VGV4dEJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy4jYWx0VGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBBbHRUZXh0LmluaXRpYWxpemUoQW5ub3RhdGlvbkVkaXRvci5fbDEwblByb21pc2UpO1xuICAgIHRoaXMuI2FsdFRleHQgPSBuZXcgQWx0VGV4dCh0aGlzKTtcbiAgICBpZiAodGhpcy4jYWNjZXNzaWJpbGl0eURhdGEpIHtcbiAgICAgIHRoaXMuI2FsdFRleHQuZGF0YSA9IHRoaXMuI2FjY2Vzc2liaWxpdHlEYXRhO1xuICAgICAgdGhpcy4jYWNjZXNzaWJpbGl0eURhdGEgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmFkZEVkaXRUb29sYmFyKCk7XG4gIH1cbiAgZ2V0IGFsdFRleHREYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNhbHRUZXh0Py5kYXRhO1xuICB9XG4gIHNldCBhbHRUZXh0RGF0YShkYXRhKSB7XG4gICAgaWYgKCF0aGlzLiNhbHRUZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FsdFRleHQuZGF0YSA9IGRhdGE7XG4gIH1cbiAgaGFzQWx0VGV4dCgpIHtcbiAgICByZXR1cm4gIXRoaXMuI2FsdFRleHQ/LmlzRW1wdHkoKTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtZWRpdG9yLXJvdGF0aW9uXCIsICgzNjAgLSB0aGlzLnJvdGF0aW9uKSAlIDM2MCk7XG4gICAgdGhpcy5kaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lO1xuICAgIHRoaXMuZGl2LnNldEF0dHJpYnV0ZShcImlkXCIsIHRoaXMuaWQpO1xuICAgIHRoaXMuZGl2LnRhYkluZGV4ID0gdGhpcy4jZGlzYWJsZWQgPyAtMSA6IDA7XG4gICAgaWYgKCF0aGlzLl9pc1Zpc2libGUpIHtcbiAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG4gICAgfVxuICAgIHRoaXMuc2V0SW5Gb3JlZ3JvdW5kKCk7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgdGhpcy4jYm91bmRGb2N1c2luLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgdGhpcy4jYm91bmRGb2N1c291dCwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIGlmICh0aGlzLnBhcmVudFJvdGF0aW9uICUgMTgwICE9PSAwKSB7XG4gICAgICB0aGlzLmRpdi5zdHlsZS5tYXhXaWR0aCA9IGAkeygxMDAgKiBwYXJlbnRIZWlnaHQgLyBwYXJlbnRXaWR0aCkudG9GaXhlZCgyKX0lYDtcbiAgICAgIHRoaXMuZGl2LnN0eWxlLm1heEhlaWdodCA9IGAkeygxMDAgKiBwYXJlbnRXaWR0aCAvIHBhcmVudEhlaWdodCkudG9GaXhlZCgyKX0lYDtcbiAgICB9XG4gICAgY29uc3QgW3R4LCB0eV0gPSB0aGlzLmdldEluaXRpYWxUcmFuc2xhdGlvbigpO1xuICAgIHRoaXMudHJhbnNsYXRlKHR4LCB0eSk7XG4gICAgYmluZEV2ZW50cyh0aGlzLCB0aGlzLmRpdiwgW1wicG9pbnRlcmRvd25cIl0pO1xuICAgIHJldHVybiB0aGlzLmRpdjtcbiAgfVxuICBwb2ludGVyZG93bihldmVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTWFjXG4gICAgfSA9IHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5jdHJsS2V5ICYmIGlzTWFjKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNoYXNCZWVuQ2xpY2tlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuX2lzRHJhZ2dhYmxlKSB7XG4gICAgICB0aGlzLiNzZXRVcERyYWdTZXNzaW9uKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jc2VsZWN0T25Qb2ludGVyRXZlbnQoZXZlbnQpO1xuICB9XG4gICNzZWxlY3RPblBvaW50ZXJFdmVudChldmVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTWFjXG4gICAgfSA9IHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgIWlzTWFjIHx8IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50Lm1ldGFLZXkgJiYgaXNNYWMpIHtcbiAgICAgIHRoaXMucGFyZW50LnRvZ2dsZVNlbGVjdGVkKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmVudC5zZXRTZWxlY3RlZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgI3NldFVwRHJhZ1Nlc3Npb24oZXZlbnQpIHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5fdWlNYW5hZ2VyLmlzU2VsZWN0ZWQodGhpcyk7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLnNldFVwRHJhZ1Nlc3Npb24oKTtcbiAgICBsZXQgcG9pbnRlck1vdmVPcHRpb25zLCBwb2ludGVyTW92ZUNhbGxiYWNrO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwibW92aW5nXCIpO1xuICAgICAgcG9pbnRlck1vdmVPcHRpb25zID0ge1xuICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgICBzaWduYWxcbiAgICAgIH07XG4gICAgICB0aGlzLiNwcmV2RHJhZ1ggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy4jcHJldkRyYWdZID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHBvaW50ZXJNb3ZlQ2FsbGJhY2sgPSBlID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGNsaWVudFg6IHgsXG4gICAgICAgICAgY2xpZW50WTogeVxuICAgICAgICB9ID0gZTtcbiAgICAgICAgY29uc3QgW3R4LCB0eV0gPSB0aGlzLnNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKHggLSB0aGlzLiNwcmV2RHJhZ1gsIHkgLSB0aGlzLiNwcmV2RHJhZ1kpO1xuICAgICAgICB0aGlzLiNwcmV2RHJhZ1ggPSB4O1xuICAgICAgICB0aGlzLiNwcmV2RHJhZ1kgPSB5O1xuICAgICAgICB0aGlzLl91aU1hbmFnZXIuZHJhZ1NlbGVjdGVkRWRpdG9ycyh0eCwgdHkpO1xuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgcG9pbnRlck1vdmVDYWxsYmFjaywgcG9pbnRlck1vdmVPcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgcG9pbnRlclVwQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBwb2ludGVyVXBDYWxsYmFjayk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgcG9pbnRlclVwQ2FsbGJhY2spO1xuICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LnJlbW92ZShcIm1vdmluZ1wiKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBwb2ludGVyTW92ZUNhbGxiYWNrLCBwb2ludGVyTW92ZU9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgdGhpcy4jaGFzQmVlbkNsaWNrZWQgPSBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5fdWlNYW5hZ2VyLmVuZERyYWdTZXNzaW9uKCkpIHtcbiAgICAgICAgdGhpcy4jc2VsZWN0T25Qb2ludGVyRXZlbnQoZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlclVwQ2FsbGJhY2ssIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVyVXBDYWxsYmFjaywge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgbW92ZUluRE9NKCkge1xuICAgIGlmICh0aGlzLiNtb3ZlSW5ET01UaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jbW92ZUluRE9NVGltZW91dCk7XG4gICAgfVxuICAgIHRoaXMuI21vdmVJbkRPTVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuI21vdmVJbkRPTVRpbWVvdXQgPSBudWxsO1xuICAgICAgdGhpcy5wYXJlbnQ/Lm1vdmVFZGl0b3JJbkRPTSh0aGlzKTtcbiAgICB9LCAwKTtcbiAgfVxuICBfc2V0UGFyZW50QW5kUG9zaXRpb24ocGFyZW50LCB4LCB5KSB7XG4gICAgcGFyZW50LmNoYW5nZVBhcmVudCh0aGlzKTtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICB9XG4gIGdldFJlY3QodHgsIHR5LCByb3RhdGlvbiA9IHRoaXMucm90YXRpb24pIHtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMucGFyZW50U2NhbGU7XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgIGNvbnN0IFtwYWdlWCwgcGFnZVldID0gdGhpcy5wYWdlVHJhbnNsYXRpb247XG4gICAgY29uc3Qgc2hpZnRYID0gdHggLyBzY2FsZTtcbiAgICBjb25zdCBzaGlmdFkgPSB0eSAvIHNjYWxlO1xuICAgIGNvbnN0IHggPSB0aGlzLnggKiBwYWdlV2lkdGg7XG4gICAgY29uc3QgeSA9IHRoaXMueSAqIHBhZ2VIZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLndpZHRoICogcGFnZVdpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodDtcbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBbeCArIHNoaWZ0WCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSAtIHNoaWZ0WSAtIGhlaWdodCArIHBhZ2VZLCB4ICsgc2hpZnRYICsgd2lkdGggKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgLSBzaGlmdFkgKyBwYWdlWV07XG4gICAgICBjYXNlIDkwOlxuICAgICAgICByZXR1cm4gW3ggKyBzaGlmdFkgKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgKyBzaGlmdFggKyBwYWdlWSwgeCArIHNoaWZ0WSArIGhlaWdodCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSArIHNoaWZ0WCArIHdpZHRoICsgcGFnZVldO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiBbeCAtIHNoaWZ0WCAtIHdpZHRoICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5ICsgc2hpZnRZICsgcGFnZVksIHggLSBzaGlmdFggKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgKyBzaGlmdFkgKyBoZWlnaHQgKyBwYWdlWV07XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgcmV0dXJuIFt4IC0gc2hpZnRZIC0gaGVpZ2h0ICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5IC0gc2hpZnRYIC0gd2lkdGggKyBwYWdlWSwgeCAtIHNoaWZ0WSArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSAtIHNoaWZ0WCArIHBhZ2VZXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG4gICAgfVxuICB9XG4gIGdldFJlY3RJbkN1cnJlbnRDb29yZHMocmVjdCwgcGFnZUhlaWdodCkge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSByZWN0O1xuICAgIGNvbnN0IHdpZHRoID0geDIgLSB4MTtcbiAgICBjb25zdCBoZWlnaHQgPSB5MiAtIHkxO1xuICAgIHN3aXRjaCAodGhpcy5yb3RhdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gW3gxLCBwYWdlSGVpZ2h0IC0geTIsIHdpZHRoLCBoZWlnaHRdO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIFt4MSwgcGFnZUhlaWdodCAtIHkxLCBoZWlnaHQsIHdpZHRoXTtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByZXR1cm4gW3gyLCBwYWdlSGVpZ2h0IC0geTEsIHdpZHRoLCBoZWlnaHRdO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJldHVybiBbeDIsIHBhZ2VIZWlnaHQgLSB5MiwgaGVpZ2h0LCB3aWR0aF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uXCIpO1xuICAgIH1cbiAgfVxuICBvbmNlQWRkZWQoKSB7fVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBlbmFibGVFZGl0TW9kZSgpIHtcbiAgICB0aGlzLiNpc0luRWRpdE1vZGUgPSB0cnVlO1xuICB9XG4gIGRpc2FibGVFZGl0TW9kZSgpIHtcbiAgICB0aGlzLiNpc0luRWRpdE1vZGUgPSBmYWxzZTtcbiAgfVxuICBpc0luRWRpdE1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lzSW5FZGl0TW9kZTtcbiAgfVxuICBzaG91bGRHZXRLZXlib2FyZEV2ZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkO1xuICB9XG4gIG5lZWRzVG9CZVJlYnVpbHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2ICYmICF0aGlzLmlzQXR0YWNoZWRUb0RPTTtcbiAgfVxuICByZWJ1aWxkKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIHRoaXMuZGl2Py5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCB0aGlzLiNib3VuZEZvY3VzaW4sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuZGl2Py5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgdGhpcy4jYm91bmRGb2N1c291dCwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgcm90YXRlKF9hbmdsZSkge31cbiAgc2VyaWFsaXplKGlzRm9yQ29weWluZyA9IGZhbHNlLCBjb250ZXh0ID0gbnVsbCkge1xuICAgIHVucmVhY2hhYmxlKFwiQW4gZWRpdG9yIG11c3QgYmUgc2VyaWFsaXphYmxlXCIpO1xuICB9XG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcikge1xuICAgIGNvbnN0IGVkaXRvciA9IG5ldyB0aGlzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcih7XG4gICAgICBwYXJlbnQsXG4gICAgICBpZDogcGFyZW50LmdldE5leHRJZCgpLFxuICAgICAgdWlNYW5hZ2VyXG4gICAgfSk7XG4gICAgZWRpdG9yLnJvdGF0aW9uID0gZGF0YS5yb3RhdGlvbjtcbiAgICBlZGl0b3IuI2FjY2Vzc2liaWxpdHlEYXRhID0gZGF0YS5hY2Nlc3NpYmlsaXR5RGF0YTtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IGVkaXRvci5wYWdlRGltZW5zaW9ucztcbiAgICBjb25zdCBbeCwgeSwgd2lkdGgsIGhlaWdodF0gPSBlZGl0b3IuZ2V0UmVjdEluQ3VycmVudENvb3JkcyhkYXRhLnJlY3QsIHBhZ2VIZWlnaHQpO1xuICAgIGVkaXRvci54ID0geCAvIHBhZ2VXaWR0aDtcbiAgICBlZGl0b3IueSA9IHkgLyBwYWdlSGVpZ2h0O1xuICAgIGVkaXRvci53aWR0aCA9IHdpZHRoIC8gcGFnZVdpZHRoO1xuICAgIGVkaXRvci5oZWlnaHQgPSBoZWlnaHQgLyBwYWdlSGVpZ2h0O1xuICAgIHJldHVybiBlZGl0b3I7XG4gIH1cbiAgZ2V0IGhhc0JlZW5Nb2RpZmllZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmFubm90YXRpb25FbGVtZW50SWQgJiYgKHRoaXMuZGVsZXRlZCB8fCB0aGlzLnNlcmlhbGl6ZSgpICE9PSBudWxsKTtcbiAgfVxuICByZW1vdmUoKSB7XG4gICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgdGhpcy4jYm91bmRGb2N1c2luKTtcbiAgICB0aGlzLmRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgdGhpcy4jYm91bmRGb2N1c291dCk7XG4gICAgaWYgKCF0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgdGhpcy5jb21taXQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLnBhcmVudC5yZW1vdmUodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5yZW1vdmVFZGl0b3IodGhpcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNtb3ZlSW5ET01UaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jbW92ZUluRE9NVGltZW91dCk7XG4gICAgICB0aGlzLiNtb3ZlSW5ET01UaW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy4jc3RvcFJlc2l6aW5nKCk7XG4gICAgdGhpcy5yZW1vdmVFZGl0VG9vbGJhcigpO1xuICAgIGlmICh0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cykge1xuICAgICAgZm9yIChjb25zdCB0aW1lb3V0IG9mIHRoaXMuI3RlbGVtZXRyeVRpbWVvdXRzLnZhbHVlcygpKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3RlbGVtZXRyeVRpbWVvdXRzID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICB9XG4gIGdldCBpc1Jlc2l6YWJsZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbWFrZVJlc2l6YWJsZSgpIHtcbiAgICBpZiAodGhpcy5pc1Jlc2l6YWJsZSkge1xuICAgICAgdGhpcy4jY3JlYXRlUmVzaXplcnMoKTtcbiAgICAgIHRoaXMuI3Jlc2l6ZXJzRGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG4gICAgICBiaW5kRXZlbnRzKHRoaXMsIHRoaXMuZGl2LCBbXCJrZXlkb3duXCJdKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHRvb2xiYXJQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBrZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzUmVzaXphYmxlIHx8IGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kaXYgfHwgZXZlbnQua2V5ICE9PSBcIkVudGVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdWlNYW5hZ2VyLnNldFNlbGVjdGVkKHRoaXMpO1xuICAgIHRoaXMuI3NhdmVkRGltZW5zaW9ucyA9IHtcbiAgICAgIHNhdmVkWDogdGhpcy54LFxuICAgICAgc2F2ZWRZOiB0aGlzLnksXG4gICAgICBzYXZlZFdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgc2F2ZWRIZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgfTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuI3Jlc2l6ZXJzRGl2LmNoaWxkcmVuO1xuICAgIGlmICghdGhpcy4jYWxsUmVzaXplckRpdnMpIHtcbiAgICAgIHRoaXMuI2FsbFJlc2l6ZXJEaXZzID0gQXJyYXkuZnJvbShjaGlsZHJlbik7XG4gICAgICBjb25zdCBib3VuZFJlc2l6ZXJLZXlkb3duID0gdGhpcy4jcmVzaXplcktleWRvd24uYmluZCh0aGlzKTtcbiAgICAgIGNvbnN0IGJvdW5kUmVzaXplckJsdXIgPSB0aGlzLiNyZXNpemVyQmx1ci5iaW5kKHRoaXMpO1xuICAgICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgICBmb3IgKGNvbnN0IGRpdiBvZiB0aGlzLiNhbGxSZXNpemVyRGl2cykge1xuICAgICAgICBjb25zdCBuYW1lID0gZGl2LmdldEF0dHJpYnV0ZShcImRhdGEtcmVzaXplci1uYW1lXCIpO1xuICAgICAgICBkaXYuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInNwaW5idXR0b25cIik7XG4gICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBib3VuZFJlc2l6ZXJLZXlkb3duLCB7XG4gICAgICAgICAgc2lnbmFsXG4gICAgICAgIH0pO1xuICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgYm91bmRSZXNpemVyQmx1ciwge1xuICAgICAgICAgIHNpZ25hbFxuICAgICAgICB9KTtcbiAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNyZXNpemVyRm9jdXMuYmluZCh0aGlzLCBuYW1lKSwge1xuICAgICAgICAgIHNpZ25hbFxuICAgICAgICB9KTtcbiAgICAgICAgQW5ub3RhdGlvbkVkaXRvci5fbDEwblByb21pc2UuZ2V0KGBwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC0ke25hbWV9YCkudGhlbihtc2cgPT4gZGl2LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgbXNnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy4jYWxsUmVzaXplckRpdnNbMF07XG4gICAgbGV0IGZpcnN0UG9zaXRpb24gPSAwO1xuICAgIGZvciAoY29uc3QgZGl2IG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoZGl2ID09PSBmaXJzdCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGZpcnN0UG9zaXRpb24rKztcbiAgICB9XG4gICAgY29uc3QgbmV4dEZpcnN0UG9zaXRpb24gPSAoMzYwIC0gdGhpcy5yb3RhdGlvbiArIHRoaXMucGFyZW50Um90YXRpb24pICUgMzYwIC8gOTAgKiAodGhpcy4jYWxsUmVzaXplckRpdnMubGVuZ3RoIC8gNCk7XG4gICAgaWYgKG5leHRGaXJzdFBvc2l0aW9uICE9PSBmaXJzdFBvc2l0aW9uKSB7XG4gICAgICBpZiAobmV4dEZpcnN0UG9zaXRpb24gPCBmaXJzdFBvc2l0aW9uKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlyc3RQb3NpdGlvbiAtIG5leHRGaXJzdFBvc2l0aW9uOyBpKyspIHtcbiAgICAgICAgICB0aGlzLiNyZXNpemVyc0Rpdi5hcHBlbmQodGhpcy4jcmVzaXplcnNEaXYuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobmV4dEZpcnN0UG9zaXRpb24gPiBmaXJzdFBvc2l0aW9uKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV4dEZpcnN0UG9zaXRpb24gLSBmaXJzdFBvc2l0aW9uOyBpKyspIHtcbiAgICAgICAgICB0aGlzLiNyZXNpemVyc0Rpdi5maXJzdENoaWxkLmJlZm9yZSh0aGlzLiNyZXNpemVyc0Rpdi5sYXN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGRpdiA9IHRoaXMuI2FsbFJlc2l6ZXJEaXZzW2krK107XG4gICAgICAgIGNvbnN0IG5hbWUgPSBkaXYuZ2V0QXR0cmlidXRlKFwiZGF0YS1yZXNpemVyLW5hbWVcIik7XG4gICAgICAgIEFubm90YXRpb25FZGl0b3IuX2wxMG5Qcm9taXNlLmdldChgcGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtJHtuYW1lfWApLnRoZW4obXNnID0+IGNoaWxkLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgbXNnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI3NldFJlc2l6ZXJUYWJJbmRleCgwKTtcbiAgICB0aGlzLiNpc1Jlc2l6ZXJFbmFibGVkRm9yS2V5Ym9hcmQgPSB0cnVlO1xuICAgIHRoaXMuI3Jlc2l6ZXJzRGl2LmZpcnN0Q2hpbGQuZm9jdXMoe1xuICAgICAgZm9jdXNWaXNpYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfVxuICAjcmVzaXplcktleWRvd24oZXZlbnQpIHtcbiAgICBBbm5vdGF0aW9uRWRpdG9yLl9yZXNpemVyS2V5Ym9hcmRNYW5hZ2VyLmV4ZWModGhpcywgZXZlbnQpO1xuICB9XG4gICNyZXNpemVyQmx1cihldmVudCkge1xuICAgIGlmICh0aGlzLiNpc1Jlc2l6ZXJFbmFibGVkRm9yS2V5Ym9hcmQgJiYgZXZlbnQucmVsYXRlZFRhcmdldD8ucGFyZW50Tm9kZSAhPT0gdGhpcy4jcmVzaXplcnNEaXYpIHtcbiAgICAgIHRoaXMuI3N0b3BSZXNpemluZygpO1xuICAgIH1cbiAgfVxuICAjcmVzaXplckZvY3VzKG5hbWUpIHtcbiAgICB0aGlzLiNmb2N1c2VkUmVzaXplck5hbWUgPSB0aGlzLiNpc1Jlc2l6ZXJFbmFibGVkRm9yS2V5Ym9hcmQgPyBuYW1lIDogXCJcIjtcbiAgfVxuICAjc2V0UmVzaXplclRhYkluZGV4KHZhbHVlKSB7XG4gICAgaWYgKCF0aGlzLiNhbGxSZXNpemVyRGl2cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpdiBvZiB0aGlzLiNhbGxSZXNpemVyRGl2cykge1xuICAgICAgZGl2LnRhYkluZGV4ID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIF9yZXNpemVXaXRoS2V5Ym9hcmQoeCwgeSkge1xuICAgIGlmICghdGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3Jlc2l6ZXJQb2ludGVybW92ZSh0aGlzLiNmb2N1c2VkUmVzaXplck5hbWUsIHtcbiAgICAgIG1vdmVtZW50WDogeCxcbiAgICAgIG1vdmVtZW50WTogeVxuICAgIH0pO1xuICB9XG4gICNzdG9wUmVzaXppbmcoKSB7XG4gICAgdGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkID0gZmFsc2U7XG4gICAgdGhpcy4jc2V0UmVzaXplclRhYkluZGV4KC0xKTtcbiAgICBpZiAodGhpcy4jc2F2ZWREaW1lbnNpb25zKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHNhdmVkWCxcbiAgICAgICAgc2F2ZWRZLFxuICAgICAgICBzYXZlZFdpZHRoLFxuICAgICAgICBzYXZlZEhlaWdodFxuICAgICAgfSA9IHRoaXMuI3NhdmVkRGltZW5zaW9ucztcbiAgICAgIHRoaXMuI2FkZFJlc2l6ZVRvVW5kb1N0YWNrKHNhdmVkWCwgc2F2ZWRZLCBzYXZlZFdpZHRoLCBzYXZlZEhlaWdodCk7XG4gICAgICB0aGlzLiNzYXZlZERpbWVuc2lvbnMgPSBudWxsO1xuICAgIH1cbiAgfVxuICBfc3RvcFJlc2l6aW5nV2l0aEtleWJvYXJkKCkge1xuICAgIHRoaXMuI3N0b3BSZXNpemluZygpO1xuICAgIHRoaXMuZGl2LmZvY3VzKCk7XG4gIH1cbiAgc2VsZWN0KCkge1xuICAgIHRoaXMubWFrZVJlc2l6YWJsZSgpO1xuICAgIHRoaXMuZGl2Py5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRFZGl0b3JcIik7XG4gICAgaWYgKCF0aGlzLiNlZGl0VG9vbGJhcikge1xuICAgICAgdGhpcy5hZGRFZGl0VG9vbGJhcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kaXY/LmNsYXNzTGlzdC5jb250YWlucyhcInNlbGVjdGVkRWRpdG9yXCIpKSB7XG4gICAgICAgICAgdGhpcy4jZWRpdFRvb2xiYXI/LnNob3coKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2VkaXRUb29sYmFyPy5zaG93KCk7XG4gIH1cbiAgdW5zZWxlY3QoKSB7XG4gICAgdGhpcy4jcmVzaXplcnNEaXY/LmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG4gICAgdGhpcy5kaXY/LmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZEVkaXRvclwiKTtcbiAgICBpZiAodGhpcy5kaXY/LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuY3VycmVudExheWVyLmRpdi5mb2N1cyh7XG4gICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLiNlZGl0VG9vbGJhcj8uaGlkZSgpO1xuICB9XG4gIHVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSkge31cbiAgZGlzYWJsZUVkaXRpbmcoKSB7fVxuICBlbmFibGVFZGl0aW5nKCkge31cbiAgZW50ZXJJbkVkaXRNb2RlKCkge31cbiAgZ2V0SW1hZ2VGb3JBbHRUZXh0KCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBjb250ZW50RGl2KCkge1xuICAgIHJldHVybiB0aGlzLmRpdjtcbiAgfVxuICBnZXQgaXNFZGl0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNpc0VkaXRpbmc7XG4gIH1cbiAgc2V0IGlzRWRpdGluZyh2YWx1ZSkge1xuICAgIHRoaXMuI2lzRWRpdGluZyA9IHZhbHVlO1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnBhcmVudC5zZXRTZWxlY3RlZCh0aGlzKTtcbiAgICAgIHRoaXMucGFyZW50LnNldEFjdGl2ZUVkaXRvcih0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJlbnQuc2V0QWN0aXZlRWRpdG9yKG51bGwpO1xuICAgIH1cbiAgfVxuICBzZXRBc3BlY3RSYXRpbyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy4ja2VlcEFzcGVjdFJhdGlvID0gdHJ1ZTtcbiAgICBjb25zdCBhc3BlY3RSYXRpbyA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuZGl2O1xuICAgIHN0eWxlLmFzcGVjdFJhdGlvID0gYXNwZWN0UmF0aW87XG4gICAgc3R5bGUuaGVpZ2h0ID0gXCJhdXRvXCI7XG4gIH1cbiAgc3RhdGljIGdldCBNSU5fU0laRSgpIHtcbiAgICByZXR1cm4gMTY7XG4gIH1cbiAgc3RhdGljIGNhbkNyZWF0ZU5ld0VtcHR5RWRpdG9yKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGdldCB0ZWxlbWV0cnlJbml0aWFsRGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImFkZGVkXCJcbiAgICB9O1xuICB9XG4gIGdldCB0ZWxlbWV0cnlGaW5hbERhdGEoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgX3JlcG9ydFRlbGVtZXRyeShkYXRhLCBtdXN0V2FpdCA9IGZhbHNlKSB7XG4gICAgaWYgKG11c3RXYWl0KSB7XG4gICAgICB0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cyB8fD0gbmV3IE1hcCgpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBhY3Rpb25cbiAgICAgIH0gPSBkYXRhO1xuICAgICAgbGV0IHRpbWVvdXQgPSB0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cy5nZXQoYWN0aW9uKTtcbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIH1cbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVwb3J0VGVsZW1ldHJ5KGRhdGEpO1xuICAgICAgICB0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cy5kZWxldGUoYWN0aW9uKTtcbiAgICAgICAgaWYgKHRoaXMuI3RlbGVtZXRyeVRpbWVvdXRzLnNpemUgPT09IDApIHtcbiAgICAgICAgICB0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0sIEFubm90YXRpb25FZGl0b3IuX3RlbGVtZXRyeVRpbWVvdXQpO1xuICAgICAgdGhpcy4jdGVsZW1ldHJ5VGltZW91dHMuc2V0KGFjdGlvbiwgdGltZW91dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRhdGEudHlwZSB8fD0gdGhpcy5lZGl0b3JUeXBlO1xuICAgIHRoaXMuX3VpTWFuYWdlci5fZXZlbnRCdXMuZGlzcGF0Y2goXCJyZXBvcnR0ZWxlbWV0cnlcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgZGV0YWlsczoge1xuICAgICAgICB0eXBlOiBcImVkaXRpbmdcIixcbiAgICAgICAgZGF0YVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHNob3codmlzaWJsZSA9IHRoaXMuX2lzVmlzaWJsZSkge1xuICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJoaWRkZW5cIiwgIXZpc2libGUpO1xuICAgIHRoaXMuX2lzVmlzaWJsZSA9IHZpc2libGU7XG4gIH1cbiAgZW5hYmxlKCkge1xuICAgIGlmICh0aGlzLmRpdikge1xuICAgICAgdGhpcy5kaXYudGFiSW5kZXggPSAwO1xuICAgIH1cbiAgICB0aGlzLiNkaXNhYmxlZCA9IGZhbHNlO1xuICB9XG4gIGRpc2FibGUoKSB7XG4gICAgaWYgKHRoaXMuZGl2KSB7XG4gICAgICB0aGlzLmRpdi50YWJJbmRleCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLiNkaXNhYmxlZCA9IHRydWU7XG4gIH1cbiAgcmVuZGVyQW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbikge1xuICAgIGxldCBjb250ZW50ID0gYW5ub3RhdGlvbi5jb250YWluZXIucXVlcnlTZWxlY3RvcihcIi5hbm5vdGF0aW9uQ29udGVudFwiKTtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKFwiYW5ub3RhdGlvbkNvbnRlbnRcIiwgdGhpcy5lZGl0b3JUeXBlKTtcbiAgICAgIGFubm90YXRpb24uY29udGFpbmVyLnByZXBlbmQoY29udGVudCk7XG4gICAgfSBlbHNlIGlmIChjb250ZW50Lm5vZGVOYW1lID09PSBcIkNBTlZBU1wiKSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBjb250ZW50O1xuICAgICAgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoXCJhbm5vdGF0aW9uQ29udGVudFwiLCB0aGlzLmVkaXRvclR5cGUpO1xuICAgICAgY2FudmFzLmJlZm9yZShjb250ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgcmVzZXRBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uKSB7XG4gICAgY29uc3Qge1xuICAgICAgZmlyc3RDaGlsZFxuICAgIH0gPSBhbm5vdGF0aW9uLmNvbnRhaW5lcjtcbiAgICBpZiAoZmlyc3RDaGlsZC5ub2RlTmFtZSA9PT0gXCJESVZcIiAmJiBmaXJzdENoaWxkLmNsYXNzTGlzdC5jb250YWlucyhcImFubm90YXRpb25Db250ZW50XCIpKSB7XG4gICAgICBmaXJzdENoaWxkLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgRmFrZUVkaXRvciBleHRlbmRzIEFubm90YXRpb25FZGl0b3Ige1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuICAgIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCA9IHBhcmFtcy5hbm5vdGF0aW9uRWxlbWVudElkO1xuICAgIHRoaXMuZGVsZXRlZCA9IHRydWU7XG4gIH1cbiAgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkLFxuICAgICAgZGVsZXRlZDogdHJ1ZSxcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXhcbiAgICB9O1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9zaGFyZWQvbXVybXVyaGFzaDMuanNcbmNvbnN0IFNFRUQgPSAweGMzZDJlMWYwO1xuY29uc3QgTUFTS19ISUdIID0gMHhmZmZmMDAwMDtcbmNvbnN0IE1BU0tfTE9XID0gMHhmZmZmO1xuY2xhc3MgTXVybXVySGFzaDNfNjQge1xuICBjb25zdHJ1Y3RvcihzZWVkKSB7XG4gICAgdGhpcy5oMSA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7XG4gICAgdGhpcy5oMiA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7XG4gIH1cbiAgdXBkYXRlKGlucHV0KSB7XG4gICAgbGV0IGRhdGEsIGxlbmd0aDtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoICogMik7XG4gICAgICBsZW5ndGggPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5wdXQubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb25zdCBjb2RlID0gaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKGNvZGUgPD0gMHhmZikge1xuICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGUgPj4+IDg7XG4gICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlICYgMHhmZjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0KSkge1xuICAgICAgZGF0YSA9IGlucHV0LnNsaWNlKCk7XG4gICAgICBsZW5ndGggPSBkYXRhLmJ5dGVMZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGF0YSBmb3JtYXQsIG11c3QgYmUgYSBzdHJpbmcgb3IgVHlwZWRBcnJheS5cIik7XG4gICAgfVxuICAgIGNvbnN0IGJsb2NrQ291bnRzID0gbGVuZ3RoID4+IDI7XG4gICAgY29uc3QgdGFpbExlbmd0aCA9IGxlbmd0aCAtIGJsb2NrQ291bnRzICogNDtcbiAgICBjb25zdCBkYXRhVWludDMyID0gbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyLCAwLCBibG9ja0NvdW50cyk7XG4gICAgbGV0IGsxID0gMCxcbiAgICAgIGsyID0gMDtcbiAgICBsZXQgaDEgPSB0aGlzLmgxLFxuICAgICAgaDIgPSB0aGlzLmgyO1xuICAgIGNvbnN0IEMxID0gMHhjYzllMmQ1MSxcbiAgICAgIEMyID0gMHgxYjg3MzU5MztcbiAgICBjb25zdCBDMV9MT1cgPSBDMSAmIE1BU0tfTE9XLFxuICAgICAgQzJfTE9XID0gQzIgJiBNQVNLX0xPVztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2NrQ291bnRzOyBpKyspIHtcbiAgICAgIGlmIChpICYgMSkge1xuICAgICAgICBrMSA9IGRhdGFVaW50MzJbaV07XG4gICAgICAgIGsxID0gazEgKiBDMSAmIE1BU0tfSElHSCB8IGsxICogQzFfTE9XICYgTUFTS19MT1c7XG4gICAgICAgIGsxID0gazEgPDwgMTUgfCBrMSA+Pj4gMTc7XG4gICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7XG4gICAgICAgIGgxIF49IGsxO1xuICAgICAgICBoMSA9IGgxIDw8IDEzIHwgaDEgPj4+IDE5O1xuICAgICAgICBoMSA9IGgxICogNSArIDB4ZTY1NDZiNjQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrMiA9IGRhdGFVaW50MzJbaV07XG4gICAgICAgIGsyID0gazIgKiBDMSAmIE1BU0tfSElHSCB8IGsyICogQzFfTE9XICYgTUFTS19MT1c7XG4gICAgICAgIGsyID0gazIgPDwgMTUgfCBrMiA+Pj4gMTc7XG4gICAgICAgIGsyID0gazIgKiBDMiAmIE1BU0tfSElHSCB8IGsyICogQzJfTE9XICYgTUFTS19MT1c7XG4gICAgICAgIGgyIF49IGsyO1xuICAgICAgICBoMiA9IGgyIDw8IDEzIHwgaDIgPj4+IDE5O1xuICAgICAgICBoMiA9IGgyICogNSArIDB4ZTY1NDZiNjQ7XG4gICAgICB9XG4gICAgfVxuICAgIGsxID0gMDtcbiAgICBzd2l0Y2ggKHRhaWxMZW5ndGgpIHtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDQgKyAyXSA8PCAxNjtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDQgKyAxXSA8PCA4O1xuICAgICAgY2FzZSAxOlxuICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNF07XG4gICAgICAgIGsxID0gazEgKiBDMSAmIE1BU0tfSElHSCB8IGsxICogQzFfTE9XICYgTUFTS19MT1c7XG4gICAgICAgIGsxID0gazEgPDwgMTUgfCBrMSA+Pj4gMTc7XG4gICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7XG4gICAgICAgIGlmIChibG9ja0NvdW50cyAmIDEpIHtcbiAgICAgICAgICBoMSBePSBrMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoMiBePSBrMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmgxID0gaDE7XG4gICAgdGhpcy5oMiA9IGgyO1xuICB9XG4gIGhleGRpZ2VzdCgpIHtcbiAgICBsZXQgaDEgPSB0aGlzLmgxLFxuICAgICAgaDIgPSB0aGlzLmgyO1xuICAgIGgxIF49IGgyID4+PiAxO1xuICAgIGgxID0gaDEgKiAweGVkNTU4Y2NkICYgTUFTS19ISUdIIHwgaDEgKiAweDhjY2QgJiBNQVNLX0xPVztcbiAgICBoMiA9IGgyICogMHhmZjUxYWZkNyAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhhZmQ3ZWQ1NSAmIE1BU0tfSElHSCkgPj4+IDE2O1xuICAgIGgxIF49IGgyID4+PiAxO1xuICAgIGgxID0gaDEgKiAweDFhODVlYzUzICYgTUFTS19ISUdIIHwgaDEgKiAweGVjNTMgJiBNQVNLX0xPVztcbiAgICBoMiA9IGgyICogMHhjNGNlYjlmZSAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhiOWZlMWE4NSAmIE1BU0tfSElHSCkgPj4+IDE2O1xuICAgIGgxIF49IGgyID4+PiAxO1xuICAgIHJldHVybiAoaDEgPj4+IDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCBcIjBcIikgKyAoaDIgPj4+IDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCBcIjBcIik7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvYW5ub3RhdGlvbl9zdG9yYWdlLmpzXG5cblxuXG5jb25zdCBTZXJpYWxpemFibGVFbXB0eSA9IE9iamVjdC5mcmVlemUoe1xuICBtYXA6IG51bGwsXG4gIGhhc2g6IFwiXCIsXG4gIHRyYW5zZmVyOiB1bmRlZmluZWRcbn0pO1xuY2xhc3MgQW5ub3RhdGlvblN0b3JhZ2Uge1xuICAjbW9kaWZpZWQgPSBmYWxzZTtcbiAgI3N0b3JhZ2UgPSBuZXcgTWFwKCk7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMub25TZXRNb2RpZmllZCA9IG51bGw7XG4gICAgdGhpcy5vblJlc2V0TW9kaWZpZWQgPSBudWxsO1xuICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID0gbnVsbDtcbiAgfVxuICBnZXRWYWx1ZShrZXksIGRlZmF1bHRWYWx1ZSkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jc3RvcmFnZS5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZGVmYXVsdFZhbHVlLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0UmF3VmFsdWUoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0b3JhZ2UuZ2V0KGtleSk7XG4gIH1cbiAgcmVtb3ZlKGtleSkge1xuICAgIHRoaXMuI3N0b3JhZ2UuZGVsZXRlKGtleSk7XG4gICAgaWYgKHRoaXMuI3N0b3JhZ2Uuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5yZXNldE1vZGlmaWVkKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5vbkFubm90YXRpb25FZGl0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLiNzdG9yYWdlLnZhbHVlcygpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFubm90YXRpb25FZGl0b3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKG51bGwpO1xuICAgIH1cbiAgfVxuICBzZXRWYWx1ZShrZXksIHZhbHVlKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy4jc3RvcmFnZS5nZXQoa2V5KTtcbiAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTtcbiAgICBpZiAob2JqICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3QgW2VudHJ5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICBpZiAob2JqW2VudHJ5XSAhPT0gdmFsKSB7XG4gICAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICAgIG9ialtlbnRyeV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbW9kaWZpZWQgPSB0cnVlO1xuICAgICAgdGhpcy4jc3RvcmFnZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChtb2RpZmllZCkge1xuICAgICAgdGhpcy4jc2V0TW9kaWZpZWQoKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQW5ub3RhdGlvbkVkaXRvciAmJiB0eXBlb2YgdGhpcy5vbkFubm90YXRpb25FZGl0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5vbkFubm90YXRpb25FZGl0b3IodmFsdWUuY29uc3RydWN0b3IuX3R5cGUpO1xuICAgIH1cbiAgfVxuICBoYXMoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0b3JhZ2UuaGFzKGtleSk7XG4gIH1cbiAgZ2V0QWxsKCkge1xuICAgIHJldHVybiB0aGlzLiNzdG9yYWdlLnNpemUgPiAwID8gb2JqZWN0RnJvbU1hcCh0aGlzLiNzdG9yYWdlKSA6IG51bGw7XG4gIH1cbiAgc2V0QWxsKG9iaikge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICB0aGlzLnNldFZhbHVlKGtleSwgdmFsKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0b3JhZ2Uuc2l6ZTtcbiAgfVxuICAjc2V0TW9kaWZpZWQoKSB7XG4gICAgaWYgKCF0aGlzLiNtb2RpZmllZCkge1xuICAgICAgdGhpcy4jbW9kaWZpZWQgPSB0cnVlO1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uU2V0TW9kaWZpZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aGlzLm9uU2V0TW9kaWZpZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVzZXRNb2RpZmllZCgpIHtcbiAgICBpZiAodGhpcy4jbW9kaWZpZWQpIHtcbiAgICAgIHRoaXMuI21vZGlmaWVkID0gZmFsc2U7XG4gICAgICBpZiAodHlwZW9mIHRoaXMub25SZXNldE1vZGlmaWVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhpcy5vblJlc2V0TW9kaWZpZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0IHByaW50KCkge1xuICAgIHJldHVybiBuZXcgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSh0aGlzKTtcbiAgfVxuICBnZXQgc2VyaWFsaXphYmxlKCkge1xuICAgIGlmICh0aGlzLiNzdG9yYWdlLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBTZXJpYWxpemFibGVFbXB0eTtcbiAgICB9XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcCgpLFxuICAgICAgaGFzaCA9IG5ldyBNdXJtdXJIYXNoM182NCgpLFxuICAgICAgdHJhbnNmZXIgPSBbXTtcbiAgICBjb25zdCBjb250ZXh0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgaGFzQml0bWFwID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMuI3N0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB2YWwgaW5zdGFuY2VvZiBBbm5vdGF0aW9uRWRpdG9yID8gdmFsLnNlcmlhbGl6ZShmYWxzZSwgY29udGV4dCkgOiB2YWw7XG4gICAgICBpZiAoc2VyaWFsaXplZCkge1xuICAgICAgICBtYXAuc2V0KGtleSwgc2VyaWFsaXplZCk7XG4gICAgICAgIGhhc2gudXBkYXRlKGAke2tleX06JHtKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKX1gKTtcbiAgICAgICAgaGFzQml0bWFwIHx8PSAhIXNlcmlhbGl6ZWQuYml0bWFwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzQml0bWFwKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG1hcC52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodmFsdWUuYml0bWFwKSB7XG4gICAgICAgICAgdHJhbnNmZXIucHVzaCh2YWx1ZS5iaXRtYXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXAuc2l6ZSA+IDAgPyB7XG4gICAgICBtYXAsXG4gICAgICBoYXNoOiBoYXNoLmhleGRpZ2VzdCgpLFxuICAgICAgdHJhbnNmZXJcbiAgICB9IDogU2VyaWFsaXphYmxlRW1wdHk7XG4gIH1cbiAgZ2V0IGVkaXRvclN0YXRzKCkge1xuICAgIGxldCBzdGF0cyA9IG51bGw7XG4gICAgY29uc3QgdHlwZVRvRWRpdG9yID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy4jc3RvcmFnZS52YWx1ZXMoKSkge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uRWRpdG9yKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVkaXRvclN0YXRzID0gdmFsdWUudGVsZW1ldHJ5RmluYWxEYXRhO1xuICAgICAgaWYgKCFlZGl0b3JTdGF0cykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdHlwZVxuICAgICAgfSA9IGVkaXRvclN0YXRzO1xuICAgICAgaWYgKCF0eXBlVG9FZGl0b3IuaGFzKHR5cGUpKSB7XG4gICAgICAgIHR5cGVUb0VkaXRvci5zZXQodHlwZSwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKS5jb25zdHJ1Y3Rvcik7XG4gICAgICB9XG4gICAgICBzdGF0cyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGNvbnN0IG1hcCA9IHN0YXRzW3R5cGVdIHx8PSBuZXcgTWFwKCk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoZWRpdG9yU3RhdHMpKSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvdW50ZXJzID0gbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWNvdW50ZXJzKSB7XG4gICAgICAgICAgY291bnRlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgbWFwLnNldChrZXksIGNvdW50ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb3VudCA9IGNvdW50ZXJzLmdldCh2YWwpID8/IDA7XG4gICAgICAgIGNvdW50ZXJzLnNldCh2YWwsIGNvdW50ICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3R5cGUsIGVkaXRvcl0gb2YgdHlwZVRvRWRpdG9yKSB7XG4gICAgICBzdGF0c1t0eXBlXSA9IGVkaXRvci5jb21wdXRlVGVsZW1ldHJ5RmluYWxEYXRhKHN0YXRzW3R5cGVdKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRzO1xuICB9XG59XG5jbGFzcyBQcmludEFubm90YXRpb25TdG9yYWdlIGV4dGVuZHMgQW5ub3RhdGlvblN0b3JhZ2Uge1xuICAjc2VyaWFsaXphYmxlO1xuICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICBzdXBlcigpO1xuICAgIGNvbnN0IHtcbiAgICAgIG1hcCxcbiAgICAgIGhhc2gsXG4gICAgICB0cmFuc2ZlclxuICAgIH0gPSBwYXJlbnQuc2VyaWFsaXphYmxlO1xuICAgIGNvbnN0IGNsb25lID0gc3RydWN0dXJlZENsb25lKG1hcCwgdHJhbnNmZXIgPyB7XG4gICAgICB0cmFuc2ZlclxuICAgIH0gOiBudWxsKTtcbiAgICB0aGlzLiNzZXJpYWxpemFibGUgPSB7XG4gICAgICBtYXA6IGNsb25lLFxuICAgICAgaGFzaCxcbiAgICAgIHRyYW5zZmVyXG4gICAgfTtcbiAgfVxuICBnZXQgcHJpbnQoKSB7XG4gICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZS5wcmludFwiKTtcbiAgfVxuICBnZXQgc2VyaWFsaXphYmxlKCkge1xuICAgIHJldHVybiB0aGlzLiNzZXJpYWxpemFibGU7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZm9udF9sb2FkZXIuanNcblxuY2xhc3MgRm9udExvYWRlciB7XG4gICNzeXN0ZW1Gb250cyA9IG5ldyBTZXQoKTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50LFxuICAgIHN0eWxlRWxlbWVudCA9IG51bGxcbiAgfSkge1xuICAgIHRoaXMuX2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDtcbiAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnN0eWxlRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5sb2FkaW5nUmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLmxvYWRUZXN0Rm9udElkID0gMDtcbiAgfVxuICBhZGROYXRpdmVGb250RmFjZShuYXRpdmVGb250RmFjZSkge1xuICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLmFkZChuYXRpdmVGb250RmFjZSk7XG4gICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuYWRkKG5hdGl2ZUZvbnRGYWNlKTtcbiAgfVxuICByZW1vdmVOYXRpdmVGb250RmFjZShuYXRpdmVGb250RmFjZSkge1xuICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLmRlbGV0ZShuYXRpdmVGb250RmFjZSk7XG4gICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuZGVsZXRlKG5hdGl2ZUZvbnRGYWNlKTtcbiAgfVxuICBpbnNlcnRSdWxlKHJ1bGUpIHtcbiAgICBpZiAoIXRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICAgIHRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF0uYXBwZW5kKHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gICAgY29uc3Qgc3R5bGVTaGVldCA9IHRoaXMuc3R5bGVFbGVtZW50LnNoZWV0O1xuICAgIHN0eWxlU2hlZXQuaW5zZXJ0UnVsZShydWxlLCBzdHlsZVNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgZm9yIChjb25zdCBuYXRpdmVGb250RmFjZSBvZiB0aGlzLm5hdGl2ZUZvbnRGYWNlcykge1xuICAgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuZGVsZXRlKG5hdGl2ZUZvbnRGYWNlKTtcbiAgICB9XG4gICAgdGhpcy5uYXRpdmVGb250RmFjZXMuY2xlYXIoKTtcbiAgICB0aGlzLiNzeXN0ZW1Gb250cy5jbGVhcigpO1xuICAgIGlmICh0aGlzLnN0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG4gIGFzeW5jIGxvYWRTeXN0ZW1Gb250KHtcbiAgICBzeXN0ZW1Gb250SW5mbzogaW5mbyxcbiAgICBfaW5zcGVjdEZvbnRcbiAgfSkge1xuICAgIGlmICghaW5mbyB8fCB0aGlzLiNzeXN0ZW1Gb250cy5oYXMoaW5mby5sb2FkZWROYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhc3NlcnQoIXRoaXMuZGlzYWJsZUZvbnRGYWNlLCBcImxvYWRTeXN0ZW1Gb250IHNob3VsZG4ndCBiZSBjYWxsZWQgd2hlbiBgZGlzYWJsZUZvbnRGYWNlYCBpcyBzZXQuXCIpO1xuICAgIGlmICh0aGlzLmlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbG9hZGVkTmFtZSxcbiAgICAgICAgc3JjLFxuICAgICAgICBzdHlsZVxuICAgICAgfSA9IGluZm87XG4gICAgICBjb25zdCBmb250RmFjZSA9IG5ldyBGb250RmFjZShsb2FkZWROYW1lLCBzcmMsIHN0eWxlKTtcbiAgICAgIHRoaXMuYWRkTmF0aXZlRm9udEZhY2UoZm9udEZhY2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZm9udEZhY2UubG9hZCgpO1xuICAgICAgICB0aGlzLiNzeXN0ZW1Gb250cy5hZGQobG9hZGVkTmFtZSk7XG4gICAgICAgIF9pbnNwZWN0Rm9udD8uKGluZm8pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHdhcm4oYENhbm5vdCBsb2FkIHN5c3RlbSBmb250OiAke2luZm8uYmFzZUZvbnROYW1lfSwgaW5zdGFsbGluZyBpdCBjb3VsZCBoZWxwIHRvIGltcHJvdmUgUERGIHJlbmRlcmluZy5gKTtcbiAgICAgICAgdGhpcy5yZW1vdmVOYXRpdmVGb250RmFjZShmb250RmFjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHVucmVhY2hhYmxlKFwiTm90IGltcGxlbWVudGVkOiBsb2FkU3lzdGVtRm9udCB3aXRob3V0IHRoZSBGb250IExvYWRpbmcgQVBJLlwiKTtcbiAgfVxuICBhc3luYyBiaW5kKGZvbnQpIHtcbiAgICBpZiAoZm9udC5hdHRhY2hlZCB8fCBmb250Lm1pc3NpbmdGaWxlICYmICFmb250LnN5c3RlbUZvbnRJbmZvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvbnQuYXR0YWNoZWQgPSB0cnVlO1xuICAgIGlmIChmb250LnN5c3RlbUZvbnRJbmZvKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRTeXN0ZW1Gb250KGZvbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKSB7XG4gICAgICBjb25zdCBuYXRpdmVGb250RmFjZSA9IGZvbnQuY3JlYXRlTmF0aXZlRm9udEZhY2UoKTtcbiAgICAgIGlmIChuYXRpdmVGb250RmFjZSkge1xuICAgICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBuYXRpdmVGb250RmFjZS5sb2FkZWQ7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgd2FybihgRmFpbGVkIHRvIGxvYWQgZm9udCAnJHtuYXRpdmVGb250RmFjZS5mYW1pbHl9JzogJyR7ZXh9Jy5gKTtcbiAgICAgICAgICBmb250LmRpc2FibGVGb250RmFjZSA9IHRydWU7XG4gICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcnVsZSA9IGZvbnQuY3JlYXRlRm9udEZhY2VSdWxlKCk7XG4gICAgaWYgKHJ1bGUpIHtcbiAgICAgIHRoaXMuaW5zZXJ0UnVsZShydWxlKTtcbiAgICAgIGlmICh0aGlzLmlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5fcXVldWVMb2FkaW5nQ2FsbGJhY2socmVzb2x2ZSk7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVGb250TG9hZEV2ZW50KGZvbnQsIHJlcXVlc3QpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGdldCBpc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKCkge1xuICAgIGNvbnN0IGhhc0ZvbnRzID0gISF0aGlzLl9kb2N1bWVudD8uZm9udHM7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWRcIiwgaGFzRm9udHMpO1xuICB9XG4gIGdldCBpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCgpIHtcbiAgICBsZXQgc3VwcG9ydGVkID0gZmFsc2U7XG4gICAgaWYgKGlzTm9kZUpTKSB7XG4gICAgICBzdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgbmF2aWdhdG9yPy51c2VyQWdlbnQgPT09IFwic3RyaW5nXCIgJiYgL01vemlsbGFcXC81LjAuKj9ydjpcXGQrLio/IEdlY2tvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICBzdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWRcIiwgc3VwcG9ydGVkKTtcbiAgfVxuICBfcXVldWVMb2FkaW5nQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICBmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoKSB7XG4gICAgICBhc3NlcnQoIXJlcXVlc3QuZG9uZSwgXCJjb21wbGV0ZVJlcXVlc3QoKSBjYW5ub3QgYmUgY2FsbGVkIHR3aWNlLlwiKTtcbiAgICAgIHJlcXVlc3QuZG9uZSA9IHRydWU7XG4gICAgICB3aGlsZSAobG9hZGluZ1JlcXVlc3RzLmxlbmd0aCA+IDAgJiYgbG9hZGluZ1JlcXVlc3RzWzBdLmRvbmUpIHtcbiAgICAgICAgY29uc3Qgb3RoZXJSZXF1ZXN0ID0gbG9hZGluZ1JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIHNldFRpbWVvdXQob3RoZXJSZXF1ZXN0LmNhbGxiYWNrLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgbG9hZGluZ1JlcXVlc3RzXG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgY29tcGxldGU6IGNvbXBsZXRlUmVxdWVzdCxcbiAgICAgIGNhbGxiYWNrXG4gICAgfTtcbiAgICBsb2FkaW5nUmVxdWVzdHMucHVzaChyZXF1ZXN0KTtcbiAgICByZXR1cm4gcmVxdWVzdDtcbiAgfVxuICBnZXQgX2xvYWRUZXN0Rm9udCgpIHtcbiAgICBjb25zdCB0ZXN0Rm9udCA9IGF0b2IoXCJUMVJVVHdBTEFJQUFBd0F3UTBaR0lESHRaZzRBQUFPWUFBQUFnVVpHVkUxbGt6WndBQUFFSEFBQUFCeEhSRVZHQUJRQVwiICsgXCJGUUFBQkRnQUFBQWVUMU12TWxZTll3a0FBQUVnQUFBQVlHTnRZWEFCRFFMVUFBQUNOQUFBQVVKb1pXRmsveFZGRFFBQVwiICsgXCJBTHdBQUFBMmFHaGxZUWRrQStvQUFBRDBBQUFBSkdodGRIZ0Q2QUFBQUFBRVdBQUFBQVp0WVhod0FBSlFBQUFBQVJnQVwiICsgXCJBQUFHYm1GdFpWam1kSDRBQUFHQUFBQUFzWEJ2YzNUL2hnQXpBQUFEZUFBQUFDQUFBUUFBQUFFQUFMWlJGc1JmRHp6MVwiICsgXCJBQXNENkFBQUFBRE9CT1RMQUFBQUFNNEtIRHdBQUFBQUErZ0RJUUFBQUFnQUFnQUFBQUFBQUFBQkFBQURJUUFBQUZvRFwiICsgXCI2QUFBQUFBRDZBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFVQUFBQWdBQUFBUUQ2QUgwQUFVQUFBS0tBcndBQUFDTVwiICsgXCJBb29DdkFBQUFlQUFNUUVDQUFBQ0FBWUpBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUZCbVJXUUF3QUF1QUM0RFwiICsgXCJJUDg0QUZvRElRQUFBQUFBQVFBQUFBQUFBQUFBQUNBQUlBQUJBQUFBRGdDdUFBRUFBQUFBQUFBQUFRQUFBQUVBQUFBQVwiICsgXCJBQUVBQVFBQUFBRUFBQUFBQUFJQUFRQUFBQUVBQUFBQUFBTUFBUUFBQUFFQUFBQUFBQVFBQVFBQUFBRUFBQUFBQUFVQVwiICsgXCJBUUFBQUFFQUFBQUFBQVlBQVFBQUFBTUFBUVFKQUFBQUFnQUJBQU1BQVFRSkFBRUFBZ0FCQUFNQUFRUUpBQUlBQWdBQlwiICsgXCJBQU1BQVFRSkFBTUFBZ0FCQUFNQUFRUUpBQVFBQWdBQkFBTUFBUVFKQUFVQUFnQUJBQU1BQVFRSkFBWUFBZ0FCV0FCWVwiICsgXCJBQUFBQUFBQUF3QUFBQU1BQUFBY0FBRUFBQUFBQUR3QUF3QUJBQUFBSEFBRUFDQUFBQUFFQUFRQUFRQUFBQzcvL3dBQVwiICsgXCJBQzcvLy8vVEFBRUFBQUFBQUFBQkJnQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNQUFBQUFBQUQvZ3dBeUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFCQUFRRUFBRUJBUUpZQUFFQkFTSDREd0Q0R3dIRUF2Z2NBL2dYQkl3TUFZdUwrbno1dFFYa0Q1ajNDQkxuRVFBQ1wiICsgXCJBUUVCSVZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlBQUFCQVFBQUR3QUNBUUVFRS90M1wiICsgXCJEb3Y2ZkFINmZBVCtmUHA4K253SERvc01Ddm0xQ3ZtMURBejZmQlFBQUFBQUFBQUJBQUFBQU1tSmJ6RUFBQUFBemdUalwiICsgXCJGUUFBQUFET0JPUXBBQUVBQUFBQUFBQUFEQUFVQUFRQUFBQUJBQUFBQWdBQkFBQUFBQUFBQUFBRDZBQUFBQUFBQUE9PVwiKTtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2xvYWRUZXN0Rm9udFwiLCB0ZXN0Rm9udCk7XG4gIH1cbiAgX3ByZXBhcmVGb250TG9hZEV2ZW50KGZvbnQsIHJlcXVlc3QpIHtcbiAgICBmdW5jdGlvbiBpbnQzMihkYXRhLCBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0KSA8PCAyNCB8IGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAxKSA8PCAxNiB8IGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAyKSA8PCA4IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDMpICYgMHhmZjtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3BsaWNlU3RyaW5nKHMsIG9mZnNldCwgcmVtb3ZlLCBpbnNlcnQpIHtcbiAgICAgIGNvbnN0IGNodW5rMSA9IHMuc3Vic3RyaW5nKDAsIG9mZnNldCk7XG4gICAgICBjb25zdCBjaHVuazIgPSBzLnN1YnN0cmluZyhvZmZzZXQgKyByZW1vdmUpO1xuICAgICAgcmV0dXJuIGNodW5rMSArIGluc2VydCArIGNodW5rMjtcbiAgICB9XG4gICAgbGV0IGksIGlpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY2FudmFzLndpZHRoID0gMTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gMTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGxldCBjYWxsZWQgPSAwO1xuICAgIGZ1bmN0aW9uIGlzRm9udFJlYWR5KG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoKytjYWxsZWQgPiAzMCkge1xuICAgICAgICB3YXJuKFwiTG9hZCB0ZXN0IGZvbnQgbmV2ZXIgbG9hZGVkLlwiKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3R4LmZvbnQgPSBcIjMwcHggXCIgKyBuYW1lO1xuICAgICAgY3R4LmZpbGxUZXh0KFwiLlwiLCAwLCAyMCk7XG4gICAgICBjb25zdCBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpO1xuICAgICAgaWYgKGltYWdlRGF0YS5kYXRhWzNdID4gMCkge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KGlzRm9udFJlYWR5LmJpbmQobnVsbCwgbmFtZSwgY2FsbGJhY2spKTtcbiAgICB9XG4gICAgY29uc3QgbG9hZFRlc3RGb250SWQgPSBgbHQke0RhdGUubm93KCl9JHt0aGlzLmxvYWRUZXN0Rm9udElkKyt9YDtcbiAgICBsZXQgZGF0YSA9IHRoaXMuX2xvYWRUZXN0Rm9udDtcbiAgICBjb25zdCBDT01NRU5UX09GRlNFVCA9IDk3NjtcbiAgICBkYXRhID0gc3BsaWNlU3RyaW5nKGRhdGEsIENPTU1FTlRfT0ZGU0VULCBsb2FkVGVzdEZvbnRJZC5sZW5ndGgsIGxvYWRUZXN0Rm9udElkKTtcbiAgICBjb25zdCBDRkZfQ0hFQ0tTVU1fT0ZGU0VUID0gMTY7XG4gICAgY29uc3QgWFhYWF9WQUxVRSA9IDB4NTg1ODU4NTg7XG4gICAgbGV0IGNoZWNrc3VtID0gaW50MzIoZGF0YSwgQ0ZGX0NIRUNLU1VNX09GRlNFVCk7XG4gICAgZm9yIChpID0gMCwgaWkgPSBsb2FkVGVzdEZvbnRJZC5sZW5ndGggLSAzOyBpIDwgaWk7IGkgKz0gNCkge1xuICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSAtIFhYWFhfVkFMVUUgKyBpbnQzMihsb2FkVGVzdEZvbnRJZCwgaSkgfCAwO1xuICAgIH1cbiAgICBpZiAoaSA8IGxvYWRUZXN0Rm9udElkLmxlbmd0aCkge1xuICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSAtIFhYWFhfVkFMVUUgKyBpbnQzMihsb2FkVGVzdEZvbnRJZCArIFwiWFhYXCIsIGkpIHwgMDtcbiAgICB9XG4gICAgZGF0YSA9IHNwbGljZVN0cmluZyhkYXRhLCBDRkZfQ0hFQ0tTVU1fT0ZGU0VULCA0LCBzdHJpbmczMihjaGVja3N1bSkpO1xuICAgIGNvbnN0IHVybCA9IGB1cmwoZGF0YTpmb250L29wZW50eXBlO2Jhc2U2NCwke2J0b2EoZGF0YSl9KTtgO1xuICAgIGNvbnN0IHJ1bGUgPSBgQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XCIke2xvYWRUZXN0Rm9udElkfVwiO3NyYzoke3VybH19YDtcbiAgICB0aGlzLmluc2VydFJ1bGUocnVsZSk7XG4gICAgY29uc3QgZGl2ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXYuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgZGl2LnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLmhlaWdodCA9IFwiMTBweFwiO1xuICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICBkaXYuc3R5bGUudG9wID0gZGl2LnN0eWxlLmxlZnQgPSBcIjBweFwiO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBbZm9udC5sb2FkZWROYW1lLCBsb2FkVGVzdEZvbnRJZF0pIHtcbiAgICAgIGNvbnN0IHNwYW4gPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBcIkhpXCI7XG4gICAgICBzcGFuLnN0eWxlLmZvbnRGYW1pbHkgPSBuYW1lO1xuICAgICAgZGl2LmFwcGVuZChzcGFuKTtcbiAgICB9XG4gICAgdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmQoZGl2KTtcbiAgICBpc0ZvbnRSZWFkeShsb2FkVGVzdEZvbnRJZCwgKCkgPT4ge1xuICAgICAgZGl2LnJlbW92ZSgpO1xuICAgICAgcmVxdWVzdC5jb21wbGV0ZSgpO1xuICAgIH0pO1xuICB9XG59XG5jbGFzcyBGb250RmFjZU9iamVjdCB7XG4gIGNvbnN0cnVjdG9yKHRyYW5zbGF0ZWREYXRhLCB7XG4gICAgZGlzYWJsZUZvbnRGYWNlID0gZmFsc2UsXG4gICAgaW5zcGVjdEZvbnQgPSBudWxsXG4gIH0pIHtcbiAgICB0aGlzLmNvbXBpbGVkR2x5cGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGNvbnN0IGkgaW4gdHJhbnNsYXRlZERhdGEpIHtcbiAgICAgIHRoaXNbaV0gPSB0cmFuc2xhdGVkRGF0YVtpXTtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlRm9udEZhY2UgPSBkaXNhYmxlRm9udEZhY2UgPT09IHRydWU7XG4gICAgdGhpcy5faW5zcGVjdEZvbnQgPSBpbnNwZWN0Rm9udDtcbiAgfVxuICBjcmVhdGVOYXRpdmVGb250RmFjZSgpIHtcbiAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRpc2FibGVGb250RmFjZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCBuYXRpdmVGb250RmFjZTtcbiAgICBpZiAoIXRoaXMuY3NzRm9udEluZm8pIHtcbiAgICAgIG5hdGl2ZUZvbnRGYWNlID0gbmV3IEZvbnRGYWNlKHRoaXMubG9hZGVkTmFtZSwgdGhpcy5kYXRhLCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNzcyA9IHtcbiAgICAgICAgd2VpZ2h0OiB0aGlzLmNzc0ZvbnRJbmZvLmZvbnRXZWlnaHRcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZSkge1xuICAgICAgICBjc3Muc3R5bGUgPSBgb2JsaXF1ZSAke3RoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGV9ZGVnYDtcbiAgICAgIH1cbiAgICAgIG5hdGl2ZUZvbnRGYWNlID0gbmV3IEZvbnRGYWNlKHRoaXMuY3NzRm9udEluZm8uZm9udEZhbWlseSwgdGhpcy5kYXRhLCBjc3MpO1xuICAgIH1cbiAgICB0aGlzLl9pbnNwZWN0Rm9udD8uKHRoaXMpO1xuICAgIHJldHVybiBuYXRpdmVGb250RmFjZTtcbiAgfVxuICBjcmVhdGVGb250RmFjZVJ1bGUoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kaXNhYmxlRm9udEZhY2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYnl0ZXNUb1N0cmluZyh0aGlzLmRhdGEpO1xuICAgIGNvbnN0IHVybCA9IGB1cmwoZGF0YToke3RoaXMubWltZXR5cGV9O2Jhc2U2NCwke2J0b2EoZGF0YSl9KTtgO1xuICAgIGxldCBydWxlO1xuICAgIGlmICghdGhpcy5jc3NGb250SW5mbykge1xuICAgICAgcnVsZSA9IGBAZm9udC1mYWNlIHtmb250LWZhbWlseTpcIiR7dGhpcy5sb2FkZWROYW1lfVwiO3NyYzoke3VybH19YDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNzcyA9IGBmb250LXdlaWdodDogJHt0aGlzLmNzc0ZvbnRJbmZvLmZvbnRXZWlnaHR9O2A7XG4gICAgICBpZiAodGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZSkge1xuICAgICAgICBjc3MgKz0gYGZvbnQtc3R5bGU6IG9ibGlxdWUgJHt0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlfWRlZztgO1xuICAgICAgfVxuICAgICAgcnVsZSA9IGBAZm9udC1mYWNlIHtmb250LWZhbWlseTpcIiR7dGhpcy5jc3NGb250SW5mby5mb250RmFtaWx5fVwiOyR7Y3NzfXNyYzoke3VybH19YDtcbiAgICB9XG4gICAgdGhpcy5faW5zcGVjdEZvbnQ/Lih0aGlzLCB1cmwpO1xuICAgIHJldHVybiBydWxlO1xuICB9XG4gIGdldFBhdGhHZW5lcmF0b3Iob2JqcywgY2hhcmFjdGVyKSB7XG4gICAgaWYgKHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdO1xuICAgIH1cbiAgICBsZXQgY21kcztcbiAgICB0cnkge1xuICAgICAgY21kcyA9IG9ianMuZ2V0KHRoaXMubG9hZGVkTmFtZSArIFwiX3BhdGhfXCIgKyBjaGFyYWN0ZXIpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB3YXJuKGBnZXRQYXRoR2VuZXJhdG9yIC0gaWdub3JpbmcgY2hhcmFjdGVyOiBcIiR7ZXh9XCIuYCk7XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjbWRzKSB8fCBjbWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSA9IGZ1bmN0aW9uIChjLCBzaXplKSB7fTtcbiAgICB9XG4gICAgY29uc3QgY29tbWFuZHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjbWRzLmxlbmd0aDsgaSA8IGlpOykge1xuICAgICAgc3dpdGNoIChjbWRzW2krK10pIHtcbiAgICAgICAgY2FzZSBGb250UmVuZGVyT3BzLkJFWklFUl9DVVJWRV9UTzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBbYSwgYiwgYywgZCwgZSwgZl0gPSBjbWRzLnNsaWNlKGksIGkgKyA2KTtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goY3R4ID0+IGN0eC5iZXppZXJDdXJ2ZVRvKGEsIGIsIGMsIGQsIGUsIGYpKTtcbiAgICAgICAgICAgIGkgKz0gNjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5NT1ZFX1RPOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IFthLCBiXSA9IGNtZHMuc2xpY2UoaSwgaSArIDIpO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChjdHggPT4gY3R4Lm1vdmVUbyhhLCBiKSk7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuTElORV9UTzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBbYSwgYl0gPSBjbWRzLnNsaWNlKGksIGkgKyAyKTtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goY3R4ID0+IGN0eC5saW5lVG8oYSwgYikpO1xuICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGb250UmVuZGVyT3BzLlFVQURSQVRJQ19DVVJWRV9UTzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBbYSwgYiwgYywgZF0gPSBjbWRzLnNsaWNlKGksIGkgKyA0KTtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goY3R4ID0+IGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGEsIGIsIGMsIGQpKTtcbiAgICAgICAgICAgIGkgKz0gNDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5SRVNUT1JFOlxuICAgICAgICAgIGNvbW1hbmRzLnB1c2goY3R4ID0+IGN0eC5yZXN0b3JlKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuU0FWRTpcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHguc2F2ZSgpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGb250UmVuZGVyT3BzLlNDQUxFOlxuICAgICAgICAgIGFzc2VydChjb21tYW5kcy5sZW5ndGggPT09IDIsIFwiU2NhbGUgY29tbWFuZCBpcyBvbmx5IHZhbGlkIGF0IHRoZSB0aGlyZCBwb3NpdGlvbi5cIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5UUkFOU0ZPUk06XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgW2EsIGIsIGMsIGQsIGUsIGZdID0gY21kcy5zbGljZShpLCBpICsgNik7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHgudHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpKTtcbiAgICAgICAgICAgIGkgKz0gNjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5UUkFOU0xBVEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgW2EsIGJdID0gY21kcy5zbGljZShpLCBpICsgMik7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHgudHJhbnNsYXRlKGEsIGIpKTtcbiAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBmdW5jdGlvbiBnbHlwaERyYXdlcihjdHgsIHNpemUpIHtcbiAgICAgIGNvbW1hbmRzWzBdKGN0eCk7XG4gICAgICBjb21tYW5kc1sxXShjdHgpO1xuICAgICAgY3R4LnNjYWxlKHNpemUsIC1zaXplKTtcbiAgICAgIGZvciAobGV0IGkgPSAyLCBpaSA9IGNvbW1hbmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29tbWFuZHNbaV0oY3R4KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L25vZGVfdXRpbHMuanNcblxuXG5pZiAoaXNOb2RlSlMpIHtcbiAgdmFyIHBhY2thZ2VDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gIHZhciBwYWNrYWdlTWFwID0gbnVsbDtcbiAgY29uc3QgbG9hZFBhY2thZ2VzID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KCAvKndlYnBhY2tJZ25vcmU6IHRydWUqL1wiZnNcIiksXG4gICAgICBodHRwID0gYXdhaXQgaW1wb3J0KCAvKndlYnBhY2tJZ25vcmU6IHRydWUqL1wiaHR0cFwiKSxcbiAgICAgIGh0dHBzID0gYXdhaXQgaW1wb3J0KCAvKndlYnBhY2tJZ25vcmU6IHRydWUqL1wiaHR0cHNcIiksXG4gICAgICB1cmwgPSBhd2FpdCBpbXBvcnQoIC8qd2VicGFja0lnbm9yZTogdHJ1ZSovXCJ1cmxcIik7XG4gICAgbGV0IGNhbnZhcywgcGF0aDJkO1xuICAgIHJldHVybiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHtcbiAgICAgIGZzLFxuICAgICAgaHR0cCxcbiAgICAgIGh0dHBzLFxuICAgICAgdXJsLFxuICAgICAgY2FudmFzLFxuICAgICAgcGF0aDJkXG4gICAgfSkpO1xuICB9O1xuICBsb2FkUGFja2FnZXMoKS50aGVuKG1hcCA9PiB7XG4gICAgcGFja2FnZU1hcCA9IG1hcDtcbiAgICBwYWNrYWdlQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH0sIHJlYXNvbiA9PiB7XG4gICAgd2FybihgbG9hZFBhY2thZ2VzOiAke3JlYXNvbn1gKTtcbiAgICBwYWNrYWdlTWFwID0gbmV3IE1hcCgpO1xuICAgIHBhY2thZ2VDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfSk7XG59XG5jbGFzcyBOb2RlUGFja2FnZXMge1xuICBzdGF0aWMgZ2V0IHByb21pc2UoKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgc3RhdGljIGdldChuYW1lKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VNYXA/LmdldChuYW1lKTtcbiAgfVxufVxuY29uc3Qgbm9kZV91dGlsc19mZXRjaERhdGEgPSBmdW5jdGlvbiAodXJsKSB7XG4gIGNvbnN0IGZzID0gTm9kZVBhY2thZ2VzLmdldChcImZzXCIpO1xuICByZXR1cm4gZnMucHJvbWlzZXMucmVhZEZpbGUodXJsKS50aGVuKGRhdGEgPT4gbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xufTtcbmNsYXNzIE5vZGVGaWx0ZXJGYWN0b3J5IGV4dGVuZHMgQmFzZUZpbHRlckZhY3Rvcnkge31cbmNsYXNzIE5vZGVDYW52YXNGYWN0b3J5IGV4dGVuZHMgQmFzZUNhbnZhc0ZhY3Rvcnkge1xuICBfY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBjYW52YXMgPSBOb2RlUGFja2FnZXMuZ2V0KFwiY2FudmFzXCIpO1xuICAgIHJldHVybiBjYW52YXMuY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuICB9XG59XG5jbGFzcyBOb2RlQ01hcFJlYWRlckZhY3RvcnkgZXh0ZW5kcyBCYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuICBfZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKSB7XG4gICAgcmV0dXJuIG5vZGVfdXRpbHNfZmV0Y2hEYXRhKHVybCkudGhlbihkYXRhID0+ICh7XG4gICAgICBjTWFwRGF0YTogZGF0YSxcbiAgICAgIGNvbXByZXNzaW9uVHlwZVxuICAgIH0pKTtcbiAgfVxufVxuY2xhc3MgTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IGV4dGVuZHMgQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IHtcbiAgX2ZldGNoRGF0YSh1cmwpIHtcbiAgICByZXR1cm4gbm9kZV91dGlsc19mZXRjaERhdGEodXJsKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9wYXR0ZXJuX2hlbHBlci5qc1xuXG5cbmNvbnN0IFBhdGhUeXBlID0ge1xuICBGSUxMOiBcIkZpbGxcIixcbiAgU1RST0tFOiBcIlN0cm9rZVwiLFxuICBTSEFESU5HOiBcIlNoYWRpbmdcIlxufTtcbmZ1bmN0aW9uIGFwcGx5Qm91bmRpbmdCb3goY3R4LCBiYm94KSB7XG4gIGlmICghYmJveCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3aWR0aCA9IGJib3hbMl0gLSBiYm94WzBdO1xuICBjb25zdCBoZWlnaHQgPSBiYm94WzNdIC0gYmJveFsxXTtcbiAgY29uc3QgcmVnaW9uID0gbmV3IFBhdGgyRCgpO1xuICByZWdpb24ucmVjdChiYm94WzBdLCBiYm94WzFdLCB3aWR0aCwgaGVpZ2h0KTtcbiAgY3R4LmNsaXAocmVnaW9uKTtcbn1cbmNsYXNzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlU2hhZGluZ1BhdHRlcm4pIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNoYWRpbmdQYXR0ZXJuLlwiKTtcbiAgICB9XG4gIH1cbiAgZ2V0UGF0dGVybigpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgZ2V0UGF0dGVybmAgY2FsbGVkLlwiKTtcbiAgfVxufVxuY2xhc3MgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybiBleHRlbmRzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG4gIGNvbnN0cnVjdG9yKElSKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl90eXBlID0gSVJbMV07XG4gICAgdGhpcy5fYmJveCA9IElSWzJdO1xuICAgIHRoaXMuX2NvbG9yU3RvcHMgPSBJUlszXTtcbiAgICB0aGlzLl9wMCA9IElSWzRdO1xuICAgIHRoaXMuX3AxID0gSVJbNV07XG4gICAgdGhpcy5fcjAgPSBJUls2XTtcbiAgICB0aGlzLl9yMSA9IElSWzddO1xuICAgIHRoaXMubWF0cml4ID0gbnVsbDtcbiAgfVxuICBfY3JlYXRlR3JhZGllbnQoY3R4KSB7XG4gICAgbGV0IGdyYWQ7XG4gICAgaWYgKHRoaXMuX3R5cGUgPT09IFwiYXhpYWxcIikge1xuICAgICAgZ3JhZCA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3AxWzBdLCB0aGlzLl9wMVsxXSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl90eXBlID09PSBcInJhZGlhbFwiKSB7XG4gICAgICBncmFkID0gY3R4LmNyZWF0ZVJhZGlhbEdyYWRpZW50KHRoaXMuX3AwWzBdLCB0aGlzLl9wMFsxXSwgdGhpcy5fcjAsIHRoaXMuX3AxWzBdLCB0aGlzLl9wMVsxXSwgdGhpcy5fcjEpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbG9yU3RvcCBvZiB0aGlzLl9jb2xvclN0b3BzKSB7XG4gICAgICBncmFkLmFkZENvbG9yU3RvcChjb2xvclN0b3BbMF0sIGNvbG9yU3RvcFsxXSk7XG4gICAgfVxuICAgIHJldHVybiBncmFkO1xuICB9XG4gIGdldFBhdHRlcm4oY3R4LCBvd25lciwgaW52ZXJzZSwgcGF0aFR5cGUpIHtcbiAgICBsZXQgcGF0dGVybjtcbiAgICBpZiAocGF0aFR5cGUgPT09IFBhdGhUeXBlLlNUUk9LRSB8fCBwYXRoVHlwZSA9PT0gUGF0aFR5cGUuRklMTCkge1xuICAgICAgY29uc3Qgb3duZXJCQm94ID0gb3duZXIuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KHBhdGhUeXBlLCBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCkpIHx8IFswLCAwLCAwLCAwXTtcbiAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKG93bmVyQkJveFsyXSAtIG93bmVyQkJveFswXSkgfHwgMTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguY2VpbChvd25lckJCb3hbM10gLSBvd25lckJCb3hbMV0pIHx8IDE7XG4gICAgICBjb25zdCB0bXBDYW52YXMgPSBvd25lci5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJwYXR0ZXJuXCIsIHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuICAgICAgY29uc3QgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgICB0bXBDdHguY2xlYXJSZWN0KDAsIDAsIHRtcEN0eC5jYW52YXMud2lkdGgsIHRtcEN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgIHRtcEN0eC5iZWdpblBhdGgoKTtcbiAgICAgIHRtcEN0eC5yZWN0KDAsIDAsIHRtcEN0eC5jYW52YXMud2lkdGgsIHRtcEN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgIHRtcEN0eC50cmFuc2xhdGUoLW93bmVyQkJveFswXSwgLW93bmVyQkJveFsxXSk7XG4gICAgICBpbnZlcnNlID0gVXRpbC50cmFuc2Zvcm0oaW52ZXJzZSwgWzEsIDAsIDAsIDEsIG93bmVyQkJveFswXSwgb3duZXJCQm94WzFdXSk7XG4gICAgICB0bXBDdHgudHJhbnNmb3JtKC4uLm93bmVyLmJhc2VUcmFuc2Zvcm0pO1xuICAgICAgaWYgKHRoaXMubWF0cml4KSB7XG4gICAgICAgIHRtcEN0eC50cmFuc2Zvcm0oLi4udGhpcy5tYXRyaXgpO1xuICAgICAgfVxuICAgICAgYXBwbHlCb3VuZGluZ0JveCh0bXBDdHgsIHRoaXMuX2Jib3gpO1xuICAgICAgdG1wQ3R4LmZpbGxTdHlsZSA9IHRoaXMuX2NyZWF0ZUdyYWRpZW50KHRtcEN0eCk7XG4gICAgICB0bXBDdHguZmlsbCgpO1xuICAgICAgcGF0dGVybiA9IGN0eC5jcmVhdGVQYXR0ZXJuKHRtcENhbnZhcy5jYW52YXMsIFwibm8tcmVwZWF0XCIpO1xuICAgICAgY29uc3QgZG9tTWF0cml4ID0gbmV3IERPTU1hdHJpeChpbnZlcnNlKTtcbiAgICAgIHBhdHRlcm4uc2V0VHJhbnNmb3JtKGRvbU1hdHJpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwcGx5Qm91bmRpbmdCb3goY3R4LCB0aGlzLl9iYm94KTtcbiAgICAgIHBhdHRlcm4gPSB0aGlzLl9jcmVhdGVHcmFkaWVudChjdHgpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybjtcbiAgfVxufVxuZnVuY3Rpb24gZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHAxLCBwMiwgcDMsIGMxLCBjMiwgYzMpIHtcbiAgY29uc3QgY29vcmRzID0gY29udGV4dC5jb29yZHMsXG4gICAgY29sb3JzID0gY29udGV4dC5jb2xvcnM7XG4gIGNvbnN0IGJ5dGVzID0gZGF0YS5kYXRhLFxuICAgIHJvd1NpemUgPSBkYXRhLndpZHRoICogNDtcbiAgbGV0IHRtcDtcbiAgaWYgKGNvb3Jkc1twMSArIDFdID4gY29vcmRzW3AyICsgMV0pIHtcbiAgICB0bXAgPSBwMTtcbiAgICBwMSA9IHAyO1xuICAgIHAyID0gdG1wO1xuICAgIHRtcCA9IGMxO1xuICAgIGMxID0gYzI7XG4gICAgYzIgPSB0bXA7XG4gIH1cbiAgaWYgKGNvb3Jkc1twMiArIDFdID4gY29vcmRzW3AzICsgMV0pIHtcbiAgICB0bXAgPSBwMjtcbiAgICBwMiA9IHAzO1xuICAgIHAzID0gdG1wO1xuICAgIHRtcCA9IGMyO1xuICAgIGMyID0gYzM7XG4gICAgYzMgPSB0bXA7XG4gIH1cbiAgaWYgKGNvb3Jkc1twMSArIDFdID4gY29vcmRzW3AyICsgMV0pIHtcbiAgICB0bXAgPSBwMTtcbiAgICBwMSA9IHAyO1xuICAgIHAyID0gdG1wO1xuICAgIHRtcCA9IGMxO1xuICAgIGMxID0gYzI7XG4gICAgYzIgPSB0bXA7XG4gIH1cbiAgY29uc3QgeDEgPSAoY29vcmRzW3AxXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDtcbiAgY29uc3QgeTEgPSAoY29vcmRzW3AxICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7XG4gIGNvbnN0IHgyID0gKGNvb3Jkc1twMl0gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7XG4gIGNvbnN0IHkyID0gKGNvb3Jkc1twMiArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZO1xuICBjb25zdCB4MyA9IChjb29yZHNbcDNdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYO1xuICBjb25zdCB5MyA9IChjb29yZHNbcDMgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTtcbiAgaWYgKHkxID49IHkzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGMxciA9IGNvbG9yc1tjMV0sXG4gICAgYzFnID0gY29sb3JzW2MxICsgMV0sXG4gICAgYzFiID0gY29sb3JzW2MxICsgMl07XG4gIGNvbnN0IGMyciA9IGNvbG9yc1tjMl0sXG4gICAgYzJnID0gY29sb3JzW2MyICsgMV0sXG4gICAgYzJiID0gY29sb3JzW2MyICsgMl07XG4gIGNvbnN0IGMzciA9IGNvbG9yc1tjM10sXG4gICAgYzNnID0gY29sb3JzW2MzICsgMV0sXG4gICAgYzNiID0gY29sb3JzW2MzICsgMl07XG4gIGNvbnN0IG1pblkgPSBNYXRoLnJvdW5kKHkxKSxcbiAgICBtYXhZID0gTWF0aC5yb3VuZCh5Myk7XG4gIGxldCB4YSwgY2FyLCBjYWcsIGNhYjtcbiAgbGV0IHhiLCBjYnIsIGNiZywgY2JiO1xuICBmb3IgKGxldCB5ID0gbWluWTsgeSA8PSBtYXhZOyB5KyspIHtcbiAgICBpZiAoeSA8IHkyKSB7XG4gICAgICBjb25zdCBrID0geSA8IHkxID8gMCA6ICh5MSAtIHkpIC8gKHkxIC0geTIpO1xuICAgICAgeGEgPSB4MSAtICh4MSAtIHgyKSAqIGs7XG4gICAgICBjYXIgPSBjMXIgLSAoYzFyIC0gYzJyKSAqIGs7XG4gICAgICBjYWcgPSBjMWcgLSAoYzFnIC0gYzJnKSAqIGs7XG4gICAgICBjYWIgPSBjMWIgLSAoYzFiIC0gYzJiKSAqIGs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBrO1xuICAgICAgaWYgKHkgPiB5Mykge1xuICAgICAgICBrID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoeTIgPT09IHkzKSB7XG4gICAgICAgIGsgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgayA9ICh5MiAtIHkpIC8gKHkyIC0geTMpO1xuICAgICAgfVxuICAgICAgeGEgPSB4MiAtICh4MiAtIHgzKSAqIGs7XG4gICAgICBjYXIgPSBjMnIgLSAoYzJyIC0gYzNyKSAqIGs7XG4gICAgICBjYWcgPSBjMmcgLSAoYzJnIC0gYzNnKSAqIGs7XG4gICAgICBjYWIgPSBjMmIgLSAoYzJiIC0gYzNiKSAqIGs7XG4gICAgfVxuICAgIGxldCBrO1xuICAgIGlmICh5IDwgeTEpIHtcbiAgICAgIGsgPSAwO1xuICAgIH0gZWxzZSBpZiAoeSA+IHkzKSB7XG4gICAgICBrID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgayA9ICh5MSAtIHkpIC8gKHkxIC0geTMpO1xuICAgIH1cbiAgICB4YiA9IHgxIC0gKHgxIC0geDMpICogaztcbiAgICBjYnIgPSBjMXIgLSAoYzFyIC0gYzNyKSAqIGs7XG4gICAgY2JnID0gYzFnIC0gKGMxZyAtIGMzZykgKiBrO1xuICAgIGNiYiA9IGMxYiAtIChjMWIgLSBjM2IpICogaztcbiAgICBjb25zdCB4MV8gPSBNYXRoLnJvdW5kKE1hdGgubWluKHhhLCB4YikpO1xuICAgIGNvbnN0IHgyXyA9IE1hdGgucm91bmQoTWF0aC5tYXgoeGEsIHhiKSk7XG4gICAgbGV0IGogPSByb3dTaXplICogeSArIHgxXyAqIDQ7XG4gICAgZm9yIChsZXQgeCA9IHgxXzsgeCA8PSB4Ml87IHgrKykge1xuICAgICAgayA9ICh4YSAtIHgpIC8gKHhhIC0geGIpO1xuICAgICAgaWYgKGsgPCAwKSB7XG4gICAgICAgIGsgPSAwO1xuICAgICAgfSBlbHNlIGlmIChrID4gMSkge1xuICAgICAgICBrID0gMTtcbiAgICAgIH1cbiAgICAgIGJ5dGVzW2orK10gPSBjYXIgLSAoY2FyIC0gY2JyKSAqIGsgfCAwO1xuICAgICAgYnl0ZXNbaisrXSA9IGNhZyAtIChjYWcgLSBjYmcpICogayB8IDA7XG4gICAgICBieXRlc1tqKytdID0gY2FiIC0gKGNhYiAtIGNiYikgKiBrIHwgMDtcbiAgICAgIGJ5dGVzW2orK10gPSAyNTU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkcmF3RmlndXJlKGRhdGEsIGZpZ3VyZSwgY29udGV4dCkge1xuICBjb25zdCBwcyA9IGZpZ3VyZS5jb29yZHM7XG4gIGNvbnN0IGNzID0gZmlndXJlLmNvbG9ycztcbiAgbGV0IGksIGlpO1xuICBzd2l0Y2ggKGZpZ3VyZS50eXBlKSB7XG4gICAgY2FzZSBcImxhdHRpY2VcIjpcbiAgICAgIGNvbnN0IHZlcnRpY2VzUGVyUm93ID0gZmlndXJlLnZlcnRpY2VzUGVyUm93O1xuICAgICAgY29uc3Qgcm93cyA9IE1hdGguZmxvb3IocHMubGVuZ3RoIC8gdmVydGljZXNQZXJSb3cpIC0gMTtcbiAgICAgIGNvbnN0IGNvbHMgPSB2ZXJ0aWNlc1BlclJvdyAtIDE7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICAgIGxldCBxID0gaSAqIHZlcnRpY2VzUGVyUm93O1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHM7IGorKywgcSsrKSB7XG4gICAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW3FdLCBwc1txICsgMV0sIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sIGNzW3FdLCBjc1txICsgMV0sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd10pO1xuICAgICAgICAgIGRyYXdUcmlhbmdsZShkYXRhLCBjb250ZXh0LCBwc1txICsgdmVydGljZXNQZXJSb3cgKyAxXSwgcHNbcSArIDFdLCBwc1txICsgdmVydGljZXNQZXJSb3ddLCBjc1txICsgdmVydGljZXNQZXJSb3cgKyAxXSwgY3NbcSArIDFdLCBjc1txICsgdmVydGljZXNQZXJSb3ddKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInRyaWFuZ2xlc1wiOlxuICAgICAgZm9yIChpID0gMCwgaWkgPSBwcy5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7XG4gICAgICAgIGRyYXdUcmlhbmdsZShkYXRhLCBjb250ZXh0LCBwc1tpXSwgcHNbaSArIDFdLCBwc1tpICsgMl0sIGNzW2ldLCBjc1tpICsgMV0sIGNzW2kgKyAyXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBmaWd1cmVcIik7XG4gIH1cbn1cbmNsYXNzIE1lc2hTaGFkaW5nUGF0dGVybiBleHRlbmRzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG4gIGNvbnN0cnVjdG9yKElSKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9jb29yZHMgPSBJUlsyXTtcbiAgICB0aGlzLl9jb2xvcnMgPSBJUlszXTtcbiAgICB0aGlzLl9maWd1cmVzID0gSVJbNF07XG4gICAgdGhpcy5fYm91bmRzID0gSVJbNV07XG4gICAgdGhpcy5fYmJveCA9IElSWzddO1xuICAgIHRoaXMuX2JhY2tncm91bmQgPSBJUls4XTtcbiAgICB0aGlzLm1hdHJpeCA9IG51bGw7XG4gIH1cbiAgX2NyZWF0ZU1lc2hDYW52YXMoY29tYmluZWRTY2FsZSwgYmFja2dyb3VuZENvbG9yLCBjYWNoZWRDYW52YXNlcykge1xuICAgIGNvbnN0IEVYUEVDVEVEX1NDQUxFID0gMS4xO1xuICAgIGNvbnN0IE1BWF9QQVRURVJOX1NJWkUgPSAzMDAwO1xuICAgIGNvbnN0IEJPUkRFUl9TSVpFID0gMjtcbiAgICBjb25zdCBvZmZzZXRYID0gTWF0aC5mbG9vcih0aGlzLl9ib3VuZHNbMF0pO1xuICAgIGNvbnN0IG9mZnNldFkgPSBNYXRoLmZsb29yKHRoaXMuX2JvdW5kc1sxXSk7XG4gICAgY29uc3QgYm91bmRzV2lkdGggPSBNYXRoLmNlaWwodGhpcy5fYm91bmRzWzJdKSAtIG9mZnNldFg7XG4gICAgY29uc3QgYm91bmRzSGVpZ2h0ID0gTWF0aC5jZWlsKHRoaXMuX2JvdW5kc1szXSkgLSBvZmZzZXRZO1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGJvdW5kc1dpZHRoICogY29tYmluZWRTY2FsZVswXSAqIEVYUEVDVEVEX1NDQUxFKSksIE1BWF9QQVRURVJOX1NJWkUpO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWluKE1hdGguY2VpbChNYXRoLmFicyhib3VuZHNIZWlnaHQgKiBjb21iaW5lZFNjYWxlWzFdICogRVhQRUNURURfU0NBTEUpKSwgTUFYX1BBVFRFUk5fU0laRSk7XG4gICAgY29uc3Qgc2NhbGVYID0gYm91bmRzV2lkdGggLyB3aWR0aDtcbiAgICBjb25zdCBzY2FsZVkgPSBib3VuZHNIZWlnaHQgLyBoZWlnaHQ7XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIGNvb3JkczogdGhpcy5fY29vcmRzLFxuICAgICAgY29sb3JzOiB0aGlzLl9jb2xvcnMsXG4gICAgICBvZmZzZXRYOiAtb2Zmc2V0WCxcbiAgICAgIG9mZnNldFk6IC1vZmZzZXRZLFxuICAgICAgc2NhbGVYOiAxIC8gc2NhbGVYLFxuICAgICAgc2NhbGVZOiAxIC8gc2NhbGVZXG4gICAgfTtcbiAgICBjb25zdCBwYWRkZWRXaWR0aCA9IHdpZHRoICsgQk9SREVSX1NJWkUgKiAyO1xuICAgIGNvbnN0IHBhZGRlZEhlaWdodCA9IGhlaWdodCArIEJPUkRFUl9TSVpFICogMjtcbiAgICBjb25zdCB0bXBDYW52YXMgPSBjYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJtZXNoXCIsIHBhZGRlZFdpZHRoLCBwYWRkZWRIZWlnaHQsIGZhbHNlKTtcbiAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICBjb25zdCBkYXRhID0gdG1wQ3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBjb25zdCBieXRlcyA9IGRhdGEuZGF0YTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJ5dGVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDQpIHtcbiAgICAgICAgYnl0ZXNbaV0gPSBiYWNrZ3JvdW5kQ29sb3JbMF07XG4gICAgICAgIGJ5dGVzW2kgKyAxXSA9IGJhY2tncm91bmRDb2xvclsxXTtcbiAgICAgICAgYnl0ZXNbaSArIDJdID0gYmFja2dyb3VuZENvbG9yWzJdO1xuICAgICAgICBieXRlc1tpICsgM10gPSAyNTU7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlndXJlIG9mIHRoaXMuX2ZpZ3VyZXMpIHtcbiAgICAgIGRyYXdGaWd1cmUoZGF0YSwgZmlndXJlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgdG1wQ3R4LnB1dEltYWdlRGF0YShkYXRhLCBCT1JERVJfU0laRSwgQk9SREVSX1NJWkUpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRtcENhbnZhcy5jYW52YXM7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbnZhcyxcbiAgICAgIG9mZnNldFg6IG9mZnNldFggLSBCT1JERVJfU0laRSAqIHNjYWxlWCxcbiAgICAgIG9mZnNldFk6IG9mZnNldFkgLSBCT1JERVJfU0laRSAqIHNjYWxlWSxcbiAgICAgIHNjYWxlWCxcbiAgICAgIHNjYWxlWVxuICAgIH07XG4gIH1cbiAgZ2V0UGF0dGVybihjdHgsIG93bmVyLCBpbnZlcnNlLCBwYXRoVHlwZSkge1xuICAgIGFwcGx5Qm91bmRpbmdCb3goY3R4LCB0aGlzLl9iYm94KTtcbiAgICBsZXQgc2NhbGU7XG4gICAgaWYgKHBhdGhUeXBlID09PSBQYXRoVHlwZS5TSEFESU5HKSB7XG4gICAgICBzY2FsZSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG93bmVyLmJhc2VUcmFuc2Zvcm0pO1xuICAgICAgaWYgKHRoaXMubWF0cml4KSB7XG4gICAgICAgIGNvbnN0IG1hdHJpeFNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7XG4gICAgICAgIHNjYWxlID0gW3NjYWxlWzBdICogbWF0cml4U2NhbGVbMF0sIHNjYWxlWzFdICogbWF0cml4U2NhbGVbMV1dO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzID0gdGhpcy5fY3JlYXRlTWVzaENhbnZhcyhzY2FsZSwgcGF0aFR5cGUgPT09IFBhdGhUeXBlLlNIQURJTkcgPyBudWxsIDogdGhpcy5fYmFja2dyb3VuZCwgb3duZXIuY2FjaGVkQ2FudmFzZXMpO1xuICAgIGlmIChwYXRoVHlwZSAhPT0gUGF0aFR5cGUuU0hBRElORykge1xuICAgICAgY3R4LnNldFRyYW5zZm9ybSguLi5vd25lci5iYXNlVHJhbnNmb3JtKTtcbiAgICAgIGlmICh0aGlzLm1hdHJpeCkge1xuICAgICAgICBjdHgudHJhbnNmb3JtKC4uLnRoaXMubWF0cml4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY3R4LnRyYW5zbGF0ZSh0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLm9mZnNldFgsIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WSk7XG4gICAgY3R4LnNjYWxlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWSk7XG4gICAgcmV0dXJuIGN0eC5jcmVhdGVQYXR0ZXJuKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuY2FudmFzLCBcIm5vLXJlcGVhdFwiKTtcbiAgfVxufVxuY2xhc3MgRHVtbXlTaGFkaW5nUGF0dGVybiBleHRlbmRzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG4gIGdldFBhdHRlcm4oKSB7XG4gICAgcmV0dXJuIFwiaG90cGlua1wiO1xuICB9XG59XG5mdW5jdGlvbiBnZXRTaGFkaW5nUGF0dGVybihJUikge1xuICBzd2l0Y2ggKElSWzBdKSB7XG4gICAgY2FzZSBcIlJhZGlhbEF4aWFsXCI6XG4gICAgICByZXR1cm4gbmV3IFJhZGlhbEF4aWFsU2hhZGluZ1BhdHRlcm4oSVIpO1xuICAgIGNhc2UgXCJNZXNoXCI6XG4gICAgICByZXR1cm4gbmV3IE1lc2hTaGFkaW5nUGF0dGVybihJUik7XG4gICAgY2FzZSBcIkR1bW15XCI6XG4gICAgICByZXR1cm4gbmV3IER1bW15U2hhZGluZ1BhdHRlcm4oKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSVIgdHlwZTogJHtJUlswXX1gKTtcbn1cbmNvbnN0IFBhaW50VHlwZSA9IHtcbiAgQ09MT1JFRDogMSxcbiAgVU5DT0xPUkVEOiAyXG59O1xuY2xhc3MgVGlsaW5nUGF0dGVybiB7XG4gIHN0YXRpYyBNQVhfUEFUVEVSTl9TSVpFID0gMzAwMDtcbiAgY29uc3RydWN0b3IoSVIsIGNvbG9yLCBjdHgsIGNhbnZhc0dyYXBoaWNzRmFjdG9yeSwgYmFzZVRyYW5zZm9ybSkge1xuICAgIHRoaXMub3BlcmF0b3JMaXN0ID0gSVJbMl07XG4gICAgdGhpcy5tYXRyaXggPSBJUlszXTtcbiAgICB0aGlzLmJib3ggPSBJUls0XTtcbiAgICB0aGlzLnhzdGVwID0gSVJbNV07XG4gICAgdGhpcy55c3RlcCA9IElSWzZdO1xuICAgIHRoaXMucGFpbnRUeXBlID0gSVJbN107XG4gICAgdGhpcy50aWxpbmdUeXBlID0gSVJbOF07XG4gICAgdGhpcy5jb2xvciA9IGNvbG9yO1xuICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgIHRoaXMuY2FudmFzR3JhcGhpY3NGYWN0b3J5ID0gY2FudmFzR3JhcGhpY3NGYWN0b3J5O1xuICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IGJhc2VUcmFuc2Zvcm07XG4gIH1cbiAgY3JlYXRlUGF0dGVybkNhbnZhcyhvd25lcikge1xuICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IHRoaXMub3BlcmF0b3JMaXN0O1xuICAgIGNvbnN0IGJib3ggPSB0aGlzLmJib3g7XG4gICAgY29uc3QgeHN0ZXAgPSB0aGlzLnhzdGVwO1xuICAgIGNvbnN0IHlzdGVwID0gdGhpcy55c3RlcDtcbiAgICBjb25zdCBwYWludFR5cGUgPSB0aGlzLnBhaW50VHlwZTtcbiAgICBjb25zdCB0aWxpbmdUeXBlID0gdGhpcy50aWxpbmdUeXBlO1xuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5jb2xvcjtcbiAgICBjb25zdCBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeTtcbiAgICBpbmZvKFwiVGlsaW5nVHlwZTogXCIgKyB0aWxpbmdUeXBlKTtcbiAgICBjb25zdCB4MCA9IGJib3hbMF0sXG4gICAgICB5MCA9IGJib3hbMV0sXG4gICAgICB4MSA9IGJib3hbMl0sXG4gICAgICB5MSA9IGJib3hbM107XG4gICAgY29uc3QgbWF0cml4U2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMubWF0cml4KTtcbiAgICBjb25zdCBjdXJNYXRyaXhTY2FsZSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5iYXNlVHJhbnNmb3JtKTtcbiAgICBjb25zdCBjb21iaW5lZFNjYWxlID0gW21hdHJpeFNjYWxlWzBdICogY3VyTWF0cml4U2NhbGVbMF0sIG1hdHJpeFNjYWxlWzFdICogY3VyTWF0cml4U2NhbGVbMV1dO1xuICAgIGNvbnN0IGRpbXggPSB0aGlzLmdldFNpemVBbmRTY2FsZSh4c3RlcCwgdGhpcy5jdHguY2FudmFzLndpZHRoLCBjb21iaW5lZFNjYWxlWzBdKTtcbiAgICBjb25zdCBkaW15ID0gdGhpcy5nZXRTaXplQW5kU2NhbGUoeXN0ZXAsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQsIGNvbWJpbmVkU2NhbGVbMV0pO1xuICAgIGNvbnN0IHRtcENhbnZhcyA9IG93bmVyLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcInBhdHRlcm5cIiwgZGlteC5zaXplLCBkaW15LnNpemUsIHRydWUpO1xuICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgIGNvbnN0IGdyYXBoaWNzID0gY2FudmFzR3JhcGhpY3NGYWN0b3J5LmNyZWF0ZUNhbnZhc0dyYXBoaWNzKHRtcEN0eCk7XG4gICAgZ3JhcGhpY3MuZ3JvdXBMZXZlbCA9IG93bmVyLmdyb3VwTGV2ZWw7XG4gICAgdGhpcy5zZXRGaWxsQW5kU3Ryb2tlU3R5bGVUb0NvbnRleHQoZ3JhcGhpY3MsIHBhaW50VHlwZSwgY29sb3IpO1xuICAgIGxldCBhZGp1c3RlZFgwID0geDA7XG4gICAgbGV0IGFkanVzdGVkWTAgPSB5MDtcbiAgICBsZXQgYWRqdXN0ZWRYMSA9IHgxO1xuICAgIGxldCBhZGp1c3RlZFkxID0geTE7XG4gICAgaWYgKHgwIDwgMCkge1xuICAgICAgYWRqdXN0ZWRYMCA9IDA7XG4gICAgICBhZGp1c3RlZFgxICs9IE1hdGguYWJzKHgwKTtcbiAgICB9XG4gICAgaWYgKHkwIDwgMCkge1xuICAgICAgYWRqdXN0ZWRZMCA9IDA7XG4gICAgICBhZGp1c3RlZFkxICs9IE1hdGguYWJzKHkwKTtcbiAgICB9XG4gICAgdG1wQ3R4LnRyYW5zbGF0ZSgtKGRpbXguc2NhbGUgKiBhZGp1c3RlZFgwKSwgLShkaW15LnNjYWxlICogYWRqdXN0ZWRZMCkpO1xuICAgIGdyYXBoaWNzLnRyYW5zZm9ybShkaW14LnNjYWxlLCAwLCAwLCBkaW15LnNjYWxlLCAwLCAwKTtcbiAgICB0bXBDdHguc2F2ZSgpO1xuICAgIHRoaXMuY2xpcEJib3goZ3JhcGhpY3MsIGFkanVzdGVkWDAsIGFkanVzdGVkWTAsIGFkanVzdGVkWDEsIGFkanVzdGVkWTEpO1xuICAgIGdyYXBoaWNzLmJhc2VUcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKGdyYXBoaWNzLmN0eCk7XG4gICAgZ3JhcGhpY3MuZXhlY3V0ZU9wZXJhdG9yTGlzdChvcGVyYXRvckxpc3QpO1xuICAgIGdyYXBoaWNzLmVuZERyYXdpbmcoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY2FudmFzOiB0bXBDYW52YXMuY2FudmFzLFxuICAgICAgc2NhbGVYOiBkaW14LnNjYWxlLFxuICAgICAgc2NhbGVZOiBkaW15LnNjYWxlLFxuICAgICAgb2Zmc2V0WDogYWRqdXN0ZWRYMCxcbiAgICAgIG9mZnNldFk6IGFkanVzdGVkWTBcbiAgICB9O1xuICB9XG4gIGdldFNpemVBbmRTY2FsZShzdGVwLCByZWFsT3V0cHV0U2l6ZSwgc2NhbGUpIHtcbiAgICBzdGVwID0gTWF0aC5hYnMoc3RlcCk7XG4gICAgY29uc3QgbWF4U2l6ZSA9IE1hdGgubWF4KFRpbGluZ1BhdHRlcm4uTUFYX1BBVFRFUk5fU0laRSwgcmVhbE91dHB1dFNpemUpO1xuICAgIGxldCBzaXplID0gTWF0aC5jZWlsKHN0ZXAgKiBzY2FsZSk7XG4gICAgaWYgKHNpemUgPj0gbWF4U2l6ZSkge1xuICAgICAgc2l6ZSA9IG1heFNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjYWxlID0gc2l6ZSAvIHN0ZXA7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzY2FsZSxcbiAgICAgIHNpemVcbiAgICB9O1xuICB9XG4gIGNsaXBCYm94KGdyYXBoaWNzLCB4MCwgeTAsIHgxLCB5MSkge1xuICAgIGNvbnN0IGJib3hXaWR0aCA9IHgxIC0geDA7XG4gICAgY29uc3QgYmJveEhlaWdodCA9IHkxIC0geTA7XG4gICAgZ3JhcGhpY3MuY3R4LnJlY3QoeDAsIHkwLCBiYm94V2lkdGgsIGJib3hIZWlnaHQpO1xuICAgIGdyYXBoaWNzLmN1cnJlbnQudXBkYXRlUmVjdE1pbk1heChnZXRDdXJyZW50VHJhbnNmb3JtKGdyYXBoaWNzLmN0eCksIFt4MCwgeTAsIHgxLCB5MV0pO1xuICAgIGdyYXBoaWNzLmNsaXAoKTtcbiAgICBncmFwaGljcy5lbmRQYXRoKCk7XG4gIH1cbiAgc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0KGdyYXBoaWNzLCBwYWludFR5cGUsIGNvbG9yKSB7XG4gICAgY29uc3QgY29udGV4dCA9IGdyYXBoaWNzLmN0eCxcbiAgICAgIGN1cnJlbnQgPSBncmFwaGljcy5jdXJyZW50O1xuICAgIHN3aXRjaCAocGFpbnRUeXBlKSB7XG4gICAgICBjYXNlIFBhaW50VHlwZS5DT0xPUkVEOlxuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBjdHguZmlsbFN0eWxlO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gY3R4LnN0cm9rZVN0eWxlO1xuICAgICAgICBjdXJyZW50LmZpbGxDb2xvciA9IGN0eC5maWxsU3R5bGU7XG4gICAgICAgIGN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBjdHguc3Ryb2tlU3R5bGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQYWludFR5cGUuVU5DT0xPUkVEOlxuICAgICAgICBjb25zdCBjc3NDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGNzc0NvbG9yO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gY3NzQ29sb3I7XG4gICAgICAgIGN1cnJlbnQuZmlsbENvbG9yID0gY3NzQ29sb3I7XG4gICAgICAgIGN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBjc3NDb2xvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHBhaW50IHR5cGU6ICR7cGFpbnRUeXBlfWApO1xuICAgIH1cbiAgfVxuICBnZXRQYXR0ZXJuKGN0eCwgb3duZXIsIGludmVyc2UsIHBhdGhUeXBlKSB7XG4gICAgbGV0IG1hdHJpeCA9IGludmVyc2U7XG4gICAgaWYgKHBhdGhUeXBlICE9PSBQYXRoVHlwZS5TSEFESU5HKSB7XG4gICAgICBtYXRyaXggPSBVdGlsLnRyYW5zZm9ybShtYXRyaXgsIG93bmVyLmJhc2VUcmFuc2Zvcm0pO1xuICAgICAgaWYgKHRoaXMubWF0cml4KSB7XG4gICAgICAgIG1hdHJpeCA9IFV0aWwudHJhbnNmb3JtKG1hdHJpeCwgdGhpcy5tYXRyaXgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzID0gdGhpcy5jcmVhdGVQYXR0ZXJuQ2FudmFzKG93bmVyKTtcbiAgICBsZXQgZG9tTWF0cml4ID0gbmV3IERPTU1hdHJpeChtYXRyaXgpO1xuICAgIGRvbU1hdHJpeCA9IGRvbU1hdHJpeC50cmFuc2xhdGUodGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLm9mZnNldFkpO1xuICAgIGRvbU1hdHJpeCA9IGRvbU1hdHJpeC5zY2FsZSgxIC8gdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5zY2FsZVgsIDEgLyB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWSk7XG4gICAgY29uc3QgcGF0dGVybiA9IGN0eC5jcmVhdGVQYXR0ZXJuKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuY2FudmFzLCBcInJlcGVhdFwiKTtcbiAgICBwYXR0ZXJuLnNldFRyYW5zZm9ybShkb21NYXRyaXgpO1xuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9zaGFyZWQvaW1hZ2VfdXRpbHMuanNcblxuZnVuY3Rpb24gY29udmVydFRvUkdCQShwYXJhbXMpIHtcbiAgc3dpdGNoIChwYXJhbXMua2luZCkge1xuICAgIGNhc2UgSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOlxuICAgICAgcmV0dXJuIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHBhcmFtcyk7XG4gICAgY2FzZSBJbWFnZUtpbmQuUkdCXzI0QlBQOlxuICAgICAgcmV0dXJuIGNvbnZlcnRSR0JUb1JHQkEocGFyYW1zKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHtcbiAgc3JjLFxuICBzcmNQb3MgPSAwLFxuICBkZXN0LFxuICB3aWR0aCxcbiAgaGVpZ2h0LFxuICBub25CbGFja0NvbG9yID0gMHhmZmZmZmZmZixcbiAgaW52ZXJzZURlY29kZSA9IGZhbHNlXG59KSB7XG4gIGNvbnN0IGJsYWNrID0gdXRpbF9GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4ZmYwMDAwMDAgOiAweDAwMDAwMGZmO1xuICBjb25zdCBbemVyb01hcHBpbmcsIG9uZU1hcHBpbmddID0gaW52ZXJzZURlY29kZSA/IFtub25CbGFja0NvbG9yLCBibGFja10gOiBbYmxhY2ssIG5vbkJsYWNrQ29sb3JdO1xuICBjb25zdCB3aWR0aEluU291cmNlID0gd2lkdGggPj4gMztcbiAgY29uc3Qgd2lkdGhSZW1haW5kZXIgPSB3aWR0aCAmIDc7XG4gIGNvbnN0IHNyY0xlbmd0aCA9IHNyYy5sZW5ndGg7XG4gIGRlc3QgPSBuZXcgVWludDMyQXJyYXkoZGVzdC5idWZmZXIpO1xuICBsZXQgZGVzdFBvcyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICBmb3IgKGNvbnN0IG1heCA9IHNyY1BvcyArIHdpZHRoSW5Tb3VyY2U7IHNyY1BvcyA8IG1heDsgc3JjUG9zKyspIHtcbiAgICAgIGNvbnN0IGVsZW0gPSBzcmNQb3MgPCBzcmNMZW5ndGggPyBzcmNbc3JjUG9zXSA6IDI1NTtcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMSA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICB9XG4gICAgaWYgKHdpZHRoUmVtYWluZGVyID09PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZWxlbSA9IHNyY1BvcyA8IHNyY0xlbmd0aCA/IHNyY1tzcmNQb3MrK10gOiAyNTU7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aFJlbWFpbmRlcjsgaisrKSB7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMSA8PCA3IC0gaiA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzcmNQb3MsXG4gICAgZGVzdFBvc1xuICB9O1xufVxuZnVuY3Rpb24gY29udmVydFJHQlRvUkdCQSh7XG4gIHNyYyxcbiAgc3JjUG9zID0gMCxcbiAgZGVzdCxcbiAgZGVzdFBvcyA9IDAsXG4gIHdpZHRoLFxuICBoZWlnaHRcbn0pIHtcbiAgbGV0IGkgPSAwO1xuICBjb25zdCBsZW4zMiA9IHNyYy5sZW5ndGggPj4gMjtcbiAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkoc3JjLmJ1ZmZlciwgc3JjUG9zLCBsZW4zMik7XG4gIGlmIChGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikge1xuICAgIGZvciAoOyBpIDwgbGVuMzIgLSAyOyBpICs9IDMsIGRlc3RQb3MgKz0gNCkge1xuICAgICAgY29uc3QgczEgPSBzcmMzMltpXTtcbiAgICAgIGNvbnN0IHMyID0gc3JjMzJbaSArIDFdO1xuICAgICAgY29uc3QgczMgPSBzcmMzMltpICsgMl07XG4gICAgICBkZXN0W2Rlc3RQb3NdID0gczEgfCAweGZmMDAwMDAwO1xuICAgICAgZGVzdFtkZXN0UG9zICsgMV0gPSBzMSA+Pj4gMjQgfCBzMiA8PCA4IHwgMHhmZjAwMDAwMDtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDJdID0gczIgPj4+IDE2IHwgczMgPDwgMTYgfCAweGZmMDAwMDAwO1xuICAgICAgZGVzdFtkZXN0UG9zICsgM10gPSBzMyA+Pj4gOCB8IDB4ZmYwMDAwMDA7XG4gICAgfVxuICAgIGZvciAobGV0IGogPSBpICogNCwgamogPSBzcmMubGVuZ3RoOyBqIDwgamo7IGogKz0gMykge1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW2pdIHwgc3JjW2ogKyAxXSA8PCA4IHwgc3JjW2ogKyAyXSA8PCAxNiB8IDB4ZmYwMDAwMDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoOyBpIDwgbGVuMzIgLSAyOyBpICs9IDMsIGRlc3RQb3MgKz0gNCkge1xuICAgICAgY29uc3QgczEgPSBzcmMzMltpXTtcbiAgICAgIGNvbnN0IHMyID0gc3JjMzJbaSArIDFdO1xuICAgICAgY29uc3QgczMgPSBzcmMzMltpICsgMl07XG4gICAgICBkZXN0W2Rlc3RQb3NdID0gczEgfCAweGZmO1xuICAgICAgZGVzdFtkZXN0UG9zICsgMV0gPSBzMSA8PCAyNCB8IHMyID4+PiA4IHwgMHhmZjtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDJdID0gczIgPDwgMTYgfCBzMyA+Pj4gMTYgfCAweGZmO1xuICAgICAgZGVzdFtkZXN0UG9zICsgM10gPSBzMyA8PCA4IHwgMHhmZjtcbiAgICB9XG4gICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyYy5sZW5ndGg7IGogPCBqajsgaiArPSAzKSB7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbal0gPDwgMjQgfCBzcmNbaiArIDFdIDw8IDE2IHwgc3JjW2ogKyAyXSA8PCA4IHwgMHhmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzcmNQb3MsXG4gICAgZGVzdFBvc1xuICB9O1xufVxuZnVuY3Rpb24gZ3JheVRvUkdCQShzcmMsIGRlc3QpIHtcbiAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGRlc3RbaV0gPSBzcmNbaV0gKiAweDEwMTAxIHwgMHhmZjAwMDAwMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGRlc3RbaV0gPSBzcmNbaV0gKiAweDEwMTAxMDAgfCAweDAwMDAwMGZmO1xuICAgIH1cbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9jYW52YXMuanNcblxuXG5cblxuY29uc3QgTUlOX0ZPTlRfU0laRSA9IDE2O1xuY29uc3QgTUFYX0ZPTlRfU0laRSA9IDEwMDtcbmNvbnN0IEVYRUNVVElPTl9USU1FID0gMTU7XG5jb25zdCBFWEVDVVRJT05fU1RFUFMgPSAxMDtcbmNvbnN0IE1BWF9TSVpFX1RPX0NPTVBJTEUgPSAxMDAwO1xuY29uc3QgRlVMTF9DSFVOS19IRUlHSFQgPSAxNjtcbmZ1bmN0aW9uIG1pcnJvckNvbnRleHRPcGVyYXRpb25zKGN0eCwgZGVzdEN0eCkge1xuICBpZiAoY3R4Ll9yZW1vdmVNaXJyb3JpbmcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IGlzIGFscmVhZHkgZm9yd2FyZGluZyBvcGVyYXRpb25zLlwiKTtcbiAgfVxuICBjdHguX19vcmlnaW5hbFNhdmUgPSBjdHguc2F2ZTtcbiAgY3R4Ll9fb3JpZ2luYWxSZXN0b3JlID0gY3R4LnJlc3RvcmU7XG4gIGN0eC5fX29yaWdpbmFsUm90YXRlID0gY3R4LnJvdGF0ZTtcbiAgY3R4Ll9fb3JpZ2luYWxTY2FsZSA9IGN0eC5zY2FsZTtcbiAgY3R4Ll9fb3JpZ2luYWxUcmFuc2xhdGUgPSBjdHgudHJhbnNsYXRlO1xuICBjdHguX19vcmlnaW5hbFRyYW5zZm9ybSA9IGN0eC50cmFuc2Zvcm07XG4gIGN0eC5fX29yaWdpbmFsU2V0VHJhbnNmb3JtID0gY3R4LnNldFRyYW5zZm9ybTtcbiAgY3R4Ll9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybSA9IGN0eC5yZXNldFRyYW5zZm9ybTtcbiAgY3R4Ll9fb3JpZ2luYWxDbGlwID0gY3R4LmNsaXA7XG4gIGN0eC5fX29yaWdpbmFsTW92ZVRvID0gY3R4Lm1vdmVUbztcbiAgY3R4Ll9fb3JpZ2luYWxMaW5lVG8gPSBjdHgubGluZVRvO1xuICBjdHguX19vcmlnaW5hbEJlemllckN1cnZlVG8gPSBjdHguYmV6aWVyQ3VydmVUbztcbiAgY3R4Ll9fb3JpZ2luYWxSZWN0ID0gY3R4LnJlY3Q7XG4gIGN0eC5fX29yaWdpbmFsQ2xvc2VQYXRoID0gY3R4LmNsb3NlUGF0aDtcbiAgY3R4Ll9fb3JpZ2luYWxCZWdpblBhdGggPSBjdHguYmVnaW5QYXRoO1xuICBjdHguX3JlbW92ZU1pcnJvcmluZyA9ICgpID0+IHtcbiAgICBjdHguc2F2ZSA9IGN0eC5fX29yaWdpbmFsU2F2ZTtcbiAgICBjdHgucmVzdG9yZSA9IGN0eC5fX29yaWdpbmFsUmVzdG9yZTtcbiAgICBjdHgucm90YXRlID0gY3R4Ll9fb3JpZ2luYWxSb3RhdGU7XG4gICAgY3R4LnNjYWxlID0gY3R4Ll9fb3JpZ2luYWxTY2FsZTtcbiAgICBjdHgudHJhbnNsYXRlID0gY3R4Ll9fb3JpZ2luYWxUcmFuc2xhdGU7XG4gICAgY3R4LnRyYW5zZm9ybSA9IGN0eC5fX29yaWdpbmFsVHJhbnNmb3JtO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0gPSBjdHguX19vcmlnaW5hbFNldFRyYW5zZm9ybTtcbiAgICBjdHgucmVzZXRUcmFuc2Zvcm0gPSBjdHguX19vcmlnaW5hbFJlc2V0VHJhbnNmb3JtO1xuICAgIGN0eC5jbGlwID0gY3R4Ll9fb3JpZ2luYWxDbGlwO1xuICAgIGN0eC5tb3ZlVG8gPSBjdHguX19vcmlnaW5hbE1vdmVUbztcbiAgICBjdHgubGluZVRvID0gY3R4Ll9fb3JpZ2luYWxMaW5lVG87XG4gICAgY3R4LmJlemllckN1cnZlVG8gPSBjdHguX19vcmlnaW5hbEJlemllckN1cnZlVG87XG4gICAgY3R4LnJlY3QgPSBjdHguX19vcmlnaW5hbFJlY3Q7XG4gICAgY3R4LmNsb3NlUGF0aCA9IGN0eC5fX29yaWdpbmFsQ2xvc2VQYXRoO1xuICAgIGN0eC5iZWdpblBhdGggPSBjdHguX19vcmlnaW5hbEJlZ2luUGF0aDtcbiAgICBkZWxldGUgY3R4Ll9yZW1vdmVNaXJyb3Jpbmc7XG4gIH07XG4gIGN0eC5zYXZlID0gZnVuY3Rpb24gY3R4U2F2ZSgpIHtcbiAgICBkZXN0Q3R4LnNhdmUoKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxTYXZlKCk7XG4gIH07XG4gIGN0eC5yZXN0b3JlID0gZnVuY3Rpb24gY3R4UmVzdG9yZSgpIHtcbiAgICBkZXN0Q3R4LnJlc3RvcmUoKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxSZXN0b3JlKCk7XG4gIH07XG4gIGN0eC50cmFuc2xhdGUgPSBmdW5jdGlvbiBjdHhUcmFuc2xhdGUoeCwgeSkge1xuICAgIGRlc3RDdHgudHJhbnNsYXRlKHgsIHkpO1xuICAgIHRoaXMuX19vcmlnaW5hbFRyYW5zbGF0ZSh4LCB5KTtcbiAgfTtcbiAgY3R4LnNjYWxlID0gZnVuY3Rpb24gY3R4U2NhbGUoeCwgeSkge1xuICAgIGRlc3RDdHguc2NhbGUoeCwgeSk7XG4gICAgdGhpcy5fX29yaWdpbmFsU2NhbGUoeCwgeSk7XG4gIH07XG4gIGN0eC50cmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikge1xuICAgIGRlc3RDdHgudHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuICAgIHRoaXMuX19vcmlnaW5hbFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcbiAgfTtcbiAgY3R4LnNldFRyYW5zZm9ybSA9IGZ1bmN0aW9uIGN0eFNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgZGVzdEN0eC5zZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG4gICAgdGhpcy5fX29yaWdpbmFsU2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuICB9O1xuICBjdHgucmVzZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhSZXNldFRyYW5zZm9ybSgpIHtcbiAgICBkZXN0Q3R4LnJlc2V0VHJhbnNmb3JtKCk7XG4gICAgdGhpcy5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm0oKTtcbiAgfTtcbiAgY3R4LnJvdGF0ZSA9IGZ1bmN0aW9uIGN0eFJvdGF0ZShhbmdsZSkge1xuICAgIGRlc3RDdHgucm90YXRlKGFuZ2xlKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxSb3RhdGUoYW5nbGUpO1xuICB9O1xuICBjdHguY2xpcCA9IGZ1bmN0aW9uIGN0eFJvdGF0ZShydWxlKSB7XG4gICAgZGVzdEN0eC5jbGlwKHJ1bGUpO1xuICAgIHRoaXMuX19vcmlnaW5hbENsaXAocnVsZSk7XG4gIH07XG4gIGN0eC5tb3ZlVG8gPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIGRlc3RDdHgubW92ZVRvKHgsIHkpO1xuICAgIHRoaXMuX19vcmlnaW5hbE1vdmVUbyh4LCB5KTtcbiAgfTtcbiAgY3R4LmxpbmVUbyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgZGVzdEN0eC5saW5lVG8oeCwgeSk7XG4gICAgdGhpcy5fX29yaWdpbmFsTGluZVRvKHgsIHkpO1xuICB9O1xuICBjdHguYmV6aWVyQ3VydmVUbyA9IGZ1bmN0aW9uIChjcDF4LCBjcDF5LCBjcDJ4LCBjcDJ5LCB4LCB5KSB7XG4gICAgZGVzdEN0eC5iZXppZXJDdXJ2ZVRvKGNwMXgsIGNwMXksIGNwMngsIGNwMnksIHgsIHkpO1xuICAgIHRoaXMuX19vcmlnaW5hbEJlemllckN1cnZlVG8oY3AxeCwgY3AxeSwgY3AyeCwgY3AyeSwgeCwgeSk7XG4gIH07XG4gIGN0eC5yZWN0ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBkZXN0Q3R4LnJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5fX29yaWdpbmFsUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgfTtcbiAgY3R4LmNsb3NlUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICBkZXN0Q3R4LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX19vcmlnaW5hbENsb3NlUGF0aCgpO1xuICB9O1xuICBjdHguYmVnaW5QYXRoID0gZnVuY3Rpb24gKCkge1xuICAgIGRlc3RDdHguYmVnaW5QYXRoKCk7XG4gICAgdGhpcy5fX29yaWdpbmFsQmVnaW5QYXRoKCk7XG4gIH07XG59XG5jbGFzcyBDYWNoZWRDYW52YXNlcyB7XG4gIGNvbnN0cnVjdG9yKGNhbnZhc0ZhY3RvcnkpIHtcbiAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBjYW52YXNGYWN0b3J5O1xuICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIGdldENhbnZhcyhpZCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGxldCBjYW52YXNFbnRyeTtcbiAgICBpZiAodGhpcy5jYWNoZVtpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FudmFzRW50cnkgPSB0aGlzLmNhY2hlW2lkXTtcbiAgICAgIHRoaXMuY2FudmFzRmFjdG9yeS5yZXNldChjYW52YXNFbnRyeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbnZhc0VudHJ5ID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuY2FjaGVbaWRdID0gY2FudmFzRW50cnk7XG4gICAgfVxuICAgIHJldHVybiBjYW52YXNFbnRyeTtcbiAgfVxuICBkZWxldGUoaWQpIHtcbiAgICBkZWxldGUgdGhpcy5jYWNoZVtpZF07XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmNhY2hlKSB7XG4gICAgICBjb25zdCBjYW52YXNFbnRyeSA9IHRoaXMuY2FjaGVbaWRdO1xuICAgICAgdGhpcy5jYW52YXNGYWN0b3J5LmRlc3Ryb3koY2FudmFzRW50cnkpO1xuICAgICAgZGVsZXRlIHRoaXMuY2FjaGVbaWRdO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKGN0eCwgc3JjSW1nLCBzcmNYLCBzcmNZLCBzcmNXLCBzcmNILCBkZXN0WCwgZGVzdFksIGRlc3RXLCBkZXN0SCkge1xuICBjb25zdCBbYSwgYiwgYywgZCwgdHgsIHR5XSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KTtcbiAgaWYgKGIgPT09IDAgJiYgYyA9PT0gMCkge1xuICAgIGNvbnN0IHRsWCA9IGRlc3RYICogYSArIHR4O1xuICAgIGNvbnN0IHJUbFggPSBNYXRoLnJvdW5kKHRsWCk7XG4gICAgY29uc3QgdGxZID0gZGVzdFkgKiBkICsgdHk7XG4gICAgY29uc3QgclRsWSA9IE1hdGgucm91bmQodGxZKTtcbiAgICBjb25zdCBiclggPSAoZGVzdFggKyBkZXN0VykgKiBhICsgdHg7XG4gICAgY29uc3QgcldpZHRoID0gTWF0aC5hYnMoTWF0aC5yb3VuZChiclgpIC0gclRsWCkgfHwgMTtcbiAgICBjb25zdCBiclkgPSAoZGVzdFkgKyBkZXN0SCkgKiBkICsgdHk7XG4gICAgY29uc3QgckhlaWdodCA9IE1hdGguYWJzKE1hdGgucm91bmQoYnJZKSAtIHJUbFkpIHx8IDE7XG4gICAgY3R4LnNldFRyYW5zZm9ybShNYXRoLnNpZ24oYSksIDAsIDAsIE1hdGguc2lnbihkKSwgclRsWCwgclRsWSk7XG4gICAgY3R4LmRyYXdJbWFnZShzcmNJbWcsIHNyY1gsIHNyY1ksIHNyY1csIHNyY0gsIDAsIDAsIHJXaWR0aCwgckhlaWdodCk7XG4gICAgY3R4LnNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCB0eCwgdHkpO1xuICAgIHJldHVybiBbcldpZHRoLCBySGVpZ2h0XTtcbiAgfVxuICBpZiAoYSA9PT0gMCAmJiBkID09PSAwKSB7XG4gICAgY29uc3QgdGxYID0gZGVzdFkgKiBjICsgdHg7XG4gICAgY29uc3QgclRsWCA9IE1hdGgucm91bmQodGxYKTtcbiAgICBjb25zdCB0bFkgPSBkZXN0WCAqIGIgKyB0eTtcbiAgICBjb25zdCByVGxZID0gTWF0aC5yb3VuZCh0bFkpO1xuICAgIGNvbnN0IGJyWCA9IChkZXN0WSArIGRlc3RIKSAqIGMgKyB0eDtcbiAgICBjb25zdCByV2lkdGggPSBNYXRoLmFicyhNYXRoLnJvdW5kKGJyWCkgLSByVGxYKSB8fCAxO1xuICAgIGNvbnN0IGJyWSA9IChkZXN0WCArIGRlc3RXKSAqIGIgKyB0eTtcbiAgICBjb25zdCBySGVpZ2h0ID0gTWF0aC5hYnMoTWF0aC5yb3VuZChiclkpIC0gclRsWSkgfHwgMTtcbiAgICBjdHguc2V0VHJhbnNmb3JtKDAsIE1hdGguc2lnbihiKSwgTWF0aC5zaWduKGMpLCAwLCByVGxYLCByVGxZKTtcbiAgICBjdHguZHJhd0ltYWdlKHNyY0ltZywgc3JjWCwgc3JjWSwgc3JjVywgc3JjSCwgMCwgMCwgckhlaWdodCwgcldpZHRoKTtcbiAgICBjdHguc2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIHR4LCB0eSk7XG4gICAgcmV0dXJuIFtySGVpZ2h0LCByV2lkdGhdO1xuICB9XG4gIGN0eC5kcmF3SW1hZ2Uoc3JjSW1nLCBzcmNYLCBzcmNZLCBzcmNXLCBzcmNILCBkZXN0WCwgZGVzdFksIGRlc3RXLCBkZXN0SCk7XG4gIGNvbnN0IHNjYWxlWCA9IE1hdGguaHlwb3QoYSwgYik7XG4gIGNvbnN0IHNjYWxlWSA9IE1hdGguaHlwb3QoYywgZCk7XG4gIHJldHVybiBbc2NhbGVYICogZGVzdFcsIHNjYWxlWSAqIGRlc3RIXTtcbn1cbmZ1bmN0aW9uIGNvbXBpbGVUeXBlM0dseXBoKGltZ0RhdGEpIHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodFxuICB9ID0gaW1nRGF0YTtcbiAgaWYgKHdpZHRoID4gTUFYX1NJWkVfVE9fQ09NUElMRSB8fCBoZWlnaHQgPiBNQVhfU0laRV9UT19DT01QSUxFKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCA9IDEwMDA7XG4gIGNvbnN0IFBPSU5UX1RZUEVTID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDIsIDQsIDAsIDEsIDAsIDUsIDQsIDgsIDEwLCAwLCA4LCAwLCAyLCAxLCAwXSk7XG4gIGNvbnN0IHdpZHRoMSA9IHdpZHRoICsgMTtcbiAgbGV0IHBvaW50cyA9IG5ldyBVaW50OEFycmF5KHdpZHRoMSAqIChoZWlnaHQgKyAxKSk7XG4gIGxldCBpLCBqLCBqMDtcbiAgY29uc3QgbGluZVNpemUgPSB3aWR0aCArIDcgJiB+NztcbiAgbGV0IGRhdGEgPSBuZXcgVWludDhBcnJheShsaW5lU2l6ZSAqIGhlaWdodCksXG4gICAgcG9zID0gMDtcbiAgZm9yIChjb25zdCBlbGVtIG9mIGltZ0RhdGEuZGF0YSkge1xuICAgIGxldCBtYXNrID0gMTI4O1xuICAgIHdoaWxlIChtYXNrID4gMCkge1xuICAgICAgZGF0YVtwb3MrK10gPSBlbGVtICYgbWFzayA/IDAgOiAyNTU7XG4gICAgICBtYXNrID4+PSAxO1xuICAgIH1cbiAgfVxuICBsZXQgY291bnQgPSAwO1xuICBwb3MgPSAwO1xuICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG4gICAgcG9pbnRzWzBdID0gMTtcbiAgICArK2NvdW50O1xuICB9XG4gIGZvciAoaiA9IDE7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgaWYgKGRhdGFbcG9zXSAhPT0gZGF0YVtwb3MgKyAxXSkge1xuICAgICAgcG9pbnRzW2pdID0gZGF0YVtwb3NdID8gMiA6IDE7XG4gICAgICArK2NvdW50O1xuICAgIH1cbiAgICBwb3MrKztcbiAgfVxuICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG4gICAgcG9pbnRzW2pdID0gMjtcbiAgICArK2NvdW50O1xuICB9XG4gIGZvciAoaSA9IDE7IGkgPCBoZWlnaHQ7IGkrKykge1xuICAgIHBvcyA9IGkgKiBsaW5lU2l6ZTtcbiAgICBqMCA9IGkgKiB3aWR0aDE7XG4gICAgaWYgKGRhdGFbcG9zIC0gbGluZVNpemVdICE9PSBkYXRhW3Bvc10pIHtcbiAgICAgIHBvaW50c1tqMF0gPSBkYXRhW3Bvc10gPyAxIDogODtcbiAgICAgICsrY291bnQ7XG4gICAgfVxuICAgIGxldCBzdW0gPSAoZGF0YVtwb3NdID8gNCA6IDApICsgKGRhdGFbcG9zIC0gbGluZVNpemVdID8gOCA6IDApO1xuICAgIGZvciAoaiA9IDE7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgICBzdW0gPSAoc3VtID4+IDIpICsgKGRhdGFbcG9zICsgMV0gPyA0IDogMCkgKyAoZGF0YVtwb3MgLSBsaW5lU2l6ZSArIDFdID8gOCA6IDApO1xuICAgICAgaWYgKFBPSU5UX1RZUEVTW3N1bV0pIHtcbiAgICAgICAgcG9pbnRzW2owICsgal0gPSBQT0lOVF9UWVBFU1tzdW1dO1xuICAgICAgICArK2NvdW50O1xuICAgICAgfVxuICAgICAgcG9zKys7XG4gICAgfVxuICAgIGlmIChkYXRhW3BvcyAtIGxpbmVTaXplXSAhPT0gZGF0YVtwb3NdKSB7XG4gICAgICBwb2ludHNbajAgKyBqXSA9IGRhdGFbcG9zXSA/IDIgOiA0O1xuICAgICAgKytjb3VudDtcbiAgICB9XG4gICAgaWYgKGNvdW50ID4gUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHBvcyA9IGxpbmVTaXplICogKGhlaWdodCAtIDEpO1xuICBqMCA9IGkgKiB3aWR0aDE7XG4gIGlmIChkYXRhW3Bvc10gIT09IDApIHtcbiAgICBwb2ludHNbajBdID0gODtcbiAgICArK2NvdW50O1xuICB9XG4gIGZvciAoaiA9IDE7IGogPCB3aWR0aDsgaisrKSB7XG4gICAgaWYgKGRhdGFbcG9zXSAhPT0gZGF0YVtwb3MgKyAxXSkge1xuICAgICAgcG9pbnRzW2owICsgal0gPSBkYXRhW3Bvc10gPyA0IDogODtcbiAgICAgICsrY291bnQ7XG4gICAgfVxuICAgIHBvcysrO1xuICB9XG4gIGlmIChkYXRhW3Bvc10gIT09IDApIHtcbiAgICBwb2ludHNbajAgKyBqXSA9IDQ7XG4gICAgKytjb3VudDtcbiAgfVxuICBpZiAoY291bnQgPiBQT0lOVF9UT19QUk9DRVNTX0xJTUlUKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgc3RlcHMgPSBuZXcgSW50MzJBcnJheShbMCwgd2lkdGgxLCAtMSwgMCwgLXdpZHRoMSwgMCwgMCwgMCwgMV0pO1xuICBjb25zdCBwYXRoID0gbmV3IFBhdGgyRCgpO1xuICBmb3IgKGkgPSAwOyBjb3VudCAmJiBpIDw9IGhlaWdodDsgaSsrKSB7XG4gICAgbGV0IHAgPSBpICogd2lkdGgxO1xuICAgIGNvbnN0IGVuZCA9IHAgKyB3aWR0aDtcbiAgICB3aGlsZSAocCA8IGVuZCAmJiAhcG9pbnRzW3BdKSB7XG4gICAgICBwKys7XG4gICAgfVxuICAgIGlmIChwID09PSBlbmQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwYXRoLm1vdmVUbyhwICUgd2lkdGgxLCBpKTtcbiAgICBjb25zdCBwMCA9IHA7XG4gICAgbGV0IHR5cGUgPSBwb2ludHNbcF07XG4gICAgZG8ge1xuICAgICAgY29uc3Qgc3RlcCA9IHN0ZXBzW3R5cGVdO1xuICAgICAgZG8ge1xuICAgICAgICBwICs9IHN0ZXA7XG4gICAgICB9IHdoaWxlICghcG9pbnRzW3BdKTtcbiAgICAgIGNvbnN0IHBwID0gcG9pbnRzW3BdO1xuICAgICAgaWYgKHBwICE9PSA1ICYmIHBwICE9PSAxMCkge1xuICAgICAgICB0eXBlID0gcHA7XG4gICAgICAgIHBvaW50c1twXSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gcHAgJiAweDMzICogdHlwZSA+PiA0O1xuICAgICAgICBwb2ludHNbcF0gJj0gdHlwZSA+PiAyIHwgdHlwZSA8PCAyO1xuICAgICAgfVxuICAgICAgcGF0aC5saW5lVG8ocCAlIHdpZHRoMSwgcCAvIHdpZHRoMSB8IDApO1xuICAgICAgaWYgKCFwb2ludHNbcF0pIHtcbiAgICAgICAgLS1jb3VudDtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChwMCAhPT0gcCk7XG4gICAgLS1pO1xuICB9XG4gIGRhdGEgPSBudWxsO1xuICBwb2ludHMgPSBudWxsO1xuICBjb25zdCBkcmF3T3V0bGluZSA9IGZ1bmN0aW9uIChjKSB7XG4gICAgYy5zYXZlKCk7XG4gICAgYy5zY2FsZSgxIC8gd2lkdGgsIC0xIC8gaGVpZ2h0KTtcbiAgICBjLnRyYW5zbGF0ZSgwLCAtaGVpZ2h0KTtcbiAgICBjLmZpbGwocGF0aCk7XG4gICAgYy5iZWdpblBhdGgoKTtcbiAgICBjLnJlc3RvcmUoKTtcbiAgfTtcbiAgcmV0dXJuIGRyYXdPdXRsaW5lO1xufVxuY2xhc3MgQ2FudmFzRXh0cmFTdGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLmFscGhhSXNTaGFwZSA9IGZhbHNlO1xuICAgIHRoaXMuZm9udFNpemUgPSAwO1xuICAgIHRoaXMuZm9udFNpemVTY2FsZSA9IDE7XG4gICAgdGhpcy50ZXh0TWF0cml4ID0gSURFTlRJVFlfTUFUUklYO1xuICAgIHRoaXMudGV4dE1hdHJpeFNjYWxlID0gMTtcbiAgICB0aGlzLmZvbnRNYXRyaXggPSBGT05UX0lERU5USVRZX01BVFJJWDtcbiAgICB0aGlzLmxlYWRpbmcgPSAwO1xuICAgIHRoaXMueCA9IDA7XG4gICAgdGhpcy55ID0gMDtcbiAgICB0aGlzLmxpbmVYID0gMDtcbiAgICB0aGlzLmxpbmVZID0gMDtcbiAgICB0aGlzLmNoYXJTcGFjaW5nID0gMDtcbiAgICB0aGlzLndvcmRTcGFjaW5nID0gMDtcbiAgICB0aGlzLnRleHRIU2NhbGUgPSAxO1xuICAgIHRoaXMudGV4dFJlbmRlcmluZ01vZGUgPSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMO1xuICAgIHRoaXMudGV4dFJpc2UgPSAwO1xuICAgIHRoaXMuZmlsbENvbG9yID0gXCIjMDAwMDAwXCI7XG4gICAgdGhpcy5zdHJva2VDb2xvciA9IFwiIzAwMDAwMFwiO1xuICAgIHRoaXMucGF0dGVybkZpbGwgPSBmYWxzZTtcbiAgICB0aGlzLmZpbGxBbHBoYSA9IDE7XG4gICAgdGhpcy5zdHJva2VBbHBoYSA9IDE7XG4gICAgdGhpcy5saW5lV2lkdGggPSAxO1xuICAgIHRoaXMuYWN0aXZlU01hc2sgPSBudWxsO1xuICAgIHRoaXMudHJhbnNmZXJNYXBzID0gXCJub25lXCI7XG4gICAgdGhpcy5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLCAwLCB3aWR0aCwgaGVpZ2h0XSk7XG4gIH1cbiAgY2xvbmUoKSB7XG4gICAgY29uc3QgY2xvbmUgPSBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIGNsb25lLmNsaXBCb3ggPSB0aGlzLmNsaXBCb3guc2xpY2UoKTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cbiAgc2V0Q3VycmVudFBvaW50KHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cbiAgdXBkYXRlUGF0aE1pbk1heCh0cmFuc2Zvcm0sIHgsIHkpIHtcbiAgICBbeCwgeV0gPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFt4LCB5XSwgdHJhbnNmb3JtKTtcbiAgICB0aGlzLm1pblggPSBNYXRoLm1pbih0aGlzLm1pblgsIHgpO1xuICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgeSk7XG4gICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCB4KTtcbiAgICB0aGlzLm1heFkgPSBNYXRoLm1heCh0aGlzLm1heFksIHkpO1xuICB9XG4gIHVwZGF0ZVJlY3RNaW5NYXgodHJhbnNmb3JtLCByZWN0KSB7XG4gICAgY29uc3QgcDEgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKHJlY3QsIHRyYW5zZm9ybSk7XG4gICAgY29uc3QgcDIgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKHJlY3Quc2xpY2UoMiksIHRyYW5zZm9ybSk7XG4gICAgY29uc3QgcDMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyZWN0WzBdLCByZWN0WzNdXSwgdHJhbnNmb3JtKTtcbiAgICBjb25zdCBwNCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JlY3RbMl0sIHJlY3RbMV1dLCB0cmFuc2Zvcm0pO1xuICAgIHRoaXMubWluWCA9IE1hdGgubWluKHRoaXMubWluWCwgcDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pO1xuICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgcDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pO1xuICAgIHRoaXMubWF4WCA9IE1hdGgubWF4KHRoaXMubWF4WCwgcDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pO1xuICAgIHRoaXMubWF4WSA9IE1hdGgubWF4KHRoaXMubWF4WSwgcDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pO1xuICB9XG4gIHVwZGF0ZVNjYWxpbmdQYXRoTWluTWF4KHRyYW5zZm9ybSwgbWluTWF4KSB7XG4gICAgVXRpbC5zY2FsZU1pbk1heCh0cmFuc2Zvcm0sIG1pbk1heCk7XG4gICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBtaW5NYXhbMF0pO1xuICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgbWluTWF4WzFdKTtcbiAgICB0aGlzLm1heFggPSBNYXRoLm1heCh0aGlzLm1heFgsIG1pbk1heFsyXSk7XG4gICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBtaW5NYXhbM10pO1xuICB9XG4gIHVwZGF0ZUN1cnZlUGF0aE1pbk1heCh0cmFuc2Zvcm0sIHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgbWluTWF4KSB7XG4gICAgY29uc3QgYm94ID0gVXRpbC5iZXppZXJCb3VuZGluZ0JveCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIG1pbk1heCk7XG4gICAgaWYgKG1pbk1heCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVJlY3RNaW5NYXgodHJhbnNmb3JtLCBib3gpO1xuICB9XG4gIGdldFBhdGhCb3VuZGluZ0JveChwYXRoVHlwZSA9IFBhdGhUeXBlLkZJTEwsIHRyYW5zZm9ybSA9IG51bGwpIHtcbiAgICBjb25zdCBib3ggPSBbdGhpcy5taW5YLCB0aGlzLm1pblksIHRoaXMubWF4WCwgdGhpcy5tYXhZXTtcbiAgICBpZiAocGF0aFR5cGUgPT09IFBhdGhUeXBlLlNUUk9LRSkge1xuICAgICAgaWYgKCF0cmFuc2Zvcm0pIHtcbiAgICAgICAgdW5yZWFjaGFibGUoXCJTdHJva2UgYm91bmRpbmcgYm94IG11c3QgaW5jbHVkZSB0cmFuc2Zvcm0uXCIpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRyYW5zZm9ybSk7XG4gICAgICBjb25zdCB4U3Ryb2tlUGFkID0gc2NhbGVbMF0gKiB0aGlzLmxpbmVXaWR0aCAvIDI7XG4gICAgICBjb25zdCB5U3Ryb2tlUGFkID0gc2NhbGVbMV0gKiB0aGlzLmxpbmVXaWR0aCAvIDI7XG4gICAgICBib3hbMF0gLT0geFN0cm9rZVBhZDtcbiAgICAgIGJveFsxXSAtPSB5U3Ryb2tlUGFkO1xuICAgICAgYm94WzJdICs9IHhTdHJva2VQYWQ7XG4gICAgICBib3hbM10gKz0geVN0cm9rZVBhZDtcbiAgICB9XG4gICAgcmV0dXJuIGJveDtcbiAgfVxuICB1cGRhdGVDbGlwRnJvbVBhdGgoKSB7XG4gICAgY29uc3QgaW50ZXJzZWN0ID0gVXRpbC5pbnRlcnNlY3QodGhpcy5jbGlwQm94LCB0aGlzLmdldFBhdGhCb3VuZGluZ0JveCgpKTtcbiAgICB0aGlzLnN0YXJ0TmV3UGF0aEFuZENsaXBCb3goaW50ZXJzZWN0IHx8IFswLCAwLCAwLCAwXSk7XG4gIH1cbiAgaXNFbXB0eUNsaXAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWluWCA9PT0gSW5maW5pdHk7XG4gIH1cbiAgc3RhcnROZXdQYXRoQW5kQ2xpcEJveChib3gpIHtcbiAgICB0aGlzLmNsaXBCb3ggPSBib3g7XG4gICAgdGhpcy5taW5YID0gSW5maW5pdHk7XG4gICAgdGhpcy5taW5ZID0gSW5maW5pdHk7XG4gICAgdGhpcy5tYXhYID0gMDtcbiAgICB0aGlzLm1heFkgPSAwO1xuICB9XG4gIGdldENsaXBwZWRQYXRoQm91bmRpbmdCb3gocGF0aFR5cGUgPSBQYXRoVHlwZS5GSUxMLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgcmV0dXJuIFV0aWwuaW50ZXJzZWN0KHRoaXMuY2xpcEJveCwgdGhpcy5nZXRQYXRoQm91bmRpbmdCb3gocGF0aFR5cGUsIHRyYW5zZm9ybSkpO1xuICB9XG59XG5mdW5jdGlvbiBwdXRCaW5hcnlJbWFnZURhdGEoY3R4LCBpbWdEYXRhKSB7XG4gIGlmICh0eXBlb2YgSW1hZ2VEYXRhICE9PSBcInVuZGVmaW5lZFwiICYmIGltZ0RhdGEgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGltZ0RhdGEsIDAsIDApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodCxcbiAgICB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG4gIGNvbnN0IHBhcnRpYWxDaHVua0hlaWdodCA9IGhlaWdodCAlIEZVTExfQ0hVTktfSEVJR0hUO1xuICBjb25zdCBmdWxsQ2h1bmtzID0gKGhlaWdodCAtIHBhcnRpYWxDaHVua0hlaWdodCkgLyBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgY29uc3QgdG90YWxDaHVua3MgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQgPT09IDAgPyBmdWxsQ2h1bmtzIDogZnVsbENodW5rcyArIDE7XG4gIGNvbnN0IGNodW5rSW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgbGV0IHNyY1BvcyA9IDAsXG4gICAgZGVzdFBvcztcbiAgY29uc3Qgc3JjID0gaW1nRGF0YS5kYXRhO1xuICBjb25zdCBkZXN0ID0gY2h1bmtJbWdEYXRhLmRhdGE7XG4gIGxldCBpLCBqLCB0aGlzQ2h1bmtIZWlnaHQsIGVsZW1zSW5UaGlzQ2h1bms7XG4gIGlmIChpbWdEYXRhLmtpbmQgPT09IHV0aWxfSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQKSB7XG4gICAgY29uc3Qgc3JjTGVuZ3RoID0gc3JjLmJ5dGVMZW5ndGg7XG4gICAgY29uc3QgZGVzdDMyID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyLCAwLCBkZXN0LmJ5dGVMZW5ndGggPj4gMik7XG4gICAgY29uc3QgZGVzdDMyRGF0YUxlbmd0aCA9IGRlc3QzMi5sZW5ndGg7XG4gICAgY29uc3QgZnVsbFNyY0RpZmYgPSB3aWR0aCArIDcgPj4gMztcbiAgICBjb25zdCB3aGl0ZSA9IDB4ZmZmZmZmZmY7XG4gICAgY29uc3QgYmxhY2sgPSB1dGlsX0ZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8gMHhmZjAwMDAwMCA6IDB4MDAwMDAwZmY7XG4gICAgZm9yIChpID0gMDsgaSA8IHRvdGFsQ2h1bmtzOyBpKyspIHtcbiAgICAgIHRoaXNDaHVua0hlaWdodCA9IGkgPCBmdWxsQ2h1bmtzID8gRlVMTF9DSFVOS19IRUlHSFQgOiBwYXJ0aWFsQ2h1bmtIZWlnaHQ7XG4gICAgICBkZXN0UG9zID0gMDtcbiAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzQ2h1bmtIZWlnaHQ7IGorKykge1xuICAgICAgICBjb25zdCBzcmNEaWZmID0gc3JjTGVuZ3RoIC0gc3JjUG9zO1xuICAgICAgICBsZXQgayA9IDA7XG4gICAgICAgIGNvbnN0IGtFbmQgPSBzcmNEaWZmID4gZnVsbFNyY0RpZmYgPyB3aWR0aCA6IHNyY0RpZmYgKiA4IC0gNztcbiAgICAgICAgY29uc3Qga0VuZFVucm9sbGVkID0ga0VuZCAmIH43O1xuICAgICAgICBsZXQgbWFzayA9IDA7XG4gICAgICAgIGxldCBzcmNCeXRlID0gMDtcbiAgICAgICAgZm9yICg7IGsgPCBrRW5kVW5yb2xsZWQ7IGsgKz0gOCkge1xuICAgICAgICAgIHNyY0J5dGUgPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDEyOCA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgNjQgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDMyID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxNiA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgOCA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgNCA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMiA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMSA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGsgPCBrRW5kOyBrKyspIHtcbiAgICAgICAgICBpZiAobWFzayA9PT0gMCkge1xuICAgICAgICAgICAgc3JjQnl0ZSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgICAgICBtYXNrID0gMTI4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiBtYXNrID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICBtYXNrID4+PSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZGVzdFBvcyA8IGRlc3QzMkRhdGFMZW5ndGgpIHtcbiAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSAwO1xuICAgICAgfVxuICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGkgKiBGVUxMX0NIVU5LX0hFSUdIVCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGltZ0RhdGEua2luZCA9PT0gdXRpbF9JbWFnZUtpbmQuUkdCQV8zMkJQUCkge1xuICAgIGogPSAwO1xuICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIEZVTExfQ0hVTktfSEVJR0hUICogNDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZnVsbENodW5rczsgaSsrKSB7XG4gICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjUG9zLCBzcmNQb3MgKyBlbGVtc0luVGhpc0NodW5rKSk7XG4gICAgICBzcmNQb3MgKz0gZWxlbXNJblRoaXNDaHVuaztcbiAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBqKTtcbiAgICAgIGogKz0gRlVMTF9DSFVOS19IRUlHSFQ7XG4gICAgfVxuICAgIGlmIChpIDwgdG90YWxDaHVua3MpIHtcbiAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHBhcnRpYWxDaHVua0hlaWdodCAqIDQ7XG4gICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjUG9zLCBzcmNQb3MgKyBlbGVtc0luVGhpc0NodW5rKSk7XG4gICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGltZ0RhdGEua2luZCA9PT0gdXRpbF9JbWFnZUtpbmQuUkdCXzI0QlBQKSB7XG4gICAgdGhpc0NodW5rSGVpZ2h0ID0gRlVMTF9DSFVOS19IRUlHSFQ7XG4gICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogdGhpc0NodW5rSGVpZ2h0O1xuICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7XG4gICAgICBpZiAoaSA+PSBmdWxsQ2h1bmtzKSB7XG4gICAgICAgIHRoaXNDaHVua0hlaWdodCA9IHBhcnRpYWxDaHVua0hlaWdodDtcbiAgICAgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogdGhpc0NodW5rSGVpZ2h0O1xuICAgICAgfVxuICAgICAgZGVzdFBvcyA9IDA7XG4gICAgICBmb3IgKGogPSBlbGVtc0luVGhpc0NodW5rOyBqLS07KSB7XG4gICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IDI1NTtcbiAgICAgIH1cbiAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJhZCBpbWFnZSBraW5kOiAke2ltZ0RhdGEua2luZH1gKTtcbiAgfVxufVxuZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VNYXNrKGN0eCwgaW1nRGF0YSkge1xuICBpZiAoaW1nRGF0YS5iaXRtYXApIHtcbiAgICBjdHguZHJhd0ltYWdlKGltZ0RhdGEuYml0bWFwLCAwLCAwKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQsXG4gICAgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICBjb25zdCBwYXJ0aWFsQ2h1bmtIZWlnaHQgPSBoZWlnaHQgJSBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgY29uc3QgZnVsbENodW5rcyA9IChoZWlnaHQgLSBwYXJ0aWFsQ2h1bmtIZWlnaHQpIC8gRlVMTF9DSFVOS19IRUlHSFQ7XG4gIGNvbnN0IHRvdGFsQ2h1bmtzID0gcGFydGlhbENodW5rSGVpZ2h0ID09PSAwID8gZnVsbENodW5rcyA6IGZ1bGxDaHVua3MgKyAxO1xuICBjb25zdCBjaHVua0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBGVUxMX0NIVU5LX0hFSUdIVCk7XG4gIGxldCBzcmNQb3MgPSAwO1xuICBjb25zdCBzcmMgPSBpbWdEYXRhLmRhdGE7XG4gIGNvbnN0IGRlc3QgPSBjaHVua0ltZ0RhdGEuZGF0YTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7XG4gICAgY29uc3QgdGhpc0NodW5rSGVpZ2h0ID0gaSA8IGZ1bGxDaHVua3MgPyBGVUxMX0NIVU5LX0hFSUdIVCA6IHBhcnRpYWxDaHVua0hlaWdodDtcbiAgICAoe1xuICAgICAgc3JjUG9zXG4gICAgfSA9IGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHtcbiAgICAgIHNyYyxcbiAgICAgIHNyY1BvcyxcbiAgICAgIGRlc3QsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodDogdGhpc0NodW5rSGVpZ2h0LFxuICAgICAgbm9uQmxhY2tDb2xvcjogMFxuICAgIH0pKTtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgfVxufVxuZnVuY3Rpb24gY29weUN0eFN0YXRlKHNvdXJjZUN0eCwgZGVzdEN0eCkge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gW1wic3Ryb2tlU3R5bGVcIiwgXCJmaWxsU3R5bGVcIiwgXCJmaWxsUnVsZVwiLCBcImdsb2JhbEFscGhhXCIsIFwibGluZVdpZHRoXCIsIFwibGluZUNhcFwiLCBcImxpbmVKb2luXCIsIFwibWl0ZXJMaW1pdFwiLCBcImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblwiLCBcImZvbnRcIiwgXCJmaWx0ZXJcIl07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xuICAgIGlmIChzb3VyY2VDdHhbcHJvcGVydHldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RDdHhbcHJvcGVydHldID0gc291cmNlQ3R4W3Byb3BlcnR5XTtcbiAgICB9XG4gIH1cbiAgaWYgKHNvdXJjZUN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVzdEN0eC5zZXRMaW5lRGFzaChzb3VyY2VDdHguZ2V0TGluZURhc2goKSk7XG4gICAgZGVzdEN0eC5saW5lRGFzaE9mZnNldCA9IHNvdXJjZUN0eC5saW5lRGFzaE9mZnNldDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzZXRDdHhUb0RlZmF1bHQoY3R4KSB7XG4gIGN0eC5zdHJva2VTdHlsZSA9IGN0eC5maWxsU3R5bGUgPSBcIiMwMDAwMDBcIjtcbiAgY3R4LmZpbGxSdWxlID0gXCJub256ZXJvXCI7XG4gIGN0eC5nbG9iYWxBbHBoYSA9IDE7XG4gIGN0eC5saW5lV2lkdGggPSAxO1xuICBjdHgubGluZUNhcCA9IFwiYnV0dFwiO1xuICBjdHgubGluZUpvaW4gPSBcIm1pdGVyXCI7XG4gIGN0eC5taXRlckxpbWl0ID0gMTA7XG4gIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1vdmVyXCI7XG4gIGN0eC5mb250ID0gXCIxMHB4IHNhbnMtc2VyaWZcIjtcbiAgaWYgKGN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY3R4LnNldExpbmVEYXNoKFtdKTtcbiAgICBjdHgubGluZURhc2hPZmZzZXQgPSAwO1xuICB9XG4gIGlmICghaXNOb2RlSlMpIHtcbiAgICBjb25zdCB7XG4gICAgICBmaWx0ZXJcbiAgICB9ID0gY3R4O1xuICAgIGlmIChmaWx0ZXIgIT09IFwibm9uZVwiICYmIGZpbHRlciAhPT0gXCJcIikge1xuICAgICAgY3R4LmZpbHRlciA9IFwibm9uZVwiO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKHRyYW5zZm9ybSwgaW50ZXJwb2xhdGUpIHtcbiAgaWYgKGludGVycG9sYXRlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3Qgc2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRyYW5zZm9ybSk7XG4gIHNjYWxlWzBdID0gTWF0aC5mcm91bmQoc2NhbGVbMF0pO1xuICBzY2FsZVsxXSA9IE1hdGguZnJvdW5kKHNjYWxlWzFdKTtcbiAgY29uc3QgYWN0dWFsU2NhbGUgPSBNYXRoLmZyb3VuZCgoZ2xvYmFsVGhpcy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpICogUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTKTtcbiAgcmV0dXJuIHNjYWxlWzBdIDw9IGFjdHVhbFNjYWxlICYmIHNjYWxlWzFdIDw9IGFjdHVhbFNjYWxlO1xufVxuY29uc3QgTElORV9DQVBfU1RZTEVTID0gW1wiYnV0dFwiLCBcInJvdW5kXCIsIFwic3F1YXJlXCJdO1xuY29uc3QgTElORV9KT0lOX1NUWUxFUyA9IFtcIm1pdGVyXCIsIFwicm91bmRcIiwgXCJiZXZlbFwiXTtcbmNvbnN0IE5PUk1BTF9DTElQID0ge307XG5jb25zdCBFT19DTElQID0ge307XG5jbGFzcyBDYW52YXNHcmFwaGljcyB7XG4gIGNvbnN0cnVjdG9yKGNhbnZhc0N0eCwgY29tbW9uT2Jqcywgb2JqcywgY2FudmFzRmFjdG9yeSwgZmlsdGVyRmFjdG9yeSwge1xuICAgIG9wdGlvbmFsQ29udGVudENvbmZpZyxcbiAgICBtYXJrZWRDb250ZW50U3RhY2sgPSBudWxsXG4gIH0sIGFubm90YXRpb25DYW52YXNNYXAsIHBhZ2VDb2xvcnMpIHtcbiAgICB0aGlzLmN0eCA9IGNhbnZhc0N0eDtcbiAgICB0aGlzLmN1cnJlbnQgPSBuZXcgQ2FudmFzRXh0cmFTdGF0ZSh0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuc3RhdGVTdGFjayA9IFtdO1xuICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlO1xuICAgIHRoaXMucmVzID0gbnVsbDtcbiAgICB0aGlzLnhvYmpzID0gbnVsbDtcbiAgICB0aGlzLmNvbW1vbk9ianMgPSBjb21tb25PYmpzO1xuICAgIHRoaXMub2JqcyA9IG9ianM7XG4gICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTtcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSBmaWx0ZXJGYWN0b3J5O1xuICAgIHRoaXMuZ3JvdXBTdGFjayA9IFtdO1xuICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gbnVsbDtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSBudWxsO1xuICAgIHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrID0gW107XG4gICAgdGhpcy5ncm91cExldmVsID0gMDtcbiAgICB0aGlzLnNtYXNrU3RhY2sgPSBbXTtcbiAgICB0aGlzLnNtYXNrQ291bnRlciA9IDA7XG4gICAgdGhpcy50ZW1wU01hc2sgPSBudWxsO1xuICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gbnVsbDtcbiAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjayA9IG1hcmtlZENvbnRlbnRTdGFjayB8fCBbXTtcbiAgICB0aGlzLm9wdGlvbmFsQ29udGVudENvbmZpZyA9IG9wdGlvbmFsQ29udGVudENvbmZpZztcbiAgICB0aGlzLmNhY2hlZENhbnZhc2VzID0gbmV3IENhY2hlZENhbnZhc2VzKHRoaXMuY2FudmFzRmFjdG9yeSk7XG4gICAgdGhpcy5jYWNoZWRQYXR0ZXJucyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAgPSBhbm5vdGF0aW9uQ2FudmFzTWFwO1xuICAgIHRoaXMudmlld3BvcnRTY2FsZSA9IDE7XG4gICAgdGhpcy5vdXRwdXRTY2FsZVggPSAxO1xuICAgIHRoaXMub3V0cHV0U2NhbGVZID0gMTtcbiAgICB0aGlzLnBhZ2VDb2xvcnMgPSBwYWdlQ29sb3JzO1xuICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmcgPSBbLTEsIDBdO1xuICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAgPSBuZXcgTWFwKCk7XG4gIH1cbiAgZ2V0T2JqZWN0KGRhdGEsIGZhbGxiYWNrID0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIGRhdGEuc3RhcnRzV2l0aChcImdfXCIpID8gdGhpcy5jb21tb25PYmpzLmdldChkYXRhKSA6IHRoaXMub2Jqcy5nZXQoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxsYmFjaztcbiAgfVxuICBiZWdpbkRyYXdpbmcoe1xuICAgIHRyYW5zZm9ybSxcbiAgICB2aWV3cG9ydCxcbiAgICB0cmFuc3BhcmVuY3kgPSBmYWxzZSxcbiAgICBiYWNrZ3JvdW5kID0gbnVsbFxuICB9KSB7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmN0eC5jYW52YXMud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5jdHguY2FudmFzLmhlaWdodDtcbiAgICBjb25zdCBzYXZlZEZpbGxTdHlsZSA9IHRoaXMuY3R4LmZpbGxTdHlsZTtcbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kIHx8IFwiI2ZmZmZmZlwiO1xuICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IHNhdmVkRmlsbFN0eWxlO1xuICAgIGlmICh0cmFuc3BhcmVuY3kpIHtcbiAgICAgIGNvbnN0IHRyYW5zcGFyZW50Q2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJ0cmFuc3BhcmVudFwiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuY29tcG9zaXRlQ3R4ID0gdGhpcy5jdHg7XG4gICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gdHJhbnNwYXJlbnRDYW52YXMuY2FudmFzO1xuICAgICAgdGhpcy5jdHggPSB0cmFuc3BhcmVudENhbnZhcy5jb250ZXh0O1xuICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgdGhpcy5jdHgudHJhbnNmb3JtKC4uLmdldEN1cnJlbnRUcmFuc2Zvcm0odGhpcy5jb21wb3NpdGVDdHgpKTtcbiAgICB9XG4gICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oLi4udHJhbnNmb3JtKTtcbiAgICAgIHRoaXMub3V0cHV0U2NhbGVYID0gdHJhbnNmb3JtWzBdO1xuICAgICAgdGhpcy5vdXRwdXRTY2FsZVkgPSB0cmFuc2Zvcm1bMF07XG4gICAgfVxuICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi52aWV3cG9ydC50cmFuc2Zvcm0pO1xuICAgIHRoaXMudmlld3BvcnRTY2FsZSA9IHZpZXdwb3J0LnNjYWxlO1xuICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0odGhpcy5jdHgpO1xuICB9XG4gIGV4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0LCBleGVjdXRpb25TdGFydElkeCwgY29udGludWVDYWxsYmFjaywgc3RlcHBlcikge1xuICAgIGNvbnN0IGFyZ3NBcnJheSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXk7XG4gICAgY29uc3QgZm5BcnJheSA9IG9wZXJhdG9yTGlzdC5mbkFycmF5O1xuICAgIGxldCBpID0gZXhlY3V0aW9uU3RhcnRJZHggfHwgMDtcbiAgICBjb25zdCBhcmdzQXJyYXlMZW4gPSBhcmdzQXJyYXkubGVuZ3RoO1xuICAgIGlmIChhcmdzQXJyYXlMZW4gPT09IGkpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICBjb25zdCBjaHVua09wZXJhdGlvbnMgPSBhcmdzQXJyYXlMZW4gLSBpID4gRVhFQ1VUSU9OX1NURVBTICYmIHR5cGVvZiBjb250aW51ZUNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCI7XG4gICAgY29uc3QgZW5kVGltZSA9IGNodW5rT3BlcmF0aW9ucyA/IERhdGUubm93KCkgKyBFWEVDVVRJT05fVElNRSA6IDA7XG4gICAgbGV0IHN0ZXBzID0gMDtcbiAgICBjb25zdCBjb21tb25PYmpzID0gdGhpcy5jb21tb25PYmpzO1xuICAgIGNvbnN0IG9ianMgPSB0aGlzLm9ianM7XG4gICAgbGV0IGZuSWQ7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChzdGVwcGVyICE9PSB1bmRlZmluZWQgJiYgaSA9PT0gc3RlcHBlci5uZXh0QnJlYWtQb2ludCkge1xuICAgICAgICBzdGVwcGVyLmJyZWFrSXQoaSwgY29udGludWVDYWxsYmFjayk7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgICAgZm5JZCA9IGZuQXJyYXlbaV07XG4gICAgICBpZiAoZm5JZCAhPT0gT1BTLmRlcGVuZGVuY3kpIHtcbiAgICAgICAgdGhpc1tmbklkXS5hcHBseSh0aGlzLCBhcmdzQXJyYXlbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXBPYmpJZCBvZiBhcmdzQXJyYXlbaV0pIHtcbiAgICAgICAgICBjb25zdCBvYmpzUG9vbCA9IGRlcE9iaklkLnN0YXJ0c1dpdGgoXCJnX1wiKSA/IGNvbW1vbk9ianMgOiBvYmpzO1xuICAgICAgICAgIGlmICghb2Jqc1Bvb2wuaGFzKGRlcE9iaklkKSkge1xuICAgICAgICAgICAgb2Jqc1Bvb2wuZ2V0KGRlcE9iaklkLCBjb250aW51ZUNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaSsrO1xuICAgICAgaWYgKGkgPT09IGFyZ3NBcnJheUxlbikge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICAgIGlmIChjaHVua09wZXJhdGlvbnMgJiYgKytzdGVwcyA+IEVYRUNVVElPTl9TVEVQUykge1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IGVuZFRpbWUpIHtcbiAgICAgICAgICBjb250aW51ZUNhbGxiYWNrKCk7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgc3RlcHMgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAjcmVzdG9yZUluaXRpYWxTdGF0ZSgpIHtcbiAgICB3aGlsZSAodGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCB8fCB0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB9XG4gICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgIGlmICh0aGlzLnRyYW5zcGFyZW50Q2FudmFzKSB7XG4gICAgICB0aGlzLmN0eCA9IHRoaXMuY29tcG9zaXRlQ3R4O1xuICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMudHJhbnNwYXJlbnRDYW52YXMsIDAsIDApO1xuICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgdGhpcy50cmFuc3BhcmVudENhbnZhcyA9IG51bGw7XG4gICAgfVxuICB9XG4gIGVuZERyYXdpbmcoKSB7XG4gICAgdGhpcy4jcmVzdG9yZUluaXRpYWxTdGF0ZSgpO1xuICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMuY2xlYXIoKTtcbiAgICB0aGlzLmNhY2hlZFBhdHRlcm5zLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBjYWNoZSBvZiB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLnZhbHVlcygpKSB7XG4gICAgICBmb3IgKGNvbnN0IGNhbnZhcyBvZiBjYWNoZS52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodHlwZW9mIEhUTUxDYW52YXNFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIGNhbnZhcyBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSB7XG4gICAgICAgICAgY2FudmFzLndpZHRoID0gY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgfVxuICAgIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAuY2xlYXIoKTtcbiAgICB0aGlzLiNkcmF3RmlsdGVyKCk7XG4gIH1cbiAgI2RyYXdGaWx0ZXIoKSB7XG4gICAgaWYgKHRoaXMucGFnZUNvbG9ycykge1xuICAgICAgY29uc3QgaGNtRmlsdGVySWQgPSB0aGlzLmZpbHRlckZhY3RvcnkuYWRkSENNRmlsdGVyKHRoaXMucGFnZUNvbG9ycy5mb3JlZ3JvdW5kLCB0aGlzLnBhZ2VDb2xvcnMuYmFja2dyb3VuZCk7XG4gICAgICBpZiAoaGNtRmlsdGVySWQgIT09IFwibm9uZVwiKSB7XG4gICAgICAgIGNvbnN0IHNhdmVkRmlsdGVyID0gdGhpcy5jdHguZmlsdGVyO1xuICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSBoY21GaWx0ZXJJZDtcbiAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuY3R4LmNhbnZhcywgMCwgMCk7XG4gICAgICAgIHRoaXMuY3R4LmZpbHRlciA9IHNhdmVkRmlsdGVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfc2NhbGVJbWFnZShpbWcsIGludmVyc2VUcmFuc2Zvcm0pIHtcbiAgICBjb25zdCB3aWR0aCA9IGltZy53aWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgIGxldCB3aWR0aFNjYWxlID0gTWF0aC5tYXgoTWF0aC5oeXBvdChpbnZlcnNlVHJhbnNmb3JtWzBdLCBpbnZlcnNlVHJhbnNmb3JtWzFdKSwgMSk7XG4gICAgbGV0IGhlaWdodFNjYWxlID0gTWF0aC5tYXgoTWF0aC5oeXBvdChpbnZlcnNlVHJhbnNmb3JtWzJdLCBpbnZlcnNlVHJhbnNmb3JtWzNdKSwgMSk7XG4gICAgbGV0IHBhaW50V2lkdGggPSB3aWR0aCxcbiAgICAgIHBhaW50SGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGxldCB0bXBDYW52YXNJZCA9IFwicHJlc2NhbGUxXCI7XG4gICAgbGV0IHRtcENhbnZhcywgdG1wQ3R4O1xuICAgIHdoaWxlICh3aWR0aFNjYWxlID4gMiAmJiBwYWludFdpZHRoID4gMSB8fCBoZWlnaHRTY2FsZSA+IDIgJiYgcGFpbnRIZWlnaHQgPiAxKSB7XG4gICAgICBsZXQgbmV3V2lkdGggPSBwYWludFdpZHRoLFxuICAgICAgICBuZXdIZWlnaHQgPSBwYWludEhlaWdodDtcbiAgICAgIGlmICh3aWR0aFNjYWxlID4gMiAmJiBwYWludFdpZHRoID4gMSkge1xuICAgICAgICBuZXdXaWR0aCA9IHBhaW50V2lkdGggPj0gMTYzODQgPyBNYXRoLmZsb29yKHBhaW50V2lkdGggLyAyKSAtIDEgfHwgMSA6IE1hdGguY2VpbChwYWludFdpZHRoIC8gMik7XG4gICAgICAgIHdpZHRoU2NhbGUgLz0gcGFpbnRXaWR0aCAvIG5ld1dpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKGhlaWdodFNjYWxlID4gMiAmJiBwYWludEhlaWdodCA+IDEpIHtcbiAgICAgICAgbmV3SGVpZ2h0ID0gcGFpbnRIZWlnaHQgPj0gMTYzODQgPyBNYXRoLmZsb29yKHBhaW50SGVpZ2h0IC8gMikgLSAxIHx8IDEgOiBNYXRoLmNlaWwocGFpbnRIZWlnaHQpIC8gMjtcbiAgICAgICAgaGVpZ2h0U2NhbGUgLz0gcGFpbnRIZWlnaHQgLyBuZXdIZWlnaHQ7XG4gICAgICB9XG4gICAgICB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyh0bXBDYW52YXNJZCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7XG4gICAgICB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICAgIHRtcEN0eC5jbGVhclJlY3QoMCwgMCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7XG4gICAgICB0bXBDdHguZHJhd0ltYWdlKGltZywgMCwgMCwgcGFpbnRXaWR0aCwgcGFpbnRIZWlnaHQsIDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgaW1nID0gdG1wQ2FudmFzLmNhbnZhcztcbiAgICAgIHBhaW50V2lkdGggPSBuZXdXaWR0aDtcbiAgICAgIHBhaW50SGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICAgICAgdG1wQ2FudmFzSWQgPSB0bXBDYW52YXNJZCA9PT0gXCJwcmVzY2FsZTFcIiA/IFwicHJlc2NhbGUyXCIgOiBcInByZXNjYWxlMVwiO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaW1nLFxuICAgICAgcGFpbnRXaWR0aCxcbiAgICAgIHBhaW50SGVpZ2h0XG4gICAgfTtcbiAgfVxuICBfY3JlYXRlTWFza0NhbnZhcyhpbWcpIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBpbWc7XG4gICAgY29uc3QgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjtcbiAgICBjb25zdCBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsO1xuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCk7XG4gICAgbGV0IGNhY2hlLCBjYWNoZUtleSwgc2NhbGVkLCBtYXNrQ2FudmFzO1xuICAgIGlmICgoaW1nLmJpdG1hcCB8fCBpbWcuZGF0YSkgJiYgaW1nLmNvdW50ID4gMSkge1xuICAgICAgY29uc3QgbWFpbktleSA9IGltZy5iaXRtYXAgfHwgaW1nLmRhdGEuYnVmZmVyO1xuICAgICAgY2FjaGVLZXkgPSBKU09OLnN0cmluZ2lmeShpc1BhdHRlcm5GaWxsID8gY3VycmVudFRyYW5zZm9ybSA6IFtjdXJyZW50VHJhbnNmb3JtLnNsaWNlKDAsIDQpLCBmaWxsQ29sb3JdKTtcbiAgICAgIGNhY2hlID0gdGhpcy5fY2FjaGVkQml0bWFwc01hcC5nZXQobWFpbktleSk7XG4gICAgICBpZiAoIWNhY2hlKSB7XG4gICAgICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLnNldChtYWluS2V5LCBjYWNoZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjYWNoZWRJbWFnZSA9IGNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICBpZiAoY2FjaGVkSW1hZ2UgJiYgIWlzUGF0dGVybkZpbGwpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGgucm91bmQoTWF0aC5taW4oY3VycmVudFRyYW5zZm9ybVswXSwgY3VycmVudFRyYW5zZm9ybVsyXSkgKyBjdXJyZW50VHJhbnNmb3JtWzRdKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IE1hdGgucm91bmQoTWF0aC5taW4oY3VycmVudFRyYW5zZm9ybVsxXSwgY3VycmVudFRyYW5zZm9ybVszXSkgKyBjdXJyZW50VHJhbnNmb3JtWzVdKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjYW52YXM6IGNhY2hlZEltYWdlLFxuICAgICAgICAgIG9mZnNldFgsXG4gICAgICAgICAgb2Zmc2V0WVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc2NhbGVkID0gY2FjaGVkSW1hZ2U7XG4gICAgfVxuICAgIGlmICghc2NhbGVkKSB7XG4gICAgICBtYXNrQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJtYXNrQ2FudmFzXCIsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKG1hc2tDYW52YXMuY29udGV4dCwgaW1nKTtcbiAgICB9XG4gICAgbGV0IG1hc2tUb0NhbnZhcyA9IFV0aWwudHJhbnNmb3JtKGN1cnJlbnRUcmFuc2Zvcm0sIFsxIC8gd2lkdGgsIDAsIDAsIC0xIC8gaGVpZ2h0LCAwLCAwXSk7XG4gICAgbWFza1RvQ2FudmFzID0gVXRpbC50cmFuc2Zvcm0obWFza1RvQ2FudmFzLCBbMSwgMCwgMCwgMSwgMCwgLWhlaWdodF0pO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IFV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goWzAsIDAsIHdpZHRoLCBoZWlnaHRdLCBtYXNrVG9DYW52YXMpO1xuICAgIGNvbnN0IGRyYXduV2lkdGggPSBNYXRoLnJvdW5kKG1heFggLSBtaW5YKSB8fCAxO1xuICAgIGNvbnN0IGRyYXduSGVpZ2h0ID0gTWF0aC5yb3VuZChtYXhZIC0gbWluWSkgfHwgMTtcbiAgICBjb25zdCBmaWxsQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJmaWxsQ2FudmFzXCIsIGRyYXduV2lkdGgsIGRyYXduSGVpZ2h0KTtcbiAgICBjb25zdCBmaWxsQ3R4ID0gZmlsbENhbnZhcy5jb250ZXh0O1xuICAgIGNvbnN0IG9mZnNldFggPSBtaW5YO1xuICAgIGNvbnN0IG9mZnNldFkgPSBtaW5ZO1xuICAgIGZpbGxDdHgudHJhbnNsYXRlKC1vZmZzZXRYLCAtb2Zmc2V0WSk7XG4gICAgZmlsbEN0eC50cmFuc2Zvcm0oLi4ubWFza1RvQ2FudmFzKTtcbiAgICBpZiAoIXNjYWxlZCkge1xuICAgICAgc2NhbGVkID0gdGhpcy5fc2NhbGVJbWFnZShtYXNrQ2FudmFzLmNhbnZhcywgZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoZmlsbEN0eCkpO1xuICAgICAgc2NhbGVkID0gc2NhbGVkLmltZztcbiAgICAgIGlmIChjYWNoZSAmJiBpc1BhdHRlcm5GaWxsKSB7XG4gICAgICAgIGNhY2hlLnNldChjYWNoZUtleSwgc2NhbGVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZmlsbEN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZ2V0Q3VycmVudFRyYW5zZm9ybShmaWxsQ3R4KSwgaW1nLmludGVycG9sYXRlKTtcbiAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoZmlsbEN0eCwgc2NhbGVkLCAwLCAwLCBzY2FsZWQud2lkdGgsIHNjYWxlZC5oZWlnaHQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGZpbGxDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2UtaW5cIjtcbiAgICBjb25zdCBpbnZlcnNlID0gVXRpbC50cmFuc2Zvcm0oZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoZmlsbEN0eCksIFsxLCAwLCAwLCAxLCAtb2Zmc2V0WCwgLW9mZnNldFldKTtcbiAgICBmaWxsQ3R4LmZpbGxTdHlsZSA9IGlzUGF0dGVybkZpbGwgPyBmaWxsQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMsIGludmVyc2UsIFBhdGhUeXBlLkZJTEwpIDogZmlsbENvbG9yO1xuICAgIGZpbGxDdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgaWYgKGNhY2hlICYmICFpc1BhdHRlcm5GaWxsKSB7XG4gICAgICB0aGlzLmNhY2hlZENhbnZhc2VzLmRlbGV0ZShcImZpbGxDYW52YXNcIik7XG4gICAgICBjYWNoZS5zZXQoY2FjaGVLZXksIGZpbGxDYW52YXMuY2FudmFzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbnZhczogZmlsbENhbnZhcy5jYW52YXMsXG4gICAgICBvZmZzZXRYOiBNYXRoLnJvdW5kKG9mZnNldFgpLFxuICAgICAgb2Zmc2V0WTogTWF0aC5yb3VuZChvZmZzZXRZKVxuICAgIH07XG4gIH1cbiAgc2V0TGluZVdpZHRoKHdpZHRoKSB7XG4gICAgaWYgKHdpZHRoICE9PSB0aGlzLmN1cnJlbnQubGluZVdpZHRoKSB7XG4gICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdID0gLTE7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudC5saW5lV2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmN0eC5saW5lV2lkdGggPSB3aWR0aDtcbiAgfVxuICBzZXRMaW5lQ2FwKHN0eWxlKSB7XG4gICAgdGhpcy5jdHgubGluZUNhcCA9IExJTkVfQ0FQX1NUWUxFU1tzdHlsZV07XG4gIH1cbiAgc2V0TGluZUpvaW4oc3R5bGUpIHtcbiAgICB0aGlzLmN0eC5saW5lSm9pbiA9IExJTkVfSk9JTl9TVFlMRVNbc3R5bGVdO1xuICB9XG4gIHNldE1pdGVyTGltaXQobGltaXQpIHtcbiAgICB0aGlzLmN0eC5taXRlckxpbWl0ID0gbGltaXQ7XG4gIH1cbiAgc2V0RGFzaChkYXNoQXJyYXksIGRhc2hQaGFzZSkge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGlmIChjdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY3R4LnNldExpbmVEYXNoKGRhc2hBcnJheSk7XG4gICAgICBjdHgubGluZURhc2hPZmZzZXQgPSBkYXNoUGhhc2U7XG4gICAgfVxuICB9XG4gIHNldFJlbmRlcmluZ0ludGVudChpbnRlbnQpIHt9XG4gIHNldEZsYXRuZXNzKGZsYXRuZXNzKSB7fVxuICBzZXRHU3RhdGUoc3RhdGVzKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3RhdGVzKSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwiTFdcIjpcbiAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aCh2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJMQ1wiOlxuICAgICAgICAgIHRoaXMuc2V0TGluZUNhcCh2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJMSlwiOlxuICAgICAgICAgIHRoaXMuc2V0TGluZUpvaW4odmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTUxcIjpcbiAgICAgICAgICB0aGlzLnNldE1pdGVyTGltaXQodmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRFwiOlxuICAgICAgICAgIHRoaXMuc2V0RGFzaCh2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUklcIjpcbiAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudCh2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJGTFwiOlxuICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3ModmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRm9udFwiOlxuICAgICAgICAgIHRoaXMuc2V0Rm9udCh2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQ0FcIjpcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGEgPSB2YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImNhXCI6XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuY3R4Lmdsb2JhbEFscGhhID0gdmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJCTVwiOlxuICAgICAgICAgIHRoaXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiU01hc2tcIjpcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgPSB2YWx1ZSA/IHRoaXMudGVtcFNNYXNrIDogbnVsbDtcbiAgICAgICAgICB0aGlzLnRlbXBTTWFzayA9IG51bGw7XG4gICAgICAgICAgdGhpcy5jaGVja1NNYXNrU3RhdGUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlRSXCI6XG4gICAgICAgICAgdGhpcy5jdHguZmlsdGVyID0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcyA9IHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRGaWx0ZXIodmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgaW5TTWFza01vZGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXNwZW5kZWRDdHg7XG4gIH1cbiAgY2hlY2tTTWFza1N0YXRlKCkge1xuICAgIGNvbnN0IGluU01hc2tNb2RlID0gdGhpcy5pblNNYXNrTW9kZTtcbiAgICBpZiAodGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrICYmICFpblNNYXNrTW9kZSkge1xuICAgICAgdGhpcy5iZWdpblNNYXNrTW9kZSgpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuY3VycmVudC5hY3RpdmVTTWFzayAmJiBpblNNYXNrTW9kZSkge1xuICAgICAgdGhpcy5lbmRTTWFza01vZGUoKTtcbiAgICB9XG4gIH1cbiAgYmVnaW5TTWFza01vZGUoKSB7XG4gICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJlZ2luU01hc2tNb2RlIGNhbGxlZCB3aGlsZSBhbHJlYWR5IGluIHNtYXNrIG1vZGVcIik7XG4gICAgfVxuICAgIGNvbnN0IGRyYXduV2lkdGggPSB0aGlzLmN0eC5jYW52YXMud2lkdGg7XG4gICAgY29uc3QgZHJhd25IZWlnaHQgPSB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0O1xuICAgIGNvbnN0IGNhY2hlSWQgPSBcInNtYXNrR3JvdXBBdFwiICsgdGhpcy5ncm91cExldmVsO1xuICAgIGNvbnN0IHNjcmF0Y2hDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhjYWNoZUlkLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodCk7XG4gICAgdGhpcy5zdXNwZW5kZWRDdHggPSB0aGlzLmN0eDtcbiAgICB0aGlzLmN0eCA9IHNjcmF0Y2hDYW52YXMuY29udGV4dDtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjdHguc2V0VHJhbnNmb3JtKC4uLmdldEN1cnJlbnRUcmFuc2Zvcm0odGhpcy5zdXNwZW5kZWRDdHgpKTtcbiAgICBjb3B5Q3R4U3RhdGUodGhpcy5zdXNwZW5kZWRDdHgsIGN0eCk7XG4gICAgbWlycm9yQ29udGV4dE9wZXJhdGlvbnMoY3R4LCB0aGlzLnN1c3BlbmRlZEN0eCk7XG4gICAgdGhpcy5zZXRHU3RhdGUoW1tcIkJNXCIsIFwic291cmNlLW92ZXJcIl0sIFtcImNhXCIsIDFdLCBbXCJDQVwiLCAxXV0pO1xuICB9XG4gIGVuZFNNYXNrTW9kZSgpIHtcbiAgICBpZiAoIXRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImVuZFNNYXNrTW9kZSBjYWxsZWQgd2hpbGUgbm90IGluIHNtYXNrIG1vZGVcIik7XG4gICAgfVxuICAgIHRoaXMuY3R4Ll9yZW1vdmVNaXJyb3JpbmcoKTtcbiAgICBjb3B5Q3R4U3RhdGUodGhpcy5jdHgsIHRoaXMuc3VzcGVuZGVkQ3R4KTtcbiAgICB0aGlzLmN0eCA9IHRoaXMuc3VzcGVuZGVkQ3R4O1xuICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gbnVsbDtcbiAgfVxuICBjb21wb3NlKGRpcnR5Qm94KSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFkaXJ0eUJveCkge1xuICAgICAgZGlydHlCb3ggPSBbMCwgMCwgdGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlydHlCb3hbMF0gPSBNYXRoLmZsb29yKGRpcnR5Qm94WzBdKTtcbiAgICAgIGRpcnR5Qm94WzFdID0gTWF0aC5mbG9vcihkaXJ0eUJveFsxXSk7XG4gICAgICBkaXJ0eUJveFsyXSA9IE1hdGguY2VpbChkaXJ0eUJveFsyXSk7XG4gICAgICBkaXJ0eUJveFszXSA9IE1hdGguY2VpbChkaXJ0eUJveFszXSk7XG4gICAgfVxuICAgIGNvbnN0IHNtYXNrID0gdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrO1xuICAgIGNvbnN0IHN1c3BlbmRlZEN0eCA9IHRoaXMuc3VzcGVuZGVkQ3R4O1xuICAgIHRoaXMuY29tcG9zZVNNYXNrKHN1c3BlbmRlZEN0eCwgc21hc2ssIHRoaXMuY3R4LCBkaXJ0eUJveCk7XG4gICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gIH1cbiAgY29tcG9zZVNNYXNrKGN0eCwgc21hc2ssIGxheWVyQ3R4LCBsYXllckJveCkge1xuICAgIGNvbnN0IGxheWVyT2Zmc2V0WCA9IGxheWVyQm94WzBdO1xuICAgIGNvbnN0IGxheWVyT2Zmc2V0WSA9IGxheWVyQm94WzFdO1xuICAgIGNvbnN0IGxheWVyV2lkdGggPSBsYXllckJveFsyXSAtIGxheWVyT2Zmc2V0WDtcbiAgICBjb25zdCBsYXllckhlaWdodCA9IGxheWVyQm94WzNdIC0gbGF5ZXJPZmZzZXRZO1xuICAgIGlmIChsYXllcldpZHRoID09PSAwIHx8IGxheWVySGVpZ2h0ID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZ2VuZXJpY0NvbXBvc2VTTWFzayhzbWFzay5jb250ZXh0LCBsYXllckN0eCwgbGF5ZXJXaWR0aCwgbGF5ZXJIZWlnaHQsIHNtYXNrLnN1YnR5cGUsIHNtYXNrLmJhY2tkcm9wLCBzbWFzay50cmFuc2Zlck1hcCwgbGF5ZXJPZmZzZXRYLCBsYXllck9mZnNldFksIHNtYXNrLm9mZnNldFgsIHNtYXNrLm9mZnNldFkpO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4Lmdsb2JhbEFscGhhID0gMTtcbiAgICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2Utb3ZlclwiO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgY3R4LmRyYXdJbWFnZShsYXllckN0eC5jYW52YXMsIDAsIDApO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gIH1cbiAgZ2VuZXJpY0NvbXBvc2VTTWFzayhtYXNrQ3R4LCBsYXllckN0eCwgd2lkdGgsIGhlaWdodCwgc3VidHlwZSwgYmFja2Ryb3AsIHRyYW5zZmVyTWFwLCBsYXllck9mZnNldFgsIGxheWVyT2Zmc2V0WSwgbWFza09mZnNldFgsIG1hc2tPZmZzZXRZKSB7XG4gICAgbGV0IG1hc2tDYW52YXMgPSBtYXNrQ3R4LmNhbnZhcztcbiAgICBsZXQgbWFza1ggPSBsYXllck9mZnNldFggLSBtYXNrT2Zmc2V0WDtcbiAgICBsZXQgbWFza1kgPSBsYXllck9mZnNldFkgLSBtYXNrT2Zmc2V0WTtcbiAgICBpZiAoYmFja2Ryb3ApIHtcbiAgICAgIGlmIChtYXNrWCA8IDAgfHwgbWFza1kgPCAwIHx8IG1hc2tYICsgd2lkdGggPiBtYXNrQ2FudmFzLndpZHRoIHx8IG1hc2tZICsgaGVpZ2h0ID4gbWFza0NhbnZhcy5oZWlnaHQpIHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJtYXNrRXh0ZW5zaW9uXCIsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuY29udGV4dDtcbiAgICAgICAgY3R4LmRyYXdJbWFnZShtYXNrQ2FudmFzLCAtbWFza1gsIC1tYXNrWSk7XG4gICAgICAgIGlmIChiYWNrZHJvcC5zb21lKGMgPT4gYyAhPT0gMCkpIHtcbiAgICAgICAgICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJkZXN0aW5hdGlvbi1hdG9wXCI7XG4gICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IFV0aWwubWFrZUhleENvbG9yKC4uLmJhY2tkcm9wKTtcbiAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcbiAgICAgICAgfVxuICAgICAgICBtYXNrQ2FudmFzID0gY2FudmFzLmNhbnZhcztcbiAgICAgICAgbWFza1ggPSBtYXNrWSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGJhY2tkcm9wLnNvbWUoYyA9PiBjICE9PSAwKSkge1xuICAgICAgICBtYXNrQ3R4LnNhdmUoKTtcbiAgICAgICAgbWFza0N0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgICAgIG1hc2tDdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICBjb25zdCBjbGlwID0gbmV3IFBhdGgyRCgpO1xuICAgICAgICBjbGlwLnJlY3QobWFza1gsIG1hc2tZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgbWFza0N0eC5jbGlwKGNsaXApO1xuICAgICAgICBtYXNrQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwiZGVzdGluYXRpb24tYXRvcFwiO1xuICAgICAgICBtYXNrQ3R4LmZpbGxTdHlsZSA9IFV0aWwubWFrZUhleENvbG9yKC4uLmJhY2tkcm9wKTtcbiAgICAgICAgbWFza0N0eC5maWxsUmVjdChtYXNrWCwgbWFza1ksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBtYXNrQ3R4LnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGF5ZXJDdHguc2F2ZSgpO1xuICAgIGxheWVyQ3R4Lmdsb2JhbEFscGhhID0gMTtcbiAgICBsYXllckN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgaWYgKHN1YnR5cGUgPT09IFwiQWxwaGFcIiAmJiB0cmFuc2Zlck1hcCkge1xuICAgICAgbGF5ZXJDdHguZmlsdGVyID0gdGhpcy5maWx0ZXJGYWN0b3J5LmFkZEFscGhhRmlsdGVyKHRyYW5zZmVyTWFwKTtcbiAgICB9IGVsc2UgaWYgKHN1YnR5cGUgPT09IFwiTHVtaW5vc2l0eVwiKSB7XG4gICAgICBsYXllckN0eC5maWx0ZXIgPSB0aGlzLmZpbHRlckZhY3RvcnkuYWRkTHVtaW5vc2l0eUZpbHRlcih0cmFuc2Zlck1hcCk7XG4gICAgfVxuICAgIGNvbnN0IGNsaXAgPSBuZXcgUGF0aDJEKCk7XG4gICAgY2xpcC5yZWN0KGxheWVyT2Zmc2V0WCwgbGF5ZXJPZmZzZXRZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBsYXllckN0eC5jbGlwKGNsaXApO1xuICAgIGxheWVyQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwiZGVzdGluYXRpb24taW5cIjtcbiAgICBsYXllckN0eC5kcmF3SW1hZ2UobWFza0NhbnZhcywgbWFza1gsIG1hc2tZLCB3aWR0aCwgaGVpZ2h0LCBsYXllck9mZnNldFgsIGxheWVyT2Zmc2V0WSwgd2lkdGgsIGhlaWdodCk7XG4gICAgbGF5ZXJDdHgucmVzdG9yZSgpO1xuICB9XG4gIHNhdmUoKSB7XG4gICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgIGNvcHlDdHhTdGF0ZSh0aGlzLmN0eCwgdGhpcy5zdXNwZW5kZWRDdHgpO1xuICAgICAgdGhpcy5zdXNwZW5kZWRDdHguc2F2ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgfVxuICAgIGNvbnN0IG9sZCA9IHRoaXMuY3VycmVudDtcbiAgICB0aGlzLnN0YXRlU3RhY2sucHVzaChvbGQpO1xuICAgIHRoaXMuY3VycmVudCA9IG9sZC5jbG9uZSgpO1xuICB9XG4gIHJlc3RvcmUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggPT09IDAgJiYgdGhpcy5pblNNYXNrTW9kZSkge1xuICAgICAgdGhpcy5lbmRTTWFza01vZGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuc3RhdGVTdGFjay5wb3AoKTtcbiAgICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4LnJlc3RvcmUoKTtcbiAgICAgICAgY29weUN0eFN0YXRlKHRoaXMuc3VzcGVuZGVkQ3R4LCB0aGlzLmN0eCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoZWNrU01hc2tTdGF0ZSgpO1xuICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG4gICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdID0gLTE7XG4gICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgdHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICB0aGlzLmN0eC50cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG4gICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICB9XG4gIGNvbnN0cnVjdFBhdGgob3BzLCBhcmdzLCBtaW5NYXgpIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgIGxldCB4ID0gY3VycmVudC54LFxuICAgICAgeSA9IGN1cnJlbnQueTtcbiAgICBsZXQgc3RhcnRYLCBzdGFydFk7XG4gICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KTtcbiAgICBjb25zdCBpc1NjYWxpbmdNYXRyaXggPSBjdXJyZW50VHJhbnNmb3JtWzBdID09PSAwICYmIGN1cnJlbnRUcmFuc2Zvcm1bM10gPT09IDAgfHwgY3VycmVudFRyYW5zZm9ybVsxXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzJdID09PSAwO1xuICAgIGNvbnN0IG1pbk1heEZvckJlemllciA9IGlzU2NhbGluZ01hdHJpeCA/IG1pbk1heC5zbGljZSgwKSA6IG51bGw7XG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IG9wcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBzd2l0Y2ggKG9wc1tpXSB8IDApIHtcbiAgICAgICAgY2FzZSBPUFMucmVjdGFuZ2xlOlxuICAgICAgICAgIHggPSBhcmdzW2orK107XG4gICAgICAgICAgeSA9IGFyZ3NbaisrXTtcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICBjb25zdCBoZWlnaHQgPSBhcmdzW2orK107XG4gICAgICAgICAgY29uc3QgeHcgPSB4ICsgd2lkdGg7XG4gICAgICAgICAgY29uc3QgeWggPSB5ICsgaGVpZ2h0O1xuICAgICAgICAgIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkge1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4dywgeWgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdHgubGluZVRvKHh3LCB5KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHloKTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeWgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzU2NhbGluZ01hdHJpeCkge1xuICAgICAgICAgICAgY3VycmVudC51cGRhdGVSZWN0TWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIFt4LCB5LCB4dywgeWhdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9QUy5tb3ZlVG86XG4gICAgICAgICAgeCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuICAgICAgICAgIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgaWYgKCFpc1NjYWxpbmdNYXRyaXgpIHtcbiAgICAgICAgICAgIGN1cnJlbnQudXBkYXRlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCB4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT1BTLmxpbmVUbzpcbiAgICAgICAgICB4ID0gYXJnc1tqKytdO1xuICAgICAgICAgIHkgPSBhcmdzW2orK107XG4gICAgICAgICAgY3R4LmxpbmVUbyh4LCB5KTtcbiAgICAgICAgICBpZiAoIWlzU2NhbGluZ01hdHJpeCkge1xuICAgICAgICAgICAgY3VycmVudC51cGRhdGVQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIHgsIHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPUFMuY3VydmVUbzpcbiAgICAgICAgICBzdGFydFggPSB4O1xuICAgICAgICAgIHN0YXJ0WSA9IHk7XG4gICAgICAgICAgeCA9IGFyZ3NbaiArIDRdO1xuICAgICAgICAgIHkgPSBhcmdzW2ogKyA1XTtcbiAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyhhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdLCB4LCB5KTtcbiAgICAgICAgICBjdXJyZW50LnVwZGF0ZUN1cnZlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBzdGFydFgsIHN0YXJ0WSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSwgeCwgeSwgbWluTWF4Rm9yQmV6aWVyKTtcbiAgICAgICAgICBqICs9IDY7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT1BTLmN1cnZlVG8yOlxuICAgICAgICAgIHN0YXJ0WCA9IHg7XG4gICAgICAgICAgc3RhcnRZID0geTtcbiAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyh4LCB5LCBhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdKTtcbiAgICAgICAgICBjdXJyZW50LnVwZGF0ZUN1cnZlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBzdGFydFgsIHN0YXJ0WSwgeCwgeSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSwgbWluTWF4Rm9yQmV6aWVyKTtcbiAgICAgICAgICB4ID0gYXJnc1tqICsgMl07XG4gICAgICAgICAgeSA9IGFyZ3NbaiArIDNdO1xuICAgICAgICAgIGogKz0gNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPUFMuY3VydmVUbzM6XG4gICAgICAgICAgc3RhcnRYID0geDtcbiAgICAgICAgICBzdGFydFkgPSB5O1xuICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTtcbiAgICAgICAgICB5ID0gYXJnc1tqICsgM107XG4gICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oYXJnc1tqXSwgYXJnc1tqICsgMV0sIHgsIHksIHgsIHkpO1xuICAgICAgICAgIGN1cnJlbnQudXBkYXRlQ3VydmVQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIHN0YXJ0WCwgc3RhcnRZLCBhcmdzW2pdLCBhcmdzW2ogKyAxXSwgeCwgeSwgeCwgeSwgbWluTWF4Rm9yQmV6aWVyKTtcbiAgICAgICAgICBqICs9IDQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT1BTLmNsb3NlUGF0aDpcbiAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1NjYWxpbmdNYXRyaXgpIHtcbiAgICAgIGN1cnJlbnQudXBkYXRlU2NhbGluZ1BhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgbWluTWF4Rm9yQmV6aWVyKTtcbiAgICB9XG4gICAgY3VycmVudC5zZXRDdXJyZW50UG9pbnQoeCwgeSk7XG4gIH1cbiAgY2xvc2VQYXRoKCkge1xuICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuICB9XG4gIHN0cm9rZShjb25zdW1lUGF0aCA9IHRydWUpIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY3VycmVudC5zdHJva2VDb2xvcjtcbiAgICBjdHguZ2xvYmFsQWxwaGEgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGE7XG4gICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIGlmICh0eXBlb2Ygc3Ryb2tlQ29sb3IgPT09IFwib2JqZWN0XCIgJiYgc3Ryb2tlQ29sb3I/LmdldFBhdHRlcm4pIHtcbiAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gc3Ryb2tlQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMsIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCksIFBhdGhUeXBlLlNUUk9LRSk7XG4gICAgICAgIHRoaXMucmVzY2FsZUFuZFN0cm9rZShmYWxzZSk7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc2NhbGVBbmRTdHJva2UodHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb25zdW1lUGF0aCkge1xuICAgICAgdGhpcy5jb25zdW1lUGF0aCh0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpKTtcbiAgICB9XG4gICAgY3R4Lmdsb2JhbEFscGhhID0gdGhpcy5jdXJyZW50LmZpbGxBbHBoYTtcbiAgfVxuICBjbG9zZVN0cm9rZSgpIHtcbiAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuc3Ryb2tlKCk7XG4gIH1cbiAgZmlsbChjb25zdW1lUGF0aCA9IHRydWUpIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgIGNvbnN0IGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7XG4gICAgbGV0IG5lZWRSZXN0b3JlID0gZmFsc2U7XG4gICAgaWYgKGlzUGF0dGVybkZpbGwpIHtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjdHguZmlsbFN0eWxlID0gZmlsbENvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzLCBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShjdHgpLCBQYXRoVHlwZS5GSUxMKTtcbiAgICAgIG5lZWRSZXN0b3JlID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJzZWN0ID0gdGhpcy5jdXJyZW50LmdldENsaXBwZWRQYXRoQm91bmRpbmdCb3goKTtcbiAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSAmJiBpbnRlcnNlY3QgIT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdFT0ZpbGwpIHtcbiAgICAgICAgY3R4LmZpbGwoXCJldmVub2RkXCIpO1xuICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eC5maWxsKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuZWVkUmVzdG9yZSkge1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gICAgaWYgKGNvbnN1bWVQYXRoKSB7XG4gICAgICB0aGlzLmNvbnN1bWVQYXRoKGludGVyc2VjdCk7XG4gICAgfVxuICB9XG4gIGVvRmlsbCgpIHtcbiAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSB0cnVlO1xuICAgIHRoaXMuZmlsbCgpO1xuICB9XG4gIGZpbGxTdHJva2UoKSB7XG4gICAgdGhpcy5maWxsKGZhbHNlKTtcbiAgICB0aGlzLnN0cm9rZShmYWxzZSk7XG4gICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuICB9XG4gIGVvRmlsbFN0cm9rZSgpIHtcbiAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSB0cnVlO1xuICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICB9XG4gIGNsb3NlRmlsbFN0cm9rZSgpIHtcbiAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICB9XG4gIGNsb3NlRU9GaWxsU3Ryb2tlKCkge1xuICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IHRydWU7XG4gICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgfVxuICBlbmRQYXRoKCkge1xuICAgIHRoaXMuY29uc3VtZVBhdGgoKTtcbiAgfVxuICBjbGlwKCkge1xuICAgIHRoaXMucGVuZGluZ0NsaXAgPSBOT1JNQUxfQ0xJUDtcbiAgfVxuICBlb0NsaXAoKSB7XG4gICAgdGhpcy5wZW5kaW5nQ2xpcCA9IEVPX0NMSVA7XG4gIH1cbiAgYmVnaW5UZXh0KCkge1xuICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gSURFTlRJVFlfTUFUUklYO1xuICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcbiAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG4gIH1cbiAgZW5kVGV4dCgpIHtcbiAgICBjb25zdCBwYXRocyA9IHRoaXMucGVuZGluZ1RleHRQYXRocztcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBpZiAocGF0aHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oLi4ucGF0aC50cmFuc2Zvcm0pO1xuICAgICAgY3R4LnRyYW5zbGF0ZShwYXRoLngsIHBhdGgueSk7XG4gICAgICBwYXRoLmFkZFRvUGF0aChjdHgsIHBhdGguZm9udFNpemUpO1xuICAgIH1cbiAgICBjdHgucmVzdG9yZSgpO1xuICAgIGN0eC5jbGlwKCk7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdUZXh0UGF0aHM7XG4gIH1cbiAgc2V0Q2hhclNwYWNpbmcoc3BhY2luZykge1xuICAgIHRoaXMuY3VycmVudC5jaGFyU3BhY2luZyA9IHNwYWNpbmc7XG4gIH1cbiAgc2V0V29yZFNwYWNpbmcoc3BhY2luZykge1xuICAgIHRoaXMuY3VycmVudC53b3JkU3BhY2luZyA9IHNwYWNpbmc7XG4gIH1cbiAgc2V0SFNjYWxlKHNjYWxlKSB7XG4gICAgdGhpcy5jdXJyZW50LnRleHRIU2NhbGUgPSBzY2FsZSAvIDEwMDtcbiAgfVxuICBzZXRMZWFkaW5nKGxlYWRpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQubGVhZGluZyA9IC1sZWFkaW5nO1xuICB9XG4gIHNldEZvbnQoZm9udFJlZk5hbWUsIHNpemUpIHtcbiAgICBjb25zdCBmb250T2JqID0gdGhpcy5jb21tb25PYmpzLmdldChmb250UmVmTmFtZSk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICBpZiAoIWZvbnRPYmopIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgZmluZCBmb250IGZvciAke2ZvbnRSZWZOYW1lfWApO1xuICAgIH1cbiAgICBjdXJyZW50LmZvbnRNYXRyaXggPSBmb250T2JqLmZvbnRNYXRyaXggfHwgRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgaWYgKGN1cnJlbnQuZm9udE1hdHJpeFswXSA9PT0gMCB8fCBjdXJyZW50LmZvbnRNYXRyaXhbM10gPT09IDApIHtcbiAgICAgIHdhcm4oXCJJbnZhbGlkIGZvbnQgbWF0cml4IGZvciBmb250IFwiICsgZm9udFJlZk5hbWUpO1xuICAgIH1cbiAgICBpZiAoc2l6ZSA8IDApIHtcbiAgICAgIHNpemUgPSAtc2l6ZTtcbiAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAxO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQuZm9udCA9IGZvbnRPYmo7XG4gICAgdGhpcy5jdXJyZW50LmZvbnRTaXplID0gc2l6ZTtcbiAgICBpZiAoZm9udE9iai5pc1R5cGUzRm9udCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gZm9udE9iai5sb2FkZWROYW1lIHx8IFwic2Fucy1zZXJpZlwiO1xuICAgIGNvbnN0IHR5cGVmYWNlID0gZm9udE9iai5zeXN0ZW1Gb250SW5mbz8uY3NzIHx8IGBcIiR7bmFtZX1cIiwgJHtmb250T2JqLmZhbGxiYWNrTmFtZX1gO1xuICAgIGxldCBib2xkID0gXCJub3JtYWxcIjtcbiAgICBpZiAoZm9udE9iai5ibGFjaykge1xuICAgICAgYm9sZCA9IFwiOTAwXCI7XG4gICAgfSBlbHNlIGlmIChmb250T2JqLmJvbGQpIHtcbiAgICAgIGJvbGQgPSBcImJvbGRcIjtcbiAgICB9XG4gICAgY29uc3QgaXRhbGljID0gZm9udE9iai5pdGFsaWMgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIjtcbiAgICBsZXQgYnJvd3NlckZvbnRTaXplID0gc2l6ZTtcbiAgICBpZiAoc2l6ZSA8IE1JTl9GT05UX1NJWkUpIHtcbiAgICAgIGJyb3dzZXJGb250U2l6ZSA9IE1JTl9GT05UX1NJWkU7XG4gICAgfSBlbHNlIGlmIChzaXplID4gTUFYX0ZPTlRfU0laRSkge1xuICAgICAgYnJvd3NlckZvbnRTaXplID0gTUFYX0ZPTlRfU0laRTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50LmZvbnRTaXplU2NhbGUgPSBzaXplIC8gYnJvd3NlckZvbnRTaXplO1xuICAgIHRoaXMuY3R4LmZvbnQgPSBgJHtpdGFsaWN9ICR7Ym9sZH0gJHticm93c2VyRm9udFNpemV9cHggJHt0eXBlZmFjZX1gO1xuICB9XG4gIHNldFRleHRSZW5kZXJpbmdNb2RlKG1vZGUpIHtcbiAgICB0aGlzLmN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPSBtb2RlO1xuICB9XG4gIHNldFRleHRSaXNlKHJpc2UpIHtcbiAgICB0aGlzLmN1cnJlbnQudGV4dFJpc2UgPSByaXNlO1xuICB9XG4gIG1vdmVUZXh0KHgsIHkpIHtcbiAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCArPSB4O1xuICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZICs9IHk7XG4gIH1cbiAgc2V0TGVhZGluZ01vdmVUZXh0KHgsIHkpIHtcbiAgICB0aGlzLnNldExlYWRpbmcoLXkpO1xuICAgIHRoaXMubW92ZVRleHQoeCwgeSk7XG4gIH1cbiAgc2V0VGV4dE1hdHJpeChhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXggPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IE1hdGguaHlwb3QoYSwgYik7XG4gICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggPSAwO1xuICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZID0gMDtcbiAgfVxuICBuZXh0TGluZSgpIHtcbiAgICB0aGlzLm1vdmVUZXh0KDAsIHRoaXMuY3VycmVudC5sZWFkaW5nKTtcbiAgfVxuICBwYWludENoYXIoY2hhcmFjdGVyLCB4LCB5LCBwYXR0ZXJuVHJhbnNmb3JtKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICBjb25zdCBmb250ID0gY3VycmVudC5mb250O1xuICAgIGNvbnN0IHRleHRSZW5kZXJpbmdNb2RlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZTtcbiAgICBjb25zdCBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemUgLyBjdXJyZW50LmZvbnRTaXplU2NhbGU7XG4gICAgY29uc3QgZmlsbFN0cm9rZU1vZGUgPSB0ZXh0UmVuZGVyaW5nTW9kZSAmIFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7XG4gICAgY29uc3QgaXNBZGRUb1BhdGhTZXQgPSAhISh0ZXh0UmVuZGVyaW5nTW9kZSAmIFRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcpO1xuICAgIGNvbnN0IHBhdHRlcm5GaWxsID0gY3VycmVudC5wYXR0ZXJuRmlsbCAmJiAhZm9udC5taXNzaW5nRmlsZTtcbiAgICBsZXQgYWRkVG9QYXRoO1xuICAgIGlmIChmb250LmRpc2FibGVGb250RmFjZSB8fCBpc0FkZFRvUGF0aFNldCB8fCBwYXR0ZXJuRmlsbCkge1xuICAgICAgYWRkVG9QYXRoID0gZm9udC5nZXRQYXRoR2VuZXJhdG9yKHRoaXMuY29tbW9uT2JqcywgY2hhcmFjdGVyKTtcbiAgICB9XG4gICAgaWYgKGZvbnQuZGlzYWJsZUZvbnRGYWNlIHx8IHBhdHRlcm5GaWxsKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGFkZFRvUGF0aChjdHgsIGZvbnRTaXplKTtcbiAgICAgIGlmIChwYXR0ZXJuVHJhbnNmb3JtKSB7XG4gICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oLi4ucGF0dGVyblRyYW5zZm9ybSk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTEwgfHwgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG4gICAgICAgIGN0eC5maWxsKCk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgfVxuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8IGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuICAgICAgICBjdHguZmlsbFRleHQoY2hhcmFjdGVyLCB4LCB5KTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuICAgICAgICBjdHguc3Ryb2tlVGV4dChjaGFyYWN0ZXIsIHgsIHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNBZGRUb1BhdGhTZXQpIHtcbiAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy5wZW5kaW5nVGV4dFBhdGhzIHx8PSBbXTtcbiAgICAgIHBhdGhzLnB1c2goe1xuICAgICAgICB0cmFuc2Zvcm06IGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KSxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgZm9udFNpemUsXG4gICAgICAgIGFkZFRvUGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGdldCBpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb250ZXh0OiBjdHhcbiAgICB9ID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZFwiLCAxMCwgMTApO1xuICAgIGN0eC5zY2FsZSgxLjUsIDEpO1xuICAgIGN0eC5maWxsVGV4dChcIklcIiwgMCwgMTApO1xuICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEwLCAxMCkuZGF0YTtcbiAgICBsZXQgZW5hYmxlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAzOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRhdGFbaV0gPiAwICYmIGRhdGFbaV0gPCAyNTUpIHtcbiAgICAgICAgZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNGb250U3VicGl4ZWxBQUVuYWJsZWRcIiwgZW5hYmxlZCk7XG4gIH1cbiAgc2hvd1RleHQoZ2x5cGhzKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICBjb25zdCBmb250ID0gY3VycmVudC5mb250O1xuICAgIGlmIChmb250LmlzVHlwZTNGb250KSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93VHlwZTNUZXh0KGdseXBocyk7XG4gICAgfVxuICAgIGNvbnN0IGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZTtcbiAgICBpZiAoZm9udFNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGZvbnRTaXplU2NhbGUgPSBjdXJyZW50LmZvbnRTaXplU2NhbGU7XG4gICAgY29uc3QgY2hhclNwYWNpbmcgPSBjdXJyZW50LmNoYXJTcGFjaW5nO1xuICAgIGNvbnN0IHdvcmRTcGFjaW5nID0gY3VycmVudC53b3JkU3BhY2luZztcbiAgICBjb25zdCBmb250RGlyZWN0aW9uID0gY3VycmVudC5mb250RGlyZWN0aW9uO1xuICAgIGNvbnN0IHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uO1xuICAgIGNvbnN0IGdseXBoc0xlbmd0aCA9IGdseXBocy5sZW5ndGg7XG4gICAgY29uc3QgdmVydGljYWwgPSBmb250LnZlcnRpY2FsO1xuICAgIGNvbnN0IHNwYWNpbmdEaXIgPSB2ZXJ0aWNhbCA/IDEgOiAtMTtcbiAgICBjb25zdCBkZWZhdWx0Vk1ldHJpY3MgPSBmb250LmRlZmF1bHRWTWV0cmljcztcbiAgICBjb25zdCB3aWR0aEFkdmFuY2VTY2FsZSA9IGZvbnRTaXplICogY3VycmVudC5mb250TWF0cml4WzBdO1xuICAgIGNvbnN0IHNpbXBsZUZpbGxUZXh0ID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTCAmJiAhZm9udC5kaXNhYmxlRm9udEZhY2UgJiYgIWN1cnJlbnQucGF0dGVybkZpbGw7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHgudHJhbnNmb3JtKC4uLmN1cnJlbnQudGV4dE1hdHJpeCk7XG4gICAgY3R4LnRyYW5zbGF0ZShjdXJyZW50LngsIGN1cnJlbnQueSArIGN1cnJlbnQudGV4dFJpc2UpO1xuICAgIGlmIChmb250RGlyZWN0aW9uID4gMCkge1xuICAgICAgY3R4LnNjYWxlKHRleHRIU2NhbGUsIC0xKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3R4LnNjYWxlKHRleHRIU2NhbGUsIDEpO1xuICAgIH1cbiAgICBsZXQgcGF0dGVyblRyYW5zZm9ybTtcbiAgICBpZiAoY3VycmVudC5wYXR0ZXJuRmlsbCkge1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBjdXJyZW50LmZpbGxDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoY3R4KSwgUGF0aFR5cGUuRklMTCk7XG4gICAgICBwYXR0ZXJuVHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBwYXR0ZXJuO1xuICAgIH1cbiAgICBsZXQgbGluZVdpZHRoID0gY3VycmVudC5saW5lV2lkdGg7XG4gICAgY29uc3Qgc2NhbGUgPSBjdXJyZW50LnRleHRNYXRyaXhTY2FsZTtcbiAgICBpZiAoc2NhbGUgPT09IDAgfHwgbGluZVdpZHRoID09PSAwKSB7XG4gICAgICBjb25zdCBmaWxsU3Ryb2tlTW9kZSA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgJiBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLO1xuICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG4gICAgICAgIGxpbmVXaWR0aCA9IHRoaXMuZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lV2lkdGggLz0gc2NhbGU7XG4gICAgfVxuICAgIGlmIChmb250U2l6ZVNjYWxlICE9PSAxLjApIHtcbiAgICAgIGN0eC5zY2FsZShmb250U2l6ZVNjYWxlLCBmb250U2l6ZVNjYWxlKTtcbiAgICAgIGxpbmVXaWR0aCAvPSBmb250U2l6ZVNjYWxlO1xuICAgIH1cbiAgICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgIGlmIChmb250LmlzSW52YWxpZFBERmpzRm9udCkge1xuICAgICAgY29uc3QgY2hhcnMgPSBbXTtcbiAgICAgIGxldCB3aWR0aCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykge1xuICAgICAgICBjaGFycy5wdXNoKGdseXBoLnVuaWNvZGUpO1xuICAgICAgICB3aWR0aCArPSBnbHlwaC53aWR0aDtcbiAgICAgIH1cbiAgICAgIGN0eC5maWxsVGV4dChjaGFycy5qb2luKFwiXCIpLCAwLCAwKTtcbiAgICAgIGN1cnJlbnQueCArPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlICogdGV4dEhTY2FsZTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGxldCB4ID0gMCxcbiAgICAgIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGdseXBoc0xlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBnbHlwaCA9IGdseXBoc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgZ2x5cGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgeCArPSBzcGFjaW5nRGlyICogZ2x5cGggKiBmb250U2l6ZSAvIDEwMDA7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IHJlc3RvcmVOZWVkZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNwYWNpbmcgPSAoZ2x5cGguaXNTcGFjZSA/IHdvcmRTcGFjaW5nIDogMCkgKyBjaGFyU3BhY2luZztcbiAgICAgIGNvbnN0IGNoYXJhY3RlciA9IGdseXBoLmZvbnRDaGFyO1xuICAgICAgY29uc3QgYWNjZW50ID0gZ2x5cGguYWNjZW50O1xuICAgICAgbGV0IHNjYWxlZFgsIHNjYWxlZFk7XG4gICAgICBsZXQgd2lkdGggPSBnbHlwaC53aWR0aDtcbiAgICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICBjb25zdCB2bWV0cmljID0gZ2x5cGgudm1ldHJpYyB8fCBkZWZhdWx0Vk1ldHJpY3M7XG4gICAgICAgIGNvbnN0IHZ4ID0gLShnbHlwaC52bWV0cmljID8gdm1ldHJpY1sxXSA6IHdpZHRoICogMC41KSAqIHdpZHRoQWR2YW5jZVNjYWxlO1xuICAgICAgICBjb25zdCB2eSA9IHZtZXRyaWNbMl0gKiB3aWR0aEFkdmFuY2VTY2FsZTtcbiAgICAgICAgd2lkdGggPSB2bWV0cmljID8gLXZtZXRyaWNbMF0gOiB3aWR0aDtcbiAgICAgICAgc2NhbGVkWCA9IHZ4IC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgc2NhbGVkWSA9ICh4ICsgdnkpIC8gZm9udFNpemVTY2FsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjYWxlZFggPSB4IC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgc2NhbGVkWSA9IDA7XG4gICAgICB9XG4gICAgICBpZiAoZm9udC5yZW1lYXN1cmUgJiYgd2lkdGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG1lYXN1cmVkV2lkdGggPSBjdHgubWVhc3VyZVRleHQoY2hhcmFjdGVyKS53aWR0aCAqIDEwMDAgLyBmb250U2l6ZSAqIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIGlmICh3aWR0aCA8IG1lYXN1cmVkV2lkdGggJiYgdGhpcy5pc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCkge1xuICAgICAgICAgIGNvbnN0IGNoYXJhY3RlclNjYWxlWCA9IHdpZHRoIC8gbWVhc3VyZWRXaWR0aDtcbiAgICAgICAgICByZXN0b3JlTmVlZGVkID0gdHJ1ZTtcbiAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgIGN0eC5zY2FsZShjaGFyYWN0ZXJTY2FsZVgsIDEpO1xuICAgICAgICAgIHNjYWxlZFggLz0gY2hhcmFjdGVyU2NhbGVYO1xuICAgICAgICB9IGVsc2UgaWYgKHdpZHRoICE9PSBtZWFzdXJlZFdpZHRoKSB7XG4gICAgICAgICAgc2NhbGVkWCArPSAod2lkdGggLSBtZWFzdXJlZFdpZHRoKSAvIDIwMDAgKiBmb250U2l6ZSAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlICYmIChnbHlwaC5pc0luRm9udCB8fCBmb250Lm1pc3NpbmdGaWxlKSkge1xuICAgICAgICBpZiAoc2ltcGxlRmlsbFRleHQgJiYgIWFjY2VudCkge1xuICAgICAgICAgIGN0eC5maWxsVGV4dChjaGFyYWN0ZXIsIHNjYWxlZFgsIHNjYWxlZFkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGFpbnRDaGFyKGNoYXJhY3Rlciwgc2NhbGVkWCwgc2NhbGVkWSwgcGF0dGVyblRyYW5zZm9ybSk7XG4gICAgICAgICAgaWYgKGFjY2VudCkge1xuICAgICAgICAgICAgY29uc3Qgc2NhbGVkQWNjZW50WCA9IHNjYWxlZFggKyBmb250U2l6ZSAqIGFjY2VudC5vZmZzZXQueCAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgICAgICBjb25zdCBzY2FsZWRBY2NlbnRZID0gc2NhbGVkWSAtIGZvbnRTaXplICogYWNjZW50Lm9mZnNldC55IC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgICAgIHRoaXMucGFpbnRDaGFyKGFjY2VudC5mb250Q2hhciwgc2NhbGVkQWNjZW50WCwgc2NhbGVkQWNjZW50WSwgcGF0dGVyblRyYW5zZm9ybSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBjaGFyV2lkdGggPSB2ZXJ0aWNhbCA/IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgLSBzcGFjaW5nICogZm9udERpcmVjdGlvbiA6IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgKyBzcGFjaW5nICogZm9udERpcmVjdGlvbjtcbiAgICAgIHggKz0gY2hhcldpZHRoO1xuICAgICAgaWYgKHJlc3RvcmVOZWVkZWQpIHtcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZlcnRpY2FsKSB7XG4gICAgICBjdXJyZW50LnkgLT0geDtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudC54ICs9IHggKiB0ZXh0SFNjYWxlO1xuICAgIH1cbiAgICBjdHgucmVzdG9yZSgpO1xuICAgIHRoaXMuY29tcG9zZSgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgc2hvd1R5cGUzVGV4dChnbHlwaHMpIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgIGNvbnN0IGZvbnQgPSBjdXJyZW50LmZvbnQ7XG4gICAgY29uc3QgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplO1xuICAgIGNvbnN0IGZvbnREaXJlY3Rpb24gPSBjdXJyZW50LmZvbnREaXJlY3Rpb247XG4gICAgY29uc3Qgc3BhY2luZ0RpciA9IGZvbnQudmVydGljYWwgPyAxIDogLTE7XG4gICAgY29uc3QgY2hhclNwYWNpbmcgPSBjdXJyZW50LmNoYXJTcGFjaW5nO1xuICAgIGNvbnN0IHdvcmRTcGFjaW5nID0gY3VycmVudC53b3JkU3BhY2luZztcbiAgICBjb25zdCB0ZXh0SFNjYWxlID0gY3VycmVudC50ZXh0SFNjYWxlICogZm9udERpcmVjdGlvbjtcbiAgICBjb25zdCBmb250TWF0cml4ID0gY3VycmVudC5mb250TWF0cml4IHx8IEZPTlRfSURFTlRJVFlfTUFUUklYO1xuICAgIGNvbnN0IGdseXBoc0xlbmd0aCA9IGdseXBocy5sZW5ndGg7XG4gICAgY29uc3QgaXNUZXh0SW52aXNpYmxlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuSU5WSVNJQkxFO1xuICAgIGxldCBpLCBnbHlwaCwgd2lkdGgsIHNwYWNpbmdMZW5ndGg7XG4gICAgaWYgKGlzVGV4dEludmlzaWJsZSB8fCBmb250U2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdID0gLTE7XG4gICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHgudHJhbnNmb3JtKC4uLmN1cnJlbnQudGV4dE1hdHJpeCk7XG4gICAgY3R4LnRyYW5zbGF0ZShjdXJyZW50LngsIGN1cnJlbnQueSk7XG4gICAgY3R4LnNjYWxlKHRleHRIU2NhbGUsIGZvbnREaXJlY3Rpb24pO1xuICAgIGZvciAoaSA9IDA7IGkgPCBnbHlwaHNMZW5ndGg7ICsraSkge1xuICAgICAgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICBpZiAodHlwZW9mIGdseXBoID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHNwYWNpbmdMZW5ndGggPSBzcGFjaW5nRGlyICogZ2x5cGggKiBmb250U2l6ZSAvIDEwMDA7XG4gICAgICAgIHRoaXMuY3R4LnRyYW5zbGF0ZShzcGFjaW5nTGVuZ3RoLCAwKTtcbiAgICAgICAgY3VycmVudC54ICs9IHNwYWNpbmdMZW5ndGggKiB0ZXh0SFNjYWxlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNwYWNpbmcgPSAoZ2x5cGguaXNTcGFjZSA/IHdvcmRTcGFjaW5nIDogMCkgKyBjaGFyU3BhY2luZztcbiAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IGZvbnQuY2hhclByb2NPcGVyYXRvckxpc3RbZ2x5cGgub3BlcmF0b3JMaXN0SWRdO1xuICAgICAgaWYgKCFvcGVyYXRvckxpc3QpIHtcbiAgICAgICAgd2FybihgVHlwZTMgY2hhcmFjdGVyIFwiJHtnbHlwaC5vcGVyYXRvckxpc3RJZH1cIiBpcyBub3QgYXZhaWxhYmxlLmApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gZ2x5cGg7XG4gICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICBjdHguc2NhbGUoZm9udFNpemUsIGZvbnRTaXplKTtcbiAgICAgICAgY3R4LnRyYW5zZm9ybSguLi5mb250TWF0cml4KTtcbiAgICAgICAgdGhpcy5leGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCk7XG4gICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtnbHlwaC53aWR0aCwgMF0sIGZvbnRNYXRyaXgpO1xuICAgICAgd2lkdGggPSB0cmFuc2Zvcm1lZFswXSAqIGZvbnRTaXplICsgc3BhY2luZztcbiAgICAgIGN0eC50cmFuc2xhdGUod2lkdGgsIDApO1xuICAgICAgY3VycmVudC54ICs9IHdpZHRoICogdGV4dEhTY2FsZTtcbiAgICB9XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7XG4gIH1cbiAgc2V0Q2hhcldpZHRoKHhXaWR0aCwgeVdpZHRoKSB7fVxuICBzZXRDaGFyV2lkdGhBbmRCb3VuZHMoeFdpZHRoLCB5V2lkdGgsIGxseCwgbGx5LCB1cngsIHVyeSkge1xuICAgIHRoaXMuY3R4LnJlY3QobGx4LCBsbHksIHVyeCAtIGxseCwgdXJ5IC0gbGx5KTtcbiAgICB0aGlzLmN0eC5jbGlwKCk7XG4gICAgdGhpcy5lbmRQYXRoKCk7XG4gIH1cbiAgZ2V0Q29sb3JOX1BhdHRlcm4oSVIpIHtcbiAgICBsZXQgcGF0dGVybjtcbiAgICBpZiAoSVJbMF0gPT09IFwiVGlsaW5nUGF0dGVyblwiKSB7XG4gICAgICBjb25zdCBjb2xvciA9IElSWzFdO1xuICAgICAgY29uc3QgYmFzZVRyYW5zZm9ybSA9IHRoaXMuYmFzZVRyYW5zZm9ybSB8fCBnZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY3R4KTtcbiAgICAgIGNvbnN0IGNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IHtcbiAgICAgICAgY3JlYXRlQ2FudmFzR3JhcGhpY3M6IGN0eCA9PiBuZXcgQ2FudmFzR3JhcGhpY3MoY3R4LCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLmZpbHRlckZhY3RvcnksIHtcbiAgICAgICAgICBvcHRpb25hbENvbnRlbnRDb25maWc6IHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLFxuICAgICAgICAgIG1hcmtlZENvbnRlbnRTdGFjazogdGhpcy5tYXJrZWRDb250ZW50U3RhY2tcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgICBwYXR0ZXJuID0gbmV3IFRpbGluZ1BhdHRlcm4oSVIsIGNvbG9yLCB0aGlzLmN0eCwgY2FudmFzR3JhcGhpY3NGYWN0b3J5LCBiYXNlVHJhbnNmb3JtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0dGVybiA9IHRoaXMuX2dldFBhdHRlcm4oSVJbMV0sIElSWzJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm47XG4gIH1cbiAgc2V0U3Ryb2tlQ29sb3JOKCkge1xuICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTtcbiAgfVxuICBzZXRGaWxsQ29sb3JOKCkge1xuICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7XG4gICAgdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsID0gdHJ1ZTtcbiAgfVxuICBzZXRTdHJva2VSR0JDb2xvcihyLCBnLCBiKSB7XG4gICAgY29uc3QgY29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvcihyLCBnLCBiKTtcbiAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IGNvbG9yO1xuICB9XG4gIHNldEZpbGxSR0JDb2xvcihyLCBnLCBiKSB7XG4gICAgY29uc3QgY29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvcihyLCBnLCBiKTtcbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBjb2xvcjtcbiAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gY29sb3I7XG4gICAgdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsID0gZmFsc2U7XG4gIH1cbiAgX2dldFBhdHRlcm4ob2JqSWQsIG1hdHJpeCA9IG51bGwpIHtcbiAgICBsZXQgcGF0dGVybjtcbiAgICBpZiAodGhpcy5jYWNoZWRQYXR0ZXJucy5oYXMob2JqSWQpKSB7XG4gICAgICBwYXR0ZXJuID0gdGhpcy5jYWNoZWRQYXR0ZXJucy5nZXQob2JqSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXR0ZXJuID0gZ2V0U2hhZGluZ1BhdHRlcm4odGhpcy5nZXRPYmplY3Qob2JqSWQpKTtcbiAgICAgIHRoaXMuY2FjaGVkUGF0dGVybnMuc2V0KG9iaklkLCBwYXR0ZXJuKTtcbiAgICB9XG4gICAgaWYgKG1hdHJpeCkge1xuICAgICAgcGF0dGVybi5tYXRyaXggPSBtYXRyaXg7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG4gIHNoYWRpbmdGaWxsKG9iaklkKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLl9nZXRQYXR0ZXJuKG9iaklkKTtcbiAgICBjdHguZmlsbFN0eWxlID0gcGF0dGVybi5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoY3R4KSwgUGF0aFR5cGUuU0hBRElORyk7XG4gICAgY29uc3QgaW52ID0gZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoY3R4KTtcbiAgICBpZiAoaW52KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0gPSBjdHguY2FudmFzO1xuICAgICAgY29uc3QgW3gwLCB5MCwgeDEsIHkxXSA9IFV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goWzAsIDAsIHdpZHRoLCBoZWlnaHRdLCBpbnYpO1xuICAgICAgdGhpcy5jdHguZmlsbFJlY3QoeDAsIHkwLCB4MSAtIHgwLCB5MSAtIHkwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdHguZmlsbFJlY3QoLTFlMTAsIC0xZTEwLCAyZTEwLCAyZTEwKTtcbiAgICB9XG4gICAgdGhpcy5jb21wb3NlKHRoaXMuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KCkpO1xuICAgIHRoaXMucmVzdG9yZSgpO1xuICB9XG4gIGJlZ2luSW5saW5lSW1hZ2UoKSB7XG4gICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgYmVnaW5JbmxpbmVJbWFnZVwiKTtcbiAgfVxuICBiZWdpbkltYWdlRGF0YSgpIHtcbiAgICB1bnJlYWNoYWJsZShcIlNob3VsZCBub3QgY2FsbCBiZWdpbkltYWdlRGF0YVwiKTtcbiAgfVxuICBwYWludEZvcm1YT2JqZWN0QmVnaW4obWF0cml4LCBiYm94KSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2F2ZSgpO1xuICAgIHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy5iYXNlVHJhbnNmb3JtKTtcbiAgICBpZiAobWF0cml4KSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybSguLi5tYXRyaXgpO1xuICAgIH1cbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY3R4KTtcbiAgICBpZiAoYmJveCkge1xuICAgICAgY29uc3Qgd2lkdGggPSBiYm94WzJdIC0gYmJveFswXTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGJib3hbM10gLSBiYm94WzFdO1xuICAgICAgdGhpcy5jdHgucmVjdChiYm94WzBdLCBiYm94WzFdLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuY3VycmVudC51cGRhdGVSZWN0TWluTWF4KGdldEN1cnJlbnRUcmFuc2Zvcm0odGhpcy5jdHgpLCBiYm94KTtcbiAgICAgIHRoaXMuY2xpcCgpO1xuICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgfVxuICB9XG4gIHBhaW50Rm9ybVhPYmplY3RFbmQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzdG9yZSgpO1xuICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrLnBvcCgpO1xuICB9XG4gIGJlZ2luR3JvdXAoZ3JvdXApIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMuZW5kU01hc2tNb2RlKCk7XG4gICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50Q3R4ID0gdGhpcy5jdHg7XG4gICAgaWYgKCFncm91cC5pc29sYXRlZCkge1xuICAgICAgaW5mbyhcIlRPRE86IFN1cHBvcnQgbm9uLWlzb2xhdGVkIGdyb3Vwcy5cIik7XG4gICAgfVxuICAgIGlmIChncm91cC5rbm9ja291dCkge1xuICAgICAgd2FybihcIktub2Nrb3V0IGdyb3VwcyBub3Qgc3VwcG9ydGVkLlwiKTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0oY3VycmVudEN0eCk7XG4gICAgaWYgKGdyb3VwLm1hdHJpeCkge1xuICAgICAgY3VycmVudEN0eC50cmFuc2Zvcm0oLi4uZ3JvdXAubWF0cml4KTtcbiAgICB9XG4gICAgaWYgKCFncm91cC5iYm94KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCb3VuZGluZyBib3ggaXMgcmVxdWlyZWQuXCIpO1xuICAgIH1cbiAgICBsZXQgYm91bmRzID0gVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChncm91cC5iYm94LCBnZXRDdXJyZW50VHJhbnNmb3JtKGN1cnJlbnRDdHgpKTtcbiAgICBjb25zdCBjYW52YXNCb3VuZHMgPSBbMCwgMCwgY3VycmVudEN0eC5jYW52YXMud2lkdGgsIGN1cnJlbnRDdHguY2FudmFzLmhlaWdodF07XG4gICAgYm91bmRzID0gVXRpbC5pbnRlcnNlY3QoYm91bmRzLCBjYW52YXNCb3VuZHMpIHx8IFswLCAwLCAwLCAwXTtcbiAgICBjb25zdCBvZmZzZXRYID0gTWF0aC5mbG9vcihib3VuZHNbMF0pO1xuICAgIGNvbnN0IG9mZnNldFkgPSBNYXRoLmZsb29yKGJvdW5kc1sxXSk7XG4gICAgY29uc3QgZHJhd25XaWR0aCA9IE1hdGgubWF4KE1hdGguY2VpbChib3VuZHNbMl0pIC0gb2Zmc2V0WCwgMSk7XG4gICAgY29uc3QgZHJhd25IZWlnaHQgPSBNYXRoLm1heChNYXRoLmNlaWwoYm91bmRzWzNdKSAtIG9mZnNldFksIDEpO1xuICAgIHRoaXMuY3VycmVudC5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLCAwLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodF0pO1xuICAgIGxldCBjYWNoZUlkID0gXCJncm91cEF0XCIgKyB0aGlzLmdyb3VwTGV2ZWw7XG4gICAgaWYgKGdyb3VwLnNtYXNrKSB7XG4gICAgICBjYWNoZUlkICs9IFwiX3NtYXNrX1wiICsgdGhpcy5zbWFza0NvdW50ZXIrKyAlIDI7XG4gICAgfVxuICAgIGNvbnN0IHNjcmF0Y2hDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhjYWNoZUlkLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodCk7XG4gICAgY29uc3QgZ3JvdXBDdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7XG4gICAgZ3JvdXBDdHgudHJhbnNsYXRlKC1vZmZzZXRYLCAtb2Zmc2V0WSk7XG4gICAgZ3JvdXBDdHgudHJhbnNmb3JtKC4uLmN1cnJlbnRUcmFuc2Zvcm0pO1xuICAgIGlmIChncm91cC5zbWFzaykge1xuICAgICAgdGhpcy5zbWFza1N0YWNrLnB1c2goe1xuICAgICAgICBjYW52YXM6IHNjcmF0Y2hDYW52YXMuY2FudmFzLFxuICAgICAgICBjb250ZXh0OiBncm91cEN0eCxcbiAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WSxcbiAgICAgICAgc3VidHlwZTogZ3JvdXAuc21hc2suc3VidHlwZSxcbiAgICAgICAgYmFja2Ryb3A6IGdyb3VwLnNtYXNrLmJhY2tkcm9wLFxuICAgICAgICB0cmFuc2Zlck1hcDogZ3JvdXAuc21hc2sudHJhbnNmZXJNYXAgfHwgbnVsbCxcbiAgICAgICAgc3RhcnRUcmFuc2Zvcm1JbnZlcnNlOiBudWxsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudEN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICBjdXJyZW50Q3R4LnRyYW5zbGF0ZShvZmZzZXRYLCBvZmZzZXRZKTtcbiAgICAgIGN1cnJlbnRDdHguc2F2ZSgpO1xuICAgIH1cbiAgICBjb3B5Q3R4U3RhdGUoY3VycmVudEN0eCwgZ3JvdXBDdHgpO1xuICAgIHRoaXMuY3R4ID0gZ3JvdXBDdHg7XG4gICAgdGhpcy5zZXRHU3RhdGUoW1tcIkJNXCIsIFwic291cmNlLW92ZXJcIl0sIFtcImNhXCIsIDFdLCBbXCJDQVwiLCAxXV0pO1xuICAgIHRoaXMuZ3JvdXBTdGFjay5wdXNoKGN1cnJlbnRDdHgpO1xuICAgIHRoaXMuZ3JvdXBMZXZlbCsrO1xuICB9XG4gIGVuZEdyb3VwKGdyb3VwKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZ3JvdXBMZXZlbC0tO1xuICAgIGNvbnN0IGdyb3VwQ3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpO1xuICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgIHRoaXMuY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgIGlmIChncm91cC5zbWFzaykge1xuICAgICAgdGhpcy50ZW1wU01hc2sgPSB0aGlzLnNtYXNrU3RhY2sucG9wKCk7XG4gICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgY29uc3QgY3VycmVudE10eCA9IGdldEN1cnJlbnRUcmFuc2Zvcm0odGhpcy5jdHgpO1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oLi4uY3VycmVudE10eCk7XG4gICAgICBjb25zdCBkaXJ0eUJveCA9IFV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goWzAsIDAsIGdyb3VwQ3R4LmNhbnZhcy53aWR0aCwgZ3JvdXBDdHguY2FudmFzLmhlaWdodF0sIGN1cnJlbnRNdHgpO1xuICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKGdyb3VwQ3R4LmNhbnZhcywgMCwgMCk7XG4gICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICB0aGlzLmNvbXBvc2UoZGlydHlCb3gpO1xuICAgIH1cbiAgfVxuICBiZWdpbkFubm90YXRpb24oaWQsIHJlY3QsIHRyYW5zZm9ybSwgbWF0cml4LCBoYXNPd25DYW52YXMpIHtcbiAgICB0aGlzLiNyZXN0b3JlSW5pdGlhbFN0YXRlKCk7XG4gICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICB0aGlzLnNhdmUoKTtcbiAgICBpZiAodGhpcy5iYXNlVHJhbnNmb3JtKSB7XG4gICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oLi4udGhpcy5iYXNlVHJhbnNmb3JtKTtcbiAgICB9XG4gICAgaWYgKHJlY3QpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gcmVjdFsyXSAtIHJlY3RbMF07XG4gICAgICBjb25zdCBoZWlnaHQgPSByZWN0WzNdIC0gcmVjdFsxXTtcbiAgICAgIGlmIChoYXNPd25DYW52YXMgJiYgdGhpcy5hbm5vdGF0aW9uQ2FudmFzTWFwKSB7XG4gICAgICAgIHRyYW5zZm9ybSA9IHRyYW5zZm9ybS5zbGljZSgpO1xuICAgICAgICB0cmFuc2Zvcm1bNF0gLT0gcmVjdFswXTtcbiAgICAgICAgdHJhbnNmb3JtWzVdIC09IHJlY3RbMV07XG4gICAgICAgIHJlY3QgPSByZWN0LnNsaWNlKCk7XG4gICAgICAgIHJlY3RbMF0gPSByZWN0WzFdID0gMDtcbiAgICAgICAgcmVjdFsyXSA9IHdpZHRoO1xuICAgICAgICByZWN0WzNdID0gaGVpZ2h0O1xuICAgICAgICBjb25zdCBbc2NhbGVYLCBzY2FsZVldID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShnZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY3R4KSk7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB2aWV3cG9ydFNjYWxlXG4gICAgICAgIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBjYW52YXNXaWR0aCA9IE1hdGguY2VpbCh3aWR0aCAqIHRoaXMub3V0cHV0U2NhbGVYICogdmlld3BvcnRTY2FsZSk7XG4gICAgICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgKiB0aGlzLm91dHB1dFNjYWxlWSAqIHZpZXdwb3J0U2NhbGUpO1xuICAgICAgICB0aGlzLmFubm90YXRpb25DYW52YXMgPSB0aGlzLmNhbnZhc0ZhY3RvcnkuY3JlYXRlKGNhbnZhc1dpZHRoLCBjYW52YXNIZWlnaHQpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgY2FudmFzLFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgfSA9IHRoaXMuYW5ub3RhdGlvbkNhbnZhcztcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzTWFwLnNldChpZCwgY2FudmFzKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzLnNhdmVkQ3R4ID0gdGhpcy5jdHg7XG4gICAgICAgIHRoaXMuY3R4ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oc2NhbGVYLCAwLCAwLCAtc2NhbGVZLCAwLCBoZWlnaHQgKiBzY2FsZVkpO1xuICAgICAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG4gICAgICAgIHRoaXMuY3R4LnJlY3QocmVjdFswXSwgcmVjdFsxXSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuY3R4LmNsaXAoKTtcbiAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY3VycmVudCA9IG5ldyBDYW52YXNFeHRyYVN0YXRlKHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy50cmFuc2Zvcm0oLi4udHJhbnNmb3JtKTtcbiAgICB0aGlzLnRyYW5zZm9ybSguLi5tYXRyaXgpO1xuICB9XG4gIGVuZEFubm90YXRpb24oKSB7XG4gICAgaWYgKHRoaXMuYW5ub3RhdGlvbkNhbnZhcykge1xuICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgdGhpcy4jZHJhd0ZpbHRlcigpO1xuICAgICAgdGhpcy5jdHggPSB0aGlzLmFubm90YXRpb25DYW52YXMuc2F2ZWRDdHg7XG4gICAgICBkZWxldGUgdGhpcy5hbm5vdGF0aW9uQ2FudmFzLnNhdmVkQ3R4O1xuICAgICAgZGVsZXRlIHRoaXMuYW5ub3RhdGlvbkNhbnZhcztcbiAgICB9XG4gIH1cbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0KGltZykge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb3VudCA9IGltZy5jb3VudDtcbiAgICBpbWcgPSB0aGlzLmdldE9iamVjdChpbWcuZGF0YSwgaW1nKTtcbiAgICBpbWcuY291bnQgPSBjb3VudDtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBnbHlwaCA9IHRoaXMucHJvY2Vzc2luZ1R5cGUzO1xuICAgIGlmIChnbHlwaCkge1xuICAgICAgaWYgKGdseXBoLmNvbXBpbGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZ2x5cGguY29tcGlsZWQgPSBjb21waWxlVHlwZTNHbHlwaChpbWcpO1xuICAgICAgfVxuICAgICAgaWYgKGdseXBoLmNvbXBpbGVkKSB7XG4gICAgICAgIGdseXBoLmNvbXBpbGVkKGN0eCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbWFzayA9IHRoaXMuX2NyZWF0ZU1hc2tDYW52YXMoaW1nKTtcbiAgICBjb25zdCBtYXNrQ2FudmFzID0gbWFzay5jYW52YXM7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIGN0eC5kcmF3SW1hZ2UobWFza0NhbnZhcywgbWFzay5vZmZzZXRYLCBtYXNrLm9mZnNldFkpO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gIH1cbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0KGltZywgc2NhbGVYLCBza2V3WCA9IDAsIHNrZXdZID0gMCwgc2NhbGVZLCBwb3NpdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW1nID0gdGhpcy5nZXRPYmplY3QoaW1nLmRhdGEsIGltZyk7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjb25zdCBjdXJyZW50VHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpO1xuICAgIGN0eC50cmFuc2Zvcm0oc2NhbGVYLCBza2V3WCwgc2tld1ksIHNjYWxlWSwgMCwgMCk7XG4gICAgY29uc3QgbWFzayA9IHRoaXMuX2NyZWF0ZU1hc2tDYW52YXMoaW1nKTtcbiAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIG1hc2sub2Zmc2V0WCAtIGN1cnJlbnRUcmFuc2Zvcm1bNF0sIG1hc2sub2Zmc2V0WSAtIGN1cnJlbnRUcmFuc2Zvcm1bNV0pO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBjb25zdCB0cmFucyA9IFV0aWwudHJhbnNmb3JtKGN1cnJlbnRUcmFuc2Zvcm0sIFtzY2FsZVgsIHNrZXdYLCBza2V3WSwgc2NhbGVZLCBwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV1dKTtcbiAgICAgIGNvbnN0IFt4LCB5XSA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCB0cmFucyk7XG4gICAgICBjdHguZHJhd0ltYWdlKG1hc2suY2FudmFzLCB4LCB5KTtcbiAgICB9XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgICB0aGlzLmNvbXBvc2UoKTtcbiAgfVxuICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cChpbWFnZXMpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjtcbiAgICBjb25zdCBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsO1xuICAgIGZvciAoY29uc3QgaW1hZ2Ugb2YgaW1hZ2VzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHRyYW5zZm9ybVxuICAgICAgfSA9IGltYWdlO1xuICAgICAgY29uc3QgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwibWFza0NhbnZhc1wiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGNvbnN0IG1hc2tDdHggPSBtYXNrQ2FudmFzLmNvbnRleHQ7XG4gICAgICBtYXNrQ3R4LnNhdmUoKTtcbiAgICAgIGNvbnN0IGltZyA9IHRoaXMuZ2V0T2JqZWN0KGRhdGEsIGltYWdlKTtcbiAgICAgIHB1dEJpbmFyeUltYWdlTWFzayhtYXNrQ3R4LCBpbWcpO1xuICAgICAgbWFza0N0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuICAgICAgbWFza0N0eC5maWxsU3R5bGUgPSBpc1BhdHRlcm5GaWxsID8gZmlsbENvbG9yLmdldFBhdHRlcm4obWFza0N0eCwgdGhpcywgZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoY3R4KSwgUGF0aFR5cGUuRklMTCkgOiBmaWxsQ29sb3I7XG4gICAgICBtYXNrQ3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgbWFza0N0eC5yZXN0b3JlKCk7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LnRyYW5zZm9ybSguLi50cmFuc2Zvcm0pO1xuICAgICAgY3R4LnNjYWxlKDEsIC0xKTtcbiAgICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhjdHgsIG1hc2tDYW52YXMuY2FudmFzLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSwgMSk7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvc2UoKTtcbiAgfVxuICBwYWludEltYWdlWE9iamVjdChvYmpJZCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbWdEYXRhID0gdGhpcy5nZXRPYmplY3Qob2JqSWQpO1xuICAgIGlmICghaW1nRGF0YSkge1xuICAgICAgd2FybihcIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSk7XG4gIH1cbiAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQob2JqSWQsIHNjYWxlWCwgc2NhbGVZLCBwb3NpdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW1nRGF0YSA9IHRoaXMuZ2V0T2JqZWN0KG9iaklkKTtcbiAgICBpZiAoIWltZ0RhdGEpIHtcbiAgICAgIHdhcm4oXCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7XG4gICAgY29uc3QgbWFwID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIG1hcC5wdXNoKHtcbiAgICAgICAgdHJhbnNmb3JtOiBbc2NhbGVYLCAwLCAwLCBzY2FsZVksIHBvc2l0aW9uc1tpXSwgcG9zaXRpb25zW2kgKyAxXV0sXG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIHc6IHdpZHRoLFxuICAgICAgICBoOiBoZWlnaHRcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAoaW1nRGF0YSwgbWFwKTtcbiAgfVxuICBhcHBseVRyYW5zZmVyTWFwc1RvQ2FudmFzKGN0eCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzICE9PSBcIm5vbmVcIikge1xuICAgICAgY3R4LmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHM7XG4gICAgICBjdHguZHJhd0ltYWdlKGN0eC5jYW52YXMsIDAsIDApO1xuICAgICAgY3R4LmZpbHRlciA9IFwibm9uZVwiO1xuICAgIH1cbiAgICByZXR1cm4gY3R4LmNhbnZhcztcbiAgfVxuICBhcHBseVRyYW5zZmVyTWFwc1RvQml0bWFwKGltZ0RhdGEpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcyA9PT0gXCJub25lXCIpIHtcbiAgICAgIHJldHVybiBpbWdEYXRhLmJpdG1hcDtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYml0bWFwLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gaW1nRGF0YTtcbiAgICBjb25zdCB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlubGluZUltYWdlXCIsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgIHRtcEN0eC5maWx0ZXIgPSB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzO1xuICAgIHRtcEN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwKTtcbiAgICB0bXBDdHguZmlsdGVyID0gXCJub25lXCI7XG4gICAgcmV0dXJuIHRtcENhbnZhcy5jYW52YXM7XG4gIH1cbiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgaWYgKCFpc05vZGVKUykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmaWx0ZXJcbiAgICAgIH0gPSBjdHg7XG4gICAgICBpZiAoZmlsdGVyICE9PSBcIm5vbmVcIiAmJiBmaWx0ZXIgIT09IFwiXCIpIHtcbiAgICAgICAgY3R4LmZpbHRlciA9IFwibm9uZVwiO1xuICAgICAgfVxuICAgIH1cbiAgICBjdHguc2NhbGUoMSAvIHdpZHRoLCAtMSAvIGhlaWdodCk7XG4gICAgbGV0IGltZ1RvUGFpbnQ7XG4gICAgaWYgKGltZ0RhdGEuYml0bWFwKSB7XG4gICAgICBpbWdUb1BhaW50ID0gdGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQml0bWFwKGltZ0RhdGEpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSBcImZ1bmN0aW9uXCIgJiYgaW1nRGF0YSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8ICFpbWdEYXRhLmRhdGEpIHtcbiAgICAgIGltZ1RvUGFpbnQgPSBpbWdEYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlubGluZUltYWdlXCIsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3QgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgICBwdXRCaW5hcnlJbWFnZURhdGEodG1wQ3R4LCBpbWdEYXRhKTtcbiAgICAgIGltZ1RvUGFpbnQgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXModG1wQ3R4KTtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGVkID0gdGhpcy5fc2NhbGVJbWFnZShpbWdUb1BhaW50LCBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShjdHgpKTtcbiAgICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZ2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KSwgaW1nRGF0YS5pbnRlcnBvbGF0ZSk7XG4gICAgZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKGN0eCwgc2NhbGVkLmltZywgMCwgMCwgc2NhbGVkLnBhaW50V2lkdGgsIHNjYWxlZC5wYWludEhlaWdodCwgMCwgLWhlaWdodCwgd2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gICAgdGhpcy5yZXN0b3JlKCk7XG4gIH1cbiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cChpbWdEYXRhLCBtYXApIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgbGV0IGltZ1RvUGFpbnQ7XG4gICAgaWYgKGltZ0RhdGEuYml0bWFwKSB7XG4gICAgICBpbWdUb1BhaW50ID0gaW1nRGF0YS5iaXRtYXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHcgPSBpbWdEYXRhLndpZHRoO1xuICAgICAgY29uc3QgaCA9IGltZ0RhdGEuaGVpZ2h0O1xuICAgICAgY29uc3QgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJpbmxpbmVJbWFnZVwiLCB3LCBoKTtcbiAgICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgcHV0QmluYXJ5SW1hZ2VEYXRhKHRtcEN0eCwgaW1nRGF0YSk7XG4gICAgICBpbWdUb1BhaW50ID0gdGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQ2FudmFzKHRtcEN0eCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgbWFwKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LnRyYW5zZm9ybSguLi5lbnRyeS50cmFuc2Zvcm0pO1xuICAgICAgY3R4LnNjYWxlKDEsIC0xKTtcbiAgICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhjdHgsIGltZ1RvUGFpbnQsIGVudHJ5LngsIGVudHJ5LnksIGVudHJ5LncsIGVudHJ5LmgsIDAsIC0xLCAxLCAxKTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9zZSgpO1xuICB9XG4gIHBhaW50U29saWRDb2xvckltYWdlTWFzaygpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gIH1cbiAgbWFya1BvaW50KHRhZykge31cbiAgbWFya1BvaW50UHJvcHModGFnLCBwcm9wZXJ0aWVzKSB7fVxuICBiZWdpbk1hcmtlZENvbnRlbnQodGFnKSB7XG4gICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICB2aXNpYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHModGFnLCBwcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHRhZyA9PT0gXCJPQ1wiKSB7XG4gICAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHtcbiAgICAgICAgdmlzaWJsZTogdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcuaXNWaXNpYmxlKHByb3BlcnRpZXMpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICAgIHZpc2libGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdGhpcy5pc0NvbnRlbnRWaXNpYmxlKCk7XG4gIH1cbiAgZW5kTWFya2VkQ29udGVudCgpIHtcbiAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wb3AoKTtcbiAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdGhpcy5pc0NvbnRlbnRWaXNpYmxlKCk7XG4gIH1cbiAgYmVnaW5Db21wYXQoKSB7fVxuICBlbmRDb21wYXQoKSB7fVxuICBjb25zdW1lUGF0aChjbGlwQm94KSB7XG4gICAgY29uc3QgaXNFbXB0eSA9IHRoaXMuY3VycmVudC5pc0VtcHR5Q2xpcCgpO1xuICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICB0aGlzLmN1cnJlbnQudXBkYXRlQ2xpcEZyb21QYXRoKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgdGhpcy5jb21wb3NlKGNsaXBCb3gpO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgaWYgKCFpc0VtcHR5KSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwID09PSBFT19DTElQKSB7XG4gICAgICAgICAgY3R4LmNsaXAoXCJldmVub2RkXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0eC5jbGlwKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQuc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0aGlzLmN1cnJlbnQuY2xpcEJveCk7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICB9XG4gIGdldFNpbmdsZVBpeGVsV2lkdGgoKSB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoKSB7XG4gICAgICBjb25zdCBtID0gZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLmN0eCk7XG4gICAgICBpZiAobVsxXSA9PT0gMCAmJiBtWzJdID09PSAwKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSAxIC8gTWF0aC5taW4oTWF0aC5hYnMobVswXSksIE1hdGguYWJzKG1bM10pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFic0RldCA9IE1hdGguYWJzKG1bMF0gKiBtWzNdIC0gbVsyXSAqIG1bMV0pO1xuICAgICAgICBjb25zdCBub3JtWCA9IE1hdGguaHlwb3QobVswXSwgbVsyXSk7XG4gICAgICAgIGNvbnN0IG5vcm1ZID0gTWF0aC5oeXBvdChtWzFdLCBtWzNdKTtcbiAgICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IE1hdGgubWF4KG5vcm1YLCBub3JtWSkgLyBhYnNEZXQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoO1xuICB9XG4gIGdldFNjYWxlRm9yU3Ryb2tpbmcoKSB7XG4gICAgaWYgKHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPT09IC0xKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxpbmVXaWR0aFxuICAgICAgfSA9IHRoaXMuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYSxcbiAgICAgICAgYixcbiAgICAgICAgYyxcbiAgICAgICAgZFxuICAgICAgfSA9IHRoaXMuY3R4LmdldFRyYW5zZm9ybSgpO1xuICAgICAgbGV0IHNjYWxlWCwgc2NhbGVZO1xuICAgICAgaWYgKGIgPT09IDAgJiYgYyA9PT0gMCkge1xuICAgICAgICBjb25zdCBub3JtWCA9IE1hdGguYWJzKGEpO1xuICAgICAgICBjb25zdCBub3JtWSA9IE1hdGguYWJzKGQpO1xuICAgICAgICBpZiAobm9ybVggPT09IG5vcm1ZKSB7XG4gICAgICAgICAgaWYgKGxpbmVXaWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgc2NhbGVYID0gc2NhbGVZID0gMSAvIG5vcm1YO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzY2FsZWRMaW5lV2lkdGggPSBub3JtWCAqIGxpbmVXaWR0aDtcbiAgICAgICAgICAgIHNjYWxlWCA9IHNjYWxlWSA9IHNjYWxlZExpbmVXaWR0aCA8IDEgPyAxIC8gc2NhbGVkTGluZVdpZHRoIDogMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobGluZVdpZHRoID09PSAwKSB7XG4gICAgICAgICAgc2NhbGVYID0gMSAvIG5vcm1YO1xuICAgICAgICAgIHNjYWxlWSA9IDEgLyBub3JtWTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzY2FsZWRYTGluZVdpZHRoID0gbm9ybVggKiBsaW5lV2lkdGg7XG4gICAgICAgICAgY29uc3Qgc2NhbGVkWUxpbmVXaWR0aCA9IG5vcm1ZICogbGluZVdpZHRoO1xuICAgICAgICAgIHNjYWxlWCA9IHNjYWxlZFhMaW5lV2lkdGggPCAxID8gMSAvIHNjYWxlZFhMaW5lV2lkdGggOiAxO1xuICAgICAgICAgIHNjYWxlWSA9IHNjYWxlZFlMaW5lV2lkdGggPCAxID8gMSAvIHNjYWxlZFlMaW5lV2lkdGggOiAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhYnNEZXQgPSBNYXRoLmFicyhhICogZCAtIGIgKiBjKTtcbiAgICAgICAgY29uc3Qgbm9ybVggPSBNYXRoLmh5cG90KGEsIGIpO1xuICAgICAgICBjb25zdCBub3JtWSA9IE1hdGguaHlwb3QoYywgZCk7XG4gICAgICAgIGlmIChsaW5lV2lkdGggPT09IDApIHtcbiAgICAgICAgICBzY2FsZVggPSBub3JtWSAvIGFic0RldDtcbiAgICAgICAgICBzY2FsZVkgPSBub3JtWCAvIGFic0RldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBiYXNlQXJlYSA9IGxpbmVXaWR0aCAqIGFic0RldDtcbiAgICAgICAgICBzY2FsZVggPSBub3JtWSA+IGJhc2VBcmVhID8gbm9ybVkgLyBiYXNlQXJlYSA6IDE7XG4gICAgICAgICAgc2NhbGVZID0gbm9ybVggPiBiYXNlQXJlYSA/IG5vcm1YIC8gYmFzZUFyZWEgOiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdID0gc2NhbGVYO1xuICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1sxXSA9IHNjYWxlWTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmc7XG4gIH1cbiAgcmVzY2FsZUFuZFN0cm9rZShzYXZlUmVzdG9yZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGN0eFxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IHtcbiAgICAgIGxpbmVXaWR0aFxuICAgIH0gPSB0aGlzLmN1cnJlbnQ7XG4gICAgY29uc3QgW3NjYWxlWCwgc2NhbGVZXSA9IHRoaXMuZ2V0U2NhbGVGb3JTdHJva2luZygpO1xuICAgIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGggfHwgMTtcbiAgICBpZiAoc2NhbGVYID09PSAxICYmIHNjYWxlWSA9PT0gMSkge1xuICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXNoZXMgPSBjdHguZ2V0TGluZURhc2goKTtcbiAgICBpZiAoc2F2ZVJlc3RvcmUpIHtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgfVxuICAgIGN0eC5zY2FsZShzY2FsZVgsIHNjYWxlWSk7XG4gICAgaWYgKGRhc2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWF4KHNjYWxlWCwgc2NhbGVZKTtcbiAgICAgIGN0eC5zZXRMaW5lRGFzaChkYXNoZXMubWFwKHggPT4geCAvIHNjYWxlKSk7XG4gICAgICBjdHgubGluZURhc2hPZmZzZXQgLz0gc2NhbGU7XG4gICAgfVxuICAgIGN0eC5zdHJva2UoKTtcbiAgICBpZiAoc2F2ZVJlc3RvcmUpIHtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICB9XG4gIGlzQ29udGVudFZpc2libGUoKSB7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMubWFya2VkQ29udGVudFN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoIXRoaXMubWFya2VkQ29udGVudFN0YWNrW2ldLnZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuZm9yIChjb25zdCBvcCBpbiBPUFMpIHtcbiAgaWYgKENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVtvcF0gIT09IHVuZGVmaW5lZCkge1xuICAgIENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVtPUFNbb3BdXSA9IENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVtvcF07XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvd29ya2VyX29wdGlvbnMuanNcbmNsYXNzIEdsb2JhbFdvcmtlck9wdGlvbnMge1xuICBzdGF0aWMgI3BvcnQgPSBudWxsO1xuICBzdGF0aWMgI3NyYyA9IFwiXCI7XG4gIHN0YXRpYyBnZXQgd29ya2VyUG9ydCgpIHtcbiAgICByZXR1cm4gdGhpcy4jcG9ydDtcbiAgfVxuICBzdGF0aWMgc2V0IHdvcmtlclBvcnQodmFsKSB7XG4gICAgaWYgKCEodHlwZW9mIFdvcmtlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWwgaW5zdGFuY2VvZiBXb3JrZXIpICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBgd29ya2VyUG9ydGAgdHlwZS5cIik7XG4gICAgfVxuICAgIHRoaXMuI3BvcnQgPSB2YWw7XG4gIH1cbiAgc3RhdGljIGdldCB3b3JrZXJTcmMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NyYztcbiAgfVxuICBzdGF0aWMgc2V0IHdvcmtlclNyYyh2YWwpIHtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBgd29ya2VyU3JjYCB0eXBlLlwiKTtcbiAgICB9XG4gICAgdGhpcy4jc3JjID0gdmFsO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9zaGFyZWQvbWVzc2FnZV9oYW5kbGVyLmpzXG5cbmNvbnN0IENhbGxiYWNrS2luZCA9IHtcbiAgVU5LTk9XTjogMCxcbiAgREFUQTogMSxcbiAgRVJST1I6IDJcbn07XG5jb25zdCBTdHJlYW1LaW5kID0ge1xuICBVTktOT1dOOiAwLFxuICBDQU5DRUw6IDEsXG4gIENBTkNFTF9DT01QTEVURTogMixcbiAgQ0xPU0U6IDMsXG4gIEVOUVVFVUU6IDQsXG4gIEVSUk9SOiA1LFxuICBQVUxMOiA2LFxuICBQVUxMX0NPTVBMRVRFOiA3LFxuICBTVEFSVF9DT01QTEVURTogOFxufTtcbmZ1bmN0aW9uIHdyYXBSZWFzb24ocmVhc29uKSB7XG4gIGlmICghKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiByZWFzb24gPT09IFwib2JqZWN0XCIgJiYgcmVhc29uICE9PSBudWxsKSkge1xuICAgIHVucmVhY2hhYmxlKCd3cmFwUmVhc29uOiBFeHBlY3RlZCBcInJlYXNvblwiIHRvIGJlIGEgKHBvc3NpYmx5IGNsb25lZCkgRXJyb3IuJyk7XG4gIH1cbiAgc3dpdGNoIChyZWFzb24ubmFtZSkge1xuICAgIGNhc2UgXCJBYm9ydEV4Y2VwdGlvblwiOlxuICAgICAgcmV0dXJuIG5ldyBBYm9ydEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSk7XG4gICAgY2FzZSBcIk1pc3NpbmdQREZFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgTWlzc2luZ1BERkV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSk7XG4gICAgY2FzZSBcIlBhc3N3b3JkRXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IFBhc3N3b3JkRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uY29kZSk7XG4gICAgY2FzZSBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiOlxuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5zdGF0dXMpO1xuICAgIGNhc2UgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgVW5rbm93bkVycm9yRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uZGV0YWlscyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBuZXcgVW5rbm93bkVycm9yRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24udG9TdHJpbmcoKSk7XG4gIH1cbn1cbmNsYXNzIE1lc3NhZ2VIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Ioc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgY29tT2JqKSB7XG4gICAgdGhpcy5zb3VyY2VOYW1lID0gc291cmNlTmFtZTtcbiAgICB0aGlzLnRhcmdldE5hbWUgPSB0YXJnZXROYW1lO1xuICAgIHRoaXMuY29tT2JqID0gY29tT2JqO1xuICAgIHRoaXMuY2FsbGJhY2tJZCA9IDE7XG4gICAgdGhpcy5zdHJlYW1JZCA9IDE7XG4gICAgdGhpcy5zdHJlYW1TaW5rcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5zdHJlYW1Db250cm9sbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5hY3Rpb25IYW5kbGVyID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSA9IGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhO1xuICAgICAgaWYgKGRhdGEudGFyZ2V0TmFtZSAhPT0gdGhpcy5zb3VyY2VOYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnN0cmVhbSkge1xuICAgICAgICB0aGlzLiNwcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tJZCA9IGRhdGEuY2FsbGJhY2tJZDtcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07XG4gICAgICAgIGlmICghY2FwYWJpbGl0eSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgJHtjYWxsYmFja0lkfWApO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdO1xuICAgICAgICBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkRBVEEpIHtcbiAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoZGF0YS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuRVJST1IpIHtcbiAgICAgICAgICBjYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBjYWxsYmFjayBjYXNlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07XG4gICAgICBpZiAoIWFjdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYWN0aW9uIGZyb20gd29ya2VyOiAke2RhdGEuYWN0aW9ufWApO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuY2FsbGJhY2tJZCkge1xuICAgICAgICBjb25zdCBjYlNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWU7XG4gICAgICAgIGNvbnN0IGNiVGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTtcbiAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKGFjdGlvbihkYXRhLmRhdGEpKTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWU6IGNiU291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWU6IGNiVGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFja0tpbmQuREFUQSxcbiAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGRhdGEuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgIGRhdGE6IHJlc3VsdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWU6IGNiU291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWU6IGNiVGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFja0tpbmQuRVJST1IsXG4gICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsXG4gICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuc3RyZWFtSWQpIHtcbiAgICAgICAgdGhpcy4jY3JlYXRlU3RyZWFtU2luayhkYXRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYWN0aW9uKGRhdGEuZGF0YSk7XG4gICAgfTtcbiAgICBjb21PYmouYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpO1xuICB9XG4gIG9uKGFjdGlvbk5hbWUsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBhaCA9IHRoaXMuYWN0aW9uSGFuZGxlcjtcbiAgICBpZiAoYWhbYWN0aW9uTmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgYWxyZWFkeSBhbiBhY3Rpb25OYW1lIGNhbGxlZCBcIiR7YWN0aW9uTmFtZX1cImApO1xuICAgIH1cbiAgICBhaFthY3Rpb25OYW1lXSA9IGhhbmRsZXI7XG4gIH1cbiAgc2VuZChhY3Rpb25OYW1lLCBkYXRhLCB0cmFuc2ZlcnMpIHtcbiAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG4gICAgICBhY3Rpb246IGFjdGlvbk5hbWUsXG4gICAgICBkYXRhXG4gICAgfSwgdHJhbnNmZXJzKTtcbiAgfVxuICBzZW5kV2l0aFByb21pc2UoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7XG4gICAgY29uc3QgY2FsbGJhY2tJZCA9IHRoaXMuY2FsbGJhY2tJZCsrO1xuICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdID0gY2FwYWJpbGl0eTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuICAgICAgICBjYWxsYmFja0lkLFxuICAgICAgICBkYXRhXG4gICAgICB9LCB0cmFuc2ZlcnMpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjYXBhYmlsaXR5LnJlamVjdChleCk7XG4gICAgfVxuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgc2VuZFdpdGhTdHJlYW0oYWN0aW9uTmFtZSwgZGF0YSwgcXVldWVpbmdTdHJhdGVneSwgdHJhbnNmZXJzKSB7XG4gICAgY29uc3Qgc3RyZWFtSWQgPSB0aGlzLnN0cmVhbUlkKyssXG4gICAgICBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgdGFyZ2V0TmFtZSA9IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqO1xuICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgc3RhcnQ6IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICBjb25zdCBzdGFydENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0gPSB7XG4gICAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgICBzdGFydENhbGw6IHN0YXJ0Q2FwYWJpbGl0eSxcbiAgICAgICAgICBwdWxsQ2FsbDogbnVsbCxcbiAgICAgICAgICBjYW5jZWxDYWxsOiBudWxsLFxuICAgICAgICAgIGlzQ2xvc2VkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsXG4gICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZVxuICAgICAgICB9LCB0cmFuc2ZlcnMpO1xuICAgICAgICByZXR1cm4gc3RhcnRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICB9LFxuICAgICAgcHVsbDogY29udHJvbGxlciA9PiB7XG4gICAgICAgIGNvbnN0IHB1bGxDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsID0gcHVsbENhcGFiaWxpdHk7XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHVsbENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBjYW5jZWw6IHJlYXNvbiA9PiB7XG4gICAgICAgIGFzc2VydChyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgXCJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uXCIpO1xuICAgICAgICBjb25zdCBjYW5jZWxDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwgPSBjYW5jZWxDYXBhYmlsaXR5O1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUwsXG4gICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjYW5jZWxDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICB9XG4gICAgfSwgcXVldWVpbmdTdHJhdGVneSk7XG4gIH1cbiAgI2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSkge1xuICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZCxcbiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lLFxuICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXMsXG4gICAgICBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dO1xuICAgIGNvbnN0IHN0cmVhbVNpbmsgPSB7XG4gICAgICBlbnF1ZXVlKGNodW5rLCBzaXplID0gMSwgdHJhbnNmZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3REZXNpcmVkU2l6ZSA9IHRoaXMuZGVzaXJlZFNpemU7XG4gICAgICAgIHRoaXMuZGVzaXJlZFNpemUgLT0gc2l6ZTtcbiAgICAgICAgaWYgKGxhc3REZXNpcmVkU2l6ZSA+IDAgJiYgdGhpcy5kZXNpcmVkU2l6ZSA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5zaW5rQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgICAgIHRoaXMucmVhZHkgPSB0aGlzLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVOUVVFVUUsXG4gICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgY2h1bmtcbiAgICAgICAgfSwgdHJhbnNmZXJzKTtcbiAgICAgIH0sXG4gICAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DTE9TRSxcbiAgICAgICAgICBzdHJlYW1JZFxuICAgICAgICB9KTtcbiAgICAgICAgZGVsZXRlIHNlbGYuc3RyZWFtU2lua3Nbc3RyZWFtSWRdO1xuICAgICAgfSxcbiAgICAgIGVycm9yKHJlYXNvbikge1xuICAgICAgICBhc3NlcnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsIFwiZXJyb3IgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uXCIpO1xuICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVSUk9SLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHNpbmtDYXBhYmlsaXR5OiBQcm9taXNlLndpdGhSZXNvbHZlcnMoKSxcbiAgICAgIG9uUHVsbDogbnVsbCxcbiAgICAgIG9uQ2FuY2VsOiBudWxsLFxuICAgICAgaXNDYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgZGVzaXJlZFNpemU6IGRhdGEuZGVzaXJlZFNpemUsXG4gICAgICByZWFkeTogbnVsbFxuICAgIH07XG4gICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgc3RyZWFtU2luay5yZWFkeSA9IHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXSA9IHN0cmVhbVNpbms7XG4gICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSwgc3RyZWFtU2luaykpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLFxuICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgc3VjY2VzczogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLFxuICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gICNwcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKSB7XG4gICAgY29uc3Qgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkLFxuICAgICAgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSxcbiAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsXG4gICAgICBjb21PYmogPSB0aGlzLmNvbU9iajtcbiAgICBjb25zdCBzdHJlYW1Db250cm9sbGVyID0gdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sXG4gICAgICBzdHJlYW1TaW5rID0gdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07XG4gICAgc3dpdGNoIChkYXRhLnN0cmVhbSkge1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFOlxuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5zdGFydENhbGwucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURTpcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIucHVsbENhbGwucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIucHVsbENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5QVUxMOlxuICAgICAgICBpZiAoIXN0cmVhbVNpbmspIHtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJlYW1TaW5rLmRlc2lyZWRTaXplIDw9IDAgJiYgZGF0YS5kZXNpcmVkU2l6ZSA+IDApIHtcbiAgICAgICAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzdHJlYW1TaW5rLmRlc2lyZWRTaXplID0gZGF0YS5kZXNpcmVkU2l6ZTtcbiAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKHN0cmVhbVNpbmsub25QdWxsPy4oKSk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLFxuICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkVOUVVFVUU6XG4gICAgICAgIGFzc2VydChzdHJlYW1Db250cm9sbGVyLCBcImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG4gICAgICAgIGlmIChzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jb250cm9sbGVyLmVucXVldWUoZGF0YS5jaHVuayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkNMT1NFOlxuICAgICAgICBhc3NlcnQoc3RyZWFtQ29udHJvbGxlciwgXCJjbG9zZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiKTtcbiAgICAgICAgaWYgKHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5FUlJPUjpcbiAgICAgICAgYXNzZXJ0KHN0cmVhbUNvbnRyb2xsZXIsIFwiZXJyb3Igc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG4gICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5lcnJvcih3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG4gICAgICAgIHRoaXMuI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEU6XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNhbmNlbENhbGwucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5DQU5DRUw6XG4gICAgICAgIGlmICghc3RyZWFtU2luaykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShzdHJlYW1TaW5rLm9uQ2FuY2VsPy4od3JhcFJlYXNvbihkYXRhLnJlYXNvbikpKTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcbiAgICAgICAgc3RyZWFtU2luay5pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHN0cmVhbSBjYXNlXCIpO1xuICAgIH1cbiAgfVxuICBhc3luYyAjZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1Db250cm9sbGVyLCBzdHJlYW1JZCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbc3RyZWFtQ29udHJvbGxlci5zdGFydENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIucHVsbENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbD8ucHJvbWlzZV0pO1xuICAgIGRlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuY29tT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9tZXRhZGF0YS5qc1xuXG5jbGFzcyBNZXRhZGF0YSB7XG4gICNtZXRhZGF0YU1hcDtcbiAgI2RhdGE7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwYXJzZWREYXRhLFxuICAgIHJhd0RhdGFcbiAgfSkge1xuICAgIHRoaXMuI21ldGFkYXRhTWFwID0gcGFyc2VkRGF0YTtcbiAgICB0aGlzLiNkYXRhID0gcmF3RGF0YTtcbiAgfVxuICBnZXRSYXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RhdGE7XG4gIH1cbiAgZ2V0KG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy4jbWV0YWRhdGFNYXAuZ2V0KG5hbWUpID8/IG51bGw7XG4gIH1cbiAgZ2V0QWxsKCkge1xuICAgIHJldHVybiBvYmplY3RGcm9tTWFwKHRoaXMuI21ldGFkYXRhTWFwKTtcbiAgfVxuICBoYXMobmFtZSkge1xuICAgIHJldHVybiB0aGlzLiNtZXRhZGF0YU1hcC5oYXMobmFtZSk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvb3B0aW9uYWxfY29udGVudF9jb25maWcuanNcblxuXG5jb25zdCBJTlRFUk5BTCA9IFN5bWJvbChcIklOVEVSTkFMXCIpO1xuY2xhc3MgT3B0aW9uYWxDb250ZW50R3JvdXAge1xuICAjaXNEaXNwbGF5ID0gZmFsc2U7XG4gICNpc1ByaW50ID0gZmFsc2U7XG4gICN1c2VyU2V0ID0gZmFsc2U7XG4gICN2aXNpYmxlID0gdHJ1ZTtcbiAgY29uc3RydWN0b3IocmVuZGVyaW5nSW50ZW50LCB7XG4gICAgbmFtZSxcbiAgICBpbnRlbnQsXG4gICAgdXNhZ2VcbiAgfSkge1xuICAgIHRoaXMuI2lzRGlzcGxheSA9ICEhKHJlbmRlcmluZ0ludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSk7XG4gICAgdGhpcy4jaXNQcmludCA9ICEhKHJlbmRlcmluZ0ludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5pbnRlbnQgPSBpbnRlbnQ7XG4gICAgdGhpcy51c2FnZSA9IHVzYWdlO1xuICB9XG4gIGdldCB2aXNpYmxlKCkge1xuICAgIGlmICh0aGlzLiN1c2VyU2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy4jdmlzaWJsZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiN2aXNpYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHByaW50LFxuICAgICAgdmlld1xuICAgIH0gPSB0aGlzLnVzYWdlO1xuICAgIGlmICh0aGlzLiNpc0Rpc3BsYXkpIHtcbiAgICAgIHJldHVybiB2aWV3Py52aWV3U3RhdGUgIT09IFwiT0ZGXCI7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNpc1ByaW50KSB7XG4gICAgICByZXR1cm4gcHJpbnQ/LnByaW50U3RhdGUgIT09IFwiT0ZGXCI7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIF9zZXRWaXNpYmxlKGludGVybmFsLCB2aXNpYmxlLCB1c2VyU2V0ID0gZmFsc2UpIHtcbiAgICBpZiAoaW50ZXJuYWwgIT09IElOVEVSTkFMKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkludGVybmFsIG1ldGhvZCBgX3NldFZpc2libGVgIGNhbGxlZC5cIik7XG4gICAgfVxuICAgIHRoaXMuI3VzZXJTZXQgPSB1c2VyU2V0O1xuICAgIHRoaXMuI3Zpc2libGUgPSB2aXNpYmxlO1xuICB9XG59XG5jbGFzcyBPcHRpb25hbENvbnRlbnRDb25maWcge1xuICAjY2FjaGVkR2V0SGFzaCA9IG51bGw7XG4gICNncm91cHMgPSBuZXcgTWFwKCk7XG4gICNpbml0aWFsSGFzaCA9IG51bGw7XG4gICNvcmRlciA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKGRhdGEsIHJlbmRlcmluZ0ludGVudCA9IFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSkge1xuICAgIHRoaXMucmVuZGVyaW5nSW50ZW50ID0gcmVuZGVyaW5nSW50ZW50O1xuICAgIHRoaXMubmFtZSA9IG51bGw7XG4gICAgdGhpcy5jcmVhdG9yID0gbnVsbDtcbiAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy5jcmVhdG9yID0gZGF0YS5jcmVhdG9yO1xuICAgIHRoaXMuI29yZGVyID0gZGF0YS5vcmRlcjtcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGRhdGEuZ3JvdXBzKSB7XG4gICAgICB0aGlzLiNncm91cHMuc2V0KGdyb3VwLmlkLCBuZXcgT3B0aW9uYWxDb250ZW50R3JvdXAocmVuZGVyaW5nSW50ZW50LCBncm91cCkpO1xuICAgIH1cbiAgICBpZiAoZGF0YS5iYXNlU3RhdGUgPT09IFwiT0ZGXCIpIHtcbiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy4jZ3JvdXBzLnZhbHVlcygpKSB7XG4gICAgICAgIGdyb3VwLl9zZXRWaXNpYmxlKElOVEVSTkFMLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb24gb2YgZGF0YS5vbikge1xuICAgICAgdGhpcy4jZ3JvdXBzLmdldChvbikuX3NldFZpc2libGUoSU5URVJOQUwsIHRydWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9mZiBvZiBkYXRhLm9mZikge1xuICAgICAgdGhpcy4jZ3JvdXBzLmdldChvZmYpLl9zZXRWaXNpYmxlKElOVEVSTkFMLCBmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuI2luaXRpYWxIYXNoID0gdGhpcy5nZXRIYXNoKCk7XG4gIH1cbiAgI2V2YWx1YXRlVmlzaWJpbGl0eUV4cHJlc3Npb24oYXJyYXkpIHtcbiAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBvcGVyYXRvciA9IGFycmF5WzBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpXTtcbiAgICAgIGxldCBzdGF0ZTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgICAgIHN0YXRlID0gdGhpcy4jZXZhbHVhdGVWaXNpYmlsaXR5RXhwcmVzc2lvbihlbGVtZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy4jZ3JvdXBzLmhhcyhlbGVtZW50KSkge1xuICAgICAgICBzdGF0ZSA9IHRoaXMuI2dyb3Vwcy5nZXQoZWxlbWVudCkudmlzaWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2VsZW1lbnR9YCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICBjYXNlIFwiQW5kXCI6XG4gICAgICAgICAgaWYgKCFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk9yXCI6XG4gICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJOb3RcIjpcbiAgICAgICAgICByZXR1cm4gIXN0YXRlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3BlcmF0b3IgPT09IFwiQW5kXCI7XG4gIH1cbiAgaXNWaXNpYmxlKGdyb3VwKSB7XG4gICAgaWYgKHRoaXMuI2dyb3Vwcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFncm91cCkge1xuICAgICAgaW5mbyhcIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGRlZmluZWQuXCIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChncm91cC50eXBlID09PSBcIk9DR1wiKSB7XG4gICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoZ3JvdXAuaWQpKSB7XG4gICAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2dyb3VwLmlkfWApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLiNncm91cHMuZ2V0KGdyb3VwLmlkKS52aXNpYmxlO1xuICAgIH0gZWxzZSBpZiAoZ3JvdXAudHlwZSA9PT0gXCJPQ01EXCIpIHtcbiAgICAgIGlmIChncm91cC5leHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNldmFsdWF0ZVZpc2liaWxpdHlFeHByZXNzaW9uKGdyb3VwLmV4cHJlc3Npb24pO1xuICAgICAgfVxuICAgICAgaWYgKCFncm91cC5wb2xpY3kgfHwgZ3JvdXAucG9saWN5ID09PSBcIkFueU9uXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy4jZ3JvdXBzLmdldChpZCkudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSBcIkFsbE9uXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGdyb3VwLnBvbGljeSA9PT0gXCJBbnlPZmZcIikge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdyb3VwLmlkcykge1xuICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmdldChpZCkudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSBcIkFsbE9mZlwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuI2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB3YXJuKGBVbmtub3duIG9wdGlvbmFsIGNvbnRlbnQgcG9saWN5ICR7Z3JvdXAucG9saWN5fS5gKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB3YXJuKGBVbmtub3duIGdyb3VwIHR5cGUgJHtncm91cC50eXBlfS5gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBzZXRWaXNpYmlsaXR5KGlkLCB2aXNpYmxlID0gdHJ1ZSkge1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy4jZ3JvdXBzLmdldChpZCk7XG4gICAgaWYgKCFncm91cCkge1xuICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGdyb3VwLl9zZXRWaXNpYmxlKElOVEVSTkFMLCAhIXZpc2libGUsIHRydWUpO1xuICAgIHRoaXMuI2NhY2hlZEdldEhhc2ggPSBudWxsO1xuICB9XG4gIHNldE9DR1N0YXRlKHtcbiAgICBzdGF0ZSxcbiAgICBwcmVzZXJ2ZVJCXG4gIH0pIHtcbiAgICBsZXQgb3BlcmF0b3I7XG4gICAgZm9yIChjb25zdCBlbGVtIG9mIHN0YXRlKSB7XG4gICAgICBzd2l0Y2ggKGVsZW0pIHtcbiAgICAgICAgY2FzZSBcIk9OXCI6XG4gICAgICAgIGNhc2UgXCJPRkZcIjpcbiAgICAgICAgY2FzZSBcIlRvZ2dsZVwiOlxuICAgICAgICAgIG9wZXJhdG9yID0gZWxlbTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy4jZ3JvdXBzLmdldChlbGVtKTtcbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgXCJPTlwiOlxuICAgICAgICAgIGdyb3VwLl9zZXRWaXNpYmxlKElOVEVSTkFMLCB0cnVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk9GRlwiOlxuICAgICAgICAgIGdyb3VwLl9zZXRWaXNpYmxlKElOVEVSTkFMLCBmYWxzZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJUb2dnbGVcIjpcbiAgICAgICAgICBncm91cC5fc2V0VmlzaWJsZShJTlRFUk5BTCwgIWdyb3VwLnZpc2libGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNjYWNoZWRHZXRIYXNoID0gbnVsbDtcbiAgfVxuICBnZXQgaGFzSW5pdGlhbFZpc2liaWxpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2luaXRpYWxIYXNoID09PSBudWxsIHx8IHRoaXMuZ2V0SGFzaCgpID09PSB0aGlzLiNpbml0aWFsSGFzaDtcbiAgfVxuICBnZXRPcmRlcigpIHtcbiAgICBpZiAoIXRoaXMuI2dyb3Vwcy5zaXplKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuI29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy4jb3JkZXIuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi50aGlzLiNncm91cHMua2V5cygpXTtcbiAgfVxuICBnZXRHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2dyb3Vwcy5zaXplID4gMCA/IG9iamVjdEZyb21NYXAodGhpcy4jZ3JvdXBzKSA6IG51bGw7XG4gIH1cbiAgZ2V0R3JvdXAoaWQpIHtcbiAgICByZXR1cm4gdGhpcy4jZ3JvdXBzLmdldChpZCkgfHwgbnVsbDtcbiAgfVxuICBnZXRIYXNoKCkge1xuICAgIGlmICh0aGlzLiNjYWNoZWRHZXRIYXNoICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy4jY2FjaGVkR2V0SGFzaDtcbiAgICB9XG4gICAgY29uc3QgaGFzaCA9IG5ldyBNdXJtdXJIYXNoM182NCgpO1xuICAgIGZvciAoY29uc3QgW2lkLCBncm91cF0gb2YgdGhpcy4jZ3JvdXBzKSB7XG4gICAgICBoYXNoLnVwZGF0ZShgJHtpZH06JHtncm91cC52aXNpYmxlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jY2FjaGVkR2V0SGFzaCA9IGhhc2guaGV4ZGlnZXN0KCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvdHJhbnNwb3J0X3N0cmVhbS5qc1xuXG5cbmNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW0ge1xuICBjb25zdHJ1Y3RvcihwZGZEYXRhUmFuZ2VUcmFuc3BvcnQsIHtcbiAgICBkaXNhYmxlUmFuZ2UgPSBmYWxzZSxcbiAgICBkaXNhYmxlU3RyZWFtID0gZmFsc2VcbiAgfSkge1xuICAgIGFzc2VydChwZGZEYXRhUmFuZ2VUcmFuc3BvcnQsICdQREZEYXRhVHJhbnNwb3J0U3RyZWFtIC0gbWlzc2luZyByZXF1aXJlZCBcInBkZkRhdGFSYW5nZVRyYW5zcG9ydFwiIGFyZ3VtZW50LicpO1xuICAgIGNvbnN0IHtcbiAgICAgIGxlbmd0aCxcbiAgICAgIGluaXRpYWxEYXRhLFxuICAgICAgcHJvZ3Jlc3NpdmVEb25lLFxuICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWVcbiAgICB9ID0gcGRmRGF0YVJhbmdlVHJhbnNwb3J0O1xuICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IFtdO1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSA9IHByb2dyZXNzaXZlRG9uZTtcbiAgICB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lO1xuICAgIGlmIChpbml0aWFsRGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYnVmZmVyID0gaW5pdGlhbERhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGluaXRpYWxEYXRhLmJ5dGVMZW5ndGggPT09IGluaXRpYWxEYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoID8gaW5pdGlhbERhdGEuYnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoaW5pdGlhbERhdGEpLmJ1ZmZlcjtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGJ1ZmZlcik7XG4gICAgfVxuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydCA9IHBkZkRhdGFSYW5nZVRyYW5zcG9ydDtcbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFkaXNhYmxlU3RyZWFtO1xuICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhZGlzYWJsZVJhbmdlO1xuICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBsZW5ndGg7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVhZGVycyA9IFtdO1xuICAgIHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRSYW5nZUxpc3RlbmVyKChiZWdpbiwgY2h1bmspID0+IHtcbiAgICAgIHRoaXMuX29uUmVjZWl2ZURhdGEoe1xuICAgICAgICBiZWdpbixcbiAgICAgICAgY2h1bmtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc0xpc3RlbmVyKChsb2FkZWQsIHRvdGFsKSA9PiB7XG4gICAgICB0aGlzLl9vblByb2dyZXNzKHtcbiAgICAgICAgbG9hZGVkLFxuICAgICAgICB0b3RhbFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzaXZlUmVhZExpc3RlbmVyKGNodW5rID0+IHtcbiAgICAgIHRoaXMuX29uUmVjZWl2ZURhdGEoe1xuICAgICAgICBjaHVua1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKCgpID0+IHtcbiAgICAgIHRoaXMuX29uUHJvZ3Jlc3NpdmVEb25lKCk7XG4gICAgfSk7XG4gICAgcGRmRGF0YVJhbmdlVHJhbnNwb3J0LnRyYW5zcG9ydFJlYWR5KCk7XG4gIH1cbiAgX29uUmVjZWl2ZURhdGEoe1xuICAgIGJlZ2luLFxuICAgIGNodW5rXG4gIH0pIHtcbiAgICBjb25zdCBidWZmZXIgPSBjaHVuayBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgY2h1bmsuYnl0ZUxlbmd0aCA9PT0gY2h1bmsuYnVmZmVyLmJ5dGVMZW5ndGggPyBjaHVuay5idWZmZXIgOiBuZXcgVWludDhBcnJheShjaHVuaykuYnVmZmVyO1xuICAgIGlmIChiZWdpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHtcbiAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuX2VucXVldWUoYnVmZmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGJ1ZmZlcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5fcmFuZ2VSZWFkZXJzLnNvbWUoZnVuY3Rpb24gKHJhbmdlUmVhZGVyKSB7XG4gICAgICAgIGlmIChyYW5nZVJlYWRlci5fYmVnaW4gIT09IGJlZ2luKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJhbmdlUmVhZGVyLl9lbnF1ZXVlKGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQoZm91bmQsIFwiX29uUmVjZWl2ZURhdGEgLSBubyBgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyYCBpbnN0YW5jZSBmb3VuZC5cIik7XG4gICAgfVxuICB9XG4gIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uX2xvYWRlZCA/PyAwO1xuICB9XG4gIF9vblByb2dyZXNzKGV2dCkge1xuICAgIGlmIChldnQudG90YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcmFuZ2VSZWFkZXJzWzBdPy5vblByb2dyZXNzPy4oe1xuICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8ub25Qcm9ncmVzcz8uKHtcbiAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkLFxuICAgICAgICB0b3RhbDogZXZ0LnRvdGFsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgX29uUHJvZ3Jlc3NpdmVEb25lKCkge1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5wcm9ncmVzc2l2ZURvbmUoKTtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmUgPSB0cnVlO1xuICB9XG4gIF9yZW1vdmVSYW5nZVJlYWRlcihyZWFkZXIpIHtcbiAgICBjb25zdCBpID0gdGhpcy5fcmFuZ2VSZWFkZXJzLmluZGV4T2YocmVhZGVyKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLl9yYW5nZVJlYWRlcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxuICBnZXRGdWxsUmVhZGVyKCkge1xuICAgIGFzc2VydCghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGRGF0YVRyYW5zcG9ydFN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcbiAgICBjb25zdCBxdWV1ZWRDaHVua3MgPSB0aGlzLl9xdWV1ZWRDaHVua3M7XG4gICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gbnVsbDtcbiAgICByZXR1cm4gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIodGhpcywgcXVldWVkQ2h1bmtzLCB0aGlzLl9wcm9ncmVzc2l2ZURvbmUsIHRoaXMuX2NvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKTtcbiAgfVxuICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7XG4gICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIGJlZ2luLCBlbmQpO1xuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlKGJlZ2luLCBlbmQpO1xuICAgIHRoaXMuX3JhbmdlUmVhZGVycy5wdXNoKHJlYWRlcik7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfVxuICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG4gICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZWFkZXJzLnNsaWNlKDApKSB7XG4gICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hYm9ydCgpO1xuICB9XG59XG5jbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtLCBxdWV1ZWRDaHVua3MsIHByb2dyZXNzaXZlRG9uZSA9IGZhbHNlLCBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IG51bGwpIHtcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5fZG9uZSA9IHByb2dyZXNzaXZlRG9uZSB8fCBmYWxzZTtcbiAgICB0aGlzLl9maWxlbmFtZSA9IGlzUGRmRmlsZShjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSkgPyBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA6IG51bGw7XG4gICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gcXVldWVkQ2h1bmtzIHx8IFtdO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgZm9yIChjb25zdCBjaHVuayBvZiB0aGlzLl9xdWV1ZWRDaHVua3MpIHtcbiAgICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2hlYWRlcnNSZWFkeSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHN0cmVhbS5fZnVsbFJlcXVlc3RSZWFkZXIgPSB0aGlzO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cbiAgX2VucXVldWUoY2h1bmspIHtcbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICB9XG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTtcbiAgfVxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuICB9XG4gIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2NvbnRlbnRMZW5ndGg7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bmtzLnNoaWZ0KCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcbiAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICB9XG4gIHByb2dyZXNzaXZlRG9uZSgpIHtcbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgfVxufVxuY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtLCBiZWdpbiwgZW5kKSB7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuX2JlZ2luID0gYmVnaW47XG4gICAgdGhpcy5fZW5kID0gZW5kO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIF9lbnF1ZXVlKGNodW5rKSB7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBjaHVuaztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVxdWVzdHNDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTtcbiAgICAgIHJlcXVlc3RzQ2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIHRoaXMuX3N0cmVhbS5fcmVtb3ZlUmFuZ2VSZWFkZXIodGhpcyk7XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGlmICh0aGlzLl9xdWV1ZWRDaHVuaykge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVuaztcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpO1xuICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fc3RyZWFtLl9yZW1vdmVSYW5nZVJlYWRlcih0aGlzKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9jb250ZW50X2Rpc3Bvc2l0aW9uLmpzXG5cbmZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcihjb250ZW50RGlzcG9zaXRpb24pIHtcbiAgbGV0IG5lZWRzRW5jb2RpbmdGaXh1cCA9IHRydWU7XG4gIGxldCB0bXAgPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcXFxcKlwiLCBcImlcIikuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pO1xuICBpZiAodG1wKSB7XG4gICAgdG1wID0gdG1wWzFdO1xuICAgIGxldCBmaWxlbmFtZSA9IHJmYzI2MTZ1bnF1b3RlKHRtcCk7XG4gICAgZmlsZW5hbWUgPSB1bmVzY2FwZShmaWxlbmFtZSk7XG4gICAgZmlsZW5hbWUgPSByZmM1OTg3ZGVjb2RlKGZpbGVuYW1lKTtcbiAgICBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUoZmlsZW5hbWUpO1xuICAgIHJldHVybiBmaXh1cEVuY29kaW5nKGZpbGVuYW1lKTtcbiAgfVxuICB0bXAgPSByZmMyMjMxZ2V0cGFyYW0oY29udGVudERpc3Bvc2l0aW9uKTtcbiAgaWYgKHRtcCkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gcmZjMjA0N2RlY29kZSh0bXApO1xuICAgIHJldHVybiBmaXh1cEVuY29kaW5nKGZpbGVuYW1lKTtcbiAgfVxuICB0bXAgPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcIiwgXCJpXCIpLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTtcbiAgaWYgKHRtcCkge1xuICAgIHRtcCA9IHRtcFsxXTtcbiAgICBsZXQgZmlsZW5hbWUgPSByZmMyNjE2dW5xdW90ZSh0bXApO1xuICAgIGZpbGVuYW1lID0gcmZjMjA0N2RlY29kZShmaWxlbmFtZSk7XG4gICAgcmV0dXJuIGZpeHVwRW5jb2RpbmcoZmlsZW5hbWUpO1xuICB9XG4gIGZ1bmN0aW9uIHRvUGFyYW1SZWdFeHAoYXR0cmlidXRlUGF0dGVybiwgZmxhZ3MpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcIig/Ol58OylcXFxccypcIiArIGF0dHJpYnV0ZVBhdHRlcm4gKyBcIlxcXFxzKj1cXFxccypcIiArIFwiKFwiICsgJ1teXCI7XFxcXHNdW147XFxcXHNdKicgKyBcInxcIiArICdcIig/OlteXCJcXFxcXFxcXF18XFxcXFxcXFxcIj8pK1wiPycgKyBcIilcIiwgZmxhZ3MpO1xuICB9XG4gIGZ1bmN0aW9uIHRleHRkZWNvZGUoZW5jb2RpbmcsIHZhbHVlKSB7XG4gICAgaWYgKGVuY29kaW5nKSB7XG4gICAgICBpZiAoIS9eW1xceDAwLVxceEZGXSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nLCB7XG4gICAgICAgICAgZmF0YWw6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgICAgICB2YWx1ZSA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlcik7XG4gICAgICAgIG5lZWRzRW5jb2RpbmdGaXh1cCA9IGZhbHNlO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgZnVuY3Rpb24gZml4dXBFbmNvZGluZyh2YWx1ZSkge1xuICAgIGlmIChuZWVkc0VuY29kaW5nRml4dXAgJiYgL1tcXHg4MC1cXHhmZl0vLnRlc3QodmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IHRleHRkZWNvZGUoXCJ1dGYtOFwiLCB2YWx1ZSk7XG4gICAgICBpZiAobmVlZHNFbmNvZGluZ0ZpeHVwKSB7XG4gICAgICAgIHZhbHVlID0gdGV4dGRlY29kZShcImlzby04ODU5LTFcIiwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgZnVuY3Rpb24gcmZjMjIzMWdldHBhcmFtKGNvbnRlbnREaXNwb3NpdGlvblN0cikge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICBsZXQgbWF0Y2g7XG4gICAgY29uc3QgaXRlciA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVxcXFwqKCg/ITBcXFxcZClcXFxcZCspKFxcXFwqPylcIiwgXCJpZ1wiKTtcbiAgICB3aGlsZSAoKG1hdGNoID0gaXRlci5leGVjKGNvbnRlbnREaXNwb3NpdGlvblN0cikpICE9PSBudWxsKSB7XG4gICAgICBsZXQgWywgbiwgcXVvdCwgcGFydF0gPSBtYXRjaDtcbiAgICAgIG4gPSBwYXJzZUludChuLCAxMCk7XG4gICAgICBpZiAobiBpbiBtYXRjaGVzKSB7XG4gICAgICAgIGlmIChuID09PSAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBtYXRjaGVzW25dID0gW3F1b3QsIHBhcnRdO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbWF0Y2hlcy5sZW5ndGg7ICsrbikge1xuICAgICAgaWYgKCEobiBpbiBtYXRjaGVzKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGxldCBbcXVvdCwgcGFydF0gPSBtYXRjaGVzW25dO1xuICAgICAgcGFydCA9IHJmYzI2MTZ1bnF1b3RlKHBhcnQpO1xuICAgICAgaWYgKHF1b3QpIHtcbiAgICAgICAgcGFydCA9IHVuZXNjYXBlKHBhcnQpO1xuICAgICAgICBpZiAobiA9PT0gMCkge1xuICAgICAgICAgIHBhcnQgPSByZmM1OTg3ZGVjb2RlKHBhcnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwYXJ0cy5wdXNoKHBhcnQpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbihcIlwiKTtcbiAgfVxuICBmdW5jdGlvbiByZmMyNjE2dW5xdW90ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNsaWNlKDEpLnNwbGl0KCdcXFxcXCInKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgcXVvdGluZGV4ID0gcGFydHNbaV0uaW5kZXhPZignXCInKTtcbiAgICAgICAgaWYgKHF1b3RpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBwYXJ0c1tpXSA9IHBhcnRzW2ldLnNsaWNlKDAsIHF1b3RpbmRleCk7XG4gICAgICAgICAgcGFydHMubGVuZ3RoID0gaSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5yZXBsYWNlQWxsKC9cXFxcKC4pL2csIFwiJDFcIik7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHBhcnRzLmpvaW4oJ1wiJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiByZmM1OTg3ZGVjb2RlKGV4dHZhbHVlKSB7XG4gICAgY29uc3QgZW5jb2RpbmdlbmQgPSBleHR2YWx1ZS5pbmRleE9mKFwiJ1wiKTtcbiAgICBpZiAoZW5jb2RpbmdlbmQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gZXh0dmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGVuY29kaW5nID0gZXh0dmFsdWUuc2xpY2UoMCwgZW5jb2RpbmdlbmQpO1xuICAgIGNvbnN0IGxhbmd2YWx1ZSA9IGV4dHZhbHVlLnNsaWNlKGVuY29kaW5nZW5kICsgMSk7XG4gICAgY29uc3QgdmFsdWUgPSBsYW5ndmFsdWUucmVwbGFjZSgvXlteJ10qJy8sIFwiXCIpO1xuICAgIHJldHVybiB0ZXh0ZGVjb2RlKGVuY29kaW5nLCB2YWx1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmZjMjA0N2RlY29kZSh2YWx1ZSkge1xuICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aChcIj0/XCIpIHx8IC9bXFx4MDAtXFx4MTlcXHg4MC1cXHhmZl0vLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC89XFw/KFtcXHctXSopXFw/KFtRcUJiXSlcXD8oKD86W14/XXxcXD8oPyE9KSkqKVxcPz0vZywgZnVuY3Rpb24gKG1hdGNoZXMsIGNoYXJzZXQsIGVuY29kaW5nLCB0ZXh0KSB7XG4gICAgICBpZiAoZW5jb2RpbmcgPT09IFwicVwiIHx8IGVuY29kaW5nID09PSBcIlFcIikge1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKFwiX1wiLCBcIiBcIik7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2VBbGwoLz0oWzAtOWEtZkEtRl17Mn0pL2csIGZ1bmN0aW9uIChtYXRjaCwgaGV4KSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4LCAxNikpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRleHRkZWNvZGUoY2hhcnNldCwgdGV4dCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICB0ZXh0ID0gYXRvYih0ZXh0KTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICAgIHJldHVybiB0ZXh0ZGVjb2RlKGNoYXJzZXQsIHRleHQpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBcIlwiO1xufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9uZXR3b3JrX3V0aWxzLmpzXG5cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyh7XG4gIGdldFJlc3BvbnNlSGVhZGVyLFxuICBpc0h0dHAsXG4gIHJhbmdlQ2h1bmtTaXplLFxuICBkaXNhYmxlUmFuZ2Vcbn0pIHtcbiAgY29uc3QgcmV0dXJuVmFsdWVzID0ge1xuICAgIGFsbG93UmFuZ2VSZXF1ZXN0czogZmFsc2UsXG4gICAgc3VnZ2VzdGVkTGVuZ3RoOiB1bmRlZmluZWRcbiAgfTtcbiAgY29uc3QgbGVuZ3RoID0gcGFyc2VJbnQoZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiKSwgMTApO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIobGVuZ3RoKSkge1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH1cbiAgcmV0dXJuVmFsdWVzLnN1Z2dlc3RlZExlbmd0aCA9IGxlbmd0aDtcbiAgaWYgKGxlbmd0aCA8PSAyICogcmFuZ2VDaHVua1NpemUpIHtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuICB9XG4gIGlmIChkaXNhYmxlUmFuZ2UgfHwgIWlzSHR0cCkge1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH1cbiAgaWYgKGdldFJlc3BvbnNlSGVhZGVyKFwiQWNjZXB0LVJhbmdlc1wiKSAhPT0gXCJieXRlc1wiKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuICBjb25zdCBjb250ZW50RW5jb2RpbmcgPSBnZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtRW5jb2RpbmdcIikgfHwgXCJpZGVudGl0eVwiO1xuICBpZiAoY29udGVudEVuY29kaW5nICE9PSBcImlkZW50aXR5XCIpIHtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuICB9XG4gIHJldHVyblZhbHVlcy5hbGxvd1JhbmdlUmVxdWVzdHMgPSB0cnVlO1xuICByZXR1cm4gcmV0dXJuVmFsdWVzO1xufVxuZnVuY3Rpb24gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcihnZXRSZXNwb25zZUhlYWRlcikge1xuICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSBnZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtRGlzcG9zaXRpb25cIik7XG4gIGlmIChjb250ZW50RGlzcG9zaXRpb24pIHtcbiAgICBsZXQgZmlsZW5hbWUgPSBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIoY29udGVudERpc3Bvc2l0aW9uKTtcbiAgICBpZiAoZmlsZW5hbWUuaW5jbHVkZXMoXCIlXCIpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmaWxlbmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICAgIGlmIChpc1BkZkZpbGUoZmlsZW5hbWUpKSB7XG4gICAgICByZXR1cm4gZmlsZW5hbWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcihzdGF0dXMsIHVybCkge1xuICBpZiAoc3RhdHVzID09PSA0MDQgfHwgc3RhdHVzID09PSAwICYmIHVybC5zdGFydHNXaXRoKFwiZmlsZTpcIikpIHtcbiAgICByZXR1cm4gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24oJ01pc3NpbmcgUERGIFwiJyArIHVybCArICdcIi4nKTtcbiAgfVxuICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihgVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UgKCR7c3RhdHVzfSkgd2hpbGUgcmV0cmlldmluZyBQREYgXCIke3VybH1cIi5gLCBzdGF0dXMpO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVSZXNwb25zZVN0YXR1cyhzdGF0dXMpIHtcbiAgcmV0dXJuIHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2O1xufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9mZXRjaF9zdHJlYW0uanNcblxuXG5mdW5jdGlvbiBjcmVhdGVGZXRjaE9wdGlvbnMoaGVhZGVycywgd2l0aENyZWRlbnRpYWxzLCBhYm9ydENvbnRyb2xsZXIpIHtcbiAgcmV0dXJuIHtcbiAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgaGVhZGVycyxcbiAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgbW9kZTogXCJjb3JzXCIsXG4gICAgY3JlZGVudGlhbHM6IHdpdGhDcmVkZW50aWFscyA/IFwiaW5jbHVkZVwiIDogXCJzYW1lLW9yaWdpblwiLFxuICAgIHJlZGlyZWN0OiBcImZvbGxvd1wiXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVIZWFkZXJzKGh0dHBIZWFkZXJzKSB7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGh0dHBIZWFkZXJzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodHRwSGVhZGVyc1twcm9wZXJ0eV07XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBoZWFkZXJzLmFwcGVuZChwcm9wZXJ0eSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBoZWFkZXJzO1xufVxuZnVuY3Rpb24gZ2V0QXJyYXlCdWZmZXIodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgcmV0dXJuIHZhbC5idWZmZXI7XG4gIH1cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICB3YXJuKGBnZXRBcnJheUJ1ZmZlciAtIHVuZXhwZWN0ZWQgZGF0YSBmb3JtYXQ6ICR7dmFsfWApO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsKS5idWZmZXI7XG59XG5jbGFzcyBQREZGZXRjaFN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdChzb3VyY2UudXJsKTtcbiAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgc291cmNlLmh0dHBIZWFkZXJzIHx8IHt9O1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107XG4gIH1cbiAgZ2V0IF9wcm9ncmVzc2l2ZURhdGFMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5fbG9hZGVkID8/IDA7XG4gIH1cbiAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICBhc3NlcnQoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERkZldGNoU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERkZldGNoU3RyZWFtUmVhZGVyKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjtcbiAgfVxuICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7XG4gICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmVhZGVyKTtcbiAgICByZXR1cm4gcmVhZGVyO1xuICB9XG4gIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5jYW5jZWwocmVhc29uKTtcbiAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSB7XG4gICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICB9XG59XG5jbGFzcyBQREZGZXRjaFN0cmVhbVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG4gICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gc291cmNlLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHNvdXJjZS5kaXNhYmxlUmFuZ2UgfHwgZmFsc2U7XG4gICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG4gICAgaWYgKCF0aGlzLl9yYW5nZUNodW5rU2l6ZSAmJiAhdGhpcy5fZGlzYWJsZVJhbmdlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG4gICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVJhbmdlO1xuICAgIHRoaXMuX2hlYWRlcnMgPSBjcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7XG4gICAgY29uc3QgdXJsID0gc291cmNlLnVybDtcbiAgICBmZXRjaCh1cmwsIGNyZWF0ZUZldGNoT3B0aW9ucyh0aGlzLl9oZWFkZXJzLCB0aGlzLl93aXRoQ3JlZGVudGlhbHMsIHRoaXMuX2Fib3J0Q29udHJvbGxlcikpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKCF2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgdGhyb3cgY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcihyZXNwb25zZS5zdGF0dXMsIHVybCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KG5hbWUpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHMsXG4gICAgICAgIHN1Z2dlc3RlZExlbmd0aFxuICAgICAgfSA9IHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHtcbiAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIsXG4gICAgICAgIGlzSHR0cDogdGhpcy5fc3RyZWFtLmlzSHR0cCxcbiAgICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuICAgICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gYWxsb3dSYW5nZVJlcXVlc3RzO1xuICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICAgICAgdGhpcy5fZmlsZW5hbWUgPSBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKGdldFJlc3BvbnNlSGVhZGVyKTtcbiAgICAgIGlmICghdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCkge1xuICAgICAgICB0aGlzLmNhbmNlbChuZXcgQWJvcnRFeGNlcHRpb24oXCJTdHJlYW1pbmcgaXMgZGlzYWJsZWQuXCIpKTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCh0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QpO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cbiAgZ2V0IGhlYWRlcnNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuICB9XG4gIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICB9XG4gIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkO1xuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBhd2FpdCB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIGNvbnN0IHtcbiAgICAgIHZhbHVlLFxuICAgICAgZG9uZVxuICAgIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZG9uZVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgdGhpcy5vblByb2dyZXNzPy4oe1xuICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQsXG4gICAgICB0b3RhbDogdGhpcy5fY29udGVudExlbmd0aFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogZ2V0QXJyYXlCdWZmZXIodmFsdWUpLFxuICAgICAgZG9uZTogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9yZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICB9XG59XG5jbGFzcyBQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtLCBiZWdpbiwgZW5kKSB7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcbiAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGhpcy5faGVhZGVycyA9IGNyZWF0ZUhlYWRlcnModGhpcy5fc3RyZWFtLmh0dHBIZWFkZXJzKTtcbiAgICB0aGlzLl9oZWFkZXJzLmFwcGVuZChcIlJhbmdlXCIsIGBieXRlcz0ke2JlZ2lufS0ke2VuZCAtIDF9YCk7XG4gICAgY29uc3QgdXJsID0gc291cmNlLnVybDtcbiAgICBmZXRjaCh1cmwsIGNyZWF0ZUZldGNoT3B0aW9ucyh0aGlzLl9oZWFkZXJzLCB0aGlzLl93aXRoQ3JlZGVudGlhbHMsIHRoaXMuX2Fib3J0Q29udHJvbGxlcikpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKCF2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgdGhyb3cgY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcihyZXNwb25zZS5zdGF0dXMsIHVybCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICB0aGlzLl9yZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuICAgIH0pLmNhdGNoKHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICBjb25zdCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGRvbmVcbiAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGRvbmVcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcbiAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBnZXRBcnJheUJ1ZmZlcih2YWx1ZSksXG4gICAgICBkb25lOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX3JlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG4gICAgdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvbmV0d29yay5qc1xuXG5cbmNvbnN0IE9LX1JFU1BPTlNFID0gMjAwO1xuY29uc3QgUEFSVElBTF9DT05URU5UX1JFU1BPTlNFID0gMjA2O1xuZnVuY3Rpb24gbmV0d29ya19nZXRBcnJheUJ1ZmZlcih4aHIpIHtcbiAgY29uc3QgZGF0YSA9IHhoci5yZXNwb25zZTtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ1RvQnl0ZXMoZGF0YSkuYnVmZmVyO1xufVxuY2xhc3MgTmV0d29ya01hbmFnZXIge1xuICBjb25zdHJ1Y3Rvcih1cmwsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdCh1cmwpO1xuICAgIHRoaXMuaHR0cEhlYWRlcnMgPSB0aGlzLmlzSHR0cCAmJiBhcmdzLmh0dHBIZWFkZXJzIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy53aXRoQ3JlZGVudGlhbHMgPSBhcmdzLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcbiAgICB0aGlzLmN1cnJYaHJJZCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kLCBsaXN0ZW5lcnMpIHtcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgYmVnaW4sXG4gICAgICBlbmRcbiAgICB9O1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBsaXN0ZW5lcnMpIHtcbiAgICAgIGFyZ3NbcHJvcF0gPSBsaXN0ZW5lcnNbcHJvcF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoYXJncyk7XG4gIH1cbiAgcmVxdWVzdEZ1bGwobGlzdGVuZXJzKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChsaXN0ZW5lcnMpO1xuICB9XG4gIHJlcXVlc3QoYXJncykge1xuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGNvbnN0IHhocklkID0gdGhpcy5jdXJyWGhySWQrKztcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXSA9IHtcbiAgICAgIHhoclxuICAgIH07XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgdGhpcy51cmwpO1xuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLndpdGhDcmVkZW50aWFscztcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuaHR0cEhlYWRlcnMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5odHRwSGVhZGVyc1twcm9wZXJ0eV07XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSHR0cCAmJiBcImJlZ2luXCIgaW4gYXJncyAmJiBcImVuZFwiIGluIGFyZ3MpIHtcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiUmFuZ2VcIiwgYGJ5dGVzPSR7YXJncy5iZWdpbn0tJHthcmdzLmVuZCAtIDF9YCk7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPSBPS19SRVNQT05TRTtcbiAgICB9XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcbiAgICBpZiAoYXJncy5vbkVycm9yKSB7XG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgYXJncy5vbkVycm9yKHhoci5zdGF0dXMpO1xuICAgICAgfTtcbiAgICB9XG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMsIHhocklkKTtcbiAgICB4aHIub25wcm9ncmVzcyA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMsIHhocklkKTtcbiAgICBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCA9IGFyZ3Mub25IZWFkZXJzUmVjZWl2ZWQ7XG4gICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lID0gYXJncy5vbkRvbmU7XG4gICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvciA9IGFyZ3Mub25FcnJvcjtcbiAgICBwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzID0gYXJncy5vblByb2dyZXNzO1xuICAgIHhoci5zZW5kKG51bGwpO1xuICAgIHJldHVybiB4aHJJZDtcbiAgfVxuICBvblByb2dyZXNzKHhocklkLCBldnQpIHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTtcbiAgICBpZiAoIXBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBlbmRpbmdSZXF1ZXN0Lm9uUHJvZ3Jlc3M/LihldnQpO1xuICB9XG4gIG9uU3RhdGVDaGFuZ2UoeGhySWQsIGV2dCkge1xuICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuICAgIGlmICghcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeGhyID0gcGVuZGluZ1JlcXVlc3QueGhyO1xuICAgIGlmICh4aHIucmVhZHlTdGF0ZSA+PSAyICYmIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCgpO1xuICAgICAgZGVsZXRlIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkO1xuICAgIH1cbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCEoeGhySWQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG4gICAgaWYgKHhoci5zdGF0dXMgPT09IDAgJiYgdGhpcy5pc0h0dHApIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3I/Lih4aHIuc3RhdHVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeGhyU3RhdHVzID0geGhyLnN0YXR1cyB8fCBPS19SRVNQT05TRTtcbiAgICBjb25zdCBva19yZXNwb25zZV9vbl9yYW5nZV9yZXF1ZXN0ID0geGhyU3RhdHVzID09PSBPS19SRVNQT05TRSAmJiBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9PT0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFO1xuICAgIGlmICghb2tfcmVzcG9uc2Vfb25fcmFuZ2VfcmVxdWVzdCAmJiB4aHJTdGF0dXMgIT09IHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yPy4oeGhyLnN0YXR1cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNodW5rID0gbmV0d29ya19nZXRBcnJheUJ1ZmZlcih4aHIpO1xuICAgIGlmICh4aHJTdGF0dXMgPT09IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRSkge1xuICAgICAgY29uc3QgcmFuZ2VIZWFkZXIgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVJhbmdlXCIpO1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IC9ieXRlcyAoXFxkKyktKFxcZCspXFwvKFxcZCspLy5leGVjKHJhbmdlSGVhZGVyKTtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRG9uZSh7XG4gICAgICAgIGJlZ2luOiBwYXJzZUludChtYXRjaGVzWzFdLCAxMCksXG4gICAgICAgIGNodW5rXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGNodW5rKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUoe1xuICAgICAgICBiZWdpbjogMCxcbiAgICAgICAgY2h1bmtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yPy4oeGhyLnN0YXR1cyk7XG4gICAgfVxuICB9XG4gIGdldFJlcXVlc3RYaHIoeGhySWQpIHtcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdLnhocjtcbiAgfVxuICBpc1BlbmRpbmdSZXF1ZXN0KHhocklkKSB7XG4gICAgcmV0dXJuIHhocklkIGluIHRoaXMucGVuZGluZ1JlcXVlc3RzO1xuICB9XG4gIGFib3J0UmVxdWVzdCh4aHJJZCkge1xuICAgIGNvbnN0IHhociA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXS54aHI7XG4gICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTtcbiAgICB4aHIuYWJvcnQoKTtcbiAgfVxufVxuY2xhc3MgUERGTmV0d29ya1N0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgIHRoaXMuX3NvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLl9tYW5hZ2VyID0gbmV3IE5ldHdvcmtNYW5hZ2VyKHNvdXJjZS51cmwsIHtcbiAgICAgIGh0dHBIZWFkZXJzOiBzb3VyY2UuaHR0cEhlYWRlcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHNvdXJjZS53aXRoQ3JlZGVudGlhbHNcbiAgICB9KTtcbiAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdO1xuICB9XG4gIF9vblJhbmdlUmVxdWVzdFJlYWRlckNsb3NlZChyZWFkZXIpIHtcbiAgICBjb25zdCBpID0gdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5pbmRleE9mKHJlYWRlcik7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9XG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZOZXR3b3JrU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlcih0aGlzLl9tYW5hZ2VyLCB0aGlzLl9zb3VyY2UpO1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjtcbiAgfVxuICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlciwgYmVnaW4sIGVuZCk7XG4gICAgcmVhZGVyLm9uQ2xvc2VkID0gdGhpcy5fb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmVhZGVyKTtcbiAgICByZXR1cm4gcmVhZGVyO1xuICB9XG4gIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5jYW5jZWwocmVhc29uKTtcbiAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSB7XG4gICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICB9XG59XG5jbGFzcyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihtYW5hZ2VyLCBzb3VyY2UpIHtcbiAgICB0aGlzLl9tYW5hZ2VyID0gbWFuYWdlcjtcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgb25IZWFkZXJzUmVjZWl2ZWQ6IHRoaXMuX29uSGVhZGVyc1JlY2VpdmVkLmJpbmQodGhpcyksXG4gICAgICBvbkRvbmU6IHRoaXMuX29uRG9uZS5iaW5kKHRoaXMpLFxuICAgICAgb25FcnJvcjogdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpLFxuICAgICAgb25Qcm9ncmVzczogdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpXG4gICAgfTtcbiAgICB0aGlzLl91cmwgPSBzb3VyY2UudXJsO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0SWQgPSBtYW5hZ2VyLnJlcXVlc3RGdWxsKGFyZ3MpO1xuICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY2FjaGVkQ2h1bmtzID0gW107XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cbiAgX29uSGVhZGVyc1JlY2VpdmVkKCkge1xuICAgIGNvbnN0IGZ1bGxSZXF1ZXN0WGhySWQgPSB0aGlzLl9mdWxsUmVxdWVzdElkO1xuICAgIGNvbnN0IGZ1bGxSZXF1ZXN0WGhyID0gdGhpcy5fbWFuYWdlci5nZXRSZXF1ZXN0WGhyKGZ1bGxSZXF1ZXN0WGhySWQpO1xuICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gbmFtZSA9PiBmdWxsUmVxdWVzdFhoci5nZXRSZXNwb25zZUhlYWRlcihuYW1lKTtcbiAgICBjb25zdCB7XG4gICAgICBhbGxvd1JhbmdlUmVxdWVzdHMsXG4gICAgICBzdWdnZXN0ZWRMZW5ndGhcbiAgICB9ID0gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoe1xuICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIsXG4gICAgICBpc0h0dHA6IHRoaXMuX21hbmFnZXIuaXNIdHRwLFxuICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuICAgICAgZGlzYWJsZVJhbmdlOiB0aGlzLl9kaXNhYmxlUmFuZ2VcbiAgICB9KTtcbiAgICBpZiAoYWxsb3dSYW5nZVJlcXVlc3RzKSB7XG4gICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcihnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgaWYgKHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KGZ1bGxSZXF1ZXN0WGhySWQpO1xuICAgIH1cbiAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfVxuICBfb25Eb25lKGRhdGEpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgICB2YWx1ZTogZGF0YS5jaHVuayxcbiAgICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NhY2hlZENodW5rcy5wdXNoKGRhdGEuY2h1bmspO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fY2FjaGVkQ2h1bmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICB9XG4gIF9vbkVycm9yKHN0YXR1cykge1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcihzdGF0dXMsIHRoaXMuX3VybCk7XG4gICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZWplY3QodGhpcy5fc3RvcmVkRXJyb3IpO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fY2FjaGVkQ2h1bmtzLmxlbmd0aCA9IDA7XG4gIH1cbiAgX29uUHJvZ3Jlc3MoZXZ0KSB7XG4gICAgdGhpcy5vblByb2dyZXNzPy4oe1xuICAgICAgbG9hZGVkOiBldnQubG9hZGVkLFxuICAgICAgdG90YWw6IGV2dC5sZW5ndGhDb21wdXRhYmxlID8gZXZ0LnRvdGFsIDogdGhpcy5fY29udGVudExlbmd0aFxuICAgIH0pO1xuICB9XG4gIGdldCBmaWxlbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gIH1cbiAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDtcbiAgfVxuICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2FjaGVkQ2h1bmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fY2FjaGVkQ2h1bmtzLnNoaWZ0KCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcbiAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgaWYgKHRoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKSkge1xuICAgICAgdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QodGhpcy5fZnVsbFJlcXVlc3RJZCk7XG4gICAgfVxuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgfVxufVxuY2xhc3MgUERGTmV0d29ya1N0cmVhbVJhbmdlUmVxdWVzdFJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKG1hbmFnZXIsIGJlZ2luLCBlbmQpIHtcbiAgICB0aGlzLl9tYW5hZ2VyID0gbWFuYWdlcjtcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgb25Eb25lOiB0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxcbiAgICAgIG9uRXJyb3I6IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIG9uUHJvZ3Jlc3M6IHRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKVxuICAgIH07XG4gICAgdGhpcy5fdXJsID0gbWFuYWdlci51cmw7XG4gICAgdGhpcy5fcmVxdWVzdElkID0gbWFuYWdlci5yZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCwgYXJncyk7XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gICAgdGhpcy5vbkNsb3NlZCA9IG51bGw7XG4gIH1cbiAgX2Nsb3NlKCkge1xuICAgIHRoaXMub25DbG9zZWQ/Lih0aGlzKTtcbiAgfVxuICBfb25Eb25lKGRhdGEpIHtcbiAgICBjb25zdCBjaHVuayA9IGRhdGEuY2h1bms7XG4gICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBjaHVuaztcbiAgICB9XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX2Nsb3NlKCk7XG4gIH1cbiAgX29uRXJyb3Ioc3RhdHVzKSB7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKHN0YXR1cywgdGhpcy5fdXJsKTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZWplY3QodGhpcy5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgfVxuICBfb25Qcm9ncmVzcyhldnQpIHtcbiAgICBpZiAoIXRoaXMuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHtcbiAgICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcbiAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgfVxuICAgIGlmICh0aGlzLl9xdWV1ZWRDaHVuayAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVuaztcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpO1xuICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgaWYgKHRoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9yZXF1ZXN0SWQpKSB7XG4gICAgICB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9yZXF1ZXN0SWQpO1xuICAgIH1cbiAgICB0aGlzLl9jbG9zZSgpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L25vZGVfc3RyZWFtLmpzXG5cblxuXG5jb25zdCBmaWxlVXJpUmVnZXggPSAvXmZpbGU6XFwvXFwvXFwvW2EtekEtWl06XFwvLztcbmZ1bmN0aW9uIHBhcnNlVXJsKHNvdXJjZVVybCkge1xuICBjb25zdCB1cmwgPSBOb2RlUGFja2FnZXMuZ2V0KFwidXJsXCIpO1xuICBjb25zdCBwYXJzZWRVcmwgPSB1cmwucGFyc2Uoc291cmNlVXJsKTtcbiAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gXCJmaWxlOlwiIHx8IHBhcnNlZFVybC5ob3N0KSB7XG4gICAgcmV0dXJuIHBhcnNlZFVybDtcbiAgfVxuICBpZiAoL15bYS16XTpbL1xcXFxdL2kudGVzdChzb3VyY2VVcmwpKSB7XG4gICAgcmV0dXJuIHVybC5wYXJzZShgZmlsZTovLy8ke3NvdXJjZVVybH1gKTtcbiAgfVxuICBpZiAoIXBhcnNlZFVybC5ob3N0KSB7XG4gICAgcGFyc2VkVXJsLnByb3RvY29sID0gXCJmaWxlOlwiO1xuICB9XG4gIHJldHVybiBwYXJzZWRVcmw7XG59XG5jbGFzcyBQREZOb2RlU3RyZWFtIHtcbiAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy51cmwgPSBwYXJzZVVybChzb3VyY2UudXJsKTtcbiAgICB0aGlzLmlzSHR0cCA9IHRoaXMudXJsLnByb3RvY29sID09PSBcImh0dHA6XCIgfHwgdGhpcy51cmwucHJvdG9jb2wgPT09IFwiaHR0cHM6XCI7XG4gICAgdGhpcy5pc0ZzVXJsID0gdGhpcy51cmwucHJvdG9jb2wgPT09IFwiZmlsZTpcIjtcbiAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgc291cmNlLmh0dHBIZWFkZXJzIHx8IHt9O1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107XG4gIH1cbiAgZ2V0IF9wcm9ncmVzc2l2ZURhdGFMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5fbG9hZGVkID8/IDA7XG4gIH1cbiAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICBhc3NlcnQoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERk5vZGVTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSB0aGlzLmlzRnNVcmwgPyBuZXcgUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlcih0aGlzKSA6IG5ldyBQREZOb2RlU3RyZWFtRnVsbFJlYWRlcih0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG4gIH1cbiAgZ2V0UmFuZ2VSZWFkZXIoc3RhcnQsIGVuZCkge1xuICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2VSZWFkZXIgPSB0aGlzLmlzRnNVcmwgPyBuZXcgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIodGhpcywgc3RhcnQsIGVuZCkgOiBuZXcgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIHN0YXJ0LCBlbmQpO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyYW5nZVJlYWRlcik7XG4gICAgcmV0dXJuIHJhbmdlUmVhZGVyO1xuICB9XG4gIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5jYW5jZWwocmVhc29uKTtcbiAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSB7XG4gICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgfVxuICB9XG59XG5jbGFzcyBCYXNlRnVsbFJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHRoaXMuX3VybCA9IHN0cmVhbS51cmw7XG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gbnVsbDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG4gICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTtcbiAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTtcbiAgICBpZiAoIXRoaXMuX3JhbmdlQ2h1bmtTaXplICYmICF0aGlzLl9kaXNhYmxlUmFuZ2UpIHtcbiAgICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtO1xuICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVSYW5nZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICB9XG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgZ2V0IGZpbGVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgfVxuICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDtcbiAgfVxuICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtcbiAgICB9XG4gICAgY29uc3QgY2h1bmsgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG4gICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZCgpO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsubGVuZ3RoO1xuICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcbiAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkLFxuICAgICAgdG90YWw6IHRoaXMuX2NvbnRlbnRMZW5ndGhcbiAgICB9KTtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShjaHVuaykuYnVmZmVyO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogYnVmZmVyLFxuICAgICAgZG9uZTogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RyZWFtKSB7XG4gICAgICB0aGlzLl9lcnJvcihyZWFzb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHJlYXNvbik7XG4gIH1cbiAgX2Vycm9yKHJlYXNvbikge1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uO1xuICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfVxuICBfc2V0UmVhZGFibGVTdHJlYW0ocmVhZGFibGVTdHJlYW0pIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtO1xuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwicmVhZGFibGVcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgIHJlYWRhYmxlU3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZXJyb3JcIiwgcmVhc29uID0+IHtcbiAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG4gICAgfSk7XG4gICAgaWYgKCF0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCAmJiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICB0aGlzLl9lcnJvcihuZXcgQWJvcnRFeGNlcHRpb24oXCJzdHJlYW1pbmcgaXMgZGlzYWJsZWRcIikpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kodGhpcy5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgQmFzZVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtO1xuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgIH1cbiAgICBjb25zdCBjaHVuayA9IHRoaXMuX3JlYWRhYmxlU3RyZWFtLnJlYWQoKTtcbiAgICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKCk7XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5sZW5ndGg7XG4gICAgdGhpcy5vblByb2dyZXNzPy4oe1xuICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWRcbiAgICB9KTtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShjaHVuaykuYnVmZmVyO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogYnVmZmVyLFxuICAgICAgZG9uZTogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RyZWFtKSB7XG4gICAgICB0aGlzLl9lcnJvcihyZWFzb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHJlYXNvbik7XG4gIH1cbiAgX2Vycm9yKHJlYXNvbikge1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uO1xuICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfVxuICBfc2V0UmVhZGFibGVTdHJlYW0ocmVhZGFibGVTdHJlYW0pIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtO1xuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwicmVhZGFibGVcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgIHJlYWRhYmxlU3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZXJyb3JcIiwgcmVhc29uID0+IHtcbiAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHRoaXMuX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RPcHRpb25zKHBhcnNlZFVybCwgaGVhZGVycykge1xuICByZXR1cm4ge1xuICAgIHByb3RvY29sOiBwYXJzZWRVcmwucHJvdG9jb2wsXG4gICAgYXV0aDogcGFyc2VkVXJsLmF1dGgsXG4gICAgaG9zdDogcGFyc2VkVXJsLmhvc3RuYW1lLFxuICAgIHBvcnQ6IHBhcnNlZFVybC5wb3J0LFxuICAgIHBhdGg6IHBhcnNlZFVybC5wYXRoLFxuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICBoZWFkZXJzXG4gIH07XG59XG5jbGFzcyBQREZOb2RlU3RyZWFtRnVsbFJlYWRlciBleHRlbmRzIEJhc2VGdWxsUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgc3VwZXIoc3RyZWFtKTtcbiAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9IHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgXCIke3RoaXMuX3VybH1cIi5gKTtcbiAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0ocmVzcG9uc2UpO1xuICAgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IHRoaXMuX3JlYWRhYmxlU3RyZWFtLmhlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLFxuICAgICAgICBzdWdnZXN0ZWRMZW5ndGhcbiAgICAgIH0gPSB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyh7XG4gICAgICAgIGdldFJlc3BvbnNlSGVhZGVyLFxuICAgICAgICBpc0h0dHA6IHN0cmVhbS5pc0h0dHAsXG4gICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcbiAgICAgICAgZGlzYWJsZVJhbmdlOiB0aGlzLl9kaXNhYmxlUmFuZ2VcbiAgICAgIH0pO1xuICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGFsbG93UmFuZ2VSZXF1ZXN0cztcbiAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzdWdnZXN0ZWRMZW5ndGggfHwgdGhpcy5fY29udGVudExlbmd0aDtcbiAgICAgIHRoaXMuX2ZpbGVuYW1lID0gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcihnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgfTtcbiAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAodGhpcy5fdXJsLnByb3RvY29sID09PSBcImh0dHA6XCIpIHtcbiAgICAgIGNvbnN0IGh0dHAgPSBOb2RlUGFja2FnZXMuZ2V0KFwiaHR0cFwiKTtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCBzdHJlYW0uaHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGh0dHBzID0gTm9kZVBhY2thZ2VzLmdldChcImh0dHBzXCIpO1xuICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHBzLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCBzdHJlYW0uaHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3Qub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcbiAgICB9KTtcbiAgICB0aGlzLl9yZXF1ZXN0LmVuZCgpO1xuICB9XG59XG5jbGFzcyBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0sIHN0YXJ0LCBlbmQpIHtcbiAgICBzdXBlcihzdHJlYW0pO1xuICAgIHRoaXMuX2h0dHBIZWFkZXJzID0ge307XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBzdHJlYW0uaHR0cEhlYWRlcnMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gc3RyZWFtLmh0dHBIZWFkZXJzW3Byb3BlcnR5XTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5faHR0cEhlYWRlcnNbcHJvcGVydHldID0gdmFsdWU7XG4gICAgfVxuICAgIHRoaXMuX2h0dHBIZWFkZXJzLlJhbmdlID0gYGJ5dGVzPSR7c3RhcnR9LSR7ZW5kIC0gMX1gO1xuICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gcmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKGBNaXNzaW5nIFBERiBcIiR7dGhpcy5fdXJsfVwiLmApO1xuICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShyZXNwb25zZSk7XG4gICAgfTtcbiAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAodGhpcy5fdXJsLnByb3RvY29sID09PSBcImh0dHA6XCIpIHtcbiAgICAgIGNvbnN0IGh0dHAgPSBOb2RlUGFja2FnZXMuZ2V0KFwiaHR0cFwiKTtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaHR0cHMgPSBOb2RlUGFja2FnZXMuZ2V0KFwiaHR0cHNcIik7XG4gICAgICB0aGlzLl9yZXF1ZXN0ID0gaHR0cHMucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHRoaXMuX2h0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0Lm9uKFwiZXJyb3JcIiwgcmVhc29uID0+IHtcbiAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uO1xuICAgIH0pO1xuICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7XG4gIH1cbn1cbmNsYXNzIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHN1cGVyKHN0cmVhbSk7XG4gICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO1xuICAgIGlmIChmaWxlVXJpUmVnZXgudGVzdCh0aGlzLl91cmwuaHJlZikpIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKTtcbiAgICB9XG4gICAgY29uc3QgZnMgPSBOb2RlUGFja2FnZXMuZ2V0KFwiZnNcIik7XG4gICAgZnMucHJvbWlzZXMubHN0YXQocGF0aCkudGhlbihzdGF0ID0+IHtcbiAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzdGF0LnNpemU7XG4gICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGgpKTtcbiAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9LCBlcnJvciA9PiB7XG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIikge1xuICAgICAgICBlcnJvciA9IG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKGBNaXNzaW5nIFBERiBcIiR7cGF0aH1cIi5gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7XG4gICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpO1xuICAgIH0pO1xuICB9XG59XG5jbGFzcyBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlciBleHRlbmRzIEJhc2VSYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgc3RhcnQsIGVuZCkge1xuICAgIHN1cGVyKHN0cmVhbSk7XG4gICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO1xuICAgIGlmIChmaWxlVXJpUmVnZXgudGVzdCh0aGlzLl91cmwuaHJlZikpIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKTtcbiAgICB9XG4gICAgY29uc3QgZnMgPSBOb2RlUGFja2FnZXMuZ2V0KFwiZnNcIik7XG4gICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0oZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLCB7XG4gICAgICBzdGFydCxcbiAgICAgIGVuZDogZW5kIC0gMVxuICAgIH0pKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS90ZXh0X2xheWVyLmpzXG5cblxuY29uc3QgTUFYX1RFWFRfRElWU19UT19SRU5ERVIgPSAxMDAwMDA7XG5jb25zdCBERUZBVUxUX0ZPTlRfU0laRSA9IDMwO1xuY29uc3QgREVGQVVMVF9GT05UX0FTQ0VOVCA9IDAuODtcbmNsYXNzIFRleHRMYXllciB7XG4gICNjYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICNjb250YWluZXIgPSBudWxsO1xuICAjZGlzYWJsZVByb2Nlc3NJdGVtcyA9IGZhbHNlO1xuICAjZm9udEluc3BlY3RvckVuYWJsZWQgPSAhIWdsb2JhbFRoaXMuRm9udEluc3BlY3Rvcj8uZW5hYmxlZDtcbiAgI2xhbmcgPSBudWxsO1xuICAjbGF5b3V0VGV4dFBhcmFtcyA9IG51bGw7XG4gICNwYWdlSGVpZ2h0ID0gMDtcbiAgI3BhZ2VXaWR0aCA9IDA7XG4gICNyZWFkZXIgPSBudWxsO1xuICAjcm9vdENvbnRhaW5lciA9IG51bGw7XG4gICNyb3RhdGlvbiA9IDA7XG4gICNzY2FsZSA9IDA7XG4gICNzdHlsZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgI3RleHRDb250ZW50SXRlbXNTdHIgPSBbXTtcbiAgI3RleHRDb250ZW50U291cmNlID0gbnVsbDtcbiAgI3RleHREaXZzID0gW107XG4gICN0ZXh0RGl2UHJvcGVydGllcyA9IG5ldyBXZWFrTWFwKCk7XG4gICN0cmFuc2Zvcm0gPSBudWxsO1xuICBzdGF0aWMgI2FzY2VudENhY2hlID0gbmV3IE1hcCgpO1xuICBzdGF0aWMgI2NhbnZhc0NvbnRleHRzID0gbmV3IE1hcCgpO1xuICBzdGF0aWMgI21pbkZvbnRTaXplID0gbnVsbDtcbiAgc3RhdGljICNwZW5kaW5nVGV4dExheWVycyA9IG5ldyBTZXQoKTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHRleHRDb250ZW50U291cmNlLFxuICAgIGNvbnRhaW5lcixcbiAgICB2aWV3cG9ydFxuICB9KSB7XG4gICAgaWYgKHRleHRDb250ZW50U291cmNlIGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0pIHtcbiAgICAgIHRoaXMuI3RleHRDb250ZW50U291cmNlID0gdGV4dENvbnRlbnRTb3VyY2U7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGV4dENvbnRlbnRTb3VyY2UgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuI3RleHRDb250ZW50U291cmNlID0gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh0ZXh0Q29udGVudFNvdXJjZSk7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBcInRleHRDb250ZW50U291cmNlXCIgcGFyYW1ldGVyIHNwZWNpZmllZC4nKTtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyID0gdGhpcy4jcm9vdENvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLiNzY2FsZSA9IHZpZXdwb3J0LnNjYWxlICogKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKTtcbiAgICB0aGlzLiNyb3RhdGlvbiA9IHZpZXdwb3J0LnJvdGF0aW9uO1xuICAgIHRoaXMuI2xheW91dFRleHRQYXJhbXMgPSB7XG4gICAgICBwcmV2Rm9udFNpemU6IG51bGwsXG4gICAgICBwcmV2Rm9udEZhbWlseTogbnVsbCxcbiAgICAgIGRpdjogbnVsbCxcbiAgICAgIHByb3BlcnRpZXM6IG51bGwsXG4gICAgICBjdHg6IG51bGxcbiAgICB9O1xuICAgIGNvbnN0IHtcbiAgICAgIHBhZ2VXaWR0aCxcbiAgICAgIHBhZ2VIZWlnaHQsXG4gICAgICBwYWdlWCxcbiAgICAgIHBhZ2VZXG4gICAgfSA9IHZpZXdwb3J0LnJhd0RpbXM7XG4gICAgdGhpcy4jdHJhbnNmb3JtID0gWzEsIDAsIDAsIC0xLCAtcGFnZVgsIHBhZ2VZICsgcGFnZUhlaWdodF07XG4gICAgdGhpcy4jcGFnZVdpZHRoID0gcGFnZVdpZHRoO1xuICAgIHRoaXMuI3BhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0O1xuICAgIFRleHRMYXllci4jZW5zdXJlTWluRm9udFNpemVDb21wdXRlZCgpO1xuICAgIHNldExheWVyRGltZW5zaW9ucyhjb250YWluZXIsIHZpZXdwb3J0KTtcbiAgICB0aGlzLiNjYXBhYmlsaXR5LnByb21pc2UuY2F0Y2goKCkgPT4ge30pLnRoZW4oKCkgPT4ge1xuICAgICAgVGV4dExheWVyLiNwZW5kaW5nVGV4dExheWVycy5kZWxldGUodGhpcyk7XG4gICAgICB0aGlzLiNsYXlvdXRUZXh0UGFyYW1zID0gbnVsbDtcbiAgICAgIHRoaXMuI3N0eWxlQ2FjaGUgPSBudWxsO1xuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBwdW1wID0gKCkgPT4ge1xuICAgICAgdGhpcy4jcmVhZGVyLnJlYWQoKS50aGVuKCh7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBkb25lXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgdGhpcy4jY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2xhbmcgPz89IHZhbHVlLmxhbmc7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy4jc3R5bGVDYWNoZSwgdmFsdWUuc3R5bGVzKTtcbiAgICAgICAgdGhpcy4jcHJvY2Vzc0l0ZW1zKHZhbHVlLml0ZW1zKTtcbiAgICAgICAgcHVtcCgpO1xuICAgICAgfSwgdGhpcy4jY2FwYWJpbGl0eS5yZWplY3QpO1xuICAgIH07XG4gICAgdGhpcy4jcmVhZGVyID0gdGhpcy4jdGV4dENvbnRlbnRTb3VyY2UuZ2V0UmVhZGVyKCk7XG4gICAgVGV4dExheWVyLiNwZW5kaW5nVGV4dExheWVycy5hZGQodGhpcyk7XG4gICAgcHVtcCgpO1xuICAgIHJldHVybiB0aGlzLiNjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgdXBkYXRlKHtcbiAgICB2aWV3cG9ydCxcbiAgICBvbkJlZm9yZSA9IG51bGxcbiAgfSkge1xuICAgIGNvbnN0IHNjYWxlID0gdmlld3BvcnQuc2NhbGUgKiAoZ2xvYmFsVGhpcy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpO1xuICAgIGNvbnN0IHJvdGF0aW9uID0gdmlld3BvcnQucm90YXRpb247XG4gICAgaWYgKHJvdGF0aW9uICE9PSB0aGlzLiNyb3RhdGlvbikge1xuICAgICAgb25CZWZvcmU/LigpO1xuICAgICAgdGhpcy4jcm90YXRpb24gPSByb3RhdGlvbjtcbiAgICAgIHNldExheWVyRGltZW5zaW9ucyh0aGlzLiNyb290Q29udGFpbmVyLCB7XG4gICAgICAgIHJvdGF0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNjYWxlICE9PSB0aGlzLiNzY2FsZSkge1xuICAgICAgb25CZWZvcmU/LigpO1xuICAgICAgdGhpcy4jc2NhbGUgPSBzY2FsZTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgcHJldkZvbnRTaXplOiBudWxsLFxuICAgICAgICBwcmV2Rm9udEZhbWlseTogbnVsbCxcbiAgICAgICAgZGl2OiBudWxsLFxuICAgICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgICBjdHg6IFRleHRMYXllci4jZ2V0Q3R4KHRoaXMuI2xhbmcpXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCBkaXYgb2YgdGhpcy4jdGV4dERpdnMpIHtcbiAgICAgICAgcGFyYW1zLnByb3BlcnRpZXMgPSB0aGlzLiN0ZXh0RGl2UHJvcGVydGllcy5nZXQoZGl2KTtcbiAgICAgICAgcGFyYW1zLmRpdiA9IGRpdjtcbiAgICAgICAgdGhpcy4jbGF5b3V0KHBhcmFtcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNhbmNlbCgpIHtcbiAgICBjb25zdCBhYm9ydEV4ID0gbmV3IEFib3J0RXhjZXB0aW9uKFwiVGV4dExheWVyIHRhc2sgY2FuY2VsbGVkLlwiKTtcbiAgICB0aGlzLiNyZWFkZXI/LmNhbmNlbChhYm9ydEV4KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgdGhpcy4jcmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLiNjYXBhYmlsaXR5LnJlamVjdChhYm9ydEV4KTtcbiAgfVxuICBnZXQgdGV4dERpdnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RleHREaXZzO1xuICB9XG4gIGdldCB0ZXh0Q29udGVudEl0ZW1zU3RyKCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0Q29udGVudEl0ZW1zU3RyO1xuICB9XG4gICNwcm9jZXNzSXRlbXMoaXRlbXMpIHtcbiAgICBpZiAodGhpcy4jZGlzYWJsZVByb2Nlc3NJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNsYXlvdXRUZXh0UGFyYW1zLmN0eCA/Pz0gVGV4dExheWVyLiNnZXRDdHgodGhpcy4jbGFuZyk7XG4gICAgY29uc3QgdGV4dERpdnMgPSB0aGlzLiN0ZXh0RGl2cyxcbiAgICAgIHRleHRDb250ZW50SXRlbXNTdHIgPSB0aGlzLiN0ZXh0Q29udGVudEl0ZW1zU3RyO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKHRleHREaXZzLmxlbmd0aCA+IE1BWF9URVhUX0RJVlNfVE9fUkVOREVSKSB7XG4gICAgICAgIHdhcm4oXCJJZ25vcmluZyBhZGRpdGlvbmFsIHRleHREaXZzIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlwiKTtcbiAgICAgICAgdGhpcy4jZGlzYWJsZVByb2Nlc3NJdGVtcyA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLnN0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT09IFwiYmVnaW5NYXJrZWRDb250ZW50UHJvcHNcIiB8fCBpdGVtLnR5cGUgPT09IFwiYmVnaW5NYXJrZWRDb250ZW50XCIpIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLiNjb250YWluZXI7XG4gICAgICAgICAgdGhpcy4jY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgdGhpcy4jY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXJrZWRDb250ZW50XCIpO1xuICAgICAgICAgIGlmIChpdGVtLmlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLiNjb250YWluZXIuc2V0QXR0cmlidXRlKFwiaWRcIiwgYCR7aXRlbS5pZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50LmFwcGVuZCh0aGlzLiNjb250YWluZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJlbmRNYXJrZWRDb250ZW50XCIpIHtcbiAgICAgICAgICB0aGlzLiNjb250YWluZXIgPSB0aGlzLiNjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRleHRDb250ZW50SXRlbXNTdHIucHVzaChpdGVtLnN0cik7XG4gICAgICB0aGlzLiNhcHBlbmRUZXh0KGl0ZW0pO1xuICAgIH1cbiAgfVxuICAjYXBwZW5kVGV4dChnZW9tKSB7XG4gICAgY29uc3QgdGV4dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIGNvbnN0IHRleHREaXZQcm9wZXJ0aWVzID0ge1xuICAgICAgYW5nbGU6IDAsXG4gICAgICBjYW52YXNXaWR0aDogMCxcbiAgICAgIGhhc1RleHQ6IGdlb20uc3RyICE9PSBcIlwiLFxuICAgICAgaGFzRU9MOiBnZW9tLmhhc0VPTCxcbiAgICAgIGZvbnRTaXplOiAwXG4gICAgfTtcbiAgICB0aGlzLiN0ZXh0RGl2cy5wdXNoKHRleHREaXYpO1xuICAgIGNvbnN0IHR4ID0gVXRpbC50cmFuc2Zvcm0odGhpcy4jdHJhbnNmb3JtLCBnZW9tLnRyYW5zZm9ybSk7XG4gICAgbGV0IGFuZ2xlID0gTWF0aC5hdGFuMih0eFsxXSwgdHhbMF0pO1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy4jc3R5bGVDYWNoZVtnZW9tLmZvbnROYW1lXTtcbiAgICBpZiAoc3R5bGUudmVydGljYWwpIHtcbiAgICAgIGFuZ2xlICs9IE1hdGguUEkgLyAyO1xuICAgIH1cbiAgICBjb25zdCBmb250RmFtaWx5ID0gdGhpcy4jZm9udEluc3BlY3RvckVuYWJsZWQgJiYgc3R5bGUuZm9udFN1YnN0aXR1dGlvbiB8fCBzdHlsZS5mb250RmFtaWx5O1xuICAgIGNvbnN0IGZvbnRIZWlnaHQgPSBNYXRoLmh5cG90KHR4WzJdLCB0eFszXSk7XG4gICAgY29uc3QgZm9udEFzY2VudCA9IGZvbnRIZWlnaHQgKiBUZXh0TGF5ZXIuI2dldEFzY2VudChmb250RmFtaWx5LCB0aGlzLiNsYW5nKTtcbiAgICBsZXQgbGVmdCwgdG9wO1xuICAgIGlmIChhbmdsZSA9PT0gMCkge1xuICAgICAgbGVmdCA9IHR4WzRdO1xuICAgICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZWZ0ID0gdHhbNF0gKyBmb250QXNjZW50ICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50ICogTWF0aC5jb3MoYW5nbGUpO1xuICAgIH1cbiAgICBjb25zdCBzY2FsZUZhY3RvclN0ciA9IFwiY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpKlwiO1xuICAgIGNvbnN0IGRpdlN0eWxlID0gdGV4dERpdi5zdHlsZTtcbiAgICBpZiAodGhpcy4jY29udGFpbmVyID09PSB0aGlzLiNyb290Q29udGFpbmVyKSB7XG4gICAgICBkaXZTdHlsZS5sZWZ0ID0gYCR7KDEwMCAqIGxlZnQgLyB0aGlzLiNwYWdlV2lkdGgpLnRvRml4ZWQoMil9JWA7XG4gICAgICBkaXZTdHlsZS50b3AgPSBgJHsoMTAwICogdG9wIC8gdGhpcy4jcGFnZUhlaWdodCkudG9GaXhlZCgyKX0lYDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGl2U3R5bGUubGVmdCA9IGAke3NjYWxlRmFjdG9yU3RyfSR7bGVmdC50b0ZpeGVkKDIpfXB4KWA7XG4gICAgICBkaXZTdHlsZS50b3AgPSBgJHtzY2FsZUZhY3RvclN0cn0ke3RvcC50b0ZpeGVkKDIpfXB4KWA7XG4gICAgfVxuICAgIGRpdlN0eWxlLmZvbnRTaXplID0gYCR7c2NhbGVGYWN0b3JTdHJ9JHsoVGV4dExheWVyLiNtaW5Gb250U2l6ZSAqIGZvbnRIZWlnaHQpLnRvRml4ZWQoMil9cHgpYDtcbiAgICBkaXZTdHlsZS5mb250RmFtaWx5ID0gZm9udEZhbWlseTtcbiAgICB0ZXh0RGl2UHJvcGVydGllcy5mb250U2l6ZSA9IGZvbnRIZWlnaHQ7XG4gICAgdGV4dERpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwicHJlc2VudGF0aW9uXCIpO1xuICAgIHRleHREaXYudGV4dENvbnRlbnQgPSBnZW9tLnN0cjtcbiAgICB0ZXh0RGl2LmRpciA9IGdlb20uZGlyO1xuICAgIGlmICh0aGlzLiNmb250SW5zcGVjdG9yRW5hYmxlZCkge1xuICAgICAgdGV4dERpdi5kYXRhc2V0LmZvbnROYW1lID0gc3R5bGUuZm9udFN1YnN0aXR1dGlvbkxvYWRlZE5hbWUgfHwgZ2VvbS5mb250TmFtZTtcbiAgICB9XG4gICAgaWYgKGFuZ2xlICE9PSAwKSB7XG4gICAgICB0ZXh0RGl2UHJvcGVydGllcy5hbmdsZSA9IGFuZ2xlICogKDE4MCAvIE1hdGguUEkpO1xuICAgIH1cbiAgICBsZXQgc2hvdWxkU2NhbGVUZXh0ID0gZmFsc2U7XG4gICAgaWYgKGdlb20uc3RyLmxlbmd0aCA+IDEpIHtcbiAgICAgIHNob3VsZFNjYWxlVGV4dCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChnZW9tLnN0ciAhPT0gXCIgXCIgJiYgZ2VvbS50cmFuc2Zvcm1bMF0gIT09IGdlb20udHJhbnNmb3JtWzNdKSB7XG4gICAgICBjb25zdCBhYnNTY2FsZVggPSBNYXRoLmFicyhnZW9tLnRyYW5zZm9ybVswXSksXG4gICAgICAgIGFic1NjYWxlWSA9IE1hdGguYWJzKGdlb20udHJhbnNmb3JtWzNdKTtcbiAgICAgIGlmIChhYnNTY2FsZVggIT09IGFic1NjYWxlWSAmJiBNYXRoLm1heChhYnNTY2FsZVgsIGFic1NjYWxlWSkgLyBNYXRoLm1pbihhYnNTY2FsZVgsIGFic1NjYWxlWSkgPiAxLjUpIHtcbiAgICAgICAgc2hvdWxkU2NhbGVUZXh0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZFNjYWxlVGV4dCkge1xuICAgICAgdGV4dERpdlByb3BlcnRpZXMuY2FudmFzV2lkdGggPSBzdHlsZS52ZXJ0aWNhbCA/IGdlb20uaGVpZ2h0IDogZ2VvbS53aWR0aDtcbiAgICB9XG4gICAgdGhpcy4jdGV4dERpdlByb3BlcnRpZXMuc2V0KHRleHREaXYsIHRleHREaXZQcm9wZXJ0aWVzKTtcbiAgICB0aGlzLiNsYXlvdXRUZXh0UGFyYW1zLmRpdiA9IHRleHREaXY7XG4gICAgdGhpcy4jbGF5b3V0VGV4dFBhcmFtcy5wcm9wZXJ0aWVzID0gdGV4dERpdlByb3BlcnRpZXM7XG4gICAgdGhpcy4jbGF5b3V0KHRoaXMuI2xheW91dFRleHRQYXJhbXMpO1xuICAgIGlmICh0ZXh0RGl2UHJvcGVydGllcy5oYXNUZXh0KSB7XG4gICAgICB0aGlzLiNjb250YWluZXIuYXBwZW5kKHRleHREaXYpO1xuICAgIH1cbiAgICBpZiAodGV4dERpdlByb3BlcnRpZXMuaGFzRU9MKSB7XG4gICAgICBjb25zdCBiciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKTtcbiAgICAgIGJyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJwcmVzZW50YXRpb25cIik7XG4gICAgICB0aGlzLiNjb250YWluZXIuYXBwZW5kKGJyKTtcbiAgICB9XG4gIH1cbiAgI2xheW91dChwYXJhbXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBkaXYsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgY3R4LFxuICAgICAgcHJldkZvbnRTaXplLFxuICAgICAgcHJldkZvbnRGYW1pbHlcbiAgICB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IGRpdjtcbiAgICBsZXQgdHJhbnNmb3JtID0gXCJcIjtcbiAgICBpZiAoVGV4dExheWVyLiNtaW5Gb250U2l6ZSA+IDEpIHtcbiAgICAgIHRyYW5zZm9ybSA9IGBzY2FsZSgkezEgLyBUZXh0TGF5ZXIuI21pbkZvbnRTaXplfSlgO1xuICAgIH1cbiAgICBpZiAocHJvcGVydGllcy5jYW52YXNXaWR0aCAhPT0gMCAmJiBwcm9wZXJ0aWVzLmhhc1RleHQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZm9udEZhbWlseVxuICAgICAgfSA9IHN0eWxlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjYW52YXNXaWR0aCxcbiAgICAgICAgZm9udFNpemVcbiAgICAgIH0gPSBwcm9wZXJ0aWVzO1xuICAgICAgaWYgKHByZXZGb250U2l6ZSAhPT0gZm9udFNpemUgfHwgcHJldkZvbnRGYW1pbHkgIT09IGZvbnRGYW1pbHkpIHtcbiAgICAgICAgY3R4LmZvbnQgPSBgJHtmb250U2l6ZSAqIHRoaXMuI3NjYWxlfXB4ICR7Zm9udEZhbWlseX1gO1xuICAgICAgICBwYXJhbXMucHJldkZvbnRTaXplID0gZm9udFNpemU7XG4gICAgICAgIHBhcmFtcy5wcmV2Rm9udEZhbWlseSA9IGZvbnRGYW1pbHk7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIHdpZHRoXG4gICAgICB9ID0gY3R4Lm1lYXN1cmVUZXh0KGRpdi50ZXh0Q29udGVudCk7XG4gICAgICBpZiAod2lkdGggPiAwKSB7XG4gICAgICAgIHRyYW5zZm9ybSA9IGBzY2FsZVgoJHtjYW52YXNXaWR0aCAqIHRoaXMuI3NjYWxlIC8gd2lkdGh9KSAke3RyYW5zZm9ybX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJvcGVydGllcy5hbmdsZSAhPT0gMCkge1xuICAgICAgdHJhbnNmb3JtID0gYHJvdGF0ZSgke3Byb3BlcnRpZXMuYW5nbGV9ZGVnKSAke3RyYW5zZm9ybX1gO1xuICAgIH1cbiAgICBpZiAodHJhbnNmb3JtLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMuI3BlbmRpbmdUZXh0TGF5ZXJzLnNpemUgPiAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FzY2VudENhY2hlLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCB7XG4gICAgICBjYW52YXNcbiAgICB9IG9mIHRoaXMuI2NhbnZhc0NvbnRleHRzLnZhbHVlcygpKSB7XG4gICAgICBjYW52YXMucmVtb3ZlKCk7XG4gICAgfVxuICAgIHRoaXMuI2NhbnZhc0NvbnRleHRzLmNsZWFyKCk7XG4gIH1cbiAgc3RhdGljICNnZXRDdHgobGFuZyA9IG51bGwpIHtcbiAgICBsZXQgY2FudmFzQ29udGV4dCA9IHRoaXMuI2NhbnZhc0NvbnRleHRzLmdldChsYW5nIHx8PSBcIlwiKTtcbiAgICBpZiAoIWNhbnZhc0NvbnRleHQpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBjYW52YXMuY2xhc3NOYW1lID0gXCJoaWRkZW5DYW52YXNFbGVtZW50XCI7XG4gICAgICBjYW52YXMubGFuZyA9IGxhbmc7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChjYW52YXMpO1xuICAgICAgY2FudmFzQ29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiwge1xuICAgICAgICBhbHBoYTogZmFsc2UsXG4gICAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICB0aGlzLiNjYW52YXNDb250ZXh0cy5zZXQobGFuZywgY2FudmFzQ29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBjYW52YXNDb250ZXh0O1xuICB9XG4gIHN0YXRpYyAjZW5zdXJlTWluRm9udFNpemVDb21wdXRlZCgpIHtcbiAgICBpZiAodGhpcy4jbWluRm9udFNpemUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXYuc3R5bGUub3BhY2l0eSA9IDA7XG4gICAgZGl2LnN0eWxlLmxpbmVIZWlnaHQgPSAxO1xuICAgIGRpdi5zdHlsZS5mb250U2l6ZSA9IFwiMXB4XCI7XG4gICAgZGl2LnRleHRDb250ZW50ID0gXCJYXCI7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoZGl2KTtcbiAgICB0aGlzLiNtaW5Gb250U2l6ZSA9IGRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgZGl2LnJlbW92ZSgpO1xuICB9XG4gIHN0YXRpYyAjZ2V0QXNjZW50KGZvbnRGYW1pbHksIGxhbmcpIHtcbiAgICBjb25zdCBjYWNoZWRBc2NlbnQgPSB0aGlzLiNhc2NlbnRDYWNoZS5nZXQoZm9udEZhbWlseSk7XG4gICAgaWYgKGNhY2hlZEFzY2VudCkge1xuICAgICAgcmV0dXJuIGNhY2hlZEFzY2VudDtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gdGhpcy4jZ2V0Q3R4KGxhbmcpO1xuICAgIGNvbnN0IHNhdmVkRm9udCA9IGN0eC5mb250O1xuICAgIGN0eC5jYW52YXMud2lkdGggPSBjdHguY2FudmFzLmhlaWdodCA9IERFRkFVTFRfRk9OVF9TSVpFO1xuICAgIGN0eC5mb250ID0gYCR7REVGQVVMVF9GT05UX1NJWkV9cHggJHtmb250RmFtaWx5fWA7XG4gICAgY29uc3QgbWV0cmljcyA9IGN0eC5tZWFzdXJlVGV4dChcIlwiKTtcbiAgICBsZXQgYXNjZW50ID0gbWV0cmljcy5mb250Qm91bmRpbmdCb3hBc2NlbnQ7XG4gICAgbGV0IGRlc2NlbnQgPSBNYXRoLmFicyhtZXRyaWNzLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpO1xuICAgIGlmIChhc2NlbnQpIHtcbiAgICAgIGNvbnN0IHJhdGlvID0gYXNjZW50IC8gKGFzY2VudCArIGRlc2NlbnQpO1xuICAgICAgdGhpcy4jYXNjZW50Q2FjaGUuc2V0KGZvbnRGYW1pbHksIHJhdGlvKTtcbiAgICAgIGN0eC5jYW52YXMud2lkdGggPSBjdHguY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICBjdHguZm9udCA9IHNhdmVkRm9udDtcbiAgICAgIHJldHVybiByYXRpbztcbiAgICB9XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gXCJyZWRcIjtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIERFRkFVTFRfRk9OVF9TSVpFLCBERUZBVUxUX0ZPTlRfU0laRSk7XG4gICAgY3R4LnN0cm9rZVRleHQoXCJnXCIsIDAsIDApO1xuICAgIGxldCBwaXhlbHMgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIERFRkFVTFRfRk9OVF9TSVpFLCBERUZBVUxUX0ZPTlRfU0laRSkuZGF0YTtcbiAgICBkZXNjZW50ID0gMDtcbiAgICBmb3IgKGxldCBpID0gcGl4ZWxzLmxlbmd0aCAtIDEgLSAzOyBpID49IDA7IGkgLT0gNCkge1xuICAgICAgaWYgKHBpeGVsc1tpXSA+IDApIHtcbiAgICAgICAgZGVzY2VudCA9IE1hdGguY2VpbChpIC8gNCAvIERFRkFVTFRfRk9OVF9TSVpFKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgREVGQVVMVF9GT05UX1NJWkUsIERFRkFVTFRfRk9OVF9TSVpFKTtcbiAgICBjdHguc3Ryb2tlVGV4dChcIkFcIiwgMCwgREVGQVVMVF9GT05UX1NJWkUpO1xuICAgIHBpeGVscyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgREVGQVVMVF9GT05UX1NJWkUsIERFRkFVTFRfRk9OVF9TSVpFKS5kYXRhO1xuICAgIGFzY2VudCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcGl4ZWxzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDQpIHtcbiAgICAgIGlmIChwaXhlbHNbaV0gPiAwKSB7XG4gICAgICAgIGFzY2VudCA9IERFRkFVTFRfRk9OVF9TSVpFIC0gTWF0aC5mbG9vcihpIC8gNCAvIERFRkFVTFRfRk9OVF9TSVpFKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGN0eC5jYW52YXMud2lkdGggPSBjdHguY2FudmFzLmhlaWdodCA9IDA7XG4gICAgY3R4LmZvbnQgPSBzYXZlZEZvbnQ7XG4gICAgY29uc3QgcmF0aW8gPSBhc2NlbnQgPyBhc2NlbnQgLyAoYXNjZW50ICsgZGVzY2VudCkgOiBERUZBVUxUX0ZPTlRfQVNDRU5UO1xuICAgIHRoaXMuI2FzY2VudENhY2hlLnNldChmb250RmFtaWx5LCByYXRpbyk7XG4gICAgcmV0dXJuIHJhdGlvO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJUZXh0TGF5ZXIoKSB7XG4gIGRlcHJlY2F0ZWQoXCJgcmVuZGVyVGV4dExheWVyYCwgcGxlYXNlIHVzZSBgVGV4dExheWVyYCBpbnN0ZWFkLlwiKTtcbiAgY29uc3Qge1xuICAgIHRleHRDb250ZW50U291cmNlLFxuICAgIGNvbnRhaW5lcixcbiAgICB2aWV3cG9ydCxcbiAgICAuLi5yZXN0XG4gIH0gPSBhcmd1bWVudHNbMF07XG4gIGNvbnN0IHJlc3RLZXlzID0gT2JqZWN0LmtleXMocmVzdCk7XG4gIGlmIChyZXN0S2V5cy5sZW5ndGggPiAwKSB7XG4gICAgd2FybihcIklnbm9yaW5nIGByZW5kZXJUZXh0TGF5ZXJgIHBhcmFtZXRlcnM6IFwiICsgcmVzdEtleXMuam9pbihcIiwgXCIpKTtcbiAgfVxuICBjb25zdCB0ZXh0TGF5ZXIgPSBuZXcgVGV4dExheWVyKHtcbiAgICB0ZXh0Q29udGVudFNvdXJjZSxcbiAgICBjb250YWluZXIsXG4gICAgdmlld3BvcnRcbiAgfSk7XG4gIGNvbnN0IHtcbiAgICB0ZXh0RGl2cyxcbiAgICB0ZXh0Q29udGVudEl0ZW1zU3RyXG4gIH0gPSB0ZXh0TGF5ZXI7XG4gIGNvbnN0IHByb21pc2UgPSB0ZXh0TGF5ZXIucmVuZGVyKCk7XG4gIHJldHVybiB7XG4gICAgcHJvbWlzZSxcbiAgICB0ZXh0RGl2cyxcbiAgICB0ZXh0Q29udGVudEl0ZW1zU3RyXG4gIH07XG59XG5mdW5jdGlvbiB1cGRhdGVUZXh0TGF5ZXIoKSB7XG4gIGRlcHJlY2F0ZWQoXCJgdXBkYXRlVGV4dExheWVyYCwgcGxlYXNlIHVzZSBgVGV4dExheWVyYCBpbnN0ZWFkLlwiKTtcbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkveGZhX3RleHQuanNcbmNsYXNzIFhmYVRleHQge1xuICBzdGF0aWMgdGV4dENvbnRlbnQoeGZhKSB7XG4gICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICBpdGVtcyxcbiAgICAgIHN0eWxlczogT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIH07XG4gICAgZnVuY3Rpb24gd2Fsayhub2RlKSB7XG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHN0ciA9IG51bGw7XG4gICAgICBjb25zdCBuYW1lID0gbm9kZS5uYW1lO1xuICAgICAgaWYgKG5hbWUgPT09IFwiI3RleHRcIikge1xuICAgICAgICBzdHIgPSBub2RlLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmICghWGZhVGV4dC5zaG91bGRCdWlsZFRleHQobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChub2RlPy5hdHRyaWJ1dGVzPy50ZXh0Q29udGVudCkge1xuICAgICAgICBzdHIgPSBub2RlLmF0dHJpYnV0ZXMudGV4dENvbnRlbnQ7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgICAgc3RyID0gbm9kZS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIgIT09IG51bGwpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgICAgc3RyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICB3YWxrKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2Fsayh4ZmEpO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbiAgc3RhdGljIHNob3VsZEJ1aWxkVGV4dChuYW1lKSB7XG4gICAgcmV0dXJuICEobmFtZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8IG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcIm9wdGlvblwiIHx8IG5hbWUgPT09IFwic2VsZWN0XCIpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2FwaS5qc1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkUgPSA2NTUzNjtcbmNvbnN0IFJFTkRFUklOR19DQU5DRUxMRURfVElNRU9VVCA9IDEwMDtcbmNvbnN0IERFTEFZRURfQ0xFQU5VUF9USU1FT1VUID0gNTAwMDtcbmNvbnN0IERlZmF1bHRDYW52YXNGYWN0b3J5ID0gaXNOb2RlSlMgPyBOb2RlQ2FudmFzRmFjdG9yeSA6IERPTUNhbnZhc0ZhY3Rvcnk7XG5jb25zdCBEZWZhdWx0Q01hcFJlYWRlckZhY3RvcnkgPSBpc05vZGVKUyA/IE5vZGVDTWFwUmVhZGVyRmFjdG9yeSA6IERPTUNNYXBSZWFkZXJGYWN0b3J5O1xuY29uc3QgRGVmYXVsdEZpbHRlckZhY3RvcnkgPSBpc05vZGVKUyA/IE5vZGVGaWx0ZXJGYWN0b3J5IDogRE9NRmlsdGVyRmFjdG9yeTtcbmNvbnN0IERlZmF1bHRTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IGlzTm9kZUpTID8gTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IDogRE9NU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG5mdW5jdGlvbiBnZXREb2N1bWVudChzcmMgPSB7fSkge1xuICBpZiAodHlwZW9mIHNyYyA9PT0gXCJzdHJpbmdcIiB8fCBzcmMgaW5zdGFuY2VvZiBVUkwpIHtcbiAgICBzcmMgPSB7XG4gICAgICB1cmw6IHNyY1xuICAgIH07XG4gIH0gZWxzZSBpZiAoc3JjIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHNyYykpIHtcbiAgICBzcmMgPSB7XG4gICAgICBkYXRhOiBzcmNcbiAgICB9O1xuICB9XG4gIGNvbnN0IHRhc2sgPSBuZXcgUERGRG9jdW1lbnRMb2FkaW5nVGFzaygpO1xuICBjb25zdCB7XG4gICAgZG9jSWRcbiAgfSA9IHRhc2s7XG4gIGNvbnN0IHVybCA9IHNyYy51cmwgPyBnZXRVcmxQcm9wKHNyYy51cmwpIDogbnVsbDtcbiAgY29uc3QgZGF0YSA9IHNyYy5kYXRhID8gZ2V0RGF0YVByb3Aoc3JjLmRhdGEpIDogbnVsbDtcbiAgY29uc3QgaHR0cEhlYWRlcnMgPSBzcmMuaHR0cEhlYWRlcnMgfHwgbnVsbDtcbiAgY29uc3Qgd2l0aENyZWRlbnRpYWxzID0gc3JjLndpdGhDcmVkZW50aWFscyA9PT0gdHJ1ZTtcbiAgY29uc3QgcGFzc3dvcmQgPSBzcmMucGFzc3dvcmQgPz8gbnVsbDtcbiAgY29uc3QgcmFuZ2VUcmFuc3BvcnQgPSBzcmMucmFuZ2UgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQgPyBzcmMucmFuZ2UgOiBudWxsO1xuICBjb25zdCByYW5nZUNodW5rU2l6ZSA9IE51bWJlci5pc0ludGVnZXIoc3JjLnJhbmdlQ2h1bmtTaXplKSAmJiBzcmMucmFuZ2VDaHVua1NpemUgPiAwID8gc3JjLnJhbmdlQ2h1bmtTaXplIDogREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFO1xuICBsZXQgd29ya2VyID0gc3JjLndvcmtlciBpbnN0YW5jZW9mIFBERldvcmtlciA/IHNyYy53b3JrZXIgOiBudWxsO1xuICBjb25zdCB2ZXJib3NpdHkgPSBzcmMudmVyYm9zaXR5O1xuICBjb25zdCBkb2NCYXNlVXJsID0gdHlwZW9mIHNyYy5kb2NCYXNlVXJsID09PSBcInN0cmluZ1wiICYmICFpc0RhdGFTY2hlbWUoc3JjLmRvY0Jhc2VVcmwpID8gc3JjLmRvY0Jhc2VVcmwgOiBudWxsO1xuICBjb25zdCBjTWFwVXJsID0gdHlwZW9mIHNyYy5jTWFwVXJsID09PSBcInN0cmluZ1wiID8gc3JjLmNNYXBVcmwgOiBudWxsO1xuICBjb25zdCBjTWFwUGFja2VkID0gc3JjLmNNYXBQYWNrZWQgIT09IGZhbHNlO1xuICBjb25zdCBDTWFwUmVhZGVyRmFjdG9yeSA9IHNyYy5DTWFwUmVhZGVyRmFjdG9yeSB8fCBEZWZhdWx0Q01hcFJlYWRlckZhY3Rvcnk7XG4gIGNvbnN0IHN0YW5kYXJkRm9udERhdGFVcmwgPSB0eXBlb2Ygc3JjLnN0YW5kYXJkRm9udERhdGFVcmwgPT09IFwic3RyaW5nXCIgPyBzcmMuc3RhbmRhcmRGb250RGF0YVVybCA6IG51bGw7XG4gIGNvbnN0IFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gc3JjLlN0YW5kYXJkRm9udERhdGFGYWN0b3J5IHx8IERlZmF1bHRTdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcbiAgY29uc3QgaWdub3JlRXJyb3JzID0gc3JjLnN0b3BBdEVycm9ycyAhPT0gdHJ1ZTtcbiAgY29uc3QgbWF4SW1hZ2VTaXplID0gTnVtYmVyLmlzSW50ZWdlcihzcmMubWF4SW1hZ2VTaXplKSAmJiBzcmMubWF4SW1hZ2VTaXplID4gLTEgPyBzcmMubWF4SW1hZ2VTaXplIDogLTE7XG4gIGNvbnN0IGlzRXZhbFN1cHBvcnRlZCA9IHNyYy5pc0V2YWxTdXBwb3J0ZWQgIT09IGZhbHNlO1xuICBjb25zdCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9IHR5cGVvZiBzcmMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPT09IFwiYm9vbGVhblwiID8gc3JjLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIDogIWlzTm9kZUpTO1xuICBjb25zdCBjYW52YXNNYXhBcmVhSW5CeXRlcyA9IE51bWJlci5pc0ludGVnZXIoc3JjLmNhbnZhc01heEFyZWFJbkJ5dGVzKSA/IHNyYy5jYW52YXNNYXhBcmVhSW5CeXRlcyA6IC0xO1xuICBjb25zdCBkaXNhYmxlRm9udEZhY2UgPSB0eXBlb2Ygc3JjLmRpc2FibGVGb250RmFjZSA9PT0gXCJib29sZWFuXCIgPyBzcmMuZGlzYWJsZUZvbnRGYWNlIDogaXNOb2RlSlM7XG4gIGNvbnN0IGZvbnRFeHRyYVByb3BlcnRpZXMgPSBzcmMuZm9udEV4dHJhUHJvcGVydGllcyA9PT0gdHJ1ZTtcbiAgY29uc3QgZW5hYmxlWGZhID0gc3JjLmVuYWJsZVhmYSA9PT0gdHJ1ZTtcbiAgY29uc3Qgb3duZXJEb2N1bWVudCA9IHNyYy5vd25lckRvY3VtZW50IHx8IGdsb2JhbFRoaXMuZG9jdW1lbnQ7XG4gIGNvbnN0IGRpc2FibGVSYW5nZSA9IHNyYy5kaXNhYmxlUmFuZ2UgPT09IHRydWU7XG4gIGNvbnN0IGRpc2FibGVTdHJlYW0gPSBzcmMuZGlzYWJsZVN0cmVhbSA9PT0gdHJ1ZTtcbiAgY29uc3QgZGlzYWJsZUF1dG9GZXRjaCA9IHNyYy5kaXNhYmxlQXV0b0ZldGNoID09PSB0cnVlO1xuICBjb25zdCBwZGZCdWcgPSBzcmMucGRmQnVnID09PSB0cnVlO1xuICBjb25zdCBlbmFibGVIV0EgPSBzcmMuZW5hYmxlSFdBID09PSB0cnVlO1xuICBjb25zdCBsZW5ndGggPSByYW5nZVRyYW5zcG9ydCA/IHJhbmdlVHJhbnNwb3J0Lmxlbmd0aCA6IHNyYy5sZW5ndGggPz8gTmFOO1xuICBjb25zdCB1c2VTeXN0ZW1Gb250cyA9IHR5cGVvZiBzcmMudXNlU3lzdGVtRm9udHMgPT09IFwiYm9vbGVhblwiID8gc3JjLnVzZVN5c3RlbUZvbnRzIDogIWlzTm9kZUpTICYmICFkaXNhYmxlRm9udEZhY2U7XG4gIGNvbnN0IHVzZVdvcmtlckZldGNoID0gdHlwZW9mIHNyYy51c2VXb3JrZXJGZXRjaCA9PT0gXCJib29sZWFuXCIgPyBzcmMudXNlV29ya2VyRmV0Y2ggOiBDTWFwUmVhZGVyRmFjdG9yeSA9PT0gRE9NQ01hcFJlYWRlckZhY3RvcnkgJiYgU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPT09IERPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ICYmIGNNYXBVcmwgJiYgc3RhbmRhcmRGb250RGF0YVVybCAmJiBpc1ZhbGlkRmV0Y2hVcmwoY01hcFVybCwgZG9jdW1lbnQuYmFzZVVSSSkgJiYgaXNWYWxpZEZldGNoVXJsKHN0YW5kYXJkRm9udERhdGFVcmwsIGRvY3VtZW50LmJhc2VVUkkpO1xuICBjb25zdCBjYW52YXNGYWN0b3J5ID0gc3JjLmNhbnZhc0ZhY3RvcnkgfHwgbmV3IERlZmF1bHRDYW52YXNGYWN0b3J5KHtcbiAgICBvd25lckRvY3VtZW50LFxuICAgIGVuYWJsZUhXQVxuICB9KTtcbiAgY29uc3QgZmlsdGVyRmFjdG9yeSA9IHNyYy5maWx0ZXJGYWN0b3J5IHx8IG5ldyBEZWZhdWx0RmlsdGVyRmFjdG9yeSh7XG4gICAgZG9jSWQsXG4gICAgb3duZXJEb2N1bWVudFxuICB9KTtcbiAgY29uc3Qgc3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgc2V0VmVyYm9zaXR5TGV2ZWwodmVyYm9zaXR5KTtcbiAgY29uc3QgdHJhbnNwb3J0RmFjdG9yeSA9IHtcbiAgICBjYW52YXNGYWN0b3J5LFxuICAgIGZpbHRlckZhY3RvcnlcbiAgfTtcbiAgaWYgKCF1c2VXb3JrZXJGZXRjaCkge1xuICAgIHRyYW5zcG9ydEZhY3RvcnkuY01hcFJlYWRlckZhY3RvcnkgPSBuZXcgQ01hcFJlYWRlckZhY3Rvcnkoe1xuICAgICAgYmFzZVVybDogY01hcFVybCxcbiAgICAgIGlzQ29tcHJlc3NlZDogY01hcFBhY2tlZFxuICAgIH0pO1xuICAgIHRyYW5zcG9ydEZhY3Rvcnkuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBuZXcgU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkoe1xuICAgICAgYmFzZVVybDogc3RhbmRhcmRGb250RGF0YVVybFxuICAgIH0pO1xuICB9XG4gIGlmICghd29ya2VyKSB7XG4gICAgY29uc3Qgd29ya2VyUGFyYW1zID0ge1xuICAgICAgdmVyYm9zaXR5LFxuICAgICAgcG9ydDogR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0XG4gICAgfTtcbiAgICB3b3JrZXIgPSB3b3JrZXJQYXJhbXMucG9ydCA/IFBERldvcmtlci5mcm9tUG9ydCh3b3JrZXJQYXJhbXMpIDogbmV3IFBERldvcmtlcih3b3JrZXJQYXJhbXMpO1xuICAgIHRhc2suX3dvcmtlciA9IHdvcmtlcjtcbiAgfVxuICBjb25zdCBkb2NQYXJhbXMgPSB7XG4gICAgZG9jSWQsXG4gICAgYXBpVmVyc2lvbjogXCI0LjQuMTY4XCIsXG4gICAgZGF0YSxcbiAgICBwYXNzd29yZCxcbiAgICBkaXNhYmxlQXV0b0ZldGNoLFxuICAgIHJhbmdlQ2h1bmtTaXplLFxuICAgIGxlbmd0aCxcbiAgICBkb2NCYXNlVXJsLFxuICAgIGVuYWJsZVhmYSxcbiAgICBldmFsdWF0b3JPcHRpb25zOiB7XG4gICAgICBtYXhJbWFnZVNpemUsXG4gICAgICBkaXNhYmxlRm9udEZhY2UsXG4gICAgICBpZ25vcmVFcnJvcnMsXG4gICAgICBpc0V2YWxTdXBwb3J0ZWQsXG4gICAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCxcbiAgICAgIGNhbnZhc01heEFyZWFJbkJ5dGVzLFxuICAgICAgZm9udEV4dHJhUHJvcGVydGllcyxcbiAgICAgIHVzZVN5c3RlbUZvbnRzLFxuICAgICAgY01hcFVybDogdXNlV29ya2VyRmV0Y2ggPyBjTWFwVXJsIDogbnVsbCxcbiAgICAgIHN0YW5kYXJkRm9udERhdGFVcmw6IHVzZVdvcmtlckZldGNoID8gc3RhbmRhcmRGb250RGF0YVVybCA6IG51bGxcbiAgICB9XG4gIH07XG4gIGNvbnN0IHRyYW5zcG9ydFBhcmFtcyA9IHtcbiAgICBkaXNhYmxlRm9udEZhY2UsXG4gICAgZm9udEV4dHJhUHJvcGVydGllcyxcbiAgICBvd25lckRvY3VtZW50LFxuICAgIHBkZkJ1ZyxcbiAgICBzdHlsZUVsZW1lbnQsXG4gICAgbG9hZGluZ1BhcmFtczoge1xuICAgICAgZGlzYWJsZUF1dG9GZXRjaCxcbiAgICAgIGVuYWJsZVhmYVxuICAgIH1cbiAgfTtcbiAgd29ya2VyLnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRhc2suZGVzdHJveWVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkaW5nIGFib3J0ZWRcIik7XG4gICAgfVxuICAgIGlmICh3b3JrZXIuZGVzdHJveWVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKTtcbiAgICB9XG4gICAgY29uc3Qgd29ya2VySWRQcm9taXNlID0gd29ya2VyLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERvY1JlcXVlc3RcIiwgZG9jUGFyYW1zLCBkYXRhID8gW2RhdGEuYnVmZmVyXSA6IG51bGwpO1xuICAgIGxldCBuZXR3b3JrU3RyZWFtO1xuICAgIGlmIChyYW5nZVRyYW5zcG9ydCkge1xuICAgICAgbmV0d29ya1N0cmVhbSA9IG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtKHJhbmdlVHJhbnNwb3J0LCB7XG4gICAgICAgIGRpc2FibGVSYW5nZSxcbiAgICAgICAgZGlzYWJsZVN0cmVhbVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghZGF0YSkge1xuICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2V0RG9jdW1lbnQgLSBubyBgdXJsYCBwYXJhbWV0ZXIgcHJvdmlkZWQuXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgY3JlYXRlUERGTmV0d29ya1N0cmVhbSA9IHBhcmFtcyA9PiB7XG4gICAgICAgIGlmIChpc05vZGVKUykge1xuICAgICAgICAgIGNvbnN0IGlzRmV0Y2hTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGZldGNoICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBSZXNwb25zZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBcImJvZHlcIiBpbiBSZXNwb25zZS5wcm90b3R5cGU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gaXNGZXRjaFN1cHBvcnRlZCgpICYmIGlzVmFsaWRGZXRjaFVybChwYXJhbXMudXJsKSA/IG5ldyBQREZGZXRjaFN0cmVhbShwYXJhbXMpIDogbmV3IFBERk5vZGVTdHJlYW0ocGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNWYWxpZEZldGNoVXJsKHBhcmFtcy51cmwpID8gbmV3IFBERkZldGNoU3RyZWFtKHBhcmFtcykgOiBuZXcgUERGTmV0d29ya1N0cmVhbShwYXJhbXMpO1xuICAgICAgfTtcbiAgICAgIG5ldHdvcmtTdHJlYW0gPSBjcmVhdGVQREZOZXR3b3JrU3RyZWFtKHtcbiAgICAgICAgdXJsLFxuICAgICAgICBsZW5ndGgsXG4gICAgICAgIGh0dHBIZWFkZXJzLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgIHJhbmdlQ2h1bmtTaXplLFxuICAgICAgICBkaXNhYmxlUmFuZ2UsXG4gICAgICAgIGRpc2FibGVTdHJlYW1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd29ya2VySWRQcm9taXNlLnRoZW4od29ya2VySWQgPT4ge1xuICAgICAgaWYgKHRhc2suZGVzdHJveWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkxvYWRpbmcgYWJvcnRlZFwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh3b3JrZXIuZGVzdHJveWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoZG9jSWQsIHdvcmtlcklkLCB3b3JrZXIucG9ydCk7XG4gICAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgV29ya2VyVHJhbnNwb3J0KG1lc3NhZ2VIYW5kbGVyLCB0YXNrLCBuZXR3b3JrU3RyZWFtLCB0cmFuc3BvcnRQYXJhbXMsIHRyYW5zcG9ydEZhY3RvcnkpO1xuICAgICAgdGFzay5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcIlJlYWR5XCIsIG51bGwpO1xuICAgIH0pO1xuICB9KS5jYXRjaCh0YXNrLl9jYXBhYmlsaXR5LnJlamVjdCk7XG4gIHJldHVybiB0YXNrO1xufVxuZnVuY3Rpb24gZ2V0VXJsUHJvcCh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHJldHVybiB2YWwuaHJlZjtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHZhbCwgd2luZG93LmxvY2F0aW9uKS5ocmVmO1xuICB9IGNhdGNoIHtcbiAgICBpZiAoaXNOb2RlSlMgJiYgdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBQREYgdXJsIGRhdGE6IFwiICsgXCJlaXRoZXIgc3RyaW5nIG9yIFVSTC1vYmplY3QgaXMgZXhwZWN0ZWQgaW4gdGhlIHVybCBwcm9wZXJ0eS5cIik7XG59XG5mdW5jdGlvbiBnZXREYXRhUHJvcCh2YWwpIHtcbiAgaWYgKGlzTm9kZUpTICYmIHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgYmluYXJ5IGRhdGEgYXMgYFVpbnQ4QXJyYXlgLCByYXRoZXIgdGhhbiBgQnVmZmVyYC5cIik7XG4gIH1cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgdmFsLmJ5dGVMZW5ndGggPT09IHZhbC5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gc3RyaW5nVG9CeXRlcyh2YWwpO1xuICB9XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKSB8fCB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmICFpc05hTih2YWw/Lmxlbmd0aCkpIHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFBERiBiaW5hcnkgZGF0YTogZWl0aGVyIFR5cGVkQXJyYXksIFwiICsgXCJzdHJpbmcsIG9yIGFycmF5LWxpa2Ugb2JqZWN0IGlzIGV4cGVjdGVkIGluIHRoZSBkYXRhIHByb3BlcnR5LlwiKTtcbn1cbmZ1bmN0aW9uIGlzUmVmUHJveHkocmVmKSB7XG4gIHJldHVybiB0eXBlb2YgcmVmID09PSBcIm9iamVjdFwiICYmIE51bWJlci5pc0ludGVnZXIocmVmPy5udW0pICYmIHJlZi5udW0gPj0gMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKHJlZj8uZ2VuKSAmJiByZWYuZ2VuID49IDA7XG59XG5jbGFzcyBQREZEb2N1bWVudExvYWRpbmdUYXNrIHtcbiAgc3RhdGljICNkb2NJZCA9IDA7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuICAgIHRoaXMuX3dvcmtlciA9IG51bGw7XG4gICAgdGhpcy5kb2NJZCA9IGBkJHtQREZEb2N1bWVudExvYWRpbmdUYXNrLiNkb2NJZCsrfWA7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9uUGFzc3dvcmQgPSBudWxsO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cbiAgZ2V0IHByb21pc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBhc3luYyBkZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuX3dvcmtlcj8ucG9ydCkge1xuICAgICAgICB0aGlzLl93b3JrZXIuX3BlbmRpbmdEZXN0cm95ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuX3RyYW5zcG9ydD8uZGVzdHJveSgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAodGhpcy5fd29ya2VyPy5wb3J0KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl93b3JrZXIuX3BlbmRpbmdEZXN0cm95O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXg7XG4gICAgfVxuICAgIHRoaXMuX3RyYW5zcG9ydCA9IG51bGw7XG4gICAgaWYgKHRoaXMuX3dvcmtlcikge1xuICAgICAgdGhpcy5fd29ya2VyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX3dvcmtlciA9IG51bGw7XG4gICAgfVxuICB9XG59XG5jbGFzcyBQREZEYXRhUmFuZ2VUcmFuc3BvcnQge1xuICBjb25zdHJ1Y3RvcihsZW5ndGgsIGluaXRpYWxEYXRhLCBwcm9ncmVzc2l2ZURvbmUgPSBmYWxzZSwgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBudWxsKSB7XG4gICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgdGhpcy5pbml0aWFsRGF0YSA9IGluaXRpYWxEYXRhO1xuICAgIHRoaXMucHJvZ3Jlc3NpdmVEb25lID0gcHJvZ3Jlc3NpdmVEb25lO1xuICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTtcbiAgICB0aGlzLl9yYW5nZUxpc3RlbmVycyA9IFtdO1xuICAgIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzID0gW107XG4gICAgdGhpcy5fcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzID0gW107XG4gICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzID0gW107XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gIH1cbiAgYWRkUmFuZ2VMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG4gIGFkZFByb2dyZXNzTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfVxuICBhZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfVxuICBhZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfVxuICBvbkRhdGFSYW5nZShiZWdpbiwgY2h1bmspIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3JhbmdlTGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihiZWdpbiwgY2h1bmspO1xuICAgIH1cbiAgfVxuICBvbkRhdGFQcm9ncmVzcyhsb2FkZWQsIHRvdGFsKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyKGxvYWRlZCwgdG90YWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG9uRGF0YVByb2dyZXNzaXZlUmVhZChjaHVuaykge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMpIHtcbiAgICAgICAgbGlzdGVuZXIoY2h1bmspO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG9uRGF0YVByb2dyZXNzaXZlRG9uZSgpIHtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgdHJhbnNwb3J0UmVhZHkoKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfVxuICByZXF1ZXN0RGF0YVJhbmdlKGJlZ2luLCBlbmQpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBQREZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZVwiKTtcbiAgfVxuICBhYm9ydCgpIHt9XG59XG5jbGFzcyBQREZEb2N1bWVudFByb3h5IHtcbiAgY29uc3RydWN0b3IocGRmSW5mbywgdHJhbnNwb3J0KSB7XG4gICAgdGhpcy5fcGRmSW5mbyA9IHBkZkluZm87XG4gICAgdGhpcy5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICB9XG4gIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmFubm90YXRpb25TdG9yYWdlO1xuICB9XG4gIGdldCBmaWx0ZXJGYWN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeTtcbiAgfVxuICBnZXQgbnVtUGFnZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BkZkluZm8ubnVtUGFnZXM7XG4gIH1cbiAgZ2V0IGZpbmdlcnByaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcGRmSW5mby5maW5nZXJwcmludHM7XG4gIH1cbiAgZ2V0IGlzUHVyZVhmYSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNQdXJlWGZhXCIsICEhdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhKTtcbiAgfVxuICBnZXQgYWxsWGZhSHRtbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhO1xuICB9XG4gIGdldFBhZ2UocGFnZU51bWJlcikge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZShwYWdlTnVtYmVyKTtcbiAgfVxuICBnZXRQYWdlSW5kZXgocmVmKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSW5kZXgocmVmKTtcbiAgfVxuICBnZXREZXN0aW5hdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbnMoKTtcbiAgfVxuICBnZXREZXN0aW5hdGlvbihpZCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb24oaWQpO1xuICB9XG4gIGdldFBhZ2VMYWJlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTGFiZWxzKCk7XG4gIH1cbiAgZ2V0UGFnZUxheW91dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYXlvdXQoKTtcbiAgfVxuICBnZXRQYWdlTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VNb2RlKCk7XG4gIH1cbiAgZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRWaWV3ZXJQcmVmZXJlbmNlcygpO1xuICB9XG4gIGdldE9wZW5BY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRPcGVuQWN0aW9uKCk7XG4gIH1cbiAgZ2V0QXR0YWNobWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRBdHRhY2htZW50cygpO1xuICB9XG4gIGdldEpTQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERvY0pTQWN0aW9ucygpO1xuICB9XG4gIGdldE91dGxpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRPdXRsaW5lKCk7XG4gIH1cbiAgZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKHtcbiAgICBpbnRlbnQgPSBcImRpc3BsYXlcIlxuICB9ID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICByZW5kZXJpbmdJbnRlbnRcbiAgICB9ID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudChpbnRlbnQpO1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKHJlbmRlcmluZ0ludGVudCk7XG4gIH1cbiAgZ2V0UGVybWlzc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQZXJtaXNzaW9ucygpO1xuICB9XG4gIGdldE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0TWV0YWRhdGEoKTtcbiAgfVxuICBnZXRNYXJrSW5mbygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE1hcmtJbmZvKCk7XG4gIH1cbiAgZ2V0RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERhdGEoKTtcbiAgfVxuICBzYXZlRG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zYXZlRG9jdW1lbnQoKTtcbiAgfVxuICBnZXREb3dubG9hZEluZm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2xlYW51cChrZWVwTG9hZGVkRm9udHMgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc3RhcnRDbGVhbnVwKGtlZXBMb2FkZWRGb250cyB8fCB0aGlzLmlzUHVyZVhmYSk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nVGFzay5kZXN0cm95KCk7XG4gIH1cbiAgY2FjaGVkUGFnZU51bWJlcihyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmNhY2hlZFBhZ2VOdW1iZXIocmVmKTtcbiAgfVxuICBnZXQgbG9hZGluZ1BhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdQYXJhbXM7XG4gIH1cbiAgZ2V0IGxvYWRpbmdUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubG9hZGluZ1Rhc2s7XG4gIH1cbiAgZ2V0RmllbGRPYmplY3RzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RmllbGRPYmplY3RzKCk7XG4gIH1cbiAgaGFzSlNBY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuaGFzSlNBY3Rpb25zKCk7XG4gIH1cbiAgZ2V0Q2FsY3VsYXRpb25PcmRlcklkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldENhbGN1bGF0aW9uT3JkZXJJZHMoKTtcbiAgfVxufVxuY2xhc3MgUERGUGFnZVByb3h5IHtcbiAgI2RlbGF5ZWRDbGVhbnVwVGltZW91dCA9IG51bGw7XG4gICNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcihwYWdlSW5kZXgsIHBhZ2VJbmZvLCB0cmFuc3BvcnQsIHBkZkJ1ZyA9IGZhbHNlKSB7XG4gICAgdGhpcy5fcGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgIHRoaXMuX3BhZ2VJbmZvID0gcGFnZUluZm87XG4gICAgdGhpcy5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgIHRoaXMuX3N0YXRzID0gcGRmQnVnID8gbmV3IFN0YXRUaW1lcigpIDogbnVsbDtcbiAgICB0aGlzLl9wZGZCdWcgPSBwZGZCdWc7XG4gICAgdGhpcy5jb21tb25PYmpzID0gdHJhbnNwb3J0LmNvbW1vbk9ianM7XG4gICAgdGhpcy5vYmpzID0gbmV3IFBERk9iamVjdHMoKTtcbiAgICB0aGlzLl9tYXliZUNsZWFudXBBZnRlclJlbmRlciA9IGZhbHNlO1xuICAgIHRoaXMuX2ludGVudFN0YXRlcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICB9XG4gIGdldCBwYWdlTnVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlSW5kZXggKyAxO1xuICB9XG4gIGdldCByb3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJvdGF0ZTtcbiAgfVxuICBnZXQgcmVmKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby5yZWY7XG4gIH1cbiAgZ2V0IHVzZXJVbml0KCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby51c2VyVW5pdDtcbiAgfVxuICBnZXQgdmlldygpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8udmlldztcbiAgfVxuICBnZXRWaWV3cG9ydCh7XG4gICAgc2NhbGUsXG4gICAgcm90YXRpb24gPSB0aGlzLnJvdGF0ZSxcbiAgICBvZmZzZXRYID0gMCxcbiAgICBvZmZzZXRZID0gMCxcbiAgICBkb250RmxpcCA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIHJldHVybiBuZXcgUGFnZVZpZXdwb3J0KHtcbiAgICAgIHZpZXdCb3g6IHRoaXMudmlldyxcbiAgICAgIHNjYWxlLFxuICAgICAgcm90YXRpb24sXG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WSxcbiAgICAgIGRvbnRGbGlwXG4gICAgfSk7XG4gIH1cbiAgZ2V0QW5ub3RhdGlvbnMoe1xuICAgIGludGVudCA9IFwiZGlzcGxheVwiXG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlbmRlcmluZ0ludGVudFxuICAgIH0gPSB0aGlzLl90cmFuc3BvcnQuZ2V0UmVuZGVyaW5nSW50ZW50KGludGVudCk7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRBbm5vdGF0aW9ucyh0aGlzLl9wYWdlSW5kZXgsIHJlbmRlcmluZ0ludGVudCk7XG4gIH1cbiAgZ2V0SlNBY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUpTQWN0aW9ucyh0aGlzLl9wYWdlSW5kZXgpO1xuICB9XG4gIGdldCBmaWx0ZXJGYWN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeTtcbiAgfVxuICBnZXQgaXNQdXJlWGZhKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc1B1cmVYZmFcIiwgISF0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpO1xuICB9XG4gIGFzeW5jIGdldFhmYSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhPy5jaGlsZHJlblt0aGlzLl9wYWdlSW5kZXhdIHx8IG51bGw7XG4gIH1cbiAgcmVuZGVyKHtcbiAgICBjYW52YXNDb250ZXh0LFxuICAgIHZpZXdwb3J0LFxuICAgIGludGVudCA9IFwiZGlzcGxheVwiLFxuICAgIGFubm90YXRpb25Nb2RlID0gQW5ub3RhdGlvbk1vZGUuRU5BQkxFLFxuICAgIHRyYW5zZm9ybSA9IG51bGwsXG4gICAgYmFja2dyb3VuZCA9IG51bGwsXG4gICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG51bGwsXG4gICAgYW5ub3RhdGlvbkNhbnZhc01hcCA9IG51bGwsXG4gICAgcGFnZUNvbG9ycyA9IG51bGwsXG4gICAgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IG51bGxcbiAgfSkge1xuICAgIHRoaXMuX3N0YXRzPy50aW1lKFwiT3ZlcmFsbFwiKTtcbiAgICBjb25zdCBpbnRlbnRBcmdzID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudChpbnRlbnQsIGFubm90YXRpb25Nb2RlLCBwcmludEFubm90YXRpb25TdG9yYWdlKTtcbiAgICBjb25zdCB7XG4gICAgICByZW5kZXJpbmdJbnRlbnQsXG4gICAgICBjYWNoZUtleVxuICAgIH0gPSBpbnRlbnRBcmdzO1xuICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gZmFsc2U7XG4gICAgdGhpcy4jYWJvcnREZWxheWVkQ2xlYW51cCgpO1xuICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgfHw9IHRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcocmVuZGVyaW5nSW50ZW50KTtcbiAgICBsZXQgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoIWludGVudFN0YXRlKSB7XG4gICAgICBpbnRlbnRTdGF0ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KGNhY2hlS2V5LCBpbnRlbnRTdGF0ZSk7XG4gICAgfVxuICAgIGlmIChpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCk7XG4gICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgaW50ZW50UHJpbnQgPSAhIShyZW5kZXJpbmdJbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UKTtcbiAgICBpZiAoIWludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpIHtcbiAgICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCA9IHtcbiAgICAgICAgZm5BcnJheTogW10sXG4gICAgICAgIGFyZ3NBcnJheTogW10sXG4gICAgICAgIGxhc3RDaHVuazogZmFsc2UsXG4gICAgICAgIHNlcGFyYXRlQW5ub3RzOiBudWxsXG4gICAgICB9O1xuICAgICAgdGhpcy5fc3RhdHM/LnRpbWUoXCJQYWdlIFJlcXVlc3RcIik7XG4gICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KGludGVudEFyZ3MpO1xuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9IGVycm9yID0+IHtcbiAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzLmRlbGV0ZShpbnRlcm5hbFJlbmRlclRhc2spO1xuICAgICAgaWYgKHRoaXMuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyIHx8IGludGVudFByaW50KSB7XG4gICAgICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3RyeUNsZWFudXAoIWludGVudFByaW50KTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgaW50ZW50U3RhdGUsXG4gICAgICAgICAgcmVhc29uOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoZXJyb3IpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3N0YXRzKSB7XG4gICAgICAgIHRoaXMuX3N0YXRzLnRpbWVFbmQoXCJSZW5kZXJpbmdcIik7XG4gICAgICAgIHRoaXMuX3N0YXRzLnRpbWVFbmQoXCJPdmVyYWxsXCIpO1xuICAgICAgICBpZiAoZ2xvYmFsVGhpcy5TdGF0cz8uZW5hYmxlZCkge1xuICAgICAgICAgIGdsb2JhbFRoaXMuU3RhdHMuYWRkKHRoaXMucGFnZU51bWJlciwgdGhpcy5fc3RhdHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBpbnRlcm5hbFJlbmRlclRhc2sgPSBuZXcgSW50ZXJuYWxSZW5kZXJUYXNrKHtcbiAgICAgIGNhbGxiYWNrOiBjb21wbGV0ZSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBjYW52YXNDb250ZXh0LFxuICAgICAgICB2aWV3cG9ydCxcbiAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICBiYWNrZ3JvdW5kXG4gICAgICB9LFxuICAgICAgb2JqczogdGhpcy5vYmpzLFxuICAgICAgY29tbW9uT2JqczogdGhpcy5jb21tb25PYmpzLFxuICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcCxcbiAgICAgIG9wZXJhdG9yTGlzdDogaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LFxuICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICBjYW52YXNGYWN0b3J5OiB0aGlzLl90cmFuc3BvcnQuY2FudmFzRmFjdG9yeSxcbiAgICAgIGZpbHRlckZhY3Rvcnk6IHRoaXMuX3RyYW5zcG9ydC5maWx0ZXJGYWN0b3J5LFxuICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiAhaW50ZW50UHJpbnQsXG4gICAgICBwZGZCdWc6IHRoaXMuX3BkZkJ1ZyxcbiAgICAgIHBhZ2VDb2xvcnNcbiAgICB9KTtcbiAgICAoaW50ZW50U3RhdGUucmVuZGVyVGFza3MgfHw9IG5ldyBTZXQoKSkuYWRkKGludGVybmFsUmVuZGVyVGFzayk7XG4gICAgY29uc3QgcmVuZGVyVGFzayA9IGludGVybmFsUmVuZGVyVGFzay50YXNrO1xuICAgIFByb21pc2UuYWxsKFtpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnByb21pc2UsIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2VdKS50aGVuKChbdHJhbnNwYXJlbmN5LCBvcHRpb25hbENvbnRlbnRDb25maWddKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RhdHM/LnRpbWUoXCJSZW5kZXJpbmdcIik7XG4gICAgICBpZiAoIShvcHRpb25hbENvbnRlbnRDb25maWcucmVuZGVyaW5nSW50ZW50ICYgcmVuZGVyaW5nSW50ZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IHVzZSB0aGUgc2FtZSBgaW50ZW50YC1hcmd1bWVudCB3aGVuIGNhbGxpbmcgdGhlIGBQREZQYWdlUHJveHkucmVuZGVyYCBcIiArIFwiYW5kIGBQREZEb2N1bWVudFByb3h5LmdldE9wdGlvbmFsQ29udGVudENvbmZpZ2AgbWV0aG9kcy5cIik7XG4gICAgICB9XG4gICAgICBpbnRlcm5hbFJlbmRlclRhc2suaW5pdGlhbGl6ZUdyYXBoaWNzKHtcbiAgICAgICAgdHJhbnNwYXJlbmN5LFxuICAgICAgICBvcHRpb25hbENvbnRlbnRDb25maWdcbiAgICAgIH0pO1xuICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICB9KS5jYXRjaChjb21wbGV0ZSk7XG4gICAgcmV0dXJuIHJlbmRlclRhc2s7XG4gIH1cbiAgZ2V0T3BlcmF0b3JMaXN0KHtcbiAgICBpbnRlbnQgPSBcImRpc3BsYXlcIixcbiAgICBhbm5vdGF0aW9uTW9kZSA9IEFubm90YXRpb25Nb2RlLkVOQUJMRSxcbiAgICBwcmludEFubm90YXRpb25TdG9yYWdlID0gbnVsbFxuICB9ID0ge30pIHtcbiAgICBmdW5jdGlvbiBvcGVyYXRvckxpc3RDaGFuZ2VkKCkge1xuICAgICAgaWYgKGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHtcbiAgICAgICAgaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkucmVzb2x2ZShpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QpO1xuICAgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5kZWxldGUob3BMaXN0VGFzayk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGludGVudEFyZ3MgPSB0aGlzLl90cmFuc3BvcnQuZ2V0UmVuZGVyaW5nSW50ZW50KGludGVudCwgYW5ub3RhdGlvbk1vZGUsIHByaW50QW5ub3RhdGlvblN0b3JhZ2UsIHRydWUpO1xuICAgIGxldCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoaW50ZW50QXJncy5jYWNoZUtleSk7XG4gICAgaWYgKCFpbnRlbnRTdGF0ZSkge1xuICAgICAgaW50ZW50U3RhdGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdGhpcy5faW50ZW50U3RhdGVzLnNldChpbnRlbnRBcmdzLmNhY2hlS2V5LCBpbnRlbnRTdGF0ZSk7XG4gICAgfVxuICAgIGxldCBvcExpc3RUYXNrO1xuICAgIGlmICghaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHtcbiAgICAgIG9wTGlzdFRhc2sgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgb3BMaXN0VGFzay5vcGVyYXRvckxpc3RDaGFuZ2VkID0gb3BlcmF0b3JMaXN0Q2hhbmdlZDtcbiAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICAoaW50ZW50U3RhdGUucmVuZGVyVGFza3MgfHw9IG5ldyBTZXQoKSkuYWRkKG9wTGlzdFRhc2spO1xuICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0ID0ge1xuICAgICAgICBmbkFycmF5OiBbXSxcbiAgICAgICAgYXJnc0FycmF5OiBbXSxcbiAgICAgICAgbGFzdENodW5rOiBmYWxzZSxcbiAgICAgICAgc2VwYXJhdGVBbm5vdHM6IG51bGxcbiAgICAgIH07XG4gICAgICB0aGlzLl9zdGF0cz8udGltZShcIlBhZ2UgUmVxdWVzdFwiKTtcbiAgICAgIHRoaXMuX3B1bXBPcGVyYXRvckxpc3QoaW50ZW50QXJncyk7XG4gICAgfVxuICAgIHJldHVybiBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIHN0cmVhbVRleHRDb250ZW50KHtcbiAgICBpbmNsdWRlTWFya2VkQ29udGVudCA9IGZhbHNlLFxuICAgIGRpc2FibGVOb3JtYWxpemF0aW9uID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgY29uc3QgVEVYVF9DT05URU5UX0NIVU5LX1NJWkUgPSAxMDA7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFN0cmVhbShcIkdldFRleHRDb250ZW50XCIsIHtcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQ6IGluY2x1ZGVNYXJrZWRDb250ZW50ID09PSB0cnVlLFxuICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb246IGRpc2FibGVOb3JtYWxpemF0aW9uID09PSB0cnVlXG4gICAgfSwge1xuICAgICAgaGlnaFdhdGVyTWFyazogVEVYVF9DT05URU5UX0NIVU5LX1NJWkUsXG4gICAgICBzaXplKHRleHRDb250ZW50KSB7XG4gICAgICAgIHJldHVybiB0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGg7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZ2V0VGV4dENvbnRlbnQocGFyYW1zID0ge30pIHtcbiAgICBpZiAodGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRYZmEoKS50aGVuKHhmYSA9PiBYZmFUZXh0LnRleHRDb250ZW50KHhmYSkpO1xuICAgIH1cbiAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHRoaXMuc3RyZWFtVGV4dENvbnRlbnQocGFyYW1zKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gcHVtcCgpIHtcbiAgICAgICAgcmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uICh7XG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgZG9uZVxuICAgICAgICB9KSB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHJlc29sdmUodGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0ZXh0Q29udGVudC5sYW5nID8/PSB2YWx1ZS5sYW5nO1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24odGV4dENvbnRlbnQuc3R5bGVzLCB2YWx1ZS5zdHlsZXMpO1xuICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goLi4udmFsdWUuaXRlbXMpO1xuICAgICAgICAgIHB1bXAoKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSB7XG4gICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgc3R5bGVzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICBsYW5nOiBudWxsXG4gICAgICB9O1xuICAgICAgcHVtcCgpO1xuICAgIH0pO1xuICB9XG4gIGdldFN0cnVjdFRyZWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRTdHJ1Y3RUcmVlKHRoaXMuX3BhZ2VJbmRleCk7XG4gIH1cbiAgX2Rlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIGNvbnN0IHdhaXRPbiA9IFtdO1xuICAgIGZvciAoY29uc3QgaW50ZW50U3RhdGUgb2YgdGhpcy5faW50ZW50U3RhdGVzLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgICAgIGludGVudFN0YXRlLFxuICAgICAgICByZWFzb246IG5ldyBFcnJvcihcIlBhZ2Ugd2FzIGRlc3Ryb3llZC5cIiksXG4gICAgICAgIGZvcmNlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrIG9mIGludGVudFN0YXRlLnJlbmRlclRhc2tzKSB7XG4gICAgICAgIHdhaXRPbi5wdXNoKGludGVybmFsUmVuZGVyVGFzay5jb21wbGV0ZWQpO1xuICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub2Jqcy5jbGVhcigpO1xuICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gZmFsc2U7XG4gICAgdGhpcy4jYWJvcnREZWxheWVkQ2xlYW51cCgpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbCh3YWl0T24pO1xuICB9XG4gIGNsZWFudXAocmVzZXRTdGF0cyA9IGZhbHNlKSB7XG4gICAgdGhpcy4jcGVuZGluZ0NsZWFudXAgPSB0cnVlO1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLiN0cnlDbGVhbnVwKGZhbHNlKTtcbiAgICBpZiAocmVzZXRTdGF0cyAmJiBzdWNjZXNzKSB7XG4gICAgICB0aGlzLl9zdGF0cyAmJj0gbmV3IFN0YXRUaW1lcigpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfVxuICAjdHJ5Q2xlYW51cChkZWxheWVkID0gZmFsc2UpIHtcbiAgICB0aGlzLiNhYm9ydERlbGF5ZWRDbGVhbnVwKCk7XG4gICAgaWYgKCF0aGlzLiNwZW5kaW5nQ2xlYW51cCB8fCB0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGVsYXllZCkge1xuICAgICAgdGhpcy4jZGVsYXllZENsZWFudXBUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMuI3RyeUNsZWFudXAoZmFsc2UpO1xuICAgICAgfSwgREVMQVlFRF9DTEVBTlVQX1RJTUVPVVQpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIHJlbmRlclRhc2tzLFxuICAgICAgb3BlcmF0b3JMaXN0XG4gICAgfSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChyZW5kZXJUYXNrcy5zaXplID4gMCB8fCAhb3BlcmF0b3JMaXN0Lmxhc3RDaHVuaykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2ludGVudFN0YXRlcy5jbGVhcigpO1xuICAgIHRoaXMub2Jqcy5jbGVhcigpO1xuICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgI2Fib3J0RGVsYXllZENsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCk7XG4gICAgICB0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBfc3RhcnRSZW5kZXJQYWdlKHRyYW5zcGFyZW5jeSwgY2FjaGVLZXkpIHtcbiAgICBjb25zdCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoY2FjaGVLZXkpO1xuICAgIGlmICghaW50ZW50U3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc3RhdHM/LnRpbWVFbmQoXCJQYWdlIFJlcXVlc3RcIik7XG4gICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eT8ucmVzb2x2ZSh0cmFuc3BhcmVuY3kpO1xuICB9XG4gIF9yZW5kZXJQYWdlQ2h1bmsob3BlcmF0b3JMaXN0Q2h1bmssIGludGVudFN0YXRlKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gb3BlcmF0b3JMaXN0Q2h1bmsubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LmZuQXJyYXkucHVzaChvcGVyYXRvckxpc3RDaHVuay5mbkFycmF5W2ldKTtcbiAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkucHVzaChvcGVyYXRvckxpc3RDaHVuay5hcmdzQXJyYXlbaV0pO1xuICAgIH1cbiAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rID0gb3BlcmF0b3JMaXN0Q2h1bmsubGFzdENodW5rO1xuICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5zZXBhcmF0ZUFubm90cyA9IG9wZXJhdG9yTGlzdENodW5rLnNlcGFyYXRlQW5ub3RzO1xuICAgIGZvciAoY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrIG9mIGludGVudFN0YXRlLnJlbmRlclRhc2tzKSB7XG4gICAgICBpbnRlcm5hbFJlbmRlclRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAob3BlcmF0b3JMaXN0Q2h1bmsubGFzdENodW5rKSB7XG4gICAgICB0aGlzLiN0cnlDbGVhbnVwKHRydWUpO1xuICAgIH1cbiAgfVxuICBfcHVtcE9wZXJhdG9yTGlzdCh7XG4gICAgcmVuZGVyaW5nSW50ZW50LFxuICAgIGNhY2hlS2V5LFxuICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlXG4gIH0pIHtcbiAgICBjb25zdCB7XG4gICAgICBtYXAsXG4gICAgICB0cmFuc2ZlclxuICAgIH0gPSBhbm5vdGF0aW9uU3RvcmFnZVNlcmlhbGl6YWJsZTtcbiAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHRoaXMuX3RyYW5zcG9ydC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFN0cmVhbShcIkdldE9wZXJhdG9yTGlzdFwiLCB7XG4gICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCxcbiAgICAgIGludGVudDogcmVuZGVyaW5nSW50ZW50LFxuICAgICAgY2FjaGVLZXksXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZTogbWFwXG4gICAgfSwgdHJhbnNmZXIpO1xuICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpO1xuICAgIGNvbnN0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChjYWNoZUtleSk7XG4gICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gcmVhZGVyO1xuICAgIGNvbnN0IHB1bXAgPSAoKSA9PiB7XG4gICAgICByZWFkZXIucmVhZCgpLnRoZW4oKHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGRvbmVcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0LmRlc3Ryb3llZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZW5kZXJQYWdlQ2h1bmsodmFsdWUsIGludGVudFN0YXRlKTtcbiAgICAgICAgcHVtcCgpO1xuICAgICAgfSwgcmVhc29uID0+IHtcbiAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCkge1xuICAgICAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSB0cnVlO1xuICAgICAgICAgIGZvciAoY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrIG9mIGludGVudFN0YXRlLnJlbmRlclRhc2tzKSB7XG4gICAgICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLiN0cnlDbGVhbnVwKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7XG4gICAgICAgICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSkge1xuICAgICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBwdW1wKCk7XG4gIH1cbiAgX2Fib3J0T3BlcmF0b3JMaXN0KHtcbiAgICBpbnRlbnRTdGF0ZSxcbiAgICByZWFzb24sXG4gICAgZm9yY2UgPSBmYWxzZVxuICB9KSB7XG4gICAgaWYgKCFpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcbiAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIWZvcmNlKSB7XG4gICAgICBpZiAoaW50ZW50U3RhdGUucmVuZGVyVGFza3Muc2l6ZSA+IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikge1xuICAgICAgICBsZXQgZGVsYXkgPSBSRU5ERVJJTkdfQ0FOQ0VMTEVEX1RJTUVPVVQ7XG4gICAgICAgIGlmIChyZWFzb24uZXh0cmFEZWxheSA+IDAgJiYgcmVhc29uLmV4dHJhRGVsYXkgPCAxMDAwKSB7XG4gICAgICAgICAgZGVsYXkgKz0gcmVhc29uLmV4dHJhRGVsYXk7XG4gICAgICAgIH1cbiAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHtcbiAgICAgICAgICAgIGludGVudFN0YXRlLFxuICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgZm9yY2U6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlci5jYW5jZWwobmV3IEFib3J0RXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKSkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IG51bGw7XG4gICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbY3VyQ2FjaGVLZXksIGN1ckludGVudFN0YXRlXSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMpIHtcbiAgICAgIGlmIChjdXJJbnRlbnRTdGF0ZSA9PT0gaW50ZW50U3RhdGUpIHtcbiAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzLmRlbGV0ZShjdXJDYWNoZUtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgfVxuICBnZXQgc3RhdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRzO1xuICB9XG59XG5jbGFzcyBMb29wYmFja1BvcnQge1xuICAjbGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAjZGVmZXJyZWQgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcG9zdE1lc3NhZ2Uob2JqLCB0cmFuc2Zlcikge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgZGF0YTogc3RydWN0dXJlZENsb25lKG9iaiwgdHJhbnNmZXIgPyB7XG4gICAgICAgIHRyYW5zZmVyXG4gICAgICB9IDogbnVsbClcbiAgICB9O1xuICAgIHRoaXMuI2RlZmVycmVkLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLiNsaXN0ZW5lcnMpIHtcbiAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcikge1xuICAgIHRoaXMuI2xpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICB9XG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLiNsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgfVxuICB0ZXJtaW5hdGUoKSB7XG4gICAgdGhpcy4jbGlzdGVuZXJzLmNsZWFyKCk7XG4gIH1cbn1cbmNvbnN0IFBERldvcmtlclV0aWwgPSB7XG4gIGlzV29ya2VyRGlzYWJsZWQ6IGZhbHNlLFxuICBmYWtlV29ya2VySWQ6IDBcbn07XG57XG4gIGlmIChpc05vZGVKUykge1xuICAgIFBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCA9IHRydWU7XG4gICAgR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMgfHw9IFwiLi9wZGYud29ya2VyLm1qc1wiO1xuICB9XG4gIFBERldvcmtlclV0aWwuaXNTYW1lT3JpZ2luID0gZnVuY3Rpb24gKGJhc2VVcmwsIG90aGVyVXJsKSB7XG4gICAgbGV0IGJhc2U7XG4gICAgdHJ5IHtcbiAgICAgIGJhc2UgPSBuZXcgVVJMKGJhc2VVcmwpO1xuICAgICAgaWYgKCFiYXNlLm9yaWdpbiB8fCBiYXNlLm9yaWdpbiA9PT0gXCJudWxsXCIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBvdGhlciA9IG5ldyBVUkwob3RoZXJVcmwsIGJhc2UpO1xuICAgIHJldHVybiBiYXNlLm9yaWdpbiA9PT0gb3RoZXIub3JpZ2luO1xuICB9O1xuICBQREZXb3JrZXJVdGlsLmNyZWF0ZUNETldyYXBwZXIgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGBhd2FpdCBpbXBvcnQoXCIke3VybH1cIik7YDtcbiAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbd3JhcHBlcl0sIHtcbiAgICAgIHR5cGU6IFwidGV4dC9qYXZhc2NyaXB0XCJcbiAgICB9KSk7XG4gIH07XG59XG5jbGFzcyBQREZXb3JrZXIge1xuICBzdGF0aWMgI3dvcmtlclBvcnRzO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbmFtZSA9IG51bGwsXG4gICAgcG9ydCA9IG51bGwsXG4gICAgdmVyYm9zaXR5ID0gZ2V0VmVyYm9zaXR5TGV2ZWwoKVxuICB9ID0ge30pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy52ZXJib3NpdHkgPSB2ZXJib3NpdHk7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fcG9ydCA9IG51bGw7XG4gICAgdGhpcy5fd2ViV29ya2VyID0gbnVsbDtcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7XG4gICAgaWYgKHBvcnQpIHtcbiAgICAgIGlmIChQREZXb3JrZXIuI3dvcmtlclBvcnRzPy5oYXMocG9ydCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSBtb3JlIHRoYW4gb25lIFBERldvcmtlciBwZXIgcG9ydC5cIik7XG4gICAgICB9XG4gICAgICAoUERGV29ya2VyLiN3b3JrZXJQb3J0cyB8fD0gbmV3IFdlYWtNYXAoKSkuc2V0KHBvcnQsIHRoaXMpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pbml0aWFsaXplKCk7XG4gIH1cbiAgZ2V0IHByb21pc2UoKSB7XG4gICAgaWYgKGlzTm9kZUpTKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW05vZGVQYWNrYWdlcy5wcm9taXNlLCB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgI3Jlc29sdmUoKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5zZW5kKFwiY29uZmlndXJlXCIsIHtcbiAgICAgIHZlcmJvc2l0eTogdGhpcy52ZXJib3NpdHlcbiAgICB9KTtcbiAgfVxuICBnZXQgcG9ydCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcG9ydDtcbiAgfVxuICBnZXQgbWVzc2FnZUhhbmRsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VIYW5kbGVyO1xuICB9XG4gIF9pbml0aWFsaXplRnJvbVBvcnQocG9ydCkge1xuICAgIHRoaXMuX3BvcnQgPSBwb3J0O1xuICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKFwibWFpblwiLCBcIndvcmtlclwiLCBwb3J0KTtcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5vbihcInJlYWR5XCIsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICB0aGlzLiNyZXNvbHZlKCk7XG4gIH1cbiAgX2luaXRpYWxpemUoKSB7XG4gICAgaWYgKFBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCB8fCBQREZXb3JrZXIuI21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcikge1xuICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB7XG4gICAgICB3b3JrZXJTcmNcbiAgICB9ID0gUERGV29ya2VyO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIVBERldvcmtlclV0aWwuaXNTYW1lT3JpZ2luKHdpbmRvdy5sb2NhdGlvbi5ocmVmLCB3b3JrZXJTcmMpKSB7XG4gICAgICAgIHdvcmtlclNyYyA9IFBERldvcmtlclV0aWwuY3JlYXRlQ0ROV3JhcHBlcihuZXcgVVJMKHdvcmtlclNyYywgd2luZG93LmxvY2F0aW9uKS5ocmVmKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyU3JjLCB7XG4gICAgICAgIHR5cGU6IFwibW9kdWxlXCJcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoXCJtYWluXCIsIFwid29ya2VyXCIsIHdvcmtlcik7XG4gICAgICBjb25zdCB0ZXJtaW5hdGVFYXJseSA9ICgpID0+IHtcbiAgICAgICAgYWMuYWJvcnQoKTtcbiAgICAgICAgbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl93ZWJXb3JrZXIpIHtcbiAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIHNpZ25hbDogYWMuc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwidGVzdFwiLCBkYXRhID0+IHtcbiAgICAgICAgYWMuYWJvcnQoKTtcbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkIHx8ICFkYXRhKSB7XG4gICAgICAgICAgdGVybWluYXRlRWFybHkoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjtcbiAgICAgICAgdGhpcy5fcG9ydCA9IHdvcmtlcjtcbiAgICAgICAgdGhpcy5fd2ViV29ya2VyID0gd29ya2VyO1xuICAgICAgICB0aGlzLiNyZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwicmVhZHlcIiwgZGF0YSA9PiB7XG4gICAgICAgIGFjLmFib3J0KCk7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2VuZFRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2VuZFRlc3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlc3RPYmogPSBuZXcgVWludDhBcnJheSgpO1xuICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKFwidGVzdFwiLCB0ZXN0T2JqLCBbdGVzdE9iai5idWZmZXJdKTtcbiAgICAgIH07XG4gICAgICBzZW5kVGVzdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgaW5mbyhcIlRoZSB3b3JrZXIgaGFzIGJlZW4gZGlzYWJsZWQuXCIpO1xuICAgIH1cbiAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgfVxuICBfc2V0dXBGYWtlV29ya2VyKCkge1xuICAgIGlmICghUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkKSB7XG4gICAgICB3YXJuKFwiU2V0dGluZyB1cCBmYWtlIHdvcmtlci5cIik7XG4gICAgICBQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBQREZXb3JrZXIuX3NldHVwRmFrZVdvcmtlckdsb2JhbC50aGVuKFdvcmtlck1lc3NhZ2VIYW5kbGVyID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcG9ydCA9IG5ldyBMb29wYmFja1BvcnQoKTtcbiAgICAgIHRoaXMuX3BvcnQgPSBwb3J0O1xuICAgICAgY29uc3QgaWQgPSBgZmFrZSR7UERGV29ya2VyVXRpbC5mYWtlV29ya2VySWQrK31gO1xuICAgICAgY29uc3Qgd29ya2VySGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihpZCArIFwiX3dvcmtlclwiLCBpZCwgcG9ydCk7XG4gICAgICBXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cCh3b3JrZXJIYW5kbGVyLCBwb3J0KTtcbiAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKGlkLCBpZCArIFwiX3dvcmtlclwiLCBwb3J0KTtcbiAgICAgIHRoaXMuI3Jlc29sdmUoKTtcbiAgICB9KS5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoYFNldHRpbmcgdXAgZmFrZSB3b3JrZXIgZmFpbGVkOiBcIiR7cmVhc29uLm1lc3NhZ2V9XCIuYCkpO1xuICAgIH0pO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLl93ZWJXb3JrZXIpIHtcbiAgICAgIHRoaXMuX3dlYldvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgIHRoaXMuX3dlYldvcmtlciA9IG51bGw7XG4gICAgfVxuICAgIFBERldvcmtlci4jd29ya2VyUG9ydHM/LmRlbGV0ZSh0aGlzLl9wb3J0KTtcbiAgICB0aGlzLl9wb3J0ID0gbnVsbDtcbiAgICBpZiAodGhpcy5fbWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGZyb21Qb3J0KHBhcmFtcykge1xuICAgIGlmICghcGFyYW1zPy5wb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQREZXb3JrZXIuZnJvbVBvcnQgLSBpbnZhbGlkIG1ldGhvZCBzaWduYXR1cmUuXCIpO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZWRQb3J0ID0gdGhpcy4jd29ya2VyUG9ydHM/LmdldChwYXJhbXMucG9ydCk7XG4gICAgaWYgKGNhY2hlZFBvcnQpIHtcbiAgICAgIGlmIChjYWNoZWRQb3J0Ll9wZW5kaW5nRGVzdHJveSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQREZXb3JrZXIuZnJvbVBvcnQgLSB0aGUgd29ya2VyIGlzIGJlaW5nIGRlc3Ryb3llZC5cXG5cIiArIFwiUGxlYXNlIHJlbWVtYmVyIHRvIGF3YWl0IGBQREZEb2N1bWVudExvYWRpbmdUYXNrLmRlc3Ryb3koKWAtY2FsbHMuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhY2hlZFBvcnQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUERGV29ya2VyKHBhcmFtcyk7XG4gIH1cbiAgc3RhdGljIGdldCB3b3JrZXJTcmMoKSB7XG4gICAgaWYgKEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjKSB7XG4gICAgICByZXR1cm4gR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmM7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignTm8gXCJHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyY1wiIHNwZWNpZmllZC4nKTtcbiAgfVxuICBzdGF0aWMgZ2V0ICNtYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLnBkZmpzV29ya2VyPy5Xb3JrZXJNZXNzYWdlSGFuZGxlciB8fCBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgX3NldHVwRmFrZVdvcmtlckdsb2JhbCgpIHtcbiAgICBjb25zdCBsb2FkZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy4jbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNtYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgICB9XG4gICAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCBpbXBvcnQoIC8qd2VicGFja0lnbm9yZTogdHJ1ZSovdGhpcy53b3JrZXJTcmMpO1xuICAgICAgcmV0dXJuIHdvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICB9O1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfc2V0dXBGYWtlV29ya2VyR2xvYmFsXCIsIGxvYWRlcigpKTtcbiAgfVxufVxuY2xhc3MgV29ya2VyVHJhbnNwb3J0IHtcbiAgI21ldGhvZFByb21pc2VzID0gbmV3IE1hcCgpO1xuICAjcGFnZUNhY2hlID0gbmV3IE1hcCgpO1xuICAjcGFnZVByb21pc2VzID0gbmV3IE1hcCgpO1xuICAjcGFnZVJlZkNhY2hlID0gbmV3IE1hcCgpO1xuICAjcGFzc3dvcmRDYXBhYmlsaXR5ID0gbnVsbDtcbiAgY29uc3RydWN0b3IobWVzc2FnZUhhbmRsZXIsIGxvYWRpbmdUYXNrLCBuZXR3b3JrU3RyZWFtLCBwYXJhbXMsIGZhY3RvcnkpIHtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7XG4gICAgdGhpcy5sb2FkaW5nVGFzayA9IGxvYWRpbmdUYXNrO1xuICAgIHRoaXMuY29tbW9uT2JqcyA9IG5ldyBQREZPYmplY3RzKCk7XG4gICAgdGhpcy5mb250TG9hZGVyID0gbmV3IEZvbnRMb2FkZXIoe1xuICAgICAgb3duZXJEb2N1bWVudDogcGFyYW1zLm93bmVyRG9jdW1lbnQsXG4gICAgICBzdHlsZUVsZW1lbnQ6IHBhcmFtcy5zdHlsZUVsZW1lbnRcbiAgICB9KTtcbiAgICB0aGlzLmxvYWRpbmdQYXJhbXMgPSBwYXJhbXMubG9hZGluZ1BhcmFtcztcbiAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gZmFjdG9yeS5jYW52YXNGYWN0b3J5O1xuICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IGZhY3RvcnkuZmlsdGVyRmFjdG9yeTtcbiAgICB0aGlzLmNNYXBSZWFkZXJGYWN0b3J5ID0gZmFjdG9yeS5jTWFwUmVhZGVyRmFjdG9yeTtcbiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZmFjdG9yeS5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkgPSBudWxsO1xuICAgIHRoaXMuX25ldHdvcmtTdHJlYW0gPSBuZXR3b3JrU3RyZWFtO1xuICAgIHRoaXMuX2Z1bGxSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX2xhc3RQcm9ncmVzcyA9IG51bGw7XG4gICAgdGhpcy5kb3dubG9hZEluZm9DYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5zZXR1cE1lc3NhZ2VIYW5kbGVyKCk7XG4gIH1cbiAgI2NhY2hlU2ltcGxlTWV0aG9kKG5hbWUsIGRhdGEgPSBudWxsKSB7XG4gICAgY29uc3QgY2FjaGVkUHJvbWlzZSA9IHRoaXMuI21ldGhvZFByb21pc2VzLmdldChuYW1lKTtcbiAgICBpZiAoY2FjaGVkUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGNhY2hlZFByb21pc2U7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShuYW1lLCBkYXRhKTtcbiAgICB0aGlzLiNtZXRob2RQcm9taXNlcy5zZXQobmFtZSwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cbiAgZ2V0IGFubm90YXRpb25TdG9yYWdlKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJhbm5vdGF0aW9uU3RvcmFnZVwiLCBuZXcgQW5ub3RhdGlvblN0b3JhZ2UoKSk7XG4gIH1cbiAgZ2V0UmVuZGVyaW5nSW50ZW50KGludGVudCwgYW5ub3RhdGlvbk1vZGUgPSBBbm5vdGF0aW9uTW9kZS5FTkFCTEUsIHByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsLCBpc09wTGlzdCA9IGZhbHNlKSB7XG4gICAgbGV0IHJlbmRlcmluZ0ludGVudCA9IFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWTtcbiAgICBsZXQgYW5ub3RhdGlvblN0b3JhZ2VTZXJpYWxpemFibGUgPSBTZXJpYWxpemFibGVFbXB0eTtcbiAgICBzd2l0Y2ggKGludGVudCkge1xuICAgICAgY2FzZSBcImFueVwiOlxuICAgICAgICByZW5kZXJpbmdJbnRlbnQgPSBSZW5kZXJpbmdJbnRlbnRGbGFnLkFOWTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGlzcGxheVwiOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJwcmludFwiOlxuICAgICAgICByZW5kZXJpbmdJbnRlbnQgPSBSZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHdhcm4oYGdldFJlbmRlcmluZ0ludGVudCAtIGludmFsaWQgaW50ZW50OiAke2ludGVudH1gKTtcbiAgICB9XG4gICAgc3dpdGNoIChhbm5vdGF0aW9uTW9kZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uTW9kZS5ESVNBQkxFOlxuICAgICAgICByZW5kZXJpbmdJbnRlbnQgKz0gUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19ESVNBQkxFO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbk1vZGUuRU5BQkxFOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbk1vZGUuRU5BQkxFX0ZPUk1TOlxuICAgICAgICByZW5kZXJpbmdJbnRlbnQgKz0gUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19GT1JNUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25Nb2RlLkVOQUJMRV9TVE9SQUdFOlxuICAgICAgICByZW5kZXJpbmdJbnRlbnQgKz0gUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19TVE9SQUdFO1xuICAgICAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHJlbmRlcmluZ0ludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQgJiYgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSBpbnN0YW5jZW9mIFByaW50QW5ub3RhdGlvblN0b3JhZ2UgPyBwcmludEFubm90YXRpb25TdG9yYWdlIDogdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2VTZXJpYWxpemFibGUgPSBhbm5vdGF0aW9uU3RvcmFnZS5zZXJpYWxpemFibGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgd2FybihgZ2V0UmVuZGVyaW5nSW50ZW50IC0gaW52YWxpZCBhbm5vdGF0aW9uTW9kZTogJHthbm5vdGF0aW9uTW9kZX1gKTtcbiAgICB9XG4gICAgaWYgKGlzT3BMaXN0KSB7XG4gICAgICByZW5kZXJpbmdJbnRlbnQgKz0gUmVuZGVyaW5nSW50ZW50RmxhZy5PUExJU1Q7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZW5kZXJpbmdJbnRlbnQsXG4gICAgICBjYWNoZUtleTogYCR7cmVuZGVyaW5nSW50ZW50fV8ke2Fubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlLmhhc2h9YCxcbiAgICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlXG4gICAgfTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5KSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuI3Bhc3N3b3JkQ2FwYWJpbGl0eT8ucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkIGR1cmluZyBvblBhc3N3b3JkIGNhbGxiYWNrXCIpKTtcbiAgICBjb25zdCB3YWl0T24gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgdGhpcy4jcGFnZUNhY2hlLnZhbHVlcygpKSB7XG4gICAgICB3YWl0T24ucHVzaChwYWdlLl9kZXN0cm95KCkpO1xuICAgIH1cbiAgICB0aGlzLiNwYWdlQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLiNwYWdlUHJvbWlzZXMuY2xlYXIoKTtcbiAgICB0aGlzLiNwYWdlUmVmQ2FjaGUuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShcImFubm90YXRpb25TdG9yYWdlXCIpKSB7XG4gICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnJlc2V0TW9kaWZpZWQoKTtcbiAgICB9XG4gICAgY29uc3QgdGVybWluYXRlZCA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiVGVybWluYXRlXCIsIG51bGwpO1xuICAgIHdhaXRPbi5wdXNoKHRlcm1pbmF0ZWQpO1xuICAgIFByb21pc2UuYWxsKHdhaXRPbikudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmNvbW1vbk9ianMuY2xlYXIoKTtcbiAgICAgIHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuICAgICAgdGhpcy4jbWV0aG9kUHJvbWlzZXMuY2xlYXIoKTtcbiAgICAgIHRoaXMuZmlsdGVyRmFjdG9yeS5kZXN0cm95KCk7XG4gICAgICBUZXh0TGF5ZXIuY2xlYW51cCgpO1xuICAgICAgdGhpcy5fbmV0d29ya1N0cmVhbT8uY2FuY2VsQWxsUmVxdWVzdHMobmV3IEFib3J0RXhjZXB0aW9uKFwiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLlwiKSk7XG4gICAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9LCB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBzZXR1cE1lc3NhZ2VIYW5kbGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lc3NhZ2VIYW5kbGVyLFxuICAgICAgbG9hZGluZ1Rhc2tcbiAgICB9ID0gdGhpcztcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkdldFJlYWRlclwiLCAoZGF0YSwgc2luaykgPT4ge1xuICAgICAgYXNzZXJ0KHRoaXMuX25ldHdvcmtTdHJlYW0sIFwiR2V0UmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIik7XG4gICAgICB0aGlzLl9mdWxsUmVhZGVyID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyKCk7XG4gICAgICB0aGlzLl9mdWxsUmVhZGVyLm9uUHJvZ3Jlc3MgPSBldnQgPT4ge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSB7XG4gICAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkLFxuICAgICAgICAgIHRvdGFsOiBldnQudG90YWxcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICBzaW5rLm9uUHVsbCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoe1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGRvbmVcbiAgICAgICAgfSkge1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBzaW5rLmNsb3NlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2VydCh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyLCBcIkdldFJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLlwiKTtcbiAgICAgICAgICBzaW5rLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpLCAxLCBbdmFsdWVdKTtcbiAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHNpbmsub25DYW5jZWwgPSByZWFzb24gPT4ge1xuICAgICAgICB0aGlzLl9mdWxsUmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgICAgICBzaW5rLnJlYWR5LmNhdGNoKHJlYWR5UmVhc29uID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVhZHlSZWFzb247XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIlJlYWRlckhlYWRlcnNSZWFkeVwiLCBkYXRhID0+IHtcbiAgICAgIGNvbnN0IGhlYWRlcnNDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICBjb25zdCBmdWxsUmVhZGVyID0gdGhpcy5fZnVsbFJlYWRlcjtcbiAgICAgIGZ1bGxSZWFkZXIuaGVhZGVyc1JlYWR5LnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAoIWZ1bGxSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQgfHwgIWZ1bGxSZWFkZXIuaXNSYW5nZVN1cHBvcnRlZCkge1xuICAgICAgICAgIGlmICh0aGlzLl9sYXN0UHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3M/Lih0aGlzLl9sYXN0UHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmdWxsUmVhZGVyLm9uUHJvZ3Jlc3MgPSBldnQgPT4ge1xuICAgICAgICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcz8uKHtcbiAgICAgICAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkLFxuICAgICAgICAgICAgICB0b3RhbDogZXZ0LnRvdGFsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGhlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICAgIGlzU3RyZWFtaW5nU3VwcG9ydGVkOiBmdWxsUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkLFxuICAgICAgICAgIGlzUmFuZ2VTdXBwb3J0ZWQ6IGZ1bGxSZWFkZXIuaXNSYW5nZVN1cHBvcnRlZCxcbiAgICAgICAgICBjb250ZW50TGVuZ3RoOiBmdWxsUmVhZGVyLmNvbnRlbnRMZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9LCBoZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QpO1xuICAgICAgcmV0dXJuIGhlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJHZXRSYW5nZVJlYWRlclwiLCAoZGF0YSwgc2luaykgPT4ge1xuICAgICAgYXNzZXJ0KHRoaXMuX25ldHdvcmtTdHJlYW0sIFwiR2V0UmFuZ2VSZWFkZXIgLSBubyBgSVBERlN0cmVhbWAgaW5zdGFuY2UgYXZhaWxhYmxlLlwiKTtcbiAgICAgIGNvbnN0IHJhbmdlUmVhZGVyID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcihkYXRhLmJlZ2luLCBkYXRhLmVuZCk7XG4gICAgICBpZiAoIXJhbmdlUmVhZGVyKSB7XG4gICAgICAgIHNpbmsuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2luay5vblB1bGwgPSAoKSA9PiB7XG4gICAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uICh7XG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgZG9uZVxuICAgICAgICB9KSB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHNpbmsuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXJ0KHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsIFwiR2V0UmFuZ2VSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci5cIik7XG4gICAgICAgICAgc2luay5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHZhbHVlKSwgMSwgW3ZhbHVlXSk7XG4gICAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgICAgc2luay5lcnJvcihyZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBzaW5rLm9uQ2FuY2VsID0gcmVhc29uID0+IHtcbiAgICAgICAgcmFuZ2VSZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgICAgIHNpbmsucmVhZHkuY2F0Y2gocmVhZHlSZWFzb24gPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyByZWFkeVJlYXNvbjtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiR2V0RG9jXCIsICh7XG4gICAgICBwZGZJbmZvXG4gICAgfSkgPT4ge1xuICAgICAgdGhpcy5fbnVtUGFnZXMgPSBwZGZJbmZvLm51bVBhZ2VzO1xuICAgICAgdGhpcy5faHRtbEZvclhmYSA9IHBkZkluZm8uaHRtbEZvclhmYTtcbiAgICAgIGRlbGV0ZSBwZGZJbmZvLmh0bWxGb3JYZmE7XG4gICAgICBsb2FkaW5nVGFzay5fY2FwYWJpbGl0eS5yZXNvbHZlKG5ldyBQREZEb2N1bWVudFByb3h5KHBkZkluZm8sIHRoaXMpKTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkRvY0V4Y2VwdGlvblwiLCBmdW5jdGlvbiAoZXgpIHtcbiAgICAgIGxldCByZWFzb247XG4gICAgICBzd2l0Y2ggKGV4Lm5hbWUpIHtcbiAgICAgICAgY2FzZSBcIlBhc3N3b3JkRXhjZXB0aW9uXCI6XG4gICAgICAgICAgcmVhc29uID0gbmV3IFBhc3N3b3JkRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmNvZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiOlxuICAgICAgICAgIHJlYXNvbiA9IG5ldyBJbnZhbGlkUERGRXhjZXB0aW9uKGV4Lm1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTWlzc2luZ1BERkV4Y2VwdGlvblwiOlxuICAgICAgICAgIHJlYXNvbiA9IG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKGV4Lm1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCI6XG4gICAgICAgICAgcmVhc29uID0gbmV3IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5zdGF0dXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCI6XG4gICAgICAgICAgcmVhc29uID0gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5kZXRhaWxzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB1bnJlYWNoYWJsZShcIkRvY0V4Y2VwdGlvbiAtIGV4cGVjdGVkIGEgdmFsaWQgRXJyb3IuXCIpO1xuICAgICAgfVxuICAgICAgbG9hZGluZ1Rhc2suX2NhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJQYXNzd29yZFJlcXVlc3RcIiwgZXhjZXB0aW9uID0+IHtcbiAgICAgIHRoaXMuI3Bhc3N3b3JkQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgaWYgKGxvYWRpbmdUYXNrLm9uUGFzc3dvcmQpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlUGFzc3dvcmQgPSBwYXNzd29yZCA9PiB7XG4gICAgICAgICAgaWYgKHBhc3N3b3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuI3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QocGFzc3dvcmQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHBhc3N3b3JkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9hZGluZ1Rhc2sub25QYXNzd29yZCh1cGRhdGVQYXNzd29yZCwgZXhjZXB0aW9uLmNvZGUpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIHRoaXMuI3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QoZXgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KG5ldyBQYXNzd29yZEV4Y2VwdGlvbihleGNlcHRpb24ubWVzc2FnZSwgZXhjZXB0aW9uLmNvZGUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkRhdGFMb2FkZWRcIiwgZGF0YSA9PiB7XG4gICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzPy4oe1xuICAgICAgICBsb2FkZWQ6IGRhdGEubGVuZ3RoLFxuICAgICAgICB0b3RhbDogZGF0YS5sZW5ndGhcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnJlc29sdmUoZGF0YSk7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJTdGFydFJlbmRlclBhZ2VcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFnZSA9IHRoaXMuI3BhZ2VDYWNoZS5nZXQoZGF0YS5wYWdlSW5kZXgpO1xuICAgICAgcGFnZS5fc3RhcnRSZW5kZXJQYWdlKGRhdGEudHJhbnNwYXJlbmN5LCBkYXRhLmNhY2hlS2V5KTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcImNvbW1vbm9ialwiLCAoW2lkLCB0eXBlLCBleHBvcnRlZERhdGFdKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb21tb25PYmpzLmhhcyhpZCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBkaXNhYmxlRm9udEZhY2UsXG4gICAgICAgICAgICBmb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcGRmQnVnXG4gICAgICAgICAgfSA9IHRoaXMuX3BhcmFtcztcbiAgICAgICAgICBpZiAoXCJlcnJvclwiIGluIGV4cG9ydGVkRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWRFcnJvciA9IGV4cG9ydGVkRGF0YS5lcnJvcjtcbiAgICAgICAgICAgIHdhcm4oYEVycm9yIGR1cmluZyBmb250IGxvYWRpbmc6ICR7ZXhwb3J0ZWRFcnJvcn1gKTtcbiAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBleHBvcnRlZEVycm9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBpbnNwZWN0Rm9udCA9IHBkZkJ1ZyAmJiBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3I/LmVuYWJsZWQgPyAoZm9udCwgdXJsKSA9PiBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IuZm9udEFkZGVkKGZvbnQsIHVybCkgOiBudWxsO1xuICAgICAgICAgIGNvbnN0IGZvbnQgPSBuZXcgRm9udEZhY2VPYmplY3QoZXhwb3J0ZWREYXRhLCB7XG4gICAgICAgICAgICBkaXNhYmxlRm9udEZhY2UsXG4gICAgICAgICAgICBpbnNwZWN0Rm9udFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZm9udExvYWRlci5iaW5kKGZvbnQpLmNhdGNoKCgpID0+IG1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkZvbnRGYWxsYmFja1wiLCB7XG4gICAgICAgICAgICBpZFxuICAgICAgICAgIH0pKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghZm9udEV4dHJhUHJvcGVydGllcyAmJiBmb250LmRhdGEpIHtcbiAgICAgICAgICAgICAgZm9udC5kYXRhID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBmb250KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkNvcHlMb2NhbEltYWdlXCI6XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgaW1hZ2VSZWZcbiAgICAgICAgICB9ID0gZXhwb3J0ZWREYXRhO1xuICAgICAgICAgIGFzc2VydChpbWFnZVJlZiwgXCJUaGUgaW1hZ2VSZWYgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2VQcm94eSBvZiB0aGlzLiNwYWdlQ2FjaGUudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgWywgZGF0YV0gb2YgcGFnZVByb3h5Lm9ianMpIHtcbiAgICAgICAgICAgICAgaWYgKGRhdGE/LnJlZiAhPT0gaW1hZ2VSZWYpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWRhdGEuZGF0YUxlbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBzdHJ1Y3R1cmVkQ2xvbmUoZGF0YSkpO1xuICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhTGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkZvbnRQYXRoXCI6XG4gICAgICAgIGNhc2UgXCJJbWFnZVwiOlxuICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBleHBvcnRlZERhdGEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR290IHVua25vd24gY29tbW9uIG9iamVjdCB0eXBlICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwib2JqXCIsIChbaWQsIHBhZ2VJbmRleCwgdHlwZSwgaW1hZ2VEYXRhXSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2VQcm94eSA9IHRoaXMuI3BhZ2VDYWNoZS5nZXQocGFnZUluZGV4KTtcbiAgICAgIGlmIChwYWdlUHJveHkub2Jqcy5oYXMoaWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwYWdlUHJveHkuX2ludGVudFN0YXRlcy5zaXplID09PSAwKSB7XG4gICAgICAgIGltYWdlRGF0YT8uYml0bWFwPy5jbG9zZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcIkltYWdlXCI6XG4gICAgICAgICAgcGFnZVByb3h5Lm9ianMucmVzb2x2ZShpZCwgaW1hZ2VEYXRhKTtcbiAgICAgICAgICBpZiAoaW1hZ2VEYXRhPy5kYXRhTGVuID4gTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEUpIHtcbiAgICAgICAgICAgIHBhZ2VQcm94eS5fbWF5YmVDbGVhbnVwQWZ0ZXJSZW5kZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlBhdHRlcm5cIjpcbiAgICAgICAgICBwYWdlUHJveHkub2Jqcy5yZXNvbHZlKGlkLCBpbWFnZURhdGEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR290IHVua25vd24gb2JqZWN0IHR5cGUgJHt0eXBlfWApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRG9jUHJvZ3Jlc3NcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcz8uKHtcbiAgICAgICAgbG9hZGVkOiBkYXRhLmxvYWRlZCxcbiAgICAgICAgdG90YWw6IGRhdGEudG90YWxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRmV0Y2hCdWlsdEluQ01hcFwiLCBkYXRhID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWQuXCIpKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jTWFwUmVhZGVyRmFjdG9yeSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQ01hcFJlYWRlckZhY3Rvcnkgbm90IGluaXRpYWxpemVkLCBzZWUgdGhlIGB1c2VXb3JrZXJGZXRjaGAgcGFyYW1ldGVyLlwiKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jTWFwUmVhZGVyRmFjdG9yeS5mZXRjaChkYXRhKTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkZldGNoU3RhbmRhcmRGb250RGF0YVwiLCBkYXRhID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWQuXCIpKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkgbm90IGluaXRpYWxpemVkLCBzZWUgdGhlIGB1c2VXb3JrZXJGZXRjaGAgcGFyYW1ldGVyLlwiKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeS5mZXRjaChkYXRhKTtcbiAgICB9KTtcbiAgfVxuICBnZXREYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERhdGFcIiwgbnVsbCk7XG4gIH1cbiAgc2F2ZURvY3VtZW50KCkge1xuICAgIGlmICh0aGlzLmFubm90YXRpb25TdG9yYWdlLnNpemUgPD0gMCkge1xuICAgICAgd2FybihcInNhdmVEb2N1bWVudCBjYWxsZWQgd2hpbGUgYGFubm90YXRpb25TdG9yYWdlYCBpcyBlbXB0eSwgXCIgKyBcInBsZWFzZSB1c2UgdGhlIGdldERhdGEtbWV0aG9kIGluc3RlYWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBtYXAsXG4gICAgICB0cmFuc2ZlclxuICAgIH0gPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNlcmlhbGl6YWJsZTtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJTYXZlRG9jdW1lbnRcIiwge1xuICAgICAgaXNQdXJlWGZhOiAhIXRoaXMuX2h0bWxGb3JYZmEsXG4gICAgICBudW1QYWdlczogdGhpcy5fbnVtUGFnZXMsXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZTogbWFwLFxuICAgICAgZmlsZW5hbWU6IHRoaXMuX2Z1bGxSZWFkZXI/LmZpbGVuYW1lID8/IG51bGxcbiAgICB9LCB0cmFuc2ZlcikuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnJlc2V0TW9kaWZpZWQoKTtcbiAgICB9KTtcbiAgfVxuICBnZXRQYWdlKHBhZ2VOdW1iZXIpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFnZU51bWJlcikgfHwgcGFnZU51bWJlciA8PSAwIHx8IHBhZ2VOdW1iZXIgPiB0aGlzLl9udW1QYWdlcykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgcGFnZSByZXF1ZXN0LlwiKSk7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2VJbmRleCA9IHBhZ2VOdW1iZXIgLSAxLFxuICAgICAgY2FjaGVkUHJvbWlzZSA9IHRoaXMuI3BhZ2VQcm9taXNlcy5nZXQocGFnZUluZGV4KTtcbiAgICBpZiAoY2FjaGVkUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGNhY2hlZFByb21pc2U7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VcIiwge1xuICAgICAgcGFnZUluZGV4XG4gICAgfSkudGhlbihwYWdlSW5mbyA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJhbnNwb3J0IGRlc3Ryb3llZFwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYWdlSW5mby5yZWZTdHIpIHtcbiAgICAgICAgdGhpcy4jcGFnZVJlZkNhY2hlLnNldChwYWdlSW5mby5yZWZTdHIsIHBhZ2VOdW1iZXIpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFnZSA9IG5ldyBQREZQYWdlUHJveHkocGFnZUluZGV4LCBwYWdlSW5mbywgdGhpcywgdGhpcy5fcGFyYW1zLnBkZkJ1Zyk7XG4gICAgICB0aGlzLiNwYWdlQ2FjaGUuc2V0KHBhZ2VJbmRleCwgcGFnZSk7XG4gICAgICByZXR1cm4gcGFnZTtcbiAgICB9KTtcbiAgICB0aGlzLiNwYWdlUHJvbWlzZXMuc2V0KHBhZ2VJbmRleCwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cbiAgZ2V0UGFnZUluZGV4KHJlZikge1xuICAgIGlmICghaXNSZWZQcm94eShyZWYpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBwYWdlSW5kZXggcmVxdWVzdC5cIikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlSW5kZXhcIiwge1xuICAgICAgbnVtOiByZWYubnVtLFxuICAgICAgZ2VuOiByZWYuZ2VuXG4gICAgfSk7XG4gIH1cbiAgZ2V0QW5ub3RhdGlvbnMocGFnZUluZGV4LCBpbnRlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRBbm5vdGF0aW9uc1wiLCB7XG4gICAgICBwYWdlSW5kZXgsXG4gICAgICBpbnRlbnRcbiAgICB9KTtcbiAgfVxuICBnZXRGaWVsZE9iamVjdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlU2ltcGxlTWV0aG9kKFwiR2V0RmllbGRPYmplY3RzXCIpO1xuICB9XG4gIGhhc0pTQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy4jY2FjaGVTaW1wbGVNZXRob2QoXCJIYXNKU0FjdGlvbnNcIik7XG4gIH1cbiAgZ2V0Q2FsY3VsYXRpb25PcmRlcklkcygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRDYWxjdWxhdGlvbk9yZGVySWRzXCIsIG51bGwpO1xuICB9XG4gIGdldERlc3RpbmF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREZXN0aW5hdGlvbnNcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0RGVzdGluYXRpb24oaWQpIHtcbiAgICBpZiAodHlwZW9mIGlkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBkZXN0aW5hdGlvbiByZXF1ZXN0LlwiKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERlc3RpbmF0aW9uXCIsIHtcbiAgICAgIGlkXG4gICAgfSk7XG4gIH1cbiAgZ2V0UGFnZUxhYmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTGFiZWxzXCIsIG51bGwpO1xuICB9XG4gIGdldFBhZ2VMYXlvdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUxheW91dFwiLCBudWxsKTtcbiAgfVxuICBnZXRQYWdlTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTW9kZVwiLCBudWxsKTtcbiAgfVxuICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRWaWV3ZXJQcmVmZXJlbmNlc1wiLCBudWxsKTtcbiAgfVxuICBnZXRPcGVuQWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE9wZW5BY3Rpb25cIiwgbnVsbCk7XG4gIH1cbiAgZ2V0QXR0YWNobWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QXR0YWNobWVudHNcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0RG9jSlNBY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLiNjYWNoZVNpbXBsZU1ldGhvZChcIkdldERvY0pTQWN0aW9uc1wiKTtcbiAgfVxuICBnZXRQYWdlSlNBY3Rpb25zKHBhZ2VJbmRleCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VKU0FjdGlvbnNcIiwge1xuICAgICAgcGFnZUluZGV4XG4gICAgfSk7XG4gIH1cbiAgZ2V0U3RydWN0VHJlZShwYWdlSW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRTdHJ1Y3RUcmVlXCIsIHtcbiAgICAgIHBhZ2VJbmRleFxuICAgIH0pO1xuICB9XG4gIGdldE91dGxpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3V0bGluZVwiLCBudWxsKTtcbiAgfVxuICBnZXRPcHRpb25hbENvbnRlbnRDb25maWcocmVuZGVyaW5nSW50ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlU2ltcGxlTWV0aG9kKFwiR2V0T3B0aW9uYWxDb250ZW50Q29uZmlnXCIpLnRoZW4oZGF0YSA9PiBuZXcgT3B0aW9uYWxDb250ZW50Q29uZmlnKGRhdGEsIHJlbmRlcmluZ0ludGVudCkpO1xuICB9XG4gIGdldFBlcm1pc3Npb25zKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBlcm1pc3Npb25zXCIsIG51bGwpO1xuICB9XG4gIGdldE1ldGFkYXRhKCkge1xuICAgIGNvbnN0IG5hbWUgPSBcIkdldE1ldGFkYXRhXCIsXG4gICAgICBjYWNoZWRQcm9taXNlID0gdGhpcy4jbWV0aG9kUHJvbWlzZXMuZ2V0KG5hbWUpO1xuICAgIGlmIChjYWNoZWRQcm9taXNlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkUHJvbWlzZTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKG5hbWUsIG51bGwpLnRoZW4ocmVzdWx0cyA9PiAoe1xuICAgICAgaW5mbzogcmVzdWx0c1swXSxcbiAgICAgIG1ldGFkYXRhOiByZXN1bHRzWzFdID8gbmV3IE1ldGFkYXRhKHJlc3VsdHNbMV0pIDogbnVsbCxcbiAgICAgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOiB0aGlzLl9mdWxsUmVhZGVyPy5maWxlbmFtZSA/PyBudWxsLFxuICAgICAgY29udGVudExlbmd0aDogdGhpcy5fZnVsbFJlYWRlcj8uY29udGVudExlbmd0aCA/PyBudWxsXG4gICAgfSkpO1xuICAgIHRoaXMuI21ldGhvZFByb21pc2VzLnNldChuYW1lLCBwcm9taXNlKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuICBnZXRNYXJrSW5mbygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRNYXJrSW5mb1wiLCBudWxsKTtcbiAgfVxuICBhc3luYyBzdGFydENsZWFudXAoa2VlcExvYWRlZEZvbnRzID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJDbGVhbnVwXCIsIG51bGwpO1xuICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLiNwYWdlQ2FjaGUudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IGNsZWFudXBTdWNjZXNzZnVsID0gcGFnZS5jbGVhbnVwKCk7XG4gICAgICBpZiAoIWNsZWFudXBTdWNjZXNzZnVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RhcnRDbGVhbnVwOiBQYWdlICR7cGFnZS5wYWdlTnVtYmVyfSBpcyBjdXJyZW50bHkgcmVuZGVyaW5nLmApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbW1vbk9ianMuY2xlYXIoKTtcbiAgICBpZiAoIWtlZXBMb2FkZWRGb250cykge1xuICAgICAgdGhpcy5mb250TG9hZGVyLmNsZWFyKCk7XG4gICAgfVxuICAgIHRoaXMuI21ldGhvZFByb21pc2VzLmNsZWFyKCk7XG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5LmRlc3Ryb3kodHJ1ZSk7XG4gICAgVGV4dExheWVyLmNsZWFudXAoKTtcbiAgfVxuICBjYWNoZWRQYWdlTnVtYmVyKHJlZikge1xuICAgIGlmICghaXNSZWZQcm94eShyZWYpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVmU3RyID0gcmVmLmdlbiA9PT0gMCA/IGAke3JlZi5udW19UmAgOiBgJHtyZWYubnVtfVIke3JlZi5nZW59YDtcbiAgICByZXR1cm4gdGhpcy4jcGFnZVJlZkNhY2hlLmdldChyZWZTdHIpID8/IG51bGw7XG4gIH1cbn1cbmNvbnN0IElOSVRJQUxfREFUQSA9IFN5bWJvbChcIklOSVRJQUxfREFUQVwiKTtcbmNsYXNzIFBERk9iamVjdHMge1xuICAjb2JqcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICNlbnN1cmVPYmoob2JqSWQpIHtcbiAgICByZXR1cm4gdGhpcy4jb2Jqc1tvYmpJZF0gfHw9IHtcbiAgICAgIC4uLlByb21pc2Uud2l0aFJlc29sdmVycygpLFxuICAgICAgZGF0YTogSU5JVElBTF9EQVRBXG4gICAgfTtcbiAgfVxuICBnZXQob2JqSWQsIGNhbGxiYWNrID0gbnVsbCkge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY29uc3Qgb2JqID0gdGhpcy4jZW5zdXJlT2JqKG9iaklkKTtcbiAgICAgIG9iai5wcm9taXNlLnRoZW4oKCkgPT4gY2FsbGJhY2sob2JqLmRhdGEpKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBvYmogPSB0aGlzLiNvYmpzW29iaklkXTtcbiAgICBpZiAoIW9iaiB8fCBvYmouZGF0YSA9PT0gSU5JVElBTF9EQVRBKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcXVlc3Rpbmcgb2JqZWN0IHRoYXQgaXNuJ3QgcmVzb2x2ZWQgeWV0ICR7b2JqSWR9LmApO1xuICAgIH1cbiAgICByZXR1cm4gb2JqLmRhdGE7XG4gIH1cbiAgaGFzKG9iaklkKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy4jb2Jqc1tvYmpJZF07XG4gICAgcmV0dXJuICEhb2JqICYmIG9iai5kYXRhICE9PSBJTklUSUFMX0RBVEE7XG4gIH1cbiAgcmVzb2x2ZShvYmpJZCwgZGF0YSA9IG51bGwpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLiNlbnN1cmVPYmoob2JqSWQpO1xuICAgIG9iai5kYXRhID0gZGF0YTtcbiAgICBvYmoucmVzb2x2ZSgpO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIGZvciAoY29uc3Qgb2JqSWQgaW4gdGhpcy4jb2Jqcykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhXG4gICAgICB9ID0gdGhpcy4jb2Jqc1tvYmpJZF07XG4gICAgICBkYXRhPy5iaXRtYXA/LmNsb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuI29ianMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICBmb3IgKGNvbnN0IG9iaklkIGluIHRoaXMuI29ianMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YVxuICAgICAgfSA9IHRoaXMuI29ianNbb2JqSWRdO1xuICAgICAgaWYgKGRhdGEgPT09IElOSVRJQUxfREFUQSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHlpZWxkIFtvYmpJZCwgZGF0YV07XG4gICAgfVxuICB9XG59XG5jbGFzcyBSZW5kZXJUYXNrIHtcbiAgI2ludGVybmFsUmVuZGVyVGFzayA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKGludGVybmFsUmVuZGVyVGFzaykge1xuICAgIHRoaXMuI2ludGVybmFsUmVuZGVyVGFzayA9IGludGVybmFsUmVuZGVyVGFzaztcbiAgICB0aGlzLm9uQ29udGludWUgPSBudWxsO1xuICB9XG4gIGdldCBwcm9taXNlKCkge1xuICAgIHJldHVybiB0aGlzLiNpbnRlcm5hbFJlbmRlclRhc2suY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGNhbmNlbChleHRyYURlbGF5ID0gMCkge1xuICAgIHRoaXMuI2ludGVybmFsUmVuZGVyVGFzay5jYW5jZWwobnVsbCwgZXh0cmFEZWxheSk7XG4gIH1cbiAgZ2V0IHNlcGFyYXRlQW5ub3RzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNlcGFyYXRlQW5ub3RzXG4gICAgfSA9IHRoaXMuI2ludGVybmFsUmVuZGVyVGFzay5vcGVyYXRvckxpc3Q7XG4gICAgaWYgKCFzZXBhcmF0ZUFubm90cykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBhbm5vdGF0aW9uQ2FudmFzTWFwXG4gICAgfSA9IHRoaXMuI2ludGVybmFsUmVuZGVyVGFzaztcbiAgICByZXR1cm4gc2VwYXJhdGVBbm5vdHMuZm9ybSB8fCBzZXBhcmF0ZUFubm90cy5jYW52YXMgJiYgYW5ub3RhdGlvbkNhbnZhc01hcD8uc2l6ZSA+IDA7XG4gIH1cbn1cbmNsYXNzIEludGVybmFsUmVuZGVyVGFzayB7XG4gICNyQUYgPSBudWxsO1xuICBzdGF0aWMgI2NhbnZhc0luVXNlID0gbmV3IFdlYWtTZXQoKTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNhbGxiYWNrLFxuICAgIHBhcmFtcyxcbiAgICBvYmpzLFxuICAgIGNvbW1vbk9ianMsXG4gICAgYW5ub3RhdGlvbkNhbnZhc01hcCxcbiAgICBvcGVyYXRvckxpc3QsXG4gICAgcGFnZUluZGV4LFxuICAgIGNhbnZhc0ZhY3RvcnksXG4gICAgZmlsdGVyRmFjdG9yeSxcbiAgICB1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmYWxzZSxcbiAgICBwZGZCdWcgPSBmYWxzZSxcbiAgICBwYWdlQ29sb3JzID0gbnVsbFxuICB9KSB7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMub2JqcyA9IG9ianM7XG4gICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2JqcztcbiAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAgPSBhbm5vdGF0aW9uQ2FudmFzTWFwO1xuICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gbnVsbDtcbiAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IG9wZXJhdG9yTGlzdDtcbiAgICB0aGlzLl9wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTtcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSBmaWx0ZXJGYWN0b3J5O1xuICAgIHRoaXMuX3BkZkJ1ZyA9IHBkZkJ1ZztcbiAgICB0aGlzLnBhZ2VDb2xvcnMgPSBwYWdlQ29sb3JzO1xuICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09IHRydWUgJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICB0aGlzLmNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMudGFzayA9IG5ldyBSZW5kZXJUYXNrKHRoaXMpO1xuICAgIHRoaXMuX2NhbmNlbEJvdW5kID0gdGhpcy5jYW5jZWwuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9jb250aW51ZUJvdW5kID0gdGhpcy5fY29udGludWUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zY2hlZHVsZU5leHRCb3VuZCA9IHRoaXMuX3NjaGVkdWxlTmV4dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX25leHRCb3VuZCA9IHRoaXMuX25leHQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9jYW52YXMgPSBwYXJhbXMuY2FudmFzQ29udGV4dC5jYW52YXM7XG4gIH1cbiAgZ2V0IGNvbXBsZXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jYXBhYmlsaXR5LnByb21pc2UuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICB9XG4gIGluaXRpYWxpemVHcmFwaGljcyh7XG4gICAgdHJhbnNwYXJlbmN5ID0gZmFsc2UsXG4gICAgb3B0aW9uYWxDb250ZW50Q29uZmlnXG4gIH0pIHtcbiAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NhbnZhcykge1xuICAgICAgaWYgKEludGVybmFsUmVuZGVyVGFzay4jY2FudmFzSW5Vc2UuaGFzKHRoaXMuX2NhbnZhcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSB0aGUgc2FtZSBjYW52YXMgZHVyaW5nIG11bHRpcGxlIHJlbmRlcigpIG9wZXJhdGlvbnMuIFwiICsgXCJVc2UgZGlmZmVyZW50IGNhbnZhcyBvciBlbnN1cmUgcHJldmlvdXMgb3BlcmF0aW9ucyB3ZXJlIFwiICsgXCJjYW5jZWxsZWQgb3IgY29tcGxldGVkLlwiKTtcbiAgICAgIH1cbiAgICAgIEludGVybmFsUmVuZGVyVGFzay4jY2FudmFzSW5Vc2UuYWRkKHRoaXMuX2NhbnZhcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9wZGZCdWcgJiYgZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlcj8uZW5hYmxlZCkge1xuICAgICAgdGhpcy5zdGVwcGVyID0gZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlci5jcmVhdGUodGhpcy5fcGFnZUluZGV4KTtcbiAgICAgIHRoaXMuc3RlcHBlci5pbml0KHRoaXMub3BlcmF0b3JMaXN0KTtcbiAgICAgIHRoaXMuc3RlcHBlci5uZXh0QnJlYWtQb2ludCA9IHRoaXMuc3RlcHBlci5nZXROZXh0QnJlYWtQb2ludCgpO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjYW52YXNDb250ZXh0LFxuICAgICAgdmlld3BvcnQsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICBiYWNrZ3JvdW5kXG4gICAgfSA9IHRoaXMucGFyYW1zO1xuICAgIHRoaXMuZ2Z4ID0gbmV3IENhbnZhc0dyYXBoaWNzKGNhbnZhc0NvbnRleHQsIHRoaXMuY29tbW9uT2JqcywgdGhpcy5vYmpzLCB0aGlzLmNhbnZhc0ZhY3RvcnksIHRoaXMuZmlsdGVyRmFjdG9yeSwge1xuICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnXG4gICAgfSwgdGhpcy5hbm5vdGF0aW9uQ2FudmFzTWFwLCB0aGlzLnBhZ2VDb2xvcnMpO1xuICAgIHRoaXMuZ2Z4LmJlZ2luRHJhd2luZyh7XG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICB2aWV3cG9ydCxcbiAgICAgIHRyYW5zcGFyZW5jeSxcbiAgICAgIGJhY2tncm91bmRcbiAgICB9KTtcbiAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IDA7XG4gICAgdGhpcy5ncmFwaGljc1JlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaz8uKCk7XG4gIH1cbiAgY2FuY2VsKGVycm9yID0gbnVsbCwgZXh0cmFEZWxheSA9IDApIHtcbiAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgdGhpcy5nZng/LmVuZERyYXdpbmcoKTtcbiAgICBpZiAodGhpcy4jckFGKSB7XG4gICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy4jckFGKTtcbiAgICAgIHRoaXMuI3JBRiA9IG51bGw7XG4gICAgfVxuICAgIEludGVybmFsUmVuZGVyVGFzay4jY2FudmFzSW5Vc2UuZGVsZXRlKHRoaXMuX2NhbnZhcyk7XG4gICAgdGhpcy5jYWxsYmFjayhlcnJvciB8fCBuZXcgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKGBSZW5kZXJpbmcgY2FuY2VsbGVkLCBwYWdlICR7dGhpcy5fcGFnZUluZGV4ICsgMX1gLCBleHRyYURlbGF5KSk7XG4gIH1cbiAgb3BlcmF0b3JMaXN0Q2hhbmdlZCgpIHtcbiAgICBpZiAoIXRoaXMuZ3JhcGhpY3NSZWFkeSkge1xuICAgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgfHw9IHRoaXMuX2NvbnRpbnVlQm91bmQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RlcHBlcj8udXBkYXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0KTtcbiAgICBpZiAodGhpcy5ydW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NvbnRpbnVlKCk7XG4gIH1cbiAgX2NvbnRpbnVlKCkge1xuICAgIHRoaXMucnVubmluZyA9IHRydWU7XG4gICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnRhc2sub25Db250aW51ZSkge1xuICAgICAgdGhpcy50YXNrLm9uQ29udGludWUodGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zY2hlZHVsZU5leHQoKTtcbiAgICB9XG4gIH1cbiAgX3NjaGVkdWxlTmV4dCgpIHtcbiAgICBpZiAodGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICB0aGlzLiNyQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy4jckFGID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbmV4dEJvdW5kKCkuY2F0Y2godGhpcy5fY2FuY2VsQm91bmQpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy5fbmV4dEJvdW5kKS5jYXRjaCh0aGlzLl9jYW5jZWxCb3VuZCk7XG4gICAgfVxuICB9XG4gIGFzeW5jIF9uZXh0KCkge1xuICAgIGlmICh0aGlzLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IHRoaXMuZ2Z4LmV4ZWN1dGVPcGVyYXRvckxpc3QodGhpcy5vcGVyYXRvckxpc3QsIHRoaXMub3BlcmF0b3JMaXN0SWR4LCB0aGlzLl9jb250aW51ZUJvdW5kLCB0aGlzLnN0ZXBwZXIpO1xuICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdElkeCA9PT0gdGhpcy5vcGVyYXRvckxpc3QuYXJnc0FycmF5Lmxlbmd0aCkge1xuICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG4gICAgICAgIHRoaXMuZ2Z4LmVuZERyYXdpbmcoKTtcbiAgICAgICAgSW50ZXJuYWxSZW5kZXJUYXNrLiNjYW52YXNJblVzZS5kZWxldGUodGhpcy5fY2FudmFzKTtcbiAgICAgICAgdGhpcy5jYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY29uc3QgdmVyc2lvbiA9IFwiNC40LjE2OFwiO1xuY29uc3QgYnVpbGQgPSBcIjE5ZmJjODk5OFwiO1xuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvc2hhcmVkL3NjcmlwdGluZ191dGlscy5qc1xuZnVuY3Rpb24gbWFrZUNvbG9yQ29tcChuKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG4pKSAqIDI1NSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbn1cbmZ1bmN0aW9uIHNjYWxlQW5kQ2xhbXAoeCkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCAyNTUgKiB4KSk7XG59XG5jbGFzcyBDb2xvckNvbnZlcnRlcnMge1xuICBzdGF0aWMgQ01ZS19HKFtjLCB5LCBtLCBrXSkge1xuICAgIHJldHVybiBbXCJHXCIsIDEgLSBNYXRoLm1pbigxLCAwLjMgKiBjICsgMC41OSAqIG0gKyAwLjExICogeSArIGspXTtcbiAgfVxuICBzdGF0aWMgR19DTVlLKFtnXSkge1xuICAgIHJldHVybiBbXCJDTVlLXCIsIDAsIDAsIDAsIDEgLSBnXTtcbiAgfVxuICBzdGF0aWMgR19SR0IoW2ddKSB7XG4gICAgcmV0dXJuIFtcIlJHQlwiLCBnLCBnLCBnXTtcbiAgfVxuICBzdGF0aWMgR19yZ2IoW2ddKSB7XG4gICAgZyA9IHNjYWxlQW5kQ2xhbXAoZyk7XG4gICAgcmV0dXJuIFtnLCBnLCBnXTtcbiAgfVxuICBzdGF0aWMgR19IVE1MKFtnXSkge1xuICAgIGNvbnN0IEcgPSBtYWtlQ29sb3JDb21wKGcpO1xuICAgIHJldHVybiBgIyR7R30ke0d9JHtHfWA7XG4gIH1cbiAgc3RhdGljIFJHQl9HKFtyLCBnLCBiXSkge1xuICAgIHJldHVybiBbXCJHXCIsIDAuMyAqIHIgKyAwLjU5ICogZyArIDAuMTEgKiBiXTtcbiAgfVxuICBzdGF0aWMgUkdCX3JnYihjb2xvcikge1xuICAgIHJldHVybiBjb2xvci5tYXAoc2NhbGVBbmRDbGFtcCk7XG4gIH1cbiAgc3RhdGljIFJHQl9IVE1MKGNvbG9yKSB7XG4gICAgcmV0dXJuIGAjJHtjb2xvci5tYXAobWFrZUNvbG9yQ29tcCkuam9pbihcIlwiKX1gO1xuICB9XG4gIHN0YXRpYyBUX0hUTUwoKSB7XG4gICAgcmV0dXJuIFwiIzAwMDAwMDAwXCI7XG4gIH1cbiAgc3RhdGljIFRfcmdiKCkge1xuICAgIHJldHVybiBbbnVsbF07XG4gIH1cbiAgc3RhdGljIENNWUtfUkdCKFtjLCB5LCBtLCBrXSkge1xuICAgIHJldHVybiBbXCJSR0JcIiwgMSAtIE1hdGgubWluKDEsIGMgKyBrKSwgMSAtIE1hdGgubWluKDEsIG0gKyBrKSwgMSAtIE1hdGgubWluKDEsIHkgKyBrKV07XG4gIH1cbiAgc3RhdGljIENNWUtfcmdiKFtjLCB5LCBtLCBrXSkge1xuICAgIHJldHVybiBbc2NhbGVBbmRDbGFtcCgxIC0gTWF0aC5taW4oMSwgYyArIGspKSwgc2NhbGVBbmRDbGFtcCgxIC0gTWF0aC5taW4oMSwgbSArIGspKSwgc2NhbGVBbmRDbGFtcCgxIC0gTWF0aC5taW4oMSwgeSArIGspKV07XG4gIH1cbiAgc3RhdGljIENNWUtfSFRNTChjb21wb25lbnRzKSB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5DTVlLX1JHQihjb21wb25lbnRzKS5zbGljZSgxKTtcbiAgICByZXR1cm4gdGhpcy5SR0JfSFRNTChyZ2IpO1xuICB9XG4gIHN0YXRpYyBSR0JfQ01ZSyhbciwgZywgYl0pIHtcbiAgICBjb25zdCBjID0gMSAtIHI7XG4gICAgY29uc3QgbSA9IDEgLSBnO1xuICAgIGNvbnN0IHkgPSAxIC0gYjtcbiAgICBjb25zdCBrID0gTWF0aC5taW4oYywgbSwgeSk7XG4gICAgcmV0dXJuIFtcIkNNWUtcIiwgYywgbSwgeSwga107XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkveGZhX2xheWVyLmpzXG5cbmNsYXNzIFhmYUxheWVyIHtcbiAgc3RhdGljIHNldHVwU3RvcmFnZShodG1sLCBpZCwgZWxlbWVudCwgc3RvcmFnZSwgaW50ZW50KSB7XG4gICAgY29uc3Qgc3RvcmVkRGF0YSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgIHZhbHVlOiBudWxsXG4gICAgfSk7XG4gICAgc3dpdGNoIChlbGVtZW50Lm5hbWUpIHtcbiAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGh0bWwudGV4dENvbnRlbnQgPSBzdG9yZWREYXRhLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlbnQgPT09IFwicHJpbnRcIikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICBpZiAoZWxlbWVudC5hdHRyaWJ1dGVzLnR5cGUgPT09IFwicmFkaW9cIiB8fCBlbGVtZW50LmF0dHJpYnV0ZXMudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUgPT09IGVsZW1lbnQuYXR0cmlidXRlcy54ZmFPbikge1xuICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHRydWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RvcmVkRGF0YS52YWx1ZSA9PT0gZWxlbWVudC5hdHRyaWJ1dGVzLnhmYU9mZikge1xuICAgICAgICAgICAgaHRtbC5yZW1vdmVBdHRyaWJ1dGUoXCJjaGVja2VkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaW50ZW50ID09PSBcInByaW50XCIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LmNoZWNrZWQgPyBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKFwieGZhT25cIikgOiBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKFwieGZhT2ZmXCIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBzdG9yZWREYXRhLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGludGVudCA9PT0gXCJwcmludFwiKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShcInZhbHVlXCIsIHN0b3JlZERhdGEudmFsdWUpO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uYXR0cmlidXRlcy52YWx1ZSA9PT0gc3RvcmVkRGF0YS52YWx1ZSkge1xuICAgICAgICAgICAgICBvcHRpb24uYXR0cmlidXRlcy5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KFwic2VsZWN0ZWRcIikpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbi5hdHRyaWJ1dGVzLnNlbGVjdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGV2ZW50LnRhcmdldC5vcHRpb25zO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy5zZWxlY3RlZEluZGV4ID09PSAtMSA/IFwiXCIgOiBvcHRpb25zW29wdGlvbnMuc2VsZWN0ZWRJbmRleF0udmFsdWU7XG4gICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgc2V0QXR0cmlidXRlcyh7XG4gICAgaHRtbCxcbiAgICBlbGVtZW50LFxuICAgIHN0b3JhZ2UgPSBudWxsLFxuICAgIGludGVudCxcbiAgICBsaW5rU2VydmljZVxuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgYXR0cmlidXRlc1xuICAgIH0gPSBlbGVtZW50O1xuICAgIGNvbnN0IGlzSFRNTEFuY2hvckVsZW1lbnQgPSBodG1sIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgaWYgKGF0dHJpYnV0ZXMudHlwZSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICBhdHRyaWJ1dGVzLm5hbWUgPSBgJHthdHRyaWJ1dGVzLm5hbWV9LSR7aW50ZW50fWA7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgXCJjbGFzc1wiOlxuICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUuam9pbihcIiBcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRhdGFJZFwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaWRcIjpcbiAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJzdHlsZVwiOlxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oaHRtbC5zdHlsZSwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidGV4dENvbnRlbnRcIjpcbiAgICAgICAgICBodG1sLnRleHRDb250ZW50ID0gdmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFpc0hUTUxBbmNob3JFbGVtZW50IHx8IGtleSAhPT0gXCJocmVmXCIgJiYga2V5ICE9PSBcIm5ld1dpbmRvd1wiKSB7XG4gICAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0hUTUxBbmNob3JFbGVtZW50KSB7XG4gICAgICBsaW5rU2VydmljZS5hZGRMaW5rQXR0cmlidXRlcyhodG1sLCBhdHRyaWJ1dGVzLmhyZWYsIGF0dHJpYnV0ZXMubmV3V2luZG93KTtcbiAgICB9XG4gICAgaWYgKHN0b3JhZ2UgJiYgYXR0cmlidXRlcy5kYXRhSWQpIHtcbiAgICAgIHRoaXMuc2V0dXBTdG9yYWdlKGh0bWwsIGF0dHJpYnV0ZXMuZGF0YUlkLCBlbGVtZW50LCBzdG9yYWdlKTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIHJlbmRlcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHBhcmFtZXRlcnMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgY29uc3QgbGlua1NlcnZpY2UgPSBwYXJhbWV0ZXJzLmxpbmtTZXJ2aWNlO1xuICAgIGNvbnN0IHJvb3QgPSBwYXJhbWV0ZXJzLnhmYUh0bWw7XG4gICAgY29uc3QgaW50ZW50ID0gcGFyYW1ldGVycy5pbnRlbnQgfHwgXCJkaXNwbGF5XCI7XG4gICAgY29uc3Qgcm9vdEh0bWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHJvb3QubmFtZSk7XG4gICAgaWYgKHJvb3QuYXR0cmlidXRlcykge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgaHRtbDogcm9vdEh0bWwsXG4gICAgICAgIGVsZW1lbnQ6IHJvb3QsXG4gICAgICAgIGludGVudCxcbiAgICAgICAgbGlua1NlcnZpY2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBpc05vdEZvclJpY2hUZXh0ID0gaW50ZW50ICE9PSBcInJpY2hUZXh0XCI7XG4gICAgY29uc3Qgcm9vdERpdiA9IHBhcmFtZXRlcnMuZGl2O1xuICAgIHJvb3REaXYuYXBwZW5kKHJvb3RIdG1sKTtcbiAgICBpZiAocGFyYW1ldGVycy52aWV3cG9ydCkge1xuICAgICAgY29uc3QgdHJhbnNmb3JtID0gYG1hdHJpeCgke3BhcmFtZXRlcnMudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oXCIsXCIpfSlgO1xuICAgICAgcm9vdERpdi5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgfVxuICAgIGlmIChpc05vdEZvclJpY2hUZXh0KSB7XG4gICAgICByb290RGl2LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwieGZhTGF5ZXIgeGZhRm9udFwiKTtcbiAgICB9XG4gICAgY29uc3QgdGV4dERpdnMgPSBbXTtcbiAgICBpZiAocm9vdC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChyb290LnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShyb290LnZhbHVlKTtcbiAgICAgICAgcm9vdEh0bWwuYXBwZW5kKG5vZGUpO1xuICAgICAgICBpZiAoaXNOb3RGb3JSaWNoVGV4dCAmJiBYZmFUZXh0LnNob3VsZEJ1aWxkVGV4dChyb290Lm5hbWUpKSB7XG4gICAgICAgICAgdGV4dERpdnMucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dERpdnNcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHN0YWNrID0gW1tyb290LCAtMSwgcm9vdEh0bWxdXTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW3BhcmVudCwgaSwgaHRtbF0gPSBzdGFjay5hdCgtMSk7XG4gICAgICBpZiAoaSArIDEgPT09IHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hpbGQgPSBwYXJlbnQuY2hpbGRyZW5bKytzdGFjay5hdCgtMSlbMV1dO1xuICAgICAgaWYgKGNoaWxkID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lXG4gICAgICB9ID0gY2hpbGQ7XG4gICAgICBpZiAobmFtZSA9PT0gXCIjdGV4dFwiKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZC52YWx1ZSk7XG4gICAgICAgIHRleHREaXZzLnB1c2gobm9kZSk7XG4gICAgICAgIGh0bWwuYXBwZW5kKG5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoaWxkSHRtbCA9IGNoaWxkPy5hdHRyaWJ1dGVzPy54bWxucyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhjaGlsZC5hdHRyaWJ1dGVzLnhtbG5zLCBuYW1lKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7XG4gICAgICBodG1sLmFwcGVuZChjaGlsZEh0bWwpO1xuICAgICAgaWYgKGNoaWxkLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICBodG1sOiBjaGlsZEh0bWwsXG4gICAgICAgICAgZWxlbWVudDogY2hpbGQsXG4gICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICBpbnRlbnQsXG4gICAgICAgICAgbGlua1NlcnZpY2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQuY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RhY2sucHVzaChbY2hpbGQsIC0xLCBjaGlsZEh0bWxdKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hpbGQudmFsdWUpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkLnZhbHVlKTtcbiAgICAgICAgaWYgKGlzTm90Rm9yUmljaFRleHQgJiYgWGZhVGV4dC5zaG91bGRCdWlsZFRleHQobmFtZSkpIHtcbiAgICAgICAgICB0ZXh0RGl2cy5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkSHRtbC5hcHBlbmQobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWwgb2Ygcm9vdERpdi5xdWVyeVNlbGVjdG9yQWxsKFwiLnhmYU5vbkludGVyYWN0aXZlIGlucHV0LCAueGZhTm9uSW50ZXJhY3RpdmUgdGV4dGFyZWFcIikpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcInJlYWRPbmx5XCIsIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdGV4dERpdnNcbiAgICB9O1xuICB9XG4gIHN0YXRpYyB1cGRhdGUocGFyYW1ldGVycykge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGBtYXRyaXgoJHtwYXJhbWV0ZXJzLnZpZXdwb3J0LnRyYW5zZm9ybS5qb2luKFwiLFwiKX0pYDtcbiAgICBwYXJhbWV0ZXJzLmRpdi5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgcGFyYW1ldGVycy5kaXYuaGlkZGVuID0gZmFsc2U7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvYW5ub3RhdGlvbl9sYXllci5qc1xuXG5cblxuXG5cbmNvbnN0IERFRkFVTFRfVEFCX0lOREVYID0gMTAwMDtcbmNvbnN0IGFubm90YXRpb25fbGF5ZXJfREVGQVVMVF9GT05UX1NJWkUgPSA5O1xuY29uc3QgR2V0RWxlbWVudHNCeU5hbWVTZXQgPSBuZXcgV2Vha1NldCgpO1xuZnVuY3Rpb24gZ2V0UmVjdERpbXMocmVjdCkge1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiByZWN0WzJdIC0gcmVjdFswXSxcbiAgICBoZWlnaHQ6IHJlY3RbM10gLSByZWN0WzFdXG4gIH07XG59XG5jbGFzcyBBbm5vdGF0aW9uRWxlbWVudEZhY3Rvcnkge1xuICBzdGF0aWMgY3JlYXRlKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBzdWJ0eXBlID0gcGFyYW1ldGVycy5kYXRhLmFubm90YXRpb25UeXBlO1xuICAgIHN3aXRjaCAoc3VidHlwZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5MSU5LOlxuICAgICAgICByZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuVEVYVDpcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLldJREdFVDpcbiAgICAgICAgY29uc3QgZmllbGRUeXBlID0gcGFyYW1ldGVycy5kYXRhLmZpZWxkVHlwZTtcbiAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiVHhcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICAgIGNhc2UgXCJCdG5cIjpcbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmRhdGEucmFkaW9CdXR0b24pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzLmRhdGEuY2hlY2tCb3gpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICAgICAgY2FzZSBcIkNoXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICAgIGNhc2UgXCJTaWdcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuUE9QVVA6XG4gICAgICAgIHJldHVybiBuZXcgUG9wdXBBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuRlJFRVRFWFQ6XG4gICAgICAgIHJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuTElORTpcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNRVUFSRTpcbiAgICAgICAgcmV0dXJuIG5ldyBTcXVhcmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuQ0lSQ0xFOlxuICAgICAgICByZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5QT0xZTElORTpcbiAgICAgICAgcmV0dXJuIG5ldyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5DQVJFVDpcbiAgICAgICAgcmV0dXJuIG5ldyBDYXJldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5JTks6XG4gICAgICAgIHJldHVybiBuZXcgSW5rQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlBPTFlHT046XG4gICAgICAgIHJldHVybiBuZXcgUG9seWdvbkFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5ISUdITElHSFQ6XG4gICAgICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlVOREVSTElORTpcbiAgICAgICAgcmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuU1FVSUdHTFk6XG4gICAgICAgIHJldHVybiBuZXcgU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUOlxuICAgICAgICByZXR1cm4gbmV3IFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5TVEFNUDpcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5GSUxFQVRUQUNITUVOVDpcbiAgICAgICAgcmV0dXJuIG5ldyBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIEFubm90YXRpb25FbGVtZW50IHtcbiAgI3VwZGF0ZXMgPSBudWxsO1xuICAjaGFzQm9yZGVyID0gZmFsc2U7XG4gICNwb3B1cEVsZW1lbnQgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzLCB7XG4gICAgaXNSZW5kZXJhYmxlID0gZmFsc2UsXG4gICAgaWdub3JlQm9yZGVyID0gZmFsc2UsXG4gICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHMgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICB0aGlzLmlzUmVuZGVyYWJsZSA9IGlzUmVuZGVyYWJsZTtcbiAgICB0aGlzLmRhdGEgPSBwYXJhbWV0ZXJzLmRhdGE7XG4gICAgdGhpcy5sYXllciA9IHBhcmFtZXRlcnMubGF5ZXI7XG4gICAgdGhpcy5saW5rU2VydmljZSA9IHBhcmFtZXRlcnMubGlua1NlcnZpY2U7XG4gICAgdGhpcy5kb3dubG9hZE1hbmFnZXIgPSBwYXJhbWV0ZXJzLmRvd25sb2FkTWFuYWdlcjtcbiAgICB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCA9IHBhcmFtZXRlcnMuaW1hZ2VSZXNvdXJjZXNQYXRoO1xuICAgIHRoaXMucmVuZGVyRm9ybXMgPSBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zO1xuICAgIHRoaXMuc3ZnRmFjdG9yeSA9IHBhcmFtZXRlcnMuc3ZnRmFjdG9yeTtcbiAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlID0gcGFyYW1ldGVycy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICB0aGlzLmVuYWJsZVNjcmlwdGluZyA9IHBhcmFtZXRlcnMuZW5hYmxlU2NyaXB0aW5nO1xuICAgIHRoaXMuaGFzSlNBY3Rpb25zID0gcGFyYW1ldGVycy5oYXNKU0FjdGlvbnM7XG4gICAgdGhpcy5fZmllbGRPYmplY3RzID0gcGFyYW1ldGVycy5maWVsZE9iamVjdHM7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJhbWV0ZXJzLnBhcmVudDtcbiAgICBpZiAoaXNSZW5kZXJhYmxlKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuX2NyZWF0ZUNvbnRhaW5lcihpZ25vcmVCb3JkZXIpO1xuICAgIH1cbiAgICBpZiAoY3JlYXRlUXVhZHJpbGF0ZXJhbHMpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVF1YWRyaWxhdGVyYWxzKCk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBfaGFzUG9wdXBEYXRhKHtcbiAgICB0aXRsZU9iaixcbiAgICBjb250ZW50c09iaixcbiAgICByaWNoVGV4dFxuICB9KSB7XG4gICAgcmV0dXJuICEhKHRpdGxlT2JqPy5zdHIgfHwgY29udGVudHNPYmo/LnN0ciB8fCByaWNoVGV4dD8uc3RyKTtcbiAgfVxuICBnZXQgaGFzUG9wdXBEYXRhKCkge1xuICAgIHJldHVybiBBbm5vdGF0aW9uRWxlbWVudC5faGFzUG9wdXBEYXRhKHRoaXMuZGF0YSk7XG4gIH1cbiAgdXBkYXRlRWRpdGVkKHBhcmFtcykge1xuICAgIGlmICghdGhpcy5jb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jdXBkYXRlcyB8fD0ge1xuICAgICAgcmVjdDogdGhpcy5kYXRhLnJlY3Quc2xpY2UoMClcbiAgICB9O1xuICAgIGNvbnN0IHtcbiAgICAgIHJlY3RcbiAgICB9ID0gcGFyYW1zO1xuICAgIGlmIChyZWN0KSB7XG4gICAgICB0aGlzLiNzZXRSZWN0RWRpdGVkKHJlY3QpO1xuICAgIH1cbiAgICB0aGlzLiNwb3B1cEVsZW1lbnQ/LnBvcHVwLnVwZGF0ZUVkaXRlZChwYXJhbXMpO1xuICB9XG4gIHJlc2V0RWRpdGVkKCkge1xuICAgIGlmICghdGhpcy4jdXBkYXRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNzZXRSZWN0RWRpdGVkKHRoaXMuI3VwZGF0ZXMucmVjdCk7XG4gICAgdGhpcy4jcG9wdXBFbGVtZW50Py5wb3B1cC5yZXNldEVkaXRlZCgpO1xuICAgIHRoaXMuI3VwZGF0ZXMgPSBudWxsO1xuICB9XG4gICNzZXRSZWN0RWRpdGVkKHJlY3QpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb250YWluZXI6IHtcbiAgICAgICAgc3R5bGVcbiAgICAgIH0sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlY3Q6IGN1cnJlbnRSZWN0LFxuICAgICAgICByb3RhdGlvblxuICAgICAgfSxcbiAgICAgIHBhcmVudDoge1xuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgIHJhd0RpbXM6IHtcbiAgICAgICAgICAgIHBhZ2VXaWR0aCxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQsXG4gICAgICAgICAgICBwYWdlWCxcbiAgICAgICAgICAgIHBhZ2VZXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSA9IHRoaXM7XG4gICAgY3VycmVudFJlY3Q/LnNwbGljZSgwLCA0LCAuLi5yZWN0KTtcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhyZWN0KTtcbiAgICBzdHlsZS5sZWZ0ID0gYCR7MTAwICogKHJlY3RbMF0gLSBwYWdlWCkgLyBwYWdlV2lkdGh9JWA7XG4gICAgc3R5bGUudG9wID0gYCR7MTAwICogKHBhZ2VIZWlnaHQgLSByZWN0WzNdICsgcGFnZVkpIC8gcGFnZUhlaWdodH0lYDtcbiAgICBpZiAocm90YXRpb24gPT09IDApIHtcbiAgICAgIHN0eWxlLndpZHRoID0gYCR7MTAwICogd2lkdGggLyBwYWdlV2lkdGh9JWA7XG4gICAgICBzdHlsZS5oZWlnaHQgPSBgJHsxMDAgKiBoZWlnaHQgLyBwYWdlSGVpZ2h0fSVgO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFJvdGF0aW9uKHJvdGF0aW9uKTtcbiAgICB9XG4gIH1cbiAgX2NyZWF0ZUNvbnRhaW5lcihpZ25vcmVCb3JkZXIpIHtcbiAgICBjb25zdCB7XG4gICAgICBkYXRhLFxuICAgICAgcGFyZW50OiB7XG4gICAgICAgIHBhZ2UsXG4gICAgICAgIHZpZXdwb3J0XG4gICAgICB9XG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIik7XG4gICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtYW5ub3RhdGlvbi1pZFwiLCBkYXRhLmlkKTtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpKSB7XG4gICAgICBjb250YWluZXIudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gY29udGFpbmVyO1xuICAgIHN0eWxlLnpJbmRleCA9IHRoaXMucGFyZW50LnpJbmRleCsrO1xuICAgIGlmIChkYXRhLnBvcHVwUmVmKSB7XG4gICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiLCBcImRpYWxvZ1wiKTtcbiAgICB9XG4gICAgaWYgKGRhdGEuYWx0ZXJuYXRpdmVUZXh0KSB7XG4gICAgICBjb250YWluZXIudGl0bGUgPSBkYXRhLmFsdGVybmF0aXZlVGV4dDtcbiAgICB9XG4gICAgaWYgKGRhdGEubm9Sb3RhdGUpIHtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibm9yb3RhdGVcIik7XG4gICAgfVxuICAgIGlmICghZGF0YS5yZWN0IHx8IHRoaXMgaW5zdGFuY2VvZiBQb3B1cEFubm90YXRpb25FbGVtZW50KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJvdGF0aW9uXG4gICAgICB9ID0gZGF0YTtcbiAgICAgIGlmICghZGF0YS5oYXNPd25DYW52YXMgJiYgcm90YXRpb24gIT09IDApIHtcbiAgICAgICAgdGhpcy5zZXRSb3RhdGlvbihyb3RhdGlvbiwgY29udGFpbmVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG4gICAgaWYgKCFpZ25vcmVCb3JkZXIgJiYgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCA+IDApIHtcbiAgICAgIHN0eWxlLmJvcmRlcldpZHRoID0gYCR7ZGF0YS5ib3JkZXJTdHlsZS53aWR0aH1weGA7XG4gICAgICBjb25zdCBob3Jpem9udGFsUmFkaXVzID0gZGF0YS5ib3JkZXJTdHlsZS5ob3Jpem9udGFsQ29ybmVyUmFkaXVzO1xuICAgICAgY29uc3QgdmVydGljYWxSYWRpdXMgPSBkYXRhLmJvcmRlclN0eWxlLnZlcnRpY2FsQ29ybmVyUmFkaXVzO1xuICAgICAgaWYgKGhvcml6b250YWxSYWRpdXMgPiAwIHx8IHZlcnRpY2FsUmFkaXVzID4gMCkge1xuICAgICAgICBjb25zdCByYWRpdXMgPSBgY2FsYygke2hvcml6b250YWxSYWRpdXN9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSAvIGNhbGMoJHt2ZXJ0aWNhbFJhZGl1c31weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcbiAgICAgICAgc3R5bGUuYm9yZGVyUmFkaXVzID0gcmFkaXVzO1xuICAgICAgfSBlbHNlIGlmICh0aGlzIGluc3RhbmNlb2YgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgICBjb25zdCByYWRpdXMgPSBgY2FsYygke3dpZHRofXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSkgLyBjYWxjKCR7aGVpZ2h0fXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO1xuICAgICAgICBzdHlsZS5ib3JkZXJSYWRpdXMgPSByYWRpdXM7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGRhdGEuYm9yZGVyU3R5bGUuc3R5bGUpIHtcbiAgICAgICAgY2FzZSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOlxuICAgICAgICAgIHN0eWxlLmJvcmRlclN0eWxlID0gXCJzb2xpZFwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuREFTSEVEOlxuICAgICAgICAgIHN0eWxlLmJvcmRlclN0eWxlID0gXCJkYXNoZWRcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ6XG4gICAgICAgICAgd2FybihcIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBiZXZlbGVkXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuSU5TRVQ6XG4gICAgICAgICAgd2FybihcIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBpbnNldFwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlVOREVSTElORTpcbiAgICAgICAgICBzdHlsZS5ib3JkZXJCb3R0b21TdHlsZSA9IFwic29saWRcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvcmRlckNvbG9yID0gZGF0YS5ib3JkZXJDb2xvciB8fCBudWxsO1xuICAgICAgaWYgKGJvcmRlckNvbG9yKSB7XG4gICAgICAgIHRoaXMuI2hhc0JvcmRlciA9IHRydWU7XG4gICAgICAgIHN0eWxlLmJvcmRlckNvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoYm9yZGVyQ29sb3JbMF0gfCAwLCBib3JkZXJDb2xvclsxXSB8IDAsIGJvcmRlckNvbG9yWzJdIHwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZS5ib3JkZXJXaWR0aCA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlY3QgPSBVdGlsLm5vcm1hbGl6ZVJlY3QoW2RhdGEucmVjdFswXSwgcGFnZS52aWV3WzNdIC0gZGF0YS5yZWN0WzFdICsgcGFnZS52aWV3WzFdLCBkYXRhLnJlY3RbMl0sIHBhZ2Uudmlld1szXSAtIGRhdGEucmVjdFszXSArIHBhZ2Uudmlld1sxXV0pO1xuICAgIGNvbnN0IHtcbiAgICAgIHBhZ2VXaWR0aCxcbiAgICAgIHBhZ2VIZWlnaHQsXG4gICAgICBwYWdlWCxcbiAgICAgIHBhZ2VZXG4gICAgfSA9IHZpZXdwb3J0LnJhd0RpbXM7XG4gICAgc3R5bGUubGVmdCA9IGAkezEwMCAqIChyZWN0WzBdIC0gcGFnZVgpIC8gcGFnZVdpZHRofSVgO1xuICAgIHN0eWxlLnRvcCA9IGAkezEwMCAqIChyZWN0WzFdIC0gcGFnZVkpIC8gcGFnZUhlaWdodH0lYDtcbiAgICBjb25zdCB7XG4gICAgICByb3RhdGlvblxuICAgIH0gPSBkYXRhO1xuICAgIGlmIChkYXRhLmhhc093bkNhbnZhcyB8fCByb3RhdGlvbiA9PT0gMCkge1xuICAgICAgc3R5bGUud2lkdGggPSBgJHsxMDAgKiB3aWR0aCAvIHBhZ2VXaWR0aH0lYDtcbiAgICAgIHN0eWxlLmhlaWdodCA9IGAkezEwMCAqIGhlaWdodCAvIHBhZ2VIZWlnaHR9JWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0Um90YXRpb24ocm90YXRpb24sIGNvbnRhaW5lcik7XG4gICAgfVxuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cbiAgc2V0Um90YXRpb24oYW5nbGUsIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEucmVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0XG4gICAgfSA9IHRoaXMucGFyZW50LnZpZXdwb3J0LnJhd0RpbXM7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXModGhpcy5kYXRhLnJlY3QpO1xuICAgIGxldCBlbGVtZW50V2lkdGgsIGVsZW1lbnRIZWlnaHQ7XG4gICAgaWYgKGFuZ2xlICUgMTgwID09PSAwKSB7XG4gICAgICBlbGVtZW50V2lkdGggPSAxMDAgKiB3aWR0aCAvIHBhZ2VXaWR0aDtcbiAgICAgIGVsZW1lbnRIZWlnaHQgPSAxMDAgKiBoZWlnaHQgLyBwYWdlSGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50V2lkdGggPSAxMDAgKiBoZWlnaHQgLyBwYWdlV2lkdGg7XG4gICAgICBlbGVtZW50SGVpZ2h0ID0gMTAwICogd2lkdGggLyBwYWdlSGVpZ2h0O1xuICAgIH1cbiAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBgJHtlbGVtZW50V2lkdGh9JWA7XG4gICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke2VsZW1lbnRIZWlnaHR9JWA7XG4gICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtbWFpbi1yb3RhdGlvblwiLCAoMzYwIC0gYW5nbGUpICUgMzYwKTtcbiAgfVxuICBnZXQgX2NvbW1vbkFjdGlvbnMoKSB7XG4gICAgY29uc3Qgc2V0Q29sb3IgPSAoanNOYW1lLCBzdHlsZU5hbWUsIGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBjb2xvciA9IGV2ZW50LmRldGFpbFtqc05hbWVdO1xuICAgICAgY29uc3QgY29sb3JUeXBlID0gY29sb3JbMF07XG4gICAgICBjb25zdCBjb2xvckFycmF5ID0gY29sb3Iuc2xpY2UoMSk7XG4gICAgICBldmVudC50YXJnZXQuc3R5bGVbc3R5bGVOYW1lXSA9IENvbG9yQ29udmVydGVyc1tgJHtjb2xvclR5cGV9X0hUTUxgXShjb2xvckFycmF5KTtcbiAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgIFtzdHlsZU5hbWVdOiBDb2xvckNvbnZlcnRlcnNbYCR7Y29sb3JUeXBlfV9yZ2JgXShjb2xvckFycmF5KVxuICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2NvbW1vbkFjdGlvbnNcIiwge1xuICAgICAgZGlzcGxheTogZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZGlzcGxheVxuICAgICAgICB9ID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICBjb25zdCBoaWRkZW4gPSBkaXNwbGF5ICUgMiA9PT0gMTtcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9IGhpZGRlbiA/IFwiaGlkZGVuXCIgOiBcInZpc2libGVcIjtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcbiAgICAgICAgICBub1ZpZXc6IGhpZGRlbixcbiAgICAgICAgICBub1ByaW50OiBkaXNwbGF5ID09PSAxIHx8IGRpc3BsYXkgPT09IDJcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcHJpbnQ6IGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcbiAgICAgICAgICBub1ByaW50OiAhZXZlbnQuZGV0YWlsLnByaW50XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGhpZGRlbjogZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaGlkZGVuXG4gICAgICAgIH0gPSBldmVudC5kZXRhaWw7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSBoaWRkZW4gPyBcImhpZGRlblwiIDogXCJ2aXNpYmxlXCI7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgICAgbm9QcmludDogaGlkZGVuLFxuICAgICAgICAgIG5vVmlldzogaGlkZGVuXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZvY3VzOiBldmVudCA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZXZlbnQudGFyZ2V0LmZvY3VzKHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiBmYWxzZVxuICAgICAgICB9KSwgMCk7XG4gICAgICB9LFxuICAgICAgdXNlck5hbWU6IGV2ZW50ID0+IHtcbiAgICAgICAgZXZlbnQudGFyZ2V0LnRpdGxlID0gZXZlbnQuZGV0YWlsLnVzZXJOYW1lO1xuICAgICAgfSxcbiAgICAgIHJlYWRvbmx5OiBldmVudCA9PiB7XG4gICAgICAgIGV2ZW50LnRhcmdldC5kaXNhYmxlZCA9IGV2ZW50LmRldGFpbC5yZWFkb25seTtcbiAgICAgIH0sXG4gICAgICByZXF1aXJlZDogZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLl9zZXRSZXF1aXJlZChldmVudC50YXJnZXQsIGV2ZW50LmRldGFpbC5yZXF1aXJlZCk7XG4gICAgICB9LFxuICAgICAgYmdDb2xvcjogZXZlbnQgPT4ge1xuICAgICAgICBzZXRDb2xvcihcImJnQ29sb3JcIiwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIGZpbGxDb2xvcjogZXZlbnQgPT4ge1xuICAgICAgICBzZXRDb2xvcihcImZpbGxDb2xvclwiLCBcImJhY2tncm91bmRDb2xvclwiLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgZmdDb2xvcjogZXZlbnQgPT4ge1xuICAgICAgICBzZXRDb2xvcihcImZnQ29sb3JcIiwgXCJjb2xvclwiLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgdGV4dENvbG9yOiBldmVudCA9PiB7XG4gICAgICAgIHNldENvbG9yKFwidGV4dENvbG9yXCIsIFwiY29sb3JcIiwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIGJvcmRlckNvbG9yOiBldmVudCA9PiB7XG4gICAgICAgIHNldENvbG9yKFwiYm9yZGVyQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgc3Ryb2tlQ29sb3I6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0Q29sb3IoXCJzdHJva2VDb2xvclwiLCBcImJvcmRlckNvbG9yXCIsIGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICByb3RhdGlvbjogZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBhbmdsZSA9IGV2ZW50LmRldGFpbC5yb3RhdGlvbjtcbiAgICAgICAgdGhpcy5zZXRSb3RhdGlvbihhbmdsZSk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgICAgcm90YXRpb246IGFuZ2xlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIF9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCkge1xuICAgIGNvbnN0IGNvbW1vbkFjdGlvbnMgPSB0aGlzLl9jb21tb25BY3Rpb25zO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhqc0V2ZW50LmRldGFpbCkpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvbnNbbmFtZV0gfHwgY29tbW9uQWN0aW9uc1tuYW1lXTtcbiAgICAgIGFjdGlvbj8uKGpzRXZlbnQpO1xuICAgIH1cbiAgfVxuICBfc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVTY3JpcHRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RvcmVkRGF0YSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UuZ2V0UmF3VmFsdWUodGhpcy5kYXRhLmlkKTtcbiAgICBpZiAoIXN0b3JlZERhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29tbW9uQWN0aW9ucyA9IHRoaXMuX2NvbW1vbkFjdGlvbnM7XG4gICAgZm9yIChjb25zdCBbYWN0aW9uTmFtZSwgZGV0YWlsXSBvZiBPYmplY3QuZW50cmllcyhzdG9yZWREYXRhKSkge1xuICAgICAgY29uc3QgYWN0aW9uID0gY29tbW9uQWN0aW9uc1thY3Rpb25OYW1lXTtcbiAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZXZlbnRQcm94eSA9IHtcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIFthY3Rpb25OYW1lXTogZGV0YWlsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0YXJnZXQ6IGVsZW1lbnRcbiAgICAgICAgfTtcbiAgICAgICAgYWN0aW9uKGV2ZW50UHJveHkpO1xuICAgICAgICBkZWxldGUgc3RvcmVkRGF0YVthY3Rpb25OYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2NyZWF0ZVF1YWRyaWxhdGVyYWxzKCkge1xuICAgIGlmICghdGhpcy5jb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgcXVhZFBvaW50c1xuICAgIH0gPSB0aGlzLmRhdGE7XG4gICAgaWYgKCFxdWFkUG9pbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtyZWN0QmxYLCByZWN0QmxZLCByZWN0VHJYLCByZWN0VHJZXSA9IHRoaXMuZGF0YS5yZWN0Lm1hcCh4ID0+IE1hdGguZnJvdW5kKHgpKTtcbiAgICBpZiAocXVhZFBvaW50cy5sZW5ndGggPT09IDgpIHtcbiAgICAgIGNvbnN0IFt0clgsIHRyWSwgYmxYLCBibFldID0gcXVhZFBvaW50cy5zdWJhcnJheSgyLCA2KTtcbiAgICAgIGlmIChyZWN0VHJYID09PSB0clggJiYgcmVjdFRyWSA9PT0gdHJZICYmIHJlY3RCbFggPT09IGJsWCAmJiByZWN0QmxZID09PSBibFkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLmNvbnRhaW5lcjtcbiAgICBsZXQgc3ZnQnVmZmVyO1xuICAgIGlmICh0aGlzLiNoYXNCb3JkZXIpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYm9yZGVyQ29sb3IsXG4gICAgICAgIGJvcmRlcldpZHRoXG4gICAgICB9ID0gc3R5bGU7XG4gICAgICBzdHlsZS5ib3JkZXJXaWR0aCA9IDA7XG4gICAgICBzdmdCdWZmZXIgPSBbXCJ1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LFwiLCBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJgLCBgIHByZXNlcnZlQXNwZWN0UmF0aW89XCJub25lXCIgdmlld0JveD1cIjAgMCAxIDFcIj5gLCBgPGcgZmlsbD1cInRyYW5zcGFyZW50XCIgc3Ryb2tlPVwiJHtib3JkZXJDb2xvcn1cIiBzdHJva2Utd2lkdGg9XCIke2JvcmRlcldpZHRofVwiPmBdO1xuICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhhc0JvcmRlclwiKTtcbiAgICB9XG4gICAgY29uc3Qgd2lkdGggPSByZWN0VHJYIC0gcmVjdEJsWDtcbiAgICBjb25zdCBoZWlnaHQgPSByZWN0VHJZIC0gcmVjdEJsWTtcbiAgICBjb25zdCB7XG4gICAgICBzdmdGYWN0b3J5XG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qgc3ZnID0gc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnXCIpO1xuICAgIHN2Zy5jbGFzc0xpc3QuYWRkKFwicXVhZHJpbGF0ZXJhbHNDb250YWluZXJcIik7XG4gICAgc3ZnLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIDApO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgMCk7XG4gICAgY29uc3QgZGVmcyA9IHN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcImRlZnNcIik7XG4gICAgc3ZnLmFwcGVuZChkZWZzKTtcbiAgICBjb25zdCBjbGlwUGF0aCA9IHN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIpO1xuICAgIGNvbnN0IGlkID0gYGNsaXBwYXRoXyR7dGhpcy5kYXRhLmlkfWA7XG4gICAgY2xpcFBhdGguc2V0QXR0cmlidXRlKFwiaWRcIiwgaWQpO1xuICAgIGNsaXBQYXRoLnNldEF0dHJpYnV0ZShcImNsaXBQYXRoVW5pdHNcIiwgXCJvYmplY3RCb3VuZGluZ0JveFwiKTtcbiAgICBkZWZzLmFwcGVuZChjbGlwUGF0aCk7XG4gICAgZm9yIChsZXQgaSA9IDIsIGlpID0gcXVhZFBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSA4KSB7XG4gICAgICBjb25zdCB0clggPSBxdWFkUG9pbnRzW2ldO1xuICAgICAgY29uc3QgdHJZID0gcXVhZFBvaW50c1tpICsgMV07XG4gICAgICBjb25zdCBibFggPSBxdWFkUG9pbnRzW2kgKyAyXTtcbiAgICAgIGNvbnN0IGJsWSA9IHF1YWRQb2ludHNbaSArIDNdO1xuICAgICAgY29uc3QgcmVjdCA9IHN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInJlY3RcIik7XG4gICAgICBjb25zdCB4ID0gKGJsWCAtIHJlY3RCbFgpIC8gd2lkdGg7XG4gICAgICBjb25zdCB5ID0gKHJlY3RUclkgLSB0clkpIC8gaGVpZ2h0O1xuICAgICAgY29uc3QgcmVjdFdpZHRoID0gKHRyWCAtIGJsWCkgLyB3aWR0aDtcbiAgICAgIGNvbnN0IHJlY3RIZWlnaHQgPSAodHJZIC0gYmxZKSAvIGhlaWdodDtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCB4KTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieVwiLCB5KTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgcmVjdFdpZHRoKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIHJlY3RIZWlnaHQpO1xuICAgICAgY2xpcFBhdGguYXBwZW5kKHJlY3QpO1xuICAgICAgc3ZnQnVmZmVyPy5wdXNoKGA8cmVjdCB2ZWN0b3ItZWZmZWN0PVwibm9uLXNjYWxpbmctc3Ryb2tlXCIgeD1cIiR7eH1cIiB5PVwiJHt5fVwiIHdpZHRoPVwiJHtyZWN0V2lkdGh9XCIgaGVpZ2h0PVwiJHtyZWN0SGVpZ2h0fVwiLz5gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2hhc0JvcmRlcikge1xuICAgICAgc3ZnQnVmZmVyLnB1c2goYDwvZz48L3N2Zz4nKWApO1xuICAgICAgc3R5bGUuYmFja2dyb3VuZEltYWdlID0gc3ZnQnVmZmVyLmpvaW4oXCJcIik7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmNsaXBQYXRoID0gYHVybCgjJHtpZH0pYDtcbiAgfVxuICBfY3JlYXRlUG9wdXAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGFpbmVyLFxuICAgICAgZGF0YVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIsIFwiZGlhbG9nXCIpO1xuICAgIGNvbnN0IHBvcHVwID0gdGhpcy4jcG9wdXBFbGVtZW50ID0gbmV3IFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQoe1xuICAgICAgZGF0YToge1xuICAgICAgICBjb2xvcjogZGF0YS5jb2xvcixcbiAgICAgICAgdGl0bGVPYmo6IGRhdGEudGl0bGVPYmosXG4gICAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IGRhdGEubW9kaWZpY2F0aW9uRGF0ZSxcbiAgICAgICAgY29udGVudHNPYmo6IGRhdGEuY29udGVudHNPYmosXG4gICAgICAgIHJpY2hUZXh0OiBkYXRhLnJpY2hUZXh0LFxuICAgICAgICBwYXJlbnRSZWN0OiBkYXRhLnJlY3QsXG4gICAgICAgIGJvcmRlclN0eWxlOiAwLFxuICAgICAgICBpZDogYHBvcHVwXyR7ZGF0YS5pZH1gLFxuICAgICAgICByb3RhdGlvbjogZGF0YS5yb3RhdGlvblxuICAgICAgfSxcbiAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQsXG4gICAgICBlbGVtZW50czogW3RoaXNdXG4gICAgfSk7XG4gICAgdGhpcy5wYXJlbnQuZGl2LmFwcGVuZChwb3B1cC5yZW5kZXIoKSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBBbm5vdGF0aW9uRWxlbWVudC5yZW5kZXJgIGNhbGxlZFwiKTtcbiAgfVxuICBfZ2V0RWxlbWVudHNCeU5hbWUobmFtZSwgc2tpcElkID0gbnVsbCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IFtdO1xuICAgIGlmICh0aGlzLl9maWVsZE9iamVjdHMpIHtcbiAgICAgIGNvbnN0IGZpZWxkT2JqID0gdGhpcy5fZmllbGRPYmplY3RzW25hbWVdO1xuICAgICAgaWYgKGZpZWxkT2JqKSB7XG4gICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgZXhwb3J0VmFsdWVzXG4gICAgICAgIH0gb2YgZmllbGRPYmopIHtcbiAgICAgICAgICBpZiAocGFnZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaWQgPT09IHNraXBJZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGV4cG9ydFZhbHVlID0gdHlwZW9mIGV4cG9ydFZhbHVlcyA9PT0gXCJzdHJpbmdcIiA/IGV4cG9ydFZhbHVlcyA6IG51bGw7XG4gICAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWVsZW1lbnQtaWQ9XCIke2lkfVwiXWApO1xuICAgICAgICAgIGlmIChkb21FbGVtZW50ICYmICFHZXRFbGVtZW50c0J5TmFtZVNldC5oYXMoZG9tRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHdhcm4oYF9nZXRFbGVtZW50c0J5TmFtZSAtIGVsZW1lbnQgbm90IGFsbG93ZWQ6ICR7aWR9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGRzLnB1c2goe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBleHBvcnRWYWx1ZSxcbiAgICAgICAgICAgIGRvbUVsZW1lbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9XG4gICAgZm9yIChjb25zdCBkb21FbGVtZW50IG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKG5hbWUpKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGV4cG9ydFZhbHVlXG4gICAgICB9ID0gZG9tRWxlbWVudDtcbiAgICAgIGNvbnN0IGlkID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIik7XG4gICAgICBpZiAoaWQgPT09IHNraXBJZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghR2V0RWxlbWVudHNCeU5hbWVTZXQuaGFzKGRvbUVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZmllbGRzLnB1c2goe1xuICAgICAgICBpZCxcbiAgICAgICAgZXhwb3J0VmFsdWUsXG4gICAgICAgIGRvbUVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRzO1xuICB9XG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5oaWRkZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5wb3B1cD8ubWF5YmVTaG93KCk7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAodGhpcy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmhpZGRlbiA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMucG9wdXA/LmZvcmNlSGlkZSgpO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzLmdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0cmlnZ2VycykpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0cmlnZ2Vycykge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2Vycy5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgICB9XG4gIH1cbiAgZ2V0IF9pc0VkaXRhYmxlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBfZWRpdE9uRG91YmxlQ2xpY2soKSB7XG4gICAgaWYgKCF0aGlzLl9pc0VkaXRhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFubm90YXRpb25FZGl0b3JUeXBlOiBtb2RlLFxuICAgICAgZGF0YToge1xuICAgICAgICBpZDogZWRpdElkXG4gICAgICB9XG4gICAgfSA9IHRoaXM7XG4gICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsICgpID0+IHtcbiAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwic3dpdGNoYW5ub3RhdGlvbmVkaXRvcm1vZGVcIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIGVkaXRJZFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbmNsYXNzIExpbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycywgb3B0aW9ucyA9IG51bGwpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6ICEhb3B0aW9ucz8uaWdub3JlQm9yZGVyLFxuICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLmlzVG9vbHRpcE9ubHkgPSBwYXJhbWV0ZXJzLmRhdGEuaXNUb29sdGlwT25seTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGF0YSxcbiAgICAgIGxpbmtTZXJ2aWNlXG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgIGxpbmsuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGRhdGEuaWQpO1xuICAgIGxldCBpc0JvdW5kID0gZmFsc2U7XG4gICAgaWYgKGRhdGEudXJsKSB7XG4gICAgICBsaW5rU2VydmljZS5hZGRMaW5rQXR0cmlidXRlcyhsaW5rLCBkYXRhLnVybCwgZGF0YS5uZXdXaW5kb3cpO1xuICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkYXRhLmFjdGlvbikge1xuICAgICAgdGhpcy5fYmluZE5hbWVkQWN0aW9uKGxpbmssIGRhdGEuYWN0aW9uKTtcbiAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5hdHRhY2htZW50KSB7XG4gICAgICB0aGlzLiNiaW5kQXR0YWNobWVudChsaW5rLCBkYXRhLmF0dGFjaG1lbnQsIGRhdGEuYXR0YWNobWVudERlc3QpO1xuICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkYXRhLnNldE9DR1N0YXRlKSB7XG4gICAgICB0aGlzLiNiaW5kU2V0T0NHU3RhdGUobGluaywgZGF0YS5zZXRPQ0dTdGF0ZSk7XG4gICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEuZGVzdCkge1xuICAgICAgdGhpcy5fYmluZExpbmsobGluaywgZGF0YS5kZXN0KTtcbiAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YS5hY3Rpb25zICYmIChkYXRhLmFjdGlvbnMuQWN0aW9uIHx8IGRhdGEuYWN0aW9uc1tcIk1vdXNlIFVwXCJdIHx8IGRhdGEuYWN0aW9uc1tcIk1vdXNlIERvd25cIl0pICYmIHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG4gICAgICAgIHRoaXMuX2JpbmRKU0FjdGlvbihsaW5rLCBkYXRhKTtcbiAgICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5yZXNldEZvcm0pIHtcbiAgICAgICAgdGhpcy5fYmluZFJlc2V0Rm9ybUFjdGlvbihsaW5rLCBkYXRhLnJlc2V0Rm9ybSk7XG4gICAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVG9vbHRpcE9ubHkgJiYgIWlzQm91bmQpIHtcbiAgICAgICAgdGhpcy5fYmluZExpbmsobGluaywgXCJcIik7XG4gICAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibGlua0Fubm90YXRpb25cIik7XG4gICAgaWYgKGlzQm91bmQpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChsaW5rKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gICNzZXRJbnRlcm5hbExpbmsoKSB7XG4gICAgdGhpcy5jb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS1pbnRlcm5hbC1saW5rXCIsIFwiXCIpO1xuICB9XG4gIF9iaW5kTGluayhsaW5rLCBkZXN0aW5hdGlvbikge1xuICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0RGVzdGluYXRpb25IYXNoKGRlc3RpbmF0aW9uKTtcbiAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICBpZiAoZGVzdGluYXRpb24pIHtcbiAgICAgICAgdGhpcy5saW5rU2VydmljZS5nb1RvRGVzdGluYXRpb24oZGVzdGluYXRpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgaWYgKGRlc3RpbmF0aW9uIHx8IGRlc3RpbmF0aW9uID09PSBcIlwiKSB7XG4gICAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcbiAgICB9XG4gIH1cbiAgX2JpbmROYW1lZEFjdGlvbihsaW5rLCBhY3Rpb24pIHtcbiAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcbiAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV4ZWN1dGVOYW1lZEFjdGlvbihhY3Rpb24pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG4gIH1cbiAgI2JpbmRBdHRhY2htZW50KGxpbmssIGF0dGFjaG1lbnQsIGRlc3QgPSBudWxsKSB7XG4gICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgaWYgKGF0dGFjaG1lbnQuZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmsudGl0bGUgPSBhdHRhY2htZW50LmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLmRvd25sb2FkTWFuYWdlcj8ub3Blbk9yRG93bmxvYWREYXRhKGF0dGFjaG1lbnQuY29udGVudCwgYXR0YWNobWVudC5maWxlbmFtZSwgZGVzdCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcbiAgfVxuICAjYmluZFNldE9DR1N0YXRlKGxpbmssIGFjdGlvbikge1xuICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcbiAgICAgIHRoaXMubGlua1NlcnZpY2UuZXhlY3V0ZVNldE9DR1N0YXRlKGFjdGlvbik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcbiAgfVxuICBfYmluZEpTQWN0aW9uKGxpbmssIGRhdGEpIHtcbiAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKFtbXCJBY3Rpb25cIiwgXCJvbmNsaWNrXCJdLCBbXCJNb3VzZSBVcFwiLCBcIm9ubW91c2V1cFwiXSwgW1wiTW91c2UgRG93blwiLCBcIm9ubW91c2Vkb3duXCJdXSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRhdGEuYWN0aW9ucykpIHtcbiAgICAgIGNvbnN0IGpzTmFtZSA9IG1hcC5nZXQobmFtZSk7XG4gICAgICBpZiAoIWpzTmFtZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxpbmtbanNOYW1lXSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBpZDogZGF0YS5pZCxcbiAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIWxpbmsub25jbGljaykge1xuICAgICAgbGluay5vbmNsaWNrID0gKCkgPT4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuICB9XG4gIF9iaW5kUmVzZXRGb3JtQWN0aW9uKGxpbmssIHJlc2V0Rm9ybSkge1xuICAgIGNvbnN0IG90aGVyQ2xpY2tBY3Rpb24gPSBsaW5rLm9uY2xpY2s7XG4gICAgaWYgKCFvdGhlckNsaWNrQWN0aW9uKSB7XG4gICAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcbiAgICB9XG4gICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG4gICAgaWYgKCF0aGlzLl9maWVsZE9iamVjdHMpIHtcbiAgICAgIHdhcm4oYF9iaW5kUmVzZXRGb3JtQWN0aW9uIC0gXCJyZXNldEZvcm1cIiBhY3Rpb24gbm90IHN1cHBvcnRlZCwgYCArIFwiZW5zdXJlIHRoYXQgdGhlIGBmaWVsZE9iamVjdHNgIHBhcmFtZXRlciBpcyBwcm92aWRlZC5cIik7XG4gICAgICBpZiAoIW90aGVyQ2xpY2tBY3Rpb24pIHtcbiAgICAgICAgbGluay5vbmNsaWNrID0gKCkgPT4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcbiAgICAgIG90aGVyQ2xpY2tBY3Rpb24/LigpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBmaWVsZHM6IHJlc2V0Rm9ybUZpZWxkcyxcbiAgICAgICAgcmVmczogcmVzZXRGb3JtUmVmcyxcbiAgICAgICAgaW5jbHVkZVxuICAgICAgfSA9IHJlc2V0Rm9ybTtcbiAgICAgIGNvbnN0IGFsbEZpZWxkcyA9IFtdO1xuICAgICAgaWYgKHJlc2V0Rm9ybUZpZWxkcy5sZW5ndGggIT09IDAgfHwgcmVzZXRGb3JtUmVmcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgY29uc3QgZmllbGRJZHMgPSBuZXcgU2V0KHJlc2V0Rm9ybVJlZnMpO1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiByZXNldEZvcm1GaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLl9maWVsZE9iamVjdHNbZmllbGROYW1lXSB8fCBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgICAgIGlkXG4gICAgICAgICAgfSBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGZpZWxkSWRzLmFkZChpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgZmllbGRzIG9mIE9iamVjdC52YWx1ZXModGhpcy5fZmllbGRPYmplY3RzKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoZmllbGRJZHMuaGFzKGZpZWxkLmlkKSA9PT0gaW5jbHVkZSkge1xuICAgICAgICAgICAgICBhbGxGaWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkcyBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2ZpZWxkT2JqZWN0cykpIHtcbiAgICAgICAgICBhbGxGaWVsZHMucHVzaCguLi5maWVsZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICAgIGNvbnN0IGFsbElkcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBhbGxGaWVsZHMpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0gPSBmaWVsZDtcbiAgICAgICAgYWxsSWRzLnB1c2goaWQpO1xuICAgICAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgIGNhc2UgXCJyYWRpb2J1dHRvblwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZSA9PT0gZmllbGQuZXhwb3J0VmFsdWVzO1xuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJjb21ib2JveFwiOlxuICAgICAgICAgIGNhc2UgXCJsaXN0Ym94XCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQuZGVmYXVsdFZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1lbGVtZW50LWlkPVwiJHtpZH1cIl1gKTtcbiAgICAgICAgaWYgKCFkb21FbGVtZW50KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIUdldEVsZW1lbnRzQnlOYW1lU2V0Lmhhcyhkb21FbGVtZW50KSkge1xuICAgICAgICAgIHdhcm4oYF9iaW5kUmVzZXRGb3JtQWN0aW9uIC0gZWxlbWVudCBub3QgYWxsb3dlZDogJHtpZH1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBkb21FbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicmVzZXRmb3JtXCIpKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZykge1xuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGlkOiBcImFwcFwiLFxuICAgICAgICAgICAgaWRzOiBhbGxJZHMsXG4gICAgICAgICAgICBuYW1lOiBcIlJlc2V0Rm9ybVwiXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9XG59XG5jbGFzcyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInRleHRBbm5vdGF0aW9uXCIpO1xuICAgIGNvbnN0IGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICBpbWFnZS5zcmMgPSB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCArIFwiYW5ub3RhdGlvbi1cIiArIHRoaXMuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgKyBcIi5zdmdcIjtcbiAgICBpbWFnZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy10ZXh0LWFubm90YXRpb24tdHlwZVwiKTtcbiAgICBpbWFnZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4tYXJnc1wiLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB0eXBlOiB0aGlzLmRhdGEubmFtZVxuICAgIH0pKTtcbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGltYWdlKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIHNob3dFbGVtZW50QW5kSGlkZUNhbnZhcyhlbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuZGF0YS5oYXNPd25DYW52YXMpIHtcbiAgICAgIGlmIChlbGVtZW50LnByZXZpb3VzU2libGluZz8ubm9kZU5hbWUgPT09IFwiQ0FOVkFTXCIpIHtcbiAgICAgICAgZWxlbWVudC5wcmV2aW91c1NpYmxpbmcuaGlkZGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuaGlkZGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIF9nZXRLZXlNb2RpZmllcihldmVudCkge1xuICAgIHJldHVybiB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtLmlzTWFjID8gZXZlbnQubWV0YUtleSA6IGV2ZW50LmN0cmxLZXk7XG4gIH1cbiAgX3NldEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZWxlbWVudERhdGEsIGJhc2VOYW1lLCBldmVudE5hbWUsIHZhbHVlR2V0dGVyKSB7XG4gICAgaWYgKGJhc2VOYW1lLmluY2x1ZGVzKFwibW91c2VcIikpIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihiYXNlTmFtZSwgZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICBuYW1lOiBldmVudE5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVHZXR0ZXIoZXZlbnQpLFxuICAgICAgICAgICAgc2hpZnQ6IGV2ZW50LnNoaWZ0S2V5LFxuICAgICAgICAgICAgbW9kaWZpZXI6IHRoaXMuX2dldEtleU1vZGlmaWVyKGV2ZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJhc2VOYW1lLCBldmVudCA9PiB7XG4gICAgICAgIGlmIChiYXNlTmFtZSA9PT0gXCJibHVyXCIpIHtcbiAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLmZvY3VzZWQgfHwgIWV2ZW50LnJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudERhdGEuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGJhc2VOYW1lID09PSBcImZvY3VzXCIpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZm9jdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50RGF0YS5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbHVlR2V0dGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgICAgICAgIG5hbWU6IGV2ZW50TmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZUdldHRlcihldmVudClcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIF9zZXRFdmVudExpc3RlbmVycyhlbGVtZW50LCBlbGVtZW50RGF0YSwgbmFtZXMsIGdldHRlcikge1xuICAgIGZvciAoY29uc3QgW2Jhc2VOYW1lLCBldmVudE5hbWVdIG9mIG5hbWVzKSB7XG4gICAgICBpZiAoZXZlbnROYW1lID09PSBcIkFjdGlvblwiIHx8IHRoaXMuZGF0YS5hY3Rpb25zPy5bZXZlbnROYW1lXSkge1xuICAgICAgICBpZiAoZXZlbnROYW1lID09PSBcIkZvY3VzXCIgfHwgZXZlbnROYW1lID09PSBcIkJsdXJcIikge1xuICAgICAgICAgIGVsZW1lbnREYXRhIHx8PSB7XG4gICAgICAgICAgICBmb2N1c2VkOiBmYWxzZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcihlbGVtZW50LCBlbGVtZW50RGF0YSwgYmFzZU5hbWUsIGV2ZW50TmFtZSwgZ2V0dGVyKTtcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gXCJGb2N1c1wiICYmICF0aGlzLmRhdGEuYWN0aW9ucz8uQmx1cikge1xuICAgICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZWxlbWVudERhdGEsIFwiYmx1clwiLCBcIkJsdXJcIiwgbnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnROYW1lID09PSBcIkJsdXJcIiAmJiAhdGhpcy5kYXRhLmFjdGlvbnM/LkZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcihlbGVtZW50LCBlbGVtZW50RGF0YSwgXCJmb2N1c1wiLCBcIkZvY3VzXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCkge1xuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciB8fCBudWxsO1xuICAgIGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3IgPT09IG51bGwgPyBcInRyYW5zcGFyZW50XCIgOiBVdGlsLm1ha2VIZXhDb2xvcihjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdKTtcbiAgfVxuICBfc2V0VGV4dFN0eWxlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBURVhUX0FMSUdOTUVOVCA9IFtcImxlZnRcIiwgXCJjZW50ZXJcIiwgXCJyaWdodFwiXTtcbiAgICBjb25zdCB7XG4gICAgICBmb250Q29sb3JcbiAgICB9ID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YTtcbiAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemUgfHwgYW5ub3RhdGlvbl9sYXllcl9ERUZBVUxUX0ZPTlRfU0laRTtcbiAgICBjb25zdCBzdHlsZSA9IGVsZW1lbnQuc3R5bGU7XG4gICAgbGV0IGNvbXB1dGVkRm9udFNpemU7XG4gICAgY29uc3QgQk9SREVSX1NJWkUgPSAyO1xuICAgIGNvbnN0IHJvdW5kVG9PbmVEZWNpbWFsID0geCA9PiBNYXRoLnJvdW5kKDEwICogeCkgLyAxMDtcbiAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5hYnModGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXSAtIEJPUkRFUl9TSVpFKTtcbiAgICAgIGNvbnN0IG51bWJlck9mTGluZXMgPSBNYXRoLnJvdW5kKGhlaWdodCAvIChMSU5FX0ZBQ1RPUiAqIGZvbnRTaXplKSkgfHwgMTtcbiAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBoZWlnaHQgLyBudW1iZXJPZkxpbmVzO1xuICAgICAgY29tcHV0ZWRGb250U2l6ZSA9IE1hdGgubWluKGZvbnRTaXplLCByb3VuZFRvT25lRGVjaW1hbChsaW5lSGVpZ2h0IC8gTElORV9GQUNUT1IpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5hYnModGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXSAtIEJPUkRFUl9TSVpFKTtcbiAgICAgIGNvbXB1dGVkRm9udFNpemUgPSBNYXRoLm1pbihmb250U2l6ZSwgcm91bmRUb09uZURlY2ltYWwoaGVpZ2h0IC8gTElORV9GQUNUT1IpKTtcbiAgICB9XG4gICAgc3R5bGUuZm9udFNpemUgPSBgY2FsYygke2NvbXB1dGVkRm9udFNpemV9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG4gICAgc3R5bGUuY29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvcihmb250Q29sb3JbMF0sIGZvbnRDb2xvclsxXSwgZm9udENvbG9yWzJdKTtcbiAgICBpZiAodGhpcy5kYXRhLnRleHRBbGlnbm1lbnQgIT09IG51bGwpIHtcbiAgICAgIHN0eWxlLnRleHRBbGlnbiA9IFRFWFRfQUxJR05NRU5UW3RoaXMuZGF0YS50ZXh0QWxpZ25tZW50XTtcbiAgICB9XG4gIH1cbiAgX3NldFJlcXVpcmVkKGVsZW1lbnQsIGlzUmVxdWlyZWQpIHtcbiAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKTtcbiAgICB9XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLXJlcXVpcmVkXCIsIGlzUmVxdWlyZWQpO1xuICB9XG59XG5jbGFzcyBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBpc1JlbmRlcmFibGUgPSBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zIHx8IHBhcmFtZXRlcnMuZGF0YS5oYXNPd25DYW52YXMgfHwgIXBhcmFtZXRlcnMuZGF0YS5oYXNBcHBlYXJhbmNlICYmICEhcGFyYW1ldGVycy5kYXRhLmZpZWxkVmFsdWU7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlXG4gICAgfSk7XG4gIH1cbiAgc2V0UHJvcGVydHlPblNpYmxpbmdzKGJhc2UsIGtleSwgdmFsdWUsIGtleUluU3RvcmFnZSkge1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShiYXNlLm5hbWUsIGJhc2UuaWQpKSB7XG4gICAgICBpZiAoZWxlbWVudC5kb21FbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuZG9tRWxlbWVudFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBzdG9yYWdlLnNldFZhbHVlKGVsZW1lbnQuaWQsIHtcbiAgICAgICAgW2tleUluU3RvcmFnZV06IHZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhLmlkO1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ0ZXh0V2lkZ2V0QW5ub3RhdGlvblwiKTtcbiAgICBsZXQgZWxlbWVudCA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVuZGVyRm9ybXMpIHtcbiAgICAgIGNvbnN0IHN0b3JlZERhdGEgPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLmRhdGEuZmllbGRWYWx1ZVxuICAgICAgfSk7XG4gICAgICBsZXQgdGV4dENvbnRlbnQgPSBzdG9yZWREYXRhLnZhbHVlIHx8IFwiXCI7XG4gICAgICBjb25zdCBtYXhMZW4gPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG4gICAgICAgIGNoYXJMaW1pdDogdGhpcy5kYXRhLm1heExlblxuICAgICAgfSkuY2hhckxpbWl0O1xuICAgICAgaWYgKG1heExlbiAmJiB0ZXh0Q29udGVudC5sZW5ndGggPiBtYXhMZW4pIHtcbiAgICAgICAgdGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudC5zbGljZSgwLCBtYXhMZW4pO1xuICAgICAgfVxuICAgICAgbGV0IGZpZWxkRm9ybWF0dGVkVmFsdWVzID0gc3RvcmVkRGF0YS5mb3JtYXR0ZWRWYWx1ZSB8fCB0aGlzLmRhdGEudGV4dENvbnRlbnQ/LmpvaW4oXCJcXG5cIikgfHwgbnVsbDtcbiAgICAgIGlmIChmaWVsZEZvcm1hdHRlZFZhbHVlcyAmJiB0aGlzLmRhdGEuY29tYikge1xuICAgICAgICBmaWVsZEZvcm1hdHRlZFZhbHVlcyA9IGZpZWxkRm9ybWF0dGVkVmFsdWVzLnJlcGxhY2VBbGwoL1xccysvZywgXCJcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50RGF0YSA9IHtcbiAgICAgICAgdXNlclZhbHVlOiB0ZXh0Q29udGVudCxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6IGZpZWxkRm9ybWF0dGVkVmFsdWVzLFxuICAgICAgICBsYXN0Q29tbWl0dGVkVmFsdWU6IG51bGwsXG4gICAgICAgIGNvbW1pdEtleTogMSxcbiAgICAgICAgZm9jdXNlZDogZmFsc2VcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gZmllbGRGb3JtYXR0ZWRWYWx1ZXMgPz8gdGV4dENvbnRlbnQ7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZG9Ob3RTY3JvbGwpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIGVsZW1lbnQudHlwZSA9IFwidGV4dFwiO1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInZhbHVlXCIsIGZpZWxkRm9ybWF0dGVkVmFsdWVzID8/IHRleHRDb250ZW50KTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5kb05vdFNjcm9sbCkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYID0gXCJoaWRkZW5cIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGF0YS5oYXNPd25DYW52YXMpIHtcbiAgICAgICAgZWxlbWVudC5oaWRkZW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgR2V0RWxlbWVudHNCeU5hbWVTZXQuYWRkKGVsZW1lbnQpO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgaWQpO1xuICAgICAgZWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGF0YS5yZWFkT25seTtcbiAgICAgIGVsZW1lbnQubmFtZSA9IHRoaXMuZGF0YS5maWVsZE5hbWU7XG4gICAgICBlbGVtZW50LnRhYkluZGV4ID0gREVGQVVMVF9UQUJfSU5ERVg7XG4gICAgICB0aGlzLl9zZXRSZXF1aXJlZChlbGVtZW50LCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuICAgICAgaWYgKG1heExlbikge1xuICAgICAgICBlbGVtZW50Lm1heExlbmd0aCA9IG1heExlbjtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcbiAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgIHZhbHVlOiBldmVudC50YXJnZXQudmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlPblNpYmxpbmdzKGVsZW1lbnQsIFwidmFsdWVcIiwgZXZlbnQudGFyZ2V0LnZhbHVlLCBcInZhbHVlXCIpO1xuICAgICAgICBlbGVtZW50RGF0YS5mb3JtYXR0ZWRWYWx1ZSA9IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSA/PyBcIlwiO1xuICAgICAgICBlbGVtZW50LnZhbHVlID0gZWxlbWVudERhdGEudXNlclZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICBlbGVtZW50RGF0YS5mb3JtYXR0ZWRWYWx1ZSA9IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGxldCBibHVyTGlzdGVuZXIgPSBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZVxuICAgICAgICB9ID0gZWxlbWVudERhdGE7XG4gICAgICAgIGlmIChmb3JtYXR0ZWRWYWx1ZSAhPT0gbnVsbCAmJiBmb3JtYXR0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQudGFyZ2V0LnNjcm9sbExlZnQgPSAwO1xuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmZvY3VzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgfSA9IGV2ZW50O1xuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS51c2VyVmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGVsZW1lbnREYXRhLnVzZXJWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xuICAgICAgICAgIGVsZW1lbnREYXRhLmNvbW1pdEtleSA9IDE7XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuYWN0aW9ucz8uRm9jdXMpIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGpzRXZlbnQgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd0VsZW1lbnRBbmRIaWRlQ2FudmFzKGpzRXZlbnQudGFyZ2V0KTtcbiAgICAgICAgICBjb25zdCBhY3Rpb25zID0ge1xuICAgICAgICAgICAgdmFsdWUoZXZlbnQpIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudXNlclZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlID8/IFwiXCI7XG4gICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZWxlbWVudERhdGEudXNlclZhbHVlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IGVsZW1lbnREYXRhLnVzZXJWYWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZShldmVudCkge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWVcbiAgICAgICAgICAgICAgfSA9IGV2ZW50LmRldGFpbDtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEuZm9ybWF0dGVkVmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGZvcm1hdHRlZFZhbHVlICE9PSBudWxsICYmIGZvcm1hdHRlZFZhbHVlICE9PSB1bmRlZmluZWQgJiYgZXZlbnQudGFyZ2V0ICE9PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlbFJhbmdlKGV2ZW50KSB7XG4gICAgICAgICAgICAgIGV2ZW50LnRhcmdldC5zZXRTZWxlY3Rpb25SYW5nZSguLi5ldmVudC5kZXRhaWwuc2VsUmFuZ2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoYXJMaW1pdDogZXZlbnQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgY2hhckxpbWl0XG4gICAgICAgICAgICAgIH0gPSBldmVudC5kZXRhaWw7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICB0YXJnZXRcbiAgICAgICAgICAgICAgfSA9IGV2ZW50O1xuICAgICAgICAgICAgICBpZiAoY2hhckxpbWl0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShcIm1heExlbmd0aFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcIm1heExlbmd0aFwiLCBjaGFyTGltaXQpO1xuICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWU7XG4gICAgICAgICAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoIDw9IGNoYXJMaW1pdCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGNoYXJMaW1pdCk7XG4gICAgICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgY29tbWl0S2V5OiAxLFxuICAgICAgICAgICAgICAgICAgc2VsU3RhcnQ6IHRhcmdldC5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgICAgIHNlbEVuZDogdGFyZ2V0LnNlbGVjdGlvbkVuZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICBlbGVtZW50RGF0YS5jb21taXRLZXkgPSAxO1xuICAgICAgICAgIGxldCBjb21taXRLZXkgPSAtMTtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgICAgICBjb21taXRLZXkgPSAwO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIgJiYgIXRoaXMuZGF0YS5tdWx0aUxpbmUpIHtcbiAgICAgICAgICAgIGNvbW1pdEtleSA9IDI7XG4gICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IFwiVGFiXCIpIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmNvbW1pdEtleSA9IDM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb21taXRLZXkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgfSA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50RGF0YS5sYXN0Q29tbWl0dGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBlbGVtZW50RGF0YS51c2VyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgd2lsbENvbW1pdDogdHJ1ZSxcbiAgICAgICAgICAgICAgY29tbWl0S2V5LFxuICAgICAgICAgICAgICBzZWxTdGFydDogZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICAgICBzZWxFbmQ6IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IF9ibHVyTGlzdGVuZXIgPSBibHVyTGlzdGVuZXI7XG4gICAgICAgIGJsdXJMaXN0ZW5lciA9IG51bGw7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgIGlmICghZWxlbWVudERhdGEuZm9jdXNlZCB8fCAhZXZlbnQucmVsYXRlZFRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5hY3Rpb25zPy5CbHVyKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgfSA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICBlbGVtZW50RGF0YS51c2VyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIHdpbGxDb21taXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY29tbWl0S2V5OiBlbGVtZW50RGF0YS5jb21taXRLZXksXG4gICAgICAgICAgICAgICAgc2VsU3RhcnQ6IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgICBzZWxFbmQ6IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9ibHVyTGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5hY3Rpb25zPy5LZXlzdHJva2UpIHtcbiAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCBldmVudCA9PiB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5sYXN0Q29tbWl0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICB0YXJnZXRcbiAgICAgICAgICAgIH0gPSBldmVudDtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICAgICBzZWxlY3Rpb25FbmRcbiAgICAgICAgICAgIH0gPSB0YXJnZXQ7XG4gICAgICAgICAgICBsZXQgc2VsU3RhcnQgPSBzZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgc2VsRW5kID0gc2VsZWN0aW9uRW5kO1xuICAgICAgICAgICAgc3dpdGNoIChldmVudC5pbnB1dFR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRCYWNrd2FyZFwiOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdmFsdWUuc3Vic3RyaW5nKDAsIHNlbGVjdGlvblN0YXJ0KS5tYXRjaCgvXFx3KlteXFx3XSokLyk7XG4gICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsU3RhcnQgLT0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlV29yZEZvcndhcmRcIjpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHZhbHVlLnN1YnN0cmluZyhzZWxlY3Rpb25TdGFydCkubWF0Y2goL15bXlxcd10qXFx3Ki8pO1xuICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbEVuZCArPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVDb250ZW50QmFja3dhcmRcIjpcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPT09IHNlbGVjdGlvbkVuZCkge1xuICAgICAgICAgICAgICAgICAgc2VsU3RhcnQgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVDb250ZW50Rm9yd2FyZFwiOlxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA9PT0gc2VsZWN0aW9uRW5kKSB7XG4gICAgICAgICAgICAgICAgICBzZWxFbmQgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIGNoYW5nZTogZGF0YSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHdpbGxDb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlbFN0YXJ0LFxuICAgICAgICAgICAgICAgIHNlbEVuZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVycyhlbGVtZW50LCBlbGVtZW50RGF0YSwgW1tcImZvY3VzXCIsIFwiRm9jdXNcIl0sIFtcImJsdXJcIiwgXCJCbHVyXCJdLCBbXCJtb3VzZWRvd25cIiwgXCJNb3VzZSBEb3duXCJdLCBbXCJtb3VzZWVudGVyXCIsIFwiTW91c2UgRW50ZXJcIl0sIFtcIm1vdXNlbGVhdmVcIiwgXCJNb3VzZSBFeGl0XCJdLCBbXCJtb3VzZXVwXCIsIFwiTW91c2UgVXBcIl1dLCBldmVudCA9PiBldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKGJsdXJMaXN0ZW5lcikge1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGJsdXJMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHtcbiAgICAgICAgY29uc3QgZmllbGRXaWR0aCA9IHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF07XG4gICAgICAgIGNvbnN0IGNvbWJXaWR0aCA9IGZpZWxkV2lkdGggLyBtYXhMZW47XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImNvbWJcIik7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUubGV0dGVyU3BhY2luZyA9IGBjYWxjKCR7Y29tYldpZHRofXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSAtIDFjaClgO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZTtcbiAgICAgIGVsZW1lbnQuc3R5bGUudmVydGljYWxBbGlnbiA9IFwibWlkZGxlXCI7XG4gICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcInRhYmxlLWNlbGxcIjtcbiAgICAgIGlmICh0aGlzLmRhdGEuaGFzT3duQ2FudmFzKSB7XG4gICAgICAgIGVsZW1lbnQuaGlkZGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc2V0VGV4dFN0eWxlKGVsZW1lbnQpO1xuICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvcihlbGVtZW50KTtcbiAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhlbGVtZW50KTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoZWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogISFwYXJhbWV0ZXJzLmRhdGEuaGFzT3duQ2FudmFzXG4gICAgfSk7XG4gIH1cbn1cbmNsYXNzIENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHBhcmFtZXRlcnMucmVuZGVyRm9ybXNcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCBpZCA9IGRhdGEuaWQ7XG4gICAgbGV0IHZhbHVlID0gc3RvcmFnZS5nZXRWYWx1ZShpZCwge1xuICAgICAgdmFsdWU6IGRhdGEuZXhwb3J0VmFsdWUgPT09IGRhdGEuZmllbGRWYWx1ZVxuICAgIH0pLnZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUgIT09IFwiT2ZmXCI7XG4gICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgIHZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImJ1dHRvbldpZGdldEFubm90YXRpb25cIiwgXCJjaGVja0JveFwiKTtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgIEdldEVsZW1lbnRzQnlOYW1lU2V0LmFkZChlbGVtZW50KTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBpZCk7XG4gICAgZWxlbWVudC5kaXNhYmxlZCA9IGRhdGEucmVhZE9ubHk7XG4gICAgdGhpcy5fc2V0UmVxdWlyZWQoZWxlbWVudCwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICBlbGVtZW50LnR5cGUgPSBcImNoZWNrYm94XCI7XG4gICAgZWxlbWVudC5uYW1lID0gZGF0YS5maWVsZE5hbWU7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgdHJ1ZSk7XG4gICAgfVxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZXhwb3J0VmFsdWVcIiwgZGF0YS5leHBvcnRWYWx1ZSk7XG4gICAgZWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBldmVudCA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNoZWNrZWRcbiAgICAgIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICBmb3IgKGNvbnN0IGNoZWNrYm94IG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKG5hbWUsIGlkKSkge1xuICAgICAgICBjb25zdCBjdXJDaGVja2VkID0gY2hlY2tlZCAmJiBjaGVja2JveC5leHBvcnRWYWx1ZSA9PT0gZGF0YS5leHBvcnRWYWx1ZTtcbiAgICAgICAgaWYgKGNoZWNrYm94LmRvbUVsZW1lbnQpIHtcbiAgICAgICAgICBjaGVja2JveC5kb21FbGVtZW50LmNoZWNrZWQgPSBjdXJDaGVja2VkO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoY2hlY2tib3guaWQsIHtcbiAgICAgICAgICB2YWx1ZTogY3VyQ2hlY2tlZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgdmFsdWU6IGNoZWNrZWRcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkYXRhLmRlZmF1bHRGaWVsZFZhbHVlIHx8IFwiT2ZmXCI7XG4gICAgICBldmVudC50YXJnZXQuY2hlY2tlZCA9IGRlZmF1bHRWYWx1ZSA9PT0gZGF0YS5leHBvcnRWYWx1ZTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGpzRXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpb25zID0ge1xuICAgICAgICAgIHZhbHVlKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC50YXJnZXQuY2hlY2tlZCA9IGV2ZW50LmRldGFpbC52YWx1ZSAhPT0gXCJPZmZcIjtcbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50LnRhcmdldC5jaGVja2VkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChhY3Rpb25zLCBqc0V2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgbnVsbCwgW1tcImNoYW5nZVwiLCBcIlZhbGlkYXRlXCJdLCBbXCJjaGFuZ2VcIiwgXCJBY3Rpb25cIl0sIFtcImZvY3VzXCIsIFwiRm9jdXNcIl0sIFtcImJsdXJcIiwgXCJCbHVyXCJdLCBbXCJtb3VzZWRvd25cIiwgXCJNb3VzZSBEb3duXCJdLCBbXCJtb3VzZWVudGVyXCIsIFwiTW91c2UgRW50ZXJcIl0sIFtcIm1vdXNlbGVhdmVcIiwgXCJNb3VzZSBFeGl0XCJdLCBbXCJtb3VzZXVwXCIsIFwiTW91c2UgVXBcIl1dLCBldmVudCA9PiBldmVudC50YXJnZXQuY2hlY2tlZCk7XG4gICAgfVxuICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvcihlbGVtZW50KTtcbiAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhlbGVtZW50KTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoZWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uXCIsIFwicmFkaW9CdXR0b25cIik7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCBpZCA9IGRhdGEuaWQ7XG4gICAgbGV0IHZhbHVlID0gc3RvcmFnZS5nZXRWYWx1ZShpZCwge1xuICAgICAgdmFsdWU6IGRhdGEuZmllbGRWYWx1ZSA9PT0gZGF0YS5idXR0b25WYWx1ZVxuICAgIH0pLnZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUgIT09IGRhdGEuYnV0dG9uVmFsdWU7XG4gICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgIHZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBmb3IgKGNvbnN0IHJhZGlvIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKGRhdGEuZmllbGROYW1lLCBpZCkpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShyYWRpby5pZCwge1xuICAgICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBHZXRFbGVtZW50c0J5TmFtZVNldC5hZGQoZWxlbWVudCk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgaWQpO1xuICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBkYXRhLnJlYWRPbmx5O1xuICAgIHRoaXMuX3NldFJlcXVpcmVkKGVsZW1lbnQsIHRoaXMuZGF0YS5yZXF1aXJlZCk7XG4gICAgZWxlbWVudC50eXBlID0gXCJyYWRpb1wiO1xuICAgIGVsZW1lbnQubmFtZSA9IGRhdGEuZmllbGROYW1lO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHRydWUpO1xuICAgIH1cbiAgICBlbGVtZW50LnRhYkluZGV4ID0gREVGQVVMVF9UQUJfSU5ERVg7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgY2hlY2tlZFxuICAgICAgfSA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGZvciAoY29uc3QgcmFkaW8gb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUobmFtZSwgaWQpKSB7XG4gICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUocmFkaW8uaWQsIHtcbiAgICAgICAgICB2YWx1ZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgIHZhbHVlOiBjaGVja2VkXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGF0YS5kZWZhdWx0RmllbGRWYWx1ZTtcbiAgICAgIGV2ZW50LnRhcmdldC5jaGVja2VkID0gZGVmYXVsdFZhbHVlICE9PSBudWxsICYmIGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGRlZmF1bHRWYWx1ZSA9PT0gZGF0YS5idXR0b25WYWx1ZTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHBkZkJ1dHRvblZhbHVlID0gZGF0YS5idXR0b25WYWx1ZTtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGpzRXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpb25zID0ge1xuICAgICAgICAgIHZhbHVlOiBldmVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkID0gcGRmQnV0dG9uVmFsdWUgPT09IGV2ZW50LmRldGFpbC52YWx1ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmFkaW8gb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoZXZlbnQudGFyZ2V0Lm5hbWUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1ckNoZWNrZWQgPSBjaGVja2VkICYmIHJhZGlvLmlkID09PSBpZDtcbiAgICAgICAgICAgICAgaWYgKHJhZGlvLmRvbUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByYWRpby5kb21FbGVtZW50LmNoZWNrZWQgPSBjdXJDaGVja2VkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUocmFkaW8uaWQsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogY3VyQ2hlY2tlZFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChhY3Rpb25zLCBqc0V2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgbnVsbCwgW1tcImNoYW5nZVwiLCBcIlZhbGlkYXRlXCJdLCBbXCJjaGFuZ2VcIiwgXCJBY3Rpb25cIl0sIFtcImZvY3VzXCIsIFwiRm9jdXNcIl0sIFtcImJsdXJcIiwgXCJCbHVyXCJdLCBbXCJtb3VzZWRvd25cIiwgXCJNb3VzZSBEb3duXCJdLCBbXCJtb3VzZWVudGVyXCIsIFwiTW91c2UgRW50ZXJcIl0sIFtcIm1vdXNlbGVhdmVcIiwgXCJNb3VzZSBFeGl0XCJdLCBbXCJtb3VzZXVwXCIsIFwiTW91c2UgVXBcIl1dLCBldmVudCA9PiBldmVudC50YXJnZXQuY2hlY2tlZCk7XG4gICAgfVxuICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvcihlbGVtZW50KTtcbiAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhlbGVtZW50KTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoZWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaWdub3JlQm9yZGVyOiBwYXJhbWV0ZXJzLmRhdGEuaGFzQXBwZWFyYW5jZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBzdXBlci5yZW5kZXIoKTtcbiAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChcImJ1dHRvbldpZGdldEFubm90YXRpb25cIiwgXCJwdXNoQnV0dG9uXCIpO1xuICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gY29udGFpbmVyLmxhc3RDaGlsZDtcbiAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMgJiYgbGlua0VsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGxpbmtFbGVtZW50KTtcbiAgICAgIGxpbmtFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KHt9LCBqc0V2ZW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogcGFyYW1ldGVycy5yZW5kZXJGb3Jtc1xuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY2hvaWNlV2lkZ2V0QW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBjb25zdCBpZCA9IHRoaXMuZGF0YS5pZDtcbiAgICBjb25zdCBzdG9yZWREYXRhID0gc3RvcmFnZS5nZXRWYWx1ZShpZCwge1xuICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlXG4gICAgfSk7XG4gICAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIik7XG4gICAgR2V0RWxlbWVudHNCeU5hbWVTZXQuYWRkKHNlbGVjdEVsZW1lbnQpO1xuICAgIHNlbGVjdEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGlkKTtcbiAgICBzZWxlY3RFbGVtZW50LmRpc2FibGVkID0gdGhpcy5kYXRhLnJlYWRPbmx5O1xuICAgIHRoaXMuX3NldFJlcXVpcmVkKHNlbGVjdEVsZW1lbnQsIHRoaXMuZGF0YS5yZXF1aXJlZCk7XG4gICAgc2VsZWN0RWxlbWVudC5uYW1lID0gdGhpcy5kYXRhLmZpZWxkTmFtZTtcbiAgICBzZWxlY3RFbGVtZW50LnRhYkluZGV4ID0gREVGQVVMVF9UQUJfSU5ERVg7XG4gICAgbGV0IGFkZEFuRW1wdHlFbnRyeSA9IHRoaXMuZGF0YS5jb21ibyAmJiB0aGlzLmRhdGEub3B0aW9ucy5sZW5ndGggPiAwO1xuICAgIGlmICghdGhpcy5kYXRhLmNvbWJvKSB7XG4gICAgICBzZWxlY3RFbGVtZW50LnNpemUgPSB0aGlzLmRhdGEub3B0aW9ucy5sZW5ndGg7XG4gICAgICBpZiAodGhpcy5kYXRhLm11bHRpU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdEVsZW1lbnQubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlO1xuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygc2VsZWN0RWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG9wdGlvbi52YWx1ZSA9PT0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHRoaXMuZGF0YS5vcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgIG9wdGlvbkVsZW1lbnQudGV4dENvbnRlbnQgPSBvcHRpb24uZGlzcGxheVZhbHVlO1xuICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IG9wdGlvbi5leHBvcnRWYWx1ZTtcbiAgICAgIGlmIChzdG9yZWREYXRhLnZhbHVlLmluY2x1ZGVzKG9wdGlvbi5leHBvcnRWYWx1ZSkpIHtcbiAgICAgICAgb3B0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiLCB0cnVlKTtcbiAgICAgICAgYWRkQW5FbXB0eUVudHJ5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBzZWxlY3RFbGVtZW50LmFwcGVuZChvcHRpb25FbGVtZW50KTtcbiAgICB9XG4gICAgbGV0IHJlbW92ZUVtcHR5RW50cnkgPSBudWxsO1xuICAgIGlmIChhZGRBbkVtcHR5RW50cnkpIHtcbiAgICAgIGNvbnN0IG5vbmVPcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgIG5vbmVPcHRpb25FbGVtZW50LnZhbHVlID0gXCIgXCI7XG4gICAgICBub25lT3B0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgdHJ1ZSk7XG4gICAgICBub25lT3B0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiLCB0cnVlKTtcbiAgICAgIHNlbGVjdEVsZW1lbnQucHJlcGVuZChub25lT3B0aW9uRWxlbWVudCk7XG4gICAgICByZW1vdmVFbXB0eUVudHJ5ID0gKCkgPT4ge1xuICAgICAgICBub25lT3B0aW9uRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgc2VsZWN0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgcmVtb3ZlRW1wdHlFbnRyeSk7XG4gICAgICAgIHJlbW92ZUVtcHR5RW50cnkgPSBudWxsO1xuICAgICAgfTtcbiAgICAgIHNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHJlbW92ZUVtcHR5RW50cnkpO1xuICAgIH1cbiAgICBjb25zdCBnZXRWYWx1ZSA9IGlzRXhwb3J0ID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBpc0V4cG9ydCA/IFwidmFsdWVcIiA6IFwidGV4dENvbnRlbnRcIjtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgbXVsdGlwbGVcbiAgICAgIH0gPSBzZWxlY3RFbGVtZW50O1xuICAgICAgaWYgKCFtdWx0aXBsZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5zZWxlY3RlZEluZGV4ID09PSAtMSA/IG51bGwgOiBvcHRpb25zW29wdGlvbnMuc2VsZWN0ZWRJbmRleF1bbmFtZV07XG4gICAgICB9XG4gICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG9wdGlvbnMsIG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQpLm1hcChvcHRpb24gPT4gb3B0aW9uW25hbWVdKTtcbiAgICB9O1xuICAgIGxldCBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcbiAgICBjb25zdCBnZXRJdGVtcyA9IGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBldmVudC50YXJnZXQub3B0aW9ucztcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwob3B0aW9ucywgb3B0aW9uID0+ICh7XG4gICAgICAgIGRpc3BsYXlWYWx1ZTogb3B0aW9uLnRleHRDb250ZW50LFxuICAgICAgICBleHBvcnRWYWx1ZTogb3B0aW9uLnZhbHVlXG4gICAgICB9KSk7XG4gICAgfTtcbiAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgIHNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGpzRXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpb25zID0ge1xuICAgICAgICAgIHZhbHVlKGV2ZW50KSB7XG4gICAgICAgICAgICByZW1vdmVFbXB0eUVudHJ5Py4oKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gbmV3IFNldChBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBzZWxlY3RFbGVtZW50Lm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdmFsdWVzLmhhcyhvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdWx0aXBsZVNlbGVjdGlvbihldmVudCkge1xuICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5tdWx0aXBsZSA9IHRydWU7XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZW1vdmUoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBzZWxlY3RFbGVtZW50Lm9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGV2ZW50LmRldGFpbC5yZW1vdmU7XG4gICAgICAgICAgICBvcHRpb25zW2luZGV4XS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5yZW1vdmUoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBpID0gQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleC5jYWxsKG9wdGlvbnMsIG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQpO1xuICAgICAgICAgICAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zWzBdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSksXG4gICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhldmVudClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGVhcihldmVudCkge1xuICAgICAgICAgICAgd2hpbGUgKHNlbGVjdEVsZW1lbnQubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQucmVtb3ZlKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5zZXJ0KGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBkaXNwbGF5VmFsdWUsXG4gICAgICAgICAgICAgIGV4cG9ydFZhbHVlXG4gICAgICAgICAgICB9ID0gZXZlbnQuZGV0YWlsLmluc2VydDtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdENoaWxkID0gc2VsZWN0RWxlbWVudC5jaGlsZHJlbltpbmRleF07XG4gICAgICAgICAgICBjb25zdCBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQudGV4dENvbnRlbnQgPSBkaXNwbGF5VmFsdWU7XG4gICAgICAgICAgICBvcHRpb25FbGVtZW50LnZhbHVlID0gZXhwb3J0VmFsdWU7XG4gICAgICAgICAgICBpZiAoc2VsZWN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgc2VsZWN0Q2hpbGQuYmVmb3JlKG9wdGlvbkVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5hcHBlbmQob3B0aW9uRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSh0cnVlKSxcbiAgICAgICAgICAgICAgaXRlbXM6IGdldEl0ZW1zKGV2ZW50KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGl0ZW1zKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGl0ZW1zXG4gICAgICAgICAgICB9ID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICAgICAgd2hpbGUgKHNlbGVjdEVsZW1lbnQubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQucmVtb3ZlKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWUsXG4gICAgICAgICAgICAgICAgZXhwb3J0VmFsdWVcbiAgICAgICAgICAgICAgfSA9IGl0ZW07XG4gICAgICAgICAgICAgIGNvbnN0IG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgICAgICAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gZGlzcGxheVZhbHVlO1xuICAgICAgICAgICAgICBvcHRpb25FbGVtZW50LnZhbHVlID0gZXhwb3J0VmFsdWU7XG4gICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kKG9wdGlvbkVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGVjdEVsZW1lbnQub3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQub3B0aW9uc1swXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSh0cnVlKSxcbiAgICAgICAgICAgICAgaXRlbXM6IGdldEl0ZW1zKGV2ZW50KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluZGljZXMoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBuZXcgU2V0KGV2ZW50LmRldGFpbC5pbmRpY2VzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGV2ZW50LnRhcmdldC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IGluZGljZXMuaGFzKG9wdGlvbi5pbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSh0cnVlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVkaXRhYmxlKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC50YXJnZXQuZGlzYWJsZWQgPSAhZXZlbnQuZGV0YWlsLmVkaXRhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGFjdGlvbnMsIGpzRXZlbnQpO1xuICAgICAgfSk7XG4gICAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGV4cG9ydFZhbHVlID0gZ2V0VmFsdWUodHJ1ZSk7XG4gICAgICAgIGNvbnN0IGNoYW5nZSA9IGdldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgIHZhbHVlOiBleHBvcnRWYWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRWYWx1ZXMsXG4gICAgICAgICAgICBjaGFuZ2UsXG4gICAgICAgICAgICBjaGFuZ2VFeDogZXhwb3J0VmFsdWUsXG4gICAgICAgICAgICB3aWxsQ29tbWl0OiBmYWxzZSxcbiAgICAgICAgICAgIGNvbW1pdEtleTogMSxcbiAgICAgICAgICAgIGtleURvd246IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMoc2VsZWN0RWxlbWVudCwgbnVsbCwgW1tcImZvY3VzXCIsIFwiRm9jdXNcIl0sIFtcImJsdXJcIiwgXCJCbHVyXCJdLCBbXCJtb3VzZWRvd25cIiwgXCJNb3VzZSBEb3duXCJdLCBbXCJtb3VzZWVudGVyXCIsIFwiTW91c2UgRW50ZXJcIl0sIFtcIm1vdXNlbGVhdmVcIiwgXCJNb3VzZSBFeGl0XCJdLCBbXCJtb3VzZXVwXCIsIFwiTW91c2UgVXBcIl0sIFtcImlucHV0XCIsIFwiQWN0aW9uXCJdLCBbXCJpbnB1dFwiLCBcIlZhbGlkYXRlXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSlcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YS5jb21ibykge1xuICAgICAgdGhpcy5fc2V0VGV4dFN0eWxlKHNlbGVjdEVsZW1lbnQpO1xuICAgIH0gZWxzZSB7fVxuICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvcihzZWxlY3RFbGVtZW50KTtcbiAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhzZWxlY3RFbGVtZW50KTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc2VsZWN0RWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBQb3B1cEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGF0YSxcbiAgICAgIGVsZW1lbnRzXG4gICAgfSA9IHBhcmFtZXRlcnM7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiBBbm5vdGF0aW9uRWxlbWVudC5faGFzUG9wdXBEYXRhKGRhdGEpXG4gICAgfSk7XG4gICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgIHRoaXMucG9wdXAgPSBudWxsO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwicG9wdXBBbm5vdGF0aW9uXCIpO1xuICAgIGNvbnN0IHBvcHVwID0gdGhpcy5wb3B1cCA9IG5ldyBQb3B1cEVsZW1lbnQoe1xuICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcbiAgICAgIGNvbG9yOiB0aGlzLmRhdGEuY29sb3IsXG4gICAgICB0aXRsZU9iajogdGhpcy5kYXRhLnRpdGxlT2JqLFxuICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUsXG4gICAgICBjb250ZW50c09iajogdGhpcy5kYXRhLmNvbnRlbnRzT2JqLFxuICAgICAgcmljaFRleHQ6IHRoaXMuZGF0YS5yaWNoVGV4dCxcbiAgICAgIHJlY3Q6IHRoaXMuZGF0YS5yZWN0LFxuICAgICAgcGFyZW50UmVjdDogdGhpcy5kYXRhLnBhcmVudFJlY3QgfHwgbnVsbCxcbiAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQsXG4gICAgICBlbGVtZW50czogdGhpcy5lbGVtZW50cyxcbiAgICAgIG9wZW46IHRoaXMuZGF0YS5vcGVuXG4gICAgfSk7XG4gICAgY29uc3QgZWxlbWVudElkcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICBlbGVtZW50LnBvcHVwID0gcG9wdXA7XG4gICAgICBlbGVtZW50SWRzLnB1c2goZWxlbWVudC5kYXRhLmlkKTtcbiAgICAgIGVsZW1lbnQuYWRkSGlnaGxpZ2h0QXJlYSgpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIsIGVsZW1lbnRJZHMubWFwKGlkID0+IGAke0Fubm90YXRpb25QcmVmaXh9JHtpZH1gKS5qb2luKFwiLFwiKSk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBQb3B1cEVsZW1lbnQge1xuICAjYm91bmRLZXlEb3duID0gdGhpcy4ja2V5RG93bi5iaW5kKHRoaXMpO1xuICAjYm91bmRIaWRlID0gdGhpcy4jaGlkZS5iaW5kKHRoaXMpO1xuICAjYm91bmRTaG93ID0gdGhpcy4jc2hvdy5iaW5kKHRoaXMpO1xuICAjYm91bmRUb2dnbGUgPSB0aGlzLiN0b2dnbGUuYmluZCh0aGlzKTtcbiAgI2NvbG9yID0gbnVsbDtcbiAgI2NvbnRhaW5lciA9IG51bGw7XG4gICNjb250ZW50c09iaiA9IG51bGw7XG4gICNkYXRlT2JqID0gbnVsbDtcbiAgI2VsZW1lbnRzID0gbnVsbDtcbiAgI3BhcmVudCA9IG51bGw7XG4gICNwYXJlbnRSZWN0ID0gbnVsbDtcbiAgI3Bpbm5lZCA9IGZhbHNlO1xuICAjcG9wdXAgPSBudWxsO1xuICAjcG9zaXRpb24gPSBudWxsO1xuICAjcmVjdCA9IG51bGw7XG4gICNyaWNoVGV4dCA9IG51bGw7XG4gICN0aXRsZU9iaiA9IG51bGw7XG4gICN1cGRhdGVzID0gbnVsbDtcbiAgI3dhc1Zpc2libGUgPSBmYWxzZTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNvbnRhaW5lcixcbiAgICBjb2xvcixcbiAgICBlbGVtZW50cyxcbiAgICB0aXRsZU9iaixcbiAgICBtb2RpZmljYXRpb25EYXRlLFxuICAgIGNvbnRlbnRzT2JqLFxuICAgIHJpY2hUZXh0LFxuICAgIHBhcmVudCxcbiAgICByZWN0LFxuICAgIHBhcmVudFJlY3QsXG4gICAgb3BlblxuICB9KSB7XG4gICAgdGhpcy4jY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuI3RpdGxlT2JqID0gdGl0bGVPYmo7XG4gICAgdGhpcy4jY29udGVudHNPYmogPSBjb250ZW50c09iajtcbiAgICB0aGlzLiNyaWNoVGV4dCA9IHJpY2hUZXh0O1xuICAgIHRoaXMuI3BhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLiNjb2xvciA9IGNvbG9yO1xuICAgIHRoaXMuI3JlY3QgPSByZWN0O1xuICAgIHRoaXMuI3BhcmVudFJlY3QgPSBwYXJlbnRSZWN0O1xuICAgIHRoaXMuI2VsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgdGhpcy4jZGF0ZU9iaiA9IFBERkRhdGVTdHJpbmcudG9EYXRlT2JqZWN0KG1vZGlmaWNhdGlvbkRhdGUpO1xuICAgIHRoaXMudHJpZ2dlciA9IGVsZW1lbnRzLmZsYXRNYXAoZSA9PiBlLmdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSk7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMudHJpZ2dlcikge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy4jYm91bmRUb2dnbGUpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCB0aGlzLiNib3VuZFNob3cpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB0aGlzLiNib3VuZEhpZGUpO1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwicG9wdXBUcmlnZ2VyQXJlYVwiKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICBlbGVtZW50LmNvbnRhaW5lcj8uYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlEb3duKTtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLmhpZGRlbiA9IHRydWU7XG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMuI3RvZ2dsZSgpO1xuICAgIH1cbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuI3BvcHVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBvcHVwID0gdGhpcy4jcG9wdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHBvcHVwLmNsYXNzTmFtZSA9IFwicG9wdXBcIjtcbiAgICBpZiAodGhpcy4jY29sb3IpIHtcbiAgICAgIGNvbnN0IGJhc2VDb2xvciA9IHBvcHVwLnN0eWxlLm91dGxpbmVDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKC4uLnRoaXMuI2NvbG9yKTtcbiAgICAgIGlmIChDU1Muc3VwcG9ydHMoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIFwiY29sb3ItbWl4KGluIHNyZ2IsIHJlZCAzMCUsIHdoaXRlKVwiKSkge1xuICAgICAgICBwb3B1cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBgY29sb3ItbWl4KGluIHNyZ2IsICR7YmFzZUNvbG9yfSAzMCUsIHdoaXRlKWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBCQUNLR1JPVU5EX0VOTElHSFQgPSAwLjc7XG4gICAgICAgIHBvcHVwLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKC4uLnRoaXMuI2NvbG9yLm1hcChjID0+IE1hdGguZmxvb3IoQkFDS0dST1VORF9FTkxJR0hUICogKDI1NSAtIGMpICsgYykpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgaGVhZGVyLmNsYXNzTmFtZSA9IFwiaGVhZGVyXCI7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDFcIik7XG4gICAgaGVhZGVyLmFwcGVuZCh0aXRsZSk7XG4gICAgKHtcbiAgICAgIGRpcjogdGl0bGUuZGlyLFxuICAgICAgc3RyOiB0aXRsZS50ZXh0Q29udGVudFxuICAgIH0gPSB0aGlzLiN0aXRsZU9iaik7XG4gICAgcG9wdXAuYXBwZW5kKGhlYWRlcik7XG4gICAgaWYgKHRoaXMuI2RhdGVPYmopIHtcbiAgICAgIGNvbnN0IG1vZGlmaWNhdGlvbkRhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGUuY2xhc3NMaXN0LmFkZChcInBvcHVwRGF0ZVwiKTtcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGUuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtYW5ub3RhdGlvbi1kYXRlLXN0cmluZ1wiKTtcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGUuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWFyZ3NcIiwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBkYXRlOiB0aGlzLiNkYXRlT2JqLnRvTG9jYWxlRGF0ZVN0cmluZygpLFxuICAgICAgICB0aW1lOiB0aGlzLiNkYXRlT2JqLnRvTG9jYWxlVGltZVN0cmluZygpXG4gICAgICB9KSk7XG4gICAgICBoZWFkZXIuYXBwZW5kKG1vZGlmaWNhdGlvbkRhdGUpO1xuICAgIH1cbiAgICBjb25zdCBodG1sID0gdGhpcy4jaHRtbDtcbiAgICBpZiAoaHRtbCkge1xuICAgICAgWGZhTGF5ZXIucmVuZGVyKHtcbiAgICAgICAgeGZhSHRtbDogaHRtbCxcbiAgICAgICAgaW50ZW50OiBcInJpY2hUZXh0XCIsXG4gICAgICAgIGRpdjogcG9wdXBcbiAgICAgIH0pO1xuICAgICAgcG9wdXAubGFzdENoaWxkLmNsYXNzTGlzdC5hZGQoXCJyaWNoVGV4dFwiLCBcInBvcHVwQ29udGVudFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGVudHMgPSB0aGlzLl9mb3JtYXRDb250ZW50cyh0aGlzLiNjb250ZW50c09iaik7XG4gICAgICBwb3B1cC5hcHBlbmQoY29udGVudHMpO1xuICAgIH1cbiAgICB0aGlzLiNjb250YWluZXIuYXBwZW5kKHBvcHVwKTtcbiAgfVxuICBnZXQgI2h0bWwoKSB7XG4gICAgY29uc3QgcmljaFRleHQgPSB0aGlzLiNyaWNoVGV4dDtcbiAgICBjb25zdCBjb250ZW50c09iaiA9IHRoaXMuI2NvbnRlbnRzT2JqO1xuICAgIGlmIChyaWNoVGV4dD8uc3RyICYmICghY29udGVudHNPYmo/LnN0ciB8fCBjb250ZW50c09iai5zdHIgPT09IHJpY2hUZXh0LnN0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLiNyaWNoVGV4dC5odG1sIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCAjZm9udFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2h0bWw/LmF0dHJpYnV0ZXM/LnN0eWxlPy5mb250U2l6ZSB8fCAwO1xuICB9XG4gIGdldCAjZm9udENvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLiNodG1sPy5hdHRyaWJ1dGVzPy5zdHlsZT8uY29sb3IgfHwgbnVsbDtcbiAgfVxuICAjbWFrZVBvcHVwQ29udGVudCh0ZXh0KSB7XG4gICAgY29uc3QgcG9wdXBMaW5lcyA9IFtdO1xuICAgIGNvbnN0IHBvcHVwQ29udGVudCA9IHtcbiAgICAgIHN0cjogdGV4dCxcbiAgICAgIGh0bWw6IHtcbiAgICAgICAgbmFtZTogXCJkaXZcIixcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIGRpcjogXCJhdXRvXCJcbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgbmFtZTogXCJwXCIsXG4gICAgICAgICAgY2hpbGRyZW46IHBvcHVwTGluZXNcbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGxpbmVBdHRyaWJ1dGVzID0ge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY29sb3I6IHRoaXMuI2ZvbnRDb2xvcixcbiAgICAgICAgZm9udFNpemU6IHRoaXMuI2ZvbnRTaXplID8gYGNhbGMoJHt0aGlzLiNmb250U2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYCA6IFwiXCJcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiB0ZXh0LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgICBwb3B1cExpbmVzLnB1c2goe1xuICAgICAgICBuYW1lOiBcInNwYW5cIixcbiAgICAgICAgdmFsdWU6IGxpbmUsXG4gICAgICAgIGF0dHJpYnV0ZXM6IGxpbmVBdHRyaWJ1dGVzXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBvcHVwQ29udGVudDtcbiAgfVxuICBfZm9ybWF0Q29udGVudHMoe1xuICAgIHN0cixcbiAgICBkaXJcbiAgfSkge1xuICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICBwLmNsYXNzTGlzdC5hZGQoXCJwb3B1cENvbnRlbnRcIik7XG4gICAgcC5kaXIgPSBkaXI7XG4gICAgY29uc3QgbGluZXMgPSBzdHIuc3BsaXQoLyg/Olxcclxcbj98XFxuKS8pO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxpbmVzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgIHAuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUpKTtcbiAgICAgIGlmIChpIDwgaWkgLSAxKSB7XG4gICAgICAgIHAuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9XG4gICNrZXlEb3duKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmFsdEtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiIHx8IGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIiAmJiB0aGlzLiNwaW5uZWQpIHtcbiAgICAgIHRoaXMuI3RvZ2dsZSgpO1xuICAgIH1cbiAgfVxuICB1cGRhdGVFZGl0ZWQoe1xuICAgIHJlY3QsXG4gICAgcG9wdXBDb250ZW50XG4gIH0pIHtcbiAgICB0aGlzLiN1cGRhdGVzIHx8PSB7XG4gICAgICBjb250ZW50c09iajogdGhpcy4jY29udGVudHNPYmosXG4gICAgICByaWNoVGV4dDogdGhpcy4jcmljaFRleHRcbiAgICB9O1xuICAgIGlmIChyZWN0KSB7XG4gICAgICB0aGlzLiNwb3NpdGlvbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChwb3B1cENvbnRlbnQpIHtcbiAgICAgIHRoaXMuI3JpY2hUZXh0ID0gdGhpcy4jbWFrZVBvcHVwQ29udGVudChwb3B1cENvbnRlbnQpO1xuICAgICAgdGhpcy4jY29udGVudHNPYmogPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLiNwb3B1cD8ucmVtb3ZlKCk7XG4gICAgdGhpcy4jcG9wdXAgPSBudWxsO1xuICB9XG4gIHJlc2V0RWRpdGVkKCkge1xuICAgIGlmICghdGhpcy4jdXBkYXRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAoe1xuICAgICAgY29udGVudHNPYmo6IHRoaXMuI2NvbnRlbnRzT2JqLFxuICAgICAgcmljaFRleHQ6IHRoaXMuI3JpY2hUZXh0XG4gICAgfSA9IHRoaXMuI3VwZGF0ZXMpO1xuICAgIHRoaXMuI3VwZGF0ZXMgPSBudWxsO1xuICAgIHRoaXMuI3BvcHVwPy5yZW1vdmUoKTtcbiAgICB0aGlzLiNwb3B1cCA9IG51bGw7XG4gICAgdGhpcy4jcG9zaXRpb24gPSBudWxsO1xuICB9XG4gICNzZXRQb3NpdGlvbigpIHtcbiAgICBpZiAodGhpcy4jcG9zaXRpb24gIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgcGFnZToge1xuICAgICAgICB2aWV3XG4gICAgICB9LFxuICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgcmF3RGltczoge1xuICAgICAgICAgIHBhZ2VXaWR0aCxcbiAgICAgICAgICBwYWdlSGVpZ2h0LFxuICAgICAgICAgIHBhZ2VYLFxuICAgICAgICAgIHBhZ2VZXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9ID0gdGhpcy4jcGFyZW50O1xuICAgIGxldCB1c2VQYXJlbnRSZWN0ID0gISF0aGlzLiNwYXJlbnRSZWN0O1xuICAgIGxldCByZWN0ID0gdXNlUGFyZW50UmVjdCA/IHRoaXMuI3BhcmVudFJlY3QgOiB0aGlzLiNyZWN0O1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLiNlbGVtZW50cykge1xuICAgICAgaWYgKCFyZWN0IHx8IFV0aWwuaW50ZXJzZWN0KGVsZW1lbnQuZGF0YS5yZWN0LCByZWN0KSAhPT0gbnVsbCkge1xuICAgICAgICByZWN0ID0gZWxlbWVudC5kYXRhLnJlY3Q7XG4gICAgICAgIHVzZVBhcmVudFJlY3QgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZFJlY3QgPSBVdGlsLm5vcm1hbGl6ZVJlY3QoW3JlY3RbMF0sIHZpZXdbM10gLSByZWN0WzFdICsgdmlld1sxXSwgcmVjdFsyXSwgdmlld1szXSAtIHJlY3RbM10gKyB2aWV3WzFdXSk7XG4gICAgY29uc3QgSE9SSVpPTlRBTF9TUEFDRV9BRlRFUl9BTk5PVEFUSU9OID0gNTtcbiAgICBjb25zdCBwYXJlbnRXaWR0aCA9IHVzZVBhcmVudFJlY3QgPyByZWN0WzJdIC0gcmVjdFswXSArIEhPUklaT05UQUxfU1BBQ0VfQUZURVJfQU5OT1RBVElPTiA6IDA7XG4gICAgY29uc3QgcG9wdXBMZWZ0ID0gbm9ybWFsaXplZFJlY3RbMF0gKyBwYXJlbnRXaWR0aDtcbiAgICBjb25zdCBwb3B1cFRvcCA9IG5vcm1hbGl6ZWRSZWN0WzFdO1xuICAgIHRoaXMuI3Bvc2l0aW9uID0gWzEwMCAqIChwb3B1cExlZnQgLSBwYWdlWCkgLyBwYWdlV2lkdGgsIDEwMCAqIChwb3B1cFRvcCAtIHBhZ2VZKSAvIHBhZ2VIZWlnaHRdO1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuI2NvbnRhaW5lcjtcbiAgICBzdHlsZS5sZWZ0ID0gYCR7dGhpcy4jcG9zaXRpb25bMF19JWA7XG4gICAgc3R5bGUudG9wID0gYCR7dGhpcy4jcG9zaXRpb25bMV19JWA7XG4gIH1cbiAgI3RvZ2dsZSgpIHtcbiAgICB0aGlzLiNwaW5uZWQgPSAhdGhpcy4jcGlubmVkO1xuICAgIGlmICh0aGlzLiNwaW5uZWQpIHtcbiAgICAgIHRoaXMuI3Nob3coKTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy4jYm91bmRUb2dnbGUpO1xuICAgICAgdGhpcy4jY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5RG93bik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2hpZGUoKTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy4jYm91bmRUb2dnbGUpO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5RG93bik7XG4gICAgfVxuICB9XG4gICNzaG93KCkge1xuICAgIGlmICghdGhpcy4jcG9wdXApIHtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHRoaXMuI3NldFBvc2l0aW9uKCk7XG4gICAgICB0aGlzLiNjb250YWluZXIuaGlkZGVuID0gZmFsc2U7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUuekluZGV4ID0gcGFyc2VJbnQodGhpcy4jY29udGFpbmVyLnN0eWxlLnpJbmRleCkgKyAxMDAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy4jcGlubmVkKSB7XG4gICAgICB0aGlzLiNjb250YWluZXIuY2xhc3NMaXN0LmFkZChcImZvY3VzZWRcIik7XG4gICAgfVxuICB9XG4gICNoaWRlKCkge1xuICAgIHRoaXMuI2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwiZm9jdXNlZFwiKTtcbiAgICBpZiAodGhpcy4jcGlubmVkIHx8ICF0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNjb250YWluZXIuaGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLiNjb250YWluZXIuc3R5bGUuekluZGV4ID0gcGFyc2VJbnQodGhpcy4jY29udGFpbmVyLnN0eWxlLnpJbmRleCkgLSAxMDAwO1xuICB9XG4gIGZvcmNlSGlkZSgpIHtcbiAgICB0aGlzLiN3YXNWaXNpYmxlID0gdGhpcy5pc1Zpc2libGU7XG4gICAgaWYgKCF0aGlzLiN3YXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2NvbnRhaW5lci5oaWRkZW4gPSB0cnVlO1xuICB9XG4gIG1heWJlU2hvdygpIHtcbiAgICBpZiAoIXRoaXMuI3dhc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNwb3B1cCkge1xuICAgICAgdGhpcy4jc2hvdygpO1xuICAgIH1cbiAgICB0aGlzLiN3YXNWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy4jY29udGFpbmVyLmhpZGRlbiA9IGZhbHNlO1xuICB9XG4gIGdldCBpc1Zpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbnRhaW5lci5oaWRkZW4gPT09IGZhbHNlO1xuICB9XG59XG5jbGFzcyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHBhcmFtZXRlcnMuZGF0YS50ZXh0Q29udGVudDtcbiAgICB0aGlzLnRleHRQb3NpdGlvbiA9IHBhcmFtZXRlcnMuZGF0YS50ZXh0UG9zaXRpb247XG4gICAgdGhpcy5hbm5vdGF0aW9uRWRpdG9yVHlwZSA9IEFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZnJlZVRleHRBbm5vdGF0aW9uXCIpO1xuICAgIGlmICh0aGlzLnRleHRDb250ZW50KSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcImFubm90YXRpb25UZXh0Q29udGVudFwiKTtcbiAgICAgIGNvbnRlbnQuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcImNvbW1lbnRcIik7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy50ZXh0Q29udGVudCkge1xuICAgICAgICBjb25zdCBsaW5lU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBsaW5lU3Bhbi50ZXh0Q29udGVudCA9IGxpbmU7XG4gICAgICAgIGNvbnRlbnQuYXBwZW5kKGxpbmVTcGFuKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChjb250ZW50KTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHRoaXMuX2VkaXRPbkRvdWJsZUNsaWNrKCk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGdldCBfaXNFZGl0YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmhhc093bkNhbnZhcztcbiAgfVxufVxuY2xhc3MgTGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjbGluZSA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImxpbmVBbm5vdGF0aW9uXCIpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXMoZGF0YS5yZWN0KTtcbiAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLiNsaW5lID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6bGluZVwiKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcIngxXCIsIGRhdGEucmVjdFsyXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzBdKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcInkxXCIsIGRhdGEucmVjdFszXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzFdKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcIngyXCIsIGRhdGEucmVjdFsyXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzJdKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcInkyXCIsIGRhdGEucmVjdFszXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzNdKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBkYXRhLmJvcmRlclN0eWxlLndpZHRoIHx8IDEpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgc3ZnLmFwcGVuZChsaW5lKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcbiAgICBpZiAoIWRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgIHJldHVybiB0aGlzLiNsaW5lO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbn1cbmNsYXNzIFNxdWFyZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjc3F1YXJlID0gbnVsbDtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3F1YXJlQW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcbiAgICBjb25zdCBib3JkZXJXaWR0aCA9IGRhdGEuYm9yZGVyU3R5bGUud2lkdGg7XG4gICAgY29uc3Qgc3F1YXJlID0gdGhpcy4jc3F1YXJlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwieFwiLCBib3JkZXJXaWR0aCAvIDIpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJ5XCIsIGJvcmRlcldpZHRoIC8gMik7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHdpZHRoIC0gYm9yZGVyV2lkdGgpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgaGVpZ2h0IC0gYm9yZGVyV2lkdGgpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgYm9yZGVyV2lkdGggfHwgMSk7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgc3ZnLmFwcGVuZChzcXVhcmUpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuICAgIGlmICghZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NxdWFyZTtcbiAgfVxuICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICB9XG59XG5jbGFzcyBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgI2NpcmNsZSA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImNpcmNsZUFubm90YXRpb25cIik7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG4gICAgY29uc3QgYm9yZGVyV2lkdGggPSBkYXRhLmJvcmRlclN0eWxlLndpZHRoO1xuICAgIGNvbnN0IGNpcmNsZSA9IHRoaXMuI2NpcmNsZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmVsbGlwc2VcIik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcImN4XCIsIHdpZHRoIC8gMik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcImN5XCIsIGhlaWdodCAvIDIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJyeFwiLCB3aWR0aCAvIDIgLSBib3JkZXJXaWR0aCAvIDIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJyeVwiLCBoZWlnaHQgLyAyIC0gYm9yZGVyV2lkdGggLyAyKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGJvcmRlcldpZHRoIHx8IDEpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIHN2Zy5hcHBlbmQoY2lyY2xlKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcbiAgICBpZiAoIWRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgIHJldHVybiB0aGlzLiNjaXJjbGU7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgfVxufVxuY2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgI3BvbHlsaW5lID0gbnVsbDtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gXCJwb2x5bGluZUFubm90YXRpb25cIjtcbiAgICB0aGlzLnN2Z0VsZW1lbnROYW1lID0gXCJzdmc6cG9seWxpbmVcIjtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCh0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSk7XG4gICAgY29uc3Qge1xuICAgICAgZGF0YToge1xuICAgICAgICByZWN0LFxuICAgICAgICB2ZXJ0aWNlcyxcbiAgICAgICAgYm9yZGVyU3R5bGUsXG4gICAgICAgIHBvcHVwUmVmXG4gICAgICB9XG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCF2ZXJ0aWNlcykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhyZWN0KTtcbiAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuICAgIGxldCBwb2ludHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBjb25zdCB4ID0gdmVydGljZXNbaV0gLSByZWN0WzBdO1xuICAgICAgY29uc3QgeSA9IHJlY3RbM10gLSB2ZXJ0aWNlc1tpICsgMV07XG4gICAgICBwb2ludHMucHVzaChgJHt4fSwke3l9YCk7XG4gICAgfVxuICAgIHBvaW50cyA9IHBvaW50cy5qb2luKFwiIFwiKTtcbiAgICBjb25zdCBwb2x5bGluZSA9IHRoaXMuI3BvbHlsaW5lID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodGhpcy5zdmdFbGVtZW50TmFtZSk7XG4gICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwicG9pbnRzXCIsIHBvaW50cyk7XG4gICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGJvcmRlclN0eWxlLndpZHRoIHx8IDEpO1xuICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBzdmcuYXBwZW5kKHBvbHlsaW5lKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcbiAgICBpZiAoIXBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jcG9seWxpbmU7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgfVxufVxuY2xhc3MgUG9seWdvbkFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzKTtcbiAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwicG9seWdvbkFubm90YXRpb25cIjtcbiAgICB0aGlzLnN2Z0VsZW1lbnROYW1lID0gXCJzdmc6cG9seWdvblwiO1xuICB9XG59XG5jbGFzcyBDYXJldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjYXJldEFubm90YXRpb25cIik7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgSW5rQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICNwb2x5bGluZXMgPSBbXTtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gXCJpbmtBbm5vdGF0aW9uXCI7XG4gICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlsaW5lXCI7XG4gICAgdGhpcy5hbm5vdGF0aW9uRWRpdG9yVHlwZSA9IEFubm90YXRpb25FZGl0b3JUeXBlLklOSztcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCh0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSk7XG4gICAgY29uc3Qge1xuICAgICAgZGF0YToge1xuICAgICAgICByZWN0LFxuICAgICAgICBpbmtMaXN0cyxcbiAgICAgICAgYm9yZGVyU3R5bGUsXG4gICAgICAgIHBvcHVwUmVmXG4gICAgICB9XG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXMocmVjdCk7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGlua0xpc3Qgb2YgaW5rTGlzdHMpIHtcbiAgICAgIGxldCBwb2ludHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGlua0xpc3QubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICBjb25zdCB4ID0gaW5rTGlzdFtpXSAtIHJlY3RbMF07XG4gICAgICAgIGNvbnN0IHkgPSByZWN0WzNdIC0gaW5rTGlzdFtpICsgMV07XG4gICAgICAgIHBvaW50cy5wdXNoKGAke3h9LCR7eX1gKTtcbiAgICAgIH1cbiAgICAgIHBvaW50cyA9IHBvaW50cy5qb2luKFwiIFwiKTtcbiAgICAgIGNvbnN0IHBvbHlsaW5lID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodGhpcy5zdmdFbGVtZW50TmFtZSk7XG4gICAgICB0aGlzLiNwb2x5bGluZXMucHVzaChwb2x5bGluZSk7XG4gICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJwb2ludHNcIiwgcG9pbnRzKTtcbiAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgaWYgKCFwb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgfVxuICAgICAgc3ZnLmFwcGVuZChwb2x5bGluZSk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgIHJldHVybiB0aGlzLiNwb2x5bGluZXM7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgfVxufVxuY2xhc3MgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWUsXG4gICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFubm90YXRpb25cIik7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZSxcbiAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidW5kZXJsaW5lQW5ub3RhdGlvblwiKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWUsXG4gICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInNxdWlnZ2x5QW5ub3RhdGlvblwiKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzdHJpa2VvdXRBbm5vdGF0aW9uXCIpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgU3RhbXBBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3RhbXBBbm5vdGF0aW9uXCIpO1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICN0cmlnZ2VyID0gbnVsbDtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IHtcbiAgICAgIGZpbGVcbiAgICB9ID0gdGhpcy5kYXRhO1xuICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlLmZpbGVuYW1lO1xuICAgIHRoaXMuY29udGVudCA9IGZpbGUuY29udGVudDtcbiAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImZpbGVhdHRhY2htZW50YW5ub3RhdGlvblwiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAuLi5maWxlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJmaWxlQXR0YWNobWVudEFubm90YXRpb25cIik7XG4gICAgY29uc3Qge1xuICAgICAgY29udGFpbmVyLFxuICAgICAgZGF0YVxuICAgIH0gPSB0aGlzO1xuICAgIGxldCB0cmlnZ2VyO1xuICAgIGlmIChkYXRhLmhhc0FwcGVhcmFuY2UgfHwgZGF0YS5maWxsQWxwaGEgPT09IDApIHtcbiAgICAgIHRyaWdnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgIHRyaWdnZXIuc3JjID0gYCR7dGhpcy5pbWFnZVJlc291cmNlc1BhdGh9YW5ub3RhdGlvbi0key9wYXBlcmNsaXAvaS50ZXN0KGRhdGEubmFtZSkgPyBcInBhcGVyY2xpcFwiIDogXCJwdXNocGluXCJ9LnN2Z2A7XG4gICAgICBpZiAoZGF0YS5maWxsQWxwaGEgJiYgZGF0YS5maWxsQWxwaGEgPCAxKSB7XG4gICAgICAgIHRyaWdnZXIuc3R5bGUgPSBgZmlsdGVyOiBvcGFjaXR5KCR7TWF0aC5yb3VuZChkYXRhLmZpbGxBbHBoYSAqIDEwMCl9JSk7YDtcbiAgICAgIH1cbiAgICB9XG4gICAgdHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKFwiZGJsY2xpY2tcIiwgdGhpcy4jZG93bmxvYWQuYmluZCh0aGlzKSk7XG4gICAgdGhpcy4jdHJpZ2dlciA9IHRyaWdnZXI7XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gdXRpbF9GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZXZ0ID0+IHtcbiAgICAgIGlmIChldnQua2V5ID09PSBcIkVudGVyXCIgJiYgKGlzTWFjID8gZXZ0Lm1ldGFLZXkgOiBldnQuY3RybEtleSkpIHtcbiAgICAgICAgdGhpcy4jZG93bmxvYWQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXIuY2xhc3NMaXN0LmFkZChcInBvcHVwVHJpZ2dlckFyZWFcIik7XG4gICAgfVxuICAgIGNvbnRhaW5lci5hcHBlbmQodHJpZ2dlcik7XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgIHJldHVybiB0aGlzLiN0cmlnZ2VyO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbiAgI2Rvd25sb2FkKCkge1xuICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyPy5vcGVuT3JEb3dubG9hZERhdGEodGhpcy5jb250ZW50LCB0aGlzLmZpbGVuYW1lKTtcbiAgfVxufVxuY2xhc3MgQW5ub3RhdGlvbkxheWVyIHtcbiAgI2FjY2Vzc2liaWxpdHlNYW5hZ2VyID0gbnVsbDtcbiAgI2Fubm90YXRpb25DYW52YXNNYXAgPSBudWxsO1xuICAjZWRpdGFibGVBbm5vdGF0aW9ucyA9IG5ldyBNYXAoKTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGRpdixcbiAgICBhY2Nlc3NpYmlsaXR5TWFuYWdlcixcbiAgICBhbm5vdGF0aW9uQ2FudmFzTWFwLFxuICAgIGFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIsXG4gICAgcGFnZSxcbiAgICB2aWV3cG9ydFxuICB9KSB7XG4gICAgdGhpcy5kaXYgPSBkaXY7XG4gICAgdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBhY2Nlc3NpYmlsaXR5TWFuYWdlcjtcbiAgICB0aGlzLiNhbm5vdGF0aW9uQ2FudmFzTWFwID0gYW5ub3RhdGlvbkNhbnZhc01hcDtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICB0aGlzLnpJbmRleCA9IDA7XG4gICAgdGhpcy5fYW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciA9IGFubm90YXRpb25FZGl0b3JVSU1hbmFnZXI7XG4gIH1cbiAgI2FwcGVuZEVsZW1lbnQoZWxlbWVudCwgaWQpIHtcbiAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQuZmlyc3RDaGlsZCB8fCBlbGVtZW50O1xuICAgIGNvbnRlbnRFbGVtZW50LmlkID0gYCR7QW5ub3RhdGlvblByZWZpeH0ke2lkfWA7XG4gICAgdGhpcy5kaXYuYXBwZW5kKGVsZW1lbnQpO1xuICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlNYW5hZ2VyPy5tb3ZlRWxlbWVudEluRE9NKHRoaXMuZGl2LCBlbGVtZW50LCBjb250ZW50RWxlbWVudCwgZmFsc2UpO1xuICB9XG4gIGFzeW5jIHJlbmRlcihwYXJhbXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBhbm5vdGF0aW9uc1xuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmRpdjtcbiAgICBzZXRMYXllckRpbWVuc2lvbnMobGF5ZXIsIHRoaXMudmlld3BvcnQpO1xuICAgIGNvbnN0IHBvcHVwVG9FbGVtZW50cyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBlbGVtZW50UGFyYW1zID0ge1xuICAgICAgZGF0YTogbnVsbCxcbiAgICAgIGxheWVyLFxuICAgICAgbGlua1NlcnZpY2U6IHBhcmFtcy5saW5rU2VydmljZSxcbiAgICAgIGRvd25sb2FkTWFuYWdlcjogcGFyYW1zLmRvd25sb2FkTWFuYWdlcixcbiAgICAgIGltYWdlUmVzb3VyY2VzUGF0aDogcGFyYW1zLmltYWdlUmVzb3VyY2VzUGF0aCB8fCBcIlwiLFxuICAgICAgcmVuZGVyRm9ybXM6IHBhcmFtcy5yZW5kZXJGb3JtcyAhPT0gZmFsc2UsXG4gICAgICBzdmdGYWN0b3J5OiBuZXcgRE9NU1ZHRmFjdG9yeSgpLFxuICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IHBhcmFtcy5hbm5vdGF0aW9uU3RvcmFnZSB8fCBuZXcgQW5ub3RhdGlvblN0b3JhZ2UoKSxcbiAgICAgIGVuYWJsZVNjcmlwdGluZzogcGFyYW1zLmVuYWJsZVNjcmlwdGluZyA9PT0gdHJ1ZSxcbiAgICAgIGhhc0pTQWN0aW9uczogcGFyYW1zLmhhc0pTQWN0aW9ucyxcbiAgICAgIGZpZWxkT2JqZWN0czogcGFyYW1zLmZpZWxkT2JqZWN0cyxcbiAgICAgIHBhcmVudDogdGhpcyxcbiAgICAgIGVsZW1lbnRzOiBudWxsXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGRhdGEgb2YgYW5ub3RhdGlvbnMpIHtcbiAgICAgIGlmIChkYXRhLm5vSFRNTCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzUG9wdXBBbm5vdGF0aW9uID0gZGF0YS5hbm5vdGF0aW9uVHlwZSA9PT0gQW5ub3RhdGlvblR5cGUuUE9QVVA7XG4gICAgICBpZiAoIWlzUG9wdXBBbm5vdGF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG4gICAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gcG9wdXBUb0VsZW1lbnRzLmdldChkYXRhLmlkKTtcbiAgICAgICAgaWYgKCFlbGVtZW50cykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRQYXJhbXMuZWxlbWVudHMgPSBlbGVtZW50cztcbiAgICAgIH1cbiAgICAgIGVsZW1lbnRQYXJhbXMuZGF0YSA9IGRhdGE7XG4gICAgICBjb25zdCBlbGVtZW50ID0gQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5LmNyZWF0ZShlbGVtZW50UGFyYW1zKTtcbiAgICAgIGlmICghZWxlbWVudC5pc1JlbmRlcmFibGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWlzUG9wdXBBbm5vdGF0aW9uICYmIGRhdGEucG9wdXBSZWYpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBwb3B1cFRvRWxlbWVudHMuZ2V0KGRhdGEucG9wdXBSZWYpO1xuICAgICAgICBpZiAoIWVsZW1lbnRzKSB7XG4gICAgICAgICAgcG9wdXBUb0VsZW1lbnRzLnNldChkYXRhLnBvcHVwUmVmLCBbZWxlbWVudF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gZWxlbWVudC5yZW5kZXIoKTtcbiAgICAgIGlmIChkYXRhLmhpZGRlbikge1xuICAgICAgICByZW5kZXJlZC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgIH1cbiAgICAgIHRoaXMuI2FwcGVuZEVsZW1lbnQocmVuZGVyZWQsIGRhdGEuaWQpO1xuICAgICAgaWYgKGVsZW1lbnQuYW5ub3RhdGlvbkVkaXRvclR5cGUgPiAwKSB7XG4gICAgICAgIHRoaXMuI2VkaXRhYmxlQW5ub3RhdGlvbnMuc2V0KGVsZW1lbnQuZGF0YS5pZCwgZWxlbWVudCk7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25FZGl0b3JVSU1hbmFnZXI/LnJlbmRlckFubm90YXRpb25FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNzZXRBbm5vdGF0aW9uQ2FudmFzTWFwKCk7XG4gIH1cbiAgdXBkYXRlKHtcbiAgICB2aWV3cG9ydFxuICB9KSB7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmRpdjtcbiAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgc2V0TGF5ZXJEaW1lbnNpb25zKGxheWVyLCB7XG4gICAgICByb3RhdGlvbjogdmlld3BvcnQucm90YXRpb25cbiAgICB9KTtcbiAgICB0aGlzLiNzZXRBbm5vdGF0aW9uQ2FudmFzTWFwKCk7XG4gICAgbGF5ZXIuaGlkZGVuID0gZmFsc2U7XG4gIH1cbiAgI3NldEFubm90YXRpb25DYW52YXNNYXAoKSB7XG4gICAgaWYgKCF0aGlzLiNhbm5vdGF0aW9uQ2FudmFzTWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxheWVyID0gdGhpcy5kaXY7XG4gICAgZm9yIChjb25zdCBbaWQsIGNhbnZhc10gb2YgdGhpcy4jYW5ub3RhdGlvbkNhbnZhc01hcCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGxheWVyLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFubm90YXRpb24taWQ9XCIke2lkfVwiXWApO1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FudmFzLmNsYXNzTmFtZSA9IFwiYW5ub3RhdGlvbkNvbnRlbnRcIjtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZmlyc3RDaGlsZFxuICAgICAgfSA9IGVsZW1lbnQ7XG4gICAgICBpZiAoIWZpcnN0Q2hpbGQpIHtcbiAgICAgICAgZWxlbWVudC5hcHBlbmQoY2FudmFzKTtcbiAgICAgIH0gZWxzZSBpZiAoZmlyc3RDaGlsZC5ub2RlTmFtZSA9PT0gXCJDQU5WQVNcIikge1xuICAgICAgICBmaXJzdENoaWxkLnJlcGxhY2VXaXRoKGNhbnZhcyk7XG4gICAgICB9IGVsc2UgaWYgKCFmaXJzdENoaWxkLmNsYXNzTGlzdC5jb250YWlucyhcImFubm90YXRpb25Db250ZW50XCIpKSB7XG4gICAgICAgIGZpcnN0Q2hpbGQuYmVmb3JlKGNhbnZhcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdENoaWxkLmFmdGVyKGNhbnZhcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI2Fubm90YXRpb25DYW52YXNNYXAuY2xlYXIoKTtcbiAgfVxuICBnZXRFZGl0YWJsZUFubm90YXRpb25zKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuI2VkaXRhYmxlQW5ub3RhdGlvbnMudmFsdWVzKCkpO1xuICB9XG4gIGdldEVkaXRhYmxlQW5ub3RhdGlvbihpZCkge1xuICAgIHJldHVybiB0aGlzLiNlZGl0YWJsZUFubm90YXRpb25zLmdldChpZCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2ZyZWV0ZXh0LmpzXG5cblxuXG5cbmNvbnN0IEVPTF9QQVRURVJOID0gL1xcclxcbj98XFxuL2c7XG5jbGFzcyBGcmVlVGV4dEVkaXRvciBleHRlbmRzIEFubm90YXRpb25FZGl0b3Ige1xuICAjYm91bmRFZGl0b3JEaXZCbHVyID0gdGhpcy5lZGl0b3JEaXZCbHVyLmJpbmQodGhpcyk7XG4gICNib3VuZEVkaXRvckRpdkZvY3VzID0gdGhpcy5lZGl0b3JEaXZGb2N1cy5iaW5kKHRoaXMpO1xuICAjYm91bmRFZGl0b3JEaXZJbnB1dCA9IHRoaXMuZWRpdG9yRGl2SW5wdXQuYmluZCh0aGlzKTtcbiAgI2JvdW5kRWRpdG9yRGl2S2V5ZG93biA9IHRoaXMuZWRpdG9yRGl2S2V5ZG93bi5iaW5kKHRoaXMpO1xuICAjYm91bmRFZGl0b3JEaXZQYXN0ZSA9IHRoaXMuZWRpdG9yRGl2UGFzdGUuYmluZCh0aGlzKTtcbiAgI2NvbG9yO1xuICAjY29udGVudCA9IFwiXCI7XG4gICNlZGl0b3JEaXZJZCA9IGAke3RoaXMuaWR9LWVkaXRvcmA7XG4gICNmb250U2l6ZTtcbiAgI2luaXRpYWxEYXRhID0gbnVsbDtcbiAgc3RhdGljIF9mcmVlVGV4dERlZmF1bHRDb250ZW50ID0gXCJcIjtcbiAgc3RhdGljIF9pbnRlcm5hbFBhZGRpbmcgPSAwO1xuICBzdGF0aWMgX2RlZmF1bHRDb2xvciA9IG51bGw7XG4gIHN0YXRpYyBfZGVmYXVsdEZvbnRTaXplID0gMTA7XG4gIHN0YXRpYyBnZXQgX2tleWJvYXJkTWFuYWdlcigpIHtcbiAgICBjb25zdCBwcm90byA9IEZyZWVUZXh0RWRpdG9yLnByb3RvdHlwZTtcbiAgICBjb25zdCBhcnJvd0NoZWNrZXIgPSBzZWxmID0+IHNlbGYuaXNFbXB0eSgpO1xuICAgIGNvbnN0IHNtYWxsID0gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfU01BTEw7XG4gICAgY29uc3QgYmlnID0gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfQklHO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfa2V5Ym9hcmRNYW5hZ2VyXCIsIG5ldyBLZXlib2FyZE1hbmFnZXIoW1tbXCJjdHJsK3NcIiwgXCJtYWMrbWV0YStzXCIsIFwiY3RybCtwXCIsIFwibWFjK21ldGErcFwiXSwgcHJvdG8uY29tbWl0T3JSZW1vdmUsIHtcbiAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICB9XSwgW1tcImN0cmwrRW50ZXJcIiwgXCJtYWMrbWV0YStFbnRlclwiLCBcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIHByb3RvLmNvbW1pdE9yUmVtb3ZlXSwgW1tcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogWy1zbWFsbCwgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dMZWZ0XCIsIFwibWFjK3NoaWZ0K0Fycm93TGVmdFwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbLWJpZywgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbc21hbGwsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93UmlnaHRcIiwgXCJtYWMrc2hpZnQrQXJyb3dSaWdodFwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbYmlnLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiQXJyb3dVcFwiLCBcIm1hYytBcnJvd1VwXCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFswLCAtc21hbGxdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93VXBcIiwgXCJtYWMrc2hpZnQrQXJyb3dVcFwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbMCwgLWJpZ10sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogWzAsIHNtYWxsXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd0Rvd25cIiwgXCJtYWMrc2hpZnQrQXJyb3dEb3duXCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFswLCBiaWddLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV1dKSk7XG4gIH1cbiAgc3RhdGljIF90eXBlID0gXCJmcmVldGV4dFwiO1xuICBzdGF0aWMgX2VkaXRvclR5cGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgbmFtZTogXCJmcmVlVGV4dEVkaXRvclwiXG4gICAgfSk7XG4gICAgdGhpcy4jY29sb3IgPSBwYXJhbXMuY29sb3IgfHwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBBbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yO1xuICAgIHRoaXMuI2ZvbnRTaXplID0gcGFyYW1zLmZvbnRTaXplIHx8IEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Rm9udFNpemU7XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyKSB7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5pbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlciwge1xuICAgICAgc3RyaW5nczogW1wicGRmanMtZnJlZS10ZXh0LWRlZmF1bHQtY29udGVudFwiXVxuICAgIH0pO1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgIHRoaXMuX2ludGVybmFsUGFkZGluZyA9IHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi0tZnJlZXRleHQtcGFkZGluZ1wiKSk7XG4gIH1cbiAgc3RhdGljIHVwZGF0ZURlZmF1bHRQYXJhbXModHlwZSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRTpcbiAgICAgICAgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRGb250U2l6ZSA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1I6XG4gICAgICAgIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3IgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFOlxuICAgICAgICB0aGlzLiN1cGRhdGVGb250U2l6ZSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUjpcbiAgICAgICAgdGhpcy4jdXBkYXRlQ29sb3IodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgc3RhdGljIGdldCBkZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Rm9udFNpemVdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1IsIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcl1dO1xuICB9XG4gIGdldCBwcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgcmV0dXJuIFtbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRSwgdGhpcy4jZm9udFNpemVdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1IsIHRoaXMuI2NvbG9yXV07XG4gIH1cbiAgI3VwZGF0ZUZvbnRTaXplKGZvbnRTaXplKSB7XG4gICAgY29uc3Qgc2V0Rm9udHNpemUgPSBzaXplID0+IHtcbiAgICAgIHRoaXMuZWRpdG9yRGl2LnN0eWxlLmZvbnRTaXplID0gYGNhbGMoJHtzaXplfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO1xuICAgICAgdGhpcy50cmFuc2xhdGUoMCwgLShzaXplIC0gdGhpcy4jZm9udFNpemUpICogdGhpcy5wYXJlbnRTY2FsZSk7XG4gICAgICB0aGlzLiNmb250U2l6ZSA9IHNpemU7XG4gICAgICB0aGlzLiNzZXRFZGl0b3JEaW1lbnNpb25zKCk7XG4gICAgfTtcbiAgICBjb25zdCBzYXZlZEZvbnRzaXplID0gdGhpcy4jZm9udFNpemU7XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6IHNldEZvbnRzaXplLmJpbmQodGhpcywgZm9udFNpemUpLFxuICAgICAgdW5kbzogc2V0Rm9udHNpemUuYmluZCh0aGlzLCBzYXZlZEZvbnRzaXplKSxcbiAgICAgIHBvc3Q6IHRoaXMuX3VpTWFuYWdlci51cGRhdGVVSS5iaW5kKHRoaXMuX3VpTWFuYWdlciwgdGhpcyksXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgfVxuICAjdXBkYXRlQ29sb3IoY29sb3IpIHtcbiAgICBjb25zdCBzZXRDb2xvciA9IGNvbCA9PiB7XG4gICAgICB0aGlzLiNjb2xvciA9IHRoaXMuZWRpdG9yRGl2LnN0eWxlLmNvbG9yID0gY29sO1xuICAgIH07XG4gICAgY29uc3Qgc2F2ZWRDb2xvciA9IHRoaXMuI2NvbG9yO1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiBzZXRDb2xvci5iaW5kKHRoaXMsIGNvbG9yKSxcbiAgICAgIHVuZG86IHNldENvbG9yLmJpbmQodGhpcywgc2F2ZWRDb2xvciksXG4gICAgICBwb3N0OiB0aGlzLl91aU1hbmFnZXIudXBkYXRlVUkuYmluZCh0aGlzLl91aU1hbmFnZXIsIHRoaXMpLFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUixcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIF90cmFuc2xhdGVFbXB0eSh4LCB5KSB7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycyh4LCB5LCB0cnVlKTtcbiAgfVxuICBnZXRJbml0aWFsVHJhbnNsYXRpb24oKSB7XG4gICAgY29uc3Qgc2NhbGUgPSB0aGlzLnBhcmVudFNjYWxlO1xuICAgIHJldHVybiBbLUZyZWVUZXh0RWRpdG9yLl9pbnRlcm5hbFBhZGRpbmcgKiBzY2FsZSwgLShGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICsgdGhpcy4jZm9udFNpemUpICogc2NhbGVdO1xuICB9XG4gIHJlYnVpbGQoKSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgaWYgKHRoaXMuZGl2ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHRoaXMucGFyZW50LmFkZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgZW5hYmxlRWRpdE1vZGUoKSB7XG4gICAgaWYgKHRoaXMuaXNJbkVkaXRNb2RlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQuc2V0RWRpdGluZ1N0YXRlKGZhbHNlKTtcbiAgICB0aGlzLnBhcmVudC51cGRhdGVUb29sYmFyKEFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUKTtcbiAgICBzdXBlci5lbmFibGVFZGl0TW9kZSgpO1xuICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QucmVtb3ZlKFwiZW5hYmxlZFwiKTtcbiAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5kaXYucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2S2V5ZG93biwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2Rm9jdXMsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2Qmx1ciwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2SW5wdXQsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCB0aGlzLiNib3VuZEVkaXRvckRpdlBhc3RlLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZSh0cnVlKTtcbiAgICBzdXBlci5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LmFkZChcImVuYWJsZWRcIik7XG4gICAgdGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIHRoaXMuI2VkaXRvckRpdklkKTtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IHRydWU7XG4gICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZLZXlkb3duKTtcbiAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZGb2N1cyk7XG4gICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZCbHVyKTtcbiAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZJbnB1dCk7XG4gICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBhc3RlXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2UGFzdGUpO1xuICAgIHRoaXMuZGl2LmZvY3VzKHtcbiAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKFwiZnJlZXRleHRFZGl0aW5nXCIpO1xuICB9XG4gIGZvY3VzaW4oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2ZvY3VzRXZlbnRzQWxsb3dlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5mb2N1c2luKGV2ZW50KTtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmVkaXRvckRpdikge1xuICAgICAgdGhpcy5lZGl0b3JEaXYuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgb25jZUFkZGVkKCkge1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICB0aGlzLmVkaXRvckRpdi5mb2N1cygpO1xuICAgIGlmICh0aGlzLl9pbml0aWFsT3B0aW9ucz8uaXNDZW50ZXJlZCkge1xuICAgICAgdGhpcy5jZW50ZXIoKTtcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbE9wdGlvbnMgPSBudWxsO1xuICB9XG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuICF0aGlzLmVkaXRvckRpdiB8fCB0aGlzLmVkaXRvckRpdi5pbm5lclRleHQudHJpbSgpID09PSBcIlwiO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5wYXJlbnQuc2V0RWRpdGluZ1N0YXRlKHRydWUpO1xuICAgICAgdGhpcy5wYXJlbnQuZGl2LmNsYXNzTGlzdC5hZGQoXCJmcmVldGV4dEVkaXRpbmdcIik7XG4gICAgfVxuICAgIHN1cGVyLnJlbW92ZSgpO1xuICB9XG4gICNleHRyYWN0VGV4dCgpIHtcbiAgICBjb25zdCBidWZmZXIgPSBbXTtcbiAgICB0aGlzLmVkaXRvckRpdi5ub3JtYWxpemUoKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuZWRpdG9yRGl2LmNoaWxkTm9kZXMpIHtcbiAgICAgIGJ1ZmZlci5wdXNoKEZyZWVUZXh0RWRpdG9yLiNnZXROb2RlQ29udGVudChjaGlsZCkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgI3NldEVkaXRvckRpbWVuc2lvbnMoKSB7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIGxldCByZWN0O1xuICAgIGlmICh0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgcmVjdCA9IHRoaXMuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGN1cnJlbnRMYXllcixcbiAgICAgICAgZGl2XG4gICAgICB9ID0gdGhpcztcbiAgICAgIGNvbnN0IHNhdmVkRGlzcGxheSA9IGRpdi5zdHlsZS5kaXNwbGF5O1xuICAgICAgY29uc3Qgc2F2ZWRWaXNpYmlsaXR5ID0gZGl2LmNsYXNzTGlzdC5jb250YWlucyhcImhpZGRlblwiKTtcbiAgICAgIGRpdi5jbGFzc0xpc3QucmVtb3ZlKFwiaGlkZGVuXCIpO1xuICAgICAgZGl2LnN0eWxlLmRpc3BsYXkgPSBcImhpZGRlblwiO1xuICAgICAgY3VycmVudExheWVyLmRpdi5hcHBlbmQodGhpcy5kaXYpO1xuICAgICAgcmVjdCA9IGRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGRpdi5yZW1vdmUoKTtcbiAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gc2F2ZWREaXNwbGF5O1xuICAgICAgZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJoaWRkZW5cIiwgc2F2ZWRWaXNpYmlsaXR5KTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm90YXRpb24gJSAxODAgPT09IHRoaXMucGFyZW50Um90YXRpb24gJSAxODApIHtcbiAgICAgIHRoaXMud2lkdGggPSByZWN0LndpZHRoIC8gcGFyZW50V2lkdGg7XG4gICAgICB0aGlzLmhlaWdodCA9IHJlY3QuaGVpZ2h0IC8gcGFyZW50SGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndpZHRoID0gcmVjdC5oZWlnaHQgLyBwYXJlbnRXaWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gcmVjdC53aWR0aCAvIHBhcmVudEhlaWdodDtcbiAgICB9XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICB9XG4gIGNvbW1pdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNJbkVkaXRNb2RlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuY29tbWl0KCk7XG4gICAgdGhpcy5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICBjb25zdCBzYXZlZFRleHQgPSB0aGlzLiNjb250ZW50O1xuICAgIGNvbnN0IG5ld1RleHQgPSB0aGlzLiNjb250ZW50ID0gdGhpcy4jZXh0cmFjdFRleHQoKS50cmltRW5kKCk7XG4gICAgaWYgKHNhdmVkVGV4dCA9PT0gbmV3VGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZXRUZXh0ID0gdGV4dCA9PiB7XG4gICAgICB0aGlzLiNjb250ZW50ID0gdGV4dDtcbiAgICAgIGlmICghdGV4dCkge1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLiNzZXRDb250ZW50KCk7XG4gICAgICB0aGlzLl91aU1hbmFnZXIucmVidWlsZCh0aGlzKTtcbiAgICAgIHRoaXMuI3NldEVkaXRvckRpbWVuc2lvbnMoKTtcbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiAoKSA9PiB7XG4gICAgICAgIHNldFRleHQobmV3VGV4dCk7XG4gICAgICB9LFxuICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICBzZXRUZXh0KHNhdmVkVGV4dCk7XG4gICAgICB9LFxuICAgICAgbXVzdEV4ZWM6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy4jc2V0RWRpdG9yRGltZW5zaW9ucygpO1xuICB9XG4gIHNob3VsZEdldEtleWJvYXJkRXZlbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzSW5FZGl0TW9kZSgpO1xuICB9XG4gIGVudGVySW5FZGl0TW9kZSgpIHtcbiAgICB0aGlzLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5lZGl0b3JEaXYuZm9jdXMoKTtcbiAgfVxuICBkYmxjbGljayhldmVudCkge1xuICAgIHRoaXMuZW50ZXJJbkVkaXRNb2RlKCk7XG4gIH1cbiAga2V5ZG93bihldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuZGl2ICYmIGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICB0aGlzLmVudGVySW5FZGl0TW9kZSgpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbiAgZWRpdG9yRGl2S2V5ZG93bihldmVudCkge1xuICAgIEZyZWVUZXh0RWRpdG9yLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCBldmVudCk7XG4gIH1cbiAgZWRpdG9yRGl2Rm9jdXMoZXZlbnQpIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gIH1cbiAgZWRpdG9yRGl2Qmx1cihldmVudCkge1xuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gIH1cbiAgZWRpdG9yRGl2SW5wdXQoZXZlbnQpIHtcbiAgICB0aGlzLnBhcmVudC5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImZyZWV0ZXh0RWRpdGluZ1wiLCB0aGlzLmlzRW1wdHkoKSk7XG4gIH1cbiAgZGlzYWJsZUVkaXRpbmcoKSB7XG4gICAgdGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcImNvbW1lbnRcIik7XG4gICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1tdWx0aWxpbmVcIik7XG4gIH1cbiAgZW5hYmxlRWRpdGluZygpIHtcbiAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwidGV4dGJveFwiKTtcbiAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLW11bHRpbGluZVwiLCB0cnVlKTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuZGl2KSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXY7XG4gICAgfVxuICAgIGxldCBiYXNlWCwgYmFzZVk7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIGJhc2VYID0gdGhpcy54O1xuICAgICAgYmFzZVkgPSB0aGlzLnk7XG4gICAgfVxuICAgIHN1cGVyLnJlbmRlcigpO1xuICAgIHRoaXMuZWRpdG9yRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmVkaXRvckRpdi5jbGFzc05hbWUgPSBcImludGVybmFsXCI7XG4gICAgdGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKFwiaWRcIiwgdGhpcy4jZWRpdG9yRGl2SWQpO1xuICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLWZyZWUtdGV4dFwiKTtcbiAgICB0aGlzLmVuYWJsZUVkaXRpbmcoKTtcbiAgICBBbm5vdGF0aW9uRWRpdG9yLl9sMTBuUHJvbWlzZS5nZXQoXCJwZGZqcy1mcmVlLXRleHQtZGVmYXVsdC1jb250ZW50XCIpLnRoZW4obXNnID0+IHRoaXMuZWRpdG9yRGl2Py5zZXRBdHRyaWJ1dGUoXCJkZWZhdWx0LWNvbnRlbnRcIiwgbXNnKSk7XG4gICAgdGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLmVkaXRvckRpdjtcbiAgICBzdHlsZS5mb250U2l6ZSA9IGBjYWxjKCR7dGhpcy4jZm9udFNpemV9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG4gICAgc3R5bGUuY29sb3IgPSB0aGlzLiNjb2xvcjtcbiAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5lZGl0b3JEaXYpO1xuICAgIHRoaXMub3ZlcmxheURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5hZGQoXCJvdmVybGF5XCIsIFwiZW5hYmxlZFwiKTtcbiAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5vdmVybGF5RGl2KTtcbiAgICBiaW5kRXZlbnRzKHRoaXMsIHRoaXMuZGl2LCBbXCJkYmxjbGlja1wiLCBcImtleWRvd25cIl0pO1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICBpZiAodGhpcy5hbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBwb3NpdGlvblxuICAgICAgICB9ID0gdGhpcy4jaW5pdGlhbERhdGE7XG4gICAgICAgIGxldCBbdHgsIHR5XSA9IHRoaXMuZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCk7XG4gICAgICAgIFt0eCwgdHldID0gdGhpcy5wYWdlVHJhbnNsYXRpb25Ub1NjcmVlbih0eCwgdHkpO1xuICAgICAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgICAgIGNvbnN0IFtwYWdlWCwgcGFnZVldID0gdGhpcy5wYWdlVHJhbnNsYXRpb247XG4gICAgICAgIGxldCBwb3NYLCBwb3NZO1xuICAgICAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBwb3NYID0gYmFzZVggKyAocG9zaXRpb25bMF0gLSBwYWdlWCkgLyBwYWdlV2lkdGg7XG4gICAgICAgICAgICBwb3NZID0gYmFzZVkgKyB0aGlzLmhlaWdodCAtIChwb3NpdGlvblsxXSAtIHBhZ2VZKSAvIHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgcG9zWCA9IGJhc2VYICsgKHBvc2l0aW9uWzBdIC0gcGFnZVgpIC8gcGFnZVdpZHRoO1xuICAgICAgICAgICAgcG9zWSA9IGJhc2VZIC0gKHBvc2l0aW9uWzFdIC0gcGFnZVkpIC8gcGFnZUhlaWdodDtcbiAgICAgICAgICAgIFt0eCwgdHldID0gW3R5LCAtdHhdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICBwb3NYID0gYmFzZVggLSB0aGlzLndpZHRoICsgKHBvc2l0aW9uWzBdIC0gcGFnZVgpIC8gcGFnZVdpZHRoO1xuICAgICAgICAgICAgcG9zWSA9IGJhc2VZIC0gKHBvc2l0aW9uWzFdIC0gcGFnZVkpIC8gcGFnZUhlaWdodDtcbiAgICAgICAgICAgIFt0eCwgdHldID0gWy10eCwgLXR5XTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgcG9zWCA9IGJhc2VYICsgKHBvc2l0aW9uWzBdIC0gcGFnZVggLSB0aGlzLmhlaWdodCAqIHBhZ2VIZWlnaHQpIC8gcGFnZVdpZHRoO1xuICAgICAgICAgICAgcG9zWSA9IGJhc2VZICsgKHBvc2l0aW9uWzFdIC0gcGFnZVkgLSB0aGlzLndpZHRoICogcGFnZVdpZHRoKSAvIHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgICBbdHgsIHR5XSA9IFstdHksIHR4XTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0QXQocG9zWCAqIHBhcmVudFdpZHRoLCBwb3NZICogcGFyZW50SGVpZ2h0LCB0eCwgdHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRBdChiYXNlWCAqIHBhcmVudFdpZHRoLCBiYXNlWSAqIHBhcmVudEhlaWdodCwgdGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgICB9XG4gICAgICB0aGlzLiNzZXRDb250ZW50KCk7XG4gICAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpdjtcbiAgfVxuICBzdGF0aWMgI2dldE5vZGVDb250ZW50KG5vZGUpIHtcbiAgICByZXR1cm4gKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFID8gbm9kZS5ub2RlVmFsdWUgOiBub2RlLmlubmVyVGV4dCkucmVwbGFjZUFsbChFT0xfUEFUVEVSTiwgXCJcIik7XG4gIH1cbiAgZWRpdG9yRGl2UGFzdGUoZXZlbnQpIHtcbiAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YSB8fCB3aW5kb3cuY2xpcGJvYXJkRGF0YTtcbiAgICBjb25zdCB7XG4gICAgICB0eXBlc1xuICAgIH0gPSBjbGlwYm9hcmREYXRhO1xuICAgIGlmICh0eXBlcy5sZW5ndGggPT09IDEgJiYgdHlwZXNbMF0gPT09IFwidGV4dC9wbGFpblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgcGFzdGUgPSBGcmVlVGV4dEVkaXRvci4jZGVzZXJpYWxpemVDb250ZW50KGNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHRcIikgfHwgXCJcIikucmVwbGFjZUFsbChFT0xfUEFUVEVSTiwgXCJcXG5cIik7XG4gICAgaWYgKCFwYXN0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVkaXRvckRpdi5ub3JtYWxpemUoKTtcbiAgICBzZWxlY3Rpb24uZGVsZXRlRnJvbURvY3VtZW50KCk7XG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICBpZiAoIXBhc3RlLmluY2x1ZGVzKFwiXFxuXCIpKSB7XG4gICAgICByYW5nZS5pbnNlcnROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhc3RlKSk7XG4gICAgICB0aGlzLmVkaXRvckRpdi5ub3JtYWxpemUoKTtcbiAgICAgIHNlbGVjdGlvbi5jb2xsYXBzZVRvU3RhcnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgc3RhcnRDb250YWluZXIsXG4gICAgICBzdGFydE9mZnNldFxuICAgIH0gPSByYW5nZTtcbiAgICBjb25zdCBidWZmZXJCZWZvcmUgPSBbXTtcbiAgICBjb25zdCBidWZmZXJBZnRlciA9IFtdO1xuICAgIGlmIChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHN0YXJ0Q29udGFpbmVyLnBhcmVudEVsZW1lbnQ7XG4gICAgICBidWZmZXJBZnRlci5wdXNoKHN0YXJ0Q29udGFpbmVyLm5vZGVWYWx1ZS5zbGljZShzdGFydE9mZnNldCkucmVwbGFjZUFsbChFT0xfUEFUVEVSTiwgXCJcIikpO1xuICAgICAgaWYgKHBhcmVudCAhPT0gdGhpcy5lZGl0b3JEaXYpIHtcbiAgICAgICAgbGV0IGJ1ZmZlciA9IGJ1ZmZlckJlZm9yZTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmVkaXRvckRpdi5jaGlsZE5vZGVzKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlckFmdGVyO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJ1ZmZlci5wdXNoKEZyZWVUZXh0RWRpdG9yLiNnZXROb2RlQ29udGVudChjaGlsZCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBidWZmZXJCZWZvcmUucHVzaChzdGFydENvbnRhaW5lci5ub2RlVmFsdWUuc2xpY2UoMCwgc3RhcnRPZmZzZXQpLnJlcGxhY2VBbGwoRU9MX1BBVFRFUk4sIFwiXCIpKTtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0Q29udGFpbmVyID09PSB0aGlzLmVkaXRvckRpdikge1xuICAgICAgbGV0IGJ1ZmZlciA9IGJ1ZmZlckJlZm9yZTtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5lZGl0b3JEaXYuY2hpbGROb2Rlcykge1xuICAgICAgICBpZiAoaSsrID09PSBzdGFydE9mZnNldCkge1xuICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlckFmdGVyO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlci5wdXNoKEZyZWVUZXh0RWRpdG9yLiNnZXROb2RlQ29udGVudChjaGlsZCkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNjb250ZW50ID0gYCR7YnVmZmVyQmVmb3JlLmpvaW4oXCJcXG5cIil9JHtwYXN0ZX0ke2J1ZmZlckFmdGVyLmpvaW4oXCJcXG5cIil9YDtcbiAgICB0aGlzLiNzZXRDb250ZW50KCk7XG4gICAgY29uc3QgbmV3UmFuZ2UgPSBuZXcgUmFuZ2UoKTtcbiAgICBsZXQgYmVmb3JlTGVuZ3RoID0gYnVmZmVyQmVmb3JlLnJlZHVjZSgoYWNjLCBsaW5lKSA9PiBhY2MgKyBsaW5lLmxlbmd0aCwgMCk7XG4gICAgZm9yIChjb25zdCB7XG4gICAgICBmaXJzdENoaWxkXG4gICAgfSBvZiB0aGlzLmVkaXRvckRpdi5jaGlsZE5vZGVzKSB7XG4gICAgICBpZiAoZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gZmlyc3RDaGlsZC5ub2RlVmFsdWUubGVuZ3RoO1xuICAgICAgICBpZiAoYmVmb3JlTGVuZ3RoIDw9IGxlbmd0aCkge1xuICAgICAgICAgIG5ld1JhbmdlLnNldFN0YXJ0KGZpcnN0Q2hpbGQsIGJlZm9yZUxlbmd0aCk7XG4gICAgICAgICAgbmV3UmFuZ2Uuc2V0RW5kKGZpcnN0Q2hpbGQsIGJlZm9yZUxlbmd0aCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgYmVmb3JlTGVuZ3RoIC09IGxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbGVjdGlvbi5hZGRSYW5nZShuZXdSYW5nZSk7XG4gIH1cbiAgI3NldENvbnRlbnQoKSB7XG4gICAgdGhpcy5lZGl0b3JEaXYucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgaWYgKCF0aGlzLiNjb250ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgbGluZSBvZiB0aGlzLiNjb250ZW50LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZGl2LmFwcGVuZChsaW5lID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGluZSkgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xuICAgICAgdGhpcy5lZGl0b3JEaXYuYXBwZW5kKGRpdik7XG4gICAgfVxuICB9XG4gICNzZXJpYWxpemVDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLiNjb250ZW50LnJlcGxhY2VBbGwoXCJcXHhhMFwiLCBcIiBcIik7XG4gIH1cbiAgc3RhdGljICNkZXNlcmlhbGl6ZUNvbnRlbnQoY29udGVudCkge1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2VBbGwoXCIgXCIsIFwiXFx4YTBcIik7XG4gIH1cbiAgZ2V0IGNvbnRlbnREaXYoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yRGl2O1xuICB9XG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcikge1xuICAgIGxldCBpbml0aWFsRGF0YSA9IG51bGw7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBkZWZhdWx0QXBwZWFyYW5jZURhdGE6IHtcbiAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgZm9udENvbG9yXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZWN0LFxuICAgICAgICAgIHJvdGF0aW9uLFxuICAgICAgICAgIGlkXG4gICAgICAgIH0sXG4gICAgICAgIHRleHRDb250ZW50LFxuICAgICAgICB0ZXh0UG9zaXRpb24sXG4gICAgICAgIHBhcmVudDoge1xuICAgICAgICAgIHBhZ2U6IHtcbiAgICAgICAgICAgIHBhZ2VOdW1iZXJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gPSBkYXRhO1xuICAgICAgaWYgKCF0ZXh0Q29udGVudCB8fCB0ZXh0Q29udGVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpbml0aWFsRGF0YSA9IGRhdGEgPSB7XG4gICAgICAgIGFubm90YXRpb25UeXBlOiBBbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVCxcbiAgICAgICAgY29sb3I6IEFycmF5LmZyb20oZm9udENvbG9yKSxcbiAgICAgICAgZm9udFNpemUsXG4gICAgICAgIHZhbHVlOiB0ZXh0Q29udGVudC5qb2luKFwiXFxuXCIpLFxuICAgICAgICBwb3NpdGlvbjogdGV4dFBvc2l0aW9uLFxuICAgICAgICBwYWdlSW5kZXg6IHBhZ2VOdW1iZXIgLSAxLFxuICAgICAgICByZWN0OiByZWN0LnNsaWNlKDApLFxuICAgICAgICByb3RhdGlvbixcbiAgICAgICAgaWQsXG4gICAgICAgIGRlbGV0ZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBlZGl0b3IgPSBzdXBlci5kZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcik7XG4gICAgZWRpdG9yLiNmb250U2l6ZSA9IGRhdGEuZm9udFNpemU7XG4gICAgZWRpdG9yLiNjb2xvciA9IFV0aWwubWFrZUhleENvbG9yKC4uLmRhdGEuY29sb3IpO1xuICAgIGVkaXRvci4jY29udGVudCA9IEZyZWVUZXh0RWRpdG9yLiNkZXNlcmlhbGl6ZUNvbnRlbnQoZGF0YS52YWx1ZSk7XG4gICAgZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQgPSBkYXRhLmlkIHx8IG51bGw7XG4gICAgZWRpdG9yLiNpbml0aWFsRGF0YSA9IGluaXRpYWxEYXRhO1xuICAgIHJldHVybiBlZGl0b3I7XG4gIH1cbiAgc2VyaWFsaXplKGlzRm9yQ29weWluZyA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgICAgaWQ6IHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCxcbiAgICAgICAgZGVsZXRlZDogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcGFkZGluZyA9IEZyZWVUZXh0RWRpdG9yLl9pbnRlcm5hbFBhZGRpbmcgKiB0aGlzLnBhcmVudFNjYWxlO1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdldFJlY3QocGFkZGluZywgcGFkZGluZyk7XG4gICAgY29uc3QgY29sb3IgPSBBbm5vdGF0aW9uRWRpdG9yLl9jb2xvck1hbmFnZXIuY29udmVydCh0aGlzLmlzQXR0YWNoZWRUb0RPTSA/IGdldENvbXB1dGVkU3R5bGUodGhpcy5lZGl0b3JEaXYpLmNvbG9yIDogdGhpcy4jY29sb3IpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB7XG4gICAgICBhbm5vdGF0aW9uVHlwZTogQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsXG4gICAgICBjb2xvcixcbiAgICAgIGZvbnRTaXplOiB0aGlzLiNmb250U2l6ZSxcbiAgICAgIHZhbHVlOiB0aGlzLiNzZXJpYWxpemVDb250ZW50KCksXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcmVjdCxcbiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuICAgICAgc3RydWN0VHJlZVBhcmVudElkOiB0aGlzLl9zdHJ1Y3RUcmVlUGFyZW50SWRcbiAgICB9O1xuICAgIGlmIChpc0ZvckNvcHlpbmcpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5hbm5vdGF0aW9uRWxlbWVudElkICYmICF0aGlzLiNoYXNFbGVtZW50Q2hhbmdlZChzZXJpYWxpemVkKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNlcmlhbGl6ZWQuaWQgPSB0aGlzLmFubm90YXRpb25FbGVtZW50SWQ7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gIH1cbiAgI2hhc0VsZW1lbnRDaGFuZ2VkKHNlcmlhbGl6ZWQpIHtcbiAgICBjb25zdCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGZvbnRTaXplLFxuICAgICAgY29sb3IsXG4gICAgICBwYWdlSW5kZXhcbiAgICB9ID0gdGhpcy4jaW5pdGlhbERhdGE7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0JlZW5Nb3ZlZCB8fCBzZXJpYWxpemVkLnZhbHVlICE9PSB2YWx1ZSB8fCBzZXJpYWxpemVkLmZvbnRTaXplICE9PSBmb250U2l6ZSB8fCBzZXJpYWxpemVkLmNvbG9yLnNvbWUoKGMsIGkpID0+IGMgIT09IGNvbG9yW2ldKSB8fCBzZXJpYWxpemVkLnBhZ2VJbmRleCAhPT0gcGFnZUluZGV4O1xuICB9XG4gIHJlbmRlckFubm90YXRpb25FbGVtZW50KGFubm90YXRpb24pIHtcbiAgICBjb25zdCBjb250ZW50ID0gc3VwZXIucmVuZGVyQW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbik7XG4gICAgaWYgKHRoaXMuZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IGNvbnRlbnQ7XG4gICAgc3R5bGUuZm9udFNpemUgPSBgY2FsYygke3RoaXMuI2ZvbnRTaXplfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO1xuICAgIHN0eWxlLmNvbG9yID0gdGhpcy4jY29sb3I7XG4gICAgY29udGVudC5yZXBsYWNlQ2hpbGRyZW4oKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy4jY29udGVudC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGRpdi5hcHBlbmQobGluZSA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgIGNvbnRlbnQuYXBwZW5kKGRpdik7XG4gICAgfVxuICAgIGNvbnN0IHBhZGRpbmcgPSBGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogdGhpcy5wYXJlbnRTY2FsZTtcbiAgICBhbm5vdGF0aW9uLnVwZGF0ZUVkaXRlZCh7XG4gICAgICByZWN0OiB0aGlzLmdldFJlY3QocGFkZGluZywgcGFkZGluZyksXG4gICAgICBwb3B1cENvbnRlbnQ6IHRoaXMuI2NvbnRlbnRcbiAgICB9KTtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICByZXNldEFubm90YXRpb25FbGVtZW50KGFubm90YXRpb24pIHtcbiAgICBzdXBlci5yZXNldEFubm90YXRpb25FbGVtZW50KGFubm90YXRpb24pO1xuICAgIGFubm90YXRpb24ucmVzZXRFZGl0ZWQoKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3Ivb3V0bGluZXIuanNcblxuY2xhc3MgT3V0bGluZXIge1xuICAjYm94O1xuICAjdmVydGljYWxFZGdlcyA9IFtdO1xuICAjaW50ZXJ2YWxzID0gW107XG4gIGNvbnN0cnVjdG9yKGJveGVzLCBib3JkZXJXaWR0aCA9IDAsIGlubmVyTWFyZ2luID0gMCwgaXNMVFIgPSB0cnVlKSB7XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgIGNvbnN0IE5VTUJFUl9PRl9ESUdJVFMgPSA0O1xuICAgIGNvbnN0IEVQU0lMT04gPSAxMCAqKiAtTlVNQkVSX09GX0RJR0lUUztcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9IG9mIGJveGVzKSB7XG4gICAgICBjb25zdCB4MSA9IE1hdGguZmxvb3IoKHggLSBib3JkZXJXaWR0aCkgLyBFUFNJTE9OKSAqIEVQU0lMT047XG4gICAgICBjb25zdCB4MiA9IE1hdGguY2VpbCgoeCArIHdpZHRoICsgYm9yZGVyV2lkdGgpIC8gRVBTSUxPTikgKiBFUFNJTE9OO1xuICAgICAgY29uc3QgeTEgPSBNYXRoLmZsb29yKCh5IC0gYm9yZGVyV2lkdGgpIC8gRVBTSUxPTikgKiBFUFNJTE9OO1xuICAgICAgY29uc3QgeTIgPSBNYXRoLmNlaWwoKHkgKyBoZWlnaHQgKyBib3JkZXJXaWR0aCkgLyBFUFNJTE9OKSAqIEVQU0lMT047XG4gICAgICBjb25zdCBsZWZ0ID0gW3gxLCB5MSwgeTIsIHRydWVdO1xuICAgICAgY29uc3QgcmlnaHQgPSBbeDIsIHkxLCB5MiwgZmFsc2VdO1xuICAgICAgdGhpcy4jdmVydGljYWxFZGdlcy5wdXNoKGxlZnQsIHJpZ2h0KTtcbiAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4MSk7XG4gICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeDIpO1xuICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHkxKTtcbiAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5Mik7XG4gICAgfVxuICAgIGNvbnN0IGJib3hXaWR0aCA9IG1heFggLSBtaW5YICsgMiAqIGlubmVyTWFyZ2luO1xuICAgIGNvbnN0IGJib3hIZWlnaHQgPSBtYXhZIC0gbWluWSArIDIgKiBpbm5lck1hcmdpbjtcbiAgICBjb25zdCBzaGlmdGVkTWluWCA9IG1pblggLSBpbm5lck1hcmdpbjtcbiAgICBjb25zdCBzaGlmdGVkTWluWSA9IG1pblkgLSBpbm5lck1hcmdpbjtcbiAgICBjb25zdCBsYXN0RWRnZSA9IHRoaXMuI3ZlcnRpY2FsRWRnZXMuYXQoaXNMVFIgPyAtMSA6IC0yKTtcbiAgICBjb25zdCBsYXN0UG9pbnQgPSBbbGFzdEVkZ2VbMF0sIGxhc3RFZGdlWzJdXTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgdGhpcy4jdmVydGljYWxFZGdlcykge1xuICAgICAgY29uc3QgW3gsIHkxLCB5Ml0gPSBlZGdlO1xuICAgICAgZWRnZVswXSA9ICh4IC0gc2hpZnRlZE1pblgpIC8gYmJveFdpZHRoO1xuICAgICAgZWRnZVsxXSA9ICh5MSAtIHNoaWZ0ZWRNaW5ZKSAvIGJib3hIZWlnaHQ7XG4gICAgICBlZGdlWzJdID0gKHkyIC0gc2hpZnRlZE1pblkpIC8gYmJveEhlaWdodDtcbiAgICB9XG4gICAgdGhpcy4jYm94ID0ge1xuICAgICAgeDogc2hpZnRlZE1pblgsXG4gICAgICB5OiBzaGlmdGVkTWluWSxcbiAgICAgIHdpZHRoOiBiYm94V2lkdGgsXG4gICAgICBoZWlnaHQ6IGJib3hIZWlnaHQsXG4gICAgICBsYXN0UG9pbnRcbiAgICB9O1xuICB9XG4gIGdldE91dGxpbmVzKCkge1xuICAgIHRoaXMuI3ZlcnRpY2FsRWRnZXMuc29ydCgoYSwgYikgPT4gYVswXSAtIGJbMF0gfHwgYVsxXSAtIGJbMV0gfHwgYVsyXSAtIGJbMl0pO1xuICAgIGNvbnN0IG91dGxpbmVWZXJ0aWNhbEVkZ2VzID0gW107XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIHRoaXMuI3ZlcnRpY2FsRWRnZXMpIHtcbiAgICAgIGlmIChlZGdlWzNdKSB7XG4gICAgICAgIG91dGxpbmVWZXJ0aWNhbEVkZ2VzLnB1c2goLi4udGhpcy4jYnJlYWtFZGdlKGVkZ2UpKTtcbiAgICAgICAgdGhpcy4jaW5zZXJ0KGVkZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jcmVtb3ZlKGVkZ2UpO1xuICAgICAgICBvdXRsaW5lVmVydGljYWxFZGdlcy5wdXNoKC4uLnRoaXMuI2JyZWFrRWRnZShlZGdlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNnZXRPdXRsaW5lcyhvdXRsaW5lVmVydGljYWxFZGdlcyk7XG4gIH1cbiAgI2dldE91dGxpbmVzKG91dGxpbmVWZXJ0aWNhbEVkZ2VzKSB7XG4gICAgY29uc3QgZWRnZXMgPSBbXTtcbiAgICBjb25zdCBhbGxFZGdlcyA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2Ygb3V0bGluZVZlcnRpY2FsRWRnZXMpIHtcbiAgICAgIGNvbnN0IFt4LCB5MSwgeTJdID0gZWRnZTtcbiAgICAgIGVkZ2VzLnB1c2goW3gsIHkxLCBlZGdlXSwgW3gsIHkyLCBlZGdlXSk7XG4gICAgfVxuICAgIGVkZ2VzLnNvcnQoKGEsIGIpID0+IGFbMV0gLSBiWzFdIHx8IGFbMF0gLSBiWzBdKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBlZGdlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBjb25zdCBlZGdlMSA9IGVkZ2VzW2ldWzJdO1xuICAgICAgY29uc3QgZWRnZTIgPSBlZGdlc1tpICsgMV1bMl07XG4gICAgICBlZGdlMS5wdXNoKGVkZ2UyKTtcbiAgICAgIGVkZ2UyLnB1c2goZWRnZTEpO1xuICAgICAgYWxsRWRnZXMuYWRkKGVkZ2UxKTtcbiAgICAgIGFsbEVkZ2VzLmFkZChlZGdlMik7XG4gICAgfVxuICAgIGNvbnN0IG91dGxpbmVzID0gW107XG4gICAgbGV0IG91dGxpbmU7XG4gICAgd2hpbGUgKGFsbEVkZ2VzLnNpemUgPiAwKSB7XG4gICAgICBjb25zdCBlZGdlID0gYWxsRWRnZXMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgbGV0IFt4LCB5MSwgeTIsIGVkZ2UxLCBlZGdlMl0gPSBlZGdlO1xuICAgICAgYWxsRWRnZXMuZGVsZXRlKGVkZ2UpO1xuICAgICAgbGV0IGxhc3RQb2ludFggPSB4O1xuICAgICAgbGV0IGxhc3RQb2ludFkgPSB5MTtcbiAgICAgIG91dGxpbmUgPSBbeCwgeTJdO1xuICAgICAgb3V0bGluZXMucHVzaChvdXRsaW5lKTtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGxldCBlO1xuICAgICAgICBpZiAoYWxsRWRnZXMuaGFzKGVkZ2UxKSkge1xuICAgICAgICAgIGUgPSBlZGdlMTtcbiAgICAgICAgfSBlbHNlIGlmIChhbGxFZGdlcy5oYXMoZWRnZTIpKSB7XG4gICAgICAgICAgZSA9IGVkZ2UyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGFsbEVkZ2VzLmRlbGV0ZShlKTtcbiAgICAgICAgW3gsIHkxLCB5MiwgZWRnZTEsIGVkZ2UyXSA9IGU7XG4gICAgICAgIGlmIChsYXN0UG9pbnRYICE9PSB4KSB7XG4gICAgICAgICAgb3V0bGluZS5wdXNoKGxhc3RQb2ludFgsIGxhc3RQb2ludFksIHgsIGxhc3RQb2ludFkgPT09IHkxID8geTEgOiB5Mik7XG4gICAgICAgICAgbGFzdFBvaW50WCA9IHg7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFBvaW50WSA9IGxhc3RQb2ludFkgPT09IHkxID8geTIgOiB5MTtcbiAgICAgIH1cbiAgICAgIG91dGxpbmUucHVzaChsYXN0UG9pbnRYLCBsYXN0UG9pbnRZKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBIaWdobGlnaHRPdXRsaW5lKG91dGxpbmVzLCB0aGlzLiNib3gpO1xuICB9XG4gICNiaW5hcnlTZWFyY2goeSkge1xuICAgIGNvbnN0IGFycmF5ID0gdGhpcy4jaW50ZXJ2YWxzO1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgbGV0IGVuZCA9IGFycmF5Lmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkge1xuICAgICAgY29uc3QgbWlkZGxlID0gc3RhcnQgKyBlbmQgPj4gMTtcbiAgICAgIGNvbnN0IHkxID0gYXJyYXlbbWlkZGxlXVswXTtcbiAgICAgIGlmICh5MSA9PT0geSkge1xuICAgICAgICByZXR1cm4gbWlkZGxlO1xuICAgICAgfVxuICAgICAgaWYgKHkxIDwgeSkge1xuICAgICAgICBzdGFydCA9IG1pZGRsZSArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSBtaWRkbGUgLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW5kICsgMTtcbiAgfVxuICAjaW5zZXJ0KFssIHkxLCB5Ml0pIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuI2JpbmFyeVNlYXJjaCh5MSk7XG4gICAgdGhpcy4jaW50ZXJ2YWxzLnNwbGljZShpbmRleCwgMCwgW3kxLCB5Ml0pO1xuICB9XG4gICNyZW1vdmUoWywgeTEsIHkyXSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy4jYmluYXJ5U2VhcmNoKHkxKTtcbiAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPCB0aGlzLiNpbnRlcnZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuI2ludGVydmFsc1tpXTtcbiAgICAgIGlmIChzdGFydCAhPT0geTEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgPT09IHkxICYmIGVuZCA9PT0geTIpIHtcbiAgICAgICAgdGhpcy4jaW50ZXJ2YWxzLnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gaW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy4jaW50ZXJ2YWxzW2ldO1xuICAgICAgaWYgKHN0YXJ0ICE9PSB5MSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA9PT0geTEgJiYgZW5kID09PSB5Mikge1xuICAgICAgICB0aGlzLiNpbnRlcnZhbHMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gICNicmVha0VkZ2UoZWRnZSkge1xuICAgIGNvbnN0IFt4LCB5MSwgeTJdID0gZWRnZTtcbiAgICBjb25zdCByZXN1bHRzID0gW1t4LCB5MSwgeTJdXTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuI2JpbmFyeVNlYXJjaCh5Mik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7XG4gICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLiNpbnRlcnZhbHNbaV07XG4gICAgICBmb3IgKGxldCBqID0gMCwgamogPSByZXN1bHRzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgY29uc3QgWywgeTMsIHk0XSA9IHJlc3VsdHNbal07XG4gICAgICAgIGlmIChlbmQgPD0geTMgfHwgeTQgPD0gc3RhcnQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeTMgPj0gc3RhcnQpIHtcbiAgICAgICAgICBpZiAoeTQgPiBlbmQpIHtcbiAgICAgICAgICAgIHJlc3VsdHNbal1bMV0gPSBlbmQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChqaiA9PT0gMSkge1xuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRzLnNwbGljZShqLCAxKTtcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIGpqLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdHNbal1bMl0gPSBzdGFydDtcbiAgICAgICAgaWYgKHk0ID4gZW5kKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKFt4LCBlbmQsIHk0XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbmNsYXNzIE91dGxpbmUge1xuICB0b1NWR1BhdGgoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdHJhY3QgbWV0aG9kIGB0b1NWR1BhdGhgIG11c3QgYmUgaW1wbGVtZW50ZWQuXCIpO1xuICB9XG4gIGdldCBib3goKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdHJhY3QgZ2V0dGVyIGBib3hgIG11c3QgYmUgaW1wbGVtZW50ZWQuXCIpO1xuICB9XG4gIHNlcmlhbGl6ZShfYmJveCwgX3JvdGF0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdHJhY3QgbWV0aG9kIGBzZXJpYWxpemVgIG11c3QgYmUgaW1wbGVtZW50ZWQuXCIpO1xuICB9XG4gIGdldCBmcmVlKCkge1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgRnJlZUhpZ2hsaWdodE91dGxpbmU7XG4gIH1cbn1cbmNsYXNzIEhpZ2hsaWdodE91dGxpbmUgZXh0ZW5kcyBPdXRsaW5lIHtcbiAgI2JveDtcbiAgI291dGxpbmVzO1xuICBjb25zdHJ1Y3RvcihvdXRsaW5lcywgYm94KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLiNvdXRsaW5lcyA9IG91dGxpbmVzO1xuICAgIHRoaXMuI2JveCA9IGJveDtcbiAgfVxuICB0b1NWR1BhdGgoKSB7XG4gICAgY29uc3QgYnVmZmVyID0gW107XG4gICAgZm9yIChjb25zdCBwb2x5Z29uIG9mIHRoaXMuI291dGxpbmVzKSB7XG4gICAgICBsZXQgW3ByZXZYLCBwcmV2WV0gPSBwb2x5Z29uO1xuICAgICAgYnVmZmVyLnB1c2goYE0ke3ByZXZYfSAke3ByZXZZfWApO1xuICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGNvbnN0IHggPSBwb2x5Z29uW2ldO1xuICAgICAgICBjb25zdCB5ID0gcG9seWdvbltpICsgMV07XG4gICAgICAgIGlmICh4ID09PSBwcmV2WCkge1xuICAgICAgICAgIGJ1ZmZlci5wdXNoKGBWJHt5fWApO1xuICAgICAgICAgIHByZXZZID0geTtcbiAgICAgICAgfSBlbHNlIGlmICh5ID09PSBwcmV2WSkge1xuICAgICAgICAgIGJ1ZmZlci5wdXNoKGBIJHt4fWApO1xuICAgICAgICAgIHByZXZYID0geDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnVmZmVyLnB1c2goXCJaXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyLmpvaW4oXCIgXCIpO1xuICB9XG4gIHNlcmlhbGl6ZShbYmxYLCBibFksIHRyWCwgdHJZXSwgX3JvdGF0aW9uKSB7XG4gICAgY29uc3Qgb3V0bGluZXMgPSBbXTtcbiAgICBjb25zdCB3aWR0aCA9IHRyWCAtIGJsWDtcbiAgICBjb25zdCBoZWlnaHQgPSB0clkgLSBibFk7XG4gICAgZm9yIChjb25zdCBvdXRsaW5lIG9mIHRoaXMuI291dGxpbmVzKSB7XG4gICAgICBjb25zdCBwb2ludHMgPSBuZXcgQXJyYXkob3V0bGluZS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRsaW5lLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHBvaW50c1tpXSA9IGJsWCArIG91dGxpbmVbaV0gKiB3aWR0aDtcbiAgICAgICAgcG9pbnRzW2kgKyAxXSA9IHRyWSAtIG91dGxpbmVbaSArIDFdICogaGVpZ2h0O1xuICAgICAgfVxuICAgICAgb3V0bGluZXMucHVzaChwb2ludHMpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0bGluZXM7XG4gIH1cbiAgZ2V0IGJveCgpIHtcbiAgICByZXR1cm4gdGhpcy4jYm94O1xuICB9XG59XG5jbGFzcyBGcmVlT3V0bGluZXIge1xuICAjYm94O1xuICAjYm90dG9tID0gW107XG4gICNpbm5lck1hcmdpbjtcbiAgI2lzTFRSO1xuICAjdG9wID0gW107XG4gICNsYXN0ID0gbmV3IEZsb2F0NjRBcnJheSgxOCk7XG4gICNsYXN0WDtcbiAgI2xhc3RZO1xuICAjbWluO1xuICAjbWluX2Rpc3Q7XG4gICNzY2FsZUZhY3RvcjtcbiAgI3RoaWNrbmVzcztcbiAgI3BvaW50cyA9IFtdO1xuICBzdGF0aWMgI01JTl9ESVNUID0gODtcbiAgc3RhdGljICNNSU5fRElGRiA9IDI7XG4gIHN0YXRpYyAjTUlOID0gRnJlZU91dGxpbmVyLiNNSU5fRElTVCArIEZyZWVPdXRsaW5lci4jTUlOX0RJRkY7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICB4LFxuICAgIHlcbiAgfSwgYm94LCBzY2FsZUZhY3RvciwgdGhpY2tuZXNzLCBpc0xUUiwgaW5uZXJNYXJnaW4gPSAwKSB7XG4gICAgdGhpcy4jYm94ID0gYm94O1xuICAgIHRoaXMuI3RoaWNrbmVzcyA9IHRoaWNrbmVzcyAqIHNjYWxlRmFjdG9yO1xuICAgIHRoaXMuI2lzTFRSID0gaXNMVFI7XG4gICAgdGhpcy4jbGFzdC5zZXQoW05hTiwgTmFOLCBOYU4sIE5hTiwgeCwgeV0sIDYpO1xuICAgIHRoaXMuI2lubmVyTWFyZ2luID0gaW5uZXJNYXJnaW47XG4gICAgdGhpcy4jbWluX2Rpc3QgPSBGcmVlT3V0bGluZXIuI01JTl9ESVNUICogc2NhbGVGYWN0b3I7XG4gICAgdGhpcy4jbWluID0gRnJlZU91dGxpbmVyLiNNSU4gKiBzY2FsZUZhY3RvcjtcbiAgICB0aGlzLiNzY2FsZUZhY3RvciA9IHNjYWxlRmFjdG9yO1xuICAgIHRoaXMuI3BvaW50cy5wdXNoKHgsIHkpO1xuICB9XG4gIGdldCBmcmVlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIGlzTmFOKHRoaXMuI2xhc3RbOF0pO1xuICB9XG4gICNnZXRMYXN0Q29vcmRzKCkge1xuICAgIGNvbnN0IGxhc3RUb3AgPSB0aGlzLiNsYXN0LnN1YmFycmF5KDQsIDYpO1xuICAgIGNvbnN0IGxhc3RCb3R0b20gPSB0aGlzLiNsYXN0LnN1YmFycmF5KDE2LCAxOCk7XG4gICAgY29uc3QgW3gsIHksIHdpZHRoLCBoZWlnaHRdID0gdGhpcy4jYm94O1xuICAgIHJldHVybiBbKHRoaXMuI2xhc3RYICsgKGxhc3RUb3BbMF0gLSBsYXN0Qm90dG9tWzBdKSAvIDIgLSB4KSAvIHdpZHRoLCAodGhpcy4jbGFzdFkgKyAobGFzdFRvcFsxXSAtIGxhc3RCb3R0b21bMV0pIC8gMiAtIHkpIC8gaGVpZ2h0LCAodGhpcy4jbGFzdFggKyAobGFzdEJvdHRvbVswXSAtIGxhc3RUb3BbMF0pIC8gMiAtIHgpIC8gd2lkdGgsICh0aGlzLiNsYXN0WSArIChsYXN0Qm90dG9tWzFdIC0gbGFzdFRvcFsxXSkgLyAyIC0geSkgLyBoZWlnaHRdO1xuICB9XG4gIGFkZCh7XG4gICAgeCxcbiAgICB5XG4gIH0pIHtcbiAgICB0aGlzLiNsYXN0WCA9IHg7XG4gICAgdGhpcy4jbGFzdFkgPSB5O1xuICAgIGNvbnN0IFtsYXllclgsIGxheWVyWSwgbGF5ZXJXaWR0aCwgbGF5ZXJIZWlnaHRdID0gdGhpcy4jYm94O1xuICAgIGxldCBbeDEsIHkxLCB4MiwgeTJdID0gdGhpcy4jbGFzdC5zdWJhcnJheSg4LCAxMik7XG4gICAgY29uc3QgZGlmZlggPSB4IC0geDI7XG4gICAgY29uc3QgZGlmZlkgPSB5IC0geTI7XG4gICAgY29uc3QgZCA9IE1hdGguaHlwb3QoZGlmZlgsIGRpZmZZKTtcbiAgICBpZiAoZCA8IHRoaXMuI21pbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkaWZmRCA9IGQgLSB0aGlzLiNtaW5fZGlzdDtcbiAgICBjb25zdCBLID0gZGlmZkQgLyBkO1xuICAgIGNvbnN0IHNoaWZ0WCA9IEsgKiBkaWZmWDtcbiAgICBjb25zdCBzaGlmdFkgPSBLICogZGlmZlk7XG4gICAgbGV0IHgwID0geDE7XG4gICAgbGV0IHkwID0geTE7XG4gICAgeDEgPSB4MjtcbiAgICB5MSA9IHkyO1xuICAgIHgyICs9IHNoaWZ0WDtcbiAgICB5MiArPSBzaGlmdFk7XG4gICAgdGhpcy4jcG9pbnRzPy5wdXNoKHgsIHkpO1xuICAgIGNvbnN0IG5YID0gLXNoaWZ0WSAvIGRpZmZEO1xuICAgIGNvbnN0IG5ZID0gc2hpZnRYIC8gZGlmZkQ7XG4gICAgY29uc3QgdGhYID0gblggKiB0aGlzLiN0aGlja25lc3M7XG4gICAgY29uc3QgdGhZID0gblkgKiB0aGlzLiN0aGlja25lc3M7XG4gICAgdGhpcy4jbGFzdC5zZXQodGhpcy4jbGFzdC5zdWJhcnJheSgyLCA4KSwgMCk7XG4gICAgdGhpcy4jbGFzdC5zZXQoW3gyICsgdGhYLCB5MiArIHRoWV0sIDQpO1xuICAgIHRoaXMuI2xhc3Quc2V0KHRoaXMuI2xhc3Quc3ViYXJyYXkoMTQsIDE4KSwgMTIpO1xuICAgIHRoaXMuI2xhc3Quc2V0KFt4MiAtIHRoWCwgeTIgLSB0aFldLCAxNik7XG4gICAgaWYgKGlzTmFOKHRoaXMuI2xhc3RbNl0pKSB7XG4gICAgICBpZiAodGhpcy4jdG9wLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLiNsYXN0LnNldChbeDEgKyB0aFgsIHkxICsgdGhZXSwgMik7XG4gICAgICAgIHRoaXMuI3RvcC5wdXNoKE5hTiwgTmFOLCBOYU4sIE5hTiwgKHgxICsgdGhYIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICh5MSArIHRoWSAtIGxheWVyWSkgLyBsYXllckhlaWdodCk7XG4gICAgICAgIHRoaXMuI2xhc3Quc2V0KFt4MSAtIHRoWCwgeTEgLSB0aFldLCAxNCk7XG4gICAgICAgIHRoaXMuI2JvdHRvbS5wdXNoKE5hTiwgTmFOLCBOYU4sIE5hTiwgKHgxIC0gdGhYIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICh5MSAtIHRoWSAtIGxheWVyWSkgLyBsYXllckhlaWdodCk7XG4gICAgICB9XG4gICAgICB0aGlzLiNsYXN0LnNldChbeDAsIHkwLCB4MSwgeTEsIHgyLCB5Ml0sIDYpO1xuICAgICAgcmV0dXJuICF0aGlzLmlzRW1wdHkoKTtcbiAgICB9XG4gICAgdGhpcy4jbGFzdC5zZXQoW3gwLCB5MCwgeDEsIHkxLCB4MiwgeTJdLCA2KTtcbiAgICBjb25zdCBhbmdsZSA9IE1hdGguYWJzKE1hdGguYXRhbjIoeTAgLSB5MSwgeDAgLSB4MSkgLSBNYXRoLmF0YW4yKHNoaWZ0WSwgc2hpZnRYKSk7XG4gICAgaWYgKGFuZ2xlIDwgTWF0aC5QSSAvIDIpIHtcbiAgICAgIFt4MSwgeTEsIHgyLCB5Ml0gPSB0aGlzLiNsYXN0LnN1YmFycmF5KDIsIDYpO1xuICAgICAgdGhpcy4jdG9wLnB1c2goTmFOLCBOYU4sIE5hTiwgTmFOLCAoKHgxICsgeDIpIC8gMiAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoKHkxICsgeTIpIC8gMiAtIGxheWVyWSkgLyBsYXllckhlaWdodCk7XG4gICAgICBbeDEsIHkxLCB4MCwgeTBdID0gdGhpcy4jbGFzdC5zdWJhcnJheSgxNCwgMTgpO1xuICAgICAgdGhpcy4jYm90dG9tLnB1c2goTmFOLCBOYU4sIE5hTiwgTmFOLCAoKHgwICsgeDEpIC8gMiAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoKHkwICsgeTEpIC8gMiAtIGxheWVyWSkgLyBsYXllckhlaWdodCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgW3gwLCB5MCwgeDEsIHkxLCB4MiwgeTJdID0gdGhpcy4jbGFzdC5zdWJhcnJheSgwLCA2KTtcbiAgICB0aGlzLiN0b3AucHVzaCgoKHgwICsgNSAqIHgxKSAvIDYgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCh5MCArIDUgKiB5MSkgLyA2IC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCAoKDUgKiB4MSArIHgyKSAvIDYgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCg1ICogeTEgKyB5MikgLyA2IC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCAoKHgxICsgeDIpIC8gMiAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoKHkxICsgeTIpIC8gMiAtIGxheWVyWSkgLyBsYXllckhlaWdodCk7XG4gICAgW3gyLCB5MiwgeDEsIHkxLCB4MCwgeTBdID0gdGhpcy4jbGFzdC5zdWJhcnJheSgxMiwgMTgpO1xuICAgIHRoaXMuI2JvdHRvbS5wdXNoKCgoeDAgKyA1ICogeDEpIC8gNiAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoKHkwICsgNSAqIHkxKSAvIDYgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQsICgoNSAqIHgxICsgeDIpIC8gNiAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoKDUgKiB5MSArIHkyKSAvIDYgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQsICgoeDEgKyB4MikgLyAyIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICgoeTEgKyB5MikgLyAyIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0b1NWR1BhdGgoKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgY29uc3QgdG9wID0gdGhpcy4jdG9wO1xuICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuI2JvdHRvbTtcbiAgICBjb25zdCBsYXN0VG9wID0gdGhpcy4jbGFzdC5zdWJhcnJheSg0LCA2KTtcbiAgICBjb25zdCBsYXN0Qm90dG9tID0gdGhpcy4jbGFzdC5zdWJhcnJheSgxNiwgMTgpO1xuICAgIGNvbnN0IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSA9IHRoaXMuI2JveDtcbiAgICBjb25zdCBbbGFzdFRvcFgsIGxhc3RUb3BZLCBsYXN0Qm90dG9tWCwgbGFzdEJvdHRvbVldID0gdGhpcy4jZ2V0TGFzdENvb3JkcygpO1xuICAgIGlmIChpc05hTih0aGlzLiNsYXN0WzZdKSAmJiAhdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiBgTSR7KHRoaXMuI2xhc3RbMl0gLSB4KSAvIHdpZHRofSAkeyh0aGlzLiNsYXN0WzNdIC0geSkgLyBoZWlnaHR9IEwkeyh0aGlzLiNsYXN0WzRdIC0geCkgLyB3aWR0aH0gJHsodGhpcy4jbGFzdFs1XSAtIHkpIC8gaGVpZ2h0fSBMJHtsYXN0VG9wWH0gJHtsYXN0VG9wWX0gTCR7bGFzdEJvdHRvbVh9ICR7bGFzdEJvdHRvbVl9IEwkeyh0aGlzLiNsYXN0WzE2XSAtIHgpIC8gd2lkdGh9ICR7KHRoaXMuI2xhc3RbMTddIC0geSkgLyBoZWlnaHR9IEwkeyh0aGlzLiNsYXN0WzE0XSAtIHgpIC8gd2lkdGh9ICR7KHRoaXMuI2xhc3RbMTVdIC0geSkgLyBoZWlnaHR9IFpgO1xuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBbXTtcbiAgICBidWZmZXIucHVzaChgTSR7dG9wWzRdfSAke3RvcFs1XX1gKTtcbiAgICBmb3IgKGxldCBpID0gNjsgaSA8IHRvcC5sZW5ndGg7IGkgKz0gNikge1xuICAgICAgaWYgKGlzTmFOKHRvcFtpXSkpIHtcbiAgICAgICAgYnVmZmVyLnB1c2goYEwke3RvcFtpICsgNF19ICR7dG9wW2kgKyA1XX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZmZlci5wdXNoKGBDJHt0b3BbaV19ICR7dG9wW2kgKyAxXX0gJHt0b3BbaSArIDJdfSAke3RvcFtpICsgM119ICR7dG9wW2kgKyA0XX0gJHt0b3BbaSArIDVdfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBidWZmZXIucHVzaChgTCR7KGxhc3RUb3BbMF0gLSB4KSAvIHdpZHRofSAkeyhsYXN0VG9wWzFdIC0geSkgLyBoZWlnaHR9IEwke2xhc3RUb3BYfSAke2xhc3RUb3BZfSBMJHtsYXN0Qm90dG9tWH0gJHtsYXN0Qm90dG9tWX0gTCR7KGxhc3RCb3R0b21bMF0gLSB4KSAvIHdpZHRofSAkeyhsYXN0Qm90dG9tWzFdIC0geSkgLyBoZWlnaHR9YCk7XG4gICAgZm9yIChsZXQgaSA9IGJvdHRvbS5sZW5ndGggLSA2OyBpID49IDY7IGkgLT0gNikge1xuICAgICAgaWYgKGlzTmFOKGJvdHRvbVtpXSkpIHtcbiAgICAgICAgYnVmZmVyLnB1c2goYEwke2JvdHRvbVtpICsgNF19ICR7Ym90dG9tW2kgKyA1XX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZmZlci5wdXNoKGBDJHtib3R0b21baV19ICR7Ym90dG9tW2kgKyAxXX0gJHtib3R0b21baSArIDJdfSAke2JvdHRvbVtpICsgM119ICR7Ym90dG9tW2kgKyA0XX0gJHtib3R0b21baSArIDVdfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBidWZmZXIucHVzaChgTCR7Ym90dG9tWzRdfSAke2JvdHRvbVs1XX0gWmApO1xuICAgIHJldHVybiBidWZmZXIuam9pbihcIiBcIik7XG4gIH1cbiAgZ2V0T3V0bGluZXMoKSB7XG4gICAgY29uc3QgdG9wID0gdGhpcy4jdG9wO1xuICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuI2JvdHRvbTtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy4jbGFzdDtcbiAgICBjb25zdCBsYXN0VG9wID0gbGFzdC5zdWJhcnJheSg0LCA2KTtcbiAgICBjb25zdCBsYXN0Qm90dG9tID0gbGFzdC5zdWJhcnJheSgxNiwgMTgpO1xuICAgIGNvbnN0IFtsYXllclgsIGxheWVyWSwgbGF5ZXJXaWR0aCwgbGF5ZXJIZWlnaHRdID0gdGhpcy4jYm94O1xuICAgIGNvbnN0IHBvaW50cyA9IG5ldyBGbG9hdDY0QXJyYXkoKHRoaXMuI3BvaW50cz8ubGVuZ3RoID8/IDApICsgMik7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aCAtIDI7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBwb2ludHNbaV0gPSAodGhpcy4jcG9pbnRzW2ldIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGg7XG4gICAgICBwb2ludHNbaSArIDFdID0gKHRoaXMuI3BvaW50c1tpICsgMV0gLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQ7XG4gICAgfVxuICAgIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl0gPSAodGhpcy4jbGFzdFggLSBsYXllclgpIC8gbGF5ZXJXaWR0aDtcbiAgICBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdID0gKHRoaXMuI2xhc3RZIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0O1xuICAgIGNvbnN0IFtsYXN0VG9wWCwgbGFzdFRvcFksIGxhc3RCb3R0b21YLCBsYXN0Qm90dG9tWV0gPSB0aGlzLiNnZXRMYXN0Q29vcmRzKCk7XG4gICAgaWYgKGlzTmFOKGxhc3RbNl0pICYmICF0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgY29uc3Qgb3V0bGluZSA9IG5ldyBGbG9hdDY0QXJyYXkoMzYpO1xuICAgICAgb3V0bGluZS5zZXQoW05hTiwgTmFOLCBOYU4sIE5hTiwgKGxhc3RbMl0gLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKGxhc3RbM10gLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQsIE5hTiwgTmFOLCBOYU4sIE5hTiwgKGxhc3RbNF0gLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKGxhc3RbNV0gLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQsIE5hTiwgTmFOLCBOYU4sIE5hTiwgbGFzdFRvcFgsIGxhc3RUb3BZLCBOYU4sIE5hTiwgTmFOLCBOYU4sIGxhc3RCb3R0b21YLCBsYXN0Qm90dG9tWSwgTmFOLCBOYU4sIE5hTiwgTmFOLCAobGFzdFsxNl0gLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKGxhc3RbMTddIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCBOYU4sIE5hTiwgTmFOLCBOYU4sIChsYXN0WzE0XSAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAobGFzdFsxNV0gLSBsYXllclkpIC8gbGF5ZXJIZWlnaHRdLCAwKTtcbiAgICAgIHJldHVybiBuZXcgRnJlZUhpZ2hsaWdodE91dGxpbmUob3V0bGluZSwgcG9pbnRzLCB0aGlzLiNib3gsIHRoaXMuI3NjYWxlRmFjdG9yLCB0aGlzLiNpbm5lck1hcmdpbiwgdGhpcy4jaXNMVFIpO1xuICAgIH1cbiAgICBjb25zdCBvdXRsaW5lID0gbmV3IEZsb2F0NjRBcnJheSh0aGlzLiN0b3AubGVuZ3RoICsgMjQgKyB0aGlzLiNib3R0b20ubGVuZ3RoKTtcbiAgICBsZXQgTiA9IHRvcC5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOOyBpICs9IDIpIHtcbiAgICAgIGlmIChpc05hTih0b3BbaV0pKSB7XG4gICAgICAgIG91dGxpbmVbaV0gPSBvdXRsaW5lW2kgKyAxXSA9IE5hTjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBvdXRsaW5lW2ldID0gdG9wW2ldO1xuICAgICAgb3V0bGluZVtpICsgMV0gPSB0b3BbaSArIDFdO1xuICAgIH1cbiAgICBvdXRsaW5lLnNldChbTmFOLCBOYU4sIE5hTiwgTmFOLCAobGFzdFRvcFswXSAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAobGFzdFRvcFsxXSAtIGxheWVyWSkgLyBsYXllckhlaWdodCwgTmFOLCBOYU4sIE5hTiwgTmFOLCBsYXN0VG9wWCwgbGFzdFRvcFksIE5hTiwgTmFOLCBOYU4sIE5hTiwgbGFzdEJvdHRvbVgsIGxhc3RCb3R0b21ZLCBOYU4sIE5hTiwgTmFOLCBOYU4sIChsYXN0Qm90dG9tWzBdIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsIChsYXN0Qm90dG9tWzFdIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0XSwgTik7XG4gICAgTiArPSAyNDtcbiAgICBmb3IgKGxldCBpID0gYm90dG9tLmxlbmd0aCAtIDY7IGkgPj0gNjsgaSAtPSA2KSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDY7IGogKz0gMikge1xuICAgICAgICBpZiAoaXNOYU4oYm90dG9tW2kgKyBqXSkpIHtcbiAgICAgICAgICBvdXRsaW5lW05dID0gb3V0bGluZVtOICsgMV0gPSBOYU47XG4gICAgICAgICAgTiArPSAyO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG91dGxpbmVbTl0gPSBib3R0b21baSArIGpdO1xuICAgICAgICBvdXRsaW5lW04gKyAxXSA9IGJvdHRvbVtpICsgaiArIDFdO1xuICAgICAgICBOICs9IDI7XG4gICAgICB9XG4gICAgfVxuICAgIG91dGxpbmUuc2V0KFtOYU4sIE5hTiwgTmFOLCBOYU4sIGJvdHRvbVs0XSwgYm90dG9tWzVdXSwgTik7XG4gICAgcmV0dXJuIG5ldyBGcmVlSGlnaGxpZ2h0T3V0bGluZShvdXRsaW5lLCBwb2ludHMsIHRoaXMuI2JveCwgdGhpcy4jc2NhbGVGYWN0b3IsIHRoaXMuI2lubmVyTWFyZ2luLCB0aGlzLiNpc0xUUik7XG4gIH1cbn1cbmNsYXNzIEZyZWVIaWdobGlnaHRPdXRsaW5lIGV4dGVuZHMgT3V0bGluZSB7XG4gICNib3g7XG4gICNiYm94ID0gbnVsbDtcbiAgI2lubmVyTWFyZ2luO1xuICAjaXNMVFI7XG4gICNwb2ludHM7XG4gICNzY2FsZUZhY3RvcjtcbiAgI291dGxpbmU7XG4gIGNvbnN0cnVjdG9yKG91dGxpbmUsIHBvaW50cywgYm94LCBzY2FsZUZhY3RvciwgaW5uZXJNYXJnaW4sIGlzTFRSKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLiNvdXRsaW5lID0gb3V0bGluZTtcbiAgICB0aGlzLiNwb2ludHMgPSBwb2ludHM7XG4gICAgdGhpcy4jYm94ID0gYm94O1xuICAgIHRoaXMuI3NjYWxlRmFjdG9yID0gc2NhbGVGYWN0b3I7XG4gICAgdGhpcy4jaW5uZXJNYXJnaW4gPSBpbm5lck1hcmdpbjtcbiAgICB0aGlzLiNpc0xUUiA9IGlzTFRSO1xuICAgIHRoaXMuI2NvbXB1dGVNaW5NYXgoaXNMVFIpO1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gdGhpcy4jYmJveDtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBvdXRsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIG91dGxpbmVbaV0gPSAob3V0bGluZVtpXSAtIHgpIC8gd2lkdGg7XG4gICAgICBvdXRsaW5lW2kgKyAxXSA9IChvdXRsaW5lW2kgKyAxXSAtIHkpIC8gaGVpZ2h0O1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgcG9pbnRzW2ldID0gKHBvaW50c1tpXSAtIHgpIC8gd2lkdGg7XG4gICAgICBwb2ludHNbaSArIDFdID0gKHBvaW50c1tpICsgMV0gLSB5KSAvIGhlaWdodDtcbiAgICB9XG4gIH1cbiAgdG9TVkdQYXRoKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IFtgTSR7dGhpcy4jb3V0bGluZVs0XX0gJHt0aGlzLiNvdXRsaW5lWzVdfWBdO1xuICAgIGZvciAobGV0IGkgPSA2LCBpaSA9IHRoaXMuI291dGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNikge1xuICAgICAgaWYgKGlzTmFOKHRoaXMuI291dGxpbmVbaV0pKSB7XG4gICAgICAgIGJ1ZmZlci5wdXNoKGBMJHt0aGlzLiNvdXRsaW5lW2kgKyA0XX0gJHt0aGlzLiNvdXRsaW5lW2kgKyA1XX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBidWZmZXIucHVzaChgQyR7dGhpcy4jb3V0bGluZVtpXX0gJHt0aGlzLiNvdXRsaW5lW2kgKyAxXX0gJHt0aGlzLiNvdXRsaW5lW2kgKyAyXX0gJHt0aGlzLiNvdXRsaW5lW2kgKyAzXX0gJHt0aGlzLiNvdXRsaW5lW2kgKyA0XX0gJHt0aGlzLiNvdXRsaW5lW2kgKyA1XX1gKTtcbiAgICB9XG4gICAgYnVmZmVyLnB1c2goXCJaXCIpO1xuICAgIHJldHVybiBidWZmZXIuam9pbihcIiBcIik7XG4gIH1cbiAgc2VyaWFsaXplKFtibFgsIGJsWSwgdHJYLCB0clldLCByb3RhdGlvbikge1xuICAgIGNvbnN0IHdpZHRoID0gdHJYIC0gYmxYO1xuICAgIGNvbnN0IGhlaWdodCA9IHRyWSAtIGJsWTtcbiAgICBsZXQgb3V0bGluZTtcbiAgICBsZXQgcG9pbnRzO1xuICAgIHN3aXRjaCAocm90YXRpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgb3V0bGluZSA9IHRoaXMuI3Jlc2NhbGUodGhpcy4jb3V0bGluZSwgYmxYLCB0clksIHdpZHRoLCAtaGVpZ2h0KTtcbiAgICAgICAgcG9pbnRzID0gdGhpcy4jcmVzY2FsZSh0aGlzLiNwb2ludHMsIGJsWCwgdHJZLCB3aWR0aCwgLWhlaWdodCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgb3V0bGluZSA9IHRoaXMuI3Jlc2NhbGVBbmRTd2FwKHRoaXMuI291dGxpbmUsIGJsWCwgYmxZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgcG9pbnRzID0gdGhpcy4jcmVzY2FsZUFuZFN3YXAodGhpcy4jcG9pbnRzLCBibFgsIGJsWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIG91dGxpbmUgPSB0aGlzLiNyZXNjYWxlKHRoaXMuI291dGxpbmUsIHRyWCwgYmxZLCAtd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHBvaW50cyA9IHRoaXMuI3Jlc2NhbGUodGhpcy4jcG9pbnRzLCB0clgsIGJsWSwgLXdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICBvdXRsaW5lID0gdGhpcy4jcmVzY2FsZUFuZFN3YXAodGhpcy4jb3V0bGluZSwgdHJYLCB0clksIC13aWR0aCwgLWhlaWdodCk7XG4gICAgICAgIHBvaW50cyA9IHRoaXMuI3Jlc2NhbGVBbmRTd2FwKHRoaXMuI3BvaW50cywgdHJYLCB0clksIC13aWR0aCwgLWhlaWdodCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgb3V0bGluZTogQXJyYXkuZnJvbShvdXRsaW5lKSxcbiAgICAgIHBvaW50czogW0FycmF5LmZyb20ocG9pbnRzKV1cbiAgICB9O1xuICB9XG4gICNyZXNjYWxlKHNyYywgdHgsIHR5LCBzeCwgc3kpIHtcbiAgICBjb25zdCBkZXN0ID0gbmV3IEZsb2F0NjRBcnJheShzcmMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgZGVzdFtpXSA9IHR4ICsgc3JjW2ldICogc3g7XG4gICAgICBkZXN0W2kgKyAxXSA9IHR5ICsgc3JjW2kgKyAxXSAqIHN5O1xuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbiAgfVxuICAjcmVzY2FsZUFuZFN3YXAoc3JjLCB0eCwgdHksIHN4LCBzeSkge1xuICAgIGNvbnN0IGRlc3QgPSBuZXcgRmxvYXQ2NEFycmF5KHNyYy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBkZXN0W2ldID0gdHggKyBzcmNbaSArIDFdICogc3g7XG4gICAgICBkZXN0W2kgKyAxXSA9IHR5ICsgc3JjW2ldICogc3k7XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xuICB9XG4gICNjb21wdXRlTWluTWF4KGlzTFRSKSB7XG4gICAgY29uc3Qgb3V0bGluZSA9IHRoaXMuI291dGxpbmU7XG4gICAgbGV0IGxhc3RYID0gb3V0bGluZVs0XTtcbiAgICBsZXQgbGFzdFkgPSBvdXRsaW5lWzVdO1xuICAgIGxldCBtaW5YID0gbGFzdFg7XG4gICAgbGV0IG1pblkgPSBsYXN0WTtcbiAgICBsZXQgbWF4WCA9IGxhc3RYO1xuICAgIGxldCBtYXhZID0gbGFzdFk7XG4gICAgbGV0IGxhc3RQb2ludFggPSBsYXN0WDtcbiAgICBsZXQgbGFzdFBvaW50WSA9IGxhc3RZO1xuICAgIGNvbnN0IGx0ckNhbGxiYWNrID0gaXNMVFIgPyBNYXRoLm1heCA6IE1hdGgubWluO1xuICAgIGZvciAobGV0IGkgPSA2LCBpaSA9IG91dGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNikge1xuICAgICAgaWYgKGlzTmFOKG91dGxpbmVbaV0pKSB7XG4gICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBvdXRsaW5lW2kgKyA0XSk7XG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBvdXRsaW5lW2kgKyA1XSk7XG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBvdXRsaW5lW2kgKyA0XSk7XG4gICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBvdXRsaW5lW2kgKyA1XSk7XG4gICAgICAgIGlmIChsYXN0UG9pbnRZIDwgb3V0bGluZVtpICsgNV0pIHtcbiAgICAgICAgICBsYXN0UG9pbnRYID0gb3V0bGluZVtpICsgNF07XG4gICAgICAgICAgbGFzdFBvaW50WSA9IG91dGxpbmVbaSArIDVdO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3RQb2ludFkgPT09IG91dGxpbmVbaSArIDVdKSB7XG4gICAgICAgICAgbGFzdFBvaW50WCA9IGx0ckNhbGxiYWNrKGxhc3RQb2ludFgsIG91dGxpbmVbaSArIDRdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYmJveCA9IFV0aWwuYmV6aWVyQm91bmRpbmdCb3gobGFzdFgsIGxhc3RZLCAuLi5vdXRsaW5lLnNsaWNlKGksIGkgKyA2KSk7XG4gICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBiYm94WzBdKTtcbiAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIGJib3hbMV0pO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgYmJveFsyXSk7XG4gICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBiYm94WzNdKTtcbiAgICAgICAgaWYgKGxhc3RQb2ludFkgPCBiYm94WzNdKSB7XG4gICAgICAgICAgbGFzdFBvaW50WCA9IGJib3hbMl07XG4gICAgICAgICAgbGFzdFBvaW50WSA9IGJib3hbM107XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdFBvaW50WSA9PT0gYmJveFszXSkge1xuICAgICAgICAgIGxhc3RQb2ludFggPSBsdHJDYWxsYmFjayhsYXN0UG9pbnRYLCBiYm94WzJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGFzdFggPSBvdXRsaW5lW2kgKyA0XTtcbiAgICAgIGxhc3RZID0gb3V0bGluZVtpICsgNV07XG4gICAgfVxuICAgIGNvbnN0IHggPSBtaW5YIC0gdGhpcy4jaW5uZXJNYXJnaW4sXG4gICAgICB5ID0gbWluWSAtIHRoaXMuI2lubmVyTWFyZ2luLFxuICAgICAgd2lkdGggPSBtYXhYIC0gbWluWCArIDIgKiB0aGlzLiNpbm5lck1hcmdpbixcbiAgICAgIGhlaWdodCA9IG1heFkgLSBtaW5ZICsgMiAqIHRoaXMuI2lubmVyTWFyZ2luO1xuICAgIHRoaXMuI2Jib3ggPSB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgbGFzdFBvaW50OiBbbGFzdFBvaW50WCwgbGFzdFBvaW50WV1cbiAgICB9O1xuICB9XG4gIGdldCBib3goKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Jib3g7XG4gIH1cbiAgZ2V0TmV3T3V0bGluZSh0aGlja25lc3MsIGlubmVyTWFyZ2luKSB7XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSB0aGlzLiNiYm94O1xuICAgIGNvbnN0IFtsYXllclgsIGxheWVyWSwgbGF5ZXJXaWR0aCwgbGF5ZXJIZWlnaHRdID0gdGhpcy4jYm94O1xuICAgIGNvbnN0IHN4ID0gd2lkdGggKiBsYXllcldpZHRoO1xuICAgIGNvbnN0IHN5ID0gaGVpZ2h0ICogbGF5ZXJIZWlnaHQ7XG4gICAgY29uc3QgdHggPSB4ICogbGF5ZXJXaWR0aCArIGxheWVyWDtcbiAgICBjb25zdCB0eSA9IHkgKiBsYXllckhlaWdodCArIGxheWVyWTtcbiAgICBjb25zdCBvdXRsaW5lciA9IG5ldyBGcmVlT3V0bGluZXIoe1xuICAgICAgeDogdGhpcy4jcG9pbnRzWzBdICogc3ggKyB0eCxcbiAgICAgIHk6IHRoaXMuI3BvaW50c1sxXSAqIHN5ICsgdHlcbiAgICB9LCB0aGlzLiNib3gsIHRoaXMuI3NjYWxlRmFjdG9yLCB0aGlja25lc3MsIHRoaXMuI2lzTFRSLCBpbm5lck1hcmdpbiA/PyB0aGlzLiNpbm5lck1hcmdpbik7XG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCB0aGlzLiNwb2ludHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIG91dGxpbmVyLmFkZCh7XG4gICAgICAgIHg6IHRoaXMuI3BvaW50c1tpXSAqIHN4ICsgdHgsXG4gICAgICAgIHk6IHRoaXMuI3BvaW50c1tpICsgMV0gKiBzeSArIHR5XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dGxpbmVyLmdldE91dGxpbmVzKCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2NvbG9yX3BpY2tlci5qc1xuXG5cblxuY2xhc3MgQ29sb3JQaWNrZXIge1xuICAjYm91bmRLZXlEb3duID0gdGhpcy4ja2V5RG93bi5iaW5kKHRoaXMpO1xuICAjYm91bmRQb2ludGVyRG93biA9IHRoaXMuI3BvaW50ZXJEb3duLmJpbmQodGhpcyk7XG4gICNidXR0b24gPSBudWxsO1xuICAjYnV0dG9uU3dhdGNoID0gbnVsbDtcbiAgI2RlZmF1bHRDb2xvcjtcbiAgI2Ryb3Bkb3duID0gbnVsbDtcbiAgI2Ryb3Bkb3duV2FzRnJvbUtleWJvYXJkID0gZmFsc2U7XG4gICNpc01haW5Db2xvclBpY2tlciA9IGZhbHNlO1xuICAjZWRpdG9yID0gbnVsbDtcbiAgI2V2ZW50QnVzO1xuICAjdWlNYW5hZ2VyID0gbnVsbDtcbiAgI3R5cGU7XG4gIHN0YXRpYyBnZXQgX2tleWJvYXJkTWFuYWdlcigpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiRXNjYXBlXCIsIFwibWFjK0VzY2FwZVwiXSwgQ29sb3JQaWNrZXIucHJvdG90eXBlLl9oaWRlRHJvcGRvd25Gcm9tS2V5Ym9hcmRdLCBbW1wiIFwiLCBcIm1hYysgXCJdLCBDb2xvclBpY2tlci5wcm90b3R5cGUuX2NvbG9yU2VsZWN0RnJvbUtleWJvYXJkXSwgW1tcIkFycm93RG93blwiLCBcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dEb3duXCIsIFwibWFjK0Fycm93UmlnaHRcIl0sIENvbG9yUGlja2VyLnByb3RvdHlwZS5fbW92ZVRvTmV4dF0sIFtbXCJBcnJvd1VwXCIsIFwiQXJyb3dMZWZ0XCIsIFwibWFjK0Fycm93VXBcIiwgXCJtYWMrQXJyb3dMZWZ0XCJdLCBDb2xvclBpY2tlci5wcm90b3R5cGUuX21vdmVUb1ByZXZpb3VzXSwgW1tcIkhvbWVcIiwgXCJtYWMrSG9tZVwiXSwgQ29sb3JQaWNrZXIucHJvdG90eXBlLl9tb3ZlVG9CZWdpbm5pbmddLCBbW1wiRW5kXCIsIFwibWFjK0VuZFwiXSwgQ29sb3JQaWNrZXIucHJvdG90eXBlLl9tb3ZlVG9FbmRdXSkpO1xuICB9XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBlZGl0b3IgPSBudWxsLFxuICAgIHVpTWFuYWdlciA9IG51bGxcbiAgfSkge1xuICAgIGlmIChlZGl0b3IpIHtcbiAgICAgIHRoaXMuI2lzTWFpbkNvbG9yUGlja2VyID0gZmFsc2U7XG4gICAgICB0aGlzLiN0eXBlID0gQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0NPTE9SO1xuICAgICAgdGhpcy4jZWRpdG9yID0gZWRpdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNpc01haW5Db2xvclBpY2tlciA9IHRydWU7XG4gICAgICB0aGlzLiN0eXBlID0gQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0RFRkFVTFRfQ09MT1I7XG4gICAgfVxuICAgIHRoaXMuI3VpTWFuYWdlciA9IGVkaXRvcj8uX3VpTWFuYWdlciB8fCB1aU1hbmFnZXI7XG4gICAgdGhpcy4jZXZlbnRCdXMgPSB0aGlzLiN1aU1hbmFnZXIuX2V2ZW50QnVzO1xuICAgIHRoaXMuI2RlZmF1bHRDb2xvciA9IGVkaXRvcj8uY29sb3IgfHwgdGhpcy4jdWlNYW5hZ2VyPy5oaWdobGlnaHRDb2xvcnMudmFsdWVzKCkubmV4dCgpLnZhbHVlIHx8IFwiI0ZGRkY5OFwiO1xuICB9XG4gIHJlbmRlckJ1dHRvbigpIHtcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLiNidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbi5jbGFzc05hbWUgPSBcImNvbG9yUGlja2VyXCI7XG4gICAgYnV0dG9uLnRhYkluZGV4ID0gXCIwXCI7XG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLWVkaXRvci1jb2xvcnBpY2tlci1idXR0b25cIik7XG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIiwgdHJ1ZSk7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLiNvcGVuRHJvcGRvd24uYmluZCh0aGlzKSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5RG93biwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgY29uc3Qgc3dhdGNoID0gdGhpcy4jYnV0dG9uU3dhdGNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgc3dhdGNoLmNsYXNzTmFtZSA9IFwic3dhdGNoXCI7XG4gICAgc3dhdGNoLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIHRydWUpO1xuICAgIHN3YXRjaC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLiNkZWZhdWx0Q29sb3I7XG4gICAgYnV0dG9uLmFwcGVuZChzd2F0Y2gpO1xuICAgIHJldHVybiBidXR0b247XG4gIH1cbiAgcmVuZGVyTWFpbkRyb3Bkb3duKCkge1xuICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy4jZHJvcGRvd24gPSB0aGlzLiNnZXREcm9wZG93blJvb3QoKTtcbiAgICBkcm9wZG93bi5zZXRBdHRyaWJ1dGUoXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiaG9yaXpvbnRhbFwiKTtcbiAgICBkcm9wZG93bi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIiwgXCJoaWdobGlnaHRDb2xvclBpY2tlckxhYmVsXCIpO1xuICAgIHJldHVybiBkcm9wZG93bjtcbiAgfVxuICAjZ2V0RHJvcGRvd25Sb290KCkge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBkaXYuY2xhc3NOYW1lID0gXCJkcm9wZG93blwiO1xuICAgIGRpdi5yb2xlID0gXCJsaXN0Ym94XCI7XG4gICAgZGl2LnNldEF0dHJpYnV0ZShcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIGZhbHNlKTtcbiAgICBkaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1vcmllbnRhdGlvblwiLCBcInZlcnRpY2FsXCIpO1xuICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1lZGl0b3ItY29sb3JwaWNrZXItZHJvcGRvd25cIik7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgY29sb3JdIG9mIHRoaXMuI3VpTWFuYWdlci5oaWdobGlnaHRDb2xvcnMpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICBidXR0b24udGFiSW5kZXggPSBcIjBcIjtcbiAgICAgIGJ1dHRvbi5yb2xlID0gXCJvcHRpb25cIjtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbG9yXCIsIGNvbG9yKTtcbiAgICAgIGJ1dHRvbi50aXRsZSA9IG5hbWU7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIGBwZGZqcy1lZGl0b3ItY29sb3JwaWNrZXItJHtuYW1lfWApO1xuICAgICAgY29uc3Qgc3dhdGNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICBidXR0b24uYXBwZW5kKHN3YXRjaCk7XG4gICAgICBzd2F0Y2guY2xhc3NOYW1lID0gXCJzd2F0Y2hcIjtcbiAgICAgIHN3YXRjaC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIsIGNvbG9yID09PSB0aGlzLiNkZWZhdWx0Q29sb3IpO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLiNjb2xvclNlbGVjdC5iaW5kKHRoaXMsIGNvbG9yKSwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgICAgZGl2LmFwcGVuZChidXR0b24pO1xuICAgIH1cbiAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlEb3duLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICByZXR1cm4gZGl2O1xuICB9XG4gICNjb2xvclNlbGVjdChjb2xvciwgZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLiNldmVudEJ1cy5kaXNwYXRjaChcInN3aXRjaGFubm90YXRpb25lZGl0b3JwYXJhbXNcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgdHlwZTogdGhpcy4jdHlwZSxcbiAgICAgIHZhbHVlOiBjb2xvclxuICAgIH0pO1xuICB9XG4gIF9jb2xvclNlbGVjdEZyb21LZXlib2FyZChldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuI2J1dHRvbikge1xuICAgICAgdGhpcy4jb3BlbkRyb3Bkb3duKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29sb3IgPSBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1jb2xvclwiKTtcbiAgICBpZiAoIWNvbG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2NvbG9yU2VsZWN0KGNvbG9yLCBldmVudCk7XG4gIH1cbiAgX21vdmVUb05leHQoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuI2lzRHJvcGRvd25WaXNpYmxlKSB7XG4gICAgICB0aGlzLiNvcGVuRHJvcGRvd24oZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLiNidXR0b24pIHtcbiAgICAgIHRoaXMuI2Ryb3Bkb3duLmZpcnN0Q2hpbGQ/LmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnRhcmdldC5uZXh0U2libGluZz8uZm9jdXMoKTtcbiAgfVxuICBfbW92ZVRvUHJldmlvdXMoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLiNkcm9wZG93bj8uZmlyc3RDaGlsZCB8fCBldmVudC50YXJnZXQgPT09IHRoaXMuI2J1dHRvbikge1xuICAgICAgaWYgKHRoaXMuI2lzRHJvcGRvd25WaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuX2hpZGVEcm9wZG93bkZyb21LZXlib2FyZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2lzRHJvcGRvd25WaXNpYmxlKSB7XG4gICAgICB0aGlzLiNvcGVuRHJvcGRvd24oZXZlbnQpO1xuICAgIH1cbiAgICBldmVudC50YXJnZXQucHJldmlvdXNTaWJsaW5nPy5mb2N1cygpO1xuICB9XG4gIF9tb3ZlVG9CZWdpbm5pbmcoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuI2lzRHJvcGRvd25WaXNpYmxlKSB7XG4gICAgICB0aGlzLiNvcGVuRHJvcGRvd24oZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNkcm9wZG93bi5maXJzdENoaWxkPy5mb2N1cygpO1xuICB9XG4gIF9tb3ZlVG9FbmQoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuI2lzRHJvcGRvd25WaXNpYmxlKSB7XG4gICAgICB0aGlzLiNvcGVuRHJvcGRvd24oZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNkcm9wZG93bi5sYXN0Q2hpbGQ/LmZvY3VzKCk7XG4gIH1cbiAgI2tleURvd24oZXZlbnQpIHtcbiAgICBDb2xvclBpY2tlci5fa2V5Ym9hcmRNYW5hZ2VyLmV4ZWModGhpcywgZXZlbnQpO1xuICB9XG4gICNvcGVuRHJvcGRvd24oZXZlbnQpIHtcbiAgICBpZiAodGhpcy4jaXNEcm9wZG93blZpc2libGUpIHtcbiAgICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2Ryb3Bkb3duV2FzRnJvbUtleWJvYXJkID0gZXZlbnQuZGV0YWlsID09PSAwO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRQb2ludGVyRG93biwge1xuICAgICAgc2lnbmFsOiB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbFxuICAgIH0pO1xuICAgIGlmICh0aGlzLiNkcm9wZG93bikge1xuICAgICAgdGhpcy4jZHJvcGRvd24uY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuI2Ryb3Bkb3duID0gdGhpcy4jZ2V0RHJvcGRvd25Sb290KCk7XG4gICAgdGhpcy4jYnV0dG9uLmFwcGVuZChyb290KTtcbiAgfVxuICAjcG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICBpZiAodGhpcy4jZHJvcGRvd24/LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oaWRlRHJvcGRvd24oKTtcbiAgfVxuICBoaWRlRHJvcGRvd24oKSB7XG4gICAgdGhpcy4jZHJvcGRvd24/LmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZFBvaW50ZXJEb3duKTtcbiAgfVxuICBnZXQgI2lzRHJvcGRvd25WaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLiNkcm9wZG93biAmJiAhdGhpcy4jZHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKFwiaGlkZGVuXCIpO1xuICB9XG4gIF9oaWRlRHJvcGRvd25Gcm9tS2V5Ym9hcmQoKSB7XG4gICAgaWYgKHRoaXMuI2lzTWFpbkNvbG9yUGlja2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jaXNEcm9wZG93blZpc2libGUpIHtcbiAgICAgIHRoaXMuI2VkaXRvcj8udW5zZWxlY3QoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oaWRlRHJvcGRvd24oKTtcbiAgICB0aGlzLiNidXR0b24uZm9jdXMoe1xuICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZSxcbiAgICAgIGZvY3VzVmlzaWJsZTogdGhpcy4jZHJvcGRvd25XYXNGcm9tS2V5Ym9hcmRcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVDb2xvcihjb2xvcikge1xuICAgIGlmICh0aGlzLiNidXR0b25Td2F0Y2gpIHtcbiAgICAgIHRoaXMuI2J1dHRvblN3YXRjaC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNkcm9wZG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpID0gdGhpcy4jdWlNYW5hZ2VyLmhpZ2hsaWdodENvbG9ycy52YWx1ZXMoKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuI2Ryb3Bkb3duLmNoaWxkcmVuKSB7XG4gICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIsIGkubmV4dCgpLnZhbHVlID09PSBjb2xvcik7XG4gICAgfVxuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4jYnV0dG9uPy5yZW1vdmUoKTtcbiAgICB0aGlzLiNidXR0b24gPSBudWxsO1xuICAgIHRoaXMuI2J1dHRvblN3YXRjaCA9IG51bGw7XG4gICAgdGhpcy4jZHJvcGRvd24/LnJlbW92ZSgpO1xuICAgIHRoaXMuI2Ryb3Bkb3duID0gbnVsbDtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3IvaGlnaGxpZ2h0LmpzXG5cblxuXG5cblxuXG5jbGFzcyBIaWdobGlnaHRFZGl0b3IgZXh0ZW5kcyBBbm5vdGF0aW9uRWRpdG9yIHtcbiAgI2FuY2hvck5vZGUgPSBudWxsO1xuICAjYW5jaG9yT2Zmc2V0ID0gMDtcbiAgI2JveGVzO1xuICAjY2xpcFBhdGhJZCA9IG51bGw7XG4gICNjb2xvclBpY2tlciA9IG51bGw7XG4gICNmb2N1c091dGxpbmVzID0gbnVsbDtcbiAgI2ZvY3VzTm9kZSA9IG51bGw7XG4gICNmb2N1c09mZnNldCA9IDA7XG4gICNoaWdobGlnaHREaXYgPSBudWxsO1xuICAjaGlnaGxpZ2h0T3V0bGluZXMgPSBudWxsO1xuICAjaWQgPSBudWxsO1xuICAjaXNGcmVlSGlnaGxpZ2h0ID0gZmFsc2U7XG4gICNib3VuZEtleWRvd24gPSB0aGlzLiNrZXlkb3duLmJpbmQodGhpcyk7XG4gICNsYXN0UG9pbnQgPSBudWxsO1xuICAjb3BhY2l0eTtcbiAgI291dGxpbmVJZCA9IG51bGw7XG4gICN0ZXh0ID0gXCJcIjtcbiAgI3RoaWNrbmVzcztcbiAgI21ldGhvZE9mQ3JlYXRpb24gPSBcIlwiO1xuICBzdGF0aWMgX2RlZmF1bHRDb2xvciA9IG51bGw7XG4gIHN0YXRpYyBfZGVmYXVsdE9wYWNpdHkgPSAxO1xuICBzdGF0aWMgX2RlZmF1bHRUaGlja25lc3MgPSAxMjtcbiAgc3RhdGljIF9sMTBuUHJvbWlzZTtcbiAgc3RhdGljIF90eXBlID0gXCJoaWdobGlnaHRcIjtcbiAgc3RhdGljIF9lZGl0b3JUeXBlID0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUO1xuICBzdGF0aWMgX2ZyZWVIaWdobGlnaHRJZCA9IC0xO1xuICBzdGF0aWMgX2ZyZWVIaWdobGlnaHQgPSBudWxsO1xuICBzdGF0aWMgX2ZyZWVIaWdobGlnaHRDbGlwSWQgPSBcIlwiO1xuICBzdGF0aWMgZ2V0IF9rZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgY29uc3QgcHJvdG8gPSBIaWdobGlnaHRFZGl0b3IucHJvdG90eXBlO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfa2V5Ym9hcmRNYW5hZ2VyXCIsIG5ldyBLZXlib2FyZE1hbmFnZXIoW1tbXCJBcnJvd0xlZnRcIiwgXCJtYWMrQXJyb3dMZWZ0XCJdLCBwcm90by5fbW92ZUNhcmV0LCB7XG4gICAgICBhcmdzOiBbMF1cbiAgICB9XSwgW1tcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgcHJvdG8uX21vdmVDYXJldCwge1xuICAgICAgYXJnczogWzFdXG4gICAgfV0sIFtbXCJBcnJvd1VwXCIsIFwibWFjK0Fycm93VXBcIl0sIHByb3RvLl9tb3ZlQ2FyZXQsIHtcbiAgICAgIGFyZ3M6IFsyXVxuICAgIH1dLCBbW1wiQXJyb3dEb3duXCIsIFwibWFjK0Fycm93RG93blwiXSwgcHJvdG8uX21vdmVDYXJldCwge1xuICAgICAgYXJnczogWzNdXG4gICAgfV1dKSk7XG4gIH1cbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgbmFtZTogXCJoaWdobGlnaHRFZGl0b3JcIlxuICAgIH0pO1xuICAgIHRoaXMuY29sb3IgPSBwYXJhbXMuY29sb3IgfHwgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0Q29sb3I7XG4gICAgdGhpcy4jdGhpY2tuZXNzID0gcGFyYW1zLnRoaWNrbmVzcyB8fCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRUaGlja25lc3M7XG4gICAgdGhpcy4jb3BhY2l0eSA9IHBhcmFtcy5vcGFjaXR5IHx8IEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdE9wYWNpdHk7XG4gICAgdGhpcy4jYm94ZXMgPSBwYXJhbXMuYm94ZXMgfHwgbnVsbDtcbiAgICB0aGlzLiNtZXRob2RPZkNyZWF0aW9uID0gcGFyYW1zLm1ldGhvZE9mQ3JlYXRpb24gfHwgXCJcIjtcbiAgICB0aGlzLiN0ZXh0ID0gcGFyYW1zLnRleHQgfHwgXCJcIjtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIGlmIChwYXJhbXMuaGlnaGxpZ2h0SWQgPiAtMSkge1xuICAgICAgdGhpcy4jaXNGcmVlSGlnaGxpZ2h0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuI2NyZWF0ZUZyZWVPdXRsaW5lcyhwYXJhbXMpO1xuICAgICAgdGhpcy4jYWRkVG9EcmF3TGF5ZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jYW5jaG9yTm9kZSA9IHBhcmFtcy5hbmNob3JOb2RlO1xuICAgICAgdGhpcy4jYW5jaG9yT2Zmc2V0ID0gcGFyYW1zLmFuY2hvck9mZnNldDtcbiAgICAgIHRoaXMuI2ZvY3VzTm9kZSA9IHBhcmFtcy5mb2N1c05vZGU7XG4gICAgICB0aGlzLiNmb2N1c09mZnNldCA9IHBhcmFtcy5mb2N1c09mZnNldDtcbiAgICAgIHRoaXMuI2NyZWF0ZU91dGxpbmVzKCk7XG4gICAgICB0aGlzLiNhZGRUb0RyYXdMYXllcigpO1xuICAgICAgdGhpcy5yb3RhdGUodGhpcy5yb3RhdGlvbik7XG4gICAgfVxuICB9XG4gIGdldCB0ZWxlbWV0cnlJbml0aWFsRGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImFkZGVkXCIsXG4gICAgICB0eXBlOiB0aGlzLiNpc0ZyZWVIaWdobGlnaHQgPyBcImZyZWVfaGlnaGxpZ2h0XCIgOiBcImhpZ2hsaWdodFwiLFxuICAgICAgY29sb3I6IHRoaXMuX3VpTWFuYWdlci5oaWdobGlnaHRDb2xvck5hbWVzLmdldCh0aGlzLmNvbG9yKSxcbiAgICAgIHRoaWNrbmVzczogdGhpcy4jdGhpY2tuZXNzLFxuICAgICAgbWV0aG9kT2ZDcmVhdGlvbjogdGhpcy4jbWV0aG9kT2ZDcmVhdGlvblxuICAgIH07XG4gIH1cbiAgZ2V0IHRlbGVtZXRyeUZpbmFsRGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJoaWdobGlnaHRcIixcbiAgICAgIGNvbG9yOiB0aGlzLl91aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JOYW1lcy5nZXQodGhpcy5jb2xvcilcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb21wdXRlVGVsZW1ldHJ5RmluYWxEYXRhKGRhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbnVtYmVyT2ZDb2xvcnM6IGRhdGEuZ2V0KFwiY29sb3JcIikuc2l6ZVxuICAgIH07XG4gIH1cbiAgI2NyZWF0ZU91dGxpbmVzKCkge1xuICAgIGNvbnN0IG91dGxpbmVyID0gbmV3IE91dGxpbmVyKHRoaXMuI2JveGVzLCAwLjAwMSk7XG4gICAgdGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMgPSBvdXRsaW5lci5nZXRPdXRsaW5lcygpO1xuICAgICh7XG4gICAgICB4OiB0aGlzLngsXG4gICAgICB5OiB0aGlzLnksXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5oZWlnaHRcbiAgICB9ID0gdGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMuYm94KTtcbiAgICBjb25zdCBvdXRsaW5lckZvck91dGxpbmUgPSBuZXcgT3V0bGluZXIodGhpcy4jYm94ZXMsIDAuMDAyNSwgMC4wMDEsIHRoaXMuX3VpTWFuYWdlci5kaXJlY3Rpb24gPT09IFwibHRyXCIpO1xuICAgIHRoaXMuI2ZvY3VzT3V0bGluZXMgPSBvdXRsaW5lckZvck91dGxpbmUuZ2V0T3V0bGluZXMoKTtcbiAgICBjb25zdCB7XG4gICAgICBsYXN0UG9pbnRcbiAgICB9ID0gdGhpcy4jZm9jdXNPdXRsaW5lcy5ib3g7XG4gICAgdGhpcy4jbGFzdFBvaW50ID0gWyhsYXN0UG9pbnRbMF0gLSB0aGlzLngpIC8gdGhpcy53aWR0aCwgKGxhc3RQb2ludFsxXSAtIHRoaXMueSkgLyB0aGlzLmhlaWdodF07XG4gIH1cbiAgI2NyZWF0ZUZyZWVPdXRsaW5lcyh7XG4gICAgaGlnaGxpZ2h0T3V0bGluZXMsXG4gICAgaGlnaGxpZ2h0SWQsXG4gICAgY2xpcFBhdGhJZFxuICB9KSB7XG4gICAgdGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMgPSBoaWdobGlnaHRPdXRsaW5lcztcbiAgICBjb25zdCBleHRyYVRoaWNrbmVzcyA9IDEuNTtcbiAgICB0aGlzLiNmb2N1c091dGxpbmVzID0gaGlnaGxpZ2h0T3V0bGluZXMuZ2V0TmV3T3V0bGluZSh0aGlzLiN0aGlja25lc3MgLyAyICsgZXh0cmFUaGlja25lc3MsIDAuMDAyNSk7XG4gICAgaWYgKGhpZ2hsaWdodElkID49IDApIHtcbiAgICAgIHRoaXMuI2lkID0gaGlnaGxpZ2h0SWQ7XG4gICAgICB0aGlzLiNjbGlwUGF0aElkID0gY2xpcFBhdGhJZDtcbiAgICAgIHRoaXMucGFyZW50LmRyYXdMYXllci5maW5hbGl6ZUxpbmUoaGlnaGxpZ2h0SWQsIGhpZ2hsaWdodE91dGxpbmVzKTtcbiAgICAgIHRoaXMuI291dGxpbmVJZCA9IHRoaXMucGFyZW50LmRyYXdMYXllci5oaWdobGlnaHRPdXRsaW5lKHRoaXMuI2ZvY3VzT3V0bGluZXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5wYXJlbnQudmlld3BvcnQucm90YXRpb247XG4gICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIudXBkYXRlTGluZSh0aGlzLiNpZCwgaGlnaGxpZ2h0T3V0bGluZXMpO1xuICAgICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnVwZGF0ZUJveCh0aGlzLiNpZCwgSGlnaGxpZ2h0RWRpdG9yLiNyb3RhdGVCYm94KHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzLmJveCwgKGFuZ2xlIC0gdGhpcy5yb3RhdGlvbiArIDM2MCkgJSAzNjApKTtcbiAgICAgIHRoaXMucGFyZW50LmRyYXdMYXllci51cGRhdGVMaW5lKHRoaXMuI291dGxpbmVJZCwgdGhpcy4jZm9jdXNPdXRsaW5lcyk7XG4gICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIudXBkYXRlQm94KHRoaXMuI291dGxpbmVJZCwgSGlnaGxpZ2h0RWRpdG9yLiNyb3RhdGVCYm94KHRoaXMuI2ZvY3VzT3V0bGluZXMuYm94LCBhbmdsZSkpO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGhpZ2hsaWdodE91dGxpbmVzLmJveDtcbiAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgICAgdGhpcy54ID0geTtcbiAgICAgICAgICB0aGlzLnkgPSAxIC0geDtcbiAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggKiBwYWdlSGVpZ2h0IC8gcGFnZVdpZHRoO1xuICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0ICogcGFnZVdpZHRoIC8gcGFnZUhlaWdodDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHRoaXMueCA9IDEgLSB4O1xuICAgICAgICB0aGlzLnkgPSAxIC0geTtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIHRoaXMueCA9IDEgLSB5O1xuICAgICAgICAgIHRoaXMueSA9IHg7XG4gICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoICogcGFnZUhlaWdodCAvIHBhZ2VXaWR0aDtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAqIHBhZ2VXaWR0aCAvIHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgbGFzdFBvaW50XG4gICAgfSA9IHRoaXMuI2ZvY3VzT3V0bGluZXMuYm94O1xuICAgIHRoaXMuI2xhc3RQb2ludCA9IFsobGFzdFBvaW50WzBdIC0geCkgLyB3aWR0aCwgKGxhc3RQb2ludFsxXSAtIHkpIC8gaGVpZ2h0XTtcbiAgfVxuICBzdGF0aWMgaW5pdGlhbGl6ZShsMTBuLCB1aU1hbmFnZXIpIHtcbiAgICBBbm5vdGF0aW9uRWRpdG9yLmluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyKTtcbiAgICBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRDb2xvciB8fD0gdWlNYW5hZ2VyLmhpZ2hsaWdodENvbG9ycz8udmFsdWVzKCkubmV4dCgpLnZhbHVlIHx8IFwiI2ZmZjA2NlwiO1xuICB9XG4gIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9ERUZBVUxUX0NPTE9SOlxuICAgICAgICBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRDb2xvciA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX1RISUNLTkVTUzpcbiAgICAgICAgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB0cmFuc2xhdGVJblBhZ2UoeCwgeSkge31cbiAgZ2V0IHRvb2xiYXJQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jbGFzdFBvaW50O1xuICB9XG4gIHVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfQ09MT1I6XG4gICAgICAgIHRoaXMuI3VwZGF0ZUNvbG9yKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9USElDS05FU1M6XG4gICAgICAgIHRoaXMuI3VwZGF0ZVRoaWNrbmVzcyh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgcmV0dXJuIFtbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0RFRkFVTFRfQ09MT1IsIEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdENvbG9yXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9USElDS05FU1MsIEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdFRoaWNrbmVzc11dO1xuICB9XG4gIGdldCBwcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgcmV0dXJuIFtbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0NPTE9SLCB0aGlzLmNvbG9yIHx8IEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdENvbG9yXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9USElDS05FU1MsIHRoaXMuI3RoaWNrbmVzcyB8fCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0ZSRUUsIHRoaXMuI2lzRnJlZUhpZ2hsaWdodF1dO1xuICB9XG4gICN1cGRhdGVDb2xvcihjb2xvcikge1xuICAgIGNvbnN0IHNldENvbG9yID0gY29sID0+IHtcbiAgICAgIHRoaXMuY29sb3IgPSBjb2w7XG4gICAgICB0aGlzLnBhcmVudD8uZHJhd0xheWVyLmNoYW5nZUNvbG9yKHRoaXMuI2lkLCBjb2wpO1xuICAgICAgdGhpcy4jY29sb3JQaWNrZXI/LnVwZGF0ZUNvbG9yKGNvbCk7XG4gICAgfTtcbiAgICBjb25zdCBzYXZlZENvbG9yID0gdGhpcy5jb2xvcjtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogc2V0Q29sb3IuYmluZCh0aGlzLCBjb2xvciksXG4gICAgICB1bmRvOiBzZXRDb2xvci5iaW5kKHRoaXMsIHNhdmVkQ29sb3IpLFxuICAgICAgcG9zdDogdGhpcy5fdWlNYW5hZ2VyLnVwZGF0ZVVJLmJpbmQodGhpcy5fdWlNYW5hZ2VyLCB0aGlzKSxcbiAgICAgIG11c3RFeGVjOiB0cnVlLFxuICAgICAgdHlwZTogQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0NPTE9SLFxuICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogdHJ1ZSxcbiAgICAgIGtlZXBVbmRvOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5fcmVwb3J0VGVsZW1ldHJ5KHtcbiAgICAgIGFjdGlvbjogXCJjb2xvcl9jaGFuZ2VkXCIsXG4gICAgICBjb2xvcjogdGhpcy5fdWlNYW5hZ2VyLmhpZ2hsaWdodENvbG9yTmFtZXMuZ2V0KGNvbG9yKVxuICAgIH0sIHRydWUpO1xuICB9XG4gICN1cGRhdGVUaGlja25lc3ModGhpY2tuZXNzKSB7XG4gICAgY29uc3Qgc2F2ZWRUaGlja25lc3MgPSB0aGlzLiN0aGlja25lc3M7XG4gICAgY29uc3Qgc2V0VGhpY2tuZXNzID0gdGggPT4ge1xuICAgICAgdGhpcy4jdGhpY2tuZXNzID0gdGg7XG4gICAgICB0aGlzLiNjaGFuZ2VUaGlja25lc3ModGgpO1xuICAgIH07XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6IHNldFRoaWNrbmVzcy5iaW5kKHRoaXMsIHRoaWNrbmVzcyksXG4gICAgICB1bmRvOiBzZXRUaGlja25lc3MuYmluZCh0aGlzLCBzYXZlZFRoaWNrbmVzcyksXG4gICAgICBwb3N0OiB0aGlzLl91aU1hbmFnZXIudXBkYXRlVUkuYmluZCh0aGlzLl91aU1hbmFnZXIsIHRoaXMpLFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLFxuICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogdHJ1ZSxcbiAgICAgIGtlZXBVbmRvOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5fcmVwb3J0VGVsZW1ldHJ5KHtcbiAgICAgIGFjdGlvbjogXCJ0aGlja25lc3NfY2hhbmdlZFwiLFxuICAgICAgdGhpY2tuZXNzXG4gICAgfSwgdHJ1ZSk7XG4gIH1cbiAgYXN5bmMgYWRkRWRpdFRvb2xiYXIoKSB7XG4gICAgY29uc3QgdG9vbGJhciA9IGF3YWl0IHN1cGVyLmFkZEVkaXRUb29sYmFyKCk7XG4gICAgaWYgKCF0b29sYmFyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VpTWFuYWdlci5oaWdobGlnaHRDb2xvcnMpIHtcbiAgICAgIHRoaXMuI2NvbG9yUGlja2VyID0gbmV3IENvbG9yUGlja2VyKHtcbiAgICAgICAgZWRpdG9yOiB0aGlzXG4gICAgICB9KTtcbiAgICAgIHRvb2xiYXIuYWRkQ29sb3JQaWNrZXIodGhpcy4jY29sb3JQaWNrZXIpO1xuICAgIH1cbiAgICByZXR1cm4gdG9vbGJhcjtcbiAgfVxuICBkaXNhYmxlRWRpdGluZygpIHtcbiAgICBzdXBlci5kaXNhYmxlRWRpdGluZygpO1xuICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJkaXNhYmxlZFwiLCB0cnVlKTtcbiAgfVxuICBlbmFibGVFZGl0aW5nKCkge1xuICAgIHN1cGVyLmVuYWJsZUVkaXRpbmcoKTtcbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuICB9XG4gIGZpeEFuZFNldFBvc2l0aW9uKCkge1xuICAgIHJldHVybiBzdXBlci5maXhBbmRTZXRQb3NpdGlvbih0aGlzLiNnZXRSb3RhdGlvbigpKTtcbiAgfVxuICBnZXRCYXNlVHJhbnNsYXRpb24oKSB7XG4gICAgcmV0dXJuIFswLCAwXTtcbiAgfVxuICBnZXRSZWN0KHR4LCB0eSkge1xuICAgIHJldHVybiBzdXBlci5nZXRSZWN0KHR4LCB0eSwgdGhpcy4jZ2V0Um90YXRpb24oKSk7XG4gIH1cbiAgb25jZUFkZGVkKCkge1xuICAgIHRoaXMucGFyZW50LmFkZFVuZG9hYmxlRWRpdG9yKHRoaXMpO1xuICAgIHRoaXMuZGl2LmZvY3VzKCk7XG4gIH1cbiAgcmVtb3ZlKCkge1xuICAgIHRoaXMuI2NsZWFuRHJhd0xheWVyKCk7XG4gICAgdGhpcy5fcmVwb3J0VGVsZW1ldHJ5KHtcbiAgICAgIGFjdGlvbjogXCJkZWxldGVkXCJcbiAgICB9KTtcbiAgICBzdXBlci5yZW1vdmUoKTtcbiAgfVxuICByZWJ1aWxkKCkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIucmVidWlsZCgpO1xuICAgIGlmICh0aGlzLmRpdiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhZGRUb0RyYXdMYXllcigpO1xuICAgIGlmICghdGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHRoaXMucGFyZW50LmFkZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgc2V0UGFyZW50KHBhcmVudCkge1xuICAgIGxldCBtdXN0QmVTZWxlY3RlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnBhcmVudCAmJiAhcGFyZW50KSB7XG4gICAgICB0aGlzLiNjbGVhbkRyYXdMYXllcigpO1xuICAgIH0gZWxzZSBpZiAocGFyZW50KSB7XG4gICAgICB0aGlzLiNhZGRUb0RyYXdMYXllcihwYXJlbnQpO1xuICAgICAgbXVzdEJlU2VsZWN0ZWQgPSAhdGhpcy5wYXJlbnQgJiYgdGhpcy5kaXY/LmNsYXNzTGlzdC5jb250YWlucyhcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgIH1cbiAgICBzdXBlci5zZXRQYXJlbnQocGFyZW50KTtcbiAgICB0aGlzLnNob3codGhpcy5faXNWaXNpYmxlKTtcbiAgICBpZiAobXVzdEJlU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0KCk7XG4gICAgfVxuICB9XG4gICNjaGFuZ2VUaGlja25lc3ModGhpY2tuZXNzKSB7XG4gICAgaWYgKCF0aGlzLiNpc0ZyZWVIaWdobGlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jY3JlYXRlRnJlZU91dGxpbmVzKHtcbiAgICAgIGhpZ2hsaWdodE91dGxpbmVzOiB0aGlzLiNoaWdobGlnaHRPdXRsaW5lcy5nZXROZXdPdXRsaW5lKHRoaWNrbmVzcyAvIDIpXG4gICAgfSk7XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLnNldERpbXModGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gIH1cbiAgI2NsZWFuRHJhd0xheWVyKCkge1xuICAgIGlmICh0aGlzLiNpZCA9PT0gbnVsbCB8fCAhdGhpcy5wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnJlbW92ZSh0aGlzLiNpZCk7XG4gICAgdGhpcy4jaWQgPSBudWxsO1xuICAgIHRoaXMucGFyZW50LmRyYXdMYXllci5yZW1vdmUodGhpcy4jb3V0bGluZUlkKTtcbiAgICB0aGlzLiNvdXRsaW5lSWQgPSBudWxsO1xuICB9XG4gICNhZGRUb0RyYXdMYXllcihwYXJlbnQgPSB0aGlzLnBhcmVudCkge1xuICAgIGlmICh0aGlzLiNpZCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAoe1xuICAgICAgaWQ6IHRoaXMuI2lkLFxuICAgICAgY2xpcFBhdGhJZDogdGhpcy4jY2xpcFBhdGhJZFxuICAgIH0gPSBwYXJlbnQuZHJhd0xheWVyLmhpZ2hsaWdodCh0aGlzLiNoaWdobGlnaHRPdXRsaW5lcywgdGhpcy5jb2xvciwgdGhpcy4jb3BhY2l0eSkpO1xuICAgIHRoaXMuI291dGxpbmVJZCA9IHBhcmVudC5kcmF3TGF5ZXIuaGlnaGxpZ2h0T3V0bGluZSh0aGlzLiNmb2N1c091dGxpbmVzKTtcbiAgICBpZiAodGhpcy4jaGlnaGxpZ2h0RGl2KSB7XG4gICAgICB0aGlzLiNoaWdobGlnaHREaXYuc3R5bGUuY2xpcFBhdGggPSB0aGlzLiNjbGlwUGF0aElkO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgI3JvdGF0ZUJib3goe1xuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfSwgYW5nbGUpIHtcbiAgICBzd2l0Y2ggKGFuZ2xlKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IDEgLSB5IC0gaGVpZ2h0LFxuICAgICAgICAgIHk6IHgsXG4gICAgICAgICAgd2lkdGg6IGhlaWdodCxcbiAgICAgICAgICBoZWlnaHQ6IHdpZHRoXG4gICAgICAgIH07XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiAxIC0geCAtIHdpZHRoLFxuICAgICAgICAgIHk6IDEgLSB5IC0gaGVpZ2h0LFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodFxuICAgICAgICB9O1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogeSxcbiAgICAgICAgICB5OiAxIC0geCAtIHdpZHRoLFxuICAgICAgICAgIHdpZHRoOiBoZWlnaHQsXG4gICAgICAgICAgaGVpZ2h0OiB3aWR0aFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH07XG4gIH1cbiAgcm90YXRlKGFuZ2xlKSB7XG4gICAgY29uc3Qge1xuICAgICAgZHJhd0xheWVyXG4gICAgfSA9IHRoaXMucGFyZW50O1xuICAgIGxldCBib3g7XG4gICAgaWYgKHRoaXMuI2lzRnJlZUhpZ2hsaWdodCkge1xuICAgICAgYW5nbGUgPSAoYW5nbGUgLSB0aGlzLnJvdGF0aW9uICsgMzYwKSAlIDM2MDtcbiAgICAgIGJveCA9IEhpZ2hsaWdodEVkaXRvci4jcm90YXRlQmJveCh0aGlzLiNoaWdobGlnaHRPdXRsaW5lcy5ib3gsIGFuZ2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm94ID0gSGlnaGxpZ2h0RWRpdG9yLiNyb3RhdGVCYm94KHRoaXMsIGFuZ2xlKTtcbiAgICB9XG4gICAgZHJhd0xheWVyLnJvdGF0ZSh0aGlzLiNpZCwgYW5nbGUpO1xuICAgIGRyYXdMYXllci5yb3RhdGUodGhpcy4jb3V0bGluZUlkLCBhbmdsZSk7XG4gICAgZHJhd0xheWVyLnVwZGF0ZUJveCh0aGlzLiNpZCwgYm94KTtcbiAgICBkcmF3TGF5ZXIudXBkYXRlQm94KHRoaXMuI291dGxpbmVJZCwgSGlnaGxpZ2h0RWRpdG9yLiNyb3RhdGVCYm94KHRoaXMuI2ZvY3VzT3V0bGluZXMuYm94LCBhbmdsZSkpO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5kaXYpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpdjtcbiAgICB9XG4gICAgY29uc3QgZGl2ID0gc3VwZXIucmVuZGVyKCk7XG4gICAgaWYgKHRoaXMuI3RleHQpIHtcbiAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHRoaXMuI3RleHQpO1xuICAgICAgZGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJtYXJrXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jaXNGcmVlSGlnaGxpZ2h0KSB7XG4gICAgICBkaXYuY2xhc3NMaXN0LmFkZChcImZyZWVcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5ZG93biwge1xuICAgICAgICBzaWduYWw6IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaGlnaGxpZ2h0RGl2ID0gdGhpcy4jaGlnaGxpZ2h0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXYuYXBwZW5kKGhpZ2hsaWdodERpdik7XG4gICAgaGlnaGxpZ2h0RGl2LnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICBoaWdobGlnaHREaXYuY2xhc3NOYW1lID0gXCJpbnRlcm5hbFwiO1xuICAgIGhpZ2hsaWdodERpdi5zdHlsZS5jbGlwUGF0aCA9IHRoaXMuI2NsaXBQYXRoSWQ7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMuc2V0RGltcyh0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcbiAgICBiaW5kRXZlbnRzKHRoaXMsIHRoaXMuI2hpZ2hsaWdodERpdiwgW1wicG9pbnRlcm92ZXJcIiwgXCJwb2ludGVybGVhdmVcIl0pO1xuICAgIHRoaXMuZW5hYmxlRWRpdGluZygpO1xuICAgIHJldHVybiBkaXY7XG4gIH1cbiAgcG9pbnRlcm92ZXIoKSB7XG4gICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLmFkZENsYXNzKHRoaXMuI291dGxpbmVJZCwgXCJob3ZlcmVkXCIpO1xuICB9XG4gIHBvaW50ZXJsZWF2ZSgpIHtcbiAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIucmVtb3ZlQ2xhc3ModGhpcy4jb3V0bGluZUlkLCBcImhvdmVyZWRcIik7XG4gIH1cbiAgI2tleWRvd24oZXZlbnQpIHtcbiAgICBIaWdobGlnaHRFZGl0b3IuX2tleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIGV2ZW50KTtcbiAgfVxuICBfbW92ZUNhcmV0KGRpcmVjdGlvbikge1xuICAgIHRoaXMucGFyZW50LnVuc2VsZWN0KHRoaXMpO1xuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHRoaXMuI3NldENhcmV0KHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgdGhpcy4jc2V0Q2FyZXQoZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgI3NldENhcmV0KHN0YXJ0KSB7XG4gICAgaWYgKCF0aGlzLiNhbmNob3JOb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc3RhcnQpIHtcbiAgICAgIHNlbGVjdGlvbi5zZXRQb3NpdGlvbih0aGlzLiNhbmNob3JOb2RlLCB0aGlzLiNhbmNob3JPZmZzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3Rpb24uc2V0UG9zaXRpb24odGhpcy4jZm9jdXNOb2RlLCB0aGlzLiNmb2N1c09mZnNldCk7XG4gICAgfVxuICB9XG4gIHNlbGVjdCgpIHtcbiAgICBzdXBlci5zZWxlY3QoKTtcbiAgICBpZiAoIXRoaXMuI291dGxpbmVJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudD8uZHJhd0xheWVyLnJlbW92ZUNsYXNzKHRoaXMuI291dGxpbmVJZCwgXCJob3ZlcmVkXCIpO1xuICAgIHRoaXMucGFyZW50Py5kcmF3TGF5ZXIuYWRkQ2xhc3ModGhpcy4jb3V0bGluZUlkLCBcInNlbGVjdGVkXCIpO1xuICB9XG4gIHVuc2VsZWN0KCkge1xuICAgIHN1cGVyLnVuc2VsZWN0KCk7XG4gICAgaWYgKCF0aGlzLiNvdXRsaW5lSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQ/LmRyYXdMYXllci5yZW1vdmVDbGFzcyh0aGlzLiNvdXRsaW5lSWQsIFwic2VsZWN0ZWRcIik7XG4gICAgaWYgKCF0aGlzLiNpc0ZyZWVIaWdobGlnaHQpIHtcbiAgICAgIHRoaXMuI3NldENhcmV0KGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgZ2V0IF9tdXN0Rml4UG9zaXRpb24oKSB7XG4gICAgcmV0dXJuICF0aGlzLiNpc0ZyZWVIaWdobGlnaHQ7XG4gIH1cbiAgc2hvdyh2aXNpYmxlID0gdGhpcy5faXNWaXNpYmxlKSB7XG4gICAgc3VwZXIuc2hvdyh2aXNpYmxlKTtcbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50LmRyYXdMYXllci5zaG93KHRoaXMuI2lkLCB2aXNpYmxlKTtcbiAgICAgIHRoaXMucGFyZW50LmRyYXdMYXllci5zaG93KHRoaXMuI291dGxpbmVJZCwgdmlzaWJsZSk7XG4gICAgfVxuICB9XG4gICNnZXRSb3RhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jaXNGcmVlSGlnaGxpZ2h0ID8gdGhpcy5yb3RhdGlvbiA6IDA7XG4gIH1cbiAgI3NlcmlhbGl6ZUJveGVzKCkge1xuICAgIGlmICh0aGlzLiNpc0ZyZWVIaWdobGlnaHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgY29uc3QgYm94ZXMgPSB0aGlzLiNib3hlcztcbiAgICBjb25zdCBxdWFkUG9pbnRzID0gbmV3IEZsb2F0MzJBcnJheShib3hlcy5sZW5ndGggKiA4KTtcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yIChjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSBvZiBib3hlcykge1xuICAgICAgY29uc3Qgc3ggPSB4ICogcGFnZVdpZHRoO1xuICAgICAgY29uc3Qgc3kgPSAoMSAtIHkgLSBoZWlnaHQpICogcGFnZUhlaWdodDtcbiAgICAgIHF1YWRQb2ludHNbaV0gPSBxdWFkUG9pbnRzW2kgKyA0XSA9IHN4O1xuICAgICAgcXVhZFBvaW50c1tpICsgMV0gPSBxdWFkUG9pbnRzW2kgKyAzXSA9IHN5O1xuICAgICAgcXVhZFBvaW50c1tpICsgMl0gPSBxdWFkUG9pbnRzW2kgKyA2XSA9IHN4ICsgd2lkdGggKiBwYWdlV2lkdGg7XG4gICAgICBxdWFkUG9pbnRzW2kgKyA1XSA9IHF1YWRQb2ludHNbaSArIDddID0gc3kgKyBoZWlnaHQgKiBwYWdlSGVpZ2h0O1xuICAgICAgaSArPSA4O1xuICAgIH1cbiAgICByZXR1cm4gcXVhZFBvaW50cztcbiAgfVxuICAjc2VyaWFsaXplT3V0bGluZXMocmVjdCkge1xuICAgIHJldHVybiB0aGlzLiNoaWdobGlnaHRPdXRsaW5lcy5zZXJpYWxpemUocmVjdCwgdGhpcy4jZ2V0Um90YXRpb24oKSk7XG4gIH1cbiAgc3RhdGljIHN0YXJ0SGlnaGxpZ2h0aW5nKHBhcmVudCwgaXNMVFIsIHtcbiAgICB0YXJnZXQ6IHRleHRMYXllcixcbiAgICB4LFxuICAgIHlcbiAgfSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHg6IGxheWVyWCxcbiAgICAgIHk6IGxheWVyWSxcbiAgICAgIHdpZHRoOiBwYXJlbnRXaWR0aCxcbiAgICAgIGhlaWdodDogcGFyZW50SGVpZ2h0XG4gICAgfSA9IHRleHRMYXllci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwb2ludGVyTW92ZSA9IGUgPT4ge1xuICAgICAgdGhpcy4jaGlnaGxpZ2h0TW92ZShwYXJlbnQsIGUpO1xuICAgIH07XG4gICAgY29uc3Qgc2lnbmFsID0gcGFyZW50Ll9zaWduYWw7XG4gICAgY29uc3QgcG9pbnRlckRvd25PcHRpb25zID0ge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgc2lnbmFsXG4gICAgfTtcbiAgICBjb25zdCBwb2ludGVyRG93biA9IGUgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIGNvbnN0IHBvaW50ZXJVcENhbGxiYWNrID0gZSA9PiB7XG4gICAgICB0ZXh0TGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHBvaW50ZXJNb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVyVXBDYWxsYmFjayk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBwb2ludGVyVXBDYWxsYmFjayk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHBvaW50ZXJEb3duLCBwb2ludGVyRG93bk9wdGlvbnMpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51KTtcbiAgICAgIHRoaXMuI2VuZEhpZ2hsaWdodChwYXJlbnQsIGUpO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJVcENhbGxiYWNrLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBwb2ludGVyVXBDYWxsYmFjaywge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBwb2ludGVyRG93biwgcG9pbnRlckRvd25PcHRpb25zKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRleHRMYXllci5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgcG9pbnRlck1vdmUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuX2ZyZWVIaWdobGlnaHQgPSBuZXcgRnJlZU91dGxpbmVyKHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSwgW2xheWVyWCwgbGF5ZXJZLCBwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSwgcGFyZW50LnNjYWxlLCB0aGlzLl9kZWZhdWx0VGhpY2tuZXNzIC8gMiwgaXNMVFIsIDAuMDAxKTtcbiAgICAoe1xuICAgICAgaWQ6IHRoaXMuX2ZyZWVIaWdobGlnaHRJZCxcbiAgICAgIGNsaXBQYXRoSWQ6IHRoaXMuX2ZyZWVIaWdobGlnaHRDbGlwSWRcbiAgICB9ID0gcGFyZW50LmRyYXdMYXllci5oaWdobGlnaHQodGhpcy5fZnJlZUhpZ2hsaWdodCwgdGhpcy5fZGVmYXVsdENvbG9yLCB0aGlzLl9kZWZhdWx0T3BhY2l0eSwgdHJ1ZSkpO1xuICB9XG4gIHN0YXRpYyAjaGlnaGxpZ2h0TW92ZShwYXJlbnQsIGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuX2ZyZWVIaWdobGlnaHQuYWRkKGV2ZW50KSkge1xuICAgICAgcGFyZW50LmRyYXdMYXllci51cGRhdGVQYXRoKHRoaXMuX2ZyZWVIaWdobGlnaHRJZCwgdGhpcy5fZnJlZUhpZ2hsaWdodCk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyAjZW5kSGlnaGxpZ2h0KHBhcmVudCwgZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2ZyZWVIaWdobGlnaHQuaXNFbXB0eSgpKSB7XG4gICAgICBwYXJlbnQuY3JlYXRlQW5kQWRkTmV3RWRpdG9yKGV2ZW50LCBmYWxzZSwge1xuICAgICAgICBoaWdobGlnaHRJZDogdGhpcy5fZnJlZUhpZ2hsaWdodElkLFxuICAgICAgICBoaWdobGlnaHRPdXRsaW5lczogdGhpcy5fZnJlZUhpZ2hsaWdodC5nZXRPdXRsaW5lcygpLFxuICAgICAgICBjbGlwUGF0aElkOiB0aGlzLl9mcmVlSGlnaGxpZ2h0Q2xpcElkLFxuICAgICAgICBtZXRob2RPZkNyZWF0aW9uOiBcIm1haW5fdG9vbGJhclwiXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50LmRyYXdMYXllci5yZW1vdmVGcmVlSGlnaGxpZ2h0KHRoaXMuX2ZyZWVIaWdobGlnaHRJZCk7XG4gICAgfVxuICAgIHRoaXMuX2ZyZWVIaWdobGlnaHRJZCA9IC0xO1xuICAgIHRoaXMuX2ZyZWVIaWdobGlnaHQgPSBudWxsO1xuICAgIHRoaXMuX2ZyZWVIaWdobGlnaHRDbGlwSWQgPSBcIlwiO1xuICB9XG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcikge1xuICAgIGNvbnN0IGVkaXRvciA9IHN1cGVyLmRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKTtcbiAgICBjb25zdCB7XG4gICAgICByZWN0OiBbYmxYLCBibFksIHRyWCwgdHJZXSxcbiAgICAgIGNvbG9yLFxuICAgICAgcXVhZFBvaW50c1xuICAgIH0gPSBkYXRhO1xuICAgIGVkaXRvci5jb2xvciA9IFV0aWwubWFrZUhleENvbG9yKC4uLmNvbG9yKTtcbiAgICBlZGl0b3IuI29wYWNpdHkgPSBkYXRhLm9wYWNpdHk7XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSBlZGl0b3IucGFnZURpbWVuc2lvbnM7XG4gICAgZWRpdG9yLndpZHRoID0gKHRyWCAtIGJsWCkgLyBwYWdlV2lkdGg7XG4gICAgZWRpdG9yLmhlaWdodCA9ICh0clkgLSBibFkpIC8gcGFnZUhlaWdodDtcbiAgICBjb25zdCBib3hlcyA9IGVkaXRvci4jYm94ZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YWRQb2ludHMubGVuZ3RoOyBpICs9IDgpIHtcbiAgICAgIGJveGVzLnB1c2goe1xuICAgICAgICB4OiAocXVhZFBvaW50c1s0XSAtIHRyWCkgLyBwYWdlV2lkdGgsXG4gICAgICAgIHk6ICh0clkgLSAoMSAtIHF1YWRQb2ludHNbaSArIDVdKSkgLyBwYWdlSGVpZ2h0LFxuICAgICAgICB3aWR0aDogKHF1YWRQb2ludHNbaSArIDJdIC0gcXVhZFBvaW50c1tpXSkgLyBwYWdlV2lkdGgsXG4gICAgICAgIGhlaWdodDogKHF1YWRQb2ludHNbaSArIDVdIC0gcXVhZFBvaW50c1tpICsgMV0pIC8gcGFnZUhlaWdodFxuICAgICAgfSk7XG4gICAgfVxuICAgIGVkaXRvci4jY3JlYXRlT3V0bGluZXMoKTtcbiAgICByZXR1cm4gZWRpdG9yO1xuICB9XG4gIHNlcmlhbGl6ZShpc0ZvckNvcHlpbmcgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSB8fCBpc0ZvckNvcHlpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRSZWN0KDAsIDApO1xuICAgIGNvbnN0IGNvbG9yID0gQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5jb2xvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFubm90YXRpb25UeXBlOiBBbm5vdGF0aW9uRWRpdG9yVHlwZS5ISUdITElHSFQsXG4gICAgICBjb2xvcixcbiAgICAgIG9wYWNpdHk6IHRoaXMuI29wYWNpdHksXG4gICAgICB0aGlja25lc3M6IHRoaXMuI3RoaWNrbmVzcyxcbiAgICAgIHF1YWRQb2ludHM6IHRoaXMuI3NlcmlhbGl6ZUJveGVzKCksXG4gICAgICBvdXRsaW5lczogdGhpcy4jc2VyaWFsaXplT3V0bGluZXMocmVjdCksXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcmVjdCxcbiAgICAgIHJvdGF0aW9uOiB0aGlzLiNnZXRSb3RhdGlvbigpLFxuICAgICAgc3RydWN0VHJlZVBhcmVudElkOiB0aGlzLl9zdHJ1Y3RUcmVlUGFyZW50SWRcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjYW5DcmVhdGVOZXdFbXB0eUVkaXRvcigpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2luay5qc1xuXG5cblxuXG5cbmNsYXNzIElua0VkaXRvciBleHRlbmRzIEFubm90YXRpb25FZGl0b3Ige1xuICAjYmFzZUhlaWdodCA9IDA7XG4gICNiYXNlV2lkdGggPSAwO1xuICAjYm91bmRDYW52YXNQb2ludGVybW92ZSA9IHRoaXMuY2FudmFzUG9pbnRlcm1vdmUuYmluZCh0aGlzKTtcbiAgI2JvdW5kQ2FudmFzUG9pbnRlcmxlYXZlID0gdGhpcy5jYW52YXNQb2ludGVybGVhdmUuYmluZCh0aGlzKTtcbiAgI2JvdW5kQ2FudmFzUG9pbnRlcnVwID0gdGhpcy5jYW52YXNQb2ludGVydXAuYmluZCh0aGlzKTtcbiAgI2JvdW5kQ2FudmFzUG9pbnRlcmRvd24gPSB0aGlzLmNhbnZhc1BvaW50ZXJkb3duLmJpbmQodGhpcyk7XG4gICNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCA9IG51bGw7XG4gICNjdXJyZW50UGF0aDJEID0gbmV3IFBhdGgyRCgpO1xuICAjZGlzYWJsZUVkaXRpbmcgPSBmYWxzZTtcbiAgI2hhc1NvbWV0aGluZ1RvRHJhdyA9IGZhbHNlO1xuICAjaXNDYW52YXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAjb2JzZXJ2ZXIgPSBudWxsO1xuICAjcmVhbFdpZHRoID0gMDtcbiAgI3JlYWxIZWlnaHQgPSAwO1xuICAjcmVxdWVzdEZyYW1lQ2FsbGJhY2sgPSBudWxsO1xuICBzdGF0aWMgX2RlZmF1bHRDb2xvciA9IG51bGw7XG4gIHN0YXRpYyBfZGVmYXVsdE9wYWNpdHkgPSAxO1xuICBzdGF0aWMgX2RlZmF1bHRUaGlja25lc3MgPSAxO1xuICBzdGF0aWMgX3R5cGUgPSBcImlua1wiO1xuICBzdGF0aWMgX2VkaXRvclR5cGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIG5hbWU6IFwiaW5rRWRpdG9yXCJcbiAgICB9KTtcbiAgICB0aGlzLmNvbG9yID0gcGFyYW1zLmNvbG9yIHx8IG51bGw7XG4gICAgdGhpcy50aGlja25lc3MgPSBwYXJhbXMudGhpY2tuZXNzIHx8IG51bGw7XG4gICAgdGhpcy5vcGFjaXR5ID0gcGFyYW1zLm9wYWNpdHkgfHwgbnVsbDtcbiAgICB0aGlzLnBhdGhzID0gW107XG4gICAgdGhpcy5iZXppZXJQYXRoMkQgPSBbXTtcbiAgICB0aGlzLmFsbFJhd1BhdGhzID0gW107XG4gICAgdGhpcy5jdXJyZW50UGF0aCA9IFtdO1xuICAgIHRoaXMuc2NhbGVGYWN0b3IgPSAxO1xuICAgIHRoaXMudHJhbnNsYXRpb25YID0gdGhpcy50cmFuc2xhdGlvblkgPSAwO1xuICAgIHRoaXMueCA9IDA7XG4gICAgdGhpcy55ID0gMDtcbiAgICB0aGlzLl93aWxsS2VlcEFzcGVjdFJhdGlvID0gdHJ1ZTtcbiAgfVxuICBzdGF0aWMgaW5pdGlhbGl6ZShsMTBuLCB1aU1hbmFnZXIpIHtcbiAgICBBbm5vdGF0aW9uRWRpdG9yLmluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyKTtcbiAgfVxuICBzdGF0aWMgdXBkYXRlRGVmYXVsdFBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTOlxuICAgICAgICBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3MgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUjpcbiAgICAgICAgSW5rRWRpdG9yLl9kZWZhdWx0Q29sb3IgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZOlxuICAgICAgICBJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5ID0gdmFsdWUgLyAxMDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX1RISUNLTkVTUzpcbiAgICAgICAgdGhpcy4jdXBkYXRlVGhpY2tuZXNzKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUjpcbiAgICAgICAgdGhpcy4jdXBkYXRlQ29sb3IodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFk6XG4gICAgICAgIHRoaXMuI3VwZGF0ZU9wYWNpdHkodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgc3RhdGljIGdldCBkZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1MsIElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzc10sIFtBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1IsIElua0VkaXRvci5fZGVmYXVsdENvbG9yIHx8IEFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFksIE1hdGgucm91bmQoSW5rRWRpdG9yLl9kZWZhdWx0T3BhY2l0eSAqIDEwMCldXTtcbiAgfVxuICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1MsIHRoaXMudGhpY2tuZXNzIHx8IElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzc10sIFtBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1IsIHRoaXMuY29sb3IgfHwgSW5rRWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcl0sIFtBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWSwgTWF0aC5yb3VuZCgxMDAgKiAodGhpcy5vcGFjaXR5ID8/IElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkpKV1dO1xuICB9XG4gICN1cGRhdGVUaGlja25lc3ModGhpY2tuZXNzKSB7XG4gICAgY29uc3Qgc2V0VGhpY2tuZXNzID0gdGggPT4ge1xuICAgICAgdGhpcy50aGlja25lc3MgPSB0aDtcbiAgICAgIHRoaXMuI2ZpdFRvQ29udGVudCgpO1xuICAgIH07XG4gICAgY29uc3Qgc2F2ZWRUaGlja25lc3MgPSB0aGlzLnRoaWNrbmVzcztcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogc2V0VGhpY2tuZXNzLmJpbmQodGhpcywgdGhpY2tuZXNzKSxcbiAgICAgIHVuZG86IHNldFRoaWNrbmVzcy5iaW5kKHRoaXMsIHNhdmVkVGhpY2tuZXNzKSxcbiAgICAgIHBvc3Q6IHRoaXMuX3VpTWFuYWdlci51cGRhdGVVSS5iaW5kKHRoaXMuX3VpTWFuYWdlciwgdGhpcyksXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1MsXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgfVxuICAjdXBkYXRlQ29sb3IoY29sb3IpIHtcbiAgICBjb25zdCBzZXRDb2xvciA9IGNvbCA9PiB7XG4gICAgICB0aGlzLmNvbG9yID0gY29sO1xuICAgICAgdGhpcy4jcmVkcmF3KCk7XG4gICAgfTtcbiAgICBjb25zdCBzYXZlZENvbG9yID0gdGhpcy5jb2xvcjtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogc2V0Q29sb3IuYmluZCh0aGlzLCBjb2xvciksXG4gICAgICB1bmRvOiBzZXRDb2xvci5iaW5kKHRoaXMsIHNhdmVkQ29sb3IpLFxuICAgICAgcG9zdDogdGhpcy5fdWlNYW5hZ2VyLnVwZGF0ZVVJLmJpbmQodGhpcy5fdWlNYW5hZ2VyLCB0aGlzKSxcbiAgICAgIG11c3RFeGVjOiB0cnVlLFxuICAgICAgdHlwZTogQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SLFxuICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogdHJ1ZSxcbiAgICAgIGtlZXBVbmRvOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgI3VwZGF0ZU9wYWNpdHkob3BhY2l0eSkge1xuICAgIGNvbnN0IHNldE9wYWNpdHkgPSBvcCA9PiB7XG4gICAgICB0aGlzLm9wYWNpdHkgPSBvcDtcbiAgICAgIHRoaXMuI3JlZHJhdygpO1xuICAgIH07XG4gICAgb3BhY2l0eSAvPSAxMDA7XG4gICAgY29uc3Qgc2F2ZWRPcGFjaXR5ID0gdGhpcy5vcGFjaXR5O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiBzZXRPcGFjaXR5LmJpbmQodGhpcywgb3BhY2l0eSksXG4gICAgICB1bmRvOiBzZXRPcGFjaXR5LmJpbmQodGhpcywgc2F2ZWRPcGFjaXR5KSxcbiAgICAgIHBvc3Q6IHRoaXMuX3VpTWFuYWdlci51cGRhdGVVSS5iaW5kKHRoaXMuX3VpTWFuYWdlciwgdGhpcyksXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZLFxuICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogdHJ1ZSxcbiAgICAgIGtlZXBVbmRvOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVidWlsZCgpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLnJlYnVpbGQoKTtcbiAgICBpZiAodGhpcy5kaXYgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgdGhpcy4jY3JlYXRlQ2FudmFzKCk7XG4gICAgICB0aGlzLiNjcmVhdGVPYnNlcnZlcigpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG4gICAgICB0aGlzLiNzZXRDYW52YXNEaW1zKCk7XG4gICAgfVxuICAgIHRoaXMuI2ZpdFRvQ29udGVudCgpO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICBpZiAodGhpcy5jYW52YXMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgdGhpcy5jb21taXQoKTtcbiAgICB9XG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5oZWlnaHQgPSAwO1xuICAgIHRoaXMuY2FudmFzLnJlbW92ZSgpO1xuICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICBpZiAodGhpcy4jY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCk7XG4gICAgICB0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuI29ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy4jb2JzZXJ2ZXIgPSBudWxsO1xuICAgIHN1cGVyLnJlbW92ZSgpO1xuICB9XG4gIHNldFBhcmVudChwYXJlbnQpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50ICYmIHBhcmVudCkge1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLnJlbW92ZVNob3VsZFJlc2NhbGUodGhpcyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBhcmVudCAmJiBwYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5hZGRTaG91bGRSZXNjYWxlKHRoaXMpO1xuICAgIH1cbiAgICBzdXBlci5zZXRQYXJlbnQocGFyZW50KTtcbiAgfVxuICBvblNjYWxlQ2hhbmdpbmcoKSB7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aCAqIHBhcmVudFdpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0O1xuICAgIHRoaXMuc2V0RGltZW5zaW9ucyh3aWR0aCwgaGVpZ2h0KTtcbiAgfVxuICBlbmFibGVFZGl0TW9kZSgpIHtcbiAgICBpZiAodGhpcy4jZGlzYWJsZUVkaXRpbmcgfHwgdGhpcy5jYW52YXMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJkb3duLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgZGlzYWJsZUVkaXRNb2RlKCkge1xuICAgIGlmICghdGhpcy5pc0luRWRpdE1vZGUoKSB8fCB0aGlzLmNhbnZhcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9ICF0aGlzLmlzRW1wdHkoKTtcbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QucmVtb3ZlKFwiZWRpdGluZ1wiKTtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVyZG93bik7XG4gIH1cbiAgb25jZUFkZGVkKCkge1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gIXRoaXMuaXNFbXB0eSgpO1xuICB9XG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aHMubGVuZ3RoID09PSAwIHx8IHRoaXMucGF0aHMubGVuZ3RoID09PSAxICYmIHRoaXMucGF0aHNbMF0ubGVuZ3RoID09PSAwO1xuICB9XG4gICNnZXRJbml0aWFsQkJveCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBwYXJlbnRSb3RhdGlvbixcbiAgICAgIHBhcmVudERpbWVuc2lvbnM6IFt3aWR0aCwgaGVpZ2h0XVxuICAgIH0gPSB0aGlzO1xuICAgIHN3aXRjaCAocGFyZW50Um90YXRpb24pIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJldHVybiBbMCwgaGVpZ2h0LCBoZWlnaHQsIHdpZHRoXTtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByZXR1cm4gW3dpZHRoLCBoZWlnaHQsIHdpZHRoLCBoZWlnaHRdO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJldHVybiBbd2lkdGgsIDAsIGhlaWdodCwgd2lkdGhdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFswLCAwLCB3aWR0aCwgaGVpZ2h0XTtcbiAgICB9XG4gIH1cbiAgI3NldFN0cm9rZSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBjdHgsXG4gICAgICBjb2xvcixcbiAgICAgIG9wYWNpdHksXG4gICAgICB0aGlja25lc3MsXG4gICAgICBwYXJlbnRTY2FsZSxcbiAgICAgIHNjYWxlRmFjdG9yXG4gICAgfSA9IHRoaXM7XG4gICAgY3R4LmxpbmVXaWR0aCA9IHRoaWNrbmVzcyAqIHBhcmVudFNjYWxlIC8gc2NhbGVGYWN0b3I7XG4gICAgY3R4LmxpbmVDYXAgPSBcInJvdW5kXCI7XG4gICAgY3R4LmxpbmVKb2luID0gXCJyb3VuZFwiO1xuICAgIGN0eC5taXRlckxpbWl0ID0gMTA7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gYCR7Y29sb3J9JHtvcGFjaXR5VG9IZXgob3BhY2l0eSl9YDtcbiAgfVxuICAjc3RhcnREcmF3aW5nKHgsIHkpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJsZWF2ZVwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJsZWF2ZSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcm1vdmUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVydXAsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJkb3duKTtcbiAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgaWYgKCF0aGlzLiNpc0NhbnZhc0luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLiNpc0NhbnZhc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcbiAgICAgIHRoaXMudGhpY2tuZXNzIHx8PSBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3M7XG4gICAgICB0aGlzLmNvbG9yIHx8PSBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBBbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yO1xuICAgICAgdGhpcy5vcGFjaXR5ID8/PSBJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5O1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQYXRoLnB1c2goW3gsIHldKTtcbiAgICB0aGlzLiNoYXNTb21ldGhpbmdUb0RyYXcgPSBmYWxzZTtcbiAgICB0aGlzLiNzZXRTdHJva2UoKTtcbiAgICB0aGlzLiNyZXF1ZXN0RnJhbWVDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMuI2RyYXdQb2ludHMoKTtcbiAgICAgIGlmICh0aGlzLiNyZXF1ZXN0RnJhbWVDYWxsYmFjaykge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuI3JlcXVlc3RGcmFtZUNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2spO1xuICB9XG4gICNkcmF3KHgsIHkpIHtcbiAgICBjb25zdCBbbGFzdFgsIGxhc3RZXSA9IHRoaXMuY3VycmVudFBhdGguYXQoLTEpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCA+IDEgJiYgeCA9PT0gbGFzdFggJiYgeSA9PT0gbGFzdFkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFBhdGggPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgIGxldCBwYXRoMkQgPSB0aGlzLiNjdXJyZW50UGF0aDJEO1xuICAgIGN1cnJlbnRQYXRoLnB1c2goW3gsIHldKTtcbiAgICB0aGlzLiNoYXNTb21ldGhpbmdUb0RyYXcgPSB0cnVlO1xuICAgIGlmIChjdXJyZW50UGF0aC5sZW5ndGggPD0gMikge1xuICAgICAgcGF0aDJELm1vdmVUbyguLi5jdXJyZW50UGF0aFswXSk7XG4gICAgICBwYXRoMkQubGluZVRvKHgsIHkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY3VycmVudFBhdGgubGVuZ3RoID09PSAzKSB7XG4gICAgICB0aGlzLiNjdXJyZW50UGF0aDJEID0gcGF0aDJEID0gbmV3IFBhdGgyRCgpO1xuICAgICAgcGF0aDJELm1vdmVUbyguLi5jdXJyZW50UGF0aFswXSk7XG4gICAgfVxuICAgIHRoaXMuI21ha2VCZXppZXJDdXJ2ZShwYXRoMkQsIC4uLmN1cnJlbnRQYXRoLmF0KC0zKSwgLi4uY3VycmVudFBhdGguYXQoLTIpLCB4LCB5KTtcbiAgfVxuICAjZW5kUGF0aCgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGFzdFBvaW50ID0gdGhpcy5jdXJyZW50UGF0aC5hdCgtMSk7XG4gICAgdGhpcy4jY3VycmVudFBhdGgyRC5saW5lVG8oLi4ubGFzdFBvaW50KTtcbiAgfVxuICAjc3RvcERyYXdpbmcoeCwgeSkge1xuICAgIHRoaXMuI3JlcXVlc3RGcmFtZUNhbGxiYWNrID0gbnVsbDtcbiAgICB4ID0gTWF0aC5taW4oTWF0aC5tYXgoeCwgMCksIHRoaXMuY2FudmFzLndpZHRoKTtcbiAgICB5ID0gTWF0aC5taW4oTWF0aC5tYXgoeSwgMCksIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy4jZHJhdyh4LCB5KTtcbiAgICB0aGlzLiNlbmRQYXRoKCk7XG4gICAgbGV0IGJlemllcjtcbiAgICBpZiAodGhpcy5jdXJyZW50UGF0aC5sZW5ndGggIT09IDEpIHtcbiAgICAgIGJlemllciA9IHRoaXMuI2dlbmVyYXRlQmV6aWVyUG9pbnRzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHh5ID0gW3gsIHldO1xuICAgICAgYmV6aWVyID0gW1t4eSwgeHkuc2xpY2UoKSwgeHkuc2xpY2UoKSwgeHldXTtcbiAgICB9XG4gICAgY29uc3QgcGF0aDJEID0gdGhpcy4jY3VycmVudFBhdGgyRDtcbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHRoaXMuY3VycmVudFBhdGg7XG4gICAgdGhpcy5jdXJyZW50UGF0aCA9IFtdO1xuICAgIHRoaXMuI2N1cnJlbnRQYXRoMkQgPSBuZXcgUGF0aDJEKCk7XG4gICAgY29uc3QgY21kID0gKCkgPT4ge1xuICAgICAgdGhpcy5hbGxSYXdQYXRocy5wdXNoKGN1cnJlbnRQYXRoKTtcbiAgICAgIHRoaXMucGF0aHMucHVzaChiZXppZXIpO1xuICAgICAgdGhpcy5iZXppZXJQYXRoMkQucHVzaChwYXRoMkQpO1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLnJlYnVpbGQodGhpcyk7XG4gICAgfTtcbiAgICBjb25zdCB1bmRvID0gKCkgPT4ge1xuICAgICAgdGhpcy5hbGxSYXdQYXRocy5wb3AoKTtcbiAgICAgIHRoaXMucGF0aHMucG9wKCk7XG4gICAgICB0aGlzLmJlemllclBhdGgyRC5wb3AoKTtcbiAgICAgIGlmICh0aGlzLnBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgICAgIHRoaXMuI2NyZWF0ZUNhbnZhcygpO1xuICAgICAgICAgIHRoaXMuI2NyZWF0ZU9ic2VydmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZml0VG9Db250ZW50KCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZCxcbiAgICAgIHVuZG8sXG4gICAgICBtdXN0RXhlYzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gICNkcmF3UG9pbnRzKCkge1xuICAgIGlmICghdGhpcy4jaGFzU29tZXRoaW5nVG9EcmF3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2hhc1NvbWV0aGluZ1RvRHJhdyA9IGZhbHNlO1xuICAgIGNvbnN0IHRoaWNrbmVzcyA9IE1hdGguY2VpbCh0aGlzLnRoaWNrbmVzcyAqIHRoaXMucGFyZW50U2NhbGUpO1xuICAgIGNvbnN0IGxhc3RQb2ludHMgPSB0aGlzLmN1cnJlbnRQYXRoLnNsaWNlKC0zKTtcbiAgICBjb25zdCB4ID0gbGFzdFBvaW50cy5tYXAoeHkgPT4geHlbMF0pO1xuICAgIGNvbnN0IHkgPSBsYXN0UG9pbnRzLm1hcCh4eSA9PiB4eVsxXSk7XG4gICAgY29uc3QgeE1pbiA9IE1hdGgubWluKC4uLngpIC0gdGhpY2tuZXNzO1xuICAgIGNvbnN0IHhNYXggPSBNYXRoLm1heCguLi54KSArIHRoaWNrbmVzcztcbiAgICBjb25zdCB5TWluID0gTWF0aC5taW4oLi4ueSkgLSB0aGlja25lc3M7XG4gICAgY29uc3QgeU1heCA9IE1hdGgubWF4KC4uLnkpICsgdGhpY2tuZXNzO1xuICAgIGNvbnN0IHtcbiAgICAgIGN0eFxuICAgIH0gPSB0aGlzO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5iZXppZXJQYXRoMkQpIHtcbiAgICAgIGN0eC5zdHJva2UocGF0aCk7XG4gICAgfVxuICAgIGN0eC5zdHJva2UodGhpcy4jY3VycmVudFBhdGgyRCk7XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxuICAjbWFrZUJlemllckN1cnZlKHBhdGgyRCwgeDAsIHkwLCB4MSwgeTEsIHgyLCB5Mikge1xuICAgIGNvbnN0IHByZXZYID0gKHgwICsgeDEpIC8gMjtcbiAgICBjb25zdCBwcmV2WSA9ICh5MCArIHkxKSAvIDI7XG4gICAgY29uc3QgeDMgPSAoeDEgKyB4MikgLyAyO1xuICAgIGNvbnN0IHkzID0gKHkxICsgeTIpIC8gMjtcbiAgICBwYXRoMkQuYmV6aWVyQ3VydmVUbyhwcmV2WCArIDIgKiAoeDEgLSBwcmV2WCkgLyAzLCBwcmV2WSArIDIgKiAoeTEgLSBwcmV2WSkgLyAzLCB4MyArIDIgKiAoeDEgLSB4MykgLyAzLCB5MyArIDIgKiAoeTEgLSB5MykgLyAzLCB4MywgeTMpO1xuICB9XG4gICNnZW5lcmF0ZUJlemllclBvaW50cygpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5jdXJyZW50UGF0aDtcbiAgICBpZiAocGF0aC5sZW5ndGggPD0gMikge1xuICAgICAgcmV0dXJuIFtbcGF0aFswXSwgcGF0aFswXSwgcGF0aC5hdCgtMSksIHBhdGguYXQoLTEpXV07XG4gICAgfVxuICAgIGNvbnN0IGJlemllclBvaW50cyA9IFtdO1xuICAgIGxldCBpO1xuICAgIGxldCBbeDAsIHkwXSA9IHBhdGhbMF07XG4gICAgZm9yIChpID0gMTsgaSA8IHBhdGgubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICBjb25zdCBbeDEsIHkxXSA9IHBhdGhbaV07XG4gICAgICBjb25zdCBbeDIsIHkyXSA9IHBhdGhbaSArIDFdO1xuICAgICAgY29uc3QgeDMgPSAoeDEgKyB4MikgLyAyO1xuICAgICAgY29uc3QgeTMgPSAoeTEgKyB5MikgLyAyO1xuICAgICAgY29uc3QgY29udHJvbDEgPSBbeDAgKyAyICogKHgxIC0geDApIC8gMywgeTAgKyAyICogKHkxIC0geTApIC8gM107XG4gICAgICBjb25zdCBjb250cm9sMiA9IFt4MyArIDIgKiAoeDEgLSB4MykgLyAzLCB5MyArIDIgKiAoeTEgLSB5MykgLyAzXTtcbiAgICAgIGJlemllclBvaW50cy5wdXNoKFtbeDAsIHkwXSwgY29udHJvbDEsIGNvbnRyb2wyLCBbeDMsIHkzXV0pO1xuICAgICAgW3gwLCB5MF0gPSBbeDMsIHkzXTtcbiAgICB9XG4gICAgY29uc3QgW3gxLCB5MV0gPSBwYXRoW2ldO1xuICAgIGNvbnN0IFt4MiwgeTJdID0gcGF0aFtpICsgMV07XG4gICAgY29uc3QgY29udHJvbDEgPSBbeDAgKyAyICogKHgxIC0geDApIC8gMywgeTAgKyAyICogKHkxIC0geTApIC8gM107XG4gICAgY29uc3QgY29udHJvbDIgPSBbeDIgKyAyICogKHgxIC0geDIpIC8gMywgeTIgKyAyICogKHkxIC0geTIpIC8gM107XG4gICAgYmV6aWVyUG9pbnRzLnB1c2goW1t4MCwgeTBdLCBjb250cm9sMSwgY29udHJvbDIsIFt4MiwgeTJdXSk7XG4gICAgcmV0dXJuIGJlemllclBvaW50cztcbiAgfVxuICAjcmVkcmF3KCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgdGhpcy4jdXBkYXRlVHJhbnNmb3JtKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3NldFN0cm9rZSgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbnZhcyxcbiAgICAgIGN0eFxuICAgIH0gPSB0aGlzO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuI3VwZGF0ZVRyYW5zZm9ybSgpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLmJlemllclBhdGgyRCkge1xuICAgICAgY3R4LnN0cm9rZShwYXRoKTtcbiAgICB9XG4gIH1cbiAgY29tbWl0KCkge1xuICAgIGlmICh0aGlzLiNkaXNhYmxlRWRpdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5jb21taXQoKTtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZGlzYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5zZXRJbkZvcmVncm91bmQoKTtcbiAgICB0aGlzLiNkaXNhYmxlRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImRpc2FibGVkXCIpO1xuICAgIHRoaXMuI2ZpdFRvQ29udGVudCh0cnVlKTtcbiAgICB0aGlzLnNlbGVjdCgpO1xuICAgIHRoaXMucGFyZW50LmFkZElua0VkaXRvcklmTmVlZGVkKHRydWUpO1xuICAgIHRoaXMubW92ZUluRE9NKCk7XG4gICAgdGhpcy5kaXYuZm9jdXMoe1xuICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIGZvY3VzaW4oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2ZvY3VzRXZlbnRzQWxsb3dlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5mb2N1c2luKGV2ZW50KTtcbiAgICB0aGlzLmVuYWJsZUVkaXRNb2RlKCk7XG4gIH1cbiAgY2FudmFzUG9pbnRlcmRvd24oZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8ICF0aGlzLmlzSW5FZGl0TW9kZSgpIHx8IHRoaXMuI2Rpc2FibGVFZGl0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0SW5Gb3JlZ3JvdW5kKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuZGl2LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICB0aGlzLmRpdi5mb2N1cyh7XG4gICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLiNzdGFydERyYXdpbmcoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG4gIH1cbiAgY2FudmFzUG9pbnRlcm1vdmUoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuI2RyYXcoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG4gIH1cbiAgY2FudmFzUG9pbnRlcnVwKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLiNlbmREcmF3aW5nKGV2ZW50KTtcbiAgfVxuICBjYW52YXNQb2ludGVybGVhdmUoZXZlbnQpIHtcbiAgICB0aGlzLiNlbmREcmF3aW5nKGV2ZW50KTtcbiAgfVxuICAjZW5kRHJhd2luZyhldmVudCkge1xuICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybGVhdmVcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVybGVhdmUpO1xuICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJtb3ZlKTtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcnVwKTtcbiAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVyZG93biwge1xuICAgICAgc2lnbmFsOiB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbFxuICAgIH0pO1xuICAgIGlmICh0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkKTtcbiAgICB9XG4gICAgdGhpcy4jY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkID0gbnVsbDtcbiAgICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51KTtcbiAgICB9LCAxMCk7XG4gICAgdGhpcy4jc3RvcERyYXdpbmcoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG4gICAgdGhpcy5hZGRUb0Fubm90YXRpb25TdG9yYWdlKCk7XG4gICAgdGhpcy5zZXRJbkJhY2tncm91bmQoKTtcbiAgfVxuICAjY3JlYXRlQ2FudmFzKCkge1xuICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgdGhpcy5jYW52YXMuY2xhc3NOYW1lID0gXCJpbmtFZGl0b3JDYW52YXNcIjtcbiAgICB0aGlzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1pbmstY2FudmFzXCIpO1xuICAgIHRoaXMuZGl2LmFwcGVuZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gIH1cbiAgI2NyZWF0ZU9ic2VydmVyKCkge1xuICAgIHRoaXMuI29ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgY29uc3QgcmVjdCA9IGVudHJpZXNbMF0uY29udGVudFJlY3Q7XG4gICAgICBpZiAocmVjdC53aWR0aCAmJiByZWN0LmhlaWdodCkge1xuICAgICAgICB0aGlzLnNldERpbWVuc2lvbnMocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuI29ic2VydmVyLm9ic2VydmUodGhpcy5kaXYpO1xuICAgIHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiB7XG4gICAgICB0aGlzLiNvYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy4jb2JzZXJ2ZXIgPSBudWxsO1xuICAgIH0sIHtcbiAgICAgIG9uY2U6IHRydWVcbiAgICB9KTtcbiAgfVxuICBnZXQgaXNSZXNpemFibGUoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzRW1wdHkoKSAmJiB0aGlzLiNkaXNhYmxlRWRpdGluZztcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuZGl2KSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXY7XG4gICAgfVxuICAgIGxldCBiYXNlWCwgYmFzZVk7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIGJhc2VYID0gdGhpcy54O1xuICAgICAgYmFzZVkgPSB0aGlzLnk7XG4gICAgfVxuICAgIHN1cGVyLnJlbmRlcigpO1xuICAgIHRoaXMuZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLWlua1wiKTtcbiAgICBjb25zdCBbeCwgeSwgdywgaF0gPSB0aGlzLiNnZXRJbml0aWFsQkJveCgpO1xuICAgIHRoaXMuc2V0QXQoeCwgeSwgMCwgMCk7XG4gICAgdGhpcy5zZXREaW1zKHcsIGgpO1xuICAgIHRoaXMuI2NyZWF0ZUNhbnZhcygpO1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICB0aGlzLnNldEFzcGVjdFJhdGlvKHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgICAgdGhpcy5zZXRBdChiYXNlWCAqIHBhcmVudFdpZHRoLCBiYXNlWSAqIHBhcmVudEhlaWdodCwgdGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgICB0aGlzLiNpc0NhbnZhc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcbiAgICAgIHRoaXMuc2V0RGltcyh0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcbiAgICAgIHRoaXMuI3JlZHJhdygpO1xuICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImRpc2FibGVkXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiZWRpdGluZ1wiKTtcbiAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICB9XG4gICAgdGhpcy4jY3JlYXRlT2JzZXJ2ZXIoKTtcbiAgICByZXR1cm4gdGhpcy5kaXY7XG4gIH1cbiAgI3NldENhbnZhc0RpbXMoKSB7XG4gICAgaWYgKCF0aGlzLiNpc0NhbnZhc0luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IE1hdGguY2VpbCh0aGlzLndpZHRoICogcGFyZW50V2lkdGgpO1xuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IE1hdGguY2VpbCh0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgdGhpcy4jdXBkYXRlVHJhbnNmb3JtKCk7XG4gIH1cbiAgc2V0RGltZW5zaW9ucyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3Qgcm91bmRlZFdpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCk7XG4gICAgY29uc3Qgcm91bmRlZEhlaWdodCA9IE1hdGgucm91bmQoaGVpZ2h0KTtcbiAgICBpZiAodGhpcy4jcmVhbFdpZHRoID09PSByb3VuZGVkV2lkdGggJiYgdGhpcy4jcmVhbEhlaWdodCA9PT0gcm91bmRlZEhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNyZWFsV2lkdGggPSByb3VuZGVkV2lkdGg7XG4gICAgdGhpcy4jcmVhbEhlaWdodCA9IHJvdW5kZWRIZWlnaHQ7XG4gICAgdGhpcy5jYW52YXMuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aCAvIHBhcmVudFdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0IC8gcGFyZW50SGVpZ2h0O1xuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICBpZiAodGhpcy4jZGlzYWJsZUVkaXRpbmcpIHtcbiAgICAgIHRoaXMuI3NldFNjYWxlRmFjdG9yKHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICB0aGlzLiNzZXRDYW52YXNEaW1zKCk7XG4gICAgdGhpcy4jcmVkcmF3KCk7XG4gICAgdGhpcy5jYW52YXMuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xuICAgIHRoaXMuZml4RGltcygpO1xuICB9XG4gICNzZXRTY2FsZUZhY3Rvcih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgcGFkZGluZyA9IHRoaXMuI2dldFBhZGRpbmcoKTtcbiAgICBjb25zdCBzY2FsZUZhY3RvclcgPSAod2lkdGggLSBwYWRkaW5nKSAvIHRoaXMuI2Jhc2VXaWR0aDtcbiAgICBjb25zdCBzY2FsZUZhY3RvckggPSAoaGVpZ2h0IC0gcGFkZGluZykgLyB0aGlzLiNiYXNlSGVpZ2h0O1xuICAgIHRoaXMuc2NhbGVGYWN0b3IgPSBNYXRoLm1pbihzY2FsZUZhY3RvclcsIHNjYWxlRmFjdG9ySCk7XG4gIH1cbiAgI3VwZGF0ZVRyYW5zZm9ybSgpIHtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy4jZ2V0UGFkZGluZygpIC8gMjtcbiAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0odGhpcy5zY2FsZUZhY3RvciwgMCwgMCwgdGhpcy5zY2FsZUZhY3RvciwgdGhpcy50cmFuc2xhdGlvblggKiB0aGlzLnNjYWxlRmFjdG9yICsgcGFkZGluZywgdGhpcy50cmFuc2xhdGlvblkgKiB0aGlzLnNjYWxlRmFjdG9yICsgcGFkZGluZyk7XG4gIH1cbiAgc3RhdGljICNidWlsZFBhdGgyRChiZXppZXIpIHtcbiAgICBjb25zdCBwYXRoMkQgPSBuZXcgUGF0aDJEKCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYmV6aWVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgY29udHJvbDEsIGNvbnRyb2wyLCBzZWNvbmRdID0gYmV6aWVyW2ldO1xuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgcGF0aDJELm1vdmVUbyguLi5maXJzdCk7XG4gICAgICB9XG4gICAgICBwYXRoMkQuYmV6aWVyQ3VydmVUbyhjb250cm9sMVswXSwgY29udHJvbDFbMV0sIGNvbnRyb2wyWzBdLCBjb250cm9sMlsxXSwgc2Vjb25kWzBdLCBzZWNvbmRbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aDJEO1xuICB9XG4gIHN0YXRpYyAjdG9QREZDb29yZGluYXRlcyhwb2ludHMsIHJlY3QsIHJvdGF0aW9uKSB7XG4gICAgY29uc3QgW2JsWCwgYmxZLCB0clgsIHRyWV0gPSByZWN0O1xuICAgIHN3aXRjaCAocm90YXRpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBwb2ludHNbaV0gKz0gYmxYO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gPSB0clkgLSBwb2ludHNbaSArIDFdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBjb25zdCB4ID0gcG9pbnRzW2ldO1xuICAgICAgICAgIHBvaW50c1tpXSA9IHBvaW50c1tpICsgMV0gKyBibFg7XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSA9IHggKyBibFk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBwb2ludHNbaV0gPSB0clggLSBwb2ludHNbaV07XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSArPSBibFk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBjb25zdCB4ID0gcG9pbnRzW2ldO1xuICAgICAgICAgIHBvaW50c1tpXSA9IHRyWCAtIHBvaW50c1tpICsgMV07XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSA9IHRyWSAtIHg7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG4gIHN0YXRpYyAjZnJvbVBERkNvb3JkaW5hdGVzKHBvaW50cywgcmVjdCwgcm90YXRpb24pIHtcbiAgICBjb25zdCBbYmxYLCBibFksIHRyWCwgdHJZXSA9IHJlY3Q7XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIHBvaW50c1tpXSAtPSBibFg7XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSA9IHRyWSAtIHBvaW50c1tpICsgMV07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIGNvbnN0IHggPSBwb2ludHNbaV07XG4gICAgICAgICAgcG9pbnRzW2ldID0gcG9pbnRzW2kgKyAxXSAtIGJsWTtcbiAgICAgICAgICBwb2ludHNbaSArIDFdID0geCAtIGJsWDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIHBvaW50c1tpXSA9IHRyWCAtIHBvaW50c1tpXTtcbiAgICAgICAgICBwb2ludHNbaSArIDFdIC09IGJsWTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIGNvbnN0IHggPSBwb2ludHNbaV07XG4gICAgICAgICAgcG9pbnRzW2ldID0gdHJZIC0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgICBwb2ludHNbaSArIDFdID0gdHJYIC0geDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHM7XG4gIH1cbiAgI3NlcmlhbGl6ZVBhdGhzKHMsIHR4LCB0eSwgcmVjdCkge1xuICAgIGNvbnN0IHBhdGhzID0gW107XG4gICAgY29uc3QgcGFkZGluZyA9IHRoaXMudGhpY2tuZXNzIC8gMjtcbiAgICBjb25zdCBzaGlmdFggPSBzICogdHggKyBwYWRkaW5nO1xuICAgIGNvbnN0IHNoaWZ0WSA9IHMgKiB0eSArIHBhZGRpbmc7XG4gICAgZm9yIChjb25zdCBiZXppZXIgb2YgdGhpcy5wYXRocykge1xuICAgICAgY29uc3QgYnVmZmVyID0gW107XG4gICAgICBjb25zdCBwb2ludHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IGJlemllci5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgY29udHJvbDEsIGNvbnRyb2wyLCBzZWNvbmRdID0gYmV6aWVyW2pdO1xuICAgICAgICBpZiAoZmlyc3RbMF0gPT09IHNlY29uZFswXSAmJiBmaXJzdFsxXSA9PT0gc2Vjb25kWzFdICYmIGpqID09PSAxKSB7XG4gICAgICAgICAgY29uc3QgcDAgPSBzICogZmlyc3RbMF0gKyBzaGlmdFg7XG4gICAgICAgICAgY29uc3QgcDEgPSBzICogZmlyc3RbMV0gKyBzaGlmdFk7XG4gICAgICAgICAgYnVmZmVyLnB1c2gocDAsIHAxKTtcbiAgICAgICAgICBwb2ludHMucHVzaChwMCwgcDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAxMCA9IHMgKiBmaXJzdFswXSArIHNoaWZ0WDtcbiAgICAgICAgY29uc3QgcDExID0gcyAqIGZpcnN0WzFdICsgc2hpZnRZO1xuICAgICAgICBjb25zdCBwMjAgPSBzICogY29udHJvbDFbMF0gKyBzaGlmdFg7XG4gICAgICAgIGNvbnN0IHAyMSA9IHMgKiBjb250cm9sMVsxXSArIHNoaWZ0WTtcbiAgICAgICAgY29uc3QgcDMwID0gcyAqIGNvbnRyb2wyWzBdICsgc2hpZnRYO1xuICAgICAgICBjb25zdCBwMzEgPSBzICogY29udHJvbDJbMV0gKyBzaGlmdFk7XG4gICAgICAgIGNvbnN0IHA0MCA9IHMgKiBzZWNvbmRbMF0gKyBzaGlmdFg7XG4gICAgICAgIGNvbnN0IHA0MSA9IHMgKiBzZWNvbmRbMV0gKyBzaGlmdFk7XG4gICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgYnVmZmVyLnB1c2gocDEwLCBwMTEpO1xuICAgICAgICAgIHBvaW50cy5wdXNoKHAxMCwgcDExKTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIucHVzaChwMjAsIHAyMSwgcDMwLCBwMzEsIHA0MCwgcDQxKTtcbiAgICAgICAgcG9pbnRzLnB1c2gocDIwLCBwMjEpO1xuICAgICAgICBpZiAoaiA9PT0gamogLSAxKSB7XG4gICAgICAgICAgcG9pbnRzLnB1c2gocDQwLCBwNDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwYXRocy5wdXNoKHtcbiAgICAgICAgYmV6aWVyOiBJbmtFZGl0b3IuI3RvUERGQ29vcmRpbmF0ZXMoYnVmZmVyLCByZWN0LCB0aGlzLnJvdGF0aW9uKSxcbiAgICAgICAgcG9pbnRzOiBJbmtFZGl0b3IuI3RvUERGQ29vcmRpbmF0ZXMocG9pbnRzLCByZWN0LCB0aGlzLnJvdGF0aW9uKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXRocztcbiAgfVxuICAjZ2V0QmJveCgpIHtcbiAgICBsZXQgeE1pbiA9IEluZmluaXR5O1xuICAgIGxldCB4TWF4ID0gLUluZmluaXR5O1xuICAgIGxldCB5TWluID0gSW5maW5pdHk7XG4gICAgbGV0IHlNYXggPSAtSW5maW5pdHk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHRoaXMucGF0aHMpIHtcbiAgICAgIGZvciAoY29uc3QgW2ZpcnN0LCBjb250cm9sMSwgY29udHJvbDIsIHNlY29uZF0gb2YgcGF0aCkge1xuICAgICAgICBjb25zdCBiYm94ID0gVXRpbC5iZXppZXJCb3VuZGluZ0JveCguLi5maXJzdCwgLi4uY29udHJvbDEsIC4uLmNvbnRyb2wyLCAuLi5zZWNvbmQpO1xuICAgICAgICB4TWluID0gTWF0aC5taW4oeE1pbiwgYmJveFswXSk7XG4gICAgICAgIHlNaW4gPSBNYXRoLm1pbih5TWluLCBiYm94WzFdKTtcbiAgICAgICAgeE1heCA9IE1hdGgubWF4KHhNYXgsIGJib3hbMl0pO1xuICAgICAgICB5TWF4ID0gTWF0aC5tYXgoeU1heCwgYmJveFszXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbeE1pbiwgeU1pbiwgeE1heCwgeU1heF07XG4gIH1cbiAgI2dldFBhZGRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Rpc2FibGVFZGl0aW5nID8gTWF0aC5jZWlsKHRoaXMudGhpY2tuZXNzICogdGhpcy5wYXJlbnRTY2FsZSkgOiAwO1xuICB9XG4gICNmaXRUb0NvbnRlbnQoZmlyc3RUaW1lID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNkaXNhYmxlRWRpdGluZykge1xuICAgICAgdGhpcy4jcmVkcmF3KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJib3ggPSB0aGlzLiNnZXRCYm94KCk7XG4gICAgY29uc3QgcGFkZGluZyA9IHRoaXMuI2dldFBhZGRpbmcoKTtcbiAgICB0aGlzLiNiYXNlV2lkdGggPSBNYXRoLm1heChBbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFLCBiYm94WzJdIC0gYmJveFswXSk7XG4gICAgdGhpcy4jYmFzZUhlaWdodCA9IE1hdGgubWF4KEFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUsIGJib3hbM10gLSBiYm94WzFdKTtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChwYWRkaW5nICsgdGhpcy4jYmFzZVdpZHRoICogdGhpcy5zY2FsZUZhY3Rvcik7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5jZWlsKHBhZGRpbmcgKyB0aGlzLiNiYXNlSGVpZ2h0ICogdGhpcy5zY2FsZUZhY3Rvcik7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aCAvIHBhcmVudFdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0IC8gcGFyZW50SGVpZ2h0O1xuICAgIHRoaXMuc2V0QXNwZWN0UmF0aW8od2lkdGgsIGhlaWdodCk7XG4gICAgY29uc3QgcHJldlRyYW5zbGF0aW9uWCA9IHRoaXMudHJhbnNsYXRpb25YO1xuICAgIGNvbnN0IHByZXZUcmFuc2xhdGlvblkgPSB0aGlzLnRyYW5zbGF0aW9uWTtcbiAgICB0aGlzLnRyYW5zbGF0aW9uWCA9IC1iYm94WzBdO1xuICAgIHRoaXMudHJhbnNsYXRpb25ZID0gLWJib3hbMV07XG4gICAgdGhpcy4jc2V0Q2FudmFzRGltcygpO1xuICAgIHRoaXMuI3JlZHJhdygpO1xuICAgIHRoaXMuI3JlYWxXaWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuI3JlYWxIZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5zZXREaW1zKHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnN0IHVuc2NhbGVkUGFkZGluZyA9IGZpcnN0VGltZSA/IHBhZGRpbmcgLyB0aGlzLnNjYWxlRmFjdG9yIC8gMiA6IDA7XG4gICAgdGhpcy50cmFuc2xhdGUocHJldlRyYW5zbGF0aW9uWCAtIHRoaXMudHJhbnNsYXRpb25YIC0gdW5zY2FsZWRQYWRkaW5nLCBwcmV2VHJhbnNsYXRpb25ZIC0gdGhpcy50cmFuc2xhdGlvblkgLSB1bnNjYWxlZFBhZGRpbmcpO1xuICB9XG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcikge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgSW5rQW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBlZGl0b3IgPSBzdXBlci5kZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcik7XG4gICAgZWRpdG9yLnRoaWNrbmVzcyA9IGRhdGEudGhpY2tuZXNzO1xuICAgIGVkaXRvci5jb2xvciA9IFV0aWwubWFrZUhleENvbG9yKC4uLmRhdGEuY29sb3IpO1xuICAgIGVkaXRvci5vcGFjaXR5ID0gZGF0YS5vcGFjaXR5O1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gZWRpdG9yLnBhZ2VEaW1lbnNpb25zO1xuICAgIGNvbnN0IHdpZHRoID0gZWRpdG9yLndpZHRoICogcGFnZVdpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGVkaXRvci5oZWlnaHQgKiBwYWdlSGVpZ2h0O1xuICAgIGNvbnN0IHNjYWxlRmFjdG9yID0gZWRpdG9yLnBhcmVudFNjYWxlO1xuICAgIGNvbnN0IHBhZGRpbmcgPSBkYXRhLnRoaWNrbmVzcyAvIDI7XG4gICAgZWRpdG9yLiNkaXNhYmxlRWRpdGluZyA9IHRydWU7XG4gICAgZWRpdG9yLiNyZWFsV2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoKTtcbiAgICBlZGl0b3IuI3JlYWxIZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCk7XG4gICAgY29uc3Qge1xuICAgICAgcGF0aHMsXG4gICAgICByZWN0LFxuICAgICAgcm90YXRpb25cbiAgICB9ID0gZGF0YTtcbiAgICBmb3IgKGxldCB7XG4gICAgICBiZXppZXJcbiAgICB9IG9mIHBhdGhzKSB7XG4gICAgICBiZXppZXIgPSBJbmtFZGl0b3IuI2Zyb21QREZDb29yZGluYXRlcyhiZXppZXIsIHJlY3QsIHJvdGF0aW9uKTtcbiAgICAgIGNvbnN0IHBhdGggPSBbXTtcbiAgICAgIGVkaXRvci5wYXRocy5wdXNoKHBhdGgpO1xuICAgICAgbGV0IHAwID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyWzBdIC0gcGFkZGluZyk7XG4gICAgICBsZXQgcDEgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbMV0gLSBwYWRkaW5nKTtcbiAgICAgIGZvciAobGV0IGkgPSAyLCBpaSA9IGJlemllci5sZW5ndGg7IGkgPCBpaTsgaSArPSA2KSB7XG4gICAgICAgIGNvbnN0IHAxMCA9IHNjYWxlRmFjdG9yICogKGJlemllcltpXSAtIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCBwMTEgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaSArIDFdIC0gcGFkZGluZyk7XG4gICAgICAgIGNvbnN0IHAyMCA9IHNjYWxlRmFjdG9yICogKGJlemllcltpICsgMl0gLSBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgcDIxID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2kgKyAzXSAtIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCBwMzAgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaSArIDRdIC0gcGFkZGluZyk7XG4gICAgICAgIGNvbnN0IHAzMSA9IHNjYWxlRmFjdG9yICogKGJlemllcltpICsgNV0gLSBwYWRkaW5nKTtcbiAgICAgICAgcGF0aC5wdXNoKFtbcDAsIHAxXSwgW3AxMCwgcDExXSwgW3AyMCwgcDIxXSwgW3AzMCwgcDMxXV0pO1xuICAgICAgICBwMCA9IHAzMDtcbiAgICAgICAgcDEgPSBwMzE7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoMkQgPSB0aGlzLiNidWlsZFBhdGgyRChwYXRoKTtcbiAgICAgIGVkaXRvci5iZXppZXJQYXRoMkQucHVzaChwYXRoMkQpO1xuICAgIH1cbiAgICBjb25zdCBiYm94ID0gZWRpdG9yLiNnZXRCYm94KCk7XG4gICAgZWRpdG9yLiNiYXNlV2lkdGggPSBNYXRoLm1heChBbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFLCBiYm94WzJdIC0gYmJveFswXSk7XG4gICAgZWRpdG9yLiNiYXNlSGVpZ2h0ID0gTWF0aC5tYXgoQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgYmJveFszXSAtIGJib3hbMV0pO1xuICAgIGVkaXRvci4jc2V0U2NhbGVGYWN0b3Iod2lkdGgsIGhlaWdodCk7XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICBzZXJpYWxpemUoKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0UmVjdCgwLCAwKTtcbiAgICBjb25zdCBjb2xvciA9IEFubm90YXRpb25FZGl0b3IuX2NvbG9yTWFuYWdlci5jb252ZXJ0KHRoaXMuY3R4LnN0cm9rZVN0eWxlKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5ub3RhdGlvblR5cGU6IEFubm90YXRpb25FZGl0b3JUeXBlLklOSyxcbiAgICAgIGNvbG9yLFxuICAgICAgdGhpY2tuZXNzOiB0aGlzLnRoaWNrbmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMub3BhY2l0eSxcbiAgICAgIHBhdGhzOiB0aGlzLiNzZXJpYWxpemVQYXRocyh0aGlzLnNjYWxlRmFjdG9yIC8gdGhpcy5wYXJlbnRTY2FsZSwgdGhpcy50cmFuc2xhdGlvblgsIHRoaXMudHJhbnNsYXRpb25ZLCByZWN0KSxcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICByZWN0LFxuICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sXG4gICAgICBzdHJ1Y3RUcmVlUGFyZW50SWQ6IHRoaXMuX3N0cnVjdFRyZWVQYXJlbnRJZFxuICAgIH07XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL3N0YW1wLmpzXG5cblxuXG5cbmNsYXNzIFN0YW1wRWRpdG9yIGV4dGVuZHMgQW5ub3RhdGlvbkVkaXRvciB7XG4gICNiaXRtYXAgPSBudWxsO1xuICAjYml0bWFwSWQgPSBudWxsO1xuICAjYml0bWFwUHJvbWlzZSA9IG51bGw7XG4gICNiaXRtYXBVcmwgPSBudWxsO1xuICAjYml0bWFwRmlsZSA9IG51bGw7XG4gICNiaXRtYXBGaWxlTmFtZSA9IFwiXCI7XG4gICNjYW52YXMgPSBudWxsO1xuICAjb2JzZXJ2ZXIgPSBudWxsO1xuICAjcmVzaXplVGltZW91dElkID0gbnVsbDtcbiAgI2lzU3ZnID0gZmFsc2U7XG4gICNoYXNCZWVuQWRkZWRJblVuZG9TdGFjayA9IGZhbHNlO1xuICBzdGF0aWMgX3R5cGUgPSBcInN0YW1wXCI7XG4gIHN0YXRpYyBfZWRpdG9yVHlwZSA9IEFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QO1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBuYW1lOiBcInN0YW1wRWRpdG9yXCJcbiAgICB9KTtcbiAgICB0aGlzLiNiaXRtYXBVcmwgPSBwYXJhbXMuYml0bWFwVXJsO1xuICAgIHRoaXMuI2JpdG1hcEZpbGUgPSBwYXJhbXMuYml0bWFwRmlsZTtcbiAgfVxuICBzdGF0aWMgaW5pdGlhbGl6ZShsMTBuLCB1aU1hbmFnZXIpIHtcbiAgICBBbm5vdGF0aW9uRWRpdG9yLmluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHN1cHBvcnRlZFR5cGVzKCkge1xuICAgIGNvbnN0IHR5cGVzID0gW1wiYXBuZ1wiLCBcImF2aWZcIiwgXCJibXBcIiwgXCJnaWZcIiwgXCJqcGVnXCIsIFwicG5nXCIsIFwic3ZnK3htbFwiLCBcIndlYnBcIiwgXCJ4LWljb25cIl07XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInN1cHBvcnRlZFR5cGVzXCIsIHR5cGVzLm1hcCh0eXBlID0+IGBpbWFnZS8ke3R5cGV9YCkpO1xuICB9XG4gIHN0YXRpYyBnZXQgc3VwcG9ydGVkVHlwZXNTdHIoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInN1cHBvcnRlZFR5cGVzU3RyXCIsIHRoaXMuc3VwcG9ydGVkVHlwZXMuam9pbihcIixcIikpO1xuICB9XG4gIHN0YXRpYyBpc0hhbmRsaW5nTWltZUZvclBhc3RpbmcobWltZSkge1xuICAgIHJldHVybiB0aGlzLnN1cHBvcnRlZFR5cGVzLmluY2x1ZGVzKG1pbWUpO1xuICB9XG4gIHN0YXRpYyBwYXN0ZShpdGVtLCBwYXJlbnQpIHtcbiAgICBwYXJlbnQucGFzdGVFZGl0b3IoQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVAsIHtcbiAgICAgIGJpdG1hcEZpbGU6IGl0ZW0uZ2V0QXNGaWxlKClcbiAgICB9KTtcbiAgfVxuICAjZ2V0Qml0bWFwRmV0Y2hlZChkYXRhLCBmcm9tSWQgPSBmYWxzZSkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYml0bWFwID0gZGF0YS5iaXRtYXA7XG4gICAgaWYgKCFmcm9tSWQpIHtcbiAgICAgIHRoaXMuI2JpdG1hcElkID0gZGF0YS5pZDtcbiAgICAgIHRoaXMuI2lzU3ZnID0gZGF0YS5pc1N2ZztcbiAgICB9XG4gICAgaWYgKGRhdGEuZmlsZSkge1xuICAgICAgdGhpcy4jYml0bWFwRmlsZU5hbWUgPSBkYXRhLmZpbGUubmFtZTtcbiAgICB9XG4gICAgdGhpcy4jY3JlYXRlQ2FudmFzKCk7XG4gIH1cbiAgI2dldEJpdG1hcERvbmUoKSB7XG4gICAgdGhpcy4jYml0bWFwUHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLmVuYWJsZVdhaXRpbmcoZmFsc2UpO1xuICAgIGlmICh0aGlzLiNjYW52YXMpIHtcbiAgICAgIHRoaXMuZGl2LmZvY3VzKCk7XG4gICAgfVxuICB9XG4gICNnZXRCaXRtYXAoKSB7XG4gICAgaWYgKHRoaXMuI2JpdG1hcElkKSB7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuZW5hYmxlV2FpdGluZyh0cnVlKTtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0RnJvbUlkKHRoaXMuI2JpdG1hcElkKS50aGVuKGRhdGEgPT4gdGhpcy4jZ2V0Qml0bWFwRmV0Y2hlZChkYXRhLCB0cnVlKSkuZmluYWxseSgoKSA9PiB0aGlzLiNnZXRCaXRtYXBEb25lKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jYml0bWFwVXJsKSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLiNiaXRtYXBVcmw7XG4gICAgICB0aGlzLiNiaXRtYXBVcmwgPSBudWxsO1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmVuYWJsZVdhaXRpbmcodHJ1ZSk7XG4gICAgICB0aGlzLiNiaXRtYXBQcm9taXNlID0gdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tVXJsKHVybCkudGhlbihkYXRhID0+IHRoaXMuI2dldEJpdG1hcEZldGNoZWQoZGF0YSkpLmZpbmFsbHkoKCkgPT4gdGhpcy4jZ2V0Qml0bWFwRG9uZSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2JpdG1hcEZpbGUpIHtcbiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLiNiaXRtYXBGaWxlO1xuICAgICAgdGhpcy4jYml0bWFwRmlsZSA9IG51bGw7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuZW5hYmxlV2FpdGluZyh0cnVlKTtcbiAgICAgIHRoaXMuI2JpdG1hcFByb21pc2UgPSB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmdldEZyb21GaWxlKGZpbGUpLnRoZW4oZGF0YSA9PiB0aGlzLiNnZXRCaXRtYXBGZXRjaGVkKGRhdGEpKS5maW5hbGx5KCgpID0+IHRoaXMuI2dldEJpdG1hcERvbmUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgIGlucHV0LnR5cGUgPSBcImZpbGVcIjtcbiAgICBpbnB1dC5hY2NlcHQgPSBTdGFtcEVkaXRvci5zdXBwb3J0ZWRUeXBlc1N0cjtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICB0aGlzLiNiaXRtYXBQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCFpbnB1dC5maWxlcyB8fCBpbnB1dC5maWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3VpTWFuYWdlci5lbmFibGVXYWl0aW5nKHRydWUpO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmdldEZyb21GaWxlKGlucHV0LmZpbGVzWzBdKTtcbiAgICAgICAgICB0aGlzLiNnZXRCaXRtYXBGZXRjaGVkKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJjYW5jZWxcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCB7XG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG4gICAgfSkuZmluYWxseSgoKSA9PiB0aGlzLiNnZXRCaXRtYXBEb25lKCkpO1xuICAgIGlucHV0LmNsaWNrKCk7XG4gIH1cbiAgcmVtb3ZlKCkge1xuICAgIGlmICh0aGlzLiNiaXRtYXBJZCkge1xuICAgICAgdGhpcy4jYml0bWFwID0gbnVsbDtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZGVsZXRlSWQodGhpcy4jYml0bWFwSWQpO1xuICAgICAgdGhpcy4jY2FudmFzPy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuI2NhbnZhcyA9IG51bGw7XG4gICAgICB0aGlzLiNvYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy4jb2JzZXJ2ZXIgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jcmVzaXplVGltZW91dElkKTtcbiAgICAgICAgdGhpcy4jcmVzaXplVGltZW91dElkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIucmVtb3ZlKCk7XG4gIH1cbiAgcmVidWlsZCgpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICBpZiAodGhpcy4jYml0bWFwSWQpIHtcbiAgICAgICAgdGhpcy4jZ2V0Qml0bWFwKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLnJlYnVpbGQoKTtcbiAgICBpZiAodGhpcy5kaXYgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2JpdG1hcElkICYmIHRoaXMuI2NhbnZhcyA9PT0gbnVsbCkge1xuICAgICAgdGhpcy4jZ2V0Qml0bWFwKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHRoaXMucGFyZW50LmFkZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgb25jZUFkZGVkKCkge1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmRpdi5mb2N1cygpO1xuICB9XG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuICEodGhpcy4jYml0bWFwUHJvbWlzZSB8fCB0aGlzLiNiaXRtYXAgfHwgdGhpcy4jYml0bWFwVXJsIHx8IHRoaXMuI2JpdG1hcEZpbGUgfHwgdGhpcy4jYml0bWFwSWQpO1xuICB9XG4gIGdldCBpc1Jlc2l6YWJsZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuZGl2KSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXY7XG4gICAgfVxuICAgIGxldCBiYXNlWCwgYmFzZVk7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIGJhc2VYID0gdGhpcy54O1xuICAgICAgYmFzZVkgPSB0aGlzLnk7XG4gICAgfVxuICAgIHN1cGVyLnJlbmRlcigpO1xuICAgIHRoaXMuZGl2LmhpZGRlbiA9IHRydWU7XG4gICAgdGhpcy5hZGRBbHRUZXh0QnV0dG9uKCk7XG4gICAgaWYgKHRoaXMuI2JpdG1hcCkge1xuICAgICAgdGhpcy4jY3JlYXRlQ2FudmFzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2dldEJpdG1hcCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgdGhpcy5zZXRBdChiYXNlWCAqIHBhcmVudFdpZHRoLCBiYXNlWSAqIHBhcmVudEhlaWdodCwgdGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpdjtcbiAgfVxuICAjY3JlYXRlQ2FudmFzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRpdlxuICAgIH0gPSB0aGlzO1xuICAgIGxldCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSB0aGlzLiNiaXRtYXA7XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgIGNvbnN0IE1BWF9SQVRJTyA9IDAuNzU7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIHdpZHRoID0gdGhpcy53aWR0aCAqIHBhZ2VXaWR0aDtcbiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodDtcbiAgICB9IGVsc2UgaWYgKHdpZHRoID4gTUFYX1JBVElPICogcGFnZVdpZHRoIHx8IGhlaWdodCA+IE1BWF9SQVRJTyAqIHBhZ2VIZWlnaHQpIHtcbiAgICAgIGNvbnN0IGZhY3RvciA9IE1hdGgubWluKE1BWF9SQVRJTyAqIHBhZ2VXaWR0aCAvIHdpZHRoLCBNQVhfUkFUSU8gKiBwYWdlSGVpZ2h0IC8gaGVpZ2h0KTtcbiAgICAgIHdpZHRoICo9IGZhY3RvcjtcbiAgICAgIGhlaWdodCAqPSBmYWN0b3I7XG4gICAgfVxuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLnNldERpbXMod2lkdGggKiBwYXJlbnRXaWR0aCAvIHBhZ2VXaWR0aCwgaGVpZ2h0ICogcGFyZW50SGVpZ2h0IC8gcGFnZUhlaWdodCk7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLmVuYWJsZVdhaXRpbmcoZmFsc2UpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuI2NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgZGl2LmFwcGVuZChjYW52YXMpO1xuICAgIGRpdi5oaWRkZW4gPSBmYWxzZTtcbiAgICB0aGlzLiNkcmF3Qml0bWFwKHdpZHRoLCBoZWlnaHQpO1xuICAgIHRoaXMuI2NyZWF0ZU9ic2VydmVyKCk7XG4gICAgaWYgKCF0aGlzLiNoYXNCZWVuQWRkZWRJblVuZG9TdGFjaykge1xuICAgICAgdGhpcy5wYXJlbnQuYWRkVW5kb2FibGVFZGl0b3IodGhpcyk7XG4gICAgICB0aGlzLiNoYXNCZWVuQWRkZWRJblVuZG9TdGFjayA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX3JlcG9ydFRlbGVtZXRyeSh7XG4gICAgICBhY3Rpb246IFwiaW5zZXJ0ZWRfaW1hZ2VcIlxuICAgIH0pO1xuICAgIGlmICh0aGlzLiNiaXRtYXBGaWxlTmFtZSkge1xuICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdGhpcy4jYml0bWFwRmlsZU5hbWUpO1xuICAgIH1cbiAgfVxuICAjc2V0RGltZW5zaW9ucyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aCAvIHBhcmVudFdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0IC8gcGFyZW50SGVpZ2h0O1xuICAgIHRoaXMuc2V0RGltcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAodGhpcy5faW5pdGlhbE9wdGlvbnM/LmlzQ2VudGVyZWQpIHtcbiAgICAgIHRoaXMuY2VudGVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbE9wdGlvbnMgPSBudWxsO1xuICAgIGlmICh0aGlzLiNyZXNpemVUaW1lb3V0SWQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNyZXNpemVUaW1lb3V0SWQpO1xuICAgIH1cbiAgICBjb25zdCBUSU1FX1RPX1dBSVQgPSAyMDA7XG4gICAgdGhpcy4jcmVzaXplVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiNyZXNpemVUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgdGhpcy4jZHJhd0JpdG1hcCh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LCBUSU1FX1RPX1dBSVQpO1xuICB9XG4gICNzY2FsZUJpdG1hcCh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGg6IGJpdG1hcFdpZHRoLFxuICAgICAgaGVpZ2h0OiBiaXRtYXBIZWlnaHRcbiAgICB9ID0gdGhpcy4jYml0bWFwO1xuICAgIGxldCBuZXdXaWR0aCA9IGJpdG1hcFdpZHRoO1xuICAgIGxldCBuZXdIZWlnaHQgPSBiaXRtYXBIZWlnaHQ7XG4gICAgbGV0IGJpdG1hcCA9IHRoaXMuI2JpdG1hcDtcbiAgICB3aGlsZSAobmV3V2lkdGggPiAyICogd2lkdGggfHwgbmV3SGVpZ2h0ID4gMiAqIGhlaWdodCkge1xuICAgICAgY29uc3QgcHJldldpZHRoID0gbmV3V2lkdGg7XG4gICAgICBjb25zdCBwcmV2SGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICAgICAgaWYgKG5ld1dpZHRoID4gMiAqIHdpZHRoKSB7XG4gICAgICAgIG5ld1dpZHRoID0gbmV3V2lkdGggPj0gMTYzODQgPyBNYXRoLmZsb29yKG5ld1dpZHRoIC8gMikgLSAxIDogTWF0aC5jZWlsKG5ld1dpZHRoIC8gMik7XG4gICAgICB9XG4gICAgICBpZiAobmV3SGVpZ2h0ID4gMiAqIGhlaWdodCkge1xuICAgICAgICBuZXdIZWlnaHQgPSBuZXdIZWlnaHQgPj0gMTYzODQgPyBNYXRoLmZsb29yKG5ld0hlaWdodCAvIDIpIC0gMSA6IE1hdGguY2VpbChuZXdIZWlnaHQgLyAyKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3V2lkdGgsIG5ld0hlaWdodCk7XG4gICAgICBjb25zdCBjdHggPSBvZmZzY3JlZW4uZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHByZXZXaWR0aCwgcHJldkhlaWdodCwgMCwgMCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7XG4gICAgICBiaXRtYXAgPSBvZmZzY3JlZW4udHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7XG4gICAgfVxuICAgIHJldHVybiBiaXRtYXA7XG4gIH1cbiAgI2RyYXdCaXRtYXAod2lkdGgsIGhlaWdodCkge1xuICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoKTtcbiAgICBoZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0KTtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLiNjYW52YXM7XG4gICAgaWYgKCFjYW52YXMgfHwgY2FudmFzLndpZHRoID09PSB3aWR0aCAmJiBjYW52YXMuaGVpZ2h0ID09PSBoZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCBiaXRtYXAgPSB0aGlzLiNpc1N2ZyA/IHRoaXMuI2JpdG1hcCA6IHRoaXMuI3NjYWxlQml0bWFwKHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmICh0aGlzLl91aU1hbmFnZXIuaGFzTUxNYW5hZ2VyICYmICF0aGlzLmhhc0FsdFRleHQoKSkge1xuICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCwgYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5tbEd1ZXNzKHtcbiAgICAgICAgc2VydmljZTogXCJpbWFnZS10by10ZXh0XCIsXG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBkYXRhOiBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpLmRhdGEsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGNoYW5uZWxzOiA0XG4gICAgICAgIH1cbiAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBjb25zdCBhbHRUZXh0ID0gcmVzcG9uc2U/Lm91dHB1dCB8fCBcIlwiO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgYWx0VGV4dCAmJiAhdGhpcy5oYXNBbHRUZXh0KCkpIHtcbiAgICAgICAgICB0aGlzLmFsdFRleHREYXRhID0ge1xuICAgICAgICAgICAgYWx0VGV4dCxcbiAgICAgICAgICAgIGRlY29yYXRpdmU6IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY3R4LmZpbHRlciA9IHRoaXMuX3VpTWFuYWdlci5oY21GaWx0ZXI7XG4gICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIGJpdG1hcC53aWR0aCwgYml0bWFwLmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gIH1cbiAgZ2V0SW1hZ2VGb3JBbHRUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiNjYW52YXM7XG4gIH1cbiAgI3NlcmlhbGl6ZUJpdG1hcCh0b1VybCkge1xuICAgIGlmICh0b1VybCkge1xuICAgICAgaWYgKHRoaXMuI2lzU3ZnKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0U3ZnVXJsKHRoaXMuI2JpdG1hcElkKTtcbiAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAoe1xuICAgICAgICB3aWR0aDogY2FudmFzLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IGNhbnZhcy5oZWlnaHRcbiAgICAgIH0gPSB0aGlzLiNiaXRtYXApO1xuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGN0eC5kcmF3SW1hZ2UodGhpcy4jYml0bWFwLCAwLCAwKTtcbiAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNpc1N2Zykge1xuICAgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLnJvdW5kKHRoaXMud2lkdGggKiBwYWdlV2lkdGggKiBQaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFMpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5yb3VuZCh0aGlzLmhlaWdodCAqIHBhZ2VIZWlnaHQgKiBQaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFMpO1xuICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjdHguZHJhd0ltYWdlKHRoaXMuI2JpdG1hcCwgMCwgMCwgdGhpcy4jYml0bWFwLndpZHRoLCB0aGlzLiNiaXRtYXAuaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHJldHVybiBvZmZzY3JlZW4udHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7XG4gICAgfVxuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy4jYml0bWFwKTtcbiAgfVxuICAjY3JlYXRlT2JzZXJ2ZXIoKSB7XG4gICAgaWYgKCF0aGlzLl91aU1hbmFnZXIuX3NpZ25hbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBlbnRyaWVzWzBdLmNvbnRlbnRSZWN0O1xuICAgICAgaWYgKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpIHtcbiAgICAgICAgdGhpcy4jc2V0RGltZW5zaW9ucyhyZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy4jb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmRpdik7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHtcbiAgICAgIHRoaXMuI29ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLiNvYnNlcnZlciA9IG51bGw7XG4gICAgfSwge1xuICAgICAgb25jZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcikge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgU3RhbXBBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvciA9IHN1cGVyLmRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKTtcbiAgICBjb25zdCB7XG4gICAgICByZWN0LFxuICAgICAgYml0bWFwVXJsLFxuICAgICAgYml0bWFwSWQsXG4gICAgICBpc1N2ZyxcbiAgICAgIGFjY2Vzc2liaWxpdHlEYXRhXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGJpdG1hcElkICYmIHVpTWFuYWdlci5pbWFnZU1hbmFnZXIuaXNWYWxpZElkKGJpdG1hcElkKSkge1xuICAgICAgZWRpdG9yLiNiaXRtYXBJZCA9IGJpdG1hcElkO1xuICAgIH0gZWxzZSB7XG4gICAgICBlZGl0b3IuI2JpdG1hcFVybCA9IGJpdG1hcFVybDtcbiAgICB9XG4gICAgZWRpdG9yLiNpc1N2ZyA9IGlzU3ZnO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IGVkaXRvci5wYWdlRGltZW5zaW9ucztcbiAgICBlZGl0b3Iud2lkdGggPSAocmVjdFsyXSAtIHJlY3RbMF0pIC8gcGFyZW50V2lkdGg7XG4gICAgZWRpdG9yLmhlaWdodCA9IChyZWN0WzNdIC0gcmVjdFsxXSkgLyBwYXJlbnRIZWlnaHQ7XG4gICAgaWYgKGFjY2Vzc2liaWxpdHlEYXRhKSB7XG4gICAgICBlZGl0b3IuYWx0VGV4dERhdGEgPSBhY2Nlc3NpYmlsaXR5RGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICBzZXJpYWxpemUoaXNGb3JDb3B5aW5nID0gZmFsc2UsIGNvbnRleHQgPSBudWxsKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHtcbiAgICAgIGFubm90YXRpb25UeXBlOiBBbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUCxcbiAgICAgIGJpdG1hcElkOiB0aGlzLiNiaXRtYXBJZCxcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICByZWN0OiB0aGlzLmdldFJlY3QoMCwgMCksXG4gICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbixcbiAgICAgIGlzU3ZnOiB0aGlzLiNpc1N2ZyxcbiAgICAgIHN0cnVjdFRyZWVQYXJlbnRJZDogdGhpcy5fc3RydWN0VHJlZVBhcmVudElkXG4gICAgfTtcbiAgICBpZiAoaXNGb3JDb3B5aW5nKSB7XG4gICAgICBzZXJpYWxpemVkLmJpdG1hcFVybCA9IHRoaXMuI3NlcmlhbGl6ZUJpdG1hcCh0cnVlKTtcbiAgICAgIHNlcmlhbGl6ZWQuYWNjZXNzaWJpbGl0eURhdGEgPSB0aGlzLmFsdFRleHREYXRhO1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGRlY29yYXRpdmUsXG4gICAgICBhbHRUZXh0XG4gICAgfSA9IHRoaXMuYWx0VGV4dERhdGE7XG4gICAgaWYgKCFkZWNvcmF0aXZlICYmIGFsdFRleHQpIHtcbiAgICAgIHNlcmlhbGl6ZWQuYWNjZXNzaWJpbGl0eURhdGEgPSB7XG4gICAgICAgIHR5cGU6IFwiRmlndXJlXCIsXG4gICAgICAgIGFsdDogYWx0VGV4dFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbiAgICBjb250ZXh0LnN0YW1wcyB8fD0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGFyZWEgPSB0aGlzLiNpc1N2ZyA/IChzZXJpYWxpemVkLnJlY3RbMl0gLSBzZXJpYWxpemVkLnJlY3RbMF0pICogKHNlcmlhbGl6ZWQucmVjdFszXSAtIHNlcmlhbGl6ZWQucmVjdFsxXSkgOiBudWxsO1xuICAgIGlmICghY29udGV4dC5zdGFtcHMuaGFzKHRoaXMuI2JpdG1hcElkKSkge1xuICAgICAgY29udGV4dC5zdGFtcHMuc2V0KHRoaXMuI2JpdG1hcElkLCB7XG4gICAgICAgIGFyZWEsXG4gICAgICAgIHNlcmlhbGl6ZWRcbiAgICAgIH0pO1xuICAgICAgc2VyaWFsaXplZC5iaXRtYXAgPSB0aGlzLiNzZXJpYWxpemVCaXRtYXAoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy4jaXNTdmcpIHtcbiAgICAgIGNvbnN0IHByZXZEYXRhID0gY29udGV4dC5zdGFtcHMuZ2V0KHRoaXMuI2JpdG1hcElkKTtcbiAgICAgIGlmIChhcmVhID4gcHJldkRhdGEuYXJlYSkge1xuICAgICAgICBwcmV2RGF0YS5hcmVhID0gYXJlYTtcbiAgICAgICAgcHJldkRhdGEuc2VyaWFsaXplZC5iaXRtYXAuY2xvc2UoKTtcbiAgICAgICAgcHJldkRhdGEuc2VyaWFsaXplZC5iaXRtYXAgPSB0aGlzLiNzZXJpYWxpemVCaXRtYXAoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3IvYW5ub3RhdGlvbl9lZGl0b3JfbGF5ZXIuanNcblxuXG5cblxuXG5cblxuY2xhc3MgQW5ub3RhdGlvbkVkaXRvckxheWVyIHtcbiAgI2FjY2Vzc2liaWxpdHlNYW5hZ2VyO1xuICAjYWxsb3dDbGljayA9IGZhbHNlO1xuICAjYW5ub3RhdGlvbkxheWVyID0gbnVsbDtcbiAgI2JvdW5kUG9pbnRlcnVwID0gbnVsbDtcbiAgI2JvdW5kUG9pbnRlcmRvd24gPSBudWxsO1xuICAjYm91bmRUZXh0TGF5ZXJQb2ludGVyRG93biA9IG51bGw7XG4gICNlZGl0b3JGb2N1c1RpbWVvdXRJZCA9IG51bGw7XG4gICNlZGl0b3JzID0gbmV3IE1hcCgpO1xuICAjaGFkUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgI2lzQ2xlYW5pbmdVcCA9IGZhbHNlO1xuICAjaXNEaXNhYmxpbmcgPSBmYWxzZTtcbiAgI3RleHRMYXllciA9IG51bGw7XG4gICN1aU1hbmFnZXI7XG4gIHN0YXRpYyBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgc3RhdGljICNlZGl0b3JUeXBlcyA9IG5ldyBNYXAoW0ZyZWVUZXh0RWRpdG9yLCBJbmtFZGl0b3IsIFN0YW1wRWRpdG9yLCBIaWdobGlnaHRFZGl0b3JdLm1hcCh0eXBlID0+IFt0eXBlLl9lZGl0b3JUeXBlLCB0eXBlXSkpO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgdWlNYW5hZ2VyLFxuICAgIHBhZ2VJbmRleCxcbiAgICBkaXYsXG4gICAgYWNjZXNzaWJpbGl0eU1hbmFnZXIsXG4gICAgYW5ub3RhdGlvbkxheWVyLFxuICAgIGRyYXdMYXllcixcbiAgICB0ZXh0TGF5ZXIsXG4gICAgdmlld3BvcnQsXG4gICAgbDEwblxuICB9KSB7XG4gICAgY29uc3QgZWRpdG9yVHlwZXMgPSBbLi4uQW5ub3RhdGlvbkVkaXRvckxheWVyLiNlZGl0b3JUeXBlcy52YWx1ZXMoKV07XG4gICAgaWYgKCFBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuX2luaXRpYWxpemVkKSB7XG4gICAgICBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yVHlwZSBvZiBlZGl0b3JUeXBlcykge1xuICAgICAgICBlZGl0b3JUeXBlLmluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdWlNYW5hZ2VyLnJlZ2lzdGVyRWRpdG9yVHlwZXMoZWRpdG9yVHlwZXMpO1xuICAgIHRoaXMuI3VpTWFuYWdlciA9IHVpTWFuYWdlcjtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICB0aGlzLmRpdiA9IGRpdjtcbiAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlciA9IGFjY2Vzc2liaWxpdHlNYW5hZ2VyO1xuICAgIHRoaXMuI2Fubm90YXRpb25MYXllciA9IGFubm90YXRpb25MYXllcjtcbiAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgdGhpcy4jdGV4dExheWVyID0gdGV4dExheWVyO1xuICAgIHRoaXMuZHJhd0xheWVyID0gZHJhd0xheWVyO1xuICAgIHRoaXMuI3VpTWFuYWdlci5hZGRMYXllcih0aGlzKTtcbiAgfVxuICBnZXQgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZWRpdG9ycy5zaXplID09PSAwO1xuICB9XG4gIGdldCBpc0ludmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0VtcHR5ICYmIHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkU7XG4gIH1cbiAgdXBkYXRlVG9vbGJhcihtb2RlKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnVwZGF0ZVRvb2xiYXIobW9kZSk7XG4gIH1cbiAgdXBkYXRlTW9kZShtb2RlID0gdGhpcy4jdWlNYW5hZ2VyLmdldE1vZGUoKSkge1xuICAgIHRoaXMuI2NsZWFudXAoKTtcbiAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORTpcbiAgICAgICAgdGhpcy5kaXNhYmxlVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLnRvZ2dsZVBvaW50ZXJFdmVudHMoZmFsc2UpO1xuICAgICAgICB0aGlzLnRvZ2dsZUFubm90YXRpb25MYXllclBvaW50ZXJFdmVudHModHJ1ZSk7XG4gICAgICAgIHRoaXMuZGlzYWJsZUNsaWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LOlxuICAgICAgICB0aGlzLmFkZElua0VkaXRvcklmTmVlZGVkKGZhbHNlKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLnRvZ2dsZVBvaW50ZXJFdmVudHModHJ1ZSk7XG4gICAgICAgIHRoaXMuZGlzYWJsZUNsaWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5ISUdITElHSFQ6XG4gICAgICAgIHRoaXMuZW5hYmxlVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLnRvZ2dsZVBvaW50ZXJFdmVudHMoZmFsc2UpO1xuICAgICAgICB0aGlzLmRpc2FibGVDbGljaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZGlzYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy50b2dnbGVQb2ludGVyRXZlbnRzKHRydWUpO1xuICAgICAgICB0aGlzLmVuYWJsZUNsaWNrKCk7XG4gICAgfVxuICAgIHRoaXMudG9nZ2xlQW5ub3RhdGlvbkxheWVyUG9pbnRlckV2ZW50cyhmYWxzZSk7XG4gICAgY29uc3Qge1xuICAgICAgY2xhc3NMaXN0XG4gICAgfSA9IHRoaXMuZGl2O1xuICAgIGZvciAoY29uc3QgZWRpdG9yVHlwZSBvZiBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuI2VkaXRvclR5cGVzLnZhbHVlcygpKSB7XG4gICAgICBjbGFzc0xpc3QudG9nZ2xlKGAke2VkaXRvclR5cGUuX3R5cGV9RWRpdGluZ2AsIG1vZGUgPT09IGVkaXRvclR5cGUuX2VkaXRvclR5cGUpO1xuICAgIH1cbiAgICB0aGlzLmRpdi5oaWRkZW4gPSBmYWxzZTtcbiAgfVxuICBoYXNUZXh0TGF5ZXIodGV4dExheWVyKSB7XG4gICAgcmV0dXJuIHRleHRMYXllciA9PT0gdGhpcy4jdGV4dExheWVyPy5kaXY7XG4gIH1cbiAgYWRkSW5rRWRpdG9ySWZOZWVkZWQoaXNDb21taXR0aW5nKSB7XG4gICAgaWYgKHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkgIT09IEFubm90YXRpb25FZGl0b3JUeXBlLklOSykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlzQ29tbWl0dGluZykge1xuICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAoZWRpdG9yLmlzRW1wdHkoKSkge1xuICAgICAgICAgIGVkaXRvci5zZXRJbkJhY2tncm91bmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5jcmVhdGVBbmRBZGROZXdFZGl0b3Ioe1xuICAgICAgb2Zmc2V0WDogMCxcbiAgICAgIG9mZnNldFk6IDBcbiAgICB9LCBmYWxzZSk7XG4gICAgZWRpdG9yLnNldEluQmFja2dyb3VuZCgpO1xuICB9XG4gIHNldEVkaXRpbmdTdGF0ZShpc0VkaXRpbmcpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIuc2V0RWRpdGluZ1N0YXRlKGlzRWRpdGluZyk7XG4gIH1cbiAgYWRkQ29tbWFuZHMocGFyYW1zKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLmFkZENvbW1hbmRzKHBhcmFtcyk7XG4gIH1cbiAgdG9nZ2xlUG9pbnRlckV2ZW50cyhlbmFibGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiZGlzYWJsZWRcIiwgIWVuYWJsZWQpO1xuICB9XG4gIHRvZ2dsZUFubm90YXRpb25MYXllclBvaW50ZXJFdmVudHMoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy4jYW5ub3RhdGlvbkxheWVyPy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImRpc2FibGVkXCIsICFlbmFibGVkKTtcbiAgfVxuICBlbmFibGUoKSB7XG4gICAgdGhpcy5kaXYudGFiSW5kZXggPSAwO1xuICAgIHRoaXMudG9nZ2xlUG9pbnRlckV2ZW50cyh0cnVlKTtcbiAgICBjb25zdCBhbm5vdGF0aW9uRWxlbWVudElkcyA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICBlZGl0b3IuZW5hYmxlRWRpdGluZygpO1xuICAgICAgZWRpdG9yLnNob3codHJ1ZSk7XG4gICAgICBpZiAoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICAgICAgdGhpcy4jdWlNYW5hZ2VyLnJlbW92ZUNoYW5nZWRFeGlzdGluZ0Fubm90YXRpb24oZWRpdG9yKTtcbiAgICAgICAgYW5ub3RhdGlvbkVsZW1lbnRJZHMuYWRkKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLiNhbm5vdGF0aW9uTGF5ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWRpdGFibGVzID0gdGhpcy4jYW5ub3RhdGlvbkxheWVyLmdldEVkaXRhYmxlQW5ub3RhdGlvbnMoKTtcbiAgICBmb3IgKGNvbnN0IGVkaXRhYmxlIG9mIGVkaXRhYmxlcykge1xuICAgICAgZWRpdGFibGUuaGlkZSgpO1xuICAgICAgaWYgKHRoaXMuI3VpTWFuYWdlci5pc0RlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChlZGl0YWJsZS5kYXRhLmlkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhbm5vdGF0aW9uRWxlbWVudElkcy5oYXMoZWRpdGFibGUuZGF0YS5pZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmRlc2VyaWFsaXplKGVkaXRhYmxlKTtcbiAgICAgIGlmICghZWRpdG9yKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGRPclJlYnVpbGQoZWRpdG9yKTtcbiAgICAgIGVkaXRvci5lbmFibGVFZGl0aW5nKCk7XG4gICAgfVxuICB9XG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy4jaXNEaXNhYmxpbmcgPSB0cnVlO1xuICAgIHRoaXMuZGl2LnRhYkluZGV4ID0gLTE7XG4gICAgdGhpcy50b2dnbGVQb2ludGVyRXZlbnRzKGZhbHNlKTtcbiAgICBjb25zdCBjaGFuZ2VkQW5ub3RhdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcmVzZXRBbm5vdGF0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICBlZGl0b3IuZGlzYWJsZUVkaXRpbmcoKTtcbiAgICAgIGlmICghZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZWRpdG9yLnNlcmlhbGl6ZSgpICE9PSBudWxsKSB7XG4gICAgICAgIGNoYW5nZWRBbm5vdGF0aW9ucy5zZXQoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQsIGVkaXRvcik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRBbm5vdGF0aW9ucy5zZXQoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQsIGVkaXRvcik7XG4gICAgICB9XG4gICAgICB0aGlzLmdldEVkaXRhYmxlQW5ub3RhdGlvbihlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCk/LnNob3coKTtcbiAgICAgIGVkaXRvci5yZW1vdmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2Fubm90YXRpb25MYXllcikge1xuICAgICAgY29uc3QgZWRpdGFibGVzID0gdGhpcy4jYW5ub3RhdGlvbkxheWVyLmdldEVkaXRhYmxlQW5ub3RhdGlvbnMoKTtcbiAgICAgIGZvciAoY29uc3QgZWRpdGFibGUgb2YgZWRpdGFibGVzKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBpZFxuICAgICAgICB9ID0gZWRpdGFibGUuZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuI3VpTWFuYWdlci5pc0RlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChpZCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZWRpdG9yID0gcmVzZXRBbm5vdGF0aW9ucy5nZXQoaWQpO1xuICAgICAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgICAgZWRpdG9yLnJlc2V0QW5ub3RhdGlvbkVsZW1lbnQoZWRpdGFibGUpO1xuICAgICAgICAgIGVkaXRvci5zaG93KGZhbHNlKTtcbiAgICAgICAgICBlZGl0YWJsZS5zaG93KCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWRpdG9yID0gY2hhbmdlZEFubm90YXRpb25zLmdldChpZCk7XG4gICAgICAgIGlmIChlZGl0b3IpIHtcbiAgICAgICAgICB0aGlzLiN1aU1hbmFnZXIuYWRkQ2hhbmdlZEV4aXN0aW5nQW5ub3RhdGlvbihlZGl0b3IpO1xuICAgICAgICAgIGVkaXRvci5yZW5kZXJBbm5vdGF0aW9uRWxlbWVudChlZGl0YWJsZSk7XG4gICAgICAgICAgZWRpdG9yLnNob3coZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRhYmxlLnNob3coKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jY2xlYW51cCgpO1xuICAgIGlmICh0aGlzLmlzRW1wdHkpIHtcbiAgICAgIHRoaXMuZGl2LmhpZGRlbiA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzTGlzdFxuICAgIH0gPSB0aGlzLmRpdjtcbiAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgQW5ub3RhdGlvbkVkaXRvckxheWVyLiNlZGl0b3JUeXBlcy52YWx1ZXMoKSkge1xuICAgICAgY2xhc3NMaXN0LnJlbW92ZShgJHtlZGl0b3JUeXBlLl90eXBlfUVkaXRpbmdgKTtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlVGV4dFNlbGVjdGlvbigpO1xuICAgIHRoaXMudG9nZ2xlQW5ub3RhdGlvbkxheWVyUG9pbnRlckV2ZW50cyh0cnVlKTtcbiAgICB0aGlzLiNpc0Rpc2FibGluZyA9IGZhbHNlO1xuICB9XG4gIGdldEVkaXRhYmxlQW5ub3RhdGlvbihpZCkge1xuICAgIHJldHVybiB0aGlzLiNhbm5vdGF0aW9uTGF5ZXI/LmdldEVkaXRhYmxlQW5ub3RhdGlvbihpZCkgfHwgbnVsbDtcbiAgfVxuICBzZXRBY3RpdmVFZGl0b3IoZWRpdG9yKSB7XG4gICAgY29uc3QgY3VycmVudEFjdGl2ZSA9IHRoaXMuI3VpTWFuYWdlci5nZXRBY3RpdmUoKTtcbiAgICBpZiAoY3VycmVudEFjdGl2ZSA9PT0gZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3VpTWFuYWdlci5zZXRBY3RpdmVFZGl0b3IoZWRpdG9yKTtcbiAgfVxuICBlbmFibGVUZXh0U2VsZWN0aW9uKCkge1xuICAgIHRoaXMuZGl2LnRhYkluZGV4ID0gLTE7XG4gICAgaWYgKHRoaXMuI3RleHRMYXllcj8uZGl2ICYmICF0aGlzLiNib3VuZFRleHRMYXllclBvaW50ZXJEb3duKSB7XG4gICAgICB0aGlzLiNib3VuZFRleHRMYXllclBvaW50ZXJEb3duID0gdGhpcy4jdGV4dExheWVyUG9pbnRlckRvd24uYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuI3RleHRMYXllci5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kVGV4dExheWVyUG9pbnRlckRvd24sIHtcbiAgICAgICAgc2lnbmFsOiB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbFxuICAgICAgfSk7XG4gICAgICB0aGlzLiN0ZXh0TGF5ZXIuZGl2LmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRpbmdcIik7XG4gICAgfVxuICB9XG4gIGRpc2FibGVUZXh0U2VsZWN0aW9uKCkge1xuICAgIHRoaXMuZGl2LnRhYkluZGV4ID0gMDtcbiAgICBpZiAodGhpcy4jdGV4dExheWVyPy5kaXYgJiYgdGhpcy4jYm91bmRUZXh0TGF5ZXJQb2ludGVyRG93bikge1xuICAgICAgdGhpcy4jdGV4dExheWVyLmRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRUZXh0TGF5ZXJQb2ludGVyRG93bik7XG4gICAgICB0aGlzLiNib3VuZFRleHRMYXllclBvaW50ZXJEb3duID0gbnVsbDtcbiAgICAgIHRoaXMuI3RleHRMYXllci5kaXYuY2xhc3NMaXN0LnJlbW92ZShcImhpZ2hsaWdodGluZ1wiKTtcbiAgICB9XG4gIH1cbiAgI3RleHRMYXllclBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnVuc2VsZWN0QWxsKCk7XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy4jdGV4dExheWVyLmRpdikge1xuICAgICAgY29uc3Qge1xuICAgICAgICBpc01hY1xuICAgICAgfSA9IHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8IGV2ZW50LmN0cmxLZXkgJiYgaXNNYWMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy4jdWlNYW5hZ2VyLnNob3dBbGxFZGl0b3JzKFwiaGlnaGxpZ2h0XCIsIHRydWUsIHRydWUpO1xuICAgICAgdGhpcy4jdGV4dExheWVyLmRpdi5jbGFzc0xpc3QuYWRkKFwiZnJlZVwiKTtcbiAgICAgIEhpZ2hsaWdodEVkaXRvci5zdGFydEhpZ2hsaWdodGluZyh0aGlzLCB0aGlzLiN1aU1hbmFnZXIuZGlyZWN0aW9uID09PSBcImx0clwiLCBldmVudCk7XG4gICAgICB0aGlzLiN0ZXh0TGF5ZXIuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLiN0ZXh0TGF5ZXIuZGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJmcmVlXCIpO1xuICAgICAgfSwge1xuICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICBzaWduYWw6IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG4gIGVuYWJsZUNsaWNrKCkge1xuICAgIGlmICh0aGlzLiNib3VuZFBvaW50ZXJkb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIHRoaXMuI2JvdW5kUG9pbnRlcmRvd24gPSB0aGlzLnBvaW50ZXJkb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy4jYm91bmRQb2ludGVydXAgPSB0aGlzLnBvaW50ZXJ1cC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZFBvaW50ZXJkb3duLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHRoaXMuI2JvdW5kUG9pbnRlcnVwLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICBkaXNhYmxlQ2xpY2soKSB7XG4gICAgaWYgKCF0aGlzLiNib3VuZFBvaW50ZXJkb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZFBvaW50ZXJkb3duKTtcbiAgICB0aGlzLmRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHRoaXMuI2JvdW5kUG9pbnRlcnVwKTtcbiAgICB0aGlzLiNib3VuZFBvaW50ZXJkb3duID0gbnVsbDtcbiAgICB0aGlzLiNib3VuZFBvaW50ZXJ1cCA9IG51bGw7XG4gIH1cbiAgYXR0YWNoKGVkaXRvcikge1xuICAgIHRoaXMuI2VkaXRvcnMuc2V0KGVkaXRvci5pZCwgZWRpdG9yKTtcbiAgICBjb25zdCB7XG4gICAgICBhbm5vdGF0aW9uRWxlbWVudElkXG4gICAgfSA9IGVkaXRvcjtcbiAgICBpZiAoYW5ub3RhdGlvbkVsZW1lbnRJZCAmJiB0aGlzLiN1aU1hbmFnZXIuaXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbkVsZW1lbnRJZCkpIHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci5yZW1vdmVEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgZGV0YWNoKGVkaXRvcikge1xuICAgIHRoaXMuI2VkaXRvcnMuZGVsZXRlKGVkaXRvci5pZCk7XG4gICAgdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXI/LnJlbW92ZVBvaW50ZXJJblRleHRMYXllcihlZGl0b3IuY29udGVudERpdik7XG4gICAgaWYgKCF0aGlzLiNpc0Rpc2FibGluZyAmJiBlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgICAgdGhpcy4jdWlNYW5hZ2VyLmFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IpO1xuICAgIH1cbiAgfVxuICByZW1vdmUoZWRpdG9yKSB7XG4gICAgdGhpcy5kZXRhY2goZWRpdG9yKTtcbiAgICB0aGlzLiN1aU1hbmFnZXIucmVtb3ZlRWRpdG9yKGVkaXRvcik7XG4gICAgZWRpdG9yLmRpdi5yZW1vdmUoKTtcbiAgICBlZGl0b3IuaXNBdHRhY2hlZFRvRE9NID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLiNpc0NsZWFuaW5nVXApIHtcbiAgICAgIHRoaXMuYWRkSW5rRWRpdG9ySWZOZWVkZWQoZmFsc2UpO1xuICAgIH1cbiAgfVxuICBjaGFuZ2VQYXJlbnQoZWRpdG9yKSB7XG4gICAgaWYgKGVkaXRvci5wYXJlbnQgPT09IHRoaXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVkaXRvci5wYXJlbnQgJiYgZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci5hZGREZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpO1xuICAgICAgQW5ub3RhdGlvbkVkaXRvci5kZWxldGVBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IpO1xuICAgICAgZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmF0dGFjaChlZGl0b3IpO1xuICAgIGVkaXRvci5wYXJlbnQ/LmRldGFjaChlZGl0b3IpO1xuICAgIGVkaXRvci5zZXRQYXJlbnQodGhpcyk7XG4gICAgaWYgKGVkaXRvci5kaXYgJiYgZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgZWRpdG9yLmRpdi5yZW1vdmUoKTtcbiAgICAgIHRoaXMuZGl2LmFwcGVuZChlZGl0b3IuZGl2KTtcbiAgICB9XG4gIH1cbiAgYWRkKGVkaXRvcikge1xuICAgIGlmIChlZGl0b3IucGFyZW50ID09PSB0aGlzICYmIGVkaXRvci5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VQYXJlbnQoZWRpdG9yKTtcbiAgICB0aGlzLiN1aU1hbmFnZXIuYWRkRWRpdG9yKGVkaXRvcik7XG4gICAgdGhpcy5hdHRhY2goZWRpdG9yKTtcbiAgICBpZiAoIWVkaXRvci5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIGNvbnN0IGRpdiA9IGVkaXRvci5yZW5kZXIoKTtcbiAgICAgIHRoaXMuZGl2LmFwcGVuZChkaXYpO1xuICAgICAgZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSA9IHRydWU7XG4gICAgfVxuICAgIGVkaXRvci5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgIGVkaXRvci5vbmNlQWRkZWQoKTtcbiAgICB0aGlzLiN1aU1hbmFnZXIuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZShlZGl0b3IpO1xuICAgIGVkaXRvci5fcmVwb3J0VGVsZW1ldHJ5KGVkaXRvci50ZWxlbWV0cnlJbml0aWFsRGF0YSk7XG4gIH1cbiAgbW92ZUVkaXRvckluRE9NKGVkaXRvcikge1xuICAgIGlmICghZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBhY3RpdmVFbGVtZW50XG4gICAgfSA9IGRvY3VtZW50O1xuICAgIGlmIChlZGl0b3IuZGl2LmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpICYmICF0aGlzLiNlZGl0b3JGb2N1c1RpbWVvdXRJZCkge1xuICAgICAgZWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuI2VkaXRvckZvY3VzVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuI2VkaXRvckZvY3VzVGltZW91dElkID0gbnVsbDtcbiAgICAgICAgaWYgKCFlZGl0b3IuZGl2LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgZWRpdG9yLmRpdi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCAoKSA9PiB7XG4gICAgICAgICAgICBlZGl0b3IuX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IHRydWU7XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgICAgIHNpZ25hbDogdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gICAgZWRpdG9yLl9zdHJ1Y3RUcmVlUGFyZW50SWQgPSB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlcj8ubW92ZUVsZW1lbnRJbkRPTSh0aGlzLmRpdiwgZWRpdG9yLmRpdiwgZWRpdG9yLmNvbnRlbnREaXYsIHRydWUpO1xuICB9XG4gIGFkZE9yUmVidWlsZChlZGl0b3IpIHtcbiAgICBpZiAoZWRpdG9yLm5lZWRzVG9CZVJlYnVpbHQoKSkge1xuICAgICAgZWRpdG9yLnBhcmVudCB8fD0gdGhpcztcbiAgICAgIGVkaXRvci5yZWJ1aWxkKCk7XG4gICAgICBlZGl0b3Iuc2hvdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZChlZGl0b3IpO1xuICAgIH1cbiAgfVxuICBhZGRVbmRvYWJsZUVkaXRvcihlZGl0b3IpIHtcbiAgICBjb25zdCBjbWQgPSAoKSA9PiBlZGl0b3IuX3VpTWFuYWdlci5yZWJ1aWxkKGVkaXRvcik7XG4gICAgY29uc3QgdW5kbyA9ICgpID0+IHtcbiAgICAgIGVkaXRvci5yZW1vdmUoKTtcbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kLFxuICAgICAgdW5kbyxcbiAgICAgIG11c3RFeGVjOiBmYWxzZVxuICAgIH0pO1xuICB9XG4gIGdldE5leHRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdWlNYW5hZ2VyLmdldElkKCk7XG4gIH1cbiAgZ2V0ICNjdXJyZW50RWRpdG9yVHlwZSgpIHtcbiAgICByZXR1cm4gQW5ub3RhdGlvbkVkaXRvckxheWVyLiNlZGl0b3JUeXBlcy5nZXQodGhpcy4jdWlNYW5hZ2VyLmdldE1vZGUoKSk7XG4gIH1cbiAgZ2V0IF9zaWduYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsO1xuICB9XG4gICNjcmVhdGVOZXdFZGl0b3IocGFyYW1zKSB7XG4gICAgY29uc3QgZWRpdG9yVHlwZSA9IHRoaXMuI2N1cnJlbnRFZGl0b3JUeXBlO1xuICAgIHJldHVybiBlZGl0b3JUeXBlID8gbmV3IGVkaXRvclR5cGUucHJvdG90eXBlLmNvbnN0cnVjdG9yKHBhcmFtcykgOiBudWxsO1xuICB9XG4gIGNhbkNyZWF0ZU5ld0VtcHR5RWRpdG9yKCkge1xuICAgIHJldHVybiB0aGlzLiNjdXJyZW50RWRpdG9yVHlwZT8uY2FuQ3JlYXRlTmV3RW1wdHlFZGl0b3IoKTtcbiAgfVxuICBwYXN0ZUVkaXRvcihtb2RlLCBwYXJhbXMpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIudXBkYXRlVG9vbGJhcihtb2RlKTtcbiAgICB0aGlzLiN1aU1hbmFnZXIudXBkYXRlTW9kZShtb2RlKTtcbiAgICBjb25zdCB7XG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WVxuICAgIH0gPSB0aGlzLiNnZXRDZW50ZXJQb2ludCgpO1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXROZXh0SWQoKTtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLiNjcmVhdGVOZXdFZGl0b3Ioe1xuICAgICAgcGFyZW50OiB0aGlzLFxuICAgICAgaWQsXG4gICAgICB4OiBvZmZzZXRYLFxuICAgICAgeTogb2Zmc2V0WSxcbiAgICAgIHVpTWFuYWdlcjogdGhpcy4jdWlNYW5hZ2VyLFxuICAgICAgaXNDZW50ZXJlZDogdHJ1ZSxcbiAgICAgIC4uLnBhcmFtc1xuICAgIH0pO1xuICAgIGlmIChlZGl0b3IpIHtcbiAgICAgIHRoaXMuYWRkKGVkaXRvcik7XG4gICAgfVxuICB9XG4gIGRlc2VyaWFsaXplKGRhdGEpIHtcbiAgICByZXR1cm4gQW5ub3RhdGlvbkVkaXRvckxheWVyLiNlZGl0b3JUeXBlcy5nZXQoZGF0YS5hbm5vdGF0aW9uVHlwZSA/PyBkYXRhLmFubm90YXRpb25FZGl0b3JUeXBlKT8uZGVzZXJpYWxpemUoZGF0YSwgdGhpcywgdGhpcy4jdWlNYW5hZ2VyKSB8fCBudWxsO1xuICB9XG4gIGNyZWF0ZUFuZEFkZE5ld0VkaXRvcihldmVudCwgaXNDZW50ZXJlZCwgZGF0YSA9IHt9KSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldE5leHRJZCgpO1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuI2NyZWF0ZU5ld0VkaXRvcih7XG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICBpZCxcbiAgICAgIHg6IGV2ZW50Lm9mZnNldFgsXG4gICAgICB5OiBldmVudC5vZmZzZXRZLFxuICAgICAgdWlNYW5hZ2VyOiB0aGlzLiN1aU1hbmFnZXIsXG4gICAgICBpc0NlbnRlcmVkLFxuICAgICAgLi4uZGF0YVxuICAgIH0pO1xuICAgIGlmIChlZGl0b3IpIHtcbiAgICAgIHRoaXMuYWRkKGVkaXRvcik7XG4gICAgfVxuICAgIHJldHVybiBlZGl0b3I7XG4gIH1cbiAgI2dldENlbnRlclBvaW50KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdGxYID0gTWF0aC5tYXgoMCwgeCk7XG4gICAgY29uc3QgdGxZID0gTWF0aC5tYXgoMCwgeSk7XG4gICAgY29uc3QgYnJYID0gTWF0aC5taW4od2luZG93LmlubmVyV2lkdGgsIHggKyB3aWR0aCk7XG4gICAgY29uc3QgYnJZID0gTWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0LCB5ICsgaGVpZ2h0KTtcbiAgICBjb25zdCBjZW50ZXJYID0gKHRsWCArIGJyWCkgLyAyIC0geDtcbiAgICBjb25zdCBjZW50ZXJZID0gKHRsWSArIGJyWSkgLyAyIC0geTtcbiAgICBjb25zdCBbb2Zmc2V0WCwgb2Zmc2V0WV0gPSB0aGlzLnZpZXdwb3J0LnJvdGF0aW9uICUgMTgwID09PSAwID8gW2NlbnRlclgsIGNlbnRlclldIDogW2NlbnRlclksIGNlbnRlclhdO1xuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WVxuICAgIH07XG4gIH1cbiAgYWRkTmV3RWRpdG9yKCkge1xuICAgIHRoaXMuY3JlYXRlQW5kQWRkTmV3RWRpdG9yKHRoaXMuI2dldENlbnRlclBvaW50KCksIHRydWUpO1xuICB9XG4gIHNldFNlbGVjdGVkKGVkaXRvcikge1xuICAgIHRoaXMuI3VpTWFuYWdlci5zZXRTZWxlY3RlZChlZGl0b3IpO1xuICB9XG4gIHRvZ2dsZVNlbGVjdGVkKGVkaXRvcikge1xuICAgIHRoaXMuI3VpTWFuYWdlci50b2dnbGVTZWxlY3RlZChlZGl0b3IpO1xuICB9XG4gIGlzU2VsZWN0ZWQoZWRpdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuI3VpTWFuYWdlci5pc1NlbGVjdGVkKGVkaXRvcik7XG4gIH1cbiAgdW5zZWxlY3QoZWRpdG9yKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnVuc2VsZWN0KGVkaXRvcik7XG4gIH1cbiAgcG9pbnRlcnVwKGV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gdXRpbF9GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8IGV2ZW50LmN0cmxLZXkgJiYgaXNNYWMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kaXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNoYWRQb2ludGVyRG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNoYWRQb2ludGVyRG93biA9IGZhbHNlO1xuICAgIGlmICghdGhpcy4jYWxsb3dDbGljaykge1xuICAgICAgdGhpcy4jYWxsb3dDbGljayA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiN1aU1hbmFnZXIuZ2V0TW9kZSgpID09PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUCkge1xuICAgICAgdGhpcy4jdWlNYW5hZ2VyLnVuc2VsZWN0QWxsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3JlYXRlQW5kQWRkTmV3RWRpdG9yKGV2ZW50LCBmYWxzZSk7XG4gIH1cbiAgcG9pbnRlcmRvd24oZXZlbnQpIHtcbiAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmdldE1vZGUoKSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUKSB7XG4gICAgICB0aGlzLmVuYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2hhZFBvaW50ZXJEb3duKSB7XG4gICAgICB0aGlzLiNoYWRQb2ludGVyRG93biA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgZXZlbnQuY3RybEtleSAmJiBpc01hYykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmRpdikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNoYWRQb2ludGVyRG93biA9IHRydWU7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy4jdWlNYW5hZ2VyLmdldEFjdGl2ZSgpO1xuICAgIHRoaXMuI2FsbG93Q2xpY2sgPSAhZWRpdG9yIHx8IGVkaXRvci5pc0VtcHR5KCk7XG4gIH1cbiAgZmluZE5ld1BhcmVudChlZGl0b3IsIHgsIHkpIHtcbiAgICBjb25zdCBsYXllciA9IHRoaXMuI3VpTWFuYWdlci5maW5kUGFyZW50KHgsIHkpO1xuICAgIGlmIChsYXllciA9PT0gbnVsbCB8fCBsYXllciA9PT0gdGhpcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsYXllci5jaGFuZ2VQYXJlbnQoZWRpdG9yKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLiN1aU1hbmFnZXIuZ2V0QWN0aXZlKCk/LnBhcmVudCA9PT0gdGhpcykge1xuICAgICAgdGhpcy4jdWlNYW5hZ2VyLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICB0aGlzLiN1aU1hbmFnZXIuc2V0QWN0aXZlRWRpdG9yKG51bGwpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNlZGl0b3JGb2N1c1RpbWVvdXRJZCk7XG4gICAgICB0aGlzLiNlZGl0b3JGb2N1c1RpbWVvdXRJZCA9IG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlNYW5hZ2VyPy5yZW1vdmVQb2ludGVySW5UZXh0TGF5ZXIoZWRpdG9yLmNvbnRlbnREaXYpO1xuICAgICAgZWRpdG9yLnNldFBhcmVudChudWxsKTtcbiAgICAgIGVkaXRvci5pc0F0dGFjaGVkVG9ET00gPSBmYWxzZTtcbiAgICAgIGVkaXRvci5kaXYucmVtb3ZlKCk7XG4gICAgfVxuICAgIHRoaXMuZGl2ID0gbnVsbDtcbiAgICB0aGlzLiNlZGl0b3JzLmNsZWFyKCk7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnJlbW92ZUxheWVyKHRoaXMpO1xuICB9XG4gICNjbGVhbnVwKCkge1xuICAgIHRoaXMuI2lzQ2xlYW5pbmdVcCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVkaXRvci5pc0VtcHR5KCkpIHtcbiAgICAgICAgZWRpdG9yLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNpc0NsZWFuaW5nVXAgPSBmYWxzZTtcbiAgfVxuICByZW5kZXIoe1xuICAgIHZpZXdwb3J0XG4gIH0pIHtcbiAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgc2V0TGF5ZXJEaW1lbnNpb25zKHRoaXMuZGl2LCB2aWV3cG9ydCk7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jdWlNYW5hZ2VyLmdldEVkaXRvcnModGhpcy5wYWdlSW5kZXgpKSB7XG4gICAgICB0aGlzLmFkZChlZGl0b3IpO1xuICAgICAgZWRpdG9yLnJlYnVpbGQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVNb2RlKCk7XG4gIH1cbiAgdXBkYXRlKHtcbiAgICB2aWV3cG9ydFxuICB9KSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgdGhpcy4jY2xlYW51cCgpO1xuICAgIGNvbnN0IG9sZFJvdGF0aW9uID0gdGhpcy52aWV3cG9ydC5yb3RhdGlvbjtcbiAgICBjb25zdCByb3RhdGlvbiA9IHZpZXdwb3J0LnJvdGF0aW9uO1xuICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICBzZXRMYXllckRpbWVuc2lvbnModGhpcy5kaXYsIHtcbiAgICAgIHJvdGF0aW9uXG4gICAgfSk7XG4gICAgaWYgKG9sZFJvdGF0aW9uICE9PSByb3RhdGlvbikge1xuICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgICBlZGl0b3Iucm90YXRlKHJvdGF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRJbmtFZGl0b3JJZk5lZWRlZChmYWxzZSk7XG4gIH1cbiAgZ2V0IHBhZ2VEaW1lbnNpb25zKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHBhZ2VXaWR0aCxcbiAgICAgIHBhZ2VIZWlnaHRcbiAgICB9ID0gdGhpcy52aWV3cG9ydC5yYXdEaW1zO1xuICAgIHJldHVybiBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XTtcbiAgfVxuICBnZXQgc2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3VpTWFuYWdlci52aWV3UGFyYW1ldGVycy5yZWFsU2NhbGU7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZHJhd19sYXllci5qc1xuXG5cbmNsYXNzIERyYXdMYXllciB7XG4gICNwYXJlbnQgPSBudWxsO1xuICAjaWQgPSAwO1xuICAjbWFwcGluZyA9IG5ldyBNYXAoKTtcbiAgI3RvVXBkYXRlID0gbmV3IE1hcCgpO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgcGFnZUluZGV4XG4gIH0pIHtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgfVxuICBzZXRQYXJlbnQocGFyZW50KSB7XG4gICAgaWYgKCF0aGlzLiNwYXJlbnQpIHtcbiAgICAgIHRoaXMuI3BhcmVudCA9IHBhcmVudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI3BhcmVudCAhPT0gcGFyZW50KSB7XG4gICAgICBpZiAodGhpcy4jbWFwcGluZy5zaXplID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy4jbWFwcGluZy52YWx1ZXMoKSkge1xuICAgICAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgICAgICAgcGFyZW50LmFwcGVuZChyb290KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4jcGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IF9zdmdGYWN0b3J5KCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfc3ZnRmFjdG9yeVwiLCBuZXcgRE9NU1ZHRmFjdG9yeSgpKTtcbiAgfVxuICBzdGF0aWMgI3NldEJveChlbGVtZW50LCB7XG4gICAgeCA9IDAsXG4gICAgeSA9IDAsXG4gICAgd2lkdGggPSAxLFxuICAgIGhlaWdodCA9IDFcbiAgfSA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gZWxlbWVudDtcbiAgICBzdHlsZS50b3AgPSBgJHsxMDAgKiB5fSVgO1xuICAgIHN0eWxlLmxlZnQgPSBgJHsxMDAgKiB4fSVgO1xuICAgIHN0eWxlLndpZHRoID0gYCR7MTAwICogd2lkdGh9JWA7XG4gICAgc3R5bGUuaGVpZ2h0ID0gYCR7MTAwICogaGVpZ2h0fSVgO1xuICB9XG4gICNjcmVhdGVTVkcoYm94KSB7XG4gICAgY29uc3Qgc3ZnID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZSgxLCAxLCB0cnVlKTtcbiAgICB0aGlzLiNwYXJlbnQuYXBwZW5kKHN2Zyk7XG4gICAgc3ZnLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIHRydWUpO1xuICAgIERyYXdMYXllci4jc2V0Qm94KHN2ZywgYm94KTtcbiAgICByZXR1cm4gc3ZnO1xuICB9XG4gICNjcmVhdGVDbGlwUGF0aChkZWZzLCBwYXRoSWQpIHtcbiAgICBjb25zdCBjbGlwUGF0aCA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwiY2xpcFBhdGhcIik7XG4gICAgZGVmcy5hcHBlbmQoY2xpcFBhdGgpO1xuICAgIGNvbnN0IGNsaXBQYXRoSWQgPSBgY2xpcF8ke3BhdGhJZH1gO1xuICAgIGNsaXBQYXRoLnNldEF0dHJpYnV0ZShcImlkXCIsIGNsaXBQYXRoSWQpO1xuICAgIGNsaXBQYXRoLnNldEF0dHJpYnV0ZShcImNsaXBQYXRoVW5pdHNcIiwgXCJvYmplY3RCb3VuZGluZ0JveFwiKTtcbiAgICBjb25zdCBjbGlwUGF0aFVzZSA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwidXNlXCIpO1xuICAgIGNsaXBQYXRoLmFwcGVuZChjbGlwUGF0aFVzZSk7XG4gICAgY2xpcFBhdGhVc2Uuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBgIyR7cGF0aElkfWApO1xuICAgIGNsaXBQYXRoVXNlLmNsYXNzTGlzdC5hZGQoXCJjbGlwXCIpO1xuICAgIHJldHVybiBjbGlwUGF0aElkO1xuICB9XG4gIGhpZ2hsaWdodChvdXRsaW5lcywgY29sb3IsIG9wYWNpdHksIGlzUGF0aFVwZGF0YWJsZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLiNpZCsrO1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLiNjcmVhdGVTVkcob3V0bGluZXMuYm94KTtcbiAgICByb290LmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRcIik7XG4gICAgaWYgKG91dGxpbmVzLmZyZWUpIHtcbiAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZChcImZyZWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGRlZnMgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcImRlZnNcIik7XG4gICAgcm9vdC5hcHBlbmQoZGVmcyk7XG4gICAgY29uc3QgcGF0aCA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwicGF0aFwiKTtcbiAgICBkZWZzLmFwcGVuZChwYXRoKTtcbiAgICBjb25zdCBwYXRoSWQgPSBgcGF0aF9wJHt0aGlzLnBhZ2VJbmRleH1fJHtpZH1gO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKFwiaWRcIiwgcGF0aElkKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcImRcIiwgb3V0bGluZXMudG9TVkdQYXRoKCkpO1xuICAgIGlmIChpc1BhdGhVcGRhdGFibGUpIHtcbiAgICAgIHRoaXMuI3RvVXBkYXRlLnNldChpZCwgcGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IGNsaXBQYXRoSWQgPSB0aGlzLiNjcmVhdGVDbGlwUGF0aChkZWZzLCBwYXRoSWQpO1xuICAgIGNvbnN0IHVzZSA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwidXNlXCIpO1xuICAgIHJvb3QuYXBwZW5kKHVzZSk7XG4gICAgcm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIGNvbG9yKTtcbiAgICByb290LnNldEF0dHJpYnV0ZShcImZpbGwtb3BhY2l0eVwiLCBvcGFjaXR5KTtcbiAgICB1c2Uuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBgIyR7cGF0aElkfWApO1xuICAgIHRoaXMuI21hcHBpbmcuc2V0KGlkLCByb290KTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQsXG4gICAgICBjbGlwUGF0aElkOiBgdXJsKCMke2NsaXBQYXRoSWR9KWBcbiAgICB9O1xuICB9XG4gIGhpZ2hsaWdodE91dGxpbmUob3V0bGluZXMpIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuI2lkKys7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuI2NyZWF0ZVNWRyhvdXRsaW5lcy5ib3gpO1xuICAgIHJvb3QuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodE91dGxpbmVcIik7XG4gICAgY29uc3QgZGVmcyA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwiZGVmc1wiKTtcbiAgICByb290LmFwcGVuZChkZWZzKTtcbiAgICBjb25zdCBwYXRoID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIpO1xuICAgIGRlZnMuYXBwZW5kKHBhdGgpO1xuICAgIGNvbnN0IHBhdGhJZCA9IGBwYXRoX3Ake3RoaXMucGFnZUluZGV4fV8ke2lkfWA7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBwYXRoSWQpO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKFwiZFwiLCBvdXRsaW5lcy50b1NWR1BhdGgoKSk7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJ2ZWN0b3ItZWZmZWN0XCIsIFwibm9uLXNjYWxpbmctc3Ryb2tlXCIpO1xuICAgIGxldCBtYXNrSWQ7XG4gICAgaWYgKG91dGxpbmVzLmZyZWUpIHtcbiAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZChcImZyZWVcIik7XG4gICAgICBjb25zdCBtYXNrID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJtYXNrXCIpO1xuICAgICAgZGVmcy5hcHBlbmQobWFzayk7XG4gICAgICBtYXNrSWQgPSBgbWFza19wJHt0aGlzLnBhZ2VJbmRleH1fJHtpZH1gO1xuICAgICAgbWFzay5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBtYXNrSWQpO1xuICAgICAgbWFzay5zZXRBdHRyaWJ1dGUoXCJtYXNrVW5pdHNcIiwgXCJvYmplY3RCb3VuZGluZ0JveFwiKTtcbiAgICAgIGNvbnN0IHJlY3QgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInJlY3RcIik7XG4gICAgICBtYXNrLmFwcGVuZChyZWN0KTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCIxXCIpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgXCIxXCIpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwid2hpdGVcIik7XG4gICAgICBjb25zdCB1c2UgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInVzZVwiKTtcbiAgICAgIG1hc2suYXBwZW5kKHVzZSk7XG4gICAgICB1c2Uuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBgIyR7cGF0aElkfWApO1xuICAgICAgdXNlLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcIm5vbmVcIik7XG4gICAgICB1c2Uuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcImJsYWNrXCIpO1xuICAgICAgdXNlLnNldEF0dHJpYnV0ZShcImZpbGwtcnVsZVwiLCBcIm5vbnplcm9cIik7XG4gICAgICB1c2UuY2xhc3NMaXN0LmFkZChcIm1hc2tcIik7XG4gICAgfVxuICAgIGNvbnN0IHVzZTEgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInVzZVwiKTtcbiAgICByb290LmFwcGVuZCh1c2UxKTtcbiAgICB1c2UxLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgYCMke3BhdGhJZH1gKTtcbiAgICBpZiAobWFza0lkKSB7XG4gICAgICB1c2UxLnNldEF0dHJpYnV0ZShcIm1hc2tcIiwgYHVybCgjJHttYXNrSWR9KWApO1xuICAgIH1cbiAgICBjb25zdCB1c2UyID0gdXNlMS5jbG9uZU5vZGUoKTtcbiAgICByb290LmFwcGVuZCh1c2UyKTtcbiAgICB1c2UxLmNsYXNzTGlzdC5hZGQoXCJtYWluT3V0bGluZVwiKTtcbiAgICB1c2UyLmNsYXNzTGlzdC5hZGQoXCJzZWNvbmRhcnlPdXRsaW5lXCIpO1xuICAgIHRoaXMuI21hcHBpbmcuc2V0KGlkLCByb290KTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cbiAgZmluYWxpemVMaW5lKGlkLCBsaW5lKSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuI3RvVXBkYXRlLmdldChpZCk7XG4gICAgdGhpcy4jdG9VcGRhdGUuZGVsZXRlKGlkKTtcbiAgICB0aGlzLnVwZGF0ZUJveChpZCwgbGluZS5ib3gpO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKFwiZFwiLCBsaW5lLnRvU1ZHUGF0aCgpKTtcbiAgfVxuICB1cGRhdGVMaW5lKGlkLCBsaW5lKSB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuI21hcHBpbmcuZ2V0KGlkKTtcbiAgICBjb25zdCBkZWZzID0gcm9vdC5maXJzdENoaWxkO1xuICAgIGNvbnN0IHBhdGggPSBkZWZzLmZpcnN0Q2hpbGQ7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIGxpbmUudG9TVkdQYXRoKCkpO1xuICB9XG4gIHJlbW92ZUZyZWVIaWdobGlnaHQoaWQpIHtcbiAgICB0aGlzLnJlbW92ZShpZCk7XG4gICAgdGhpcy4jdG9VcGRhdGUuZGVsZXRlKGlkKTtcbiAgfVxuICB1cGRhdGVQYXRoKGlkLCBsaW5lKSB7XG4gICAgdGhpcy4jdG9VcGRhdGUuZ2V0KGlkKS5zZXRBdHRyaWJ1dGUoXCJkXCIsIGxpbmUudG9TVkdQYXRoKCkpO1xuICB9XG4gIHVwZGF0ZUJveChpZCwgYm94KSB7XG4gICAgRHJhd0xheWVyLiNzZXRCb3godGhpcy4jbWFwcGluZy5nZXQoaWQpLCBib3gpO1xuICB9XG4gIHNob3coaWQsIHZpc2libGUpIHtcbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkuY2xhc3NMaXN0LnRvZ2dsZShcImhpZGRlblwiLCAhdmlzaWJsZSk7XG4gIH1cbiAgcm90YXRlKGlkLCBhbmdsZSkge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5zZXRBdHRyaWJ1dGUoXCJkYXRhLW1haW4tcm90YXRpb25cIiwgYW5nbGUpO1xuICB9XG4gIGNoYW5nZUNvbG9yKGlkLCBjb2xvcikge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIGNvbG9yKTtcbiAgfVxuICBjaGFuZ2VPcGFjaXR5KGlkLCBvcGFjaXR5KSB7XG4gICAgdGhpcy4jbWFwcGluZy5nZXQoaWQpLnNldEF0dHJpYnV0ZShcImZpbGwtb3BhY2l0eVwiLCBvcGFjaXR5KTtcbiAgfVxuICBhZGRDbGFzcyhpZCwgY2xhc3NOYW1lKSB7XG4gICAgdGhpcy4jbWFwcGluZy5nZXQoaWQpLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxuICByZW1vdmVDbGFzcyhpZCwgY2xhc3NOYW1lKSB7XG4gICAgdGhpcy4jbWFwcGluZy5nZXQoaWQpLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgfVxuICByZW1vdmUoaWQpIHtcbiAgICBpZiAodGhpcy4jcGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5yZW1vdmUoKTtcbiAgICB0aGlzLiNtYXBwaW5nLmRlbGV0ZShpZCk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLiNwYXJlbnQgPSBudWxsO1xuICAgIGZvciAoY29uc3Qgcm9vdCBvZiB0aGlzLiNtYXBwaW5nLnZhbHVlcygpKSB7XG4gICAgICByb290LnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLiNtYXBwaW5nLmNsZWFyKCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3BkZi5qc1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgcGRmanNWZXJzaW9uID0gXCI0LjQuMTY4XCI7XG5jb25zdCBwZGZqc0J1aWxkID0gXCIxOWZiYzg5OThcIjtcblxudmFyIF9fd2VicGFja19leHBvcnRzX19BYm9ydEV4Y2VwdGlvbiA9IF9fd2VicGFja19leHBvcnRzX18uQWJvcnRFeGNlcHRpb247XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JMYXllciA9IF9fd2VicGFja19leHBvcnRzX18uQW5ub3RhdGlvbkVkaXRvckxheWVyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSA9IF9fd2VicGFja19leHBvcnRzX18uQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGU7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JUeXBlID0gX193ZWJwYWNrX2V4cG9ydHNfXy5Bbm5vdGF0aW9uRWRpdG9yVHlwZTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciA9IF9fd2VicGFja19leHBvcnRzX18uQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkxheWVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5Bbm5vdGF0aW9uTGF5ZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25Nb2RlID0gX193ZWJwYWNrX2V4cG9ydHNfXy5Bbm5vdGF0aW9uTW9kZTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fQ01hcENvbXByZXNzaW9uVHlwZSA9IF9fd2VicGFja19leHBvcnRzX18uQ01hcENvbXByZXNzaW9uVHlwZTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fQ29sb3JQaWNrZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkNvbG9yUGlja2VyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19ET01TVkdGYWN0b3J5ID0gX193ZWJwYWNrX2V4cG9ydHNfXy5ET01TVkdGYWN0b3J5O1xudmFyIF9fd2VicGFja19leHBvcnRzX19EcmF3TGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkRyYXdMYXllcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fRmVhdHVyZVRlc3QgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkZlYXR1cmVUZXN0O1xudmFyIF9fd2VicGFja19leHBvcnRzX19HbG9iYWxXb3JrZXJPcHRpb25zID0gX193ZWJwYWNrX2V4cG9ydHNfXy5HbG9iYWxXb3JrZXJPcHRpb25zO1xudmFyIF9fd2VicGFja19leHBvcnRzX19JbWFnZUtpbmQgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkltYWdlS2luZDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fSW52YWxpZFBERkV4Y2VwdGlvbiA9IF9fd2VicGFja19leHBvcnRzX18uSW52YWxpZFBERkV4Y2VwdGlvbjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fTWlzc2luZ1BERkV4Y2VwdGlvbiA9IF9fd2VicGFja19leHBvcnRzX18uTWlzc2luZ1BERkV4Y2VwdGlvbjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fT1BTID0gX193ZWJwYWNrX2V4cG9ydHNfXy5PUFM7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX091dGxpbmVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5PdXRsaW5lcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fUERGRGF0YVJhbmdlVHJhbnNwb3J0ID0gX193ZWJwYWNrX2V4cG9ydHNfXy5QREZEYXRhUmFuZ2VUcmFuc3BvcnQ7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1BERkRhdGVTdHJpbmcgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlBERkRhdGVTdHJpbmc7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1BERldvcmtlciA9IF9fd2VicGFja19leHBvcnRzX18uUERGV29ya2VyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19QYXNzd29yZFJlc3BvbnNlcyA9IF9fd2VicGFja19leHBvcnRzX18uUGFzc3dvcmRSZXNwb25zZXM7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1Blcm1pc3Npb25GbGFnID0gX193ZWJwYWNrX2V4cG9ydHNfXy5QZXJtaXNzaW9uRmxhZztcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fUGl4ZWxzUGVySW5jaCA9IF9fd2VicGFja19leHBvcnRzX18uUGl4ZWxzUGVySW5jaDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gX193ZWJwYWNrX2V4cG9ydHNfXy5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb247XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1RleHRMYXllciA9IF9fd2VicGFja19leHBvcnRzX18uVGV4dExheWVyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fVXRpbCA9IF9fd2VicGFja19leHBvcnRzX18uVXRpbDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fVmVyYm9zaXR5TGV2ZWwgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlZlcmJvc2l0eUxldmVsO1xudmFyIF9fd2VicGFja19leHBvcnRzX19YZmFMYXllciA9IF9fd2VicGFja19leHBvcnRzX18uWGZhTGF5ZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2J1aWxkID0gX193ZWJwYWNrX2V4cG9ydHNfXy5idWlsZDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCA9IF9fd2VicGFja19leHBvcnRzX18uY3JlYXRlVmFsaWRBYnNvbHV0ZVVybDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fZmV0Y2hEYXRhID0gX193ZWJwYWNrX2V4cG9ydHNfXy5mZXRjaERhdGE7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2dldERvY3VtZW50ID0gX193ZWJwYWNrX2V4cG9ydHNfXy5nZXREb2N1bWVudDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0RmlsZW5hbWVGcm9tVXJsID0gX193ZWJwYWNrX2V4cG9ydHNfXy5nZXRGaWxlbmFtZUZyb21Vcmw7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2dldFBkZkZpbGVuYW1lRnJvbVVybCA9IF9fd2VicGFja19leHBvcnRzX18uZ2V0UGRmRmlsZW5hbWVGcm9tVXJsO1xudmFyIF9fd2VicGFja19leHBvcnRzX19nZXRYZmFQYWdlVmlld3BvcnQgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmdldFhmYVBhZ2VWaWV3cG9ydDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19faXNEYXRhU2NoZW1lID0gX193ZWJwYWNrX2V4cG9ydHNfXy5pc0RhdGFTY2hlbWU7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2lzUGRmRmlsZSA9IF9fd2VicGFja19leHBvcnRzX18uaXNQZGZGaWxlO1xudmFyIF9fd2VicGFja19leHBvcnRzX19ub0NvbnRleHRNZW51ID0gX193ZWJwYWNrX2V4cG9ydHNfXy5ub0NvbnRleHRNZW51O1xudmFyIF9fd2VicGFja19leHBvcnRzX19ub3JtYWxpemVVbmljb2RlID0gX193ZWJwYWNrX2V4cG9ydHNfXy5ub3JtYWxpemVVbmljb2RlO1xudmFyIF9fd2VicGFja19leHBvcnRzX19yZW5kZXJUZXh0TGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLnJlbmRlclRleHRMYXllcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fc2V0TGF5ZXJEaW1lbnNpb25zID0gX193ZWJwYWNrX2V4cG9ydHNfXy5zZXRMYXllckRpbWVuc2lvbnM7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX3NoYWRvdyA9IF9fd2VicGFja19leHBvcnRzX18uc2hhZG93O1xudmFyIF9fd2VicGFja19leHBvcnRzX191cGRhdGVUZXh0TGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLnVwZGF0ZVRleHRMYXllcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fdmVyc2lvbiA9IF9fd2VicGFja19leHBvcnRzX18udmVyc2lvbjtcbmV4cG9ydCB7IF9fd2VicGFja19leHBvcnRzX19BYm9ydEV4Y2VwdGlvbiBhcyBBYm9ydEV4Y2VwdGlvbiwgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JMYXllciBhcyBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIsIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSBhcyBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSwgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JUeXBlIGFzIEFubm90YXRpb25FZGl0b3JUeXBlLCBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciBhcyBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLCBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkxheWVyIGFzIEFubm90YXRpb25MYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25Nb2RlIGFzIEFubm90YXRpb25Nb2RlLCBfX3dlYnBhY2tfZXhwb3J0c19fQ01hcENvbXByZXNzaW9uVHlwZSBhcyBDTWFwQ29tcHJlc3Npb25UeXBlLCBfX3dlYnBhY2tfZXhwb3J0c19fQ29sb3JQaWNrZXIgYXMgQ29sb3JQaWNrZXIsIF9fd2VicGFja19leHBvcnRzX19ET01TVkdGYWN0b3J5IGFzIERPTVNWR0ZhY3RvcnksIF9fd2VicGFja19leHBvcnRzX19EcmF3TGF5ZXIgYXMgRHJhd0xheWVyLCBfX3dlYnBhY2tfZXhwb3J0c19fRmVhdHVyZVRlc3QgYXMgRmVhdHVyZVRlc3QsIF9fd2VicGFja19leHBvcnRzX19HbG9iYWxXb3JrZXJPcHRpb25zIGFzIEdsb2JhbFdvcmtlck9wdGlvbnMsIF9fd2VicGFja19leHBvcnRzX19JbWFnZUtpbmQgYXMgSW1hZ2VLaW5kLCBfX3dlYnBhY2tfZXhwb3J0c19fSW52YWxpZFBERkV4Y2VwdGlvbiBhcyBJbnZhbGlkUERGRXhjZXB0aW9uLCBfX3dlYnBhY2tfZXhwb3J0c19fTWlzc2luZ1BERkV4Y2VwdGlvbiBhcyBNaXNzaW5nUERGRXhjZXB0aW9uLCBfX3dlYnBhY2tfZXhwb3J0c19fT1BTIGFzIE9QUywgX193ZWJwYWNrX2V4cG9ydHNfX091dGxpbmVyIGFzIE91dGxpbmVyLCBfX3dlYnBhY2tfZXhwb3J0c19fUERGRGF0YVJhbmdlVHJhbnNwb3J0IGFzIFBERkRhdGFSYW5nZVRyYW5zcG9ydCwgX193ZWJwYWNrX2V4cG9ydHNfX1BERkRhdGVTdHJpbmcgYXMgUERGRGF0ZVN0cmluZywgX193ZWJwYWNrX2V4cG9ydHNfX1BERldvcmtlciBhcyBQREZXb3JrZXIsIF9fd2VicGFja19leHBvcnRzX19QYXNzd29yZFJlc3BvbnNlcyBhcyBQYXNzd29yZFJlc3BvbnNlcywgX193ZWJwYWNrX2V4cG9ydHNfX1Blcm1pc3Npb25GbGFnIGFzIFBlcm1pc3Npb25GbGFnLCBfX3dlYnBhY2tfZXhwb3J0c19fUGl4ZWxzUGVySW5jaCBhcyBQaXhlbHNQZXJJbmNoLCBfX3dlYnBhY2tfZXhwb3J0c19fUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGFzIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiwgX193ZWJwYWNrX2V4cG9ydHNfX1RleHRMYXllciBhcyBUZXh0TGF5ZXIsIF9fd2VicGFja19leHBvcnRzX19VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gYXMgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uLCBfX3dlYnBhY2tfZXhwb3J0c19fVXRpbCBhcyBVdGlsLCBfX3dlYnBhY2tfZXhwb3J0c19fVmVyYm9zaXR5TGV2ZWwgYXMgVmVyYm9zaXR5TGV2ZWwsIF9fd2VicGFja19leHBvcnRzX19YZmFMYXllciBhcyBYZmFMYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX2J1aWxkIGFzIGJ1aWxkLCBfX3dlYnBhY2tfZXhwb3J0c19fY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCBhcyBjcmVhdGVWYWxpZEFic29sdXRlVXJsLCBfX3dlYnBhY2tfZXhwb3J0c19fZmV0Y2hEYXRhIGFzIGZldGNoRGF0YSwgX193ZWJwYWNrX2V4cG9ydHNfX2dldERvY3VtZW50IGFzIGdldERvY3VtZW50LCBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0RmlsZW5hbWVGcm9tVXJsIGFzIGdldEZpbGVuYW1lRnJvbVVybCwgX193ZWJwYWNrX2V4cG9ydHNfX2dldFBkZkZpbGVuYW1lRnJvbVVybCBhcyBnZXRQZGZGaWxlbmFtZUZyb21VcmwsIF9fd2VicGFja19leHBvcnRzX19nZXRYZmFQYWdlVmlld3BvcnQgYXMgZ2V0WGZhUGFnZVZpZXdwb3J0LCBfX3dlYnBhY2tfZXhwb3J0c19faXNEYXRhU2NoZW1lIGFzIGlzRGF0YVNjaGVtZSwgX193ZWJwYWNrX2V4cG9ydHNfX2lzUGRmRmlsZSBhcyBpc1BkZkZpbGUsIF9fd2VicGFja19leHBvcnRzX19ub0NvbnRleHRNZW51IGFzIG5vQ29udGV4dE1lbnUsIF9fd2VicGFja19leHBvcnRzX19ub3JtYWxpemVVbmljb2RlIGFzIG5vcm1hbGl6ZVVuaWNvZGUsIF9fd2VicGFja19leHBvcnRzX19yZW5kZXJUZXh0TGF5ZXIgYXMgcmVuZGVyVGV4dExheWVyLCBfX3dlYnBhY2tfZXhwb3J0c19fc2V0TGF5ZXJEaW1lbnNpb25zIGFzIHNldExheWVyRGltZW5zaW9ucywgX193ZWJwYWNrX2V4cG9ydHNfX3NoYWRvdyBhcyBzaGFkb3csIF9fd2VicGFja19leHBvcnRzX191cGRhdGVUZXh0TGF5ZXIgYXMgdXBkYXRlVGV4dExheWVyLCBfX3dlYnBhY2tfZXhwb3J0c19fdmVyc2lvbiBhcyB2ZXJzaW9uIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBkZi5tanMubWFwIiwiaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gJy4vdXRpbHMvanNfdXRpbHMuanMnO1xuZXhwb3J0IGNvbnN0IGlzRmlyZWZveCA9IG1lbW9pemUoKCk9Pi9maXJlZm94L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KVxuKTtcbmV4cG9ydCBjb25zdCBpc1NhZmFyaSA9IG1lbW9pemUoKCk9PkJvb2xlYW4od2luZG93LnNhZmFyaSlcbik7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJEZXRlY3Rvci5qcy5tYXAiLCJpbXBvcnQgeyB1bmlvbiwgd2l0aG91dCB9IGZyb20gJy4vdXRpbHMvanNfdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIEVudGVyTGVhdmVDb3VudGVyIHtcbiAgICBlbnRlcihlbnRlcmluZ05vZGUpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMZW5ndGggPSB0aGlzLmVudGVyZWQubGVuZ3RoO1xuICAgICAgICBjb25zdCBpc05vZGVFbnRlcmVkID0gKG5vZGUpPT50aGlzLmlzTm9kZUluRG9jdW1lbnQobm9kZSkgJiYgKCFub2RlLmNvbnRhaW5zIHx8IG5vZGUuY29udGFpbnMoZW50ZXJpbmdOb2RlKSlcbiAgICAgICAgO1xuICAgICAgICB0aGlzLmVudGVyZWQgPSB1bmlvbih0aGlzLmVudGVyZWQuZmlsdGVyKGlzTm9kZUVudGVyZWQpLCBbXG4gICAgICAgICAgICBlbnRlcmluZ05vZGVcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBwcmV2aW91c0xlbmd0aCA9PT0gMCAmJiB0aGlzLmVudGVyZWQubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgbGVhdmUobGVhdmluZ05vZGUpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMZW5ndGggPSB0aGlzLmVudGVyZWQubGVuZ3RoO1xuICAgICAgICB0aGlzLmVudGVyZWQgPSB3aXRob3V0KHRoaXMuZW50ZXJlZC5maWx0ZXIodGhpcy5pc05vZGVJbkRvY3VtZW50KSwgbGVhdmluZ05vZGUpO1xuICAgICAgICByZXR1cm4gcHJldmlvdXNMZW5ndGggPiAwICYmIHRoaXMuZW50ZXJlZC5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmVudGVyZWQgPSBbXTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoaXNOb2RlSW5Eb2N1bWVudCl7XG4gICAgICAgIHRoaXMuZW50ZXJlZCA9IFtdO1xuICAgICAgICB0aGlzLmlzTm9kZUluRG9jdW1lbnQgPSBpc05vZGVJbkRvY3VtZW50O1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RW50ZXJMZWF2ZUNvdW50ZXIuanMubWFwIiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICAgICAgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uKHN5bSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmltcG9ydCB7IEVudGVyTGVhdmVDb3VudGVyIH0gZnJvbSAnLi9FbnRlckxlYXZlQ291bnRlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVOYXRpdmVEcmFnU291cmNlLCBtYXRjaE5hdGl2ZUl0ZW1UeXBlIH0gZnJvbSAnLi9OYXRpdmVEcmFnU291cmNlcy9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyBOYXRpdmVUeXBlcyBmcm9tICcuL05hdGl2ZVR5cGVzLmpzJztcbmltcG9ydCB7IGdldERyYWdQcmV2aWV3T2Zmc2V0LCBnZXRFdmVudENsaWVudE9mZnNldCwgZ2V0Tm9kZUNsaWVudE9mZnNldCB9IGZyb20gJy4vT2Zmc2V0VXRpbHMuanMnO1xuaW1wb3J0IHsgT3B0aW9uc1JlYWRlciB9IGZyb20gJy4vT3B0aW9uc1JlYWRlci5qcyc7XG5leHBvcnQgY2xhc3MgSFRNTDVCYWNrZW5kSW1wbCB7XG4gICAgLyoqXG5cdCAqIEdlbmVyYXRlIHByb2ZpbGluZyBzdGF0aXN0aWNzIGZvciB0aGUgSFRNTDVCYWNrZW5kLlxuXHQgKi8gcHJvZmlsZSgpIHtcbiAgICAgICAgdmFyIHJlZiwgcmVmMTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZVByZXZpZXdOb2RlczogdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZXMuc2l6ZSxcbiAgICAgICAgICAgIHNvdXJjZVByZXZpZXdOb2RlT3B0aW9uczogdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMuc2l6ZSxcbiAgICAgICAgICAgIHNvdXJjZU5vZGVPcHRpb25zOiB0aGlzLnNvdXJjZU5vZGVPcHRpb25zLnNpemUsXG4gICAgICAgICAgICBzb3VyY2VOb2RlczogdGhpcy5zb3VyY2VOb2Rlcy5zaXplLFxuICAgICAgICAgICAgZHJhZ1N0YXJ0U291cmNlSWRzOiAoKHJlZiA9IHRoaXMuZHJhZ1N0YXJ0U291cmNlSWRzKSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5sZW5ndGgpIHx8IDAsXG4gICAgICAgICAgICBkcm9wVGFyZ2V0SWRzOiB0aGlzLmRyb3BUYXJnZXRJZHMubGVuZ3RoLFxuICAgICAgICAgICAgZHJhZ0VudGVyVGFyZ2V0SWRzOiB0aGlzLmRyYWdFbnRlclRhcmdldElkcy5sZW5ndGgsXG4gICAgICAgICAgICBkcmFnT3ZlclRhcmdldElkczogKChyZWYxID0gdGhpcy5kcmFnT3ZlclRhcmdldElkcykgPT09IG51bGwgfHwgcmVmMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmMS5sZW5ndGgpIHx8IDBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gcHVibGljIGZvciB0ZXN0XG4gICAgZ2V0IHdpbmRvdygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53aW5kb3c7XG4gICAgfVxuICAgIGdldCBkb2N1bWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5kb2N1bWVudDtcbiAgICB9XG4gICAgLyoqXG5cdCAqIEdldCB0aGUgcm9vdCBlbGVtZW50IHRvIHVzZSBmb3IgZXZlbnQgc3Vic2NyaXB0aW9uc1xuXHQgKi8gZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJvb3RFbGVtZW50O1xuICAgIH1cbiAgICBzZXR1cCgpIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdEVsZW1lbnQ7XG4gICAgICAgIGlmIChyb290ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm9vdC5fX2lzUmVhY3REbmRCYWNrZW5kU2V0VXApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgdHdvIEhUTUw1IGJhY2tlbmRzIGF0IHRoZSBzYW1lIHRpbWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5fX2lzUmVhY3REbmRCYWNrZW5kU2V0VXAgPSB0cnVlO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKHJvb3QpO1xuICAgIH1cbiAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdEVsZW1lbnQ7XG4gICAgICAgIGlmIChyb290ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByb290Ll9faXNSZWFjdERuZEJhY2tlbmRTZXRVcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMucm9vdEVsZW1lbnQpO1xuICAgICAgICB0aGlzLmNsZWFyQ3VycmVudERyYWdTb3VyY2VOb2RlKCk7XG4gICAgICAgIGlmICh0aGlzLmFzeW5jRW5kRHJhZ0ZyYW1lSWQpIHtcbiAgICAgICAgICAgIHZhciByZWY7XG4gICAgICAgICAgICAocmVmID0gdGhpcy53aW5kb3cpID09PSBudWxsIHx8IHJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYXN5bmNFbmREcmFnRnJhbWVJZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29ubmVjdERyYWdQcmV2aWV3KHNvdXJjZUlkLCBub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc291cmNlUHJldmlld05vZGVPcHRpb25zLnNldChzb3VyY2VJZCwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc291cmNlUHJldmlld05vZGVzLnNldChzb3VyY2VJZCwgbm9kZSk7XG4gICAgICAgIHJldHVybiAoKT0+e1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZXMuZGVsZXRlKHNvdXJjZUlkKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlUHJldmlld05vZGVPcHRpb25zLmRlbGV0ZShzb3VyY2VJZCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbm5lY3REcmFnU291cmNlKHNvdXJjZUlkLCBub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc291cmNlTm9kZXMuc2V0KHNvdXJjZUlkLCBub2RlKTtcbiAgICAgICAgdGhpcy5zb3VyY2VOb2RlT3B0aW9ucy5zZXQoc291cmNlSWQsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBoYW5kbGVEcmFnU3RhcnQgPSAoZSk9PnRoaXMuaGFuZGxlRHJhZ1N0YXJ0KGUsIHNvdXJjZUlkKVxuICAgICAgICA7XG4gICAgICAgIGNvbnN0IGhhbmRsZVNlbGVjdFN0YXJ0ID0gKGUpPT50aGlzLmhhbmRsZVNlbGVjdFN0YXJ0KGUpXG4gICAgICAgIDtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIGhhbmRsZVNlbGVjdFN0YXJ0KTtcbiAgICAgICAgcmV0dXJuICgpPT57XG4gICAgICAgICAgICB0aGlzLnNvdXJjZU5vZGVzLmRlbGV0ZShzb3VyY2VJZCk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZU5vZGVPcHRpb25zLmRlbGV0ZShzb3VyY2VJZCk7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIGhhbmRsZURyYWdTdGFydCk7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0JywgaGFuZGxlU2VsZWN0U3RhcnQpO1xuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsICdmYWxzZScpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25uZWN0RHJvcFRhcmdldCh0YXJnZXRJZCwgbm9kZSkge1xuICAgICAgICBjb25zdCBoYW5kbGVEcmFnRW50ZXIgPSAoZSk9PnRoaXMuaGFuZGxlRHJhZ0VudGVyKGUsIHRhcmdldElkKVxuICAgICAgICA7XG4gICAgICAgIGNvbnN0IGhhbmRsZURyYWdPdmVyID0gKGUpPT50aGlzLmhhbmRsZURyYWdPdmVyKGUsIHRhcmdldElkKVxuICAgICAgICA7XG4gICAgICAgIGNvbnN0IGhhbmRsZURyb3AgPSAoZSk9PnRoaXMuaGFuZGxlRHJvcChlLCB0YXJnZXRJZClcbiAgICAgICAgO1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIGhhbmRsZURyYWdFbnRlcik7XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBoYW5kbGVEcmFnT3Zlcik7XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGhhbmRsZURyb3ApO1xuICAgICAgICByZXR1cm4gKCk9PntcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgaGFuZGxlRHJhZ0VudGVyKTtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBoYW5kbGVEcmFnT3Zlcik7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBoYW5kbGVEcm9wKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYWRkRXZlbnRMaXN0ZW5lcnModGFyZ2V0KSB7XG4gICAgICAgIC8vIFNTUiBGaXggKGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kbmQvcmVhY3QtZG5kL3B1bGwvODEzXG4gICAgICAgIGlmICghdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVUb3BEcmFnU3RhcnQpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVUb3BEcmFnU3RhcnRDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLmhhbmRsZVRvcERyYWdFbmRDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuaGFuZGxlVG9wRHJhZ0VudGVyKTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuaGFuZGxlVG9wRHJhZ0VudGVyQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLmhhbmRsZVRvcERyYWdMZWF2ZUNhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZVRvcERyYWdPdmVyKTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5oYW5kbGVUb3BEcmFnT3ZlckNhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuaGFuZGxlVG9wRHJvcCk7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5oYW5kbGVUb3BEcm9wQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKHRhcmdldCkge1xuICAgICAgICAvLyBTU1IgRml4IChodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZG5kL3JlYWN0LWRuZC9wdWxsLzgxM1xuICAgICAgICBpZiAoIXRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlVG9wRHJhZ1N0YXJ0KTtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlVG9wRHJhZ1N0YXJ0Q2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVUb3BEcmFnRW5kQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmhhbmRsZVRvcERyYWdFbnRlcik7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmhhbmRsZVRvcERyYWdFbnRlckNhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5oYW5kbGVUb3BEcmFnTGVhdmVDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5oYW5kbGVUb3BEcmFnT3Zlcik7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlVG9wRHJhZ092ZXJDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmhhbmRsZVRvcERyb3ApO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuaGFuZGxlVG9wRHJvcENhcHR1cmUsIHRydWUpO1xuICAgIH1cbiAgICBnZXRDdXJyZW50U291cmNlTm9kZU9wdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gdGhpcy5tb25pdG9yLmdldFNvdXJjZUlkKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZU5vZGVPcHRpb25zID0gdGhpcy5zb3VyY2VOb2RlT3B0aW9ucy5nZXQoc291cmNlSWQpO1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgICBkcm9wRWZmZWN0OiB0aGlzLmFsdEtleVByZXNzZWQgPyAnY29weScgOiAnbW92ZSdcbiAgICAgICAgfSwgc291cmNlTm9kZU9wdGlvbnMgfHwge30pO1xuICAgIH1cbiAgICBnZXRDdXJyZW50RHJvcEVmZmVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZ05hdGl2ZUl0ZW0oKSkge1xuICAgICAgICAgICAgLy8gSXQgbWFrZXMgbW9yZSBzZW5zZSB0byBkZWZhdWx0IHRvICdjb3B5JyBmb3IgbmF0aXZlIHJlc291cmNlc1xuICAgICAgICAgICAgcmV0dXJuICdjb3B5JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50U291cmNlTm9kZU9wdGlvbnMoKS5kcm9wRWZmZWN0O1xuICAgIH1cbiAgICBnZXRDdXJyZW50U291cmNlUHJldmlld05vZGVPcHRpb25zKCkge1xuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IHRoaXMubW9uaXRvci5nZXRTb3VyY2VJZCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMgPSB0aGlzLnNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucy5nZXQoc291cmNlSWQpO1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgICBhbmNob3JYOiAwLjUsXG4gICAgICAgICAgICBhbmNob3JZOiAwLjUsXG4gICAgICAgICAgICBjYXB0dXJlRHJhZ2dpbmdTdGF0ZTogZmFsc2VcbiAgICAgICAgfSwgc291cmNlUHJldmlld05vZGVPcHRpb25zIHx8IHt9KTtcbiAgICB9XG4gICAgaXNEcmFnZ2luZ05hdGl2ZUl0ZW0oKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gdGhpcy5tb25pdG9yLmdldEl0ZW1UeXBlKCk7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhOYXRpdmVUeXBlcykuc29tZSgoa2V5KT0+TmF0aXZlVHlwZXNba2V5XSA9PT0gaXRlbVR5cGVcbiAgICAgICAgKTtcbiAgICB9XG4gICAgYmVnaW5EcmFnTmF0aXZlSXRlbSh0eXBlLCBkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgdGhpcy5jbGVhckN1cnJlbnREcmFnU291cmNlTm9kZSgpO1xuICAgICAgICB0aGlzLmN1cnJlbnROYXRpdmVTb3VyY2UgPSBjcmVhdGVOYXRpdmVEcmFnU291cmNlKHR5cGUsIGRhdGFUcmFuc2Zlcik7XG4gICAgICAgIHRoaXMuY3VycmVudE5hdGl2ZUhhbmRsZSA9IHRoaXMucmVnaXN0cnkuYWRkU291cmNlKHR5cGUsIHRoaXMuY3VycmVudE5hdGl2ZVNvdXJjZSk7XG4gICAgICAgIHRoaXMuYWN0aW9ucy5iZWdpbkRyYWcoW1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TmF0aXZlSGFuZGxlXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBzZXRDdXJyZW50RHJhZ1NvdXJjZU5vZGUobm9kZSkge1xuICAgICAgICB0aGlzLmNsZWFyQ3VycmVudERyYWdTb3VyY2VOb2RlKCk7XG4gICAgICAgIHRoaXMuY3VycmVudERyYWdTb3VyY2VOb2RlID0gbm9kZTtcbiAgICAgICAgLy8gQSB0aW1lb3V0IG9mID4gMCBpcyBuZWNlc3NhcnkgdG8gcmVzb2x2ZSBGaXJlZm94IGlzc3VlIHJlZmVyZW5jZWRcbiAgICAgICAgLy8gU2VlOlxuICAgICAgICAvLyAgICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRuZC9yZWFjdC1kbmQvcHVsbC85MjhcbiAgICAgICAgLy8gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kbmQvcmVhY3QtZG5kL2lzc3Vlcy84NjlcbiAgICAgICAgY29uc3QgTU9VU0VfTU9WRV9USU1FT1VUID0gMTAwMDtcbiAgICAgICAgLy8gUmVjZWl2aW5nIGEgbW91c2UgZXZlbnQgaW4gdGhlIG1pZGRsZSBvZiBhIGRyYWdnaW5nIG9wZXJhdGlvblxuICAgICAgICAvLyBtZWFucyBpdCBoYXMgZW5kZWQgYW5kIHRoZSBkcmFnIHNvdXJjZSBub2RlIGRpc2FwcGVhcmVkIGZyb20gRE9NLFxuICAgICAgICAvLyBzbyB0aGUgYnJvd3NlciBkaWRuJ3QgZGlzcGF0Y2ggdGhlIGRyYWdlbmQgZXZlbnQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBiZWZvcmUgd2Ugc3RhcnQgbGlzdGVuaW5nIGZvciBtb3VzZW1vdmUgZXZlbnRzLlxuICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBkcmFnIHByZXZpZXcgbmVlZHMgdG8gYmUgZHJhd24gb3IgZWxzZSBpdCBmaXJlcyBhbiAnbW91c2Vtb3ZlJyBldmVudFxuICAgICAgICAvLyBpbW1lZGlhdGVseSBpbiBzb21lIGJyb3dzZXJzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWU6XG4gICAgICAgIC8vICAgKiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZG5kL3JlYWN0LWRuZC9wdWxsLzkyOFxuICAgICAgICAvLyAgICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRuZC9yZWFjdC1kbmQvaXNzdWVzLzg2OVxuICAgICAgICAvL1xuICAgICAgICB0aGlzLm1vdXNlTW92ZVRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICAgIHZhciByZWY7XG4gICAgICAgICAgICByZXR1cm4gKHJlZiA9IHRoaXMucm9vdEVsZW1lbnQpID09PSBudWxsIHx8IHJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZW5kRHJhZ0lmU291cmNlV2FzUmVtb3ZlZEZyb21ET00sIHRydWUpO1xuICAgICAgICB9LCBNT1VTRV9NT1ZFX1RJTUVPVVQpO1xuICAgIH1cbiAgICBjbGVhckN1cnJlbnREcmFnU291cmNlTm9kZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERyYWdTb3VyY2VOb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnREcmFnU291cmNlTm9kZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5yb290RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciByZWY7XG4gICAgICAgICAgICAgICAgKHJlZiA9IHRoaXMud2luZG93KSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5jbGVhclRpbWVvdXQodGhpcy5tb3VzZU1vdmVUaW1lb3V0VGltZXIgfHwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZW5kRHJhZ0lmU291cmNlV2FzUmVtb3ZlZEZyb21ET00sIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tb3VzZU1vdmVUaW1lb3V0VGltZXIgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBoYW5kbGVEcmFnU3RhcnQoZSwgc291cmNlSWQpIHtcbiAgICAgICAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kcmFnU3RhcnRTb3VyY2VJZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXJ0U291cmNlSWRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcmFnU3RhcnRTb3VyY2VJZHMudW5zaGlmdChzb3VyY2VJZCk7XG4gICAgfVxuICAgIGhhbmRsZURyYWdFbnRlcihfZSwgdGFyZ2V0SWQpIHtcbiAgICAgICAgdGhpcy5kcmFnRW50ZXJUYXJnZXRJZHMudW5zaGlmdCh0YXJnZXRJZCk7XG4gICAgfVxuICAgIGhhbmRsZURyYWdPdmVyKF9lLCB0YXJnZXRJZCkge1xuICAgICAgICBpZiAodGhpcy5kcmFnT3ZlclRhcmdldElkcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kcmFnT3ZlclRhcmdldElkcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHJhZ092ZXJUYXJnZXRJZHMudW5zaGlmdCh0YXJnZXRJZCk7XG4gICAgfVxuICAgIGhhbmRsZURyb3AoX2UsIHRhcmdldElkKSB7XG4gICAgICAgIHRoaXMuZHJvcFRhcmdldElkcy51bnNoaWZ0KHRhcmdldElkKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IobWFuYWdlciwgZ2xvYmFsQ29udGV4dCwgb3B0aW9ucyl7XG4gICAgICAgIHRoaXMuc291cmNlUHJldmlld05vZGVzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5zb3VyY2VOb2RlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5zb3VyY2VOb2RlT3B0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5kcmFnU3RhcnRTb3VyY2VJZHMgPSBudWxsO1xuICAgICAgICB0aGlzLmRyb3BUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgdGhpcy5kcmFnRW50ZXJUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50TmF0aXZlU291cmNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50TmF0aXZlSGFuZGxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50RHJhZ1NvdXJjZU5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmFsdEtleVByZXNzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb3VzZU1vdmVUaW1lb3V0VGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmFzeW5jRW5kRHJhZ0ZyYW1lSWQgPSBudWxsO1xuICAgICAgICB0aGlzLmRyYWdPdmVyVGFyZ2V0SWRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0Q2xpZW50T2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5ob3ZlclJhZklkID0gbnVsbDtcbiAgICAgICAgdGhpcy5nZXRTb3VyY2VDbGllbnRPZmZzZXQgPSAoc291cmNlSWQpPT57XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnNvdXJjZU5vZGVzLmdldChzb3VyY2VJZCk7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlICYmIGdldE5vZGVDbGllbnRPZmZzZXQoc291cmNlKSB8fCBudWxsO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVuZERyYWdOYXRpdmVJdGVtID0gKCk9PntcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmVuZERyYWcoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnROYXRpdmVIYW5kbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5LnJlbW92ZVNvdXJjZSh0aGlzLmN1cnJlbnROYXRpdmVIYW5kbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TmF0aXZlSGFuZGxlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE5hdGl2ZVNvdXJjZSA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaXNOb2RlSW5Eb2N1bWVudCA9IChub2RlKT0+e1xuICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIG5vZGUgZWl0aGVyIGluIHRoZSBtYWluIGRvY3VtZW50IG9yIGluIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICAgICAgICAgIHJldHVybiBCb29sZWFuKG5vZGUgJiYgdGhpcy5kb2N1bWVudCAmJiB0aGlzLmRvY3VtZW50LmJvZHkgJiYgdGhpcy5kb2N1bWVudC5ib2R5LmNvbnRhaW5zKG5vZGUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbmREcmFnSWZTb3VyY2VXYXNSZW1vdmVkRnJvbURPTSA9ICgpPT57XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50RHJhZ1NvdXJjZU5vZGU7XG4gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsIHx8IHRoaXMuaXNOb2RlSW5Eb2N1bWVudChub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyQ3VycmVudERyYWdTb3VyY2VOb2RlKCkgJiYgdGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5lbmREcmFnKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNhbmNlbEhvdmVyKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2NoZWR1bGVIb3ZlciA9IChkcmFnT3ZlclRhcmdldElkcyk9PntcbiAgICAgICAgICAgIGlmICh0aGlzLmhvdmVyUmFmSWQgPT09IG51bGwgJiYgdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvdmVyUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5ob3ZlcihkcmFnT3ZlclRhcmdldElkcyB8fCBbXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudE9mZnNldDogdGhpcy5sYXN0Q2xpZW50T2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhvdmVyUmFmSWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNhbmNlbEhvdmVyID0gKCk9PntcbiAgICAgICAgICAgIGlmICh0aGlzLmhvdmVyUmFmSWQgIT09IG51bGwgJiYgdHlwZW9mIGNhbmNlbEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuaG92ZXJSYWZJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3ZlclJhZklkID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3BEcmFnU3RhcnRDYXB0dXJlID0gKCk9PntcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDdXJyZW50RHJhZ1NvdXJjZU5vZGUoKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXJ0U291cmNlSWRzID0gW107XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJhZ1N0YXJ0ID0gKGUpPT57XG4gICAgICAgICAgICBpZiAoZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkcmFnU3RhcnRTb3VyY2VJZHMgIH0gPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnRTb3VyY2VJZHMgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgY2xpZW50T2Zmc2V0ID0gZ2V0RXZlbnRDbGllbnRPZmZzZXQoZSk7XG4gICAgICAgICAgICAvLyBBdm9pZCBjcmFzaGluZyBpZiB3ZSBtaXNzZWQgYSBkcm9wIGV2ZW50IG9yIG91ciBwcmV2aW91cyBkcmFnIGRpZWRcbiAgICAgICAgICAgIGlmICh0aGlzLm1vbml0b3IuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmVuZERyYWcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbEhvdmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEb24ndCBwdWJsaXNoIHRoZSBzb3VyY2UganVzdCB5ZXQgKHNlZSB3aHkgYmVsb3cpXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnMuYmVnaW5EcmFnKGRyYWdTdGFydFNvdXJjZUlkcyB8fCBbXSwge1xuICAgICAgICAgICAgICAgIHB1Ymxpc2hTb3VyY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdldFNvdXJjZUNsaWVudE9mZnNldDogdGhpcy5nZXRTb3VyY2VDbGllbnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgY2xpZW50T2Zmc2V0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YVRyYW5zZmVyICB9ID0gZTtcbiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZVR5cGUgPSBtYXRjaE5hdGl2ZUl0ZW1UeXBlKGRhdGFUcmFuc2Zlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhVHJhbnNmZXIgJiYgdHlwZW9mIGRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGN1c3RvbSBkcmFnIGltYWdlIGlmIHVzZXIgc3BlY2lmaWVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBjaGlsZCBkcmFnIHNvdXJjZSByZWZ1c2VzIGRyYWcgYnV0IHBhcmVudCBhZ3JlZXMsXG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSBwYXJlbnQncyBub2RlIGFzIGRyYWcgaW1hZ2UuIE5laXRoZXIgd29ya3MgaW4gSUUgdGhvdWdoLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VJZCA9IHRoaXMubW9uaXRvci5nZXRTb3VyY2VJZCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VOb2RlID0gdGhpcy5zb3VyY2VOb2Rlcy5nZXQoc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkcmFnUHJldmlldyA9IHRoaXMuc291cmNlUHJldmlld05vZGVzLmdldChzb3VyY2VJZCkgfHwgc291cmNlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyYWdQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGFuY2hvclggLCBhbmNob3JZICwgb2Zmc2V0WCAsIG9mZnNldFkgIH0gPSB0aGlzLmdldEN1cnJlbnRTb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvclBvaW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yWVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldFBvaW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdQcmV2aWV3T2Zmc2V0ID0gZ2V0RHJhZ1ByZXZpZXdPZmZzZXQoc291cmNlTm9kZSwgZHJhZ1ByZXZpZXcsIGNsaWVudE9mZnNldCwgYW5jaG9yUG9pbnQsIG9mZnNldFBvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UoZHJhZ1ByZXZpZXcsIGRyYWdQcmV2aWV3T2Zmc2V0LngsIGRyYWdQcmV2aWV3T2Zmc2V0LnkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggd29uJ3QgZHJhZyB3aXRob3V0IHNldHRpbmcgZGF0YVxuICAgICAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXIgPT09IG51bGwgfHwgZGF0YVRyYW5zZmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYXRhVHJhbnNmZXIuc2V0RGF0YSgnYXBwbGljYXRpb24vanNvbicsIHt9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAvLyBJRSBkb2Vzbid0IHN1cHBvcnQgTUlNRSB0eXBlcyBpbiBzZXREYXRhXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFN0b3JlIGRyYWcgc291cmNlIG5vZGUgc28gd2UgY2FuIGNoZWNrIHdoZXRoZXJcbiAgICAgICAgICAgICAgICAvLyBpdCBpcyByZW1vdmVkIGZyb20gRE9NIGFuZCB0cmlnZ2VyIGVuZERyYWcgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDdXJyZW50RHJhZ1NvdXJjZU5vZGUoZS50YXJnZXQpO1xuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBhcmUgcmVhZHkgdG8gcHVibGlzaCB0aGUgZHJhZyBzb3VyY2UuLiBvciBhcmUgd2Ugbm90P1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY2FwdHVyZURyYWdnaW5nU3RhdGUgIH0gPSB0aGlzLmdldEN1cnJlbnRTb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNhcHR1cmVEcmFnZ2luZ1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzdWFsbHkgd2Ugd2FudCB0byBwdWJsaXNoIGl0IGluIHRoZSBuZXh0IHRpY2sgc28gdGhhdCBicm93c2VyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlzIGFibGUgdG8gc2NyZWVuc2hvdCB0aGUgY3VycmVudCAobm90IHlldCBkcmFnZ2luZykgc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIEl0IGFsc28gbmVhdGx5IGF2b2lkcyBhIHNpdHVhdGlvbiB3aGVyZSByZW5kZXIoKSByZXR1cm5zIG51bGxcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIHNhbWUgdGljayBmb3IgdGhlIHNvdXJjZSBlbGVtZW50LCBhbmQgYnJvd3NlciBmcmVha3Mgb3V0LlxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT50aGlzLmFjdGlvbnMucHVibGlzaERyYWdTb3VyY2UoKVxuICAgICAgICAgICAgICAgICAgICAsIDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEluIHNvbWUgY2FzZXMgdGhlIHVzZXIgbWF5IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciwgZS5nLlxuICAgICAgICAgICAgICAgICAgICAvLyB0byB3b3JrIGFyb3VuZCBJRSBub3Qgc3VwcG9ydGluZyBjdXN0b20gZHJhZyBwcmV2aWV3cy5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB1c2luZyBhIGN1c3RvbSBkcmFnIGxheWVyLCB0aGUgb25seSB3YXkgdG8gcHJldmVudFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCBkcmFnIHByZXZpZXcgZnJvbSBkcmF3aW5nIGluIElFIGlzIHRvIHNjcmVlbnNob3RcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRyYWdnaW5nIHN0YXRlIGluIHdoaWNoIHRoZSBub2RlIGl0c2VsZiBoYXMgemVybyBvcGFjaXR5XG4gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBoZWlnaHQuIEluIHRoaXMgY2FzZSwgdGhvdWdoLCByZXR1cm5pbmcgbnVsbCBmcm9tIHJlbmRlcigpXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgYWJydXB0bHkgZW5kIHRoZSBkcmFnZ2luZywgd2hpY2ggaXMgbm90IG9idmlvdXMuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJlYXNvbiBzdWNoIGJlaGF2aW9yIGlzIHN0cmljdGx5IG9wdC1pbi5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLnB1Ymxpc2hEcmFnU291cmNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChuYXRpdmVUeXBlKSB7XG4gICAgICAgICAgICAgICAgLy8gQSBuYXRpdmUgaXRlbSAoc3VjaCBhcyBVUkwpIGRyYWdnZWQgZnJvbSBpbnNpZGUgdGhlIGRvY3VtZW50XG4gICAgICAgICAgICAgICAgdGhpcy5iZWdpbkRyYWdOYXRpdmVJdGVtKG5hdGl2ZVR5cGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHJhbnNmZXIgJiYgIWRhdGFUcmFuc2Zlci50eXBlcyAmJiAoZS50YXJnZXQgJiYgIWUudGFyZ2V0Lmhhc0F0dHJpYnV0ZSB8fCAhZS50YXJnZXQuaGFzQXR0cmlidXRlKCdkcmFnZ2FibGUnKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBMb29rcyBsaWtlIGEgU2FmYXJpIGJ1ZzogZGF0YVRyYW5zZmVyLnR5cGVzIGlzIG51bGwsIGJ1dCB0aGVyZSB3YXMgbm8gZHJhZ2dhYmxlLlxuICAgICAgICAgICAgICAgIC8vIEp1c3QgbGV0IGl0IGRyYWcuIEl0J3MgYSBuYXRpdmUgdHlwZSAoVVJMIG9yIHRleHQpIGFuZCB3aWxsIGJlIHBpY2tlZCB1cCBpblxuICAgICAgICAgICAgICAgIC8vIGRyYWdlbnRlciBoYW5kbGVyLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYnkgdGhpcyB0aW1lIG5vIGRyYWcgc291cmNlIHJlYWN0ZWQsIHRlbGwgYnJvd3NlciBub3QgdG8gZHJhZy5cbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJhZ0VuZENhcHR1cmUgPSAoKT0+e1xuICAgICAgICAgICAgaWYgKHRoaXMuY2xlYXJDdXJyZW50RHJhZ1NvdXJjZU5vZGUoKSAmJiB0aGlzLm1vbml0b3IuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZWZveCBjYW4gZGlzcGF0Y2ggdGhpcyBldmVudCBpbiBhbiBpbmZpbml0ZSBsb29wXG4gICAgICAgICAgICAgICAgLy8gaWYgZHJhZ2VuZCBoYW5kbGVyIGRvZXMgc29tZXRoaW5nIGxpa2Ugc2hvd2luZyBhbiBhbGVydC5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IHByb2NlZWQgaWYgd2UgaGF2ZSBub3QgaGFuZGxlZCBpdCBhbHJlYWR5LlxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5lbmREcmFnKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNhbmNlbEhvdmVyKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJhZ0VudGVyQ2FwdHVyZSA9IChlKT0+e1xuICAgICAgICAgICAgdGhpcy5kcmFnRW50ZXJUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgICAgIChyZWYgPSB0aGlzLmN1cnJlbnROYXRpdmVTb3VyY2UpID09PSBudWxsIHx8IHJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmLmxvYWREYXRhVHJhbnNmZXIoZS5kYXRhVHJhbnNmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXNGaXJzdEVudGVyID0gdGhpcy5lbnRlckxlYXZlQ291bnRlci5lbnRlcihlLnRhcmdldCk7XG4gICAgICAgICAgICBpZiAoIWlzRmlyc3RFbnRlciB8fCB0aGlzLm1vbml0b3IuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhVHJhbnNmZXIgIH0gPSBlO1xuICAgICAgICAgICAgY29uc3QgbmF0aXZlVHlwZSA9IG1hdGNoTmF0aXZlSXRlbVR5cGUoZGF0YVRyYW5zZmVyKTtcbiAgICAgICAgICAgIGlmIChuYXRpdmVUeXBlKSB7XG4gICAgICAgICAgICAgICAgLy8gQSBuYXRpdmUgaXRlbSAoc3VjaCBhcyBmaWxlIG9yIFVSTCkgZHJhZ2dlZCBmcm9tIG91dHNpZGUgdGhlIGRvY3VtZW50XG4gICAgICAgICAgICAgICAgdGhpcy5iZWdpbkRyYWdOYXRpdmVJdGVtKG5hdGl2ZVR5cGUsIGRhdGFUcmFuc2Zlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJhZ0VudGVyID0gKGUpPT57XG4gICAgICAgICAgICBjb25zdCB7IGRyYWdFbnRlclRhcmdldElkcyAgfSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmRyYWdFbnRlclRhcmdldElkcyA9IFtdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1vbml0b3IuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSBhIG5hdGl2ZSBpdGVtIHR5cGUgd2UgZG9uJ3QgdW5kZXJzdGFuZC5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFsdEtleVByZXNzZWQgPSBlLmFsdEtleTtcbiAgICAgICAgICAgIC8vIElmIHRoZSB0YXJnZXQgY2hhbmdlcyBwb3NpdGlvbiBhcyB0aGUgcmVzdWx0IG9mIGBkcmFnZW50ZXJgLCBgZHJhZ292ZXJgIG1pZ2h0IHN0aWxsXG4gICAgICAgICAgICAvLyBnZXQgZGlzcGF0Y2hlZCBkZXNwaXRlIHRhcmdldCBiZWluZyBubyBsb25nZXIgdGhlcmUuIFRoZSBlYXN5IHNvbHV0aW9uIGlzIHRvIGNoZWNrXG4gICAgICAgICAgICAvLyB3aGV0aGVyIHRoZXJlIGFjdHVhbGx5IGlzIGEgdGFyZ2V0IGJlZm9yZSBmaXJpbmcgYGhvdmVyYC5cbiAgICAgICAgICAgIGlmIChkcmFnRW50ZXJUYXJnZXRJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5ob3ZlcihkcmFnRW50ZXJUYXJnZXRJZHMsIHtcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50T2Zmc2V0OiBnZXRFdmVudENsaWVudE9mZnNldChlKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2FuRHJvcCA9IGRyYWdFbnRlclRhcmdldElkcy5zb21lKCh0YXJnZXRJZCk9PnRoaXMubW9uaXRvci5jYW5Ecm9wT25UYXJnZXQodGFyZ2V0SWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNhbkRyb3ApIHtcbiAgICAgICAgICAgICAgICAvLyBJRSByZXF1aXJlcyB0aGlzIHRvIGZpcmUgZHJhZ292ZXIgZXZlbnRzXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlcikge1xuICAgICAgICAgICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gdGhpcy5nZXRDdXJyZW50RHJvcEVmZmVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3BEcmFnT3ZlckNhcHR1cmUgPSAoZSk9PntcbiAgICAgICAgICAgIHRoaXMuZHJhZ092ZXJUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgICAgIChyZWYgPSB0aGlzLmN1cnJlbnROYXRpdmVTb3VyY2UpID09PSBudWxsIHx8IHJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmLmxvYWREYXRhVHJhbnNmZXIoZS5kYXRhVHJhbnNmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdPdmVyID0gKGUpPT57XG4gICAgICAgICAgICBjb25zdCB7IGRyYWdPdmVyVGFyZ2V0SWRzICB9ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZHJhZ092ZXJUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYSBuYXRpdmUgaXRlbSB0eXBlIHdlIGRvbid0IHVuZGVyc3RhbmQuXG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBkZWZhdWx0IFwiZHJvcCBhbmQgYmxvdyBhd2F5IHRoZSB3aG9sZSBkb2N1bWVudFwiIGFjdGlvbi5cbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGUuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWx0S2V5UHJlc3NlZCA9IGUuYWx0S2V5O1xuICAgICAgICAgICAgdGhpcy5sYXN0Q2xpZW50T2Zmc2V0ID0gZ2V0RXZlbnRDbGllbnRPZmZzZXQoZSk7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlSG92ZXIoZHJhZ092ZXJUYXJnZXRJZHMpO1xuICAgICAgICAgICAgY29uc3QgY2FuRHJvcCA9IChkcmFnT3ZlclRhcmdldElkcyB8fCBbXSkuc29tZSgodGFyZ2V0SWQpPT50aGlzLm1vbml0b3IuY2FuRHJvcE9uVGFyZ2V0KHRhcmdldElkKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjYW5Ecm9wKSB7XG4gICAgICAgICAgICAgICAgLy8gU2hvdyB1c2VyLXNwZWNpZmllZCBkcm9wIGVmZmVjdC5cbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGUuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSB0aGlzLmdldEN1cnJlbnREcm9wRWZmZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBzaG93IGEgbmljZSBjdXJzb3IgYnV0IHN0aWxsIHByZXZlbnQgZGVmYXVsdFxuICAgICAgICAgICAgICAgIC8vIFwiZHJvcCBhbmQgYmxvdyBhd2F5IHRoZSB3aG9sZSBkb2N1bWVudFwiIGFjdGlvbi5cbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJhZ0xlYXZlQ2FwdHVyZSA9IChlKT0+e1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZ05hdGl2ZUl0ZW0oKSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlzTGFzdExlYXZlID0gdGhpcy5lbnRlckxlYXZlQ291bnRlci5sZWF2ZShlLnRhcmdldCk7XG4gICAgICAgICAgICBpZiAoIWlzTGFzdExlYXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZ05hdGl2ZUl0ZW0oKSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PnRoaXMuZW5kRHJhZ05hdGl2ZUl0ZW0oKVxuICAgICAgICAgICAgICAgICwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNhbmNlbEhvdmVyKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJvcENhcHR1cmUgPSAoZSk9PntcbiAgICAgICAgICAgIHRoaXMuZHJvcFRhcmdldElkcyA9IFtdO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZ05hdGl2ZUl0ZW0oKSkge1xuICAgICAgICAgICAgICAgIHZhciByZWY7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIChyZWYgPSB0aGlzLmN1cnJlbnROYXRpdmVTb3VyY2UpID09PSBudWxsIHx8IHJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmLmxvYWREYXRhVHJhbnNmZXIoZS5kYXRhVHJhbnNmZXIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaE5hdGl2ZUl0ZW1UeXBlKGUuZGF0YVRyYW5zZmVyKSkge1xuICAgICAgICAgICAgICAgIC8vIERyYWdnaW5nIHNvbWUgZWxlbWVudHMsIGxpa2UgPGE+IGFuZCA8aW1nPiBtYXkgc3RpbGwgYmVoYXZlIGxpa2UgYSBuYXRpdmUgZHJhZyBldmVudCxcbiAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHRoZSBjdXJyZW50IGRyYWcgZXZlbnQgbWF0Y2hlcyBhIHVzZXItZGVmaW5lZCB0eXBlLlxuICAgICAgICAgICAgICAgIC8vIFN0b3AgdGhlIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiB3ZSdyZSBub3QgZXhwZWN0aW5nIGEgbmF0aXZlIGl0ZW0gdG8gYmUgZHJvcHBlZC5cbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVudGVyTGVhdmVDb3VudGVyLnJlc2V0KCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJvcCA9IChlKT0+e1xuICAgICAgICAgICAgY29uc3QgeyBkcm9wVGFyZ2V0SWRzICB9ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZHJvcFRhcmdldElkcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmhvdmVyKGRyb3BUYXJnZXRJZHMsIHtcbiAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXQ6IGdldEV2ZW50Q2xpZW50T2Zmc2V0KGUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5kcm9wKHtcbiAgICAgICAgICAgICAgICBkcm9wRWZmZWN0OiB0aGlzLmdldEN1cnJlbnREcm9wRWZmZWN0KClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZ05hdGl2ZUl0ZW0oKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kRHJhZ05hdGl2ZUl0ZW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5lbmREcmFnKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNhbmNlbEhvdmVyKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0U3RhcnQgPSAoZSk9PntcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgLy8gT25seSBJRSByZXF1aXJlcyB1cyB0byBleHBsaWNpdGx5IHNheVxuICAgICAgICAgICAgLy8gd2Ugd2FudCBkcmFnIGRyb3Agb3BlcmF0aW9uIHRvIHN0YXJ0XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldC5kcmFnRHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElucHV0cyBhbmQgdGV4dGFyZWFzIHNob3VsZCBiZSBzZWxlY3RhYmxlXG4gICAgICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgdGFyZ2V0LnRhZ05hbWUgPT09ICdTRUxFQ1QnIHx8IHRhcmdldC50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IHRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvciBvdGhlciB0YXJnZXRzLCBhc2sgSUVcbiAgICAgICAgICAgIC8vIHRvIGVuYWJsZSBkcmFnIGFuZCBkcm9wXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0YXJnZXQuZHJhZ0Ryb3AoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gbmV3IE9wdGlvbnNSZWFkZXIoZ2xvYmFsQ29udGV4dCwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYWN0aW9ucyA9IG1hbmFnZXIuZ2V0QWN0aW9ucygpO1xuICAgICAgICB0aGlzLm1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3IoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeSA9IG1hbmFnZXIuZ2V0UmVnaXN0cnkoKTtcbiAgICAgICAgdGhpcy5lbnRlckxlYXZlQ291bnRlciA9IG5ldyBFbnRlckxlYXZlQ291bnRlcih0aGlzLmlzTm9kZUluRG9jdW1lbnQpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRNTDVCYWNrZW5kSW1wbC5qcy5tYXAiLCJleHBvcnQgY2xhc3MgTW9ub3RvbmljSW50ZXJwb2xhbnQge1xuICAgIGludGVycG9sYXRlKHgpIHtcbiAgICAgICAgY29uc3QgeyB4cyAsIHlzICwgYzFzICwgYzJzICwgYzNzICB9ID0gdGhpcztcbiAgICAgICAgLy8gVGhlIHJpZ2h0bW9zdCBwb2ludCBpbiB0aGUgZGF0YXNldCBzaG91bGQgZ2l2ZSBhbiBleGFjdCByZXN1bHRcbiAgICAgICAgbGV0IGkgPSB4cy5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoeCA9PT0geHNbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiB5c1tpXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBpbnRlcnZhbCB4IGlzIGluLCByZXR1cm5pbmcgdGhlIGNvcnJlc3BvbmRpbmcgeSBpZiB4IGlzIG9uZSBvZiB0aGUgb3JpZ2luYWwgeHNcbiAgICAgICAgbGV0IGxvdyA9IDA7XG4gICAgICAgIGxldCBoaWdoID0gYzNzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBtaWQ7XG4gICAgICAgIHdoaWxlKGxvdyA8PSBoaWdoKXtcbiAgICAgICAgICAgIG1pZCA9IE1hdGguZmxvb3IoMC41ICogKGxvdyArIGhpZ2gpKTtcbiAgICAgICAgICAgIGNvbnN0IHhIZXJlID0geHNbbWlkXTtcbiAgICAgICAgICAgIGlmICh4SGVyZSA8IHgpIHtcbiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh4SGVyZSA+IHgpIHtcbiAgICAgICAgICAgICAgICBoaWdoID0gbWlkIC0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlzW21pZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaSA9IE1hdGgubWF4KDAsIGhpZ2gpO1xuICAgICAgICAvLyBJbnRlcnBvbGF0ZVxuICAgICAgICBjb25zdCBkaWZmID0geCAtIHhzW2ldO1xuICAgICAgICBjb25zdCBkaWZmU3EgPSBkaWZmICogZGlmZjtcbiAgICAgICAgcmV0dXJuIHlzW2ldICsgYzFzW2ldICogZGlmZiArIGMyc1tpXSAqIGRpZmZTcSArIGMzc1tpXSAqIGRpZmYgKiBkaWZmU3E7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHhzLCB5cyl7XG4gICAgICAgIGNvbnN0IHsgbGVuZ3RoICB9ID0geHM7XG4gICAgICAgIC8vIFJlYXJyYW5nZSB4cyBhbmQgeXMgc28gdGhhdCB4cyBpcyBzb3J0ZWRcbiAgICAgICAgY29uc3QgaW5kZXhlcyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ZXMuc29ydCgoYSwgYik9PnhzW2FdIDwgeHNbYl0gPyAtMSA6IDFcbiAgICAgICAgKTtcbiAgICAgICAgLy8gR2V0IGNvbnNlY3V0aXZlIGRpZmZlcmVuY2VzIGFuZCBzbG9wZXNcbiAgICAgICAgY29uc3QgZHlzID0gW107XG4gICAgICAgIGNvbnN0IGR4cyA9IFtdO1xuICAgICAgICBjb25zdCBtcyA9IFtdO1xuICAgICAgICBsZXQgZHg7XG4gICAgICAgIGxldCBkeTtcbiAgICAgICAgZm9yKGxldCBpMSA9IDA7IGkxIDwgbGVuZ3RoIC0gMTsgaTErKyl7XG4gICAgICAgICAgICBkeCA9IHhzW2kxICsgMV0gLSB4c1tpMV07XG4gICAgICAgICAgICBkeSA9IHlzW2kxICsgMV0gLSB5c1tpMV07XG4gICAgICAgICAgICBkeHMucHVzaChkeCk7XG4gICAgICAgICAgICBkeXMucHVzaChkeSk7XG4gICAgICAgICAgICBtcy5wdXNoKGR5IC8gZHgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCBkZWdyZWUtMSBjb2VmZmljaWVudHNcbiAgICAgICAgY29uc3QgYzFzID0gW1xuICAgICAgICAgICAgbXNbMF1cbiAgICAgICAgXTtcbiAgICAgICAgZm9yKGxldCBpMiA9IDA7IGkyIDwgZHhzLmxlbmd0aCAtIDE7IGkyKyspe1xuICAgICAgICAgICAgY29uc3QgbTIgPSBtc1tpMl07XG4gICAgICAgICAgICBjb25zdCBtTmV4dCA9IG1zW2kyICsgMV07XG4gICAgICAgICAgICBpZiAobTIgKiBtTmV4dCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgYzFzLnB1c2goMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR4ID0gZHhzW2kyXTtcbiAgICAgICAgICAgICAgICBjb25zdCBkeE5leHQgPSBkeHNbaTIgKyAxXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tb24gPSBkeCArIGR4TmV4dDtcbiAgICAgICAgICAgICAgICBjMXMucHVzaCgzICogY29tbW9uIC8gKChjb21tb24gKyBkeE5leHQpIC8gbTIgKyAoY29tbW9uICsgZHgpIC8gbU5leHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjMXMucHVzaChtc1ttcy5sZW5ndGggLSAxXSk7XG4gICAgICAgIC8vIEdldCBkZWdyZWUtMiBhbmQgZGVncmVlLTMgY29lZmZpY2llbnRzXG4gICAgICAgIGNvbnN0IGMycyA9IFtdO1xuICAgICAgICBjb25zdCBjM3MgPSBbXTtcbiAgICAgICAgbGV0IG07XG4gICAgICAgIGZvcihsZXQgaTMgPSAwOyBpMyA8IGMxcy5sZW5ndGggLSAxOyBpMysrKXtcbiAgICAgICAgICAgIG0gPSBtc1tpM107XG4gICAgICAgICAgICBjb25zdCBjMSA9IGMxc1tpM107XG4gICAgICAgICAgICBjb25zdCBpbnZEeCA9IDEgLyBkeHNbaTNdO1xuICAgICAgICAgICAgY29uc3QgY29tbW9uID0gYzEgKyBjMXNbaTMgKyAxXSAtIG0gLSBtO1xuICAgICAgICAgICAgYzJzLnB1c2goKG0gLSBjMSAtIGNvbW1vbikgKiBpbnZEeCk7XG4gICAgICAgICAgICBjM3MucHVzaChjb21tb24gKiBpbnZEeCAqIGludkR4KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnhzID0geHM7XG4gICAgICAgIHRoaXMueXMgPSB5cztcbiAgICAgICAgdGhpcy5jMXMgPSBjMXM7XG4gICAgICAgIHRoaXMuYzJzID0gYzJzO1xuICAgICAgICB0aGlzLmMzcyA9IGMzcztcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1vbm90b25pY0ludGVycG9sYW50LmpzLm1hcCIsImV4cG9ydCBjbGFzcyBOYXRpdmVEcmFnU291cmNlIHtcbiAgICBpbml0aWFsaXplRXhwb3NlZFByb3BlcnRpZXMoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmV4cG9zZVByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5KT0+e1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuaXRlbSwgcHJvcGVydHksIHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZXQgKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEJyb3dzZXIgZG9lc24ndCBhbGxvdyByZWFkaW5nIFwiJHtwcm9wZXJ0eX1cIiB1bnRpbCB0aGUgZHJvcCBldmVudC5gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsb2FkRGF0YVRyYW5zZmVyKGRhdGFUcmFuc2Zlcikge1xuICAgICAgICBpZiAoZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5leHBvc2VQcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eSk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eUZuID0gdGhpcy5jb25maWcuZXhwb3NlUHJvcGVydGllc1twcm9wZXJ0eV07XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Rm4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0eUZuKGRhdGFUcmFuc2ZlciwgdGhpcy5jb25maWcubWF0Y2hlc1R5cGVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMuaXRlbSwgbmV3UHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2FuRHJhZygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGJlZ2luRHJhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbTtcbiAgICB9XG4gICAgaXNEcmFnZ2luZyhtb25pdG9yLCBoYW5kbGUpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZSA9PT0gbW9uaXRvci5nZXRTb3VyY2VJZCgpO1xuICAgIH1cbiAgICBlbmREcmFnKCkge1xuICAgIC8vIGVtcHR5XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZyl7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLml0ZW0gPSB7fTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRXhwb3NlZFByb3BlcnRpZXMoKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5hdGl2ZURyYWdTb3VyY2UuanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFGcm9tRGF0YVRyYW5zZmVyKGRhdGFUcmFuc2ZlciwgdHlwZXNUb1RyeSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdHlwZXNUb1RyeS5yZWR1Y2UoKHJlc3VsdFNvRmFyLCB0eXBlVG9UcnkpPT5yZXN1bHRTb0ZhciB8fCBkYXRhVHJhbnNmZXIuZ2V0RGF0YSh0eXBlVG9UcnkpXG4gICAgLCAnJyk7XG4gICAgcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogZGVmYXVsdFZhbHVlO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXREYXRhRnJvbURhdGFUcmFuc2Zlci5qcy5tYXAiLCJpbXBvcnQgeyBOYXRpdmVEcmFnU291cmNlIH0gZnJvbSAnLi9OYXRpdmVEcmFnU291cmNlLmpzJztcbmltcG9ydCB7IG5hdGl2ZVR5cGVzQ29uZmlnIH0gZnJvbSAnLi9uYXRpdmVUeXBlc0NvbmZpZy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmF0aXZlRHJhZ1NvdXJjZSh0eXBlLCBkYXRhVHJhbnNmZXIpIHtcbiAgICBjb25zdCBjb25maWcgPSBuYXRpdmVUeXBlc0NvbmZpZ1t0eXBlXTtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5hdGl2ZSB0eXBlICR7dHlwZX0gaGFzIG5vIGNvbmZpZ3VyYXRpb25gKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE5hdGl2ZURyYWdTb3VyY2UoY29uZmlnKTtcbiAgICByZXN1bHQubG9hZERhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXIpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hOYXRpdmVJdGVtVHlwZShkYXRhVHJhbnNmZXIpIHtcbiAgICBpZiAoIWRhdGFUcmFuc2Zlcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZGF0YVRyYW5zZmVyVHlwZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkYXRhVHJhbnNmZXIudHlwZXMgfHwgW10pO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhuYXRpdmVUeXBlc0NvbmZpZykuZmlsdGVyKChuYXRpdmVJdGVtVHlwZSk9PntcbiAgICAgICAgY29uc3QgdHlwZUNvbmZpZyA9IG5hdGl2ZVR5cGVzQ29uZmlnW25hdGl2ZUl0ZW1UeXBlXTtcbiAgICAgICAgaWYgKCEodHlwZUNvbmZpZyA9PT0gbnVsbCB8fCB0eXBlQ29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0eXBlQ29uZmlnLm1hdGNoZXNUeXBlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZUNvbmZpZy5tYXRjaGVzVHlwZXMuc29tZSgodCk9PmRhdGFUcmFuc2ZlclR5cGVzLmluZGV4T2YodCkgPiAtMVxuICAgICAgICApO1xuICAgIH0pWzBdIHx8IG51bGw7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCAqIGFzIE5hdGl2ZVR5cGVzIGZyb20gJy4uL05hdGl2ZVR5cGVzLmpzJztcbmltcG9ydCB7IGdldERhdGFGcm9tRGF0YVRyYW5zZmVyIH0gZnJvbSAnLi9nZXREYXRhRnJvbURhdGFUcmFuc2Zlci5qcyc7XG5leHBvcnQgY29uc3QgbmF0aXZlVHlwZXNDb25maWcgPSB7XG4gICAgW05hdGl2ZVR5cGVzLkZJTEVdOiB7XG4gICAgICAgIGV4cG9zZVByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGZpbGVzOiAoZGF0YVRyYW5zZmVyKT0+QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YVRyYW5zZmVyLmZpbGVzKVxuICAgICAgICAgICAgLFxuICAgICAgICAgICAgaXRlbXM6IChkYXRhVHJhbnNmZXIpPT5kYXRhVHJhbnNmZXIuaXRlbXNcbiAgICAgICAgICAgICxcbiAgICAgICAgICAgIGRhdGFUcmFuc2ZlcjogKGRhdGFUcmFuc2Zlcik9PmRhdGFUcmFuc2ZlclxuICAgICAgICB9LFxuICAgICAgICBtYXRjaGVzVHlwZXM6IFtcbiAgICAgICAgICAgICdGaWxlcydcbiAgICAgICAgXVxuICAgIH0sXG4gICAgW05hdGl2ZVR5cGVzLkhUTUxdOiB7XG4gICAgICAgIGV4cG9zZVByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGh0bWw6IChkYXRhVHJhbnNmZXIsIG1hdGNoZXNUeXBlcyk9PmdldERhdGFGcm9tRGF0YVRyYW5zZmVyKGRhdGFUcmFuc2ZlciwgbWF0Y2hlc1R5cGVzLCAnJylcbiAgICAgICAgICAgICxcbiAgICAgICAgICAgIGRhdGFUcmFuc2ZlcjogKGRhdGFUcmFuc2Zlcik9PmRhdGFUcmFuc2ZlclxuICAgICAgICB9LFxuICAgICAgICBtYXRjaGVzVHlwZXM6IFtcbiAgICAgICAgICAgICdIdG1sJyxcbiAgICAgICAgICAgICd0ZXh0L2h0bWwnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIFtOYXRpdmVUeXBlcy5VUkxdOiB7XG4gICAgICAgIGV4cG9zZVByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHVybHM6IChkYXRhVHJhbnNmZXIsIG1hdGNoZXNUeXBlcyk9PmdldERhdGFGcm9tRGF0YVRyYW5zZmVyKGRhdGFUcmFuc2ZlciwgbWF0Y2hlc1R5cGVzLCAnJykuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAsXG4gICAgICAgICAgICBkYXRhVHJhbnNmZXI6IChkYXRhVHJhbnNmZXIpPT5kYXRhVHJhbnNmZXJcbiAgICAgICAgfSxcbiAgICAgICAgbWF0Y2hlc1R5cGVzOiBbXG4gICAgICAgICAgICAnVXJsJyxcbiAgICAgICAgICAgICd0ZXh0L3VyaS1saXN0J1xuICAgICAgICBdXG4gICAgfSxcbiAgICBbTmF0aXZlVHlwZXMuVEVYVF06IHtcbiAgICAgICAgZXhwb3NlUHJvcGVydGllczoge1xuICAgICAgICAgICAgdGV4dDogKGRhdGFUcmFuc2ZlciwgbWF0Y2hlc1R5cGVzKT0+Z2V0RGF0YUZyb21EYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyLCBtYXRjaGVzVHlwZXMsICcnKVxuICAgICAgICAgICAgLFxuICAgICAgICAgICAgZGF0YVRyYW5zZmVyOiAoZGF0YVRyYW5zZmVyKT0+ZGF0YVRyYW5zZmVyXG4gICAgICAgIH0sXG4gICAgICAgIG1hdGNoZXNUeXBlczogW1xuICAgICAgICAgICAgJ1RleHQnLFxuICAgICAgICAgICAgJ3RleHQvcGxhaW4nXG4gICAgICAgIF1cbiAgICB9XG59O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1uYXRpdmVUeXBlc0NvbmZpZy5qcy5tYXAiLCJleHBvcnQgY29uc3QgRklMRSA9ICdfX05BVElWRV9GSUxFX18nO1xuZXhwb3J0IGNvbnN0IFVSTCA9ICdfX05BVElWRV9VUkxfXyc7XG5leHBvcnQgY29uc3QgVEVYVCA9ICdfX05BVElWRV9URVhUX18nO1xuZXhwb3J0IGNvbnN0IEhUTUwgPSAnX19OQVRJVkVfSFRNTF9fJztcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmF0aXZlVHlwZXMuanMubWFwIiwiaW1wb3J0IHsgaXNGaXJlZm94LCBpc1NhZmFyaSB9IGZyb20gJy4vQnJvd3NlckRldGVjdG9yLmpzJztcbmltcG9ydCB7IE1vbm90b25pY0ludGVycG9sYW50IH0gZnJvbSAnLi9Nb25vdG9uaWNJbnRlcnBvbGFudC5qcyc7XG5jb25zdCBFTEVNRU5UX05PREUgPSAxO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVDbGllbnRPZmZzZXQobm9kZSkge1xuICAgIGNvbnN0IGVsID0gbm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFID8gbm9kZSA6IG5vZGUucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IHRvcCAsIGxlZnQgIH0gPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBsZWZ0LFxuICAgICAgICB5OiB0b3BcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEV2ZW50Q2xpZW50T2Zmc2V0KGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBlLmNsaWVudFgsXG4gICAgICAgIHk6IGUuY2xpZW50WVxuICAgIH07XG59XG5mdW5jdGlvbiBpc0ltYWdlTm9kZShub2RlKSB7XG4gICAgdmFyIHJlZjtcbiAgICByZXR1cm4gbm9kZS5ub2RlTmFtZSA9PT0gJ0lNRycgJiYgKGlzRmlyZWZveCgpIHx8ICEoKHJlZiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYuY29udGFpbnMobm9kZSkpKTtcbn1cbmZ1bmN0aW9uIGdldERyYWdQcmV2aWV3U2l6ZShpc0ltYWdlLCBkcmFnUHJldmlldywgc291cmNlV2lkdGgsIHNvdXJjZUhlaWdodCkge1xuICAgIGxldCBkcmFnUHJldmlld1dpZHRoID0gaXNJbWFnZSA/IGRyYWdQcmV2aWV3LndpZHRoIDogc291cmNlV2lkdGg7XG4gICAgbGV0IGRyYWdQcmV2aWV3SGVpZ2h0ID0gaXNJbWFnZSA/IGRyYWdQcmV2aWV3LmhlaWdodCA6IHNvdXJjZUhlaWdodDtcbiAgICAvLyBXb3JrIGFyb3VuZCBAMnggY29vcmRpbmF0ZSBkaXNjcmVwYW5jaWVzIGluIGJyb3dzZXJzXG4gICAgaWYgKGlzU2FmYXJpKCkgJiYgaXNJbWFnZSkge1xuICAgICAgICBkcmFnUHJldmlld0hlaWdodCAvPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgZHJhZ1ByZXZpZXdXaWR0aCAvPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZHJhZ1ByZXZpZXdXaWR0aCxcbiAgICAgICAgZHJhZ1ByZXZpZXdIZWlnaHRcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldERyYWdQcmV2aWV3T2Zmc2V0KHNvdXJjZU5vZGUsIGRyYWdQcmV2aWV3LCBjbGllbnRPZmZzZXQsIGFuY2hvclBvaW50LCBvZmZzZXRQb2ludCkge1xuICAgIC8vIFRoZSBicm93c2VycyB3aWxsIHVzZSB0aGUgaW1hZ2UgaW50cmluc2ljIHNpemUgdW5kZXIgZGlmZmVyZW50IGNvbmRpdGlvbnMuXG4gICAgLy8gRmlyZWZveCBvbmx5IGNhcmVzIGlmIGl0J3MgYW4gaW1hZ2UsIGJ1dCBXZWJLaXQgYWxzbyB3YW50cyBpdCB0byBiZSBkZXRhY2hlZC5cbiAgICBjb25zdCBpc0ltYWdlID0gaXNJbWFnZU5vZGUoZHJhZ1ByZXZpZXcpO1xuICAgIGNvbnN0IGRyYWdQcmV2aWV3Tm9kZSA9IGlzSW1hZ2UgPyBzb3VyY2VOb2RlIDogZHJhZ1ByZXZpZXc7XG4gICAgY29uc3QgZHJhZ1ByZXZpZXdOb2RlT2Zmc2V0RnJvbUNsaWVudCA9IGdldE5vZGVDbGllbnRPZmZzZXQoZHJhZ1ByZXZpZXdOb2RlKTtcbiAgICBjb25zdCBvZmZzZXRGcm9tRHJhZ1ByZXZpZXcgPSB7XG4gICAgICAgIHg6IGNsaWVudE9mZnNldC54IC0gZHJhZ1ByZXZpZXdOb2RlT2Zmc2V0RnJvbUNsaWVudC54LFxuICAgICAgICB5OiBjbGllbnRPZmZzZXQueSAtIGRyYWdQcmV2aWV3Tm9kZU9mZnNldEZyb21DbGllbnQueVxuICAgIH07XG4gICAgY29uc3QgeyBvZmZzZXRXaWR0aDogc291cmNlV2lkdGggLCBvZmZzZXRIZWlnaHQ6IHNvdXJjZUhlaWdodCAgfSA9IHNvdXJjZU5vZGU7XG4gICAgY29uc3QgeyBhbmNob3JYICwgYW5jaG9yWSAgfSA9IGFuY2hvclBvaW50O1xuICAgIGNvbnN0IHsgZHJhZ1ByZXZpZXdXaWR0aCAsIGRyYWdQcmV2aWV3SGVpZ2h0ICB9ID0gZ2V0RHJhZ1ByZXZpZXdTaXplKGlzSW1hZ2UsIGRyYWdQcmV2aWV3LCBzb3VyY2VXaWR0aCwgc291cmNlSGVpZ2h0KTtcbiAgICBjb25zdCBjYWxjdWxhdGVZT2Zmc2V0ID0gKCk9PntcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhbnRZID0gbmV3IE1vbm90b25pY0ludGVycG9sYW50KFtcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLjUsXG4gICAgICAgICAgICAxXG4gICAgICAgIF0sIFtcbiAgICAgICAgICAgIC8vIERvY2sgdG8gdGhlIHRvcFxuICAgICAgICAgICAgb2Zmc2V0RnJvbURyYWdQcmV2aWV3LnksXG4gICAgICAgICAgICAvLyBBbGlnbiBhdCB0aGUgY2VudGVyXG4gICAgICAgICAgICAob2Zmc2V0RnJvbURyYWdQcmV2aWV3LnkgLyBzb3VyY2VIZWlnaHQpICogZHJhZ1ByZXZpZXdIZWlnaHQsXG4gICAgICAgICAgICAvLyBEb2NrIHRvIHRoZSBib3R0b21cbiAgICAgICAgICAgIG9mZnNldEZyb21EcmFnUHJldmlldy55ICsgZHJhZ1ByZXZpZXdIZWlnaHQgLSBzb3VyY2VIZWlnaHQsIFxuICAgICAgICBdKTtcbiAgICAgICAgbGV0IHkgPSBpbnRlcnBvbGFudFkuaW50ZXJwb2xhdGUoYW5jaG9yWSk7XG4gICAgICAgIC8vIFdvcmsgYXJvdW5kIFNhZmFyaSA4IHBvc2l0aW9uaW5nIGJ1Z1xuICAgICAgICBpZiAoaXNTYWZhcmkoKSAmJiBpc0ltYWdlKSB7XG4gICAgICAgICAgICAvLyBXZSdsbCBoYXZlIHRvIHdhaXQgZm9yIEAzeCB0byBzZWUgaWYgdGhpcyBpcyBlbnRpcmVseSBjb3JyZWN0XG4gICAgICAgICAgICB5ICs9ICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAtIDEpICogZHJhZ1ByZXZpZXdIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfTtcbiAgICBjb25zdCBjYWxjdWxhdGVYT2Zmc2V0ID0gKCk9PntcbiAgICAgICAgLy8gSW50ZXJwb2xhdGUgY29vcmRpbmF0ZXMgZGVwZW5kaW5nIG9uIGFuY2hvciBwb2ludFxuICAgICAgICAvLyBJZiB5b3Uga25vdyBhIHNpbXBsZXIgd2F5IHRvIGRvIHRoaXMsIGxldCBtZSBrbm93XG4gICAgICAgIGNvbnN0IGludGVycG9sYW50WCA9IG5ldyBNb25vdG9uaWNJbnRlcnBvbGFudChbXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMC41LFxuICAgICAgICAgICAgMVxuICAgICAgICBdLCBbXG4gICAgICAgICAgICAvLyBEb2NrIHRvIHRoZSBsZWZ0XG4gICAgICAgICAgICBvZmZzZXRGcm9tRHJhZ1ByZXZpZXcueCxcbiAgICAgICAgICAgIC8vIEFsaWduIGF0IHRoZSBjZW50ZXJcbiAgICAgICAgICAgIChvZmZzZXRGcm9tRHJhZ1ByZXZpZXcueCAvIHNvdXJjZVdpZHRoKSAqIGRyYWdQcmV2aWV3V2lkdGgsXG4gICAgICAgICAgICAvLyBEb2NrIHRvIHRoZSByaWdodFxuICAgICAgICAgICAgb2Zmc2V0RnJvbURyYWdQcmV2aWV3LnggKyBkcmFnUHJldmlld1dpZHRoIC0gc291cmNlV2lkdGgsIFxuICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIGludGVycG9sYW50WC5pbnRlcnBvbGF0ZShhbmNob3JYKTtcbiAgICB9O1xuICAgIC8vIEZvcmNlIG9mZnNldHMgaWYgc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLlxuICAgIGNvbnN0IHsgb2Zmc2V0WCAsIG9mZnNldFkgIH0gPSBvZmZzZXRQb2ludDtcbiAgICBjb25zdCBpc01hbnVhbE9mZnNldFggPSBvZmZzZXRYID09PSAwIHx8IG9mZnNldFg7XG4gICAgY29uc3QgaXNNYW51YWxPZmZzZXRZID0gb2Zmc2V0WSA9PT0gMCB8fCBvZmZzZXRZO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGlzTWFudWFsT2Zmc2V0WCA/IG9mZnNldFggOiBjYWxjdWxhdGVYT2Zmc2V0KCksXG4gICAgICAgIHk6IGlzTWFudWFsT2Zmc2V0WSA/IG9mZnNldFkgOiBjYWxjdWxhdGVZT2Zmc2V0KClcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1PZmZzZXRVdGlscy5qcy5tYXAiLCJleHBvcnQgY2xhc3MgT3B0aW9uc1JlYWRlciB7XG4gICAgZ2V0IHdpbmRvdygpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2xvYmFsQ29udGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsQ29udGV4dDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgZG9jdW1lbnQoKSB7XG4gICAgICAgIHZhciByZWY7XG4gICAgICAgIGlmICgocmVmID0gdGhpcy5nbG9iYWxDb250ZXh0KSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5kb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsQ29udGV4dC5kb2N1bWVudDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2luZG93LmRvY3VtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIHZhciByZWY7XG4gICAgICAgIHJldHVybiAoKHJlZiA9IHRoaXMub3B0aW9uc0FyZ3MpID09PSBudWxsIHx8IHJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmLnJvb3RFbGVtZW50KSB8fCB0aGlzLndpbmRvdztcbiAgICB9XG4gICAgY29uc3RydWN0b3IoZ2xvYmFsQ29udGV4dCwgb3B0aW9ucyl7XG4gICAgICAgIHRoaXMub3duZXJEb2N1bWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuZ2xvYmFsQ29udGV4dCA9IGdsb2JhbENvbnRleHQ7XG4gICAgICAgIHRoaXMub3B0aW9uc0FyZ3MgPSBvcHRpb25zO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T3B0aW9uc1JlYWRlci5qcy5tYXAiLCJsZXQgZW1wdHlJbWFnZTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbXB0eUltYWdlKCkge1xuICAgIGlmICghZW1wdHlJbWFnZSkge1xuICAgICAgICBlbXB0eUltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGVtcHR5SW1hZ2Uuc3JjID0gJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBQUFBQUNINUJBRUtBQUVBTEFBQUFBQUJBQUVBQUFJQ1RBRUFPdz09JztcbiAgICB9XG4gICAgcmV0dXJuIGVtcHR5SW1hZ2U7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldEVtcHR5SW1hZ2UuanMubWFwIiwiaW1wb3J0IHsgSFRNTDVCYWNrZW5kSW1wbCB9IGZyb20gJy4vSFRNTDVCYWNrZW5kSW1wbC5qcyc7XG5pbXBvcnQgKiBhcyBfTmF0aXZlVHlwZXMgZnJvbSAnLi9OYXRpdmVUeXBlcy5qcyc7XG5leHBvcnQgeyBnZXRFbXB0eUltYWdlIH0gZnJvbSAnLi9nZXRFbXB0eUltYWdlLmpzJztcbmV4cG9ydCB7IF9OYXRpdmVUeXBlcyBhcyBOYXRpdmVUeXBlcyB9O1xuZXhwb3J0IGNvbnN0IEhUTUw1QmFja2VuZCA9IGZ1bmN0aW9uIGNyZWF0ZUJhY2tlbmQobWFuYWdlciwgY29udGV4dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgSFRNTDVCYWNrZW5kSW1wbChtYW5hZ2VyLCBjb250ZXh0LCBvcHRpb25zKTtcbn07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIGNoZWFwIGxvZGFzaCByZXBsYWNlbWVudHNcbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplKGZuKSB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgY29uc3QgbWVtb2l6ZWQgPSAoKT0+e1xuICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJldHVybiBtZW1vaXplZDtcbn1cbi8qKlxuICogZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgXy53aXRob3V0XG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXQoaXRlbXMsIGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpKT0+aSAhPT0gaXRlbVxuICAgICk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5pb24oaXRlbXNBLCBpdGVtc0IpIHtcbiAgICBjb25zdCBzZXQgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgaW5zZXJ0SXRlbSA9IChpdGVtKT0+c2V0LmFkZChpdGVtKVxuICAgIDtcbiAgICBpdGVtc0EuZm9yRWFjaChpbnNlcnRJdGVtKTtcbiAgICBpdGVtc0IuZm9yRWFjaChpbnNlcnRJdGVtKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBzZXQuZm9yRWFjaCgoa2V5KT0+cmVzdWx0LnB1c2goa2V5KVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9anNfdXRpbHMuanMubWFwIiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogQ3JlYXRlIHRoZSBSZWFjdCBDb250ZXh0XG4gKi8gZXhwb3J0IGNvbnN0IERuZENvbnRleHQgPSBjcmVhdGVDb250ZXh0KHtcbiAgICBkcmFnRHJvcE1hbmFnZXI6IHVuZGVmaW5lZFxufSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURuZENvbnRleHQuanMubWFwIiwiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgICB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7XG4gICAgdmFyIGtleSwgaTtcbiAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldO1xuICAgICAgICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gICAgdmFyIHRhcmdldCA9IHt9O1xuICAgIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICB2YXIga2V5LCBpO1xuICAgIGZvcihpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspe1xuICAgICAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGNyZWF0ZURyYWdEcm9wTWFuYWdlciB9IGZyb20gJ2RuZC1jb3JlJztcbmltcG9ydCB7IG1lbW8sIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IERuZENvbnRleHQgfSBmcm9tICcuL0RuZENvbnRleHQuanMnO1xubGV0IHJlZkNvdW50ID0gMDtcbmNvbnN0IElOU1RBTkNFX1NZTSA9IFN5bWJvbC5mb3IoJ19fUkVBQ1RfRE5EX0NPTlRFWFRfSU5TVEFOQ0VfXycpO1xudmFyIERuZFByb3ZpZGVyID0gLyojX19QVVJFX18qLyBtZW1vKGZ1bmN0aW9uIERuZFByb3ZpZGVyKF9wYXJhbSkge1xuICAgIHZhciB7IGNoaWxkcmVuICB9ID0gX3BhcmFtLCBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcGFyYW0sIFtcbiAgICAgICAgXCJjaGlsZHJlblwiXG4gICAgXSk7XG4gICAgY29uc3QgW21hbmFnZXIsIGlzR2xvYmFsSW5zdGFuY2VdID0gZ2V0RG5kQ29udGV4dFZhbHVlKHByb3BzKSAvLyBtZW1vaXplZCBmcm9tIHByb3BzXG4gICAgO1xuICAgIC8qKlxuXHRcdCAqIElmIHRoZSBnbG9iYWwgY29udGV4dCB3YXMgdXNlZCB0byBzdG9yZSB0aGUgRE5EIGNvbnRleHRcblx0XHQgKiB0aGVuIHdoZXJlIHRoZXJlcyBubyBtb3JlIHJlZmVyZW5jZXMgdG8gaXQgd2Ugc2hvdWxkXG5cdFx0ICogY2xlYW4gaXQgdXAgdG8gYXZvaWQgbWVtb3J5IGxlYWtzXG5cdFx0ICovIHVzZUVmZmVjdCgoKT0+e1xuICAgICAgICBpZiAoaXNHbG9iYWxJbnN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGdldEdsb2JhbENvbnRleHQoKTtcbiAgICAgICAgICAgICsrcmVmQ291bnQ7XG4gICAgICAgICAgICByZXR1cm4gKCk9PntcbiAgICAgICAgICAgICAgICBpZiAoLS1yZWZDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0W0lOU1RBTkNFX1NZTV0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qLyBfanN4KERuZENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IG1hbmFnZXIsXG4gICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH0pO1xufSk7XG4vKipcbiAqIEEgUmVhY3QgY29tcG9uZW50IHRoYXQgcHJvdmlkZXMgdGhlIFJlYWN0LURuRCBjb250ZXh0XG4gKi8gZXhwb3J0IHsgRG5kUHJvdmlkZXIsICB9O1xuZnVuY3Rpb24gZ2V0RG5kQ29udGV4dFZhbHVlKHByb3BzKSB7XG4gICAgaWYgKCdtYW5hZ2VyJyBpbiBwcm9wcykge1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0ge1xuICAgICAgICAgICAgZHJhZ0Ryb3BNYW5hZ2VyOiBwcm9wcy5tYW5hZ2VyXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBtYW5hZ2VyLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlciA9IGNyZWF0ZVNpbmdsZXRvbkRuZENvbnRleHQocHJvcHMuYmFja2VuZCwgcHJvcHMuY29udGV4dCwgcHJvcHMub3B0aW9ucywgcHJvcHMuZGVidWdNb2RlKTtcbiAgICBjb25zdCBpc0dsb2JhbEluc3RhbmNlID0gIXByb3BzLmNvbnRleHQ7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbWFuYWdlcixcbiAgICAgICAgaXNHbG9iYWxJbnN0YW5jZVxuICAgIF07XG59XG5mdW5jdGlvbiBjcmVhdGVTaW5nbGV0b25EbmRDb250ZXh0KGJhY2tlbmQsIGNvbnRleHQgPSBnZXRHbG9iYWxDb250ZXh0KCksIG9wdGlvbnMsIGRlYnVnTW9kZSkge1xuICAgIGNvbnN0IGN0eCA9IGNvbnRleHQ7XG4gICAgaWYgKCFjdHhbSU5TVEFOQ0VfU1lNXSkge1xuICAgICAgICBjdHhbSU5TVEFOQ0VfU1lNXSA9IHtcbiAgICAgICAgICAgIGRyYWdEcm9wTWFuYWdlcjogY3JlYXRlRHJhZ0Ryb3BNYW5hZ2VyKGJhY2tlbmQsIGNvbnRleHQsIG9wdGlvbnMsIGRlYnVnTW9kZSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGN0eFtJTlNUQU5DRV9TWU1dO1xufVxuZnVuY3Rpb24gZ2V0R2xvYmFsQ29udGV4dCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3c7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURuZFByb3ZpZGVyLmpzLm1hcCIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBJMThuQ29udGV4dCB9IGZyb20gJy4vY29udGV4dC5qcyc7XG5leHBvcnQgZnVuY3Rpb24gSTE4bmV4dFByb3ZpZGVyKHtcbiAgaTE4bixcbiAgZGVmYXVsdE5TLFxuICBjaGlsZHJlblxufSkge1xuICBjb25zdCB2YWx1ZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBpMThuLFxuICAgIGRlZmF1bHROU1xuICB9KSwgW2kxOG4sIGRlZmF1bHROU10pO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChJMThuQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlXG4gIH0sIGNoaWxkcmVuKTtcbn0iLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgbm9kZXNUb1N0cmluZywgVHJhbnMgYXMgVHJhbnNXaXRob3V0Q29udGV4dCB9IGZyb20gJy4vVHJhbnNXaXRob3V0Q29udGV4dC5qcyc7XG5pbXBvcnQgeyBnZXRJMThuLCBJMThuQ29udGV4dCB9IGZyb20gJy4vY29udGV4dC5qcyc7XG5leHBvcnQgeyBub2Rlc1RvU3RyaW5nIH07XG5leHBvcnQgZnVuY3Rpb24gVHJhbnMoe1xuICBjaGlsZHJlbixcbiAgY291bnQsXG4gIHBhcmVudCxcbiAgaTE4bktleSxcbiAgY29udGV4dCxcbiAgdE9wdGlvbnMgPSB7fSxcbiAgdmFsdWVzLFxuICBkZWZhdWx0cyxcbiAgY29tcG9uZW50cyxcbiAgbnMsXG4gIGkxOG46IGkxOG5Gcm9tUHJvcHMsXG4gIHQ6IHRGcm9tUHJvcHMsXG4gIHNob3VsZFVuZXNjYXBlLFxuICAuLi5hZGRpdGlvbmFsUHJvcHNcbn0pIHtcbiAgY29uc3Qge1xuICAgIGkxOG46IGkxOG5Gcm9tQ29udGV4dCxcbiAgICBkZWZhdWx0TlM6IGRlZmF1bHROU0Zyb21Db250ZXh0XG4gIH0gPSB1c2VDb250ZXh0KEkxOG5Db250ZXh0KSB8fCB7fTtcbiAgY29uc3QgaTE4biA9IGkxOG5Gcm9tUHJvcHMgfHwgaTE4bkZyb21Db250ZXh0IHx8IGdldEkxOG4oKTtcbiAgY29uc3QgdCA9IHRGcm9tUHJvcHMgfHwgaTE4bj8udC5iaW5kKGkxOG4pO1xuICByZXR1cm4gVHJhbnNXaXRob3V0Q29udGV4dCh7XG4gICAgY2hpbGRyZW4sXG4gICAgY291bnQsXG4gICAgcGFyZW50LFxuICAgIGkxOG5LZXksXG4gICAgY29udGV4dCxcbiAgICB0T3B0aW9ucyxcbiAgICB2YWx1ZXMsXG4gICAgZGVmYXVsdHMsXG4gICAgY29tcG9uZW50cyxcbiAgICBuczogbnMgfHwgdD8ubnMgfHwgZGVmYXVsdE5TRnJvbUNvbnRleHQgfHwgaTE4bj8ub3B0aW9ucz8uZGVmYXVsdE5TLFxuICAgIGkxOG4sXG4gICAgdDogdEZyb21Qcm9wcyxcbiAgICBzaG91bGRVbmVzY2FwZSxcbiAgICAuLi5hZGRpdGlvbmFsUHJvcHNcbiAgfSk7XG59IiwiaW1wb3J0IHsgRnJhZ21lbnQsIGlzVmFsaWRFbGVtZW50LCBjbG9uZUVsZW1lbnQsIGNyZWF0ZUVsZW1lbnQsIENoaWxkcmVuIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEhUTUwgZnJvbSAnaHRtbC1wYXJzZS1zdHJpbmdpZnknO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nLCB3YXJuLCB3YXJuT25jZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLmpzJztcbmltcG9ydCB7IGdldEkxOG4gfSBmcm9tICcuL2kxOG5JbnN0YW5jZS5qcyc7XG5jb25zdCBoYXNDaGlsZHJlbiA9IChub2RlLCBjaGVja0xlbmd0aCkgPT4ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYmFzZSA9IG5vZGUucHJvcHM/LmNoaWxkcmVuID8/IG5vZGUuY2hpbGRyZW47XG4gIGlmIChjaGVja0xlbmd0aCkgcmV0dXJuIGJhc2UubGVuZ3RoID4gMDtcbiAgcmV0dXJuICEhYmFzZTtcbn07XG5jb25zdCBnZXRDaGlsZHJlbiA9IG5vZGUgPT4ge1xuICBpZiAoIW5vZGUpIHJldHVybiBbXTtcbiAgY29uc3QgY2hpbGRyZW4gPSBub2RlLnByb3BzPy5jaGlsZHJlbiA/PyBub2RlLmNoaWxkcmVuO1xuICByZXR1cm4gbm9kZS5wcm9wcz8uaTE4bklzRHluYW1pY0xpc3QgPyBnZXRBc0FycmF5KGNoaWxkcmVuKSA6IGNoaWxkcmVuO1xufTtcbmNvbnN0IGhhc1ZhbGlkUmVhY3RDaGlsZHJlbiA9IGNoaWxkcmVuID0+IEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pICYmIGNoaWxkcmVuLmV2ZXJ5KGlzVmFsaWRFbGVtZW50KTtcbmNvbnN0IGdldEFzQXJyYXkgPSBkYXRhID0+IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdO1xuY29uc3QgbWVyZ2VQcm9wcyA9IChzb3VyY2UsIHRhcmdldCkgPT4ge1xuICBjb25zdCBuZXdUYXJnZXQgPSB7XG4gICAgLi4udGFyZ2V0XG4gIH07XG4gIG5ld1RhcmdldC5wcm9wcyA9IE9iamVjdC5hc3NpZ24oc291cmNlLnByb3BzLCB0YXJnZXQucHJvcHMpO1xuICByZXR1cm4gbmV3VGFyZ2V0O1xufTtcbmV4cG9ydCBjb25zdCBub2Rlc1RvU3RyaW5nID0gKGNoaWxkcmVuLCBpMThuT3B0aW9ucykgPT4ge1xuICBpZiAoIWNoaWxkcmVuKSByZXR1cm4gJyc7XG4gIGxldCBzdHJpbmdOb2RlID0gJyc7XG4gIGNvbnN0IGNoaWxkcmVuQXJyYXkgPSBnZXRBc0FycmF5KGNoaWxkcmVuKTtcbiAgY29uc3Qga2VlcEFycmF5ID0gaTE4bk9wdGlvbnM/LnRyYW5zU3VwcG9ydEJhc2ljSHRtbE5vZGVzID8gaTE4bk9wdGlvbnMudHJhbnNLZWVwQmFzaWNIdG1sTm9kZXNGb3IgPz8gW10gOiBbXTtcbiAgY2hpbGRyZW5BcnJheS5mb3JFYWNoKChjaGlsZCwgY2hpbGRJbmRleCkgPT4ge1xuICAgIGlmIChpc1N0cmluZyhjaGlsZCkpIHtcbiAgICAgIHN0cmluZ05vZGUgKz0gYCR7Y2hpbGR9YDtcbiAgICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBwcm9wcyxcbiAgICAgICAgdHlwZVxuICAgICAgfSA9IGNoaWxkO1xuICAgICAgY29uc3QgY2hpbGRQcm9wc0NvdW50ID0gT2JqZWN0LmtleXMocHJvcHMpLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNob3VsZEtlZXBDaGlsZCA9IGtlZXBBcnJheS5pbmRleE9mKHR5cGUpID4gLTE7XG4gICAgICBjb25zdCBjaGlsZENoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gICAgICBpZiAoIWNoaWxkQ2hpbGRyZW4gJiYgc2hvdWxkS2VlcENoaWxkICYmICFjaGlsZFByb3BzQ291bnQpIHtcbiAgICAgICAgc3RyaW5nTm9kZSArPSBgPCR7dHlwZX0vPmA7XG4gICAgICB9IGVsc2UgaWYgKCFjaGlsZENoaWxkcmVuICYmICghc2hvdWxkS2VlcENoaWxkIHx8IGNoaWxkUHJvcHNDb3VudCkgfHwgcHJvcHMuaTE4bklzRHluYW1pY0xpc3QpIHtcbiAgICAgICAgc3RyaW5nTm9kZSArPSBgPCR7Y2hpbGRJbmRleH0+PC8ke2NoaWxkSW5kZXh9PmA7XG4gICAgICB9IGVsc2UgaWYgKHNob3VsZEtlZXBDaGlsZCAmJiBjaGlsZFByb3BzQ291bnQgPT09IDEgJiYgaXNTdHJpbmcoY2hpbGRDaGlsZHJlbikpIHtcbiAgICAgICAgc3RyaW5nTm9kZSArPSBgPCR7dHlwZX0+JHtjaGlsZENoaWxkcmVufTwvJHt0eXBlfT5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IG5vZGVzVG9TdHJpbmcoY2hpbGRDaGlsZHJlbiwgaTE4bk9wdGlvbnMpO1xuICAgICAgICBzdHJpbmdOb2RlICs9IGA8JHtjaGlsZEluZGV4fT4ke2NvbnRlbnR9PC8ke2NoaWxkSW5kZXh9PmA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgd2FybihgVHJhbnM6IHRoZSBwYXNzZWQgaW4gdmFsdWUgaXMgaW52YWxpZCAtIHNlZW1zIHlvdSBwYXNzZWQgaW4gYSBudWxsIGNoaWxkLmApO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoY2hpbGQpKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZvcm1hdCxcbiAgICAgICAgLi4uY2xvbmVcbiAgICAgIH0gPSBjaGlsZDtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjbG9uZSk7XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtYXQgPyBgJHtrZXlzWzBdfSwgJHtmb3JtYXR9YCA6IGtleXNbMF07XG4gICAgICAgIHN0cmluZ05vZGUgKz0gYHt7JHt2YWx1ZX19fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKGByZWFjdC1pMThuZXh0OiB0aGUgcGFzc2VkIGluIG9iamVjdCBjb250YWluZWQgbW9yZSB0aGFuIG9uZSB2YXJpYWJsZSAtIHRoZSBvYmplY3Qgc2hvdWxkIGxvb2sgbGlrZSB7eyB2YWx1ZSwgZm9ybWF0IH19IHdoZXJlIGZvcm1hdCBpcyBvcHRpb25hbC5gLCBjaGlsZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4oYFRyYW5zOiB0aGUgcGFzc2VkIGluIHZhbHVlIGlzIGludmFsaWQgLSBzZWVtcyB5b3UgcGFzc2VkIGluIGEgdmFyaWFibGUgbGlrZSB7bnVtYmVyfSAtIHBsZWFzZSBwYXNzIGluIHZhcmlhYmxlcyBmb3IgaW50ZXJwb2xhdGlvbiBhcyBmdWxsIG9iamVjdHMgbGlrZSB7e251bWJlcn19LmAsIGNoaWxkKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3RyaW5nTm9kZTtcbn07XG5jb25zdCByZW5kZXJOb2RlcyA9IChjaGlsZHJlbiwgdGFyZ2V0U3RyaW5nLCBpMThuLCBpMThuT3B0aW9ucywgY29tYmluZWRUT3B0cywgc2hvdWxkVW5lc2NhcGUpID0+IHtcbiAgaWYgKHRhcmdldFN0cmluZyA9PT0gJycpIHJldHVybiBbXTtcbiAgY29uc3Qga2VlcEFycmF5ID0gaTE4bk9wdGlvbnMudHJhbnNLZWVwQmFzaWNIdG1sTm9kZXNGb3IgfHwgW107XG4gIGNvbnN0IGVtcHR5Q2hpbGRyZW5CdXROZWVkc0hhbmRsaW5nID0gdGFyZ2V0U3RyaW5nICYmIG5ldyBSZWdFeHAoa2VlcEFycmF5Lm1hcChrZWVwID0+IGA8JHtrZWVwfWApLmpvaW4oJ3wnKSkudGVzdCh0YXJnZXRTdHJpbmcpO1xuICBpZiAoIWNoaWxkcmVuICYmICFlbXB0eUNoaWxkcmVuQnV0TmVlZHNIYW5kbGluZyAmJiAhc2hvdWxkVW5lc2NhcGUpIHJldHVybiBbdGFyZ2V0U3RyaW5nXTtcbiAgY29uc3QgZGF0YSA9IHt9O1xuICBjb25zdCBnZXREYXRhID0gY2hpbGRzID0+IHtcbiAgICBjb25zdCBjaGlsZHJlbkFycmF5ID0gZ2V0QXNBcnJheShjaGlsZHMpO1xuICAgIGNoaWxkcmVuQXJyYXkuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICBpZiAoaXNTdHJpbmcoY2hpbGQpKSByZXR1cm47XG4gICAgICBpZiAoaGFzQ2hpbGRyZW4oY2hpbGQpKSBnZXREYXRhKGdldENoaWxkcmVuKGNoaWxkKSk7ZWxzZSBpZiAoaXNPYmplY3QoY2hpbGQpICYmICFpc1ZhbGlkRWxlbWVudChjaGlsZCkpIE9iamVjdC5hc3NpZ24oZGF0YSwgY2hpbGQpO1xuICAgIH0pO1xuICB9O1xuICBnZXREYXRhKGNoaWxkcmVuKTtcbiAgY29uc3QgYXN0ID0gSFRNTC5wYXJzZShgPDA+JHt0YXJnZXRTdHJpbmd9PC8wPmApO1xuICBjb25zdCBvcHRzID0ge1xuICAgIC4uLmRhdGEsXG4gICAgLi4uY29tYmluZWRUT3B0c1xuICB9O1xuICBjb25zdCByZW5kZXJJbm5lciA9IChjaGlsZCwgbm9kZSwgcm9vdFJlYWN0Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkcyA9IGdldENoaWxkcmVuKGNoaWxkKTtcbiAgICBjb25zdCBtYXBwZWRDaGlsZHJlbiA9IG1hcEFTVChjaGlsZHMsIG5vZGUuY2hpbGRyZW4sIHJvb3RSZWFjdE5vZGUpO1xuICAgIHJldHVybiBoYXNWYWxpZFJlYWN0Q2hpbGRyZW4oY2hpbGRzKSAmJiBtYXBwZWRDaGlsZHJlbi5sZW5ndGggPT09IDAgfHwgY2hpbGQucHJvcHM/LmkxOG5Jc0R5bmFtaWNMaXN0ID8gY2hpbGRzIDogbWFwcGVkQ2hpbGRyZW47XG4gIH07XG4gIGNvbnN0IHB1c2hUcmFuc2xhdGVkSlNYID0gKGNoaWxkLCBpbm5lciwgbWVtLCBpLCBpc1ZvaWQpID0+IHtcbiAgICBpZiAoY2hpbGQuZHVtbXkpIHtcbiAgICAgIGNoaWxkLmNoaWxkcmVuID0gaW5uZXI7XG4gICAgICBtZW0ucHVzaChjbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgICAga2V5OiBpXG4gICAgICB9LCBpc1ZvaWQgPyB1bmRlZmluZWQgOiBpbm5lcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZW0ucHVzaCguLi5DaGlsZHJlbi5tYXAoW2NoaWxkXSwgYyA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgIC4uLmMucHJvcHNcbiAgICAgICAgfTtcbiAgICAgICAgZGVsZXRlIHByb3BzLmkxOG5Jc0R5bmFtaWNMaXN0O1xuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChjLnR5cGUsIHtcbiAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgICBrZXk6IGksXG4gICAgICAgICAgcmVmOiBjLnJlZlxuICAgICAgICB9LCBpc1ZvaWQgPyBudWxsIDogaW5uZXIpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbWFwQVNUID0gKHJlYWN0Tm9kZSwgYXN0Tm9kZSwgcm9vdFJlYWN0Tm9kZSkgPT4ge1xuICAgIGNvbnN0IHJlYWN0Tm9kZXMgPSBnZXRBc0FycmF5KHJlYWN0Tm9kZSk7XG4gICAgY29uc3QgYXN0Tm9kZXMgPSBnZXRBc0FycmF5KGFzdE5vZGUpO1xuICAgIHJldHVybiBhc3ROb2Rlcy5yZWR1Y2UoKG1lbSwgbm9kZSwgaSkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25Db250ZW50ID0gbm9kZS5jaGlsZHJlbj8uWzBdPy5jb250ZW50ICYmIGkxOG4uc2VydmljZXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKG5vZGUuY2hpbGRyZW5bMF0uY29udGVudCwgb3B0cywgaTE4bi5sYW5ndWFnZSk7XG4gICAgICBpZiAobm9kZS50eXBlID09PSAndGFnJykge1xuICAgICAgICBsZXQgdG1wID0gcmVhY3ROb2Rlc1twYXJzZUludChub2RlLm5hbWUsIDEwKV07XG4gICAgICAgIGlmIChyb290UmVhY3ROb2RlLmxlbmd0aCA9PT0gMSAmJiAhdG1wKSB0bXAgPSByb290UmVhY3ROb2RlWzBdW25vZGUubmFtZV07XG4gICAgICAgIGlmICghdG1wKSB0bXAgPSB7fTtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBPYmplY3Qua2V5cyhub2RlLmF0dHJzKS5sZW5ndGggIT09IDAgPyBtZXJnZVByb3BzKHtcbiAgICAgICAgICBwcm9wczogbm9kZS5hdHRyc1xuICAgICAgICB9LCB0bXApIDogdG1wO1xuICAgICAgICBjb25zdCBpc0VsZW1lbnQgPSBpc1ZhbGlkRWxlbWVudChjaGlsZCk7XG4gICAgICAgIGNvbnN0IGlzVmFsaWRUcmFuc2xhdGlvbldpdGhDaGlsZHJlbiA9IGlzRWxlbWVudCAmJiBoYXNDaGlsZHJlbihub2RlLCB0cnVlKSAmJiAhbm9kZS52b2lkRWxlbWVudDtcbiAgICAgICAgY29uc3QgaXNFbXB0eVRyYW5zV2l0aEhUTUwgPSBlbXB0eUNoaWxkcmVuQnV0TmVlZHNIYW5kbGluZyAmJiBpc09iamVjdChjaGlsZCkgJiYgY2hpbGQuZHVtbXkgJiYgIWlzRWxlbWVudDtcbiAgICAgICAgY29uc3QgaXNLbm93bkNvbXBvbmVudCA9IGlzT2JqZWN0KGNoaWxkcmVuKSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChjaGlsZHJlbiwgbm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGNoaWxkKSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gaTE4bi5zZXJ2aWNlcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUoY2hpbGQsIG9wdHMsIGkxOG4ubGFuZ3VhZ2UpO1xuICAgICAgICAgIG1lbS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYXNDaGlsZHJlbihjaGlsZCkgfHwgaXNWYWxpZFRyYW5zbGF0aW9uV2l0aENoaWxkcmVuKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXIgPSByZW5kZXJJbm5lcihjaGlsZCwgbm9kZSwgcm9vdFJlYWN0Tm9kZSk7XG4gICAgICAgICAgcHVzaFRyYW5zbGF0ZWRKU1goY2hpbGQsIGlubmVyLCBtZW0sIGkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRW1wdHlUcmFuc1dpdGhIVE1MKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXIgPSBtYXBBU1QocmVhY3ROb2Rlcywgbm9kZS5jaGlsZHJlbiwgcm9vdFJlYWN0Tm9kZSk7XG4gICAgICAgICAgcHVzaFRyYW5zbGF0ZWRKU1goY2hpbGQsIGlubmVyLCBtZW0sIGkpO1xuICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5pc05hTihwYXJzZUZsb2F0KG5vZGUubmFtZSkpKSB7XG4gICAgICAgICAgaWYgKGlzS25vd25Db21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyID0gcmVuZGVySW5uZXIoY2hpbGQsIG5vZGUsIHJvb3RSZWFjdE5vZGUpO1xuICAgICAgICAgICAgcHVzaFRyYW5zbGF0ZWRKU1goY2hpbGQsIGlubmVyLCBtZW0sIGksIG5vZGUudm9pZEVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaTE4bk9wdGlvbnMudHJhbnNTdXBwb3J0QmFzaWNIdG1sTm9kZXMgJiYga2VlcEFycmF5LmluZGV4T2Yobm9kZS5uYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICBpZiAobm9kZS52b2lkRWxlbWVudCkge1xuICAgICAgICAgICAgICBtZW0ucHVzaChjcmVhdGVFbGVtZW50KG5vZGUubmFtZSwge1xuICAgICAgICAgICAgICAgIGtleTogYCR7bm9kZS5uYW1lfS0ke2l9YFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBpbm5lciA9IG1hcEFTVChyZWFjdE5vZGVzLCBub2RlLmNoaWxkcmVuLCByb290UmVhY3ROb2RlKTtcbiAgICAgICAgICAgICAgbWVtLnB1c2goY3JlYXRlRWxlbWVudChub2RlLm5hbWUsIHtcbiAgICAgICAgICAgICAgICBrZXk6IGAke25vZGUubmFtZX0tJHtpfWBcbiAgICAgICAgICAgICAgfSwgaW5uZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUudm9pZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIG1lbS5wdXNoKGA8JHtub2RlLm5hbWV9IC8+YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyID0gbWFwQVNUKHJlYWN0Tm9kZXMsIG5vZGUuY2hpbGRyZW4sIHJvb3RSZWFjdE5vZGUpO1xuICAgICAgICAgICAgbWVtLnB1c2goYDwke25vZGUubmFtZX0+JHtpbm5lcn08LyR7bm9kZS5uYW1lfT5gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoY2hpbGQpICYmICFpc0VsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gbm9kZS5jaGlsZHJlblswXSA/IHRyYW5zbGF0aW9uQ29udGVudCA6IG51bGw7XG4gICAgICAgICAgaWYgKGNvbnRlbnQpIG1lbS5wdXNoKGNvbnRlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHB1c2hUcmFuc2xhdGVkSlNYKGNoaWxkLCB0cmFuc2xhdGlvbkNvbnRlbnQsIG1lbSwgaSwgbm9kZS5jaGlsZHJlbi5sZW5ndGggIT09IDEgfHwgIXRyYW5zbGF0aW9uQ29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgY29uc3Qgd3JhcFRleHROb2RlcyA9IGkxOG5PcHRpb25zLnRyYW5zV3JhcFRleHROb2RlcztcbiAgICAgICAgY29uc3QgY29udGVudCA9IHNob3VsZFVuZXNjYXBlID8gaTE4bk9wdGlvbnMudW5lc2NhcGUoaTE4bi5zZXJ2aWNlcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUobm9kZS5jb250ZW50LCBvcHRzLCBpMThuLmxhbmd1YWdlKSkgOiBpMThuLnNlcnZpY2VzLmludGVycG9sYXRvci5pbnRlcnBvbGF0ZShub2RlLmNvbnRlbnQsIG9wdHMsIGkxOG4ubGFuZ3VhZ2UpO1xuICAgICAgICBpZiAod3JhcFRleHROb2Rlcykge1xuICAgICAgICAgIG1lbS5wdXNoKGNyZWF0ZUVsZW1lbnQod3JhcFRleHROb2Rlcywge1xuICAgICAgICAgICAga2V5OiBgJHtub2RlLm5hbWV9LSR7aX1gXG4gICAgICAgICAgfSwgY29udGVudCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lbS5wdXNoKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVtO1xuICAgIH0sIFtdKTtcbiAgfTtcbiAgY29uc3QgcmVzdWx0ID0gbWFwQVNUKFt7XG4gICAgZHVtbXk6IHRydWUsXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuIHx8IFtdXG4gIH1dLCBhc3QsIGdldEFzQXJyYXkoY2hpbGRyZW4gfHwgW10pKTtcbiAgcmV0dXJuIGdldENoaWxkcmVuKHJlc3VsdFswXSk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIFRyYW5zKHtcbiAgY2hpbGRyZW4sXG4gIGNvdW50LFxuICBwYXJlbnQsXG4gIGkxOG5LZXksXG4gIGNvbnRleHQsXG4gIHRPcHRpb25zID0ge30sXG4gIHZhbHVlcyxcbiAgZGVmYXVsdHMsXG4gIGNvbXBvbmVudHMsXG4gIG5zLFxuICBpMThuOiBpMThuRnJvbVByb3BzLFxuICB0OiB0RnJvbVByb3BzLFxuICBzaG91bGRVbmVzY2FwZSxcbiAgLi4uYWRkaXRpb25hbFByb3BzXG59KSB7XG4gIGNvbnN0IGkxOG4gPSBpMThuRnJvbVByb3BzIHx8IGdldEkxOG4oKTtcbiAgaWYgKCFpMThuKSB7XG4gICAgd2Fybk9uY2UoJ1lvdSB3aWxsIG5lZWQgdG8gcGFzcyBpbiBhbiBpMThuZXh0IGluc3RhbmNlIGJ5IHVzaW5nIGkxOG5leHRSZWFjdE1vZHVsZScpO1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuICBjb25zdCB0ID0gdEZyb21Qcm9wcyB8fCBpMThuLnQuYmluZChpMThuKSB8fCAoayA9PiBrKTtcbiAgY29uc3QgcmVhY3RJMThuZXh0T3B0aW9ucyA9IHtcbiAgICAuLi5nZXREZWZhdWx0cygpLFxuICAgIC4uLmkxOG4ub3B0aW9ucz8ucmVhY3RcbiAgfTtcbiAgbGV0IG5hbWVzcGFjZXMgPSBucyB8fCB0Lm5zIHx8IGkxOG4ub3B0aW9ucz8uZGVmYXVsdE5TO1xuICBuYW1lc3BhY2VzID0gaXNTdHJpbmcobmFtZXNwYWNlcykgPyBbbmFtZXNwYWNlc10gOiBuYW1lc3BhY2VzIHx8IFsndHJhbnNsYXRpb24nXTtcbiAgY29uc3Qgbm9kZUFzU3RyaW5nID0gbm9kZXNUb1N0cmluZyhjaGlsZHJlbiwgcmVhY3RJMThuZXh0T3B0aW9ucyk7XG4gIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRzIHx8IG5vZGVBc1N0cmluZyB8fCByZWFjdEkxOG5leHRPcHRpb25zLnRyYW5zRW1wdHlOb2RlVmFsdWUgfHwgaTE4bktleTtcbiAgY29uc3Qge1xuICAgIGhhc2hUcmFuc0tleVxuICB9ID0gcmVhY3RJMThuZXh0T3B0aW9ucztcbiAgY29uc3Qga2V5ID0gaTE4bktleSB8fCAoaGFzaFRyYW5zS2V5ID8gaGFzaFRyYW5zS2V5KG5vZGVBc1N0cmluZyB8fCBkZWZhdWx0VmFsdWUpIDogbm9kZUFzU3RyaW5nIHx8IGRlZmF1bHRWYWx1ZSk7XG4gIGlmIChpMThuLm9wdGlvbnM/LmludGVycG9sYXRpb24/LmRlZmF1bHRWYXJpYWJsZXMpIHtcbiAgICB2YWx1ZXMgPSB2YWx1ZXMgJiYgT2JqZWN0LmtleXModmFsdWVzKS5sZW5ndGggPiAwID8ge1xuICAgICAgLi4udmFsdWVzLFxuICAgICAgLi4uaTE4bi5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlc1xuICAgIH0gOiB7XG4gICAgICAuLi5pMThuLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzXG4gICAgfTtcbiAgfVxuICBjb25zdCBpbnRlcnBvbGF0aW9uT3ZlcnJpZGUgPSB2YWx1ZXMgfHwgY291bnQgIT09IHVuZGVmaW5lZCB8fCAhY2hpbGRyZW4gPyB0T3B0aW9ucy5pbnRlcnBvbGF0aW9uIDoge1xuICAgIGludGVycG9sYXRpb246IHtcbiAgICAgIC4uLnRPcHRpb25zLmludGVycG9sYXRpb24sXG4gICAgICBwcmVmaXg6ICcjJD8nLFxuICAgICAgc3VmZml4OiAnPyQjJ1xuICAgIH1cbiAgfTtcbiAgY29uc3QgY29tYmluZWRUT3B0cyA9IHtcbiAgICAuLi50T3B0aW9ucyxcbiAgICBjb250ZXh0OiBjb250ZXh0IHx8IHRPcHRpb25zLmNvbnRleHQsXG4gICAgY291bnQsXG4gICAgLi4udmFsdWVzLFxuICAgIC4uLmludGVycG9sYXRpb25PdmVycmlkZSxcbiAgICBkZWZhdWx0VmFsdWUsXG4gICAgbnM6IG5hbWVzcGFjZXNcbiAgfTtcbiAgY29uc3QgdHJhbnNsYXRpb24gPSBrZXkgPyB0KGtleSwgY29tYmluZWRUT3B0cykgOiBkZWZhdWx0VmFsdWU7XG4gIGlmIChjb21wb25lbnRzKSB7XG4gICAgT2JqZWN0LmtleXMoY29tcG9uZW50cykuZm9yRWFjaChjID0+IHtcbiAgICAgIGNvbnN0IGNvbXAgPSBjb21wb25lbnRzW2NdO1xuICAgICAgaWYgKHR5cGVvZiBjb21wLnR5cGUgPT09ICdmdW5jdGlvbicgfHwgIWNvbXAucHJvcHMgfHwgIWNvbXAucHJvcHMuY2hpbGRyZW4gfHwgdHJhbnNsYXRpb24uaW5kZXhPZihgJHtjfS8+YCkgPCAwICYmIHRyYW5zbGF0aW9uLmluZGV4T2YoYCR7Y30gLz5gKSA8IDApIHJldHVybjtcbiAgICAgIGZ1bmN0aW9uIENvbXBvbmVudGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBjb21wKTtcbiAgICAgIH1cbiAgICAgIGNvbXBvbmVudHNbY10gPSBjcmVhdGVFbGVtZW50KENvbXBvbmVudGl6ZWQpO1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSByZW5kZXJOb2Rlcyhjb21wb25lbnRzIHx8IGNoaWxkcmVuLCB0cmFuc2xhdGlvbiwgaTE4biwgcmVhY3RJMThuZXh0T3B0aW9ucywgY29tYmluZWRUT3B0cywgc2hvdWxkVW5lc2NhcGUpO1xuICBjb25zdCB1c2VBc1BhcmVudCA9IHBhcmVudCA/PyByZWFjdEkxOG5leHRPcHRpb25zLmRlZmF1bHRUcmFuc1BhcmVudDtcbiAgcmV0dXJuIHVzZUFzUGFyZW50ID8gY3JlYXRlRWxlbWVudCh1c2VBc1BhcmVudCwgYWRkaXRpb25hbFByb3BzLCBjb250ZW50KSA6IGNvbnRlbnQ7XG59IiwiaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuL3VzZVRyYW5zbGF0aW9uLmpzJztcbmV4cG9ydCBjb25zdCBUcmFuc2xhdGlvbiA9ICh7XG4gIG5zLFxuICBjaGlsZHJlbixcbiAgLi4ub3B0aW9uc1xufSkgPT4ge1xuICBjb25zdCBbdCwgaTE4biwgcmVhZHldID0gdXNlVHJhbnNsYXRpb24obnMsIG9wdGlvbnMpO1xuICByZXR1cm4gY2hpbGRyZW4odCwge1xuICAgIGkxOG4sXG4gICAgbG5nOiBpMThuLmxhbmd1YWdlXG4gIH0sIHJlYWR5KTtcbn07IiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldERlZmF1bHRzLCBzZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMuanMnO1xuaW1wb3J0IHsgZ2V0STE4biwgc2V0STE4biB9IGZyb20gJy4vaTE4bkluc3RhbmNlLmpzJztcbmltcG9ydCB7IGluaXRSZWFjdEkxOG5leHQgfSBmcm9tICcuL2luaXRSZWFjdEkxOG5leHQuanMnO1xuZXhwb3J0IHsgZ2V0RGVmYXVsdHMsIHNldERlZmF1bHRzLCBnZXRJMThuLCBzZXRJMThuLCBpbml0UmVhY3RJMThuZXh0IH07XG5leHBvcnQgY29uc3QgSTE4bkNvbnRleHQgPSBjcmVhdGVDb250ZXh0KCk7XG5leHBvcnQgY2xhc3MgUmVwb3J0TmFtZXNwYWNlcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudXNlZE5hbWVzcGFjZXMgPSB7fTtcbiAgfVxuICBhZGRVc2VkTmFtZXNwYWNlcyhuYW1lc3BhY2VzKSB7XG4gICAgbmFtZXNwYWNlcy5mb3JFYWNoKG5zID0+IHtcbiAgICAgIHRoaXMudXNlZE5hbWVzcGFjZXNbbnNdID8/PSB0cnVlO1xuICAgIH0pO1xuICB9XG4gIGdldFVzZWROYW1lc3BhY2VzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnVzZWROYW1lc3BhY2VzKTtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IGNvbXBvc2VJbml0aWFsUHJvcHMgPSBGb3JDb21wb25lbnQgPT4gYXN5bmMgY3R4ID0+IHtcbiAgY29uc3QgY29tcG9uZW50c0luaXRpYWxQcm9wcyA9IChhd2FpdCBGb3JDb21wb25lbnQuZ2V0SW5pdGlhbFByb3BzPy4oY3R4KSkgPz8ge307XG4gIGNvbnN0IGkxOG5Jbml0aWFsUHJvcHMgPSBnZXRJbml0aWFsUHJvcHMoKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5jb21wb25lbnRzSW5pdGlhbFByb3BzLFxuICAgIC4uLmkxOG5Jbml0aWFsUHJvcHNcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgZ2V0SW5pdGlhbFByb3BzID0gKCkgPT4ge1xuICBjb25zdCBpMThuID0gZ2V0STE4bigpO1xuICBjb25zdCBuYW1lc3BhY2VzID0gaTE4bi5yZXBvcnROYW1lc3BhY2VzPy5nZXRVc2VkTmFtZXNwYWNlcygpID8/IFtdO1xuICBjb25zdCByZXQgPSB7fTtcbiAgY29uc3QgaW5pdGlhbEkxOG5TdG9yZSA9IHt9O1xuICBpMThuLmxhbmd1YWdlcy5mb3JFYWNoKGwgPT4ge1xuICAgIGluaXRpYWxJMThuU3RvcmVbbF0gPSB7fTtcbiAgICBuYW1lc3BhY2VzLmZvckVhY2gobnMgPT4ge1xuICAgICAgaW5pdGlhbEkxOG5TdG9yZVtsXVtuc10gPSBpMThuLmdldFJlc291cmNlQnVuZGxlKGwsIG5zKSB8fCB7fTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldC5pbml0aWFsSTE4blN0b3JlID0gaW5pdGlhbEkxOG5TdG9yZTtcbiAgcmV0LmluaXRpYWxMYW5ndWFnZSA9IGkxOG4ubGFuZ3VhZ2U7XG4gIHJldHVybiByZXQ7XG59OyIsImltcG9ydCB7IHVuZXNjYXBlIH0gZnJvbSAnLi91bmVzY2FwZS5qcyc7XG5sZXQgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGJpbmRJMThuOiAnbGFuZ3VhZ2VDaGFuZ2VkJyxcbiAgYmluZEkxOG5TdG9yZTogJycsXG4gIHRyYW5zRW1wdHlOb2RlVmFsdWU6ICcnLFxuICB0cmFuc1N1cHBvcnRCYXNpY0h0bWxOb2RlczogdHJ1ZSxcbiAgdHJhbnNXcmFwVGV4dE5vZGVzOiAnJyxcbiAgdHJhbnNLZWVwQmFzaWNIdG1sTm9kZXNGb3I6IFsnYnInLCAnc3Ryb25nJywgJ2knLCAncCddLFxuICB1c2VTdXNwZW5zZTogdHJ1ZSxcbiAgdW5lc2NhcGVcbn07XG5leHBvcnQgY29uc3Qgc2V0RGVmYXVsdHMgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdHMgPSAoKSA9PiBkZWZhdWx0T3B0aW9uczsiLCJsZXQgaTE4bkluc3RhbmNlO1xuZXhwb3J0IGNvbnN0IHNldEkxOG4gPSBpbnN0YW5jZSA9PiB7XG4gIGkxOG5JbnN0YW5jZSA9IGluc3RhbmNlO1xufTtcbmV4cG9ydCBjb25zdCBnZXRJMThuID0gKCkgPT4gaTE4bkluc3RhbmNlOyIsImV4cG9ydCB7IFRyYW5zIH0gZnJvbSAnLi9UcmFucy5qcyc7XG5leHBvcnQgeyBUcmFucyBhcyBUcmFuc1dpdGhvdXRDb250ZXh0IH0gZnJvbSAnLi9UcmFuc1dpdGhvdXRDb250ZXh0LmpzJztcbmV4cG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi91c2VUcmFuc2xhdGlvbi5qcyc7XG5leHBvcnQgeyB3aXRoVHJhbnNsYXRpb24gfSBmcm9tICcuL3dpdGhUcmFuc2xhdGlvbi5qcyc7XG5leHBvcnQgeyBUcmFuc2xhdGlvbiB9IGZyb20gJy4vVHJhbnNsYXRpb24uanMnO1xuZXhwb3J0IHsgSTE4bmV4dFByb3ZpZGVyIH0gZnJvbSAnLi9JMThuZXh0UHJvdmlkZXIuanMnO1xuZXhwb3J0IHsgd2l0aFNTUiB9IGZyb20gJy4vd2l0aFNTUi5qcyc7XG5leHBvcnQgeyB1c2VTU1IgfSBmcm9tICcuL3VzZVNTUi5qcyc7XG5leHBvcnQgeyBpbml0UmVhY3RJMThuZXh0IH0gZnJvbSAnLi9pbml0UmVhY3RJMThuZXh0LmpzJztcbmV4cG9ydCB7IHNldERlZmF1bHRzLCBnZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMuanMnO1xuZXhwb3J0IHsgc2V0STE4biwgZ2V0STE4biB9IGZyb20gJy4vaTE4bkluc3RhbmNlLmpzJztcbmV4cG9ydCB7IEkxOG5Db250ZXh0LCBjb21wb3NlSW5pdGlhbFByb3BzLCBnZXRJbml0aWFsUHJvcHMgfSBmcm9tICcuL2NvbnRleHQuanMnO1xuZXhwb3J0IGNvbnN0IGRhdGUgPSAoKSA9PiAnJztcbmV4cG9ydCBjb25zdCB0aW1lID0gKCkgPT4gJyc7XG5leHBvcnQgY29uc3QgbnVtYmVyID0gKCkgPT4gJyc7XG5leHBvcnQgY29uc3Qgc2VsZWN0ID0gKCkgPT4gJyc7XG5leHBvcnQgY29uc3QgcGx1cmFsID0gKCkgPT4gJyc7XG5leHBvcnQgY29uc3Qgc2VsZWN0T3JkaW5hbCA9ICgpID0+ICcnOyIsImltcG9ydCB7IHNldERlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy5qcyc7XG5pbXBvcnQgeyBzZXRJMThuIH0gZnJvbSAnLi9pMThuSW5zdGFuY2UuanMnO1xuZXhwb3J0IGNvbnN0IGluaXRSZWFjdEkxOG5leHQgPSB7XG4gIHR5cGU6ICczcmRQYXJ0eScsXG4gIGluaXQoaW5zdGFuY2UpIHtcbiAgICBzZXREZWZhdWx0cyhpbnN0YW5jZS5vcHRpb25zLnJlYWN0KTtcbiAgICBzZXRJMThuKGluc3RhbmNlKTtcbiAgfVxufTsiLCJjb25zdCBtYXRjaEh0bWxFbnRpdHkgPSAvJig/OmFtcHwjMzh8bHR8IzYwfGd0fCM2MnxhcG9zfCMzOXxxdW90fCMzNHxuYnNwfCMxNjB8Y29weXwjMTY5fHJlZ3wjMTc0fGhlbGxpcHwjODIzMHwjeDJGfCM0Nyk7L2c7XG5jb25zdCBodG1sRW50aXRpZXMgPSB7XG4gICcmYW1wOyc6ICcmJyxcbiAgJyYjMzg7JzogJyYnLFxuICAnJmx0Oyc6ICc8JyxcbiAgJyYjNjA7JzogJzwnLFxuICAnJmd0Oyc6ICc+JyxcbiAgJyYjNjI7JzogJz4nLFxuICAnJmFwb3M7JzogXCInXCIsXG4gICcmIzM5Oyc6IFwiJ1wiLFxuICAnJnF1b3Q7JzogJ1wiJyxcbiAgJyYjMzQ7JzogJ1wiJyxcbiAgJyZuYnNwOyc6ICcgJyxcbiAgJyYjMTYwOyc6ICcgJyxcbiAgJyZjb3B5Oyc6ICfCqScsXG4gICcmIzE2OTsnOiAnwqknLFxuICAnJnJlZzsnOiAnwq4nLFxuICAnJiMxNzQ7JzogJ8KuJyxcbiAgJyZoZWxsaXA7JzogJ+KApicsXG4gICcmIzgyMzA7JzogJ+KApicsXG4gICcmI3gyRjsnOiAnLycsXG4gICcmIzQ3Oyc6ICcvJ1xufTtcbmNvbnN0IHVuZXNjYXBlSHRtbEVudGl0eSA9IG0gPT4gaHRtbEVudGl0aWVzW21dO1xuZXhwb3J0IGNvbnN0IHVuZXNjYXBlID0gdGV4dCA9PiB0ZXh0LnJlcGxhY2UobWF0Y2hIdG1sRW50aXR5LCB1bmVzY2FwZUh0bWxFbnRpdHkpOyIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRJMThuLCBJMThuQ29udGV4dCB9IGZyb20gJy4vY29udGV4dC5qcyc7XG5leHBvcnQgY29uc3QgdXNlU1NSID0gKGluaXRpYWxJMThuU3RvcmUsIGluaXRpYWxMYW5ndWFnZSwgcHJvcHMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgaTE4bjogaTE4bkZyb21Qcm9wc1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHtcbiAgICBpMThuOiBpMThuRnJvbUNvbnRleHRcbiAgfSA9IHVzZUNvbnRleHQoSTE4bkNvbnRleHQpIHx8IHt9O1xuICBjb25zdCBpMThuID0gaTE4bkZyb21Qcm9wcyB8fCBpMThuRnJvbUNvbnRleHQgfHwgZ2V0STE4bigpO1xuICBpZiAoaTE4bi5vcHRpb25zPy5pc0Nsb25lKSByZXR1cm47XG4gIGlmIChpbml0aWFsSTE4blN0b3JlICYmICFpMThuLmluaXRpYWxpemVkU3RvcmVPbmNlKSB7XG4gICAgaTE4bi5zZXJ2aWNlcy5yZXNvdXJjZVN0b3JlLmRhdGEgPSBpbml0aWFsSTE4blN0b3JlO1xuICAgIGkxOG4ub3B0aW9ucy5ucyA9IE9iamVjdC52YWx1ZXMoaW5pdGlhbEkxOG5TdG9yZSkucmVkdWNlKChtZW0sIGxuZ1Jlc291cmNlcykgPT4ge1xuICAgICAgT2JqZWN0LmtleXMobG5nUmVzb3VyY2VzKS5mb3JFYWNoKG5zID0+IHtcbiAgICAgICAgaWYgKG1lbS5pbmRleE9mKG5zKSA8IDApIG1lbS5wdXNoKG5zKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1lbTtcbiAgICB9LCBpMThuLm9wdGlvbnMubnMpO1xuICAgIGkxOG4uaW5pdGlhbGl6ZWRTdG9yZU9uY2UgPSB0cnVlO1xuICAgIGkxOG4uaXNJbml0aWFsaXplZCA9IHRydWU7XG4gIH1cbiAgaWYgKGluaXRpYWxMYW5ndWFnZSAmJiAhaTE4bi5pbml0aWFsaXplZExhbmd1YWdlT25jZSkge1xuICAgIGkxOG4uY2hhbmdlTGFuZ3VhZ2UoaW5pdGlhbExhbmd1YWdlKTtcbiAgICBpMThuLmluaXRpYWxpemVkTGFuZ3VhZ2VPbmNlID0gdHJ1ZTtcbiAgfVxufTsiLCJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDb250ZXh0LCB1c2VSZWYsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0STE4biwgZ2V0RGVmYXVsdHMsIFJlcG9ydE5hbWVzcGFjZXMsIEkxOG5Db250ZXh0IH0gZnJvbSAnLi9jb250ZXh0LmpzJztcbmltcG9ydCB7IHdhcm5PbmNlLCBsb2FkTmFtZXNwYWNlcywgbG9hZExhbmd1YWdlcywgaGFzTG9hZGVkTmFtZXNwYWNlLCBpc1N0cmluZywgaXNPYmplY3QgfSBmcm9tICcuL3V0aWxzLmpzJztcbmNvbnN0IHVzZVByZXZpb3VzID0gKHZhbHVlLCBpZ25vcmUpID0+IHtcbiAgY29uc3QgcmVmID0gdXNlUmVmKCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmVmLmN1cnJlbnQgPSBpZ25vcmUgPyByZWYuY3VycmVudCA6IHZhbHVlO1xuICB9LCBbdmFsdWUsIGlnbm9yZV0pO1xuICByZXR1cm4gcmVmLmN1cnJlbnQ7XG59O1xuY29uc3QgYWx3YXlzTmV3VCA9IChpMThuLCBsYW5ndWFnZSwgbmFtZXNwYWNlLCBrZXlQcmVmaXgpID0+IGkxOG4uZ2V0Rml4ZWRUKGxhbmd1YWdlLCBuYW1lc3BhY2UsIGtleVByZWZpeCk7XG5jb25zdCB1c2VNZW1vaXplZFQgPSAoaTE4biwgbGFuZ3VhZ2UsIG5hbWVzcGFjZSwga2V5UHJlZml4KSA9PiB1c2VDYWxsYmFjayhhbHdheXNOZXdUKGkxOG4sIGxhbmd1YWdlLCBuYW1lc3BhY2UsIGtleVByZWZpeCksIFtpMThuLCBsYW5ndWFnZSwgbmFtZXNwYWNlLCBrZXlQcmVmaXhdKTtcbmV4cG9ydCBjb25zdCB1c2VUcmFuc2xhdGlvbiA9IChucywgcHJvcHMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgaTE4bjogaTE4bkZyb21Qcm9wc1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHtcbiAgICBpMThuOiBpMThuRnJvbUNvbnRleHQsXG4gICAgZGVmYXVsdE5TOiBkZWZhdWx0TlNGcm9tQ29udGV4dFxuICB9ID0gdXNlQ29udGV4dChJMThuQ29udGV4dCkgfHwge307XG4gIGNvbnN0IGkxOG4gPSBpMThuRnJvbVByb3BzIHx8IGkxOG5Gcm9tQ29udGV4dCB8fCBnZXRJMThuKCk7XG4gIGlmIChpMThuICYmICFpMThuLnJlcG9ydE5hbWVzcGFjZXMpIGkxOG4ucmVwb3J0TmFtZXNwYWNlcyA9IG5ldyBSZXBvcnROYW1lc3BhY2VzKCk7XG4gIGlmICghaTE4bikge1xuICAgIHdhcm5PbmNlKCdZb3Ugd2lsbCBuZWVkIHRvIHBhc3MgaW4gYW4gaTE4bmV4dCBpbnN0YW5jZSBieSB1c2luZyBpbml0UmVhY3RJMThuZXh0Jyk7XG4gICAgY29uc3Qgbm90UmVhZHlUID0gKGssIG9wdHNPckRlZmF1bHRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGlzU3RyaW5nKG9wdHNPckRlZmF1bHRWYWx1ZSkpIHJldHVybiBvcHRzT3JEZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoaXNPYmplY3Qob3B0c09yRGVmYXVsdFZhbHVlKSAmJiBpc1N0cmluZyhvcHRzT3JEZWZhdWx0VmFsdWUuZGVmYXVsdFZhbHVlKSkgcmV0dXJuIG9wdHNPckRlZmF1bHRWYWx1ZS5kZWZhdWx0VmFsdWU7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShrKSA/IGtbay5sZW5ndGggLSAxXSA6IGs7XG4gICAgfTtcbiAgICBjb25zdCByZXROb3RSZWFkeSA9IFtub3RSZWFkeVQsIHt9LCBmYWxzZV07XG4gICAgcmV0Tm90UmVhZHkudCA9IG5vdFJlYWR5VDtcbiAgICByZXROb3RSZWFkeS5pMThuID0ge307XG4gICAgcmV0Tm90UmVhZHkucmVhZHkgPSBmYWxzZTtcbiAgICByZXR1cm4gcmV0Tm90UmVhZHk7XG4gIH1cbiAgaWYgKGkxOG4ub3B0aW9ucy5yZWFjdD8ud2FpdCkgd2Fybk9uY2UoJ0l0IHNlZW1zIHlvdSBhcmUgc3RpbGwgdXNpbmcgdGhlIG9sZCB3YWl0IG9wdGlvbiwgeW91IG1heSBtaWdyYXRlIHRvIHRoZSBuZXcgdXNlU3VzcGVuc2UgYmVoYXZpb3VyLicpO1xuICBjb25zdCBpMThuT3B0aW9ucyA9IHtcbiAgICAuLi5nZXREZWZhdWx0cygpLFxuICAgIC4uLmkxOG4ub3B0aW9ucy5yZWFjdCxcbiAgICAuLi5wcm9wc1xuICB9O1xuICBjb25zdCB7XG4gICAgdXNlU3VzcGVuc2UsXG4gICAga2V5UHJlZml4XG4gIH0gPSBpMThuT3B0aW9ucztcbiAgbGV0IG5hbWVzcGFjZXMgPSBucyB8fCBkZWZhdWx0TlNGcm9tQ29udGV4dCB8fCBpMThuLm9wdGlvbnM/LmRlZmF1bHROUztcbiAgbmFtZXNwYWNlcyA9IGlzU3RyaW5nKG5hbWVzcGFjZXMpID8gW25hbWVzcGFjZXNdIDogbmFtZXNwYWNlcyB8fCBbJ3RyYW5zbGF0aW9uJ107XG4gIGkxOG4ucmVwb3J0TmFtZXNwYWNlcy5hZGRVc2VkTmFtZXNwYWNlcz8uKG5hbWVzcGFjZXMpO1xuICBjb25zdCByZWFkeSA9IChpMThuLmlzSW5pdGlhbGl6ZWQgfHwgaTE4bi5pbml0aWFsaXplZFN0b3JlT25jZSkgJiYgbmFtZXNwYWNlcy5ldmVyeShuID0+IGhhc0xvYWRlZE5hbWVzcGFjZShuLCBpMThuLCBpMThuT3B0aW9ucykpO1xuICBjb25zdCBtZW1vR2V0VCA9IHVzZU1lbW9pemVkVChpMThuLCBwcm9wcy5sbmcgfHwgbnVsbCwgaTE4bk9wdGlvbnMubnNNb2RlID09PSAnZmFsbGJhY2snID8gbmFtZXNwYWNlcyA6IG5hbWVzcGFjZXNbMF0sIGtleVByZWZpeCk7XG4gIGNvbnN0IGdldFQgPSAoKSA9PiBtZW1vR2V0VDtcbiAgY29uc3QgZ2V0TmV3VCA9ICgpID0+IGFsd2F5c05ld1QoaTE4biwgcHJvcHMubG5nIHx8IG51bGwsIGkxOG5PcHRpb25zLm5zTW9kZSA9PT0gJ2ZhbGxiYWNrJyA/IG5hbWVzcGFjZXMgOiBuYW1lc3BhY2VzWzBdLCBrZXlQcmVmaXgpO1xuICBjb25zdCBbdCwgc2V0VF0gPSB1c2VTdGF0ZShnZXRUKTtcbiAgbGV0IGpvaW5lZE5TID0gbmFtZXNwYWNlcy5qb2luKCk7XG4gIGlmIChwcm9wcy5sbmcpIGpvaW5lZE5TID0gYCR7cHJvcHMubG5nfSR7am9pbmVkTlN9YDtcbiAgY29uc3QgcHJldmlvdXNKb2luZWROUyA9IHVzZVByZXZpb3VzKGpvaW5lZE5TKTtcbiAgY29uc3QgaXNNb3VudGVkID0gdXNlUmVmKHRydWUpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGJpbmRJMThuLFxuICAgICAgYmluZEkxOG5TdG9yZVxuICAgIH0gPSBpMThuT3B0aW9ucztcbiAgICBpc01vdW50ZWQuY3VycmVudCA9IHRydWU7XG4gICAgaWYgKCFyZWFkeSAmJiAhdXNlU3VzcGVuc2UpIHtcbiAgICAgIGlmIChwcm9wcy5sbmcpIHtcbiAgICAgICAgbG9hZExhbmd1YWdlcyhpMThuLCBwcm9wcy5sbmcsIG5hbWVzcGFjZXMsICgpID0+IHtcbiAgICAgICAgICBpZiAoaXNNb3VudGVkLmN1cnJlbnQpIHNldFQoZ2V0TmV3VCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZE5hbWVzcGFjZXMoaTE4biwgbmFtZXNwYWNlcywgKCkgPT4ge1xuICAgICAgICAgIGlmIChpc01vdW50ZWQuY3VycmVudCkgc2V0VChnZXROZXdUKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWFkeSAmJiBwcmV2aW91c0pvaW5lZE5TICYmIHByZXZpb3VzSm9pbmVkTlMgIT09IGpvaW5lZE5TICYmIGlzTW91bnRlZC5jdXJyZW50KSB7XG4gICAgICBzZXRUKGdldE5ld1QpO1xuICAgIH1cbiAgICBjb25zdCBib3VuZFJlc2V0ID0gKCkgPT4ge1xuICAgICAgaWYgKGlzTW91bnRlZC5jdXJyZW50KSBzZXRUKGdldE5ld1QpO1xuICAgIH07XG4gICAgaWYgKGJpbmRJMThuKSBpMThuPy5vbihiaW5kSTE4biwgYm91bmRSZXNldCk7XG4gICAgaWYgKGJpbmRJMThuU3RvcmUpIGkxOG4/LnN0b3JlLm9uKGJpbmRJMThuU3RvcmUsIGJvdW5kUmVzZXQpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpc01vdW50ZWQuY3VycmVudCA9IGZhbHNlO1xuICAgICAgaWYgKGkxOG4pIGJpbmRJMThuPy5zcGxpdCgnICcpLmZvckVhY2goZSA9PiBpMThuLm9mZihlLCBib3VuZFJlc2V0KSk7XG4gICAgICBpZiAoYmluZEkxOG5TdG9yZSAmJiBpMThuKSBiaW5kSTE4blN0b3JlLnNwbGl0KCcgJykuZm9yRWFjaChlID0+IGkxOG4uc3RvcmUub2ZmKGUsIGJvdW5kUmVzZXQpKTtcbiAgICB9O1xuICB9LCBbaTE4biwgam9pbmVkTlNdKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNNb3VudGVkLmN1cnJlbnQgJiYgcmVhZHkpIHtcbiAgICAgIHNldFQoZ2V0VCk7XG4gICAgfVxuICB9LCBbaTE4biwga2V5UHJlZml4LCByZWFkeV0pO1xuICBjb25zdCByZXQgPSBbdCwgaTE4biwgcmVhZHldO1xuICByZXQudCA9IHQ7XG4gIHJldC5pMThuID0gaTE4bjtcbiAgcmV0LnJlYWR5ID0gcmVhZHk7XG4gIGlmIChyZWFkeSkgcmV0dXJuIHJldDtcbiAgaWYgKCFyZWFkeSAmJiAhdXNlU3VzcGVuc2UpIHJldHVybiByZXQ7XG4gIHRocm93IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIGlmIChwcm9wcy5sbmcpIHtcbiAgICAgIGxvYWRMYW5ndWFnZXMoaTE4biwgcHJvcHMubG5nLCBuYW1lc3BhY2VzLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkTmFtZXNwYWNlcyhpMThuLCBuYW1lc3BhY2VzLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgIH1cbiAgfSk7XG59OyIsImV4cG9ydCBjb25zdCB3YXJuID0gKC4uLmFyZ3MpID0+IHtcbiAgaWYgKGNvbnNvbGU/Lndhcm4pIHtcbiAgICBpZiAoaXNTdHJpbmcoYXJnc1swXSkpIGFyZ3NbMF0gPSBgcmVhY3QtaTE4bmV4dDo6ICR7YXJnc1swXX1gO1xuICAgIGNvbnNvbGUud2FybiguLi5hcmdzKTtcbiAgfVxufTtcbmNvbnN0IGFscmVhZHlXYXJuZWQgPSB7fTtcbmV4cG9ydCBjb25zdCB3YXJuT25jZSA9ICguLi5hcmdzKSA9PiB7XG4gIGlmIChpc1N0cmluZyhhcmdzWzBdKSAmJiBhbHJlYWR5V2FybmVkW2FyZ3NbMF1dKSByZXR1cm47XG4gIGlmIChpc1N0cmluZyhhcmdzWzBdKSkgYWxyZWFkeVdhcm5lZFthcmdzWzBdXSA9IG5ldyBEYXRlKCk7XG4gIHdhcm4oLi4uYXJncyk7XG59O1xuY29uc3QgbG9hZGVkQ2xiID0gKGkxOG4sIGNiKSA9PiAoKSA9PiB7XG4gIGlmIChpMThuLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICBjYigpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGluaXRpYWxpemVkID0gKCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGkxOG4ub2ZmKCdpbml0aWFsaXplZCcsIGluaXRpYWxpemVkKTtcbiAgICAgIH0sIDApO1xuICAgICAgY2IoKTtcbiAgICB9O1xuICAgIGkxOG4ub24oJ2luaXRpYWxpemVkJywgaW5pdGlhbGl6ZWQpO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGxvYWROYW1lc3BhY2VzID0gKGkxOG4sIG5zLCBjYikgPT4ge1xuICBpMThuLmxvYWROYW1lc3BhY2VzKG5zLCBsb2FkZWRDbGIoaTE4biwgY2IpKTtcbn07XG5leHBvcnQgY29uc3QgbG9hZExhbmd1YWdlcyA9IChpMThuLCBsbmcsIG5zLCBjYikgPT4ge1xuICBpZiAoaXNTdHJpbmcobnMpKSBucyA9IFtuc107XG4gIG5zLmZvckVhY2gobiA9PiB7XG4gICAgaWYgKGkxOG4ub3B0aW9ucy5ucy5pbmRleE9mKG4pIDwgMCkgaTE4bi5vcHRpb25zLm5zLnB1c2gobik7XG4gIH0pO1xuICBpMThuLmxvYWRMYW5ndWFnZXMobG5nLCBsb2FkZWRDbGIoaTE4biwgY2IpKTtcbn07XG5leHBvcnQgY29uc3QgaGFzTG9hZGVkTmFtZXNwYWNlID0gKG5zLCBpMThuLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKCFpMThuLmxhbmd1YWdlcyB8fCAhaTE4bi5sYW5ndWFnZXMubGVuZ3RoKSB7XG4gICAgd2Fybk9uY2UoJ2kxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5JywgaTE4bi5sYW5ndWFnZXMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBpMThuLmhhc0xvYWRlZE5hbWVzcGFjZShucywge1xuICAgIGxuZzogb3B0aW9ucy5sbmcsXG4gICAgcHJlY2hlY2s6IChpMThuSW5zdGFuY2UsIGxvYWROb3RQZW5kaW5nKSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5iaW5kSTE4bj8uaW5kZXhPZignbGFuZ3VhZ2VDaGFuZ2luZycpID4gLTEgJiYgaTE4bkluc3RhbmNlLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZCAmJiBpMThuSW5zdGFuY2UuaXNMYW5ndWFnZUNoYW5naW5nVG8gJiYgIWxvYWROb3RQZW5kaW5nKGkxOG5JbnN0YW5jZS5pc0xhbmd1YWdlQ2hhbmdpbmdUbywgbnMpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RGlzcGxheU5hbWUgPSBDb21wb25lbnQgPT4gQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8IChpc1N0cmluZyhDb21wb25lbnQpICYmIENvbXBvbmVudC5sZW5ndGggPiAwID8gQ29tcG9uZW50IDogJ1Vua25vd24nKTtcbmV4cG9ydCBjb25zdCBpc1N0cmluZyA9IG9iaiA9PiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJztcbmV4cG9ydCBjb25zdCBpc09iamVjdCA9IG9iaiA9PiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGw7IiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVNTUiB9IGZyb20gJy4vdXNlU1NSLmpzJztcbmltcG9ydCB7IGNvbXBvc2VJbml0aWFsUHJvcHMgfSBmcm9tICcuL2NvbnRleHQuanMnO1xuaW1wb3J0IHsgZ2V0RGlzcGxheU5hbWUgfSBmcm9tICcuL3V0aWxzLmpzJztcbmV4cG9ydCBjb25zdCB3aXRoU1NSID0gKCkgPT4gZnVuY3Rpb24gRXh0ZW5kKFdyYXBwZWRDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gSTE4bmV4dFdpdGhTU1Ioe1xuICAgIGluaXRpYWxJMThuU3RvcmUsXG4gICAgaW5pdGlhbExhbmd1YWdlLFxuICAgIC4uLnJlc3RcbiAgfSkge1xuICAgIHVzZVNTUihpbml0aWFsSTE4blN0b3JlLCBpbml0aWFsTGFuZ3VhZ2UpO1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIHtcbiAgICAgIC4uLnJlc3RcbiAgICB9KTtcbiAgfVxuICBJMThuZXh0V2l0aFNTUi5nZXRJbml0aWFsUHJvcHMgPSBjb21wb3NlSW5pdGlhbFByb3BzKFdyYXBwZWRDb21wb25lbnQpO1xuICBJMThuZXh0V2l0aFNTUi5kaXNwbGF5TmFtZSA9IGB3aXRoSTE4bmV4dFNTUigke2dldERpc3BsYXlOYW1lKFdyYXBwZWRDb21wb25lbnQpfSlgO1xuICBJMThuZXh0V2l0aFNTUi5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcbiAgcmV0dXJuIEkxOG5leHRXaXRoU1NSO1xufTsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBmb3J3YXJkUmVmIGFzIGZvcndhcmRSZWZSZWFjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi91c2VUcmFuc2xhdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXREaXNwbGF5TmFtZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuZXhwb3J0IGNvbnN0IHdpdGhUcmFuc2xhdGlvbiA9IChucywgb3B0aW9ucyA9IHt9KSA9PiBmdW5jdGlvbiBFeHRlbmQoV3JhcHBlZENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBJMThuZXh0V2l0aFRyYW5zbGF0aW9uKHtcbiAgICBmb3J3YXJkZWRSZWYsXG4gICAgLi4ucmVzdFxuICB9KSB7XG4gICAgY29uc3QgW3QsIGkxOG4sIHJlYWR5XSA9IHVzZVRyYW5zbGF0aW9uKG5zLCB7XG4gICAgICAuLi5yZXN0LFxuICAgICAga2V5UHJlZml4OiBvcHRpb25zLmtleVByZWZpeFxuICAgIH0pO1xuICAgIGNvbnN0IHBhc3NEb3duUHJvcHMgPSB7XG4gICAgICAuLi5yZXN0LFxuICAgICAgdCxcbiAgICAgIGkxOG4sXG4gICAgICB0UmVhZHk6IHJlYWR5XG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy53aXRoUmVmICYmIGZvcndhcmRlZFJlZikge1xuICAgICAgcGFzc0Rvd25Qcm9wcy5yZWYgPSBmb3J3YXJkZWRSZWY7XG4gICAgfSBlbHNlIGlmICghb3B0aW9ucy53aXRoUmVmICYmIGZvcndhcmRlZFJlZikge1xuICAgICAgcGFzc0Rvd25Qcm9wcy5mb3J3YXJkZWRSZWYgPSBmb3J3YXJkZWRSZWY7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIHBhc3NEb3duUHJvcHMpO1xuICB9XG4gIEkxOG5leHRXaXRoVHJhbnNsYXRpb24uZGlzcGxheU5hbWUgPSBgd2l0aEkxOG5leHRUcmFuc2xhdGlvbigke2dldERpc3BsYXlOYW1lKFdyYXBwZWRDb21wb25lbnQpfSlgO1xuICBJMThuZXh0V2l0aFRyYW5zbGF0aW9uLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICBjb25zdCBmb3J3YXJkUmVmID0gKHByb3BzLCByZWYpID0+IGNyZWF0ZUVsZW1lbnQoSTE4bmV4dFdpdGhUcmFuc2xhdGlvbiwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBmb3J3YXJkZWRSZWY6IHJlZlxuICB9KSk7XG4gIHJldHVybiBvcHRpb25zLndpdGhSZWYgPyBmb3J3YXJkUmVmUmVhY3QoZm9yd2FyZFJlZikgOiBJMThuZXh0V2l0aFRyYW5zbGF0aW9uO1xufTsiLCIndXNlIGNsaWVudCc7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBmb3J3YXJkUmVmLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFrZUV2ZW50UHJvcHMgZnJvbSAnbWFrZS1ldmVudC1wcm9wcyc7XG5pbXBvcnQgbWFrZUNhbmNlbGxhYmxlIGZyb20gJ21ha2UtY2FuY2VsbGFibGUtcHJvbWlzZSc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgeyBkZXF1YWwgfSBmcm9tICdkZXF1YWwnO1xuaW1wb3J0ICogYXMgcGRmanMgZnJvbSAncGRmanMtZGlzdCc7XG5pbXBvcnQgRG9jdW1lbnRDb250ZXh0IGZyb20gJy4vRG9jdW1lbnRDb250ZXh0LmpzJztcbmltcG9ydCBNZXNzYWdlIGZyb20gJy4vTWVzc2FnZS5qcyc7XG5pbXBvcnQgTGlua1NlcnZpY2UgZnJvbSAnLi9MaW5rU2VydmljZS5qcyc7XG5pbXBvcnQgUGFzc3dvcmRSZXNwb25zZXMgZnJvbSAnLi9QYXNzd29yZFJlc3BvbnNlcy5qcyc7XG5pbXBvcnQgeyBjYW5jZWxSdW5uaW5nVGFzaywgZGF0YVVSSXRvQnl0ZVN0cmluZywgZGlzcGxheUNPUlNXYXJuaW5nLCBpc0FycmF5QnVmZmVyLCBpc0Jsb2IsIGlzQnJvd3NlciwgaXNEYXRhVVJJLCBsb2FkRnJvbUZpbGUsIH0gZnJvbSAnLi9zaGFyZWQvdXRpbHMuanMnO1xuaW1wb3J0IHVzZVJlc29sdmVyIGZyb20gJy4vc2hhcmVkL2hvb2tzL3VzZVJlc29sdmVyLmpzJztcbmNvbnN0IHsgUERGRGF0YVJhbmdlVHJhbnNwb3J0IH0gPSBwZGZqcztcbmNvbnN0IGRlZmF1bHRPblBhc3N3b3JkID0gKGNhbGxiYWNrLCByZWFzb24pID0+IHtcbiAgICBzd2l0Y2ggKHJlYXNvbikge1xuICAgICAgICBjYXNlIFBhc3N3b3JkUmVzcG9uc2VzLk5FRURfUEFTU1dPUkQ6IHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkID0gcHJvbXB0KCdFbnRlciB0aGUgcGFzc3dvcmQgdG8gb3BlbiB0aGlzIFBERiBmaWxlLicpO1xuICAgICAgICAgICAgY2FsbGJhY2socGFzc3dvcmQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQYXNzd29yZFJlc3BvbnNlcy5JTkNPUlJFQ1RfUEFTU1dPUkQ6IHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkID0gcHJvbXB0KCdJbnZhbGlkIHBhc3N3b3JkLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgICAgICAgICAgY2FsbGJhY2socGFzc3dvcmQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICB9XG59O1xuZnVuY3Rpb24gaXNQYXJhbWV0ZXJPYmplY3QoZmlsZSkge1xuICAgIHJldHVybiAodHlwZW9mIGZpbGUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIGZpbGUgIT09IG51bGwgJiZcbiAgICAgICAgKCdkYXRhJyBpbiBmaWxlIHx8ICdyYW5nZScgaW4gZmlsZSB8fCAndXJsJyBpbiBmaWxlKSk7XG59XG4vKipcbiAqIExvYWRzIGEgZG9jdW1lbnQgcGFzc2VkIHVzaW5nIGBmaWxlYCBwcm9wLlxuICovXG5jb25zdCBEb2N1bWVudCA9IGZvcndhcmRSZWYoZnVuY3Rpb24gRG9jdW1lbnQoX2EsIHJlZikge1xuICAgIHZhciB7IGNoaWxkcmVuLCBjbGFzc05hbWUsIGVycm9yID0gJ0ZhaWxlZCB0byBsb2FkIFBERiBmaWxlLicsIGV4dGVybmFsTGlua1JlbCwgZXh0ZXJuYWxMaW5rVGFyZ2V0LCBmaWxlLCBpbnB1dFJlZiwgaW1hZ2VSZXNvdXJjZXNQYXRoLCBsb2FkaW5nID0gJ0xvYWRpbmcgUERG4oCmJywgbm9EYXRhID0gJ05vIFBERiBmaWxlIHNwZWNpZmllZC4nLCBvbkl0ZW1DbGljaywgb25Mb2FkRXJyb3I6IG9uTG9hZEVycm9yUHJvcHMsIG9uTG9hZFByb2dyZXNzLCBvbkxvYWRTdWNjZXNzOiBvbkxvYWRTdWNjZXNzUHJvcHMsIG9uUGFzc3dvcmQgPSBkZWZhdWx0T25QYXNzd29yZCwgb25Tb3VyY2VFcnJvcjogb25Tb3VyY2VFcnJvclByb3BzLCBvblNvdXJjZVN1Y2Nlc3M6IG9uU291cmNlU3VjY2Vzc1Byb3BzLCBvcHRpb25zLCByZW5kZXJNb2RlLCByb3RhdGUgfSA9IF9hLCBvdGhlclByb3BzID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImVycm9yXCIsIFwiZXh0ZXJuYWxMaW5rUmVsXCIsIFwiZXh0ZXJuYWxMaW5rVGFyZ2V0XCIsIFwiZmlsZVwiLCBcImlucHV0UmVmXCIsIFwiaW1hZ2VSZXNvdXJjZXNQYXRoXCIsIFwibG9hZGluZ1wiLCBcIm5vRGF0YVwiLCBcIm9uSXRlbUNsaWNrXCIsIFwib25Mb2FkRXJyb3JcIiwgXCJvbkxvYWRQcm9ncmVzc1wiLCBcIm9uTG9hZFN1Y2Nlc3NcIiwgXCJvblBhc3N3b3JkXCIsIFwib25Tb3VyY2VFcnJvclwiLCBcIm9uU291cmNlU3VjY2Vzc1wiLCBcIm9wdGlvbnNcIiwgXCJyZW5kZXJNb2RlXCIsIFwicm90YXRlXCJdKTtcbiAgICBjb25zdCBbc291cmNlU3RhdGUsIHNvdXJjZURpc3BhdGNoXSA9IHVzZVJlc29sdmVyKCk7XG4gICAgY29uc3QgeyB2YWx1ZTogc291cmNlLCBlcnJvcjogc291cmNlRXJyb3IgfSA9IHNvdXJjZVN0YXRlO1xuICAgIGNvbnN0IFtwZGZTdGF0ZSwgcGRmRGlzcGF0Y2hdID0gdXNlUmVzb2x2ZXIoKTtcbiAgICBjb25zdCB7IHZhbHVlOiBwZGYsIGVycm9yOiBwZGZFcnJvciB9ID0gcGRmU3RhdGU7XG4gICAgY29uc3QgbGlua1NlcnZpY2UgPSB1c2VSZWYobmV3IExpbmtTZXJ2aWNlKCkpO1xuICAgIGNvbnN0IHBhZ2VzID0gdXNlUmVmKFtdKTtcbiAgICBjb25zdCBwcmV2RmlsZSA9IHVzZVJlZih1bmRlZmluZWQpO1xuICAgIGNvbnN0IHByZXZPcHRpb25zID0gdXNlUmVmKHVuZGVmaW5lZCk7XG4gICAgaWYgKGZpbGUgJiYgZmlsZSAhPT0gcHJldkZpbGUuY3VycmVudCAmJiBpc1BhcmFtZXRlck9iamVjdChmaWxlKSkge1xuICAgICAgICB3YXJuaW5nKCFkZXF1YWwoZmlsZSwgcHJldkZpbGUuY3VycmVudCksIGBGaWxlIHByb3AgcGFzc2VkIHRvIDxEb2N1bWVudCAvPiBjaGFuZ2VkLCBidXQgaXQncyBlcXVhbCB0byBwcmV2aW91cyBvbmUuIFRoaXMgbWlnaHQgcmVzdWx0IGluIHVubmVjZXNzYXJ5IHJlbG9hZHMuIENvbnNpZGVyIG1lbW9pemluZyB0aGUgdmFsdWUgcGFzc2VkIHRvIFwiZmlsZVwiIHByb3AuYCk7XG4gICAgICAgIHByZXZGaWxlLmN1cnJlbnQgPSBmaWxlO1xuICAgIH1cbiAgICAvLyBEZXRlY3Qgbm9uLW1lbW9pemVkIGNoYW5nZXMgaW4gb3B0aW9ucyBwcm9wXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucyAhPT0gcHJldk9wdGlvbnMuY3VycmVudCkge1xuICAgICAgICB3YXJuaW5nKCFkZXF1YWwob3B0aW9ucywgcHJldk9wdGlvbnMuY3VycmVudCksIGBPcHRpb25zIHByb3AgcGFzc2VkIHRvIDxEb2N1bWVudCAvPiBjaGFuZ2VkLCBidXQgaXQncyBlcXVhbCB0byBwcmV2aW91cyBvbmUuIFRoaXMgbWlnaHQgcmVzdWx0IGluIHVubmVjZXNzYXJ5IHJlbG9hZHMuIENvbnNpZGVyIG1lbW9pemluZyB0aGUgdmFsdWUgcGFzc2VkIHRvIFwib3B0aW9uc1wiIHByb3AuYCk7XG4gICAgICAgIHByZXZPcHRpb25zLmN1cnJlbnQgPSBvcHRpb25zO1xuICAgIH1cbiAgICBjb25zdCB2aWV3ZXIgPSB1c2VSZWYoe1xuICAgICAgICAvLyBIYW5kbGluZyBqdW1waW5nIHRvIGludGVybmFsIGxpbmtzIHRhcmdldFxuICAgICAgICBzY3JvbGxQYWdlSW50b1ZpZXc6IChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGRlc3QsIHBhZ2VOdW1iZXIsIHBhZ2VJbmRleCA9IHBhZ2VOdW1iZXIgLSAxIH0gPSBhcmdzO1xuICAgICAgICAgICAgLy8gRmlyc3QsIGNoZWNrIGlmIGN1c3RvbSBoYW5kbGluZyBvZiBvbkl0ZW1DbGljayB3YXMgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChvbkl0ZW1DbGljaykge1xuICAgICAgICAgICAgICAgIG9uSXRlbUNsaWNrKHsgZGVzdCwgcGFnZUluZGV4LCBwYWdlTnVtYmVyIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIG5vdCwgdHJ5IHRvIGxvb2sgZm9yIHRhcmdldCBwYWdlIHdpdGhpbiB0aGUgPERvY3VtZW50Pi5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBwYWdlcy5jdXJyZW50W3BhZ2VJbmRleF07XG4gICAgICAgICAgICBpZiAocGFnZSkge1xuICAgICAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgcGFnZSBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgICAgICAgcGFnZS5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhcm5pbmcoZmFsc2UsIGBBbiBpbnRlcm5hbCBsaW5rIGxlYWRpbmcgdG8gcGFnZSAke3BhZ2VOdW1iZXJ9IHdhcyBjbGlja2VkLCBidXQgbmVpdGhlciA8RG9jdW1lbnQ+IHdhcyBwcm92aWRlZCB3aXRoIG9uSXRlbUNsaWNrIG5vciBpdCB3YXMgYWJsZSB0byBmaW5kIHRoZSBwYWdlIHdpdGhpbiBpdHNlbGYuIEVpdGhlciBwcm92aWRlIG9uSXRlbUNsaWNrIHRvIDxEb2N1bWVudD4gYW5kIGhhbmRsZSBuYXZpZ2F0aW5nIGJ5IHlvdXJzZWxmIG9yIGVuc3VyZSB0aGF0IGFsbCBwYWdlcyBhcmUgcmVuZGVyZWQgd2l0aGluIDxEb2N1bWVudD4uYCk7XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgICAgIGxpbmtTZXJ2aWNlLFxuICAgICAgICBwYWdlcyxcbiAgICAgICAgdmlld2VyLFxuICAgIH0pLCBbXSk7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBkb2N1bWVudCBzb3VyY2UgaXMgcmVzb2x2ZWQgY29ycmVjdGx5XG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Tb3VyY2VTdWNjZXNzKCkge1xuICAgICAgICBpZiAob25Tb3VyY2VTdWNjZXNzUHJvcHMpIHtcbiAgICAgICAgICAgIG9uU291cmNlU3VjY2Vzc1Byb3BzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBkb2N1bWVudCBzb3VyY2UgZmFpbGVkIHRvIGJlIHJlc29sdmVkIGNvcnJlY3RseVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uU291cmNlRXJyb3IoKSB7XG4gICAgICAgIGlmICghc291cmNlRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyhmYWxzZSwgc291cmNlRXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvblNvdXJjZUVycm9yUHJvcHMpIHtcbiAgICAgICAgICAgIG9uU291cmNlRXJyb3JQcm9wcyhzb3VyY2VFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzZXRTb3VyY2UoKSB7XG4gICAgICAgIHNvdXJjZURpc3BhdGNoKHsgdHlwZTogJ1JFU0VUJyB9KTtcbiAgICB9XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaW9tZWpzL2Jpb21lL2lzc3Vlcy8zMDgwXG4gICAgdXNlRWZmZWN0KHJlc2V0U291cmNlLCBbZmlsZSwgc291cmNlRGlzcGF0Y2hdKTtcbiAgICBjb25zdCBmaW5kRG9jdW1lbnRTb3VyY2UgPSB1c2VDYWxsYmFjaygoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlsZSBpcyBhIHN0cmluZ1xuICAgICAgICBpZiAodHlwZW9mIGZpbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoaXNEYXRhVVJJKGZpbGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZUJ5dGVTdHJpbmcgPSBkYXRhVVJJdG9CeXRlU3RyaW5nKGZpbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGZpbGVCeXRlU3RyaW5nIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwbGF5Q09SU1dhcm5pbmcoKTtcbiAgICAgICAgICAgIHJldHVybiB7IHVybDogZmlsZSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbGUgaXMgUERGRGF0YVJhbmdlVHJhbnNwb3J0XG4gICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgUERGRGF0YVJhbmdlVHJhbnNwb3J0KSB7XG4gICAgICAgICAgICByZXR1cm4geyByYW5nZTogZmlsZSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbGUgaXMgYW4gQXJyYXlCdWZmZXJcbiAgICAgICAgaWYgKGlzQXJyYXlCdWZmZXIoZmlsZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGZpbGUgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhc2VzIGJlbG93IGFyZSBicm93c2VyLW9ubHkuXG4gICAgICAgICAqIElmIHlvdSdyZSBydW5uaW5nIG9uIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQsIHRoZXNlIGNhc2VzIHdpbGwgYmUgb2Ygbm8gdXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgICAgICAgLy8gRmlsZSBpcyBhIEJsb2JcbiAgICAgICAgICAgIGlmIChpc0Jsb2IoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0geWllbGQgbG9hZEZyb21GaWxlKGZpbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGEgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBmaWxlIG11c3QgYmUgYW4gb2JqZWN0XG4gICAgICAgIGludmFyaWFudCh0eXBlb2YgZmlsZSA9PT0gJ29iamVjdCcsICdJbnZhbGlkIHBhcmFtZXRlciBpbiBmaWxlLCBuZWVkIGVpdGhlciBVaW50OEFycmF5LCBzdHJpbmcgb3IgYSBwYXJhbWV0ZXIgb2JqZWN0Jyk7XG4gICAgICAgIGludmFyaWFudChpc1BhcmFtZXRlck9iamVjdChmaWxlKSwgJ0ludmFsaWQgcGFyYW1ldGVyIG9iamVjdDogbmVlZCBlaXRoZXIgLmRhdGEsIC5yYW5nZSBvciAudXJsJyk7XG4gICAgICAgIC8vIEZpbGUgLnVybCBpcyBhIHN0cmluZ1xuICAgICAgICBpZiAoJ3VybCcgaW4gZmlsZSAmJiB0eXBlb2YgZmlsZS51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoaXNEYXRhVVJJKGZpbGUudXJsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdXJsIH0gPSBmaWxlLCBvdGhlclBhcmFtcyA9IF9fcmVzdChmaWxlLCBbXCJ1cmxcIl0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVCeXRlU3RyaW5nID0gZGF0YVVSSXRvQnl0ZVN0cmluZyh1cmwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgZGF0YTogZmlsZUJ5dGVTdHJpbmcgfSwgb3RoZXJQYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzcGxheUNPUlNXYXJuaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfSksIFtmaWxlXSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgY2FuY2VsbGFibGUgPSBtYWtlQ2FuY2VsbGFibGUoZmluZERvY3VtZW50U291cmNlKCkpO1xuICAgICAgICBjYW5jZWxsYWJsZS5wcm9taXNlXG4gICAgICAgICAgICAudGhlbigobmV4dFNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgc291cmNlRGlzcGF0Y2goeyB0eXBlOiAnUkVTT0xWRScsIHZhbHVlOiBuZXh0U291cmNlIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgc291cmNlRGlzcGF0Y2goeyB0eXBlOiAnUkVKRUNUJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2FuY2VsUnVubmluZ1Rhc2soY2FuY2VsbGFibGUpO1xuICAgICAgICB9O1xuICAgIH0sIFtmaW5kRG9jdW1lbnRTb3VyY2UsIHNvdXJjZURpc3BhdGNoXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvblNvdXJjZUVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb25Tb3VyY2VTdWNjZXNzKCk7XG4gICAgfSwgW3NvdXJjZV0pO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgZG9jdW1lbnQgaXMgcmVhZCBzdWNjZXNzZnVsbHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbkxvYWRTdWNjZXNzKCkge1xuICAgICAgICBpZiAoIXBkZikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25Mb2FkU3VjY2Vzc1Byb3BzKSB7XG4gICAgICAgICAgICBvbkxvYWRTdWNjZXNzUHJvcHMocGRmKTtcbiAgICAgICAgfVxuICAgICAgICBwYWdlcy5jdXJyZW50ID0gbmV3IEFycmF5KHBkZi5udW1QYWdlcyk7XG4gICAgICAgIGxpbmtTZXJ2aWNlLmN1cnJlbnQuc2V0RG9jdW1lbnQocGRmKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBkb2N1bWVudCBmYWlsZWQgdG8gcmVhZCBzdWNjZXNzZnVsbHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbkxvYWRFcnJvcigpIHtcbiAgICAgICAgaWYgKCFwZGZFcnJvcikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKGZhbHNlLCBwZGZFcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKG9uTG9hZEVycm9yUHJvcHMpIHtcbiAgICAgICAgICAgIG9uTG9hZEVycm9yUHJvcHMocGRmRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IHVzZUVmZmVjdCBpbnRlbnRpb25hbGx5IHRyaWdnZXJlZCBvbiBzb3VyY2UgY2hhbmdlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIHJlc2V0RG9jdW1lbnQoKSB7XG4gICAgICAgIHBkZkRpc3BhdGNoKHsgdHlwZTogJ1JFU0VUJyB9KTtcbiAgICB9LCBbcGRmRGlzcGF0Y2gsIHNvdXJjZV0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gbG9hZERvY3VtZW50KCkge1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvY3VtZW50SW5pdFBhcmFtcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc291cmNlKSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGRlc3Ryb3lhYmxlID0gcGRmanMuZ2V0RG9jdW1lbnQoZG9jdW1lbnRJbml0UGFyYW1zKTtcbiAgICAgICAgaWYgKG9uTG9hZFByb2dyZXNzKSB7XG4gICAgICAgICAgICBkZXN0cm95YWJsZS5vblByb2dyZXNzID0gb25Mb2FkUHJvZ3Jlc3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uUGFzc3dvcmQpIHtcbiAgICAgICAgICAgIGRlc3Ryb3lhYmxlLm9uUGFzc3dvcmQgPSBvblBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvYWRpbmdUYXNrID0gZGVzdHJveWFibGU7XG4gICAgICAgIGxvYWRpbmdUYXNrLnByb21pc2VcbiAgICAgICAgICAgIC50aGVuKChuZXh0UGRmKSA9PiB7XG4gICAgICAgICAgICBwZGZEaXNwYXRjaCh7IHR5cGU6ICdSRVNPTFZFJywgdmFsdWU6IG5leHRQZGYgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAobG9hZGluZ1Rhc2suZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGRmRGlzcGF0Y2goeyB0eXBlOiAnUkVKRUNUJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgbG9hZGluZ1Rhc2suZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgIH0sIFtvcHRpb25zLCBwZGZEaXNwYXRjaCwgc291cmNlXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcGRmID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZGYgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvbkxvYWRFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uTG9hZFN1Y2Nlc3MoKTtcbiAgICB9LCBbcGRmXSk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIHNldHVwTGlua1NlcnZpY2UoKSB7XG4gICAgICAgIGxpbmtTZXJ2aWNlLmN1cnJlbnQuc2V0Vmlld2VyKHZpZXdlci5jdXJyZW50KTtcbiAgICAgICAgbGlua1NlcnZpY2UuY3VycmVudC5zZXRFeHRlcm5hbExpbmtSZWwoZXh0ZXJuYWxMaW5rUmVsKTtcbiAgICAgICAgbGlua1NlcnZpY2UuY3VycmVudC5zZXRFeHRlcm5hbExpbmtUYXJnZXQoZXh0ZXJuYWxMaW5rVGFyZ2V0KTtcbiAgICB9LCBbZXh0ZXJuYWxMaW5rUmVsLCBleHRlcm5hbExpbmtUYXJnZXRdKTtcbiAgICBjb25zdCByZWdpc3RlclBhZ2UgPSB1c2VDYWxsYmFjaygocGFnZUluZGV4LCByZWYpID0+IHtcbiAgICAgICAgcGFnZXMuY3VycmVudFtwYWdlSW5kZXhdID0gcmVmO1xuICAgIH0sIFtdKTtcbiAgICBjb25zdCB1bnJlZ2lzdGVyUGFnZSA9IHVzZUNhbGxiYWNrKChwYWdlSW5kZXgpID0+IHtcbiAgICAgICAgZGVsZXRlIHBhZ2VzLmN1cnJlbnRbcGFnZUluZGV4XTtcbiAgICB9LCBbXSk7XG4gICAgY29uc3QgY2hpbGRDb250ZXh0ID0gdXNlTWVtbygoKSA9PiAoe1xuICAgICAgICBpbWFnZVJlc291cmNlc1BhdGgsXG4gICAgICAgIGxpbmtTZXJ2aWNlOiBsaW5rU2VydmljZS5jdXJyZW50LFxuICAgICAgICBvbkl0ZW1DbGljayxcbiAgICAgICAgcGRmLFxuICAgICAgICByZWdpc3RlclBhZ2UsXG4gICAgICAgIHJlbmRlck1vZGUsXG4gICAgICAgIHJvdGF0ZSxcbiAgICAgICAgdW5yZWdpc3RlclBhZ2UsXG4gICAgfSksIFtpbWFnZVJlc291cmNlc1BhdGgsIG9uSXRlbUNsaWNrLCBwZGYsIHJlZ2lzdGVyUGFnZSwgcmVuZGVyTW9kZSwgcm90YXRlLCB1bnJlZ2lzdGVyUGFnZV0pO1xuICAgIGNvbnN0IGV2ZW50UHJvcHMgPSB1c2VNZW1vKCgpID0+IG1ha2VFdmVudFByb3BzKG90aGVyUHJvcHMsICgpID0+IHBkZiksIFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IEZJWE1FXG4gICAgW290aGVyUHJvcHMsIHBkZl0pO1xuICAgIGZ1bmN0aW9uIHJlbmRlckNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gX2pzeChEb2N1bWVudENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNoaWxkQ29udGV4dCwgY2hpbGRyZW46IGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJDb250ZW50KCkge1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfanN4KE1lc3NhZ2UsIHsgdHlwZTogXCJuby1kYXRhXCIsIGNoaWxkcmVuOiB0eXBlb2Ygbm9EYXRhID09PSAnZnVuY3Rpb24nID8gbm9EYXRhKCkgOiBub0RhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBkZiA9PT0gdW5kZWZpbmVkIHx8IHBkZiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIChfanN4KE1lc3NhZ2UsIHsgdHlwZTogXCJsb2FkaW5nXCIsIGNoaWxkcmVuOiB0eXBlb2YgbG9hZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IGxvYWRpbmcoKSA6IGxvYWRpbmcgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZGYgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gX2pzeChNZXNzYWdlLCB7IHR5cGU6IFwiZXJyb3JcIiwgY2hpbGRyZW46IHR5cGVvZiBlcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IGVycm9yKCkgOiBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVuZGVyQ2hpbGRyZW4oKTtcbiAgICB9XG4gICAgcmV0dXJuIChfanN4KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oeyBjbGFzc05hbWU6IGNsc3goJ3JlYWN0LXBkZl9fRG9jdW1lbnQnLCBjbGFzc05hbWUpLCBcbiAgICAgICAgLy8gQXNzZXJ0aW9uIGlzIG5lZWRlZCBmb3IgUmVhY3QgMTggY29tcGF0aWJpbGl0eVxuICAgICAgICByZWY6IGlucHV0UmVmLCBzdHlsZToge1xuICAgICAgICAgICAgWyctLXNjYWxlLWZhY3RvciddOiAnMScsXG4gICAgICAgIH0gfSwgZXZlbnRQcm9wcywgeyBjaGlsZHJlbjogcmVuZGVyQ29udGVudCgpIH0pKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IERvY3VtZW50O1xuIiwiJ3VzZSBjbGllbnQnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmNvbnN0IGRvY3VtZW50Q29udGV4dCA9IGNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBkb2N1bWVudENvbnRleHQ7XG4iLCIvKiBDb3B5cmlnaHQgMjAxNSBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuY29uc3QgREVGQVVMVF9MSU5LX1JFTCA9ICdub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93JztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpbmtTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5leHRlcm5hbExpbmtFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5leHRlcm5hbExpbmtSZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxMaW5rVGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGRmRG9jdW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucGRmVmlld2VyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBzZXREb2N1bWVudChwZGZEb2N1bWVudCkge1xuICAgICAgICB0aGlzLnBkZkRvY3VtZW50ID0gcGRmRG9jdW1lbnQ7XG4gICAgfVxuICAgIHNldFZpZXdlcihwZGZWaWV3ZXIpIHtcbiAgICAgICAgdGhpcy5wZGZWaWV3ZXIgPSBwZGZWaWV3ZXI7XG4gICAgfVxuICAgIHNldEV4dGVybmFsTGlua1JlbChleHRlcm5hbExpbmtSZWwpIHtcbiAgICAgICAgdGhpcy5leHRlcm5hbExpbmtSZWwgPSBleHRlcm5hbExpbmtSZWw7XG4gICAgfVxuICAgIHNldEV4dGVybmFsTGlua1RhcmdldChleHRlcm5hbExpbmtUYXJnZXQpIHtcbiAgICAgICAgdGhpcy5leHRlcm5hbExpbmtUYXJnZXQgPSBleHRlcm5hbExpbmtUYXJnZXQ7XG4gICAgfVxuICAgIHNldEhpc3RvcnkoKSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgZW1wdHlcbiAgICB9XG4gICAgZ2V0IHBhZ2VzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50ID8gdGhpcy5wZGZEb2N1bWVudC5udW1QYWdlcyA6IDA7XG4gICAgfVxuICAgIGdldCBwYWdlKCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5wZGZWaWV3ZXIsICdQREYgdmlld2VyIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyIHx8IDA7XG4gICAgfVxuICAgIHNldCBwYWdlKHZhbHVlKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLnBkZlZpZXdlciwgJ1BERiB2aWV3ZXIgaXMgbm90IGluaXRpYWxpemVkLicpO1xuICAgICAgICB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlciA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgcm90YXRpb24oKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBzZXQgcm90YXRpb24odmFsdWUpIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIH1cbiAgICBnb1RvRGVzdGluYXRpb24oZGVzdCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGludmFyaWFudCh0aGlzLnBkZkRvY3VtZW50LCAnUERGIGRvY3VtZW50IG5vdCBsb2FkZWQuJyk7XG4gICAgICAgICAgICBpbnZhcmlhbnQoZGVzdCwgJ0Rlc3RpbmF0aW9uIGlzIG5vdCBzcGVjaWZpZWQuJyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGRlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZGZEb2N1bWVudC5nZXREZXN0aW5hdGlvbihkZXN0KS50aGVuKHJlc29sdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkZXN0KSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXN0LnRoZW4ocmVzb2x2ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLnRoZW4oKGV4cGxpY2l0RGVzdCkgPT4ge1xuICAgICAgICAgICAgaW52YXJpYW50KEFycmF5LmlzQXJyYXkoZXhwbGljaXREZXN0KSwgYFwiJHtleHBsaWNpdERlc3R9XCIgaXMgbm90IGEgdmFsaWQgZGVzdGluYXRpb24gYXJyYXkuYCk7XG4gICAgICAgICAgICBjb25zdCBkZXN0UmVmID0gZXhwbGljaXREZXN0WzBdO1xuICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQodGhpcy5wZGZEb2N1bWVudCwgJ1BERiBkb2N1bWVudCBub3QgbG9hZGVkLicpO1xuICAgICAgICAgICAgICAgIGlmIChkZXN0UmVmIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGRmRG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYWdlSW5kZXgoZGVzdFJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChwYWdlSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGFnZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZhcmlhbnQoZmFsc2UsIGBcIiR7ZGVzdFJlZn1cIiBpcyBub3QgYSB2YWxpZCBwYWdlIHJlZmVyZW5jZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZXN0UmVmID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRlc3RSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50KGZhbHNlLCBgXCIke2Rlc3RSZWZ9XCIgaXMgbm90IGEgdmFsaWQgZGVzdGluYXRpb24gcmVmZXJlbmNlLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnRoZW4oKHBhZ2VJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSBwYWdlSW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIGludmFyaWFudCh0aGlzLnBkZlZpZXdlciwgJ1BERiB2aWV3ZXIgaXMgbm90IGluaXRpYWxpemVkLicpO1xuICAgICAgICAgICAgICAgIGludmFyaWFudChwYWdlTnVtYmVyID49IDEgJiYgcGFnZU51bWJlciA8PSB0aGlzLnBhZ2VzQ291bnQsIGBcIiR7cGFnZU51bWJlcn1cIiBpcyBub3QgYSB2YWxpZCBwYWdlIG51bWJlci5gKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBkZlZpZXdlci5zY3JvbGxQYWdlSW50b1ZpZXcoe1xuICAgICAgICAgICAgICAgICAgICBkZXN0OiBleHBsaWNpdERlc3QsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmF2aWdhdGVUbyhkZXN0KSB7XG4gICAgICAgIHRoaXMuZ29Ub0Rlc3RpbmF0aW9uKGRlc3QpO1xuICAgIH1cbiAgICBnb1RvUGFnZShwYWdlTnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHBhZ2VJbmRleCA9IHBhZ2VOdW1iZXIgLSAxO1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5wZGZWaWV3ZXIsICdQREYgdmlld2VyIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgaW52YXJpYW50KHBhZ2VOdW1iZXIgPj0gMSAmJiBwYWdlTnVtYmVyIDw9IHRoaXMucGFnZXNDb3VudCwgYFwiJHtwYWdlTnVtYmVyfVwiIGlzIG5vdCBhIHZhbGlkIHBhZ2UgbnVtYmVyLmApO1xuICAgICAgICB0aGlzLnBkZlZpZXdlci5zY3JvbGxQYWdlSW50b1ZpZXcoe1xuICAgICAgICAgICAgcGFnZUluZGV4LFxuICAgICAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZExpbmtBdHRyaWJ1dGVzKGxpbmssIHVybCwgbmV3V2luZG93KSB7XG4gICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgbGluay5yZWwgPSB0aGlzLmV4dGVybmFsTGlua1JlbCB8fCBERUZBVUxUX0xJTktfUkVMO1xuICAgICAgICBsaW5rLnRhcmdldCA9IG5ld1dpbmRvdyA/ICdfYmxhbmsnIDogdGhpcy5leHRlcm5hbExpbmtUYXJnZXQgfHwgJyc7XG4gICAgfVxuICAgIGdldERlc3RpbmF0aW9uSGFzaCgpIHtcbiAgICAgICAgcmV0dXJuICcjJztcbiAgICB9XG4gICAgZ2V0QW5jaG9yVXJsKCkge1xuICAgICAgICByZXR1cm4gJyMnO1xuICAgIH1cbiAgICBzZXRIYXNoKCkge1xuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGVtcHR5XG4gICAgfVxuICAgIGV4ZWN1dGVOYW1lZEFjdGlvbigpIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIH1cbiAgICBjYWNoZVBhZ2VSZWYoKSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgZW1wdHlcbiAgICB9XG4gICAgaXNQYWdlVmlzaWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlzUGFnZUNhY2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGV4ZWN1dGVTZXRPQ0dTdGF0ZSgpIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNZXNzYWdlKHsgY2hpbGRyZW4sIHR5cGUgfSkge1xuICAgIHJldHVybiBfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBgcmVhY3QtcGRmX19tZXNzYWdlIHJlYWN0LXBkZl9fbWVzc2FnZS0tJHt0eXBlfWAsIGNoaWxkcmVuOiBjaGlsZHJlbiB9KTtcbn1cbiIsIid1c2UgY2xpZW50JztcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtYWtlQ2FuY2VsbGFibGUgZnJvbSAnbWFrZS1jYW5jZWxsYWJsZS1wcm9taXNlJztcbmltcG9ydCBtYWtlRXZlbnRQcm9wcyBmcm9tICdtYWtlLWV2ZW50LXByb3BzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IG1lcmdlUmVmcyBmcm9tICdtZXJnZS1yZWZzJztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgUGFnZUNvbnRleHQgZnJvbSAnLi9QYWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgTWVzc2FnZSBmcm9tICcuL01lc3NhZ2UuanMnO1xuaW1wb3J0IENhbnZhcyBmcm9tICcuL1BhZ2UvQ2FudmFzLmpzJztcbmltcG9ydCBUZXh0TGF5ZXIgZnJvbSAnLi9QYWdlL1RleHRMYXllci5qcyc7XG5pbXBvcnQgQW5ub3RhdGlvbkxheWVyIGZyb20gJy4vUGFnZS9Bbm5vdGF0aW9uTGF5ZXIuanMnO1xuaW1wb3J0IHsgY2FuY2VsUnVubmluZ1Rhc2ssIGlzUHJvdmlkZWQsIG1ha2VQYWdlQ2FsbGJhY2sgfSBmcm9tICcuL3NoYXJlZC91dGlscy5qcyc7XG5pbXBvcnQgdXNlRG9jdW1lbnRDb250ZXh0IGZyb20gJy4vc2hhcmVkL2hvb2tzL3VzZURvY3VtZW50Q29udGV4dC5qcyc7XG5pbXBvcnQgdXNlUmVzb2x2ZXIgZnJvbSAnLi9zaGFyZWQvaG9va3MvdXNlUmVzb2x2ZXIuanMnO1xuY29uc3QgZGVmYXVsdFNjYWxlID0gMTtcbi8qKlxuICogRGlzcGxheXMgYSBwYWdlLlxuICpcbiAqIFNob3VsZCBiZSBwbGFjZWQgaW5zaWRlIGA8RG9jdW1lbnQgLz5gLiBBbHRlcm5hdGl2ZWx5LCBpdCBjYW4gaGF2ZSBgcGRmYCBwcm9wIHBhc3NlZCwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gYDxEb2N1bWVudCAvPmAncyBgb25Mb2FkU3VjY2Vzc2AgY2FsbGJhY2sgZnVuY3Rpb24sIGhvd2V2ZXIgc29tZSBhZHZhbmNlZCBmdW5jdGlvbnMgbGlrZSBsaW5raW5nIGJldHdlZW4gcGFnZXMgaW5zaWRlIGEgZG9jdW1lbnQgbWF5IG5vdCBiZSB3b3JraW5nIGNvcnJlY3RseS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUGFnZShwcm9wcykge1xuICAgIGNvbnN0IGRvY3VtZW50Q29udGV4dCA9IHVzZURvY3VtZW50Q29udGV4dCgpO1xuICAgIGNvbnN0IG1lcmdlZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkb2N1bWVudENvbnRleHQpLCBwcm9wcyk7XG4gICAgY29uc3QgeyBfY2xhc3NOYW1lID0gJ3JlYWN0LXBkZl9fUGFnZScsIF9lbmFibGVSZWdpc3RlclVucmVnaXN0ZXJQYWdlID0gdHJ1ZSwgY2FudmFzQmFja2dyb3VuZCwgY2FudmFzUmVmLCBjaGlsZHJlbiwgY2xhc3NOYW1lLCBjdXN0b21SZW5kZXJlcjogQ3VzdG9tUmVuZGVyZXIsIGN1c3RvbVRleHRSZW5kZXJlciwgZGV2aWNlUGl4ZWxSYXRpbywgZXJyb3IgPSAnRmFpbGVkIHRvIGxvYWQgdGhlIHBhZ2UuJywgaGVpZ2h0LCBpbnB1dFJlZiwgbG9hZGluZyA9ICdMb2FkaW5nIHBhZ2XigKYnLCBub0RhdGEgPSAnTm8gcGFnZSBzcGVjaWZpZWQuJywgb25HZXRBbm5vdGF0aW9uc0Vycm9yOiBvbkdldEFubm90YXRpb25zRXJyb3JQcm9wcywgb25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3M6IG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzUHJvcHMsIG9uR2V0U3RydWN0VHJlZUVycm9yOiBvbkdldFN0cnVjdFRyZWVFcnJvclByb3BzLCBvbkdldFN0cnVjdFRyZWVTdWNjZXNzOiBvbkdldFN0cnVjdFRyZWVTdWNjZXNzUHJvcHMsIG9uR2V0VGV4dEVycm9yOiBvbkdldFRleHRFcnJvclByb3BzLCBvbkdldFRleHRTdWNjZXNzOiBvbkdldFRleHRTdWNjZXNzUHJvcHMsIG9uTG9hZEVycm9yOiBvbkxvYWRFcnJvclByb3BzLCBvbkxvYWRTdWNjZXNzOiBvbkxvYWRTdWNjZXNzUHJvcHMsIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3I6IG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3JQcm9wcywgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzOiBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NQcm9wcywgb25SZW5kZXJFcnJvcjogb25SZW5kZXJFcnJvclByb3BzLCBvblJlbmRlclN1Y2Nlc3M6IG9uUmVuZGVyU3VjY2Vzc1Byb3BzLCBvblJlbmRlclRleHRMYXllckVycm9yOiBvblJlbmRlclRleHRMYXllckVycm9yUHJvcHMsIG9uUmVuZGVyVGV4dExheWVyU3VjY2Vzczogb25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzUHJvcHMsIHBhZ2VJbmRleDogcGFnZUluZGV4UHJvcHMsIHBhZ2VOdW1iZXI6IHBhZ2VOdW1iZXJQcm9wcywgcGRmLCByZWdpc3RlclBhZ2UsIHJlbmRlckFubm90YXRpb25MYXllcjogcmVuZGVyQW5ub3RhdGlvbkxheWVyUHJvcHMgPSB0cnVlLCByZW5kZXJGb3JtcyA9IGZhbHNlLCByZW5kZXJNb2RlID0gJ2NhbnZhcycsIHJlbmRlclRleHRMYXllcjogcmVuZGVyVGV4dExheWVyUHJvcHMgPSB0cnVlLCByb3RhdGU6IHJvdGF0ZVByb3BzLCBzY2FsZTogc2NhbGVQcm9wcyA9IGRlZmF1bHRTY2FsZSwgdW5yZWdpc3RlclBhZ2UsIHdpZHRoIH0gPSBtZXJnZWRQcm9wcywgb3RoZXJQcm9wcyA9IF9fcmVzdChtZXJnZWRQcm9wcywgW1wiX2NsYXNzTmFtZVwiLCBcIl9lbmFibGVSZWdpc3RlclVucmVnaXN0ZXJQYWdlXCIsIFwiY2FudmFzQmFja2dyb3VuZFwiLCBcImNhbnZhc1JlZlwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY3VzdG9tUmVuZGVyZXJcIiwgXCJjdXN0b21UZXh0UmVuZGVyZXJcIiwgXCJkZXZpY2VQaXhlbFJhdGlvXCIsIFwiZXJyb3JcIiwgXCJoZWlnaHRcIiwgXCJpbnB1dFJlZlwiLCBcImxvYWRpbmdcIiwgXCJub0RhdGFcIiwgXCJvbkdldEFubm90YXRpb25zRXJyb3JcIiwgXCJvbkdldEFubm90YXRpb25zU3VjY2Vzc1wiLCBcIm9uR2V0U3RydWN0VHJlZUVycm9yXCIsIFwib25HZXRTdHJ1Y3RUcmVlU3VjY2Vzc1wiLCBcIm9uR2V0VGV4dEVycm9yXCIsIFwib25HZXRUZXh0U3VjY2Vzc1wiLCBcIm9uTG9hZEVycm9yXCIsIFwib25Mb2FkU3VjY2Vzc1wiLCBcIm9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3JcIiwgXCJvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NcIiwgXCJvblJlbmRlckVycm9yXCIsIFwib25SZW5kZXJTdWNjZXNzXCIsIFwib25SZW5kZXJUZXh0TGF5ZXJFcnJvclwiLCBcIm9uUmVuZGVyVGV4dExheWVyU3VjY2Vzc1wiLCBcInBhZ2VJbmRleFwiLCBcInBhZ2VOdW1iZXJcIiwgXCJwZGZcIiwgXCJyZWdpc3RlclBhZ2VcIiwgXCJyZW5kZXJBbm5vdGF0aW9uTGF5ZXJcIiwgXCJyZW5kZXJGb3Jtc1wiLCBcInJlbmRlck1vZGVcIiwgXCJyZW5kZXJUZXh0TGF5ZXJcIiwgXCJyb3RhdGVcIiwgXCJzY2FsZVwiLCBcInVucmVnaXN0ZXJQYWdlXCIsIFwid2lkdGhcIl0pO1xuICAgIGNvbnN0IFtwYWdlU3RhdGUsIHBhZ2VEaXNwYXRjaF0gPSB1c2VSZXNvbHZlcigpO1xuICAgIGNvbnN0IHsgdmFsdWU6IHBhZ2UsIGVycm9yOiBwYWdlRXJyb3IgfSA9IHBhZ2VTdGF0ZTtcbiAgICBjb25zdCBwYWdlRWxlbWVudCA9IHVzZVJlZihudWxsKTtcbiAgICBpbnZhcmlhbnQocGRmLCAnQXR0ZW1wdGVkIHRvIGxvYWQgYSBwYWdlLCBidXQgbm8gZG9jdW1lbnQgd2FzIHNwZWNpZmllZC4gV3JhcCA8UGFnZSAvPiBpbiBhIDxEb2N1bWVudCAvPiBvciBwYXNzIGV4cGxpY2l0IGBwZGZgIHByb3AuJyk7XG4gICAgY29uc3QgcGFnZUluZGV4ID0gaXNQcm92aWRlZChwYWdlTnVtYmVyUHJvcHMpID8gcGFnZU51bWJlclByb3BzIC0gMSA6IHBhZ2VJbmRleFByb3BzICE9PSBudWxsICYmIHBhZ2VJbmRleFByb3BzICE9PSB2b2lkIDAgPyBwYWdlSW5kZXhQcm9wcyA6IG51bGw7XG4gICAgY29uc3QgcGFnZU51bWJlciA9IHBhZ2VOdW1iZXJQcm9wcyAhPT0gbnVsbCAmJiBwYWdlTnVtYmVyUHJvcHMgIT09IHZvaWQgMCA/IHBhZ2VOdW1iZXJQcm9wcyA6IChpc1Byb3ZpZGVkKHBhZ2VJbmRleFByb3BzKSA/IHBhZ2VJbmRleFByb3BzICsgMSA6IG51bGwpO1xuICAgIGNvbnN0IHJvdGF0ZSA9IHJvdGF0ZVByb3BzICE9PSBudWxsICYmIHJvdGF0ZVByb3BzICE9PSB2b2lkIDAgPyByb3RhdGVQcm9wcyA6IChwYWdlID8gcGFnZS5yb3RhdGUgOiBudWxsKTtcbiAgICBjb25zdCBzY2FsZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJlIGRlZmF1bHQsIHdlJ2xsIHJlbmRlciBwYWdlIGF0IDEwMCUgKiBzY2FsZSB3aWR0aC5cbiAgICAgICAgbGV0IHBhZ2VTY2FsZSA9IDE7XG4gICAgICAgIC8vIFBhc3Npbmcgc2NhbGUgZXhwbGljaXRseSBudWxsIHdvdWxkIGNhdXNlIHRoZSBwYWdlIG5vdCB0byByZW5kZXJcbiAgICAgICAgY29uc3Qgc2NhbGVXaXRoRGVmYXVsdCA9IHNjYWxlUHJvcHMgIT09IG51bGwgJiYgc2NhbGVQcm9wcyAhPT0gdm9pZCAwID8gc2NhbGVQcm9wcyA6IGRlZmF1bHRTY2FsZTtcbiAgICAgICAgLy8gSWYgd2lkdGgvaGVpZ2h0IGlzIGRlZmluZWQsIGNhbGN1bGF0ZSB0aGUgc2NhbGUgb2YgdGhlIHBhZ2Ugc28gaXQgY291bGQgYmUgb2YgZGVzaXJlZCB3aWR0aC5cbiAgICAgICAgaWYgKHdpZHRoIHx8IGhlaWdodCkge1xuICAgICAgICAgICAgY29uc3Qgdmlld3BvcnQgPSBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IDEsIHJvdGF0aW9uOiByb3RhdGUgfSk7XG4gICAgICAgICAgICBpZiAod2lkdGgpIHtcbiAgICAgICAgICAgICAgICBwYWdlU2NhbGUgPSB3aWR0aCAvIHZpZXdwb3J0LndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgcGFnZVNjYWxlID0gaGVpZ2h0IC8gdmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2FsZVdpdGhEZWZhdWx0ICogcGFnZVNjYWxlO1xuICAgIH0sIFtoZWlnaHQsIHBhZ2UsIHJvdGF0ZSwgc2NhbGVQcm9wcywgd2lkdGhdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiB1c2VFZmZlY3QgaW50ZW50aW9uYWxseSB0cmlnZ2VyZWQgb24gcGRmIGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiBob29rKCkge1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc1Byb3ZpZGVkKHBhZ2VJbmRleCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfZW5hYmxlUmVnaXN0ZXJVbnJlZ2lzdGVyUGFnZSAmJiB1bnJlZ2lzdGVyUGFnZSkge1xuICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJQYWdlKHBhZ2VJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSwgW19lbmFibGVSZWdpc3RlclVucmVnaXN0ZXJQYWdlLCBwZGYsIHBhZ2VJbmRleCwgdW5yZWdpc3RlclBhZ2VdKTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHBhZ2UgaXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTG9hZFN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmIChvbkxvYWRTdWNjZXNzUHJvcHMpIHtcbiAgICAgICAgICAgIGlmICghcGFnZSB8fCAhc2NhbGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9uTG9hZFN1Y2Nlc3NQcm9wcyhtYWtlUGFnZUNhbGxiYWNrKHBhZ2UsIHNjYWxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9lbmFibGVSZWdpc3RlclVucmVnaXN0ZXJQYWdlICYmIHJlZ2lzdGVyUGFnZSkge1xuICAgICAgICAgICAgaWYgKCFpc1Byb3ZpZGVkKHBhZ2VJbmRleCkgfHwgIXBhZ2VFbGVtZW50LmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZ2lzdGVyUGFnZShwYWdlSW5kZXgsIHBhZ2VFbGVtZW50LmN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgcGFnZSBmYWlsZWQgdG8gbG9hZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTG9hZEVycm9yKCkge1xuICAgICAgICBpZiAoIXBhZ2VFcnJvcikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKGZhbHNlLCBwYWdlRXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvbkxvYWRFcnJvclByb3BzKSB7XG4gICAgICAgICAgICBvbkxvYWRFcnJvclByb3BzKHBhZ2VFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdXNlRWZmZWN0IGludGVudGlvbmFsbHkgdHJpZ2dlcmVkIG9uIHBkZiBhbmQgcGFnZUluZGV4IGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiByZXNldFBhZ2UoKSB7XG4gICAgICAgIHBhZ2VEaXNwYXRjaCh7IHR5cGU6ICdSRVNFVCcgfSk7XG4gICAgfSwgW3BhZ2VEaXNwYXRjaCwgcGRmLCBwYWdlSW5kZXhdKTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gbG9hZFBhZ2UoKSB7XG4gICAgICAgIGlmICghcGRmIHx8ICFwYWdlTnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FuY2VsbGFibGUgPSBtYWtlQ2FuY2VsbGFibGUocGRmLmdldFBhZ2UocGFnZU51bWJlcikpO1xuICAgICAgICBjb25zdCBydW5uaW5nVGFzayA9IGNhbmNlbGxhYmxlO1xuICAgICAgICBjYW5jZWxsYWJsZS5wcm9taXNlXG4gICAgICAgICAgICAudGhlbigobmV4dFBhZ2UpID0+IHtcbiAgICAgICAgICAgIHBhZ2VEaXNwYXRjaCh7IHR5cGU6ICdSRVNPTFZFJywgdmFsdWU6IG5leHRQYWdlIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcGFnZURpc3BhdGNoKHsgdHlwZTogJ1JFSkVDVCcsIGVycm9yIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICgpID0+IGNhbmNlbFJ1bm5pbmdUYXNrKHJ1bm5pbmdUYXNrKTtcbiAgICB9LCBbcGFnZURpc3BhdGNoLCBwZGYsIHBhZ2VOdW1iZXJdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBPbW1pdHRlZCBjYWxsYmFja3Mgc28gdGhleSBhcmUgbm90IGNhbGxlZCBldmVyeSB0aW1lIHRoZXkgY2hhbmdlXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHBhZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgb25Mb2FkRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvbkxvYWRTdWNjZXNzKCk7XG4gICAgfSwgW3BhZ2UsIHNjYWxlXSk7XG4gICAgY29uc3QgY2hpbGRDb250ZXh0ID0gdXNlTWVtbygoKSA9PiBcbiAgICAvLyBUZWNobmljYWxseSB0aGVyZSBjYW5ub3QgYmUgcGFnZSB3aXRob3V0IHBhZ2VJbmRleCwgcGFnZU51bWJlciwgcm90YXRlIGFuZCBzY2FsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICBwYWdlICYmIGlzUHJvdmlkZWQocGFnZUluZGV4KSAmJiBwYWdlTnVtYmVyICYmIGlzUHJvdmlkZWQocm90YXRlKSAmJiBpc1Byb3ZpZGVkKHNjYWxlKVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIF9jbGFzc05hbWUsXG4gICAgICAgICAgICBjYW52YXNCYWNrZ3JvdW5kLFxuICAgICAgICAgICAgY3VzdG9tVGV4dFJlbmRlcmVyLFxuICAgICAgICAgICAgZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIG9uR2V0QW5ub3RhdGlvbnNFcnJvcjogb25HZXRBbm5vdGF0aW9uc0Vycm9yUHJvcHMsXG4gICAgICAgICAgICBvbkdldEFubm90YXRpb25zU3VjY2Vzczogb25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3NQcm9wcyxcbiAgICAgICAgICAgIG9uR2V0U3RydWN0VHJlZUVycm9yOiBvbkdldFN0cnVjdFRyZWVFcnJvclByb3BzLFxuICAgICAgICAgICAgb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzczogb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzc1Byb3BzLFxuICAgICAgICAgICAgb25HZXRUZXh0RXJyb3I6IG9uR2V0VGV4dEVycm9yUHJvcHMsXG4gICAgICAgICAgICBvbkdldFRleHRTdWNjZXNzOiBvbkdldFRleHRTdWNjZXNzUHJvcHMsXG4gICAgICAgICAgICBvblJlbmRlckFubm90YXRpb25MYXllckVycm9yOiBvblJlbmRlckFubm90YXRpb25MYXllckVycm9yUHJvcHMsXG4gICAgICAgICAgICBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3M6IG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyU3VjY2Vzc1Byb3BzLFxuICAgICAgICAgICAgb25SZW5kZXJFcnJvcjogb25SZW5kZXJFcnJvclByb3BzLFxuICAgICAgICAgICAgb25SZW5kZXJTdWNjZXNzOiBvblJlbmRlclN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgICAgIG9uUmVuZGVyVGV4dExheWVyRXJyb3I6IG9uUmVuZGVyVGV4dExheWVyRXJyb3JQcm9wcyxcbiAgICAgICAgICAgIG9uUmVuZGVyVGV4dExheWVyU3VjY2Vzczogb25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzUHJvcHMsXG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgcGFnZUluZGV4LFxuICAgICAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgICAgIHJlbmRlckZvcm1zLFxuICAgICAgICAgICAgcmVuZGVyVGV4dExheWVyOiByZW5kZXJUZXh0TGF5ZXJQcm9wcyxcbiAgICAgICAgICAgIHJvdGF0ZSxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICB9XG4gICAgICAgIDogbnVsbCwgW1xuICAgICAgICBfY2xhc3NOYW1lLFxuICAgICAgICBjYW52YXNCYWNrZ3JvdW5kLFxuICAgICAgICBjdXN0b21UZXh0UmVuZGVyZXIsXG4gICAgICAgIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgIG9uR2V0QW5ub3RhdGlvbnNFcnJvclByb3BzLFxuICAgICAgICBvbkdldEFubm90YXRpb25zU3VjY2Vzc1Byb3BzLFxuICAgICAgICBvbkdldFN0cnVjdFRyZWVFcnJvclByb3BzLFxuICAgICAgICBvbkdldFN0cnVjdFRyZWVTdWNjZXNzUHJvcHMsXG4gICAgICAgIG9uR2V0VGV4dEVycm9yUHJvcHMsXG4gICAgICAgIG9uR2V0VGV4dFN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvclByb3BzLFxuICAgICAgICBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgb25SZW5kZXJFcnJvclByb3BzLFxuICAgICAgICBvblJlbmRlclN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgb25SZW5kZXJUZXh0TGF5ZXJFcnJvclByb3BzLFxuICAgICAgICBvblJlbmRlclRleHRMYXllclN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgcGFnZSxcbiAgICAgICAgcGFnZUluZGV4LFxuICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICByZW5kZXJGb3JtcyxcbiAgICAgICAgcmVuZGVyVGV4dExheWVyUHJvcHMsXG4gICAgICAgIHJvdGF0ZSxcbiAgICAgICAgc2NhbGUsXG4gICAgXSk7XG4gICAgY29uc3QgZXZlbnRQcm9wcyA9IHVzZU1lbW8oKCkgPT4gbWFrZUV2ZW50UHJvcHMob3RoZXJQcm9wcywgKCkgPT4gcGFnZSA/IChzY2FsZSA/IG1ha2VQYWdlQ2FsbGJhY2socGFnZSwgc2NhbGUpIDogdW5kZWZpbmVkKSA6IHBhZ2UpLCBcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBGSVhNRVxuICAgIFtvdGhlclByb3BzLCBwYWdlLCBzY2FsZV0pO1xuICAgIGNvbnN0IHBhZ2VLZXkgPSBgJHtwYWdlSW5kZXh9QCR7c2NhbGV9LyR7cm90YXRlfWA7XG4gICAgZnVuY3Rpb24gcmVuZGVyTWFpbkxheWVyKCkge1xuICAgICAgICBzd2l0Y2ggKHJlbmRlck1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2N1c3RvbSc6IHtcbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQoQ3VzdG9tUmVuZGVyZXIsIGByZW5kZXJNb2RlIHdhcyBzZXQgdG8gXCJjdXN0b21cIiwgYnV0IG5vIGN1c3RvbVJlbmRlcmVyIHdhcyBwYXNzZWQuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9qc3goQ3VzdG9tUmVuZGVyZXIsIHt9LCBgJHtwYWdlS2V5fV9jdXN0b21gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY2FzZSAnY2FudmFzJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9qc3goQ2FudmFzLCB7IGNhbnZhc1JlZjogY2FudmFzUmVmIH0sIGAke3BhZ2VLZXl9X2NhbnZhc2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbmRlclRleHRMYXllcigpIHtcbiAgICAgICAgaWYgKCFyZW5kZXJUZXh0TGF5ZXJQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9qc3goVGV4dExheWVyLCB7fSwgYCR7cGFnZUtleX1fdGV4dGApO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJBbm5vdGF0aW9uTGF5ZXIoKSB7XG4gICAgICAgIGlmICghcmVuZGVyQW5ub3RhdGlvbkxheWVyUHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBvZiBub3csIFBERi5qcyAyLjAuOTQzIHJldHVybnMgd2FybmluZ3Mgb24gdW5pbXBsZW1lbnRlZCBhbm5vdGF0aW9ucyBpbiBTVkcgbW9kZS5cbiAgICAgICAgICogVGhlcmVmb3JlLCBhcyBhIGZhbGxiYWNrLCB3ZSByZW5kZXIgXCJ0cmFkaXRpb25hbFwiIEFubm90YXRpb25MYXllciBjb21wb25lbnQuXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gX2pzeChBbm5vdGF0aW9uTGF5ZXIsIHt9LCBgJHtwYWdlS2V5fV9hbm5vdGF0aW9uc2ApO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJDaGlsZHJlbigpIHtcbiAgICAgICAgcmV0dXJuIChfanN4cyhQYWdlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogY2hpbGRDb250ZXh0LCBjaGlsZHJlbjogW3JlbmRlck1haW5MYXllcigpLCByZW5kZXJUZXh0TGF5ZXIoKSwgcmVuZGVyQW5ub3RhdGlvbkxheWVyKCksIGNoaWxkcmVuXSB9KSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoKSB7XG4gICAgICAgIGlmICghcGFnZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIF9qc3goTWVzc2FnZSwgeyB0eXBlOiBcIm5vLWRhdGFcIiwgY2hpbGRyZW46IHR5cGVvZiBub0RhdGEgPT09ICdmdW5jdGlvbicgPyBub0RhdGEoKSA6IG5vRGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGRmID09PSBudWxsIHx8IHBhZ2UgPT09IHVuZGVmaW5lZCB8fCBwYWdlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gKF9qc3goTWVzc2FnZSwgeyB0eXBlOiBcImxvYWRpbmdcIiwgY2hpbGRyZW46IHR5cGVvZiBsb2FkaW5nID09PSAnZnVuY3Rpb24nID8gbG9hZGluZygpIDogbG9hZGluZyB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBkZiA9PT0gZmFsc2UgfHwgcGFnZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBfanN4KE1lc3NhZ2UsIHsgdHlwZTogXCJlcnJvclwiLCBjaGlsZHJlbjogdHlwZW9mIGVycm9yID09PSAnZnVuY3Rpb24nID8gZXJyb3IoKSA6IGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZW5kZXJDaGlsZHJlbigpO1xuICAgIH1cbiAgICByZXR1cm4gKF9qc3goXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7IGNsYXNzTmFtZTogY2xzeChfY2xhc3NOYW1lLCBjbGFzc05hbWUpLCBcImRhdGEtcGFnZS1udW1iZXJcIjogcGFnZU51bWJlciwgXG4gICAgICAgIC8vIEFzc2VydGlvbiBpcyBuZWVkZWQgZm9yIFJlYWN0IDE4IGNvbXBhdGliaWxpdHlcbiAgICAgICAgcmVmOiBtZXJnZVJlZnMoaW5wdXRSZWYsIHBhZ2VFbGVtZW50KSwgc3R5bGU6IHtcbiAgICAgICAgICAgIFsnLS1zY2FsZS1mYWN0b3InXTogYCR7c2NhbGV9YCxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogY2FudmFzQmFja2dyb3VuZCB8fCAnd2hpdGUnLFxuICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgICBtaW5XaWR0aDogJ21pbi1jb250ZW50JyxcbiAgICAgICAgICAgIG1pbkhlaWdodDogJ21pbi1jb250ZW50JyxcbiAgICAgICAgfSB9LCBldmVudFByb3BzLCB7IGNoaWxkcmVuOiByZW5kZXJDb250ZW50KCkgfSkpKTtcbn1cbiIsIid1c2UgY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5jb25zdCBwYWdlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBwYWdlQ29udGV4dDtcbiIsIid1c2UgY2xpZW50JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtYWtlQ2FuY2VsbGFibGUgZnJvbSAnbWFrZS1jYW5jZWxsYWJsZS1wcm9taXNlJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCAqIGFzIHBkZmpzIGZyb20gJ3BkZmpzLWRpc3QnO1xuaW1wb3J0IHVzZURvY3VtZW50Q29udGV4dCBmcm9tICcuLi9zaGFyZWQvaG9va3MvdXNlRG9jdW1lbnRDb250ZXh0LmpzJztcbmltcG9ydCB1c2VQYWdlQ29udGV4dCBmcm9tICcuLi9zaGFyZWQvaG9va3MvdXNlUGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHVzZVJlc29sdmVyIGZyb20gJy4uL3NoYXJlZC9ob29rcy91c2VSZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBjYW5jZWxSdW5uaW5nVGFzayB9IGZyb20gJy4uL3NoYXJlZC91dGlscy5qcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBbm5vdGF0aW9uTGF5ZXIoKSB7XG4gICAgY29uc3QgZG9jdW1lbnRDb250ZXh0ID0gdXNlRG9jdW1lbnRDb250ZXh0KCk7XG4gICAgY29uc3QgcGFnZUNvbnRleHQgPSB1c2VQYWdlQ29udGV4dCgpO1xuICAgIGludmFyaWFudChwYWdlQ29udGV4dCwgJ1VuYWJsZSB0byBmaW5kIFBhZ2UgY29udGV4dC4nKTtcbiAgICBjb25zdCBtZXJnZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZG9jdW1lbnRDb250ZXh0KSwgcGFnZUNvbnRleHQpO1xuICAgIGNvbnN0IHsgaW1hZ2VSZXNvdXJjZXNQYXRoLCBsaW5rU2VydmljZSwgb25HZXRBbm5vdGF0aW9uc0Vycm9yOiBvbkdldEFubm90YXRpb25zRXJyb3JQcm9wcywgb25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3M6IG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzUHJvcHMsIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3I6IG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3JQcm9wcywgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzOiBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NQcm9wcywgcGFnZSwgcGRmLCByZW5kZXJGb3Jtcywgcm90YXRlLCBzY2FsZSA9IDEsIH0gPSBtZXJnZWRQcm9wcztcbiAgICBpbnZhcmlhbnQocGRmLCAnQXR0ZW1wdGVkIHRvIGxvYWQgcGFnZSBhbm5vdGF0aW9ucywgYnV0IG5vIGRvY3VtZW50IHdhcyBzcGVjaWZpZWQuIFdyYXAgPFBhZ2UgLz4gaW4gYSA8RG9jdW1lbnQgLz4gb3IgcGFzcyBleHBsaWNpdCBgcGRmYCBwcm9wLicpO1xuICAgIGludmFyaWFudChwYWdlLCAnQXR0ZW1wdGVkIHRvIGxvYWQgcGFnZSBhbm5vdGF0aW9ucywgYnV0IG5vIHBhZ2Ugd2FzIHNwZWNpZmllZC4nKTtcbiAgICBpbnZhcmlhbnQobGlua1NlcnZpY2UsICdBdHRlbXB0ZWQgdG8gbG9hZCBwYWdlIGFubm90YXRpb25zLCBidXQgbm8gbGlua1NlcnZpY2Ugd2FzIHNwZWNpZmllZC4nKTtcbiAgICBjb25zdCBbYW5ub3RhdGlvbnNTdGF0ZSwgYW5ub3RhdGlvbnNEaXNwYXRjaF0gPSB1c2VSZXNvbHZlcigpO1xuICAgIGNvbnN0IHsgdmFsdWU6IGFubm90YXRpb25zLCBlcnJvcjogYW5ub3RhdGlvbnNFcnJvciB9ID0gYW5ub3RhdGlvbnNTdGF0ZTtcbiAgICBjb25zdCBsYXllckVsZW1lbnQgPSB1c2VSZWYobnVsbCk7XG4gICAgd2FybmluZyhOdW1iZXIucGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1yZWFjdC1wZGYtYW5ub3RhdGlvbi1sYXllcicpLCAxMCkgPT09IDEsICdBbm5vdGF0aW9uTGF5ZXIgc3R5bGVzIG5vdCBmb3VuZC4gUmVhZCBtb3JlOiBodHRwczovL2dpdGh1Yi5jb20vd29qdGVrbWFqL3JlYWN0LXBkZiNzdXBwb3J0LWZvci1hbm5vdGF0aW9ucycpO1xuICAgIGZ1bmN0aW9uIG9uTG9hZFN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmICghYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzUHJvcHMpIHtcbiAgICAgICAgICAgIG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzUHJvcHMoYW5ub3RhdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uTG9hZEVycm9yKCkge1xuICAgICAgICBpZiAoIWFubm90YXRpb25zRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyhmYWxzZSwgYW5ub3RhdGlvbnNFcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKG9uR2V0QW5ub3RhdGlvbnNFcnJvclByb3BzKSB7XG4gICAgICAgICAgICBvbkdldEFubm90YXRpb25zRXJyb3JQcm9wcyhhbm5vdGF0aW9uc0Vycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiB1c2VFZmZlY3QgaW50ZW50aW9uYWxseSB0cmlnZ2VyZWQgb24gcGFnZSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gcmVzZXRBbm5vdGF0aW9ucygpIHtcbiAgICAgICAgYW5ub3RhdGlvbnNEaXNwYXRjaCh7IHR5cGU6ICdSRVNFVCcgfSk7XG4gICAgfSwgW2Fubm90YXRpb25zRGlzcGF0Y2gsIHBhZ2VdKTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gbG9hZEFubm90YXRpb25zKCkge1xuICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5jZWxsYWJsZSA9IG1ha2VDYW5jZWxsYWJsZShwYWdlLmdldEFubm90YXRpb25zKCkpO1xuICAgICAgICBjb25zdCBydW5uaW5nVGFzayA9IGNhbmNlbGxhYmxlO1xuICAgICAgICBjYW5jZWxsYWJsZS5wcm9taXNlXG4gICAgICAgICAgICAudGhlbigobmV4dEFubm90YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uc0Rpc3BhdGNoKHsgdHlwZTogJ1JFU09MVkUnLCB2YWx1ZTogbmV4dEFubm90YXRpb25zIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnNEaXNwYXRjaCh7IHR5cGU6ICdSRUpFQ1QnLCBlcnJvciB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjYW5jZWxSdW5uaW5nVGFzayhydW5uaW5nVGFzayk7XG4gICAgICAgIH07XG4gICAgfSwgW2Fubm90YXRpb25zRGlzcGF0Y2gsIHBhZ2VdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBPbW1pdHRlZCBjYWxsYmFja3Mgc28gdGhleSBhcmUgbm90IGNhbGxlZCBldmVyeSB0aW1lIHRoZXkgY2hhbmdlXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGFubm90YXRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvbkxvYWRFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uTG9hZFN1Y2Nlc3MoKTtcbiAgICB9LCBbYW5ub3RhdGlvbnNdKTtcbiAgICBmdW5jdGlvbiBvblJlbmRlclN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmIChvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NQcm9wcykge1xuICAgICAgICAgICAgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzUHJvcHMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvblJlbmRlckVycm9yKGVycm9yKSB7XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsIGAke2Vycm9yfWApO1xuICAgICAgICBpZiAob25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvclByb3BzKSB7XG4gICAgICAgICAgICBvblJlbmRlckFubm90YXRpb25MYXllckVycm9yUHJvcHMoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHZpZXdwb3J0ID0gdXNlTWVtbygoKSA9PiBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGUsIHJvdGF0aW9uOiByb3RhdGUgfSksIFtwYWdlLCByb3RhdGUsIHNjYWxlXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiByZW5kZXJBbm5vdGF0aW9uTGF5ZXIoKSB7XG4gICAgICAgIGlmICghcGRmIHx8ICFwYWdlIHx8ICFsaW5rU2VydmljZSB8fCAhYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGN1cnJlbnQ6IGxheWVyIH0gPSBsYXllckVsZW1lbnQ7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbG9uZWRWaWV3cG9ydCA9IHZpZXdwb3J0LmNsb25lKHsgZG9udEZsaXA6IHRydWUgfSk7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25MYXllclBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5TWFuYWdlcjogbnVsbCwgLy8gVE9ETzogSW1wbGVtZW50IHRoaXNcbiAgICAgICAgICAgIGFubm90YXRpb25DYW52YXNNYXA6IG51bGwsIC8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgICAgICAgICBhbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyOiBudWxsLCAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpc1xuICAgICAgICAgICAgZGl2OiBsYXllcixcbiAgICAgICAgICAgIGwxMG46IG51bGwsIC8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgdmlld3BvcnQ6IGNsb25lZFZpZXdwb3J0LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZW5kZXJQYXJhbWV0ZXJzID0ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnMsXG4gICAgICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogcGRmLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgZGl2OiBsYXllcixcbiAgICAgICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aCxcbiAgICAgICAgICAgIGxpbmtTZXJ2aWNlLFxuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIHJlbmRlckZvcm1zLFxuICAgICAgICAgICAgdmlld3BvcnQ6IGNsb25lZFZpZXdwb3J0LFxuICAgICAgICB9O1xuICAgICAgICBsYXllci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBwZGZqcy5Bbm5vdGF0aW9uTGF5ZXIoYW5ub3RhdGlvbkxheWVyUGFyYW1ldGVycykucmVuZGVyKHJlbmRlclBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgLy8gSW50ZW50aW9uYWwgaW1tZWRpYXRlIGNhbGxiYWNrXG4gICAgICAgICAgICBvblJlbmRlclN1Y2Nlc3MoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBUT0RPOiBDYW5jZWwgcnVubmluZyB0YXNrP1xuICAgICAgICB9O1xuICAgIH0sIFthbm5vdGF0aW9ucywgaW1hZ2VSZXNvdXJjZXNQYXRoLCBsaW5rU2VydmljZSwgcGFnZSwgcGRmLCByZW5kZXJGb3Jtcywgdmlld3BvcnRdKTtcbiAgICByZXR1cm4gKF9qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsc3goJ3JlYWN0LXBkZl9fUGFnZV9fYW5ub3RhdGlvbnMnLCAnYW5ub3RhdGlvbkxheWVyJyksIHJlZjogbGF5ZXJFbGVtZW50IH0pKTtcbn1cbiIsIid1c2UgY2xpZW50JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWVyZ2VSZWZzIGZyb20gJ21lcmdlLXJlZnMnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCAqIGFzIHBkZmpzIGZyb20gJ3BkZmpzLWRpc3QnO1xuaW1wb3J0IFN0cnVjdFRyZWUgZnJvbSAnLi4vU3RydWN0VHJlZS5qcyc7XG5pbXBvcnQgdXNlUGFnZUNvbnRleHQgZnJvbSAnLi4vc2hhcmVkL2hvb2tzL3VzZVBhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGNhbmNlbFJ1bm5pbmdUYXNrLCBnZXREZXZpY2VQaXhlbFJhdGlvLCBpc0NhbmNlbEV4Y2VwdGlvbiwgbWFrZVBhZ2VDYWxsYmFjaywgfSBmcm9tICcuLi9zaGFyZWQvdXRpbHMuanMnO1xuY29uc3QgQU5OT1RBVElPTl9NT0RFID0gcGRmanMuQW5ub3RhdGlvbk1vZGU7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYW52YXMocHJvcHMpIHtcbiAgICBjb25zdCBwYWdlQ29udGV4dCA9IHVzZVBhZ2VDb250ZXh0KCk7XG4gICAgaW52YXJpYW50KHBhZ2VDb250ZXh0LCAnVW5hYmxlIHRvIGZpbmQgUGFnZSBjb250ZXh0LicpO1xuICAgIGNvbnN0IG1lcmdlZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwYWdlQ29udGV4dCksIHByb3BzKTtcbiAgICBjb25zdCB7IF9jbGFzc05hbWUsIGNhbnZhc0JhY2tncm91bmQsIGRldmljZVBpeGVsUmF0aW8gPSBnZXREZXZpY2VQaXhlbFJhdGlvKCksIG9uUmVuZGVyRXJyb3I6IG9uUmVuZGVyRXJyb3JQcm9wcywgb25SZW5kZXJTdWNjZXNzOiBvblJlbmRlclN1Y2Nlc3NQcm9wcywgcGFnZSwgcmVuZGVyRm9ybXMsIHJlbmRlclRleHRMYXllciwgcm90YXRlLCBzY2FsZSwgfSA9IG1lcmdlZFByb3BzO1xuICAgIGNvbnN0IHsgY2FudmFzUmVmIH0gPSBwcm9wcztcbiAgICBpbnZhcmlhbnQocGFnZSwgJ0F0dGVtcHRlZCB0byByZW5kZXIgcGFnZSBjYW52YXMsIGJ1dCBubyBwYWdlIHdhcyBzcGVjaWZpZWQuJyk7XG4gICAgY29uc3QgY2FudmFzRWxlbWVudCA9IHVzZVJlZihudWxsKTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHBhZ2UgaXMgcmVuZGVyZWQgc3VjY2Vzc2Z1bGx5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uUmVuZGVyU3VjY2VzcygpIHtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvblJlbmRlclN1Y2Nlc3NQcm9wcykge1xuICAgICAgICAgICAgb25SZW5kZXJTdWNjZXNzUHJvcHMobWFrZVBhZ2VDYWxsYmFjayhwYWdlLCBzY2FsZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgcGFnZSBmYWlscyB0byByZW5kZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25SZW5kZXJFcnJvcihlcnJvcikge1xuICAgICAgICBpZiAoaXNDYW5jZWxFeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyhmYWxzZSwgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvblJlbmRlckVycm9yUHJvcHMpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyRXJyb3JQcm9wcyhlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVuZGVyVmlld3BvcnQgPSB1c2VNZW1vKCgpID0+IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZTogc2NhbGUgKiBkZXZpY2VQaXhlbFJhdGlvLCByb3RhdGlvbjogcm90YXRlIH0pLCBbZGV2aWNlUGl4ZWxSYXRpbywgcGFnZSwgcm90YXRlLCBzY2FsZV0pO1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gdXNlTWVtbygoKSA9PiBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGUsIHJvdGF0aW9uOiByb3RhdGUgfSksIFtwYWdlLCByb3RhdGUsIHNjYWxlXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiBkcmF3UGFnZU9uQ2FudmFzKCkge1xuICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmVzIHRoZSBjYW52YXMgd2lsbCBiZSByZS1yZW5kZXJlZCBmcm9tIHNjcmF0Y2guIE90aGVyd2lzZSBhbGwgZm9ybSBkYXRhIHdpbGwgc3RheS5cbiAgICAgICAgcGFnZS5jbGVhbnVwKCk7XG4gICAgICAgIGNvbnN0IHsgY3VycmVudDogY2FudmFzIH0gPSBjYW52YXNFbGVtZW50O1xuICAgICAgICBpZiAoIWNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHJlbmRlclZpZXdwb3J0LndpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gcmVuZGVyVmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHtNYXRoLmZsb29yKHZpZXdwb3J0LndpZHRoKX1weGA7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtNYXRoLmZsb29yKHZpZXdwb3J0LmhlaWdodCl9cHhgO1xuICAgICAgICBjYW52YXMuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBjb25zdCByZW5kZXJDb250ZXh0ID0ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbk1vZGU6IHJlbmRlckZvcm1zID8gQU5OT1RBVElPTl9NT0RFLkVOQUJMRV9GT1JNUyA6IEFOTk9UQVRJT05fTU9ERS5FTkFCTEUsXG4gICAgICAgICAgICBjYW52YXNDb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IGFscGhhOiBmYWxzZSB9KSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiByZW5kZXJWaWV3cG9ydCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNhbnZhc0JhY2tncm91bmQpIHtcbiAgICAgICAgICAgIHJlbmRlckNvbnRleHQuYmFja2dyb3VuZCA9IGNhbnZhc0JhY2tncm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FuY2VsbGFibGUgPSBwYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcnVubmluZ1Rhc2sgPSBjYW5jZWxsYWJsZTtcbiAgICAgICAgY2FuY2VsbGFibGUucHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY2FudmFzLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgICAgICAgIG9uUmVuZGVyU3VjY2VzcygpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKG9uUmVuZGVyRXJyb3IpO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2FuY2VsUnVubmluZ1Rhc2socnVubmluZ1Rhc2spO1xuICAgIH0sIFtjYW52YXNCYWNrZ3JvdW5kLCBwYWdlLCByZW5kZXJGb3JtcywgcmVuZGVyVmlld3BvcnQsIHZpZXdwb3J0XSk7XG4gICAgY29uc3QgY2xlYW51cCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgY29uc3QgeyBjdXJyZW50OiBjYW52YXMgfSA9IGNhbnZhc0VsZW1lbnQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBaZXJvaW5nIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGNhdXNlIG1vc3QgYnJvd3NlcnMgdG8gcmVsZWFzZSBncmFwaGljc1xuICAgICAgICAgKiByZXNvdXJjZXMgaW1tZWRpYXRlbHksIHdoaWNoIGNhbiBncmVhdGx5IHJlZHVjZSBtZW1vcnkgY29uc3VtcHRpb24uXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoY2FudmFzKSB7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSAwO1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IGNsZWFudXAsIFtjbGVhbnVwXSk7XG4gICAgcmV0dXJuIChfanN4KFwiY2FudmFzXCIsIHsgY2xhc3NOYW1lOiBgJHtfY2xhc3NOYW1lfV9fY2FudmFzYCwgZGlyOiBcImx0clwiLCByZWY6IG1lcmdlUmVmcyhjYW52YXNSZWYsIGNhbnZhc0VsZW1lbnQpLCBzdHlsZToge1xuICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgICAgfSwgY2hpbGRyZW46IHJlbmRlclRleHRMYXllciA/IF9qc3goU3RydWN0VHJlZSwge30pIDogbnVsbCB9KSk7XG59XG4iLCIndXNlIGNsaWVudCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFrZUNhbmNlbGxhYmxlIGZyb20gJ21ha2UtY2FuY2VsbGFibGUtcHJvbWlzZSc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgKiBhcyBwZGZqcyBmcm9tICdwZGZqcy1kaXN0JztcbmltcG9ydCB1c2VQYWdlQ29udGV4dCBmcm9tICcuLi9zaGFyZWQvaG9va3MvdXNlUGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHVzZVJlc29sdmVyIGZyb20gJy4uL3NoYXJlZC9ob29rcy91c2VSZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBjYW5jZWxSdW5uaW5nVGFzayB9IGZyb20gJy4uL3NoYXJlZC91dGlscy5qcyc7XG5mdW5jdGlvbiBpc1RleHRJdGVtKGl0ZW0pIHtcbiAgICByZXR1cm4gJ3N0cicgaW4gaXRlbTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRleHRMYXllcigpIHtcbiAgICBjb25zdCBwYWdlQ29udGV4dCA9IHVzZVBhZ2VDb250ZXh0KCk7XG4gICAgaW52YXJpYW50KHBhZ2VDb250ZXh0LCAnVW5hYmxlIHRvIGZpbmQgUGFnZSBjb250ZXh0LicpO1xuICAgIGNvbnN0IHsgY3VzdG9tVGV4dFJlbmRlcmVyLCBvbkdldFRleHRFcnJvciwgb25HZXRUZXh0U3VjY2Vzcywgb25SZW5kZXJUZXh0TGF5ZXJFcnJvciwgb25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzLCBwYWdlLCBwYWdlSW5kZXgsIHBhZ2VOdW1iZXIsIHJvdGF0ZSwgc2NhbGUsIH0gPSBwYWdlQ29udGV4dDtcbiAgICBpbnZhcmlhbnQocGFnZSwgJ0F0dGVtcHRlZCB0byBsb2FkIHBhZ2UgdGV4dCBjb250ZW50LCBidXQgbm8gcGFnZSB3YXMgc3BlY2lmaWVkLicpO1xuICAgIGNvbnN0IFt0ZXh0Q29udGVudFN0YXRlLCB0ZXh0Q29udGVudERpc3BhdGNoXSA9IHVzZVJlc29sdmVyKCk7XG4gICAgY29uc3QgeyB2YWx1ZTogdGV4dENvbnRlbnQsIGVycm9yOiB0ZXh0Q29udGVudEVycm9yIH0gPSB0ZXh0Q29udGVudFN0YXRlO1xuICAgIGNvbnN0IGxheWVyRWxlbWVudCA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBlbmRFbGVtZW50ID0gdXNlUmVmKHVuZGVmaW5lZCk7XG4gICAgd2FybmluZyhOdW1iZXIucGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1yZWFjdC1wZGYtdGV4dC1sYXllcicpLCAxMCkgPT09IDEsICdUZXh0TGF5ZXIgc3R5bGVzIG5vdCBmb3VuZC4gUmVhZCBtb3JlOiBodHRwczovL2dpdGh1Yi5jb20vd29qdGVrbWFqL3JlYWN0LXBkZiNzdXBwb3J0LWZvci10ZXh0LWxheWVyJyk7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBwYWdlIHRleHQgY29udGVudCBpcyByZWFkIHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTG9hZFN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmICghdGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uR2V0VGV4dFN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIG9uR2V0VGV4dFN1Y2Nlc3ModGV4dENvbnRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgcGFnZSB0ZXh0IGNvbnRlbnQgZmFpbGVkIHRvIHJlYWQgc3VjY2Vzc2Z1bGx5XG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Mb2FkRXJyb3IoKSB7XG4gICAgICAgIGlmICghdGV4dENvbnRlbnRFcnJvcikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKGZhbHNlLCB0ZXh0Q29udGVudEVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAob25HZXRUZXh0RXJyb3IpIHtcbiAgICAgICAgICAgIG9uR2V0VGV4dEVycm9yKHRleHRDb250ZW50RXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IHVzZUVmZmVjdCBpbnRlbnRpb25hbGx5IHRyaWdnZXJlZCBvbiBwYWdlIGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiByZXNldFRleHRDb250ZW50KCkge1xuICAgICAgICB0ZXh0Q29udGVudERpc3BhdGNoKHsgdHlwZTogJ1JFU0VUJyB9KTtcbiAgICB9LCBbcGFnZSwgdGV4dENvbnRlbnREaXNwYXRjaF0pO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiBsb2FkVGV4dENvbnRlbnQoKSB7XG4gICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbmNlbGxhYmxlID0gbWFrZUNhbmNlbGxhYmxlKHBhZ2UuZ2V0VGV4dENvbnRlbnQoKSk7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmdUYXNrID0gY2FuY2VsbGFibGU7XG4gICAgICAgIGNhbmNlbGxhYmxlLnByb21pc2VcbiAgICAgICAgICAgIC50aGVuKChuZXh0VGV4dENvbnRlbnQpID0+IHtcbiAgICAgICAgICAgIHRleHRDb250ZW50RGlzcGF0Y2goeyB0eXBlOiAnUkVTT0xWRScsIHZhbHVlOiBuZXh0VGV4dENvbnRlbnQgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudERpc3BhdGNoKHsgdHlwZTogJ1JFSkVDVCcsIGVycm9yIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICgpID0+IGNhbmNlbFJ1bm5pbmdUYXNrKHJ1bm5pbmdUYXNrKTtcbiAgICB9LCBbcGFnZSwgdGV4dENvbnRlbnREaXNwYXRjaF0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAodGV4dENvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0Q29udGVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG9uTG9hZEVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb25Mb2FkU3VjY2VzcygpO1xuICAgIH0sIFt0ZXh0Q29udGVudF0pO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgdGV4dCBsYXllciBpcyByZW5kZXJlZCBzdWNjZXNzZnVsbHlcbiAgICAgKi9cbiAgICBjb25zdCBvblJlbmRlclN1Y2Nlc3MgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIGlmIChvblJlbmRlclRleHRMYXllclN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyVGV4dExheWVyU3VjY2VzcygpO1xuICAgICAgICB9XG4gICAgfSwgW29uUmVuZGVyVGV4dExheWVyU3VjY2Vzc10pO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgdGV4dCBsYXllciBmYWlsZWQgdG8gcmVuZGVyIHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIGNvbnN0IG9uUmVuZGVyRXJyb3IgPSB1c2VDYWxsYmFjaygoZXJyb3IpID0+IHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvblJlbmRlclRleHRMYXllckVycm9yKSB7XG4gICAgICAgICAgICBvblJlbmRlclRleHRMYXllckVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sIFtvblJlbmRlclRleHRMYXllckVycm9yXSk7XG4gICAgZnVuY3Rpb24gb25Nb3VzZURvd24oKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVuZEVsZW1lbnQuY3VycmVudDtcbiAgICAgICAgaWYgKCFlbmQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbmQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uTW91c2VVcCgpIHtcbiAgICAgICAgY29uc3QgZW5kID0gZW5kRWxlbWVudC5jdXJyZW50O1xuICAgICAgICBpZiAoIWVuZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVuZC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICB9XG4gICAgY29uc3Qgdmlld3BvcnQgPSB1c2VNZW1vKCgpID0+IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZSwgcm90YXRpb246IHJvdGF0ZSB9KSwgW3BhZ2UsIHJvdGF0ZSwgc2NhbGVdKTtcbiAgICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyKCkge1xuICAgICAgICBpZiAoIXBhZ2UgfHwgIXRleHRDb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBjdXJyZW50OiBsYXllciB9ID0gbGF5ZXJFbGVtZW50O1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGF5ZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGNvbnN0IHRleHRDb250ZW50U291cmNlID0gcGFnZS5zdHJlYW1UZXh0Q29udGVudCh7IGluY2x1ZGVNYXJrZWRDb250ZW50OiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgICAgICAgY29udGFpbmVyOiBsYXllcixcbiAgICAgICAgICAgIHRleHRDb250ZW50U291cmNlLFxuICAgICAgICAgICAgdmlld3BvcnQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNhbmNlbGxhYmxlID0gbmV3IHBkZmpzLlRleHRMYXllcihwYXJhbWV0ZXJzKTtcbiAgICAgICAgY29uc3QgcnVubmluZ1Rhc2sgPSBjYW5jZWxsYWJsZTtcbiAgICAgICAgY2FuY2VsbGFibGVcbiAgICAgICAgICAgIC5yZW5kZXIoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW5kID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBlbmQuY2xhc3NOYW1lID0gJ2VuZE9mQ29udGVudCc7XG4gICAgICAgICAgICBsYXllci5hcHBlbmQoZW5kKTtcbiAgICAgICAgICAgIGVuZEVsZW1lbnQuY3VycmVudCA9IGVuZDtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyQ2hpbGRyZW4gPSBsYXllci5xdWVyeVNlbGVjdG9yQWxsKCdbcm9sZT1cInByZXNlbnRhdGlvblwiXScpO1xuICAgICAgICAgICAgaWYgKGN1c3RvbVRleHRSZW5kZXJlcikge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMuZm9yRWFjaCgoaXRlbSwgaXRlbUluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNUZXh0SXRlbShpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbGF5ZXJDaGlsZHJlbltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gY3VzdG9tVGV4dFJlbmRlcmVyKE9iamVjdC5hc3NpZ24oeyBwYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUluZGV4IH0sIGl0ZW0pKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuaW5uZXJIVE1MID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gaXRlbS5zdHIgJiYgaXRlbS5oYXNFT0wgPyAyIDogMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEludGVudGlvbmFsIGltbWVkaWF0ZSBjYWxsYmFja1xuICAgICAgICAgICAgb25SZW5kZXJTdWNjZXNzKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2gob25SZW5kZXJFcnJvcik7XG4gICAgICAgIHJldHVybiAoKSA9PiBjYW5jZWxSdW5uaW5nVGFzayhydW5uaW5nVGFzayk7XG4gICAgfSwgW1xuICAgICAgICBjdXN0b21UZXh0UmVuZGVyZXIsXG4gICAgICAgIG9uUmVuZGVyRXJyb3IsXG4gICAgICAgIG9uUmVuZGVyU3VjY2VzcyxcbiAgICAgICAgcGFnZSxcbiAgICAgICAgcGFnZUluZGV4LFxuICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICB0ZXh0Q29udGVudCxcbiAgICAgICAgdmlld3BvcnQsXG4gICAgXSk7XG4gICAgcmV0dXJuIChfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjbHN4KCdyZWFjdC1wZGZfX1BhZ2VfX3RleHRDb250ZW50JywgJ3RleHRMYXllcicpLCBvbk1vdXNlVXA6IG9uTW91c2VVcCwgb25Nb3VzZURvd246IG9uTW91c2VEb3duLCByZWY6IGxheWVyRWxlbWVudCB9KSk7XG59XG4iLCIvLyBBcyBkZWZpbmVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3BkZi5qcy9ibG9iL2Q5ZmFjMzQ1OTYwOWE4MDdiZTY1MDZmYjM0NDFiNWRhNGIxNTRkMTQvc3JjL3NoYXJlZC91dGlsLmpzI0wzNzEtTDM3NFxuY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7XG4gICAgTkVFRF9QQVNTV09SRDogMSxcbiAgICBJTkNPUlJFQ1RfUEFTU1dPUkQ6IDIsXG59O1xuZXhwb3J0IGRlZmF1bHQgUGFzc3dvcmRSZXNwb25zZXM7XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1ha2VDYW5jZWxsYWJsZSBmcm9tICdtYWtlLWNhbmNlbGxhYmxlLXByb21pc2UnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCBTdHJ1Y3RUcmVlSXRlbSBmcm9tICcuL1N0cnVjdFRyZWVJdGVtLmpzJztcbmltcG9ydCB1c2VQYWdlQ29udGV4dCBmcm9tICcuL3NoYXJlZC9ob29rcy91c2VQYWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdXNlUmVzb2x2ZXIgZnJvbSAnLi9zaGFyZWQvaG9va3MvdXNlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgY2FuY2VsUnVubmluZ1Rhc2sgfSBmcm9tICcuL3NoYXJlZC91dGlscy5qcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTdHJ1Y3RUcmVlKCkge1xuICAgIGNvbnN0IHBhZ2VDb250ZXh0ID0gdXNlUGFnZUNvbnRleHQoKTtcbiAgICBpbnZhcmlhbnQocGFnZUNvbnRleHQsICdVbmFibGUgdG8gZmluZCBQYWdlIGNvbnRleHQuJyk7XG4gICAgY29uc3QgeyBvbkdldFN0cnVjdFRyZWVFcnJvcjogb25HZXRTdHJ1Y3RUcmVlRXJyb3JQcm9wcywgb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzczogb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzc1Byb3BzLCB9ID0gcGFnZUNvbnRleHQ7XG4gICAgY29uc3QgW3N0cnVjdFRyZWVTdGF0ZSwgc3RydWN0VHJlZURpc3BhdGNoXSA9IHVzZVJlc29sdmVyKCk7XG4gICAgY29uc3QgeyB2YWx1ZTogc3RydWN0VHJlZSwgZXJyb3I6IHN0cnVjdFRyZWVFcnJvciB9ID0gc3RydWN0VHJlZVN0YXRlO1xuICAgIGNvbnN0IHsgY3VzdG9tVGV4dFJlbmRlcmVyLCBwYWdlIH0gPSBwYWdlQ29udGV4dDtcbiAgICBmdW5jdGlvbiBvbkxvYWRTdWNjZXNzKCkge1xuICAgICAgICBpZiAoIXN0cnVjdFRyZWUpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uR2V0U3RydWN0VHJlZVN1Y2Nlc3NQcm9wcykge1xuICAgICAgICAgICAgb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzc1Byb3BzKHN0cnVjdFRyZWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uTG9hZEVycm9yKCkge1xuICAgICAgICBpZiAoIXN0cnVjdFRyZWVFcnJvcikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKGZhbHNlLCBzdHJ1Y3RUcmVlRXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvbkdldFN0cnVjdFRyZWVFcnJvclByb3BzKSB7XG4gICAgICAgICAgICBvbkdldFN0cnVjdFRyZWVFcnJvclByb3BzKHN0cnVjdFRyZWVFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdXNlRWZmZWN0IGludGVudGlvbmFsbHkgdHJpZ2dlcmVkIG9uIHBhZ2UgY2hhbmdlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIHJlc2V0U3RydWN0VHJlZSgpIHtcbiAgICAgICAgc3RydWN0VHJlZURpc3BhdGNoKHsgdHlwZTogJ1JFU0VUJyB9KTtcbiAgICB9LCBbc3RydWN0VHJlZURpc3BhdGNoLCBwYWdlXSk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIGxvYWRTdHJ1Y3RUcmVlKCkge1xuICAgICAgICBpZiAoY3VzdG9tVGV4dFJlbmRlcmVyKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBEb2N1bWVudCB3aHkgdGhpcyBpcyBuZWNlc3NhcnlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5jZWxsYWJsZSA9IG1ha2VDYW5jZWxsYWJsZShwYWdlLmdldFN0cnVjdFRyZWUoKSk7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmdUYXNrID0gY2FuY2VsbGFibGU7XG4gICAgICAgIGNhbmNlbGxhYmxlLnByb21pc2VcbiAgICAgICAgICAgIC50aGVuKChuZXh0U3RydWN0VHJlZSkgPT4ge1xuICAgICAgICAgICAgc3RydWN0VHJlZURpc3BhdGNoKHsgdHlwZTogJ1JFU09MVkUnLCB2YWx1ZTogbmV4dFN0cnVjdFRyZWUgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBzdHJ1Y3RUcmVlRGlzcGF0Y2goeyB0eXBlOiAnUkVKRUNUJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2FuY2VsUnVubmluZ1Rhc2socnVubmluZ1Rhc2spO1xuICAgIH0sIFtjdXN0b21UZXh0UmVuZGVyZXIsIHBhZ2UsIHN0cnVjdFRyZWVEaXNwYXRjaF0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoc3RydWN0VHJlZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cnVjdFRyZWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvbkxvYWRFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uTG9hZFN1Y2Nlc3MoKTtcbiAgICB9LCBbc3RydWN0VHJlZV0pO1xuICAgIGlmICghc3RydWN0VHJlZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIF9qc3goU3RydWN0VHJlZUl0ZW0sIHsgY2xhc3NOYW1lOiBcInJlYWN0LXBkZl9fUGFnZV9fc3RydWN0VHJlZSBzdHJ1Y3RUcmVlXCIsIG5vZGU6IHN0cnVjdFRyZWUgfSk7XG59XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEF0dHJpYnV0ZXMsIGlzU3RydWN0VHJlZU5vZGUsIGlzU3RydWN0VHJlZU5vZGVXaXRoT25seUNvbnRlbnRDaGlsZCwgfSBmcm9tICcuL3NoYXJlZC9zdHJ1Y3RUcmVlVXRpbHMuanMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU3RydWN0VHJlZUl0ZW0oeyBjbGFzc05hbWUsIG5vZGUsIH0pIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdXNlTWVtbygoKSA9PiBnZXRBdHRyaWJ1dGVzKG5vZGUpLCBbbm9kZV0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IExvb2tzIGxpa2UgYSBCaW9tZSBlcnJvclxuICAgIGNvbnN0IGNoaWxkcmVuID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmICghaXNTdHJ1Y3RUcmVlTm9kZShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU3RydWN0VHJlZU5vZGVXaXRoT25seUNvbnRlbnRDaGlsZChub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXJyYXlJbmRleEtleTogaW5kZXggaXMgc3RhYmxlIGhlcmVcbiAgICAgICAgICAgIF9qc3goU3RydWN0VHJlZUl0ZW0sIHsgbm9kZTogY2hpbGQgfSwgaW5kZXgpKTtcbiAgICAgICAgfSk7XG4gICAgfSwgW25vZGVdKTtcbiAgICByZXR1cm4gKF9qc3goXCJzcGFuXCIsIE9iamVjdC5hc3NpZ24oeyBjbGFzc05hbWU6IGNsYXNzTmFtZSB9LCBhdHRyaWJ1dGVzLCB7IGNoaWxkcmVuOiBjaGlsZHJlbiB9KSkpO1xufVxuIiwiLy8gRnJvbSBwZGZqcy1kaXN0L2xpYi93ZWIvc3RydWN0X3RyZWVfbGF5ZXJfYnVpbGRlci5qc1xuZXhwb3J0IGNvbnN0IFBERl9ST0xFX1RPX0hUTUxfUk9MRSA9IHtcbiAgICAvLyBEb2N1bWVudCBsZXZlbCBzdHJ1Y3R1cmUgdHlwZXNcbiAgICBEb2N1bWVudDogbnVsbCwgLy8gVGhlcmUncyBhIFwiZG9jdW1lbnRcIiByb2xlLCBidXQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIGhlcmUuXG4gICAgRG9jdW1lbnRGcmFnbWVudDogbnVsbCxcbiAgICAvLyBHcm91cGluZyBsZXZlbCBzdHJ1Y3R1cmUgdHlwZXNcbiAgICBQYXJ0OiAnZ3JvdXAnLFxuICAgIFNlY3Q6ICdncm91cCcsIC8vIFhYWDogVGhlcmUncyBhIFwic2VjdGlvblwiIHJvbGUsIGJ1dCBpdCdzIGFic3RyYWN0LlxuICAgIERpdjogJ2dyb3VwJyxcbiAgICBBc2lkZTogJ25vdGUnLFxuICAgIE5vblN0cnVjdDogJ25vbmUnLFxuICAgIC8vIEJsb2NrIGxldmVsIHN0cnVjdHVyZSB0eXBlc1xuICAgIFA6IG51bGwsXG4gICAgLy8gSDxuPixcbiAgICBIOiAnaGVhZGluZycsXG4gICAgVGl0bGU6IG51bGwsXG4gICAgRkVOb3RlOiAnbm90ZScsXG4gICAgLy8gU3ViLWJsb2NrIGxldmVsIHN0cnVjdHVyZSB0eXBlXG4gICAgU3ViOiAnZ3JvdXAnLFxuICAgIC8vIEdlbmVyYWwgaW5saW5lIGxldmVsIHN0cnVjdHVyZSB0eXBlc1xuICAgIExibDogbnVsbCxcbiAgICBTcGFuOiBudWxsLFxuICAgIEVtOiBudWxsLFxuICAgIFN0cm9uZzogbnVsbCxcbiAgICBMaW5rOiAnbGluaycsXG4gICAgQW5ub3Q6ICdub3RlJyxcbiAgICBGb3JtOiAnZm9ybScsXG4gICAgLy8gUnVieSBhbmQgV2FyaWNodSBzdHJ1Y3R1cmUgdHlwZXNcbiAgICBSdWJ5OiBudWxsLFxuICAgIFJCOiBudWxsLFxuICAgIFJUOiBudWxsLFxuICAgIFJQOiBudWxsLFxuICAgIFdhcmljaHU6IG51bGwsXG4gICAgV1Q6IG51bGwsXG4gICAgV1A6IG51bGwsXG4gICAgLy8gTGlzdCBzdGFuZGFyZCBzdHJ1Y3R1cmUgdHlwZXNcbiAgICBMOiAnbGlzdCcsXG4gICAgTEk6ICdsaXN0aXRlbScsXG4gICAgTEJvZHk6IG51bGwsXG4gICAgLy8gVGFibGUgc3RhbmRhcmQgc3RydWN0dXJlIHR5cGVzXG4gICAgVGFibGU6ICd0YWJsZScsXG4gICAgVFI6ICdyb3cnLFxuICAgIFRIOiAnY29sdW1uaGVhZGVyJyxcbiAgICBURDogJ2NlbGwnLFxuICAgIFRIZWFkOiAnY29sdW1uaGVhZGVyJyxcbiAgICBUQm9keTogbnVsbCxcbiAgICBURm9vdDogbnVsbCxcbiAgICAvLyBTdGFuZGFyZCBzdHJ1Y3R1cmUgdHlwZSBDYXB0aW9uXG4gICAgQ2FwdGlvbjogbnVsbCxcbiAgICAvLyBTdGFuZGFyZCBzdHJ1Y3R1cmUgdHlwZSBGaWd1cmVcbiAgICBGaWd1cmU6ICdmaWd1cmUnLFxuICAgIC8vIFN0YW5kYXJkIHN0cnVjdHVyZSB0eXBlIEZvcm11bGFcbiAgICBGb3JtdWxhOiBudWxsLFxuICAgIC8vIHN0YW5kYXJkIHN0cnVjdHVyZSB0eXBlIEFydGlmYWN0XG4gICAgQXJ0aWZhY3Q6IG51bGwsXG59O1xuZXhwb3J0IGNvbnN0IEhFQURJTkdfUEFUVEVSTiA9IC9eSChcXGQrKSQvO1xuIiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEb2N1bWVudENvbnRleHQgZnJvbSAnLi4vLi4vRG9jdW1lbnRDb250ZXh0LmpzJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZURvY3VtZW50Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdXNlQ29udGV4dChEb2N1bWVudENvbnRleHQpO1xufVxuIiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQYWdlQ29udGV4dCBmcm9tICcuLi8uLi9QYWdlQ29udGV4dC5qcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VQYWdlQ29udGV4dCgpIHtcbiAgICByZXR1cm4gdXNlQ29udGV4dChQYWdlQ29udGV4dCk7XG59XG4iLCJpbXBvcnQgeyB1c2VSZWR1Y2VyIH0gZnJvbSAncmVhY3QnO1xuZnVuY3Rpb24gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdSRVNPTFZFJzpcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBhY3Rpb24udmFsdWUsIGVycm9yOiB1bmRlZmluZWQgfTtcbiAgICAgICAgY2FzZSAnUkVKRUNUJzpcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBmYWxzZSwgZXJyb3I6IGFjdGlvbi5lcnJvciB9O1xuICAgICAgICBjYXNlICdSRVNFVCc6XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBlcnJvcjogdW5kZWZpbmVkIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUmVzb2x2ZXIoKSB7XG4gICAgcmV0dXJuIHVzZVJlZHVjZXIoKHJlZHVjZXIpLCB7IHZhbHVlOiB1bmRlZmluZWQsIGVycm9yOiB1bmRlZmluZWQgfSk7XG59XG4iLCJpbXBvcnQgeyBIRUFESU5HX1BBVFRFUk4sIFBERl9ST0xFX1RPX0hUTUxfUk9MRSB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc1BkZlJvbGUocm9sZSkge1xuICAgIHJldHVybiByb2xlIGluIFBERl9ST0xFX1RPX0hUTUxfUk9MRTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cnVjdFRyZWVOb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gJ2NoaWxkcmVuJyBpbiBub2RlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RydWN0VHJlZU5vZGVXaXRoT25seUNvbnRlbnRDaGlsZChub2RlKSB7XG4gICAgaWYgKCFpc1N0cnVjdFRyZWVOb2RlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIDAgaW4gbm9kZS5jaGlsZHJlbiAmJiAnaWQnIGluIG5vZGUuY2hpbGRyZW5bMF07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9sZUF0dHJpYnV0ZXMobm9kZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcbiAgICBpZiAoaXNTdHJ1Y3RUcmVlTm9kZShub2RlKSkge1xuICAgICAgICBjb25zdCB7IHJvbGUgfSA9IG5vZGU7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSByb2xlLm1hdGNoKEhFQURJTkdfUEFUVEVSTik7XG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLnJvbGUgPSAnaGVhZGluZyc7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzWydhcmlhLWxldmVsJ10gPSBOdW1iZXIobWF0Y2hlc1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQZGZSb2xlKHJvbGUpKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sUm9sZSA9IFBERl9ST0xFX1RPX0hUTUxfUk9MRVtyb2xlXTtcbiAgICAgICAgICAgIGlmIChodG1sUm9sZSkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucm9sZSA9IGh0bWxSb2xlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VBdHRyaWJ1dGVzKG5vZGUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgaWYgKGlzU3RydWN0VHJlZU5vZGUobm9kZSkpIHtcbiAgICAgICAgaWYgKG5vZGUuYWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNbJ2FyaWEtbGFiZWwnXSA9IG5vZGUuYWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmxhbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXR0cmlidXRlcy5sYW5nID0gbm9kZS5sYW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cnVjdFRyZWVOb2RlV2l0aE9ubHlDb250ZW50Q2hpbGQobm9kZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtjaGlsZF0gPSBub2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRBdHRyaWJ1dGVzID0gZ2V0QmFzZUF0dHJpYnV0ZXMoY2hpbGQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGF0dHJpYnV0ZXMpLCBjaGlsZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoJ2lkJyBpbiBub2RlKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzWydhcmlhLW93bnMnXSA9IG5vZGUuaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QXR0cmlidXRlcyhub2RlKSB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZXRSb2xlQXR0cmlidXRlcyhub2RlKSksIGdldEJhc2VBdHRyaWJ1dGVzKG5vZGUpKTtcbn1cbiIsImltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG4vKipcbiAqIENoZWNrcyBpZiB3ZSdyZSBydW5uaW5nIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQnJvd3NlciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHdlJ3JlIHJ1bm5pbmcgZnJvbSBhIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5leHBvcnQgY29uc3QgaXNMb2NhbEZpbGVTeXN0ZW0gPSBpc0Jyb3dzZXIgJiYgd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnZmlsZTonO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhcmlhYmxlIGlzIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIHsqfSB2YXJpYWJsZSBWYXJpYWJsZSB0byBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkKHZhcmlhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSAhPT0gJ3VuZGVmaW5lZCc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFyaWFibGUgaXMgZGVmaW5lZCBhbmQgbm90IG51bGwuXG4gKlxuICogQHBhcmFtIHsqfSB2YXJpYWJsZSBWYXJpYWJsZSB0byBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcm92aWRlZCh2YXJpYWJsZSkge1xuICAgIHJldHVybiBpc0RlZmluZWQodmFyaWFibGUpICYmIHZhcmlhYmxlICE9PSBudWxsO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhcmlhYmxlIHByb3ZpZGVkIGlzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFyaWFibGUgVmFyaWFibGUgdG8gY2hlY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhcmlhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PT0gJ3N0cmluZyc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFyaWFibGUgcHJvdmlkZWQgaXMgYW4gQXJyYXlCdWZmZXIuXG4gKlxuICogQHBhcmFtIHsqfSB2YXJpYWJsZSBWYXJpYWJsZSB0byBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YXJpYWJsZSkge1xuICAgIHJldHVybiB2YXJpYWJsZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhcmlhYmxlIHByb3ZpZGVkIGlzIGEgQmxvYi5cbiAqXG4gKiBAcGFyYW0geyp9IHZhcmlhYmxlIFZhcmlhYmxlIHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jsb2IodmFyaWFibGUpIHtcbiAgICBpbnZhcmlhbnQoaXNCcm93c2VyLCAnaXNCbG9iIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBicm93c2VyIGVudmlyb25tZW50Jyk7XG4gICAgcmV0dXJuIHZhcmlhYmxlIGluc3RhbmNlb2YgQmxvYjtcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YXJpYWJsZSBwcm92aWRlZCBpcyBhIGRhdGEgVVJJLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFyaWFibGUgU3RyaW5nIHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFVUkkodmFyaWFibGUpIHtcbiAgICByZXR1cm4gaXNTdHJpbmcodmFyaWFibGUpICYmIC9eZGF0YTovLnRlc3QodmFyaWFibGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFVUkl0b0J5dGVTdHJpbmcoZGF0YVVSSSkge1xuICAgIGludmFyaWFudChpc0RhdGFVUkkoZGF0YVVSSSksICdJbnZhbGlkIGRhdGEgVVJJLicpO1xuICAgIGNvbnN0IFtoZWFkZXJzU3RyaW5nID0gJycsIGRhdGFTdHJpbmcgPSAnJ10gPSBkYXRhVVJJLnNwbGl0KCcsJyk7XG4gICAgY29uc3QgaGVhZGVycyA9IGhlYWRlcnNTdHJpbmcuc3BsaXQoJzsnKTtcbiAgICBpZiAoaGVhZGVycy5pbmRleE9mKCdiYXNlNjQnKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGF0b2IoZGF0YVN0cmluZyk7XG4gICAgfVxuICAgIHJldHVybiB1bmVzY2FwZShkYXRhU3RyaW5nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXZpY2VQaXhlbFJhdGlvKCkge1xuICAgIHJldHVybiAoaXNCcm93c2VyICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSB8fCAxO1xufVxuY29uc3QgYWxsb3dGaWxlQWNjZXNzRnJvbUZpbGVzVGlwID0gJ09uIENocm9taXVtIGJhc2VkIGJyb3dzZXJzLCB5b3UgY2FuIHVzZSAtLWFsbG93LWZpbGUtYWNjZXNzLWZyb20tZmlsZXMgZmxhZyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLic7XG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheUNPUlNXYXJuaW5nKCkge1xuICAgIHdhcm5pbmcoIWlzTG9jYWxGaWxlU3lzdGVtLCBgTG9hZGluZyBQREYgYXMgYmFzZTY0IHN0cmluZ3MvVVJMcyBtYXkgbm90IHdvcmsgb24gcHJvdG9jb2xzIG90aGVyIHRoYW4gSFRUUC9IVFRQUy4gJHthbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZXNUaXB9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheVdvcmtlcldhcm5pbmcoKSB7XG4gICAgd2FybmluZyghaXNMb2NhbEZpbGVTeXN0ZW0sIGBMb2FkaW5nIFBERi5qcyB3b3JrZXIgbWF5IG5vdCB3b3JrIG9uIHByb3RvY29scyBvdGhlciB0aGFuIEhUVFAvSFRUUFMuICR7YWxsb3dGaWxlQWNjZXNzRnJvbUZpbGVzVGlwfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhbmNlbFJ1bm5pbmdUYXNrKHJ1bm5pbmdUYXNrKSB7XG4gICAgaWYgKHJ1bm5pbmdUYXNrID09PSBudWxsIHx8IHJ1bm5pbmdUYXNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBydW5uaW5nVGFzay5jYW5jZWwpXG4gICAgICAgIHJ1bm5pbmdUYXNrLmNhbmNlbCgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQYWdlQ2FsbGJhY2socGFnZSwgc2NhbGUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFnZSwgJ3dpZHRoJywge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3WzJdICogc2NhbGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFnZSwgJ2hlaWdodCcsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld1szXSAqIHNjYWxlO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhZ2UsICdvcmlnaW5hbFdpZHRoJywge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3WzJdO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhZ2UsICdvcmlnaW5hbEhlaWdodCcsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld1szXTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBwYWdlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FuY2VsRXhjZXB0aW9uKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yLm5hbWUgPT09ICdSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24nO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGcm9tRmlsZShmaWxlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghcmVhZGVyLnJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdFcnJvciB3aGlsZSByZWFkaW5nIGEgZmlsZS4nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpO1xuICAgICAgICB9O1xuICAgICAgICByZWFkZXIub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignRXJyb3Igd2hpbGUgcmVhZGluZyBhIGZpbGUuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdFcnJvciB3aGlsZSByZWFkaW5nIGEgZmlsZS4nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2ggKGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIGVycm9yLk5PVF9GT1VORF9FUlI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdFcnJvciB3aGlsZSByZWFkaW5nIGEgZmlsZTogRmlsZSBub3QgZm91bmQuJykpO1xuICAgICAgICAgICAgICAgIGNhc2UgZXJyb3IuU0VDVVJJVFlfRVJSOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignRXJyb3Igd2hpbGUgcmVhZGluZyBhIGZpbGU6IFNlY3VyaXR5IGVycm9yLicpKTtcbiAgICAgICAgICAgICAgICBjYXNlIGVycm9yLkFCT1JUX0VSUjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIHdoaWxlIHJlYWRpbmcgYSBmaWxlOiBBYm9ydGVkLicpKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignRXJyb3Igd2hpbGUgcmVhZGluZyBhIGZpbGUuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XG4gICAgfSk7XG59XG4iLCIvLyBzcmMvaW5kZXgudHNcbmltcG9ydCAqIGFzIFJlYWN0MiBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yIGFzIHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yMiB9IGZyb20gXCJ1c2Utc3luYy1leHRlcm5hbC1zdG9yZS93aXRoLXNlbGVjdG9yLmpzXCI7XG5cbi8vIHNyYy91dGlscy9yZWFjdC50c1xuaW1wb3J0ICogYXMgUmVhY3RPcmlnaW5hbCBmcm9tIFwicmVhY3RcIjtcbnZhciBSZWFjdCA9IChcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIC8vIEB0cy1pZ25vcmVcbiAgXCJkZWZhdWx0XCIgaW4gUmVhY3RPcmlnaW5hbCA/IFJlYWN0T3JpZ2luYWxbXCJkZWZhdWx0XCJdIDogUmVhY3RPcmlnaW5hbFxuKTtcblxuLy8gc3JjL2NvbXBvbmVudHMvQ29udGV4dC50c1xudmFyIENvbnRleHRLZXkgPSBTeW1ib2wuZm9yKGByZWFjdC1yZWR1eC1jb250ZXh0YCk7XG52YXIgZ1QgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbFRoaXMgOiAoXG4gIC8qIGZhbGwgYmFjayB0byBhIHBlci1tb2R1bGUgc2NvcGUgKHByZS04LjEgYmVoYXZpb3VyKSBpZiBgZ2xvYmFsVGhpc2AgaXMgbm90IGF2YWlsYWJsZSAqL1xuICB7fVxuKTtcbmZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gIGlmICghUmVhY3QuY3JlYXRlQ29udGV4dClcbiAgICByZXR1cm4ge307XG4gIGNvbnN0IGNvbnRleHRNYXAgPSBnVFtDb250ZXh0S2V5XSA/PyAoZ1RbQ29udGV4dEtleV0gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgbGV0IHJlYWxDb250ZXh0ID0gY29udGV4dE1hcC5nZXQoUmVhY3QuY3JlYXRlQ29udGV4dCk7XG4gIGlmICghcmVhbENvbnRleHQpIHtcbiAgICByZWFsQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoXG4gICAgICBudWxsXG4gICAgKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICByZWFsQ29udGV4dC5kaXNwbGF5TmFtZSA9IFwiUmVhY3RSZWR1eFwiO1xuICAgIH1cbiAgICBjb250ZXh0TWFwLnNldChSZWFjdC5jcmVhdGVDb250ZXh0LCByZWFsQ29udGV4dCk7XG4gIH1cbiAgcmV0dXJuIHJlYWxDb250ZXh0O1xufVxudmFyIFJlYWN0UmVkdXhDb250ZXh0ID0gLyogQF9fUFVSRV9fICovIGdldENvbnRleHQoKTtcblxuLy8gc3JjL3V0aWxzL3VzZVN5bmNFeHRlcm5hbFN0b3JlLnRzXG52YXIgbm90SW5pdGlhbGl6ZWQgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihcInVTRVMgbm90IGluaXRpYWxpemVkIVwiKTtcbn07XG5cbi8vIHNyYy9ob29rcy91c2VSZWR1eENvbnRleHQudHNcbmZ1bmN0aW9uIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VSZWR1eENvbnRleHQyKCkge1xuICAgIGNvbnN0IGNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZUNvbnRleHQoY29udGV4dCk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhY29udGV4dFZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiY291bGQgbm90IGZpbmQgcmVhY3QtcmVkdXggY29udGV4dCB2YWx1ZTsgcGxlYXNlIGVuc3VyZSB0aGUgY29tcG9uZW50IGlzIHdyYXBwZWQgaW4gYSA8UHJvdmlkZXI+XCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0VmFsdWU7XG4gIH07XG59XG52YXIgdXNlUmVkdXhDb250ZXh0ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soKTtcblxuLy8gc3JjL2hvb2tzL3VzZVNlbGVjdG9yLnRzXG52YXIgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgPSBub3RJbml0aWFsaXplZDtcbnZhciBpbml0aWFsaXplVXNlU2VsZWN0b3IgPSAoZm4pID0+IHtcbiAgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgPSBmbjtcbn07XG52YXIgcmVmRXF1YWxpdHkgPSAoYSwgYikgPT4gYSA9PT0gYjtcbmZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9ySG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgY29uc3QgdXNlUmVkdXhDb250ZXh0MiA9IGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlUmVkdXhDb250ZXh0IDogY3JlYXRlUmVkdXhDb250ZXh0SG9vayhjb250ZXh0KTtcbiAgY29uc3QgdXNlU2VsZWN0b3IyID0gKHNlbGVjdG9yLCBlcXVhbGl0eUZuT3JPcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB7IGVxdWFsaXR5Rm4gPSByZWZFcXVhbGl0eSwgZGV2TW9kZUNoZWNrcyA9IHt9IH0gPSB0eXBlb2YgZXF1YWxpdHlGbk9yT3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiID8geyBlcXVhbGl0eUZuOiBlcXVhbGl0eUZuT3JPcHRpb25zIH0gOiBlcXVhbGl0eUZuT3JPcHRpb25zO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgbXVzdCBwYXNzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBmdW5jdGlvbiBhcyBhIHNlbGVjdG9yIHRvIHVzZVNlbGVjdG9yYCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGVxdWFsaXR5Rm4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFlvdSBtdXN0IHBhc3MgYSBmdW5jdGlvbiBhcyBhbiBlcXVhbGl0eSBmdW5jdGlvbiB0byB1c2VTZWxlY3RvcmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZSxcbiAgICAgIHN0YWJpbGl0eUNoZWNrLFxuICAgICAgaWRlbnRpdHlGdW5jdGlvbkNoZWNrXG4gICAgfSA9IHVzZVJlZHV4Q29udGV4dDIoKTtcbiAgICBjb25zdCBmaXJzdFJ1biA9IFJlYWN0LnVzZVJlZih0cnVlKTtcbiAgICBjb25zdCB3cmFwcGVkU2VsZWN0b3IgPSBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgIHtcbiAgICAgICAgW3NlbGVjdG9yLm5hbWVdKHN0YXRlKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBzZWxlY3RvcihzdGF0ZSk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBpZGVudGl0eUZ1bmN0aW9uQ2hlY2s6IGZpbmFsSWRlbnRpdHlGdW5jdGlvbkNoZWNrLFxuICAgICAgICAgICAgICBzdGFiaWxpdHlDaGVjazogZmluYWxTdGFiaWxpdHlDaGVja1xuICAgICAgICAgICAgfSA9IHtcbiAgICAgICAgICAgICAgc3RhYmlsaXR5Q2hlY2ssXG4gICAgICAgICAgICAgIGlkZW50aXR5RnVuY3Rpb25DaGVjayxcbiAgICAgICAgICAgICAgLi4uZGV2TW9kZUNoZWNrc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChmaW5hbFN0YWJpbGl0eUNoZWNrID09PSBcImFsd2F5c1wiIHx8IGZpbmFsU3RhYmlsaXR5Q2hlY2sgPT09IFwib25jZVwiICYmIGZpcnN0UnVuLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9Db21wYXJlID0gc2VsZWN0b3Ioc3RhdGUpO1xuICAgICAgICAgICAgICBpZiAoIWVxdWFsaXR5Rm4oc2VsZWN0ZWQsIHRvQ29tcGFyZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhY2sgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAgICh7IHN0YWNrIH0gPSBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgXCJTZWxlY3RvciBcIiArIChzZWxlY3Rvci5uYW1lIHx8IFwidW5rbm93blwiKSArIFwiIHJldHVybmVkIGEgZGlmZmVyZW50IHJlc3VsdCB3aGVuIGNhbGxlZCB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMuIFRoaXMgY2FuIGxlYWQgdG8gdW5uZWNlc3NhcnkgcmVyZW5kZXJzLlxcblNlbGVjdG9ycyB0aGF0IHJldHVybiBhIG5ldyByZWZlcmVuY2UgKHN1Y2ggYXMgYW4gb2JqZWN0IG9yIGFuIGFycmF5KSBzaG91bGQgYmUgbWVtb2l6ZWQ6IGh0dHBzOi8vcmVkdXguanMub3JnL3VzYWdlL2Rlcml2aW5nLWRhdGEtc2VsZWN0b3JzI29wdGltaXppbmctc2VsZWN0b3JzLXdpdGgtbWVtb2l6YXRpb25cIixcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDI6IHRvQ29tcGFyZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhY2tcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmluYWxJZGVudGl0eUZ1bmN0aW9uQ2hlY2sgPT09IFwiYWx3YXlzXCIgfHwgZmluYWxJZGVudGl0eUZ1bmN0aW9uQ2hlY2sgPT09IFwib25jZVwiICYmIGZpcnN0UnVuLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkID09PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdGFjayA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgICAgKHsgc3RhY2sgfSA9IGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBcIlNlbGVjdG9yIFwiICsgKHNlbGVjdG9yLm5hbWUgfHwgXCJ1bmtub3duXCIpICsgXCIgcmV0dXJuZWQgdGhlIHJvb3Qgc3RhdGUgd2hlbiBjYWxsZWQuIFRoaXMgY2FuIGxlYWQgdG8gdW5uZWNlc3NhcnkgcmVyZW5kZXJzLlxcblNlbGVjdG9ycyB0aGF0IHJldHVybiB0aGUgZW50aXJlIHN0YXRlIGFyZSBhbG1vc3QgY2VydGFpbmx5IGEgbWlzdGFrZSwgYXMgdGhleSB3aWxsIGNhdXNlIGEgcmVyZW5kZXIgd2hlbmV2ZXIgKmFueXRoaW5nKiBpbiBzdGF0ZSBjaGFuZ2VzLlwiLFxuICAgICAgICAgICAgICAgICAgeyBzdGFjayB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0UnVuLmN1cnJlbnQpXG4gICAgICAgICAgICAgIGZpcnN0UnVuLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xuICAgICAgICB9XG4gICAgICB9W3NlbGVjdG9yLm5hbWVdLFxuICAgICAgW3NlbGVjdG9yLCBzdGFiaWxpdHlDaGVjaywgZGV2TW9kZUNoZWNrcy5zdGFiaWxpdHlDaGVja11cbiAgICApO1xuICAgIGNvbnN0IHNlbGVjdGVkU3RhdGUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcihcbiAgICAgIHN1YnNjcmlwdGlvbi5hZGROZXN0ZWRTdWIsXG4gICAgICBzdG9yZS5nZXRTdGF0ZSxcbiAgICAgIGdldFNlcnZlclN0YXRlIHx8IHN0b3JlLmdldFN0YXRlLFxuICAgICAgd3JhcHBlZFNlbGVjdG9yLFxuICAgICAgZXF1YWxpdHlGblxuICAgICk7XG4gICAgUmVhY3QudXNlRGVidWdWYWx1ZShzZWxlY3RlZFN0YXRlKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRTdGF0ZTtcbiAgfTtcbiAgT2JqZWN0LmFzc2lnbih1c2VTZWxlY3RvcjIsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHVzZVNlbGVjdG9yMlxuICB9KTtcbiAgcmV0dXJuIHVzZVNlbGVjdG9yMjtcbn1cbnZhciB1c2VTZWxlY3RvciA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVTZWxlY3Rvckhvb2soKTtcblxuLy8gc3JjL3V0aWxzL3JlYWN0LWlzLnRzXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIik7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZnJhZ21lbnRcIik7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucHJvdmlkZXJcIik7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnRleHRcIik7XG52YXIgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zZXJ2ZXJfY29udGV4dFwiKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIik7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIik7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIik7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Qub2Zmc2NyZWVuXCIpO1xudmFyIFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKFwicmVhY3QuY2xpZW50LnJlZmVyZW5jZVwiKTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfT0ZGU0NSRUVOX1RZUEUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHR5cGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICBjb25zdCAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRToge1xuICAgICAgICBjb25zdCB0eXBlID0gb2JqZWN0LnR5cGU7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGNvbnN0ICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOiB7XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5cbi8vIHNyYy91dGlscy93YXJuaW5nLnRzXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIHRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cblxuLy8gc3JjL2Nvbm5lY3QvdmVyaWZ5U3Vic2VsZWN0b3JzLnRzXG5mdW5jdGlvbiB2ZXJpZnkoc2VsZWN0b3IsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKCFzZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2YWx1ZSBmb3IgJHttZXRob2ROYW1lfSBpbiBjb25uZWN0LmApO1xuICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09IFwibWFwU3RhdGVUb1Byb3BzXCIgfHwgbWV0aG9kTmFtZSA9PT0gXCJtYXBEaXNwYXRjaFRvUHJvcHNcIikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlbGVjdG9yLCBcImRlcGVuZHNPbk93blByb3BzXCIpKSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICBgVGhlIHNlbGVjdG9yIGZvciAke21ldGhvZE5hbWV9IG9mIGNvbm5lY3QgZGlkIG5vdCBzcGVjaWZ5IGEgdmFsdWUgZm9yIGRlcGVuZHNPbk93blByb3BzLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMpIHtcbiAgdmVyaWZ5KG1hcFN0YXRlVG9Qcm9wcywgXCJtYXBTdGF0ZVRvUHJvcHNcIik7XG4gIHZlcmlmeShtYXBEaXNwYXRjaFRvUHJvcHMsIFwibWFwRGlzcGF0Y2hUb1Byb3BzXCIpO1xuICB2ZXJpZnkobWVyZ2VQcm9wcywgXCJtZXJnZVByb3BzXCIpO1xufVxuXG4vLyBzcmMvY29ubmVjdC9zZWxlY3RvckZhY3RvcnkudHNcbmZ1bmN0aW9uIHB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCwge1xuICBhcmVTdGF0ZXNFcXVhbCxcbiAgYXJlT3duUHJvcHNFcXVhbCxcbiAgYXJlU3RhdGVQcm9wc0VxdWFsXG59KSB7XG4gIGxldCBoYXNSdW5BdExlYXN0T25jZSA9IGZhbHNlO1xuICBsZXQgc3RhdGU7XG4gIGxldCBvd25Qcm9wcztcbiAgbGV0IHN0YXRlUHJvcHM7XG4gIGxldCBkaXNwYXRjaFByb3BzO1xuICBsZXQgbWVyZ2VkUHJvcHM7XG4gIGZ1bmN0aW9uIGhhbmRsZUZpcnN0Q2FsbChmaXJzdFN0YXRlLCBmaXJzdE93blByb3BzKSB7XG4gICAgc3RhdGUgPSBmaXJzdFN0YXRlO1xuICAgIG93blByb3BzID0gZmlyc3RPd25Qcm9wcztcbiAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgaGFzUnVuQXRMZWFzdE9uY2UgPSB0cnVlO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCkge1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKVxuICAgICAgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1Byb3BzKCkge1xuICAgIGlmIChtYXBTdGF0ZVRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpXG4gICAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcylcbiAgICAgIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVOZXdTdGF0ZSgpIHtcbiAgICBjb25zdCBuZXh0U3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGNvbnN0IHN0YXRlUHJvcHNDaGFuZ2VkID0gIWFyZVN0YXRlUHJvcHNFcXVhbChuZXh0U3RhdGVQcm9wcywgc3RhdGVQcm9wcyk7XG4gICAgc3RhdGVQcm9wcyA9IG5leHRTdGF0ZVByb3BzO1xuICAgIGlmIChzdGF0ZVByb3BzQ2hhbmdlZClcbiAgICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZVN1YnNlcXVlbnRDYWxscyhuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykge1xuICAgIGNvbnN0IHByb3BzQ2hhbmdlZCA9ICFhcmVPd25Qcm9wc0VxdWFsKG5leHRPd25Qcm9wcywgb3duUHJvcHMpO1xuICAgIGNvbnN0IHN0YXRlQ2hhbmdlZCA9ICFhcmVTdGF0ZXNFcXVhbChcbiAgICAgIG5leHRTdGF0ZSxcbiAgICAgIHN0YXRlLFxuICAgICAgbmV4dE93blByb3BzLFxuICAgICAgb3duUHJvcHNcbiAgICApO1xuICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuICAgIG93blByb3BzID0gbmV4dE93blByb3BzO1xuICAgIGlmIChwcm9wc0NoYW5nZWQgJiYgc3RhdGVDaGFuZ2VkKVxuICAgICAgcmV0dXJuIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKTtcbiAgICBpZiAocHJvcHNDaGFuZ2VkKVxuICAgICAgcmV0dXJuIGhhbmRsZU5ld1Byb3BzKCk7XG4gICAgaWYgKHN0YXRlQ2hhbmdlZClcbiAgICAgIHJldHVybiBoYW5kbGVOZXdTdGF0ZSgpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvcihuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykge1xuICAgIHJldHVybiBoYXNSdW5BdExlYXN0T25jZSA/IGhhbmRsZVN1YnNlcXVlbnRDYWxscyhuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykgOiBoYW5kbGVGaXJzdENhbGwobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpO1xuICB9O1xufVxuZnVuY3Rpb24gZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShkaXNwYXRjaCwge1xuICBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzLFxuICBpbml0TWVyZ2VQcm9wcyxcbiAgLi4ub3B0aW9uc1xufSkge1xuICBjb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSBpbml0TWFwU3RhdGVUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIGNvbnN0IG1lcmdlUHJvcHMgPSBpbml0TWVyZ2VQcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMpO1xuICB9XG4gIHJldHVybiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIG9wdGlvbnMpO1xufVxuXG4vLyBzcmMvdXRpbHMvYmluZEFjdGlvbkNyZWF0b3JzLnRzXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGNvbnN0IGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYWN0aW9uQ3JlYXRvcnMpIHtcbiAgICBjb25zdCBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gKC4uLmFyZ3MpID0+IGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IoLi4uYXJncykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm91bmRBY3Rpb25DcmVhdG9ycztcbn1cblxuLy8gc3JjL3V0aWxzL2lzUGxhaW5PYmplY3QudHNcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8IG9iaiA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIGlmIChwcm90byA9PT0gbnVsbClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgbGV0IGJhc2VQcm90byA9IHByb3RvO1xuICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKGJhc2VQcm90bykgIT09IG51bGwpIHtcbiAgICBiYXNlUHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZVByb3RvKTtcbiAgfVxuICByZXR1cm4gcHJvdG8gPT09IGJhc2VQcm90bztcbn1cblxuLy8gc3JjL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0LnRzXG5mdW5jdGlvbiB2ZXJpZnlQbGFpbk9iamVjdCh2YWx1ZSwgZGlzcGxheU5hbWUsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIHdhcm5pbmcoXG4gICAgICBgJHttZXRob2ROYW1lfSgpIGluICR7ZGlzcGxheU5hbWV9IG11c3QgcmV0dXJuIGEgcGxhaW4gb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkICR7dmFsdWV9LmBcbiAgICApO1xuICB9XG59XG5cbi8vIHNyYy9jb25uZWN0L3dyYXBNYXBUb1Byb3BzLnRzXG5mdW5jdGlvbiB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGdldENvbnN0YW50KSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0Q29uc3RhbnRTZWxlY3RvcihkaXNwYXRjaCkge1xuICAgIGNvbnN0IGNvbnN0YW50ID0gZ2V0Q29uc3RhbnQoZGlzcGF0Y2gpO1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50U2VsZWN0b3IoKSB7XG4gICAgICByZXR1cm4gY29uc3RhbnQ7XG4gICAgfVxuICAgIGNvbnN0YW50U2VsZWN0b3IuZGVwZW5kc09uT3duUHJvcHMgPSBmYWxzZTtcbiAgICByZXR1cm4gY29uc3RhbnRTZWxlY3RvcjtcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldERlcGVuZHNPbk93blByb3BzKG1hcFRvUHJvcHMpIHtcbiAgcmV0dXJuIG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMgPyBCb29sZWFuKG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIDogbWFwVG9Qcm9wcy5sZW5ndGggIT09IDE7XG59XG5mdW5jdGlvbiB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwVG9Qcm9wcywgbWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdFByb3h5U2VsZWN0b3IoZGlzcGF0Y2gsIHsgZGlzcGxheU5hbWUgfSkge1xuICAgIGNvbnN0IHByb3h5ID0gZnVuY3Rpb24gbWFwVG9Qcm9wc1Byb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHJldHVybiBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA/IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykgOiBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgdm9pZCAwKTtcbiAgICB9O1xuICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gdHJ1ZTtcbiAgICBwcm94eS5tYXBUb1Byb3BzID0gZnVuY3Rpb24gZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICBwcm94eS5tYXBUb1Byb3BzID0gbWFwVG9Qcm9wcztcbiAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcyk7XG4gICAgICBsZXQgcHJvcHMgPSBwcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBwcm94eS5tYXBUb1Byb3BzID0gcHJvcHM7XG4gICAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMocHJvcHMpO1xuICAgICAgICBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgICAgfVxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIilcbiAgICAgICAgdmVyaWZ5UGxhaW5PYmplY3QocHJvcHMsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKTtcbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuICAgIHJldHVybiBwcm94eTtcbiAgfTtcbn1cblxuLy8gc3JjL2Nvbm5lY3QvaW52YWxpZEFyZ0ZhY3RvcnkudHNcbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KGFyZywgbmFtZSkge1xuICByZXR1cm4gKGRpc3BhdGNoLCBvcHRpb25zKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgdmFsdWUgb2YgdHlwZSAke3R5cGVvZiBhcmd9IGZvciAke25hbWV9IGFyZ3VtZW50IHdoZW4gY29ubmVjdGluZyBjb21wb25lbnQgJHtvcHRpb25zLndyYXBwZWRDb21wb25lbnROYW1lfS5gXG4gICAgKTtcbiAgfTtcbn1cblxuLy8gc3JjL2Nvbm5lY3QvbWFwRGlzcGF0Y2hUb1Byb3BzLnRzXG5mdW5jdGlvbiBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcykge1xuICByZXR1cm4gbWFwRGlzcGF0Y2hUb1Byb3BzICYmIHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09IFwib2JqZWN0XCIgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KFxuICAgIChkaXNwYXRjaCkgPT4gKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgYmluZEFjdGlvbkNyZWF0b3JzKG1hcERpc3BhdGNoVG9Qcm9wcywgZGlzcGF0Y2gpXG4gICAgKVxuICApIDogIW1hcERpc3BhdGNoVG9Qcm9wcyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoKGRpc3BhdGNoKSA9PiAoe1xuICAgIGRpc3BhdGNoXG4gIH0pKSA6IHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09IFwiZnVuY3Rpb25cIiA/IChcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3JhcE1hcFRvUHJvcHNGdW5jKG1hcERpc3BhdGNoVG9Qcm9wcywgXCJtYXBEaXNwYXRjaFRvUHJvcHNcIilcbiAgKSA6IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcywgXCJtYXBEaXNwYXRjaFRvUHJvcHNcIik7XG59XG5cbi8vIHNyYy9jb25uZWN0L21hcFN0YXRlVG9Qcm9wcy50c1xuZnVuY3Rpb24gbWFwU3RhdGVUb1Byb3BzRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuICFtYXBTdGF0ZVRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KCgpID0+ICh7fSkpIDogdHlwZW9mIG1hcFN0YXRlVG9Qcm9wcyA9PT0gXCJmdW5jdGlvblwiID8gKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwU3RhdGVUb1Byb3BzLCBcIm1hcFN0YXRlVG9Qcm9wc1wiKVxuICApIDogY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBcIm1hcFN0YXRlVG9Qcm9wc1wiKTtcbn1cblxuLy8gc3JjL2Nvbm5lY3QvbWVyZ2VQcm9wcy50c1xuZnVuY3Rpb24gZGVmYXVsdE1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgcmV0dXJuIHsgLi4ub3duUHJvcHMsIC4uLnN0YXRlUHJvcHMsIC4uLmRpc3BhdGNoUHJvcHMgfTtcbn1cbmZ1bmN0aW9uIHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0TWVyZ2VQcm9wc1Byb3h5KGRpc3BhdGNoLCB7IGRpc3BsYXlOYW1lLCBhcmVNZXJnZWRQcm9wc0VxdWFsIH0pIHtcbiAgICBsZXQgaGFzUnVuT25jZSA9IGZhbHNlO1xuICAgIGxldCBtZXJnZWRQcm9wcztcbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VQcm9wc1Byb3h5KHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKSB7XG4gICAgICBjb25zdCBuZXh0TWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICAgIGlmIChoYXNSdW5PbmNlKSB7XG4gICAgICAgIGlmICghYXJlTWVyZ2VkUHJvcHNFcXVhbChuZXh0TWVyZ2VkUHJvcHMsIG1lcmdlZFByb3BzKSlcbiAgICAgICAgICBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhc1J1bk9uY2UgPSB0cnVlO1xuICAgICAgICBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIilcbiAgICAgICAgICB2ZXJpZnlQbGFpbk9iamVjdChtZXJnZWRQcm9wcywgZGlzcGxheU5hbWUsIFwibWVyZ2VQcm9wc1wiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gbWVyZ2VQcm9wc0ZhY3RvcnkobWVyZ2VQcm9wcykge1xuICByZXR1cm4gIW1lcmdlUHJvcHMgPyAoKSA9PiBkZWZhdWx0TWVyZ2VQcm9wcyA6IHR5cGVvZiBtZXJnZVByb3BzID09PSBcImZ1bmN0aW9uXCIgPyB3cmFwTWVyZ2VQcm9wc0Z1bmMobWVyZ2VQcm9wcykgOiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShtZXJnZVByb3BzLCBcIm1lcmdlUHJvcHNcIik7XG59XG5cbi8vIHNyYy91dGlscy9iYXRjaC50c1xuZnVuY3Rpb24gZGVmYXVsdE5vb3BCYXRjaChjYWxsYmFjaykge1xuICBjYWxsYmFjaygpO1xufVxuXG4vLyBzcmMvdXRpbHMvU3Vic2NyaXB0aW9uLnRzXG5mdW5jdGlvbiBjcmVhdGVMaXN0ZW5lckNvbGxlY3Rpb24oKSB7XG4gIGxldCBmaXJzdCA9IG51bGw7XG4gIGxldCBsYXN0ID0gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBjbGVhcigpIHtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIGxhc3QgPSBudWxsO1xuICAgIH0sXG4gICAgbm90aWZ5KCkge1xuICAgICAgZGVmYXVsdE5vb3BCYXRjaCgoKSA9PiB7XG4gICAgICAgIGxldCBsaXN0ZW5lciA9IGZpcnN0O1xuICAgICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgICBsaXN0ZW5lci5jYWxsYmFjaygpO1xuICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IGZpcnN0O1xuICAgICAgd2hpbGUgKGxpc3RlbmVyKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RlbmVycztcbiAgICB9LFxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgbGV0IGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICBjb25zdCBsaXN0ZW5lciA9IGxhc3QgPSB7XG4gICAgICAgIGNhbGxiYWNrLFxuICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICBwcmV2OiBsYXN0XG4gICAgICB9O1xuICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdCA9IGxpc3RlbmVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgICBpZiAoIWlzU3Vic2NyaWJlZCB8fCBmaXJzdCA9PT0gbnVsbClcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgICBpZiAobGlzdGVuZXIubmV4dCkge1xuICAgICAgICAgIGxpc3RlbmVyLm5leHQucHJldiA9IGxpc3RlbmVyLnByZXY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGFzdCA9IGxpc3RlbmVyLnByZXY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgICBsaXN0ZW5lci5wcmV2Lm5leHQgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpcnN0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG52YXIgbnVsbExpc3RlbmVycyA9IHtcbiAgbm90aWZ5KCkge1xuICB9LFxuICBnZXQ6ICgpID0+IFtdXG59O1xuZnVuY3Rpb24gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlLCBwYXJlbnRTdWIpIHtcbiAgbGV0IHVuc3Vic2NyaWJlO1xuICBsZXQgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcbiAgbGV0IHN1YnNjcmlwdGlvbnNBbW91bnQgPSAwO1xuICBsZXQgc2VsZlN1YnNjcmliZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gYWRkTmVzdGVkU3ViKGxpc3RlbmVyKSB7XG4gICAgdHJ5U3Vic2NyaWJlKCk7XG4gICAgY29uc3QgY2xlYW51cExpc3RlbmVyID0gbGlzdGVuZXJzLnN1YnNjcmliZShsaXN0ZW5lcik7XG4gICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKCFyZW1vdmVkKSB7XG4gICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwTGlzdGVuZXIoKTtcbiAgICAgICAgdHJ5VW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIG5vdGlmeU5lc3RlZFN1YnMoKSB7XG4gICAgbGlzdGVuZXJzLm5vdGlmeSgpO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZUNoYW5nZVdyYXBwZXIoKSB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlKSB7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSgpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpc1N1YnNjcmliZWQoKSB7XG4gICAgcmV0dXJuIHNlbGZTdWJzY3JpYmVkO1xuICB9XG4gIGZ1bmN0aW9uIHRyeVN1YnNjcmliZSgpIHtcbiAgICBzdWJzY3JpcHRpb25zQW1vdW50Kys7XG4gICAgaWYgKCF1bnN1YnNjcmliZSkge1xuICAgICAgdW5zdWJzY3JpYmUgPSBwYXJlbnRTdWIgPyBwYXJlbnRTdWIuYWRkTmVzdGVkU3ViKGhhbmRsZUNoYW5nZVdyYXBwZXIpIDogc3RvcmUuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZVdyYXBwZXIpO1xuICAgICAgbGlzdGVuZXJzID0gY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHRyeVVuc3Vic2NyaWJlKCkge1xuICAgIHN1YnNjcmlwdGlvbnNBbW91bnQtLTtcbiAgICBpZiAodW5zdWJzY3JpYmUgJiYgc3Vic2NyaXB0aW9uc0Ftb3VudCA9PT0gMCkge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgIHVuc3Vic2NyaWJlID0gdm9pZCAwO1xuICAgICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICBsaXN0ZW5lcnMgPSBudWxsTGlzdGVuZXJzO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB0cnlTdWJzY3JpYmVTZWxmKCkge1xuICAgIGlmICghc2VsZlN1YnNjcmliZWQpIHtcbiAgICAgIHNlbGZTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIHRyeVN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB0cnlVbnN1YnNjcmliZVNlbGYoKSB7XG4gICAgaWYgKHNlbGZTdWJzY3JpYmVkKSB7XG4gICAgICBzZWxmU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgdHJ5VW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0ge1xuICAgIGFkZE5lc3RlZFN1YixcbiAgICBub3RpZnlOZXN0ZWRTdWJzLFxuICAgIGhhbmRsZUNoYW5nZVdyYXBwZXIsXG4gICAgaXNTdWJzY3JpYmVkLFxuICAgIHRyeVN1YnNjcmliZTogdHJ5U3Vic2NyaWJlU2VsZixcbiAgICB0cnlVbnN1YnNjcmliZTogdHJ5VW5zdWJzY3JpYmVTZWxmLFxuICAgIGdldExpc3RlbmVyczogKCkgPT4gbGlzdGVuZXJzXG4gIH07XG4gIHJldHVybiBzdWJzY3JpcHRpb247XG59XG5cbi8vIHNyYy91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LnRzXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIik7XG52YXIgaXNSZWFjdE5hdGl2ZSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLnByb2R1Y3QgPT09IFwiUmVhY3ROYXRpdmVcIjtcbnZhciB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gY2FuVXNlRE9NIHx8IGlzUmVhY3ROYXRpdmUgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG5cbi8vIHNyYy91dGlscy9zaGFsbG93RXF1YWwudHNcbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgaWYgKHggPT09IHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCB8fCB5ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAoaXMob2JqQSwgb2JqQikpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gXCJvYmplY3RcIiB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSBcIm9iamVjdFwiIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgY29uc3Qga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhaXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gc3JjL3V0aWxzL2hvaXN0U3RhdGljcy50c1xudmFyIFJFQUNUX1NUQVRJQ1MgPSB7XG4gIGNoaWxkQ29udGV4dFR5cGVzOiB0cnVlLFxuICBjb250ZXh0VHlwZTogdHJ1ZSxcbiAgY29udGV4dFR5cGVzOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBnZXREZWZhdWx0UHJvcHM6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiB0cnVlLFxuICBtaXhpbnM6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBLTk9XTl9TVEFUSUNTID0ge1xuICBuYW1lOiB0cnVlLFxuICBsZW5ndGg6IHRydWUsXG4gIHByb3RvdHlwZTogdHJ1ZSxcbiAgY2FsbGVyOiB0cnVlLFxuICBjYWxsZWU6IHRydWUsXG4gIGFyZ3VtZW50czogdHJ1ZSxcbiAgYXJpdHk6IHRydWVcbn07XG52YXIgRk9SV0FSRF9SRUZfU1RBVElDUyA9IHtcbiAgJCR0eXBlb2Y6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlXG59O1xudmFyIE1FTU9fU1RBVElDUyA9IHtcbiAgJCR0eXBlb2Y6IHRydWUsXG4gIGNvbXBhcmU6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBUWVBFX1NUQVRJQ1MgPSB7XG4gIFtGb3J3YXJkUmVmXTogRk9SV0FSRF9SRUZfU1RBVElDUyxcbiAgW01lbW9dOiBNRU1PX1NUQVRJQ1Ncbn07XG5mdW5jdGlvbiBnZXRTdGF0aWNzKGNvbXBvbmVudCkge1xuICBpZiAoaXNNZW1vKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gTUVNT19TVEFUSUNTO1xuICB9XG4gIHJldHVybiBUWVBFX1NUQVRJQ1NbY29tcG9uZW50W1wiJCR0eXBlb2ZcIl1dIHx8IFJFQUNUX1NUQVRJQ1M7XG59XG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQpIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2VDb21wb25lbnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAob2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICBjb25zdCBpbmhlcml0ZWRDb21wb25lbnQgPSBnZXRQcm90b3R5cGVPZihzb3VyY2VDb21wb25lbnQpO1xuICAgICAgaWYgKGluaGVyaXRlZENvbXBvbmVudCAmJiBpbmhlcml0ZWRDb21wb25lbnQgIT09IG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgICBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIGluaGVyaXRlZENvbXBvbmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuICAgIGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlQ29tcG9uZW50KSk7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldFN0YXRpY3MgPSBnZXRTdGF0aWNzKHRhcmdldENvbXBvbmVudCk7XG4gICAgY29uc3Qgc291cmNlU3RhdGljcyA9IGdldFN0YXRpY3Moc291cmNlQ29tcG9uZW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoIUtOT1dOX1NUQVRJQ1Nba2V5XSAmJiAhKHNvdXJjZVN0YXRpY3MgJiYgc291cmNlU3RhdGljc1trZXldKSAmJiAhKHRhcmdldFN0YXRpY3MgJiYgdGFyZ2V0U3RhdGljc1trZXldKSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZUNvbXBvbmVudCwga2V5KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXRDb21wb25lbnQsIGtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xufVxuXG4vLyBzcmMvY29tcG9uZW50cy9jb25uZWN0LnRzeFxudmFyIHVzZVN5bmNFeHRlcm5hbFN0b3JlID0gbm90SW5pdGlhbGl6ZWQ7XG52YXIgaW5pdGlhbGl6ZUNvbm5lY3QgPSAoZm4pID0+IHtcbiAgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBmbjtcbn07XG52YXIgTk9fU1VCU0NSSVBUSU9OX0FSUkFZID0gW251bGwsIG51bGxdO1xudmFyIHN0cmluZ2lmeUNvbXBvbmVudCA9IChDb21wKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KENvbXApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gU3RyaW5nKENvbXApO1xuICB9XG59O1xuZnVuY3Rpb24gdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKGVmZmVjdEZ1bmMsIGVmZmVjdEFyZ3MsIGRlcGVuZGVuY2llcykge1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IGVmZmVjdEZ1bmMoLi4uZWZmZWN0QXJncyksIGRlcGVuZGVuY2llcyk7XG59XG5mdW5jdGlvbiBjYXB0dXJlV3JhcHBlclByb3BzKGxhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgd3JhcHBlclByb3BzLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzKSB7XG4gIGxhc3RXcmFwcGVyUHJvcHMuY3VycmVudCA9IHdyYXBwZXJQcm9wcztcbiAgcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCA9IGZhbHNlO1xuICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50KSB7XG4gICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gbnVsbDtcbiAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHN1YnNjcmliZVVwZGF0ZXMoc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLCBzdG9yZSwgc3Vic2NyaXB0aW9uLCBjaGlsZFByb3BzU2VsZWN0b3IsIGxhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgaXNNb3VudGVkLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzLCBhZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIpIHtcbiAgaWYgKCFzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICB9O1xuICBsZXQgZGlkVW5zdWJzY3JpYmUgPSBmYWxzZTtcbiAgbGV0IGxhc3RUaHJvd25FcnJvciA9IG51bGw7XG4gIGNvbnN0IGNoZWNrRm9yVXBkYXRlcyA9ICgpID0+IHtcbiAgICBpZiAoZGlkVW5zdWJzY3JpYmUgfHwgIWlzTW91bnRlZC5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhdGVzdFN0b3JlU3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGxldCBuZXdDaGlsZFByb3BzLCBlcnJvcjtcbiAgICB0cnkge1xuICAgICAgbmV3Q2hpbGRQcm9wcyA9IGNoaWxkUHJvcHNTZWxlY3RvcihcbiAgICAgICAgbGF0ZXN0U3RvcmVTdGF0ZSxcbiAgICAgICAgbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IGU7XG4gICAgfVxuICAgIGlmICghZXJyb3IpIHtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IG51bGw7XG4gICAgfVxuICAgIGlmIChuZXdDaGlsZFByb3BzID09PSBsYXN0Q2hpbGRQcm9wcy5jdXJyZW50KSB7XG4gICAgICBpZiAoIXJlbmRlcklzU2NoZWR1bGVkLmN1cnJlbnQpIHtcbiAgICAgICAgbm90aWZ5TmVzdGVkU3VicygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0Q2hpbGRQcm9wcy5jdXJyZW50ID0gbmV3Q2hpbGRQcm9wcztcbiAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIGFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfTtcbiAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBjaGVja0ZvclVwZGF0ZXM7XG4gIHN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcbiAgY2hlY2tGb3JVcGRhdGVzKCk7XG4gIGNvbnN0IHVuc3Vic2NyaWJlV3JhcHBlciA9ICgpID0+IHtcbiAgICBkaWRVbnN1YnNjcmliZSA9IHRydWU7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBudWxsO1xuICAgIGlmIChsYXN0VGhyb3duRXJyb3IpIHtcbiAgICAgIHRocm93IGxhc3RUaHJvd25FcnJvcjtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1bnN1YnNjcmliZVdyYXBwZXI7XG59XG5mdW5jdGlvbiBzdHJpY3RFcXVhbChhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufVxudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZFB1cmVPcHRpb24gPSBmYWxzZTtcbmZ1bmN0aW9uIGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIHtcbiAgLy8gVGhlIGBwdXJlYCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZCwgc28gVFMgZG9lc24ndCBsaWtlIHVzIGRlc3RydWN0dXJpbmcgdGhpcyB0byBjaGVjayBpdHMgZXhpc3RlbmNlLlxuICAvLyBAdHMtaWdub3JlXG4gIHB1cmUsXG4gIGFyZVN0YXRlc0VxdWFsID0gc3RyaWN0RXF1YWwsXG4gIGFyZU93blByb3BzRXF1YWwgPSBzaGFsbG93RXF1YWwsXG4gIGFyZVN0YXRlUHJvcHNFcXVhbCA9IHNoYWxsb3dFcXVhbCxcbiAgYXJlTWVyZ2VkUHJvcHNFcXVhbCA9IHNoYWxsb3dFcXVhbCxcbiAgLy8gdXNlIFJlYWN0J3MgZm9yd2FyZFJlZiB0byBleHBvc2UgYSByZWYgb2YgdGhlIHdyYXBwZWQgY29tcG9uZW50XG4gIGZvcndhcmRSZWYgPSBmYWxzZSxcbiAgLy8gdGhlIGNvbnRleHQgY29uc3VtZXIgdG8gdXNlXG4gIGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dFxufSA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAocHVyZSAhPT0gdm9pZCAwICYmICFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uID0gdHJ1ZTtcbiAgICAgIHdhcm5pbmcoXG4gICAgICAgICdUaGUgYHB1cmVgIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLiBgY29ubmVjdGAgaXMgbm93IGFsd2F5cyBhIFwicHVyZS9tZW1vaXplZFwiIGNvbXBvbmVudCdcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGNvbnN0IENvbnRleHQgPSBjb250ZXh0O1xuICBjb25zdCBpbml0TWFwU3RhdGVUb1Byb3BzID0gbWFwU3RhdGVUb1Byb3BzRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMpO1xuICBjb25zdCBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMpO1xuICBjb25zdCBpbml0TWVyZ2VQcm9wcyA9IG1lcmdlUHJvcHNGYWN0b3J5KG1lcmdlUHJvcHMpO1xuICBjb25zdCBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMgPSBCb29sZWFuKG1hcFN0YXRlVG9Qcm9wcyk7XG4gIGNvbnN0IHdyYXBXaXRoQ29ubmVjdCA9IChXcmFwcGVkQ29tcG9uZW50KSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IC8qIEBfX1BVUkVfXyAqLyBpc1ZhbGlkRWxlbWVudFR5cGUoV3JhcHBlZENvbXBvbmVudCk7XG4gICAgICBpZiAoIWlzVmFsaWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgWW91IG11c3QgcGFzcyBhIGNvbXBvbmVudCB0byB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgY29ubmVjdC4gSW5zdGVhZCByZWNlaXZlZCAke3N0cmluZ2lmeUNvbXBvbmVudChcbiAgICAgICAgICAgIFdyYXBwZWRDb21wb25lbnRcbiAgICAgICAgICApfWBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgd3JhcHBlZENvbXBvbmVudE5hbWUgPSBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCBcIkNvbXBvbmVudFwiO1xuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gYENvbm5lY3QoJHt3cmFwcGVkQ29tcG9uZW50TmFtZX0pYDtcbiAgICBjb25zdCBzZWxlY3RvckZhY3RvcnlPcHRpb25zID0ge1xuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgICB3cmFwcGVkQ29tcG9uZW50TmFtZSxcbiAgICAgIFdyYXBwZWRDb21wb25lbnQsXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyxcbiAgICAgIGluaXRNZXJnZVByb3BzLFxuICAgICAgYXJlU3RhdGVzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWwsXG4gICAgICBhcmVPd25Qcm9wc0VxdWFsLFxuICAgICAgYXJlTWVyZ2VkUHJvcHNFcXVhbFxuICAgIH07XG4gICAgZnVuY3Rpb24gQ29ubmVjdEZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICBjb25zdCBbcHJvcHNDb250ZXh0LCByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmLCB3cmFwcGVyUHJvcHNdID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmVhY3RSZWR1eEZvcndhcmRlZFJlZjogcmVhY3RSZWR1eEZvcndhcmRlZFJlZjIsIC4uLndyYXBwZXJQcm9wczIgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gW3Byb3BzLmNvbnRleHQsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYyLCB3cmFwcGVyUHJvcHMyXTtcbiAgICAgIH0sIFtwcm9wc10pO1xuICAgICAgY29uc3QgQ29udGV4dFRvVXNlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGxldCBSZXN1bHRDb250ZXh0ID0gQ29udGV4dDtcbiAgICAgICAgaWYgKHByb3BzQ29udGV4dD8uQ29uc3VtZXIpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gLyogQF9fUFVSRV9fICovIGlzQ29udGV4dENvbnN1bWVyKFxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KHByb3BzQ29udGV4dC5Db25zdW1lciwgbnVsbClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiWW91IG11c3QgcGFzcyBhIHZhbGlkIFJlYWN0IGNvbnRleHQgY29uc3VtZXIgYXMgYHByb3BzLmNvbnRleHRgXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlc3VsdENvbnRleHQgPSBwcm9wc0NvbnRleHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZXN1bHRDb250ZXh0O1xuICAgICAgfSwgW3Byb3BzQ29udGV4dCwgQ29udGV4dF0pO1xuICAgICAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0VG9Vc2UpO1xuICAgICAgY29uc3QgZGlkU3RvcmVDb21lRnJvbVByb3BzID0gQm9vbGVhbihwcm9wcy5zdG9yZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5nZXRTdGF0ZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5kaXNwYXRjaCk7XG4gICAgICBjb25zdCBkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCA9IEJvb2xlYW4oY29udGV4dFZhbHVlKSAmJiBCb29sZWFuKGNvbnRleHRWYWx1ZS5zdG9yZSk7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFkaWRTdG9yZUNvbWVGcm9tUHJvcHMgJiYgIWRpZFN0b3JlQ29tZUZyb21Db250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgXCJzdG9yZVwiIGluIHRoZSBjb250ZXh0IG9mIFwiJHtkaXNwbGF5TmFtZX1cIi4gRWl0aGVyIHdyYXAgdGhlIHJvb3QgY29tcG9uZW50IGluIGEgPFByb3ZpZGVyPiwgb3IgcGFzcyBhIGN1c3RvbSBSZWFjdCBjb250ZXh0IHByb3ZpZGVyIHRvIDxQcm92aWRlcj4gYW5kIHRoZSBjb3JyZXNwb25kaW5nIFJlYWN0IGNvbnRleHQgY29uc3VtZXIgdG8gJHtkaXNwbGF5TmFtZX0gaW4gY29ubmVjdCBvcHRpb25zLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0b3JlID0gZGlkU3RvcmVDb21lRnJvbVByb3BzID8gcHJvcHMuc3RvcmUgOiBjb250ZXh0VmFsdWUuc3RvcmU7XG4gICAgICBjb25zdCBnZXRTZXJ2ZXJTdGF0ZSA9IGRpZFN0b3JlQ29tZUZyb21Db250ZXh0ID8gY29udGV4dFZhbHVlLmdldFNlcnZlclN0YXRlIDogc3RvcmUuZ2V0U3RhdGU7XG4gICAgICBjb25zdCBjaGlsZFByb3BzU2VsZWN0b3IgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpbmFsUHJvcHNTZWxlY3RvckZhY3Rvcnkoc3RvcmUuZGlzcGF0Y2gsIHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMpO1xuICAgICAgfSwgW3N0b3JlXSk7XG4gICAgICBjb25zdCBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcylcbiAgICAgICAgICByZXR1cm4gTk9fU1VCU0NSSVBUSU9OX0FSUkFZO1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24yID0gY3JlYXRlU3Vic2NyaXB0aW9uKFxuICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgIGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA/IHZvaWQgMCA6IGNvbnRleHRWYWx1ZS5zdWJzY3JpcHRpb25cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgbm90aWZ5TmVzdGVkU3ViczIgPSBzdWJzY3JpcHRpb24yLm5vdGlmeU5lc3RlZFN1YnMuYmluZChzdWJzY3JpcHRpb24yKTtcbiAgICAgICAgcmV0dXJuIFtzdWJzY3JpcHRpb24yLCBub3RpZnlOZXN0ZWRTdWJzMl07XG4gICAgICB9LCBbc3RvcmUsIGRpZFN0b3JlQ29tZUZyb21Qcm9wcywgY29udGV4dFZhbHVlXSk7XG4gICAgICBjb25zdCBvdmVycmlkZGVuQ29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmIChkaWRTdG9yZUNvbWVGcm9tUHJvcHMpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY29udGV4dFZhbHVlLFxuICAgICAgICAgIHN1YnNjcmlwdGlvblxuICAgICAgICB9O1xuICAgICAgfSwgW2RpZFN0b3JlQ29tZUZyb21Qcm9wcywgY29udGV4dFZhbHVlLCBzdWJzY3JpcHRpb25dKTtcbiAgICAgIGNvbnN0IGxhc3RDaGlsZFByb3BzID0gUmVhY3QudXNlUmVmKHZvaWQgMCk7XG4gICAgICBjb25zdCBsYXN0V3JhcHBlclByb3BzID0gUmVhY3QudXNlUmVmKHdyYXBwZXJQcm9wcyk7XG4gICAgICBjb25zdCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlID0gUmVhY3QudXNlUmVmKHZvaWQgMCk7XG4gICAgICBjb25zdCByZW5kZXJJc1NjaGVkdWxlZCA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gICAgICBjb25zdCBpc01vdW50ZWQgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgbGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvciA9IFJlYWN0LnVzZVJlZihcbiAgICAgICAgdm9pZCAwXG4gICAgICApO1xuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlzTW91bnRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBpc01vdW50ZWQuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgfSwgW10pO1xuICAgICAgY29uc3QgYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgJiYgd3JhcHBlclByb3BzID09PSBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjaGlsZFByb3BzU2VsZWN0b3Ioc3RvcmUuZ2V0U3RhdGUoKSwgd3JhcHBlclByb3BzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgICAgfSwgW3N0b3JlLCB3cmFwcGVyUHJvcHNdKTtcbiAgICAgIGNvbnN0IHN1YnNjcmliZUZvclJlYWN0ID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YnNjcmliZSA9IChyZWFjdExpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlVXBkYXRlcyhcbiAgICAgICAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyxcbiAgICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2hpbGRQcm9wc1NlbGVjdG9yLFxuICAgICAgICAgICAgbGFzdFdyYXBwZXJQcm9wcyxcbiAgICAgICAgICAgIGxhc3RDaGlsZFByb3BzLFxuICAgICAgICAgICAgcmVuZGVySXNTY2hlZHVsZWQsXG4gICAgICAgICAgICBpc01vdW50ZWQsXG4gICAgICAgICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLFxuICAgICAgICAgICAgbm90aWZ5TmVzdGVkU3VicyxcbiAgICAgICAgICAgIHJlYWN0TGlzdGVuZXJcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlO1xuICAgICAgfSwgW3N1YnNjcmlwdGlvbl0pO1xuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKGNhcHR1cmVXcmFwcGVyUHJvcHMsIFtcbiAgICAgICAgbGFzdFdyYXBwZXJQcm9wcyxcbiAgICAgICAgbGFzdENoaWxkUHJvcHMsXG4gICAgICAgIHJlbmRlcklzU2NoZWR1bGVkLFxuICAgICAgICB3cmFwcGVyUHJvcHMsXG4gICAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsXG4gICAgICAgIG5vdGlmeU5lc3RlZFN1YnNcbiAgICAgIF0pO1xuICAgICAgbGV0IGFjdHVhbENoaWxkUHJvcHM7XG4gICAgICB0cnkge1xuICAgICAgICBhY3R1YWxDaGlsZFByb3BzID0gdXNlU3luY0V4dGVybmFsU3RvcmUoXG4gICAgICAgICAgLy8gVE9ETyBXZSdyZSBwYXNzaW5nIHRocm91Z2ggYSBiaWcgd3JhcHBlciB0aGF0IGRvZXMgYSBidW5jaCBvZiBleHRyYSBzaWRlIGVmZmVjdHMgYmVzaWRlcyBzdWJzY3JpYmluZ1xuICAgICAgICAgIHN1YnNjcmliZUZvclJlYWN0LFxuICAgICAgICAgIC8vIFRPRE8gVGhpcyBpcyBpbmNyZWRpYmx5IGhhY2t5LiBXZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGUgc3RvcmUgdXBkYXRlIGFuZCBjYWxjdWxhdGVkIG5ldyBjaGlsZCBwcm9wcyxcbiAgICAgICAgICAvLyBUT0RPIGFuZCB3ZSdyZSBqdXN0IHBhc3NpbmcgdGhhdCB0aHJvdWdoIHNvIGl0IHRyaWdnZXJzIGEgcmUtcmVuZGVyIGZvciB1cyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGB1U0VTYC5cbiAgICAgICAgICBhY3R1YWxDaGlsZFByb3BzU2VsZWN0b3IsXG4gICAgICAgICAgZ2V0U2VydmVyU3RhdGUgPyAoKSA9PiBjaGlsZFByb3BzU2VsZWN0b3IoZ2V0U2VydmVyU3RhdGUoKSwgd3JhcHBlclByb3BzKSA6IGFjdHVhbENoaWxkUHJvcHNTZWxlY3RvclxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQpIHtcbiAgICAgICAgICA7XG4gICAgICAgICAgZXJyLm1lc3NhZ2UgKz0gYFxuVGhlIGVycm9yIG1heSBiZSBjb3JyZWxhdGVkIHdpdGggdGhpcyBwcmV2aW91cyBlcnJvcjpcbiR7bGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50LnN0YWNrfVxuXG5gO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQgPSB2b2lkIDA7XG4gICAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IHZvaWQgMDtcbiAgICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IGFjdHVhbENoaWxkUHJvcHM7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFdyYXBwZWRDb21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLmFjdHVhbENoaWxkUHJvcHMsXG4gICAgICAgICAgICAgIHJlZjogcmVhY3RSZWR1eEZvcndhcmRlZFJlZlxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0sIFtyZWFjdFJlZHV4Rm9yd2FyZGVkUmVmLCBXcmFwcGVkQ29tcG9uZW50LCBhY3R1YWxDaGlsZFByb3BzXSk7XG4gICAgICBjb25zdCByZW5kZXJlZENoaWxkID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmIChzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHtcbiAgICAgICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dFRvVXNlLlByb3ZpZGVyLCB7IHZhbHVlOiBvdmVycmlkZGVuQ29udGV4dFZhbHVlIH0sIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudDtcbiAgICAgIH0sIFtDb250ZXh0VG9Vc2UsIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCwgb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZV0pO1xuICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGQ7XG4gICAgfVxuICAgIGNvbnN0IF9Db25uZWN0ID0gUmVhY3QubWVtbyhDb25uZWN0RnVuY3Rpb24pO1xuICAgIGNvbnN0IENvbm5lY3QgPSBfQ29ubmVjdDtcbiAgICBDb25uZWN0LldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgIENvbm5lY3QuZGlzcGxheU5hbWUgPSBDb25uZWN0RnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICBpZiAoZm9yd2FyZFJlZikge1xuICAgICAgY29uc3QgX2ZvcndhcmRlZCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gICAgICAgIGZ1bmN0aW9uIGZvcndhcmRDb25uZWN0UmVmKHByb3BzLCByZWYpIHtcbiAgICAgICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29ubmVjdCwgeyAuLi5wcm9wcywgcmVhY3RSZWR1eEZvcndhcmRlZFJlZjogcmVmIH0pO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgY29uc3QgZm9yd2FyZGVkID0gX2ZvcndhcmRlZDtcbiAgICAgIGZvcndhcmRlZC5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgICAgZm9yd2FyZGVkLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBob2lzdE5vblJlYWN0U3RhdGljcyhmb3J3YXJkZWQsIFdyYXBwZWRDb21wb25lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKENvbm5lY3QsIFdyYXBwZWRDb21wb25lbnQpO1xuICB9O1xuICByZXR1cm4gd3JhcFdpdGhDb25uZWN0O1xufVxudmFyIGNvbm5lY3RfZGVmYXVsdCA9IGNvbm5lY3Q7XG5cbi8vIHNyYy9jb21wb25lbnRzL1Byb3ZpZGVyLnRzeFxuZnVuY3Rpb24gUHJvdmlkZXIoe1xuICBzdG9yZSxcbiAgY29udGV4dCxcbiAgY2hpbGRyZW4sXG4gIHNlcnZlclN0YXRlLFxuICBzdGFiaWxpdHlDaGVjayA9IFwib25jZVwiLFxuICBpZGVudGl0eUZ1bmN0aW9uQ2hlY2sgPSBcIm9uY2VcIlxufSkge1xuICBjb25zdCBjb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUpO1xuICAgIHJldHVybiB7XG4gICAgICBzdG9yZSxcbiAgICAgIHN1YnNjcmlwdGlvbixcbiAgICAgIGdldFNlcnZlclN0YXRlOiBzZXJ2ZXJTdGF0ZSA/ICgpID0+IHNlcnZlclN0YXRlIDogdm9pZCAwLFxuICAgICAgc3RhYmlsaXR5Q2hlY2ssXG4gICAgICBpZGVudGl0eUZ1bmN0aW9uQ2hlY2tcbiAgICB9O1xuICB9LCBbc3RvcmUsIHNlcnZlclN0YXRlLCBzdGFiaWxpdHlDaGVjaywgaWRlbnRpdHlGdW5jdGlvbkNoZWNrXSk7XG4gIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBSZWFjdC51c2VNZW1vKCgpID0+IHN0b3JlLmdldFN0YXRlKCksIFtzdG9yZV0pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IHN1YnNjcmlwdGlvbiB9ID0gY29udGV4dFZhbHVlO1xuICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnM7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVN1YnNjcmliZSgpO1xuICAgIGlmIChwcmV2aW91c1N0YXRlICE9PSBzdG9yZS5nZXRTdGF0ZSgpKSB7XG4gICAgICBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3VicygpO1xuICAgIH1cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IHZvaWQgMDtcbiAgICB9O1xuICB9LCBbY29udGV4dFZhbHVlLCBwcmV2aW91c1N0YXRlXSk7XG4gIGNvbnN0IENvbnRleHQgPSBjb250ZXh0IHx8IFJlYWN0UmVkdXhDb250ZXh0O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogY29udGV4dFZhbHVlIH0sIGNoaWxkcmVuKTtcbn1cbnZhciBQcm92aWRlcl9kZWZhdWx0ID0gUHJvdmlkZXI7XG5cbi8vIHNyYy9ob29rcy91c2VTdG9yZS50c1xuZnVuY3Rpb24gY3JlYXRlU3RvcmVIb29rKGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dCkge1xuICBjb25zdCB1c2VSZWR1eENvbnRleHQyID0gY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VSZWR1eENvbnRleHQgOiAoXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soY29udGV4dClcbiAgKTtcbiAgY29uc3QgdXNlU3RvcmUyID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RvcmUgfSA9IHVzZVJlZHV4Q29udGV4dDIoKTtcbiAgICByZXR1cm4gc3RvcmU7XG4gIH07XG4gIE9iamVjdC5hc3NpZ24odXNlU3RvcmUyLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiB1c2VTdG9yZTJcbiAgfSk7XG4gIHJldHVybiB1c2VTdG9yZTI7XG59XG52YXIgdXNlU3RvcmUgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlU3RvcmVIb29rKCk7XG5cbi8vIHNyYy9ob29rcy91c2VEaXNwYXRjaC50c1xuZnVuY3Rpb24gY3JlYXRlRGlzcGF0Y2hIb29rKGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dCkge1xuICBjb25zdCB1c2VTdG9yZTIgPSBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZVN0b3JlIDogY3JlYXRlU3RvcmVIb29rKGNvbnRleHQpO1xuICBjb25zdCB1c2VEaXNwYXRjaDIgPSAoKSA9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZTIoKTtcbiAgICByZXR1cm4gc3RvcmUuZGlzcGF0Y2g7XG4gIH07XG4gIE9iamVjdC5hc3NpZ24odXNlRGlzcGF0Y2gyLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiB1c2VEaXNwYXRjaDJcbiAgfSk7XG4gIHJldHVybiB1c2VEaXNwYXRjaDI7XG59XG52YXIgdXNlRGlzcGF0Y2ggPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGlzcGF0Y2hIb29rKCk7XG5cbi8vIHNyYy9leHBvcnRzLnRzXG52YXIgYmF0Y2ggPSBkZWZhdWx0Tm9vcEJhdGNoO1xuXG4vLyBzcmMvaW5kZXgudHNcbmluaXRpYWxpemVVc2VTZWxlY3Rvcih1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcjIpO1xuaW5pdGlhbGl6ZUNvbm5lY3QoUmVhY3QyLnVzZVN5bmNFeHRlcm5hbFN0b3JlKTtcbmV4cG9ydCB7XG4gIFByb3ZpZGVyX2RlZmF1bHQgYXMgUHJvdmlkZXIsXG4gIFJlYWN0UmVkdXhDb250ZXh0LFxuICBiYXRjaCxcbiAgY29ubmVjdF9kZWZhdWx0IGFzIGNvbm5lY3QsXG4gIGNyZWF0ZURpc3BhdGNoSG9vayxcbiAgY3JlYXRlU2VsZWN0b3JIb29rLFxuICBjcmVhdGVTdG9yZUhvb2ssXG4gIHNoYWxsb3dFcXVhbCxcbiAgdXNlRGlzcGF0Y2gsXG4gIHVzZVNlbGVjdG9yLFxuICB1c2VTdG9yZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWN0LXJlZHV4Lm1qcy5tYXAiLCIvLyBzcmMvaW5kZXgudHNcbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYWN0aW9uKGRpc3BhdGNoLCBnZXRTdGF0ZSwgZXh0cmFBcmd1bWVudCk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gIH07XG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxudmFyIHRodW5rID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlKCk7XG52YXIgd2l0aEV4dHJhQXJndW1lbnQgPSBjcmVhdGVUaHVua01pZGRsZXdhcmU7XG5leHBvcnQge1xuICB0aHVuayxcbiAgd2l0aEV4dHJhQXJndW1lbnRcbn07XG4iLCIvLyBzcmMvdXRpbHMvZm9ybWF0UHJvZEVycm9yTWVzc2FnZS50c1xuZnVuY3Rpb24gZm9ybWF0UHJvZEVycm9yTWVzc2FnZShjb2RlKSB7XG4gIHJldHVybiBgTWluaWZpZWQgUmVkdXggZXJyb3IgIyR7Y29kZX07IHZpc2l0IGh0dHBzOi8vcmVkdXguanMub3JnL0Vycm9ycz9jb2RlPSR7Y29kZX0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycy4gYDtcbn1cblxuLy8gc3JjL3V0aWxzL3N5bWJvbC1vYnNlcnZhYmxlLnRzXG52YXIgJCRvYnNlcnZhYmxlID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgXCJAQG9ic2VydmFibGVcIikoKTtcbnZhciBzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0ID0gJCRvYnNlcnZhYmxlO1xuXG4vLyBzcmMvdXRpbHMvYWN0aW9uVHlwZXMudHNcbnZhciByYW5kb21TdHJpbmcgPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoXCJcIikuam9pbihcIi5cIik7XG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IGBAQHJlZHV4L0lOSVQkey8qIEBfX1BVUkVfXyAqLyByYW5kb21TdHJpbmcoKX1gLFxuICBSRVBMQUNFOiBgQEByZWR1eC9SRVBMQUNFJHsvKiBAX19QVVJFX18gKi8gcmFuZG9tU3RyaW5nKCl9YCxcbiAgUFJPQkVfVU5LTk9XTl9BQ1RJT046ICgpID0+IGBAQHJlZHV4L1BST0JFX1VOS05PV05fQUNUSU9OJHtyYW5kb21TdHJpbmcoKX1gXG59O1xudmFyIGFjdGlvblR5cGVzX2RlZmF1bHQgPSBBY3Rpb25UeXBlcztcblxuLy8gc3JjL3V0aWxzL2lzUGxhaW5PYmplY3QudHNcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8IG9iaiA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGxldCBwcm90byA9IG9iajtcbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90byB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gbnVsbDtcbn1cblxuLy8gc3JjL3V0aWxzL2tpbmRPZi50c1xuZnVuY3Rpb24gbWluaUtpbmRPZih2YWwpIHtcbiAgaWYgKHZhbCA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICBpZiAodmFsID09PSBudWxsKVxuICAgIHJldHVybiBcIm51bGxcIjtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6IHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKVxuICAgIHJldHVybiBcImFycmF5XCI7XG4gIGlmIChpc0RhdGUodmFsKSlcbiAgICByZXR1cm4gXCJkYXRlXCI7XG4gIGlmIChpc0Vycm9yKHZhbCkpXG4gICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gY3Rvck5hbWUodmFsKTtcbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlIFwiU3ltYm9sXCI6XG4gICAgY2FzZSBcIlByb21pc2VcIjpcbiAgICBjYXNlIFwiV2Vha01hcFwiOlxuICAgIGNhc2UgXCJXZWFrU2V0XCI6XG4gICAgY2FzZSBcIk1hcFwiOlxuICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCBcIlwiKTtcbn1cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gXCJmdW5jdGlvblwiID8gdmFsLmNvbnN0cnVjdG9yLm5hbWUgOiBudWxsO1xufVxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWwuY29uc3RydWN0b3IgJiYgdHlwZW9mIHZhbC5jb25zdHJ1Y3Rvci5zdGFja1RyYWNlTGltaXQgPT09IFwibnVtYmVyXCI7XG59XG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKVxuICAgIHJldHVybiB0cnVlO1xuICByZXR1cm4gdHlwZW9mIHZhbC50b0RhdGVTdHJpbmcgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgdmFsLnNldERhdGUgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgbGV0IHR5cGVPZlZhbCA9IHR5cGVvZiB2YWw7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB0eXBlT2ZWYWwgPSBtaW5pS2luZE9mKHZhbCk7XG4gIH1cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLy8gc3JjL2NyZWF0ZVN0b3JlLnRzXG5mdW5jdGlvbiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSA6IGBFeHBlY3RlZCB0aGUgcm9vdCByZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YocmVkdWNlcil9J2ApO1xuICB9XG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZW5oYW5jZXIgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgZW5oYW5jZXIgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgYXJndW1lbnRzWzNdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgwKSA6IFwiSXQgbG9va3MgbGlrZSB5b3UgYXJlIHBhc3Npbmcgc2V2ZXJhbCBzdG9yZSBlbmhhbmNlcnMgdG8gY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gdG9nZXRoZXIgdG8gYSBzaW5nbGUgZnVuY3Rpb24uIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNjcmVhdGluZy1hLXN0b3JlLXdpdGgtZW5oYW5jZXJzIGZvciBhbiBleGFtcGxlLlwiKTtcbiAgfVxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGVuaGFuY2VyID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZW5oYW5jZXIgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgICBwcmVsb2FkZWRTdGF0ZSA9IHZvaWQgMDtcbiAgfVxuICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IGBFeHBlY3RlZCB0aGUgZW5oYW5jZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihlbmhhbmNlcil9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gZW5oYW5jZXIoY3JlYXRlU3RvcmUpKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgfVxuICBsZXQgY3VycmVudFJlZHVjZXIgPSByZWR1Y2VyO1xuICBsZXQgY3VycmVudFN0YXRlID0gcHJlbG9hZGVkU3RhdGU7XG4gIGxldCBjdXJyZW50TGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICBsZXQgbGlzdGVuZXJJZENvdW50ZXIgPSAwO1xuICBsZXQgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIGN1cnJlbnRMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIsIGtleSkgPT4ge1xuICAgICAgICBuZXh0TGlzdGVuZXJzLnNldChrZXksIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiBcIllvdSBtYXkgbm90IGNhbGwgc3RvcmUuZ2V0U3RhdGUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuIFRoZSByZWR1Y2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIHRoZSBzdGF0ZSBhcyBhbiBhcmd1bWVudC4gUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS5cIik7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH1cbiAgZnVuY3Rpb24gc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IGBFeHBlY3RlZCB0aGUgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihsaXN0ZW5lcil9J2ApO1xuICAgIH1cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNSkgOiBcIllvdSBtYXkgbm90IGNhbGwgc3RvcmUuc3Vic2NyaWJlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiBJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSBjb21wb25lbnQgYW5kIGludm9rZSBzdG9yZS5nZXRTdGF0ZSgpIGluIHRoZSBjYWxsYmFjayB0byBhY2Nlc3MgdGhlIGxhdGVzdCBzdGF0ZS4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLlwiKTtcbiAgICB9XG4gICAgbGV0IGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgIGNvbnN0IGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkQ291bnRlcisrO1xuICAgIG5leHRMaXN0ZW5lcnMuc2V0KGxpc3RlbmVySWQsIGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg2KSA6IFwiWW91IG1heSBub3QgdW5zdWJzY3JpYmUgZnJvbSBhIHN0b3JlIGxpc3RlbmVyIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLlwiKTtcbiAgICAgIH1cbiAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgICAgbmV4dExpc3RlbmVycy5kZWxldGUobGlzdGVuZXJJZCk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg3KSA6IGBBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJyR7a2luZE9mKGFjdGlvbil9Jy4gWW91IG1heSBuZWVkIHRvIGFkZCBtaWRkbGV3YXJlIHRvIHlvdXIgc3RvcmUgc2V0dXAgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIG90aGVyIHZhbHVlcywgc3VjaCBhcyAncmVkdXgtdGh1bmsnIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBmdW5jdGlvbnMuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNtaWRkbGV3YXJlIGFuZCBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNi1hc3luYy1sb2dpYyN1c2luZy10aGUtcmVkdXgtdGh1bmstbWlkZGxld2FyZSBmb3IgZXhhbXBsZXMuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDgpIDogJ0FjdGlvbnMgbWF5IG5vdCBoYXZlIGFuIHVuZGVmaW5lZCBcInR5cGVcIiBwcm9wZXJ0eS4gWW91IG1heSBoYXZlIG1pc3NwZWxsZWQgYW4gYWN0aW9uIHR5cGUgc3RyaW5nIGNvbnN0YW50LicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNykgOiBgQWN0aW9uIFwidHlwZVwiIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmcuIEluc3RlYWQsIHRoZSBhY3R1YWwgdHlwZSB3YXM6ICcke2tpbmRPZihhY3Rpb24udHlwZSl9Jy4gVmFsdWUgd2FzOiAnJHthY3Rpb24udHlwZX0nIChzdHJpbmdpZmllZClgKTtcbiAgICB9XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogXCJSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG4gICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH0pO1xuICAgIHJldHVybiBhY3Rpb247XG4gIH1cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEwKSA6IGBFeHBlY3RlZCB0aGUgbmV4dFJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihuZXh0UmVkdWNlcil9YCk7XG4gICAgfVxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5SRVBMQUNFXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICBjb25zdCBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbWluaW1hbCBvYnNlcnZhYmxlIHN1YnNjcmlwdGlvbiBtZXRob2QuXG4gICAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgQW55IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIG9ic2VydmVyLlxuICAgICAgICogVGhlIG9ic2VydmVyIG9iamVjdCBzaG91bGQgaGF2ZSBhIGBuZXh0YCBtZXRob2QuXG4gICAgICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhbiBgdW5zdWJzY3JpYmVgIG1ldGhvZCB0aGF0IGNhblxuICAgICAgICogYmUgdXNlZCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSBmcm9tIHRoZSBzdG9yZSwgYW5kIHByZXZlbnQgZnVydGhlclxuICAgICAgICogZW1pc3Npb24gb2YgdmFsdWVzIGZyb20gdGhlIG9ic2VydmFibGUuXG4gICAgICAgKi9cbiAgICAgIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSBcIm9iamVjdFwiIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTEpIDogYEV4cGVjdGVkIHRoZSBvYnNlcnZlciB0byBiZSBhbiBvYmplY3QuIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2Yob2JzZXJ2ZXIpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBc09ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgICAgICAgaWYgKG9ic2VydmVyQXNPYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlckFzT2JzZXJ2ZXIubmV4dChnZXRTdGF0ZSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gb3V0ZXJTdWJzY3JpYmUob2JzZXJ2ZVN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bnN1YnNjcmliZVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIFtzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0XSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBkaXNwYXRjaCh7XG4gICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUXG4gIH0pO1xuICBjb25zdCBzdG9yZSA9IHtcbiAgICBkaXNwYXRjaCxcbiAgICBzdWJzY3JpYmUsXG4gICAgZ2V0U3RhdGUsXG4gICAgcmVwbGFjZVJlZHVjZXIsXG4gICAgW3N5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHRdOiBvYnNlcnZhYmxlXG4gIH07XG4gIHJldHVybiBzdG9yZTtcbn1cbmZ1bmN0aW9uIGxlZ2FjeV9jcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgcmV0dXJuIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcik7XG59XG5cbi8vIHNyYy91dGlscy93YXJuaW5nLnRzXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIHRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cblxuLy8gc3JjL2NvbWJpbmVSZWR1Y2Vycy50c1xuZnVuY3Rpb24gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShpbnB1dFN0YXRlLCByZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpIHtcbiAgY29uc3QgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIGNvbnN0IGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUID8gXCJwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmVcIiA6IFwicHJldmlvdXMgc3RhdGUgcmVjZWl2ZWQgYnkgdGhlIHJlZHVjZXJcIjtcbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIlN0b3JlIGRvZXMgbm90IGhhdmUgYSB2YWxpZCByZWR1Y2VyLiBNYWtlIHN1cmUgdGhlIGFyZ3VtZW50IHBhc3NlZCB0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuXCI7XG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGlucHV0U3RhdGUpKSB7XG4gICAgcmV0dXJuIGBUaGUgJHthcmd1bWVudE5hbWV9IGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXCIke2tpbmRPZihpbnB1dFN0YXRlKX1cIi4gRXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzOiBcIiR7cmVkdWNlcktleXMuam9pbignXCIsIFwiJyl9XCJgO1xuICB9XG4gIGNvbnN0IHVuZXhwZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRTdGF0ZSkuZmlsdGVyKChrZXkpID0+ICFyZWR1Y2Vycy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICF1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSk7XG4gIHVuZXhwZWN0ZWRLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldID0gdHJ1ZTtcbiAgfSk7XG4gIGlmIChhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IGFjdGlvblR5cGVzX2RlZmF1bHQuUkVQTEFDRSlcbiAgICByZXR1cm47XG4gIGlmICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGBVbmV4cGVjdGVkICR7dW5leHBlY3RlZEtleXMubGVuZ3RoID4gMSA/IFwia2V5c1wiIDogXCJrZXlcIn0gXCIke3VuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpfVwiIGZvdW5kIGluICR7YXJndW1lbnROYW1lfS4gRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiR7cmVkdWNlcktleXMuam9pbignXCIsIFwiJyl9XCIuIFVuZXhwZWN0ZWQga2V5cyB3aWxsIGJlIGlnbm9yZWQuYDtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0UmVkdWNlclNoYXBlKHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUXG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEyKSA6IGBUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtrZXl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgeW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5QUk9CRV9VTktOT1dOX0FDVElPTigpXG4gICAgfSkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IGBUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtrZXl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gcHJvYmVkIHdpdGggYSByYW5kb20gdHlwZS4gRG9uJ3QgdHJ5IHRvIGhhbmRsZSAnJHthY3Rpb25UeXBlc19kZWZhdWx0LklOSVR9JyBvciBvdGhlciBhY3Rpb25zIGluIFwicmVkdXgvKlwiIG5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHVubGVzcyBpdCBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSBhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5gKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSB7XG4gIGNvbnN0IHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICBjb25zdCBmaW5hbFJlZHVjZXJzID0ge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgd2FybmluZyhgTm8gcmVkdWNlciBwcm92aWRlZCBmb3Iga2V5IFwiJHtrZXl9XCJgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIGNvbnN0IGZpbmFsUmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhmaW5hbFJlZHVjZXJzKTtcbiAgbGV0IHVuZXhwZWN0ZWRLZXlDYWNoZTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHt9O1xuICB9XG4gIGxldCBzaGFwZUFzc2VydGlvbkVycm9yO1xuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBjb21iaW5hdGlvbihzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPSBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKHN0YXRlLCBmaW5hbFJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSk7XG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgbmV4dFN0YXRlID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaW5hbFJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBmaW5hbFJlZHVjZXJLZXlzW2ldO1xuICAgICAgY29uc3QgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNba2V5XTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtrZXldO1xuICAgICAgY29uc3QgbmV4dFN0YXRlRm9yS2V5ID0gcmVkdWNlcihwcmV2aW91c1N0YXRlRm9yS2V5LCBhY3Rpb24pO1xuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uVHlwZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogYFdoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgJHthY3Rpb25UeXBlID8gYFwiJHtTdHJpbmcoYWN0aW9uVHlwZSl9XCJgIDogXCIodW5rbm93biB0eXBlKVwifSwgdGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7a2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZC4gVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBJZiB5b3Ugd2FudCB0aGlzIHJlZHVjZXIgdG8gaG9sZCBubyB2YWx1ZSwgeW91IGNhbiByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5gKTtcbiAgICAgIH1cbiAgICAgIG5leHRTdGF0ZVtrZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cbiAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBmaW5hbFJlZHVjZXJLZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoc3RhdGUpLmxlbmd0aDtcbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlO1xuICB9O1xufVxuXG4vLyBzcmMvYmluZEFjdGlvbkNyZWF0b3JzLnRzXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIHJldHVybiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9ycyhhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyAhPT0gXCJvYmplY3RcIiB8fCBhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSA6IGBiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnJHtraW5kT2YoYWN0aW9uQ3JlYXRvcnMpfScuIERpZCB5b3Ugd3JpdGUgXCJpbXBvcnQgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiIGluc3RlYWQgb2YgXCJpbXBvcnQgKiBhcyBBY3Rpb25DcmVhdG9ycyBmcm9tXCI/YCk7XG4gIH1cbiAgY29uc3QgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIGNvbnN0IGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufVxuXG4vLyBzcmMvY29tcG9zZS50c1xuZnVuY3Rpb24gY29tcG9zZSguLi5mdW5jcykge1xuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhcmcpID0+IGFyZztcbiAgfVxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZ1bmNzWzBdO1xuICB9XG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoKGEsIGIpID0+ICguLi5hcmdzKSA9PiBhKGIoLi4uYXJncykpKTtcbn1cblxuLy8gc3JjL2FwcGx5TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKC4uLm1pZGRsZXdhcmVzKSB7XG4gIHJldHVybiAoY3JlYXRlU3RvcmUyKSA9PiAocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlMihyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gICAgbGV0IGRpc3BhdGNoID0gKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTUpIDogXCJEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiBPdGhlciBtaWRkbGV3YXJlIHdvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIHRoaXMgZGlzcGF0Y2guXCIpO1xuICAgIH07XG4gICAgY29uc3QgbWlkZGxld2FyZUFQSSA9IHtcbiAgICAgIGdldFN0YXRlOiBzdG9yZS5nZXRTdGF0ZSxcbiAgICAgIGRpc3BhdGNoOiAoYWN0aW9uLCAuLi5hcmdzKSA9PiBkaXNwYXRjaChhY3Rpb24sIC4uLmFyZ3MpXG4gICAgfTtcbiAgICBjb25zdCBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcCgobWlkZGxld2FyZSkgPT4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKSk7XG4gICAgZGlzcGF0Y2ggPSBjb21wb3NlKC4uLmNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0b3JlLFxuICAgICAgZGlzcGF0Y2hcbiAgICB9O1xuICB9O1xufVxuXG4vLyBzcmMvdXRpbHMvaXNBY3Rpb24udHNcbmZ1bmN0aW9uIGlzQWN0aW9uKGFjdGlvbikge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdChhY3Rpb24pICYmIFwidHlwZVwiIGluIGFjdGlvbiAmJiB0eXBlb2YgYWN0aW9uLnR5cGUgPT09IFwic3RyaW5nXCI7XG59XG5leHBvcnQge1xuICBhY3Rpb25UeXBlc19kZWZhdWx0IGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsXG4gIGFwcGx5TWlkZGxld2FyZSxcbiAgYmluZEFjdGlvbkNyZWF0b3JzLFxuICBjb21iaW5lUmVkdWNlcnMsXG4gIGNvbXBvc2UsXG4gIGNyZWF0ZVN0b3JlLFxuICBpc0FjdGlvbixcbiAgaXNQbGFpbk9iamVjdCxcbiAgbGVnYWN5X2NyZWF0ZVN0b3JlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVkdXgubWpzLm1hcCIsIi8vIHNyYy9kZXZNb2RlQ2hlY2tzL2lkZW50aXR5RnVuY3Rpb25DaGVjay50c1xudmFyIHJ1bklkZW50aXR5RnVuY3Rpb25DaGVjayA9IChyZXN1bHRGdW5jLCBpbnB1dFNlbGVjdG9yc1Jlc3VsdHMsIG91dHB1dFNlbGVjdG9yUmVzdWx0KSA9PiB7XG4gIGlmIChpbnB1dFNlbGVjdG9yc1Jlc3VsdHMubGVuZ3RoID09PSAxICYmIGlucHV0U2VsZWN0b3JzUmVzdWx0c1swXSA9PT0gb3V0cHV0U2VsZWN0b3JSZXN1bHQpIHtcbiAgICBsZXQgaXNJbnB1dFNhbWVBc091dHB1dCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbXB0eU9iamVjdCA9IHt9O1xuICAgICAgaWYgKHJlc3VsdEZ1bmMoZW1wdHlPYmplY3QpID09PSBlbXB0eU9iamVjdClcbiAgICAgICAgaXNJbnB1dFNhbWVBc091dHB1dCA9IHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICAgIGlmIChpc0lucHV0U2FtZUFzT3V0cHV0KSB7XG4gICAgICBsZXQgc3RhY2sgPSB2b2lkIDA7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgO1xuICAgICAgICAoeyBzdGFjayB9ID0gZSk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiVGhlIHJlc3VsdCBmdW5jdGlvbiByZXR1cm5lZCBpdHMgb3duIGlucHV0cyB3aXRob3V0IG1vZGlmaWNhdGlvbi4gZS5nXFxuYGNyZWF0ZVNlbGVjdG9yKFtzdGF0ZSA9PiBzdGF0ZS50b2Rvc10sIHRvZG9zID0+IHRvZG9zKWBcXG5UaGlzIGNvdWxkIGxlYWQgdG8gaW5lZmZpY2llbnQgbWVtb2l6YXRpb24gYW5kIHVubmVjZXNzYXJ5IHJlLXJlbmRlcnMuXFxuRW5zdXJlIHRyYW5zZm9ybWF0aW9uIGxvZ2ljIGlzIGluIHRoZSByZXN1bHQgZnVuY3Rpb24sIGFuZCBleHRyYWN0aW9uIGxvZ2ljIGlzIGluIHRoZSBpbnB1dCBzZWxlY3RvcnMuXCIsXG4gICAgICAgIHsgc3RhY2sgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIHNyYy9kZXZNb2RlQ2hlY2tzL2lucHV0U3RhYmlsaXR5Q2hlY2sudHNcbnZhciBydW5JbnB1dFN0YWJpbGl0eUNoZWNrID0gKGlucHV0U2VsZWN0b3JSZXN1bHRzT2JqZWN0LCBvcHRpb25zLCBpbnB1dFNlbGVjdG9yQXJncykgPT4ge1xuICBjb25zdCB7IG1lbW9pemUsIG1lbW9pemVPcHRpb25zIH0gPSBvcHRpb25zO1xuICBjb25zdCB7IGlucHV0U2VsZWN0b3JSZXN1bHRzLCBpbnB1dFNlbGVjdG9yUmVzdWx0c0NvcHkgfSA9IGlucHV0U2VsZWN0b3JSZXN1bHRzT2JqZWN0O1xuICBjb25zdCBjcmVhdGVBbkVtcHR5T2JqZWN0ID0gbWVtb2l6ZSgoKSA9PiAoe30pLCAuLi5tZW1vaXplT3B0aW9ucyk7XG4gIGNvbnN0IGFyZUlucHV0U2VsZWN0b3JSZXN1bHRzRXF1YWwgPSBjcmVhdGVBbkVtcHR5T2JqZWN0LmFwcGx5KG51bGwsIGlucHV0U2VsZWN0b3JSZXN1bHRzKSA9PT0gY3JlYXRlQW5FbXB0eU9iamVjdC5hcHBseShudWxsLCBpbnB1dFNlbGVjdG9yUmVzdWx0c0NvcHkpO1xuICBpZiAoIWFyZUlucHV0U2VsZWN0b3JSZXN1bHRzRXF1YWwpIHtcbiAgICBsZXQgc3RhY2sgPSB2b2lkIDA7XG4gICAgdHJ5IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIDtcbiAgICAgICh7IHN0YWNrIH0gPSBlKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJBbiBpbnB1dCBzZWxlY3RvciByZXR1cm5lZCBhIGRpZmZlcmVudCByZXN1bHQgd2hlbiBwYXNzZWQgc2FtZSBhcmd1bWVudHMuXFxuVGhpcyBtZWFucyB5b3VyIG91dHB1dCBzZWxlY3RvciB3aWxsIGxpa2VseSBydW4gbW9yZSBmcmVxdWVudGx5IHRoYW4gaW50ZW5kZWQuXFxuQXZvaWQgcmV0dXJuaW5nIGEgbmV3IHJlZmVyZW5jZSBpbnNpZGUgeW91ciBpbnB1dCBzZWxlY3RvciwgZS5nLlxcbmBjcmVhdGVTZWxlY3Rvcihbc3RhdGUgPT4gc3RhdGUudG9kb3MubWFwKHRvZG8gPT4gdG9kby5pZCldLCB0b2RvSWRzID0+IHRvZG9JZHMubGVuZ3RoKWBcIixcbiAgICAgIHtcbiAgICAgICAgYXJndW1lbnRzOiBpbnB1dFNlbGVjdG9yQXJncyxcbiAgICAgICAgZmlyc3RJbnB1dHM6IGlucHV0U2VsZWN0b3JSZXN1bHRzLFxuICAgICAgICBzZWNvbmRJbnB1dHM6IGlucHV0U2VsZWN0b3JSZXN1bHRzQ29weSxcbiAgICAgICAgc3RhY2tcbiAgICAgIH1cbiAgICApO1xuICB9XG59O1xuXG4vLyBzcmMvZGV2TW9kZUNoZWNrcy9zZXRHbG9iYWxEZXZNb2RlQ2hlY2tzLnRzXG52YXIgZ2xvYmFsRGV2TW9kZUNoZWNrcyA9IHtcbiAgaW5wdXRTdGFiaWxpdHlDaGVjazogXCJvbmNlXCIsXG4gIGlkZW50aXR5RnVuY3Rpb25DaGVjazogXCJvbmNlXCJcbn07XG52YXIgc2V0R2xvYmFsRGV2TW9kZUNoZWNrcyA9IChkZXZNb2RlQ2hlY2tzKSA9PiB7XG4gIE9iamVjdC5hc3NpZ24oZ2xvYmFsRGV2TW9kZUNoZWNrcywgZGV2TW9kZUNoZWNrcyk7XG59O1xuXG4vLyBzcmMvdXRpbHMudHNcbnZhciBOT1RfRk9VTkQgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKFwiTk9UX0ZPVU5EXCIpO1xuZnVuY3Rpb24gYXNzZXJ0SXNGdW5jdGlvbihmdW5jLCBlcnJvck1lc3NhZ2UgPSBgZXhwZWN0ZWQgYSBmdW5jdGlvbiwgaW5zdGVhZCByZWNlaXZlZCAke3R5cGVvZiBmdW5jfWApIHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVycm9yTWVzc2FnZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydElzT2JqZWN0KG9iamVjdCwgZXJyb3JNZXNzYWdlID0gYGV4cGVjdGVkIGFuIG9iamVjdCwgaW5zdGVhZCByZWNlaXZlZCAke3R5cGVvZiBvYmplY3R9YCkge1xuICBpZiAodHlwZW9mIG9iamVjdCAhPT0gXCJvYmplY3RcIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0SXNBcnJheU9mRnVuY3Rpb25zKGFycmF5LCBlcnJvck1lc3NhZ2UgPSBgZXhwZWN0ZWQgYWxsIGl0ZW1zIHRvIGJlIGZ1bmN0aW9ucywgaW5zdGVhZCByZWNlaXZlZCB0aGUgZm9sbG93aW5nIHR5cGVzOiBgKSB7XG4gIGlmICghYXJyYXkuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgY29uc3QgaXRlbVR5cGVzID0gYXJyYXkubWFwKFxuICAgICAgKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcImZ1bmN0aW9uXCIgPyBgZnVuY3Rpb24gJHtpdGVtLm5hbWUgfHwgXCJ1bm5hbWVkXCJ9KClgIDogdHlwZW9mIGl0ZW1cbiAgICApLmpvaW4oXCIsIFwiKTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2Vycm9yTWVzc2FnZX1bJHtpdGVtVHlwZXN9XWApO1xuICB9XG59XG52YXIgZW5zdXJlSXNBcnJheSA9IChpdGVtKSA9PiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGl0ZW0pID8gaXRlbSA6IFtpdGVtXTtcbn07XG5mdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMoY3JlYXRlU2VsZWN0b3JBcmdzKSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IEFycmF5LmlzQXJyYXkoY3JlYXRlU2VsZWN0b3JBcmdzWzBdKSA/IGNyZWF0ZVNlbGVjdG9yQXJnc1swXSA6IGNyZWF0ZVNlbGVjdG9yQXJncztcbiAgYXNzZXJ0SXNBcnJheU9mRnVuY3Rpb25zKFxuICAgIGRlcGVuZGVuY2llcyxcbiAgICBgY3JlYXRlU2VsZWN0b3IgZXhwZWN0cyBhbGwgaW5wdXQtc2VsZWN0b3JzIHRvIGJlIGZ1bmN0aW9ucywgYnV0IHJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgdHlwZXM6IGBcbiAgKTtcbiAgcmV0dXJuIGRlcGVuZGVuY2llcztcbn1cbmZ1bmN0aW9uIGNvbGxlY3RJbnB1dFNlbGVjdG9yUmVzdWx0cyhkZXBlbmRlbmNpZXMsIGlucHV0U2VsZWN0b3JBcmdzKSB7XG4gIGNvbnN0IGlucHV0U2VsZWN0b3JSZXN1bHRzID0gW107XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBkZXBlbmRlbmNpZXM7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpbnB1dFNlbGVjdG9yUmVzdWx0cy5wdXNoKGRlcGVuZGVuY2llc1tpXS5hcHBseShudWxsLCBpbnB1dFNlbGVjdG9yQXJncykpO1xuICB9XG4gIHJldHVybiBpbnB1dFNlbGVjdG9yUmVzdWx0cztcbn1cbnZhciBnZXREZXZNb2RlQ2hlY2tzRXhlY3V0aW9uSW5mbyA9IChmaXJzdFJ1biwgZGV2TW9kZUNoZWNrcykgPT4ge1xuICBjb25zdCB7IGlkZW50aXR5RnVuY3Rpb25DaGVjaywgaW5wdXRTdGFiaWxpdHlDaGVjayB9ID0ge1xuICAgIC4uLmdsb2JhbERldk1vZGVDaGVja3MsXG4gICAgLi4uZGV2TW9kZUNoZWNrc1xuICB9O1xuICByZXR1cm4ge1xuICAgIGlkZW50aXR5RnVuY3Rpb25DaGVjazoge1xuICAgICAgc2hvdWxkUnVuOiBpZGVudGl0eUZ1bmN0aW9uQ2hlY2sgPT09IFwiYWx3YXlzXCIgfHwgaWRlbnRpdHlGdW5jdGlvbkNoZWNrID09PSBcIm9uY2VcIiAmJiBmaXJzdFJ1bixcbiAgICAgIHJ1bjogcnVuSWRlbnRpdHlGdW5jdGlvbkNoZWNrXG4gICAgfSxcbiAgICBpbnB1dFN0YWJpbGl0eUNoZWNrOiB7XG4gICAgICBzaG91bGRSdW46IGlucHV0U3RhYmlsaXR5Q2hlY2sgPT09IFwiYWx3YXlzXCIgfHwgaW5wdXRTdGFiaWxpdHlDaGVjayA9PT0gXCJvbmNlXCIgJiYgZmlyc3RSdW4sXG4gICAgICBydW46IHJ1bklucHV0U3RhYmlsaXR5Q2hlY2tcbiAgICB9XG4gIH07XG59O1xuXG4vLyBzcmMvYXV0b3RyYWNrTWVtb2l6ZS9hdXRvdHJhY2tpbmcudHNcbnZhciAkUkVWSVNJT04gPSAwO1xudmFyIENVUlJFTlRfVFJBQ0tFUiA9IG51bGw7XG52YXIgQ2VsbCA9IGNsYXNzIHtcbiAgcmV2aXNpb24gPSAkUkVWSVNJT047XG4gIF92YWx1ZTtcbiAgX2xhc3RWYWx1ZTtcbiAgX2lzRXF1YWwgPSB0cmlwbGVFcTtcbiAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlLCBpc0VxdWFsID0gdHJpcGxlRXEpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2xhc3RWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB0aGlzLl9pc0VxdWFsID0gaXNFcXVhbDtcbiAgfVxuICAvLyBXaGVuZXZlciBhIHN0b3JhZ2UgdmFsdWUgaXMgcmVhZCwgaXQnbGwgYWRkIGl0c2VsZiB0byB0aGUgY3VycmVudCB0cmFja2VyIGlmXG4gIC8vIG9uZSBleGlzdHMsIGVudGFuZ2xpbmcgaXRzIHN0YXRlIHdpdGggdGhhdCBjYWNoZS5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIENVUlJFTlRfVFJBQ0tFUj8uYWRkKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICAvLyBXaGVuZXZlciBhIHN0b3JhZ2UgdmFsdWUgaXMgdXBkYXRlZCwgd2UgYnVtcCB0aGUgZ2xvYmFsIHJldmlzaW9uIGNsb2NrLFxuICAvLyBhc3NpZ24gdGhlIHJldmlzaW9uIGZvciB0aGlzIHN0b3JhZ2UgdG8gdGhlIG5ldyB2YWx1ZSwgX2FuZF8gd2Ugc2NoZWR1bGUgYVxuICAvLyByZXJlbmRlci4gVGhpcyBpcyBpbXBvcnRhbnQsIGFuZCBpdCdzIHdoYXQgbWFrZXMgYXV0b3RyYWNraW5nICBfcHVsbF9cbiAgLy8gYmFzZWQuIFdlIGRvbid0IGFjdGl2ZWx5IHRlbGwgdGhlIGNhY2hlcyB3aGljaCBkZXBlbmQgb24gdGhlIHN0b3JhZ2UgdGhhdFxuICAvLyBhbnl0aGluZyBoYXMgaGFwcGVuZWQuIEluc3RlYWQsIHdlIHJlY29tcHV0ZSB0aGUgY2FjaGVzIHdoZW4gbmVlZGVkLlxuICBzZXQgdmFsdWUobmV3VmFsdWUpIHtcbiAgICBpZiAodGhpcy52YWx1ZSA9PT0gbmV3VmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnJldmlzaW9uID0gKyskUkVWSVNJT047XG4gIH1cbn07XG5mdW5jdGlvbiB0cmlwbGVFcShhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufVxudmFyIFRyYWNraW5nQ2FjaGUgPSBjbGFzcyB7XG4gIF9jYWNoZWRWYWx1ZTtcbiAgX2NhY2hlZFJldmlzaW9uID0gLTE7XG4gIF9kZXBzID0gW107XG4gIGhpdHMgPSAwO1xuICBmbjtcbiAgY29uc3RydWN0b3IoZm4pIHtcbiAgICB0aGlzLmZuID0gZm47XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5fY2FjaGVkVmFsdWUgPSB2b2lkIDA7XG4gICAgdGhpcy5fY2FjaGVkUmV2aXNpb24gPSAtMTtcbiAgICB0aGlzLl9kZXBzID0gW107XG4gICAgdGhpcy5oaXRzID0gMDtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgaWYgKHRoaXMucmV2aXNpb24gPiB0aGlzLl9jYWNoZWRSZXZpc2lvbikge1xuICAgICAgY29uc3QgeyBmbiB9ID0gdGhpcztcbiAgICAgIGNvbnN0IGN1cnJlbnRUcmFja2VyID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IHByZXZUcmFja2VyID0gQ1VSUkVOVF9UUkFDS0VSO1xuICAgICAgQ1VSUkVOVF9UUkFDS0VSID0gY3VycmVudFRyYWNrZXI7XG4gICAgICB0aGlzLl9jYWNoZWRWYWx1ZSA9IGZuKCk7XG4gICAgICBDVVJSRU5UX1RSQUNLRVIgPSBwcmV2VHJhY2tlcjtcbiAgICAgIHRoaXMuaGl0cysrO1xuICAgICAgdGhpcy5fZGVwcyA9IEFycmF5LmZyb20oY3VycmVudFRyYWNrZXIpO1xuICAgICAgdGhpcy5fY2FjaGVkUmV2aXNpb24gPSB0aGlzLnJldmlzaW9uO1xuICAgIH1cbiAgICBDVVJSRU5UX1RSQUNLRVI/LmFkZCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkVmFsdWU7XG4gIH1cbiAgZ2V0IHJldmlzaW9uKCkge1xuICAgIHJldHVybiBNYXRoLm1heCguLi50aGlzLl9kZXBzLm1hcCgoZCkgPT4gZC5yZXZpc2lvbiksIDApO1xuICB9XG59O1xuZnVuY3Rpb24gZ2V0VmFsdWUoY2VsbCkge1xuICBpZiAoIShjZWxsIGluc3RhbmNlb2YgQ2VsbCkpIHtcbiAgICBjb25zb2xlLndhcm4oXCJOb3QgYSB2YWxpZCBjZWxsISBcIiwgY2VsbCk7XG4gIH1cbiAgcmV0dXJuIGNlbGwudmFsdWU7XG59XG5mdW5jdGlvbiBzZXRWYWx1ZShzdG9yYWdlLCB2YWx1ZSkge1xuICBpZiAoIShzdG9yYWdlIGluc3RhbmNlb2YgQ2VsbCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJzZXRWYWx1ZSBtdXN0IGJlIHBhc3NlZCBhIHRyYWNrZWQgc3RvcmUgY3JlYXRlZCB3aXRoIGBjcmVhdGVTdG9yYWdlYC5cIlxuICAgICk7XG4gIH1cbiAgc3RvcmFnZS52YWx1ZSA9IHN0b3JhZ2UuX2xhc3RWYWx1ZSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2VsbChpbml0aWFsVmFsdWUsIGlzRXF1YWwgPSB0cmlwbGVFcSkge1xuICByZXR1cm4gbmV3IENlbGwoaW5pdGlhbFZhbHVlLCBpc0VxdWFsKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKGZuKSB7XG4gIGFzc2VydElzRnVuY3Rpb24oXG4gICAgZm4sXG4gICAgXCJ0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIGBjcmVhdGVDYWNoZWAgbXVzdCBiZSBhIGZ1bmN0aW9uXCJcbiAgKTtcbiAgcmV0dXJuIG5ldyBUcmFja2luZ0NhY2hlKGZuKTtcbn1cblxuLy8gc3JjL2F1dG90cmFja01lbW9pemUvdHJhY2tpbmcudHNcbnZhciBuZXZlckVxID0gKGEsIGIpID0+IGZhbHNlO1xuZnVuY3Rpb24gY3JlYXRlVGFnKCkge1xuICByZXR1cm4gY3JlYXRlQ2VsbChudWxsLCBuZXZlckVxKTtcbn1cbmZ1bmN0aW9uIGRpcnR5VGFnKHRhZywgdmFsdWUpIHtcbiAgc2V0VmFsdWUodGFnLCB2YWx1ZSk7XG59XG52YXIgY29uc3VtZUNvbGxlY3Rpb24gPSAobm9kZSkgPT4ge1xuICBsZXQgdGFnID0gbm9kZS5jb2xsZWN0aW9uVGFnO1xuICBpZiAodGFnID09PSBudWxsKSB7XG4gICAgdGFnID0gbm9kZS5jb2xsZWN0aW9uVGFnID0gY3JlYXRlVGFnKCk7XG4gIH1cbiAgZ2V0VmFsdWUodGFnKTtcbn07XG52YXIgZGlydHlDb2xsZWN0aW9uID0gKG5vZGUpID0+IHtcbiAgY29uc3QgdGFnID0gbm9kZS5jb2xsZWN0aW9uVGFnO1xuICBpZiAodGFnICE9PSBudWxsKSB7XG4gICAgZGlydHlUYWcodGFnLCBudWxsKTtcbiAgfVxufTtcblxuLy8gc3JjL2F1dG90cmFja01lbW9pemUvcHJveHkudHNcbnZhciBSRURVWF9QUk9YWV9MQUJFTCA9IFN5bWJvbCgpO1xudmFyIG5leHRJZCA9IDA7XG52YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoe30pO1xudmFyIE9iamVjdFRyZWVOb2RlID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy50YWcudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwcm94eSA9IG5ldyBQcm94eSh0aGlzLCBvYmplY3RQcm94eUhhbmRsZXIpO1xuICB0YWcgPSBjcmVhdGVUYWcoKTtcbiAgdGFncyA9IHt9O1xuICBjaGlsZHJlbiA9IHt9O1xuICBjb2xsZWN0aW9uVGFnID0gbnVsbDtcbiAgaWQgPSBuZXh0SWQrKztcbn07XG52YXIgb2JqZWN0UHJveHlIYW5kbGVyID0ge1xuICBnZXQobm9kZSwga2V5KSB7XG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlUmVzdWx0KCkge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gbm9kZTtcbiAgICAgIGNvbnN0IGNoaWxkVmFsdWUgPSBSZWZsZWN0LmdldCh2YWx1ZSwga2V5KTtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgIHJldHVybiBjaGlsZFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGtleSBpbiBwcm90bykge1xuICAgICAgICByZXR1cm4gY2hpbGRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBjaGlsZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGxldCBjaGlsZE5vZGUgPSBub2RlLmNoaWxkcmVuW2tleV07XG4gICAgICAgIGlmIChjaGlsZE5vZGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGNoaWxkTm9kZSA9IG5vZGUuY2hpbGRyZW5ba2V5XSA9IGNyZWF0ZU5vZGUoY2hpbGRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkTm9kZS50YWcpIHtcbiAgICAgICAgICBnZXRWYWx1ZShjaGlsZE5vZGUudGFnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGROb2RlLnByb3h5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHRhZyA9IG5vZGUudGFnc1trZXldO1xuICAgICAgICBpZiAodGFnID09PSB2b2lkIDApIHtcbiAgICAgICAgICB0YWcgPSBub2RlLnRhZ3Nba2V5XSA9IGNyZWF0ZVRhZygpO1xuICAgICAgICAgIHRhZy52YWx1ZSA9IGNoaWxkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0VmFsdWUodGFnKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGNhbGN1bGF0ZVJlc3VsdCgpO1xuICAgIHJldHVybiByZXM7XG4gIH0sXG4gIG93bktleXMobm9kZSkge1xuICAgIGNvbnN1bWVDb2xsZWN0aW9uKG5vZGUpO1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMobm9kZS52YWx1ZSk7XG4gIH0sXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLCBwcm9wKSB7XG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUudmFsdWUsIHByb3ApO1xuICB9LFxuICBoYXMobm9kZSwgcHJvcCkge1xuICAgIHJldHVybiBSZWZsZWN0Lmhhcyhub2RlLnZhbHVlLCBwcm9wKTtcbiAgfVxufTtcbnZhciBBcnJheVRyZWVOb2RlID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy50YWcudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwcm94eSA9IG5ldyBQcm94eShbdGhpc10sIGFycmF5UHJveHlIYW5kbGVyKTtcbiAgdGFnID0gY3JlYXRlVGFnKCk7XG4gIHRhZ3MgPSB7fTtcbiAgY2hpbGRyZW4gPSB7fTtcbiAgY29sbGVjdGlvblRhZyA9IG51bGw7XG4gIGlkID0gbmV4dElkKys7XG59O1xudmFyIGFycmF5UHJveHlIYW5kbGVyID0ge1xuICBnZXQoW25vZGVdLCBrZXkpIHtcbiAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICBjb25zdW1lQ29sbGVjdGlvbihub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdFByb3h5SGFuZGxlci5nZXQobm9kZSwga2V5KTtcbiAgfSxcbiAgb3duS2V5cyhbbm9kZV0pIHtcbiAgICByZXR1cm4gb2JqZWN0UHJveHlIYW5kbGVyLm93bktleXMobm9kZSk7XG4gIH0sXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihbbm9kZV0sIHByb3ApIHtcbiAgICByZXR1cm4gb2JqZWN0UHJveHlIYW5kbGVyLmdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLCBwcm9wKTtcbiAgfSxcbiAgaGFzKFtub2RlXSwgcHJvcCkge1xuICAgIHJldHVybiBvYmplY3RQcm94eUhhbmRsZXIuaGFzKG5vZGUsIHByb3ApO1xuICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlTm9kZSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5VHJlZU5vZGUodmFsdWUpO1xuICB9XG4gIHJldHVybiBuZXcgT2JqZWN0VHJlZU5vZGUodmFsdWUpO1xufVxuZnVuY3Rpb24gdXBkYXRlTm9kZShub2RlLCBuZXdWYWx1ZSkge1xuICBjb25zdCB7IHZhbHVlLCB0YWdzLCBjaGlsZHJlbiB9ID0gbm9kZTtcbiAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkgJiYgdmFsdWUubGVuZ3RoICE9PSBuZXdWYWx1ZS5sZW5ndGgpIHtcbiAgICBkaXJ0eUNvbGxlY3Rpb24obm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgbGV0IG9sZEtleXNTaXplID0gMDtcbiAgICAgIGxldCBuZXdLZXlzU2l6ZSA9IDA7XG4gICAgICBsZXQgYW55S2V5c0FkZGVkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IF9rZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgb2xkS2V5c1NpemUrKztcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG5ld1ZhbHVlKSB7XG4gICAgICAgIG5ld0tleXNTaXplKys7XG4gICAgICAgIGlmICghKGtleSBpbiB2YWx1ZSkpIHtcbiAgICAgICAgICBhbnlLZXlzQWRkZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBpc0RpZmZlcmVudCA9IGFueUtleXNBZGRlZCB8fCBvbGRLZXlzU2l6ZSAhPT0gbmV3S2V5c1NpemU7XG4gICAgICBpZiAoaXNEaWZmZXJlbnQpIHtcbiAgICAgICAgZGlydHlDb2xsZWN0aW9uKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiB0YWdzKSB7XG4gICAgY29uc3QgY2hpbGRWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgY29uc3QgbmV3Q2hpbGRWYWx1ZSA9IG5ld1ZhbHVlW2tleV07XG4gICAgaWYgKGNoaWxkVmFsdWUgIT09IG5ld0NoaWxkVmFsdWUpIHtcbiAgICAgIGRpcnR5Q29sbGVjdGlvbihub2RlKTtcbiAgICAgIGRpcnR5VGFnKHRhZ3Nba2V5XSwgbmV3Q2hpbGRWYWx1ZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBuZXdDaGlsZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICBkZWxldGUgdGFnc1trZXldO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBjaGlsZHJlbikge1xuICAgIGNvbnN0IGNoaWxkTm9kZSA9IGNoaWxkcmVuW2tleV07XG4gICAgY29uc3QgbmV3Q2hpbGRWYWx1ZSA9IG5ld1ZhbHVlW2tleV07XG4gICAgY29uc3QgY2hpbGRWYWx1ZSA9IGNoaWxkTm9kZS52YWx1ZTtcbiAgICBpZiAoY2hpbGRWYWx1ZSA9PT0gbmV3Q2hpbGRWYWx1ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmV3Q2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBuZXdDaGlsZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICB1cGRhdGVOb2RlKGNoaWxkTm9kZSwgbmV3Q2hpbGRWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZU5vZGUoY2hpbGROb2RlKTtcbiAgICAgIGRlbGV0ZSBjaGlsZHJlbltrZXldO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGVsZXRlTm9kZShub2RlKSB7XG4gIGlmIChub2RlLnRhZykge1xuICAgIGRpcnR5VGFnKG5vZGUudGFnLCBudWxsKTtcbiAgfVxuICBkaXJ0eUNvbGxlY3Rpb24obm9kZSk7XG4gIGZvciAoY29uc3Qga2V5IGluIG5vZGUudGFncykge1xuICAgIGRpcnR5VGFnKG5vZGUudGFnc1trZXldLCBudWxsKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBub2RlLmNoaWxkcmVuKSB7XG4gICAgZGVsZXRlTm9kZShub2RlLmNoaWxkcmVuW2tleV0pO1xuICB9XG59XG5cbi8vIHNyYy9scnVNZW1vaXplLnRzXG5mdW5jdGlvbiBjcmVhdGVTaW5nbGV0b25DYWNoZShlcXVhbHMpIHtcbiAgbGV0IGVudHJ5O1xuICByZXR1cm4ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIGlmIChlbnRyeSAmJiBlcXVhbHMoZW50cnkua2V5LCBrZXkpKSB7XG4gICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBOT1RfRk9VTkQ7XG4gICAgfSxcbiAgICBwdXQoa2V5LCB2YWx1ZSkge1xuICAgICAgZW50cnkgPSB7IGtleSwgdmFsdWUgfTtcbiAgICB9LFxuICAgIGdldEVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gZW50cnkgPyBbZW50cnldIDogW107XG4gICAgfSxcbiAgICBjbGVhcigpIHtcbiAgICAgIGVudHJ5ID0gdm9pZCAwO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxydUNhY2hlKG1heFNpemUsIGVxdWFscykge1xuICBsZXQgZW50cmllcyA9IFtdO1xuICBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgY29uc3QgY2FjaGVJbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZXF1YWxzKGtleSwgZW50cnkua2V5KSk7XG4gICAgaWYgKGNhY2hlSW5kZXggPiAtMSkge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2NhY2hlSW5kZXhdO1xuICAgICAgaWYgKGNhY2hlSW5kZXggPiAwKSB7XG4gICAgICAgIGVudHJpZXMuc3BsaWNlKGNhY2hlSW5kZXgsIDEpO1xuICAgICAgICBlbnRyaWVzLnVuc2hpZnQoZW50cnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gTk9UX0ZPVU5EO1xuICB9XG4gIGZ1bmN0aW9uIHB1dChrZXksIHZhbHVlKSB7XG4gICAgaWYgKGdldChrZXkpID09PSBOT1RfRk9VTkQpIHtcbiAgICAgIGVudHJpZXMudW5zaGlmdCh7IGtleSwgdmFsdWUgfSk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiBtYXhTaXplKSB7XG4gICAgICAgIGVudHJpZXMucG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdldEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZW50cmllcyA9IFtdO1xuICB9XG4gIHJldHVybiB7IGdldCwgcHV0LCBnZXRFbnRyaWVzLCBjbGVhciB9O1xufVxudmFyIHJlZmVyZW5jZUVxdWFsaXR5Q2hlY2sgPSAoYSwgYikgPT4gYSA9PT0gYjtcbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlS2V5Q29tcGFyYXRvcihlcXVhbGl0eUNoZWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiBhcmVBcmd1bWVudHNTaGFsbG93bHlFcXVhbChwcmV2LCBuZXh0KSB7XG4gICAgaWYgKHByZXYgPT09IG51bGwgfHwgbmV4dCA9PT0gbnVsbCB8fCBwcmV2Lmxlbmd0aCAhPT0gbmV4dC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IHByZXY7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFlcXVhbGl0eUNoZWNrKHByZXZbaV0sIG5leHRbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5mdW5jdGlvbiBscnVNZW1vaXplKGZ1bmMsIGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMpIHtcbiAgY29uc3QgcHJvdmlkZWRPcHRpb25zID0gdHlwZW9mIGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMgPT09IFwib2JqZWN0XCIgPyBlcXVhbGl0eUNoZWNrT3JPcHRpb25zIDogeyBlcXVhbGl0eUNoZWNrOiBlcXVhbGl0eUNoZWNrT3JPcHRpb25zIH07XG4gIGNvbnN0IHtcbiAgICBlcXVhbGl0eUNoZWNrID0gcmVmZXJlbmNlRXF1YWxpdHlDaGVjayxcbiAgICBtYXhTaXplID0gMSxcbiAgICByZXN1bHRFcXVhbGl0eUNoZWNrXG4gIH0gPSBwcm92aWRlZE9wdGlvbnM7XG4gIGNvbnN0IGNvbXBhcmF0b3IgPSBjcmVhdGVDYWNoZUtleUNvbXBhcmF0b3IoZXF1YWxpdHlDaGVjayk7XG4gIGxldCByZXN1bHRzQ291bnQgPSAwO1xuICBjb25zdCBjYWNoZSA9IG1heFNpemUgPD0gMSA/IGNyZWF0ZVNpbmdsZXRvbkNhY2hlKGNvbXBhcmF0b3IpIDogY3JlYXRlTHJ1Q2FjaGUobWF4U2l6ZSwgY29tcGFyYXRvcik7XG4gIGZ1bmN0aW9uIG1lbW9pemVkKCkge1xuICAgIGxldCB2YWx1ZSA9IGNhY2hlLmdldChhcmd1bWVudHMpO1xuICAgIGlmICh2YWx1ZSA9PT0gTk9UX0ZPVU5EKSB7XG4gICAgICB2YWx1ZSA9IGZ1bmMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgIHJlc3VsdHNDb3VudCsrO1xuICAgICAgaWYgKHJlc3VsdEVxdWFsaXR5Q2hlY2spIHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGNhY2hlLmdldEVudHJpZXMoKTtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdFbnRyeSA9IGVudHJpZXMuZmluZChcbiAgICAgICAgICAoZW50cnkpID0+IHJlc3VsdEVxdWFsaXR5Q2hlY2soZW50cnkudmFsdWUsIHZhbHVlKVxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2hpbmdFbnRyeSkge1xuICAgICAgICAgIHZhbHVlID0gbWF0Y2hpbmdFbnRyeS52YWx1ZTtcbiAgICAgICAgICByZXN1bHRzQ291bnQgIT09IDAgJiYgcmVzdWx0c0NvdW50LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhY2hlLnB1dChhcmd1bWVudHMsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIG1lbW9pemVkLmNsZWFyQ2FjaGUgPSAoKSA9PiB7XG4gICAgY2FjaGUuY2xlYXIoKTtcbiAgICBtZW1vaXplZC5yZXNldFJlc3VsdHNDb3VudCgpO1xuICB9O1xuICBtZW1vaXplZC5yZXN1bHRzQ291bnQgPSAoKSA9PiByZXN1bHRzQ291bnQ7XG4gIG1lbW9pemVkLnJlc2V0UmVzdWx0c0NvdW50ID0gKCkgPT4ge1xuICAgIHJlc3VsdHNDb3VudCA9IDA7XG4gIH07XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gc3JjL2F1dG90cmFja01lbW9pemUvYXV0b3RyYWNrTWVtb2l6ZS50c1xuZnVuY3Rpb24gYXV0b3RyYWNrTWVtb2l6ZShmdW5jKSB7XG4gIGNvbnN0IG5vZGUgPSBjcmVhdGVOb2RlKFxuICAgIFtdXG4gICk7XG4gIGxldCBsYXN0QXJncyA9IG51bGw7XG4gIGNvbnN0IHNoYWxsb3dFcXVhbCA9IGNyZWF0ZUNhY2hlS2V5Q29tcGFyYXRvcihyZWZlcmVuY2VFcXVhbGl0eUNoZWNrKTtcbiAgY29uc3QgY2FjaGUgPSBjcmVhdGVDYWNoZSgoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gZnVuYy5hcHBseShudWxsLCBub2RlLnByb3h5KTtcbiAgICByZXR1cm4gcmVzO1xuICB9KTtcbiAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7XG4gICAgaWYgKCFzaGFsbG93RXF1YWwobGFzdEFyZ3MsIGFyZ3VtZW50cykpIHtcbiAgICAgIHVwZGF0ZU5vZGUobm9kZSwgYXJndW1lbnRzKTtcbiAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGUudmFsdWU7XG4gIH1cbiAgbWVtb2l6ZWQuY2xlYXJDYWNoZSA9ICgpID0+IHtcbiAgICByZXR1cm4gY2FjaGUuY2xlYXIoKTtcbiAgfTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBzcmMvd2Vha01hcE1lbW9pemUudHNcbnZhciBTdHJvbmdSZWYgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIGRlcmVmKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG59O1xudmFyIFJlZiA9IHR5cGVvZiBXZWFrUmVmICE9PSBcInVuZGVmaW5lZFwiID8gV2Vha1JlZiA6IFN0cm9uZ1JlZjtcbnZhciBVTlRFUk1JTkFURUQgPSAwO1xudmFyIFRFUk1JTkFURUQgPSAxO1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGVOb2RlKCkge1xuICByZXR1cm4ge1xuICAgIHM6IFVOVEVSTUlOQVRFRCxcbiAgICB2OiB2b2lkIDAsXG4gICAgbzogbnVsbCxcbiAgICBwOiBudWxsXG4gIH07XG59XG5mdW5jdGlvbiB3ZWFrTWFwTWVtb2l6ZShmdW5jLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGZuTm9kZSA9IGNyZWF0ZUNhY2hlTm9kZSgpO1xuICBjb25zdCB7IHJlc3VsdEVxdWFsaXR5Q2hlY2sgfSA9IG9wdGlvbnM7XG4gIGxldCBsYXN0UmVzdWx0O1xuICBsZXQgcmVzdWx0c0NvdW50ID0gMDtcbiAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7XG4gICAgbGV0IGNhY2hlTm9kZSA9IGZuTm9kZTtcbiAgICBjb25zdCB7IGxlbmd0aCB9ID0gYXJndW1lbnRzO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gbGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCBhcmcgPSBhcmd1bWVudHNbaV07XG4gICAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBhcmcgPT09IFwib2JqZWN0XCIgJiYgYXJnICE9PSBudWxsKSB7XG4gICAgICAgIGxldCBvYmplY3RDYWNoZSA9IGNhY2hlTm9kZS5vO1xuICAgICAgICBpZiAob2JqZWN0Q2FjaGUgPT09IG51bGwpIHtcbiAgICAgICAgICBjYWNoZU5vZGUubyA9IG9iamVjdENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JqZWN0Tm9kZSA9IG9iamVjdENhY2hlLmdldChhcmcpO1xuICAgICAgICBpZiAob2JqZWN0Tm9kZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY2FjaGVOb2RlID0gY3JlYXRlQ2FjaGVOb2RlKCk7XG4gICAgICAgICAgb2JqZWN0Q2FjaGUuc2V0KGFyZywgY2FjaGVOb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWNoZU5vZGUgPSBvYmplY3ROb2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpbWl0aXZlQ2FjaGUgPSBjYWNoZU5vZGUucDtcbiAgICAgICAgaWYgKHByaW1pdGl2ZUNhY2hlID09PSBudWxsKSB7XG4gICAgICAgICAgY2FjaGVOb2RlLnAgPSBwcmltaXRpdmVDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTm9kZSA9IHByaW1pdGl2ZUNhY2hlLmdldChhcmcpO1xuICAgICAgICBpZiAocHJpbWl0aXZlTm9kZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY2FjaGVOb2RlID0gY3JlYXRlQ2FjaGVOb2RlKCk7XG4gICAgICAgICAgcHJpbWl0aXZlQ2FjaGUuc2V0KGFyZywgY2FjaGVOb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWNoZU5vZGUgPSBwcmltaXRpdmVOb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRlcm1pbmF0ZWROb2RlID0gY2FjaGVOb2RlO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKGNhY2hlTm9kZS5zID09PSBURVJNSU5BVEVEKSB7XG4gICAgICByZXN1bHQgPSBjYWNoZU5vZGUudjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgcmVzdWx0c0NvdW50Kys7XG4gICAgICBpZiAocmVzdWx0RXF1YWxpdHlDaGVjaykge1xuICAgICAgICBjb25zdCBsYXN0UmVzdWx0VmFsdWUgPSBsYXN0UmVzdWx0Py5kZXJlZj8uKCkgPz8gbGFzdFJlc3VsdDtcbiAgICAgICAgaWYgKGxhc3RSZXN1bHRWYWx1ZSAhPSBudWxsICYmIHJlc3VsdEVxdWFsaXR5Q2hlY2sobGFzdFJlc3VsdFZhbHVlLCByZXN1bHQpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gbGFzdFJlc3VsdFZhbHVlO1xuICAgICAgICAgIHJlc3VsdHNDb3VudCAhPT0gMCAmJiByZXN1bHRzQ291bnQtLTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZWVkc1dlYWtSZWYgPSB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIHJlc3VsdCAhPT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIGxhc3RSZXN1bHQgPSBuZWVkc1dlYWtSZWYgPyBuZXcgUmVmKHJlc3VsdCkgOiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRlcm1pbmF0ZWROb2RlLnMgPSBURVJNSU5BVEVEO1xuICAgIHRlcm1pbmF0ZWROb2RlLnYgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBtZW1vaXplZC5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIGZuTm9kZSA9IGNyZWF0ZUNhY2hlTm9kZSgpO1xuICAgIG1lbW9pemVkLnJlc2V0UmVzdWx0c0NvdW50KCk7XG4gIH07XG4gIG1lbW9pemVkLnJlc3VsdHNDb3VudCA9ICgpID0+IHJlc3VsdHNDb3VudDtcbiAgbWVtb2l6ZWQucmVzZXRSZXN1bHRzQ291bnQgPSAoKSA9PiB7XG4gICAgcmVzdWx0c0NvdW50ID0gMDtcbiAgfTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBzcmMvY3JlYXRlU2VsZWN0b3JDcmVhdG9yLnRzXG5mdW5jdGlvbiBjcmVhdGVTZWxlY3RvckNyZWF0b3IobWVtb2l6ZU9yT3B0aW9ucywgLi4ubWVtb2l6ZU9wdGlvbnNGcm9tQXJncykge1xuICBjb25zdCBjcmVhdGVTZWxlY3RvckNyZWF0b3JPcHRpb25zID0gdHlwZW9mIG1lbW9pemVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIiA/IHtcbiAgICBtZW1vaXplOiBtZW1vaXplT3JPcHRpb25zLFxuICAgIG1lbW9pemVPcHRpb25zOiBtZW1vaXplT3B0aW9uc0Zyb21BcmdzXG4gIH0gOiBtZW1vaXplT3JPcHRpb25zO1xuICBjb25zdCBjcmVhdGVTZWxlY3RvcjIgPSAoLi4uY3JlYXRlU2VsZWN0b3JBcmdzKSA9PiB7XG4gICAgbGV0IHJlY29tcHV0YXRpb25zID0gMDtcbiAgICBsZXQgZGVwZW5kZW5jeVJlY29tcHV0YXRpb25zID0gMDtcbiAgICBsZXQgbGFzdFJlc3VsdDtcbiAgICBsZXQgZGlyZWN0bHlQYXNzZWRPcHRpb25zID0ge307XG4gICAgbGV0IHJlc3VsdEZ1bmMgPSBjcmVhdGVTZWxlY3RvckFyZ3MucG9wKCk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHRGdW5jID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBkaXJlY3RseVBhc3NlZE9wdGlvbnMgPSByZXN1bHRGdW5jO1xuICAgICAgcmVzdWx0RnVuYyA9IGNyZWF0ZVNlbGVjdG9yQXJncy5wb3AoKTtcbiAgICB9XG4gICAgYXNzZXJ0SXNGdW5jdGlvbihcbiAgICAgIHJlc3VsdEZ1bmMsXG4gICAgICBgY3JlYXRlU2VsZWN0b3IgZXhwZWN0cyBhbiBvdXRwdXQgZnVuY3Rpb24gYWZ0ZXIgdGhlIGlucHV0cywgYnV0IHJlY2VpdmVkOiBbJHt0eXBlb2YgcmVzdWx0RnVuY31dYFxuICAgICk7XG4gICAgY29uc3QgY29tYmluZWRPcHRpb25zID0ge1xuICAgICAgLi4uY3JlYXRlU2VsZWN0b3JDcmVhdG9yT3B0aW9ucyxcbiAgICAgIC4uLmRpcmVjdGx5UGFzc2VkT3B0aW9uc1xuICAgIH07XG4gICAgY29uc3Qge1xuICAgICAgbWVtb2l6ZSxcbiAgICAgIG1lbW9pemVPcHRpb25zID0gW10sXG4gICAgICBhcmdzTWVtb2l6ZSA9IHdlYWtNYXBNZW1vaXplLFxuICAgICAgYXJnc01lbW9pemVPcHRpb25zID0gW10sXG4gICAgICBkZXZNb2RlQ2hlY2tzID0ge31cbiAgICB9ID0gY29tYmluZWRPcHRpb25zO1xuICAgIGNvbnN0IGZpbmFsTWVtb2l6ZU9wdGlvbnMgPSBlbnN1cmVJc0FycmF5KG1lbW9pemVPcHRpb25zKTtcbiAgICBjb25zdCBmaW5hbEFyZ3NNZW1vaXplT3B0aW9ucyA9IGVuc3VyZUlzQXJyYXkoYXJnc01lbW9pemVPcHRpb25zKTtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBnZXREZXBlbmRlbmNpZXMoY3JlYXRlU2VsZWN0b3JBcmdzKTtcbiAgICBjb25zdCBtZW1vaXplZFJlc3VsdEZ1bmMgPSBtZW1vaXplKGZ1bmN0aW9uIHJlY29tcHV0YXRpb25XcmFwcGVyKCkge1xuICAgICAgcmVjb21wdXRhdGlvbnMrKztcbiAgICAgIHJldHVybiByZXN1bHRGdW5jLmFwcGx5KFxuICAgICAgICBudWxsLFxuICAgICAgICBhcmd1bWVudHNcbiAgICAgICk7XG4gICAgfSwgLi4uZmluYWxNZW1vaXplT3B0aW9ucyk7XG4gICAgbGV0IGZpcnN0UnVuID0gdHJ1ZTtcbiAgICBjb25zdCBzZWxlY3RvciA9IGFyZ3NNZW1vaXplKGZ1bmN0aW9uIGRlcGVuZGVuY2llc0NoZWNrZXIoKSB7XG4gICAgICBkZXBlbmRlbmN5UmVjb21wdXRhdGlvbnMrKztcbiAgICAgIGNvbnN0IGlucHV0U2VsZWN0b3JSZXN1bHRzID0gY29sbGVjdElucHV0U2VsZWN0b3JSZXN1bHRzKFxuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIGFyZ3VtZW50c1xuICAgICAgKTtcbiAgICAgIGxhc3RSZXN1bHQgPSBtZW1vaXplZFJlc3VsdEZ1bmMuYXBwbHkobnVsbCwgaW5wdXRTZWxlY3RvclJlc3VsdHMpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBjb25zdCB7IGlkZW50aXR5RnVuY3Rpb25DaGVjaywgaW5wdXRTdGFiaWxpdHlDaGVjayB9ID0gZ2V0RGV2TW9kZUNoZWNrc0V4ZWN1dGlvbkluZm8oZmlyc3RSdW4sIGRldk1vZGVDaGVja3MpO1xuICAgICAgICBpZiAoaWRlbnRpdHlGdW5jdGlvbkNoZWNrLnNob3VsZFJ1bikge1xuICAgICAgICAgIGlkZW50aXR5RnVuY3Rpb25DaGVjay5ydW4oXG4gICAgICAgICAgICByZXN1bHRGdW5jLFxuICAgICAgICAgICAgaW5wdXRTZWxlY3RvclJlc3VsdHMsXG4gICAgICAgICAgICBsYXN0UmVzdWx0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXRTdGFiaWxpdHlDaGVjay5zaG91bGRSdW4pIHtcbiAgICAgICAgICBjb25zdCBpbnB1dFNlbGVjdG9yUmVzdWx0c0NvcHkgPSBjb2xsZWN0SW5wdXRTZWxlY3RvclJlc3VsdHMoXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICBhcmd1bWVudHNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlucHV0U3RhYmlsaXR5Q2hlY2sucnVuKFxuICAgICAgICAgICAgeyBpbnB1dFNlbGVjdG9yUmVzdWx0cywgaW5wdXRTZWxlY3RvclJlc3VsdHNDb3B5IH0sXG4gICAgICAgICAgICB7IG1lbW9pemUsIG1lbW9pemVPcHRpb25zOiBmaW5hbE1lbW9pemVPcHRpb25zIH0sXG4gICAgICAgICAgICBhcmd1bWVudHNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaXJzdFJ1bilcbiAgICAgICAgICBmaXJzdFJ1biA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gICAgfSwgLi4uZmluYWxBcmdzTWVtb2l6ZU9wdGlvbnMpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHNlbGVjdG9yLCB7XG4gICAgICByZXN1bHRGdW5jLFxuICAgICAgbWVtb2l6ZWRSZXN1bHRGdW5jLFxuICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgZGVwZW5kZW5jeVJlY29tcHV0YXRpb25zOiAoKSA9PiBkZXBlbmRlbmN5UmVjb21wdXRhdGlvbnMsXG4gICAgICByZXNldERlcGVuZGVuY3lSZWNvbXB1dGF0aW9uczogKCkgPT4ge1xuICAgICAgICBkZXBlbmRlbmN5UmVjb21wdXRhdGlvbnMgPSAwO1xuICAgICAgfSxcbiAgICAgIGxhc3RSZXN1bHQ6ICgpID0+IGxhc3RSZXN1bHQsXG4gICAgICByZWNvbXB1dGF0aW9uczogKCkgPT4gcmVjb21wdXRhdGlvbnMsXG4gICAgICByZXNldFJlY29tcHV0YXRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJlY29tcHV0YXRpb25zID0gMDtcbiAgICAgIH0sXG4gICAgICBtZW1vaXplLFxuICAgICAgYXJnc01lbW9pemVcbiAgICB9KTtcbiAgfTtcbiAgT2JqZWN0LmFzc2lnbihjcmVhdGVTZWxlY3RvcjIsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZVNlbGVjdG9yMlxuICB9KTtcbiAgcmV0dXJuIGNyZWF0ZVNlbGVjdG9yMjtcbn1cbnZhciBjcmVhdGVTZWxlY3RvciA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVTZWxlY3RvckNyZWF0b3Iod2Vha01hcE1lbW9pemUpO1xuXG4vLyBzcmMvY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yLnRzXG52YXIgY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yID0gT2JqZWN0LmFzc2lnbihcbiAgKGlucHV0U2VsZWN0b3JzT2JqZWN0LCBzZWxlY3RvckNyZWF0b3IgPSBjcmVhdGVTZWxlY3RvcikgPT4ge1xuICAgIGFzc2VydElzT2JqZWN0KFxuICAgICAgaW5wdXRTZWxlY3RvcnNPYmplY3QsXG4gICAgICBgY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yIGV4cGVjdHMgZmlyc3QgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IHdoZXJlIGVhY2ggcHJvcGVydHkgaXMgYSBzZWxlY3RvciwgaW5zdGVhZCByZWNlaXZlZCBhICR7dHlwZW9mIGlucHV0U2VsZWN0b3JzT2JqZWN0fWBcbiAgICApO1xuICAgIGNvbnN0IGlucHV0U2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRTZWxlY3RvcnNPYmplY3QpO1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGlucHV0U2VsZWN0b3JLZXlzLm1hcChcbiAgICAgIChrZXkpID0+IGlucHV0U2VsZWN0b3JzT2JqZWN0W2tleV1cbiAgICApO1xuICAgIGNvbnN0IHN0cnVjdHVyZWRTZWxlY3RvciA9IHNlbGVjdG9yQ3JlYXRvcihcbiAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICguLi5pbnB1dFNlbGVjdG9yUmVzdWx0cykgPT4ge1xuICAgICAgICByZXR1cm4gaW5wdXRTZWxlY3RvclJlc3VsdHMucmVkdWNlKChjb21wb3NpdGlvbiwgdmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29tcG9zaXRpb25baW5wdXRTZWxlY3RvcktleXNbaW5kZXhdXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiBjb21wb3NpdGlvbjtcbiAgICAgICAgfSwge30pO1xuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRTZWxlY3RvcjtcbiAgfSxcbiAgeyB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZVN0cnVjdHVyZWRTZWxlY3RvciB9XG4pO1xuZXhwb3J0IHtcbiAgY3JlYXRlU2VsZWN0b3IsXG4gIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcixcbiAgY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yLFxuICBscnVNZW1vaXplLFxuICByZWZlcmVuY2VFcXVhbGl0eUNoZWNrLFxuICBzZXRHbG9iYWxEZXZNb2RlQ2hlY2tzLFxuICBhdXRvdHJhY2tNZW1vaXplIGFzIHVuc3RhYmxlX2F1dG90cmFja01lbW9pemUsXG4gIHdlYWtNYXBNZW1vaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVzZWxlY3QubWpzLm1hcCIsIi8qIVxuICogU2lnbmF0dXJlIFBhZCB2Mi4zLjJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvc2lnbmF0dXJlX3BhZFxuICpcbiAqIENvcHlyaWdodCAyMDE3IFN6eW1vbiBOb3dha1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKlxuICogVGhlIG1haW4gaWRlYSBhbmQgc29tZSBwYXJ0cyBvZiB0aGUgY29kZSAoZS5nLiBkcmF3aW5nIHZhcmlhYmxlIHdpZHRoIELDqXppZXIgY3VydmUpIGFyZSB0YWtlbiBmcm9tOlxuICogaHR0cDovL2Nvcm5lci5zcXVhcmV1cC5jb20vMjAxMi8wNy9zbW9vdGhlci1zaWduYXR1cmVzLmh0bWxcbiAqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBpbnRlcnBvbGF0aW9uIHVzaW5nIGN1YmljIELDqXppZXIgY3VydmVzIGlzIHRha2VuIGZyb206XG4gKiBodHRwOi8vYmVua25vd3Njb2RlLndvcmRwcmVzcy5jb20vMjAxMi8wOS8xNC9wYXRoLWludGVycG9sYXRpb24tdXNpbmctY3ViaWMtYmV6aWVyLWFuZC1jb250cm9sLXBvaW50LWVzdGltYXRpb24taW4tamF2YXNjcmlwdFxuICpcbiAqIEFsZ29yaXRobSBmb3IgYXBwcm94aW1hdGVkIGxlbmd0aCBvZiBhIELDqXppZXIgY3VydmUgaXMgdGFrZW4gZnJvbTpcbiAqIGh0dHA6Ly93d3cubGVtb2RhLm5ldC9tYXRocy9iZXppZXItbGVuZ3RoL2luZGV4Lmh0bWxcbiAqXG4gKi9cblxuZnVuY3Rpb24gUG9pbnQoeCwgeSwgdGltZSkge1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xuICB0aGlzLnRpbWUgPSB0aW1lIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xufVxuXG5Qb2ludC5wcm90b3R5cGUudmVsb2NpdHlGcm9tID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gIHJldHVybiB0aGlzLnRpbWUgIT09IHN0YXJ0LnRpbWUgPyB0aGlzLmRpc3RhbmNlVG8oc3RhcnQpIC8gKHRoaXMudGltZSAtIHN0YXJ0LnRpbWUpIDogMTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kaXN0YW5jZVRvID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codGhpcy54IC0gc3RhcnQueCwgMikgKyBNYXRoLnBvdyh0aGlzLnkgLSBzdGFydC55LCAyKSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLnggPT09IG90aGVyLnggJiYgdGhpcy55ID09PSBvdGhlci55ICYmIHRoaXMudGltZSA9PT0gb3RoZXIudGltZTtcbn07XG5cbmZ1bmN0aW9uIEJlemllcihzdGFydFBvaW50LCBjb250cm9sMSwgY29udHJvbDIsIGVuZFBvaW50KSB7XG4gIHRoaXMuc3RhcnRQb2ludCA9IHN0YXJ0UG9pbnQ7XG4gIHRoaXMuY29udHJvbDEgPSBjb250cm9sMTtcbiAgdGhpcy5jb250cm9sMiA9IGNvbnRyb2wyO1xuICB0aGlzLmVuZFBvaW50ID0gZW5kUG9pbnQ7XG59XG5cbi8vIFJldHVybnMgYXBwcm94aW1hdGVkIGxlbmd0aC5cbkJlemllci5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RlcHMgPSAxMDtcbiAgdmFyIGxlbmd0aCA9IDA7XG4gIHZhciBweCA9IHZvaWQgMDtcbiAgdmFyIHB5ID0gdm9pZCAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDw9IHN0ZXBzOyBpICs9IDEpIHtcbiAgICB2YXIgdCA9IGkgLyBzdGVwcztcbiAgICB2YXIgY3ggPSB0aGlzLl9wb2ludCh0LCB0aGlzLnN0YXJ0UG9pbnQueCwgdGhpcy5jb250cm9sMS54LCB0aGlzLmNvbnRyb2wyLngsIHRoaXMuZW5kUG9pbnQueCk7XG4gICAgdmFyIGN5ID0gdGhpcy5fcG9pbnQodCwgdGhpcy5zdGFydFBvaW50LnksIHRoaXMuY29udHJvbDEueSwgdGhpcy5jb250cm9sMi55LCB0aGlzLmVuZFBvaW50LnkpO1xuICAgIGlmIChpID4gMCkge1xuICAgICAgdmFyIHhkaWZmID0gY3ggLSBweDtcbiAgICAgIHZhciB5ZGlmZiA9IGN5IC0gcHk7XG4gICAgICBsZW5ndGggKz0gTWF0aC5zcXJ0KHhkaWZmICogeGRpZmYgKyB5ZGlmZiAqIHlkaWZmKTtcbiAgICB9XG4gICAgcHggPSBjeDtcbiAgICBweSA9IGN5O1xuICB9XG5cbiAgcmV0dXJuIGxlbmd0aDtcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLW11bHRpLXNwYWNlcywgc3BhY2UtaW4tcGFyZW5zICovXG5CZXppZXIucHJvdG90eXBlLl9wb2ludCA9IGZ1bmN0aW9uICh0LCBzdGFydCwgYzEsIGMyLCBlbmQpIHtcbiAgcmV0dXJuIHN0YXJ0ICogKDEuMCAtIHQpICogKDEuMCAtIHQpICogKDEuMCAtIHQpICsgMy4wICogYzEgKiAoMS4wIC0gdCkgKiAoMS4wIC0gdCkgKiB0ICsgMy4wICogYzIgKiAoMS4wIC0gdCkgKiB0ICogdCArIGVuZCAqIHQgKiB0ICogdDtcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI3MDc4NDAxLzgxNTUwN1xuZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgY29udGV4dCwgYXJncywgcmVzdWx0O1xuICB2YXIgdGltZW91dCA9IG51bGw7XG4gIHZhciBwcmV2aW91cyA9IDA7XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICB2YXIgbGF0ZXIgPSBmdW5jdGlvbiBsYXRlcigpIHtcbiAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogRGF0ZS5ub3coKTtcbiAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICB9O1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAobm93IC0gcHJldmlvdXMpO1xuICAgIGNvbnRleHQgPSB0aGlzO1xuICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgaWYgKHJlbWFpbmluZyA8PSAwIHx8IHJlbWFpbmluZyA+IHdhaXQpIHtcbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICBpZiAoIXRpbWVvdXQpIGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKCF0aW1lb3V0ICYmIG9wdGlvbnMudHJhaWxpbmcgIT09IGZhbHNlKSB7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gU2lnbmF0dXJlUGFkKGNhbnZhcywgb3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0ID0gb3B0cy52ZWxvY2l0eUZpbHRlcldlaWdodCB8fCAwLjc7XG4gIHRoaXMubWluV2lkdGggPSBvcHRzLm1pbldpZHRoIHx8IDAuNTtcbiAgdGhpcy5tYXhXaWR0aCA9IG9wdHMubWF4V2lkdGggfHwgMi41O1xuICB0aGlzLnRocm90dGxlID0gJ3Rocm90dGxlJyBpbiBvcHRzID8gb3B0cy50aHJvdHRsZSA6IDE2OyAvLyBpbiBtaWxpc2Vjb25kc1xuICB0aGlzLm1pbkRpc3RhbmNlID0gJ21pbkRpc3RhbmNlJyBpbiBvcHRzID8gb3B0cy5taW5EaXN0YW5jZSA6IDU7XG5cbiAgaWYgKHRoaXMudGhyb3R0bGUpIHtcbiAgICB0aGlzLl9zdHJva2VNb3ZlVXBkYXRlID0gdGhyb3R0bGUoU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlLCB0aGlzLnRocm90dGxlKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9zdHJva2VNb3ZlVXBkYXRlID0gU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlO1xuICB9XG5cbiAgdGhpcy5kb3RTaXplID0gb3B0cy5kb3RTaXplIHx8IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKHRoaXMubWluV2lkdGggKyB0aGlzLm1heFdpZHRoKSAvIDI7XG4gIH07XG4gIHRoaXMucGVuQ29sb3IgPSBvcHRzLnBlbkNvbG9yIHx8ICdibGFjayc7XG4gIHRoaXMuYmFja2dyb3VuZENvbG9yID0gb3B0cy5iYWNrZ3JvdW5kQ29sb3IgfHwgJ3JnYmEoMCwwLDAsMCknO1xuICB0aGlzLm9uQmVnaW4gPSBvcHRzLm9uQmVnaW47XG4gIHRoaXMub25FbmQgPSBvcHRzLm9uRW5kO1xuXG4gIHRoaXMuX2NhbnZhcyA9IGNhbnZhcztcbiAgdGhpcy5fY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIHRoaXMuY2xlYXIoKTtcblxuICAvLyBXZSBuZWVkIGFkZCB0aGVzZSBpbmxpbmUgc28gdGhleSBhcmUgYXZhaWxhYmxlIHRvIHVuYmluZCB3aGlsZSBzdGlsbCBoYXZpbmdcbiAgLy8gYWNjZXNzIHRvICdzZWxmJyB3ZSBjb3VsZCB1c2UgXy5iaW5kIGJ1dCBpdCdzIG5vdCB3b3J0aCBhZGRpbmcgYSBkZXBlbmRlbmN5LlxuICB0aGlzLl9oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDEpIHtcbiAgICAgIHNlbGYuX21vdXNlQnV0dG9uRG93biA9IHRydWU7XG4gICAgICBzZWxmLl9zdHJva2VCZWdpbihldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuX2hhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChzZWxmLl9tb3VzZUJ1dHRvbkRvd24pIHtcbiAgICAgIHNlbGYuX3N0cm9rZU1vdmVVcGRhdGUoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLl9oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LndoaWNoID09PSAxICYmIHNlbGYuX21vdXNlQnV0dG9uRG93bikge1xuICAgICAgc2VsZi5fbW91c2VCdXR0b25Eb3duID0gZmFsc2U7XG4gICAgICBzZWxmLl9zdHJva2VFbmQoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICAgIHNlbGYuX3N0cm9rZUJlZ2luKHRvdWNoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gUHJldmVudCBzY3JvbGxpbmcuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHZhciB0b3VjaCA9IGV2ZW50LnRhcmdldFRvdWNoZXNbMF07XG4gICAgc2VsZi5fc3Ryb2tlTW92ZVVwZGF0ZSh0b3VjaCk7XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlVG91Y2hFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgd2FzQ2FudmFzVG91Y2hlZCA9IGV2ZW50LnRhcmdldCA9PT0gc2VsZi5fY2FudmFzO1xuICAgIGlmICh3YXNDYW52YXNUb3VjaGVkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2VsZi5fc3Ryb2tlRW5kKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRW5hYmxlIG1vdXNlIGFuZCB0b3VjaCBldmVudCBoYW5kbGVyc1xuICB0aGlzLm9uKCk7XG59XG5cbi8vIFB1YmxpYyBtZXRob2RzXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuICB2YXIgY2FudmFzID0gdGhpcy5fY2FudmFzO1xuXG4gIGN0eC5maWxsU3R5bGUgPSB0aGlzLmJhY2tncm91bmRDb2xvcjtcbiAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICB0aGlzLl9kYXRhID0gW107XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuX2lzRW1wdHkgPSB0cnVlO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5mcm9tRGF0YVVSTCA9IGZ1bmN0aW9uIChkYXRhVXJsKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICB2YXIgcmF0aW8gPSBvcHRpb25zLnJhdGlvIHx8IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgdGhpcy5fY2FudmFzLndpZHRoIC8gcmF0aW87XG4gIHZhciBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCB8fCB0aGlzLl9jYW52YXMuaGVpZ2h0IC8gcmF0aW87XG5cbiAgdGhpcy5fcmVzZXQoKTtcbiAgaW1hZ2Uuc3JjID0gZGF0YVVybDtcbiAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLl9jdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgfTtcbiAgdGhpcy5faXNFbXB0eSA9IGZhbHNlO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS50b0RhdGFVUkwgPSBmdW5jdGlvbiAodHlwZSkge1xuICB2YXIgX2NhbnZhcztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdpbWFnZS9zdmcreG1sJzpcbiAgICAgIHJldHVybiB0aGlzLl90b1NWRygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgb3B0aW9ucyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgb3B0aW9uc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoX2NhbnZhcyA9IHRoaXMuX2NhbnZhcykudG9EYXRhVVJMLmFwcGx5KF9jYW52YXMsIFt0eXBlXS5jb25jYXQob3B0aW9ucykpO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9oYW5kbGVNb3VzZUV2ZW50cygpO1xuICB0aGlzLl9oYW5kbGVUb3VjaEV2ZW50cygpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9oYW5kbGVNb3VzZURvd24pO1xuICB0aGlzLl9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlTW91c2VNb3ZlKTtcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2hhbmRsZU1vdXNlVXApO1xuXG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5faGFuZGxlVG91Y2hTdGFydCk7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVUb3VjaE1vdmUpO1xuICB0aGlzLl9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9oYW5kbGVUb3VjaEVuZCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9pc0VtcHR5O1xufTtcblxuLy8gUHJpdmF0ZSBtZXRob2RzXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VCZWdpbiA9IGZ1bmN0aW9uIChldmVudCkge1xuICB0aGlzLl9kYXRhLnB1c2goW10pO1xuICB0aGlzLl9yZXNldCgpO1xuICB0aGlzLl9zdHJva2VVcGRhdGUoZXZlbnQpO1xuXG4gIGlmICh0eXBlb2YgdGhpcy5vbkJlZ2luID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5vbkJlZ2luKGV2ZW50KTtcbiAgfVxufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHZhciB4ID0gZXZlbnQuY2xpZW50WDtcbiAgdmFyIHkgPSBldmVudC5jbGllbnRZO1xuXG4gIHZhciBwb2ludCA9IHRoaXMuX2NyZWF0ZVBvaW50KHgsIHkpO1xuICB2YXIgbGFzdFBvaW50R3JvdXAgPSB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV07XG4gIHZhciBsYXN0UG9pbnQgPSBsYXN0UG9pbnRHcm91cCAmJiBsYXN0UG9pbnRHcm91cFtsYXN0UG9pbnRHcm91cC5sZW5ndGggLSAxXTtcbiAgdmFyIGlzTGFzdFBvaW50VG9vQ2xvc2UgPSBsYXN0UG9pbnQgJiYgcG9pbnQuZGlzdGFuY2VUbyhsYXN0UG9pbnQpIDwgdGhpcy5taW5EaXN0YW5jZTtcblxuICAvLyBTa2lwIHRoaXMgcG9pbnQgaWYgaXQncyB0b28gY2xvc2UgdG8gdGhlIHByZXZpb3VzIG9uZVxuICBpZiAoIShsYXN0UG9pbnQgJiYgaXNMYXN0UG9pbnRUb29DbG9zZSkpIHtcbiAgICB2YXIgX2FkZFBvaW50ID0gdGhpcy5fYWRkUG9pbnQocG9pbnQpLFxuICAgICAgICBjdXJ2ZSA9IF9hZGRQb2ludC5jdXJ2ZSxcbiAgICAgICAgd2lkdGhzID0gX2FkZFBvaW50LndpZHRocztcblxuICAgIGlmIChjdXJ2ZSAmJiB3aWR0aHMpIHtcbiAgICAgIHRoaXMuX2RyYXdDdXJ2ZShjdXJ2ZSwgd2lkdGhzLnN0YXJ0LCB3aWR0aHMuZW5kKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV0ucHVzaCh7XG4gICAgICB4OiBwb2ludC54LFxuICAgICAgeTogcG9pbnQueSxcbiAgICAgIHRpbWU6IHBvaW50LnRpbWUsXG4gICAgICBjb2xvcjogdGhpcy5wZW5Db2xvclxuICAgIH0pO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIGNhbkRyYXdDdXJ2ZSA9IHRoaXMucG9pbnRzLmxlbmd0aCA+IDI7XG4gIHZhciBwb2ludCA9IHRoaXMucG9pbnRzWzBdOyAvLyBQb2ludCBpbnN0YW5jZVxuXG4gIGlmICghY2FuRHJhd0N1cnZlICYmIHBvaW50KSB7XG4gICAgdGhpcy5fZHJhd0RvdChwb2ludCk7XG4gIH1cblxuICBpZiAocG9pbnQpIHtcbiAgICB2YXIgbGFzdFBvaW50R3JvdXAgPSB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV07XG4gICAgdmFyIGxhc3RQb2ludCA9IGxhc3RQb2ludEdyb3VwW2xhc3RQb2ludEdyb3VwLmxlbmd0aCAtIDFdOyAvLyBwbGFpbiBvYmplY3RcblxuICAgIC8vIFdoZW4gZHJhd2luZyBhIGRvdCwgdGhlcmUncyBvbmx5IG9uZSBwb2ludCBpbiBhIGdyb3VwLCBzbyB3aXRob3V0IHRoaXMgY2hlY2tcbiAgICAvLyBzdWNoIGdyb3VwIHdvdWxkIGVuZCB1cCB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgMiBwb2ludHMuXG4gICAgaWYgKCFwb2ludC5lcXVhbHMobGFzdFBvaW50KSkge1xuICAgICAgbGFzdFBvaW50R3JvdXAucHVzaCh7XG4gICAgICAgIHg6IHBvaW50LngsXG4gICAgICAgIHk6IHBvaW50LnksXG4gICAgICAgIHRpbWU6IHBvaW50LnRpbWUsXG4gICAgICAgIGNvbG9yOiB0aGlzLnBlbkNvbG9yXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHRoaXMub25FbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLm9uRW5kKGV2ZW50KTtcbiAgfVxufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5faGFuZGxlTW91c2VFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX21vdXNlQnV0dG9uRG93biA9IGZhbHNlO1xuXG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9oYW5kbGVNb3VzZURvd24pO1xuICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlTW91c2VNb3ZlKTtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2hhbmRsZU1vdXNlVXApO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5faGFuZGxlVG91Y2hFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFBhc3MgdG91Y2ggZXZlbnRzIHRvIGNhbnZhcyBlbGVtZW50IG9uIG1vYmlsZSBJRTExIGFuZCBFZGdlLlxuICB0aGlzLl9jYW52YXMuc3R5bGUubXNUb3VjaEFjdGlvbiA9ICdub25lJztcbiAgdGhpcy5fY2FudmFzLnN0eWxlLnRvdWNoQWN0aW9uID0gJ25vbmUnO1xuXG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5faGFuZGxlVG91Y2hTdGFydCk7XG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVUb3VjaE1vdmUpO1xuICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9oYW5kbGVUb3VjaEVuZCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5wb2ludHMgPSBbXTtcbiAgdGhpcy5fbGFzdFZlbG9jaXR5ID0gMDtcbiAgdGhpcy5fbGFzdFdpZHRoID0gKHRoaXMubWluV2lkdGggKyB0aGlzLm1heFdpZHRoKSAvIDI7XG4gIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLnBlbkNvbG9yO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fY3JlYXRlUG9pbnQgPSBmdW5jdGlvbiAoeCwgeSwgdGltZSkge1xuICB2YXIgcmVjdCA9IHRoaXMuX2NhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICByZXR1cm4gbmV3IFBvaW50KHggLSByZWN0LmxlZnQsIHkgLSByZWN0LnRvcCwgdGltZSB8fCBuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9hZGRQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuICB2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG4gIHZhciB0bXAgPSB2b2lkIDA7XG5cbiAgcG9pbnRzLnB1c2gocG9pbnQpO1xuXG4gIGlmIChwb2ludHMubGVuZ3RoID4gMikge1xuICAgIC8vIFRvIHJlZHVjZSB0aGUgaW5pdGlhbCBsYWcgbWFrZSBpdCB3b3JrIHdpdGggMyBwb2ludHNcbiAgICAvLyBieSBjb3B5aW5nIHRoZSBmaXJzdCBwb2ludCB0byB0aGUgYmVnaW5uaW5nLlxuICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAzKSBwb2ludHMudW5zaGlmdChwb2ludHNbMF0pO1xuXG4gICAgdG1wID0gdGhpcy5fY2FsY3VsYXRlQ3VydmVDb250cm9sUG9pbnRzKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0pO1xuICAgIHZhciBjMiA9IHRtcC5jMjtcbiAgICB0bXAgPSB0aGlzLl9jYWxjdWxhdGVDdXJ2ZUNvbnRyb2xQb2ludHMocG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7XG4gICAgdmFyIGMzID0gdG1wLmMxO1xuICAgIHZhciBjdXJ2ZSA9IG5ldyBCZXppZXIocG9pbnRzWzFdLCBjMiwgYzMsIHBvaW50c1syXSk7XG4gICAgdmFyIHdpZHRocyA9IHRoaXMuX2NhbGN1bGF0ZUN1cnZlV2lkdGhzKGN1cnZlKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBsaXN0LFxuICAgIC8vIHNvIHRoYXQgd2UgYWx3YXlzIGhhdmUgbm8gbW9yZSB0aGFuIDQgcG9pbnRzIGluIHBvaW50cyBhcnJheS5cbiAgICBwb2ludHMuc2hpZnQoKTtcblxuICAgIHJldHVybiB7IGN1cnZlOiBjdXJ2ZSwgd2lkdGhzOiB3aWR0aHMgfTtcbiAgfVxuXG4gIHJldHVybiB7fTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2NhbGN1bGF0ZUN1cnZlQ29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIChzMSwgczIsIHMzKSB7XG4gIHZhciBkeDEgPSBzMS54IC0gczIueDtcbiAgdmFyIGR5MSA9IHMxLnkgLSBzMi55O1xuICB2YXIgZHgyID0gczIueCAtIHMzLng7XG4gIHZhciBkeTIgPSBzMi55IC0gczMueTtcblxuICB2YXIgbTEgPSB7IHg6IChzMS54ICsgczIueCkgLyAyLjAsIHk6IChzMS55ICsgczIueSkgLyAyLjAgfTtcbiAgdmFyIG0yID0geyB4OiAoczIueCArIHMzLngpIC8gMi4wLCB5OiAoczIueSArIHMzLnkpIC8gMi4wIH07XG5cbiAgdmFyIGwxID0gTWF0aC5zcXJ0KGR4MSAqIGR4MSArIGR5MSAqIGR5MSk7XG4gIHZhciBsMiA9IE1hdGguc3FydChkeDIgKiBkeDIgKyBkeTIgKiBkeTIpO1xuXG4gIHZhciBkeG0gPSBtMS54IC0gbTIueDtcbiAgdmFyIGR5bSA9IG0xLnkgLSBtMi55O1xuXG4gIHZhciBrID0gbDIgLyAobDEgKyBsMik7XG4gIHZhciBjbSA9IHsgeDogbTIueCArIGR4bSAqIGssIHk6IG0yLnkgKyBkeW0gKiBrIH07XG5cbiAgdmFyIHR4ID0gczIueCAtIGNtLng7XG4gIHZhciB0eSA9IHMyLnkgLSBjbS55O1xuXG4gIHJldHVybiB7XG4gICAgYzE6IG5ldyBQb2ludChtMS54ICsgdHgsIG0xLnkgKyB0eSksXG4gICAgYzI6IG5ldyBQb2ludChtMi54ICsgdHgsIG0yLnkgKyB0eSlcbiAgfTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2NhbGN1bGF0ZUN1cnZlV2lkdGhzID0gZnVuY3Rpb24gKGN1cnZlKSB7XG4gIHZhciBzdGFydFBvaW50ID0gY3VydmUuc3RhcnRQb2ludDtcbiAgdmFyIGVuZFBvaW50ID0gY3VydmUuZW5kUG9pbnQ7XG4gIHZhciB3aWR0aHMgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcblxuICB2YXIgdmVsb2NpdHkgPSB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0ICogZW5kUG9pbnQudmVsb2NpdHlGcm9tKHN0YXJ0UG9pbnQpICsgKDEgLSB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0KSAqIHRoaXMuX2xhc3RWZWxvY2l0eTtcblxuICB2YXIgbmV3V2lkdGggPSB0aGlzLl9zdHJva2VXaWR0aCh2ZWxvY2l0eSk7XG5cbiAgd2lkdGhzLnN0YXJ0ID0gdGhpcy5fbGFzdFdpZHRoO1xuICB3aWR0aHMuZW5kID0gbmV3V2lkdGg7XG5cbiAgdGhpcy5fbGFzdFZlbG9jaXR5ID0gdmVsb2NpdHk7XG4gIHRoaXMuX2xhc3RXaWR0aCA9IG5ld1dpZHRoO1xuXG4gIHJldHVybiB3aWR0aHM7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VXaWR0aCA9IGZ1bmN0aW9uICh2ZWxvY2l0eSkge1xuICByZXR1cm4gTWF0aC5tYXgodGhpcy5tYXhXaWR0aCAvICh2ZWxvY2l0eSArIDEpLCB0aGlzLm1pbldpZHRoKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2RyYXdQb2ludCA9IGZ1bmN0aW9uICh4LCB5LCBzaXplKSB7XG4gIHZhciBjdHggPSB0aGlzLl9jdHg7XG5cbiAgY3R4Lm1vdmVUbyh4LCB5KTtcbiAgY3R4LmFyYyh4LCB5LCBzaXplLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICB0aGlzLl9pc0VtcHR5ID0gZmFsc2U7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9kcmF3Q3VydmUgPSBmdW5jdGlvbiAoY3VydmUsIHN0YXJ0V2lkdGgsIGVuZFdpZHRoKSB7XG4gIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gIHZhciB3aWR0aERlbHRhID0gZW5kV2lkdGggLSBzdGFydFdpZHRoO1xuICB2YXIgZHJhd1N0ZXBzID0gTWF0aC5mbG9vcihjdXJ2ZS5sZW5ndGgoKSk7XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZHJhd1N0ZXBzOyBpICs9IDEpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIEJlemllciAoeCwgeSkgY29vcmRpbmF0ZSBmb3IgdGhpcyBzdGVwLlxuICAgIHZhciB0ID0gaSAvIGRyYXdTdGVwcztcbiAgICB2YXIgdHQgPSB0ICogdDtcbiAgICB2YXIgdHR0ID0gdHQgKiB0O1xuICAgIHZhciB1ID0gMSAtIHQ7XG4gICAgdmFyIHV1ID0gdSAqIHU7XG4gICAgdmFyIHV1dSA9IHV1ICogdTtcblxuICAgIHZhciB4ID0gdXV1ICogY3VydmUuc3RhcnRQb2ludC54O1xuICAgIHggKz0gMyAqIHV1ICogdCAqIGN1cnZlLmNvbnRyb2wxLng7XG4gICAgeCArPSAzICogdSAqIHR0ICogY3VydmUuY29udHJvbDIueDtcbiAgICB4ICs9IHR0dCAqIGN1cnZlLmVuZFBvaW50Lng7XG5cbiAgICB2YXIgeSA9IHV1dSAqIGN1cnZlLnN0YXJ0UG9pbnQueTtcbiAgICB5ICs9IDMgKiB1dSAqIHQgKiBjdXJ2ZS5jb250cm9sMS55O1xuICAgIHkgKz0gMyAqIHUgKiB0dCAqIGN1cnZlLmNvbnRyb2wyLnk7XG4gICAgeSArPSB0dHQgKiBjdXJ2ZS5lbmRQb2ludC55O1xuXG4gICAgdmFyIHdpZHRoID0gc3RhcnRXaWR0aCArIHR0dCAqIHdpZHRoRGVsdGE7XG4gICAgdGhpcy5fZHJhd1BvaW50KHgsIHksIHdpZHRoKTtcbiAgfVxuXG4gIGN0eC5jbG9zZVBhdGgoKTtcbiAgY3R4LmZpbGwoKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2RyYXdEb3QgPSBmdW5jdGlvbiAocG9pbnQpIHtcbiAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcbiAgdmFyIHdpZHRoID0gdHlwZW9mIHRoaXMuZG90U2l6ZSA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuZG90U2l6ZSgpIDogdGhpcy5kb3RTaXplO1xuXG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgdGhpcy5fZHJhd1BvaW50KHBvaW50LngsIHBvaW50LnksIHdpZHRoKTtcbiAgY3R4LmNsb3NlUGF0aCgpO1xuICBjdHguZmlsbCgpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fZnJvbURhdGEgPSBmdW5jdGlvbiAocG9pbnRHcm91cHMsIGRyYXdDdXJ2ZSwgZHJhd0RvdCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50R3JvdXBzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGdyb3VwID0gcG9pbnRHcm91cHNbaV07XG5cbiAgICBpZiAoZ3JvdXAubGVuZ3RoID4gMSkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBncm91cC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICB2YXIgcmF3UG9pbnQgPSBncm91cFtqXTtcbiAgICAgICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KHJhd1BvaW50LngsIHJhd1BvaW50LnksIHJhd1BvaW50LnRpbWUpO1xuICAgICAgICB2YXIgY29sb3IgPSByYXdQb2ludC5jb2xvcjtcblxuICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgIC8vIEZpcnN0IHBvaW50IGluIGEgZ3JvdXAuIE5vdGhpbmcgdG8gZHJhdyB5ZXQuXG5cbiAgICAgICAgICAvLyBBbGwgcG9pbnRzIGluIHRoZSBncm91cCBoYXZlIHRoZSBzYW1lIGNvbG9yLCBzbyBpdCdzIGVub3VnaCB0byBzZXRcbiAgICAgICAgICAvLyBwZW5Db2xvciBqdXN0IGF0IHRoZSBiZWdpbm5pbmcuXG4gICAgICAgICAgdGhpcy5wZW5Db2xvciA9IGNvbG9yO1xuICAgICAgICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICAgICAgICB0aGlzLl9hZGRQb2ludChwb2ludCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaiAhPT0gZ3JvdXAubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIC8vIE1pZGRsZSBwb2ludCBpbiBhIGdyb3VwLlxuICAgICAgICAgIHZhciBfYWRkUG9pbnQyID0gdGhpcy5fYWRkUG9pbnQocG9pbnQpLFxuICAgICAgICAgICAgICBjdXJ2ZSA9IF9hZGRQb2ludDIuY3VydmUsXG4gICAgICAgICAgICAgIHdpZHRocyA9IF9hZGRQb2ludDIud2lkdGhzO1xuXG4gICAgICAgICAgaWYgKGN1cnZlICYmIHdpZHRocykge1xuICAgICAgICAgICAgZHJhd0N1cnZlKGN1cnZlLCB3aWR0aHMsIGNvbG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTGFzdCBwb2ludCBpbiBhIGdyb3VwLiBEbyBub3RoaW5nLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgICB2YXIgX3Jhd1BvaW50ID0gZ3JvdXBbMF07XG4gICAgICBkcmF3RG90KF9yYXdQb2ludCk7XG4gICAgfVxuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl90b1NWRyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgdmFyIHBvaW50R3JvdXBzID0gdGhpcy5fZGF0YTtcbiAgdmFyIGNhbnZhcyA9IHRoaXMuX2NhbnZhcztcbiAgdmFyIHJhdGlvID0gTWF0aC5tYXgod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSwgMSk7XG4gIHZhciBtaW5YID0gMDtcbiAgdmFyIG1pblkgPSAwO1xuICB2YXIgbWF4WCA9IGNhbnZhcy53aWR0aCAvIHJhdGlvO1xuICB2YXIgbWF4WSA9IGNhbnZhcy5oZWlnaHQgLyByYXRpbztcbiAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG5cbiAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICd3aWR0aCcsIGNhbnZhcy53aWR0aCk7XG4gIHN2Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaGVpZ2h0JywgY2FudmFzLmhlaWdodCk7XG5cbiAgdGhpcy5fZnJvbURhdGEocG9pbnRHcm91cHMsIGZ1bmN0aW9uIChjdXJ2ZSwgd2lkdGhzLCBjb2xvcikge1xuICAgIHZhciBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncGF0aCcpO1xuXG4gICAgLy8gTmVlZCB0byBjaGVjayBjdXJ2ZSBmb3IgTmFOIHZhbHVlcywgdGhlc2UgcG9wIHVwIHdoZW4gZHJhd2luZ1xuICAgIC8vIGxpbmVzIG9uIHRoZSBjYW52YXMgdGhhdCBhcmUgbm90IGNvbnRpbnVvdXMuIEUuZy4gU2hhcnAgY29ybmVyc1xuICAgIC8vIG9yIHN0b3BwaW5nIG1pZC1zdHJva2UgYW5kIHRoYW4gY29udGludWluZyB3aXRob3V0IGxpZnRpbmcgbW91c2UuXG4gICAgaWYgKCFpc05hTihjdXJ2ZS5jb250cm9sMS54KSAmJiAhaXNOYU4oY3VydmUuY29udHJvbDEueSkgJiYgIWlzTmFOKGN1cnZlLmNvbnRyb2wyLngpICYmICFpc05hTihjdXJ2ZS5jb250cm9sMi55KSkge1xuICAgICAgdmFyIGF0dHIgPSAnTSAnICsgY3VydmUuc3RhcnRQb2ludC54LnRvRml4ZWQoMykgKyAnLCcgKyBjdXJ2ZS5zdGFydFBvaW50LnkudG9GaXhlZCgzKSArICcgJyArICgnQyAnICsgY3VydmUuY29udHJvbDEueC50b0ZpeGVkKDMpICsgJywnICsgY3VydmUuY29udHJvbDEueS50b0ZpeGVkKDMpICsgJyAnKSArIChjdXJ2ZS5jb250cm9sMi54LnRvRml4ZWQoMykgKyAnLCcgKyBjdXJ2ZS5jb250cm9sMi55LnRvRml4ZWQoMykgKyAnICcpICsgKGN1cnZlLmVuZFBvaW50LngudG9GaXhlZCgzKSArICcsJyArIGN1cnZlLmVuZFBvaW50LnkudG9GaXhlZCgzKSk7XG5cbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdkJywgYXR0cik7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgKHdpZHRocy5lbmQgKiAyLjI1KS50b0ZpeGVkKDMpKTtcbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2UnLCBjb2xvcik7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVjYXAnLCAncm91bmQnKTtcblxuICAgICAgc3ZnLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgIH1cbiAgfSwgZnVuY3Rpb24gKHJhd1BvaW50KSB7XG4gICAgdmFyIGNpcmNsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NpcmNsZScpO1xuICAgIHZhciBkb3RTaXplID0gdHlwZW9mIF90aGlzMi5kb3RTaXplID09PSAnZnVuY3Rpb24nID8gX3RoaXMyLmRvdFNpemUoKSA6IF90aGlzMi5kb3RTaXplO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ3InLCBkb3RTaXplKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCdjeCcsIHJhd1BvaW50LngpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N5JywgcmF3UG9pbnQueSk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHJhd1BvaW50LmNvbG9yKTtcblxuICAgIHN2Zy5hcHBlbmRDaGlsZChjaXJjbGUpO1xuICB9KTtcblxuICB2YXIgcHJlZml4ID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJztcbiAgdmFyIGhlYWRlciA9ICc8c3ZnJyArICcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiJyArICcgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCInICsgKCcgdmlld0JveD1cIicgKyBtaW5YICsgJyAnICsgbWluWSArICcgJyArIG1heFggKyAnICcgKyBtYXhZICsgJ1wiJykgKyAoJyB3aWR0aD1cIicgKyBtYXhYICsgJ1wiJykgKyAoJyBoZWlnaHQ9XCInICsgbWF4WSArICdcIicpICsgJz4nO1xuICB2YXIgYm9keSA9IHN2Zy5pbm5lckhUTUw7XG5cbiAgLy8gSUUgaGFjayBmb3IgbWlzc2luZyBpbm5lckhUTUwgcHJvcGVydHkgb24gU1ZHRWxlbWVudFxuICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGR1bW15ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZHVtbXknKTtcbiAgICB2YXIgbm9kZXMgPSBzdmcuY2hpbGROb2RlcztcbiAgICBkdW1teS5pbm5lckhUTUwgPSAnJztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGR1bW15LmFwcGVuZENoaWxkKG5vZGVzW2ldLmNsb25lTm9kZSh0cnVlKSk7XG4gICAgfVxuXG4gICAgYm9keSA9IGR1bW15LmlubmVySFRNTDtcbiAgfVxuXG4gIHZhciBmb290ZXIgPSAnPC9zdmc+JztcbiAgdmFyIGRhdGEgPSBoZWFkZXIgKyBib2R5ICsgZm9vdGVyO1xuXG4gIHJldHVybiBwcmVmaXggKyBidG9hKGRhdGEpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5mcm9tRGF0YSA9IGZ1bmN0aW9uIChwb2ludEdyb3Vwcykge1xuICB2YXIgX3RoaXMzID0gdGhpcztcblxuICB0aGlzLmNsZWFyKCk7XG5cbiAgdGhpcy5fZnJvbURhdGEocG9pbnRHcm91cHMsIGZ1bmN0aW9uIChjdXJ2ZSwgd2lkdGhzKSB7XG4gICAgcmV0dXJuIF90aGlzMy5fZHJhd0N1cnZlKGN1cnZlLCB3aWR0aHMuc3RhcnQsIHdpZHRocy5lbmQpO1xuICB9LCBmdW5jdGlvbiAocmF3UG9pbnQpIHtcbiAgICByZXR1cm4gX3RoaXMzLl9kcmF3RG90KHJhd1BvaW50KTtcbiAgfSk7XG5cbiAgdGhpcy5fZGF0YSA9IHBvaW50R3JvdXBzO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS50b0RhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9kYXRhO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2lnbmF0dXJlUGFkO1xuIiwidmFyIGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG52YXIgcHJlZml4ID0gJ0ludmFyaWFudCBmYWlsZWQnO1xuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNQcm9kdWN0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcmVmaXgpO1xuICAgIH1cbiAgICB2YXIgcHJvdmlkZWQgPSB0eXBlb2YgbWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyA/IG1lc3NhZ2UoKSA6IG1lc3NhZ2U7XG4gICAgdmFyIHZhbHVlID0gcHJvdmlkZWQgPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiOiBcIikuY29uY2F0KHByb3ZpZGVkKSA6IHByZWZpeDtcbiAgICB0aHJvdyBuZXcgRXJyb3IodmFsdWUpO1xufVxuXG5leHBvcnQgeyBpbnZhcmlhbnQgYXMgZGVmYXVsdCB9O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cbiAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcbiAgdmFyIGksIHA7XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gIHJldHVybiBjb29rZWQ7XG59O1xuXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xuICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcbiAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xuICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xuICAgIGlmIChhc3luYykge1xuICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgfVxuICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcbiAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICB9XG4gIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcbiAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0bG9hZGVkOiBmYWxzZSxcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG5cdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwidmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mID8gKG9iaikgPT4gKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSA6IChvYmopID0+IChvYmouX19wcm90b19fKTtcbnZhciBsZWFmUHJvdG90eXBlcztcbi8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLy8gbW9kZSAmIDE2OiByZXR1cm4gdmFsdWUgd2hlbiBpdCdzIFByb21pc2UtbGlrZVxuLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuX193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcblx0aWYobW9kZSAmIDEpIHZhbHVlID0gdGhpcyh2YWx1ZSk7XG5cdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG5cdGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUpIHtcblx0XHRpZigobW9kZSAmIDQpICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcblx0XHRpZigobW9kZSAmIDE2KSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbHVlO1xuXHR9XG5cdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG5cdHZhciBkZWYgPSB7fTtcblx0bGVhZlByb3RvdHlwZXMgPSBsZWFmUHJvdG90eXBlcyB8fCBbbnVsbCwgZ2V0UHJvdG8oe30pLCBnZXRQcm90byhbXSksIGdldFByb3RvKGdldFByb3RvKV07XG5cdGZvcih2YXIgY3VycmVudCA9IG1vZGUgJiAyICYmIHZhbHVlOyB0eXBlb2YgY3VycmVudCA9PSAnb2JqZWN0JyAmJiAhfmxlYWZQcm90b3R5cGVzLmluZGV4T2YoY3VycmVudCk7IGN1cnJlbnQgPSBnZXRQcm90byhjdXJyZW50KSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGN1cnJlbnQpLmZvckVhY2goKGtleSkgPT4gKGRlZltrZXldID0gKCkgPT4gKHZhbHVlW2tleV0pKSk7XG5cdH1cblx0ZGVmWydkZWZhdWx0J10gPSAoKSA9PiAodmFsdWUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGRlZik7XG5cdHJldHVybiBucztcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsInZhciBzY3JpcHRVcmw7XG5pZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMpIHNjcmlwdFVybCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbiArIFwiXCI7XG52YXIgZG9jdW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7XG5pZiAoIXNjcmlwdFVybCAmJiBkb2N1bWVudCkge1xuXHRpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1NDUklQVCcpXG5cdFx0c2NyaXB0VXJsID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7XG5cdGlmICghc2NyaXB0VXJsKSB7XG5cdFx0dmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNjcmlwdFwiKTtcblx0XHRpZihzY3JpcHRzLmxlbmd0aCkge1xuXHRcdFx0dmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7XG5cdFx0XHR3aGlsZSAoaSA+IC0xICYmICghc2NyaXB0VXJsIHx8ICEvXmh0dHAocz8pOi8udGVzdChzY3JpcHRVcmwpKSkgc2NyaXB0VXJsID0gc2NyaXB0c1tpLS1dLnNyYztcblx0XHR9XG5cdH1cbn1cbi8vIFdoZW4gc3VwcG9ydGluZyBicm93c2VycyB3aGVyZSBhbiBhdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIHlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0LnB1YmxpY1BhdGggbWFudWFsbHkgdmlhIGNvbmZpZ3VyYXRpb25cbi8vIG9yIHBhc3MgYW4gZW1wdHkgc3RyaW5nIChcIlwiKSBhbmQgc2V0IHRoZSBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyB2YXJpYWJsZSBmcm9tIHlvdXIgY29kZSB0byB1c2UgeW91ciBvd24gbG9naWMuXG5pZiAoIXNjcmlwdFVybCkgdGhyb3cgbmV3IEVycm9yKFwiQXV0b21hdGljIHB1YmxpY1BhdGggaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXJcIik7XG5zY3JpcHRVcmwgPSBzY3JpcHRVcmwucmVwbGFjZSgvIy4qJC8sIFwiXCIpLnJlcGxhY2UoL1xcPy4qJC8sIFwiXCIpLnJlcGxhY2UoL1xcL1teXFwvXSskLywgXCIvXCIpO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gc2NyaXB0VXJsOyIsIl9fd2VicGFja19yZXF1aXJlX18uYiA9IGRvY3VtZW50LmJhc2VVUkkgfHwgc2VsZi5sb2NhdGlvbi5ocmVmO1xuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwibWFpblwiOiAwXG59O1xuXG4vLyBubyBjaHVuayBvbiBkZW1hbmQgbG9hZGluZ1xuXG4vLyBubyBwcmVmZXRjaGluZ1xuXG4vLyBubyBwcmVsb2FkZWRcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdFxuXG4vLyBubyBvbiBjaHVua3MgbG9hZGVkXG5cbi8vIG5vIGpzb25wIGZ1bmN0aW9uIiwiX193ZWJwYWNrX3JlcXVpcmVfXy5uYyA9IHVuZGVmaW5lZDsiLCJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XHJcbmltcG9ydCBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiO1xyXG5pbXBvcnQgUGRmUmVxdWVzdEZpbGVzIGZyb20gXCIuLi9wYWdlcy9QZGZSZXF1ZXN0RmlsZXNcIjtcclxuaW1wb3J0IHsgcGRmanMgfSBmcm9tIFwicmVhY3QtcGRmXCI7XHJcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSBcInJlYWN0LXJlZHV4XCI7XHJcbmltcG9ydCB7IHN0b3JlIH0gZnJvbSBcIi4uL3JlZHV4L3N0b3JlXCI7XHJcbmltcG9ydCBcIi4uL2luZGV4LmNzc1wiO1xyXG5pbXBvcnQgXCIuL2kxOG5cIjtcclxuaW1wb3J0IHsgaXNQdWJsaWNTdGFnaW5nIH0gZnJvbSBcIi4uL2NvbnN0YW50L2NvbnN0XCI7XHJcbnBkZmpzLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID0gYC8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3BkZi5qcy8ke3BkZmpzLnZlcnNpb259L3BkZi53b3JrZXIubWluLm1qc2A7XHJcblxyXG4vLyBXcmFwcGVyIGNvbXBvbmVudCB0byBtYW5hZ2UgcHJvcHNcclxuY29uc3QgUHVibGljU2NyaXB0RmlsZVdyYXBwZXIgPSAoeyBpbml0aWFsUHJvcHMgfSkgPT4ge1xyXG4gIGNvbnN0IFtwcm9wcywgc2V0UHJvcHNdID0gdXNlU3RhdGUoaW5pdGlhbFByb3BzKTtcclxuXHJcbiAgLy8gTWFrZSB0aGUgc2V0UHJvcHMgZnVuY3Rpb24gZ2xvYmFsbHkgYWNjZXNzaWJsZVxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICB3aW5kb3cudXBkYXRlUHVibGljVGVtcGxhdGVQcm9wcyA9IHNldFByb3BzO1xyXG5cclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIHdpbmRvdy51cGRhdGVQdWJsaWNUZW1wbGF0ZVByb3BzID0gdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuICB9LCBbXSk7XHJcblxyXG4gIHJldHVybiA8UGRmUmVxdWVzdEZpbGVzIHsuLi5wcm9wc30gLz47XHJcbn07XHJcblxyXG5jb25zdCBhcHBJZCA9IGlzUHVibGljU3RhZ2luZyA/IFwib3BlbnNpZ25cIiA6IFwibGVnYWRyYW5heG5cIjtcclxuLy9cIm9wZW5zaWduXCJcclxuXHJcbmNvbnN0IHNlcnZlclVybCA9IGlzUHVibGljU3RhZ2luZ1xyXG4gID8gXCJodHRwczovL3N0YWdpbmctYXBwLm9wZW5zaWdubGFicy5jb20vYXBpL2FwcFwiXHJcbiAgOiBcImh0dHBzOi8vYXBwLm9wZW5zaWdubGFicy5jb20vYXBpL2FwcFwiO1xyXG4vLyAgXCJodHRwczovL3N0YWdpbmctYXBwLm9wZW5zaWdubGFicy5jb20vYXBpL2FwcFwiXHJcblxyXG5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImJhc2VVcmxcIiwgYCR7c2VydmVyVXJsfS9gKTtcclxubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJwYXJzZUFwcElkXCIsIGFwcElkKTtcclxuUGFyc2UuaW5pdGlhbGl6ZShhcHBJZCk7XHJcblBhcnNlLnNlcnZlclVSTCA9IHNlcnZlclVybDtcclxuLy8gQ3JlYXRlIGEgbmV3IGRpdiBlbGVtZW50IGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJvZHlcclxuY29uc3Qgc2NyaXB0Q29tcG9uZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuc2NyaXB0Q29tcG9uZW50LmlkID0gXCJzY3JpcHQtY29tcG9uZW50XCI7XHJcbmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0Q29tcG9uZW50KTtcclxuY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xyXG5saW5rLmhyZWYgPSBcImh0dHBzOi8vY2RuLm9wZW5zaWdubGFicy5jb20vZm9udHMuY3NzXCI7XHJcbmxpbmsucmVsID0gXCJzdHlsZXNoZWV0XCI7XHJcbmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XHJcblxyXG4vL2FkZCB0aGUgVGFpbHdpbmQgQ1NTIGZpbGVcclxuY29uc3QgdGFpbHdpbmRDc3NMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XHJcbnRhaWx3aW5kQ3NzTGluay5ocmVmID1cclxuICBcImh0dHBzOi8vYXBwLm9wZW5zaWdubGFicy5jb20vc3RhdGljL2pzL3B1YmxpYy10ZW1wbGF0ZS5idW5kbGUuY3NzXCI7IC8vIGNzcyBidW5kbGUgZmlsZVxyXG50YWlsd2luZENzc0xpbmsucmVsID0gXCJzdHlsZXNoZWV0XCI7XHJcbmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGFpbHdpbmRDc3NMaW5rKTtcclxuLy8gQ3JlYXRlIGEgcm9vdCBhbmQgcmVuZGVyIHRoZSB3cmFwcGVyIGNvbXBvbmVudCB3aXRoIGluaXRpYWwgcHJvcHNcclxuY29uc3Qgcm9vdCA9IFJlYWN0RE9NLmNyZWF0ZVJvb3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzY3JpcHQtY29tcG9uZW50XCIpKTtcclxucm9vdC5yZW5kZXIoXHJcbiAgPGRpdiBkYXRhLXRoZW1lPVwib3BlbnNpZ25jc3NcIj5cclxuICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmV9PlxyXG4gICAgICA8UHVibGljU2NyaXB0RmlsZVdyYXBwZXIgaW5pdGlhbFByb3BzPXt7IHRleHQ6IFwidGVtcGxhdGVJZFwiIH19IC8+XHJcbiAgICA8L1Byb3ZpZGVyPlxyXG4gIDwvZGl2PlxyXG4pO1xyXG4iXSwibmFtZXMiOlsiUmVhY3QiLCJIZWxtZXQiLCJUaXRsZSIsIl9yZWYiLCJ0aXRsZSIsImRyaXZlIiwiY3JlYXRlRWxlbWVudCIsIm5hbWUiLCJjb250ZW50IiwicmVsIiwidHlwZSIsImhyZWYiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwic2l6ZXMiLCJCb3JkZXJSZXNpemUiLCJyaWdodCIsInRvcCIsImNsYXNzTmFtZSIsInVzZVRyYW5zbGF0aW9uIiwiRGVmYXVsdFNpZ25hdHVyZSIsImRlZmF1bHRTaWduSW1nIiwieHlQb3N0aW9uIiwic2V0RGVmYXVsdFNpZ25BbGVydCIsInQiLCJjb25maXJtVG9hZGREZWZhdWx0U2lnbiIsImxlbmd0aCIsImlzU2hvdyIsImFsZXJ0TWVzc2FnZSIsImFsdCIsInNyYyIsIm9uQ2xpY2siLCJ1c2VTdGF0ZSIsIlByZXZOZXh0IiwiaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZSIsImhhbmRsZURvd25sb2FkUGRmIiwiaGFuZGxlVG9QcmludCIsIkRyb3Bkb3duTWVudSIsIk1vZGFsVWkiLCJMb2FkZXIiLCJIZWFkZXIiLCJpc1BkZlJlcXVlc3RGaWxlcyIsImlzUGxhY2Vob2xkZXIiLCJzZXRJc0RlY2xpbmUiLCJwYWdlTnVtYmVyIiwiYWxsUGFnZXMiLCJjaGFuZ2VQYWdlIiwicGRmVXJsIiwiZW1iZWRXaWRnZXRzRGF0YSIsInBkZkRldGFpbHMiLCJzaWduZXJQb3MiLCJzaWduZXJzZGF0YSIsImlzTWFpbFNlbmQiLCJhbGVydFNlbmRFbWFpbCIsImlzQ29tcGxldGVkIiwiaXNTaG93SGVhZGVyIiwiZGVjbGluZSIsImN1cnJlbnRTaWduZXIiLCJhbHJlYWR5U2lnbiIsImlzU2lnbllvdXJzZWxmIiwic2V0SXNFbWFpbCIsImNvbXBsZXRlQnRuVGl0bGUiLCJzZXRJc0VkaXRUZW1wbGF0ZSIsImlzUHVibGljVGVtcGxhdGUiLCJjbGlja09uWm9vbUluIiwiY2xpY2tPblpvb21PdXQiLCJoYW5kbGVSb3RhdGlvbkZ1biIsImlzRGlzYWJsZVJvdGF0ZSIsImZpbHRlclByZWZpbGwiLCJmaWx0ZXIiLCJkYXRhIiwiUm9sZSIsImlzTW9iaWxlIiwid2luZG93IiwiaW5uZXJXaWR0aCIsImlzRG93bmxvYWRpbmciLCJzZXRJc0Rvd25sb2FkaW5nIiwiaXNHdWVzdFNpZ25lciIsImhhbmRsZURlY2xpbmVQZGZBbGVydCIsImN1cnJlbnREZWNsaW5lIiwiY3Vycm50IiwiaXNEZWNsaW5lZCIsImlkIiwic3R5bGUiLCJ3aWR0aCIsImhpc3RvcnkiLCJnbyIsIlJvb3QiLCJUcmlnZ2VyIiwiYXNDaGlsZCIsIlBvcnRhbCIsIkNvbnRlbnQiLCJzaWRlT2Zmc2V0IiwiSXRlbSIsImUiLCJVUkwiLCJGcmFnbWVudCIsImRpc2FibGVkIiwiaXNPcGVuIiwiaGFuZGxlQ2xvc2UiLCJQZGZab29tIiwicHJvcHMiLCJjdXJzb3IiLCJ6b29tUGVyY2VudCIsInVzZUVmZmVjdCIsIlBsYWNlaG9sZGVyQm9yZGVyIiwiUm5kIiwiZGVmYXVsdFdpZHRoSGVpZ2h0IiwiZm9udENvbG9yQXJyIiwiZm9udHNpemVBcnIiLCJnZXRDb250YWluZXJTY2FsZSIsImhhbmRsZUNvcHlOZXh0VG9XaWRnZXQiLCJpc1RhYkFuZE1vYmlsZSIsIm9uQ2hhbmdlSW5wdXQiLCJyYWRpb0J1dHRvbldpZGdldCIsInRleHRJbnB1dFdpZGdldCIsInRleHRXaWRnZXQiLCJQbGFjZWhvbGRlclR5cGUiLCJtb21lbnQiLCJzZWxlY3RGb3JtYXQiLCJjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQiLCJmb3JtYXQiLCJnZXREZWZhdWx0ZGF0ZSIsInNlbGVjdGVkRGF0ZSIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsImRhdGUiLCJuZXdkYXRlIiwiRGF0ZSIsImRheSIsIm1vbnRoIiwieWVhciIsInNwbGl0IiwidmFsdWUiLCJnZXREZWZhdWx0Rm9ybWF0IiwiZGF0ZUZvcm1hdCIsIlBsYWNlaG9sZGVyIiwicGxhY2Vob2xkZXJCb3JkZXIiLCJzZXRQbGFjZWhvbGRlckJvcmRlciIsInciLCJoIiwiaXNEcmFnZ2luZ0VuYWJsZWQiLCJzZXREcmFnZ2luZ0VuYWJsZWQiLCJpc0RhdGVNb2RhbCIsInNldElzRGF0ZU1vZGFsIiwiY29udGFpbmVyU2NhbGUiLCJzZXRDb250YWluZXJTY2FsZSIsInNlbGVjdERhdGUiLCJzZXRTZWxlY3REYXRlIiwicG9zIiwib3B0aW9ucyIsInJlc3BvbnNlIiwidmFsaWRhdGlvbiIsImdldFRpbWUiLCJzZXREYXRlRm9ybWF0Iiwic3RhcnREYXRlIiwic2V0U3RhcnREYXRlIiwiZ2V0Q2hlY2tib3hSZW5kZXJXaWR0aCIsInNldEdldENoZWNrYm94UmVuZGVyV2lkdGgiLCJoZWlnaHQiLCJnZXRQZGZQYWdlV2lkdGgiLCJwZGZPcmlnaW5hbFdIIiwiZmluZCIsImNvbnRhaW5lcldIIiwiZGF0ZUZvcm1hdEFyciIsInVwZGF0ZVdpZHRoIiwicm5kRWxlbWVudCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJrZXkiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0aW1lciIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJjbG9zZU1lbnVPbk91dHNpZGVDbGljayIsInRhcmdldCIsImNsb3Nlc3QiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNoYW5nZURhdGVGb3JtYXQiLCJ1cGRhdGVEYXRlIiwibWFwIiwibWlsbGlzZWNvbmRzIiwibmV3RGF0ZSIsImRhdGVPYmoiLCJwdXNoIiwiaGFuZGxlV2lkZ2V0SWRhbmRQb3B1cCIsInNldFNlbGVjdFdpZGdldElkIiwid2lkZ2V0VHlwZUV4aXN0IiwiaW5jbHVkZXMiLCJpc05lZWRTaWduIiwiaXNEcmFnZ2luZyIsImlzcHVibGljVGVtcGxhdGUiLCJoYW5kbGVVc2VyRGV0YWlscyIsInNldElzU2lnblBhZCIsInNldFNpZ25LZXkiLCJzZXRJc1N0YW1wIiwiaXNTdGFtcCIsInNldElzSW5pdGlhbCIsInNlbGVjdFdpZGdldElkIiwiaGFuZGxlTGlua1VzZXIiLCJJZCIsInNldFVuaXF1ZUlkIiwiY2hlY2tJbmRleCIsImZpbmRJbmRleCIsInNldElzU2VsZWN0SWQiLCJzaWduZXJPYmpJZCIsImhhbmRsZU9uQ2xpY2tQbGFjZWhvbGRlciIsInNldEN1cnJXaWRnZXRzRGV0YWlscyIsInNldFdpZGdldFR5cGUiLCJ1bmlxdWVJZCIsImhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbiIsInNldElzUmFkaW8iLCJzZXRTaG93RHJvcGRvd24iLCJzZXRJc0NoZWNrYm94IiwiaGFuZGxlVGV4dFNldHRpbmdNb2RhbCIsImhhbmRsZU5hbWVNb2RhbCIsInNldFNpZ25lck9iaklkIiwic2V0VGVtcFNpZ25lcklkIiwiaGFuZGxlQ29weVBsYWNlaG9sZGVyIiwic3RvcFByb3BhZ2F0aW9uIiwic2V0SXNQYWdlQ29weSIsImluZGV4Iiwic2V0WHlQb3N0aW9uIiwiaGFuZGxlU2F2ZURhdGUiLCJpc0RhdGVDaGFuZ2UiLCJmb250U2l6ZSIsImZvbnRDb2xvciIsIlBsYWNlaG9sZGVySWNvbiIsImlzU2hvd0JvcmRlciIsIm9uVG91Y2hFbmQiLCJjb2xvciIsInpJbmRleCIsImhhbmRsZURlbGV0ZVNpZ24iLCJ4UG9zIiwic2lnbllvdXJzZWxmIiwicmVzaXplUG9zIiwieFBvc2l0aW9uIiwic2NhbGUiLCJ5UG9zIiwieVBvc2l0aW9uIiwiZ2V0Q3Vyc29yIiwidW5TaWduZWRXaWRnZXRJZCIsImxvY2tBc3BlY3RSYXRpbyIsIldpZHRoIiwiSGVpZ2h0IiwiZW5hYmxlUmVzaXppbmciLCJib3R0b20iLCJsZWZ0IiwidG9wUmlnaHQiLCJib3R0b21SaWdodCIsImJvdHRvbUxlZnQiLCJ0b3BMZWZ0IiwiYm91bmRzIiwiYm9yZGVyIiwiYm9yZGVyUmFkaXVzIiwidGV4dEFsaWduIiwiYmFja2dyb3VuZCIsImJsb2NrQ29sb3IiLCJvbkRyYWciLCJoYW5kbGVUYWJEcmFnIiwic2l6ZSIsInBvc1dpZHRoIiwicG9zSGVpZ2h0Iiwib25SZXNpemVTdGFydCIsInNldElzUmVzaXplIiwib25SZXNpemVTdG9wIiwiZGlyZWN0aW9uIiwicmVmIiwiaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemUiLCJpc1Jlc2l6ZSIsImRpc2FibGVEcmFnZ2luZyIsIm9uRHJhZ1N0b3AiLCJldmVudCIsImRyYWdFbGVtZW50IiwiaGFuZGxlU3RvcCIsInBvc2l0aW9uIiwieCIsInkiLCJvblJlc2l6ZSIsIm9mZnNldFdpZHRoIiwib2Zmc2V0SGVpZ2h0IiwiaXNTaG93RHJvcGRvd24iLCJoYW5kbGVVc2VyTmFtZSIsInNldFZhbGlkYXRlQWxlcnQiLCJzaG93Q2xvc2UiLCJkZWZhdWx0VmFsdWUiLCJvbkNoYW5nZSIsInNlbGVjdGVkSW5kZXgiLCJpbmQiLCJjdXJyV2lkZ2V0c0RldGFpbHMiLCJzZXRGb250U2l6ZSIsInNldEZvbnRDb2xvciIsInRoZW1lQ29sb3IiLCJyZXNpemVCb3JkZXJFeHRyYVdpZHRoIiwiZ2V0UmVzaXplQm9yZGVyRXh0cmFXaWR0aCIsImRlZmF1bHRXaWR0aCIsImRlZmF1bHRIZWlnaHQiLCJnZXRXaWR0aCIsImdldEhlaWdodCIsImhhbmRsZU1pbldpZHRoIiwiaGFuZGxlTWluSGVpZ2h0Iiwib25Nb3VzZUVudGVyIiwiYm9yZGVyQ29sb3IiLCJtaW5XaWR0aCIsIm1pbkhlaWdodCIsImZvcndhcmRSZWYiLCJ1c2VSZWYiLCJnZXRNb250aCIsImdldFllYXIiLCJvbkNoYW5nZUhlaWdodE9mVGV4dEFyZWEiLCJyYW5nZSIsIkRhdGVQaWNrZXIiLCJSZWdleFBhcnNlciIsImVtYWlsUmVnZXgiLCJ0ZXh0V2lkZ2V0Q2xzIiwic2VsZWN0V2lkZ2V0Q2xzIiwid2lkZ2V0VHlwZVRyYXNsYXRpb24iLCJzZWxlY3RPcHRpb24iLCJzZXRTZWxlY3RPcHRpb24iLCJ2YWxpZGF0ZVBsYWNlaG9sZGVyIiwic2V0VmFsaWRhdGVQbGFjZWhvbGRlciIsImlucHV0UmVmIiwidGV4dFZhbHVlIiwic2V0VGV4dFZhbHVlIiwic2VsZWN0ZWRDaGVja2JveCIsInNldFNlbGVjdGVkQ2hlY2tib3giLCJ5ZWFycyIsIm1vbnRocyIsInZhbGlkYXRlRXhwcmVzc2lvbiIsInJlZ2V4VmFsaWRhdGlvbiIsInJlZ2V4T2JqZWN0IiwiaXNWYWxpZGF0ZSIsInRlc3QiLCJjdXJyZW50IiwiZm9jdXMiLCJoYW5kbGVJbnB1dEJsdXIiLCJ2YWxpZGF0ZVR5cGUiLCJwYXR0ZXJuIiwiaGFuZGxlVGV4dFZhbGlkIiwidGV4dElucHV0IiwiY2hlY2tSZWd1bGFyRXhwcmVzcyIsImlzRGVmYXVsdFZhbHVlIiwiaGludCIsImRlZmF1bHREYXRhIiwiRXhhbXBsZUN1c3RvbUlucHV0IiwiZm9udEZhbWlseSIsImRpc3BsYXlOYW1lIiwiaXNEZWZhdWx0Iiwic2VuZGVyVXNlciIsImpzb25TZW5kZXIiLCJKU09OIiwicGFyc2UiLCJzZWxlY3RDaGVja2JveCIsInJlcyIsImRlZmF1bHRDaGVjayIsImlzU2VsZWN0SW5kZXgiLCJpbmRleE9mIiwiaGFuZGxlUmFkaW9DaGVjayIsImhhbmRsZUNoZWNrYm94VmFsdWUiLCJpc0NoZWNrZWQiLCJ1cGRhdGVTZWxlY3RlZENoZWNrYm94IiwiY2hlY2tlZExpc3QiLCJpc0RlZmF1bHRFbXB0eSIsImhhbmRsZUNoZWNrUmFkaW8iLCJpc1JhZGlvIiwiaGFuZGxlT25EYXRlQ2hhbmdlIiwiaGFuZGxlRW50ZXJQcmVzcyIsIlNpZ25VcmwiLCJkcmFnZ2FibGUiLCJ2YWx1ZXMiLCJvbkJsdXIiLCJpc1JlYWRPbmx5IiwiY2hlY2tlZCIsIm1heFJlcXVpcmVkIiwibWF4UmVxdWlyZWRDb3VudCIsIm1heENvdW50SW50IiwicGFyc2VJbnQiLCJpc0hpZGVMYWJlbCIsInBsYWNlaG9sZGVyIiwicm93cyIsIm9uS2V5RG93biIsImNvbHMiLCJvdmVyZmxvdyIsImhpZGRlbiIsInJlbmRlckN1c3RvbUhlYWRlciIsIl9yZWYyIiwiY2hhbmdlWWVhciIsImNoYW5nZU1vbnRoIiwiX3JlZjMiLCJvcHRpb24iLCJfcmVmNCIsImNsb3NlT25TY3JvbGwiLCJzZWxlY3RlZCIsInBvcHBlclBsYWNlbWVudCIsImN1c3RvbUlucHV0IiwibWFyZ2luVG9wIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJEb2N1bWVudCIsIlBhZ2UiLCJ1c2VTZWxlY3RvciIsIlJlbmRlckFsbFBkZlBhZ2UiLCJzaWduUGRmVXJsIiwic2V0QWxsUGFnZXMiLCJzZXRQYWdlTnVtYmVyIiwic2V0U2lnbkJ0blBvc2l0aW9uIiwic2lnbmVyT2JqZWN0SWQiLCJwZGZSb3RhdGVCYXNlNjQiLCJzaWduUGFnZU51bWJlciIsInNldFNpZ25QYWdlTnVtYmVyIiwiYm9va21hcmtDb2xvciIsInNldEJvb2ttYXJrQ29sb3IiLCJvbkRvY3VtZW50TG9hZCIsIm51bVBhZ2VzIiwiY2hlY2tVc2VyIiwicGFnZU51bWJlckFyciIsInBsYWNlSG9sZGVyIiwicGFnZUNvbnRhaW5lciIsImlzSGVhZGVyIiwic3RhdGUiLCJzaG93SGVhZGVyIiwicGFnZVdpZHRoIiwic2V0UGFnZVdpZHRoIiwidXBkYXRlU2l6ZSIsImFkZFNpZ25hdHVyZUJvb2ttYXJrIiwiaXNwYWdlTnVtYmVyIiwicGRmRGF0YUJhc2U2NCIsImxvYWRpbmciLCJvbkxvYWRTdWNjZXNzIiwiZmlsZSIsIkFycmF5IiwiZnJvbSIsImVsIiwicmVuZGVyQW5ub3RhdGlvbkxheWVyIiwicmVuZGVyVGV4dExheWVyIiwiUlNDIiwiaGFuZGxlSW1hZ2VSZXNpemUiLCJBbGVydCIsIlJlbmRlclBkZiIsImRyb3AiLCJzdWNjZXNzRW1haWwiLCJwYWdlRGV0YWlscyIsInBkZlJlcXVlc3QiLCJzaWduZWRTaWduZXJzIiwicGRmTG9hZCIsInNldFBkZkxvYWQiLCJzZXRTaWduZXJQb3MiLCJzZXRJc1ZhbGlkYXRlIiwiSXNSZXNpemUiLCJjaGVja1NpZ25lZFNpZ25lcnMiLCJjaGVja1NpZ24iLCJzaWduIiwib2JqZWN0SWQiLCJoYW5kbGVBbGxVc2VyTmFtZSIsIlNpZ25lcnMiLCJzaWduZXIiLCJOYW1lIiwicGxhY2VEYXRhIiwiYm94U2hhZG93IiwiaW5uZXJIZWlnaHQiLCJub1Njcm9sbFkiLCJub1Njcm9sbFgiLCJvbkxvYWRFcnJvciIsIlNpZ25lZFVybCIsIm9uR2V0QW5ub3RhdGlvbnNFcnJvciIsImVycm9yIiwiY29uc29sZSIsImxvZyIsIlNpZ25hdHVyZUNhbnZhcyIsIlNpZ25QYWQiLCJpc1NpZ25QYWQiLCJzZXRJc0ltYWdlU2VsZWN0Iiwib25TYXZlU2lnbiIsInNldEltYWdlIiwiaXNJbWFnZVNlbGVjdCIsImltYWdlUmVmIiwib25JbWFnZUNoYW5nZSIsIm9uU2F2ZUltYWdlIiwiaW1hZ2UiLCJkZWZhdWx0U2lnbiIsInNldFNpZ25hdHVyZSIsIm15SW5pdGlhbCIsImlzSW5pdGlhbCIsIndpZGdldFR5cGUiLCJwZW5Db2xvciIsInNldFBlbkNvbG9yIiwiYWxsQ29sb3IiLCJjYW52YXNSZWYiLCJpc0RlZmF1bHRTaWduIiwic2V0SXNEZWZhdWx0U2lnbiIsImlzVGFiIiwic2V0SXNUYWIiLCJpc1NpZ25JbWciLCJzZXRJc1NpZ25JbWciLCJzaWduVmFsdWUiLCJzZXRTaWduVmFsdWUiLCJ0ZXh0V2lkdGgiLCJzZXRUZXh0V2lkdGgiLCJ0ZXh0SGVpZ2h0Iiwic2V0VGV4dEhlaWdodCIsInNpZ25hdHVyZVR5cGUiLCJzZXRTaWduYXR1cmVUeXBlIiwiZm9udE9wdGlvbnMiLCJmb250U2VsZWN0Iiwic2V0Rm9udFNlbGVjdCIsImN1cnJlbnRVc2VyTmFtZSIsImhhbmRsZUNsZWFyIiwiY2xlYXIiLCJoYW5kbGVTaWduYXR1cmVDaGFuZ2UiLCJTYXZlQnRuIiwiaXNXaWRnZXRUeXBlIiwidXJsIiwiZnJvbURhdGFVUkwiLCJ0cmltbWVkTmFtZSIsInRyaW0iLCJmaXJzdENoYXJhY3RlciIsImNoYXJBdCIsInVzZXJOYW1lIiwibG9hZEZvbnQiLCJmb250cyIsImxvYWQiLCJzZWxlY3RGb250U1R5bGUiLCJmb250IiwiY29udmVydFRvSW1nIiwiZm9udFN0eWxlIiwidGV4dCIsInRleHRDb250ZW50IiwiZm9udGZhbWlseSIsImZvbnRTaXplVmFsdWUiLCJzcGFuIiwiZGlzcGxheSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNhbnZhc0VsZW1lbnQiLCJjdHgiLCJnZXRDb250ZXh0IiwicGl4ZWxSYXRpbyIsImRldmljZVBpeGVsUmF0aW8iLCJhZGRFeHRyYVdpZHRoIiwiZmlsbFN0eWxlIiwidGV4dEJhc2VsaW5lIiwiZmlsbFRleHQiLCJyZW1vdmVDaGlsZCIsImRhdGFVcmwiLCJ0b0RhdGFVUkwiLCJQZW5Db2xvckNvbXBvbmVudCIsIm1hcmdpbiIsImJvcmRlckJvdHRvbSIsImZsZXhEaXJlY3Rpb24iLCJqdXN0aWZ5Q29udGVudCIsImFsaWduSXRlbXMiLCJtYXJnaW5Cb3R0b20iLCJjbGljayIsImFjY2VwdCIsIm1heExlbmd0aCIsImJhY2tncm91bmRDb2xvciIsInBhZGRpbmciLCJjYW52YXNQcm9wcyIsIm9uRW5kIiwiZG90U2l6ZSIsImRhcmtlbkNvbG9yIiwiZ2V0Rmlyc3RMZXR0ZXIiLCJTaWduZXJMaXN0Q29tcG9uZW50IiwiY2hlY2tTaWduZXJCYWNrQ29sb3IiLCJvYmoiLCJjaGVja1VzZXJOYW1lQ29sb3IiLCJnZXRCYWNrQ29sb3IiLCJlbWFpbCIsIkVtYWlsIiwiVmVyaWZ5RW1haWwiLCJpc1ZlcmlmeU1vZGFsIiwib25TdWJtaXQiLCJzZXRJc1ZlcmlmeU1vZGFsIiwiaGFuZGxlVmVyaWZ5RW1haWwiLCJvbkludmFsaWQiLCJzZXRDdXN0b21WYWxpZGl0eSIsIm9uSW5wdXQiLCJyZXF1aXJlZCIsIm90cCIsInNldE90cCIsImhhbmRsZVJlc2VuZCIsIm90cExvYWRlciIsImhhbmRsZVZlcmlmeUJ0biIsImF4aW9zIiwiUERGRG9jdW1lbnQiLCJyZ2IiLCJkZWdyZWVzIiwiUGFyc2UiLCJhcHBJbmZvIiwic2F2ZUFzIiwicHJpbnRNb2R1bGUiLCJ2YWxpZHBsYW4iLCJmb250a2l0IiwiZmlsZWFzYnl0ZXMiLCJmaWxlcGF0aCIsImZldGNoIiwiYXJyYXlCdWZmZXIiLCJVaW50OEFycmF5Iiwib3BlbkluTmV3VGFiIiwib3BlbiIsImZldGNoU3Vic2NyaXB0aW9uIiwiZXh0VXNlcklkIiwiY29udGFjdE9iaklkIiwiaXNHdWVzdFNpZ24iLCJFeHRhbmRfQ2xhc3MiLCJleHRDbGFzcyIsImV4dFVzZXIiLCJiYXNlVVJMIiwiaGVhZGVycyIsInNlc3Npb25Ub2tlbiIsInBhcmFtcyIsImNvbnRhY3RJZCIsInRlbmF0UmVzIiwicG9zdCIsInBsYW4iLCJzdGF0dXMiLCJiaWxsaW5nRGF0ZSIsInJlc3VsdCIsImlzU3Vic2NyaWJlZCIsIlBsYW5Db2RlIiwiTmV4dF9iaWxsaW5nX2RhdGUiLCJpc28iLCJhbGxvd2VkVXNlcnMiLCJBbGxvd2VkVXNlcnMiLCJzZXRJdGVtIiwiZXJyIiwiZmV0Y2hTdWJzY3JpcHRpb25JbmZvIiwicHJpY2UiLCJTdWJzY3JpcHRpb25EZXRhaWxzIiwic3Vic2NyaXB0aW9uIiwidG90YWxQcmljZSIsImFtb3VudCIsInBsYW5JZCIsInN1YnNjcmlwdGlvbl9pZCIsInBsYW5fY29kZSIsInRvdGFsQWxsb3dlZFVzZXIiLCJjaGVja0lzU3Vic2NyaWJlZCIsImlzVmFsaWQiLCJuYW1lQ29sb3IiLCJ0b0RhdGFVcmwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwib25sb2FkZW5kIiwiZ2V0RHJpdmUiLCJkb2N1bWVudElkIiwic2tpcCIsImxpbWl0IiwiZG9jSWQiLCJkcml2ZURlYXRpbHMiLCJzZXNzaW9udG9rZW4iLCJ0aGVuIiwiTGlzdGRhdGEiLCJqc29uIiwiY2F0Y2giLCJwZGZOZXdXaWR0aEZ1biIsImRpdlJlZiIsInBkZldpZHRoIiwiY29udHJhY3RVc2VycyIsInVzZXJEZXRhaWxzIiwiQ2xvdWQiLCJydW4iLCJzdHJpbmdpZnkiLCJzaWduZXJJZCIsInNob3dSZXNpemUiLCJmaWx0ZXJTaWduZXJQb3MiLCJnZXRQbGFjZUhvbGRlciIsImdldFBhZ2VOdW1lciIsImdldFhZZGF0YSIsImdldFBvc0RhdGEiLCJhZGRTaWduUG9zIiwibmV3VXBkYXRlU2lnblBvcyIsIm5ld1VwZGF0ZVNpZ25lciIsIndpZGdldHMiLCJpY29uIiwiaWNvblNpemUiLCJnZXREYXRlIiwiYWRkV2lkZ2V0T3B0aW9ucyIsImRlZmF1bHRPcHQiLCJnZXRXaWRnZXRUeXBlIiwiaXRlbSIsIndpZGdldE5hbWUiLCJnZXRCYXNlNjRGcm9tVXJsIiwiYXV0b3NpZ24iLCJibG9iIiwicGRmQmFzZSIsInN1ZmZpeGJhc2U2NCIsInBvcCIsImdldEJhc2U2NEZyb21JTUciLCJjb252ZXJ0UE5HdG9KUEVHIiwiYmFzZTY0RGF0YSIsInJlamVjdCIsImNhbnZhcyIsImltZyIsIkltYWdlIiwib25sb2FkIiwiZmlsbFJlY3QiLCJkcmF3SW1hZ2UiLCJqcGVnQmFzZTY0RGF0YSIsIm9uZXJyb3IiLCJhZGRTaWduIiwibmV3VXBkYXRlVXJsIiwic2lnblBkZkZ1biIsImJhc2U2NFVybCIsImFjdGl2ZU1haWxBZGFwdGVyIiwiaXNDdXN0b21Db21wbGV0aW9uTWFpbCIsInRlbmFudERldGFpbHMiLCJnZXRUZW5hbnREZXRhaWxzIiwibWVzc2FnZSIsIkNvbXBsZXRpb25Cb2R5IiwiQ29tcGxldGlvblN1YmplY3QiLCJnZXRTaWduYXR1cmUiLCJ0eXBlRXhpc3QiLCJzb21lIiwiYmFzZTY0U2lnbiIsImlzVXJsIiwiZmV0Y2hJbWFnZUJhc2U2NCIsImdldE5ld3NlNjQiLCJjaGFuZ2VJbWFnZVdIIiwibWFpbFByb3ZpZGVyIiwicGRmRmlsZSIsInVzZXJJZCIsInNpZ25hdHVyZSIsInJlc1NpZ25QZGYiLCJzaWduZWRQZGYiLCJyYW5kb21JZCIsInJhbmRvbUJ5dGVzIiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwiVWludDE2QXJyYXkiLCJyYW5kb21WYWx1ZSIsInJhbmRvbURpZ2l0IiwiY3JlYXRlRG9jdW1lbnQiLCJ0ZW1wbGF0ZSIsInBsYWNlaG9sZGVycyIsInNpZ25lckRhdGEiLCJEb2MiLCJwbGFjZWhvbGRlcnNBcnIiLCJzaWduZXJzIiwiZm9yRWFjaCIsIl9fdHlwZSIsIlNlbnRUb090aGVycyIsIkRlc2NyaXB0aW9uIiwiTm90ZSIsIlBsYWNlaG9sZGVycyIsIkV4dFVzZXJQdHIiLCJDcmVhdGVkQnkiLCJTZW5kaW5PcmRlciIsIkF1dG9tYXRpY1JlbWluZGVycyIsIlJlbWluZE9uY2VJbkV2ZXJ5IiwiZmlyc3RMZXR0ZXIiLCJmYWN0b3IiLCJoZXgiLCJyZXBsYWNlIiwiciIsInN1YnN0cmluZyIsImciLCJiIiwiZGFya2VyUiIsIk1hdGgiLCJmbG9vciIsImRhcmtlckciLCJkYXJrZXJCIiwidG9TdHJpbmciLCJwYWRTdGFydCIsImFkZFpJbmRleCIsInNldFpJbmRleCIsInNpZ25LZXkiLCJpbml0aWFsIiwiaXNTaWduZXJzIiwic2lnbmVyUHRyIiwieHlEYXRhIiwiYWRkSW5pdGlhbERhdGEiLCJ1cGRhdGVQb3NpdGlvbiIsInBvc2l0aW9uRGF0YSIsInVwZGF0ZVBsYWNlaG9sZGVyIiwiY2FsY3VsYXRlSW5pdGlhbFdpZHRoSGVpZ2h0Iiwid2lkZ2V0RGF0YSIsImludGlhbFRleHQiLCJ3aWRnZXREYXRhVmFsdWUiLCJDb21wYW55IiwiSm9iVGl0bGUiLCJlbWJlZERvY0lkIiwicGRmRG9jIiwiZm9udEJ5dGVzIiwicmVnaXN0ZXJGb250a2l0IiwiZW1iZWRGb250Iiwic3Vic2V0IiwiaSIsInBhZ2VzIiwiZ2V0UGFnZXMiLCJwYWdlIiwiZ2V0T2JqIiwiY29tcGVuc2F0ZVJvdGF0aW9uIiwiZ2V0Um90YXRpb24iLCJhbmdsZSIsImdldFNpemUiLCJkcmF3VGV4dCIsInNpZ25hdHVyZUltZyIsImltZ1dIIiwiaXNUeXBlVGV4dCIsImdldElNR1dIIiwidXBkYXRlWFlEYXRhIiwiY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8iLCJuZXdXaWR0aCIsIm5ld0hlaWdodCIsInVwZGF0ZVhZcG9zaXRpb24iLCJwbGFjZWhvbGRlckhlaWdodCIsImFzcGVjdFJhdGlvIiwiZ2V0WFlEYXRhIiwiSW1hZ2VUeXBlIiwiaW1nVHlwZSIsIm9uSW1hZ2VTZWxlY3QiLCJzZXRJbWdXSCIsImltYWdlVHlwZSIsImZpbGVzIiwiaW1nUiIsImltYWdlVXJsIiwiYmFzZTY0ZGF0YSIsIkVycm9yIiwiYmFzZTY0SW1hZ2UiLCJyZXNpemVkQmFzZTY0IiwiY2FsY3VsYXRlRm9udFNpemUiLCJzaWdueW91cnNlbGYiLCJnZXRXaWRnZXRzRm9udENvbG9yIiwibXVsdGlTaWduRW1iZWQiLCJ1cGRhdGVJdGVtIiwicGFnZU5vIiwid2lkZ2V0c1Bvc2l0aW9uQXJyIiwiZm9ybSIsImdldEZvcm0iLCJpbWFnZXMiLCJhbGwiLCJzaWduVXJsIiwibmV3VXJsIiwiZW1iZWRKcGciLCJlbWJlZFBuZyIsIndpZGdldFdpZHRoIiwid2lkZ2V0SGVpZ2h0IiwicGxhY2Vob2xkZXJXaWR0aCIsInVwZGF0ZUNvbG9ySW5SZ2IiLCJjaGVja2JveEdhcEZyb21Ub3AiLCJpc0NoZWNrIiwib3B0aW9uc0ZvbnRTaXplIiwiY2hlY2tib3hTaXplIiwiY2hlY2tib3hUZXh0R2FwRnJvbUxlZnQiLCJjaGVja2JveFJhbmRvbUlkIiwiY2hlY2tib3giLCJjcmVhdGVDaGVja0JveCIsIm9wdGlvbnNQb3NpdGlvbiIsImNoZWNrYm94T2JqIiwiZ2V0V2lkZ2V0UG9zaXRpb24iLCJhZGRUb1BhZ2UiLCJjaGVjayIsInVuY2hlY2siLCJlbmFibGVSZWFkT25seSIsImZpeGVkV2lkdGgiLCJpc05ld09uRW50ZXJMaW5lRXhpc3QiLCJOZXdicmVha1RleHRJbnRvTGluZXMiLCJsaW5lcyIsImN1cnJlbnRMaW5lIiwid29yZCIsImxpbmVXaWR0aCIsIndpZHRoT2ZUZXh0QXRTaXplIiwiYnJlYWtUZXh0SW50b0xpbmVzIiwibmV3TGluZSIsImxpbmUiLCJ0ZXh0UG9zaXRpb24iLCJmb250c2l6ZSIsImRyb3Bkb3duUmFuZG9tSWQiLCJkcm9wZG93biIsImNyZWF0ZURyb3Bkb3duIiwiYWRkT3B0aW9ucyIsInNlbGVjdCIsImRlZmF1bHRBcHBlYXJhbmNlIiwiYWNyb0ZpZWxkIiwic2V0RGVmYXVsdEFwcGVhcmFuY2UiLCJkcm9wZG93bk9iaiIsImRyb3Bkb3duT3B0aW9uIiwiZHJvcGRvd25TZWxlY3RlZCIsImRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyIsInJhZGlvUmFuZG9tSWQiLCJyYWRpb0dyb3VwIiwiY3JlYXRlUmFkaW9Hcm91cCIsInJhZGlvT3B0aW9uR2FwRnJvbVRvcCIsInJhZGlvVGV4dEdhcEZyb21MZWZ0IiwicmFkaW9TaXplIiwicmFkaW9PYmoiLCJhZGRPcHRpb25Ub1BhZ2UiLCJpbWFnZU9wdGlvbnMiLCJwZGZCeXRlcyIsInNhdmVBc0Jhc2U2NCIsInVzZU9iamVjdFN0cmVhbXMiLCJ1cmxWYWxpZGF0b3IiLCJwcm90b2NvbCIsInBvc1VwZGF0ZUhlaWdodCIsImNvbnRhY3RCb29rIiwiZ2V0IiwicmVzdWx0cyIsImNvbnRyYWN0RG9jdW1lbnQiLCJkb2N1bWVudERlYXRpbHMiLCJhZGREZWZhdWx0U2lnbmF0dXJlSW1nIiwiY29tcGxldGUiLCJ4eURlZmF1bHRQb3MiLCJnZXRQYWdlTm8iLCJuZXdYeXBvcyIsInN0YXJ0IiwiZW5kIiwic3RlcCIsIm5ld01vbnRoIiwibmV3WWVhciIsImdldEZ1bGxZZWFyIiwibmV3cG9zaXRpb24iLCJjYWxjdWxhdGVYUG9zaXRpb24iLCJuZXdJZCIsImdldEZpbGVOYW1lIiwiZmlsZVVybCIsImZpbGVuYW1lIiwicGF0aG5hbWUiLCJnZXRBcHBMb2dvIiwibG9jYXRpb24iLCJob3N0IiwibG9nbyIsImFwcGxvZ28iLCJ1c2VyIiwiZG9tYWluIiwidGVuYW50IiwidGVuYW50Q3JlZGl0c1F1ZXJ5IiwiUXVlcnkiLCJlcXVhbFRvIiwiZmlyc3QiLCJ1cGRhdGVSZXMiLCJyZXBsYWNlTWFpbFZhcmlibGVzIiwic3ViamVjdCIsInZhcmlhYmxlcyIsInJlcGxhY2VkU3ViamVjdCIsInJlcGxhY2VkQm9keSIsInZhcmlhYmxlIiwicmVnZXgiLCJSZWdFeHAiLCJjb3B5dG9EYXRhIiwibmF2aWdhdG9yIiwiY2xpcGJvYXJkIiwid3JpdGVUZXh0IiwidGV4dEFyZWEiLCJleGVjQ29tbWFuZCIsImNvbnZlcnRQZGZBcnJheUJ1ZmZlciIsIm9rIiwiaGFuZGxlU2VuZE9UUCIsImFsZXJ0IiwiZmV0Y2hVcmwiLCJwZGZOYW1lIiwic2FuaXRpemVGaWxlTmFtZSIsImF4aW9zUmVzIiwicHJldmVudERlZmF1bHQiLCJwZGYiLCJpc0FuZHJvaWREZXZpY2UiLCJ1c2VyQWdlbnQiLCJtYXRjaCIsImlzQXBwbGVEZXZpY2UiLCJwbGF0Zm9ybSIsIm1heFRvdWNoUG9pbnRzIiwiTVNTdHJlYW0iLCJieXRlQXJyYXkiLCJhdG9iIiwiY2hhciIsImNoYXJDb2RlQXQiLCJCbG9iIiwiYmxvYlVybCIsImNyZWF0ZU9iamVjdFVSTCIsInByaW50YWJsZSIsImJhc2U2NCIsIkNlcnRpZmljYXRlVXJsIiwiY2VydGlmaWNhdGVVcmwiLCJkb2NEZXRhaWxzIiwiZG9jIiwiZmluZENvbnRhY3QiLCJjdXJyZW50VXNlciIsIlVzZXIiLCJjb250YWN0Ym9vayIsImNyZWF0ZVdpdGhvdXREYXRhIiwibm90RXF1YWxUbyIsIm1hdGNoZXMiLCJjb250YWN0UmVzIiwicGFnZVJvdGF0aW9uIiwiZGltZW5zaW9ucyIsInJvdGF0aW9uUmFkcyIsIlBJIiwiY29vcmRzRnJvbUJvdHRvbUxlZnQiLCJkcmF3WCIsImRyYXdZIiwiY29zIiwic2luIiwicm90YXRlIiwic2l6ZVJhdGlvIiwiaGFzT3duUHJvcGVydHkiLCJwYWdlUmF0aW8iLCJ2cFdpZHRoIiwiaW1hZ2VXaWR0aCIsImltYWdlSGVpZ2h0IiwiaW1hZ2VYIiwiaW1hZ2VZRnJvbVRvcCIsImNvcnJlY3Rpb24iLCJzYXZlTGFuZ3VhZ2VJbkxvY2FsIiwiaTE4biIsImRldGVjdGVkTGFuZ3VhZ2UiLCJsYW5ndWFnZSIsImdldERlZmF1bHRTaWduYXR1cmUiLCJxdWVyeSIsImRlZmF1bHRTaWduYXR1cmUiLCJJbWFnZVVSTCIsImRlZmF1bHRJbml0aWFsIiwiSW5pdGlhbHMiLCJyb3RhdGVQZGZQYWdlIiwicm90YXRlRGVncmVlIiwiYmFzZTY0VG9BcnJheUJ1ZmZlciIsImdldFBhZ2UiLCJjdXJyZW50Um90YXRpb24iLCJuZXdSb3RhdGlvbiIsInNldFJvdGF0aW9uIiwicGRmYmFzZTY0IiwiYmluYXJ5U3RyaW5nIiwibGVuIiwiYnl0ZXMiLCJidWZmZXIiLCJjb252ZXJ0QmFzZTY0VG9GaWxlIiwicGRmQmFzZTY0IiwiZmlsZU5hbWUiLCJGaWxlIiwicGRmRGF0YSIsInNhdmUiLCJvbkNsaWNrWm9vbUluIiwic2V0U2NhbGUiLCJzZXRab29tUGVyY2VudCIsIm9uQ2xpY2tab29tT3V0IiwiaGFuZGxlUmVtb3ZlV2lkZ2V0cyIsInNldElzUm90YXRlIiwidXBkYXRlZFNpZ25lclBvcyIsInBsYWNlaG9sZGVyT2JqIiwiZGVncmVlIiwiaGFuZGxlUm90YXRlV2FybmluZyIsInBsYWNlaG9sZGVyRXhpc3QiLCJpc0VuYWJsZVN1YnNjcmlwdGlvbiIsInNlcnZlclVybF9mbiIsImJhc2VVcmwiLCJwcm9jZXNzIiwiZW52IiwiUkVBQ1RfQVBQX1NFUlZFUlVSTCIsIm9yaWdpbiIsImFwcElkIiwiUkVBQ1RfQVBQX0FQUElEIiwiZGVmYXVsdFJvbGUiLCJmYkFwcElkIiwiUkVBQ1RfQVBQX0ZCQVBQSUQiLCJmZXZfSWNvbiIsImdvb2dsZUNsaWV0SWQiLCJSRUFDVF9BUFBfR09PR0xFQ0xJRU5USUQiLCJtZXRhRGVzY3JpcHRpb24iLCJzZXR0aW5ncyIsInJvbGUiLCJtZW51SWQiLCJwYWdlVHlwZSIsInBhZ2VJZCIsImV4dGVuZGVkX2NsYXNzIiwiY29udGFjdENscyIsInRlbXBsYXRlQ2xzIiwiZG9jdW1lbnRDbHMiLCJpY29uQ29sb3IiLCJSRUFDVF9BUFBfRU5BQkxFX1NVQlNDUklQVElPTiIsInRvTG93ZXJDYXNlIiwiaXNTdGFnaW5nIiwiaXNQdWJsaWNTdGFnaW5nIiwicGxhbnMiLCJwbGFuTmFtZSIsImNvZGUiLCJtb250aGx5IiwieWVhcmx5IiwiY3VycmVuY3kiLCJtb250aGx5UHJpY2UiLCJ5ZWFybHlQcmljZSIsInN1YnRpdGxlIiwiYnRuIiwiYmVuZWZpdHMiLCJ5ZWFybHlCZW5lZml0cyIsInllYXJseVVybCIsInBhaWRVcmwiLCJ0ZWFtcGVyaW9kIiwicGVyaW9kIiwiY29tcGFueSIsInBob25lIiwiUGhvbmUiLCJmdWxsbmFtZSIsImZpcnN0bmFtZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImxhc3RuYW1lIiwicXVhbnRpdHkiLCJkZXRhaWxzIiwicGxhbnVybCIsIkRuZFByb3ZpZGVyIiwiSFRNTDVCYWNrZW5kIiwiVG91ciIsIkNvbmZldHRpIiwiTG9hZGVyV2l0aE1zZyIsIkhhbmRsZUVycm9yIiwiUGRmRGVjbGluZU1vZGFsIiwiVG91ckNvbnRlbnRXaXRoQnRuIiwiUGRmUmVxdWVzdEZpbGVzIiwic2V0UGRmRGV0YWlscyIsInNldFNpZ25lZFNpZ25lcnMiLCJ1bnNpZ25lZFNpZ25lcnMiLCJzZXRVblNpZ25lZFNpZ25lcnMiLCJzZXRQZGZVcmwiLCJoYW5kbGVFcnJvciIsInNldEhhbmRsZUVycm9yIiwic2V0T3RwTG9hZGVyIiwiaXNDZWxlYnJhdGlvbiIsInNldElzQ2VsZWJyYXRpb24iLCJyZXF1ZXN0U2lnblRvdXIiLCJzZXRSZXF1ZXN0U2lnblRvdXIiLCJ0b3VyU3RhdHVzIiwic2V0VG91clN0YXR1cyIsImlzTG9hZGluZyIsInNldElzTG9hZGluZyIsImlzTG9hZCIsInNldERlZmF1bHRTaWduSW1nIiwiaXNEb2NJZCIsInNldElzRG9jSWQiLCJwZGZOZXdXaWR0aCIsInNldFBkZk5ld1dpZHRoIiwic2V0UGRmT3JpZ2luYWxXSCIsInNldFNpZ25lck9iamVjdElkIiwiaXNVaUxvYWRpbmciLCJzZXRJc1VpTG9hZGluZyIsImlzRGVjbGluZSIsInNldEN1cnJlbnRTaWduZXIiLCJpc0FsZXJ0Iiwic2V0SXNBbGVydCIsInNldFVuU2lnbmVkV2lkZ2V0SWQiLCJleHBpcmVkRGF0ZSIsInNldEV4cGlyZWREYXRlIiwic2lnbmVyVXNlcklkIiwic2V0U2lnbmVyVXNlcklkIiwiaXNEb250U2hvdyIsInNldElzRG9udFNob3ciLCJkZWZhdWx0U2lnbkFsZXJ0Iiwic2V0SXNTdWJzY3JpYmVkIiwic2V0SXNDb21wbGV0ZWQiLCJpc0NlcnRpZmljYXRlIiwiaXNNb2RhbCIsInNldE15SW5pdGlhbCIsImlzU2lnbmVkIiwic2V0SXNTaWduZWQiLCJpc0V4cGlyZWQiLCJzZXRJc0V4cGlyZWQiLCJzZXRBbHJlYWR5U2lnbiIsInNldENvbnRhaW5lcldIIiwidmFsaWRhdGVBbGVydCIsIndpZGdldHNUb3VyIiwic2V0V2lkZ2V0c1RvdXIiLCJtaW5SZXF1aXJlZENvdW50Iiwic2V0bWluUmVxdWlyZWRDb3VudCIsInNlbmRJbk9yZGVyIiwic2V0U2VuZEluT3JkZXIiLCJpc1N1YnNjcmlwdGlvbkV4cGlyZWQiLCJzZXRJc1N1YnNjcmlwdGlvbkV4cGlyZWQiLCJzZXRFeHRVc2VySWQiLCJpc0VtYWlsVmVyaWZpZWQiLCJzZXRJc0VtYWlsVmVyaWZpZWQiLCJjb250cmFjdE5hbWUiLCJzZXRDb250cmFjdE5hbWUiLCJzZXRJc1B1YmxpY1RlbXBsYXRlIiwiY29udGFjdCIsInNldENvbnRhY3QiLCJpc090cCIsInNldElzT3RwIiwic2V0TG9hZGluZyIsInNldFJlcyIsInNldERvY3VtZW50SWQiLCJpc1B1YmxpY0NvbnRhY3QiLCJzZXRJc1B1YmxpY0NvbnRhY3QiLCJwZGZBcnJheUJ1ZmZlciIsInNldFBkZkFycmF5QnVmZmVyIiwiaXNHdWVzdFNpZ25GbG93Iiwic2VuZG1haWwiLCJnZXREb2NJZCIsInJvdXRlIiwidGVtcGxhdGVJZCIsImdldFF1ZXJ5Iiwic2VhcmNoIiwiY2hlY2tTcGxpdCIsImdldERvY3VtZW50SWQiLCJnZXREb2N1bWVudERldGFpbHMiLCJnZXRUZW1wbGF0ZURldGFpbHMiLCJsb2NhbHVzZXIiLCJyZXNFbWFpbCIsImhhbmRsZU5hdmlnYXRpb24iLCJpc3B1YmxpYyIsInRlbXBsYXRlRGVhdGlscyIsImRvY3VtZW50RGF0YSIsInNldFRlbXBsYXRlU3RhdHVzIiwiSXNQdWJsaWMiLCJnZXRQdWJsaWNSb2xlIiwiUHVibGljUm9sZSIsImdldFVuaXF1ZUlkRGV0YWlscyIsInBsYWNlaG9sZGVyc09yU2lnbmVycyIsInNpZ25lcklkRXhpc3QiLCJnZXRTaWduZXJEYXRhIiwiaXNOZXh0VXNlciIsImN1cnJVc2VySWQiLCJJc0NvbXBsZXRlZCIsImV4cGlyZURhdGUiLCJFeHBpcnlEYXRlIiwiZGVjbGluZWQiLCJJc0RlY2xpbmVkIiwiZXhwaXJlVXBkYXRlRGF0ZSIsImN1cnJEYXRlIiwiZ2V0U2lnbmVycyIsImdldEN1cnJlbnRTaWduZXIiLCJVc2VySWQiLCJleHBpcmVEYXRlRm9ybWF0IiwiY2hlY2tDdXJyZW50VXNlciIsImF1ZGl0dHJhaWxEYXRhIiwiQXVkaXRUcmFpbCIsIkFjdGl2aXR5IiwiY2hlY2tBbHJlYWR5U2lnbiIsIlVzZXJQdHIiLCJub3RlIiwiZGVzY3JpcHRpb24iLCJ2aWV3ZWRCeSIsInZpZXdlZEF0IiwiY3JlYXRlZEF0IiwidW5TaWduZWRTaWduZXIiLCJjaGVja0VtYWlsIiwiZW1haWxPcklkIiwiaXNTaWduZWRTaWduYXR1cmUiLCJzaWduZWRFeGlzdCIsInRvdXJEYXRhIiwiVG91clN0YXR1cyIsImNoZWNrVG91clJlcXVlc3QiLCJyZXF1ZXN0U2lnbiIsImRlZmF1bHRTaWduUmVzIiwiZW1haWxWZXJpZmllZCIsInVzZXJRdWVyeSIsImdldFVzZXIiLCJjaGVja2JveEV4aXN0IiwicmVxdWlyZWRSYWRpbyIsInNob3dBbGVydCIsIndpZGdldEtleSIsInJhZGlvRXhpc3QiLCJyZXF1aXJlZENoZWNrYm94IiwiVG91clBhZ2VOdW1iZXIiLCJqIiwidXBkYXRlUGFnZSIsIm1pbkNvdW50IiwicGFyc2VNaW4iLCJtYXhDb3VudCIsInBhcnNlTWF4IiwiY2hlY2tTaWduZWQiLCJjaGVja0RlZmF1bHRTaWduZWQiLCJyZXF1aXJlZFdpZGdldHMiLCJjaGVja1NpZ25VcmwiLCJleGlzdGluZ1BkZkJ5dGVzIiwiaXNTaWduWW91clNlbGZGbG93IiwiZXh0VXNlclB0ciIsIkhlYWRlckRvY0lkIiwiYWN0aXZlX21haWxfYWRhcHRlciIsInJlc1NpZ24iLCJuZXdJbmRleCIsInVzZXJtYWlsIiwicmVxdWVzdEJvZHkiLCJSZXF1ZXN0Qm9keSIsInJlcXVlc3RTdWJqZWN0IiwiUmVxdWVzdFN1YmplY3QiLCJsb2NhbEV4cGlyZURhdGUiLCJ0b0xvY2FsZURhdGVTdHJpbmciLCJzZW5kZXJFbWFpbCIsInNlbmRlclBob25lIiwic2VuZGVyTmFtZSIsImltZ1BuZyIsImhvc3RVcmwiLCJlbmNvZGVCYXNlNjQiLCJidG9hIiwiaG9zdFB1YmxpY1VybCIsInNpZ25QZGYiLCJvcGVuU2lnblVybCIsIm9yZ05hbWUiLCJ0aGVtZUJHY29sb3IiLCJyZXBsYWNlVmFyIiwicmVwbGFjZWRSZXF1ZXN0Qm9keSIsImh0bWxSZXFCb2R5IiwiZG9jdW1lbnRfdGl0bGUiLCJzZW5kZXJfbmFtZSIsInNlbmRlcl9tYWlsIiwic2VuZGVyX3Bob25lIiwicmVjZWl2ZXJfbmFtZSIsInJlY2VpdmVyX2VtYWlsIiwicmVjZWl2ZXJfcGhvbmUiLCJleHBpcnlfZGF0ZSIsImNvbXBhbnlfbmFtZSIsInNpZ25pbmdfdXJsIiwicmVjaXBpZW50IiwiaHRtbCIsImNsb3NlVG91ciIsInRvdXJDb25maWciLCJzZWxlY3RvciIsInBkZldIT2JqIiwidG90YWxQYWdlcyIsImdldFZpZXdwb3J0Iiwib2Zmc2V0IiwicHJldlBhZ2VOdW1iZXIiLCJzYXZlSW1hZ2UiLCJnZXRJbmRleCIsIm9iamVjdCIsInBsYWNlaG9sZGVyUG9zaXRpb24iLCJnZXRVcGRhdGVQb3NpdGlvbiIsInNwbGljZSIsImluZGV4b2ZTaWduZXIiLCJwcmV2U3RhdGUiLCJuZXdTdGF0ZSIsInNhdmVTaWduIiwidXBkYXRlU2lnbmVyRGF0YSIsImRlY2xpbmVEb2MiLCJyZWFzb24iLCJEZWNsaW5lUmVhc29uIiwicHV0IiwiZGVjbGluZWRCeSIsImRlY2xpbmVkQXQiLCJhZGREZWZhdWx0U2lnbmF0dXJlIiwiY3VycmVudFNpZ25lclBvc2l0aW9uIiwidXBkYXRlUGxhY2UiLCJ1cGRhdGVzaWduZXJQb3MiLCJoYW5kbGVEb250U2hvdyIsImNsb3NlUmVxdWVzdFNpZ25Ub3VyIiwidXBkYXRlZFRvdXJTdGF0dXMiLCJyZXF1ZXN0U2lnbkluZGV4IiwicmVxdWVzdFNpZ25Ub3VyRnVuY3Rpb24iLCJzaWduZWRCeVN0ZXAiLCJzaWduZWRCeSIsInNsaWNlIiwiZGVmYXVsdFNpZ25TdGVwIiwiZGVmYXVsdFNpZ25Ub3VyIiwic2hpZnQiLCJvblJlcXVlc3RDbG9zZSIsInN0ZXBzIiwiY2xvc2VXaXRoTWFzayIsInJvdW5kZWQiLCJoYW5kbGVQdWJsaWNVc2VyIiwidGVtcGxhdGVpZCIsInVzZXJSZXMiLCJTZW5kT3RwIiwiaGFuZGxlSW5wdXRDaGFuZ2UiLCJPdHAiLCJWZXJpZnlPVFAiLCJzZXJ2ZXJVcmwiLCJwYXJzZUlkIiwiX3VzZXIiLCJiZWNvbWUiLCJjb250cmFjdFVzZXJEZXRhaWxzIiwiaGFuZGxlQ2xvc2VPdHAiLCJoYW5kbGVEb3dubG9hZEJ0biIsImJhY2tlbmQiLCJwb2ludGVyRXZlbnRzIiwic2hvd051bWJlciIsInNob3dOYXZpZ2F0aW9uIiwic2hvd05hdmlnYXRpb25OdW1iZXIiLCJzaG93IiwiaGVhZE1zZyIsImJvZHlNc3NnIiwiZm9vdGVyTWVzc2FnZSIsImlzRG93bmxvYWRCdG4iLCJ4bWxucyIsInZpZXdCb3giLCJmaWxsIiwiZCIsInByZXYiLCJyZWR1Y2VXaWR0aCIsImlzTWVudSIsInVzZXJPYmplY3RJZCIsImNoaWxkcmVuIiwidGV4dGNvbG9yIiwidGhlbWUiLCJDdXN0b21Nb2RhbCIsInNldFJlYXNvbiIsInNldElzQ2hlY2siLCJoYW5kbGVDaGVjayIsImNyZWF0ZVNsaWNlIiwic2hvd1RlbmFudFNsaWNlIiwiaW5pdGlhbFN0YXRlIiwicmVkdWNlcnMiLCJzaG93VGVuYW50IiwiYWN0aW9uIiwicGF5bG9hZCIsImFjdGlvbnMiLCJyZWR1Y2VyIiwidG91clN0ZXBTbGljZSIsInNhdmVUb3VyU3RlcHMiLCJyZW1vdmVUb3VyU3RlcHMiLCJpbmZvU2xpY2UiLCJmZXRjaEFwcEluZm8iLCJyZW1vdmVJdGVtIiwic2hvd0hlYWRlclNsaWNlIiwiY29uZmlndXJlU3RvcmUiLCJpbmZvUmVkdWNlciIsIlNob3dUZW5hbnQiLCJUb3VyU3RlcHNSZWR1Y2VyIiwic3RvcmUiLCJUb3VyU3RlcHMiLCJpbml0UmVhY3RJMThuZXh0IiwiTGFuZ3VhZ2VEZXRlY3RvciIsImVuIiwiZnIiLCJ1c2UiLCJpbml0IiwicmVzb3VyY2VzIiwidHJhbnNsYXRpb24iLCJmYWxsYmFja0xuZyIsImRldGVjdGlvbiIsIm9yZGVyIiwiZGVidWciLCJpbnRlcnBvbGF0aW9uIiwiZXNjYXBlVmFsdWUiLCJ3aGl0ZWxpc3QiLCJSZWFjdERPTSIsInBkZmpzIiwiUHJvdmlkZXIiLCJHbG9iYWxXb3JrZXJPcHRpb25zIiwid29ya2VyU3JjIiwidmVyc2lvbiIsIlB1YmxpY1NjcmlwdEZpbGVXcmFwcGVyIiwiaW5pdGlhbFByb3BzIiwic2V0UHJvcHMiLCJ1cGRhdGVQdWJsaWNUZW1wbGF0ZVByb3BzIiwiaW5pdGlhbGl6ZSIsInNlcnZlclVSTCIsInNjcmlwdENvbXBvbmVudCIsImxpbmsiLCJoZWFkIiwidGFpbHdpbmRDc3NMaW5rIiwicm9vdCIsImNyZWF0ZVJvb3QiLCJyZW5kZXIiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/apps/OpenSign/src/components/BulkSendUi.js b/apps/OpenSign/src/components/BulkSendUi.js index d97678e97..b46584235 100644 --- a/apps/OpenSign/src/components/BulkSendUi.js +++ b/apps/OpenSign/src/components/BulkSendUi.js @@ -378,7 +378,7 @@ const BulkSendUi = (props) => {

@@ -419,14 +419,14 @@ const BulkSendUi = (props) => { ) : (

- {t("additional-quicksend")} + {t("additional-credits")}

{ - const route = paidUrl(plan); - if (route === "/subscription") { - window.location.href = route; - } else { - openInNewTab(route, "_self"); - } + const handleNavigation = () => { + window.location.href = "/subscription"; }; async function checkIsSubscribed(extUserId, contactId) { const isGuestSign = isGuestSignFlow || false; diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index 8e6a4bebb..7b28d007a 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -35,7 +35,6 @@ import { fetchSubscription, convertPdfArrayBuffer, getContainerScale, - openInNewTab, convertBase64ToFile, onClickZoomIn, onClickZoomOut, @@ -60,7 +59,6 @@ import Loader from "../primitives/Loader"; import { useSelector } from "react-redux"; import PdfZoom from "../components/pdf/PdfZoom"; import LottieWithLoader from "../primitives/DotLottieReact"; -import { paidUrl } from "../json/plansArr"; import { useTranslation } from "react-i18next"; import RotateAlert from "../components/RotateAlert"; @@ -235,13 +233,8 @@ function PlaceHolderSign() { return () => clearTimeout(timer); // eslint-disable-next-line react-hooks/exhaustive-deps }, [divRef.current, isHeader]); - const handleNavigation = (plan) => { - const route = paidUrl(plan); - if (route === "/subscription") { - navigate(route); - } else { - openInNewTab(route, "_self"); - } + const handleNavigation = () => { + navigate("/subscription"); }; async function checkIsSubscribed() { const res = await fetchSubscription(); diff --git a/apps/OpenSign/src/pages/SSOVerify.js b/apps/OpenSign/src/pages/SSOVerify.js index 80a75f116..d695e07b1 100644 --- a/apps/OpenSign/src/pages/SSOVerify.js +++ b/apps/OpenSign/src/pages/SSOVerify.js @@ -3,12 +3,11 @@ import { useLocation, useNavigate } from "react-router-dom"; import Parse from "parse"; import { appInfo } from "../constant/appinfo"; import { isEnableSubscription } from "../constant/const"; -import { fetchSubscription, openInNewTab } from "../constant/Utils"; +import { fetchSubscription } from "../constant/Utils"; import { useDispatch } from "react-redux"; import { showTenant } from "../redux/reducers/ShowTenant"; import ModalUi from "../primitives/ModalUi"; import Loader from "../primitives/Loader"; -import { paidUrl } from "../json/plansArr"; import { useTranslation } from "react-i18next"; const SSOVerify = () => { @@ -51,13 +50,8 @@ const SSOVerify = () => { console.log("err", err.message); } }; - const handlePaidRoute = (plan) => { - const route = paidUrl(plan); - if (route === "/subscription") { - navigate(route); - } else { - openInNewTab(route, "_self"); - } + const handlePaidRoute = () => { + navigate("/subscription"); }; const checkExtUser = async (ssosign) => { const params = { email: ssosign?.email }; diff --git a/apps/OpenSign/src/pages/TemplatePlaceholder.js b/apps/OpenSign/src/pages/TemplatePlaceholder.js index cc37bf17c..92a438379 100644 --- a/apps/OpenSign/src/pages/TemplatePlaceholder.js +++ b/apps/OpenSign/src/pages/TemplatePlaceholder.js @@ -26,7 +26,6 @@ import { radioButtonWidget, fetchSubscription, getContainerScale, - openInNewTab, convertBase64ToFile, rotatePdfPage, onClickZoomOut, @@ -47,7 +46,6 @@ import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption"; import Parse from "parse"; import { useSelector } from "react-redux"; import PdfZoom from "../components/pdf/PdfZoom"; -import { paidUrl } from "../json/plansArr"; import { useTranslation } from "react-i18next"; import RotateAlert from "../components/RotateAlert"; const TemplatePlaceholder = () => { @@ -196,13 +194,8 @@ const TemplatePlaceholder = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [divRef.current, isHeader]); - const handleNavigation = (plan) => { - const route = paidUrl(plan); - if (route === "/subscription") { - navigate(route); - } else { - openInNewTab(route, "_self"); - } + const handleNavigation = () => { + navigate("/subscription"); }; async function checkIsSubscribed() { const res = await fetchSubscription(); diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index 06f9ce63c..6d4992b3e 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -17,7 +17,7 @@ import { import Upgrade from "../primitives/Upgrade"; import ModalUi from "../primitives/ModalUi"; import Loader from "../primitives/Loader"; -import { paidUrl, validplan } from "../json/plansArr"; +import { validplan } from "../json/plansArr"; import { useTranslation } from "react-i18next"; import SelectLanguage from "../components/pdf/SelectLanguage"; import { RWebShare } from "react-web-share"; @@ -315,12 +315,7 @@ function UserProfile() { setIsDisableDocId(extendUser?.[0]?.HeaderDocId); }; const handlePaidRoute = () => { - const route = paidUrl(isPlan.plan); - if (route === "/subscription") { - navigate(route); - } else { - openInNewTab(route, "_self"); - } + navigate("/subscription"); }; const copytoclipboard = () => { diff --git a/apps/OpenSign/src/primitives/SubscribeCard.js b/apps/OpenSign/src/primitives/SubscribeCard.js index 3abf97fac..69977fefe 100644 --- a/apps/OpenSign/src/primitives/SubscribeCard.js +++ b/apps/OpenSign/src/primitives/SubscribeCard.js @@ -1,29 +1,22 @@ import React from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; -import { paidUrl } from "../json/plansArr"; -import { openInNewTab } from "../constant/Utils"; -const SubscribeCard = ({ plan, price, plan_code }) => { +const SubscribeCard = ({ plan, price }) => { const { t } = useTranslation(); const navigate = useNavigate(); const handlePaidRoute = () => { - const route = paidUrl(plan_code); - if (route === "/subscription") { - navigate(route); - } else { - openInNewTab(route, "_self"); - } + navigate("/subscription"); }; + const premiumPrice = price ? "$" + price : "$9.99"; + const addonPrice = "$0.15"; return (

- {t("upgrade-to")} {plan ? plan : "PRO"} {t("plan")} + {t("upgrade-to")} {plan ? plan : "Paid"} {t("plan")}

-

- ${price ? price : "29.99"}/month: {t("subscribe-card-plan")} -

+

{t("subscribe-card-plan", { premiumPrice, addonPrice })}